ZGlmZiAtLWdpdCBhL3NyYy9iYXNlL2Jhc2U2NC5jYyBiL3NyYy9iYXNlL2Jhc2U2NC5jYwppbmRleCAxOTA3OTc4Li5iNDk2YWY3IDEwMDY0NAotLS0gYS9zcmMvYmFzZS9iYXNlNjQuY2MKKysrIGIvc3JjL2Jhc2UvYmFzZTY0LmNjCkBAIC0yNSwxMyArMjUsMTggQEAKICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgQmFzZTY0RGVjb2RlKGNvbnN0IFN0cmluZ1BpZWNlJiBpbnB1dCwgc3RkOjpzdHJpbmcqIG91dHB1dCkgewotICBzdGQ6OnN0cmluZyB0ZW1wOwordGVtcGxhdGUgPGNsYXNzIENvbnRhaW5lcj4KK2Jvb2wgQmFzZTY0RGVjb2RlSW50ZXJuYWwoY29uc3QgU3RyaW5nUGllY2UmIGlucHV0LCBDb250YWluZXIqIG91dHB1dCkgeworICBDb250YWluZXIgdGVtcDsKICAgdGVtcC5yZXNpemUobW9kcF9iNjRfZGVjb2RlX2xlbihpbnB1dC5zaXplKCkpKTsKIAotICAvLyBkb2VzIG5vdCBudWxsIHRlcm1pbmF0ZSByZXN1bHQgc2luY2UgcmVzdWx0IGlzIGJpbmFyeSBkYXRhIQogICBpbnQgaW5wdXRfc2l6ZSA9IHN0YXRpY19jYXN0PGludD4oaW5wdXQuc2l6ZSgpKTsKLSAgaW50IG91dHB1dF9zaXplID0gbW9kcF9iNjRfZGVjb2RlKCYodGVtcFswXSksIGlucHV0LmRhdGEoKSwgaW5wdXRfc2l6ZSk7CisgIC8vIFdoZW4gdXNpbmcgdGhpcyB0ZW1wbGF0ZSBmb3IgYSBuZXcgdHlwZSwgbWFrZSBzdXJlIGl0cyBjb250ZW50IGlzIHVuc2lnbmVkCisgIC8vIGNoYXIgb3IgY2hhci4KKyAgc3RhdGljX2Fzc2VydChzaXplb2YodHlwZW5hbWUgQ29udGFpbmVyOjp2YWx1ZV90eXBlKSA9PSAxLAorICAgICAgICAgICAgICAgICJJbnB1dCB0eXBlIHNob3VsZCBiZSBjaGFyIG9yIGVxdWl2YWxlbnQuIik7CisgIGludCBvdXRwdXRfc2l6ZSA9IG1vZHBfYjY0X2RlY29kZShyZWludGVycHJldF9jYXN0PGNoYXIqPigmKHRlbXBbMF0pKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmRhdGEoKSwgaW5wdXRfc2l6ZSk7CiAgIGlmIChvdXRwdXRfc2l6ZSA8IDApCiAgICAgcmV0dXJuIGZhbHNlOwogCkBAIC00MCw0ICs0NSwxMiBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAorYm9vbCBCYXNlNjREZWNvZGUoY29uc3QgU3RyaW5nUGllY2UmIGlucHV0LCBzdGQ6OnN0cmluZyogb3V0cHV0KSB7CisgIHJldHVybiBCYXNlNjREZWNvZGVJbnRlcm5hbChpbnB1dCwgb3V0cHV0KTsKK30KKworYm9vbCBCYXNlNjREZWNvZGUoY29uc3QgU3RyaW5nUGllY2UmIGlucHV0LCBzdGQ6OnZlY3Rvcjx1aW50OF90Piogb3V0cHV0KSB7CisgIHJldHVybiBCYXNlNjREZWNvZGVJbnRlcm5hbChpbnB1dCwgb3V0cHV0KTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGJhc2UKZGlmZiAtLWdpdCBhL3NyYy9iYXNlL2Jhc2U2NC5oIGIvc3JjL2Jhc2UvYmFzZTY0LmgKaW5kZXggOTgzZDVlMi4uZWE2ZjQwZiAxMDA2NDQKLS0tIGEvc3JjL2Jhc2UvYmFzZTY0LmgKKysrIGIvc3JjL2Jhc2UvYmFzZTY0LmgKQEAgLTYsNiArNiw3IEBACiAjZGVmaW5lIEJBU0VfQkFTRTY0X0hfXwogCiAjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgImJhc2UvYmFzZV9leHBvcnQuaCIKICNpbmNsdWRlICJiYXNlL3N0cmluZ19waWVjZS5oIgpAQCAtMTYsMTAgKzE3LDE1IEBACiAvLyBvdGhlcndpc2UuICBUaGUgb3V0cHV0IHN0cmluZyBpcyBvbmx5IG1vZGlmaWVkIGlmIHN1Y2Nlc3NmdWwuCiBCQVNFX0VYUE9SVCBib29sIEJhc2U2NEVuY29kZShjb25zdCBTdHJpbmdQaWVjZSYgaW5wdXQsIHN0ZDo6c3RyaW5nKiBvdXRwdXQpOwogCi0vLyBEZWNvZGVzIHRoZSBiYXNlNjQgaW5wdXQgc3RyaW5nLiAgUmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3NmdWwgYW5kIGZhbHNlCisvLyBEZWNvZGVzIHRoZSBiYXNlNjQgaW5wdXQgc3RyaW5nLiBSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bCBhbmQgZmFsc2UKIC8vIG90aGVyd2lzZS4gIFRoZSBvdXRwdXQgc3RyaW5nIGlzIG9ubHkgbW9kaWZpZWQgaWYgc3VjY2Vzc2Z1bC4KIEJBU0VfRVhQT1JUIGJvb2wgQmFzZTY0RGVjb2RlKGNvbnN0IFN0cmluZ1BpZWNlJiBpbnB1dCwgc3RkOjpzdHJpbmcqIG91dHB1dCk7CiAKKy8vIERlY29kZXMgdGhlIGJhc2U2NCBpbnB1dCBzdHJpbmcuIFJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsIGFuZCBmYWxzZQorLy8gb3RoZXJ3aXNlLiAgVGhlIG91dHB1dCB2ZWN0b3IgaXMgb25seSBtb2RpZmllZCBpZiBzdWNjZXNzZnVsLgorQkFTRV9FWFBPUlQgYm9vbCBCYXNlNjREZWNvZGUoY29uc3QgU3RyaW5nUGllY2UmIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4qIG91dHB1dCk7CisKIH0gIC8vIG5hbWVzcGFjZSBiYXNlCiAKICNlbmRpZiAgLy8gQkFTRV9CQVNFNjRfSF9fCmRpZmYgLS1naXQgYS9zcmMvYmFzZS9maWxlX3BhdGguY2MgYi9zcmMvYmFzZS9maWxlX3BhdGguY2MKaW5kZXggYjVjNzkwMC4uMTIzMTMyZCAxMDA2NDQKLS0tIGEvc3JjL2Jhc2UvZmlsZV9wYXRoLmNjCisrKyBiL3NyYy9iYXNlL2ZpbGVfcGF0aC5jYwpAQCAtNTE0LDcgKzUxNCw4IEBACiB9CiAKIEZpbGVQYXRoIEZpbGVQYXRoOjpBcHBlbmRBU0NJSShjb25zdCBiYXNlOjpTdHJpbmdQaWVjZSYgY29tcG9uZW50KSBjb25zdCB7Ci0gIERDSEVDSyhJc1N0cmluZ0FTQ0lJKGNvbXBvbmVudCkpOworICBEQ0hFQ0soSXNTdHJpbmdBU0NJSShjb21wb25lbnQpKQorICAgICAgPDwgImludmFsaWQgY29tcG9uZW50ICIgPDwgY29tcG9uZW50IDw8ICIgYmVpbmcgYXBwZW5kZWQgdG8gIiA8PCB2YWx1ZSgpOwogI2lmIGRlZmluZWQoT1NfV0lOKQogICByZXR1cm4gQXBwZW5kKEFTQ0lJVG9VVEYxNihjb21wb25lbnQuYXNfc3RyaW5nKCkpKTsKICNlbGlmIGRlZmluZWQoT1NfUE9TSVgpIHx8IGRlZmluZWQoT1NfU1RBUkJPQVJEKQpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZmlsZV91dGlsX3N0YXJib2FyZC5jYyBiL3NyYy9iYXNlL2ZpbGVfdXRpbF9zdGFyYm9hcmQuY2MKaW5kZXggZDAyNDU0Mi4uMzRhZWNhMyAxMDA2NDQKLS0tIGEvc3JjL2Jhc2UvZmlsZV91dGlsX3N0YXJib2FyZC5jYworKysgYi9zcmMvYmFzZS9maWxlX3V0aWxfc3RhcmJvYXJkLmNjCkBAIC0zNDcsMTQgKzM0NywzMyBAQAogICAgIGxhc3RfcGF0aCA9IHBhdGg7CiAgIH0KIAorICAvLyBSb290IHBhdGggaXMgbm93IGF0IGluZGV4IDAuCisgIHN0ZDo6cmV2ZXJzZShzdWJwYXRocy5iZWdpbigpLCBzdWJwYXRocy5lbmQoKSk7CisKKyAgaW50IGV4aXN0aW5nX2RpcmVjdG9yeV9pbmRleCA9IC0xOworCisgIC8vIFNvbWUgcGxhdGZvcm1zIGRpc2FsbG93IGFjY2VzcyB0byBzb21lIHBhcmVudCBmb2xkZXJzIGluIHRoZSBoaWVyYXJjaHkuCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3VicGF0aHMuc2l6ZSgpOyArK2kpIHsKKyAgICBjb25zdCBhdXRvJiBwYXRoID0gc3VicGF0aHNbaV07CisgICAgaWYgKERpcmVjdG9yeUV4aXN0cyhwYXRoKSkgeworICAgICAgZXhpc3RpbmdfZGlyZWN0b3J5X2luZGV4ID0gc3RhdGljX2Nhc3Q8aW50PihpKTsKKyAgICB9CisgIH0KKworICAvLyBObyBzdWItZGlyZWN0b3JpZXMgZXhpc3RlZCwgaW5jbHVkaW5nIHRoZSByb290LgorICBpZiAoZXhpc3RpbmdfZGlyZWN0b3J5X2luZGV4IDwgMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCiAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgcGFyZW50cyBhbmQgY3JlYXRlIHRoZSBtaXNzaW5nIG9uZXMuCi0gIGZvciAoc3RkOjp2ZWN0b3I8RmlsZVBhdGg+OjpyZXZlcnNlX2l0ZXJhdG9yIGkgPSBzdWJwYXRocy5yYmVnaW4oKTsKLSAgICAgICBpICE9IHN1YnBhdGhzLnJlbmQoKTsgKytpKSB7Ci0gICAgaWYgKERpcmVjdG9yeUV4aXN0cygqaSkpIHsKKyAgZm9yIChzaXplX3QgaSA9IHN0YXRpY19jYXN0PHNpemVfdD4oZXhpc3RpbmdfZGlyZWN0b3J5X2luZGV4KTsKKyAgICAgICBpIDwgc3VicGF0aHMuc2l6ZSgpOyArK2kpIHsKKyAgICBjb25zdCBhdXRvJiBwYXRoID0gc3VicGF0aHNbaV07CisgICAgaWYgKERpcmVjdG9yeUV4aXN0cyhwYXRoKSkgewogICAgICAgY29udGludWU7CiAgICAgfQogCi0gICAgaWYgKCFTYkRpcmVjdG9yeUNyZWF0ZShpLT52YWx1ZSgpLmNfc3RyKCkpKSB7CisgICAgaWYgKCFTYkRpcmVjdG9yeUNyZWF0ZShwYXRoLnZhbHVlKCkuY19zdHIoKSkpIHsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgIH0KZGlmZiAtLWdpdCBhL3NyYy9iYXNlL21lbW9yeS9hbGlnbmVkX21lbW9yeS5oIGIvc3JjL2Jhc2UvbWVtb3J5L2FsaWduZWRfbWVtb3J5LmgKaW5kZXggOGVhOTZiNy4uZmEzYjJmMiAxMDA2NDQKLS0tIGEvc3JjL2Jhc2UvbWVtb3J5L2FsaWduZWRfbWVtb3J5LmgKKysrIGIvc3JjL2Jhc2UvbWVtb3J5L2FsaWduZWRfbWVtb3J5LmgKQEAgLTM4LDEwICszOCwxMCBAQAogI2luY2x1ZGUgImJhc2UvYmFzaWN0eXBlcy5oIgogI2luY2x1ZGUgImJhc2UvY29tcGlsZXJfc3BlY2lmaWMuaCIKIAotI2lmIGRlZmluZWQoQ09NUElMRVJfTVNWQykKLSNpbmNsdWRlIDxtYWxsb2MuaD4KLSNlbGlmIGRlZmluZWQoT1NfU1RBUkJPQVJEKQorI2lmIGRlZmluZWQoT1NfU1RBUkJPQVJEKQogI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKKyNlbGlmIGRlZmluZWQoQ09NUElMRVJfTVNWQykKKyNpbmNsdWRlIDxtYWxsb2MuaD4KICNlbHNlCiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjZW5kaWYKQEAgLTk2LDEwICs5NiwxMCBAQAogQkFTRV9FWFBPUlQgdm9pZCogQWxpZ25lZEFsbG9jKHNpemVfdCBzaXplLCBzaXplX3QgYWxpZ25tZW50KTsKIAogaW5saW5lIHZvaWQgQWxpZ25lZEZyZWUodm9pZCogcHRyKSB7Ci0jaWYgZGVmaW5lZChDT01QSUxFUl9NU1ZDKQotICBfYWxpZ25lZF9mcmVlKHB0cik7Ci0jZWxpZiBkZWZpbmVkKE9TX1NUQVJCT0FSRCkKKyNpZiBkZWZpbmVkKE9TX1NUQVJCT0FSRCkKICAgU2JNZW1vcnlEZWFsbG9jYXRlQWxpZ25lZChwdHIpOworI2VsaWYgZGVmaW5lZChDT01QSUxFUl9NU1ZDKQorICBfYWxpZ25lZF9mcmVlKHB0cik7CiAjZWxzZQogICBmcmVlKHB0cik7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvQ0hBTkdFTE9HLm1kIGIvc3JjL2NvYmFsdC9DSEFOR0VMT0cubWQKaW5kZXggZjMwMGI3NC4uNTliMzkyNyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9DSEFOR0VMT0cubWQKKysrIGIvc3JjL2NvYmFsdC9DSEFOR0VMT0cubWQKQEAgLTIsNyArMiwyNiBAQAogCiBUaGlzIGRvY3VtZW50IHJlY29yZHMgYWxsIG5vdGFibGUgY2hhbmdlcyBtYWRlIHRvIENvYmFsdCBzaW5jZSB0aGUgbGFzdCByZWxlYXNlLgogCisjIyBWZXJzaW9uIDE3CisgLSAqKkltcHJvdmVtZW50cyBhbmQgQnVnIEZpeGVzKioKKyAgIC0gRml4IHBvaW50ZXIvbW91c2UgZXZlbnRzIG5vdCBiZWluZyBkaXNwYXRjaGVkIHRvIEphdmFTY3JpcHQgaW4gdGhlIHNhbWUKKyAgICAgb3JkZXIgdGhhdCB0aGV5IGFyZSBnZW5lcmF0ZWQgYnkgU3RhcmJvYXJkLCByZWxhdGl2ZSB0byBvdGhlciBpbnB1dCBldmVudHMKKyAgICAgbGlrZSBrZXkgcHJlc3Nlcy4KKworIC0gKipTdG9yYWdlIGZvcm1hdCBjaGFuZ2VkIGZyb20gc3FsaXRlMyB0byBwcm90b2J1ZioqCisKKyAgIENvYmFsdCdzIGludGVybmFsIHJlcHJlc2VudGF0aW9uIGZvciBwZXJzaXN0ZW50IHN0b3JhZ2Ugb2YgY29va2llcyBhbmQgbG9jYWwKKyAgIHN0b3JhZ2UgZW50cmllcyBjaGFuZ2VkIGZyb20gc3FsaXRlMyB0byBwcm90b2J1Zi4gVGhlIGhlYWRlciBvZiB0aGUKKyAgIFNiU3RvcmFnZVJlY29yZCBibG9iIHdhcyB1cGRhdGVkIGZyb20gU0FWMCB0byBTQVYxIGFuZCBhbGwgdGhlIGRhdGEgd2lsbCBiZQorICAgbWlncmF0ZWQgdG8gdGhlIG5ldyBmb3JtYXQgdGhlIG5leHQgdGltZSBDb2JhbHQgaXMgbGF1bmNoZWQuCisgICBUaGUgc2NoZW1hIGlzIGF2YWlsYWJsZSBhdCBjb2JhbHQvc3RvcmFnZS9zdG9yZS9zdG9yYWdlLnByb3RvLgorCiAjIyBWZXJzaW9uIDE2CisgLSAqKlJlYmFzZSBsaWJ3ZWJwIHRvIHZlcnNpb24gMS4wLjAqKgorCisgICBVcGRhdGUgdGhlIHZlcnNpb24gb2YgbGlid2VicCB1c2VkIGJ5IENvYmFsdCBmcm9tIDAuMy4xIHRvIDEuMC4wLiAgVGhlIG5ldworICAgdmVyc2lvbiBicmluZ3Mgd2l0aCBpdCBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMgYW5kIGJ1ZyBmaXhlcy4KKwogIC0gKipNb3ZlIGBgamF2YXNjcmlwdF9lbmdpbmVgYCBhbmQgYGBjb2JhbHRfZW5hYmxlX2ppdGBgIGJ1aWxkIHZhcmlhYmxlcyoqCiAKICAgIE1vdmUgZ3lwIHZhcmlhYmxlcyBgYGphdmFzY3JpcHRfZW5naW5lYGAgYW5kIGBgY29iYWx0X2VuYWJsZV9qaXRgYCwgd2hpY2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYWNjZXNzaWJpbGl0eS9hY2Nlc3NpYmlsaXR5Lmd5cCBiL3NyYy9jb2JhbHQvYWNjZXNzaWJpbGl0eS9hY2Nlc3NpYmlsaXR5Lmd5cAppbmRleCAwOGRiNDFjLi41MGRlNTExIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2FjY2Vzc2liaWxpdHkvYWNjZXNzaWJpbGl0eS5neXAKKysrIGIvc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L2FjY2Vzc2liaWxpdHkuZ3lwCkBAIC0zMyw3ICszMyw2IEBACiAgICAgICAnZGVwZW5kZW5jaWVzJzogWwogICAgICAgICAnPChERVBUSCkvY29iYWx0L2Jhc2UvYmFzZS5neXA6YmFzZScsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvZG9tL2RvbS5neXA6ZG9tJywKLSAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9zcGVlY2gvc3BlZWNoLmd5cDpzcGVlY2gnLAogICAgICAgXSwKICAgICB9LAogICBdCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2F1ZGlvL2FzeW5jX2F1ZGlvX2RlY29kZXIuY2MgYi9zcmMvY29iYWx0L2F1ZGlvL2FzeW5jX2F1ZGlvX2RlY29kZXIuY2MKaW5kZXggYjBhZDk3Mi4uZWQwOGRhOCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9hdWRpby9hc3luY19hdWRpb19kZWNvZGVyLmNjCisrKyBiL3NyYy9jb2JhbHQvYXVkaW8vYXN5bmNfYXVkaW9fZGVjb2Rlci5jYwpAQCAtMzQsMTIgKzM0LDkgQEAKIAogICBpZiAocmVhZGVyKSB7CiAgICAgZGVjb2RlX2ZpbmlzaF9jYWxsYmFjay5SdW4ocmVhZGVyLT5zYW1wbGVfcmF0ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci0+bnVtYmVyX29mX2ZyYW1lcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci0+bnVtYmVyX29mX2NoYW5uZWxzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLT5zYW1wbGVfZGF0YSgpLCByZWFkZXItPnNhbXBsZV90eXBlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci0+UmVzZXRBbmRSZXR1cm5BdWRpb0J1cygpLlBhc3MoKSk7CiAgIH0gZWxzZSB7Ci0gICAgZGVjb2RlX2ZpbmlzaF9jYWxsYmFjay5SdW4oMC5mLCAwLCAwLCBzY29wZWRfYXJyYXk8dWludDg+KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1NhbXBsZVR5cGVGbG9hdDMyKTsKKyAgICBkZWNvZGVfZmluaXNoX2NhbGxiYWNrLlJ1bigwLmYsIHNjb3BlZF9wdHI8U2hlbGxBdWRpb0J1cz4oKSk7CiAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9hdWRpby9hc3luY19hdWRpb19kZWNvZGVyLmggYi9zcmMvY29iYWx0L2F1ZGlvL2FzeW5jX2F1ZGlvX2RlY29kZXIuaAppbmRleCAxZThhMDI1Li5mMzUzNmVlIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2F1ZGlvL2FzeW5jX2F1ZGlvX2RlY29kZXIuaAorKysgYi9zcmMvY29iYWx0L2F1ZGlvL2FzeW5jX2F1ZGlvX2RlY29kZXIuaApAQCAtMTUsMjEgKzE1LDIwIEBACiAjaWZuZGVmIENPQkFMVF9BVURJT19BU1lOQ19BVURJT19ERUNPREVSX0hfCiAjZGVmaW5lIENPQkFMVF9BVURJT19BU1lOQ19BVURJT19ERUNPREVSX0hfCiAKKyNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKICNpbmNsdWRlICJiYXNlL2NhbGxiYWNrLmgiCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgogI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZC5oIgotI2luY2x1ZGUgImNvYmFsdC9hdWRpby9hdWRpb19idWZmZXIuaCIKICNpbmNsdWRlICJjb2JhbHQvYXVkaW8vYXVkaW9faGVscGVycy5oIgotI2luY2x1ZGUgImNvYmFsdC9kb20vYXJyYXlfYnVmZmVyLmgiCiAKIG5hbWVzcGFjZSBjb2JhbHQgewogbmFtZXNwYWNlIGF1ZGlvIHsKIAogY2xhc3MgQXN5bmNBdWRpb0RlY29kZXIgewogIHB1YmxpYzoKLSAgdHlwZWRlZiBiYXNlOjpDYWxsYmFjazx2b2lkKGZsb2F0IHNhbXBsZV9yYXRlLCBpbnQzMiBudW1iZXJfb2ZfZnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzIgbnVtYmVyX29mX2NoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVkX2FycmF5PHVpbnQ4PiBjaGFubmVsc19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlVHlwZSBzYW1wbGVfdHlwZSk+IERlY29kZUZpbmlzaENhbGxiYWNrOworICB0eXBlZGVmIGJhc2U6OkNhbGxiYWNrPHZvaWQoZmxvYXQgc2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZWRfcHRyPFNoZWxsQXVkaW9CdXM+IGF1ZGlvX2J1cyk+CisgICAgICBEZWNvZGVGaW5pc2hDYWxsYmFjazsKIAogICBBc3luY0F1ZGlvRGVjb2RlcigpOwogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvLmd5cCBiL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW8uZ3lwCmluZGV4IDYwYmRjZjYuLmQ5ZWI2MWEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW8uZ3lwCisrKyBiL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW8uZ3lwCkBAIC00OCw4ICs0OCw2IEBACiAgICAgICAnZGVwZW5kZW5jaWVzJzogWwogICAgICAgICAnPChERVBUSCkvY29iYWx0L2Jhc2UvYmFzZS5neXA6YmFzZScsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvYnJvd3Nlci9icm93c2VyX2JpbmRpbmdzX2dlbi5neXA6Z2VuZXJhdGVkX3R5cGVzJywKLSAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9kb20vZG9tLmd5cDpkb20nLAotICAgICAgICAnPChERVBUSCkvY29iYWx0L3NwZWVjaC9zcGVlY2guZ3lwOnNwZWVjaCcsCiAgICAgICBdLAogICAgICAgJ2V4cG9ydF9kZXBlbmRlbnRfc2V0dGluZ3MnOiBbCiAgICAgICAgICMgQWRkaXRpb25hbGx5LCBlbnN1cmUgdGhhdCB0aGUgaW5jbHVkZSBkaXJlY3RvcmllcyBmb3IgZ2VuZXJhdGVkCkBAIC01OCwzNSArNTYsNSBAQAogICAgICAgICAnPChERVBUSCkvY29iYWx0L2Jyb3dzZXIvYnJvd3Nlcl9iaW5kaW5nc19nZW4uZ3lwOmdlbmVyYXRlZF90eXBlcycsCiAgICAgICBdCiAgICAgfSwKLQotICAgIHsKLSAgICAgICd0YXJnZXRfbmFtZSc6ICdhdWRpb190ZXN0JywKLSAgICAgICd0eXBlJzogJzwoZ3Rlc3RfdGFyZ2V0X3R5cGUpJywKLSAgICAgICdzb3VyY2VzJzogWwotICAgICAgICAnYXVkaW9fbm9kZV9pbnB1dF9vdXRwdXRfdGVzdC5jYycsCi0gICAgICBdLAotICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKLSAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9hdWRpby9hdWRpby5neXA6YXVkaW8nLAotICAgICAgICAnPChERVBUSCkvY29iYWx0L3Rlc3QvdGVzdC5neXA6cnVuX2FsbF91bml0dGVzdHMnLAotICAgICAgICAnPChERVBUSCkvdGVzdGluZy9nbW9jay5neXA6Z21vY2snLAotICAgICAgICAnPChERVBUSCkvdGVzdGluZy9ndGVzdC5neXA6Z3Rlc3QnLAotCi0gICAgICAgICMgVE9ETzogUmVtb3ZlIHRoZSBkZXBlbmRlbmN5IGJlbG93LCBpdCB3b3JrcyBhcm91bmQgdGhlIGZhY3QgdGhhdAotICAgICAgICAjICAgICAgIFNjcmlwdFZhbHVlRmFjdG9yeSBoYXMgbm9uLXZpcnR1YWwgbWV0aG9kIENyZWF0ZVByb21pc2UoKS4KLSAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9zY3JpcHQvZW5naW5lLmd5cDplbmdpbmUnLAotICAgICAgXSwKLSAgICB9LAotCi0gICAgewotICAgICAgJ3RhcmdldF9uYW1lJzogJ2F1ZGlvX3Rlc3RfZGVwbG95JywKLSAgICAgICd0eXBlJzogJ25vbmUnLAotICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKLSAgICAgICAgJ2F1ZGlvX3Rlc3QnLAotICAgICAgXSwKLSAgICAgICd2YXJpYWJsZXMnOiB7Ci0gICAgICAgICdleGVjdXRhYmxlX25hbWUnOiAnYXVkaW9fdGVzdCcsCi0gICAgICB9LAotICAgICAgJ2luY2x1ZGVzJzogWyAnPChERVBUSCkvc3RhcmJvYXJkL2J1aWxkL2RlcGxveS5neXBpJyBdLAotICAgIH0sCiAgIF0sCiB9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2J1ZmZlci5jYyBiL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fYnVmZmVyLmNjCmluZGV4IDZlOWU4MDQuLjA0NWM5YjQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fYnVmZmVyLmNjCisrKyBiL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fYnVmZmVyLmNjCkBAIC0yMCw4MCArMjAsMTEgQEAKIG5hbWVzcGFjZSBjb2JhbHQgewogbmFtZXNwYWNlIGF1ZGlvIHsKIAotQXVkaW9CdWZmZXI6OkF1ZGlvQnVmZmVyKHNjcmlwdDo6RW52aXJvbm1lbnRTZXR0aW5ncyogc2V0dGluZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgc2FtcGxlX3JhdGUsIGludDMyIG51bWJlcl9vZl9mcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50MzIgbnVtYmVyX29mX2NoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlZF9hcnJheTx1aW50OD4gY2hhbm5lbHNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVUeXBlIHNhbXBsZV90eXBlKQotICAgIDogc2FtcGxlX3JhdGVfKHNhbXBsZV9yYXRlKSwKLSAgICAgIGxlbmd0aF8obnVtYmVyX29mX2ZyYW1lcyksCi0gICAgICBzYW1wbGVfdHlwZV8oc2FtcGxlX3R5cGUpIHsKK0F1ZGlvQnVmZmVyOjpBdWRpb0J1ZmZlcihmbG9hdCBzYW1wbGVfcmF0ZSwgc2NvcGVkX3B0cjxTaGVsbEF1ZGlvQnVzPiBhdWRpb19idXMpCisgICAgOiBzYW1wbGVfcmF0ZV8oc2FtcGxlX3JhdGUpLCBhdWRpb19idXNfKGF1ZGlvX2J1cy5QYXNzKCkpIHsKICAgRENIRUNLX0dUKHNhbXBsZV9yYXRlXywgMCk7Ci0gIERDSEVDS19HVChsZW5ndGhfLCAwKTsKLSAgRENIRUNLX0dUKG51bWJlcl9vZl9jaGFubmVscywgMCk7Ci0KLSAgLy8gQ3JlYXRlIGFuIEFycmF5QnVmZmVyIHN0b3JlcyBzYW1wbGUgZGF0YSBmcm9tIGFsbCBjaGFubmVscy4KLSAgY29uc3QgdWludDMyIGxlbmd0aCA9Ci0gICAgICBudW1iZXJfb2ZfZnJhbWVzICogbnVtYmVyX29mX2NoYW5uZWxzICoKLSAgICAgIChzYW1wbGVfdHlwZSA9PSBrU2FtcGxlVHlwZUZsb2F0MzIgPyBzaXplb2YoZmxvYXQpIDogc2l6ZW9mKGludDE2KSk7Ci0gIHNjb3BlZF9yZWZwdHI8ZG9tOjpBcnJheUJ1ZmZlcj4gYXJyYXlfYnVmZmVyKAotICAgICAgbmV3IGRvbTo6QXJyYXlCdWZmZXIoc2V0dGluZ3MsIGNoYW5uZWxzX2RhdGEuUGFzcygpLCBsZW5ndGgpKTsKLQotICAvLyBFYWNoIGNoYW5uZWwgc2hvdWxkIGhhdmUgfG51bWJlcl9vZl9mcmFtZXMgKiBzaXplX29mX3NhbXBsZV90eXBlfCBieXRlcy4KLSAgLy8gV2UgY3JlYXRlIHxudW1iZXJfb2ZfY2hhbm5lbHN8IG9mIHtGbG9hdDMyLEludDE2fUFycmF5IGFzIHZpZXdzIGludG8gdGhlCi0gIC8vIGFib3ZlIEFycmF5QnVmZmVyLiAgVGhpcyBkb2VzIG5vdCBuZWVkIGFueSBleHRyYSBhbGxvY2F0aW9uLgotICBpZiAoc2FtcGxlX3R5cGUgPT0ga1NhbXBsZVR5cGVGbG9hdDMyKSB7Ci0gICAgY2hhbm5lbHNfZGF0YV8ucmVzaXplKHN0YXRpY19jYXN0PHNpemVfdD4obnVtYmVyX29mX2NoYW5uZWxzKSk7Ci0gICAgdWludDMyIHN0YXJ0X29mZnNldF9pbl9ieXRlcyA9IDA7Ci0gICAgZm9yIChpbnQzMiBpID0gMDsgaSA8IG51bWJlcl9vZl9jaGFubmVsczsgKytpKSB7Ci0gICAgICBjaGFubmVsc19kYXRhX1tzdGF0aWNfY2FzdDxzaXplX3Q+KGkpXSA9Ci0gICAgICAgICAgbmV3IGRvbTo6RmxvYXQzMkFycmF5KHNldHRpbmdzLCBhcnJheV9idWZmZXIsIHN0YXJ0X29mZnNldF9pbl9ieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyPihudW1iZXJfb2ZfZnJhbWVzKSwgTlVMTCk7Ci0gICAgICBzdGFydF9vZmZzZXRfaW5fYnl0ZXMgKz0gbnVtYmVyX29mX2ZyYW1lcyAqIHNpemVvZihmbG9hdCk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHNhbXBsZV90eXBlID09IGtTYW1wbGVUeXBlSW50MTYpIHsKLSAgICBjaGFubmVsc19pbnQxNl9kYXRhXy5yZXNpemUoc3RhdGljX2Nhc3Q8c2l6ZV90PihudW1iZXJfb2ZfY2hhbm5lbHMpKTsKLSAgICB1aW50MzIgc3RhcnRfb2Zmc2V0X2luX2J5dGVzID0gMDsKLSAgICBmb3IgKGludDMyIGkgPSAwOyBpIDwgbnVtYmVyX29mX2NoYW5uZWxzOyArK2kpIHsKLSAgICAgIGNoYW5uZWxzX2ludDE2X2RhdGFfW3N0YXRpY19jYXN0PHNpemVfdD4oaSldID0KLSAgICAgICAgICBuZXcgZG9tOjpJbnQxNkFycmF5KHNldHRpbmdzLCBhcnJheV9idWZmZXIsIHN0YXJ0X29mZnNldF9pbl9ieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMj4obnVtYmVyX29mX2ZyYW1lcyksIE5VTEwpOwotICAgICAgc3RhcnRfb2Zmc2V0X2luX2J5dGVzICs9IG51bWJlcl9vZl9mcmFtZXMgKiBzaXplb2YoaW50MTYpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gIH0KLX0KLQotc2NvcGVkX3JlZnB0cjxkb206OkZsb2F0MzJBcnJheT4gQXVkaW9CdWZmZXI6OkdldENoYW5uZWxEYXRhKAotICAgIHVpbnQzMiBjaGFubmVsX2luZGV4LCBzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlKiBleGNlcHRpb25fc3RhdGUpIGNvbnN0IHsKLSAgRENIRUNLX0VRKHNhbXBsZV90eXBlXywga1NhbXBsZVR5cGVGbG9hdDMyKTsKLSAgLy8gVGhlIGluZGV4IHZhbHVlIE1VU1QgYmUgbGVzcyB0aGFuIG51bWJlcl9vZl9jaGFubmVscygpIG9yIGFuIElOREVYX1NJWkVfRVJSCi0gIC8vIGV4Y2VwdGlvbiBNVVNUIGJlIHRocm93bi4KLSAgaWYgKGNoYW5uZWxfaW5kZXggPj0gY2hhbm5lbHNfZGF0YV8uc2l6ZSgpKSB7Ci0gICAgZG9tOjpET01FeGNlcHRpb246OlJhaXNlKGRvbTo6RE9NRXhjZXB0aW9uOjprSW5kZXhTaXplRXJyLCBleGNlcHRpb25fc3RhdGUpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgcmV0dXJuIGNoYW5uZWxzX2RhdGFfW2NoYW5uZWxfaW5kZXhdOwotfQotCi1zY29wZWRfcmVmcHRyPGRvbTo6SW50MTZBcnJheT4gQXVkaW9CdWZmZXI6OkdldENoYW5uZWxEYXRhSW50MTYoCi0gICAgdWludDMyIGNoYW5uZWxfaW5kZXgsIHNjcmlwdDo6RXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSkgY29uc3QgewotICBEQ0hFQ0tfRVEoc2FtcGxlX3R5cGVfLCBrU2FtcGxlVHlwZUludDE2KTsKLSAgLy8gVGhlIGluZGV4IHZhbHVlIE1VU1QgYmUgbGVzcyB0aGFuIG51bWJlcl9vZl9jaGFubmVscygpIG9yIGFuIElOREVYX1NJWkVfRVJSCi0gIC8vIGV4Y2VwdGlvbiBNVVNUIGJlIHRocm93bi4KLSAgaWYgKGNoYW5uZWxfaW5kZXggPj0gY2hhbm5lbHNfaW50MTZfZGF0YV8uc2l6ZSgpKSB7Ci0gICAgZG9tOjpET01FeGNlcHRpb246OlJhaXNlKGRvbTo6RE9NRXhjZXB0aW9uOjprSW5kZXhTaXplRXJyLCBleGNlcHRpb25fc3RhdGUpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgcmV0dXJuIGNoYW5uZWxzX2ludDE2X2RhdGFfW2NoYW5uZWxfaW5kZXhdOwotfQotCi12b2lkIEF1ZGlvQnVmZmVyOjpUcmFjZU1lbWJlcnMoc2NyaXB0OjpUcmFjZXIqIHRyYWNlcikgewotICB0cmFjZXItPlRyYWNlSXRlbXMoY2hhbm5lbHNfZGF0YV8pOwotICB0cmFjZXItPlRyYWNlSXRlbXMoY2hhbm5lbHNfaW50MTZfZGF0YV8pOworICBEQ0hFQ0tfR1QobGVuZ3RoKCksIDApOworICBEQ0hFQ0tfR1QobnVtYmVyX29mX2NoYW5uZWxzKCksIDApOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgYXVkaW8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fYnVmZmVyLmggYi9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2J1ZmZlci5oCmluZGV4IGU5ZWJlYTkuLmY2OWQyNjIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fYnVmZmVyLmgKKysrIGIvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19idWZmZXIuaApAQCAtMzksNTcgKzM5LDMxIEBACiAvLyAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJhdWRpby8jQXVkaW9CdWZmZXIKIGNsYXNzIEF1ZGlvQnVmZmVyIDogcHVibGljIHNjcmlwdDo6V3JhcHBhYmxlIHsKICBwdWJsaWM6Ci0gIC8vIFRoZSBhdWRpbyBkYXRhIHBhc3NlZCBpbiB8Y2hhbm5lbHNfZGF0YXwgc3RvcmVzIG11bHRpLWNoYW5uZWwgYXVkaW8gaW4KLSAgLy8gcGxhbmFyLiAgU28gZm9yIHN0ZXJlbyBhdWRpbywgdGhlIGZpcnN0IGNoYW5uZWwgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIGZpcnN0Ci0gIC8vIGhhbGYgb2YgfGNoYW5uZWxzX2RhdGF8IGFuZCB0aGUgc2Vjb25kIGNoYW5uZWwgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIHNlY29uZAotICAvLyBoYWxmLgotICBBdWRpb0J1ZmZlcihzY3JpcHQ6OkVudmlyb25tZW50U2V0dGluZ3MqIHNldHRpbmdzLCBmbG9hdCBzYW1wbGVfcmF0ZSwKLSAgICAgICAgICAgICAgaW50MzIgbnVtYmVyX29mX2ZyYW1lcywgaW50MzIgbnVtYmVyX29mX2NoYW5uZWxzLAotICAgICAgICAgICAgICBzY29wZWRfYXJyYXk8dWludDg+IGNoYW5uZWxzX2RhdGEsIFNhbXBsZVR5cGUgc2FtcGxlX3R5cGUpOworICBBdWRpb0J1ZmZlcihmbG9hdCBzYW1wbGVfcmF0ZSwgc2NvcGVkX3B0cjxTaGVsbEF1ZGlvQnVzPiBhdWRpb19idXMpOwogCiAgIC8vIFdlYiBBUEk6IEF1ZGlvQnVmZmVyCiAgIC8vCiAgIC8vIFRoZSBzYW1wbGUtcmF0ZSBmb3IgdGhlIFBDTSBhdWRpbyBkYXRhIGluIHNhbXBsZXMgcGVyIHNlY29uZC4KICAgZmxvYXQgc2FtcGxlX3JhdGUoKSBjb25zdCB7IHJldHVybiBzYW1wbGVfcmF0ZV87IH0KLQogICAvLyBMZW5ndGggb2YgdGhlIFBDTSBhdWRpbyBkYXRhIGluIHNhbXBsZS1mcmFtZXMuCi0gIGludDMyIGxlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIGxlbmd0aF87IH0KLQorICBpbnQzMiBsZW5ndGgoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMj4oYXVkaW9fYnVzXy0+ZnJhbWVzKCkpOyB9CiAgIC8vIER1cmF0aW9uIG9mIHRoZSBQQ00gYXVkaW8gZGF0YSBpbiBzZWNvbmRzLgogICBkb3VibGUgZHVyYXRpb24oKSBjb25zdCB7IHJldHVybiBsZW5ndGgoKSAvIHNhbXBsZV9yYXRlKCk7IH0KLQogICAvLyBUaGUgbnVtYmVyIG9mIGRpc2NyZXRlIGF1ZGlvIGNoYW5uZWxzLgogICBpbnQzMiBudW1iZXJfb2ZfY2hhbm5lbHMoKSBjb25zdCB7Ci0gICAgaWYgKHNhbXBsZV90eXBlXyA9PSBrU2FtcGxlVHlwZUZsb2F0MzIpIHsKLSAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMj4oY2hhbm5lbHNfZGF0YV8uc2l6ZSgpKTsKLSAgICB9IGVsc2UgaWYgKHNhbXBsZV90eXBlXyA9PSBrU2FtcGxlVHlwZUludDE2KSB7Ci0gICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzI+KGNoYW5uZWxzX2ludDE2X2RhdGFfLnNpemUoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIE5PVFJFQUNIRUQoKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzI+KGF1ZGlvX2J1c18tPmNoYW5uZWxzKCkpOwogICB9CiAKLSAgLy8gUmVwcmVzZW50cyB0aGUgUENNIGF1ZGlvIGRhdGEgZm9yIHRoZSBzcGVjaWZpYyBjaGFubmVsLgotICBzY29wZWRfcmVmcHRyPGRvbTo6RmxvYXQzMkFycmF5PiBHZXRDaGFubmVsRGF0YSgKLSAgICAgIHVpbnQzMiBjaGFubmVsX2luZGV4LCBzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlKiBleGNlcHRpb25fc3RhdGUpIGNvbnN0OwotCi0gIHNjb3BlZF9yZWZwdHI8ZG9tOjpJbnQxNkFycmF5PiBHZXRDaGFubmVsRGF0YUludDE2KAotICAgICAgdWludDMyIGNoYW5uZWxfaW5kZXgsIHNjcmlwdDo6RXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSkgY29uc3Q7CisgIC8vIEN1c3RvbSwgbm90IGluIGFueSBzcGVjCisgIC8vCisgIFNoZWxsQXVkaW9CdXMqIGF1ZGlvX2J1cygpIHsgcmV0dXJuIGF1ZGlvX2J1c18uZ2V0KCk7IH0KIAogICBERUZJTkVfV1JBUFBBQkxFX1RZUEUoQXVkaW9CdWZmZXIpOwotICB2b2lkIFRyYWNlTWVtYmVycyhzY3JpcHQ6OlRyYWNlciogdHJhY2VyKSBvdmVycmlkZTsKIAogIHByaXZhdGU6Ci0gIHR5cGVkZWYgc3RkOjp2ZWN0b3I8c2NvcGVkX3JlZnB0cjxkb206OkZsb2F0MzJBcnJheT4gPiBGbG9hdDMyQXJyYXlWZWN0b3I7Ci0gIHR5cGVkZWYgc3RkOjp2ZWN0b3I8c2NvcGVkX3JlZnB0cjxkb206OkludDE2QXJyYXk+ID4gSW50MTZBcnJheVZlY3RvcjsKKyAgY29uc3QgZmxvYXQgc2FtcGxlX3JhdGVfOwogCi0gIGZsb2F0IHNhbXBsZV9yYXRlXzsKLSAgaW50MzIgbGVuZ3RoXzsKLSAgU2FtcGxlVHlwZSBzYW1wbGVfdHlwZV87Ci0KLSAgRmxvYXQzMkFycmF5VmVjdG9yIGNoYW5uZWxzX2RhdGFfOwotICBJbnQxNkFycmF5VmVjdG9yIGNoYW5uZWxzX2ludDE2X2RhdGFfOworICBzY29wZWRfcHRyPFNoZWxsQXVkaW9CdXM+IGF1ZGlvX2J1c187CiAKICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEF1ZGlvQnVmZmVyKTsKIH07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2J1ZmZlci5pZGwgYi9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2J1ZmZlci5pZGwKaW5kZXggNTNmOWUwOS4uNzdhMTUxYyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19idWZmZXIuaWRsCisrKyBiL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fYnVmZmVyLmlkbApAQCAtMjEsNiArMjEsNCBAQAogICAvLyBpbiBzZWNvbmRzCiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBkb3VibGUgZHVyYXRpb247CiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBsb25nIG51bWJlck9mQ2hhbm5lbHM7Ci0KLSAgW1JhaXNlc0V4Y2VwdGlvbl0gRmxvYXQzMkFycmF5IGdldENoYW5uZWxEYXRhKHVuc2lnbmVkIGxvbmcgY2hhbm5lbCk7CiB9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19idWZmZXJfc291cmNlX25vZGUuY2MgYi9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2J1ZmZlcl9zb3VyY2Vfbm9kZS5jYwppbmRleCBhZGJmYzk1Li5mNmFhNmU5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2J1ZmZlcl9zb3VyY2Vfbm9kZS5jYworKysgYi9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2J1ZmZlcl9zb3VyY2Vfbm9kZS5jYwpAQCAtOTIsNjMgKzkyLDU0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbl9zdGF0ZSk7CiAgICAgcmV0dXJuOwogICB9Ci0gIHN0YXRlXyA9IGtTdG9wZWQ7CisgIHN0YXRlXyA9IGtTdG9wcGVkOwogfQogCiBzY29wZWRfcHRyPFNoZWxsQXVkaW9CdXM+IEF1ZGlvQnVmZmVyU291cmNlTm9kZTo6UGFzc0F1ZGlvQnVzRnJvbVNvdXJjZSgKLSAgICBpbnQzMiBudW1iZXJfb2ZfZnJhbWVzLCBTYW1wbGVUeXBlIHNhbXBsZV90eXBlKSB7CisgICAgaW50MzIgbnVtYmVyX29mX2ZyYW1lcywgU2FtcGxlVHlwZSBzYW1wbGVfdHlwZSwgYm9vbCogZmluaXNoZWQpIHsKKyAgRENIRUNLX0dUKG51bWJlcl9vZl9mcmFtZXMsIDApOworICBEQ0hFQ0soZmluaXNoZWQpOworCiAgIC8vIFRoaXMgaXMgY2FsbGVkIGJ5IEF1ZGlvIHRocmVhZC4KICAgYXVkaW9fbG9jaygpLT5Bc3NlcnRMb2NrZWQoKTsKIAotICBpZiAoc3RhdGVfICE9IGtTdGFydGVkIHx8ICFidWZmZXJfIHx8IGJ1ZmZlcl8tPmxlbmd0aCgpID09IHJlYWRfaW5kZXhfKSB7CisgICpmaW5pc2hlZCA9IGZhbHNlOworCisgIGlmIChzdGF0ZV8gPT0ga05vbmUgfHwgIWJ1ZmZlcl8pIHsKICAgICByZXR1cm4gc2NvcGVkX3B0cjxTaGVsbEF1ZGlvQnVzPigpOwogICB9CiAKLSAgRENIRUNLX0dUKG51bWJlcl9vZl9mcmFtZXMsIDApOworICBpZiAoc3RhdGVfID09IGtTdG9wcGVkIHx8IGJ1ZmZlcl8tPmxlbmd0aCgpID09IHJlYWRfaW5kZXhfKSB7CisgICAgKmZpbmlzaGVkID0gdHJ1ZTsKKyAgICByZXR1cm4gc2NvcGVkX3B0cjxTaGVsbEF1ZGlvQnVzPigpOworICB9CisKKyAgRENIRUNLX0VRKHN0YXRlXywga1N0YXJ0ZWQpOworCisgIGF1dG8gYXVkaW9fYnVzID0gYnVmZmVyXy0+YXVkaW9fYnVzKCk7CisgIERDSEVDS19FUShzYW1wbGVfdHlwZSwgYXVkaW9fYnVzLT5zYW1wbGVfdHlwZSgpKTsKKwogICBpbnQzMiBmcmFtZXNfdG9fZW5kID0gYnVmZmVyXy0+bGVuZ3RoKCkgLSByZWFkX2luZGV4XzsKICAgbnVtYmVyX29mX2ZyYW1lcyA9IHN0ZDo6bWluKG51bWJlcl9vZl9mcmFtZXMsIGZyYW1lc190b19lbmQpOwogCi0gIHNpemVfdCBjaGFubmVscyA9IHN0YXRpY19jYXN0PHNpemVfdD4oYnVmZmVyXy0+bnVtYmVyX29mX2NoYW5uZWxzKCkpOworICBzY29wZWRfcHRyPFNoZWxsQXVkaW9CdXM+IHJlc3VsdDsKIAotICBpZiAoc2FtcGxlX3R5cGUgPT0ga1NhbXBsZVR5cGVGbG9hdDMyKSB7Ci0gICAgc3RkOjp2ZWN0b3I8c2NvcGVkX3JlZnB0cjxkb206OkZsb2F0MzJBcnJheT4+IGF1ZGlvX2J1ZmZlcl9zdG9yYWdlcygKLSAgICAgICAgY2hhbm5lbHMpOwotICAgIHN0ZDo6dmVjdG9yPGZsb2F0Kj4gYXVkaW9fYnVmZmVycyhjaGFubmVscywgTlVMTCk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjaGFubmVsczsgKytpKSB7Ci0gICAgICBzY29wZWRfcmVmcHRyPGRvbTo6RmxvYXQzMkFycmF5PiBidWZmZXJfZGF0YSA9Ci0gICAgICAgICAgYnVmZmVyXy0+R2V0Q2hhbm5lbERhdGEoc3RhdGljX2Nhc3Q8dWludDMyPihpKSwgTlVMTCk7Ci0gICAgICBhdWRpb19idWZmZXJfc3RvcmFnZXNbaV0gPSBidWZmZXJfZGF0YS0+U3ViYXJyYXkoCi0gICAgICAgICAgTlVMTCwgcmVhZF9pbmRleF8sIHJlYWRfaW5kZXhfICsgbnVtYmVyX29mX2ZyYW1lcyk7Ci0gICAgICBhdWRpb19idWZmZXJzW2ldID0gYXVkaW9fYnVmZmVyX3N0b3JhZ2VzW2ldLT5kYXRhKCk7Ci0gICAgfQorICBpZiAoc2FtcGxlX3R5cGUgPT0ga1NhbXBsZVR5cGVJbnQxNikgeworICAgIHJlc3VsdC5yZXNldChuZXcgbWVkaWE6OlNoZWxsQXVkaW9CdXMoCisgICAgICAgIGF1ZGlvX2J1cy0+Y2hhbm5lbHMoKSwgbnVtYmVyX29mX2ZyYW1lcywKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxpbnQxNio+KGF1ZGlvX2J1cy0+aW50ZXJsZWF2ZWRfZGF0YSgpKSArCisgICAgICAgICAgICByZWFkX2luZGV4XyAqIGF1ZGlvX2J1cy0+Y2hhbm5lbHMoKSkpOworICB9IGVsc2UgeworICAgIERDSEVDS19FUShzYW1wbGVfdHlwZSwga1NhbXBsZVR5cGVGbG9hdDMyKTsKIAotICAgIHJlYWRfaW5kZXhfICs9IG51bWJlcl9vZl9mcmFtZXM7Ci0KLSAgICBzY29wZWRfcHRyPFNoZWxsQXVkaW9CdXM+IGF1ZGlvX2J1cyhuZXcgU2hlbGxBdWRpb0J1cygKLSAgICAgICAgc3RhdGljX2Nhc3Q8c2l6ZV90PihudW1iZXJfb2ZfZnJhbWVzKSwgYXVkaW9fYnVmZmVycykpOwotCi0gICAgcmV0dXJuIGF1ZGlvX2J1cy5QYXNzKCk7Ci0gIH0gZWxzZSBpZiAoc2FtcGxlX3R5cGUgPT0ga1NhbXBsZVR5cGVJbnQxNikgewotICAgIHN0ZDo6dmVjdG9yPHNjb3BlZF9yZWZwdHI8ZG9tOjpJbnQxNkFycmF5Pj4gYXVkaW9fYnVmZmVyX3N0b3JhZ2VzKGNoYW5uZWxzKTsKLSAgICBzdGQ6OnZlY3RvcjxpbnQxNio+IGF1ZGlvX2J1ZmZlcnMoY2hhbm5lbHMsIE5VTEwpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2hhbm5lbHM7ICsraSkgewotICAgICAgc2NvcGVkX3JlZnB0cjxkb206OkludDE2QXJyYXk+IGJ1ZmZlcl9kYXRhID0KLSAgICAgICAgICBidWZmZXJfLT5HZXRDaGFubmVsRGF0YUludDE2KHN0YXRpY19jYXN0PHVpbnQzMj4oaSksIE5VTEwpOwotICAgICAgYXVkaW9fYnVmZmVyX3N0b3JhZ2VzW2ldID0gYnVmZmVyX2RhdGEtPlN1YmFycmF5KAotICAgICAgICAgIE5VTEwsIHJlYWRfaW5kZXhfLCByZWFkX2luZGV4XyArIG51bWJlcl9vZl9mcmFtZXMpOwotICAgICAgYXVkaW9fYnVmZmVyc1tpXSA9IGF1ZGlvX2J1ZmZlcl9zdG9yYWdlc1tpXS0+ZGF0YSgpOwotICAgIH0KLQotICAgIHJlYWRfaW5kZXhfICs9IG51bWJlcl9vZl9mcmFtZXM7Ci0KLSAgICBzY29wZWRfcHRyPFNoZWxsQXVkaW9CdXM+IGF1ZGlvX2J1cyhuZXcgU2hlbGxBdWRpb0J1cygKLSAgICAgICAgc3RhdGljX2Nhc3Q8c2l6ZV90PihudW1iZXJfb2ZfZnJhbWVzKSwgYXVkaW9fYnVmZmVycykpOwotCi0gICAgcmV0dXJuIGF1ZGlvX2J1cy5QYXNzKCk7CisgICAgcmVzdWx0LnJlc2V0KG5ldyBtZWRpYTo6U2hlbGxBdWRpb0J1cygKKyAgICAgICAgYXVkaW9fYnVzLT5jaGFubmVscygpLCBudW1iZXJfb2ZfZnJhbWVzLAorICAgICAgICByZWludGVycHJldF9jYXN0PGZsb2F0Kj4oYXVkaW9fYnVzLT5pbnRlcmxlYXZlZF9kYXRhKCkpICsKKyAgICAgICAgICAgIHJlYWRfaW5kZXhfICogYXVkaW9fYnVzLT5jaGFubmVscygpKSk7CiAgIH0KIAotICBOT1RSRUFDSEVEKCk7Ci0gIHJldHVybiBzY29wZWRfcHRyPFNoZWxsQXVkaW9CdXM+KCk7CisgIHJlYWRfaW5kZXhfICs9IG51bWJlcl9vZl9mcmFtZXM7CisgIHJldHVybiByZXN1bHQuUGFzcygpOwogfQogCiB2b2lkIEF1ZGlvQnVmZmVyU291cmNlTm9kZTo6VHJhY2VNZW1iZXJzKHNjcmlwdDo6VHJhY2VyKiB0cmFjZXIpIHsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fYnVmZmVyX3NvdXJjZV9ub2RlLmggYi9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2J1ZmZlcl9zb3VyY2Vfbm9kZS5oCmluZGV4IGIwMTdhYmIuLmMzYmJlODUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fYnVmZmVyX3NvdXJjZV9ub2RlLmgKKysrIGIvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19idWZmZXJfc291cmNlX25vZGUuaApAQCAtNzcsOCArNzcsOSBAQAogICAgIFNldEF0dHJpYnV0ZUV2ZW50TGlzdGVuZXIoYmFzZTo6VG9rZW5zOjplbmRlZCgpLCBldmVudF9saXN0ZW5lcik7CiAgIH0KIAotICBzY29wZWRfcHRyPFNoZWxsQXVkaW9CdXM+IFBhc3NBdWRpb0J1c0Zyb21Tb3VyY2UoCi0gICAgICBpbnQzMiBudW1iZXJfb2ZfZnJhbWVzLCBTYW1wbGVUeXBlIHNhbXBsZV90eXBlKSBvdmVycmlkZTsKKyAgc2NvcGVkX3B0cjxTaGVsbEF1ZGlvQnVzPiBQYXNzQXVkaW9CdXNGcm9tU291cmNlKGludDMyIG51bWJlcl9vZl9mcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVUeXBlIHNhbXBsZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogZmluaXNoZWQpIG92ZXJyaWRlOwogCiAgIERFRklORV9XUkFQUEFCTEVfVFlQRShBdWRpb0J1ZmZlclNvdXJjZU5vZGUpOwogICB2b2lkIFRyYWNlTWVtYmVycyhzY3JpcHQ6OlRyYWNlciogdHJhY2VyKSBvdmVycmlkZTsKQEAgLTkwLDcgKzkxLDcgQEAKICAgZW51bSBTdGF0ZSB7CiAgICAga05vbmUsCiAgICAga1N0YXJ0ZWQsCi0gICAga1N0b3BlZCwKKyAgICBrU3RvcHBlZCwKICAgfTsKIAogICBzY29wZWRfcmVmcHRyPEF1ZGlvQnVmZmVyPiBidWZmZXJfOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19jb250ZXh0LmNjIGIvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19jb250ZXh0LmNjCmluZGV4IDEzOTliNGQuLmRjY2Q4MjEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fY29udGV4dC5jYworKysgYi9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2NvbnRleHQuY2MKQEAgLTEwMiwxNiArMTAyLDEyIEBACiAvLyBTdWNjZXNzIGNhbGxiYWNrIGFuZCBlcnJvciBjYWxsYmFjayBzaG91bGQgYmUgc2NoZWR1bGVkIHRvIHJ1biBvbiB0aGUgbWFpbgogLy8gdGhyZWFkJ3MgZXZlbnQgbG9vcC4KIHZvaWQgQXVkaW9Db250ZXh0OjpEZWNvZGVGaW5pc2goaW50IGNhbGxiYWNrX2lkLCBmbG9hdCBzYW1wbGVfcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzIgbnVtYmVyX29mX2ZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzIgbnVtYmVyX29mX2NoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZWRfYXJyYXk8dWludDg+IGNoYW5uZWxzX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZVR5cGUgc2FtcGxlX3R5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVkX3B0cjxTaGVsbEF1ZGlvQnVzPiBhdWRpb19idXMpIHsKICAgaWYgKCFtYWluX21lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSkgewogICAgIG1haW5fbWVzc2FnZV9sb29wXy0+UG9zdFRhc2soCiAgICAgICAgIEZST01fSEVSRSwKICAgICAgICAgYmFzZTo6QmluZCgmQXVkaW9Db250ZXh0OjpEZWNvZGVGaW5pc2gsIHdlYWtfdGhpc18sIGNhbGxiYWNrX2lkLAotICAgICAgICAgICAgICAgICAgIHNhbXBsZV9yYXRlLCBudW1iZXJfb2ZfZnJhbWVzLCBudW1iZXJfb2ZfY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgYmFzZTo6UGFzc2VkKCZjaGFubmVsc19kYXRhKSwgc2FtcGxlX3R5cGUpKTsKKyAgICAgICAgICAgICAgICAgICBzYW1wbGVfcmF0ZSwgYmFzZTo6UGFzc2VkKCZhdWRpb19idXMpKSk7CiAgICAgcmV0dXJuOwogICB9CiAKQEAgLTEyMiwxMCArMTE4LDkgQEAKICAgc2NvcGVkX3B0cjxEZWNvZGVDYWxsYmFja0luZm8+IGluZm8oaW5mb19pdGVyYXRvci0+c2Vjb25kKTsKICAgcGVuZGluZ19kZWNvZGVfY2FsbGJhY2tzXy5lcmFzZShpbmZvX2l0ZXJhdG9yKTsKIAotICBpZiAoY2hhbm5lbHNfZGF0YSkgeworICBpZiAoYXVkaW9fYnVzKSB7CiAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxBdWRpb0J1ZmZlcj4mIGF1ZGlvX2J1ZmZlciA9Ci0gICAgICAgIG5ldyBBdWRpb0J1ZmZlcihpbmZvLT5lbnZfc2V0dGluZ3MsIHNhbXBsZV9yYXRlLCBudW1iZXJfb2ZfZnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyX29mX2NoYW5uZWxzLCBjaGFubmVsc19kYXRhLlBhc3MoKSwgc2FtcGxlX3R5cGUpOworICAgICAgICBuZXcgQXVkaW9CdWZmZXIoc2FtcGxlX3JhdGUsIGF1ZGlvX2J1cy5QYXNzKCkpOwogICAgIGluZm8tPnN1Y2Nlc3NfY2FsbGJhY2sudmFsdWUoKS5SdW4oYXVkaW9fYnVmZmVyKTsKICAgfSBlbHNlIGlmIChpbmZvLT5lcnJvcl9jYWxsYmFjaykgewogICAgIGluZm8tPmVycm9yX2NhbGxiYWNrLnZhbHVlKCkudmFsdWUoKS5SdW4oKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fY29udGV4dC5oIGIvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19jb250ZXh0LmgKaW5kZXggYWMwN2MyMC4uYWIzNDQ5MCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19jb250ZXh0LmgKKysrIGIvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19jb250ZXh0LmgKQEAgLTE5LDYgKzE5LDcgQEAKIAogI2luY2x1ZGUgImJhc2UvY2FsbGJhY2suaCIKICNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgogI2luY2x1ZGUgImJhc2UvbWVtb3J5L3dlYWtfcHRyLmgiCiAjaW5jbHVkZSAiYmFzZS9vcHRpb25hbC5oIgogI2luY2x1ZGUgImJhc2Uvc3luY2hyb25pemF0aW9uL2xvY2suaCIKQEAgLTI2LDYgKzI3LDcgQEAKICNpbmNsdWRlICJjb2JhbHQvYXVkaW8vYXVkaW9fYnVmZmVyLmgiCiAjaW5jbHVkZSAiY29iYWx0L2F1ZGlvL2F1ZGlvX2J1ZmZlcl9zb3VyY2Vfbm9kZS5oIgogI2luY2x1ZGUgImNvYmFsdC9hdWRpby9hdWRpb19kZXN0aW5hdGlvbl9ub2RlLmgiCisjaW5jbHVkZSAiY29iYWx0L2F1ZGlvL2F1ZGlvX2hlbHBlcnMuaCIKICNpbmNsdWRlICJjb2JhbHQvZG9tL2FycmF5X2J1ZmZlci5oIgogI2luY2x1ZGUgImNvYmFsdC9kb20vZG9tX2V4Y2VwdGlvbi5oIgogI2luY2x1ZGUgImNvYmFsdC9kb20vZXZlbnRfdGFyZ2V0LmgiCkBAIC0xNjQsOSArMTY2LDggQEAKICAgc3RkOjpzdHJpbmcgR2V0RGVidWdOYW1lKCkgb3ZlcnJpZGUgeyByZXR1cm4gIkF1ZGlvQ29udGV4dCI7IH0KIAogICB2b2lkIERlY29kZUF1ZGlvRGF0YUludGVybmFsKHNjb3BlZF9wdHI8RGVjb2RlQ2FsbGJhY2tJbmZvPiBpbmZvKTsKLSAgdm9pZCBEZWNvZGVGaW5pc2goaW50IGNhbGxiYWNrX2lkLCBmbG9hdCBzYW1wbGVfcmF0ZSwgaW50MzIgbnVtYmVyX29mX2ZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgaW50MzIgbnVtYmVyX29mX2NoYW5uZWxzLCBzY29wZWRfYXJyYXk8dWludDg+IGNoYW5uZWxzX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgIFNhbXBsZVR5cGUgc2FtcGxlX3R5cGUpOworICB2b2lkIERlY29kZUZpbmlzaChpbnQgY2FsbGJhY2tfaWQsIGZsb2F0IHNhbXBsZV9yYXRlLAorICAgICAgICAgICAgICAgICAgICBzY29wZWRfcHRyPFNoZWxsQXVkaW9CdXM+IGF1ZGlvX2J1cyk7CiAKICAgYmFzZTo6V2Vha1B0ckZhY3Rvcnk8QXVkaW9Db250ZXh0PiB3ZWFrX3B0cl9mYWN0b3J5XzsKICAgLy8gV2UgY29uc3RydWN0IGEgV2Vha1B0ciB1cG9uIEF1ZGlvQ29udGV4dCdzIGNvbnN0cnVjdGlvbiBpbiBvcmRlciB0bwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19kZXN0aW5hdGlvbl9ub2RlLmNjIGIvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19kZXN0aW5hdGlvbl9ub2RlLmNjCmluZGV4IDc4ZDQxNGYuLmE5MzA4YzQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fZGVzdGluYXRpb25fbm9kZS5jYworKysgYi9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2Rlc3RpbmF0aW9uX25vZGUuY2MKQEAgLTMzLDcgKzMzLDkgQEAKIC8vIG51bWJlck9mSW5wdXRzICA6IDEKIC8vIG51bWJlck9mT3V0cHV0cyA6IDAKIEF1ZGlvRGVzdGluYXRpb25Ob2RlOjpBdWRpb0Rlc3RpbmF0aW9uTm9kZShBdWRpb0NvbnRleHQqIGNvbnRleHQpCi0gICAgOiBBdWRpb05vZGUoY29udGV4dCksIG1heF9jaGFubmVsX2NvdW50XyhrTWF4Q2hhbm5lbENvdW50KSB7CisgICAgOiBBdWRpb05vZGUoY29udGV4dCksCisgICAgICBtZXNzYWdlX2xvb3BfKE1lc3NhZ2VMb29wOjpjdXJyZW50KCkpLAorICAgICAgbWF4X2NoYW5uZWxfY291bnRfKGtNYXhDaGFubmVsQ291bnQpIHsKICAgQXVkaW9Mb2NrOjpBdXRvTG9jayBsb2NrKGF1ZGlvX2xvY2soKSk7CiAKICAgQWRkSW5wdXQobmV3IEF1ZGlvTm9kZUlucHV0KHRoaXMpKTsKQEAgLTU3LDE2ICs1OSwzMSBAQAogICAgIGF1ZGlvX2RldmljZV8ucmVzZXQoCiAgICAgICAgIG5ldyBBdWRpb0RldmljZShzdGF0aWNfY2FzdDxpbnQ+KGNoYW5uZWxfY291bnQoTlVMTCkpLCB0aGlzKSk7CiAgIH0KKyAgYXVkaW9fZGV2aWNlX3RvX2RlbGV0ZV8gPSBOVUxMOwogfQogCi12b2lkIEF1ZGlvRGVzdGluYXRpb25Ob2RlOjpGaWxsQXVkaW9CdXMoU2hlbGxBdWRpb0J1cyogYXVkaW9fYnVzLAordm9pZCBBdWRpb0Rlc3RpbmF0aW9uTm9kZTo6RmlsbEF1ZGlvQnVzKGJvb2wgYWxsX2NvbnN1bWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNoZWxsQXVkaW9CdXMqIGF1ZGlvX2J1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBzaWxlbmNlKSB7Ci0gIC8vIFRoaXMgaXMgY2FsbGVkIGJ5IEF1ZGlvIHRocmVhZC4KKyAgLy8gVGhpcyBpcyBjYWxsZWQgb24gQXVkaW8gdGhyZWFkLgogICBBdWRpb0xvY2s6OkF1dG9Mb2NrIGxvY2soYXVkaW9fbG9jaygpKTsKIAogICAvLyBEZXN0aW5hdGlvbiBub2RlIG9ubHkgaGFzIG9uZSBpbnB1dC4KICAgRENIRUNLX0VRKG51bWJlcl9vZl9pbnB1dHMoKSwgMXUpOwotICBJbnB1dCgwKS0+RmlsbEF1ZGlvQnVzKGF1ZGlvX2J1cywgc2lsZW5jZSk7CisgIGJvb2wgYWxsX2ZpbmlzaGVkID0gdHJ1ZTsKKyAgSW5wdXQoMCktPkZpbGxBdWRpb0J1cyhhdWRpb19idXMsIHNpbGVuY2UsICZhbGxfZmluaXNoZWQpOworICBpZiAoYWxsX2NvbnN1bWVkICYmIGFsbF9maW5pc2hlZCkgeworICAgIGF1ZGlvX2RldmljZV90b19kZWxldGVfID0gYXVkaW9fZGV2aWNlXy5nZXQoKTsKKyAgICBtZXNzYWdlX2xvb3BfLT5Qb3N0VGFzaygKKyAgICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZBdWRpb0Rlc3RpbmF0aW9uTm9kZTo6RGVzdHJveUF1ZGlvRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOworICB9Cit9CisKK3ZvaWQgQXVkaW9EZXN0aW5hdGlvbk5vZGU6OkRlc3Ryb3lBdWRpb0RldmljZSgpIHsKKyAgaWYgKGF1ZGlvX2RldmljZV8gPT0gYXVkaW9fZGV2aWNlX3RvX2RlbGV0ZV8pIHsKKyAgICBhdWRpb19kZXZpY2VfLnJlc2V0KCk7CisgIH0KIH0KIAogfSAgLy8gbmFtZXNwYWNlIGF1ZGlvCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2Rlc3RpbmF0aW9uX25vZGUuaCBiL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fZGVzdGluYXRpb25fbm9kZS5oCmluZGV4IGVhZmViZWYuLmJjMzZhZmMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fZGVzdGluYXRpb25fbm9kZS5oCisrKyBiL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fZGVzdGluYXRpb25fbm9kZS5oCkBAIC0xNyw2ICsxNyw3IEBACiAKICNpbmNsdWRlIDx2ZWN0b3I+CiAKKyNpbmNsdWRlICJiYXNlL21lc3NhZ2VfbG9vcC5oIgogI2luY2x1ZGUgImNvYmFsdC9hdWRpby9hdWRpb19kZXZpY2UuaCIKICNpbmNsdWRlICJjb2JhbHQvYXVkaW8vYXVkaW9faGVscGVycy5oIgogI2luY2x1ZGUgImNvYmFsdC9hdWRpby9hdWRpb19ub2RlLmgiCkBAIC01NSwxNCArNTYsMTYgQEAKIAogICAvLyBGcm9tIEF1ZGlvTm9kZS4KICAgdm9pZCBPbklucHV0Tm9kZUNvbm5lY3RlZCgpIG92ZXJyaWRlOwotICBzY29wZWRfcHRyPFNoZWxsQXVkaW9CdXM+IFBhc3NBdWRpb0J1c0Zyb21Tb3VyY2UoaW50MzIgLypudW1iZXJfb2ZfZnJhbWVzKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVUeXBlKSBvdmVycmlkZSB7CisgIHNjb3BlZF9wdHI8U2hlbGxBdWRpb0J1cz4gUGFzc0F1ZGlvQnVzRnJvbVNvdXJjZSgKKyAgICAgIGludDMyIC8qbnVtYmVyX29mX2ZyYW1lcyovLCBTYW1wbGVUeXBlIC8qc2FtcGxlX3R5cGUqLywKKyAgICAgIGJvb2wqIC8qZmluaXNoZWQqLykgb3ZlcnJpZGUgewogICAgIE5PVFJFQUNIRUQoKTsKICAgICByZXR1cm4gc2NvcGVkX3B0cjxTaGVsbEF1ZGlvQnVzPigpOwogICB9CiAKICAgLy8gRnJvbSBBdWRpb0RldmljZTo6UmVuZGVyQ2FsbGJhY2suCi0gIHZvaWQgRmlsbEF1ZGlvQnVzKFNoZWxsQXVkaW9CdXMqIGF1ZGlvX2J1cywgYm9vbCogc2lsZW5jZSkgb3ZlcnJpZGU7CisgIHZvaWQgRmlsbEF1ZGlvQnVzKGJvb2wgYWxsX2NvbnN1bWVkLCBTaGVsbEF1ZGlvQnVzKiBhdWRpb19idXMsCisgICAgICAgICAgICAgICAgICAgIGJvb2wqIHNpbGVuY2UpIG92ZXJyaWRlOwogCiAgIERFRklORV9XUkFQUEFCTEVfVFlQRShBdWRpb0Rlc3RpbmF0aW9uTm9kZSk7CiAKQEAgLTcwLDkgKzczLDEzIEBACiAgIH5BdWRpb0Rlc3RpbmF0aW9uTm9kZSgpIG92ZXJyaWRlOwogCiAgcHJpdmF0ZToKKyAgdm9pZCBEZXN0cm95QXVkaW9EZXZpY2UoKTsKKworICBNZXNzYWdlTG9vcCogbWVzc2FnZV9sb29wXzsKICAgdWludDMyIG1heF9jaGFubmVsX2NvdW50XzsKIAogICBzY29wZWRfcHRyPEF1ZGlvRGV2aWNlPiBhdWRpb19kZXZpY2VfOworICBBdWRpb0RldmljZSogYXVkaW9fZGV2aWNlX3RvX2RlbGV0ZV8gPSBOVUxMOwogCiAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihBdWRpb0Rlc3RpbmF0aW9uTm9kZSk7CiB9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19kZXZpY2UuY2MgYi9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2RldmljZS5jYwppbmRleCA4NDA0YTJlLi41YmU3ZTY0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2RldmljZS5jYworKysgYi9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2RldmljZS5jYwpAQCAtNTEsNiArNTEsMTQgQEAKIAogI2lmIGRlZmluZWQoU0JfVVNFX1NCX0FVRElPX1NJTkspCiAKK25hbWVzcGFjZSB7CisvLyBXcml0ZSB8a1RhaWxTaXplSW5GcmFtZXN8IGZyYW1lcyBvZiBzaWxlbmNlIGF0IHRoZSBlbmQgb2YgcGxheWJhY2sgdG8gZW5zdXJlCisvLyB0aGUgYXVkaWJsZSBmcmFtZXMgYmVpbmcgcGxheWVkIG9uIHBsYXRmb3JtcyB3aXRoIHN0cmljdCB1bmRlcmZsb3cgY29udHJvbC4KKy8vIEluY3JlYXNpbmcgdGhpcyB2YWx1ZSB3aWxsIGFsc28gaW5jcmVhc2UgdGhlIHNpbGVuY2UgYmV0d2VlbiB0d28gc291bmRzLiAgU28KKy8vIGl0IHNob3VsZG4ndCBiZSBzZXQgdG8gYSB2ZXJ5IHRvbyBsYXJnZS4KK2NvbnN0IGludCBrVGFpbFNpemVJbkZyYW1lcyA9IGtSZW5kZXJCdWZmZXJTaXplRnJhbWVzICogODsKK30gIC8vIG5hbWVzcGFjZQorCiBjbGFzcyBBdWRpb0RldmljZTo6SW1wbCB7CiAgcHVibGljOgogICBJbXBsKGludCBudW1iZXJfb2ZfY2hhbm5lbHMsIFJlbmRlckNhbGxiYWNrKiBjYWxsYmFjayk7CkBAIC04NywxMiArOTUsMTQgQEAKICAgc2NvcGVkX2FycmF5PHVpbnQ4PiBvdXRwdXRfZnJhbWVfYnVmZmVyXzsKIAogICB2b2lkKiBmcmFtZV9idWZmZXJzX1sxXTsKLSAgaW50NjQgZnJhbWVzX3JlbmRlcmVkXzsgIC8vIEZyYW1lcyByZXRyaWV2ZWQgZnJvbSB8cmVuZGVyX2NhbGxiYWNrX3wuCi0gIGludDY0IGZyYW1lc19jb25zdW1lZF87ICAvLyBBY2N1bXVsYXRlZCBmcmFtZXMgY29uc3VtZWQgcmVwb3J0ZWQgYnkgdGhlIHNpbmsuCisgIGludDY0IGZyYW1lc19yZW5kZXJlZF8gPSAwOyAgLy8gRnJhbWVzIHJldHJpZXZlZCBmcm9tIHxyZW5kZXJfY2FsbGJhY2tffC4KKyAgaW50NjQgZnJhbWVzX2NvbnN1bWVkXyA9IDA7ICAvLyBBY2N1bXVsYXRlZCBmcmFtZXMgY29uc3VtZWQgYnkgdGhlIHNpbmsuCisgIGludDY0IHNpbGVuY2Vfd3JpdHRlbl8gPSAwOyAgLy8gU2lsZW5jZSBmcmFtZXMgd3JpdHRlbiBhZnRlciBhbGwgbm9kZXMgYXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluaXNoZWQuCiAKLSAgYm9vbCB3YXNfc2lsZW5jZV9sYXN0X3VwZGF0ZV87CisgIGJvb2wgd2FzX3NpbGVuY2VfbGFzdF91cGRhdGVfID0gZmFsc2U7CiAKLSAgU2JBdWRpb1NpbmsgYXVkaW9fc2lua187CisgIFNiQXVkaW9TaW5rIGF1ZGlvX3NpbmtfID0ga1NiQXVkaW9TaW5rSW52YWxpZDsKIAogICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oSW1wbCk7CiB9OwpAQCAtMTA3LDExICsxMTcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICBHZXRQcmVmZXJyZWRPdXRwdXRTYW1wbGVUeXBlKCksIFNoZWxsQXVkaW9CdXM6OmtQbGFuYXIpLAogICAgICAgb3V0cHV0X2ZyYW1lX2J1ZmZlcl8oCiAgICAgICAgICAgbmV3IHVpbnQ4W2tGcmFtZXNQZXJDaGFubmVsICogbnVtYmVyX29mX2NoYW5uZWxzXyAqCi0gICAgICAgICAgICAgICAgICAgIEdldFN0YXJib2FyZFNhbXBsZVR5cGVTaXplKG91dHB1dF9zYW1wbGVfdHlwZV8pXSksCi0gICAgICBmcmFtZXNfcmVuZGVyZWRfKDApLAotICAgICAgZnJhbWVzX2NvbnN1bWVkXygwKSwKLSAgICAgIHdhc19zaWxlbmNlX2xhc3RfdXBkYXRlXyhmYWxzZSksCi0gICAgICBhdWRpb19zaW5rXyhrU2JBdWRpb1NpbmtJbnZhbGlkKSB7CisgICAgICAgICAgICAgICAgICAgIEdldFN0YXJib2FyZFNhbXBsZVR5cGVTaXplKG91dHB1dF9zYW1wbGVfdHlwZV8pXSkgewogICBEQ0hFQ0sobnVtYmVyX29mX2NoYW5uZWxzXyA9PSAxIHx8IG51bWJlcl9vZl9jaGFubmVsc18gPT0gMikKICAgICAgIDw8ICJJbnZhbGlkIG51bWJlciBvZiBjaGFubmVsczogIiA8PCBudW1iZXJfb2ZfY2hhbm5lbHNfOwogICBEQ0hFQ0socmVuZGVyX2NhbGxiYWNrXyk7CkBAIC0xODksMTEgKzE5NSwyMSBAQAogICAgIH0KIAogICAgIGJvb2wgc2lsZW5jZSA9IHRydWU7CisgICAgYm9vbCBhbGxfY29uc3VtZWQgPQorICAgICAgICBzaWxlbmNlX3dyaXR0ZW5fICE9IDAgJiYgKmZyYW1lc19pbl9idWZmZXIgPD0gc2lsZW5jZV93cml0dGVuXzsKIAotICAgIC8vIEZpbGwgb3VyIHRlbXBvcmFyeSBidWZmZXIgd2l0aCBwbGFuYXIgUENNIGZsb2F0IHNhbXBsZXMuCi0gICAgcmVuZGVyX2NhbGxiYWNrXy0+RmlsbEF1ZGlvQnVzKCZpbnB1dF9hdWRpb19idXNfLCAmc2lsZW5jZSk7CisgICAgcmVuZGVyX2NhbGxiYWNrXy0+RmlsbEF1ZGlvQnVzKGFsbF9jb25zdW1lZCwgJmlucHV0X2F1ZGlvX2J1c18sICZzaWxlbmNlKTsKIAotICAgIGlmICghc2lsZW5jZSkgeworICAgIGJvb2wgZmlsbF9vdXRwdXQgPSB0cnVlOworICAgIGlmIChzaWxlbmNlKSB7CisgICAgICBmaWxsX291dHB1dCA9IGtUYWlsU2l6ZUluRnJhbWVzID4gc2lsZW5jZV93cml0dGVuXzsKKyAgICAgIHNpbGVuY2Vfd3JpdHRlbl8gKz0ga1JlbmRlckJ1ZmZlclNpemVGcmFtZXM7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFJlc2V0IHxzaWxlbmNlX3dyaXR0ZW5ffCBpZiBhIG5ldyBzb3VuZCBpcyBwbGF5ZWQgYWZ0ZXIgc29tZSBzaWxlbmNlCisgICAgICAvLyBmcmFtZXMgd2VyZSBpbmplY3RlZC4KKyAgICAgIHNpbGVuY2Vfd3JpdHRlbl8gPSAwOworICAgIH0KKyAgICBpZiAoZmlsbF9vdXRwdXQpIHsKICAgICAgIEZpbGxPdXRwdXRBdWRpb0J1cygpOwogCiAgICAgICBmcmFtZXNfcmVuZGVyZWRfICs9IGtSZW5kZXJCdWZmZXJTaXplRnJhbWVzOwpAQCAtMzU3LDggKzM3Myw5IEBACiAKICAgaWYgKChrRnJhbWVzUGVyQ2hhbm5lbCAtICp0b3RhbF9mcmFtZXMpID49IGtSZW5kZXJCdWZmZXJTaXplRnJhbWVzKSB7CiAgICAgLy8gRmlsbCBvdXIgdGVtcG9yYXJ5IGJ1ZmZlciB3aXRoIFBDTSBmbG9hdCBzYW1wbGVzLgorICAgIGJvb2wgYWxsX2NvbnN1bWVkID0gZmFsc2U7ICAvLyBLZWVwIHRoZSBzaW5rIGFsaXZlIG9uIGxlZ2FjeSBwbGF0Zm9ybXMuCiAgICAgYm9vbCBzaWxlbmNlID0gdHJ1ZTsKLSAgICByZW5kZXJfY2FsbGJhY2tfLT5GaWxsQXVkaW9CdXMoJmF1ZGlvX2J1c18sICZzaWxlbmNlKTsKKyAgICByZW5kZXJfY2FsbGJhY2tfLT5GaWxsQXVkaW9CdXMoYWxsX2NvbnN1bWVkLCAmYXVkaW9fYnVzXywgJnNpbGVuY2UpOwogCiAgICAgaWYgKCFzaWxlbmNlKSB7CiAgICAgICBGaWxsT3V0cHV0QXVkaW9CdXMoKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fZGV2aWNlLmggYi9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2RldmljZS5oCmluZGV4IGRkNWY4OTguLjdlMjI3YWIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fZGV2aWNlLmgKKysrIGIvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19kZXZpY2UuaApAQCAtMzgsMTEgKzM4LDE2IEBACiAgICAgdHlwZWRlZiA6Om1lZGlhOjpTaGVsbEF1ZGlvQnVzIFNoZWxsQXVkaW9CdXM7CiAjZW5kaWYgIC8vIGRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQogCisgICAgLy8gfGFsbF9jb25zdW1lZHwgd2lsbCBiZSBzZXQgdG8gdHJ1ZSBpZiBhbGwgYXVkaW8gZnJhbWVzIGhhcyBiZWVuIGNvbnN1bWVkLgorICAgIC8vIFRoaXMgZ2l2ZXMgdGhlIEF1ZGlvRGVzdGluYXRpb25Ob2RlIGEgY2hhbmNlIHRvIGRlY2lkZSBpZiB0aGUgQXVkaW9EZXZpY2UKKyAgICAvLyBzaG91bGQgYmUga2lsbGVkLgorICAgIC8vIHxhdWRpb19idWZmZXJ8IGNvbnRhaW5zIHRoZSBhdWRpbyBmcmFtZXMgdG8gYmUgbWl4ZWQgd2l0aCBpbnB1dCBhdWRpbyBpZgorICAgIC8vIHRoZXJlIGlzIGFueS4KICAgICAvLyB8c2lsZW5jZXwgd2lsbCBiZSBzZXQgdG8gdHJ1ZSBiZWZvcmUgY2FsbGluZyBpZiB8YXVkaW9fYnVmZmVyfCBjb250YWlucwotICAgIC8vIG9ubHkgc2lsZW5jZSBzYW1wbGVzLCBpdCB3aWxsIGJlIHNldCB0byB8ZmFsc2V8IG90aGVyd2lzZS4gIE9uIHJldHVybgotICAgIC8vIEZpbGxBdWRpb0J1cygpIHdpbGwgc2V0IHxzaWxlbmNlfCB0byB8ZmFsc2V8IGlmIGl0IGhhcyBtb2RpZmllZAotICAgIC8vIHxhdWRpb19idWZmZXJ8LgotICAgIHZpcnR1YWwgdm9pZCBGaWxsQXVkaW9CdXMoU2hlbGxBdWRpb0J1cyogYXVkaW9fYnVmZmVyLCBib29sKiBzaWxlbmNlKSA9IDA7CisgICAgLy8gb25seSBzaWxlbmNlIHNhbXBsZXMsIGl0IHdpbGwgYmUgc2V0IHRvIHxmYWxzZXwgb3RoZXJ3aXNlLiAgSXQgd2lsbCBiZQorICAgIC8vIHNldCB0byBmYWxzZSBvbiByZXR1cm4gaWYgfGF1ZGlvX2J1ZmZlcnwgaGFzIGJlZW4gbW9kaWZpZWQuCisgICAgdmlydHVhbCB2b2lkIEZpbGxBdWRpb0J1cyhib29sIGFsbF9jb25zdW1lZCwgU2hlbGxBdWRpb0J1cyogYXVkaW9fYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogc2lsZW5jZSkgPSAwOwogCiAgICBwcm90ZWN0ZWQ6CiAgICAgflJlbmRlckNhbGxiYWNrKCkge30KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fZmlsZV9yZWFkZXIuaCBiL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fZmlsZV9yZWFkZXIuaAppbmRleCBiN2M5NWNhLi5iNzcyMWRhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2ZpbGVfcmVhZGVyLmgKKysrIGIvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19maWxlX3JlYWRlci5oCkBAIC0xNSw4ICsxNSw3IEBACiAjaWZuZGVmIENPQkFMVF9BVURJT19BVURJT19GSUxFX1JFQURFUl9IXwogI2RlZmluZSBDT0JBTFRfQVVESU9fQVVESU9fRklMRV9SRUFERVJfSF8KIAotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIgIC8vIEZvciBzY29wZWRfYXJyYXkKLQorI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKICNpbmNsdWRlICJjb2JhbHQvYXVkaW8vYXVkaW9faGVscGVycy5oIgogCiBuYW1lc3BhY2UgY29iYWx0IHsKQEAgLTI5LDE0ICsyOCwxMiBAQAogICBzdGF0aWMgc2NvcGVkX3B0cjxBdWRpb0ZpbGVSZWFkZXI+IFRyeUNyZWF0ZShjb25zdCB1aW50OCogZGF0YSwgc2l6ZV90IHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZVR5cGUgc2FtcGxlX3R5cGUpOwogCi0gIC8vIFJldHVybnMgdGhlIHNhbXBsZSBkYXRhIHN0b3JlZCBhcyBmbG9hdCBzYW1wbGUgaW4gcGxhbmFyIGZvcm0uICBOb3RlIHRoYXQKLSAgLy8gdGhpcyBmdW5jdGlvbiB0cmFuc2ZlcnMgdGhlIG93bmVyc2hpcCBvZiB0aGUgZGF0YSB0byB0aGUgY2FsbGVyIHNvIGl0IGNhbgotICAvLyBvbmx5IGJlIGNhbGxlZCBvbmNlLgotICB2aXJ0dWFsIHNjb3BlZF9hcnJheTx1aW50OD4gc2FtcGxlX2RhdGEoKSA9IDA7CiAgIHZpcnR1YWwgZmxvYXQgc2FtcGxlX3JhdGUoKSBjb25zdCA9IDA7CiAgIHZpcnR1YWwgaW50MzIgbnVtYmVyX29mX2ZyYW1lcygpIGNvbnN0ID0gMDsKICAgdmlydHVhbCBpbnQzMiBudW1iZXJfb2ZfY2hhbm5lbHMoKSBjb25zdCA9IDA7CiAgIHZpcnR1YWwgU2FtcGxlVHlwZSBzYW1wbGVfdHlwZSgpIGNvbnN0ID0gMDsKKworICB2aXJ0dWFsIHNjb3BlZF9wdHI8U2hlbGxBdWRpb0J1cz4gUmVzZXRBbmRSZXR1cm5BdWRpb0J1cygpID0gMDsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBhdWRpbwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19maWxlX3JlYWRlcl93YXYuY2MgYi9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2ZpbGVfcmVhZGVyX3dhdi5jYwppbmRleCA5YmU0YzExLi4zY2JkNDdjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2ZpbGVfcmVhZGVyX3dhdi5jYworKysgYi9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2ZpbGVfcmVhZGVyX3dhdi5jYwpAQCAtMjEsNiArMjEsNyBAQAogI2Vsc2UgIC8vIGRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQogI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZW5kaWFuX3V0aWwuaCIKICNlbmRpZiAgLy8gZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCisjaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgogCiBuYW1lc3BhY2UgY29iYWx0IHsKIG5hbWVzcGFjZSBhdWRpbyB7CkBAIC0xMDUsNyArMTA2LDcgQEAKIAogdm9pZCBBdWRpb0ZpbGVSZWFkZXJXQVY6OlBhcnNlQ2h1bmtzKGNvbnN0IHVpbnQ4KiBkYXRhLCBzaXplX3Qgc2l6ZSkgewogICB1aW50MzIgb2Zmc2V0ID0ga1dBVlJJRkZDaHVua0hlYWRlclNpemU7Ci0gIGJvb2wgaXNfc2FtcGxlX2luX2Zsb2F0ID0gZmFsc2U7CisgIGJvb2wgaXNfc3JjX3NhbXBsZV9pbl9mbG9hdCA9IGZhbHNlOwogICAvLyBJZiB0aGUgV0FWIGZpbGUgaXMgUENNIGZvcm1hdCwgaXQgaGFzIHR3byBzdWItY2h1bmtzOiBmaXJzdCBvbmUgaXMgImZtdCIKICAgLy8gYW5kIHRoZSBzZWNvbmQgb25lIGlzICJkYXRhIi4KICAgLy8gVE9ETzogc3VwcG9ydCB0aGUgY2FzZXMgdGhhdCB0aGUgV0FWIGZpbGUgaXMgbm9uLVBDTSBmb3JtYXQgYW5kIHRoZQpAQCAtMTI0LDEyICsxMjUsMTIgQEAKICAgICB9CiAKICAgICBpZiAoY2h1bmtfaWQgPT0ga1dBVkNodW5rSURfZm10ICYmIGkgPT0gMCkgewotICAgICAgaWYgKCFQYXJzZVdBVl9mbXQoZGF0YSwgb2Zmc2V0LCBjaHVua19zaXplLCAmaXNfc2FtcGxlX2luX2Zsb2F0KSkgeworICAgICAgaWYgKCFQYXJzZVdBVl9mbXQoZGF0YSwgb2Zmc2V0LCBjaHVua19zaXplLCAmaXNfc3JjX3NhbXBsZV9pbl9mbG9hdCkpIHsKICAgICAgICAgRExPRyhXQVJOSU5HKSA8PCAiUGFyc2UgZm10IGNodW5rIGZhaWxlZC4iOwogICAgICAgICBicmVhazsKICAgICAgIH0KICAgICB9IGVsc2UgaWYgKGNodW5rX2lkID09IGtXQVZDaHVua0lEX2RhdGEgJiYgaSA9PSAxKSB7Ci0gICAgICBpZiAoIVBhcnNlV0FWX2RhdGEoZGF0YSwgb2Zmc2V0LCBjaHVua19zaXplLCBpc19zYW1wbGVfaW5fZmxvYXQpKSB7CisgICAgICBpZiAoIVBhcnNlV0FWX2RhdGEoZGF0YSwgb2Zmc2V0LCBjaHVua19zaXplLCBpc19zcmNfc2FtcGxlX2luX2Zsb2F0KSkgewogICAgICAgICBETE9HKFdBUk5JTkcpIDw8ICJQYXJzZSBkYXRhIGNodW5rIGZhaWxlZC4iOwogICAgICAgICBicmVhazsKICAgICAgIH0KQEAgLTE0Myw3ICsxNDQsMTAgQEAKIH0KIAogYm9vbCBBdWRpb0ZpbGVSZWFkZXJXQVY6OlBhcnNlV0FWX2ZtdChjb25zdCB1aW50OCogZGF0YSwgc2l6ZV90IG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsIGJvb2wqIGlzX3NhbXBsZV9pbl9mbG9hdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogaXNfc3JjX3NhbXBsZV9pbl9mbG9hdCkgeworICBEQ0hFQ0soaXNfc3JjX3NhbXBsZV9pbl9mbG9hdCk7CisKICAgLy8gQ2hlY2sgc2l6ZSBmb3IgY29tcGxldGUgaGVhZGVyLgogICBpZiAoc2l6ZSA8IGtXQVZmbXRDaHVua0hlYWRlclNpemUpIHsKICAgICByZXR1cm4gZmFsc2U7CkBAIC0xNTcsNyArMTYxLDcgQEAKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIAotICAqaXNfc2FtcGxlX2luX2Zsb2F0ID0gZm9ybWF0X2NvZGUgPT0ga1dBVkZvcm1hdENvZGVGbG9hdDsKKyAgKmlzX3NyY19zYW1wbGVfaW5fZmxvYXQgPSBmb3JtYXRfY29kZSA9PSBrV0FWRm9ybWF0Q29kZUZsb2F0OwogCiAgIC8vIExvYWQgY2hhbm5lbCBjb3VudC4KICAgbnVtYmVyX29mX2NoYW5uZWxzXyA9IGxvYWRfdWludDE2X2xpdHRsZV9lbmRpYW4oZGF0YSArIG9mZnNldCArIDIpOwpAQCAtMTc2LDggKzE4MCw4IEBACiAKICAgLy8gQ2hlY2sgc2FtcGxlIHNpemUsIHdlIG9ubHkgc3VwcG9ydCAzMiBiaXQgZmxvYXRzIG9yIDE2IGJpdCBQQ00uCiAgIHVpbnQxNiBiaXRzX3Blcl9zYW1wbGUgPSBsb2FkX3VpbnQxNl9saXR0bGVfZW5kaWFuKGRhdGEgKyBvZmZzZXQgKyAxNCk7Ci0gIGlmICgoKmlzX3NhbXBsZV9pbl9mbG9hdCAmJiBiaXRzX3Blcl9zYW1wbGUgIT0gMzIpIHx8Ci0gICAgICAoISppc19zYW1wbGVfaW5fZmxvYXQgJiYgYml0c19wZXJfc2FtcGxlICE9IDE2KSkgeworICBpZiAoKCppc19zcmNfc2FtcGxlX2luX2Zsb2F0ICYmIGJpdHNfcGVyX3NhbXBsZSAhPSAzMikgfHwKKyAgICAgICghKmlzX3NyY19zYW1wbGVfaW5fZmxvYXQgJiYgYml0c19wZXJfc2FtcGxlICE9IDE2KSkgewogICAgIERMT0coRVJST1IpIDw8ICJCYWQgYml0cyBwZXIgc2FtcGxlIG9uIFdBVi4gIgogICAgICAgICAgICAgICAgIDw8ICJCaXRzIHBlciBzYW1wbGU6ICIgPDwgYml0c19wZXJfc2FtcGxlOwogICAgIHJldHVybiBmYWxzZTsKQEAgLTE4Nyw1NyArMTkxLDkyIEBACiB9CiAKIGJvb2wgQXVkaW9GaWxlUmVhZGVyV0FWOjpQYXJzZVdBVl9kYXRhKGNvbnN0IHVpbnQ4KiBkYXRhLCBzaXplX3Qgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsIGJvb2wgaXNfc2FtcGxlX2luX2Zsb2F0KSB7Ci0gIGNvbnN0IHVpbnQ4KiBkYXRhX3NhbXBsZXMgPSBkYXRhICsgb2Zmc2V0OwotCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfc3JjX3NhbXBsZV9pbl9mbG9hdCkgewogICAvLyBTZXQgbnVtYmVyIG9mIGZyYW1lcyBiYXNlZCBvbiBzaXplIG9mIGRhdGEgY2h1bmsuCi0gIGNvbnN0IGludDMyIGJ5dGVzX3Blcl9zcmNfc2FtcGxlID0KLSAgICAgIHN0YXRpY19jYXN0PGludDMyPihpc19zYW1wbGVfaW5fZmxvYXQgPyBzaXplb2YoZmxvYXQpIDogc2l6ZW9mKGludDE2KSk7CisgIGNvbnN0IGludDMyIGJ5dGVzX3Blcl9zcmNfc2FtcGxlID0gc3RhdGljX2Nhc3Q8aW50MzI+KAorICAgICAgaXNfc3JjX3NhbXBsZV9pbl9mbG9hdCA/IHNpemVvZihmbG9hdCkgOiBzaXplb2YoaW50MTYpKTsKICAgbnVtYmVyX29mX2ZyYW1lc18gPQogICAgICAgc3RhdGljX2Nhc3Q8aW50MzI+KHNpemUgLyAoYnl0ZXNfcGVyX3NyY19zYW1wbGUgKiBudW1iZXJfb2ZfY2hhbm5lbHNfKSk7Ci0gIGNvbnN0IGludDMyIGJ5dGVzX3Blcl9kZXN0X3NhbXBsZSA9Ci0gICAgICBzdGF0aWNfY2FzdDxpbnQzMj4oR2V0U2FtcGxlVHlwZVNpemUoc2FtcGxlX3R5cGVfKSk7Ci0gIGNvbnN0IGJvb2wgaXNfZGVzdF9mbG9hdCA9IHNhbXBsZV90eXBlXyA9PSBrU2FtcGxlVHlwZUZsb2F0MzI7CiAKICAgLy8gV2Ugc3RvcmUgYXVkaW8gc2FtcGxlcyBpbiB0aGUgY3VycmVudCBwbGF0Zm9ybSdzIHByZWZlcnJlZCBmb3JtYXQuCi0gIHNhbXBsZV9kYXRhXy5yZXNldChuZXcgdWludDhbc3RhdGljX2Nhc3Q8c2l6ZV90PigKLSAgICAgIG51bWJlcl9vZl9mcmFtZXNfICogbnVtYmVyX29mX2NoYW5uZWxzXyAqIGJ5dGVzX3Blcl9kZXN0X3NhbXBsZSldKTsKKyAgYXVkaW9fYnVzXy5yZXNldChuZXcgU2hlbGxBdWRpb0J1cyhudW1iZXJfb2ZfY2hhbm5lbHNfLCBudW1iZXJfb2ZfZnJhbWVzXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVfdHlwZV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hlbGxBdWRpb0J1czo6a0ludGVybGVhdmVkKSk7CiAKLSAgLy8gSGVyZSB3ZSBoYW5kbGUgYWxsIDQgcG9zc2libGUgY29udmVyc2lvbiBjYXNlcy4gIEFsc28gbm90ZSB0aGF0IHRoZQotICAvLyBzb3VyY2UgZGF0YSBpcyBzdG9yZWQgaW50ZXJsZWF2ZWQsIGFuZCB0aGF0IG5lZWQgdG8gY29udmVydCBpdCB0byBwbGFuYXIuCi0gIHVpbnQ4KiBkZXN0X3NhbXBsZSA9IHNhbXBsZV9kYXRhXy5nZXQoKTsKLSAgZm9yIChpbnQzMiBpID0gMDsgaSA8IG51bWJlcl9vZl9jaGFubmVsc187ICsraSkgewotICAgIGNvbnN0IHVpbnQ4KiBzcmNfc2FtcGxlcyA9IGRhdGFfc2FtcGxlcyArIGkgKiBieXRlc19wZXJfc3JjX3NhbXBsZTsKKy8vIEJvdGggdGhlIHNvdXJjZSBkYXRhIGFuZCB0aGUgZGVzdGluYXRpb24gZGF0YSBhcmUgc3RvcmVkIGluIGludGVybGVhdmVkLgorI2lmIFNCX0lTKExJVFRMRV9FTkRJQU4pCisgIGlmICgoIWlzX3NyY19zYW1wbGVfaW5fZmxvYXQgJiYgc2FtcGxlX3R5cGVfID09IGtTYW1wbGVUeXBlSW50MTYpIHx8CisgICAgICAoaXNfc3JjX3NhbXBsZV9pbl9mbG9hdCAmJiBzYW1wbGVfdHlwZV8gPT0ga1NhbXBsZVR5cGVGbG9hdDMyKSkgeworICAgIFNiTWVtb3J5Q29weShhdWRpb19idXNfLT5pbnRlcmxlYXZlZF9kYXRhKCksIGRhdGEgKyBvZmZzZXQsIHNpemUpOworICB9IGVsc2UgaWYgKCFpc19zcmNfc2FtcGxlX2luX2Zsb2F0ICYmIHNhbXBsZV90eXBlXyA9PSBrU2FtcGxlVHlwZUZsb2F0MzIpIHsKKyAgICAvLyBDb252ZXJ0IGZyb20gaW50MTYgdG8gZmxvYXQzMgorICAgIGNvbnN0IGludDE2KiBzcmNfc2FtcGxlcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgaW50MTYqPihkYXRhICsgb2Zmc2V0KTsKKyAgICBmbG9hdCogZGVzdF9zYW1wbGVzID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxmbG9hdCo+KGF1ZGlvX2J1c18tPmludGVybGVhdmVkX2RhdGEoKSk7CiAKLSAgICBmb3IgKGludDMyIGogPSAwOyBqIDwgbnVtYmVyX29mX2ZyYW1lc187ICsraikgewotICAgICAgaWYgKGlzX2Rlc3RfZmxvYXQpIHsKLSAgICAgICAgZmxvYXQgc2FtcGxlOwotICAgICAgICBpZiAoaXNfc2FtcGxlX2luX2Zsb2F0KSB7Ci0gICAgICAgICAgdWludDMyIHNhbXBsZV9hc191aW50MzIgPSBsb2FkX3VpbnQzMl9saXR0bGVfZW5kaWFuKHNyY19zYW1wbGVzKTsKLSAgICAgICAgICBzYW1wbGUgPSBiaXRfY2FzdDxmbG9hdD4oc2FtcGxlX2FzX3VpbnQzMik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgdWludDE2IHNhbXBsZV9wY21fdW5zaWduZWQgPSBsb2FkX3VpbnQxNl9saXR0bGVfZW5kaWFuKHNyY19zYW1wbGVzKTsKLSAgICAgICAgICBpbnQxNiBzYW1wbGVfcGNtID0gYml0X2Nhc3Q8aW50MTY+KHNhbXBsZV9wY21fdW5zaWduZWQpOwotICAgICAgICAgIHNhbXBsZSA9IENvbnZlcnRTYW1wbGU8aW50MTYsIGZsb2F0PihzYW1wbGVfcGNtKTsKLSAgICAgICAgfQotICAgICAgICByZWludGVycHJldF9jYXN0PGZsb2F0Kj4oZGVzdF9zYW1wbGUpW2kgKiBudW1iZXJfb2ZfZnJhbWVzXyArIGpdID0KLSAgICAgICAgICAgIHNhbXBsZTsKLSAgICAgICAgc3JjX3NhbXBsZXMgKz0gYnl0ZXNfcGVyX3NyY19zYW1wbGUgKiBudW1iZXJfb2ZfY2hhbm5lbHNfOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW50MTYgc2FtcGxlOwotICAgICAgICBpZiAoaXNfc2FtcGxlX2luX2Zsb2F0KSB7Ci0gICAgICAgICAgdWludDMyIHNhbXBsZV9hc191aW50MzIgPSBsb2FkX3VpbnQzMl9saXR0bGVfZW5kaWFuKHNyY19zYW1wbGVzKTsKLSAgICAgICAgICBmbG9hdCB2YWx1ZSA9IGJpdF9jYXN0PGZsb2F0PihzYW1wbGVfYXNfdWludDMyKTsKLSAgICAgICAgICBzYW1wbGUgPSBDb252ZXJ0U2FtcGxlPGZsb2F0LCBpbnQxNj4odmFsdWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHNhbXBsZSA9IGJpdF9jYXN0PGludDE2Pihsb2FkX3VpbnQxNl9saXR0bGVfZW5kaWFuKHNyY19zYW1wbGVzKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxpbnQxNio+KGRlc3Rfc2FtcGxlKVtpICogbnVtYmVyX29mX2ZyYW1lc18gKyBqXSA9Ci0gICAgICAgICAgICBzYW1wbGU7Ci0gICAgICAgIHNyY19zYW1wbGVzICs9IGJ5dGVzX3Blcl9zcmNfc2FtcGxlICogbnVtYmVyX29mX2NoYW5uZWxzXzsKLSAgICAgIH0KKyAgICBmb3IgKGludDMyIGkgPSAwOyBpIDwgbnVtYmVyX29mX2ZyYW1lc18gKiBudW1iZXJfb2ZfY2hhbm5lbHNfOyArK2kpIHsKKyAgICAgICpkZXN0X3NhbXBsZXMgPSBDb252ZXJ0U2FtcGxlPGludDE2LCBmbG9hdD4oKnNyY19zYW1wbGVzKTsKKyAgICAgICsrc3JjX3NhbXBsZXM7CisgICAgICArK2Rlc3Rfc2FtcGxlczsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLy8gQ29udmVydCBmcm9tIGZsb2F0MzIgdG8gaW50MTYKKyAgICBjb25zdCBmbG9hdCogc3JjX3NhbXBsZXMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0Kj4oZGF0YSArIG9mZnNldCk7CisgICAgaW50MTYqIGRlc3Rfc2FtcGxlcyA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTYqPihhdWRpb19idXNfLT5pbnRlcmxlYXZlZF9kYXRhKCkpOworCisgICAgZm9yIChpbnQzMiBpID0gMDsgaSA8IG51bWJlcl9vZl9mcmFtZXNfICogbnVtYmVyX29mX2NoYW5uZWxzXzsgKytpKSB7CisgICAgICAqZGVzdF9zYW1wbGVzID0gQ29udmVydFNhbXBsZTxmbG9hdCwgaW50MTY+KCpzcmNfc2FtcGxlcyk7CisgICAgICArK3NyY19zYW1wbGVzOworICAgICAgKytkZXN0X3NhbXBsZXM7CiAgICAgfQogICB9CisjZWxzZSAgIC8vIFNCX0lTKExJVFRMRV9FTkRJQU4pCisgIGlmICghaXNfc3JjX3NhbXBsZV9pbl9mbG9hdCAmJiBzYW1wbGVfdHlwZV8gPT0ga1NhbXBsZVR5cGVJbnQxNikgeworICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zYW1wbGVzID0gZGF0YSArIG9mZnNldDsKKyAgICBpbnQxNiogZGVzdF9zYW1wbGVzID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxpbnQxNio+KGF1ZGlvX2J1c18tPmludGVybGVhdmVkX2RhdGEoKSk7CisgICAgZm9yIChpbnQzMiBpID0gMDsgaSA8IG51bWJlcl9vZl9mcmFtZXNfICogbnVtYmVyX29mX2NoYW5uZWxzXzsgKytpKSB7CisgICAgICAqZGVzdF9zYW1wbGVzID0gbG9hZF91aW50MTZfbGl0dGxlX2VuZGlhbihzcmNfc2FtcGxlcyk7CisgICAgICBzcmNfc2FtcGxlcyArPSBieXRlc19wZXJfc3JjX3NhbXBsZTsKKyAgICAgICsrZGVzdF9zYW1wbGVzOworICAgIH0KKyAgfSBlbHNlIGlmIChpc19zcmNfc2FtcGxlX2luX2Zsb2F0ICYmIHNhbXBsZV90eXBlXyA9PSBrU2FtcGxlVHlwZUZsb2F0MzIpIHsKKyAgICBjb25zdCB1aW50OF90KiBzcmNfc2FtcGxlcyA9IGRhdGEgKyBvZmZzZXQ7CisgICAgZmxvYXQqIGRlc3Rfc2FtcGxlcyA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQqPihhdWRpb19idXNfLT5pbnRlcmxlYXZlZF9kYXRhKCkpOworICAgIGZvciAoaW50MzIgaSA9IDA7IGkgPCBudW1iZXJfb2ZfZnJhbWVzXyAqIG51bWJlcl9vZl9jaGFubmVsc187ICsraSkgeworICAgICAgdWludDMyIHNhbXBsZV9hc191aW50MzIgPSBsb2FkX3VpbnQzMl9saXR0bGVfZW5kaWFuKHNyY19zYW1wbGVzKTsKKyAgICAgICpkZXN0X3NhbXBsZXMgPSBiaXRfY2FzdDxmbG9hdD4oc2FtcGxlX2FzX3VpbnQzMik7CisgICAgICBzcmNfc2FtcGxlcyArPSBieXRlc19wZXJfc3JjX3NhbXBsZTsKKyAgICAgICsrZGVzdF9zYW1wbGVzOworICAgIH0KKyAgfSBlbHNlIGlmICghaXNfc3JjX3NhbXBsZV9pbl9mbG9hdCAmJiBzYW1wbGVfdHlwZV8gPT0ga1NhbXBsZVR5cGVGbG9hdDMyKSB7CisgICAgLy8gQ29udmVydCBmcm9tIGludDE2IHRvIGZsb2F0MzIKKyAgICBjb25zdCB1aW50OF90KiBzcmNfc2FtcGxlcyA9IGRhdGEgKyBvZmZzZXQ7CisgICAgZmxvYXQqIGRlc3Rfc2FtcGxlcyA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQqPihhdWRpb19idXNfLT5pbnRlcmxlYXZlZF9kYXRhKCkpOworICAgIGZvciAoaW50MzIgaSA9IDA7IGkgPCBudW1iZXJfb2ZfZnJhbWVzXyAqIG51bWJlcl9vZl9jaGFubmVsc187ICsraSkgeworICAgICAgaW50MTYgc2FtcGxlX2FzX2ludDE2ID0gbG9hZF9pbnQxNl9saXR0bGVfZW5kaWFuKHNyY19zYW1wbGVzKTsKKyAgICAgICpkZXN0X3NhbXBsZXMgPSBDb252ZXJ0U2FtcGxlPGludDE2LCBmbG9hdD4oc2FtcGxlX2FzX2ludDE2KTsKKyAgICAgIHNyY19zYW1wbGVzICs9IGJ5dGVzX3Blcl9zcmNfc2FtcGxlOworICAgICAgKytkZXN0X3NhbXBsZXM7CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIENvbnZlcnQgZnJvbSBmbG9hdDMyIHRvIGludDE2CisgICAgY29uc3QgdWludDhfdCogc3JjX3NhbXBsZXMgPSBkYXRhICsgb2Zmc2V0OworICAgIGludDE2KiBkZXN0X3NhbXBsZXMgPQorICAgICAgICByZWludGVycHJldF9jYXN0PGludDE2Kj4oYXVkaW9fYnVzXy0+aW50ZXJsZWF2ZWRfZGF0YSgpKTsKKyAgICBmb3IgKGludDMyIGkgPSAwOyBpIDwgbnVtYmVyX29mX2ZyYW1lc18gKiBudW1iZXJfb2ZfY2hhbm5lbHNfOyArK2kpIHsKKyAgICAgIHVpbnQzMiBzYW1wbGVfYXNfdWludDMyID0gbG9hZF91aW50MzJfbGl0dGxlX2VuZGlhbihzcmNfc2FtcGxlcyk7CisgICAgICAqZGVzdF9zYW1wbGVzID0KKyAgICAgICAgICBDb252ZXJ0U2FtcGxlPGZsb2F0LCBpbnQxNj4oYml0X2Nhc3Q8ZmxvYXQ+KHNhbXBsZV9hc191aW50MzIpKTsKKyAgICAgIHNyY19zYW1wbGVzICs9IGJ5dGVzX3Blcl9zcmNfc2FtcGxlOworICAgICAgKytkZXN0X3NhbXBsZXM7CisgICAgfQorICB9CisjZW5kaWYgIC8vIFNCX0lTKExJVFRMRV9FTkRJQU4pCiAKICAgcmV0dXJuIHRydWU7CiB9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2ZpbGVfcmVhZGVyX3dhdi5oIGIvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19maWxlX3JlYWRlcl93YXYuaAppbmRleCA1YWUwZTUxLi5jZjNjZGI0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2ZpbGVfcmVhZGVyX3dhdi5oCisrKyBiL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fZmlsZV9yZWFkZXJfd2F2LmgKQEAgLTE1LDYgKzE1LDcgQEAKICNpZm5kZWYgQ09CQUxUX0FVRElPX0FVRElPX0ZJTEVfUkVBREVSX1dBVl9IXwogI2RlZmluZSBDT0JBTFRfQVVESU9fQVVESU9fRklMRV9SRUFERVJfV0FWX0hfCiAKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCiAjaW5jbHVkZSAiY29iYWx0L2F1ZGlvL2F1ZGlvX2ZpbGVfcmVhZGVyLmgiCiAjaW5jbHVkZSAiY29iYWx0L2F1ZGlvL2F1ZGlvX2hlbHBlcnMuaCIKIApAQCAtMjgsMjUgKzI5LDI4IEBACiAgIHN0YXRpYyBzY29wZWRfcHRyPEF1ZGlvRmlsZVJlYWRlcj4gVHJ5Q3JlYXRlKGNvbnN0IHVpbnQ4KiBkYXRhLCBzaXplX3Qgc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlVHlwZSBzYW1wbGVfdHlwZSk7CiAKLSAgc2NvcGVkX2FycmF5PHVpbnQ4PiBzYW1wbGVfZGF0YSgpIG92ZXJyaWRlIHsgcmV0dXJuIHNhbXBsZV9kYXRhXy5QYXNzKCk7IH0KICAgZmxvYXQgc2FtcGxlX3JhdGUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBzYW1wbGVfcmF0ZV87IH0KICAgaW50MzIgbnVtYmVyX29mX2ZyYW1lcygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG51bWJlcl9vZl9mcmFtZXNfOyB9CiAgIGludDMyIG51bWJlcl9vZl9jaGFubmVscygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG51bWJlcl9vZl9jaGFubmVsc187IH0KICAgU2FtcGxlVHlwZSBzYW1wbGVfdHlwZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHNhbXBsZV90eXBlXzsgfQogCisgIHNjb3BlZF9wdHI8U2hlbGxBdWRpb0J1cz4gUmVzZXRBbmRSZXR1cm5BdWRpb0J1cygpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gYXVkaW9fYnVzXy5QYXNzKCk7CisgIH0KKwogIHByaXZhdGU6CiAgIEF1ZGlvRmlsZVJlYWRlcldBVihjb25zdCB1aW50OCogZGF0YSwgc2l6ZV90IHNpemUsIFNhbXBsZVR5cGUgc2FtcGxlX3R5cGUpOwogCiAgIGJvb2wgUGFyc2VSSUZGSGVhZGVyKGNvbnN0IHVpbnQ4KiBkYXRhLCBzaXplX3Qgc2l6ZSk7CiAgIHZvaWQgUGFyc2VDaHVua3MoY29uc3QgdWludDgqIGRhdGEsIHNpemVfdCBzaXplKTsKICAgYm9vbCBQYXJzZVdBVl9mbXQoY29uc3QgdWludDgqIGRhdGEsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICBib29sKiBpc19zYW1wbGVfaW5fZmxvYXQpOworICAgICAgICAgICAgICAgICAgICBib29sKiBpc19zcmNfc2FtcGxlX2luX2Zsb2F0KTsKICAgYm9vbCBQYXJzZVdBVl9kYXRhKGNvbnN0IHVpbnQ4KiBkYXRhLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfc2FtcGxlX2luX2Zsb2F0KTsKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfc3JjX3NhbXBsZV9pbl9mbG9hdCk7CiAKLSAgYm9vbCBpc192YWxpZCgpIHsgcmV0dXJuIHNhbXBsZV9kYXRhXyAhPSBOVUxMOyB9CisgIGJvb2wgaXNfdmFsaWQoKSB7IHJldHVybiBhdWRpb19idXNfICE9IE5VTEw7IH0KIAotICBzY29wZWRfYXJyYXk8dWludDg+IHNhbXBsZV9kYXRhXzsKKyAgc2NvcGVkX3B0cjxTaGVsbEF1ZGlvQnVzPiBhdWRpb19idXNfOwogICBmbG9hdCBzYW1wbGVfcmF0ZV87CiAgIGludDMyIG51bWJlcl9vZl9mcmFtZXNfOwogICBpbnQzMiBudW1iZXJfb2ZfY2hhbm5lbHNfOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19oZWxwZXJzLmggYi9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2hlbHBlcnMuaAppbmRleCAyZDM2YmVjLi4yNGNlYTU0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2hlbHBlcnMuaAorKysgYi9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2hlbHBlcnMuaApAQCAtMzAsMTAgKzMwLDEyIEBACiBuYW1lc3BhY2UgYXVkaW8gewogCiAjaWYgZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCit0eXBlZGVmIG1lZGlhOjpTaGVsbEF1ZGlvQnVzIFNoZWxsQXVkaW9CdXM7CiB0eXBlZGVmIG1lZGlhOjpTaGVsbEF1ZGlvQnVzOjpTYW1wbGVUeXBlIFNhbXBsZVR5cGU7CiBjb25zdCBTYW1wbGVUeXBlIGtTYW1wbGVUeXBlSW50MTYgPSBtZWRpYTo6U2hlbGxBdWRpb0J1czo6a0ludDE2OwogY29uc3QgU2FtcGxlVHlwZSBrU2FtcGxlVHlwZUZsb2F0MzIgPSBtZWRpYTo6U2hlbGxBdWRpb0J1czo6a0Zsb2F0MzI7CiAjZWxzZSAgIC8vIGRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQordHlwZWRlZiA6Om1lZGlhOjpTaGVsbEF1ZGlvQnVzIFNoZWxsQXVkaW9CdXM7CiB0eXBlZGVmIDo6bWVkaWE6OlNoZWxsQXVkaW9CdXM6OlNhbXBsZVR5cGUgU2FtcGxlVHlwZTsKIGNvbnN0IFNhbXBsZVR5cGUga1NhbXBsZVR5cGVJbnQxNiA9IDo6bWVkaWE6OlNoZWxsQXVkaW9CdXM6OmtJbnQxNjsKIGNvbnN0IFNhbXBsZVR5cGUga1NhbXBsZVR5cGVGbG9hdDMyID0gOjptZWRpYTo6U2hlbGxBdWRpb0J1czo6a0Zsb2F0MzI7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX25vZGUuaCBiL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fbm9kZS5oCmluZGV4IDYzMDAxM2UuLmE4YzJkZDggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fbm9kZS5oCisrKyBiL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fbm9kZS5oCkBAIC0xMTIsOSArMTEyLDggQEAKICAgLy8gQ2FsbGVkIHdoZW4gYSBuZXcgaW5wdXQgbm9kZSBoYXMgYmVlbiBjb25uZWN0ZWQuCiAgIHZpcnR1YWwgdm9pZCBPbklucHV0Tm9kZUNvbm5lY3RlZCgpIHt9CiAKLSAgLy8gVE9ETzogU3VwcG9ydCB3cmFwcGluZyBTaGVsbEF1ZGlvQnVzIGludG8gYW5vdGhlciBTaGVsbEF1ZGlvQnVzLgogICB2aXJ0dWFsIHNjb3BlZF9wdHI8U2hlbGxBdWRpb0J1cz4gUGFzc0F1ZGlvQnVzRnJvbVNvdXJjZSgKLSAgICAgIGludDMyIG51bWJlcl9vZl9mcmFtZXMsIFNhbXBsZVR5cGUgc2FtcGxlX3R5cGUpID0gMDsKKyAgICAgIGludDMyIG51bWJlcl9vZl9mcmFtZXMsIFNhbXBsZVR5cGUgc2FtcGxlX3R5cGUsIGJvb2wqIGZpbmlzaGVkKSA9IDA7CiAKICAgQXVkaW9Mb2NrKiBhdWRpb19sb2NrKCkgY29uc3QgeyByZXR1cm4gYXVkaW9fbG9ja18uZ2V0KCk7IH0KIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19ub2RlX2lucHV0LmNjIGIvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19ub2RlX2lucHV0LmNjCmluZGV4IDUyOTk4NmQuLmNhYzQ4MGEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fbm9kZV9pbnB1dC5jYworKysgYi9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX25vZGVfaW5wdXQuY2MKQEAgLTIyNywxMCArMjI3LDE0IEBACiB9CiAKIHZvaWQgQXVkaW9Ob2RlSW5wdXQ6OkZpbGxBdWRpb0J1cyhTaGVsbEF1ZGlvQnVzKiBvdXRwdXRfYXVkaW9fYnVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIHNpbGVuY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBzaWxlbmNlLCBib29sKiBhbGxfZmluaXNoZWQpIHsKKyAgRENIRUNLKHNpbGVuY2UpOworICBEQ0hFQ0soYWxsX2ZpbmlzaGVkKTsKKwogICAvLyBUaGlzIGlzIGNhbGxlZCBieSBBdWRpbyB0aHJlYWQuCiAgIG93bmVyX25vZGVfLT5hdWRpb19sb2NrKCktPkFzc2VydExvY2tlZCgpOwogCisgICphbGxfZmluaXNoZWQgPSB0cnVlOwogICAvLyBUT0RPOiBDb25zaWRlciBjb21wdXRpbmcgY29tcHV0ZWROdW1iZXJPZkNoYW5uZWxzIGFuZCBkbyB1cC1taXggb3IKICAgLy8gZG93bi1taXggYmFzZSBvbiBjb21wdXRlZE51bWJlck9mQ2hhbm5lbHMuIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uCiAgIC8vIGlzIGJhc2VkIG9uIHRoZSBmYWN0IHRoYXQgdGhlIGNoYW5uZWxDb3VudE1vZGUgaXMgbWF4LgpAQCAtMjQ0LDkgKzI0OCwxMSBAQAogICAvLyBmcm9tIG9uZSBvciBtb3JlIEF1ZGlvTm9kZSBvdXRwdXRzLiBGYW4taW4gaXMgc3VwcG9ydGVkLgogICBmb3IgKHN0ZDo6c2V0PEF1ZGlvTm9kZU91dHB1dCo+OjppdGVyYXRvciBpdGVyID0gb3V0cHV0c18uYmVnaW4oKTsKICAgICAgICBpdGVyICE9IG91dHB1dHNfLmVuZCgpOyArK2l0ZXIpIHsKKyAgICBib29sIGZpbmlzaGVkID0gZmFsc2U7CiAgICAgc2NvcGVkX3B0cjxTaGVsbEF1ZGlvQnVzPiBhdWRpb19idXMgPSAoKml0ZXIpLT5QYXNzQXVkaW9CdXNGcm9tU291cmNlKAogICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMj4ob3V0cHV0X2F1ZGlvX2J1cy0+ZnJhbWVzKCkpLAotICAgICAgICBvdXRwdXRfYXVkaW9fYnVzLT5zYW1wbGVfdHlwZSgpKTsKKyAgICAgICAgb3V0cHV0X2F1ZGlvX2J1cy0+c2FtcGxlX3R5cGUoKSwgJmZpbmlzaGVkKTsKKyAgICAqYWxsX2ZpbmlzaGVkICY9IGZpbmlzaGVkOwogCiAgICAgaWYgKGF1ZGlvX2J1cykgewogICAgICAgaWYgKCpzaWxlbmNlICYmIGF1ZGlvX2J1cy0+Y2hhbm5lbHMoKSA9PSBvdXRwdXRfYXVkaW9fYnVzLT5jaGFubmVscygpKSB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX25vZGVfaW5wdXQuaCBiL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fbm9kZV9pbnB1dC5oCmluZGV4IGExODZlNjAuLjZlZDBhZjUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fbm9kZV9pbnB1dC5oCisrKyBiL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fbm9kZV9pbnB1dC5oCkBAIC01OCw3ICs1OCw4IEBACiAgIC8vIEZvciBlYWNoIGlucHV0LCBhbiBBdWRpb05vZGUgcGVyZm9ybXMgYSBtaXhpbmcgb2YgYWxsIGNvbm5lY3Rpb25zIHRvIHRoYXQKICAgLy8gaW5wdXQuIEZpbGxBdWRpb0J1cygpIHBlcmZvcm1zIHRoYXQgYWN0aW9uLiBJbiB0aGUgY2FzZSBvZiBtdWx0aXBsZQogICAvLyBjb25uZWN0aW9ucywgaXQgc3VtcyB0aGUgcmVzdWx0IGludG8gfGF1ZGlvX2J1c3wuCi0gIHZvaWQgRmlsbEF1ZGlvQnVzKFNoZWxsQXVkaW9CdXMqIGF1ZGlvX2J1cywgYm9vbCogc2lsZW5jZSk7CisgIHZvaWQgRmlsbEF1ZGlvQnVzKFNoZWxsQXVkaW9CdXMqIGF1ZGlvX2J1cywgYm9vbCogc2lsZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCogYWxsX2ZpbmlzaGVkKTsKIAogIHByaXZhdGU6CiAgIEF1ZGlvTm9kZSogY29uc3Qgb3duZXJfbm9kZV87CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX25vZGVfaW5wdXRfb3V0cHV0X3Rlc3QuY2MgYi9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX25vZGVfaW5wdXRfb3V0cHV0X3Rlc3QuY2MKaW5kZXggNjEyZWRhZi4uNmQzOTRlYiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19ub2RlX2lucHV0X291dHB1dF90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fbm9kZV9pbnB1dF9vdXRwdXRfdGVzdC5jYwpAQCAtMTcsNiArMTcsOCBAQAogI2luY2x1ZGUgImNvYmFsdC9hdWRpby9hdWRpb19oZWxwZXJzLmgiCiAjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCiAKKy8vIFRPRE86IENvbnNvbGlkYXRlIFNoZWxsQXVkaW9CdXMgY3JlYXRpb24gY29kZQorCiBuYW1lc3BhY2UgY29iYWx0IHsKIG5hbWVzcGFjZSBhdWRpbyB7CiAKQEAgLTQ2LDMyICs0OCwzMiBAQAogCiAgIC8vIEZyb20gQXVkaW9Ob2RlLgogICBzY29wZWRfcHRyPFNoZWxsQXVkaW9CdXM+IFBhc3NBdWRpb0J1c0Zyb21Tb3VyY2UoaW50MzIsIC8qbnVtYmVyX29mX2ZyYW1lcyovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVUeXBlKSBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVUeXBlLCBib29sKikgb3ZlcnJpZGUgewogICAgIE5PVFJFQUNIRUQoKTsKICAgICByZXR1cm4gc2NvcGVkX3B0cjxTaGVsbEF1ZGlvQnVzPigpOwogICB9CiAKICAgLy8gRnJvbSBBdWRpb0RldmljZTo6UmVuZGVyQ2FsbGJhY2suCi0gIHZvaWQgRmlsbEF1ZGlvQnVzKFNoZWxsQXVkaW9CdXMqIGF1ZGlvX2J1cywgYm9vbCogc2lsZW5jZSkgb3ZlcnJpZGUgeworICB2b2lkIEZpbGxBdWRpb0J1cyhib29sIGFsbF9jb25zdW1lZCwgU2hlbGxBdWRpb0J1cyogYXVkaW9fYnVzLAorICAgICAgICAgICAgICAgICAgICBib29sKiBzaWxlbmNlKSBvdmVycmlkZSB7CisgICAgVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUihhbGxfY29uc3VtZWQpOworCiAgICAgQXVkaW9Mb2NrOjpBdXRvTG9jayBsb2NrKGF1ZGlvX2xvY2soKSk7CiAKKyAgICBib29sIGFsbF9maW5pc2hlZDsKICAgICAvLyBEZXN0aW5hdGlvbiBub2RlIG9ubHkgaGFzIG9uZSBpbnB1dC4KLSAgICBJbnB1dCgwKS0+RmlsbEF1ZGlvQnVzKGF1ZGlvX2J1cywgc2lsZW5jZSk7CisgICAgSW5wdXQoMCktPkZpbGxBdWRpb0J1cyhhdWRpb19idXMsIHNpbGVuY2UsICZhbGxfZmluaXNoZWQpOwogICB9CiB9OwogCiB2b2lkIEZpbGxBdWRpb0J1c0Zyb21PbmVTb3VyY2UoCi0gICAgc2l6ZV90IG51bV9vZl9zcmNfY2hhbm5lbCwgc2l6ZV90IG51bV9vZl9mcmFtZXMsCi0gICAgc2NvcGVkX2FycmF5PHVpbnQ4PiBzcmNfZGF0YSwKKyAgICBzY29wZWRfcHRyPFNoZWxsQXVkaW9CdXM+IHNyY19kYXRhLAogICAgIGNvbnN0IEF1ZGlvTm9kZUNoYW5uZWxJbnRlcnByZXRhdGlvbiYgaW50ZXJwcmV0YXRpb24sCiAgICAgU2hlbGxBdWRpb0J1cyogYXVkaW9fYnVzLCBib29sKiBzaWxlbmNlKSB7CiAgIHNjb3BlZF9yZWZwdHI8QXVkaW9Db250ZXh0PiBhdWRpb19jb250ZXh0KG5ldyBBdWRpb0NvbnRleHQoKSk7CiAgIHNjb3BlZF9yZWZwdHI8QXVkaW9CdWZmZXJTb3VyY2VOb2RlPiBzb3VyY2UoCiAgICAgICBhdWRpb19jb250ZXh0LT5DcmVhdGVCdWZmZXJTb3VyY2UoKSk7Ci0gIHNjb3BlZF9yZWZwdHI8QXVkaW9CdWZmZXI+IGJ1ZmZlcigKLSAgICAgIG5ldyBBdWRpb0J1ZmZlcihOVUxMLCA0NDEwMCwgc3RhdGljX2Nhc3Q8aW50MzI+KG51bV9vZl9mcmFtZXMpLAotICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyPihudW1fb2Zfc3JjX2NoYW5uZWwpLCBzcmNfZGF0YS5QYXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAga1NhbXBsZVR5cGVGbG9hdDMyKSk7CisgIHNjb3BlZF9yZWZwdHI8QXVkaW9CdWZmZXI+IGJ1ZmZlcihuZXcgQXVkaW9CdWZmZXIoNDQxMDAsIHNyY19kYXRhLlBhc3MoKSkpOwogICBzb3VyY2UtPnNldF9idWZmZXIoYnVmZmVyKTsKIAogICBzY29wZWRfcmVmcHRyPEF1ZGlvRGVzdGluYXRpb25Ob2RlTW9jaz4gZGVzdGluYXRpb24oCkBAIC04MCw3ICs4Miw3IEBACiAgIHNvdXJjZS0+Q29ubmVjdChkZXN0aW5hdGlvbiwgMCwgMCwgTlVMTCk7CiAgIHNvdXJjZS0+U3RhcnQoMCwgMCwgTlVMTCk7CiAKLSAgZGVzdGluYXRpb24tPkZpbGxBdWRpb0J1cyhhdWRpb19idXMsIHNpbGVuY2UpOworICBkZXN0aW5hdGlvbi0+RmlsbEF1ZGlvQnVzKHRydWUsIGF1ZGlvX2J1cywgc2lsZW5jZSk7CiB9CiAKIGNsYXNzIEF1ZGlvTm9kZUlucHV0T3V0cHV0VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewpAQCAtODksMzUgKzkxLDM0IEBACiB9OwogCiBURVNUX0YoQXVkaW9Ob2RlSW5wdXRPdXRwdXRUZXN0LCBTdGVyZW9Ub1N0ZXJlb1NwZWFrZXJzTGF5b3V0VGVzdCkgewotICBzaXplX3QgbnVtX29mX3NyY19jaGFubmVsID0gMjsKLSAgc2l6ZV90IG51bV9vZl9kZXN0X2NoYW5uZWwgPSAyOwotICBzaXplX3QgbnVtX29mX2ZyYW1lcyA9IDI1OwotICBBdWRpb05vZGVDaGFubmVsSW50ZXJwcmV0YXRpb24gaW50ZXJwcmV0YXRpb24gPQorICBjb25zdCBzaXplX3Qga051bU9mU3JjQ2hhbm5lbHMgPSAyOworICBjb25zdCBzaXplX3Qga051bU9mRGVzdENoYW5uZWxzID0gMjsKKyAgY29uc3Qgc2l6ZV90IGtOdW1PZkZyYW1lcyA9IDI1OworICBjb25zdCBBdWRpb05vZGVDaGFubmVsSW50ZXJwcmV0YXRpb24ga0ludGVycHJldGF0aW9uID0KICAgICAgIGtBdWRpb05vZGVDaGFubmVsSW50ZXJwcmV0YXRpb25TcGVha2VyczsKIAogICBmbG9hdCBzcmNfZGF0YV9pbl9mbG9hdFs1MF07Ci0gIGZvciAoc2l6ZV90IGMgPSAwOyBjIDwgbnVtX29mX3NyY19jaGFubmVsOyArK2MpIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bV9vZl9mcmFtZXM7ICsraSkgewotICAgICAgc3JjX2RhdGFfaW5fZmxvYXRbYyAqIG51bV9vZl9mcmFtZXMgKyBpXSA9IDIwLjBmICogKGMgKyAxKTsKKyAgZm9yIChzaXplX3QgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBrTnVtT2ZTcmNDaGFubmVsczsgKytjaGFubmVsKSB7CisgICAgZm9yIChzaXplX3QgZnJhbWUgPSAwOyBmcmFtZSA8IGtOdW1PZkZyYW1lczsgKytmcmFtZSkgeworICAgICAgc3JjX2RhdGFfaW5fZmxvYXRbZnJhbWUgKiBrTnVtT2ZTcmNDaGFubmVscyArIGNoYW5uZWxdID0KKyAgICAgICAgICAyMC4wZiAqIChjaGFubmVsICsgMSk7CiAgICAgfQogICB9CiAKLSAgc2NvcGVkX2FycmF5PHVpbnQ4PiBzcmNfZGF0YShuZXcgdWludDhbMjAwXSk7Ci0gIHVpbnQ4KiBzcmNfYnVmZmVyID0gc3JjX2RhdGEuZ2V0KCk7Ci0gIG1lbWNweShzcmNfYnVmZmVyLCBzcmNfZGF0YV9pbl9mbG9hdCwgMjAwICogc2l6ZW9mKHVpbnQ4KSk7Ci0KKyAgc2NvcGVkX3B0cjxTaGVsbEF1ZGlvQnVzPiBzcmNfZGF0YSgKKyAgICAgIG5ldyBTaGVsbEF1ZGlvQnVzKGtOdW1PZlNyY0NoYW5uZWxzLCBrTnVtT2ZGcmFtZXMsIHNyY19kYXRhX2luX2Zsb2F0KSk7CiAgIHNjb3BlZF9wdHI8U2hlbGxBdWRpb0J1cz4gYXVkaW9fYnVzKAotICAgICAgbmV3IFNoZWxsQXVkaW9CdXMobnVtX29mX2Rlc3RfY2hhbm5lbCwga1JlbmRlckJ1ZmZlclNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBTaGVsbEF1ZGlvQnVzOjprRmxvYXQzMiwgU2hlbGxBdWRpb0J1czo6a1BsYW5hcikpOworICAgICAgbmV3IFNoZWxsQXVkaW9CdXMoa051bU9mRGVzdENoYW5uZWxzLCBrUmVuZGVyQnVmZmVyU2l6ZUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgIFNoZWxsQXVkaW9CdXM6OmtGbG9hdDMyLCBTaGVsbEF1ZGlvQnVzOjprSW50ZXJsZWF2ZWQpKTsKICAgYXVkaW9fYnVzLT5aZXJvQWxsRnJhbWVzKCk7CiAgIGJvb2wgc2lsZW5jZSA9IHRydWU7Ci0gIEZpbGxBdWRpb0J1c0Zyb21PbmVTb3VyY2UobnVtX29mX3NyY19jaGFubmVsLCBudW1fb2ZfZnJhbWVzLCBzcmNfZGF0YS5QYXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwcmV0YXRpb24sIGF1ZGlvX2J1cy5nZXQoKSwgJnNpbGVuY2UpOworICBGaWxsQXVkaW9CdXNGcm9tT25lU291cmNlKHNyY19kYXRhLlBhc3MoKSwga0ludGVycHJldGF0aW9uLCBhdWRpb19idXMuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpbGVuY2UpOwogICBFWFBFQ1RfRkFMU0Uoc2lsZW5jZSk7CiAKLSAgZm9yIChzaXplX3QgYyA9IDA7IGMgPCBudW1fb2ZfZGVzdF9jaGFubmVsOyArK2MpIHsKKyAgZm9yIChzaXplX3QgYyA9IDA7IGMgPCBrTnVtT2ZEZXN0Q2hhbm5lbHM7ICsrYykgewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga1JlbmRlckJ1ZmZlclNpemVGcmFtZXM7ICsraSkgewotICAgICAgaWYgKGkgPCBudW1fb2ZfZnJhbWVzKSB7CisgICAgICBpZiAoaSA8IGtOdW1PZkZyYW1lcykgewogICAgICAgICBpZiAoYyA9PSAwKSB7CiAgICAgICAgICAgRVhQRUNUX0VRKGF1ZGlvX2J1cy0+R2V0RmxvYXQzMlNhbXBsZShjLCBpKSwgMjApOwogICAgICAgICB9IGVsc2UgewpAQCAtMTMxLDM1ICsxMzIsMzUgQEAKIH0KIAogVEVTVF9GKEF1ZGlvTm9kZUlucHV0T3V0cHV0VGVzdCwgU3RlcmVvVG9TdGVyZW9EaXNjcmV0ZUxheW91dFRlc3QpIHsKLSAgc2l6ZV90IG51bV9vZl9zcmNfY2hhbm5lbCA9IDI7Ci0gIHNpemVfdCBudW1fb2ZfZGVzdF9jaGFubmVsID0gMjsKLSAgc2l6ZV90IG51bV9vZl9mcmFtZXMgPSAyNTsKLSAgQXVkaW9Ob2RlQ2hhbm5lbEludGVycHJldGF0aW9uIGludGVycHJldGF0aW9uID0KKyAgY29uc3Qgc2l6ZV90IGtOdW1PZlNyY0NoYW5uZWxzID0gMjsKKyAgY29uc3Qgc2l6ZV90IGtOdW1PZkRlc3RDaGFubmVscyA9IDI7CisgIGNvbnN0IHNpemVfdCBrTnVtT2ZGcmFtZXMgPSAyNTsKKyAgY29uc3QgQXVkaW9Ob2RlQ2hhbm5lbEludGVycHJldGF0aW9uIGtJbnRlcnByZXRhdGlvbiA9CiAgICAgICBrQXVkaW9Ob2RlQ2hhbm5lbEludGVycHJldGF0aW9uRGlzY3JldGU7CiAKICAgZmxvYXQgc3JjX2RhdGFfaW5fZmxvYXRbNTBdOwotICBmb3IgKHNpemVfdCBjID0gMDsgYyA8IG51bV9vZl9zcmNfY2hhbm5lbDsgKytjKSB7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1fb2ZfZnJhbWVzOyArK2kpIHsKLSAgICAgIHNyY19kYXRhX2luX2Zsb2F0W2MgKiBudW1fb2ZfZnJhbWVzICsgaV0gPSAyMC4wZiAqIChjICsgMSk7CisgIGZvciAoc2l6ZV90IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwga051bU9mU3JjQ2hhbm5lbHM7ICsrY2hhbm5lbCkgeworICAgIGZvciAoc2l6ZV90IGZyYW1lID0gMDsgZnJhbWUgPCBrTnVtT2ZGcmFtZXM7ICsrZnJhbWUpIHsKKyAgICAgIHNyY19kYXRhX2luX2Zsb2F0W2ZyYW1lICoga051bU9mU3JjQ2hhbm5lbHMgKyBjaGFubmVsXSA9CisgICAgICAgICAgMjAuMGYgKiAoY2hhbm5lbCArIDEpOwogICAgIH0KICAgfQogCi0gIHNjb3BlZF9hcnJheTx1aW50OD4gc3JjX2RhdGEobmV3IHVpbnQ4WzIwMF0pOwotICB1aW50OCogc3JjX2J1ZmZlciA9IHNyY19kYXRhLmdldCgpOwotICBtZW1jcHkoc3JjX2J1ZmZlciwgc3JjX2RhdGFfaW5fZmxvYXQsIDIwMCAqIHNpemVvZih1aW50OCkpOworICBzY29wZWRfcHRyPFNoZWxsQXVkaW9CdXM+IHNyY19kYXRhKAorICAgICAgbmV3IFNoZWxsQXVkaW9CdXMoa051bU9mU3JjQ2hhbm5lbHMsIGtOdW1PZkZyYW1lcywgc3JjX2RhdGFfaW5fZmxvYXQpKTsKIAogICBzY29wZWRfcHRyPFNoZWxsQXVkaW9CdXM+IGF1ZGlvX2J1cygKLSAgICAgIG5ldyBTaGVsbEF1ZGlvQnVzKG51bV9vZl9kZXN0X2NoYW5uZWwsIGtSZW5kZXJCdWZmZXJTaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgU2hlbGxBdWRpb0J1czo6a0Zsb2F0MzIsIFNoZWxsQXVkaW9CdXM6OmtQbGFuYXIpKTsKKyAgICAgIG5ldyBTaGVsbEF1ZGlvQnVzKGtOdW1PZkRlc3RDaGFubmVscywga1JlbmRlckJ1ZmZlclNpemVGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBTaGVsbEF1ZGlvQnVzOjprRmxvYXQzMiwgU2hlbGxBdWRpb0J1czo6a0ludGVybGVhdmVkKSk7CiAgIGF1ZGlvX2J1cy0+WmVyb0FsbEZyYW1lcygpOwogICBib29sIHNpbGVuY2UgPSB0cnVlOwotICBGaWxsQXVkaW9CdXNGcm9tT25lU291cmNlKG51bV9vZl9zcmNfY2hhbm5lbCwgbnVtX29mX2ZyYW1lcywgc3JjX2RhdGEuUGFzcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycHJldGF0aW9uLCBhdWRpb19idXMuZ2V0KCksICZzaWxlbmNlKTsKKyAgRmlsbEF1ZGlvQnVzRnJvbU9uZVNvdXJjZShzcmNfZGF0YS5QYXNzKCksIGtJbnRlcnByZXRhdGlvbiwgYXVkaW9fYnVzLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaWxlbmNlKTsKICAgRVhQRUNUX0ZBTFNFKHNpbGVuY2UpOwogCi0gIGZvciAoc2l6ZV90IGMgPSAwOyBjIDwgbnVtX29mX2Rlc3RfY2hhbm5lbDsgKytjKSB7CisgIGZvciAoc2l6ZV90IGMgPSAwOyBjIDwga051bU9mRGVzdENoYW5uZWxzOyArK2MpIHsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtSZW5kZXJCdWZmZXJTaXplRnJhbWVzOyArK2kpIHsKLSAgICAgIGlmIChpIDwgbnVtX29mX2ZyYW1lcykgeworICAgICAgaWYgKGkgPCBrTnVtT2ZGcmFtZXMpIHsKICAgICAgICAgaWYgKGMgPT0gMCkgewogICAgICAgICAgIEVYUEVDVF9FUShhdWRpb19idXMtPkdldEZsb2F0MzJTYW1wbGUoYywgaSksIDIwKTsKICAgICAgICAgfSBlbHNlIHsKQEAgLTE3MywzMyArMTc0LDMyIEBACiB9CiAKIFRFU1RfRihBdWRpb05vZGVJbnB1dE91dHB1dFRlc3QsIE1vbm9Ub1N0ZXJlb1NwZWFrZXJzTGF5b3V0VGVzdCkgewotICBzaXplX3QgbnVtX29mX3NyY19jaGFubmVsID0gMTsKLSAgc2l6ZV90IG51bV9vZl9kZXN0X2NoYW5uZWwgPSAyOwotICBzaXplX3QgbnVtX29mX2ZyYW1lcyA9IDI1OwotICBBdWRpb05vZGVDaGFubmVsSW50ZXJwcmV0YXRpb24gaW50ZXJwcmV0YXRpb24gPQorICBjb25zdCBzaXplX3Qga051bU9mU3JjQ2hhbm5lbHMgPSAxOworICBjb25zdCBzaXplX3Qga051bU9mRGVzdENoYW5uZWxzID0gMjsKKyAgY29uc3Qgc2l6ZV90IGtOdW1PZkZyYW1lcyA9IDI1OworICBjb25zdCBBdWRpb05vZGVDaGFubmVsSW50ZXJwcmV0YXRpb24ga0ludGVycHJldGF0aW9uID0KICAgICAgIGtBdWRpb05vZGVDaGFubmVsSW50ZXJwcmV0YXRpb25TcGVha2VyczsKIAogICBmbG9hdCBzcmNfZGF0YV9pbl9mbG9hdFsyNV07Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtX29mX2ZyYW1lczsgKytpKSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bU9mRnJhbWVzOyArK2kpIHsKICAgICBzcmNfZGF0YV9pbl9mbG9hdFtpXSA9IDUwLjBmOwogICB9CiAKLSAgc2NvcGVkX2FycmF5PHVpbnQ4PiBzcmNfZGF0YShuZXcgdWludDhbMTAwXSk7Ci0gIHVpbnQ4KiBzcmNfYnVmZmVyID0gc3JjX2RhdGEuZ2V0KCk7Ci0gIG1lbWNweShzcmNfYnVmZmVyLCBzcmNfZGF0YV9pbl9mbG9hdCwgMTAwICogc2l6ZW9mKHVpbnQ4KSk7CisgIHNjb3BlZF9wdHI8U2hlbGxBdWRpb0J1cz4gc3JjX2RhdGEoCisgICAgICBuZXcgU2hlbGxBdWRpb0J1cyhrTnVtT2ZTcmNDaGFubmVscywga051bU9mRnJhbWVzLCBzcmNfZGF0YV9pbl9mbG9hdCkpOwogCiAgIHNjb3BlZF9wdHI8U2hlbGxBdWRpb0J1cz4gYXVkaW9fYnVzKAotICAgICAgbmV3IFNoZWxsQXVkaW9CdXMobnVtX29mX2Rlc3RfY2hhbm5lbCwga1JlbmRlckJ1ZmZlclNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBTaGVsbEF1ZGlvQnVzOjprRmxvYXQzMiwgU2hlbGxBdWRpb0J1czo6a1BsYW5hcikpOworICAgICAgbmV3IFNoZWxsQXVkaW9CdXMoa051bU9mRGVzdENoYW5uZWxzLCBrUmVuZGVyQnVmZmVyU2l6ZUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgIFNoZWxsQXVkaW9CdXM6OmtGbG9hdDMyLCBTaGVsbEF1ZGlvQnVzOjprSW50ZXJsZWF2ZWQpKTsKICAgYXVkaW9fYnVzLT5aZXJvQWxsRnJhbWVzKCk7CiAgIGJvb2wgc2lsZW5jZSA9IHRydWU7Ci0gIEZpbGxBdWRpb0J1c0Zyb21PbmVTb3VyY2UobnVtX29mX3NyY19jaGFubmVsLCBudW1fb2ZfZnJhbWVzLCBzcmNfZGF0YS5QYXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwcmV0YXRpb24sIGF1ZGlvX2J1cy5nZXQoKSwgJnNpbGVuY2UpOworICBGaWxsQXVkaW9CdXNGcm9tT25lU291cmNlKHNyY19kYXRhLlBhc3MoKSwga0ludGVycHJldGF0aW9uLCBhdWRpb19idXMuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpbGVuY2UpOwogICBFWFBFQ1RfRkFMU0Uoc2lsZW5jZSk7CiAKLSAgZm9yIChzaXplX3QgYyA9IDA7IGMgPCBudW1fb2ZfZGVzdF9jaGFubmVsOyArK2MpIHsKKyAgZm9yIChzaXplX3QgYyA9IDA7IGMgPCBrTnVtT2ZEZXN0Q2hhbm5lbHM7ICsrYykgewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga1JlbmRlckJ1ZmZlclNpemVGcmFtZXM7ICsraSkgewotICAgICAgaWYgKGkgPCBudW1fb2ZfZnJhbWVzKSB7CisgICAgICBpZiAoaSA8IGtOdW1PZkZyYW1lcykgewogICAgICAgICBFWFBFQ1RfRVEoYXVkaW9fYnVzLT5HZXRGbG9hdDMyU2FtcGxlKGMsIGkpLCA1MCk7CiAgICAgICB9IGVsc2UgewogICAgICAgICBFWFBFQ1RfRVEoYXVkaW9fYnVzLT5HZXRGbG9hdDMyU2FtcGxlKGMsIGkpLCAwKTsKQEAgLTIwOSwzMyArMjA5LDMyIEBACiB9CiAKIFRFU1RfRihBdWRpb05vZGVJbnB1dE91dHB1dFRlc3QsIE1vbm9Ub1N0ZXJlb0Rpc2NyZXRlTGF5b3V0VGVzdCkgewotICBzaXplX3QgbnVtX29mX3NyY19jaGFubmVsID0gMTsKLSAgc2l6ZV90IG51bV9vZl9kZXN0X2NoYW5uZWwgPSAyOwotICBzaXplX3QgbnVtX29mX2ZyYW1lcyA9IDI1OwotICBBdWRpb05vZGVDaGFubmVsSW50ZXJwcmV0YXRpb24gaW50ZXJwcmV0YXRpb24gPQorICBjb25zdCBzaXplX3Qga051bU9mU3JjQ2hhbm5lbHMgPSAxOworICBjb25zdCBzaXplX3Qga051bU9mRGVzdENoYW5uZWxzID0gMjsKKyAgY29uc3Qgc2l6ZV90IGtOdW1PZkZyYW1lcyA9IDI1OworICBjb25zdCBBdWRpb05vZGVDaGFubmVsSW50ZXJwcmV0YXRpb24ga0ludGVycHJldGF0aW9uID0KICAgICAgIGtBdWRpb05vZGVDaGFubmVsSW50ZXJwcmV0YXRpb25EaXNjcmV0ZTsKIAogICBmbG9hdCBzcmNfZGF0YV9pbl9mbG9hdFsyNV07Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtX29mX2ZyYW1lczsgKytpKSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bU9mRnJhbWVzOyArK2kpIHsKICAgICBzcmNfZGF0YV9pbl9mbG9hdFtpXSA9IDUwLjBmOwogICB9CiAKLSAgc2NvcGVkX2FycmF5PHVpbnQ4PiBzcmNfZGF0YShuZXcgdWludDhbMTAwXSk7Ci0gIHVpbnQ4KiBzcmNfYnVmZmVyID0gc3JjX2RhdGEuZ2V0KCk7Ci0gIG1lbWNweShzcmNfYnVmZmVyLCBzcmNfZGF0YV9pbl9mbG9hdCwgMTAwICogc2l6ZW9mKHVpbnQ4KSk7CisgIHNjb3BlZF9wdHI8U2hlbGxBdWRpb0J1cz4gc3JjX2RhdGEoCisgICAgICBuZXcgU2hlbGxBdWRpb0J1cyhrTnVtT2ZTcmNDaGFubmVscywga051bU9mRnJhbWVzLCBzcmNfZGF0YV9pbl9mbG9hdCkpOwogCiAgIHNjb3BlZF9wdHI8U2hlbGxBdWRpb0J1cz4gYXVkaW9fYnVzKAotICAgICAgbmV3IFNoZWxsQXVkaW9CdXMobnVtX29mX2Rlc3RfY2hhbm5lbCwga1JlbmRlckJ1ZmZlclNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBTaGVsbEF1ZGlvQnVzOjprRmxvYXQzMiwgU2hlbGxBdWRpb0J1czo6a1BsYW5hcikpOworICAgICAgbmV3IFNoZWxsQXVkaW9CdXMoa051bU9mRGVzdENoYW5uZWxzLCBrUmVuZGVyQnVmZmVyU2l6ZUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgIFNoZWxsQXVkaW9CdXM6OmtGbG9hdDMyLCBTaGVsbEF1ZGlvQnVzOjprSW50ZXJsZWF2ZWQpKTsKICAgYXVkaW9fYnVzLT5aZXJvQWxsRnJhbWVzKCk7CiAgIGJvb2wgc2lsZW5jZSA9IHRydWU7Ci0gIEZpbGxBdWRpb0J1c0Zyb21PbmVTb3VyY2UobnVtX29mX3NyY19jaGFubmVsLCBudW1fb2ZfZnJhbWVzLCBzcmNfZGF0YS5QYXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwcmV0YXRpb24sIGF1ZGlvX2J1cy5nZXQoKSwgJnNpbGVuY2UpOworICBGaWxsQXVkaW9CdXNGcm9tT25lU291cmNlKHNyY19kYXRhLlBhc3MoKSwga0ludGVycHJldGF0aW9uLCBhdWRpb19idXMuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpbGVuY2UpOwogICBFWFBFQ1RfRkFMU0Uoc2lsZW5jZSk7CiAKLSAgZm9yIChzaXplX3QgYyA9IDA7IGMgPCBudW1fb2ZfZGVzdF9jaGFubmVsOyArK2MpIHsKKyAgZm9yIChzaXplX3QgYyA9IDA7IGMgPCBrTnVtT2ZEZXN0Q2hhbm5lbHM7ICsrYykgewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga1JlbmRlckJ1ZmZlclNpemVGcmFtZXM7ICsraSkgewotICAgICAgaWYgKGkgPCBudW1fb2ZfZnJhbWVzICYmIGMgPT0gMCkgeworICAgICAgaWYgKGkgPCBrTnVtT2ZGcmFtZXMgJiYgYyA9PSAwKSB7CiAgICAgICAgIEVYUEVDVF9FUShhdWRpb19idXMtPkdldEZsb2F0MzJTYW1wbGUoYywgaSksIDUwKTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIEVYUEVDVF9FUShhdWRpb19idXMtPkdldEZsb2F0MzJTYW1wbGUoYywgaSksIDApOwpAQCAtMjQ1LDM1ICsyNDQsMzUgQEAKIH0KIAogVEVTVF9GKEF1ZGlvTm9kZUlucHV0T3V0cHV0VGVzdCwgUXVhZFRvU3RlcmVvU3BlYWtlcnNMYXlvdXRUZXN0KSB7Ci0gIHNpemVfdCBudW1fb2Zfc3JjX2NoYW5uZWwgPSA0OwotICBzaXplX3QgbnVtX29mX2Rlc3RfY2hhbm5lbCA9IDI7Ci0gIHNpemVfdCBudW1fb2ZfZnJhbWVzID0gMjU7Ci0gIEF1ZGlvTm9kZUNoYW5uZWxJbnRlcnByZXRhdGlvbiBpbnRlcnByZXRhdGlvbiA9CisgIGNvbnN0IHNpemVfdCBrTnVtT2ZTcmNDaGFubmVscyA9IDQ7CisgIGNvbnN0IHNpemVfdCBrTnVtT2ZEZXN0Q2hhbm5lbHMgPSAyOworICBjb25zdCBzaXplX3Qga051bU9mRnJhbWVzID0gMjU7CisgIGNvbnN0IEF1ZGlvTm9kZUNoYW5uZWxJbnRlcnByZXRhdGlvbiBrSW50ZXJwcmV0YXRpb24gPQogICAgICAga0F1ZGlvTm9kZUNoYW5uZWxJbnRlcnByZXRhdGlvblNwZWFrZXJzOwogCiAgIGZsb2F0IHNyY19kYXRhX2luX2Zsb2F0WzEwMF07Ci0gIGZvciAoc2l6ZV90IGMgPSAwOyBjIDwgbnVtX29mX3NyY19jaGFubmVsOyArK2MpIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bV9vZl9mcmFtZXM7ICsraSkgewotICAgICAgc3JjX2RhdGFfaW5fZmxvYXRbYyAqIG51bV9vZl9mcmFtZXMgKyBpXSA9IDEwLjBmICogKGMgKyAxKTsKKyAgZm9yIChzaXplX3QgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBrTnVtT2ZTcmNDaGFubmVsczsgKytjaGFubmVsKSB7CisgICAgZm9yIChzaXplX3QgZnJhbWUgPSAwOyBmcmFtZSA8IGtOdW1PZkZyYW1lczsgKytmcmFtZSkgeworICAgICAgc3JjX2RhdGFfaW5fZmxvYXRbZnJhbWUgKiBrTnVtT2ZTcmNDaGFubmVscyArIGNoYW5uZWxdID0KKyAgICAgICAgICAxMC4wZiAqIChjaGFubmVsICsgMSk7CiAgICAgfQogICB9CiAKLSAgc2NvcGVkX2FycmF5PHVpbnQ4PiBzcmNfZGF0YShuZXcgdWludDhbNDAwXSk7Ci0gIHVpbnQ4KiBzcmNfYnVmZmVyID0gc3JjX2RhdGEuZ2V0KCk7Ci0gIG1lbWNweShzcmNfYnVmZmVyLCBzcmNfZGF0YV9pbl9mbG9hdCwgNDAwICogc2l6ZW9mKHVpbnQ4KSk7CisgIHNjb3BlZF9wdHI8U2hlbGxBdWRpb0J1cz4gc3JjX2RhdGEoCisgICAgICBuZXcgU2hlbGxBdWRpb0J1cyhrTnVtT2ZTcmNDaGFubmVscywga051bU9mRnJhbWVzLCBzcmNfZGF0YV9pbl9mbG9hdCkpOwogCiAgIHNjb3BlZF9wdHI8U2hlbGxBdWRpb0J1cz4gYXVkaW9fYnVzKAotICAgICAgbmV3IFNoZWxsQXVkaW9CdXMobnVtX29mX2Rlc3RfY2hhbm5lbCwga1JlbmRlckJ1ZmZlclNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBTaGVsbEF1ZGlvQnVzOjprRmxvYXQzMiwgU2hlbGxBdWRpb0J1czo6a1BsYW5hcikpOworICAgICAgbmV3IFNoZWxsQXVkaW9CdXMoa051bU9mRGVzdENoYW5uZWxzLCBrUmVuZGVyQnVmZmVyU2l6ZUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgIFNoZWxsQXVkaW9CdXM6OmtGbG9hdDMyLCBTaGVsbEF1ZGlvQnVzOjprSW50ZXJsZWF2ZWQpKTsKICAgYXVkaW9fYnVzLT5aZXJvQWxsRnJhbWVzKCk7CiAgIGJvb2wgc2lsZW5jZSA9IHRydWU7Ci0gIEZpbGxBdWRpb0J1c0Zyb21PbmVTb3VyY2UobnVtX29mX3NyY19jaGFubmVsLCBudW1fb2ZfZnJhbWVzLCBzcmNfZGF0YS5QYXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwcmV0YXRpb24sIGF1ZGlvX2J1cy5nZXQoKSwgJnNpbGVuY2UpOworICBGaWxsQXVkaW9CdXNGcm9tT25lU291cmNlKHNyY19kYXRhLlBhc3MoKSwga0ludGVycHJldGF0aW9uLCBhdWRpb19idXMuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpbGVuY2UpOwogICBFWFBFQ1RfRkFMU0Uoc2lsZW5jZSk7CiAKLSAgZm9yIChzaXplX3QgYyA9IDA7IGMgPCBudW1fb2ZfZGVzdF9jaGFubmVsOyArK2MpIHsKKyAgZm9yIChzaXplX3QgYyA9IDA7IGMgPCBrTnVtT2ZEZXN0Q2hhbm5lbHM7ICsrYykgewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga1JlbmRlckJ1ZmZlclNpemVGcmFtZXM7ICsraSkgewotICAgICAgaWYgKGkgPCBudW1fb2ZfZnJhbWVzKSB7CisgICAgICBpZiAoaSA8IGtOdW1PZkZyYW1lcykgewogICAgICAgICBpZiAoYyA9PSAwKSB7CiAgICAgICAgICAgRVhQRUNUX0VRKGF1ZGlvX2J1cy0+R2V0RmxvYXQzMlNhbXBsZShjLCBpKSwgMjApOwogICAgICAgICB9IGVsc2UgewpAQCAtMjg3LDM1ICsyODYsMzUgQEAKIH0KIAogVEVTVF9GKEF1ZGlvTm9kZUlucHV0T3V0cHV0VGVzdCwgUXVhZFRvU3RlcmVvRGlzY3JldGVMYXlvdXRUZXN0KSB7Ci0gIHNpemVfdCBudW1fb2Zfc3JjX2NoYW5uZWwgPSA0OwotICBzaXplX3QgbnVtX29mX2Rlc3RfY2hhbm5lbCA9IDI7Ci0gIHNpemVfdCBudW1fb2ZfZnJhbWVzID0gMjU7Ci0gIEF1ZGlvTm9kZUNoYW5uZWxJbnRlcnByZXRhdGlvbiBpbnRlcnByZXRhdGlvbiA9CisgIGNvbnN0IHNpemVfdCBrTnVtT2ZTcmNDaGFubmVscyA9IDQ7CisgIGNvbnN0IHNpemVfdCBrTnVtT2ZEZXN0Q2hhbm5lbHMgPSAyOworICBjb25zdCBzaXplX3Qga051bU9mRnJhbWVzID0gMjU7CisgIGNvbnN0IEF1ZGlvTm9kZUNoYW5uZWxJbnRlcnByZXRhdGlvbiBrSW50ZXJwcmV0YXRpb24gPQogICAgICAga0F1ZGlvTm9kZUNoYW5uZWxJbnRlcnByZXRhdGlvbkRpc2NyZXRlOwogCiAgIGZsb2F0IHNyY19kYXRhX2luX2Zsb2F0WzEwMF07Ci0gIGZvciAoc2l6ZV90IGMgPSAwOyBjIDwgbnVtX29mX3NyY19jaGFubmVsOyArK2MpIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bV9vZl9mcmFtZXM7ICsraSkgewotICAgICAgc3JjX2RhdGFfaW5fZmxvYXRbYyAqIG51bV9vZl9mcmFtZXMgKyBpXSA9IDEwLjBmICogKGMgKyAxKTsKKyAgZm9yIChzaXplX3QgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBrTnVtT2ZTcmNDaGFubmVsczsgKytjaGFubmVsKSB7CisgICAgZm9yIChzaXplX3QgZnJhbWUgPSAwOyBmcmFtZSA8IGtOdW1PZkZyYW1lczsgKytmcmFtZSkgeworICAgICAgc3JjX2RhdGFfaW5fZmxvYXRbZnJhbWUgKiBrTnVtT2ZTcmNDaGFubmVscyArIGNoYW5uZWxdID0KKyAgICAgICAgICAxMC4wZiAqIChjaGFubmVsICsgMSk7CiAgICAgfQogICB9CiAKLSAgc2NvcGVkX2FycmF5PHVpbnQ4PiBzcmNfZGF0YShuZXcgdWludDhbNDAwXSk7Ci0gIHVpbnQ4KiBzcmNfYnVmZmVyID0gc3JjX2RhdGEuZ2V0KCk7Ci0gIG1lbWNweShzcmNfYnVmZmVyLCBzcmNfZGF0YV9pbl9mbG9hdCwgNDAwICogc2l6ZW9mKHVpbnQ4KSk7CisgIHNjb3BlZF9wdHI8U2hlbGxBdWRpb0J1cz4gc3JjX2RhdGEoCisgICAgICBuZXcgU2hlbGxBdWRpb0J1cyhrTnVtT2ZTcmNDaGFubmVscywga051bU9mRnJhbWVzLCBzcmNfZGF0YV9pbl9mbG9hdCkpOwogCiAgIHNjb3BlZF9wdHI8U2hlbGxBdWRpb0J1cz4gYXVkaW9fYnVzKAotICAgICAgbmV3IFNoZWxsQXVkaW9CdXMobnVtX29mX2Rlc3RfY2hhbm5lbCwga1JlbmRlckJ1ZmZlclNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBTaGVsbEF1ZGlvQnVzOjprRmxvYXQzMiwgU2hlbGxBdWRpb0J1czo6a1BsYW5hcikpOworICAgICAgbmV3IFNoZWxsQXVkaW9CdXMoa051bU9mRGVzdENoYW5uZWxzLCBrUmVuZGVyQnVmZmVyU2l6ZUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgIFNoZWxsQXVkaW9CdXM6OmtGbG9hdDMyLCBTaGVsbEF1ZGlvQnVzOjprSW50ZXJsZWF2ZWQpKTsKICAgYXVkaW9fYnVzLT5aZXJvQWxsRnJhbWVzKCk7CiAgIGJvb2wgc2lsZW5jZSA9IHRydWU7Ci0gIEZpbGxBdWRpb0J1c0Zyb21PbmVTb3VyY2UobnVtX29mX3NyY19jaGFubmVsLCBudW1fb2ZfZnJhbWVzLCBzcmNfZGF0YS5QYXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwcmV0YXRpb24sIGF1ZGlvX2J1cy5nZXQoKSwgJnNpbGVuY2UpOworICBGaWxsQXVkaW9CdXNGcm9tT25lU291cmNlKHNyY19kYXRhLlBhc3MoKSwga0ludGVycHJldGF0aW9uLCBhdWRpb19idXMuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpbGVuY2UpOwogICBFWFBFQ1RfRkFMU0Uoc2lsZW5jZSk7CiAKLSAgZm9yIChzaXplX3QgYyA9IDA7IGMgPCBudW1fb2ZfZGVzdF9jaGFubmVsOyArK2MpIHsKKyAgZm9yIChzaXplX3QgYyA9IDA7IGMgPCBrTnVtT2ZEZXN0Q2hhbm5lbHM7ICsrYykgewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga1JlbmRlckJ1ZmZlclNpemVGcmFtZXM7ICsraSkgewotICAgICAgaWYgKGkgPCBudW1fb2ZfZnJhbWVzKSB7CisgICAgICBpZiAoaSA8IGtOdW1PZkZyYW1lcykgewogICAgICAgICBpZiAoYyA9PSAwKSB7CiAgICAgICAgICAgRVhQRUNUX0VRKGF1ZGlvX2J1cy0+R2V0RmxvYXQzMlNhbXBsZShjLCBpKSwgMTApOwogICAgICAgICB9IGVsc2UgewpAQCAtMzI5LDM1ICszMjgsMzUgQEAKIH0KIAogVEVTVF9GKEF1ZGlvTm9kZUlucHV0T3V0cHV0VGVzdCwgRml2ZVBvaW50T25lVG9TdGVyZW9TcGVha2Vyc0xheW91dFRlc3QpIHsKLSAgc2l6ZV90IG51bV9vZl9zcmNfY2hhbm5lbCA9IDY7Ci0gIHNpemVfdCBudW1fb2ZfZGVzdF9jaGFubmVsID0gMjsKLSAgc2l6ZV90IG51bV9vZl9mcmFtZXMgPSAxMDsKLSAgQXVkaW9Ob2RlQ2hhbm5lbEludGVycHJldGF0aW9uIGludGVycHJldGF0aW9uID0KKyAgY29uc3Qgc2l6ZV90IGtOdW1PZlNyY0NoYW5uZWxzID0gNjsKKyAgY29uc3Qgc2l6ZV90IGtOdW1PZkRlc3RDaGFubmVscyA9IDI7CisgIGNvbnN0IHNpemVfdCBrTnVtT2ZGcmFtZXMgPSAxMDsKKyAgY29uc3QgQXVkaW9Ob2RlQ2hhbm5lbEludGVycHJldGF0aW9uIGtJbnRlcnByZXRhdGlvbiA9CiAgICAgICBrQXVkaW9Ob2RlQ2hhbm5lbEludGVycHJldGF0aW9uU3BlYWtlcnM7CiAKICAgZmxvYXQgc3JjX2RhdGFfaW5fZmxvYXRbNjBdOwotICBmb3IgKHNpemVfdCBjID0gMDsgYyA8IG51bV9vZl9zcmNfY2hhbm5lbDsgKytjKSB7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1fb2ZfZnJhbWVzOyArK2kpIHsKLSAgICAgIHNyY19kYXRhX2luX2Zsb2F0W2MgKiBudW1fb2ZfZnJhbWVzICsgaV0gPSAxMC4wZiAqIChjICsgMSk7CisgIGZvciAoc2l6ZV90IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwga051bU9mU3JjQ2hhbm5lbHM7ICsrY2hhbm5lbCkgeworICAgIGZvciAoc2l6ZV90IGZyYW1lID0gMDsgZnJhbWUgPCBrTnVtT2ZGcmFtZXM7ICsrZnJhbWUpIHsKKyAgICAgIHNyY19kYXRhX2luX2Zsb2F0W2ZyYW1lICoga051bU9mU3JjQ2hhbm5lbHMgKyBjaGFubmVsXSA9CisgICAgICAgICAgMTAuMGYgKiAoY2hhbm5lbCArIDEpOwogICAgIH0KICAgfQogCi0gIHNjb3BlZF9hcnJheTx1aW50OD4gc3JjX2RhdGEobmV3IHVpbnQ4WzI0MF0pOwotICB1aW50OCogc3JjX2J1ZmZlciA9IHNyY19kYXRhLmdldCgpOwotICBtZW1jcHkoc3JjX2J1ZmZlciwgc3JjX2RhdGFfaW5fZmxvYXQsIDI0MCAqIHNpemVvZih1aW50OCkpOworICBzY29wZWRfcHRyPFNoZWxsQXVkaW9CdXM+IHNyY19kYXRhKAorICAgICAgbmV3IFNoZWxsQXVkaW9CdXMoa051bU9mU3JjQ2hhbm5lbHMsIGtOdW1PZkZyYW1lcywgc3JjX2RhdGFfaW5fZmxvYXQpKTsKIAogICBzY29wZWRfcHRyPFNoZWxsQXVkaW9CdXM+IGF1ZGlvX2J1cygKLSAgICAgIG5ldyBTaGVsbEF1ZGlvQnVzKG51bV9vZl9kZXN0X2NoYW5uZWwsIGtSZW5kZXJCdWZmZXJTaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgU2hlbGxBdWRpb0J1czo6a0Zsb2F0MzIsIFNoZWxsQXVkaW9CdXM6OmtQbGFuYXIpKTsKKyAgICAgIG5ldyBTaGVsbEF1ZGlvQnVzKGtOdW1PZkRlc3RDaGFubmVscywga1JlbmRlckJ1ZmZlclNpemVGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBTaGVsbEF1ZGlvQnVzOjprRmxvYXQzMiwgU2hlbGxBdWRpb0J1czo6a0ludGVybGVhdmVkKSk7CiAgIGF1ZGlvX2J1cy0+WmVyb0FsbEZyYW1lcygpOwogICBib29sIHNpbGVuY2UgPSB0cnVlOwotICBGaWxsQXVkaW9CdXNGcm9tT25lU291cmNlKG51bV9vZl9zcmNfY2hhbm5lbCwgbnVtX29mX2ZyYW1lcywgc3JjX2RhdGEuUGFzcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycHJldGF0aW9uLCBhdWRpb19idXMuZ2V0KCksICZzaWxlbmNlKTsKKyAgRmlsbEF1ZGlvQnVzRnJvbU9uZVNvdXJjZShzcmNfZGF0YS5QYXNzKCksIGtJbnRlcnByZXRhdGlvbiwgYXVkaW9fYnVzLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaWxlbmNlKTsKICAgRVhQRUNUX0ZBTFNFKHNpbGVuY2UpOwogCi0gIGZvciAoc2l6ZV90IGMgPSAwOyBjIDwgbnVtX29mX2Rlc3RfY2hhbm5lbDsgKytjKSB7CisgIGZvciAoc2l6ZV90IGMgPSAwOyBjIDwga051bU9mRGVzdENoYW5uZWxzOyArK2MpIHsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtSZW5kZXJCdWZmZXJTaXplRnJhbWVzOyArK2kpIHsKLSAgICAgIGlmIChpIDwgbnVtX29mX2ZyYW1lcykgeworICAgICAgaWYgKGkgPCBrTnVtT2ZGcmFtZXMpIHsKICAgICAgICAgaWYgKGMgPT0gMCkgewogICAgICAgICAgIEVYUEVDVF9GTE9BVF9FUShhdWRpb19idXMtPkdldEZsb2F0MzJTYW1wbGUoYywgaSksIDY2LjU2OGYpOwogICAgICAgICB9IGVsc2UgewpAQCAtMzcxLDM1ICszNzAsMzUgQEAKIH0KIAogVEVTVF9GKEF1ZGlvTm9kZUlucHV0T3V0cHV0VGVzdCwgRml2ZVBvaW50T25lVG9TdGVyZW9EaXNjcmV0ZUxheW91dFRlc3QpIHsKLSAgc2l6ZV90IG51bV9vZl9zcmNfY2hhbm5lbCA9IDY7Ci0gIHNpemVfdCBudW1fb2ZfZGVzdF9jaGFubmVsID0gMjsKLSAgc2l6ZV90IG51bV9vZl9mcmFtZXMgPSAxMDsKLSAgQXVkaW9Ob2RlQ2hhbm5lbEludGVycHJldGF0aW9uIGludGVycHJldGF0aW9uID0KKyAgY29uc3Qgc2l6ZV90IGtOdW1PZlNyY0NoYW5uZWxzID0gNjsKKyAgY29uc3Qgc2l6ZV90IGtOdW1PZkRlc3RDaGFubmVscyA9IDI7CisgIGNvbnN0IHNpemVfdCBrTnVtT2ZGcmFtZXMgPSAxMDsKKyAgY29uc3QgQXVkaW9Ob2RlQ2hhbm5lbEludGVycHJldGF0aW9uIGtJbnRlcnByZXRhdGlvbiA9CiAgICAgICBrQXVkaW9Ob2RlQ2hhbm5lbEludGVycHJldGF0aW9uRGlzY3JldGU7CiAKICAgZmxvYXQgc3JjX2RhdGFfaW5fZmxvYXRbNjBdOwotICBmb3IgKHNpemVfdCBjID0gMDsgYyA8IG51bV9vZl9zcmNfY2hhbm5lbDsgKytjKSB7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1fb2ZfZnJhbWVzOyArK2kpIHsKLSAgICAgIHNyY19kYXRhX2luX2Zsb2F0W2MgKiBudW1fb2ZfZnJhbWVzICsgaV0gPSAxMC4wZiAqIChjICsgMSk7CisgIGZvciAoc2l6ZV90IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwga051bU9mU3JjQ2hhbm5lbHM7ICsrY2hhbm5lbCkgeworICAgIGZvciAoc2l6ZV90IGZyYW1lID0gMDsgZnJhbWUgPCBrTnVtT2ZGcmFtZXM7ICsrZnJhbWUpIHsKKyAgICAgIHNyY19kYXRhX2luX2Zsb2F0W2ZyYW1lICoga051bU9mU3JjQ2hhbm5lbHMgKyBjaGFubmVsXSA9CisgICAgICAgICAgMTAuMGYgKiAoY2hhbm5lbCArIDEpOwogICAgIH0KICAgfQogCi0gIHNjb3BlZF9hcnJheTx1aW50OD4gc3JjX2RhdGEobmV3IHVpbnQ4WzI0MF0pOwotICB1aW50OCogc3JjX2J1ZmZlciA9IHNyY19kYXRhLmdldCgpOwotICBtZW1jcHkoc3JjX2J1ZmZlciwgc3JjX2RhdGFfaW5fZmxvYXQsIDI0MCAqIHNpemVvZih1aW50OCkpOworICBzY29wZWRfcHRyPFNoZWxsQXVkaW9CdXM+IHNyY19kYXRhKAorICAgICAgbmV3IFNoZWxsQXVkaW9CdXMoa051bU9mU3JjQ2hhbm5lbHMsIGtOdW1PZkZyYW1lcywgc3JjX2RhdGFfaW5fZmxvYXQpKTsKIAogICBzY29wZWRfcHRyPFNoZWxsQXVkaW9CdXM+IGF1ZGlvX2J1cygKLSAgICAgIG5ldyBTaGVsbEF1ZGlvQnVzKG51bV9vZl9kZXN0X2NoYW5uZWwsIGtSZW5kZXJCdWZmZXJTaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgU2hlbGxBdWRpb0J1czo6a0Zsb2F0MzIsIFNoZWxsQXVkaW9CdXM6OmtQbGFuYXIpKTsKKyAgICAgIG5ldyBTaGVsbEF1ZGlvQnVzKGtOdW1PZkRlc3RDaGFubmVscywga1JlbmRlckJ1ZmZlclNpemVGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBTaGVsbEF1ZGlvQnVzOjprRmxvYXQzMiwgU2hlbGxBdWRpb0J1czo6a0ludGVybGVhdmVkKSk7CiAgIGF1ZGlvX2J1cy0+WmVyb0FsbEZyYW1lcygpOwogICBib29sIHNpbGVuY2UgPSB0cnVlOwotICBGaWxsQXVkaW9CdXNGcm9tT25lU291cmNlKG51bV9vZl9zcmNfY2hhbm5lbCwgbnVtX29mX2ZyYW1lcywgc3JjX2RhdGEuUGFzcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycHJldGF0aW9uLCBhdWRpb19idXMuZ2V0KCksICZzaWxlbmNlKTsKKyAgRmlsbEF1ZGlvQnVzRnJvbU9uZVNvdXJjZShzcmNfZGF0YS5QYXNzKCksIGtJbnRlcnByZXRhdGlvbiwgYXVkaW9fYnVzLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaWxlbmNlKTsKICAgRVhQRUNUX0ZBTFNFKHNpbGVuY2UpOwogCi0gIGZvciAoc2l6ZV90IGMgPSAwOyBjIDwgbnVtX29mX2Rlc3RfY2hhbm5lbDsgKytjKSB7CisgIGZvciAoc2l6ZV90IGMgPSAwOyBjIDwga051bU9mRGVzdENoYW5uZWxzOyArK2MpIHsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtSZW5kZXJCdWZmZXJTaXplRnJhbWVzOyArK2kpIHsKLSAgICAgIGlmIChpIDwgbnVtX29mX2ZyYW1lcykgeworICAgICAgaWYgKGkgPCBrTnVtT2ZGcmFtZXMpIHsKICAgICAgICAgaWYgKGMgPT0gMCkgewogICAgICAgICAgIEVYUEVDVF9FUShhdWRpb19idXMtPkdldEZsb2F0MzJTYW1wbGUoYywgaSksIDEwKTsKICAgICAgICAgfSBlbHNlIHsKQEAgLTQxMywzNSArNDEyLDM1IEBACiB9CiAKIFRFU1RfRihBdWRpb05vZGVJbnB1dE91dHB1dFRlc3QsIFN0ZXJlb1RvTW9ub1NwZWFrZXJzTGF5b3V0VGVzdCkgewotICBzaXplX3QgbnVtX29mX3NyY19jaGFubmVsID0gMjsKLSAgc2l6ZV90IG51bV9vZl9kZXN0X2NoYW5uZWwgPSAxOwotICBzaXplX3QgbnVtX29mX2ZyYW1lcyA9IDI1OwotICBBdWRpb05vZGVDaGFubmVsSW50ZXJwcmV0YXRpb24gaW50ZXJwcmV0YXRpb24gPQorICBjb25zdCBzaXplX3Qga051bU9mU3JjQ2hhbm5lbHMgPSAyOworICBjb25zdCBzaXplX3Qga051bU9mRGVzdENoYW5uZWxzID0gMTsKKyAgY29uc3Qgc2l6ZV90IGtOdW1PZkZyYW1lcyA9IDI1OworICBjb25zdCBBdWRpb05vZGVDaGFubmVsSW50ZXJwcmV0YXRpb24ga0ludGVycHJldGF0aW9uID0KICAgICAgIGtBdWRpb05vZGVDaGFubmVsSW50ZXJwcmV0YXRpb25TcGVha2VyczsKIAogICBmbG9hdCBzcmNfZGF0YV9pbl9mbG9hdFs1MF07Ci0gIGZvciAoc2l6ZV90IGMgPSAwOyBjIDwgbnVtX29mX3NyY19jaGFubmVsOyArK2MpIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bV9vZl9mcmFtZXM7ICsraSkgewotICAgICAgc3JjX2RhdGFfaW5fZmxvYXRbYyAqIG51bV9vZl9mcmFtZXMgKyBpXSA9IDIwLjBmICogKGMgKyAxKTsKKyAgZm9yIChzaXplX3QgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBrTnVtT2ZTcmNDaGFubmVsczsgKytjaGFubmVsKSB7CisgICAgZm9yIChzaXplX3QgZnJhbWUgPSAwOyBmcmFtZSA8IGtOdW1PZkZyYW1lczsgKytmcmFtZSkgeworICAgICAgc3JjX2RhdGFfaW5fZmxvYXRbZnJhbWUgKiBrTnVtT2ZTcmNDaGFubmVscyArIGNoYW5uZWxdID0KKyAgICAgICAgICAyMC4wZiAqIChjaGFubmVsICsgMSk7CiAgICAgfQogICB9CiAKLSAgc2NvcGVkX2FycmF5PHVpbnQ4PiBzcmNfZGF0YShuZXcgdWludDhbMjAwXSk7Ci0gIHVpbnQ4KiBzcmNfYnVmZmVyID0gc3JjX2RhdGEuZ2V0KCk7Ci0gIG1lbWNweShzcmNfYnVmZmVyLCBzcmNfZGF0YV9pbl9mbG9hdCwgMjAwICogc2l6ZW9mKHVpbnQ4KSk7CisgIHNjb3BlZF9wdHI8U2hlbGxBdWRpb0J1cz4gc3JjX2RhdGEoCisgICAgICBuZXcgU2hlbGxBdWRpb0J1cyhrTnVtT2ZTcmNDaGFubmVscywga051bU9mRnJhbWVzLCBzcmNfZGF0YV9pbl9mbG9hdCkpOwogCiAgIHNjb3BlZF9wdHI8U2hlbGxBdWRpb0J1cz4gYXVkaW9fYnVzKAotICAgICAgbmV3IFNoZWxsQXVkaW9CdXMobnVtX29mX2Rlc3RfY2hhbm5lbCwga1JlbmRlckJ1ZmZlclNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBTaGVsbEF1ZGlvQnVzOjprRmxvYXQzMiwgU2hlbGxBdWRpb0J1czo6a1BsYW5hcikpOworICAgICAgbmV3IFNoZWxsQXVkaW9CdXMoa051bU9mRGVzdENoYW5uZWxzLCBrUmVuZGVyQnVmZmVyU2l6ZUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgIFNoZWxsQXVkaW9CdXM6OmtGbG9hdDMyLCBTaGVsbEF1ZGlvQnVzOjprSW50ZXJsZWF2ZWQpKTsKICAgYXVkaW9fYnVzLT5aZXJvQWxsRnJhbWVzKCk7CiAgIGJvb2wgc2lsZW5jZSA9IHRydWU7Ci0gIEZpbGxBdWRpb0J1c0Zyb21PbmVTb3VyY2UobnVtX29mX3NyY19jaGFubmVsLCBudW1fb2ZfZnJhbWVzLCBzcmNfZGF0YS5QYXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwcmV0YXRpb24sIGF1ZGlvX2J1cy5nZXQoKSwgJnNpbGVuY2UpOworICBGaWxsQXVkaW9CdXNGcm9tT25lU291cmNlKHNyY19kYXRhLlBhc3MoKSwga0ludGVycHJldGF0aW9uLCBhdWRpb19idXMuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpbGVuY2UpOwogICBFWFBFQ1RfRkFMU0Uoc2lsZW5jZSk7CiAKLSAgZm9yIChzaXplX3QgYyA9IDA7IGMgPCBudW1fb2ZfZGVzdF9jaGFubmVsOyArK2MpIHsKKyAgZm9yIChzaXplX3QgYyA9IDA7IGMgPCBrTnVtT2ZEZXN0Q2hhbm5lbHM7ICsrYykgewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga1JlbmRlckJ1ZmZlclNpemVGcmFtZXM7ICsraSkgewotICAgICAgaWYgKGkgPCBudW1fb2ZfZnJhbWVzKSB7CisgICAgICBpZiAoaSA8IGtOdW1PZkZyYW1lcykgewogICAgICAgICBFWFBFQ1RfRVEoYXVkaW9fYnVzLT5HZXRGbG9hdDMyU2FtcGxlKGMsIGkpLCAzMCk7CiAgICAgICB9IGVsc2UgewogICAgICAgICBFWFBFQ1RfRVEoYXVkaW9fYnVzLT5HZXRGbG9hdDMyU2FtcGxlKGMsIGkpLCAwKTsKQEAgLTQ1MSwzNSArNDUwLDM1IEBACiB9CiAKIFRFU1RfRihBdWRpb05vZGVJbnB1dE91dHB1dFRlc3QsIFN0ZXJlb1RvTW9ub0Rpc2NyZXRlTGF5b3V0VGVzdCkgewotICBzaXplX3QgbnVtX29mX3NyY19jaGFubmVsID0gMjsKLSAgc2l6ZV90IG51bV9vZl9kZXN0X2NoYW5uZWwgPSAxOwotICBzaXplX3QgbnVtX29mX2ZyYW1lcyA9IDI1OwotICBBdWRpb05vZGVDaGFubmVsSW50ZXJwcmV0YXRpb24gaW50ZXJwcmV0YXRpb24gPQorICBjb25zdCBzaXplX3Qga051bU9mU3JjQ2hhbm5lbHMgPSAyOworICBjb25zdCBzaXplX3Qga051bU9mRGVzdENoYW5uZWxzID0gMTsKKyAgY29uc3Qgc2l6ZV90IGtOdW1PZkZyYW1lcyA9IDI1OworICBjb25zdCBBdWRpb05vZGVDaGFubmVsSW50ZXJwcmV0YXRpb24ga0ludGVycHJldGF0aW9uID0KICAgICAgIGtBdWRpb05vZGVDaGFubmVsSW50ZXJwcmV0YXRpb25EaXNjcmV0ZTsKIAogICBmbG9hdCBzcmNfZGF0YV9pbl9mbG9hdFs1MF07Ci0gIGZvciAoc2l6ZV90IGMgPSAwOyBjIDwgbnVtX29mX3NyY19jaGFubmVsOyArK2MpIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bV9vZl9mcmFtZXM7ICsraSkgewotICAgICAgc3JjX2RhdGFfaW5fZmxvYXRbYyAqIG51bV9vZl9mcmFtZXMgKyBpXSA9IDIwLjBmICogKGMgKyAxKTsKKyAgZm9yIChzaXplX3QgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBrTnVtT2ZTcmNDaGFubmVsczsgKytjaGFubmVsKSB7CisgICAgZm9yIChzaXplX3QgZnJhbWUgPSAwOyBmcmFtZSA8IGtOdW1PZkZyYW1lczsgKytmcmFtZSkgeworICAgICAgc3JjX2RhdGFfaW5fZmxvYXRbZnJhbWUgKiBrTnVtT2ZTcmNDaGFubmVscyArIGNoYW5uZWxdID0KKyAgICAgICAgICAyMC4wZiAqIChjaGFubmVsICsgMSk7CiAgICAgfQogICB9CiAKLSAgc2NvcGVkX2FycmF5PHVpbnQ4PiBzcmNfZGF0YShuZXcgdWludDhbMjAwXSk7Ci0gIHVpbnQ4KiBzcmNfYnVmZmVyID0gc3JjX2RhdGEuZ2V0KCk7Ci0gIG1lbWNweShzcmNfYnVmZmVyLCBzcmNfZGF0YV9pbl9mbG9hdCwgMjAwICogc2l6ZW9mKHVpbnQ4KSk7CisgIHNjb3BlZF9wdHI8U2hlbGxBdWRpb0J1cz4gc3JjX2RhdGEoCisgICAgICBuZXcgU2hlbGxBdWRpb0J1cyhrTnVtT2ZTcmNDaGFubmVscywga051bU9mRnJhbWVzLCBzcmNfZGF0YV9pbl9mbG9hdCkpOwogCiAgIHNjb3BlZF9wdHI8U2hlbGxBdWRpb0J1cz4gYXVkaW9fYnVzKAotICAgICAgbmV3IFNoZWxsQXVkaW9CdXMobnVtX29mX2Rlc3RfY2hhbm5lbCwga1JlbmRlckJ1ZmZlclNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBTaGVsbEF1ZGlvQnVzOjprRmxvYXQzMiwgU2hlbGxBdWRpb0J1czo6a1BsYW5hcikpOworICAgICAgbmV3IFNoZWxsQXVkaW9CdXMoa051bU9mRGVzdENoYW5uZWxzLCBrUmVuZGVyQnVmZmVyU2l6ZUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgIFNoZWxsQXVkaW9CdXM6OmtGbG9hdDMyLCBTaGVsbEF1ZGlvQnVzOjprSW50ZXJsZWF2ZWQpKTsKICAgYXVkaW9fYnVzLT5aZXJvQWxsRnJhbWVzKCk7CiAgIGJvb2wgc2lsZW5jZSA9IHRydWU7Ci0gIEZpbGxBdWRpb0J1c0Zyb21PbmVTb3VyY2UobnVtX29mX3NyY19jaGFubmVsLCBudW1fb2ZfZnJhbWVzLCBzcmNfZGF0YS5QYXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwcmV0YXRpb24sIGF1ZGlvX2J1cy5nZXQoKSwgJnNpbGVuY2UpOworICBGaWxsQXVkaW9CdXNGcm9tT25lU291cmNlKHNyY19kYXRhLlBhc3MoKSwga0ludGVycHJldGF0aW9uLCBhdWRpb19idXMuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpbGVuY2UpOwogICBFWFBFQ1RfRkFMU0Uoc2lsZW5jZSk7CiAKLSAgZm9yIChzaXplX3QgYyA9IDA7IGMgPCBudW1fb2ZfZGVzdF9jaGFubmVsOyArK2MpIHsKKyAgZm9yIChzaXplX3QgYyA9IDA7IGMgPCBrTnVtT2ZEZXN0Q2hhbm5lbHM7ICsrYykgewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga1JlbmRlckJ1ZmZlclNpemVGcmFtZXM7ICsraSkgewotICAgICAgaWYgKGkgPCBudW1fb2ZfZnJhbWVzKSB7CisgICAgICBpZiAoaSA8IGtOdW1PZkZyYW1lcykgewogICAgICAgICBFWFBFQ1RfRVEoYXVkaW9fYnVzLT5HZXRGbG9hdDMyU2FtcGxlKGMsIGkpLCAyMCk7CiAgICAgICB9IGVsc2UgewogICAgICAgICBFWFBFQ1RfRVEoYXVkaW9fYnVzLT5HZXRGbG9hdDMyU2FtcGxlKGMsIGkpLCAwKTsKQEAgLTQ4OSwzNSArNDg4LDM1IEBACiB9CiAKIFRFU1RfRihBdWRpb05vZGVJbnB1dE91dHB1dFRlc3QsIFF1YWRUb01vbm9TcGVha2Vyc0xheW91dFRlc3QpIHsKLSAgc2l6ZV90IG51bV9vZl9zcmNfY2hhbm5lbCA9IDQ7Ci0gIHNpemVfdCBudW1fb2ZfZGVzdF9jaGFubmVsID0gMTsKLSAgc2l6ZV90IG51bV9vZl9mcmFtZXMgPSAyNTsKLSAgQXVkaW9Ob2RlQ2hhbm5lbEludGVycHJldGF0aW9uIGludGVycHJldGF0aW9uID0KKyAgY29uc3Qgc2l6ZV90IGtOdW1PZlNyY0NoYW5uZWxzID0gNDsKKyAgY29uc3Qgc2l6ZV90IGtOdW1PZkRlc3RDaGFubmVscyA9IDE7CisgIGNvbnN0IHNpemVfdCBrTnVtT2ZGcmFtZXMgPSAyNTsKKyAgY29uc3QgQXVkaW9Ob2RlQ2hhbm5lbEludGVycHJldGF0aW9uIGtJbnRlcnByZXRhdGlvbiA9CiAgICAgICBrQXVkaW9Ob2RlQ2hhbm5lbEludGVycHJldGF0aW9uU3BlYWtlcnM7CiAKICAgZmxvYXQgc3JjX2RhdGFfaW5fZmxvYXRbMTAwXTsKLSAgZm9yIChzaXplX3QgYyA9IDA7IGMgPCBudW1fb2Zfc3JjX2NoYW5uZWw7ICsrYykgewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtX29mX2ZyYW1lczsgKytpKSB7Ci0gICAgICBzcmNfZGF0YV9pbl9mbG9hdFtjICogbnVtX29mX2ZyYW1lcyArIGldID0gMTAuMGYgKiAoYyArIDEpOworICBmb3IgKHNpemVfdCBjaGFubmVsID0gMDsgY2hhbm5lbCA8IGtOdW1PZlNyY0NoYW5uZWxzOyArK2NoYW5uZWwpIHsKKyAgICBmb3IgKHNpemVfdCBmcmFtZSA9IDA7IGZyYW1lIDwga051bU9mRnJhbWVzOyArK2ZyYW1lKSB7CisgICAgICBzcmNfZGF0YV9pbl9mbG9hdFtmcmFtZSAqIGtOdW1PZlNyY0NoYW5uZWxzICsgY2hhbm5lbF0gPQorICAgICAgICAgIDEwLjBmICogKGNoYW5uZWwgKyAxKTsKICAgICB9CiAgIH0KIAotICBzY29wZWRfYXJyYXk8dWludDg+IHNyY19kYXRhKG5ldyB1aW50OFs0MDBdKTsKLSAgdWludDgqIHNyY19idWZmZXIgPSBzcmNfZGF0YS5nZXQoKTsKLSAgbWVtY3B5KHNyY19idWZmZXIsIHNyY19kYXRhX2luX2Zsb2F0LCA0MDAgKiBzaXplb2YodWludDgpKTsKKyAgc2NvcGVkX3B0cjxTaGVsbEF1ZGlvQnVzPiBzcmNfZGF0YSgKKyAgICAgIG5ldyBTaGVsbEF1ZGlvQnVzKGtOdW1PZlNyY0NoYW5uZWxzLCBrTnVtT2ZGcmFtZXMsIHNyY19kYXRhX2luX2Zsb2F0KSk7CiAKICAgc2NvcGVkX3B0cjxTaGVsbEF1ZGlvQnVzPiBhdWRpb19idXMoCi0gICAgICBuZXcgU2hlbGxBdWRpb0J1cyhudW1fb2ZfZGVzdF9jaGFubmVsLCBrUmVuZGVyQnVmZmVyU2l6ZUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgIFNoZWxsQXVkaW9CdXM6OmtGbG9hdDMyLCBTaGVsbEF1ZGlvQnVzOjprUGxhbmFyKSk7CisgICAgICBuZXcgU2hlbGxBdWRpb0J1cyhrTnVtT2ZEZXN0Q2hhbm5lbHMsIGtSZW5kZXJCdWZmZXJTaXplRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgU2hlbGxBdWRpb0J1czo6a0Zsb2F0MzIsIFNoZWxsQXVkaW9CdXM6OmtJbnRlcmxlYXZlZCkpOwogICBhdWRpb19idXMtPlplcm9BbGxGcmFtZXMoKTsKICAgYm9vbCBzaWxlbmNlID0gdHJ1ZTsKLSAgRmlsbEF1ZGlvQnVzRnJvbU9uZVNvdXJjZShudW1fb2Zfc3JjX2NoYW5uZWwsIG51bV9vZl9mcmFtZXMsIHNyY19kYXRhLlBhc3MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnByZXRhdGlvbiwgYXVkaW9fYnVzLmdldCgpLCAmc2lsZW5jZSk7CisgIEZpbGxBdWRpb0J1c0Zyb21PbmVTb3VyY2Uoc3JjX2RhdGEuUGFzcygpLCBrSW50ZXJwcmV0YXRpb24sIGF1ZGlvX2J1cy5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2lsZW5jZSk7CiAgIEVYUEVDVF9GQUxTRShzaWxlbmNlKTsKIAotICBmb3IgKHNpemVfdCBjID0gMDsgYyA8IG51bV9vZl9kZXN0X2NoYW5uZWw7ICsrYykgeworICBmb3IgKHNpemVfdCBjID0gMDsgYyA8IGtOdW1PZkRlc3RDaGFubmVsczsgKytjKSB7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrUmVuZGVyQnVmZmVyU2l6ZUZyYW1lczsgKytpKSB7Ci0gICAgICBpZiAoaSA8IG51bV9vZl9mcmFtZXMpIHsKKyAgICAgIGlmIChpIDwga051bU9mRnJhbWVzKSB7CiAgICAgICAgIEVYUEVDVF9FUShhdWRpb19idXMtPkdldEZsb2F0MzJTYW1wbGUoYywgaSksIDI1KTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIEVYUEVDVF9FUShhdWRpb19idXMtPkdldEZsb2F0MzJTYW1wbGUoYywgaSksIDApOwpAQCAtNTI3LDM1ICs1MjYsMzUgQEAKIH0KIAogVEVTVF9GKEF1ZGlvTm9kZUlucHV0T3V0cHV0VGVzdCwgUXVhZFRvTW9ub0Rpc2NyZXRlTGF5b3V0VGVzdCkgewotICBzaXplX3QgbnVtX29mX3NyY19jaGFubmVsID0gNDsKLSAgc2l6ZV90IG51bV9vZl9kZXN0X2NoYW5uZWwgPSAxOwotICBzaXplX3QgbnVtX29mX2ZyYW1lcyA9IDI1OwotICBBdWRpb05vZGVDaGFubmVsSW50ZXJwcmV0YXRpb24gaW50ZXJwcmV0YXRpb24gPQorICBjb25zdCBzaXplX3Qga051bU9mU3JjQ2hhbm5lbHMgPSA0OworICBjb25zdCBzaXplX3Qga051bU9mRGVzdENoYW5uZWxzID0gMTsKKyAgY29uc3Qgc2l6ZV90IGtOdW1PZkZyYW1lcyA9IDI1OworICBjb25zdCBBdWRpb05vZGVDaGFubmVsSW50ZXJwcmV0YXRpb24ga0ludGVycHJldGF0aW9uID0KICAgICAgIGtBdWRpb05vZGVDaGFubmVsSW50ZXJwcmV0YXRpb25EaXNjcmV0ZTsKIAogICBmbG9hdCBzcmNfZGF0YV9pbl9mbG9hdFsxMDBdOwotICBmb3IgKHNpemVfdCBjID0gMDsgYyA8IG51bV9vZl9zcmNfY2hhbm5lbDsgKytjKSB7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1fb2ZfZnJhbWVzOyArK2kpIHsKLSAgICAgIHNyY19kYXRhX2luX2Zsb2F0W2MgKiBudW1fb2ZfZnJhbWVzICsgaV0gPSAxMC4wZiAqIChjICsgMSk7CisgIGZvciAoc2l6ZV90IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwga051bU9mU3JjQ2hhbm5lbHM7ICsrY2hhbm5lbCkgeworICAgIGZvciAoc2l6ZV90IGZyYW1lID0gMDsgZnJhbWUgPCBrTnVtT2ZGcmFtZXM7ICsrZnJhbWUpIHsKKyAgICAgIHNyY19kYXRhX2luX2Zsb2F0W2ZyYW1lICoga051bU9mU3JjQ2hhbm5lbHMgKyBjaGFubmVsXSA9CisgICAgICAgICAgMTAuMGYgKiAoY2hhbm5lbCArIDEpOwogICAgIH0KICAgfQogCi0gIHNjb3BlZF9hcnJheTx1aW50OD4gc3JjX2RhdGEobmV3IHVpbnQ4WzQwMF0pOwotICB1aW50OCogc3JjX2J1ZmZlciA9IHNyY19kYXRhLmdldCgpOwotICBtZW1jcHkoc3JjX2J1ZmZlciwgc3JjX2RhdGFfaW5fZmxvYXQsIDQwMCAqIHNpemVvZih1aW50OCkpOworICBzY29wZWRfcHRyPFNoZWxsQXVkaW9CdXM+IHNyY19kYXRhKAorICAgICAgbmV3IFNoZWxsQXVkaW9CdXMoa051bU9mU3JjQ2hhbm5lbHMsIGtOdW1PZkZyYW1lcywgc3JjX2RhdGFfaW5fZmxvYXQpKTsKIAogICBzY29wZWRfcHRyPFNoZWxsQXVkaW9CdXM+IGF1ZGlvX2J1cygKLSAgICAgIG5ldyBTaGVsbEF1ZGlvQnVzKG51bV9vZl9kZXN0X2NoYW5uZWwsIGtSZW5kZXJCdWZmZXJTaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgU2hlbGxBdWRpb0J1czo6a0Zsb2F0MzIsIFNoZWxsQXVkaW9CdXM6OmtQbGFuYXIpKTsKKyAgICAgIG5ldyBTaGVsbEF1ZGlvQnVzKGtOdW1PZkRlc3RDaGFubmVscywga1JlbmRlckJ1ZmZlclNpemVGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBTaGVsbEF1ZGlvQnVzOjprRmxvYXQzMiwgU2hlbGxBdWRpb0J1czo6a0ludGVybGVhdmVkKSk7CiAgIGF1ZGlvX2J1cy0+WmVyb0FsbEZyYW1lcygpOwogICBib29sIHNpbGVuY2UgPSB0cnVlOwotICBGaWxsQXVkaW9CdXNGcm9tT25lU291cmNlKG51bV9vZl9zcmNfY2hhbm5lbCwgbnVtX29mX2ZyYW1lcywgc3JjX2RhdGEuUGFzcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycHJldGF0aW9uLCBhdWRpb19idXMuZ2V0KCksICZzaWxlbmNlKTsKKyAgRmlsbEF1ZGlvQnVzRnJvbU9uZVNvdXJjZShzcmNfZGF0YS5QYXNzKCksIGtJbnRlcnByZXRhdGlvbiwgYXVkaW9fYnVzLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaWxlbmNlKTsKICAgRVhQRUNUX0ZBTFNFKHNpbGVuY2UpOwogCi0gIGZvciAoc2l6ZV90IGMgPSAwOyBjIDwgbnVtX29mX2Rlc3RfY2hhbm5lbDsgKytjKSB7CisgIGZvciAoc2l6ZV90IGMgPSAwOyBjIDwga051bU9mRGVzdENoYW5uZWxzOyArK2MpIHsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtSZW5kZXJCdWZmZXJTaXplRnJhbWVzOyArK2kpIHsKLSAgICAgIGlmIChpIDwgbnVtX29mX2ZyYW1lcykgeworICAgICAgaWYgKGkgPCBrTnVtT2ZGcmFtZXMpIHsKICAgICAgICAgRVhQRUNUX0VRKGF1ZGlvX2J1cy0+R2V0RmxvYXQzMlNhbXBsZShjLCBpKSwgMTApOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgRVhQRUNUX0VRKGF1ZGlvX2J1cy0+R2V0RmxvYXQzMlNhbXBsZShjLCBpKSwgMCk7CkBAIC01NjUsMzUgKzU2NCwzNSBAQAogfQogCiBURVNUX0YoQXVkaW9Ob2RlSW5wdXRPdXRwdXRUZXN0LCBGaXZlUG9pbnRPbmVUb01vbm9TcGVha2Vyc0xheW91dFRlc3QpIHsKLSAgc2l6ZV90IG51bV9vZl9zcmNfY2hhbm5lbCA9IDY7Ci0gIHNpemVfdCBudW1fb2ZfZGVzdF9jaGFubmVsID0gMTsKLSAgc2l6ZV90IG51bV9vZl9mcmFtZXMgPSAxMDsKLSAgQXVkaW9Ob2RlQ2hhbm5lbEludGVycHJldGF0aW9uIGludGVycHJldGF0aW9uID0KKyAgY29uc3Qgc2l6ZV90IGtOdW1PZlNyY0NoYW5uZWxzID0gNjsKKyAgY29uc3Qgc2l6ZV90IGtOdW1PZkRlc3RDaGFubmVscyA9IDE7CisgIGNvbnN0IHNpemVfdCBrTnVtT2ZGcmFtZXMgPSAxMDsKKyAgY29uc3QgQXVkaW9Ob2RlQ2hhbm5lbEludGVycHJldGF0aW9uIGtJbnRlcnByZXRhdGlvbiA9CiAgICAgICBrQXVkaW9Ob2RlQ2hhbm5lbEludGVycHJldGF0aW9uU3BlYWtlcnM7CiAKICAgZmxvYXQgc3JjX2RhdGFfaW5fZmxvYXRbNjBdOwotICBmb3IgKHNpemVfdCBjID0gMDsgYyA8IG51bV9vZl9zcmNfY2hhbm5lbDsgKytjKSB7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1fb2ZfZnJhbWVzOyArK2kpIHsKLSAgICAgIHNyY19kYXRhX2luX2Zsb2F0W2MgKiBudW1fb2ZfZnJhbWVzICsgaV0gPSAxMC4wZiAqIChjICsgMSk7CisgIGZvciAoc2l6ZV90IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwga051bU9mU3JjQ2hhbm5lbHM7ICsrY2hhbm5lbCkgeworICAgIGZvciAoc2l6ZV90IGZyYW1lID0gMDsgZnJhbWUgPCBrTnVtT2ZGcmFtZXM7ICsrZnJhbWUpIHsKKyAgICAgIHNyY19kYXRhX2luX2Zsb2F0W2ZyYW1lICoga051bU9mU3JjQ2hhbm5lbHMgKyBjaGFubmVsXSA9CisgICAgICAgICAgMTAuMGYgKiAoY2hhbm5lbCArIDEpOwogICAgIH0KICAgfQogCi0gIHNjb3BlZF9hcnJheTx1aW50OD4gc3JjX2RhdGEobmV3IHVpbnQ4WzI0MF0pOwotICB1aW50OCogc3JjX2J1ZmZlciA9IHNyY19kYXRhLmdldCgpOwotICBtZW1jcHkoc3JjX2J1ZmZlciwgc3JjX2RhdGFfaW5fZmxvYXQsIDI0MCAqIHNpemVvZih1aW50OCkpOworICBzY29wZWRfcHRyPFNoZWxsQXVkaW9CdXM+IHNyY19kYXRhKAorICAgICAgbmV3IFNoZWxsQXVkaW9CdXMoa051bU9mU3JjQ2hhbm5lbHMsIGtOdW1PZkZyYW1lcywgc3JjX2RhdGFfaW5fZmxvYXQpKTsKIAogICBzY29wZWRfcHRyPFNoZWxsQXVkaW9CdXM+IGF1ZGlvX2J1cygKLSAgICAgIG5ldyBTaGVsbEF1ZGlvQnVzKG51bV9vZl9kZXN0X2NoYW5uZWwsIGtSZW5kZXJCdWZmZXJTaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgU2hlbGxBdWRpb0J1czo6a0Zsb2F0MzIsIFNoZWxsQXVkaW9CdXM6OmtQbGFuYXIpKTsKKyAgICAgIG5ldyBTaGVsbEF1ZGlvQnVzKGtOdW1PZkRlc3RDaGFubmVscywga1JlbmRlckJ1ZmZlclNpemVGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBTaGVsbEF1ZGlvQnVzOjprRmxvYXQzMiwgU2hlbGxBdWRpb0J1czo6a0ludGVybGVhdmVkKSk7CiAgIGF1ZGlvX2J1cy0+WmVyb0FsbEZyYW1lcygpOwogICBib29sIHNpbGVuY2UgPSB0cnVlOwotICBGaWxsQXVkaW9CdXNGcm9tT25lU291cmNlKG51bV9vZl9zcmNfY2hhbm5lbCwgbnVtX29mX2ZyYW1lcywgc3JjX2RhdGEuUGFzcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycHJldGF0aW9uLCBhdWRpb19idXMuZ2V0KCksICZzaWxlbmNlKTsKKyAgRmlsbEF1ZGlvQnVzRnJvbU9uZVNvdXJjZShzcmNfZGF0YS5QYXNzKCksIGtJbnRlcnByZXRhdGlvbiwgYXVkaW9fYnVzLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaWxlbmNlKTsKICAgRVhQRUNUX0ZBTFNFKHNpbGVuY2UpOwogCi0gIGZvciAoc2l6ZV90IGMgPSAwOyBjIDwgbnVtX29mX2Rlc3RfY2hhbm5lbDsgKytjKSB7CisgIGZvciAoc2l6ZV90IGMgPSAwOyBjIDwga051bU9mRGVzdENoYW5uZWxzOyArK2MpIHsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtSZW5kZXJCdWZmZXJTaXplRnJhbWVzOyArK2kpIHsKLSAgICAgIGlmIChpIDwgbnVtX29mX2ZyYW1lcykgeworICAgICAgaWYgKGkgPCBrTnVtT2ZGcmFtZXMpIHsKICAgICAgICAgRVhQRUNUX0ZMT0FUX0VRKGF1ZGlvX2J1cy0+R2V0RmxvYXQzMlNhbXBsZShjLCBpKSwgMTA2LjIxM2YpOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgRVhQRUNUX0VRKGF1ZGlvX2J1cy0+R2V0RmxvYXQzMlNhbXBsZShjLCBpKSwgMCk7CkBAIC02MDMsMzUgKzYwMiwzNSBAQAogfQogCiBURVNUX0YoQXVkaW9Ob2RlSW5wdXRPdXRwdXRUZXN0LCBGaXZlUG9pbnRPbmVUb01vbm9EaXNjcmV0ZUxheW91dFRlc3QpIHsKLSAgc2l6ZV90IG51bV9vZl9zcmNfY2hhbm5lbCA9IDY7Ci0gIHNpemVfdCBudW1fb2ZfZGVzdF9jaGFubmVsID0gMTsKLSAgc2l6ZV90IG51bV9vZl9mcmFtZXMgPSAxMDsKLSAgQXVkaW9Ob2RlQ2hhbm5lbEludGVycHJldGF0aW9uIGludGVycHJldGF0aW9uID0KKyAgY29uc3Qgc2l6ZV90IGtOdW1PZlNyY0NoYW5uZWxzID0gNjsKKyAgY29uc3Qgc2l6ZV90IGtOdW1PZkRlc3RDaGFubmVscyA9IDE7CisgIGNvbnN0IHNpemVfdCBrTnVtT2ZGcmFtZXMgPSAxMDsKKyAgY29uc3QgQXVkaW9Ob2RlQ2hhbm5lbEludGVycHJldGF0aW9uIGtJbnRlcnByZXRhdGlvbiA9CiAgICAgICBrQXVkaW9Ob2RlQ2hhbm5lbEludGVycHJldGF0aW9uRGlzY3JldGU7CiAKICAgZmxvYXQgc3JjX2RhdGFfaW5fZmxvYXRbNjBdOwotICBmb3IgKHNpemVfdCBjID0gMDsgYyA8IG51bV9vZl9zcmNfY2hhbm5lbDsgKytjKSB7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1fb2ZfZnJhbWVzOyArK2kpIHsKLSAgICAgIHNyY19kYXRhX2luX2Zsb2F0W2MgKiBudW1fb2ZfZnJhbWVzICsgaV0gPSAxMC4wZiAqIChjICsgMSk7CisgIGZvciAoc2l6ZV90IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwga051bU9mU3JjQ2hhbm5lbHM7ICsrY2hhbm5lbCkgeworICAgIGZvciAoc2l6ZV90IGZyYW1lID0gMDsgZnJhbWUgPCBrTnVtT2ZGcmFtZXM7ICsrZnJhbWUpIHsKKyAgICAgIHNyY19kYXRhX2luX2Zsb2F0W2ZyYW1lICoga051bU9mU3JjQ2hhbm5lbHMgKyBjaGFubmVsXSA9CisgICAgICAgICAgMTAuMGYgKiAoY2hhbm5lbCArIDEpOwogICAgIH0KICAgfQogCi0gIHNjb3BlZF9hcnJheTx1aW50OD4gc3JjX2RhdGEobmV3IHVpbnQ4WzI0MF0pOwotICB1aW50OCogc3JjX2J1ZmZlciA9IHNyY19kYXRhLmdldCgpOwotICBtZW1jcHkoc3JjX2J1ZmZlciwgc3JjX2RhdGFfaW5fZmxvYXQsIDI0MCAqIHNpemVvZih1aW50OCkpOworICBzY29wZWRfcHRyPFNoZWxsQXVkaW9CdXM+IHNyY19kYXRhKAorICAgICAgbmV3IFNoZWxsQXVkaW9CdXMoa051bU9mU3JjQ2hhbm5lbHMsIGtOdW1PZkZyYW1lcywgc3JjX2RhdGFfaW5fZmxvYXQpKTsKIAogICBzY29wZWRfcHRyPFNoZWxsQXVkaW9CdXM+IGF1ZGlvX2J1cygKLSAgICAgIG5ldyBTaGVsbEF1ZGlvQnVzKG51bV9vZl9kZXN0X2NoYW5uZWwsIGtSZW5kZXJCdWZmZXJTaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgU2hlbGxBdWRpb0J1czo6a0Zsb2F0MzIsIFNoZWxsQXVkaW9CdXM6OmtQbGFuYXIpKTsKKyAgICAgIG5ldyBTaGVsbEF1ZGlvQnVzKGtOdW1PZkRlc3RDaGFubmVscywga1JlbmRlckJ1ZmZlclNpemVGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBTaGVsbEF1ZGlvQnVzOjprRmxvYXQzMiwgU2hlbGxBdWRpb0J1czo6a0ludGVybGVhdmVkKSk7CiAgIGF1ZGlvX2J1cy0+WmVyb0FsbEZyYW1lcygpOwogICBib29sIHNpbGVuY2UgPSB0cnVlOwotICBGaWxsQXVkaW9CdXNGcm9tT25lU291cmNlKG51bV9vZl9zcmNfY2hhbm5lbCwgbnVtX29mX2ZyYW1lcywgc3JjX2RhdGEuUGFzcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycHJldGF0aW9uLCBhdWRpb19idXMuZ2V0KCksICZzaWxlbmNlKTsKKyAgRmlsbEF1ZGlvQnVzRnJvbU9uZVNvdXJjZShzcmNfZGF0YS5QYXNzKCksIGtJbnRlcnByZXRhdGlvbiwgYXVkaW9fYnVzLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaWxlbmNlKTsKICAgRVhQRUNUX0ZBTFNFKHNpbGVuY2UpOwogCi0gIGZvciAoc2l6ZV90IGMgPSAwOyBjIDwgbnVtX29mX2Rlc3RfY2hhbm5lbDsgKytjKSB7CisgIGZvciAoc2l6ZV90IGMgPSAwOyBjIDwga051bU9mRGVzdENoYW5uZWxzOyArK2MpIHsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtSZW5kZXJCdWZmZXJTaXplRnJhbWVzOyArK2kpIHsKLSAgICAgIGlmIChpIDwgbnVtX29mX2ZyYW1lcykgeworICAgICAgaWYgKGkgPCBrTnVtT2ZGcmFtZXMpIHsKICAgICAgICAgRVhQRUNUX0VRKGF1ZGlvX2J1cy0+R2V0RmxvYXQzMlNhbXBsZShjLCBpKSwgMTApOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgRVhQRUNUX0VRKGF1ZGlvX2J1cy0+R2V0RmxvYXQzMlNhbXBsZShjLCBpKSwgMCk7CkBAIC02NDMsNzIgKzY0Miw3MCBAQAogVEVTVF9GKEF1ZGlvTm9kZUlucHV0T3V0cHV0VGVzdCwgTXVsdGlwbGVJbnB1dE5vZGVzTGF5b3V0VGVzdCkgewogICBzY29wZWRfcmVmcHRyPEF1ZGlvQ29udGV4dD4gYXVkaW9fY29udGV4dChuZXcgQXVkaW9Db250ZXh0KCkpOwogCi0gIHNpemVfdCBudW1fb2Zfc3JjX2NoYW5uZWwgPSAyOwotICBzaXplX3QgbnVtX29mX2Rlc3RfY2hhbm5lbCA9IDI7Ci0gIEF1ZGlvTm9kZUNoYW5uZWxJbnRlcnByZXRhdGlvbiBpbnRlcnByZXRhdGlvbiA9CisgIGNvbnN0IHNpemVfdCBrTnVtT2ZTcmNDaGFubmVscyA9IDI7CisgIGNvbnN0IHNpemVfdCBrTnVtT2ZEZXN0Q2hhbm5lbHMgPSAyOworICBjb25zdCBBdWRpb05vZGVDaGFubmVsSW50ZXJwcmV0YXRpb24ga0ludGVycHJldGF0aW9uID0KICAgICAgIGtBdWRpb05vZGVDaGFubmVsSW50ZXJwcmV0YXRpb25TcGVha2VyczsKIAotICBzaXplX3QgbnVtX29mX2ZyYW1lc18xID0gMjU7CisgIGNvbnN0IHNpemVfdCBrTnVtT2ZGcmFtZXNfMSA9IDI1OwogICBmbG9hdCBzcmNfZGF0YV9pbl9mbG9hdF8xWzUwXTsKLSAgZm9yIChzaXplX3QgYyA9IDA7IGMgPCBudW1fb2Zfc3JjX2NoYW5uZWw7ICsrYykgewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtX29mX2ZyYW1lc18xOyArK2kpIHsKLSAgICAgIHNyY19kYXRhX2luX2Zsb2F0XzFbYyAqIG51bV9vZl9mcmFtZXNfMSArIGldID0gMjAuMGYgKiAoYyArIDEpOworICBmb3IgKHNpemVfdCBjaGFubmVsID0gMDsgY2hhbm5lbCA8IGtOdW1PZlNyY0NoYW5uZWxzOyArK2NoYW5uZWwpIHsKKyAgICBmb3IgKHNpemVfdCBmcmFtZSA9IDA7IGZyYW1lIDwga051bU9mRnJhbWVzXzE7ICsrZnJhbWUpIHsKKyAgICAgIHNyY19kYXRhX2luX2Zsb2F0XzFbZnJhbWUgKiBrTnVtT2ZTcmNDaGFubmVscyArIGNoYW5uZWxdID0KKyAgICAgICAgICAyMC4wZiAqIChjaGFubmVsICsgMSk7CiAgICAgfQogICB9Ci0gIHNjb3BlZF9hcnJheTx1aW50OD4gc3JjX2RhdGFfMShuZXcgdWludDhbMjAwXSk7Ci0gIHVpbnQ4KiBzcmNfYnVmZmVyXzEgPSBzcmNfZGF0YV8xLmdldCgpOwotICBtZW1jcHkoc3JjX2J1ZmZlcl8xLCBzcmNfZGF0YV9pbl9mbG9hdF8xLCAyMDAgKiBzaXplb2YodWludDgpKTsKKworICBzY29wZWRfcHRyPFNoZWxsQXVkaW9CdXM+IHNyY19kYXRhXzEobmV3IFNoZWxsQXVkaW9CdXMoCisgICAgICBrTnVtT2ZTcmNDaGFubmVscywga051bU9mRnJhbWVzXzEsIHNyY19kYXRhX2luX2Zsb2F0XzEpKTsKICAgc2NvcGVkX3JlZnB0cjxBdWRpb0J1ZmZlclNvdXJjZU5vZGU+IHNvdXJjZV8xKAogICAgICAgYXVkaW9fY29udGV4dC0+Q3JlYXRlQnVmZmVyU291cmNlKCkpOwogICBzY29wZWRfcmVmcHRyPEF1ZGlvQnVmZmVyPiBidWZmZXJfMSgKLSAgICAgIG5ldyBBdWRpb0J1ZmZlcihOVUxMLCA0NDEwMCwgc3RhdGljX2Nhc3Q8aW50MzI+KG51bV9vZl9mcmFtZXNfMSksCi0gICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzI+KG51bV9vZl9zcmNfY2hhbm5lbCksIHNyY19kYXRhXzEuUGFzcygpLAotICAgICAgICAgICAgICAgICAgICAgIGtTYW1wbGVUeXBlRmxvYXQzMikpOworICAgICAgbmV3IEF1ZGlvQnVmZmVyKDQ0MTAwLCBzcmNfZGF0YV8xLlBhc3MoKSkpOwogICBzb3VyY2VfMS0+c2V0X2J1ZmZlcihidWZmZXJfMSk7CiAKLSAgc2l6ZV90IG51bV9vZl9mcmFtZXNfMiA9IDUwOworICBjb25zdCBzaXplX3Qga051bU9mRnJhbWVzXzIgPSA1MDsKICAgZmxvYXQgc3JjX2RhdGFfaW5fZmxvYXRfMlsxMDBdOwotICBmb3IgKHNpemVfdCBjID0gMDsgYyA8IG51bV9vZl9zcmNfY2hhbm5lbDsgKytjKSB7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1fb2ZfZnJhbWVzXzI7ICsraSkgewotICAgICAgc3JjX2RhdGFfaW5fZmxvYXRfMltjICogbnVtX29mX2ZyYW1lc18yICsgaV0gPSA0MC4wZiAqIChjICsgMSk7CisgIGZvciAoc2l6ZV90IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwga051bU9mU3JjQ2hhbm5lbHM7ICsrY2hhbm5lbCkgeworICAgIGZvciAoc2l6ZV90IGZyYW1lID0gMDsgZnJhbWUgPCBrTnVtT2ZGcmFtZXNfMjsgKytmcmFtZSkgeworICAgICAgc3JjX2RhdGFfaW5fZmxvYXRfMltmcmFtZSAqIGtOdW1PZlNyY0NoYW5uZWxzICsgY2hhbm5lbF0gPQorICAgICAgICAgIDQwLjBmICogKGNoYW5uZWwgKyAxKTsKICAgICB9CiAgIH0KLSAgc2NvcGVkX2FycmF5PHVpbnQ4PiBzcmNfZGF0YV8yKG5ldyB1aW50OFs0MDBdKTsKLSAgdWludDgqIHNyY19idWZmZXJfMiA9IHNyY19kYXRhXzIuZ2V0KCk7Ci0gIG1lbWNweShzcmNfYnVmZmVyXzIsIHNyY19kYXRhX2luX2Zsb2F0XzIsIDQwMCAqIHNpemVvZih1aW50OCkpOworCisgIHNjb3BlZF9wdHI8U2hlbGxBdWRpb0J1cz4gc3JjX2RhdGFfMihuZXcgU2hlbGxBdWRpb0J1cygKKyAgICAgIGtOdW1PZlNyY0NoYW5uZWxzLCBrTnVtT2ZGcmFtZXNfMiwgc3JjX2RhdGFfaW5fZmxvYXRfMikpOwogICBzY29wZWRfcmVmcHRyPEF1ZGlvQnVmZmVyU291cmNlTm9kZT4gc291cmNlXzIoCiAgICAgICBhdWRpb19jb250ZXh0LT5DcmVhdGVCdWZmZXJTb3VyY2UoKSk7CiAgIHNjb3BlZF9yZWZwdHI8QXVkaW9CdWZmZXI+IGJ1ZmZlcl8yKAotICAgICAgbmV3IEF1ZGlvQnVmZmVyKE5VTEwsIDQ0MTAwLCBzdGF0aWNfY2FzdDxpbnQzMj4obnVtX29mX2ZyYW1lc18yKSwKLSAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMj4obnVtX29mX3NyY19jaGFubmVsKSwgc3JjX2RhdGFfMi5QYXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAga1NhbXBsZVR5cGVGbG9hdDMyKSk7CisgICAgICBuZXcgQXVkaW9CdWZmZXIoNDQxMDAsIHNyY19kYXRhXzIuUGFzcygpKSk7CiAgIHNvdXJjZV8yLT5zZXRfYnVmZmVyKGJ1ZmZlcl8yKTsKIAogICBzY29wZWRfcmVmcHRyPEF1ZGlvRGVzdGluYXRpb25Ob2RlTW9jaz4gZGVzdGluYXRpb24oCiAgICAgICBuZXcgQXVkaW9EZXN0aW5hdGlvbk5vZGVNb2NrKGF1ZGlvX2NvbnRleHQuZ2V0KCkpKTsKLSAgZGVzdGluYXRpb24tPnNldF9jaGFubmVsX2ludGVycHJldGF0aW9uKGludGVycHJldGF0aW9uKTsKKyAgZGVzdGluYXRpb24tPnNldF9jaGFubmVsX2ludGVycHJldGF0aW9uKGtJbnRlcnByZXRhdGlvbik7CiAgIHNvdXJjZV8xLT5Db25uZWN0KGRlc3RpbmF0aW9uLCAwLCAwLCBOVUxMKTsKICAgc291cmNlXzItPkNvbm5lY3QoZGVzdGluYXRpb24sIDAsIDAsIE5VTEwpOwogICBzb3VyY2VfMS0+U3RhcnQoMCwgMCwgTlVMTCk7CiAgIHNvdXJjZV8yLT5TdGFydCgwLCAwLCBOVUxMKTsKIAogICBzY29wZWRfcHRyPFNoZWxsQXVkaW9CdXM+IGF1ZGlvX2J1cygKLSAgICAgIG5ldyBTaGVsbEF1ZGlvQnVzKG51bV9vZl9kZXN0X2NoYW5uZWwsIGtSZW5kZXJCdWZmZXJTaXplRnJhbWVzLAorICAgICAgbmV3IFNoZWxsQXVkaW9CdXMoa051bU9mRGVzdENoYW5uZWxzLCBrUmVuZGVyQnVmZmVyU2l6ZUZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgIFNoZWxsQXVkaW9CdXM6OmtGbG9hdDMyLCBTaGVsbEF1ZGlvQnVzOjprUGxhbmFyKSk7CiAgIGF1ZGlvX2J1cy0+WmVyb0FsbEZyYW1lcygpOwogICBib29sIHNpbGVuY2UgPSB0cnVlOwotICBkZXN0aW5hdGlvbi0+RmlsbEF1ZGlvQnVzKGF1ZGlvX2J1cy5nZXQoKSwgJnNpbGVuY2UpOworICBkZXN0aW5hdGlvbi0+RmlsbEF1ZGlvQnVzKHRydWUsIGF1ZGlvX2J1cy5nZXQoKSwgJnNpbGVuY2UpOwogICBFWFBFQ1RfRkFMU0Uoc2lsZW5jZSk7CiAKLSAgZm9yIChzaXplX3QgYyA9IDA7IGMgPCBudW1fb2ZfZGVzdF9jaGFubmVsOyArK2MpIHsKKyAgZm9yIChzaXplX3QgYyA9IDA7IGMgPCBrTnVtT2ZEZXN0Q2hhbm5lbHM7ICsrYykgewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga1JlbmRlckJ1ZmZlclNpemVGcmFtZXM7ICsraSkgewotICAgICAgaWYgKGkgPCBudW1fb2ZfZnJhbWVzXzEpIHsKKyAgICAgIGlmIChpIDwga051bU9mRnJhbWVzXzEpIHsKICAgICAgICAgaWYgKGMgPT0gMCkgewogICAgICAgICAgIEVYUEVDVF9FUShhdWRpb19idXMtPkdldEZsb2F0MzJTYW1wbGUoYywgaSksIDYwKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBFWFBFQ1RfRVEoYXVkaW9fYnVzLT5HZXRGbG9hdDMyU2FtcGxlKGMsIGkpLCAxMjApOwogICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKGkgPCBudW1fb2ZfZnJhbWVzXzIpIHsKKyAgICAgIH0gZWxzZSBpZiAoaSA8IGtOdW1PZkZyYW1lc18yKSB7CiAgICAgICAgIGlmIChjID09IDApIHsKICAgICAgICAgICBFWFBFQ1RfRVEoYXVkaW9fYnVzLT5HZXRGbG9hdDMyU2FtcGxlKGMsIGkpLCA0MCk7CiAgICAgICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX25vZGVfb3V0cHV0LmNjIGIvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19ub2RlX291dHB1dC5jYwppbmRleCBhNzYxMDg0Li45MWRiZmU3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX25vZGVfb3V0cHV0LmNjCisrKyBiL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fbm9kZV9vdXRwdXQuY2MKQEAgLTYwLDEyICs2MCwxMyBAQAogfQogCiBzY29wZWRfcHRyPFNoZWxsQXVkaW9CdXM+IEF1ZGlvTm9kZU91dHB1dDo6UGFzc0F1ZGlvQnVzRnJvbVNvdXJjZSgKLSAgICBpbnQzMiBudW1iZXJfb2ZfZnJhbWVzLCBTYW1wbGVUeXBlIHNhbXBsZV90eXBlKSB7CisgICAgaW50MzIgbnVtYmVyX29mX2ZyYW1lcywgU2FtcGxlVHlwZSBzYW1wbGVfdHlwZSwgYm9vbCogZmluaXNoZWQpIHsKICAgLy8gVGhpcyBpcyBjYWxsZWQgYnkgQXVkaW8gdGhyZWFkLgogICBvd25lcl9ub2RlXy0+YXVkaW9fbG9jaygpLT5Bc3NlcnRMb2NrZWQoKTsKIAogICAvLyBQdWxsIGF1ZGlvIGJ1ZmZlciBmcm9tIGl0cyBvd25lciBub2RlLgotICByZXR1cm4gb3duZXJfbm9kZV8tPlBhc3NBdWRpb0J1c0Zyb21Tb3VyY2UobnVtYmVyX29mX2ZyYW1lcywgc2FtcGxlX3R5cGUpCisgIHJldHVybiBvd25lcl9ub2RlXworICAgICAgLT5QYXNzQXVkaW9CdXNGcm9tU291cmNlKG51bWJlcl9vZl9mcmFtZXMsIHNhbXBsZV90eXBlLCBmaW5pc2hlZCkKICAgICAgIC5QYXNzKCk7CiB9CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fbm9kZV9vdXRwdXQuaCBiL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fbm9kZV9vdXRwdXQuaAppbmRleCAwM2QyODViLi43Mjg0NjVkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX25vZGVfb3V0cHV0LmgKKysrIGIvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19ub2RlX291dHB1dC5oCkBAIC01Miw3ICs1Miw4IEBACiAgIHZvaWQgRGlzY29ubmVjdEFsbCgpOwogCiAgIHNjb3BlZF9wdHI8U2hlbGxBdWRpb0J1cz4gUGFzc0F1ZGlvQnVzRnJvbVNvdXJjZShpbnQzMiBudW1iZXJfb2ZfZnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlVHlwZSBzYW1wbGVfdHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVUeXBlIHNhbXBsZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogZmluaXNoZWQpOwogCiAgcHJpdmF0ZToKICAgQXVkaW9Ob2RlKiBjb25zdCBvd25lcl9ub2RlXzsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fdGVzdC5neXAgYi9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX3Rlc3QuZ3lwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMTVlYzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX3Rlc3QuZ3lwCkBAIC0wLDAgKzEsNjcgQEAKKyMgQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworeworICAndmFyaWFibGVzJzogeworICAgICdzYl9wZWRhbnRpY193YXJuaW5ncyc6IDEsCisgIH0sCisgICd0YXJnZXRzJzogWworICAgICMgVGhpcyB0YXJnZXQgY2FuIGNob29zZSB0aGUgY29ycmVjdCBtZWRpYSBkZXBlbmRlbmN5LgorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdtZWRpYScsCisgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnY29uZGl0aW9ucyc6IFsKKyAgICAgICAgWydjb2JhbHRfbWVkaWFfc291cmNlXzIwMTY9PTEnLCB7CisgICAgICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvbWVkaWEvbWVkaWEyLmd5cDptZWRpYTInLAorICAgICAgICAgIF0sCisgICAgICAgIH0sIHsKKyAgICAgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9tZWRpYS9tZWRpYS5neXA6bWVkaWEnLAorICAgICAgICAgIF0sCisgICAgICAgIH1dLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdhdWRpb190ZXN0JywKKyAgICAgICd0eXBlJzogJzwoZ3Rlc3RfdGFyZ2V0X3R5cGUpJywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnYXVkaW9fbm9kZV9pbnB1dF9vdXRwdXRfdGVzdC5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJ21lZGlhJywKKyAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9kb20vZG9tLmd5cDpkb20nLAorICAgICAgICAnPChERVBUSCkvY29iYWx0L3Rlc3QvdGVzdC5neXA6cnVuX2FsbF91bml0dGVzdHMnLAorICAgICAgICAnPChERVBUSCkvdGVzdGluZy9nbW9jay5neXA6Z21vY2snLAorICAgICAgICAnPChERVBUSCkvdGVzdGluZy9ndGVzdC5neXA6Z3Rlc3QnLAorCisgICAgICAgICMgVE9ETzogUmVtb3ZlIHRoZSBkZXBlbmRlbmN5IGJlbG93LCBpdCB3b3JrcyBhcm91bmQgdGhlIGZhY3QgdGhhdAorICAgICAgICAjICAgICAgIFNjcmlwdFZhbHVlRmFjdG9yeSBoYXMgbm9uLXZpcnR1YWwgbWV0aG9kIENyZWF0ZVByb21pc2UoKS4KKyAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9zY3JpcHQvZW5naW5lLmd5cDplbmdpbmUnLAorICAgICAgXSwKKyAgICB9LAorCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2F1ZGlvX3Rlc3RfZGVwbG95JywKKyAgICAgICd0eXBlJzogJ25vbmUnLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJ2F1ZGlvX3Rlc3QnLAorICAgICAgXSwKKyAgICAgICd2YXJpYWJsZXMnOiB7CisgICAgICAgICdleGVjdXRhYmxlX25hbWUnOiAnYXVkaW9fdGVzdCcsCisgICAgICB9LAorICAgICAgJ2luY2x1ZGVzJzogWyAnPChERVBUSCkvc3RhcmJvYXJkL2J1aWxkL2RlcGxveS5neXBpJyBdLAorICAgIH0sCisgIF0sCit9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jhc2UvdG9rZW5zLmggYi9zcmMvY29iYWx0L2Jhc2UvdG9rZW5zLmgKaW5kZXggNzU4YTJkMi4uMzJmOWM1NSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iYXNlL3Rva2Vucy5oCisrKyBiL3NyYy9jb2JhbHQvYmFzZS90b2tlbnMuaApAQCAtNTMsNiArNTMsNyBAQAogICAgIE1hY3JvT3BXaXRoTmFtZU9ubHkoY2hpbGRMaXN0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIE1hY3JvT3BXaXRoTmFtZU9ubHkoY2xpY2spICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIE1hY3JvT3BXaXRoTmFtZU9ubHkoY2xvc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE1hY3JvT3BXaXRoTmFtZU9ubHkoZGF0YWF2YWlsYWJsZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIE1hY3JvT3BXaXRoTmFtZU9ubHkoZGV2aWNlb3JpZW50YXRpb24pICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIE1hY3JvT3BXaXRoTmFtZU9ubHkoZHVyYXRpb25jaGFuZ2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIE1hY3JvT3BXaXRoTmFtZU9ubHkoZW1wdGllZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9iaW5kaW5ncy5neXBpIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9iaW5kaW5ncy5neXBpCmluZGV4IGE1NDc0NWMuLjBlZTA3ZTUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvYmluZGluZ3MuZ3lwaQorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2JpbmRpbmdzLmd5cGkKQEAgLTQwMCw3ICs0MDAsOCBAQAogICAgICAgXSwKICAgICAgICdzb3VyY2VzJzogWwogICAgICAgICAnPEAoc291cmNlX2lkbF9maWxlcyknLAotICAgICAgICAnPEAoZ2VuZXJhdGVkX2hlYWRlcl9pZGxfZmlsZXMpJworICAgICAgICAnPEAoZ2VuZXJhdGVkX2hlYWRlcl9pZGxfZmlsZXMpJywKKyAgICAgICAgJ3NoYXJlZC9pZGxfY29uZGl0aW9uYWxfbWFjcm9zLmgnLAogICAgICAgXSwKICAgICAgICdhY3Rpb25zJzogW3sKICAgICAgICAgJ2FjdGlvbl9uYW1lJzogJ2dlbmVyYXRlX3R5cGVfY29udmVyc2lvbl9oZWFkZXInLApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weQppbmRleCBhMTZhNDE3Li42MWYwNjQxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weQorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weQpAQCAtNTY2LDYgKzU2Niw3IEBACiAgICAgaWYgaW50ZXJmYWNlLnBhcmVudDoKICAgICAgIGNvbnRleHRbJ3BhcmVudF9pbnRlcmZhY2UnXSA9IHNlbGYucGF0aF9idWlsZGVyLkJpbmRpbmdzQ2xhc3MoCiAgICAgICAgICAgaW50ZXJmYWNlLnBhcmVudCkKKyAgICAgIGNvbnRleHRbJ3BhcmVudF9pbnRlcmZhY2VfbmFtZSddID0gaW50ZXJmYWNlLnBhcmVudAogICAgIGNvbnRleHRbJ2lzX2V4Y2VwdGlvbl9pbnRlcmZhY2UnXSA9IGludGVyZmFjZS5pc19leGNlcHRpb24KICAgICBjb250ZXh0Wydmb3J3YXJkX2RlY2xhcmF0aW9ucyddID0gc29ydGVkKAogICAgICAgICByZWZlcmVuY2VkX2NsYXNzX2NvbnRleHRzLCBrZXk9bGFtYmRhIHg6IHhbJ2Z1bGx5X3F1YWxpZmllZF9uYW1lJ10pCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqczQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfY29uZGl0aW9uYWxfaW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anM0NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2NvbmRpdGlvbmFsX2ludGVyZmFjZS5jYwppbmRleCAwNzExMWNmLi42Nzg2ZWI2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqczQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfY29uZGl0aW9uYWxfaW50ZXJmYWNlLmNjCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19jb25kaXRpb25hbF9pbnRlcmZhY2UuY2MKQEAgLTE5LDYgKzE5LDExIEBACiAvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQogLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anM0NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCiAKKworLy8gVGhpcyBtdXN0IGJlIGluY2x1ZGVkIGFib3ZlIHRoZSBjaGVjayBmb3IgRU5BQkxFX0NPTkRJVElPTkFMX0lOVEVSRkFDRSwgc2luY2UKKy8vIEVOQUJMRV9DT05ESVRJT05BTF9JTlRFUkZBQ0UgbWF5IGJlIGRlZmluZWQgd2l0aGluLgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy9zaGFyZWQvaWRsX2NvbmRpdGlvbmFsX21hY3Jvcy5oIgorCiAjaWYgZGVmaW5lZChFTkFCTEVfQ09ORElUSU9OQUxfSU5URVJGQUNFKQogCiAjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfY29uZGl0aW9uYWxfaW50ZXJmYWNlLmgiCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqczQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfY29uZGl0aW9uYWxfaW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqczQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfY29uZGl0aW9uYWxfaW50ZXJmYWNlLmgKaW5kZXggZDgyNzQxOC4uOWE5NWQwYyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anM0NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2NvbmRpdGlvbmFsX2ludGVyZmFjZS5oCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19jb25kaXRpb25hbF9pbnRlcmZhY2UuaApAQCAtMjAsNiArMjAsMTEgQEAKICNpZm5kZWYgTW96anNDb25kaXRpb25hbEludGVyZmFjZV9oCiAjZGVmaW5lIE1vempzQ29uZGl0aW9uYWxJbnRlcmZhY2VfaAogCisKKy8vIFRoaXMgbXVzdCBiZSBpbmNsdWRlZCBhYm92ZSB0aGUgY2hlY2sgZm9yIEVOQUJMRV9DT05ESVRJT05BTF9JTlRFUkZBQ0UsIHNpbmNlCisvLyBFTkFCTEVfQ09ORElUSU9OQUxfSU5URVJGQUNFIG1heSBiZSBkZWZpbmVkIHdpdGhpbi4KKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3Mvc2hhcmVkL2lkbF9jb25kaXRpb25hbF9tYWNyb3MuaCIKKwogI2lmIGRlZmluZWQoRU5BQkxFX0NPTkRJVElPTkFMX0lOVEVSRkFDRSkKIAogI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19kZXJpdmVkX2dldHRlcl9zZXR0ZXJfaW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anM0NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2Rlcml2ZWRfZ2V0dGVyX3NldHRlcl9pbnRlcmZhY2UuY2MKaW5kZXggZjdmZTUyMy4uYzZiNjRkZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anM0NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2Rlcml2ZWRfZ2V0dGVyX3NldHRlcl9pbnRlcmZhY2UuY2MKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anM0NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2Rlcml2ZWRfZ2V0dGVyX3NldHRlcl9pbnRlcmZhY2UuY2MKQEAgLTc5Myw2ICs3OTMsMTEgQEAKIAogICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCiAgICAgICBjb250ZXh0LCBNb3pqc05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgc3RhdGljX2Fzc2VydCgKKyAgICAgIHN0ZDo6aXNfYmFzZV9vZjxOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UsIERlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2U+Ojp2YWx1ZSwKKyAgICAgICJFeHBlY3RlZCBEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlIHRvIGhhdmUgQysrIHBhcmVudCBjbGFzcyAiCisgICAgICAiTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlLCBiZWNhdXNlIHRoYXQgaXMgaXRzIFdlYklETCBwYXJlbnQuIik7CisKICAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOwogCiAgIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19kZXJpdmVkX2ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19kZXJpdmVkX2ludGVyZmFjZS5jYwppbmRleCAxNzA1MzMxLi5mOTBhNTM5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqczQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZGVyaXZlZF9pbnRlcmZhY2UuY2MKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anM0NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2Rlcml2ZWRfaW50ZXJmYWNlLmNjCkBAIC0zMzIsNiArMzMyLDExIEBACiAKICAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAogICAgICAgY29udGV4dCwgTW96anNCYXNlSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBzdGF0aWNfYXNzZXJ0KAorICAgICAgc3RkOjppc19iYXNlX29mPEJhc2VJbnRlcmZhY2UsIERlcml2ZWRJbnRlcmZhY2U+Ojp2YWx1ZSwKKyAgICAgICJFeHBlY3RlZCBEZXJpdmVkSW50ZXJmYWNlIHRvIGhhdmUgQysrIHBhcmVudCBjbGFzcyAiCisgICAgICAiQmFzZUludGVyZmFjZSwgYmVjYXVzZSB0aGF0IGlzIGl0cyBXZWJJREwgcGFyZW50LiIpOworCiAgIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKIAogICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqczQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZGlzYWJsZWRfaW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anM0NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2Rpc2FibGVkX2ludGVyZmFjZS5jYwppbmRleCBlYzY3NmFlLi5mM2Y5OTg2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqczQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZGlzYWJsZWRfaW50ZXJmYWNlLmNjCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19kaXNhYmxlZF9pbnRlcmZhY2UuY2MKQEAgLTE5LDYgKzE5LDExIEBACiAvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQogLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anM0NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCiAKKworLy8gVGhpcyBtdXN0IGJlIGluY2x1ZGVkIGFib3ZlIHRoZSBjaGVjayBmb3IgTk9fRU5BQkxFX0NPTkRJVElPTkFMX0lOVEVSRkFDRSwgc2luY2UKKy8vIE5PX0VOQUJMRV9DT05ESVRJT05BTF9JTlRFUkZBQ0UgbWF5IGJlIGRlZmluZWQgd2l0aGluLgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy9zaGFyZWQvaWRsX2NvbmRpdGlvbmFsX21hY3Jvcy5oIgorCiAjaWYgZGVmaW5lZChOT19FTkFCTEVfQ09ORElUSU9OQUxfSU5URVJGQUNFKQogCiAjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZGlzYWJsZWRfaW50ZXJmYWNlLmgiCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqczQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZGlzYWJsZWRfaW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqczQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZGlzYWJsZWRfaW50ZXJmYWNlLmgKaW5kZXggYjA3Yjc3ZC4uYzQ5MWE1NiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anM0NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2Rpc2FibGVkX2ludGVyZmFjZS5oCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19kaXNhYmxlZF9pbnRlcmZhY2UuaApAQCAtMjAsNiArMjAsMTEgQEAKICNpZm5kZWYgTW96anNEaXNhYmxlZEludGVyZmFjZV9oCiAjZGVmaW5lIE1vempzRGlzYWJsZWRJbnRlcmZhY2VfaAogCisKKy8vIFRoaXMgbXVzdCBiZSBpbmNsdWRlZCBhYm92ZSB0aGUgY2hlY2sgZm9yIE5PX0VOQUJMRV9DT05ESVRJT05BTF9JTlRFUkZBQ0UsIHNpbmNlCisvLyBOT19FTkFCTEVfQ09ORElUSU9OQUxfSU5URVJGQUNFIG1heSBiZSBkZWZpbmVkIHdpdGhpbi4KKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3Mvc2hhcmVkL2lkbF9jb25kaXRpb25hbF9tYWNyb3MuaCIKKwogI2lmIGRlZmluZWQoTk9fRU5BQkxFX0NPTkRJVElPTkFMX0lOVEVSRkFDRSkKIAogI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc193aW5kb3cuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqczQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfd2luZG93LmNjCmluZGV4IGJmNjliODIuLjQ1MDdlZDggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc193aW5kb3cuY2MKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anM0NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3dpbmRvdy5jYwpAQCAtOTMxLDYgKzkzMSwxMSBAQAogCiAgIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKICAgICAgIGNvbnRleHQsIE1vempzR2xvYmFsSW50ZXJmYWNlUGFyZW50OjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBzdGF0aWNfYXNzZXJ0KAorICAgICAgc3RkOjppc19iYXNlX29mPEdsb2JhbEludGVyZmFjZVBhcmVudCwgV2luZG93Pjo6dmFsdWUsCisgICAgICAiRXhwZWN0ZWQgV2luZG93IHRvIGhhdmUgQysrIHBhcmVudCBjbGFzcyAiCisgICAgICAiR2xvYmFsSW50ZXJmYWNlUGFyZW50LCBiZWNhdXNlIHRoYXQgaXMgaXRzIFdlYklETCBwYXJlbnQuIik7CisKICAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOwogCiAgIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL3Y4Yy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3Y4Y19jb25kaXRpb25hbF9pbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC92OGMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy92OGNfY29uZGl0aW9uYWxfaW50ZXJmYWNlLmNjCmluZGV4IGJjZGFmOTIuLmVlYTgzMmUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL3Y4Yy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3Y4Y19jb25kaXRpb25hbF9pbnRlcmZhY2UuY2MKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvdjhjL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvdjhjX2NvbmRpdGlvbmFsX2ludGVyZmFjZS5jYwpAQCAtMTksNiArMTksMTEgQEAKIC8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCiAvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy92OGMvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQogCisKKy8vIFRoaXMgbXVzdCBiZSBpbmNsdWRlZCBhYm92ZSB0aGUgY2hlY2sgZm9yIEVOQUJMRV9DT05ESVRJT05BTF9JTlRFUkZBQ0UsIHNpbmNlCisvLyBFTkFCTEVfQ09ORElUSU9OQUxfSU5URVJGQUNFIG1heSBiZSBkZWZpbmVkIHdpdGhpbi4KKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3Mvc2hhcmVkL2lkbF9jb25kaXRpb25hbF9tYWNyb3MuaCIKKwogI2lmIGRlZmluZWQoRU5BQkxFX0NPTkRJVElPTkFMX0lOVEVSRkFDRSkKIAogI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3Y4Y19jb25kaXRpb25hbF9pbnRlcmZhY2UuaCIKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL3Y4Yy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3Y4Y19jb25kaXRpb25hbF9pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL3Y4Yy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3Y4Y19jb25kaXRpb25hbF9pbnRlcmZhY2UuaAppbmRleCAyMTI2MzliLi4zYmUyNzVmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC92OGMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy92OGNfY29uZGl0aW9uYWxfaW50ZXJmYWNlLmgKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvdjhjL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvdjhjX2NvbmRpdGlvbmFsX2ludGVyZmFjZS5oCkBAIC0yMSw2ICsyMSwxMSBAQAogI2lmbmRlZiBWOGNDb25kaXRpb25hbEludGVyZmFjZV9oCiAjZGVmaW5lIFY4Y0NvbmRpdGlvbmFsSW50ZXJmYWNlX2gKIAorCisvLyBUaGlzIG11c3QgYmUgaW5jbHVkZWQgYWJvdmUgdGhlIGNoZWNrIGZvciBFTkFCTEVfQ09ORElUSU9OQUxfSU5URVJGQUNFLCBzaW5jZQorLy8gRU5BQkxFX0NPTkRJVElPTkFMX0lOVEVSRkFDRSBtYXkgYmUgZGVmaW5lZCB3aXRoaW4uCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3NoYXJlZC9pZGxfY29uZGl0aW9uYWxfbWFjcm9zLmgiCisKICNpZiBkZWZpbmVkKEVOQUJMRV9DT05ESVRJT05BTF9JTlRFUkZBQ0UpCiAKICNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC92OGMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy92OGNfZGVyaXZlZF9nZXR0ZXJfc2V0dGVyX2ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL3Y4Yy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3Y4Y19kZXJpdmVkX2dldHRlcl9zZXR0ZXJfaW50ZXJmYWNlLmNjCmluZGV4IDliMDI1MmUuLjk3MmZkOGUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL3Y4Yy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3Y4Y19kZXJpdmVkX2dldHRlcl9zZXR0ZXJfaW50ZXJmYWNlLmNjCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL3Y4Yy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3Y4Y19kZXJpdmVkX2dldHRlcl9zZXR0ZXJfaW50ZXJmYWNlLmNjCkBAIC02MjcsNiArNjI3LDEwIEBACiAgICAgLy8gaW5oZXJpdGVkIGludGVyZmFjZS4KICAgICB2ODo6TG9jYWw8djg6OkZ1bmN0aW9uVGVtcGxhdGU+IHBhcmVudF90ZW1wbGF0ZSA9IFY4Y05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTo6R2V0VGVtcGxhdGUoaXNvbGF0ZSk7CiAgICAgZnVuY3Rpb25fdGVtcGxhdGUtPkluaGVyaXQocGFyZW50X3RlbXBsYXRlKTsKKyAgICBzdGF0aWNfYXNzZXJ0KAorICAgICAgICBzdGQ6OmlzX2Jhc2Vfb2Y8TmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlLCBEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlPjo6dmFsdWUsCisgICAgICAgICJFeHBlY3RlZCBEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlIHRvIGhhdmUgQysrIHBhcmVudCBjbGFzcyAiCisgICAgICAgICJOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UsIGJlY2F1c2UgdGhhdCBpcyBpdHMgV2ViSURMIHBhcmVudC4iKTsKICAgfQogCiAgIC8vIGh0dHBzOi8vaGV5Y2FtLmdpdGh1Yi5pby93ZWJpZGwvI2VzLWNvbnN0YW50cwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvdjhjL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvdjhjX2Rlcml2ZWRfaW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvdjhjL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvdjhjX2Rlcml2ZWRfaW50ZXJmYWNlLmNjCmluZGV4IGU3YTFlY2EuLmJjNDYxMGQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL3Y4Yy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3Y4Y19kZXJpdmVkX2ludGVyZmFjZS5jYworKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC92OGMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy92OGNfZGVyaXZlZF9pbnRlcmZhY2UuY2MKQEAgLTIzOSw2ICsyMzksMTAgQEAKICAgICAvLyBpbmhlcml0ZWQgaW50ZXJmYWNlLgogICAgIHY4OjpMb2NhbDx2ODo6RnVuY3Rpb25UZW1wbGF0ZT4gcGFyZW50X3RlbXBsYXRlID0gVjhjQmFzZUludGVyZmFjZTo6R2V0VGVtcGxhdGUoaXNvbGF0ZSk7CiAgICAgZnVuY3Rpb25fdGVtcGxhdGUtPkluaGVyaXQocGFyZW50X3RlbXBsYXRlKTsKKyAgICBzdGF0aWNfYXNzZXJ0KAorICAgICAgICBzdGQ6OmlzX2Jhc2Vfb2Y8QmFzZUludGVyZmFjZSwgRGVyaXZlZEludGVyZmFjZT46OnZhbHVlLAorICAgICAgICAiRXhwZWN0ZWQgRGVyaXZlZEludGVyZmFjZSB0byBoYXZlIEMrKyBwYXJlbnQgY2xhc3MgIgorICAgICAgICAiQmFzZUludGVyZmFjZSwgYmVjYXVzZSB0aGF0IGlzIGl0cyBXZWJJREwgcGFyZW50LiIpOwogICB9CiAKICAgLy8gaHR0cHM6Ly9oZXljYW0uZ2l0aHViLmlvL3dlYmlkbC8jZXMtY29uc3RhbnRzCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC92OGMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy92OGNfZGlzYWJsZWRfaW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvdjhjL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvdjhjX2Rpc2FibGVkX2ludGVyZmFjZS5jYwppbmRleCAxNmY3NThkLi43NjNjOTc1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC92OGMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy92OGNfZGlzYWJsZWRfaW50ZXJmYWNlLmNjCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL3Y4Yy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3Y4Y19kaXNhYmxlZF9pbnRlcmZhY2UuY2MKQEAgLTE5LDYgKzE5LDExIEBACiAvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQogLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvdjhjL3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKIAorCisvLyBUaGlzIG11c3QgYmUgaW5jbHVkZWQgYWJvdmUgdGhlIGNoZWNrIGZvciBOT19FTkFCTEVfQ09ORElUSU9OQUxfSU5URVJGQUNFLCBzaW5jZQorLy8gTk9fRU5BQkxFX0NPTkRJVElPTkFMX0lOVEVSRkFDRSBtYXkgYmUgZGVmaW5lZCB3aXRoaW4uCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3NoYXJlZC9pZGxfY29uZGl0aW9uYWxfbWFjcm9zLmgiCisKICNpZiBkZWZpbmVkKE5PX0VOQUJMRV9DT05ESVRJT05BTF9JTlRFUkZBQ0UpCiAKICNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy92OGNfZGlzYWJsZWRfaW50ZXJmYWNlLmgiCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC92OGMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy92OGNfZGlzYWJsZWRfaW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC92OGMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy92OGNfZGlzYWJsZWRfaW50ZXJmYWNlLmgKaW5kZXggZTU3MzRjZS4uOTlmNjc1MCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvdjhjL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvdjhjX2Rpc2FibGVkX2ludGVyZmFjZS5oCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL3Y4Yy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3Y4Y19kaXNhYmxlZF9pbnRlcmZhY2UuaApAQCAtMjEsNiArMjEsMTEgQEAKICNpZm5kZWYgVjhjRGlzYWJsZWRJbnRlcmZhY2VfaAogI2RlZmluZSBWOGNEaXNhYmxlZEludGVyZmFjZV9oCiAKKworLy8gVGhpcyBtdXN0IGJlIGluY2x1ZGVkIGFib3ZlIHRoZSBjaGVjayBmb3IgTk9fRU5BQkxFX0NPTkRJVElPTkFMX0lOVEVSRkFDRSwgc2luY2UKKy8vIE5PX0VOQUJMRV9DT05ESVRJT05BTF9JTlRFUkZBQ0UgbWF5IGJlIGRlZmluZWQgd2l0aGluLgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy9zaGFyZWQvaWRsX2NvbmRpdGlvbmFsX21hY3Jvcy5oIgorCiAjaWYgZGVmaW5lZChOT19FTkFCTEVfQ09ORElUSU9OQUxfSU5URVJGQUNFKQogCiAjaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvdjhjL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvdjhjX3dpbmRvdy5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL3Y4Yy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3Y4Y193aW5kb3cuY2MKaW5kZXggMDcyMzdiYS4uOTg2NTY1MSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvdjhjL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvdjhjX3dpbmRvdy5jYworKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC92OGMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy92OGNfd2luZG93LmNjCkBAIC03MTAsNiArNzEwLDEwIEBACiAgICAgLy8gaW5oZXJpdGVkIGludGVyZmFjZS4KICAgICB2ODo6TG9jYWw8djg6OkZ1bmN0aW9uVGVtcGxhdGU+IHBhcmVudF90ZW1wbGF0ZSA9IFY4Y0dsb2JhbEludGVyZmFjZVBhcmVudDo6R2V0VGVtcGxhdGUoaXNvbGF0ZSk7CiAgICAgZnVuY3Rpb25fdGVtcGxhdGUtPkluaGVyaXQocGFyZW50X3RlbXBsYXRlKTsKKyAgICBzdGF0aWNfYXNzZXJ0KAorICAgICAgICBzdGQ6OmlzX2Jhc2Vfb2Y8R2xvYmFsSW50ZXJmYWNlUGFyZW50LCBXaW5kb3c+Ojp2YWx1ZSwKKyAgICAgICAgIkV4cGVjdGVkIFdpbmRvdyB0byBoYXZlIEMrKyBwYXJlbnQgY2xhc3MgIgorICAgICAgICAiR2xvYmFsSW50ZXJmYWNlUGFyZW50LCBiZWNhdXNlIHRoYXQgaXMgaXRzIFdlYklETCBwYXJlbnQuIik7CiAgIH0KIAogICAvLyBodHRwczovL2hleWNhbS5naXRodWIuaW8vd2ViaWRsLyNlcy1jb25zdGFudHMKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvbW96anM0NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9tb3pqczQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKaW5kZXggNmVjOTQ5YS4uMWIyZmQ3MiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9tb3pqczQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9tb3pqczQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKQEAgLTczMSw2ICs3MzEsMTEgQEAKIHslIGlmIHBhcmVudF9pbnRlcmZhY2UgJX0KICAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAogICAgICAgY29udGV4dCwge3twYXJlbnRfaW50ZXJmYWNlfX06OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIHN0YXRpY19hc3NlcnQoCisgICAgICBzdGQ6OmlzX2Jhc2Vfb2Y8e3twYXJlbnRfaW50ZXJmYWNlX25hbWV9fSwge3tpbnRlcmZhY2VfbmFtZX19Pjo6dmFsdWUsCisgICAgICAiRXhwZWN0ZWQge3tpbnRlcmZhY2VfbmFtZX19IHRvIGhhdmUgQysrIHBhcmVudCBjbGFzcyAiCisgICAgICAie3twYXJlbnRfaW50ZXJmYWNlX25hbWV9fSwgYmVjYXVzZSB0aGF0IGlzIGl0cyBXZWJJREwgcGFyZW50LiIpOworCiB7JSBlbGlmIGlzX2V4Y2VwdGlvbl9pbnRlcmZhY2UgJX0KICAgLy8gR2V0IEVycm9yIHByb3RvdHlwZS4KICAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKGNvbnRleHQpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9zaGFyZWQvaWRsX2NvbmRpdGlvbmFsX21hY3Jvcy5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9zaGFyZWQvaWRsX2NvbmRpdGlvbmFsX21hY3Jvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZGRkY2UKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3NoYXJlZC9pZGxfY29uZGl0aW9uYWxfbWFjcm9zLmgKQEAgLTAsMCArMSwzMiBAQAorLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBDT0JBTFRfQklORElOR1NfU0hBUkVEX0lETF9DT05ESVRJT05BTF9NQUNST1NfSF8KKyNkZWZpbmUgQ09CQUxUX0JJTkRJTkdTX1NIQVJFRF9JRExfQ09ORElUSU9OQUxfTUFDUk9TX0hfCisKKyNpbmNsdWRlICJzdGFyYm9hcmQvY29uZmlndXJhdGlvbi5oIgorCisvLyBEZWZpbmUgcHJlcHJvY2Vzc29yIG1hY3JvcyB0aGF0IGNhbm5vdCBiZSBkZXRlcm1pbmVkIGF0IEdZUCB0aW1lIGZvciB1c2UgaW4KKy8vIElETCBmaWxlcyB3aXRoIENvbmRpdGlvbmFscyAoZS5nLiBjb25kaXRpb25hbCBpbnRlcmZhY2UgZGVmaW5pdGlvbnMsIG9yCisvLyBjb25kaXRpb25hbCBhdHRyaWJ1dGVzKS4gVGhpcyBpcyBuZWNlc3NhcnkgdG8gbWFrZSBtYWNyb3MgZm9yIElETAorLy8gQ29uZGl0aW9uYWxzIHRoYXQgYXJlIGRlcGVuZGVudCBvbiBTdGFyYm9hcmQgZmVhdHVyZSBtYWNyb3MgdGhhdCBnZXQgZGVmaW5lZAorLy8gaW4gaGVhZGVyIGZpbGVzLgorCisjaWYgU0JfSEFTKE9OX1NDUkVFTl9LRVlCT0FSRCkKKy8vIFRoaXMgaXMgdXNlZCB0byBjb25kaXRpb25hbGx5IGRlZmluZSB0aGUgT24gU2NyZWVuIEtleWJvYXJkIGludGVyZmFjZSBhbmQKKy8vIGF0dHJpYnV0ZS4KKyNkZWZpbmUgQ09CQUxUX0VOQUJMRV9PTl9TQ1JFRU5fS0VZQk9BUkQKKyNlbmRpZiAgLy8gU0JfSEFTKE9OX1NDUkVFTl9LRVlCT0FSRCkKKworI2VuZGlmICAvLyBDT0JBTFRfQklORElOR1NfU0hBUkVEX0lETF9DT05ESVRJT05BTF9NQUNST1NfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVtcGxhdGVzL2ludGVyZmFjZS1iYXNlLmNjLnRlbXBsYXRlIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZW1wbGF0ZXMvaW50ZXJmYWNlLWJhc2UuY2MudGVtcGxhdGUKaW5kZXggYTBlMjk3ZS4uZjk2NWM0OSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZW1wbGF0ZXMvaW50ZXJmYWNlLWJhc2UuY2MudGVtcGxhdGUKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZW1wbGF0ZXMvaW50ZXJmYWNlLWJhc2UuY2MudGVtcGxhdGUKQEAgLTMzLDYgKzMzLDExIEBACiAvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiB7e3RlbXBsYXRlX3BhdGh9fQogCiB7JSBpZiBjb25kaXRpb25hbCAlfQorCisvLyBUaGlzIG11c3QgYmUgaW5jbHVkZWQgYWJvdmUgdGhlIGNoZWNrIGZvciB7e2NvbmRpdGlvbmFsfX0sIHNpbmNlCisvLyB7e2NvbmRpdGlvbmFsfX0gbWF5IGJlIGRlZmluZWQgd2l0aGluLgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy9zaGFyZWQvaWRsX2NvbmRpdGlvbmFsX21hY3Jvcy5oIgorCiAjaWYgZGVmaW5lZCh7e2NvbmRpdGlvbmFsfX0pCiAKIHslIGVuZGlmICV9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3RlbXBsYXRlcy9pbnRlcmZhY2UtYmFzZS5oLnRlbXBsYXRlIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZW1wbGF0ZXMvaW50ZXJmYWNlLWJhc2UuaC50ZW1wbGF0ZQppbmRleCA1YjhkZDNhLi4xOTJlYjkxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3RlbXBsYXRlcy9pbnRlcmZhY2UtYmFzZS5oLnRlbXBsYXRlCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVtcGxhdGVzL2ludGVyZmFjZS1iYXNlLmgudGVtcGxhdGUKQEAgLTM2LDYgKzM2LDExIEBACiAjZGVmaW5lIHt7YmluZGluZ19jbGFzc319X2gKIAogeyUgaWYgY29uZGl0aW9uYWwgJX0KKworLy8gVGhpcyBtdXN0IGJlIGluY2x1ZGVkIGFib3ZlIHRoZSBjaGVjayBmb3Ige3tjb25kaXRpb25hbH19LCBzaW5jZQorLy8ge3tjb25kaXRpb25hbH19IG1heSBiZSBkZWZpbmVkIHdpdGhpbi4KKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3Mvc2hhcmVkL2lkbF9jb25kaXRpb25hbF9tYWNyb3MuaCIKKwogI2lmIGRlZmluZWQoe3tjb25kaXRpb25hbH19KQogCiB7JSBlbmRpZiAlfQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2FycmF5X2J1ZmZlcnNfdGVzdC5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9hcnJheV9idWZmZXJzX3Rlc3QuY2MKaW5kZXggMWRkMWUxNi4uMTZjNjk5OSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2FycmF5X2J1ZmZlcnNfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYXJyYXlfYnVmZmVyc190ZXN0LmNjCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYXJiaXRyYXJ5X2ludGVyZmFjZS5oIgogI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2JpbmRpbmdzX3Rlc3RfYmFzZS5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvYXJyYXlfYnVmZmVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9hcnJheV9idWZmZXJfdmlldy5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZGF0YV92aWV3LmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC90eXBlZF9hcnJheXMuaCIKICNpbmNsdWRlICJ0ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2suaCIKQEAgLTg0LDYgKzg1LDExIEBACiAgIC8vIGdvaW5nIHdyb25nIGhlcmUuCiB9CiAKK1RFU1RfRihBcnJheUJ1ZmZlclRlc3QsIEFycmF5QnVmZmVyVmlld1Rlc3QpIHsKKyAgLy8gVE9ETzogQWRkIGEgdGVzdCBmb3IgQXJyYXlCdWZmZXJWaWV3LiAgQmluZGluZ3Mgc3VwcG9ydCBpcyByZXF1aXJlZCBpbgorICAvLyBvcmRlciB0byB3cml0ZSBhbnkgbWVhbmluZ2Z1bCB0ZXN0IGhlcmUuCit9CisKIFRFU1RfRihBcnJheUJ1ZmZlclRlc3QsIERhdGFWaWV3VGVzdCkgewogICBhdXRvIGFycmF5X2J1ZmZlciA9IHNjcmlwdDo6QXJyYXlCdWZmZXI6Ok5ldyhnbG9iYWxfZW52aXJvbm1lbnRfLCAxMDI0KTsKICAgYXV0byBkYXRhX3ZpZXcgPQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2RhdGVfYmluZGluZ3NfdGVzdC5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9kYXRlX2JpbmRpbmdzX3Rlc3QuY2MKaW5kZXggNTZjM2MzNy4uNTM2Zjg1ZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2RhdGVfYmluZGluZ3NfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZGF0ZV9iaW5kaW5nc190ZXN0LmNjCkBAIC03MCw2ICs3MCwxNSBAQAogICBFWFBFQ1RfU1RSRVEoIkludmFsaWQgRGF0ZSIsIHJlc3VsdC5jX3N0cigpKTsKIH0KIAorVEVTVF9GKERhdGVCaW5kaW5nc1Rlc3QsIFBvc2l4RXBvY2gpIHsKKyAgc3RkOjpzdHJpbmcgcmVzdWx0OworCisgIEV2YWx1YXRlU2NyaXB0KCJEYXRlLm5vdygpOyIsICZyZXN1bHQpOworICBhdXRvIGpzX25vd19tcyA9IHN0ZDo6c3RvbGwocmVzdWx0KTsKKyAgYXV0byBwb3NpeF9ub3dfbXMgPSBTYlRpbWVUb1Bvc2l4KFNiVGltZUdldE5vdygpKSAvIGtTYlRpbWVNaWxsaXNlY29uZDsKKyAgRVhQRUNUX0xUKHN0ZDo6YWJzKHBvc2l4X25vd19tcyAtIGpzX25vd19tcyksIDEwMDApOworfQorCiB9ICAvLyBuYW1lc3BhY2UKIH0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCiB9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdjhjL3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Y4Yy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCmluZGV4IDU5MTRmNjAuLjJkOTRmMWQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdjhjL3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy92OGMvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQpAQCAtNTU2LDYgKzU1NiwxMCBAQAogICAgIC8vIGluaGVyaXRlZCBpbnRlcmZhY2UuCiAgICAgdjg6OkxvY2FsPHY4OjpGdW5jdGlvblRlbXBsYXRlPiBwYXJlbnRfdGVtcGxhdGUgPSB7e3BhcmVudF9pbnRlcmZhY2V9fTo6R2V0VGVtcGxhdGUoaXNvbGF0ZSk7CiAgICAgZnVuY3Rpb25fdGVtcGxhdGUtPkluaGVyaXQocGFyZW50X3RlbXBsYXRlKTsKKyAgICBzdGF0aWNfYXNzZXJ0KAorICAgICAgICBzdGQ6OmlzX2Jhc2Vfb2Y8e3twYXJlbnRfaW50ZXJmYWNlX25hbWV9fSwge3tpbnRlcmZhY2VfbmFtZX19Pjo6dmFsdWUsCisgICAgICAgICJFeHBlY3RlZCB7e2ludGVyZmFjZV9uYW1lfX0gdG8gaGF2ZSBDKysgcGFyZW50IGNsYXNzICIKKyAgICAgICAgInt7cGFyZW50X2ludGVyZmFjZV9uYW1lfX0sIGJlY2F1c2UgdGhhdCBpcyBpdHMgV2ViSURMIHBhcmVudC4iKTsKICAgfQogeyUgZWxpZiBpc19leGNlcHRpb25faW50ZXJmYWNlICV9CiAgIHsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmxhY2tfYm94X3Rlc3RzL2JsYWNrX2JveF90ZXN0cy5weSBiL3NyYy9jb2JhbHQvYmxhY2tfYm94X3Rlc3RzL2JsYWNrX2JveF90ZXN0cy5weQppbmRleCA0MWQ5ZjAzLi5lMTVmY2UwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JsYWNrX2JveF90ZXN0cy9ibGFja19ib3hfdGVzdHMucHkKKysrIGIvc3JjL2NvYmFsdC9ibGFja19ib3hfdGVzdHMvYmxhY2tfYm94X3Rlc3RzLnB5CkBAIC01LDkgKzUsNiBAQAogaW1wb3J0IGFyZ3BhcnNlCiBpbXBvcnQgaW1wb3J0bGliCiBpbXBvcnQgbG9nZ2luZwotaW1wb3J0IG9zCi1pbXBvcnQgc29ja2V0Ci1pbXBvcnQgc3VicHJvY2VzcwogaW1wb3J0IHN5cwogaW1wb3J0IHVuaXR0ZXN0CiAKQEAgLTIwLDYgKzE3LDcgQEAKICMgVGhlc2UgdGVzdHMgY2FuIG9ubHkgYmUgcnVuIG9uIHBsYXRmb3JtcyB3aG9zZSBhcHAgbGF1bmNoZXIgY2FuIHNlbmQgc3VzcGVuZC8KICMgcmVzdW1lIHNpZ25hbHMuCiBfVEVTVFNfTkVFRElOR19TWVNURU1fU0lHTkFMID0gWworICAgICdjYW5jZWxfc3luY19sb2Fkc193aGVuX3N1c3BlbmRlZCcsCiAgICAgJ3ByZWxvYWRfZm9udCcsCiAgICAgJ3RpbWVyX2hpdF9pbl9wcmVsb2FkJywKICAgICAndGltZXJfaGl0X2FmdGVyX3ByZWxvYWQnLApAQCAtMzMsOCArMzEsNiBAQAogICAgICdhbGxvd19ldmFsJywKICAgICAnZGlzYWJsZV9ldmFsX3dpdGhfY3NwJywKIF0KLSMgUG9ydCBudW1iZXIgb2YgdGhlIEhUVFAgc2VydmVyIHNlcnZpbmcgdGVzdCBkYXRhLgotX0RFRkFVTFRfVEVTVF9EQVRBX1NFUlZFUl9QT1JUID0gODAwMAogIyBMb2NhdGlvbiBvZiB0ZXN0IGZpbGVzLgogX1RFU1RfRElSX1BBVEggPSAnY29iYWx0LmJsYWNrX2JveF90ZXN0cy50ZXN0cy4nCiAjIFBsYXRmb3JtIGRlcGVuZGVudCBkZXZpY2UgcGFyYW1ldGVycy4KQEAgLTQ5LDE3ICs0NSw2IEBACiAgIHN5cy5hcmd2ID0gc3lzLmFyZ3ZbOjFdCiAKIAotZGVmIEdldERlZmF1bHRCbGFja0JveFRlc3REYXRhQWRkcmVzcygpOgotICAiIiJHZXRzIHRoZSBpcCBhZGRyZXNzIHdpdGggcG9ydCBmb3IgdGhlIHNlcnZlciBob3N0aW5nIHRlc3QgZGF0YS4iIiIKLSAgIyBXZSBhcmUgY2FyZWZ1bCB0byBjaG9vc2UgdGhpcyBtZXRob2QgdGhhdCBhbGxvd3MgZXh0ZXJuYWwgZGV2aWNlIHRvIGNvbm5lY3QKLSAgIyB0byB0aGUgaG9zdCBydW5uaW5nIHRoZSB3ZWIgc2VydmVyIGhvc3RpbmcgdGVzdCBkYXRhLgotICBhZGRyZXNzX3BhY2tfbGlzdCA9IHNvY2tldC5nZXRhZGRyaW5mbyhzb2NrZXQuZ2V0aG9zdG5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RFRkFVTFRfVEVTVF9EQVRBX1NFUlZFUl9QT1JUKQotICBmaXJzdF9hZGRyZXNzX3BhY2sgPSBhZGRyZXNzX3BhY2tfbGlzdFswXQotICBpcF9hZGRyZXNzLCBwb3J0ID0gZmlyc3RfYWRkcmVzc19wYWNrWzRdCi0gIHJldHVybiAnaHR0cDovL3t9Ont9LycuZm9ybWF0KGlwX2FkZHJlc3MsIHBvcnQpCi0KLQogY2xhc3MgQmxhY2tCb3hUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CkBAIC03Myw5ICs1OCw2IEBACiAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6CiAgICAgcHJpbnQoJ0RvbmUgJyArIGNscy5fX25hbWVfXykKIAotICBkZWYgR2V0VVJMKHNlbGYsIGZpbGVfbmFtZSk6Ci0gICAgcmV0dXJuIEdldERlZmF1bHRCbGFja0JveFRlc3REYXRhQWRkcmVzcygpICsgZmlsZV9uYW1lCi0KICAgZGVmIENyZWF0ZUNvYmFsdFJ1bm5lcihzZWxmLCB1cmwsIHRhcmdldF9wYXJhbXM9Tm9uZSk6CiAgICAgbmV3X3J1bm5lciA9IGJsYWNrX2JveF9jb2JhbHRfcnVubmVyLkJsYWNrQm94Q29iYWx0UnVubmVyKAogICAgICAgICBkZXZpY2VfcGFyYW1zPV9kZXZpY2VfcGFyYW1zLCB1cmw9dXJsLCB0YXJnZXRfcGFyYW1zPXRhcmdldF9wYXJhbXMpCkBAIC0xMTMsOSArOTUsNiBAQAogICAgIHNlbGYudGVzdF9uYW1lID0gdGVzdF9uYW1lCiAKICAgZGVmIFJ1bihzZWxmKToKLQotICAgIGlmIG5vdCBzZWxmLl9TdGFydFRlc3RkYXRhU2VydmVyKCk6Ci0gICAgICByZXR1cm4gMQogICAgIGxvZ2dpbmcuYmFzaWNDb25maWcobGV2ZWw9bG9nZ2luZy5ERUJVRykKICAgICBHZXREZXZpY2VQYXJhbXMoKQogICAgIGlmIHNlbGYudGVzdF9uYW1lOgpAQCAtMTI1LDM2ICsxMDQsOCBAQAogICAgICAgc3VpdGUgPSBMb2FkVGVzdHMoX2RldmljZV9wYXJhbXMucGxhdGZvcm0sIF9kZXZpY2VfcGFyYW1zLmNvbmZpZykKICAgICByZXR1cm5fY29kZSA9IG5vdCB1bml0dGVzdC5UZXh0VGVzdFJ1bm5lcigKICAgICAgICAgdmVyYm9zaXR5PTAsIHN0cmVhbT1zeXMuc3Rkb3V0KS5ydW4oc3VpdGUpLndhc1N1Y2Nlc3NmdWwoKQotICAgIHNlbGYuX0tpbGxUZXN0ZGF0YVNlcnZlcigpCiAgICAgcmV0dXJuIHJldHVybl9jb2RlCiAKLSAgZGVmIF9TdGFydFRlc3RkYXRhU2VydmVyKHNlbGYpOgotICAgICIiIlN0YXJ0IGEgbG9jYWwgc2VydmVyIHRvIHNlcnZlIHRlc3QgZGF0YS4iIiIKLSAgICAjIFNvbWUgdGVzdHMgbGlrZSBwcmVsb2FkX2ZvbnQgcmVxdWlyZXMgc2VydmVyIGZlYXR1cmUgc3VwcG9ydC4KLSAgICAjIFVzaW5nIEhUVFAgVVJMIGluc3RlYWQgb2YgZmlsZSBVUkwgYWxzbyBzYXZlcyB0aGUgdHJvdWJsZSB0bwotICAgICMgZGVwbG95IHRlc3QgZGF0YSB0byBkZXZpY2UuCi0gICAgc2VsZi5kZWZhdWx0X3Rlc3RfZGF0YV9zZXJ2ZXJfcHJvY2VzcyA9IHN1YnByb2Nlc3MuUG9wZW4oCi0gICAgICAgIFsKLSAgICAgICAgICAgICdweXRob24nLCAnLW0nLCAnU2ltcGxlSFRUUFNlcnZlcicsCi0gICAgICAgICAgICAne30nLmZvcm1hdChfREVGQVVMVF9URVNUX0RBVEFfU0VSVkVSX1BPUlQpCi0gICAgICAgIF0sCi0gICAgICAgIGN3ZD1vcy5wYXRoLmpvaW4oCi0gICAgICAgICAgICBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5yZWFscGF0aChfX2ZpbGVfXykpLCAndGVzdGRhdGEnKSwKLSAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKLSAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VUKQotICAgIGlmIHNlbGYuZGVmYXVsdF90ZXN0X2RhdGFfc2VydmVyX3Byb2Nlc3MucmV0dXJuY29kZSBpcyBub3QgTm9uZToKLSAgICAgICMgSWYgdGhlIHJldHVybiBjb2RlIGlzIG5vdCBOb25lIG5vdywgc2VydmVyIGlzIG5vdCBydW5uaW5nIG5vcm1hbGx5LgotICAgICAgcHJpbnQoJ2NhbiBub3Qgc3RhcnQgZGVmYXVsdCB0ZXN0IGRhdGEgc2VydmVyLicpCi0gICAgICByZXR1cm4gRmFsc2UKLSAgICBlbHNlOgotICAgICAgcHJpbnQoJ1N0YXJ0aW5nIEhUVFAgc2VydmVyIG9uIHBvcnQ6IHt9Jy5mb3JtYXQoCi0gICAgICAgICAgX0RFRkFVTFRfVEVTVF9EQVRBX1NFUlZFUl9QT1JUKSkKLSAgICAgIHJldHVybiBUcnVlCi0KLSAgZGVmIF9LaWxsVGVzdGRhdGFTZXJ2ZXIoc2VsZik6Ci0gICAgIiIiRXhpdCBibGFja19ib3hfdGVzdF9ydW5uZXIgd2l0aCB0ZXN0IHJlc3VsdC4iIiIKLSAgICBzZWxmLmRlZmF1bHRfdGVzdF9kYXRhX3NlcnZlcl9wcm9jZXNzLmtpbGwoKQotCiAKIGRlZiBtYWluKCk6CiAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmxhY2tfYm94X3Rlc3RzL3Rlc3RkYXRhL2NhbmNlbF9zeW5jX2xvYWRzX3doZW5fc3VzcGVuZGVkLmh0bWwgYi9zcmMvY29iYWx0L2JsYWNrX2JveF90ZXN0cy90ZXN0ZGF0YS9jYW5jZWxfc3luY19sb2Fkc193aGVuX3N1c3BlbmRlZC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MGJjNTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JsYWNrX2JveF90ZXN0cy90ZXN0ZGF0YS9jYW5jZWxfc3luY19sb2Fkc193aGVuX3N1c3BlbmRlZC5odG1sCkBAIC0wLDAgKzEsOCBAQAorPEhUTUw+CisgIDxIRUFEPjwvSEVBRD4KKyAgPEJPRFk+CisgICAgPHNjcmlwdCBzcmM9J2JsYWNrX2JveF9qc190ZXN0X3V0aWxzLmpzJz48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0nY2FuY2VsX3N5bmNfbG9hZHNfd2hlbl9zdXNwZW5kZWQuanMnPjwvc2NyaXB0PgorICAgIDxzY3JpcHQ+b25FbmRUZXN0KCk8L3NjcmlwdD4KKyAgPC9CT0RZPgorPC9IVE1MPgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9ibGFja19ib3hfdGVzdHMvdGVzdGRhdGEvcmV0cnlfYXN5bmNfc2NyaXB0X2xvYWRzX2FmdGVyX3N1c3BlbmQuaHRtbCBiL3NyYy9jb2JhbHQvYmxhY2tfYm94X3Rlc3RzL3Rlc3RkYXRhL3JldHJ5X2FzeW5jX3NjcmlwdF9sb2Fkc19hZnRlcl9zdXNwZW5kLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFmNzljMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmxhY2tfYm94X3Rlc3RzL3Rlc3RkYXRhL3JldHJ5X2FzeW5jX3NjcmlwdF9sb2Fkc19hZnRlcl9zdXNwZW5kLmh0bWwKQEAgLTAsMCArMSwyMCBAQAorPEhUTUw+CisgIDxIRUFEPjwvSEVBRD4KKyAgPEJPRFk+CisgICAgPHNjcmlwdCBzcmM9J2JsYWNrX2JveF9qc190ZXN0X3V0aWxzLmpzJz48L3NjcmlwdD4KKyAgICA8c2NyaXB0PgorICAgICAgdmFyIHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKKyAgICAgIHZhciBvbkxvYWRDYWxsZWQgPSBmYWxzZTsKKyAgICAgIHZhciBzY3JpcHRFeGVjdXRlZCA9IGZhbHNlOworICAgICAgLy8gbm90UmVhY2hlZCBhbmQgb25FbmRUZXN0IGFyZSBkZWZpbmVkIGluIGJsYWNrX2JveF9qc190ZXN0X3V0aWxzLmpzCisgICAgICBzLm9uZXJyb3IgPSBub3RSZWFjaGVkOworICAgICAgcy5vbmxvYWQgPSAoKSA9PiB7CisgICAgICAgIGFzc2VydFRydWUoc2NyaXB0RXhlY3V0ZWQpOworICAgICAgICBhc3NlcnRGYWxzZShvbkxvYWRDYWxsZWQpOworICAgICAgICBvbkVuZFRlc3QoKTsKKyAgICAgIH0KKyAgICAgIHMuc3JjPSdzY3JpcHRfZXhlY3V0ZWQuanMnCisgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHMpOworICAgIDwvc2NyaXB0PgorICA8L0JPRFk+Cis8L0hUTUw+CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JsYWNrX2JveF90ZXN0cy90ZXN0ZGF0YS9zY3JpcHRfZXhlY3V0ZWQuanMgYi9zcmMvY29iYWx0L2JsYWNrX2JveF90ZXN0cy90ZXN0ZGF0YS9zY3JpcHRfZXhlY3V0ZWQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMwNzQ2NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmxhY2tfYm94X3Rlc3RzL3Rlc3RkYXRhL3NjcmlwdF9leGVjdXRlZC5qcwpAQCAtMCwwICsxLDE2IEBACisvLyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCithc3NlcnRGYWxzZShzY3JpcHRFeGVjdXRlZCk7CitzY3JpcHRFeGVjdXRlZCA9IHRydWU7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JsYWNrX2JveF90ZXN0cy90ZXN0cy9hbGxvd19ldmFsLnB5IGIvc3JjL2NvYmFsdC9ibGFja19ib3hfdGVzdHMvdGVzdHMvYWxsb3dfZXZhbC5weQppbmRleCBjYTZiNDdkLi4yMmZhNjBmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JsYWNrX2JveF90ZXN0cy90ZXN0cy9hbGxvd19ldmFsLnB5CisrKyBiL3NyYy9jb2JhbHQvYmxhY2tfYm94X3Rlc3RzL3Rlc3RzL2FsbG93X2V2YWwucHkKQEAgLTcsMTMgKzcsMTUgQEAKIGltcG9ydCBfZW52ICAjIHB5bGludDogZGlzYWJsZT11bnVzZWQtaW1wb3J0CiAKIGZyb20gY29iYWx0LmJsYWNrX2JveF90ZXN0cyBpbXBvcnQgYmxhY2tfYm94X3Rlc3RzCitmcm9tIGNvYmFsdC5ibGFja19ib3hfdGVzdHMudGhyZWFkZWRfd2ViX3NlcnZlciBpbXBvcnQgVGhyZWFkZWRXZWJTZXJ2ZXIKIAogCiBjbGFzcyBBbGxvd0V2YWxUZXN0KGJsYWNrX2JveF90ZXN0cy5CbGFja0JveFRlc3RDYXNlKToKIAogICBkZWYgdGVzdF9zaW1wbGUoc2VsZik6CiAKLSAgICB1cmwgPSBzZWxmLkdldFVSTChmaWxlX25hbWU9J2FsbG93X2V2YWwuaHRtbCcpCisgICAgd2l0aCBUaHJlYWRlZFdlYlNlcnZlcigpIGFzIHNlcnZlcjoKKyAgICAgIHVybCA9IHNlcnZlci5HZXRVUkwoZmlsZV9uYW1lPSd0ZXN0ZGF0YS9hbGxvd19ldmFsLmh0bWwnKQogCi0gICAgd2l0aCBzZWxmLkNyZWF0ZUNvYmFsdFJ1bm5lcih1cmw9dXJsKSBhcyBydW5uZXI6Ci0gICAgICBzZWxmLmFzc2VydFRydWUocnVubmVyLkpTVGVzdHNTdWNjZWVkZWQoKSkKKyAgICAgIHdpdGggc2VsZi5DcmVhdGVDb2JhbHRSdW5uZXIodXJsPXVybCkgYXMgcnVubmVyOgorICAgICAgICBzZWxmLmFzc2VydFRydWUocnVubmVyLkpTVGVzdHNTdWNjZWVkZWQoKSkKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmxhY2tfYm94X3Rlc3RzL3Rlc3RzL2NhbmNlbF9zeW5jX2xvYWRzX3doZW5fc3VzcGVuZGVkLnB5IGIvc3JjL2NvYmFsdC9ibGFja19ib3hfdGVzdHMvdGVzdHMvY2FuY2VsX3N5bmNfbG9hZHNfd2hlbl9zdXNwZW5kZWQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhmMGI3YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmxhY2tfYm94X3Rlc3RzL3Rlc3RzL2NhbmNlbF9zeW5jX2xvYWRzX3doZW5fc3VzcGVuZGVkLnB5CkBAIC0wLDAgKzEsMTMzIEBACisjIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisiIiJUZXN0cyBjYW5jZWxhdGlvbiBvZiBzeW5jaHJvbm91cyBsb2FkaW5nIG9mIHNjcmlwdHMgb24gU3VzcGVuZC4iIiIKKworIyBUaGlzIHRlc3Qgc2NyaXB0IHdvcmtzIGJ5IHNwbGl0dGluZyB0aGUgd29yayBvdmVyIDMgdGhyZWFkcywgc28gdGhhdCB0aGV5CisjIGNhbiBlYWNoIG1ha2UgcHJvZ3Jlc3MgZXZlbiBpZiB0aGV5IGNvbWUgYWNyb3NzIGJsb2NraW5nIG9wZXJhdGlvbnMuCisjIFRoZSB0aHJlZSB0aHJlYWRzIGFyZToKKyMgICAxLiBNYWluIHRocmVhZCwgcnVucyBCbGFja0JveFRlc3RDYXNlLCBzZW5kcyBzdXNwZW5kL3Jlc3VtZSBzaWduYWxzLCBldGMuCisjICAgMi4gSFRUUCBTZXJ2ZXIsIHJlc3BvbnNpYmxlIGZvciBzbG93bHkgcmVzcG9uZGluZyB0byBhIGZldGNoIG9mIGEgamF2YXNjcmlwdAorIyAgICAgIGZpbGUuCisjICAgMy4gV2ViZHJpdmVyIHRocmVhZCwgaW5zdHJ1Y3RzIENvYmFsdCB0byBuYXZpZ2F0ZSB0byBhIFVSTAorIworIyBTdGVwcyBpbiB+IGNocm9ub2xvZ2ljYWwgb3JkZXI6CisjICAgMS4gQ3JlYXRlIGEgVENQIHNvY2tldCBhbmQgbGlzdGVuIG9uIGFsbCBpbnRlcmZhY2VzLgorIyAgIDIuIFN0YXJ0IENvYmFsdCwgYW5kIHBvaW50IGl0IHRvIHRoZSBzb2NrZXQgY3JlYXRlZCBpbiBTdGVwIDEuCisjICAgMy4gV2FpdCBIVFRQIHJlcXVlc3QgZm9yIGh0bWwgcmVzb3VyY2UuCisjICAgNC4gUmVzcG9uZCB0byBhIEhUVFAgcmVxdWVzdC4KKyMgICA1LiBXYWl0IGZvciBhIHJlcXVlc3QgZm9yIGphdmFzY3JpcHQgcmVzb3VyY2UuCisjICAgNi4gU3VzcGVuZCBDb2JhbHQgcHJvY2Vzcy4KKyMgICA3LiBDb2JhbHQgZGlzY29ubmVjdHMgZnJvbSB0aGUgc29ja2V0LgorIyAgIDguIFJlc3VtZSBDb2JhbHQgcHJvY2Vzcywgd2hpY2ggZW5hYmxlcyB0aGUgSlMgdGVzdCB0byBwYXNzLgorIyAgIDkuIENoZWNrIHRvIHNlZSBpZiBKU1Rlc3RzU3VjY2VlZGVkKCkuCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0Citmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCisKK2ltcG9ydCBfZW52ICAjIHB5bGludDogZGlzYWJsZT11bnVzZWQtaW1wb3J0LGctYmFkLWltcG9ydC1vcmRlcgorCitpbXBvcnQgb3MKK2ltcG9ydCBTaW1wbGVIVFRQU2VydmVyCitpbXBvcnQgdGhyZWFkaW5nCitpbXBvcnQgdHJhY2ViYWNrCitpbXBvcnQgdXJscGFyc2UKKworZnJvbSBjb2JhbHQuYmxhY2tfYm94X3Rlc3RzIGltcG9ydCBibGFja19ib3hfdGVzdHMKK2Zyb20gY29iYWx0LmJsYWNrX2JveF90ZXN0cy50aHJlYWRlZF93ZWJfc2VydmVyIGltcG9ydCBNYWtlUmVxdWVzdEhhbmRsZXJDbGFzcworZnJvbSBjb2JhbHQuYmxhY2tfYm94X3Rlc3RzLnRocmVhZGVkX3dlYl9zZXJ2ZXIgaW1wb3J0IFRocmVhZGVkV2ViU2VydmVyCisKK19DQU5DRUxfU1lOQ19MT0FEU19XSEVOX1NVU1BFTkRFRF9IVE1MID0gJ2NhbmNlbF9zeW5jX2xvYWRzX3doZW5fc3VzcGVuZGVkLmh0bWwnCitfQ0FOQ0VMX1NZTkNfTE9BRFNfV0hFTl9TVVNQRU5ERURfSlMgPSAnY2FuY2VsX3N5bmNfbG9hZHNfd2hlbl9zdXNwZW5kZWQuanMnCitfTUFYX0FMTE9UVEVEX1RJTUVfU0VDT05EUyA9IDYwCisKK19yZWNlaXZlZF9zY3JpcHRfcmVzb3VyY2VfcmVxdWVzdCA9IHRocmVhZGluZy5FdmVudCgpCitfdGVzdF9maW5pc2hlZCA9IHRocmVhZGluZy5FdmVudCgpCisKKyMgVGhlIGJhc2UgcGF0aCBvZiB0aGUgcmVxdWVzdGVkIGFzc2V0cyBpcyB0aGUgcGFyZW50IGRpcmVjdG9yeS4KK19TRVJWRVJfUk9PVF9QQVRIID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksIG9zLnBhcmRpcikKKworCitjbGFzcyBKYXZhc2NyaXB0UmVxdWVzdERldGVjdG9yKE1ha2VSZXF1ZXN0SGFuZGxlckNsYXNzKF9TRVJWRVJfUk9PVF9QQVRIKSk6CisgICIiIlByb3hpZXMgZXZlcnl0aGluZyB0byBTaW1wbGVIVFRQUmVxdWVzdEhhbmRsZXIsIGV4Y2VwdCBzb21lIHBhdGhzLiIiIgorCisgIGRlZiBkb19HRVQoc2VsZik6ICAjIHB5bGludDogZGlzYWJsZT1pbnZhbGlkLW5hbWUKKyAgICAiIiJIYW5kbGVzIEhUVFAgR0VUIHJlcXVlc3RzIGZvciByZXNvdXJjZXMuIiIiCisKKyAgICBwYXJzZWRfcGF0aCA9IHVybHBhcnNlLnVybHBhcnNlKHNlbGYucGF0aCkKKyAgICBpZiBwYXJzZWRfcGF0aC5wYXRoID09ICcvdGVzdGRhdGEvJyArIF9DQU5DRUxfU1lOQ19MT0FEU19XSEVOX1NVU1BFTkRFRF9KUzoKKyAgICAgIF9yZWNlaXZlZF9zY3JpcHRfcmVzb3VyY2VfcmVxdWVzdC5zZXQoKQorICAgICAgIyBJdCBpcyBpbXBvcnRhbnQgbm90IHRvIHNlbmQgYW55IHJlc3BvbnNlIGJhY2ssIHNvIHdlIGJsb2NrLgorICAgICAgcHJpbnQoJ1dhaXRpbmcgb24gdGVzdCB0byBmaW5pc2guJykKKyAgICAgIF90ZXN0X2ZpbmlzaGVkLndhaXQoKQorICAgICAgcHJpbnQoJ1Rlc3QgaXMgZmluaXNoZWQuJykKKyAgICAgIHJldHVybgorCisgICAgcmV0dXJuIFNpbXBsZUhUVFBTZXJ2ZXIuU2ltcGxlSFRUUFJlcXVlc3RIYW5kbGVyLmRvX0dFVChzZWxmKQorCisKK2NsYXNzIENhbmNlbFN5bmNMb2Fkc1doZW5TdXNwZW5kZWQoYmxhY2tfYm94X3Rlc3RzLkJsYWNrQm94VGVzdENhc2UpOgorICAiIiJUZXN0cyBjYW5jZWxhdGlvbiBvZiBzeW5jaHJvbm91cyBsb2FkaW5nIG9mIHNjcmlwdHMgb24gU3VzcGVuZC4iIiIKKworICBkZWYgX0xvYWRQYWdlKHNlbGYsIHdlYmRyaXZlciwgdXJsKToKKyAgICAiIiJJbnN0cnVjdHMgd2ViZHJpdmVyIHRvIG5hdmlnYXRlIHRvIHVybC4iIiIKKyAgICB0cnk6CisgICAgICAjIE5vdGU6IFRoZSBmb2xsb3dpbmcgaXMgYSBibG9ja2luZyByZXF1ZXN0LCBhbmQgcmV0dXJucyBvbmx5IHdoZW4gdGhlCisgICAgICAjIHBhZ2UgaGFzIGZ1bGx5IGxvYWRlZC4gIEluIHRoaXMgdGVzdCwgdGhlIHBhZ2Ugd2lsbCBub3QgZnVsbHkgbG9hZAorICAgICAgIyBzbywgdGhpcyBkb2VzIG5vdCByZXR1cm4gdW50aWwgQ29iYWx0IGV4aXRzLgorICAgICAgd2ViZHJpdmVyLmdldCh1cmwpCisgICAgZXhjZXB0OiAgIyBweWxpbnQ6IGRpc2FibGU9YmFyZS1leGNlcHQKKyAgICAgIHRyYWNlYmFjay5wcmludF9leGMoKQorCisgIGRlZiB0ZXN0X3NpbXBsZShzZWxmKToKKworICAgICMgU3RlcCAyLiBTdGFydCBDb2JhbHQsIGFuZCBwb2ludCBpdCB0byB0aGUgc29ja2V0IGNyZWF0ZWQgaW4gU3RlcCAxLgorICAgIHRyeToKKyAgICAgIHdpdGggVGhyZWFkZWRXZWJTZXJ2ZXIoCisgICAgICAgICAgSmF2YXNjcmlwdFJlcXVlc3REZXRlY3RvcikgYXMgc2VydmVyLCBzZWxmLkNyZWF0ZUNvYmFsdFJ1bm5lcigKKyAgICAgICAgICAgICAgdXJsPSdhYm91dDpibGFuaycpIGFzIHJ1bm5lcjoKKyAgICAgICAgdGFyZ2V0X3VybCA9IHNlcnZlci5HZXRVUkwoZmlsZV9uYW1lPScuLi90ZXN0ZGF0YS8nICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NBTkNFTF9TWU5DX0xPQURTX1dIRU5fU1VTUEVOREVEX0hUTUwpCisgICAgICAgIGNvYmFsdF9sYXVuY2hlcl90aHJlYWQgPSB0aHJlYWRpbmcuVGhyZWFkKAorICAgICAgICAgICAgdGFyZ2V0PUNhbmNlbFN5bmNMb2Fkc1doZW5TdXNwZW5kZWQuX0xvYWRQYWdlLAorICAgICAgICAgICAgYXJncz0oc2VsZiwgcnVubmVyLndlYmRyaXZlciwgdGFyZ2V0X3VybCkpCisgICAgICAgIGNvYmFsdF9sYXVuY2hlcl90aHJlYWQuc3RhcnQoKQorCisgICAgICAgICMgU3RlcCAzLiBXYWl0IEhUVFAgcmVxdWVzdCBmb3IgaHRtbCByZXNvdXJjZS4KKyAgICAgICAgcHJpbnQoJ1dhaXRpbmcgZm9yIHNjcmlwdCByZXNvdXJjZSByZXF1ZXN0JykKKyAgICAgICAgcmVxdWVzdF9yZWNlaXZlZCA9IF9yZWNlaXZlZF9zY3JpcHRfcmVzb3VyY2VfcmVxdWVzdC53YWl0KAorICAgICAgICAgICAgX01BWF9BTExPVFRFRF9USU1FX1NFQ09ORFMpCisgICAgICAgIHByaW50KCdSZXF1ZXN0IHJlY2VpdmVkOiB7fScuZm9ybWF0KHJlcXVlc3RfcmVjZWl2ZWQpKQorICAgICAgICAjIFN0ZXAgNS4gV2FpdCBmb3IgYSByZXF1ZXN0IGZvciBqYXZhc2NyaXB0IHJlc291cmNlLgorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVxdWVzdF9yZWNlaXZlZCkKKworICAgICAgICAjIFN0ZXAgNi4gU3VzcGVuZCBDb2JhbHQgcHJvY2Vzcy4KKyAgICAgICAgcHJpbnQoJ1N1c3BlbmRpbmcgQ29iYWx0LicpCisgICAgICAgIHJ1bm5lci5TZW5kU3VzcGVuZCgpCisgICAgICAgICMgU3RlcCA3LiBDb2JhbHQgZGlzY29ubmVjdHMgZnJvbSB0aGUgc29ja2V0LgorICAgICAgICAjIFN0ZXAgOC4gUmVzdW1lIENvYmFsdCBwcm9jZXNzLCB3aGljaCBlbmFibGVzIHRoZSBKUyB0ZXN0IHRvIHBhc3MuCisgICAgICAgIHByaW50KCdSZXN1bWluZyBDb2JhbHQuJykKKyAgICAgICAgcnVubmVyLlNlbmRSZXN1bWUoKQorCisgICAgICAgICMgU3RlcCA5LiBDaGVjayB0byBzZWUgaWYgSlNUZXN0c1N1Y2NlZWRlZCgpLgorICAgICAgICAjIE5vdGUgdGhhdCB0aGlzIGNhbGwgd2lsbCBjaGVjayB0aGUgRE9NIG11bHRpcGxlIHRpbWVzIGZvciBhIHBlcmlvZCBvZgorICAgICAgICAjIHRpbWUgKGN1cnJlbnQgZGVmYXVsdCBpcyAzMCBzZWNvbmRzKS4KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJ1bm5lci5KU1Rlc3RzU3VjY2VlZGVkKCkpCisgICAgZXhjZXB0OiAgIyBweWxpbnQ6IGRpc2FibGU9YmFyZS1leGNlcHQKKyAgICAgIHRyYWNlYmFjay5wcmludF9leGMoKQorICAgICAgIyBDb25zaWRlciBhbiBleGNlcHRpb24gYmVpbmcgdGhyb3duIGFzIGEgdGVzdCBmYWlsdXJlLgorICAgICAgc2VsZi5hc3NlcnRUcnVlKEZhbHNlKQorICAgIGZpbmFsbHk6CisgICAgICBwcmludCgnQ2xlYW5pbmcgdXAuJykKKyAgICAgIF90ZXN0X2ZpbmlzaGVkLnNldCgpCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JsYWNrX2JveF90ZXN0cy90ZXN0cy9kaXNhYmxlX2V2YWxfd2l0aF9jc3AucHkgYi9zcmMvY29iYWx0L2JsYWNrX2JveF90ZXN0cy90ZXN0cy9kaXNhYmxlX2V2YWxfd2l0aF9jc3AucHkKaW5kZXggOTM2YzU3Yi4uMDYyZGMxMSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9ibGFja19ib3hfdGVzdHMvdGVzdHMvZGlzYWJsZV9ldmFsX3dpdGhfY3NwLnB5CisrKyBiL3NyYy9jb2JhbHQvYmxhY2tfYm94X3Rlc3RzL3Rlc3RzL2Rpc2FibGVfZXZhbF93aXRoX2NzcC5weQpAQCAtNywxMyArNywxNSBAQAogaW1wb3J0IF9lbnYgICMgcHlsaW50OiBkaXNhYmxlPXVudXNlZC1pbXBvcnQKIAogZnJvbSBjb2JhbHQuYmxhY2tfYm94X3Rlc3RzIGltcG9ydCBibGFja19ib3hfdGVzdHMKK2Zyb20gY29iYWx0LmJsYWNrX2JveF90ZXN0cy50aHJlYWRlZF93ZWJfc2VydmVyIGltcG9ydCBUaHJlYWRlZFdlYlNlcnZlcgogCiAKIGNsYXNzIERpc2FibGVFdmFsV2l0aENTUFRlc3QoYmxhY2tfYm94X3Rlc3RzLkJsYWNrQm94VGVzdENhc2UpOgogCiAgIGRlZiB0ZXN0X3NpbXBsZShzZWxmKToKIAotICAgIHVybCA9IHNlbGYuR2V0VVJMKGZpbGVfbmFtZT0nZGlzYWJsZV9ldmFsX3dpdGhfY3NwLmh0bWwnKQorICAgIHdpdGggVGhyZWFkZWRXZWJTZXJ2ZXIoKSBhcyBzZXJ2ZXI6CisgICAgICB1cmwgPSBzZXJ2ZXIuR2V0VVJMKGZpbGVfbmFtZT0ndGVzdGRhdGEvZGlzYWJsZV9ldmFsX3dpdGhfY3NwLmh0bWwnKQogCi0gICAgd2l0aCBzZWxmLkNyZWF0ZUNvYmFsdFJ1bm5lcih1cmw9dXJsKSBhcyBydW5uZXI6Ci0gICAgICBzZWxmLmFzc2VydFRydWUocnVubmVyLkpTVGVzdHNTdWNjZWVkZWQoKSkKKyAgICAgIHdpdGggc2VsZi5DcmVhdGVDb2JhbHRSdW5uZXIodXJsPXVybCkgYXMgcnVubmVyOgorICAgICAgICBzZWxmLmFzc2VydFRydWUocnVubmVyLkpTVGVzdHNTdWNjZWVkZWQoKSkKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmxhY2tfYm94X3Rlc3RzL3Rlc3RzL3BlcnNpc3RlbnRfY29va2llLnB5IGIvc3JjL2NvYmFsdC9ibGFja19ib3hfdGVzdHMvdGVzdHMvcGVyc2lzdGVudF9jb29raWUucHkKaW5kZXggNGJiZWZjNS4uYTdkYmE5NSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9ibGFja19ib3hfdGVzdHMvdGVzdHMvcGVyc2lzdGVudF9jb29raWUucHkKKysrIGIvc3JjL2NvYmFsdC9ibGFja19ib3hfdGVzdHMvdGVzdHMvcGVyc2lzdGVudF9jb29raWUucHkKQEAgLTcsNiArNyw3IEBACiBpbXBvcnQgX2VudiAgIyBweWxpbnQ6IGRpc2FibGU9dW51c2VkLWltcG9ydAogCiBmcm9tIGNvYmFsdC5ibGFja19ib3hfdGVzdHMgaW1wb3J0IGJsYWNrX2JveF90ZXN0cworZnJvbSBjb2JhbHQuYmxhY2tfYm94X3Rlc3RzLnRocmVhZGVkX3dlYl9zZXJ2ZXIgaW1wb3J0IFRocmVhZGVkV2ViU2VydmVyCiBmcm9tIGNvYmFsdC50b29scy5hdXRvbWF0ZWRfdGVzdGluZyBpbXBvcnQgd2ViZHJpdmVyX3V0aWxzCiAKIGtleXMgPSB3ZWJkcml2ZXJfdXRpbHMuaW1wb3J0X3NlbGVuaXVtX21vZHVsZSgnd2ViZHJpdmVyLmNvbW1vbi5rZXlzJykKQEAgLTIwLDI3ICsyMSwyOCBAQAogCiAgIGRlZiB0ZXN0X3NpbXBsZShzZWxmKToKIAotICAgIHVybCA9IHNlbGYuR2V0VVJMKGZpbGVfbmFtZT0ncGVyc2lzdGVudF9jb29raWUuaHRtbCcpCisgICAgd2l0aCBUaHJlYWRlZFdlYlNlcnZlcigpIGFzIHNlcnZlcjoKKyAgICAgIHVybCA9IHNlcnZlci5HZXRVUkwoZmlsZV9uYW1lPSd0ZXN0ZGF0YS9wZXJzaXN0ZW50X2Nvb2tpZS5odG1sJykKIAotICAgICMgVGhlIHdlYnBhZ2UgbGlzdGVucyBmb3IgTlVNUEFEMSwgTlVNUEFEMiBhbmQgTlVNUEFEMyBhdCBvcGVuaW5nLgotICAgIHdpdGggc2VsZi5DcmVhdGVDb2JhbHRSdW5uZXIodXJsPXVybCkgYXMgcnVubmVyOgotICAgICAgIyBQcmVzcyBOVU1QQUQxIHRvIHZlcmlmeSBiYXNpYyBjb29raWUgZnVuY3Rpb25hbGl0eSBhbmQgc2V0Ci0gICAgICAjIGEgcGVyc2lzdGVudCBjb29raWUuCi0gICAgICBydW5uZXIuV2FpdEZvckpTVGVzdHNTZXR1cCgpCi0gICAgICBydW5uZXIuU2VuZEtleXMoa2V5cy5LZXlzLk5VTVBBRDEpCi0gICAgICBzZWxmLmFzc2VydFRydWUocnVubmVyLkpTVGVzdHNTdWNjZWVkZWQoKSkKKyAgICAgICMgVGhlIHdlYnBhZ2UgbGlzdGVucyBmb3IgTlVNUEFEMSwgTlVNUEFEMiBhbmQgTlVNUEFEMyBhdCBvcGVuaW5nLgorICAgICAgd2l0aCBzZWxmLkNyZWF0ZUNvYmFsdFJ1bm5lcih1cmw9dXJsKSBhcyBydW5uZXI6CisgICAgICAgICMgUHJlc3MgTlVNUEFEMSB0byB2ZXJpZnkgYmFzaWMgY29va2llIGZ1bmN0aW9uYWxpdHkgYW5kIHNldAorICAgICAgICAjIGEgcGVyc2lzdGVudCBjb29raWUuCisgICAgICAgIHJ1bm5lci5XYWl0Rm9ySlNUZXN0c1NldHVwKCkKKyAgICAgICAgcnVubmVyLlNlbmRLZXlzKGtleXMuS2V5cy5OVU1QQUQxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocnVubmVyLkpTVGVzdHNTdWNjZWVkZWQoKSkKIAotICAgIHdpdGggc2VsZi5DcmVhdGVDb2JhbHRSdW5uZXIodXJsPXVybCkgYXMgcnVubmVyOgotICAgICAgcnVubmVyLldhaXRGb3JKU1Rlc3RzU2V0dXAoKQotICAgICAgIyBQcmVzcyBOVU1QQUQyIHRvIGluZGljYXRlIHRoaXMgaXMgdGhlIHNlY29uZCB0aW1lIHdlIG9wZW5lZAotICAgICAgIyB0aGUgd2VicGFnZSBhbmQgdmVyaWZ5IGEgcGVyc2lzdGVudCBjb29raWUgaXMgb24gZGV2aWNlLiBUaGVuCi0gICAgICAjIGNsZWFyIHRoaXMgcGVyc2lzdGVudCBjb29raWUuCi0gICAgICBydW5uZXIuU2VuZEtleXMoa2V5cy5LZXlzLk5VTVBBRDIpCi0gICAgICBzZWxmLmFzc2VydFRydWUocnVubmVyLkpTVGVzdHNTdWNjZWVkZWQoKSkKKyAgICAgIHdpdGggc2VsZi5DcmVhdGVDb2JhbHRSdW5uZXIodXJsPXVybCkgYXMgcnVubmVyOgorICAgICAgICBydW5uZXIuV2FpdEZvckpTVGVzdHNTZXR1cCgpCisgICAgICAgICMgUHJlc3MgTlVNUEFEMiB0byBpbmRpY2F0ZSB0aGlzIGlzIHRoZSBzZWNvbmQgdGltZSB3ZSBvcGVuZWQKKyAgICAgICAgIyB0aGUgd2VicGFnZSBhbmQgdmVyaWZ5IGEgcGVyc2lzdGVudCBjb29raWUgaXMgb24gZGV2aWNlLiBUaGVuCisgICAgICAgICMgY2xlYXIgdGhpcyBwZXJzaXN0ZW50IGNvb2tpZS4KKyAgICAgICAgcnVubmVyLlNlbmRLZXlzKGtleXMuS2V5cy5OVU1QQUQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocnVubmVyLkpTVGVzdHNTdWNjZWVkZWQoKSkKIAotICAgIHdpdGggc2VsZi5DcmVhdGVDb2JhbHRSdW5uZXIodXJsPXVybCkgYXMgcnVubmVyOgotICAgICAgcnVubmVyLldhaXRGb3JKU1Rlc3RzU2V0dXAoKQotICAgICAgIyBQcmVzcyBOVU1QQUQzIHRvIHZlcmlmeSB0aGUgcGVyc2lzdGVudCBjb29raWUgd2UgY2xlYXJlZCBpcwotICAgICAgIyBub3Qgb24gdGhlIGRldmljZSBmb3IgdGhpcyBVUkwgYW55IG1vcmUuCi0gICAgICBydW5uZXIuU2VuZEtleXMoa2V5cy5LZXlzLk5VTVBBRDMpCi0gICAgICBzZWxmLmFzc2VydFRydWUocnVubmVyLkpTVGVzdHNTdWNjZWVkZWQoKSkKKyAgICAgIHdpdGggc2VsZi5DcmVhdGVDb2JhbHRSdW5uZXIodXJsPXVybCkgYXMgcnVubmVyOgorICAgICAgICBydW5uZXIuV2FpdEZvckpTVGVzdHNTZXR1cCgpCisgICAgICAgICMgUHJlc3MgTlVNUEFEMyB0byB2ZXJpZnkgdGhlIHBlcnNpc3RlbnQgY29va2llIHdlIGNsZWFyZWQgaXMKKyAgICAgICAgIyBub3Qgb24gdGhlIGRldmljZSBmb3IgdGhpcyBVUkwgYW55IG1vcmUuCisgICAgICAgIHJ1bm5lci5TZW5kS2V5cyhrZXlzLktleXMuTlVNUEFEMykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJ1bm5lci5KU1Rlc3RzU3VjY2VlZGVkKCkpCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JsYWNrX2JveF90ZXN0cy90ZXN0cy9wcmVsb2FkX2ZvbnQucHkgYi9zcmMvY29iYWx0L2JsYWNrX2JveF90ZXN0cy90ZXN0cy9wcmVsb2FkX2ZvbnQucHkKaW5kZXggYjUwZTc3OS4uZTM4ZWEyNSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9ibGFja19ib3hfdGVzdHMvdGVzdHMvcHJlbG9hZF9mb250LnB5CisrKyBiL3NyYy9jb2JhbHQvYmxhY2tfYm94X3Rlc3RzL3Rlc3RzL3ByZWxvYWRfZm9udC5weQpAQCAtOSw2ICs5LDcgQEAKIGltcG9ydCBfZW52ICAjIHB5bGludDogZGlzYWJsZT11bnVzZWQtaW1wb3J0CiAKIGZyb20gY29iYWx0LmJsYWNrX2JveF90ZXN0cyBpbXBvcnQgYmxhY2tfYm94X3Rlc3RzCitmcm9tIGNvYmFsdC5ibGFja19ib3hfdGVzdHMudGhyZWFkZWRfd2ViX3NlcnZlciBpbXBvcnQgVGhyZWFkZWRXZWJTZXJ2ZXIKIAogX01BWF9SRVNVTUVfV0FJVF9TRUNPTkRTID0gMzAKIApAQCAtMTcsMTcgKzE4LDE4IEBACiAKICAgZGVmIHRlc3Rfc2ltcGxlKHNlbGYpOgogCi0gICAgdXJsID0gc2VsZi5HZXRVUkwoZmlsZV9uYW1lPSdwcmVsb2FkX2ZvbnQuaHRtbCcpCisgICAgd2l0aCBUaHJlYWRlZFdlYlNlcnZlcigpIGFzIHNlcnZlcjoKKyAgICAgIHVybCA9IHNlcnZlci5HZXRVUkwoZmlsZV9uYW1lPSd0ZXN0ZGF0YS9wcmVsb2FkX2ZvbnQuaHRtbCcpCiAKLSAgICB3aXRoIHNlbGYuQ3JlYXRlQ29iYWx0UnVubmVyKAotICAgICAgICB1cmw9dXJsLCB0YXJnZXRfcGFyYW1zPVsnLS1wcmVsb2FkJ10pIGFzIHJ1bm5lcjoKLSAgICAgIHJ1bm5lci5XYWl0Rm9ySlNUZXN0c1NldHVwKCkKLSAgICAgIHJ1bm5lci5TZW5kUmVzdW1lKCkKLSAgICAgIHN0YXJ0X3RpbWUgPSB0aW1lLnRpbWUoKQotICAgICAgd2hpbGUgcnVubmVyLklzSW5QcmVsb2FkKCk6Ci0gICAgICAgIGlmIHRpbWUudGltZSgpIC0gc3RhcnRfdGltZSA+IF9NQVhfUkVTVU1FX1dBSVRfU0VDT05EUzoKLSAgICAgICAgICByYWlzZSBFeGNlcHRpb24oJ0NvYmFsdCBjYW4gbm90IGV4aXQgcHJlbG9hZCBtb2RlIGFmdGVyIHJlY2VpdmluZycKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Jlc3VtZSBzaWduYWwnKQotICAgICAgICB0aW1lLnNsZWVwKC4xKQotICAgICAgIyBBdCB0aGlzIHBvaW50LCBDb2JhbHQgaXMgaW4gc3RhcnRlZCBtb2RlLgotICAgICAgc2VsZi5hc3NlcnRUcnVlKHJ1bm5lci5KU1Rlc3RzU3VjY2VlZGVkKCkpCisgICAgICB3aXRoIHNlbGYuQ3JlYXRlQ29iYWx0UnVubmVyKAorICAgICAgICAgIHVybD11cmwsIHRhcmdldF9wYXJhbXM9WyctLXByZWxvYWQnXSkgYXMgcnVubmVyOgorICAgICAgICBydW5uZXIuV2FpdEZvckpTVGVzdHNTZXR1cCgpCisgICAgICAgIHJ1bm5lci5TZW5kUmVzdW1lKCkKKyAgICAgICAgc3RhcnRfdGltZSA9IHRpbWUudGltZSgpCisgICAgICAgIHdoaWxlIHJ1bm5lci5Jc0luUHJlbG9hZCgpOgorICAgICAgICAgIGlmIHRpbWUudGltZSgpIC0gc3RhcnRfdGltZSA+IF9NQVhfUkVTVU1FX1dBSVRfU0VDT05EUzoKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbignQ29iYWx0IGNhbiBub3QgZXhpdCBwcmVsb2FkIG1vZGUgYWZ0ZXIgcmVjZWl2aW5nJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXN1bWUgc2lnbmFsJykKKyAgICAgICAgICB0aW1lLnNsZWVwKC4xKQorICAgICAgICAjIEF0IHRoaXMgcG9pbnQsIENvYmFsdCBpcyBpbiBzdGFydGVkIG1vZGUuCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShydW5uZXIuSlNUZXN0c1N1Y2NlZWRlZCgpKQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9ibGFja19ib3hfdGVzdHMvdGVzdHMvcHJlbG9hZF92aXNpYmlsaXR5LnB5IGIvc3JjL2NvYmFsdC9ibGFja19ib3hfdGVzdHMvdGVzdHMvcHJlbG9hZF92aXNpYmlsaXR5LnB5CmluZGV4IGNkMjM2MTQuLjVhODE4ODEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmxhY2tfYm94X3Rlc3RzL3Rlc3RzL3ByZWxvYWRfdmlzaWJpbGl0eS5weQorKysgYi9zcmMvY29iYWx0L2JsYWNrX2JveF90ZXN0cy90ZXN0cy9wcmVsb2FkX3Zpc2liaWxpdHkucHkKQEAgLTcsMTcgKzcsMTkgQEAKIGltcG9ydCBfZW52ICAjIHB5bGludDogZGlzYWJsZT11bnVzZWQtaW1wb3J0CiAKIGZyb20gY29iYWx0LmJsYWNrX2JveF90ZXN0cyBpbXBvcnQgYmxhY2tfYm94X3Rlc3RzCitmcm9tIGNvYmFsdC5ibGFja19ib3hfdGVzdHMudGhyZWFkZWRfd2ViX3NlcnZlciBpbXBvcnQgVGhyZWFkZWRXZWJTZXJ2ZXIKIAogCiBjbGFzcyBQcmVsb2FkVmlzaWJpbGl0eVRlc3QoYmxhY2tfYm94X3Rlc3RzLkJsYWNrQm94VGVzdENhc2UpOgogCiAgIGRlZiB0ZXN0X3NpbXBsZShzZWxmKToKIAotICAgIHVybCA9IHNlbGYuR2V0VVJMKGZpbGVfbmFtZT0ncHJlbG9hZF92aXNpYmlsaXR5Lmh0bWwnKQorICAgIHdpdGggVGhyZWFkZWRXZWJTZXJ2ZXIoKSBhcyBzZXJ2ZXI6CisgICAgICB1cmwgPSBzZXJ2ZXIuR2V0VVJMKGZpbGVfbmFtZT0ndGVzdGRhdGEvcHJlbG9hZF92aXNpYmlsaXR5Lmh0bWwnKQogCi0gICAgd2l0aCBzZWxmLkNyZWF0ZUNvYmFsdFJ1bm5lcigKLSAgICAgICAgdXJsPXVybCwgdGFyZ2V0X3BhcmFtcz1bJy0tcHJlbG9hZCddKSBhcyBydW5uZXI6Ci0gICAgICBydW5uZXIuV2FpdEZvckpTVGVzdHNTZXR1cCgpCi0gICAgICBzZWxmLmFzc2VydFRydWUocnVubmVyLklzSW5QcmVsb2FkKCkpCi0gICAgICBydW5uZXIuU2VuZFJlc3VtZSgpCi0gICAgICBzZWxmLmFzc2VydFRydWUocnVubmVyLkpTVGVzdHNTdWNjZWVkZWQoKSkKKyAgICAgIHdpdGggc2VsZi5DcmVhdGVDb2JhbHRSdW5uZXIoCisgICAgICAgICAgdXJsPXVybCwgdGFyZ2V0X3BhcmFtcz1bJy0tcHJlbG9hZCddKSBhcyBydW5uZXI6CisgICAgICAgIHJ1bm5lci5XYWl0Rm9ySlNUZXN0c1NldHVwKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJ1bm5lci5Jc0luUHJlbG9hZCgpKQorICAgICAgICBydW5uZXIuU2VuZFJlc3VtZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShydW5uZXIuSlNUZXN0c1N1Y2NlZWRlZCgpKQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9ibGFja19ib3hfdGVzdHMvdGVzdHMvcmV0cnlfYXN5bmNfc2NyaXB0X2xvYWRzX2FmdGVyX3N1c3BlbmQucHkgYi9zcmMvY29iYWx0L2JsYWNrX2JveF90ZXN0cy90ZXN0cy9yZXRyeV9hc3luY19zY3JpcHRfbG9hZHNfYWZ0ZXJfc3VzcGVuZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTRkNjgwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9ibGFja19ib3hfdGVzdHMvdGVzdHMvcmV0cnlfYXN5bmNfc2NyaXB0X2xvYWRzX2FmdGVyX3N1c3BlbmQucHkKQEAgLTAsMCArMSwxNDUgQEAKKyMgQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyIiIlRlc3RzIHJldHJ5IG9mIGFzeW5jaHJvbm91cyBsb2FkaW5nIG9mIHNjcmlwdHMgb24gU3VzcGVuZC9SZXN1bWUuIiIiCisKKyMgVGhpcyB0ZXN0IHNjcmlwdCB3b3JrcyBieSBzcGxpdHRpbmcgdGhlIHdvcmsgb3ZlciAzIHRocmVhZHMsIHNvIHRoYXQgdGhleQorIyBjYW4gZWFjaCBtYWtlIHByb2dyZXNzIGV2ZW4gaWYgdGhleSBjb21lIGFjcm9zcyBibG9ja2luZyBvcGVyYXRpb25zLgorIyBUaGUgdGhyZWUgdGhyZWFkcyBhcmU6CisjICAgMS4gTWFpbiB0aHJlYWQsIHJ1bnMgQmxhY2tCb3hUZXN0Q2FzZSwgc2VuZHMgc3VzcGVuZC9yZXN1bWUgc2lnbmFscywgZXRjLgorIyAgIDIuIEhUVFAgU2VydmVyLCByZXNwb25zaWJsZSBmb3Igc2xvd2x5IHJlc3BvbmRpbmcgdG8gYSBmZXRjaCBvZiBhIGphdmFzY3JpcHQKKyMgICAgICBmaWxlLgorIyAgIDMuIFdlYmRyaXZlciB0aHJlYWQsIGluc3RydWN0cyBDb2JhbHQgdG8gbmF2aWdhdGUgdG8gYSBVUkwKKyMKKyMgU3RlcHMgaW4gfiBjaHJvbm9sb2dpY2FsIG9yZGVyOgorIyAgIDEuIENyZWF0ZSBhIFRDUCBzb2NrZXQgYW5kIGxpc3RlbiBvbiBhbGwgaW50ZXJmYWNlcy4KKyMgICAyLiBTdGFydCBDb2JhbHQsIGFuZCBwb2ludCBpdCB0byB0aGUgc29ja2V0IGNyZWF0ZWQgaW4gU3RlcCAxLgorIyAgIDMuIFdhaXQgSFRUUCByZXF1ZXN0IGZvciBodG1sIHJlc291cmNlLgorIyAgIDQuIFJlc3BvbmQgdG8gYSBIVFRQIHJlcXVlc3QuCisjICAgNS4gV2FpdCBmb3IgYSByZXF1ZXN0IGZvciBqYXZhc2NyaXB0IHJlc291cmNlLgorIyAgIDYuIFN1c3BlbmQgQ29iYWx0IHByb2Nlc3MuCisjICAgNy4gQ29iYWx0IGRpc2Nvbm5lY3RzIGZyb20gdGhlIHNvY2tldC4KKyMgICA4LiBSZXN1bWUgQ29iYWx0IHByb2Nlc3MuCisjICAgOS4gUmV0cnkgamF2YXNjcmlwdCByZXNvdXJjZSwgd2hpY2ggYWxsb3dzIHRoZSB0ZXN0IHRvIHBhc3MuCisjICAgOS4gQ2hlY2sgdG8gc2VlIGlmIEpTVGVzdHNTdWNjZWVkZWQoKS4KKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgZGl2aXNpb24KK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KKworaW1wb3J0IF9lbnYgICMgcHlsaW50OiBkaXNhYmxlPXVudXNlZC1pbXBvcnQsZy1iYWQtaW1wb3J0LW9yZGVyCisKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgb3MKK2ltcG9ydCBTaW1wbGVIVFRQU2VydmVyCitpbXBvcnQgdGhyZWFkaW5nCitpbXBvcnQgdHJhY2ViYWNrCitpbXBvcnQgdXJscGFyc2UKKworZnJvbSBjb2JhbHQuYmxhY2tfYm94X3Rlc3RzIGltcG9ydCBibGFja19ib3hfdGVzdHMKK2Zyb20gY29iYWx0LmJsYWNrX2JveF90ZXN0cy50aHJlYWRlZF93ZWJfc2VydmVyIGltcG9ydCBNYWtlUmVxdWVzdEhhbmRsZXJDbGFzcworZnJvbSBjb2JhbHQuYmxhY2tfYm94X3Rlc3RzLnRocmVhZGVkX3dlYl9zZXJ2ZXIgaW1wb3J0IFRocmVhZGVkV2ViU2VydmVyCisKK19IVE1MX0ZJTEVfVE9fUkVRVUVTVCA9ICdyZXRyeV9hc3luY19zY3JpcHRfbG9hZHNfYWZ0ZXJfc3VzcGVuZC5odG1sJworX0pTX0ZJTEVfVE9fUkVRVUVTVCA9ICdzY3JpcHRfZXhlY3V0ZWQuanMnCitfTUFYX0FMTE9UVEVEX1RJTUVfU0VDT05EUyA9IDYwCisKK19yZWNlaXZlZF9zY3JpcHRfcmVzb3VyY2VfcmVxdWVzdCA9IHRocmVhZGluZy5FdmVudCgpCitfdGVzdF9maW5pc2hlZCA9IHRocmVhZGluZy5FdmVudCgpCisKKyMgVGhlIGJhc2UgcGF0aCBvZiB0aGUgcmVxdWVzdGVkIGFzc2V0cyBpcyB0aGUgcGFyZW50IGRpcmVjdG9yeS4KK19TRVJWRVJfUk9PVF9QQVRIID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksIG9zLnBhcmRpcikKKworCitjbGFzcyBKYXZhc2NyaXB0UmVxdWVzdERldGVjdG9yKE1ha2VSZXF1ZXN0SGFuZGxlckNsYXNzKF9TRVJWRVJfUk9PVF9QQVRIKSk6CisgICIiIlByb3hpZXMgZXZlcnl0aGluZyB0byBTaW1wbGVIVFRQUmVxdWVzdEhhbmRsZXIsIGV4Y2VwdCBzb21lIHBhdGhzLiIiIgorICBfY291bnRlcl9sb2NrID0gdGhyZWFkaW5nLkxvY2soKQorICBfcmVxdWVzdF9jb3VudGVyID0gMAorCisgIGRlZiBkb19HRVQoc2VsZik6ICAjIHB5bGludDogZGlzYWJsZT1pbnZhbGlkLW5hbWUKKyAgICAiIiJIYW5kbGVzIEhUVFAgR0VUIHJlcXVlc3RzIGZvciByZXNvdXJjZXMuIiIiCisKKyAgICBwYXJzZWRfcGF0aCA9IHVybHBhcnNlLnVybHBhcnNlKHNlbGYucGF0aCkKKworICAgIGlmIHBhcnNlZF9wYXRoLnBhdGggPT0gJy90ZXN0ZGF0YS8nICsgX0pTX0ZJTEVfVE9fUkVRVUVTVDoKKyAgICAgIF9yZWNlaXZlZF9zY3JpcHRfcmVzb3VyY2VfcmVxdWVzdC5zZXQoKQorICAgICAgY3VycmVudF9jb3VudCA9IE5vbmUKKyAgICAgIHdpdGggc2VsZi5fY291bnRlcl9sb2NrOgorICAgICAgICBKYXZhc2NyaXB0UmVxdWVzdERldGVjdG9yLl9yZXF1ZXN0X2NvdW50ZXIgKz0gMQorICAgICAgICBjdXJyZW50X2NvdW50ID0gSmF2YXNjcmlwdFJlcXVlc3REZXRlY3Rvci5fcmVxdWVzdF9jb3VudGVyCisKKyAgICAgIGlmIGN1cnJlbnRfY291bnQgPCAyOgorICAgICAgICAjIEl0IGlzIGltcG9ydGFudCBub3QgdG8gc2VuZCBhbnkgcmVzcG9uc2UgYmFjaywgc28gd2UgYmxvY2suCisgICAgICAgIGxvZ2dpbmcuaW5mbygnV2FpdGluZyBvbiB0ZXN0IHRvIGZpbmlzaC4nKQorICAgICAgICBfdGVzdF9maW5pc2hlZC53YWl0KCkKKyAgICAgICAgIyBSZXR1cm5zIGEgNDA0LCB0byBtYWtlIHN1cmUgdGhlIHBhZ2UgaXNuJ3QgbG9hZGVkIGJ5IHRoZSBmaXJzdAorICAgICAgICAjIHJlcXVlc3QuCisgICAgICAgIHJldHVybgorCisgICAgcmV0dXJuIFNpbXBsZUhUVFBTZXJ2ZXIuU2ltcGxlSFRUUFJlcXVlc3RIYW5kbGVyLmRvX0dFVChzZWxmKQorCisKK2NsYXNzIFJldHJ5QXN5bmNTY3JpcHRMb2Fkc0FmdGVyU3VzcGVuZChibGFja19ib3hfdGVzdHMuQmxhY2tCb3hUZXN0Q2FzZSk6CisgICIiIlRlc3RzIGNhbmNlbGF0aW9uIG9mIHN5bmNocm9ub3VzIGxvYWRpbmcgb2Ygc2NyaXB0cyBvbiBTdXNwZW5kLiIiIgorCisgIGRlZiBfTG9hZFBhZ2Uoc2VsZiwgd2ViZHJpdmVyLCB1cmwpOgorICAgICIiIkluc3RydWN0cyB3ZWJkcml2ZXIgdG8gbmF2aWdhdGUgdG8gdXJsLiIiIgorICAgIHRyeToKKyAgICAgICMgTm90ZTogVGhlIGZvbGxvd2luZyBpcyBhIGJsb2NraW5nIHJlcXVlc3QsIGFuZCByZXR1cm5zIG9ubHkgd2hlbiB0aGUKKyAgICAgICMgcGFnZSBoYXMgZnVsbHkgbG9hZGVkLiAgSW4gdGhpcyB0ZXN0LCB0aGUgcGFnZSB3aWxsIG5vdCBmdWxseSBsb2FkCisgICAgICAjIHNvLCB0aGlzIGRvZXMgbm90IHJldHVybiB1bnRpbCBDb2JhbHQgZXhpdHMuCisgICAgICB3ZWJkcml2ZXIuZ2V0KHVybCkKKyAgICBleGNlcHQ6ICAjIHB5bGludDogZGlzYWJsZT1iYXJlLWV4Y2VwdAorICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpCisKKyAgZGVmIHRlc3Rfc2ltcGxlKHNlbGYpOgorCisgICAgIyBTdGVwIDIuIFN0YXJ0IENvYmFsdCwgYW5kIHBvaW50IGl0IHRvIHRoZSBzb2NrZXQgY3JlYXRlZCBpbiBTdGVwIDEuCisgICAgdHJ5OgorICAgICAgd2l0aCBUaHJlYWRlZFdlYlNlcnZlcigKKyAgICAgICAgICBKYXZhc2NyaXB0UmVxdWVzdERldGVjdG9yKSBhcyBzZXJ2ZXIsIHNlbGYuQ3JlYXRlQ29iYWx0UnVubmVyKAorICAgICAgICAgICAgICB1cmw9J2Fib3V0OmJsYW5rJykgYXMgcnVubmVyOgorICAgICAgICB0YXJnZXRfdXJsID0gc2VydmVyLkdldFVSTChmaWxlX25hbWU9Jy4uL3Rlc3RkYXRhLycgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSFRNTF9GSUxFX1RPX1JFUVVFU1QpCisgICAgICAgIGNvYmFsdF9sYXVuY2hlcl90aHJlYWQgPSB0aHJlYWRpbmcuVGhyZWFkKAorICAgICAgICAgICAgdGFyZ2V0PVJldHJ5QXN5bmNTY3JpcHRMb2Fkc0FmdGVyU3VzcGVuZC5fTG9hZFBhZ2UsCisgICAgICAgICAgICBhcmdzPShzZWxmLCBydW5uZXIud2ViZHJpdmVyLCB0YXJnZXRfdXJsKSkKKyAgICAgICAgY29iYWx0X2xhdW5jaGVyX3RocmVhZC5zdGFydCgpCisKKyAgICAgICAgIyBTdGVwIDMuIFdhaXQgSFRUUCByZXF1ZXN0IGZvciBodG1sIHJlc291cmNlLgorICAgICAgICBsb2dnaW5nLmluZm8oJ1dhaXRpbmcgZm9yIHNjcmlwdCByZXNvdXJjZSByZXF1ZXN0JykKKyAgICAgICAgcmVxdWVzdF9yZWNlaXZlZCA9IF9yZWNlaXZlZF9zY3JpcHRfcmVzb3VyY2VfcmVxdWVzdC53YWl0KAorICAgICAgICAgICAgX01BWF9BTExPVFRFRF9USU1FX1NFQ09ORFMpCisgICAgICAgIGxvZ2dpbmcuaW5mbygnUmVxdWVzdCByZWNlaXZlZDoge30nLmZvcm1hdChyZXF1ZXN0X3JlY2VpdmVkKSkKKyAgICAgICAgIyBTdGVwIDUuIFdhaXQgZm9yIGEgcmVxdWVzdCBmb3IgamF2YXNjcmlwdCByZXNvdXJjZS4KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlcXVlc3RfcmVjZWl2ZWQpCisKKyAgICAgICAgIyBTdGVwIDYuIFN1c3BlbmQgQ29iYWx0IHByb2Nlc3MuCisgICAgICAgIGxvZ2dpbmcuaW5mbygnU3VzcGVuZGluZyBDb2JhbHQuJykKKyAgICAgICAgcnVubmVyLlNlbmRTdXNwZW5kKCkKKyAgICAgICAgIyBTdGVwIDcuIENvYmFsdCBkaXNjb25uZWN0cyBmcm9tIHRoZSBzb2NrZXQuCisgICAgICAgICMgU3RlcCA4LiBSZXN1bWUgQ29iYWx0IHByb2Nlc3MsIHdoaWNoIGVuYWJsZXMgdGhlIEpTIHRlc3QgdG8gcGFzcy4KKyAgICAgICAgbG9nZ2luZy5pbmZvKCdSZXN1bWluZyBDb2JhbHQuJykKKyAgICAgICAgcnVubmVyLlNlbmRSZXN1bWUoKQorCisgICAgICAgICMgU3RlcCA5LiBDaGVjayB0byBzZWUgaWYgSlNUZXN0c1N1Y2NlZWRlZCgpLgorICAgICAgICAjIE5vdGUgdGhhdCB0aGlzIGNhbGwgd2lsbCBjaGVjayB0aGUgRE9NIG11bHRpcGxlIHRpbWVzIGZvciBhIHBlcmlvZCBvZgorICAgICAgICAjIHRpbWUgKGN1cnJlbnQgZGVmYXVsdCBpcyAzMCBzZWNvbmRzKS4KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJ1bm5lci5KU1Rlc3RzU3VjY2VlZGVkKCkpCisgICAgZXhjZXB0OiAgIyBweWxpbnQ6IGRpc2FibGU9YmFyZS1leGNlcHQKKyAgICAgIHRyYWNlYmFjay5wcmludF9leGMoKQorICAgICAgIyBDb25zaWRlciBhbiBleGNlcHRpb24gYmVpbmcgdGhyb3duIGFzIGEgdGVzdCBmYWlsdXJlLgorICAgICAgc2VsZi5hc3NlcnRUcnVlKEZhbHNlKQorICAgIGZpbmFsbHk6CisgICAgICBsb2dnaW5nLmluZm8oJ0NsZWFuaW5nIHVwLicpCisgICAgICBfdGVzdF9maW5pc2hlZC5zZXQoKQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9ibGFja19ib3hfdGVzdHMvdGVzdHMvc3VzcGVuZF92aXNpYmlsaXR5LnB5IGIvc3JjL2NvYmFsdC9ibGFja19ib3hfdGVzdHMvdGVzdHMvc3VzcGVuZF92aXNpYmlsaXR5LnB5CmluZGV4IDY2YjhjMGMuLmU3ZGJlNGQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmxhY2tfYm94X3Rlc3RzL3Rlc3RzL3N1c3BlbmRfdmlzaWJpbGl0eS5weQorKysgYi9zcmMvY29iYWx0L2JsYWNrX2JveF90ZXN0cy90ZXN0cy9zdXNwZW5kX3Zpc2liaWxpdHkucHkKQEAgLTcsMTYgKzcsMTggQEAKIGltcG9ydCBfZW52ICAjIHB5bGludDogZGlzYWJsZT11bnVzZWQtaW1wb3J0CiAKIGZyb20gY29iYWx0LmJsYWNrX2JveF90ZXN0cyBpbXBvcnQgYmxhY2tfYm94X3Rlc3RzCitmcm9tIGNvYmFsdC5ibGFja19ib3hfdGVzdHMudGhyZWFkZWRfd2ViX3NlcnZlciBpbXBvcnQgVGhyZWFkZWRXZWJTZXJ2ZXIKIAogCiBjbGFzcyBTdXNwZW5kVmlzaWJpbGl0eVRlc3QoYmxhY2tfYm94X3Rlc3RzLkJsYWNrQm94VGVzdENhc2UpOgogCiAgIGRlZiB0ZXN0X3NpbXBsZShzZWxmKToKIAotICAgIHVybCA9IHNlbGYuR2V0VVJMKGZpbGVfbmFtZT0nc3VzcGVuZF92aXNpYmlsaXR5Lmh0bWwnKQorICAgIHdpdGggVGhyZWFkZWRXZWJTZXJ2ZXIoKSBhcyBzZXJ2ZXI6CisgICAgICB1cmwgPSBzZXJ2ZXIuR2V0VVJMKGZpbGVfbmFtZT0ndGVzdGRhdGEvc3VzcGVuZF92aXNpYmlsaXR5Lmh0bWwnKQogCi0gICAgd2l0aCBzZWxmLkNyZWF0ZUNvYmFsdFJ1bm5lcih1cmw9dXJsKSBhcyBydW5uZXI6Ci0gICAgICBydW5uZXIuV2FpdEZvckpTVGVzdHNTZXR1cCgpCi0gICAgICBydW5uZXIuU2VuZFN1c3BlbmQoKQotICAgICAgcnVubmVyLlNlbmRSZXN1bWUoKQotICAgICAgc2VsZi5hc3NlcnRUcnVlKHJ1bm5lci5KU1Rlc3RzU3VjY2VlZGVkKCkpCisgICAgICB3aXRoIHNlbGYuQ3JlYXRlQ29iYWx0UnVubmVyKHVybD11cmwpIGFzIHJ1bm5lcjoKKyAgICAgICAgcnVubmVyLldhaXRGb3JKU1Rlc3RzU2V0dXAoKQorICAgICAgICBydW5uZXIuU2VuZFN1c3BlbmQoKQorICAgICAgICBydW5uZXIuU2VuZFJlc3VtZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShydW5uZXIuSlNUZXN0c1N1Y2NlZWRlZCgpKQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9ibGFja19ib3hfdGVzdHMvdGVzdHMvdGltZXJfaGl0X2FmdGVyX3ByZWxvYWQucHkgYi9zcmMvY29iYWx0L2JsYWNrX2JveF90ZXN0cy90ZXN0cy90aW1lcl9oaXRfYWZ0ZXJfcHJlbG9hZC5weQppbmRleCBkMGQ4MDNlLi5jODg5YjQ4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JsYWNrX2JveF90ZXN0cy90ZXN0cy90aW1lcl9oaXRfYWZ0ZXJfcHJlbG9hZC5weQorKysgYi9zcmMvY29iYWx0L2JsYWNrX2JveF90ZXN0cy90ZXN0cy90aW1lcl9oaXRfYWZ0ZXJfcHJlbG9hZC5weQpAQCAtNywxOCArNywxOSBAQAogaW1wb3J0IF9lbnYgICMgcHlsaW50OiBkaXNhYmxlPXVudXNlZC1pbXBvcnQKIAogZnJvbSBjb2JhbHQuYmxhY2tfYm94X3Rlc3RzIGltcG9ydCBibGFja19ib3hfdGVzdHMKK2Zyb20gY29iYWx0LmJsYWNrX2JveF90ZXN0cy50aHJlYWRlZF93ZWJfc2VydmVyIGltcG9ydCBUaHJlYWRlZFdlYlNlcnZlcgogCiAKIGNsYXNzIFRpbWVyQWZ0ZXJQcmVsb2FkVGVzdChibGFja19ib3hfdGVzdHMuQmxhY2tCb3hUZXN0Q2FzZSk6CiAKICAgZGVmIHRlc3Rfc2ltcGxlKHNlbGYpOgogCi0gICAgdXJsID0gc2VsZi5HZXRVUkwoZmlsZV9uYW1lPSd0aW1lcl9oaXRfYWZ0ZXJfcHJlbG9hZC5odG1sJykKLQotICAgIHdpdGggc2VsZi5DcmVhdGVDb2JhbHRSdW5uZXIoCi0gICAgICAgIHVybD11cmwsIHRhcmdldF9wYXJhbXM9WyctLXByZWxvYWQnXSkgYXMgcnVubmVyOgotICAgICAgc2VsZi5hc3NlcnRUcnVlKHJ1bm5lci5Jc0luUHJlbG9hZCgpKQotICAgICAgIyBzZXRJbnRlcnZhbCB3aWxsIGhpdCBvbmNlIGR1cmluZyB0aGUgLjUgc2Vjb25kcy4KLSAgICAgIHJ1bm5lci5Qb2xsVW50aWxGb3VuZCgnI3NjcmlwdF9leGVjdXRlZCcpCi0gICAgICBydW5uZXIuU2VuZFJlc3VtZSgpCi0gICAgICBzZWxmLmFzc2VydFRydWUocnVubmVyLkpTVGVzdHNTdWNjZWVkZWQoKSkKKyAgICB3aXRoIFRocmVhZGVkV2ViU2VydmVyKCkgYXMgc2VydmVyOgorICAgICAgdXJsID0gc2VydmVyLkdldFVSTChmaWxlX25hbWU9J3Rlc3RkYXRhL3RpbWVyX2hpdF9hZnRlcl9wcmVsb2FkLmh0bWwnKQorICAgICAgd2l0aCBzZWxmLkNyZWF0ZUNvYmFsdFJ1bm5lcigKKyAgICAgICAgICB1cmw9dXJsLCB0YXJnZXRfcGFyYW1zPVsnLS1wcmVsb2FkJ10pIGFzIHJ1bm5lcjoKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJ1bm5lci5Jc0luUHJlbG9hZCgpKQorICAgICAgICAjIHNldEludGVydmFsIHdpbGwgaGl0IG9uY2UgZHVyaW5nIHRoZSAuNSBzZWNvbmRzLgorICAgICAgICBydW5uZXIuUG9sbFVudGlsRm91bmQoJyNzY3JpcHRfZXhlY3V0ZWQnKQorICAgICAgICBydW5uZXIuU2VuZFJlc3VtZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShydW5uZXIuSlNUZXN0c1N1Y2NlZWRlZCgpKQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9ibGFja19ib3hfdGVzdHMvdGVzdHMvdGltZXJfaGl0X2luX3ByZWxvYWQucHkgYi9zcmMvY29iYWx0L2JsYWNrX2JveF90ZXN0cy90ZXN0cy90aW1lcl9oaXRfaW5fcHJlbG9hZC5weQppbmRleCAzMjBmMGE1Li5lYTljNDhhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JsYWNrX2JveF90ZXN0cy90ZXN0cy90aW1lcl9oaXRfaW5fcHJlbG9hZC5weQorKysgYi9zcmMvY29iYWx0L2JsYWNrX2JveF90ZXN0cy90ZXN0cy90aW1lcl9oaXRfaW5fcHJlbG9hZC5weQpAQCAtNywxNSArNywxNiBAQAogaW1wb3J0IF9lbnYgICMgcHlsaW50OiBkaXNhYmxlPXVudXNlZC1pbXBvcnQKIAogZnJvbSBjb2JhbHQuYmxhY2tfYm94X3Rlc3RzIGltcG9ydCBibGFja19ib3hfdGVzdHMKK2Zyb20gY29iYWx0LmJsYWNrX2JveF90ZXN0cy50aHJlYWRlZF93ZWJfc2VydmVyIGltcG9ydCBUaHJlYWRlZFdlYlNlcnZlcgogCiAKIGNsYXNzIFRpbWVySW5QcmVsb2FkVGVzdChibGFja19ib3hfdGVzdHMuQmxhY2tCb3hUZXN0Q2FzZSk6CiAKICAgZGVmIHRlc3Rfc2ltcGxlKHNlbGYpOgogCi0gICAgdXJsID0gc2VsZi5HZXRVUkwoZmlsZV9uYW1lPSd0aW1lcl9oaXRfaW5fcHJlbG9hZC5odG1sJykKLQotICAgIHdpdGggc2VsZi5DcmVhdGVDb2JhbHRSdW5uZXIoCi0gICAgICAgIHVybD11cmwsIHRhcmdldF9wYXJhbXM9WyctLXByZWxvYWQnXSkgYXMgcnVubmVyOgotICAgICAgc2VsZi5hc3NlcnRUcnVlKHJ1bm5lci5KU1Rlc3RzU3VjY2VlZGVkKCkpCi0gICAgICBzZWxmLmFzc2VydFRydWUocnVubmVyLklzSW5QcmVsb2FkKCkpCisgICAgd2l0aCBUaHJlYWRlZFdlYlNlcnZlcigpIGFzIHNlcnZlcjoKKyAgICAgIHVybCA9IHNlcnZlci5HZXRVUkwoZmlsZV9uYW1lPSd0ZXN0ZGF0YS90aW1lcl9oaXRfaW5fcHJlbG9hZC5odG1sJykKKyAgICAgIHdpdGggc2VsZi5DcmVhdGVDb2JhbHRSdW5uZXIoCisgICAgICAgICAgdXJsPXVybCwgdGFyZ2V0X3BhcmFtcz1bJy0tcHJlbG9hZCddKSBhcyBydW5uZXI6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShydW5uZXIuSlNUZXN0c1N1Y2NlZWRlZCgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocnVubmVyLklzSW5QcmVsb2FkKCkpCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JsYWNrX2JveF90ZXN0cy90aHJlYWRlZF93ZWJfc2VydmVyLnB5IGIvc3JjL2NvYmFsdC9ibGFja19ib3hfdGVzdHMvdGhyZWFkZWRfd2ViX3NlcnZlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmJmNWNjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9ibGFja19ib3hfdGVzdHMvdGhyZWFkZWRfd2ViX3NlcnZlci5weQpAQCAtMCwwICsxLDEwNyBAQAorIyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIiIiQ29udGFpbnMgYSB0aHJlYWRlZCB3ZWIgc2VydmVyIHVzZWQgZm9yIHNlcnZpbmcgdGVzdGRhdGEuIiIiCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0Citmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCisKK2ltcG9ydCBvcworaW1wb3J0IFNpbXBsZUhUVFBTZXJ2ZXIKK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCBTb2NrZXRTZXJ2ZXIKK2ltcG9ydCB0aHJlYWRpbmcKKworCitjbGFzcyBfVGhyZWFkZWRUQ1BTZXJ2ZXIoU29ja2V0U2VydmVyLlRocmVhZGluZ01peEluLCBTb2NrZXRTZXJ2ZXIuVENQU2VydmVyKToKKyAgcGFzcworCisKK2RlZiBNYWtlUmVxdWVzdEhhbmRsZXJDbGFzcyhiYXNlX3BhdGgpOgorICAiIiJSZXF1ZXN0SGFuZGxlciB0aGF0IHNlcnZlcyBmaWxlcyB0aGF0IHJlc2lkZSByZWxhdGl2ZSB0byBiYXNlX3BhdGguCisKKyAgQXJnczoKKyAgICBiYXNlX3BhdGg6IEEgcGF0aCBjb25zaWRlcmVkIHRvIGJlIHRoZSByb290IGRpcmVjdG9yeS4KKworICBSZXR1cm5zOgorICAgIEEgUmVxdWVzdEhhbmRsZXIgY2xhc3MuCisgICIiIgorCisgIGNsYXNzIFRlc3REYXRhSFRUUFJlcXVlc3RIYW5kbGVyKFNpbXBsZUhUVFBTZXJ2ZXIuU2ltcGxlSFRUUFJlcXVlc3RIYW5kbGVyKToKKyAgICAiIiJIYW5kbGVzIEhUVFAgcmVxdWVzdHMsIGJ1dCBjaGFuZ2VzIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgYXNzZXRzLiIiIgorCisgICAgX2N1cnJlbnRfd29ya2luZ19kaXJlY3RvcnkgPSBvcy5nZXRjd2QoKQorICAgIF9iYXNlX3BhdGggPSBiYXNlX3BhdGgKKworICAgIGRlZiB0cmFuc2xhdGVfcGF0aChzZWxmLCBwYXRoKToKKyAgICAgICIiIlRyYW5zbGF0ZSB0aGUgcmVxdWVzdCBwYXRoIHRvIHRoZSBmaWxlIGluIHRoZSB0ZXN0ZGF0YSBkaXJlY3RvcnkuIiIiCisKKyAgICAgIHBvdGVudGlhbF9wYXRoID0gU2ltcGxlSFRUUFNlcnZlci5TaW1wbGVIVFRQUmVxdWVzdEhhbmRsZXIudHJhbnNsYXRlX3BhdGgoCisgICAgICAgICAgc2VsZiwgcGF0aCkKKyAgICAgIHBvdGVudGlhbF9wYXRoID0gcG90ZW50aWFsX3BhdGgucmVwbGFjZShzZWxmLl9jdXJyZW50X3dvcmtpbmdfZGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2Jhc2VfcGF0aCkKKyAgICAgIHJldHVybiBwb3RlbnRpYWxfcGF0aAorCisgIHJldHVybiBUZXN0RGF0YUhUVFBSZXF1ZXN0SGFuZGxlcgorCisKK2NsYXNzIFRocmVhZGVkV2ViU2VydmVyKG9iamVjdCk6CisgICIiIkEgSFRUUCBXZWJTZXJ2ZXIgdGhhdCBzZXJ2ZXMgcmVxdWVzdHMgaW4gYSBzZXBhcmF0ZSB0aHJlYWQuIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsCisgICAgICAgICAgICAgICBoYW5kbGVyPU1ha2VSZXF1ZXN0SGFuZGxlckNsYXNzKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpKToKKyAgICBfVGhyZWFkZWRUQ1BTZXJ2ZXIuYWxsb3dfcmV1c2VfYWRkcmVzcyA9IFRydWUKKyAgICAjIEdldCB0aGUgc29ja2V0IGFkZHJlc3MgZm9yIHRoZSBBTlkgaW50ZXJmYWNlLiAgRG9pbmcgaXQgdGhpcyB3YXkKKyAgICAjIGhhcyBpdCBzbyB0aGF0IGl0IHdpbGwgd29yayBmb3IgSVB2NCwgYW5kIElQdjYgb25seSBuZXR3b3Jrcy4KKyAgICAjIE5vdGUgdGhhdCBwdXR0aW5nICc6OicgYXMgdGhlIGhvc3RuYW1lIGRvZXMgbm90IHdvcmsgYXQgdGhpcyB0aW1lCisgICAgIyAoc2VlIGh0dHBzOi8vYnVncy5weXRob24ub3JnL2lzc3VlMjAyMTUpLiAgSW5zdGVhZCwgdGhlIGZvbGxvd2luZyBjb2RlCisgICAgIyB3YXMgaW5zcGlyZWQgYnkgaHR0cHM6Ly9kb2NzLnB5dGhvbi5vcmcvMi9saWJyYXJ5L3NvY2tldC5odG1sLgorICAgIGZvciByZXN1bHQgaW4gc29ja2V0LmdldGFkZHJpbmZvKE5vbmUsIDAsIHNvY2tldC5BRl9VTlNQRUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0LlNPQ0tfU1RSRUFNLCAwLCBzb2NrZXQuQUlfUEFTU0lWRSk6CisgICAgICAjIFRoaXMgaXMgKDAuMC4wLjAsIDApIG9yIGVxdWl2YWxlbnQgaW4gSVB2NiAoY291bGQgYmUgbW9yZSB0aGFuIDIKKyAgICAgICMgZWxlbWVudHMpLgorICAgICAgc29ja2V0X2FkZHJlc3MgPSByZXN1bHRbNF0KKyAgICAgIGJyZWFrCisKKyAgICBzZWxmLl9zZXJ2ZXIgPSBfVGhyZWFkZWRUQ1BTZXJ2ZXIoc29ja2V0X2FkZHJlc3MsIGhhbmRsZXIpCisgICAgc2VsZi5fc2VydmVyX3RocmVhZCA9IE5vbmUKKworICAgIHNlbGYuX2JvdW5kX3BvcnQgPSBzZWxmLl9zZXJ2ZXIuc2VydmVyX2FkZHJlc3NbMV0KKyAgICBhZGRyZXNzX3BhY2tfbGlzdCA9IHNvY2tldC5nZXRhZGRyaW5mbyhzb2NrZXQuZ2V0aG9zdG5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9ib3VuZF9wb3J0KQorICAgIGZpcnN0X2FkZHJlc3NfcGFjayA9IGFkZHJlc3NfcGFja19saXN0WzBdCisgICAgc2VsZi5fYm91bmRfaXAsIF8gPSBmaXJzdF9hZGRyZXNzX3BhY2tbNF0KKyAgICBzZWxmLl9ib3VuZF9ob3N0LCBfID0gZmlyc3RfYWRkcmVzc19wYWNrWzRdCisKKyAgZGVmIEdldFVSTChzZWxmLCBmaWxlX25hbWUpOgorICAgICIiIkdpdmVuIGEgfGZpbGVfbmFtZXwsIHJldHVybiBhIEhUVFAgVVJJIHRoYXQgY2FuIGJlIGZldGNoZWQuCisKKyAgICBBcmdzOgorICAgICAgZmlsZV9uYW1lOiBhIHN0cmluZyBjb250YWluaW5nIGEgZmlsZV9uYW1lLgorCisgICAgUmV0dXJuczoKKyAgICAgIEEgc3RyaW5nIGNvbnRhaW5pbmcgYSBIVFRQIFVSSS4KKyAgICAiIiIKKyAgICByZXR1cm4gJ2h0dHA6Ly97fTp7fS97fScuZm9ybWF0KHNlbGYuX2JvdW5kX2hvc3QsIHNlbGYuX2JvdW5kX3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX25hbWUpCisKKyAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICBzZWxmLl9zZXJ2ZXJfdGhyZWFkID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9c2VsZi5fc2VydmVyLnNlcnZlX2ZvcmV2ZXIpCisgICAgc2VsZi5fc2VydmVyX3RocmVhZC5zdGFydCgpCisgICAgcmV0dXJuIHNlbGYKKworICBkZWYgX19leGl0X18oc2VsZiwgZXhjX3R5cGUsIGV4Y192YWx1ZSwgdHJhY2ViYWNrKToKKyAgICBzZWxmLl9zZXJ2ZXIuc2h1dGRvd24oKQorICAgIHNlbGYuX3NlcnZlci5zZXJ2ZXJfY2xvc2UoKQorICAgIHNlbGYuX3NlcnZlcl90aHJlYWQuam9pbigpCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvYXBwbGljYXRpb24uY2MgYi9zcmMvY29iYWx0L2Jyb3dzZXIvYXBwbGljYXRpb24uY2MKaW5kZXggY2NjZThjYi4uZjIzNTJjMiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9icm93c2VyL2FwcGxpY2F0aW9uLmNjCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9hcHBsaWNhdGlvbi5jYwpAQCAtMzcwLDggKzM3MCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAmb3B0aW9ucy0+c2NyYXRjaF9zdXJmYWNlX2NhY2hlX3NpemVfaW5fYnl0ZXMpOwogI2lmIGRlZmluZWQoRU5BQkxFX0RFQlVHX0NPTU1BTkRfTElORV9TV0lUQ0hFUykKICAgYXV0byBjb21tYW5kX2xpbmUgPSBDb21tYW5kTGluZTo6Rm9yQ3VycmVudFByb2Nlc3MoKTsKLSAgaWYgKGNvbW1hbmRfbGluZS0+SGFzU3dpdGNoKGJyb3dzZXI6OnN3aXRjaGVzOjprRGlzYWJsZVJhc3Rlcml6ZXJDYWNoaW5nKSkgewotICAgIG9wdGlvbnMtPmRpc2FibGVfcmFzdGVyaXplcl9jYWNoaW5nID0gdHJ1ZTsKKyAgaWYgKGNvbW1hbmRfbGluZS0+SGFzU3dpdGNoKGJyb3dzZXI6OnN3aXRjaGVzOjprRGlzYWJsZVJhc3Rlcml6ZXJDYWNoaW5nKSB8fAorICAgICAgY29tbWFuZF9saW5lLT5IYXNTd2l0Y2goCisgICAgICAgICAgYnJvd3Nlcjo6c3dpdGNoZXM6OmtGb3JjZURldGVybWluaXN0aWNSZW5kZXJpbmcpKSB7CisgICAgb3B0aW9ucy0+Zm9yY2VfZGV0ZXJtaW5pc3RpY19yZW5kZXJpbmcgPSB0cnVlOwogICB9CiAjZW5kaWYgIC8vIEVOQUJMRV9ERUJVR19DT01NQU5EX0xJTkVfU1dJVENIRVMKIH0KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnJvd3Nlci9icm93c2VyX2JpbmRpbmdzX2dlbi5neXAgYi9zcmMvY29iYWx0L2Jyb3dzZXIvYnJvd3Nlcl9iaW5kaW5nc19nZW4uZ3lwCmluZGV4IGM0YzYzZTIuLjc1YjE4NTkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnJvd3Nlci9icm93c2VyX2JpbmRpbmdzX2dlbi5neXAKKysrIGIvc3JjL2NvYmFsdC9icm93c2VyL2Jyb3dzZXJfYmluZGluZ3NfZ2VuLmd5cApAQCAtMTI5LDYgKzEyOSw3IEBACiAgICAgICAgICcuLi9kb20vbmF2aWdhdG9yLmlkbCcsCiAgICAgICAgICcuLi9kb20vbm9kZS5pZGwnLAogICAgICAgICAnLi4vZG9tL25vZGVfbGlzdC5pZGwnLAorICAgICAgICAnLi4vZG9tL29uX2Vycm9yX2V2ZW50X2xpc3RlbmVyLmlkbCcsCiAgICAgICAgICcuLi9kb20vb25fc2NyZWVuX2tleWJvYXJkLmlkbCcsCiAgICAgICAgICcuLi9kb20vcGVyZm9ybWFuY2UuaWRsJywKICAgICAgICAgJy4uL2RvbS9wZXJmb3JtYW5jZV90aW1pbmcuaWRsJywKQEAgLTE4NSw4ICsxODYsMTIgQEAKIAogICAgICAgICAnLi4vbWVkaWFfY2FwdHVyZS9tZWRpYV9kZXZpY2VfaW5mby5pZGwnLAogICAgICAgICAnLi4vbWVkaWFfY2FwdHVyZS9tZWRpYV9kZXZpY2VzLmlkbCcsCisgICAgICAgICcuLi9tZWRpYV9jYXB0dXJlL21lZGlhX3JlY29yZGVyLmlkbCcsCiAgICAgICAgICcuLi9tZWRpYV9zZXNzaW9uL21lZGlhX21ldGFkYXRhLmlkbCcsCiAgICAgICAgICcuLi9tZWRpYV9zZXNzaW9uL21lZGlhX3Nlc3Npb24uaWRsJywKKyAgICAgICAgJy4uL21lZGlhX3Nlc3Npb24vbWVkaWFfc2Vzc2lvbl9hY3Rpb25fZGV0YWlscy5pZGwnLAorICAgICAgICAnLi4vbWVkaWFfc3RyZWFtL21lZGlhX3N0cmVhbS5pZGwnLAorICAgICAgICAnLi4vbWVkaWFfc3RyZWFtL21lZGlhX3N0cmVhbV90cmFjay5pZGwnLAogCiAgICAgICAgICcuLi9zcGVlY2gvc3BlZWNoX3JlY29nbml0aW9uLmlkbCcsCiAgICAgICAgICcuLi9zcGVlY2gvc3BlZWNoX3JlY29nbml0aW9uX2FsdGVybmF0aXZlLmlkbCcsCkBAIC0yNTUsMTAgKzI2MCwxNCBAQAogICAgICAgICAnLi4vZG9tL3RyYWNrX2RlZmF1bHRfdHlwZS5pZGwnLAogICAgICAgICAnLi4vZG9tL3doZWVsX2V2ZW50X2luaXQuaWRsJywKICAgICAgICAgJy4uL21lZGlhX2NhcHR1cmUvbWVkaWFfZGV2aWNlX2tpbmQuaWRsJywKKyAgICAgICAgJy4uL21lZGlhX2NhcHR1cmUvbWVkaWFfcmVjb3JkZXJfb3B0aW9ucy5pZGwnLAorICAgICAgICAnLi4vbWVkaWFfY2FwdHVyZS9yZWNvcmRpbmdfc3RhdGUuaWRsJywKICAgICAgICAgJy4uL21lZGlhX3Nlc3Npb24vbWVkaWFfaW1hZ2UuaWRsJywKICAgICAgICAgJy4uL21lZGlhX3Nlc3Npb24vbWVkaWFfbWV0YWRhdGFfaW5pdC5pZGwnLAogICAgICAgICAnLi4vbWVkaWFfc2Vzc2lvbi9tZWRpYV9zZXNzaW9uX2FjdGlvbi5pZGwnLAogICAgICAgICAnLi4vbWVkaWFfc2Vzc2lvbi9tZWRpYV9zZXNzaW9uX3BsYXliYWNrX3N0YXRlLmlkbCcsCisgICAgICAgICcuLi9tZWRpYV9zdHJlYW0vbWVkaWFfc3RyZWFtX2NvbnN0cmFpbnRzLmlkbCcsCisgICAgICAgICcuLi9tZWRpYV9zdHJlYW0vbWVkaWFfdHJhY2tfc2V0dGluZ3MuaWRsJywKICAgICAgICAgJy4uL3BhZ2VfdmlzaWJpbGl0eS92aXNpYmlsaXR5X3N0YXRlLmlkbCcsCiAgICAgICAgICcuLi9zcGVlY2gvc3BlZWNoX3JlY29nbml0aW9uX2Vycm9yX2NvZGUuaWRsJywKICAgICAgICAgJy4uL3NwZWVjaC9zcGVlY2hfc3ludGhlc2lzX2Vycm9yX2NvZGUuaWRsJywKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnJvd3Nlci9icm93c2VyX21vZHVsZS5jYyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9icm93c2VyX21vZHVsZS5jYwppbmRleCA3OTExMDY3Li4xZWI3Zjk5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jyb3dzZXIvYnJvd3Nlcl9tb2R1bGUuY2MKKysrIGIvc3JjL2NvYmFsdC9icm93c2VyL2Jyb3dzZXJfbW9kdWxlLmNjCkBAIC02MDgsMzMgKzYwOCw1MiBAQAogICAgIGNvbnN0IEZpbGVQYXRoJiBwYXRoLAogICAgIGxvYWRlcjo6aW1hZ2U6OkVuY29kZWRTdGF0aWNJbWFnZTo6SW1hZ2VGb3JtYXQgaW1hZ2VfZm9ybWF0LAogICAgIGNvbnN0IGJhc2U6OkNsb3N1cmUmIGRvbmVfY2FsbGJhY2spIHsKKyAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OmJyb3dzZXIiLCAiQnJvd3Nlck1vZHVsZTo6UmVxdWVzdFNjcmVlbnNob3RUb0ZpbGUoKSIpOwogICBEQ0hFQ0soc2NyZWVuX3Nob3Rfd3JpdGVyXyk7Ci0gIERDSEVDSyhtYWluX3dlYl9tb2R1bGVfbGF5ZXJfKTsKLSAgYmFzZTo6b3B0aW9uYWw8cmVuZGVyZXI6OlN1Ym1pc3Npb24+IGxhc3Rfc3VibWlzc2lvbiA9Ci0gICAgICBtYWluX3dlYl9tb2R1bGVfbGF5ZXJfLT5HZXRDdXJyZW50U3VibWlzc2lvbigpOwotICBpZiAoIWxhc3Rfc3VibWlzc2lvbikgewotICAgIExPRyhXQVJOSU5HKSA8PCAiVW5hYmxlIHRvIGZpbmQgbGFzdCBzdWJtaXNzaW9uLiI7CisKKyAgc2NvcGVkX3JlZnB0cjxyZW5kZXJfdHJlZTo6Tm9kZT4gcmVuZGVyX3RyZWUgPSBHZXRMYXN0U3VibWlzc2lvbkFuaW1hdGVkKCk7CisgIGlmICghcmVuZGVyX3RyZWUpIHsKKyAgICBMT0coV0FSTklORykgPDwgIlVuYWJsZSB0byBnZXQgYW5pbWF0ZWQgcmVuZGVyIHRyZWUiOwogICAgIHJldHVybjsKICAgfQotICBEQ0hFQ0sobGFzdF9zdWJtaXNzaW9uLT5yZW5kZXJfdHJlZSk7CisKICAgc2NyZWVuX3Nob3Rfd3JpdGVyXy0+UmVxdWVzdFNjcmVlbnNob3RUb0ZpbGUoCi0gICAgICBpbWFnZV9mb3JtYXQsIHBhdGgsIGxhc3Rfc3VibWlzc2lvbi0+cmVuZGVyX3RyZWUsIGRvbmVfY2FsbGJhY2spOworICAgICAgaW1hZ2VfZm9ybWF0LCBwYXRoLCByZW5kZXJfdHJlZSwgZG9uZV9jYWxsYmFjayk7CiB9CiAKIHZvaWQgQnJvd3Nlck1vZHVsZTo6UmVxdWVzdFNjcmVlbnNob3RUb0J1ZmZlcigKICAgICBsb2FkZXI6OmltYWdlOjpFbmNvZGVkU3RhdGljSW1hZ2U6OkltYWdlRm9ybWF0IGltYWdlX2Zvcm1hdCwKICAgICBjb25zdCBTY3JlZW5TaG90V3JpdGVyOjpJbWFnZUVuY29kZUNvbXBsZXRlQ2FsbGJhY2smIHNjcmVlbnNob3RfcmVhZHkpIHsKKyAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OmJyb3dzZXIiLCAiQnJvd3Nlck1vZHVsZTo6UmVxdWVzdFNjcmVlbnNob3RUb0J1ZmZlcigpIik7CiAgIERDSEVDSyhzY3JlZW5fc2hvdF93cml0ZXJfKTsKKworICBzY29wZWRfcmVmcHRyPHJlbmRlcl90cmVlOjpOb2RlPiByZW5kZXJfdHJlZSA9IEdldExhc3RTdWJtaXNzaW9uQW5pbWF0ZWQoKTsKKyAgaWYgKCFyZW5kZXJfdHJlZSkgeworICAgIExPRyhXQVJOSU5HKSA8PCAiVW5hYmxlIHRvIGdldCBhbmltYXRlZCByZW5kZXIgdHJlZSI7CisgICAgcmV0dXJuOworICB9CisKKyAgc2NyZWVuX3Nob3Rfd3JpdGVyXy0+UmVxdWVzdFNjcmVlbnNob3RUb01lbW9yeSgKKyAgICAgIGltYWdlX2Zvcm1hdCwgcmVuZGVyX3RyZWUsIHNjcmVlbnNob3RfcmVhZHkpOworfQorCitzY29wZWRfcmVmcHRyPHJlbmRlcl90cmVlOjpOb2RlPiBCcm93c2VyTW9kdWxlOjpHZXRMYXN0U3VibWlzc2lvbkFuaW1hdGVkKCkgewogICBEQ0hFQ0sobWFpbl93ZWJfbW9kdWxlX2xheWVyXyk7CiAgIGJhc2U6Om9wdGlvbmFsPHJlbmRlcmVyOjpTdWJtaXNzaW9uPiBsYXN0X3N1Ym1pc3Npb24gPQogICAgICAgbWFpbl93ZWJfbW9kdWxlX2xheWVyXy0+R2V0Q3VycmVudFN1Ym1pc3Npb24oKTsKICAgaWYgKCFsYXN0X3N1Ym1pc3Npb24pIHsKICAgICBMT0coV0FSTklORykgPDwgIlVuYWJsZSB0byBmaW5kIGxhc3Qgc3VibWlzc2lvbi4iOwotICAgIHJldHVybjsKKyAgICByZXR1cm4gbnVsbHB0cjsKICAgfQogICBEQ0hFQ0sobGFzdF9zdWJtaXNzaW9uLT5yZW5kZXJfdHJlZSk7Ci0gIHNjcmVlbl9zaG90X3dyaXRlcl8tPlJlcXVlc3RTY3JlZW5zaG90VG9NZW1vcnkoCi0gICAgICBpbWFnZV9mb3JtYXQsIGxhc3Rfc3VibWlzc2lvbi0+cmVuZGVyX3RyZWUsIHNjcmVlbnNob3RfcmVhZHkpOworCisgIHJlbmRlcl90cmVlOjphbmltYXRpb25zOjpBbmltYXRlTm9kZSogYW5pbWF0ZV9ub2RlID0KKyAgICAgIGJhc2U6OnBvbHltb3JwaGljX2Rvd25jYXN0PHJlbmRlcl90cmVlOjphbmltYXRpb25zOjpBbmltYXRlTm9kZSo+KAorICAgICAgICAgIGxhc3Rfc3VibWlzc2lvbi0+cmVuZGVyX3RyZWUuZ2V0KCkpOworICByZW5kZXJfdHJlZTo6YW5pbWF0aW9uczo6QW5pbWF0ZU5vZGU6OkFuaW1hdGVSZXN1bHRzIHJlc3VsdHMgPQorICAgICAgYW5pbWF0ZV9ub2RlLT5BcHBseShsYXN0X3N1Ym1pc3Npb24tPnRpbWVfb2Zmc2V0KTsKKworICByZXR1cm4gcmVzdWx0cy5hbmltYXRlZC0+c291cmNlKCk7CiB9CiAKIHZvaWQgQnJvd3Nlck1vZHVsZTo6UHJvY2Vzc1JlbmRlclRyZWVTdWJtaXNzaW9uUXVldWUoKSB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvYnJvd3Nlcl9tb2R1bGUuaCBiL3NyYy9jb2JhbHQvYnJvd3Nlci9icm93c2VyX21vZHVsZS5oCmluZGV4IDkwYmMyODcuLjIyZTNiZWQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnJvd3Nlci9icm93c2VyX21vZHVsZS5oCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9icm93c2VyX21vZHVsZS5oCkBAIC0zOTIsNiArMzkyLDEwIEBACiAgIC8vIEdldCB0aGUgU2JXaW5kb3cgdmlhIHxzeXN0ZW1fd2luZG93X3wgb3IgcG90ZW50aWFsbHkgTlVMTC4KICAgU2JXaW5kb3cgR2V0U2JXaW5kb3coKTsKIAorICAvLyBUaGlzIHJldHVybnMgdGhlIHJlbmRlciB0cmVlIG9mIHRoZSBtb3N0IHJlY2VudCBzdWJtaXNzaW9uLCB3aXRoIGFuaW1hdGlvbnMKKyAgLy8gYXBwbGllZCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgdGltZS4KKyAgc2NvcGVkX3JlZnB0cjxyZW5kZXJfdHJlZTo6Tm9kZT4gR2V0TGFzdFN1Ym1pc3Npb25BbmltYXRlZCgpOworCiAgIC8vIFRPRE86CiAgIC8vICAgICBXZWFrUHRyIHVzYWdlIGhlcmUgY2FuIGJlIGF2b2lkZWQgaWYgQnJvd3Nlck1vZHVsZSBoYXMgYSB0aHJlYWQgdG8KICAgLy8gICAgIG93biB3aGVyZSBpdCBjYW4gZW5zdXJlIHRoYXQgaXRzIHRhc2tzIGFyZSBhbGwgcmVzb2x2ZWQgd2hlbiBpdCBpcwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9icm93c2VyL3NjcmVlbl9zaG90X3dyaXRlci5jYyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9zY3JlZW5fc2hvdF93cml0ZXIuY2MKaW5kZXggZmEwMTM3OC4uMmNlNDU1NyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9icm93c2VyL3NjcmVlbl9zaG90X3dyaXRlci5jYworKysgYi9zcmMvY29iYWx0L2Jyb3dzZXIvc2NyZWVuX3Nob3Rfd3JpdGVyLmNjCkBAIC0xNiw2ICsxNiw3IEBACiAKICNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKICNpbmNsdWRlICJiYXNlL2JpbmQuaCIKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCiAjaW5jbHVkZSAiYmFzZS9maWxlX3V0aWwuaCIKICNpbmNsdWRlICJjb2JhbHQvbG9hZGVyL2ltYWdlL2ltYWdlX2VuY29kZXIuaCIKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyX3RyZWUvcmVzb3VyY2VfcHJvdmlkZXJfc3R1Yi5oIgpAQCAtNzMsNiArNzQsNyBAQAogICAgICAgICB2b2lkKGNvbnN0IHNjb3BlZF9yZWZwdHI8bG9hZGVyOjppbWFnZTo6RW5jb2RlZFN0YXRpY0ltYWdlPiYpPiYKICAgICAgICAgZG9uZV9lbmNvZGluZ19jYWxsYmFjaywKICAgICBzY29wZWRfYXJyYXk8dWludDg+IHBpeGVsX2RhdGEsIGNvbnN0IG1hdGg6OlNpemUmIGltYWdlX2RpbWVuc2lvbnMpIHsKKyAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OmJyb3dzZXIiLCAiU2NyZWVuc2hvdFdyaXRlcjo6RW5jb2RlRGF0YSgpIik7CiAgIHNjb3BlZF9yZWZwdHI8bG9hZGVyOjppbWFnZTo6RW5jb2RlZFN0YXRpY0ltYWdlPiBpbWFnZV9kYXRhID0KICAgICAgIGxvYWRlcjo6aW1hZ2U6OkNvbXByZXNzUkdCQUltYWdlKGRlc2lyZWRfZm9ybWF0LCBwaXhlbF9kYXRhLmdldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VfZGltZW5zaW9ucyk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvc3dpdGNoZXMuY2MgYi9zcmMvY29iYWx0L2Jyb3dzZXIvc3dpdGNoZXMuY2MKaW5kZXggZjI2YjMxNy4uZmU5NDU1NSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9icm93c2VyL3N3aXRjaGVzLmNjCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9zd2l0Y2hlcy5jYwpAQCAtMzUsMTAgKzM1LDIxIEBACiBjb25zdCBjaGFyIGtEaXNhYmxlSW1hZ2VBbmltYXRpb25zSGVscFtdID0KICAgICAiRW5hYmxlcy9kaXNhYmxlcyBhbmltYXRpb25zIG9uIGFuaW1hdGVkIGltYWdlcyAoZS5nLiBhbmltYXRlZCBXZWJQKS4iOwogCitjb25zdCBjaGFyIGtGb3JjZURldGVybWluaXN0aWNSZW5kZXJpbmdbXSA9ICJmb3JjZV9kZXRlcm1pbmlzdGljX3JlbmRlcmluZyI7Citjb25zdCBjaGFyIGtGb3JjZURldGVybWluaXN0aWNSZW5kZXJpbmdIZWxwW10gPQorICAgICJGb3JjZXMgdGhlIHJlbmRlcmVyIHRvIGF2b2lkIGRvaW5nIGFueXRoaW5nIHRoYXQgbWF5IHJlc3VsdCBpbiAiCisgICAgIjEtcGl4ZWwtb2ZmIG5vbi1kZXRlcm1pbmlzdGljIHJlbmRlcmluZyBvdXRwdXQuICBGb3IgZXhhbXBsZSwgYSByZW5kZXJlciAiCisgICAgIm1heSBpbXBsZW1lbnQgYW4gb3B0aW1pemF0aW9uIHdoZXJlIHRleHQgZ2x5cGhzIGFyZSByZW5kZXJlZCBvbmNlIGFuZCAiCisgICAgImNhY2hlZCBhbmQgcmUtdXNlZCBpbiBzaXR1YXRpb25zIHdoZXJlIHRoZSBjYWNoZWQgZ2x5cGggaXMgYXBwcm94aW1hdGVseSAiCisgICAgInZlcnkgc2ltaWxhciwgZXZlbiBpZiBpdCBpcyBub3QgZXhhY3RseSB0aGUgc2FtZS4gIFNldHRpbmcgdGhpcyBmbGFnICIKKyAgICAiYXZvaWRzIHRoYXQga2luZCBvZiBiZWhhdmlvciwgYWxsb3dpbmcgc3RyaWN0IHNjcmVlbi1kaWZmIHRlc3RzIHRvIHBhc3MuIjsKKwogY29uc3QgY2hhciBrRGlzYWJsZVJhc3Rlcml6ZXJDYWNoaW5nW10gPSAiZGlzYWJsZV9yYXN0ZXJpemVyX2NhY2hpbmciOwogY29uc3QgY2hhciBrRGlzYWJsZVJhc3Rlcml6ZXJDYWNoaW5nSGVscFtdID0KICAgICAiRGlzYWJsZXMgY2FjaGluZyBvZiByYXN0ZXJpemVkIHJlbmRlciB0cmVlIG5vZGVzOyBjYWNoaW5nIGltcHJvdmVzICIKLSAgICAicGVyZm9ybWFuY2UgYnV0IG1heSByZXN1bHQgaW4gc3ViLXBpeGVsIGRpZmZlcmVuY2VzLiI7CisgICAgInBlcmZvcm1hbmNlIGJ1dCBtYXkgcmVzdWx0IGluIHN1Yi1waXhlbCBkaWZmZXJlbmNlcy4gIE5vdGUgdGhhdCB0aGlzICIKKyAgICAiaXMgZGVwcmVjYXRlZCwgdGhlICctLWZvcmNlX2RldGVybWluaXN0aWNfcmVuZGVyaW5nJyBmbGFnIHNob3VsZCBiZSAiCisgICAgInVzZWQgaW5zdGVhZCB3aGljaCBkb2VzIHRoZSBzYW1lIHRoaW5nLiI7CiAKIGNvbnN0IGNoYXIga0Rpc2FibGVTaWduSW5bXSA9ICJkaXNhYmxlX3NpZ25faW4iOwogY29uc3QgY2hhciBrRGlzYWJsZVNpZ25JbkhlbHBbXSA9CkBAIC0zMjUsNiArMzM2LDcgQEAKICAgICB7a0F1ZGlvRGVjb2RlclN0dWIsIGtBdWRpb0RlY29kZXJTdHViSGVscH0sCiAgICAgICAgIHtrRGVidWdDb25zb2xlTW9kZSwga0RlYnVnQ29uc29sZU1vZGVIZWxwfSwKICAgICAgICAge2tEaXNhYmxlSW1hZ2VBbmltYXRpb25zLCBrRGlzYWJsZUltYWdlQW5pbWF0aW9uc0hlbHB9LAorICAgICAgICB7a0ZvcmNlRGV0ZXJtaW5pc3RpY1JlbmRlcmluZywga0ZvcmNlRGV0ZXJtaW5pc3RpY1JlbmRlcmluZ0hlbHB9LAogICAgICAgICB7a0Rpc2FibGVSYXN0ZXJpemVyQ2FjaGluZywga0Rpc2FibGVSYXN0ZXJpemVyQ2FjaGluZ0hlbHB9LAogICAgICAgICB7a0Rpc2FibGVTaWduSW4sIGtEaXNhYmxlU2lnbkluSGVscH0sCiAgICAgICAgIHtrRGlzYWJsZVNwbGFzaFNjcmVlbk9uUmVsb2Fkcywga0Rpc2FibGVTcGxhc2hTY3JlZW5PblJlbG9hZHNIZWxwfSwKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnJvd3Nlci9zd2l0Y2hlcy5oIGIvc3JjL2NvYmFsdC9icm93c2VyL3N3aXRjaGVzLmgKaW5kZXggNTZhN2EwMC4uYTIwM2ZlYiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9icm93c2VyL3N3aXRjaGVzLmgKKysrIGIvc3JjL2NvYmFsdC9icm93c2VyL3N3aXRjaGVzLmgKQEAgLTI4LDYgKzI4LDcgQEAKIGV4dGVybiBjb25zdCBjaGFyIGtEZWJ1Z0NvbnNvbGVNb2RlSGVscFtdOwogZXh0ZXJuIGNvbnN0IGNoYXIga0Rpc2FibGVJbWFnZUFuaW1hdGlvbnNbXTsKIGV4dGVybiBjb25zdCBjaGFyIGtEaXNhYmxlSW1hZ2VBbmltYXRpb25zSGVscFtdOworZXh0ZXJuIGNvbnN0IGNoYXIga0ZvcmNlRGV0ZXJtaW5pc3RpY1JlbmRlcmluZ1tdOwogZXh0ZXJuIGNvbnN0IGNoYXIga0Rpc2FibGVSYXN0ZXJpemVyQ2FjaGluZ1tdOwogZXh0ZXJuIGNvbnN0IGNoYXIga0Rpc2FibGVTaWduSW5bXTsKIGV4dGVybiBjb25zdCBjaGFyIGtEaXNhYmxlU2lnbkluSGVscFtdOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9icm93c2VyL3VzZXJfYWdlbnRfc3RyaW5nLmNjIGIvc3JjL2NvYmFsdC9icm93c2VyL3VzZXJfYWdlbnRfc3RyaW5nLmNjCmluZGV4IGVhZjA5MWQuLjIzNzIwYzMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnJvd3Nlci91c2VyX2FnZW50X3N0cmluZy5jYworKysgYi9zcmMvY29iYWx0L2Jyb3dzZXIvdXNlcl9hZ2VudF9zdHJpbmcuY2MKQEAgLTIxLDYgKzIxLDcgQEAKICNpZiBkZWZpbmVkKENPQkFMVF9FTkFCTEVfTElCKQogI2luY2x1ZGUgImNvYmFsdC9icm93c2VyL2xpYi9leHBvcnRlZC91c2VyX2FnZW50LmgiCiAjZW5kaWYKKyNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvZ2V0X2RlZmF1bHRfcmFzdGVyaXplcl9mb3JfcGxhdGZvcm0uaCIKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2phdmFzY3JpcHRfZW5naW5lLmgiCiAjaW5jbHVkZSAiY29iYWx0L3ZlcnNpb24uaCIKICNpbmNsdWRlICJjb2JhbHRfYnVpbGRfaWQuaCIgIC8vIE5PTElOVChidWlsZC9pbmNsdWRlKQpAQCAtMTI2LDE2ICsxMjcsNiBAQAogCiBuYW1lc3BhY2UgewogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPT0gU0JfRVhQRVJJTUVOVEFMX0FQSV9WRVJTSU9OCi1jb25zdCBjaGFyIGtTdGFyYm9hcmRTdGFiaWxpdHlTdWZmaXhbXSA9ICItRXhwZXJpbWVudGFsIjsKLSNlbGlmIGRlZmluZWQoU0JfUkVMRUFTRV9DQU5ESURBVEVfQVBJX1ZFUlNJT04pICYmICAgICAgICBcCi0gICAgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUkVMRUFTRV9DQU5ESURBVEVfQVBJX1ZFUlNJT04gJiYgXAotICAgIFNCX0FQSV9WRVJTSU9OIDwgU0JfRVhQRVJJTUVOVEFMX0FQSV9WRVJTSU9OCi1jb25zdCBjaGFyIGtTdGFyYm9hcmRTdGFiaWxpdHlTdWZmaXhbXSA9ICItUmVsZWFzZUNhbmRpZGF0ZSI7Ci0jZWxzZQotY29uc3QgY2hhciBrU3RhcmJvYXJkU3RhYmlsaXR5U3VmZml4W10gPSAiIjsKLSNlbmRpZgotCiBzdHJ1Y3QgU2FuaXRpemVSZXBsYWNlbWVudHMgewogICBjb25zdCBjaGFyKiByZXBsYWNlX2NoYXJzOwogICBjb25zdCBjaGFyKiByZXBsYWNlX3dpdGg7CkBAIC0yMDQsNyArMTk1LDcgQEAKICAgVXNlckFnZW50UGxhdGZvcm1JbmZvIHBsYXRmb3JtX2luZm87CiAKICAgcGxhdGZvcm1faW5mby5zdGFyYm9hcmRfdmVyc2lvbiA9IGJhc2U6OlN0cmluZ1ByaW50ZigKLSAgICAgICJTdGFyYm9hcmQvJWQlcyIsIFNCX0FQSV9WRVJTSU9OLCBrU3RhcmJvYXJkU3RhYmlsaXR5U3VmZml4KTsKKyAgICAgICJTdGFyYm9hcmQvJWQiLCBTQl9BUElfVkVSU0lPTik7CiAKICAgY29uc3Qgc2l6ZV90IGtTeXN0ZW1Qcm9wZXJ0eU1heExlbmd0aCA9IDEwMjQ7CiAgIGNoYXIgdmFsdWVba1N5c3RlbVByb3BlcnR5TWF4TGVuZ3RoXTsKQEAgLTIyOCw2ICsyMTksOSBAQAogICBwbGF0Zm9ybV9pbmZvLmphdmFzY3JpcHRfZW5naW5lX3ZlcnNpb24gPQogICAgICAgc2NyaXB0OjpHZXRKYXZhU2NyaXB0RW5naW5lTmFtZUFuZFZlcnNpb24oKTsKIAorICBwbGF0Zm9ybV9pbmZvLnJhc3Rlcml6ZXJfdHlwZSA9CisgICAgICByZW5kZXJlcjo6R2V0RGVmYXVsdFJhc3Rlcml6ZXJGb3JQbGF0Zm9ybSgpLnJhc3Rlcml6ZXJfbmFtZTsKKwogICBwbGF0Zm9ybV9pbmZvLmNvYmFsdF92ZXJzaW9uID0gQ09CQUxUX1ZFUlNJT047CiAgIHBsYXRmb3JtX2luZm8uY29iYWx0X2J1aWxkX3ZlcnNpb25fbnVtYmVyID0gQ09CQUxUX0JVSUxEX1ZFUlNJT05fTlVNQkVSOwogCkBAIC0zMzgsMTkgKzMzMiwyNSBAQAogICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtX2luZm8uY29iYWx0X2J1aWxkX3ZlcnNpb25fbnVtYmVyLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm1faW5mby5idWlsZF9jb25maWd1cmF0aW9uLmNfc3RyKCkpOwogCi0gIC8vICAgSmF2YVNjcmlwdCBFbmdpbmUgTmFtZS9WZXJzaW9uCisgIC8vIEphdmFTY3JpcHQgRW5naW5lIE5hbWUvVmVyc2lvbgogICBpZiAoIXBsYXRmb3JtX2luZm8uamF2YXNjcmlwdF9lbmdpbmVfdmVyc2lvbi5lbXB0eSgpKSB7CiAgICAgYmFzZTo6U3RyaW5nQXBwZW5kRigmdXNlcl9hZ2VudCwgIiAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybV9pbmZvLmphdmFzY3JpcHRfZW5naW5lX3ZlcnNpb24uY19zdHIoKSk7CiAgIH0KIAotICAvLyAgIFN0YXJib2FyZC9BUElWZXJzaW9uLAorICAvLyBSYXN0ZXJpemVyIFR5cGUKKyAgaWYgKCFwbGF0Zm9ybV9pbmZvLnJhc3Rlcml6ZXJfdHlwZS5lbXB0eSgpKSB7CisgICAgYmFzZTo6U3RyaW5nQXBwZW5kRigmdXNlcl9hZ2VudCwgIiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybV9pbmZvLnJhc3Rlcml6ZXJfdHlwZS5jX3N0cigpKTsKKyAgfQorCisgIC8vIFN0YXJib2FyZC9BUElWZXJzaW9uLAogICBpZiAoIXBsYXRmb3JtX2luZm8uc3RhcmJvYXJkX3ZlcnNpb24uZW1wdHkoKSkgewogICAgIGJhc2U6OlN0cmluZ0FwcGVuZEYoJnVzZXJfYWdlbnQsICIgJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm1faW5mby5zdGFyYm9hcmRfdmVyc2lvbi5jX3N0cigpKTsKICAgfQogCi0gIC8vICAgRGV2aWNlL0Zpcm13YXJlVmVyc2lvbiAoQnJhbmQsIE1vZGVsLCBDb25uZWN0aW9uVHlwZSkKKyAgLy8gRGV2aWNlL0Zpcm13YXJlVmVyc2lvbiAoQnJhbmQsIE1vZGVsLCBDb25uZWN0aW9uVHlwZSkKICAgYmFzZTo6U3RyaW5nQXBwZW5kRigKICAgICAgICZ1c2VyX2FnZW50LCAiLCAlc18lc18lc18lcy8lcyAoJXMsICVzLCAlcykiLAogICAgICAgU2FuaXRpemUocGxhdGZvcm1faW5mby5uZXR3b3JrX29wZXJhdG9yLnZhbHVlX29yKCIiKSkuY19zdHIoKSwKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnJvd3Nlci91c2VyX2FnZW50X3N0cmluZy5oIGIvc3JjL2NvYmFsdC9icm93c2VyL3VzZXJfYWdlbnRfc3RyaW5nLmgKaW5kZXggOTAwYzhhOS4uMjdhNzIwYiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9icm93c2VyL3VzZXJfYWdlbnRfc3RyaW5nLmgKKysrIGIvc3JjL2NvYmFsdC9icm93c2VyL3VzZXJfYWdlbnRfc3RyaW5nLmgKQEAgLTM3LDYgKzM3LDcgQEAKICAgc3RkOjpzdHJpbmcgYXV4X2ZpZWxkOwogICBiYXNlOjpvcHRpb25hbDxTYlN5c3RlbUNvbm5lY3Rpb25UeXBlPiBjb25uZWN0aW9uX3R5cGU7CiAgIHN0ZDo6c3RyaW5nIGphdmFzY3JpcHRfZW5naW5lX3ZlcnNpb247CisgIHN0ZDo6c3RyaW5nIHJhc3Rlcml6ZXJfdHlwZTsKIAogICBzdGQ6OnN0cmluZyBjb2JhbHRfdmVyc2lvbjsKICAgc3RkOjpzdHJpbmcgY29iYWx0X2J1aWxkX3ZlcnNpb25fbnVtYmVyOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9icm93c2VyL3dlYl9tb2R1bGUuY2MgYi9zcmMvY29iYWx0L2Jyb3dzZXIvd2ViX21vZHVsZS5jYwppbmRleCBkMDA0MDY4Li5jZDUyZGM4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jyb3dzZXIvd2ViX21vZHVsZS5jYworKysgYi9zcmMvY29iYWx0L2Jyb3dzZXIvd2ViX21vZHVsZS5jYwpAQCAtNDMsNiArNDMsNyBAQAogI2luY2x1ZGUgImNvYmFsdC9kb20vZWxlbWVudC5oIgogI2luY2x1ZGUgImNvYmFsdC9kb20vZXZlbnQuaCIKICNpbmNsdWRlICJjb2JhbHQvZG9tL2dsb2JhbF9zdGF0cy5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vaHRtbF9zY3JpcHRfZWxlbWVudC5oIgogI2luY2x1ZGUgImNvYmFsdC9kb20vaW5wdXRfZXZlbnQuaCIKICNpbmNsdWRlICJjb2JhbHQvZG9tL2lucHV0X2V2ZW50X2luaXQuaCIKICNpbmNsdWRlICJjb2JhbHQvZG9tL2tleWJvYXJkX2V2ZW50LmgiCkBAIC0yNDcsNiArMjQ4LDggQEAKICAgdm9pZCBMb2dTY3JpcHRFcnJvcihjb25zdCBiYXNlOjpTb3VyY2VMb2NhdGlvbiYgc291cmNlX2xvY2F0aW9uLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBlcnJvcl9tZXNzYWdlKTsKIAorICB2b2lkIENhbmNlbFN5bmNocm9ub3VzTG9hZHMoKTsKKwogIHByaXZhdGU6CiAgIGNsYXNzIERvY3VtZW50TG9hZGVkT2JzZXJ2ZXI7CiAKQEAgLTQ0MSw2ICs0NDQsMTMgQEAKIAogICBzY29wZWRfcmVmcHRyPGNvYmFsdDo6ZG9tOjpjYXB0aW9uczo6U3lzdGVtQ2FwdGlvblNldHRpbmdzPgogICAgICAgc3lzdGVtX2NhcHRpb25fc2V0dGluZ3NfOworCisgIC8vIFRoaXMgZXZlbnQgaXMgdXNlZCB0byBpbnRlcnJ1cHQgdGhlIGxvYWRlciB3aGVuIEphdmFTY3JpcHQgaXMgbG9hZGVkCisgIC8vIHN5bmNocm9ub3VzbHkuICBJdCBpcyBtYW51YWxseSByZXNldCBzbyB0aGF0IGV2ZW50cyBsaWtlIFN1c3BlbmQgY2FuIGJlCisgIC8vIGNvcnJlY3RseSBleGVjdXRlLCBldmVuIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBzeW5jaHJvbm91cyBsb2FkcyBpbiBxdWV1ZQorICAvLyBiZWZvcmUgdGhlIHN1c3BlbmQgKG9yIG90aGVyKSBldmVudCBoYW5kbGVycy4KKyAgYmFzZTo6V2FpdGFibGVFdmVudCBzeW5jaHJvbm91c19sb2FkZXJfaW50ZXJydXB0XyA9IHsKKyAgICAgIHRydWUgLyogbWFudWFsbHkgcmVzZXQgKi8sIGZhbHNlIC8qIGluaXRpYWxseSBzaWduYWxlZCAqL307CiB9OwogCiBjbGFzcyBXZWJNb2R1bGU6OkltcGw6OkRvY3VtZW50TG9hZGVkT2JzZXJ2ZXIgOiBwdWJsaWMgZG9tOjpEb2N1bWVudE9ic2VydmVyIHsKQEAgLTU3OCw4ICs1ODgsNiBAQAogICBnbG9iYWxfZW52aXJvbm1lbnRfID0gamF2YXNjcmlwdF9lbmdpbmVfLT5DcmVhdGVHbG9iYWxFbnZpcm9ubWVudCgpOwogICBEQ0hFQ0soZ2xvYmFsX2Vudmlyb25tZW50Xyk7CiAKLSAgbXV0YXRpb25fb2JzZXJ2ZXJfdGFza19tYW5hZ2VyXy5SZWdpc3RlckFzVHJhY2luZ1Jvb3QoZ2xvYmFsX2Vudmlyb25tZW50Xyk7Ci0KICAgZXhlY3V0aW9uX3N0YXRlXyA9CiAgICAgICBzY3JpcHQ6OkV4ZWN1dGlvblN0YXRlOjpDcmVhdGVFeGVjdXRpb25TdGF0ZShnbG9iYWxfZW52aXJvbm1lbnRfKTsKICAgRENIRUNLKGV4ZWN1dGlvbl9zdGF0ZV8pOwpAQCAtNTk4LDExICs2MDYsMTYgQEAKICAgZG9tOjpXaW5kb3c6OkNhY2hlQ2FsbGJhY2sgc3BsYXNoX3NjcmVlbl9jYWNoZV9jYWxsYmFjayA9CiAgICAgICBDYWNoZVVybENvbnRlbnRDYWxsYmFjayhkYXRhLm9wdGlvbnMuc3BsYXNoX3NjcmVlbl9jYWNoZSk7CiAKKyAgLy8gVGhlc2UgbWVtYmVycyB3aWxsIHJlZmVyZW5jZSBvdGhlciB8VHJhY2VhYmxlfHMsIGhvd2V2ZXIgYXJlIG5vdAorICAvLyBhY2Nlc3NpYmxlIGZyb20gfFdpbmRvd3wsIHNvIHdlIG11c3QgZXhwbGljaXRseSBhZGQgdGhlbSBhcyByb290cy4KKyAgZ2xvYmFsX2Vudmlyb25tZW50Xy0+QWRkUm9vdCgmbXV0YXRpb25fb2JzZXJ2ZXJfdGFza19tYW5hZ2VyXyk7CisgIGdsb2JhbF9lbnZpcm9ubWVudF8tPkFkZFJvb3QobWVkaWFfc291cmNlX3JlZ2lzdHJ5Xy5nZXQoKSk7CisKICAgd2luZG93XyA9IG5ldyBkb206OldpbmRvdygKICAgICAgIGRhdGEud2luZG93X2RpbWVuc2lvbnMud2lkdGgoKSwgZGF0YS53aW5kb3dfZGltZW5zaW9ucy5oZWlnaHQoKSwKICAgICAgIGRhdGEudmlkZW9fcGl4ZWxfcmF0aW8sIGRhdGEuaW5pdGlhbF9hcHBsaWNhdGlvbl9zdGF0ZSwgY3NzX3BhcnNlcl8uZ2V0KCksCi0gICAgICBkb21fcGFyc2VyXy5nZXQoKSwgZmV0Y2hlcl9mYWN0b3J5Xy5nZXQoKSwgJnJlc291cmNlX3Byb3ZpZGVyXywKLSAgICAgIGFuaW1hdGVkX2ltYWdlX3RyYWNrZXJfLmdldCgpLCBpbWFnZV9jYWNoZV8uZ2V0KCksCisgICAgICBkb21fcGFyc2VyXy5nZXQoKSwgZmV0Y2hlcl9mYWN0b3J5Xy5nZXQoKSwgbG9hZGVyX2ZhY3RvcnlfLmdldCgpLAorICAgICAgJnJlc291cmNlX3Byb3ZpZGVyXywgYW5pbWF0ZWRfaW1hZ2VfdHJhY2tlcl8uZ2V0KCksIGltYWdlX2NhY2hlXy5nZXQoKSwKICAgICAgIHJlZHVjZWRfaW1hZ2VfY2FjaGVfY2FwYWNpdHlfbWFuYWdlcl8uZ2V0KCksIHJlbW90ZV90eXBlZmFjZV9jYWNoZV8uZ2V0KCksCiAgICAgICBtZXNoX2NhY2hlXy5nZXQoKSwgbG9jYWxfc3RvcmFnZV9kYXRhYmFzZV8uZ2V0KCksCiAgICAgICBkYXRhLmNhbl9wbGF5X3R5cGVfaGFuZGxlciwgZGF0YS53ZWJfbWVkaWFfcGxheWVyX2ZhY3RvcnksCkBAIC02MjcsNyArNjQwLDcgQEAKICAgICAgIGJhc2U6OkJpbmQoJldlYk1vZHVsZTo6SW1wbDo6T25TdGFydERpc3BhdGNoRXZlbnQsCiAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpLAogICAgICAgYmFzZTo6QmluZCgmV2ViTW9kdWxlOjpJbXBsOjpPblN0b3BEaXNwYXRjaEV2ZW50LCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSwKLSAgICAgIGRhdGEub3B0aW9ucy5wcm92aWRlX3NjcmVlbnNob3RfZnVuY3Rpb24sCisgICAgICBkYXRhLm9wdGlvbnMucHJvdmlkZV9zY3JlZW5zaG90X2Z1bmN0aW9uLCAmc3luY2hyb25vdXNfbG9hZGVyX2ludGVycnVwdF8sCiAgICAgICBkYXRhLm9wdGlvbnMuY3NwX2luc2VjdXJlX2FsbG93ZWRfdG9rZW4sIGRhdGEuZG9tX21heF9lbGVtZW50X2RlcHRoLAogICAgICAgZGF0YS5vcHRpb25zLnZpZGVvX3BsYXliYWNrX3JhdGVfbXVsdGlwbGllciwKICNpZiBkZWZpbmVkKEVOQUJMRV9URVNUX1JVTk5FUikKQEAgLTc1MCw2ICs3NjMsOCBAQAogCiB2b2lkIFdlYk1vZHVsZTo6SW1wbDo6SW5qZWN0SW5wdXRFdmVudChzY29wZWRfcmVmcHRyPGRvbTo6RWxlbWVudD4gZWxlbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8ZG9tOjpFdmVudD4mIGV2ZW50KSB7CisgIFRSQUNFX0VWRU5UMSgiY29iYWx0Ojpicm93c2VyIiwgIldlYk1vZHVsZTo6SW1wbDo6SW5qZWN0SW5wdXRFdmVudCgpIiwKKyAgICAgICAgICAgICAgICJldmVudCIsIGV2ZW50LT50eXBlKCkuY19zdHIoKSk7CiAgIERDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKICAgRENIRUNLKGlzX3J1bm5pbmdfKTsKICAgRENIRUNLKHdpbmRvd18pOwpAQCAtNzU3LDcgKzc3MiwxNyBAQAogICBpZiAoZWxlbWVudCkgewogICAgIGVsZW1lbnQtPkRpc3BhdGNoRXZlbnQoZXZlbnQpOwogICB9IGVsc2UgewotICAgIHdpbmRvd18tPkluamVjdEV2ZW50KGV2ZW50KTsKKyAgICBpZiAoZG9tOjpQb2ludGVyU3RhdGU6OkNhblF1ZXVlRXZlbnQoZXZlbnQpKSB7CisgICAgICAvLyBBcyBhbiBvcHRpbWl6YXRpb24gd2UgYmF0Y2ggdG9nZXRoZXIgcG9pbnRlci9tb3VzZSBldmVudHMgZm9yIGFzIGxvbmcKKyAgICAgIC8vIGFzIHdlIGNhbiBnZXQgYXdheSB3aXRoIGl0IChlLmcuIHVudGlsIGEgbm9uLXBvaW50ZXIgZXZlbnQgaXMgcmVjZWl2ZWQKKyAgICAgIC8vIG9yIHdoZW5ldmVyIHRoZSBuZXh0IGxheW91dCBvY2N1cnMpLgorICAgICAgd2luZG93Xy0+ZG9jdW1lbnQoKS0+cG9pbnRlcl9zdGF0ZSgpLT5RdWV1ZVBvaW50ZXJFdmVudChldmVudCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIEluIG9yZGVyIHRvIG1haW50YWluIHRoZSBjb3JyZWN0IGlucHV0IGV2ZW50IG9yZGVyaW5nLCB3ZSBmaXJzdAorICAgICAgLy8gZGlzcGF0Y2ggYW55IHF1ZXVlZCBwZW5kaW5nIHBvaW50ZXIgZXZlbnRzLgorICAgICAgSGFuZGxlUG9pbnRlckV2ZW50cygpOworICAgICAgd2luZG93Xy0+SW5qZWN0RXZlbnQoZXZlbnQpOworICAgIH0KICAgfQogfQogCkBAIC05MTIsNiArOTM3LDEwIEBACiAgIH0KIH0KIAordm9pZCBXZWJNb2R1bGU6OkltcGw6OkNhbmNlbFN5bmNocm9ub3VzTG9hZHMoKSB7CisgIHN5bmNocm9ub3VzX2xvYWRlcl9pbnRlcnJ1cHRfLlNpZ25hbCgpOworfQorCiAjaWYgZGVmaW5lZChFTkFCTEVfUEFSVElBTF9MQVlPVVRfQ09OVFJPTCkKIHZvaWQgV2ViTW9kdWxlOjpJbXBsOjpPblBhcnRpYWxMYXlvdXRDb25zb2xlQ29tbWFuZFJlY2VpdmVkKAogICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSB7CkBAIC0xMDc0LDYgKzExMDMsNyBAQAogCiB2b2lkIFdlYk1vZHVsZTo6SW1wbDo6VW5wYXVzZSgpIHsKICAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OmJyb3dzZXIiLCAiV2ViTW9kdWxlOjpJbXBsOjpVbnBhdXNlKCkiKTsKKyAgc3luY2hyb25vdXNfbG9hZGVyX2ludGVycnVwdF8uUmVzZXQoKTsKICAgU2V0QXBwbGljYXRpb25TdGF0ZShiYXNlOjprQXBwbGljYXRpb25TdGF0ZVN0YXJ0ZWQpOwogfQogCkBAIC0xMTMyLDYgKzExNjIsNyBAQAogCiB2b2lkIFdlYk1vZHVsZTo6SW1wbDo6UmVzdW1lKHJlbmRlcl90cmVlOjpSZXNvdXJjZVByb3ZpZGVyKiByZXNvdXJjZV9wcm92aWRlcikgewogICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6YnJvd3NlciIsICJXZWJNb2R1bGU6OkltcGw6OlJlc3VtZSgpIik7CisgIHN5bmNocm9ub3VzX2xvYWRlcl9pbnRlcnJ1cHRfLlJlc2V0KCk7CiAgIFNldFJlc291cmNlUHJvdmlkZXIocmVzb3VyY2VfcHJvdmlkZXIpOwogICBTZXRBcHBsaWNhdGlvblN0YXRlKGJhc2U6OmtBcHBsaWNhdGlvblN0YXRlUGF1c2VkKTsKIH0KQEAgLTExNDIsNiArMTE3Myw3IEBACiAgIGlmICghaXNfcnVubmluZ18pIHsKICAgICByZXR1cm47CiAgIH0KKyAgc3luY2hyb25vdXNfbG9hZGVyX2ludGVycnVwdF8uUmVzZXQoKTsKIAogICBsYXlvdXRfbWFuYWdlcl8tPlB1cmdlKCk7CiAKQEAgLTE1OTksNiArMTYzMSw4IEBACiAgIC8vIE11c3Qgb25seSBiZSBjYWxsZWQgYnkgYSB0aHJlYWQgZXh0ZXJuYWwgZnJvbSB0aGUgV2ViTW9kdWxlIHRocmVhZC4KICAgRENIRUNLX05FKE1lc3NhZ2VMb29wOjpjdXJyZW50KCksIG1lc3NhZ2VfbG9vcCgpKTsKIAorICBpbXBsXy0+Q2FuY2VsU3luY2hyb25vdXNMb2FkcygpOworCiAgIC8vIFdlIG11c3QgYmxvY2sgaGVyZSBzbyB0aGF0IHRoZSBjYWxsIGRvZXNuJ3QgcmV0dXJuIHVudGlsIHRoZSB3ZWIKICAgLy8gYXBwbGljYXRpb24gaGFzIGhhZCBhIGNoYW5jZSB0byBwcm9jZXNzIHRoZSB3aG9sZSBldmVudC4KICAgbWVzc2FnZV9sb29wKCktPlBvc3RCbG9ja2luZ1Rhc2soCkBAIC0xNjE5LDYgKzE2NTMsOCBAQAogICAvLyBNdXN0IG9ubHkgYmUgY2FsbGVkIGJ5IGEgdGhyZWFkIGV4dGVybmFsIGZyb20gdGhlIFdlYk1vZHVsZSB0aHJlYWQuCiAgIERDSEVDS19ORShNZXNzYWdlTG9vcDo6Y3VycmVudCgpLCBtZXNzYWdlX2xvb3AoKSk7CiAKKyAgaW1wbF8tPkNhbmNlbFN5bmNocm9ub3VzTG9hZHMoKTsKKwogICAvLyBXZSBtdXN0IGJsb2NrIGhlcmUgc28gdGhhdCB3ZSBkb24ndCBxdWV1ZSB0aGUgZmluaXNoIHVudGlsIGFmdGVyCiAgIC8vIFN1c3BlbmRMb2FkZXJzIGhhcyBydW4gdG8gY29tcGxldGlvbiwgYW5kIHRoZXJlZm9yZSBoYXMgYWxyZWFkeSBxdWV1ZWQgYW55CiAgIC8vIHByZWNpcGl0YXRlIHRhc2tzLgpAQCAtMTY0Nyw2ICsxNjgzLDggQEAKICAgLy8gTXVzdCBvbmx5IGJlIGNhbGxlZCBieSBhIHRocmVhZCBleHRlcm5hbCBmcm9tIHRoZSBXZWJNb2R1bGUgdGhyZWFkLgogICBEQ0hFQ0tfTkUoTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSwgbWVzc2FnZV9sb29wKCkpOwogCisgIGltcGxfLT5DYW5jZWxTeW5jaHJvbm91c0xvYWRzKCk7CisKICAgLy8gV2UgYmxvY2sgaGVyZSBzbyB0aGF0IHdlIGJsb2NrIHRoZSBMb3cgTWVtb3J5IGV2ZW50IGhhbmRsZXIgdW50aWwgd2UgaGF2ZQogICAvLyByZWR1Y2VkIG91ciBtZW1vcnkgY29uc3VtcHRpb24uCiAgIG1lc3NhZ2VfbG9vcCgpLT5Qb3N0QmxvY2tpbmdUYXNrKEZST01fSEVSRSwKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnJvd3Nlci93ZWJfbW9kdWxlLmggYi9zcmMvY29iYWx0L2Jyb3dzZXIvd2ViX21vZHVsZS5oCmluZGV4IDgyMjMwZjguLmE1ZmQzMGMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnJvd3Nlci93ZWJfbW9kdWxlLmgKKysrIGIvc3JjL2NvYmFsdC9icm93c2VyL3dlYl9tb2R1bGUuaApAQCAtNDA4LDYgKzQwOCw4IEBACiAKICAgdm9pZCBDbGVhckFsbEludGVydmFsc0FuZFRpbWVvdXRzKCk7CiAKKyAgdm9pZCBDYW5jZWxTeW5jaHJvbm91c0xvYWRzKCk7CisKICNpZiBkZWZpbmVkKEVOQUJMRV9QQVJUSUFMX0xBWU9VVF9DT05UUk9MKQogICB2b2lkIE9uUGFydGlhbExheW91dENvbnNvbGVDb21tYW5kUmVjZWl2ZWQoY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpOwogI2VuZGlmICAvLyBkZWZpbmVkKEVOQUJMRV9QQVJUSUFMX0xBWU9VVF9DT05UUk9MKQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9idWlsZC9hbGwuZ3lwIGIvc3JjL2NvYmFsdC9idWlsZC9hbGwuZ3lwCmluZGV4IDNhMjJkOTMuLmNmNzkwMDggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnVpbGQvYWxsLmd5cAorKysgYi9zcmMvY29iYWx0L2J1aWxkL2FsbC5neXAKQEAgLTMzLDYgKzMzLDcgQEAKICAgICAgICAgJzwoREVQVEgpL2Jhc2UvYmFzZS5neXA6YmFzZV91bml0dGVzdHMnLAogICAgICAgICAnPChERVBUSCkvY29iYWx0L2FjY2Vzc2liaWxpdHkvYWNjZXNzaWJpbGl0eV90ZXN0Lmd5cDoqJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9hdWRpby9hdWRpby5neXA6KicsCisgICAgICAgICc8KERFUFRIKS9jb2JhbHQvYXVkaW8vYXVkaW9fdGVzdC5neXA6KicsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvYmFzZS9iYXNlLmd5cDoqJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3Rlc3RpbmcuZ3lwOionLAogICAgICAgICAnPChERVBUSCkvY29iYWx0L2Jyb3dzZXIvYnJvd3Nlci5neXA6KicsCkBAIC00NCw3ICs0NSw5IEBACiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvZGVidWcvZGVidWcuZ3lwOionLAogICAgICAgICAnPChERVBUSCkvY29iYWx0L2RvbS9kb20uZ3lwOionLAogICAgICAgICAnPChERVBUSCkvY29iYWx0L2RvbS9kb21fdGVzdC5neXA6KicsCisgICAgICAgICc8KERFUFRIKS9jb2JhbHQvZG9tL3Rlc3RpbmcvZG9tX3Rlc3RpbmcuZ3lwOionLAogICAgICAgICAnPChERVBUSCkvY29iYWx0L2RvbV9wYXJzZXIvZG9tX3BhcnNlci5neXA6KicsCisgICAgICAgICc8KERFUFRIKS9jb2JhbHQvZG9tX3BhcnNlci9kb21fcGFyc2VyX3Rlc3QuZ3lwOionLAogICAgICAgICAnPChERVBUSCkvY29iYWx0L2g1dmNjL2g1dmNjLmd5cDoqJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9pbnB1dC9pbnB1dC5neXA6KicsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvbGF5b3V0L2xheW91dC5neXA6KicsCkBAIC01NCw4ICs1NywxMSBAQAogICAgICAgICAnPChERVBUSCkvY29iYWx0L21hdGgvbWF0aC5neXA6KicsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvbWVkaWEvc2FuZGJveC9zYW5kYm94Lmd5cDoqJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9tZWRpYV9jYXB0dXJlL21lZGlhX2NhcHR1cmUuZ3lwOionLAorICAgICAgICAnPChERVBUSCkvY29iYWx0L21lZGlhX2NhcHR1cmUvbWVkaWFfY2FwdHVyZV90ZXN0Lmd5cDoqJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9tZWRpYV9zZXNzaW9uL21lZGlhX3Nlc3Npb24uZ3lwOionLAogICAgICAgICAnPChERVBUSCkvY29iYWx0L21lZGlhX3Nlc3Npb24vbWVkaWFfc2Vzc2lvbl90ZXN0Lmd5cDoqJywKKyAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9tZWRpYV9zdHJlYW0vbWVkaWFfc3RyZWFtLmd5cDoqJywKKyAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9tZWRpYV9zdHJlYW0vbWVkaWFfc3RyZWFtX3Rlc3QuZ3lwOionLAogICAgICAgICAnPChERVBUSCkvY29iYWx0L25ldHdvcmsvbmV0d29yay5neXA6KicsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvb3ZlcmxheV9pbmZvL292ZXJsYXlfaW5mby5neXA6KicsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvcGFnZV92aXNpYmlsaXR5L3BhZ2VfdmlzaWJpbGl0eS5neXA6KicsCkBAIC02MywxMSArNjksMTQgQEAKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9yZW5kZXJlci9yZW5kZXJlci5neXA6KicsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvcmVuZGVyZXIvc2FuZGJveC9zYW5kYm94Lmd5cDoqJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9zYW1wbGVzL3NpbXBsZV9leGFtcGxlL3NpbXBsZV9leGFtcGxlLmd5cDoqJywKKyAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9zY3JpcHQvZW5naW5lLmd5cDplbmdpbmVfc2hlbGwnLAogICAgICAgICAnPChERVBUSCkvY29iYWx0L3NjcmlwdC9zY3JpcHQuZ3lwOionLAotICAgICAgICAnPChERVBUSCkvY29iYWx0L3NjcmlwdC9lbmdpbmUuZ3lwOmFsbF9lbmdpbmVzJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9zcGVlY2gvc2FuZGJveC9zYW5kYm94Lmd5cDoqJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9zcGVlY2gvc3BlZWNoLmd5cDoqJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9zdG9yYWdlL3N0b3JhZ2UuZ3lwOionLAorICAgICAgICAnPChERVBUSCkvY29iYWx0L3N0b3JhZ2Uvc3RvcmUvc3RvcmUuZ3lwOionLAorICAgICAgICAnPChERVBUSCkvY29iYWx0L3N0b3JhZ2Uvc3RvcmVfdXBncmFkZS91cGdyYWRlLmd5cDoqJywKKyAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9zdG9yYWdlL3N0b3JlX3VwZ3JhZGUvdXBncmFkZV90b29sLmd5cDoqJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC90cmFjZV9ldmVudC90cmFjZV9ldmVudC5neXA6KicsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvd2ViX2FuaW1hdGlvbnMuZ3lwOionLAogICAgICAgICAnPChERVBUSCkvY29iYWx0L3dlYmRyaXZlci93ZWJkcml2ZXIuZ3lwOionLApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9idWlsZC9idWlsZC5pZCBiL3NyYy9jb2JhbHQvYnVpbGQvYnVpbGQuaWQKaW5kZXggNWVhNjdkYy4uNTAxYjliOSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9idWlsZC9idWlsZC5pZAorKysgYi9zcmMvY29iYWx0L2J1aWxkL2J1aWxkLmlkCkBAIC0xICsxIEBACi0xNjI2MzkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisxNzkxNDkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2J1aWxkL2NvYmFsdF9jb25maWd1cmF0aW9uLmd5cGkgYi9zcmMvY29iYWx0L2J1aWxkL2NvYmFsdF9jb25maWd1cmF0aW9uLmd5cGkKaW5kZXggZjc1Y2VkZS4uMzkzNGY4MiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9idWlsZC9jb2JhbHRfY29uZmlndXJhdGlvbi5neXBpCisrKyBiL3NyYy9jb2JhbHQvYnVpbGQvY29iYWx0X2NvbmZpZ3VyYXRpb24uZ3lwaQpAQCAtMzY2LDcgKzM2Niw3IEBACiAgICAgJ2NvYmFsdF9nY196ZWFsJSc6IDAsCiAKICAgICAjIFVzZSBtZWRpYSBzb3VyY2UgZXh0ZW5zaW9uIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgY29uZm9ybWVkIHRvIHRoZQotICAgICMgQ2FuZGlkYXRlIFJlY29tbWFuZGF0aW9uIG9mIEp1bHkgNXRoIDIwMTYuCisgICAgIyBDYW5kaWRhdGUgUmVjb21tZW5kYXRpb24gb2YgSnVseSA1dGggMjAxNi4KICAgICAnY29iYWx0X21lZGlhX3NvdXJjZV8yMDE2JSc6ICc8KGNvYmFsdF9tZWRpYV9zb3VyY2VfMjAxNiknLAogCiAgICAgIyBOb3RlIHRoYXQgdGhlIGZvbGxvd2luZyBtZWRpYSBidWZmZXIgcmVsYXRlZCB2YXJpYWJsZXMgYXJlIG9ubHkgdXNlZCB3aGVuCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2J1aWxkL2NvYmFsdF9jb25maWd1cmF0aW9uLnB5IGIvc3JjL2NvYmFsdC9idWlsZC9jb2JhbHRfY29uZmlndXJhdGlvbi5weQppbmRleCBjNjQ1OGI1Li45MGZiOGQ2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2J1aWxkL2NvYmFsdF9jb25maWd1cmF0aW9uLnB5CisrKyBiL3NyYy9jb2JhbHQvYnVpbGQvY29iYWx0X2NvbmZpZ3VyYXRpb24ucHkKQEAgLTEzLDYgKzEzLDcgQEAKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAiIiJCYXNlIGNvYmFsdCBjb25maWd1cmF0aW9uIGZvciBHWVAuIiIiCiAKK2ltcG9ydCBsb2dnaW5nCiBpbXBvcnQgb3MKIAogaW1wb3J0IF9lbnYgICMgcHlsaW50OiBkaXNhYmxlPXVudXNlZC1pbXBvcnQKQEAgLTIxLDcgKzIyLDYgQEAKIGltcG9ydCBjb2JhbHQudG9vbHMud2ViZHJpdmVyX2JlbmNobWFya19jb25maWcgYXMgd2JfY29uZmlnCiBmcm9tIHN0YXJib2FyZC5idWlsZCBpbXBvcnQgYXBwbGljYXRpb25fY29uZmlndXJhdGlvbgogCi0KICMgVGhlIGNhbm9uaWNhbCBDb2JhbHQgYXBwbGljYXRpb24gbmFtZS4KIEFQUExJQ0FUSU9OX05BTUUgPSAnY29iYWx0JwogCkBAIC01Miw2ICs1Miw3IEBACiAgICAgICAgICMgV2hldGhlciB0byBlbmFibGUgVlIuCiAgICAgICAgICdlbmFibGVfdnInOiBpbnQob3MuZW52aXJvbi5nZXQoJ1VTRV9WUicsIDApKSwKICAgICB9CisgICAgbG9nZ2luZy5pbmZvKCdCdWlsZCBOdW1iZXI6IHt9Jy5mb3JtYXQodmFyaWFibGVzWydjb2JhbHRfdmVyc2lvbiddKSkKICAgICByZXR1cm4gdmFyaWFibGVzCiAKICAgZGVmIEdldFBvc3RJbmNsdWRlcyhzZWxmKToKQEAgLTc5LDYgKzgwLDggQEAKICAgICAgICAgJ2xvYWRlcl90ZXN0JywKICAgICAgICAgJ21hdGhfdGVzdCcsCiAgICAgICAgICdtZWRpYV9zZXNzaW9uX3Rlc3QnLAorICAgICAgICAnbWVkaWFfc3RyZWFtX3Rlc3QnLAorICAgICAgICAnbWVtb3J5X3N0b3JlX3Rlc3QnLAogICAgICAgICAnbmJfdGVzdCcsCiAgICAgICAgICduZXRfdW5pdHRlc3RzJywKICAgICAgICAgJ25ldHdvcmtfdGVzdCcsCkBAIC04OCw2ICs5MSw3IEBACiAgICAgICAgICdyZW5kZXJlcl90ZXN0JywKICAgICAgICAgJ3NxbF91bml0dGVzdHMnLAogICAgICAgICAnc3RvcmFnZV90ZXN0JywKKyAgICAgICAgJ3N0b3JhZ2VfdXBncmFkZV90ZXN0JywKICAgICAgICAgJ3RyYWNlX2V2ZW50X3Rlc3QnLAogICAgICAgICAnd2ViX2FuaW1hdGlvbnNfdGVzdCcsCiAgICAgICAgICd3ZWJfcGxhdGZvcm1fdGVzdHMnLApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9idWlsZC9jb25maWcvYmFzZS5nbmkgYi9zcmMvY29iYWx0L2J1aWxkL2NvbmZpZy9iYXNlLmduaQppbmRleCBjZmNkODE2Li5mYTg0MTM0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2J1aWxkL2NvbmZpZy9iYXNlLmduaQorKysgYi9zcmMvY29iYWx0L2J1aWxkL2NvbmZpZy9iYXNlLmduaQpAQCAtNDE4LDcgKzQxOCw3IEBACiB9CiAKICMgVXNlIG1lZGlhIHNvdXJjZSBleHRlbnNpb24gaW1wbGVtZW50YXRpb24gdGhhdCBpcyBjb25mb3JtZWQgdG8gdGhlCi0jIENhbmRpZGF0ZSBSZWNvbW1hbmRhdGlvbiBvZiBKdWx5IDV0aCAyMDE2LgorIyBDYW5kaWRhdGUgUmVjb21tZW5kYXRpb24gb2YgSnVseSA1dGggMjAxNi4KIGlmICghZGVmaW5lZChjb2JhbHRfdXNlX21lZGlhX3NvdXJjZV8yMDE2KSkgewogICBjb2JhbHRfdXNlX21lZGlhX3NvdXJjZV8yMDE2ID0gdHJ1ZQogfQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9idWlsZC9neXBfdXRpbHMucHkgYi9zcmMvY29iYWx0L2J1aWxkL2d5cF91dGlscy5weQppbmRleCBiMDRmMTNjLi5mNjBiYWRiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2J1aWxkL2d5cF91dGlscy5weQorKysgYi9zcmMvY29iYWx0L2J1aWxkL2d5cF91dGlscy5weQpAQCAtNzEsNyArNzEsNiBAQAogICAgIHdpdGggb3BlbihCVUlMRF9JRF9QQVRILCAncicpIGFzIGJ1aWxkX2lkX2ZpbGU6CiAgICAgICBidWlsZF9udW1iZXIgPSBpbnQoYnVpbGRfaWRfZmlsZS5yZWFkKCkucmVwbGFjZSgnXG4nLCAnJykpCiAgICAgICBsb2dnaW5nLmluZm8oJ1JldHJpZXZpbmcgYnVpbGQgbnVtYmVyIGZyb20gJXMnLCBCVUlMRF9JRF9QQVRIKQotICAgICAgbG9nZ2luZy5pbmZvKCdCdWlsZCBOdW1iZXI6ICVkJywgYnVpbGRfbnVtYmVyKQogICAgICAgcmV0dXJuIGJ1aWxkX251bWJlcgogCiAgIHJldmluZm8gPSBHZXRSZXZpbmZvKCkKQEAgLTk5LDcgKzk4LDYgQEAKICAgICBkYXRhID0gZGF0YVtsZW4oX1hTU0lfUFJFRklYKTpdCiAgIHJlc3VsdHMgPSBqc29uLmxvYWRzKGRhdGEpCiAgIGJ1aWxkX251bWJlciA9IHJlc3VsdHMuZ2V0KCdidWlsZF9udW1iZXInLCAwKQotICBsb2dnaW5nLmluZm8oJ0J1aWxkIE51bWJlcjogJWQnLCBidWlsZF9udW1iZXIpCiAgIHJldHVybiBidWlsZF9udW1iZXIKIAogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2NvbnRlbnQvc3NsL2NlcnRzLzc5OTJiOGJiLjAgYi9zcmMvY29iYWx0L2NvbnRlbnQvc3NsL2NlcnRzLzc5OTJiOGJiLjAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3MGJjNGEuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9jb250ZW50L3NzbC9jZXJ0cy83OTkyYjhiYi4wCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi1NSUlFSnpDQ0F3K2dBd0lCQWdJSEFJNFgvaVFnZ1RBTkJna3Foa2lHOXcwQkFRc0ZBRENCc1RFTE1Ba0dBMVVFQmhNQ1ZGSXhEekFOCi1CZ05WQkFjTUJrRnVhMkZ5WVRGTk1Fc0dBMVVFQ2d4RVZNT2NVa3RVVWxWVFZDQkNhV3huYVNERXNHeGxkR25GbjJsdElIWmxJRUpwCi1iR25GbjJsdElFZkR2SFpsYm14cHhKOXBJRWhwZW0xbGRHeGxjbWtnUVM3Rm5pNHhRakJBQmdOVkJBTU1PVlREbkZKTFZGSlZVMVFnCi1SV3hsYTNSeWIyNXBheUJUWlhKMGFXWnBhMkVnU0dsNmJXVjBJRk5oeEo5c1lYbkVzV1BFc1hQRXNTQklOVEFlRncweE16QTBNekF3Ci1PREEzTURGYUZ3MHlNekEwTWpnd09EQTNNREZhTUlHeE1Rc3dDUVlEVlFRR0V3SlVVakVQTUEwR0ExVUVCd3dHUVc1cllYSmhNVTB3Ci1Td1lEVlFRS0RFUlV3NXhTUzFSU1ZWTlVJRUpwYkdkcElNU3diR1YwYWNXZmFXMGdkbVVnUW1sc2FjV2ZhVzBnUjhPOGRtVnViR25FCi1uMmtnU0dsNmJXVjBiR1Z5YVNCQkxzV2VMakZDTUVBR0ExVUVBd3c1Vk1PY1VrdFVVbFZUVkNCRmJHVnJkSEp2Ym1scklGTmxjblJwCi1abWxyWVNCSWFYcHRaWFFnVTJIRW4yeGhlY1N4WThTeGM4U3hJRWcxTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCCi1DZ0tDQVFFQXBDVVo0V1dlNjBnaFVFb0k1Ukh3V3JvbS80Tlp6a1FxTC83aHptQUQvSTBEcGUzL2E2aTZ6RFFHbjFrMTl1d3N1NTM3Ci1qVkpwNDV3bkVGUHpwQUxGcC9rUkdtbDFic01kaTlHWWpaT0hwM0dYRFNISG1mbFMweXhqWFZXODZCOEJTTGxnL2tKSzlzaUFyczFtCi1lcDVGaW1oMzRraG9uNkxhOGVIQkVKL3JQQ21CcCtFeUNOU2dCYkdNKzQyV0FBNCtKZDlUaGlJNy9QUzk4d2wrZCt5RzZ3OHo1VU5QCi05RlIxYlNtWkxtWmFROS9MWE1ySTVUanhmanMxblEvMHhWcWh6UE1nZ0NUVFYrd1Z1blVsbStoa1M3TTBoTzhFdVBiSmJLb0NQclpWCi00akkzWC94bWwxL04xcDdISUw5Tnhxdy9kVjhjN1RLY2ZHa0FhWkhqSXhoVDZRSURBUUFCbzBJd1FEQWRCZ05WSFE0RUZnUVVWcGtICi1IdE9zREdsa3RBeFFSOTVETEw0Z3dQc3dEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RRWUpLb1pJCi1odmNOQVFFTEJRQURnZ0VCQUo1RmRuc1hTREx5T0lzcHZlNldTazZCR0xGUlJ5RE4wR1N4RHNuWkFka0p6c2laM0dnbEU5UmM4cVBvCi1CUDV5Q2NjTHFoMGxWWDZXbWxlM3VzVVJlaG5tcDM0OWhRNzErUzRwTCtmNWJGZ1dWMUFsOWo0dVBxcnRkM0dxcXBtV1JncXVqdXdxCi1VUmF3WHMzcVp3UWNXREQxWUlxOXByMU41WmEwL0VLSkFXdjJjTWhRT1F3dDFXYlp5Tkt6TXJjYkdXM0xNL25mcGVZVmhEZnd3dkpsCi1scEtRZC9DdDlKRHBFWGpYazRuQVBRdTZLZlRvbVoxeWp1MmRMKzZTZmFIeC8xMjZNMkNGWXY0SEFxR0VWa2ErbGdxYUU5Y2hUTGQ4Ci1CNTlPVGorUmRQc25uUkhNM2VheHluRk5FeGM1SnNVcElTdVRLV3FXK3F0QjRVdTJOUXZBbXhVPQotLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jb250ZW50L3NzbC9jZXJ0cy85MDA3YWU2OC4wIGIvc3JjL2NvYmFsdC9jb250ZW50L3NzbC9jZXJ0cy85MDA3YWU2OC4wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGMyODA1Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvY29udGVudC9zc2wvY2VydHMvOTAwN2FlNjguMAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQotTUlJRmFUQ0NBMUdnQXdJQkFnSUpBTU1EbXU1UWtHNG9NQTBHQ1NxR1NJYjNEUUVCQlFVQU1GSXhDekFKQmdOVkJBWVRBbE5MTVJNdwotRVFZRFZRUUhFd3BDY21GMGFYTnNZWFpoTVJNd0VRWURWUVFLRXdwRWFYTnBaeUJoTG5NdU1Sa3dGd1lEVlFRREV4QkRRU0JFYVhOcAotWnlCU2IyOTBJRkl4TUI0WERURXlNRGN4T1RBNU1EWTFObG9YRFRReU1EY3hPVEE1TURZMU5sb3dVakVMTUFrR0ExVUVCaE1DVTBzeAotRXpBUkJnTlZCQWNUQ2tKeVlYUnBjMnhoZG1FeEV6QVJCZ05WQkFvVENrUnBjMmxuSUdFdWN5NHhHVEFYQmdOVkJBTVRFRU5CSUVScAotYzJsbklGSnZiM1FnVWpFd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUNxdzNqMzNKaWpwMXBlZHhpeQotM1FSa0QyUDltNVlKZ05Yb3FxWGluQ2FVT3VpWmM0eWQzOWZmZy9ONFQwRGhmOUtuMHVYS0U1UG43Y1ozWHphMWxLL29PSTdibStWOAotdTh5TjYzVno0U1RONXFjdEdTN1kxb3ByRk9zSVlnclkzTE1BVGNNamZGOURDQ015RXR6dERLM0FmUStsZWtMWlduRFp2NmZYQVJ6MgotbTZ1T3QwcUdlS0FlVmpHdTc0SUtnRUgzRzhtdXF6SW0xQ3hyN1gxcjVPSmVJZ3BGeTRReFRheisyOUZIdXZsZ2x6bXhaY2ZlKzVuawotQ2lLeExVM2xTQ1pwcStLcTgvdjhraWt5NmJNK1RSOG5vYzJPdVJmN0pUN0pidk4zMmcwUzlsM0h1ellRMVZUVzgrRGlSMGptM2hUYQotWVZLdkpyVDFjVS9KMTlJRzMyUEsveUhvV1FiZ0NOV0VGVlAzUStWOHhhQ0ptR3R6eG1qT1pkNjlmd1gzc2U3MlY2RmdsY1hNNnBNNgotdnBtdW13S2pyY2tXdGM3ZFhwbDRmaG81ZnJMQUJhVEFncVdqUjU2TTZseTJ2R2ZiNWlwTjBnVGNvNjVGOTd5TG5CeW4xdFVEM0FqTAotTGhiS1hFQXo2R2ZETHVlbVJPb1JSUncxWlMwZVJXRWtHNEl1cFowelhXWDRRZmt1eTVRL0g2TU1NU1JFN2NkZXJWQzZ4a0diclBBWAotWmNENFhXOWJvQW8wUE83WDZvaWZtUG12VGlUNmw3SmtkdHFyOU8zancyRHYxZmtDeUMyZmc2OW5hUWFuTVZYVnowdHYvd1FGeDFpcwotWHhZYjVkS2o2ekhiSHpNVlRkRHlwVlAxeStFOVRtZ3QyQkxkcXZMbVRadEo1Y1Vvb2Jxd1dzYWd0UUlEQVFBQm8wSXdRREFQQmdOVgotSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCQmpBZEJnTlZIUTRFRmdRVWlRcTBPSk1hNXF2dW01RVkrZlU4UGpYUQotMDRJd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dJQkFES0w5cDFLeWI0VTVZeXNPTW82Q2RRYnpvYXozZXZVdWlpK0VxNUZMQVIwckJOUgoteFZnWVprMkMydFhjazhBbjRiNThuMUtlRWxiMjFaeXA5SFdjK2pjU2p4eVQ3RmYrQncrcjFSTDNENjVoWGxhQVNmWDhNUFdiVHg5QgotTHh5RTA0bkg0dG9DZHUwSnoyekJ1QnlESEJiNmxNMTlvTWdZMHNpZGJ2VzlhZFJ0UFRYb0hxSlBZTmNIS2Z5eW82U2RiaFdTVmhsTQotQ3JEcGZOSVpUVUpHN0wzOTlsZGIzWmgrcEUzTWNnT0RXRjN2a3pwQmVtT3FmRHFvOWF5azBkMmlMYllxL0o4Qmp1SVFzY1RLNUdmYgotVlNVWlAvM29ObjZ6NGVHQnJ4RVdpMUNYWUJtQ0FNQnJUWE80MFJNSFB1cTJNVS93UXBwdDRoRjA1WlNzallTVlBDR3Z4ZHBIeU44NQotWW1MTFcxQUwxNEZBQlp5YjdicTJpeDRFYjVZZ09lMmtmU25iU002QzNOUUNqUjBFTVZySFMvQnNZVkxYdEZIQ2dXek40ZnVub2RLUwotZHMreER6ZFlwUEpTY1djL0RJaDRnSW5CeUxVZmttTytwM3FLVml3YXFLYWN0VjJ6WTlBVElLSHJrV3pRalgydjN3dmtGN21HbmppeAotbEF4WWpPQlZxanRqYlpxSllMaGtLcExHTi9SK1EwTzNjK2dCNTMrWEQ5ZnlleG45R3RlUHlmcUZhM3Fkbm9tMnBpaVprNGhBOXo3TgotVWFQSzZ1OTVSeUcxL2pMaXg4TlJiNzZBZFBDa3d6cnlUK2xmM3hrSzhqc1RRNnd4cExQbjYvd1kxZ0dwOHlxUE5nN3J0TEc4dDB6SgotYTcraDg5bjA3ZUx3NCsxa25qMHZsbEpQZ0ZPTAotLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jb250ZW50L3NzbC9jZXJ0cy85ZDUyMGIzMi4wIGIvc3JjL2NvYmFsdC9jb250ZW50L3NzbC9jZXJ0cy85ZDUyMGIzMi4wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTQ3ODdkLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvY29udGVudC9zc2wvY2VydHMvOWQ1MjBiMzIuMAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQotTUlJRGZUQ0NBbVdnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFVRkFEQmdNUXN3Q1FZRFZRUUdFd0pLVURFbE1DTUdBMVVFQ2hNYwotVTBWRFQwMGdWSEoxYzNRZ1UzbHpkR1Z0Y3lCRFR5NHNURlJFTGpFcU1DZ0dBMVVFQ3hNaFUyVmpkWEpwZEhrZ1EyOXRiWFZ1YVdOaAotZEdsdmJpQkZWaUJTYjI5MFEwRXhNQjRYRFRBM01EWXdOakF5TVRJek1sb1hEVE0zTURZd05qQXlNVEl6TWxvd1lERUxNQWtHQTFVRQotQmhNQ1NsQXhKVEFqQmdOVkJBb1RIRk5GUTA5TklGUnlkWE4wSUZONWMzUmxiWE1nUTA4dUxFeFVSQzR4S2pBb0JnTlZCQXNUSVZObAotWTNWeWFYUjVJRU52YlcxMWJtbGpZWFJwYjI0Z1JWWWdVbTl2ZEVOQk1UQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQwotQVFvQ2dnRUJBTHgvN0ZlYkpPRCtuTHBDZWFtSWl2cUE0UFVIS1VQcWpnbzBObzBjK3FlMU9Yai9sM1gzTCtTcWF3U0VSTXFtNG1pTwotL1ZWUVlnK2tjUTdPQnpndFFvVlFyVHlXYjR2Vm9nN1Aza21KUGRaa0xqamxIbXkxVjRxZTcwZ096WHBwRm9kRXRaRGtCcDJ1b1FTWAotV0hudklFcUNhNHdpdit3ZkQrbUVjZTN4RHVTNEdCUE1WalpkMFpvZVVXczVibUIyaURRTDg3UFJzSjNLWWVKa0hjRkdCN2hqM1I0egotWmJPT0NWVlNQYlc5L3dmcnJXRlZHQ3lwYVpoS3FrREZNeFJsZEFENWtkNnZBMGpGUUZUY0Q0U1FhQ0RGa3BiY0x1VUNSYXJBWDFUNAotYmVwSnoxMXNTNi92bXNKV1hNWTFWa0pxTUYvQ3EvYmlQVCt6eVJHUE1VelhuMGtDQXdFQUFhTkNNRUF3SFFZRFZSME9CQllFRkRWSwotOVUydlA5ZUNPS3lyY1dVWGRZeWRWWlBtTUE0R0ExVWREd0VCL3dRRUF3SUJCakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTBHQ1NxRwotU0liM0RRRUJCUVVBQTRJQkFRQ29oK25zK0VCblhjUEJac2RBUzVmOGh4T1FXc1R2b01wZmk3ZW50L0hXdFdTM2lyTzRHOHphKzZ4bQotaUVITzZQemsyeDZJcHUwblVCc0NNQ1JHZWY0RWgzQ1hRSFBSd01GWEdacHBwU2VacTUxaWhQWlJ3U3pKSXhYWUtMZXJKUk8xUnVHRwotQXY4bWpNU0lraDFXL2hsbjhsWGtnS05ybkt0MzRWRnhEU0RiRUpyYnZYWjVCM2VaS0syYVh0cXhUMFFzTlk2bGxzZjlnL0JZeG5uVwotbUh5b2pmNkdQZ2NXa3VGNzV4M3NNM1orUWk1S2hmbVJpV2lFQTRHbG01cSs0emZGVkt0V094Z3RRYVFNK0VMYm1hRGdjbSs3WGVFVwotVDFNS1pQbE85TDlPVkwxNGJJanF2NXdUSk1Kd2FhSi9EOGc4clFqSnNKaEFveXJuaUlQdGQ0OTAKLS0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY29udGVudC9zc2wvY2VydHMvY2I1OWY5NjEuMCBiL3NyYy9jb2JhbHQvY29udGVudC9zc2wvY2VydHMvY2I1OWY5NjEuMApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk3NTQyYS4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2NvbnRlbnQvc3NsL2NlcnRzL2NiNTlmOTYxLjAKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0tLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KLU1JSUV4VENDQTYyZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRVUZBREI5TVFzd0NRWURWUVFHRXdKRlZURW5NQ1VHQTFVRUNoTWUKLVFVTWdRMkZ0WlhKbWFYSnRZU0JUUVNCRFNVWWdRVGd5TnpRek1qZzNNU013SVFZRFZRUUxFeHBvZEhSd09pOHZkM2QzTG1Ob1lXMWkKLVpYSnphV2R1TG05eVp6RWdNQjRHQTFVRUF4TVhSMnh2WW1Gc0lFTm9ZVzFpWlhKemFXZHVJRkp2YjNRd0hoY05NRE13T1RNd01UWXgKLU5ERTRXaGNOTXpjd09UTXdNVFl4TkRFNFdqQjlNUXN3Q1FZRFZRUUdFd0pGVlRFbk1DVUdBMVVFQ2hNZVFVTWdRMkZ0WlhKbWFYSnQKLVlTQlRRU0JEU1VZZ1FUZ3lOelF6TWpnM01TTXdJUVlEVlFRTEV4cG9kSFJ3T2k4dmQzZDNMbU5vWVcxaVpYSnphV2R1TG05eVp6RWcKLU1CNEdBMVVFQXhNWFIyeHZZbUZzSUVOb1lXMWlaWEp6YVdkdUlGSnZiM1F3Z2dFZ01BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkRRQXcKLWdnRUlBb0lCQVFDaWNLTFFuMEt1V3hmSDJIM1BGSVA4VDhtaHR4T3ZpdGVlUGdRS2tvdGdWdnEwTWkrSVRhRmdDUFMzQ1U2Z1NTOUoKLTF0UGZuWmRhbjVRRWNPdy9XZG0zekdhTG1GSW9DUUxmeFMrRWpYcVhkNy9zUUowbGNxdTFQektZKzdlMy9IS0U1VFdIK1ZYNm94OE8KLWJ5NG8zV21nMlVJUXh2aTFSTUxRUTMvYnZPU2lQR3BWZUFwM3FkanFHVEszTC81Y1B4dnVzWmpzeXExNmFVWGpsZzlWOXVidGRlcGwKLTZESldrMGFKcUNXS1pRYnVhNzk1QjlEeHQ2L3RMRTJTdThDb1g2ZG5mUVR5RlFod3JKTFdmUVRTTS90TXRnc0wreHJKeEkwRHFYNWMKLThsQ3JFcVdoejBoUXBlL1N5Qm9UK3JCL3NZSWNkMm9QWDl3TGxZL3ZRMzdtUlFrbEFnRURvNElCVURDQ0FVd3dFZ1lEVlIwVEFRSC8KLUJBZ3dCZ0VCL3dJQkREQS9CZ05WSFI4RU9EQTJNRFNnTXFBd2hpNW9kSFJ3T2k4dlkzSnNMbU5vWVcxaVpYSnphV2R1TG05eVp5OWoKLWFHRnRZbVZ5YzJsbmJuSnZiM1F1WTNKc01CMEdBMVVkRGdRV0JCUkRuRGFmc0o0d1RjYk9YNjBRcStVRHBmcXBGREFPQmdOVkhROEIKLUFmOEVCQU1DQVFZd0VRWUpZSVpJQVliNFFnRUJCQVFEQWdBSE1Db0dBMVVkRVFRak1DR0JIMk5vWVcxaVpYSnphV2R1Y205dmRFQmoKLWFHRnRZbVZ5YzJsbmJpNXZjbWN3S2dZRFZSMFNCQ013SVlFZlkyaGhiV0psY25OcFoyNXliMjkwUUdOb1lXMWlaWEp6YVdkdUxtOXkKLVp6QmJCZ05WSFNBRVZEQlNNRkFHQ3lzR0FRUUJnWWN1Q2dFQk1FRXdQd1lJS3dZQkJRVUhBZ0VXTTJoMGRIQTZMeTlqY0hNdVkyaGgKLWJXSmxjbk5wWjI0dWIzSm5MMk53Y3k5amFHRnRZbVZ5YzJsbmJuSnZiM1F1YUhSdGJEQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUEKLVBEdHdrZmtFVkNlUjRlM3QvbWgvWVYzbFFXVlBNdkVZQlpScUhONGZjTnMrZXpJQ05MVU1iS0dLZktYMGovL1UySzBYMVMwRTBUOVkKLWdPS0JXWWkrd09OR2t5VCtrTDBtb2pBdDZKY21WeldKZEpZWTloWGlyeVFaVmdJQ3Nyb1BGT3JHaW1iQmhrVlZpNzZTdnB5a0JNZEoKLVBKN29LWHFKMS82di8yajFwUmVRdmF5WnpLV0dWd2xuUnR2V0ZzSkc4ZVNwVVBXUDBaSVYwMTgreGdCSk9tNVlzdEhSSncwbHlETDQKLUlCSE5mVEl6U0pSVVROM2NlY1F3bit1T3VGVzExNGhjeFdva1BiTFRCUU5SeGdmdnpCUnlkRDF1Y3M0WUtJeEtvSGZsQ1N0RlJFZXMKLXQyZC9BWW9GV3BPK29jSC8rT2NPWjZSSFNYWmRkWkFhOVNhUDhBPT0KLS0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY29udGVudC9zc2wvY2VydHMvZjkwMjA4ZjcuMCBiL3NyYy9jb2JhbHQvY29udGVudC9zc2wvY2VydHMvZjkwMjA4ZjcuMApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBkODc4ZS4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2NvbnRlbnQvc3NsL2NlcnRzL2Y5MDIwOGY3LjAKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0tLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KLU1JSUV2VENDQTZXZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRVUZBREIvTVFzd0NRWURWUVFHRXdKRlZURW5NQ1VHQTFVRUNoTWUKLVFVTWdRMkZ0WlhKbWFYSnRZU0JUUVNCRFNVWWdRVGd5TnpRek1qZzNNU013SVFZRFZRUUxFeHBvZEhSd09pOHZkM2QzTG1Ob1lXMWkKLVpYSnphV2R1TG05eVp6RWlNQ0FHQTFVRUF4TVpRMmhoYldKbGNuTWdiMllnUTI5dGJXVnlZMlVnVW05dmREQWVGdzB3TXpBNU16QXgKLU5qRXpORE5hRncwek56QTVNekF4TmpFek5EUmFNSDh4Q3pBSkJnTlZCQVlUQWtWVk1TY3dKUVlEVlFRS0V4NUJReUJEWVcxbGNtWnAKLWNtMWhJRk5CSUVOSlJpQkJPREkzTkRNeU9EY3hJekFoQmdOVkJBc1RHbWgwZEhBNkx5OTNkM2N1WTJoaGJXSmxjbk5wWjI0dWIzSm4KLU1TSXdJQVlEVlFRREV4bERhR0Z0WW1WeWN5QnZaaUJEYjIxdFpYSmpaU0JTYjI5ME1JSUJJREFOQmdrcWhraUc5dzBCQVFFRkFBT0MKLUFRMEFNSUlCQ0FLQ0FRRUF0elpWNWFWZEdERGcyb2xVa2Z6SXgxTDRMMURaNzdGMWMyVkhmUnRidW5YRi9LR0lKUG92N2NvSVNqbFUKLXhGRjZ0ZHBnNmpnOGdiTEw4YnZaa1NNL1NBRndkYWtGS3EwZmNmUEpWRDBkQm1wQVByTU1oZTVjRzNuQ1lzUzRObzQxWFFFTUl3UkgKLU5hcWJZRTZnWmozTEpncWNRS0gwWFppL2NhdWxBR2dxN1lONkQ2SVV0ZFFpczRDd1BBeGFVV2t0V0JpUDdabWU4YTdpbGViMlI2alcKLURBK3dXRmpidzJZM25wdVJWRE0zMHBRY2Frakp5ZktsMnFVTUkvY2pEcHd5VlY1eG5JUUZVWm90L2VaT0tqUmEzc3BBTjJjTVZDRlYKLWQ5b0tETXlYcm9EY2xEWks5RDdPTmhNZVUrU3NUam9GN051dWNwdzRpOUE1TzRrS1BuZitkUUlCQTZPQ0FVUXdnZ0ZBTUJJR0ExVWQKLUV3RUIvd1FJTUFZQkFmOENBUXd3UEFZRFZSMGZCRFV3TXpBeG9DK2dMWVlyYUhSMGNEb3ZMMk55YkM1amFHRnRZbVZ5YzJsbmJpNXYKLWNtY3ZZMmhoYldKbGNuTnliMjkwTG1OeWJEQWRCZ05WSFE0RUZnUVU0NVQxc1UzcDI2RXBXMWVMVFhZR2R1SFJvb293RGdZRFZSMFAKLUFRSC9CQVFEQWdFR01CRUdDV0NHU0FHRytFSUJBUVFFQXdJQUJ6QW5CZ05WSFJFRUlEQWVnUnhqYUdGdFltVnljM0p2YjNSQVkyaGgKLWJXSmxjbk5wWjI0dWIzSm5NQ2NHQTFVZEVnUWdNQjZCSEdOb1lXMWlaWEp6Y205dmRFQmphR0Z0WW1WeWMybG5iaTV2Y21jd1dBWUQKLVZSMGdCRkV3VHpCTkJnc3JCZ0VFQVlHSExnb0RBVEErTUR3R0NDc0dBUVVGQndJQkZqQm9kSFJ3T2k4dlkzQnpMbU5vWVcxaVpYSnoKLWFXZHVMbTl5Wnk5amNITXZZMmhoYldKbGNuTnliMjkwTG1oMGJXd3dEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBQXhCbDhJYWhzQWkKLWZKLzdrUE1hMFFPeDd4UDVJVjhFbk5ySnBZMG5iSmFIa2I1QmtBRnlrK2NlZlYvMmljWmRwMEFKUGF4SlJVWGNMbzB3YUxJSnV2dkQKLUw4eTZDOTgvZDN0R2ZUb1NKSTZXanp3RkNtL1NsQ2dkYlF6QUxvZ2kxZGpQSFJQSDhFalgxd1duejhkSG5qczhOTWlBVDlRVXUvd04KLVVQZjZzK3hDWDZuZGJjajBkYzk3d1hJbXNRRWNYQ3o5ZWs2MEFjVUZWN25uUEtvRjJZanBCMFpCenU5QmdhNVkzNE9pcnNyWGR4L24KLUFEeWRiNDdrTWdrZFRYZzBlRFE4bEpzbTdVOXh4aGw2dlNBaVNGcitTMzBEdCtkWXZzWXlUblFlYU4yb2FGdXpQdTVpZmRtQTZBcDEKLWVyZnV0R1dhSVpEZ3F0Q1l2RGkxY3p5TCtOdz0KLS0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2NvbXB1dGVkX3N0eWxlX2RhdGEuaCBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2NvbXB1dGVkX3N0eWxlX2RhdGEuaAppbmRleCA4OGQ5MGE2Li4xZDBkYzkwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2Nzc19jb21wdXRlZF9zdHlsZV9kYXRhLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3NfY29tcHV0ZWRfc3R5bGVfZGF0YS5oCkBAIC0zMyw3ICszMyw4IEBACiAKIC8vIENTU0NvbXB1dGVkU3R5bGVEYXRhIHdoaWNoIGhhcyBQcm9wZXJ0eVZhbHVlIHR5cGUgcHJvcGVydGllcyBvbmx5IHVzZWQKIC8vIGludGVybmFsbHkgYW5kIGl0IGlzIG5vdCBleHBvc2VkIHRvIEphdmFTY3JpcHQuCi1jbGFzcyBDU1NDb21wdXRlZFN0eWxlRGF0YSA6IHB1YmxpYyBiYXNlOjpSZWZDb3VudGVkPENTU0NvbXB1dGVkU3R5bGVEYXRhPiB7CitjbGFzcyBDU1NDb21wdXRlZFN0eWxlRGF0YQorICAgIDogcHVibGljIGJhc2U6OlJlZkNvdW50ZWRUaHJlYWRTYWZlPENTU0NvbXB1dGVkU3R5bGVEYXRhPiB7CiAgcHVibGljOgogICAvLyBUaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBwcm9wZXJ0aWVzIG9mIHR3bwogICAvLyBDU1NDb21wdXRlZFN0eWxlRGF0YSBvYmplY3RzIG1hdGNoIGZvciBhIGdpdmVuIHNldCBvZiBwcm9wZXJ0eSBrZXlzLgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9zZWxlY3Rvcl90cmVlLmNjIGIvc3JjL2NvYmFsdC9jc3NvbS9zZWxlY3Rvcl90cmVlLmNjCmluZGV4IDAxMTAzMmYuLjFhMzIyNjYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vc2VsZWN0b3JfdHJlZS5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL3NlbGVjdG9yX3RyZWUuY2MKQEAgLTE4Myw3ICsxODMsNyBAQAogU2VsZWN0b3JUcmVlOjpOb2RlKiBTZWxlY3RvclRyZWU6OkdldE9yQ3JlYXRlTm9kZUZvckNvbXBsZXhTZWxlY3RvcigKICAgICBDb21wbGV4U2VsZWN0b3IqIGNvbXBsZXhfc2VsZWN0b3IpIHsKICAgQ29tcG91bmRTZWxlY3Rvciogc2VsZWN0b3IgPSBjb21wbGV4X3NlbGVjdG9yLT5maXJzdF9zZWxlY3RvcigpOwotICBOb2RlKiBub2RlID0gR2V0T3JDcmVhdGVOb2RlRm9yQ29tcG91bmRTZWxlY3RvcihzZWxlY3RvciwgJnJvb3RfLAorICBOb2RlKiBub2RlID0gR2V0T3JDcmVhdGVOb2RlRm9yQ29tcG91bmRTZWxlY3RvcihzZWxlY3RvciwgJnJvb3Rfbm9kZV8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtEZXNjZW5kYW50Q29tYmluYXRvcik7CiAKICAgd2hpbGUgKHNlbGVjdG9yLT5yaWdodF9jb21iaW5hdG9yKCkpIHsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vc2VsZWN0b3JfdHJlZS5oIGIvc3JjL2NvYmFsdC9jc3NvbS9zZWxlY3Rvcl90cmVlLmgKaW5kZXggMTBmMTU0NS4uOThmMzNmNiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9zZWxlY3Rvcl90cmVlLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9zZWxlY3Rvcl90cmVlLmgKQEAgLTQzLDg0ICs0MywxMiBAQAogLy8gaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xTFRiU2VuR3NHUjk0SlRHZzZEZlpEWFlCM01CQkNwNEM4ZFJDNHJja3RfOC8KIGNsYXNzIFNlbGVjdG9yVHJlZSB7CiAgcHVibGljOgotICB0eXBlZGVmIHN0ZDo6dmVjdG9yPGJhc2U6OldlYWtQdHI8Q1NTU3R5bGVSdWxlPiA+IFJ1bGVzOwotCiAgIGNsYXNzIE5vZGU7CiAKLSAgLy8gVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byBzdG9yZSBOb2Rlcy4gIEl0IHN0b3JlcyB0aGUgTm9kZXMgaW4gaXRzCi0gIC8vIGludGVybmFsIGJ1ZmZlciB3aG9zZSBzaXplIGNhbiBiZSBjb25maWd1cmVkIHZpYSB0ZW1wbGF0ZSBwYXJhbWV0ZXIuCi0gIC8vIEFmdGVyIHRoZSBpbnRlcm5hbCBidWZmZXIgaXMgdXNlZCB1cCB0aGUgZXh0cmEgTm9kZXMgd2lsbCBiZSBzdG9yZWQgaW5zaWRlCi0gIC8vIHRoZSBjb250YWluZWQgc3RkOjp2ZWN0b3IuCi0gIC8vIFRPRE86IE1vdmUgdGhpcyBvZmYgdG8gaXRzIG93biBmaWxlIGlmIHRoaXMgY2FuIGFsc28gYmUgdXNlZCBieQotICAvLyBvdGhlciBjb2RlLgotICB0ZW1wbGF0ZSA8c2l6ZV90IEludGVybmFsQ2FjaGVTaXplPgotICBjbGFzcyBOb2RlU2V0IHsKLSAgIHB1YmxpYzoKLSAgICAvLyBNaW5pbXVtIGludGVyZmFjZSBmb3IgaXRlcmF0b3IuCi0gICAgY2xhc3MgY29uc3RfaXRlcmF0b3IgewotICAgICBwdWJsaWM6Ci0gICAgICBjb25zdF9pdGVyYXRvcihjb25zdCBOb2RlU2V0KiBzZXQsIHNpemVfdCBpbmRleCkKLSAgICAgICAgICA6IHNldF8oc2V0KSwgaW5kZXhfKGluZGV4KSB7fQotICAgICAgdm9pZCBvcGVyYXRvcisrKCkgeyArK2luZGV4XzsgfQotICAgICAgY29uc3QgTm9kZSogb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gc2V0Xy0+R2V0Tm9kZShpbmRleF8pOyB9Ci0gICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgY29uc3RfaXRlcmF0b3ImIHRoYXQpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIHNldF8gIT0gdGhhdC5zZXRfIHx8IGluZGV4XyAhPSB0aGF0LmluZGV4XzsKLSAgICAgIH0KKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxiYXNlOjpXZWFrUHRyPENTU1N0eWxlUnVsZT4+IFJ1bGVzOwogCi0gICAgIHByaXZhdGU6Ci0gICAgICBjb25zdCBOb2RlU2V0KiBzZXRfOwotICAgICAgc2l6ZV90IGluZGV4XzsKLSAgICB9OwotCi0gICAgTm9kZVNldCgpIDogc2l6ZV8oMCkge30KLSAgICB2b2lkIGluc2VydChjb25zdCBOb2RlKiBub2RlLCBib29sIGNoZWNrX2Zvcl9kdXBsaWNhdGUgPSBmYWxzZSkgewotICAgICAgLy8gSWYgfGNoZWNrX2Zvcl9kdXBsaWNhdGV8IGlzIHRydWUsIHRoZW4gY2hlY2sgaWYgdGhlIG5vZGUgaXMgYWxyZWFkeQotICAgICAgLy8gY29udGFpbmVkLiBJbiBuZWFybHkgYWxsIGNhc2VzLCB0aGlzIGNoZWNrIGlzIHVubmVjZXNzYXJ5IGJlY2F1c2UgaXQgaXMKLSAgICAgIC8vIGFscmVhZHkga25vd24gdGhhdCB0aGUgbm9kZSBpcyBub3QgYSBkdXBsaWNhdGUuIEFzIGEgcmVzdWx0LCB0aGUgY2FsbGVyCi0gICAgICAvLyBtdXN0IGV4cGxpY2l0bHkgcmVxdWVzdCB0aGUgY2hlY2sgd2hlbiBuZWVkZWQuCi0gICAgICBpZiAoY2hlY2tfZm9yX2R1cGxpY2F0ZSkgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVfOyArK2kpIHsKLSAgICAgICAgICBpZiAoR2V0Tm9kZShpKSA9PSBub2RlKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChzaXplXyA8IEludGVybmFsQ2FjaGVTaXplKSB7Ci0gICAgICAgIG5vZGVzX1tzaXplX10gPSBub2RlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgbm9kZXNfdmVjdG9yXy5wdXNoX2JhY2sobm9kZSk7Ci0gICAgICB9Ci0gICAgICArK3NpemVfOwotICAgIH0KLSAgICB0ZW1wbGF0ZSA8Y2xhc3MgQ29uc3RJdGVyYXRvcj4KLSAgICB2b2lkIGluc2VydChDb25zdEl0ZXJhdG9yIGJlZ2luLCBDb25zdEl0ZXJhdG9yIGVuZCwKLSAgICAgICAgICAgICAgICBib29sIGNoZWNrX2Zvcl9kdXBsaWNhdGUgPSBmYWxzZSkgewotICAgICAgd2hpbGUgKGJlZ2luICE9IGVuZCkgewotICAgICAgICBpbnNlcnQoKmJlZ2luLCBjaGVja19mb3JfZHVwbGljYXRlKTsKLSAgICAgICAgKytiZWdpbjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKHRoaXMsIDApOyB9Ci0gICAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IodGhpcywgc2l6ZV8pOyB9Ci0gICAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBzaXplXzsgfQotICAgIHZvaWQgY2xlYXIoKSB7Ci0gICAgICBzaXplXyA9IDA7Ci0gICAgICBub2Rlc192ZWN0b3JfLmNsZWFyKCk7Ci0gICAgfQotICAgIGNvbnN0IE5vZGUqIEdldE5vZGUoc2l6ZV90IGluZGV4KSBjb25zdCB7Ci0gICAgICBpZiAoaW5kZXggPCBJbnRlcm5hbENhY2hlU2l6ZSkgewotICAgICAgICByZXR1cm4gbm9kZXNfW2luZGV4XTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBub2Rlc192ZWN0b3JfW2luZGV4IC0gSW50ZXJuYWxDYWNoZVNpemVdOwotICAgIH0KLQotICAgcHJpdmF0ZToKLSAgICBzaXplX3Qgc2l6ZV87Ci0gICAgY29uc3QgTm9kZSogbm9kZXNfW0ludGVybmFsQ2FjaGVTaXplXTsKLSAgICBzdGQ6OnZlY3Rvcjxjb25zdCBOb2RlKj4gbm9kZXNfdmVjdG9yXzsKLSAgfTsKKyAgdHlwZWRlZiBzdGQ6OnZlY3Rvcjxjb25zdCBOb2RlKj4gTm9kZXM7CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGNvbnN0IE5vZGUqLCBjb25zdCBOb2RlKj4+IE5vZGVQYWlyczsKIAogICBzdHJ1Y3QgQ29tcG91bmROb2RlTGVzc1RoYW4gewogICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBDb21wb3VuZFNlbGVjdG9yKiBsaHMsCkBAIC0yNTUsMTAgKzE4MywxNiBAQAogICAgIFJ1bGVzIHJ1bGVzXzsKICAgfTsKIAotICBTZWxlY3RvclRyZWUoKSA6IGhhc19zaWJsaW5nX2NvbWJpbmF0b3JzXyhmYWxzZSkgeyByb290X3NldF8uaW5zZXJ0KCZyb290Xyk7IH0KKyAgU2VsZWN0b3JUcmVlKCkgOiBoYXNfc2libGluZ19jb21iaW5hdG9yc18oZmFsc2UpIHsKKyAgICByb290X25vZGVzXy5wdXNoX2JhY2soJnJvb3Rfbm9kZV8pOworICB9CiAKLSAgY29uc3QgTm9kZSogcm9vdCgpIGNvbnN0IHsgcmV0dXJuICZyb290XzsgfQotICBjb25zdCBOb2RlU2V0PDE+JiByb290X3NldCgpIGNvbnN0IHsgcmV0dXJuIHJvb3Rfc2V0XzsgfQorICBjb25zdCBOb2RlKiByb290X25vZGUoKSBjb25zdCB7IHJldHVybiAmcm9vdF9ub2RlXzsgfQorICBjb25zdCBOb2RlcyYgcm9vdF9ub2RlcygpIGNvbnN0IHsgcmV0dXJuIHJvb3Rfbm9kZXNfOyB9CisKKyAgTm9kZXMqIHNjcmF0Y2hwYWRfbm9kZXNfMSgpIHsgcmV0dXJuICZzY3JhdGNocGFkX25vZGVzXzFfOyB9CisgIE5vZGVzKiBzY3JhdGNocGFkX25vZGVzXzIoKSB7IHJldHVybiAmc2NyYXRjaHBhZF9ub2Rlc18yXzsgfQorICBOb2RlUGFpcnMqIHNjcmF0Y2hwYWRfbm9kZV9wYWlycygpIHsgcmV0dXJuICZzY3JhdGNocGFkX25vZGVfcGFpcnNfOyB9CiAKICAgYm9vbCBoYXNfc2libGluZ19jb21iaW5hdG9ycygpIGNvbnN0IHsgcmV0dXJuIGhhc19zaWJsaW5nX2NvbWJpbmF0b3JzXzsgfQogCkBAIC0yODQsOCArMjE4LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZSogcGFyZW50X25vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tYmluYXRvclR5cGUgY29tYmluYXRvcik7CiAKLSAgTm9kZSByb290XzsKLSAgTm9kZVNldDwxPiByb290X3NldF87CisgIE5vZGUgcm9vdF9ub2RlXzsKKyAgTm9kZXMgcm9vdF9ub2Rlc187CisKKyAgLy8gVGhlc2UgbWVtYmVyIHZhcmlhYmxlcyBhcmUgYXZhaWxhYmxlIGZvciB0ZW1wb3Jhcnkgb3BlcmF0aW9ucywgc28gdGhhdAorICAvLyBOb2RlIHZlY3RvcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBTZWxlY3RvclRyZWUgZG9uJ3QgaGF2ZSB0byBiZSByZXBlYXRlZGx5CisgIC8vIHJlLWFsbG9jYXRlZC4gVGhpcyBzaWduaWZpY2FudGx5IHNwZWVkcyB1cCBydWxlIG1hdGNoaW5nLgorICBOb2RlcyBzY3JhdGNocGFkX25vZGVzXzFfOworICBOb2RlcyBzY3JhdGNocGFkX25vZGVzXzJfOworICBOb2RlUGFpcnMgc2NyYXRjaHBhZF9ub2RlX3BhaXJzXzsKIAogICAvLyBUaGlzIHZhcmlhYmxlIG1hcHMgZnJvbSBhIHBhcmVudCBOb2RlIGFuZCBhIGNvbWJpbmF0b3IgdHlwZSB0byBjaGlsZCBOb2RlcwogICAvLyB1bmRlciB0aGUgcGFydGljdWxhciBwYXJlbnQgTm9kZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBwYXJ0aWN1bGFyIGNvbWJpbmF0b3IKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vc2VsZWN0b3JfdHJlZV90ZXN0LmNjIGIvc3JjL2NvYmFsdC9jc3NvbS9zZWxlY3Rvcl90cmVlX3Rlc3QuY2MKaW5kZXggMzA0ZjVjOS4uMjI1NjBkZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9zZWxlY3Rvcl90cmVlX3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9zZWxlY3Rvcl90cmVlX3Rlc3QuY2MKQEAgLTI2LDE1ICsyNiwxNyBAQAogVEVTVChTZWxlY3RvclRyZWVUZXN0LCBSb290U2hvdWxkSGF2ZU5vQ2hpbGRyZW5BZnRlckluaXRpYWxpemF0aW9uKSB7CiAgIFNlbGVjdG9yVHJlZSBzZWxlY3Rvcl90cmVlOwogICBFWFBFQ1RfVFJVRSgKLSAgICAgIHNlbGVjdG9yX3RyZWUuY2hpbGRyZW4oc2VsZWN0b3JfdHJlZS5yb290KCksIGtDaGlsZENvbWJpbmF0b3IpLmVtcHR5KCkpOwotICBFWFBFQ1RfVFJVRSgKLSAgICAgIHNlbGVjdG9yX3RyZWUuY2hpbGRyZW4oc2VsZWN0b3JfdHJlZS5yb290KCksIGtEZXNjZW5kYW50Q29tYmluYXRvcikKKyAgICAgIHNlbGVjdG9yX3RyZWUuY2hpbGRyZW4oc2VsZWN0b3JfdHJlZS5yb290X25vZGUoKSwga0NoaWxkQ29tYmluYXRvcikKICAgICAgICAgICAuZW1wdHkoKSk7CiAgIEVYUEVDVF9UUlVFKAotICAgICAgc2VsZWN0b3JfdHJlZS5jaGlsZHJlbihzZWxlY3Rvcl90cmVlLnJvb3QoKSwga05leHRTaWJsaW5nQ29tYmluYXRvcikKKyAgICAgIHNlbGVjdG9yX3RyZWUuY2hpbGRyZW4oc2VsZWN0b3JfdHJlZS5yb290X25vZGUoKSwga0Rlc2NlbmRhbnRDb21iaW5hdG9yKQogICAgICAgICAgIC5lbXB0eSgpKTsKICAgRVhQRUNUX1RSVUUoCi0gICAgICBzZWxlY3Rvcl90cmVlLmNoaWxkcmVuKHNlbGVjdG9yX3RyZWUucm9vdCgpLCBrRm9sbG93aW5nU2libGluZ0NvbWJpbmF0b3IpCisgICAgICBzZWxlY3Rvcl90cmVlLmNoaWxkcmVuKHNlbGVjdG9yX3RyZWUucm9vdF9ub2RlKCksIGtOZXh0U2libGluZ0NvbWJpbmF0b3IpCisgICAgICAgICAgLmVtcHR5KCkpOworICBFWFBFQ1RfVFJVRSgKKyAgICAgIHNlbGVjdG9yX3RyZWUKKyAgICAgICAgICAuY2hpbGRyZW4oc2VsZWN0b3JfdHJlZS5yb290X25vZGUoKSwga0ZvbGxvd2luZ1NpYmxpbmdDb21iaW5hdG9yKQogICAgICAgICAgIC5lbXB0eSgpKTsKIH0KIApAQCAtNTYsMjAgKzU4LDIyIEBACiAgIGJhc2U6OlZlcnNpb25Db21wYXRpYmlsaXR5OjpHZXRJbnN0YW5jZSgpLT5TZXRNaW5pbXVtVmVyc2lvbigxKTsKICAgRVhQRUNUX1RSVUUoc2VsZWN0b3JfdHJlZS5WYWxpZGF0ZVZlcnNpb25Db21wYXRpYmlsaXR5KCkpOwogCi0gIEFTU0VSVF9FUSgKLSAgICAgIDAsIHNlbGVjdG9yX3RyZWUuY2hpbGRyZW4oc2VsZWN0b3JfdHJlZS5yb290KCksIGtDaGlsZENvbWJpbmF0b3IpLnNpemUoKSk7Ci0gIEFTU0VSVF9FUSgxLAotICAgICAgICAgICAgc2VsZWN0b3JfdHJlZS5jaGlsZHJlbihzZWxlY3Rvcl90cmVlLnJvb3QoKSwga0Rlc2NlbmRhbnRDb21iaW5hdG9yKQotICAgICAgICAgICAgICAgIC5zaXplKCkpOwogICBBU1NFUlRfRVEoMCwKLSAgICAgICAgICAgIHNlbGVjdG9yX3RyZWUuY2hpbGRyZW4oc2VsZWN0b3JfdHJlZS5yb290KCksIGtOZXh0U2libGluZ0NvbWJpbmF0b3IpCisgICAgICAgICAgICBzZWxlY3Rvcl90cmVlLmNoaWxkcmVuKHNlbGVjdG9yX3RyZWUucm9vdF9ub2RlKCksIGtDaGlsZENvbWJpbmF0b3IpCiAgICAgICAgICAgICAgICAgLnNpemUoKSk7Ci0gIEFTU0VSVF9FUSgwLCBzZWxlY3Rvcl90cmVlLmNoaWxkcmVuKHNlbGVjdG9yX3RyZWUucm9vdCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRm9sbG93aW5nU2libGluZ0NvbWJpbmF0b3IpCisgIEFTU0VSVF9FUSgxLCBzZWxlY3Rvcl90cmVlCisgICAgICAgICAgICAgICAgICAgLmNoaWxkcmVuKHNlbGVjdG9yX3RyZWUucm9vdF9ub2RlKCksIGtEZXNjZW5kYW50Q29tYmluYXRvcikKICAgICAgICAgICAgICAgICAgICAuc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDAsIHNlbGVjdG9yX3RyZWUKKyAgICAgICAgICAgICAgICAgICAuY2hpbGRyZW4oc2VsZWN0b3JfdHJlZS5yb290X25vZGUoKSwga05leHRTaWJsaW5nQ29tYmluYXRvcikKKyAgICAgICAgICAgICAgICAgICAuc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKAorICAgICAgMCwgc2VsZWN0b3JfdHJlZQorICAgICAgICAgICAgIC5jaGlsZHJlbihzZWxlY3Rvcl90cmVlLnJvb3Rfbm9kZSgpLCBrRm9sbG93aW5nU2libGluZ0NvbWJpbmF0b3IpCisgICAgICAgICAgICAgLnNpemUoKSk7CiAKICAgY29uc3QgU2VsZWN0b3JUcmVlOjpOb2RlKiBub2RlXzEgPQotICAgICAgc2VsZWN0b3JfdHJlZS5jaGlsZHJlbihzZWxlY3Rvcl90cmVlLnJvb3QoKSwga0Rlc2NlbmRhbnRDb21iaW5hdG9yKQorICAgICAgc2VsZWN0b3JfdHJlZS5jaGlsZHJlbihzZWxlY3Rvcl90cmVlLnJvb3Rfbm9kZSgpLCBrRGVzY2VuZGFudENvbWJpbmF0b3IpCiAgICAgICAgICAgLmJlZ2luKCkKICAgICAgICAgICAtPnNlY29uZDsKICAgQVNTRVJUX0VRKDEsIG5vZGVfMS0+cnVsZXMoKS5zaXplKCkpOwpAQCAtMTAyLDE3ICsxMDYsMTkgQEAKICAgYmFzZTo6VmVyc2lvbkNvbXBhdGliaWxpdHk6OkdldEluc3RhbmNlKCktPlNldE1pbmltdW1WZXJzaW9uKDEpOwogICBFWFBFQ1RfVFJVRShzZWxlY3Rvcl90cmVlLlZhbGlkYXRlVmVyc2lvbkNvbXBhdGliaWxpdHkoKSk7CiAKLSAgQVNTRVJUX0VRKAotICAgICAgMCwgc2VsZWN0b3JfdHJlZS5jaGlsZHJlbihzZWxlY3Rvcl90cmVlLnJvb3QoKSwga0NoaWxkQ29tYmluYXRvcikuc2l6ZSgpKTsKLSAgQVNTRVJUX0VRKDEsCi0gICAgICAgICAgICBzZWxlY3Rvcl90cmVlLmNoaWxkcmVuKHNlbGVjdG9yX3RyZWUucm9vdCgpLCBrRGVzY2VuZGFudENvbWJpbmF0b3IpCi0gICAgICAgICAgICAgICAgLnNpemUoKSk7CiAgIEFTU0VSVF9FUSgwLAotICAgICAgICAgICAgc2VsZWN0b3JfdHJlZS5jaGlsZHJlbihzZWxlY3Rvcl90cmVlLnJvb3QoKSwga05leHRTaWJsaW5nQ29tYmluYXRvcikKKyAgICAgICAgICAgIHNlbGVjdG9yX3RyZWUuY2hpbGRyZW4oc2VsZWN0b3JfdHJlZS5yb290X25vZGUoKSwga0NoaWxkQ29tYmluYXRvcikKICAgICAgICAgICAgICAgICAuc2l6ZSgpKTsKLSAgQVNTRVJUX0VRKDAsIHNlbGVjdG9yX3RyZWUuY2hpbGRyZW4oc2VsZWN0b3JfdHJlZS5yb290KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtGb2xsb3dpbmdTaWJsaW5nQ29tYmluYXRvcikKKyAgQVNTRVJUX0VRKDEsIHNlbGVjdG9yX3RyZWUKKyAgICAgICAgICAgICAgICAgICAuY2hpbGRyZW4oc2VsZWN0b3JfdHJlZS5yb290X25vZGUoKSwga0Rlc2NlbmRhbnRDb21iaW5hdG9yKQogICAgICAgICAgICAgICAgICAgIC5zaXplKCkpOworICBBU1NFUlRfRVEoMCwgc2VsZWN0b3JfdHJlZQorICAgICAgICAgICAgICAgICAgIC5jaGlsZHJlbihzZWxlY3Rvcl90cmVlLnJvb3Rfbm9kZSgpLCBrTmV4dFNpYmxpbmdDb21iaW5hdG9yKQorICAgICAgICAgICAgICAgICAgIC5zaXplKCkpOworICBBU1NFUlRfRVEoCisgICAgICAwLCBzZWxlY3Rvcl90cmVlCisgICAgICAgICAgICAgLmNoaWxkcmVuKHNlbGVjdG9yX3RyZWUucm9vdF9ub2RlKCksIGtGb2xsb3dpbmdTaWJsaW5nQ29tYmluYXRvcikKKyAgICAgICAgICAgICAuc2l6ZSgpKTsKIH0KIAogVEVTVChTZWxlY3RvclRyZWVUZXN0LCBBcHBlbmRSdWxlU2ltcGxlU2hvdWxkVGFrZVR3b0lkZW50aWNhbFJ1bGVzKSB7CkBAIC0xMzgsMTkgKzE0NCwyMSBAQAogICBiYXNlOjpWZXJzaW9uQ29tcGF0aWJpbGl0eTo6R2V0SW5zdGFuY2UoKS0+U2V0TWluaW11bVZlcnNpb24oMSk7CiAgIEVYUEVDVF9UUlVFKHNlbGVjdG9yX3RyZWUuVmFsaWRhdGVWZXJzaW9uQ29tcGF0aWJpbGl0eSgpKTsKIAotICBBU1NFUlRfRVEoCi0gICAgICAwLCBzZWxlY3Rvcl90cmVlLmNoaWxkcmVuKHNlbGVjdG9yX3RyZWUucm9vdCgpLCBrQ2hpbGRDb21iaW5hdG9yKS5zaXplKCkpOwotICBBU1NFUlRfRVEoMSwKLSAgICAgICAgICAgIHNlbGVjdG9yX3RyZWUuY2hpbGRyZW4oc2VsZWN0b3JfdHJlZS5yb290KCksIGtEZXNjZW5kYW50Q29tYmluYXRvcikKLSAgICAgICAgICAgICAgICAuc2l6ZSgpKTsKICAgQVNTRVJUX0VRKDAsCi0gICAgICAgICAgICBzZWxlY3Rvcl90cmVlLmNoaWxkcmVuKHNlbGVjdG9yX3RyZWUucm9vdCgpLCBrTmV4dFNpYmxpbmdDb21iaW5hdG9yKQorICAgICAgICAgICAgc2VsZWN0b3JfdHJlZS5jaGlsZHJlbihzZWxlY3Rvcl90cmVlLnJvb3Rfbm9kZSgpLCBrQ2hpbGRDb21iaW5hdG9yKQogICAgICAgICAgICAgICAgIC5zaXplKCkpOwotICBBU1NFUlRfRVEoMCwgc2VsZWN0b3JfdHJlZS5jaGlsZHJlbihzZWxlY3Rvcl90cmVlLnJvb3QoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0ZvbGxvd2luZ1NpYmxpbmdDb21iaW5hdG9yKQorICBBU1NFUlRfRVEoMSwgc2VsZWN0b3JfdHJlZQorICAgICAgICAgICAgICAgICAgIC5jaGlsZHJlbihzZWxlY3Rvcl90cmVlLnJvb3Rfbm9kZSgpLCBrRGVzY2VuZGFudENvbWJpbmF0b3IpCiAgICAgICAgICAgICAgICAgICAgLnNpemUoKSk7CisgIEFTU0VSVF9FUSgwLCBzZWxlY3Rvcl90cmVlCisgICAgICAgICAgICAgICAgICAgLmNoaWxkcmVuKHNlbGVjdG9yX3RyZWUucm9vdF9ub2RlKCksIGtOZXh0U2libGluZ0NvbWJpbmF0b3IpCisgICAgICAgICAgICAgICAgICAgLnNpemUoKSk7CisgIEFTU0VSVF9FUSgKKyAgICAgIDAsIHNlbGVjdG9yX3RyZWUKKyAgICAgICAgICAgICAuY2hpbGRyZW4oc2VsZWN0b3JfdHJlZS5yb290X25vZGUoKSwga0ZvbGxvd2luZ1NpYmxpbmdDb21iaW5hdG9yKQorICAgICAgICAgICAgIC5zaXplKCkpOwogICBjb25zdCBTZWxlY3RvclRyZWU6Ok5vZGUqIG5vZGVfMSA9Ci0gICAgICBzZWxlY3Rvcl90cmVlLmNoaWxkcmVuKHNlbGVjdG9yX3RyZWUucm9vdCgpLCBrRGVzY2VuZGFudENvbWJpbmF0b3IpCisgICAgICBzZWxlY3Rvcl90cmVlLmNoaWxkcmVuKHNlbGVjdG9yX3RyZWUucm9vdF9ub2RlKCksIGtEZXNjZW5kYW50Q29tYmluYXRvcikKICAgICAgICAgICAuYmVnaW4oKQogICAgICAgICAgIC0+c2Vjb25kOwogICBBU1NFUlRfRVEoMiwgbm9kZV8xLT5ydWxlcygpLnNpemUoKSk7CkBAIC0xODQsMTkgKzE5MiwyMSBAQAogICBiYXNlOjpWZXJzaW9uQ29tcGF0aWJpbGl0eTo6R2V0SW5zdGFuY2UoKS0+U2V0TWluaW11bVZlcnNpb24oMSk7CiAgIEVYUEVDVF9UUlVFKHNlbGVjdG9yX3RyZWUuVmFsaWRhdGVWZXJzaW9uQ29tcGF0aWJpbGl0eSgpKTsKIAotICBBU1NFUlRfRVEoCi0gICAgICAwLCBzZWxlY3Rvcl90cmVlLmNoaWxkcmVuKHNlbGVjdG9yX3RyZWUucm9vdCgpLCBrQ2hpbGRDb21iaW5hdG9yKS5zaXplKCkpOwotICBBU1NFUlRfRVEoMSwKLSAgICAgICAgICAgIHNlbGVjdG9yX3RyZWUuY2hpbGRyZW4oc2VsZWN0b3JfdHJlZS5yb290KCksIGtEZXNjZW5kYW50Q29tYmluYXRvcikKLSAgICAgICAgICAgICAgICAuc2l6ZSgpKTsKICAgQVNTRVJUX0VRKDAsCi0gICAgICAgICAgICBzZWxlY3Rvcl90cmVlLmNoaWxkcmVuKHNlbGVjdG9yX3RyZWUucm9vdCgpLCBrTmV4dFNpYmxpbmdDb21iaW5hdG9yKQorICAgICAgICAgICAgc2VsZWN0b3JfdHJlZS5jaGlsZHJlbihzZWxlY3Rvcl90cmVlLnJvb3Rfbm9kZSgpLCBrQ2hpbGRDb21iaW5hdG9yKQogICAgICAgICAgICAgICAgIC5zaXplKCkpOwotICBBU1NFUlRfRVEoMCwgc2VsZWN0b3JfdHJlZS5jaGlsZHJlbihzZWxlY3Rvcl90cmVlLnJvb3QoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0ZvbGxvd2luZ1NpYmxpbmdDb21iaW5hdG9yKQorICBBU1NFUlRfRVEoMSwgc2VsZWN0b3JfdHJlZQorICAgICAgICAgICAgICAgICAgIC5jaGlsZHJlbihzZWxlY3Rvcl90cmVlLnJvb3Rfbm9kZSgpLCBrRGVzY2VuZGFudENvbWJpbmF0b3IpCiAgICAgICAgICAgICAgICAgICAgLnNpemUoKSk7CisgIEFTU0VSVF9FUSgwLCBzZWxlY3Rvcl90cmVlCisgICAgICAgICAgICAgICAgICAgLmNoaWxkcmVuKHNlbGVjdG9yX3RyZWUucm9vdF9ub2RlKCksIGtOZXh0U2libGluZ0NvbWJpbmF0b3IpCisgICAgICAgICAgICAgICAgICAgLnNpemUoKSk7CisgIEFTU0VSVF9FUSgKKyAgICAgIDAsIHNlbGVjdG9yX3RyZWUKKyAgICAgICAgICAgICAuY2hpbGRyZW4oc2VsZWN0b3JfdHJlZS5yb290X25vZGUoKSwga0ZvbGxvd2luZ1NpYmxpbmdDb21iaW5hdG9yKQorICAgICAgICAgICAgIC5zaXplKCkpOwogICBjb25zdCBTZWxlY3RvclRyZWU6Ok5vZGUqIG5vZGVfMSA9Ci0gICAgICBzZWxlY3Rvcl90cmVlLmNoaWxkcmVuKHNlbGVjdG9yX3RyZWUucm9vdCgpLCBrRGVzY2VuZGFudENvbWJpbmF0b3IpCisgICAgICBzZWxlY3Rvcl90cmVlLmNoaWxkcmVuKHNlbGVjdG9yX3RyZWUucm9vdF9ub2RlKCksIGtEZXNjZW5kYW50Q29tYmluYXRvcikKICAgICAgICAgICAuYmVnaW4oKQogICAgICAgICAgIC0+c2Vjb25kOwogICBBU1NFUlRfRVEoMSwgbm9kZV8xLT5ydWxlcygpLnNpemUoKSk7CkBAIC0yNDYsMTkgKzI1NiwyMSBAQAogICBiYXNlOjpWZXJzaW9uQ29tcGF0aWJpbGl0eTo6R2V0SW5zdGFuY2UoKS0+U2V0TWluaW11bVZlcnNpb24oMSk7CiAgIEVYUEVDVF9GQUxTRShzZWxlY3Rvcl90cmVlLlZhbGlkYXRlVmVyc2lvbkNvbXBhdGliaWxpdHkoKSk7CiAKLSAgQVNTRVJUX0VRKAotICAgICAgMCwgc2VsZWN0b3JfdHJlZS5jaGlsZHJlbihzZWxlY3Rvcl90cmVlLnJvb3QoKSwga0NoaWxkQ29tYmluYXRvcikuc2l6ZSgpKTsKLSAgQVNTRVJUX0VRKDIsCi0gICAgICAgICAgICBzZWxlY3Rvcl90cmVlLmNoaWxkcmVuKHNlbGVjdG9yX3RyZWUucm9vdCgpLCBrRGVzY2VuZGFudENvbWJpbmF0b3IpCi0gICAgICAgICAgICAgICAgLnNpemUoKSk7CiAgIEFTU0VSVF9FUSgwLAotICAgICAgICAgICAgc2VsZWN0b3JfdHJlZS5jaGlsZHJlbihzZWxlY3Rvcl90cmVlLnJvb3QoKSwga05leHRTaWJsaW5nQ29tYmluYXRvcikKKyAgICAgICAgICAgIHNlbGVjdG9yX3RyZWUuY2hpbGRyZW4oc2VsZWN0b3JfdHJlZS5yb290X25vZGUoKSwga0NoaWxkQ29tYmluYXRvcikKICAgICAgICAgICAgICAgICAuc2l6ZSgpKTsKLSAgQVNTRVJUX0VRKDAsIHNlbGVjdG9yX3RyZWUKLSAgICAgICAgICAgICAgICAgICAuY2hpbGRyZW4oc2VsZWN0b3JfdHJlZS5yb290KCksIGtGb2xsb3dpbmdTaWJsaW5nQ29tYmluYXRvcikKKyAgQVNTRVJUX0VRKDIsIHNlbGVjdG9yX3RyZWUKKyAgICAgICAgICAgICAgICAgICAuY2hpbGRyZW4oc2VsZWN0b3JfdHJlZS5yb290X25vZGUoKSwga0Rlc2NlbmRhbnRDb21iaW5hdG9yKQogICAgICAgICAgICAgICAgICAgIC5zaXplKCkpOworICBBU1NFUlRfRVEoMCwgc2VsZWN0b3JfdHJlZQorICAgICAgICAgICAgICAgICAgIC5jaGlsZHJlbihzZWxlY3Rvcl90cmVlLnJvb3Rfbm9kZSgpLCBrTmV4dFNpYmxpbmdDb21iaW5hdG9yKQorICAgICAgICAgICAgICAgICAgIC5zaXplKCkpOworICBBU1NFUlRfRVEoCisgICAgICAwLCBzZWxlY3Rvcl90cmVlCisgICAgICAgICAgICAgLmNoaWxkcmVuKHNlbGVjdG9yX3RyZWUucm9vdF9ub2RlKCksIGtGb2xsb3dpbmdTaWJsaW5nQ29tYmluYXRvcikKKyAgICAgICAgICAgICAuc2l6ZSgpKTsKICAgYXV0byBub2RlX2l0ZXIgPQotICAgICAgc2VsZWN0b3JfdHJlZS5jaGlsZHJlbihzZWxlY3Rvcl90cmVlLnJvb3QoKSwga0Rlc2NlbmRhbnRDb21iaW5hdG9yKQorICAgICAgc2VsZWN0b3JfdHJlZS5jaGlsZHJlbihzZWxlY3Rvcl90cmVlLnJvb3Rfbm9kZSgpLCBrRGVzY2VuZGFudENvbWJpbmF0b3IpCiAgICAgICAgICAgLmJlZ2luKCk7CiAgIGNvbnN0IFNlbGVjdG9yVHJlZTo6Tm9kZSogbm9kZV8xID0gbm9kZV9pdGVyLT5zZWNvbmQ7CiAgIEFTU0VSVF9FUSgxLCBub2RlXzEtPnJ1bGVzKCkuc2l6ZSgpKTsKQEAgLTI5NywxOSArMzA5LDIxIEBACiAgIGJhc2U6OlZlcnNpb25Db21wYXRpYmlsaXR5OjpHZXRJbnN0YW5jZSgpLT5TZXRNaW5pbXVtVmVyc2lvbigxKTsKICAgRVhQRUNUX1RSVUUoc2VsZWN0b3JfdHJlZS5WYWxpZGF0ZVZlcnNpb25Db21wYXRpYmlsaXR5KCkpOwogCi0gIEFTU0VSVF9FUSgKLSAgICAgIDAsIHNlbGVjdG9yX3RyZWUuY2hpbGRyZW4oc2VsZWN0b3JfdHJlZS5yb290KCksIGtDaGlsZENvbWJpbmF0b3IpLnNpemUoKSk7Ci0gIEFTU0VSVF9FUSgyLAotICAgICAgICAgICAgc2VsZWN0b3JfdHJlZS5jaGlsZHJlbihzZWxlY3Rvcl90cmVlLnJvb3QoKSwga0Rlc2NlbmRhbnRDb21iaW5hdG9yKQotICAgICAgICAgICAgICAgIC5zaXplKCkpOwogICBBU1NFUlRfRVEoMCwKLSAgICAgICAgICAgIHNlbGVjdG9yX3RyZWUuY2hpbGRyZW4oc2VsZWN0b3JfdHJlZS5yb290KCksIGtOZXh0U2libGluZ0NvbWJpbmF0b3IpCisgICAgICAgICAgICBzZWxlY3Rvcl90cmVlLmNoaWxkcmVuKHNlbGVjdG9yX3RyZWUucm9vdF9ub2RlKCksIGtDaGlsZENvbWJpbmF0b3IpCiAgICAgICAgICAgICAgICAgLnNpemUoKSk7Ci0gIEFTU0VSVF9FUSgwLCBzZWxlY3Rvcl90cmVlCi0gICAgICAgICAgICAgICAgICAgLmNoaWxkcmVuKHNlbGVjdG9yX3RyZWUucm9vdCgpLCBrRm9sbG93aW5nU2libGluZ0NvbWJpbmF0b3IpCisgIEFTU0VSVF9FUSgyLCBzZWxlY3Rvcl90cmVlCisgICAgICAgICAgICAgICAgICAgLmNoaWxkcmVuKHNlbGVjdG9yX3RyZWUucm9vdF9ub2RlKCksIGtEZXNjZW5kYW50Q29tYmluYXRvcikKICAgICAgICAgICAgICAgICAgICAuc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDAsIHNlbGVjdG9yX3RyZWUKKyAgICAgICAgICAgICAgICAgICAuY2hpbGRyZW4oc2VsZWN0b3JfdHJlZS5yb290X25vZGUoKSwga05leHRTaWJsaW5nQ29tYmluYXRvcikKKyAgICAgICAgICAgICAgICAgICAuc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKAorICAgICAgMCwgc2VsZWN0b3JfdHJlZQorICAgICAgICAgICAgIC5jaGlsZHJlbihzZWxlY3Rvcl90cmVlLnJvb3Rfbm9kZSgpLCBrRm9sbG93aW5nU2libGluZ0NvbWJpbmF0b3IpCisgICAgICAgICAgICAgLnNpemUoKSk7CiAgIGF1dG8gbm9kZV9pdGVyID0KLSAgICAgIHNlbGVjdG9yX3RyZWUuY2hpbGRyZW4oc2VsZWN0b3JfdHJlZS5yb290KCksIGtEZXNjZW5kYW50Q29tYmluYXRvcikKKyAgICAgIHNlbGVjdG9yX3RyZWUuY2hpbGRyZW4oc2VsZWN0b3JfdHJlZS5yb290X25vZGUoKSwga0Rlc2NlbmRhbnRDb21iaW5hdG9yKQogICAgICAgICAgIC5iZWdpbigpOwogICBjb25zdCBTZWxlY3RvclRyZWU6Ok5vZGUqIG5vZGVfMSA9IG5vZGVfaXRlci0+c2Vjb25kOwogICBBU1NFUlRfRVEoMSwgbm9kZV8xLT5ydWxlcygpLnNpemUoKSk7CkBAIC0zNDcsMTkgKzM2MSwyMSBAQAogICBiYXNlOjpWZXJzaW9uQ29tcGF0aWJpbGl0eTo6R2V0SW5zdGFuY2UoKS0+U2V0TWluaW11bVZlcnNpb24oMSk7CiAgIEVYUEVDVF9UUlVFKHNlbGVjdG9yX3RyZWUuVmFsaWRhdGVWZXJzaW9uQ29tcGF0aWJpbGl0eSgpKTsKIAotICBBU1NFUlRfRVEoCi0gICAgICAwLCBzZWxlY3Rvcl90cmVlLmNoaWxkcmVuKHNlbGVjdG9yX3RyZWUucm9vdCgpLCBrQ2hpbGRDb21iaW5hdG9yKS5zaXplKCkpOwotICBBU1NFUlRfRVEoMSwKLSAgICAgICAgICAgIHNlbGVjdG9yX3RyZWUuY2hpbGRyZW4oc2VsZWN0b3JfdHJlZS5yb290KCksIGtEZXNjZW5kYW50Q29tYmluYXRvcikKLSAgICAgICAgICAgICAgICAuc2l6ZSgpKTsKICAgQVNTRVJUX0VRKDAsCi0gICAgICAgICAgICBzZWxlY3Rvcl90cmVlLmNoaWxkcmVuKHNlbGVjdG9yX3RyZWUucm9vdCgpLCBrTmV4dFNpYmxpbmdDb21iaW5hdG9yKQorICAgICAgICAgICAgc2VsZWN0b3JfdHJlZS5jaGlsZHJlbihzZWxlY3Rvcl90cmVlLnJvb3Rfbm9kZSgpLCBrQ2hpbGRDb21iaW5hdG9yKQogICAgICAgICAgICAgICAgIC5zaXplKCkpOwotICBBU1NFUlRfRVEoMCwgc2VsZWN0b3JfdHJlZQotICAgICAgICAgICAgICAgICAgIC5jaGlsZHJlbihzZWxlY3Rvcl90cmVlLnJvb3QoKSwga0ZvbGxvd2luZ1NpYmxpbmdDb21iaW5hdG9yKQorICBBU1NFUlRfRVEoMSwgc2VsZWN0b3JfdHJlZQorICAgICAgICAgICAgICAgICAgIC5jaGlsZHJlbihzZWxlY3Rvcl90cmVlLnJvb3Rfbm9kZSgpLCBrRGVzY2VuZGFudENvbWJpbmF0b3IpCiAgICAgICAgICAgICAgICAgICAgLnNpemUoKSk7CisgIEFTU0VSVF9FUSgwLCBzZWxlY3Rvcl90cmVlCisgICAgICAgICAgICAgICAgICAgLmNoaWxkcmVuKHNlbGVjdG9yX3RyZWUucm9vdF9ub2RlKCksIGtOZXh0U2libGluZ0NvbWJpbmF0b3IpCisgICAgICAgICAgICAgICAgICAgLnNpemUoKSk7CisgIEFTU0VSVF9FUSgKKyAgICAgIDAsIHNlbGVjdG9yX3RyZWUKKyAgICAgICAgICAgICAuY2hpbGRyZW4oc2VsZWN0b3JfdHJlZS5yb290X25vZGUoKSwga0ZvbGxvd2luZ1NpYmxpbmdDb21iaW5hdG9yKQorICAgICAgICAgICAgIC5zaXplKCkpOwogICBjb25zdCBTZWxlY3RvclRyZWU6Ok5vZGUqIG5vZGVfMSA9Ci0gICAgICBzZWxlY3Rvcl90cmVlLmNoaWxkcmVuKHNlbGVjdG9yX3RyZWUucm9vdCgpLCBrRGVzY2VuZGFudENvbWJpbmF0b3IpCisgICAgICBzZWxlY3Rvcl90cmVlLmNoaWxkcmVuKHNlbGVjdG9yX3RyZWUucm9vdF9ub2RlKCksIGtEZXNjZW5kYW50Q29tYmluYXRvcikKICAgICAgICAgICAuYmVnaW4oKQogICAgICAgICAgIC0+c2Vjb25kOwogICBBU1NFUlRfRVEoMiwgbm9kZV8xLT5ydWxlcygpLnNpemUoKSk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RlYnVnL2RlYnVnX3dlYl9zZXJ2ZXIuY2MgYi9zcmMvY29iYWx0L2RlYnVnL2RlYnVnX3dlYl9zZXJ2ZXIuY2MKaW5kZXggYjg3YTVmZS4uNjc0OTY5MCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kZWJ1Zy9kZWJ1Z193ZWJfc2VydmVyLmNjCisrKyBiL3NyYy9jb2JhbHQvZGVidWcvZGVidWdfd2ViX3NlcnZlci5jYwpAQCAtMTY5LDYgKzE2OSwxMSBAQAogCiAgIC8vIENvbnN0cnVjdCB0aGUgbG9jYWwgZGlzayBwYXRoIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlcXVlc3QgcGF0aC4KICAgRmlsZVBhdGggZmlsZV9wYXRoKGNvbnRlbnRfcm9vdF9kaXJfKTsKKyAgaWYgKCFJc1N0cmluZ0FTQ0lJKHVybF9wYXRoKSkgeworICAgIExPRyhXQVJOSU5HKSA8PCAiR290IEhUVFAgcmVxdWVzdCB3aXRoIG5vbi1BU0NJSSBVUkwgcGF0aC4iOworICAgIHNlcnZlcl8tPlNlbmQ0MDQoY29ubmVjdGlvbl9pZCk7CisgICAgcmV0dXJuOworICB9CiAgIGZpbGVfcGF0aCA9IGZpbGVfcGF0aC5BcHBlbmRBU0NJSSh1cmxfcGF0aCk7CiAKICAgLy8gSWYgdGhlIGRpc2sgcGF0aCBpcyBhIGRpcmVjdG9yeSwgbG9vayBmb3IgYW4gaW5kZXggZmlsZS4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9jL3BlcmZvcm1hbmNlX3R1bmluZy5tZCBiL3NyYy9jb2JhbHQvZG9jL3BlcmZvcm1hbmNlX3R1bmluZy5tZAppbmRleCBhMTQyMDI4Li5hM2FhMjMyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvYy9wZXJmb3JtYW5jZV90dW5pbmcubWQKKysrIGIvc3JjL2NvYmFsdC9kb2MvcGVyZm9ybWFuY2VfdHVuaW5nLm1kCkBAIC0xMiw3ICsxMiw5IEBACiAKIE1hbnkgb2YgdGhlIHR3ZWFrcyBpbnZvbHZlIGFkZGluZyBhIG5ldyBneXAgdmFyaWFibGUgdG8geW91ciBwbGF0Zm9ybSdzCiBgZ3lwX2NvbmZpZ3VyYXRpb24uZ3lwaWAgZmlsZS4gIFRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlc2UgdmFyaWFibGVzIGFyZQotZGVmaW5lZCBpbiBbYGJhc2UuZ3lwaWBdKC4uL2J1aWxkL2NvbmZpZy9iYXNlLmd5cGkpLgorZGVmaW5lZCBpbiBlaXRoZXIKK1tgYmFzZV9jb25maWd1cmF0aW9uLmd5cGlgXSguLi8uLi9zdGFyYm9hcmQvYnVpbGQvYmFzZV9jb25maWd1cmF0aW9uLmd5cGkpIG9yCitbYGNvYmFsdF9jb25maWd1cmF0aW9uLmd5cGlgXSguLi9idWlsZC9jb2JhbHRfY29uZmlndXJhdGlvbi5neXBpKS4KIAogIyMjIFVzZSBhIFJlbGVhc2UgQnVpbGQKIApAQCAtMTgyLDcgKzE4NCw4IEBACiAKICMjIyBUcnkgZW5hYmxpbmcgcmVuZGVyaW5nIG9ubHkgdG8gcmVnaW9ucyB0aGF0IGNoYW5nZQogCi1JZiB5b3Ugc2V0IHRoZSBbYGJhc2UuZ3lwaWBdKC4uL2J1aWxkL2NvbmZpZy9iYXNlLmd5cGkpIHZhcmlhYmxlLAorSWYgeW91IHNldCB0aGUKK1tgY29iYWx0X2NvbmZpZ3VyYXRpb24uZ3lwaWBdKC4uL2J1aWxkL2NvYmFsdF9jb25maWd1cmF0aW9uLmd5cGkpIHZhcmlhYmxlLAogYHJlbmRlcl9kaXJ0eV9yZWdpb25fb25seWAgdG8gYDFgLCB0aGVuIENvYmFsdCB3aWxsIGludm9rZSBsb2dpYyB0byBkZXRlY3Qgd2hpY2gKIHBhcnQgb2YgdGhlIGZyYW1lIGhhcyBiZWVuIGFmZmVjdGVkIGJ5IGFuaW1hdGlvbnMgYW5kIGNhbiBiZSBjb25maWd1cmVkIHRvIG9ubHkKIHJlbmRlciB0byB0aGF0IHJlZ2lvbi4gIEhvd2V2ZXIsIHRoaXMgZmVhdHVyZSByZXF1aXJlcyBzdXBwb3J0IGZyb20gdGhlIGRyaXZlcgpAQCAtMjMyLDExICsyMzUsMTcgQEAKIGZsYWdzIHdpbGwgY2Fycnkgb3ZlciBmcm9tIGV4dGVybmFsIHNoZWxsIGVudmlyb25tZW50IHNldHRpbmdzOyB0aGV5CiBtdXN0IGJlIHNldCBleHBsaWNpdGx5IGluIGBneXBfY29uZmlndXJhdGlvbi5neXBpYC4KIAorKipUYWdzOioqICpmcmFtZXJhdGUsIHN0YXJ0dXAsIGJyb3dzZS10by13YXRjaCwgaW5wdXQgbGF0ZW5jeSoKKworCiAjIyMjIExpbmsgVGltZSBPcHRpbWl6YXRpb24gKExUTykKIElmIHlvdXIgdG9vbGNoYWluIHN1cHBvcnRzIGl0LCBpdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlvdSBlbmFibGUgdGhlIExUTwogb3B0aW1pemF0aW9uLCBhcyBpdCBoYXMgYmVlbiByZXBvcnRlZCB0byB5aWVsZCBzaWduaWZpY2FudCBwZXJmb3JtYW5jZQogaW1wcm92ZW1lbnRzIGluIG1hbnkgaGlnaCBwcm9maWxlIHByb2plY3RzLgogCisqKlRhZ3M6KiogKmZyYW1lcmF0ZSwgc3RhcnR1cCwgYnJvd3NlLXRvLXdhdGNoLCBpbnB1dCBsYXRlbmN5KgorCisKICMjIyMgVGhlIEdDQyAnLW1wbHQnIGZsYWcgZm9yIE1JUFMgYXJjaGl0ZWN0dXJlcwogVGhlICctbXBsdCcgZmxhZyBoYXMgYmVlbiBmb3VuZCB0byBpbXByb3ZlIGFsbCBhcm91bmQgcGVyZm9ybWFuY2UgYnkKIH4yMCUgb24gTUlQUyBhcmNoaXRlY3R1cmUgcGxhdGZvcm1zLiAgSWYgeW91ciBwbGF0Zm9ybSBoYXMgYSBNSVBTCkBAIC0zMDUsNiArMzE0LDE5IEBACiAqKlRhZ3M6KiogKmNvbmZpZ3VyYXRpb25fcHVibGljLmgsIGNwdSBtZW1vcnkuKgogCiAKKyMjIyBBZGp1c3QgbWVkaWEgYnVmZmVyIHNpemUgc2V0dGluZ3MKKworTWFueSBvZiB0aGUgcGFyYW1ldGVycyBhcm91bmQgbWVkaWEgYnVmZmVyIGFsbG9jYXRpb24gY2FuIGJlIGFkanVzdGVkIGluIHlvdXIKK2d5cF9jb25maWd1cmF0aW9uLmd5cGkgZmlsZS4gIFRoZSB2YXJpYWJsZXMgaW4gcXVlc3Rpb24gYXJlIHRoZSBmYW1pbHkgb2YKK2Bjb2JhbHRfbWVkaWFfKmAgdmFyaWFibGVzLCB3aG9zZSBkZWZhdWx0IHZhbHVlcyBhcmUgc3BlY2lmaWVkIGluCitbYGNvYmFsdF9jb25maWd1cmF0aW9uLmd5cGlgXSguLi9idWlsZC9jb2JhbHRfY29uZmlndXJhdGlvbi5neXBpKS4gIEluCitwYXJ0aWN1bGFyLCBpZiB5b3VyIG1heGltdW0gdmlkZW8gb3V0cHV0IHJlc29sdXRpb24gaXMgbGVzcyB0aGFuIDEwODAsIHRoZW4geW91CittYXkgbG93ZXIgdGhlIGJ1ZGdldHMgZm9yIG1hbnkgb2YgdGhlIGNhdGVnb3JpZXMgYWNjb3JkaW5nIHRvIHlvdXIgbWF4aW11bQorcmVzb2x1dGlvbi4KKworKipUYWdzOioqICpjcHUgbWVtb3J5KgorCisKICMjIyBBdm9pZCB1c2luZyBhIHRoZSBZb3VUdWJlIHdlYiBhcHAgRlBTIGNvdW50ZXIgKGkuZS4gIj9mcHM9MSIpCiAKIFRoZSBZb3VUdWJlIHdlYiBhcHAgaXMgYWJsZSB0byBkaXNwbGF5IGEgRnJhbWVzIFBlciBTZWNvbmQgKEZQUykgY291bnRlciBpbiB0aGUKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2Jhc2U2NC5jYyBiL3NyYy9jb2JhbHQvZG9tL2Jhc2U2NC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDczMThjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vYmFzZTY0LmNjCkBAIC0wLDAgKzEsMTUwIEBACisvLyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiY29iYWx0L2RvbS9iYXNlNjQuaCIKKworI2luY2x1ZGUgImJhc2UvYmFzZTY0LmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGRvbSB7CisKK25hbWVzcGFjZSB7CisvLyBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jYXNjaWktd2hpdGVzcGFjZQorY29uc3QgY2hhciBrQXNjaWlXaGl0ZXNwYWNlW10gPSB7MHgwOSwgMHgwYSwgMHgwYywgMHgwZCwgMHgyMH07CisKK2Jvb2wgSXNBdG9iQWxsb3dlZENoYXIoY2hhciBjKSB7CisgIC8vIGF0b2IoKSBhbGxvd3MgJysnLCAnLycsIGFuZCBBU0NJSSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4KKyAgLy8gaHR0cHM6Ly9pbmZyYS5zcGVjLndoYXR3Zy5vcmcvI2ZvcmdpdmluZy1iYXNlNjQtZGVjb2RlCisgIGlmIChjID09ICcrJykgeworICAgIHJldHVybiB0cnVlOworICB9CisgIGlmIChjIDwgJy8nKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChjIDw9ICc5JykgeworICAgIHJldHVybiB0cnVlOworICB9CisgIGlmIChjIDwgJ0EnKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChjIDw9ICdaJykgeworICAgIHJldHVybiB0cnVlOworICB9CisgIGlmIChjIDwgJ2EnKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChjIDw9ICd6JykgeworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBJc05vdEFzY2lpV2hpdGVzcGFjZShjaGFyIGMpIHsKKyAgZm9yIChjaGFyIHNwX2NoYXIgOiBrQXNjaWlXaGl0ZXNwYWNlKSB7CisgICAgaWYgKGMgPT0gc3BfY2hhcikgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworYmFzZTo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+IEdldEF0b2JBbGxvd2VkU3RyKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnB1dF9zdHIpIHsKKyAgLy8gT3VyIGJhc2U2NCBkZWNvZGluZyBtZXRob2QgZG9lcyBub3QgY2hlY2sgZm9yIGZvcmJpZGRlbiBjaGFyYWN0ZXJzLiBXZSB1c2UKKyAgLy8gdGhlIGZvbGxvd2luZyBtZXRob2QgdG8gcmVqZWN0IHN0cmluZyBjb250YWluaW5nIGRpc2FsbG93ZWQgY2hhcmFjdGVyIG9yCisgIC8vIGZvcm1hdCBpbiBhdG9iKCkuCisgIC8vIFN0ZXAgMS00IG9mIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNmb3JnaXZpbmctYmFzZTY0LWRlY29kZQorICBzdGQ6OnN0cmluZyBvdXRwdXRfc3RyOworICAvLyBTdGVwIDE6IFJlbW92ZSBhbGwgQVNDSUkgd2hpdGVzcGFjZSBmcm9tIGRhdGEuCisgIHN0ZDo6Y29weV9pZihpbnB1dF9zdHIuYmVnaW4oKSwgaW5wdXRfc3RyLmVuZCgpLAorICAgICAgICAgICAgICAgc3RkOjpiYWNrX2luc2VydGVyKG91dHB1dF9zdHIpLCBJc05vdEFzY2lpV2hpdGVzcGFjZSk7CisgIC8vIFN0ZXAgMjogSWYgZGF0YSdzIGxlbmd0aCBkaXZpZGVzIGJ5IDQgbGVhdmluZyBubyByZW1haW5kZXIsIHRoZW46CisgIC8vICAgICAgICAxLiBpZiBkYXRhIGVuZHMgd2l0aCBvbmUgb3IgdHdvIFUrMDAzRCAoPSkgY29kZSBwb2ludHMsIHRoZW4KKyAgLy8gICAgICAgICAgIHJlbW92ZSB0aGVtIGZyb20gZGF0YS4KKyAgaWYgKCFvdXRwdXRfc3RyLmVtcHR5KCkgJiYgb3V0cHV0X3N0ci5sZW5ndGgoKSAlIDQgPT0gMCAmJgorICAgICAgb3V0cHV0X3N0ci5iYWNrKCkgPT0gJz0nKSB7CisgICAgb3V0cHV0X3N0ci5wb3BfYmFjaygpOworICAgIGlmIChvdXRwdXRfc3RyLmJhY2soKSA9PSAnPScpIHsKKyAgICAgIG91dHB1dF9zdHIucG9wX2JhY2soKTsKKyAgICB9CisgIH0KKyAgLy8gU3RlcCAzOiBJZiBkYXRhJ3MgbGVuZ3RoIGRpdmlkZXMgYnkgNCBsZWF2aW5nIGEgcmVtYWluZGVyIG9mIDEsIHJldHVybgorICAvLyBmYWlsdXJlLgorICBpZiAob3V0cHV0X3N0ci5sZW5ndGgoKSAlIDQgPT0gMSkgeworICAgIHJldHVybiBiYXNlOjpudWxsb3B0OworICB9CisgIC8vIFN0ZXAgNDogSWYgZGF0YSBjb250YWlucyBhIGNvZGUgcG9pbnQgdGhhdCBpcyBub3QgYWxsb3dlZCwgcmV0dXJuIGZhaWx1cmUuCisgIGZvciAoY2hhciBjdXJyZW50X2NoYXIgOiBvdXRwdXRfc3RyKSB7CisgICAgaWYgKCFJc0F0b2JBbGxvd2VkQ2hhcihjdXJyZW50X2NoYXIpKSB7CisgICAgICByZXR1cm4gYmFzZTo6bnVsbG9wdDsKKyAgICB9CisgIH0KKyAgLy8gQ3VzdG9taXplZCBzdGVwOiBhZGQgcGFkZGluZyB0byBzdHJpbmcgbGVzcyB0aGFuIDQgY2hhcmFjdGVyLgorICBmb3IgKHNpemVfdCBpID0gb3V0cHV0X3N0ci5sZW5ndGgoKSAlIDQ7IGkgPiAxICYmIGkgPCA0OyBpKyspIHsKKyAgICBvdXRwdXRfc3RyLnB1c2hfYmFjaygnPScpOworICB9CisgIHJldHVybiBvdXRwdXRfc3RyOworfQorCitiYXNlOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4gVXRmOFRvTGF0aW4xKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnB1dCkgeworICBzdGQ6OnN0cmluZyBvdXRwdXQ7CisgIHVuc2lnbmVkIGNoYXIgY3VycmVudF9jaGFyX3JlbWFpbmRlciA9IDB4MDA7CisgIGZvciAodW5zaWduZWQgY2hhciBjIDogaW5wdXQpIHsKKyAgICBpZiAoYyA8PSAweDdmICYmICFjdXJyZW50X2NoYXJfcmVtYWluZGVyKSB7CisgICAgICBvdXRwdXQucHVzaF9iYWNrKGMpOworICAgIH0gZWxzZSBpZiAoYyA8PSAweGJmICYmIGN1cnJlbnRfY2hhcl9yZW1haW5kZXIpIHsKKyAgICAgIC8vIFRoaXMgaXMgdGhlIG9ubHkgYnl0ZSBvciBzZWNvbmQgYnl0ZSBvZiBvbmUgY2hhcmFjdGVyLgorICAgICAgb3V0cHV0LnB1c2hfYmFjayhjdXJyZW50X2NoYXJfcmVtYWluZGVyIHwgKGMgJiAweDNmKSk7CisgICAgICBjdXJyZW50X2NoYXJfcmVtYWluZGVyID0gMHgwMDsKKyAgICB9IGVsc2UgaWYgKGMgPT0gMHhjMiAmJiAhY3VycmVudF9jaGFyX3JlbWFpbmRlcikgeworICAgICAgY3VycmVudF9jaGFyX3JlbWFpbmRlciA9IGMgJiAweDgwOworICAgIH0gZWxzZSBpZiAoYyA9PSAweGMzICYmICFjdXJyZW50X2NoYXJfcmVtYWluZGVyKSB7CisgICAgICBjdXJyZW50X2NoYXJfcmVtYWluZGVyID0gMHhjMDsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGJhc2U6Om51bGxvcHQ7CisgICAgfQorICB9CisgIHJldHVybiBvdXRwdXQ7Cit9Cit9ICAvLyBuYW1lc3BhY2UKKworYmFzZTo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+IEZvcmdpdmluZ0Jhc2U2NEVuY29kZSgKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgc3RyaW5nX3RvX2VuY29kZSkgeworICAvLyBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jZm9yZ2l2aW5nLWJhc2U2NC1lbmNvZGUKKyAgYXV0byBtYXliZV9zdHJpbmdfdG9fZW5jb2RlX2luX2xhdGluMSA9IFV0ZjhUb0xhdGluMShzdHJpbmdfdG9fZW5jb2RlKTsKKyAgc3RkOjpzdHJpbmcgb3V0cHV0OworICBpZiAoIW1heWJlX3N0cmluZ190b19lbmNvZGVfaW5fbGF0aW4xIHx8CisgICAgICAhYmFzZTo6QmFzZTY0RW5jb2RlKCptYXliZV9zdHJpbmdfdG9fZW5jb2RlX2luX2xhdGluMSwgJm91dHB1dCkpIHsKKyAgICByZXR1cm4gYmFzZTo6bnVsbG9wdDsKKyAgfQorICByZXR1cm4gb3V0cHV0OworfQorCitiYXNlOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gRm9yZ2l2aW5nQmFzZTY0RGVjb2RlKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBlbmNvZGVkX3N0cmluZykgeworICAvLyBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jZm9yZ2l2aW5nLWJhc2U2NC1kZWNvZGUKKyAgLy8gU3RlcCAxLTQ6CisgIGF1dG8gbWF5YmVfZW5jb2RlZF9zdHJpbmdfbm9fd2hpdGVzcGFjZSA9IEdldEF0b2JBbGxvd2VkU3RyKGVuY29kZWRfc3RyaW5nKTsKKyAgLy8gU3RlcCA1LTEwOgorICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBvdXRwdXQ7CisgIC8vIElmIGlucHV0IHN0cmluZyBmb3JtYXQgaXMgbm90IGFsbG93ZWQgb3IgYmFzZTY0IGVuY29kaW5nIGZhaWxlZCwgcmV0dXJuCisgIC8vIG51bGxvcHQgdG8gc2lnbmFsIGZhaWx1cmUuCisgIGlmICghbWF5YmVfZW5jb2RlZF9zdHJpbmdfbm9fd2hpdGVzcGFjZSB8fAorICAgICAgIWJhc2U6OkJhc2U2NERlY29kZSgqbWF5YmVfZW5jb2RlZF9zdHJpbmdfbm9fd2hpdGVzcGFjZSwgJm91dHB1dCkpIHsKKyAgICByZXR1cm4gYmFzZTo6bnVsbG9wdDsKKyAgfQorICByZXR1cm4gb3V0cHV0OworfQorCit9ICAvLyBuYW1lc3BhY2UgZG9tCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9iYXNlNjQuaCBiL3NyYy9jb2JhbHQvZG9tL2Jhc2U2NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNDZkMzQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS9iYXNlNjQuaApAQCAtMCwwICsxLDM3IEBACisvLyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaWZuZGVmIENPQkFMVF9ET01fQkFTRTY0X0hfCisjZGVmaW5lIENPQkFMVF9ET01fQkFTRTY0X0hfCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiYmFzZS9vcHRpb25hbC5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBkb20geworCisvLyBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jZm9yZ2l2aW5nLWJhc2U2NC1lbmNvZGUKK2Jhc2U6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiBGb3JnaXZpbmdCYXNlNjRFbmNvZGUoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHN0cmluZ190b19lbmNvZGUpOworCisvLyBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jZm9yZ2l2aW5nLWJhc2U2NC1kZWNvZGUKK2Jhc2U6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBGb3JnaXZpbmdCYXNlNjREZWNvZGUoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGVuY29kZWRfc3RyaW5nKTsKKworfSAgLy8gbmFtZXNwYWNlIGRvbQorfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIENPQkFMVF9ET01fQkFTRTY0X0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9ibG9iLmNjIGIvc3JjL2NvYmFsdC9kb20vYmxvYi5jYwppbmRleCBjYmNiMDM5Li5lNDQ4Y2Y4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9ibG9iLmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL2Jsb2IuY2MKQEAgLTcyLDE5ICs3MiwyMiBAQAogLy8gc28gdGhlIG1lZGlhIHR5cGUgY2FuIGJlIGV4cG9zZWQgYW5kIHVzZWQsIGFzIGRlc2NyaWJlZCBpbjoKIC8vICAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9GaWxlQVBJLyNjb25zdHJ1Y3RvckJsb2IKIEJsb2I6OkJsb2Ioc2NyaXB0OjpFbnZpcm9ubWVudFNldHRpbmdzKiBzZXR0aW5ncywKLSAgICAgICAgICAgc2NyaXB0OjpTZXF1ZW5jZTxCbG9iUGFydD4gYmxvYlBhcnRzLCBjb25zdCBCbG9iUHJvcGVydHlCYWcmIG9wdGlvbnMpCisgICAgICAgICAgIGNvbnN0IHNjcmlwdDo6U2VxdWVuY2U8QmxvYlBhcnQ+JiBibG9iX3BhcnRzLAorICAgICAgICAgICBjb25zdCBCbG9iUHJvcGVydHlCYWcmIG9wdGlvbnMpCiAgICAgOiBidWZmZXJfKG5ldyBBcnJheUJ1ZmZlcihzZXR0aW5ncywgMCkpLCB0eXBlXyhvcHRpb25zLnR5cGUoKSkgewogICBzaXplX3QgYnl0ZV9sZW5ndGggPSAwOwotICBmb3IgKHNjcmlwdDo6U2VxdWVuY2U8QmxvYlBhcnQ+OjpzaXplX3R5cGUgaSA9IDA7IGkgPCBibG9iUGFydHMuc2l6ZSgpOyBpKyspIHsKLSAgICBieXRlX2xlbmd0aCArPSBEYXRhTGVuZ3RoKGJsb2JQYXJ0cy5hdChpKSk7CisgIGZvciAoc2NyaXB0OjpTZXF1ZW5jZTxCbG9iUGFydD46OnNpemVfdHlwZSBpID0gMDsgaSA8IGJsb2JfcGFydHMuc2l6ZSgpOworICAgICAgICsraSkgeworICAgIGJ5dGVfbGVuZ3RoICs9IERhdGFMZW5ndGgoYmxvYl9wYXJ0cy5hdChpKSk7CiAgIH0KICAgYnVmZmVyXyA9IG5ldyBBcnJheUJ1ZmZlcihzZXR0aW5ncywgc3RhdGljX2Nhc3Q8dWludDMyPihieXRlX2xlbmd0aCkpOwogCiAgIHVpbnQ4KiBkZXN0aW5hdGlvbiA9IGJ1ZmZlcl8tPmRhdGEoKTsKICAgc2l6ZV90IG9mZnNldCA9IDA7Ci0gIGZvciAoc2NyaXB0OjpTZXF1ZW5jZTxCbG9iUGFydD46OnNpemVfdHlwZSBpID0gMDsgaSA8IGJsb2JQYXJ0cy5zaXplKCk7IGkrKykgewotICAgIGNvbnN0IHVpbnQ4KiBzb3VyY2UgPSBEYXRhU3RhcnQoYmxvYlBhcnRzLmF0KGkpKTsKLSAgICB1aW50NjQgY291bnQgPSBEYXRhTGVuZ3RoKGJsb2JQYXJ0cy5hdChpKSk7CisgIGZvciAoc2NyaXB0OjpTZXF1ZW5jZTxCbG9iUGFydD46OnNpemVfdHlwZSBpID0gMDsgaSA8IGJsb2JfcGFydHMuc2l6ZSgpOworICAgICAgICsraSkgeworICAgIGNvbnN0IHVpbnQ4KiBzb3VyY2UgPSBEYXRhU3RhcnQoYmxvYl9wYXJ0cy5hdChpKSk7CisgICAgdWludDY0IGNvdW50ID0gRGF0YUxlbmd0aChibG9iX3BhcnRzLmF0KGkpKTsKIAogICAgIHN0ZDo6Y29weShzb3VyY2UsIHNvdXJjZSArIGNvdW50LCBkZXN0aW5hdGlvbiArIG9mZnNldCk7CiAgICAgb2Zmc2V0ICs9IGNvdW50OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vYmxvYi5oIGIvc3JjL2NvYmFsdC9kb20vYmxvYi5oCmluZGV4IGMzOGUwYTMuLjU3N2Y4OTggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2Jsb2IuaAorKysgYi9zcmMvY29iYWx0L2RvbS9ibG9iLmgKQEAgLTUyLDcgKzUyLDcgQEAKICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPEFycmF5QnVmZmVyPiYgYnVmZmVyID0gTlVMTCk7CiAKICAgQmxvYihzY3JpcHQ6OkVudmlyb25tZW50U2V0dGluZ3MqIHNldHRpbmdzLAotICAgICAgIHNjcmlwdDo6U2VxdWVuY2U8QmxvYlBhcnQ+IGJsb2JfcGFydHMsCisgICAgICAgY29uc3Qgc2NyaXB0OjpTZXF1ZW5jZTxCbG9iUGFydD4mIGJsb2JfcGFydHMsCiAgICAgICAgY29uc3QgQmxvYlByb3BlcnR5QmFnJiBvcHRpb25zID0gRW1wdHlCbG9iUHJvcGVydHlCYWcoKSk7CiAKICAgY29uc3QgdWludDgqIGRhdGEoKSB7IHJldHVybiBidWZmZXJfLT5kYXRhKCk7IH0KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2N1c3RvbV9ldmVudF90ZXN0LmNjIGIvc3JjL2NvYmFsdC9kb20vY3VzdG9tX2V2ZW50X3Rlc3QuY2MKaW5kZXggY2JkYzc5ZC4uY2ZjMTU2OSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vY3VzdG9tX2V2ZW50X3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vY3VzdG9tX2V2ZW50X3Rlc3QuY2MKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlICJiYXNlL2JpbmQuaCIKICNpbmNsdWRlICJiYXNlL2NhbGxiYWNrLmgiCiAjaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgorI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3BsYXRmb3JtX3RocmVhZC5oIgogI2luY2x1ZGUgImNvYmFsdC9jc3NfcGFyc2VyL3BhcnNlci5oIgogI2luY2x1ZGUgImNvYmFsdC9kb20vY3VzdG9tX2V2ZW50X2luaXQuaCIKICNpbmNsdWRlICJjb2JhbHQvZG9tL2xvY2FsX3N0b3JhZ2VfZGF0YWJhc2UuaCIKQEAgLTI2LDYgKzI3LDcgQEAKICNpbmNsdWRlICJjb2JhbHQvZG9tL3dpbmRvdy5oIgogI2luY2x1ZGUgImNvYmFsdC9kb21fcGFyc2VyL3BhcnNlci5oIgogI2luY2x1ZGUgImNvYmFsdC9sb2FkZXIvZmV0Y2hlcl9mYWN0b3J5LmgiCisjaW5jbHVkZSAiY29iYWx0L2xvYWRlci9sb2FkZXJfZmFjdG9yeS5oIgogI2luY2x1ZGUgImNvYmFsdC9tZWRpYV9zZXNzaW9uL21lZGlhX3Nlc3Npb24uaCIKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvamF2YXNjcmlwdF9lbmdpbmUuaCIKQEAgLTU2LDI2ICs1OCwyOCBAQAogICAgICAgICBjc3NfcGFyc2VyXyhjc3NfcGFyc2VyOjpQYXJzZXI6OkNyZWF0ZSgpKSwKICAgICAgICAgZG9tX3BhcnNlcl8obmV3IGRvbV9wYXJzZXI6OlBhcnNlcihtb2NrX2Vycm9yX2NhbGxiYWNrXykpLAogICAgICAgICBmZXRjaGVyX2ZhY3RvcnlfKG5ldyBsb2FkZXI6OkZldGNoZXJGYWN0b3J5KE5VTEwpKSwKKyAgICAgICAgbG9hZGVyX2ZhY3RvcnlfKG5ldyBsb2FkZXI6OkxvYWRlckZhY3RvcnkoCisgICAgICAgICAgICBmZXRjaGVyX2ZhY3RvcnlfLmdldCgpLCBOVUxMLCBiYXNlOjprVGhyZWFkUHJpb3JpdHlfRGVmYXVsdCkpLAogICAgICAgICBsb2NhbF9zdG9yYWdlX2RhdGFiYXNlXyhOVUxMKSwKLSAgICAgICAgdXJsXygiYWJvdXQ6YmxhbmsiKSwKLSAgICAgICAgd2luZG93XyhuZXcgV2luZG93KAotICAgICAgICAgICAgMTkyMCwgMTA4MCwgMS5mLCBiYXNlOjprQXBwbGljYXRpb25TdGF0ZVN0YXJ0ZWQsIGNzc19wYXJzZXJfLmdldCgpLAotICAgICAgICAgICAgZG9tX3BhcnNlcl8uZ2V0KCksIGZldGNoZXJfZmFjdG9yeV8uZ2V0KCksIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCi0gICAgICAgICAgICBOVUxMLCBOVUxMLCAmbG9jYWxfc3RvcmFnZV9kYXRhYmFzZV8sIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCi0gICAgICAgICAgICBOVUxMLCBOVUxMLCB1cmxfLCAiIiwgImVuLVVTIiwgImVuIiwKLSAgICAgICAgICAgIGJhc2U6OkNhbGxiYWNrPHZvaWQoY29uc3QgR1VSTCYpPigpLAotICAgICAgICAgICAgYmFzZTo6QmluZCgmTW9ja0Vycm9yQ2FsbGJhY2s6OlJ1biwKLSAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCgmbW9ja19lcnJvcl9jYWxsYmFja18pKSwKLSAgICAgICAgICAgIE5VTEwsIG5ldHdvcmtfYnJpZGdlOjpQb3N0U2VuZGVyKCksIGNzcDo6a0NTUFJlcXVpcmVkLAotICAgICAgICAgICAga0NzcEVuZm9yY2VtZW50RW5hYmxlLCBiYXNlOjpDbG9zdXJlKCkgLyogY3NwX3BvbGljeV9jaGFuZ2VkICovLAotICAgICAgICAgICAgYmFzZTo6Q2xvc3VyZSgpIC8qIHJhbl9hbmltYXRpb25fZnJhbWVfY2FsbGJhY2tzICovLAotICAgICAgICAgICAgZG9tOjpXaW5kb3c6OkNsb3NlQ2FsbGJhY2soKSAvKiB3aW5kb3dfY2xvc2UgKi8sCi0gICAgICAgICAgICBiYXNlOjpDbG9zdXJlKCkgLyogd2luZG93X21pbmltaXplICovLCBOVUxMLCBOVUxMLCBOVUxMLAotICAgICAgICAgICAgZG9tOjpXaW5kb3c6Ok9uU3RhcnREaXNwYXRjaEV2ZW50Q2FsbGJhY2soKSwKLSAgICAgICAgICAgIGRvbTo6V2luZG93OjpPblN0b3BEaXNwYXRjaEV2ZW50Q2FsbGJhY2soKSwKLSAgICAgICAgICAgIGRvbTo6U2NyZWVuc2hvdE1hbmFnZXI6OlByb3ZpZGVTY3JlZW5zaG90RnVuY3Rpb25DYWxsYmFjaygpKSkgeworICAgICAgICB1cmxfKCJhYm91dDpibGFuayIpIHsKICAgICBlbmdpbmVfID0gc2NyaXB0OjpKYXZhU2NyaXB0RW5naW5lOjpDcmVhdGVFbmdpbmUoKTsKICAgICBnbG9iYWxfZW52aXJvbm1lbnRfID0gZW5naW5lXy0+Q3JlYXRlR2xvYmFsRW52aXJvbm1lbnQoKTsKKyAgICB3aW5kb3dfID0gbmV3IFdpbmRvdygKKyAgICAgICAgMTkyMCwgMTA4MCwgMS5mLCBiYXNlOjprQXBwbGljYXRpb25TdGF0ZVN0YXJ0ZWQsIGNzc19wYXJzZXJfLmdldCgpLAorICAgICAgICBkb21fcGFyc2VyXy5nZXQoKSwgZmV0Y2hlcl9mYWN0b3J5Xy5nZXQoKSwgbG9hZGVyX2ZhY3RvcnlfLmdldCgpLCBOVUxMLAorICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAmbG9jYWxfc3RvcmFnZV9kYXRhYmFzZV8sIE5VTEwsIE5VTEwsCisgICAgICAgIE5VTEwsIE5VTEwsIGdsb2JhbF9lbnZpcm9ubWVudF8tPnNjcmlwdF92YWx1ZV9mYWN0b3J5KCksIE5VTEwsIE5VTEwsCisgICAgICAgIHVybF8sICIiLCAiZW4tVVMiLCAiZW4iLCBiYXNlOjpDYWxsYmFjazx2b2lkKGNvbnN0IEdVUkwmKT4oKSwKKyAgICAgICAgYmFzZTo6QmluZCgmTW9ja0Vycm9yQ2FsbGJhY2s6OlJ1biwKKyAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKCZtb2NrX2Vycm9yX2NhbGxiYWNrXykpLAorICAgICAgICBOVUxMLCBuZXR3b3JrX2JyaWRnZTo6UG9zdFNlbmRlcigpLCBjc3A6OmtDU1BSZXF1aXJlZCwKKyAgICAgICAga0NzcEVuZm9yY2VtZW50RW5hYmxlLCBiYXNlOjpDbG9zdXJlKCkgLyogY3NwX3BvbGljeV9jaGFuZ2VkICovLAorICAgICAgICBiYXNlOjpDbG9zdXJlKCkgLyogcmFuX2FuaW1hdGlvbl9mcmFtZV9jYWxsYmFja3MgKi8sCisgICAgICAgIGRvbTo6V2luZG93OjpDbG9zZUNhbGxiYWNrKCkgLyogd2luZG93X2Nsb3NlICovLAorICAgICAgICBiYXNlOjpDbG9zdXJlKCkgLyogd2luZG93X21pbmltaXplICovLCBOVUxMLCBOVUxMLCBOVUxMLAorICAgICAgICBkb206OldpbmRvdzo6T25TdGFydERpc3BhdGNoRXZlbnRDYWxsYmFjaygpLAorICAgICAgICBkb206OldpbmRvdzo6T25TdG9wRGlzcGF0Y2hFdmVudENhbGxiYWNrKCksCisgICAgICAgIGRvbTo6U2NyZWVuc2hvdE1hbmFnZXI6OlByb3ZpZGVTY3JlZW5zaG90RnVuY3Rpb25DYWxsYmFjaygpLCBOVUxMKTsKICAgICBnbG9iYWxfZW52aXJvbm1lbnRfLT5DcmVhdGVHbG9iYWxPYmplY3Qod2luZG93XywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnRfc2V0dGluZ3NfLmdldCgpKTsKICAgfQpAQCAtOTIsOSArOTYsMTAgQEAKICAgc2NvcGVkX3B0cjxjc3NfcGFyc2VyOjpQYXJzZXI+IGNzc19wYXJzZXJfOwogICBzY29wZWRfcHRyPGRvbV9wYXJzZXI6OlBhcnNlcj4gZG9tX3BhcnNlcl87CiAgIHNjb3BlZF9wdHI8bG9hZGVyOjpGZXRjaGVyRmFjdG9yeT4gZmV0Y2hlcl9mYWN0b3J5XzsKKyAgc2NvcGVkX3B0cjxsb2FkZXI6OkxvYWRlckZhY3Rvcnk+IGxvYWRlcl9mYWN0b3J5XzsKICAgZG9tOjpMb2NhbFN0b3JhZ2VEYXRhYmFzZSBsb2NhbF9zdG9yYWdlX2RhdGFiYXNlXzsKICAgR1VSTCB1cmxfOwotICBjb25zdCBzY29wZWRfcmVmcHRyPFdpbmRvdz4gd2luZG93XzsKKyAgc2NvcGVkX3JlZnB0cjxXaW5kb3c+IHdpbmRvd187CiB9OwogCiBib29sIEN1c3RvbUV2ZW50VGVzdDo6RXZhbHVhdGVTY3JpcHQoY29uc3Qgc3RkOjpzdHJpbmcmIGpzX2NvZGUsCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9kb2N1bWVudC5jYyBiL3NyYy9jb2JhbHQvZG9tL2RvY3VtZW50LmNjCmluZGV4IDA4YzAxNDYuLjgwNWM4ZDggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2RvY3VtZW50LmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL2RvY3VtZW50LmNjCkBAIC05Miw2ICs5Miw3IEBACiAgICAgICB1c2VyX2FnZW50X3N0eWxlX3NoZWV0XyhvcHRpb25zLnVzZXJfYWdlbnRfc3R5bGVfc2hlZXQpLAogICAgICAgaW5pdGlhbF9jb21wdXRlZF9zdHlsZV9kZWNsYXJhdGlvbl8oCiAgICAgICAgICAgbmV3IGNzc29tOjpDU1NDb21wdXRlZFN0eWxlRGVjbGFyYXRpb24oKSksCisgICAgICByZWFkeV9zdGF0ZV8oa0RvY3VtZW50UmVhZHlTdGF0ZUNvbXBsZXRlKSwKICAgICAgIGRvbV9tYXhfZWxlbWVudF9kZXB0aF8ob3B0aW9ucy5kb21fbWF4X2VsZW1lbnRfZGVwdGgpLAogICAgICAgcmVuZGVyX3Bvc3Rwb25lZF8oZmFsc2UpIHsKICAgRENIRUNLKGh0bWxfZWxlbWVudF9jb250ZXh0Xyk7CkBAIC00OTksMTIgKzUwMCwyMiBAQAogCiB2b2lkIERvY3VtZW50OjpTZXRJbmRpY2F0ZWRFbGVtZW50KEhUTUxFbGVtZW50KiBpbmRpY2F0ZWRfZWxlbWVudCkgewogICBpZiAoaW5kaWNhdGVkX2VsZW1lbnQgIT0gaW5kaWNhdGVkX2VsZW1lbnRfKSB7Ci0gICAgaXNfc2VsZWN0b3JfdHJlZV9kaXJ0eV8gPSB0cnVlOwogICAgIGlmIChpbmRpY2F0ZWRfZWxlbWVudF8pIHsKKyAgICAgIC8vIENsZWFyIHRoZSBydWxlIG1hdGNoaW5nIHN0YXRlIG9uIHRoaXMgZWxlbWVudCBhbmQgaXRzIGFuY2VzdG9ycywgYXMKKyAgICAgIC8vIHRoZWlyIGhvdmVyIHN0YXRlIG1heSBiZSBjaGFuZ2luZy4gSG93ZXZlciwgdGhlIHRyZWUncyBtYXRjaGluZyBydWxlcworICAgICAgLy8gb25seSBuZWVkIHRvIGJlIGludmFsaWRhdGVkIG9uY2UsIHNvIG9ubHkgZG8gaXQgaGVyZSBpZiBpdCB3b24ndCBvY2N1cgorICAgICAgLy8gYmVsb3cuCisgICAgICBib29sIGludmFsaWRhdGVfdHJlZV9tYXRjaGluZ19ydWxlcyA9IChpbmRpY2F0ZWRfZWxlbWVudCA9PSBOVUxMKTsKKyAgICAgIGluZGljYXRlZF9lbGVtZW50Xy0+Q2xlYXJSdWxlTWF0Y2hpbmdTdGF0ZU9uRWxlbWVudEFuZEFuY2VzdG9ycygKKyAgICAgICAgICBpbnZhbGlkYXRlX3RyZWVfbWF0Y2hpbmdfcnVsZXMpOwogICAgICAgaW5kaWNhdGVkX2VsZW1lbnRfLT5PbkNTU011dGF0aW9uKCk7CiAgICAgfQogICAgIGlmIChpbmRpY2F0ZWRfZWxlbWVudCkgewogICAgICAgaW5kaWNhdGVkX2VsZW1lbnRfID0gYmFzZTo6QXNXZWFrUHRyKGluZGljYXRlZF9lbGVtZW50KTsKKyAgICAgIC8vIENsZWFyIHRoZSBydWxlIG1hdGNoaW5nIHN0YXRlIG9uIHRoaXMgZWxlbWVudCBhbmQgaXRzIGFuY2VzdG9ycywgYXMKKyAgICAgIC8vIHRoZWlyIGhvdmVyIHN0YXRlIG1heSBiZSBjaGFuZ2luZy4KKyAgICAgIGluZGljYXRlZF9lbGVtZW50Xy0+Q2xlYXJSdWxlTWF0Y2hpbmdTdGF0ZU9uRWxlbWVudEFuZEFuY2VzdG9ycygKKyAgICAgICAgICB0cnVlIC8qaW52YWxpZGF0ZV90cmVlX21hdGNoaW5nX3J1bGVzKi8pOwogICAgICAgaW5kaWNhdGVkX2VsZW1lbnRfLT5PbkNTU011dGF0aW9uKCk7CiAgICAgfSBlbHNlIHsKICAgICAgIGluZGljYXRlZF9lbGVtZW50Xy5yZXNldCgpOwpAQCAtNjEwLDcgKzYyMSw3IEBACiAKIHZvaWQgRG9jdW1lbnQ6Ok9uRE9NTXV0YXRpb24oKSB7CiAgIC8vIFNvbWV0aGluZyBpbiB0aGUgZG9jdW1lbnQncyBET00gaGFzIGJlZW4gbW9kaWZpZWQsIGJ1dCB3ZSBkb24ndCBrbm93IHdoYXQsCi0gIC8vIHNvIHNldCB0aGUgZmxhZyBpbmRpY2F0aW5nIHRoYXQgcnVsZSBtYXRjaGluZyBuZWVkcyB0byBiZSBkb25lLgorICAvLyBzbyBzZXQgdGhlIGZsYWcgaW5kaWNhdGluZyB0aGF0IGNvbXB1dGVkIHN0eWxlcyBuZWVkIHRvIGJlIHVwZGF0ZWQuCiAgIGlzX2NvbXB1dGVkX3N0eWxlX2RpcnR5XyA9IHRydWU7CiAKICAgUmVjb3JkTXV0YXRpb24oKTsKQEAgLTcxOSwxMiArNzMwLDE1IEBACiAgICAgc2NvcGVkX3JlZnB0cjxIVE1MRWxlbWVudD4gcm9vdCA9IGh0bWwoKTsKICAgICBpZiAocm9vdCkgewogICAgICAgRENIRUNLX0VRKHRoaXMsIHJvb3QtPnBhcmVudF9ub2RlKCkpOwotICAgICAgLy8gRmlyc3QgdXBkYXRlIHRoZSBjb21wdXRlZCBzdHlsZSBmb3Igcm9vdCBlbGVtZW50LgorICAgICAgLy8gRmlyc3QsIHVwZGF0ZSB0aGUgbWF0Y2hpbmcgcnVsZXMgZm9yIGFsbCBlbGVtZW50cy4KKyAgICAgIHJvb3QtPlVwZGF0ZU1hdGNoaW5nUnVsZXNSZWN1cnNpdmVseSgpOworCisgICAgICAvLyBUaGVuLCB1cGRhdGUgdGhlIGNvbXB1dGVkIHN0eWxlIGZvciB0aGUgcm9vdCBlbGVtZW50LgogICAgICAgcm9vdC0+VXBkYXRlQ29tcHV0ZWRTdHlsZSgKICAgICAgICAgICBpbml0aWFsX2NvbXB1dGVkX3N0eWxlX2RlY2xhcmF0aW9uXywgaW5pdGlhbF9jb21wdXRlZF9zdHlsZV9kYXRhXywKICAgICAgICAgICBzdHlsZV9jaGFuZ2VfZXZlbnRfdGltZSwgSFRNTEVsZW1lbnQ6OmtBbmNlc3RvcnNBcmVEaXNwbGF5ZWQpOwogCi0gICAgICAvLyBUaGVuIHVwZGF0ZSB0aGUgY29tcHV0ZWQgc3R5bGVzIGZvciB0aGUgb3RoZXIgZWxlbWVudHMuCisgICAgICAvLyBGaW5hbGx5LCB1cGRhdGUgdGhlIGNvbXB1dGVkIHN0eWxlcyBmb3IgdGhlIG90aGVyIGVsZW1lbnRzLgogICAgICAgcm9vdC0+VXBkYXRlQ29tcHV0ZWRTdHlsZVJlY3Vyc2l2ZWx5KAogICAgICAgICAgIHJvb3QtPmNzc19jb21wdXRlZF9zdHlsZV9kZWNsYXJhdGlvbigpLCByb290LT5jb21wdXRlZF9zdHlsZSgpLAogICAgICAgICAgIHN0eWxlX2NoYW5nZV9ldmVudF90aW1lLCB0cnVlLCAwIC8qIGN1cnJlbnRfZWxlbWVudF9kZXB0aCAqLyk7CkBAIC03ODAsOSArNzk0LDEzIEBACiAgIGZvciAoc3RkOjp2ZWN0b3I8SFRNTEVsZW1lbnQqPjo6cmV2ZXJzZV9pdGVyYXRvciBpdCA9IGFuY2VzdG9ycy5yYmVnaW4oKTsKICAgICAgICBpdCAhPSBhbmNlc3RvcnMucmVuZCgpOyArK2l0KSB7CiAgICAgSFRNTEVsZW1lbnQqIGN1cnJlbnRfZWxlbWVudCA9ICppdDsKLSAgICBib29sIGlzX3ZhbGlkID0gYW5jZXN0b3JzX3dlcmVfdmFsaWQgJiYKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudF9lbGVtZW50LT5tYXRjaGluZ19ydWxlc192YWxpZCgpICYmCi0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfZWxlbWVudC0+Y29tcHV0ZWRfc3R5bGVfdmFsaWQoKTsKKworICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBtYXRjaGluZyBydWxlcyBhcmUgdXAgdG8gZGF0ZSBwcmlvciB0byB1cGRhdGluZyB0aGUKKyAgICAvLyBjb21wdXRlZCBzdHlsZS4KKyAgICBjdXJyZW50X2VsZW1lbnQtPlVwZGF0ZU1hdGNoaW5nUnVsZXMoKTsKKworICAgIGJvb2wgaXNfdmFsaWQgPQorICAgICAgICBhbmNlc3RvcnNfd2VyZV92YWxpZCAmJiBjdXJyZW50X2VsZW1lbnQtPkFyZUNvbXB1dGVkU3R5bGVzVmFsaWQoKTsKICAgICBpZiAoIWlzX3ZhbGlkKSB7CiAgICAgICBEQ0hFQ0soaW5pdGlhbF9jb21wdXRlZF9zdHlsZV9kZWNsYXJhdGlvbl8pOwogICAgICAgRENIRUNLKGluaXRpYWxfY29tcHV0ZWRfc3R5bGVfZGF0YV8pOwpAQCAtOTIwLDcgKzkzOCw3IEBACiAKICAgICBzY29wZWRfcmVmcHRyPEhUTUxIdG1sRWxlbWVudD4gY3VycmVudF9odG1sID0gaHRtbCgpOwogICAgIGlmIChjdXJyZW50X2h0bWwpIHsKLSAgICAgIGN1cnJlbnRfaHRtbC0+SW52YWxpZGF0ZU1hdGNoaW5nUnVsZXNSZWN1cnNpdmVseSgpOworICAgICAgY3VycmVudF9odG1sLT5DbGVhclJ1bGVNYXRjaGluZ1N0YXRlT25FbGVtZW50QW5kRGVzY2VuZGFudHMoKTsKICAgICB9CiAKICAgICBpc19zZWxlY3Rvcl90cmVlX2RpcnR5XyA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZG9jdW1lbnQuaCBiL3NyYy9jb2JhbHQvZG9tL2RvY3VtZW50LmgKaW5kZXggZmZjYTk1Ny4uOWE2NmEyYiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vZG9jdW1lbnQuaAorKysgYi9zcmMvY29iYWx0L2RvbS9kb2N1bWVudC5oCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSAiYmFzZS9vYnNlcnZlcl9saXN0LmgiCiAjaW5jbHVkZSAiYmFzZS9vcHRpb25hbC5oIgogI2luY2x1ZGUgImJhc2Uvc3RyaW5nX3BpZWNlLmgiCisjaW5jbHVkZSAiYmFzZS9zeW5jaHJvbml6YXRpb24vd2FpdGFibGVfZXZlbnQuaCIKICNpbmNsdWRlICJjb2JhbHQvYmFzZS9jbG9jay5oIgogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9jc3NfY29tcHV0ZWRfc3R5bGVfZGVjbGFyYXRpb24uaCIKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vY3NzX2tleWZyYW1lc19ydWxlLmgiCkBAIC0yNjEsNiArMjYyLDE0IEBACiAKICAgY3Nzb206OlNlbGVjdG9yVHJlZSogc2VsZWN0b3JfdHJlZSgpIHsgcmV0dXJuIHNlbGVjdG9yX3RyZWVfLmdldCgpOyB9CiAKKyAgY3Nzb206OlJ1bGVzV2l0aENhc2NhZGVQcmVjZWRlbmNlKiBzY3JhdGNocGFkX2h0bWxfZWxlbWVudF9tYXRjaGluZ19ydWxlcygpIHsKKyAgICByZXR1cm4gJnNjcmF0Y2hwYWRfaHRtbF9lbGVtZW50X21hdGNoaW5nX3J1bGVzXzsKKyAgfQorICBjc3NvbTo6UnVsZXNXaXRoQ2FzY2FkZVByZWNlZGVuY2UqIHNjcmF0Y2hwYWRfcHNldWRvX2VsZW1lbnRfbWF0Y2hpbmdfcnVsZXMoCisgICAgICBQc2V1ZG9FbGVtZW50VHlwZSBlbGVtZW50X3R5cGUpIHsKKyAgICByZXR1cm4gJihzY3JhdGNocGFkX3BzZXVkb19lbGVtZW50X21hdGNoaW5nX3J1bGVzX1tlbGVtZW50X3R5cGVdKTsKKyAgfQorCiAgIC8vIFJldHVybnMgYSBtYXBwaW5nIGZyb20ga2V5ZnJhbWVzIG5hbWUgdG8gQ1NTS2V5ZnJhbWVzUnVsZS4gIFRoaXMgY2FuIGJlCiAgIC8vIHVzZWQgdG8gcXVpY2tseSBsb29rdXAgdGhlIEBrZXlmcmFtZXMgcnVsZSBnaXZlbiBhIHN0cmluZyBpZGVudGlmaWVyLgogICBjb25zdCBjc3NvbTo6Q1NTS2V5ZnJhbWVzUnVsZTo6TmFtZU1hcCYga2V5ZnJhbWVzX21hcCgpIGNvbnN0IHsKQEAgLTQ5Nyw2ICs1MDYsMTEgQEAKICAgLy8gcmVjcmVhdGUgdGhlIHNlbGVjdG9yIHRyZWUgdGhhbiB0byBhdHRlbXB0IHRvIG1hbmFnZSB1cGRhdGluZyBhbGwgb2YgaXRzCiAgIC8vIGludGVybmFsIHN0YXRlLgogICBib29sIHNob3VsZF9yZWNyZWF0ZV9zZWxlY3Rvcl90cmVlXzsKKyAgLy8gTWF0Y2hpbmcgcnVsZXMgdGhhdCBhcmUgYXZhaWxhYmxlIGZvciB0ZW1wb3Jhcnkgb3BlcmF0aW9ucywgc28gdGhhdCB0aGUKKyAgLy8gdmVjdG9ycyBkb24ndCBoYXZlIHRvIGJlIHJlcGVhdGVkbHkgcmUtYWxsb2NhdGVkIGR1cmluZyBydWxlIG1hdGNoaW5nLgorICBjc3NvbTo6UnVsZXNXaXRoQ2FzY2FkZVByZWNlZGVuY2Ugc2NyYXRjaHBhZF9odG1sX2VsZW1lbnRfbWF0Y2hpbmdfcnVsZXNfOworICBjc3NvbTo6UnVsZXNXaXRoQ2FzY2FkZVByZWNlZGVuY2UKKyAgICAgIHNjcmF0Y2hwYWRfcHNldWRvX2VsZW1lbnRfbWF0Y2hpbmdfcnVsZXNfW2tNYXhQc2V1ZG9FbGVtZW50VHlwZV07CiAgIC8vIFRoZSBkb2N1bWVudCdzIGxhdGVzdCBzYW1wbGUgZnJvbSB0aGUgZ2xvYmFsIGNsb2NrLCB1c2VkIGZvciB1cGRhdGluZwogICAvLyBhbmltYXRpb25zLgogICBjb25zdCBzY29wZWRfcmVmcHRyPGJhc2U6OkNsb2NrPiBuYXZpZ2F0aW9uX3N0YXJ0X2Nsb2NrXzsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2RvY3VtZW50X3Rlc3QuY2MgYi9zcmMvY29iYWx0L2RvbS9kb2N1bWVudF90ZXN0LmNjCmluZGV4IGUwYjg0NjIuLjVjZmM2NzQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2RvY3VtZW50X3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vZG9jdW1lbnRfdGVzdC5jYwpAQCAtNjgsMTAgKzY4LDEwIEBACiBEb2N1bWVudFRlc3Q6OkRvY3VtZW50VGVzdCgpCiAgICAgOiBjc3NfcGFyc2VyXyhjc3NfcGFyc2VyOjpQYXJzZXI6OkNyZWF0ZSgpKSwKICAgICAgIGRvbV9zdGF0X3RyYWNrZXJfKG5ldyBEb21TdGF0VHJhY2tlcigiRG9jdW1lbnRUZXN0IikpLAotICAgICAgaHRtbF9lbGVtZW50X2NvbnRleHRfKE5VTEwsIGNzc19wYXJzZXJfLmdldCgpLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorICAgICAgaHRtbF9lbGVtZW50X2NvbnRleHRfKE5VTEwsIE5VTEwsIGNzc19wYXJzZXJfLmdldCgpLCBOVUxMLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tX3N0YXRfdHJhY2tlcl8uZ2V0KCksICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OmtBcHBsaWNhdGlvblN0YXRlU3RhcnRlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIGRvbV9zdGF0X3RyYWNrZXJfLmdldCgpLCAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjprQXBwbGljYXRpb25TdGF0ZVN0YXJ0ZWQsIE5VTEwpIHsKICAgRVhQRUNUX1RSVUUoR2xvYmFsU3RhdHM6OkdldEluc3RhbmNlKCktPkNoZWNrTm9MZWFrcygpKTsKIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZG9tLmd5cCBiL3NyYy9jb2JhbHQvZG9tL2RvbS5neXAKaW5kZXggNzkzZmE4Mi4uNGYwMTU0YyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vZG9tLmd5cAorKysgYi9zcmMvY29iYWx0L2RvbS9kb20uZ3lwCkBAIC0zMiw2ICszMiw4IEBACiAgICAgICAgICdhdHRyLmgnLAogICAgICAgICAnYXVkaW9fdHJhY2suaCcsCiAgICAgICAgICdhdWRpb190cmFja19saXN0LmgnLAorICAgICAgICAnYmFzZTY0LmNjJywKKyAgICAgICAgJ2Jhc2U2NC5oJywKICAgICAgICAgJ2JlbmNobWFya19zdGF0X25hbWVzLmNjJywKICAgICAgICAgJ2JlbmNobWFya19zdGF0X25hbWVzLmgnLAogICAgICAgICAnYmxvYi5jYycsCkBAIC0xMDAsNyArMTAyLDYgQEAKICAgICAgICAgJ2V2ZW50LmNjJywKICAgICAgICAgJ2V2ZW50LmgnLAogICAgICAgICAnZXZlbnRfaW5pdC5oJywKLSAgICAgICAgJ2V2ZW50X2xpc3RlbmVyLmNjJywKICAgICAgICAgJ2V2ZW50X2xpc3RlbmVyLmgnLAogICAgICAgICAnZXZlbnRfcXVldWUuY2MnLAogICAgICAgICAnZXZlbnRfcXVldWUuaCcsCkBAIC0xMTksNiArMTIwLDggQEAKICAgICAgICAgJ2ZvbnRfZmFjZV91cGRhdGVyLmgnLAogICAgICAgICAnZm9udF9saXN0LmNjJywKICAgICAgICAgJ2ZvbnRfbGlzdC5oJywKKyAgICAgICAgJ2dlbmVyaWNfZXZlbnRfaGFuZGxlcl9yZWZlcmVuY2UuY2MnLAorICAgICAgICAnZ2VuZXJpY19ldmVudF9oYW5kbGVyX3JlZmVyZW5jZS5oJywKICAgICAgICAgJ2dsb2JhbF9zdGF0cy5jYycsCiAgICAgICAgICdnbG9iYWxfc3RhdHMuaCcsCiAgICAgICAgICdoaXN0b3J5LmNjJywKQEAgLTIxNSw2ICsyMTgsOCBAQAogICAgICAgICAnbm9kZV9saXN0LmgnLAogICAgICAgICAnbm9kZV9saXN0X2xpdmUuY2MnLAogICAgICAgICAnbm9kZV9saXN0X2xpdmUuaCcsCisgICAgICAgICdvbl9lcnJvcl9ldmVudF9saXN0ZW5lci5jYycsCisgICAgICAgICdvbl9lcnJvcl9ldmVudF9saXN0ZW5lci5oJywKICAgICAgICAgJ29uX3NjcmVlbl9rZXlib2FyZC5jYycsCiAgICAgICAgICdvbl9zY3JlZW5fa2V5Ym9hcmQuaCcsCiAgICAgICAgICdvbl9zY3JlZW5fa2V5Ym9hcmRfYnJpZGdlLmgnLApAQCAtMjQzLDYgKzI0OCw4IEBACiAgICAgICAgICdzY3JlZW5zaG90LmgnLAogICAgICAgICAnc2NyZWVuc2hvdF9tYW5hZ2VyLmNjJywKICAgICAgICAgJ3NjcmVlbnNob3RfbWFuYWdlci5oJywKKyAgICAgICAgJ3NjcmlwdF9ldmVudF9sb2cuY2MnLAorICAgICAgICAnc2NyaXB0X2V2ZW50X2xvZy5oJywKICAgICAgICAgJ3NlY3VyaXR5X3BvbGljeV92aW9sYXRpb25fZXZlbnQuY2MnLAogICAgICAgICAnc2VjdXJpdHlfcG9saWN5X3Zpb2xhdGlvbl9ldmVudC5oJywKICAgICAgICAgJ3NlcmlhbGl6ZXIuY2MnLApAQCAtMzAyLDYgKzMwOSw3IEBACiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvbmV0d29ya19icmlkZ2UvbmV0d29ya19icmlkZ2UuZ3lwOm5ldHdvcmtfYnJpZGdlJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9wYWdlX3Zpc2liaWxpdHkvcGFnZV92aXNpYmlsaXR5Lmd5cDpwYWdlX3Zpc2liaWxpdHknLAogICAgICAgICAnPChERVBUSCkvY29iYWx0L3NjcmlwdC9zY3JpcHQuZ3lwOnNjcmlwdCcsCisgICAgICAgICc8KERFUFRIKS9jb2JhbHQvc3BlZWNoL3NwZWVjaC5neXA6c3BlZWNoJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9zdG9yYWdlL3N0b3JhZ2UuZ3lwOnN0b3JhZ2UnLAogICAgICAgICAnPChERVBUSCkvY29iYWx0L3N5c3RlbV93aW5kb3cvc3lzdGVtX3dpbmRvdy5neXA6c3lzdGVtX3dpbmRvdycsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvd2ViX2FuaW1hdGlvbnMuZ3lwOndlYl9hbmltYXRpb25zJywKQEAgLTM3MywyNSArMzgxLDUgQEAKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9icm93c2VyL2Jyb3dzZXJfYmluZGluZ3NfZ2VuLmd5cDpnZW5lcmF0ZWRfdHlwZXMnLAogICAgICAgXSwKICAgICB9LAotCi0gICAgewotICAgICAgJ3RhcmdldF9uYW1lJzogJ2RvbV90ZXN0aW5nJywKLSAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKLSAgICAgICdzb3VyY2VzJzogWwotICAgICAgICAndGVzdGluZy9ndGVzdF93b3JrYXJvdW5kcy5oJywKLSAgICAgICAgJ3Rlc3RpbmcvaHRtbF9jb2xsZWN0aW9uX3Rlc3RpbmcuaCcsCi0gICAgICAgICd0ZXN0aW5nL21vY2tfZXZlbnRfbGlzdGVuZXIuaCcsCi0gICAgICAgICd0ZXN0aW5nL3N0dWJfY3NzX3BhcnNlci5jYycsCi0gICAgICAgICd0ZXN0aW5nL3N0dWJfY3NzX3BhcnNlci5oJywKLSAgICAgICAgJ3Rlc3Rpbmcvc3R1Yl9zY3JpcHRfcnVubmVyLmNjJywKLSAgICAgICAgJ3Rlc3Rpbmcvc3R1Yl9zY3JpcHRfcnVubmVyLmgnLAotICAgICAgICAndGVzdGluZy9zdHViX3dpbmRvdy5oJywKLSAgICAgIF0sCi0gICAgICAnZGVwZW5kZW5jaWVzJzogWwotICAgICAgICAjIFRPRE86IFJlbW92ZSB0aGUgZGVwZW5kZW5jeSBiZWxvdywgaXQgd29ya3MgYXJvdW5kIHRoZSBmYWN0IHRoYXQKLSAgICAgICAgIyAgICAgICBTY3JpcHRWYWx1ZUZhY3RvcnkgaGFzIG5vbi12aXJ0dWFsIG1ldGhvZCBDcmVhdGVQcm9taXNlKCkuCi0gICAgICAgICc8KERFUFRIKS9jb2JhbHQvc2NyaXB0L2VuZ2luZS5neXA6ZW5naW5lJywKLSAgICAgIF0sCi0gICAgfSwKICAgXSwKIH0KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2RvbV9leGNlcHRpb24uY2MgYi9zcmMvY29iYWx0L2RvbS9kb21fZXhjZXB0aW9uLmNjCmluZGV4IGExZWM3ZmIuLjVlYjM1YjQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2RvbV9leGNlcHRpb24uY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vZG9tX2V4Y2VwdGlvbi5jYwpAQCAtNDksNiArNDksOCBAQAogICAgICAgcmV0dXJuICJSZWFkT25seUVycm9yIjsKICAgICBjYXNlIERPTUV4Y2VwdGlvbjo6a0ludmFsaWRQb2ludGVySWRFcnI6CiAgICAgICByZXR1cm4gIkludmFsaWRQb2ludGVySWQiOworICAgIGNhc2UgRE9NRXhjZXB0aW9uOjprTm90QWxsb3dlZEVycjoKKyAgICAgIHJldHVybiAiTm90QWxsb3dlZEVycm9yIjsKICAgfQogICBOT1RSRUFDSEVEKCk7CiAgIHJldHVybiAiIjsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2RvbV9leGNlcHRpb24uaCBiL3NyYy9jb2JhbHQvZG9tL2RvbV9leGNlcHRpb24uaAppbmRleCA1OWYzOTE5Li5mYWY4NWNiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9kb21fZXhjZXB0aW9uLmgKKysrIGIvc3JjL2NvYmFsdC9kb20vZG9tX2V4Y2VwdGlvbi5oCkBAIC00Niw3ICs0Niw4IEBACiAgICAga1F1b3RhRXhjZWVkZWRFcnIgPSAyMiwKICAgICBrSGlnaGVzdEVyckNvZGVWYWx1ZSA9IGtRdW90YUV4Y2VlZGVkRXJyLAogICAgIGtSZWFkT25seUVyciwKLSAgICBrSW52YWxpZFBvaW50ZXJJZEVycgorICAgIGtJbnZhbGlkUG9pbnRlcklkRXJyLAorICAgIGtOb3RBbGxvd2VkRXJyCiAgIH07CiAKICAgZXhwbGljaXQgRE9NRXhjZXB0aW9uKEV4Y2VwdGlvbkNvZGUgY29kZSk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9kb21fcGFyc2VyX3Rlc3QuY2MgYi9zcmMvY29iYWx0L2RvbS9kb21fcGFyc2VyX3Rlc3QuY2MKaW5kZXggN2UxOGM0MC4uOTYwMWJkNiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vZG9tX3BhcnNlcl90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL2RvbV9wYXJzZXJfdGVzdC5jYwpAQCAtMTQsNiArMTQsNyBAQAogCiAjaW5jbHVkZSA8c3RyaW5nPgogCisjaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvcGxhdGZvcm1fdGhyZWFkLmgiCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9kb2N1bWVudC5oIgogI2luY2x1ZGUgImNvYmFsdC9kb20vZG9tX3BhcnNlci5oIgogI2luY2x1ZGUgImNvYmFsdC9kb20vaHRtbF9lbGVtZW50X2NvbnRleHQuaCIKQEAgLTIxLDYgKzIyLDcgQEAKICNpbmNsdWRlICJjb2JhbHQvZG9tL3Rlc3Rpbmcvc3R1Yl9zY3JpcHRfcnVubmVyLmgiCiAjaW5jbHVkZSAiY29iYWx0L2RvbV9wYXJzZXIvcGFyc2VyLmgiCiAjaW5jbHVkZSAiY29iYWx0L2xvYWRlci9mZXRjaGVyX2ZhY3RvcnkuaCIKKyNpbmNsdWRlICJjb2JhbHQvbG9hZGVyL2xvYWRlcl9mYWN0b3J5LmgiCiAjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCiAKIG5hbWVzcGFjZSBjb2JhbHQgewpAQCAtMzIsNiArMzQsNyBAQAogICB+RE9NUGFyc2VyVGVzdCgpIG92ZXJyaWRlIHt9CiAKICAgbG9hZGVyOjpGZXRjaGVyRmFjdG9yeSBmZXRjaGVyX2ZhY3RvcnlfOworICBsb2FkZXI6OkxvYWRlckZhY3RvcnkgbG9hZGVyX2ZhY3RvcnlfOwogICB0ZXN0aW5nOjpTdHViQ1NTUGFyc2VyIHN0dWJfY3NzX3BhcnNlcl87CiAgIHNjb3BlZF9wdHI8ZG9tX3BhcnNlcjo6UGFyc2VyPiBkb21fcGFyc2VyX3BhcnNlcl87CiAgIHRlc3Rpbmc6OlN0dWJTY3JpcHRSdW5uZXIgc3R1Yl9zY3JpcHRfcnVubmVyXzsKQEAgLTQxLDE3ICs0NCwyMSBAQAogCiBET01QYXJzZXJUZXN0OjpET01QYXJzZXJUZXN0KCkKICAgICA6IGZldGNoZXJfZmFjdG9yeV8oTlVMTCAvKiBuZXR3b3JrX21vZHVsZSAqLyksCisgICAgICBsb2FkZXJfZmFjdG9yeV8oJmZldGNoZXJfZmFjdG9yeV8sIE5VTEwgLyogcmVzb3VyY2UgcHJvdmlkZXIgKi8sCisgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6a1RocmVhZFByaW9yaXR5X0RlZmF1bHQpLAogICAgICAgZG9tX3BhcnNlcl9wYXJzZXJfKG5ldyBkb21fcGFyc2VyOjpQYXJzZXIoKSksCiAgICAgICBodG1sX2VsZW1lbnRfY29udGV4dF8oCi0gICAgICAgICAgJmZldGNoZXJfZmFjdG9yeV8sICZzdHViX2Nzc19wYXJzZXJfLCBkb21fcGFyc2VyX3BhcnNlcl8uZ2V0KCksCi0gICAgICAgICAgTlVMTCAvKiBjYW5fcGxheV90eXBlX2hhbmRsZXIgKi8sIE5VTEwgLyogd2ViX21lZGlhX3BsYXllcl9mYWN0b3J5ICovLAotICAgICAgICAgICZzdHViX3NjcmlwdF9ydW5uZXJfLCBOVUxMIC8qIHNjcmlwdF92YWx1ZV9mYWN0b3J5ICovLAotICAgICAgICAgIE5VTEwgLyogbWVkaWFfc291cmNlX3JlZ2lzdHJ5ICovLCBOVUxMIC8qIHJlc291cmNlX3Byb3ZpZGVyICovLAotICAgICAgICAgIE5VTEwgLyogYW5pbWF0ZWRfaW1hZ2VfdHJhY2tlciAqLywgTlVMTCAvKiBpbWFnZV9jYWNoZSAqLywKKyAgICAgICAgICAmZmV0Y2hlcl9mYWN0b3J5XywgJmxvYWRlcl9mYWN0b3J5XywgJnN0dWJfY3NzX3BhcnNlcl8sCisgICAgICAgICAgZG9tX3BhcnNlcl9wYXJzZXJfLmdldCgpLCBOVUxMIC8qIGNhbl9wbGF5X3R5cGVfaGFuZGxlciAqLywKKyAgICAgICAgICBOVUxMIC8qIHdlYl9tZWRpYV9wbGF5ZXJfZmFjdG9yeSAqLywgJnN0dWJfc2NyaXB0X3J1bm5lcl8sCisgICAgICAgICAgTlVMTCAvKiBzY3JpcHRfdmFsdWVfZmFjdG9yeSAqLywgTlVMTCAvKiBtZWRpYV9zb3VyY2VfcmVnaXN0cnkgKi8sCisgICAgICAgICAgTlVMTCAvKiByZXNvdXJjZV9wcm92aWRlciAqLywgTlVMTCAvKiBhbmltYXRlZF9pbWFnZV90cmFja2VyICovLAorICAgICAgICAgIE5VTEwgLyogaW1hZ2VfY2FjaGUgKi8sCiAgICAgICAgICAgTlVMTCAvKiByZWR1Y2VkX2ltYWdlX2NhY2hlX2NhcGFjaXR5X21hbmFnZXIgKi8sCiAgICAgICAgICAgTlVMTCAvKiByZW1vdGVfdHlwZWZhY2VfY2FjaGUgKi8sIE5VTEwgLyogbWVzaF9jYWNoZSAqLywKICAgICAgICAgICBOVUxMIC8qIGRvbV9zdGF0X3RyYWNrZXIgKi8sICIiIC8qIGxhbmd1YWdlICovLAotICAgICAgICAgIGJhc2U6OmtBcHBsaWNhdGlvblN0YXRlU3RhcnRlZCksCisgICAgICAgICAgYmFzZTo6a0FwcGxpY2F0aW9uU3RhdGVTdGFydGVkLAorICAgICAgICAgIE5VTEwgLyogc3luY2hyb25vdXNfbG9hZGVyX2ludGVycnVwdCAqLyksCiAgICAgICBkb21fcGFyc2VyXyhuZXcgRE9NUGFyc2VyKCZodG1sX2VsZW1lbnRfY29udGV4dF8pKSB7fQogCiBURVNUX0YoRE9NUGFyc2VyVGVzdCwgUGFyc2VzWE1MKSB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9kb21fdGVzdC5neXAgYi9zcmMvY29iYWx0L2RvbS9kb21fdGVzdC5neXAKaW5kZXggM2MwYjUzNC4uNWFiNjk0OCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vZG9tX3Rlc3QuZ3lwCisrKyBiL3NyYy9jb2JhbHQvZG9tL2RvbV90ZXN0Lmd5cApAQCAtNzUsNyArNzUsNyBAQAogICAgICAgICAnPChERVBUSCkvY29iYWx0L2Jyb3dzZXIvYnJvd3Nlci5neXA6YnJvd3NlcicsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvY3NzX3BhcnNlci9jc3NfcGFyc2VyLmd5cDpjc3NfcGFyc2VyJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9kb20vZG9tLmd5cDpkb20nLAotICAgICAgICAnPChERVBUSCkvY29iYWx0L2RvbS9kb20uZ3lwOmRvbV90ZXN0aW5nJywKKyAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9kb20vdGVzdGluZy9kb21fdGVzdGluZy5neXA6ZG9tX3Rlc3RpbmcnLAogICAgICAgICAnPChERVBUSCkvY29iYWx0L2RvbV9wYXJzZXIvZG9tX3BhcnNlci5neXA6ZG9tX3BhcnNlcicsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvbG9hZGVyL2xvYWRlci5neXA6bG9hZGVyJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc2tpYS9za2lhLmd5cDpza2lhJywKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2VsZW1lbnRfdGVzdC5jYyBiL3NyYy9jb2JhbHQvZG9tL2VsZW1lbnRfdGVzdC5jYwppbmRleCAxOTMyMjY3Li41YzBiZTkzIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9lbGVtZW50X3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vZWxlbWVudF90ZXN0LmNjCkBAIC02MCwxMCArNjAsMTAgQEAKICAgICA6IGNzc19wYXJzZXJfKGNzc19wYXJzZXI6OlBhcnNlcjo6Q3JlYXRlKCkpLAogICAgICAgZG9tX3BhcnNlcl8obmV3IGRvbV9wYXJzZXI6OlBhcnNlcigpKSwKICAgICAgIGRvbV9zdGF0X3RyYWNrZXJfKG5ldyBEb21TdGF0VHJhY2tlcigiRWxlbWVudFRlc3QiKSksCi0gICAgICBodG1sX2VsZW1lbnRfY29udGV4dF8oTlVMTCwgY3NzX3BhcnNlcl8uZ2V0KCksIGRvbV9wYXJzZXJfLmdldCgpLCBOVUxMLAorICAgICAgaHRtbF9lbGVtZW50X2NvbnRleHRfKE5VTEwsIE5VTEwsIGNzc19wYXJzZXJfLmdldCgpLCBkb21fcGFyc2VyXy5nZXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIGRvbV9zdGF0X3RyYWNrZXJfLmdldCgpLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjprQXBwbGljYXRpb25TdGF0ZVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBkb21fc3RhdF90cmFja2VyXy5nZXQoKSwgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6a0FwcGxpY2F0aW9uU3RhdGVTdGFydGVkLCBOVUxMKSB7CiAgIEVYUEVDVF9UUlVFKEdsb2JhbFN0YXRzOjpHZXRJbnN0YW5jZSgpLT5DaGVja05vTGVha3MoKSk7CiAgIGRvY3VtZW50XyA9IG5ldyBEb2N1bWVudCgmaHRtbF9lbGVtZW50X2NvbnRleHRfKTsKICAgeG1sX2RvY3VtZW50XyA9IG5ldyBYTUxEb2N1bWVudCgmaHRtbF9lbGVtZW50X2NvbnRleHRfKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2VtZS9lbWVfaGVscGVycy5oIGIvc3JjL2NvYmFsdC9kb20vZW1lL2VtZV9oZWxwZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgzZTA0MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL2VtZS9lbWVfaGVscGVycy5oCkBAIC0wLDAgKzEsNjIgQEAKKy8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgQ09CQUxUX0RPTV9FTUVfRU1FX0hFTFBFUlNfSF8KKyNkZWZpbmUgQ09CQUxUX0RPTV9FTUVfRU1FX0hFTFBFUlNfSF8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF92YWx1ZV9mYWN0b3J5LmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2RybS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBkb20geworbmFtZXNwYWNlIGVtZSB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBQcm9taXNlVmFsdWVSZWZlcmVuY2VUeXBlPgordm9pZCBSZWplY3RQcm9taXNlKFByb21pc2VWYWx1ZVJlZmVyZW5jZVR5cGUqIHByb21pc2VfcmVmZXJlbmNlLAorICAgICAgICAgICAgICAgICAgIFNiRHJtU3RhdHVzIHN0YXR1cywgY29uc3Qgc3RkOjpzdHJpbmcmIGVycm9yX21lc3NhZ2UpIHsKKyAgc3dpdGNoIChzdGF0dXMpIHsKKyAgICBjYXNlIGtTYkRybVN0YXR1c1N1Y2Nlc3M6CisgICAgICBOT1RSRUFDSEVEKCkgPDwgIidrU2JEcm1TdGF0dXNTdWNjZXNzJyBpcyBub3QgYW4gZXJyb3IuIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2Uga1NiRHJtU3RhdHVzVHlwZUVycm9yOgorICAgICAgLy8gVE9ETzogUGFzcyB8ZXJyb3JfbWVzc2FnZXwgb25jZSB3ZSBzdXBwb3J0IG1lc3NhZ2Ugb24gc2ltcGxlIGVycm9ycy4KKyAgICAgIHByb21pc2VfcmVmZXJlbmNlLT52YWx1ZSgpLlJlamVjdChzY3JpcHQ6OmtUeXBlRXJyb3IpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBrU2JEcm1TdGF0dXNOb3RTdXBwb3J0ZWRFcnJvcjoKKyAgICAgIHByb21pc2VfcmVmZXJlbmNlLT52YWx1ZSgpLlJlamVjdCgKKyAgICAgICAgICBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbjo6a05vdFN1cHBvcnRlZEVyciwgZXJyb3JfbWVzc2FnZSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBrU2JEcm1TdGF0dXNJbnZhbGlkU3RhdGVFcnJvcjoKKyAgICAgIHByb21pc2VfcmVmZXJlbmNlLT52YWx1ZSgpLlJlamVjdCgKKyAgICAgICAgICBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbjo6a0ludmFsaWRTdGF0ZUVyciwgZXJyb3JfbWVzc2FnZSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBrU2JEcm1TdGF0dXNRdW90YUV4Y2VlZGVkRXJyb3I6CisgICAgICBwcm9taXNlX3JlZmVyZW5jZS0+dmFsdWUoKS5SZWplY3QoCisgICAgICAgICAgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb246OmtRdW90YUV4Y2VlZGVkRXJyLCBlcnJvcl9tZXNzYWdlKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGtTYkRybVN0YXR1c1Vua25vd25FcnJvcjoKKyAgICAgIHByb21pc2VfcmVmZXJlbmNlLT52YWx1ZSgpLlJlamVjdCgKKyAgICAgICAgICBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbjo6a05vbmUsIGVycm9yX21lc3NhZ2UpKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBlbWUKK30gIC8vIG5hbWVzcGFjZSBkb20KK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBDT0JBTFRfRE9NX0VNRV9FTUVfSEVMUEVSU19IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZW1lL21lZGlhX2tleV9tZXNzYWdlX3R5cGUuaWRsIGIvc3JjL2NvYmFsdC9kb20vZW1lL21lZGlhX2tleV9tZXNzYWdlX3R5cGUuaWRsCmluZGV4IDExMjU0NjMuLjBjMWYwZTAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2VtZS9tZWRpYV9rZXlfbWVzc2FnZV90eXBlLmlkbAorKysgYi9zcmMvY29iYWx0L2RvbS9lbWUvbWVkaWFfa2V5X21lc3NhZ2VfdHlwZS5pZGwKQEAgLTE2LDggKzE2LDcgQEAKIAogZW51bSBNZWRpYUtleU1lc3NhZ2VUeXBlIHsKICAgImxpY2Vuc2UtcmVxdWVzdCIsCi0gIC8vIFRPRE86IEltcGxlbWVudCBvdGhlciBtZXNzYWdlIHR5cGVzLgotICAvLyAibGljZW5zZS1yZW5ld2FsIiwKLSAgLy8gImxpY2Vuc2UtcmVsZWFzZSIsCi0gIC8vICJpbmRpdmlkdWFsaXphdGlvbi1yZXF1ZXN0IgorICAibGljZW5zZS1yZW5ld2FsIiwKKyAgImxpY2Vuc2UtcmVsZWFzZSIsCisgICJpbmRpdmlkdWFsaXphdGlvbi1yZXF1ZXN0IgogfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2VtZS9tZWRpYV9rZXlfc2Vzc2lvbi5jYyBiL3NyYy9jb2JhbHQvZG9tL2VtZS9tZWRpYV9rZXlfc2Vzc2lvbi5jYwppbmRleCA4ZGI5YzIwLi5hZDk5NWMzIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9lbWUvbWVkaWFfa2V5X3Nlc3Npb24uY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vZW1lL21lZGlhX2tleV9zZXNzaW9uLmNjCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSAiY29iYWx0L2RvbS9hcnJheV9idWZmZXIuaCIKICNpbmNsdWRlICJjb2JhbHQvZG9tL2FycmF5X2J1ZmZlcl92aWV3LmgiCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9kb21fZXhjZXB0aW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L2RvbS9lbWUvZW1lX2hlbHBlcnMuaCIKICNpbmNsdWRlICJjb2JhbHQvZG9tL2VtZS9tZWRpYV9rZXlfbWVzc2FnZV9ldmVudC5oIgogI2luY2x1ZGUgImNvYmFsdC9kb20vZW1lL21lZGlhX2tleV9tZXNzYWdlX2V2ZW50X2luaXQuaCIKICNpbmNsdWRlICJjb2JhbHQvZG9tL2VtZS9tZWRpYV9rZXlzLmgiCkBAIC0yMzIsNyArMjMzLDggQEAKIC8vIFNlZQogLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2VuY3J5cHRlZC1tZWRpYS8jZG9tLW1lZGlha2V5c2Vzc2lvbi1nZW5lcmF0ZXJlcXVlc3QuCiB2b2lkIE1lZGlhS2V5U2Vzc2lvbjo6T25TZXNzaW9uVXBkYXRlUmVxdWVzdEdlbmVyYXRlZCgKLSAgICBWb2lkUHJvbWlzZVZhbHVlOjpSZWZlcmVuY2UqIHByb21pc2VfcmVmZXJlbmNlLCBzY29wZWRfYXJyYXk8dWludDg+IG1lc3NhZ2UsCisgICAgVm9pZFByb21pc2VWYWx1ZTo6UmVmZXJlbmNlKiBwcm9taXNlX3JlZmVyZW5jZSwKKyAgICBTYkRybVNlc3Npb25SZXF1ZXN0VHlwZSB0eXBlLCBzY29wZWRfYXJyYXk8dWludDg+IG1lc3NhZ2UsCiAgICAgaW50IG1lc3NhZ2Vfc2l6ZSkgewogICBNZWRpYUtleU1lc3NhZ2VFdmVudEluaXQgbWVkaWFfa2V5X21lc3NhZ2VfZXZlbnRfaW5pdDsKICAgLy8gMTAuOS40LiBJZiBhIGxpY2Vuc2UgcmVxdWVzdCBmb3IgdGhlIHJlcXVlc3RlZCBsaWNlbnNlIHR5cGUgY2FuIGJlCkBAIC0yNTEsOCArMjUzLDI0IEBACiAgIC8vCiAgIC8vIFRPRE86IEludHJvZHVjZSBtZXNzYWdlIHR5cGUgcGFyYW1ldGVyIHRvIHxTYkRybVNlc3Npb25VcGRhdGVSZXF1ZXN0RnVuY3wKICAgLy8gICAgICAgYW5kIHN0b3AgcHJldGVuZGluZyB0aGF0IGFsbCBtZXNzYWdlcyBhcmUgbGljZW5zZSByZXF1ZXN0cy4KLSAgbWVkaWFfa2V5X21lc3NhZ2VfZXZlbnRfaW5pdC5zZXRfbWVzc2FnZV90eXBlKAotICAgICAga01lZGlhS2V5TWVzc2FnZVR5cGVMaWNlbnNlUmVxdWVzdCk7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2Uga1NiRHJtU2Vzc2lvblJlcXVlc3RUeXBlTGljZW5zZVJlcXVlc3Q6CisgICAgICBtZWRpYV9rZXlfbWVzc2FnZV9ldmVudF9pbml0LnNldF9tZXNzYWdlX3R5cGUoCisgICAgICAgICAga01lZGlhS2V5TWVzc2FnZVR5cGVMaWNlbnNlUmVxdWVzdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGtTYkRybVNlc3Npb25SZXF1ZXN0VHlwZUxpY2Vuc2VSZW5ld2FsOgorICAgICAgbWVkaWFfa2V5X21lc3NhZ2VfZXZlbnRfaW5pdC5zZXRfbWVzc2FnZV90eXBlKAorICAgICAgICAgIGtNZWRpYUtleU1lc3NhZ2VUeXBlTGljZW5zZVJlbmV3YWwpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBrU2JEcm1TZXNzaW9uUmVxdWVzdFR5cGVMaWNlbnNlUmVsZWFzZToKKyAgICAgIG1lZGlhX2tleV9tZXNzYWdlX2V2ZW50X2luaXQuc2V0X21lc3NhZ2VfdHlwZSgKKyAgICAgICAgICBrTWVkaWFLZXlNZXNzYWdlVHlwZUxpY2Vuc2VSZWxlYXNlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2Uga1NiRHJtU2Vzc2lvblJlcXVlc3RUeXBlSW5kaXZpZHVhbGl6YXRpb25SZXF1ZXN0OgorICAgICAgbWVkaWFfa2V5X21lc3NhZ2VfZXZlbnRfaW5pdC5zZXRfbWVzc2FnZV90eXBlKAorICAgICAgICAgIGtNZWRpYUtleU1lc3NhZ2VUeXBlSW5kaXZpZHVhbGl6YXRpb25SZXF1ZXN0KTsKKyAgICAgIGJyZWFrOworICB9CiAKICAgLy8gMTAuMy4gTGV0IHRoaXMgb2JqZWN0J3MgY2FsbGFibGUgdmFsdWUgYmUgdHJ1ZS4KICAgY2FsbGFibGVfID0gdHJ1ZTsKQEAgLTI3OSwxMiArMjk3LDEyIEBACiAvLyBTZWUKIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9lbmNyeXB0ZWQtbWVkaWEvI2RvbS1tZWRpYWtleXNlc3Npb24tZ2VuZXJhdGVyZXF1ZXN0Lgogdm9pZCBNZWRpYUtleVNlc3Npb246Ok9uU2Vzc2lvblVwZGF0ZVJlcXVlc3REaWROb3RHZW5lcmF0ZSgKLSAgICBWb2lkUHJvbWlzZVZhbHVlOjpSZWZlcmVuY2UqIHByb21pc2VfcmVmZXJlbmNlKSB7CisgICAgVm9pZFByb21pc2VWYWx1ZTo6UmVmZXJlbmNlKiBwcm9taXNlX3JlZmVyZW5jZSwgU2JEcm1TdGF0dXMgc3RhdHVzLAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBlcnJvcl9tZXNzYWdlKSB7CiAgIC8vIDEwLjEwLjEuIElmIGFueSBvZiB0aGUgcHJlY2VkaW5nIHN0ZXBzIGZhaWxlZCwgcmVqZWN0IHByb21pc2Ugd2l0aCBhIG5ldwogICAvLyAgICAgICAgICBET01FeGNlcHRpb24gd2hvc2UgbmFtZSBpcyB0aGUgYXBwcm9wcmlhdGUgZXJyb3IgbmFtZS4KICAgLy8KLSAgLy8gVE9ETzogSW50cm9kdWNlIFN0YXJib2FyZCBBUEkgdGhhdCBhbGxvd3MgQ0RNIHRvIHByb3BhZ2F0ZSBlcnJvciBjb2Rlcy4KLSAgcHJvbWlzZV9yZWZlcmVuY2UtPnZhbHVlKCkuUmVqZWN0KG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uOjprTm9uZSkpOworICBSZWplY3RQcm9taXNlKHByb21pc2VfcmVmZXJlbmNlLCBzdGF0dXMsIGVycm9yX21lc3NhZ2UpOwogfQogCiAvLyBTZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL2VuY3J5cHRlZC1tZWRpYS8jZG9tLW1lZGlha2V5c2Vzc2lvbi11cGRhdGUuCkBAIC0zMDcsMTIgKzMyNSwxMiBAQAogCiAvLyBTZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL2VuY3J5cHRlZC1tZWRpYS8jZG9tLW1lZGlha2V5c2Vzc2lvbi11cGRhdGUuCiB2b2lkIE1lZGlhS2V5U2Vzc2lvbjo6T25TZXNzaW9uRGlkTm90VXBkYXRlKAotICAgIFZvaWRQcm9taXNlVmFsdWU6OlJlZmVyZW5jZSogcHJvbWlzZV9yZWZlcmVuY2UpIHsKKyAgICBWb2lkUHJvbWlzZVZhbHVlOjpSZWZlcmVuY2UqIHByb21pc2VfcmVmZXJlbmNlLCBTYkRybVN0YXR1cyBzdGF0dXMsCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGVycm9yX21lc3NhZ2UpIHsKICAgLy8gOC4xLjMuIElmIGFueSBvZiB0aGUgcHJlY2VkaW5nIHN0ZXBzIGZhaWxlZCwgcmVqZWN0IHByb21pc2Ugd2l0aCBhIG5ldwogICAvLyAgICAgICAgRE9NRXhjZXB0aW9uIHdob3NlIG5hbWUgaXMgdGhlIGFwcHJvcHJpYXRlIGVycm9yIG5hbWUuCiAgIC8vCi0gIC8vIFRPRE86IEludHJvZHVjZSBTdGFyYm9hcmQgQVBJIHRoYXQgYWxsb3dzIENETSB0byBwcm9wYWdhdGUgZXJyb3IgY29kZXMuCi0gIHByb21pc2VfcmVmZXJlbmNlLT52YWx1ZSgpLlJlamVjdChuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbjo6a05vbmUpKTsKKyAgUmVqZWN0UHJvbWlzZShwcm9taXNlX3JlZmVyZW5jZSwgc3RhdHVzLCBlcnJvcl9tZXNzYWdlKTsKIH0KIAogLy8gU2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9lbmNyeXB0ZWQtbWVkaWEvI3VwZGF0ZS1rZXktc3RhdHVzZXMuCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9lbWUvbWVkaWFfa2V5X3Nlc3Npb24uaCBiL3NyYy9jb2JhbHQvZG9tL2VtZS9tZWRpYV9rZXlfc2Vzc2lvbi5oCmluZGV4IGNkZDM5YWIuLjRhMDI2YTMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2VtZS9tZWRpYV9rZXlfc2Vzc2lvbi5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL2VtZS9tZWRpYV9rZXlfc2Vzc2lvbi5oCkBAIC03MCwxMSArNzAsMTUgQEAKIAogICB2b2lkIE9uU2Vzc2lvblVwZGF0ZVJlcXVlc3RHZW5lcmF0ZWQoCiAgICAgICBWb2lkUHJvbWlzZVZhbHVlOjpSZWZlcmVuY2UqIHByb21pc2VfcmVmZXJlbmNlLAotICAgICAgc2NvcGVkX2FycmF5PHVpbnQ4PiBtZXNzYWdlLCBpbnQgbWVzc2FnZV9zaXplKTsKKyAgICAgIFNiRHJtU2Vzc2lvblJlcXVlc3RUeXBlIHR5cGUsIHNjb3BlZF9hcnJheTx1aW50OD4gbWVzc2FnZSwKKyAgICAgIGludCBtZXNzYWdlX3NpemUpOwogICB2b2lkIE9uU2Vzc2lvblVwZGF0ZVJlcXVlc3REaWROb3RHZW5lcmF0ZSgKLSAgICAgIFZvaWRQcm9taXNlVmFsdWU6OlJlZmVyZW5jZSogcHJvbWlzZV9yZWZlcmVuY2UpOworICAgICAgVm9pZFByb21pc2VWYWx1ZTo6UmVmZXJlbmNlKiBwcm9taXNlX3JlZmVyZW5jZSwgU2JEcm1TdGF0dXMgc3RhdHVzLAorICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGVycm9yX21lc3NhZ2UpOwogICB2b2lkIE9uU2Vzc2lvblVwZGF0ZWQoVm9pZFByb21pc2VWYWx1ZTo6UmVmZXJlbmNlKiBwcm9taXNlX3JlZmVyZW5jZSk7Ci0gIHZvaWQgT25TZXNzaW9uRGlkTm90VXBkYXRlKFZvaWRQcm9taXNlVmFsdWU6OlJlZmVyZW5jZSogcHJvbWlzZV9yZWZlcmVuY2UpOworICB2b2lkIE9uU2Vzc2lvbkRpZE5vdFVwZGF0ZShWb2lkUHJvbWlzZVZhbHVlOjpSZWZlcmVuY2UqIHByb21pc2VfcmVmZXJlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkRybVN0YXR1cyBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBlcnJvcl9tZXNzYWdlKTsKICAgdm9pZCBPblNlc3Npb25VcGRhdGVLZXlTdGF0dXNlcygKICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYga2V5X2lkcywKICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFNiRHJtS2V5U3RhdHVzPiYga2V5X3N0YXR1c2VzKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2VtZS9tZWRpYV9rZXlzLmNjIGIvc3JjL2NvYmFsdC9kb20vZW1lL21lZGlhX2tleXMuY2MKaW5kZXggMzUxZWJmYS4uYzFlNmUyZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vZW1lL21lZGlhX2tleXMuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vZW1lL21lZGlhX2tleXMuY2MKQEAgLTE2LDYgKzE2LDcgQEAKIAogI2luY2x1ZGUgImJhc2UvYmluZC5oIgogI2luY2x1ZGUgImNvYmFsdC9kb20vZG9tX2V4Y2VwdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vZW1lL2VtZV9oZWxwZXJzLmgiCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9lbWUvbWVkaWFfa2V5X3Nlc3Npb24uaCIKIAogbmFtZXNwYWNlIGNvYmFsdCB7CkBAIC00OCw2ICs0OSw0NyBAQAogICByZXR1cm4gc2Vzc2lvbjsKIH0KIAorTWVkaWFLZXlzOjpCb29sUHJvbWlzZUhhbmRsZSBNZWRpYUtleXM6OlNldFNlcnZlckNlcnRpZmljYXRlKAorICAgIGNvbnN0IEJ1ZmZlclNvdXJjZSYgc2VydmVyX2NlcnRpZmljYXRlKSB7CisgIEJvb2xQcm9taXNlSGFuZGxlIHByb21pc2UgPSBzY3JpcHRfdmFsdWVfZmFjdG9yeV8tPkNyZWF0ZUJhc2ljUHJvbWlzZTxib29sPigpOworCisgIC8vIDEuIElmIHRoZSBLZXkgU3lzdGVtIGltcGxlbWVudGF0aW9uIHJlcHJlc2VudGVkIGJ5IHRoaXMgb2JqZWN0J3MgY2RtCisgIC8vICAgIGltcGxlbWVudGF0aW9uIHZhbHVlIGRvZXMgbm90IHN1cHBvcnQgc2VydmVyIGNlcnRpZmljYXRlcywgcmV0dXJuIGEKKyAgLy8gICAgcHJvbWlzZSByZXNvbHZlZCB3aXRoIGZhbHNlLgorICBpZiAoIWRybV9zeXN0ZW1fLT5Jc1NlcnZlckNlcnRpZmljYXRlVXBkYXRhYmxlKCkpIHsKKyAgICBwcm9taXNlLT5SZXNvbHZlKGZhbHNlKTsKKyAgICByZXR1cm4gcHJvbWlzZTsKKyAgfQorCisgIC8vIDIuIElmIHNlcnZlckNlcnRpZmljYXRlIGlzIGFuIGVtcHR5IGFycmF5LCByZXR1cm4gYSBwcm9taXNlIHJlamVjdGVkIHdpdGggYQorICAvLyAgICBuZXdseSBjcmVhdGVkIFR5cGVFcnJvci4KKyAgY29uc3QgdWludDgqIHNlcnZlcl9jZXJ0aWZpY2F0ZV9idWZmZXI7CisgIGludCBzZXJ2ZXJfY2VydGlmaWNhdGVfYnVmZmVyX3NpemUgPSAwOworICBHZXRCdWZmZXJBbmRTaXplKHNlcnZlcl9jZXJ0aWZpY2F0ZSwgJnNlcnZlcl9jZXJ0aWZpY2F0ZV9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgJnNlcnZlcl9jZXJ0aWZpY2F0ZV9idWZmZXJfc2l6ZSk7CisKKyAgaWYgKHNlcnZlcl9jZXJ0aWZpY2F0ZV9idWZmZXJfc2l6ZSA9PSAwKSB7CisgICAgcHJvbWlzZS0+UmVqZWN0KHNjcmlwdDo6a1R5cGVFcnJvcik7CisgICAgcmV0dXJuIHByb21pc2U7CisgIH0KKworICAvLyAzLiBMZXQgY2VydGlmaWNhdGUgYmUgYSBjb3B5IG9mIHRoZSBjb250ZW50cyBvZiB0aGUgc2VydmVyQ2VydGlmaWNhdGUKKyAgLy8gICAgcGFyYW1ldGVyLgorICAvLyA0LiBMZXQgcHJvbWlzZSBiZSBhIG5ldyBwcm9taXNlLgorICAvLyA1LiBSdW4gdGhlIGZvbGxvd2luZyBzdGVwcyBpbiBwYXJhbGxlbDoKKyAgLy8gNS4xIExldCBzYW5pdGl6ZWQgY2VydGlmaWNhdGUgYmUgYSB2YWxpZGF0ZWQgYW5kL29yIHNhbml0aXplZCB2ZXJzaW9uIG9mCisgIC8vICAgICBjZXJ0aWZpY2F0ZS4KKyAgLy8gNS4yIFVzZSB0aGlzIG9iamVjdCdzIGNkbSBpbnN0YW5jZSB0byBwcm9jZXNzIHNhbml0aXplZCBjZXJ0aWZpY2F0ZS4KKyAgZHJtX3N5c3RlbV8tPlVwZGF0ZVNlcnZlckNlcnRpZmljYXRlKAorICAgICAgc2VydmVyX2NlcnRpZmljYXRlX2J1ZmZlciwgc2VydmVyX2NlcnRpZmljYXRlX2J1ZmZlcl9zaXplLAorICAgICAgYmFzZTo6QmluZCgmTWVkaWFLZXlzOjpPblNlcnZlckNlcnRpZmljYXRlVXBkYXRlZCwgYmFzZTo6QXNXZWFrUHRyKHRoaXMpLAorICAgICAgICAgICAgICAgICBiYXNlOjpPd25lZChuZXcgQm9vbFByb21pc2VWYWx1ZTo6UmVmZXJlbmNlKHRoaXMsIHByb21pc2UpKSkpOworCisgIC8vIDUuMyBhbmQgNS40IGFyZSBwZW5kaW5nIHByb2Nlc3NpbmcgaW4gT25TZXJ2ZXJDZXJ0aWZpY2F0ZVVwZGF0ZWQoKS4KKyAgLy8gNi4gUmV0dXJuIHByb21pc2UuCisgIHJldHVybiBwcm9taXNlOworfQorCiB2b2lkIE1lZGlhS2V5czo6T25TZXNzaW9uQ2xvc2VkKE1lZGlhS2V5U2Vzc2lvbiogc2Vzc2lvbikgewogICAvLyBFcmFzZS1yZW1vdmUgaWRpb20sIHNlZQogICAvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FcmFzZSVFMiU4MCU5M3JlbW92ZV9pZGlvbS4KQEAgLTU2LDYgKzk4LDE5IEBACiAgICAgICBvcGVuX3Nlc3Npb25zXy5lbmQoKSk7CiB9CiAKK3ZvaWQgTWVkaWFLZXlzOjpPblNlcnZlckNlcnRpZmljYXRlVXBkYXRlZCgKKyAgICBCb29sUHJvbWlzZVZhbHVlOjpSZWZlcmVuY2UqIHByb21pc2VfcmVmZXJlbmNlLCBTYkRybVN0YXR1cyBzdGF0dXMsCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGVycm9yX21lc3NhZ2UpIHsKKyAgLy8gNS4zIElmIHRoZSBwcmVjZWRpbmcgc3RlcCBmYWlsZWQsIHJlc29sdmUgcHJvbWlzZSB3aXRoIGEgbmV3IERPTUV4Y2VwdGlvbgorICAvLyAgICAgd2hvc2UgbmFtZSBpcyB0aGUgYXBwcm9wcmlhdGUgZXJyb3IgbmFtZS4KKyAgaWYgKHN0YXR1cyAhPSBrU2JEcm1TdGF0dXNTdWNjZXNzKSB7CisgICAgUmVqZWN0UHJvbWlzZShwcm9taXNlX3JlZmVyZW5jZSwgc3RhdHVzLCBlcnJvcl9tZXNzYWdlKTsKKyAgICByZXR1cm47CisgIH0KKyAgLy8gNS40IFJlc29sdmUgcHJvbWlzZSB3aXRoIHRydWUuCisgIHByb21pc2VfcmVmZXJlbmNlLT52YWx1ZSgpLlJlc29sdmUodHJ1ZSk7Cit9CisKIHZvaWQgTWVkaWFLZXlzOjpUcmFjZU1lbWJlcnMoc2NyaXB0OjpUcmFjZXIqIHRyYWNlcikgewogICB0cmFjZXItPlRyYWNlSXRlbXMob3Blbl9zZXNzaW9uc18pOwogfQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZW1lL21lZGlhX2tleXMuaCBiL3NyYy9jb2JhbHQvZG9tL2VtZS9tZWRpYV9rZXlzLmgKaW5kZXggNzU5YTllMi4uZmYxMzMwZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vZW1lL21lZGlhX2tleXMuaAorKysgYi9zcmMvY29iYWx0L2RvbS9lbWUvbWVkaWFfa2V5cy5oCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSAiY29iYWx0L21lZGlhL2Jhc2UvZHJtX3N5c3RlbS5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlX2ZhY3RvcnkuaCIKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9kcm0uaCIKIAogbmFtZXNwYWNlIGNvYmFsdCB7CiBuYW1lc3BhY2UgZG9tIHsKQEAgLTM4LDYgKzM5LDggQEAKICAgICAgICAgICAgICAgICAgIHB1YmxpYyBiYXNlOjpTdXBwb3J0c1dlYWtQdHI8TWVkaWFLZXlzPiB7CiAgcHVibGljOgogICAvLyBDdXN0b20sIG5vdCBpbiBhbnkgc3BlYy4KKyAgdHlwZWRlZiBzY3JpcHQ6OkhhbmRsZTxzY3JpcHQ6OlByb21pc2U8Ym9vbD4+IEJvb2xQcm9taXNlSGFuZGxlOworICB0eXBlZGVmIHNjcmlwdDo6U2NyaXB0VmFsdWU8c2NyaXB0OjpQcm9taXNlPGJvb2w+PiBCb29sUHJvbWlzZVZhbHVlOwogCiAgIE1lZGlhS2V5cyhjb25zdCBzdGQ6OnN0cmluZyYga2V5X3N5c3RlbSwKICAgICAgICAgICAgIHNjcmlwdDo6U2NyaXB0VmFsdWVGYWN0b3J5KiBzY3JpcHRfdmFsdWVfZmFjdG9yeSk7CkBAIC00OSw2ICs1Miw4IEBACiAgIHNjb3BlZF9yZWZwdHI8TWVkaWFLZXlTZXNzaW9uPiBDcmVhdGVTZXNzaW9uKAogICAgICAgTWVkaWFLZXlTZXNzaW9uVHlwZSBzZXNzaW9uX3R5cGUsCiAgICAgICBzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlKiBleGNlcHRpb25fc3RhdGUpOworICBCb29sUHJvbWlzZUhhbmRsZSBTZXRTZXJ2ZXJDZXJ0aWZpY2F0ZSgKKyAgICAgIGNvbnN0IEJ1ZmZlclNvdXJjZSYgc2VydmVyX2NlcnRpZmljYXRlKTsKIAogICBERUZJTkVfV1JBUFBBQkxFX1RZUEUoTWVkaWFLZXlzKTsKICAgdm9pZCBUcmFjZU1lbWJlcnMoc2NyaXB0OjpUcmFjZXIqIHRyYWNlcikgb3ZlcnJpZGU7CkBAIC01Nyw2ICs2Miw5IEBACiAgIH5NZWRpYUtleXMoKSBvdmVycmlkZTsKIAogICB2b2lkIE9uU2Vzc2lvbkNsb3NlZChNZWRpYUtleVNlc3Npb24qIHNlc3Npb24pOworICB2b2lkIE9uU2VydmVyQ2VydGlmaWNhdGVVcGRhdGVkKAorICAgICAgQm9vbFByb21pc2VWYWx1ZTo6UmVmZXJlbmNlKiBwcm9taXNlX3JlZmVyZW5jZSwgU2JEcm1TdGF0dXMgc3RhdHVzLAorICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGVycm9yX21lc3NhZ2UpOwogCiAgIHNjcmlwdDo6U2NyaXB0VmFsdWVGYWN0b3J5KiBzY3JpcHRfdmFsdWVfZmFjdG9yeV87CiAgIHNjb3BlZF9yZWZwdHI8bWVkaWE6OkRybVN5c3RlbT4gZHJtX3N5c3RlbV87CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9lbWUvbWVkaWFfa2V5cy5pZGwgYi9zcmMvY29iYWx0L2RvbS9lbWUvbWVkaWFfa2V5cy5pZGwKaW5kZXggZmMxYTM1Zi4uMjUwZjU3NiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vZW1lL21lZGlhX2tleXMuaWRsCisrKyBiL3NyYy9jb2JhbHQvZG9tL2VtZS9tZWRpYV9rZXlzLmlkbApAQCAtMTcsNiArMTcsNSBAQAogaW50ZXJmYWNlIE1lZGlhS2V5cyB7CiAgIFtSYWlzZXNFeGNlcHRpb25dIE1lZGlhS2V5U2Vzc2lvbiBjcmVhdGVTZXNzaW9uKAogICAgICAgb3B0aW9uYWwgTWVkaWFLZXlTZXNzaW9uVHlwZSBzZXNzaW9uVHlwZSA9ICJ0ZW1wb3JhcnkiKTsKLSAgLy8gVE9ETzogVHJpdmlhbGx5IGltcGxlbWVudCBzZXJ2ZXIgY2VydGlmaWNhdGVzLgotICAvLyBQcm9taXNlPGJvb2xlYW4+IHNldFNlcnZlckNlcnRpZmljYXRlKEJ1ZmZlclNvdXJjZSBzZXJ2ZXJDZXJ0aWZpY2F0ZSk7CisgIFByb21pc2U8Ym9vbGVhbj4gc2V0U2VydmVyQ2VydGlmaWNhdGUoQnVmZmVyU291cmNlIHNlcnZlckNlcnRpZmljYXRlKTsKIH07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9lcnJvcl9ldmVudF90ZXN0LmNjIGIvc3JjL2NvYmFsdC9kb20vZXJyb3JfZXZlbnRfdGVzdC5jYwppbmRleCA4MmFkMTVmLi44NWQ0ZTdhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9lcnJvcl9ldmVudF90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL2Vycm9yX2V2ZW50X3Rlc3QuY2MKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlICJiYXNlL2JpbmQuaCIKICNpbmNsdWRlICJiYXNlL2NhbGxiYWNrLmgiCiAjaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgorI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3BsYXRmb3JtX3RocmVhZC5oIgogI2luY2x1ZGUgImNvYmFsdC9jc3NfcGFyc2VyL3BhcnNlci5oIgogI2luY2x1ZGUgImNvYmFsdC9kb20vZXJyb3JfZXZlbnRfaW5pdC5oIgogI2luY2x1ZGUgImNvYmFsdC9kb20vbG9jYWxfc3RvcmFnZV9kYXRhYmFzZS5oIgpAQCAtMjYsNiArMjcsNyBAQAogI2luY2x1ZGUgImNvYmFsdC9kb20vd2luZG93LmgiCiAjaW5jbHVkZSAiY29iYWx0L2RvbV9wYXJzZXIvcGFyc2VyLmgiCiAjaW5jbHVkZSAiY29iYWx0L2xvYWRlci9mZXRjaGVyX2ZhY3RvcnkuaCIKKyNpbmNsdWRlICJjb2JhbHQvbG9hZGVyL2xvYWRlcl9mYWN0b3J5LmgiCiAjaW5jbHVkZSAiY29iYWx0L21lZGlhX3Nlc3Npb24vbWVkaWFfc2Vzc2lvbi5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9qYXZhc2NyaXB0X2VuZ2luZS5oIgpAQCAtNTYsMjYgKzU4LDMwIEBACiAgICAgICAgIGNzc19wYXJzZXJfKGNzc19wYXJzZXI6OlBhcnNlcjo6Q3JlYXRlKCkpLAogICAgICAgICBkb21fcGFyc2VyXyhuZXcgZG9tX3BhcnNlcjo6UGFyc2VyKG1vY2tfZXJyb3JfY2FsbGJhY2tfKSksCiAgICAgICAgIGZldGNoZXJfZmFjdG9yeV8obmV3IGxvYWRlcjo6RmV0Y2hlckZhY3RvcnkoTlVMTCkpLAorICAgICAgICBsb2FkZXJfZmFjdG9yeV8obmV3IGxvYWRlcjo6TG9hZGVyRmFjdG9yeSgKKyAgICAgICAgICAgIGZldGNoZXJfZmFjdG9yeV8uZ2V0KCksIE5VTEwsIGJhc2U6OmtUaHJlYWRQcmlvcml0eV9EZWZhdWx0KSksCiAgICAgICAgIGxvY2FsX3N0b3JhZ2VfZGF0YWJhc2VfKE5VTEwpLAotICAgICAgICB1cmxfKCJhYm91dDpibGFuayIpLAotICAgICAgICB3aW5kb3dfKG5ldyBXaW5kb3coCi0gICAgICAgICAgICAxOTIwLCAxMDgwLCAxLmYsIGJhc2U6OmtBcHBsaWNhdGlvblN0YXRlU3RhcnRlZCwgY3NzX3BhcnNlcl8uZ2V0KCksCi0gICAgICAgICAgICBkb21fcGFyc2VyXy5nZXQoKSwgZmV0Y2hlcl9mYWN0b3J5Xy5nZXQoKSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKLSAgICAgICAgICAgIE5VTEwsIE5VTEwsICZsb2NhbF9zdG9yYWdlX2RhdGFiYXNlXywgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKLSAgICAgICAgICAgIE5VTEwsIE5VTEwsIHVybF8sICIiLCAiZW4tVVMiLCAiZW4iLAotICAgICAgICAgICAgYmFzZTo6Q2FsbGJhY2s8dm9pZChjb25zdCBHVVJMJik+KCksCi0gICAgICAgICAgICBiYXNlOjpCaW5kKCZNb2NrRXJyb3JDYWxsYmFjazo6UnVuLAotICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKCZtb2NrX2Vycm9yX2NhbGxiYWNrXykpLAotICAgICAgICAgICAgTlVMTCwgbmV0d29ya19icmlkZ2U6OlBvc3RTZW5kZXIoKSwgY3NwOjprQ1NQUmVxdWlyZWQsCi0gICAgICAgICAgICBrQ3NwRW5mb3JjZW1lbnRFbmFibGUsIGJhc2U6OkNsb3N1cmUoKSAvKiBjc3BfcG9saWN5X2NoYW5nZWQgKi8sCi0gICAgICAgICAgICBiYXNlOjpDbG9zdXJlKCkgLyogcmFuX2FuaW1hdGlvbl9mcmFtZV9jYWxsYmFja3MgKi8sCi0gICAgICAgICAgICBkb206OldpbmRvdzo6Q2xvc2VDYWxsYmFjaygpIC8qIHdpbmRvd19jbG9zZSAqLywKLSAgICAgICAgICAgIGJhc2U6OkNsb3N1cmUoKSAvKiB3aW5kb3dfbWluaW1pemUgKi8sIE5VTEwsIE5VTEwsIE5VTEwsCi0gICAgICAgICAgICBkb206OldpbmRvdzo6T25TdGFydERpc3BhdGNoRXZlbnRDYWxsYmFjaygpLAotICAgICAgICAgICAgZG9tOjpXaW5kb3c6Ok9uU3RvcERpc3BhdGNoRXZlbnRDYWxsYmFjaygpLAotICAgICAgICAgICAgZG9tOjpTY3JlZW5zaG90TWFuYWdlcjo6UHJvdmlkZVNjcmVlbnNob3RGdW5jdGlvbkNhbGxiYWNrKCkpKSB7CisgICAgICAgIHVybF8oImFib3V0OmJsYW5rIikgewogICAgIGVuZ2luZV8gPSBzY3JpcHQ6OkphdmFTY3JpcHRFbmdpbmU6OkNyZWF0ZUVuZ2luZSgpOwogICAgIGdsb2JhbF9lbnZpcm9ubWVudF8gPSBlbmdpbmVfLT5DcmVhdGVHbG9iYWxFbnZpcm9ubWVudCgpOworCisgICAgd2luZG93XyA9IG5ldyBXaW5kb3coCisgICAgICAgIDE5MjAsIDEwODAsIDEuZiwgYmFzZTo6a0FwcGxpY2F0aW9uU3RhdGVTdGFydGVkLCBjc3NfcGFyc2VyXy5nZXQoKSwKKyAgICAgICAgZG9tX3BhcnNlcl8uZ2V0KCksIGZldGNoZXJfZmFjdG9yeV8uZ2V0KCksIGxvYWRlcl9mYWN0b3J5Xy5nZXQoKSwgTlVMTCwKKyAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgJmxvY2FsX3N0b3JhZ2VfZGF0YWJhc2VfLCBOVUxMLCBOVUxMLAorICAgICAgICBOVUxMLCBOVUxMLCBnbG9iYWxfZW52aXJvbm1lbnRfLT5zY3JpcHRfdmFsdWVfZmFjdG9yeSgpLCBOVUxMLCBOVUxMLAorICAgICAgICB1cmxfLCAiIiwgImVuLVVTIiwgImVuIiwgYmFzZTo6Q2FsbGJhY2s8dm9pZChjb25zdCBHVVJMJik+KCksCisgICAgICAgIGJhc2U6OkJpbmQoJk1vY2tFcnJvckNhbGxiYWNrOjpSdW4sCisgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCgmbW9ja19lcnJvcl9jYWxsYmFja18pKSwKKyAgICAgICAgTlVMTCwgbmV0d29ya19icmlkZ2U6OlBvc3RTZW5kZXIoKSwgY3NwOjprQ1NQUmVxdWlyZWQsCisgICAgICAgIGtDc3BFbmZvcmNlbWVudEVuYWJsZSwgYmFzZTo6Q2xvc3VyZSgpIC8qIGNzcF9wb2xpY3lfY2hhbmdlZCAqLywKKyAgICAgICAgYmFzZTo6Q2xvc3VyZSgpIC8qIHJhbl9hbmltYXRpb25fZnJhbWVfY2FsbGJhY2tzICovLAorICAgICAgICBkb206OldpbmRvdzo6Q2xvc2VDYWxsYmFjaygpIC8qIHdpbmRvd19jbG9zZSAqLywKKyAgICAgICAgYmFzZTo6Q2xvc3VyZSgpIC8qIHdpbmRvd19taW5pbWl6ZSAqLywgTlVMTCwgTlVMTCwgTlVMTCwKKyAgICAgICAgZG9tOjpXaW5kb3c6Ok9uU3RhcnREaXNwYXRjaEV2ZW50Q2FsbGJhY2soKSwKKyAgICAgICAgZG9tOjpXaW5kb3c6Ok9uU3RvcERpc3BhdGNoRXZlbnRDYWxsYmFjaygpLAorICAgICAgICBkb206OlNjcmVlbnNob3RNYW5hZ2VyOjpQcm92aWRlU2NyZWVuc2hvdEZ1bmN0aW9uQ2FsbGJhY2soKSwgTlVMTCk7CisKICAgICBnbG9iYWxfZW52aXJvbm1lbnRfLT5DcmVhdGVHbG9iYWxPYmplY3Qod2luZG93XywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnRfc2V0dGluZ3NfLmdldCgpKTsKICAgfQpAQCAtOTIsOSArOTgsMTAgQEAKICAgc2NvcGVkX3B0cjxjc3NfcGFyc2VyOjpQYXJzZXI+IGNzc19wYXJzZXJfOwogICBzY29wZWRfcHRyPGRvbV9wYXJzZXI6OlBhcnNlcj4gZG9tX3BhcnNlcl87CiAgIHNjb3BlZF9wdHI8bG9hZGVyOjpGZXRjaGVyRmFjdG9yeT4gZmV0Y2hlcl9mYWN0b3J5XzsKKyAgc2NvcGVkX3B0cjxsb2FkZXI6OkxvYWRlckZhY3Rvcnk+IGxvYWRlcl9mYWN0b3J5XzsKICAgZG9tOjpMb2NhbFN0b3JhZ2VEYXRhYmFzZSBsb2NhbF9zdG9yYWdlX2RhdGFiYXNlXzsKICAgR1VSTCB1cmxfOwotICBjb25zdCBzY29wZWRfcmVmcHRyPFdpbmRvdz4gd2luZG93XzsKKyAgc2NvcGVkX3JlZnB0cjxXaW5kb3c+IHdpbmRvd187CiB9OwogCiBib29sIEVycm9yRXZlbnRUZXN0OjpFdmFsdWF0ZVNjcmlwdChjb25zdCBzdGQ6OnN0cmluZyYganNfY29kZSwKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2V2ZW50LmNjIGIvc3JjL2NvYmFsdC9kb20vZXZlbnQuY2MKaW5kZXggZGExYTA4NS4uNmYzZDk5MyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vZXZlbnQuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vZXZlbnQuY2MKQEAgLTIzLDQyICsyMyw0OCBAQAogCiBFdmVudDo6RXZlbnQoVW5pbml0aWFsaXplZEZsYWcgLyogdW5pbml0aWFsaXplZF9mbGFnICovKQogICAgIDogZXZlbnRfcGhhc2VfKGtOb25lKSwKLSAgICAgIHRpbWVfc3RhbXBfKHN0YXRpY19jYXN0PHVpbnQ2ND4oYmFzZTo6VGltZTo6Tm93KCkuVG9Kc1RpbWUoKSkpIHsKKyAgICAgIHRpbWVfc3RhbXBfKEdldEV2ZW50VGltZShTYlRpbWVHZXRNb25vdG9uaWNOb3coKSkpIHsKICAgSW5pdEV2ZW50SW50ZXJuYWwoYmFzZTo6VG9rZW4oKSwgZmFsc2UsIGZhbHNlKTsKIH0KIAogRXZlbnQ6OkV2ZW50KGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlKQogICAgIDogZXZlbnRfcGhhc2VfKGtOb25lKSwKLSAgICAgIHRpbWVfc3RhbXBfKHN0YXRpY19jYXN0PHVpbnQ2ND4oYmFzZTo6VGltZTo6Tm93KCkuVG9Kc1RpbWUoKSkpIHsKKyAgICAgIHRpbWVfc3RhbXBfKEdldEV2ZW50VGltZShTYlRpbWVHZXRNb25vdG9uaWNOb3coKSkpIHsKICAgSW5pdEV2ZW50SW50ZXJuYWwoYmFzZTo6VG9rZW4odHlwZSksIGZhbHNlLCBmYWxzZSk7CiB9CiAKIEV2ZW50OjpFdmVudChjb25zdCBzdGQ6OnN0cmluZyYgdHlwZSwgY29uc3QgRXZlbnRJbml0JiBpbml0X2RpY3QpCiAgICAgOiBldmVudF9waGFzZV8oa05vbmUpLAotICAgICAgdGltZV9zdGFtcF8oc3RhdGljX2Nhc3Q8dWludDY0PihiYXNlOjpUaW1lOjpOb3coKS5Ub0pzVGltZSgpKSkgeworICAgICAgdGltZV9zdGFtcF8oR2V0RXZlbnRUaW1lKFNiVGltZUdldE1vbm90b25pY05vdygpKSkgewogICBTQl9EQ0hFQ0soaW5pdF9kaWN0Lmhhc19idWJibGVzKCkpOwogICBTQl9EQ0hFQ0soaW5pdF9kaWN0Lmhhc19jYW5jZWxhYmxlKCkpOworICBpZiAoaW5pdF9kaWN0LnRpbWVfc3RhbXAoKSAhPSAwKSB7CisgICAgdGltZV9zdGFtcF8gPSBpbml0X2RpY3QudGltZV9zdGFtcCgpOworICB9CiAgIEluaXRFdmVudEludGVybmFsKGJhc2U6OlRva2VuKHR5cGUpLCBpbml0X2RpY3QuYnViYmxlcygpLAogICAgICAgICAgICAgICAgICAgICBpbml0X2RpY3QuY2FuY2VsYWJsZSgpKTsKIH0KIAogRXZlbnQ6OkV2ZW50KGJhc2U6OlRva2VuIHR5cGUpCiAgICAgOiBldmVudF9waGFzZV8oa05vbmUpLAotICAgICAgdGltZV9zdGFtcF8oc3RhdGljX2Nhc3Q8dWludDY0PihiYXNlOjpUaW1lOjpOb3coKS5Ub0pzVGltZSgpKSkgeworICAgICAgdGltZV9zdGFtcF8oR2V0RXZlbnRUaW1lKFNiVGltZUdldE1vbm90b25pY05vdygpKSkgewogICBJbml0RXZlbnRJbnRlcm5hbCh0eXBlLCBmYWxzZSwgZmFsc2UpOwogfQogCiBFdmVudDo6RXZlbnQoYmFzZTo6VG9rZW4gdHlwZSwgQnViYmxlcyBidWJibGVzLCBDYW5jZWxhYmxlIGNhbmNlbGFibGUpCiAgICAgOiBldmVudF9waGFzZV8oa05vbmUpLAotICAgICAgdGltZV9zdGFtcF8oc3RhdGljX2Nhc3Q8dWludDY0PihiYXNlOjpUaW1lOjpOb3coKS5Ub0pzVGltZSgpKSkgeworICAgICAgdGltZV9zdGFtcF8oR2V0RXZlbnRUaW1lKFNiVGltZUdldE1vbm90b25pY05vdygpKSkgewogICBJbml0RXZlbnRJbnRlcm5hbCh0eXBlLCBidWJibGVzID09IGtCdWJibGVzLCBjYW5jZWxhYmxlID09IGtDYW5jZWxhYmxlKTsKIH0KIAogRXZlbnQ6OkV2ZW50KGJhc2U6OlRva2VuIHR5cGUsIGNvbnN0IEV2ZW50SW5pdCYgaW5pdF9kaWN0KQogICAgIDogZXZlbnRfcGhhc2VfKGtOb25lKSwKLSAgICAgIHRpbWVfc3RhbXBfKHN0YXRpY19jYXN0PHVpbnQ2ND4oYmFzZTo6VGltZTo6Tm93KCkuVG9Kc1RpbWUoKSkpIHsKKyAgICAgIHRpbWVfc3RhbXBfKEdldEV2ZW50VGltZShTYlRpbWVHZXRNb25vdG9uaWNOb3coKSkpIHsKICAgU0JfRENIRUNLKGluaXRfZGljdC5oYXNfYnViYmxlcygpKTsKICAgU0JfRENIRUNLKGluaXRfZGljdC5oYXNfY2FuY2VsYWJsZSgpKTsKKyAgaWYgKGluaXRfZGljdC50aW1lX3N0YW1wKCkgIT0gMCkgeworICAgIHRpbWVfc3RhbXBfID0gaW5pdF9kaWN0LnRpbWVfc3RhbXAoKTsKKyAgfQogICBJbml0RXZlbnRJbnRlcm5hbCh0eXBlLCBpbml0X2RpY3QuYnViYmxlcygpLCBpbml0X2RpY3QuY2FuY2VsYWJsZSgpKTsKIH0KIApAQCAtMTA1LDUgKzExMSwxNCBAQAogICB0cmFjZXItPlRyYWNlKGN1cnJlbnRfdGFyZ2V0Xyk7CiB9CiAKK3VpbnQ2NCBFdmVudDo6R2V0RXZlbnRUaW1lKFNiVGltZU1vbm90b25pYyBtb25vdG9uaWNfdGltZSkgeworICAvLyBGb3Igbm93LCBjb250aW51ZSB1c2luZyB0aGUgb2xkIHNwZWNpZmljYXRpb24gd2hpY2ggc3BlY2lmaWVzIHJlYWwgdGltZQorICAvLyBzaW5jZSAxOTcwLgorICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvZG9tLyNkb20tZXZlbnQtdGltZXN0YW1wCisgIFNiVGltZU1vbm90b25pYyB0aW1lX2RlbHRhID0gU2JUaW1lR2V0Tm93KCkgLSBTYlRpbWVHZXRNb25vdG9uaWNOb3coKTsKKyAgYmFzZTo6VGltZSBiYXNlX3RpbWUgPSBiYXNlOjpUaW1lOjpGcm9tU2JUaW1lKHRpbWVfZGVsdGEgKyBtb25vdG9uaWNfdGltZSk7CisgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50NjQ+KGJhc2VfdGltZS5Ub0pzVGltZSgpKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGRvbQogfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZXZlbnQuaCBiL3NyYy9jb2JhbHQvZG9tL2V2ZW50LmgKaW5kZXggNGRiYThiMi4uMTM1OTk1MSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vZXZlbnQuaAorKysgYi9zcmMvY29iYWx0L2RvbS9ldmVudC5oCkBAIC0xMjYsNiArMTI2LDEzIEBACiAgICAgcmV0dXJuIGltbWVkaWF0ZV9wcm9wYWdhdGlvbl9zdG9wcGVkXzsKICAgfQogCisgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FdmVudC90aW1lU3RhbXAKKyAgLy8gQW4gZXZlbnQncyB0aW1lU3RhbXAgc2hvdWxkIHJlcHJlc2VudCB0aW1lIHNpbmNlIGRvY3VtZW50IGNyZWF0aW9uLCBub3QKKyAgLy8gcmVhbCB0aW1lLiBIb3dldmVyLCB0aGUgb2xkIHNwZWMgc3BlY2lmaWVzIHRpbWUgc2luY2UgMTk3MC4gVG8gZmFjaWxpdGF0ZQorICAvLyB0aGUgdHJhbnNpdGlvbiB0byB0aGUgbmV3IHNwZWMsIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBhbiBldmVudCdzCisgIC8vIHRpbWUgc3RhbXAuCisgIHN0YXRpYyB1aW50NjQgR2V0RXZlbnRUaW1lKFNiVGltZU1vbm90b25pYyBtb25vdG9uaWNfdGltZSk7CisKICAgREVGSU5FX1dSQVBQQUJMRV9UWVBFKEV2ZW50KTsKICAgdm9pZCBUcmFjZU1lbWJlcnMoc2NyaXB0OjpUcmFjZXIqIHRyYWNlcikgb3ZlcnJpZGU7CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2V2ZW50X2luaXQuaWRsIGIvc3JjL2NvYmFsdC9kb20vZXZlbnRfaW5pdC5pZGwKaW5kZXggZjA5NzRmNS4uMjhlOTQzNiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vZXZlbnRfaW5pdC5pZGwKKysrIGIvc3JjL2NvYmFsdC9kb20vZXZlbnRfaW5pdC5pZGwKQEAgLTE3LDQgKzE3LDcgQEAKIGRpY3Rpb25hcnkgRXZlbnRJbml0IHsKICAgYm9vbGVhbiBidWJibGVzID0gZmFsc2U7CiAgIGJvb2xlYW4gY2FuY2VsYWJsZSA9IGZhbHNlOworCisgIC8vIENvYmFsdCBjdXN0b21pemF0aW9uIC0gdGltZVN0YW1wIGlzIG5vdCBwYXJ0IG9mIHRoZSBzcGVjLgorICBET01UaW1lU3RhbXAgdGltZVN0YW1wID0gMDsKIH07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9ldmVudF9saXN0ZW5lci5jYyBiL3NyYy9jb2JhbHQvZG9tL2V2ZW50X2xpc3RlbmVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTNiOGRiLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZG9tL2V2ZW50X2xpc3RlbmVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJjb2JhbHQvZG9tL2V2ZW50X2xpc3RlbmVyLmgiCi0KLSNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvdXNlcl9sb2cuaCIKLSNpbmNsdWRlICJjb2JhbHQvZG9tL2V2ZW50X3RhcmdldC5oIgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBkb20gewotbmFtZXNwYWNlIHsKLQotLy8gVGhpcyBjbGFzcyByZWNvcmRzIHRoZSBuZXN0ZWQgZXZlbnRzIGFuZCBtYW5hZ2VzIHRoZSB1c2VyIGxvZyBpbmZvcm1hdGlvbi4KLWNsYXNzIFNjcmlwdEV2ZW50TG9nIHsKLSBwdWJsaWM6Ci0gIFNjcmlwdEV2ZW50TG9nKCkgOiBjdXJyZW50X3N0YWNrX2RlcHRoXygwKSB7Ci0gICAgYmFzZTo6VXNlckxvZzo6UmVnaXN0ZXIoYmFzZTo6VXNlckxvZzo6a0V2ZW50U3RhY2tMZXZlbENvdW50SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV2ZW50TGV2ZWxDbnQiLCAmY3VycmVudF9zdGFja19kZXB0aF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGN1cnJlbnRfc3RhY2tfZGVwdGhfKSk7Ci0KLSAgICBtZW1zZXQoZXZlbnRfbG9nX3N0YWNrXywgMCwgc2l6ZW9mKGV2ZW50X2xvZ19zdGFja18pKTsKLSAgICBjb25zdCBpbnQga0xvZ05hbWVCdWZmZXJTaXplID0gMTY7Ci0gICAgY2hhciBsb2dfbmFtZV9idWZmZXJba0xvZ05hbWVCdWZmZXJTaXplXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGJhc2U6OlVzZXJMb2c6OmtFdmVudFN0YWNrTWF4RGVwdGg7IGkrKykgewotICAgICAgc25wcmludGYobG9nX25hbWVfYnVmZmVyLCBrTG9nTmFtZUJ1ZmZlclNpemUsICJFdmVudExldmVsJWQiLCBpKTsKLSAgICAgIGJhc2U6OlVzZXJMb2c6OlJlZ2lzdGVyKHN0YXRpY19jYXN0PGJhc2U6OlVzZXJMb2c6OkluZGV4PigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVc2VyTG9nOjprRXZlbnRTdGFja01pbkxldmVsSW5kZXggKyBpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19uYW1lX2J1ZmZlciwgZXZlbnRfbG9nX3N0YWNrX1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtMb2dFbnRyeU1heExlbmd0aCk7Ci0gICAgfQotICB9Ci0KLSAgflNjcmlwdEV2ZW50TG9nKCkgewotICAgIGJhc2U6OlVzZXJMb2c6OkRlcmVnaXN0ZXIoYmFzZTo6VXNlckxvZzo6a0V2ZW50U3RhY2tMZXZlbENvdW50SW5kZXgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYmFzZTo6VXNlckxvZzo6a0V2ZW50U3RhY2tNYXhEZXB0aDsgaSsrKSB7Ci0gICAgICBiYXNlOjpVc2VyTG9nOjpEZXJlZ2lzdGVyKHN0YXRpY19jYXN0PGJhc2U6OlVzZXJMb2c6OkluZGV4PigKLSAgICAgICAgICBiYXNlOjpVc2VyTG9nOjprRXZlbnRTdGFja01pbkxldmVsSW5kZXggKyBpKSk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBQdXNoRXZlbnQoRXZlbnQqIGV2ZW50KSB7Ci0gICAgaWYgKGN1cnJlbnRfc3RhY2tfZGVwdGhfIDwgYmFzZTo6VXNlckxvZzo6a0V2ZW50U3RhY2tNYXhEZXB0aCkgewotICAgICAgc25wcmludGYoZXZlbnRfbG9nX3N0YWNrX1tjdXJyZW50X3N0YWNrX2RlcHRoX10sIGtMb2dFbnRyeU1heExlbmd0aCwKLSAgICAgICAgICAgICAgICIlc0AlcyIsIGV2ZW50LT50eXBlKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgIGV2ZW50LT5jdXJyZW50X3RhcmdldCgpLT5HZXREZWJ1Z05hbWUoKS5jX3N0cigpKTsKLSAgICB9IGVsc2UgaWYgKGN1cnJlbnRfc3RhY2tfZGVwdGhfID09IGJhc2U6OlVzZXJMb2c6OmtFdmVudFN0YWNrTWF4RGVwdGgpIHsKLSAgICAgIERMT0coV0FSTklORykgPDwgIlJlYWNoZWQgbWF4aW11bSBkZXB0aCBvZiAiIDw8IGtMb2dFbnRyeU1heExlbmd0aAotICAgICAgICAgICAgICAgICAgICA8PCAiLiBTdWJzZXF1ZW50IGV2ZW50cyB3aWxsIG5vdCBiZSBsb2dnZWQuIjsKLSAgICB9Ci0gICAgY3VycmVudF9zdGFja19kZXB0aF8rKzsKLSAgfQotCi0gIHZvaWQgUG9wRXZlbnQoKSB7Ci0gICAgRENIRUNLKGN1cnJlbnRfc3RhY2tfZGVwdGhfKTsKLSAgICBjdXJyZW50X3N0YWNrX2RlcHRoXy0tOwotICAgIGlmIChjdXJyZW50X3N0YWNrX2RlcHRoXyA8IGJhc2U6OlVzZXJMb2c6OmtFdmVudFN0YWNrTWF4RGVwdGgpIHsKLSAgICAgIG1lbXNldChldmVudF9sb2dfc3RhY2tfW2N1cnJlbnRfc3RhY2tfZGVwdGhfXSwgMCwga0xvZ0VudHJ5TWF4TGVuZ3RoKTsKLSAgICB9Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBjb25zdCBzaXplX3Qga0xvZ0VudHJ5TWF4TGVuZ3RoID0gNjQ7Ci0gIGludCBjdXJyZW50X3N0YWNrX2RlcHRoXzsKLSAgY2hhciBldmVudF9sb2dfc3RhY2tfW2Jhc2U6OlVzZXJMb2c6OmtFdmVudFN0YWNrTWF4RGVwdGhdW2tMb2dFbnRyeU1heExlbmd0aF07Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFNjcmlwdEV2ZW50TG9nKTsKLX07Ci0KLWJhc2U6OkxhenlJbnN0YW5jZTxTY3JpcHRFdmVudExvZz4gc2NyaXB0X2V2ZW50X2xvZyA9IExBWllfSU5TVEFOQ0VfSU5JVElBTElaRVI7Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi12b2lkIEV2ZW50TGlzdGVuZXI6OkhhbmRsZUV2ZW50KGNvbnN0IHNjb3BlZF9yZWZwdHI8RXZlbnQ+JiBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSBsaXN0ZW5lcl90eXBlKSBjb25zdCB7Ci0gIFRSQUNFX0VWRU5UMSgiY29iYWx0Ojpkb20iLCAiRXZlbnRMaXN0ZW5lcjo6SGFuZGxlRXZlbnQiLCAiRXZlbnQgTmFtZSIsCi0gICAgICAgICAgICAgICBUUkFDRV9TVFJfQ09QWShldmVudC0+dHlwZSgpLmNfc3RyKCkpKTsKLSAgc2NyaXB0X2V2ZW50X2xvZy5HZXQoKS5QdXNoRXZlbnQoZXZlbnQpOwotCi0gIGJvb2wgaGFkX2V4Y2VwdGlvbjsKLSAgYmFzZTo6b3B0aW9uYWw8Ym9vbD4gcmVzdWx0ID0KLSAgICAgIEhhbmRsZUV2ZW50KGV2ZW50LT5jdXJyZW50X3RhcmdldCgpLCBldmVudCwgJmhhZF9leGNlcHRpb24pOwotCi0gIHNjcmlwdF9ldmVudF9sb2cuR2V0KCkuUG9wRXZlbnQoKTsKLQotICBpZiAoaGFkX2V4Y2VwdGlvbikgewotICAgIHJldHVybjsKLSAgfQotICAvLyBFdmVudEhhbmRsZXJzIChFdmVudExpc3RlbmVycyBzZXQgYXMgYXR0cmlidXRlcykgbWF5IHJldHVybiBmYWxzZSByYXRoZXIKLSAgLy8gdGhhbiBjYWxsIGV2ZW50LnByZXZlbnREZWZhdWx0KCkgaW4gdGhlIGhhbmRsZXIgZnVuY3Rpb24uCi0gIGlmIChsaXN0ZW5lcl90eXBlID09IGtBdHRyaWJ1dGUgJiYgcmVzdWx0ICYmICFyZXN1bHQudmFsdWUoKSkgewotICAgIGV2ZW50LT5QcmV2ZW50RGVmYXVsdCgpOwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBkb20KLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2V2ZW50X2xpc3RlbmVyLmggYi9zcmMvY29iYWx0L2RvbS9ldmVudF9saXN0ZW5lci5oCmluZGV4IDdiZWFiMmIuLjFiNmFiNzAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2V2ZW50X2xpc3RlbmVyLmgKKysrIGIvc3JjL2NvYmFsdC9kb20vZXZlbnRfbGlzdGVuZXIuaApAQCAtMjgsMTkgKzI4LDYgQEAKIC8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTQvV0QtZG9tLTIwMTQwNzEwLyNldmVudHRhcmdldAogY2xhc3MgRXZlbnRMaXN0ZW5lciB7CiAgcHVibGljOgotICAvLyBFdmVudEhhbmRsZXJzIGFyZSBpbXBsZW1lbnRlZCBhcyBFdmVudExpc3RlbmVyPywgc28gdXNlIHRoaXMgdG8KLSAgLy8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHRoZSB0d28uCi0gIGVudW0gVHlwZSB7Ci0gICAga0F0dHJpYnV0ZSwKLSAgICBrTm90QXR0cmlidXRlLAotICB9OwotCi0gIC8vIEN1c3RvbSwgbm90IGluIGFueSBzcGVjLgotICAvLwotICAvLyBTcGVjaWZ5IHdoZXRoZXIgdGhpcyBpcyBhbiBhdHRyaWJ1dGUtdHlwZSBsaXN0ZW5lciBvciBub3QuCi0gIHZvaWQgSGFuZGxlRXZlbnQoY29uc3Qgc2NvcGVkX3JlZnB0cjxFdmVudD4mIGV2ZW50LCBUeXBlIGxpc3RlbmVyX3R5cGUpIGNvbnN0OwotCi0gcHJvdGVjdGVkOgogICAvLyBXZWIgQVBJOiBFdmVudExpc3RlbmVyCiAgIC8vCiAgIC8vIENvYmFsdCdzIGltcGxlbWVudGF0aW9uIG9mIGNhbGxiYWNrIGludGVyZmFjZXMgcmVxdWlyZXMgdGhlICdjYWxsYmFjayB0aGlzJwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZXZlbnRfdGFyZ2V0LmNjIGIvc3JjL2NvYmFsdC9kb20vZXZlbnRfdGFyZ2V0LmNjCmluZGV4IGI3NmVlZWYuLmRiODRjMjUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2V2ZW50X3RhcmdldC5jYworKysgYi9zcmMvY29iYWx0L2RvbS9ldmVudF90YXJnZXQuY2MKQEAgLTMzLDEwICszMywxMSBAQAogICAgIHJldHVybjsKICAgfQogCi0gIEV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZTo6UmVmZXJlbmNlIGxpc3RlbmVyX3JlZmVyZW5jZSh0aGlzLCBsaXN0ZW5lcik7CisgIHNjb3BlZF9wdHI8R2VuZXJpY0V2ZW50SGFuZGxlclJlZmVyZW5jZT4gbGlzdGVuZXJfcmVmZXJlbmNlKAorICAgICAgbmV3IEdlbmVyaWNFdmVudEhhbmRsZXJSZWZlcmVuY2UodGhpcywgbGlzdGVuZXIpKTsKIAotICBBZGRFdmVudExpc3RlbmVySW50ZXJuYWwoYmFzZTo6VG9rZW4odHlwZSksIGxpc3RlbmVyLCB1c2VfY2FwdHVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50TGlzdGVuZXI6OmtOb3RBdHRyaWJ1dGUpOworICBBZGRFdmVudExpc3RlbmVySW50ZXJuYWwoYmFzZTo6VG9rZW4odHlwZSksIGxpc3RlbmVyX3JlZmVyZW5jZS5QYXNzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VfY2FwdHVyZSwga05vdEF0dHJpYnV0ZSk7CiB9CiAKIHZvaWQgRXZlbnRUYXJnZXQ6OlJlbW92ZUV2ZW50TGlzdGVuZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHR5cGUsCkBAIC00OSw5ICs1MCw4IEBACiAKICAgZm9yIChFdmVudExpc3RlbmVySW5mb3M6Oml0ZXJhdG9yIGl0ZXIgPSBldmVudF9saXN0ZW5lcl9pbmZvc18uYmVnaW4oKTsKICAgICAgICBpdGVyICE9IGV2ZW50X2xpc3RlbmVyX2luZm9zXy5lbmQoKTsgKytpdGVyKSB7Ci0gICAgaWYgKCgqaXRlciktPmxpc3RlbmVyX3R5cGUgPT0gRXZlbnRMaXN0ZW5lcjo6a05vdEF0dHJpYnV0ZSAmJgotICAgICAgICAoKml0ZXIpLT50eXBlID09IHR5cGUuY19zdHIoKSAmJgotICAgICAgICAoKml0ZXIpLT5saXN0ZW5lci5yZWZlcmVuY2VkX3ZhbHVlKCkuRXF1YWxUbyhsaXN0ZW5lcikgJiYKKyAgICBpZiAoKCppdGVyKS0+bGlzdGVuZXJfdHlwZSA9PSBrTm90QXR0cmlidXRlICYmCisgICAgICAgICgqaXRlciktPnR5cGUgPT0gdHlwZS5jX3N0cigpICYmICgqaXRlciktPmxpc3RlbmVyLT5FcXVhbFRvKGxpc3RlbmVyKSAmJgogICAgICAgICAoKml0ZXIpLT51c2VfY2FwdHVyZSA9PSB1c2VfY2FwdHVyZSkgewogICAgICAgZXZlbnRfbGlzdGVuZXJfaW5mb3NfLmVyYXNlKGl0ZXIpOwogICAgICAgcmV0dXJuOwpAQCAtMTI0LDQ0ICsxMjQsNzUgQEAKIAogdm9pZCBFdmVudFRhcmdldDo6U2V0QXR0cmlidXRlRXZlbnRMaXN0ZW5lcigKICAgICBiYXNlOjpUb2tlbiB0eXBlLCBjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0VmFsdWUmIGxpc3RlbmVyKSB7Ci0gIC8vIFJlbW92ZSBleGlzdGluZyBhdHRyaWJ1dGUgbGlzdGVuZXIgb2YgdGhlIHNhbWUgdHlwZS4KLSAgZm9yIChFdmVudExpc3RlbmVySW5mb3M6Oml0ZXJhdG9yIGl0ZXIgPSBldmVudF9saXN0ZW5lcl9pbmZvc18uYmVnaW4oKTsKLSAgICAgICBpdGVyICE9IGV2ZW50X2xpc3RlbmVyX2luZm9zXy5lbmQoKTsgKytpdGVyKSB7Ci0gICAgaWYgKCgqaXRlciktPmxpc3RlbmVyX3R5cGUgPT0gRXZlbnRMaXN0ZW5lcjo6a0F0dHJpYnV0ZSAmJgotICAgICAgICAoKml0ZXIpLT50eXBlID09IHR5cGUpIHsKLSAgICAgIGV2ZW50X2xpc3RlbmVyX2luZm9zXy5lcmFzZShpdGVyKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQorICBEQ0hFQ0soIXVucGFja19vbmVycm9yX2V2ZW50c18gfHwgdHlwZSAhPSBiYXNlOjpUb2tlbnM6OmVycm9yKCkpOwogCi0gIGlmIChsaXN0ZW5lci5Jc051bGwoKSkgewotICAgIHJldHVybjsKLSAgfQotICBBZGRFdmVudExpc3RlbmVySW50ZXJuYWwodHlwZSwgbGlzdGVuZXIsIGZhbHNlLCBFdmVudExpc3RlbmVyOjprQXR0cmlidXRlKTsKKyAgc2NvcGVkX3B0cjxHZW5lcmljRXZlbnRIYW5kbGVyUmVmZXJlbmNlPiBsaXN0ZW5lcl9yZWZlcmVuY2UoCisgICAgICBuZXcgR2VuZXJpY0V2ZW50SGFuZGxlclJlZmVyZW5jZSh0aGlzLCBsaXN0ZW5lcikpOworICBTZXRBdHRyaWJ1dGVFdmVudExpc3RlbmVySW50ZXJuYWwodHlwZSwgbGlzdGVuZXJfcmVmZXJlbmNlLlBhc3MoKSk7CiB9CiAKIGNvbnN0IEV2ZW50VGFyZ2V0OjpFdmVudExpc3RlbmVyU2NyaXB0VmFsdWUqCiBFdmVudFRhcmdldDo6R2V0QXR0cmlidXRlRXZlbnRMaXN0ZW5lcihiYXNlOjpUb2tlbiB0eXBlKSBjb25zdCB7Ci0gIGZvciAoRXZlbnRMaXN0ZW5lckluZm9zOjpjb25zdF9pdGVyYXRvciBpdGVyID0gZXZlbnRfbGlzdGVuZXJfaW5mb3NfLmJlZ2luKCk7Ci0gICAgICAgaXRlciAhPSBldmVudF9saXN0ZW5lcl9pbmZvc18uZW5kKCk7ICsraXRlcikgewotICAgIGlmICgoKml0ZXIpLT5saXN0ZW5lcl90eXBlID09IEV2ZW50TGlzdGVuZXI6OmtBdHRyaWJ1dGUgJiYKLSAgICAgICAgKCppdGVyKS0+dHlwZSA9PSB0eXBlKSB7Ci0gICAgICByZXR1cm4gJigqaXRlciktPmxpc3RlbmVyLnJlZmVyZW5jZWRfdmFsdWUoKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIE5VTEw7CisgIERDSEVDSyghdW5wYWNrX29uZXJyb3JfZXZlbnRzXyB8fCB0eXBlICE9IGJhc2U6OlRva2Vuczo6ZXJyb3IoKSk7CisKKyAgR2VuZXJpY0V2ZW50SGFuZGxlclJlZmVyZW5jZSogaGFuZGxlciA9CisgICAgICBHZXRBdHRyaWJ1dGVFdmVudExpc3RlbmVySW50ZXJuYWwodHlwZSk7CisgIHJldHVybiBoYW5kbGVyID8gaGFuZGxlci0+ZXZlbnRfbGlzdGVuZXJfdmFsdWUoKSA6IE5VTEw7Cit9CisKK3ZvaWQgRXZlbnRUYXJnZXQ6OlNldEF0dHJpYnV0ZU9uRXJyb3JFdmVudExpc3RlbmVyKAorICAgIGJhc2U6OlRva2VuIHR5cGUsIGNvbnN0IE9uRXJyb3JFdmVudExpc3RlbmVyU2NyaXB0VmFsdWUmIGxpc3RlbmVyKSB7CisgIERDSEVDS19FUShiYXNlOjpUb2tlbnM6OmVycm9yKCksIHR5cGUpOworCisgIHNjb3BlZF9wdHI8R2VuZXJpY0V2ZW50SGFuZGxlclJlZmVyZW5jZT4gbGlzdGVuZXJfcmVmZXJlbmNlKAorICAgICAgbmV3IEdlbmVyaWNFdmVudEhhbmRsZXJSZWZlcmVuY2UodGhpcywgbGlzdGVuZXIpKTsKKyAgU2V0QXR0cmlidXRlRXZlbnRMaXN0ZW5lckludGVybmFsKHR5cGUsIGxpc3RlbmVyX3JlZmVyZW5jZS5QYXNzKCkpOworfQorCitjb25zdCBFdmVudFRhcmdldDo6T25FcnJvckV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZSoKK0V2ZW50VGFyZ2V0OjpHZXRBdHRyaWJ1dGVPbkVycm9yRXZlbnRMaXN0ZW5lcihiYXNlOjpUb2tlbiB0eXBlKSBjb25zdCB7CisgIERDSEVDS19FUShiYXNlOjpUb2tlbnM6OmVycm9yKCksIHR5cGUpOworCisgIEdlbmVyaWNFdmVudEhhbmRsZXJSZWZlcmVuY2UqIGhhbmRsZXIgPQorICAgICAgR2V0QXR0cmlidXRlRXZlbnRMaXN0ZW5lckludGVybmFsKHR5cGUpOworICByZXR1cm4gaGFuZGxlciA/IGhhbmRsZXItPm9uX2Vycm9yX2V2ZW50X2xpc3RlbmVyX3ZhbHVlKCkgOiBOVUxMOwogfQogCiBib29sIEV2ZW50VGFyZ2V0OjpIYXNPbmVPck1vcmVBdHRyaWJ1dGVFdmVudExpc3RlbmVyKCkgY29uc3QgewogICBmb3IgKEV2ZW50TGlzdGVuZXJJbmZvczo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IGV2ZW50X2xpc3RlbmVyX2luZm9zXy5iZWdpbigpOwogICAgICAgIGl0ZXIgIT0gZXZlbnRfbGlzdGVuZXJfaW5mb3NfLmVuZCgpOyArK2l0ZXIpIHsKLSAgICBpZiAoKCppdGVyKS0+bGlzdGVuZXJfdHlwZSA9PSBFdmVudExpc3RlbmVyOjprQXR0cmlidXRlKSB7CisgICAgaWYgKCgqaXRlciktPmxpc3RlbmVyX3R5cGUgPT0ga0F0dHJpYnV0ZSkgewogICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICB9CiAgIHJldHVybiBmYWxzZTsKIH0KIAordm9pZCBFdmVudFRhcmdldDo6U2V0QXR0cmlidXRlRXZlbnRMaXN0ZW5lckludGVybmFsKAorICAgIGJhc2U6OlRva2VuIHR5cGUsIHNjb3BlZF9wdHI8R2VuZXJpY0V2ZW50SGFuZGxlclJlZmVyZW5jZT4gZXZlbnRfaGFuZGxlcikgeworICAvLyBSZW1vdmUgZXhpc3RpbmcgYXR0cmlidXRlIGxpc3RlbmVyIG9mIHRoZSBzYW1lIHR5cGUuCisgIGZvciAoRXZlbnRMaXN0ZW5lckluZm9zOjppdGVyYXRvciBpdGVyID0gZXZlbnRfbGlzdGVuZXJfaW5mb3NfLmJlZ2luKCk7CisgICAgICAgaXRlciAhPSBldmVudF9saXN0ZW5lcl9pbmZvc18uZW5kKCk7ICsraXRlcikgeworICAgIGlmICgoKml0ZXIpLT5saXN0ZW5lcl90eXBlID09IGtBdHRyaWJ1dGUgJiYgKCppdGVyKS0+dHlwZSA9PSB0eXBlKSB7CisgICAgICBldmVudF9saXN0ZW5lcl9pbmZvc18uZXJhc2UoaXRlcik7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBBZGRFdmVudExpc3RlbmVySW50ZXJuYWwodHlwZSwgZXZlbnRfaGFuZGxlci5QYXNzKCksIGZhbHNlLCBrQXR0cmlidXRlKTsKK30KKworR2VuZXJpY0V2ZW50SGFuZGxlclJlZmVyZW5jZSogRXZlbnRUYXJnZXQ6OkdldEF0dHJpYnV0ZUV2ZW50TGlzdGVuZXJJbnRlcm5hbCgKKyAgICBiYXNlOjpUb2tlbiB0eXBlKSBjb25zdCB7CisgIGZvciAoRXZlbnRMaXN0ZW5lckluZm9zOjpjb25zdF9pdGVyYXRvciBpdGVyID0gZXZlbnRfbGlzdGVuZXJfaW5mb3NfLmJlZ2luKCk7CisgICAgICAgaXRlciAhPSBldmVudF9saXN0ZW5lcl9pbmZvc18uZW5kKCk7ICsraXRlcikgeworICAgIGlmICgoKml0ZXIpLT5saXN0ZW5lcl90eXBlID09IGtBdHRyaWJ1dGUgJiYgKCppdGVyKS0+dHlwZSA9PSB0eXBlKSB7CisgICAgICByZXR1cm4gKCppdGVyKS0+bGlzdGVuZXIuZ2V0KCk7CisgICAgfQorICB9CisgIHJldHVybiBOVUxMOworfQorCiB2b2lkIEV2ZW50VGFyZ2V0OjpGaXJlRXZlbnRPbkxpc3RlbmVycyhjb25zdCBzY29wZWRfcmVmcHRyPEV2ZW50PiYgZXZlbnQpIHsKICAgRENIRUNLKGV2ZW50LT5Jc0JlaW5nRGlzcGF0Y2hlZCgpKTsKICAgRENIRUNLKGV2ZW50LT50YXJnZXQoKSk7CkBAIC0xNzQsNyArMjA1LDkgQEAKICAgICAgICBpdGVyICE9IGV2ZW50X2xpc3RlbmVyX2luZm9zXy5lbmQoKTsgKytpdGVyKSB7CiAgICAgaWYgKCgqaXRlciktPnR5cGUgPT0gZXZlbnQtPnR5cGUoKSkgewogICAgICAgZXZlbnRfbGlzdGVuZXJfaW5mb3MucHVzaF9iYWNrKG5ldyBFdmVudExpc3RlbmVySW5mbygKLSAgICAgICAgICAoKml0ZXIpLT50eXBlLCB0aGlzLCAoKml0ZXIpLT5saXN0ZW5lci5yZWZlcmVuY2VkX3ZhbHVlKCksCisgICAgICAgICAgKCppdGVyKS0+dHlwZSwKKyAgICAgICAgICBtYWtlX3Njb3BlZF9wdHIoCisgICAgICAgICAgICAgIG5ldyBHZW5lcmljRXZlbnRIYW5kbGVyUmVmZXJlbmNlKHRoaXMsICooKml0ZXIpLT5saXN0ZW5lcikpLAogICAgICAgICAgICgqaXRlciktPnVzZV9jYXB0dXJlLCAoKml0ZXIpLT5saXN0ZW5lcl90eXBlKSk7CiAgICAgfQogICB9CkBAIC0xOTMsNyArMjI2LDkgQEAKICAgICBpZiAoZXZlbnQtPmV2ZW50X3BoYXNlKCkgPT0gRXZlbnQ6OmtCdWJibGluZ1BoYXNlICYmICgqaXRlciktPnVzZV9jYXB0dXJlKSB7CiAgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgKCppdGVyKS0+bGlzdGVuZXIudmFsdWUoKS5IYW5kbGVFdmVudChldmVudCwgKCppdGVyKS0+bGlzdGVuZXJfdHlwZSk7CisKKyAgICAoKml0ZXIpLT5saXN0ZW5lci0+SGFuZGxlRXZlbnQoZXZlbnQsICgqaXRlciktPmxpc3RlbmVyX3R5cGUgPT0ga0F0dHJpYnV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5wYWNrX29uZXJyb3JfZXZlbnRzXyk7CiAgIH0KIAogICBldmVudC0+c2V0X2N1cnJlbnRfdGFyZ2V0KE5VTEwpOwpAQCAtMjA2LDI2ICsyNDEsMjcgQEAKIH0KIAogdm9pZCBFdmVudFRhcmdldDo6QWRkRXZlbnRMaXN0ZW5lckludGVybmFsKAotICAgIGJhc2U6OlRva2VuIHR5cGUsIGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZSYgbGlzdGVuZXIsCi0gICAgYm9vbCB1c2VfY2FwdHVyZSwgRXZlbnRMaXN0ZW5lcjo6VHlwZSBsaXN0ZW5lcl90eXBlKSB7CisgICAgYmFzZTo6VG9rZW4gdHlwZSwgc2NvcGVkX3B0cjxHZW5lcmljRXZlbnRIYW5kbGVyUmVmZXJlbmNlPiBsaXN0ZW5lciwKKyAgICBib29sIHVzZV9jYXB0dXJlLCBUeXBlIGxpc3RlbmVyX3R5cGUpIHsKICAgVFJBQ0tfTUVNT1JZX1NDT1BFKCJET00iKTsKIAotICBEQ0hFQ0soIWxpc3RlbmVyLklzTnVsbCgpKTsKKyAgaWYgKGxpc3RlbmVyLT5Jc051bGwoKSkgeworICAgIHJldHVybjsKKyAgfQogCiAgIGZvciAoRXZlbnRMaXN0ZW5lckluZm9zOjppdGVyYXRvciBpdGVyID0gZXZlbnRfbGlzdGVuZXJfaW5mb3NfLmJlZ2luKCk7CiAgICAgICAgaXRlciAhPSBldmVudF9saXN0ZW5lcl9pbmZvc18uZW5kKCk7ICsraXRlcikgewotICAgIGlmICgoKml0ZXIpLT50eXBlID09IHR5cGUgJiYKLSAgICAgICAgKCppdGVyKS0+bGlzdGVuZXIucmVmZXJlbmNlZF92YWx1ZSgpLkVxdWFsVG8obGlzdGVuZXIpICYmCisgICAgaWYgKCgqaXRlciktPnR5cGUgPT0gdHlwZSAmJiAoKml0ZXIpLT5saXN0ZW5lci0+RXF1YWxUbygqbGlzdGVuZXIpICYmCiAgICAgICAgICgqaXRlciktPnVzZV9jYXB0dXJlID09IHVzZV9jYXB0dXJlICYmCiAgICAgICAgICgqaXRlciktPmxpc3RlbmVyX3R5cGUgPT0gbGlzdGVuZXJfdHlwZSkgewogICAgICAgLy8gQXR0cmlidXRlIGxpc3RlbmVycyBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gcmVtb3ZlZC4KLSAgICAgIERDSEVDS19FUShsaXN0ZW5lcl90eXBlLCBFdmVudExpc3RlbmVyOjprTm90QXR0cmlidXRlKTsKKyAgICAgIERDSEVDS19FUShsaXN0ZW5lcl90eXBlLCBrTm90QXR0cmlidXRlKTsKICAgICAgIHJldHVybjsKICAgICB9CiAgIH0KIAogICBldmVudF9saXN0ZW5lcl9pbmZvc18ucHVzaF9iYWNrKAotICAgICAgbmV3IEV2ZW50TGlzdGVuZXJJbmZvKHR5cGUsIHRoaXMsIGxpc3RlbmVyLCB1c2VfY2FwdHVyZSwgbGlzdGVuZXJfdHlwZSkpOworICAgICAgbmV3IEV2ZW50TGlzdGVuZXJJbmZvKHR5cGUsIGxpc3RlbmVyLlBhc3MoKSwgdXNlX2NhcHR1cmUsIGxpc3RlbmVyX3R5cGUpKTsKIH0KIAogYm9vbCBFdmVudFRhcmdldDo6SGFzRXZlbnRMaXN0ZW5lcihiYXNlOjpUb2tlbiB0eXBlKSB7CkBAIC0yNDEsMTEgKzI3NywxMCBAQAogfQogCiBFdmVudFRhcmdldDo6RXZlbnRMaXN0ZW5lckluZm86OkV2ZW50TGlzdGVuZXJJbmZvKAotICAgIGJhc2U6OlRva2VuIHR5cGUsIEV2ZW50VGFyZ2V0KiBjb25zdCBldmVudF90YXJnZXQsCi0gICAgY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlJiBsaXN0ZW5lciwgYm9vbCB1c2VfY2FwdHVyZSwKLSAgICBFdmVudExpc3RlbmVyOjpUeXBlIGxpc3RlbmVyX3R5cGUpCisgICAgYmFzZTo6VG9rZW4gdHlwZSwgc2NvcGVkX3B0cjxHZW5lcmljRXZlbnRIYW5kbGVyUmVmZXJlbmNlPiBsaXN0ZW5lciwKKyAgICBib29sIHVzZV9jYXB0dXJlLCBUeXBlIGxpc3RlbmVyX3R5cGUpCiAgICAgOiB0eXBlKHR5cGUpLAotICAgICAgbGlzdGVuZXIoZXZlbnRfdGFyZ2V0LCBsaXN0ZW5lciksCisgICAgICBsaXN0ZW5lcihsaXN0ZW5lci5QYXNzKCkpLAogICAgICAgdXNlX2NhcHR1cmUodXNlX2NhcHR1cmUpLAogICAgICAgbGlzdGVuZXJfdHlwZShsaXN0ZW5lcl90eXBlKSB7CiAgIEdsb2JhbFN0YXRzOjpHZXRJbnN0YW5jZSgpLT5BZGRFdmVudExpc3RlbmVyKCk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9ldmVudF90YXJnZXQuaCBiL3NyYy9jb2JhbHQvZG9tL2V2ZW50X3RhcmdldC5oCmluZGV4IGE4OWRiZTUuLmI5YzVkOWMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2V2ZW50X3RhcmdldC5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL2V2ZW50X3RhcmdldC5oCkBAIC0yMywxMCArMjMsMTMgQEAKICNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfdmVjdG9yLmgiCiAjaW5jbHVkZSAiYmFzZS9tZW1vcnkvd2Vha19wdHIuaCIKICNpbmNsdWRlICJiYXNlL3RyYWNrZWRfb2JqZWN0cy5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCiAjaW5jbHVkZSAiY29iYWx0L2Jhc2UvdG9rZW4uaCIKICNpbmNsdWRlICJjb2JhbHQvYmFzZS90b2tlbnMuaCIKICNpbmNsdWRlICJjb2JhbHQvZG9tL2V2ZW50LmgiCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9ldmVudF9saXN0ZW5lci5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vZ2VuZXJpY19ldmVudF9oYW5kbGVyX3JlZmVyZW5jZS5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vb25fZXJyb3JfZXZlbnRfbGlzdGVuZXIuaCIKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKQEAgLTQyLDcgKzQ1LDM3IEBACiBjbGFzcyBFdmVudFRhcmdldCA6IHB1YmxpYyBzY3JpcHQ6OldyYXBwYWJsZSwKICAgICAgICAgICAgICAgICAgICAgcHVibGljIGJhc2U6OlN1cHBvcnRzV2Vha1B0cjxFdmVudFRhcmdldD4gewogIHB1YmxpYzoKKyAgLy8gRXZlbnRIYW5kbGVycyBhcmUgaW1wbGVtZW50ZWQgYXMgRXZlbnRMaXN0ZW5lcj8sIHNvIHVzZSB0aGlzIHRvCisgIC8vIGRpZmZlcmVudGlhdGUgYmV0d2VlbiB0aGUgdHdvLgorICBlbnVtIFR5cGUgeworICAgIGtBdHRyaWJ1dGUsCisgICAga05vdEF0dHJpYnV0ZSwKKyAgfTsKKworICAvLyBIZWxwZXIgZW51bSB0byBkZWNpZGUgd2hldGhlciBvciBub3Qgb25lcnJvciBldmVudCBwYXJhbWV0ZXJzIHNob3VsZCBiZQorICAvLyB1bnBhY2tlZCBvciBub3QgKGUuZy4gaW4gdGhlIHNwZWNpYWwgY2FzZSBvZiB0aGUgfHdpbmRvd3wgb2JqZWN0KS4KKyAgLy8gVGhpcyBzcGVjaWFsIGhhbmRsaW5nIGlzIGRlc2NyaWJlZCBpbjoKKyAgLy8gICBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnLyNldmVudC1oYW5kbGVyLWF0dHJpYnV0ZXMKKyAgLy8gKHNlYXJjaCBmb3IgIm9uZXJyb3IiKQorICBlbnVtIFVucGFja09uRXJyb3JFdmVudHNCb29sIHsKKyAgICBrVW5wYWNrT25FcnJvckV2ZW50cywKKyAgICBrRG9Ob3RVbnBhY2tPbkVycm9yRXZlbnRzLAorICB9OworCisgIC8vIFRoZSBwYXJhbWV0ZXIgfHVucGFja19vbmVycm9yX2V2ZW50c3wgY2FuIGJlIHNldCB0byB0cnVlIChlLmcuIGZvciB0aGUKKyAgLy8gfHdpbmRvd3wgb2JqZWN0KSBpbiBvcmRlciB0byBpbmRpY2F0ZSB0aGF0IHRoZSBFcnJvckV2ZW50IHNob3VsZCBoYXZlCisgIC8vIGl0cyBtZW1iZXJzIHVucGFja2VkIGJlZm9yZSBjYWxsaW5nIGl0cyBldmVudCBoYW5kbGVyLiAgVGhpcyBpcyB0bworICAvLyBhY2NvbW1vZGF0ZSBmb3IgYSBzcGVjaWFsIGNhc2UgaW4gdGhlIHdpbmRvdy5vbmVycm9yIGhhbmRsaW5nLiAgVGhpcworICAvLyBzcGVjaWFsIGhhbmRsaW5nCisgIGV4cGxpY2l0IEV2ZW50VGFyZ2V0KAorICAgICAgVW5wYWNrT25FcnJvckV2ZW50c0Jvb2wgb25lcnJvcl9ldmVudF9wYXJhbWV0ZXJfaGFuZGxpbmcgPQorICAgICAgICAgIGtEb05vdFVucGFja09uRXJyb3JFdmVudHMpCisgICAgICA6IHVucGFja19vbmVycm9yX2V2ZW50c18ob25lcnJvcl9ldmVudF9wYXJhbWV0ZXJfaGFuZGxpbmcgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVW5wYWNrT25FcnJvckV2ZW50cykge30KKwogICB0eXBlZGVmIHNjcmlwdDo6U2NyaXB0VmFsdWU8RXZlbnRMaXN0ZW5lcj4gRXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlOworICB0eXBlZGVmIHNjcmlwdDo6U2NyaXB0VmFsdWU8T25FcnJvckV2ZW50TGlzdGVuZXI+CisgICAgICBPbkVycm9yRXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlOwogCiAgIC8vIFdlYiBBUEk6IEV2ZW50VGFyZ2V0CiAgIC8vCkBAIC0xMDAsMTEgKzEzMywxMSBAQAogICAgIFNldEF0dHJpYnV0ZUV2ZW50TGlzdGVuZXIoYmFzZTo6VG9rZW5zOjpjbGljaygpLCBldmVudF9saXN0ZW5lcik7CiAgIH0KIAotICBjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0VmFsdWUqIG9uZXJyb3IoKSB7Ci0gICAgcmV0dXJuIEdldEF0dHJpYnV0ZUV2ZW50TGlzdGVuZXIoYmFzZTo6VG9rZW5zOjplcnJvcigpKTsKKyAgY29uc3QgT25FcnJvckV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZSogb25lcnJvcigpIHsKKyAgICByZXR1cm4gR2V0QXR0cmlidXRlT25FcnJvckV2ZW50TGlzdGVuZXIoYmFzZTo6VG9rZW5zOjplcnJvcigpKTsKICAgfQotICB2b2lkIHNldF9vbmVycm9yKGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZSYgZXZlbnRfbGlzdGVuZXIpIHsKLSAgICBTZXRBdHRyaWJ1dGVFdmVudExpc3RlbmVyKGJhc2U6OlRva2Vuczo6ZXJyb3IoKSwgZXZlbnRfbGlzdGVuZXIpOworICB2b2lkIHNldF9vbmVycm9yKGNvbnN0IE9uRXJyb3JFdmVudExpc3RlbmVyU2NyaXB0VmFsdWUmIGV2ZW50X2xpc3RlbmVyKSB7CisgICAgU2V0QXR0cmlidXRlT25FcnJvckV2ZW50TGlzdGVuZXIoYmFzZTo6VG9rZW5zOjplcnJvcigpLCBldmVudF9saXN0ZW5lcik7CiAgIH0KIAogICBjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0VmFsdWUqIG9uZm9jdXMoKSB7CkBAIC0zOTMsNiArNDI2LDE2IEBACiAgIGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZSogR2V0QXR0cmlidXRlRXZlbnRMaXN0ZW5lcigKICAgICAgIGJhc2U6OlRva2VuIHR5cGUpIGNvbnN0OwogCisgIC8vIFNpbWlsYXIgdG8gU2V0QXR0cmlidXRlRXZlbnRMaXN0ZW5lcigpLCBidXQgdGhpcyBmdW5jdGlvbiBzaG91bGQgb25seQorICAvLyBiZSBjYWxsZWQgd2l0aCB0eXBlID09IGJhc2U6OlRva2Vuczo6ZXJyb3IoKS4KKyAgdm9pZCBTZXRBdHRyaWJ1dGVPbkVycm9yRXZlbnRMaXN0ZW5lcigKKyAgICAgIGJhc2U6OlRva2VuIHR5cGUsIGNvbnN0IE9uRXJyb3JFdmVudExpc3RlbmVyU2NyaXB0VmFsdWUmIGxpc3RlbmVyKTsKKworICAvLyBTaW1pbGFyIHRvIEdldEF0dHJpYnV0ZUV2ZW50TGlzdGVuZXIoKSwgYnV0IHRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkKKyAgLy8gYmUgY2FsbGVkIHdpdGggdHlwZSA9PSBiYXNlOjpUb2tlbnM6OmVycm9yKCkuCisgIGNvbnN0IE9uRXJyb3JFdmVudExpc3RlbmVyU2NyaXB0VmFsdWUqIEdldEF0dHJpYnV0ZU9uRXJyb3JFdmVudExpc3RlbmVyKAorICAgICAgYmFzZTo6VG9rZW4gdHlwZSkgY29uc3Q7CisKICAgLy8gUmV0dXJuIHRydWUgaWYgb25lIG9yIG1vcmUgZXZlbnQgbGlzdGVuZXJzIGFyZSByZWdpc3RlcmVkCiAgIGJvb2wgSGFzT25lT3JNb3JlQXR0cmlidXRlRXZlbnRMaXN0ZW5lcigpIGNvbnN0OwogCkBAIC00MDksMjQgKzQ1MiwzMyBAQAogCiAgcHJpdmF0ZToKICAgc3RydWN0IEV2ZW50TGlzdGVuZXJJbmZvIHsKLSAgICBFdmVudExpc3RlbmVySW5mbyhiYXNlOjpUb2tlbiB0eXBlLCBFdmVudFRhcmdldCogY29uc3QgZXZlbnRfdGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZSYgbGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VfY2FwdHVyZSwgRXZlbnRMaXN0ZW5lcjo6VHlwZSBsaXN0ZW5lcl90eXBlKTsKKyAgICBFdmVudExpc3RlbmVySW5mbyhiYXNlOjpUb2tlbiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgIHNjb3BlZF9wdHI8R2VuZXJpY0V2ZW50SGFuZGxlclJlZmVyZW5jZT4gbGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VfY2FwdHVyZSwgVHlwZSBsaXN0ZW5lcl90eXBlKTsKICAgICB+RXZlbnRMaXN0ZW5lckluZm8oKTsKIAogICAgIGJhc2U6OlRva2VuIHR5cGU7Ci0gICAgc2NyaXB0OjpTY3JpcHRWYWx1ZTxFdmVudExpc3RlbmVyPjo6UmVmZXJlbmNlIGxpc3RlbmVyOworICAgIHNjb3BlZF9wdHI8R2VuZXJpY0V2ZW50SGFuZGxlclJlZmVyZW5jZT4gbGlzdGVuZXI7CiAgICAgYm9vbCB1c2VfY2FwdHVyZTsKLSAgICBFdmVudExpc3RlbmVyOjpUeXBlIGxpc3RlbmVyX3R5cGU7CisgICAgVHlwZSBsaXN0ZW5lcl90eXBlOwogICB9OwogICB0eXBlZGVmIFNjb3BlZFZlY3RvcjxFdmVudExpc3RlbmVySW5mbz4gRXZlbnRMaXN0ZW5lckluZm9zOwogCi0gIHZvaWQgQWRkRXZlbnRMaXN0ZW5lckludGVybmFsKGJhc2U6OlRva2VuIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZSYgbGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlX2NhcHR1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50TGlzdGVuZXI6OlR5cGUgbGlzdGVuZXJfdHlwZSk7CisgIHZvaWQgU2V0QXR0cmlidXRlRXZlbnRMaXN0ZW5lckludGVybmFsKAorICAgICAgYmFzZTo6VG9rZW4gdHlwZSwgc2NvcGVkX3B0cjxHZW5lcmljRXZlbnRIYW5kbGVyUmVmZXJlbmNlPiBldmVudF9oYW5kbGVyKTsKKyAgR2VuZXJpY0V2ZW50SGFuZGxlclJlZmVyZW5jZSogR2V0QXR0cmlidXRlRXZlbnRMaXN0ZW5lckludGVybmFsKAorICAgICAgYmFzZTo6VG9rZW4gdHlwZSkgY29uc3Q7CisKKyAgdm9pZCBBZGRFdmVudExpc3RlbmVySW50ZXJuYWwoCisgICAgICBiYXNlOjpUb2tlbiB0eXBlLCBzY29wZWRfcHRyPEdlbmVyaWNFdmVudEhhbmRsZXJSZWZlcmVuY2U+IGxpc3RlbmVyLAorICAgICAgYm9vbCB1c2VfY2FwdHVyZSwgVHlwZSBsaXN0ZW5lcl90eXBlKTsKIAogICBFdmVudExpc3RlbmVySW5mb3MgZXZlbnRfbGlzdGVuZXJfaW5mb3NfOworCisgIC8vIFRyYWNrcyB3aGV0aGVyIHRoaXMgY3VycmVudCBldmVudCBsaXN0ZW5lciBzaG91bGQgdW5wYWNrIHRoZSBvbmVycm9yCisgIC8vIGV2ZW50IG9iamVjdCB3aGVuIGNhbGxpbmcgaXRzIGNhbGxiYWNrLiAgVGhpcyBpcyBuZWVkZWQgdG8gaW1wbGVtZW50CisgIC8vIHRoZSBzcGVjaWFsIGNhc2Ugb2Ygd2luZG93Lm9uZXJyb3IgaGFuZGxpbmcuCisgIGJvb2wgdW5wYWNrX29uZXJyb3JfZXZlbnRzXzsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBkb20KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2dlbmVyaWNfZXZlbnRfaGFuZGxlcl9yZWZlcmVuY2UuY2MgYi9zcmMvY29iYWx0L2RvbS9nZW5lcmljX2V2ZW50X2hhbmRsZXJfcmVmZXJlbmNlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZWFmZWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS9nZW5lcmljX2V2ZW50X2hhbmRsZXJfcmVmZXJlbmNlLmNjCkBAIC0wLDAgKzEsMTI1IEBACisvLyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiY29iYWx0L2RvbS9nZW5lcmljX2V2ZW50X2hhbmRsZXJfcmVmZXJlbmNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2RvbS9ldmVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vZXZlbnRfdGFyZ2V0LmgiCisjaW5jbHVkZSAiY29iYWx0L2RvbS9zY3JpcHRfZXZlbnRfbG9nLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGRvbSB7CisKK0dlbmVyaWNFdmVudEhhbmRsZXJSZWZlcmVuY2U6OkdlbmVyaWNFdmVudEhhbmRsZXJSZWZlcmVuY2UoCisgICAgc2NyaXB0OjpXcmFwcGFibGUqIHdyYXBwYWJsZSwKKyAgICBjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0VmFsdWUmIHNjcmlwdF92YWx1ZSkgeworICBpZiAoIXNjcmlwdF92YWx1ZS5Jc051bGwoKSkgeworICAgIGV2ZW50X2xpc3RlbmVyX3JlZmVyZW5jZV8ucmVzZXQoCisgICAgICAgIG5ldyBFdmVudExpc3RlbmVyU2NyaXB0VmFsdWU6OlJlZmVyZW5jZSh3cmFwcGFibGUsIHNjcmlwdF92YWx1ZSkpOworICB9Cit9CisKK0dlbmVyaWNFdmVudEhhbmRsZXJSZWZlcmVuY2U6OkdlbmVyaWNFdmVudEhhbmRsZXJSZWZlcmVuY2UoCisgICAgc2NyaXB0OjpXcmFwcGFibGUqIHdyYXBwYWJsZSwKKyAgICBjb25zdCBPbkVycm9yRXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlJiBzY3JpcHRfdmFsdWUpIHsKKyAgaWYgKCFzY3JpcHRfdmFsdWUuSXNOdWxsKCkpIHsKKyAgICBvbl9lcnJvcl9ldmVudF9saXN0ZW5lcl9yZWZlcmVuY2VfLnJlc2V0KAorICAgICAgICBuZXcgT25FcnJvckV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZTo6UmVmZXJlbmNlKHdyYXBwYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRfdmFsdWUpKTsKKyAgfQorfQorCitHZW5lcmljRXZlbnRIYW5kbGVyUmVmZXJlbmNlOjpHZW5lcmljRXZlbnRIYW5kbGVyUmVmZXJlbmNlKAorICAgIHNjcmlwdDo6V3JhcHBhYmxlKiB3cmFwcGFibGUsIGNvbnN0IEdlbmVyaWNFdmVudEhhbmRsZXJSZWZlcmVuY2UmIG90aGVyKSB7CisgIGlmIChvdGhlci5ldmVudF9saXN0ZW5lcl9yZWZlcmVuY2VfKSB7CisgICAgZXZlbnRfbGlzdGVuZXJfcmVmZXJlbmNlXy5yZXNldChuZXcgRXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlOjpSZWZlcmVuY2UoCisgICAgICAgIHdyYXBwYWJsZSwgb3RoZXIuZXZlbnRfbGlzdGVuZXJfcmVmZXJlbmNlXy0+cmVmZXJlbmNlZF92YWx1ZSgpKSk7CisgIH0gZWxzZSBpZiAob3RoZXIub25fZXJyb3JfZXZlbnRfbGlzdGVuZXJfcmVmZXJlbmNlXykgeworICAgIG9uX2Vycm9yX2V2ZW50X2xpc3RlbmVyX3JlZmVyZW5jZV8ucmVzZXQoCisgICAgICAgIG5ldyBPbkVycm9yRXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlOjpSZWZlcmVuY2UoCisgICAgICAgICAgICB3cmFwcGFibGUsCisgICAgICAgICAgICBvdGhlci5vbl9lcnJvcl9ldmVudF9saXN0ZW5lcl9yZWZlcmVuY2VfLT5yZWZlcmVuY2VkX3ZhbHVlKCkpKTsKKyAgfQorfQorCit2b2lkIEdlbmVyaWNFdmVudEhhbmRsZXJSZWZlcmVuY2U6OkhhbmRsZUV2ZW50KAorICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8RXZlbnQ+JiBldmVudCwgYm9vbCBpc19hdHRyaWJ1dGUsCisgICAgYm9vbCB1bnBhY2tfZXJyb3JfZXZlbnQpIHsKKyAgVFJBQ0VfRVZFTlQxKCJjb2JhbHQ6OmRvbSIsICJHZW5lcmljRXZlbnRIYW5kbGVyUmVmZXJlbmNlOjpIYW5kbGVFdmVudCIsCisgICAgICAgICAgICAgICAiRXZlbnQgTmFtZSIsIFRSQUNFX1NUUl9DT1BZKGV2ZW50LT50eXBlKCkuY19zdHIoKSkpOworICBzY3JpcHRfZXZlbnRfbG9nLkdldCgpLlB1c2hFdmVudChldmVudCk7CisKKyAgYm9vbCBoYWRfZXhjZXB0aW9uOworICBiYXNlOjpvcHRpb25hbDxib29sPiByZXN1bHQ7CisKKyAgLy8gRm9yd2FyZCB0aGUgSGFuZGxlRXZlbnQoKSBjYWxsIHRvIHRoZSBhcHByb3ByaWF0ZSBpbnRlcm5hbCBvYmplY3QuCisgIGlmIChldmVudF9saXN0ZW5lcl9yZWZlcmVuY2VfKSB7CisgICAgLy8gTm9uLW9uZXJyb3IgZXZlbnQgaGFuZGxlcnMgY2Fubm90IGhhdmUgdGhlaXIgcGFyYW1ldGVycyB1bnBhY2tlZC4KKyAgICByZXN1bHQgPSBldmVudF9saXN0ZW5lcl9yZWZlcmVuY2VfLT52YWx1ZSgpLkhhbmRsZUV2ZW50KAorICAgICAgICBldmVudC0+Y3VycmVudF90YXJnZXQoKSwgZXZlbnQsICZoYWRfZXhjZXB0aW9uKTsKKyAgfSBlbHNlIGlmIChvbl9lcnJvcl9ldmVudF9saXN0ZW5lcl9yZWZlcmVuY2VfKSB7CisgICAgcmVzdWx0ID0gb25fZXJyb3JfZXZlbnRfbGlzdGVuZXJfcmVmZXJlbmNlXy0+dmFsdWUoKS5IYW5kbGVFdmVudCgKKyAgICAgICAgZXZlbnQtPmN1cnJlbnRfdGFyZ2V0KCksIGV2ZW50LCAmaGFkX2V4Y2VwdGlvbiwgdW5wYWNrX2Vycm9yX2V2ZW50KTsKKyAgfSBlbHNlIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgaGFkX2V4Y2VwdGlvbiA9IHRydWU7CisgIH0KKworICBzY3JpcHRfZXZlbnRfbG9nLkdldCgpLlBvcEV2ZW50KCk7CisKKyAgaWYgKGhhZF9leGNlcHRpb24pIHsKKyAgICByZXR1cm47CisgIH0KKyAgLy8gRXZlbnRIYW5kbGVycyAoRXZlbnRMaXN0ZW5lcnMgc2V0IGFzIGF0dHJpYnV0ZXMpIG1heSByZXR1cm4gZmFsc2UgcmF0aGVyCisgIC8vIHRoYW4gY2FsbCBldmVudC5wcmV2ZW50RGVmYXVsdCgpIGluIHRoZSBoYW5kbGVyIGZ1bmN0aW9uLgorICBpZiAoaXNfYXR0cmlidXRlICYmIHJlc3VsdCAmJiAhcmVzdWx0LnZhbHVlKCkpIHsKKyAgICBldmVudC0+UHJldmVudERlZmF1bHQoKTsKKyAgfQorfQorCitib29sIEdlbmVyaWNFdmVudEhhbmRsZXJSZWZlcmVuY2U6OkVxdWFsVG8oCisgICAgY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlJiBvdGhlcikgeworICByZXR1cm4gKElzTnVsbCgpICYmIG90aGVyLklzTnVsbCgpKSB8fAorICAgICAgICAgKGV2ZW50X2xpc3RlbmVyX3JlZmVyZW5jZV8gJiYKKyAgICAgICAgICBldmVudF9saXN0ZW5lcl9yZWZlcmVuY2VfLT5yZWZlcmVuY2VkX3ZhbHVlKCkuRXF1YWxUbyhvdGhlcikpOworfQorCitib29sIEdlbmVyaWNFdmVudEhhbmRsZXJSZWZlcmVuY2U6OkVxdWFsVG8oCisgICAgY29uc3QgR2VuZXJpY0V2ZW50SGFuZGxlclJlZmVyZW5jZSYgb3RoZXIpIHsKKyAgaWYgKElzTnVsbCgpICYmIG90aGVyLklzTnVsbCgpKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBpZiAoZXZlbnRfbGlzdGVuZXJfcmVmZXJlbmNlXyAmJiBvdGhlci5ldmVudF9saXN0ZW5lcl9yZWZlcmVuY2VfKSB7CisgICAgcmV0dXJuIGV2ZW50X2xpc3RlbmVyX3JlZmVyZW5jZV8tPnJlZmVyZW5jZWRfdmFsdWUoKS5FcXVhbFRvKAorICAgICAgICBvdGhlci5ldmVudF9saXN0ZW5lcl9yZWZlcmVuY2VfLT5yZWZlcmVuY2VkX3ZhbHVlKCkpOworICB9CisgIGlmIChvbl9lcnJvcl9ldmVudF9saXN0ZW5lcl9yZWZlcmVuY2VfICYmCisgICAgICBvdGhlci5vbl9lcnJvcl9ldmVudF9saXN0ZW5lcl9yZWZlcmVuY2VfKSB7CisgICAgcmV0dXJuIG9uX2Vycm9yX2V2ZW50X2xpc3RlbmVyX3JlZmVyZW5jZV8tPnJlZmVyZW5jZWRfdmFsdWUoKS5FcXVhbFRvKAorICAgICAgICBvdGhlci5vbl9lcnJvcl9ldmVudF9saXN0ZW5lcl9yZWZlcmVuY2VfLT5yZWZlcmVuY2VkX3ZhbHVlKCkpOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBHZW5lcmljRXZlbnRIYW5kbGVyUmVmZXJlbmNlOjpJc051bGwoKSBjb25zdCB7CisgIHJldHVybiAoIWV2ZW50X2xpc3RlbmVyX3JlZmVyZW5jZV8gfHwKKyAgICAgICAgICBldmVudF9saXN0ZW5lcl9yZWZlcmVuY2VfLT5yZWZlcmVuY2VkX3ZhbHVlKCkuSXNOdWxsKCkpICYmCisgICAgICAgICAoIW9uX2Vycm9yX2V2ZW50X2xpc3RlbmVyX3JlZmVyZW5jZV8gfHwKKyAgICAgICAgICBvbl9lcnJvcl9ldmVudF9saXN0ZW5lcl9yZWZlcmVuY2VfLT5yZWZlcmVuY2VkX3ZhbHVlKCkuSXNOdWxsKCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgZG9tCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9nZW5lcmljX2V2ZW50X2hhbmRsZXJfcmVmZXJlbmNlLmggYi9zcmMvY29iYWx0L2RvbS9nZW5lcmljX2V2ZW50X2hhbmRsZXJfcmVmZXJlbmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVhYmZiNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL2dlbmVyaWNfZXZlbnRfaGFuZGxlcl9yZWZlcmVuY2UuaApAQCAtMCwwICsxLDEwMCBAQAorLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBDT0JBTFRfRE9NX0dFTkVSSUNfRVZFTlRfSEFORExFUl9SRUZFUkVOQ0VfSF8KKyNkZWZpbmUgQ09CQUxUX0RPTV9HRU5FUklDX0VWRU5UX0hBTkRMRVJfUkVGRVJFTkNFX0hfCisKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vZXZlbnRfbGlzdGVuZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvZG9tL29uX2Vycm9yX2V2ZW50X2xpc3RlbmVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfdmFsdWUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBkb20geworCisvLyBFc3NlbnRpYWxseSBhY3RzIGFzIGFuIGFic3RyYWN0IGludGVyZmFjZSBvZiB0aGUgdW5pb24gZm9yIHR5cGVzCisvLyBbc2NyaXB0OjpTY3JpcHRWYWx1ZTxFdmVudExpc3RlbmVyPiwKKy8vICBzY3JpcHQ6OlNjcmlwdFZhbHVlPE9uRXJyb3JFdmVudExpc3RlbmVyPl0uICBJbiBwYXJ0aWN1bGFyIGl0IHByaW1hcmlseQorLy8gYWxsb3dzIGNvZGUgaW4gZXZlbnRfdGFyZ2V0LmNjIHRvIG5vdCBuZWVkIHRvIGNvbmNlcm4gaXRzZWxmIHdpdGggd2hpY2gKKy8vIGV4YWN0IEV2ZW50TGlzdGVuZXIgc2NyaXB0IHZhbHVlIHR5cGUgaXQgaXMgZGVhbGluZyB3aXRoLiAgVGhlIG5lZWQgZm9yCisvLyB0aGlzIGFic3RyYWN0aW9uIGFyaXNlcyBmcm9tIHRoZSBmYWN0IHRoYXQgdGhlIHx3aW5kb3cub25lcnJvcnwgZXZlbnQKKy8vIGhhbmRsZXIgcmVxdWlyZXMgc3BlY2lhbCBjYXNlIGhhbmRsaW5nOgorLy8gICBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnLyNvbmVycm9yZXZlbnRoYW5kbGVyICkKKy8vCisvLyBOT1RFIHRoYXQgdGhpcyBpcyAqbm90KiBhbiBpZGVhbCBzb2x1dGlvbiB0byB0aGUgcHJvYmxlbSBvZiBnZW5lcmFsaXppbmcKKy8vIG92ZXIgbXVsdGlwbGUgU2NyaXB0VmFsdWUgdHlwZXMuICBUaGUgcHJvYmxlbSBpcyB0aGF0IHRoZSBTY3JpcHRWYWx1ZQorLy8gYmFzZSBjbGFzcyBpcyBib3RoIHRlbXBsYXRlZCBhbmQgYWJzdHJhY3QsIG1ha2luZyBpdCBkaWZmaWN1bHQgdG8gY2FzdCBpdHMKKy8vIGludGVybmFsIHR5cGUgdG8gZ2V0IGEgbmV3IFNjcmlwdFZhbHVlLiAgVGhpcyBwcm9ibGVtIGNvdWxkIGJlIHNvbHZlZCBieQorLy8gcmVmYWN0b3JpbmcgU2NyaXB0VmFsdWUgc3VjaCB0aGF0IHRoZXJlIGlzIGEgbm9uLXRlbXBsYXRlZCBhYnN0cmFjdCB0eXBlCisvLyAoc2F5LCBSYXdTY3JpcHRWYWx1ZSkgd2l0aCBhIGZ1bmN0aW9uIGxpa2UgInZvaWQqIEdldFZhbHVlKCkiLCBidXQgdXN1YWxseQorLy8gbm90IHJlZmVyZW5jZWQgZGlyZWN0bHkgYnkgY2xpZW50IGNvZGUuICBJbnN0ZWFkIHRoZXJlIHdvdWxkIGJlIGEgc2VwYXJhdGUKKy8vIHRlbXBsYXRlZCBjb25jcmV0ZSB3cmFwcGVyIHR5cGUgKHNheSwgU2NyaXB0VmFsdWUpIHRoYXQgd3JhcHMgUmF3U2NyaXB0VmFsdWUKKy8vIGFuZCBtYW5hZ2VzIHRoZSBjYXN0aW5nIGFuZCB0eXBlIGNoZWNraW5nLiAgVGhpcyB3b3VsZCBhbGxvdyB1cyB0byBjb252ZXJ0CisvLyBiZXR3ZWVuIE9uRXJyb3JFdmVudExpc3RlbmVyIGFuZCBFdmVudExpc3RlbmVyLCBpZiBPbkVycm9yRXZlbnRMaXN0ZW5lciB3YXMKKy8vIGRlcml2ZWQgZnJvbSBFdmVudExpc3RlbmVyLgorY2xhc3MgR2VuZXJpY0V2ZW50SGFuZGxlclJlZmVyZW5jZSB7CisgcHVibGljOgorICB0eXBlZGVmIHNjcmlwdDo6U2NyaXB0VmFsdWU8RXZlbnRMaXN0ZW5lcj4gRXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlOworICB0eXBlZGVmIHNjcmlwdDo6U2NyaXB0VmFsdWU8T25FcnJvckV2ZW50TGlzdGVuZXI+CisgICAgICBPbkVycm9yRXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlOworCisgIEdlbmVyaWNFdmVudEhhbmRsZXJSZWZlcmVuY2Uoc2NyaXB0OjpXcmFwcGFibGUqIHdyYXBwYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0VmFsdWUmIHNjcmlwdF92YWx1ZSk7CisgIEdlbmVyaWNFdmVudEhhbmRsZXJSZWZlcmVuY2UoCisgICAgICBzY3JpcHQ6OldyYXBwYWJsZSogd3JhcHBhYmxlLAorICAgICAgY29uc3QgT25FcnJvckV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZSYgc2NyaXB0X3ZhbHVlKTsKKyAgR2VuZXJpY0V2ZW50SGFuZGxlclJlZmVyZW5jZShzY3JpcHQ6OldyYXBwYWJsZSogd3JhcHBhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdlbmVyaWNFdmVudEhhbmRsZXJSZWZlcmVuY2UmIG90aGVyKTsKKworICAvLyBGb3J3YXJkcyBvbiB0byB0aGUgaW50ZXJuYWwgZXZlbnQgaGFuZGxlcidzIEhhbmRsZUV2ZW50KCkgY2FsbCwgcGFzc2luZworICAvLyBpbiB0aGUgdmFsdWUgb2YgfHVucGFja19lcnJvcl9ldmVudHwgaWYgdGhlIGludGVybmFsIHR5cGUgaXMgYQorICAvLyBPbkVycm9yRXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlIHR5cGUuCisgIHZvaWQgSGFuZGxlRXZlbnQoY29uc3Qgc2NvcGVkX3JlZnB0cjxFdmVudD4mIGV2ZW50LCBib29sIGlzX2F0dHJpYnV0ZSwKKyAgICAgICAgICAgICAgICAgICBib29sIHVucGFja19lcnJvcl9ldmVudCk7CisKKyAgYm9vbCBFcXVhbFRvKGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZSYgb3RoZXIpOworICBib29sIEVxdWFsVG8oY29uc3QgR2VuZXJpY0V2ZW50SGFuZGxlclJlZmVyZW5jZSYgb3RoZXIpOworICBib29sIElzTnVsbCgpIGNvbnN0OworCisgIC8vIElmIHRoZSBpbnRlcm5hbCB0eXBlIGlzIGEgRXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlLCB0aGVuIGl0cyB2YWx1ZSB3aWxsCisgIC8vIGJlIHJldHVybmVkLCBvdGhlcndpc2UgbnVsbCBpcyByZXR1cm5lZDsKKyAgY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlKiBldmVudF9saXN0ZW5lcl92YWx1ZSgpIHsKKyAgICByZXR1cm4gZXZlbnRfbGlzdGVuZXJfcmVmZXJlbmNlXworICAgICAgICAgICAgICAgPyAmZXZlbnRfbGlzdGVuZXJfcmVmZXJlbmNlXy0+cmVmZXJlbmNlZF92YWx1ZSgpCisgICAgICAgICAgICAgICA6IG51bGxwdHI7CisgIH0KKworICAvLyBJZiB0aGUgaW50ZXJuYWwgdHlwZSBpcyBhIE9uRXJyb3JFdmVudExpc3RlbmVyU2NyaXB0VmFsdWUsIHRoZW4gaXRzIHZhbHVlCisgIC8vIHdpbGwgYmUgcmV0dXJuZWQsIG90aGVyd2lzZSBudWxsIGlzIHJldHVybmVkOworICBjb25zdCBPbkVycm9yRXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlKiBvbl9lcnJvcl9ldmVudF9saXN0ZW5lcl92YWx1ZSgpIHsKKyAgICByZXR1cm4gb25fZXJyb3JfZXZlbnRfbGlzdGVuZXJfcmVmZXJlbmNlXworICAgICAgICAgICAgICAgPyAmb25fZXJyb3JfZXZlbnRfbGlzdGVuZXJfcmVmZXJlbmNlXy0+cmVmZXJlbmNlZF92YWx1ZSgpCisgICAgICAgICAgICAgICA6IG51bGxwdHI7CisgIH0KKworIHByaXZhdGU6CisgIC8vIEF0IG1vc3Qgb25seSBvbmUgb2YgdGhlIGJlbG93IHR3byBmaWVsZHMgbWF5IGJlIG5vbi1udWxsLi4uICBUaGV5IGFyZQorICAvLyBzZXJ2aW5nIGFzIGEgcG9vciBtYW4ncyBzdGQ6OnZhcmlhbnQuCisgIHNjb3BlZF9wdHI8RXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlOjpSZWZlcmVuY2U+IGV2ZW50X2xpc3RlbmVyX3JlZmVyZW5jZV87CisgIHNjb3BlZF9wdHI8T25FcnJvckV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZTo6UmVmZXJlbmNlPgorICAgICAgb25fZXJyb3JfZXZlbnRfbGlzdGVuZXJfcmVmZXJlbmNlXzsKKworICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oR2VuZXJpY0V2ZW50SGFuZGxlclJlZmVyZW5jZSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgZG9tCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gQ09CQUxUX0RPTV9HRU5FUklDX0VWRU5UX0hBTkRMRVJfUkVGRVJFTkNFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9nbG9iYWxfZXZlbnRfaGFuZGxlcnMuaWRsIGIvc3JjL2NvYmFsdC9kb20vZ2xvYmFsX2V2ZW50X2hhbmRsZXJzLmlkbAppbmRleCBkZjg1MmZjLi43MzNkY2M4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9nbG9iYWxfZXZlbnRfaGFuZGxlcnMuaWRsCisrKyBiL3NyYy9jb2JhbHQvZG9tL2dsb2JhbF9ldmVudF9oYW5kbGVycy5pZGwKQEAgLTE4LDcgKzE4LDcgQEAKIGludGVyZmFjZSBHbG9iYWxFdmVudEhhbmRsZXJzIHsKICAgYXR0cmlidXRlIEV2ZW50SGFuZGxlciBvbmJsdXI7CiAgIGF0dHJpYnV0ZSBFdmVudEhhbmRsZXIgb25jbGljazsKLSAgYXR0cmlidXRlIEV2ZW50SGFuZGxlciBvbmVycm9yOworICBhdHRyaWJ1dGUgT25FcnJvckV2ZW50TGlzdGVuZXIgb25lcnJvcjsKICAgYXR0cmlidXRlIEV2ZW50SGFuZGxlciBvbmZvY3VzOwogCiAgIGF0dHJpYnV0ZSBFdmVudEhhbmRsZXIgb25rZXlkb3duOwpAQCAtNzIsMyArNzIsNCBAQAogLy8gZnVuY3Rpb24uIERlZmluZSBpdCBhcyBhIG51bGxhYmxlIEV2ZW50TGlzdGVuZXIgZm9yIG5vdyB1bnRpbCB3ZSBjYW4gZG8KIC8vIHNvbWUgcmVmYWN0b3JpbmcgdG8gYWNjZXB0IGJvdGggaW4gdGhlIEV2ZW50VGFyZ2V0IGltcGxlbWVudGF0aW9uLgogdHlwZWRlZiBFdmVudExpc3RlbmVyPyBFdmVudEhhbmRsZXI7Cit0eXBlZGVmIE9uRXJyb3JFdmVudExpc3RlbmVyPyBPbkVycm9yRXZlbnRIYW5kbGVyOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vaHRtbF9lbGVtZW50LmNjIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9lbGVtZW50LmNjCmluZGV4IDZkZGY2Y2YuLjc0NDcxYjAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfZWxlbWVudC5jYworKysgYi9zcmMvY29iYWx0L2RvbS9odG1sX2VsZW1lbnQuY2MKQEAgLTE0Miw2ICsxNDIsMjcgQEAKIAogfSAgLy8gbmFtZXNwYWNlCiAKK3ZvaWQgSFRNTEVsZW1lbnQ6OlJ1bGVNYXRjaGluZ1N0YXRlOjpDbGVhcigpIHsKKyAgaWYgKGlzX3NldCkgeworICAgIGlzX3NldCA9IGZhbHNlOworCisgICAgcGFyZW50X21hdGNoaW5nX25vZGVzLmNsZWFyKCk7CisgICAgcGFyZW50X2Rlc2NlbmRhbnRfbm9kZXMuY2xlYXIoKTsKKworICAgIHByZXZpb3VzX3NpYmxpbmdfbWF0Y2hpbmdfbm9kZXMuY2xlYXIoKTsKKyAgICBwcmV2aW91c19zaWJsaW5nX2ZvbGxvd2luZ19zaWJsaW5nX25vZGVzLmNsZWFyKCk7CisKKyAgICBtYXRjaGluZ19ub2Rlc19wYXJlbnRfbm9kZXMuY2xlYXIoKTsKKyAgICBtYXRjaGluZ19ub2Rlcy5jbGVhcigpOworCisgICAgYXJlX2Rlc2NlbmRhbnRfbm9kZXNfZGlydHkgPSB0cnVlOworICAgIGRlc2NlbmRhbnRfbm9kZXMuY2xlYXIoKTsKKworICAgIGFyZV9mb2xsb3dpbmdfc2libGluZ19ub2Rlc19kaXJ0eSA9IHRydWU7CisgICAgZm9sbG93aW5nX3NpYmxpbmdfbm9kZXMuY2xlYXIoKTsKKyAgfQorfQorCiBzdGQ6OnN0cmluZyBIVE1MRWxlbWVudDo6ZGlyKCkgY29uc3QgewogICAvLyBUaGUgZGlyIGF0dHJpYnV0ZSBpcyBsaW1pdGVkIHRvIG9ubHkga25vd24gdmFsdWVzLiBPbiBnZXR0aW5nLCBkaXIgbXVzdAogICAvLyByZXR1cm4gdGhlIGNvbmZvcm1pbmcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdGF0ZSB0aGUgYXR0cmlidXRlIGlzIGluLApAQCAtNTkzLDMwICs2MTQsNTAgQEAKICAgcmV0dXJuIE5VTEw7CiB9CiAKK3ZvaWQgSFRNTEVsZW1lbnQ6OkNsZWFyUnVsZU1hdGNoaW5nU3RhdGUoKSB7CisgIENsZWFyUnVsZU1hdGNoaW5nU3RhdGVJbnRlcm5hbCh0cnVlIC8qaW52YWxpZGF0ZV9kZXNjZW5kYW50cyovKTsKK30KKwordm9pZCBIVE1MRWxlbWVudDo6Q2xlYXJSdWxlTWF0Y2hpbmdTdGF0ZUludGVybmFsKGJvb2wgaW52YWxpZGF0ZV9kZXNjZW5kYW50cykgeworICBydWxlX21hdGNoaW5nX3N0YXRlXy5DbGVhcigpOworICBtYXRjaGluZ19ydWxlc192YWxpZF8gPSBmYWxzZTsKKworICBpZiAoaW52YWxpZGF0ZV9kZXNjZW5kYW50cykgeworICAgIEludmFsaWRhdGVNYXRjaGluZ1J1bGVzUmVjdXJzaXZlbHlJbnRlcm5hbCh0cnVlIC8qaXNfaW5pdGlhbF9lbGVtZW50Ki8pOworICB9Cit9CisKK3ZvaWQgSFRNTEVsZW1lbnQ6OkNsZWFyUnVsZU1hdGNoaW5nU3RhdGVPbkVsZW1lbnRBbmRBbmNlc3RvcnMoCisgICAgYm9vbCBpbnZhbGlkYXRlX21hdGNoaW5nX3J1bGVzKSB7CisgIEVsZW1lbnQqIHBhcmVudF9lbGVtZW50ID0gdGhpcy0+cGFyZW50X2VsZW1lbnQoKTsKKyAgSFRNTEVsZW1lbnQqIHBhcmVudF9odG1sX2VsZW1lbnQgPQorICAgICAgcGFyZW50X2VsZW1lbnQgPyBwYXJlbnRfZWxlbWVudC0+QXNIVE1MRWxlbWVudCgpIDogTlVMTDsKKyAgaWYgKHBhcmVudF9odG1sX2VsZW1lbnQpIHsKKyAgICBwYXJlbnRfaHRtbF9lbGVtZW50LT5DbGVhclJ1bGVNYXRjaGluZ1N0YXRlT25FbGVtZW50QW5kQW5jZXN0b3JzKAorICAgICAgICBpbnZhbGlkYXRlX21hdGNoaW5nX3J1bGVzKTsKKyAgfQorICBDbGVhclJ1bGVNYXRjaGluZ1N0YXRlSW50ZXJuYWwoaW52YWxpZGF0ZV9tYXRjaGluZ19ydWxlcyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50X2h0bWxfZWxlbWVudCA9PSBOVUxMKTsKK30KKwordm9pZCBIVE1MRWxlbWVudDo6Q2xlYXJSdWxlTWF0Y2hpbmdTdGF0ZU9uRWxlbWVudEFuZERlc2NlbmRhbnRzKCkgeworICBDbGVhclJ1bGVNYXRjaGluZ1N0YXRlSW50ZXJuYWwoZmFsc2UgLyogaW52YWxpZGF0ZV9kZXNjZW5kYW50cyovKTsKKyAgZm9yIChFbGVtZW50KiBlbGVtZW50ID0gZmlyc3RfZWxlbWVudF9jaGlsZCgpOyBlbGVtZW50OworICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LT5uZXh0X2VsZW1lbnRfc2libGluZygpKSB7CisgICAgSFRNTEVsZW1lbnQqIGh0bWxfZWxlbWVudCA9IGVsZW1lbnQtPkFzSFRNTEVsZW1lbnQoKTsKKyAgICBpZiAoaHRtbF9lbGVtZW50KSB7CisgICAgICBodG1sX2VsZW1lbnQtPkNsZWFyUnVsZU1hdGNoaW5nU3RhdGVPbkVsZW1lbnRBbmREZXNjZW5kYW50cygpOworICAgIH0KKyAgfQorfQorCiB2b2lkIEhUTUxFbGVtZW50OjpJbnZhbGlkYXRlTWF0Y2hpbmdSdWxlc1JlY3Vyc2l2ZWx5KCkgewotICBJbnZhbGlkYXRlTWF0Y2hpbmdSdWxlc1JlY3Vyc2l2ZWx5SW50ZXJuYWwodHJ1ZSAvKmlzX2luaXRpYWxfaW52YWxpZGF0aW9uKi8pOworICBJbnZhbGlkYXRlTWF0Y2hpbmdSdWxlc1JlY3Vyc2l2ZWx5SW50ZXJuYWwodHJ1ZSAvKmlzX2luaXRpYWxfZWxlbWVudCovKTsKIH0KIAogdm9pZCBIVE1MRWxlbWVudDo6SW52YWxpZGF0ZU1hdGNoaW5nUnVsZXNSZWN1cnNpdmVseUludGVybmFsKAotICAgIGJvb2wgaXNfaW5pdGlhbF9pbnZhbGlkYXRpb24pIHsKLSAgaWYgKG1hdGNoaW5nX3J1bGVzX3ZhbGlkXykgewotICAgIC8vIE1vdmUgfG1hdGNoaW5nX3J1bGVzX3wgaW50byB8b2xkX21hdGNoaW5nX3J1bGVzX3wuIFRoaXMgaXMgdXNlZCBmb3IKLSAgICAvLyBkZXRlcm1pbmluZyB3aGV0aGVyIG9yIG5vdCB0aGUgbWF0Y2hpbmcgcnVsZXMgYWN0dWFsbHkgY2hhbmdlZCB3aGVuIHRoZXkKLSAgICAvLyBhcmUgdXBkYXRlZC4KLSAgICBvbGRfbWF0Y2hpbmdfcnVsZXNfLnN3YXAobWF0Y2hpbmdfcnVsZXNfKTsKLQotICAgIG1hdGNoaW5nX3J1bGVzXy5jbGVhcigpOwotICAgIHJ1bGVfbWF0Y2hpbmdfc3RhdGVfLm1hdGNoaW5nX25vZGVzLmNsZWFyKCk7Ci0gICAgcnVsZV9tYXRjaGluZ19zdGF0ZV8uZGVzY2VuZGFudF9wb3RlbnRpYWxfbm9kZXMuY2xlYXIoKTsKLSAgICBydWxlX21hdGNoaW5nX3N0YXRlXy5mb2xsb3dpbmdfc2libGluZ19wb3RlbnRpYWxfbm9kZXMuY2xlYXIoKTsKLSAgICBmb3IgKGludCBwc2V1ZG9fZWxlbWVudF90eXBlID0gMDsKLSAgICAgICAgIHBzZXVkb19lbGVtZW50X3R5cGUgPCBrTWF4UHNldWRvRWxlbWVudFR5cGU7ICsrcHNldWRvX2VsZW1lbnRfdHlwZSkgewotICAgICAgaWYgKHBzZXVkb19lbGVtZW50c19bcHNldWRvX2VsZW1lbnRfdHlwZV0pIHsKLSAgICAgICAgcHNldWRvX2VsZW1lbnRzX1twc2V1ZG9fZWxlbWVudF90eXBlXS0+Q2xlYXJNYXRjaGluZ1J1bGVzKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIG1hdGNoaW5nX3J1bGVzX3ZhbGlkXyA9IGZhbHNlOwotICB9CisgICAgYm9vbCBpc19pbml0aWFsX2VsZW1lbnQpIHsKKyAgbWF0Y2hpbmdfcnVsZXNfdmFsaWRfID0gZmFsc2U7CiAKICAgLy8gSW52YWxpZGF0ZSBtYXRjaGluZyBydWxlcyBvbiBhbGwgY2hpbGRyZW4uCiAgIGZvciAoRWxlbWVudCogZWxlbWVudCA9IGZpcnN0X2VsZW1lbnRfY2hpbGQoKTsgZWxlbWVudDsKQEAgLTYyNCwyNiArNjY1LDQ4IEBACiAgICAgSFRNTEVsZW1lbnQqIGh0bWxfZWxlbWVudCA9IGVsZW1lbnQtPkFzSFRNTEVsZW1lbnQoKTsKICAgICBpZiAoaHRtbF9lbGVtZW50KSB7CiAgICAgICBodG1sX2VsZW1lbnQtPkludmFsaWRhdGVNYXRjaGluZ1J1bGVzUmVjdXJzaXZlbHlJbnRlcm5hbCgKLSAgICAgICAgICBmYWxzZSAvKmlzX2luaXRpYWxfaW52YWxpZGF0aW9uKi8pOworICAgICAgICAgIGZhbHNlIC8qaXNfaW5pdGlhbF9lbGVtZW50Ki8pOwogICAgIH0KICAgfQogCiAgIC8vIEludmFsaWRhdGUgbWF0Y2hpbmcgcnVsZXMgb24gYWxsIGZvbGxvd2luZyBzaWJsaW5ncyBpZiB0aGlzIGlzIHRoZSBpbml0aWFsCi0gIC8vIGludmFsaWRhdGlvbiBhbmQgc2libGluZyBjb21iaW5hdG9ycyBhcmUgdXNlZDsgaWYgdGhpcyBpcyBub3QgdGhlIGluaXRpYWwKLSAgLy8gaW52YWxpZGF0aW9uLCB0aGVuIHRoZXNlIHdpbGwgYWxyZWFkeSBiZSBoYW5kbGVkIGJ5IGEgcHJldmlvdXMgY2FsbC4KLSAgaWYgKGlzX2luaXRpYWxfaW52YWxpZGF0aW9uICYmCisgIC8vIGVsZW1lbnQgYW5kIHNpYmxpbmcgY29tYmluYXRvcnMgYXJlIHVzZWQ7IGlmIHRoaXMgaXMgbm90IHRoZSBpbml0aWFsCisgIC8vIGVsZW1lbnQsIHRoZW4gdGhlc2Ugd2lsbCBhbHJlYWR5IGJlIGhhbmRsZWQgYnkgYSBwcmV2aW91cyBjYWxsLgorICBpZiAoaXNfaW5pdGlhbF9lbGVtZW50ICYmCiAgICAgICBub2RlX2RvY3VtZW50KCktPnNlbGVjdG9yX3RyZWUoKS0+aGFzX3NpYmxpbmdfY29tYmluYXRvcnMoKSkgewogICAgIGZvciAoRWxlbWVudCogZWxlbWVudCA9IG5leHRfZWxlbWVudF9zaWJsaW5nKCk7IGVsZW1lbnQ7CiAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC0+bmV4dF9lbGVtZW50X3NpYmxpbmcoKSkgewogICAgICAgSFRNTEVsZW1lbnQqIGh0bWxfZWxlbWVudCA9IGVsZW1lbnQtPkFzSFRNTEVsZW1lbnQoKTsKICAgICAgIGlmIChodG1sX2VsZW1lbnQpIHsKICAgICAgICAgaHRtbF9lbGVtZW50LT5JbnZhbGlkYXRlTWF0Y2hpbmdSdWxlc1JlY3Vyc2l2ZWx5SW50ZXJuYWwoCi0gICAgICAgICAgICBmYWxzZSAvKmlzX2luaXRpYWxfaW52YWxpZGF0aW9uKi8pOworICAgICAgICAgICAgZmFsc2UgLyppc19pbml0aWFsX2VsZW1lbnQqLyk7CiAgICAgICB9CiAgICAgfQogICB9CiB9CiAKK3ZvaWQgSFRNTEVsZW1lbnQ6OlVwZGF0ZU1hdGNoaW5nUnVsZXMoKSB7IFVwZGF0ZUVsZW1lbnRNYXRjaGluZ1J1bGVzKHRoaXMpOyB9CisKK3ZvaWQgSFRNTEVsZW1lbnQ6OlVwZGF0ZU1hdGNoaW5nUnVsZXNSZWN1cnNpdmVseSgpIHsKKyAgVXBkYXRlTWF0Y2hpbmdSdWxlcygpOworICBmb3IgKEVsZW1lbnQqIGVsZW1lbnQgPSBmaXJzdF9lbGVtZW50X2NoaWxkKCk7IGVsZW1lbnQ7CisgICAgICAgZWxlbWVudCA9IGVsZW1lbnQtPm5leHRfZWxlbWVudF9zaWJsaW5nKCkpIHsKKyAgICBIVE1MRWxlbWVudCogaHRtbF9lbGVtZW50ID0gZWxlbWVudC0+QXNIVE1MRWxlbWVudCgpOworICAgIGlmIChodG1sX2VsZW1lbnQpIHsKKyAgICAgIGh0bWxfZWxlbWVudC0+VXBkYXRlTWF0Y2hpbmdSdWxlc1JlY3Vyc2l2ZWx5KCk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgSFRNTEVsZW1lbnQ6Ok9uTWF0Y2hpbmdSdWxlc01vZGlmaWVkKCkgeworICBkb21fc3RhdF90cmFja2VyXy0+T25VcGRhdGVNYXRjaGluZ1J1bGVzKCk7CisgIGNvbXB1dGVkX3N0eWxlX3ZhbGlkXyA9IGZhbHNlOworfQorCit2b2lkIEhUTUxFbGVtZW50OjpPblBzZXVkb0VsZW1lbnRNYXRjaGluZ1J1bGVzTW9kaWZpZWQoKSB7CisgIHBzZXVkb19lbGVtZW50c19jb21wdXRlZF9zdHlsZXNfdmFsaWRfID0gZmFsc2U7Cit9CisKIHZvaWQgSFRNTEVsZW1lbnQ6OlVwZGF0ZUNvbXB1dGVkU3R5bGVSZWN1cnNpdmVseSgKICAgICBjb25zdCBzY29wZWRfcmVmcHRyPGNzc29tOjpDU1NDb21wdXRlZFN0eWxlRGVjbGFyYXRpb24+JgogICAgICAgICBwYXJlbnRfY29tcHV0ZWRfc3R5bGVfZGVjbGFyYXRpb24sCkBAIC02NTUsOSArNzE4LDggQEAKICAgICByZXR1cm47CiAgIH0KIAotICAvLyBVcGRhdGUgY29tcHV0ZWQgc3R5bGUgZm9yIHRoaXMgZWxlbWVudC4KLSAgYm9vbCBpc192YWxpZCA9Ci0gICAgICBhbmNlc3RvcnNfd2VyZV92YWxpZCAmJiBtYXRjaGluZ19ydWxlc192YWxpZF8gJiYgY29tcHV0ZWRfc3R5bGVfdmFsaWRfOworICAvLyBVcGRhdGUgY29tcHV0ZWQgc3R5bGVzIGZvciB0aGlzIGVsZW1lbnQgaWYgYW55IGFyZW4ndCB2YWxpZC4KKyAgYm9vbCBpc192YWxpZCA9IGFuY2VzdG9yc193ZXJlX3ZhbGlkICYmIEFyZUNvbXB1dGVkU3R5bGVzVmFsaWQoKTsKICAgaWYgKCFpc192YWxpZCkgewogICAgIFVwZGF0ZUNvbXB1dGVkU3R5bGUocGFyZW50X2NvbXB1dGVkX3N0eWxlX2RlY2xhcmF0aW9uLCByb290X2NvbXB1dGVkX3N0eWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVfY2hhbmdlX2V2ZW50X3RpbWUsIGtBbmNlc3RvcnNBcmVEaXNwbGF5ZWQpOwpAQCAtODA1LDYgKzg2Nyw3IEBACiAgICAgICBzdHlsZV8obmV3IGNzc29tOjpDU1NEZWNsYXJlZFN0eWxlRGVjbGFyYXRpb24oCiAgICAgICAgICAgZG9jdW1lbnQtPmh0bWxfZWxlbWVudF9jb250ZXh0KCktPmNzc19wYXJzZXIoKSkpLAogICAgICAgY29tcHV0ZWRfc3R5bGVfdmFsaWRfKGZhbHNlKSwKKyAgICAgIHBzZXVkb19lbGVtZW50c19jb21wdXRlZF9zdHlsZXNfdmFsaWRfKGZhbHNlKSwKICAgICAgIGRlc2NlbmRhbnRfY29tcHV0ZWRfc3R5bGVzX3ZhbGlkXyhmYWxzZSksCiAgICAgICBhbmNlc3RvcnNfYXJlX2Rpc3BsYXllZF8oa0FuY2VzdG9yc0FyZURpc3BsYXllZCksCiAgICAgICBjc3NfY29tcHV0ZWRfc3R5bGVfZGVjbGFyYXRpb25fKG5ldyBjc3NvbTo6Q1NTQ29tcHV0ZWRTdHlsZURlY2xhcmF0aW9uKCkpLApAQCAtODU4LDI1ICs5MjEsMzQgQEAKICAgICBSdW5VbkZvY3VzaW5nU3RlcHMoKTsKICAgICBkb2N1bWVudC0+T25Gb2N1c0NoYW5nZSgpOwogICB9CisKKyAgLy8gT25seSBjbGVhciB0aGUgcnVsZSBtYXRjaGluZyBvbiB0aGlzIGVsZW1lbnQuIERlc2NlbmRhbnRzIHdpbGwgYmUgaGFuZGxlZAorICAvLyBieSBPblJlbW92ZWRGcm9tRG9jdW1lbnQoKSBiZWluZyBjYWxsZWQgb24gdGhlbSBmcm9tCisgIC8vIE5vZGU6Ok9uUmVtb3ZlZEZyb21Eb2N1bWVudCgpLgorICBDbGVhclJ1bGVNYXRjaGluZ1N0YXRlSW50ZXJuYWwoZmFsc2UgLyppbnZhbGlkYXRlX2Rlc2NlbmRhbnRzKi8pOwogfQogCiB2b2lkIEhUTUxFbGVtZW50OjpPbk11dGF0aW9uKCkgeyBJbnZhbGlkYXRlTWF0Y2hpbmdSdWxlc1JlY3Vyc2l2ZWx5KCk7IH0KIAogdm9pZCBIVE1MRWxlbWVudDo6T25TZXRBdHRyaWJ1dGUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgaWYgKG5hbWUgPT0gImNsYXNzIiB8fCBuYW1lID09ICJpZCIpIHsKLSAgICBJbnZhbGlkYXRlTWF0Y2hpbmdSdWxlc1JlY3Vyc2l2ZWx5KCk7Ci0gIH0gZWxzZSBpZiAobmFtZSA9PSAiZGlyIikgeworICBpZiAobmFtZSA9PSAiZGlyIikgewogICAgIFNldERpcmVjdGlvbmFsaXR5KHZhbHVlKTsKICAgfQorCisgIC8vIEFsd2F5cyBjbGVhciB0aGUgbWF0Y2hpbmcgc3RhdGUgd2hlbiBhbiBhdHRyaWJ1dGUgY2hhbmdlcy4gQW55IGF0dHJpYnV0ZQorICAvLyBjaGFuZ2luZyBjYW4gcG90ZW50aWFsbHkgaW1wYWN0IHRoZSBtYXRjaGluZyBydWxlcy4KKyAgQ2xlYXJSdWxlTWF0Y2hpbmdTdGF0ZSgpOwogfQogCiB2b2lkIEhUTUxFbGVtZW50OjpPblJlbW92ZUF0dHJpYnV0ZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgewotICBpZiAobmFtZSA9PSAiY2xhc3MiIHx8IG5hbWUgPT0gImlkIikgewotICAgIEludmFsaWRhdGVNYXRjaGluZ1J1bGVzUmVjdXJzaXZlbHkoKTsKLSAgfSBlbHNlIGlmIChuYW1lID09ICJkaXIiKSB7CisgIGlmIChuYW1lID09ICJkaXIiKSB7CiAgICAgU2V0RGlyZWN0aW9uYWxpdHkoIiIpOwogICB9CisKKyAgLy8gQWx3YXlzIGNsZWFyIHRoZSBtYXRjaGluZyBzdGF0ZSB3aGVuIGFuIGF0dHJpYnV0ZSBjaGFuZ2VzLiBBbnkgYXR0cmlidXRlCisgIC8vIGNoYW5naW5nIGNhbiBwb3RlbnRpYWxseSBpbXBhY3QgdGhlIG1hdGNoaW5nIHJ1bGVzLgorICBDbGVhclJ1bGVNYXRjaGluZ1N0YXRlKCk7CiB9CiAKIC8vIEFsZ29yaXRobSBmb3IgSXNGb2N1c2FibGU6CkBAIC05NTgsOCArMTAzMCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnQ6OmtOb3RDYW5jZWxhYmxlLCBkb2N1bWVudC0+d2luZG93KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcykpOwogCi0gIC8vIEN1c3RvbSwgbm90IGluIGFueSBzZXBjLgotICBJbnZhbGlkYXRlTWF0Y2hpbmdSdWxlc1JlY3Vyc2l2ZWx5KCk7CisgIC8vIEN1c3RvbSwgbm90IGluIGFueSBzcGVjLgorICBDbGVhclJ1bGVNYXRjaGluZ1N0YXRlKCk7CiB9CiAKIC8vIEFsZ29yaXRobSBmb3IgUnVuVW5Gb2N1c2luZ1N0ZXBzOgpAQCAtOTkzLDggKzEwNjUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50OjprTm90Q2FuY2VsYWJsZSwgZG9jdW1lbnQtPndpbmRvdygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMpKTsKIAotICAvLyBDdXN0b20sIG5vdCBpbiBhbnkgc2VwYy4KLSAgSW52YWxpZGF0ZU1hdGNoaW5nUnVsZXNSZWN1cnNpdmVseSgpOworICAvLyBDdXN0b20sIG5vdCBpbiBhbnkgc3BlYy4KKyAgQ2xlYXJSdWxlTWF0Y2hpbmdTdGF0ZSgpOwogfQogCiB2b2lkIEhUTUxFbGVtZW50OjpTZXREaXJlY3Rpb25hbGl0eShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKQEAgLTEyNDksNiArMTMyMSw5IEBACiAgIERDSEVDSyhkb2N1bWVudCkgPDwgIkVsZW1lbnQgc2hvdWxkIGJlIGF0dGFjaGVkIHRvIGRvY3VtZW50IGluIG9yZGVyIHRvICIKICAgICAgICAgICAgICAgICAgICAgICAicGFydGljaXBhdGUgaW4gbGF5b3V0LiI7CiAKKyAgLy8gVmVyaWZ5IHRoYXQgdGhlIG1hdGNoaW5nIHJ1bGVzIGZvciB0aGlzIGVsZW1lbnQgYXJlIHZhbGlkLiBUaGV5IHNob3VsZCBoYXZlCisgIC8vIGJlZW4gdXBkYXRlZCBwcmlvciB0byBVcGRhdGVDb21wdXRlZFN0eWxlKCkgYmVpbmcgY2FsbGVkLgorICBEQ0hFQ0sobWF0Y2hpbmdfcnVsZXNfdmFsaWRfKTsKICAgLy8gSWYgdGhlcmUgaXMgbm8gcHJldmlvdXMgY29tcHV0ZWQgc3R5bGUsIHRoZXJlIHNob3VsZCBhbHNvIGJlIG5vIGxheW91dAogICAvLyBib3hlcy4KICAgRENIRUNLKGNvbXB1dGVkX3N0eWxlKCkgfHwgTlVMTCA9PSBsYXlvdXRfYm94ZXMoKSk7CkBAIC0xMjU5LDE4ICsxMzM0LDYgQEAKICAgLy8gaW52YWxpZCBvciBubyBjb21wdXRlZCBzdHlsZSBoYXMgYmVlbiBjcmVhdGVkIHlldC4KICAgYm9vbCBnZW5lcmF0ZV9jb21wdXRlZF9zdHlsZSA9ICFjb21wdXRlZF9zdHlsZV92YWxpZF8gfHwgIWNvbXB1dGVkX3N0eWxlKCk7CiAKLSAgLy8gVXBkYXRlIG1hdGNoaW5nIHJ1bGVzIGlmIG5lY2Vzc2FyeS4KLSAgaWYgKCFtYXRjaGluZ19ydWxlc192YWxpZF8pIHsKLSAgICBkb21fc3RhdF90cmFja2VyXy0+T25VcGRhdGVNYXRjaGluZ1J1bGVzKCk7Ci0gICAgVXBkYXRlTWF0Y2hpbmdSdWxlcyh0aGlzKTsKLQotICAgIC8vIENoZWNrIGZvciB3aGV0aGVyIHRoZSBtYXRjaGluZyBydWxlcyBoYXZlIGNoYW5nZWQuIElmIHRoZXkgaGF2ZSwgdGhlbiBhCi0gICAgLy8gbmV3IGNvbXB1dGVkIHN0eWxlIG11c3QgYmUgZ2VuZXJhdGVkIGZyb20gdGhlbS4KLSAgICBpZiAoIWdlbmVyYXRlX2NvbXB1dGVkX3N0eWxlICYmIG9sZF9tYXRjaGluZ19ydWxlc18gIT0gbWF0Y2hpbmdfcnVsZXNfKSB7Ci0gICAgICBnZW5lcmF0ZV9jb21wdXRlZF9zdHlsZSA9IHRydWU7Ci0gICAgfQotICB9Ci0KICAgLy8gSWYgYW55IGRlY2xhcmVkIHByb3BlcnRpZXMgaW5oZXJpdGVkIGZyb20gdGhlIHBhcmVudCBhcmUgbm8gbG9uZ2VyIHZhbGlkLAogICAvLyB0aGVuIGEgbmV3IGNvbXB1dGVkIHN0eWxlIG11c3QgYmUgZ2VuZXJhdGVkIHdpdGggdGhlIHVwZGF0ZWQgaW5oZXJpdGVkCiAgIC8vIHZhbHVlcy4KQEAgLTEzMjUsMjkgKzEzODgsMzUgQEAKICAgLy8gVXBkYXRlIHRoZSBkaXNwbGF5ZWQgc3RhdHVzIG9mIG91ciBhbmNlc3RvcnMuCiAgIGFuY2VzdG9yc19hcmVfZGlzcGxheWVkXyA9IGFuY2VzdG9yc19hcmVfZGlzcGxheWVkOwogCi0gIC8vIE5PVEU6IEN1cnJlbnRseSwgcHNldWRvIGVsZW1lbnQncyBjb21wdXRlZCBzdHlsZXMgYXJlIGFsd2F5cyBnZW5lcmF0ZWQuIElmCi0gIC8vIHRoaXMgYmVjb21lcyBhIHBlcmZvcm1hbmNlIGJvdHRsZW5lY2ssIGNoYW5nZSB0aGUgbG9naWMgc28gdGhhdCBpdCBvbmx5Ci0gIC8vIG9jY3VycyB3aGVuIG5lZWRlZC4KLQotICAvLyBQcm9tb3RlIHRoZSBtYXRjaGluZyBydWxlcyBmb3IgYWxsIGtub3duIHBzZXVkbyBlbGVtZW50cy4KLSAgZm9yIChpbnQgcHNldWRvX2VsZW1lbnRfdHlwZSA9IDA7IHBzZXVkb19lbGVtZW50X3R5cGUgPCBrTWF4UHNldWRvRWxlbWVudFR5cGU7Ci0gICAgICAgKytwc2V1ZG9fZWxlbWVudF90eXBlKSB7Ci0gICAgaWYgKHBzZXVkb19lbGVtZW50c19bcHNldWRvX2VsZW1lbnRfdHlwZV0pIHsKLSAgICAgIGRvbV9zdGF0X3RyYWNrZXJfLT5PbkdlbmVyYXRlUHNldWRvRWxlbWVudENvbXB1dGVkU3R5bGUoKTsKLSAgICAgIERvQ29tcHV0ZWRTdHlsZVVwZGF0ZSgKLSAgICAgICAgICBwc2V1ZG9fZWxlbWVudHNfW3BzZXVkb19lbGVtZW50X3R5cGVdLT5tYXRjaGluZ19ydWxlcygpLAotICAgICAgICAgICZwcm9wZXJ0eV9rZXlfdG9fYmFzZV91cmxfbWFwLCBOVUxMLCBjc3NfY29tcHV0ZWRfc3R5bGVfZGVjbGFyYXRpb24oKSwKLSAgICAgICAgICByb290X2NvbXB1dGVkX3N0eWxlLCBkb2N1bWVudC0+dmlld3BvcnRfc2l6ZSgpLAotICAgICAgICAgIHBzZXVkb19lbGVtZW50c19bcHNldWRvX2VsZW1lbnRfdHlwZV0tPmNvbXB1dGVkX3N0eWxlKCksCi0gICAgICAgICAgc3R5bGVfY2hhbmdlX2V2ZW50X3RpbWUsCi0gICAgICAgICAgcHNldWRvX2VsZW1lbnRzX1twc2V1ZG9fZWxlbWVudF90eXBlXS0+Y3NzX3RyYW5zaXRpb25zKCksCi0gICAgICAgICAgcHNldWRvX2VsZW1lbnRzX1twc2V1ZG9fZWxlbWVudF90eXBlXS0+Y3NzX2FuaW1hdGlvbnMoKSwKLSAgICAgICAgICBkb2N1bWVudC0+a2V5ZnJhbWVzX21hcCgpLAotICAgICAgICAgIG9sZF9pc19kaXNwbGF5ZWQgPyBrQW5jZXN0b3JzQXJlRGlzcGxheWVkIDoga0FuY2VzdG9yc0FyZU5vdERpc3BsYXllZCwKLSAgICAgICAgICBJc0Rpc3BsYXllZCgpID8ga0FuY2VzdG9yc0FyZURpc3BsYXllZCA6IGtBbmNlc3RvcnNBcmVOb3REaXNwbGF5ZWQsCi0gICAgICAgICAga0lzUHNldWRvRWxlbWVudCwgJmludmFsaWRhdGlvbl9mbGFncywKLSAgICAgICAgICBwc2V1ZG9fZWxlbWVudHNfW3BzZXVkb19lbGVtZW50X3R5cGVdCi0gICAgICAgICAgICAgIC0+Y3NzX2NvbXB1dGVkX3N0eWxlX2RlY2xhcmF0aW9uKCkpOworICAvLyBQcm9jZXNzIHBzZXVkbyBlbGVtZW50cy4gVGhleSBtdXN0IGhhdmUgdGhlaXIgY29tcHV0ZWQgc3R5bGUgZ2VuZXJhdGVkIGlmCisgIC8vIGVpdGhlciB0aGVpciBvd25pbmcgSFRNTCBlbGVtZW50J3Mgc3R5bGUgd2FzIGp1c3QgZ2VuZXJhdGVkIG9yIHRoZWlyCisgIC8vIGNvbXB1dGVkIHN0eWxlIGlzIGludmFsaWQgKHRoaXMgb2NjdXJzIHdoZW4gdGhlaXIgbWF0Y2hpbmcgcnVsZXMgY2hhbmdlKS4KKyAgZm9yIChpbnQgdHlwZSA9IDA7IHR5cGUgPCBrTWF4UHNldWRvRWxlbWVudFR5cGU7ICsrdHlwZSkgeworICAgIFBzZXVkb0VsZW1lbnQqIHR5cGVfcHNldWRvX2VsZW1lbnQgPQorICAgICAgICBwc2V1ZG9fZWxlbWVudChQc2V1ZG9FbGVtZW50VHlwZSh0eXBlKSk7CisgICAgaWYgKHR5cGVfcHNldWRvX2VsZW1lbnQpIHsKKyAgICAgIGlmIChnZW5lcmF0ZV9jb21wdXRlZF9zdHlsZSB8fAorICAgICAgICAgIHR5cGVfcHNldWRvX2VsZW1lbnQtPmNvbXB1dGVkX3N0eWxlX2ludmFsaWQoKSkgeworICAgICAgICBkb21fc3RhdF90cmFja2VyXy0+T25HZW5lcmF0ZVBzZXVkb0VsZW1lbnRDb21wdXRlZFN0eWxlKCk7CisgICAgICAgIERvQ29tcHV0ZWRTdHlsZVVwZGF0ZSgKKyAgICAgICAgICAgIHR5cGVfcHNldWRvX2VsZW1lbnQtPm1hdGNoaW5nX3J1bGVzKCksCisgICAgICAgICAgICAmcHJvcGVydHlfa2V5X3RvX2Jhc2VfdXJsX21hcCwgTlVMTCwKKyAgICAgICAgICAgIGNzc19jb21wdXRlZF9zdHlsZV9kZWNsYXJhdGlvbigpLCByb290X2NvbXB1dGVkX3N0eWxlLAorICAgICAgICAgICAgZG9jdW1lbnQtPnZpZXdwb3J0X3NpemUoKSwgdHlwZV9wc2V1ZG9fZWxlbWVudC0+Y29tcHV0ZWRfc3R5bGUoKSwKKyAgICAgICAgICAgIHN0eWxlX2NoYW5nZV9ldmVudF90aW1lLCB0eXBlX3BzZXVkb19lbGVtZW50LT5jc3NfdHJhbnNpdGlvbnMoKSwKKyAgICAgICAgICAgIHR5cGVfcHNldWRvX2VsZW1lbnQtPmNzc19hbmltYXRpb25zKCksIGRvY3VtZW50LT5rZXlmcmFtZXNfbWFwKCksCisgICAgICAgICAgICBvbGRfaXNfZGlzcGxheWVkID8ga0FuY2VzdG9yc0FyZURpc3BsYXllZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGtBbmNlc3RvcnNBcmVOb3REaXNwbGF5ZWQsCisgICAgICAgICAgICBJc0Rpc3BsYXllZCgpID8ga0FuY2VzdG9yc0FyZURpc3BsYXllZCA6IGtBbmNlc3RvcnNBcmVOb3REaXNwbGF5ZWQsCisgICAgICAgICAgICBrSXNQc2V1ZG9FbGVtZW50LCAmaW52YWxpZGF0aW9uX2ZsYWdzLAorICAgICAgICAgICAgdHlwZV9wc2V1ZG9fZWxlbWVudC0+Y3NzX2NvbXB1dGVkX3N0eWxlX2RlY2xhcmF0aW9uKCkpOworICAgICAgICB0eXBlX3BzZXVkb19lbGVtZW50LT5jbGVhcl9jb21wdXRlZF9zdHlsZV9pbnZhbGlkKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBVcGRhdGUgdGhlIGluaGVyaXRlZCBkYXRhIGlmIGEgbmV3IHN0eWxlIHdhcyBub3QgZ2VuZXJhdGVkLiBUaGUKKyAgICAgICAgLy8gYW5jZXN0b3IgZGF0YSB3aXRoIGluaGVyaXRlZCBwcm9wZXJ0aWVzIG1heSBoYXZlIGNoYW5nZWQuCisgICAgICAgIHR5cGVfcHNldWRvX2VsZW1lbnQtPmNzc19jb21wdXRlZF9zdHlsZV9kZWNsYXJhdGlvbigpCisgICAgICAgICAgICAtPlVwZGF0ZUluaGVyaXRlZERhdGEoKTsKKyAgICAgIH0KICAgICB9CiAgIH0KIApAQCAtMTM3NCw2ICsxNDQzLDE5IEBACiAgIH0KIAogICBjb21wdXRlZF9zdHlsZV92YWxpZF8gPSB0cnVlOworICBwc2V1ZG9fZWxlbWVudHNfY29tcHV0ZWRfc3R5bGVzX3ZhbGlkXyA9IHRydWU7Cit9CisKK3ZvaWQgSFRNTEVsZW1lbnQ6OlNldFBzZXVkb0VsZW1lbnQoUHNldWRvRWxlbWVudFR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVkX3B0cjxQc2V1ZG9FbGVtZW50PiBwc2V1ZG9fZWxlbWVudCkgeworICBEQ0hFQ0tfRVEodGhpcywgcHNldWRvX2VsZW1lbnQtPnBhcmVudF9lbGVtZW50KCkpOworICBEQ0hFQ0sodHlwZSA8IGtNYXhQc2V1ZG9FbGVtZW50VHlwZSk7CisgIHBzZXVkb19lbGVtZW50c19bdHlwZV0gPSBwc2V1ZG9fZWxlbWVudC5QYXNzKCk7CisgIHBzZXVkb19lbGVtZW50c19jb21wdXRlZF9zdHlsZXNfdmFsaWRfID0gZmFsc2U7Cit9CisKK2Jvb2wgSFRNTEVsZW1lbnQ6OkFyZUNvbXB1dGVkU3R5bGVzVmFsaWQoKSBjb25zdCB7CisgIHJldHVybiBjb21wdXRlZF9zdHlsZV92YWxpZF8gJiYgcHNldWRvX2VsZW1lbnRzX2NvbXB1dGVkX3N0eWxlc192YWxpZF87CiB9CiAKIGJvb2wgSFRNTEVsZW1lbnQ6OklzRGVzaWduYXRlZCgpIGNvbnN0IHsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfZWxlbWVudC5oIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9lbGVtZW50LmgKaW5kZXggMjNlMjNkZi4uYjM0ODFlYSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vaHRtbF9lbGVtZW50LmgKKysrIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9lbGVtZW50LmgKQEAgLTkwLDE0ICs5MCw1MCBAQAogLy8gICBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZG9tLmh0bWwjaHRtbGVsZW1lbnQKIGNsYXNzIEhUTUxFbGVtZW50IDogcHVibGljIEVsZW1lbnQsIHB1YmxpYyBjc3NvbTo6TXV0YXRpb25PYnNlcnZlciB7CiAgcHVibGljOgotICB0eXBlZGVmIGNzc29tOjpTZWxlY3RvclRyZWU6Ok5vZGVTZXQ8MTI+IE1hdGNoaW5nTm9kZXM7Ci0gIHR5cGVkZWYgY3Nzb206OlNlbGVjdG9yVHJlZTo6Tm9kZVNldDw0MD4gRGVzY2VuZGFudFBvdGVudGlhbE5vZGVzOwotICB0eXBlZGVmIGNzc29tOjpTZWxlY3RvclRyZWU6Ok5vZGVTZXQ8OD4gRm9sbG93aW5nU2libGluZ1BvdGVudGlhbE5vZGVzOworICB0eXBlZGVmIGNzc29tOjpTZWxlY3RvclRyZWU6Ok5vZGVzIFNlbGVjdG9yVHJlZU5vZGVzOwogCisgIC8vIENhY2hlZCBzdGF0ZSB1c2VkIHdpdGggcnVsZSBtYXRjaGluZyB0byBtaW5pbWl6ZSB0aGUgYW1vdW50IG9mIHdvcmsgdGhhdAorICAvLyBtdXN0IG9jY3VyIGR1cmluZyBVcGRhdGVNYXRjaGluZ1J1bGVzKCkgd2hlbiBsaXR0bGUgaGFzIGNoYW5nZWQuCiAgIHN0cnVjdCBSdWxlTWF0Y2hpbmdTdGF0ZSB7Ci0gICAgTWF0Y2hpbmdOb2RlcyBtYXRjaGluZ19ub2RlczsKLSAgICBEZXNjZW5kYW50UG90ZW50aWFsTm9kZXMgZGVzY2VuZGFudF9wb3RlbnRpYWxfbm9kZXM7Ci0gICAgRm9sbG93aW5nU2libGluZ1BvdGVudGlhbE5vZGVzIGZvbGxvd2luZ19zaWJsaW5nX3BvdGVudGlhbF9ub2RlczsKKyAgICBSdWxlTWF0Y2hpbmdTdGF0ZSgpCisgICAgICAgIDogaXNfc2V0KGZhbHNlKSwKKyAgICAgICAgICBhcmVfZGVzY2VuZGFudF9ub2Rlc19kaXJ0eSh0cnVlKSwKKyAgICAgICAgICBhcmVfZm9sbG93aW5nX3NpYmxpbmdfbm9kZXNfZGlydHkodHJ1ZSkge30KKworICAgIC8vIEZ1bGx5IGNsZWFycyB0aGUgc3RhdGUgYnV0IGRvZXMgbm90IGRlYWxsb2NhdGUgdGhlIHZlY3RvcnMuIFRoaXMgYWxsb3dzCisgICAgLy8gdGhlIHZlY3RvcnMgdG8gYmUgcmV1c2VkIHdpdGhvdXQgYWRkaXRpb25hbCBhbGxvY2F0aW9ucyB0aGUgbmV4dCB0aW1lCisgICAgLy8gdGhleSBhcmUgbmVlZGVkIGFuZCBzcGVlZHMgdXAgcnVsZSBtYXRjaGluZy4KKyAgICB2b2lkIENsZWFyKCk7CisKKyAgICAvLyBXaGV0aGVyIG9yIG5vdCB0aGUgcnVsZSBtYXRjaGluZyBzdGF0ZSBpcyBzZXQuIFdoZW4gaXQgaXMgbm90IHNldCwgdGhlCisgICAgLy8gbmV4dCBjYWxsIHRvIFVwZGF0ZU1hdGNoaW5nUnVsZXMoKSBhbHdheXMgZ2VuZXJhdGVzIG5ldyBtYXRjaGluZyBydWxlcworICAgIC8vIGZyb20gdGhlIHJ1bGUgbWF0Y2hpbmcgc3RhdGUuCisgICAgYm9vbCBpc19zZXQ7CisKKyAgICAvLyBUaGUgY2FjaGVkIG5vZGUgc3RhdGUgb2YgdGhlIHBhcmVudCBhbmQgcHJldmlvdXMgc2libGluZy4gQ2FjaGluZyB0aGVzZQorICAgIC8vIGFsbG93cyB0aGUgZWxlbWVudCB0byBrbm93IHRoZSBleGFjdCBub2RlcyB0aGF0IGhhdmUgY2hhbmdlZCBhbmQKKyAgICAvLyByZXN1bHRhbnRseSBuZWVkIHRvIGJlIGNoZWNrZWQgZHVyaW5nIGNhbGxzIHRvIFVwZGF0ZU1hdGNoaW5nUnVsZXMoKS4KKyAgICBTZWxlY3RvclRyZWVOb2RlcyBwYXJlbnRfbWF0Y2hpbmdfbm9kZXM7CisgICAgU2VsZWN0b3JUcmVlTm9kZXMgcGFyZW50X2Rlc2NlbmRhbnRfbm9kZXM7CisKKyAgICBTZWxlY3RvclRyZWVOb2RlcyBwcmV2aW91c19zaWJsaW5nX21hdGNoaW5nX25vZGVzOworICAgIFNlbGVjdG9yVHJlZU5vZGVzIHByZXZpb3VzX3NpYmxpbmdfZm9sbG93aW5nX3NpYmxpbmdfbm9kZXM7CisKKyAgICAvLyBUaGUgZWxlbWVudCdzIGN1cnJlbnQgbWF0Y2hpbmcgbm9kZXMsIGFsb25nIHdpdGggdGhlaXIgcGFyZW50IG5vZGVzLgorICAgIC8vIFRoZXNlIGFyZSBrZXB0IGluIHN5bmMuIFRoaXMgYWxsb3dzIG1hdGNoaW5nIG5vZGVzIHRvIGJlIHJlbW92ZWQgd2hlbgorICAgIC8vIHRoZWlyIHBhcmVudCBub2RlcyBhcmUgbm8gbG9uZ2VyIGF2YWlsYWJsZSB0byB0aGUgZWxlbWVudC4KKyAgICBTZWxlY3RvclRyZWVOb2RlcyBtYXRjaGluZ19ub2Rlc19wYXJlbnRfbm9kZXM7CisgICAgU2VsZWN0b3JUcmVlTm9kZXMgbWF0Y2hpbmdfbm9kZXM7CisKKyAgICAvLyBUaGUgbm9kZXMgdGhhdCBhcmUgdG8gYmUgdXNlZCBieSB0aGUgZWxlbWVudCdzIGRlc2NlbmRhbnRzIGFuZCBmb2xsb3dpbmcKKyAgICAvLyBzaWJsaW5ncyBkdXJpbmcgdGhlaXIgb3duIHJ1bGUgbWF0Y2hpbmcuIFRoZXNlIGFyZSBnZW5lcmF0ZWQgYnkgY29tYmluaW5nCisgICAgLy8gdGhlIG5vZGVzIGZyb20gdGhlIGVsZW1lbnQncyBwYXJlbnQgYW5kIHByZXZpb3VzIHNpYmxpbmcgd2l0aCB0aGUKKyAgICAvLyBlbGVtZW50J3Mgb3duIG1hdGNoaW5nIG5vZGVzIHRoYXQgY29udGFpbiB0aGUgcmVxdWlyZWQgY29tYmluYXRvci4KKyAgICBib29sIGFyZV9kZXNjZW5kYW50X25vZGVzX2RpcnR5OworICAgIFNlbGVjdG9yVHJlZU5vZGVzIGRlc2NlbmRhbnRfbm9kZXM7CisKKyAgICBib29sIGFyZV9mb2xsb3dpbmdfc2libGluZ19ub2Rlc19kaXJ0eTsKKyAgICBTZWxlY3RvclRyZWVOb2RlcyBmb2xsb3dpbmdfc2libGluZ19ub2RlczsKICAgfTsKIAogICBlbnVtIEFuY2VzdG9yc0FyZURpc3BsYXllZCB7CkBAIC0xODQsMTUgKzIyMCwyNSBAQAogCiAgIC8vIFJ1bGUgbWF0Y2hpbmcgcmVsYXRlZCBtZXRob2RzLgogICAvLworICAvLyBSZXR1cm5zIHRoZSBydWxlIG1hdGNoaW5nIHN0YXRlIG9mIHRoaXMgZWxlbWVudC4KKyAgUnVsZU1hdGNoaW5nU3RhdGUqIHJ1bGVfbWF0Y2hpbmdfc3RhdGUoKSB7IHJldHVybiAmcnVsZV9tYXRjaGluZ19zdGF0ZV87IH0KKworICB2b2lkIENsZWFyUnVsZU1hdGNoaW5nU3RhdGUoKTsKKyAgdm9pZCBDbGVhclJ1bGVNYXRjaGluZ1N0YXRlT25FbGVtZW50QW5kQW5jZXN0b3JzKAorICAgICAgYm9vbCBpbnZhbGlkYXRlX3RyZWVfbWF0Y2hpbmdfcnVsZXMpOworICB2b2lkIENsZWFyUnVsZU1hdGNoaW5nU3RhdGVPbkVsZW1lbnRBbmREZXNjZW5kYW50cygpOworCiAgIC8vIFJldHVybnMgdGhlIGNhY2hlZCBtYXRjaGluZyBydWxlcyBvZiB0aGlzIGVsZW1lbnQuCiAgIGNzc29tOjpSdWxlc1dpdGhDYXNjYWRlUHJlY2VkZW5jZSogbWF0Y2hpbmdfcnVsZXMoKSB7CiAgICAgcmV0dXJuICZtYXRjaGluZ19ydWxlc187CiAgIH0KLSAgLy8gUmV0dXJucyB0aGUgcnVsZSBtYXRjaGluZyBzdGF0ZSBvZiB0aGlzIGVsZW1lbnQuCi0gIFJ1bGVNYXRjaGluZ1N0YXRlKiBydWxlX21hdGNoaW5nX3N0YXRlKCkgeyByZXR1cm4gJnJ1bGVfbWF0Y2hpbmdfc3RhdGVfOyB9Ci0gIC8vIEludmFsaWRhdGVzIHRoZSBtYXRjaGluZyBydWxlcyBhbmQgcnVsZSBtYXRjaGluZyBzdGF0ZSBpbiB0aGlzIGVsZW1lbnQsCi0gIC8vIGl0cyBkZXNjZW5kYW50cyBhbmQgaXRzIHNpYmxpbmdzLgorCiAgIHZvaWQgSW52YWxpZGF0ZU1hdGNoaW5nUnVsZXNSZWN1cnNpdmVseSgpOworICB2b2lkIFVwZGF0ZU1hdGNoaW5nUnVsZXMoKTsKKyAgdm9pZCBVcGRhdGVNYXRjaGluZ1J1bGVzUmVjdXJzaXZlbHkoKTsKKworICB2b2lkIE9uTWF0Y2hpbmdSdWxlc01vZGlmaWVkKCk7CisgIHZvaWQgT25Qc2V1ZG9FbGVtZW50TWF0Y2hpbmdSdWxlc01vZGlmaWVkKCk7CiAKICAgLy8gQ29tcHV0ZWQgc3R5bGUgcmVsYXRlZCBtZXRob2RzLgogICAvLwpAQCAtMjA4LDE1ICsyNTQsNiBAQAogICAgIHJldHVybiBjc3NfY29tcHV0ZWRfc3R5bGVfZGVjbGFyYXRpb25fLT5kYXRhKCk7CiAgIH0KIAotICB2b2lkIE1hcmtEaXNwbGF5Tm9uZU9uTm9kZUFuZERlc2NlbmRhbnRzKCkgb3ZlcnJpZGU7Ci0gIHZvaWQgUHVyZ2VDYWNoZWRCYWNrZ3JvdW5kSW1hZ2VzT2ZOb2RlQW5kRGVzY2VuZGFudHMoKSBvdmVycmlkZTsKLSAgdm9pZCBJbnZhbGlkYXRlQ29tcHV0ZWRTdHlsZXNPZk5vZGVBbmREZXNjZW5kYW50cygpIG92ZXJyaWRlOwotICB2b2lkIEludmFsaWRhdGVMYXlvdXRCb3hlc09mTm9kZUFuZEFuY2VzdG9ycygpIG92ZXJyaWRlOwotICB2b2lkIEludmFsaWRhdGVMYXlvdXRCb3hlc09mTm9kZUFuZERlc2NlbmRhbnRzKCkgb3ZlcnJpZGU7Ci0gIHZvaWQgSW52YWxpZGF0ZUxheW91dEJveFNpemVzKCkgb3ZlcnJpZGU7Ci0gIHZvaWQgSW52YWxpZGF0ZUxheW91dEJveENyb3NzUmVmZXJlbmNlcygpIG92ZXJyaWRlOwotICB2b2lkIEludmFsaWRhdGVMYXlvdXRCb3hSZW5kZXJUcmVlTm9kZXMoKSBvdmVycmlkZTsKLQogICAvLyBVcGRhdGVzIHRoZSBjYWNoZWQgY29tcHV0ZWQgc3R5bGUgb2YgdGhpcyBlbGVtZW50IGFuZCBpdHMgZGVzY2VuZGFudHMuCiAgIHZvaWQgVXBkYXRlQ29tcHV0ZWRTdHlsZVJlY3Vyc2l2ZWx5KAogICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxjc3NvbTo6Q1NTQ29tcHV0ZWRTdHlsZURlY2xhcmF0aW9uPiYKQEAgLTIzNSw2ICsyNzIsMTUgQEAKICAgICAgIGNvbnN0IGJhc2U6OlRpbWVEZWx0YSYgc3R5bGVfY2hhbmdlX2V2ZW50X3RpbWUsCiAgICAgICBBbmNlc3RvcnNBcmVEaXNwbGF5ZWQgYW5jZXN0b3JfaXNfZGlzcGxheWVkKTsKIAorICB2b2lkIE1hcmtEaXNwbGF5Tm9uZU9uTm9kZUFuZERlc2NlbmRhbnRzKCkgb3ZlcnJpZGU7CisgIHZvaWQgUHVyZ2VDYWNoZWRCYWNrZ3JvdW5kSW1hZ2VzT2ZOb2RlQW5kRGVzY2VuZGFudHMoKSBvdmVycmlkZTsKKyAgdm9pZCBJbnZhbGlkYXRlQ29tcHV0ZWRTdHlsZXNPZk5vZGVBbmREZXNjZW5kYW50cygpIG92ZXJyaWRlOworICB2b2lkIEludmFsaWRhdGVMYXlvdXRCb3hlc09mTm9kZUFuZEFuY2VzdG9ycygpIG92ZXJyaWRlOworICB2b2lkIEludmFsaWRhdGVMYXlvdXRCb3hlc09mTm9kZUFuZERlc2NlbmRhbnRzKCkgb3ZlcnJpZGU7CisgIHZvaWQgSW52YWxpZGF0ZUxheW91dEJveFNpemVzKCkgb3ZlcnJpZGU7CisgIHZvaWQgSW52YWxpZGF0ZUxheW91dEJveENyb3NzUmVmZXJlbmNlcygpIG92ZXJyaWRlOworICB2b2lkIEludmFsaWRhdGVMYXlvdXRCb3hSZW5kZXJUcmVlTm9kZXMoKSBvdmVycmlkZTsKKwogICAvLyBMYXlvdXQgYm94IHJlbGF0ZWQgbWV0aG9kcy4KICAgLy8KICAgLy8gVGhlIExheW91dENvbnRhaW5lckJveCBnaXZlcyB0aGUgSFRNTCBFbGVtZW50IGFuIGludGVyZmFjZSB0byB0aGUgY29udGFpbmVyCkBAIC0yNTEsMTcgKzI5NywxNiBAQAogICAgIHJldHVybiBwc2V1ZG9fZWxlbWVudHNfW3R5cGVdLmdldCgpOwogICB9CiAKLSAgdm9pZCBzZXRfcHNldWRvX2VsZW1lbnQoUHNldWRvRWxlbWVudFR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVkX3B0cjxQc2V1ZG9FbGVtZW50PiBwc2V1ZG9fZWxlbWVudCkgewotICAgIERDSEVDS19FUSh0aGlzLCBwc2V1ZG9fZWxlbWVudC0+cGFyZW50X2VsZW1lbnQoKSk7Ci0gICAgRENIRUNLKHR5cGUgPCBrTWF4UHNldWRvRWxlbWVudFR5cGUpOwotICAgIHBzZXVkb19lbGVtZW50c19bdHlwZV0gPSBwc2V1ZG9fZWxlbWVudC5QYXNzKCk7Ci0gIH0KKyAgdm9pZCBTZXRQc2V1ZG9FbGVtZW50KFBzZXVkb0VsZW1lbnRUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBzY29wZWRfcHRyPFBzZXVkb0VsZW1lbnQ+IHBzZXVkb19lbGVtZW50KTsKIAotICBib29sIGNvbXB1dGVkX3N0eWxlX3ZhbGlkKCkgY29uc3QgeyByZXR1cm4gY29tcHV0ZWRfc3R5bGVfdmFsaWRfOyB9CisgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZWxlbWVudCdzIGNvbXB1dGVkIHN0eWxlIGFuZCBhbGwgb2YgaXRzIHBzZXVkbworICAvLyBlbGVtZW50J3MgY29tcHV0ZWQgc3R5bGVzIGFyZSB2YWxpZC4KKyAgYm9vbCBBcmVDb21wdXRlZFN0eWxlc1ZhbGlkKCkgY29uc3Q7CiAgIGJvb2wgZGVzY2VuZGFudF9jb21wdXRlZF9zdHlsZXNfdmFsaWQoKSBjb25zdCB7CiAgICAgcmV0dXJuIGRlc2NlbmRhbnRfY29tcHV0ZWRfc3R5bGVzX3ZhbGlkXzsKICAgfQorCiAgIGJvb2wgbWF0Y2hpbmdfcnVsZXNfdmFsaWQoKSBjb25zdCB7IHJldHVybiBtYXRjaGluZ19ydWxlc192YWxpZF87IH0KICAgdm9pZCBzZXRfbWF0Y2hpbmdfcnVsZXNfdmFsaWQoKSB7IG1hdGNoaW5nX3J1bGVzX3ZhbGlkXyA9IHRydWU7IH0KIApAQCAtMzE4LDEwICszNjMsMTMgQEAKICAgLy8gZGlyZWN0aW9uYWxpdHkgZG9lcyBub3QgaW52YWxpZGF0ZSB0aGUgY29tcHV0ZWQgc3R5bGUuCiAgIHZvaWQgU2V0RGlyZWN0aW9uYWxpdHkoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKIAotICAvLyBJbnZhbGlkYXRlcyB0aGUgbWF0Y2hpbmcgcnVsZXMgYW5kIHJ1bGUgbWF0Y2hpbmcgc3RhdGUgaW4gdGhpcyBlbGVtZW50IGFuZAorICAvLyBJbnZhbGlkYXRlIHRoZSBtYXRjaGluZyBydWxlcyBhbmQgcnVsZSBtYXRjaGluZyBzdGF0ZSBpbiB0aGlzIGVsZW1lbnQgYW5kCiAgIC8vIGl0cyBkZXNjZW5kYW50cy4gSW4gdGhlIGNhc2Ugd2hlcmUgdGhpcyBpcyB0aGUgdGhlIGluaXRpYWwgaW52YWxpZGF0aW9uLAogICAvLyBpdCB3aWxsIGFsc28gaW52YWxpZGF0ZSB0aGUgcnVsZSBtYXRjaGluZyBzdGF0ZSBvZiBpdHMgc2libGluZ3MuCi0gIHZvaWQgSW52YWxpZGF0ZU1hdGNoaW5nUnVsZXNSZWN1cnNpdmVseUludGVybmFsKGJvb2wgaXNfaW5pdGlhbF9pbnZhbGlkYXRpb24pOworICB2b2lkIEludmFsaWRhdGVNYXRjaGluZ1J1bGVzUmVjdXJzaXZlbHlJbnRlcm5hbChib29sIGlzX2luaXRpYWxfZWxlbWVudCk7CisgIC8vIEZ1bGx5IGNsZWFyIHRoZSBydWxlIG1hdGNoaW5nIHN0YXRlIG9mIHRoaXMgZWxlbWVudCBhbmQgb3B0aW9uYWxseQorICAvLyBpbnZhbGlkYXRlIGFsbCBvZiBpdHMgZGVzY2VuZGFudHMgbWF0Y2hpbmcgcnVsZXMuCisgIHZvaWQgQ2xlYXJSdWxlTWF0Y2hpbmdTdGF0ZUludGVybmFsKGJvb2wgaW52YWxpZGF0ZV9kZXNjZW5kYW50cyk7CiAKICAgLy8gQ2xlYXIgdGhlIGxpc3Qgb2YgYWN0aXZlIGJhY2tncm91bmQgaW1hZ2VzLCBhbmQgbm90aWZ5IHRoZSBhbmltYXRlZCBpbWFnZQogICAvLyB0cmFja2VyIHRvIHN0b3AgdGhlIGFuaW1hdGlvbnMuCkBAIC0zNjQsNiArNDEyLDkgQEAKICAgLy8gS2VlcHMgdHJhY2sgb2Ygd2hldGhlciB0aGUgSFRNTCBlbGVtZW50J3MgY3VycmVudCBjb21wdXRlZCBzdHlsZSBpcyBvdXQKICAgLy8gb2YgZGF0ZSBvciBub3QuCiAgIGJvb2wgY29tcHV0ZWRfc3R5bGVfdmFsaWRfOworICAvLyBLZWVwcyB0cmFjayBvZiB3aGV0aGVyIHRoZSBIVE1MIGVsZW1lbnQncyBwc2V1ZG8gZWxlbWVudCdzIGNvbXB1dGVkIHN0eWxlcworICAvLyBhcmUgb3V0IG9mIGRhdGUgb3Igbm90LgorICBib29sIHBzZXVkb19lbGVtZW50c19jb21wdXRlZF9zdHlsZXNfdmFsaWRfOwogICAvLyBLZWVwcyB0cmFjayBvZiB3aGV0aGVyIHRoZSBIVE1MIGVsZW1lbnQncyBkZXNjZW5kYW50cycgY29tcHV0ZWQgc3R5bGVzIGFyZQogICAvLyBvdXQgb2YgZGF0ZSBvciBub3QuCiAgIGJvb2wgZGVzY2VuZGFudF9jb21wdXRlZF9zdHlsZXNfdmFsaWRfOwpAQCAtMzgyLDEwICs0MzMsOSBAQAogICBjc3NvbTo6QW5pbWF0aW9uU2V0IGNzc19hbmltYXRpb25zXzsKIAogICAvLyBUaGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgdXNlZCBpbiBydWxlIG1hdGNoaW5nLgotICBjc3NvbTo6UnVsZXNXaXRoQ2FzY2FkZVByZWNlZGVuY2Ugb2xkX21hdGNoaW5nX3J1bGVzXzsKLSAgY3Nzb206OlJ1bGVzV2l0aENhc2NhZGVQcmVjZWRlbmNlIG1hdGNoaW5nX3J1bGVzXzsKICAgUnVsZU1hdGNoaW5nU3RhdGUgcnVsZV9tYXRjaGluZ19zdGF0ZV87CiAgIGJvb2wgbWF0Y2hpbmdfcnVsZXNfdmFsaWRfOworICBjc3NvbTo6UnVsZXNXaXRoQ2FzY2FkZVByZWNlZGVuY2UgbWF0Y2hpbmdfcnVsZXNfOwogCiAgIC8vIFRoaXMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJveGVzIGdlbmVyYXRlZCBmcm9tIHRoZSBlbGVtZW50LgogICBzY29wZWRfcHRyPExheW91dEJveGVzPiBsYXlvdXRfYm94ZXNfOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vaHRtbF9lbGVtZW50X2NvbnRleHQuY2MgYi9zcmMvY29iYWx0L2RvbS9odG1sX2VsZW1lbnRfY29udGV4dC5jYwppbmRleCA2MGQwZTE1Li4wODlkNWIxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9odG1sX2VsZW1lbnRfY29udGV4dC5jYworKysgYi9zcmMvY29iYWx0L2RvbS9odG1sX2VsZW1lbnRfY29udGV4dC5jYwpAQCAtMjEsNiArMjEsNyBAQAogCiBIVE1MRWxlbWVudENvbnRleHQ6OkhUTUxFbGVtZW50Q29udGV4dCgpCiAgICAgOiBmZXRjaGVyX2ZhY3RvcnlfKE5VTEwpLAorICAgICAgbG9hZGVyX2ZhY3RvcnlfKE5VTEwpLAogICAgICAgY3NzX3BhcnNlcl8oTlVMTCksCiAgICAgICBkb21fcGFyc2VyXyhOVUxMKSwKICAgICAgIGNhbl9wbGF5X3R5cGVfaGFuZGxlcl8oTlVMTCksCkBAIC00Miw3ICs0Myw4IEBACiB9CiAKIEhUTUxFbGVtZW50Q29udGV4dDo6SFRNTEVsZW1lbnRDb250ZXh0KAotICAgIGxvYWRlcjo6RmV0Y2hlckZhY3RvcnkqIGZldGNoZXJfZmFjdG9yeSwgY3Nzb206OkNTU1BhcnNlciogY3NzX3BhcnNlciwKKyAgICBsb2FkZXI6OkZldGNoZXJGYWN0b3J5KiBmZXRjaGVyX2ZhY3RvcnksCisgICAgbG9hZGVyOjpMb2FkZXJGYWN0b3J5KiBsb2FkZXJfZmFjdG9yeSwgY3Nzb206OkNTU1BhcnNlciogY3NzX3BhcnNlciwKICAgICBQYXJzZXIqIGRvbV9wYXJzZXIsIG1lZGlhOjpDYW5QbGF5VHlwZUhhbmRsZXIqIGNhbl9wbGF5X3R5cGVfaGFuZGxlciwKICAgICBtZWRpYTo6V2ViTWVkaWFQbGF5ZXJGYWN0b3J5KiB3ZWJfbWVkaWFfcGxheWVyX2ZhY3RvcnksCiAgICAgc2NyaXB0OjpTY3JpcHRSdW5uZXIqIHNjcmlwdF9ydW5uZXIsCkBAIC01Nyw4ICs1OSwxMCBAQAogICAgIGxvYWRlcjo6bWVzaDo6TWVzaENhY2hlKiBtZXNoX2NhY2hlLCBEb21TdGF0VHJhY2tlciogZG9tX3N0YXRfdHJhY2tlciwKICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZm9udF9sYW5ndWFnZV9zY3JpcHQsCiAgICAgYmFzZTo6QXBwbGljYXRpb25TdGF0ZSBpbml0aWFsX2FwcGxpY2F0aW9uX3N0YXRlLAorICAgIGJhc2U6OldhaXRhYmxlRXZlbnQqIHN5bmNocm9ub3VzX2xvYWRlcl9pbnRlcnJ1cHQsCiAgICAgZmxvYXQgdmlkZW9fcGxheWJhY2tfcmF0ZV9tdWx0aXBsaWVyKQogICAgIDogZmV0Y2hlcl9mYWN0b3J5XyhmZXRjaGVyX2ZhY3RvcnkpLAorICAgICAgbG9hZGVyX2ZhY3RvcnlfKGxvYWRlcl9mYWN0b3J5KSwKICAgICAgIGNzc19wYXJzZXJfKGNzc19wYXJzZXIpLAogICAgICAgZG9tX3BhcnNlcl8oZG9tX3BhcnNlciksCiAgICAgICBjYW5fcGxheV90eXBlX2hhbmRsZXJfKGNhbl9wbGF5X3R5cGVfaGFuZGxlciksCkBAIC03Nyw2ICs4MSw3IEBACiAgICAgICBmb250X2xhbmd1YWdlX3NjcmlwdF8oZm9udF9sYW5ndWFnZV9zY3JpcHQpLAogICAgICAgcGFnZV92aXNpYmlsaXR5X3N0YXRlXyhpbml0aWFsX2FwcGxpY2F0aW9uX3N0YXRlKSwKICAgICAgIHZpZGVvX3BsYXliYWNrX3JhdGVfbXVsdGlwbGllcl8odmlkZW9fcGxheWJhY2tfcmF0ZV9tdWx0aXBsaWVyKSwKKyAgICAgIHN5bmNocm9ub3VzX2xvYWRlcl9pbnRlcnJ1cHRfKHN5bmNocm9ub3VzX2xvYWRlcl9pbnRlcnJ1cHQpLAogICAgICAgc3luY19sb2FkX3RocmVhZF8oIlN5bmNocm9ub3VzIExvYWQiKSwKICAgICAgIGh0bWxfZWxlbWVudF9mYWN0b3J5XyhuZXcgSFRNTEVsZW1lbnRGYWN0b3J5KCkpIHsKICAgc3luY19sb2FkX3RocmVhZF8uU3RhcnQoKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfZWxlbWVudF9jb250ZXh0LmggYi9zcmMvY29iYWx0L2RvbS9odG1sX2VsZW1lbnRfY29udGV4dC5oCmluZGV4IGNhYjFjNzEuLmJiM2Q1OGYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfZWxlbWVudF9jb250ZXh0LmgKKysrIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9lbGVtZW50X2NvbnRleHQuaApAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPHN0cmluZz4KIAogI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKKyNpbmNsdWRlICJiYXNlL3N5bmNocm9uaXphdGlvbi93YWl0YWJsZV9ldmVudC5oIgogI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZC5oIgogI2luY2x1ZGUgImNvYmFsdC9iYXNlL2FwcGxpY2F0aW9uX3N0YXRlLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2Nzc19wYXJzZXIuaCIKQEAgLTUwLDcgKzUxLDggQEAKIAogICBIVE1MRWxlbWVudENvbnRleHQoKTsKICAgSFRNTEVsZW1lbnRDb250ZXh0KAotICAgICAgbG9hZGVyOjpGZXRjaGVyRmFjdG9yeSogZmV0Y2hlcl9mYWN0b3J5LCBjc3NvbTo6Q1NTUGFyc2VyKiBjc3NfcGFyc2VyLAorICAgICAgbG9hZGVyOjpGZXRjaGVyRmFjdG9yeSogZmV0Y2hlcl9mYWN0b3J5LAorICAgICAgbG9hZGVyOjpMb2FkZXJGYWN0b3J5KiBsb2FkZXJfZmFjdG9yeSwgY3Nzb206OkNTU1BhcnNlciogY3NzX3BhcnNlciwKICAgICAgIFBhcnNlciogZG9tX3BhcnNlciwgbWVkaWE6OkNhblBsYXlUeXBlSGFuZGxlciogY2FuX3BsYXlfdHlwZV9oYW5kbGVyLAogICAgICAgbWVkaWE6OldlYk1lZGlhUGxheWVyRmFjdG9yeSogd2ViX21lZGlhX3BsYXllcl9mYWN0b3J5LAogICAgICAgc2NyaXB0OjpTY3JpcHRSdW5uZXIqIHNjcmlwdF9ydW5uZXIsCkBAIC02NSwxMSArNjcsMTQgQEAKICAgICAgIGxvYWRlcjo6bWVzaDo6TWVzaENhY2hlKiBtZXNoX2NhY2hlLCBEb21TdGF0VHJhY2tlciogZG9tX3N0YXRfdHJhY2tlciwKICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmb250X2xhbmd1YWdlX3NjcmlwdCwKICAgICAgIGJhc2U6OkFwcGxpY2F0aW9uU3RhdGUgaW5pdGlhbF9hcHBsaWNhdGlvbl9zdGF0ZSwKKyAgICAgIGJhc2U6OldhaXRhYmxlRXZlbnQqIHN5bmNocm9ub3VzX2xvYWRlcl9pbnRlcnJ1cHQsCiAgICAgICBmbG9hdCB2aWRlb19wbGF5YmFja19yYXRlX211bHRpcGxpZXIgPSAxLjApOwogICB+SFRNTEVsZW1lbnRDb250ZXh0KCk7CiAKICAgbG9hZGVyOjpGZXRjaGVyRmFjdG9yeSogZmV0Y2hlcl9mYWN0b3J5KCkgeyByZXR1cm4gZmV0Y2hlcl9mYWN0b3J5XzsgfQogCisgIGxvYWRlcjo6TG9hZGVyRmFjdG9yeSogbG9hZGVyX2ZhY3RvcnkoKSB7IHJldHVybiBsb2FkZXJfZmFjdG9yeV87IH0KKwogICBjc3NvbTo6Q1NTUGFyc2VyKiBjc3NfcGFyc2VyKCkgeyByZXR1cm4gY3NzX3BhcnNlcl87IH0KIAogICBQYXJzZXIqIGRvbV9wYXJzZXIoKSB7IHJldHVybiBkb21fcGFyc2VyXzsgfQpAQCAtOTksNiArMTA0LDEwIEBACiAgICAgcmV0dXJuIHJlc291cmNlX3Byb3ZpZGVyXzsKICAgfQogCisgIGJhc2U6OldhaXRhYmxlRXZlbnQqIHN5bmNocm9ub3VzX2xvYWRlcl9pbnRlcnJ1cHQoKSB7CisgICAgcmV0dXJuIHN5bmNocm9ub3VzX2xvYWRlcl9pbnRlcnJ1cHRfOworICB9CisKICAgbG9hZGVyOjppbWFnZTo6QW5pbWF0ZWRJbWFnZVRyYWNrZXIqIGFuaW1hdGVkX2ltYWdlX3RyYWNrZXIoKSBjb25zdCB7CiAgICAgcmV0dXJuIGFuaW1hdGVkX2ltYWdlX3RyYWNrZXJfOwogICB9CkBAIC0xMzgsNiArMTQ3LDcgQEAKIAogIHByaXZhdGU6CiAgIGxvYWRlcjo6RmV0Y2hlckZhY3RvcnkqIGNvbnN0IGZldGNoZXJfZmFjdG9yeV87CisgIGxvYWRlcjo6TG9hZGVyRmFjdG9yeSogY29uc3QgbG9hZGVyX2ZhY3RvcnlfOwogICBjc3NvbTo6Q1NTUGFyc2VyKiBjb25zdCBjc3NfcGFyc2VyXzsKICAgUGFyc2VyKiBjb25zdCBkb21fcGFyc2VyXzsKICAgbWVkaWE6OkNhblBsYXlUeXBlSGFuZGxlciogY2FuX3BsYXlfdHlwZV9oYW5kbGVyXzsKQEAgLTE1Niw2ICsxNjYsNyBAQAogICBjb25zdCBzdGQ6OnN0cmluZyBmb250X2xhbmd1YWdlX3NjcmlwdF87CiAgIHBhZ2VfdmlzaWJpbGl0eTo6UGFnZVZpc2liaWxpdHlTdGF0ZSBwYWdlX3Zpc2liaWxpdHlfc3RhdGVfOwogICBjb25zdCBmbG9hdCB2aWRlb19wbGF5YmFja19yYXRlX211bHRpcGxpZXJfOworICBiYXNlOjpXYWl0YWJsZUV2ZW50KiBzeW5jaHJvbm91c19sb2FkZXJfaW50ZXJydXB0XyA9IG51bGxwdHI7CiAKICAgYmFzZTo6VGhyZWFkIHN5bmNfbG9hZF90aHJlYWRfOwogICBzY29wZWRfcHRyPEhUTUxFbGVtZW50RmFjdG9yeT4gaHRtbF9lbGVtZW50X2ZhY3RvcnlfOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vaHRtbF9lbGVtZW50X2ZhY3RvcnlfdGVzdC5jYyBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfZWxlbWVudF9mYWN0b3J5X3Rlc3QuY2MKaW5kZXggNzhjOTY4Ny4uMzc3MzgyYSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vaHRtbF9lbGVtZW50X2ZhY3RvcnlfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2RvbS9odG1sX2VsZW1lbnRfZmFjdG9yeV90ZXN0LmNjCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSAiY29iYWx0L2RvbS9odG1sX2VsZW1lbnRfZmFjdG9yeS5oIgogCiAjaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3AuaCIKKyNpbmNsdWRlICJiYXNlL3RocmVhZGluZy9wbGF0Zm9ybV90aHJlYWQuaCIKICNpbmNsdWRlICJjb2JhbHQvZG9tL2RvY3VtZW50LmgiCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9kb21fc3RhdF90cmFja2VyLmgiCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9odG1sX2FuY2hvcl9lbGVtZW50LmgiCkBAIC00MCw2ICs0MSw3IEBACiAjaW5jbHVkZSAiY29iYWx0L2RvbS90ZXN0aW5nL3N0dWJfc2NyaXB0X3J1bm5lci5oIgogI2luY2x1ZGUgImNvYmFsdC9kb21fcGFyc2VyL3BhcnNlci5oIgogI2luY2x1ZGUgImNvYmFsdC9sb2FkZXIvZmV0Y2hlcl9mYWN0b3J5LmgiCisjaW5jbHVkZSAiY29iYWx0L2xvYWRlci9sb2FkZXJfZmFjdG9yeS5oIgogI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgogCiBuYW1lc3BhY2UgY29iYWx0IHsKQEAgLTQ5LDExICs1MSwxMyBAQAogIHByb3RlY3RlZDoKICAgSFRNTEVsZW1lbnRGYWN0b3J5VGVzdCgpCiAgICAgICA6IGZldGNoZXJfZmFjdG9yeV8oTlVMTCAvKiBuZXR3b3JrX21vZHVsZSAqLyksCisgICAgICAgIGxvYWRlcl9mYWN0b3J5XygmZmV0Y2hlcl9mYWN0b3J5XywgTlVMTCAvKiByZXNvdXJjZSBsb2FkZXIgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjprVGhyZWFkUHJpb3JpdHlfRGVmYXVsdCksCiAgICAgICAgIGRvbV9wYXJzZXJfKG5ldyBkb21fcGFyc2VyOjpQYXJzZXIoKSksCiAgICAgICAgIGRvbV9zdGF0X3RyYWNrZXJfKG5ldyBEb21TdGF0VHJhY2tlcigiSFRNTEVsZW1lbnRGYWN0b3J5VGVzdCIpKSwKICAgICAgICAgaHRtbF9lbGVtZW50X2NvbnRleHRfKAotICAgICAgICAgICAgJmZldGNoZXJfZmFjdG9yeV8sICZzdHViX2Nzc19wYXJzZXJfLCBkb21fcGFyc2VyXy5nZXQoKSwKLSAgICAgICAgICAgIE5VTEwgLyogY2FuX3BsYXlfdHlwZV9oYW5kbGVyICovLAorICAgICAgICAgICAgJmZldGNoZXJfZmFjdG9yeV8sICZsb2FkZXJfZmFjdG9yeV8sICZzdHViX2Nzc19wYXJzZXJfLAorICAgICAgICAgICAgZG9tX3BhcnNlcl8uZ2V0KCksIE5VTEwgLyogY2FuX3BsYXlfdHlwZV9oYW5kbGVyICovLAogICAgICAgICAgICAgTlVMTCAvKiB3ZWJfbWVkaWFfcGxheWVyX2ZhY3RvcnkgKi8sICZzdHViX3NjcmlwdF9ydW5uZXJfLAogICAgICAgICAgICAgTlVMTCAvKiBzY3JpcHRfdmFsdWVfZmFjdG9yeSAqLywgTlVMTCAvKiBtZWRpYV9zb3VyY2VfcmVnaXN0cnkgKi8sCiAgICAgICAgICAgICBOVUxMIC8qIHJlc291cmNlX3Byb3ZpZGVyICovLCBOVUxMIC8qIGFuaW1hdGVkX2ltYWdlX3RyYWNrZXIgKi8sCkBAIC02MSwxMSArNjUsMTMgQEAKICAgICAgICAgICAgIE5VTEwgLyogcmVkdWNlZF9pbWFnZV9jYWNoZV9jYXBhY2l0eV9tYW5hZ2VyICovLAogICAgICAgICAgICAgTlVMTCAvKiByZW1vdGVfdHlwZWZhY2VfY2FjaGUgKi8sIE5VTEwgLyogbWVzaF9jYWNoZSAqLywKICAgICAgICAgICAgIGRvbV9zdGF0X3RyYWNrZXJfLmdldCgpLCAiIiAvKiBsYW5ndWFnZSAqLywKLSAgICAgICAgICAgIGJhc2U6OmtBcHBsaWNhdGlvblN0YXRlU3RhcnRlZCksCisgICAgICAgICAgICBiYXNlOjprQXBwbGljYXRpb25TdGF0ZVN0YXJ0ZWQsCisgICAgICAgICAgICBOVUxMIC8qIHN5bmNocm9ub3VzX2xvYWRlcl9pbnRlcnJ1cHQgKi8pLAogICAgICAgICBkb2N1bWVudF8obmV3IERvY3VtZW50KCZodG1sX2VsZW1lbnRfY29udGV4dF8pKSB7fQogICB+SFRNTEVsZW1lbnRGYWN0b3J5VGVzdCgpIG92ZXJyaWRlIHt9CiAKICAgbG9hZGVyOjpGZXRjaGVyRmFjdG9yeSBmZXRjaGVyX2ZhY3RvcnlfOworICBsb2FkZXI6OkxvYWRlckZhY3RvcnkgbG9hZGVyX2ZhY3RvcnlfOwogICBzY29wZWRfcHRyPFBhcnNlcj4gZG9tX3BhcnNlcl87CiAgIHRlc3Rpbmc6OlN0dWJDU1NQYXJzZXIgc3R1Yl9jc3NfcGFyc2VyXzsKICAgdGVzdGluZzo6U3R1YlNjcmlwdFJ1bm5lciBzdHViX3NjcmlwdF9ydW5uZXJfOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vaHRtbF9lbGVtZW50X3Rlc3QuY2MgYi9zcmMvY29iYWx0L2RvbS9odG1sX2VsZW1lbnRfdGVzdC5jYwppbmRleCBjYzIzNjJiLi41ZjEwYzAyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9odG1sX2VsZW1lbnRfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2RvbS9odG1sX2VsZW1lbnRfdGVzdC5jYwpAQCAtMTEyLDEwICsxMTIsMTAgQEAKICBwcm90ZWN0ZWQ6CiAgIEhUTUxFbGVtZW50VGVzdCgpCiAgICAgICA6IGRvbV9zdGF0X3RyYWNrZXJfKG5ldyBEb21TdGF0VHJhY2tlcigiSFRNTEVsZW1lbnRUZXN0IikpLAotICAgICAgICBodG1sX2VsZW1lbnRfY29udGV4dF8oTlVMTCwgJmNzc19wYXJzZXJfLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKyAgICAgICAgaHRtbF9lbGVtZW50X2NvbnRleHRfKE5VTEwsIE5VTEwsICZjc3NfcGFyc2VyXywgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21fc3RhdF90cmFja2VyXy5nZXQoKSwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjprQXBwbGljYXRpb25TdGF0ZVN0YXJ0ZWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6a0FwcGxpY2F0aW9uU3RhdGVTdGFydGVkLCBOVUxMKSwKICAgICAgICAgZG9jdW1lbnRfKG5ldyBEb2N1bWVudCgmaHRtbF9lbGVtZW50X2NvbnRleHRfKSkge30KICAgfkhUTUxFbGVtZW50VGVzdCgpIG92ZXJyaWRlIHt9CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfbGlua19lbGVtZW50LmNjIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9saW5rX2VsZW1lbnQuY2MKaW5kZXggZDhkYmQwNC4uZDEzOWMzOCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vaHRtbF9saW5rX2VsZW1lbnQuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9saW5rX2VsZW1lbnQuY2MKQEAgLTE3MywxNiArMTczLDIwIEBACiAgIH0KIAogICByZXF1ZXN0X21vZGVfID0gR2V0UmVxdWVzdE1vZGUoR2V0QXR0cmlidXRlKCJjcm9zc09yaWdpbiIpKTsKLSAgbG9hZGVyXyA9IG1ha2Vfc2NvcGVkX3B0cihuZXcgbG9hZGVyOjpMb2FkZXIoCi0gICAgICBiYXNlOjpCaW5kKAotICAgICAgICAgICZsb2FkZXI6OkZldGNoZXJGYWN0b3J5OjpDcmVhdGVTZWN1cmVGZXRjaGVyLAotICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoZG9jdW1lbnQtPmh0bWxfZWxlbWVudF9jb250ZXh0KCktPmZldGNoZXJfZmFjdG9yeSgpKSwKLSAgICAgICAgICBhYnNvbHV0ZV91cmxfLCBjc3BfY2FsbGJhY2ssIHJlcXVlc3RfbW9kZV8sCi0gICAgICAgICAgZG9jdW1lbnQtPmxvY2F0aW9uKCkgPyBkb2N1bWVudC0+bG9jYXRpb24oKS0+R2V0T3JpZ2luQXNPYmplY3QoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbG9hZGVyOjpPcmlnaW4oKSksCi0gICAgICBzY29wZWRfcHRyPGxvYWRlcjo6RGVjb2Rlcj4obmV3IGxvYWRlcjo6VGV4dERlY29kZXIoCi0gICAgICAgICAgYmFzZTo6QmluZCgmSFRNTExpbmtFbGVtZW50OjpPbkxvYWRpbmdEb25lLCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSkpLAotICAgICAgYmFzZTo6QmluZCgmSFRNTExpbmtFbGVtZW50OjpPbkxvYWRpbmdFcnJvciwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpKTsKKworICBEQ0hFQ0soIWxvYWRlcl8pOworICBsb2FkZXI6Ok9yaWdpbiBvcmlnaW4gPSBkb2N1bWVudC0+bG9jYXRpb24oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBkb2N1bWVudC0+bG9jYXRpb24oKS0+R2V0T3JpZ2luQXNPYmplY3QoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBsb2FkZXI6Ok9yaWdpbigpOworCisgIGxvYWRlcl8gPSBodG1sX2VsZW1lbnRfY29udGV4dCgpLT5sb2FkZXJfZmFjdG9yeSgpCisgICAgICAgICAgICAgICAgLT5DcmVhdGVMaW5rTG9hZGVyKAorICAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZV91cmxfLCBvcmlnaW4sIGNzcF9jYWxsYmFjaywgcmVxdWVzdF9tb2RlXywKKyAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZCgmSFRNTExpbmtFbGVtZW50OjpPbkxvYWRpbmdEb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpLAorICAgICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kKCZIVE1MTGlua0VsZW1lbnQ6Ok9uTG9hZGluZ0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpKQorICAgICAgICAgICAgICAgIC5QYXNzKCk7CiB9CiAKIHZvaWQgSFRNTExpbmtFbGVtZW50OjpPbkxvYWRpbmdEb25lKGNvbnN0IGxvYWRlcjo6T3JpZ2luJiBsYXN0X3VybF9vcmlnaW4sCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9odG1sX21lZGlhX2VsZW1lbnQuY2MgYi9zcmMvY29iYWx0L2RvbS9odG1sX21lZGlhX2VsZW1lbnQuY2MKaW5kZXggNWFhYzEwMC4uYjdiNDA0ZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vaHRtbF9tZWRpYV9lbGVtZW50LmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfbWVkaWFfZWxlbWVudC5jYwpAQCAtMTAwNiwyMSArMTAwNiwyMSBAQAogCiAgICAgbWVkaWFfc291cmNlXyA9CiAgICAgICAgIGh0bWxfZWxlbWVudF9jb250ZXh0KCktPm1lZGlhX3NvdXJjZV9yZWdpc3RyeSgpLT5SZXRyaWV2ZSh1cmwuc3BlYygpKTsKLSAgICAvLyBJZiBtZWRpYV9zb3VyY2VfIGlzIE5VTEwsIHRoZSBwbGF5ZXIgd2lsbCB0cnkgdG8gbG9hZCBpdCBhcyBhIG5vcm1hbAotICAgIC8vIG1lZGlhIHJlc291cmNlIHVybCBhbmQgdGhyb3cgYSBET00gZXhjZXB0aW9uIHdoZW4gaXQgZmFpbHMuCi0gICAgaWYgKG1lZGlhX3NvdXJjZV8pIHsKLSNpZiBkZWZpbmVkKENPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNikKLSAgICAgIG1lZGlhX3NvdXJjZV8tPkF0dGFjaFRvRWxlbWVudCh0aGlzKTsKLSNlbHNlICAgLy8gZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCi0gICAgICBtZWRpYV9zb3VyY2VfLT5TZXRQbGF5ZXIocGxheWVyXy5nZXQoKSk7Ci0jZW5kaWYgIC8vIGRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQotICAgICAgbWVkaWFfc291cmNlX3VybF8gPSB1cmw7Ci0gICAgfSBlbHNlIHsKKyAgICBpZiAoIW1lZGlhX3NvdXJjZV8pIHsKICAgICAgIE5vbmVTdXBwb3J0ZWQoIk1lZGlhIHNvdXJjZSBpcyBOVUxMLiIpOwogICAgICAgcmV0dXJuOwogICAgIH0KKyNpZiBkZWZpbmVkKENPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNikKKyAgICBpZiAoIW1lZGlhX3NvdXJjZV8tPkF0dGFjaFRvRWxlbWVudCh0aGlzKSkgeworICAgICAgbWVkaWFfc291cmNlXyA9IG51bGxwdHI7CisgICAgICBOb25lU3VwcG9ydGVkKCJVbmFibGUgdG8gYXR0YWNoIG1lZGlhIHNvdXJjZS4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisjZWxzZSAgIC8vIGRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQorICAgIG1lZGlhX3NvdXJjZV8tPlNldFBsYXllcihwbGF5ZXJfLmdldCgpKTsKKyNlbmRpZiAgLy8gZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCisgICAgbWVkaWFfc291cmNlX3VybF8gPSB1cmw7CiAgIH0KLQogICAvLyBUaGUgcmVzb3VyY2UgZmV0Y2ggYWxnb3JpdGhtCiAgIG5ldHdvcmtfc3RhdGVfID0ga05ldHdvcmtMb2FkaW5nOwogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9odG1sX3NjcmlwdF9lbGVtZW50LmNjIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9zY3JpcHRfZWxlbWVudC5jYwppbmRleCA1MDY4OGM0Li41MzM2ZWQyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9odG1sX3NjcmlwdF9lbGVtZW50LmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfc2NyaXB0X2VsZW1lbnQuY2MKQEAgLTcxLDcgKzcxLDkgQEAKICAgICAgIGlubGluZV9zY3JpcHRfbG9jYXRpb25fKEdldFNvdXJjZUxvY2F0aW9uTmFtZSgpLCAxLCAxKSwKICAgICAgIGlzX3N5bmNfbG9hZF9zdWNjZXNzZnVsXyhmYWxzZSksCiAgICAgICBwcmV2ZW50X2dhcmJhZ2VfY29sbGVjdGlvbl9jb3VudF8oMCksCi0gICAgICBzaG91bGRfZXhlY3V0ZV8odHJ1ZSkgeworICAgICAgc2hvdWxkX2V4ZWN1dGVfKHRydWUpLAorICAgICAgc3luY2hyb25vdXNfbG9hZGVyX2ludGVycnVwdF8oCisgICAgICAgICAgZG9jdW1lbnQtPmh0bWxfZWxlbWVudF9jb250ZXh0KCktPnN5bmNocm9ub3VzX2xvYWRlcl9pbnRlcnJ1cHQoKSkgewogICBEQ0hFQ0soZG9jdW1lbnQtPmh0bWxfZWxlbWVudF9jb250ZXh0KCktPnNjcmlwdF9ydW5uZXIoKSk7CiB9CiAKQEAgLTI5MCwxMCArMjkyLDE2IEBACiAgICAgICAvLyBUaGUgZWxlbWVudCBpcyB0aGUgcGVuZGluZyBwYXJzaW5nLWJsb2NraW5nIHNjcmlwdCBvZiB0aGUgRG9jdW1lbnQgb2YKICAgICAgIC8vIHRoZSBwYXJzZXIgdGhhdCBjcmVhdGVkIHRoZSBlbGVtZW50LiAoVGhlcmUgY2FuIG9ubHkgYmUgb25lIHN1Y2ggc2NyaXB0CiAgICAgICAvLyBwZXIgRG9jdW1lbnQgYXQgYSB0aW1lLikKKworICAgICAgLy8gVGhpcyB2YXJpYWJsZSB3aWxsIGJlIHNldCB0byB0cnVlIGluIHRoZSBjb21wbGV0aW9uIGNhbGxiYWNrIGZvciB0aGUKKyAgICAgIC8vIGxvYWRlciBiZWxvdy4gIElmIHRoYXQgY29tcGxldGlvbiBjYWxsYmFjayBuZXZlciBmaXJlcywgdGhlIHZhcmlhYmxlCisgICAgICAvLyB3aWxsIHN0YXkgZmFsc2UuICBUaGlzIGNhbiBoYXBwZW4gaWYgdGhlIGxvYWRlciB3YXMgaW50ZXJydXB0ZWQsIG9yCisgICAgICAvLyBmYWlsZWQgZm9yIGFub3RoZXIgcmVhc29uLgogICAgICAgaXNfc3luY19sb2FkX3N1Y2Nlc3NmdWxfID0gZmFsc2U7CiAKICAgICAgIGxvYWRlcjo6TG9hZFN5bmNocm9ub3VzbHkoCiAgICAgICAgICAgaHRtbF9lbGVtZW50X2NvbnRleHQoKS0+c3luY19sb2FkX3RocmVhZCgpLT5tZXNzYWdlX2xvb3AoKSwKKyAgICAgICAgICBzeW5jaHJvbm91c19sb2FkZXJfaW50ZXJydXB0XywKICAgICAgICAgICBiYXNlOjpCaW5kKAogICAgICAgICAgICAgICAmbG9hZGVyOjpGZXRjaGVyRmFjdG9yeTo6Q3JlYXRlU2VjdXJlRmV0Y2hlciwKICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZChodG1sX2VsZW1lbnRfY29udGV4dCgpLT5mZXRjaGVyX2ZhY3RvcnkoKSksIHVybF8sCkBAIC0zMzgsMTcgKzM0NiwxOSBAQAogICAgICAgLy8gb25jZSB0aGUgcmVzb3VyY2UgaGFzIGJlZW4gZmV0Y2hlZCAoZGVmaW5lZCBhYm92ZSkgaGFzIGJlZW4gcnVuLgogICAgICAgZG9jdW1lbnRfLT5JbmNyZWFzZUxvYWRpbmdDb3VudGVyKCk7CiAKLSAgICAgIGxvYWRlcl8ucmVzZXQobmV3IGxvYWRlcjo6TG9hZGVyKAotICAgICAgICAgIGJhc2U6OkJpbmQoCi0gICAgICAgICAgICAgICZsb2FkZXI6OkZldGNoZXJGYWN0b3J5OjpDcmVhdGVTZWN1cmVGZXRjaGVyLAotICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKGh0bWxfZWxlbWVudF9jb250ZXh0KCktPmZldGNoZXJfZmFjdG9yeSgpKSwgdXJsXywKLSAgICAgICAgICAgICAgY3NwX2NhbGxiYWNrLCByZXF1ZXN0X21vZGVfLAotICAgICAgICAgICAgICBkb2N1bWVudF8tPmxvY2F0aW9uKCkgPyBkb2N1bWVudF8tPmxvY2F0aW9uKCktPkdldE9yaWdpbkFzT2JqZWN0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbG9hZGVyOjpPcmlnaW4oKSksCi0gICAgICAgICAgc2NvcGVkX3B0cjxsb2FkZXI6OkRlY29kZXI+KG5ldyBsb2FkZXI6OlRleHREZWNvZGVyKGJhc2U6OkJpbmQoCi0gICAgICAgICAgICAgICZIVE1MU2NyaXB0RWxlbWVudDo6T25Mb2FkaW5nRG9uZSwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpKSwKLSAgICAgICAgICBiYXNlOjpCaW5kKCZIVE1MU2NyaXB0RWxlbWVudDo6T25Mb2FkaW5nRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSkpOworICAgICAgbG9hZGVyOjpPcmlnaW4gb3JpZ2luID0gZG9jdW1lbnRfLT5sb2NhdGlvbigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBkb2N1bWVudF8tPmxvY2F0aW9uKCktPkdldE9yaWdpbkFzT2JqZWN0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGxvYWRlcjo6T3JpZ2luKCk7CisKKyAgICAgIGxvYWRlcl8gPSBodG1sX2VsZW1lbnRfY29udGV4dCgpCisgICAgICAgICAgICAgICAgICAgIC0+bG9hZGVyX2ZhY3RvcnkoKQorICAgICAgICAgICAgICAgICAgICAtPkNyZWF0ZVNjcmlwdExvYWRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIHVybF8sIG9yaWdpbiwgY3NwX2NhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZCgmSFRNTFNjcmlwdEVsZW1lbnQ6Ok9uTG9hZGluZ0RvbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpLAorICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZCgmSFRNTFNjcmlwdEVsZW1lbnQ6Ok9uTG9hZGluZ0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSkKKyAgICAgICAgICAgICAgICAgICAgLlBhc3MoKTsKICAgICB9IGJyZWFrOwogICAgIGNhc2UgNTogewogICAgICAgLy8gVGhpcyBpcyBhbiBhc3luY2hyb25vdXMgc2NyaXB0LiBQcmV2ZW50IGdhcmJhZ2UgY29sbGVjdGlvbiB1bnRpbApAQCAtMzY1LDE3ICszNzUsMjEgQEAKICAgICAgIC8vIFRoZSBlbGVtZW50IG11c3QgYmUgYWRkZWQgdG8gdGhlIHNldCBvZiBzY3JpcHRzIHRoYXQgd2lsbCBleGVjdXRlIGFzCiAgICAgICAvLyBzb29uIGFzIHBvc3NpYmxlIG9mIHRoZSBEb2N1bWVudCBvZiB0aGUgc2NyaXB0IGVsZW1lbnQgYXQgdGhlIHRpbWUgdGhlCiAgICAgICAvLyBwcmVwYXJlIGEgc2NyaXB0IGFsZ29yaXRobSBzdGFydGVkLgotICAgICAgbG9hZGVyXy5yZXNldChuZXcgbG9hZGVyOjpMb2FkZXIoCi0gICAgICAgICAgYmFzZTo6QmluZCgKLSAgICAgICAgICAgICAgJmxvYWRlcjo6RmV0Y2hlckZhY3Rvcnk6OkNyZWF0ZVNlY3VyZUZldGNoZXIsCi0gICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoaHRtbF9lbGVtZW50X2NvbnRleHQoKS0+ZmV0Y2hlcl9mYWN0b3J5KCkpLCB1cmxfLAotICAgICAgICAgICAgICBjc3BfY2FsbGJhY2ssIHJlcXVlc3RfbW9kZV8sCi0gICAgICAgICAgICAgIGRvY3VtZW50Xy0+bG9jYXRpb24oKSA/IGRvY3VtZW50Xy0+bG9jYXRpb24oKS0+R2V0T3JpZ2luQXNPYmplY3QoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBsb2FkZXI6Ok9yaWdpbigpKSwKLSAgICAgICAgICBzY29wZWRfcHRyPGxvYWRlcjo6RGVjb2Rlcj4obmV3IGxvYWRlcjo6VGV4dERlY29kZXIoYmFzZTo6QmluZCgKLSAgICAgICAgICAgICAgJkhUTUxTY3JpcHRFbGVtZW50OjpPbkxvYWRpbmdEb25lLCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSkpLAotICAgICAgICAgIGJhc2U6OkJpbmQoJkhUTUxTY3JpcHRFbGVtZW50OjpPbkxvYWRpbmdFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpKSk7CisgICAgICBEQ0hFQ0soIWxvYWRlcl8pOworCisgICAgICBsb2FkZXI6Ok9yaWdpbiBvcmlnaW4gPSBkb2N1bWVudF8tPmxvY2F0aW9uKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGRvY3VtZW50Xy0+bG9jYXRpb24oKS0+R2V0T3JpZ2luQXNPYmplY3QoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbG9hZGVyOjpPcmlnaW4oKTsKKworICAgICAgbG9hZGVyXyA9IGh0bWxfZWxlbWVudF9jb250ZXh0KCkKKyAgICAgICAgICAgICAgICAgICAgLT5sb2FkZXJfZmFjdG9yeSgpCisgICAgICAgICAgICAgICAgICAgIC0+Q3JlYXRlU2NyaXB0TG9hZGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgdXJsXywgb3JpZ2luLCBjc3BfY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kKCZIVE1MU2NyaXB0RWxlbWVudDo6T25Mb2FkaW5nRG9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSksCisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpCaW5kKCZIVE1MU2NyaXB0RWxlbWVudDo6T25Mb2FkaW5nRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpKQorICAgICAgICAgICAgICAgICAgICAuUGFzcygpOwogICAgIH0gYnJlYWs7CiAgICAgY2FzZSA2OiB7CiAgICAgICAvLyBPdGhlcndpc2UuCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9odG1sX3NjcmlwdF9lbGVtZW50LmggYi9zcmMvY29iYWx0L2RvbS9odG1sX3NjcmlwdF9lbGVtZW50LmgKaW5kZXggZDZjNDJmZi4uZDUwNzcxMiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vaHRtbF9zY3JpcHRfZWxlbWVudC5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfc2NyaXB0X2VsZW1lbnQuaApAQCAtMTksNiArMTksNyBAQAogCiAjaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgogI2luY2x1ZGUgImJhc2UvbWVtb3J5L3dlYWtfcHRyLmgiCisjaW5jbHVkZSAiYmFzZS9zeW5jaHJvbml6YXRpb24vd2FpdGFibGVfZXZlbnQuaCIKICNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgogI2luY2x1ZGUgImNvYmFsdC9iYXNlL3NvdXJjZV9sb2NhdGlvbi5oIgogI2luY2x1ZGUgImNvYmFsdC9kb20vaHRtbF9lbGVtZW50LmgiCkBAIC0xNDksNiArMTUwLDggQEAKICAgLy8gamF2YXNjcmlwdCBwYXJzZXIgdGFrZXMgaW4gdG8gcmVjb3JkIGlmIHRoZSBlcnJvciByZXFvcnQgc2hvdWxkIGJlIG11dGVkCiAgIC8vIGR1ZSB0byBjcm9zcy1vcmlnaW4gZmV0Y2hlZCBzY3JpcHQuCiAgIGxvYWRlcjo6T3JpZ2luIGZldGNoZWRfbGFzdF91cmxfb3JpZ2luXzsKKworICBiYXNlOjpXYWl0YWJsZUV2ZW50KiBzeW5jaHJvbm91c19sb2FkZXJfaW50ZXJydXB0XzsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBkb20KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2xvY2FsX3N0b3JhZ2VfZGF0YWJhc2UuY2MgYi9zcmMvY29iYWx0L2RvbS9sb2NhbF9zdG9yYWdlX2RhdGFiYXNlLmNjCmluZGV4IDAyZmM5NzYuLmU1NzNlODEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2xvY2FsX3N0b3JhZ2VfZGF0YWJhc2UuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vbG9jYWxfc3RvcmFnZV9kYXRhYmFzZS5jYwpAQCAtMTgsMTIwICsxOCw0NyBAQAogI2luY2x1ZGUgImNvYmFsdC9kb20vc3RvcmFnZV9hcmVhLmgiCiAjaW5jbHVkZSAiY29iYWx0L3N0b3JhZ2Uvc3RvcmFnZV9tYW5hZ2VyLmgiCiAjaW5jbHVkZSAibmIvbWVtb3J5X3Njb3BlLmgiCi0jaW5jbHVkZSAic3FsL3N0YXRlbWVudC5oIgogCiBuYW1lc3BhY2UgY29iYWx0IHsKIG5hbWVzcGFjZSBkb20gewogCiBuYW1lc3BhY2UgewogCi1jb25zdCBpbnQga09yaWdpbmFsTG9jYWxTdG9yYWdlU2NoZW1hVmVyc2lvbiA9IDE7Ci1jb25zdCBpbnQga0xhdGVzdExvY2FsU3RvcmFnZVNjaGVtYVZlcnNpb24gPSAxOwotCi12b2lkIFNxbEluaXQoc3RvcmFnZTo6U3FsQ29udGV4dCogc3FsX2NvbnRleHQpIHsKLSAgVFJBQ0tfTUVNT1JZX1NDT1BFKCJTdG9yYWdlIik7Ci0gIFRSQUNFX0VWRU5UMCgiY29iYWx0OjpzdG9yYWdlIiwgIkxvY2FsU3RvcmFnZTo6U3FsSW5pdCgpIik7Ci0gIHNxbDo6Q29ubmVjdGlvbiogY29ubiA9IHNxbF9jb250ZXh0LT5zcWxfY29ubmVjdGlvbigpOwotICBpbnQgc2NoZW1hX3ZlcnNpb247Ci0gIGJvb2wgdGFibGVfZXhpc3RzID0KLSAgICAgIHNxbF9jb250ZXh0LT5HZXRTY2hlbWFWZXJzaW9uKCJMb2NhbFN0b3JhZ2VUYWJsZSIsICZzY2hlbWFfdmVyc2lvbik7Ci0KLSAgaWYgKHRhYmxlX2V4aXN0cykgewotICAgIGlmIChzY2hlbWFfdmVyc2lvbiA9PSBzdG9yYWdlOjpTdG9yYWdlTWFuYWdlcjo6a1NjaGVtYVRhYmxlSXNOZXcpIHsKLSAgICAgIC8vIFRoaXMgc2F2ZWdhbWUgcHJlZGF0ZXMgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgc2NoZW1hIHRhYmxlLgotICAgICAgLy8gU2luY2UgdGhlIGxvY2FsLXN0b3JhZ2UgdGFibGUgZGlkIG5vdCBjaGFuZ2UgYmV0d2VlbiB0aGUgaW5pdGlhbAotICAgICAgLy8gcmVsZWFzZSBvZiB0aGUgYXBwIGFuZCB0aGUgaW50cm9kdWN0aW9uIG9mIHRoZSBzY2hlbWEgdGFibGUsIGFzc3VtZQotICAgICAgLy8gdGhhdCB0aGlzIGV4aXN0aW5nIGxvY2FsLXN0b3JhZ2UgdGFibGUgaXMgc2NoZW1hIHZlcnNpb24gMS4gIFRoaXMKLSAgICAgIC8vIGF2b2lkcyBhIGxvc3Mgb2YgZGF0YSBvbiB1cGdyYWRlLgotCi0gICAgICBETE9HKElORk8pIDw8ICJVcGRhdGluZyBMb2NhbFN0b3JhZ2VUYWJsZSBzY2hlbWEgdmVyc2lvbiB0byAiCi0gICAgICAgICAgICAgICAgIDw8IGtPcmlnaW5hbExvY2FsU3RvcmFnZVNjaGVtYVZlcnNpb247Ci0gICAgICBzcWxfY29udGV4dC0+VXBkYXRlU2NoZW1hVmVyc2lvbigiTG9jYWxTdG9yYWdlVGFibGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga09yaWdpbmFsTG9jYWxTdG9yYWdlU2NoZW1hVmVyc2lvbik7Ci0gICAgfSBlbHNlIGlmIChzY2hlbWFfdmVyc2lvbiA9PSBzdG9yYWdlOjpTdG9yYWdlTWFuYWdlcjo6a1NjaGVtYVZlcnNpb25Mb3N0KSB7Ci0gICAgICAvLyBTaW5jZSB0aGVyZSBoYXMgb25seSBiZWVuIG9uZSBzY2hlbWEgc28gZmFyLCB0cmVhdCB0aGlzIHRoZSBzYW1lIGFzCi0gICAgICAvLyBrU2NoZW1hVGFibGVJc05ldy4gIFdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIHNjaGVtYXMgaW4gdGhlIHdpbGQsCi0gICAgICAvLyB3ZSBtYXkgd2FudCB0byBkcm9wIHRoZSB0YWJsZSBpbnN0ZWFkLgotICAgICAgc3FsX2NvbnRleHQtPlVwZGF0ZVNjaGVtYVZlcnNpb24oIkxvY2FsU3RvcmFnZVRhYmxlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtPcmlnaW5hbExvY2FsU3RvcmFnZVNjaGVtYVZlcnNpb24pOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvLyBUaGUgdGFibGUgZG9lcyBub3QgZXhpc3QsIHNvIGNyZWF0ZSBpdCBpbiBpdHMgbGF0ZXN0IGZvcm0uCi0gICAgc3FsOjpTdGF0ZW1lbnQgY3JlYXRlX3RhYmxlKGNvbm4tPkdldFVuaXF1ZVN0YXRlbWVudCgKLSAgICAgICAgIkNSRUFURSBUQUJMRSBMb2NhbFN0b3JhZ2VUYWJsZSAoIgotICAgICAgICAiICBzaXRlX2lkZW50aWZpZXIgVEVYVCwgIgotICAgICAgICAiICBrZXkgVEVYVCwgIgotICAgICAgICAiICB2YWx1ZSBURVhUIE5PVCBOVUxMIE9OIENPTkZMSUNUIEZBSUwsICIKLSAgICAgICAgIiAgVU5JUVVFKHNpdGVfaWRlbnRpZmllciwga2V5KSBPTiBDT05GTElDVCBSRVBMQUNFIgotICAgICAgICAiKSIpKTsKLSAgICBib29sIG9rID0gY3JlYXRlX3RhYmxlLlJ1bigpOwotICAgIERDSEVDSyhvayk7Ci0gICAgc3FsX2NvbnRleHQtPlVwZGF0ZVNjaGVtYVZlcnNpb24oIkxvY2FsU3RvcmFnZVRhYmxlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrTGF0ZXN0TG9jYWxTdG9yYWdlU2NoZW1hVmVyc2lvbik7Ci0gIH0KK3ZvaWQgTG9jYWxTdG9yYWdlSW5pdChjb25zdCBzdG9yYWdlOjpNZW1vcnlTdG9yZSYgbWVtb3J5X3N0b3JlKSB7CisgIExPRyhJTkZPKSA8PCAibG9jYWxfc3RvcmFnZSBJbml0IjsKKyAgVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUihtZW1vcnlfc3RvcmUpOwogfQogCi12b2lkIFNxbFJlYWRWYWx1ZXMoY29uc3Qgc3RkOjpzdHJpbmcmIGlkLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2FsU3RvcmFnZURhdGFiYXNlOjpSZWFkQ29tcGxldGlvbkNhbGxiYWNrJiBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICBzdG9yYWdlOjpTcWxDb250ZXh0KiBzcWxfY29udGV4dCkgewordm9pZCBMb2NhbFN0b3JhZ2VSZWFkVmFsdWVzKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCwKKyAgICBjb25zdCBMb2NhbFN0b3JhZ2VEYXRhYmFzZTo6UmVhZENvbXBsZXRpb25DYWxsYmFjayYgY2FsbGJhY2ssCisgICAgY29uc3Qgc3RvcmFnZTo6TWVtb3J5U3RvcmUmIG1lbW9yeV9zdG9yZSkgeworICBMT0coSU5GTykgPDwgIkxvY2FsU3RvcmFnZVJlYWRWYWx1ZXMiOwogICBUUkFDS19NRU1PUllfU0NPUEUoIlN0b3JhZ2UiKTsKLSAgc2NvcGVkX3B0cjxTdG9yYWdlQXJlYTo6U3RvcmFnZU1hcD4gdmFsdWVzKG5ldyBTdG9yYWdlQXJlYTo6U3RvcmFnZU1hcCk7Ci0gIHNxbDo6Q29ubmVjdGlvbiogY29ubiA9IHNxbF9jb250ZXh0LT5zcWxfY29ubmVjdGlvbigpOwotICBzcWw6OlN0YXRlbWVudCBnZXRfdmFsdWVzKGNvbm4tPkdldENhY2hlZFN0YXRlbWVudCgKLSAgICAgIFNRTF9GUk9NX0hFUkUsCi0gICAgICAiU0VMRUNUIGtleSwgdmFsdWUgRlJPTSBMb2NhbFN0b3JhZ2VUYWJsZSBXSEVSRSBzaXRlX2lkZW50aWZpZXIgPSA/IikpOwotICBnZXRfdmFsdWVzLkJpbmRTdHJpbmcoMCwgaWQpOwotICB3aGlsZSAoZ2V0X3ZhbHVlcy5TdGVwKCkpIHsKLSAgICAvLyBUT0RPOiBJbiBTdGVlbCwgdGhlc2Ugd2VyZSBzdHJpbmcxNi4KLSAgICBzdGQ6OnN0cmluZyBrZXkoZ2V0X3ZhbHVlcy5Db2x1bW5TdHJpbmcoMCkpOwotICAgIHN0ZDo6c3RyaW5nIHZhbHVlKGdldF92YWx1ZXMuQ29sdW1uU3RyaW5nKDEpKTsKLSAgICB2YWx1ZXMtPmluc2VydChzdGQ6Om1ha2VfcGFpcihrZXksIHZhbHVlKSk7Ci0gIH0KKworICBzY29wZWRfcHRyPHN0b3JhZ2U6Ok1lbW9yeVN0b3JlOjpMb2NhbFN0b3JhZ2VNYXA+IHZhbHVlcygKKyAgICAgIG5ldyBzdG9yYWdlOjpNZW1vcnlTdG9yZTo6TG9jYWxTdG9yYWdlTWFwKTsKKyAgbWVtb3J5X3N0b3JlLlJlYWRBbGxMb2NhbFN0b3JhZ2UoaWQsIHZhbHVlcy5nZXQoKSk7CiAgIGNhbGxiYWNrLlJ1bih2YWx1ZXMuUGFzcygpKTsKIH0KIAotdm9pZCBTcWxXcml0ZShjb25zdCBzdGQ6OnN0cmluZyYgaWQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksCi0gICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSwgc3RvcmFnZTo6U3FsQ29udGV4dCogc3FsX2NvbnRleHQpIHsKK3ZvaWQgTG9jYWxTdG9yYWdlV3JpdGUoY29uc3Qgc3RkOjpzdHJpbmcmIGlkLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2U6Ok1lbW9yeVN0b3JlKiBtZW1vcnlfc3RvcmUpIHsKICAgVFJBQ0tfTUVNT1JZX1NDT1BFKCJTdG9yYWdlIik7Ci0gIHNxbDo6Q29ubmVjdGlvbiogY29ubiA9IHNxbF9jb250ZXh0LT5zcWxfY29ubmVjdGlvbigpOwotICBzcWw6OlN0YXRlbWVudCB3cml0ZV9zdGF0ZW1lbnQoY29ubi0+R2V0Q2FjaGVkU3RhdGVtZW50KAotICAgICAgU1FMX0ZST01fSEVSRSwKLSAgICAgICJJTlNFUlQgSU5UTyBMb2NhbFN0b3JhZ2VUYWJsZSAoc2l0ZV9pZGVudGlmaWVyLCBrZXksIHZhbHVlKSAiCi0gICAgICAiVkFMVUVTICg/LCA/LCA/KSIpKTsKLSAgd3JpdGVfc3RhdGVtZW50LkJpbmRTdHJpbmcoMCwgaWQpOwotICB3cml0ZV9zdGF0ZW1lbnQuQmluZFN0cmluZygxLCBrZXkpOwotICB3cml0ZV9zdGF0ZW1lbnQuQmluZFN0cmluZygyLCB2YWx1ZSk7Ci0gIGJvb2wgb2sgPSB3cml0ZV9zdGF0ZW1lbnQuUnVuKCk7Ci0gIERDSEVDSyhvayk7Ci0gIHNxbF9jb250ZXh0LT5GbHVzaE9uQ2hhbmdlKCk7CisgIG1lbW9yeV9zdG9yZS0+V3JpdGVUb0xvY2FsU3RvcmFnZShpZCwga2V5LCB2YWx1ZSk7CiB9CiAKLXZvaWQgU3FsRGVsZXRlKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwKLSAgICAgICAgICAgICAgIHN0b3JhZ2U6OlNxbENvbnRleHQqIHNxbF9jb250ZXh0KSB7Cit2b2lkIExvY2FsU3RvcmFnZURlbGV0ZShjb25zdCBzdGQ6OnN0cmluZyYgaWQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlOjpNZW1vcnlTdG9yZSogbWVtb3J5X3N0b3JlKSB7CiAgIFRSQUNLX01FTU9SWV9TQ09QRSgiU3RvcmFnZSIpOwotICBzcWw6OkNvbm5lY3Rpb24qIGNvbm4gPSBzcWxfY29udGV4dC0+c3FsX2Nvbm5lY3Rpb24oKTsKLSAgc3FsOjpTdGF0ZW1lbnQgZGVsZXRlX3N0YXRlbWVudCgKLSAgICAgIGNvbm4tPkdldENhY2hlZFN0YXRlbWVudChTUUxfRlJPTV9IRVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJERUxFVEUgRlJPTSBMb2NhbFN0b3JhZ2VUYWJsZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldIRVJFIHNpdGVfaWRlbnRpZmllciA9ID8gQU5EIGtleSA9ID8iKSk7Ci0gIGRlbGV0ZV9zdGF0ZW1lbnQuQmluZFN0cmluZygwLCBpZCk7Ci0gIGRlbGV0ZV9zdGF0ZW1lbnQuQmluZFN0cmluZygxLCBrZXkpOwotICBib29sIG9rID0gZGVsZXRlX3N0YXRlbWVudC5SdW4oKTsKLSAgRENIRUNLKG9rKTsKLSAgc3FsX2NvbnRleHQtPkZsdXNoT25DaGFuZ2UoKTsKKyAgbWVtb3J5X3N0b3JlLT5EZWxldGVGcm9tTG9jYWxTdG9yYWdlKGlkLCBrZXkpOwogfQogCi12b2lkIFNxbENsZWFyKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCwgc3RvcmFnZTo6U3FsQ29udGV4dCogc3FsX2NvbnRleHQpIHsKK3ZvaWQgTG9jYWxTdG9yYWdlQ2xlYXIoY29uc3Qgc3RkOjpzdHJpbmcmIGlkLAorICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlOjpNZW1vcnlTdG9yZSogbWVtb3J5X3N0b3JlKSB7CiAgIFRSQUNLX01FTU9SWV9TQ09QRSgiU3RvcmFnZSIpOwotICBzcWw6OkNvbm5lY3Rpb24qIGNvbm4gPSBzcWxfY29udGV4dC0+c3FsX2Nvbm5lY3Rpb24oKTsKLSAgc3FsOjpTdGF0ZW1lbnQgY2xlYXJfc3RhdGVtZW50KAotICAgICAgY29ubi0+R2V0Q2FjaGVkU3RhdGVtZW50KFNRTF9GUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRFTEVURSBGUk9NIExvY2FsU3RvcmFnZVRhYmxlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV0hFUkUgc2l0ZV9pZGVudGlmaWVyID0gPyIpKTsKLSAgY2xlYXJfc3RhdGVtZW50LkJpbmRTdHJpbmcoMCwgaWQpOwotICBib29sIG9rID0gY2xlYXJfc3RhdGVtZW50LlJ1bigpOwotICBEQ0hFQ0sob2spOwotICBzcWxfY29udGV4dC0+Rmx1c2hPbkNoYW5nZSgpOworICBtZW1vcnlfc3RvcmUtPkNsZWFyTG9jYWxTdG9yYWdlKGlkKTsKIH0KIH0gIC8vIG5hbWVzcGFjZQogCkBAIC0xNDIsNyArNjksNyBAQAogLy8gYSBwb3RlbnRpYWwgd2FpdCB3aGlsZSB0aGUgc3RvcmFnZSBtYW5hZ2VyIGxvYWRzIGZyb20gZGlzay4KIHZvaWQgTG9jYWxTdG9yYWdlRGF0YWJhc2U6OkluaXQoKSB7CiAgIGlmICghaW5pdGlhbGl6ZWRfKSB7Ci0gICAgc3RvcmFnZV8tPkdldFNxbENvbnRleHQoYmFzZTo6QmluZCgmU3FsSW5pdCkpOworICAgIHN0b3JhZ2VfLT5XaXRoUmVhZE9ubHlNZW1vcnlTdG9yZShiYXNlOjpCaW5kKCZMb2NhbFN0b3JhZ2VJbml0KSk7CiAgICAgaW5pdGlhbGl6ZWRfID0gdHJ1ZTsKICAgfQogfQpAQCAtMTUxLDI4ICs3OCwzMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWFkQ29tcGxldGlvbkNhbGxiYWNrJiBjYWxsYmFjaykgewogICBUUkFDS19NRU1PUllfU0NPUEUoIlN0b3JhZ2UiKTsKICAgSW5pdCgpOwotICBzdG9yYWdlXy0+R2V0U3FsQ29udGV4dChiYXNlOjpCaW5kKCZTcWxSZWFkVmFsdWVzLCBpZCwgY2FsbGJhY2spKTsKKyAgc3RvcmFnZV8tPldpdGhSZWFkT25seU1lbW9yeVN0b3JlKAorICAgICAgYmFzZTo6QmluZCgmTG9jYWxTdG9yYWdlUmVhZFZhbHVlcywgaWQsIGNhbGxiYWNrKSk7CiB9CiAKIHZvaWQgTG9jYWxTdG9yYWdlRGF0YWJhc2U6OldyaXRlKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgewogICBUUkFDS19NRU1PUllfU0NPUEUoIlN0b3JhZ2UiKTsKICAgSW5pdCgpOwotICBzdG9yYWdlXy0+R2V0U3FsQ29udGV4dChiYXNlOjpCaW5kKCZTcWxXcml0ZSwgaWQsIGtleSwgdmFsdWUpKTsKKyAgc3RvcmFnZV8tPldpdGhNZW1vcnlTdG9yZShiYXNlOjpCaW5kKCZMb2NhbFN0b3JhZ2VXcml0ZSwgaWQsIGtleSwgdmFsdWUpKTsKIH0KIAogdm9pZCBMb2NhbFN0b3JhZ2VEYXRhYmFzZTo6RGVsZXRlKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5KSB7CisgIFRSQUNLX01FTU9SWV9TQ09QRSgiU3RvcmFnZSIpOwogICBJbml0KCk7Ci0gIHN0b3JhZ2VfLT5HZXRTcWxDb250ZXh0KGJhc2U6OkJpbmQoJlNxbERlbGV0ZSwgaWQsIGtleSkpOworICBzdG9yYWdlXy0+V2l0aE1lbW9yeVN0b3JlKGJhc2U6OkJpbmQoJkxvY2FsU3RvcmFnZURlbGV0ZSwgaWQsIGtleSkpOwogfQogCiB2b2lkIExvY2FsU3RvcmFnZURhdGFiYXNlOjpDbGVhcihjb25zdCBzdGQ6OnN0cmluZyYgaWQpIHsKKyAgVFJBQ0tfTUVNT1JZX1NDT1BFKCJTdG9yYWdlIik7CiAgIEluaXQoKTsKLSAgc3RvcmFnZV8tPkdldFNxbENvbnRleHQoYmFzZTo6QmluZCgmU3FsQ2xlYXIsIGlkKSk7CisgIHN0b3JhZ2VfLT5XaXRoTWVtb3J5U3RvcmUoYmFzZTo6QmluZCgmTG9jYWxTdG9yYWdlQ2xlYXIsIGlkKSk7CiB9CiAKIHZvaWQgTG9jYWxTdG9yYWdlRGF0YWJhc2U6OkZsdXNoKGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNhbGxiYWNrKSB7CisgIFRSQUNLX01FTU9SWV9TQ09QRSgiU3RvcmFnZSIpOwogICBzdG9yYWdlXy0+Rmx1c2hOb3coY2FsbGJhY2spOwogfQogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9tdXRhdGlvbl9vYnNlcnZlci5jYyBiL3NyYy9jb2JhbHQvZG9tL211dGF0aW9uX29ic2VydmVyLmNjCmluZGV4IDIyOGI5ZDQuLjhjYzBiYTIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL211dGF0aW9uX29ic2VydmVyLmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL211dGF0aW9uX29ic2VydmVyLmNjCkBAIC0xNTcsNyArMTU3LDcgQEAKIAogdm9pZCBNdXRhdGlvbk9ic2VydmVyOjpUcmFjZU1lbWJlcnMoc2NyaXB0OjpUcmFjZXIqIHRyYWNlcikgewogICB0cmFjZXItPlRyYWNlSXRlbXMob2JzZXJ2ZWRfbm9kZXNfKTsKLSAgdHJhY2VyLT5UcmFjZVNlcXVlbmNlKHJlY29yZF9xdWV1ZV8pOworICB0cmFjZXItPlRyYWNlSXRlbXMocmVjb3JkX3F1ZXVlXyk7CiB9CiAKIHZvaWQgTXV0YXRpb25PYnNlcnZlcjo6VHJhY2tPYnNlcnZlZE5vZGUoY29uc3Qgc2NvcGVkX3JlZnB0cjxkb206Ok5vZGU+JiBub2RlKSB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9tdXRhdGlvbl9vYnNlcnZlcl90YXNrX21hbmFnZXIuaCBiL3NyYy9jb2JhbHQvZG9tL211dGF0aW9uX29ic2VydmVyX3Rhc2tfbWFuYWdlci5oCmluZGV4IGRiZmVhY2MuLjhmODE1ZDEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL211dGF0aW9uX29ic2VydmVyX3Rhc2tfbWFuYWdlci5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL211dGF0aW9uX29ic2VydmVyX3Rhc2tfbWFuYWdlci5oCkBAIC0xOSw3ICsxOSw2IEBACiAKICNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCiAjaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvdHJhY2VyLmgiCiAKIG5hbWVzcGFjZSBjb2JhbHQgewpAQCAtMzgsMTIgKzM3LDYgQEAKICBwdWJsaWM6CiAgIE11dGF0aW9uT2JzZXJ2ZXJUYXNrTWFuYWdlcigpIDogdGFza19wb3N0ZWRfKGZhbHNlKSB7fQogCi0gIHZvaWQgUmVnaXN0ZXJBc1RyYWNpbmdSb290KHNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCkgewotICAgIC8vIE5vdGUgdGhhdCB3ZSBvbmx5IGFkZCBvdXJzZWx2ZXMsIGFuZCBuZXZlciByZW1vdmUgb3Vyc2VsdmVzLCBhcyB3ZSB3aWxsCi0gICAgLy8gYWN0dWFsbHkgb3V0bGl2ZSB0aGUgd2ViIG1vZHVsZS4KLSAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkFkZFJvb3QodGhpcyk7Ci0gIH0KLQogICAvLyBUaGVzZSBzaG91bGQgYmUgY2FsbGVkIGluIHRoZSBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIG9mIHRoZQogICAvLyBNdXRhdGlvbk9ic2VydmVyLgogICB2b2lkIE9uTXV0YXRpb25PYnNlcnZlckNyZWF0ZWQoTXV0YXRpb25PYnNlcnZlciogb2JzZXJ2ZXIpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbmF2aWdhdG9yLmggYi9zcmMvY29iYWx0L2RvbS9uYXZpZ2F0b3IuaAppbmRleCBmMTk1YmRiLi40YmQ5MmM3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9uYXZpZ2F0b3IuaAorKysgYi9zcmMvY29iYWx0L2RvbS9uYXZpZ2F0b3IuaApAQCAtODAsNiArODAsMTAgQEAKICAgREVGSU5FX1dSQVBQQUJMRV9UWVBFKE5hdmlnYXRvcik7CiAgIHZvaWQgVHJhY2VNZW1iZXJzKHNjcmlwdDo6VHJhY2VyKiB0cmFjZXIpIG92ZXJyaWRlOwogCisgIHZvaWQgU2V0RW52aXJvbm1lbnRTZXR0aW5ncyhzY3JpcHQ6OkVudmlyb25tZW50U2V0dGluZ3MqIHNldHRpbmdzKSB7CisgICAgbWVkaWFfZGV2aWNlc18tPlNldEVudmlyb25tZW50U2V0dGluZ3Moc2V0dGluZ3MpOworICB9CisKICBwcml2YXRlOgogICB+TmF2aWdhdG9yKCkgb3ZlcnJpZGUge30KIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbm9kZV9saXN0X2xpdmVfdGVzdC5jYyBiL3NyYy9jb2JhbHQvZG9tL25vZGVfbGlzdF9saXZlX3Rlc3QuY2MKaW5kZXggM2MxMWJlYy4uNWUxODI3OSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vbm9kZV9saXN0X2xpdmVfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2RvbS9ub2RlX2xpc3RfbGl2ZV90ZXN0LmNjCkBAIC0yOCw5ICsyOCw5IEBACiAgIE5vZGVMaXN0TGl2ZVRlc3QoKQogICAgICAgOiBkb21fc3RhdF90cmFja2VyXygiTm9kZUxpc3RMaXZlVGVzdCIpLAogICAgICAgICBodG1sX2VsZW1lbnRfY29udGV4dF8oTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRvbV9zdGF0X3RyYWNrZXJfLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OmtBcHBsaWNhdGlvblN0YXRlU3RhcnRlZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjprQXBwbGljYXRpb25TdGF0ZVN0YXJ0ZWQsIE5VTEwpLAogICAgICAgICBkb2N1bWVudF8obmV3IERvY3VtZW50KCZodG1sX2VsZW1lbnRfY29udGV4dF8pKSB7fQogCiAgIH5Ob2RlTGlzdExpdmVUZXN0KCkgb3ZlcnJpZGUge30KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL25vZGVfbGlzdF90ZXN0LmNjIGIvc3JjL2NvYmFsdC9kb20vbm9kZV9saXN0X3Rlc3QuY2MKaW5kZXggNDg4MjZiZS4uZmJkZDE5OCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vbm9kZV9saXN0X3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vbm9kZV9saXN0X3Rlc3QuY2MKQEAgLTI4LDkgKzI4LDkgQEAKICAgTm9kZUxpc3RUZXN0KCkKICAgICAgIDogZG9tX3N0YXRfdHJhY2tlcl8obmV3IERvbVN0YXRUcmFja2VyKCJOb2RlTGlzdFRlc3QiKSksCiAgICAgICAgIGh0bWxfZWxlbWVudF9jb250ZXh0XyhOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21fc3RhdF90cmFja2VyXy5nZXQoKSwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjprQXBwbGljYXRpb25TdGF0ZVN0YXJ0ZWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6a0FwcGxpY2F0aW9uU3RhdGVTdGFydGVkLCBOVUxMKSwKICAgICAgICAgZG9jdW1lbnRfKG5ldyBEb2N1bWVudCgmaHRtbF9lbGVtZW50X2NvbnRleHRfKSkge30KIAogICB+Tm9kZUxpc3RUZXN0KCkgb3ZlcnJpZGUge30KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL29uX2Vycm9yX2V2ZW50X2xpc3RlbmVyLmNjIGIvc3JjL2NvYmFsdC9kb20vb25fZXJyb3JfZXZlbnRfbGlzdGVuZXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFmNTY5NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL29uX2Vycm9yX2V2ZW50X2xpc3RlbmVyLmNjCkBAIC0wLDAgKzEsNTAgQEAKKy8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJjb2JhbHQvZG9tL29uX2Vycm9yX2V2ZW50X2xpc3RlbmVyLmgiCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCisjaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvZG9tL2Vycm9yX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2RvbS9ldmVudF90YXJnZXQuaCIKKyNpbmNsdWRlICJjb2JhbHQvZG9tL3NjcmlwdF9ldmVudF9sb2cuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgZG9tIHsKKworYmFzZTo6b3B0aW9uYWw8Ym9vbD4gT25FcnJvckV2ZW50TGlzdGVuZXI6OkhhbmRsZUV2ZW50KAorICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiBjYWxsYmFja190aGlzLAorICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8RXZlbnQ+JiBldmVudCwgYm9vbCogaGFkX2V4Y2VwdGlvbiwKKyAgICBib29sIHVucGFja19lcnJvcl9ldmVudHMpIGNvbnN0IHsKKyAgaWYgKHVucGFja19lcnJvcl9ldmVudHMpIHsKKyAgICAvLyBPbmx5IEVycm9yRXZlbnRzIHNob3VsZCBiZSBkaXNwYXRjaGVkIHRvIE9uRXJyb3JFdmVudExpc3RlbmVycy4KKyAgICBFcnJvckV2ZW50KiBlcnJvcl9ldmVudCA9CisgICAgICAgIGJhc2U6OnBvbHltb3JwaGljX2Rvd25jYXN0PEVycm9yRXZlbnQqPihldmVudC5nZXQoKSk7CisKKyAgICAvLyBVbnBhY2sgdGhlIGVycm9yIGV2ZW50IGludG8gaXRzIGNvbXBvbmVudHMgYW5kIHBhc3MgdGhvc2UgZG93bi4KKyAgICByZXR1cm4gSGFuZGxlRXZlbnQoY2FsbGJhY2tfdGhpcywgRXZlbnRPck1lc3NhZ2UoZXJyb3JfZXZlbnQtPm1lc3NhZ2UoKSksCisgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2V2ZW50LT5maWxlbmFtZSgpLCBlcnJvcl9ldmVudC0+bGluZW5vKCksCisgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2V2ZW50LT5jb2xubygpLCBlcnJvcl9ldmVudC0+ZXJyb3IoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgaGFkX2V4Y2VwdGlvbik7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIEhhbmRsZUV2ZW50KGNhbGxiYWNrX3RoaXMsIEV2ZW50T3JNZXNzYWdlKGV2ZW50KSwgc3RkOjpzdHJpbmcoKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgMCwgTlVMTCwgaGFkX2V4Y2VwdGlvbik7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGRvbQorfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vb25fZXJyb3JfZXZlbnRfbGlzdGVuZXIuaCBiL3NyYy9jb2JhbHQvZG9tL29uX2Vycm9yX2V2ZW50X2xpc3RlbmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDExYmRiNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL29uX2Vycm9yX2V2ZW50X2xpc3RlbmVyLmgKQEAgLTAsMCArMSw1NiBAQAorLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBDT0JBTFRfRE9NX09OX0VSUk9SX0VWRU5UX0xJU1RFTkVSX0hfCisjZGVmaW5lIENPQkFMVF9ET01fT05fRVJST1JfRVZFTlRfTElTVEVORVJfSF8KKworI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCisjaW5jbHVkZSAiYmFzZS9vcHRpb25hbC5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vZXZlbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvZG9tL2V2ZW50X2xpc3RlbmVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC91bmlvbl90eXBlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgZG9tIHsKKworLy8gVGhpcyBpbnRlcmZhY2UgZXhpc3RzIHRvIHN1cHBvcnQgdGhlIHNwZWNpYWwgY2FzZSBPbkVycm9yRXZlbnRIYW5kbGVyOgorLy8gICBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnLyNvbmVycm9yZXZlbnRoYW5kbGVyCitjbGFzcyBPbkVycm9yRXZlbnRMaXN0ZW5lciB7CisgcHVibGljOgorICB1c2luZyBFdmVudE9yTWVzc2FnZSA9IHNjcmlwdDo6VW5pb25UeXBlMjxzY29wZWRfcmVmcHRyPEV2ZW50Piwgc3RkOjpzdHJpbmc+OworCisgIC8vIFRoZSBwdWJsaWMgaW50ZXJmYWNlIHNpbXBseSBhY2NlcHRzIHRoZSBlcnJvciBldmVudCwgd2hpY2ggd2lsbCBiZQorICAvLyB0cmFuc2xhdGVkIHRvIHRoZSBtb3JlIGNvbXBsaWNhdGVkIElETCBoYW5kbGVFdmVudCBpbnRlcmZhY2Ugd2hpY2ggaXMKKyAgLy8gbWFya2VkIHByb3RlY3RlZC4gIER1cmluZyB0aGF0IHRyYW5zbGF0aW9uLCB0aGUgZXZlbnQgcGFyYW1ldGVycyBtYXkKKyAgLy8gYmUgdW5wYWNrZWQgaWYgdGhlIHx1bnBhY2tfZXJyb3JfZXZlbnRzfCBmbGFnIGlzIHRydWUuCisgIGJhc2U6Om9wdGlvbmFsPGJvb2w+IEhhbmRsZUV2ZW50KAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIGNhbGxiYWNrX3RoaXMsCisgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPEV2ZW50PiYgZXZlbnQsIGJvb2wqIGhhZF9leGNlcHRpb24sCisgICAgICBib29sIHVucGFja19lcnJvcl9ldmVudHMpIGNvbnN0OworCisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIGJhc2U6Om9wdGlvbmFsPGJvb2w+IEhhbmRsZUV2ZW50KAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIGNhbGxiYWNrX3RoaXMsCisgICAgICBFdmVudE9yTWVzc2FnZSBtZXNzYWdlLCBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsIHVpbnQzMiBsaW5lbm8sCisgICAgICB1aW50MzIgY29sbm8sIGNvbnN0IHNjcmlwdDo6VmFsdWVIYW5kbGVIb2xkZXIqIGVycm9yLAorICAgICAgYm9vbCogaGFkX2V4Y2VwdGlvbikgY29uc3QgPSAwOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGRvbQorfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIENPQkFMVF9ET01fT05fRVJST1JfRVZFTlRfTElTVEVORVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL29uX2Vycm9yX2V2ZW50X2xpc3RlbmVyLmlkbCBiL3NyYy9jb2JhbHQvZG9tL29uX2Vycm9yX2V2ZW50X2xpc3RlbmVyLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzkzZjY4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vb25fZXJyb3JfZXZlbnRfbGlzdGVuZXIuaWRsCkBAIC0wLDAgKzEsMjcgQEAKKy8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIFRoaXMgaW50ZXJmYWNlIGV4aXN0cyB0byBzdXBwb3J0IHRoZSBzcGVjaWFsIGNhc2UgT25FcnJvckV2ZW50SGFuZGxlcjoKKy8vICAgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy8jb25lcnJvcmV2ZW50aGFuZGxlcgorCitjYWxsYmFjayBpbnRlcmZhY2UgT25FcnJvckV2ZW50TGlzdGVuZXIgeworICAvLyBUT0RPOiBCZWNhdXNlIHRoZSBFdmVudEhhbmRsZXIgdHlwZSBpcyB0eXBlZGVmJ2QgYXMgYSBudWxsYWJsZQorICAvLyBFdmVudExpc3RlbmVyLCB3ZSBuZWVkIHRvIGFsbG93IHRoZSByZXR1cm4gb2YgYSBib29sZWFuIHZhbHVlLiBUaGUgdmFsdWUKKyAgLy8gb2YgdGhpcyB3aWxsIG9ubHkgYmUgY2hlY2tlZCBpZiB0aGUgRXZlbnRMaXN0ZW5lciB3YXMgYWRkZWQgYXMgYW4KKyAgLy8gYXR0cmlidXRlIChub3QgdGhyb3VnaCBhZGRFdmVudExpc3RlbmVyKS4KKyAgYm9vbGVhbj8gaGFuZGxlRXZlbnQoCisgICAgICAoRXZlbnQgb3IgRE9NU3RyaW5nKSBldmVudCwgb3B0aW9uYWwgRE9NU3RyaW5nIGZpbGVuYW1lLAorICAgICAgb3B0aW9uYWwgdW5zaWduZWQgbG9uZyBsaW5lbm8sIG9wdGlvbmFsIHVuc2lnbmVkIGxvbmcgY29sbm8sCisgICAgICBvcHRpb25hbCBhbnkgZXJyb3IpOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL29uX3NjcmVlbl9rZXlib2FyZC5pZGwgYi9zcmMvY29iYWx0L2RvbS9vbl9zY3JlZW5fa2V5Ym9hcmQuaWRsCmluZGV4IDAzNmIwMTIuLmVkMzc2MWIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL29uX3NjcmVlbl9rZXlib2FyZC5pZGwKKysrIGIvc3JjL2NvYmFsdC9kb20vb25fc2NyZWVuX2tleWJvYXJkLmlkbApAQCAtMTUsNyArMTUsOSBAQAogLy8gQ3VzdG9tIEFQSSBmb3IgaGlkaW5nLCBzaG93aW5nLCBmb2N1c2luZywgYmx1cnJpbmcsIGFuZCByZWNlaXZpbmcgaW5wdXQKIC8vIGZyb20gYW4gb24gc2NyZWVuIGtleWJvYXJkLgogCi1pbnRlcmZhY2UgT25TY3JlZW5LZXlib2FyZCA6IEV2ZW50VGFyZ2V0IHsKK1sKKyAgQ29uZGl0aW9uYWw9Q09CQUxUX0VOQUJMRV9PTl9TQ1JFRU5fS0VZQk9BUkQKK10gaW50ZXJmYWNlIE9uU2NyZWVuS2V5Ym9hcmQgOiBFdmVudFRhcmdldCB7CiAgIFByb21pc2U8dm9pZD4gc2hvdygpOwogICBQcm9taXNlPHZvaWQ+IGhpZGUoKTsKICAgUHJvbWlzZTx2b2lkPiBmb2N1cygpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vb25fc2NyZWVuX2tleWJvYXJkX3Rlc3QuY2MgYi9zcmMvY29iYWx0L2RvbS9vbl9zY3JlZW5fa2V5Ym9hcmRfdGVzdC5jYwppbmRleCBjYmVjZTQ0Li41NjUwODZmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9vbl9zY3JlZW5fa2V5Ym9hcmRfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2RvbS9vbl9zY3JlZW5fa2V5Ym9hcmRfdGVzdC5jYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgImJhc2UvYmluZC5oIgogI2luY2x1ZGUgImJhc2UvY2FsbGJhY2suaCIKICNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCisjaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvcGxhdGZvcm1fdGhyZWFkLmgiCiAjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvdXRpbHMuaCIKICNpbmNsdWRlICJjb2JhbHQvY3NzX3BhcnNlci9wYXJzZXIuaCIKICNpbmNsdWRlICJjb2JhbHQvZG9tL2xvY2FsX3N0b3JhZ2VfZGF0YWJhc2UuaCIKQEAgLTI0LDYgKzI1LDcgQEAKICNpbmNsdWRlICJjb2JhbHQvZG9tL3dpbmRvdy5oIgogI2luY2x1ZGUgImNvYmFsdC9kb21fcGFyc2VyL3BhcnNlci5oIgogI2luY2x1ZGUgImNvYmFsdC9sb2FkZXIvZmV0Y2hlcl9mYWN0b3J5LmgiCisjaW5jbHVkZSAiY29iYWx0L2xvYWRlci9sb2FkZXJfZmFjdG9yeS5oIgogI2luY2x1ZGUgImNvYmFsdC9tZWRpYV9zZXNzaW9uL21lZGlhX3Nlc3Npb24uaCIKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvamF2YXNjcmlwdF9lbmdpbmUuaCIKQEAgLTE3Nyw2ICsxNzksOCBAQAogICAgICAgICBjc3NfcGFyc2VyXyhjc3NfcGFyc2VyOjpQYXJzZXI6OkNyZWF0ZSgpKSwKICAgICAgICAgZG9tX3BhcnNlcl8obmV3IGRvbV9wYXJzZXI6OlBhcnNlcihtb2NrX2Vycm9yX2NhbGxiYWNrXykpLAogICAgICAgICBmZXRjaGVyX2ZhY3RvcnlfKG5ldyBsb2FkZXI6OkZldGNoZXJGYWN0b3J5KE5VTEwpKSwKKyAgICAgICAgbG9hZGVyX2ZhY3RvcnlfKG5ldyBsb2FkZXI6OkxvYWRlckZhY3RvcnkoCisgICAgICAgICAgICBmZXRjaGVyX2ZhY3RvcnlfLmdldCgpLCBOVUxMLCBiYXNlOjprVGhyZWFkUHJpb3JpdHlfRGVmYXVsdCkpLAogICAgICAgICBsb2NhbF9zdG9yYWdlX2RhdGFiYXNlXyhOVUxMKSwKICAgICAgICAgdXJsXygiYWJvdXQ6YmxhbmsiKSwKICAgICAgICAgZW5naW5lXyhzY3JpcHQ6OkphdmFTY3JpcHRFbmdpbmU6OkNyZWF0ZUVuZ2luZSgpKSwKQEAgLTE4NCw4ICsxODgsOSBAQAogICAgICAgICBvbl9zY3JlZW5fa2V5Ym9hcmRfYnJpZGdlXyhuZXcgT25TY3JlZW5LZXlib2FyZE1vY2tCcmlkZ2UoKSksCiAgICAgICAgIHdpbmRvd18obmV3IFdpbmRvdygKICAgICAgICAgICAgIDE5MjAsIDEwODAsIDEuZiwgYmFzZTo6a0FwcGxpY2F0aW9uU3RhdGVTdGFydGVkLCBjc3NfcGFyc2VyXy5nZXQoKSwKLSAgICAgICAgICAgIGRvbV9wYXJzZXJfLmdldCgpLCBmZXRjaGVyX2ZhY3RvcnlfLmdldCgpLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAotICAgICAgICAgICAgTlVMTCwgTlVMTCwgJmxvY2FsX3N0b3JhZ2VfZGF0YWJhc2VfLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgZG9tX3BhcnNlcl8uZ2V0KCksIGZldGNoZXJfZmFjdG9yeV8uZ2V0KCksIGxvYWRlcl9mYWN0b3J5Xy5nZXQoKSwKKyAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsICZsb2NhbF9zdG9yYWdlX2RhdGFiYXNlXywgTlVMTCwKKyAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsCiAgICAgICAgICAgICBnbG9iYWxfZW52aXJvbm1lbnRfCiAgICAgICAgICAgICAgICAgLT5zY3JpcHRfdmFsdWVfZmFjdG9yeSgpIC8qIHNjcmlwdF92YWx1ZV9mYWN0b3J5ICovLAogICAgICAgICAgICAgTlVMTCwgTlVMTCwgdXJsXywgIiIsICJlbi1VUyIsICJlbiIsCkBAIC0yMDAsNyArMjA1LDggQEAKICAgICAgICAgICAgIG9uX3NjcmVlbl9rZXlib2FyZF9icmlkZ2VfLmdldCgpLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgZG9tOjpXaW5kb3c6Ok9uU3RhcnREaXNwYXRjaEV2ZW50Q2FsbGJhY2soKSwKICAgICAgICAgICAgIGRvbTo6V2luZG93OjpPblN0b3BEaXNwYXRjaEV2ZW50Q2FsbGJhY2soKSwKLSAgICAgICAgICAgIGRvbTo6U2NyZWVuc2hvdE1hbmFnZXI6OlByb3ZpZGVTY3JlZW5zaG90RnVuY3Rpb25DYWxsYmFjaygpKSkgeworICAgICAgICAgICAgZG9tOjpTY3JlZW5zaG90TWFuYWdlcjo6UHJvdmlkZVNjcmVlbnNob3RGdW5jdGlvbkNhbGxiYWNrKCksCisgICAgICAgICAgICBOVUxMKSkgewogICAgIGdsb2JhbF9lbnZpcm9ubWVudF8tPkNyZWF0ZUdsb2JhbE9iamVjdCh3aW5kb3dfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudF9zZXR0aW5nc18uZ2V0KCkpOwogICAgIG9uX3NjcmVlbl9rZXlib2FyZF9icmlkZ2VfLT53aW5kb3dfID0gd2luZG93XzsKQEAgLTI0MSw2ICsyNDcsNyBAQAogICBzY29wZWRfcHRyPGNzc19wYXJzZXI6OlBhcnNlcj4gY3NzX3BhcnNlcl87CiAgIHNjb3BlZF9wdHI8ZG9tX3BhcnNlcjo6UGFyc2VyPiBkb21fcGFyc2VyXzsKICAgc2NvcGVkX3B0cjxsb2FkZXI6OkZldGNoZXJGYWN0b3J5PiBmZXRjaGVyX2ZhY3RvcnlfOworICBzY29wZWRfcHRyPGxvYWRlcjo6TG9hZGVyRmFjdG9yeT4gbG9hZGVyX2ZhY3RvcnlfOwogICBkb206OkxvY2FsU3RvcmFnZURhdGFiYXNlIGxvY2FsX3N0b3JhZ2VfZGF0YWJhc2VfOwogICBHVVJMIHVybF87CiAKQEAgLTI2NiwzOSArMjczLDQwIEBACiAKIH0gIC8vIG5hbWVzcGFjZQogCisjaWYgU0JfSEFTKE9OX1NDUkVFTl9LRVlCT0FSRCkKIFRFU1RfRihPblNjcmVlbktleWJvYXJkVGVzdCwgT2JqZWN0RXhpc3RzKSB7CiAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKLSAgRVhQRUNUX1RSVUUoRXZhbHVhdGVTY3JpcHQoIndpbmRvdy5vblNjcmVlbktleWJvYXJkIiwgJnJlc3VsdCkpOworICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgid2luZG93Lm9uU2NyZWVuS2V5Ym9hcmQ7IiwgJnJlc3VsdCkpOwogCiAgIEVYUEVDVF9UUlVFKGJpbmRpbmdzOjp0ZXN0aW5nOjpJc0FjY2VwdGFibGVQcm90b3R5cGVTdHJpbmcoIk9uU2NyZWVuS2V5Ym9hcmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkpOwogCi0gIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ3aW5kb3cub25TY3JlZW5LZXlib2FyZC5zaG93IiwgJnJlc3VsdCkpOworICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgid2luZG93Lm9uU2NyZWVuS2V5Ym9hcmQuc2hvdzsiLCAmcmVzdWx0KSk7CiAgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjpJc1N1YnN0cmluZywgImZ1bmN0aW9uIHNob3coKSIsCiAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmNfc3RyKCkpOwotICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgid2luZG93Lm9uU2NyZWVuS2V5Ym9hcmQuaGlkZSIsICZyZXN1bHQpKTsKKyAgRVhQRUNUX1RSVUUoRXZhbHVhdGVTY3JpcHQoIndpbmRvdy5vblNjcmVlbktleWJvYXJkLmhpZGU7IiwgJnJlc3VsdCkpOwogICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6SXNTdWJzdHJpbmcsICJmdW5jdGlvbiBoaWRlKCkiLAogICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5jX3N0cigpKTsKLSAgRVhQRUNUX1RSVUUoRXZhbHVhdGVTY3JpcHQoIndpbmRvdy5vblNjcmVlbktleWJvYXJkLmZvY3VzIiwgJnJlc3VsdCkpOworICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgid2luZG93Lm9uU2NyZWVuS2V5Ym9hcmQuZm9jdXM7IiwgJnJlc3VsdCkpOwogICBFWFBFQ1RfUFJFRF9GT1JNQVQyKDo6dGVzdGluZzo6SXNTdWJzdHJpbmcsICJmdW5jdGlvbiBmb2N1cygpIiwKICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuY19zdHIoKSk7Ci0gIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ3aW5kb3cub25TY3JlZW5LZXlib2FyZC5ibHVyIiwgJnJlc3VsdCkpOworICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgid2luZG93Lm9uU2NyZWVuS2V5Ym9hcmQuYmx1cjsiLCAmcmVzdWx0KSk7CiAgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoOjp0ZXN0aW5nOjpJc1N1YnN0cmluZywgImZ1bmN0aW9uIGJsdXIoKSIsCiAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmNfc3RyKCkpOwogCi0gIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ3aW5kb3cub25TY3JlZW5LZXlib2FyZC5rZWVwRm9jdXMiLCAmcmVzdWx0KSk7CisgIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ3aW5kb3cub25TY3JlZW5LZXlib2FyZC5rZWVwRm9jdXM7IiwgJnJlc3VsdCkpOwogICBFWFBFQ1RfU1RSRVEoImZhbHNlIiwgcmVzdWx0LmNfc3RyKCkpOwogCi0gIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ3aW5kb3cub25TY3JlZW5LZXlib2FyZC5kYXRhIiwgJnJlc3VsdCkpOworICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgid2luZG93Lm9uU2NyZWVuS2V5Ym9hcmQuZGF0YTsiLCAmcmVzdWx0KSk7CiAgIEVYUEVDVF9TVFJFUSgiIiwgcmVzdWx0LmNfc3RyKCkpOwogCi0gIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ3aW5kb3cub25TY3JlZW5LZXlib2FyZC5vbnNob3ciLCAmcmVzdWx0KSk7CisgIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ3aW5kb3cub25TY3JlZW5LZXlib2FyZC5vbnNob3c7IiwgJnJlc3VsdCkpOwogICBFWFBFQ1RfU1RSRVEoIm51bGwiLCByZXN1bHQuY19zdHIoKSk7Ci0gIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ3aW5kb3cub25TY3JlZW5LZXlib2FyZC5vbmhpZGUiLCAmcmVzdWx0KSk7CisgIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ3aW5kb3cub25TY3JlZW5LZXlib2FyZC5vbmhpZGU7IiwgJnJlc3VsdCkpOwogICBFWFBFQ1RfU1RSRVEoIm51bGwiLCByZXN1bHQuY19zdHIoKSk7Ci0gIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ3aW5kb3cub25TY3JlZW5LZXlib2FyZC5vbmJsdXIiLCAmcmVzdWx0KSk7CisgIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ3aW5kb3cub25TY3JlZW5LZXlib2FyZC5vbmJsdXI7IiwgJnJlc3VsdCkpOwogICBFWFBFQ1RfU1RSRVEoIm51bGwiLCByZXN1bHQuY19zdHIoKSk7Ci0gIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ3aW5kb3cub25TY3JlZW5LZXlib2FyZC5vbmZvY3VzIiwgJnJlc3VsdCkpOworICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgid2luZG93Lm9uU2NyZWVuS2V5Ym9hcmQub25mb2N1czsiLCAmcmVzdWx0KSk7CiAgIEVYUEVDVF9TVFJFUSgibnVsbCIsIHJlc3VsdC5jX3N0cigpKTsKIH0KIApAQCAtNDM4LDcgKzQ0Niw3IEBACiAgICAgICBsb2dTdHJpbmcgPSAnc2hvdyc7CiAgICAgfTsKICAgICBwcm9taXNlID0gd2luZG93Lm9uU2NyZWVuS2V5Ym9hcmQuc2hvdygpOwotICAgIGxvZ1N0cmluZworICAgIGxvZ1N0cmluZzsKICAgKSI7CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgKytpKSB7CiAgICAgc3RkOjpzdHJpbmcgcmVzdWx0OwpAQCAtNDYzLDcgKzQ3MSw3IEBACiAgICAgICAgIGxvZ1N0cmluZzIgPSAnc2hvdzInOwogICAgICAgfSk7CiAgICAgbGV0IHByb21pc2UgPSB3aW5kb3cub25TY3JlZW5LZXlib2FyZC5zaG93KCk7Ci0gICAgbG9nU3RyaW5nMQorICAgIGxvZ1N0cmluZzE7CiAgICkiOwogICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdChzY3JpcHQsICZyZXN1bHQpKTsKICAgRVhQRUNUX0VRKCJzaG93MSIsIHJlc3VsdCk7CkBAIC00ODQsNyArNDkyLDcgQEAKICAgICAgIGxvZ1N0cmluZyA9ICdoaWRlJzsKICAgICB9OwogICAgIHByb21pc2UgPSB3aW5kb3cub25TY3JlZW5LZXlib2FyZC5oaWRlKCk7Ci0gICAgbG9nU3RyaW5nCisgICAgbG9nU3RyaW5nOwogICApIjsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyArK2kpIHsKICAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CkBAIC01MDgsNyArNTE2LDcgQEAKICAgICAgICAgbG9nU3RyaW5nMiA9ICdoaWRlMic7CiAgICAgICB9KTsKICAgICBsZXQgcHJvbWlzZSA9IHdpbmRvdy5vblNjcmVlbktleWJvYXJkLmhpZGUoKTsKLSAgICBsb2dTdHJpbmcxCisgICAgbG9nU3RyaW5nMTsKICAgKSI7CiAgIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KHNjcmlwdCwgJnJlc3VsdCkpOwogICBFWFBFQ1RfRVEoImhpZGUxIiwgcmVzdWx0KTsKQEAgLTUyOSw3ICs1MzcsNyBAQAogICAgICAgbG9nU3RyaW5nID0gJ2ZvY3VzJzsKICAgICB9OwogICAgIHByb21pc2UgPSB3aW5kb3cub25TY3JlZW5LZXlib2FyZC5mb2N1cygpOwotICAgIGxvZ1N0cmluZworICAgIGxvZ1N0cmluZzsKICAgKSI7CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgKytpKSB7CiAgICAgc3RkOjpzdHJpbmcgcmVzdWx0OwpAQCAtNTUzLDcgKzU2MSw3IEBACiAgICAgICAgIGxvZ1N0cmluZzIgPSAnZm9jdXMyJzsKICAgICAgIH0pOwogICAgIGxldCBwcm9taXNlID0gd2luZG93Lm9uU2NyZWVuS2V5Ym9hcmQuZm9jdXMoKTsKLSAgICBsb2dTdHJpbmcxCisgICAgbG9nU3RyaW5nMTsKICAgKSI7CiAgIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KHNjcmlwdCwgJnJlc3VsdCkpOwogICBFWFBFQ1RfRVEoImZvY3VzMSIsIHJlc3VsdCk7CkBAIC01NzQsNyArNTgyLDcgQEAKICAgICAgIGxvZ1N0cmluZyA9ICdibHVyJzsKICAgICB9OwogICAgIHByb21pc2UgPSB3aW5kb3cub25TY3JlZW5LZXlib2FyZC5ibHVyKCk7Ci0gICAgbG9nU3RyaW5nCisgICAgbG9nU3RyaW5nOwogICApIjsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyArK2kpIHsKICAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CkBAIC01OTgsNyArNjA2LDcgQEAKICAgICAgICAgbG9nU3RyaW5nMiA9ICdibHVyMic7CiAgICAgICB9KTsKICAgICBsZXQgcHJvbWlzZSA9IHdpbmRvdy5vblNjcmVlbktleWJvYXJkLmJsdXIoKTsKLSAgICBsb2dTdHJpbmcxCisgICAgbG9nU3RyaW5nMTsKICAgKSI7CiAgIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KHNjcmlwdCwgJnJlc3VsdCkpOwogICBFWFBFQ1RfRVEoImJsdXIxIiwgcmVzdWx0KTsKQEAgLTYzNCw2ICs2NDIsMzYgQEAKICAgKSI7CiAgIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KHNjcmlwdCwgTlVMTCkpOwogfQorI2Vsc2UgICAvLyBTQl9IQVMoT05fU0NSRUVOX0tFWUJPQVJEKQorVEVTVF9GKE9uU2NyZWVuS2V5Ym9hcmRUZXN0LCBPYmplY3REb2VzbnRFeGlzdCkgeworICBzdGQ6OnN0cmluZyByZXN1bHQ7CisKKyAgRVhQRUNUX1RSVUUoCisgICAgICBFdmFsdWF0ZVNjcmlwdCgid2luZG93Lmhhc093blByb3BlcnR5KCdvblNjcmVlbktleWJvYXJkJyk7IiwgJnJlc3VsdCkpOworICBFWFBFQ1RfRVEoImZhbHNlIiwgcmVzdWx0KTsKKyAgRVhQRUNUX1RSVUUoRXZhbHVhdGVTY3JpcHQoIndpbmRvdy5vblNjcmVlbktleWJvYXJkOyIsICZyZXN1bHQpKTsKKyAgRVhQRUNUX0ZBTFNFKGJpbmRpbmdzOjp0ZXN0aW5nOjpJc0FjY2VwdGFibGVQcm90b3R5cGVTdHJpbmcoCisgICAgICAiT25TY3JlZW5LZXlib2FyZCIsIHJlc3VsdCkpOworICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgidHlwZW9mIHdpbmRvdy5vblNjcmVlbktleWJvYXJkID09PSAndW5kZWZpbmVkJzsiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0KSk7CisgIEVYUEVDVF9FUSgidHJ1ZSIsIHJlc3VsdCk7CisKKyAgLy8gV2Ugc2hvdWxkIGJlIGFibGUgdG8gYXNzaWduIGFueXRoaW5nIHdlIGxpa2UgdG8gd2luZG93Lm9uU2NyZWVuS2V5Ym9hcmQuCisgIGNvbnN0IGNoYXIgbnVtYmVyX3NjcmlwdFtdID0gUiIoCisgICAgd2luZG93Lm9uU2NyZWVuS2V5Ym9hcmQgPSA0MjsKKyAgICB3aW5kb3cub25TY3JlZW5LZXlib2FyZDsKKyAgKSI7CisgIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KG51bWJlcl9zY3JpcHQsICZyZXN1bHQpKTsKKyAgRVhQRUNUX0VRKCI0MiIsIHJlc3VsdCk7CisKKyAgY29uc3QgY2hhciBvYmplY3Rfc2NyaXB0W10gPSBSIigKKyAgICB3aW5kb3cub25TY3JlZW5LZXlib2FyZCA9IHtmb286ICdiYXInfTsKKyAgICB3aW5kb3cub25TY3JlZW5LZXlib2FyZC5oYXNPd25Qcm9wZXJ0eSgnZm9vJyk7CisgICkiOworICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdChvYmplY3Rfc2NyaXB0LCAmcmVzdWx0KSk7CisgIEVYUEVDVF9FUSgidHJ1ZSIsIHJlc3VsdCk7Cit9CisjZW5kaWYgIC8vIFNCX0hBUyhPTl9TQ1JFRU5fS0VZQk9BUkQpCiAKIH0gIC8vIG5hbWVzcGFjZSBkb20KIH0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL3BvaW50ZXJfc3RhdGUuY2MgYi9zcmMvY29iYWx0L2RvbS9wb2ludGVyX3N0YXRlLmNjCmluZGV4IDZmNDFhNzEuLjgzYmE5MDggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL3BvaW50ZXJfc3RhdGUuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vcG9pbnRlcl9zdGF0ZS5jYwpAQCAtMTYsNiArMTYsNyBAQAogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogCisjaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgogI2luY2x1ZGUgImNvYmFsdC9kb20vbW91c2VfZXZlbnQuaCIKICNpbmNsdWRlICJjb2JhbHQvZG9tL3BvaW50ZXJfZXZlbnQuaCIKICNpbmNsdWRlICJjb2JhbHQvZG9tL3doZWVsX2V2ZW50LmgiCkBAIC0yNSwxMCArMjYsMTEgQEAKIG5hbWVzcGFjZSBkb20gewogCiB2b2lkIFBvaW50ZXJTdGF0ZTo6UXVldWVQb2ludGVyRXZlbnQoY29uc3Qgc2NvcGVkX3JlZnB0cjxFdmVudD4mIGV2ZW50KSB7CisgIFRSQUNFX0VWRU5UMSgiY29iYWx0Ojpkb20iLCAiUG9pbnRlclN0YXRlOjpRdWV1ZVBvaW50ZXJFdmVudCgpIiwgImV2ZW50IiwKKyAgICAgICAgICAgICAgIGV2ZW50LT50eXBlKCkuY19zdHIoKSk7CisKICAgLy8gT25seSBhY2NlcHQgdGhpcyBmb3IgZXZlbnQgdHlwZXMgdGhhdCBhcmUgTW91c2VFdmVudHMgb3Iga25vd24gZGVyaXZhdGl2ZXMuCi0gIFNCX0RDSEVDSyhldmVudC0+R2V0V3JhcHBhYmxlVHlwZSgpID09IGJhc2U6OkdldFR5cGVJZDxQb2ludGVyRXZlbnQ+KCkgfHwKLSAgICAgICAgICAgIGV2ZW50LT5HZXRXcmFwcGFibGVUeXBlKCkgPT0gYmFzZTo6R2V0VHlwZUlkPE1vdXNlRXZlbnQ+KCkgfHwKLSAgICAgICAgICAgIGV2ZW50LT5HZXRXcmFwcGFibGVUeXBlKCkgPT0gYmFzZTo6R2V0VHlwZUlkPFdoZWVsRXZlbnQ+KCkpOworICBTQl9EQ0hFQ0soQ2FuUXVldWVFdmVudChldmVudCkpOwogCiAgIC8vIFF1ZXVlIHRoZSBldmVudCB0byBiZSBoYW5kbGVkIG9uIHRoZSBuZXh0IGxheW91dC4KICAgcG9pbnRlcl9ldmVudHNfLnB1c2goZXZlbnQpOwpAQCAtMjU5LDUgKzI2MSwxMiBAQAogICBwb2ludGVyc193aXRoX2FjdGl2ZV9idXR0b25zXy5jbGVhcigpOwogfQogCisvLyBzdGF0aWMKK2Jvb2wgUG9pbnRlclN0YXRlOjpDYW5RdWV1ZUV2ZW50KGNvbnN0IHNjb3BlZF9yZWZwdHI8RXZlbnQ+JiBldmVudCkgeworICByZXR1cm4gZXZlbnQtPkdldFdyYXBwYWJsZVR5cGUoKSA9PSBiYXNlOjpHZXRUeXBlSWQ8UG9pbnRlckV2ZW50PigpIHx8CisgICAgICAgICBldmVudC0+R2V0V3JhcHBhYmxlVHlwZSgpID09IGJhc2U6OkdldFR5cGVJZDxNb3VzZUV2ZW50PigpIHx8CisgICAgICAgICBldmVudC0+R2V0V3JhcHBhYmxlVHlwZSgpID09IGJhc2U6OkdldFR5cGVJZDxXaGVlbEV2ZW50PigpOworfQorCiB9ICAvLyBuYW1lc3BhY2UgZG9tCiB9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9wb2ludGVyX3N0YXRlLmggYi9zcmMvY29iYWx0L2RvbS9wb2ludGVyX3N0YXRlLmgKaW5kZXggMGY3M2EyOS4uZDFjN2Q5YyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vcG9pbnRlcl9zdGF0ZS5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL3BvaW50ZXJfc3RhdGUuaApAQCAtNzcsNiArNzcsOCBAQAogICAvLyBzaHV0ZG93bi4KICAgdm9pZCBDbGVhckZvclNodXRkb3duKCk7CiAKKyAgc3RhdGljIGJvb2wgQ2FuUXVldWVFdmVudChjb25zdCBzY29wZWRfcmVmcHRyPEV2ZW50PiYgZXZlbnQpOworCiAgcHJpdmF0ZToKICAgLy8gU3RvcmVzIHBvaW50ZXIgZXZlbnRzIHVudGlsIHRoZXkgYXJlIGhhbmRsZWQgYWZ0ZXIgYSBsYXlvdXQuCiAgIHN0ZDo6cXVldWU8c2NvcGVkX3JlZnB0cjxFdmVudD4gPiBwb2ludGVyX2V2ZW50c187CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9wc2V1ZG9fZWxlbWVudC5jYyBiL3NyYy9jb2JhbHQvZG9tL3BzZXVkb19lbGVtZW50LmNjCmluZGV4IGNiNTQ5MTYuLmZmYmJlNTggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL3BzZXVkb19lbGVtZW50LmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL3BzZXVkb19lbGVtZW50LmNjCkBAIC0yMiw4ICsyMiw4IEBACiBQc2V1ZG9FbGVtZW50OjpQc2V1ZG9FbGVtZW50KEhUTUxFbGVtZW50KiBwYXJlbnRfZWxlbWVudCkKICAgICA6IHBhcmVudF9lbGVtZW50XyhwYXJlbnRfZWxlbWVudCksCiAgICAgICBhbmltYXRpb25zXyhuZXcgd2ViX2FuaW1hdGlvbnM6OkFuaW1hdGlvblNldCgpKSwKLSAgICAgIGNzc19jb21wdXRlZF9zdHlsZV9kZWNsYXJhdGlvbl8oCi0gICAgICAgICAgbmV3IGNzc29tOjpDU1NDb21wdXRlZFN0eWxlRGVjbGFyYXRpb24oKSkgeworICAgICAgY3NzX2NvbXB1dGVkX3N0eWxlX2RlY2xhcmF0aW9uXyhuZXcgY3Nzb206OkNTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbigpKSwKKyAgICAgIGNvbXB1dGVkX3N0eWxlX2ludmFsaWRfKHRydWUpIHsKICAgRENIRUNLKHBhcmVudF9lbGVtZW50Xyk7CiAgIGNzc19jb21wdXRlZF9zdHlsZV9kZWNsYXJhdGlvbl8tPnNldF9hbmltYXRpb25zKGFuaW1hdGlvbnNfKTsKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vcHNldWRvX2VsZW1lbnQuaCBiL3NyYy9jb2JhbHQvZG9tL3BzZXVkb19lbGVtZW50LmgKaW5kZXggOTEyM2Y3NS4uY2ViZTA3ZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vcHNldWRvX2VsZW1lbnQuaAorKysgYi9zcmMvY29iYWx0L2RvbS9wc2V1ZG9fZWxlbWVudC5oCkBAIC02MCw2ICs2MCwxMSBAQAogICBjc3NvbTo6UnVsZXNXaXRoQ2FzY2FkZVByZWNlZGVuY2UqIG1hdGNoaW5nX3J1bGVzKCkgewogICAgIHJldHVybiAmbWF0Y2hpbmdfcnVsZXNfOwogICB9CisgIHZvaWQgQ2xlYXJNYXRjaGluZ1J1bGVzKCkgeyBtYXRjaGluZ19ydWxlc18uY2xlYXIoKTsgfQorCisgIGJvb2wgY29tcHV0ZWRfc3R5bGVfaW52YWxpZCgpIGNvbnN0IHsgcmV0dXJuIGNvbXB1dGVkX3N0eWxlX2ludmFsaWRfOyB9CisgIHZvaWQgc2V0X2NvbXB1dGVkX3N0eWxlX2ludmFsaWQoKSB7IGNvbXB1dGVkX3N0eWxlX2ludmFsaWRfID0gdHJ1ZTsgfQorICB2b2lkIGNsZWFyX2NvbXB1dGVkX3N0eWxlX2ludmFsaWQoKSB7IGNvbXB1dGVkX3N0eWxlX2ludmFsaWRfID0gZmFsc2U7IH0KIAogICBjc3NvbTo6VHJhbnNpdGlvblNldCogY3NzX3RyYW5zaXRpb25zKCkgeyByZXR1cm4gJmNzc190cmFuc2l0aW9uc18udmFsdWUoKTsgfQogICBjc3NvbTo6QW5pbWF0aW9uU2V0KiBjc3NfYW5pbWF0aW9ucygpIHsgcmV0dXJuICZjc3NfYW5pbWF0aW9uc18udmFsdWUoKTsgfQpAQCAtNjksNyArNzQsNiBAQAogICB9CiAKICAgSFRNTEVsZW1lbnQqIHBhcmVudF9lbGVtZW50KCkgeyByZXR1cm4gcGFyZW50X2VsZW1lbnRfOyB9Ci0gIHZvaWQgQ2xlYXJNYXRjaGluZ1J1bGVzKCkgeyBtYXRjaGluZ19ydWxlc18uY2xlYXIoKTsgfQogCiAgIHZvaWQgc2V0X2xheW91dF9ib3hlcyhzY29wZWRfcHRyPExheW91dEJveGVzPiBsYXlvdXRfYm94ZXMpIHsKICAgICBsYXlvdXRfYm94ZXNfID0gbGF5b3V0X2JveGVzLlBhc3MoKTsKQEAgLTkxLDYgKzk1LDcgQEAKICAgYmFzZTo6b3B0aW9uYWw8Y3Nzb206OkFuaW1hdGlvblNldD4gY3NzX2FuaW1hdGlvbnNfOwogCiAgIGNzc29tOjpSdWxlc1dpdGhDYXNjYWRlUHJlY2VkZW5jZSBtYXRjaGluZ19ydWxlc187CisgIGJvb2wgY29tcHV0ZWRfc3R5bGVfaW52YWxpZF87CiAKICAgLy8gVGhpcyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYm94ZXMgZ2VuZXJhdGVkIGZyb20gdGhlIGVsZW1lbnQuCiAgIHNjb3BlZF9wdHI8TGF5b3V0Qm94ZXM+IGxheW91dF9ib3hlc187CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9ydWxlX21hdGNoaW5nLmNjIGIvc3JjL2NvYmFsdC9kb20vcnVsZV9tYXRjaGluZy5jYwppbmRleCBmNzY0NzE4Li40MWNhNzFlIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9ydWxlX21hdGNoaW5nLmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL3J1bGVfbWF0Y2hpbmcuY2MKQEAgLTY0LDcgKzY0LDE1IEBACiBuYW1lc3BhY2UgewogCiB1c2luZyBjc3NvbTo6U2VsZWN0b3JUcmVlOwotY29uc3Qgc2l6ZV90IGtSdWxlTWF0Y2hpbmdOb2RlU2V0U2l6ZSA9IDYwOworCitzdHJ1Y3QgTm9kZUNvbWJpbmF0b3JUeXBlIHsKKyAgTm9kZUNvbWJpbmF0b3JUeXBlKGNvbnN0IFNlbGVjdG9yVHJlZTo6Tm9kZSogbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgIGNzc29tOjpDb21iaW5hdG9yVHlwZSBjb21iaW5hdG9yX3R5cGUpCisgICAgICA6IG5vZGUobm9kZSksIGNvbWJpbmF0b3JfdHlwZShjb21iaW5hdG9yX3R5cGUpIHt9CisKKyAgY29uc3QgU2VsZWN0b3JUcmVlOjpOb2RlKiBub2RlOworICBjc3NvbTo6Q29tYmluYXRvclR5cGUgY29tYmluYXRvcl90eXBlOworfTsKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vIEhlbHBlciBmdW5jdGlvbnMKQEAgLTM0NSwyMjYgKzM1Myw2IEBACiAgIHJldHVybiBzZWxlY3Rvcl9tYXRjaGVyLmVsZW1lbnQoKTsKIH0KIAotdm9pZCBBZGRSdWxlc09uTm9kZVRvRWxlbWVudChIVE1MRWxlbWVudCogZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2VsZWN0b3JUcmVlOjpOb2RlKiBub2RlKSB7Ci0gIGNzc29tOjpQc2V1ZG9FbGVtZW50KiBwc2V1ZG9fZWxlbWVudCA9Ci0gICAgICBub2RlLT5jb21wb3VuZF9zZWxlY3RvcigpLT5wc2V1ZG9fZWxlbWVudCgpOwotCi0gIC8vIFdoZXJlIHRvIGFkZCBtYXRjaGluZyBydWxlcy4KLSAgY3Nzb206OlJ1bGVzV2l0aENhc2NhZGVQcmVjZWRlbmNlKiB0YXJnZXRfbWF0Y2hpbmdfcnVsZXM7Ci0KLSAgaWYgKCFwc2V1ZG9fZWxlbWVudCkgewotICAgIHRhcmdldF9tYXRjaGluZ19ydWxlcyA9IGVsZW1lbnQtPm1hdGNoaW5nX3J1bGVzKCk7Ci0gIH0gZWxzZSB7Ci0gICAgUHNldWRvRWxlbWVudFR5cGUgcHNldWRvX2VsZW1lbnRfdHlwZSA9IGtOb3RQc2V1ZG9FbGVtZW50VHlwZTsKLQotICAgIGlmIChwc2V1ZG9fZWxlbWVudC0+QXNBZnRlclBzZXVkb0VsZW1lbnQoKSkgewotICAgICAgcHNldWRvX2VsZW1lbnRfdHlwZSA9IGtBZnRlclBzZXVkb0VsZW1lbnRUeXBlOwotICAgIH0gZWxzZSBpZiAocHNldWRvX2VsZW1lbnQtPkFzQmVmb3JlUHNldWRvRWxlbWVudCgpKSB7Ci0gICAgICBwc2V1ZG9fZWxlbWVudF90eXBlID0ga0JlZm9yZVBzZXVkb0VsZW1lbnRUeXBlOwotICAgIH0gZWxzZSB7Ci0gICAgICBOT1RSRUFDSEVEKCk7Ci0gICAgfQotCi0gICAgLy8gTWFrZSBzdXJlIHRoZSBwc2V1ZG8gZWxlbWVudCBleGlzdHMgdW5kZXIgZWxlbWVudC4KLSAgICBpZiAoIWVsZW1lbnQtPnBzZXVkb19lbGVtZW50KHBzZXVkb19lbGVtZW50X3R5cGUpKSB7Ci0gICAgICBlbGVtZW50LT5zZXRfcHNldWRvX2VsZW1lbnQoCi0gICAgICAgICAgcHNldWRvX2VsZW1lbnRfdHlwZSwKLSAgICAgICAgICBtYWtlX3Njb3BlZF9wdHIobmV3IGRvbTo6UHNldWRvRWxlbWVudChlbGVtZW50KSkpOwotICAgIH0KLQotICAgIHRhcmdldF9tYXRjaGluZ19ydWxlcyA9Ci0gICAgICAgIGVsZW1lbnQtPnBzZXVkb19lbGVtZW50KHBzZXVkb19lbGVtZW50X3R5cGUpLT5tYXRjaGluZ19ydWxlcygpOwotICB9Ci0KLSAgZWxlbWVudC0+cnVsZV9tYXRjaGluZ19zdGF0ZSgpLT5tYXRjaGluZ19ub2Rlcy5pbnNlcnQobm9kZSk7Ci0KLSAgZm9yIChTZWxlY3RvclRyZWU6OlJ1bGVzOjpjb25zdF9pdGVyYXRvciBydWxlX2l0ZXJhdG9yID0KLSAgICAgICAgICAgbm9kZS0+cnVsZXMoKS5iZWdpbigpOwotICAgICAgIHJ1bGVfaXRlcmF0b3IgIT0gbm9kZS0+cnVsZXMoKS5lbmQoKTsgKytydWxlX2l0ZXJhdG9yKSB7Ci0gICAgY3Nzb206OkNTU1N0eWxlUnVsZSogcnVsZSA9ICpydWxlX2l0ZXJhdG9yOwotICAgIGlmICghcnVsZSkgewotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIERDSEVDSyhydWxlLT5wYXJlbnRfc3R5bGVfc2hlZXQoKSk7Ci0gICAgY3Nzb206OkNhc2NhZGVQcmVjZWRlbmNlIHByZWNlZGVuY2UoCi0gICAgICAgIHBzZXVkb19lbGVtZW50ID8gY3Nzb206OmtOb3JtYWxPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICAgICA6IHJ1bGUtPnBhcmVudF9zdHlsZV9zaGVldCgpLT5vcmlnaW4oKSwKLSAgICAgICAgbm9kZS0+Y3VtdWxhdGl2ZV9zcGVjaWZpY2l0eSgpLAotICAgICAgICBjc3NvbTo6QXBwZWFyYW5jZShydWxlLT5wYXJlbnRfc3R5bGVfc2hlZXQoKS0+aW5kZXgoKSwgcnVsZS0+aW5kZXgoKSkpOwotICAgIHRhcmdldF9tYXRjaGluZ19ydWxlcy0+cHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKHJ1bGUsIHByZWNlZGVuY2UpKTsKLSAgfQotfQotCi12b2lkIEdhdGhlckNhbmRpZGF0ZU5vZGVzRnJvbU1hcCgKLSAgICBjc3NvbTo6U2ltcGxlU2VsZWN0b3JUeXBlIHNpbXBsZV9zZWxlY3Rvcl90eXBlLAotICAgIGNzc29tOjpDb21iaW5hdG9yVHlwZSBjb21iaW5hdG9yX3R5cGUsCi0gICAgY29uc3QgU2VsZWN0b3JUcmVlOjpTZWxlY3RvclRleHRUb05vZGVzTWFwKiBtYXAsIGJhc2U6OlRva2VuIGtleSwKLSAgICBTZWxlY3RvclRyZWU6Ok5vZGVTZXQ8a1J1bGVNYXRjaGluZ05vZGVTZXRTaXplPiogY2FuZGlkYXRlX25vZGVzKSB7Ci0gIFNlbGVjdG9yVHJlZTo6U2VsZWN0b3JUZXh0VG9Ob2Rlc01hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtYXAtPmZpbmQoa2V5KTsKLSAgaWYgKGl0ICE9IG1hcC0+ZW5kKCkpIHsKLSAgICBjb25zdCBTZWxlY3RvclRyZWU6OlNpbXBsZVNlbGVjdG9yTm9kZXMmIG5vZGVzID0gaXQtPnNlY29uZDsKLSAgICBmb3IgKFNlbGVjdG9yVHJlZTo6U2ltcGxlU2VsZWN0b3JOb2Rlczo6Y29uc3RfaXRlcmF0b3Igbm9kZXNfaXRlcmF0b3IgPQotICAgICAgICAgICAgIG5vZGVzLmJlZ2luKCk7Ci0gICAgICAgICBub2Rlc19pdGVyYXRvciAhPSBub2Rlcy5lbmQoKTsgKytub2Rlc19pdGVyYXRvcikgewotICAgICAgaWYgKG5vZGVzX2l0ZXJhdG9yLT5zaW1wbGVfc2VsZWN0b3JfdHlwZSA9PSBzaW1wbGVfc2VsZWN0b3JfdHlwZSAmJgotICAgICAgICAgIG5vZGVzX2l0ZXJhdG9yLT5jb21iaW5hdG9yX3R5cGUgPT0gY29tYmluYXRvcl90eXBlKSB7Ci0gICAgICAgIGNhbmRpZGF0ZV9ub2Rlcy0+aW5zZXJ0KG5vZGVzX2l0ZXJhdG9yLT5ub2RlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBHYXRoZXJDYW5kaWRhdGVOb2Rlc0Zyb21TZXQoCi0gICAgY3Nzb206OlBzZXVkb0NsYXNzVHlwZSBwc2V1ZG9fY2xhc3NfdHlwZSwKLSAgICBjc3NvbTo6Q29tYmluYXRvclR5cGUgY29tYmluYXRvcl90eXBlLAotICAgIGNvbnN0IFNlbGVjdG9yVHJlZTo6UHNldWRvQ2xhc3NOb2RlcyYgcHNldWRvX2NsYXNzX25vZGVzLAotICAgIFNlbGVjdG9yVHJlZTo6Tm9kZVNldDxrUnVsZU1hdGNoaW5nTm9kZVNldFNpemU+KiBjYW5kaWRhdGVfbm9kZXMpIHsKLSAgZm9yIChTZWxlY3RvclRyZWU6OlBzZXVkb0NsYXNzTm9kZXM6OmNvbnN0X2l0ZXJhdG9yIG5vZGVzX2l0ZXJhdG9yID0KLSAgICAgICAgICAgcHNldWRvX2NsYXNzX25vZGVzLmJlZ2luKCk7Ci0gICAgICAgbm9kZXNfaXRlcmF0b3IgIT0gcHNldWRvX2NsYXNzX25vZGVzLmVuZCgpOyArK25vZGVzX2l0ZXJhdG9yKSB7Ci0gICAgaWYgKG5vZGVzX2l0ZXJhdG9yLT5wc2V1ZG9fY2xhc3NfdHlwZSA9PSBwc2V1ZG9fY2xhc3NfdHlwZSAmJgotICAgICAgICBub2Rlc19pdGVyYXRvci0+Y29tYmluYXRvcl90eXBlID09IGNvbWJpbmF0b3JfdHlwZSkgewotICAgICAgY2FuZGlkYXRlX25vZGVzLT5pbnNlcnQobm9kZXNfaXRlcmF0b3ItPm5vZGUpOwotICAgIH0KLSAgfQotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgTm9kZVNldD4KLXZvaWQgRm9yRWFjaENoaWxkT25Ob2RlcygKLSAgICBjb25zdCBOb2RlU2V0JiBub2RlX3NldCwgY3Nzb206OkNvbWJpbmF0b3JUeXBlIGNvbWJpbmF0b3JfdHlwZSwKLSAgICBIVE1MRWxlbWVudCogZWxlbWVudCwKLSAgICBjb25zdCBiYXNlOjpDYWxsYmFjazx2b2lkKEhUTUxFbGVtZW50KiBlbGVtZW50LCBjb25zdCBTZWxlY3RvclRyZWU6Ok5vZGUqKT4mCi0gICAgICAgIGNhbGxiYWNrKSB7Ci0gIC8vIEdhdGhlcmluZyBQaGFzZTogR2VuZXJhdGUgY2FuZGlkYXRlIG5vZGVzIGZyb20gdGhlIG5vZGUgc2V0LgotICBTZWxlY3RvclRyZWU6Ok5vZGVTZXQ8a1J1bGVNYXRjaGluZ05vZGVTZXRTaXplPiBjYW5kaWRhdGVfbm9kZXM7Ci0KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8YmFzZTo6VG9rZW4+JiBlbGVtZW50X2NsYXNzX2xpc3QgPQotICAgICAgZWxlbWVudC0+Y2xhc3NfbGlzdCgpLT5HZXRUb2tlbnMoKTsKLQotICAvLyBEb24ndCByZXRyaWV2ZSB0aGUgZWxlbWVudCdzIGF0dHJpYnV0ZXMgdW50aWwgdGhleSBhcmUgbmVlZGVkLiBSZXRyaWV2aW5nCi0gIC8vIHRoZW0gdHlwaWNhbGx5IHJlcXVpcmVzIHRoZSBjcmVhdGlvbiBvZiBhIE5hbWVkTm9kZU1hcC4KLSAgc2NvcGVkX3JlZnB0cjxOYW1lZE5vZGVNYXA+IGVsZW1lbnRfYXR0cmlidXRlczsKLQotICAvLyBJdGVyYXRlIHRocm91Z2ggYWxsIG5vZGVzIGluIG5vZGVfc2V0LgotICBmb3IgKHR5cGVuYW1lIE5vZGVTZXQ6OmNvbnN0X2l0ZXJhdG9yIG5vZGVfaXRlcmF0b3IgPSBub2RlX3NldC5iZWdpbigpOwotICAgICAgIG5vZGVfaXRlcmF0b3IgIT0gbm9kZV9zZXQuZW5kKCk7ICsrbm9kZV9pdGVyYXRvcikgewotICAgIGNvbnN0IFNlbGVjdG9yVHJlZTo6Tm9kZSogbm9kZSA9ICpub2RlX2l0ZXJhdG9yOwotCi0gICAgaWYgKCFub2RlLT5IYXNDb21iaW5hdG9yKGNvbWJpbmF0b3JfdHlwZSkpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIC8vIEdhdGhlciBjYW5kaWRhdGUgc2V0cyBpbiBub2RlJ3MgY2hpbGRyZW4gdW5kZXIgdGhlIGdpdmVuIGNvbWJpbmF0b3IuCi0KLSAgICBjb25zdCBTZWxlY3RvclRyZWU6OlNlbGVjdG9yVGV4dFRvTm9kZXNNYXAqIHNlbGVjdG9yX25vZGVzX21hcCA9Ci0gICAgICAgIG5vZGUtPnNlbGVjdG9yX25vZGVzX21hcCgpOwotICAgIGlmIChzZWxlY3Rvcl9ub2Rlc19tYXApIHsKLSAgICAgIC8vIFVuaXZlcnNhbCBzZWxlY3Rvci4KLSAgICAgIGlmIChub2RlLT5IYXNTaW1wbGVTZWxlY3Rvcihjc3NvbTo6a1VuaXZlcnNhbFNlbGVjdG9yLCBjb21iaW5hdG9yX3R5cGUpKSB7Ci0gICAgICAgIEdhdGhlckNhbmRpZGF0ZU5vZGVzRnJvbU1hcChjc3NvbTo6a1VuaXZlcnNhbFNlbGVjdG9yLCBjb21iaW5hdG9yX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rvcl9ub2Rlc19tYXAsIGJhc2U6OlRva2VuKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2FuZGlkYXRlX25vZGVzKTsKLSAgICAgIH0KLQotICAgICAgLy8gVHlwZSBzZWxlY3Rvci4KLSAgICAgIGlmIChub2RlLT5IYXNTaW1wbGVTZWxlY3Rvcihjc3NvbTo6a1R5cGVTZWxlY3RvciwgY29tYmluYXRvcl90eXBlKSkgewotICAgICAgICBHYXRoZXJDYW5kaWRhdGVOb2Rlc0Zyb21NYXAoY3Nzb206OmtUeXBlU2VsZWN0b3IsIGNvbWJpbmF0b3JfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yX25vZGVzX21hcCwgZWxlbWVudC0+bG9jYWxfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhbmRpZGF0ZV9ub2Rlcyk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEF0dHJpYnV0ZSBzZWxlY3Rvci4KLSAgICAgIGlmIChub2RlLT5IYXNTaW1wbGVTZWxlY3Rvcihjc3NvbTo6a0F0dHJpYnV0ZVNlbGVjdG9yLCBjb21iaW5hdG9yX3R5cGUpKSB7Ci0gICAgICAgIC8vIElmIHRoZSBlbGVtZW50J3MgYXR0cmlidXRlcyBoYXZlIG5vdCBiZWVuIHJldHJpZXZlZCB5ZXQsIHRoZW4KLSAgICAgICAgLy8gcmV0cmlldmUgdGhlbSBub3cuCi0gICAgICAgIGlmICghZWxlbWVudF9hdHRyaWJ1dGVzKSB7Ci0gICAgICAgICAgZWxlbWVudF9hdHRyaWJ1dGVzID0gZWxlbWVudC0+YXR0cmlidXRlcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGVsZW1lbnRfYXR0cmlidXRlcy0+bGVuZ3RoKCk7Ci0gICAgICAgICAgICAgKytpbmRleCkgewotICAgICAgICAgIEdhdGhlckNhbmRpZGF0ZU5vZGVzRnJvbU1hcCgKLSAgICAgICAgICAgICAgY3Nzb206OmtBdHRyaWJ1dGVTZWxlY3RvciwgY29tYmluYXRvcl90eXBlLCBzZWxlY3Rvcl9ub2Rlc19tYXAsCi0gICAgICAgICAgICAgIGJhc2U6OlRva2VuKGVsZW1lbnRfYXR0cmlidXRlcy0+SXRlbShpbmRleCktPm5hbWUoKSksCi0gICAgICAgICAgICAgICZjYW5kaWRhdGVfbm9kZXMpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIENsYXNzIHNlbGVjdG9yLgotICAgICAgaWYgKG5vZGUtPkhhc1NpbXBsZVNlbGVjdG9yKGNzc29tOjprQ2xhc3NTZWxlY3RvciwgY29tYmluYXRvcl90eXBlKSkgewotICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgZWxlbWVudF9jbGFzc19saXN0LnNpemUoKTsgKytpbmRleCkgewotICAgICAgICAgIEdhdGhlckNhbmRpZGF0ZU5vZGVzRnJvbU1hcCgKLSAgICAgICAgICAgICAgY3Nzb206OmtDbGFzc1NlbGVjdG9yLCBjb21iaW5hdG9yX3R5cGUsIHNlbGVjdG9yX25vZGVzX21hcCwKLSAgICAgICAgICAgICAgZWxlbWVudF9jbGFzc19saXN0W2luZGV4XSwgJmNhbmRpZGF0ZV9ub2Rlcyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gSWQgc2VsZWN0b3IuCi0gICAgICBpZiAobm9kZS0+SGFzU2ltcGxlU2VsZWN0b3IoY3Nzb206OmtJZFNlbGVjdG9yLCBjb21iaW5hdG9yX3R5cGUpKSB7Ci0gICAgICAgIEdhdGhlckNhbmRpZGF0ZU5vZGVzRnJvbU1hcChjc3NvbTo6a0lkU2VsZWN0b3IsIGNvbWJpbmF0b3JfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yX25vZGVzX21hcCwgZWxlbWVudC0+aWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYW5kaWRhdGVfbm9kZXMpOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChub2RlLT5IYXNBbnlQc2V1ZG9DbGFzcygpKSB7Ci0gICAgICAvLyBFbXB0eSBwc2V1ZG8gY2xhc3MuCi0gICAgICBpZiAobm9kZS0+SGFzUHNldWRvQ2xhc3MoY3Nzb206OmtFbXB0eVBzZXVkb0NsYXNzLCBjb21iaW5hdG9yX3R5cGUpICYmCi0gICAgICAgICAgZWxlbWVudC0+SXNFbXB0eSgpKSB7Ci0gICAgICAgIEdhdGhlckNhbmRpZGF0ZU5vZGVzRnJvbVNldChjc3NvbTo6a0VtcHR5UHNldWRvQ2xhc3MsIGNvbWJpbmF0b3JfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUtPnBzZXVkb19jbGFzc19ub2RlcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhbmRpZGF0ZV9ub2Rlcyk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEZvY3VzIHBzZXVkbyBjbGFzcy4KLSAgICAgIGlmIChub2RlLT5IYXNQc2V1ZG9DbGFzcyhjc3NvbTo6a0ZvY3VzUHNldWRvQ2xhc3MsIGNvbWJpbmF0b3JfdHlwZSkgJiYKLSAgICAgICAgICBlbGVtZW50LT5IYXNGb2N1cygpKSB7Ci0gICAgICAgIEdhdGhlckNhbmRpZGF0ZU5vZGVzRnJvbVNldChjc3NvbTo6a0ZvY3VzUHNldWRvQ2xhc3MsIGNvbWJpbmF0b3JfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUtPnBzZXVkb19jbGFzc19ub2RlcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhbmRpZGF0ZV9ub2Rlcyk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEhvdmVyIHBzZXVkbyBjbGFzcy4KLSAgICAgIGlmIChub2RlLT5IYXNQc2V1ZG9DbGFzcyhjc3NvbTo6a0hvdmVyUHNldWRvQ2xhc3MsIGNvbWJpbmF0b3JfdHlwZSkgJiYKLSAgICAgICAgICBlbGVtZW50LT5Jc0Rlc2lnbmF0ZWQoKSkgewotICAgICAgICBHYXRoZXJDYW5kaWRhdGVOb2Rlc0Zyb21TZXQoY3Nzb206OmtIb3ZlclBzZXVkb0NsYXNzLCBjb21iaW5hdG9yX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLT5wc2V1ZG9fY2xhc3Nfbm9kZXMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYW5kaWRhdGVfbm9kZXMpOwotICAgICAgfQotCi0gICAgICAvLyBOb3QgcHNldWRvIGNsYXNzLgotICAgICAgaWYgKG5vZGUtPkhhc1BzZXVkb0NsYXNzKGNzc29tOjprTm90UHNldWRvQ2xhc3MsIGNvbWJpbmF0b3JfdHlwZSkpIHsKLSAgICAgICAgR2F0aGVyQ2FuZGlkYXRlTm9kZXNGcm9tU2V0KGNzc29tOjprTm90UHNldWRvQ2xhc3MsIGNvbWJpbmF0b3JfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUtPnBzZXVkb19jbGFzc19ub2RlcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhbmRpZGF0ZV9ub2Rlcyk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLy8gVmVyaWZ5aW5nIFBoYXNlOiBDaGVjayBhbGwgY2FuZGlkYXRlIG5vZGVzIGFuZCBydW4gY2FsbGJhY2sgZm9yIG1hdGNoaW5nCi0gIC8vIG5vZGVzLgotICBmb3IgKFNlbGVjdG9yVHJlZTo6Tm9kZVNldDxrUnVsZU1hdGNoaW5nTm9kZVNldFNpemU+Ojpjb25zdF9pdGVyYXRvcgotICAgICAgICAgICBjYW5kaWRhdGVfbm9kZV9pdGVyYXRvciA9IGNhbmRpZGF0ZV9ub2Rlcy5iZWdpbigpOwotICAgICAgIGNhbmRpZGF0ZV9ub2RlX2l0ZXJhdG9yICE9IGNhbmRpZGF0ZV9ub2Rlcy5lbmQoKTsKLSAgICAgICArK2NhbmRpZGF0ZV9ub2RlX2l0ZXJhdG9yKSB7Ci0gICAgY29uc3QgU2VsZWN0b3JUcmVlOjpOb2RlKiBjYW5kaWRhdGVfbm9kZSA9ICpjYW5kaWRhdGVfbm9kZV9pdGVyYXRvcjsKLQotICAgIC8vIFZlcmlmeSB0aGF0IHRoaXMgbm9kZSBpcyBhIG1hdGNoOgotICAgIC8vIDEuIElmIHRoZSBjYW5kaWRhdGUgbm9kZSdzIGNvbXBvdW5kIHNlbGVjdG9yIGRvZXNuJ3QgcmVxdWlyZSBhIHZpc2l0IHRvCi0gICAgLy8gICAgdmVyaWZ5IHRoZSBtYXRjaCwgdGhlbiB0aGUgYWN0IG9mIGdhdGhlcmluZyB0aGUgbm9kZSBhcyBhIGNhbmRpZGF0ZQotICAgIC8vICAgIHByb3ZlZCB0aGUgbWF0Y2guCi0gICAgLy8gMi4gT3RoZXJ3aXNlLCB0aGUgbm9kZSByZXF1aXJlcyBhZGRpdGlvbmFsIHZlcmlmaWNhdGlvbiBjaGVja3MsIHNvIGNhbGwKLSAgICAvLyAgICBNYXRjaFNlbGVjdG9yQW5kRWxlbWVudCgpLgotICAgIGlmICghY2FuZGlkYXRlX25vZGUtPmNvbXBvdW5kX3NlbGVjdG9yKCkKLSAgICAgICAgICAgICAtPnJlcXVpcmVzX3J1bGVfbWF0Y2hpbmdfdmVyaWZpY2F0aW9uX3Zpc2l0KCkgfHwKLSAgICAgICAgTWF0Y2hTZWxlY3RvckFuZEVsZW1lbnQoY2FuZGlkYXRlX25vZGUtPmNvbXBvdW5kX3NlbGVjdG9yKCksIGVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSkgewotICAgICAgY2FsbGJhY2suUnVuKGVsZW1lbnQsIGNhbmRpZGF0ZV9ub2RlKTsKLSAgICB9Ci0gIH0KLX0KLQogYm9vbCBNYXRjaFJ1bGVBbmRFbGVtZW50KGNzc29tOjpDU1NTdHlsZVJ1bGUqIHJ1bGUsIEVsZW1lbnQqIGVsZW1lbnQpIHsKICAgZm9yIChjc3NvbTo6U2VsZWN0b3JzOjpjb25zdF9pdGVyYXRvciBzZWxlY3Rvcl9pdGVyYXRvciA9CiAgICAgICAgICAgIHJ1bGUtPnNlbGVjdG9ycygpLmJlZ2luKCk7CkBAIC01NzcsMTE0ICszNjUsNTYyIEBACiAgIHJldHVybiBmYWxzZTsKIH0KIAordm9pZCBHYXRoZXJDYW5kaWRhdGVOb2Rlc0Zyb21TZWxlY3Rvck5vZGVzTWFwKAorICAgIGNzc29tOjpTaW1wbGVTZWxlY3RvclR5cGUgc2ltcGxlX3NlbGVjdG9yX3R5cGUsCisgICAgY3Nzb206OkNvbWJpbmF0b3JUeXBlIGNvbWJpbmF0b3JfdHlwZSwKKyAgICBjb25zdCBTZWxlY3RvclRyZWU6Ok5vZGUqIHBhcmVudF9ub2RlLAorICAgIGNvbnN0IFNlbGVjdG9yVHJlZTo6U2VsZWN0b3JUZXh0VG9Ob2Rlc01hcCogbWFwLCBiYXNlOjpUb2tlbiBrZXksCisgICAgU2VsZWN0b3JUcmVlOjpOb2RlUGFpcnMqIGNhbmRpZGF0ZV9ub2RlcykgeworICBTZWxlY3RvclRyZWU6OlNlbGVjdG9yVGV4dFRvTm9kZXNNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbWFwLT5maW5kKGtleSk7CisgIGlmIChpdCAhPSBtYXAtPmVuZCgpKSB7CisgICAgY29uc3QgU2VsZWN0b3JUcmVlOjpTaW1wbGVTZWxlY3Rvck5vZGVzJiBub2RlcyA9IGl0LT5zZWNvbmQ7CisgICAgZm9yIChjb25zdCBhdXRvJiBub2Rlc19pdGVyYXRvciA6IG5vZGVzKSB7CisgICAgICBpZiAobm9kZXNfaXRlcmF0b3Iuc2ltcGxlX3NlbGVjdG9yX3R5cGUgPT0gc2ltcGxlX3NlbGVjdG9yX3R5cGUgJiYKKyAgICAgICAgICBub2Rlc19pdGVyYXRvci5jb21iaW5hdG9yX3R5cGUgPT0gY29tYmluYXRvcl90eXBlKSB7CisgICAgICAgIGNhbmRpZGF0ZV9ub2Rlcy0+ZW1wbGFjZV9iYWNrKHBhcmVudF9ub2RlLCBub2Rlc19pdGVyYXRvci5ub2RlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordm9pZCBHYXRoZXJDYW5kaWRhdGVOb2Rlc0Zyb21Qc2V1ZG9DbGFzc05vZGVzKAorICAgIGNzc29tOjpQc2V1ZG9DbGFzc1R5cGUgcHNldWRvX2NsYXNzX3R5cGUsCisgICAgY3Nzb206OkNvbWJpbmF0b3JUeXBlIGNvbWJpbmF0b3JfdHlwZSwKKyAgICBjb25zdCBTZWxlY3RvclRyZWU6Ok5vZGUqIHBhcmVudF9ub2RlLAorICAgIGNvbnN0IFNlbGVjdG9yVHJlZTo6UHNldWRvQ2xhc3NOb2RlcyYgcHNldWRvX2NsYXNzX25vZGVzLAorICAgIFNlbGVjdG9yVHJlZTo6Tm9kZVBhaXJzKiBjYW5kaWRhdGVfbm9kZXMpIHsKKyAgZm9yIChjb25zdCBhdXRvJiBub2Rlc19pdGVyYXRvciA6IHBzZXVkb19jbGFzc19ub2RlcykgeworICAgIGlmIChub2Rlc19pdGVyYXRvci5wc2V1ZG9fY2xhc3NfdHlwZSA9PSBwc2V1ZG9fY2xhc3NfdHlwZSAmJgorICAgICAgICBub2Rlc19pdGVyYXRvci5jb21iaW5hdG9yX3R5cGUgPT0gY29tYmluYXRvcl90eXBlKSB7CisgICAgICBjYW5kaWRhdGVfbm9kZXMtPmVtcGxhY2VfYmFjayhwYXJlbnRfbm9kZSwgbm9kZXNfaXRlcmF0b3Iubm9kZSk7CisgICAgfQorICB9Cit9CisKK2Jvb2wgR2F0aGVyTm9kZU1vZGlmaWNhdGlvbnNBbmRVcGRhdGVUYXJnZXROb2RlcygKKyAgICBjb25zdCBTZWxlY3RvclRyZWU6Ok5vZGVzJiBzb3VyY2Vfbm9kZXMsIFNlbGVjdG9yVHJlZTo6Tm9kZXMqIHRhcmdldF9ub2RlcywKKyAgICBTZWxlY3RvclRyZWU6Ok5vZGVzKiBhZGRlZF9ub2RlcywgU2VsZWN0b3JUcmVlOjpOb2RlcyogcmVtb3ZlZF9ub2RlcykgeworICBpZiAoc291cmNlX25vZGVzID09ICp0YXJnZXRfbm9kZXMpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBhZGRlZF9ub2Rlcy0+Y2xlYXIoKTsKKyAgcmVtb3ZlZF9ub2Rlcy0+Y2xlYXIoKTsKKworICBpZiAodGFyZ2V0X25vZGVzLT5lbXB0eSgpKSB7CisgICAgLy8gSWYgdGhlIHByZXZpb3VzIHN0YXRlIG9mIHRoZSBub2RlcyAofHRhcmdldF9ub2Rlc3wpIGlzIGVtcHR5LCB0aGVuIGFsbAorICAgIC8vIG5vZGVzIGluIHRoZSBuZXcgc3RhdGUgKHxzb3VyY2Vfbm9kZXN8KSBhcmUgYmVpbmcgYWRkZWQuCisgICAgKmFkZGVkX25vZGVzID0gc291cmNlX25vZGVzOworICB9IGVsc2UgaWYgKHNvdXJjZV9ub2Rlcy5lbXB0eSgpKSB7CisgICAgLy8gSWYgdGhlIG5ldyBzdGF0ZSAofHNvdXJjZV9ub2Rlc3wpIGlzIGVtcHR5LCB0aGVuIGFsbCBub2RlcyBpbiB0aGUKKyAgICAvLyBwcmV2aW91cyBzdGF0ZSAofHRhcmdldF9ub2Rlc3wpIGFyZSBiZWluZyByZW1vdmVkLgorICAgICpyZW1vdmVkX25vZGVzID0gKnRhcmdldF9ub2RlczsKKyAgfSBlbHNlIHsKKyAgICAvLyBJZiBuZWl0aGVyIHRoZSBwcmV2aW91cyBzdGF0ZSBub3IgdGhlIG5ldyBzdGF0ZSBvciBlbXB0eSwgdGhlbiB0aGUgbGlzdHMKKyAgICAvLyBtdXN0IGJlIG1hbnVhbGx5IHNlYXJjaGVkIHRvIGRldGVybWluZSB3aGF0IGlzIGJlaW5nIGFkZGVkIGFuZCByZW1vdmVkLgorICAgIC8vIFJlbW92ZSBhbGwgbm9kZXMgaW4gfHNvdXJjZV9ub2Rlc3wgZnJvbSB8dGFyZ2V0X25vZGVzfC4gQW55IG9mIHRoZSBub2RlcworICAgIC8vIHRoYXQgYXJlIG5vdCBmb3VuZCBpbiB8dGFyZ2V0X25vZGVzfCBhcmUgbmV3bHkgYWRkZWQgbm9kZXMuCisgICAgc2l6ZV90IHN0YXJ0X2luZGV4ID0gMDsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGNoZWNrX25vZGUgOiBzb3VyY2Vfbm9kZXMpIHsKKyAgICAgIGJvb2wgbm9kZV9mb3VuZCA9IGZhbHNlOworICAgICAgZm9yIChzaXplX3QgaW5kZXggPSBzdGFydF9pbmRleDsgaW5kZXggPCB0YXJnZXRfbm9kZXMtPnNpemUoKTsgKytpbmRleCkgeworICAgICAgICBpZiAoKCp0YXJnZXRfbm9kZXMpW2luZGV4XSA9PSBjaGVja19ub2RlKSB7CisgICAgICAgICAgaWYgKGluZGV4ID09IHN0YXJ0X2luZGV4KSB7CisgICAgICAgICAgICArK3N0YXJ0X2luZGV4OworICAgICAgICAgIH0KKyAgICAgICAgICBub2RlX2ZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAoKnRhcmdldF9ub2RlcylbaW5kZXhdID0gTlVMTDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKCFub2RlX2ZvdW5kKSB7CisgICAgICAgIGFkZGVkX25vZGVzLT5wdXNoX2JhY2soY2hlY2tfbm9kZSk7CisgICAgICB9CisgICAgfQorICAgIC8vIEZpbmQgbm9kZXMgdGhhdCByZW1haW4gaW4gfHRhcmdldF9ub2Rlc3wuIFRoZXNlIGRpZCBub3QgZXhpc3QgaW4KKyAgICAvLyB8c291cmNlX25vZGVzfCBhbmQgYXJlIG5ld2x5IHJlbW92ZWQgbm9kZXMuCisgICAgZm9yIChjb25zdCBhdXRvJiBjaGVja19ub2RlIDogKnRhcmdldF9ub2RlcykgeworICAgICAgaWYgKGNoZWNrX25vZGUgIT0gTlVMTCkgeworICAgICAgICByZW1vdmVkX25vZGVzLT5wdXNoX2JhY2soY2hlY2tfbm9kZSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgKnRhcmdldF9ub2RlcyA9IHNvdXJjZV9ub2RlczsKKworICAvLyBSZXR1cm4gd2hldGhlciBvciBub3QgYW55IG1vZGlmaWNhdGlvbnMgd2VyZSBmb3VuZC4KKyAgcmV0dXJuICFhZGRlZF9ub2Rlcy0+ZW1wdHkoKSB8fCAhcmVtb3ZlZF9ub2Rlcy0+ZW1wdHkoKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIGEgbWF0Y2hpbmcgbm9kZSB3YXMgYWRkZWQuCitib29sIEdhdGhlck1hdGNoaW5nTm9kZXMoY29uc3QgU2VsZWN0b3JUcmVlOjpOb2RlcyYgbm9kZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY3Nzb206OkNvbWJpbmF0b3JUeXBlIGNvbWJpbmF0b3JfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBIVE1MRWxlbWVudCogZWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RvclRyZWU6Ok5vZGVQYWlycyogc2NyYXRjaHBhZF9ub2RlX3BhaXJzKSB7CisgIGJvb2wgbWF0Y2hpbmdfbm9kZV9hZGRlZCA9IGZhbHNlOworCisgIC8vIEdhdGhlcmluZyBQaGFzZTogR2VuZXJhdGUgY2FuZGlkYXRlIG5vZGVzIGZyb20gdGhlIG5vZGVzLgorICBTZWxlY3RvclRyZWU6Ok5vZGVQYWlycyogY2FuZGlkYXRlX25vZGVfcGFpcnMgPSBzY3JhdGNocGFkX25vZGVfcGFpcnM7CisgIGNhbmRpZGF0ZV9ub2RlX3BhaXJzLT5jbGVhcigpOworCisgIGNvbnN0IHN0ZDo6dmVjdG9yPGJhc2U6OlRva2VuPiYgZWxlbWVudF9jbGFzc19saXN0ID0KKyAgICAgIGVsZW1lbnQtPmNsYXNzX2xpc3QoKS0+R2V0VG9rZW5zKCk7CisKKyAgLy8gRG9uJ3QgcmV0cmlldmUgdGhlIGVsZW1lbnQncyBhdHRyaWJ1dGVzIHVudGlsIHRoZXkgYXJlIG5lZWRlZC4gUmV0cmlldmluZworICAvLyB0aGVtIHR5cGljYWxseSByZXF1aXJlcyB0aGUgY3JlYXRpb24gb2YgYSBOYW1lZE5vZGVNYXAuCisgIHNjb3BlZF9yZWZwdHI8TmFtZWROb2RlTWFwPiBlbGVtZW50X2F0dHJpYnV0ZXM7CisKKyAgLy8gSXRlcmF0ZSB0aHJvdWdoIGFsbCBub2Rlcy4KKyAgZm9yIChjb25zdCBhdXRvJiBub2RlIDogbm9kZXMpIHsKKyAgICBpZiAoIW5vZGUtPkhhc0NvbWJpbmF0b3IoY29tYmluYXRvcl90eXBlKSkgeworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gR2F0aGVyIGNhbmRpZGF0ZSBub2RlcyBpbiBub2RlJ3MgY2hpbGRyZW4gdW5kZXIgdGhlIGdpdmVuIGNvbWJpbmF0b3IuCisgICAgY29uc3QgU2VsZWN0b3JUcmVlOjpTZWxlY3RvclRleHRUb05vZGVzTWFwKiBzZWxlY3Rvcl9ub2Rlc19tYXAgPQorICAgICAgICBub2RlLT5zZWxlY3Rvcl9ub2Rlc19tYXAoKTsKKyAgICBpZiAoc2VsZWN0b3Jfbm9kZXNfbWFwKSB7CisgICAgICAvLyBVbml2ZXJzYWwgc2VsZWN0b3IuCisgICAgICBpZiAobm9kZS0+SGFzU2ltcGxlU2VsZWN0b3IoY3Nzb206OmtVbml2ZXJzYWxTZWxlY3RvciwgY29tYmluYXRvcl90eXBlKSkgeworICAgICAgICBHYXRoZXJDYW5kaWRhdGVOb2Rlc0Zyb21TZWxlY3Rvck5vZGVzTWFwKAorICAgICAgICAgICAgY3Nzb206OmtVbml2ZXJzYWxTZWxlY3RvciwgY29tYmluYXRvcl90eXBlLCBub2RlLAorICAgICAgICAgICAgc2VsZWN0b3Jfbm9kZXNfbWFwLCBiYXNlOjpUb2tlbigpLCBjYW5kaWRhdGVfbm9kZV9wYWlycyk7CisgICAgICB9CisKKyAgICAgIC8vIFR5cGUgc2VsZWN0b3IuCisgICAgICBpZiAobm9kZS0+SGFzU2ltcGxlU2VsZWN0b3IoY3Nzb206OmtUeXBlU2VsZWN0b3IsIGNvbWJpbmF0b3JfdHlwZSkpIHsKKyAgICAgICAgR2F0aGVyQ2FuZGlkYXRlTm9kZXNGcm9tU2VsZWN0b3JOb2Rlc01hcCgKKyAgICAgICAgICAgIGNzc29tOjprVHlwZVNlbGVjdG9yLCBjb21iaW5hdG9yX3R5cGUsIG5vZGUsIHNlbGVjdG9yX25vZGVzX21hcCwKKyAgICAgICAgICAgIGVsZW1lbnQtPmxvY2FsX25hbWUoKSwgY2FuZGlkYXRlX25vZGVfcGFpcnMpOworICAgICAgfQorCisgICAgICAvLyBBdHRyaWJ1dGUgc2VsZWN0b3IuCisgICAgICBpZiAobm9kZS0+SGFzU2ltcGxlU2VsZWN0b3IoY3Nzb206OmtBdHRyaWJ1dGVTZWxlY3RvciwgY29tYmluYXRvcl90eXBlKSkgeworICAgICAgICAvLyBJZiB0aGUgZWxlbWVudCdzIGF0dHJpYnV0ZXMgaGF2ZSBub3QgYmVlbiByZXRyaWV2ZWQgeWV0LCB0aGVuCisgICAgICAgIC8vIHJldHJpZXZlIHRoZW0gbm93LgorICAgICAgICBpZiAoIWVsZW1lbnRfYXR0cmlidXRlcykgeworICAgICAgICAgIGVsZW1lbnRfYXR0cmlidXRlcyA9IGVsZW1lbnQtPmF0dHJpYnV0ZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAodW5zaWduZWQgaW50IGluZGV4ID0gMDsgaW5kZXggPCBlbGVtZW50X2F0dHJpYnV0ZXMtPmxlbmd0aCgpOworICAgICAgICAgICAgICsraW5kZXgpIHsKKyAgICAgICAgICBHYXRoZXJDYW5kaWRhdGVOb2Rlc0Zyb21TZWxlY3Rvck5vZGVzTWFwKAorICAgICAgICAgICAgICBjc3NvbTo6a0F0dHJpYnV0ZVNlbGVjdG9yLCBjb21iaW5hdG9yX3R5cGUsIG5vZGUsCisgICAgICAgICAgICAgIHNlbGVjdG9yX25vZGVzX21hcCwKKyAgICAgICAgICAgICAgYmFzZTo6VG9rZW4oZWxlbWVudF9hdHRyaWJ1dGVzLT5JdGVtKGluZGV4KS0+bmFtZSgpKSwKKyAgICAgICAgICAgICAgY2FuZGlkYXRlX25vZGVfcGFpcnMpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIENsYXNzIHNlbGVjdG9yLgorICAgICAgaWYgKG5vZGUtPkhhc1NpbXBsZVNlbGVjdG9yKGNzc29tOjprQ2xhc3NTZWxlY3RvciwgY29tYmluYXRvcl90eXBlKSkgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGVsZW1lbnRfY2xhc3MgOiBlbGVtZW50X2NsYXNzX2xpc3QpIHsKKyAgICAgICAgICBHYXRoZXJDYW5kaWRhdGVOb2Rlc0Zyb21TZWxlY3Rvck5vZGVzTWFwKAorICAgICAgICAgICAgICBjc3NvbTo6a0NsYXNzU2VsZWN0b3IsIGNvbWJpbmF0b3JfdHlwZSwgbm9kZSwgc2VsZWN0b3Jfbm9kZXNfbWFwLAorICAgICAgICAgICAgICBlbGVtZW50X2NsYXNzLCBjYW5kaWRhdGVfbm9kZV9wYWlycyk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gSWQgc2VsZWN0b3IuCisgICAgICBpZiAobm9kZS0+SGFzU2ltcGxlU2VsZWN0b3IoY3Nzb206OmtJZFNlbGVjdG9yLCBjb21iaW5hdG9yX3R5cGUpKSB7CisgICAgICAgIEdhdGhlckNhbmRpZGF0ZU5vZGVzRnJvbVNlbGVjdG9yTm9kZXNNYXAoCisgICAgICAgICAgICBjc3NvbTo6a0lkU2VsZWN0b3IsIGNvbWJpbmF0b3JfdHlwZSwgbm9kZSwgc2VsZWN0b3Jfbm9kZXNfbWFwLAorICAgICAgICAgICAgZWxlbWVudC0+aWQoKSwgY2FuZGlkYXRlX25vZGVfcGFpcnMpOworICAgICAgfQorICAgIH0KKworICAgIC8vIE9ubHkgY2hlY2sgZm9yIHNwZWNpZmljIHBzZXVkbyBjbGFzc2VzIHdoZW4gdGhlIG5vZGUgaGFzIGFzIGxlYXN0IG9uZS4KKyAgICBpZiAobm9kZS0+SGFzQW55UHNldWRvQ2xhc3MoKSkgeworICAgICAgLy8gRW1wdHkgcHNldWRvIGNsYXNzLgorICAgICAgaWYgKG5vZGUtPkhhc1BzZXVkb0NsYXNzKGNzc29tOjprRW1wdHlQc2V1ZG9DbGFzcywgY29tYmluYXRvcl90eXBlKSAmJgorICAgICAgICAgIGVsZW1lbnQtPklzRW1wdHkoKSkgeworICAgICAgICBHYXRoZXJDYW5kaWRhdGVOb2Rlc0Zyb21Qc2V1ZG9DbGFzc05vZGVzKAorICAgICAgICAgICAgY3Nzb206OmtFbXB0eVBzZXVkb0NsYXNzLCBjb21iaW5hdG9yX3R5cGUsIG5vZGUsCisgICAgICAgICAgICBub2RlLT5wc2V1ZG9fY2xhc3Nfbm9kZXMoKSwgY2FuZGlkYXRlX25vZGVfcGFpcnMpOworICAgICAgfQorCisgICAgICAvLyBGb2N1cyBwc2V1ZG8gY2xhc3MuCisgICAgICBpZiAobm9kZS0+SGFzUHNldWRvQ2xhc3MoY3Nzb206OmtGb2N1c1BzZXVkb0NsYXNzLCBjb21iaW5hdG9yX3R5cGUpICYmCisgICAgICAgICAgZWxlbWVudC0+SGFzRm9jdXMoKSkgeworICAgICAgICBHYXRoZXJDYW5kaWRhdGVOb2Rlc0Zyb21Qc2V1ZG9DbGFzc05vZGVzKAorICAgICAgICAgICAgY3Nzb206OmtGb2N1c1BzZXVkb0NsYXNzLCBjb21iaW5hdG9yX3R5cGUsIG5vZGUsCisgICAgICAgICAgICBub2RlLT5wc2V1ZG9fY2xhc3Nfbm9kZXMoKSwgY2FuZGlkYXRlX25vZGVfcGFpcnMpOworICAgICAgfQorCisgICAgICAvLyBIb3ZlciBwc2V1ZG8gY2xhc3MuCisgICAgICBpZiAobm9kZS0+SGFzUHNldWRvQ2xhc3MoY3Nzb206OmtIb3ZlclBzZXVkb0NsYXNzLCBjb21iaW5hdG9yX3R5cGUpICYmCisgICAgICAgICAgZWxlbWVudC0+SXNEZXNpZ25hdGVkKCkpIHsKKyAgICAgICAgR2F0aGVyQ2FuZGlkYXRlTm9kZXNGcm9tUHNldWRvQ2xhc3NOb2RlcygKKyAgICAgICAgICAgIGNzc29tOjprSG92ZXJQc2V1ZG9DbGFzcywgY29tYmluYXRvcl90eXBlLCBub2RlLAorICAgICAgICAgICAgbm9kZS0+cHNldWRvX2NsYXNzX25vZGVzKCksIGNhbmRpZGF0ZV9ub2RlX3BhaXJzKTsKKyAgICAgIH0KKworICAgICAgLy8gTm90IHBzZXVkbyBjbGFzcy4KKyAgICAgIGlmIChub2RlLT5IYXNQc2V1ZG9DbGFzcyhjc3NvbTo6a05vdFBzZXVkb0NsYXNzLCBjb21iaW5hdG9yX3R5cGUpKSB7CisgICAgICAgIEdhdGhlckNhbmRpZGF0ZU5vZGVzRnJvbVBzZXVkb0NsYXNzTm9kZXMoCisgICAgICAgICAgICBjc3NvbTo6a05vdFBzZXVkb0NsYXNzLCBjb21iaW5hdG9yX3R5cGUsIG5vZGUsCisgICAgICAgICAgICBub2RlLT5wc2V1ZG9fY2xhc3Nfbm9kZXMoKSwgY2FuZGlkYXRlX25vZGVfcGFpcnMpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIFZlcmlmeWluZyBQaGFzZTogQ2hlY2sgYWxsIGNhbmRpZGF0ZSBub2RlcyBhbmQgcnVuIGNhbGxiYWNrIGZvciBtYXRjaGluZworICAvLyBub2Rlcy4KKyAgZm9yIChjb25zdCBhdXRvJiBjYW5kaWRhdGVfbm9kZV9wYWlyIDogKmNhbmRpZGF0ZV9ub2RlX3BhaXJzKSB7CisgICAgY29uc3QgU2VsZWN0b3JUcmVlOjpOb2RlKiBjYW5kaWRhdGVfbm9kZSA9IGNhbmRpZGF0ZV9ub2RlX3BhaXIuc2Vjb25kOworCisgICAgLy8gVmVyaWZ5IHRoYXQgdGhpcyBub2RlIGlzIGEgbWF0Y2g6CisgICAgLy8gMS4gSWYgdGhlIGNhbmRpZGF0ZSBub2RlJ3MgY29tcG91bmQgc2VsZWN0b3IgZG9lc24ndCByZXF1aXJlIGEgdmlzaXQgdG8KKyAgICAvLyAgICB2ZXJpZnkgdGhlIG1hdGNoLCB0aGVuIHRoZSBhY3Qgb2YgZ2F0aGVyaW5nIHRoZSBub2RlIGFzIGEgY2FuZGlkYXRlCisgICAgLy8gICAgcHJvdmVkIHRoZSBtYXRjaC4KKyAgICAvLyAyLiBPdGhlcndpc2UsIHRoZSBub2RlIHJlcXVpcmVzIGFkZGl0aW9uYWwgdmVyaWZpY2F0aW9uIGNoZWNrcywgc28gY2FsbAorICAgIC8vICAgIE1hdGNoU2VsZWN0b3JBbmRFbGVtZW50KCkuCisgICAgaWYgKCFjYW5kaWRhdGVfbm9kZS0+Y29tcG91bmRfc2VsZWN0b3IoKQorICAgICAgICAgICAgIC0+cmVxdWlyZXNfcnVsZV9tYXRjaGluZ192ZXJpZmljYXRpb25fdmlzaXQoKSB8fAorICAgICAgICBNYXRjaFNlbGVjdG9yQW5kRWxlbWVudChjYW5kaWRhdGVfbm9kZS0+Y29tcG91bmRfc2VsZWN0b3IoKSwgZWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpKSB7CisgICAgICBtYXRjaGluZ19ub2RlX2FkZGVkID0gdHJ1ZTsKKyAgICAgIGVsZW1lbnQtPnJ1bGVfbWF0Y2hpbmdfc3RhdGUoKS0+bWF0Y2hpbmdfbm9kZXNfcGFyZW50X25vZGVzLnB1c2hfYmFjaygKKyAgICAgICAgICBjYW5kaWRhdGVfbm9kZV9wYWlyLmZpcnN0KTsKKyAgICAgIGVsZW1lbnQtPnJ1bGVfbWF0Y2hpbmdfc3RhdGUoKS0+bWF0Y2hpbmdfbm9kZXMucHVzaF9iYWNrKGNhbmRpZGF0ZV9ub2RlKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gbWF0Y2hpbmdfbm9kZV9hZGRlZDsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIGEgbWF0Y2hpbmcgbm9kZSB3YXMgcmVtb3ZlZC4KK2Jvb2wgUmVtb3ZlTm9kZXNGcm9tTWF0Y2hpbmdOb2RlcygKKyAgICBjb25zdCBTZWxlY3RvclRyZWU6Ok5vZGVzJiBwYXJlbnRfbm9kZXNfdG9fcmVtb3ZlLAorICAgIFNlbGVjdG9yVHJlZTo6Tm9kZXMqIHBhcmVudF9ub2RlcywgU2VsZWN0b3JUcmVlOjpOb2RlcyogbWF0Y2hpbmdfbm9kZXMpIHsKKyAgRENIRUNLX0VRKHBhcmVudF9ub2Rlcy0+c2l6ZSgpLCBtYXRjaGluZ19ub2Rlcy0+c2l6ZSgpKTsKKyAgYm9vbCBub2RlX3JlbW92ZWQgPSBmYWxzZTsKKworICAvLyBGaW5kIGFueSB8cGFyZW50X25vZGVzfCB0aGF0IGFyZSBiZWluZyByZW1vdmVkLiBSZW1vdmUgdGhlc2UgZnJvbSBib3RoCisgIC8vIHxwYXJlbnRfbm9kZXN8IGFuZCB8bWF0Y2hpbmdfbm9kZXN8LCBhcyB0aGVzZSB0d28gY29udGFpbmVycyBhcmUga2VwdCBpbgorICAvLyBzeW5jLgorICBmb3IgKGNvbnN0IGF1dG8mIHBhcmVudF9ub2RlX3RvX3JlbW92ZSA6IHBhcmVudF9ub2Rlc190b19yZW1vdmUpIHsKKyAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgcGFyZW50X25vZGVzLT5zaXplKCk7ICsraW5kZXgpIHsKKyAgICAgIGlmIChwYXJlbnRfbm9kZV90b19yZW1vdmUgPT0gKCpwYXJlbnRfbm9kZXMpW2luZGV4XSkgeworICAgICAgICBub2RlX3JlbW92ZWQgPSB0cnVlOworICAgICAgICBwYXJlbnRfbm9kZXMtPmVyYXNlKHBhcmVudF9ub2Rlcy0+YmVnaW4oKSArIGluZGV4KTsKKyAgICAgICAgbWF0Y2hpbmdfbm9kZXMtPmVyYXNlKG1hdGNoaW5nX25vZGVzLT5iZWdpbigpICsgaW5kZXgpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gbm9kZV9yZW1vdmVkOworfQorCisvLyBSZXR1cm5zIHRydWUgaWYgdGhlIG1hdGNoaW5nIG5vZGVzIHdlcmUgbW9kaWZpZWQuCitib29sIFVwZGF0ZU1hdGNoaW5nTm9kZXNGcm9tTm9kZU1vZGlmaWNhdGlvbnMoCisgICAgY29uc3QgU2VsZWN0b3JUcmVlOjpOb2RlcyYgYWRkZWRfbm9kZXMsCisgICAgY29uc3QgU2VsZWN0b3JUcmVlOjpOb2RlcyYgcmVtb3ZlZF9ub2RlcywKKyAgICBjc3NvbTo6Q29tYmluYXRvclR5cGUgY29tYmluYXRvcl90eXBlLCBIVE1MRWxlbWVudCogZWxlbWVudCwKKyAgICBTZWxlY3RvclRyZWU6Ok5vZGVQYWlycyogc2NyYXRjaHBhZF9ub2RlX3BhaXJzKSB7CisgIC8vIEZpcnN0IGdhdGhlciB0aGUgbWF0Y2hpbmcgbm9kZXMgZm91bmQgaW4gfGFkZGVkX25vZGVzfC4KKyAgYm9vbCBtYXRjaGluZ19ub2Rlc19tb2RpZmllZCA9IEdhdGhlck1hdGNoaW5nTm9kZXMoCisgICAgICBhZGRlZF9ub2RlcywgY29tYmluYXRvcl90eXBlLCBlbGVtZW50LCBzY3JhdGNocGFkX25vZGVfcGFpcnMpOworCisgIC8vIE5vdyByZW1vdmUgYW55IG1hdGNoaW5nIG5vZGVzIGZvdW5kIGluIHxyZW1vdmVkX25vZGVzfC4KKyAgSFRNTEVsZW1lbnQ6OlJ1bGVNYXRjaGluZ1N0YXRlKiBlbGVtZW50X21hdGNoaW5nX3N0YXRlID0KKyAgICAgIGVsZW1lbnQtPnJ1bGVfbWF0Y2hpbmdfc3RhdGUoKTsKKyAgbWF0Y2hpbmdfbm9kZXNfbW9kaWZpZWQgfD0gUmVtb3ZlTm9kZXNGcm9tTWF0Y2hpbmdOb2RlcygKKyAgICAgIHJlbW92ZWRfbm9kZXMsICZlbGVtZW50X21hdGNoaW5nX3N0YXRlLT5tYXRjaGluZ19ub2Rlc19wYXJlbnRfbm9kZXMsCisgICAgICAmZWxlbWVudF9tYXRjaGluZ19zdGF0ZS0+bWF0Y2hpbmdfbm9kZXMpOworCisgIHJldHVybiBtYXRjaGluZ19ub2Rlc19tb2RpZmllZDsKK30KKwordm9pZCBVcGRhdGVSdWxlTWF0Y2hpbmdTdGF0ZUNvbWJpbmF0b3JOb2RlcygKKyAgICBIVE1MRWxlbWVudDo6UnVsZU1hdGNoaW5nU3RhdGUqIG1hdGNoaW5nX3N0YXRlLAorICAgIGNzc29tOjpDb21iaW5hdG9yVHlwZSBjb21iaW5hdG9yX3R5cGUpIHsKKyAgLy8gT25seSBkZXNjZW5kYW50IGFuZCBmb2xsb3dpbmcgc2libGluZyBjb21iaW5hdG9ycyBhcmUgc3VwcG9ydGVkLgorICBEQ0hFQ0soY29tYmluYXRvcl90eXBlID09IGNzc29tOjprRGVzY2VuZGFudENvbWJpbmF0b3IgfHwKKyAgICAgICAgIGNvbWJpbmF0b3JfdHlwZSA9PSBjc3NvbTo6a0ZvbGxvd2luZ1NpYmxpbmdDb21iaW5hdG9yKTsKKyAgaWYgKCFtYXRjaGluZ19zdGF0ZSkgeworICAgIHJldHVybjsKKyAgfQorCisgIERDSEVDSyhtYXRjaGluZ19zdGF0ZS0+aXNfc2V0KTsKKyAgYm9vbCYgaXNfZGlydHkgPSBjb21iaW5hdG9yX3R5cGUgPT0gY3Nzb206OmtEZXNjZW5kYW50Q29tYmluYXRvcgorICAgICAgICAgICAgICAgICAgICAgICA/IG1hdGNoaW5nX3N0YXRlLT5hcmVfZGVzY2VuZGFudF9ub2Rlc19kaXJ0eQorICAgICAgICAgICAgICAgICAgICAgICA6IG1hdGNoaW5nX3N0YXRlLT5hcmVfZm9sbG93aW5nX3NpYmxpbmdfbm9kZXNfZGlydHk7CisgIGlmICghaXNfZGlydHkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBjb25zdCBTZWxlY3RvclRyZWU6Ok5vZGVzJiBiYXNlX2NvbWJpbmF0b3Jfbm9kZXMgPQorICAgICAgY29tYmluYXRvcl90eXBlID09IGNzc29tOjprRGVzY2VuZGFudENvbWJpbmF0b3IKKyAgICAgICAgICA/IG1hdGNoaW5nX3N0YXRlLT5wYXJlbnRfZGVzY2VuZGFudF9ub2RlcworICAgICAgICAgIDogbWF0Y2hpbmdfc3RhdGUtPnByZXZpb3VzX3NpYmxpbmdfZm9sbG93aW5nX3NpYmxpbmdfbm9kZXM7CisgIFNlbGVjdG9yVHJlZTo6Tm9kZXMmIGNvbWJpbmF0b3Jfbm9kZXMgPQorICAgICAgY29tYmluYXRvcl90eXBlID09IGNzc29tOjprRGVzY2VuZGFudENvbWJpbmF0b3IKKyAgICAgICAgICA/IG1hdGNoaW5nX3N0YXRlLT5kZXNjZW5kYW50X25vZGVzCisgICAgICAgICAgOiBtYXRjaGluZ19zdGF0ZS0+Zm9sbG93aW5nX3NpYmxpbmdfbm9kZXM7CisKKyAgLy8gRmlyc3QgY29weSB0aGUgYmFzZSBjb21iaW5hdG9yIG5vZGVzIGFuZCB0aGVuIGFkZCBhbnkgbWF0Y2hpbmcgbm9kZXMgdGhhdAorICAvLyBoYXZlIHRoZSByZXF1aXJlZCBjb21iaW5hdG9yIGFuZCBhcmUgbm90IGFscmVhZHkgaW5jbHVkZWQgd2l0aGluIHRoZSBsaXN0LgorICBjb21iaW5hdG9yX25vZGVzID0gYmFzZV9jb21iaW5hdG9yX25vZGVzOworICBmb3IgKGNvbnN0IGF1dG8mIG5vZGUgOiBtYXRjaGluZ19zdGF0ZS0+bWF0Y2hpbmdfbm9kZXMpIHsKKyAgICBpZiAobm9kZS0+SGFzQ29tYmluYXRvcihjb21iaW5hdG9yX3R5cGUpICYmCisgICAgICAgIHN0ZDo6ZmluZChiYXNlX2NvbWJpbmF0b3Jfbm9kZXMuYmVnaW4oKSwgYmFzZV9jb21iaW5hdG9yX25vZGVzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgbm9kZSkgPT0gYmFzZV9jb21iaW5hdG9yX25vZGVzLmVuZCgpKSB7CisgICAgICBjb21iaW5hdG9yX25vZGVzLnB1c2hfYmFjayhub2RlKTsKKyAgICB9CisgIH0KKworICBpc19kaXJ0eSA9IGZhbHNlOworfQorCisvLyBSZXR1cm5zIHRydWUgaWYgdGhlIG1hdGNoaW5nIHN0YXRlIHdhcyBtb2RpZmllZC4KK2Jvb2wgVXBkYXRlRWxlbWVudFJ1bGVNYXRjaGluZ1N0YXRlKEhUTUxFbGVtZW50KiBlbGVtZW50KSB7CisgIFNlbGVjdG9yVHJlZSogc2VsZWN0b3JfdHJlZSA9IGVsZW1lbnQtPm5vZGVfZG9jdW1lbnQoKS0+c2VsZWN0b3JfdHJlZSgpOworICBib29sIHNpYmxpbmdfbWF0Y2hpbmdfYWN0aXZlID0gc2VsZWN0b3JfdHJlZS0+aGFzX3NpYmxpbmdfY29tYmluYXRvcnMoKTsKKworICAvLyBSZXRyaWV2ZSB0aGUgcGFyZW50IGFuZCBwcmV2aW91cyBzaWJsaW5nIG9mIHRoZSBjdXJyZW50IGVsZW1lbnQuCisgIEhUTUxFbGVtZW50KiBwYXJlbnQgPSBlbGVtZW50LT5wYXJlbnRfZWxlbWVudCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBlbGVtZW50LT5wYXJlbnRfZWxlbWVudCgpLT5Bc0hUTUxFbGVtZW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE5VTEw7CisgIEhUTUxFbGVtZW50KiBwcmV2aW91c19zaWJsaW5nID0KKyAgICAgIHNpYmxpbmdfbWF0Y2hpbmdfYWN0aXZlICYmIGVsZW1lbnQtPnByZXZpb3VzX2VsZW1lbnRfc2libGluZygpCisgICAgICAgICAgPyBlbGVtZW50LT5wcmV2aW91c19lbGVtZW50X3NpYmxpbmcoKS0+QXNIVE1MRWxlbWVudCgpCisgICAgICAgICAgOiBOVUxMOworCisgIC8vIFJldHJpZXZlIHRoZSBydWxlIG1hdGNoaW5nIHN0YXRlIG9mIHRoaXMgZWxlbWVudCwgaXRzIHBhcmVudCwgYW5kIGl0cworICAvLyBwcmV2aW91cyBzaWJsaW5nLgorICBIVE1MRWxlbWVudDo6UnVsZU1hdGNoaW5nU3RhdGUqIGVsZW1lbnRfbWF0Y2hpbmdfc3RhdGUgPQorICAgICAgZWxlbWVudC0+cnVsZV9tYXRjaGluZ19zdGF0ZSgpOworICBIVE1MRWxlbWVudDo6UnVsZU1hdGNoaW5nU3RhdGUqIHBhcmVudF9tYXRjaGluZ19zdGF0ZSA9CisgICAgICBwYXJlbnQgPyBwYXJlbnQtPnJ1bGVfbWF0Y2hpbmdfc3RhdGUoKSA6IE5VTEw7CisgIEhUTUxFbGVtZW50OjpSdWxlTWF0Y2hpbmdTdGF0ZSogcHJldmlvdXNfc2libGluZ19tYXRjaGluZ19zdGF0ZSA9CisgICAgICBwcmV2aW91c19zaWJsaW5nID8gcHJldmlvdXNfc2libGluZy0+cnVsZV9tYXRjaGluZ19zdGF0ZSgpIDogTlVMTDsKKworICAvLyBBIHBhcmVudCBtdXN0IGFsd2F5cyBoYXZlIHZhbGlkIG1hdGNoaW5nIHJ1bGVzIHdoZW4gaXRzIGNoaWxkIGlzIGJlaW5nCisgIC8vIHVwZGF0ZWQuCisgIERDSEVDSyghcGFyZW50IHx8IHBhcmVudC0+bWF0Y2hpbmdfcnVsZXNfdmFsaWQoKSk7CisKKyAgLy8gRW5zdXJlIHRoYXQgdGhlIHByZXZpb3VzIHNpYmxpbmcgaGFzIHVwZGF0ZWQgbWF0Y2hpbmcgcnVsZXMuIFRoaXMgaXMKKyAgLy8gbmVjZXNzYXJ5IGJlY2F1c2UgRG9jdW1lbnQ6OlVwZGF0ZUNvbXB1dGVkU3R5bGVPbkVsZW1lbnRBbmRBbmNlc3RvcigpIGRvZXMKKyAgLy8gbm90IHVwZGF0ZSBwcmV2aW91cyBzaWJsaW5ncyBzbyBpdCBpcyBwb3NzaWJsZSBmb3IgYW4gZWxlbWVudCB0byBoYXZlIGl0cworICAvLyBjb21wdXRlZCBzdHlsZSB1cGRhdGVkIHdoaWxlIHByZXZpb3VzIHNpYmxpbmdzIGhhdmUgaW52YWxpZCBtYXRjaGluZyBydWxlcy4KKyAgaWYgKHByZXZpb3VzX3NpYmxpbmcpIHsKKyAgICBVcGRhdGVFbGVtZW50TWF0Y2hpbmdSdWxlcyhwcmV2aW91c19zaWJsaW5nKTsKKyAgICBEQ0hFQ0socHJldmlvdXNfc2libGluZy0+bWF0Y2hpbmdfcnVsZXNfdmFsaWQoKSk7CisgIH0KKworICAvLyBFbnN1cmUgdGhhdCB0aGUgcmVxdWlyZWQgY29tYmluYXRvciBub2RlcyBvZiB0aGUgcGFyZW50IGFuZCBwcmV2aW91cworICAvLyBzaWJsaW5nIGFyZSB1cCB0byBkYXRlLiBUaGVzZSBhcmUgbGF6aWx5IHVwZGF0ZWQsIHNvIHRoZXkgd29uJ3QgYmUgdXBkYXRlZAorICAvLyB1bnRpbCB0aGUgZmlyc3QgY2hpbGQvbmV4dCBzaWJsaW5nIG5lZWRzIHRoZW0uCisgIFVwZGF0ZVJ1bGVNYXRjaGluZ1N0YXRlQ29tYmluYXRvck5vZGVzKHBhcmVudF9tYXRjaGluZ19zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Nzb206OmtEZXNjZW5kYW50Q29tYmluYXRvcik7CisgIFVwZGF0ZVJ1bGVNYXRjaGluZ1N0YXRlQ29tYmluYXRvck5vZGVzKHByZXZpb3VzX3NpYmxpbmdfbWF0Y2hpbmdfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzc29tOjprRm9sbG93aW5nU2libGluZ0NvbWJpbmF0b3IpOworCisgIGJvb2wgbWF0Y2hpbmdfbm9kZXNfbW9kaWZpZWQgPSAhZWxlbWVudF9tYXRjaGluZ19zdGF0ZS0+aXNfc2V0OworCisgIC8vIEdhdGhlciBtb2RpZmljYXRpb25zIGJldHdlZW4gdGhlIGVsZW1lbnQncyBwcmV2aW91cyBzdGF0ZSBhbmQgY3VycmVudCBzdGF0ZQorICAvLyBmb3IgZWFjaCBjb21iaW5hdG9yIHR5cGUsIGFuZCB1c2UgdGhlbSB0byB1cGRhdGUgdGhlIGVsZW1lbnQncyBtYXRjaGluZworICAvLyBub2Rlcy4KKyAgU2VsZWN0b3JUcmVlOjpOb2RlcyogYWRkZWRfbm9kZXMgPSBzZWxlY3Rvcl90cmVlLT5zY3JhdGNocGFkX25vZGVzXzEoKTsKKyAgU2VsZWN0b3JUcmVlOjpOb2RlcyogcmVtb3ZlZF9ub2RlcyA9IHNlbGVjdG9yX3RyZWUtPnNjcmF0Y2hwYWRfbm9kZXNfMigpOworCisgIC8vIENoaWxkIGNvbWJpbmF0b3IKKyAgaWYgKHBhcmVudF9tYXRjaGluZ19zdGF0ZSAmJgorICAgICAgR2F0aGVyTm9kZU1vZGlmaWNhdGlvbnNBbmRVcGRhdGVUYXJnZXROb2RlcygKKyAgICAgICAgICBwYXJlbnRfbWF0Y2hpbmdfc3RhdGUtPm1hdGNoaW5nX25vZGVzLAorICAgICAgICAgICZlbGVtZW50X21hdGNoaW5nX3N0YXRlLT5wYXJlbnRfbWF0Y2hpbmdfbm9kZXMsIGFkZGVkX25vZGVzLAorICAgICAgICAgIHJlbW92ZWRfbm9kZXMpKSB7CisgICAgbWF0Y2hpbmdfbm9kZXNfbW9kaWZpZWQgfD0gVXBkYXRlTWF0Y2hpbmdOb2Rlc0Zyb21Ob2RlTW9kaWZpY2F0aW9ucygKKyAgICAgICAgKmFkZGVkX25vZGVzLCAqcmVtb3ZlZF9ub2RlcywgY3Nzb206OmtDaGlsZENvbWJpbmF0b3IsIGVsZW1lbnQsCisgICAgICAgIHNlbGVjdG9yX3RyZWUtPnNjcmF0Y2hwYWRfbm9kZV9wYWlycygpKTsKKyAgfQorCisgIC8vIERlc2NlbmRhbnQgY29tYmluYXRvcgorICBjb25zdCBTZWxlY3RvclRyZWU6Ok5vZGVzJiBwYXJlbnRfZGVzY2VuZGFudF9ub2RlcyA9CisgICAgICBwYXJlbnRfbWF0Y2hpbmdfc3RhdGUgPyBwYXJlbnRfbWF0Y2hpbmdfc3RhdGUtPmRlc2NlbmRhbnRfbm9kZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHNlbGVjdG9yX3RyZWUtPnJvb3Rfbm9kZXMoKTsKKyAgaWYgKEdhdGhlck5vZGVNb2RpZmljYXRpb25zQW5kVXBkYXRlVGFyZ2V0Tm9kZXMoCisgICAgICAgICAgcGFyZW50X2Rlc2NlbmRhbnRfbm9kZXMsCisgICAgICAgICAgJmVsZW1lbnRfbWF0Y2hpbmdfc3RhdGUtPnBhcmVudF9kZXNjZW5kYW50X25vZGVzLCBhZGRlZF9ub2RlcywKKyAgICAgICAgICByZW1vdmVkX25vZGVzKSkgeworICAgIGVsZW1lbnRfbWF0Y2hpbmdfc3RhdGUtPmFyZV9kZXNjZW5kYW50X25vZGVzX2RpcnR5ID0gdHJ1ZTsKKyAgICBtYXRjaGluZ19ub2Rlc19tb2RpZmllZCB8PSBVcGRhdGVNYXRjaGluZ05vZGVzRnJvbU5vZGVNb2RpZmljYXRpb25zKAorICAgICAgICAqYWRkZWRfbm9kZXMsICpyZW1vdmVkX25vZGVzLCBjc3NvbTo6a0Rlc2NlbmRhbnRDb21iaW5hdG9yLCBlbGVtZW50LAorICAgICAgICBzZWxlY3Rvcl90cmVlLT5zY3JhdGNocGFkX25vZGVfcGFpcnMoKSk7CisgIH0KKworICAvLyBTaWJsaW5ncyBvbmx5IG5lZWQgdG8gYmUgY2hlY2tlZCBpZiB0aGV5J3JlIGFjdGl2ZS4KKyAgaWYgKHNpYmxpbmdfbWF0Y2hpbmdfYWN0aXZlKSB7CisgICAgY29uc3QgU2VsZWN0b3JUcmVlOjpOb2RlcyBlbXB0eV9ub2RlczsKKworICAgIC8vIE5leHQgc2libGluZyBjb21iaW5hdG9yCisgICAgY29uc3QgU2VsZWN0b3JUcmVlOjpOb2RlcyYgcHJldmlvdXNfc2libGluZ19tYXRjaGluZ19ub2RlcyA9CisgICAgICAgIHByZXZpb3VzX3NpYmxpbmdfbWF0Y2hpbmdfc3RhdGUKKyAgICAgICAgICAgID8gcHJldmlvdXNfc2libGluZ19tYXRjaGluZ19zdGF0ZS0+bWF0Y2hpbmdfbm9kZXMKKyAgICAgICAgICAgIDogZW1wdHlfbm9kZXM7CisgICAgaWYgKEdhdGhlck5vZGVNb2RpZmljYXRpb25zQW5kVXBkYXRlVGFyZ2V0Tm9kZXMoCisgICAgICAgICAgICBwcmV2aW91c19zaWJsaW5nX21hdGNoaW5nX25vZGVzLAorICAgICAgICAgICAgJmVsZW1lbnRfbWF0Y2hpbmdfc3RhdGUtPnByZXZpb3VzX3NpYmxpbmdfbWF0Y2hpbmdfbm9kZXMsCisgICAgICAgICAgICBhZGRlZF9ub2RlcywgcmVtb3ZlZF9ub2RlcykpIHsKKyAgICAgIG1hdGNoaW5nX25vZGVzX21vZGlmaWVkIHw9IFVwZGF0ZU1hdGNoaW5nTm9kZXNGcm9tTm9kZU1vZGlmaWNhdGlvbnMoCisgICAgICAgICAgKmFkZGVkX25vZGVzLCAqcmVtb3ZlZF9ub2RlcywgY3Nzb206OmtOZXh0U2libGluZ0NvbWJpbmF0b3IsIGVsZW1lbnQsCisgICAgICAgICAgc2VsZWN0b3JfdHJlZS0+c2NyYXRjaHBhZF9ub2RlX3BhaXJzKCkpOworICAgIH0KKworICAgIC8vIEZvbGxvd2luZyBzaWJsaW5nIGNvbWJpbmF0b3IKKyAgICBjb25zdCBTZWxlY3RvclRyZWU6Ok5vZGVzJiBwcmV2aW91c19zaWJsaW5nX2ZvbGxvd2luZ19zaWJsaW5nX25vZGVzID0KKyAgICAgICAgcHJldmlvdXNfc2libGluZ19tYXRjaGluZ19zdGF0ZQorICAgICAgICAgICAgPyBwcmV2aW91c19zaWJsaW5nX21hdGNoaW5nX3N0YXRlLT5mb2xsb3dpbmdfc2libGluZ19ub2RlcworICAgICAgICAgICAgOiBlbXB0eV9ub2RlczsKKyAgICBpZiAoR2F0aGVyTm9kZU1vZGlmaWNhdGlvbnNBbmRVcGRhdGVUYXJnZXROb2RlcygKKyAgICAgICAgICAgIHByZXZpb3VzX3NpYmxpbmdfZm9sbG93aW5nX3NpYmxpbmdfbm9kZXMsCisgICAgICAgICAgICAmZWxlbWVudF9tYXRjaGluZ19zdGF0ZS0+cHJldmlvdXNfc2libGluZ19mb2xsb3dpbmdfc2libGluZ19ub2RlcywKKyAgICAgICAgICAgIGFkZGVkX25vZGVzLCByZW1vdmVkX25vZGVzKSkgeworICAgICAgZWxlbWVudF9tYXRjaGluZ19zdGF0ZS0+YXJlX2ZvbGxvd2luZ19zaWJsaW5nX25vZGVzX2RpcnR5ID0gdHJ1ZTsKKyAgICAgIG1hdGNoaW5nX25vZGVzX21vZGlmaWVkIHw9IFVwZGF0ZU1hdGNoaW5nTm9kZXNGcm9tTm9kZU1vZGlmaWNhdGlvbnMoCisgICAgICAgICAgKmFkZGVkX25vZGVzLCAqcmVtb3ZlZF9ub2RlcywgY3Nzb206OmtGb2xsb3dpbmdTaWJsaW5nQ29tYmluYXRvciwKKyAgICAgICAgICBlbGVtZW50LCBzZWxlY3Rvcl90cmVlLT5zY3JhdGNocGFkX25vZGVfcGFpcnMoKSk7CisgICAgfQorICB9CisKKyAgZWxlbWVudF9tYXRjaGluZ19zdGF0ZS0+aXNfc2V0ID0gdHJ1ZTsKKworICAvLyBNYXRjaGluZyBub2RlIG1vZGlmaWNhdGlvbnMgbWF5IGltcGFjdCBjb21iaW5hdG9yIG5vZGVzLCBzbyB0aGV5IG11c3QgYmUKKyAgLy8gZGlydGllZC4gSG93ZXZlciwgdGhleSBhcmUgbGF6aWx5IHVwZGF0ZWQgdGhlIGZpcnN0IHRpbWUgdGhhdCB0aGV5IGFyZQorICAvLyBuZWVkZWQgYnkgYSBjaGlsZC9mb2xsb3dpbmcgc2libGluZywgcmF0aGVyIHRoYW4gaW1tZWRpYXRlbHkgdXBkYXRlZC4gVGhpcworICAvLyBwcmV2ZW50cyB1bm5lY2Vzc2FyeSB1cGRhdGVzIG9mIGxlYWYgZWxlbWVudHMgYW5kIGxhc3Qgc2libGluZyBlbGVtZW50cy4KKyAgaWYgKG1hdGNoaW5nX25vZGVzX21vZGlmaWVkKSB7CisgICAgZWxlbWVudF9tYXRjaGluZ19zdGF0ZS0+YXJlX2Rlc2NlbmRhbnRfbm9kZXNfZGlydHkgPSB0cnVlOworICAgIGVsZW1lbnRfbWF0Y2hpbmdfc3RhdGUtPmFyZV9mb2xsb3dpbmdfc2libGluZ19ub2Rlc19kaXJ0eSA9IHRydWU7CisgIH0KKworICByZXR1cm4gbWF0Y2hpbmdfbm9kZXNfbW9kaWZpZWQ7Cit9CisKK3ZvaWQgVXBkYXRlRWxlbWVudE1hdGNoaW5nUnVsZXNGcm9tUnVsZU1hdGNoaW5nU3RhdGUoSFRNTEVsZW1lbnQqIGVsZW1lbnQpIHsKKyAgRG9jdW1lbnQqIGVsZW1lbnRfZG9jdW1lbnQgPSBlbGVtZW50LT5ub2RlX2RvY3VtZW50KCk7CisKKyAgLy8gU3RvcmUgdGhlIGVsZW1lbnQncyBhbmQgaXRzIHBzZXVkbyBlbGVtZW50J3Mgb2xkIG1hdGNoaW5nIHJ1bGVzIHNvIHRoYXQKKyAgLy8gdGhleSBjYW4gYmUgY29tcGFyZWQgdG8gdGhlIG5ldyBtYXRjaGluZyBydWxlcyBhZnRlciB0aGV5IGFyZSBnZW5lcmF0ZWQuCisgIGNzc29tOjpSdWxlc1dpdGhDYXNjYWRlUHJlY2VkZW5jZSogZWxlbWVudF9vbGRfbWF0Y2hpbmdfcnVsZXMgPQorICAgICAgZWxlbWVudF9kb2N1bWVudC0+c2NyYXRjaHBhZF9odG1sX2VsZW1lbnRfbWF0Y2hpbmdfcnVsZXMoKTsKKyAgKmVsZW1lbnRfb2xkX21hdGNoaW5nX3J1bGVzID0gKmVsZW1lbnQtPm1hdGNoaW5nX3J1bGVzKCk7CisgIGVsZW1lbnQtPm1hdGNoaW5nX3J1bGVzKCktPmNsZWFyKCk7CisKKyAgZm9yIChpbnQgdHlwZSA9IDA7IHR5cGUgPCBrTWF4UHNldWRvRWxlbWVudFR5cGU7ICsrdHlwZSkgeworICAgIFBzZXVkb0VsZW1lbnQqIHBzZXVkb19lbGVtZW50ID0KKyAgICAgICAgZWxlbWVudC0+cHNldWRvX2VsZW1lbnQoUHNldWRvRWxlbWVudFR5cGUodHlwZSkpOworICAgIGlmIChwc2V1ZG9fZWxlbWVudCkgeworICAgICAgY3Nzb206OlJ1bGVzV2l0aENhc2NhZGVQcmVjZWRlbmNlKiBvbGRfcHNldWRvX2VsZW1lbnRfbWF0Y2hpbmdfcnVsZXMgPQorICAgICAgICAgIGVsZW1lbnRfZG9jdW1lbnQtPnNjcmF0Y2hwYWRfcHNldWRvX2VsZW1lbnRfbWF0Y2hpbmdfcnVsZXMoCisgICAgICAgICAgICAgIFBzZXVkb0VsZW1lbnRUeXBlKHR5cGUpKTsKKyAgICAgICpvbGRfcHNldWRvX2VsZW1lbnRfbWF0Y2hpbmdfcnVsZXMgPSAqcHNldWRvX2VsZW1lbnQtPm1hdGNoaW5nX3J1bGVzKCk7CisgICAgICBwc2V1ZG9fZWxlbWVudC0+Q2xlYXJNYXRjaGluZ1J1bGVzKCk7CisgICAgfQorICB9CisKKyAgLy8gV2FsayBhbGwgbWF0Y2hpbmcgbm9kZXMsIGdlbmVyYXRpbmcgbWF0Y2hpbmcgcnVsZXMgZm9yIHRoZSBlbGVtZW50IGFuZAorICAvLyBpdHMgcHNldWRvIGVsZW1lbnRzIGZyb20gdGhlbS4KKyAgZm9yIChjb25zdCBhdXRvJiBub2RlIDogZWxlbWVudC0+cnVsZV9tYXRjaGluZ19zdGF0ZSgpLT5tYXRjaGluZ19ub2RlcykgeworICAgIC8vIERldGVybWluZSB0aGUgbWF0Y2hpbmcgcnVsZXMgdGhhdCB0aGlzIHNwZWNpZmljIG5vZGUgdGFyZ2V0cy4gSWYgdGhlCisgICAgLy8gbm9kZSBkb2VzIG5vdCBoYXZlIGEgcHNldWRvIGVsZW1lbnQsIHRoZW4gdGhpcyB3aWxsIGJlIHRoZSBlbGVtZW50J3MKKyAgICAvLyBtYXRjaGluZyBydWxlczsgb3RoZXJ3aXNlLCBpdCdsbCBiZSB0aGUgbWF0Y2hpbmcgcnVsZXMgYXNzb2NpYXRlZCB3aXRoCisgICAgLy8gdGhlIHBzZXVkbyBlbGVtZW50J3MgdHlwZS4KKyAgICBjc3NvbTo6UnVsZXNXaXRoQ2FzY2FkZVByZWNlZGVuY2UqIHRhcmdldF9tYXRjaGluZ19ydWxlczsKKworICAgIGNzc29tOjpQc2V1ZG9FbGVtZW50KiBwc2V1ZG9fZWxlbWVudCA9CisgICAgICAgIG5vZGUtPmNvbXBvdW5kX3NlbGVjdG9yKCktPnBzZXVkb19lbGVtZW50KCk7CisgICAgaWYgKCFwc2V1ZG9fZWxlbWVudCkgeworICAgICAgdGFyZ2V0X21hdGNoaW5nX3J1bGVzID0gZWxlbWVudC0+bWF0Y2hpbmdfcnVsZXMoKTsKKyAgICB9IGVsc2UgeworICAgICAgUHNldWRvRWxlbWVudFR5cGUgcHNldWRvX2VsZW1lbnRfdHlwZSA9IGtOb3RQc2V1ZG9FbGVtZW50VHlwZTsKKworICAgICAgaWYgKHBzZXVkb19lbGVtZW50LT5Bc0FmdGVyUHNldWRvRWxlbWVudCgpKSB7CisgICAgICAgIHBzZXVkb19lbGVtZW50X3R5cGUgPSBrQWZ0ZXJQc2V1ZG9FbGVtZW50VHlwZTsKKyAgICAgIH0gZWxzZSBpZiAocHNldWRvX2VsZW1lbnQtPkFzQmVmb3JlUHNldWRvRWxlbWVudCgpKSB7CisgICAgICAgIHBzZXVkb19lbGVtZW50X3R5cGUgPSBrQmVmb3JlUHNldWRvRWxlbWVudFR5cGU7CisgICAgICB9IGVsc2UgeworICAgICAgICBOT1RSRUFDSEVEKCk7CisgICAgICB9CisKKyAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgcHNldWRvIGVsZW1lbnQgZXhpc3RzIHVuZGVyIGVsZW1lbnQuIElmIG5vdCwgY3JlYXRlIGl0CisgICAgICAvLyBhbmQgY2xlYXIgb3V0IHRoZSBvbGQgbWF0Y2hpbmcgcnVsZXMgc2luY2UgdGhlIHBzZXVkbyBlbGVtZW50IGhhZCBubworICAgICAgLy8gcHJlLWV4aXN0aW5nIG1hdGNoaW5nIHJ1bGVzLgorICAgICAgaWYgKCFlbGVtZW50LT5wc2V1ZG9fZWxlbWVudChwc2V1ZG9fZWxlbWVudF90eXBlKSkgeworICAgICAgICBlbGVtZW50LT5TZXRQc2V1ZG9FbGVtZW50KAorICAgICAgICAgICAgcHNldWRvX2VsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgIG1ha2Vfc2NvcGVkX3B0cihuZXcgZG9tOjpQc2V1ZG9FbGVtZW50KGVsZW1lbnQpKSk7CisKKyAgICAgICAgY3Nzb206OlJ1bGVzV2l0aENhc2NhZGVQcmVjZWRlbmNlKiBvbGRfcHNldWRvX2VsZW1lbnRfbWF0Y2hpbmdfcnVsZXMgPQorICAgICAgICAgICAgZWxlbWVudF9kb2N1bWVudC0+c2NyYXRjaHBhZF9wc2V1ZG9fZWxlbWVudF9tYXRjaGluZ19ydWxlcygKKyAgICAgICAgICAgICAgICBQc2V1ZG9FbGVtZW50VHlwZShwc2V1ZG9fZWxlbWVudF90eXBlKSk7CisgICAgICAgIG9sZF9wc2V1ZG9fZWxlbWVudF9tYXRjaGluZ19ydWxlcy0+Y2xlYXIoKTsKKyAgICAgIH0KKworICAgICAgdGFyZ2V0X21hdGNoaW5nX3J1bGVzID0KKyAgICAgICAgICBlbGVtZW50LT5wc2V1ZG9fZWxlbWVudChwc2V1ZG9fZWxlbWVudF90eXBlKS0+bWF0Y2hpbmdfcnVsZXMoKTsKKyAgICB9CisKKyAgICAvLyBBZGQgYWxsIG9mIHRoZSBub2RlJ3MgcnVsZXMgdG8gdGhlIHRhcmdldCBtYXRjaGluZyBydWxlcy4KKyAgICBmb3IgKGNvbnN0IGF1dG8mIHdlYWtfcnVsZSA6IG5vZGUtPnJ1bGVzKCkpIHsKKyAgICAgIGNvbnN0IGF1dG8gcnVsZSA9IHdlYWtfcnVsZS5nZXQoKTsKKyAgICAgIGlmICghcnVsZSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIERDSEVDSyhydWxlLT5wYXJlbnRfc3R5bGVfc2hlZXQoKSk7CisgICAgICBjc3NvbTo6Q2FzY2FkZVByZWNlZGVuY2UgcHJlY2VkZW5jZSgKKyAgICAgICAgICBwc2V1ZG9fZWxlbWVudCA/IGNzc29tOjprTm9ybWFsT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICA6IHJ1bGUtPnBhcmVudF9zdHlsZV9zaGVldCgpLT5vcmlnaW4oKSwKKyAgICAgICAgICBub2RlLT5jdW11bGF0aXZlX3NwZWNpZmljaXR5KCksCisgICAgICAgICAgY3Nzb206OkFwcGVhcmFuY2UocnVsZS0+cGFyZW50X3N0eWxlX3NoZWV0KCktPmluZGV4KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZS0+aW5kZXgoKSkpOworICAgICAgdGFyZ2V0X21hdGNoaW5nX3J1bGVzLT5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIocnVsZSwgcHJlY2VkZW5jZSkpOworICAgIH0KKyAgfQorCisgIC8vIENoZWNrIGZvciBpZiB0aGUgbmV3bHkgZ2VuZXJhdGVkIG1hdGNoaW5nIHJ1bGVzIGFyZSBkaWZmZXJlbnQgZm9yIHRoZQorICAvLyBlbGVtZW50IG9yIGl0cyBwc2V1ZG8gZWxlbWVudHMuCisgIGlmICgqZWxlbWVudF9vbGRfbWF0Y2hpbmdfcnVsZXMgIT0gKmVsZW1lbnQtPm1hdGNoaW5nX3J1bGVzKCkpIHsKKyAgICBlbGVtZW50LT5Pbk1hdGNoaW5nUnVsZXNNb2RpZmllZCgpOworICB9CisKKyAgZm9yIChpbnQgdHlwZSA9IDA7IHR5cGUgPCBrTWF4UHNldWRvRWxlbWVudFR5cGU7ICsrdHlwZSkgeworICAgIFBzZXVkb0VsZW1lbnQqIHBzZXVkb19lbGVtZW50ID0KKyAgICAgICAgZWxlbWVudC0+cHNldWRvX2VsZW1lbnQoUHNldWRvRWxlbWVudFR5cGUodHlwZSkpOworICAgIGlmIChwc2V1ZG9fZWxlbWVudCkgeworICAgICAgY3Nzb206OlJ1bGVzV2l0aENhc2NhZGVQcmVjZWRlbmNlKiBvbGRfcHNldWRvX2VsZW1lbnRfbWF0Y2hpbmdfcnVsZXMgPQorICAgICAgICAgIGVsZW1lbnRfZG9jdW1lbnQtPnNjcmF0Y2hwYWRfcHNldWRvX2VsZW1lbnRfbWF0Y2hpbmdfcnVsZXMoCisgICAgICAgICAgICAgIFBzZXVkb0VsZW1lbnRUeXBlKHR5cGUpKTsKKyAgICAgIGlmICgqb2xkX3BzZXVkb19lbGVtZW50X21hdGNoaW5nX3J1bGVzICE9CisgICAgICAgICAgKnBzZXVkb19lbGVtZW50LT5tYXRjaGluZ19ydWxlcygpKSB7CisgICAgICAgIHBzZXVkb19lbGVtZW50LT5zZXRfY29tcHV0ZWRfc3R5bGVfaW52YWxpZCgpOworICAgICAgICBlbGVtZW50LT5PblBzZXVkb0VsZW1lbnRNYXRjaGluZ1J1bGVzTW9kaWZpZWQoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwogfSAgLy8gbmFtZXNwYWNlCiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLyBQdWJsaWMgQVBJcwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotdm9pZCBVcGRhdGVNYXRjaGluZ1J1bGVzKEhUTUxFbGVtZW50KiBjdXJyZW50X2VsZW1lbnQpIHsKLSAgRENIRUNLKGN1cnJlbnRfZWxlbWVudCk7Ci0gIERDSEVDSyhjdXJyZW50X2VsZW1lbnQtPm5vZGVfZG9jdW1lbnQoKSk7Ci0gIFNlbGVjdG9yVHJlZSogc2VsZWN0b3JfdHJlZSA9Ci0gICAgICBjdXJyZW50X2VsZW1lbnQtPm5vZGVfZG9jdW1lbnQoKS0+c2VsZWN0b3JfdHJlZSgpOwotCi0gIC8vIEdldCBwYXJlbnQgYW5kIHByZXZpb3VzIHNpYmxpbmcgb2YgdGhlIGN1cnJlbnQgZWxlbWVudC4KLSAgSFRNTEVsZW1lbnQqIHBhcmVudCA9IGN1cnJlbnRfZWxlbWVudC0+cGFyZW50X2VsZW1lbnQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gY3VycmVudF9lbGVtZW50LT5wYXJlbnRfZWxlbWVudCgpLT5Bc0hUTUxFbGVtZW50KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE5VTEw7Ci0gIEhUTUxFbGVtZW50KiBwcmV2aW91c19zaWJsaW5nID0KLSAgICAgIGN1cnJlbnRfZWxlbWVudC0+cHJldmlvdXNfZWxlbWVudF9zaWJsaW5nKCkKLSAgICAgICAgICA/IGN1cnJlbnRfZWxlbWVudC0+cHJldmlvdXNfZWxlbWVudF9zaWJsaW5nKCktPkFzSFRNTEVsZW1lbnQoKQotICAgICAgICAgIDogTlVMTDsKLQotICAvLyBDYWxjdWxhdGUgY3VycmVudCBlbGVtZW50J3MgbWF0Y2hpbmcgbm9kZXMuCi0KLSAgaWYgKHBhcmVudCkgewotICAgIC8vIENoaWxkIGNvbWJpbmF0b3IuCi0gICAgRm9yRWFjaENoaWxkT25Ob2RlcyhwYXJlbnQtPnJ1bGVfbWF0Y2hpbmdfc3RhdGUoKS0+bWF0Y2hpbmdfbm9kZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBjc3NvbTo6a0NoaWxkQ29tYmluYXRvciwgY3VycmVudF9lbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZCgmQWRkUnVsZXNPbk5vZGVUb0VsZW1lbnQpKTsKLQotICAgIC8vIERlc2NlbmRhbnQgY29tYmluYXRvci4KLSAgICBGb3JFYWNoQ2hpbGRPbk5vZGVzKAotICAgICAgICBwYXJlbnQtPnJ1bGVfbWF0Y2hpbmdfc3RhdGUoKS0+ZGVzY2VuZGFudF9wb3RlbnRpYWxfbm9kZXMsCi0gICAgICAgIGNzc29tOjprRGVzY2VuZGFudENvbWJpbmF0b3IsIGN1cnJlbnRfZWxlbWVudCwKLSAgICAgICAgYmFzZTo6QmluZCgmQWRkUnVsZXNPbk5vZGVUb0VsZW1lbnQpKTsKLSAgfSBlbHNlIHsKLSAgICAvLyBEZXNjZW5kYW50IGNvbWJpbmF0b3IgZnJvbSByb290LgotICAgIEZvckVhY2hDaGlsZE9uTm9kZXMoc2VsZWN0b3JfdHJlZS0+cm9vdF9zZXQoKSwgY3Nzb206OmtEZXNjZW5kYW50Q29tYmluYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfZWxlbWVudCwgYmFzZTo6QmluZCgmQWRkUnVsZXNPbk5vZGVUb0VsZW1lbnQpKTsKK3ZvaWQgVXBkYXRlRWxlbWVudE1hdGNoaW5nUnVsZXMoSFRNTEVsZW1lbnQqIGVsZW1lbnQpIHsKKyAgRENIRUNLKGVsZW1lbnQpOworICBEQ0hFQ0soZWxlbWVudC0+bm9kZV9kb2N1bWVudCgpKTsKKyAgaWYgKGVsZW1lbnQtPm1hdGNoaW5nX3J1bGVzX3ZhbGlkKCkpIHsKKyAgICByZXR1cm47CiAgIH0KIAotICBpZiAoc2VsZWN0b3JfdHJlZS0+aGFzX3NpYmxpbmdfY29tYmluYXRvcnMoKSkgewotICAgIGlmIChwcmV2aW91c19zaWJsaW5nKSB7Ci0gICAgICAvLyBOZXh0IHNpYmxpbmcgY29tYmluYXRvci4KLSAgICAgIEZvckVhY2hDaGlsZE9uTm9kZXMoCi0gICAgICAgICAgcHJldmlvdXNfc2libGluZy0+cnVsZV9tYXRjaGluZ19zdGF0ZSgpLT5tYXRjaGluZ19ub2RlcywKLSAgICAgICAgICBjc3NvbTo6a05leHRTaWJsaW5nQ29tYmluYXRvciwgY3VycmVudF9lbGVtZW50LAotICAgICAgICAgIGJhc2U6OkJpbmQoJkFkZFJ1bGVzT25Ob2RlVG9FbGVtZW50KSk7Ci0KLSAgICAgIC8vIEZvbGxvd2luZyBzaWJsaW5nIGNvbWJpbmF0b3IuCi0gICAgICBGb3JFYWNoQ2hpbGRPbk5vZGVzKHByZXZpb3VzX3NpYmxpbmctPnJ1bGVfbWF0Y2hpbmdfc3RhdGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5mb2xsb3dpbmdfc2libGluZ19wb3RlbnRpYWxfbm9kZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNzc29tOjprRm9sbG93aW5nU2libGluZ0NvbWJpbmF0b3IsIGN1cnJlbnRfZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6QmluZCgmQWRkUnVsZXNPbk5vZGVUb0VsZW1lbnQpKTsKLSAgICB9CisgIC8vIE9ubHkgdXBkYXRlIHRoZSBtYXRjaGluZyBydWxlcyBpZiB0aGUgcnVsZSBtYXRjaGluZyBzdGF0ZSBpcyBtb2RpZmllZC4KKyAgaWYgKFVwZGF0ZUVsZW1lbnRSdWxlTWF0Y2hpbmdTdGF0ZShlbGVtZW50KSkgeworICAgIFVwZGF0ZUVsZW1lbnRNYXRjaGluZ1J1bGVzRnJvbVJ1bGVNYXRjaGluZ1N0YXRlKGVsZW1lbnQpOwogICB9CiAKLSAgLy8gQ2FsY3VsYXRlIGN1cnJlbnQgZWxlbWVudCdzIGRlc2NlbmRhbnQgcG90ZW50aWFsIG5vZGVzLgotICBpZiAocGFyZW50KSB7Ci0gICAgY3VycmVudF9lbGVtZW50LT5ydWxlX21hdGNoaW5nX3N0YXRlKCktPmRlc2NlbmRhbnRfcG90ZW50aWFsX25vZGVzLmluc2VydCgKLSAgICAgICAgcGFyZW50LT5ydWxlX21hdGNoaW5nX3N0YXRlKCktPmRlc2NlbmRhbnRfcG90ZW50aWFsX25vZGVzLmJlZ2luKCksCi0gICAgICAgIHBhcmVudC0+cnVsZV9tYXRjaGluZ19zdGF0ZSgpLT5kZXNjZW5kYW50X3BvdGVudGlhbF9ub2Rlcy5lbmQoKSk7Ci0gIH0gZWxzZSB7Ci0gICAgY3VycmVudF9lbGVtZW50LT5ydWxlX21hdGNoaW5nX3N0YXRlKCktPmRlc2NlbmRhbnRfcG90ZW50aWFsX25vZGVzLmluc2VydCgKLSAgICAgICAgc2VsZWN0b3JfdHJlZS0+cm9vdCgpKTsKLSAgfQotICAvLyBXYWxrIGFsbCBvZiB0aGUgbWF0Y2hpbmcgbm9kZXMsIGFkZGluZyBhbnkgdGhhdCBoYXZlIGEgZGVzY2VuZGFudAotICAvLyBjb21iaW5hdG9yIGFzIGEgZGVzY2VuZGFudCBwb3RlbnRpYWwgbm9kZS4gQW55IG1pc3NpbmcgdGhhdCBjb21iaW5hdG9yIGNhbgotICAvLyBuZXZlciBtYXRjaCBkZXNjZW5kYW50cy4KLSAgZm9yIChkb206OkhUTUxFbGVtZW50OjpNYXRjaGluZ05vZGVzOjpjb25zdF9pdGVyYXRvciBpdGVyID0KLSAgICAgICAgICAgY3VycmVudF9lbGVtZW50LT5ydWxlX21hdGNoaW5nX3N0YXRlKCktPm1hdGNoaW5nX25vZGVzLmJlZ2luKCk7Ci0gICAgICAgaXRlciAhPSBjdXJyZW50X2VsZW1lbnQtPnJ1bGVfbWF0Y2hpbmdfc3RhdGUoKS0+bWF0Y2hpbmdfbm9kZXMuZW5kKCk7Ci0gICAgICAgKytpdGVyKSB7Ci0gICAgaWYgKCgqaXRlciktPkhhc0NvbWJpbmF0b3IoY3Nzb206OmtEZXNjZW5kYW50Q29tYmluYXRvcikpIHsKLSAgICAgIC8vIEl0IGlzIHBvc3NpYmxlIGZvciB0aGUgdHdvIGxpc3RzIHRvIGNvbnRhaW4gZHVwbGljYXRlIG5vZGVzLCBzbyBvbmx5Ci0gICAgICAvLyBhZGQgdGhlIG5vZGUgaWYgaXQgaXNuJ3QgYSBkdXBsaWNhdGUuCi0gICAgICBjdXJyZW50X2VsZW1lbnQtPnJ1bGVfbWF0Y2hpbmdfc3RhdGUoKS0+ZGVzY2VuZGFudF9wb3RlbnRpYWxfbm9kZXMuaW5zZXJ0KAotICAgICAgICAgICppdGVyLCB0cnVlIC8qY2hlY2tfZm9yX2R1cGxpY2F0ZSovKTsKLSAgICB9Ci0gIH0KLQotICAvLyBDYWxjdWxhdGUgY3VycmVudCBlbGVtZW50J3MgZm9sbG93aW5nIHNpYmxpbmcgcG90ZW50aWFsIG5vZGVzLgotICBpZiAoc2VsZWN0b3JfdHJlZS0+aGFzX3NpYmxpbmdfY29tYmluYXRvcnMoKSkgewotICAgIGlmIChwcmV2aW91c19zaWJsaW5nKSB7Ci0gICAgICBjdXJyZW50X2VsZW1lbnQtPnJ1bGVfbWF0Y2hpbmdfc3RhdGUoKQotICAgICAgICAgIC0+Zm9sbG93aW5nX3NpYmxpbmdfcG90ZW50aWFsX25vZGVzLmluc2VydCgKLSAgICAgICAgICAgICAgcHJldmlvdXNfc2libGluZy0+cnVsZV9tYXRjaGluZ19zdGF0ZSgpCi0gICAgICAgICAgICAgICAgICAtPmZvbGxvd2luZ19zaWJsaW5nX3BvdGVudGlhbF9ub2Rlcy5iZWdpbigpLAotICAgICAgICAgICAgICBwcmV2aW91c19zaWJsaW5nLT5ydWxlX21hdGNoaW5nX3N0YXRlKCkKLSAgICAgICAgICAgICAgICAgIC0+Zm9sbG93aW5nX3NpYmxpbmdfcG90ZW50aWFsX25vZGVzLmVuZCgpKTsKLSAgICB9Ci0gICAgLy8gV2FsayBhbGwgb2YgdGhlIG1hdGNoaW5nIG5vZGVzLCBhZGRpbmcgYW55IHRoYXQgaGF2ZSBhIGZvbGxvd2luZyBzaWJsaW5nCi0gICAgLy8gY29tYmluYXRvciBhcyBhIGZvbGxvd2luZyBzaWJsaW5nIHBvdGVudGlhbCBub2RlLiBBbnkgbWlzc2luZyB0aGF0Ci0gICAgLy8gY29tYmluYXRvciBjYW4gbmV2ZXIgbWF0Y2ggZm9sbG93aW5nIHNpYmxpbmdzLi4KLSAgICBmb3IgKGRvbTo6SFRNTEVsZW1lbnQ6Ok1hdGNoaW5nTm9kZXM6OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPQotICAgICAgICAgICAgIGN1cnJlbnRfZWxlbWVudC0+cnVsZV9tYXRjaGluZ19zdGF0ZSgpLT5tYXRjaGluZ19ub2Rlcy5iZWdpbigpOwotICAgICAgICAgaXRlciAhPSBjdXJyZW50X2VsZW1lbnQtPnJ1bGVfbWF0Y2hpbmdfc3RhdGUoKS0+bWF0Y2hpbmdfbm9kZXMuZW5kKCk7Ci0gICAgICAgICArK2l0ZXIpIHsKLSAgICAgIGlmICgoKml0ZXIpLT5IYXNDb21iaW5hdG9yKGNzc29tOjprRm9sbG93aW5nU2libGluZ0NvbWJpbmF0b3IpKSB7Ci0gICAgICAgIC8vIEl0IGlzIHBvc3NpYmxlIGZvciB0aGUgdHdvIGxpc3RzIHRvIGNvbnRhaW4gZHVwbGljYXRlIG5vZGVzLCBzbyBvbmx5Ci0gICAgICAgIC8vIGFkZCB0aGUgbm9kZSBpZiBpdCBpc24ndCBhIGR1cGxpY2F0ZS4KLSAgICAgICAgY3VycmVudF9lbGVtZW50LT5ydWxlX21hdGNoaW5nX3N0YXRlKCkKLSAgICAgICAgICAgIC0+Zm9sbG93aW5nX3NpYmxpbmdfcG90ZW50aWFsX25vZGVzLmluc2VydCgKLSAgICAgICAgICAgICAgICAqaXRlciwgdHJ1ZSAvKmNoZWNrX2Zvcl9kdXBsaWNhdGUqLyk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgY3VycmVudF9lbGVtZW50LT5zZXRfbWF0Y2hpbmdfcnVsZXNfdmFsaWQoKTsKKyAgZWxlbWVudC0+c2V0X21hdGNoaW5nX3J1bGVzX3ZhbGlkKCk7CiB9CiAKIHNjb3BlZF9yZWZwdHI8RWxlbWVudD4gUXVlcnlTZWxlY3RvcihOb2RlKiBub2RlLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VsZWN0b3JzLApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vcnVsZV9tYXRjaGluZy5oIGIvc3JjL2NvYmFsdC9kb20vcnVsZV9tYXRjaGluZy5oCmluZGV4IDMxZDIzNTMuLjZmNWZjMzEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL3J1bGVfbWF0Y2hpbmcuaAorKysgYi9zcmMvY29iYWx0L2RvbS9ydWxlX21hdGNoaW5nLmgKQEAgLTM3LDcgKzM3LDcgQEAKIC8vIFVwZGF0ZXMgdGhlIG1hdGNoaW5nIHJ1bGVzIG9uIGFuIGVsZW1lbnQuIFRoZSBwYXJlbnQgYW5kIHByZXZpb3VzIHNpYmxpbmcKIC8vIG5lZWQgdG8gaGF2ZSB0aGVpciBtYXRjaGluZyBydWxlcyB1cGRhdGVkIGJlZm9yZSwgc2luY2UgdGhlIGN1cnJlbnQgZWxlbWVudCdzCiAvLyBydWxlIG1hdGNoaW5nIHdpbGwgZGVwZW5kIG9uIHRoZWlyIHJ1bGUgbWF0Y2hpbmcgc3RhdGVzLgotdm9pZCBVcGRhdGVNYXRjaGluZ1J1bGVzKEhUTUxFbGVtZW50KiBjdXJyZW50X2VsZW1lbnQpOwordm9pZCBVcGRhdGVFbGVtZW50TWF0Y2hpbmdSdWxlcyhIVE1MRWxlbWVudCogY3VycmVudF9lbGVtZW50KTsKIAogLy8gUmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgc3VidHJlZSB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIHNlbGVjdG9yLgogc2NvcGVkX3JlZnB0cjxFbGVtZW50PiBRdWVyeVNlbGVjdG9yKE5vZGUqIG5vZGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWxlY3RvcnMsCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9ydWxlX21hdGNoaW5nX3Rlc3QuY2MgYi9zcmMvY29iYWx0L2RvbS9ydWxlX21hdGNoaW5nX3Rlc3QuY2MKaW5kZXggZTU4NjQ3NS4uMDcxMzZkNyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vcnVsZV9tYXRjaGluZ190ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL3J1bGVfbWF0Y2hpbmdfdGVzdC5jYwpAQCAtNDMsMTAgKzQzLDEwIEBACiAgICAgICA6IGNzc19wYXJzZXJfKGNzc19wYXJzZXI6OlBhcnNlcjo6Q3JlYXRlKCkpLAogICAgICAgICBkb21fcGFyc2VyXyhuZXcgZG9tX3BhcnNlcjo6UGFyc2VyKCkpLAogICAgICAgICBkb21fc3RhdF90cmFja2VyXyhuZXcgRG9tU3RhdFRyYWNrZXIoIlJ1bGVNYXRjaGluZ1Rlc3QiKSksCi0gICAgICAgIGh0bWxfZWxlbWVudF9jb250ZXh0XyhOVUxMLCBjc3NfcGFyc2VyXy5nZXQoKSwgZG9tX3BhcnNlcl8uZ2V0KCksIE5VTEwsCisgICAgICAgIGh0bWxfZWxlbWVudF9jb250ZXh0XyhOVUxMLCBOVUxMLCBjc3NfcGFyc2VyXy5nZXQoKSwgZG9tX3BhcnNlcl8uZ2V0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgZG9tX3N0YXRfdHJhY2tlcl8uZ2V0KCksICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6a0FwcGxpY2F0aW9uU3RhdGVTdGFydGVkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIGRvbV9zdGF0X3RyYWNrZXJfLmdldCgpLCAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OmtBcHBsaWNhdGlvblN0YXRlU3RhcnRlZCwgTlVMTCksCiAgICAgICAgIGRvY3VtZW50XyhuZXcgRG9jdW1lbnQoJmh0bWxfZWxlbWVudF9jb250ZXh0XykpLAogICAgICAgICByb290Xyhkb2N1bWVudF8tPkNyZWF0ZUVsZW1lbnQoImh0bWwiKS0+QXNIVE1MRWxlbWVudCgpKSwKICAgICAgICAgaGVhZF8oZG9jdW1lbnRfLT5DcmVhdGVFbGVtZW50KCJoZWFkIiktPkFzSFRNTEVsZW1lbnQoKSksCkBAIC04Myw3ICs4Myw3IEBACiAgIHdoaWxlIChjaGlsZCkgewogICAgIGlmIChjaGlsZC0+QXNFbGVtZW50KCkpIHsKICAgICAgIERDSEVDSyhjaGlsZC0+QXNFbGVtZW50KCktPkFzSFRNTEVsZW1lbnQoKSk7Ci0gICAgICBVcGRhdGVNYXRjaGluZ1J1bGVzKGNoaWxkLT5Bc0VsZW1lbnQoKS0+QXNIVE1MRWxlbWVudCgpKTsKKyAgICAgIFVwZGF0ZUVsZW1lbnRNYXRjaGluZ1J1bGVzKGNoaWxkLT5Bc0VsZW1lbnQoKS0+QXNIVE1MRWxlbWVudCgpKTsKICAgICB9CiAgICAgY2hpbGQgPSBpdGVyYXRvci5OZXh0KCk7CiAgIH0KQEAgLTU5MSw3ICs1OTEsNyBAQAogICAgICAgICAgICAgKCptYXRjaGluZ19ydWxlcylbMF0uZmlyc3QpOwogfQogCi0vLyAic3BhbiArIHNwYW4iIHNob3VsZG0ndCBtYXRjaCBmaXJzdCBzcGFuIGluIDxzcGFuLz48c3Bhbi8+LgorLy8gInNwYW4gKyBzcGFuIiBzaG91bGRuJ3QgbWF0Y2ggZmlyc3Qgc3BhbiBpbiA8c3Bhbi8+PHNwYW4vPi4KIFRFU1RfRihSdWxlTWF0Y2hpbmdUZXN0LCBDb21wbGV4U2VsZWN0b3JOZXh0U2libGluZ0NvbWJpbmF0b3JOb01hdGNoKSB7CiAgIGhlYWRfLT5zZXRfaW5uZXJfaHRtbCgiPHN0eWxlPnNwYW4gKyBzcGFuIHt9PC9zdHlsZT4iKTsKICAgYm9keV8tPnNldF9pbm5lcl9odG1sKCI8c3Bhbi8+PHNwYW4vPiIpOwpAQCAtODY4LDUgKzg2OCwzODUgQEAKICAgICAgICAgICAgICgqbWF0Y2hpbmdfcnVsZXMpWzBdLmZpcnN0KTsKIH0KIAorLy8gZGl2OmhvdmVyIHNob3VsZCBtYXRjaCBhZnRlciBob3ZlciBhZGRlZCB0byBlbGVtZW50LgorVEVTVF9GKFJ1bGVNYXRjaGluZ1Rlc3QsIEhvdmVyUHNldWRvQ2xhc3NTZWxlY3RvckFkZEhvdmVyVG9FbGVtZW50KSB7CisgIGhlYWRfLT5zZXRfaW5uZXJfaHRtbCgiPHN0eWxlPmRpdjpob3ZlciB7fTwvc3R5bGU+Iik7CisgIGJvZHlfLT5zZXRfaW5uZXJfaHRtbCgiPGRpdi8+Iik7CisKKyAgZG9jdW1lbnRfLT5TZXRJbmRpY2F0ZWRFbGVtZW50KGJvZHlfLT5maXJzdF9lbGVtZW50X2NoaWxkKCktPkFzSFRNTEVsZW1lbnQoKSk7CisKKyAgVXBkYXRlQWxsTWF0Y2hpbmdSdWxlcygpOworCisgIGNzc29tOjpSdWxlc1dpdGhDYXNjYWRlUHJlY2VkZW5jZSogbWF0Y2hpbmdfcnVsZXMgPQorICAgICAgYm9keV8tPmZpcnN0X2VsZW1lbnRfY2hpbGQoKS0+QXNIVE1MRWxlbWVudCgpLT5tYXRjaGluZ19ydWxlcygpOworICBBU1NFUlRfRVEoMSwgbWF0Y2hpbmdfcnVsZXMtPnNpemUoKSk7CisgIEVYUEVDVF9FUShHZXREb2N1bWVudFN0eWxlU2hlZXQoMCktPmNzc19ydWxlc19zYW1lX29yaWdpbigpLT5JdGVtKDApLAorICAgICAgICAgICAgKCptYXRjaGluZ19ydWxlcylbMF0uZmlyc3QpOworCisgIGRvY3VtZW50Xy0+U2V0SW5kaWNhdGVkRWxlbWVudChOVUxMKTsKKworICBVcGRhdGVBbGxNYXRjaGluZ1J1bGVzKCk7CisKKyAgQVNTRVJUX0VRKDAsIG1hdGNoaW5nX3J1bGVzLT5zaXplKCkpOworfQorCisvLyBkaXY6aG92ZXIgc2hvdWxkIG5vdCBtYXRjaCBhZnRlciBob3ZlciByZW1vdmVkIGZyb20gZWxlbWVudC4KK1RFU1RfRihSdWxlTWF0Y2hpbmdUZXN0LCBIb3ZlclBzZXVkb0NsYXNzU2VsZWN0b3JSZW1vdmVIb3ZlckZyb21FbGVtZW50KSB7CisgIGhlYWRfLT5zZXRfaW5uZXJfaHRtbCgiPHN0eWxlPmRpdjpob3ZlciB7fTwvc3R5bGU+Iik7CisgIGJvZHlfLT5zZXRfaW5uZXJfaHRtbCgiPGRpdi8+Iik7CisKKyAgVXBkYXRlQWxsTWF0Y2hpbmdSdWxlcygpOworCisgIGNzc29tOjpSdWxlc1dpdGhDYXNjYWRlUHJlY2VkZW5jZSogbWF0Y2hpbmdfcnVsZXMgPQorICAgICAgYm9keV8tPmZpcnN0X2VsZW1lbnRfY2hpbGQoKS0+QXNIVE1MRWxlbWVudCgpLT5tYXRjaGluZ19ydWxlcygpOworICBBU1NFUlRfRVEoMCwgbWF0Y2hpbmdfcnVsZXMtPnNpemUoKSk7CisKKyAgZG9jdW1lbnRfLT5TZXRJbmRpY2F0ZWRFbGVtZW50KGJvZHlfLT5maXJzdF9lbGVtZW50X2NoaWxkKCktPkFzSFRNTEVsZW1lbnQoKSk7CisKKyAgVXBkYXRlQWxsTWF0Y2hpbmdSdWxlcygpOworCisgIEFTU0VSVF9FUSgxLCBtYXRjaGluZ19ydWxlcy0+c2l6ZSgpKTsKKyAgRVhQRUNUX0VRKEdldERvY3VtZW50U3R5bGVTaGVldCgwKS0+Y3NzX3J1bGVzX3NhbWVfb3JpZ2luKCktPkl0ZW0oMCksCisgICAgICAgICAgICAoKm1hdGNoaW5nX3J1bGVzKVswXS5maXJzdCk7Cit9CisKKy8vIGRpdjpob3ZlciBzaG91bGQgbWF0Y2ggYWZ0ZXIgaG92ZXIgYWRkZWQgdG8gZWxlbWVudCdzIGRlc2NlbmRhbnQuCitURVNUX0YoUnVsZU1hdGNoaW5nVGVzdCwgSG92ZXJQc2V1ZG9DbGFzc1NlbGVjdG9yQWRkSG92ZXJUb0Rlc2NlbmRhbnQpIHsKKyAgaGVhZF8tPnNldF9pbm5lcl9odG1sKCI8c3R5bGU+ZGl2OmhvdmVyIHt9PC9zdHlsZT4iKTsKKyAgYm9keV8tPnNldF9pbm5lcl9odG1sKCI8ZGl2PjxzcGFuLz48L2Rpdj4iKTsKKworICBkb2N1bWVudF8tPlNldEluZGljYXRlZEVsZW1lbnQoCisgICAgICBib2R5Xy0+Zmlyc3RfZWxlbWVudF9jaGlsZCgpLT5maXJzdF9lbGVtZW50X2NoaWxkKCktPkFzSFRNTEVsZW1lbnQoKSk7CisKKyAgVXBkYXRlQWxsTWF0Y2hpbmdSdWxlcygpOworCisgIGNzc29tOjpSdWxlc1dpdGhDYXNjYWRlUHJlY2VkZW5jZSogbWF0Y2hpbmdfcnVsZXMgPQorICAgICAgYm9keV8tPmZpcnN0X2VsZW1lbnRfY2hpbGQoKS0+QXNIVE1MRWxlbWVudCgpLT5tYXRjaGluZ19ydWxlcygpOworICBBU1NFUlRfRVEoMSwgbWF0Y2hpbmdfcnVsZXMtPnNpemUoKSk7CisgIEVYUEVDVF9FUShHZXREb2N1bWVudFN0eWxlU2hlZXQoMCktPmNzc19ydWxlc19zYW1lX29yaWdpbigpLT5JdGVtKDApLAorICAgICAgICAgICAgKCptYXRjaGluZ19ydWxlcylbMF0uZmlyc3QpOworCisgIGRvY3VtZW50Xy0+U2V0SW5kaWNhdGVkRWxlbWVudChOVUxMKTsKKworICBVcGRhdGVBbGxNYXRjaGluZ1J1bGVzKCk7CisKKyAgQVNTRVJUX0VRKDAsIG1hdGNoaW5nX3J1bGVzLT5zaXplKCkpOworfQorCisvLyBkaXY6aG92ZXIgc2hvdWxkIG5vdCBtYXRjaCBhZnRlciBob3ZlciByZW1vdmVkIGZyb20gZWxlbWVudCdzIGRlc2NlbmRhbnQuCitURVNUX0YoUnVsZU1hdGNoaW5nVGVzdCwgSG92ZXJQc2V1ZG9DbGFzc1NlbGVjdG9yUmVtb3ZlSG92ZXJGcm9tRGVzY2VuZGFudCkgeworICBoZWFkXy0+c2V0X2lubmVyX2h0bWwoIjxzdHlsZT5kaXY6aG92ZXIge308L3N0eWxlPiIpOworICBib2R5Xy0+c2V0X2lubmVyX2h0bWwoIjxkaXY+PHNwYW4vPjwvZGl2PiIpOworCisgIFVwZGF0ZUFsbE1hdGNoaW5nUnVsZXMoKTsKKworICBjc3NvbTo6UnVsZXNXaXRoQ2FzY2FkZVByZWNlZGVuY2UqIG1hdGNoaW5nX3J1bGVzID0KKyAgICAgIGJvZHlfLT5maXJzdF9lbGVtZW50X2NoaWxkKCktPkFzSFRNTEVsZW1lbnQoKS0+bWF0Y2hpbmdfcnVsZXMoKTsKKyAgQVNTRVJUX0VRKDAsIG1hdGNoaW5nX3J1bGVzLT5zaXplKCkpOworCisgIGRvY3VtZW50Xy0+U2V0SW5kaWNhdGVkRWxlbWVudCgKKyAgICAgIGJvZHlfLT5maXJzdF9lbGVtZW50X2NoaWxkKCktPmZpcnN0X2VsZW1lbnRfY2hpbGQoKS0+QXNIVE1MRWxlbWVudCgpKTsKKworICBVcGRhdGVBbGxNYXRjaGluZ1J1bGVzKCk7CisKKyAgQVNTRVJUX0VRKDEsIG1hdGNoaW5nX3J1bGVzLT5zaXplKCkpOworICBFWFBFQ1RfRVEoR2V0RG9jdW1lbnRTdHlsZVNoZWV0KDApLT5jc3NfcnVsZXNfc2FtZV9vcmlnaW4oKS0+SXRlbSgwKSwKKyAgICAgICAgICAgICgqbWF0Y2hpbmdfcnVsZXMpWzBdLmZpcnN0KTsKK30KKworLy8gLm15LWNsYXNzIHNob3VsZCBtYXRjaCBhZnRlciBjbGFzcyAibXktY2xhc3MiIHNldCBvbiBlbGVtZW50LgorVEVTVF9GKFJ1bGVNYXRjaGluZ1Rlc3QsIENsYXNzU2VsZWN0b3JTZXRDbGFzc09uRWxlbWVudCkgeworICBoZWFkXy0+c2V0X2lubmVyX2h0bWwoIjxzdHlsZT4ubXktY2xhc3Mge308L3N0eWxlPiIpOworICBib2R5Xy0+c2V0X2lubmVyX2h0bWwoIjxkaXYgY2xhc3M9XCJvdGhlci1jbGFzc1wiLz4iKTsKKworICBVcGRhdGVBbGxNYXRjaGluZ1J1bGVzKCk7CisKKyAgY3Nzb206OlJ1bGVzV2l0aENhc2NhZGVQcmVjZWRlbmNlKiBtYXRjaGluZ19ydWxlcyA9CisgICAgICBib2R5Xy0+Zmlyc3RfZWxlbWVudF9jaGlsZCgpLT5Bc0hUTUxFbGVtZW50KCktPm1hdGNoaW5nX3J1bGVzKCk7CisgIEFTU0VSVF9FUSgwLCBtYXRjaGluZ19ydWxlcy0+c2l6ZSgpKTsKKworICBib2R5Xy0+Zmlyc3RfZWxlbWVudF9jaGlsZCgpLT5Bc0hUTUxFbGVtZW50KCktPnNldF9jbGFzc19uYW1lKCJteS1jbGFzcyIpOworCisgIFVwZGF0ZUFsbE1hdGNoaW5nUnVsZXMoKTsKKworICBBU1NFUlRfRVEoMSwgbWF0Y2hpbmdfcnVsZXMtPnNpemUoKSk7CisgIEVYUEVDVF9FUShHZXREb2N1bWVudFN0eWxlU2hlZXQoMCktPmNzc19ydWxlc19zYW1lX29yaWdpbigpLT5JdGVtKDApLAorICAgICAgICAgICAgKCptYXRjaGluZ19ydWxlcylbMF0uZmlyc3QpOworfQorCisvLyAubXktY2xhc3Mgc2hvdWxkIG5vdCBtYXRjaCBhZnRlciBjbGFzcyByZW1vdmVkIGZyb20gZWxlbWVudC4KK1RFU1RfRihSdWxlTWF0Y2hpbmdUZXN0LCBDbGFzc1NlbGVjdG9yUmVtb3ZlQ2xhc3NPbkVsZW1lbnQpIHsKKyAgaGVhZF8tPnNldF9pbm5lcl9odG1sKCI8c3R5bGU+Lm15LWNsYXNzIHt9PC9zdHlsZT4iKTsKKyAgYm9keV8tPnNldF9pbm5lcl9odG1sKCI8ZGl2IGNsYXNzPVwibXktY2xhc3NcIi8+Iik7CisKKyAgVXBkYXRlQWxsTWF0Y2hpbmdSdWxlcygpOworCisgIGNzc29tOjpSdWxlc1dpdGhDYXNjYWRlUHJlY2VkZW5jZSogbWF0Y2hpbmdfcnVsZXMgPQorICAgICAgYm9keV8tPmZpcnN0X2VsZW1lbnRfY2hpbGQoKS0+QXNIVE1MRWxlbWVudCgpLT5tYXRjaGluZ19ydWxlcygpOworICBBU1NFUlRfRVEoMSwgbWF0Y2hpbmdfcnVsZXMtPnNpemUoKSk7CisgIEVYUEVDVF9FUShHZXREb2N1bWVudFN0eWxlU2hlZXQoMCktPmNzc19ydWxlc19zYW1lX29yaWdpbigpLT5JdGVtKDApLAorICAgICAgICAgICAgKCptYXRjaGluZ19ydWxlcylbMF0uZmlyc3QpOworCisgIGJvZHlfLT5maXJzdF9lbGVtZW50X2NoaWxkKCktPkFzSFRNTEVsZW1lbnQoKS0+UmVtb3ZlQXR0cmlidXRlKCJjbGFzcyIpOworCisgIFVwZGF0ZUFsbE1hdGNoaW5nUnVsZXMoKTsKKworICBBU1NFUlRfRVEoMCwgbWF0Y2hpbmdfcnVsZXMtPnNpemUoKSk7Cit9CisKKy8vIENoaWxkIHNob3VsZCBhZGQgbWF0Y2hpbmcgcnVsZSBmcm9tIG5ld2x5IGFkZGVkIG1hdGNoaW5nIG5vZGUuCitURVNUX0YoUnVsZU1hdGNoaW5nVGVzdCwgQ2hpbGRNYXRjaGluZ05vZGVBZGRlZCkgeworICBoZWFkXy0+c2V0X2lubmVyX2h0bWwoIjxzdHlsZT5kaXYubXktY2xhc3MgPiBkaXYge308L3N0eWxlPiIpOworICBib2R5Xy0+c2V0X2lubmVyX2h0bWwoIjxkaXYgY2xhc3M9XCJvdGhlci1jbGFzc1wiPjxkaXYvPjwvZGl2PiIpOworCisgIFVwZGF0ZUFsbE1hdGNoaW5nUnVsZXMoKTsKKworICBjc3NvbTo6UnVsZXNXaXRoQ2FzY2FkZVByZWNlZGVuY2UqIG1hdGNoaW5nX3J1bGVzID0KKyAgICAgIGJvZHlfLT5maXJzdF9lbGVtZW50X2NoaWxkKCkKKyAgICAgICAgICAtPmZpcnN0X2VsZW1lbnRfY2hpbGQoKQorICAgICAgICAgIC0+QXNIVE1MRWxlbWVudCgpCisgICAgICAgICAgLT5tYXRjaGluZ19ydWxlcygpOworICBBU1NFUlRfRVEoMCwgbWF0Y2hpbmdfcnVsZXMtPnNpemUoKSk7CisKKyAgYm9keV8tPmZpcnN0X2VsZW1lbnRfY2hpbGQoKS0+QXNIVE1MRWxlbWVudCgpLT5zZXRfY2xhc3NfbmFtZSgibXktY2xhc3MiKTsKKworICBVcGRhdGVBbGxNYXRjaGluZ1J1bGVzKCk7CisKKyAgQVNTRVJUX0VRKDEsIG1hdGNoaW5nX3J1bGVzLT5zaXplKCkpOworICBFWFBFQ1RfRVEoR2V0RG9jdW1lbnRTdHlsZVNoZWV0KDApLT5jc3NfcnVsZXNfc2FtZV9vcmlnaW4oKS0+SXRlbSgwKSwKKyAgICAgICAgICAgICgqbWF0Y2hpbmdfcnVsZXMpWzBdLmZpcnN0KTsKK30KKworLy8gQ2hpbGQgc2hvdWxkIHJlbW92ZSBtYXRjaGluZyBydWxlIGZyb20gbmV3bHkgcmVtb3ZlZCBtYXRjaGluZyBub2RlLgorVEVTVF9GKFJ1bGVNYXRjaGluZ1Rlc3QsIENoaWxkTWF0Y2hpbmdOb2RlUmVtb3ZlZCkgeworICBoZWFkXy0+c2V0X2lubmVyX2h0bWwoIjxzdHlsZT5kaXYubXktY2xhc3MgPiBkaXYge308L3N0eWxlPiIpOworICBib2R5Xy0+c2V0X2lubmVyX2h0bWwoIjxkaXYgY2xhc3M9XCJteS1jbGFzc1wiPjxkaXYvPjwvZGl2PiIpOworCisgIFVwZGF0ZUFsbE1hdGNoaW5nUnVsZXMoKTsKKworICBjc3NvbTo6UnVsZXNXaXRoQ2FzY2FkZVByZWNlZGVuY2UqIG1hdGNoaW5nX3J1bGVzID0KKyAgICAgIGJvZHlfLT5maXJzdF9lbGVtZW50X2NoaWxkKCkKKyAgICAgICAgICAtPmZpcnN0X2VsZW1lbnRfY2hpbGQoKQorICAgICAgICAgIC0+QXNIVE1MRWxlbWVudCgpCisgICAgICAgICAgLT5tYXRjaGluZ19ydWxlcygpOworICBBU1NFUlRfRVEoMSwgbWF0Y2hpbmdfcnVsZXMtPnNpemUoKSk7CisgIEVYUEVDVF9FUShHZXREb2N1bWVudFN0eWxlU2hlZXQoMCktPmNzc19ydWxlc19zYW1lX29yaWdpbigpLT5JdGVtKDApLAorICAgICAgICAgICAgKCptYXRjaGluZ19ydWxlcylbMF0uZmlyc3QpOworCisgIGJvZHlfLT5maXJzdF9lbGVtZW50X2NoaWxkKCktPkFzSFRNTEVsZW1lbnQoKS0+UmVtb3ZlQXR0cmlidXRlKCJjbGFzcyIpOworCisgIFVwZGF0ZUFsbE1hdGNoaW5nUnVsZXMoKTsKKworICBBU1NFUlRfRVEoMCwgbWF0Y2hpbmdfcnVsZXMtPnNpemUoKSk7Cit9CisKKy8vIERlc2NlbmRhbnQgc2hvdWxkIGFkZCBtYXRjaGluZyBydWxlIGZyb20gbmV3bHkgYWRkZWQgbWF0Y2hpbmcgbm9kZS4KK1RFU1RfRihSdWxlTWF0Y2hpbmdUZXN0LCBEZXNjZW5kYW50TWF0Y2hpbmdOb2RlQWRkZWQpIHsKKyAgaGVhZF8tPnNldF9pbm5lcl9odG1sKCI8c3R5bGU+ZGl2Lm15LWNsYXNzIGRpdiB7fTwvc3R5bGU+Iik7CisgIGJvZHlfLT5zZXRfaW5uZXJfaHRtbCgiPGRpdiBjbGFzcz1cIm90aGVyLWNsYXNzXCI+PGRpdi8+PC9kaXY+Iik7CisKKyAgVXBkYXRlQWxsTWF0Y2hpbmdSdWxlcygpOworCisgIGNzc29tOjpSdWxlc1dpdGhDYXNjYWRlUHJlY2VkZW5jZSogbWF0Y2hpbmdfcnVsZXMgPQorICAgICAgYm9keV8tPmZpcnN0X2VsZW1lbnRfY2hpbGQoKQorICAgICAgICAgIC0+Zmlyc3RfZWxlbWVudF9jaGlsZCgpCisgICAgICAgICAgLT5Bc0hUTUxFbGVtZW50KCkKKyAgICAgICAgICAtPm1hdGNoaW5nX3J1bGVzKCk7CisgIEFTU0VSVF9FUSgwLCBtYXRjaGluZ19ydWxlcy0+c2l6ZSgpKTsKKworICBib2R5Xy0+Zmlyc3RfZWxlbWVudF9jaGlsZCgpLT5Bc0hUTUxFbGVtZW50KCktPnNldF9jbGFzc19uYW1lKCJteS1jbGFzcyIpOworCisgIFVwZGF0ZUFsbE1hdGNoaW5nUnVsZXMoKTsKKworICBBU1NFUlRfRVEoMSwgbWF0Y2hpbmdfcnVsZXMtPnNpemUoKSk7CisgIEVYUEVDVF9FUShHZXREb2N1bWVudFN0eWxlU2hlZXQoMCktPmNzc19ydWxlc19zYW1lX29yaWdpbigpLT5JdGVtKDApLAorICAgICAgICAgICAgKCptYXRjaGluZ19ydWxlcylbMF0uZmlyc3QpOworfQorCisvLyBEZXNjZW5kYW50IHNob3VsZCByZW1vdmUgbWF0Y2hpbmcgcnVsZSBmcm9tIG5ld2x5IHJlbW92ZWQgbWF0Y2hpbmcgbm9kZS4KK1RFU1RfRihSdWxlTWF0Y2hpbmdUZXN0LCBEZXNjZW5kYW50TWF0Y2hpbmdOb2RlUmVtb3ZlZCkgeworICBoZWFkXy0+c2V0X2lubmVyX2h0bWwoIjxzdHlsZT5kaXYubXktY2xhc3MgZGl2IHt9PC9zdHlsZT4iKTsKKyAgYm9keV8tPnNldF9pbm5lcl9odG1sKCI8ZGl2IGNsYXNzPVwibXktY2xhc3NcIj48ZGl2Lz48L2Rpdj4iKTsKKworICBVcGRhdGVBbGxNYXRjaGluZ1J1bGVzKCk7CisKKyAgY3Nzb206OlJ1bGVzV2l0aENhc2NhZGVQcmVjZWRlbmNlKiBtYXRjaGluZ19ydWxlcyA9CisgICAgICBib2R5Xy0+Zmlyc3RfZWxlbWVudF9jaGlsZCgpCisgICAgICAgICAgLT5maXJzdF9lbGVtZW50X2NoaWxkKCkKKyAgICAgICAgICAtPkFzSFRNTEVsZW1lbnQoKQorICAgICAgICAgIC0+bWF0Y2hpbmdfcnVsZXMoKTsKKyAgQVNTRVJUX0VRKDEsIG1hdGNoaW5nX3J1bGVzLT5zaXplKCkpOworICBFWFBFQ1RfRVEoR2V0RG9jdW1lbnRTdHlsZVNoZWV0KDApLT5jc3NfcnVsZXNfc2FtZV9vcmlnaW4oKS0+SXRlbSgwKSwKKyAgICAgICAgICAgICgqbWF0Y2hpbmdfcnVsZXMpWzBdLmZpcnN0KTsKKworICBib2R5Xy0+Zmlyc3RfZWxlbWVudF9jaGlsZCgpLT5Bc0hUTUxFbGVtZW50KCktPlJlbW92ZUF0dHJpYnV0ZSgiY2xhc3MiKTsKKworICBVcGRhdGVBbGxNYXRjaGluZ1J1bGVzKCk7CisKKyAgQVNTRVJUX0VRKDAsIG1hdGNoaW5nX3J1bGVzLT5zaXplKCkpOworfQorCisvLyBOZXh0IHNpYmxpbmcgc2hvdWxkIGFkZCBtYXRjaGluZyBydWxlIGZyb20gbmV3bHkgYWRkZWQgbWF0Y2hpbmcgbm9kZS4KK1RFU1RfRihSdWxlTWF0Y2hpbmdUZXN0LCBOZXh0U2libGluZ01hdGNoaW5nTm9kZUFkZGVkKSB7CisgIGhlYWRfLT5zZXRfaW5uZXJfaHRtbCgiPHN0eWxlPmRpdi5teS1jbGFzcyArIGRpdiB7fTwvc3R5bGU+Iik7CisgIGJvZHlfLT5zZXRfaW5uZXJfaHRtbCgiPGRpdiBjbGFzcz1cIm90aGVyLWNsYXNzXCIvPjxkaXYvPiIpOworCisgIFVwZGF0ZUFsbE1hdGNoaW5nUnVsZXMoKTsKKworICBjc3NvbTo6UnVsZXNXaXRoQ2FzY2FkZVByZWNlZGVuY2UqIG1hdGNoaW5nX3J1bGVzID0KKyAgICAgIGJvZHlfLT5maXJzdF9lbGVtZW50X2NoaWxkKCkKKyAgICAgICAgICAtPm5leHRfZWxlbWVudF9zaWJsaW5nKCkKKyAgICAgICAgICAtPkFzSFRNTEVsZW1lbnQoKQorICAgICAgICAgIC0+bWF0Y2hpbmdfcnVsZXMoKTsKKyAgQVNTRVJUX0VRKDAsIG1hdGNoaW5nX3J1bGVzLT5zaXplKCkpOworCisgIGJvZHlfLT5maXJzdF9lbGVtZW50X2NoaWxkKCktPkFzSFRNTEVsZW1lbnQoKS0+c2V0X2NsYXNzX25hbWUoIm15LWNsYXNzIik7CisKKyAgVXBkYXRlQWxsTWF0Y2hpbmdSdWxlcygpOworCisgIEFTU0VSVF9FUSgxLCBtYXRjaGluZ19ydWxlcy0+c2l6ZSgpKTsKKyAgRVhQRUNUX0VRKEdldERvY3VtZW50U3R5bGVTaGVldCgwKS0+Y3NzX3J1bGVzX3NhbWVfb3JpZ2luKCktPkl0ZW0oMCksCisgICAgICAgICAgICAoKm1hdGNoaW5nX3J1bGVzKVswXS5maXJzdCk7Cit9CisKKy8vIE5leHQgc2libGluZyBzaG91bGQgcmVtb3ZlIG1hdGNoaW5nIHJ1bGUgZnJvbSBuZXdseSByZW1vdmVkIG1hdGNoaW5nIG5vZGUuCitURVNUX0YoUnVsZU1hdGNoaW5nVGVzdCwgTmV4dFNpYmxpbmdNYXRjaGluZ05vZGVSZW1vdmVkKSB7CisgIGhlYWRfLT5zZXRfaW5uZXJfaHRtbCgiPHN0eWxlPmRpdi5teS1jbGFzcyArIGRpdiB7fTwvc3R5bGU+Iik7CisgIGJvZHlfLT5zZXRfaW5uZXJfaHRtbCgiPGRpdiBjbGFzcz1cIm15LWNsYXNzXCIvPjxkaXYvPiIpOworCisgIFVwZGF0ZUFsbE1hdGNoaW5nUnVsZXMoKTsKKworICBjc3NvbTo6UnVsZXNXaXRoQ2FzY2FkZVByZWNlZGVuY2UqIG1hdGNoaW5nX3J1bGVzID0KKyAgICAgIGJvZHlfLT5maXJzdF9lbGVtZW50X2NoaWxkKCkKKyAgICAgICAgICAtPm5leHRfZWxlbWVudF9zaWJsaW5nKCkKKyAgICAgICAgICAtPkFzSFRNTEVsZW1lbnQoKQorICAgICAgICAgIC0+bWF0Y2hpbmdfcnVsZXMoKTsKKyAgQVNTRVJUX0VRKDEsIG1hdGNoaW5nX3J1bGVzLT5zaXplKCkpOworICBFWFBFQ1RfRVEoR2V0RG9jdW1lbnRTdHlsZVNoZWV0KDApLT5jc3NfcnVsZXNfc2FtZV9vcmlnaW4oKS0+SXRlbSgwKSwKKyAgICAgICAgICAgICgqbWF0Y2hpbmdfcnVsZXMpWzBdLmZpcnN0KTsKKworICBib2R5Xy0+Zmlyc3RfZWxlbWVudF9jaGlsZCgpLT5Bc0hUTUxFbGVtZW50KCktPlJlbW92ZUF0dHJpYnV0ZSgiY2xhc3MiKTsKKworICBVcGRhdGVBbGxNYXRjaGluZ1J1bGVzKCk7CisKKyAgQVNTRVJUX0VRKDAsIG1hdGNoaW5nX3J1bGVzLT5zaXplKCkpOworfQorCisvLyBGb2xsb3dpbmcgc2libGluZyBzaG91bGQgYWRkIG1hdGNoaW5nIHJ1bGUgZnJvbSBuZXdseSBhZGRlZCBtYXRjaGluZyBub2RlLgorVEVTVF9GKFJ1bGVNYXRjaGluZ1Rlc3QsIEZvbGxvd2luZ1NpYmxpbmdNYXRjaGluZ05vZGVBZGRlZCkgeworICBoZWFkXy0+c2V0X2lubmVyX2h0bWwoIjxzdHlsZT5kaXYubXktY2xhc3MgfiBkaXYge308L3N0eWxlPiIpOworICBib2R5Xy0+c2V0X2lubmVyX2h0bWwoIjxkaXYgY2xhc3M9XCJvdGhlci1jbGFzc1wiLz48ZGl2Lz4iKTsKKworICBVcGRhdGVBbGxNYXRjaGluZ1J1bGVzKCk7CisKKyAgY3Nzb206OlJ1bGVzV2l0aENhc2NhZGVQcmVjZWRlbmNlKiBtYXRjaGluZ19ydWxlcyA9CisgICAgICBib2R5Xy0+Zmlyc3RfZWxlbWVudF9jaGlsZCgpCisgICAgICAgICAgLT5uZXh0X2VsZW1lbnRfc2libGluZygpCisgICAgICAgICAgLT5Bc0hUTUxFbGVtZW50KCkKKyAgICAgICAgICAtPm1hdGNoaW5nX3J1bGVzKCk7CisgIEFTU0VSVF9FUSgwLCBtYXRjaGluZ19ydWxlcy0+c2l6ZSgpKTsKKworICBib2R5Xy0+Zmlyc3RfZWxlbWVudF9jaGlsZCgpLT5Bc0hUTUxFbGVtZW50KCktPnNldF9jbGFzc19uYW1lKCJteS1jbGFzcyIpOworCisgIFVwZGF0ZUFsbE1hdGNoaW5nUnVsZXMoKTsKKworICBBU1NFUlRfRVEoMSwgbWF0Y2hpbmdfcnVsZXMtPnNpemUoKSk7CisgIEVYUEVDVF9FUShHZXREb2N1bWVudFN0eWxlU2hlZXQoMCktPmNzc19ydWxlc19zYW1lX29yaWdpbigpLT5JdGVtKDApLAorICAgICAgICAgICAgKCptYXRjaGluZ19ydWxlcylbMF0uZmlyc3QpOworfQorCisvLyBGb2xsb3dpbmcgc2libGluZyBzaG91bGQgcmVtb3ZlIG1hdGNoaW5nIHJ1bGUgZnJvbSBuZXdseSByZW1vdmVkIG1hdGNoaW5nCisvLyBub2RlLgorVEVTVF9GKFJ1bGVNYXRjaGluZ1Rlc3QsIEZvbGxvd2luZ1NpYmxpbmdNYXRjaGluZ05vZGVSZW1vdmVkKSB7CisgIGhlYWRfLT5zZXRfaW5uZXJfaHRtbCgiPHN0eWxlPmRpdi5teS1jbGFzcyB+IGRpdiB7fTwvc3R5bGU+Iik7CisgIGJvZHlfLT5zZXRfaW5uZXJfaHRtbCgiPGRpdiBjbGFzcz1cIm15LWNsYXNzXCIvPjxkaXYvPiIpOworCisgIFVwZGF0ZUFsbE1hdGNoaW5nUnVsZXMoKTsKKworICBjc3NvbTo6UnVsZXNXaXRoQ2FzY2FkZVByZWNlZGVuY2UqIG1hdGNoaW5nX3J1bGVzID0KKyAgICAgIGJvZHlfLT5maXJzdF9lbGVtZW50X2NoaWxkKCkKKyAgICAgICAgICAtPm5leHRfZWxlbWVudF9zaWJsaW5nKCkKKyAgICAgICAgICAtPkFzSFRNTEVsZW1lbnQoKQorICAgICAgICAgIC0+bWF0Y2hpbmdfcnVsZXMoKTsKKyAgQVNTRVJUX0VRKDEsIG1hdGNoaW5nX3J1bGVzLT5zaXplKCkpOworICBFWFBFQ1RfRVEoR2V0RG9jdW1lbnRTdHlsZVNoZWV0KDApLT5jc3NfcnVsZXNfc2FtZV9vcmlnaW4oKS0+SXRlbSgwKSwKKyAgICAgICAgICAgICgqbWF0Y2hpbmdfcnVsZXMpWzBdLmZpcnN0KTsKKworICBib2R5Xy0+Zmlyc3RfZWxlbWVudF9jaGlsZCgpLT5Bc0hUTUxFbGVtZW50KCktPlJlbW92ZUF0dHJpYnV0ZSgiY2xhc3MiKTsKKworICBVcGRhdGVBbGxNYXRjaGluZ1J1bGVzKCk7CisKKyAgQVNTRVJUX0VRKDAsIG1hdGNoaW5nX3J1bGVzLT5zaXplKCkpOworfQorCisvLyBBZnRlciBwc2V1ZG8gZWxlbWVudCBzaG91bGQgYWRkIG1hdGNoaW5nIHJ1bGUgZnJvbSBuZXdseSBhZGRlZCBtYXRjaGluZyBub2RlLgorVEVTVF9GKFJ1bGVNYXRjaGluZ1Rlc3QsIEFmdGVyUHNldWRvRWxlbWVudE1hdGNoaW5nTm9kZVJlbW92ZWQpIHsKKyAgaGVhZF8tPnNldF9pbm5lcl9odG1sKAorICAgICAgIjxzdHlsZT5kaXYubXktY2xhc3M6YWZ0ZXIge308L3N0eWxlPiIKKyAgICAgICI8c3R5bGU+ZGl2OmFmdGVyIHt9PC9zdHlsZT4iKTsKKyAgYm9keV8tPnNldF9pbm5lcl9odG1sKCI8ZGl2IGNsYXNzPVwibXktY2xhc3NcIi8+PGRpdi8+Iik7CisKKyAgVXBkYXRlQWxsTWF0Y2hpbmdSdWxlcygpOworCisgIEhUTUxFbGVtZW50KiBodG1sX2VsZW1lbnQgPSBib2R5Xy0+Zmlyc3RfZWxlbWVudF9jaGlsZCgpLT5Bc0hUTUxFbGVtZW50KCk7CisgIGNzc29tOjpSdWxlc1dpdGhDYXNjYWRlUHJlY2VkZW5jZSogbWF0Y2hpbmdfcnVsZXMgPQorICAgICAgaHRtbF9lbGVtZW50LT5tYXRjaGluZ19ydWxlcygpOworICBFWFBFQ1RfRVEoMCwgbWF0Y2hpbmdfcnVsZXMtPnNpemUoKSk7CisgIEFTU0VSVF9UUlVFKGh0bWxfZWxlbWVudC0+cHNldWRvX2VsZW1lbnQoa0FmdGVyUHNldWRvRWxlbWVudFR5cGUpKTsKKyAgbWF0Y2hpbmdfcnVsZXMgPQorICAgICAgaHRtbF9lbGVtZW50LT5wc2V1ZG9fZWxlbWVudChrQWZ0ZXJQc2V1ZG9FbGVtZW50VHlwZSktPm1hdGNoaW5nX3J1bGVzKCk7CisgIEFTU0VSVF9FUSgyLCBtYXRjaGluZ19ydWxlcy0+c2l6ZSgpKTsKKyAgRVhQRUNUX0VRKEdldERvY3VtZW50U3R5bGVTaGVldCgwKS0+Y3NzX3J1bGVzX3NhbWVfb3JpZ2luKCktPkl0ZW0oMCksCisgICAgICAgICAgICAoKm1hdGNoaW5nX3J1bGVzKVswXS5maXJzdCk7CisKKyAgYm9keV8tPmZpcnN0X2VsZW1lbnRfY2hpbGQoKS0+QXNIVE1MRWxlbWVudCgpLT5SZW1vdmVBdHRyaWJ1dGUoImNsYXNzIik7CisKKyAgVXBkYXRlQWxsTWF0Y2hpbmdSdWxlcygpOworCisgIG1hdGNoaW5nX3J1bGVzID0gaHRtbF9lbGVtZW50LT5tYXRjaGluZ19ydWxlcygpOworICBFWFBFQ1RfRVEoMCwgbWF0Y2hpbmdfcnVsZXMtPnNpemUoKSk7CisgIEFTU0VSVF9UUlVFKGh0bWxfZWxlbWVudC0+cHNldWRvX2VsZW1lbnQoa0FmdGVyUHNldWRvRWxlbWVudFR5cGUpKTsKKyAgbWF0Y2hpbmdfcnVsZXMgPQorICAgICAgaHRtbF9lbGVtZW50LT5wc2V1ZG9fZWxlbWVudChrQWZ0ZXJQc2V1ZG9FbGVtZW50VHlwZSktPm1hdGNoaW5nX3J1bGVzKCk7CisgIEFTU0VSVF9FUSgxLCBtYXRjaGluZ19ydWxlcy0+c2l6ZSgpKTsKKyAgRVhQRUNUX0VRKEdldERvY3VtZW50U3R5bGVTaGVldCgxKS0+Y3NzX3J1bGVzX3NhbWVfb3JpZ2luKCktPkl0ZW0oMCksCisgICAgICAgICAgICAoKm1hdGNoaW5nX3J1bGVzKVswXS5maXJzdCk7Cit9CisKKy8vIEFmdGVyIHBzZXVkbyBlbGVtZW50IHNob3VsZCByZW1vdmUgbWF0Y2hpbmcgcnVsZSBmcm9tIG5ld2x5IHJlbW92ZWQgbWF0Y2hpbmcKKy8vIG5vZGUuCitURVNUX0YoUnVsZU1hdGNoaW5nVGVzdCwgQWZ0ZXJQc2V1ZG9FbGVtZW50TWF0Y2hpbmdOb2RlQWRkZWQpIHsKKyAgaGVhZF8tPnNldF9pbm5lcl9odG1sKAorICAgICAgIjxzdHlsZT5kaXYubXktY2xhc3M6YWZ0ZXIge308L3N0eWxlPiIKKyAgICAgICI8c3R5bGU+ZGl2OmFmdGVyIHt9PC9zdHlsZT4iKTsKKyAgYm9keV8tPnNldF9pbm5lcl9odG1sKCI8ZGl2IGNsYXNzPVwib3RoZXItY2xhc3NcIi8+PGRpdi8+Iik7CisKKyAgVXBkYXRlQWxsTWF0Y2hpbmdSdWxlcygpOworCisgIEhUTUxFbGVtZW50KiBodG1sX2VsZW1lbnQgPSBib2R5Xy0+Zmlyc3RfZWxlbWVudF9jaGlsZCgpLT5Bc0hUTUxFbGVtZW50KCk7CisgIGNzc29tOjpSdWxlc1dpdGhDYXNjYWRlUHJlY2VkZW5jZSogbWF0Y2hpbmdfcnVsZXMgPQorICAgICAgaHRtbF9lbGVtZW50LT5tYXRjaGluZ19ydWxlcygpOworICBFWFBFQ1RfRVEoMCwgbWF0Y2hpbmdfcnVsZXMtPnNpemUoKSk7CisgIEFTU0VSVF9UUlVFKGh0bWxfZWxlbWVudC0+cHNldWRvX2VsZW1lbnQoa0FmdGVyUHNldWRvRWxlbWVudFR5cGUpKTsKKyAgbWF0Y2hpbmdfcnVsZXMgPQorICAgICAgaHRtbF9lbGVtZW50LT5wc2V1ZG9fZWxlbWVudChrQWZ0ZXJQc2V1ZG9FbGVtZW50VHlwZSktPm1hdGNoaW5nX3J1bGVzKCk7CisgIEFTU0VSVF9FUSgxLCBtYXRjaGluZ19ydWxlcy0+c2l6ZSgpKTsKKyAgRVhQRUNUX0VRKEdldERvY3VtZW50U3R5bGVTaGVldCgxKS0+Y3NzX3J1bGVzX3NhbWVfb3JpZ2luKCktPkl0ZW0oMCksCisgICAgICAgICAgICAoKm1hdGNoaW5nX3J1bGVzKVswXS5maXJzdCk7CisKKyAgYm9keV8tPmZpcnN0X2VsZW1lbnRfY2hpbGQoKS0+QXNIVE1MRWxlbWVudCgpLT5zZXRfY2xhc3NfbmFtZSgibXktY2xhc3MiKTsKKworICBVcGRhdGVBbGxNYXRjaGluZ1J1bGVzKCk7CisKKyAgbWF0Y2hpbmdfcnVsZXMgPSBodG1sX2VsZW1lbnQtPm1hdGNoaW5nX3J1bGVzKCk7CisgIEVYUEVDVF9FUSgwLCBtYXRjaGluZ19ydWxlcy0+c2l6ZSgpKTsKKyAgQVNTRVJUX1RSVUUoaHRtbF9lbGVtZW50LT5wc2V1ZG9fZWxlbWVudChrQWZ0ZXJQc2V1ZG9FbGVtZW50VHlwZSkpOworICBtYXRjaGluZ19ydWxlcyA9CisgICAgICBodG1sX2VsZW1lbnQtPnBzZXVkb19lbGVtZW50KGtBZnRlclBzZXVkb0VsZW1lbnRUeXBlKS0+bWF0Y2hpbmdfcnVsZXMoKTsKKyAgQVNTRVJUX0VRKDIsIG1hdGNoaW5nX3J1bGVzLT5zaXplKCkpOworICBFWFBFQ1RfRVEoR2V0RG9jdW1lbnRTdHlsZVNoZWV0KDApLT5jc3NfcnVsZXNfc2FtZV9vcmlnaW4oKS0+SXRlbSgwKSwKKyAgICAgICAgICAgICgqbWF0Y2hpbmdfcnVsZXMpWzBdLmZpcnN0KTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGRvbQogfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vc2NyaXB0X2V2ZW50X2xvZy5jYyBiL3NyYy9jb2JhbHQvZG9tL3NjcmlwdF9ldmVudF9sb2cuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWViZGY2MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL3NjcmlwdF9ldmVudF9sb2cuY2MKQEAgLTAsMCArMSw3MCBAQAorLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImNvYmFsdC9kb20vc2NyaXB0X2V2ZW50X2xvZy5oIgorCisjaW5jbHVkZSAiY29iYWx0L2RvbS9ldmVudF90YXJnZXQuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgZG9tIHsKKworU2NyaXB0RXZlbnRMb2c6OlNjcmlwdEV2ZW50TG9nKCkgOiBjdXJyZW50X3N0YWNrX2RlcHRoXygwKSB7CisgIGJhc2U6OlVzZXJMb2c6OlJlZ2lzdGVyKGJhc2U6OlVzZXJMb2c6OmtFdmVudFN0YWNrTGV2ZWxDb3VudEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAiRXZlbnRMZXZlbENudCIsICZjdXJyZW50X3N0YWNrX2RlcHRoXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGN1cnJlbnRfc3RhY2tfZGVwdGhfKSk7CisKKyAgbWVtc2V0KGV2ZW50X2xvZ19zdGFja18sIDAsIHNpemVvZihldmVudF9sb2dfc3RhY2tfKSk7CisgIGNvbnN0IGludCBrTG9nTmFtZUJ1ZmZlclNpemUgPSAxNjsKKyAgY2hhciBsb2dfbmFtZV9idWZmZXJba0xvZ05hbWVCdWZmZXJTaXplXTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBiYXNlOjpVc2VyTG9nOjprRXZlbnRTdGFja01heERlcHRoOyBpKyspIHsKKyAgICBzbnByaW50Zihsb2dfbmFtZV9idWZmZXIsIGtMb2dOYW1lQnVmZmVyU2l6ZSwgIkV2ZW50TGV2ZWwlZCIsIGkpOworICAgIGJhc2U6OlVzZXJMb2c6OlJlZ2lzdGVyKHN0YXRpY19jYXN0PGJhc2U6OlVzZXJMb2c6OkluZGV4PigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VXNlckxvZzo6a0V2ZW50U3RhY2tNaW5MZXZlbEluZGV4ICsgaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX25hbWVfYnVmZmVyLCBldmVudF9sb2dfc3RhY2tfW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtMb2dFbnRyeU1heExlbmd0aCk7CisgIH0KK30KKworU2NyaXB0RXZlbnRMb2c6On5TY3JpcHRFdmVudExvZygpIHsKKyAgYmFzZTo6VXNlckxvZzo6RGVyZWdpc3RlcihiYXNlOjpVc2VyTG9nOjprRXZlbnRTdGFja0xldmVsQ291bnRJbmRleCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgYmFzZTo6VXNlckxvZzo6a0V2ZW50U3RhY2tNYXhEZXB0aDsgaSsrKSB7CisgICAgYmFzZTo6VXNlckxvZzo6RGVyZWdpc3RlcihzdGF0aWNfY2FzdDxiYXNlOjpVc2VyTG9nOjpJbmRleD4oCisgICAgICAgIGJhc2U6OlVzZXJMb2c6OmtFdmVudFN0YWNrTWluTGV2ZWxJbmRleCArIGkpKTsKKyAgfQorfQorCit2b2lkIFNjcmlwdEV2ZW50TG9nOjpQdXNoRXZlbnQoRXZlbnQqIGV2ZW50KSB7CisgIGlmIChjdXJyZW50X3N0YWNrX2RlcHRoXyA8IGJhc2U6OlVzZXJMb2c6OmtFdmVudFN0YWNrTWF4RGVwdGgpIHsKKyAgICBzbnByaW50ZihldmVudF9sb2dfc3RhY2tfW2N1cnJlbnRfc3RhY2tfZGVwdGhfXSwga0xvZ0VudHJ5TWF4TGVuZ3RoLAorICAgICAgICAgICAgICIlc0AlcyIsIGV2ZW50LT50eXBlKCkuY19zdHIoKSwKKyAgICAgICAgICAgICBldmVudC0+Y3VycmVudF90YXJnZXQoKS0+R2V0RGVidWdOYW1lKCkuY19zdHIoKSk7CisgIH0gZWxzZSBpZiAoY3VycmVudF9zdGFja19kZXB0aF8gPT0gYmFzZTo6VXNlckxvZzo6a0V2ZW50U3RhY2tNYXhEZXB0aCkgeworICAgIERMT0coV0FSTklORykgPDwgIlJlYWNoZWQgbWF4aW11bSBkZXB0aCBvZiAiIDw8IGtMb2dFbnRyeU1heExlbmd0aAorICAgICAgICAgICAgICAgICAgPDwgIi4gU3Vic2VxdWVudCBldmVudHMgd2lsbCBub3QgYmUgbG9nZ2VkLiI7CisgIH0KKyAgY3VycmVudF9zdGFja19kZXB0aF8rKzsKK30KKwordm9pZCBTY3JpcHRFdmVudExvZzo6UG9wRXZlbnQoKSB7CisgIERDSEVDSyhjdXJyZW50X3N0YWNrX2RlcHRoXyk7CisgIGN1cnJlbnRfc3RhY2tfZGVwdGhfLS07CisgIGlmIChjdXJyZW50X3N0YWNrX2RlcHRoXyA8IGJhc2U6OlVzZXJMb2c6OmtFdmVudFN0YWNrTWF4RGVwdGgpIHsKKyAgICBtZW1zZXQoZXZlbnRfbG9nX3N0YWNrX1tjdXJyZW50X3N0YWNrX2RlcHRoX10sIDAsIGtMb2dFbnRyeU1heExlbmd0aCk7CisgIH0KK30KKworYmFzZTo6TGF6eUluc3RhbmNlPFNjcmlwdEV2ZW50TG9nPiBzY3JpcHRfZXZlbnRfbG9nID0gTEFaWV9JTlNUQU5DRV9JTklUSUFMSVpFUjsKKworfSAgLy8gbmFtZXNwYWNlIGRvbQorfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vc2NyaXB0X2V2ZW50X2xvZy5oIGIvc3JjL2NvYmFsdC9kb20vc2NyaXB0X2V2ZW50X2xvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MTllOGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS9zY3JpcHRfZXZlbnRfbG9nLmgKQEAgLTAsMCArMSw0NiBAQAorLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBDT0JBTFRfRE9NX1NDUklQVF9FVkVOVF9MT0dfSF8KKyNkZWZpbmUgQ09CQUxUX0RPTV9TQ1JJUFRfRVZFTlRfTE9HX0hfCisKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS91c2VyX2xvZy5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vZXZlbnQuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgZG9tIHsKKworLy8gVGhpcyBjbGFzcyByZWNvcmRzIHRoZSBuZXN0ZWQgZXZlbnRzIGFuZCBtYW5hZ2VzIHRoZSB1c2VyIGxvZyBpbmZvcm1hdGlvbi4KK2NsYXNzIFNjcmlwdEV2ZW50TG9nIHsKKyBwdWJsaWM6CisgIFNjcmlwdEV2ZW50TG9nKCk7CisgIH5TY3JpcHRFdmVudExvZygpOworICB2b2lkIFB1c2hFdmVudChFdmVudCogZXZlbnQpOworICB2b2lkIFBvcEV2ZW50KCk7CisKKyBwcml2YXRlOgorICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtMb2dFbnRyeU1heExlbmd0aCA9IDY0OworICBpbnQgY3VycmVudF9zdGFja19kZXB0aF87CisgIGNoYXIgZXZlbnRfbG9nX3N0YWNrX1tiYXNlOjpVc2VyTG9nOjprRXZlbnRTdGFja01heERlcHRoXVtrTG9nRW50cnlNYXhMZW5ndGhdOworCisgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihTY3JpcHRFdmVudExvZyk7Cit9OworCitleHRlcm4gYmFzZTo6TGF6eUluc3RhbmNlPFNjcmlwdEV2ZW50TG9nPiBzY3JpcHRfZXZlbnRfbG9nOworCit9ICAvLyBuYW1lc3BhY2UgZG9tCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gQ09CQUxUX0RPTV9TQ1JJUFRfRVZFTlRfTE9HX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9zZXJpYWxpemVyX3Rlc3QuY2MgYi9zcmMvY29iYWx0L2RvbS9zZXJpYWxpemVyX3Rlc3QuY2MKaW5kZXggYmZlMzFjMi4uZWIwNjgzZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vc2VyaWFsaXplcl90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL3NlcmlhbGl6ZXJfdGVzdC5jYwpAQCAtNDUsOSArNDUsOSBAQAogICAgIDogZG9tX3BhcnNlcl8obmV3IGRvbV9wYXJzZXI6OlBhcnNlcigpKSwKICAgICAgIGRvbV9zdGF0X3RyYWNrZXJfKG5ldyBEb21TdGF0VHJhY2tlcigiU2VyaWFsaXplclRlc3QiKSksCiAgICAgICBodG1sX2VsZW1lbnRfY29udGV4dF8oTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tX3N0YXRfdHJhY2tlcl8uZ2V0KCksICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OmtBcHBsaWNhdGlvblN0YXRlU3RhcnRlZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6a0FwcGxpY2F0aW9uU3RhdGVTdGFydGVkLCBOVUxMKSwKICAgICAgIGRvY3VtZW50XyhuZXcgRG9jdW1lbnQoJmh0bWxfZWxlbWVudF9jb250ZXh0XykpLAogICAgICAgcm9vdF8obmV3IEVsZW1lbnQoZG9jdW1lbnRfLCBiYXNlOjpUb2tlbigicm9vdCIpKSksCiAgICAgICBzb3VyY2VfbG9jYXRpb25fKGJhc2U6OlNvdXJjZUxvY2F0aW9uKCJbb2JqZWN0IFNlcmlhbGl6ZXJUZXN0XSIsIDEsIDEpKSB7fQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vdGVzdGluZy9kb21fdGVzdGluZy5neXAgYi9zcmMvY29iYWx0L2RvbS90ZXN0aW5nL2RvbV90ZXN0aW5nLmd5cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzcyNjg1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vdGVzdGluZy9kb21fdGVzdGluZy5neXAKQEAgLTAsMCArMSw0MiBAQAorIyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCit7CisgICd2YXJpYWJsZXMnOiB7CisgICAgJ3NiX3BlZGFudGljX3dhcm5pbmdzJzogMSwKKyAgfSwKKyAgJ3RhcmdldHMnOiBbCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2RvbV90ZXN0aW5nJywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnZ3Rlc3Rfd29ya2Fyb3VuZHMuaCcsCisgICAgICAgICdodG1sX2NvbGxlY3Rpb25fdGVzdGluZy5oJywKKyAgICAgICAgJ21vY2tfZXZlbnRfbGlzdGVuZXIuaCcsCisgICAgICAgICdzdHViX2Nzc19wYXJzZXIuY2MnLAorICAgICAgICAnc3R1Yl9jc3NfcGFyc2VyLmgnLAorICAgICAgICAnc3R1Yl9zY3JpcHRfcnVubmVyLmNjJywKKyAgICAgICAgJ3N0dWJfc2NyaXB0X3J1bm5lci5oJywKKyAgICAgICAgJ3N0dWJfd2luZG93LmgnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc8KERFUFRIKS9jb2JhbHQvYnJvd3Nlci9icm93c2VyLmd5cDpicm93c2VyJywKKyAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9icm93c2VyL2Jyb3dzZXJfYmluZGluZ3MuZ3lwOmJpbmRpbmdzJywKKyAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9jc3NvbS9jc3NvbS5neXA6Y3Nzb20nLAorICAgICAgICAnPChERVBUSCkvY29iYWx0L2Nzc19wYXJzZXIvY3NzX3BhcnNlci5neXA6Y3NzX3BhcnNlcicsCisgICAgICAgICc8KERFUFRIKS9jb2JhbHQvZG9tX3BhcnNlci9kb21fcGFyc2VyLmd5cDpkb21fcGFyc2VyJywKKyAgICAgIF0sCisgICAgfSwKKyAgXSwKK30KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL3Rlc3Rpbmcvc3R1Yl93aW5kb3cuaCBiL3NyYy9jb2JhbHQvZG9tL3Rlc3Rpbmcvc3R1Yl93aW5kb3cuaAppbmRleCAyOThlNzk5Li42ZWIzOTEzIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS90ZXN0aW5nL3N0dWJfd2luZG93LmgKKysrIGIvc3JjL2NvYmFsdC9kb20vdGVzdGluZy9zdHViX3dpbmRvdy5oCkBAIC0yMCwxMSArMjAsMTMgQEAKICNpbmNsdWRlICJiYXNlL2JpbmQuaCIKICNpbmNsdWRlICJiYXNlL2NhbGxiYWNrLmgiCiAjaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3AuaCIKKyNpbmNsdWRlICJiYXNlL3RocmVhZGluZy9wbGF0Zm9ybV90aHJlYWQuaCIKICNpbmNsdWRlICJjb2JhbHQvY3NzX3BhcnNlci9wYXJzZXIuaCIKICNpbmNsdWRlICJjb2JhbHQvZG9tL2xvY2FsX3N0b3JhZ2VfZGF0YWJhc2UuaCIKICNpbmNsdWRlICJjb2JhbHQvZG9tL3dpbmRvdy5oIgogI2luY2x1ZGUgImNvYmFsdC9kb21fcGFyc2VyL3BhcnNlci5oIgogI2luY2x1ZGUgImNvYmFsdC9sb2FkZXIvZmV0Y2hlcl9mYWN0b3J5LmgiCisjaW5jbHVkZSAiY29iYWx0L2xvYWRlci9sb2FkZXJfZmFjdG9yeS5oIgogI2luY2x1ZGUgImNvYmFsdC9tZWRpYV9zZXNzaW9uL21lZGlhX3Nlc3Npb24uaCIKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvamF2YXNjcmlwdF9lbmdpbmUuaCIKQEAgLTM4LDIwICs0MCwyNyBAQAogLy8gc3R1YmJlZCBvdXQuCiBjbGFzcyBTdHViV2luZG93IHsKICBwdWJsaWM6Ci0gIFN0dWJXaW5kb3coKQorICBleHBsaWNpdCBTdHViV2luZG93KAorICAgICAgc2NvcGVkX3B0cjxzY3JpcHQ6OkVudmlyb25tZW50U2V0dGluZ3M+IGVudmlyb25tZW50X3NldHRpbmdzID0KKyAgICAgICAgICBzY29wZWRfcHRyPHNjcmlwdDo6RW52aXJvbm1lbnRTZXR0aW5ncz4oCisgICAgICAgICAgICAgIG5ldyBzY3JpcHQ6OkVudmlyb25tZW50U2V0dGluZ3MpKQogICAgICAgOiBtZXNzYWdlX2xvb3BfKE1lc3NhZ2VMb29wOjpUWVBFX0RFRkFVTFQpLAogICAgICAgICBjc3NfcGFyc2VyXyhjc3NfcGFyc2VyOjpQYXJzZXI6OkNyZWF0ZSgpKSwKICAgICAgICAgZG9tX3BhcnNlcl8obmV3IGRvbV9wYXJzZXI6OlBhcnNlcihiYXNlOjpCaW5kKCZTdHViRXJyb3JDYWxsYmFjaykpKSwKICAgICAgICAgZmV0Y2hlcl9mYWN0b3J5XyhuZXcgbG9hZGVyOjpGZXRjaGVyRmFjdG9yeShOVUxMKSksCisgICAgICAgIGxvYWRlcl9mYWN0b3J5XyhuZXcgbG9hZGVyOjpMb2FkZXJGYWN0b3J5KAorICAgICAgICAgICAgZmV0Y2hlcl9mYWN0b3J5Xy5nZXQoKSwgTlVMTCwgYmFzZTo6a1RocmVhZFByaW9yaXR5X0RlZmF1bHQpKSwKICAgICAgICAgbG9jYWxfc3RvcmFnZV9kYXRhYmFzZV8oTlVMTCksCiAgICAgICAgIHVybF8oImFib3V0OmJsYW5rIiksCi0gICAgICAgIGRvbV9zdGF0X3RyYWNrZXJfKG5ldyBkb206OkRvbVN0YXRUcmFja2VyKCJTdHViV2luZG93IikpIHsKKyAgICAgICAgZG9tX3N0YXRfdHJhY2tlcl8obmV3IGRvbTo6RG9tU3RhdFRyYWNrZXIoIlN0dWJXaW5kb3ciKSksCisgICAgICAgIGVudmlyb25tZW50X3NldHRpbmdzXyhlbnZpcm9ubWVudF9zZXR0aW5ncy5QYXNzKCkpIHsKICAgICBlbmdpbmVfID0gc2NyaXB0OjpKYXZhU2NyaXB0RW5naW5lOjpDcmVhdGVFbmdpbmUoKTsKICAgICBnbG9iYWxfZW52aXJvbm1lbnRfID0gZW5naW5lXy0+Q3JlYXRlR2xvYmFsRW52aXJvbm1lbnQoKTsKICAgICB3aW5kb3dfID0gbmV3IGRvbTo6V2luZG93KAogICAgICAgICAxOTIwLCAxMDgwLCAxLmYsIGJhc2U6OmtBcHBsaWNhdGlvblN0YXRlU3RhcnRlZCwgY3NzX3BhcnNlcl8uZ2V0KCksCi0gICAgICAgIGRvbV9wYXJzZXJfLmdldCgpLCBmZXRjaGVyX2ZhY3RvcnlfLmdldCgpLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAotICAgICAgICBOVUxMLCAmbG9jYWxfc3RvcmFnZV9kYXRhYmFzZV8sIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAgIGRvbV9wYXJzZXJfLmdldCgpLCBmZXRjaGVyX2ZhY3RvcnlfLmdldCgpLCBsb2FkZXJfZmFjdG9yeV8uZ2V0KCksIE5VTEwsCisgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsICZsb2NhbF9zdG9yYWdlX2RhdGFiYXNlXywgTlVMTCwgTlVMTCwKKyAgICAgICAgTlVMTCwgTlVMTCwgZ2xvYmFsX2Vudmlyb25tZW50Xy0+c2NyaXB0X3ZhbHVlX2ZhY3RvcnkoKSwgTlVMTCwKICAgICAgICAgZG9tX3N0YXRfdHJhY2tlcl8uZ2V0KCksIHVybF8sICIiLCAiZW4tVVMiLCAiZW4iLAogICAgICAgICBiYXNlOjpDYWxsYmFjazx2b2lkKGNvbnN0IEdVUkwmKT4oKSwgYmFzZTo6QmluZCgmU3R1YkVycm9yQ2FsbGJhY2spLAogICAgICAgICBOVUxMLCBuZXR3b3JrX2JyaWRnZTo6UG9zdFNlbmRlcigpLCBjc3A6OmtDU1BSZXF1aXJlZCwKQEAgLTYxLDggKzcwLDkgQEAKICAgICAgICAgYmFzZTo6Q2xvc3VyZSgpIC8qIHdpbmRvd19taW5pbWl6ZSAqLywgTlVMTCwgTlVMTCwgTlVMTCwKICAgICAgICAgZG9tOjpXaW5kb3c6Ok9uU3RhcnREaXNwYXRjaEV2ZW50Q2FsbGJhY2soKSwKICAgICAgICAgZG9tOjpXaW5kb3c6Ok9uU3RvcERpc3BhdGNoRXZlbnRDYWxsYmFjaygpLAotICAgICAgICBkb206OlNjcmVlbnNob3RNYW5hZ2VyOjpQcm92aWRlU2NyZWVuc2hvdEZ1bmN0aW9uQ2FsbGJhY2soKSk7Ci0gICAgZ2xvYmFsX2Vudmlyb25tZW50Xy0+Q3JlYXRlR2xvYmFsT2JqZWN0KHdpbmRvd18sICZlbnZpcm9ubWVudF9zZXR0aW5nc18pOworICAgICAgICBkb206OlNjcmVlbnNob3RNYW5hZ2VyOjpQcm92aWRlU2NyZWVuc2hvdEZ1bmN0aW9uQ2FsbGJhY2soKSwgTlVMTCk7CisgICAgZ2xvYmFsX2Vudmlyb25tZW50Xy0+Q3JlYXRlR2xvYmFsT2JqZWN0KHdpbmRvd18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50X3NldHRpbmdzXy5nZXQoKSk7CiAgIH0KIAogICBzY29wZWRfcmVmcHRyPGRvbTo6V2luZG93PiB3aW5kb3coKSB7IHJldHVybiB3aW5kb3dfOyB9CkBAIC03MCw2ICs4MCwxMSBAQAogICAgIHJldHVybiBnbG9iYWxfZW52aXJvbm1lbnRfOwogICB9CiAgIGNzc19wYXJzZXI6OlBhcnNlciogY3NzX3BhcnNlcigpIHsgcmV0dXJuIGNzc19wYXJzZXJfLmdldCgpOyB9CisgIHNjcmlwdDo6RW52aXJvbm1lbnRTZXR0aW5ncyogZW52aXJvbm1lbnRfc2V0dGluZ3MoKSB7CisgICAgcmV0dXJuIGVudmlyb25tZW50X3NldHRpbmdzXy5nZXQoKTsKKyAgfQorCisgIH5TdHViV2luZG93KCkgeyB3aW5kb3dfLT5EZXN0cm95VGltZXJzKCk7IH0KIAogIHByaXZhdGU6CiAgIHN0YXRpYyB2b2lkIFN0dWJFcnJvckNhbGxiYWNrKGNvbnN0IHN0ZDo6c3RyaW5nJiAvKmVycm9yKi8pIHt9CkBAIC03OCwxMCArOTMsMTEgQEAKICAgc2NvcGVkX3B0cjxjc3NfcGFyc2VyOjpQYXJzZXI+IGNzc19wYXJzZXJfOwogICBzY29wZWRfcHRyPGRvbV9wYXJzZXI6OlBhcnNlcj4gZG9tX3BhcnNlcl87CiAgIHNjb3BlZF9wdHI8bG9hZGVyOjpGZXRjaGVyRmFjdG9yeT4gZmV0Y2hlcl9mYWN0b3J5XzsKKyAgc2NvcGVkX3B0cjxsb2FkZXI6OkxvYWRlckZhY3Rvcnk+IGxvYWRlcl9mYWN0b3J5XzsKICAgZG9tOjpMb2NhbFN0b3JhZ2VEYXRhYmFzZSBsb2NhbF9zdG9yYWdlX2RhdGFiYXNlXzsKICAgR1VSTCB1cmxfOwogICBzY29wZWRfcHRyPGRvbTo6RG9tU3RhdFRyYWNrZXI+IGRvbV9zdGF0X3RyYWNrZXJfOwotICBzY3JpcHQ6OkVudmlyb25tZW50U2V0dGluZ3MgZW52aXJvbm1lbnRfc2V0dGluZ3NfOworICBzY29wZWRfcHRyPHNjcmlwdDo6RW52aXJvbm1lbnRTZXR0aW5ncz4gZW52aXJvbm1lbnRfc2V0dGluZ3NfOwogICBzY29wZWRfcHRyPHNjcmlwdDo6SmF2YVNjcmlwdEVuZ2luZT4gZW5naW5lXzsKICAgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50PiBnbG9iYWxfZW52aXJvbm1lbnRfOwogICBzY29wZWRfcmVmcHRyPGRvbTo6V2luZG93PiB3aW5kb3dfOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vdXJsX3JlZ2lzdHJ5LmggYi9zcmMvY29iYWx0L2RvbS91cmxfcmVnaXN0cnkuaAppbmRleCA0YjY5NTRhLi5hZWE1MGM5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS91cmxfcmVnaXN0cnkuaAorKysgYi9zcmMvY29iYWx0L2RvbS91cmxfcmVnaXN0cnkuaApAQCAtMTksNiArMTksNyBAQAogCiAjaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgogI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC90cmFjZXIuaCIKIAogbmFtZXNwYWNlIGNvYmFsdCB7CiBuYW1lc3BhY2UgZG9tIHsKQEAgLTMzLDEzICszNCwxNyBAQAogLy8gTm90ZTogSXQgaXMgdW5zYWZlIHRvIGRpcmVjdGx5IGVuY29kZSB0aGUgcG9pbnRlciB0byB0aGUgb2JqZWN0IGluIHRoZQogLy8gdXJsIGFzIHRoZSB1cmwgaXMgYXNzaWduZWQgZnJvbSBKYXZhU2NyaXB0LgogdGVtcGxhdGUgPHR5cGVuYW1lIE9iamVjdFR5cGU+Ci1jbGFzcyBVcmxSZWdpc3RyeSB7CitjbGFzcyBVcmxSZWdpc3RyeSA6IHB1YmxpYyBzY3JpcHQ6OlRyYWNlYWJsZSB7CiAgcHVibGljOgogICB2b2lkIFJlZ2lzdGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBibG9iX3VybCwKICAgICAgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPE9iamVjdFR5cGU+JiBvYmplY3QpOwogICBzY29wZWRfcmVmcHRyPE9iamVjdFR5cGU+IFJldHJpZXZlKGNvbnN0IHN0ZDo6c3RyaW5nJiBibG9iX3VybCk7CiAgIGJvb2wgVW5yZWdpc3Rlcihjb25zdCBzdGQ6OnN0cmluZyYgYmxvYl91cmwpOwogCisgIHZvaWQgVHJhY2VNZW1iZXJzKHNjcmlwdDo6VHJhY2VyKiB0cmFjZXIpIG92ZXJyaWRlIHsKKyAgICB0cmFjZXItPlRyYWNlVmFsdWVzKG9iamVjdF9yZWdpc3RyeV8pOworICB9CisKICBwcml2YXRlOgogICB0eXBlZGVmIGJhc2U6Omhhc2hfbWFwPHN0ZDo6c3RyaW5nLCBzY29wZWRfcmVmcHRyPE9iamVjdFR5cGU+ID4gVXJsTWFwOwogICBVcmxNYXAgb2JqZWN0X3JlZ2lzdHJ5XzsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL3dpbmRvdy5jYyBiL3NyYy9jb2JhbHQvZG9tL3dpbmRvdy5jYwppbmRleCAwMDIzZWIwLi4wYmZkNzYwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS93aW5kb3cuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vd2luZG93LmNjCkBAIC0xNSwxMyArMTUsMTQgQEAKIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KIAotI2luY2x1ZGUgImJhc2UvYmFzZTY0LmgiCiAjaW5jbHVkZSAiYmFzZS9iaW5kLmgiCiAjaW5jbHVkZSAiYmFzZS9iaW5kX2hlbHBlcnMuaCIKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCiAjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKICNpbmNsdWRlICJjb2JhbHQvYmFzZS90b2tlbnMuaCIKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vY3NzX2NvbXB1dGVkX3N0eWxlX2RlY2xhcmF0aW9uLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL3VzZXJfYWdlbnRfc3R5bGVfc2hlZXQuaCIKKyNpbmNsdWRlICJjb2JhbHQvZG9tL2Jhc2U2NC5oIgogI2luY2x1ZGUgImNvYmFsdC9kb20vY2FtZXJhXzNkLmgiCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9jb25zb2xlLmgiCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9kZXZpY2Vfb3JpZW50YXRpb25fZXZlbnQuaCIKQEAgLTkxLDYgKzkyLDcgQEAKICAgICBiYXNlOjpBcHBsaWNhdGlvblN0YXRlIGluaXRpYWxfYXBwbGljYXRpb25fc3RhdGUsCiAgICAgY3Nzb206OkNTU1BhcnNlciogY3NzX3BhcnNlciwgUGFyc2VyKiBkb21fcGFyc2VyLAogICAgIGxvYWRlcjo6RmV0Y2hlckZhY3RvcnkqIGZldGNoZXJfZmFjdG9yeSwKKyAgICBsb2FkZXI6OkxvYWRlckZhY3RvcnkqIGxvYWRlcl9mYWN0b3J5LAogICAgIHJlbmRlcl90cmVlOjpSZXNvdXJjZVByb3ZpZGVyKiogcmVzb3VyY2VfcHJvdmlkZXIsCiAgICAgbG9hZGVyOjppbWFnZTo6QW5pbWF0ZWRJbWFnZVRyYWNrZXIqIGFuaW1hdGVkX2ltYWdlX3RyYWNrZXIsCiAgICAgbG9hZGVyOjppbWFnZTo6SW1hZ2VDYWNoZSogaW1hZ2VfY2FjaGUsCkBAIC0xMjQsMTEgKzEyNiwxNSBAQAogICAgIGNvbnN0IE9uU3RvcERpc3BhdGNoRXZlbnRDYWxsYmFjayYgb25fc3RvcF9kaXNwYXRjaF9ldmVudF9jYWxsYmFjaywKICAgICBjb25zdCBTY3JlZW5zaG90TWFuYWdlcjo6UHJvdmlkZVNjcmVlbnNob3RGdW5jdGlvbkNhbGxiYWNrJgogICAgICAgICBzY3JlZW5zaG90X2Z1bmN0aW9uX2NhbGxiYWNrLAorICAgIGJhc2U6OldhaXRhYmxlRXZlbnQqIHN5bmNocm9ub3VzX2xvYWRlcl9pbnRlcnJ1cHQsCiAgICAgaW50IGNzcF9pbnNlY3VyZV9hbGxvd2VkX3Rva2VuLCBpbnQgZG9tX21heF9lbGVtZW50X2RlcHRoLAogICAgIGZsb2F0IHZpZGVvX3BsYXliYWNrX3JhdGVfbXVsdGlwbGllciwgQ2xvY2tUeXBlIGNsb2NrX3R5cGUsCiAgICAgY29uc3QgQ2FjaGVDYWxsYmFjayYgc3BsYXNoX3NjcmVlbl9jYWNoZV9jYWxsYmFjaywKICAgICBjb25zdCBzY29wZWRfcmVmcHRyPGNhcHRpb25zOjpTeXN0ZW1DYXB0aW9uU2V0dGluZ3M+JiBjYXB0aW9ucykKLSAgICA6IHdpZHRoXyh3aWR0aCksCisgICAgLy8gJ3dpbmRvdycgb2JqZWN0IEV2ZW50VGFyZ2V0cyByZXF1aXJlIHNwZWNpYWwgaGFuZGxpbmcgZm9yIG9uZXJyb3IgZXZlbnRzLAorICAgIC8vIHNlZSBFdmVudFRhcmdldCBjb25zdHJ1Y3RvciBmb3IgbW9yZSBkZXRhaWxzLgorICAgIDogRXZlbnRUYXJnZXQoa1VucGFja09uRXJyb3JFdmVudHMpLAorICAgICAgd2lkdGhfKHdpZHRoKSwKICAgICAgIGhlaWdodF8oaGVpZ2h0KSwKICAgICAgIGRldmljZV9waXhlbF9yYXRpb18oZGV2aWNlX3BpeGVsX3JhdGlvKSwKICAgICAgIGlzX3Jlc2l6ZV9ldmVudF9wZW5kaW5nXyhmYWxzZSksCkBAIC0xMzcsMTIgKzE0MywxMyBAQAogICAgICAgdGVzdF9ydW5uZXJfKG5ldyBUZXN0UnVubmVyKCkpLAogI2VuZGlmICAvLyBFTkFCTEVfVEVTVF9SVU5ORVIKICAgICAgIGh0bWxfZWxlbWVudF9jb250ZXh0XyhuZXcgSFRNTEVsZW1lbnRDb250ZXh0KAotICAgICAgICAgIGZldGNoZXJfZmFjdG9yeSwgY3NzX3BhcnNlciwgZG9tX3BhcnNlciwgY2FuX3BsYXlfdHlwZV9oYW5kbGVyLAotICAgICAgICAgIHdlYl9tZWRpYV9wbGF5ZXJfZmFjdG9yeSwgc2NyaXB0X3J1bm5lciwgc2NyaXB0X3ZhbHVlX2ZhY3RvcnksCi0gICAgICAgICAgbWVkaWFfc291cmNlX3JlZ2lzdHJ5LCByZXNvdXJjZV9wcm92aWRlciwgYW5pbWF0ZWRfaW1hZ2VfdHJhY2tlciwKLSAgICAgICAgICBpbWFnZV9jYWNoZSwgcmVkdWNlZF9pbWFnZV9jYWNoZV9jYXBhY2l0eV9tYW5hZ2VyLAotICAgICAgICAgIHJlbW90ZV90eXBlZmFjZV9jYWNoZSwgbWVzaF9jYWNoZSwgZG9tX3N0YXRfdHJhY2tlciwKLSAgICAgICAgICBmb250X2xhbmd1YWdlX3NjcmlwdCwgaW5pdGlhbF9hcHBsaWNhdGlvbl9zdGF0ZSwKKyAgICAgICAgICBmZXRjaGVyX2ZhY3RvcnksIGxvYWRlcl9mYWN0b3J5LCBjc3NfcGFyc2VyLCBkb21fcGFyc2VyLAorICAgICAgICAgIGNhbl9wbGF5X3R5cGVfaGFuZGxlciwgd2ViX21lZGlhX3BsYXllcl9mYWN0b3J5LCBzY3JpcHRfcnVubmVyLAorICAgICAgICAgIHNjcmlwdF92YWx1ZV9mYWN0b3J5LCBtZWRpYV9zb3VyY2VfcmVnaXN0cnksIHJlc291cmNlX3Byb3ZpZGVyLAorICAgICAgICAgIGFuaW1hdGVkX2ltYWdlX3RyYWNrZXIsIGltYWdlX2NhY2hlLAorICAgICAgICAgIHJlZHVjZWRfaW1hZ2VfY2FjaGVfY2FwYWNpdHlfbWFuYWdlciwgcmVtb3RlX3R5cGVmYWNlX2NhY2hlLAorICAgICAgICAgIG1lc2hfY2FjaGUsIGRvbV9zdGF0X3RyYWNrZXIsIGZvbnRfbGFuZ3VhZ2Vfc2NyaXB0LAorICAgICAgICAgIGluaXRpYWxfYXBwbGljYXRpb25fc3RhdGUsIHN5bmNocm9ub3VzX2xvYWRlcl9pbnRlcnJ1cHQsCiAgICAgICAgICAgdmlkZW9fcGxheWJhY2tfcmF0ZV9tdWx0aXBsaWVyKSksCiAgICAgICBwZXJmb3JtYW5jZV8obmV3IFBlcmZvcm1hbmNlKAogI2lmIGRlZmluZWQoRU5BQkxFX1RFU1RfUlVOTkVSKQpAQCAtMzQ1LDIyICszNTIsMjQgQEAKIAogc3RkOjpzdHJpbmcgV2luZG93OjpCdG9hKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHJpbmdfdG9fZW5jb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDo6RXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSkgewotICBzdGQ6OnN0cmluZyBvdXRwdXQ7Ci0gIGlmICghYmFzZTo6QmFzZTY0RW5jb2RlKHN0cmluZ190b19lbmNvZGUsICZvdXRwdXQpKSB7CisgIFRSQUNFX0VWRU5UMCgiY29iYWx0Ojpkb20iLCAiV2luZG93OjpCdG9hKCkiKTsKKyAgYXV0byBvdXRwdXQgPSBGb3JnaXZpbmdCYXNlNjRFbmNvZGUoc3RyaW5nX3RvX2VuY29kZSk7CisgIGlmICghb3V0cHV0KSB7CiAgICAgRE9NRXhjZXB0aW9uOjpSYWlzZShET01FeGNlcHRpb246OmtJbnZhbGlkQ2hhcmFjdGVyRXJyLCBleGNlcHRpb25fc3RhdGUpOwogICAgIHJldHVybiBzdGQ6OnN0cmluZygpOwogICB9Ci0gIHJldHVybiBvdXRwdXQ7CisgIHJldHVybiAqb3V0cHV0OwogfQogCiBzdGQ6OnZlY3Rvcjx1aW50OF90PiBXaW5kb3c6OkF0b2IoY29uc3Qgc3RkOjpzdHJpbmcmIGVuY29kZWRfc3RyaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDo6RXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSkgewotICBzdGQ6OnN0cmluZyBvdXRwdXQ7Ci0gIGlmICghYmFzZTo6QmFzZTY0RGVjb2RlKGVuY29kZWRfc3RyaW5nLCAmb3V0cHV0KSkgeworICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6ZG9tIiwgIldpbmRvdzo6QXRvYigpIik7CisgIGF1dG8gb3V0cHV0ID0gRm9yZ2l2aW5nQmFzZTY0RGVjb2RlKGVuY29kZWRfc3RyaW5nKTsKKyAgaWYgKCFvdXRwdXQpIHsKICAgICBET01FeGNlcHRpb246OlJhaXNlKERPTUV4Y2VwdGlvbjo6a0ludmFsaWRDaGFyYWN0ZXJFcnIsIGV4Y2VwdGlvbl9zdGF0ZSk7CiAgICAgcmV0dXJuIHt9OwogICB9Ci0gIHJldHVybiB7b3V0cHV0LmJlZ2luKCksIG91dHB1dC5lbmQoKX07CisgIHJldHVybiAqb3V0cHV0OwogfQogCiBpbnQgV2luZG93OjpTZXRUaW1lb3V0KGNvbnN0IFdpbmRvd1RpbWVyczo6VGltZXJDYWxsYmFja0FyZyYgaGFuZGxlciwKQEAgLTQ4Myw2ICs0OTIsOSBAQAogfQogCiB2b2lkIFdpbmRvdzo6SW5qZWN0RXZlbnQoY29uc3Qgc2NvcGVkX3JlZnB0cjxFdmVudD4mIGV2ZW50KSB7CisgIFRSQUNFX0VWRU5UMSgiY29iYWx0Ojpkb20iLCAiV2luZG93OjpJbmplY3RFdmVudCgpIiwgImV2ZW50IiwKKyAgICAgICAgICAgICAgIGV2ZW50LT50eXBlKCkuY19zdHIoKSk7CisKICAgLy8gRm9yd2FyZCB0aGUgZXZlbnQgb24gdG8gdGhlIGNvcnJlY3Qgb2JqZWN0IGluIERPTS4KICAgaWYgKGV2ZW50LT5HZXRXcmFwcGFibGVUeXBlKCkgPT0gYmFzZTo6R2V0VHlwZUlkPEtleWJvYXJkRXZlbnQ+KCkpIHsKICAgICAvLyBFdmVudC50YXJnZXQ6Zm9jdXNlZCBlbGVtZW50IHByb2Nlc3NpbmcgdGhlIGtleSBldmVudCBvciBpZiBubyBlbGVtZW50CkBAIC01MDAsMTAgKzUxMiw2IEBACiAgICAgaWYgKG9uX3NjcmVlbl9rZXlib2FyZF8pIHsKICAgICAgIG9uX3NjcmVlbl9rZXlib2FyZF8tPkRpc3BhdGNoRXZlbnQoZXZlbnQpOwogICAgIH0KLSAgfSBlbHNlIGlmIChldmVudC0+R2V0V3JhcHBhYmxlVHlwZSgpID09IGJhc2U6OkdldFR5cGVJZDxQb2ludGVyRXZlbnQ+KCkgfHwKLSAgICAgICAgICAgICBldmVudC0+R2V0V3JhcHBhYmxlVHlwZSgpID09IGJhc2U6OkdldFR5cGVJZDxNb3VzZUV2ZW50PigpIHx8Ci0gICAgICAgICAgICAgZXZlbnQtPkdldFdyYXBwYWJsZVR5cGUoKSA9PSBiYXNlOjpHZXRUeXBlSWQ8V2hlZWxFdmVudD4oKSkgewotICAgIGRvY3VtZW50Xy0+cG9pbnRlcl9zdGF0ZSgpLT5RdWV1ZVBvaW50ZXJFdmVudChldmVudCk7CiAgIH0gZWxzZSB7CiAgICAgU0JfTk9UUkVBQ0hFRCgpOwogICB9CkBAIC02NzIsNiArNjgwLDcgQEAKIAogdm9pZCBXaW5kb3c6OlNldEVudmlyb25tZW50U2V0dGluZ3Moc2NyaXB0OjpFbnZpcm9ubWVudFNldHRpbmdzKiBzZXR0aW5ncykgewogICBzY3JlZW5zaG90X21hbmFnZXJfLlNldEVudmlyb25tZW50U2V0dGluZ3Moc2V0dGluZ3MpOworICBuYXZpZ2F0b3JfLT5TZXRFbnZpcm9ubWVudFNldHRpbmdzKHNldHRpbmdzKTsKIH0KIAogdm9pZCBXaW5kb3c6OkNhY2hlU3BsYXNoU2NyZWVuKGNvbnN0IHN0ZDo6c3RyaW5nJiBjb250ZW50KSB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS93aW5kb3cuaCBiL3NyYy9jb2JhbHQvZG9tL3dpbmRvdy5oCmluZGV4IDgwZWYxOWIuLjQ4MTUyNDYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL3dpbmRvdy5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL3dpbmRvdy5oCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKICNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCiAjaW5jbHVkZSAiYmFzZS9tZW1vcnkvd2Vha19wdHIuaCIKKyNpbmNsdWRlICJiYXNlL3N5bmNocm9uaXphdGlvbi93YWl0YWJsZV9ldmVudC5oIgogI2luY2x1ZGUgImJhc2UvdGltZXIuaCIKICNpbmNsdWRlICJjb2JhbHQvYmFzZS9hcHBsaWNhdGlvbl9zdGF0ZS5oIgogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9jc3NfcGFyc2VyLmgiCkBAIC01NCw2ICs1NSw3IEBACiAjaW5jbHVkZSAiY29iYWx0L2xvYWRlci9pbWFnZS9pbWFnZS5oIgogI2luY2x1ZGUgImNvYmFsdC9sb2FkZXIvaW1hZ2UvaW1hZ2VfY2FjaGUuaCIKICNpbmNsdWRlICJjb2JhbHQvbG9hZGVyL2xvYWRlci5oIgorI2luY2x1ZGUgImNvYmFsdC9sb2FkZXIvbG9hZGVyX2ZhY3RvcnkuaCIKICNpbmNsdWRlICJjb2JhbHQvbG9hZGVyL21lc2gvbWVzaF9jYWNoZS5oIgogI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9jYW5fcGxheV90eXBlX2hhbmRsZXIuaCIKICNpbmNsdWRlICJjb2JhbHQvbWVkaWEvd2ViX21lZGlhX3BsYXllcl9mYWN0b3J5LmgiCkBAIC0xMjcsNiArMTI5LDcgQEAKICAgICAgIGJhc2U6OkFwcGxpY2F0aW9uU3RhdGUgaW5pdGlhbF9hcHBsaWNhdGlvbl9zdGF0ZSwKICAgICAgIGNzc29tOjpDU1NQYXJzZXIqIGNzc19wYXJzZXIsIFBhcnNlciogZG9tX3BhcnNlciwKICAgICAgIGxvYWRlcjo6RmV0Y2hlckZhY3RvcnkqIGZldGNoZXJfZmFjdG9yeSwKKyAgICAgIGxvYWRlcjo6TG9hZGVyRmFjdG9yeSogbG9hZGVyX2ZhY3RvcnksCiAgICAgICByZW5kZXJfdHJlZTo6UmVzb3VyY2VQcm92aWRlcioqIHJlc291cmNlX3Byb3ZpZGVyLAogICAgICAgbG9hZGVyOjppbWFnZTo6QW5pbWF0ZWRJbWFnZVRyYWNrZXIqIGFuaW1hdGVkX2ltYWdlX3RyYWNrZXIsCiAgICAgICBsb2FkZXI6OmltYWdlOjpJbWFnZUNhY2hlKiBpbWFnZV9jYWNoZSwKQEAgLTE2Miw2ICsxNjUsNyBAQAogICAgICAgY29uc3QgT25TdG9wRGlzcGF0Y2hFdmVudENhbGxiYWNrJiBzdG9wX3RyYWNraW5nX2Rpc3BhdGNoX2V2ZW50X2NhbGxiYWNrLAogICAgICAgY29uc3QgU2NyZWVuc2hvdE1hbmFnZXI6OlByb3ZpZGVTY3JlZW5zaG90RnVuY3Rpb25DYWxsYmFjayYKICAgICAgICAgICBzY3JlZW5zaG90X2Z1bmN0aW9uX2NhbGxiYWNrLAorICAgICAgYmFzZTo6V2FpdGFibGVFdmVudCogc3luY2hyb25vdXNfbG9hZGVyX2ludGVycnVwdCwKICAgICAgIGludCBjc3BfaW5zZWN1cmVfYWxsb3dlZF90b2tlbiA9IDAsIGludCBkb21fbWF4X2VsZW1lbnRfZGVwdGggPSAwLAogICAgICAgZmxvYXQgdmlkZW9fcGxheWJhY2tfcmF0ZV9tdWx0aXBsaWVyID0gMS5mLAogICAgICAgQ2xvY2tUeXBlIGNsb2NrX3R5cGUgPSBrQ2xvY2tUeXBlU3lzdGVtVGltZSwKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL3dpbmRvd19vbl9zY3JlZW5fa2V5Ym9hcmQuaWRsIGIvc3JjL2NvYmFsdC9kb20vd2luZG93X29uX3NjcmVlbl9rZXlib2FyZC5pZGwKaW5kZXggM2ZkYjBhMS4uYjBjYmJkNyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vd2luZG93X29uX3NjcmVlbl9rZXlib2FyZC5pZGwKKysrIGIvc3JjL2NvYmFsdC9kb20vd2luZG93X29uX3NjcmVlbl9rZXlib2FyZC5pZGwKQEAgLTE2LDUgKzE2LDUgQEAKIC8vIHNjcmVlbiBrZXlib2FyZC4KIAogcGFydGlhbCBpbnRlcmZhY2UgV2luZG93IHsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIE9uU2NyZWVuS2V5Ym9hcmQgb25TY3JlZW5LZXlib2FyZDsKK1sgQ29uZGl0aW9uYWw9Q09CQUxUX0VOQUJMRV9PTl9TQ1JFRU5fS0VZQk9BUkQgXSByZWFkb25seSBhdHRyaWJ1dGUgT25TY3JlZW5LZXlib2FyZCBvblNjcmVlbktleWJvYXJkOwogfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL3dpbmRvd190ZXN0LmNjIGIvc3JjL2NvYmFsdC9kb20vd2luZG93X3Rlc3QuY2MKaW5kZXggZWEzZjJmZC4uNjQwMWU3ZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vd2luZG93X3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vd2luZG93X3Rlc3QuY2MKQEAgLTI2LDYgKzI2LDggQEAKICNpbmNsdWRlICJjb2JhbHQvbG9hZGVyL2ZldGNoZXJfZmFjdG9yeS5oIgogI2luY2x1ZGUgImNvYmFsdC9tZWRpYV9zZXNzaW9uL21lZGlhX3Nlc3Npb24uaCIKICNpbmNsdWRlICJjb2JhbHQvbmV0d29ya19icmlkZ2UvbmV0X3Bvc3Rlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9qYXZhc2NyaXB0X2VuZ2luZS5oIgogI2luY2x1ZGUgImdvb2dsZXVybC9zcmMvZ3VybC5oIgogI2luY2x1ZGUgInN0YXJib2FyZC93aW5kb3cuaCIKICNpbmNsdWRlICJ0ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2suaCIKQEAgLTQ2LDIzICs0OCwyNiBAQAogICAgICAgICBkb21fcGFyc2VyXyhuZXcgZG9tX3BhcnNlcjo6UGFyc2VyKG1vY2tfZXJyb3JfY2FsbGJhY2tfKSksCiAgICAgICAgIGZldGNoZXJfZmFjdG9yeV8obmV3IGxvYWRlcjo6RmV0Y2hlckZhY3RvcnkoTlVMTCkpLAogICAgICAgICBsb2NhbF9zdG9yYWdlX2RhdGFiYXNlXyhOVUxMKSwKLSAgICAgICAgdXJsXygiYWJvdXQ6YmxhbmsiKSwKLSAgICAgICAgd2luZG93XyhuZXcgV2luZG93KAotICAgICAgICAgICAgMTkyMCwgMTA4MCwgMS5mLCBiYXNlOjprQXBwbGljYXRpb25TdGF0ZVN0YXJ0ZWQsIGNzc19wYXJzZXJfLmdldCgpLAotICAgICAgICAgICAgZG9tX3BhcnNlcl8uZ2V0KCksIGZldGNoZXJfZmFjdG9yeV8uZ2V0KCksIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCi0gICAgICAgICAgICBOVUxMLCBOVUxMLCAmbG9jYWxfc3RvcmFnZV9kYXRhYmFzZV8sIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCi0gICAgICAgICAgICBOVUxMLCBOVUxMLCB1cmxfLCAiIiwgImVuLVVTIiwgImVuIiwKLSAgICAgICAgICAgIGJhc2U6OkNhbGxiYWNrPHZvaWQoY29uc3QgR1VSTCAmKT4oKSwKLSAgICAgICAgICAgIGJhc2U6OkJpbmQoJk1vY2tFcnJvckNhbGxiYWNrOjpSdW4sCi0gICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQoJm1vY2tfZXJyb3JfY2FsbGJhY2tfKSksCi0gICAgICAgICAgICBOVUxMLCBuZXR3b3JrX2JyaWRnZTo6UG9zdFNlbmRlcigpLCBjc3A6OmtDU1BSZXF1aXJlZCwKLSAgICAgICAgICAgIGtDc3BFbmZvcmNlbWVudEVuYWJsZSwgYmFzZTo6Q2xvc3VyZSgpIC8qIGNzcF9wb2xpY3lfY2hhbmdlZCAqLywKLSAgICAgICAgICAgIGJhc2U6OkNsb3N1cmUoKSAvKiByYW5fYW5pbWF0aW9uX2ZyYW1lX2NhbGxiYWNrcyAqLywKLSAgICAgICAgICAgIGRvbTo6V2luZG93OjpDbG9zZUNhbGxiYWNrKCkgLyogd2luZG93X2Nsb3NlICovLAotICAgICAgICAgICAgYmFzZTo6Q2xvc3VyZSgpIC8qIHdpbmRvd19taW5pbWl6ZSAqLywgTlVMTCwgTlVMTCwgTlVMTCwKLSAgICAgICAgICAgIGRvbTo6V2luZG93OjpPblN0YXJ0RGlzcGF0Y2hFdmVudENhbGxiYWNrKCksCi0gICAgICAgICAgICBkb206OldpbmRvdzo6T25TdG9wRGlzcGF0Y2hFdmVudENhbGxiYWNrKCksCi0gICAgICAgICAgICBkb206OlNjcmVlbnNob3RNYW5hZ2VyOjpQcm92aWRlU2NyZWVuc2hvdEZ1bmN0aW9uQ2FsbGJhY2soKSkpIHt9CisgICAgICAgIHVybF8oImFib3V0OmJsYW5rIikgeworICAgIGVuZ2luZV8gPSBzY3JpcHQ6OkphdmFTY3JpcHRFbmdpbmU6OkNyZWF0ZUVuZ2luZSgpOworICAgIGdsb2JhbF9lbnZpcm9ubWVudF8gPSBlbmdpbmVfLT5DcmVhdGVHbG9iYWxFbnZpcm9ubWVudCgpOworICAgIHdpbmRvd18gPSBuZXcgV2luZG93KAorICAgICAgICAxOTIwLCAxMDgwLCAxLmYsIGJhc2U6OmtBcHBsaWNhdGlvblN0YXRlU3RhcnRlZCwgY3NzX3BhcnNlcl8uZ2V0KCksCisgICAgICAgIGRvbV9wYXJzZXJfLmdldCgpLCBmZXRjaGVyX2ZhY3RvcnlfLmdldCgpLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorICAgICAgICBOVUxMLCBOVUxMLCAmbG9jYWxfc3RvcmFnZV9kYXRhYmFzZV8sIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAgIGdsb2JhbF9lbnZpcm9ubWVudF8tPnNjcmlwdF92YWx1ZV9mYWN0b3J5KCksIE5VTEwsIE5VTEwsIHVybF8sICIiLAorICAgICAgICAiZW4tVVMiLCAiZW4iLCBiYXNlOjpDYWxsYmFjazx2b2lkKGNvbnN0IEdVUkwgJik+KCksCisgICAgICAgIGJhc2U6OkJpbmQoJk1vY2tFcnJvckNhbGxiYWNrOjpSdW4sCisgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCgmbW9ja19lcnJvcl9jYWxsYmFja18pKSwKKyAgICAgICAgTlVMTCwgbmV0d29ya19icmlkZ2U6OlBvc3RTZW5kZXIoKSwgY3NwOjprQ1NQUmVxdWlyZWQsCisgICAgICAgIGtDc3BFbmZvcmNlbWVudEVuYWJsZSwgYmFzZTo6Q2xvc3VyZSgpIC8qIGNzcF9wb2xpY3lfY2hhbmdlZCAqLywKKyAgICAgICAgYmFzZTo6Q2xvc3VyZSgpIC8qIHJhbl9hbmltYXRpb25fZnJhbWVfY2FsbGJhY2tzICovLAorICAgICAgICBkb206OldpbmRvdzo6Q2xvc2VDYWxsYmFjaygpIC8qIHdpbmRvd19jbG9zZSAqLywKKyAgICAgICAgYmFzZTo6Q2xvc3VyZSgpIC8qIHdpbmRvd19taW5pbWl6ZSAqLywgTlVMTCwgTlVMTCwgTlVMTCwKKyAgICAgICAgZG9tOjpXaW5kb3c6Ok9uU3RhcnREaXNwYXRjaEV2ZW50Q2FsbGJhY2soKSwKKyAgICAgICAgZG9tOjpXaW5kb3c6Ok9uU3RvcERpc3BhdGNoRXZlbnRDYWxsYmFjaygpLAorICAgICAgICBkb206OlNjcmVlbnNob3RNYW5hZ2VyOjpQcm92aWRlU2NyZWVuc2hvdEZ1bmN0aW9uQ2FsbGJhY2soKSwgTlVMTCk7CisgIH0KIAogICB+V2luZG93VGVzdCgpIG92ZXJyaWRlIHt9CiAKQEAgLTcyLDYgKzc3LDggQEAKICAgc2NvcGVkX3B0cjxkb21fcGFyc2VyOjpQYXJzZXI+IGRvbV9wYXJzZXJfOwogICBzY29wZWRfcHRyPGxvYWRlcjo6RmV0Y2hlckZhY3Rvcnk+IGZldGNoZXJfZmFjdG9yeV87CiAgIGRvbTo6TG9jYWxTdG9yYWdlRGF0YWJhc2UgbG9jYWxfc3RvcmFnZV9kYXRhYmFzZV87CisgIHNjb3BlZF9wdHI8c2NyaXB0OjpKYXZhU2NyaXB0RW5naW5lPiBlbmdpbmVfOworICBzY29wZWRfcmVmcHRyPHNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ+IGdsb2JhbF9lbnZpcm9ubWVudF87CiAgIEdVUkwgdXJsXzsKICAgc2NvcGVkX3JlZnB0cjxXaW5kb3c+IHdpbmRvd187CiB9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb21fcGFyc2VyL2RvbV9wYXJzZXIuZ3lwIGIvc3JjL2NvYmFsdC9kb21fcGFyc2VyL2RvbV9wYXJzZXIuZ3lwCmluZGV4IGVhZjg0YmYuLjk5MzRmMDYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tX3BhcnNlci9kb21fcGFyc2VyLmd5cAorKysgYi9zcmMvY29iYWx0L2RvbV9wYXJzZXIvZG9tX3BhcnNlci5neXAKQEAgLTM4LDM5ICszOCw4IEBACiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvYmFzZS9iYXNlLmd5cDpiYXNlJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9kb20vZG9tLmd5cDpkb20nLAogICAgICAgICAnPChERVBUSCkvY29iYWx0L2xvYWRlci9sb2FkZXIuZ3lwOmxvYWRlcicsCi0gICAgICAgICc8KERFUFRIKS9jb2JhbHQvc3BlZWNoL3NwZWVjaC5neXA6c3BlZWNoJywKICAgICAgICAgJzwoREVQVEgpL3RoaXJkX3BhcnR5L2xpYnhtbC9saWJ4bWwuZ3lwOmxpYnhtbCcsCiAgICAgICBdLAogICAgIH0sCi0KLSAgICB7Ci0gICAgICAndGFyZ2V0X25hbWUnOiAnZG9tX3BhcnNlcl90ZXN0JywKLSAgICAgICd0eXBlJzogJzwoZ3Rlc3RfdGFyZ2V0X3R5cGUpJywKLSAgICAgICdzb3VyY2VzJzogWwotICAgICAgICAnaHRtbF9kZWNvZGVyX3Rlc3QuY2MnLAotICAgICAgICAneG1sX2RlY29kZXJfdGVzdC5jYycsCi0gICAgICBdLAotICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKLSAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9kb20vZG9tLmd5cDpkb20nLAotICAgICAgICAnPChERVBUSCkvY29iYWx0L2RvbS9kb20uZ3lwOmRvbV90ZXN0aW5nJywKLSAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9zcGVlY2gvc3BlZWNoLmd5cDpzcGVlY2gnLAotICAgICAgICAnPChERVBUSCkvY29iYWx0L3Rlc3QvdGVzdC5neXA6cnVuX2FsbF91bml0dGVzdHMnLAotICAgICAgICAnPChERVBUSCkvdGVzdGluZy9nbW9jay5neXA6Z21vY2snLAotICAgICAgICAnPChERVBUSCkvdGVzdGluZy9ndGVzdC5neXA6Z3Rlc3QnLAotICAgICAgICAnZG9tX3BhcnNlcicsCi0gICAgICBdLAotICAgIH0sCi0KLSAgICB7Ci0gICAgICAndGFyZ2V0X25hbWUnOiAnZG9tX3BhcnNlcl90ZXN0X2RlcGxveScsCi0gICAgICAndHlwZSc6ICdub25lJywKLSAgICAgICdkZXBlbmRlbmNpZXMnOiBbCi0gICAgICAgICdkb21fcGFyc2VyX3Rlc3QnLAotICAgICAgXSwKLSAgICAgICd2YXJpYWJsZXMnOiB7Ci0gICAgICAgICdleGVjdXRhYmxlX25hbWUnOiAnZG9tX3BhcnNlcl90ZXN0JywKLSAgICAgIH0sCi0gICAgICAnaW5jbHVkZXMnOiBbICc8KERFUFRIKS9zdGFyYm9hcmQvYnVpbGQvZGVwbG95Lmd5cGknIF0sCi0gICAgfSwKICAgXSwKIH0KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tX3BhcnNlci9kb21fcGFyc2VyX3Rlc3QuZ3lwIGIvc3JjL2NvYmFsdC9kb21fcGFyc2VyL2RvbV9wYXJzZXJfdGVzdC5neXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVkOGY1OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tX3BhcnNlci9kb21fcGFyc2VyX3Rlc3QuZ3lwCkBAIC0wLDAgKzEsNDkgQEAKKyMgQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworeworICAndmFyaWFibGVzJzogeworICAgICdzYl9wZWRhbnRpY193YXJuaW5ncyc6IDEsCisgIH0sCisgICd0YXJnZXRzJzogWworICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdkb21fcGFyc2VyX3Rlc3QnLAorICAgICAgJ3R5cGUnOiAnPChndGVzdF90YXJnZXRfdHlwZSknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdodG1sX2RlY29kZXJfdGVzdC5jYycsCisgICAgICAgICd4bWxfZGVjb2Rlcl90ZXN0LmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChERVBUSCkvY29iYWx0L2RvbS9kb20uZ3lwOmRvbScsCisgICAgICAgICc8KERFUFRIKS9jb2JhbHQvZG9tL3Rlc3RpbmcvZG9tX3Rlc3RpbmcuZ3lwOmRvbV90ZXN0aW5nJywKKyAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9kb21fcGFyc2VyL2RvbV9wYXJzZXIuZ3lwOmRvbV9wYXJzZXInLAorICAgICAgICAnPChERVBUSCkvY29iYWx0L3Rlc3QvdGVzdC5neXA6cnVuX2FsbF91bml0dGVzdHMnLAorICAgICAgICAnPChERVBUSCkvdGVzdGluZy9nbW9jay5neXA6Z21vY2snLAorICAgICAgICAnPChERVBUSCkvdGVzdGluZy9ndGVzdC5neXA6Z3Rlc3QnLAorICAgICAgXSwKKyAgICB9LAorCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2RvbV9wYXJzZXJfdGVzdF9kZXBsb3knLAorICAgICAgJ3R5cGUnOiAnbm9uZScsCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnZG9tX3BhcnNlcl90ZXN0JywKKyAgICAgIF0sCisgICAgICAndmFyaWFibGVzJzogeworICAgICAgICAnZXhlY3V0YWJsZV9uYW1lJzogJ2RvbV9wYXJzZXJfdGVzdCcsCisgICAgICB9LAorICAgICAgJ2luY2x1ZGVzJzogWyAnPChERVBUSCkvc3RhcmJvYXJkL2J1aWxkL2RlcGxveS5neXBpJyBdLAorICAgIH0sCisgIF0sCit9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbV9wYXJzZXIvaHRtbF9kZWNvZGVyX3Rlc3QuY2MgYi9zcmMvY29iYWx0L2RvbV9wYXJzZXIvaHRtbF9kZWNvZGVyX3Rlc3QuY2MKaW5kZXggZGNmZWJhNC4uZWY5NjZmZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb21fcGFyc2VyL2h0bWxfZGVjb2Rlcl90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tX3BhcnNlci9odG1sX2RlY29kZXJfdGVzdC5jYwpAQCAtMTYsNiArMTYsNyBAQAogCiAjaW5jbHVkZSAiYmFzZS9jYWxsYmFjay5oIgogI2luY2x1ZGUgImJhc2UvbWVzc2FnZV9sb29wLmgiCisjaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvcGxhdGZvcm1fdGhyZWFkLmgiCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9hdHRyLmgiCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9kb2N1bWVudC5oIgogI2luY2x1ZGUgImNvYmFsdC9kb20vZG9tX3N0YXRfdHJhY2tlci5oIgpAQCAtMjgsNiArMjksNyBAQAogI2luY2x1ZGUgImNvYmFsdC9kb20vdGV4dC5oIgogI2luY2x1ZGUgImNvYmFsdC9kb21fcGFyc2VyL3BhcnNlci5oIgogI2luY2x1ZGUgImNvYmFsdC9sb2FkZXIvZmV0Y2hlcl9mYWN0b3J5LmgiCisjaW5jbHVkZSAiY29iYWx0L2xvYWRlci9sb2FkZXJfZmFjdG9yeS5oIgogI2luY2x1ZGUgInRlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay5oIgogI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgogCkBAIC00Nyw2ICs0OSw3IEBACiAgIH5IVE1MRGVjb2RlclRlc3QoKSBvdmVycmlkZSB7fQogCiAgIGxvYWRlcjo6RmV0Y2hlckZhY3RvcnkgZmV0Y2hlcl9mYWN0b3J5XzsKKyAgbG9hZGVyOjpMb2FkZXJGYWN0b3J5IGxvYWRlcl9mYWN0b3J5XzsKICAgc2NvcGVkX3B0cjxQYXJzZXI+IGRvbV9wYXJzZXJfOwogICBkb206OnRlc3Rpbmc6OlN0dWJDU1NQYXJzZXIgc3R1Yl9jc3NfcGFyc2VyXzsKICAgZG9tOjp0ZXN0aW5nOjpTdHViU2NyaXB0UnVubmVyIHN0dWJfc2NyaXB0X3J1bm5lcl87CkBAIC02MiwxNCArNjUsMTcgQEAKIAogSFRNTERlY29kZXJUZXN0OjpIVE1MRGVjb2RlclRlc3QoKQogICAgIDogZmV0Y2hlcl9mYWN0b3J5XyhOVUxMIC8qIG5ldHdvcmtfbW9kdWxlICovKSwKKyAgICAgIGxvYWRlcl9mYWN0b3J5XygmZmV0Y2hlcl9mYWN0b3J5XywgTlVMTCAvKiBSZXNvdXJjZVByb3ZpZGVyICovLAorICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OmtUaHJlYWRQcmlvcml0eV9EZWZhdWx0KSwKICAgICAgIGRvbV9wYXJzZXJfKG5ldyBQYXJzZXIoKSksCiAgICAgICBkb21fc3RhdF90cmFja2VyXyhuZXcgZG9tOjpEb21TdGF0VHJhY2tlcigiSFRNTERlY29kZXJUZXN0IikpLAogICAgICAgaHRtbF9lbGVtZW50X2NvbnRleHRfKAotICAgICAgICAgICZmZXRjaGVyX2ZhY3RvcnlfLCAmc3R1Yl9jc3NfcGFyc2VyXywgZG9tX3BhcnNlcl8uZ2V0KCksCi0gICAgICAgICAgTlVMTCAvKiBjYW5fcGxheV90eXBlX2hhbmRsZXIgKi8sIE5VTEwgLyogd2ViX21lZGlhX3BsYXllcl9mYWN0b3J5ICovLAotICAgICAgICAgICZzdHViX3NjcmlwdF9ydW5uZXJfLCBOVUxMIC8qIHNjcmlwdF92YWx1ZV9mYWN0b3J5ICovLCBOVUxMLCBOVUxMLAotICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIGRvbV9zdGF0X3RyYWNrZXJfLmdldCgpLCAiIiwKLSAgICAgICAgICBiYXNlOjprQXBwbGljYXRpb25TdGF0ZVN0YXJ0ZWQpLAorICAgICAgICAgICZmZXRjaGVyX2ZhY3RvcnlfLCAmbG9hZGVyX2ZhY3RvcnlfLCAmc3R1Yl9jc3NfcGFyc2VyXywKKyAgICAgICAgICBkb21fcGFyc2VyXy5nZXQoKSwgTlVMTCAvKiBjYW5fcGxheV90eXBlX2hhbmRsZXIgKi8sCisgICAgICAgICAgTlVMTCAvKiB3ZWJfbWVkaWFfcGxheWVyX2ZhY3RvcnkgKi8sICZzdHViX3NjcmlwdF9ydW5uZXJfLAorICAgICAgICAgIE5VTEwgLyogc2NyaXB0X3ZhbHVlX2ZhY3RvcnkgKi8sIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAgICAgTlVMTCwgZG9tX3N0YXRfdHJhY2tlcl8uZ2V0KCksICIiLCBiYXNlOjprQXBwbGljYXRpb25TdGF0ZVN0YXJ0ZWQsCisgICAgICAgICAgTlVMTCksCiAgICAgICBkb2N1bWVudF8obmV3IGRvbTo6RG9jdW1lbnQoJmh0bWxfZWxlbWVudF9jb250ZXh0XykpLAogICAgICAgcm9vdF8obmV3IGRvbTo6RWxlbWVudChkb2N1bWVudF8sIGJhc2U6OlRva2VuKCJlbGVtZW50IikpKSwKICAgICAgIHNvdXJjZV9sb2NhdGlvbl8oYmFzZTo6U291cmNlTG9jYXRpb24oIltvYmplY3QgSFRNTERlY29kZXJUZXN0XSIsIDEsIDEpKSB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2lucHV0L2lucHV0X2RldmljZV9tYW5hZ2VyX2Rlc2t0b3AuY2MgYi9zcmMvY29iYWx0L2lucHV0L2lucHV0X2RldmljZV9tYW5hZ2VyX2Rlc2t0b3AuY2MKaW5kZXggZGRiYTc5My4uMjM4NmQxMCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9pbnB1dC9pbnB1dF9kZXZpY2VfbWFuYWdlcl9kZXNrdG9wLmNjCisrKyBiL3NyYy9jb2JhbHQvaW5wdXQvaW5wdXRfZGV2aWNlX21hbmFnZXJfZGVza3RvcC5jYwpAQCAtMTcsOCArMTcsMTAgQEAKICNpbmNsdWRlIDxjbWF0aD4KICNpbmNsdWRlIDxzdHJpbmc+CiAKKyNpbmNsdWRlICJiYXNlL3RpbWUuaCIKICNpbmNsdWRlICJjb2JhbHQvYmFzZS90b2tlbi5oIgogI2luY2x1ZGUgImNvYmFsdC9iYXNlL3Rva2Vucy5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vZXZlbnQuaCIKICNpbmNsdWRlICJjb2JhbHQvZG9tL2lucHV0X2V2ZW50LmgiCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9pbnB1dF9ldmVudF9pbml0LmgiCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9rZXlib2FyZF9ldmVudC5oIgpAQCAtMjksMTEgKzMxLDIzIEBACiAjaW5jbHVkZSAiY29iYWx0L2RvbS93aGVlbF9ldmVudF9pbml0LmgiCiAjaW5jbHVkZSAiY29iYWx0L2lucHV0L2NyZWF0ZV9kZWZhdWx0X2NhbWVyYV8zZC5oIgogI2luY2x1ZGUgImNvYmFsdC9pbnB1dC9pbnB1dF9wb2xsZXJfaW1wbC5oIgorI2luY2x1ZGUgImNvYmFsdC9vdmVybGF5X2luZm8vb3ZlcmxheV9pbmZvX3JlZ2lzdHJ5LmgiCiAjaW5jbHVkZSAiY29iYWx0L3N5c3RlbV93aW5kb3cvaW5wdXRfZXZlbnQuaCIKIAogbmFtZXNwYWNlIGNvYmFsdCB7CiBuYW1lc3BhY2UgaW5wdXQgewogCituYW1lc3BhY2Ugewordm9pZCBVcGRhdGVFdmVudEluaXQoY29uc3Qgc3lzdGVtX3dpbmRvdzo6SW5wdXRFdmVudCogaW5wdXRfZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICBFdmVudEluaXQqIGV2ZW50KSB7CisgIGlmIChpbnB1dF9ldmVudC0+dGltZXN0YW1wKCkgIT0gMCkgeworICAgIC8vIENvbnZlcnQgU2JUaW1lTW9ub3RvbmljIHRvIERPTVRpbWVTdGFtcC4KKyAgICBldmVudC0+c2V0X3RpbWVfc3RhbXAoY29iYWx0Ojpkb206OkV2ZW50OjpHZXRFdmVudFRpbWUoCisgICAgICAgIGlucHV0X2V2ZW50LT50aW1lc3RhbXAoKSkpOworICB9Cit9Cit9CisKIElucHV0RGV2aWNlTWFuYWdlckRlc2t0b3A6OklucHV0RGV2aWNlTWFuYWdlckRlc2t0b3AoCiAgICAgY29uc3QgS2V5Ym9hcmRFdmVudENhbGxiYWNrJiBrZXlib2FyZF9ldmVudF9jYWxsYmFjaywKICAgICBjb25zdCBQb2ludGVyRXZlbnRDYWxsYmFjayYgcG9pbnRlcl9ldmVudF9jYWxsYmFjaywKQEAgLTIxMywxNyArMjI3LDIzIEBACiAgIGRvbTo6S2V5Ym9hcmRFdmVudDo6S2V5TG9jYXRpb25Db2RlIGxvY2F0aW9uID0KICAgICAgIGRvbTo6S2V5Ym9hcmRFdmVudDo6S2V5Q29kZVRvS2V5TG9jYXRpb24oa2V5X2NvZGUpOwogICBkb206OktleWJvYXJkRXZlbnRJbml0IGtleWJvYXJkX2V2ZW50OworICBVcGRhdGVFdmVudEluaXQoaW5wdXRfZXZlbnQsICZrZXlib2FyZF9ldmVudCk7CiAgIFVwZGF0ZUV2ZW50TW9kaWZpZXJJbml0KGlucHV0X2V2ZW50LCAma2V5Ym9hcmRfZXZlbnQpOwogICBrZXlib2FyZF9ldmVudC5zZXRfbG9jYXRpb24obG9jYXRpb24pOwogICBrZXlib2FyZF9ldmVudC5zZXRfcmVwZWF0KGlucHV0X2V2ZW50LT5pc19yZXBlYXQoKSk7CiAgIGtleWJvYXJkX2V2ZW50LnNldF9jaGFyX2NvZGUoa2V5X2NvZGUpOwogICBrZXlib2FyZF9ldmVudC5zZXRfa2V5X2NvZGUoa2V5X2NvZGUpOwogICBrZXlwcmVzc19nZW5lcmF0b3JfZmlsdGVyXy5IYW5kbGVLZXlib2FyZEV2ZW50KHR5cGUsIGtleWJvYXJkX2V2ZW50KTsKKworICBpbnQzMl90IGtleV9jb2RlX2luX2ludDMyID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oa2V5X2NvZGUpOworICBvdmVybGF5X2luZm86Ok92ZXJsYXlJbmZvUmVnaXN0cnk6OlJlZ2lzdGVyKAorICAgICAgImlucHV0X21hbmFnZXI6a2V5ZG93biIsICZrZXlfY29kZV9pbl9pbnQzMiwgc2l6ZW9mKGtleV9jb2RlX2luX2ludDMyKSk7CiB9CiAKIHZvaWQgSW5wdXREZXZpY2VNYW5hZ2VyRGVza3RvcDo6SGFuZGxlUG9pbnRlckV2ZW50KAogICAgIGJhc2U6OlRva2VuIHR5cGUsIGNvbnN0IHN5c3RlbV93aW5kb3c6OklucHV0RXZlbnQqIGlucHV0X2V2ZW50KSB7CiAgIGRvbTo6UG9pbnRlckV2ZW50SW5pdCBwb2ludGVyX2V2ZW50OworICBVcGRhdGVFdmVudEluaXQoaW5wdXRfZXZlbnQsICZwb2ludGVyX2V2ZW50KTsKICAgVXBkYXRlTW91c2VFdmVudEluaXQoaW5wdXRfZXZlbnQsICZwb2ludGVyX2V2ZW50KTsKIAogICBzd2l0Y2ggKGlucHV0X2V2ZW50LT50eXBlKCkpIHsKQEAgLTI2Miw2ICsyODIsNyBAQAogICAgIGNvbnN0IHN5c3RlbV93aW5kb3c6OklucHV0RXZlbnQqIGlucHV0X2V2ZW50KSB7CiAgIGJhc2U6OlRva2VuIHR5cGUgPSBiYXNlOjpUb2tlbnM6OndoZWVsKCk7CiAgIGRvbTo6V2hlZWxFdmVudEluaXQgd2hlZWxfZXZlbnQ7CisgIFVwZGF0ZUV2ZW50SW5pdChpbnB1dF9ldmVudCwgJndoZWVsX2V2ZW50KTsKICAgVXBkYXRlTW91c2VFdmVudEluaXQoaW5wdXRfZXZlbnQsICZ3aGVlbF9ldmVudCk7CiAKICAgd2hlZWxfZXZlbnQuc2V0X2RlbHRhX3goaW5wdXRfZXZlbnQtPmRlbHRhKCkueCgpKTsKQEAgLTI3OSw2ICszMDAsNyBAQAogICBiYXNlOjpUb2tlbiB0eXBlID0gYmFzZTo6VG9rZW5zOjppbnB1dCgpOwogCiAgIGRvbTo6SW5wdXRFdmVudEluaXQgaW5wdXRfZXZlbnQ7CisgIFVwZGF0ZUV2ZW50SW5pdChldmVudCwgJmlucHV0X2V2ZW50KTsKICAgaW5wdXRfZXZlbnQuc2V0X2RhdGEoZXZlbnQtPmlucHV0X3RleHQoKSk7CiAgIC8vIFdlIGRvIG5vdCBoYW5kbGUgY29tcG9zaXRpb24gc2Vzc2lvbnMgY3VycmVudGx5LCBzbyBpc0NvbXBvc2luZyBzaG91bGQKICAgLy8gYWx3YXlzIGJlIGZhbHNlLgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sYXlvdXQvbGF5b3V0Lmd5cCBiL3NyYy9jb2JhbHQvbGF5b3V0L2xheW91dC5neXAKaW5kZXggMTg3M2Y1Ny4uM2ZmNzc4MSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sYXlvdXQvbGF5b3V0Lmd5cAorKysgYi9zcmMvY29iYWx0L2xheW91dC9sYXlvdXQuZ3lwCkBAIC05NCw3ICs5NCw2IEBACiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvbG9hZGVyL2xvYWRlci5neXA6bG9hZGVyJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9yZW5kZXJfdHJlZS9yZW5kZXJfdHJlZS5neXA6YW5pbWF0aW9ucycsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvcmVuZGVyX3RyZWUvcmVuZGVyX3RyZWUuZ3lwOnJlbmRlcl90cmVlJywKLSAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9zcGVlY2gvc3BlZWNoLmd5cDpzcGVlY2gnLAogICAgICAgICAnPChERVBUSCkvdGhpcmRfcGFydHkvaWN1L2ljdS5neXA6aWN1dWMnLAogICAgICAgXSwKICAgICAgICMgRXhwb3J0aW5nIGRvbSBzbyB0aGF0IGxheW91dF90ZXN0IGdldHMgdGhlIHRyYW5zaXRpdmUgaW5jbHVkZSBwYXRocyB0bwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sYXlvdXQvdG9wbW9zdF9ldmVudF90YXJnZXQuY2MgYi9zcmMvY29iYWx0L2xheW91dC90b3Btb3N0X2V2ZW50X3RhcmdldC5jYwppbmRleCA1MDI3MDFlLi5mYTE4MzJjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xheW91dC90b3Btb3N0X2V2ZW50X3RhcmdldC5jYworKysgYi9zcmMvY29iYWx0L2xheW91dC90b3Btb3N0X2V2ZW50X3RhcmdldC5jYwpAQCAtMTQsNiArMTQsNyBAQAogCiAjaW5jbHVkZSAiY29iYWx0L2xheW91dC90b3Btb3N0X2V2ZW50X3RhcmdldC5oIgogCisjaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgogI2luY2x1ZGUgImJhc2Uvb3B0aW9uYWwuaCIKICNpbmNsdWRlICJjb2JhbHQvYmFzZS90b2tlbi5oIgogI2luY2x1ZGUgImNvYmFsdC9iYXNlL3Rva2Vucy5oIgpAQCAtMjksOCArMzAsNiBAQAogI2luY2x1ZGUgImNvYmFsdC9kb20vcG9pbnRlcl9zdGF0ZS5oIgogI2luY2x1ZGUgImNvYmFsdC9kb20vdWlfZXZlbnQuaCIKICNpbmNsdWRlICJjb2JhbHQvZG9tL3doZWVsX2V2ZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L2xheW91dC9jb250YWluZXJfYm94LmgiCi0jaW5jbHVkZSAiY29iYWx0L2xheW91dC91c2VkX3N0eWxlLmgiCiAjaW5jbHVkZSAiY29iYWx0L21hdGgvdmVjdG9yMmQuaCIKICNpbmNsdWRlICJjb2JhbHQvbWF0aC92ZWN0b3IyZF9mLmgiCiAKQEAgLTQwLDkgKzM5LDE1IEBACiBzY29wZWRfcmVmcHRyPGRvbTo6SFRNTEVsZW1lbnQ+IFRvcG1vc3RFdmVudFRhcmdldDo6RmluZFRvcG1vc3RFdmVudFRhcmdldCgKICAgICBjb25zdCBzY29wZWRfcmVmcHRyPGRvbTo6RG9jdW1lbnQ+JiBkb2N1bWVudCwKICAgICBjb25zdCBtYXRoOjpWZWN0b3IyZEYmIGNvb3JkaW5hdGUpIHsKKyAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OmxheW91dCIsCisgICAgICAgICAgICAgICAiVG9wbW9zdEV2ZW50VGFyZ2V0OjpGaW5kVG9wbW9zdEV2ZW50VGFyZ2V0KCkiKTsKICAgRENIRUNLKGRvY3VtZW50KTsKICAgRENIRUNLKCFib3hfKTsKICAgRENIRUNLKHJlbmRlcl9zZXF1ZW5jZV8uZW1wdHkoKSk7CisKKyAgLy8gTWFrZSBzdXJlIHRoZSBkb2N1bWVudCdzIGxheW91dCBib3ggdHJlZSBpcyB1cC10by1kYXRlLgorICBkb2N1bWVudC0+RG9TeW5jaHJvbm91c0xheW91dCgpOworCiAgIGh0bWxfZWxlbWVudF8gPSBkb2N1bWVudC0+aHRtbCgpOwogICBDb25zaWRlckVsZW1lbnQoaHRtbF9lbGVtZW50XywgY29vcmRpbmF0ZSk7CiAgIGJveF8gPSBOVUxMOwpAQCAtMjkxLDYgKzI5Niw5IEBACiAKIHZvaWQgVG9wbW9zdEV2ZW50VGFyZ2V0OjpNYXliZVNlbmRQb2ludGVyRXZlbnRzKAogICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8ZG9tOjpFdmVudD4mIGV2ZW50KSB7CisgIFRSQUNFX0VWRU5UMCgiY29iYWx0OjpsYXlvdXQiLAorICAgICAgICAgICAgICAgIlRvcG1vc3RFdmVudFRhcmdldDo6TWF5YmVTZW5kUG9pbnRlckV2ZW50cygpIik7CisKICAgY29uc3QgZG9tOjpNb3VzZUV2ZW50KiBjb25zdCBtb3VzZV9ldmVudCA9CiAgICAgICBiYXNlOjpwb2x5bW9ycGhpY19kb3duY2FzdDxjb25zdCBkb206Ok1vdXNlRXZlbnQqIGNvbnN0PihldmVudC5nZXQoKSk7CiAgIERDSEVDSyhtb3VzZV9ldmVudCk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0ZGF0YS9jb2JhbHQvaW1hZ2Utb25lcnJvci1leHBlY3RlZC5wbmcgYi9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0ZGF0YS9jb2JhbHQvaW1hZ2Utb25lcnJvci1leHBlY3RlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVjMjgxMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvbGF5b3V0X3Rlc3RzL3Rlc3RkYXRhL2NvYmFsdC9pbWFnZS1vbmVycm9yLWV4cGVjdGVkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0ZGF0YS9jb2JhbHQvaW1hZ2Utb25lcnJvci5odG1sIGIvc3JjL2NvYmFsdC9sYXlvdXRfdGVzdHMvdGVzdGRhdGEvY29iYWx0L2ltYWdlLW9uZXJyb3IuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2YxMGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9sYXlvdXRfdGVzdHMvdGVzdGRhdGEvY29iYWx0L2ltYWdlLW9uZXJyb3IuaHRtbApAQCAtMCwwICsxLDc5IEBACis8IURPQ1RZUEUgaHRtbD4KKzxodG1sPgorPGhlYWQ+CisgIDx0aXRsZT5pbWFnZS1vbmVycm9yPC90aXRsZT4KKyAgPHN0eWxlPgorICAgICNyZXN1bHQgeworICAgICAgd2lkdGg6IDEwMHB4OworICAgICAgaGVpZ2h0OjEwMHB4OworICAgICAgYmFja2dyb3VuZC1jb2xvcjojMDA0N0FCOworICAgIH0KKyAgPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorCis8ZGl2IGlkPSJyZXN1bHQiPjwvZGl2PgorCis8c2NyaXB0PgorCitmdW5jdGlvbiBleHBlY3QoY29uZGl0aW9uLCBtZXNzYWdlKSB7CisgIGlmICghY29uZGl0aW9uKSB7CisgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3Jlc3VsdCcpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CisgICAgY29uc3QgZnVsbE1lc3NhZ2UgPSBgZmFpbGVkIGV4cGVjdGF0aW9uIGF0OgorJHtuZXcgRXJyb3IoKS5zdGFja30KKyR7dHlwZW9mIG1lc3NhZ2UgPT09ICd1bmRlZmluZWQnID8gJycgOiAnd2l0aCBtZXNzYWdlOiAnICsgbWVzc2FnZX1gOworICAgIGNvbnNvbGUuZXJyb3IoZnVsbE1lc3NhZ2UpOworICB9Cit9CisKK2lmICh3aW5kb3cudGVzdFJ1bm5lcikgeworICB3aW5kb3cudGVzdFJ1bm5lci53YWl0VW50aWxEb25lKCk7Cit9CisKK2NvbnN0IGltYWdlID0gbmV3IEltYWdlKCk7CisKK2xldCBpbWFnZU9uRXJyb3JXYXNDYWxsZWQgPSBmYWxzZTsKK2xldCBpbWFnZUVycm9yRXZlbnRIYW5kbGVyQ2FsbGVkID0gZmFsc2U7CisKK2Z1bmN0aW9uIGVuZFRlc3RJZkFsbEVycm9ySGFuZGxlcnNDYWxsZWQoKSB7CisgIGlmIChpbWFnZU9uRXJyb3JXYXNDYWxsZWQgJiYgaW1hZ2VFcnJvckV2ZW50SGFuZGxlckNhbGxlZCkgeworICAgIC8vIFN1Y2Nlc3MhCisgICAgaWYgKHdpbmRvdy50ZXN0UnVubmVyKSB7CisgICAgICB3aW5kb3cudGVzdFJ1bm5lci5ub3RpZnlEb25lKCk7CisgICAgfQorICB9Cit9CisKK2ltYWdlLm9uZXJyb3IgPSAoZXJyb3JFdmVudCkgPT4geworICBleHBlY3QoZXJyb3JFdmVudC50eXBlID09PSAnZXJyb3InLCBlcnJvckV2ZW50LnR5cGUpOworICBpbWFnZU9uRXJyb3JXYXNDYWxsZWQgPSB0cnVlOworICBlbmRUZXN0SWZBbGxFcnJvckhhbmRsZXJzQ2FsbGVkKCk7Cit9OworCitpbWFnZS5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIChlcnJvckV2ZW50KSA9PiB7CisgIGV4cGVjdChlcnJvckV2ZW50LnR5cGUgPT09ICdlcnJvcicsIGVycm9yRXZlbnQudHlwZSk7CisgIGltYWdlRXJyb3JFdmVudEhhbmRsZXJDYWxsZWQgPSB0cnVlOworICBlbmRUZXN0SWZBbGxFcnJvckhhbmRsZXJzQ2FsbGVkKCk7Cit9KTsKKworaW1hZ2Uuc3JjID0gJ2JvZ3Vzc2NoZW1lOi8vaW52YWxpZHVybCc7CisKK3NldFRpbWVvdXQoKCkgPT4geworICAvLyBJZiB3ZSBoaXQgdGhpcyB0aW1lb3V0IHdlIGhhdmUgZmFpbGVkIGJlY2F1c2Ugd2UgZXhwZWN0IHRoZSBwcmV2aW91cyBldmVudAorICAvLyBoYW5kbGVycyB0byBoYXZlIGJvdGggZmlyZWQgYmVmb3JlIHdlIGdldCBoZXJlLgorICBleHBlY3QoZmFsc2UpOworCisgIC8vIEhvd2V2ZXIsIGlmIHdlIGRvIGdldCBoZXJlLCB0aGUgc3Vic2VxdWVudCBleHBlY3Qgc3RhdGVtZW50cyBjYW4gaGVscAorICAvLyBpZGVudGlmeSB3aGljaCBvZiB0aGUgZXJyb3IgaGFuZGxlcnMgZmFpbGVkIHRvIGJlIGNhbGxlZC4KKyAgZXhwZWN0KGltYWdlT25FcnJvcldhc0NhbGxlZCk7CisgIGV4cGVjdChpbWFnZUVycm9yRXZlbnRIYW5kbGVyQ2FsbGVkKTsKKworICBpZiAod2luZG93LnRlc3RSdW5uZXIpIHsKKyAgICB3aW5kb3cudGVzdFJ1bm5lci5ub3RpZnlEb25lKCk7CisgIH0KK30sIDEwMDApOworCis8L3NjcmlwdD4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sYXlvdXRfdGVzdHMvdGVzdGRhdGEvY29iYWx0L2xheW91dF90ZXN0cy50eHQgYi9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0ZGF0YS9jb2JhbHQvbGF5b3V0X3Rlc3RzLnR4dAppbmRleCA1ZmE5NzZjLi5kMjA4ZWZhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0ZGF0YS9jb2JhbHQvbGF5b3V0X3Rlc3RzLnR4dAorKysgYi9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0ZGF0YS9jb2JhbHQvbGF5b3V0X3Rlc3RzLnR4dApAQCAtNyw2ICs3LDcgQEAKIGZpeGVkLXdpZHRoLWRpdnMtd2l0aC1iYWNrZ3JvdW5kLWNvbG9yCiBmb250LXdlaWdodAogaW1hZ2UtZnJvbS1ibG9iCitpbWFnZS1vbmVycm9yCiBpbmxpbmUtYm94LXdpdGgtb3ZlcmZsb3ctd29yZHMKIGlubGluZS1zdHlsZS1hbGxvd2VkLXdoaWxlLWNsb25pbmctb2JqZWN0cwogaW50ZXJmYWNlLW9iamVjdC10eXBlcy1hcmUtY29ycmVjdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sYXlvdXRfdGVzdHMvdGVzdGRhdGEvY29iYWx0L3dpbmRvdy1vbmVycm9yLmh0bWwgYi9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0ZGF0YS9jb2JhbHQvd2luZG93LW9uZXJyb3IuaHRtbAppbmRleCA2YmFhNzdkLi4yMGJmMGI3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0ZGF0YS9jb2JhbHQvd2luZG93LW9uZXJyb3IuaHRtbAorKysgYi9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0ZGF0YS9jb2JhbHQvd2luZG93LW9uZXJyb3IuaHRtbApAQCAtMjgsMjYgKzI4LDEzIEBACiAKIGxldCB3aW5kb3dPbkVycm9yV2FzQ2FsbGVkID0gZmFsc2U7CiB3aW5kb3cub25lcnJvciA9IChtZXNzYWdlLCBmaWxlbmFtZSwgbGluZW5vLCBjb2xubywgZXJyb3IpID0+IHsKLSAgaWYgKHR5cGVvZiBtZXNzYWdlID09PSAnb2JqZWN0JykgewotICAgIC8vIFRoZSBjb2RlIGJlbG93IGlzIHRvIHdvcmsgYXJvdW5kIENvYmFsdCdzIHdpbmRvdy5vbmVycm9yIHNpZ25hdHVyZSBub3QgYmVpbmcgY29ycmVjdAotICAgIC8vIChhbHRob3VnaCB3ZWlyZCwgdGhlIHNwZWMgc2F5cyB5b3UncmUgc3VwcG9zZWQgdG8gZXhwYW5kIHRoZSBldmVudCBpbnRvIGl0cyBhdHRyaWJ1dGVzIGJlZm9yZQotICAgIC8vIGRpc3BhdGNoaW5nIGl0KS4gIEl0IGlzIHN0aWxsIGltcG9ydGFudCB0byB0ZXN0IHRoZSByZXN0IG9mIHdpbmRvdy5vbmVycm9yIHN1cHBvcnQsIGRlc3BpdGUKLSAgICAvLyB0aGlzIGtub3duIGlzc3VlLgotICAgIGNvbnN0IGVycm9yRXZlbnQgPSBtZXNzYWdlOwotICAgIG1lc3NhZ2UgPSBlcnJvckV2ZW50Lm1lc3NhZ2U7Ci0gICAgZmlsZW5hbWUgPSBlcnJvckV2ZW50LmZpbGVuYW1lOwotICAgIGxpbmVubyA9IGVycm9yRXZlbnQubGluZW5vOwotICAgIGNvbG5vID0gZXJyb3JFdmVudC5jb2xubzsKLSAgICBlcnJvciA9IGVycm9yRXZlbnQuZXJyb3I7Ci0gIH0KLQogICAvLyBXZSBhbGxvdyBhbnl0aGluZyB0aGF0IGVuZHMgd2l0aCAibXlDb29sTWVzc2FnZSIgdG8gcGFzcywgQ2hyb21lL0ZpcmVmb3ggYmVoYXZpb3IgZGlmZmVycyBoZXJlCiAgIC8vIChDaHJvbWU6ICJVbmNhdWdodCBFcnJvcjogbXlDb29sTWVzc2FnZSIsIEZpcmVmb3g6ICJFcnJvcjogbXlDb29sTWVzc2FnZSIpLgogICBleHBlY3QoLy4qbXlDb29sTWVzc2FnZS8udGVzdChtZXNzYWdlKSwgbWVzc2FnZSk7CiAgIC8vIEFsbG93IGFueSBmaWxlbmFtZSB0aGF0IGVuZHMgd2l0aCAid2luZG93LW9uZXJyb3IuaHRtbCIsIGluIG9yZGVyIHRvIG5vdCBjb3VwbGUgdG9vIGhlYXZpbHkgdG8KICAgLy8gdGhlIGltcGxlbWVudGF0aW9uIG9mIGxheW91dF90ZXN0cy4KICAgZXhwZWN0KC8uKndpbmRvdy1vbmVycm9yLmh0bWwvLnRlc3QoZmlsZW5hbWUpLCBmaWxlbmFtZSk7Ci0gIGV4cGVjdChsaW5lbm8gPT09IDcyLCBsaW5lbm8pOworICBleHBlY3QobGluZW5vID09PSA4MywgbGluZW5vKTsKICAgLy8gVGhlIHZhbHVlIG9mIHRoZSBjb2x1bW4gbnVtYmVyIGlzIG5vdCBzdGFuZGFyZCBhY3Jvc3MgbWFqb3IgYnJvd3NlcnMuCiAgIC8vICAgQ2hyb21lOiAxIHdpdGhvdXQgZGV2dG9vbHMgb3BlbiwgNyB3aXRoIGRldnRvb2xzIG9wZW4uCiAgIC8vICAgRWRnZTogQWx3YXlzIDEuCkBAIC02MCwxMSArNDcsMzUgQEAKICAgd2luZG93T25FcnJvcldhc0NhbGxlZCA9IHRydWU7CiB9OwogCisvLyBNYWtlIHN1cmUgdGhhdCB3aGVuIGFuIGV2ZW50IGhhbmRsZXIgaXMgYWRkZWQgZm9yIHRoZSAnZXJyb3InIGV2ZW50IHZpYQorLy8gYWRkRXZlbnRMaXN0ZW5lciwgaXQgYXNzdW1lcyB0aGUgdXN1YWwgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIGp1c3QgdGhlIGV2ZW50CisvLyBvYmplY3QuCitsZXQgd2luZG93RXJyb3JFdmVudEhhbmRsZXJDYWxsZWQgPSBmYWxzZTsKK3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIChlcnJvckV2ZW50KSA9PiB7CisgIGV4cGVjdChlcnJvckV2ZW50LnR5cGUgPT0gJ2Vycm9yJywgZXJyb3JFdmVudC50eXBlKTsKKworICAvLyBDaGVjayB0aGUgc2FtZSBwYXJhbWV0ZXJzIGFzIGFib3ZlIGluIHRoZSBvbmVycm9yIGF0dHJpYnV0ZSBldmVudCBoYW5kbGVyLAorICAvLyBqdXN0IG1ha2Ugc3VyZSB0aGV5IGFyZSBwYXNzZWQgdGhyb3VnaCBhcyBhbiBldmVudCBvYmplY3QgaW5zdGVhZCBvZgorICAvLyBleHBhbmRlZC4KKyAgZXhwZWN0KC8uKm15Q29vbE1lc3NhZ2UvLnRlc3QoZXJyb3JFdmVudC5tZXNzYWdlKSwgZXJyb3JFdmVudC5tZXNzYWdlKTsKKyAgZXhwZWN0KC8uKndpbmRvdy1vbmVycm9yLmh0bWwvLnRlc3QoZXJyb3JFdmVudC5maWxlbmFtZSksCisgICAgICAgICBlcnJvckV2ZW50LmZpbGVuYW1lKTsKKyAgZXhwZWN0KGVycm9yRXZlbnQubGluZW5vID09PSA4MywgZXJyb3JFdmVudC5saW5lbm8pOworICBleHBlY3QoZXJyb3JFdmVudC5jb2xubyA9PT0gMSB8fCBlcnJvckV2ZW50LmNvbG5vID09PSA3IHx8CisgICAgICAgICBlcnJvckV2ZW50LmNvbG5vID09PSAxOCwgZXJyb3JFdmVudC5jb2xubyk7CisgIGV4cGVjdCh0eXBlb2YgZXJyb3JFdmVudC5lcnJvciA9PT0gJ29iamVjdCcsIHR5cGVvZiBlcnJvckV2ZW50LmVycm9yKTsKKyAgZXhwZWN0KFN0cmluZyhlcnJvckV2ZW50LmVycm9yKSA9PT0gJ0Vycm9yOiBteUNvb2xNZXNzYWdlJywKKyAgICAgICAgIFN0cmluZyhlcnJvckV2ZW50LmVycm9yKSk7CisKKyAgd2luZG93RXJyb3JFdmVudEhhbmRsZXJDYWxsZWQgPSB0cnVlOworfSk7CisKIGlmICh3aW5kb3cudGVzdFJ1bm5lcikgewogICB3aW5kb3cudGVzdFJ1bm5lci53YWl0VW50aWxEb25lKCk7CiB9CiBzZXRUaW1lb3V0KCgpID0+IHsKICAgZXhwZWN0KHdpbmRvd09uRXJyb3JXYXNDYWxsZWQpOworICBleHBlY3Qod2luZG93RXJyb3JFdmVudEhhbmRsZXJDYWxsZWQpOwogICBpZiAod2luZG93LnRlc3RSdW5uZXIpIHsKICAgICB3aW5kb3cudGVzdFJ1bm5lci5ub3RpZnlEb25lKCk7CiAgIH0KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbGF5b3V0X3Rlc3RzL3Rlc3RkYXRhL3dlYi1wbGF0Zm9ybS10ZXN0cy9odG1sL3dlYl9wbGF0Zm9ybV90ZXN0cy50eHQgYi9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0ZGF0YS93ZWItcGxhdGZvcm0tdGVzdHMvaHRtbC93ZWJfcGxhdGZvcm1fdGVzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZWUwYzQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0ZGF0YS93ZWItcGxhdGZvcm0tdGVzdHMvaHRtbC93ZWJfcGxhdGZvcm1fdGVzdHMudHh0CkBAIC0wLDAgKzEsMyBAQAorIyBIVE1MCisKK3dlYmFwcGFwaXMvYXRvYi9iYXNlNjQuaHRtbCxQQVNTClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sYXlvdXRfdGVzdHMvd2ViX3BsYXRmb3JtX3Rlc3RzLmNjIGIvc3JjL2NvYmFsdC9sYXlvdXRfdGVzdHMvd2ViX3BsYXRmb3JtX3Rlc3RzLmNjCmluZGV4IDI4MTgwM2UuLjc4Y2Y0NDIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbGF5b3V0X3Rlc3RzL3dlYl9wbGF0Zm9ybV90ZXN0cy5jYworKysgYi9zcmMvY29iYWx0L2xheW91dF90ZXN0cy93ZWJfcGxhdGZvcm1fdGVzdHMuY2MKQEAgLTE5NywxMiArMTk3LDE0IEBACiAgIHN0ZDo6dmVjdG9yPFRlc3RSZXN1bHQ+IHRlc3RfcmVzdWx0czsKIAogICBzY29wZWRfcHRyPGJhc2U6OlZhbHVlPiByb290OwotICBiYXNlOjpKU09OUmVhZGVyIHJlYWRlcjsKKyAgYmFzZTo6SlNPTlJlYWRlciByZWFkZXIoCisgICAgICBiYXNlOjpKU09OUGFyc2VyT3B0aW9uczo6SlNPTl9SRVBMQUNFX0lOVkFMSURfQ0hBUkFDVEVSUyk7CiAgIHJvb3QucmVzZXQocmVhZGVyLlJlYWRUb1ZhbHVlKGpzb25fcmVzdWx0cykpOwogICAvLyBFeHBlY3QgdGhhdCBwYXJzaW5nIHRlc3QgcmVzdWx0IHN1Y2NlZWRlZC4KICAgRVhQRUNUX0VRKGJhc2U6OkpTT05SZWFkZXI6OkpTT05fTk9fRVJST1IsIHJlYWRlci5lcnJvcl9jb2RlKCkpOwogICBpZiAoIXJvb3QpIHsKICAgICAvLyBVbnBhcnNlYWJsZSBKU09OLCBvciBlbXB0eSBzdHJpbmcuCisgICAgTE9HKEVSUk9SKSA8PCAiV2ViIFBsYXRmb3JtIFRlc3RzIHJldHVybmVkIHVucGFyc2VhYmxlIEpTT04gdGVzdCByZXN1bHQhIjsKICAgICByZXR1cm4gdGVzdF9yZXN1bHRzOwogICB9CiAKQEAgLTMxNyw2ICszMTksMTAgQEAKICAgICA6OnRlc3Rpbmc6OlZhbHVlc0luKEVudW1lcmF0ZVdlYlBsYXRmb3JtVGVzdHMoIlhNTEh0dHBSZXF1ZXN0IikpKTsKIAogSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoCisgICAgY29iYWx0X3NwZWNpYWwsIFdlYlBsYXRmb3JtVGVzdCwKKyAgICA6OnRlc3Rpbmc6OlZhbHVlc0luKEVudW1lcmF0ZVdlYlBsYXRmb3JtVGVzdHMoImNvYmFsdF9zcGVjaWFsIikpKTsKKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoCiAgICAgY3NwLCBXZWJQbGF0Zm9ybVRlc3QsCiAgICAgOjp0ZXN0aW5nOjpWYWx1ZXNJbihFbnVtZXJhdGVXZWJQbGF0Zm9ybVRlc3RzKCJjb250ZW50LXNlY3VyaXR5LXBvbGljeSIpKSk7CiAKQEAgLTMzNiw2ICszNDIsOSBAQAogICAgIDo6dGVzdGluZzo6VmFsdWVzSW4oRW51bWVyYXRlV2ViUGxhdGZvcm1UZXN0cygiZmV0Y2giLCAiJ2ZldGNoJyBpbiB0aGlzIikpKTsKICNlbmRpZgogCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChodG1sLCBXZWJQbGF0Zm9ybVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlc0luKEVudW1lcmF0ZVdlYlBsYXRmb3JtVGVzdHMoImh0bWwiKSkpOworCiBJTlNUQU5USUFURV9URVNUX0NBU0VfUCgKICAgICBtZWRpYXNlc3Npb24sIFdlYlBsYXRmb3JtVGVzdCwKICAgICA6OnRlc3Rpbmc6OlZhbHVlc0luKEVudW1lcmF0ZVdlYlBsYXRmb3JtVGVzdHMoIm1lZGlhc2Vzc2lvbiIpKSk7CkBAIC0zNDcsMTAgKzM1Niw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0cmVhbXMiLCAiJ1JlYWRhYmxlU3RyZWFtJyBpbiB0aGlzIikpKTsKICNlbmRpZgogCi1JTlNUQU5USUFURV9URVNUX0NBU0VfUCgKLSAgICBjb2JhbHRfc3BlY2lhbCwgV2ViUGxhdGZvcm1UZXN0LAotICAgIDo6dGVzdGluZzo6VmFsdWVzSW4oRW51bWVyYXRlV2ViUGxhdGZvcm1UZXN0cygiY29iYWx0X3NwZWNpYWwiKSkpOwotCiAjZW5kaWYgIC8vICFkZWZpbmVkKENPQkFMVF9XSU4pCiAKIH0gIC8vIG5hbWVzcGFjZSBsYXlvdXRfdGVzdHMKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL2FuaW1hdGVkX3dlYnBfaW1hZ2UuaCBiL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL2FuaW1hdGVkX3dlYnBfaW1hZ2UuaAppbmRleCBkZTljYTQ5Li40Zjg1NmU2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xvYWRlci9pbWFnZS9hbmltYXRlZF93ZWJwX2ltYWdlLmgKKysrIGIvc3JjL2NvYmFsdC9sb2FkZXIvaW1hZ2UvYW5pbWF0ZWRfd2VicF9pbWFnZS5oCkBAIC0zMCw3ICszMCw3IEBACiAjaW5jbHVkZSAiY29iYWx0L2xvYWRlci9pbWFnZS9pbWFnZS5oIgogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJfdHJlZS9jb2xvcl9yZ2JhLmgiCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcl90cmVlL3Jlc291cmNlX3Byb3ZpZGVyLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbGlid2VicC93ZWJwL2RlbXV4LmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbGlid2VicC9zcmMvd2VicC9kZW11eC5oIgogCiBuYW1lc3BhY2UgY29iYWx0IHsKIG5hbWVzcGFjZSBsb2FkZXIgewpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sb2FkZXIvaW1hZ2UvaW1hZ2VfZW5jb2Rlci5jYyBiL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL2ltYWdlX2VuY29kZXIuY2MKaW5kZXggZGEzZjgzMi4uMDhmZmM3NSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sb2FkZXIvaW1hZ2UvaW1hZ2VfZW5jb2Rlci5jYworKysgYi9zcmMvY29iYWx0L2xvYWRlci9pbWFnZS9pbWFnZV9lbmNvZGVyLmNjCkBAIC0xNCw4ICsxNCw5IEBACiAKICNpbmNsdWRlICJjb2JhbHQvbG9hZGVyL2ltYWdlL2ltYWdlX2VuY29kZXIuaCIKIAorI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvdGVzdC9wbmdfdXRpbHMvcG5nX2VuY29kZS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2xpYndlYnAvd2VicC9lbmNvZGUuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy93ZWJwL2VuY29kZS5oIgogCiBuYW1lc3BhY2UgY29iYWx0IHsKIG5hbWVzcGFjZSBsb2FkZXIgewpAQCAtMjYsNiArMjcsNyBAQAogc2NvcGVkX2FycmF5PHVpbnQ4PiBXcml0ZVJHQkFQaXhlbHNUb1BORyhjb25zdCB1aW50OCogY29uc3QgcGl4ZWxfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0aDo6U2l6ZSYgZGltZW5zaW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBvdXRfbnVtX2J5dGVzKSB7CisgIFRSQUNFX0VWRU5UMCgiY29iYWx0Ojpsb2FkZXIiLCAiSW1hZ2VFbmNvZGVyOjpXcml0ZVJHQkFQaXhlbHNUb1BORygpIik7CiAgIGNvbnN0IGludCBrUkdCQUJ5dGVzUGVyUGl4ZWwgPSA0OwogICBjb25zdCBpbnQga1BpdGNoU2l6ZUluQnl0ZXMgPSBkaW1lbnNpb25zLndpZHRoKCkgKiBrUkdCQUJ5dGVzUGVyUGl4ZWw7CiAgIHJldHVybiBFbmNvZGVSR0JBVG9CdWZmZXIocGl4ZWxfZGF0YSwgZGltZW5zaW9ucy53aWR0aCgpLCBkaW1lbnNpb25zLmhlaWdodCgpLApAQCAtMzUsNiArMzcsNyBAQAogc2NvcGVkX3JlZnB0cjxsb2FkZXI6OmltYWdlOjpFbmNvZGVkU3RhdGljSW1hZ2U+IENvbXByZXNzUkdCQUltYWdlKAogICAgIGxvYWRlcjo6aW1hZ2U6OkVuY29kZWRTdGF0aWNJbWFnZTo6SW1hZ2VGb3JtYXQgZGVzaXJlZF9mb3JtYXQsCiAgICAgY29uc3QgdWludDgqIGNvbnN0IGltYWdlX2RhdGEsIGNvbnN0IG1hdGg6OlNpemUmIGRpbWVuc2lvbnMpIHsKKyAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OmxvYWRlciIsICJJbWFnZUVuY29kZXI6OkNvbXByZXNzUkdCQUltYWdlKCkiKTsKICAgdXNpbmcgSW1hZ2VGb3JtYXQgPSBsb2FkZXI6OmltYWdlOjpFbmNvZGVkU3RhdGljSW1hZ2U6OkltYWdlRm9ybWF0OwogICBzd2l0Y2ggKGRlc2lyZWRfZm9ybWF0KSB7CiAgICAgY2FzZSBJbWFnZUZvcm1hdDo6a1BORzogewpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sb2FkZXIvaW1hZ2Uvd2VicF9pbWFnZV9kZWNvZGVyLmNjIGIvc3JjL2NvYmFsdC9sb2FkZXIvaW1hZ2Uvd2VicF9pbWFnZV9kZWNvZGVyLmNjCmluZGV4IDU2MDJlZjYuLmMzNzI3OTAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL3dlYnBfaW1hZ2VfZGVjb2Rlci5jYworKysgYi9zcmMvY29iYWx0L2xvYWRlci9pbWFnZS93ZWJwX2ltYWdlX2RlY29kZXIuY2MKQEAgLTM5LDggKzM5LDYgQEAKICAgY29uZmlnXy5vcHRpb25zLm5vX2ZhbmN5X3Vwc2FtcGxpbmcgPSAxOwogICAvLyBEb24ndCB1c2UgbXVsdGktdGhyZWFkZWQgZGVjb2RpbmcuCiAgIGNvbmZpZ18ub3B0aW9ucy51c2VfdGhyZWFkcyA9IDA7Ci0gIC8vIERpc2NhcmQgZW5oYW5jZW1lbnQgbGF5ZXIuCi0gIGNvbmZpZ18ub3B0aW9ucy5ub19lbmhhbmNlbWVudCA9IDE7CiB9CiAKIFdFQlBJbWFnZURlY29kZXI6On5XRUJQSW1hZ2VEZWNvZGVyKCkgewpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sb2FkZXIvaW1hZ2Uvd2VicF9pbWFnZV9kZWNvZGVyLmggYi9zcmMvY29iYWx0L2xvYWRlci9pbWFnZS93ZWJwX2ltYWdlX2RlY29kZXIuaAppbmRleCBhYTkzZTQyLi40NWQ3NzNmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xvYWRlci9pbWFnZS93ZWJwX2ltYWdlX2RlY29kZXIuaAorKysgYi9zcmMvY29iYWx0L2xvYWRlci9pbWFnZS93ZWJwX2ltYWdlX2RlY29kZXIuaApAQCAtMjAsNyArMjAsNyBAQAogCiAjaW5jbHVkZSAiY29iYWx0L2xvYWRlci9pbWFnZS9hbmltYXRlZF93ZWJwX2ltYWdlLmgiCiAjaW5jbHVkZSAiY29iYWx0L2xvYWRlci9pbWFnZS9pbWFnZV9kYXRhX2RlY29kZXIuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9saWJ3ZWJwL3dlYnAvZGVjb2RlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbGlid2VicC9zcmMvd2VicC9kZWNvZGUuaCIKIAogbmFtZXNwYWNlIGNvYmFsdCB7CiBuYW1lc3BhY2UgbG9hZGVyIHsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbG9hZGVyL2xvYWRlcl9mYWN0b3J5LmNjIGIvc3JjL2NvYmFsdC9sb2FkZXIvbG9hZGVyX2ZhY3RvcnkuY2MKaW5kZXggNWVmMjIyOS4uMGM3ZDY5NSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sb2FkZXIvbG9hZGVyX2ZhY3RvcnkuY2MKKysrIGIvc3JjL2NvYmFsdC9sb2FkZXIvbG9hZGVyX2ZhY3RvcnkuY2MKQEAgLTk3LDYgKzk3LDUxIEBACiAgIHJldHVybiBsb2FkZXIuUGFzcygpOwogfQogCitzY29wZWRfcHRyPExvYWRlcj4gTG9hZGVyRmFjdG9yeTo6Q3JlYXRlTGlua0xvYWRlcigKKyAgICBjb25zdCBHVVJMJiB1cmwsIGNvbnN0IE9yaWdpbiYgb3JpZ2luLAorICAgIGNvbnN0IGNzcDo6U2VjdXJpdHlDYWxsYmFjayYgdXJsX3NlY3VyaXR5X2NhbGxiYWNrLAorICAgIGNvbnN0IGxvYWRlcjo6UmVxdWVzdE1vZGUgY29yc19tb2RlLAorICAgIGNvbnN0IFRleHREZWNvZGVyOjpTdWNjZXNzQ2FsbGJhY2smIHN1Y2Nlc3NfY2FsbGJhY2ssCisgICAgY29uc3QgTG9hZGVyOjpPbkVycm9yRnVuY3Rpb24mIGxvYWRlcl9lcnJvcl9jYWxsYmFjaykgeworICBEQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7CisKKyAgc2NvcGVkX3B0cjxsb2FkZXI6OkRlY29kZXI+IGRlY29kZXIoCisgICAgICBuZXcgbG9hZGVyOjpUZXh0RGVjb2RlcihzdWNjZXNzX2NhbGxiYWNrKSk7CisKKyAgTG9hZGVyOjpGZXRjaGVyQ3JlYXRvciBmZXRjaGVyX2NyZWF0b3IgPQorICAgICAgTWFrZUZldGNoZXJDcmVhdG9yKHVybCwgdXJsX3NlY3VyaXR5X2NhbGxiYWNrLCBjb3JzX21vZGUsIG9yaWdpbik7CisgIHNjb3BlZF9wdHI8TG9hZGVyPiBsb2FkZXIobmV3IExvYWRlcigKKyAgICAgIGZldGNoZXJfY3JlYXRvciwgZGVjb2Rlci5QYXNzKCksIGxvYWRlcl9lcnJvcl9jYWxsYmFjaywKKworICAgICAgYmFzZTo6QmluZCgmTG9hZGVyRmFjdG9yeTo6T25Mb2FkZXJEZXN0cm95ZWQsIGJhc2U6OlVucmV0YWluZWQodGhpcykpLAorICAgICAgaXNfc3VzcGVuZGVkXykpOworCisgIE9uTG9hZGVyQ3JlYXRlZChsb2FkZXIuZ2V0KCkpOworICByZXR1cm4gbG9hZGVyLlBhc3MoKTsKK30KKworc2NvcGVkX3B0cjxMb2FkZXI+IExvYWRlckZhY3Rvcnk6OkNyZWF0ZVNjcmlwdExvYWRlcigKKyAgICBjb25zdCBHVVJMJiB1cmwsIGNvbnN0IE9yaWdpbiYgb3JpZ2luLAorICAgIGNvbnN0IGNzcDo6U2VjdXJpdHlDYWxsYmFjayYgdXJsX3NlY3VyaXR5X2NhbGxiYWNrLAorICAgIGNvbnN0IFRleHREZWNvZGVyOjpTdWNjZXNzQ2FsbGJhY2smIHN1Y2Nlc3NfY2FsbGJhY2ssCisgICAgY29uc3QgTG9hZGVyOjpPbkVycm9yRnVuY3Rpb24mIGxvYWRlcl9lcnJvcl9jYWxsYmFjaykgeworICBEQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7CisKKyAgc2NvcGVkX3B0cjxsb2FkZXI6OkRlY29kZXI+IGRlY29kZXIoCisgICAgICBuZXcgbG9hZGVyOjpUZXh0RGVjb2RlcihzdWNjZXNzX2NhbGxiYWNrKSk7CisKKyAgTG9hZGVyOjpGZXRjaGVyQ3JlYXRvciBmZXRjaGVyX2NyZWF0b3IgPQorICAgICAgTWFrZUZldGNoZXJDcmVhdG9yKHVybCwgdXJsX3NlY3VyaXR5X2NhbGxiYWNrLCBrTm9DT1JTTW9kZSwgb3JpZ2luKTsKKyAgc2NvcGVkX3B0cjxMb2FkZXI+IGxvYWRlcihuZXcgTG9hZGVyKAorICAgICAgZmV0Y2hlcl9jcmVhdG9yLCBkZWNvZGVyLlBhc3MoKSwgbG9hZGVyX2Vycm9yX2NhbGxiYWNrLAorCisgICAgICBiYXNlOjpCaW5kKCZMb2FkZXJGYWN0b3J5OjpPbkxvYWRlckRlc3Ryb3llZCwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSksCisgICAgICBpc19zdXNwZW5kZWRfKSk7CisKKyAgT25Mb2FkZXJDcmVhdGVkKGxvYWRlci5nZXQoKSk7CisgIHJldHVybiBsb2FkZXIuUGFzcygpOworfQorCiBMb2FkZXI6OkZldGNoZXJDcmVhdG9yIExvYWRlckZhY3Rvcnk6Ok1ha2VGZXRjaGVyQ3JlYXRvcigKICAgICBjb25zdCBHVVJMJiB1cmwsIGNvbnN0IGNzcDo6U2VjdXJpdHlDYWxsYmFjayYgdXJsX3NlY3VyaXR5X2NhbGxiYWNrLAogICAgIFJlcXVlc3RNb2RlIHJlcXVlc3RfbW9kZSwgY29uc3QgT3JpZ2luJiBvcmlnaW4pIHsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbG9hZGVyL2xvYWRlcl9mYWN0b3J5LmggYi9zcmMvY29iYWx0L2xvYWRlci9sb2FkZXJfZmFjdG9yeS5oCmluZGV4IGNmZWYyZmMuLmNkZTRjNTYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbG9hZGVyL2xvYWRlcl9mYWN0b3J5LmgKKysrIGIvc3JjL2NvYmFsdC9sb2FkZXIvbG9hZGVyX2ZhY3RvcnkuaApAQCAtMTksMTEgKzE5LDEzIEBACiAKICNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWQuaCIKICNpbmNsdWRlICJjb2JhbHQvY3NwL2NvbnRlbnRfc2VjdXJpdHlfcG9saWN5LmgiCisjaW5jbHVkZSAiY29iYWx0L2xvYWRlci9mZXRjaGVyLmgiCiAjaW5jbHVkZSAiY29iYWx0L2xvYWRlci9mZXRjaGVyX2ZhY3RvcnkuaCIKICNpbmNsdWRlICJjb2JhbHQvbG9hZGVyL2ZvbnQvdHlwZWZhY2VfZGVjb2Rlci5oIgogI2luY2x1ZGUgImNvYmFsdC9sb2FkZXIvaW1hZ2UvaW1hZ2VfZGVjb2Rlci5oIgogI2luY2x1ZGUgImNvYmFsdC9sb2FkZXIvbG9hZGVyLmgiCiAjaW5jbHVkZSAiY29iYWx0L2xvYWRlci9tZXNoL21lc2hfZGVjb2Rlci5oIgorI2luY2x1ZGUgImNvYmFsdC9sb2FkZXIvdGV4dF9kZWNvZGVyLmgiCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcl90cmVlL3Jlc291cmNlX3Byb3ZpZGVyLmgiCiAjaW5jbHVkZSAiZ29vZ2xldXJsL3NyYy9ndXJsLmgiCiAKQEAgLTYwLDYgKzYyLDIxIEBACiAgICAgICBjb25zdCBtZXNoOjpNZXNoRGVjb2Rlcjo6U3VjY2Vzc0NhbGxiYWNrJiBzdWNjZXNzX2NhbGxiYWNrLAogICAgICAgY29uc3QgbWVzaDo6TWVzaERlY29kZXI6OkVycm9yQ2FsbGJhY2smIGVycm9yX2NhbGxiYWNrKTsKIAorICAvLyBDcmVhdGVzIGEgbG9hZGVyIHRoYXQgZmV0Y2hlcyBhbmQgZGVjb2RlcyBhIEphdmFzY3JpcHQgcmVzb3VyY2UuCisgIHNjb3BlZF9wdHI8TG9hZGVyPiBDcmVhdGVTY3JpcHRMb2FkZXIoCisgICAgICBjb25zdCBHVVJMJiB1cmwsIGNvbnN0IE9yaWdpbiYgb3JpZ2luLAorICAgICAgY29uc3QgY3NwOjpTZWN1cml0eUNhbGxiYWNrJiB1cmxfc2VjdXJpdHlfY2FsbGJhY2ssCisgICAgICBjb25zdCBUZXh0RGVjb2Rlcjo6U3VjY2Vzc0NhbGxiYWNrJiBzdWNjZXNzX2NhbGxiYWNrLAorICAgICAgY29uc3QgTG9hZGVyOjpPbkVycm9yRnVuY3Rpb24mIGxvYWRlcl9lcnJvcl9jYWxsYmFjayk7CisKKyAgLy8gQ3JlYXRlcyBhIGxvYWRlciB0aGF0IGZldGNoZXMgYW5kIGRlY29kZXMgYSBsaW5rIHJlc291cmNlcy4KKyAgc2NvcGVkX3B0cjxMb2FkZXI+IENyZWF0ZUxpbmtMb2FkZXIoCisgICAgICBjb25zdCBHVVJMJiB1cmwsIGNvbnN0IE9yaWdpbiYgb3JpZ2luLAorICAgICAgY29uc3QgY3NwOjpTZWN1cml0eUNhbGxiYWNrJiB1cmxfc2VjdXJpdHlfY2FsbGJhY2ssCisgICAgICBjb25zdCBsb2FkZXI6OlJlcXVlc3RNb2RlIGNvcnNfbW9kZSwKKyAgICAgIGNvbnN0IFRleHREZWNvZGVyOjpTdWNjZXNzQ2FsbGJhY2smIHN1Y2Nlc3NfY2FsbGJhY2ssCisgICAgICBjb25zdCBMb2FkZXI6Ok9uRXJyb3JGdW5jdGlvbiYgbG9hZGVyX2Vycm9yX2NhbGxiYWNrKTsKKwogICAvLyBDbGVhcnMgb3V0IHRoZSBsb2FkZXIgZmFjdG9yeSdzIHJlc291cmNlIHByb3ZpZGVyLCBhYm9ydGluZyBhbnkgaW4tcHJvZ3Jlc3MKICAgLy8gbG9hZHMuCiAgIHZvaWQgU3VzcGVuZCgpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sb2FkZXIvcmVzb3VyY2VfY2FjaGUuaCBiL3NyYy9jb2JhbHQvbG9hZGVyL3Jlc291cmNlX2NhY2hlLmgKaW5kZXggNjE4NTc1Mi4uZTI1YzE5ZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sb2FkZXIvcmVzb3VyY2VfY2FjaGUuaAorKysgYi9zcmMvY29iYWx0L2xvYWRlci9yZXNvdXJjZV9jYWNoZS5oCkBAIC01NzMsNiArNTczLDEwIEBACiAgIFJlc291cmNlU2V0IG5vbl9jYWxsYmFja19ibG9ja2luZ19sb2FkaW5nX3Jlc291cmNlX3NldF87CiAgIC8vIFJlc291cmNlcyB0aGF0IGhhdmUgY29tcGxldGVkIGxvYWRpbmcgYW5kIGhhdmUgY2FsbGJhY2tzIHBlbmRpbmcuCiAgIFJlc291cmNlQ2FsbGJhY2tNYXAgcGVuZGluZ19jYWxsYmFja19tYXBfOworICAvLyBUaW1lciB1c2VkIHRvIGVuc3VyZSB0aGF0IHBlbmRpbmcgY2FsbGJhY2tzIGFyZSBoYW5kbGVkIGluIGEgdGltZWx5IG1hbm5lcgorICAvLyB3aGVuIGNhbGxiYWNrcyBhcmUgYmVpbmcgYmxvY2tlZCBieSBhZGRpdGlvbmFsIGxvYWRpbmcgcmVzb3VyY2VzLgorICBiYXNlOjpPbmVTaG90VGltZXI8UmVzb3VyY2VDYWNoZTxDYWNoZVR5cGU+PiBwcm9jZXNzX3BlbmRpbmdfY2FsbGJhY2tfdGltZXJfOworCiAgIC8vIFdoZXRoZXIgb3Igbm90IFByb2Nlc3NQZW5kaW5nQ2FsbGJhY2tzKCkgaXMgcnVubmluZy4KICAgYm9vbCBpc19wcm9jZXNzaW5nX3BlbmRpbmdfY2FsbGJhY2tzXzsKICAgLy8gV2hldGhlciBvciBub3QgY2FsbGJhY2tzIGFyZSBjdXJyZW50bHkgZGlzYWJsZWQuCkBAIC03MDksNiArNzEzLDcgQEAKIHRlbXBsYXRlIDx0eXBlbmFtZSBDYWNoZVR5cGU+CiB2b2lkIFJlc291cmNlQ2FjaGU8Q2FjaGVUeXBlPjo6UHJvY2Vzc1BlbmRpbmdDYWxsYmFja3MoKSB7CiAgIERDSEVDSyhyZXNvdXJjZV9jYWNoZV90aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKKyAgcHJvY2Vzc19wZW5kaW5nX2NhbGxiYWNrX3RpbWVyXy5TdG9wKCk7CiAKICAgLy8gSWYgY2FsbGJhY2tzIGFyZSBkaXNhYmxlZCwgc2ltcGx5IHJldHVybi4KICAgaWYgKGFyZV9jYWxsYmFja3NfZGlzYWJsZWRfKSB7CkBAIC05MjEsNiArOTI2LDEwIEBACiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBDYWNoZVR5cGU+CiB2b2lkIFJlc291cmNlQ2FjaGU8Q2FjaGVUeXBlPjo6UHJvY2Vzc1BlbmRpbmdDYWxsYmFja3NJZlVuYmxvY2tlZCgpIHsKKyAgLy8gSWYgdGhlcmUgYXJlIG5vIGNhbGxiYWNrIGJsb2NraW5nIHJlc291cmNlcywgdGhlbiBzaW1wbHkgcHJvY2VzcyBhbnkKKyAgLy8gcGVuZGluZyBjYWxsYmFja3Mgbm93OyBvdGhlcndpc2UsIHN0YXJ0IHxwcm9jZXNzX3BlbmRpbmdfY2FsbGJhY2tfdGltZXJffCwKKyAgLy8gd2hpY2ggZW5zdXJlcyB0aGF0IHRoZSBjYWxsYmFja3MgYXJlIGhhbmRsZWQgaW4gYSB0aW1lbHkgbWFubmVyIHdoaWxlIHN0aWxsCisgIC8vIGFsbG93aW5nIHRoZW0gdG8gYmUgYmF0Y2hlZC4KICAgaWYgKGNhbGxiYWNrX2Jsb2NraW5nX2xvYWRpbmdfcmVzb3VyY2Vfc2V0Xy5lbXB0eSgpKSB7CiAgICAgUHJvY2Vzc1BlbmRpbmdDYWxsYmFja3MoKTsKIApAQCAtOTMxLDYgKzk0MCwxOSBAQAogICAgICAgY2FsbGJhY2tfYmxvY2tpbmdfbG9hZGluZ19yZXNvdXJjZV9zZXRfLnN3YXAoCiAgICAgICAgICAgbm9uX2NhbGxiYWNrX2Jsb2NraW5nX2xvYWRpbmdfcmVzb3VyY2Vfc2V0Xyk7CiAgICAgfQorICB9IGVsc2UgaWYgKCFwZW5kaW5nX2NhbGxiYWNrX21hcF8uZW1wdHkoKSAmJgorICAgICAgICAgICAgICFwcm9jZXNzX3BlbmRpbmdfY2FsbGJhY2tfdGltZXJfLklzUnVubmluZygpKSB7CisgICAgLy8gVGhlIG1heGltdW0gZGVsYXkgZm9yIGEgcGVuZGluZyBjYWxsYmFjayBpcyBzZXQgdG8gNTAwbXMuIEFmdGVyIHRoYXQsIHRoZQorICAgIC8vIGNhbGxiYWNrIHdpbGwgYmUgcHJvY2Vzc2VkIHJlZ2FyZGxlc3Mgb2YgaG93IG1hbnkgY2FsbGJhY2sgYmxvY2tpbmcKKyAgICAvLyBsb2FkaW5nIHJlc291cmNlcyByZW1haW4uIFRoaXMgc3BlY2lmaWMgdmFsdWUgbWF4aW1pemVzIGNhbGxiYWNrIGJhdGNoaW5nCisgICAgLy8gb24gZmFzdCBuZXR3b3JrcyB3aGlsZSBhbHNvIGtlZXBpbmcgdGhlIGNhbGxiYWNrIGRlbGF5IG9uIHNsb3cgbmV0d29ya3MKKyAgICAvLyB0byBhIG1pbmltdW0gYW5kIGlzIGJhc2VkIG9uIHNpZ25pZmljYW50IHRlc3RpbmcuCisgICAgY29uc3QgaW50NjQga01heFBlbmRpbmdDYWxsYmFja0RlbGF5SW5NaWxsaXNlY29uZHMgPSA1MDA7CisgICAgcHJvY2Vzc19wZW5kaW5nX2NhbGxiYWNrX3RpbWVyXy5TdGFydCgKKyAgICAgICAgRlJPTV9IRVJFLAorICAgICAgICBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWxsaXNlY29uZHMoCisgICAgICAgICAgICBrTWF4UGVuZGluZ0NhbGxiYWNrRGVsYXlJbk1pbGxpc2Vjb25kcyksCisgICAgICAgIHRoaXMsICZSZXNvdXJjZUNhY2hlOjpQcm9jZXNzUGVuZGluZ0NhbGxiYWNrcyk7CiAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sb2FkZXIvc3luY19sb2FkZXIuY2MgYi9zcmMvY29iYWx0L2xvYWRlci9zeW5jX2xvYWRlci5jYwppbmRleCBlYjc1ZGI1Li43NmI2OWRhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xvYWRlci9zeW5jX2xvYWRlci5jYworKysgYi9zcmMvY29iYWx0L2xvYWRlci9zeW5jX2xvYWRlci5jYwpAQCAtMzMsNyArMzMsOSBAQAogLy8gZGVjb2RlciBjcmVhdG9ycy4KIGNsYXNzIExvYWRlck9uVGhyZWFkIHsKICBwdWJsaWM6Ci0gIExvYWRlck9uVGhyZWFkKCkgOiB3YWl0YWJsZV9ldmVudF8oZmFsc2UsIGZhbHNlKSB7fQorICBMb2FkZXJPblRocmVhZCgpCisgICAgICA6IHN0YXJ0X3dhaXRhYmxlX2V2ZW50XyhmYWxzZSwgZmFsc2UpLAorICAgICAgICBlbmRfd2FpdGFibGVfZXZlbnRfKGZhbHNlLCBmYWxzZSkge30KIAogICAvLyBTdGFydCgpIGFuZCBFbmQoKSBzaG91bGQgYmUgY2FsbGVkIG9uIHRoZSBzYW1lIHRocmVhZCwgdGhlIHN5Y2hyb25vdXMgbG9hZAogICAvLyB0aHJlYWQsIHNvIHRoZSBtZW1iZXIgb2JqZWN0cyBhcmUgY3JlYXRlZCwgZXhlY3V0ZSwgYW5kIGFyZSBkZXN0cm95ZWQsCkBAIC00NCwxNSArNDYsMjggQEAKICAgICAgIGJhc2U6OkNhbGxiYWNrPHZvaWQoY29uc3Qgc3RkOjpzdHJpbmcmKT4gZXJyb3JfY2FsbGJhY2spOwogICB2b2lkIEVuZCgpOwogCi0gIHZvaWQgU2lnbmFsKCkgeyB3YWl0YWJsZV9ldmVudF8uU2lnbmFsKCk7IH0KLSAgdm9pZCBXYWl0KCkgeyB3YWl0YWJsZV9ldmVudF8uV2FpdCgpOyB9CisgIHZvaWQgU2lnbmFsU3RhcnREb25lKCkgeyBzdGFydF93YWl0YWJsZV9ldmVudF8uU2lnbmFsKCk7IH0KKyAgdm9pZCBTaWduYWxFbmREb25lKCkgeyBlbmRfd2FpdGFibGVfZXZlbnRfLlNpZ25hbCgpOyB9CisKKyAgdm9pZCBXYWl0Rm9yU3RhcnQoYmFzZTo6V2FpdGFibGVFdmVudCogaW50ZXJydXB0X2V2ZW50KSB7CisgICAgYmFzZTo6V2FpdGFibGVFdmVudCogZXZlbnRfYXJyYXlbXSA9IHsmc3RhcnRfd2FpdGFibGVfZXZlbnRfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0X2V2ZW50fTsKKyAgICBzaXplX3QgZWZmZWN0aXZlX3NpemUgPSBhcnJheXNpemUoZXZlbnRfYXJyYXkpOworICAgIGlmICghaW50ZXJydXB0X2V2ZW50KSB7CisgICAgICAtLWVmZmVjdGl2ZV9zaXplOworICAgIH0KKyAgICBiYXNlOjpXYWl0YWJsZUV2ZW50OjpXYWl0TWFueShldmVudF9hcnJheSwgZWZmZWN0aXZlX3NpemUpOworICB9CisKKyAgdm9pZCBXYWl0Rm9yRW5kKCkgeyBlbmRfd2FpdGFibGVfZXZlbnRfLldhaXQoKTsgfQogCiAgcHJpdmF0ZToKICAgc2NvcGVkX3B0cjxEZWNvZGVyPiBkZWNvZGVyXzsKICAgc2NvcGVkX3B0cjxGZXRjaGVyVG9EZWNvZGVyQWRhcHRlcj4gZmV0Y2hlcl90b19kZWNvZGVyX2FkYXB0b3JfOwogICBzY29wZWRfcHRyPEZldGNoZXI+IGZldGNoZXJfOwogCi0gIGJhc2U6OldhaXRhYmxlRXZlbnQgd2FpdGFibGVfZXZlbnRfOworICBiYXNlOjpXYWl0YWJsZUV2ZW50IHN0YXJ0X3dhaXRhYmxlX2V2ZW50XzsKKyAgYmFzZTo6V2FpdGFibGVFdmVudCBlbmRfd2FpdGFibGVfZXZlbnRfOwogfTsKIAogLy8gVGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgcGFzc2luZyBjaHVua3Mgb2YgZGF0YSBmcm9tIGZldGNoZXIgdG8gZGVjb2RlcgpAQCAtNzUsMTIgKzkwLDEyIEBACiAgICAgRENIRUNLKGZldGNoZXIpOwogICAgIGRlY29kZXJfLT5TZXRMYXN0VVJMT3JpZ2luKGZldGNoZXItPmxhc3RfdXJsX29yaWdpbigpKTsKICAgICBkZWNvZGVyXy0+RmluaXNoKCk7Ci0gICAgbG9hZGVyX29uX3RocmVhZF8tPlNpZ25hbCgpOworICAgIGxvYWRlcl9vbl90aHJlYWRfLT5TaWduYWxTdGFydERvbmUoKTsKICAgfQogICB2b2lkIE9uRXJyb3IoRmV0Y2hlciogZmV0Y2hlciwgY29uc3Qgc3RkOjpzdHJpbmcmIGVycm9yKSBvdmVycmlkZSB7CiAgICAgVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUihmZXRjaGVyKTsKICAgICBlcnJvcl9jYWxsYmFja18uUnVuKGVycm9yKTsKLSAgICBsb2FkZXJfb25fdGhyZWFkXy0+U2lnbmFsKCk7CisgICAgbG9hZGVyX29uX3RocmVhZF8tPlNpZ25hbFN0YXJ0RG9uZSgpOwogICB9CiAKICBwcml2YXRlOgpAQCAtMTAzLDcgKzExOCw3IEBACiAgIGZldGNoZXJfLnJlc2V0KCk7CiAgIGZldGNoZXJfdG9fZGVjb2Rlcl9hZGFwdG9yXy5yZXNldCgpOwogICBkZWNvZGVyXy5yZXNldCgpOwotICBTaWduYWwoKTsKKyAgU2lnbmFsRW5kRG9uZSgpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UKQEAgLTExMyw3ICsxMjgsNyBAQAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIHZvaWQgTG9hZFN5bmNocm9ub3VzbHkoCi0gICAgTWVzc2FnZUxvb3AqIG1lc3NhZ2VfbG9vcCwKKyAgICBNZXNzYWdlTG9vcCogbWVzc2FnZV9sb29wLCBiYXNlOjpXYWl0YWJsZUV2ZW50KiBpbnRlcnJ1cHRfdHJpZ2dlciwKICAgICBiYXNlOjpDYWxsYmFjazxzY29wZWRfcHRyPEZldGNoZXI+KEZldGNoZXI6OkhhbmRsZXIqKT4gZmV0Y2hlcl9jcmVhdG9yLAogICAgIGJhc2U6OkNhbGxiYWNrPHNjb3BlZF9wdHI8RGVjb2Rlcj4oKT4gZGVjb2Rlcl9jcmVhdG9yLAogICAgIGJhc2U6OkNhbGxiYWNrPHZvaWQoY29uc3Qgc3RkOjpzdHJpbmcmKT4gZXJyb3JfY2FsbGJhY2spIHsKQEAgLTEyNywxMiArMTQyLDE2IEBACiAgICAgICBGUk9NX0hFUkUsCiAgICAgICBiYXNlOjpCaW5kKCZMb2FkZXJPblRocmVhZDo6U3RhcnQsIGJhc2U6OlVucmV0YWluZWQoJmxvYWRlcl9vbl90aHJlYWQpLAogICAgICAgICAgICAgICAgICBmZXRjaGVyX2NyZWF0b3IsIGRlY29kZXJfY3JlYXRvciwgZXJyb3JfY2FsbGJhY2spKTsKLSAgbG9hZGVyX29uX3RocmVhZC5XYWl0KCk7CisgIGxvYWRlcl9vbl90aHJlYWQuV2FpdEZvclN0YXJ0KGludGVycnVwdF90cmlnZ2VyKTsKIAogICBtZXNzYWdlX2xvb3AtPlBvc3RUYXNrKAogICAgICAgRlJPTV9IRVJFLAogICAgICAgYmFzZTo6QmluZCgmTG9hZGVyT25UaHJlYWQ6OkVuZCwgYmFzZTo6VW5yZXRhaW5lZCgmbG9hZGVyX29uX3RocmVhZCkpKTsKLSAgbG9hZGVyX29uX3RocmVhZC5XYWl0KCk7CisKKyAgLy8gV2FpdCBmb3IgYSBkaWZmZXJlbnQgZXZlbnQgaGVyZSwgc2luY2UgaXQgaXMgcG9zc2libGUgdGhhdCB0aGUgZmlyc3QKKyAgLy8gd2FpdCB3YXMgaW50ZXJydXB0ZWQsIGFuZCB0aGUgZmV0Y2hlciBjb21wbGV0aW9uIGNhbiBzdGlsbCB8U2lnbmFsKCl8CisgIC8vIHRoZSBzdGFydCBldmVudC4KKyAgbG9hZGVyX29uX3RocmVhZC5XYWl0Rm9yRW5kKCk7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBsb2FkZXIKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbG9hZGVyL3N5bmNfbG9hZGVyLmggYi9zcmMvY29iYWx0L2xvYWRlci9zeW5jX2xvYWRlci5oCmluZGV4IGRhZGMyYjguLjEyODAyMDMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbG9hZGVyL3N5bmNfbG9hZGVyLmgKKysrIGIvc3JjL2NvYmFsdC9sb2FkZXIvc3luY19sb2FkZXIuaApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgImJhc2UvY2FsbGJhY2suaCIKICNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCiAjaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3AuaCIKKyNpbmNsdWRlICJiYXNlL3N5bmNocm9uaXphdGlvbi93YWl0YWJsZV9ldmVudC5oIgogI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZC5oIgogI2luY2x1ZGUgImNvYmFsdC9sb2FkZXIvZGVjb2Rlci5oIgogI2luY2x1ZGUgImNvYmFsdC9sb2FkZXIvZmV0Y2hlci5oIgpAQCAtMzEsNyArMzIsNyBAQAogLy8gYW5kIHVzZSB0aGUgZ2l2ZW4gbWVzc2FnZSBsb29wIHRvIGxvYWQgdGhlIHJlc291cmNlLiBUaGUgZmV0Y2hlciBhbmQgZGVjb2RlcgogLy8gYXJlIHJlc3BvbnNpYmxlIGZvciBzZXR0aW5nIHVwIHRpbWVvdXQgZm9yIHRoZW1zZWx2ZXMuCiB2b2lkIExvYWRTeW5jaHJvbm91c2x5KAotICAgIE1lc3NhZ2VMb29wKiBtZXNzYWdlX2xvb3AsCisgICAgTWVzc2FnZUxvb3AqIG1lc3NhZ2VfbG9vcCwgYmFzZTo6V2FpdGFibGVFdmVudCogaW50ZXJydXB0X3RyaWdnZXIsCiAgICAgYmFzZTo6Q2FsbGJhY2s8c2NvcGVkX3B0cjxGZXRjaGVyPihGZXRjaGVyOjpIYW5kbGVyKik+IGZldGNoZXJfY3JlYXRvciwKICAgICBiYXNlOjpDYWxsYmFjazxzY29wZWRfcHRyPERlY29kZXI+KCk+IGRlY29kZXJfY3JlYXRvciwKICAgICBiYXNlOjpDYWxsYmFjazx2b2lkKGNvbnN0IHN0ZDo6c3RyaW5nJik+IGVycm9yX2NhbGxiYWNrKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbG9hZGVyL3RleHRfZGVjb2Rlci5oIGIvc3JjL2NvYmFsdC9sb2FkZXIvdGV4dF9kZWNvZGVyLmgKaW5kZXggYmJiMjRhMi4uNjliNThmZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sb2FkZXIvdGV4dF9kZWNvZGVyLmgKKysrIGIvc3JjL2NvYmFsdC9sb2FkZXIvdGV4dF9kZWNvZGVyLmgKQEAgLTM0LDkgKzM0LDEwIEBACiAvLyByZXN1bHRzLgogY2xhc3MgVGV4dERlY29kZXIgOiBwdWJsaWMgRGVjb2RlciB7CiAgcHVibGljOgotICBleHBsaWNpdCBUZXh0RGVjb2RlcigKLSAgICAgIGJhc2U6OkNhbGxiYWNrPHZvaWQoY29uc3QgbG9hZGVyOjpPcmlnaW4mLCBzY29wZWRfcHRyPHN0ZDo6c3RyaW5nPik+Ci0gICAgICAgICAgZG9uZV9jYWxsYmFjaykKKyAgdHlwZWRlZiBiYXNlOjpDYWxsYmFjazx2b2lkKGNvbnN0IGxvYWRlcjo6T3JpZ2luJiwgc2NvcGVkX3B0cjxzdGQ6OnN0cmluZz4pPgorICAgICAgU3VjY2Vzc0NhbGxiYWNrOworCisgIGV4cGxpY2l0IFRleHREZWNvZGVyKGNvbnN0IFN1Y2Nlc3NDYWxsYmFjayYgZG9uZV9jYWxsYmFjaykKICAgICAgIDogZG9uZV9jYWxsYmFja18oZG9uZV9jYWxsYmFjayksIHN1c3BlbmRlZF8oZmFsc2UpIHt9CiAgIH5UZXh0RGVjb2RlcigpIG92ZXJyaWRlIHt9CiAKQEAgLTk3LDggKzk4LDcgQEAKIAogIHByaXZhdGU6CiAgIGJhc2U6OlRocmVhZENoZWNrZXIgdGhyZWFkX2NoZWNrZXJfOwotICBiYXNlOjpDYWxsYmFjazx2b2lkKGNvbnN0IGxvYWRlcjo6T3JpZ2luJiwgc2NvcGVkX3B0cjxzdGQ6OnN0cmluZz4pPgotICAgICAgZG9uZV9jYWxsYmFja187CisgIFN1Y2Nlc3NDYWxsYmFjayBkb25lX2NhbGxiYWNrXzsKICAgbG9hZGVyOjpPcmlnaW4gbGFzdF91cmxfb3JpZ2luXzsKICAgc2NvcGVkX3B0cjxzdGQ6OnN0cmluZz4gdGV4dF87CiAgIGJvb2wgc3VzcGVuZGVkXzsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9CVUlMRC5nbiBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9CVUlMRC5nbgppbmRleCAwYzNhZDIyLi44YzIyM2NmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvQlVJTEQuZ24KKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL0JVSUxELmduCkBAIC0xNDcsOCArMTQ3LDYgQEAKICAgICAibWVkaWFfY2xpZW50LmgiLAogICAgICJtZWRpYV9jb250ZW50X3R5cGUuY2MiLAogICAgICJtZWRpYV9jb250ZW50X3R5cGUuaCIsCi0gICAgIm1lZGlhX2tleXMuY2MiLAotICAgICJtZWRpYV9rZXlzLmgiLAogICAgICJtZWRpYV9sb2cuY2MiLAogICAgICJtZWRpYV9sb2cuaCIsCiAgICAgIm1lZGlhX2xvZ19ldmVudC5oIiwKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9kcm1fc3lzdGVtLmNjIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2RybV9zeXN0ZW0uY2MKaW5kZXggOGVjYzJhMy4uZjAzYmEzMCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2RybV9zeXN0ZW0uY2MKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2RybV9zeXN0ZW0uY2MKQEAgLTkzLDExICs5MywxNSBAQAogI2lmIFNCX0hBUyhEUk1fS0VZX1NUQVRVU0VTKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uU2Vzc2lvbktleVN0YXR1c2VzQ2hhbmdlZEZ1bmMKKyNlbmRpZiAgLy8gU0JfSEFTKERSTV9LRVlfU1RBVFVTRVMpCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfRFJNX1JFRklORU1FTlRfQVBJX1ZFUlNJT04KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPblNlcnZlckNlcnRpZmljYXRlVXBkYXRlZEZ1bmMKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfRFJNX1JFRklORU1FTlRfQVBJX1ZFUlNJT04KICNpZiBTQl9IQVMoRFJNX1NFU1NJT05fQ0xPU0VEKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uU2Vzc2lvbkNsb3NlZEZ1bmMKICNlbmRpZiAgLy8gU0JfSEFTKERSTV9TRVNTSU9OX0NMT1NFRCkKLSNlbmRpZiAgLy8gU0JfSEFTKERSTV9LRVlfU1RBVFVTRVMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpLCAgLy8gTk9MSU5UKHdoaXRlc3BhY2UvcGFyZW5zKQogICAgICAgbWVzc2FnZV9sb29wXyhNZXNzYWdlTG9vcDo6Y3VycmVudCgpKSwKICAgICAgIEFMTE9XX1RISVNfSU5fSU5JVElBTElaRVJfTElTVCh3ZWFrX3B0cl9mYWN0b3J5Xyh0aGlzKSksCkBAIC0xMzAsNiArMTM0LDMxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSk7ICAvLyBOT0xJTlQod2hpdGVzcGFjZS9wYXJlbnMpCiB9CiAKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9EUk1fUkVGSU5FTUVOVF9BUElfVkVSU0lPTgorYm9vbCBEcm1TeXN0ZW06OklzU2VydmVyQ2VydGlmaWNhdGVVcGRhdGFibGUoKSB7CisgIHJldHVybiBTYkRybUlzU2VydmVyQ2VydGlmaWNhdGVVcGRhdGFibGUod3JhcHBlZF9kcm1fc3lzdGVtXyk7Cit9CisKK3ZvaWQgRHJtU3lzdGVtOjpVcGRhdGVTZXJ2ZXJDZXJ0aWZpY2F0ZSgKKyAgICBjb25zdCB1aW50OF90KiBjZXJ0aWZpY2F0ZSwgaW50IGNlcnRpZmljYXRlX3NpemUsCisgICAgU2VydmVyQ2VydGlmaWNhdGVVcGRhdGVkQ2FsbGJhY2sgc2VydmVyX2NlcnRpZmljYXRlX3VwZGF0ZWRfY2FsbGJhY2spIHsKKyAgRENIRUNLKElzU2VydmVyQ2VydGlmaWNhdGVVcGRhdGFibGUoKSk7CisgIGludCB0aWNrZXQgPSBuZXh0X3Nlc3Npb25fdXBkYXRlX3JlcXVlc3RfdGlja2V0XysrOworICB0aWNrZXRfdG9fc2VydmVyX2NlcnRpZmljYXRlX3VwZGF0ZWRfbWFwXy5pbnNlcnQoCisgICAgICBzdGQ6Om1ha2VfcGFpcih0aWNrZXQsIHNlcnZlcl9jZXJ0aWZpY2F0ZV91cGRhdGVkX2NhbGxiYWNrKSk7CisgIFNiRHJtVXBkYXRlU2VydmVyQ2VydGlmaWNhdGUod3JhcHBlZF9kcm1fc3lzdGVtXywgdGlja2V0LCBjZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0aWZpY2F0ZV9zaXplKTsKK30KKyNlbHNlICAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfRFJNX1JFRklORU1FTlRfQVBJX1ZFUlNJT04KK2Jvb2wgRHJtU3lzdGVtOjpJc1NlcnZlckNlcnRpZmljYXRlVXBkYXRhYmxlKCkgeyByZXR1cm4gZmFsc2U7IH0KKwordm9pZCBEcm1TeXN0ZW06OlVwZGF0ZVNlcnZlckNlcnRpZmljYXRlKAorICAgIGNvbnN0IHVpbnQ4X3QqIGNlcnRpZmljYXRlLCBpbnQgY2VydGlmaWNhdGVfc2l6ZSwKKyAgICBTZXJ2ZXJDZXJ0aWZpY2F0ZVVwZGF0ZWRDYWxsYmFjayBzZXJ2ZXJfY2VydGlmaWNhdGVfdXBkYXRlZF9jYWxsYmFjaykgeworICBOT1RSRUFDSEVEKCk7Cit9CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX0RSTV9SRUZJTkVNRU5UX0FQSV9WRVJTSU9OCisKIHZvaWQgRHJtU3lzdGVtOjpHZW5lcmF0ZVNlc3Npb25VcGRhdGVSZXF1ZXN0KAogICAgIFNlc3Npb24qIHNlc3Npb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlLCBjb25zdCB1aW50OF90KiBpbml0X2RhdGEsCiAgICAgaW50IGluaXRfZGF0YV9sZW5ndGgsIGNvbnN0IFNlc3Npb25VcGRhdGVSZXF1ZXN0R2VuZXJhdGVkQ2FsbGJhY2smCkBAIC0xNzIsOCArMjAxLDExIEBACiB9CiAKIHZvaWQgRHJtU3lzdGVtOjpPblNlc3Npb25VcGRhdGVSZXF1ZXN0R2VuZXJhdGVkKAotICAgIGludCB0aWNrZXQsIGNvbnN0IGJhc2U6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiYgc2Vzc2lvbl9pZCwKKyAgICBTZXNzaW9uVGlja2V0QW5kT3B0aW9uYWxJZCB0aWNrZXRfYW5kX29wdGlvbmFsX2lkLCBTYkRybVN0YXR1cyBzdGF0dXMsCisgICAgU2JEcm1TZXNzaW9uUmVxdWVzdFR5cGUgdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGVycm9yX21lc3NhZ2UsCiAgICAgc2NvcGVkX2FycmF5PHVpbnQ4PiBtZXNzYWdlLCBpbnQgbWVzc2FnZV9zaXplKSB7CisgIGludCB0aWNrZXQgPSB0aWNrZXRfYW5kX29wdGlvbmFsX2lkLnRpY2tldDsKKyAgY29uc3QgYmFzZTo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+JiBzZXNzaW9uX2lkID0gdGlja2V0X2FuZF9vcHRpb25hbF9pZC5pZDsKICAgaWYgKFNiRHJtVGlja2V0SXNWYWxpZCh0aWNrZXQpKSB7CiAgICAgLy8gQ2FsbGVkIGJhY2sgYXMgYSByZXN1bHQgb2YgfFNiRHJtR2VuZXJhdGVTZXNzaW9uVXBkYXRlUmVxdWVzdHwuCiAKQEAgLTE5NywxMSArMjI5LDEyIEBACiAgICAgICBpZF90b19zZXNzaW9uX21hcF8uaW5zZXJ0KAogICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKCpzZXNzaW9uX2lkLCBzZXNzaW9uX3VwZGF0ZV9yZXF1ZXN0LnNlc3Npb24pKTsKIAotICAgICAgc2Vzc2lvbl91cGRhdGVfcmVxdWVzdC5nZW5lcmF0ZWRfY2FsbGJhY2suUnVuKG1lc3NhZ2UuUGFzcygpLAorICAgICAgc2Vzc2lvbl91cGRhdGVfcmVxdWVzdC5nZW5lcmF0ZWRfY2FsbGJhY2suUnVuKHR5cGUsIG1lc3NhZ2UuUGFzcygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Vfc2l6ZSk7CiAgICAgfSBlbHNlIHsKICAgICAgIC8vIEZhaWx1cmUgZHVyaW5nIHJlcXVlc3QgZ2VuZXJhdGlvbi4KLSAgICAgIHNlc3Npb25fdXBkYXRlX3JlcXVlc3QuZGlkX25vdF9nZW5lcmF0ZV9jYWxsYmFjay5SdW4oKTsKKyAgICAgIHNlc3Npb25fdXBkYXRlX3JlcXVlc3QuZGlkX25vdF9nZW5lcmF0ZV9jYWxsYmFjay5SdW4oc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlKTsKICAgICB9CiAKICAgICAvLyBTd2VlcCB0aGUgY29udGV4dCBvZiB8R2VuZXJhdGVTZXNzaW9uVXBkYXRlUmVxdWVzdHwuCkBAIC0yMjYsMTIgKzI1OSwxMyBAQAogICAgIH0KICAgICBTZXNzaW9uKiBzZXNzaW9uID0gc2Vzc2lvbl9pdGVyYXRvci0+c2Vjb25kOwogCi0gICAgc2Vzc2lvbi0+dXBkYXRlX3JlcXVlc3RfZ2VuZXJhdGVkX2NhbGxiYWNrKCkuUnVuKG1lc3NhZ2UuUGFzcygpLAorICAgIHNlc3Npb24tPnVwZGF0ZV9yZXF1ZXN0X2dlbmVyYXRlZF9jYWxsYmFjaygpLlJ1bih0eXBlLCBtZXNzYWdlLlBhc3MoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9zaXplKTsKICAgfQogfQogCi12b2lkIERybVN5c3RlbTo6T25TZXNzaW9uVXBkYXRlZChpbnQgdGlja2V0LCBib29sIHN1Y2NlZWRlZCkgewordm9pZCBEcm1TeXN0ZW06Ok9uU2Vzc2lvblVwZGF0ZWQoaW50IHRpY2tldCwgU2JEcm1TdGF0dXMgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGVycm9yX21lc3NhZ2UpIHsKICAgLy8gUmVzdG9yZSB0aGUgY29udGV4dCBvZiB8VXBkYXRlU2Vzc2lvbnwuCiAgIFRpY2tldFRvU2Vzc2lvblVwZGF0ZU1hcDo6aXRlcmF0b3Igc2Vzc2lvbl91cGRhdGVfaXRlcmF0b3IgPQogICAgICAgdGlja2V0X3RvX3Nlc3Npb25fdXBkYXRlX21hcF8uZmluZCh0aWNrZXQpOwpAQCAtMjQyLDEwICsyNzYsMTAgQEAKICAgY29uc3QgU2Vzc2lvblVwZGF0ZSYgc2Vzc2lvbl91cGRhdGUgPSBzZXNzaW9uX3VwZGF0ZV9pdGVyYXRvci0+c2Vjb25kOwogCiAgIC8vIEludGVycHJldCB0aGUgcmVzdWx0LgotICBpZiAoc3VjY2VlZGVkKSB7CisgIGlmIChzdGF0dXMgPT0ga1NiRHJtU3RhdHVzU3VjY2VzcykgewogICAgIHNlc3Npb25fdXBkYXRlLnVwZGF0ZWRfY2FsbGJhY2suUnVuKCk7CiAgIH0gZWxzZSB7Ci0gICAgc2Vzc2lvbl91cGRhdGUuZGlkX25vdF91cGRhdGVfY2FsbGJhY2suUnVuKCk7CisgICAgc2Vzc2lvbl91cGRhdGUuZGlkX25vdF91cGRhdGVfY2FsbGJhY2suUnVuKHN0YXR1cywgZXJyb3JfbWVzc2FnZSk7CiAgIH0KIAogICAvLyBTd2VlcCB0aGUgY29udGV4dCBvZiB8VXBkYXRlU2Vzc2lvbnwuCkBAIC0yODUsMTEgKzMxOSwzNiBAQAogfQogI2VuZGlmICAvLyBTQl9IQVMoRFJNX1NFU1NJT05fQ0xPU0VEKQogCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfRFJNX1JFRklORU1FTlRfQVBJX1ZFUlNJT04KK3ZvaWQgRHJtU3lzdGVtOjpPblNlcnZlckNlcnRpZmljYXRlVXBkYXRlZChpbnQgdGlja2V0LCBTYkRybVN0YXR1cyBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGVycm9yX21lc3NhZ2UpIHsKKyAgYXV0byBpdGVyID0gdGlja2V0X3RvX3NlcnZlcl9jZXJ0aWZpY2F0ZV91cGRhdGVkX21hcF8uZmluZCh0aWNrZXQpOworICBpZiAoaXRlciA9PSB0aWNrZXRfdG9fc2VydmVyX2NlcnRpZmljYXRlX3VwZGF0ZWRfbWFwXy5lbmQoKSkgeworICAgIExPRyhFUlJPUikgPDwgIlVua25vd24gdGlja2V0OiAiIDw8IHRpY2tldCA8PCAiLiI7CisgICAgcmV0dXJuOworICB9CisgIGl0ZXItPnNlY29uZC5SdW4oc3RhdHVzLCBlcnJvcl9tZXNzYWdlKTsKKyAgdGlja2V0X3RvX3NlcnZlcl9jZXJ0aWZpY2F0ZV91cGRhdGVkX21hcF8uZXJhc2UoaXRlcik7Cit9CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX0RSTV9SRUZJTkVNRU5UX0FQSV9WRVJTSU9OCisKIC8vIHN0YXRpYworI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX0RSTV9SRUZJTkVNRU5UX0FQSV9WRVJTSU9OCit2b2lkIERybVN5c3RlbTo6T25TZXNzaW9uVXBkYXRlUmVxdWVzdEdlbmVyYXRlZEZ1bmMoCisgICAgU2JEcm1TeXN0ZW0gd3JhcHBlZF9kcm1fc3lzdGVtLCB2b2lkKiBjb250ZXh0LCBpbnQgdGlja2V0LAorICAgIFNiRHJtU3RhdHVzIHN0YXR1cywgU2JEcm1TZXNzaW9uUmVxdWVzdFR5cGUgdHlwZSwgY29uc3QgY2hhciogZXJyb3JfbWVzc2FnZSwKKyAgICBjb25zdCB2b2lkKiBzZXNzaW9uX2lkLCBpbnQgc2Vzc2lvbl9pZF9zaXplLCBjb25zdCB2b2lkKiBjb250ZW50LAorICAgIGludCBjb250ZW50X3NpemUsIGNvbnN0IGNoYXIqIHVybCkgeworI2Vsc2UgICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9EUk1fUkVGSU5FTUVOVF9BUElfVkVSU0lPTgogdm9pZCBEcm1TeXN0ZW06Ok9uU2Vzc2lvblVwZGF0ZVJlcXVlc3RHZW5lcmF0ZWRGdW5jKAogICAgIFNiRHJtU3lzdGVtIHdyYXBwZWRfZHJtX3N5c3RlbSwgdm9pZCogY29udGV4dCwgaW50IHRpY2tldCwKICAgICBjb25zdCB2b2lkKiBzZXNzaW9uX2lkLCBpbnQgc2Vzc2lvbl9pZF9zaXplLCBjb25zdCB2b2lkKiBjb250ZW50LAogICAgIGludCBjb250ZW50X3NpemUsIGNvbnN0IGNoYXIqIHVybCkgeworICBTYkRybVN0YXR1cyBzdGF0dXMgPQorICAgICAgc2Vzc2lvbl9pZCA/IGtTYkRybVN0YXR1c1N1Y2Nlc3MgOiBrU2JEcm1TdGF0dXNVbmtub3duRXJyb3I7CisgIFNiRHJtU2Vzc2lvblJlcXVlc3RUeXBlIHR5cGUgPSBrU2JEcm1TZXNzaW9uUmVxdWVzdFR5cGVMaWNlbnNlUmVxdWVzdDsKKyAgY29uc3QgY2hhciogZXJyb3JfbWVzc2FnZSA9IE5VTEw7CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX0RSTV9SRUZJTkVNRU5UX0FQSV9WRVJTSU9OCiAgIERDSEVDSyhjb250ZXh0KTsKICAgRHJtU3lzdGVtKiBkcm1fc3lzdGVtID0gc3RhdGljX2Nhc3Q8RHJtU3lzdGVtKj4oY29udGV4dCk7CiAgIERDSEVDS19FUSh3cmFwcGVkX2RybV9zeXN0ZW0sIGRybV9zeXN0ZW0tPndyYXBwZWRfZHJtX3N5c3RlbV8pOwpAQCAtMzA2LDIzICszNjUsMzkgQEAKICAgfQogCiAgIGRybV9zeXN0ZW0tPm1lc3NhZ2VfbG9vcF8tPlBvc3RUYXNrKAotICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZEcm1TeXN0ZW06Ok9uU2Vzc2lvblVwZGF0ZVJlcXVlc3RHZW5lcmF0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJtX3N5c3RlbS0+d2Vha190aGlzXywgdGlja2V0LCBzZXNzaW9uX2lkX2NvcHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6UGFzc2VkKCZjb250ZW50X2NvcHkpLCBjb250ZW50X3NpemUpKTsKKyAgICAgIEZST01fSEVSRSwKKyAgICAgIGJhc2U6OkJpbmQoJkRybVN5c3RlbTo6T25TZXNzaW9uVXBkYXRlUmVxdWVzdEdlbmVyYXRlZCwKKyAgICAgICAgICAgICAgICAgZHJtX3N5c3RlbS0+d2Vha190aGlzXywKKyAgICAgICAgICAgICAgICAgU2Vzc2lvblRpY2tldEFuZE9wdGlvbmFsSWR7dGlja2V0LCBzZXNzaW9uX2lkX2NvcHl9LCBzdGF0dXMsCisgICAgICAgICAgICAgICAgIHR5cGUsIGVycm9yX21lc3NhZ2UgPyBzdGQ6OnN0cmluZyhlcnJvcl9tZXNzYWdlKSA6ICIiLAorICAgICAgICAgICAgICAgICBiYXNlOjpQYXNzZWQoJmNvbnRlbnRfY29weSksIGNvbnRlbnRfc2l6ZSkpOwogfQogCiAvLyBzdGF0aWMKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9EUk1fUkVGSU5FTUVOVF9BUElfVkVSU0lPTgordm9pZCBEcm1TeXN0ZW06Ok9uU2Vzc2lvblVwZGF0ZWRGdW5jKFNiRHJtU3lzdGVtIHdyYXBwZWRfZHJtX3N5c3RlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb250ZXh0LCBpbnQgdGlja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiRHJtU3RhdHVzIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlcnJvcl9tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIC8qc2Vzc2lvbl9pZCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKnNlc3Npb25faWRfc2l6ZSovKSB7CisjZWxzZSAgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX0RSTV9SRUZJTkVNRU5UX0FQSV9WRVJTSU9OCiB2b2lkIERybVN5c3RlbTo6T25TZXNzaW9uVXBkYXRlZEZ1bmMoU2JEcm1TeXN0ZW0gd3JhcHBlZF9kcm1fc3lzdGVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvbnRleHQsIGludCB0aWNrZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogLypzZXNzaW9uX2lkKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qc2Vzc2lvbl9pZF9zaXplKi8sIGJvb2wgc3VjY2VlZGVkKSB7CisgIFNiRHJtU3RhdHVzIHN0YXR1cyA9CisgICAgICBzdWNjZWVkZWQgPyBrU2JEcm1TdGF0dXNTdWNjZXNzIDoga1NiRHJtU3RhdHVzVW5rbm93bkVycm9yOworICBjb25zdCBjaGFyKiBlcnJvcl9tZXNzYWdlID0gTlVMTDsKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfRFJNX1JFRklORU1FTlRfQVBJX1ZFUlNJT04KICAgRENIRUNLKGNvbnRleHQpOwogICBEcm1TeXN0ZW0qIGRybV9zeXN0ZW0gPSBzdGF0aWNfY2FzdDxEcm1TeXN0ZW0qPihjb250ZXh0KTsKICAgRENIRUNLX0VRKHdyYXBwZWRfZHJtX3N5c3RlbSwgZHJtX3N5c3RlbS0+d3JhcHBlZF9kcm1fc3lzdGVtXyk7CiAKICAgZHJtX3N5c3RlbS0+bWVzc2FnZV9sb29wXy0+UG9zdFRhc2soCi0gICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJkRybVN5c3RlbTo6T25TZXNzaW9uVXBkYXRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm1fc3lzdGVtLT53ZWFrX3RoaXNfLCB0aWNrZXQsIHN1Y2NlZWRlZCkpOworICAgICAgRlJPTV9IRVJFLAorICAgICAgYmFzZTo6QmluZCgmRHJtU3lzdGVtOjpPblNlc3Npb25VcGRhdGVkLCBkcm1fc3lzdGVtLT53ZWFrX3RoaXNfLCB0aWNrZXQsCisgICAgICAgICAgICAgICAgIHN0YXR1cywgZXJyb3JfbWVzc2FnZSA/IHN0ZDo6c3RyaW5nKGVycm9yX21lc3NhZ2UpIDogIiIpKTsKIH0KIAogI2lmIFNCX0hBUyhEUk1fS0VZX1NUQVRVU0VTKQpAQCAtMzU5LDYgKzQzNCwyMyBAQAogfQogI2VuZGlmICAvLyBTQl9IQVMoRFJNX0tFWV9TVEFUVVNFUykKIAorI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX0RSTV9SRUZJTkVNRU5UX0FQSV9WRVJTSU9OCisvLyBzdGF0aWMKK3ZvaWQgRHJtU3lzdGVtOjpPblNlcnZlckNlcnRpZmljYXRlVXBkYXRlZEZ1bmMoU2JEcm1TeXN0ZW0gd3JhcHBlZF9kcm1fc3lzdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb250ZXh0LCBpbnQgdGlja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkRybVN0YXR1cyBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGVycm9yX21lc3NhZ2UpIHsKKyAgRENIRUNLKGNvbnRleHQpOworICBEcm1TeXN0ZW0qIGRybV9zeXN0ZW0gPSBzdGF0aWNfY2FzdDxEcm1TeXN0ZW0qPihjb250ZXh0KTsKKyAgRENIRUNLX0VRKHdyYXBwZWRfZHJtX3N5c3RlbSwgZHJtX3N5c3RlbS0+d3JhcHBlZF9kcm1fc3lzdGVtXyk7CisKKyAgZHJtX3N5c3RlbS0+bWVzc2FnZV9sb29wXy0+UG9zdFRhc2soCisgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJkRybVN5c3RlbTo6T25TZXJ2ZXJDZXJ0aWZpY2F0ZVVwZGF0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJtX3N5c3RlbS0+d2Vha190aGlzXywgdGlja2V0LCBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSA/IHN0ZDo6c3RyaW5nKGVycm9yX21lc3NhZ2UpIDogIiIpKTsKK30KKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfRFJNX1JFRklORU1FTlRfQVBJX1ZFUlNJT04KKwogI2lmIFNCX0hBUyhEUk1fU0VTU0lPTl9DTE9TRUQpCiAvLyBzdGF0aWMKIHZvaWQgRHJtU3lzdGVtOjpPblNlc3Npb25DbG9zZWRGdW5jKFNiRHJtU3lzdGVtIHdyYXBwZWRfZHJtX3N5c3RlbSwKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9kcm1fc3lzdGVtLmggYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvZHJtX3N5c3RlbS5oCmluZGV4IGIxYzg1YWYuLjlhMDZmZmMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9kcm1fc3lzdGVtLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2RybV9zeXN0ZW0uaApAQCAtMzUsMTEgKzM1LDE2IEBACiAvLyBmcm9tIHRoZSBzYW1lIHRocmVhZCB3aGVyZSB8RHJtU3lzdGVtfCB3YXMgaW5zdGFudGlhdGVkLgogY2xhc3MgRHJtU3lzdGVtIDogcHVibGljIGJhc2U6OlJlZkNvdW50ZWQ8RHJtU3lzdGVtPiB7CiAgcHVibGljOgotICB0eXBlZGVmIGJhc2U6OkNhbGxiYWNrPHZvaWQoc2NvcGVkX2FycmF5PHVpbnQ4PiBtZXNzYWdlLCBpbnQgbWVzc2FnZV9zaXplKT4KKyAgdHlwZWRlZiBiYXNlOjpDYWxsYmFjazx2b2lkKFNiRHJtU2Vzc2lvblJlcXVlc3RUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZWRfYXJyYXk8dWludDg+IG1lc3NhZ2UsIGludCBtZXNzYWdlX3NpemUpPgogICAgICAgU2Vzc2lvblVwZGF0ZVJlcXVlc3RHZW5lcmF0ZWRDYWxsYmFjazsKLSAgdHlwZWRlZiBiYXNlOjpDYWxsYmFjazx2b2lkKCk+IFNlc3Npb25VcGRhdGVSZXF1ZXN0RGlkTm90R2VuZXJhdGVDYWxsYmFjazsKKyAgdHlwZWRlZiBiYXNlOjpDYWxsYmFjazx2b2lkKFNiRHJtU3RhdHVzIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBlcnJvcl9tZXNzYWdlKT4KKyAgICAgIFNlc3Npb25VcGRhdGVSZXF1ZXN0RGlkTm90R2VuZXJhdGVDYWxsYmFjazsKICAgdHlwZWRlZiBiYXNlOjpDYWxsYmFjazx2b2lkKCk+IFNlc3Npb25VcGRhdGVkQ2FsbGJhY2s7Ci0gIHR5cGVkZWYgYmFzZTo6Q2FsbGJhY2s8dm9pZCgpPiBTZXNzaW9uRGlkTm90VXBkYXRlQ2FsbGJhY2s7CisgIHR5cGVkZWYgYmFzZTo6Q2FsbGJhY2s8dm9pZChTYkRybVN0YXR1cyBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZXJyb3JfbWVzc2FnZSk+CisgICAgICBTZXNzaW9uRGlkTm90VXBkYXRlQ2FsbGJhY2s7CiAjaWYgU0JfSEFTKERSTV9LRVlfU1RBVFVTRVMpCiAgIHR5cGVkZWYgYmFzZTo6Q2FsbGJhY2s8dm9pZChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGtleV9pZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxTYkRybUtleVN0YXR1cz4mIGtleV9zdGF0dXNlcyk+CkBAIC00OCw2ICs1Myw5IEBACiAjaWYgU0JfSEFTKERSTV9TRVNTSU9OX0NMT1NFRCkKICAgdHlwZWRlZiBiYXNlOjpDYWxsYmFjazx2b2lkKCk+IFNlc3Npb25DbG9zZWRDYWxsYmFjazsKICNlbmRpZiAgLy8gU0JfSEFTKERSTV9TRVNTSU9OX0NMT1NFRCkKKyAgdHlwZWRlZiBiYXNlOjpDYWxsYmFjazx2b2lkKFNiRHJtU3RhdHVzIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBlcnJvcl9tZXNzYWdlKT4KKyAgICAgIFNlcnZlckNlcnRpZmljYXRlVXBkYXRlZENhbGxiYWNrOwogCiAgIC8vIEZseXdlaWdodCB0aGF0IHByb3ZpZGVzIFJBSUkgc2VtYW50aWNzIGZvciBzZXNzaW9ucy4KICAgLy8gTW9zdCBvZiBsb2dpYyBpcyBpbXBsZW1lbnRlZCBieSB8RHJtU3lzdGVtfCBhbmQgdGh1cyBzZXNzaW9ucyBtdXN0IGJlCkBAIC0xNTAsNiArMTU4LDExIEBACiAjZW5kaWYgICAgLy8gU0JfSEFTKERSTV9TRVNTSU9OX0NMT1NFRCkKICAgICAgICk7ICAvLyBOT0xJTlQod2hpdGVzcGFjZS9wYXJlbnMpCiAKKyAgYm9vbCBJc1NlcnZlckNlcnRpZmljYXRlVXBkYXRhYmxlKCk7CisgIHZvaWQgVXBkYXRlU2VydmVyQ2VydGlmaWNhdGUoCisgICAgICBjb25zdCB1aW50OF90KiBjZXJ0aWZpY2F0ZSwgaW50IGNlcnRpZmljYXRlX3NpemUsCisgICAgICBTZXJ2ZXJDZXJ0aWZpY2F0ZVVwZGF0ZWRDYWxsYmFjayBzZXJ2ZXJfY2VydGlmaWNhdGVfdXBkYXRlZF9jYWxsYmFjayk7CisKICBwcml2YXRlOgogICAvLyBTdG9yZXMgY29udGV4dCBvZiB8R2VuZXJhdGVTZXNzaW9uVXBkYXRlUmVxdWVzdHwuCiAgIHN0cnVjdCBTZXNzaW9uVXBkYXRlUmVxdWVzdCB7CkBAIC0xNjIsNiArMTc1LDkgQEAKIAogICB0eXBlZGVmIGJhc2U6Omhhc2hfbWFwPHN0ZDo6c3RyaW5nLCBTZXNzaW9uKj4gSWRUb1Nlc3Npb25NYXA7CiAKKyAgdHlwZWRlZiBiYXNlOjpoYXNoX21hcDxpbnQsIFNlcnZlckNlcnRpZmljYXRlVXBkYXRlZENhbGxiYWNrPgorICAgICAgVGlja2V0VG9TZXJ2ZXJDZXJ0aWZpY2F0ZVVwZGF0ZWRNYXA7CisKICAgLy8gU3RvcmVzIGNvbnRleHQgb2YgfFNlc3Npb246OlVwZGF0ZXwuCiAgIHN0cnVjdCBTZXNzaW9uVXBkYXRlIHsKICAgICBTZXNzaW9uVXBkYXRlZENhbGxiYWNrIHVwZGF0ZWRfY2FsbGJhY2s7CkBAIC0xNjksNiArMTg1LDEzIEBACiAgIH07CiAgIHR5cGVkZWYgYmFzZTo6aGFzaF9tYXA8aW50LCBTZXNzaW9uVXBkYXRlPiBUaWNrZXRUb1Nlc3Npb25VcGRhdGVNYXA7CiAKKyAgLy8gRGVmaW5lZCB0byB3b3JrIGFyb3VuZCB0aGUgbGltaXRhdGlvbiBvbiBudW1iZXIgb2YgcGFyYW1ldGVycyBvZgorICAvLyBiYXNlOjpCaW5kKCkuCisgIHN0cnVjdCBTZXNzaW9uVGlja2V0QW5kT3B0aW9uYWxJZCB7CisgICAgaW50IHRpY2tldDsKKyAgICBiYXNlOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4gaWQ7CisgIH07CisKICAgLy8gUHJpdmF0ZSBBUEkgZm9yIHxTZXNzaW9ufC4KICAgdm9pZCBHZW5lcmF0ZVNlc3Npb25VcGRhdGVSZXF1ZXN0KAogICAgICAgU2Vzc2lvbiogc2Vzc2lvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIHR5cGUsIGNvbnN0IHVpbnQ4X3QqIGluaXRfZGF0YSwKQEAgLTE4NSwxOCArMjA4LDM5IEBACiAgIC8vIENhbGxlZCBvbiB0aGUgY29uc3RydWN0b3IgdGhyZWFkLCBwYXJhbWV0ZXJzIGFyZSBjb3BpZWQgYW5kIG93bmVkIGJ5IHRoZXNlCiAgIC8vIG1ldGhvZHMuCiAgIHZvaWQgT25TZXNzaW9uVXBkYXRlUmVxdWVzdEdlbmVyYXRlZCgKLSAgICAgIGludCB0aWNrZXQsIGNvbnN0IGJhc2U6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiYgc2Vzc2lvbl9pZCwKKyAgICAgIFNlc3Npb25UaWNrZXRBbmRPcHRpb25hbElkIHRpY2tldF9hbmRfb3B0aW9uYWxfaWQsIFNiRHJtU3RhdHVzIHN0YXR1cywKKyAgICAgIFNiRHJtU2Vzc2lvblJlcXVlc3RUeXBlIHR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBlcnJvcl9tZXNzYWdlLAogICAgICAgc2NvcGVkX2FycmF5PHVpbnQ4PiBtZXNzYWdlLCBpbnQgbWVzc2FnZV9zaXplKTsKLSAgdm9pZCBPblNlc3Npb25VcGRhdGVkKGludCB0aWNrZXQsIGJvb2wgc3VjY2VlZGVkKTsKKyAgdm9pZCBPblNlc3Npb25VcGRhdGVkKGludCB0aWNrZXQsIFNiRHJtU3RhdHVzIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBlcnJvcl9tZXNzYWdlKTsKKwogI2lmIFNCX0hBUyhEUk1fS0VZX1NUQVRVU0VTKQogICB2b2lkIE9uU2Vzc2lvbktleVN0YXR1c0NoYW5nZWQoCiAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2Vzc2lvbl9pZCwgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBrZXlfaWRzLAogICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8U2JEcm1LZXlTdGF0dXM+JiBrZXlfc3RhdHVzZXMpOwogI2VuZGlmICAvLyBTQl9IQVMoRFJNX0tFWV9TVEFUVVNFUykKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9EUk1fUkVGSU5FTUVOVF9BUElfVkVSU0lPTgorICB2b2lkIE9uU2VydmVyQ2VydGlmaWNhdGVVcGRhdGVkKGludCB0aWNrZXQsIFNiRHJtU3RhdHVzIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZXJyb3JfbWVzc2FnZSk7CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX0RSTV9SRUZJTkVNRU5UX0FQSV9WRVJTSU9OCiAjaWYgU0JfSEFTKERSTV9TRVNTSU9OX0NMT1NFRCkKICAgdm9pZCBPblNlc3Npb25DbG9zZWQoY29uc3Qgc3RkOjpzdHJpbmcmIHNlc3Npb25faWQpOwogI2VuZGlmICAvLyBTQl9IQVMoRFJNX1NFU1NJT05fQ0xPU0VEKQogICAvLyBDYWxsZWQgb24gYW55IHRocmVhZCwgcGFyYW1ldGVycyBuZWVkIHRvIGJlIGNvcGllZCBpbW1lZGlhdGVseS4KKworI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX0RSTV9SRUZJTkVNRU5UX0FQSV9WRVJTSU9OCisgIHN0YXRpYyB2b2lkIE9uU2Vzc2lvblVwZGF0ZVJlcXVlc3RHZW5lcmF0ZWRGdW5jKAorICAgICAgU2JEcm1TeXN0ZW0gd3JhcHBlZF9kcm1fc3lzdGVtLCB2b2lkKiBjb250ZXh0LCBpbnQgdGlja2V0LAorICAgICAgU2JEcm1TdGF0dXMgc3RhdHVzLCBTYkRybVNlc3Npb25SZXF1ZXN0VHlwZSB0eXBlLAorICAgICAgY29uc3QgY2hhciogZXJyb3JfbWVzc2FnZSwgY29uc3Qgdm9pZCogc2Vzc2lvbl9pZCwgaW50IHNlc3Npb25faWRfc2l6ZSwKKyAgICAgIGNvbnN0IHZvaWQqIGNvbnRlbnQsIGludCBjb250ZW50X3NpemUsIGNvbnN0IGNoYXIqIHVybCk7CisgIHN0YXRpYyB2b2lkIE9uU2Vzc2lvblVwZGF0ZWRGdW5jKFNiRHJtU3lzdGVtIHdyYXBwZWRfZHJtX3N5c3RlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29udGV4dCwgaW50IHRpY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JEcm1TdGF0dXMgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlcnJvcl9tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBzZXNzaW9uX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbl9pZF9sZW5ndGgpOworI2Vsc2UgICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9EUk1fUkVGSU5FTUVOVF9BUElfVkVSU0lPTgogICBzdGF0aWMgdm9pZCBPblNlc3Npb25VcGRhdGVSZXF1ZXN0R2VuZXJhdGVkRnVuYygKICAgICAgIFNiRHJtU3lzdGVtIHdyYXBwZWRfZHJtX3N5c3RlbSwgdm9pZCogY29udGV4dCwgaW50IHRpY2tldCwKICAgICAgIGNvbnN0IHZvaWQqIHNlc3Npb25faWQsIGludCBzZXNzaW9uX2lkX3NpemUsIGNvbnN0IHZvaWQqIGNvbnRlbnQsCkBAIC0yMDUsNiArMjQ5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29udGV4dCwgaW50IHRpY2tldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogc2Vzc2lvbl9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25faWRfbGVuZ3RoLCBib29sIHN1Y2NlZWRlZCk7CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX0RSTV9SRUZJTkVNRU5UX0FQSV9WRVJTSU9OCisKICNpZiBTQl9IQVMoRFJNX0tFWV9TVEFUVVNFUykKICAgc3RhdGljIHZvaWQgT25TZXNzaW9uS2V5U3RhdHVzZXNDaGFuZ2VkRnVuYygKICAgICAgIFNiRHJtU3lzdGVtIHdyYXBwZWRfZHJtX3N5c3RlbSwgdm9pZCogY29udGV4dCwgY29uc3Qgdm9pZCogc2Vzc2lvbl9pZCwKQEAgLTIxOCw2ICsyNjQsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBzZXNzaW9uX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uX2lkX3NpemUpOwogI2VuZGlmICAvLyBTQl9IQVMoRFJNX1NFU1NJT05fQ0xPU0VEKQorCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfRFJNX1JFRklORU1FTlRfQVBJX1ZFUlNJT04KKyAgc3RhdGljIHZvaWQgT25TZXJ2ZXJDZXJ0aWZpY2F0ZVVwZGF0ZWRGdW5jKFNiRHJtU3lzdGVtIHdyYXBwZWRfZHJtX3N5c3RlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvbnRleHQsIGludCB0aWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkRybVN0YXR1cyBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlcnJvcl9tZXNzYWdlKTsKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfRFJNX1JFRklORU1FTlRfQVBJX1ZFUlNJT04KKwogICBjb25zdCBTYkRybVN5c3RlbSB3cmFwcGVkX2RybV9zeXN0ZW1fOwogICBNZXNzYWdlTG9vcCogY29uc3QgbWVzc2FnZV9sb29wXzsKIApAQCAtMjM0LDYgKzI4OCw4IEBACiAgIC8vIFN1cHBvcnRzIHNwb250YW5lb3VzIGludm9jYXRpb25zIG9mIHxTYkRybVNlc3Npb25VcGRhdGVSZXF1ZXN0RnVuY3wuCiAgIElkVG9TZXNzaW9uTWFwIGlkX3RvX3Nlc3Npb25fbWFwXzsKIAorICBUaWNrZXRUb1NlcnZlckNlcnRpZmljYXRlVXBkYXRlZE1hcCB0aWNrZXRfdG9fc2VydmVyX2NlcnRpZmljYXRlX3VwZGF0ZWRfbWFwXzsKKwogICAvLyBTdXBwb3J0cyBjb25jdXJyZW50IGNhbGxzIHRvIHxTZXNzaW9uOjpVcGRhdGV8LgogICBpbnQgbmV4dF9zZXNzaW9uX3VwZGF0ZV90aWNrZXRfOwogICBUaWNrZXRUb1Nlc3Npb25VcGRhdGVNYXAgdGlja2V0X3RvX3Nlc3Npb25fdXBkYXRlX21hcF87CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvbWVkaWFfa2V5cy5jYyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9tZWRpYV9rZXlzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjg3OGNiLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9tZWRpYV9rZXlzLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTMgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAiY29iYWx0L21lZGlhL2Jhc2UvbWVkaWFfa2V5cy5oIgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLU1lZGlhS2V5czo6TWVkaWFLZXlzKCkge30KLQotTWVkaWFLZXlzOjp+TWVkaWFLZXlzKCkge30KLQotQ2RtQ29udGV4dCogTWVkaWFLZXlzOjpHZXRDZG1Db250ZXh0KCkgeyByZXR1cm4gTlVMTDsgfQotCi12b2lkIE1lZGlhS2V5czo6RGVsZXRlT25Db3JyZWN0VGhyZWFkKCkgY29uc3QgeyBkZWxldGUgdGhpczsgfQotCi0vLyBzdGF0aWMKLXZvaWQgTWVkaWFLZXlzVHJhaXRzOjpEZXN0cnVjdChjb25zdCBNZWRpYUtleXMqIG1lZGlhX2tleXMpIHsKLSAgbWVkaWFfa2V5cy0+RGVsZXRlT25Db3JyZWN0VGhyZWFkKCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL21lZGlhX2tleXMuaCBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9tZWRpYV9rZXlzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNjY0NDQuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL21lZGlhX2tleXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMyBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgQ09CQUxUX01FRElBX0JBU0VfTUVESUFfS0VZU19IXwotI2RlZmluZSBDT0JBTFRfTUVESUFfQkFTRV9NRURJQV9LRVlTX0hfCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImJhc2UvYmFzaWN0eXBlcy5oIgotI2luY2x1ZGUgImJhc2UvY2FsbGJhY2suaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF92ZWN0b3IuaCIKLSNpbmNsdWRlICJjb2JhbHQvbWVkaWEvYmFzZS9lbWVfY29uc3RhbnRzLmgiCi0jaW5jbHVkZSAiY29iYWx0L21lZGlhL2Jhc2UvbWVkaWFfZXhwb3J0LmgiCi0jaW5jbHVkZSAiZ29vZ2xldXJsL3NyYy9ndXJsLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3R5cGVzLmgiCi0KLW5hbWVzcGFjZSBiYXNlIHsKLWNsYXNzIFRpbWU7Ci19Ci0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgQ2RtQ29udGV4dDsKLXN0cnVjdCBDZG1LZXlJbmZvcm1hdGlvbjsKLXN0cnVjdCBNZWRpYUtleXNUcmFpdHM7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZS4uLiBUPgotY2xhc3MgQ2RtUHJvbWlzZVRlbXBsYXRlOwotCi10eXBlZGVmIENkbVByb21pc2VUZW1wbGF0ZTxzdGQ6OnN0cmluZz4gTmV3U2Vzc2lvbkNkbVByb21pc2U7Ci10eXBlZGVmIENkbVByb21pc2VUZW1wbGF0ZTw+IFNpbXBsZUNkbVByb21pc2U7Ci10eXBlZGVmIFNjb3BlZFZlY3RvcjxDZG1LZXlJbmZvcm1hdGlvbj4gQ2RtS2V5c0luZm87Ci0KLS8vIEFuIGludGVyZmFjZSB0aGF0IHJlcHJlc2VudHMgdGhlIENvbnRlbnQgRGVjcnlwdGlvbiBNb2R1bGUgKENETSkgaW4gdGhlCi0vLyBFbmNyeXB0ZWQgTWVkaWEgRXh0ZW5zaW9ucyAoRU1FKSBzcGVjIGluIENocm9taXVtLgotLy8gU2VlIGh0dHA6Ly93M2MuZ2l0aHViLmlvL2VuY3J5cHRlZC1tZWRpYS8jY2RtCi0vLwotLy8gKiBPd25lcnNoaXAKLS8vCi0vLyBUaGlzIGNsYXNzIGlzIHJlZi1jb3VudGVkLiBIb3dldmVyLCBhIHJlZi1jb3VudCBzaG91bGQgb25seSBiZSBoZWxkIGJ5OgotLy8gLSBUaGUgb3duZXIgb2YgdGhlIENETS4gVGhpcyBpcyB1c3VhbGx5IHNvbWUgY2xhc3MgaW4gdGhlIEVNRSBzdGFjaywgZS5nLgotLy8gICBDZG1TZXNzaW9uQWRhcHRlciBpbiB0aGUgcmVuZGVyIHByb2Nlc3MsIG9yIE1vam9DZG1TZXJ2aWNlIGluIGEgbm9uLXJlbmRlcgotLy8gICBwcm9jZXNzLgotLy8gLSBUaGUgbWVkaWEgcGxheWVyIHRoYXQgdXNlcyB0aGUgQ0RNLCB0byBwcmV2ZW50IHRoZSBDRE0gZnJvbSBiZWluZwotLy8gICBkZXN0cnVjdGVkIHdoaWxlIHN0aWxsIGJlaW5nIHVzZWQgYnkgdGhlIG1lZGlhIHBsYXllci4KLS8vCi0vLyBXaGVuIGJpbmRpbmcgY2xhc3MgbWV0aG9kcyBpbnRvIGNhbGxiYWNrcywgcHJlZmVyIFdlYWtQdHIgdG8gdXNpbmcgfHRoaXN8Ci0vLyBkaXJlY3RseSB0byBhdm9pZCBoYXZpbmcgYSByZWYtY291bnQgaGVsZCBieSB0aGUgY2FsbGJhY2suCi0vLwotLy8gKiBUaHJlYWQgU2FmZXR5Ci0vLwotLy8gTW9zdCBDRE0gb3BlcmF0aW9ucyBoYXBwZW4gb24gb25lIHRocmVhZC4gSG93ZXZlciwgaXQgaXMgbm90IHVuY29tbW9uIHRoYXQKLS8vIHRoZSBtZWRpYSBwbGF5ZXIgbGl2ZXMgb24gYSBkaWZmZXJlbnQgdGhyZWFkIGFuZCBtYXkgY2FsbCBpbnRvIHRoZSBDRE0gZnJvbQotLy8gdGhhdCB0aHJlYWQuIEZvciBleGFtcGxlLCBpZiB0aGUgQ0RNIHN1cHBvcnRzIGEgRGVjcnlwdG9yIGludGVyZmFjZSwgdGhlCi0vLyBEZWNyeXB0b3IgbWV0aG9kcyBjb3VsZCBiZSBjYWxsZWQgb24gYSBkaWZmZXJlbnQgdGhyZWFkLiBUaGUgQ0RNCi0vLyBpbXBsZW1lbnRhdGlvbiBzaG91bGQgbWFrZSBzdXJlIGl0J3MgdGhyZWFkIHNhZmUgZm9yIHRoZXNlIHNpdHVhdGlvbnMuCi0vLwotLy8gVE9ETyh4aHdhbmcpOiBSZW5hbWUgTWVkaWFLZXlzIHRvIENvbnRlbnREZWNyeXB0aW9uTW9kdWxlLiBTZWUKLS8vIGh0dHA6Ly9jcmJ1Zy5jb20vMzA5MjM3Ci0KLWNsYXNzIE1FRElBX0VYUE9SVCBNZWRpYUtleXMKLSAgICA6IHB1YmxpYyBiYXNlOjpSZWZDb3VudGVkVGhyZWFkU2FmZTxNZWRpYUtleXMsIE1lZGlhS2V5c1RyYWl0cz4gewotIHB1YmxpYzoKLSAgLy8gVE9ETyh4aHdhbmcpOiBSZW1vdmUgYWZ0ZXIgcHJlZml4ZWQgRU1FIHN1cHBvcnQgaXMgcmVtb3ZlZC4gU2VlCi0gIC8vIGh0dHA6Ly9jcmJ1Zy5jb20vMjQ5OTc2Ci0gIC8vIE11c3QgYmUgYSBzdXBlcnNldCBvZiBjZG06Ok1lZGlhS2V5RXhjZXB0aW9uLgotICBlbnVtIEV4Y2VwdGlvbiB7Ci0gICAgTk9UX1NVUFBPUlRFRF9FUlJPUiwKLSAgICBJTlZBTElEX1NUQVRFX0VSUk9SLAotICAgIElOVkFMSURfQUNDRVNTX0VSUk9SLAotICAgIFFVT1RBX0VYQ0VFREVEX0VSUk9SLAotICAgIFVOS05PV05fRVJST1IsCi0gICAgQ0xJRU5UX0VSUk9SLAotICAgIE9VVFBVVF9FUlJPUiwKLSAgICBFWENFUFRJT05fTUFYID0gT1VUUFVUX0VSUk9SCi0gIH07Ci0KLSAgLy8gVHlwZSBvZiBsaWNlbnNlIHJlcXVpcmVkIHdoZW4gY3JlYXRpbmcvbG9hZGluZyBhIHNlc3Npb24uCi0gIC8vIE11c3QgYmUgY29uc2lzdGVudCB3aXRoIHRoZSB2YWx1ZXMgc3BlY2lmaWVkIGluIHRoZSBzcGVjOgotICAvLyBodHRwczovL3czYy5naXRodWIuaW8vZW5jcnlwdGVkLW1lZGlhLyNpZGwtZGVmLU1lZGlhS2V5U2Vzc2lvblR5cGUKLSAgZW51bSBTZXNzaW9uVHlwZSB7Ci0gICAgVEVNUE9SQVJZX1NFU1NJT04sCi0gICAgUEVSU0lTVEVOVF9MSUNFTlNFX1NFU1NJT04sCi0gICAgUEVSU0lTVEVOVF9SRUxFQVNFX01FU1NBR0VfU0VTU0lPTiwKLSAgICBTRVNTSU9OX1RZUEVfTUFYID0gUEVSU0lTVEVOVF9SRUxFQVNFX01FU1NBR0VfU0VTU0lPTgotICB9OwotCi0gIC8vIFR5cGUgb2YgbWVzc2FnZSBiZWluZyBzZW50IHRvIHRoZSBhcHBsaWNhdGlvbi4KLSAgLy8gTXVzdCBiZSBjb25zaXN0ZW50IHdpdGggdGhlIHZhbHVlcyBzcGVjaWZpZWQgaW4gdGhlIHNwZWM6Ci0gIC8vIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9lbmNyeXB0ZWQtbWVkaWEvI2lkbC1kZWYtTWVkaWFLZXlNZXNzYWdlVHlwZQotICBlbnVtIE1lc3NhZ2VUeXBlIHsKLSAgICBMSUNFTlNFX1JFUVVFU1QsCi0gICAgTElDRU5TRV9SRU5FV0FMLAotICAgIExJQ0VOU0VfUkVMRUFTRSwKLSAgICBNRVNTQUdFX1RZUEVfTUFYID0gTElDRU5TRV9SRUxFQVNFCi0gIH07Ci0KLSAgLy8gUHJvdmlkZXMgYSBzZXJ2ZXIgY2VydGlmaWNhdGUgdG8gYmUgdXNlZCB0byBlbmNyeXB0IG1lc3NhZ2VzIHRvIHRoZQotICAvLyBsaWNlbnNlIHNlcnZlci4KLSAgdmlydHVhbCB2b2lkIFNldFNlcnZlckNlcnRpZmljYXRlKAotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGNlcnRpZmljYXRlLAotICAgICAgc3RkOjp1bmlxdWVfcHRyPFNpbXBsZUNkbVByb21pc2U+IHByb21pc2UpID0gMDsKLQotICAvLyBDcmVhdGVzIGEgc2Vzc2lvbiB3aXRoIHxzZXNzaW9uX3R5cGV8LiBUaGVuIGdlbmVyYXRlcyBhIHJlcXVlc3Qgd2l0aCB0aGUKLSAgLy8gfGluaXRfZGF0YV90eXBlfCBhbmQgfGluaXRfZGF0YXwuCi0gIC8vIE5vdGU6Ci0gIC8vIDEuIFRoZSBzZXNzaW9uIElEIHdpbGwgYmUgcHJvdmlkZWQgd2hlbiB0aGUgfHByb21pc2V8IGlzIHJlc29sdmVkLgotICAvLyAyLiBUaGUgZ2VuZXJhdGVkIHJlcXVlc3Qgc2hvdWxkIGJlIHJldHVybmVkIHRocm91Z2ggYSBTZXNzaW9uTWVzc2FnZUNCLAotICAvLyAgICB3aGljaCBtdXN0IGJlIEFGVEVSIHRoZSB8cHJvbWlzZXwgaXMgcmVzb2x2ZWQuIE90aGVyd2lzZSwgdGhlIHNlc3Npb24gSUQKLSAgLy8gICAgaW4gdGhlIGNhbGxiYWNrIHdpbGwgbm90IGJlIHJlY29nbml6ZWQuCi0gIC8vIDMuIFVwZGF0ZVNlc3Npb24oKSwgQ2xvc2VTZXNzaW9uKCkgYW5kIFJlbW92ZVNlc3Npb24oKSBzaG91bGQgb25seSBiZQotICAvLyAgICBjYWxsZWQgYWZ0ZXIgdGhlIHxwcm9taXNlfCBpcyByZXNvbHZlZC4KLSAgdmlydHVhbCB2b2lkIENyZWF0ZVNlc3Npb25BbmRHZW5lcmF0ZVJlcXVlc3QoCi0gICAgICBTZXNzaW9uVHlwZSBzZXNzaW9uX3R5cGUsIEVtZUluaXREYXRhVHlwZSBpbml0X2RhdGFfdHlwZSwKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbml0X2RhdGEsCi0gICAgICBzdGQ6OnVuaXF1ZV9wdHI8TmV3U2Vzc2lvbkNkbVByb21pc2U+IHByb21pc2UpID0gMDsKLQotICAvLyBMb2FkcyBhIHNlc3Npb24gd2l0aCB0aGUgfHNlc3Npb25faWR8IHByb3ZpZGVkLgotICAvLyBOb3RlOiBVcGRhdGVTZXNzaW9uKCksIENsb3NlU2Vzc2lvbigpIGFuZCBSZW1vdmVTZXNzaW9uKCkgc2hvdWxkIG9ubHkgYmUKLSAgLy8gICAgICAgY2FsbGVkIGFmdGVyIHRoZSB8cHJvbWlzZXwgaXMgcmVzb2x2ZWQuCi0gIHZpcnR1YWwgdm9pZCBMb2FkU2Vzc2lvbihTZXNzaW9uVHlwZSBzZXNzaW9uX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2Vzc2lvbl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxOZXdTZXNzaW9uQ2RtUHJvbWlzZT4gcHJvbWlzZSkgPSAwOwotCi0gIC8vIFVwZGF0ZXMgYSBzZXNzaW9uIHNwZWNpZmllZCBieSB8c2Vzc2lvbl9pZHwgd2l0aCB8cmVzcG9uc2V8LgotICB2aXJ0dWFsIHZvaWQgVXBkYXRlU2Vzc2lvbihjb25zdCBzdGQ6OnN0cmluZyYgc2Vzc2lvbl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHJlc3BvbnNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8U2ltcGxlQ2RtUHJvbWlzZT4gcHJvbWlzZSkgPSAwOwotCi0gIC8vIENsb3NlcyB0aGUgc2Vzc2lvbiBzcGVjaWZpZWQgYnkgfHNlc3Npb25faWR8LiBUaGUgQ0RNIHNob3VsZCByZXNvbHZlIG9yCi0gIC8vIHJlamVjdCB0aGUgfHByb21pc2V8IHdoZW4gdGhlIGNhbGwgaGFzIGJlZW4gcHJvY2Vzc2VkLiBUaGlzIG1heSBiZSBiZWZvcmUKLSAgLy8gdGhlIHNlc3Npb24gaXMgY2xvc2VkLiBPbmNlIHRoZSBzZXNzaW9uIGlzIGNsb3NlZCwgYSBTZXNzaW9uQ2xvc2VkQ0IgbXVzdAotICAvLyBhbHNvIGJlIGNhbGxlZC4KLSAgdmlydHVhbCB2b2lkIENsb3NlU2Vzc2lvbihjb25zdCBzdGQ6OnN0cmluZyYgc2Vzc2lvbl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8U2ltcGxlQ2RtUHJvbWlzZT4gcHJvbWlzZSkgPSAwOwotCi0gIC8vIFJlbW92ZXMgc3RvcmVkIHNlc3Npb24gZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlc3Npb24gc3BlY2lmaWVkIGJ5Ci0gIC8vIHxzZXNzaW9uX2lkfC4KLSAgdmlydHVhbCB2b2lkIFJlbW92ZVNlc3Npb24oY29uc3Qgc3RkOjpzdHJpbmcmIHNlc3Npb25faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxTaW1wbGVDZG1Qcm9taXNlPiBwcm9taXNlKSA9IDA7Ci0KLSAgLy8gUmV0dXJucyB0aGUgQ2RtQ29udGV4dCBhc3NvY2lhdGVkIHdpdGggfHRoaXN8LiBUaGUgcmV0dXJuZWQgQ2RtQ29udGV4dCBpcwotICAvLyBvd25lZCBieSB8dGhpc3wgYW5kIHRoZSBjYWxsZXIgbmVlZHMgdG8gbWFrZSBzdXJlIGl0IGlzIG5vdCB1c2VkIGFmdGVyCi0gIC8vIHx0aGlzfCBpcyBkZXN0cnVjdGVkLgotICAvLyBSZXR1cm5zIG51bGwgaWYgQ2RtQ29udGV4dCBpcyBub3Qgc3VwcG9ydGVkLiBJbnN0ZWFkIHRoZSBtZWRpYSBwbGF5ZXIgbWF5Ci0gIC8vIHVzZSB0aGUgQ0RNIHZpYSBzb21lIHBsYXRmb3JtIHNwZWNpZmljIG1ldGhvZC4KLSAgLy8gQnkgZGVmYXVsdCB0aGlzIG1ldGhvZCByZXR1cm5zIG51bGwuCi0gIC8vIFRPRE8oeGh3YW5nKTogQ29udmVydCBhbGwgU2V0Q2RtKCkgaW1wbGVtZW50YXRpb25zIHRvIHVzZSBDZG1Db250ZXh0IHNvCi0gIC8vIHRoYXQgdGhpcyBmdW5jdGlvbiBzaG91bGQgbmV2ZXIgcmV0dXJuIE5VTEwuCi0gIHZpcnR1YWwgQ2RtQ29udGV4dCogR2V0Q2RtQ29udGV4dCgpOwotCi0gIC8vIERlbGV0ZXMgfHRoaXN8IG9uIHRoZSBjb3JyZWN0IHRocmVhZC4gQnkgZGVmYXVsdCB8dGhpc3wgaXMgZGVsZXRlZAotICAvLyBpbW1lZGlhdGVseS4gT3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgfHRoaXN8IG5lZWRzIHRvIGJlIGRlbGV0ZWQgb24gYQotICAvLyBzcGVjaWZpYyB0aHJlYWQuCi0gIHZpcnR1YWwgdm9pZCBEZWxldGVPbkNvcnJlY3RUaHJlYWQoKSBjb25zdDsKLQotIHByb3RlY3RlZDoKLSAgZnJpZW5kIGNsYXNzIGJhc2U6OlJlZkNvdW50ZWRUaHJlYWRTYWZlPE1lZGlhS2V5cywgTWVkaWFLZXlzVHJhaXRzPjsKLQotICBNZWRpYUtleXMoKTsKLSAgdmlydHVhbCB+TWVkaWFLZXlzKCk7Ci0KLSBwcml2YXRlOgotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oTWVkaWFLZXlzKTsKLX07Ci0KLXN0cnVjdCBNRURJQV9FWFBPUlQgTWVkaWFLZXlzVHJhaXRzIHsKLSAgLy8gRGVzdHJveXMgfG1lZGlhX2tleXN8IG9uIHRoZSBjb3JyZWN0IHRocmVhZC4KLSAgc3RhdGljIHZvaWQgRGVzdHJ1Y3QoY29uc3QgTWVkaWFLZXlzKiBtZWRpYV9rZXlzKTsKLX07Ci0KLS8vIENETSBzZXNzaW9uIGV2ZW50IGNhbGxiYWNrcy4KLQotLy8gQ2FsbGVkIHdoZW4gdGhlIENETSBuZWVkcyB0byBxdWV1ZSBhIG1lc3NhZ2UgZXZlbnQgdG8gdGhlIHNlc3Npb24gb2JqZWN0LgotLy8gU2VlIGh0dHA6Ly93M2MuZ2l0aHViLmlvL2VuY3J5cHRlZC1tZWRpYS8jZG9tLWV2dC1tZXNzYWdlCi10eXBlZGVmIGJhc2U6OkNhbGxiYWNrPHZvaWQoCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlc3Npb25faWQsIE1lZGlhS2V5czo6TWVzc2FnZVR5cGUgbWVzc2FnZV90eXBlLAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBtZXNzYWdlKT4gU2Vzc2lvbk1lc3NhZ2VDQjsKLQotLy8gQ2FsbGVkIHdoZW4gdGhlIHNlc3Npb24gc3BlY2lmaWVkIGJ5IHxzZXNzaW9uX2lkfCBpcyBjbG9zZWQuIE5vdGUgdGhhdCB0aGUKLS8vIENETSBtYXkgY2xvc2UgYSBzZXNzaW9uIGF0IGFueSBwb2ludCwgc3VjaCBhcyBpbiByZXNwb25zZSB0byBhIENsb3NlU2Vzc2lvbigpCi0vLyBjYWxsLCB3aGVuIHRoZSBzZXNzaW9uIGlzIG5vIGxvbmdlciBuZWVkZWQsIG9yIHdoZW4gc3lzdGVtIHJlc291cmNlcyBhcmUKLS8vIGxvc3QuIFNlZSBodHRwOi8vdzNjLmdpdGh1Yi5pby9lbmNyeXB0ZWQtbWVkaWEvI3Nlc3Npb24tY2xvc2UKLXR5cGVkZWYgYmFzZTo6Q2FsbGJhY2s8dm9pZChjb25zdCBzdGQ6OnN0cmluZyYgc2Vzc2lvbl9pZCk+IFNlc3Npb25DbG9zZWRDQjsKLQotLy8gQ2FsbGVkIHdoZW4gdGhlcmUgaGFzIGJlZW4gYSBjaGFuZ2UgaW4gdGhlIGtleXMgaW4gdGhlIHNlc3Npb24gb3IgdGhlaXIKLS8vIHN0YXR1cy4gU2VlIGh0dHA6Ly93M2MuZ2l0aHViLmlvL2VuY3J5cHRlZC1tZWRpYS8jZG9tLWV2dC1rZXlzdGF0dXNlc2NoYW5nZQotdHlwZWRlZiBiYXNlOjpDYWxsYmFjazx2b2lkKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXNzaW9uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX2FkZGl0aW9uYWxfdXNhYmxlX2tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZG1LZXlzSW5mbyBrZXlzX2luZm8pPiBTZXNzaW9uS2V5c0NoYW5nZUNCOwotCi0vLyBDYWxsZWQgd2hlbiB0aGUgQ0RNIGNoYW5nZXMgdGhlIGV4cGlyYXRpb24gdGltZSBvZiBhIHNlc3Npb24uCi0vLyBTZWUgaHR0cDovL3czYy5naXRodWIuaW8vZW5jcnlwdGVkLW1lZGlhLyN1cGRhdGUtZXhwaXJhdGlvbgotdHlwZWRlZiBiYXNlOjpDYWxsYmFjazx2b2lkKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXNzaW9uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U6OlRpbWUmIG5ld19leHBpcnlfdGltZSk+Ci0gICAgU2Vzc2lvbkV4cGlyYXRpb25VcGRhdGVDQjsKLQotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0Ci0KLSNlbmRpZiAgLy8gQ09CQUxUX01FRElBX0JBU0VfTUVESUFfS0VZU19IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3NicGxheWVyX3BpcGVsaW5lLmNjIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3NicGxheWVyX3BpcGVsaW5lLmNjCmluZGV4IDAyODE0NWIuLjc1NDg5NzcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9zYnBsYXllcl9waXBlbGluZS5jYworKysgYi9zcmMvY29iYWx0L21lZGlhL2Jhc2Uvc2JwbGF5ZXJfcGlwZWxpbmUuY2MKQEAgLTgwNSw3ICs4MDUsNyBAQAogICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6bWVkaWEiLCAiU2JQbGF5ZXJQaXBlbGluZTo6Q3JlYXRlUGxheWVyIik7CiAKICAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIERDSEVDSyh2aWRlb19zdHJlYW1fKTsKKyAgRENIRUNLKGF1ZGlvX3N0cmVhbV8gfHwgdmlkZW9fc3RyZWFtXyk7CiAKICAgaWYgKHN0b3BwZWRfKSB7CiAgICAgcmV0dXJuOwpAQCAtODI2LDggKzgyNiwxMCBAQAogICBjb25zdCBBdWRpb0RlY29kZXJDb25maWcmIGF1ZGlvX2NvbmZpZyA9CiAgICAgICBhdWRpb19zdHJlYW1fID8gYXVkaW9fc3RyZWFtXy0+YXVkaW9fZGVjb2Rlcl9jb25maWcoKQogICAgICAgICAgICAgICAgICAgICA6IGludmFsaWRfYXVkaW9fY29uZmlnOworICBWaWRlb0RlY29kZXJDb25maWcgaW52YWxpZF92aWRlb19jb25maWc7CiAgIGNvbnN0IFZpZGVvRGVjb2RlckNvbmZpZyYgdmlkZW9fY29uZmlnID0KLSAgICAgIHZpZGVvX3N0cmVhbV8tPnZpZGVvX2RlY29kZXJfY29uZmlnKCk7CisgICAgICB2aWRlb19zdHJlYW1fID8gdmlkZW9fc3RyZWFtXy0+dmlkZW9fZGVjb2Rlcl9jb25maWcoKQorICAgICAgICAgICAgICAgICAgICA6IGludmFsaWRfdmlkZW9fY29uZmlnOwogCiAgIHsKICAgICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwpAQCAtODUxLDcgKzg1Myw5IEBACiAgICAgaWYgKGF1ZGlvX3N0cmVhbV8pIHsKICAgICAgIFVwZGF0ZURlY29kZXJDb25maWcoYXVkaW9fc3RyZWFtXyk7CiAgICAgfQotICAgIFVwZGF0ZURlY29kZXJDb25maWcodmlkZW9fc3RyZWFtXyk7CisgICAgaWYgKHZpZGVvX3N0cmVhbV8pIHsKKyAgICAgIFVwZGF0ZURlY29kZXJDb25maWcodmlkZW9fc3RyZWFtXyk7CisgICAgfQogICAgIHJldHVybjsKICAgfQogCkBAIC05MDUsMTIgKzkwOSwyMiBAQAogICB9CiAjZW5kaWYgIC8vICFTQl9IQVMoQVVESU9MRVNTX1ZJREVPKQogCisjaWYgU0JfQVBJX1ZFUlNJT04gPCBTQl9BVURJT19PTkxZX1ZJREVPX0FQSV9WRVJTSU9OCiAgIGlmICh2aWRlb19zdHJlYW0gPT0gTlVMTCkgewogICAgIExPRyhJTkZPKSA8PCAiVGhlIHZpZGVvIGhhcyB0byBjb250YWluIGEgdmlkZW8gdHJhY2suIjsKICAgICBSZXNldEFuZFJ1bklmTm90TnVsbCgmZXJyb3JfY2JfLCBERU1VWEVSX0VSUk9SX05PX1NVUFBPUlRFRF9TVFJFQU1TLAogICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgdmlkZW8gaGFzIHRvIGNvbnRhaW4gYSB2aWRlbyB0cmFjay4iKTsKICAgICByZXR1cm47CiAgIH0KKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPCBTQl9BVURJT19PTkxZX1ZJREVPX0FQSV9WRVJTSU9OCisKKyAgaWYgKGF1ZGlvX3N0cmVhbSA9PSBOVUxMICYmIHZpZGVvX3N0cmVhbSA9PSBOVUxMKSB7CisgICAgTE9HKElORk8pIDw8ICJUaGUgdmlkZW8gaGFzIHRvIGNvbnRhaW4gYW4gYXVkaW8gdHJhY2sgb3IgYSB2aWRlbyB0cmFjay4iOworICAgIFJlc2V0QW5kUnVuSWZOb3ROdWxsKAorICAgICAgICAmZXJyb3JfY2JfLCBERU1VWEVSX0VSUk9SX05PX1NVUFBPUlRFRF9TVFJFQU1TLAorICAgICAgICAiVGhlIHZpZGVvIGhhcyB0byBjb250YWluIGFuIGF1ZGlvIHRyYWNrIG9yIGEgdmlkZW8gdHJhY2suIik7CisgICAgcmV0dXJuOworICB9CiAKICAgewogICAgIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7CkBAIC05MTksMTMgKzkzMywxNyBAQAogCiAgICAgYm9vbCBpc19lbmNyeXB0ZWQgPQogICAgICAgICBhdWRpb19zdHJlYW1fICYmIGF1ZGlvX3N0cmVhbV8tPmF1ZGlvX2RlY29kZXJfY29uZmlnKCkuaXNfZW5jcnlwdGVkKCk7Ci0gICAgaXNfZW5jcnlwdGVkIHw9IHZpZGVvX3N0cmVhbV8tPnZpZGVvX2RlY29kZXJfY29uZmlnKCkuaXNfZW5jcnlwdGVkKCk7Ci0gICAgYm9vbCBuYXR1cmFsX3NpemVfY2hhbmdlZCA9Ci0gICAgICAgICh2aWRlb19zdHJlYW1fLT52aWRlb19kZWNvZGVyX2NvbmZpZygpLm5hdHVyYWxfc2l6ZSgpLndpZHRoKCkgIT0KLSAgICAgICAgICAgICBuYXR1cmFsX3NpemVfLndpZHRoKCkgfHwKLSAgICAgICAgIHZpZGVvX3N0cmVhbV8tPnZpZGVvX2RlY29kZXJfY29uZmlnKCkubmF0dXJhbF9zaXplKCkuaGVpZ2h0KCkgIT0KLSAgICAgICAgICAgICBuYXR1cmFsX3NpemVfLmhlaWdodCgpKTsKLSAgICBuYXR1cmFsX3NpemVfID0gdmlkZW9fc3RyZWFtXy0+dmlkZW9fZGVjb2Rlcl9jb25maWcoKS5uYXR1cmFsX3NpemUoKTsKKyAgICBpc19lbmNyeXB0ZWQgfD0KKyAgICAgICAgdmlkZW9fc3RyZWFtXyAmJiB2aWRlb19zdHJlYW1fLT52aWRlb19kZWNvZGVyX2NvbmZpZygpLmlzX2VuY3J5cHRlZCgpOworICAgIGJvb2wgbmF0dXJhbF9zaXplX2NoYW5nZWQgPSBmYWxzZTsKKyAgICBpZiAodmlkZW9fc3RyZWFtXykgeworICAgICAgbmF0dXJhbF9zaXplX2NoYW5nZWQgPQorICAgICAgICAgICh2aWRlb19zdHJlYW1fLT52aWRlb19kZWNvZGVyX2NvbmZpZygpLm5hdHVyYWxfc2l6ZSgpLndpZHRoKCkgIT0KKyAgICAgICAgICAgICAgIG5hdHVyYWxfc2l6ZV8ud2lkdGgoKSB8fAorICAgICAgICAgICB2aWRlb19zdHJlYW1fLT52aWRlb19kZWNvZGVyX2NvbmZpZygpLm5hdHVyYWxfc2l6ZSgpLmhlaWdodCgpICE9CisgICAgICAgICAgICAgICBuYXR1cmFsX3NpemVfLmhlaWdodCgpKTsKKyAgICAgIG5hdHVyYWxfc2l6ZV8gPSB2aWRlb19zdHJlYW1fLT52aWRlb19kZWNvZGVyX2NvbmZpZygpLm5hdHVyYWxfc2l6ZSgpOworICAgIH0KICAgICBpZiAobmF0dXJhbF9zaXplX2NoYW5nZWQpIHsKICAgICAgIGNvbnRlbnRfc2l6ZV9jaGFuZ2VfY2JfLlJ1bigpOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9zdGFyYm9hcmRfcGxheWVyLmNjIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3N0YXJib2FyZF9wbGF5ZXIuY2MKaW5kZXggMzVlYTdmZC4uOWIxMjIzNSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3N0YXJib2FyZF9wbGF5ZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3N0YXJib2FyZF9wbGF5ZXIuY2MKQEAgLTEzNSw3ICsxMzUsNyBAQAogICAgICAgc2V0X2JvdW5kc19oZWxwZXJfKHNldF9ib3VuZHNfaGVscGVyKSwKICAgICAgIGFsbG93X3Jlc3VtZV9hZnRlcl9zdXNwZW5kXyhhbGxvd19yZXN1bWVfYWZ0ZXJfc3VzcGVuZCksCiAgICAgICB2aWRlb19mcmFtZV9wcm92aWRlcl8odmlkZW9fZnJhbWVfcHJvdmlkZXIpIHsKLSAgRENIRUNLKHZpZGVvX2NvbmZpZy5Jc1ZhbGlkQ29uZmlnKCkpOworICBEQ0hFQ0soYXVkaW9fY29uZmlnLklzVmFsaWRDb25maWcoKSB8fCB2aWRlb19jb25maWcuSXNWYWxpZENvbmZpZygpKTsKICAgRENIRUNLKGhvc3RfKTsKICAgRENIRUNLKHNldF9ib3VuZHNfaGVscGVyXyk7CiAgIERDSEVDSyh2aWRlb19mcmFtZV9wcm92aWRlcl8pOwpAQCAtNDI5LDEzICs0MjksMTkgQEAKICNpZiBTQl9BUElfVkVSU0lPTiA8IFNCX0RFUFJFQ0FURV9TQl9NRURJQV9USU1FX0FQSV9WRVJTSU9OCiAgIFNiUGxheWVySW5mbyBpbmZvOwogICBTYlBsYXllckdldEluZm8ocGxheWVyXywgJmluZm8pOwotICBEQ0hFQ0tfTkUoaW5mby5kdXJhdGlvbl9wdHMsIFNCX1BMQVlFUl9OT19EVVJBVElPTik7CisgIGlmIChpbmZvLmR1cmF0aW9uX3B0cyA9PSBTQl9QTEFZRVJfTk9fRFVSQVRJT04pIHsKKyAgICAvLyBVUkwtYmFzZWQgcGxheWVyIG1heSBub3QgaGF2ZSBsb2FkZWQgYXNzZXQgeWV0LCBzbyBtYXAgbm8gZHVyYXRpb24gdG8gMC4KKyAgICByZXR1cm4gYmFzZTo6VGltZURlbHRhKCk7CisgIH0KICAgcmV0dXJuIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pY3Jvc2Vjb25kcygKICAgICAgIFNCX01FRElBX1RJTUVfVE9fU0JfVElNRShpbmZvLmR1cmF0aW9uX3B0cykpOwogI2Vsc2UgICAvLyBTQl9BUElfVkVSU0lPTiA8IFNCX0RFUFJFQ0FURV9TQl9NRURJQV9USU1FX0FQSV9WRVJTSU9OCiAgIFNiUGxheWVySW5mbzIgaW5mbzsKICAgU2JQbGF5ZXJHZXRJbmZvMihwbGF5ZXJfLCAmaW5mbyk7Ci0gIERDSEVDS19ORShpbmZvLmR1cmF0aW9uLCBTQl9QTEFZRVJfTk9fRFVSQVRJT04pOworICBpZiAoaW5mby5kdXJhdGlvbiA9PSBTQl9QTEFZRVJfTk9fRFVSQVRJT04pIHsKKyAgICAvLyBVUkwtYmFzZWQgcGxheWVyIG1heSBub3QgaGF2ZSBsb2FkZWQgYXNzZXQgeWV0LCBzbyBtYXAgbm8gZHVyYXRpb24gdG8gMC4KKyAgICByZXR1cm4gYmFzZTo6VGltZURlbHRhKCk7CisgIH0KICAgcmV0dXJuIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pY3Jvc2Vjb25kcyhpbmZvLmR1cmF0aW9uKTsKICNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPCBTQl9ERVBSRUNBVEVfU0JfTUVESUFfVElNRV9BUElfVkVSU0lPTgogfQpAQCAtNjA2LDggKzYxMiwxMCBAQAogICAgIGF1ZGlvX2NvZGVjID0gTWVkaWFBdWRpb0NvZGVjVG9TYk1lZGlhQXVkaW9Db2RlYyhhdWRpb19jb25maWdfLmNvZGVjKCkpOwogICB9CiAKLSAgU2JNZWRpYVZpZGVvQ29kZWMgdmlkZW9fY29kZWMgPQotICAgICAgTWVkaWFWaWRlb0NvZGVjVG9TYk1lZGlhVmlkZW9Db2RlYyh2aWRlb19jb25maWdfLmNvZGVjKCkpOworICBTYk1lZGlhVmlkZW9Db2RlYyB2aWRlb19jb2RlYyA9IGtTYk1lZGlhVmlkZW9Db2RlY05vbmU7CisgIGlmICh2aWRlb19jb25maWdfLklzVmFsaWRDb25maWcoKSkgeworICAgIHZpZGVvX2NvZGVjID0gTWVkaWFWaWRlb0NvZGVjVG9TYk1lZGlhVmlkZW9Db2RlYyh2aWRlb19jb25maWdfLmNvZGVjKCkpOworICB9CiAKICAgRENIRUNLKFNiUGxheWVyT3V0cHV0TW9kZVN1cHBvcnRlZChvdXRwdXRfbW9kZV8sIHZpZGVvX2NvZGVjLCBkcm1fc3lzdGVtXykpOwogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2RlY29kZXJfYnVmZmVyX2FsbG9jYXRvci5jYyBiL3NyYy9jb2JhbHQvbWVkaWEvZGVjb2Rlcl9idWZmZXJfYWxsb2NhdG9yLmNjCmluZGV4IDU0MjFjMTUuLjFlZGM1ZjAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvZGVjb2Rlcl9idWZmZXJfYWxsb2NhdG9yLmNjCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvZGVjb2Rlcl9idWZmZXJfYWxsb2NhdG9yLmNjCkBAIC0xNzgsNiArMTc4LDcgQEAKIAogdm9pZCBEZWNvZGVyQnVmZmVyQWxsb2NhdG9yOjpVcGRhdGVWaWRlb0NvbmZpZygKICAgICBjb25zdCBWaWRlb0RlY29kZXJDb25maWcmIGNvbmZpZykgeworI2lmIENPQkFMVF9NRURJQV9CVUZGRVJfVVNJTkdfTUVNT1JZX1BPT0wKICAgaWYgKCFyZXVzZV9hbGxvY2F0b3JfKSB7CiAgICAgcmV0dXJuOwogICB9CkBAIC0xODUsOCArMTg2LDEwIEBACiAgIGlmIChyZXVzZV9hbGxvY2F0b3JfLT5tYXhfY2FwYWNpdHkoKSAmJiByZXNvbHV0aW9uID4ga1ZpZGVvUmVzb2x1dGlvbjEwODBwKSB7CiAgICAgcmV1c2VfYWxsb2NhdG9yXy0+c2V0X21heF9jYXBhY2l0eShDT0JBTFRfTUVESUFfQlVGRkVSX01BWF9DQVBBQ0lUWV80Syk7CiAgIH0KKyNlbmRpZiAgLy8gQ09CQUxUX01FRElBX0JVRkZFUl9VU0lOR19NRU1PUllfUE9PTAogfQogCisjaWYgQ09CQUxUX01FRElBX0JVRkZFUl9VU0lOR19NRU1PUllfUE9PTAogRGVjb2RlckJ1ZmZlckFsbG9jYXRvcjo6UmV1c2VBbGxvY2F0b3I6OlJldXNlQWxsb2NhdG9yKAogICAgIEFsbG9jYXRvciogZmFsbGJhY2tfYWxsb2NhdG9yLCBzdGQ6OnNpemVfdCBpbml0aWFsX2NhcGFjaXR5LAogICAgIHN0ZDo6c2l6ZV90IGFsbG9jYXRpb25faW5jcmVtZW50LCBzdGQ6OnNpemVfdCBtYXhfY2FwYWNpdHkpCkBAIC0yNzYsNiArMjc5LDYgQEAKICAgICAgICAgLy8gQ09CQUxUX01FRElBX0JVRkZFUl9NQVhfQ0FQQUNJVFlfNEsgPiAwCiAgIHJldHVybiB0cnVlOwogfQotCisjZW5kaWYgIC8vIENPQkFMVF9NRURJQV9CVUZGRVJfVVNJTkdfTUVNT1JZX1BPT0wKIH0gIC8vIG5hbWVzcGFjZSBtZWRpYQogfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYV9jYXB0dXJlL2dldF91c2VyX21lZGlhX3Rlc3QuY2MgYi9zcmMvY29iYWx0L21lZGlhX2NhcHR1cmUvZ2V0X3VzZXJfbWVkaWFfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2NlYWM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9tZWRpYV9jYXB0dXJlL2dldF91c2VyX21lZGlhX3Rlc3QuY2MKQEAgLTAsMCArMSw4NiBAQAorLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImNvYmFsdC9tZWRpYV9jYXB0dXJlL21lZGlhX2RldmljZXMuaCIKKworI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKKyNpbmNsdWRlICJjb2JhbHQvZG9tL2RvbV9zZXR0aW5ncy5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vdGVzdGluZy9zdHViX3dpbmRvdy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IGludCBrTWF4RG9tRWxlbWVudERlcHRoID0gODsKKworc2NvcGVkX3B0cjxjb2JhbHQ6OnNjcmlwdDo6RW52aXJvbm1lbnRTZXR0aW5ncz4gQ3JlYXRlRE9NU2V0dGluZ3MoKSB7CisgIGNvYmFsdDo6ZG9tOjpET01TZXR0aW5nczo6T3B0aW9ucyBvcHRpb25zOworI2lmIGRlZmluZWQoRU5BQkxFX0ZBS0VfTUlDUk9QSE9ORSkKKyAgb3B0aW9ucy5taWNyb3Bob25lX29wdGlvbnMuZW5hYmxlX2Zha2VfbWljcm9waG9uZSA9IHRydWU7CisjZW5kaWYgIC8vIGRlZmluZWQoRU5BQkxFX0ZBS0VfTUlDUk9QSE9ORSkKKworICByZXR1cm4gbWFrZV9zY29wZWRfcHRyPGNvYmFsdDo6c2NyaXB0OjpFbnZpcm9ubWVudFNldHRpbmdzPigKKyAgICAgIG5ldyBjb2JhbHQ6OmRvbTo6RE9NU2V0dGluZ3Moa01heERvbUVsZW1lbnREZXB0aCwgbnVsbHB0ciwgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgbnVsbHB0ciwgb3B0aW9ucykpOworfQorCit9ICAvLyBuYW1lc3BhY2UuCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIG1lZGlhX2NhcHR1cmUgeworCitjbGFzcyBHZXRVc2VyTWVkaWFUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICBHZXRVc2VyTWVkaWFUZXN0KCkKKyAgICAgIDogd2luZG93XyhDcmVhdGVET01TZXR0aW5ncygpKSwKKyAgICAgICAgbWVkaWFfZGV2aWNlc18obmV3IE1lZGlhRGV2aWNlcygKKyAgICAgICAgICAgIHdpbmRvd18uZ2xvYmFsX2Vudmlyb25tZW50KCktPnNjcmlwdF92YWx1ZV9mYWN0b3J5KCkpKSB7CisgICAgbWVkaWFfZGV2aWNlc18tPlNldEVudmlyb25tZW50U2V0dGluZ3Mod2luZG93Xy5lbnZpcm9ubWVudF9zZXR0aW5ncygpKTsKKyAgfQorCisgIGRvbTo6dGVzdGluZzo6U3R1YldpbmRvdyB3aW5kb3dfOworICBzY29wZWRfcmVmcHRyPE1lZGlhRGV2aWNlcz4gbWVkaWFfZGV2aWNlc187Cit9OworCitURVNUX0YoR2V0VXNlck1lZGlhVGVzdCwgVGVzdEVtcHR5UGFyYW1ldGVycykgeworICBzY3JpcHQ6OkhhbmRsZTxNZWRpYURldmljZXM6Ok1lZGlhU3RyZWFtUHJvbWlzZT4gbWVkaWFfc3RyZWFtX3Byb21pc2UgPQorICAgICAgbWVkaWFfZGV2aWNlc18tPkdldFVzZXJNZWRpYSgpOworICBBU1NFUlRfRkFMU0UobWVkaWFfc3RyZWFtX3Byb21pc2UuSXNFbXB0eSgpKTsKKyAgRVhQRUNUX0VRKGNvYmFsdDo6c2NyaXB0OjpQcm9taXNlU3RhdGU6OmtSZWplY3RlZCwKKyAgICAgICAgICAgIG1lZGlhX3N0cmVhbV9wcm9taXNlLT5TdGF0ZSgpKTsKK30KKworVEVTVF9GKEdldFVzZXJNZWRpYVRlc3QsIE5vTWVkaWFTb3VyY2VzKSB7CisgIG1lZGlhX3N0cmVhbTo6TWVkaWFTdHJlYW1Db25zdHJhaW50cyBjb25zdHJhaW50czsKKyAgY29uc3RyYWludHMuc2V0X2F1ZGlvKGZhbHNlKTsKKyAgc2NyaXB0OjpIYW5kbGU8TWVkaWFEZXZpY2VzOjpNZWRpYVN0cmVhbVByb21pc2U+IG1lZGlhX3N0cmVhbV9wcm9taXNlID0KKyAgICAgIG1lZGlhX2RldmljZXNfLT5HZXRVc2VyTWVkaWEoY29uc3RyYWludHMpOworICBBU1NFUlRfRkFMU0UobWVkaWFfc3RyZWFtX3Byb21pc2UuSXNFbXB0eSgpKTsKKyAgRVhQRUNUX0VRKGNvYmFsdDo6c2NyaXB0OjpQcm9taXNlU3RhdGU6OmtSZWplY3RlZCwKKyAgICAgICAgICAgIG1lZGlhX3N0cmVhbV9wcm9taXNlLT5TdGF0ZSgpKTsKK30KKworVEVTVF9GKEdldFVzZXJNZWRpYVRlc3QsIEF1ZGlvTWVkaWFTb3VyY2VzKSB7CisgIG1lZGlhX3N0cmVhbTo6TWVkaWFTdHJlYW1Db25zdHJhaW50cyBjb25zdHJhaW50czsKKyAgY29uc3RyYWludHMuc2V0X2F1ZGlvKHRydWUpOworICBzY3JpcHQ6OkhhbmRsZTxNZWRpYURldmljZXM6Ok1lZGlhU3RyZWFtUHJvbWlzZT4gbWVkaWFfc3RyZWFtX3Byb21pc2UgPQorICAgICAgbWVkaWFfZGV2aWNlc18tPkdldFVzZXJNZWRpYShjb25zdHJhaW50cyk7CisgIEFTU0VSVF9GQUxTRShtZWRpYV9zdHJlYW1fcHJvbWlzZS5Jc0VtcHR5KCkpOworICBFWFBFQ1RfRVEoY29iYWx0OjpzY3JpcHQ6OlByb21pc2VTdGF0ZTo6a0Z1bGZpbGxlZCwKKyAgICAgICAgICAgIG1lZGlhX3N0cmVhbV9wcm9taXNlLT5TdGF0ZSgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIG1lZGlhX2NhcHR1cmUKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWFfY2FwdHVyZS9tZWRpYV9jYXB0dXJlLmd5cCBiL3NyYy9jb2JhbHQvbWVkaWFfY2FwdHVyZS9tZWRpYV9jYXB0dXJlLmd5cAppbmRleCAzNjRjMjcyLi4xMmYxZmIxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhX2NhcHR1cmUvbWVkaWFfY2FwdHVyZS5neXAKKysrIGIvc3JjL2NvYmFsdC9tZWRpYV9jYXB0dXJlL21lZGlhX2NhcHR1cmUuZ3lwCkBAIC0yNSw5ICsyNSwxNCBAQAogICAgICAgICAnbWVkaWFfZGV2aWNlcy5oJywKICAgICAgICAgJ21lZGlhX2RldmljZV9pbmZvLmNjJywKICAgICAgICAgJ21lZGlhX2RldmljZV9pbmZvLmgnLAorICAgICAgICAnbWVkaWFfcmVjb3JkZXIuY2MnLAorICAgICAgICAnbWVkaWFfcmVjb3JkZXIuaCcsCiAgICAgICBdLAogICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9icm93c2VyL2Jyb3dzZXJfYmluZGluZ3NfZ2VuLmd5cDpnZW5lcmF0ZWRfdHlwZXMnLAorICAgICAgICAnPChERVBUSCkvY29iYWx0L21lZGlhX3N0cmVhbS9tZWRpYV9zdHJlYW0uZ3lwOm1lZGlhX3N0cmVhbScsCisgICAgICAgICc8KERFUFRIKS9jb2JhbHQvc2NyaXB0L2VuZ2luZS5neXA6ZW5naW5lJywKKyAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9zcGVlY2gvc3BlZWNoLmd5cDpzcGVlY2gnLAogICAgICAgXSwKICAgICAgICdleHBvcnRfZGVwZW5kZW50X3NldHRpbmdzJzogWwogICAgICAgICAjIEFkZGl0aW9uYWxseSwgZW5zdXJlIHRoYXQgdGhlIGluY2x1ZGUgZGlyZWN0b3JpZXMgZm9yIGdlbmVyYXRlZApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYV9jYXB0dXJlL21lZGlhX2NhcHR1cmVfdGVzdC5neXAgYi9zcmMvY29iYWx0L21lZGlhX2NhcHR1cmUvbWVkaWFfY2FwdHVyZV90ZXN0Lmd5cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTkwM2M3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9tZWRpYV9jYXB0dXJlL21lZGlhX2NhcHR1cmVfdGVzdC5neXAKQEAgLTAsMCArMSw1NSBAQAorIyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCit7CisgICd2YXJpYWJsZXMnOiB7CisgICAgJ3NiX3BlZGFudGljX3dhcm5pbmdzJzogMSwKKyAgfSwKKyAgJ3RhcmdldHMnOiBbCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ21lZGlhX2NhcHR1cmVfdGVzdCcsCisgICAgICAndHlwZSc6ICc8KGd0ZXN0X3RhcmdldF90eXBlKScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ2dldF91c2VyX21lZGlhX3Rlc3QuY2MnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc8KERFUFRIKS9jb2JhbHQvZG9tL2RvbS5neXA6ZG9tJywKKyAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9kb20vdGVzdGluZy9kb21fdGVzdGluZy5neXA6ZG9tX3Rlc3RpbmcnLAorICAgICAgICAnPChERVBUSCkvY29iYWx0L21lZGlhX2NhcHR1cmUvbWVkaWFfY2FwdHVyZS5neXA6bWVkaWFfY2FwdHVyZScsCisKKyAgICAgICAgIyBUT0RPOiBSZW1vdmUgdGhlIGRlcGVuZGVuY3kgYmVsb3csIGl0IHdvcmtzIGFyb3VuZCB0aGUgZmFjdCB0aGF0CisgICAgICAgICMgICAgICAgU2NyaXB0VmFsdWVGYWN0b3J5IGhhcyBub24tdmlydHVhbCBtZXRob2QgQ3JlYXRlUHJvbWlzZSgpLgorICAgICAgICAnPChERVBUSCkvY29iYWx0L3NjcmlwdC9lbmdpbmUuZ3lwOmVuZ2luZScsCisgICAgICAgICMgRm9yIEZha2UgTWljcm9waG9uZS4KKyAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9zcGVlY2gvc3BlZWNoLmd5cDpzcGVlY2gnLAorCisgICAgICAgICc8KERFUFRIKS9jb2JhbHQvdGVzdC90ZXN0Lmd5cDpydW5fYWxsX3VuaXR0ZXN0cycsCisgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2dtb2NrLmd5cDpnbW9jaycsCisgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2d0ZXN0Lmd5cDpndGVzdCcsCisgICAgICBdLAorICAgIH0sCisKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnbWVkaWFfY2FwdHVyZV90ZXN0X2RlcGxveScsCisgICAgICAndHlwZSc6ICdub25lJywKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICdtZWRpYV9jYXB0dXJlX3Rlc3QnLAorICAgICAgXSwKKyAgICAgICd2YXJpYWJsZXMnOiB7CisgICAgICAgICdleGVjdXRhYmxlX25hbWUnOiAnbWVkaWFfY2FwdHVyZV90ZXN0JywKKyAgICAgIH0sCisgICAgICAnaW5jbHVkZXMnOiBbICc8KERFUFRIKS9zdGFyYm9hcmQvYnVpbGQvZGVwbG95Lmd5cGknIF0sCisgICAgfSwKKyAgXSwKK30KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWFfY2FwdHVyZS9tZWRpYV9kZXZpY2VzLmNjIGIvc3JjL2NvYmFsdC9tZWRpYV9jYXB0dXJlL21lZGlhX2RldmljZXMuY2MKaW5kZXggYjlhMTk0Yi4uZTkwMTk5YSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYV9jYXB0dXJlL21lZGlhX2RldmljZXMuY2MKKysrIGIvc3JjL2NvYmFsdC9tZWRpYV9jYXB0dXJlL21lZGlhX2RldmljZXMuY2MKQEAgLTE2LDggKzE2LDExIEBACiAKICNpbmNsdWRlIDxzdHJpbmc+CiAKKyNpbmNsdWRlICJjb2JhbHQvZG9tL2RvbV9leGNlcHRpb24uaCIKICNpbmNsdWRlICJjb2JhbHQvbWVkaWFfY2FwdHVyZS9tZWRpYV9kZXZpY2VfaW5mby5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYV9zdHJlYW0vbWVkaWFfc3RyZWFtLmgiCiAjaW5jbHVkZSAiY29iYWx0L3NwZWVjaC9taWNyb3Bob25lLmgiCisjaW5jbHVkZSAiY29iYWx0L3NwZWVjaC9taWNyb3Bob25lX2Zha2UuaCIKICNpbmNsdWRlICJjb2JhbHQvc3BlZWNoL21pY3JvcGhvbmVfc3RhcmJvYXJkLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3N0cmluZy5oIgogCkBAIC0zMCwxMyArMzMsMjggQEAKIAogbmFtZXNwYWNlIHsKIAotc2NvcGVkX3B0cjxzcGVlY2g6Ok1pY3JvcGhvbmU+IENyZWF0ZU1pY3JvcGhvbmUoKSB7Ci0gIHNjb3BlZF9wdHI8c3BlZWNoOjpNaWNyb3Bob25lPiBtaWM7Ci0jaWZkZWYgRU5BQkxFX01JQ1JPUEhPTkVfSURMCit1c2luZyBzcGVlY2g6Ok1pY3JvcGhvbmU7CisKK3Njb3BlZF9wdHI8TWljcm9waG9uZT4gQ3JlYXRlTWljcm9waG9uZShjb25zdCBNaWNyb3Bob25lOjpPcHRpb25zJiBvcHRpb25zKSB7CisjaWYgZGVmaW5lZChFTkFCTEVfRkFLRV9NSUNST1BIT05FKQorICBpZiAob3B0aW9ucy5lbmFibGVfZmFrZV9taWNyb3Bob25lKSB7CisgICAgcmV0dXJuIG1ha2Vfc2NvcGVkX3B0cjxzcGVlY2g6Ok1pY3JvcGhvbmU+KAorICAgICAgICBuZXcgc3BlZWNoOjpNaWNyb3Bob25lRmFrZShvcHRpb25zKSk7CisgIH0KKyNlbHNlCisgIFVOUkVGRVJFTkNFRF9QQVJBTUVURVIob3B0aW9ucyk7CisjZW5kaWYgIC8vIGRlZmluZWQoRU5BQkxFX0ZBS0VfTUlDUk9QSE9ORSkKKworICBzY29wZWRfcHRyPE1pY3JvcGhvbmU+IG1pYzsKKworI2lmIGRlZmluZWQoRU5BQkxFX01JQ1JPUEhPTkVfSURMKQogICBtaWMucmVzZXQobmV3IHNwZWVjaDo6TWljcm9waG9uZVN0YXJib2FyZCgKICAgICAgIHNwZWVjaDo6TWljcm9waG9uZVN0YXJib2FyZDo6a0RlZmF1bHRTYW1wbGVSYXRlLAotICAgICAgc3BlZWNoOjpNaWNyb3Bob25lU3RhcmJvYXJkOjprRGVmYXVsdFNhbXBsZVJhdGUpKTsKLSNlbmRpZgorICAgICAgLyogQnVmZmVyIGZvciBvbmUgc2Vjb25kLiAqLworICAgICAgc3BlZWNoOjpNaWNyb3Bob25lU3RhcmJvYXJkOjprRGVmYXVsdFNhbXBsZVJhdGUgKgorICAgICAgICAgIHNwZWVjaDo6TWljcm9waG9uZVN0YXJib2FyZDo6a1NiTWljcm9waG9uZVNhbXBsZVNpemVJbkJ5dGVzKSk7CisjZW5kaWYgIC8vIGRlZmluZWQoRU5BQkxFX01JQ1JPUEhPTkVfSURMKQorCiAgIHJldHVybiBtaWMuUGFzcygpOwogfQogCkBAIC00OCwyMCArNjYsMTA0IEBACiAKIHNjcmlwdDo6SGFuZGxlPE1lZGlhRGV2aWNlczo6TWVkaWFJbmZvU2VxdWVuY2VQcm9taXNlPgogTWVkaWFEZXZpY2VzOjpFbnVtZXJhdGVEZXZpY2VzKCkgeworICBEQ0hFQ0soc2V0dGluZ3NfKTsKKyAgRENIRUNLKHNjcmlwdF92YWx1ZV9mYWN0b3J5Xyk7CiAgIHNjcmlwdDo6SGFuZGxlPE1lZGlhSW5mb1NlcXVlbmNlUHJvbWlzZT4gcHJvbWlzZSA9CiAgICAgICBzY3JpcHRfdmFsdWVfZmFjdG9yeV8tPkNyZWF0ZUJhc2ljUHJvbWlzZTxNZWRpYUluZm9TZXF1ZW5jZT4oKTsKICAgc2NyaXB0OjpTZXF1ZW5jZTxzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4+IG91dHB1dDsKLSAgc2NvcGVkX3B0cjxzcGVlY2g6Ok1pY3JvcGhvbmU+IG1pY3JvcGhvbmUgPSBDcmVhdGVNaWNyb3Bob25lKCk7CisKKyAgc2NvcGVkX3B0cjxzcGVlY2g6Ok1pY3JvcGhvbmU+IG1pY3JvcGhvbmUgPQorICAgICAgQ3JlYXRlTWljcm9waG9uZShzZXR0aW5nc18tPm1pY3JvcGhvbmVfb3B0aW9ucygpKTsKICAgaWYgKG1pY3JvcGhvbmUpIHsKICAgICBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4gbWVkaWFfZGV2aWNlKAogICAgICAgICBuZXcgTWVkaWFEZXZpY2VJbmZvKHNjcmlwdF92YWx1ZV9mYWN0b3J5Xywga01lZGlhRGV2aWNlS2luZEF1ZGlvaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWljcm9waG9uZS0+TGFiZWwoKSkpOwogICAgIG91dHB1dC5wdXNoX2JhY2sobWVkaWFfZGV2aWNlKTsKICAgfQotCiAgIHByb21pc2UtPlJlc29sdmUob3V0cHV0KTsKICAgcmV0dXJuIHByb21pc2U7CiB9CiAKK3NjcmlwdDo6SGFuZGxlPE1lZGlhRGV2aWNlczo6TWVkaWFTdHJlYW1Qcm9taXNlPiBNZWRpYURldmljZXM6OkdldFVzZXJNZWRpYSgpIHsKKyAgRENIRUNLKHNjcmlwdF92YWx1ZV9mYWN0b3J5Xyk7CisgIHNjcmlwdDo6SGFuZGxlPE1lZGlhRGV2aWNlczo6TWVkaWFTdHJlYW1Qcm9taXNlPiBwcm9taXNlID0KKyAgICAgIHNjcmlwdF92YWx1ZV9mYWN0b3J5Xy0+Q3JlYXRlSW50ZXJmYWNlUHJvbWlzZTwKKyAgICAgICAgICBzY3JpcHQ6OlNjcmlwdFZhbHVlRmFjdG9yeTo6V3JhcHBhYmxlUHJvbWlzZT4oKTsKKyAgLy8gUGVyIHNwZWNpZmljYXRpb24gYXQKKyAgLy8gaHR0cHM6Ly93M2MuZ2l0aHViLmlvL21lZGlhY2FwdHVyZS1tYWluLyNkb20tbWVkaWFkZXZpY2VzLWdldHVzZXJtZWRpYQorICAvLworICAvLyBTdGVwIDM6IElmIHJlcXVlc3RlZE1lZGlhVHlwZXMgaXMgdGhlIGVtcHR5IHNldCwgcmV0dXJuIGEgcHJvbWlzZSByZWplY3RlZAorICAvLyB3aXRoIGEgVHlwZUVycm9yLiBUaGUgd29yZCAib3B0aW9uYWwiIG9jY3VycyBpbiB0aGUgV2ViSURMIGR1ZSB0byBXZWJJREwKKyAgLy8gcnVsZXMsIGJ1dCB0aGUgYXJndW1lbnQgbXVzdCBiZSBzdXBwbGllZCBpbiBvcmRlciBmb3IgdGhlIGNhbGwgdG8gc3VjY2VlZC4KKworICBwcm9taXNlLT5SZWplY3Qoc2NyaXB0OjprVHlwZUVycm9yKTsKKyAgcmV0dXJuIHByb21pc2U7Cit9CisKK3NjcmlwdDo6SGFuZGxlPE1lZGlhRGV2aWNlczo6TWVkaWFTdHJlYW1Qcm9taXNlPiBNZWRpYURldmljZXM6OkdldFVzZXJNZWRpYSgKKyAgICBjb25zdCBtZWRpYV9zdHJlYW06Ok1lZGlhU3RyZWFtQ29uc3RyYWludHMmIGNvbnN0cmFpbnRzKSB7CisgIHNjcmlwdDo6SGFuZGxlPE1lZGlhRGV2aWNlczo6TWVkaWFTdHJlYW1Qcm9taXNlPiBwcm9taXNlID0KKyAgICAgIHNjcmlwdF92YWx1ZV9mYWN0b3J5Xy0+Q3JlYXRlSW50ZXJmYWNlUHJvbWlzZTwKKyAgICAgICAgICBzY3JpcHQ6OlNjcmlwdFZhbHVlRmFjdG9yeTo6V3JhcHBhYmxlUHJvbWlzZT4oKTsKKyAgaWYgKCFjb25zdHJhaW50cy5hdWRpbygpKSB7CisgICAgLy8gU3RlcCAzOiBJZiByZXF1ZXN0ZWRNZWRpYVR5cGVzIGlzIHRoZSBlbXB0eSBzZXQsIHJldHVybiBhIHByb21pc2UKKyAgICAvLyByZWplY3RlZCB3aXRoIGEgVHlwZUVycm9yLiBUaGUgd29yZCAib3B0aW9uYWwiIG9jY3VycyBpbiB0aGUgV2ViSURMIGR1ZQorICAgIC8vIHRvIFdlYklETCBydWxlcywgYnV0IHRoZSBhcmd1bWVudCBtdXN0IGJlIHN1cHBsaWVkIGluIG9yZGVyIGZvciB0aGUgY2FsbAorICAgIC8vIHRvIHN1Y2NlZWQuCisgICAgRExPRyhJTkZPKSA8PCAiQXVkaW8gY29uc3RyYWludCBtdXN0IGJlIHRydWUuIjsKKyAgICBwcm9taXNlLT5SZWplY3Qoc2NyaXB0OjprVHlwZUVycm9yKTsKKyAgICByZXR1cm4gcHJvbWlzZTsKKyAgfQorICAvLyBTdGVwcyA0LTcgYXJlIG5vdCBuZWVkZWQgZm9yIGNvYmFsdC4KKyAgLy8gU3RlcCA4IGlzIHRvIGNyZWF0ZSBhIHByb21pc2UgKHdoaWNoIGlzIGFscmVhZHkgZG9uZSkuCisKKyAgLy8gU3RlcCA5OiBDb25zdHJ1Y3QgYSBsaXN0IG9mIE1lZGlhU3RyZWFtVHJhY2tzIHRoYXQgd2UgaGF2ZSBwZXJtaXNzaW9uLgorICBDcmVhdGVNaWNyb3Bob25lSWZOZWVkZWQoKTsKKyAgaWYgKCFtaWNyb3Bob25lXykgeworICAgIHByb21pc2UtPlJlamVjdChuZXcgZG9tOjpET01FeGNlcHRpb24oZG9tOjpET01FeGNlcHRpb246OmtOb3RGb3VuZEVycikpOworICAgIHJldHVybiBwcm9taXNlOworICB9CisgIGJvb2wgb3Blbl9zdWNjZXNzID0gbWljcm9waG9uZV8tPk9wZW4oKTsKKyAgaWYgKCFvcGVuX3N1Y2Nlc3MpIHsKKyAgICAvLyBUaGlzIHR5cGljYWxseSBoYXBwZW5zIGlmIHRoZSB1c2VyIGRpZCBub3QgZ2l2ZSBwZXJtaXNzaW9uLgorICAgIC8vIFN0ZXAgOS44LCBoYW5kbGUgIlBlcm1pc3Npb24gRmFpbHVyZSIKKyAgICBETE9HKElORk8pIDw8ICJVbmFibGUgdG8gb3BlbiB0aGUgbWljcm9waG9uZS4iOworICAgIHByb21pc2UtPlJlamVjdChuZXcgZG9tOjpET01FeGNlcHRpb24oZG9tOjpET01FeGNlcHRpb246OmtOb3RBbGxvd2VkRXJyKSk7CisgIH0KKyAgdXNpbmcgbWVkaWFfc3RyZWFtOjpNZWRpYVN0cmVhbTsKKyAgc2NvcGVkX3JlZnB0cjxtZWRpYV9zdHJlYW06Ok1lZGlhU3RyZWFtVHJhY2s+IG1pY3JvcGhvbmVfdHJhY2s7CisgIC8vIFRPRE86IEF0dGFjaCBhIG1pY3JvcGhvbmUgZGV2aWNlIHRvIHRoZSBtaWNyb3Bob25lIHRyYWNrLgorICBNZWRpYVN0cmVhbTo6VHJhY2tTZXF1ZW5jZXMgYXVkaW9fdHJhY2tzOworICBhdWRpb190cmFja3MucHVzaF9iYWNrKG1pY3JvcGhvbmVfdHJhY2spOworICBhdXRvIG1lZGlhX3N0cmVhbShtYWtlX3Njb3BlZF9yZWZwdHIobmV3IE1lZGlhU3RyZWFtKGF1ZGlvX3RyYWNrcykpKTsKKyAgcHJvbWlzZS0+UmVzb2x2ZShtZWRpYV9zdHJlYW0pOworCisgIC8vIFN0ZXAgMTAsIHJldHVybiBwcm9taXNlLgorICByZXR1cm4gcHJvbWlzZTsKK30KKwordm9pZCBNZWRpYURldmljZXM6OkNyZWF0ZU1pY3JvcGhvbmVJZk5lZWRlZCgpIHsKKyAgRENIRUNLKHNldHRpbmdzXyk7CisgIGlmIChtaWNyb3Bob25lXykgeworICAgIHJldHVybjsKKyAgfQorCisgIHNjb3BlZF9wdHI8c3BlZWNoOjpNaWNyb3Bob25lPiBtaWNyb3Bob25lID0KKyAgICAgIENyZWF0ZU1pY3JvcGhvbmUoc2V0dGluZ3NfLT5taWNyb3Bob25lX29wdGlvbnMoKSk7CisKKyAgaWYgKCFtaWNyb3Bob25lKSB7CisgICAgRExPRyhJTkZPKSA8PCAiVW5hYmxlIHRvIGNyZWF0ZSBhIG1pY3JvcGhvbmUuIjsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoIW1pY3JvcGhvbmUtPklzVmFsaWQoKSkgeworICAgIERMT0coSU5GTykgPDwgIklnbm9yaW5nIGNyZWF0ZWQgbWljcm9waG9uZSBiZWNhdXNlIGl0IGlzIGludmFsaWQuIjsKKyAgICByZXR1cm47CisgIH0KKworICBETE9HKElORk8pIDw8ICJDcmVhdGVkIG1pY3JvcGhvbmU6ICIgPDwgbWljcm9waG9uZS0+TGFiZWwoKTsKKyAgbWljcm9waG9uZV8gPSBtaWNyb3Bob25lLlBhc3MoKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIG1lZGlhX2NhcHR1cmUKIH0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWFfY2FwdHVyZS9tZWRpYV9kZXZpY2VzLmggYi9zcmMvY29iYWx0L21lZGlhX2NhcHR1cmUvbWVkaWFfZGV2aWNlcy5oCmluZGV4IDgzNzM5ZDMuLjg5YzBlMzkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWFfY2FwdHVyZS9tZWRpYV9kZXZpY2VzLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYV9jYXB0dXJlL21lZGlhX2RldmljZXMuaApAQCAtMTcsMTMgKzE3LDE4IEBACiAKICNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgogI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vZG9tX3NldHRpbmdzLmgiCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9ldmVudF90YXJnZXQuaCIKICNpbmNsdWRlICJjb2JhbHQvbWVkaWFfY2FwdHVyZS9tZWRpYV9kZXZpY2VfaW5mby5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYV9zdHJlYW0vbWVkaWFfc3RyZWFtX2NvbnN0cmFpbnRzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9lbnZpcm9ubWVudF9zZXR0aW5ncy5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvbWlzZS5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfdmFsdWVfZmFjdG9yeS5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2VxdWVuY2UuaCIKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zcGVlY2gvbWljcm9waG9uZS5oIgogCiBuYW1lc3BhY2UgY29iYWx0IHsKIG5hbWVzcGFjZSBtZWRpYV9jYXB0dXJlIHsKQEAgLTM1LDE1ICs0MCwyOSBAQAogIHB1YmxpYzoKICAgdXNpbmcgTWVkaWFJbmZvU2VxdWVuY2UgPSBzY3JpcHQ6OlNlcXVlbmNlPHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+PjsKICAgdXNpbmcgTWVkaWFJbmZvU2VxdWVuY2VQcm9taXNlID0gc2NyaXB0OjpQcm9taXNlPE1lZGlhSW5mb1NlcXVlbmNlPjsKKyAgdXNpbmcgTWVkaWFTdHJlYW1Qcm9taXNlID0KKyAgICAgIHNjcmlwdDo6UHJvbWlzZTxzY3JpcHQ6OlNjcmlwdFZhbHVlRmFjdG9yeTo6V3JhcHBhYmxlUHJvbWlzZT47CiAKICAgZXhwbGljaXQgTWVkaWFEZXZpY2VzKHNjcmlwdDo6U2NyaXB0VmFsdWVGYWN0b3J5KiBzY3JpcHRfdmFsdWVfZmFjdG9yeSk7CiAKICAgc2NyaXB0OjpIYW5kbGU8TWVkaWFJbmZvU2VxdWVuY2VQcm9taXNlPiBFbnVtZXJhdGVEZXZpY2VzKCk7CisgIHNjcmlwdDo6SGFuZGxlPE1lZGlhU3RyZWFtUHJvbWlzZT4gR2V0VXNlck1lZGlhKCk7CisgIHNjcmlwdDo6SGFuZGxlPE1lZGlhU3RyZWFtUHJvbWlzZT4gR2V0VXNlck1lZGlhKAorICAgICAgY29uc3QgbWVkaWFfc3RyZWFtOjpNZWRpYVN0cmVhbUNvbnN0cmFpbnRzJiBjb25zdHJhaW50cyk7CisKKyAgdm9pZCBTZXRFbnZpcm9ubWVudFNldHRpbmdzKHNjcmlwdDo6RW52aXJvbm1lbnRTZXR0aW5ncyogc2V0dGluZ3MpIHsKKyAgICBzZXR0aW5nc18gPSBiYXNlOjpwb2x5bW9ycGhpY19kb3duY2FzdDxkb206OkRPTVNldHRpbmdzKj4oc2V0dGluZ3MpOworICB9CiAKICAgREVGSU5FX1dSQVBQQUJMRV9UWVBFKE1lZGlhRGV2aWNlcyk7CiAKICBwcml2YXRlOgorICB2b2lkIENyZWF0ZU1pY3JvcGhvbmVJZk5lZWRlZCgpOworCiAgIHNjcmlwdDo6U2NyaXB0VmFsdWVGYWN0b3J5KiBzY3JpcHRfdmFsdWVfZmFjdG9yeV87CisgIGRvbTo6RE9NU2V0dGluZ3MqIHNldHRpbmdzXyA9IG51bGxwdHI7CisKKyAgc2NvcGVkX3B0cjxzcGVlY2g6Ok1pY3JvcGhvbmU+IG1pY3JvcGhvbmVfOwogCiAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihNZWRpYURldmljZXMpOwogfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWFfY2FwdHVyZS9tZWRpYV9kZXZpY2VzLmlkbCBiL3NyYy9jb2JhbHQvbWVkaWFfY2FwdHVyZS9tZWRpYV9kZXZpY2VzLmlkbAppbmRleCBmNjk3MDM3Li4yYjc3ZmVjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhX2NhcHR1cmUvbWVkaWFfZGV2aWNlcy5pZGwKKysrIGIvc3JjL2NvYmFsdC9tZWRpYV9jYXB0dXJlL21lZGlhX2RldmljZXMuaWRsCkBAIC0xNyw0ICsxNyw1IEBACiBbRXhwb3NlZD1XaW5kb3ddCiBpbnRlcmZhY2UgTWVkaWFEZXZpY2VzIDogRXZlbnRUYXJnZXQgewogICBQcm9taXNlPHNlcXVlbmNlPE1lZGlhRGV2aWNlSW5mbz4+IGVudW1lcmF0ZURldmljZXMoKTsKKyAgUHJvbWlzZTxNZWRpYVN0cmVhbT4gZ2V0VXNlck1lZGlhKG9wdGlvbmFsIE1lZGlhU3RyZWFtQ29uc3RyYWludHMgY29uc3RyYWludHMpOwogfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWFfY2FwdHVyZS9tZWRpYV9yZWNvcmRlci5jYyBiL3NyYy9jb2JhbHQvbWVkaWFfY2FwdHVyZS9tZWRpYV9yZWNvcmRlci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzgwNDhjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9tZWRpYV9jYXB0dXJlL21lZGlhX3JlY29yZGVyLmNjCkBAIC0wLDAgKzEsMjYyIEBACisvLyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiY29iYWx0L21lZGlhX2NhcHR1cmUvbWVkaWFfcmVjb3JkZXIuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjbWF0aD4KKworI2luY2x1ZGUgImJhc2UvbWVzc2FnZV9sb29wLmgiCisjaW5jbHVkZSAiYmFzZS9zdHJpbmdfcGllY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvZG9tL2FycmF5X2J1ZmZlci5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vYmxvYi5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vZG9tX2V4Y2VwdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYV9zdHJlYW0vbWVkaWFfc3RyZWFtX3RyYWNrLmgiCisjaW5jbHVkZSAiY29iYWx0L21lZGlhX3N0cmVhbS9tZWRpYV90cmFja19zZXR0aW5ncy5oIgorCituYW1lc3BhY2UgeworCisvLyBTZWUgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzI1ODYgZm9yIE1JTUUgdHlwZQorY29uc3QgY2hhciBrTGluZWFyMTZNaW1lVHlwZVtdID0gImF1ZGlvL0wxNiI7CisKK2NvbnN0IGludDMyIGtNaW5pbXVtVGltZVNsaWNlSW5NaWxsaXNlY29uZHMgPSAxOworCisvLyBSZWFkIE1pY3JvcGhvbmUgaW5wdXQgZXZlcnkgZmV3IG1pbGxpc2Vjb25kcywgc28gdGhhdAorLy8gdGhlIGlucHV0IGJ1ZmZlciBkb2Vzbid0IGZpbGwgdXAuCitjb25zdCBpbnQzMiBrRGVmYXVsdE1pY3JvcGhvbmVSZWFkVGhyZXNob2xkTWlsbGlzZWNvbmRzID0gNTA7CisKK2NvbnN0IGRvdWJsZSBrU2NoZWR1bGluZ0xhdGVuY3lCdWZmZXJTZWNvbmRzID0gMC4yMDsKKworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIG1lZGlhX2NhcHR1cmUgeworCit2b2lkIE1lZGlhUmVjb3JkZXI6OlN0YXJ0KGludDMyIHRpbWVzbGljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0OjpFeGNlcHRpb25TdGF0ZSogZXhjZXB0aW9uX3N0YXRlKSB7CisgIERDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKKyAgLy8gRm9sbG93aW5nIHRoZSBzcGVjIGF0CisgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9tZWRpYXN0cmVhbS1yZWNvcmRpbmcvI21lZGlhcmVjb3JkZXItbWV0aG9kczoKKworICAvLyBTdGVwICMxLCBub3QgbmVlZGVkIGZvciBDb2JhbHQuCisKKyAgLy8gU3RlcCAjMiwgZG9uZSBieSBDb2JhbHQgYmluZGluZ3MuCisKKyAgLy8gU3RlcCAjMworICBpZiAocmVjb3JkaW5nX3N0YXRlXyAhPSBrUmVjb3JkaW5nU3RhdGVJbmFjdGl2ZSkgeworICAgIGRvbTo6RE9NRXhjZXB0aW9uOjpSYWlzZShkb206OkRPTUV4Y2VwdGlvbjo6a0ludmFsaWRTdGF0ZUVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludGVybmFsIGVycm9yOiBVbmFibGUgdG8gZ2V0IERPTSBzZXR0aW5ncy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25fc3RhdGUpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIFN0ZXAgIzQtNS4zLCBub3QgbmVlZGVkIGZvciBDb2JhbHQuCisgIHJlY29yZGluZ19zdGF0ZV8gPSBrUmVjb3JkaW5nU3RhdGVSZWNvcmRpbmc7CisKKyAgLy8gU3RlcCAjNS40LCBjcmVhdGUgYSBuZXcgQmxvYiwgYW5kIHN0YXJ0IGNvbGxlY3RpbmcgZGF0YS4KKworICAvLyBJZiB0aW1lc2xpY2UgaXMgbm90IHVuZGVmaW5lZCwgdGhlbiBvbmNlIGEgbWluaW11bSBvZiB0aW1lc2xpY2UKKyAgLy8gbWlsbGlzZWNvbmRzIG9mIGRhdGEgaGF2ZSBiZWVuIGNvbGxlY3RlZCwgb3Igc29tZSBtaW5pbXVtIHRpbWUgc2xpY2UKKyAgLy8gaW1wb3NlZCBieSB0aGUgVUEsIHdoaWNoZXZlciBpcyBncmVhdGVyLCBzdGFydCBnYXRoZXJpbmcgZGF0YSBpbnRvIGEgbmV3CisgIC8vIEJsb2IgYmxvYiwgYW5kIHF1ZXVlIGEgdGFzaywgdXNpbmcgdGhlIERPTSBtYW5pcHVsYXRpb24gdGFzayBzb3VyY2UsIHRoYXQKKyAgLy8gZmlyZXMgYSBibG9iIGV2ZW50IG5hbWVkIHxkYXRhYXZhaWxhYmxlfCBhdCB0YXJnZXQuCisKKyAgLy8gV2UgbmVlZCB0byBkcmFpbiB0aGUgbWVkaWEgZnJlcXVlbnRseSwgc28gdHJ5IHRvIHJlYWQgYXRsZWFzdCBvbmNlIGV2ZXJ5CisgIC8vIHxyZWFkX2ZyZXF1ZW5jeV98IGludGVydmFsLgorICBpbnQzMiBlZmZlY3RpdmVfdGltZV9zbGljZV9taWxsaXNlY29uZHMgPQorICAgICAgc3RkOjptaW4oa0RlZmF1bHRNaWNyb3Bob25lUmVhZFRocmVzaG9sZE1pbGxpc2Vjb25kcywgdGltZXNsaWNlKTsKKyAgLy8gQXZvaWQgcm91bmRpbmcgZG93biB0byAwIG1pbGxpc2Vjb25kcy4KKyAgZWZmZWN0aXZlX3RpbWVfc2xpY2VfbWlsbGlzZWNvbmRzID0gc3RkOjptYXgoCisgICAgICBrTWluaW11bVRpbWVTbGljZUluTWlsbGlzZWNvbmRzLCBlZmZlY3RpdmVfdGltZV9zbGljZV9taWxsaXNlY29uZHMpOworICByZWFkX2ZyZXF1ZW5jeV8gPQorICAgICAgYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKGVmZmVjdGl2ZV90aW1lX3NsaWNlX21pbGxpc2Vjb25kcyk7CisKKyAgLy8gVGhpcyBpcyB0aGUgZnJlcXVlbmN5IHdlIHdpbGwgY2FsbGJhY2sgdG8gSmF2YXNjcmlwdC4KKyAgY2FsbGJhY2tfZnJlcXVlbmN5XyA9IGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcyh0aW1lc2xpY2UpOworCisgIGludDY0IGJ1ZmZlcl9zaXplX2hpbnQgPSBHZXRSZWNvbW1lbmRlZEJ1ZmZlclNpemUoY2FsbGJhY2tfZnJlcXVlbmN5Xyk7CisgIHJlY29yZGVkX2J1ZmZlcl8uSGludFR5cGljYWxTaXplKHN0YXRpY19jYXN0PHNpemVfdD4oYnVmZmVyX3NpemVfaGludCkpOworCisgIFJlc2V0TGFzdENhbGxiYWNrVGltZSgpOworICBSZWFkU3RyZWFtQW5kRG9DYWxsYmFjaygpOworCisgIHN0cmVhbV9yZWFkZXJfY2FsbGJhY2tfLlJlc2V0KAorICAgICAgYmFzZTo6QmluZCgmTWVkaWFSZWNvcmRlcjo6UmVhZFN0cmVhbUFuZERvQ2FsbGJhY2ssIHRoaXMpKTsKKyAgTWVzc2FnZUxvb3A6OmN1cnJlbnQoKS0+UG9zdFRhc2soRlJPTV9IRVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1fcmVhZGVyX2NhbGxiYWNrXy5jYWxsYmFjaygpKTsKKworICAvLyBTdGVwICM1LjUsIG5vdCBuZWVkZWQuCisKKyAgLy8gU3RlcCAjNiwgcmV0dXJuIHVuZGVmaW5lZC4KK30KKwordm9pZCBNZWRpYVJlY29yZGVyOjpTdG9wKHNjcmlwdDo6RXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSkgeworICBEQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7CisgIFVOUkVGRVJFTkNFRF9QQVJBTUVURVIoZXhjZXB0aW9uX3N0YXRlKTsKKyAgTk9UUkVBQ0hFRCgpOworfQorCitNZWRpYVJlY29yZGVyOjpNZWRpYVJlY29yZGVyKAorICAgIHNjcmlwdDo6RW52aXJvbm1lbnRTZXR0aW5ncyogc2V0dGluZ3MsCisgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxtZWRpYV9zdHJlYW06Ok1lZGlhU3RyZWFtPiYgc3RyZWFtLAorICAgIGNvbnN0IE1lZGlhUmVjb3JkZXJPcHRpb25zJiBvcHRpb25zKQorICAgIDogc2V0dGluZ3NfKHNldHRpbmdzKSwgc3RyZWFtXyhzdHJlYW0pIHsKKyAgLy8gUGVyIFczQyBzcGVjLCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGlzIGlzIHBsYXRmb3JtLXNwZWNpZmljLAorICAvLyBzbyBMaW5lYXIxNiB3YXMgY2hvc2VuLiBTcGVjIHVybDoKKyAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL21lZGlhc3RyZWFtLXJlY29yZGluZy8jZG9tLW1lZGlhcmVjb3JkZXItbWVkaWFyZWNvcmRlcgorICBtaW1lX3R5cGVfID0KKyAgICAgIG9wdGlvbnMuaGFzX21pbWVfdHlwZSgpID8gb3B0aW9ucy5taW1lX3R5cGUoKSA6IGtMaW5lYXIxNk1pbWVUeXBlOworfQorCit2b2lkIE1lZGlhUmVjb3JkZXI6OlJlYWRTdHJlYW1BbmREb0NhbGxiYWNrKCkgeworICBEQ0hFQ0soc3RyZWFtXyk7CisgIERDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKKworICBzaXplX3QgbnVtYmVyX2F1ZGlvX3RyYWNrcyA9IHN0cmVhbV8tPkdldEF1ZGlvVHJhY2tzKCkuc2l6ZSgpOworICBpZiAobnVtYmVyX2F1ZGlvX3RyYWNrcyA9PSAwKSB7CisgICAgTE9HKFdBUk5JTkcpIDw8ICJBdWRpbyBUcmFja3MgYXJlIGVtcHR5LiI7CisgICAgcmV0dXJuOworICB9CisgIExPR19JRihXQVJOSU5HLCBudW1iZXJfYXVkaW9fdHJhY2tzID4gMSkKKyAgICAgIDw8ICJPbmx5IHJlY29yZGluZyB0aGUgZmlyc3QgYXVkaW8gdHJhY2suIjsKKworICBiYXNlOjpUaW1lVGlja3MgY3VycmVudF90aW1lID0gYmFzZTo6VGltZVRpY2tzOjpOb3coKTsKKyAgYmFzZTo6VGltZURlbHRhIHRpbWVfZGlmZmVyZW5jZSA9IGxhc3RfY2FsbGJhY2tfdGltZV8gLSBjdXJyZW50X3RpbWU7CisKKyAgaW50NjQgcmVjb21tZW5kZWRfYnVmZmVyX3NpemUgPSBHZXRSZWNvbW1lbmRlZEJ1ZmZlclNpemUodGltZV9kaWZmZXJlbmNlKTsKKyAgYmFzZTo6U3RyaW5nUGllY2Ugd3JpdGVhYmxlX2J1ZmZlciA9IHJlY29yZGVkX2J1ZmZlcl8uR2V0V3JpdGVDdXJzb3IoCisgICAgICBzdGF0aWNfY2FzdDxzaXplX3Q+KHJlY29tbWVuZGVkX2J1ZmZlcl9zaXplKSk7CisKKyAgbWVkaWFfc3RyZWFtOjpNZWRpYVN0cmVhbVRyYWNrKiB0cmFjayA9CisgICAgICBzdHJlYW1fLT5HZXRBdWRpb1RyYWNrcygpLmJlZ2luKCktPmdldCgpOworCisgIGludDY0IGJ5dGVzX3JlYWQgPSB0cmFjay0+UmVhZCh3cml0ZWFibGVfYnVmZmVyKTsKKworICBpZiAoYnl0ZXNfcmVhZCA8IDApIHsKKyAgICAvLyBBbiBlcnJvciBvY2N1cmVkLCBzbyBkbyBub3QgcG9zdCBhbm90aGVyIHJlYWQuCisgICAgRG9PbkRhdGFDYWxsYmFjaygpOworICAgIHJldHVybjsKKyAgfQorCisgIERDSEVDS19MRShieXRlc19yZWFkLCBzdGF0aWNfY2FzdDxpbnQ2ND4od3JpdGVhYmxlX2J1ZmZlci5zaXplKCkpKTsKKyAgcmVjb3JkZWRfYnVmZmVyXy5JbmNyZW1lbnRDdXJzb3JQb3NpdGlvbihzdGF0aWNfY2FzdDxzaXplX3Q+KGJ5dGVzX3JlYWQpKTsKKworICBpZiAoY3VycmVudF90aW1lID49IEdldE5leHRDYWxsYmFja1RpbWUoKSkgeworICAgIERvT25EYXRhQ2FsbGJhY2soKTsKKyAgICBSZXNldExhc3RDYWxsYmFja1RpbWUoKTsKKyAgfQorCisgIC8vIE5vdGUgdGhhdCBHZXROZXh0Q2FsbGJhY2tUaW1lKCkgc2hvdWxkIG5vdCBiZSBjYWNoZWQsIHNpbmNlCisgIC8vIFJlc2V0TGFzdENhbGxiYWNrVGltZSgpIGFib3ZlIGNhbiBjaGFuZ2UgaXRzIHZhbHVlLgorICBiYXNlOjpUaW1lRGVsdGEgdGltZV91bnRpbF9leHBpcmF0aW9uID0gR2V0TmV4dENhbGxiYWNrVGltZSgpIC0gY3VycmVudF90aW1lOworCisgIC8vIENvbnNpZGVyIHRoZSBzY2VuYXJpbyB3aGVyZSB8dGltZV91bnRpbF9leHBpcmF0aW9ufCBpcyA0bXMsIGFuZAorICAvLyByZWFkX2ZyZXF1ZW5jeSBpcyAxMG1zLiAgSW4gdGhpcyBjYXNlLCBqdXN0IGRvIHRoZSByZWFkIDQgbWlsbGlzZWNvbmRzCisgIC8vIGxhdGVyLCBhbmQgdGhlbiBkbyB0aGUgY2FsbGJhY2suCisgIGJhc2U6OlRpbWVEZWx0YSBkZWxheV91bnRpbF9uZXh0X3JlYWQgPQorICAgICAgc3RkOjptaW4odGltZV91bnRpbF9leHBpcmF0aW9uLCByZWFkX2ZyZXF1ZW5jeV8pOworCisgIE1lc3NhZ2VMb29wOjpjdXJyZW50KCktPlBvc3REZWxheWVkVGFzaygKKyAgICAgIEZST01fSEVSRSwgc3RyZWFtX3JlYWRlcl9jYWxsYmFja18uY2FsbGJhY2soKSwgZGVsYXlfdW50aWxfbmV4dF9yZWFkKTsKK30KKwordm9pZCBNZWRpYVJlY29yZGVyOjpEb09uRGF0YUNhbGxiYWNrKCkgeworICBEQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7CisgIGlmIChyZWNvcmRlZF9idWZmZXJfLkdldFdyaXR0ZW5DaHVuaygpLmVtcHR5KCkpIHsKKyAgICBETE9HKFdBUk5JTkcpIDw8ICJObyBkYXRhIHdhcyByZWNvcmRlZC4iOworICAgIHJldHVybjsKKyAgfQorCisgIGJhc2U6OlN0cmluZ1BpZWNlIHdyaXR0ZW5fZGF0YSA9IHJlY29yZGVkX2J1ZmZlcl8uR2V0V3JpdHRlbkNodW5rKCk7CisgIERDSEVDS19MRSh3cml0dGVuX2RhdGEuc2l6ZSgpLCBrdWludDMybWF4KTsKKyAgdWludDMyIG51bWJlcl9vZl93cml0dGVuX2J5dGVzID0gc3RhdGljX2Nhc3Q8dWludDMyPih3cml0dGVuX2RhdGEuc2l6ZSgpKTsKKworICBhdXRvIGFycmF5X2J1ZmZlciA9IG1ha2Vfc2NvcGVkX3JlZnB0cihuZXcgZG9tOjpBcnJheUJ1ZmZlcigKKyAgICAgIHNldHRpbmdzXywgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OCo+KHdyaXR0ZW5fZGF0YS5kYXRhKCkpLAorICAgICAgbnVtYmVyX29mX3dyaXR0ZW5fYnl0ZXMpKTsKKyAgcmVjb3JkZWRfYnVmZmVyXy5SZXNldCgpOworCisgIGF1dG8gYmxvYiA9IG1ha2Vfc2NvcGVkX3JlZnB0cihuZXcgZG9tOjpCbG9iKHNldHRpbmdzXywgYXJyYXlfYnVmZmVyKSk7CisgIC8vIFRPRE86IFBvc3QgYSB0YXNrIHRvIGZpcmUgQmxvYkV2ZW50IChjb25zdHJ1Y3RlZCBvdXQgb2YgfGJsb2J8IGFuZAorICAvLyB8YXJyYXlfYnVmZmVyfCBhdCB0YXJnZXQuCit9CisKK3ZvaWQgTWVkaWFSZWNvcmRlcjo6UmVzZXRMYXN0Q2FsbGJhY2tUaW1lKCkgeworICBEQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7CisgIGxhc3RfY2FsbGJhY2tfdGltZV8gPSBiYXNlOjpUaW1lVGlja3M6Ok5vdygpOworfQorCit2b2lkIE1lZGlhUmVjb3JkZXI6OkNhbGN1bGF0ZVN0cmVhbUJpdHJhdGUoKSB7CisgIERDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKKyAgbWVkaWFfc3RyZWFtOjpNZWRpYVN0cmVhbVRyYWNrKiB0cmFjayA9CisgICAgICBzdHJlYW1fLT5HZXRBdWRpb1RyYWNrcygpLmJlZ2luKCktPmdldCgpOworICBjb25zdCBtZWRpYV9zdHJlYW06Ok1lZGlhVHJhY2tTZXR0aW5ncyYgc2V0dGluZ3MgPSB0cmFjay0+R2V0U2V0dGluZ3MoKTsKKyAgRENIRUNLX0dUKHNldHRpbmdzLnNhbXBsZV9yYXRlKCksIDApOworICBEQ0hFQ0tfR1Qoc2V0dGluZ3Muc2FtcGxlX3NpemUoKSwgMCk7CisgIERDSEVDS19HVChzZXR0aW5ncy5jaGFubmVsX2NvdW50KCksIDApOworICBiaXRyYXRlX2Jwc18gPSBzZXR0aW5ncy5zYW1wbGVfcmF0ZSgpICogc2V0dGluZ3Muc2FtcGxlX3NpemUoKSAqCisgICAgICAgICAgICAgICAgIHNldHRpbmdzLmNoYW5uZWxfY291bnQoKTsKKyAgRENIRUNLX0dUKGJpdHJhdGVfYnBzXywgMCk7Cit9CisKK2ludDY0IE1lZGlhUmVjb3JkZXI6OkdldFJlY29tbWVuZGVkQnVmZmVyU2l6ZShiYXNlOjpUaW1lRGVsdGEgdGltZV9zcGFuKSBjb25zdCB7CisgIERDSEVDS19HRSh0aW1lX3NwYW4sIGJhc2U6OlRpbWVEZWx0YTo6RnJvbVNlY29uZHMoMCkpOworICAvLyBJbmNyZWFzZSBidWZmZXIgc2xpZ2h0bHkgdG8gYWNjb3VudCBmb3IgdGhlIGZhY3QgdGhhdCBzY2hlZHVsaW5nIG91cgorICAvLyB0YXNrcyBtaWdodCBiZSBhIGxpdHRsZSBiaXQgbm9pc3kuCisgIGRvdWJsZSBidWZmZXJfd2luZG93X3NwYW5fc2Vjb25kcyA9CisgICAgICB0aW1lX3NwYW4uSW5TZWNvbmRzRigpICsga1NjaGVkdWxpbmdMYXRlbmN5QnVmZmVyU2Vjb25kczsKKyAgaW50NjQgcmVjb21tZW5kZWRfYnVmZmVyX3NpemUgPQorICAgICAgc3RhdGljX2Nhc3Q8aW50NjQ+KHN0ZDo6Y2VpbChidWZmZXJfd2luZG93X3NwYW5fc2Vjb25kcyAqIGJpdHJhdGVfYnBzXykpOworICBEQ0hFQ0tfR1QocmVjb21tZW5kZWRfYnVmZmVyX3NpemUsIDApOworICByZXR1cm4gcmVjb21tZW5kZWRfYnVmZmVyX3NpemU7Cit9CisKK2Jvb2wgTWVkaWFSZWNvcmRlcjo6SXNUeXBlU3VwcG9ydGVkKGNvbnN0IGJhc2U6OlN0cmluZ1BpZWNlIG1pbWVfdHlwZSkgeworICByZXR1cm4gbWltZV90eXBlID09IGtMaW5lYXIxNk1pbWVUeXBlOworfQorCitiYXNlOjpTdHJpbmdQaWVjZSBNZWRpYVJlY29yZGVyOjpCdWZmZXI6OkdldFdyaXRlQ3Vyc29yKAorICAgIHNpemVfdCBudW1iZXJfb2ZfYnl0ZXMpIHsKKyAgc2l6ZV90IG1pbmltaW1fcmVxdWlyZWRfc2l6ZSA9IGN1cnJlbnRfcG9zaXRpb25fICsgbnVtYmVyX29mX2J5dGVzOworICBpZiAobWluaW1pbV9yZXF1aXJlZF9zaXplID4gYnVmZmVyXy5zaXplKCkpIHsKKyAgICBidWZmZXJfLnJlc2l6ZShtaW5pbWltX3JlcXVpcmVkX3NpemUpOworICB9CisgIHJldHVybiBiYXNlOjpTdHJpbmdQaWVjZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihidWZmZXJfLmRhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJfb2ZfYnl0ZXMpOworfQorCit2b2lkIE1lZGlhUmVjb3JkZXI6OkJ1ZmZlcjo6SW5jcmVtZW50Q3Vyc29yUG9zaXRpb24oc2l6ZV90IG51bWJlcl9vZl9ieXRlcykgeworICBzaXplX3QgbmV3X3Bvc2l0aW9uID0gY3VycmVudF9wb3NpdGlvbl8gKyBudW1iZXJfb2ZfYnl0ZXM7CisgIERDSEVDS19MRShuZXdfcG9zaXRpb24sIGJ1ZmZlcl8uc2l6ZSgpKTsKKyAgY3VycmVudF9wb3NpdGlvbl8gPSBuZXdfcG9zaXRpb247Cit9CisKK2Jhc2U6OlN0cmluZ1BpZWNlIE1lZGlhUmVjb3JkZXI6OkJ1ZmZlcjo6R2V0V3JpdHRlbkNodW5rKCkgY29uc3QgeworICByZXR1cm4gYmFzZTo6U3RyaW5nUGllY2UocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oYnVmZmVyXy5kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9wb3NpdGlvbl8pOworfQorCit2b2lkIE1lZGlhUmVjb3JkZXI6OkJ1ZmZlcjo6UmVzZXQoKSB7CisgIGN1cnJlbnRfcG9zaXRpb25fID0gMDsKKyAgYnVmZmVyXy5yZXNpemUoMCk7Cit9CisKK3ZvaWQgTWVkaWFSZWNvcmRlcjo6QnVmZmVyOjpIaW50VHlwaWNhbFNpemUoc2l6ZV90IG51bWJlcl9vZl9ieXRlcykgeworICAvLyBDYXAgdGhlIGhpbnQgc2l6ZSB0byBiZSAxIE1lZ2FieXRlLgorICBjb25zdCBzaXplX3Qga01heEJ1ZmZlclNpemVIaW50SW5CeXRlcyA9IDEwMjQgKiAxMDI0OworICBidWZmZXJfLnJlc2VydmUoc3RkOjptaW4obnVtYmVyX29mX2J5dGVzLCBrTWF4QnVmZmVyU2l6ZUhpbnRJbkJ5dGVzKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBtZWRpYV9jYXB0dXJlCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhX2NhcHR1cmUvbWVkaWFfcmVjb3JkZXIuaCBiL3NyYy9jb2JhbHQvbWVkaWFfY2FwdHVyZS9tZWRpYV9yZWNvcmRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYmFhNzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L21lZGlhX2NhcHR1cmUvbWVkaWFfcmVjb3JkZXIuaApAQCAtMCwwICsxLDEzNSBAQAorLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBDT0JBTFRfTUVESUFfQ0FQVFVSRV9NRURJQV9SRUNPUkRFUl9IXworI2RlZmluZSBDT0JBTFRfTUVESUFfQ0FQVFVSRV9NRURJQV9SRUNPUkRFUl9IXworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImJhc2UvYmFzaWN0eXBlcy5oIgorI2luY2x1ZGUgImJhc2UvY2FuY2VsYWJsZV9jYWxsYmFjay5oIgorI2luY2x1ZGUgImJhc2Uvb3B0aW9uYWwuaCIKKyNpbmNsdWRlICJiYXNlL3N0cmluZ19waWVjZS5oIgorI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCisjaW5jbHVkZSAiYmFzZS90aW1lLmgiCisjaW5jbHVkZSAiY29iYWx0L2RvbS9ldmVudF90YXJnZXQuaCIKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWFfY2FwdHVyZS9tZWRpYV9yZWNvcmRlcl9vcHRpb25zLmgiCisjaW5jbHVkZSAiY29iYWx0L21lZGlhX2NhcHR1cmUvcmVjb3JkaW5nX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L21lZGlhX3N0cmVhbS9tZWRpYV9zdHJlYW0uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2Vudmlyb25tZW50X3NldHRpbmdzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgbWVkaWFfY2FwdHVyZSB7CisKKy8vIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIE1lZGlhUmVjb3JkZXIsIGFuZCBpbXBsZW1lbnRzIHRoZSBzcGVjaWZpY2F0aW9uIGF0OgorLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL21lZGlhc3RyZWFtLXJlY29yZGluZy8jbWVkaWFyZWNvcmRlci1hcGkKK2NsYXNzIE1lZGlhUmVjb3JkZXIgOiBwdWJsaWMgZG9tOjpFdmVudFRhcmdldCB7CisgcHVibGljOgorICAvLyBDb25zdHJ1Y3RvcnMuCisgIGV4cGxpY2l0IE1lZGlhUmVjb3JkZXIoCisgICAgICBzY3JpcHQ6OkVudmlyb25tZW50U2V0dGluZ3MqIHNldHRpbmdzLAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxtZWRpYV9zdHJlYW06Ok1lZGlhU3RyZWFtPiYgc3RyZWFtLAorICAgICAgY29uc3QgTWVkaWFSZWNvcmRlck9wdGlvbnMmIG9wdGlvbnMgPSBNZWRpYVJlY29yZGVyT3B0aW9ucygpKTsKKworICAvLyBSZWFkb25seSBhdHRyaWJ1dGVzLgorICBjb25zdCBzdGQ6OnN0cmluZyYgbWltZV90eXBlKCkgY29uc3QgeyByZXR1cm4gbWltZV90eXBlXzsgfQorCisgIC8vIEZ1bmN0aW9ucworICBzdGF0aWMgYm9vbCBJc1R5cGVTdXBwb3J0ZWQoY29uc3QgYmFzZTo6U3RyaW5nUGllY2UgbWltZV90eXBlKTsKKworICB2b2lkIFN0YXJ0KGludDMyIHRpbWVzbGljZSwgc2NyaXB0OjpFeGNlcHRpb25TdGF0ZSogZXhjZXB0aW9uX3N0YXRlKTsKKworICB2b2lkIFN0YXJ0KHNjcmlwdDo6RXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSkgeworICAgIFN0YXJ0KGtpbnQzMm1heCwgZXhjZXB0aW9uX3N0YXRlKTsKKyAgfQorCisgIHZvaWQgU3RvcChzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlKiBleGNlcHRpb25fc3RhdGUpOworCisgIC8vIEV2ZW50SGFuZGxlcnMuCisgIGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZSogb25lcnJvcigpIGNvbnN0IHsKKyAgICBEQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7CisgICAgcmV0dXJuIEdldEF0dHJpYnV0ZUV2ZW50TGlzdGVuZXIoYmFzZTo6VG9rZW5zOjplcnJvcigpKTsKKyAgfQorCisgIHZvaWQgc2V0X29uZXJyb3IoY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlJiBldmVudF9saXN0ZW5lcikgeworICAgIERDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKKyAgICBTZXRBdHRyaWJ1dGVFdmVudExpc3RlbmVyKGJhc2U6OlRva2Vuczo6ZXJyb3IoKSwgZXZlbnRfbGlzdGVuZXIpOworICB9CisKKyAgY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlKiBvbmRhdGFhdmFpbGFibGUoKSBjb25zdCB7CisgICAgRENIRUNLKHRocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOworICAgIHJldHVybiBHZXRBdHRyaWJ1dGVFdmVudExpc3RlbmVyKGJhc2U6OlRva2Vuczo6ZGF0YWF2YWlsYWJsZSgpKTsKKyAgfQorCisgIHZvaWQgc2V0X29uZGF0YWF2YWlsYWJsZShjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0VmFsdWUmIGV2ZW50X2xpc3RlbmVyKSB7CisgICAgRENIRUNLKHRocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOworICAgIFNldEF0dHJpYnV0ZUV2ZW50TGlzdGVuZXIoYmFzZTo6VG9rZW5zOjpkYXRhYXZhaWxhYmxlKCksIGV2ZW50X2xpc3RlbmVyKTsKKyAgfQorCisgIERFRklORV9XUkFQUEFCTEVfVFlQRShNZWRpYVJlY29yZGVyKTsKKworIHByaXZhdGU6CisgIE1lZGlhUmVjb3JkZXIoY29uc3QgTWVkaWFSZWNvcmRlciYpID0gZGVsZXRlOworICBNZWRpYVJlY29yZGVyJiBvcGVyYXRvcj0oY29uc3QgTWVkaWFSZWNvcmRlciYpID0gZGVsZXRlOworCisgIGNsYXNzIEJ1ZmZlciB7CisgICBwdWJsaWM6CisgICAgYmFzZTo6U3RyaW5nUGllY2UgR2V0V3JpdGVDdXJzb3Ioc2l6ZV90IG51bWJlcl9vZl9ieXRlcyk7CisgICAgdm9pZCBJbmNyZW1lbnRDdXJzb3JQb3NpdGlvbihzaXplX3QgbnVtYmVyX29mX2J5dGVzKTsKKyAgICBiYXNlOjpTdHJpbmdQaWVjZSBHZXRXcml0dGVuQ2h1bmsoKSBjb25zdDsKKyAgICB2b2lkIFJlc2V0KCk7CisgICAgdm9pZCBIaW50VHlwaWNhbFNpemUoc2l6ZV90IG51bWJlcl9vZl9ieXRlcyk7CisKKyAgIHByaXZhdGU6CisgICAgc2l6ZV90IGN1cnJlbnRfcG9zaXRpb25fID0gMDsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OD4gYnVmZmVyXzsKKyAgfTsKKworICB2b2lkIFJlYWRTdHJlYW1BbmREb0NhbGxiYWNrKCk7CisgIHZvaWQgRG9PbkRhdGFDYWxsYmFjaygpOworICB2b2lkIFNjaGVkdWxlT25EYXRhQXZhaWxhYmxlQ2FsbGJhY2soKTsKKyAgdm9pZCBSZXNldExhc3RDYWxsYmFja1RpbWUoKTsKKyAgdm9pZCBDYWxjdWxhdGVTdHJlYW1CaXRyYXRlKCk7CisgIGludDY0IEdldFJlY29tbWVuZGVkQnVmZmVyU2l6ZShiYXNlOjpUaW1lRGVsdGEgdGltZV9zcGFuKSBjb25zdDsKKyAgYmFzZTo6VGltZVRpY2tzIEdldE5leHRDYWxsYmFja1RpbWUoKSBjb25zdCB7CisgICAgcmV0dXJuIGxhc3RfY2FsbGJhY2tfdGltZV8gKyBjYWxsYmFja19mcmVxdWVuY3lfOworICB9CisKKyAgYmFzZTo6VGhyZWFkQ2hlY2tlciB0aHJlYWRfY2hlY2tlcl87CisKKyAgUmVjb3JkaW5nU3RhdGUgcmVjb3JkaW5nX3N0YXRlXyA9IGtSZWNvcmRpbmdTdGF0ZUluYWN0aXZlOworCisgIHNjcmlwdDo6RW52aXJvbm1lbnRTZXR0aW5ncyogc2V0dGluZ3NfOworICBzdGQ6OnN0cmluZyBtaW1lX3R5cGVfOworICBzY29wZWRfcmVmcHRyPG1lZGlhX3N0cmVhbTo6TWVkaWFTdHJlYW0+IHN0cmVhbV87CisKKyAgYmFzZTo6VGltZVRpY2tzIGxhc3RfY2FsbGJhY2tfdGltZV87CisgIC8vIEZyZXF1ZW5jeSB3ZSB3aWxsIGNhbGxiYWNrIHRvIEphdmFzY3JpcHQuCisgIGJhc2U6OlRpbWVEZWx0YSBjYWxsYmFja19mcmVxdWVuY3lfOworCisgIC8vIEZyZXF1ZW5jeSB3ZSB3aWxsIHJlYWQgdGhlIHN0cmVhbS4KKyAgYmFzZTo6VGltZURlbHRhIHJlYWRfZnJlcXVlbmN5XzsKKworICBpbnQ2NCBiaXRyYXRlX2Jwc187CisgIEJ1ZmZlciByZWNvcmRlZF9idWZmZXJfOworCisgIGJhc2U6OkNhbmNlbGFibGVDbG9zdXJlIHN0cmVhbV9yZWFkZXJfY2FsbGJhY2tfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIG1lZGlhX2NhcHR1cmUKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBDT0JBTFRfTUVESUFfQ0FQVFVSRV9NRURJQV9SRUNPUkRFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYV9jYXB0dXJlL21lZGlhX3JlY29yZGVyLmlkbCBiL3NyYy9jb2JhbHQvbWVkaWFfY2FwdHVyZS9tZWRpYV9yZWNvcmRlci5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDViNTEzZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvbWVkaWFfY2FwdHVyZS9tZWRpYV9yZWNvcmRlci5pZGwKQEAgLTAsMCArMSwyOSBAQAorLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gSW1wbGVtZW50cyBhIHN1YnNldCBvZiB0aGUgc3BlY2lmaWNhdGlvbiBhdDoKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9tZWRpYXN0cmVhbS1yZWNvcmRpbmcvI21lZGlhcmVjb3JkZXItYXBpCitbQ29uc3RydWN0b3IoTWVkaWFTdHJlYW0gc3RyZWFtLCBvcHRpb25hbCBNZWRpYVJlY29yZGVyT3B0aW9ucyBvcHRpb25zKSwKKyBDb25zdHJ1Y3RvckNhbGxXaXRoID0gRW52aXJvbm1lbnRTZXR0aW5nc10KK2ludGVyZmFjZSBNZWRpYVJlY29yZGVyIDogRXZlbnRUYXJnZXQgeworICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIG1pbWVUeXBlOworICBhdHRyaWJ1dGUgRXZlbnRIYW5kbGVyIG9uZGF0YWF2YWlsYWJsZTsKKyAgYXR0cmlidXRlIEV2ZW50SGFuZGxlciBvbmVycm9yOworCisgIFtSYWlzZXNFeGNlcHRpb25dIHZvaWQgc3RhcnQob3B0aW9uYWwgbG9uZyB0aW1lc2xpY2UpOworICBbUmFpc2VzRXhjZXB0aW9uXSB2b2lkIHN0b3AoKTsKKworICBzdGF0aWMgYm9vbGVhbiBpc1R5cGVTdXBwb3J0ZWQoRE9NU3RyaW5nIHR5cGUpOworfTsKKwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYV9jYXB0dXJlL21lZGlhX3JlY29yZGVyX29wdGlvbnMuaWRsIGIvc3JjL2NvYmFsdC9tZWRpYV9jYXB0dXJlL21lZGlhX3JlY29yZGVyX29wdGlvbnMuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYTlhYTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L21lZGlhX2NhcHR1cmUvbWVkaWFfcmVjb3JkZXJfb3B0aW9ucy5pZGwKQEAgLTAsMCArMSwxOSBAQAorLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL21lZGlhc3RyZWFtLXJlY29yZGluZy8jZGljdGRlZi1tZWRpYXJlY29yZGVyb3B0aW9ucworZGljdGlvbmFyeSBNZWRpYVJlY29yZGVyT3B0aW9ucyB7CisgIERPTVN0cmluZyBtaW1lVHlwZTsKK307CisKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWFfY2FwdHVyZS9yZWNvcmRpbmdfc3RhdGUuaWRsIGIvc3JjL2NvYmFsdC9tZWRpYV9jYXB0dXJlL3JlY29yZGluZ19zdGF0ZS5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y5YTk1NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvbWVkaWFfY2FwdHVyZS9yZWNvcmRpbmdfc3RhdGUuaWRsCkBAIC0wLDAgKzEsMjMgQEAKKy8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIEltcGxlbWVudHMgYSBzdWJzZXQgb2YgdGhlIHNwZWNpZmljYXRpb24gYXQ6CisvLyBodHRwczovL3d3dy53My5vcmcvVFIvbWVkaWFzdHJlYW0tcmVjb3JkaW5nLyNtZWRpYXJlY29yZGVyLWFwaQorCitlbnVtIFJlY29yZGluZ1N0YXRlIHsKKyAgImluYWN0aXZlIiwKKyAgInJlY29yZGluZyIsCisgICJwYXVzZWQiCit9OworCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhX3Nlc3Npb24vbWVkaWFfc2Vzc2lvbi5oIGIvc3JjL2NvYmFsdC9tZWRpYV9zZXNzaW9uL21lZGlhX3Nlc3Npb24uaAppbmRleCBlYzc0Y2VmLi45YzgzOGExIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhX3Nlc3Npb24vbWVkaWFfc2Vzc2lvbi5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWFfc2Vzc2lvbi9tZWRpYV9zZXNzaW9uLmgKQEAgLTI0LDkgKzI0LDExIEBACiAjaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCiAjaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3BfcHJveHkuaCIKICNpbmNsdWRlICJjb2JhbHQvbWVkaWFfc2Vzc2lvbi9tZWRpYV9zZXNzaW9uX2FjdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYV9zZXNzaW9uL21lZGlhX3Nlc3Npb25fYWN0aW9uX2RldGFpbHMuaCIKICNpbmNsdWRlICJjb2JhbHQvbWVkaWFfc2Vzc2lvbi9tZWRpYV9zZXNzaW9uX3BsYXliYWNrX3N0YXRlLmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9jYWxsYmFja19mdW5jdGlvbi5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKIAogbmFtZXNwYWNlIGNvYmFsdCB7CiBuYW1lc3BhY2UgbWVkaWFfc2Vzc2lvbiB7CkBAIC0zNyw3ICszOSw5IEBACiAgIGZyaWVuZCBjbGFzcyBNZWRpYVNlc3Npb25DbGllbnQ7CiAKICBwdWJsaWM6Ci0gIHR5cGVkZWYgc2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uPHZvaWQoKT4gTWVkaWFTZXNzaW9uQWN0aW9uSGFuZGxlcjsKKyAgdHlwZWRlZiBzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb248dm9pZCgKKyAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8TWVkaWFTZXNzaW9uQWN0aW9uRGV0YWlscz4mIGFjdGlvbl9kZXRhaWxzKT4KKyAgICAgICAgICBNZWRpYVNlc3Npb25BY3Rpb25IYW5kbGVyOwogICB0eXBlZGVmIHNjcmlwdDo6U2NyaXB0VmFsdWU8TWVkaWFTZXNzaW9uQWN0aW9uSGFuZGxlcj4KICAgICAgIE1lZGlhU2Vzc2lvbkFjdGlvbkhhbmRsZXJIb2xkZXI7CiAgIHR5cGVkZWYgc2NyaXB0OjpTY3JpcHRWYWx1ZTxNZWRpYVNlc3Npb25BY3Rpb25IYW5kbGVyPjo6UmVmZXJlbmNlCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhX3Nlc3Npb24vbWVkaWFfc2Vzc2lvbi5pZGwgYi9zcmMvY29iYWx0L21lZGlhX3Nlc3Npb24vbWVkaWFfc2Vzc2lvbi5pZGwKaW5kZXggZmZiMDZlMi4uNWQ4ZDFkNyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYV9zZXNzaW9uL21lZGlhX3Nlc3Npb24uaWRsCisrKyBiL3NyYy9jb2JhbHQvbWVkaWFfc2Vzc2lvbi9tZWRpYV9zZXNzaW9uLmlkbApAQCAtMTUsNyArMTUsOCBAQAogLy8gTWVkaWFTZXNzaW9uIGludGVyZmFjZQogLy8gaHR0cHM6Ly93aWNnLmdpdGh1Yi5pby9tZWRpYXNlc3Npb24KIAotY2FsbGJhY2sgTWVkaWFTZXNzaW9uQWN0aW9uSGFuZGxlciA9IHZvaWQoKTsKKy8vIENvYmFsdCBjdXN0b21pemF0aW9uIC0gZGV0YWlscyBwYXJhbWV0ZXIgaXMgbm90IHBhcnQgb2Ygc3BlYy4KK2NhbGxiYWNrIE1lZGlhU2Vzc2lvbkFjdGlvbkhhbmRsZXIgPSB2b2lkKE1lZGlhU2Vzc2lvbkFjdGlvbkRldGFpbHMgZGV0YWlscyk7CiAKIGludGVyZmFjZSBNZWRpYVNlc3Npb24gewogICBhdHRyaWJ1dGUgTWVkaWFNZXRhZGF0YT8gbWV0YWRhdGE7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhX3Nlc3Npb24vbWVkaWFfc2Vzc2lvbl9hY3Rpb24uaWRsIGIvc3JjL2NvYmFsdC9tZWRpYV9zZXNzaW9uL21lZGlhX3Nlc3Npb25fYWN0aW9uLmlkbAppbmRleCBjNTdhMDFiLi4yNGRkNjkxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhX3Nlc3Npb24vbWVkaWFfc2Vzc2lvbl9hY3Rpb24uaWRsCisrKyBiL3NyYy9jb2JhbHQvbWVkaWFfc2Vzc2lvbi9tZWRpYV9zZXNzaW9uX2FjdGlvbi5pZGwKQEAgLTE4LDYgKzE4LDcgQEAKIGVudW0gTWVkaWFTZXNzaW9uQWN0aW9uIHsKICAgInBsYXkiLAogICAicGF1c2UiLAorICAic2VlayIsICAvLyBDb2JhbHQgY3VzdG9taXphdGlvbi4KICAgInNlZWtiYWNrd2FyZCIsCiAgICJzZWVrZm9yd2FyZCIsCiAgICJwcmV2aW91c3RyYWNrIiwKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWFfc2Vzc2lvbi9tZWRpYV9zZXNzaW9uX2FjdGlvbl9kZXRhaWxzLmggYi9zcmMvY29iYWx0L21lZGlhX3Nlc3Npb24vbWVkaWFfc2Vzc2lvbl9hY3Rpb25fZGV0YWlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjOTEwZWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L21lZGlhX3Nlc3Npb24vbWVkaWFfc2Vzc2lvbl9hY3Rpb25fZGV0YWlscy5oCkBAIC0wLDAgKzEsNzEgQEAKKy8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgQ09CQUxUX01FRElBX1NFU1NJT05fTUVESUFfU0VTU0lPTl9BQ1RJT05fREVUQUlMU19IXworI2RlZmluZSBDT0JBTFRfTUVESUFfU0VTU0lPTl9NRURJQV9TRVNTSU9OX0FDVElPTl9ERVRBSUxTX0hfCisKKyNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWFfc2Vzc2lvbi9tZWRpYV9zZXNzaW9uX2FjdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIG1lZGlhX3Nlc3Npb24geworCitjbGFzcyBNZWRpYVNlc3Npb25BY3Rpb25EZXRhaWxzIDogcHVibGljIHNjcmlwdDo6V3JhcHBhYmxlIHsKKyBwdWJsaWM6CisgIC8vIE5vbi1XcmFwcGFibGUgY2xhc3MgaG9sZGluZyB0aGUgZGF0YSBuZWVkZWQgZm9yIHNlbGVjdGVkIGFjdGlvbnMuIFRoaXMgY2FuCisgIC8vIGJlIGNvbnN0cnVjdGVkIG9uIGFueSB0aHJlYWQsIGFuZCB0aGVuIGl0J3MgdXNlZCBpbnRlcm5hbGx5IHRvIGNvbnN0cnVjdAorICAvLyBNZWRpYVNlc3Npb25BY3Rpb25EZXRhaWxzIG9uIHRoZSB3ZWIgbW9kdWxlIHRocmVhZC4KKyAgY2xhc3MgRGF0YSB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQgRGF0YShNZWRpYVNlc3Npb25BY3Rpb24gYWN0aW9uLCBkb3VibGUgc2VlayA9IDAuMCkKKyAgICAgICAgOiBhY3Rpb25fKGFjdGlvbiksCisgICAgICAgICAgc2Vla190aW1lXyhhY3Rpb24gPT0ga01lZGlhU2Vzc2lvbkFjdGlvblNlZWsgPyBzZWVrIDogMC4wKSwKKyAgICAgICAgICBzZWVrX29mZnNldF8oCisgICAgICAgICAgICAgIChhY3Rpb24gPT0ga01lZGlhU2Vzc2lvbkFjdGlvblNlZWtmb3J3YXJkCisgICAgICAgICAgICAgICAgICB8fCBhY3Rpb24gPT0ga01lZGlhU2Vzc2lvbkFjdGlvblNlZWtiYWNrd2FyZCkgPyBzZWVrIDogMC4wKSB7CisgICAgICBEQ0hFQ0soc2VlayA+PSAwLjApOworICAgICAgRENIRUNLKHNlZWsgPT0gMC4wCisgICAgICAgICAgICAgfHwgYWN0aW9uID09IGtNZWRpYVNlc3Npb25BY3Rpb25TZWVrCisgICAgICAgICAgICAgfHwgYWN0aW9uID09IGtNZWRpYVNlc3Npb25BY3Rpb25TZWVrZm9yd2FyZAorICAgICAgICAgICAgIHx8IGFjdGlvbiA9PSBrTWVkaWFTZXNzaW9uQWN0aW9uU2Vla2JhY2t3YXJkKTsKKyAgICB9CisgICAgRGF0YShjb25zdCBEYXRhJikgPSBkZWZhdWx0OworCisgICAgTWVkaWFTZXNzaW9uQWN0aW9uIGFjdGlvbigpIGNvbnN0IHsgcmV0dXJuIGFjdGlvbl87IH0KKworICAgcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgTWVkaWFTZXNzaW9uQWN0aW9uRGV0YWlsczsKKworICAgIE1lZGlhU2Vzc2lvbkFjdGlvbiBhY3Rpb25fOworICAgIGRvdWJsZSBzZWVrX3RpbWVfOworICAgIGRvdWJsZSBzZWVrX29mZnNldF87CisgIH07CisKKyAgZXhwbGljaXQgTWVkaWFTZXNzaW9uQWN0aW9uRGV0YWlscyhjb25zdCBEYXRhJiBkYXRhKSA6IGRhdGFfKGRhdGEpIHt9CisKKyAgTWVkaWFTZXNzaW9uQWN0aW9uIGFjdGlvbigpIGNvbnN0IHsgcmV0dXJuIGRhdGFfLmFjdGlvbl87IH0KKyAgZG91YmxlIHNlZWtfdGltZSgpIGNvbnN0IHsgcmV0dXJuIGRhdGFfLnNlZWtfdGltZV87IH0KKyAgZG91YmxlIHNlZWtfb2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gZGF0YV8uc2Vla19vZmZzZXRfOyB9CisKKyAgREVGSU5FX1dSQVBQQUJMRV9UWVBFKE1lZGlhU2Vzc2lvbkFjdGlvbkRldGFpbHMpOworCisgcHJpdmF0ZToKKyAgRGF0YSBkYXRhXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBtZWRpYV9zZXNzaW9uCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gQ09CQUxUX01FRElBX1NFU1NJT05fTUVESUFfU0VTU0lPTl9BQ1RJT05fREVUQUlMU19IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYV9zZXNzaW9uL21lZGlhX3Nlc3Npb25fYWN0aW9uX2RldGFpbHMuaWRsIGIvc3JjL2NvYmFsdC9tZWRpYV9zZXNzaW9uL21lZGlhX3Nlc3Npb25fYWN0aW9uX2RldGFpbHMuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NDZkZjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L21lZGlhX3Nlc3Npb24vbWVkaWFfc2Vzc2lvbl9hY3Rpb25fZGV0YWlscy5pZGwKQEAgLTAsMCArMSwyNyBAQAorLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gTWVkaWFTZXNzaW9uIGludGVyZmFjZSAoQ29iYWx0IGN1c3RvbWl6YXRpb24pCisvLyBodHRwczovL3dpY2cuZ2l0aHViLmlvL21lZGlhc2Vzc2lvbgorCitpbnRlcmZhY2UgTWVkaWFTZXNzaW9uQWN0aW9uRGV0YWlscyB7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBNZWRpYVNlc3Npb25BY3Rpb24gYWN0aW9uOworCisgIC8vIFRpbWUgaW4gc2Vjb25kcyByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtZWRpYSBmb3IgInNlZWsiIGFjdGlvbi4KKyAgcmVhZG9ubHkgYXR0cmlidXRlIGRvdWJsZSBzZWVrVGltZTsKKworICAvLyBUaW1lIGluIHNlY29uZHMgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgbWVkaWEgdGltZSBmb3IgInNlZWtmb3J3YXJkIiBhbmQKKyAgLy8gInNlZWtiYWNrd2FyZCIgYWN0aW9ucy4KKyAgcmVhZG9ubHkgYXR0cmlidXRlIGRvdWJsZSBzZWVrT2Zmc2V0OworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWFfc2Vzc2lvbi9tZWRpYV9zZXNzaW9uX2NsaWVudC5jYyBiL3NyYy9jb2JhbHQvbWVkaWFfc2Vzc2lvbi9tZWRpYV9zZXNzaW9uX2NsaWVudC5jYwppbmRleCA2Y2Y3NjljLi5kMTQxNjExIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhX3Nlc3Npb24vbWVkaWFfc2Vzc2lvbl9jbGllbnQuY2MKKysrIGIvc3JjL2NvYmFsdC9tZWRpYV9zZXNzaW9uL21lZGlhX3Nlc3Npb25fY2xpZW50LmNjCkBAIC05OCwyMiArOTgsMjMgQEAKICAgfQogfQogCi12b2lkIE1lZGlhU2Vzc2lvbkNsaWVudDo6SW52b2tlQWN0aW9uKE1lZGlhU2Vzc2lvbkFjdGlvbiBhY3Rpb24pIHsKK3ZvaWQgTWVkaWFTZXNzaW9uQ2xpZW50OjpJbnZva2VBY3Rpb25JbnRlcm5hbCgKKyAgICBzY29wZWRfcHRyPE1lZGlhU2Vzc2lvbkFjdGlvbkRldGFpbHM6OkRhdGE+IGRhdGEpIHsKICAgaWYgKGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk6OmN1cnJlbnQoKSAhPSBtZWRpYV9zZXNzaW9uXy0+bWVzc2FnZV9sb29wXykgewogICAgIG1lZGlhX3Nlc3Npb25fLT5tZXNzYWdlX2xvb3BfLT5Qb3N0VGFzaygKLSAgICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZNZWRpYVNlc3Npb25DbGllbnQ6Okludm9rZUFjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcyksIGFjdGlvbikpOworICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJk1lZGlhU2Vzc2lvbkNsaWVudDo6SW52b2tlQWN0aW9uSW50ZXJuYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpLCBiYXNlOjpQYXNzZWQoJmRhdGEpKSk7CiAgICAgcmV0dXJuOwogICB9CiAKICAgTWVkaWFTZXNzaW9uOjpBY3Rpb25NYXA6Oml0ZXJhdG9yIGl0ID0KLSAgICAgIG1lZGlhX3Nlc3Npb25fLT5hY3Rpb25fbWFwXy5maW5kKGFjdGlvbik7CisgICAgICBtZWRpYV9zZXNzaW9uXy0+YWN0aW9uX21hcF8uZmluZChkYXRhLT5hY3Rpb24oKSk7CiAKICAgaWYgKGl0ID09IG1lZGlhX3Nlc3Npb25fLT5hY3Rpb25fbWFwXy5lbmQoKSkgewogICAgIHJldHVybjsKICAgfQogCi0gIGl0LT5zZWNvbmQtPnZhbHVlKCkuUnVuKCk7CisgIGl0LT5zZWNvbmQtPnZhbHVlKCkuUnVuKG5ldyBNZWRpYVNlc3Npb25BY3Rpb25EZXRhaWxzKCpkYXRhKSk7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBtZWRpYV9zZXNzaW9uCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhX3Nlc3Npb24vbWVkaWFfc2Vzc2lvbl9jbGllbnQuaCBiL3NyYy9jb2JhbHQvbWVkaWFfc2Vzc2lvbi9tZWRpYV9zZXNzaW9uX2NsaWVudC5oCmluZGV4IGQ4Mzg3ODUuLjE3NjNkNmMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWFfc2Vzc2lvbi9tZWRpYV9zZXNzaW9uX2NsaWVudC5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWFfc2Vzc2lvbi9tZWRpYV9zZXNzaW9uX2NsaWVudC5oCkBAIC0xNyw5ICsxNywxMSBAQAogCiAjaW5jbHVkZSA8Yml0c2V0PgogCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgogI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCiAKICNpbmNsdWRlICJjb2JhbHQvbWVkaWFfc2Vzc2lvbi9tZWRpYV9zZXNzaW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L21lZGlhX3Nlc3Npb24vbWVkaWFfc2Vzc2lvbl9hY3Rpb25fZGV0YWlscy5oIgogCiBuYW1lc3BhY2UgY29iYWx0IHsKIG5hbWVzcGFjZSBtZWRpYV9zZXNzaW9uIHsKQEAgLTYwLDcgKzYyLDE1IEBACiAgIC8vIEludm9rZXMgYSBnaXZlbiBtZWRpYSBzZXNzaW9uIGFjdGlvbgogICAvLyBodHRwczovL3dpY2cuZ2l0aHViLmlvL21lZGlhc2Vzc2lvbi8jYWN0aW9ucy1tb2RlbAogICAvLyBDYW4gYmUgaW52b2tlZCBmcm9tIGFueSB0aHJlYWQuCi0gIHZvaWQgSW52b2tlQWN0aW9uKE1lZGlhU2Vzc2lvbkFjdGlvbiBhY3Rpb24pOworICB2b2lkIEludm9rZUFjdGlvbihNZWRpYVNlc3Npb25BY3Rpb24gYWN0aW9uKSB7CisgICAgSW52b2tlQWN0aW9uSW50ZXJuYWwoc2NvcGVkX3B0cjxNZWRpYVNlc3Npb25BY3Rpb25EZXRhaWxzOjpEYXRhPigKKyAgICAgICAgbmV3IE1lZGlhU2Vzc2lvbkFjdGlvbkRldGFpbHM6OkRhdGEoYWN0aW9uKSkpOworICB9CisKKyAgLy8gSW52b2tlcyBhIGdpdmVuIG1lZGlhIHNlc3Npb24gYWN0aW9uIHRoYXQgdGFrZXMgYWRkaXRpb25hbCBkYXRhLgorICB2b2lkIEludm9rZUFjdGlvbihzY29wZWRfcHRyPE1lZGlhU2Vzc2lvbkFjdGlvbkRldGFpbHM6OkRhdGE+IGRhdGEpIHsKKyAgICBJbnZva2VBY3Rpb25JbnRlcm5hbChkYXRhLlBhc3MoKSk7CisgIH0KIAogICAvLyBJbnZva2VkIG9uIHRoZSBicm93c2VyIHRocmVhZCB3aGVuIGFueSBtZXRhZGF0YSwgcGxheWJhY2sgc3RhdGUsCiAgIC8vIG9yIHN1cHBvcnRlZCBzZXNzaW9uIGFjdGlvbnMgY2hhbmdlLgpAQCAtNzEsNiArODEsOCBAQAogICBzY29wZWRfcmVmcHRyPE1lZGlhU2Vzc2lvbj4gbWVkaWFfc2Vzc2lvbl87CiAgIE1lZGlhU2Vzc2lvblBsYXliYWNrU3RhdGUgcGxhdGZvcm1fcGxheWJhY2tfc3RhdGVfOwogCisgIHZvaWQgSW52b2tlQWN0aW9uSW50ZXJuYWwoc2NvcGVkX3B0cjxNZWRpYVNlc3Npb25BY3Rpb25EZXRhaWxzOjpEYXRhPiBkYXRhKTsKKwogICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oTWVkaWFTZXNzaW9uQ2xpZW50KTsKIH07CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWFfc2Vzc2lvbi9tZWRpYV9zZXNzaW9uX3Rlc3QuY2MgYi9zcmMvY29iYWx0L21lZGlhX3Nlc3Npb24vbWVkaWFfc2Vzc2lvbl90ZXN0LmNjCmluZGV4IDM0NWRiZDkuLjZjOWY3YmYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWFfc2Vzc2lvbi9tZWRpYV9zZXNzaW9uX3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9tZWRpYV9zZXNzaW9uL21lZGlhX3Nlc3Npb25fdGVzdC5jYwpAQCAtNDQsNyArNDQsOCBAQAogCiBjbGFzcyBNb2NrQ2FsbGJhY2tGdW5jdGlvbiA6IHB1YmxpYyBNZWRpYVNlc3Npb246Ok1lZGlhU2Vzc2lvbkFjdGlvbkhhbmRsZXIgewogIHB1YmxpYzoKLSAgTU9DS19DT05TVF9NRVRIT0QwKFJ1biwgUmV0dXJuVmFsdWUoKSk7CisgIE1PQ0tfQ09OU1RfTUVUSE9EMShSdW4sIFJldHVyblZhbHVlKAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxNZWRpYVNlc3Npb25BY3Rpb25EZXRhaWxzPiYgYWN0aW9uX2RldGFpbHMpKTsKIH07CiAKIGNsYXNzIE1vY2tNZWRpYVNlc3Npb25DbGllbnQgOiBwdWJsaWMgTWVkaWFTZXNzaW9uQ2xpZW50IHsKQEAgLTUyLDYgKzUzLDE2IEBACiAgIE1PQ0tfTUVUSE9EMChPbk1lZGlhU2Vzc2lvbkNoYW5nZWQsIHZvaWQoKSk7CiB9OwogCitNQVRDSEVSX1AoU2Vla1RpbWUsIHRpbWUsICIiKSB7CisgIHJldHVybiBhcmctPmFjdGlvbigpID09ICBrTWVkaWFTZXNzaW9uQWN0aW9uU2VlaworICAgICAgJiYgYXJnLT5zZWVrX3RpbWUoKSA9PSB0aW1lOworfQorCitNQVRDSEVSX1AyKFNlZWtPZmZzZXQsIGFjdGlvbiwgb2Zmc2V0LCAiIikgeworICByZXR1cm4gYXJnLT5hY3Rpb24oKSA9PSAgYWN0aW9uCisgICAgICAmJiBhcmctPnNlZWtfb2Zmc2V0KCkgPT0gb2Zmc2V0OworfQorCiBURVNUKE1lZGlhU2Vzc2lvblRlc3QsIE1lZGlhU2Vzc2lvblRlc3QpIHsKICAgTWVzc2FnZUxvb3AgbWVzc2FnZV9sb29wKE1lc3NhZ2VMb29wOjpUWVBFX0RFRkFVTFQpOwogICBiYXNlOjpSdW5Mb29wIHJ1bl9sb29wOwpAQCAtMTMwLDcgKzE0MSw3IEBACiAgIEVYUEVDVF9FUSgwLCBjbGllbnQuR2V0QXZhaWxhYmxlQWN0aW9ucygpLnRvX3Vsb25nKCkpOwogCiAgIE1vY2tDYWxsYmFja0Z1bmN0aW9uIGNmOwotICBFWFBFQ1RfQ0FMTChjZiwgUnVuKCkpCisgIEVYUEVDVF9DQUxMKGNmLCBSdW4oXykpCiAgICAgICAuVGltZXMoMSkKICAgICAgIC5XaWxsUmVwZWF0ZWRseShSZXR1cm4oQ2FsbGJhY2tSZXN1bHQ8dm9pZD4oKSkpOwogICBGYWtlU2NyaXB0VmFsdWU8TWVkaWFTZXNzaW9uOjpNZWRpYVNlc3Npb25BY3Rpb25IYW5kbGVyPiBob2xkZXIoJmNmKTsKQEAgLTE2Miw3ICsxNzMsNyBAQAogICBFWFBFQ1RfRVEoMCwgY2xpZW50LkdldEF2YWlsYWJsZUFjdGlvbnMoKS50b191bG9uZygpKTsKIAogICBNb2NrQ2FsbGJhY2tGdW5jdGlvbiBjZjsKLSAgRVhQRUNUX0NBTEwoY2YsIFJ1bigpKS5UaW1lcygwKTsKKyAgRVhQRUNUX0NBTEwoY2YsIFJ1bihfKSkuVGltZXMoMCk7CiAgIEZha2VTY3JpcHRWYWx1ZTxNZWRpYVNlc3Npb246Ok1lZGlhU2Vzc2lvbkFjdGlvbkhhbmRsZXI+IGhvbGRlcigmY2YpOwogCiAgIHNlc3Npb24tPlNldEFjdGlvbkhhbmRsZXIoa01lZGlhU2Vzc2lvbkFjdGlvblBsYXksIGhvbGRlcik7CkBAIC0xNzMsNyArMTg0LDcgQEAKIAogICBFWFBFQ1RfRVEoMSwgY2xpZW50LkdldEF2YWlsYWJsZUFjdGlvbnMoKS50b191bG9uZygpKTsKIAotICBzZXNzaW9uLT5TZXRBY3Rpb25IYW5kbGVyKGtNZWRpYVNlc3Npb25BY3Rpb25TZWVrYmFja3dhcmQsIGhvbGRlcik7CisgIHNlc3Npb24tPlNldEFjdGlvbkhhbmRsZXIoa01lZGlhU2Vzc2lvbkFjdGlvblNlZWssIGhvbGRlcik7CiAKICAgRVhQRUNUX0VRKDUsIGNsaWVudC5HZXRBdmFpbGFibGVBY3Rpb25zKCkudG9fdWxvbmcoKSk7CiAKQEAgLTIyMCw2ICsyMzEsNTUgQEAKICAgcnVuX2xvb3AuUnVuKCk7CiB9CiAKK1RFU1QoTWVkaWFTZXNzaW9uVGVzdCwgU2Vla0RldGFpbHMpIHsKKyAgTWVzc2FnZUxvb3AgbWVzc2FnZV9sb29wKE1lc3NhZ2VMb29wOjpUWVBFX0RFRkFVTFQpOworICBiYXNlOjpSdW5Mb29wIHJ1bl9sb29wOworCisgIE1vY2tNZWRpYVNlc3Npb25DbGllbnQgY2xpZW50OworCisgIE9OX0NBTEwoY2xpZW50LCBPbk1lZGlhU2Vzc2lvbkNoYW5nZWQoKSkKKyAgICAgIC5XaWxsQnlEZWZhdWx0KEludm9rZVdpdGhvdXRBcmdzKCZydW5fbG9vcCwgJmJhc2U6OlJ1bkxvb3A6OlF1aXQpKTsKKyAgRVhQRUNUX0NBTEwoY2xpZW50LCBPbk1lZGlhU2Vzc2lvbkNoYW5nZWQoKSkuVGltZXMoQXRMZWFzdCgwKSk7CisKKyAgc2NvcGVkX3JlZnB0cjxNZWRpYVNlc3Npb24+IHNlc3Npb24gPSBjbGllbnQuR2V0TWVkaWFTZXNzaW9uKCk7CisKKyAgTW9ja0NhbGxiYWNrRnVuY3Rpb24gY2Y7CisgIEZha2VTY3JpcHRWYWx1ZTxNZWRpYVNlc3Npb246Ok1lZGlhU2Vzc2lvbkFjdGlvbkhhbmRsZXI+IGhvbGRlcigmY2YpOworCisgIHNlc3Npb24tPlNldEFjdGlvbkhhbmRsZXIoa01lZGlhU2Vzc2lvbkFjdGlvblNlZWssIGhvbGRlcik7CisgIHNlc3Npb24tPlNldEFjdGlvbkhhbmRsZXIoa01lZGlhU2Vzc2lvbkFjdGlvblNlZWtmb3J3YXJkLCBob2xkZXIpOworICBzZXNzaW9uLT5TZXRBY3Rpb25IYW5kbGVyKGtNZWRpYVNlc3Npb25BY3Rpb25TZWVrYmFja3dhcmQsIGhvbGRlcik7CisKKyAgRVhQRUNUX0NBTEwoY2YsIFJ1bihTZWVrVGltZSgwLjApKSkKKyAgICAgIC5XaWxsT25jZShSZXR1cm4oQ2FsbGJhY2tSZXN1bHQ8dm9pZD4oKSkpOworICBjbGllbnQuSW52b2tlQWN0aW9uKGtNZWRpYVNlc3Npb25BY3Rpb25TZWVrKTsKKworICBFWFBFQ1RfQ0FMTChjZiwgUnVuKFNlZWtPZmZzZXQoa01lZGlhU2Vzc2lvbkFjdGlvblNlZWtmb3J3YXJkLCAwLjApKSkKKyAgICAgIC5XaWxsT25jZShSZXR1cm4oQ2FsbGJhY2tSZXN1bHQ8dm9pZD4oKSkpOworICBjbGllbnQuSW52b2tlQWN0aW9uKGtNZWRpYVNlc3Npb25BY3Rpb25TZWVrZm9yd2FyZCk7CisKKyAgRVhQRUNUX0NBTEwoY2YsIFJ1bihTZWVrT2Zmc2V0KGtNZWRpYVNlc3Npb25BY3Rpb25TZWVrYmFja3dhcmQsIDAuMCkpKQorICAgICAgLldpbGxPbmNlKFJldHVybihDYWxsYmFja1Jlc3VsdDx2b2lkPigpKSk7CisgIGNsaWVudC5JbnZva2VBY3Rpb24oa01lZGlhU2Vzc2lvbkFjdGlvblNlZWtiYWNrd2FyZCk7CisKKyAgRVhQRUNUX0NBTEwoY2YsIFJ1bihTZWVrVGltZSgxLjIpKSkKKyAgICAgIC5XaWxsT25jZShSZXR1cm4oQ2FsbGJhY2tSZXN1bHQ8dm9pZD4oKSkpOworICBjbGllbnQuSW52b2tlQWN0aW9uKHNjb3BlZF9wdHI8TWVkaWFTZXNzaW9uQWN0aW9uRGV0YWlsczo6RGF0YT4oCisgICAgICBuZXcgTWVkaWFTZXNzaW9uQWN0aW9uRGV0YWlsczo6RGF0YShrTWVkaWFTZXNzaW9uQWN0aW9uU2VlaywgMS4yKSkpOworCisgIEVYUEVDVF9DQUxMKGNmLCBSdW4oU2Vla09mZnNldChrTWVkaWFTZXNzaW9uQWN0aW9uU2Vla2ZvcndhcmQsIDMuNCkpKQorICAgICAgLldpbGxPbmNlKFJldHVybihDYWxsYmFja1Jlc3VsdDx2b2lkPigpKSk7CisgIGNsaWVudC5JbnZva2VBY3Rpb24oc2NvcGVkX3B0cjxNZWRpYVNlc3Npb25BY3Rpb25EZXRhaWxzOjpEYXRhPigKKyAgICAgIG5ldyBNZWRpYVNlc3Npb25BY3Rpb25EZXRhaWxzOjpEYXRhKAorICAgICAgICAgIGtNZWRpYVNlc3Npb25BY3Rpb25TZWVrZm9yd2FyZCwgMy40KSkpOworCisgIEVYUEVDVF9DQUxMKGNmLCBSdW4oU2Vla09mZnNldChrTWVkaWFTZXNzaW9uQWN0aW9uU2Vla2JhY2t3YXJkLCA1LjYpKSkKKyAgICAgIC5XaWxsT25jZShSZXR1cm4oQ2FsbGJhY2tSZXN1bHQ8dm9pZD4oKSkpOworICBjbGllbnQuSW52b2tlQWN0aW9uKHNjb3BlZF9wdHI8TWVkaWFTZXNzaW9uQWN0aW9uRGV0YWlsczo6RGF0YT4oCisgICAgICBuZXcgTWVkaWFTZXNzaW9uQWN0aW9uRGV0YWlsczo6RGF0YSgKKyAgICAgICAgICBrTWVkaWFTZXNzaW9uQWN0aW9uU2Vla2JhY2t3YXJkLCA1LjYpKSk7Cit9CisKIH0gIC8vIG5hbWVzcGFjZQogfSAgLy8gbmFtZXNwYWNlIG1lZGlhX3Nlc3Npb24KIH0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWFfc3RyZWFtL2F1ZGlvX3BhcmFtZXRlcnMuY2MgYi9zcmMvY29iYWx0L21lZGlhX3N0cmVhbS9hdWRpb19wYXJhbWV0ZXJzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NzNmNmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L21lZGlhX3N0cmVhbS9hdWRpb19wYXJhbWV0ZXJzLmNjCkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWFfc3RyZWFtL2F1ZGlvX3BhcmFtZXRlcnMuaCIKKworI2luY2x1ZGUgPHNzdHJlYW0+CisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIG1lZGlhX3N0cmVhbSB7CisKK3N0ZDo6c3RyaW5nIEF1ZGlvUGFyYW1ldGVyczo6QXNIdW1hblJlYWRhYmxlU3RyaW5nKCkgY29uc3QgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgIG9zIDw8ICJjaGFubmVsX2NvdW50OiAiIDw8IGNoYW5uZWxfY291bnQoKQorICAgICA8PCAiIHNhbXBsZV9yYXRlOiAiIDw8IHNhbXBsZV9yYXRlKCkKKyAgICAgPDwgIiBiaXRzX3Blcl9zYW1wbGU6ICIgPDwgYml0c19wZXJfc2FtcGxlKCk7CisgIHJldHVybiBvcy5zdHIoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIG1lZGlhX3N0cmVhbQorfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYV9zdHJlYW0vYXVkaW9fcGFyYW1ldGVycy5oIGIvc3JjL2NvYmFsdC9tZWRpYV9zdHJlYW0vYXVkaW9fcGFyYW1ldGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMWUwMTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L21lZGlhX3N0cmVhbS9hdWRpb19wYXJhbWV0ZXJzLmgKQEAgLTAsMCArMSw3NiBAQAorLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBDT0JBTFRfTUVESUFfU1RSRUFNX0FVRElPX1BBUkFNRVRFUlNfSF8KKyNkZWZpbmUgQ09CQUxUX01FRElBX1NUUkVBTV9BVURJT19QQVJBTUVURVJTX0hfCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgbWVkaWFfc3RyZWFtIHsKKworY2xhc3MgQXVkaW9QYXJhbWV0ZXJzIHsKKyBwdWJsaWM6CisgIEF1ZGlvUGFyYW1ldGVycyhpbnQgY2hhbm5lbF9jb3VudCwgaW50IHNhbXBsZV9yYXRlLCBpbnQgYml0c19wZXJfc2FtcGxlKQorICAgICAgOiBjaGFubmVsX2NvdW50XyhjaGFubmVsX2NvdW50KSwKKyAgICAgICAgc2FtcGxlX3JhdGVfKHNhbXBsZV9yYXRlKSwKKyAgICAgICAgYml0c19wZXJfc2FtcGxlXyhiaXRzX3Blcl9zYW1wbGUpIHsKKyAgICBEQ0hFQ0soSXNWYWxpZCgpKTsKKyAgfQorCisgIEF1ZGlvUGFyYW1ldGVycyhjb25zdCBBdWRpb1BhcmFtZXRlcnMmKSA9IGRlZmF1bHQ7CisgIEF1ZGlvUGFyYW1ldGVycyYgb3BlcmF0b3I9KGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYpID0gZGVmYXVsdDsKKworICBpbnQgY2hhbm5lbF9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIGNoYW5uZWxfY291bnRfOyB9CisgIGludCBzYW1wbGVfcmF0ZSgpIGNvbnN0IHsgcmV0dXJuIHNhbXBsZV9yYXRlXzsgfQorICBpbnQgYml0c19wZXJfc2FtcGxlKCkgY29uc3QgeyByZXR1cm4gYml0c19wZXJfc2FtcGxlXzsgfQorCisgIHN0ZDo6c3RyaW5nIEFzSHVtYW5SZWFkYWJsZVN0cmluZygpIGNvbnN0OworCisgIGJvb2wgSXNWYWxpZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKGNoYW5uZWxfY291bnRfID4gMCkgJiYgKGJpdHNfcGVyX3NhbXBsZV8gPiAwKSAmJiAoc2FtcGxlX3JhdGVfID4gMCk7CisgIH0KKworICBpbnQgR2V0Qml0c1BlclNlY29uZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gc2FtcGxlX3JhdGVfICogY2hhbm5lbF9jb3VudF8gKiBiaXRzX3Blcl9zYW1wbGVfOworICB9CisKKyBwcml2YXRlOgorICBpbnQgY2hhbm5lbF9jb3VudF87CisgIGludCBzYW1wbGVfcmF0ZV87CisgIGludCBiaXRzX3Blcl9zYW1wbGVfOworfTsKKworaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBBdWRpb1BhcmFtZXRlcnMmIGxocywgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiByaHMpIHsKKyAgcmV0dXJuICgobGhzLmNoYW5uZWxfY291bnQoKSA9PSByaHMuY2hhbm5lbF9jb3VudCgpKSAmJgorICAgICAgICAgIChsaHMuc2FtcGxlX3JhdGUoKSA9PSByaHMuc2FtcGxlX3JhdGUoKSkgJiYKKyAgICAgICAgICAobGhzLmJpdHNfcGVyX3NhbXBsZSgpID09IHJocy5iaXRzX3Blcl9zYW1wbGUoKSkpOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgbGhzLCBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHJocykgeworICByZXR1cm4gIShsaHMgPT0gcmhzKTsKK30KKworaW5saW5lIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIHBhcmFtcykgeworICBvcyA8PCBwYXJhbXMuQXNIdW1hblJlYWRhYmxlU3RyaW5nKCk7CisgIHJldHVybiBvczsKK30KKworfSAgLy8gbmFtZXNwYWNlIG1lZGlhX3N0cmVhbQorfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIENPQkFMVF9NRURJQV9TVFJFQU1fQVVESU9fUEFSQU1FVEVSU19IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYV9zdHJlYW0vYXVkaW9fcGFyYW1ldGVyc190ZXN0LmNjIGIvc3JjL2NvYmFsdC9tZWRpYV9zdHJlYW0vYXVkaW9fcGFyYW1ldGVyc190ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwN2Y3ODQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L21lZGlhX3N0cmVhbS9hdWRpb19wYXJhbWV0ZXJzX3Rlc3QuY2MKQEAgLTAsMCArMSw3MCBAQAorLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImNvYmFsdC9tZWRpYV9zdHJlYW0vYXVkaW9fcGFyYW1ldGVycy5oIgorI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBtZWRpYV9zdHJlYW0geworCitURVNUKEF1ZGlvUGFyYW1ldGVycywgQ29uc3RydWN0b3JfUGFyYW1ldGVyc1ZhbHVlcykgeworICBpbnQgY2hhbm5lbF9jb3VudCA9IDY7CisgIGludCBzYW1wbGVfcmF0ZSA9IDIwMDAwOworICBpbnQgYml0c19wZXJfc2FtcGxlID0gMjQ7CisgIEF1ZGlvUGFyYW1ldGVycyBwYXJhbXMoY2hhbm5lbF9jb3VudCwgc2FtcGxlX3JhdGUsIGJpdHNfcGVyX3NhbXBsZSk7CisKKyAgRVhQRUNUX0VRKGNoYW5uZWxfY291bnQsIHBhcmFtcy5jaGFubmVsX2NvdW50KCkpOworICBFWFBFQ1RfRVEoYml0c19wZXJfc2FtcGxlLCBwYXJhbXMuYml0c19wZXJfc2FtcGxlKCkpOworICBFWFBFQ1RfRVEoc2FtcGxlX3JhdGUsIHBhcmFtcy5zYW1wbGVfcmF0ZSgpKTsKK30KKworVEVTVChBdWRpb1BhcmFtZXRlcnMsIEFzSHVtYW5SZWFkYWJsZVN0cmluZykgeworICBpbnQgY2hhbm5lbF9jb3VudCA9IDY7CisgIGludCBzYW1wbGVfcmF0ZSA9IDIwMDAwOworICBpbnQgYml0c19wZXJfc2FtcGxlID0gMjQ7CisgIEF1ZGlvUGFyYW1ldGVycyBwYXJhbXMoY2hhbm5lbF9jb3VudCwgc2FtcGxlX3JhdGUsIGJpdHNfcGVyX3NhbXBsZSk7CisgIHN0ZDo6c3RyaW5nIHBhcmFtc19zdHJpbmcgPSBwYXJhbXMuQXNIdW1hblJlYWRhYmxlU3RyaW5nKCk7CisgIEVYUEVDVF9FUSgiY2hhbm5lbF9jb3VudDogNiBzYW1wbGVfcmF0ZTogMjAwMDAgYml0c19wZXJfc2FtcGxlOiAyNCIsCisgICAgICAgICAgICBwYXJhbXNfc3RyaW5nKTsKK30KKworVEVTVChBdWRpb1BhcmFtZXRlcnMsIElzVmFsaWRfUGFyYW1ldGVyaXplZCkgeworICBpbnQgY2hhbm5lbF9jb3VudCA9IDE7CisgIGludCBzYW1wbGVfcmF0ZSA9IDQ0MTAwOworICBpbnQgYml0c19wZXJfc2FtcGxlID0gMTY7CisgIEF1ZGlvUGFyYW1ldGVycyBwYXJhbXMoY2hhbm5lbF9jb3VudCwgc2FtcGxlX3JhdGUsIGJpdHNfcGVyX3NhbXBsZSk7CisgIEVYUEVDVF9UUlVFKHBhcmFtcy5Jc1ZhbGlkKCkpOworfQorCitURVNUKEF1ZGlvUGFyYW1ldGVycywgR2V0Qml0c1BlclNlY29uZCkgeworICBpbnQgY2hhbm5lbF9jb3VudCA9IDI7CisgIGludCBzYW1wbGVfcmF0ZSA9IDQ0MTAwOworICBpbnQgYml0c19wZXJfc2FtcGxlID0gMTY7CisgIEF1ZGlvUGFyYW1ldGVycyBwYXJhbXMoY2hhbm5lbF9jb3VudCwgc2FtcGxlX3JhdGUsIGJpdHNfcGVyX3NhbXBsZSk7CisgIEVYUEVDVF9FUSgyICogNDQxMDAgKiAxNiwgcGFyYW1zLkdldEJpdHNQZXJTZWNvbmQoKSk7Cit9CisKK1RFU1QoQXVkaW9QYXJhbWV0ZXJzLCBDb21wYXJlKSB7CisgIGludCBjaGFubmVsX2NvdW50ID0gMTsKKyAgaW50IHNhbXBsZV9yYXRlID0gNDQxMDA7CisgIGludCBiaXRzX3Blcl9zYW1wbGUgPSAxNjsKKyAgQXVkaW9QYXJhbWV0ZXJzIHBhcmFtczEoY2hhbm5lbF9jb3VudCwgc2FtcGxlX3JhdGUsIGJpdHNfcGVyX3NhbXBsZSk7CisgIEF1ZGlvUGFyYW1ldGVycyBwYXJhbXMyKGNoYW5uZWxfY291bnQsIHNhbXBsZV9yYXRlLCBiaXRzX3Blcl9zYW1wbGUpOworICBBdWRpb1BhcmFtZXRlcnMgcGFyYW1zMyhjaGFubmVsX2NvdW50LCBzYW1wbGVfcmF0ZSArIDEsIGJpdHNfcGVyX3NhbXBsZSk7CisgIEVYUEVDVF9FUShwYXJhbXMxLCBwYXJhbXMyKTsKKyAgRVhQRUNUX05FKHBhcmFtczIsIHBhcmFtczMpOworfQorCit9ICAvLyBuYW1lc3BhY2UgbWVkaWFfc3RyZWFtCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhX3N0cmVhbS9tZWRpYV9zdHJlYW0uZ3lwIGIvc3JjL2NvYmFsdC9tZWRpYV9zdHJlYW0vbWVkaWFfc3RyZWFtLmd5cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTgxMjkxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9tZWRpYV9zdHJlYW0vbWVkaWFfc3RyZWFtLmd5cApAQCAtMCwwICsxLDM4IEBACisjIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3sKKyAgJ3ZhcmlhYmxlcyc6IHsKKyAgICAnc2JfcGVkYW50aWNfd2FybmluZ3MnOiAxLAorICB9LAorICAndGFyZ2V0cyc6IFsKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnbWVkaWFfc3RyZWFtJywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnYXVkaW9fcGFyYW1ldGVycy5jYycsCisgICAgICAgICdhdWRpb19wYXJhbWV0ZXJzLmgnLAorICAgICAgICAnbWVkaWFfc3RyZWFtLmgnLAorICAgICAgICAnbWVkaWFfc3RyZWFtX3RyYWNrLmgnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc8KERFUFRIKS9jb2JhbHQvYnJvd3Nlci9icm93c2VyX2JpbmRpbmdzX2dlbi5neXA6Z2VuZXJhdGVkX3R5cGVzJywKKyAgICAgIF0sCisgICAgICAnZXhwb3J0X2RlcGVuZGVudF9zZXR0aW5ncyc6IFsKKyAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9icm93c2VyL2Jyb3dzZXJfYmluZGluZ3NfZ2VuLmd5cDpnZW5lcmF0ZWRfdHlwZXMnLAorICAgICAgXSwKKyAgICB9LAorICBdLAorfQorCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhX3N0cmVhbS9tZWRpYV9zdHJlYW0uaCBiL3NyYy9jb2JhbHQvbWVkaWFfc3RyZWFtL21lZGlhX3N0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5MTA3MmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L21lZGlhX3N0cmVhbS9tZWRpYV9zdHJlYW0uaApAQCAtMCwwICsxLDY1IEBACisvLyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaWZuZGVmIENPQkFMVF9NRURJQV9TVFJFQU1fTUVESUFfU1RSRUFNX0hfCisjZGVmaW5lIENPQkFMVF9NRURJQV9TVFJFQU1fTUVESUFfU1RSRUFNX0hfCisKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vZXZlbnRfdGFyZ2V0LmgiCisjaW5jbHVkZSAiY29iYWx0L21lZGlhX3N0cmVhbS9tZWRpYV9zdHJlYW1fdHJhY2suaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NlcXVlbmNlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgbWVkaWFfc3RyZWFtIHsKKworLy8gVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgTWVkaWFTdHJlYW0sIGFuZCBpbXBsZW1lbnRzIHRoZSBzcGVjaWZpY2F0aW9uIGF0OgorLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL21lZGlhY2FwdHVyZS1zdHJlYW1zLyNkb20tbWVkaWFzdHJlYW0KK2NsYXNzIE1lZGlhU3RyZWFtIDogcHVibGljIGRvbTo6RXZlbnRUYXJnZXQgeworIHB1YmxpYzoKKyAgdXNpbmcgVHJhY2tTZXF1ZW5jZXMgPSBzY3JpcHQ6OlNlcXVlbmNlPHNjb3BlZF9yZWZwdHI8TWVkaWFTdHJlYW1UcmFjaz4+OworCisgIC8vIENvbnN0cnVjdG9ycy4KKyAgTWVkaWFTdHJlYW0oKSA9IGRlZmF1bHQ7CisKKyAgZXhwbGljaXQgTWVkaWFTdHJlYW0oVHJhY2tTZXF1ZW5jZXMgdHJhY2tzKTogdHJhY2tzXyhzdGQ6Om1vdmUodHJhY2tzKSkgeworICB9CisKKyAgLy8gRnVuY3Rpb25zLgorICBzY3JpcHQ6OlNlcXVlbmNlPHNjb3BlZF9yZWZwdHI8TWVkaWFTdHJlYW1UcmFjaz4+JiBHZXRBdWRpb1RyYWNrcygpIHsKKyAgICByZXR1cm4gdHJhY2tzXzsKKyAgfQorCisgIHNjcmlwdDo6U2VxdWVuY2U8c2NvcGVkX3JlZnB0cjxNZWRpYVN0cmVhbVRyYWNrPj4mIEdldFRyYWNrcygpIHsKKyAgICByZXR1cm4gR2V0QXVkaW9UcmFja3MoKTsKKyAgfQorCisgIHZvaWQgVHJhY2VNZW1iZXJzKHNjcmlwdDo6VHJhY2VyKiB0cmFjZXIpIG92ZXJyaWRlIHsKKyAgICBFdmVudFRhcmdldDo6VHJhY2VNZW1iZXJzKHRyYWNlcik7CisgICAgdHJhY2VyLT5UcmFjZUl0ZW1zKHRyYWNrc18pOworICB9CisKKyAgREVGSU5FX1dSQVBQQUJMRV9UWVBFKE1lZGlhU3RyZWFtKTsKKworIHByaXZhdGU6CisgIE1lZGlhU3RyZWFtKGNvbnN0IE1lZGlhU3RyZWFtJikgPSBkZWxldGU7CisgIE1lZGlhU3RyZWFtJiBvcGVyYXRvcj0oY29uc3QgTWVkaWFTdHJlYW0mKSA9IGRlbGV0ZTsKKworICBzY3JpcHQ6OlNlcXVlbmNlPHNjb3BlZF9yZWZwdHI8TWVkaWFTdHJlYW1UcmFjaz4+IHRyYWNrc187Cit9OworCit9ICAvLyBuYW1lc3BhY2UgbWVkaWFfc3RyZWFtCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gQ09CQUxUX01FRElBX1NUUkVBTV9NRURJQV9TVFJFQU1fSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWFfc3RyZWFtL21lZGlhX3N0cmVhbS5pZGwgYi9zcmMvY29iYWx0L21lZGlhX3N0cmVhbS9tZWRpYV9zdHJlYW0uaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5OGJhZGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L21lZGlhX3N0cmVhbS9tZWRpYV9zdHJlYW0uaWRsCkBAIC0wLDAgKzEsMjMgQEAKKy8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIEltcGxlbWVudHMgYSBzdWJzZXQgb2YgdGhlIHNwZWNpZmljYXRpb24gYXQ6CisvLyBodHRwczovL3d3dy53My5vcmcvVFIvbWVkaWFjYXB0dXJlLXN0cmVhbXMvI2RvbS1tZWRpYXN0cmVhbQorW0V4cG9zZWQ9V2luZG93LAorIENvbnN0cnVjdG9yCitdCitpbnRlcmZhY2UgTWVkaWFTdHJlYW0gOiBFdmVudFRhcmdldCB7CisgIHNlcXVlbmNlPE1lZGlhU3RyZWFtVHJhY2s+IGdldEF1ZGlvVHJhY2tzKCk7CisgIHNlcXVlbmNlPE1lZGlhU3RyZWFtVHJhY2s+IGdldFRyYWNrcygpOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWFfc3RyZWFtL21lZGlhX3N0cmVhbV9jb25zdHJhaW50cy5pZGwgYi9zcmMvY29iYWx0L21lZGlhX3N0cmVhbS9tZWRpYV9zdHJlYW1fY29uc3RyYWludHMuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyYmY4ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L21lZGlhX3N0cmVhbS9tZWRpYV9zdHJlYW1fY29uc3RyYWludHMuaWRsCkBAIC0wLDAgKzEsMTkgQEAKKy8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9tZWRpYWNhcHR1cmUtc3RyZWFtcy8jbWVkaWFzdHJlYW1jb25zdHJhaW50cworCitkaWN0aW9uYXJ5IE1lZGlhU3RyZWFtQ29uc3RyYWludHMgeworICBib29sZWFuIGF1ZGlvID0gZmFsc2U7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYV9zdHJlYW0vbWVkaWFfc3RyZWFtX3Rlc3QuY2MgYi9zcmMvY29iYWx0L21lZGlhX3N0cmVhbS9tZWRpYV9zdHJlYW1fdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2Q5NjJkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9tZWRpYV9zdHJlYW0vbWVkaWFfc3RyZWFtX3Rlc3QuY2MKQEAgLTAsMCArMSwzOCBAQAorLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImNvYmFsdC9tZWRpYV9zdHJlYW0vbWVkaWFfc3RyZWFtLmgiCisKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBtZWRpYV9zdHJlYW0geworCitjbGFzcyBNZWRpYVN0cmVhbVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyBwdWJsaWM6CisgIE1lZGlhU3RyZWFtVGVzdCgpIDogbWVkaWFfc3RyZWFtXyhuZXcgTWVkaWFTdHJlYW0oKSkge30KKworIHByb3RlY3RlZDoKKyAgc2NvcGVkX3JlZnB0cjxNZWRpYVN0cmVhbT4gbWVkaWFfc3RyZWFtXzsKK307CisKK1RFU1RfRihNZWRpYVN0cmVhbVRlc3QsIFRlc3RDb25zdHJ1Y3Rpb24pIHsKKyAgQVNTRVJUX1RSVUUobWVkaWFfc3RyZWFtXyk7CisgIEVYUEVDVF9UUlVFKG1lZGlhX3N0cmVhbV8tPkdldEF1ZGlvVHJhY2tzKCkuZW1wdHkoKSk7CisgIEVYUEVDVF9UUlVFKG1lZGlhX3N0cmVhbV8tPkdldFRyYWNrcygpLmVtcHR5KCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgbWVkaWFfc3RyZWFtCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhX3N0cmVhbS9tZWRpYV9zdHJlYW1fdGVzdC5neXAgYi9zcmMvY29iYWx0L21lZGlhX3N0cmVhbS9tZWRpYV9zdHJlYW1fdGVzdC5neXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQyMTY2YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvbWVkaWFfc3RyZWFtL21lZGlhX3N0cmVhbV90ZXN0Lmd5cApAQCAtMCwwICsxLDQ5IEBACisjIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3sKKyAgJ3ZhcmlhYmxlcyc6IHsKKyAgICAnc2JfcGVkYW50aWNfd2FybmluZ3MnOiAxLAorICB9LAorICAndGFyZ2V0cyc6IFsKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnbWVkaWFfc3RyZWFtX3Rlc3QnLAorICAgICAgJ3R5cGUnOiAnPChndGVzdF90YXJnZXRfdHlwZSknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdhdWRpb19wYXJhbWV0ZXJzX3Rlc3QuY2MnLAorICAgICAgICAnbWVkaWFfc3RyZWFtX3Rlc3QuY2MnLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc8KERFUFRIKS9jb2JhbHQvZG9tL2RvbS5neXA6ZG9tJywKKyAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9tZWRpYV9zdHJlYW0vbWVkaWFfc3RyZWFtLmd5cDptZWRpYV9zdHJlYW0nLAorICAgICAgICAnPChERVBUSCkvY29iYWx0L3Rlc3QvdGVzdC5neXA6cnVuX2FsbF91bml0dGVzdHMnLAorICAgICAgICAnPChERVBUSCkvdGVzdGluZy9nbW9jay5neXA6Z21vY2snLAorICAgICAgICAnPChERVBUSCkvdGVzdGluZy9ndGVzdC5neXA6Z3Rlc3QnLAorICAgICAgXSwKKyAgICB9LAorCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ21lZGlhX3N0cmVhbV90ZXN0X2RlcGxveScsCisgICAgICAndHlwZSc6ICdub25lJywKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICdtZWRpYV9zdHJlYW1fdGVzdCcsCisgICAgICBdLAorICAgICAgJ3ZhcmlhYmxlcyc6IHsKKyAgICAgICAgJ2V4ZWN1dGFibGVfbmFtZSc6ICdtZWRpYV9zdHJlYW1fdGVzdCcsCisgICAgICB9LAorICAgICAgJ2luY2x1ZGVzJzogWyAnPChERVBUSCkvc3RhcmJvYXJkL2J1aWxkL2RlcGxveS5neXBpJyBdLAorICAgIH0sCisgIF0sCit9CisKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWFfc3RyZWFtL21lZGlhX3N0cmVhbV90cmFjay5oIGIvc3JjL2NvYmFsdC9tZWRpYV9zdHJlYW0vbWVkaWFfc3RyZWFtX3RyYWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIwNjBiOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvbWVkaWFfc3RyZWFtL21lZGlhX3N0cmVhbV90cmFjay5oCkBAIC0wLDAgKzEsNTUgQEAKKy8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgQ09CQUxUX01FRElBX1NUUkVBTV9NRURJQV9TVFJFQU1fVFJBQ0tfSF8KKyNkZWZpbmUgQ09CQUxUX01FRElBX1NUUkVBTV9NRURJQV9TVFJFQU1fVFJBQ0tfSF8KKworI2luY2x1ZGUgImJhc2Uvc3RyaW5nX3BpZWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2RvbS9ldmVudF90YXJnZXQuaCIKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWFfc3RyZWFtL21lZGlhX3RyYWNrX3NldHRpbmdzLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIG1lZGlhX3N0cmVhbSB7CisKKy8vIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIE1lZGlhU3RyZWFtVHJhY2ssIGFuZCBpbXBsZW1lbnRzIHRoZSBzcGVjaWZpY2F0aW9uCisvLyBhdDogaHR0cHM6Ly93d3cudzMub3JnL1RSL21lZGlhY2FwdHVyZS1zdHJlYW1zLyNkb20tbWVkaWFzdHJlYW10cmFjaworY2xhc3MgTWVkaWFTdHJlYW1UcmFjayA6IHB1YmxpYyBkb206OkV2ZW50VGFyZ2V0IHsKKyBwdWJsaWM6CisgIC8vIEZ1bmN0aW9uIGV4cG9zZWQgdG8gSmF2YXNjcmlwdCB2aWEgSURMLgorICBjb25zdCBNZWRpYVRyYWNrU2V0dGluZ3MmIEdldFNldHRpbmdzKCkgeyByZXR1cm4gc2V0dGluZ3NfOyB9CisKKyAgLy8gVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBpcyBub3QgZXhwb3NlZCB0byBKYXZhc2NyaXB0LgorCisgIC8vIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgMCwgdGhlIHVzZXIKKyAgLy8gaXMgZW5jb3VyYWdlZCB0byB0cnkgYWdhaW4gbGF0ZXIsIGFzIHRoZXJlIG1pZ2h0IGJlIG5vIGFkZGl0aW9uYWwKKyAgLy8gZGF0YSBhdmFpbGFibGUuIFJldHVybnMgYSB2YWx1ZSA8IDAgb24gZXJyb3IuCisgIGludDY0IFJlYWQoYmFzZTo6U3RyaW5nUGllY2Ugb3V0cHV0X2J1ZmZlcikgeworICAgIFVOUkVGRVJFTkNFRF9QQVJBTUVURVIob3V0cHV0X2J1ZmZlcik7CisgICAgTk9USU1QTEVNRU5URUQoKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIERFRklORV9XUkFQUEFCTEVfVFlQRShNZWRpYVN0cmVhbVRyYWNrKTsKKworIHByaXZhdGU6CisgIE1lZGlhU3RyZWFtVHJhY2soY29uc3QgTWVkaWFTdHJlYW1UcmFjayYpID0gZGVsZXRlOworICBNZWRpYVN0cmVhbVRyYWNrJiBvcGVyYXRvcj0oY29uc3QgTWVkaWFTdHJlYW1UcmFjayYpID0gZGVsZXRlOworCisgIE1lZGlhVHJhY2tTZXR0aW5ncyBzZXR0aW5nc187Cit9OworCit9ICAvLyBuYW1lc3BhY2UgbWVkaWFfc3RyZWFtCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gQ09CQUxUX01FRElBX1NUUkVBTV9NRURJQV9TVFJFQU1fVFJBQ0tfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWFfc3RyZWFtL21lZGlhX3N0cmVhbV90cmFjay5pZGwgYi9zcmMvY29iYWx0L21lZGlhX3N0cmVhbS9tZWRpYV9zdHJlYW1fdHJhY2suaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YTNiYmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L21lZGlhX3N0cmVhbS9tZWRpYV9zdHJlYW1fdHJhY2suaWRsCkBAIC0wLDAgKzEsMTkgQEAKKy8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9tZWRpYWNhcHR1cmUtc3RyZWFtcy8jZG9tLW1lZGlhc3RyZWFtdHJhY2sKK1tFeHBvc2VkPVdpbmRvd10KK2ludGVyZmFjZSBNZWRpYVN0cmVhbVRyYWNrIDogRXZlbnRUYXJnZXQgeworICBNZWRpYVRyYWNrU2V0dGluZ3MgZ2V0U2V0dGluZ3MoKTsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhX3N0cmVhbS9tZWRpYV90cmFja19zZXR0aW5ncy5pZGwgYi9zcmMvY29iYWx0L21lZGlhX3N0cmVhbS9tZWRpYV90cmFja19zZXR0aW5ncy5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY0NzQ1MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvbWVkaWFfc3RyZWFtL21lZGlhX3RyYWNrX3NldHRpbmdzLmlkbApAQCAtMCwwICsxLDIwIEBACisvLyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvbWVkaWFjYXB0dXJlLXN0cmVhbXMvI21lZGlhLXRyYWNrLXNldHRpbmdzCitkaWN0aW9uYXJ5IE1lZGlhVHJhY2tTZXR0aW5ncyB7CisgIGxvbmcgc2FtcGxlUmF0ZTsKKyAgbG9uZyBzYW1wbGVTaXplOworICBsb25nIGNoYW5uZWxDb3VudDsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L25ldHdvcmsvcGVyc2lzdGVudF9jb29raWVfc3RvcmUuY2MgYi9zcmMvY29iYWx0L25ldHdvcmsvcGVyc2lzdGVudF9jb29raWVfc3RvcmUuY2MKaW5kZXggNWMyYWU4Yy4uZmRmYjY4NyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9uZXR3b3JrL3BlcnNpc3RlbnRfY29va2llX3N0b3JlLmNjCisrKyBiL3NyYy9jb2JhbHQvbmV0d29yay9wZXJzaXN0ZW50X2Nvb2tpZV9zdG9yZS5jYwpAQCAtMjAsMTcxICsyMCw1OSBAQAogI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKICNpbmNsdWRlICJiYXNlL21lc3NhZ2VfbG9vcC5oIgogI2luY2x1ZGUgImdvb2dsZXVybC9zcmMvZ3VybC5oIgotI2luY2x1ZGUgInNxbC9jb25uZWN0aW9uLmgiCi0jaW5jbHVkZSAic3FsL3N0YXRlbWVudC5oIgogCiBuYW1lc3BhY2UgY29iYWx0IHsKIG5hbWVzcGFjZSBuZXR3b3JrIHsKIAogbmFtZXNwYWNlIHsKLWNvbnN0IGludCBrT3JpZ2luYWxDb29raWVTY2hlbWFWZXJzaW9uID0gMTsKLWNvbnN0IGludCBrTGF0ZXN0Q29va2llU2NoZW1hVmVyc2lvbiA9IDE7CiBjb25zdCBiYXNlOjpUaW1lRGVsdGEga01heENvb2tpZUxpZmV0aW1lID0gYmFzZTo6VGltZURlbHRhOjpGcm9tRGF5cygzNjUgKiAyKTsKIAotc3RkOjp2ZWN0b3I8bmV0OjpDYW5vbmljYWxDb29raWUqPiBHZXRBbGxDb29raWVzKHNxbDo6Q29ubmVjdGlvbiogY29ubikgeworc3RkOjp2ZWN0b3I8bmV0OjpDYW5vbmljYWxDb29raWUqPiBHZXRBbGxDb29raWVzKAorICAgIGNvbnN0IHN0b3JhZ2U6Ok1lbW9yeVN0b3JlJiBtZW1vcnlfc3RvcmUpIHsKICAgc3RkOjp2ZWN0b3I8bmV0OjpDYW5vbmljYWxDb29raWUqPiBhY3R1YWxfY29va2llczsKLSAgc3FsOjpTdGF0ZW1lbnQgZ2V0X2FsbChjb25uLT5HZXRDYWNoZWRTdGF0ZW1lbnQoCi0gICAgICBTUUxfRlJPTV9IRVJFLAotICAgICAgIlNFTEVDVCB1cmwsIG5hbWUsIHZhbHVlLCBkb21haW4sIHBhdGgsIG1hY19rZXksIG1hY19hbGdvcml0aG0sICIKLSAgICAgICJjcmVhdGlvbiwgZXhwaXJhdGlvbiwgbGFzdF9hY2Nlc3MsIHNlY3VyZSwgaHR0cF9vbmx5ICIKLSAgICAgICJGUk9NIENvb2tpZVRhYmxlIikpOwotICB3aGlsZSAoZ2V0X2FsbC5TdGVwKCkpIHsKLSAgICAvLyBXZSBjcmVhdGUgYSBDYW5vbmljYWxDb29raWUgZGlyZWN0bHkgdGhyb3VnaCBpdHMgY29uc3RydWN0b3IgaW5zdGVhZCBvZgotICAgIC8vIHRocm91Z2ggQ2Fub25pY2FsQ29va2llOjpDcmVhdGUoKSBhbmQgaXRzIHNhbml0aXphdGlvbiBiZWNhdXNlIHRoZXNlCi0gICAgLy8gdmFsdWVzIGFyZSBqdXN0IHNlcmlhbGl6ZWQgZnJvbSBhIGZvcm1lciBpbnN0YW5jZSBvZiBhIENhbm9uaWNhbENvb2tpZQotICAgIC8vIG9iamVjdCB0aGF0ICp3YXMqIGNyZWF0ZWQgdGhyb3VnaCBDYW5vbmljYWxDb29raWU6OkNyZWF0ZSgpLgotICAgIG5ldDo6Q2Fub25pY2FsQ29va2llKiBjb29raWUgPSBuZXcgbmV0OjpDYW5vbmljYWxDb29raWUoCi0gICAgICAgIEdVUkwoZ2V0X2FsbC5Db2x1bW5TdHJpbmcoMCkpLCBnZXRfYWxsLkNvbHVtblN0cmluZygxKSwKLSAgICAgICAgZ2V0X2FsbC5Db2x1bW5TdHJpbmcoMiksIGdldF9hbGwuQ29sdW1uU3RyaW5nKDMpLAotICAgICAgICBnZXRfYWxsLkNvbHVtblN0cmluZyg0KSwgZ2V0X2FsbC5Db2x1bW5TdHJpbmcoNSksCi0gICAgICAgIGdldF9hbGwuQ29sdW1uU3RyaW5nKDYpLAotICAgICAgICBiYXNlOjpUaW1lOjpGcm9tSW50ZXJuYWxWYWx1ZShnZXRfYWxsLkNvbHVtbkludDY0KDcpKSwKLSAgICAgICAgYmFzZTo6VGltZTo6RnJvbUludGVybmFsVmFsdWUoZ2V0X2FsbC5Db2x1bW5JbnQ2NCg4KSksCi0gICAgICAgIGJhc2U6OlRpbWU6OkZyb21JbnRlcm5hbFZhbHVlKGdldF9hbGwuQ29sdW1uSW50NjQoOSkpLAotICAgICAgICBnZXRfYWxsLkNvbHVtbkJvb2woMTApLCBnZXRfYWxsLkNvbHVtbkJvb2woMTEpKTsKLSAgICBhY3R1YWxfY29va2llcy5wdXNoX2JhY2soY29va2llKTsKLSAgfQogCisgIG1lbW9yeV9zdG9yZS5HZXRBbGxDb29raWVzKCZhY3R1YWxfY29va2llcyk7CiAgIHJldHVybiBhY3R1YWxfY29va2llczsKIH0KIAotdm9pZCBTcWxJbml0KGNvbnN0IFBlcnNpc3RlbnRDb29raWVTdG9yZTo6TG9hZGVkQ2FsbGJhY2smIGxvYWRlZF9jYWxsYmFjaywKLSAgICAgICAgICAgICBzdG9yYWdlOjpTcWxDb250ZXh0KiBzcWxfY29udGV4dCkgewotICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6bmV0d29yayIsICJQZXJzaXN0ZW50Q29va2llU3RvcmU6OlNxbEluaXQoKSIpOwotCi0gIHNxbDo6Q29ubmVjdGlvbiogY29ubiA9IHNxbF9jb250ZXh0LT5zcWxfY29ubmVjdGlvbigpOwotCi0gIC8vIENoZWNrIHRoZSB0YWJsZSdzIHNjaGVtYSB2ZXJzaW9uLgotICBpbnQgc2NoZW1hX3ZlcnNpb247Ci0gIGJvb2wgdGFibGVfZXhpc3RzID0KLSAgICAgIHNxbF9jb250ZXh0LT5HZXRTY2hlbWFWZXJzaW9uKCJDb29raWVUYWJsZSIsICZzY2hlbWFfdmVyc2lvbik7Ci0KLSAgaWYgKHRhYmxlX2V4aXN0cykgewotICAgIGlmIChzY2hlbWFfdmVyc2lvbiA9PSBzdG9yYWdlOjpTdG9yYWdlTWFuYWdlcjo6a1NjaGVtYVRhYmxlSXNOZXcpIHsKLSAgICAgIC8vIFRoaXMgc2F2ZWdhbWUgcHJlZGF0ZXMgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgc2NoZW1hIHRhYmxlLgotICAgICAgLy8gU2luY2UgdGhlIGNvb2tpZSB0YWJsZSBkaWQgbm90IGNoYW5nZSBiZXR3ZWVuIHRoZSBpbml0aWFsIHJlbGVhc2Ugb2YKLSAgICAgIC8vIHRoZSBhcHAgYW5kIHRoZSBpbnRyb2R1Y3Rpb24gb2YgdGhlIHNjaGVtYSB0YWJsZSwgYXNzdW1lIHRoYXQgdGhpcwotICAgICAgLy8gZXhpc3RpbmcgY29va2llIHRhYmxlIGlzIHNjaGVtYSB2ZXJzaW9uIDEuICBUaGlzIGF2b2lkcyBhIGxvc3Mgb2YKLSAgICAgIC8vIGNvb2tpZXMgb24gdXBncmFkZS4KLSAgICAgIERMT0coSU5GTykgPDwgIlVwZGF0aW5nIENvb2tpZVRhYmxlIHNjaGVtYSB2ZXJzaW9uIHRvICIKLSAgICAgICAgICAgICAgICAgPDwga09yaWdpbmFsQ29va2llU2NoZW1hVmVyc2lvbjsKLSAgICAgIHNxbF9jb250ZXh0LT5VcGRhdGVTY2hlbWFWZXJzaW9uKCJDb29raWVUYWJsZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrT3JpZ2luYWxDb29raWVTY2hlbWFWZXJzaW9uKTsKLSAgICB9IGVsc2UgaWYgKHNjaGVtYV92ZXJzaW9uID09IHN0b3JhZ2U6OlN0b3JhZ2VNYW5hZ2VyOjprU2NoZW1hVmVyc2lvbkxvc3QpIHsKLSAgICAgIC8vIFNpbmNlIHRoZXJlIGhhcyBvbmx5IGJlZW4gb25lIHNjaGVtYSBzbyBmYXIsIHRyZWF0IHRoaXMgdGhlIHNhbWUgYXMKLSAgICAgIC8vIGtTY2hlbWFUYWJsZUlzTmV3LiAgV2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgc2NoZW1hcyBpbiB0aGUgd2lsZCwKLSAgICAgIC8vIHdlIG1heSB3YW50IHRvIGRyb3AgdGhlIHRhYmxlIGluc3RlYWQuCi0gICAgICBzcWxfY29udGV4dC0+VXBkYXRlU2NoZW1hVmVyc2lvbigiQ29va2llVGFibGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga09yaWdpbmFsQ29va2llU2NoZW1hVmVyc2lvbik7Ci0gICAgfQotICB9IGVsc2UgewotICAgIC8vIFRoZSB0YWJsZSBkb2VzIG5vdCBleGlzdCwgc28gY3JlYXRlIGl0IGluIGl0cyBsYXRlc3QgZm9ybS4KLSAgICBzcWw6OlN0YXRlbWVudCBjcmVhdGVfdGFibGUoY29ubi0+R2V0VW5pcXVlU3RhdGVtZW50KAotICAgICAgICAiQ1JFQVRFIFRBQkxFIENvb2tpZVRhYmxlICgiCi0gICAgICAgICJ1cmwgVEVYVCwgIgotICAgICAgICAibmFtZSBURVhULCAiCi0gICAgICAgICJ2YWx1ZSBURVhULCAiCi0gICAgICAgICJkb21haW4gVEVYVCwgIgotICAgICAgICAicGF0aCBURVhULCAiCi0gICAgICAgICJtYWNfa2V5IFRFWFQsICIKLSAgICAgICAgIm1hY19hbGdvcml0aG0gVEVYVCwgIgotICAgICAgICAiY3JlYXRpb24gSU5URUdFUiwgIgotICAgICAgICAiZXhwaXJhdGlvbiBJTlRFR0VSLCAiCi0gICAgICAgICJsYXN0X2FjY2VzcyBJTlRFR0VSLCAiCi0gICAgICAgICJzZWN1cmUgSU5URUdFUiwgIgotICAgICAgICAiaHR0cF9vbmx5IElOVEVHRVIsICIKLSAgICAgICAgIlVOSVFVRShuYW1lLCBkb21haW4sIHBhdGgpIE9OIENPTkZMSUNUIFJFUExBQ0UpIikpOwotICAgIGJvb2wgb2sgPSBjcmVhdGVfdGFibGUuUnVuKCk7Ci0gICAgRENIRUNLKG9rKTsKLSAgICBzcWxfY29udGV4dC0+VXBkYXRlU2NoZW1hVmVyc2lvbigiQ29va2llVGFibGUiLCBrTGF0ZXN0Q29va2llU2NoZW1hVmVyc2lvbik7Ci0gIH0KLQotICBsb2FkZWRfY2FsbGJhY2suUnVuKEdldEFsbENvb2tpZXMoY29ubikpOwotfQotCi12b2lkIFNxbEFkZENvb2tpZShjb25zdCBuZXQ6OkNhbm9uaWNhbENvb2tpZSYgY2MsCi0gICAgICAgICAgICAgICAgICBzdG9yYWdlOjpTcWxDb250ZXh0KiBzcWxfY29udGV4dCkgewotICBiYXNlOjpUaW1lIG1heGltdW1fZXhwaXJ5ID0gYmFzZTo6VGltZTo6Tm93KCkgKyBrTWF4Q29va2llTGlmZXRpbWU7Ci0gIGJhc2U6OlRpbWUgZXhwaXJ5ID0gY2MuRXhwaXJ5RGF0ZSgpOwotICBpZiAoZXhwaXJ5ID4gbWF4aW11bV9leHBpcnkpIHsKLSAgICBleHBpcnkgPSBtYXhpbXVtX2V4cGlyeTsKLSAgfQotICBzcWw6OkNvbm5lY3Rpb24qIGNvbm4gPSBzcWxfY29udGV4dC0+c3FsX2Nvbm5lY3Rpb24oKTsKLSAgc3FsOjpTdGF0ZW1lbnQgaW5zZXJ0X2Nvb2tpZShjb25uLT5HZXRDYWNoZWRTdGF0ZW1lbnQoCi0gICAgICBTUUxfRlJPTV9IRVJFLAotICAgICAgIklOU0VSVCBJTlRPIENvb2tpZVRhYmxlICgiCi0gICAgICAidXJsLCBuYW1lLCB2YWx1ZSwgZG9tYWluLCBwYXRoLCBtYWNfa2V5LCBtYWNfYWxnb3JpdGhtLCAiCi0gICAgICAiY3JlYXRpb24sIGV4cGlyYXRpb24sIGxhc3RfYWNjZXNzLCBzZWN1cmUsIGh0dHBfb25seSIKLSAgICAgICIpIFZBTFVFUyAoPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPykiKSk7Ci0KLSAgaW5zZXJ0X2Nvb2tpZS5CaW5kU3RyaW5nKDAsIGNjLlNvdXJjZSgpKTsKLSAgaW5zZXJ0X2Nvb2tpZS5CaW5kU3RyaW5nKDEsIGNjLk5hbWUoKSk7Ci0gIGluc2VydF9jb29raWUuQmluZFN0cmluZygyLCBjYy5WYWx1ZSgpKTsKLSAgaW5zZXJ0X2Nvb2tpZS5CaW5kU3RyaW5nKDMsIGNjLkRvbWFpbigpKTsKLSAgaW5zZXJ0X2Nvb2tpZS5CaW5kU3RyaW5nKDQsIGNjLlBhdGgoKSk7Ci0gIGluc2VydF9jb29raWUuQmluZFN0cmluZyg1LCBjYy5NQUNLZXkoKSk7Ci0gIGluc2VydF9jb29raWUuQmluZFN0cmluZyg2LCBjYy5NQUNBbGdvcml0aG0oKSk7Ci0gIGluc2VydF9jb29raWUuQmluZEludDY0KDcsIGNjLkNyZWF0aW9uRGF0ZSgpLlRvSW50ZXJuYWxWYWx1ZSgpKTsKLSAgaW5zZXJ0X2Nvb2tpZS5CaW5kSW50NjQoOCwgZXhwaXJ5LlRvSW50ZXJuYWxWYWx1ZSgpKTsKLSAgaW5zZXJ0X2Nvb2tpZS5CaW5kSW50NjQoOSwgY2MuTGFzdEFjY2Vzc0RhdGUoKS5Ub0ludGVybmFsVmFsdWUoKSk7Ci0gIGluc2VydF9jb29raWUuQmluZEJvb2woMTAsIGNjLklzU2VjdXJlKCkpOwotICBpbnNlcnRfY29va2llLkJpbmRCb29sKDExLCBjYy5Jc0h0dHBPbmx5KCkpOwotICBib29sIG9rID0gaW5zZXJ0X2Nvb2tpZS5SdW4oKTsKLSAgRENIRUNLKG9rKTsKLSAgc3FsX2NvbnRleHQtPkZsdXNoT25DaGFuZ2UoKTsKLX0KLQotdm9pZCBTcWxVcGRhdGVDb29raWVBY2Nlc3NUaW1lKGNvbnN0IG5ldDo6Q2Fub25pY2FsQ29va2llJiBjYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlOjpTcWxDb250ZXh0KiBzcWxfY29udGV4dCkgewotICBzcWw6OkNvbm5lY3Rpb24qIGNvbm4gPSBzcWxfY29udGV4dC0+c3FsX2Nvbm5lY3Rpb24oKTsKLSAgc3FsOjpTdGF0ZW1lbnQgdG91Y2hfY29va2llKAotICAgICAgY29ubi0+R2V0Q2FjaGVkU3RhdGVtZW50KFNRTF9GUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVQREFURSBDb29raWVUYWJsZSBTRVQgbGFzdF9hY2Nlc3MgPSA/IFdIRVJFICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSA9ID8gQU5EIGRvbWFpbiA9ID8gQU5EIHBhdGggPSA/IikpOwotCi0gIGJhc2U6OlRpbWUgbWF4aW11bV9leHBpcnkgPSBiYXNlOjpUaW1lOjpOb3coKSArIGtNYXhDb29raWVMaWZldGltZTsKLSAgYmFzZTo6VGltZSBleHBpcnkgPSBjYy5FeHBpcnlEYXRlKCk7Ci0gIGlmIChleHBpcnkgPiBtYXhpbXVtX2V4cGlyeSkgewotICAgIGV4cGlyeSA9IG1heGltdW1fZXhwaXJ5OwotICB9Ci0KLSAgdG91Y2hfY29va2llLkJpbmRJbnQ2NCgwLCBleHBpcnkuVG9JbnRlcm5hbFZhbHVlKCkpOwotICB0b3VjaF9jb29raWUuQmluZFN0cmluZygxLCBjYy5OYW1lKCkpOwotICB0b3VjaF9jb29raWUuQmluZFN0cmluZygyLCBjYy5Eb21haW4oKSk7Ci0gIHRvdWNoX2Nvb2tpZS5CaW5kU3RyaW5nKDMsIGNjLlBhdGgoKSk7Ci0gIGJvb2wgb2sgPSB0b3VjaF9jb29raWUuUnVuKCk7Ci0gIERDSEVDSyhvayk7Ci0gIHNxbF9jb250ZXh0LT5GbHVzaE9uQ2hhbmdlKCk7Ci19Ci0KLXZvaWQgU3FsRGVsZXRlQ29va2llKGNvbnN0IG5ldDo6Q2Fub25pY2FsQ29va2llJiBjYywKLSAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2U6OlNxbENvbnRleHQqIHNxbF9jb250ZXh0KSB7Ci0gIHNxbDo6Q29ubmVjdGlvbiogY29ubiA9IHNxbF9jb250ZXh0LT5zcWxfY29ubmVjdGlvbigpOwotICBzcWw6OlN0YXRlbWVudCBkZWxldGVfY29va2llKGNvbm4tPkdldENhY2hlZFN0YXRlbWVudCgKLSAgICAgIFNRTF9GUk9NX0hFUkUsCi0gICAgICAiREVMRVRFIEZST00gQ29va2llVGFibGUgV0hFUkUgbmFtZSA9ID8gQU5EIGRvbWFpbiA9ID8gQU5EIHBhdGggPSA/IikpOwotICBkZWxldGVfY29va2llLkJpbmRTdHJpbmcoMCwgY2MuTmFtZSgpKTsKLSAgZGVsZXRlX2Nvb2tpZS5CaW5kU3RyaW5nKDEsIGNjLkRvbWFpbigpKTsKLSAgZGVsZXRlX2Nvb2tpZS5CaW5kU3RyaW5nKDIsIGNjLlBhdGgoKSk7Ci0gIGJvb2wgb2sgPSBkZWxldGVfY29va2llLlJ1bigpOwotICBEQ0hFQ0sob2spOwotICBzcWxfY29udGV4dC0+Rmx1c2hPbkNoYW5nZSgpOwotfQotCi12b2lkIFNxbFNlbmRFbXB0eUNvb2tpZUxpc3QoCit2b2lkIENvb2tpZVN0b3JhZ2VJbml0KAogICAgIGNvbnN0IFBlcnNpc3RlbnRDb29raWVTdG9yZTo6TG9hZGVkQ2FsbGJhY2smIGxvYWRlZF9jYWxsYmFjaywKLSAgICBzdG9yYWdlOjpTcWxDb250ZXh0KiBzcWxfY29udGV4dCkgewotICBVTlJFRkVSRU5DRURfUEFSQU1FVEVSKHNxbF9jb250ZXh0KTsKKyAgICBjb25zdCBzdG9yYWdlOjpNZW1vcnlTdG9yZSYgbWVtb3J5X3N0b3JlKSB7CisgIFRSQUNFX0VWRU5UMCgiY29iYWx0OjpuZXR3b3JrIiwgIlBlcnNpc3RlbnRDb29raWVTdG9yZTo6Q29va2llU3RvcmFnZUluaXQoKSIpOworICBsb2FkZWRfY2FsbGJhY2suUnVuKEdldEFsbENvb2tpZXMobWVtb3J5X3N0b3JlKSk7Cit9CisKK3ZvaWQgQ29va2llU3RvcmFnZUFkZENvb2tpZShjb25zdCBuZXQ6OkNhbm9uaWNhbENvb2tpZSYgY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZTo6TWVtb3J5U3RvcmUqIG1lbW9yeV9zdG9yZSkgeworICBiYXNlOjpUaW1lIG1heGltdW1fZXhwaXJ5ID0gYmFzZTo6VGltZTo6Tm93KCkgKyBrTWF4Q29va2llTGlmZXRpbWU7CisgIGJhc2U6OlRpbWUgZXhwaXJ5ID0gY2MuRXhwaXJ5RGF0ZSgpOworICBpZiAoZXhwaXJ5ID4gbWF4aW11bV9leHBpcnkpIHsKKyAgICBleHBpcnkgPSBtYXhpbXVtX2V4cGlyeTsKKyAgfQorCisgIG1lbW9yeV9zdG9yZS0+QWRkQ29va2llKGNjLCBleHBpcnkuVG9JbnRlcm5hbFZhbHVlKCkpOworfQorCit2b2lkIENvb2tpZVN0b3JhZ2VDb29raWVBY2Nlc3NUaW1lKGNvbnN0IG5ldDo6Q2Fub25pY2FsQ29va2llJiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZTo6TWVtb3J5U3RvcmUqIG1lbW9yeV9zdG9yZSkgeworICBiYXNlOjpUaW1lIG1heGltdW1fZXhwaXJ5ID0gYmFzZTo6VGltZTo6Tm93KCkgKyBrTWF4Q29va2llTGlmZXRpbWU7CisgIGJhc2U6OlRpbWUgZXhwaXJ5ID0gY2MuRXhwaXJ5RGF0ZSgpOworICBpZiAoZXhwaXJ5ID4gbWF4aW11bV9leHBpcnkpIHsKKyAgICBleHBpcnkgPSBtYXhpbXVtX2V4cGlyeTsKKyAgfQorCisgIG1lbW9yeV9zdG9yZS0+VXBkYXRlQ29va2llQWNjZXNzVGltZShjYywgZXhwaXJ5LlRvSW50ZXJuYWxWYWx1ZSgpKTsKK30KKwordm9pZCBDb29raWVTdG9yYWdlRGVsZXRlQ29va2llKGNvbnN0IG5ldDo6Q2Fub25pY2FsQ29va2llJiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlOjpNZW1vcnlTdG9yZSogbWVtb3J5X3N0b3JlKSB7CisgIG1lbW9yeV9zdG9yZS0+RGVsZXRlQ29va2llKGNjKTsKK30KKwordm9pZCBTZW5kRW1wdHlDb29raWVMaXN0KAorICAgIGNvbnN0IFBlcnNpc3RlbnRDb29raWVTdG9yZTo6TG9hZGVkQ2FsbGJhY2smIGxvYWRlZF9jYWxsYmFjaywKKyAgICBjb25zdCBzdG9yYWdlOjpNZW1vcnlTdG9yZSYgbWVtb3J5X3N0b3JlKSB7CisgIFVOUkVGRVJFTkNFRF9QQVJBTUVURVIobWVtb3J5X3N0b3JlKTsKICAgc3RkOjp2ZWN0b3I8bmV0OjpDYW5vbmljYWxDb29raWUqPiBlbXB0eV9jb29raWVfbGlzdDsKICAgbG9hZGVkX2NhbGxiYWNrLlJ1bihlbXB0eV9jb29raWVfbGlzdCk7CiB9CkBAIC0xOTcsMzMgKzg1LDM0IEBACiBQZXJzaXN0ZW50Q29va2llU3RvcmU6On5QZXJzaXN0ZW50Q29va2llU3RvcmUoKSB7fQogCiB2b2lkIFBlcnNpc3RlbnRDb29raWVTdG9yZTo6TG9hZChjb25zdCBMb2FkZWRDYWxsYmFjayYgbG9hZGVkX2NhbGxiYWNrKSB7Ci0gIHN0b3JhZ2VfLT5HZXRTcWxDb250ZXh0KGJhc2U6OkJpbmQoJlNxbEluaXQsIGxvYWRlZF9jYWxsYmFjaykpOworICBzdG9yYWdlXy0+V2l0aFJlYWRPbmx5TWVtb3J5U3RvcmUoCisgICAgICBiYXNlOjpCaW5kKCZDb29raWVTdG9yYWdlSW5pdCwgbG9hZGVkX2NhbGxiYWNrKSk7CiB9CiAKIHZvaWQgUGVyc2lzdGVudENvb2tpZVN0b3JlOjpMb2FkQ29va2llc0ZvcktleSgKICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBjb25zdCBMb2FkZWRDYWxsYmFjayYgbG9hZGVkX2NhbGxiYWNrKSB7CiAgIFVOUkVGRVJFTkNFRF9QQVJBTUVURVIoa2V5KTsKICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCBsb2FkaW5nIG9mIGluZGl2aWR1YWwgY29va2llcy4KLSAgLy8gVGhpcyBpcyBhbHdheXMgY2FsbGVkIGFmdGVyIExvYWQoKSwgc28ganVzdCBwb3N0IHRoZSBjYWxsYmFjayB0byB0aGUgU1FMCi0gIC8vIHRocmVhZCB0byBtYWtlIHN1cmUgaXQgaXMgcnVuIGFmdGVyIExvYWQoKSBoYXMgZmluaXNoZWQuCi0gIC8vIFNlZSBjb21tZW50cyBpbiBuZXQvY29va2llX21vbnN0ZXIuY2MgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gIHN0b3JhZ2VfLT5HZXRTcWxDb250ZXh0KGJhc2U6OkJpbmQoJlNxbFNlbmRFbXB0eUNvb2tpZUxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkX2NhbGxiYWNrKSk7CisgIC8vIFRoaXMgaXMgYWx3YXlzIGNhbGxlZCBhZnRlciBMb2FkKCksIHNvIGp1c3QgcG9zdCB0aGUgY2FsbGJhY2sgdG8gdGhlCisgIC8vIFN0b3JhZ2UgdGhyZWFkIHRvIG1ha2Ugc3VyZSBpdCBpcyBydW4gYWZ0ZXIgTG9hZCgpIGhhcyBmaW5pc2hlZC4gU2VlCisgIC8vIGNvbW1lbnRzIGluIG5ldC9jb29raWVfbW9uc3Rlci5jYyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgc3RvcmFnZV8tPldpdGhSZWFkT25seU1lbW9yeVN0b3JlKAorICAgICAgYmFzZTo6QmluZCgmU2VuZEVtcHR5Q29va2llTGlzdCwgbG9hZGVkX2NhbGxiYWNrKSk7CiB9CiAKIHZvaWQgUGVyc2lzdGVudENvb2tpZVN0b3JlOjpBZGRDb29raWUoY29uc3QgbmV0OjpDYW5vbmljYWxDb29raWUmIGNjKSB7CiAgIC8vIFdlIGV4cGVjdCB0aGF0IGFsbCBjb29raWVzIHdlIGFyZSBmZWQgYXJlIG1lYW50IHRvIHBlcnNpc3QuCiAgIERDSEVDSyhjYy5Jc1BlcnNpc3RlbnQoKSk7Ci0gIHN0b3JhZ2VfLT5HZXRTcWxDb250ZXh0KGJhc2U6OkJpbmQoJlNxbEFkZENvb2tpZSwgY2MpKTsKKyAgc3RvcmFnZV8tPldpdGhNZW1vcnlTdG9yZShiYXNlOjpCaW5kKCZDb29raWVTdG9yYWdlQWRkQ29va2llLCBjYykpOwogfQogCiB2b2lkIFBlcnNpc3RlbnRDb29raWVTdG9yZTo6VXBkYXRlQ29va2llQWNjZXNzVGltZSgKICAgICBjb25zdCBuZXQ6OkNhbm9uaWNhbENvb2tpZSYgY2MpIHsKLSAgc3RvcmFnZV8tPkdldFNxbENvbnRleHQoYmFzZTo6QmluZCgmU3FsVXBkYXRlQ29va2llQWNjZXNzVGltZSwgY2MpKTsKKyAgc3RvcmFnZV8tPldpdGhNZW1vcnlTdG9yZShiYXNlOjpCaW5kKCZDb29raWVTdG9yYWdlQ29va2llQWNjZXNzVGltZSwgY2MpKTsKIH0KIAogdm9pZCBQZXJzaXN0ZW50Q29va2llU3RvcmU6OkRlbGV0ZUNvb2tpZShjb25zdCBuZXQ6OkNhbm9uaWNhbENvb2tpZSYgY2MpIHsKLSAgc3RvcmFnZV8tPkdldFNxbENvbnRleHQoYmFzZTo6QmluZCgmU3FsRGVsZXRlQ29va2llLCBjYykpOworICBzdG9yYWdlXy0+V2l0aE1lbW9yeVN0b3JlKGJhc2U6OkJpbmQoJkNvb2tpZVN0b3JhZ2VEZWxldGVDb29raWUsIGNjKSk7CiB9CiAKIHZvaWQgUGVyc2lzdGVudENvb2tpZVN0b3JlOjpTZXRGb3JjZUtlZXBTZXNzaW9uU3RhdGUoKSB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L25ldHdvcmsvcGVyc2lzdGVudF9jb29raWVfc3RvcmVfdGVzdC5jYyBiL3NyYy9jb2JhbHQvbmV0d29yay9wZXJzaXN0ZW50X2Nvb2tpZV9zdG9yZV90ZXN0LmNjCmluZGV4IGRhOGM3NTkuLjY4YmY1NGEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbmV0d29yay9wZXJzaXN0ZW50X2Nvb2tpZV9zdG9yZV90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvbmV0d29yay9wZXJzaXN0ZW50X2Nvb2tpZV9zdG9yZV90ZXN0LmNjCkBAIC0yOCw4ICsyOCw2IEBACiAjaW5jbHVkZSAiY29iYWx0L3N0b3JhZ2Uvc3RvcmFnZV9tYW5hZ2VyLmgiCiAjaW5jbHVkZSAiZ29vZ2xldXJsL3NyYy9ndXJsLmgiCiAjaW5jbHVkZSAibmV0L2Nvb2tpZXMvY2Fub25pY2FsX2Nvb2tpZS5oIgotI2luY2x1ZGUgInNxbC9jb25uZWN0aW9uLmgiCi0jaW5jbHVkZSAic3FsL3N0YXRlbWVudC5oIgogI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgogCiBuYW1lc3BhY2UgY29iYWx0IHsKQEAgLTk3LDI3ICs5NSw2IEBACiAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihDb29raWVMb2FkZXIpOwogfTsKIAotY2xhc3MgQ29va2llVmVyaWZpZXIgOiBwdWJsaWMgQ2FsbGJhY2tXYWl0ZXIgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQ29va2llVmVyaWZpZXIobmV0OjpDYW5vbmljYWxDb29raWUqIHRlc3RfY29va2llKQotICAgICAgOiB0ZXN0X2Nvb2tpZSh0ZXN0X2Nvb2tpZSkge30KLSAgdm9pZCBTcWxTZWxlY3Qoc3RvcmFnZTo6U3FsQ29udGV4dCogc3FsX2NvbnRleHQpIHsKLSAgICBzdGQ6OnN0cmluZyBzdGF0ZW1lbnQgPQotICAgICAgICBiYXNlOjpTdHJpbmdQcmludGYoIlNFTEVDVCB1cmwgRlJPTSBDb29raWVUYWJsZSBXSEVSRSB1cmwgPSBcIiVzXCI7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfY29va2llLT5Tb3VyY2UoKS5jX3N0cigpKTsKLSAgICBzcWw6OlN0YXRlbWVudCBnZXRfY29va2llKAotICAgICAgICBzcWxfY29udGV4dC0+c3FsX2Nvbm5lY3Rpb24oKS0+R2V0VW5pcXVlU3RhdGVtZW50KHN0YXRlbWVudC5jX3N0cigpKSk7Ci0gICAgRVhQRUNUX0VRKHRydWUsIGdldF9jb29raWUuU3RlcCgpKTsKLSAgICBFWFBFQ1RfRVEodGVzdF9jb29raWUtPlNvdXJjZSgpLCBnZXRfY29va2llLkNvbHVtblN0cmluZygwKSk7Ci0gICAgU2lnbmFsKCk7Ci0gIH0KLQotICBuZXQ6OkNhbm9uaWNhbENvb2tpZSogdGVzdF9jb29raWU7Ci0KLSBwcml2YXRlOgotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQ29va2llVmVyaWZpZXIpOwotfTsKLQogY2xhc3MgRHVtbXlVcGdyYWRlSGFuZGxlciA6IHB1YmxpYyBzdG9yYWdlOjpTdG9yYWdlTWFuYWdlcjo6VXBncmFkZUhhbmRsZXIgewogICB2b2lkIE9uVXBncmFkZShzdG9yYWdlOjpTdG9yYWdlTWFuYWdlciogLypzdG9yYWdlKi8sIGNvbnN0IGNoYXIqIC8qZGF0YSovLAogICAgICAgICAgICAgICAgICBpbnQgLypzaXplKi8pIG92ZXJyaWRlIHt9CkBAIC0xNTUsNyArMTMyLDcgQEAKIH07CiB9ICAvLyBuYW1lc3BhY2UKIAotVEVTVF9GKFBlcnNpc3RlbnRDb29raWVTdG9yZVRlc3QsIExvYWRHZXRzQ29va2llcykgeworVEVTVF9GKFBlcnNpc3RlbnRDb29raWVTdG9yZVRlc3QsIExvYWRHZXRzQWRkZWRDb29raWVzKSB7CiAgIC8vIFB1dCBhIGNvb2tpZSBpbnRvIHRoZSBkYXRhYmFzZS4gRmx1c2gsIHRoZW4gcmVsb2FkIGFuZCBtYWtlIHN1cmUKICAgLy8gdGhlIExvYWRlZCBjYWxsYmFjayBjb250YWlucyBpdC4KICAgc2NvcGVkX3B0cjxuZXQ6OkNhbm9uaWNhbENvb2tpZT4gdGVzdF9jb29raWUoQ3JlYXRlVGVzdENvb2tpZSgpKTsKQEAgLTE3NSwyMiArMTUyLDUgQEAKICAgQVNTRVJUX0VRKDEsIGxvYWRlci5jb29raWVzLnNpemUoKSk7CiAgIEVYUEVDVF9UUlVFKHRlc3RfY29va2llLT5Jc0VxdWl2YWxlbnQoKmxvYWRlci5jb29raWVzWzBdKSk7CiB9Ci0KLVRFU1RfRihQZXJzaXN0ZW50Q29va2llU3RvcmVUZXN0LCBBZGRDb29raWUpIHsKLSAgQ29va2llTG9hZGVyIGxvYWRlcjsKLSAgY29va2llX3N0b3JlXy0+TG9hZCgKLSAgICAgIGJhc2U6OkJpbmQoJkNvb2tpZUxvYWRlcjo6T25Db29raWVMb2FkLCBiYXNlOjpVbnJldGFpbmVkKCZsb2FkZXIpKSk7Ci0gIG1lc3NhZ2VfbG9vcF8uUnVuVW50aWxJZGxlKCk7Ci0KLSAgc2NvcGVkX3B0cjxuZXQ6OkNhbm9uaWNhbENvb2tpZT4gdGVzdF9jb29raWUoQ3JlYXRlVGVzdENvb2tpZSgpKTsKLSAgY29va2llX3N0b3JlXy0+QWRkQ29va2llKCp0ZXN0X2Nvb2tpZSk7Ci0KLSAgQ29va2llVmVyaWZpZXIgdmVyaWZpZXIodGVzdF9jb29raWUuZ2V0KCkpOwotICBzdG9yYWdlX21hbmFnZXJfLT5HZXRTcWxDb250ZXh0KAotICAgICAgYmFzZTo6QmluZCgmQ29va2llVmVyaWZpZXI6OlNxbFNlbGVjdCwgYmFzZTo6VW5yZXRhaW5lZCgmdmVyaWZpZXIpKSk7Ci0gIG1lc3NhZ2VfbG9vcF8uUnVuVW50aWxJZGxlKCk7Ci0gIEVYUEVDVF9UUlVFKHZlcmlmaWVyLlRpbWVkV2FpdCgpKTsKLX0KLQogfSAgLy8gbmFtZXNwYWNlIG5ldHdvcmsKIH0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvb3ZlcmxheV9pbmZvL3FyX2NvZGVfb3ZlcmxheS5jYyBiL3NyYy9jb2JhbHQvb3ZlcmxheV9pbmZvL3FyX2NvZGVfb3ZlcmxheS5jYwppbmRleCA3ZDkxZTg0Li5hMzM4OGQ4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L292ZXJsYXlfaW5mby9xcl9jb2RlX292ZXJsYXkuY2MKKysrIGIvc3JjL2NvYmFsdC9vdmVybGF5X2luZm8vcXJfY29kZV9vdmVybGF5LmNjCkBAIC0xNDcsNyArMTQ3LDcgQEAKIAogICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6b3ZlcmxheV9pbmZvIiwgIkFuaW1hdGVDQigpIik7CiAKLSAgT3ZlcmxheUluZm9SZWdpc3RyeTo6UmVnaXN0ZXIoIm92ZXJsYXlfaW5mbyIsICZzX2ZyYW1lX2NvdW50XywKKyAgT3ZlcmxheUluZm9SZWdpc3RyeTo6UmVnaXN0ZXIoIm92ZXJsYXlfaW5mbzpmcmFtZV9jb3VudCIsICZzX2ZyYW1lX2NvdW50XywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHNfZnJhbWVfY291bnRfKSk7CiAgICsrc19mcmFtZV9jb3VudF87CiAKQEAgLTE1OSwyMCArMTU5LDE0IEBACiAgICAgcmV0dXJuOwogICB9CiAKLSAgLy8gVE9ETzogRXhwbG9yZSB0aGUgb3B0aW9uIHRvIHN0b3JlIHRoZSB3aG9sZSB8aW5mb3N8IGJpbmFyeSBpbnRvIG9uZSBnaWFudAotICAvLyAgICAgICBRUiBjb2RlIG9yIGNvbWJpbmUgdGhlIHZhbHVlcyBpbnRvIHNldmVyYWwgbGFyZ2UgUVIgY29kZXMuCisgIC8vIFVzZSBhIHZlY3RvciBpbiBjYXNlIHdlIGRlY2lkZSB0byBzd2l0Y2ggYmFjayB0byBtdWx0aXBsZSBxciBjb2Rlcy4KICAgc3RkOjp2ZWN0b3I8UXJDb2RlPiBxcl9jb2RlczsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmZvcy5zaXplKCk7ICsraSkgewotICAgIERDSEVDS19MVChpbmZvc1tpXSArIGksIGluZm9zLnNpemUoKSk7Ci0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YShpbmZvcy5iZWdpbigpICsgaSArIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcy5iZWdpbigpICsgaSArIDEgKyBpbmZvc1tpXSk7Ci0gICAgcXJfY29kZXMuZW1wbGFjZV9iYWNrKFFyQ29kZTo6ZW5jb2RlQmluYXJ5KGRhdGEsIFFyQ29kZTo6RWNjOjpMT1cpKTsKLSAgICBpICs9IGluZm9zW2ldOwotICB9CisgIHFyX2NvZGVzLmVtcGxhY2VfYmFjayhRckNvZGU6OmVuY29kZUJpbmFyeShpbmZvcywgUXJDb2RlOjpFY2M6OkxPVykpOwogCiAgIGltYWdlX25vZGUtPnNvdXJjZSA9CiAgICAgICBDcmVhdGVJbWFnZUZvclFyQ29kZXMocXJfY29kZXMsIHNjcmVlbl9zaXplLCByZXNvdXJjZV9wcm92aWRlcik7CiAgIGF1dG8gaW1hZ2Vfc2l6ZSA9IGltYWdlX25vZGUtPnNvdXJjZS0+R2V0U2l6ZSgpOworICAvLyBUT0RPOiBNb3ZlIHRoZSBRUiBjb2RlIGJldHdlZW4gZHJhd3MgdG8gYXZvaWQgdGVhcmluZy4KICAgaW1hZ2Vfbm9kZS0+ZGVzdGluYXRpb25fcmVjdCA9CiAgICAgICBtYXRoOjpSZWN0RihrU2NyZWVuTWFyZ2luSW5QaXhlbHMsIGtTY3JlZW5NYXJnaW5JblBpeGVscywKICAgICAgICAgICAgICAgICAgIGltYWdlX3NpemUud2lkdGgoKSwgaW1hZ2Vfc2l6ZS5oZWlnaHQoKSk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL2RlZmF1bHRfb3B0aW9uc19zdGFyYm9hcmQuZ3lwIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9kZWZhdWx0X29wdGlvbnNfc3RhcmJvYXJkLmd5cAppbmRleCA5OTBmZmE2Li40OGRmM2ZhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL2RlZmF1bHRfb3B0aW9uc19zdGFyYm9hcmQuZ3lwCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvZGVmYXVsdF9vcHRpb25zX3N0YXJib2FyZC5neXAKQEAgLTIxLDcgKzIxLDcgQEAKICAgICAgICAgJ3JlbmRlcmVyX3BhcmFtZXRlcnNfc2V0dXAuZ3lwaScsCiAgICAgICBdLAogICAgICAgJ3NvdXJjZXMnOiBbCi0gICAgICAgICc8KERFUFRIKS9jb2JhbHQvcmVuZGVyZXIvcmVuZGVyZXJfbW9kdWxlX2RlZmF1bHRfb3B0aW9uc19zdGFyYm9hcmQuY2MnLAorICAgICAgICAnPChERVBUSCkvY29iYWx0L3JlbmRlcmVyL2dldF9kZWZhdWx0X3Jhc3Rlcml6ZXJfZm9yX3BsYXRmb3JtLmNjJywKICAgICAgIF0sCiAgICAgfSwKICAgXSwKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvZ2V0X2RlZmF1bHRfcmFzdGVyaXplcl9mb3JfcGxhdGZvcm0uY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL2dldF9kZWZhdWx0X3Jhc3Rlcml6ZXJfZm9yX3BsYXRmb3JtLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwODExMGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL2dldF9kZWZhdWx0X3Jhc3Rlcml6ZXJfZm9yX3BsYXRmb3JtLmNjCkBAIC0wLDAgKzEsMTI3IEBACisvLyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL2dldF9kZWZhdWx0X3Jhc3Rlcml6ZXJfZm9yX3BsYXRmb3JtLmgiCisKKyNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9ncmFwaGljc19jb250ZXh0LmgiCisjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9oYXJkd2FyZV9yYXN0ZXJpemVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9zb2Z0d2FyZV9yYXN0ZXJpemVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL2hhcmR3YXJlX3Jhc3Rlcml6ZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc29mdHdhcmVfcmFzdGVyaXplci5oIgorI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaGFyZHdhcmVfcmFzdGVyaXplci5oIgorI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3N0dWIvcmFzdGVyaXplci5oIgorI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9yZW5kZXJlcl9tb2R1bGUuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgcmVuZGVyZXIgeworCituYW1lc3BhY2UgeworCisjaWYgQ09CQUxUX0ZPUkNFX1NUVUJfUkFTVEVSSVpFUgorc2NvcGVkX3B0cjxyYXN0ZXJpemVyOjpSYXN0ZXJpemVyPiBDcmVhdGVTdHViUmFzdGVyaXplcigKKyAgICBiYWNrZW5kOjpHcmFwaGljc0NvbnRleHQqIGdyYXBoaWNzX2NvbnRleHQsCisgICAgY29uc3QgUmVuZGVyZXJNb2R1bGU6Ok9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUihncmFwaGljc19jb250ZXh0KTsKKyAgcmV0dXJuIHNjb3BlZF9wdHI8cmFzdGVyaXplcjo6UmFzdGVyaXplcj4obmV3IHJhc3Rlcml6ZXI6OnN0dWI6OlJhc3Rlcml6ZXIoKSk7Cit9CisjZW5kaWYgIC8vIENPQkFMVF9GT1JDRV9TVFVCX1JBU1RFUklaRVIKKworI2lmIFNCX0hBUyhHTEVTMikKK3Njb3BlZF9wdHI8cmFzdGVyaXplcjo6UmFzdGVyaXplcj4gQ3JlYXRlR0xFU1NvZnR3YXJlUmFzdGVyaXplcigKKyAgICBiYWNrZW5kOjpHcmFwaGljc0NvbnRleHQqIGdyYXBoaWNzX2NvbnRleHQsCisgICAgY29uc3QgUmVuZGVyZXJNb2R1bGU6Ok9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgcmV0dXJuIHNjb3BlZF9wdHI8cmFzdGVyaXplcjo6UmFzdGVyaXplcj4oCisgICAgICBuZXcgcmFzdGVyaXplcjo6ZWdsOjpTb2Z0d2FyZVJhc3Rlcml6ZXIoCisgICAgICAgICAgZ3JhcGhpY3NfY29udGV4dCwgb3B0aW9ucy5wdXJnZV9za2lhX2ZvbnRfY2FjaGVzX29uX2Rlc3RydWN0aW9uKSk7Cit9CisKK3Njb3BlZF9wdHI8cmFzdGVyaXplcjo6UmFzdGVyaXplcj4gQ3JlYXRlR0xFU0hhcmR3YXJlUmFzdGVyaXplcigKKyAgICBiYWNrZW5kOjpHcmFwaGljc0NvbnRleHQqIGdyYXBoaWNzX2NvbnRleHQsCisgICAgY29uc3QgUmVuZGVyZXJNb2R1bGU6Ok9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgcmV0dXJuIHNjb3BlZF9wdHI8cmFzdGVyaXplcjo6UmFzdGVyaXplcj4oCisgICAgICBuZXcgcmFzdGVyaXplcjo6ZWdsOjpIYXJkd2FyZVJhc3Rlcml6ZXIoCisgICAgICAgICAgZ3JhcGhpY3NfY29udGV4dCwgb3B0aW9ucy5za2lhX2dseXBoX3RleHR1cmVfYXRsYXNfZGltZW5zaW9ucy53aWR0aCgpLAorICAgICAgICAgIG9wdGlvbnMuc2tpYV9nbHlwaF90ZXh0dXJlX2F0bGFzX2RpbWVuc2lvbnMuaGVpZ2h0KCksCisgICAgICAgICAgb3B0aW9ucy5za2lhX2NhY2hlX3NpemVfaW5fYnl0ZXMsCisgICAgICAgICAgb3B0aW9ucy5zY3JhdGNoX3N1cmZhY2VfY2FjaGVfc2l6ZV9pbl9ieXRlcywKKyAgICAgICAgICBvcHRpb25zLm9mZnNjcmVlbl90YXJnZXRfY2FjaGVfc2l6ZV9pbl9ieXRlcywKKyAgICAgICAgICBvcHRpb25zLnB1cmdlX3NraWFfZm9udF9jYWNoZXNfb25fZGVzdHJ1Y3Rpb24sCisgICAgICAgICAgb3B0aW9ucy5mb3JjZV9kZXRlcm1pbmlzdGljX3JlbmRlcmluZykpOworfQorCitzY29wZWRfcHRyPHJhc3Rlcml6ZXI6OlJhc3Rlcml6ZXI+IENyZWF0ZVNraWFIYXJkd2FyZVJhc3Rlcml6ZXIoCisgICAgYmFja2VuZDo6R3JhcGhpY3NDb250ZXh0KiBncmFwaGljc19jb250ZXh0LAorICAgIGNvbnN0IFJlbmRlcmVyTW9kdWxlOjpPcHRpb25zJiBvcHRpb25zKSB7CisgIHJldHVybiBzY29wZWRfcHRyPHJhc3Rlcml6ZXI6OlJhc3Rlcml6ZXI+KAorICAgICAgbmV3IHJhc3Rlcml6ZXI6OnNraWE6OkhhcmR3YXJlUmFzdGVyaXplcigKKyAgICAgICAgICBncmFwaGljc19jb250ZXh0LCBvcHRpb25zLnNraWFfZ2x5cGhfdGV4dHVyZV9hdGxhc19kaW1lbnNpb25zLndpZHRoKCksCisgICAgICAgICAgb3B0aW9ucy5za2lhX2dseXBoX3RleHR1cmVfYXRsYXNfZGltZW5zaW9ucy5oZWlnaHQoKSwKKyAgICAgICAgICBvcHRpb25zLnNraWFfY2FjaGVfc2l6ZV9pbl9ieXRlcywKKyAgICAgICAgICBvcHRpb25zLnNjcmF0Y2hfc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzLAorICAgICAgICAgIG9wdGlvbnMucHVyZ2Vfc2tpYV9mb250X2NhY2hlc19vbl9kZXN0cnVjdGlvbiwKKyAgICAgICAgICBvcHRpb25zLmZvcmNlX2RldGVybWluaXN0aWNfcmVuZGVyaW5nKSk7Cit9CisjZW5kaWYgIC8vICNpZiBTQl9IQVMoR0xFUzIpCisKKyNpZiBTQl9IQVMoQkxJVFRFUikKK3Njb3BlZF9wdHI8cmFzdGVyaXplcjo6UmFzdGVyaXplcj4gQ3JlYXRlQmxpdHRlclNvZnR3YXJlUmFzdGVyaXplcigKKyAgICBiYWNrZW5kOjpHcmFwaGljc0NvbnRleHQqIGdyYXBoaWNzX2NvbnRleHQsCisgICAgY29uc3QgUmVuZGVyZXJNb2R1bGU6Ok9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgcmV0dXJuIHNjb3BlZF9wdHI8cmFzdGVyaXplcjo6UmFzdGVyaXplcj4oCisgICAgICBuZXcgcmFzdGVyaXplcjo6YmxpdHRlcjo6U29mdHdhcmVSYXN0ZXJpemVyKAorICAgICAgICAgIGdyYXBoaWNzX2NvbnRleHQsIG9wdGlvbnMucHVyZ2Vfc2tpYV9mb250X2NhY2hlc19vbl9kZXN0cnVjdGlvbikpOworfQorCitzY29wZWRfcHRyPHJhc3Rlcml6ZXI6OlJhc3Rlcml6ZXI+IENyZWF0ZUJsaXR0ZXJIYXJkd2FyZVJhc3Rlcml6ZXIoCisgICAgYmFja2VuZDo6R3JhcGhpY3NDb250ZXh0KiBncmFwaGljc19jb250ZXh0LAorICAgIGNvbnN0IFJlbmRlcmVyTW9kdWxlOjpPcHRpb25zJiBvcHRpb25zKSB7CisgIHJldHVybiBzY29wZWRfcHRyPHJhc3Rlcml6ZXI6OlJhc3Rlcml6ZXI+KAorICAgICAgbmV3IHJhc3Rlcml6ZXI6OmJsaXR0ZXI6OkhhcmR3YXJlUmFzdGVyaXplcigKKyAgICAgICAgICBncmFwaGljc19jb250ZXh0LCBvcHRpb25zLnNraWFfZ2x5cGhfdGV4dHVyZV9hdGxhc19kaW1lbnNpb25zLndpZHRoKCksCisgICAgICAgICAgb3B0aW9ucy5za2lhX2dseXBoX3RleHR1cmVfYXRsYXNfZGltZW5zaW9ucy5oZWlnaHQoKSwKKyAgICAgICAgICBvcHRpb25zLnNjcmF0Y2hfc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzLAorICAgICAgICAgIG9wdGlvbnMuc29mdHdhcmVfc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzLAorICAgICAgICAgIG9wdGlvbnMucHVyZ2Vfc2tpYV9mb250X2NhY2hlc19vbl9kZXN0cnVjdGlvbikpOworfQorI2VuZGlmICAvLyBTQl9IQVMoQkxJVFRFUikKKworfSAgLy8gbmFtZXNwYWNlCisKK1Jhc3Rlcml6ZXJJbmZvIEdldERlZmF1bHRSYXN0ZXJpemVyRm9yUGxhdGZvcm0oKSB7CisjaWYgQ09CQUxUX0ZPUkNFX1NUVUJfUkFTVEVSSVpFUgorICByZXR1cm4geyJzdHViIiwgYmFzZTo6QmluZCgmQ3JlYXRlU3R1YlJhc3Rlcml6ZXIpfTsKKyNlbHNlCisjaWYgU0JfSEFTKEdMRVMyKQorI2lmIENPQkFMVF9GT1JDRV9TT0ZUV0FSRV9SQVNURVJJWkVSCisgIHJldHVybiB7ImdsZXMtc29mdHdhcmUiLCBiYXNlOjpCaW5kKCZDcmVhdGVHTEVTU29mdHdhcmVSYXN0ZXJpemVyKX07CisjZWxpZiBkZWZpbmVkKENPQkFMVF9GT1JDRV9ESVJFQ1RfR0xFU19SQVNURVJJWkVSKQorICByZXR1cm4geyJnbGVzIiwgYmFzZTo6QmluZCgmQ3JlYXRlR0xFU0hhcmR3YXJlUmFzdGVyaXplcil9OworI2Vsc2UKKyAgcmV0dXJuIHsic2tpYSIsIGJhc2U6OkJpbmQoJkNyZWF0ZVNraWFIYXJkd2FyZVJhc3Rlcml6ZXIpfTsKKyNlbmRpZiAgLy8gQ09CQUxUX0ZPUkNFX1NPRlRXQVJFX1JBU1RFUklaRVIKKyNlbGlmIFNCX0hBUyhCTElUVEVSKQorI2lmIENPQkFMVF9GT1JDRV9TT0ZUV0FSRV9SQVNURVJJWkVSCisgIHJldHVybiB7ImJsaXR0ZXItc29mdHdhcmUiLCBiYXNlOjpCaW5kKCZDcmVhdGVCbGl0dGVyU29mdHdhcmVSYXN0ZXJpemVyKX07CisjZWxzZQorICByZXR1cm4geyJibGl0dGVyIiwgYmFzZTo6QmluZCgmQ3JlYXRlQmxpdHRlckhhcmR3YXJlUmFzdGVyaXplcil9OworI2VuZGlmICAvLyBDT0JBTFRfRk9SQ0VfU09GVFdBUkVfUkFTVEVSSVpFUgorI2Vsc2UKKyNlcnJvciAiRWl0aGVyIEdMRVMyIG9yIHRoZSBTdGFyYm9hcmQgQmxpdHRlciBBUEkgbXVzdCBiZSBhdmFpbGFibGUuIgorICByZXR1cm4geyIiLCBOVUxMfTsKKyNlbmRpZgorI2VuZGlmICAvLyAjaWYgQ09CQUxUX0ZPUkNFX1NUVUJfUkFTVEVSSVpFUgorfQorCit9ICAvLyBuYW1lc3BhY2UgcmVuZGVyZXIKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvZ2V0X2RlZmF1bHRfcmFzdGVyaXplcl9mb3JfcGxhdGZvcm0uaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvZ2V0X2RlZmF1bHRfcmFzdGVyaXplcl9mb3JfcGxhdGZvcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDZlZDI2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9nZXRfZGVmYXVsdF9yYXN0ZXJpemVyX2Zvcl9wbGF0Zm9ybS5oCkBAIC0wLDAgKzEsMzUgQEAKKy8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgQ09CQUxUX1JFTkRFUkVSX0dFVF9ERUZBVUxUX1JBU1RFUklaRVJfRk9SX1BMQVRGT1JNX0hfCisjZGVmaW5lIENPQkFMVF9SRU5ERVJFUl9HRVRfREVGQVVMVF9SQVNURVJJWkVSX0ZPUl9QTEFURk9STV9IXworCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL3JlbmRlcmVyX21vZHVsZS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSByZW5kZXJlciB7CisKK3N0cnVjdCBSYXN0ZXJpemVySW5mbyB7CisgIHN0ZDo6c3RyaW5nIHJhc3Rlcml6ZXJfbmFtZTsKKyAgUmVuZGVyZXJNb2R1bGU6Ok9wdGlvbnM6OkNyZWF0ZVJhc3Rlcml6ZXJDYWxsYmFjayBjcmVhdGVfcmFzdGVyaXplcl9jYWxsYmFjazsKK307CisKK1Jhc3Rlcml6ZXJJbmZvIEdldERlZmF1bHRSYXN0ZXJpemVyRm9yUGxhdGZvcm0oKTsKKworfSAgLy8gbmFtZXNwYWNlIHJlbmRlcmVyCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gQ09CQUxUX1JFTkRFUkVSX0dFVF9ERUZBVUxUX1JBU1RFUklaRVJfRk9SX1BMQVRGT1JNX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3BpcGVsaW5lLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9waXBlbGluZS5jYwppbmRleCAzZWMzNmMxLi5jN2E4ZjYxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3BpcGVsaW5lLmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcGlwZWxpbmUuY2MKQEAgLTM2MywzNiArMzYzLDI2IEBACiAgIGJvb2wgYW5pbWF0aW9uc19hY3RpdmUgPQogICAgICAgIWFyZV9zdGF0X3RyYWNrZWRfYW5pbWF0aW9uc19leHBpcmVkICYmIGRpZF9yYXN0ZXJpemU7CiAKKyAgLy8gUmFzdGVyaXphdGlvbnMgYXJlIG9ubHkgdHJhY2tlZCBieSB0aGUgdGltZXJzIHdoZW4gdGhlcmUgYXJlIGFuaW1hdGlvbnMuCisgIC8vIFRoaXMgYXBwbGllcyB3aGVuIGFuaW1hdGlvbnMgd2VyZSBhY3RpdmUgZHVyaW5nIGVpdGhlciB0aGUgbGFzdAorICAvLyByYXN0ZXJpemF0aW9uIG9yIHRoZSBjdXJyZW50IG9uZS4gVGhlIHJlYXNvbiBmb3IgaW5jbHVkaW5nIHRoZSBsYXN0IG9uZSBpcworICAvLyB0aGF0IGlmIGFuaW1hdGlvbnMgaGF2ZSBqdXN0IGV4cGlyZWQsIHRoZW4gdGhpcyByYXN0ZXJpemF0aW9uIHByb2R1Y2VzIHRoZQorICAvLyBmaW5hbCBzdGF0ZSBvZiB0aGUgYW5pbWF0ZWQgdHJlZS4KICAgaWYgKGxhc3RfYW5pbWF0aW9uc19hY3RpdmUgfHwgYW5pbWF0aW9uc19hY3RpdmUpIHsKLSAgICAvLyBUaGUgcmFzdGVyaXphdGlvbiBpcyBvbmx5IHRpbWVkIHdpdGggdGhlIGFuaW1hdGlvbnMgdGltZXIgd2hlbiB0aGVyZSBhcmUKLSAgICAvLyBhbmltYXRpb25zIHRvIHRyYWNrLiBUaGlzIGFwcGxpZXMgd2hlbiBhbmltYXRpb25zIHdlcmUgYWN0aXZlIGR1cmluZwotICAgIC8vIGVpdGhlciB0aGUgbGFzdCByYXN0ZXJpemF0aW9uIG9yIHRoZSBjdXJyZW50IG9uZS4gVGhlIHJlYXNvbiBmb3IKLSAgICAvLyBpbmNsdWRpbmcgdGhlIGxhc3Qgb25lIGlzIHRoYXQgaWYgYW5pbWF0aW9ucyBoYXZlIGp1c3QgZXhwaXJlZCwgdGhlbiB0aGlzCi0gICAgLy8gcmFzdGVyaXphdGlvbiBwcm9kdWNlcyB0aGUgZmluYWwgc3RhdGUgb2YgdGhlIGFuaW1hdGVkIHRyZWUuCiAgICAgaWYgKGRpZF9yYXN0ZXJpemUpIHsKICAgICAgIHJhc3Rlcml6ZV9hbmltYXRpb25zX3RpbWVyXy5TdGFydChzdGFydF90aW1lKTsKICAgICAgIHJhc3Rlcml6ZV9hbmltYXRpb25zX3RpbWVyXy5TdG9wKGVuZF90aW1lKTsKLSAgICB9CiAKLSAgICAvLyBJZiBhbmltYXRpb25zIGFyZSBnb2luZyBmcm9tIGJlaW5nIGluYWN0aXZlIHRvIGFjdGl2ZSwgdGhlbiBzZXQgdGhlIGNfdmFsCi0gICAgLy8gcHJpb3IgdG8gc3RhcnRpbmcgdGhlIGFuaW1hdGlvbiBzbyB0aGF0IGl0J3MgaW4gdGhlIGNvcnJlY3Qgc3RhdGUgd2hpbGUKLSAgICAvLyB0aGUgdHJlZSBpcyBiZWluZyByZW5kZXJlZC4KLSAgICAvLyBBbHNvLCBzdGFydCB0aGUgaW50ZXJ2YWwgdGltZXIgbm93LiBXaGlsZSB0aGUgZmlyc3QgZW50cnkgb25seSBjYXB0dXJlcyBhCi0gICAgLy8gcGFydGlhbCBpbnRlcnZhbCwgaXQncyByZWNvcmRlZCB0byBpbmNsdWRlIHRoZSBkdXJhdGlvbiBvZiB0aGUgZmlyc3QKLSAgICAvLyBzdWJtaXNzaW9uLiBBbGwgc3Vic2VxdWVudCBlbnRyaWVzIHdpbGwgcmVjb3JkIGEgZnVsbCBpbnRlcnZhbC4KLSAgICBpZiAoIWxhc3RfYW5pbWF0aW9uc19hY3RpdmUgJiYgYW5pbWF0aW9uc19hY3RpdmUpIHsKLSAgICAgIGhhc19hY3RpdmVfYW5pbWF0aW9uc19jX3ZhbF8gPSB0cnVlOwotICAgICAgcmFzdGVyaXplX3BlcmlvZGljX2ludGVydmFsX3RpbWVyXy5TdGFydChzdGFydF90aW1lKTsKLSAgICAgIHJhc3Rlcml6ZV9hbmltYXRpb25zX2ludGVydmFsX3RpbWVyXy5TdGFydChzdGFydF90aW1lKTsKLSAgICB9Ci0KLSAgICBpZiAoIWRpZF9yYXN0ZXJpemUpIHsKLSAgICAgIC8vIElmIHdlIGRpZG4ndCBhY3R1YWxseSByYXN0ZXJpemUgYW55dGhpbmcsIGRvbid0IGNvdW50IHRoaXMgc2FtcGxlLgorICAgICAgLy8gVGhlIGludGVydmFsIHRpbWVycyByZXF1aXJlIGFuaW1hdGlvbnMgdG8gaGF2ZSBiZWVuIGFjdGl2ZSB0aGUgcHJldmlvdXMKKyAgICAgIC8vIGZyYW1lIHNvIHRoYXQgdGhlcmUgaXMgYSBmdWxsIGludGVydmFsIHRvIHJlY29yZC4KKyAgICAgIGlmIChsYXN0X2FuaW1hdGlvbnNfYWN0aXZlKSB7CisgICAgICAgIHJhc3Rlcml6ZV9wZXJpb2RpY19pbnRlcnZhbF90aW1lcl8uU3RvcChlbmRfdGltZSk7CisgICAgICAgIHJhc3Rlcml6ZV9hbmltYXRpb25zX2ludGVydmFsX3RpbWVyXy5TdG9wKGVuZF90aW1lKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLy8gSWYgd2UgZGlkbid0IGFjdHVhbGx5IHJhc3Rlcml6ZSBhbnl0aGluZywgdGhlbiBkb24ndCBjb3VudCB0aGlzIHNhbXBsZS4KICAgICAgIHJhc3Rlcml6ZV9wZXJpb2RpY19pbnRlcnZhbF90aW1lcl8uQ2FuY2VsKCk7CiAgICAgICByYXN0ZXJpemVfYW5pbWF0aW9uc19pbnRlcnZhbF90aW1lcl8uQ2FuY2VsKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJhc3Rlcml6ZV9wZXJpb2RpY19pbnRlcnZhbF90aW1lcl8uU3RvcChlbmRfdGltZSk7Ci0gICAgICByYXN0ZXJpemVfYW5pbWF0aW9uc19pbnRlcnZhbF90aW1lcl8uU3RvcChlbmRfdGltZSk7CiAgICAgfQogCiAgICAgLy8gSWYgYW5pbWF0aW9ucyBhcmUgYWN0aXZlLCB0aGVuIHRoZXkgYXJlIGd1YXJhbnRlZWQgYXQgbGVhc3Qgb25lIG1vcmUKQEAgLTQwNSwxMSArMzk1LDEyIEBACiAgICAgLy8gQ2hlY2sgZm9yIGlmIHRoZSBhbmltYXRpb25zIGFyZSBzdGFydGluZyBvciBlbmRpbmcuCiAgICAgaWYgKCFsYXN0X2FuaW1hdGlvbnNfYWN0aXZlICYmIGFuaW1hdGlvbnNfYWN0aXZlKSB7CiAgICAgICBhbmltYXRpb25zX3N0YXJ0X3RpbWVfID0gZW5kX3RpbWUuVG9JbnRlcm5hbFZhbHVlKCk7CisgICAgICBoYXNfYWN0aXZlX2FuaW1hdGlvbnNfY192YWxfID0gdHJ1ZTsKICAgICB9IGVsc2UgaWYgKGxhc3RfYW5pbWF0aW9uc19hY3RpdmUgJiYgIWFuaW1hdGlvbnNfYWN0aXZlKSB7CiAgICAgICBhbmltYXRpb25zX2VuZF90aW1lXyA9IGVuZF90aW1lLlRvSW50ZXJuYWxWYWx1ZSgpOwotICAgICAgaGFzX2FjdGl2ZV9hbmltYXRpb25zX2NfdmFsXyA9IGZhbHNlOwogICAgICAgcmFzdGVyaXplX2FuaW1hdGlvbnNfaW50ZXJ2YWxfdGltZXJfLkZsdXNoKCk7CiAgICAgICByYXN0ZXJpemVfYW5pbWF0aW9uc190aW1lcl8uRmx1c2goKTsKKyAgICAgIGhhc19hY3RpdmVfYW5pbWF0aW9uc19jX3ZhbF8gPSBmYWxzZTsKICAgICB9CiAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9oYXJkd2FyZV9yYXN0ZXJpemVyLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9oYXJkd2FyZV9yYXN0ZXJpemVyLmNjCmluZGV4IDkwMTY2MWQuLjE4OWE0ZmUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvaGFyZHdhcmVfcmFzdGVyaXplci5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL2hhcmR3YXJlX3Jhc3Rlcml6ZXIuY2MKQEAgLTUxLDcgKzUxLDcgQEAKICAgICAgICAgICAgICAgICBpbnQgc2NyYXRjaF9zdXJmYWNlX2NhY2hlX3NpemVfaW5fYnl0ZXMsCiAgICAgICAgICAgICAgICAgaW50IG9mZnNjcmVlbl90YXJnZXRfY2FjaGVfc2l6ZV9pbl9ieXRlcywKICAgICAgICAgICAgICAgICBib29sIHB1cmdlX3NraWFfZm9udF9jYWNoZXNfb25fZGVzdHJ1Y3Rpb24sCi0gICAgICAgICAgICAgICAgYm9vbCBkaXNhYmxlX3Jhc3Rlcml6ZXJfY2FjaGluZyk7CisgICAgICAgICAgICAgICAgYm9vbCBmb3JjZV9kZXRlcm1pbmlzdGljX3JlbmRlcmluZyk7CiAgIH5JbXBsKCk7CiAKICAgdm9pZCBTdWJtaXQoY29uc3Qgc2NvcGVkX3JlZnB0cjxyZW5kZXJfdHJlZTo6Tm9kZT4mIHJlbmRlcl90cmVlLApAQCAtODIsNiArODIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0aDo6UmVjdCYgY29udGVudF9yZWN0KTsKIAogICBza19zcDxTa1N1cmZhY2U+IENyZWF0ZUZhbGxiYWNrU3VyZmFjZSgKKyAgICAgIGJvb2wgZm9yY2VfZGV0ZXJtaW5pc3RpY19yZW5kZXJpbmcsCiAgICAgICBjb25zdCBiYWNrZW5kOjpSZW5kZXJUYXJnZXQqIHJlbmRlcl90YXJnZXQpOwogCiAgIHNjb3BlZF9wdHI8c2tpYTo6SGFyZHdhcmVSYXN0ZXJpemVyPiBmYWxsYmFja19yYXN0ZXJpemVyXzsKQEAgLTk5LDExICsxMDAsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2NyYXRjaF9zdXJmYWNlX2NhY2hlX3NpemVfaW5fYnl0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNjcmVlbl90YXJnZXRfY2FjaGVfc2l6ZV9pbl9ieXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHB1cmdlX3NraWFfZm9udF9jYWNoZXNfb25fZGVzdHJ1Y3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkaXNhYmxlX3Jhc3Rlcml6ZXJfY2FjaGluZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlX2RldGVybWluaXN0aWNfcmVuZGVyaW5nKQogICAgIDogZmFsbGJhY2tfcmFzdGVyaXplcl8obmV3IHNraWE6OkhhcmR3YXJlUmFzdGVyaXplcigKICAgICAgICAgICBncmFwaGljc19jb250ZXh0LCBza2lhX2F0bGFzX3dpZHRoLCBza2lhX2F0bGFzX2hlaWdodCwKICAgICAgICAgICBza2lhX2NhY2hlX3NpemVfaW5fYnl0ZXMsIHNjcmF0Y2hfc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzLAotICAgICAgICAgIHB1cmdlX3NraWFfZm9udF9jYWNoZXNfb25fZGVzdHJ1Y3Rpb24pKSwKKyAgICAgICAgICBwdXJnZV9za2lhX2ZvbnRfY2FjaGVzX29uX2Rlc3RydWN0aW9uLAorICAgICAgICAgIGZvcmNlX2RldGVybWluaXN0aWNfcmVuZGVyaW5nKSksCiAgICAgICBncmFwaGljc19jb250ZXh0XygKICAgICAgICAgICBiYXNlOjpwb2x5bW9ycGhpY19kb3duY2FzdDxiYWNrZW5kOjpHcmFwaGljc0NvbnRleHRFR0wqPigKICAgICAgICAgICAgICAgZ3JhcGhpY3NfY29udGV4dCkpIHsKQEAgLTExNyw5ICsxMTksOSBAQAogICBvZmZzY3JlZW5fdGFyZ2V0X21hbmFnZXJfLnJlc2V0KG5ldyBPZmZzY3JlZW5UYXJnZXRNYW5hZ2VyKAogICAgICAgZ3JhcGhpY3NfY29udGV4dF8sCiAgICAgICBiYXNlOjpCaW5kKCZIYXJkd2FyZVJhc3Rlcml6ZXI6OkltcGw6OkNyZWF0ZUZhbGxiYWNrU3VyZmFjZSwKLSAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSksCisgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcyksIGZvcmNlX2RldGVybWluaXN0aWNfcmVuZGVyaW5nKSwKICAgICAgIG9mZnNjcmVlbl90YXJnZXRfY2FjaGVfc2l6ZV9pbl9ieXRlcykpOwotICBpZiAoZGlzYWJsZV9yYXN0ZXJpemVyX2NhY2hpbmcpIHsKKyAgaWYgKGZvcmNlX2RldGVybWluaXN0aWNfcmVuZGVyaW5nKSB7CiAgICAgb2Zmc2NyZWVuX3RhcmdldF9tYW5hZ2VyXy0+U2V0Q2FjaGVFcnJvclRocmVzaG9sZCgwLjBmKTsKICAgfQogfQpAQCAtMjgxLDYgKzI4Myw3IEBACiB9CiAKIHNrX3NwPFNrU3VyZmFjZT4gSGFyZHdhcmVSYXN0ZXJpemVyOjpJbXBsOjpDcmVhdGVGYWxsYmFja1N1cmZhY2UoCisgICAgYm9vbCBmb3JjZV9kZXRlcm1pbmlzdGljX3JlbmRlcmluZywKICAgICBjb25zdCBiYWNrZW5kOjpSZW5kZXJUYXJnZXQqIHJlbmRlcl90YXJnZXQpIHsKICAgLy8gV3JhcCB0aGUgZ2l2ZW4gcmVuZGVyIHRhcmdldCBpbiBhIG5ldyBza2lhIHN1cmZhY2UuCiAgIEdyQmFja2VuZFJlbmRlclRhcmdldERlc2Mgc2tpYV9kZXNjOwpAQCAtMjkyLDkgKzI5NSwxNiBAQAogICBza2lhX2Rlc2MuZlN0ZW5jaWxCaXRzID0gMDsKICAgc2tpYV9kZXNjLmZSZW5kZXJUYXJnZXRIYW5kbGUgPSByZW5kZXJfdGFyZ2V0LT5HZXRQbGF0Zm9ybUhhbmRsZSgpOwogCi0gIFNrU3VyZmFjZVByb3BzIHNraWFfc3VyZmFjZV9wcm9wcygKLSAgICAgIFNrU3VyZmFjZVByb3BzOjprVXNlRGlzdGFuY2VGaWVsZEZvbnRzX0ZsYWcsCi0gICAgICBTa1N1cmZhY2VQcm9wczo6a0xlZ2FjeUZvbnRIb3N0X0luaXRUeXBlKTsKKyAgdWludDMyX3QgZmxhZ3MgPSAwOworICBpZiAoIWZvcmNlX2RldGVybWluaXN0aWNfcmVuZGVyaW5nKSB7CisgICAgLy8gRGlzdGFuY2UgZmllbGQgZm9udHMgYXJlIGtub3duIHRvIHJlc3VsdCBpbiBub24tZGV0ZXJtaW5pc3RpYyBncmFwaGljYWwsCisgICAgLy8gc2luY2UgdGhlIG91dHB1dCBkZXBlbmRzIG9uIHRoZSBzaXplIG9mIHRoZSBnbHlwaCB0aGF0IGVudGVycyB0aGUgYXRsYXMKKyAgICAvLyBmaXJzdCAod2hpY2ggd291bGQgZ2V0IHJlLXVzZWQgZm9yIHNpbWlsYXJseSBidXQgdW5lcXVhbCBzaXplZAorICAgIC8vIHN1YnNlcXVlbnQgZ2x5cGhzKS4KKyAgICBmbGFncyA9IFNrU3VyZmFjZVByb3BzOjprVXNlRGlzdGFuY2VGaWVsZEZvbnRzX0ZsYWc7CisgIH0KKyAgU2tTdXJmYWNlUHJvcHMgc2tpYV9zdXJmYWNlX3Byb3BzKGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tTdXJmYWNlUHJvcHM6OmtMZWdhY3lGb250SG9zdF9Jbml0VHlwZSk7CiAgIHJldHVybiBTa1N1cmZhY2U6Ok1ha2VGcm9tQmFja2VuZFJlbmRlclRhcmdldChHZXRGYWxsYmFja0NvbnRleHQoKSwgc2tpYV9kZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNraWFfc3VyZmFjZV9wcm9wcyk7CiB9CkBAIC0zMDUsMTMgKzMxNSwxMyBAQAogICAgIGludCBzY3JhdGNoX3N1cmZhY2VfY2FjaGVfc2l6ZV9pbl9ieXRlcywKICAgICBpbnQgb2Zmc2NyZWVuX3RhcmdldF9jYWNoZV9zaXplX2luX2J5dGVzLAogICAgIGJvb2wgcHVyZ2Vfc2tpYV9mb250X2NhY2hlc19vbl9kZXN0cnVjdGlvbiwKLSAgICBib29sIGRpc2FibGVfcmFzdGVyaXplcl9jYWNoaW5nKQotICAgIDogaW1wbF8obmV3IEltcGwoCi0gICAgICAgICAgZ3JhcGhpY3NfY29udGV4dCwgc2tpYV9hdGxhc193aWR0aCwgc2tpYV9hdGxhc19oZWlnaHQsCi0gICAgICAgICAgc2tpYV9jYWNoZV9zaXplX2luX2J5dGVzLCBzY3JhdGNoX3N1cmZhY2VfY2FjaGVfc2l6ZV9pbl9ieXRlcywKLSAgICAgICAgICBvZmZzY3JlZW5fdGFyZ2V0X2NhY2hlX3NpemVfaW5fYnl0ZXMsCi0gICAgICAgICAgcHVyZ2Vfc2tpYV9mb250X2NhY2hlc19vbl9kZXN0cnVjdGlvbiwgZGlzYWJsZV9yYXN0ZXJpemVyX2NhY2hpbmcpKSB7Ci19CisgICAgYm9vbCBmb3JjZV9kZXRlcm1pbmlzdGljX3JlbmRlcmluZykKKyAgICA6IGltcGxfKG5ldyBJbXBsKGdyYXBoaWNzX2NvbnRleHQsIHNraWFfYXRsYXNfd2lkdGgsIHNraWFfYXRsYXNfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgc2tpYV9jYWNoZV9zaXplX2luX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgc2NyYXRjaF9zdXJmYWNlX2NhY2hlX3NpemVfaW5fYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICBvZmZzY3JlZW5fdGFyZ2V0X2NhY2hlX3NpemVfaW5fYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICBwdXJnZV9za2lhX2ZvbnRfY2FjaGVzX29uX2Rlc3RydWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgZm9yY2VfZGV0ZXJtaW5pc3RpY19yZW5kZXJpbmcpKSB7fQogCiBIYXJkd2FyZVJhc3Rlcml6ZXI6On5IYXJkd2FyZVJhc3Rlcml6ZXIoKSB7fQogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL2hhcmR3YXJlX3Jhc3Rlcml6ZXIuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvaGFyZHdhcmVfcmFzdGVyaXplci5oCmluZGV4IDRmMWU4NWQuLmJiNjBlOWUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvaGFyZHdhcmVfcmFzdGVyaXplci5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvaGFyZHdhcmVfcmFzdGVyaXplci5oCkBAIC00NiwxNiArNDYsMTYgQEAKICAgLy8gaG93IG11Y2ggR1BVIG1lbW9yeSBpcyB1c2VkIHRvIHNhdmUgdGhlIHJlc3VsdHMgb2YgcmVuZGVyIHRyZWUgbm9kZXMgdG8KICAgLy8gaW1wcm92ZSBwZXJmb3JtYW5jZS4gVGhpcyBzaG91bGQgYmUgbm9uLXplcm8sIG90aGVyd2lzZSBwZXJmb3JtYW5jZQogICAvLyBkZWdyYWRlcyBkcmFzdGljYWxseS4KLSAgLy8gfGRpc2FibGVfcmFzdGVyaXplcl9jYWNoaW5nfCBkaXNhYmxlcyBjYWNoaW5nIG9mIHJlbmRlciB0cmVlIG5vZGUgb3V0cHV0cy4KLSAgLy8gVGhpcyBzaWduaWZpY2FudGx5IGRlZ3JhZGVzIHBlcmZvcm1hbmNlIGJ1dCBwcm92aWRlcyBzdWItcGl4ZWwgY29ycmVjdG5lc3MuCi0gIC8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgZG9uZSBmb3IgdGVzdGluZyBwdXJwb3Nlcy4KKyAgLy8gfGZvcmNlX2RldGVybWluaXN0aWNfcmVuZGVyaW5nfCBkaXNhYmxlcyBjYWNoaW5nIG9mIHJlbmRlciB0cmVlIG5vZGUKKyAgLy8gb3V0cHV0cy4gVGhpcyBzaWduaWZpY2FudGx5IGRlZ3JhZGVzIHBlcmZvcm1hbmNlIGJ1dCBwcm92aWRlcyBzdWItcGl4ZWwKKyAgLy8gY29ycmVjdG5lc3MuIFRoaXMgc2hvdWxkIG9ubHkgYmUgZG9uZSBmb3IgdGVzdGluZyBwdXJwb3Nlcy4KICAgZXhwbGljaXQgSGFyZHdhcmVSYXN0ZXJpemVyKGJhY2tlbmQ6OkdyYXBoaWNzQ29udGV4dCogZ3JhcGhpY3NfY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBza2lhX2F0bGFzX3dpZHRoLCBpbnQgc2tpYV9hdGxhc19oZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2tpYV9jYWNoZV9zaXplX2luX2J5dGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNjcmF0Y2hfc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNjcmVlbl90YXJnZXRfY2FjaGVfc2l6ZV9pbl9ieXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHVyZ2Vfc2tpYV9mb250X2NhY2hlc19vbl9kZXN0cnVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGlzYWJsZV9yYXN0ZXJpemVyX2NhY2hpbmcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZV9kZXRlcm1pbmlzdGljX3JlbmRlcmluZyk7CiAgIHZpcnR1YWwgfkhhcmR3YXJlUmFzdGVyaXplcigpOwogCiAgIHZvaWQgU3VibWl0KGNvbnN0IHNjb3BlZF9yZWZwdHI8cmVuZGVyX3RyZWU6Ok5vZGU+JiByZW5kZXJfdHJlZSwKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9saWIvZXh0ZXJuYWxfcmFzdGVyaXplci5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9saWIvZXh0ZXJuYWxfcmFzdGVyaXplci5jYwppbmRleCAyMjQ0NTkyLi5hMDE1ZTk0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvbGliL2V4dGVybmFsX3Jhc3Rlcml6ZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2xpYi9leHRlcm5hbF9yYXN0ZXJpemVyLmNjCkBAIC0xODAsNyArMTgwLDcgQEAKICAgICAgICBpbnQgb2Zmc2NyZWVuX3RhcmdldF9jYWNoZV9zaXplX2luX2J5dGVzLAogI2VuZGlmCiAgICAgICAgYm9vbCBwdXJnZV9za2lhX2ZvbnRfY2FjaGVzX29uX2Rlc3RydWN0aW9uLAotICAgICAgIGJvb2wgZGlzYWJsZV9yYXN0ZXJpemVyX2NhY2hpbmcpOworICAgICAgIGJvb2wgZm9yY2VfZGV0ZXJtaW5pc3RpY19yZW5kZXJpbmcpOwogICB+SW1wbCgpOwogCiAgIHZvaWQgU3VibWl0KGNvbnN0IHNjb3BlZF9yZWZwdHI8cmVuZGVyX3RyZWU6Ok5vZGU+JiByZW5kZXJfdHJlZSwKQEAgLTI1NCwyMyArMjU0LDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNjcmVlbl90YXJnZXRfY2FjaGVfc2l6ZV9pbl9ieXRlcywKICNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHVyZ2Vfc2tpYV9mb250X2NhY2hlc19vbl9kZXN0cnVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRpc2FibGVfcmFzdGVyaXplcl9jYWNoaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2VfZGV0ZXJtaW5pc3RpY19yZW5kZXJpbmcpCiAgICAgOiBncmFwaGljc19jb250ZXh0XygKICAgICAgICAgICBiYXNlOjpwb2x5bW9ycGhpY19kb3duY2FzdDxiYWNrZW5kOjpHcmFwaGljc0NvbnRleHRFR0wqPigKICAgICAgICAgICAgICAgZ3JhcGhpY3NfY29udGV4dCkpLAotICAgICAgaGFyZHdhcmVfcmFzdGVyaXplcl8oZ3JhcGhpY3NfY29udGV4dCwgc2tpYV9hdGxhc193aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraWFfYXRsYXNfaGVpZ2h0LCBza2lhX2NhY2hlX3NpemVfaW5fYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JhdGNoX3N1cmZhY2VfY2FjaGVfc2l6ZV9pbl9ieXRlcywKKyAgICAgIGhhcmR3YXJlX3Jhc3Rlcml6ZXJfKAorICAgICAgICAgIGdyYXBoaWNzX2NvbnRleHQsIHNraWFfYXRsYXNfd2lkdGgsIHNraWFfYXRsYXNfaGVpZ2h0LAorICAgICAgICAgIHNraWFfY2FjaGVfc2l6ZV9pbl9ieXRlcywgc2NyYXRjaF9zdXJmYWNlX2NhY2hlX3NpemVfaW5fYnl0ZXMsCiAKICNpZiBkZWZpbmVkKENPQkFMVF9GT1JDRV9ESVJFQ1RfR0xFU19SQVNURVJJWkVSKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2NyZWVuX3RhcmdldF9jYWNoZV9zaXplX2luX2J5dGVzLAorICAgICAgICAgIG9mZnNjcmVlbl90YXJnZXRfY2FjaGVfc2l6ZV9pbl9ieXRlcywKICNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVyZ2Vfc2tpYV9mb250X2NhY2hlc19vbl9kZXN0cnVjdGlvbgotI2lmIGRlZmluZWQoQ09CQUxUX0ZPUkNFX0RJUkVDVF9HTEVTX1JBU1RFUklaRVIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlX3Jhc3Rlcml6ZXJfY2FjaGluZwotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICApLAorICAgICAgICAgIHB1cmdlX3NraWFfZm9udF9jYWNoZXNfb25fZGVzdHJ1Y3Rpb24sIGZvcmNlX2RldGVybWluaXN0aWNfcmVuZGVyaW5nKSwKICAgICAgIHJlbmRlcl90cmVlX3RlbXBfKG51bGxwdHIpLAogICAgICAgbWFpbl9yZW5kZXJfdGFyZ2V0X3RlbXBfKG51bGxwdHIpLAogICAgICAgdmlkZW9fcHJvamVjdGlvbl90eXBlXyhrQ2JMaWJWaWRlb1Byb2plY3Rpb25UeXBlTm9uZSksCkBAIC02NDksNyArNjQ0LDcgQEAKICAgICBpbnQgb2Zmc2NyZWVuX3RhcmdldF9jYWNoZV9zaXplX2luX2J5dGVzLAogI2VuZGlmCiAgICAgYm9vbCBwdXJnZV9za2lhX2ZvbnRfY2FjaGVzX29uX2Rlc3RydWN0aW9uLAotICAgIGJvb2wgZGlzYWJsZV9yYXN0ZXJpemVyX2NhY2hpbmcpCisgICAgYm9vbCBmb3JjZV9kZXRlcm1pbmlzdGljX3JlbmRlcmluZykKICAgICA6IGltcGxfKG5ldyBJbXBsKGdyYXBoaWNzX2NvbnRleHQsIHNraWFfYXRsYXNfd2lkdGgsIHNraWFfYXRsYXNfaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgc2tpYV9jYWNoZV9zaXplX2luX2J5dGVzLAogICAgICAgICAgICAgICAgICAgICAgc2NyYXRjaF9zdXJmYWNlX2NhY2hlX3NpemVfaW5fYnl0ZXMsCkBAIC02NTcsNyArNjUyLDggQEAKICAgICAgICAgICAgICAgICAgICAgIG9mZnNjcmVlbl90YXJnZXRfY2FjaGVfc2l6ZV9pbl9ieXRlcywKICNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgcHVyZ2Vfc2tpYV9mb250X2NhY2hlc19vbl9kZXN0cnVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVfcmFzdGVyaXplcl9jYWNoaW5nKSkge30KKyAgICAgICAgICAgICAgICAgICAgIGZvcmNlX2RldGVybWluaXN0aWNfcmVuZGVyaW5nKSkgeworfQogCiBFeHRlcm5hbFJhc3Rlcml6ZXI6On5FeHRlcm5hbFJhc3Rlcml6ZXIoKSB7fQogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvbGliL2V4dGVybmFsX3Jhc3Rlcml6ZXIuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9saWIvZXh0ZXJuYWxfcmFzdGVyaXplci5oCmluZGV4IDFhNmE1YTIuLjg0ZjlmNWUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9saWIvZXh0ZXJuYWxfcmFzdGVyaXplci5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9saWIvZXh0ZXJuYWxfcmFzdGVyaXplci5oCkBAIC00MSw3ICs0MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICBpbnQgcmFzdGVyaXplcl9ncHVfY2FjaGVfc2l6ZV9pbl9ieXRlcywKICNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgYm9vbCBwdXJnZV9za2lhX2ZvbnRfY2FjaGVzX29uX2Rlc3RydWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgYm9vbCBkaXNhYmxlX3Jhc3Rlcml6ZXJfY2FjaGluZyk7CisgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlX2RldGVybWluaXN0aWNfcmVuZGVyaW5nKTsKICAgdmlydHVhbCB+RXh0ZXJuYWxSYXN0ZXJpemVyKCk7CiAKICAgdm9pZCBTdWJtaXQoY29uc3Qgc2NvcGVkX3JlZnB0cjxyZW5kZXJfdHJlZTo6Tm9kZT4mIHJlbmRlcl90cmVlLApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2xpYi9nZXRfZGVmYXVsdF9yYXN0ZXJpemVyX2Zvcl9wbGF0Zm9ybV9saWIuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvbGliL2dldF9kZWZhdWx0X3Jhc3Rlcml6ZXJfZm9yX3BsYXRmb3JtX2xpYi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGNkMTY2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2xpYi9nZXRfZGVmYXVsdF9yYXN0ZXJpemVyX2Zvcl9wbGF0Zm9ybV9saWIuY2MKQEAgLTAsMCArMSw0NSBAQAorLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9nZXRfZGVmYXVsdF9yYXN0ZXJpemVyX2Zvcl9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2xpYi9leHRlcm5hbF9yYXN0ZXJpemVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL3JlbmRlcmVyX21vZHVsZS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSByZW5kZXJlciB7CisKK25hbWVzcGFjZSB7CitzY29wZWRfcHRyPHJhc3Rlcml6ZXI6OlJhc3Rlcml6ZXI+IENyZWF0ZVJhc3Rlcml6ZXIoCisgICAgYmFja2VuZDo6R3JhcGhpY3NDb250ZXh0KiBncmFwaGljc19jb250ZXh0LAorICAgIGNvbnN0IFJlbmRlcmVyTW9kdWxlOjpPcHRpb25zJiBvcHRpb25zKSB7CisgIHJldHVybiBzY29wZWRfcHRyPHJhc3Rlcml6ZXI6OlJhc3Rlcml6ZXI+KAorICAgICAgbmV3IHJhc3Rlcml6ZXI6OmxpYjo6RXh0ZXJuYWxSYXN0ZXJpemVyKAorICAgICAgICAgIGdyYXBoaWNzX2NvbnRleHQsIG9wdGlvbnMuc2tpYV9nbHlwaF90ZXh0dXJlX2F0bGFzX2RpbWVuc2lvbnMud2lkdGgoKSwKKyAgICAgICAgICBvcHRpb25zLnNraWFfZ2x5cGhfdGV4dHVyZV9hdGxhc19kaW1lbnNpb25zLmhlaWdodCgpLAorICAgICAgICAgIG9wdGlvbnMuc2tpYV9jYWNoZV9zaXplX2luX2J5dGVzLAorICAgICAgICAgIG9wdGlvbnMuc2NyYXRjaF9zdXJmYWNlX2NhY2hlX3NpemVfaW5fYnl0ZXMsCisjaWYgZGVmaW5lZChDT0JBTFRfRk9SQ0VfRElSRUNUX0dMRVNfUkFTVEVSSVpFUikKKyAgICAgICAgICBvcHRpb25zLm9mZnNjcmVlbl90YXJnZXRfY2FjaGVfc2l6ZV9pbl9ieXRlcywKKyNlbmRpZgorICAgICAgICAgIG9wdGlvbnMucHVyZ2Vfc2tpYV9mb250X2NhY2hlc19vbl9kZXN0cnVjdGlvbiwKKyAgICAgICAgICBvcHRpb25zLmZvcmNlX2RldGVybWluaXN0aWNfcmVuZGVyaW5nKSk7Cit9Cit9ICAvLyBuYW1lc3BhY2UKKworUmFzdGVyaXplckluZm8gR2V0RGVmYXVsdFJhc3Rlcml6ZXJGb3JQbGF0Zm9ybSgpIHsKKyAgcmV0dXJuIHsiZXh0ZXJuYWwiLCBiYXNlOjpCaW5kKCZDcmVhdGVSYXN0ZXJpemVyKX07Cit9CisKK30gIC8vIG5hbWVzcGFjZSByZW5kZXJlcgorfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2xpYi9saWIuZ3lwIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2xpYi9saWIuZ3lwCmluZGV4IDAzY2VhZDEuLmMyOThiNWQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9saWIvbGliLmd5cAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvbGliL2xpYi5neXAKQEAgLTIyLDcgKzIyLDcgQEAKICAgICAgIF0sCiAgICAgICAnc291cmNlcyc6IFsKICAgICAgICAgJ2V4dGVybmFsX3Jhc3Rlcml6ZXIuY2MnLAotICAgICAgICAncmVuZGVyZXJfbW9kdWxlX2RlZmF1bHRfb3B0aW9uc19saWIuY2MnCisgICAgICAgICdnZXRfZGVmYXVsdF9yYXN0ZXJpemVyX2Zvcl9wbGF0Zm9ybV9saWIuY2MnCiAgICAgICBdLAogICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCiAgICAgICAgICAnPChERVBUSCkvYmFzZS9iYXNlLmd5cDpiYXNlJywKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9saWIvcmVuZGVyZXJfbW9kdWxlX2RlZmF1bHRfb3B0aW9uc19saWIuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvbGliL3JlbmRlcmVyX21vZHVsZV9kZWZhdWx0X29wdGlvbnNfbGliLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2MxN2U2Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9saWIvcmVuZGVyZXJfbW9kdWxlX2RlZmF1bHRfb3B0aW9uc19saWIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL3JlbmRlcmVyX21vZHVsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2xpYi9leHRlcm5hbF9yYXN0ZXJpemVyLmgiCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIHJlbmRlcmVyIHsKLQotbmFtZXNwYWNlIHsKLXNjb3BlZF9wdHI8cmFzdGVyaXplcjo6UmFzdGVyaXplcj4gQ3JlYXRlUmFzdGVyaXplcigKLSAgICBiYWNrZW5kOjpHcmFwaGljc0NvbnRleHQqIGdyYXBoaWNzX2NvbnRleHQsCi0gICAgY29uc3QgUmVuZGVyZXJNb2R1bGU6Ok9wdGlvbnMmIG9wdGlvbnMpIHsKLSAgcmV0dXJuIHNjb3BlZF9wdHI8cmFzdGVyaXplcjo6UmFzdGVyaXplcj4oCi0gICAgICBuZXcgcmFzdGVyaXplcjo6bGliOjpFeHRlcm5hbFJhc3Rlcml6ZXIoCi0gICAgICAgICAgZ3JhcGhpY3NfY29udGV4dCwgb3B0aW9ucy5za2lhX2dseXBoX3RleHR1cmVfYXRsYXNfZGltZW5zaW9ucy53aWR0aCgpLAotICAgICAgICAgIG9wdGlvbnMuc2tpYV9nbHlwaF90ZXh0dXJlX2F0bGFzX2RpbWVuc2lvbnMuaGVpZ2h0KCksCi0gICAgICAgICAgb3B0aW9ucy5za2lhX2NhY2hlX3NpemVfaW5fYnl0ZXMsCi0gICAgICAgICAgb3B0aW9ucy5zY3JhdGNoX3N1cmZhY2VfY2FjaGVfc2l6ZV9pbl9ieXRlcywKLSNpZiBkZWZpbmVkKENPQkFMVF9GT1JDRV9ESVJFQ1RfR0xFU19SQVNURVJJWkVSKQotICAgICAgICAgIG9wdGlvbnMub2Zmc2NyZWVuX3RhcmdldF9jYWNoZV9zaXplX2luX2J5dGVzLAotI2VuZGlmCi0gICAgICAgICAgb3B0aW9ucy5wdXJnZV9za2lhX2ZvbnRfY2FjaGVzX29uX2Rlc3RydWN0aW9uLAotICAgICAgICAgIG9wdGlvbnMuZGlzYWJsZV9yYXN0ZXJpemVyX2NhY2hpbmcpKTsKLX0KLX0gIC8vIG5hbWVzcGFjZQotCi12b2lkIFJlbmRlcmVyTW9kdWxlOjpPcHRpb25zOjpTZXRQZXJQbGF0Zm9ybURlZmF1bHRPcHRpb25zKCkgewotICAvLyBFbnN1cmUgdGhlIHNjZW5lIGlzIHJlLXJhc3Rlcml6ZWQgZXZlbiBpZiB0aGUgcmVuZGVyIHRyZWUgaXMgdW5jaGFuZ2VkIHNvCi0gIC8vIHRoYXQgaGVhZHNldCBsb29rIGNoYW5nZXMgYXJlIHByb3Blcmx5IHJlbmRlcmVkLgotICBzdWJtaXRfZXZlbl9pZl9yZW5kZXJfdHJlZV9pc191bmNoYW5nZWQgPSB0cnVlOwotCi0gIGNyZWF0ZV9yYXN0ZXJpemVyX2Z1bmN0aW9uID0gYmFzZTo6QmluZCgmQ3JlYXRlUmFzdGVyaXplcik7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSByZW5kZXJlcgotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaGFyZHdhcmVfcmFzdGVyaXplci5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2hhcmR3YXJlX3Jhc3Rlcml6ZXIuY2MKaW5kZXggMGYxN2FhMC4uY2RmNGU4MSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaGFyZHdhcmVfcmFzdGVyaXplci5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9oYXJkd2FyZV9yYXN0ZXJpemVyLmNjCkBAIC02MCw3ICs2MCw4IEBACiAgIEltcGwoYmFja2VuZDo6R3JhcGhpY3NDb250ZXh0KiBncmFwaGljc19jb250ZXh0LCBpbnQgc2tpYV9hdGxhc193aWR0aCwKICAgICAgICBpbnQgc2tpYV9hdGxhc19oZWlnaHQsIGludCBza2lhX2NhY2hlX3NpemVfaW5fYnl0ZXMsCiAgICAgICAgaW50IHNjcmF0Y2hfc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzLAotICAgICAgIGJvb2wgcHVyZ2Vfc2tpYV9mb250X2NhY2hlc19vbl9kZXN0cnVjdGlvbik7CisgICAgICAgYm9vbCBwdXJnZV9za2lhX2ZvbnRfY2FjaGVzX29uX2Rlc3RydWN0aW9uLAorICAgICAgIGJvb2wgZm9yY2VfZGV0ZXJtaW5pc3RpY19yZW5kZXJpbmcpOwogICB+SW1wbCgpOwogCiAgIHZvaWQgU3VibWl0KGNvbnN0IHNjb3BlZF9yZWZwdHI8cmVuZGVyX3RyZWU6Ok5vZGU+JiByZW5kZXJfdHJlZSwKQEAgLTEzMywxMyArMTM0LDI1IEBACiAgIC8vIG9yIG5vdCBzaW5jZSBTa2lhIGRvZXMgbm90IGxldCB1cyBwdWxsIHRoYXQgaW5mb3JtYXRpb24gb3V0IG9mIHRoZQogICAvLyBTa0NhbnZhcyBvYmplY3QgKHdoaWNoIFNraWEgd291bGQgaW50ZXJuYWxseSB1c2UgdG8gZ2V0IHRoaXMgaW5mb3JtYXRpb24pLgogICBiYXNlOjpvcHRpb25hbDxHclN1cmZhY2VPcmlnaW4+IGN1cnJlbnRfc3VyZmFjZV9vcmlnaW5fOworCisgIC8vIElmIHRydWUsIHJhc3Rlcml6ZXIgd2lsbCBlc2NoZXcgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9ucyBpbiBmYXZvciBvZgorICAvLyBlbnN1cmluZyB0aGF0IGVhY2ggcmFzdGVyaXphdGlvbiBpcyBwaXhlbC13aXNlIGRldGVybWluaXN0aWMsIGdpdmVuCisgIC8vIHRoZSBzYW1lIHJlbmRlciB0cmVlLgorICBib29sIGZvcmNlX2RldGVybWluaXN0aWNfcmVuZGVyaW5nXzsKIH07CiAKIG5hbWVzcGFjZSB7CiAKLVNrU3VyZmFjZVByb3BzIEdldFJlbmRlclRhcmdldFN1cmZhY2VQcm9wcygpIHsKLSAgcmV0dXJuIFNrU3VyZmFjZVByb3BzKFNrU3VyZmFjZVByb3BzOjprVXNlRGlzdGFuY2VGaWVsZEZvbnRzX0ZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICBTa1N1cmZhY2VQcm9wczo6a0xlZ2FjeUZvbnRIb3N0X0luaXRUeXBlKTsKK1NrU3VyZmFjZVByb3BzIEdldFJlbmRlclRhcmdldFN1cmZhY2VQcm9wcyhib29sIGZvcmNlX2RldGVybWluaXN0aWNfcmVuZGVyaW5nKSB7CisgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgaWYgKCFmb3JjZV9kZXRlcm1pbmlzdGljX3JlbmRlcmluZykgeworICAgIC8vIERpc3RhbmNlIGZpZWxkIGZvbnRzIGFyZSBrbm93biB0byByZXN1bHQgaW4gbm9uLWRldGVybWluaXN0aWMgZ3JhcGhpY2FsCisgICAgLy8gb3V0cHV0IHNpbmNlIHRoZSBvdXRwdXQgZGVwZW5kcyBvbiB0aGUgc2l6ZSBvZiB0aGUgZ2x5cGggdGhhdCBlbnRlcnMgdGhlCisgICAgLy8gYXRsYXMgZmlyc3QgKHdoaWNoIHdvdWxkIGdldCByZS11c2VkIGZvciBzaW1pbGFybHkgYnV0IHVuZXF1YWwgc2l6ZWQKKyAgICAvLyBzdWJzZXF1ZW50IGdseXBocykuCisgICAgZmxhZ3MgPSBTa1N1cmZhY2VQcm9wczo6a1VzZURpc3RhbmNlRmllbGRGb250c19GbGFnOworICB9CisgIHJldHVybiBTa1N1cmZhY2VQcm9wcyhmbGFncywgU2tTdXJmYWNlUHJvcHM6OmtMZWdhY3lGb250SG9zdF9Jbml0VHlwZSk7CiB9CiAKIC8vIFRha2VzIG1ldGEtZGF0YSBmcm9tIGEgQ29iYWx0IFJlbmRlclRhcmdldCBvYmplY3QgYW5kIHVzZXMgaXQgdG8gZmlsbCBvdXQKQEAgLTQzMSw2ICs0NDQsMTAgQEAKICAgLy8gb3JkZXIuCiAgIGRyYXdfc3RhdGUtPnJlbmRlcl90YXJnZXQtPmZsdXNoKCk7CiAKKyAgLy8gVGhpcyBtYXkgYmUgdGhlIGZpcnN0IHVzZSBvZiB0aGUgcmVuZGVyIHRhcmdldCwgc28gZW5zdXJlIGl0IGlzIGJvdW5kLgorICBHTF9DQUxMKGdsQmluZEZyYW1lYnVmZmVyKEdMX0ZSQU1FQlVGRkVSLAorICAgICAgZHJhd19zdGF0ZS0+cmVuZGVyX3RhcmdldC0+Z2V0UmVuZGVyVGFyZ2V0SGFuZGxlKCkpKTsKKwogICBTa0lTaXplIGNhbnZhc19zaXplID0gZHJhd19zdGF0ZS0+cmVuZGVyX3RhcmdldC0+Z2V0QmFzZUxheWVyU2l6ZSgpOwogICBHTF9DQUxMKGdsVmlld3BvcnQoMCwgMCwgY2FudmFzX3NpemUud2lkdGgoKSwgY2FudmFzX3NpemUuaGVpZ2h0KCkpKTsKIApAQCAtNTAxLDYgKzUxOCwxMCBAQAogICAvLyBvcmRlci4KICAgZHJhd19zdGF0ZS0+cmVuZGVyX3RhcmdldC0+Zmx1c2goKTsKIAorICAvLyBUaGlzIG1heSBiZSB0aGUgZmlyc3QgdXNlIG9mIHRoZSByZW5kZXIgdGFyZ2V0LCBzbyBlbnN1cmUgaXQgaXMgYm91bmQuCisgIEdMX0NBTEwoZ2xCaW5kRnJhbWVidWZmZXIoR0xfRlJBTUVCVUZGRVIsCisgICAgICBkcmF3X3N0YXRlLT5yZW5kZXJfdGFyZ2V0LT5nZXRSZW5kZXJUYXJnZXRIYW5kbGUoKSkpOworCiAgIC8vIFdlIHNldHVwIG91ciB2aWV3cG9ydCB0byBmaWxsIHRoZSBlbnRpcmUgY2FudmFzLgogICBHTF9DQUxMKGdsVmlld3BvcnQoMCwgMCwgY2FudmFzX3NpemUud2lkdGgoKSwgY2FudmFzX3NpemUuaGVpZ2h0KCkpKTsKICAgR0xfQ0FMTChnbFNjaXNzb3IoMCwgMCwgY2FudmFzX3NpemUud2lkdGgoKSwgY2FudmFzX3NpemUuaGVpZ2h0KCkpKTsKQEAgLTU0NSwxMCArNTY2LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNraWFfYXRsYXNfd2lkdGgsIGludCBza2lhX2F0bGFzX2hlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2tpYV9jYWNoZV9zaXplX2luX2J5dGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzY3JhdGNoX3N1cmZhY2VfY2FjaGVfc2l6ZV9pbl9ieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHB1cmdlX3NraWFfZm9udF9jYWNoZXNfb25fZGVzdHJ1Y3Rpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwdXJnZV9za2lhX2ZvbnRfY2FjaGVzX29uX2Rlc3RydWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2VfZGV0ZXJtaW5pc3RpY19yZW5kZXJpbmcpCiAgICAgOiBncmFwaGljc19jb250ZXh0XygKICAgICAgICAgICBiYXNlOjpwb2x5bW9ycGhpY19kb3duY2FzdDxiYWNrZW5kOjpHcmFwaGljc0NvbnRleHRFR0wqPigKLSAgICAgICAgICAgICAgZ3JhcGhpY3NfY29udGV4dCkpIHsKKyAgICAgICAgICAgICAgZ3JhcGhpY3NfY29udGV4dCkpLAorICAgICAgZm9yY2VfZGV0ZXJtaW5pc3RpY19yZW5kZXJpbmdfKGZvcmNlX2RldGVybWluaXN0aWNfcmVuZGVyaW5nKSB7CiAgIFRSQUNFX0VWRU5UMCgiY29iYWx0OjpyZW5kZXJlciIsICJIYXJkd2FyZVJhc3Rlcml6ZXI6OkltcGw6OkltcGwoKSIpOwogCiAgIERMT0coSU5GTykgPDwgInNraWFfY2FjaGVfc2l6ZV9pbl9ieXRlczogIiA8PCBza2lhX2NhY2hlX3NpemVfaW5fYnl0ZXM7CkBAIC02MjYsMTEgKzY0OSw2IEBACiAKICAgYmFja2VuZDo6R3JhcGhpY3NDb250ZXh0RUdMOjpTY29wZWRNYWtlQ3VycmVudCBzY29wZWRfbWFrZV9jdXJyZW50KAogICAgICAgZ3JhcGhpY3NfY29udGV4dF8sIHJlbmRlcl90YXJnZXRfZWdsKTsKLSAgLy8gTWFrZSBzdXJlIHRoZSByZW5kZXIgdGFyZ2V0J3MgZnJhbWVidWZmZXIgaXMgYm91bmQgYmVmb3JlIGNvbnRpbnVpbmcuCi0gIC8vIFNraWEgd2lsbCB1c3VhbGx5IGRvIHRoaXMsIGJ1dCBpdCBpcyBwb3NzaWJsZSBmb3Igc29tZSByZW5kZXIgdHJlZXMgdG8KLSAgLy8gaGF2ZSBub24tc2tpYSBkcmF3IGNhbGxzIG9ubHksIGluIHdoaWNoIGNhc2UgdGhpcyBuZWVkcyB0byBiZSBkb25lLgotICBHTF9DQUxMKGdsQmluZEZyYW1lYnVmZmVyKEdMX0ZSQU1FQlVGRkVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcl90YXJnZXRfZWdsLT5HZXRQbGF0Zm9ybUhhbmRsZSgpKSk7CiAKICAgLy8gRmlyc3QgcmVzZXQgdGhlIGdyYXBoaWNzIGNvbnRleHQgc3RhdGUgZm9yIHRoZSBwZW5kaW5nIHJlbmRlciB0cmVlCiAgIC8vIGRyYXcgY2FsbHMsIGluIGNhc2Ugd2UgaGF2ZSBtb2RpZmllZCBzdGF0ZSBpbiBiZXR3ZWVuLgpAQCAtNjkwLDcgKzcwOCw4IEBACiAgICAgICBDb2JhbHRSZW5kZXJUYXJnZXRUb1NraWFCYWNrZW5kUmVuZGVyVGFyZ2V0RGVzYygqcmVuZGVyX3RhcmdldCk7CiAgIHNraWFfZGVzYy5mT3JpZ2luID0ga1RvcExlZnRfR3JTdXJmYWNlT3JpZ2luOwogCi0gIFNrU3VyZmFjZVByb3BzIHN1cmZhY2VfcHJvcHMgPSBHZXRSZW5kZXJUYXJnZXRTdXJmYWNlUHJvcHMoKTsKKyAgU2tTdXJmYWNlUHJvcHMgc3VyZmFjZV9wcm9wcyA9CisgICAgICBHZXRSZW5kZXJUYXJnZXRTdXJmYWNlUHJvcHMoZm9yY2VfZGV0ZXJtaW5pc3RpY19yZW5kZXJpbmdfKTsKICAgc2tfc3A8U2tTdXJmYWNlPiBza19vdXRwdXRfc3VyZmFjZSA9IFNrU3VyZmFjZTo6TWFrZUZyb21CYWNrZW5kUmVuZGVyVGFyZ2V0KAogICAgICAgZ3JfY29udGV4dF8uZ2V0KCksIHNraWFfZGVzYywgJnN1cmZhY2VfcHJvcHMpOwogICBTa0NhbnZhcyogY2FudmFzID0gc2tfb3V0cHV0X3N1cmZhY2UtPmdldENhbnZhcygpOwpAQCAtNzYxLDcgKzc4MCw4IEBACiAKICAgICAvLyBDcmVhdGUgYW4gU2tTdXJmYWNlIGZyb20gdGhlIHJlbmRlciB0YXJnZXQgc28gdGhhdCB3ZSBjYW4gYWNxdWlyZSBhCiAgICAgLy8gU2tDYW52YXMgb2JqZWN0IGZyb20gaXQgaW4gU3VibWl0KCkuCi0gICAgU2tTdXJmYWNlUHJvcHMgc3VyZmFjZV9wcm9wcyA9IEdldFJlbmRlclRhcmdldFN1cmZhY2VQcm9wcygpOworICAgIFNrU3VyZmFjZVByb3BzIHN1cmZhY2VfcHJvcHMgPQorICAgICAgICBHZXRSZW5kZXJUYXJnZXRTdXJmYWNlUHJvcHMoZm9yY2VfZGV0ZXJtaW5pc3RpY19yZW5kZXJpbmdfKTsKICAgICAvLyBDcmVhdGUgYSBjYW52YXMgZnJvbSB0aGUgcmVuZGVyIHRhcmdldC4KICAgICBHckJhY2tlbmRSZW5kZXJUYXJnZXREZXNjIHNraWFfZGVzYyA9CiAgICAgICAgIENvYmFsdFJlbmRlclRhcmdldFRvU2tpYUJhY2tlbmRSZW5kZXJUYXJnZXREZXNjKCpyZW5kZXJfdGFyZ2V0KTsKQEAgLTgxNSwxMSArODM1LDEzIEBACiAgICAgYmFja2VuZDo6R3JhcGhpY3NDb250ZXh0KiBncmFwaGljc19jb250ZXh0LCBpbnQgc2tpYV9hdGxhc193aWR0aCwKICAgICBpbnQgc2tpYV9hdGxhc19oZWlnaHQsIGludCBza2lhX2NhY2hlX3NpemVfaW5fYnl0ZXMsCiAgICAgaW50IHNjcmF0Y2hfc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzLAotICAgIGJvb2wgcHVyZ2Vfc2tpYV9mb250X2NhY2hlc19vbl9kZXN0cnVjdGlvbikKKyAgICBib29sIHB1cmdlX3NraWFfZm9udF9jYWNoZXNfb25fZGVzdHJ1Y3Rpb24sCisgICAgYm9vbCBmb3JjZV9kZXRlcm1pbmlzdGljX3JlbmRlcmluZykKICAgICA6IGltcGxfKG5ldyBJbXBsKGdyYXBoaWNzX2NvbnRleHQsIHNraWFfYXRsYXNfd2lkdGgsIHNraWFfYXRsYXNfaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgc2tpYV9jYWNoZV9zaXplX2luX2J5dGVzLAogICAgICAgICAgICAgICAgICAgICAgc2NyYXRjaF9zdXJmYWNlX2NhY2hlX3NpemVfaW5fYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICBwdXJnZV9za2lhX2ZvbnRfY2FjaGVzX29uX2Rlc3RydWN0aW9uKSkge30KKyAgICAgICAgICAgICAgICAgICAgIHB1cmdlX3NraWFfZm9udF9jYWNoZXNfb25fZGVzdHJ1Y3Rpb24sCisgICAgICAgICAgICAgICAgICAgICBmb3JjZV9kZXRlcm1pbmlzdGljX3JlbmRlcmluZykpIHt9CiAKIEhhcmR3YXJlUmFzdGVyaXplcjo6fkhhcmR3YXJlUmFzdGVyaXplcigpIHt9CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2hhcmR3YXJlX3Jhc3Rlcml6ZXIuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2hhcmR3YXJlX3Jhc3Rlcml6ZXIuaAppbmRleCBkNjYyYjg3Li44YmNhZDc3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9oYXJkd2FyZV9yYXN0ZXJpemVyLmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaGFyZHdhcmVfcmFzdGVyaXplci5oCkBAIC01NCw3ICs1NCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2tpYV9hdGxhc193aWR0aCwgaW50IHNraWFfYXRsYXNfaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNraWFfY2FjaGVfc2l6ZV9pbl9ieXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzY3JhdGNoX3N1cmZhY2VfY2FjaGVfc2l6ZV9pbl9ieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHVyZ2Vfc2tpYV9mb250X2NhY2hlc19vbl9kZXN0cnVjdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHB1cmdlX3NraWFfZm9udF9jYWNoZXNfb25fZGVzdHJ1Y3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlX2RldGVybWluaXN0aWNfcmVuZGVyaW5nKTsKICAgdmlydHVhbCB+SGFyZHdhcmVSYXN0ZXJpemVyKCk7CiAKICAgLy8gQ29uc3VtZSB0aGUgcmVuZGVyIHRyZWUgYW5kIG91dHB1dCB0aGUgcmVzdWx0cyB0byB0aGUgcmVuZGVyIHRhcmdldCBwYXNzZWQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmVuZGVyZXIuZ3lwIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yZW5kZXJlci5neXAKaW5kZXggZWEyNjM0NS4uOTEyYWMzMyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yZW5kZXJlci5neXAKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yZW5kZXJlci5neXAKQEAgLTI4LDYgKzI4LDcgQEAKICAgICAgICAgJ3BpcGVsaW5lLmgnLAogICAgICAgICAncmVuZGVyZXJfbW9kdWxlLmNjJywKICAgICAgICAgJ3JlbmRlcmVyX21vZHVsZS5oJywKKyAgICAgICAgJ3JlbmRlcmVyX21vZHVsZV9kZWZhdWx0X29wdGlvbnMuY2MnLAogICAgICAgICAnc21vb3RoZWRfdmFsdWUuY2MnLAogICAgICAgICAnc21vb3RoZWRfdmFsdWUuaCcsCiAgICAgICAgICdzdWJtaXNzaW9uLmgnLApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yZW5kZXJlcl9tb2R1bGUuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3JlbmRlcmVyX21vZHVsZS5jYwppbmRleCA5OWQ2YTA5Li41YmJjNzliIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3JlbmRlcmVyX21vZHVsZS5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3JlbmRlcmVyX21vZHVsZS5jYwpAQCAtMjQsNyArMjQsNyBAQAogbmFtZXNwYWNlIHJlbmRlcmVyIHsKIAogUmVuZGVyZXJNb2R1bGU6Ok9wdGlvbnM6Ok9wdGlvbnMoKQotICAgIDogZGlzYWJsZV9yYXN0ZXJpemVyX2NhY2hpbmcoZmFsc2UpLAorICAgIDogZm9yY2VfZGV0ZXJtaW5pc3RpY19yZW5kZXJpbmcoZmFsc2UpLAogICAgICAgcHVyZ2Vfc2tpYV9mb250X2NhY2hlc19vbl9kZXN0cnVjdGlvbih0cnVlKSwKICAgICAgIGVuYWJsZV9mcHNfc3Rkb3V0KGZhbHNlKSwKICAgICAgIGVuYWJsZV9mcHNfb3ZlcmxheShmYWxzZSkgewpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yZW5kZXJlcl9tb2R1bGUuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmVuZGVyZXJfbW9kdWxlLmgKaW5kZXggZTRjMzllZS4uNzk5NzI2YyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yZW5kZXJlcl9tb2R1bGUuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3JlbmRlcmVyX21vZHVsZS5oCkBAIC04MCw3ICs4MCw3IEBACiAgICAgLy8gYSBzdWItcGl4ZWwgb2Zmc2V0IHRoYXQgaXMgZGlmZmVyZW50IGZyb20gd2hlbiB0aGUgY2FjaGUgd2FzIGNyZWF0ZWQuCiAgICAgLy8gVGhpcyBjYWNoaW5nIG1lY2hhbmlzbSBzaG91bGQgb25seSBiZSBkaXNhYmxlZCBmb3IgdGVzdGluZyBwdXJwb3NlcwogICAgIC8vIChlLmcuIHNjcmVlbnNob3QgZGlmZiB0b29scykuCi0gICAgYm9vbCBkaXNhYmxlX3Jhc3Rlcml6ZXJfY2FjaGluZzsKKyAgICBib29sIGZvcmNlX2RldGVybWluaXN0aWNfcmVuZGVyaW5nOwogCiAgICAgLy8gSWYgdGhpcyBmbGFnIGlzIHNldCB0byB0cnVlLCB0aGUgcGlwZWxpbmUgd2lsbCBub3QgcmUtc3VibWl0IGEgcmVuZGVyCiAgICAgLy8gdHJlZSBpZiBpdCBoYXMgbm90IGNoYW5nZWQgZnJvbSB0aGUgcHJldmlvdXMgc3VibWlzc2lvbi4gIFRoaXMgY2FuIHNhdmUKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmVuZGVyZXJfbW9kdWxlX2RlZmF1bHRfb3B0aW9ucy5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmVuZGVyZXJfbW9kdWxlX2RlZmF1bHRfb3B0aW9ucy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODM1ZTlmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yZW5kZXJlcl9tb2R1bGVfZGVmYXVsdF9vcHRpb25zLmNjCkBAIC0wLDAgKzEsMzUgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvZ2V0X2RlZmF1bHRfcmFzdGVyaXplcl9mb3JfcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvcmVuZGVyZXJfbW9kdWxlLmgiCisKKyNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgcmVuZGVyZXIgeworCit2b2lkIFJlbmRlcmVyTW9kdWxlOjpPcHRpb25zOjpTZXRQZXJQbGF0Zm9ybURlZmF1bHRPcHRpb25zKCkgeworICAvLyBJZiB0aGVyZSBpcyBubyBuZWVkIHRvIGZyZXF1ZW50bHkgZmxpcCB0aGUgZGlzcGxheSBidWZmZXIsIHRoZW4gZW5hYmxlCisgIC8vIHN1cHBvcnQgZm9yIGFuIG9wdGltaXphdGlvbiB3aGVyZSB0aGUgc2NlbmUgaXMgbm90IHJlLXJhc3Rlcml6ZWQgZWFjaCBmcmFtZQorICAvLyBpZiBpdCBoYXMgbm90IGNoYW5nZWQgZnJvbSB0aGUgbGFzdCBmcmFtZS4KKyAgc3VibWl0X2V2ZW5faWZfcmVuZGVyX3RyZWVfaXNfdW5jaGFuZ2VkID0KKyAgICAgIFNCX01VU1RfRlJFUVVFTlRMWV9GTElQX0RJU1BMQVlfQlVGRkVSOworCisgIGNyZWF0ZV9yYXN0ZXJpemVyX2Z1bmN0aW9uID0KKyAgICAgIEdldERlZmF1bHRSYXN0ZXJpemVyRm9yUGxhdGZvcm0oKS5jcmVhdGVfcmFzdGVyaXplcl9jYWxsYmFjazsKK30KKworfSAgLy8gbmFtZXNwYWNlIHJlbmRlcmVyCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3JlbmRlcmVyX21vZHVsZV9kZWZhdWx0X29wdGlvbnNfc3RhcmJvYXJkLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yZW5kZXJlcl9tb2R1bGVfZGVmYXVsdF9vcHRpb25zX3N0YXJib2FyZC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMwYzE2ZS4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3JlbmRlcmVyX21vZHVsZV9kZWZhdWx0X29wdGlvbnNfc3RhcmJvYXJkLmNjCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9yZW5kZXJlcl9tb2R1bGUuaCIKLQotI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL2hhcmR3YXJlX3Jhc3Rlcml6ZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL3NvZnR3YXJlX3Jhc3Rlcml6ZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvaGFyZHdhcmVfcmFzdGVyaXplci5oIgotI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9zb2Z0d2FyZV9yYXN0ZXJpemVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9oYXJkd2FyZV9yYXN0ZXJpemVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc3R1Yi9yYXN0ZXJpemVyLmgiCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIHJlbmRlcmVyIHsKLQotbmFtZXNwYWNlIHsKLQotc2NvcGVkX3B0cjxyYXN0ZXJpemVyOjpSYXN0ZXJpemVyPiBDcmVhdGVSYXN0ZXJpemVyKAotICAgIGJhY2tlbmQ6OkdyYXBoaWNzQ29udGV4dCogZ3JhcGhpY3NfY29udGV4dCwKLSAgICBjb25zdCBSZW5kZXJlck1vZHVsZTo6T3B0aW9ucyYgb3B0aW9ucykgewotICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6cmVuZGVyZXIiLCAiQ3JlYXRlUmFzdGVyaXplciIpOwotI2lmIENPQkFMVF9GT1JDRV9TVFVCX1JBU1RFUklaRVIKLSAgcmV0dXJuIHNjb3BlZF9wdHI8cmFzdGVyaXplcjo6UmFzdGVyaXplcj4obmV3IHJhc3Rlcml6ZXI6OnN0dWI6OlJhc3Rlcml6ZXIoKSk7Ci0jZWxzZQotI2lmIFNCX0hBUyhHTEVTMikKLSNpZiBDT0JBTFRfRk9SQ0VfU09GVFdBUkVfUkFTVEVSSVpFUgotICByZXR1cm4gc2NvcGVkX3B0cjxyYXN0ZXJpemVyOjpSYXN0ZXJpemVyPigKLSAgICAgIG5ldyByYXN0ZXJpemVyOjplZ2w6OlNvZnR3YXJlUmFzdGVyaXplcigKLSAgICAgICAgICBncmFwaGljc19jb250ZXh0LCBvcHRpb25zLnB1cmdlX3NraWFfZm9udF9jYWNoZXNfb25fZGVzdHJ1Y3Rpb24pKTsKLSNlbGlmIGRlZmluZWQoQ09CQUxUX0ZPUkNFX0RJUkVDVF9HTEVTX1JBU1RFUklaRVIpCi0gIHJldHVybiBzY29wZWRfcHRyPHJhc3Rlcml6ZXI6OlJhc3Rlcml6ZXI+KAotICAgICAgbmV3IHJhc3Rlcml6ZXI6OmVnbDo6SGFyZHdhcmVSYXN0ZXJpemVyKAotICAgICAgICAgIGdyYXBoaWNzX2NvbnRleHQsIG9wdGlvbnMuc2tpYV9nbHlwaF90ZXh0dXJlX2F0bGFzX2RpbWVuc2lvbnMud2lkdGgoKSwKLSAgICAgICAgICBvcHRpb25zLnNraWFfZ2x5cGhfdGV4dHVyZV9hdGxhc19kaW1lbnNpb25zLmhlaWdodCgpLAotICAgICAgICAgIG9wdGlvbnMuc2tpYV9jYWNoZV9zaXplX2luX2J5dGVzLAotICAgICAgICAgIG9wdGlvbnMuc2NyYXRjaF9zdXJmYWNlX2NhY2hlX3NpemVfaW5fYnl0ZXMsCi0gICAgICAgICAgb3B0aW9ucy5vZmZzY3JlZW5fdGFyZ2V0X2NhY2hlX3NpemVfaW5fYnl0ZXMsCi0gICAgICAgICAgb3B0aW9ucy5wdXJnZV9za2lhX2ZvbnRfY2FjaGVzX29uX2Rlc3RydWN0aW9uLAotICAgICAgICAgIG9wdGlvbnMuZGlzYWJsZV9yYXN0ZXJpemVyX2NhY2hpbmcpKTsKLSNlbHNlCi0gIHJldHVybiBzY29wZWRfcHRyPHJhc3Rlcml6ZXI6OlJhc3Rlcml6ZXI+KAotICAgICAgbmV3IHJhc3Rlcml6ZXI6OnNraWE6OkhhcmR3YXJlUmFzdGVyaXplcigKLSAgICAgICAgICBncmFwaGljc19jb250ZXh0LCBvcHRpb25zLnNraWFfZ2x5cGhfdGV4dHVyZV9hdGxhc19kaW1lbnNpb25zLndpZHRoKCksCi0gICAgICAgICAgb3B0aW9ucy5za2lhX2dseXBoX3RleHR1cmVfYXRsYXNfZGltZW5zaW9ucy5oZWlnaHQoKSwKLSAgICAgICAgICBvcHRpb25zLnNraWFfY2FjaGVfc2l6ZV9pbl9ieXRlcywKLSAgICAgICAgICBvcHRpb25zLnNjcmF0Y2hfc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzLAotICAgICAgICAgIG9wdGlvbnMucHVyZ2Vfc2tpYV9mb250X2NhY2hlc19vbl9kZXN0cnVjdGlvbikpOwotI2VuZGlmICAvLyBDT0JBTFRfRk9SQ0VfU09GVFdBUkVfUkFTVEVSSVpFUgotI2VsaWYgU0JfSEFTKEJMSVRURVIpCi0jaWYgQ09CQUxUX0ZPUkNFX1NPRlRXQVJFX1JBU1RFUklaRVIKLSAgcmV0dXJuIHNjb3BlZF9wdHI8cmFzdGVyaXplcjo6UmFzdGVyaXplcj4oCi0gICAgICBuZXcgcmFzdGVyaXplcjo6YmxpdHRlcjo6U29mdHdhcmVSYXN0ZXJpemVyKAotICAgICAgICAgIGdyYXBoaWNzX2NvbnRleHQsIG9wdGlvbnMucHVyZ2Vfc2tpYV9mb250X2NhY2hlc19vbl9kZXN0cnVjdGlvbikpOwotI2Vsc2UKLSAgcmV0dXJuIHNjb3BlZF9wdHI8cmFzdGVyaXplcjo6UmFzdGVyaXplcj4oCi0gICAgICBuZXcgcmFzdGVyaXplcjo6YmxpdHRlcjo6SGFyZHdhcmVSYXN0ZXJpemVyKAotICAgICAgICAgIGdyYXBoaWNzX2NvbnRleHQsIG9wdGlvbnMuc2tpYV9nbHlwaF90ZXh0dXJlX2F0bGFzX2RpbWVuc2lvbnMud2lkdGgoKSwKLSAgICAgICAgICBvcHRpb25zLnNraWFfZ2x5cGhfdGV4dHVyZV9hdGxhc19kaW1lbnNpb25zLmhlaWdodCgpLAotICAgICAgICAgIG9wdGlvbnMuc2NyYXRjaF9zdXJmYWNlX2NhY2hlX3NpemVfaW5fYnl0ZXMsCi0gICAgICAgICAgb3B0aW9ucy5zb2Z0d2FyZV9zdXJmYWNlX2NhY2hlX3NpemVfaW5fYnl0ZXMsCi0gICAgICAgICAgb3B0aW9ucy5wdXJnZV9za2lhX2ZvbnRfY2FjaGVzX29uX2Rlc3RydWN0aW9uKSk7Ci0jZW5kaWYgIC8vIENPQkFMVF9GT1JDRV9TT0ZUV0FSRV9SQVNURVJJWkVSCi0jZWxzZQotI2Vycm9yICJFaXRoZXIgR0xFUzIgb3IgdGhlIFN0YXJib2FyZCBCbGl0dGVyIEFQSSBtdXN0IGJlIGF2YWlsYWJsZS4iCi0gIHJldHVybiBzY29wZWRfcHRyPHJhc3Rlcml6ZXI6OlJhc3Rlcml6ZXI+KCk7Ci0jZW5kaWYKLSNlbmRpZiAgLy8gI2lmIENPQkFMVF9GT1JDRV9TVFVCX1JBU1RFUklaRVIKLX0KLX0gIC8vIG5hbWVzcGFjZQotCi12b2lkIFJlbmRlcmVyTW9kdWxlOjpPcHRpb25zOjpTZXRQZXJQbGF0Zm9ybURlZmF1bHRPcHRpb25zKCkgewotICAvLyBJZiB0aGVyZSBpcyBubyBuZWVkIHRvIGZyZXF1ZW50bHkgZmxpcCB0aGUgZGlzcGxheSBidWZmZXIsIHRoZW4gZW5hYmxlCi0gIC8vIHN1cHBvcnQgZm9yIGFuIG9wdGltaXphdGlvbiB3aGVyZSB0aGUgc2NlbmUgaXMgbm90IHJlLXJhc3Rlcml6ZWQgZWFjaCBmcmFtZQotICAvLyBpZiBpdCBoYXMgbm90IGNoYW5nZWQgZnJvbSB0aGUgbGFzdCBmcmFtZS4KLSAgc3VibWl0X2V2ZW5faWZfcmVuZGVyX3RyZWVfaXNfdW5jaGFuZ2VkID0KLSAgICAgIFNCX01VU1RfRlJFUVVFTlRMWV9GTElQX0RJU1BMQVlfQlVGRkVSOwotCi0gIGNyZWF0ZV9yYXN0ZXJpemVyX2Z1bmN0aW9uID0gYmFzZTo6QmluZCgmQ3JlYXRlUmFzdGVyaXplcik7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSByZW5kZXJlcgotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci90ZXN0L3BuZ191dGlscy9wbmdfZW5jb2RlLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci90ZXN0L3BuZ191dGlscy9wbmdfZW5jb2RlLmNjCmluZGV4IDkzNGRkM2MuLmM5NTM0MjAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvdGVzdC9wbmdfdXRpbHMvcG5nX2VuY29kZS5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Rlc3QvcG5nX3V0aWxzL3BuZ19lbmNvZGUuY2MKQEAgLTE2LDYgKzE2LDcgQEAKIAogI2luY2x1ZGUgPHZlY3Rvcj4KIAorI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKICNpbmNsdWRlICJiYXNlL2ZpbGVfdXRpbC5oIgogI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2xpYnBuZy9wbmcuaCIKQEAgLTU4LDYgKzU5LDcgQEAKIHNjb3BlZF9hcnJheTx1aW50OD4gRW5jb2RlUkdCQVRvQnVmZmVyKGNvbnN0IHVpbnQ4X3QqIHBpeGVsX2RhdGEsIGludCB3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsIGludCBwaXRjaF9pbl9ieXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogb3V0X3NpemUpIHsKKyAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OnJlbmRlcmVyIiwgIlBOR0VuY29kZTo6RW5jb2RlUkdCQVRvQnVmZmVyKCkiKTsKICAgLy8gSW5pdGlhbGl6ZSBwbmcgbGlicmFyeSBhbmQgaGVhZGVycyBmb3Igd3JpdGluZy4KICAgcG5nX3N0cnVjdHAgcG5nID0KICAgICAgIHBuZ19jcmVhdGVfd3JpdGVfc3RydWN0KFBOR19MSUJQTkdfVkVSX1NUUklORywgTlVMTCwgTlVMTCwgTlVMTCk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9lbmdpbmUuZ3lwIGIvc3JjL2NvYmFsdC9zY3JpcHQvZW5naW5lLmd5cAppbmRleCAzNDJiY2I1Li5jZmFjYmVhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9lbmdpbmUuZ3lwCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L2VuZ2luZS5neXAKQEAgLTI4LDExICsyOCwxMiBAQAogICAgICAgXSwKICAgICB9LAogICAgIHsKLSAgICAgICMgRW1wdHkgdGFyZ2V0IHRvIGVuc3VyZSBhbGwgdGFyZ2V0cyBmb3IgZW5hYmxlZCBlbmdpbmVzIGFyZSBidWlsdCB3aGVuCi0gICAgICAjIGJ1aWxkaW5nICdhbGwnLgotICAgICAgJ3RhcmdldF9uYW1lJzogJ2FsbF9lbmdpbmVzJywKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdlbmdpbmVfc2hlbGwnLAogICAgICAgJ3R5cGUnOiAnbm9uZScsCi0gICAgICAnZGVwZW5kZW5jaWVzJzogW10sCisgICAgICAnY29uZGl0aW9ucyc6IFsKKyAgICAgICAgWyAnamF2YXNjcmlwdF9lbmdpbmUgPT0gIm1vempzLTQ1IicsIHsgJ2RlcGVuZGVuY2llcyc6IFsnbW96anMtNDUvbW96anMtNDUuZ3lwOm1vempzLTQ1JywgXSwgfSwgXSwKKyAgICAgICAgWyAnamF2YXNjcmlwdF9lbmdpbmUgPT0gInY4IicsIHsgJ2RlcGVuZGVuY2llcyc6IFsndjhjL3Y4Yy5neXA6djhjJywgXSwgfSwgXSwKKyAgICAgIF0sCiAgICAgfSwKICAgXSwKIH0KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzLmNjIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anMuY2MKaW5kZXggZjU0ZjQ0OS4uZWVmYTlmZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anMuY2MKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anMuY2MKQEAgLTg4LDggKzg4LDcgQEAKIAogICAgICAgICAvLyBFeGVjdXRlIHRoZSBzY3JpcHQgYW5kIGdldCB0aGUgcmVzdWx0cyBvZiBleGVjdXRpb24uCiAgICAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKLSAgICAgICAgYm9vbCBzdWNjZXNzID0gZ2xvYmFsX2Vudmlyb25tZW50LT5FdmFsdWF0ZVNjcmlwdCgKLSAgICAgICAgICAgIHNvdXJjZSwgZmFsc2UgLyptdXRlX2Vycm9ycyovLCAmcmVzdWx0KTsKKyAgICAgICAgYm9vbCBzdWNjZXNzID0gZ2xvYmFsX2Vudmlyb25tZW50LT5FdmFsdWF0ZVNjcmlwdChzb3VyY2UsICZyZXN1bHQpOwogICAgICAgICAvLyBFY2hvIHRoZSByZXN1bHRzIHRvIHN0ZG91dC4KICAgICAgICAgaWYgKCFzdWNjZXNzKSB7CiAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJFeGNlcHRpb246ICI7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuY2MgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuY2MKaW5kZXggMTJhZGE0MC4uZmE3YTEyNyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmNjCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5jYwpAQCAtMzUyLDExICszNTIsMTUgQEAKIH0KIAogdm9pZCBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpBZGRSb290KFRyYWNlYWJsZSogdHJhY2VhYmxlKSB7CisgIERDSEVDSyh0cmFjZWFibGUpOwogICByb290c18uaW5zZXJ0KHRyYWNlYWJsZSk7CiB9CiAKIHZvaWQgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6UmVtb3ZlUm9vdChUcmFjZWFibGUqIHRyYWNlYWJsZSkgewotICByb290c18uZXJhc2UodHJhY2VhYmxlKTsKKyAgRENIRUNLKHRyYWNlYWJsZSk7CisgIGF1dG8gaXQgPSByb290c18uZmluZCh0cmFjZWFibGUpOworICBEQ0hFQ0soaXQgIT0gcm9vdHNfLmVuZCgpKTsKKyAgcm9vdHNfLmVyYXNlKGl0KTsKIH0KIAogdm9pZCBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpEaXNhYmxlRXZhbChjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgewpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvcHJvbWlzZS5oIGIvc3JjL2NvYmFsdC9zY3JpcHQvcHJvbWlzZS5oCmluZGV4IDVjNmExZmIuLjJkMDFhMmIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L3Byb21pc2UuaAorKysgYi9zcmMvY29iYWx0L3NjcmlwdC9wcm9taXNlLmgKQEAgLTY3LDYgKzY3LDI3IEBACiAgIHZvaWQgUmVzb2x2ZSgpIGNvbnN0IHsgUmVzb2x2ZShQcm9taXNlUmVzdWx0VW5kZWZpbmVkKCkpOyB9CiB9OwogCisjaWYgIWRlZmluZWQoQ09CQUxUX0JVSUxEX1RZUEVfR09MRCkKKworaW5saW5lIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBQcm9taXNlU3RhdGUgc3RhdGUpIHsKKyAgc3dpdGNoIChzdGF0ZSkgeworICAgIGNhc2UgUHJvbWlzZVN0YXRlOjprRnVsZmlsbGVkOgorICAgICAgb3MgPDwgIkZ1bGZpbGxlZCI7CisgICAgICByZXR1cm4gb3M7CisgICAgY2FzZSBQcm9taXNlU3RhdGU6OmtQZW5kaW5nOgorICAgICAgb3MgPDwgIlBlbmRpbmciOworICAgICAgcmV0dXJuIG9zOworICAgIGNhc2UgUHJvbWlzZVN0YXRlOjprUmVqZWN0ZWQ6CisgICAgICBvcyA8PCAiUmVqZWN0ZWQiOworICAgICAgcmV0dXJuIG9zOworICB9CisgIERDSEVDSyhmYWxzZSk7CisgIG9zIDw8ICJVbmtub3duIHByb21pc2Ugc3RhdGUiOworICByZXR1cm4gb3M7Cit9CisKKyNlbmRpZiAgLy8gIWRlZmluZWQoQ09CQUxUX0JVSUxEX1RZUEVfR09MRCkKKwogfSAgLy8gbmFtZXNwYWNlIHNjcmlwdAogfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIGIvc3JjL2NvYmFsdC9zY3JpcHQvc2VxdWVuY2UuaAppbmRleCA4ZmE1YzMxLi41NTc1NTliIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L3NlcXVlbmNlLmgKQEAgLTMzLDMxICszMywyNiBAQAogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiBjbGFzcyBTZXF1ZW5jZSB7CiAgcHVibGljOgotICBTZXF1ZW5jZSgpIHt9Ci0gIFNlcXVlbmNlKGNvbnN0IFNlcXVlbmNlJiBvdGhlcikgeyAqdGhpcyA9IG90aGVyOyB9Ci0KLSAgdm9pZCBjbGVhcigpIHsgc2VxdWVuY2VfLmVyYXNlKHNlcXVlbmNlXy5iZWdpbigpLCBzZXF1ZW5jZV8uZW5kKCkpOyB9Ci0KLSAgU2VxdWVuY2UmIG9wZXJhdG9yPShjb25zdCBTZXF1ZW5jZSYgb3RoZXIpIHsKLSAgICBjbGVhcigpOwotICAgIHNpemVfdHlwZSBtYXggPSBvdGhlci5zaXplKCk7Ci0gICAgZm9yIChzaXplX3R5cGUgaSA9IDA7IGkgPCBtYXg7ICsraSkgewotICAgICAgcHVzaF9iYWNrKG90aGVyLmF0KGkpKTsKLSAgICB9Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxUPiBTZXF1ZW5jZVR5cGU7CiAKICAgLy8gLS0tIFZlY3RvciBwYXJ0aWFsIGVtdWxhdGlvbiAtLS0KICAgdHlwZWRlZiB0eXBlbmFtZSBTZXF1ZW5jZVR5cGU6OnNpemVfdHlwZSBzaXplX3R5cGU7CiAgIHR5cGVkZWYgdHlwZW5hbWUgU2VxdWVuY2VUeXBlOjpyZWZlcmVuY2UgcmVmZXJlbmNlOwogICB0eXBlZGVmIHR5cGVuYW1lIFNlcXVlbmNlVHlwZTo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBTZXF1ZW5jZVR5cGU6Oml0ZXJhdG9yIGl0ZXJhdG9yOworICB0eXBlZGVmIHR5cGVuYW1lIFNlcXVlbmNlVHlwZTo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CiAgIHZvaWQgcHVzaF9iYWNrKGNvbnN0X3JlZmVyZW5jZSB2YWx1ZSkgeyBzZXF1ZW5jZV8ucHVzaF9iYWNrKHZhbHVlKTsgfQogICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHNlcXVlbmNlXy5zaXplKCk7IH0KICAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIHNlcXVlbmNlXy5lbXB0eSgpOyB9CiAgIGNvbnN0X3JlZmVyZW5jZSBhdChzaXplX3R5cGUgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIHNlcXVlbmNlXy5hdChpbmRleCk7IH0KICAgdm9pZCBzd2FwKFNlcXVlbmNlPFQ+JiBvdGhlcikgeyBzZXF1ZW5jZV8uc3dhcChvdGhlci5zZXF1ZW5jZV8pOyB9CisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gc2VxdWVuY2VfLmJlZ2luKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBzZXF1ZW5jZV8uYmVnaW4oKTsgfQorICBjb25zdF9pdGVyYXRvciBjYmVnaW4oKSBjb25zdCB7IHJldHVybiBzZXF1ZW5jZV8uY2JlZ2luKCk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gc2VxdWVuY2VfLmVuZCgpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIHNlcXVlbmNlXy5lbmQoKTsgfQorICBjb25zdF9pdGVyYXRvciBjZW5kKCkgY29uc3QgeyByZXR1cm4gc2VxdWVuY2VfLmNlbmQoKTsgfQorICB2b2lkIGNsZWFyKCkgeyBzZXF1ZW5jZV8uY2xlYXIoKTsgfQogCiAgcHJpdmF0ZToKICAgU2VxdWVuY2VUeXBlIHNlcXVlbmNlXzsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L3RyYWNlci5oIGIvc3JjL2NvYmFsdC9zY3JpcHQvdHJhY2VyLmgKaW5kZXggYzRmZGNhYi4uMTgyOGEwNiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvdHJhY2VyLmgKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvdHJhY2VyLmgKQEAgLTg5LDE1ICs4OSw2IEBACiAgICAgfQogICB9CiAKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIHZvaWQgVHJhY2VTZXF1ZW5jZShjb25zdCBTZXF1ZW5jZTxUPiYgc2VxdWVuY2UpIHsKLSAgICAvLyBUT0RPOiBDb25zaWRlciBtYWtpbmcgfFNlcXVlbmNlfCBtb3JlIHZlY3Rvci1saWtlIGFuZCBqdXN0IHVzaW5nIHRoZQotICAgIC8vIGl0ZXJhdG9yIHZlcnNpb24uCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzZXF1ZW5jZS5zaXplKCk7IGkrKykgewotICAgICAgVHJhY2Uoc2VxdWVuY2UuYXQoaSkpOwotICAgIH0KLSAgfQotCiAgIC8vIE5vdGU6IElmIHlvdXIgbmV3IGNsYXNzIHdhbnRzIHRvIG93biBhIGNvbnRhaW5lciBvZiB8VHJhY2VhYmxlfHMgdGhhdAogICAvLyBkb2VzIG5vdCBoYXZlIGFuIGl0ZXJhdGlvbiBoZWxwZXIgZnVuY3Rpb24gaGVyZSwgeW91IHNob3VsZCBhZGQgb25lLgogfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L3Y4Yy92OGMuY2MgYi9zcmMvY29iYWx0L3NjcmlwdC92OGMvdjhjLmNjCmluZGV4IDEwYzViMGMuLmE1MjJjNjAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L3Y4Yy92OGMuY2MKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvdjhjL3Y4Yy5jYwpAQCAtOTcsOCArOTcsNyBAQAogCiAgICAgICAgIC8vIEV4ZWN1dGUgdGhlIHNjcmlwdCBhbmQgZ2V0IHRoZSByZXN1bHRzIG9mIGV4ZWN1dGlvbi4KICAgICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0OwotICAgICAgICBib29sIHN1Y2Nlc3MgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkV2YWx1YXRlU2NyaXB0KAotICAgICAgICAgICAgc291cmNlLCBmYWxzZSAvKm11dGVfZXJyb3JzKi8sICZyZXN1bHQpOworICAgICAgICBib29sIHN1Y2Nlc3MgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkV2YWx1YXRlU2NyaXB0KHNvdXJjZSwgJnJlc3VsdCk7CiAgICAgICAgIC8vIEVjaG8gdGhlIHJlc3VsdHMgdG8gc3Rkb3V0LgogICAgICAgICBpZiAoIXN1Y2Nlc3MpIHsKICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIkV4Y2VwdGlvbjogIjsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L3Y4Yy92OGNfYXJyYXlfYnVmZmVyX3ZpZXcuaCBiL3NyYy9jb2JhbHQvc2NyaXB0L3Y4Yy92OGNfYXJyYXlfYnVmZmVyX3ZpZXcuaAppbmRleCBlOTJhZDdlLi4yMDdiNGM5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC92OGMvdjhjX2FycmF5X2J1ZmZlcl92aWV3LmgKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvdjhjL3Y4Y19hcnJheV9idWZmZXJfdmlldy5oCkBAIC0xOSw5ICsxOSw5IEBACiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9hcnJheV9idWZmZXJfdmlldy5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvdjhjL2VudHJ5X3Njb3BlLmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC92OGMvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Y4Yy92OGNfYXJyYXlfYnVmZmVyLmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC92OGMvdjhjX2V4Y2VwdGlvbl9zdGF0ZS5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvdjhjL3Y4Y191c2VyX29iamVjdF9ob2xkZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Y4Yy93ZWFrX2hlYXBfb2JqZWN0LmgiCiAKIG5hbWVzcGFjZSBjb2JhbHQgewogbmFtZXNwYWNlIHNjcmlwdCB7CkBAIC0zMiw4ICszMiw4IEBACiAgcHVibGljOgogICB1c2luZyBCYXNlVHlwZSA9IEFycmF5QnVmZmVyVmlldzsKIAotICBWOGNBcnJheUJ1ZmZlclZpZXcodjg6Oklzb2xhdGUqIGlzb2xhdGUsIEpTOjpIYW5kbGVWYWx1ZSB2YWx1ZSkKLSAgICAgIDogaXNvbGF0ZV8oaXNvbGF0ZSksIHdlYWtfaGVhcF9vYmplY3RfKGlzb2xhdGUsIHZhbHVlKSB7CisgIFY4Y0FycmF5QnVmZmVyVmlldyh2ODo6SXNvbGF0ZSogaXNvbGF0ZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdmFsdWUpCisgICAgICA6IGlzb2xhdGVfKGlzb2xhdGUpLCBTY29wZWRQZXJzaXN0ZW50KGlzb2xhdGUsIHZhbHVlKSB7CiAgICAgRENIRUNLKHZhbHVlLT5Jc0FycmF5QnVmZmVyVmlldygpKTsKICAgfQogCkBAIC03OSw3ICs3OSw2IEBACiAgICAgdjg6Oklzb2xhdGUqIGlzb2xhdGUsCiAgICAgY29uc3QgU2NyaXB0VmFsdWU8QXJyYXlCdWZmZXJWaWV3PiogYXJyYXlfYnVmZmVyX3ZpZXdfdmFsdWUsCiAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4qIG91dF92YWx1ZSkgewotICBUUkFDS19NRU1PUllfU0NPUEUoIkphdmFzY3JpcHQiKTsKIAogICBpZiAoIWFycmF5X2J1ZmZlcl92aWV3X3ZhbHVlKSB7CiAgICAgKm91dF92YWx1ZSA9IHY4OjpOdWxsKGlzb2xhdGUpOwpAQCAtOTUsNyArOTQsNiBAQAogICAgIHY4OjpJc29sYXRlKiBpc29sYXRlLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2YWx1ZSwgaW50IGNvbnZlcnNpb25fZmxhZ3MsCiAgICAgRXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSwKICAgICBWOGNVc2VyT2JqZWN0SG9sZGVyPFY4Y0FycmF5QnVmZmVyVmlldz4qIG91dF9hcnJheV9idWZmZXJfdmlldykgewotICBUUkFDS19NRU1PUllfU0NPUEUoIkphdmFzY3JpcHQiKTsKICAgRENIRUNLX0VRKDAsIGNvbnZlcnNpb25fZmxhZ3MpOwogICBEQ0hFQ0sob3V0X2FycmF5X2J1ZmZlcl92aWV3KTsKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvdjhjL3Y4Y19lbmdpbmUuY2MgYi9zcmMvY29iYWx0L3NjcmlwdC92OGMvdjhjX2VuZ2luZS5jYwppbmRleCBkMWM3MDQ2Li5jNDM1YjIzIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC92OGMvdjhjX2VuZ2luZS5jYworKysgYi9zcmMvY29iYWx0L3NjcmlwdC92OGMvdjhjX2VuZ2luZS5jYwpAQCAtMTMyLDYgKzEzMiwxNSBAQAogCiAgIGlzb2xhdGVfLT5BZGRHQ1Byb2xvZ3VlQ2FsbGJhY2soR0NQcm9sb2d1ZUNhbGxiYWNrKTsKICAgaXNvbGF0ZV8tPkFkZEdDRXBpbG9ndWVDYWxsYmFjayhHQ0VwaWxvZ3VlQ2FsbGJhY2spOworCisgIC8vIFRoZSBWOCB8U2V0U3RhY2tMaW1pdHwncyBwYXJhbWV0ZXIgaXMgdGhlIG1lbW9yeSBhZGRyZXNzIHRoYXQgaXQgc2hvdWxkIG5vdAorICAvLyBwYXNzLCBhcyBvcHBvc2VkIHRvIHRoZSBzaXplIG9mIHRoZSBzdGFjayB0aGF0IGl0IHNob3VsZCB1c2UuICBXZSBzZXQgaXQKKyAgLy8gdG8gMy80IG9mIHRoZSBtYWluIHRocmVhZCdzIHN0YWNrIHNpemUgdG8gY292ZXIgZm9yIHRoZSBzcGFjZSB1bmRlcm5lYXRoCisgIC8vIHRoZSBzdGFjayBjdXJyZW50bHksIGFuZCB0aGUgc3BhY2Ugd2Ugd2FudCB0byByZXNlcnZlIG9uIHRvcCBvZiB0aGUgc3RhY2sKKyAgLy8gZm9yIHdoZW4gSmF2YVNjcmlwdCBjYWxscyBiYWNrIGludG8gQysrIGJpbmRpbmdzLgorICB1aW50cHRyX3QgaGVyZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PigmaGVyZSk7CisgIGlzb2xhdGVfLT5TZXRTdGFja0xpbWl0KGhlcmUgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAoMyAqIGNvYmFsdDo6YnJvd3Nlcjo6a1dlYk1vZHVsZVN0YWNrU2l6ZSkgLyA0KTsKIH0KIAogVjhjRW5naW5lOjp+VjhjRW5naW5lKCkgewpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9neXAtY29uZmlndXJhdGlvbi5tZCBiL3NyYy9jb2JhbHQvc2l0ZS9kb2NzL3JlZmVyZW5jZS9zdGFyYm9hcmQvZ3lwLWNvbmZpZ3VyYXRpb24ubWQKaW5kZXggNGY4NWFiZC4uODY0ZjU2MiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zaXRlL2RvY3MvcmVmZXJlbmNlL3N0YXJib2FyZC9neXAtY29uZmlndXJhdGlvbi5tZAorKysgYi9zcmMvY29iYWx0L3NpdGUvZG9jcy9yZWZlcmVuY2Uvc3RhcmJvYXJkL2d5cC1jb25maWd1cmF0aW9uLm1kCkBAIC0zNCw3ICszNCw3IEBACiB8ICoqYGNvYmFsdF9tZWRpYV9idWZmZXJfc3RvcmFnZV90eXBlYCoqPGJyPjxicj4gVGhpcyBjYW4gYmUgc2V0IHRvICJtZW1vcnkiIG9yICJmaWxlIi4gIFdoZW4gaXQgaXMgc2V0IHRvICJtZW1vcnkiLCB0aGUgbWVkaWEgYnVmZmVycyB3aWxsIGJlIHN0b3JlZCBpbiBtYWluIG1lbW9yeSBhbGxvY2F0ZWQgYnkgU2JNZW1vcnkgZnVuY3Rpb25zLiAgV2hlbiBpdCBpcyBzZXQgdG8gImZpbGUiLCB0aGUgbWVkaWEgYnVmZmVycyB3aWxsIGJlIHN0b3JlZCBpbiBhIHRlbXBvcmFyeSBmaWxlIGluIHRoZSBzeXN0ZW0gY2FjaGUgZm9sZGVyIGFjcXVpcmVkIGJ5IGNhbGxpbmcgU2JTeXN0ZW1HZXRQYXRoKCkgd2l0aCAia1NiU3lzdGVtUGF0aENhY2hlRGlyZWN0b3J5Ii4gIE5vdGUgdGhhdCB3aGVuIGl0cyB2YWx1ZSBpcyAiZmlsZSIgdGhlIG1lZGlhIHN0YWNrIHdpbGwgc3RpbGwgYWxsb2NhdGUgbWVtb3J5IHRvIGNhY2hlIHRoZSB0aGUgYnVmZmVycyBpbiB1c2UuPGJyPjxicj5UaGUgZGVmYXVsdCB2YWx1ZSBpcyBgJ21lbW9yeSdgLiB8CiB8ICoqYGNvYmFsdF9tZWRpYV9idWZmZXJfdmlkZW9fYnVkZ2V0XzEwODBwYCoqPGJyPjxicj4gU3BlY2lmaWVzIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBtZW1vcnkgdXNlZCBieSB2aWRlbyBidWZmZXJzIG9mIG1lZGlhIHNvdXJjZSBiZWZvcmUgdHJpZ2dlcmluZyBhIGdhcmJhZ2UgY29sbGVjdGlvbiB3aGVuIHRoZSB2aWRlbyByZXNvbHV0aW9uIGlzIGxvd2VyIHRoYW4gMTA4MHAgKDE5MjB4MTA4MCkuICBBIGxhcmdlIHZhbHVlIHdpbGwgY2F1c2UgbW9yZSBtZW1vcnkgYmVpbmcgdXNlZCBieSB2aWRlbyBidWZmZXJzIGJ1dCB3aWxsIGFsc28gbWFrZSBKYXZhU2NyaXB0IGFwcCBsZXNzIGxpa2VseSB0byByZS1kb3dubG9hZCB2aWRlbyBkYXRhLiAgTm90ZSB0aGF0IHRoZSBKYXZhU2NyaXB0IGFwcCBtYXkgZXhwZXJpZW5jZSBzaWduaWZpY2FudCBkaWZmaWN1bHR5IGlmIHRoaXMgdmFsdWUgaXMgdG9vIGxvdy48YnI+PGJyPlRoZSBkZWZhdWx0IHZhbHVlIGlzIGAxNiAqIDEwMjQgKiAxMDI0YC4gfAogfCAqKmBjb2JhbHRfbWVkaWFfYnVmZmVyX3ZpZGVvX2J1ZGdldF80a2AqKjxicj48YnI+IFNwZWNpZmllcyB0aGUgbWF4aW11bSBhbW91bnQgb2YgbWVtb3J5IHVzZWQgYnkgdmlkZW8gYnVmZmVycyBvZiBtZWRpYSBzb3VyY2UgYmVmb3JlIHRyaWdnZXJpbmcgYSBnYXJiYWdlIGNvbGxlY3Rpb24gd2hlbiB0aGUgdmlkZW8gcmVzb2x1dGlvbiBpcyBsb3dlciB0aGFuIDRrICgzODQweDIxNjApLiAgQSBsYXJnZSB2YWx1ZSB3aWxsIGNhdXNlIG1vcmUgbWVtb3J5IGJlaW5nIHVzZWQgYnkgdmlkZW8gYnVmZmVycyBidXQgd2lsbCBhbHNvIG1ha2UgSmF2YVNjcmlwdCBhcHAgbGVzcyBsaWtlbHkgdG8gcmUtZG93bmxvYWQgdmlkZW8gZGF0YS4gIE5vdGUgdGhhdCB0aGUgSmF2YVNjcmlwdCBhcHAgbWF5IGV4cGVyaWVuY2Ugc2lnbmlmaWNhbnQgZGlmZmljdWx0eSBpZiB0aGlzIHZhbHVlIGlzIHRvbyBsb3cuPGJyPjxicj5UaGUgZGVmYXVsdCB2YWx1ZSBpcyBgNjAgKiAxMDI0ICogMTAyNGAuIHwKLXwgKipgY29iYWx0X21lZGlhX3NvdXJjZV8yMDE2YCoqPGJyPjxicj4gVXNlIG1lZGlhIHNvdXJjZSBleHRlbnNpb24gaW1wbGVtZW50YXRpb24gdGhhdCBpcyBjb25mb3JtZWQgdG8gdGhlIENhbmRpZGF0ZSBSZWNvbW1hbmRhdGlvbiBvZiBKdWx5IDV0aCAyMDE2Ljxicj48YnI+VGhlIGRlZmF1bHQgdmFsdWUgaXMgYCc8KGNvYmFsdF9tZWRpYV9zb3VyY2VfMjAxNiknYC4gfAorfCAqKmBjb2JhbHRfbWVkaWFfc291cmNlXzIwMTZgKio8YnI+PGJyPiBVc2UgbWVkaWEgc291cmNlIGV4dGVuc2lvbiBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzIGNvbmZvcm1lZCB0byB0aGUgQ2FuZGlkYXRlIFJlY29tbWVuZGF0aW9uIG9mIEp1bHkgNXRoIDIwMTYuPGJyPjxicj5UaGUgZGVmYXVsdCB2YWx1ZSBpcyBgJzwoY29iYWx0X21lZGlhX3NvdXJjZV8yMDE2KSdgLiB8CiB8ICoqYGNvYmFsdF9taW5pbXVtX2ZyYW1lX3RpbWVfaW5fbWlsbGlzZWNvbmRzYCoqPGJyPjxicj4gQWxsb3cgdGhyb3R0bGluZyBvZiB0aGUgZnJhbWUgcmF0ZS4gVGhpcyBpcyBleHByZXNzZWQgaW4gdGVybXMgb2YgbWlsbGlzZWNvbmRzIGFuZCBjYW4gYmUgYSBmbG9hdGluZyBwb2ludCBudW1iZXIuIEtlZXAgaW4gbWluZCB0aGF0IHN3YXBwaW5nIGZyYW1lcyBtYXkgdGFrZSBzb21lIGFkZGl0aW9uYWwgcHJvY2Vzc2luZyB0aW1lLCBzbyBpdCBtYXkgYmUgYmV0dGVyIHRvIHNwZWNpZnkgYSBsb3dlciBkZWxheS4gRm9yIGV4YW1wbGUsICczMycgaW5zdGVhZCBvZiAnMzMuMzMnIGZvciAzMCBIeiByZWZyZXNoLjxicj48YnI+VGhlIGRlZmF1bHQgdmFsdWUgaXMgYCcxNi4wJ2AuIHwKIHwgKipgY29iYWx0X3BsYXRmb3JtX2RlcGVuZGVuY2llc2AqKjxicj48YnI+IExpc3Qgb2YgcGxhdGZvcm0tc3BlY2lmaWMgdGFyZ2V0cyB0aGF0IGdldCBjb21waWxlZCBpbnRvIGNvYmFsdC48YnI+PGJyPlRoZSBkZWZhdWx0IHZhbHVlIGlzIGBbXWAuIHwKIHwgKipgY29iYWx0X3VzZXJfb25fZXhpdF9zdHJhdGVneWAqKjxicj48YnI+IFRoaXMgdmFyaWFibGUgZGVmaW5lcyB3aGF0IENvYmFsdCdzIHByZWZlcnJlZCBzdHJhdGVneSBzaG91bGQgYmUgZm9yIGhhbmRsaW5nIGludGVybmFsbHkgdHJpZ2dlcmVkIGFwcGxpY2F0aW9uIGV4aXQgcmVxdWVzdHMgKGUuZy4gdGhlIHVzZXIgY2hvb3NlcyB0byBiYWNrIG91dCBvZiB0aGUgYXBwbGljYXRpb24pLjx1bD48bGk+PGNvZGU+c3RvcDwvY29kZT4gLSBUaGUgYXBwbGljYXRpb24gc2hvdWxkIGNhbGwgU2JTeXN0ZW1SZXF1ZXN0U3RvcCgpIG9uIGV4aXQsIHJlc3VsdGluZyBpbiBhIGNvbXBsZXRlIHNodXRkb3duIG9mIHRoZSBhcHBsaWNhdGlvbi48bGk+PGNvZGU+c3VzcGVuZDwvY29kZT4gLSBUaGUgYXBwbGljYXRpb24gc2hvdWxkIGNhbGwgU2JTeXN0ZW1SZXF1ZXN0U3VzcGVuZCgpIG9uIGV4aXQsIHJlc3VsdGluZyBpbiB0aGUgYXBwbGljYXRpb24gYmVpbmcgIm1pbmltaXplZCIuPGxpPjxjb2RlPm5vZXhpdDwvY29kZT4gLSBUaGUgYXBwbGljYXRpb24gc2hvdWxkIG5ldmVyIGFsbG93IHRoZSB1c2VyIHRvIHRyaWdnZXIgYW4gZXhpdCwgdGhpcyB3aWxsIGJlIG1hbmFnZWQgYnkgdGhlIHN5c3RlbS48YnI+PGJyPlRoZSBkZWZhdWx0IHZhbHVlIGlzIGAnc3RvcCdgLiB8CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NwZWVjaC9jb2JhbHRfc3BlZWNoX3JlY29nbml6ZXIuY2MgYi9zcmMvY29iYWx0L3NwZWVjaC9jb2JhbHRfc3BlZWNoX3JlY29nbml6ZXIuY2MKaW5kZXggMGE4YzE2MS4uM2NlZTgyMiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zcGVlY2gvY29iYWx0X3NwZWVjaF9yZWNvZ25pemVyLmNjCisrKyBiL3NyYy9jb2JhbHQvc3BlZWNoL2NvYmFsdF9zcGVlY2hfcmVjb2duaXplci5jYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgImNvYmFsdC9zcGVlY2gvdXJsX2ZldGNoZXJfZmFrZS5oIgogI2VuZGlmICAvLyBkZWZpbmVkKEVOQUJMRV9GQUtFX01JQ1JPUEhPTkUpCiAjaW5jbHVkZSAiY29iYWx0L3NwZWVjaC9taWNyb3Bob25lX21hbmFnZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc3BlZWNoL3NwZWVjaF9yZWNvZ25pdGlvbl9lcnJvci5oIgogI2lmIGRlZmluZWQoU0JfVVNFX1NCX01JQ1JPUEhPTkUpCiAjaW5jbHVkZSAiY29iYWx0L3NwZWVjaC9taWNyb3Bob25lX3N0YXJib2FyZC5oIgogI2VuZGlmICAvLyBkZWZpbmVkKFNCX1VTRV9TQl9NSUNST1BIT05FKQpAQCAtOTEsOCArOTIsOSBAQAogI2VuZGlmICAvLyBkZWZpbmVkKFNCX1VTRV9TQl9NSUNST1BIT05FKQogCiAgIHNlcnZpY2VfLnJlc2V0KG5ldyBHb29nbGVTcGVlY2hTZXJ2aWNlKAotICAgICAgbmV0d29ya19tb2R1bGUsIGJhc2U6OkJpbmQoJkNvYmFsdFNwZWVjaFJlY29nbml6ZXI6Ok9uUmVjb2duaXplckV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSksCisgICAgICBuZXR3b3JrX21vZHVsZSwKKyAgICAgIGJhc2U6OkJpbmQoJkNvYmFsdFNwZWVjaFJlY29nbml6ZXI6Ok9uUmVjb2duaXplckV2ZW50LAorICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSwKICAgICAgIHVybF9mZXRjaGVyX2NyZWF0b3IpKTsKICAgbWljcm9waG9uZV9tYW5hZ2VyXy5yZXNldChuZXcgTWljcm9waG9uZU1hbmFnZXIoCiAgICAgICBiYXNlOjpCaW5kKCZDb2JhbHRTcGVlY2hSZWNvZ25pemVyOjpPbkRhdGFSZWNlaXZlZCwKQEAgLTE0Myw4ICsxNDUsMjIgQEAKIH0KIAogdm9pZCBDb2JhbHRTcGVlY2hSZWNvZ25pemVyOjpPbk1pY0Vycm9yKAotICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8ZG9tOjpFdmVudD4mIGV2ZW50KSB7CisgICAgTWljcm9waG9uZU1hbmFnZXI6Ok1pY3JvcGhvbmVFcnJvciBlcnJvciwKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZXJyb3JfbWVzc2FnZSkgewogICAvLyBBbiBlcnJvciBpcyBvY2N1cmVkIGluIE1pYywgc28gc3RvcCB0aGUgZW5lcmd5IGVuZHBvaW50ZXIgYW5kIHJlY29nbml6ZXIuCisKKyAgU3BlZWNoUmVjb2duaXRpb25FcnJvckNvZGUgc3BlZWNoX2Vycm9yX2NvZGUgPQorICAgICAga1NwZWVjaFJlY29nbml0aW9uRXJyb3JDb2RlQWJvcnRlZDsKKyAgc3dpdGNoIChlcnJvcikgeworICAgIGNhc2UgTWljcm9waG9uZU1hbmFnZXI6Ok1pY3JvcGhvbmVFcnJvcjo6a0Fib3J0ZWQ6CisgICAgICBzcGVlY2hfZXJyb3JfY29kZSA9IGtTcGVlY2hSZWNvZ25pdGlvbkVycm9yQ29kZUFib3J0ZWQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIE1pY3JvcGhvbmVNYW5hZ2VyOjpNaWNyb3Bob25lRXJyb3I6OmtBdWRpb0NhcHR1cmU6CisgICAgICBzcGVlY2hfZXJyb3JfY29kZSA9IGtTcGVlY2hSZWNvZ25pdGlvbkVycm9yQ29kZUF1ZGlvQ2FwdHVyZTsKKyAgICAgIGJyZWFrOworICB9CisgIHNjb3BlZF9yZWZwdHI8ZG9tOjpFdmVudD4gZXZlbnQoCisgICAgICBuZXcgU3BlZWNoUmVjb2duaXRpb25FcnJvcihzcGVlY2hfZXJyb3JfY29kZSwgZXJyb3JfbWVzc2FnZSkpOwogICBlbmRwb2ludGVyX2RlbGVnYXRlXy5TdG9wKCk7CiAgIHNlcnZpY2VfLT5TdG9wKCk7CiAgIFJ1bkV2ZW50Q2FsbGJhY2soZXZlbnQpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zcGVlY2gvY29iYWx0X3NwZWVjaF9yZWNvZ25pemVyLmggYi9zcmMvY29iYWx0L3NwZWVjaC9jb2JhbHRfc3BlZWNoX3JlY29nbml6ZXIuaAppbmRleCAwMDRjNjhkLi5jNzc5ODBhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NwZWVjaC9jb2JhbHRfc3BlZWNoX3JlY29nbml6ZXIuaAorKysgYi9zcmMvY29iYWx0L3NwZWVjaC9jb2JhbHRfc3BlZWNoX3JlY29nbml6ZXIuaApAQCAtMTUsNiArMTUsOCBAQAogI2lmbmRlZiBDT0JBTFRfU1BFRUNIX0NPQkFMVF9TUEVFQ0hfUkVDT0dOSVpFUl9IXwogI2RlZmluZSBDT0JBTFRfU1BFRUNIX0NPQkFMVF9TUEVFQ0hfUkVDT0dOSVpFUl9IXwogCisjaW5jbHVkZSA8c3RyaW5nPgorCiAjaW5jbHVkZSAiY29iYWx0L25ldHdvcmsvbmV0d29ya19tb2R1bGUuaCIKICNpbmNsdWRlICJjb2JhbHQvc3BlZWNoL2VuZHBvaW50ZXJfZGVsZWdhdGUuaCIKICNpbmNsdWRlICJjb2JhbHQvc3BlZWNoL2dvb2dsZV9zcGVlY2hfc2VydmljZS5oIgpAQCAtNTgsNyArNjAsOCBAQAogICAvLyBDYWxsYmFja3MgZnJvbSBtaWMuCiAgIHZvaWQgT25EYXRhUmVjZWl2ZWQoc2NvcGVkX3B0cjxTaGVsbEF1ZGlvQnVzPiBhdWRpb19idXMpOwogICB2b2lkIE9uRGF0YUNvbXBsZXRpb24oKTsKLSAgdm9pZCBPbk1pY0Vycm9yKGNvbnN0IHNjb3BlZF9yZWZwdHI8ZG9tOjpFdmVudD4mIGV2ZW50KTsKKyAgdm9pZCBPbk1pY0Vycm9yKE1pY3JvcGhvbmVNYW5hZ2VyOjpNaWNyb3Bob25lRXJyb3IgZXJyb3IsCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZXJyb3JfbWVzc2FnZSk7CiAKICAgLy8gQ2FsbGJhY2tzIGZyb20gcmVjb2duaXplci4KICAgdm9pZCBPblJlY29nbml6ZXJFdmVudChjb25zdCBzY29wZWRfcmVmcHRyPGRvbTo6RXZlbnQ+JiBldmVudCk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NwZWVjaC9taWNyb3Bob25lX2Zha2UuY2MgYi9zcmMvY29iYWx0L3NwZWVjaC9taWNyb3Bob25lX2Zha2UuY2MKaW5kZXggYzU0ZDM2Yy4uNzc5YThmZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zcGVlY2gvbWljcm9waG9uZV9mYWtlLmNjCisrKyBiL3NyYy9jb2JhbHQvc3BlZWNoL21pY3JvcGhvbmVfZmFrZS5jYwpAQCAtMzAsMTEgKzMwLDcgQEAKIG5hbWVzcGFjZSBjb2JhbHQgewogbmFtZXNwYWNlIHNwZWVjaCB7CiAKLSNpZiBkZWZpbmVkKENPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNikKLXR5cGVkZWYgbWVkaWE6OlNoZWxsQXVkaW9CdXMgU2hlbGxBdWRpb0J1czsKLSNlbHNlICAgLy8gZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCi10eXBlZGVmIDo6bWVkaWE6OlNoZWxsQXVkaW9CdXMgU2hlbGxBdWRpb0J1czsKLSNlbmRpZiAgLy8gZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCit0eXBlZGVmIGF1ZGlvOjpTaGVsbEF1ZGlvQnVzIFNoZWxsQXVkaW9CdXM7CiAKIG5hbWVzcGFjZSB7CiAKQEAgLTQ5LDYgKzQ1LDggQEAKIC8vIFRoZSBwb3NzaWJsaXR5IG9mIG1pY3JvcGhvbmUgY2xvc2UgZmFpbGVkIGlzIDEvMjAuCiBjb25zdCBpbnQga0Nsb3NlUmFuZ2UgPSAyMDsKIGNvbnN0IGludCBrRmFpbHVyZU51bWJlciA9IDU7Citjb25zdCBpbnQga1N1cHBvcnRlZE1vbm9DaGFubmVsID0gMTsKK2NvbnN0IGNoYXIga01pY3JvcGhvbmVMYWJlbFtdID0gIkZha2VNaWNyb3Bob25lIjsKIAogYm9vbCBTaG91bGRGYWlsKGludCByYW5nZSkgewogICByZXR1cm4gYmFzZTo6UmFuZEdlbmVyYXRvcihyYW5nZSkgPT0ga0ZhaWx1cmVOdW1iZXI7CkBAIC04OSw5ICs4NywxMyBAQAogICAgIH0KICAgfSBlbHNlIHsKICAgICBmaWxlX2xlbmd0aF8gPSBzdGQ6Om1pbihvcHRpb25zLmF1ZGlvX2RhdGFfc2l6ZSwga01heEJ1ZmZlclNpemUpOwotICAgIERDSEVDSyhmaWxlX2xlbmd0aF8gPiAwKTsKLSAgICBmaWxlX2J1ZmZlcl8ucmVzZXQobmV3IHVpbnQ4W2ZpbGVfbGVuZ3RoX10pOwotICAgIFNiTWVtb3J5Q29weShmaWxlX2J1ZmZlcl8uZ2V0KCksIG9wdGlvbnMuZXh0ZXJuYWxfYXVkaW9fZGF0YSwgZmlsZV9sZW5ndGhfKTsKKyAgICBEQ0hFQ0tfR1QoZmlsZV9sZW5ndGhfLCAwKTsKKyAgICBhdWRpb19idXNfLnJlc2V0KG5ldyBTaGVsbEF1ZGlvQnVzKAorICAgICAgICBrU3VwcG9ydGVkTW9ub0NoYW5uZWwsCisgICAgICAgIGZpbGVfbGVuZ3RoXyAvIGF1ZGlvOjpHZXRTYW1wbGVUeXBlU2l6ZShTaGVsbEF1ZGlvQnVzOjprSW50MTYpLAorICAgICAgICBTaGVsbEF1ZGlvQnVzOjprSW50MTYsIFNoZWxsQXVkaW9CdXM6OmtJbnRlcmxlYXZlZCkpOworICAgIFNiTWVtb3J5Q29weShhdWRpb19idXNfLT5pbnRlcmxlYXZlZF9kYXRhKCksIG9wdGlvbnMuZXh0ZXJuYWxfYXVkaW9fZGF0YSwKKyAgICAgICAgICAgICAgICAgZmlsZV9sZW5ndGhfKTsKICAgfQogfQogCkBAIC0xMDUsNyArMTA3LDcgQEAKIAogICBpZiAocmVhZF9kYXRhX2Zyb21fZmlsZV8pIHsKICAgICAvLyBSZWFkIGZyb20gbG9jYWwgZmlsZXMuCi0gICAgRENIRUNLKGZpbGVfcGF0aHNfLnNpemUoKSAhPSAwKTsKKyAgICBEQ0hFQ0tfTkUoZmlsZV9wYXRoc18uc2l6ZSgpLCAwdSk7CiAgICAgc2l6ZV90IHJhbmRvbV9pbmRleCA9CiAgICAgICAgIHN0YXRpY19jYXN0PHNpemVfdD4oYmFzZTo6UmFuZEdlbmVyYXRvcihmaWxlX3BhdGhzXy5zaXplKCkpKTsKICAgICBzdGFyYm9hcmQ6OlNjb3BlZEZpbGUgZmlsZShmaWxlX3BhdGhzX1tyYW5kb21faW5kZXhdLnZhbHVlKCkuY19zdHIoKSwKQEAgLTExMyw3ICsxMTUsNyBAQAogICAgIERDSEVDSyhmaWxlLklzVmFsaWQoKSk7CiAgICAgaW50IGZpbGVfYnVmZmVyX3NpemUgPQogICAgICAgICBzdGQ6Om1pbihzdGF0aWNfY2FzdDxpbnQ+KGZpbGUuR2V0U2l6ZSgpKSwga01heEJ1ZmZlclNpemUpOwotICAgIERDSEVDSyhmaWxlX2J1ZmZlcl9zaXplID4gMCk7CisgICAgRENIRUNLX0dUKGZpbGVfYnVmZmVyX3NpemUsIDApOwogCiAgICAgc2NvcGVkX2FycmF5PGNoYXI+IGF1ZGlvX2lucHV0KG5ldyBjaGFyW2ZpbGVfYnVmZmVyX3NpemVdKTsKICAgICBpbnQgcmVhZF9ieXRlcyA9IGZpbGUuUmVhZEFsbChhdWRpb19pbnB1dC5nZXQoKSwgZmlsZV9idWZmZXJfc2l6ZSk7CkBAIC0xMjUsMTEgKzEyNywxNCBAQAogICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4Kj4oYXVkaW9faW5wdXQuZ2V0KCkpLCBmaWxlX2J1ZmZlcl9zaXplLAogICAgICAgICBhdWRpbzo6a1NhbXBsZVR5cGVJbnQxNikpOwogICAgIGNvbnN0IGZsb2F0IGtTdXBwb3J0ZWRTYW1wbGVSYXRlID0gMTYwMDAuMGY7Ci0gICAgY29uc3QgaW50IGtTdXBwb3J0ZWRNb25vQ2hhbm5lbCA9IDE7CiAgICAgaWYgKCFyZWFkZXIpIHsKICAgICAgIC8vIElmIGl0IGlzIG5vdCBhIFdBViBmaWxlLCByZWFkIGF1ZGlvIGRhdGEgYXMgcmF3IGF1ZGlvLgotICAgICAgZmlsZV9idWZmZXJfLnJlc2V0KG5ldyB1aW50OFtmaWxlX2J1ZmZlcl9zaXplXSk7Ci0gICAgICBTYk1lbW9yeUNvcHkoZmlsZV9idWZmZXJfLmdldCgpLCBhdWRpb19pbnB1dC5nZXQoKSwgZmlsZV9idWZmZXJfc2l6ZSk7CisgICAgICBhdWRpb19idXNfLnJlc2V0KG5ldyBTaGVsbEF1ZGlvQnVzKAorICAgICAgICAgIGtTdXBwb3J0ZWRNb25vQ2hhbm5lbCwKKyAgICAgICAgICBmaWxlX2J1ZmZlcl9zaXplIC8gYXVkaW86OkdldFNhbXBsZVR5cGVTaXplKFNoZWxsQXVkaW9CdXM6OmtJbnQxNiksCisgICAgICAgICAgU2hlbGxBdWRpb0J1czo6a0ludDE2LCBTaGVsbEF1ZGlvQnVzOjprSW50ZXJsZWF2ZWQpKTsKKyAgICAgIFNiTWVtb3J5Q29weShhdWRpb19idXNfLT5pbnRlcmxlYXZlZF9kYXRhKCksIGF1ZGlvX2lucHV0LmdldCgpLAorICAgICAgICAgICAgICAgICAgIGZpbGVfYnVmZmVyX3NpemUpOwogICAgICAgZmlsZV9sZW5ndGhfID0gZmlsZV9idWZmZXJfc2l6ZTsKICAgICB9IGVsc2UgaWYgKHJlYWRlci0+c2FtcGxlX3R5cGUoKSAhPSBTaGVsbEF1ZGlvQnVzOjprSW50MTYgfHwKICAgICAgICAgICAgICAgIHJlYWRlci0+c2FtcGxlX3JhdGUoKSAhPSBrU3VwcG9ydGVkU2FtcGxlUmF0ZSB8fApAQCAtMTM4LDEzICsxNDMsMTAgQEAKICAgICAgIC8vIGl0IGFzIGFuIGVycm9yLgogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0gZWxzZSB7Ci0gICAgICAvLyBSZWFkIFdBViBQQ00xNiBhdWRpbyBkYXRhLgotICAgICAgaW50IHNpemUgPQorICAgICAgYXVkaW9fYnVzXyA9IHJlYWRlci0+UmVzZXRBbmRSZXR1cm5BdWRpb0J1cygpLlBhc3MoKTsKKyAgICAgIGZpbGVfbGVuZ3RoXyA9CiAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihyZWFkZXItPm51bWJlcl9vZl9mcmFtZXMoKSAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbzo6R2V0U2FtcGxlVHlwZVNpemUocmVhZGVyLT5zYW1wbGVfdHlwZSgpKSk7Ci0gICAgICBmaWxlX2J1ZmZlcl8ucmVzZXQobmV3IHVpbnQ4W3NpemVdKTsKLSAgICAgIFNiTWVtb3J5Q29weShmaWxlX2J1ZmZlcl8uZ2V0KCksIHJlYWRlci0+c2FtcGxlX2RhdGEoKS5nZXQoKSwgc2l6ZSk7Ci0gICAgICBmaWxlX2xlbmd0aF8gPSBzaXplOwogICAgIH0KICAgfQogICByZXR1cm4gdHJ1ZTsKQEAgLTE1OSw3ICsxNjEsOCBAQAogICB9CiAKICAgaW50IGNvcHlfYnl0ZXMgPSBzdGQ6Om1pbihmaWxlX2xlbmd0aF8gLSByZWFkX2luZGV4XywgZGF0YV9zaXplKTsKLSAgU2JNZW1vcnlDb3B5KG91dF9kYXRhLCBmaWxlX2J1ZmZlcl8uZ2V0KCkgKyByZWFkX2luZGV4XywgY29weV9ieXRlcyk7CisgIFNiTWVtb3J5Q29weShvdXRfZGF0YSwgYXVkaW9fYnVzXy0+aW50ZXJsZWF2ZWRfZGF0YSgpICsgcmVhZF9pbmRleF8sCisgICAgICAgICAgICAgICBjb3B5X2J5dGVzKTsKICAgcmVhZF9pbmRleF8gKz0gY29weV9ieXRlczsKICAgaWYgKHJlYWRfaW5kZXhfID09IGZpbGVfbGVuZ3RoXykgewogICAgIHJlYWRfaW5kZXhfID0gMDsKQEAgLTE3Miw3ICsxNzUsNyBAQAogICBEQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7CiAKICAgaWYgKHJlYWRfZGF0YV9mcm9tX2ZpbGVfKSB7Ci0gICAgZmlsZV9idWZmZXJfLnJlc2V0KCk7CisgICAgYXVkaW9fYnVzXy5yZXNldCgpOwogICAgIGZpbGVfbGVuZ3RoXyA9IC0xOwogICB9CiAKQEAgLTE5MCw2ICsxOTMsOCBAQAogICByZXR1cm4ga01pbk1pY3JvcGhvbmVSZWFkSW5CeXRlczsKIH0KIAorY29uc3QgY2hhciogTWljcm9waG9uZUZha2U6OkxhYmVsKCkgeyByZXR1cm4ga01pY3JvcGhvbmVMYWJlbDsgfQorCiB9ICAvLyBuYW1lc3BhY2Ugc3BlZWNoCiB9ICAvLyBuYW1lc3BhY2UgY29iYWx0CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3BlZWNoL21pY3JvcGhvbmVfZmFrZS5oIGIvc3JjL2NvYmFsdC9zcGVlY2gvbWljcm9waG9uZV9mYWtlLmgKaW5kZXggYzc1NTA3MS4uMjZjZmVhNSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zcGVlY2gvbWljcm9waG9uZV9mYWtlLmgKKysrIGIvc3JjL2NvYmFsdC9zcGVlY2gvbWljcm9waG9uZV9mYWtlLmgKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlICJiYXNlL2ZpbGVfcGF0aC5oIgogI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKICNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgorI2luY2x1ZGUgImNvYmFsdC9hdWRpby9hdWRpb19oZWxwZXJzLmgiCiAjaW5jbHVkZSAiY29iYWx0L3NwZWVjaC9taWNyb3Bob25lLmgiCiAKIG5hbWVzcGFjZSBjb2JhbHQgewpAQCAtNDMsMTQgKzQ0LDE0IEBACiAgIGJvb2wgQ2xvc2UoKSBvdmVycmlkZTsKICAgaW50IE1pbk1pY3JvcGhvbmVSZWFkSW5CeXRlcygpIG92ZXJyaWRlOwogICBib29sIElzVmFsaWQoKSBvdmVycmlkZSB7IHJldHVybiBpc192YWxpZF87IH0KLSAgY29uc3QgY2hhciogTGFiZWwoKSBvdmVycmlkZSB7IHJldHVybiAiIjsgfQorICBjb25zdCBjaGFyKiBMYWJlbCgpIG92ZXJyaWRlOwogCiAgcHJpdmF0ZToKICAgYmFzZTo6VGhyZWFkQ2hlY2tlciB0aHJlYWRfY2hlY2tlcl87CiAKICAgYm9vbCByZWFkX2RhdGFfZnJvbV9maWxlXzsKICAgc3RkOjp2ZWN0b3I8RmlsZVBhdGg+IGZpbGVfcGF0aHNfOwotICBzY29wZWRfYXJyYXk8dWludDg+IGZpbGVfYnVmZmVyXzsKKyAgc2NvcGVkX3B0cjxhdWRpbzo6U2hlbGxBdWRpb0J1cz4gYXVkaW9fYnVzXzsKICAgaW50IGZpbGVfbGVuZ3RoXzsKICAgaW50IHJlYWRfaW5kZXhfOwogICBib29sIGlzX3ZhbGlkXzsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3BlZWNoL21pY3JvcGhvbmVfbWFuYWdlci5jYyBiL3NyYy9jb2JhbHQvc3BlZWNoL21pY3JvcGhvbmVfbWFuYWdlci5jYwppbmRleCBhYzM4Nzg3Li4xNmRhZWQyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NwZWVjaC9taWNyb3Bob25lX21hbmFnZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9zcGVlY2gvbWljcm9waG9uZV9tYW5hZ2VyLmNjCkBAIC0xNCw4ICsxNCw2IEBACiAKICNpbmNsdWRlICJjb2JhbHQvc3BlZWNoL21pY3JvcGhvbmVfbWFuYWdlci5oIgogCi0jaW5jbHVkZSAiY29iYWx0L3NwZWVjaC9zcGVlY2hfcmVjb2duaXRpb25fZXJyb3IuaCIKLQogbmFtZXNwYWNlIGNvYmFsdCB7CiBuYW1lc3BhY2Ugc3BlZWNoIHsKIApAQCAtNzIsOCArNzAsOCBAQAogICAgIERMT0coV0FSTklORykgPDwgIk1pY3JvcGhvbmUgY3JlYXRpb24gZmFpbGVkLiI7CiAgICAgbWljcm9waG9uZV8ucmVzZXQoKTsKICAgICBzdGF0ZV8gPSBrRXJyb3I7Ci0gICAgZXJyb3JfY2FsbGJhY2tfLlJ1bihuZXcgU3BlZWNoUmVjb2duaXRpb25FcnJvcigKLSAgICAgICAga1NwZWVjaFJlY29nbml0aW9uRXJyb3JDb2RlQXVkaW9DYXB0dXJlLCAiTm8gbWljcm9waG9uZSBhdmFpbGFibGUuIikpOworICAgIGVycm9yX2NhbGxiYWNrXy5SdW4oTWljcm9waG9uZUVycm9yOjprQXVkaW9DYXB0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgIk5vIG1pY3JvcGhvbmUgYXZhaWxhYmxlLiIpOwogICAgIHJldHVybiBmYWxzZTsKICAgfQogfQpAQCAtODksOCArODcsOCBAQAogICBEQ0hFQ0sobWljcm9waG9uZV8pOwogICBpZiAoIW1pY3JvcGhvbmVfLT5PcGVuKCkpIHsKICAgICBzdGF0ZV8gPSBrRXJyb3I7Ci0gICAgZXJyb3JfY2FsbGJhY2tfLlJ1bihuZXcgU3BlZWNoUmVjb2duaXRpb25FcnJvcigKLSAgICAgICAga1NwZWVjaFJlY29nbml0aW9uRXJyb3JDb2RlQWJvcnRlZCwgIk1pY3JvcGhvbmUgb3BlbiBmYWlsZWQuIikpOworICAgIGVycm9yX2NhbGxiYWNrXy5SdW4oTWljcm9waG9uZUVycm9yOjprQWJvcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJNaWNyb3Bob25lIG9wZW4gZmFpbGVkLiIpOwogICAgIHJldHVybjsKICAgfQogCkBAIC0xMTcsOCArMTE1LDggQEAKICAgaWYgKG1pY3JvcGhvbmVfKSB7CiAgICAgaWYgKCFtaWNyb3Bob25lXy0+Q2xvc2UoKSkgewogICAgICAgc3RhdGVfID0ga0Vycm9yOwotICAgICAgZXJyb3JfY2FsbGJhY2tfLlJ1bihuZXcgU3BlZWNoUmVjb2duaXRpb25FcnJvcigKLSAgICAgICAgICBrU3BlZWNoUmVjb2duaXRpb25FcnJvckNvZGVBYm9ydGVkLCAiTWljcm9waG9uZSBjbG9zZSBmYWlsZWQuIikpOworICAgICAgZXJyb3JfY2FsbGJhY2tfLlJ1bihNaWNyb3Bob25lRXJyb3I6OmtBYm9ydGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiTWljcm9waG9uZSBjbG9zZSBmYWlsZWQuIik7CiAgICAgICByZXR1cm47CiAgICAgfQogICAgIGNvbXBsZXRpb25fY2FsbGJhY2tfLlJ1bigpOwpAQCAtMTQ2LDggKzE0NCw4IEBACiAgICAgZGF0YV9yZWNlaXZlZF9jYWxsYmFja18uUnVuKG91dHB1dF9hdWRpb19idXMuUGFzcygpKTsKICAgfSBlbHNlIGlmIChyZWFkX2J5dGVzICE9IDApIHsKICAgICBzdGF0ZV8gPSBrRXJyb3I7Ci0gICAgZXJyb3JfY2FsbGJhY2tfLlJ1bihuZXcgU3BlZWNoUmVjb2duaXRpb25FcnJvcigKLSAgICAgICAga1NwZWVjaFJlY29nbml0aW9uRXJyb3JDb2RlQWJvcnRlZCwgIk1pY3JvcGhvbmUgcmVhZCBmYWlsZWQuIikpOworICAgIGVycm9yX2NhbGxiYWNrXy5SdW4oTWljcm9waG9uZUVycm9yOjprQWJvcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJNaWNyb3Bob25lIHJlYWQgZmFpbGVkLiIpOwogICAgIHBvbGxfbWljX2V2ZW50c190aW1lcl8tPlN0b3AoKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zcGVlY2gvbWljcm9waG9uZV9tYW5hZ2VyLmggYi9zcmMvY29iYWx0L3NwZWVjaC9taWNyb3Bob25lX21hbmFnZXIuaAppbmRleCBkYjA3OTYyLi40ZGYwMGY0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NwZWVjaC9taWNyb3Bob25lX21hbmFnZXIuaAorKysgYi9zcmMvY29iYWx0L3NwZWVjaC9taWNyb3Bob25lX21hbmFnZXIuaApAQCAtMTUsNiArMTUsOCBAQAogI2lmbmRlZiBDT0JBTFRfU1BFRUNIX01JQ1JPUEhPTkVfTUFOQUdFUl9IXwogI2RlZmluZSBDT0JBTFRfU1BFRUNIX01JQ1JPUEhPTkVfTUFOQUdFUl9IXwogCisjaW5jbHVkZSA8c3RyaW5nPgorCiAjaW5jbHVkZSAiY29iYWx0L3NwZWVjaC9zcGVlY2hfY29uZmlndXJhdGlvbi5oIgogCiAjaW5jbHVkZSAiYmFzZS9jYWxsYmFjay5oIgpAQCAtMzYsNiArMzgsMTAgQEAKIC8vIGEgc2VsZi1tYW5hZ2VkIHBvbGxlciB0byBmZXRjaCBhdWRpbyBkYXRhIGZyb20gbWljcm9waG9uZS4KIGNsYXNzIE1pY3JvcGhvbmVNYW5hZ2VyIHsKICBwdWJsaWM6CisgIGVudW0gY2xhc3MgTWljcm9waG9uZUVycm9yIHsKKyAgICBrQXVkaW9DYXB0dXJlLAorICAgIGtBYm9ydGVkLAorICB9OwogI2lmIGRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQogICB0eXBlZGVmIG1lZGlhOjpTaGVsbEF1ZGlvQnVzIFNoZWxsQXVkaW9CdXM7CiAjZWxzZSAgIC8vIGRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQpAQCAtNDMsNyArNDksOCBAQAogI2VuZGlmICAvLyBkZWZpbmVkKENPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNikKICAgdHlwZWRlZiBiYXNlOjpDYWxsYmFjazx2b2lkKHNjb3BlZF9wdHI8U2hlbGxBdWRpb0J1cz4pPiBEYXRhUmVjZWl2ZWRDYWxsYmFjazsKICAgdHlwZWRlZiBiYXNlOjpDYWxsYmFjazx2b2lkKHZvaWQpPiBDb21wbGV0aW9uQ2FsbGJhY2s7Ci0gIHR5cGVkZWYgYmFzZTo6Q2FsbGJhY2s8dm9pZChjb25zdCBzY29wZWRfcmVmcHRyPGRvbTo6RXZlbnQ+Jik+IEVycm9yQ2FsbGJhY2s7CisgIHR5cGVkZWYgYmFzZTo6Q2FsbGJhY2s8dm9pZChNaWNyb3Bob25lRXJyb3IsIGNvbnN0IHN0ZDo6c3RyaW5nJik+CisgICAgICBFcnJvckNhbGxiYWNrOwogICB0eXBlZGVmIGJhc2U6OkNhbGxiYWNrPHNjb3BlZF9wdHI8TWljcm9waG9uZT4oaW50KT4gTWljcm9waG9uZUNyZWF0b3I7CiAKICAgTWljcm9waG9uZU1hbmFnZXIoY29uc3QgRGF0YVJlY2VpdmVkQ2FsbGJhY2smIGRhdGFfcmVjZWl2ZWQsCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NwZWVjaC9taWNyb3Bob25lX3N0YXJib2FyZC5oIGIvc3JjL2NvYmFsdC9zcGVlY2gvbWljcm9waG9uZV9zdGFyYm9hcmQuaAppbmRleCAyNzI5NDQxLi4zZGY1MGRkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NwZWVjaC9taWNyb3Bob25lX3N0YXJib2FyZC5oCisrKyBiL3NyYy9jb2JhbHQvc3BlZWNoL21pY3JvcGhvbmVfc3RhcmJvYXJkLmgKQEAgLTMwLDYgKzMwLDggQEAKIGNsYXNzIE1pY3JvcGhvbmVTdGFyYm9hcmQgOiBwdWJsaWMgTWljcm9waG9uZSB7CiAgcHVibGljOgogICBzdGF0aWMgY29uc3QgaW50IGtEZWZhdWx0U2FtcGxlUmF0ZSA9IDE2MDAwOworICAvLyBTdGFyYm9hcmQgdXNlcyBpbnQxNiBhcyBzYW1wbGUgc2l6ZS4KKyAgc3RhdGljIGNvbnN0IGludDE2IGtTYk1pY3JvcGhvbmVTYW1wbGVTaXplSW5CeXRlcyA9IDI7CiAKICAgTWljcm9waG9uZVN0YXJib2FyZChpbnQgc2FtcGxlX3JhdGUsIGludCBidWZmZXJfc2l6ZV9ieXRlcyk7CiAgIH5NaWNyb3Bob25lU3RhcmJvYXJkKCkgb3ZlcnJpZGU7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NwZWVjaC9zYW5kYm94L3NhbmRib3guZ3lwIGIvc3JjL2NvYmFsdC9zcGVlY2gvc2FuZGJveC9zYW5kYm94Lmd5cAppbmRleCBmMjM4NDEwLi5hNGJhNWM3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NwZWVjaC9zYW5kYm94L3NhbmRib3guZ3lwCisrKyBiL3NyYy9jb2JhbHQvc3BlZWNoL3NhbmRib3gvc2FuZGJveC5neXAKQEAgLTMwLDYgKzMwLDcgQEAKICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvYXVkaW8vYXVkaW8uZ3lwOmF1ZGlvJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9iYXNlL2Jhc2UuZ3lwOmJhc2UnLAorICAgICAgICAnPChERVBUSCkvY29iYWx0L2RvbS9kb20uZ3lwOmRvbScsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvbG9hZGVyL2xvYWRlci5neXA6bG9hZGVyJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9uZXR3b3JrL25ldHdvcmsuZ3lwOm5ldHdvcmsnLAogICAgICAgICAnPChERVBUSCkvY29iYWx0L3NjcmlwdC9lbmdpbmUuZ3lwOmVuZ2luZScsCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NwZWVjaC9zcGVlY2guZ3lwIGIvc3JjL2NvYmFsdC9zcGVlY2gvc3BlZWNoLmd5cAppbmRleCAzMThmMDQ0Li5jMzkyZWM3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NwZWVjaC9zcGVlY2guZ3lwCisrKyBiL3NyYy9jb2JhbHQvc3BlZWNoL3NwZWVjaC5neXAKQEAgLTcyLDcgKzcyLDYgQEAKICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvYmFzZS9iYXNlLmd5cDpiYXNlJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9icm93c2VyL2Jyb3dzZXJfYmluZGluZ3NfZ2VuLmd5cDpnZW5lcmF0ZWRfdHlwZXMnLAotICAgICAgICAnPChERVBUSCkvY29iYWx0L2RvbS9kb20uZ3lwOmRvbScsCiAgICAgICAgICc8KERFUFRIKS9jb250ZW50L2Jyb3dzZXIvc3BlZWNoL3NwZWVjaC5neXA6c3BlZWNoJywKICAgICAgICAgJzwoREVQVEgpL3RoaXJkX3BhcnR5L2ZsYWMvZmxhYy5neXA6bGliZmxhYycsCiAgICAgICAgICc8KERFUFRIKS90aGlyZF9wYXJ0eS9wcm90b2J1Zi9wcm90b2J1Zi5neXA6cHJvdG9idWZfbGl0ZScsCkBAIC0xMDEsNiArMTAwLDkgQEAKICAgICAgICAgICAgICd1cmxfZmV0Y2hlcl9mYWtlLmNjJywKICAgICAgICAgICAgICd1cmxfZmV0Y2hlcl9mYWtlLmgnLAogICAgICAgICAgIF0sCisgICAgICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvYXVkaW8vYXVkaW8uZ3lwOmF1ZGlvJywKKyAgICAgICAgICBdLAogICAgICAgICAgICdkZWZpbmVzJzogWwogICAgICAgICAgICAgJ0VOQUJMRV9GQUtFX01JQ1JPUEhPTkUnLAogICAgICAgICAgIF0sCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NwZWVjaC9zcGVlY2hfc3ludGhlc2lzLmNjIGIvc3JjL2NvYmFsdC9zcGVlY2gvc3BlZWNoX3N5bnRoZXNpcy5jYwppbmRleCAzMzQyYjk0Li4xYjI5YjdmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NwZWVjaC9zcGVlY2hfc3ludGhlc2lzLmNjCisrKyBiL3NyYy9jb2JhbHQvc3BlZWNoL3NwZWVjaF9zeW50aGVzaXMuY2MKQEAgLTcwLDcgKzcwLDcgQEAKICAgZG9tOjpFdmVudFRhcmdldDo6VHJhY2VNZW1iZXJzKHRyYWNlcik7CiAKICAgdHJhY2VyLT5UcmFjZUl0ZW1zKHV0dGVyYW5jZXNfKTsKLSAgdHJhY2VyLT5UcmFjZVNlcXVlbmNlKHZvaWNlc18pOworICB0cmFjZXItPlRyYWNlSXRlbXModm9pY2VzXyk7CiAgIHRyYWNlci0+VHJhY2UobmF2aWdhdG9yXyk7CiB9CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3RvcmFnZS9zYXZlZ2FtZV9zdGFyYm9hcmQuY2MgYi9zcmMvY29iYWx0L3N0b3JhZ2Uvc2F2ZWdhbWVfc3RhcmJvYXJkLmNjCmluZGV4IGEyZmUzNjIuLjI1NTE3NmMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc3RvcmFnZS9zYXZlZ2FtZV9zdGFyYm9hcmQuY2MKKysrIGIvc3JjL2NvYmFsdC9zdG9yYWdlL3NhdmVnYW1lX3N0YXJib2FyZC5jYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKICNpbmNsdWRlICJiYXNlL29wdGlvbmFsLmgiCiAjaW5jbHVkZSAiYmFzZS9wYXRoX3NlcnZpY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvc3RvcmFnZS9zdG9yZV91cGdyYWRlL3VwZ3JhZGUuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvc3RvcmFnZS5oIgogI2luY2x1ZGUgInN0YXJib2FyZC91c2VyLmgiCiAKQEAgLTI4LDEwICsyOSwzMSBAQAogbmFtZXNwYWNlIHN0b3JhZ2UgewogbmFtZXNwYWNlIHsKIAordXNpbmcgY29iYWx0OjpzdG9yYWdlOjpzdG9yZV91cGdyYWRlOjpJc1VwZ3JhZGVSZXF1aXJlZDsKK3VzaW5nIGNvYmFsdDo6c3RvcmFnZTo6c3RvcmVfdXBncmFkZTo6VXBncmFkZVN0b3JlOworCiAvLyBBbiBhcmJpdHJhcnkgbWF4IHNpemUgZm9yIHRoZSBzYXZlIGdhbWUgZmlsZSBzbyB0aGF0LCBmb3IgZXhhbXBsZSwgYSBjb3JydXB0CiAvLyBmaWxlc3lzdGVtIGNhbm5vdCBjYXVzZSB1cyB0byBhbGxvY2F0ZSBhIGZhdGFsbHkgbGFyZ2UgbWVtb3J5IGJ1ZmZlci4KIHNpemVfdCBrTWF4U2F2ZUdhbWVTaXplQnl0ZXMgPSA0ICogMTAyNCAqIDEwMjQ7CiAKK2Jvb2wgV3JpdGVSZWNvcmQoY29uc3Qgc2NvcGVkX3B0cjxzdGFyYm9hcmQ6OlN0b3JhZ2VSZWNvcmQ+JiByZWNvcmQsCisgICAgICAgICAgICAgICAgIGNvbnN0IFNhdmVnYW1lOjpCeXRlVmVjdG9yJiBieXRlcyk7CisKK2Jvb2wgVXBncmFkZShTYXZlZ2FtZTo6Qnl0ZVZlY3RvciogYnl0ZXNfcHRyLAorICAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9wdHI8c3RhcmJvYXJkOjpTdG9yYWdlUmVjb3JkPiYgcmVjb3JkKSB7CisgIERMT0coSU5GTykgPDwgIlVQR1JBRElORyBSZWNvcmQgd2l0aCBzaXplPSIgPDwgYnl0ZXNfcHRyLT5zaXplKCk7CisgIGlmIChJc1VwZ3JhZGVSZXF1aXJlZCgqYnl0ZXNfcHRyKSkgeworICAgIGlmICghVXBncmFkZVN0b3JlKGJ5dGVzX3B0cikpIHsKKyAgICAgIERMT0coRVJST1IpIDw8ICJVcGdyYWRlIGZhaWxlZCI7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgV3JpdGVSZWNvcmQocmVjb3JkLCAqYnl0ZXNfcHRyKTsKKyAgRExPRyhJTkZPKSA8PCAiVVBHUkFESU5HIGJ5dGVzX3B0ci5zaXplPSIgPDwgYnl0ZXNfcHRyLT5zaXplKCk7CisgIHJldHVybiB0cnVlOworfQorCiBib29sIFJlYWRSZWNvcmQoU2F2ZWdhbWU6OkJ5dGVWZWN0b3IqIGJ5dGVzX3B0ciwgc2l6ZV90IG1heF90b19yZWFkLAogICAgICAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9wdHI8c3RhcmJvYXJkOjpTdG9yYWdlUmVjb3JkPiYgcmVjb3JkKSB7CiAgIGlmICghcmVjb3JkLT5Jc1ZhbGlkKCkpIHsKQEAgLTY1LDYgKzg3LDEwIEBACiAgIGlmIChzdWNjZXNzKSB7CiAgICAgRExPRyhJTkZPKSA8PCAiU3VjY2Vzc2Z1bGx5IHJlYWQgc3RvcmFnZSByZWNvcmQuIjsKICAgfQorICBpZiAoIVVwZ3JhZGUoYnl0ZXNfcHRyLCByZWNvcmQpKSB7CisgICAgRExPRyhXQVJOSU5HKSA8PCBfX0ZVTkNUSU9OX18gPDwgIjogVXBncmFkZSBGYWlsZWQiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQogICByZXR1cm4gc3VjY2VzczsKIH0KIApAQCAtMTE3LDcgKzE0Myw2IEBACiAKICBwcml2YXRlOgogICBib29sIE1pZ3JhdGVGcm9tRmFsbGJhY2soKTsKLQogICBzY29wZWRfcHRyPHN0YXJib2FyZDo6U3RvcmFnZVJlY29yZD4gcmVjb3JkXzsKIH07CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3RvcmFnZS9zcWxfdmZzLmNjIGIvc3JjL2NvYmFsdC9zdG9yYWdlL3NxbF92ZnMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MmY4NzcuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9zdG9yYWdlL3NxbF92ZnMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgImNvYmFsdC9zdG9yYWdlL3NxbF92ZnMuaCIKLQotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgImJhc2UvcmFuZF91dGlsLmgiCi0jaW5jbHVkZSAiYmFzZS9zdHJpbmdfdXRpbC5oIgotI2luY2x1ZGUgImJhc2Uvc3luY2hyb25pemF0aW9uL2xvY2suaCIKLSNpbmNsdWRlICJjb2JhbHQvc3RvcmFnZS92aXJ0dWFsX2ZpbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc3RvcmFnZS92aXJ0dWFsX2ZpbGVfc3lzdGVtLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvc3FsaXRlL3NxbGl0ZTMuaCIKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2Ugc3RvcmFnZSB7Ci0KLW5hbWVzcGFjZSB7Ci0KLS8vIEEgInN1YmNsYXNzIiBvZiBzcWxpdGUzX2ZpbGUgd2l0aCBvdXIgcmVxdWlyZWQgZGF0YSBzdHJ1Y3R1cmVzIGFkZGVkLgotc3RydWN0IHZpcnR1YWxfZmlsZSB7Ci0gIHNxbGl0ZTNfZmlsZSBzcWxfaW50ZXJuYWxfZmlsZTsKLSAgVmlydHVhbEZpbGUqIGZpbGU7Ci0gIGJhc2U6OkxvY2sqIGxvY2s7Ci0gIGludCBjdXJyZW50X2xvY2s7Ci0gIGludCBzaGFyZWQ7Ci19OwotCi1pbnQgVmZzQ2xvc2Uoc3FsaXRlM19maWxlKiBmaWxlKSB7Ci0gIHZpcnR1YWxfZmlsZSogdmZpbGUgPSByZWludGVycHJldF9jYXN0PHZpcnR1YWxfZmlsZSo+KGZpbGUpOwotICBkZWxldGUgdmZpbGUtPmxvY2s7Ci0gIHJldHVybiBTUUxJVEVfT0s7Ci19Ci0KLWludCBWZnNSZWFkKHNxbGl0ZTNfZmlsZSogZmlsZSwgdm9pZCogb3V0LCBpbnQgYnl0ZXMsIHNxbGl0ZV9pbnQ2NCBvZmZzZXQpIHsKLSAgdmlydHVhbF9maWxlKiB2ZmlsZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dmlydHVhbF9maWxlKj4oZmlsZSk7Ci0gIHZmaWxlLT5maWxlLT5SZWFkKG91dCwgYnl0ZXMsIHN0YXRpY19jYXN0PGludD4ob2Zmc2V0KSk7Ci0gIHJldHVybiBTUUxJVEVfT0s7Ci19Ci0KLWludCBWZnNXcml0ZShzcWxpdGUzX2ZpbGUqIGZpbGUsIGNvbnN0IHZvaWQqIGRhdGEsIGludCBieXRlcywKLSAgICAgICAgICAgICBzcWxpdGUzX2ludDY0IG9mZnNldCkgewotICB2aXJ0dWFsX2ZpbGUqIHZmaWxlID0gcmVpbnRlcnByZXRfY2FzdDx2aXJ0dWFsX2ZpbGUqPihmaWxlKTsKLSAgdmZpbGUtPmZpbGUtPldyaXRlKGRhdGEsIGJ5dGVzLCBzdGF0aWNfY2FzdDxpbnQ+KG9mZnNldCkpOwotICByZXR1cm4gU1FMSVRFX09LOwotfQotCi1pbnQgVmZzU3luYyhzcWxpdGUzX2ZpbGUqIHBGaWxlLCBpbnQgZmxhZ3MpIHsKLSAgVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUihwRmlsZSk7Ci0gIFVOUkVGRVJFTkNFRF9QQVJBTUVURVIoZmxhZ3MpOwotICByZXR1cm4gU1FMSVRFX09LOwotfQotCi1pbnQgVmZzRmlsZUNvbnRyb2woc3FsaXRlM19maWxlKiBwRmlsZSwgaW50IG9wLCB2b2lkKiBwQXJnKSB7Ci0gIFVOUkVGRVJFTkNFRF9QQVJBTUVURVIocEZpbGUpOwotICBVTlJFRkVSRU5DRURfUEFSQU1FVEVSKG9wKTsKLSAgVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUihwQXJnKTsKLSAgcmV0dXJuIFNRTElURV9PSzsKLX0KLQotaW50IFZmc1NlY3RvclNpemUoc3FsaXRlM19maWxlKiBmaWxlKSB7Ci0gIC8vIFRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgcmVhZCB3aXRob3V0IGRpc3R1cmJpbmcgb3RoZXIgYnl0ZXMgaW4gdGhlCi0gIC8vIGZpbGUuCi0gIFVOUkVGRVJFTkNFRF9QQVJBTUVURVIoZmlsZSk7Ci0gIHJldHVybiAxOwotfQotCi1pbnQgVmZzTG9jayhzcWxpdGUzX2ZpbGUqIGZpbGUsIGNvbnN0IGludCBtb2RlKSB7Ci0gIHZpcnR1YWxfZmlsZSogdmZpbGUgPSByZWludGVycHJldF9jYXN0PHZpcnR1YWxfZmlsZSo+KGZpbGUpOwotICBiYXNlOjpBdXRvTG9jayBsb2NrKCp2ZmlsZS0+bG9jayk7Ci0KLSAgLy8gSWYgdGhlcmUgaXMgYWxyZWFkeSBhIGxvY2sgb2YgdGhpcyB0eXBlIG9yIG1vcmUgcmVzdHJpY3RpdmUsIGRvIG5vdGhpbmcKLSAgaWYgKHZmaWxlLT5jdXJyZW50X2xvY2sgPj0gbW9kZSkgewotICAgIHJldHVybiBTUUxJVEVfT0s7Ci0gIH0KLQotICBpZiAobW9kZSA9PSBTUUxJVEVfTE9DS19TSEFSRUQpIHsKLSAgICBEQ0hFQ0tfRVEodmZpbGUtPmN1cnJlbnRfbG9jaywgU1FMSVRFX0xPQ0tfTk9ORSk7Ci0gICAgdmZpbGUtPnNoYXJlZCsrOwotICAgIHZmaWxlLT5jdXJyZW50X2xvY2sgPSBTUUxJVEVfTE9DS19TSEFSRUQ7Ci0gIH0KLQotICBpZiAobW9kZSA9PSBTUUxJVEVfTE9DS19SRVNFUlZFRCkgewotICAgIERDSEVDS19FUSh2ZmlsZS0+Y3VycmVudF9sb2NrLCBTUUxJVEVfTE9DS19TSEFSRUQpOwotICAgIHZmaWxlLT5jdXJyZW50X2xvY2sgPSBTUUxJVEVfTE9DS19SRVNFUlZFRDsKLSAgfQotCi0gIGlmIChtb2RlID09IFNRTElURV9MT0NLX0VYQ0xVU0lWRSkgewotICAgIGlmICh2ZmlsZS0+Y3VycmVudF9sb2NrID49IFNRTElURV9MT0NLX1BFTkRJTkcpIHsKLSAgICAgIHJldHVybiBTUUxJVEVfQlVTWTsKLSAgICB9Ci0gICAgdmZpbGUtPmN1cnJlbnRfbG9jayA9IFNRTElURV9MT0NLX1BFTkRJTkc7Ci0gICAgaWYgKHZmaWxlLT5zaGFyZWQgPiAxKSB7Ci0gICAgICAvLyBUaGVyZSBhcmUgc29tZSBvdXRzdGFuZGluZyBzaGFyZWQgbG9ja3MgKGdyZWF0ZXIgdGhhbiBvbmUgYmVjYXVzZSB0aGUKLSAgICAgIC8vIHBlbmRpbmcgbG9jayBpcyBhbiAidXBncmFkZWQiIHNoYXJlZCBsb2NrKQotICAgICAgcmV0dXJuIFNRTElURV9CVVNZOwotICAgIH0KLSAgICAvLyBBY3F1aXJlIHRoZSBleGNsdXNpdmUgbG9jawotICAgIHZmaWxlLT5jdXJyZW50X2xvY2sgPSBTUUxJVEVfTE9DS19FWENMVVNJVkU7Ci0gIH0KLQotICByZXR1cm4gU1FMSVRFX09LOwotfQotCi1pbnQgVmZzVW5sb2NrKHNxbGl0ZTNfZmlsZSogZmlsZSwgaW50IG1vZGUpIHsKLSAgRENIRUNLX0xFKG1vZGUsIFNRTElURV9MT0NLX1NIQVJFRCk7Ci0gIHZpcnR1YWxfZmlsZSogdmZpbGUgPSByZWludGVycHJldF9jYXN0PHZpcnR1YWxfZmlsZSo+KGZpbGUpOwotICBiYXNlOjpBdXRvTG9jayBsb2NrKCp2ZmlsZS0+bG9jayk7Ci0KLSAgQ09NUElMRV9BU1NFUlQoU1FMSVRFX0xPQ0tfTk9ORSA8IFNRTElURV9MT0NLX1NIQVJFRCwKLSAgICAgICAgICAgICAgICAgc3FsaXRlX2xvY2tfY29uc3RhbnRzX29yZGVyX2hhc19jaGFuZ2VkKTsKLSAgQ09NUElMRV9BU1NFUlQoU1FMSVRFX0xPQ0tfU0hBUkVEIDwgU1FMSVRFX0xPQ0tfUkVTRVJWRUQsCi0gICAgICAgICAgICAgICAgIHNxbGl0ZV9sb2NrX2NvbnN0YW50c19vcmRlcl9oYXNfY2hhbmdlZCk7Ci0gIENPTVBJTEVfQVNTRVJUKFNRTElURV9MT0NLX1JFU0VSVkVEIDwgU1FMSVRFX0xPQ0tfUEVORElORywKLSAgICAgICAgICAgICAgICAgc3FsaXRlX2xvY2tfY29uc3RhbnRzX29yZGVyX2hhc19jaGFuZ2VkKTsKLSAgQ09NUElMRV9BU1NFUlQoU1FMSVRFX0xPQ0tfUEVORElORyA8IFNRTElURV9MT0NLX0VYQ0xVU0lWRSwKLSAgICAgICAgICAgICAgICAgc3FsaXRlX2xvY2tfY29uc3RhbnRzX29yZGVyX2hhc19jaGFuZ2VkKTsKLQotICBpZiAobW9kZSA9PSBTUUxJVEVfTE9DS19OT05FICYmIHZmaWxlLT5jdXJyZW50X2xvY2sgPj0gU1FMSVRFX0xPQ0tfU0hBUkVEKSB7Ci0gICAgdmZpbGUtPnNoYXJlZC0tOwotICB9Ci0KLSAgdmZpbGUtPmN1cnJlbnRfbG9jayA9IG1vZGU7Ci0gIHJldHVybiBTUUxJVEVfT0s7Ci19Ci0KLWludCBWZnNDaGVja1Jlc2VydmVkTG9jayhzcWxpdGUzX2ZpbGUqIGZpbGUsIGludCogcmVzdWx0KSB7Ci0gIHZpcnR1YWxfZmlsZSogdmZpbGUgPSByZWludGVycHJldF9jYXN0PHZpcnR1YWxfZmlsZSo+KGZpbGUpOwotICBiYXNlOjpBdXRvTG9jayBsb2NrKCp2ZmlsZS0+bG9jayk7Ci0KLSAgLy8gVGhlIGZ1bmN0aW9uIGV4cGVjdHMgYSByZXN1bHQgaXMgMSBpZiB0aGUgbG9jayBpcyByZXNlcnZlZCwgcGVuZGluZywgb3IKLSAgLy8gZXhjbHVzaXZlOyAwIG90aGVyd2lzZS4KLSAgKnJlc3VsdCA9IHZmaWxlLT5jdXJyZW50X2xvY2sgPj0gU1FMSVRFX0xPQ0tfUkVTRVJWRUQgPyAxIDogMDsKLSAgcmV0dXJuIFNRTElURV9PSzsKLX0KLQotaW50IFZmc0ZpbGVTaXplKHNxbGl0ZTNfZmlsZSogZmlsZSwgc3FsaXRlM19pbnQ2NCogb3V0X3NpemUpIHsKLSAgdmlydHVhbF9maWxlKiB2ZmlsZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dmlydHVhbF9maWxlKj4oZmlsZSk7Ci0gICpvdXRfc2l6ZSA9IHZmaWxlLT5maWxlLT5TaXplKCk7Ci0gIHJldHVybiBTUUxJVEVfT0s7Ci19Ci0KLWludCBWZnNUcnVuY2F0ZShzcWxpdGUzX2ZpbGUqIGZpbGUsIHNxbGl0ZTNfaW50NjQgc2l6ZSkgewotICB2aXJ0dWFsX2ZpbGUqIHZmaWxlID0gcmVpbnRlcnByZXRfY2FzdDx2aXJ0dWFsX2ZpbGUqPihmaWxlKTsKLSAgdmZpbGUtPmZpbGUtPlRydW5jYXRlKHN0YXRpY19jYXN0PGludD4oc2l6ZSkpOwotICByZXR1cm4gU1FMSVRFX09LOwotfQotCi1pbnQgVmZzRGV2aWNlQ2hhcmFjdGVyaXN0aWNzKHNxbGl0ZTNfZmlsZSogZmlsZSkgewotICBVTlJFRkVSRU5DRURfUEFSQU1FVEVSKGZpbGUpOwotICByZXR1cm4gMDsKLX0KLQotY29uc3Qgc3FsaXRlM19pb19tZXRob2RzIHNfY29iYWx0X3Zmc19pbyA9IHsKLSAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0cnVjdHVyZSB2ZXJzaW9uIG51bWJlcgotICAgIFZmc0Nsb3NlLCAgICAgICAgICAgICAgICAgLy8geENsb3NlCi0gICAgVmZzUmVhZCwgICAgICAgICAgICAgICAgICAvLyB4UmVhZAotICAgIFZmc1dyaXRlLCAgICAgICAgICAgICAgICAgLy8geFdyaXRlCi0gICAgVmZzVHJ1bmNhdGUsICAgICAgICAgICAgICAvLyB4VHJ1bmNhdGUKLSAgICBWZnNTeW5jLCAgICAgICAgICAgICAgICAgIC8vIHhTeW5jCi0gICAgVmZzRmlsZVNpemUsICAgICAgICAgICAgICAvLyB4RmlsZVNpemUKLSAgICBWZnNMb2NrLCAgICAgICAgICAgICAgICAgIC8vIHhMb2NrCi0gICAgVmZzVW5sb2NrLCAgICAgICAgICAgICAgICAvLyB4VW5sb2NrCi0gICAgVmZzQ2hlY2tSZXNlcnZlZExvY2ssICAgICAvLyB4Q2hlY2tSZXNlcnZlZExvY2sKLSAgICBWZnNGaWxlQ29udHJvbCwgICAgICAgICAgIC8vIHhGaWxlQ29udHJvbAotICAgIFZmc1NlY3RvclNpemUsICAgICAgICAgICAgLy8geFNlY3RvclNpemUKLSAgICBWZnNEZXZpY2VDaGFyYWN0ZXJpc3RpY3MgIC8vIHhEZXZpY2VDaGFyYWN0ZXJpc3RpY3MKLX07Ci0KLWludCBWZnNPcGVuKHNxbGl0ZTNfdmZzKiBzcWxfdmZzLCBjb25zdCBjaGFyKiBwYXRoLCBzcWxpdGUzX2ZpbGUqIGZpbGUsCi0gICAgICAgICAgICBpbnQgZmxhZ3MsIGludCogb3V0X2ZsYWdzKSB7Ci0gIFVOUkVGRVJFTkNFRF9QQVJBTUVURVIoZmxhZ3MpOwotICBVTlJFRkVSRU5DRURfUEFSQU1FVEVSKG91dF9mbGFncyk7Ci0gIERDSEVDSyhwYXRoKSA8PCAiTlVMTCBmaWxlbmFtZSBub3Qgc3VwcG9ydGVkLiI7Ci0gIHZpcnR1YWxfZmlsZSogdmZpbGUgPSByZWludGVycHJldF9jYXN0PHZpcnR1YWxfZmlsZSo+KGZpbGUpOwotICB2ZmlsZS0+bG9jayA9IG5ldyBiYXNlOjpMb2NrOwotICBmaWxlLT5wTWV0aG9kcyA9ICZzX2NvYmFsdF92ZnNfaW87Ci0KLSAgVmlydHVhbEZpbGVTeXN0ZW0qIHZmcyA9Ci0gICAgICByZWludGVycHJldF9jYXN0PFZpcnR1YWxGaWxlU3lzdGVtKj4oc3FsX3Zmcy0+cEFwcERhdGEpOwotICB2ZmlsZS0+ZmlsZSA9IHZmcy0+T3BlbihwYXRoKTsKLSAgcmV0dXJuIFNRTElURV9PSzsKLX0KLQotaW50IFZmc0RlbGV0ZShzcWxpdGUzX3Zmcyogc3FsX3ZmcywgY29uc3QgY2hhciogcGF0aCwgaW50IHN5bmNfZGlyKSB7Ci0gIFVOUkVGRVJFTkNFRF9QQVJBTUVURVIoc3luY19kaXIpOwotICBWaXJ0dWFsRmlsZVN5c3RlbSogdmZzID0KLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8VmlydHVhbEZpbGVTeXN0ZW0qPihzcWxfdmZzLT5wQXBwRGF0YSk7Ci0gIHZmcy0+RGVsZXRlKHBhdGgpOwotICByZXR1cm4gU1FMSVRFX09LOwotfQotCi1pbnQgVmZzRnVsbFBhdGhuYW1lKHNxbGl0ZTNfdmZzKiBzcWxfdmZzLCBjb25zdCBjaGFyKiBwYXRoLCBpbnQgb3V0X3NpemUsCi0gICAgICAgICAgICAgICAgICAgIGNoYXIqIG91dF9wYXRoKSB7Ci0gIFVOUkVGRVJFTkNFRF9QQVJBTUVURVIoc3FsX3Zmcyk7Ci0gIHNpemVfdCBwYXRoX3NpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KG91dF9zaXplKTsKLSAgaWYgKGJhc2U6OnN0cmxjcHkob3V0X3BhdGgsIHBhdGgsIHBhdGhfc2l6ZSkgPCBwYXRoX3NpemUpIHsKLSAgICByZXR1cm4gU1FMSVRFX09LOwotICB9Ci0gIHJldHVybiBTUUxJVEVfRVJST1I7Ci19Ci0KLWludCBWZnNBY2Nlc3Moc3FsaXRlM192ZnMqIHNxbF92ZnMsIGNvbnN0IGNoYXIqIG5hbWUsIGludCBmbGFncywgaW50KiByZXN1bHQpIHsKLSAgVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUihuYW1lKTsKLSAgVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUihzcWxfdmZzKTsKLSAgVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUihmbGFncyk7Ci0gIC8vIFdlIHNob3VsZCBhbHdheXMgaGF2ZSBhIHZhbGlkLCByZWFkYWJsZS93cml0YWJsZSBmaWxlLgotICAqcmVzdWx0IHw9IFNRTElURV9BQ0NFU1NfRVhJU1RTIHwgU1FMSVRFX0FDQ0VTU19SRUFEV1JJVEU7Ci0gIHJldHVybiBTUUxJVEVfT0s7Ci19Ci0KLWludCBWZnNSYW5kb21uZXNzKHNxbGl0ZTNfdmZzKiBzcWxfdmZzLCBpbnQgYnl0ZXMsIGNoYXIqIG91dCkgewotICBVTlJFRkVSRU5DRURfUEFSQU1FVEVSKHNxbF92ZnMpOwotICBiYXNlOjpSYW5kQnl0ZXMob3V0LCBzdGF0aWNfY2FzdDxzaXplX3Q+KGJ5dGVzKSk7Ci0gIHJldHVybiBTUUxJVEVfT0s7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1TcWxWZnM6OlNxbFZmcyhjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgVmlydHVhbEZpbGVTeXN0ZW0qIHZmcykKLSAgICA6IHNxbF92ZnNfKG5ldyBzcWxpdGUzX3ZmcygpKSB7Ci0gIG1lbXNldChzcWxfdmZzXy5nZXQoKSwgMCwgc2l6ZW9mKHNxbGl0ZTNfdmZzKSk7Ci0gIHNxbF92ZnNfLT5pVmVyc2lvbiA9IDE7Ci0gIHNxbF92ZnNfLT5zek9zRmlsZSA9IHNpemVvZih2aXJ0dWFsX2ZpbGUpOwotICBzcWxfdmZzXy0+bXhQYXRobmFtZSA9IFZpcnR1YWxGaWxlOjprTWF4VmZzUGF0aG5hbWU7Ci0gIHNxbF92ZnNfLT5wTmV4dCA9IE5VTEw7Ci0gIHNxbF92ZnNfLT56TmFtZSA9IG5hbWUuY19zdHIoKTsKLSAgc3FsX3Zmc18tPnBBcHBEYXRhID0gdmZzOwotICBzcWxfdmZzXy0+eE9wZW4gPSBWZnNPcGVuOwotICBzcWxfdmZzXy0+eERlbGV0ZSA9IFZmc0RlbGV0ZTsKLSAgc3FsX3Zmc18tPnhBY2Nlc3MgPSBWZnNBY2Nlc3M7Ci0gIHNxbF92ZnNfLT54RnVsbFBhdGhuYW1lID0gVmZzRnVsbFBhdGhuYW1lOwotICBzcWxfdmZzXy0+eFJhbmRvbW5lc3MgPSBWZnNSYW5kb21uZXNzOwotCi0gIC8vIEVuc3VyZSB3ZSBhcmUgbm90IHJlZ2lzdGVyaW5nIG11bHRpcGxlIG9mIHRoZXNlIHdpdGggdGhlIHNhbWUgbmFtZS4KLSAgLy8gQmVoYXZpb3IgaXMgdW5kZWZpbmVkIGluIHRoYXQgY2FzZS4KLSAgRENIRUNLKHNxbGl0ZTNfdmZzX2ZpbmQobmFtZS5jX3N0cigpKSA9PSBOVUxMKTsKLQotICBpbnQgcmV0ID0gc3FsaXRlM192ZnNfcmVnaXN0ZXIoc3FsX3Zmc18uZ2V0KCksIDEgLyogbWFrZV9kZWZhdWx0ICovKTsKLSAgRENIRUNLX0VRKHJldCwgU1FMSVRFX09LKTsKLX0KLQotU3FsVmZzOjp+U3FsVmZzKCkgewotICBpbnQgcmV0ID0gc3FsaXRlM192ZnNfdW5yZWdpc3RlcihzcWxfdmZzXy5nZXQoKSk7Ci0gIERDSEVDS19FUShyZXQsIFNRTElURV9PSyk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBzdG9yYWdlCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3N0b3JhZ2Uvc3FsX3Zmcy5oIGIvc3JjL2NvYmFsdC9zdG9yYWdlL3NxbF92ZnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU0MGRjZi4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L3N0b3JhZ2Uvc3FsX3Zmcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBDT0JBTFRfU1RPUkFHRV9TUUxfVkZTX0hfCi0jZGVmaW5lIENPQkFMVF9TVE9SQUdFX1NRTF9WRlNfSF8KLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKLQotc3RydWN0IHNxbGl0ZTNfdmZzOwotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBzdG9yYWdlIHsKLQotY2xhc3MgVmlydHVhbEZpbGVTeXN0ZW07Ci0KLS8vIEltcGxlbWVudCB0aGUgbmVjZXNzYXJ5IEFQSXMgZm9yIGEgU3FsaXRlIHZpcnR1YWwgZmlsZSBzeXN0ZW0uCi0vLyBEaXNwYXRjaCBjYWxscyB0byB0aGUgb3duaW5nIFZpcnR1YWxGaWxlU3lzdGVtLgotY2xhc3MgU3FsVmZzIHsKLSBwdWJsaWM6Ci0gIFNxbFZmcyhjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgVmlydHVhbEZpbGVTeXN0ZW0qIHZmcyk7Ci0gIH5TcWxWZnMoKTsKLQotIHByaXZhdGU6Ci0gIHNjb3BlZF9wdHI8c3FsaXRlM192ZnM+IHNxbF92ZnNfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHN0b3JhZ2UKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKLQotI2VuZGlmICAvLyBDT0JBTFRfU1RPUkFHRV9TUUxfVkZTX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3N0b3JhZ2Uvc3RvcmFnZS5neXAgYi9zcmMvY29iYWx0L3N0b3JhZ2Uvc3RvcmFnZS5neXAKaW5kZXggNWQxZDZlMC4uZmNhYjkxYyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zdG9yYWdlL3N0b3JhZ2UuZ3lwCisrKyBiL3NyYy9jb2JhbHQvc3RvcmFnZS9zdG9yYWdlLmd5cApAQCAtMjcsMjQgKzI3LDE5IEBACiAgICAgICAgICdzYXZlZ2FtZS5oJywKICAgICAgICAgJ3NhdmVnYW1lX3RocmVhZC5jYycsCiAgICAgICAgICdzYXZlZ2FtZV90aHJlYWQuaCcsCi0gICAgICAgICdzcWxfdmZzLmNjJywKLSAgICAgICAgJ3NxbF92ZnMuaCcsCiAgICAgICAgICdzYXZlZ2FtZV9mYWtlLmNjJywKICAgICAgICAgJ3NhdmVnYW1lX3N0YXJib2FyZC5jYycsCiAgICAgICAgICdzdG9yYWdlX21hbmFnZXIuY2MnLAogICAgICAgICAnc3RvcmFnZV9tYW5hZ2VyLmgnLAogICAgICAgICAndXBncmFkZS91cGdyYWRlX3JlYWRlci5jYycsCiAgICAgICAgICd1cGdyYWRlL3VwZ3JhZGVfcmVhZGVyLmgnLAotICAgICAgICAndmlydHVhbF9maWxlLmNjJywKLSAgICAgICAgJ3ZpcnR1YWxfZmlsZS5oJywKLSAgICAgICAgJ3ZpcnR1YWxfZmlsZV9zeXN0ZW0uY2MnLAotICAgICAgICAndmlydHVhbF9maWxlX3N5c3RlbS5oJywKICAgICAgIF0sCiAgICAgICAnZGVwZW5kZW5jaWVzJzogWwogICAgICAgICAnPChERVBUSCkvYmFzZS9iYXNlLmd5cDpiYXNlJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9iYXNlL2Jhc2UuZ3lwOmJhc2UnLAorICAgICAgICAnPChERVBUSCkvY29iYWx0L3N0b3JhZ2Uvc3RvcmUvc3RvcmUuZ3lwOm1lbW9yeV9zdG9yZScsCisgICAgICAgICc8KERFUFRIKS9jb2JhbHQvc3RvcmFnZS9zdG9yZV91cGdyYWRlL3VwZ3JhZGUuZ3lwOnN0b3JhZ2VfdXBncmFkZScsCiAgICAgICAgICc8KERFUFRIKS9uZXQvbmV0Lmd5cDpuZXQnLAotICAgICAgICAnPChERVBUSCkvc3FsL3NxbC5neXA6c3FsJywKICAgICAgIF0sCiAgICAgfSwKICAgICB7CkBAIC01NCw3ICs0OSw2IEBACiAgICAgICAgICdzYXZlZ2FtZV90ZXN0LmNjJywKICAgICAgICAgJ3N0b3JhZ2VfbWFuYWdlcl90ZXN0LmNjJywKICAgICAgICAgJ3VwZ3JhZGUvc3RvcmFnZV91cGdyYWRlX3Rlc3QuY2MnLAotICAgICAgICAndmlydHVhbF9maWxlX3N5c3RlbV90ZXN0LmNjJywKICAgICAgIF0sCiAgICAgICAnZGVwZW5kZW5jaWVzJzogWwogICAgICAgICAnPChERVBUSCkvY29iYWx0L2Jhc2UvYmFzZS5neXA6YmFzZScsCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3N0b3JhZ2Uvc3RvcmFnZV9jb25zdGFudHMuY2MgYi9zcmMvY29iYWx0L3N0b3JhZ2Uvc3RvcmFnZV9jb25zdGFudHMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY2NTUzYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvc3RvcmFnZS9zdG9yYWdlX2NvbnN0YW50cy5jYwpAQCAtMCwwICsxLDI0IEBACisvLyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiY29iYWx0L3N0b3JhZ2Uvc3RvcmFnZV9jb25zdGFudHMuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2Ugc3RvcmFnZSB7CisKK2NvbnN0IGNoYXIga1N0b3JhZ2VIZWFkZXJbXSA9ICJTQVYxIjsKK2NvbnN0IGNoYXIga09sZFN0b3JhZ2VIZWFkZXJbXSA9ICJTQVYwIjsKKworfSAgLy8gbmFtZXNwYWNlIHN0b3JhZ2UKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3RvcmFnZS9zdG9yYWdlX2NvbnN0YW50cy5neXAgYi9zcmMvY29iYWx0L3N0b3JhZ2Uvc3RvcmFnZV9jb25zdGFudHMuZ3lwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYjU4ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L3N0b3JhZ2Uvc3RvcmFnZV9jb25zdGFudHMuZ3lwCkBAIC0wLDAgKzEsMjYgQEAKKyMgQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworeworICAndGFyZ2V0cyc6IFsKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnc3RvcmFnZV9jb25zdGFudHMnLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdzdG9yYWdlX2NvbnN0YW50cy5jYycsCisgICAgICAgICdzdG9yYWdlX2NvbnN0YW50cy5oJywKKyAgICAgIF0sCisgICAgfSwKKyAgXSwKK30KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3RvcmFnZS9zdG9yYWdlX2NvbnN0YW50cy5oIGIvc3JjL2NvYmFsdC9zdG9yYWdlL3N0b3JhZ2VfY29uc3RhbnRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZhNmIwZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvc3RvcmFnZS9zdG9yYWdlX2NvbnN0YW50cy5oCkBAIC0wLDAgKzEsMjkgQEAKKy8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgQ09CQUxUX1NUT1JBR0VfU1RPUkFHRV9DT05TVEFOVFNfSF8KKyNkZWZpbmUgQ09CQUxUX1NUT1JBR0VfU1RPUkFHRV9DT05TVEFOVFNfSF8KKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2Ugc3RvcmFnZSB7CisKK2V4dGVybiBjb25zdCBjaGFyIGtTdG9yYWdlSGVhZGVyW107CitleHRlcm4gY29uc3QgY2hhciBrT2xkU3RvcmFnZUhlYWRlcltdOworY29uc3QgaW50IGtTdG9yYWdlSGVhZGVyU2l6ZSA9IDQ7Citjb25zdCBpbnQga1N0b3JhZ2VIZWFkZXJWZXJzaW9uSW5kZXggPSAzOworCit9ICAvLyBuYW1lc3BhY2Ugc3RvcmFnZQorfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIENPQkFMVF9TVE9SQUdFX1NUT1JBR0VfQ09OU1RBTlRTX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3N0b3JhZ2Uvc3RvcmFnZV9tYW5hZ2VyLmNjIGIvc3JjL2NvYmFsdC9zdG9yYWdlL3N0b3JhZ2VfbWFuYWdlci5jYwppbmRleCA3Yjc1NjQ3Li42MmI5MWRiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3N0b3JhZ2Uvc3RvcmFnZV9tYW5hZ2VyLmNjCisrKyBiL3NyYy9jb2JhbHQvc3RvcmFnZS9zdG9yYWdlX21hbmFnZXIuY2MKQEAgLTIyLDEwICsyMiw2IEBACiAjaW5jbHVkZSAiYmFzZS9zdHJpbmdwcmludGYuaCIKICNpbmNsdWRlICJjb2JhbHQvc3RvcmFnZS9zYXZlZ2FtZV90aHJlYWQuaCIKICNpbmNsdWRlICJjb2JhbHQvc3RvcmFnZS91cGdyYWRlL3VwZ3JhZGVfcmVhZGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3N0b3JhZ2UvdmlydHVhbF9maWxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3N0b3JhZ2UvdmlydHVhbF9maWxlX3N5c3RlbS5oIgotI2luY2x1ZGUgInNxbC9zdGF0ZW1lbnQuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9zcWxpdGUvc3FsaXRlMy5oIgogCiBuYW1lc3BhY2UgY29iYWx0IHsKIG5hbWVzcGFjZSBzdG9yYWdlIHsKQEAgLTM2LDExMSArMzIsMTQgQEAKIC8vIGdldCBzZXZlcmFsIEZsdXNoT25DaGFuZ2UoKSBjYWxscyBpbiBhIHJvdy4KIGNvbnN0IGludCBrRGF0YWJhc2VGbHVzaE9uTGFzdENoYW5nZURlbGF5TXMgPSA1MDA7CiBjb25zdCBpbnQga0RhdGFiYXNlRmx1c2hPbkNoYW5nZU1heERlbGF5TXMgPSAyMDAwOwotCi1jb25zdCBjaGFyIGtEZWZhdWx0U2F2ZUZpbGVbXSA9ICJjb2JhbHRfc2F2ZS5iaW4iOwotCi12b2lkIFNxbERpc2FibGVKb3VybmFsKHNxbDo6Q29ubmVjdGlvbiogY29ubmVjdGlvbikgewotICAvLyBEaXNhYmxlIGpvdXJuYWxpbmcgZm9yIG91ciBpbi1tZW1vcnkgZGF0YWJhc2UuCi0gIHNxbDo6U3RhdGVtZW50IGRpc2FibGVfam91cm5hbCgKLSAgICAgIGNvbm5lY3Rpb24tPkdldFVuaXF1ZVN0YXRlbWVudCgiUFJBR01BIGpvdXJuYWxfbW9kZT1PRkYiKSk7Ci0gIGJvb2wgb2sgPSBkaXNhYmxlX2pvdXJuYWwuU3RlcCgpOwotICBEQ0hFQ0sob2spOwotfQotCi1pbnQgU3FsUXVlcnlVc2VyVmVyc2lvbihzcWw6OkNvbm5lY3Rpb24qIGNvbm5lY3Rpb24pIHsKLSAgc3FsOjpTdGF0ZW1lbnQgZ2V0X2RiX3ZlcnNpb24oCi0gICAgICBjb25uZWN0aW9uLT5HZXRVbmlxdWVTdGF0ZW1lbnQoIlBSQUdNQSB1c2VyX3ZlcnNpb24iKSk7Ci0gIGJvb2wgb2sgPSBnZXRfZGJfdmVyc2lvbi5TdGVwKCk7Ci0gIERDSEVDSyhvayk7Ci0gIHJldHVybiBnZXRfZGJfdmVyc2lvbi5Db2x1bW5JbnQoMCk7Ci19Ci0KLWJvb2wgU3FsUXVlcnlUYWJsZUV4aXN0cyhzcWw6OkNvbm5lY3Rpb24qIGNvbm5lY3Rpb24sIGNvbnN0IGNoYXIqIHRhYmxlX25hbWUpIHsKLSAgc3FsOjpTdGF0ZW1lbnQgZ2V0X2V4aXN0cyhjb25uZWN0aW9uLT5HZXRVbmlxdWVTdGF0ZW1lbnQoCi0gICAgICAiU0VMRUNUIG5hbWUgRlJPTSBzcWxpdGVfbWFzdGVyIFdIRVJFIG5hbWUgPSA/IEFORCB0eXBlID0gJ3RhYmxlJyIpKTsKLSAgZ2V0X2V4aXN0cy5CaW5kU3RyaW5nKDAsIHRhYmxlX25hbWUpOwotICByZXR1cm4gZ2V0X2V4aXN0cy5TdGVwKCk7Ci19Ci0KLWludCBTcWxRdWVyeVNjaGVtYVZlcnNpb24oc3FsOjpDb25uZWN0aW9uKiBjb25uZWN0aW9uLCBjb25zdCBjaGFyKiB0YWJsZV9uYW1lKSB7Ci0gIHNxbDo6U3RhdGVtZW50IGdldF92ZXJzaW9uKGNvbm5lY3Rpb24tPkdldFVuaXF1ZVN0YXRlbWVudCgKLSAgICAgICJTRUxFQ1QgdmVyc2lvbiBGUk9NIFNjaGVtYVRhYmxlIFdIRVJFIG5hbWUgPSA/IikpOwotICBnZXRfdmVyc2lvbi5CaW5kU3RyaW5nKDAsIHRhYmxlX25hbWUpOwotICBib29sIHJvd19mb3VuZCA9IGdldF92ZXJzaW9uLlN0ZXAoKTsKLSAgaWYgKHJvd19mb3VuZCkgewotICAgIHJldHVybiBnZXRfdmVyc2lvbi5Db2x1bW5JbnQoMCk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci19Ci0KLXZvaWQgU3FsVXBkYXRlU2NoZW1hVmVyc2lvbihzcWw6OkNvbm5lY3Rpb24qIGNvbm5lY3Rpb24sIGNvbnN0IGNoYXIqIHRhYmxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZlcnNpb24pIHsKLSAgc3FsOjpTdGF0ZW1lbnQgdXBkYXRlX3ZlcnNpb24oY29ubmVjdGlvbi0+R2V0VW5pcXVlU3RhdGVtZW50KAotICAgICAgIklOU0VSVCBJTlRPIFNjaGVtYVRhYmxlIChuYW1lLCB2ZXJzaW9uKSIKLSAgICAgICJWQUxVRVMgKD8sID8pIikpOwotICB1cGRhdGVfdmVyc2lvbi5CaW5kU3RyaW5nKDAsIHRhYmxlX25hbWUpOwotICB1cGRhdGVfdmVyc2lvbi5CaW5kSW50KDEsIHZlcnNpb24pOwotICBib29sIG9rID0gdXBkYXRlX3ZlcnNpb24uUnVuKCk7Ci0gIERDSEVDSyhvayk7Ci19Ci0KLXZvaWQgU3FsQ3JlYXRlU2NoZW1hVGFibGUoc3FsOjpDb25uZWN0aW9uKiBjb25uZWN0aW9uKSB7Ci0gIC8vIENyZWF0ZSB0aGUgc2NoZW1hIHRhYmxlLgotICBzcWw6OlN0YXRlbWVudCBjcmVhdGVfdGFibGUoY29ubmVjdGlvbi0+R2V0VW5pcXVlU3RhdGVtZW50KAotICAgICAgIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIFNjaGVtYVRhYmxlICgiCi0gICAgICAibmFtZSBURVhULCAiCi0gICAgICAidmVyc2lvbiBJTlRFR0VSLCAiCi0gICAgICAiVU5JUVVFKG5hbWUsIHZlcnNpb24pIE9OIENPTkZMSUNUIFJFUExBQ0UpIikpOwotICBib29sIG9rID0gY3JlYXRlX3RhYmxlLlJ1bigpOwotICBEQ0hFQ0sob2spOwotfQotCi12b2lkIFNxbFVwZGF0ZURhdGFiYXNlVXNlclZlcnNpb24oc3FsOjpDb25uZWN0aW9uKiBjb25uZWN0aW9uKSB7Ci0gIC8vIFVwZGF0ZSB0aGUgREIgdmVyc2lvbiB3aGljaCB3aWxsIGJlIHJlYWQgaW4gbmV4dCB0aW1lLgotICAvLyBOT1RFOiBQcmFnbWEgc3RhdGVtZW50cyBjYW5ub3QgYmUgYm91bmQsIHNvIHdlIG11c3QgY29uc3RydWN0IHRoZSBzdHJpbmcKLSAgLy8gaW4gZnVsbC4KLSAgc3RkOjpzdHJpbmcgc2V0X2RiX3ZlcnNpb25fc3RyID0gYmFzZTo6U3RyaW5nUHJpbnRmKAotICAgICAgIlBSQUdNQSB1c2VyX3ZlcnNpb24gPSAlZCIsIFN0b3JhZ2VNYW5hZ2VyOjprRGF0YWJhc2VVc2VyVmVyc2lvbik7Ci0gIHNxbDo6U3RhdGVtZW50IHNldF9kYl92ZXJzaW9uKAotICAgICAgY29ubmVjdGlvbi0+R2V0VW5pcXVlU3RhdGVtZW50KHNldF9kYl92ZXJzaW9uX3N0ci5jX3N0cigpKSk7Ci0gIGJvb2wgb2sgPSBzZXRfZGJfdmVyc2lvbi5SdW4oKTsKLSAgRENIRUNLKG9rKTsKLX0KLQotY29uc3Qgc3RkOjpzdHJpbmcmIEdldEZpcnN0VmFsaWREYXRhYmFzZUZpbGUoCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBmaWxlbmFtZXMpIHsKLSAgLy8gQ2FsbGVyIG11c3QgZW5zdXJlIGF0IGxlYXN0IG9uZSBmaWxlIGV4aXN0cy4KLSAgRENIRUNLX0dUKGZpbGVuYW1lcy5zaXplKCksIHNpemVfdCgwKSk7Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmaWxlbmFtZXMuc2l6ZSgpOyArK2kpIHsKLSAgICBzcWw6OkNvbm5lY3Rpb24gY29ubmVjdGlvbjsKLSAgICBib29sIGlzX29wZW5lZCA9IGNvbm5lY3Rpb24uT3BlbihGaWxlUGF0aChmaWxlbmFtZXNbaV0pKTsKLSAgICBpZiAoIWlzX29wZW5lZCkgewotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGludCBlcnIgPSBjb25uZWN0aW9uLkV4ZWN1dGVBbmRSZXR1cm5FcnJvckNvZGUoInByYWdtYSBzY2hlbWFfdmVyc2lvbjsiKTsKLSAgICBpZiAoZXJyICE9IFNRTElURV9PSykgewotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIC8vIEZpbGUgY2FuIGJlIG9wZW5lZCBhcyBhIGRhdGFiYXNlLgotICAgIHJldHVybiBmaWxlbmFtZXNbaV07Ci0gIH0KLQotICAvLyBDYWxsZXIgbXVzdCBoYW5kbGUgY2FzZSB3aGVyZSBhIHZhbGlkIGRhdGFiYXNlIGZpbGUgY2Fubm90IGJlIGZvdW5kLgotICBETE9HKFdBUk5JTkcpIDw8ICJDYW5ub3QgZmluZCB2YWxpZCBkYXRhYmFzZSBmaWxlIGluIHNhdmUgZGF0YSI7Ci0gIHJldHVybiBmaWxlbmFtZXNbMF07Ci19Ci0KIH0gIC8vIG5hbWVzcGFjZQogCiBTdG9yYWdlTWFuYWdlcjo6U3RvcmFnZU1hbmFnZXIoc2NvcGVkX3B0cjxVcGdyYWRlSGFuZGxlcj4gdXBncmFkZV9oYW5kbGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpCiAgICAgOiB1cGdyYWRlX2hhbmRsZXJfKHVwZ3JhZGVfaGFuZGxlci5QYXNzKCkpLAogICAgICAgb3B0aW9uc18ob3B0aW9ucyksCi0gICAgICBzcWxfdGhyZWFkXyhuZXcgYmFzZTo6VGhyZWFkKCJTdG9yYWdlTWFuYWdlciBTUUwiKSksCi0gICAgICBBTExPV19USElTX0lOX0lOSVRJQUxJWkVSX0xJU1Qoc3FsX2NvbnRleHRfKG5ldyBTcWxDb250ZXh0KHRoaXMpKSksCi0gICAgICBjb25uZWN0aW9uXyhuZXcgc3FsOjpDb25uZWN0aW9uKCkpLAorICAgICAgc3RvcmFnZV90aHJlYWRfKG5ldyBiYXNlOjpUaHJlYWQoIlN0b3JhZ2VNYW5hZ2VyIikpLAorICAgICAgbWVtb3J5X3N0b3JlXyhuZXcgTWVtb3J5U3RvcmUoKSksCiAgICAgICBsb2FkZWRfZGF0YWJhc2VfdmVyc2lvbl8oMCksCiAgICAgICBpbml0aWFsaXplZF8oZmFsc2UpLAogICAgICAgZmx1c2hfcHJvY2Vzc2luZ18oZmFsc2UpLApAQCAtMTQ5LDEwICs0OCwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGluaXRpYWxseSBzaWduYWxsZWQgKi8pIHsKICAgRENIRUNLKHVwZ3JhZGVfaGFuZGxlcl8pOwogICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6c3RvcmFnZSIsIF9fRlVOQ1RJT05fXyk7CisKICAgc2F2ZWdhbWVfdGhyZWFkXy5yZXNldChuZXcgU2F2ZWdhbWVUaHJlYWQob3B0aW9uc18uc2F2ZWdhbWVfb3B0aW9ucykpOworCiAgIC8vIFN0YXJ0IHRoZSBzYXZlZ2FtZSBsb2FkIGltbWVkaWF0ZWx5LgotICBzcWxfdGhyZWFkXy0+U3RhcnQoKTsKLSAgc3FsX21lc3NhZ2VfbG9vcF8gPSBzcWxfdGhyZWFkXy0+bWVzc2FnZV9sb29wX3Byb3h5KCk7CisgIHN0b3JhZ2VfdGhyZWFkXy0+U3RhcnQoKTsKKyAgc3RvcmFnZV9tZXNzYWdlX2xvb3BfID0gc3RvcmFnZV90aHJlYWRfLT5tZXNzYWdlX2xvb3BfcHJveHkoKTsKIAogICBmbHVzaF9vbl9sYXN0X2NoYW5nZV90aW1lcl8ucmVzZXQobmV3IGJhc2U6Ok9uZVNob3RUaW1lcjxTdG9yYWdlTWFuYWdlcj4oKSk7CiAgIGZsdXNoX29uX2NoYW5nZV9tYXhfZGVsYXlfdGltZXJfLnJlc2V0KApAQCAtMTYxLDM3ICs2Miw1MiBAQAogCiBTdG9yYWdlTWFuYWdlcjo6flN0b3JhZ2VNYW5hZ2VyKCkgewogICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6c3RvcmFnZSIsIF9fRlVOQ1RJT05fXyk7Ci0gIERDSEVDSyghc3FsX21lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CisgIERDSEVDSyghc3RvcmFnZV9tZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwogCiAgIC8vIFdhaXQgZm9yIGFsbCBJL08gb3BlcmF0aW9ucyB0byBjb21wbGV0ZS4KICAgRmluaXNoSU8oKTsKIAogICAvLyBEZXN0cm95IHZhcmlvdXMgb2JqZWN0cyBvbiB0aGUgcHJvcGVyIHRocmVhZC4KLSAgc3FsX21lc3NhZ2VfbG9vcF8tPlBvc3RUYXNrKEZST01fSEVSRSwgYmFzZTo6QmluZCgmU3RvcmFnZU1hbmFnZXI6Ok9uRGVzdHJveSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSk7CisgIHN0b3JhZ2VfbWVzc2FnZV9sb29wXy0+UG9zdFRhc2soCisgICAgICBGUk9NX0hFUkUsCisgICAgICBiYXNlOjpCaW5kKCZTdG9yYWdlTWFuYWdlcjo6T25EZXN0cm95LCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSk7CiAKICAgLy8gRm9yY2UgYWxsIHRhc2tzIHRvIGZpbmlzaC4gVGhlbiB3ZSBjYW4gc2FmZWx5IGxldCB0aGUgcmVzdCBvZiBvdXIKICAgLy8gbWVtYmVyIHZhcmlhYmxlcyBiZSBkZXN0cm95ZWQuCi0gIHNxbF90aHJlYWRfLnJlc2V0KCk7CisgIHN0b3JhZ2VfdGhyZWFkXy5yZXNldCgpOwogfQogCi12b2lkIFN0b3JhZ2VNYW5hZ2VyOjpHZXRTcWxDb250ZXh0KGNvbnN0IFNxbENhbGxiYWNrJiBjYWxsYmFjaykgewordm9pZCBTdG9yYWdlTWFuYWdlcjo6V2l0aFJlYWRPbmx5TWVtb3J5U3RvcmUoCisgICAgY29uc3QgUmVhZE9ubHlNZW1vcnlTdG9yZUNhbGxiYWNrJiBjYWxsYmFjaykgewogICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6c3RvcmFnZSIsIF9fRlVOQ1RJT05fXyk7Ci0gIGlmIChNZXNzYWdlTG9vcDo6Y3VycmVudCgpLT5tZXNzYWdlX2xvb3BfcHJveHkoKSAhPSBzcWxfbWVzc2FnZV9sb29wXykgewotICAgIHNxbF9tZXNzYWdlX2xvb3BfLT5Qb3N0VGFzayhGUk9NX0hFUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmQoJlN0b3JhZ2VNYW5hZ2VyOjpHZXRTcWxDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcyksIGNhbGxiYWNrKSk7CisgIGlmIChNZXNzYWdlTG9vcDo6Y3VycmVudCgpLT5tZXNzYWdlX2xvb3BfcHJveHkoKSAhPSBzdG9yYWdlX21lc3NhZ2VfbG9vcF8pIHsKKyAgICBzdG9yYWdlX21lc3NhZ2VfbG9vcF8tPlBvc3RUYXNrKAorICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJlN0b3JhZ2VNYW5hZ2VyOjpXaXRoUmVhZE9ubHlNZW1vcnlTdG9yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcyksIGNhbGxiYWNrKSk7CiAgICAgcmV0dXJuOwogICB9CiAKLSAgY2FsbGJhY2suUnVuKHNxbF9jb250ZXh0Xy5nZXQoKSk7CisgIGNhbGxiYWNrLlJ1bigqbWVtb3J5X3N0b3JlXy5nZXQoKSk7Cit9CisKK3ZvaWQgU3RvcmFnZU1hbmFnZXI6OldpdGhNZW1vcnlTdG9yZShjb25zdCBNZW1vcnlTdG9yZUNhbGxiYWNrJiBjYWxsYmFjaykgeworICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6c3RvcmFnZSIsIF9fRlVOQ1RJT05fXyk7CisgIGlmIChNZXNzYWdlTG9vcDo6Y3VycmVudCgpLT5tZXNzYWdlX2xvb3BfcHJveHkoKSAhPSBzdG9yYWdlX21lc3NhZ2VfbG9vcF8pIHsKKyAgICBzdG9yYWdlX21lc3NhZ2VfbG9vcF8tPlBvc3RUYXNrKAorICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJlN0b3JhZ2VNYW5hZ2VyOjpXaXRoTWVtb3J5U3RvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpLCBjYWxsYmFjaykpOworICAgIHJldHVybjsKKyAgfQorCisgIGNhbGxiYWNrLlJ1bihtZW1vcnlfc3RvcmVfLmdldCgpKTsKKyAgRmx1c2hPbkNoYW5nZSgpOwogfQogCiB2b2lkIFN0b3JhZ2VNYW5hZ2VyOjpGbHVzaE9uQ2hhbmdlKCkgewogICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6c3RvcmFnZSIsIF9fRlVOQ1RJT05fXyk7CiAgIC8vIE1ha2Ugc3VyZSB0aGlzIHJ1bnMgb24gdGhlIGNvcnJlY3QgdGhyZWFkLgotICBpZiAoTWVzc2FnZUxvb3A6OmN1cnJlbnQoKS0+bWVzc2FnZV9sb29wX3Byb3h5KCkgIT0gc3FsX21lc3NhZ2VfbG9vcF8pIHsKLSAgICBzcWxfbWVzc2FnZV9sb29wXy0+UG9zdFRhc2soCisgIGlmIChNZXNzYWdlTG9vcDo6Y3VycmVudCgpLT5tZXNzYWdlX2xvb3BfcHJveHkoKSAhPSBzdG9yYWdlX21lc3NhZ2VfbG9vcF8pIHsKKyAgICBzdG9yYWdlX21lc3NhZ2VfbG9vcF8tPlBvc3RUYXNrKAogICAgICAgICBGUk9NX0hFUkUsCiAgICAgICAgIGJhc2U6OkJpbmQoJlN0b3JhZ2VNYW5hZ2VyOjpGbHVzaE9uQ2hhbmdlLCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSk7CiAgICAgcmV0dXJuOwpAQCAtMjE3LDggKzEzMyw4IEBACiB2b2lkIFN0b3JhZ2VNYW5hZ2VyOjpGbHVzaE5vdyhjb25zdCBiYXNlOjpDbG9zdXJlJiBjYWxsYmFjaykgewogICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6c3RvcmFnZSIsIF9fRlVOQ1RJT05fXyk7CiAgIC8vIE1ha2Ugc3VyZSB0aGlzIHJ1bnMgb24gdGhlIGNvcnJlY3QgdGhyZWFkLgotICBpZiAoTWVzc2FnZUxvb3A6OmN1cnJlbnQoKS0+bWVzc2FnZV9sb29wX3Byb3h5KCkgIT0gc3FsX21lc3NhZ2VfbG9vcF8pIHsKLSAgICBzcWxfbWVzc2FnZV9sb29wXy0+UG9zdFRhc2soCisgIGlmIChNZXNzYWdlTG9vcDo6Y3VycmVudCgpLT5tZXNzYWdlX2xvb3BfcHJveHkoKSAhPSBzdG9yYWdlX21lc3NhZ2VfbG9vcF8pIHsKKyAgICBzdG9yYWdlX21lc3NhZ2VfbG9vcF8tPlBvc3RUYXNrKAogICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJlN0b3JhZ2VNYW5hZ2VyOjpGbHVzaE5vdywgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKSk7CiAgICAgcmV0dXJuOwpAQCAtMjI4LDU0ICsxNDQsMTUgQEAKICAgUXVldWVGbHVzaChjYWxsYmFjayk7CiB9CiAKLWJvb2wgU3RvcmFnZU1hbmFnZXI6OkdldFNjaGVtYVZlcnNpb24oY29uc3QgY2hhciogdGFibGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBzY2hlbWFfdmVyc2lvbikgewotICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6c3RvcmFnZSIsIF9fRlVOQ1RJT05fXyk7Ci0gIERDSEVDSyhzcWxfbWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKLSAgRENIRUNLKHNjaGVtYV92ZXJzaW9uKTsKLQotICBpZiAoIVNxbFF1ZXJ5VGFibGVFeGlzdHMoc3FsX2Nvbm5lY3Rpb24oKSwgdGFibGVfbmFtZSkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbnQgZm91bmRfdmVyc2lvbiA9IFNxbFF1ZXJ5U2NoZW1hVmVyc2lvbihzcWxfY29ubmVjdGlvbigpLCB0YWJsZV9uYW1lKTsKLSAgaWYgKGZvdW5kX3ZlcnNpb24gIT0gLTEpIHsKLSAgICAqc2NoZW1hX3ZlcnNpb24gPSBmb3VuZF92ZXJzaW9uOwotICB9IGVsc2UgaWYgKGxvYWRlZF9kYXRhYmFzZV92ZXJzaW9uXyAhPSBTdG9yYWdlTWFuYWdlcjo6a0RhdGFiYXNlVXNlclZlcnNpb24pIHsKLSAgICAvLyBUaGUgc2NoZW1hIHRhYmxlIGRpZCBub3QgZXhpc3QgYmVmb3JlIHRoaXMgc2Vzc2lvbiwgd2hpY2ggaXMgZGlmZmVyZW50Ci0gICAgLy8gZnJvbSB0aGUgc2NoZW1hIHRhYmxlIGJlaW5nIGxvc3QuCi0gICAgKnNjaGVtYV92ZXJzaW9uID0gU3RvcmFnZU1hbmFnZXI6OmtTY2hlbWFUYWJsZUlzTmV3OwotICB9IGVsc2UgewotICAgICpzY2hlbWFfdmVyc2lvbiA9IFN0b3JhZ2VNYW5hZ2VyOjprU2NoZW1hVmVyc2lvbkxvc3Q7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgU3RvcmFnZU1hbmFnZXI6OlVwZGF0ZVNjaGVtYVZlcnNpb24oY29uc3QgY2hhciogdGFibGVfbmFtZSwgaW50IHZlcnNpb24pIHsKLSAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OnN0b3JhZ2UiLCBfX0ZVTkNUSU9OX18pOwotICBEQ0hFQ0soc3FsX21lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7Ci0gIERDSEVDS19HVCh2ZXJzaW9uLCAwKSA8PCAiU2NoZW1hIHZlcnNpb24gbnVtYmVycyBtdXN0IGJlIHBvc2l0aXZlLiI7Ci0KLSAgU3FsVXBkYXRlU2NoZW1hVmVyc2lvbihzcWxfY29ubmVjdGlvbigpLCB0YWJsZV9uYW1lLCB2ZXJzaW9uKTsKLX0KLQotc3FsOjpDb25uZWN0aW9uKiBTdG9yYWdlTWFuYWdlcjo6c3FsX2Nvbm5lY3Rpb24oKSB7Ci0gIFRSQUNFX0VWRU5UMCgiY29iYWx0OjpzdG9yYWdlIiwgX19GVU5DVElPTl9fKTsKLSAgRmluaXNoSW5pdCgpOwotICByZXR1cm4gY29ubmVjdGlvbl8uZ2V0KCk7Ci19Ci0KIHZvaWQgU3RvcmFnZU1hbmFnZXI6OkZpbmlzaEluaXQoKSB7CiAgIFRSQUNFX0VWRU5UMCgiY29iYWx0OjpzdG9yYWdlIiwgX19GVU5DVElPTl9fKTsKLSAgRENIRUNLKHNxbF9tZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOworICBEQ0hFQ0soc3RvcmFnZV9tZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwogICBpZiAoaW5pdGlhbGl6ZWRfKSB7CiAgICAgcmV0dXJuOwogICB9CiAKICAgaW5pdGlhbGl6ZWRfID0gdHJ1ZTsKIAotICB2ZnNfLnJlc2V0KG5ldyBWaXJ0dWFsRmlsZVN5c3RlbSgpKTsKLSAgc3FsX3Zmc18ucmVzZXQobmV3IFNxbFZmcygiY29iYWx0X3ZmcyIsIHZmc18uZ2V0KCkpKTsKICAgLy8gU2F2ZWdhbWUgaGFzIGZpbmlzaGVkIGxvYWRpbmcuIE5vdyBpbml0aWFsaXplIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uLgogICAvLyBDaGVjayBpZiB0aGlzIGlzIHVwZ3JhZGUgZGF0YSwgaWYgc28sIGhhbmRsZSBpdCwgb3RoZXJ3aXNlOgogICAvLyBDaGVjayBpZiB0aGUgc2F2ZWdhbWUgZGF0YSBjb250YWlucyBhIFZGUyBoZWFkZXIuCkBAIC0yODUsNyArMTYyLDYgQEAKICAgICAgIHNhdmVnYW1lX3RocmVhZF8tPkdldExvYWRlZFJhd0J5dGVzKCk7CiAgIERDSEVDSyhsb2FkZWRfcmF3X2J5dGVzKTsKICAgU2F2ZWdhbWU6OkJ5dGVWZWN0b3ImIHJhd19ieXRlcyA9ICpsb2FkZWRfcmF3X2J5dGVzOwotICBWaXJ0dWFsRmlsZVN5c3RlbTo6U2VyaWFsaXplZEhlYWRlciBoZWFkZXIgPSB7fTsKICAgYm9vbCBoYXNfdXBncmFkZV9kYXRhID0gZmFsc2U7CiAKICAgaWYgKHJhd19ieXRlcy5zaXplKCkgPiAwKSB7CkBAIC0yOTUsNTAgKzE3MSwxMyBAQAogICAgIGlmICh1cGdyYWRlOjpVcGdyYWRlUmVhZGVyOjpJc1VwZ3JhZGVEYXRhKGJ1ZmZlciwgYnVmZmVyX3NpemUpKSB7CiAgICAgICBoYXNfdXBncmFkZV9kYXRhID0gdHJ1ZTsKICAgICB9IGVsc2UgewotICAgICAgaWYgKHJhd19ieXRlcy5zaXplKCkgPj0gc2l6ZW9mKFZpcnR1YWxGaWxlU3lzdGVtOjpTZXJpYWxpemVkSGVhZGVyKSkgewotICAgICAgICBtZW1jcHkoJmhlYWRlciwgJnJhd19ieXRlc1swXSwKLSAgICAgICAgICAgICAgIHNpemVvZihWaXJ0dWFsRmlsZVN5c3RlbTo6U2VyaWFsaXplZEhlYWRlcikpOwotICAgICAgfQotCi0gICAgICBpZiAoIXZmc18tPkRlc2VyaWFsaXplKCZyYXdfYnl0ZXNbMF0sIGJ1ZmZlcl9zaXplKSkgewotICAgICAgICBWaXJ0dWFsRmlsZSogdmYgPSB2ZnNfLT5PcGVuKGtEZWZhdWx0U2F2ZUZpbGUpOwotICAgICAgICB2Zi0+V3JpdGUoJnJhd19ieXRlc1swXSwgYnVmZmVyX3NpemUsIDAgLyogb2Zmc2V0ICovKTsKLSAgICAgIH0KKyAgICAgIGJvb2wgcmVzdWx0ID0gbWVtb3J5X3N0b3JlXy0+SW5pdGlhbGl6ZShyYXdfYnl0ZXMpOworICAgICAgTE9HKElORk8pIDw8ICJEZXNlcmlhbGl6ZSByZXN1bHQ9IiA8PCByZXN1bHQ7CiAgICAgfQogICB9CiAKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGZpbGVuYW1lcyA9IHZmc18tPkxpc3RGaWxlcygpOwotICBpZiAoZmlsZW5hbWVzLnNpemUoKSA9PSAwKSB7Ci0gICAgZmlsZW5hbWVzLnB1c2hfYmFjayhrRGVmYXVsdFNhdmVGaWxlKTsKLSAgfQotCiAgIC8vIExlZ2FjeSBTdGVlbCBzYXZlIGRhdGEgbWF5IGNvbnRhaW4gbXVsdGlwbGUgZmlsZXMgKGUuZy4gZGItam91cm5hbCBhcyB3ZWxsCiAgIC8vIGFzIGRiKSwgc28gdXNlIHRoZSBmaXJzdCBvbmUgdGhhdCBsb29rcyBsaWtlIGEgdmFsaWQgZGF0YWJhc2UgZmlsZS4KLSAgY29uc3Qgc3RkOjpzdHJpbmcmIHNhdmVfbmFtZSA9IEdldEZpcnN0VmFsaWREYXRhYmFzZUZpbGUoZmlsZW5hbWVzKTsKLSAgYm9vbCBvayA9IGNvbm5lY3Rpb25fLT5PcGVuKEZpbGVQYXRoKHNhdmVfbmFtZSkpOwotICBEQ0hFQ0sob2spOwotCi0gIC8vIE9wZW4oKSBpcyBsYXp5LiBSdW4gYSBxdWljayBjaGVjayB0byBzZWUgaWYgdGhlIGRhdGFiYXNlIGlzIHZhbGlkLgotICBpbnQgZXJyID0gY29ubmVjdGlvbl8tPkV4ZWN1dGVBbmRSZXR1cm5FcnJvckNvZGUoInByYWdtYSBzY2hlbWFfdmVyc2lvbjsiKTsKLSAgaWYgKGVyciAhPSBTUUxJVEVfT0spIHsKLSAgICAvLyBEYXRhYmFzZSBzZWVtcyB0byBiZSBpbnZhbGlkLgotICAgIERMT0coV0FSTklORykgPDwgIkRhdGFiYXNlICIgPDwgc2F2ZV9uYW1lIDw8ICIgYXBwZWFycyB0byBiZSBjb3JydXB0LiI7Ci0gICAgLy8gVHJ5IHRvIHN0YXJ0IGFnYWluLiBEZWxldGUgdGhlIGZpbGUgaW4gdGhlIFZGUyBhbmQgbWFrZSBhCi0gICAgLy8gbmV3IGNvbm5lY3Rpb24uCi0gICAgdmZzXy0+RGVsZXRlKHNhdmVfbmFtZSk7Ci0gICAgdmZzXy0+T3BlbihzYXZlX25hbWUpOwotICAgIGNvbm5lY3Rpb25fLnJlc2V0KG5ldyBzcWw6OkNvbm5lY3Rpb24oKSk7Ci0gICAgb2sgPSBjb25uZWN0aW9uXy0+T3BlbihGaWxlUGF0aChzYXZlX25hbWUpKTsKLSAgICBEQ0hFQ0sob2spOwotICAgIGVyciA9IGNvbm5lY3Rpb25fLT5FeGVjdXRlQW5kUmV0dXJuRXJyb3JDb2RlKCJwcmFnbWEgc2NoZW1hX3ZlcnNpb247Iik7Ci0gICAgRENIRUNLX0VRKFNRTElURV9PSywgZXJyKTsKLSAgfQotCi0gIC8vIENvbmZpZ3VyZSBvdXIgU1FMaXRlIGRhdGFiYXNlIG5vdyB0aGF0IGl0J3Mgb3Blbi4KLSAgU3FsRGlzYWJsZUpvdXJuYWwoY29ubmVjdGlvbl8uZ2V0KCkpOwotICBsb2FkZWRfZGF0YWJhc2VfdmVyc2lvbl8gPSBTcWxRdWVyeVVzZXJWZXJzaW9uKGNvbm5lY3Rpb25fLmdldCgpKTsKLSAgU3FsQ3JlYXRlU2NoZW1hVGFibGUoY29ubmVjdGlvbl8uZ2V0KCkpOwotICBTcWxVcGRhdGVEYXRhYmFzZVVzZXJWZXJzaW9uKGNvbm5lY3Rpb25fLmdldCgpKTsKIAogICBpZiAoaGFzX3VwZ3JhZGVfZGF0YSkgewogICAgIGNvbnN0IGNoYXIqIGJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZyYXdfYnl0ZXNbMF0pOwpAQCAtMzU4LDE4ICsxOTcsMTggQEAKIAogdm9pZCBTdG9yYWdlTWFuYWdlcjo6T25GbHVzaE9uQ2hhbmdlVGltZXJGaXJlZCgpIHsKICAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OnN0b3JhZ2UiLCBfX0ZVTkNUSU9OX18pOwotICBEQ0hFQ0soc3FsX21lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CisgIERDSEVDSyhzdG9yYWdlX21lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CiAKICAgU3RvcEZsdXNoT25DaGFuZ2VUaW1lcnMoKTsKICAgUXVldWVGbHVzaChiYXNlOjpDbG9zdXJlKCkpOwogfQogCi12b2lkIFN0b3JhZ2VNYW5hZ2VyOjpPbkZsdXNoSU9Db21wbGV0ZWRTUUxDYWxsYmFjaygpIHsKK3ZvaWQgU3RvcmFnZU1hbmFnZXI6Ok9uRmx1c2hJT0NvbXBsZXRlZENhbGxiYWNrKCkgewogICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6c3RvcmFnZSIsIF9fRlVOQ1RJT05fXyk7CiAgIC8vIE1ha2Ugc3VyZSB0aGlzIHJ1bnMgb24gdGhlIFNRTCBtZXNzYWdlIGxvb3AuCi0gIGlmIChNZXNzYWdlTG9vcDo6Y3VycmVudCgpLT5tZXNzYWdlX2xvb3BfcHJveHkoKSAhPSBzcWxfbWVzc2FnZV9sb29wXykgewotICAgIHNxbF9tZXNzYWdlX2xvb3BfLT5Qb3N0VGFzaygKLSAgICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZTdG9yYWdlTWFuYWdlcjo6T25GbHVzaElPQ29tcGxldGVkU1FMQ2FsbGJhY2ssCisgIGlmIChNZXNzYWdlTG9vcDo6Y3VycmVudCgpLT5tZXNzYWdlX2xvb3BfcHJveHkoKSAhPSBzdG9yYWdlX21lc3NhZ2VfbG9vcF8pIHsKKyAgICBzdG9yYWdlX21lc3NhZ2VfbG9vcF8tPlBvc3RUYXNrKAorICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJlN0b3JhZ2VNYW5hZ2VyOjpPbkZsdXNoSU9Db21wbGV0ZWRDYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpKTsKICAgICByZXR1cm47CiAgIH0KQEAgLTM5Nyw3ICsyMzYsNyBAQAogCiB2b2lkIFN0b3JhZ2VNYW5hZ2VyOjpRdWV1ZUZsdXNoKGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNhbGxiYWNrKSB7CiAgIFRSQUNFX0VWRU5UMCgiY29iYWx0OjpzdG9yYWdlIiwgX19GVU5DVElPTl9fKTsKLSAgRENIRUNLKHNxbF9tZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOworICBEQ0hFQ0soc3RvcmFnZV9tZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwogCiAgIGlmICghZmx1c2hfcHJvY2Vzc2luZ18pIHsKICAgICAvLyBJZiBubyBmbHVzaCBpcyBjdXJyZW50bHkgaW4gcHJvZ3Jlc3MsIGZsdXNoIGltbWVkaWF0ZWx5LgpAQCAtNDE4LDcgKzI1Nyw3IEBACiAKIHZvaWQgU3RvcmFnZU1hbmFnZXI6OkZsdXNoSW50ZXJuYWwoKSB7CiAgIFRSQUNFX0VWRU5UMCgiY29iYWx0OjpzdG9yYWdlIiwgX19GVU5DVElPTl9fKTsKLSAgRENIRUNLKHNxbF9tZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOworICBEQ0hFQ0soc3RvcmFnZV9tZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwogICBGaW5pc2hJbml0KCk7CiAKICAgZmx1c2hfcHJvY2Vzc2luZ18gPSB0cnVlOwpAQCAtNDI2LDI4ICsyNjUsMjMgQEAKIAogICAvLyBTZXJpYWxpemUgdGhlIGRhdGFiYXNlIGludG8gYSBidWZmZXIuIFRoZW4gc2VuZCB0aGUgYnl0ZXMKICAgLy8gdG8gT25GbHVzaElPIGZvciBhIGJsb2NraW5nIHdyaXRlIHRvIHRoZSBzYXZlZ2FtZS4KLSAgc2NvcGVkX3B0cjxTYXZlZ2FtZTo6Qnl0ZVZlY3Rvcj4gcmF3X2J5dGVzX3B0cjsKLSAgaW50IHNpemUgPSB2ZnNfLT5TZXJpYWxpemUoTlVMTCwgdHJ1ZSAvKmRyeV9ydW4qLyk7Ci0gIHJhd19ieXRlc19wdHIucmVzZXQobmV3IFNhdmVnYW1lOjpCeXRlVmVjdG9yKHN0YXRpY19jYXN0PHNpemVfdD4oc2l6ZSkpKTsKLSAgaWYgKHNpemUgPiAwKSB7Ci0gICAgU2F2ZWdhbWU6OkJ5dGVWZWN0b3ImIHJhd19ieXRlcyA9ICpyYXdfYnl0ZXNfcHRyOwotICAgIHZmc18tPlNlcmlhbGl6ZSgmcmF3X2J5dGVzWzBdLCBmYWxzZSAvKmRyeV9ydW4qLyk7Ci0gIH0KKyAgc2NvcGVkX3B0cjxTYXZlZ2FtZTo6Qnl0ZVZlY3Rvcj4gcmF3X2J5dGVzX3B0cihuZXcgU2F2ZWdhbWU6OkJ5dGVWZWN0b3IoKSk7CisgIG1lbW9yeV9zdG9yZV8tPlNlcmlhbGl6ZShyYXdfYnl0ZXNfcHRyLmdldCgpKTsKIAogICAvLyBTZW5kIHRoZSBzYXZlZ2FtZSBieXRlcyBvZmYgdG8gdGhlIFNhdmVnYW1lVGhyZWFkIG9iamVjdCB0byBiZQogICAvLyBhc3luY2hyb25vdXNseSB3cml0dGVuIHRvIHRoZSBzYXZlZ2FtZSBmaWxlLgogICBzYXZlZ2FtZV90aHJlYWRfLT5GbHVzaCgKICAgICAgIHJhd19ieXRlc19wdHIuUGFzcygpLAotICAgICAgYmFzZTo6QmluZCgmU3RvcmFnZU1hbmFnZXI6Ok9uRmx1c2hJT0NvbXBsZXRlZFNRTENhbGxiYWNrLAorICAgICAgYmFzZTo6QmluZCgmU3RvcmFnZU1hbmFnZXI6Ok9uRmx1c2hJT0NvbXBsZXRlZENhbGxiYWNrLAogICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSk7CiB9CiAKIHZvaWQgU3RvcmFnZU1hbmFnZXI6OkZpbmlzaElPKCkgewogICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6c3RvcmFnZSIsIF9fRlVOQ1RJT05fXyk7Ci0gIERDSEVDSyghc3FsX21lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CisgIERDSEVDSyghc3RvcmFnZV9tZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwogCiAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBvbiBjaGFuZ2UgdGltZXJzIGZpcmUgaWYgdGhleSdyZSBydW5uaW5nLgotICBzcWxfbWVzc2FnZV9sb29wXy0+UG9zdFRhc2soCisgIHN0b3JhZ2VfbWVzc2FnZV9sb29wXy0+UG9zdFRhc2soCiAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJlN0b3JhZ2VNYW5hZ2VyOjpGaXJlUnVubmluZ09uQ2hhbmdlVGltZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpKTsKIApAQCAtNDYwLDkgKzI5NCw5IEBACiAgIC8vIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgZGVzdHJ1Y3Rvciwgc28gdGhlIG9ubHkgbmV3IHRhc2tzIHBvc3RlZAogICAvLyBhZnRlciB0aGlzIG9uZSB3aWxsIGJlIGdlbmVyYXRlZCBpbnRlcm5hbGx5LiAgV2UgbmVlZCB0byBkbyB0aGlzIGJlY2F1c2UKICAgLy8gaXQgaXMgcG9zc2libGUgdGhhdCB0aGVyZSBhcmUgbm8gZmx1c2hlcyBwZW5kaW5nIGF0IHRoaXMgaW5zdGFudCwgYnV0IHRoZXJlCi0gIC8vIGFyZSB0YXNrcyBxdWV1ZWQgb24gfHNxbF9tZXNzYWdlX2xvb3BffCB0aGF0IHdpbGwgYmVnaW4gYSBmbHVzaCwgYW5kIHNvCisgIC8vIGFyZSB0YXNrcyBxdWV1ZWQgb24gfHN0b3JhZ2VfbWVzc2FnZV9sb29wX3wgdGhhdCB3aWxsIGJlZ2luIGEgZmx1c2gsIGFuZCBzbwogICAvLyB3ZSBtYWtlIHN1cmUgdGhhdCB0aGVzZSBhcmUgZXhlY3V0ZWQgZmlyc3QuCi0gIHNxbF9tZXNzYWdlX2xvb3BfLT5XYWl0Rm9yRmVuY2UoKTsKKyAgc3RvcmFnZV9tZXNzYWdlX2xvb3BfLT5XYWl0Rm9yRmVuY2UoKTsKIAogICAvLyBOb3cgd2FpdCBmb3IgYWxsIHBlbmRpbmcgZmx1c2hlcyB0byB3cmFwIHRoZW1zZWx2ZXMgdXAuICBUaGlzIG1heSBpbnZvbHZlCiAgIC8vIHRoZSBzYXZlZ2FtZSBJL08gdGhyZWFkIGFuZCB0aGUgU1FMIHRocmVhZCBwb3N0aW5nIHRhc2tzIHRvIGVhY2ggb3RoZXIuCkBAIC00NzEsNyArMzA1LDcgQEAKIAogdm9pZCBTdG9yYWdlTWFuYWdlcjo6RmlyZVJ1bm5pbmdPbkNoYW5nZVRpbWVycygpIHsKICAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OnN0b3JhZ2UiLCBfX0ZVTkNUSU9OX18pOwotICBEQ0hFQ0soc3FsX21lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CisgIERDSEVDSyhzdG9yYWdlX21lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CiAKICAgaWYgKGZsdXNoX29uX2xhc3RfY2hhbmdlX3RpbWVyXy0+SXNSdW5uaW5nKCkgfHwKICAgICAgIGZsdXNoX29uX2NoYW5nZV9tYXhfZGVsYXlfdGltZXJfLT5Jc1J1bm5pbmcoKSkgewpAQCAtNDgxLDcgKzMxNSw3IEBACiAKIHZvaWQgU3RvcmFnZU1hbmFnZXI6Ok9uRGVzdHJveSgpIHsKICAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OnN0b3JhZ2UiLCBfX0ZVTkNUSU9OX18pOwotICBEQ0hFQ0soc3FsX21lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CisgIERDSEVDSyhzdG9yYWdlX21lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CiAKICAgLy8gU3RvcCB0aGUgc2F2ZWdhbWUgdGhyZWFkIGFuZCBoYXZlIGl0IHdyYXAgdXAgYW55IHBlbmRpbmcgSS9PIG9wZXJhdGlvbnMuCiAgIHNhdmVnYW1lX3RocmVhZF8ucmVzZXQoKTsKQEAgLTQ4OSw4ICszMjMsNiBAQAogICAvLyBFbnN1cmUgdGhlc2Ugb2JqZWN0cyBhcmUgZGVzdHJveWVkIG9uIHRoZSBwcm9wZXIgdGhyZWFkLgogICBmbHVzaF9vbl9sYXN0X2NoYW5nZV90aW1lcl8ucmVzZXQoTlVMTCk7CiAgIGZsdXNoX29uX2NoYW5nZV9tYXhfZGVsYXlfdGltZXJfLnJlc2V0KE5VTEwpOwotICBzcWxfdmZzXy5yZXNldChOVUxMKTsKLSAgdmZzXy5yZXNldChOVUxMKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIHN0b3JhZ2UKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3RvcmFnZS9zdG9yYWdlX21hbmFnZXIuaCBiL3NyYy9jb2JhbHQvc3RvcmFnZS9zdG9yYWdlX21hbmFnZXIuaAppbmRleCA5OTg4ZjkyLi5mNWQ5ZWJkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3N0b3JhZ2Uvc3RvcmFnZV9tYW5hZ2VyLmgKKysrIGIvc3JjL2NvYmFsdC9zdG9yYWdlL3N0b3JhZ2VfbWFuYWdlci5oCkBAIC0yNSwyMyArMjUsMjAgQEAKICNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgogI2luY2x1ZGUgImJhc2UvdGltZXIuaCIKICNpbmNsdWRlICJjb2JhbHQvc3RvcmFnZS9zYXZlZ2FtZV90aHJlYWQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc3RvcmFnZS9zcWxfdmZzLmgiCisjaW5jbHVkZSAiY29iYWx0L3N0b3JhZ2Uvc3RvcmUvbWVtb3J5X3N0b3JlLmgiCiAjaW5jbHVkZSAiY29iYWx0L3N0b3JhZ2UvdXBncmFkZS91cGdyYWRlX3JlYWRlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zdG9yYWdlL3ZpcnR1YWxfZmlsZV9zeXN0ZW0uaCIKLSNpbmNsdWRlICJzcWwvY29ubmVjdGlvbi5oIgogCiBuYW1lc3BhY2UgY29iYWx0IHsKIG5hbWVzcGFjZSBzdG9yYWdlIHsKLWNsYXNzIFNxbENvbnRleHQ7CiAKLS8vIFN0b3JhZ2VNYW5hZ2VyIG1hbmFnZXMgYSBTUUxpdGUgZGF0YWJhc2UgY29udGFpbmluZyBjb29raWVzIGFuZCBsb2NhbAorLy8gU3RvcmFnZU1hbmFnZXIgbWFuYWdlcyBhIHN0b3JlIGNvbnRhaW5pbmcgY29va2llcyBhbmQgbG9jYWwKIC8vIHN0b3JhZ2UgZGF0YS4gT24gbW9zdCBwbGF0Zm9ybXMsIHRoaXMgaXMgd3JpdHRlbiB0byBkaXNrIGFzIGEgc2F2ZWdhbWUKIC8vIHVzaW5nIHBsYXRmb3JtIEFQSXMuIE9uIExpbnV4L1dpbmRvd3MsIGl0J3MgYSByZWd1bGFyIGZpbGUuCiAvLyBJbnRlcm5hbGx5IHRoaXMgcnVucyB0d28gdGhyZWFkczogb25lIHRocmVhZCB0byBwZXJmb3JtIGJsb2NraW5nIEkvTywKLS8vIGFuZCBvbmUgd2hlcmUgU1FMIG9wZXJhdGlvbnMgb2NjdXIuICBVc2VycyBhcmUgZXhwZWN0ZWQgdG8gYWNjZXNzIHRoZQotLy8gZGF0YWJhc2UgdmlhIGFuIFNxbENvbnRleHQsIHdoaWNoIGNhbiBiZSBvYnRhaW5lZCB3aXRoIEdldFNxbENvbnRleHQoKS4KLS8vIFRoZSBjYWxsYmFjayB0byBHZXRTcWxDYWxsYmFjayB3aWxsIHJ1biBvbiB0aGUgU1FMIHRocmVhZC4KLS8vIE9wZXJhdGlvbnMgb24gU3FsQ29udGV4dCB3aWxsIGJsb2NrIHRoZSBTUUwgdGhyZWFkIHVudGlsIHRoZSBzYXZlZ2FtZQorLy8gYW5kIG9uZSB3aGVyZSBzdG9yZSBvcGVyYXRpb25zIG9jY3VyLiAgVXNlcnMgYXJlIGV4cGVjdGVkIHRvIGFjY2VzcyB0aGUKKy8vIHN0b3JlIHZpYSBhbiBNZW1vcnlTdG9yZSwgd2hpY2ggY2FuIGJlIG9idGFpbmVkIHdpdGggR2V0UmVhZE9ubHlNZW1vcnlTdG9yZSgpCisvLyBvciBXaXRoTWVtb3J5U3RvcmUoKS4gVGhlIGNhbGxiYWNrIHRvIHdpbGwgcnVuIG9uIHRoZSBzdG9yZSB0aHJlYWQuCisvLyBPcGVyYXRpb25zIG9uIE1lbW9yeVN0b3JlIHdpbGwgYmxvY2sgdGhlIHN0b3JlIHRocmVhZCB1bnRpbCB0aGUgc2F2ZWdhbWUKIC8vIGlzIGxvYWRlZC4KIGNsYXNzIFN0b3JhZ2VNYW5hZ2VyIHsKICBwdWJsaWM6CkBAIC01OSwzMiArNTYsMTcgQEAKICAgICBTYXZlZ2FtZTo6T3B0aW9ucyBzYXZlZ2FtZV9vcHRpb25zOwogICB9OwogCi0gIHR5cGVkZWYgYmFzZTo6Q2FsbGJhY2s8dm9pZChTcWxDb250ZXh0Kik+IFNxbENhbGxiYWNrOwotCi0gIC8vIERhdGFiYXNlIHZlcnNpb24gIjIiIGluZGljYXRlcyB0aGF0IHRoaXMgd2FzIGNyZWF0ZWQgYnkgU3RlZWwgdjEueC4KLSAgLy8gRGF0YWJhc2UgdmVyc2lvbiAiMCIgaW5kaWNhdGVzIHRoYXQgdGhpcyB3YXMgY3JlYXRlZCBieSB2Mi54IGJldGEsCi0gIC8vICAgcGF0Y2hlcyAwLTMuICBWZXJzaW9uICIwIiBpcyBhIGRlZmF1bHQgZnJvbSBzcWxpdGUzIGJlY2F1c2UgdGhlc2UKLSAgLy8gICB2ZXJzaW9ucyBvZiB0aGUgYXBwbGljYXRpb24gZGlkIG5vdCBzZXQgdGhpcyB2YWx1ZSBhdCBhbGwuCi0gIC8vIERhdGFiYXNlIHZlcnNpb24gIjMiIGluZGljYXRlcyB0aGF0IHRoZSBzY2hlbWEgdmVyc2lvbnMgb2YgaW5kaXZpZHVhbAotICAvLyAgIHRhYmxlcyBzaG91bGQgYmUgdHJhY2tlZCBpbiBTY2hlbWFUYWJsZS4KLSAgc3RhdGljIGNvbnN0IGludCBrRGF0YWJhc2VVc2VyVmVyc2lvbiA9IDM7Ci0KLSAgLy8gU2NoZW1hLXJlbGF0ZWQgZXJyb3IgY29kZXMuICBTZWUgR2V0U2NoZW1hVmVyc2lvbigpLgotICBlbnVtIHsKLSAgICBrU2NoZW1hVGFibGVJc05ldyA9IC0xLAotICAgIGtTY2hlbWFWZXJzaW9uTG9zdCA9IC0yLAotICB9OworICB0eXBlZGVmIGJhc2U6OkNhbGxiYWNrPHZvaWQoY29uc3QgTWVtb3J5U3RvcmUmKT4gUmVhZE9ubHlNZW1vcnlTdG9yZUNhbGxiYWNrOworICB0eXBlZGVmIGJhc2U6OkNhbGxiYWNrPHZvaWQoTWVtb3J5U3RvcmUqKT4gTWVtb3J5U3RvcmVDYWxsYmFjazsKIAogICBTdG9yYWdlTWFuYWdlcihzY29wZWRfcHRyPFVwZ3JhZGVIYW5kbGVyPiB1cGdyYWRlX2hhbmRsZXIsCiAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOwogICB2aXJ0dWFsIH5TdG9yYWdlTWFuYWdlcigpOwogCi0gIC8vIE9idGFpbiB0aGUgU3FsQ29udGV4dCBmb3Igb3VyIGRhdGFiYXNlLgotICAvLyB8Y2FsbGJhY2t8IHdpbGwgYmUgY2FsbGVkIHdpdGggYW4gU3FsQ29udGV4dCB0aGF0IGNhbiBiZSB1c2VkIHRvIG9wZXJhdGUgb24KLSAgLy8gdGhlIGRhdGFiYXNlLiBUaGUgY2FsbGJhY2sgd2lsbCBydW4gb24gdGhlIHN0b3JhZ2UgbWFuYWdlcidzIG1lc3NhZ2UgbG9vcC4KLSAgdm9pZCBHZXRTcWxDb250ZXh0KGNvbnN0IFNxbENhbGxiYWNrJiBjYWxsYmFjayk7CisgIHZvaWQgV2l0aFJlYWRPbmx5TWVtb3J5U3RvcmUoY29uc3QgUmVhZE9ubHlNZW1vcnlTdG9yZUNhbGxiYWNrJiBjYWxsYmFjayk7CisgIHZvaWQgV2l0aE1lbW9yeVN0b3JlKGNvbnN0IE1lbW9yeVN0b3JlQ2FsbGJhY2smIGNhbGxiYWNrKTsKIAotICAvLyBTY2hlZHVsZSBhIHdyaXRlIG9mIG91ciBkYXRhYmFzZSB0byBkaXNrIHRvIGhhcHBlbiBhdCBzb21lIHBvaW50IGluIHRoZQorICAvLyBTY2hlZHVsZSBhIHdyaXRlIG9mIG91ciBtZW1vcnkgc3RvcmUgdG8gZGlzayB0byBoYXBwZW4gYXQgc29tZSBwb2ludCBpbiB0aGUKICAgLy8gZnV0dXJlIGFmdGVyIGEgY2hhbmdlIG9jY3Vycy4gTXVsdGlwbGUgY2FsbHMgdG8gRmx1c2goKSBkbyBub3QgbmVjZXNzYXJpbHkKICAgLy8gcmVzdWx0IGluIG11bHRpcGxlIHdyaXRlcyB0byBkaXNrLgogICAvLyBUaGlzIGNhbGwgcmV0dXJucyBpbW1lZGlhdGVseS4KQEAgLTEwOSwxNSArOTEsMTMgQEAKICAgdmlydHVhbCB2b2lkIFF1ZXVlRmx1c2goY29uc3QgYmFzZTo6Q2xvc3VyZSYgY2FsbGJhY2spOwogCiAgcHJpdmF0ZToKLSAgLy8gU3FsQ29udGV4dCBuZWVkcyBhY2Nlc3MgdG8gb3VyIGludGVybmFsIEFQSXMuCi0gIGZyaWVuZCBjbGFzcyBTcWxDb250ZXh0OwogICAvLyBHaXZlIFN0b3JhZ2VNYW5hZ2VyVGVzdCBhY2Nlc3MsIHNvIHdlIGNhbiBtb3JlIGVhc2lseSB0ZXN0IHNvbWUgaW50ZXJuYWxzLgogICBmcmllbmQgY2xhc3MgU3RvcmFnZU1hbmFnZXJUZXN0OwogCiAgIC8vIEZsdXNoZXMgYWxsIHF1ZXVlZCBmbHVzaGVzIHRvIHRoZSBzYXZlZ2FtZSB0aHJlYWQuCiAgIHZvaWQgRmx1c2hJbnRlcm5hbCgpOwogCi0gIC8vIEluaXRpYWxpemUgdGhlIFNRTGl0ZSBkYXRhYmFzZS4gVGhpcyBibG9ja3MgdW50aWwgdGhlIHNhdmVnYW1lIGxvYWQgaXMKKyAgLy8gSW5pdGlhbGl6ZSB0aGUgc3RvcmUuIFRoaXMgYmxvY2tzIHVudGlsIHRoZSBzYXZlZ2FtZSBsb2FkIGlzCiAgIC8vIGNvbXBsZXRlLgogICB2b2lkIEZpbmlzaEluaXQoKTsKIApAQCAtMTI3LDU0ICsxMDcsMzggQEAKICAgLy8gQ2FsbGJhY2sgd2hlbiBmbHVzaCB0aW1lciBoYXMgZWxhcHNlZC4KICAgdm9pZCBPbkZsdXNoT25DaGFuZ2VUaW1lckZpcmVkKCk7CiAKLSAgLy8gTG9naWMgdG8gYmUgZXhlY3V0ZWQgb24gdGhlIFNRTCB0aHJlYWQgd2hlbiBhIGZsdXNoIGNvbXBsZXRlcy4gIFdpbGwKKyAgLy8gTG9naWMgdG8gYmUgZXhlY3V0ZWQgb24gdGhlIHN0b3JlIHRocmVhZCB3aGVuIGEgZmx1c2ggY29tcGxldGVzLiAgV2lsbAogICAvLyBkaXNwYXRjaCB8Zmx1c2hfcHJvY2Vzc2luZ19jYWxsYmFja3NffCBjYWxsYmFja3MgYW5kIGV4ZWN1dGUgYSBuZXcgZmx1c2gKICAgLy8gaWYgfGZsdXNoX3JlcXVlc3RlZF98IGlzIHRydWUuCi0gIHZvaWQgT25GbHVzaElPQ29tcGxldGVkU1FMQ2FsbGJhY2soKTsKKyAgdm9pZCBPbkZsdXNoSU9Db21wbGV0ZWRDYWxsYmFjaygpOwogCiAgIC8vIFRoaXMgZnVuY3Rpb24gd2lsbCBub3QgcmV0dXJuIHVudGlsIGFsbCBxdWV1ZWQgSS9PIGlzIGNvbXBsZXRlZC4gIFNpbmNlCi0gIC8vIGl0IHdpbGwgcmVxdWlyZSB0aGUgU1FMIG1lc3NhZ2UgbG9vcCB0byBwcm9jZXNzLCBpdCBtdXN0IGJlIGNhbGxlZCBmcm9tCi0gIC8vIG91dHNpZGUgdGhlIFNRTCBtZXNzYWdlIGxvb3AgKHN1Y2ggYXMgZnJvbSBTdG9yYWdlTWFuYWdlcidzIGRlc3RydWN0b3IpLgorICAvLyBpdCB3aWxsIHJlcXVpcmUgdGhlIHN0b3JlIG1lc3NhZ2UgbG9vcCB0byBwcm9jZXNzLCBpdCBtdXN0IGJlIGNhbGxlZCBmcm9tCisgIC8vIG91dHNpZGUgdGhlIHN0b3JlIG1lc3NhZ2UgbG9vcCAoc3VjaCBhcyBmcm9tIFN0b3JhZ2VNYW5hZ2VyJ3MgZGVzdHJ1Y3RvcikuCiAgIHZvaWQgRmluaXNoSU8oKTsKIAogICAvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgaW1tZWRpYXRlbHkgdGhlIG9uIGNoYW5nZSB0aW1lcnMgaWYgdGhleSBhcmUgcnVubmluZy4KICAgdm9pZCBGaXJlUnVubmluZ09uQ2hhbmdlVGltZXJzKCk7CiAKICAgLy8gQ2FsbGVkIGJ5IHRoZSBkZXN0cnVjdG9yLCB0byBlbnN1cmUgd2UgZGVzdHJveSBjZXJ0YWluIG9iamVjdHMgb24gdGhlCi0gIC8vIHNxbCB0aHJlYWQuCisgIC8vIHN0b3JlIHRocmVhZAogICB2b2lkIE9uRGVzdHJveSgpOwogCi0gIC8vIEludGVybmFsIEFQSSBmb3IgdXNlIGJ5IFNxbENvbnRleHQuCi0gIHNxbDo6Q29ubmVjdGlvbiogc3FsX2Nvbm5lY3Rpb24oKTsKLSAgYm9vbCBHZXRTY2hlbWFWZXJzaW9uKGNvbnN0IGNoYXIqIHRhYmxlX25hbWUsIGludCogc2NoZW1hX3ZlcnNpb24pOwotICB2b2lkIFVwZGF0ZVNjaGVtYVZlcnNpb24oY29uc3QgY2hhciogdGFibGVfbmFtZSwgaW50IHZlcnNpb24pOwotCiAgIC8vIFVwZ3JhZGUgaGFuZGxlciB1c2VkIGlmIHVwZ3JhZGUgc2F2ZSBkYXRhIGlzIGRldGVjdGVkLgogICBzY29wZWRfcHRyPFVwZ3JhZGVIYW5kbGVyPiB1cGdyYWRlX2hhbmRsZXJfOwogCiAgIC8vIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIFN0b3JhZ2UgTWFuYWdlci4KICAgT3B0aW9ucyBvcHRpb25zXzsKIAotICAvLyBTdG9yYWdlIG1hbmFnZXIgcnVucyBvbiBpdHMgb3duIHRocmVhZC4gVGhpcyBpcyB3aGVyZSBTUUwgZGF0YWJhc2UKKyAgLy8gU3RvcmFnZSBtYW5hZ2VyIHJ1bnMgb24gaXRzIG93biB0aHJlYWQuIFRoaXMgaXMgd2hlcmUgc3RvcmUKICAgLy8gb3BlcmF0aW9ucyBhcmUgZG9uZS4KLSAgc2NvcGVkX3B0cjxiYXNlOjpUaHJlYWQ+IHNxbF90aHJlYWRfOwotICBzY29wZWRfcmVmcHRyPGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk+IHNxbF9tZXNzYWdlX2xvb3BfOworICBzY29wZWRfcHRyPGJhc2U6OlRocmVhZD4gc3RvcmFnZV90aHJlYWRfOworICBzY29wZWRfcmVmcHRyPGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk+IHN0b3JhZ2VfbWVzc2FnZV9sb29wXzsKIAotICAvLyBBbiBpbnRlcmZhY2UgdG8gdGhlIHN0b3JhZ2UgbWFuYWdlcidzIFNRTCBkYXRhYmFzZSB0aGF0IHdpbGwgcnVuIG9uCi0gIC8vIHRoZSBjb3JyZWN0IHRocmVhZC4KLSAgc2NvcGVkX3B0cjxTcWxDb250ZXh0PiBzcWxfY29udGV4dF87Ci0KLSAgLy8gVGhlIGluLW1lbW9yeSBkYXRhYmFzZSBjb25uZWN0aW9uLgotICBzY29wZWRfcHRyPHNxbDo6Q29ubmVjdGlvbj4gY29ubmVjdGlvbl87Ci0KLSAgLy8gVmlydHVhbCBmaWxlIHN5c3RlbSB0aGF0IGNvbnRhaW5zIG91ciBpbi1tZW1vcnkgU1FMaXRlIGRhdGFiYXNlLgotICBzY29wZWRfcHRyPFZpcnR1YWxGaWxlU3lzdGVtPiB2ZnNfOwotCi0gIC8vIEFuIGludGVyZmFjZSBiZXR3ZWVuIFNxbGl0ZSBhbmQgVmlydHVhbEZpbGVTeXN0ZW0uCi0gIHNjb3BlZF9wdHI8U3FsVmZzPiBzcWxfdmZzXzsKKyAgc2NvcGVkX3B0cjxNZW1vcnlTdG9yZT4gbWVtb3J5X3N0b3JlXzsKIAogICAvLyBXaGVuIHRoZSBzYXZlZ2FtZSBpcyBsb2FkZWQgYXQgc3RhcnR1cCwgd2Uga2VlcCB0aGUgcmF3IGRhdGEgYXJvdW5kCi0gIC8vIHVudGlsIHdlIGNhbiBpbml0aWFsaXplIHRoZSBkYXRhYmFzZSBvbiB0aGUgY29ycmVjdCB0aHJlYWQuCisgIC8vIHVudGlsIHdlIGNhbiBpbml0aWFsaXplIHRoZSBzdG9yZSBvbiB0aGUgY29ycmVjdCB0aHJlYWQuCiAgIHNjb3BlZF9wdHI8U2F2ZWdhbWU6OkJ5dGVWZWN0b3I+IGxvYWRlZF9yYXdfYnl0ZXNfOwogCiAgIC8vIFRpbWVycyB0aGF0IHN0YXJ0IHJ1bm5pbmcgd2hlbiBGbHVzaE9uQ2hhbmdlKCkgaXMgY2FsbGVkLiBXaGVuIHRoZSB0aW1lCkBAIC0xOTEsNyArMTU1LDcgQEAKIAogICAvLyBTZWUgY29tbWVudHMgZm9yIGZvciBrRGF0YWJhc2VVc2VyVmVyc2lvbi4KICAgaW50IGxvYWRlZF9kYXRhYmFzZV92ZXJzaW9uXzsKLSAgLy8gZmFsc2UgdW50aWwgdGhlIFNRTCBkYXRhYmFzZSBpcyBmdWxseSBjb25maWd1cmVkLgorICAvLyBmYWxzZSB1bnRpbCB0aGUgc3RvcmUgaXMgZnVsbHkgY29uZmlndXJlZC4KICAgYm9vbCBpbml0aWFsaXplZF87CiAKICAgLy8gVHJ1ZSBpZiBhIGZsdXNoIGlzIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQgb24gdGhlIHN0b3JhZ2UgbWVzc2FnZSBsb29wLgpAQCAtMjIyLDUxICsxODYsNiBAQAogICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oU3RvcmFnZU1hbmFnZXIpOwogfTsKIAotLy8gUHJveHkgZm9yIGFjY2Vzc2luZyBTdG9yYWdlTWFuYWdlcidzIFNRTCBkYXRhYmFzZSBpbiBhIHRocmVhZC1zYWZlIHdheS4KLS8vIEFsbCBhY2Nlc3MgdG8gdGhlIFN0b3JhZ2VNYW5hZ2VyJ3MgZGF0YWJhc2Ugc2hvdWxkIGJlIGRvbmUgdmlhIGFuIFNxbENvbnRleHQuCi0vLyBPbmx5IHRoZSBTdG9yYWdlTWFuYWdlciBjYW4gY3JlYXRlIHRoaXMgY2xhc3MuCi1jbGFzcyBTcWxDb250ZXh0IHsKLSBwdWJsaWM6Ci0gIHNxbDo6Q29ubmVjdGlvbiogc3FsX2Nvbm5lY3Rpb24oKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0b3JhZ2VfbWFuYWdlcl8tPnNxbF9jb25uZWN0aW9uKCk7Ci0gIH0KLQotICAvLyBHZXQgdGhlIHNjaGVtYSB2ZXJzaW9uIGZvciB0aGUgZ2l2ZW4gdGFibGUuCi0gIC8vIFJldHVybnMgZmFsc2UgaWYgdGhlIHRhYmxlIGRvZXMgbm90IGV4aXN0LCBvdGhlcndpc2UgcmV0dXJucyB0cnVlCi0gIC8vIGFuZCB3cml0ZXMgdGhlIHZlcnNpb24gbnVtYmVyIHRvIHRoZSBzY2hlbWFfdmVyc2lvbiBwb2ludGVyLgotICAvLyBzY2hlbWFfdmVyc2lvbiB3aWxsIGJlIHNldCB0byBrU2NoZW1hVGFibGVJc05ldyBpZiB0aGUgdGFibGUgZXhpc3RzLAotICAvLyBidXQgdGhlIHNjaGVtYSB0YWJsZSB3YXMgbmV3bHkgY3JlYXRlZCBpbiB0aGlzIHNlc3Npb24uCi0gIC8vIHNjaGVtYV92ZXJzaW9uIHdpbGwgYmUgc2V0IHRvIGtTY2hlbWFWZXJzaW9uTG9zdCBpZiB0aGUgdGFibGUgZXhpc3RzLAotICAvLyBhbmQgdGhlIHNjaGVtYSB0YWJsZSBleGlzdGVkIG9uY2UgYmVmb3JlLCBidXQgaGFzIHNpbmNlIGJlZW4gbG9zdC4KLSAgLy8gSW4gdGhpcyBjYXNlLCB0aGUgc2NoZW1hIHZlcnNpb24gY2Fubm90IGJlIGtub3duIG9yIGRpcmVjdGx5IGluZmVycmVkLgotICBib29sIEdldFNjaGVtYVZlcnNpb24oY29uc3QgY2hhciogdGFibGVfbmFtZSwgaW50KiBzY2hlbWFfdmVyc2lvbikgewotICAgIHJldHVybiBzdG9yYWdlX21hbmFnZXJfLT5HZXRTY2hlbWFWZXJzaW9uKHRhYmxlX25hbWUsIHNjaGVtYV92ZXJzaW9uKTsKLSAgfQotCi0gIC8vIFVwZGF0ZXMgdGhlIHNjaGVtYSB2ZXJzaW9uIGZvciB0aGUgZ2l2ZW4gdGFibGUuCi0gIC8vIFRoZSB2ZXJzaW9uIG51bWJlciBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwLgotICB2b2lkIFVwZGF0ZVNjaGVtYVZlcnNpb24oY29uc3QgY2hhciogdGFibGVfbmFtZSwgaW50IHZlcnNpb24pIHsKLSAgICByZXR1cm4gc3RvcmFnZV9tYW5hZ2VyXy0+VXBkYXRlU2NoZW1hVmVyc2lvbih0YWJsZV9uYW1lLCB2ZXJzaW9uKTsKLSAgfQotCi0gIHZvaWQgRmx1c2hPbkNoYW5nZSgpIHsgc3RvcmFnZV9tYW5hZ2VyXy0+Rmx1c2hPbkNoYW5nZSgpOyB9Ci0KLSAgdm9pZCBGbHVzaE5vdyhjb25zdCBiYXNlOjpDbG9zdXJlJiBjYWxsYmFjaykgewotICAgIHN0b3JhZ2VfbWFuYWdlcl8tPkZsdXNoTm93KGNhbGxiYWNrKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgU3RvcmFnZU1hbmFnZXIqIHN0b3JhZ2VfbWFuYWdlcl87Ci0KLSAgZXhwbGljaXQgU3FsQ29udGV4dChTdG9yYWdlTWFuYWdlciogc3RvcmFnZV9tYW5hZ2VyKQotICAgICAgOiBzdG9yYWdlX21hbmFnZXJfKHN0b3JhZ2VfbWFuYWdlcikge30KLQotICBmcmllbmQgU3RvcmFnZU1hbmFnZXI6OlN0b3JhZ2VNYW5hZ2VyKAotICAgICAgc2NvcGVkX3B0cjxTdG9yYWdlTWFuYWdlcjo6VXBncmFkZUhhbmRsZXI+IHVwZ3JhZGVfaGFuZGxlciwKLSAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOwotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oU3FsQ29udGV4dCk7Ci19OwotCiB9ICAvLyBuYW1lc3BhY2Ugc3RvcmFnZQogfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3N0b3JhZ2Uvc3RvcmFnZV9tYW5hZ2VyX3Rlc3QuY2MgYi9zcmMvY29iYWx0L3N0b3JhZ2Uvc3RvcmFnZV9tYW5hZ2VyX3Rlc3QuY2MKaW5kZXggMjEwYzVhMi4uYjE5OWIyYSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zdG9yYWdlL3N0b3JhZ2VfbWFuYWdlcl90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvc3RvcmFnZS9zdG9yYWdlX21hbmFnZXJfdGVzdC5jYwpAQCAtNzksNDQgKzc5LDMyIEBACiAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihGbHVzaFdhaXRlcik7CiB9OwogCi1jbGFzcyBTcWxXYWl0ZXIgOiBwdWJsaWMgQ2FsbGJhY2tXYWl0ZXIgeworY2xhc3MgTWVtb3J5U3RvcmVXYWl0ZXIgOiBwdWJsaWMgQ2FsbGJhY2tXYWl0ZXIgewogIHB1YmxpYzoKLSAgU3FsV2FpdGVyKCkge30KLSAgdm9pZCBPblNxbENvbm5lY3Rpb24oU3FsQ29udGV4dCogc3FsX2NvbnRleHQpIHsKLSAgICBVTlJFRkVSRU5DRURfUEFSQU1FVEVSKHNxbF9jb250ZXh0KTsKKyAgTWVtb3J5U3RvcmVXYWl0ZXIoKSB7fQorICB2b2lkIE9uTWVtb3J5U3RvcmUoTWVtb3J5U3RvcmUqIG1lbW9yeV9zdG9yZSkgeworICAgIFVOUkVGRVJFTkNFRF9QQVJBTUVURVIobWVtb3J5X3N0b3JlKTsKICAgICBTaWduYWwoKTsKICAgfQogCiAgcHJpdmF0ZToKLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFNxbFdhaXRlcik7CisgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihNZW1vcnlTdG9yZVdhaXRlcik7CiB9OwogCi12b2lkIEZsdXNoQ2FsbGJhY2soU3FsQ29udGV4dCogc3FsX2NvbnRleHQpIHsKLSAgc3FsOjpDb25uZWN0aW9uKiBjb25uID0gc3FsX2NvbnRleHQtPnNxbF9jb25uZWN0aW9uKCk7Ci0gIGJvb2wgb2sgPSBjb25uLT5FeGVjdXRlKCJDUkVBVEUgVEFCTEUgRmx1c2hUZXN0KHRlc3RfbmFtZSBURVhUKTsiKTsKLSAgRVhQRUNUX1RSVUUob2spOwotfQorY2xhc3MgUmVhZE9ubHlNZW1vcnlTdG9yZVdhaXRlciA6IHB1YmxpYyBDYWxsYmFja1dhaXRlciB7CisgcHVibGljOgorICBSZWFkT25seU1lbW9yeVN0b3JlV2FpdGVyKCkge30KKyAgdm9pZCBPbk1lbW9yeVN0b3JlKGNvbnN0IE1lbW9yeVN0b3JlJiBtZW1vcnlfc3RvcmUpIHsKKyAgICBVTlJFRkVSRU5DRURfUEFSQU1FVEVSKG1lbW9yeV9zdG9yZSk7CisgICAgU2lnbmFsKCk7CisgIH0KIAotdm9pZCBRdWVyeVNjaGVtYUNhbGxiYWNrKFNxbENvbnRleHQqIHNxbF9jb250ZXh0KSB7Ci0gIGludCBzY2hlbWFfdmVyc2lvbjsKLSAgRVhQRUNUX0ZBTFNFKAotICAgICAgc3FsX2NvbnRleHQtPkdldFNjaGVtYVZlcnNpb24oIk5vbmV4aXN0ZW50IHRhYmxlIiwgJnNjaGVtYV92ZXJzaW9uKSk7CisgcHJpdmF0ZToKKyAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFJlYWRPbmx5TWVtb3J5U3RvcmVXYWl0ZXIpOworfTsKIAotICBzcWw6OkNvbm5lY3Rpb24qIGNvbm4gPSBzcWxfY29udGV4dC0+c3FsX2Nvbm5lY3Rpb24oKTsKLSAgYm9vbCBvayA9IGNvbm4tPkV4ZWN1dGUoIkNSRUFURSBUQUJMRSBUZXN0VGFibGUodGVzdF9uYW1lIFRFWFQpOyIpOwotICBFWFBFQ1RfVFJVRShvayk7Ci0KLSAgRVhQRUNUX1RSVUUoc3FsX2NvbnRleHQtPkdldFNjaGVtYVZlcnNpb24oIlRlc3RUYWJsZSIsICZzY2hlbWFfdmVyc2lvbikpOwotICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8aW50PihTdG9yYWdlTWFuYWdlcjo6a1NjaGVtYVRhYmxlSXNOZXcpLAotICAgICAgICAgICAgc2NoZW1hX3ZlcnNpb24pOwotCi0gIHNxbF9jb250ZXh0LT5VcGRhdGVTY2hlbWFWZXJzaW9uKCJUZXN0VGFibGUiLCAxMDApOwotfQotCi12b2lkIEluc3BlY3RTY2hlbWFWZXJzaW9uQ2FsbGJhY2soU3FsQ29udGV4dCogc3FsX2NvbnRleHQpIHsKLSAgaW50IHNjaGVtYV92ZXJzaW9uOwotICBFWFBFQ1RfVFJVRShzcWxfY29udGV4dC0+R2V0U2NoZW1hVmVyc2lvbigiVGVzdFRhYmxlIiwgJnNjaGVtYV92ZXJzaW9uKSk7Ci0gIEVYUEVDVF9FUSgxMDAsIHNjaGVtYV92ZXJzaW9uKTsKK3ZvaWQgRmx1c2hDYWxsYmFjayhNZW1vcnlTdG9yZSogbWVtb3J5X3N0b3JlKSB7CisgIEVYUEVDVF9ORShtZW1vcnlfc3RvcmUsIG51bGxwdHIpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UKQEAgLTE1NSwzNiArMTQzLDI4IEBACiAgIHNjb3BlZF9wdHI8U3RvcmFnZU1hbmFnZXI+IHN0b3JhZ2VfbWFuYWdlcl87CiB9OwogCi1URVNUX0YoU3RvcmFnZU1hbmFnZXJUZXN0LCBPYnRhaW5Db25uZWN0aW9uKSB7Ci0gIC8vIFZlcmlmeSB0aGF0IHRoZSBTUUwgY29ubmVjdGlvbiBpcyBub24tbnVsbC4KK1RFU1RfRihTdG9yYWdlTWFuYWdlclRlc3QsIFdpdGhNZW1vcnlTdG9yZSkgewogICBJbml0PFN0b3JhZ2VNYW5hZ2VyPigpOwotICBTcWxXYWl0ZXIgd2FpdGVyOwotICBzdG9yYWdlX21hbmFnZXJfLT5HZXRTcWxDb250ZXh0KAotICAgICAgYmFzZTo6QmluZCgmU3FsV2FpdGVyOjpPblNxbENvbm5lY3Rpb24sIGJhc2U6OlVucmV0YWluZWQoJndhaXRlcikpKTsKKyAgTWVtb3J5U3RvcmVXYWl0ZXIgd2FpdGVyOworICBzdG9yYWdlX21hbmFnZXJfLT5XaXRoTWVtb3J5U3RvcmUoCisgICAgICBiYXNlOjpCaW5kKCZNZW1vcnlTdG9yZVdhaXRlcjo6T25NZW1vcnlTdG9yZSwgYmFzZTo6VW5yZXRhaW5lZCgmd2FpdGVyKSkpOwogICBtZXNzYWdlX2xvb3BfLlJ1blVudGlsSWRsZSgpOwogICBFWFBFQ1RfVFJVRSh3YWl0ZXIuVGltZWRXYWl0KCkpOwogfQogCi1URVNUX0YoU3RvcmFnZU1hbmFnZXJUZXN0LCBRdWVyeVNjaGVtYVZlcnNpb24pIHsKLSAgSW5pdDxTdG9yYWdlTWFuYWdlcj4oZmFsc2UgLyogZGVsZXRlX3NhdmVnYW1lICovKTsKLSAgc3RvcmFnZV9tYW5hZ2VyXy0+R2V0U3FsQ29udGV4dChiYXNlOjpCaW5kKCZRdWVyeVNjaGVtYUNhbGxiYWNrKSk7Ci0gIG1lc3NhZ2VfbG9vcF8uUnVuVW50aWxJZGxlKCk7Ci0KLSAgLy8gRm9yY2UgYSB3cml0ZSB0byBkaXNrIGFuZCB3YWl0IHVudGlsIGl0J3MgZG9uZS4KLSAgRmx1c2hXYWl0ZXIgd2FpdGVyOwotICBzdG9yYWdlX21hbmFnZXJfLT5GbHVzaE5vdygKLSAgICAgIGJhc2U6OkJpbmQoJkZsdXNoV2FpdGVyOjpPbkZsdXNoRG9uZSwgYmFzZTo6VW5yZXRhaW5lZCgmd2FpdGVyKSkpOwotICBFWFBFQ1RfVFJVRSh3YWl0ZXIuVGltZWRXYWl0KCkpOwotCitURVNUX0YoU3RvcmFnZU1hbmFnZXJUZXN0LCBXaXRoUmVhZE9ubHlNZW1vcnlTdG9yZSkgewogICBJbml0PFN0b3JhZ2VNYW5hZ2VyPigpOwotICBzdG9yYWdlX21hbmFnZXJfLT5HZXRTcWxDb250ZXh0KGJhc2U6OkJpbmQoJkluc3BlY3RTY2hlbWFWZXJzaW9uQ2FsbGJhY2spKTsKKyAgUmVhZE9ubHlNZW1vcnlTdG9yZVdhaXRlciB3YWl0ZXI7CisgIHN0b3JhZ2VfbWFuYWdlcl8tPldpdGhSZWFkT25seU1lbW9yeVN0b3JlKGJhc2U6OkJpbmQoCisgICAgICAmUmVhZE9ubHlNZW1vcnlTdG9yZVdhaXRlcjo6T25NZW1vcnlTdG9yZSwgYmFzZTo6VW5yZXRhaW5lZCgmd2FpdGVyKSkpOwogICBtZXNzYWdlX2xvb3BfLlJ1blVudGlsSWRsZSgpOworICBFWFBFQ1RfVFJVRSh3YWl0ZXIuVGltZWRXYWl0KCkpOwogfQogCiBURVNUX0YoU3RvcmFnZU1hbmFnZXJUZXN0LCBGbHVzaE5vdykgewogICAvLyBFbnN1cmUgdGhlIEZsdXNoIGNhbGxiYWNrIGlzIGNhbGxlZC4KICAgSW5pdDxTdG9yYWdlTWFuYWdlcj4oKTsKLSAgc3RvcmFnZV9tYW5hZ2VyXy0+R2V0U3FsQ29udGV4dChiYXNlOjpCaW5kKCZGbHVzaENhbGxiYWNrKSk7CisgIHN0b3JhZ2VfbWFuYWdlcl8tPldpdGhNZW1vcnlTdG9yZShiYXNlOjpCaW5kKCZGbHVzaENhbGxiYWNrKSk7CiAgIG1lc3NhZ2VfbG9vcF8uUnVuVW50aWxJZGxlKCk7CiAgIEZsdXNoV2FpdGVyIHdhaXRlcjsKICAgc3RvcmFnZV9tYW5hZ2VyXy0+Rmx1c2hOb3coCkBAIC0xOTcsNyArMTc3LDcgQEAKICAgLy8gRmx1c2hPbkNoYW5nZSgpIGFuZCBGbHVzaE5vdygpLgogICBJbml0PE1vY2tTdG9yYWdlTWFuYWdlcj4oKTsKIAotICBzdG9yYWdlX21hbmFnZXJfLT5HZXRTcWxDb250ZXh0KGJhc2U6OkJpbmQoJkZsdXNoQ2FsbGJhY2spKTsKKyAgc3RvcmFnZV9tYW5hZ2VyXy0+V2l0aE1lbW9yeVN0b3JlKGJhc2U6OkJpbmQoJkZsdXNoQ2FsbGJhY2spKTsKICAgbWVzc2FnZV9sb29wXy5SdW5VbnRpbElkbGUoKTsKIAogICBGbHVzaFdhaXRlciB3YWl0ZXI7CkBAIC0yMjMsNyArMjAzLDcgQEAKICAgLy8gRmx1c2hPbkNoYW5nZSgpIG11bHRpcGxlIHRpbWVzLgogICBJbml0PE1vY2tTdG9yYWdlTWFuYWdlcj4oKTsKIAotICBzdG9yYWdlX21hbmFnZXJfLT5HZXRTcWxDb250ZXh0KGJhc2U6OkJpbmQoJkZsdXNoQ2FsbGJhY2spKTsKKyAgc3RvcmFnZV9tYW5hZ2VyXy0+V2l0aE1lbW9yeVN0b3JlKGJhc2U6OkJpbmQoJkZsdXNoQ2FsbGJhY2spKTsKICAgbWVzc2FnZV9sb29wXy5SdW5VbnRpbElkbGUoKTsKIAogICBGbHVzaFdhaXRlciB3YWl0ZXI7CkBAIC0yNTAsNyArMjMwLDcgQEAKICAgLy8gdGhlcmUgYXJlIGNvbnN0YW50IGNhbGxzIHRvIEZsdXNoT25DaGFuZ2UoKS4KICAgSW5pdDxNb2NrU3RvcmFnZU1hbmFnZXI+KCk7CiAKLSAgc3RvcmFnZV9tYW5hZ2VyXy0+R2V0U3FsQ29udGV4dChiYXNlOjpCaW5kKCZGbHVzaENhbGxiYWNrKSk7CisgIHN0b3JhZ2VfbWFuYWdlcl8tPldpdGhNZW1vcnlTdG9yZShiYXNlOjpCaW5kKCZGbHVzaENhbGxiYWNrKSk7CiAgIG1lc3NhZ2VfbG9vcF8uUnVuVW50aWxJZGxlKCk7CiAKICAgRmx1c2hXYWl0ZXIgd2FpdGVyOwpAQCAtMjc0LDcgKzI1NCw3IEBACiAgIC8vIFRlc3QgdGhhdCBwZW5kaW5nIGZsdXNoZXMgYXJlIGNvbXBsZXRlZCBvbiBzaHV0ZG93bi4KICAgSW5pdDxNb2NrU3RvcmFnZU1hbmFnZXI+KCk7CiAKLSAgc3RvcmFnZV9tYW5hZ2VyXy0+R2V0U3FsQ29udGV4dChiYXNlOjpCaW5kKCZGbHVzaENhbGxiYWNrKSk7CisgIHN0b3JhZ2VfbWFuYWdlcl8tPldpdGhNZW1vcnlTdG9yZShiYXNlOjpCaW5kKCZGbHVzaENhbGxiYWNrKSk7CiAgIG1lc3NhZ2VfbG9vcF8uUnVuVW50aWxJZGxlKCk7CiAKICAgRmx1c2hXYWl0ZXIgd2FpdGVyOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zdG9yYWdlL3N0b3JlL21lbW9yeV9zdG9yZS5jYyBiL3NyYy9jb2JhbHQvc3RvcmFnZS9zdG9yZS9tZW1vcnlfc3RvcmUuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkyZjQxOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvc3RvcmFnZS9zdG9yZS9tZW1vcnlfc3RvcmUuY2MKQEAgLTAsMCArMSwyNjggQEAKKy8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJjb2JhbHQvc3RvcmFnZS9zdG9yZS9tZW1vcnlfc3RvcmUuaCIKKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHVwbGU+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zdG9yYWdlL3N0b3JhZ2VfY29uc3RhbnRzLmgiCisjaW5jbHVkZSAiY29iYWx0L3N0b3JhZ2Uvc3RvcmUvc3RvcmFnZS5wYi5oIgorI2luY2x1ZGUgImdvb2dsZXVybC9zcmMvZ3VybC5oIgorI2luY2x1ZGUgIm5iL21lbW9yeV9zY29wZS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBzdG9yYWdlIHsKK25hbWVzcGFjZSB7CisKK2Jvb2wgSXNWYWxpZEZvcm1hdChjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OD4mIGJ1ZmZlcikgeworICByZXR1cm4gYnVmZmVyLnNpemUoKSA+PSBrU3RvcmFnZUhlYWRlclNpemUgJiYKKyAgICAgICAgIG1lbWNtcChidWZmZXIuZGF0YSgpLCBrU3RvcmFnZUhlYWRlciwga1N0b3JhZ2VIZWFkZXJTaXplKSA9PSAwOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gVXNpbmcgUGltcGwgZGVzaWduIHBhdHRlcm4gdG8gaGlkZSBwcm90b2J1ZiBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLgorLy8gVGhlIGdlbmVyYXRlZCBwcm90byBjb2RlIChpbmNsdWRpbmcgdGhlIGhlYWRlcikgbmVlZHMgc3BlY2lhbCBidWlsZAorLy8gY29uZmlndXJhdGlvbiB0byB3b3JrIGFzIGV4cGVjdGVkLiBXaGljaCBtZWFucyBhZGRpbmcgc3BlY2lhbCBidWlsZCBzZXR0aW5ncworLy8gdG8gYW55IHBsYWNlIHdoZXJlIHRoZSBoZWFkZXJzIGlzIGluY2x1ZGVkLgorY2xhc3MgTWVtb3J5U3RvcmU6OkltcGwgeworIHB1YmxpYzoKKyAgLy8gSW5pdGlhbGl6YXRpb24KKyAgSW1wbCgpOworICBib29sIEluaXRpYWxpemUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDg+JiBpbik7CisKKyAgLy8gU2VyaWFsaXphdGlvbgorICBib29sIFNlcmlhbGl6ZShzdGQ6OnZlY3Rvcjx1aW50OD4qIG91dCkgY29uc3Q7CisKKyAgLy8gQ29va2llcworICB2b2lkIEdldEFsbENvb2tpZXMoc3RkOjp2ZWN0b3I8bmV0OjpDYW5vbmljYWxDb29raWUqPiogY29va2llcykgY29uc3Q7CisgIHZvaWQgQWRkQ29va2llKGNvbnN0IG5ldDo6Q2Fub25pY2FsQ29va2llJiBjYywgaW50NjQgZXhwaXJhdGlvbl90aW1lX3VzKTsKKyAgdm9pZCBVcGRhdGVDb29raWVBY2Nlc3NUaW1lKGNvbnN0IG5ldDo6Q2Fub25pY2FsQ29va2llJiBjYywgaW50NjQgdGltZV91cyk7CisgIHZvaWQgRGVsZXRlQ29va2llKGNvbnN0IG5ldDo6Q2Fub25pY2FsQ29va2llJiBjYyk7CisKKyAgLy8gTG9jYWwgU3RvcmFnZQorICB2b2lkIFJlYWRBbGxMb2NhbFN0b3JhZ2UoY29uc3Qgc3RkOjpzdHJpbmcmIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxTdG9yYWdlTWFwKiBsb2NhbF9zdG9yYWdlX21hcCkgY29uc3Q7CisKKyAgdm9pZCBXcml0ZVRvTG9jYWxTdG9yYWdlKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIHZvaWQgRGVsZXRlRnJvbUxvY2FsU3RvcmFnZShjb25zdCBzdGQ6OnN0cmluZyYgaWQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXkpOworICB2b2lkIENsZWFyTG9jYWxTdG9yYWdlKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCk7CisKKyAgLy8gRGlzYWJsZSBjb3B5aW5nCisgIEltcGwoY29uc3QgSW1wbCYgc3RvcmUpID0gZGVsZXRlOworICBJbXBsJiBvcGVyYXRvcj0oY29uc3QgSW1wbCYgc3RvcmUpID0gZGVsZXRlOworCisgcHJpdmF0ZToKKyAgdHlwZWRlZiBzdGQ6OnR1cGxlPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IENvb2tpZUtleTsKKyAgc3RkOjptYXA8Q29va2llS2V5LCBDb29raWU+IGNvb2tpZXNfbWFwXzsKKworICB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gTG9jYWxTdG9yYWdlS2V5VmFsdWVNYXA7CisgIHR5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIExvY2FsU3RvcmFnZUtleVZhbHVlTWFwPiBMb2NhbFN0b3JhZ2VCeUlkTWFwOworCisgIExvY2FsU3RvcmFnZUJ5SWRNYXAgbG9jYWxfc3RvcmFnZV9ieV9pZF9tYXBfOworfTsKKworTWVtb3J5U3RvcmU6OkltcGw6OkltcGwoKSB7fQorCitib29sIE1lbW9yeVN0b3JlOjpJbXBsOjpJbml0aWFsaXplKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4PiYgaW4pIHsKKyAgVFJBQ0tfTUVNT1JZX1NDT1BFKCJTdG9yYWdlIik7CisgIGlmICghSXNWYWxpZEZvcm1hdChpbikpIHsKKyAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIGZvcm1hdCB3aXRoIHNpemU9IiA8PCBpbi5zaXplKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIFN0b3JhZ2Ugc3RvcmFnZV9kYXRhOworICBpZiAoIXN0b3JhZ2VfZGF0YS5QYXJzZUZyb21BcnJheSgKKyAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihpbi5kYXRhKCkgKyBrU3RvcmFnZUhlYWRlclNpemUpLAorICAgICAgICAgIGluLnNpemUoKSAtIGtTdG9yYWdlSGVhZGVyU2l6ZSkpIHsKKyAgICBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gcGFyc2Ugc3RvcmFnZSB3aXRoIHNpemUiIDw8IGluLnNpemUoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgZm9yIChhdXRvJiBjb29raWUgOiBzdG9yYWdlX2RhdGEuY29va2llcygpKSB7CisgICAgY29va2llc19tYXBfW3N0ZDo6bWFrZV90dXBsZShjb29raWUuZG9tYWluKCksIGNvb2tpZS5wYXRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29raWUubmFtZSgpKV0gPSBjb29raWU7CisgIH0KKyAgZm9yIChjb25zdCBhdXRvJiBsb2NhbF9zdG9yYWdlcyA6IHN0b3JhZ2VfZGF0YS5sb2NhbF9zdG9yYWdlcygpKSB7CisgICAgZm9yIChjb25zdCBhdXRvJiBsb2NhbF9zdG9yYWdlX2VudHJ5IDoKKyAgICAgICAgIGxvY2FsX3N0b3JhZ2VzLmxvY2FsX3N0b3JhZ2VfZW50cmllcygpKSB7CisgICAgICBsb2NhbF9zdG9yYWdlX2J5X2lkX21hcF9bbG9jYWxfc3RvcmFnZXMuaWQoKV1bbG9jYWxfc3RvcmFnZV9lbnRyeS5rZXkoKV0gPQorICAgICAgICAgIGxvY2FsX3N0b3JhZ2VfZW50cnkudmFsdWUoKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTWVtb3J5U3RvcmU6OkltcGw6OlNlcmlhbGl6ZShzdGQ6OnZlY3Rvcjx1aW50OD4qIG91dCkgY29uc3QgeworICBUUkFDS19NRU1PUllfU0NPUEUoIlN0b3JhZ2UiKTsKKyAgU3RvcmFnZSBzdG9yYWdlX2RhdGE7CisgIGZvciAoY29uc3QgYXV0byYgY29va2llX3BhaXIgOiBjb29raWVzX21hcF8pIHsKKyAgICAqKHN0b3JhZ2VfZGF0YS5hZGRfY29va2llcygpKSA9IGNvb2tpZV9wYWlyLnNlY29uZDsKKyAgfQorICBmb3IgKGNvbnN0IGF1dG8mIGlkX3N0b3JhZ2VfcGFpciA6IGxvY2FsX3N0b3JhZ2VfYnlfaWRfbWFwXykgeworICAgIExvY2FsU3RvcmFnZSogbG9jYWxfc3RvcmFnZSA9IHN0b3JhZ2VfZGF0YS5hZGRfbG9jYWxfc3RvcmFnZXMoKTsKKyAgICBsb2NhbF9zdG9yYWdlLT5zZXRfaWQoaWRfc3RvcmFnZV9wYWlyLmZpcnN0KTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGtleV92YWx1ZV9wYWlyIDogaWRfc3RvcmFnZV9wYWlyLnNlY29uZCkgeworICAgICAgTG9jYWxTdG9yYWdlRW50cnkqIGxvY2FsX3N0b3JhZ2VfZW50cnkgPQorICAgICAgICAgIGxvY2FsX3N0b3JhZ2UtPmFkZF9sb2NhbF9zdG9yYWdlX2VudHJpZXMoKTsKKyAgICAgIGxvY2FsX3N0b3JhZ2VfZW50cnktPnNldF9rZXkoa2V5X3ZhbHVlX3BhaXIuZmlyc3QpOworICAgICAgbG9jYWxfc3RvcmFnZV9lbnRyeS0+c2V0X3ZhbHVlKGtleV92YWx1ZV9wYWlyLnNlY29uZCk7CisgICAgfQorICB9CisgIHNpemVfdCBzaXplID0gc3RvcmFnZV9kYXRhLkJ5dGVTaXplKCk7CisgIG91dC0+cmVzaXplKGtTdG9yYWdlSGVhZGVyU2l6ZSArIHNpemUpOworICBjaGFyKiBidWZmZXJfcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4ob3V0LT5kYXRhKCkpOworICBtZW1jcHkoYnVmZmVyX3B0ciwga1N0b3JhZ2VIZWFkZXIsIGtTdG9yYWdlSGVhZGVyU2l6ZSk7CisgIGlmIChzaXplID4gMCAmJgorICAgICAgIXN0b3JhZ2VfZGF0YS5TZXJpYWxpemVUb0FycmF5KGJ1ZmZlcl9wdHIgKyBrU3RvcmFnZUhlYWRlclNpemUsIHNpemUpKSB7CisgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHNlcmlhbGl6ZSBtZXNzYWdlIHdpdGggc2l6ZT0iIDw8IHNpemU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgTWVtb3J5U3RvcmU6OkltcGw6OkdldEFsbENvb2tpZXMoCisgICAgc3RkOjp2ZWN0b3I8bmV0OjpDYW5vbmljYWxDb29raWUqPiogY29va2llcykgY29uc3QgeworICBUUkFDS19NRU1PUllfU0NPUEUoIlN0b3JhZ2UiKTsKKyAgZm9yIChjb25zdCBhdXRvJiBjb29raWVfcGFpciA6IGNvb2tpZXNfbWFwXykgeworICAgIC8vIFdlIGNyZWF0ZSBhIENhbm9uaWNhbENvb2tpZSBkaXJlY3RseSB0aHJvdWdoIGl0cyBjb25zdHJ1Y3RvciBpbnN0ZWFkIG9mCisgICAgLy8gdGhyb3VnaCBDYW5vbmljYWxDb29raWU6OkNyZWF0ZSgpIGFuZCBpdHMgc2FuaXRpemF0aW9uIGJlY2F1c2UgdGhlc2UKKyAgICAvLyB2YWx1ZXMgYXJlIGp1c3Qgc2VyaWFsaXplZCBmcm9tIGEgZm9ybWVyIGluc3RhbmNlIG9mIGEgQ2Fub25pY2FsQ29va2llCisgICAgLy8gb2JqZWN0IHRoYXQgKndhcyogY3JlYXRlZCB0aHJvdWdoIENhbm9uaWNhbENvb2tpZTo6Q3JlYXRlKCkuCisgICAgc2NvcGVkX3B0cjxuZXQ6OkNhbm9uaWNhbENvb2tpZT4gY29va2llKG5ldyBuZXQ6OkNhbm9uaWNhbENvb2tpZSgKKyAgICAgICAgR1VSTCgiIiksIGNvb2tpZV9wYWlyLnNlY29uZC5uYW1lKCksIGNvb2tpZV9wYWlyLnNlY29uZC52YWx1ZSgpLAorICAgICAgICBjb29raWVfcGFpci5zZWNvbmQuZG9tYWluKCksIGNvb2tpZV9wYWlyLnNlY29uZC5wYXRoKCksCisgICAgICAgICIiIC8qIG1hY19rZXkgKi8sICIiIC8qIG1hY19hbGdvcml0aG0gKi8sCisgICAgICAgIGJhc2U6OlRpbWU6OkZyb21JbnRlcm5hbFZhbHVlKGNvb2tpZV9wYWlyLnNlY29uZC5jcmVhdGlvbl90aW1lX3VzKCkpLAorICAgICAgICBiYXNlOjpUaW1lOjpGcm9tSW50ZXJuYWxWYWx1ZShjb29raWVfcGFpci5zZWNvbmQuZXhwaXJhdGlvbl90aW1lX3VzKCkpLAorICAgICAgICBiYXNlOjpUaW1lOjpGcm9tSW50ZXJuYWxWYWx1ZShjb29raWVfcGFpci5zZWNvbmQubGFzdF9hY2Nlc3NfdGltZV91cygpKSwKKyAgICAgICAgY29va2llX3BhaXIuc2Vjb25kLnNlY3VyZSgpLCBjb29raWVfcGFpci5zZWNvbmQuaHR0cF9vbmx5KCkpKTsKKyAgICBjb29raWVzLT5wdXNoX2JhY2soY29va2llLnJlbGVhc2UoKSk7CisgIH0KK30KKwordm9pZCBNZW1vcnlTdG9yZTo6SW1wbDo6QWRkQ29va2llKGNvbnN0IG5ldDo6Q2Fub25pY2FsQ29va2llJiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NCBleHBpcmF0aW9uX3RpbWVfdXMpIHsKKyAgVFJBQ0tfTUVNT1JZX1NDT1BFKCJTdG9yYWdlIik7CisgIENvb2tpZSBjb29raWU7CisgIGNvb2tpZS5zZXRfZG9tYWluKGNjLkRvbWFpbigpKTsKKyAgY29va2llLnNldF9wYXRoKGNjLlBhdGgoKSk7CisgIGNvb2tpZS5zZXRfbmFtZShjYy5OYW1lKCkpOworICBjb29raWUuc2V0X3ZhbHVlKGNjLlZhbHVlKCkpOworICBjb29raWUuc2V0X3NlY3VyZShjYy5Jc1NlY3VyZSgpKTsKKyAgY29va2llLnNldF9odHRwX29ubHkoY2MuSXNIdHRwT25seSgpKTsKKworICBjb29raWUuc2V0X2NyZWF0aW9uX3RpbWVfdXMoY2MuQ3JlYXRpb25EYXRlKCkuVG9JbnRlcm5hbFZhbHVlKCkpOworICBjb29raWUuc2V0X2V4cGlyYXRpb25fdGltZV91cyhleHBpcmF0aW9uX3RpbWVfdXMpOworICBjb29raWUuc2V0X2xhc3RfYWNjZXNzX3RpbWVfdXMoY2MuTGFzdEFjY2Vzc0RhdGUoKS5Ub0ludGVybmFsVmFsdWUoKSk7CisKKyAgQ29va2llS2V5IGtleSA9IHN0ZDo6bWFrZV90dXBsZShjYy5Eb21haW4oKSwgY2MuUGF0aCgpLCBjYy5OYW1lKCkpOworICBjb29raWVzX21hcF9ba2V5XSA9IGNvb2tpZTsKK30KKwordm9pZCBNZW1vcnlTdG9yZTo6SW1wbDo6VXBkYXRlQ29va2llQWNjZXNzVGltZShjb25zdCBuZXQ6OkNhbm9uaWNhbENvb2tpZSYgY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0IHRpbWVfdXMpIHsKKyAgQ29va2llS2V5IGtleSA9IHN0ZDo6bWFrZV90dXBsZShjYy5Eb21haW4oKSwgY2MuUGF0aCgpLCBjYy5OYW1lKCkpOworICBjb29raWVzX21hcF9ba2V5XS5zZXRfbGFzdF9hY2Nlc3NfdGltZV91cyh0aW1lX3VzKTsKK30KKwordm9pZCBNZW1vcnlTdG9yZTo6SW1wbDo6RGVsZXRlQ29va2llKGNvbnN0IG5ldDo6Q2Fub25pY2FsQ29va2llJiBjYykgeworICBDb29raWVLZXkga2V5ID0gc3RkOjptYWtlX3R1cGxlKGNjLkRvbWFpbigpLCBjYy5QYXRoKCksIGNjLk5hbWUoKSk7CisgIGNvb2tpZXNfbWFwXy5lcmFzZShrZXkpOworfQorCit2b2lkIE1lbW9yeVN0b3JlOjpJbXBsOjpSZWFkQWxsTG9jYWxTdG9yYWdlKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCwgTG9jYWxTdG9yYWdlTWFwKiBsb2NhbF9zdG9yYWdlX21hcCkgY29uc3QgeworICBUUkFDS19NRU1PUllfU0NPUEUoIlN0b3JhZ2UiKTsKKyAgY29uc3QgYXV0byYgaXQgPSBsb2NhbF9zdG9yYWdlX2J5X2lkX21hcF8uZmluZChpZCk7CisKKyAgaWYgKGl0ICE9IGxvY2FsX3N0b3JhZ2VfYnlfaWRfbWFwXy5lbmQoKSkgeworICAgIGxvY2FsX3N0b3JhZ2VfbWFwLT5pbnNlcnQoaXQtPnNlY29uZC5iZWdpbigpLCBpdC0+c2Vjb25kLmVuZCgpKTsKKyAgfQorfQorCit2b2lkIE1lbW9yeVN0b3JlOjpJbXBsOjpXcml0ZVRvTG9jYWxTdG9yYWdlKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIFRSQUNLX01FTU9SWV9TQ09QRSgiU3RvcmFnZSIpOworICBsb2NhbF9zdG9yYWdlX2J5X2lkX21hcF9baWRdW2tleV0gPSB2YWx1ZTsKK30KKwordm9pZCBNZW1vcnlTdG9yZTo6SW1wbDo6RGVsZXRlRnJvbUxvY2FsU3RvcmFnZShjb25zdCBzdGQ6OnN0cmluZyYgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXkpIHsKKyAgVFJBQ0tfTUVNT1JZX1NDT1BFKCJTdG9yYWdlIik7CisgIGxvY2FsX3N0b3JhZ2VfYnlfaWRfbWFwX1tpZF0uZXJhc2Uoa2V5KTsKK30KKwordm9pZCBNZW1vcnlTdG9yZTo6SW1wbDo6Q2xlYXJMb2NhbFN0b3JhZ2UoY29uc3Qgc3RkOjpzdHJpbmcmIGlkKSB7CisgIFRSQUNLX01FTU9SWV9TQ09QRSgiU3RvcmFnZSIpOworICBsb2NhbF9zdG9yYWdlX2J5X2lkX21hcF9baWRdLmNsZWFyKCk7Cit9CisKK01lbW9yeVN0b3JlOjpNZW1vcnlTdG9yZSgpIHsgaW1wbF8ucmVzZXQobmV3IEltcGwoKSk7IH0KKworYm9vbCBNZW1vcnlTdG9yZTo6SW5pdGlhbGl6ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OD4mIGluKSB7CisgIHJldHVybiBpbXBsXy0+SW5pdGlhbGl6ZShpbik7Cit9CisKK2Jvb2wgTWVtb3J5U3RvcmU6OlNlcmlhbGl6ZShzdGQ6OnZlY3Rvcjx1aW50OD4qIG91dCkgY29uc3QgeworICByZXR1cm4gaW1wbF8tPlNlcmlhbGl6ZShvdXQpOworfQorCit2b2lkIE1lbW9yeVN0b3JlOjpHZXRBbGxDb29raWVzKAorICAgIHN0ZDo6dmVjdG9yPG5ldDo6Q2Fub25pY2FsQ29va2llKj4qIGNvb2tpZXMpIGNvbnN0IHsKKyAgaW1wbF8tPkdldEFsbENvb2tpZXMoY29va2llcyk7Cit9CisKK3ZvaWQgTWVtb3J5U3RvcmU6OkFkZENvb2tpZShjb25zdCBuZXQ6OkNhbm9uaWNhbENvb2tpZSYgY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjQgZXhwaXJhdGlvbl90aW1lX3VzKSB7CisgIGltcGxfLT5BZGRDb29raWUoY2MsIGV4cGlyYXRpb25fdGltZV91cyk7Cit9CisKK3ZvaWQgTWVtb3J5U3RvcmU6OlVwZGF0ZUNvb2tpZUFjY2Vzc1RpbWUoY29uc3QgbmV0OjpDYW5vbmljYWxDb29raWUmIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NCB0aW1lX3VzKSB7CisgIGltcGxfLT5VcGRhdGVDb29raWVBY2Nlc3NUaW1lKGNjLCB0aW1lX3VzKTsKK30KKwordm9pZCBNZW1vcnlTdG9yZTo6RGVsZXRlQ29va2llKGNvbnN0IG5ldDo6Q2Fub25pY2FsQ29va2llJiBjYykgeworICBpbXBsXy0+RGVsZXRlQ29va2llKGNjKTsKK30KKwordm9pZCBNZW1vcnlTdG9yZTo6UmVhZEFsbExvY2FsU3RvcmFnZSgKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgaWQsIExvY2FsU3RvcmFnZU1hcCogbG9jYWxfc3RvcmFnZV9tYXApIGNvbnN0IHsKKyAgaW1wbF8tPlJlYWRBbGxMb2NhbFN0b3JhZ2UoaWQsIGxvY2FsX3N0b3JhZ2VfbWFwKTsKK30KKwordm9pZCBNZW1vcnlTdG9yZTo6V3JpdGVUb0xvY2FsU3RvcmFnZShjb25zdCBzdGQ6OnN0cmluZyYgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBpbXBsXy0+V3JpdGVUb0xvY2FsU3RvcmFnZShpZCwga2V5LCB2YWx1ZSk7Cit9CisKK3ZvaWQgTWVtb3J5U3RvcmU6OkRlbGV0ZUZyb21Mb2NhbFN0b3JhZ2UoY29uc3Qgc3RkOjpzdHJpbmcmIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5KSB7CisgIGltcGxfLT5EZWxldGVGcm9tTG9jYWxTdG9yYWdlKGlkLCBrZXkpOworfQorCit2b2lkIE1lbW9yeVN0b3JlOjpDbGVhckxvY2FsU3RvcmFnZShjb25zdCBzdGQ6OnN0cmluZyYgaWQpIHsKKyAgaW1wbF8tPkNsZWFyTG9jYWxTdG9yYWdlKGlkKTsKK30KKworTWVtb3J5U3RvcmU6On5NZW1vcnlTdG9yZSgpIHt9Cit9ICAvLyBuYW1lc3BhY2Ugc3RvcmFnZQorfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zdG9yYWdlL3N0b3JlL21lbW9yeV9zdG9yZS5oIGIvc3JjL2NvYmFsdC9zdG9yYWdlL3N0b3JlL21lbW9yeV9zdG9yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZjNjY2MKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L3N0b3JhZ2Uvc3RvcmUvbWVtb3J5X3N0b3JlLmgKQEAgLTAsMCArMSw2OSBAQAorLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBDT0JBTFRfU1RPUkFHRV9TVE9SRV9NRU1PUllfU1RPUkVfSF8KKyNkZWZpbmUgQ09CQUxUX1NUT1JBR0VfU1RPUkVfTUVNT1JZX1NUT1JFX0hfCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgorI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKKyNpbmNsdWRlICJuZXQvY29va2llcy9jYW5vbmljYWxfY29va2llLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIHN0b3JhZ2UgeworCisvLyBBIHN0b3JlIGZvciBjb29raWVzIGFuZCBsb2NhbCBzdG9yYWdlIGltcGxlbWVudGVkIGluIG1lbW9yeS4KK2NsYXNzIE1lbW9yeVN0b3JlIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgYmFzZTo6aGFzaF9tYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBMb2NhbFN0b3JhZ2VNYXA7CisgIHR5cGVkZWYgY29uc3Qgc3RkOjp2ZWN0b3I8bmV0OjpDYW5vbmljYWxDb29raWUqPiBDb29raWVzOworCisgIE1lbW9yeVN0b3JlKCk7CisgIGJvb2wgSW5pdGlhbGl6ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OD4mIGluKTsKKworICAvLyBTZXJpYWxpemF0aW9uCisgIGJvb2wgU2VyaWFsaXplKHN0ZDo6dmVjdG9yPHVpbnQ4Piogb3V0KSBjb25zdDsKKworICAvLyBDb29raWVzCisgIHZvaWQgR2V0QWxsQ29va2llcyhzdGQ6OnZlY3RvcjxuZXQ6OkNhbm9uaWNhbENvb2tpZSo+KiBjb29raWVzKSBjb25zdDsKKyAgdm9pZCBBZGRDb29raWUoY29uc3QgbmV0OjpDYW5vbmljYWxDb29raWUmIGNjLCBpbnQ2NCBleHBpcmF0aW9uX3RpbWVfdXMpOworICB2b2lkIFVwZGF0ZUNvb2tpZUFjY2Vzc1RpbWUoY29uc3QgbmV0OjpDYW5vbmljYWxDb29raWUmIGNjLCBpbnQ2NCB0aW1lX3VzKTsKKyAgdm9pZCBEZWxldGVDb29raWUoY29uc3QgbmV0OjpDYW5vbmljYWxDb29raWUmIGNjKTsKKworICAvLyBMb2NhbCBTdG9yYWdlCisgIHZvaWQgUmVhZEFsbExvY2FsU3RvcmFnZShjb25zdCBzdGQ6OnN0cmluZyYgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbFN0b3JhZ2VNYXAqIGxvY2FsX3N0b3JhZ2VfbWFwKSBjb25zdDsKKworICB2b2lkIFdyaXRlVG9Mb2NhbFN0b3JhZ2UoY29uc3Qgc3RkOjpzdHJpbmcmIGlkLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgdm9pZCBEZWxldGVGcm9tTG9jYWxTdG9yYWdlKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSk7CisgIHZvaWQgQ2xlYXJMb2NhbFN0b3JhZ2UoY29uc3Qgc3RkOjpzdHJpbmcmIGlkKTsKKworICAvLyBEaXNhYmxlIGNvcHlpbmcKKyAgTWVtb3J5U3RvcmUoY29uc3QgTWVtb3J5U3RvcmUmIHN0b3JlKSA9IGRlbGV0ZTsKKyAgTWVtb3J5U3RvcmUmIG9wZXJhdG9yPShjb25zdCBNZW1vcnlTdG9yZSYgc3RvcmUpID0gZGVsZXRlOworCisgIH5NZW1vcnlTdG9yZSgpOworCisgcHJpdmF0ZToKKyAgY2xhc3MgSW1wbDsKKyAgc2NvcGVkX3B0cjxJbXBsPiBpbXBsXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBzdG9yYWdlCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gQ09CQUxUX1NUT1JBR0VfU1RPUkVfTUVNT1JZX1NUT1JFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3N0b3JhZ2Uvc3RvcmUvbWVtb3J5X3N0b3JlX3Rlc3QuY2MgYi9zcmMvY29iYWx0L3N0b3JhZ2Uvc3RvcmUvbWVtb3J5X3N0b3JlX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI3ZjhjYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvc3RvcmFnZS9zdG9yZS9tZW1vcnlfc3RvcmVfdGVzdC5jYwpAQCAtMCwwICsxLDIyMSBAQAorLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImNvYmFsdC9zdG9yYWdlL3N0b3JlL21lbW9yeV9zdG9yZS5oIgorCisjaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zdG9yYWdlL3N0b3JhZ2VfY29uc3RhbnRzLmgiCisjaW5jbHVkZSAiY29iYWx0L3N0b3JhZ2Uvc3RvcmUvc3RvcmFnZS5wYi5oIgorI2luY2x1ZGUgImdvb2dsZXVybC9zcmMvZ3VybC5oIgorI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBzdG9yYWdlIHsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgTWVtb3J5U3RvcmVUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICBNZW1vcnlTdG9yZVRlc3QoKSA6IGlkMV8oImFfc2l0ZV9pZDEiKSwgaWQyXygiYV9zaXRlX2lkMiIpIHsKKyAgICBiYXNlOjpUaW1lIGN1cnJlbnRfdGltZSA9IGJhc2U6OlRpbWU6OkZyb21JbnRlcm5hbFZhbHVlKDEyMzQ1KTsKKyAgICBleHBpcmF0aW9uX3RpbWVfID0gY3VycmVudF90aW1lICsgYmFzZTo6VGltZURlbHRhOjpGcm9tRGF5cygxKTsKKworICAgIENvb2tpZSogY29va2llID0gc3RvcmFnZV9wcm90b18uYWRkX2Nvb2tpZXMoKTsKKyAgICBjb29raWUtPnNldF9uYW1lKCJuYW1lIik7CisgICAgY29va2llLT5zZXRfdmFsdWUoInZhbHVlIik7CisgICAgY29va2llLT5zZXRfZG9tYWluKCJkb21haW4iKTsKKyAgICBjb29raWUtPnNldF9wYXRoKCIvcGF0aC9mb28iKTsKKyAgICBjb29raWUtPnNldF9jcmVhdGlvbl90aW1lX3VzKGN1cnJlbnRfdGltZS5Ub0ludGVybmFsVmFsdWUoKSk7CisgICAgY29va2llLT5zZXRfZXhwaXJhdGlvbl90aW1lX3VzKGV4cGlyYXRpb25fdGltZV8uVG9JbnRlcm5hbFZhbHVlKCkpOworICAgIGNvb2tpZS0+c2V0X2xhc3RfYWNjZXNzX3RpbWVfdXMoY3VycmVudF90aW1lLlRvSW50ZXJuYWxWYWx1ZSgpKTsKKyAgICBjb29raWUtPnNldF9zZWN1cmUodHJ1ZSk7CisgICAgY29va2llLT5zZXRfaHR0cF9vbmx5KHRydWUpOworCisgICAgc2l6ZV90IHNpemUgPSBzdG9yYWdlX3Byb3RvXy5CeXRlU2l6ZSgpOworICAgIHN0b3JhZ2VfZGF0YV8ucmVzaXplKHNpemUgKyBrU3RvcmFnZUhlYWRlclNpemUpOworICAgIG1lbWNweShyZWludGVycHJldF9jYXN0PGNoYXIqPigmc3RvcmFnZV9kYXRhX1swXSksIGtTdG9yYWdlSGVhZGVyLAorICAgICAgICAgICBrU3RvcmFnZUhlYWRlclNpemUpOworICAgIHN0b3JhZ2VfcHJvdG9fLlNlcmlhbGl6ZVRvQXJyYXkoCisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZzdG9yYWdlX2RhdGFfW2tTdG9yYWdlSGVhZGVyU2l6ZV0pLCBzaXplKTsKKworICAgIG1lbW9yeV9zdG9yZV8uSW5pdGlhbGl6ZShzdG9yYWdlX2RhdGFfKTsKKworICAgIGNvb2tpZV8ucmVzZXQobmV3IG5ldDo6Q2Fub25pY2FsQ29va2llKAorICAgICAgICBHVVJMKCIiKSwgIm5hbWUiLCAidmFsdWUiLCAiZG9tYWluIiwgIi9wYXRoL2ZvbyIsICIiIC8qIG1hY19rZXkgKi8sCisgICAgICAgICIiIC8qIG1hY19hbGdvcml0aG0gKi8sIGN1cnJlbnRfdGltZSwgZXhwaXJhdGlvbl90aW1lXywgY3VycmVudF90aW1lLAorICAgICAgICB0cnVlIC8qIHNlY3VyZSAqLywgdHJ1ZSAvKiBodHRwX29ubHkgKi8pKTsKKworICAgIGxhc3RfYWNjZXNzX3RpbWVfID0gY3VycmVudF90aW1lICsgYmFzZTo6VGltZURlbHRhOjpGcm9tRGF5cyg1MCk7CisKKyAgICB1cGRhdGVkX2Nvb2tpZV8ucmVzZXQobmV3IG5ldDo6Q2Fub25pY2FsQ29va2llKAorICAgICAgICBHVVJMKCIiKSwgIm5hbWUiLCAidmFsdWUiLCAiZG9tYWluIiwgIi9wYXRoL2ZvbyIsICIiIC8qIG1hY19rZXkgKi8sCisgICAgICAgICIiIC8qIG1hY19hbGdvcml0aG0gKi8sIGN1cnJlbnRfdGltZSwgZXhwaXJhdGlvbl90aW1lXywgY3VycmVudF90aW1lLAorICAgICAgICB0cnVlIC8qIHNlY3VyZSAqLywgdHJ1ZSAvKiBodHRwX29ubHkgKi8pKTsKKworICAgIG5ld19jb29raWVfLnJlc2V0KG5ldyBuZXQ6OkNhbm9uaWNhbENvb2tpZSgKKyAgICAgICAgR1VSTCgiIiksICJuYW1lMSIsICJ2YWx1ZTIiLCAiZG9tYWluMiIsICIvcGF0aC9mb28yIiwgIiIgLyogbWFjX2tleSAqLywKKyAgICAgICAgIiIgLyogbWFjX2FsZ29yaXRobSAqLywgY3VycmVudF90aW1lLCBleHBpcmF0aW9uX3RpbWVfLCBjdXJyZW50X3RpbWUsCisgICAgICAgIGZhbHNlIC8qIHNlY3VyZSAqLywgZmFsc2UgLyogaHR0cF9vbmx5ICovKSk7CisgIH0KKyAgfk1lbW9yeVN0b3JlVGVzdCgpIHt9CisKKyAgc3RkOjpzdHJpbmcgaWQxXzsKKyAgc3RkOjpzdHJpbmcgaWQyXzsKKyAgU3RvcmFnZSBzdG9yYWdlX3Byb3RvXzsKKyAgc3RkOjp2ZWN0b3I8dWludDg+IHN0b3JhZ2VfZGF0YV87CisgIHNjb3BlZF9wdHI8bmV0OjpDYW5vbmljYWxDb29raWU+IGNvb2tpZV87CisgIHNjb3BlZF9wdHI8bmV0OjpDYW5vbmljYWxDb29raWU+IHVwZGF0ZWRfY29va2llXzsKKyAgc2NvcGVkX3B0cjxuZXQ6OkNhbm9uaWNhbENvb2tpZT4gbmV3X2Nvb2tpZV87CisgIGJhc2U6OlRpbWUgbGFzdF9hY2Nlc3NfdGltZV87CisgIGJhc2U6OlRpbWUgZXhwaXJhdGlvbl90aW1lXzsKKyAgTWVtb3J5U3RvcmUgbWVtb3J5X3N0b3JlXzsKK307CisKK1RFU1RfRihNZW1vcnlTdG9yZVRlc3QsIEluaXRpYWxpemUpIHsKKyAgRVhQRUNUX1RSVUUobWVtb3J5X3N0b3JlXy5Jbml0aWFsaXplKHN0b3JhZ2VfZGF0YV8pKTsKK30KKworVEVTVF9GKE1lbW9yeVN0b3JlVGVzdCwgU2VyaWFsaXplKSB7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4PiBvdXQ7CisgIG1lbW9yeV9zdG9yZV8uU2VyaWFsaXplKCZvdXQpOworICBFWFBFQ1RfRVEoc3RvcmFnZV9kYXRhXywgb3V0KTsKK30KKworVEVTVF9GKE1lbW9yeVN0b3JlVGVzdCwgR2V0QWxsQ29va2llcykgeworICBzdGQ6OnZlY3RvcjxuZXQ6OkNhbm9uaWNhbENvb2tpZSo+IGNvb2tpZXM7CisgIG1lbW9yeV9zdG9yZV8uR2V0QWxsQ29va2llcygmY29va2llcyk7CisKKyAgRVhQRUNUX0VRKGNvb2tpZXMuc2l6ZSgpLCAxKTsKKyAgRVhQRUNUX1RSVUUoY29va2llc1swXS0+SXNFcXVpdmFsZW50KCpjb29raWVfKSk7CisgIGZvciAoYXV0byogY29va2llIDogY29va2llcykgeworICAgIGRlbGV0ZSBjb29raWU7CisgIH0KK30KKworVEVTVF9GKE1lbW9yeVN0b3JlVGVzdCwgQWRkQ29va2llKSB7CisgIHN0ZDo6dmVjdG9yPG5ldDo6Q2Fub25pY2FsQ29va2llKj4gY29va2llczsKKyAgbWVtb3J5X3N0b3JlXy5HZXRBbGxDb29raWVzKCZjb29raWVzKTsKKworICBFWFBFQ1RfRVEoY29va2llcy5zaXplKCksIDEpOworICBFWFBFQ1RfVFJVRShjb29raWVzWzBdLT5Jc0VxdWl2YWxlbnQoKmNvb2tpZV8pKTsKKyAgZm9yIChhdXRvKiBjb29raWUgOiBjb29raWVzKSB7CisgICAgZGVsZXRlIGNvb2tpZTsKKyAgfQorICBjb29raWVzLmNsZWFyKCk7CisKKyAgbWVtb3J5X3N0b3JlXy5BZGRDb29raWUoKm5ld19jb29raWVfLCBleHBpcmF0aW9uX3RpbWVfLlRvSW50ZXJuYWxWYWx1ZSgpKTsKKworICBtZW1vcnlfc3RvcmVfLkdldEFsbENvb2tpZXMoJmNvb2tpZXMpOworICBFWFBFQ1RfRVEoY29va2llcy5zaXplKCksIDIpOworICBFWFBFQ1RfVFJVRShjb29raWVzWzBdLT5Jc0VxdWl2YWxlbnQoKmNvb2tpZV8pKTsKKyAgRVhQRUNUX1RSVUUoY29va2llc1sxXS0+SXNFcXVpdmFsZW50KCpuZXdfY29va2llXykpOworICBmb3IgKGF1dG8qIGNvb2tpZSA6IGNvb2tpZXMpIHsKKyAgICBkZWxldGUgY29va2llOworICB9CisgIGNvb2tpZXMuY2xlYXIoKTsKK30KKworVEVTVF9GKE1lbW9yeVN0b3JlVGVzdCwgVXBkYXRlQ29va2llQWNjZXNzVGltZSkgeworICBtZW1vcnlfc3RvcmVfLlVwZGF0ZUNvb2tpZUFjY2Vzc1RpbWUoKmNvb2tpZV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X2FjY2Vzc190aW1lXy5Ub0ludGVybmFsVmFsdWUoKSk7CisgIHN0ZDo6dmVjdG9yPG5ldDo6Q2Fub25pY2FsQ29va2llKj4gY29va2llczsKKyAgbWVtb3J5X3N0b3JlXy5HZXRBbGxDb29raWVzKCZjb29raWVzKTsKKworICBFWFBFQ1RfRVEoY29va2llcy5zaXplKCksIDEpOworCisgIEVYUEVDVF9UUlVFKGNvb2tpZXNbMF0tPklzRXF1aXZhbGVudCgqdXBkYXRlZF9jb29raWVfKSk7CisgIGZvciAoYXV0byogY29va2llIDogY29va2llcykgeworICAgIGRlbGV0ZSBjb29raWU7CisgIH0KK30KKworVEVTVF9GKE1lbW9yeVN0b3JlVGVzdCwgRGVsZXRlQ29va2llKSB7CisgIHN0ZDo6dmVjdG9yPG5ldDo6Q2Fub25pY2FsQ29va2llKj4gY29va2llczsKKyAgbWVtb3J5X3N0b3JlXy5HZXRBbGxDb29raWVzKCZjb29raWVzKTsKKyAgRVhQRUNUX0VRKGNvb2tpZXMuc2l6ZSgpLCAxKTsKKyAgZm9yIChhdXRvKiBjb29raWUgOiBjb29raWVzKSB7CisgICAgZGVsZXRlIGNvb2tpZTsKKyAgfQorICBjb29raWVzLmNsZWFyKCk7CisKKyAgbWVtb3J5X3N0b3JlXy5EZWxldGVDb29raWUoKmNvb2tpZV8pOworICBtZW1vcnlfc3RvcmVfLkdldEFsbENvb2tpZXMoJmNvb2tpZXMpOworCisgIEVYUEVDVF9UUlVFKGNvb2tpZXMuZW1wdHkoKSk7Cit9CisKK1RFU1RfRihNZW1vcnlTdG9yZVRlc3QsIFJlYWRXcml0ZVRvTG9jYWxTdG9yYWdlKSB7CisgIE1lbW9yeVN0b3JlOjpMb2NhbFN0b3JhZ2VNYXAgdGVzdF92YWxzOworICB0ZXN0X3ZhbHNbImtleTAiXSA9ICJ2YWx1ZTAiOworICB0ZXN0X3ZhbHNbImtleTEiXSA9ICJ2YWx1ZTEiOworCisgIGZvciAoY29uc3QgYXV0byYgaXQgOiB0ZXN0X3ZhbHMpIHsKKyAgICBtZW1vcnlfc3RvcmVfLldyaXRlVG9Mb2NhbFN0b3JhZ2UoaWQxXywgaXQuZmlyc3QsIGl0LnNlY29uZCk7CisgIH0KKworICBtZW1vcnlfc3RvcmVfLldyaXRlVG9Mb2NhbFN0b3JhZ2UoaWQyXywgImtleTAiLCAidmFsdWUwIik7CisgIE1lbW9yeVN0b3JlOjpMb2NhbFN0b3JhZ2VNYXAgcmVhZF92YWxzOworICBtZW1vcnlfc3RvcmVfLlJlYWRBbGxMb2NhbFN0b3JhZ2UoaWQxXywgJnJlYWRfdmFscyk7CisgIEVYUEVDVF9FUSh0ZXN0X3ZhbHMsIHJlYWRfdmFscyk7Cit9CisKK1RFU1RfRihNZW1vcnlTdG9yZVRlc3QsIERlbGV0ZUZyb21Mb2NhbFN0b3JhZ2UpIHsKKyAgTWVtb3J5U3RvcmU6OkxvY2FsU3RvcmFnZU1hcCB0ZXN0X3ZhbHM7CisgIHRlc3RfdmFsc1sia2V5MCJdID0gInZhbHVlMCI7CisgIHRlc3RfdmFsc1sia2V5MSJdID0gInZhbHVlMSI7CisKKyAgZm9yIChjb25zdCBhdXRvJiBpdCA6IHRlc3RfdmFscykgeworICAgIG1lbW9yeV9zdG9yZV8uV3JpdGVUb0xvY2FsU3RvcmFnZShpZDFfLCBpdC5maXJzdCwgaXQuc2Vjb25kKTsKKyAgfQorCisgIG1lbW9yeV9zdG9yZV8uRGVsZXRlRnJvbUxvY2FsU3RvcmFnZShpZDFfLCAia2V5MCIpOworICB0ZXN0X3ZhbHMuZXJhc2UoImtleTAiKTsKKworICBNZW1vcnlTdG9yZTo6TG9jYWxTdG9yYWdlTWFwIHJlYWRfdmFsczsKKyAgbWVtb3J5X3N0b3JlXy5SZWFkQWxsTG9jYWxTdG9yYWdlKGlkMV8sICZyZWFkX3ZhbHMpOworCisgIEVYUEVDVF9FUSh0ZXN0X3ZhbHMsIHJlYWRfdmFscyk7Cit9CisKK1RFU1RfRihNZW1vcnlTdG9yZVRlc3QsIENsZWFyTG9jYWxTdG9yYWdlKSB7CisgIE1lbW9yeVN0b3JlOjpMb2NhbFN0b3JhZ2VNYXAgdGVzdF92YWxzOworICB0ZXN0X3ZhbHNbImtleTAiXSA9ICJ2YWx1ZTAiOworICB0ZXN0X3ZhbHNbImtleTEiXSA9ICJ2YWx1ZTEiOworCisgIGZvciAoY29uc3QgYXV0byYgaXQgOiB0ZXN0X3ZhbHMpIHsKKyAgICBtZW1vcnlfc3RvcmVfLldyaXRlVG9Mb2NhbFN0b3JhZ2UoaWQxXywgaXQuZmlyc3QsIGl0LnNlY29uZCk7CisgIH0KKworICBtZW1vcnlfc3RvcmVfLkNsZWFyTG9jYWxTdG9yYWdlKGlkMV8pOworCisgIE1lbW9yeVN0b3JlOjpMb2NhbFN0b3JhZ2VNYXAgcmVhZF92YWxzOworICBtZW1vcnlfc3RvcmVfLlJlYWRBbGxMb2NhbFN0b3JhZ2UoaWQxXywgJnJlYWRfdmFscyk7CisKKyAgRVhQRUNUX1RSVUUocmVhZF92YWxzLmVtcHR5KCkpOworfQorCitURVNUX0YoTWVtb3J5U3RvcmVUZXN0LCBFbXB0eVN0b3JhZ2UpIHsKKyAgTWVtb3J5U3RvcmUgZW1wdHlfc3RvcmU7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4PiBpbihrU3RvcmFnZUhlYWRlciwga1N0b3JhZ2VIZWFkZXIgKyBrU3RvcmFnZUhlYWRlclNpemUpOworICBlbXB0eV9zdG9yZS5Jbml0aWFsaXplKGluKTsKKworICBzdGQ6OnZlY3Rvcjx1aW50OD4gb3V0OworICBlbXB0eV9zdG9yZS5TZXJpYWxpemUoJm91dCk7CisgIEVYUEVDVF9FUShtZW1jbXAoa1N0b3JhZ2VIZWFkZXIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCZvdXRbMF0pLAorICAgICAgICAgICAgICAgICAgIGtTdG9yYWdlSGVhZGVyU2l6ZSksCisgICAgICAgICAgICAwKTsKK30KK30gIC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIHN0b3JhZ2UKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3RvcmFnZS9zdG9yZS9zdG9yYWdlLnBiLmNjIGIvc3JjL2NvYmFsdC9zdG9yYWdlL3N0b3JlL3N0b3JhZ2UucGIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk2MTcwYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvc3RvcmFnZS9zdG9yZS9zdG9yYWdlLnBiLmNjCkBAIC0wLDAgKzEsMTc2MyBAQAorLy8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKKy8vIHNvdXJjZTogc3RvcmFnZS5wcm90bworCisjZGVmaW5lIElOVEVSTkFMX1NVUFBSRVNTX1BST1RPQlVGX0ZJRUxEX0RFUFJFQ0FUSU9OCisjaW5jbHVkZSAic3RvcmFnZS5wYi5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9wb3J0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL29uY2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGVfaW5sLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbF9saXRlLmg+CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoaW5jbHVkZXMpCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIHN0b3JhZ2UgeworCit2b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9zdG9yYWdlXzJlcHJvdG8oKSB7CisgIGRlbGV0ZSBDb29raWU6OmRlZmF1bHRfaW5zdGFuY2VfOworICBkZWxldGUgTG9jYWxTdG9yYWdlRW50cnk6OmRlZmF1bHRfaW5zdGFuY2VfOworICBkZWxldGUgTG9jYWxTdG9yYWdlOjpkZWZhdWx0X2luc3RhbmNlXzsKKyAgZGVsZXRlIFN0b3JhZ2U6OmRlZmF1bHRfaW5zdGFuY2VfOworfQorCisjaWZkZWYgR09PR0xFX1BST1RPQlVGX05PX1NUQVRJQ19JTklUSUFMSVpFUgordm9pZCBwcm90b2J1Zl9BZGREZXNjX3N0b3JhZ2VfMmVwcm90b19pbXBsKCkgeworICBHT09HTEVfUFJPVE9CVUZfVkVSSUZZX1ZFUlNJT047CisKKyNlbHNlCit2b2lkIHByb3RvYnVmX0FkZERlc2Nfc3RvcmFnZV8yZXByb3RvKCkgeworICBzdGF0aWMgYm9vbCBhbHJlYWR5X2hlcmUgPSBmYWxzZTsKKyAgaWYgKGFscmVhZHlfaGVyZSkgcmV0dXJuOworICBhbHJlYWR5X2hlcmUgPSB0cnVlOworICBHT09HTEVfUFJPVE9CVUZfVkVSSUZZX1ZFUlNJT047CisKKyNlbmRpZgorICBDb29raWU6OmRlZmF1bHRfaW5zdGFuY2VfID0gbmV3IENvb2tpZSgpOworICBMb2NhbFN0b3JhZ2VFbnRyeTo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBuZXcgTG9jYWxTdG9yYWdlRW50cnkoKTsKKyAgTG9jYWxTdG9yYWdlOjpkZWZhdWx0X2luc3RhbmNlXyA9IG5ldyBMb2NhbFN0b3JhZ2UoKTsKKyAgU3RvcmFnZTo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBuZXcgU3RvcmFnZSgpOworICBDb29raWU6OmRlZmF1bHRfaW5zdGFuY2VfLT5Jbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKKyAgTG9jYWxTdG9yYWdlRW50cnk6OmRlZmF1bHRfaW5zdGFuY2VfLT5Jbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKKyAgTG9jYWxTdG9yYWdlOjpkZWZhdWx0X2luc3RhbmNlXy0+SW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CisgIFN0b3JhZ2U6OmRlZmF1bHRfaW5zdGFuY2VfLT5Jbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6T25TaHV0ZG93bigmcHJvdG9idWZfU2h1dGRvd25GaWxlX3N0b3JhZ2VfMmVwcm90byk7Cit9CisKKyNpZmRlZiBHT09HTEVfUFJPVE9CVUZfTk9fU1RBVElDX0lOSVRJQUxJWkVSCitHT09HTEVfUFJPVE9CVUZfREVDTEFSRV9PTkNFKHByb3RvYnVmX0FkZERlc2Nfc3RvcmFnZV8yZXByb3RvX29uY2VfKTsKK3ZvaWQgcHJvdG9idWZfQWRkRGVzY19zdG9yYWdlXzJlcHJvdG8oKSB7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6R29vZ2xlT25jZUluaXQoJnByb3RvYnVmX0FkZERlc2Nfc3RvcmFnZV8yZXByb3RvX29uY2VfLAorICAgICAgICAgICAgICAgICAmcHJvdG9idWZfQWRkRGVzY19zdG9yYWdlXzJlcHJvdG9faW1wbCk7Cit9CisjZWxzZQorLy8gRm9yY2UgQWRkRGVzY3JpcHRvcnMoKSB0byBiZSBjYWxsZWQgYXQgc3RhdGljIGluaXRpYWxpemF0aW9uIHRpbWUuCitzdHJ1Y3QgU3RhdGljRGVzY3JpcHRvckluaXRpYWxpemVyX3N0b3JhZ2VfMmVwcm90byB7CisgIFN0YXRpY0Rlc2NyaXB0b3JJbml0aWFsaXplcl9zdG9yYWdlXzJlcHJvdG8oKSB7CisgICAgcHJvdG9idWZfQWRkRGVzY19zdG9yYWdlXzJlcHJvdG8oKTsKKyAgfQorfSBzdGF0aWNfZGVzY3JpcHRvcl9pbml0aWFsaXplcl9zdG9yYWdlXzJlcHJvdG9fOworI2VuZGlmCisKK25hbWVzcGFjZSB7CisKK3N0YXRpYyB2b2lkIE1lcmdlRnJvbUZhaWwoaW50IGxpbmUpIEdPT0dMRV9BVFRSSUJVVEVfQ09MRDsKK0dPT0dMRV9BVFRSSUJVVEVfTk9JTkxJTkUgc3RhdGljIHZvaWQgTWVyZ2VGcm9tRmFpbChpbnQgbGluZSkgeworICBHT09HTEVfQ0hFQ0soZmFsc2UpIDw8IF9fRklMRV9fIDw8ICI6IiA8PCBsaW5lOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPj0gMTkwMAorY29uc3QgaW50IENvb2tpZTo6a05hbWVGaWVsZE51bWJlcjsKK2NvbnN0IGludCBDb29raWU6OmtWYWx1ZUZpZWxkTnVtYmVyOworY29uc3QgaW50IENvb2tpZTo6a0RvbWFpbkZpZWxkTnVtYmVyOworY29uc3QgaW50IENvb2tpZTo6a1BhdGhGaWVsZE51bWJlcjsKK2NvbnN0IGludCBDb29raWU6OmtDcmVhdGlvblRpbWVVc0ZpZWxkTnVtYmVyOworY29uc3QgaW50IENvb2tpZTo6a0V4cGlyYXRpb25UaW1lVXNGaWVsZE51bWJlcjsKK2NvbnN0IGludCBDb29raWU6OmtMYXN0QWNjZXNzVGltZVVzRmllbGROdW1iZXI7Citjb25zdCBpbnQgQ29va2llOjprU2VjdXJlRmllbGROdW1iZXI7Citjb25zdCBpbnQgQ29va2llOjprSHR0cE9ubHlGaWVsZE51bWJlcjsKKyNlbmRpZiAgLy8gIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKKworQ29va2llOjpDb29raWUoKQorICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUxpdGUoKSwgX2FyZW5hX3B0cl8oTlVMTCkgeworICBTaGFyZWRDdG9yKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb25zdHJ1Y3Rvcjpjb2JhbHQuc3RvcmFnZS5Db29raWUpCit9CisKK3ZvaWQgQ29va2llOjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7CisgIF9pc19kZWZhdWx0X2luc3RhbmNlXyA9IHRydWU7Cit9CisKK0Nvb2tpZTo6Q29va2llKGNvbnN0IENvb2tpZSYgZnJvbSkKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VMaXRlKCksCisgICAgX2FyZW5hX3B0cl8oTlVMTCkgeworICBTaGFyZWRDdG9yKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvcHlfY29uc3RydWN0b3I6Y29iYWx0LnN0b3JhZ2UuQ29va2llKQorfQorCit2b2lkIENvb2tpZTo6U2hhcmVkQ3RvcigpIHsKKyAgICBfaXNfZGVmYXVsdF9pbnN0YW5jZV8gPSBmYWxzZTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmcoKTsKKyAgX2NhY2hlZF9zaXplXyA9IDA7CisgIG5hbWVfLlVuc2FmZVNldERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKKyAgdmFsdWVfLlVuc2FmZVNldERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKKyAgZG9tYWluXy5VbnNhZmVTZXREZWZhdWx0KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CisgIHBhdGhfLlVuc2FmZVNldERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKKyAgY3JlYXRpb25fdGltZV91c18gPSBHT09HTEVfTE9OR0xPTkcoMCk7CisgIGV4cGlyYXRpb25fdGltZV91c18gPSBHT09HTEVfTE9OR0xPTkcoMCk7CisgIGxhc3RfYWNjZXNzX3RpbWVfdXNfID0gR09PR0xFX0xPTkdMT05HKDApOworICBzZWN1cmVfID0gZmFsc2U7CisgIGh0dHBfb25seV8gPSBmYWxzZTsKK30KKworQ29va2llOjp+Q29va2llKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZGVzdHJ1Y3Rvcjpjb2JhbHQuc3RvcmFnZS5Db29raWUpCisgIFNoYXJlZER0b3IoKTsKK30KKwordm9pZCBDb29raWU6OlNoYXJlZER0b3IoKSB7CisgIG5hbWVfLkRlc3Ryb3lOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CisgIHZhbHVlXy5EZXN0cm95Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworICBkb21haW5fLkRlc3Ryb3lOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CisgIHBhdGhfLkRlc3Ryb3lOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CisgICNpZmRlZiBHT09HTEVfUFJPVE9CVUZfTk9fU1RBVElDX0lOSVRJQUxJWkVSCisgIGlmICh0aGlzICE9ICZkZWZhdWx0X2luc3RhbmNlKCkpIHsKKyAgI2Vsc2UKKyAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKKyAgI2VuZGlmCisgIH0KK30KKwordm9pZCBDb29raWU6OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKKyAgX2NhY2hlZF9zaXplXyA9IHNpemU7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOworfQorY29uc3QgQ29va2llJiBDb29raWU6OmRlZmF1bHRfaW5zdGFuY2UoKSB7CisjaWZkZWYgR09PR0xFX1BST1RPQlVGX05PX1NUQVRJQ19JTklUSUFMSVpFUgorICBwcm90b2J1Zl9BZGREZXNjX3N0b3JhZ2VfMmVwcm90bygpOworI2Vsc2UKKyAgaWYgKGRlZmF1bHRfaW5zdGFuY2VfID09IE5VTEwpIHByb3RvYnVmX0FkZERlc2Nfc3RvcmFnZV8yZXByb3RvKCk7CisjZW5kaWYKKyAgcmV0dXJuICpkZWZhdWx0X2luc3RhbmNlXzsKK30KKworQ29va2llKiBDb29raWU6OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKKworQ29va2llKiBDb29raWU6Ok5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3QgeworICBDb29raWUqIG4gPSBuZXcgQ29va2llOworICBpZiAoYXJlbmEgIT0gTlVMTCkgeworICAgIGFyZW5hLT5Pd24obik7CisgIH0KKyAgcmV0dXJuIG47Cit9CisKK3ZvaWQgQ29va2llOjpDbGVhcigpIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2NsZWFyX3N0YXJ0OmNvYmFsdC5zdG9yYWdlLkNvb2tpZSkKKyNpZiBkZWZpbmVkKF9fY2xhbmdfXykKKyNkZWZpbmUgWlJfSEVMUEVSXyhmKSBcCisgIF9QcmFnbWEoImNsYW5nIGRpYWdub3N0aWMgcHVzaCIpIFwKKyAgX1ByYWdtYSgiY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkIFwiLVdpbnZhbGlkLW9mZnNldG9mXCIiKSBcCisgIF9fYnVpbHRpbl9vZmZzZXRvZihDb29raWUsIGYpIFwKKyAgX1ByYWdtYSgiY2xhbmcgZGlhZ25vc3RpYyBwb3AiKQorI2Vsc2UKKyNkZWZpbmUgWlJfSEVMUEVSXyhmKSByZWludGVycHJldF9jYXN0PGNoYXIqPihcCisgICZyZWludGVycHJldF9jYXN0PENvb2tpZSo+KDE2KS0+ZikKKyNlbmRpZgorCisjZGVmaW5lIFpSXyhmaXJzdCwgbGFzdCkgZG8ge1wKKyAgOjptZW1zZXQoJmZpcnN0LCAwLFwKKyAgICAgICAgICAgWlJfSEVMUEVSXyhsYXN0KSAtIFpSX0hFTFBFUl8oZmlyc3QpICsgc2l6ZW9mKGxhc3QpKTtcCit9IHdoaWxlICgwKQorCisgIFpSXyhjcmVhdGlvbl90aW1lX3VzXywgc2VjdXJlXyk7CisgIG5hbWVfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKKyAgdmFsdWVfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKKyAgZG9tYWluXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CisgIHBhdGhfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKKyAgaHR0cF9vbmx5XyA9IGZhbHNlOworCisjdW5kZWYgWlJfSEVMUEVSXworI3VuZGVmIFpSXworCit9CisKK2Jvb2wgQ29va2llOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKKyNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghR09PR0xFX1BSRURJQ1RfVFJVRShFWFBSRVNTSU9OKSkgZ290byBmYWlsdXJlCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHRhZzsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX3N0YXJ0OmNvYmFsdC5zdG9yYWdlLkNvb2tpZSkKKyAgZm9yICg7OykgeworICAgIDo6c3RkOjpwYWlyPCA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiwgYm9vbD4gcCA9IGlucHV0LT5SZWFkVGFnV2l0aEN1dG9mZigxMjcpOworICAgIHRhZyA9IHAuZmlyc3Q7CisgICAgaWYgKCFwLnNlY29uZCkgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7CisgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgICAgICBjYXNlIDE6IHsKKyAgICAgICAgaWYgKHRhZyA9PSAxMCkgeworICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKKyAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9uYW1lKCkpKTsKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlZlcmlmeVV0ZjhTdHJpbmcoCisgICAgICAgICAgICB0aGlzLT5uYW1lKCkuZGF0YSgpLCB0aGlzLT5uYW1lKCkubGVuZ3RoKCksCisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UEFSU0UsCisgICAgICAgICAgICAiY29iYWx0LnN0b3JhZ2UuQ29va2llLm5hbWUiKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxOCkpIGdvdG8gcGFyc2VfdmFsdWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgdmFsdWUgPSAyOworICAgICAgY2FzZSAyOiB7CisgICAgICAgIGlmICh0YWcgPT0gMTgpIHsKKyAgICAgICAgIHBhcnNlX3ZhbHVlOgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKKyAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV92YWx1ZSgpKSk7CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpWZXJpZnlVdGY4U3RyaW5nKAorICAgICAgICAgICAgdGhpcy0+dmFsdWUoKS5kYXRhKCksIHRoaXMtPnZhbHVlKCkubGVuZ3RoKCksCisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UEFSU0UsCisgICAgICAgICAgICAiY29iYWx0LnN0b3JhZ2UuQ29va2llLnZhbHVlIikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMjYpKSBnb3RvIHBhcnNlX2RvbWFpbjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyBkb21haW4gPSAzOworICAgICAgY2FzZSAzOiB7CisgICAgICAgIGlmICh0YWcgPT0gMjYpIHsKKyAgICAgICAgIHBhcnNlX2RvbWFpbjoKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCisgICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfZG9tYWluKCkpKTsKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlZlcmlmeVV0ZjhTdHJpbmcoCisgICAgICAgICAgICB0aGlzLT5kb21haW4oKS5kYXRhKCksIHRoaXMtPmRvbWFpbigpLmxlbmd0aCgpLAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlBBUlNFLAorICAgICAgICAgICAgImNvYmFsdC5zdG9yYWdlLkNvb2tpZS5kb21haW4iKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygzNCkpIGdvdG8gcGFyc2VfcGF0aDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyBwYXRoID0gNDsKKyAgICAgIGNhc2UgNDogeworICAgICAgICBpZiAodGFnID09IDM0KSB7CisgICAgICAgICBwYXJzZV9wYXRoOgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKKyAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9wYXRoKCkpKTsKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlZlcmlmeVV0ZjhTdHJpbmcoCisgICAgICAgICAgICB0aGlzLT5wYXRoKCkuZGF0YSgpLCB0aGlzLT5wYXRoKCkubGVuZ3RoKCksCisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UEFSU0UsCisgICAgICAgICAgICAiY29iYWx0LnN0b3JhZ2UuQ29va2llLnBhdGgiKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg0MCkpIGdvdG8gcGFyc2VfY3JlYXRpb25fdGltZV91czsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIG9wdGlvbmFsIGludDY0IGNyZWF0aW9uX3RpbWVfdXMgPSA1OworICAgICAgY2FzZSA1OiB7CisgICAgICAgIGlmICh0YWcgPT0gNDApIHsKKyAgICAgICAgIHBhcnNlX2NyZWF0aW9uX3RpbWVfdXM6CisgICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKKyAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDY0LCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9JTlQ2ND4oCisgICAgICAgICAgICAgICAgIGlucHV0LCAmY3JlYXRpb25fdGltZV91c18pKSk7CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDQ4KSkgZ290byBwYXJzZV9leHBpcmF0aW9uX3RpbWVfdXM7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyBvcHRpb25hbCBpbnQ2NCBleHBpcmF0aW9uX3RpbWVfdXMgPSA2OworICAgICAgY2FzZSA2OiB7CisgICAgICAgIGlmICh0YWcgPT0gNDgpIHsKKyAgICAgICAgIHBhcnNlX2V4cGlyYXRpb25fdGltZV91czoKKyAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAorICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50NjQsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0lOVDY0PigKKyAgICAgICAgICAgICAgICAgaW5wdXQsICZleHBpcmF0aW9uX3RpbWVfdXNfKSkpOworCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg1NikpIGdvdG8gcGFyc2VfbGFzdF9hY2Nlc3NfdGltZV91czsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIG9wdGlvbmFsIGludDY0IGxhc3RfYWNjZXNzX3RpbWVfdXMgPSA3OworICAgICAgY2FzZSA3OiB7CisgICAgICAgIGlmICh0YWcgPT0gNTYpIHsKKyAgICAgICAgIHBhcnNlX2xhc3RfYWNjZXNzX3RpbWVfdXM6CisgICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKKyAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDY0LCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9JTlQ2ND4oCisgICAgICAgICAgICAgICAgIGlucHV0LCAmbGFzdF9hY2Nlc3NfdGltZV91c18pKSk7CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDY0KSkgZ290byBwYXJzZV9zZWN1cmU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyBvcHRpb25hbCBib29sIHNlY3VyZSA9IDg7CisgICAgICBjYXNlIDg6IHsKKyAgICAgICAgaWYgKHRhZyA9PSA2NCkgeworICAgICAgICAgcGFyc2Vfc2VjdXJlOgorICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8CisgICAgICAgICAgICAgICAgICAgYm9vbCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfQk9PTD4oCisgICAgICAgICAgICAgICAgIGlucHV0LCAmc2VjdXJlXykpKTsKKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNzIpKSBnb3RvIHBhcnNlX2h0dHBfb25seTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIG9wdGlvbmFsIGJvb2wgaHR0cF9vbmx5ID0gOTsKKyAgICAgIGNhc2UgOTogeworICAgICAgICBpZiAodGFnID09IDcyKSB7CisgICAgICAgICBwYXJzZV9odHRwX29ubHk6CisgICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKKyAgICAgICAgICAgICAgICAgICBib29sLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9CT09MPigKKyAgICAgICAgICAgICAgICAgaW5wdXQsICZodHRwX29ubHlfKSkpOworCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdEF0RW5kKCkpIGdvdG8gc3VjY2VzczsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGRlZmF1bHQ6IHsKKyAgICAgIGhhbmRsZV91bnVzdWFsOgorICAgICAgICBpZiAodGFnID09IDAgfHwKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7CisgICAgICAgICAgZ290byBzdWNjZXNzOworICAgICAgICB9CisgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2tpcEZpZWxkKGlucHV0LCB0YWcpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CitzdWNjZXNzOgorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3VjY2Vzczpjb2JhbHQuc3RvcmFnZS5Db29raWUpCisgIHJldHVybiB0cnVlOworZmFpbHVyZToKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX2ZhaWx1cmU6Y29iYWx0LnN0b3JhZ2UuQ29va2llKQorICByZXR1cm4gZmFsc2U7CisjdW5kZWYgRE9fCit9CisKK3ZvaWQgQ29va2llOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3N0YXJ0OmNvYmFsdC5zdG9yYWdlLkNvb2tpZSkKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworICBpZiAodGhpcy0+bmFtZSgpLnNpemUoKSA+IDApIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VmVyaWZ5VXRmOFN0cmluZygKKyAgICAgIHRoaXMtPm5hbWUoKS5kYXRhKCksIHRoaXMtPm5hbWUoKS5sZW5ndGgoKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTRVJJQUxJWkUsCisgICAgICAiY29iYWx0LnN0b3JhZ2UuQ29va2llLm5hbWUiKTsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCisgICAgICAxLCB0aGlzLT5uYW1lKCksIG91dHB1dCk7CisgIH0KKworICAvLyBvcHRpb25hbCBzdHJpbmcgdmFsdWUgPSAyOworICBpZiAodGhpcy0+dmFsdWUoKS5zaXplKCkgPiAwKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlZlcmlmeVV0ZjhTdHJpbmcoCisgICAgICB0aGlzLT52YWx1ZSgpLmRhdGEoKSwgdGhpcy0+dmFsdWUoKS5sZW5ndGgoKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTRVJJQUxJWkUsCisgICAgICAiY29iYWx0LnN0b3JhZ2UuQ29va2llLnZhbHVlIik7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nTWF5YmVBbGlhc2VkKAorICAgICAgMiwgdGhpcy0+dmFsdWUoKSwgb3V0cHV0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIHN0cmluZyBkb21haW4gPSAzOworICBpZiAodGhpcy0+ZG9tYWluKCkuc2l6ZSgpID4gMCkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpWZXJpZnlVdGY4U3RyaW5nKAorICAgICAgdGhpcy0+ZG9tYWluKCkuZGF0YSgpLCB0aGlzLT5kb21haW4oKS5sZW5ndGgoKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTRVJJQUxJWkUsCisgICAgICAiY29iYWx0LnN0b3JhZ2UuQ29va2llLmRvbWFpbiIpOworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ01heWJlQWxpYXNlZCgKKyAgICAgIDMsIHRoaXMtPmRvbWFpbigpLCBvdXRwdXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIHBhdGggPSA0OworICBpZiAodGhpcy0+cGF0aCgpLnNpemUoKSA+IDApIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VmVyaWZ5VXRmOFN0cmluZygKKyAgICAgIHRoaXMtPnBhdGgoKS5kYXRhKCksIHRoaXMtPnBhdGgoKS5sZW5ndGgoKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTRVJJQUxJWkUsCisgICAgICAiY29iYWx0LnN0b3JhZ2UuQ29va2llLnBhdGgiKTsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCisgICAgICA0LCB0aGlzLT5wYXRoKCksIG91dHB1dCk7CisgIH0KKworICAvLyBvcHRpb25hbCBpbnQ2NCBjcmVhdGlvbl90aW1lX3VzID0gNTsKKyAgaWYgKHRoaXMtPmNyZWF0aW9uX3RpbWVfdXMoKSAhPSAwKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50NjQoNSwgdGhpcy0+Y3JlYXRpb25fdGltZV91cygpLCBvdXRwdXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgaW50NjQgZXhwaXJhdGlvbl90aW1lX3VzID0gNjsKKyAgaWYgKHRoaXMtPmV4cGlyYXRpb25fdGltZV91cygpICE9IDApIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQ2NCg2LCB0aGlzLT5leHBpcmF0aW9uX3RpbWVfdXMoKSwgb3V0cHV0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIGludDY0IGxhc3RfYWNjZXNzX3RpbWVfdXMgPSA3OworICBpZiAodGhpcy0+bGFzdF9hY2Nlc3NfdGltZV91cygpICE9IDApIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQ2NCg3LCB0aGlzLT5sYXN0X2FjY2Vzc190aW1lX3VzKCksIG91dHB1dCk7CisgIH0KKworICAvLyBvcHRpb25hbCBib29sIHNlY3VyZSA9IDg7CisgIGlmICh0aGlzLT5zZWN1cmUoKSAhPSAwKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbCg4LCB0aGlzLT5zZWN1cmUoKSwgb3V0cHV0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIGJvb2wgaHR0cF9vbmx5ID0gOTsKKyAgaWYgKHRoaXMtPmh0dHBfb25seSgpICE9IDApIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sKDksIHRoaXMtPmh0dHBfb25seSgpLCBvdXRwdXQpOworICB9CisKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV9lbmQ6Y29iYWx0LnN0b3JhZ2UuQ29va2llKQorfQorCitpbnQgQ29va2llOjpCeXRlU2l6ZSgpIGNvbnN0IHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2J5dGVfc2l6ZV9zdGFydDpjb2JhbHQuc3RvcmFnZS5Db29raWUpCisgIGludCB0b3RhbF9zaXplID0gMDsKKworICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgIGlmICh0aGlzLT5uYW1lKCkuc2l6ZSgpID4gMCkgeworICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKKyAgICAgICAgdGhpcy0+bmFtZSgpKTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIHN0cmluZyB2YWx1ZSA9IDI7CisgIGlmICh0aGlzLT52YWx1ZSgpLnNpemUoKSA+IDApIHsKKyAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCisgICAgICAgIHRoaXMtPnZhbHVlKCkpOworICB9CisKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIGRvbWFpbiA9IDM7CisgIGlmICh0aGlzLT5kb21haW4oKS5zaXplKCkgPiAwKSB7CisgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICB0aGlzLT5kb21haW4oKSk7CisgIH0KKworICAvLyBvcHRpb25hbCBzdHJpbmcgcGF0aCA9IDQ7CisgIGlmICh0aGlzLT5wYXRoKCkuc2l6ZSgpID4gMCkgeworICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKKyAgICAgICAgdGhpcy0+cGF0aCgpKTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIGludDY0IGNyZWF0aW9uX3RpbWVfdXMgPSA1OworICBpZiAodGhpcy0+Y3JlYXRpb25fdGltZV91cygpICE9IDApIHsKKyAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkludDY0U2l6ZSgKKyAgICAgICAgdGhpcy0+Y3JlYXRpb25fdGltZV91cygpKTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIGludDY0IGV4cGlyYXRpb25fdGltZV91cyA9IDY7CisgIGlmICh0aGlzLT5leHBpcmF0aW9uX3RpbWVfdXMoKSAhPSAwKSB7CisgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpJbnQ2NFNpemUoCisgICAgICAgIHRoaXMtPmV4cGlyYXRpb25fdGltZV91cygpKTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIGludDY0IGxhc3RfYWNjZXNzX3RpbWVfdXMgPSA3OworICBpZiAodGhpcy0+bGFzdF9hY2Nlc3NfdGltZV91cygpICE9IDApIHsKKyAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkludDY0U2l6ZSgKKyAgICAgICAgdGhpcy0+bGFzdF9hY2Nlc3NfdGltZV91cygpKTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIGJvb2wgc2VjdXJlID0gODsKKyAgaWYgKHRoaXMtPnNlY3VyZSgpICE9IDApIHsKKyAgICB0b3RhbF9zaXplICs9IDEgKyAxOworICB9CisKKyAgLy8gb3B0aW9uYWwgYm9vbCBodHRwX29ubHkgPSA5OworICBpZiAodGhpcy0+aHR0cF9vbmx5KCkgIT0gMCkgeworICAgIHRvdGFsX3NpemUgKz0gMSArIDE7CisgIH0KKworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOworICBfY2FjaGVkX3NpemVfID0gdG90YWxfc2l6ZTsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7CisgIHJldHVybiB0b3RhbF9zaXplOworfQorCit2b2lkIENvb2tpZTo6Q2hlY2tUeXBlQW5kTWVyZ2VGcm9tKAorICAgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUxpdGUmIGZyb20pIHsKKyAgTWVyZ2VGcm9tKCo6Omdvb2dsZTo6cHJvdG9idWY6OmRvd25fY2FzdDxjb25zdCBDb29raWUqPigmZnJvbSkpOworfQorCit2b2lkIENvb2tpZTo6TWVyZ2VGcm9tKGNvbnN0IENvb2tpZSYgZnJvbSkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX21lcmdlX2Zyb21fc3RhcnQ6Y29iYWx0LnN0b3JhZ2UuQ29va2llKQorICBpZiAoR09PR0xFX1BSRURJQ1RfRkFMU0UoJmZyb20gPT0gdGhpcykpIE1lcmdlRnJvbUZhaWwoX19MSU5FX18pOworICBpZiAoZnJvbS5uYW1lKCkuc2l6ZSgpID4gMCkgeworCisgICAgbmFtZV8uQXNzaWduV2l0aERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBmcm9tLm5hbWVfKTsKKyAgfQorICBpZiAoZnJvbS52YWx1ZSgpLnNpemUoKSA+IDApIHsKKworICAgIHZhbHVlXy5Bc3NpZ25XaXRoRGVmYXVsdCgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIGZyb20udmFsdWVfKTsKKyAgfQorICBpZiAoZnJvbS5kb21haW4oKS5zaXplKCkgPiAwKSB7CisKKyAgICBkb21haW5fLkFzc2lnbldpdGhEZWZhdWx0KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgZnJvbS5kb21haW5fKTsKKyAgfQorICBpZiAoZnJvbS5wYXRoKCkuc2l6ZSgpID4gMCkgeworCisgICAgcGF0aF8uQXNzaWduV2l0aERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBmcm9tLnBhdGhfKTsKKyAgfQorICBpZiAoZnJvbS5jcmVhdGlvbl90aW1lX3VzKCkgIT0gMCkgeworICAgIHNldF9jcmVhdGlvbl90aW1lX3VzKGZyb20uY3JlYXRpb25fdGltZV91cygpKTsKKyAgfQorICBpZiAoZnJvbS5leHBpcmF0aW9uX3RpbWVfdXMoKSAhPSAwKSB7CisgICAgc2V0X2V4cGlyYXRpb25fdGltZV91cyhmcm9tLmV4cGlyYXRpb25fdGltZV91cygpKTsKKyAgfQorICBpZiAoZnJvbS5sYXN0X2FjY2Vzc190aW1lX3VzKCkgIT0gMCkgeworICAgIHNldF9sYXN0X2FjY2Vzc190aW1lX3VzKGZyb20ubGFzdF9hY2Nlc3NfdGltZV91cygpKTsKKyAgfQorICBpZiAoZnJvbS5zZWN1cmUoKSAhPSAwKSB7CisgICAgc2V0X3NlY3VyZShmcm9tLnNlY3VyZSgpKTsKKyAgfQorICBpZiAoZnJvbS5odHRwX29ubHkoKSAhPSAwKSB7CisgICAgc2V0X2h0dHBfb25seShmcm9tLmh0dHBfb25seSgpKTsKKyAgfQorfQorCit2b2lkIENvb2tpZTo6Q29weUZyb20oY29uc3QgQ29va2llJiBmcm9tKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfY29weV9mcm9tX3N0YXJ0OmNvYmFsdC5zdG9yYWdlLkNvb2tpZSkKKyAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKKyAgQ2xlYXIoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCitib29sIENvb2tpZTo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKKworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDb29raWU6OlN3YXAoQ29va2llKiBvdGhlcikgeworICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOworICBJbnRlcm5hbFN3YXAob3RoZXIpOworfQordm9pZCBDb29raWU6OkludGVybmFsU3dhcChDb29raWUqIG90aGVyKSB7CisgIG5hbWVfLlN3YXAoJm90aGVyLT5uYW1lXyk7CisgIHZhbHVlXy5Td2FwKCZvdGhlci0+dmFsdWVfKTsKKyAgZG9tYWluXy5Td2FwKCZvdGhlci0+ZG9tYWluXyk7CisgIHBhdGhfLlN3YXAoJm90aGVyLT5wYXRoXyk7CisgIHN0ZDo6c3dhcChjcmVhdGlvbl90aW1lX3VzXywgb3RoZXItPmNyZWF0aW9uX3RpbWVfdXNfKTsKKyAgc3RkOjpzd2FwKGV4cGlyYXRpb25fdGltZV91c18sIG90aGVyLT5leHBpcmF0aW9uX3RpbWVfdXNfKTsKKyAgc3RkOjpzd2FwKGxhc3RfYWNjZXNzX3RpbWVfdXNfLCBvdGhlci0+bGFzdF9hY2Nlc3NfdGltZV91c18pOworICBzdGQ6OnN3YXAoc2VjdXJlXywgb3RoZXItPnNlY3VyZV8pOworICBzdGQ6OnN3YXAoaHR0cF9vbmx5Xywgb3RoZXItPmh0dHBfb25seV8pOworICBfdW5rbm93bl9maWVsZHNfLlN3YXAoJm90aGVyLT5fdW5rbm93bl9maWVsZHNfKTsKKyAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKK30KKworOjpzdGQ6OnN0cmluZyBDb29raWU6OkdldFR5cGVOYW1lKCkgY29uc3QgeworICByZXR1cm4gImNvYmFsdC5zdG9yYWdlLkNvb2tpZSI7Cit9CisKKyNpZiBQUk9UT0JVRl9JTkxJTkVfTk9UX0lOX0hFQURFUlMKKy8vIENvb2tpZQorCisvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7Cit2b2lkIENvb2tpZTo6Y2xlYXJfbmFtZSgpIHsKKyAgbmFtZV8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQorIGNvbnN0IDo6c3RkOjpzdHJpbmcmIENvb2tpZTo6bmFtZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpjb2JhbHQuc3RvcmFnZS5Db29raWUubmFtZSkKKyAgcmV0dXJuIG5hbWVfLkdldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KKyB2b2lkIENvb2tpZTo6c2V0X25hbWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgCisgIG5hbWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCB2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Y29iYWx0LnN0b3JhZ2UuQ29va2llLm5hbWUpCit9Cisgdm9pZCBDb29raWU6OnNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIAorICBuYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgOjpzdGQ6OnN0cmluZyh2YWx1ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6Y29iYWx0LnN0b3JhZ2UuQ29va2llLm5hbWUpCit9Cisgdm9pZCBDb29raWU6OnNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICAKKyAgbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCisgICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Y29iYWx0LnN0b3JhZ2UuQ29va2llLm5hbWUpCit9CisgOjpzdGQ6OnN0cmluZyogQ29va2llOjptdXRhYmxlX25hbWUoKSB7CisgIAorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpjb2JhbHQuc3RvcmFnZS5Db29raWUubmFtZSkKKyAgcmV0dXJuIG5hbWVfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CisgOjpzdGQ6OnN0cmluZyogQ29va2llOjpyZWxlYXNlX25hbWUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmNvYmFsdC5zdG9yYWdlLkNvb2tpZS5uYW1lKQorICAKKyAgcmV0dXJuIG5hbWVfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9Cisgdm9pZCBDb29raWU6OnNldF9hbGxvY2F0ZWRfbmFtZSg6OnN0ZDo6c3RyaW5nKiBuYW1lKSB7CisgIGlmIChuYW1lICE9IE5VTEwpIHsKKyAgICAKKyAgfSBlbHNlIHsKKyAgICAKKyAgfQorICBuYW1lXy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgbmFtZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmNvYmFsdC5zdG9yYWdlLkNvb2tpZS5uYW1lKQorfQorCisvLyBvcHRpb25hbCBzdHJpbmcgdmFsdWUgPSAyOwordm9pZCBDb29raWU6OmNsZWFyX3ZhbHVlKCkgeworICB2YWx1ZV8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQorIGNvbnN0IDo6c3RkOjpzdHJpbmcmIENvb2tpZTo6dmFsdWUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Y29iYWx0LnN0b3JhZ2UuQ29va2llLnZhbHVlKQorICByZXR1cm4gdmFsdWVfLkdldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KKyB2b2lkIENvb2tpZTo6c2V0X3ZhbHVlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIAorICB2YWx1ZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpjb2JhbHQuc3RvcmFnZS5Db29raWUudmFsdWUpCit9Cisgdm9pZCBDb29raWU6OnNldF92YWx1ZShjb25zdCBjaGFyKiB2YWx1ZSkgeworICAKKyAgdmFsdWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpjb2JhbHQuc3RvcmFnZS5Db29raWUudmFsdWUpCit9Cisgdm9pZCBDb29raWU6OnNldF92YWx1ZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgCisgIHZhbHVlXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwKKyAgICAgIDo6c3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpjb2JhbHQuc3RvcmFnZS5Db29raWUudmFsdWUpCit9CisgOjpzdGQ6OnN0cmluZyogQ29va2llOjptdXRhYmxlX3ZhbHVlKCkgeworICAKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Y29iYWx0LnN0b3JhZ2UuQ29va2llLnZhbHVlKQorICByZXR1cm4gdmFsdWVfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CisgOjpzdGQ6OnN0cmluZyogQ29va2llOjpyZWxlYXNlX3ZhbHVlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpjb2JhbHQuc3RvcmFnZS5Db29raWUudmFsdWUpCisgIAorICByZXR1cm4gdmFsdWVfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9Cisgdm9pZCBDb29raWU6OnNldF9hbGxvY2F0ZWRfdmFsdWUoOjpzdGQ6OnN0cmluZyogdmFsdWUpIHsKKyAgaWYgKHZhbHVlICE9IE5VTEwpIHsKKyAgICAKKyAgfSBlbHNlIHsKKyAgICAKKyAgfQorICB2YWx1ZV8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Y29iYWx0LnN0b3JhZ2UuQ29va2llLnZhbHVlKQorfQorCisvLyBvcHRpb25hbCBzdHJpbmcgZG9tYWluID0gMzsKK3ZvaWQgQ29va2llOjpjbGVhcl9kb21haW4oKSB7CisgIGRvbWFpbl8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQorIGNvbnN0IDo6c3RkOjpzdHJpbmcmIENvb2tpZTo6ZG9tYWluKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0OmNvYmFsdC5zdG9yYWdlLkNvb2tpZS5kb21haW4pCisgIHJldHVybiBkb21haW5fLkdldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KKyB2b2lkIENvb2tpZTo6c2V0X2RvbWFpbihjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAKKyAgZG9tYWluXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0OmNvYmFsdC5zdG9yYWdlLkNvb2tpZS5kb21haW4pCit9Cisgdm9pZCBDb29raWU6OnNldF9kb21haW4oY29uc3QgY2hhciogdmFsdWUpIHsKKyAgCisgIGRvbWFpbl8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmNvYmFsdC5zdG9yYWdlLkNvb2tpZS5kb21haW4pCit9Cisgdm9pZCBDb29raWU6OnNldF9kb21haW4oY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIAorICBkb21haW5fLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLAorICAgICAgOjpzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmNvYmFsdC5zdG9yYWdlLkNvb2tpZS5kb21haW4pCit9CisgOjpzdGQ6OnN0cmluZyogQ29va2llOjptdXRhYmxlX2RvbWFpbigpIHsKKyAgCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmNvYmFsdC5zdG9yYWdlLkNvb2tpZS5kb21haW4pCisgIHJldHVybiBkb21haW5fLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CisgOjpzdGQ6OnN0cmluZyogQ29va2llOjpyZWxlYXNlX2RvbWFpbigpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Y29iYWx0LnN0b3JhZ2UuQ29va2llLmRvbWFpbikKKyAgCisgIHJldHVybiBkb21haW5fLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9Cisgdm9pZCBDb29raWU6OnNldF9hbGxvY2F0ZWRfZG9tYWluKDo6c3RkOjpzdHJpbmcqIGRvbWFpbikgeworICBpZiAoZG9tYWluICE9IE5VTEwpIHsKKyAgICAKKyAgfSBlbHNlIHsKKyAgICAKKyAgfQorICBkb21haW5fLlNldEFsbG9jYXRlZE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBkb21haW4pOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpjb2JhbHQuc3RvcmFnZS5Db29raWUuZG9tYWluKQorfQorCisvLyBvcHRpb25hbCBzdHJpbmcgcGF0aCA9IDQ7Cit2b2lkIENvb2tpZTo6Y2xlYXJfcGF0aCgpIHsKKyAgcGF0aF8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQorIGNvbnN0IDo6c3RkOjpzdHJpbmcmIENvb2tpZTo6cGF0aCgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpjb2JhbHQuc3RvcmFnZS5Db29raWUucGF0aCkKKyAgcmV0dXJuIHBhdGhfLkdldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KKyB2b2lkIENvb2tpZTo6c2V0X3BhdGgoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgCisgIHBhdGhfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCB2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Y29iYWx0LnN0b3JhZ2UuQ29va2llLnBhdGgpCit9Cisgdm9pZCBDb29raWU6OnNldF9wYXRoKGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIAorICBwYXRoXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgOjpzdGQ6OnN0cmluZyh2YWx1ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6Y29iYWx0LnN0b3JhZ2UuQ29va2llLnBhdGgpCit9Cisgdm9pZCBDb29raWU6OnNldF9wYXRoKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICAKKyAgcGF0aF8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCisgICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Y29iYWx0LnN0b3JhZ2UuQ29va2llLnBhdGgpCit9CisgOjpzdGQ6OnN0cmluZyogQ29va2llOjptdXRhYmxlX3BhdGgoKSB7CisgIAorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpjb2JhbHQuc3RvcmFnZS5Db29raWUucGF0aCkKKyAgcmV0dXJuIHBhdGhfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CisgOjpzdGQ6OnN0cmluZyogQ29va2llOjpyZWxlYXNlX3BhdGgoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmNvYmFsdC5zdG9yYWdlLkNvb2tpZS5wYXRoKQorICAKKyAgcmV0dXJuIHBhdGhfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9Cisgdm9pZCBDb29raWU6OnNldF9hbGxvY2F0ZWRfcGF0aCg6OnN0ZDo6c3RyaW5nKiBwYXRoKSB7CisgIGlmIChwYXRoICE9IE5VTEwpIHsKKyAgICAKKyAgfSBlbHNlIHsKKyAgICAKKyAgfQorICBwYXRoXy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgcGF0aCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmNvYmFsdC5zdG9yYWdlLkNvb2tpZS5wYXRoKQorfQorCisvLyBvcHRpb25hbCBpbnQ2NCBjcmVhdGlvbl90aW1lX3VzID0gNTsKK3ZvaWQgQ29va2llOjpjbGVhcl9jcmVhdGlvbl90aW1lX3VzKCkgeworICBjcmVhdGlvbl90aW1lX3VzXyA9IEdPT0dMRV9MT05HTE9ORygwKTsKK30KKyA6Omdvb2dsZTo6cHJvdG9idWY6OmludDY0IENvb2tpZTo6Y3JlYXRpb25fdGltZV91cygpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpjb2JhbHQuc3RvcmFnZS5Db29raWUuY3JlYXRpb25fdGltZV91cykKKyAgcmV0dXJuIGNyZWF0aW9uX3RpbWVfdXNfOworfQorIHZvaWQgQ29va2llOjpzZXRfY3JlYXRpb25fdGltZV91cyg6Omdvb2dsZTo6cHJvdG9idWY6OmludDY0IHZhbHVlKSB7CisgIAorICBjcmVhdGlvbl90aW1lX3VzXyA9IHZhbHVlOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0OmNvYmFsdC5zdG9yYWdlLkNvb2tpZS5jcmVhdGlvbl90aW1lX3VzKQorfQorCisvLyBvcHRpb25hbCBpbnQ2NCBleHBpcmF0aW9uX3RpbWVfdXMgPSA2Owordm9pZCBDb29raWU6OmNsZWFyX2V4cGlyYXRpb25fdGltZV91cygpIHsKKyAgZXhwaXJhdGlvbl90aW1lX3VzXyA9IEdPT0dMRV9MT05HTE9ORygwKTsKK30KKyA6Omdvb2dsZTo6cHJvdG9idWY6OmludDY0IENvb2tpZTo6ZXhwaXJhdGlvbl90aW1lX3VzKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0OmNvYmFsdC5zdG9yYWdlLkNvb2tpZS5leHBpcmF0aW9uX3RpbWVfdXMpCisgIHJldHVybiBleHBpcmF0aW9uX3RpbWVfdXNfOworfQorIHZvaWQgQ29va2llOjpzZXRfZXhwaXJhdGlvbl90aW1lX3VzKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50NjQgdmFsdWUpIHsKKyAgCisgIGV4cGlyYXRpb25fdGltZV91c18gPSB2YWx1ZTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpjb2JhbHQuc3RvcmFnZS5Db29raWUuZXhwaXJhdGlvbl90aW1lX3VzKQorfQorCisvLyBvcHRpb25hbCBpbnQ2NCBsYXN0X2FjY2Vzc190aW1lX3VzID0gNzsKK3ZvaWQgQ29va2llOjpjbGVhcl9sYXN0X2FjY2Vzc190aW1lX3VzKCkgeworICBsYXN0X2FjY2Vzc190aW1lX3VzXyA9IEdPT0dMRV9MT05HTE9ORygwKTsKK30KKyA6Omdvb2dsZTo6cHJvdG9idWY6OmludDY0IENvb2tpZTo6bGFzdF9hY2Nlc3NfdGltZV91cygpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpjb2JhbHQuc3RvcmFnZS5Db29raWUubGFzdF9hY2Nlc3NfdGltZV91cykKKyAgcmV0dXJuIGxhc3RfYWNjZXNzX3RpbWVfdXNfOworfQorIHZvaWQgQ29va2llOjpzZXRfbGFzdF9hY2Nlc3NfdGltZV91cyg6Omdvb2dsZTo6cHJvdG9idWY6OmludDY0IHZhbHVlKSB7CisgIAorICBsYXN0X2FjY2Vzc190aW1lX3VzXyA9IHZhbHVlOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0OmNvYmFsdC5zdG9yYWdlLkNvb2tpZS5sYXN0X2FjY2Vzc190aW1lX3VzKQorfQorCisvLyBvcHRpb25hbCBib29sIHNlY3VyZSA9IDg7Cit2b2lkIENvb2tpZTo6Y2xlYXJfc2VjdXJlKCkgeworICBzZWN1cmVfID0gZmFsc2U7Cit9CisgYm9vbCBDb29raWU6OnNlY3VyZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpjb2JhbHQuc3RvcmFnZS5Db29raWUuc2VjdXJlKQorICByZXR1cm4gc2VjdXJlXzsKK30KKyB2b2lkIENvb2tpZTo6c2V0X3NlY3VyZShib29sIHZhbHVlKSB7CisgIAorICBzZWN1cmVfID0gdmFsdWU7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Y29iYWx0LnN0b3JhZ2UuQ29va2llLnNlY3VyZSkKK30KKworLy8gb3B0aW9uYWwgYm9vbCBodHRwX29ubHkgPSA5Owordm9pZCBDb29raWU6OmNsZWFyX2h0dHBfb25seSgpIHsKKyAgaHR0cF9vbmx5XyA9IGZhbHNlOworfQorIGJvb2wgQ29va2llOjpodHRwX29ubHkoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Y29iYWx0LnN0b3JhZ2UuQ29va2llLmh0dHBfb25seSkKKyAgcmV0dXJuIGh0dHBfb25seV87Cit9Cisgdm9pZCBDb29raWU6OnNldF9odHRwX29ubHkoYm9vbCB2YWx1ZSkgeworICAKKyAgaHR0cF9vbmx5XyA9IHZhbHVlOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0OmNvYmFsdC5zdG9yYWdlLkNvb2tpZS5odHRwX29ubHkpCit9CisKKyNlbmRpZiAgLy8gUFJPVE9CVUZfSU5MSU5FX05PVF9JTl9IRUFERVJTCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCitjb25zdCBpbnQgTG9jYWxTdG9yYWdlRW50cnk6OmtLZXlGaWVsZE51bWJlcjsKK2NvbnN0IGludCBMb2NhbFN0b3JhZ2VFbnRyeTo6a1ZhbHVlRmllbGROdW1iZXI7CisjZW5kaWYgIC8vICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCisKK0xvY2FsU3RvcmFnZUVudHJ5OjpMb2NhbFN0b3JhZ2VFbnRyeSgpCisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlTGl0ZSgpLCBfYXJlbmFfcHRyXyhOVUxMKSB7CisgIFNoYXJlZEN0b3IoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvbnN0cnVjdG9yOmNvYmFsdC5zdG9yYWdlLkxvY2FsU3RvcmFnZUVudHJ5KQorfQorCit2b2lkIExvY2FsU3RvcmFnZUVudHJ5OjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7CisgIF9pc19kZWZhdWx0X2luc3RhbmNlXyA9IHRydWU7Cit9CisKK0xvY2FsU3RvcmFnZUVudHJ5OjpMb2NhbFN0b3JhZ2VFbnRyeShjb25zdCBMb2NhbFN0b3JhZ2VFbnRyeSYgZnJvbSkKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VMaXRlKCksCisgICAgX2FyZW5hX3B0cl8oTlVMTCkgeworICBTaGFyZWRDdG9yKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvcHlfY29uc3RydWN0b3I6Y29iYWx0LnN0b3JhZ2UuTG9jYWxTdG9yYWdlRW50cnkpCit9CisKK3ZvaWQgTG9jYWxTdG9yYWdlRW50cnk6OlNoYXJlZEN0b3IoKSB7CisgICAgX2lzX2RlZmF1bHRfaW5zdGFuY2VfID0gZmFsc2U7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nKCk7CisgIF9jYWNoZWRfc2l6ZV8gPSAwOworICBrZXlfLlVuc2FmZVNldERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKKyAgdmFsdWVfLlVuc2FmZVNldERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KKworTG9jYWxTdG9yYWdlRW50cnk6On5Mb2NhbFN0b3JhZ2VFbnRyeSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGRlc3RydWN0b3I6Y29iYWx0LnN0b3JhZ2UuTG9jYWxTdG9yYWdlRW50cnkpCisgIFNoYXJlZER0b3IoKTsKK30KKwordm9pZCBMb2NhbFN0b3JhZ2VFbnRyeTo6U2hhcmVkRHRvcigpIHsKKyAga2V5Xy5EZXN0cm95Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworICB2YWx1ZV8uRGVzdHJveU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKKyAgI2lmZGVmIEdPT0dMRV9QUk9UT0JVRl9OT19TVEFUSUNfSU5JVElBTElaRVIKKyAgaWYgKHRoaXMgIT0gJmRlZmF1bHRfaW5zdGFuY2UoKSkgeworICAjZWxzZQorICBpZiAodGhpcyAhPSBkZWZhdWx0X2luc3RhbmNlXykgeworICAjZW5kaWYKKyAgfQorfQorCit2b2lkIExvY2FsU3RvcmFnZUVudHJ5OjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CisgIF9jYWNoZWRfc2l6ZV8gPSBzaXplOworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKK30KK2NvbnN0IExvY2FsU3RvcmFnZUVudHJ5JiBMb2NhbFN0b3JhZ2VFbnRyeTo6ZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyNpZmRlZiBHT09HTEVfUFJPVE9CVUZfTk9fU1RBVElDX0lOSVRJQUxJWkVSCisgIHByb3RvYnVmX0FkZERlc2Nfc3RvcmFnZV8yZXByb3RvKCk7CisjZWxzZQorICBpZiAoZGVmYXVsdF9pbnN0YW5jZV8gPT0gTlVMTCkgcHJvdG9idWZfQWRkRGVzY19zdG9yYWdlXzJlcHJvdG8oKTsKKyNlbmRpZgorICByZXR1cm4gKmRlZmF1bHRfaW5zdGFuY2VfOworfQorCitMb2NhbFN0b3JhZ2VFbnRyeSogTG9jYWxTdG9yYWdlRW50cnk6OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKKworTG9jYWxTdG9yYWdlRW50cnkqIExvY2FsU3RvcmFnZUVudHJ5OjpOZXcoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpIGNvbnN0IHsKKyAgTG9jYWxTdG9yYWdlRW50cnkqIG4gPSBuZXcgTG9jYWxTdG9yYWdlRW50cnk7CisgIGlmIChhcmVuYSAhPSBOVUxMKSB7CisgICAgYXJlbmEtPk93bihuKTsKKyAgfQorICByZXR1cm4gbjsKK30KKwordm9pZCBMb2NhbFN0b3JhZ2VFbnRyeTo6Q2xlYXIoKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9jbGVhcl9zdGFydDpjb2JhbHQuc3RvcmFnZS5Mb2NhbFN0b3JhZ2VFbnRyeSkKKyAga2V5Xy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CisgIHZhbHVlXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CisKK2Jvb2wgTG9jYWxTdG9yYWdlRW50cnk6Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgeworI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCFHT09HTEVfUFJFRElDVF9UUlVFKEVYUFJFU1NJT04pKSBnb3RvIGZhaWx1cmUKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3RhcnQ6Y29iYWx0LnN0b3JhZ2UuTG9jYWxTdG9yYWdlRW50cnkpCisgIGZvciAoOzspIHsKKyAgICA6OnN0ZDo6cGFpcjwgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIsIGJvb2w+IHAgPSBpbnB1dC0+UmVhZFRhZ1dpdGhDdXRvZmYoMTI3KTsKKyAgICB0YWcgPSBwLmZpcnN0OworICAgIGlmICghcC5zZWNvbmQpIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgc3dpdGNoICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSkgeworICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIGtleSA9IDE7CisgICAgICBjYXNlIDE6IHsKKyAgICAgICAgaWYgKHRhZyA9PSAxMCkgeworICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKKyAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9rZXkoKSkpOworICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VmVyaWZ5VXRmOFN0cmluZygKKyAgICAgICAgICAgIHRoaXMtPmtleSgpLmRhdGEoKSwgdGhpcy0+a2V5KCkubGVuZ3RoKCksCisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UEFSU0UsCisgICAgICAgICAgICAiY29iYWx0LnN0b3JhZ2UuTG9jYWxTdG9yYWdlRW50cnkua2V5IikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTgpKSBnb3RvIHBhcnNlX3ZhbHVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIHZhbHVlID0gMjsKKyAgICAgIGNhc2UgMjogeworICAgICAgICBpZiAodGFnID09IDE4KSB7CisgICAgICAgICBwYXJzZV92YWx1ZToKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCisgICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfdmFsdWUoKSkpOworICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VmVyaWZ5VXRmOFN0cmluZygKKyAgICAgICAgICAgIHRoaXMtPnZhbHVlKCkuZGF0YSgpLCB0aGlzLT52YWx1ZSgpLmxlbmd0aCgpLAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlBBUlNFLAorICAgICAgICAgICAgImNvYmFsdC5zdG9yYWdlLkxvY2FsU3RvcmFnZUVudHJ5LnZhbHVlIikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSBnb3RvIHN1Y2Nlc3M7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBkZWZhdWx0OiB7CisgICAgICBoYW5kbGVfdW51c3VhbDoKKyAgICAgICAgaWYgKHRhZyA9PSAwIHx8CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkgeworICAgICAgICAgIGdvdG8gc3VjY2VzczsKKyAgICAgICAgfQorICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNraXBGaWVsZChpbnB1dCwgdGFnKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorc3VjY2VzczoKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX3N1Y2Nlc3M6Y29iYWx0LnN0b3JhZ2UuTG9jYWxTdG9yYWdlRW50cnkpCisgIHJldHVybiB0cnVlOworZmFpbHVyZToKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX2ZhaWx1cmU6Y29iYWx0LnN0b3JhZ2UuTG9jYWxTdG9yYWdlRW50cnkpCisgIHJldHVybiBmYWxzZTsKKyN1bmRlZiBET18KK30KKwordm9pZCBMb2NhbFN0b3JhZ2VFbnRyeTo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV9zdGFydDpjb2JhbHQuc3RvcmFnZS5Mb2NhbFN0b3JhZ2VFbnRyeSkKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIGtleSA9IDE7CisgIGlmICh0aGlzLT5rZXkoKS5zaXplKCkgPiAwKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlZlcmlmeVV0ZjhTdHJpbmcoCisgICAgICB0aGlzLT5rZXkoKS5kYXRhKCksIHRoaXMtPmtleSgpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNFUklBTElaRSwKKyAgICAgICJjb2JhbHQuc3RvcmFnZS5Mb2NhbFN0b3JhZ2VFbnRyeS5rZXkiKTsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCisgICAgICAxLCB0aGlzLT5rZXkoKSwgb3V0cHV0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIHN0cmluZyB2YWx1ZSA9IDI7CisgIGlmICh0aGlzLT52YWx1ZSgpLnNpemUoKSA+IDApIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VmVyaWZ5VXRmOFN0cmluZygKKyAgICAgIHRoaXMtPnZhbHVlKCkuZGF0YSgpLCB0aGlzLT52YWx1ZSgpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNFUklBTElaRSwKKyAgICAgICJjb2JhbHQuc3RvcmFnZS5Mb2NhbFN0b3JhZ2VFbnRyeS52YWx1ZSIpOworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ01heWJlQWxpYXNlZCgKKyAgICAgIDIsIHRoaXMtPnZhbHVlKCksIG91dHB1dCk7CisgIH0KKworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX2VuZDpjb2JhbHQuc3RvcmFnZS5Mb2NhbFN0b3JhZ2VFbnRyeSkKK30KKworaW50IExvY2FsU3RvcmFnZUVudHJ5OjpCeXRlU2l6ZSgpIGNvbnN0IHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2J5dGVfc2l6ZV9zdGFydDpjb2JhbHQuc3RvcmFnZS5Mb2NhbFN0b3JhZ2VFbnRyeSkKKyAgaW50IHRvdGFsX3NpemUgPSAwOworCisgIC8vIG9wdGlvbmFsIHN0cmluZyBrZXkgPSAxOworICBpZiAodGhpcy0+a2V5KCkuc2l6ZSgpID4gMCkgeworICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKKyAgICAgICAgdGhpcy0+a2V5KCkpOworICB9CisKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIHZhbHVlID0gMjsKKyAgaWYgKHRoaXMtPnZhbHVlKCkuc2l6ZSgpID4gMCkgeworICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKKyAgICAgICAgdGhpcy0+dmFsdWUoKSk7CisgIH0KKworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOworICBfY2FjaGVkX3NpemVfID0gdG90YWxfc2l6ZTsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7CisgIHJldHVybiB0b3RhbF9zaXplOworfQorCit2b2lkIExvY2FsU3RvcmFnZUVudHJ5OjpDaGVja1R5cGVBbmRNZXJnZUZyb20oCisgICAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlTGl0ZSYgZnJvbSkgeworICBNZXJnZUZyb20oKjo6Z29vZ2xlOjpwcm90b2J1Zjo6ZG93bl9jYXN0PGNvbnN0IExvY2FsU3RvcmFnZUVudHJ5Kj4oJmZyb20pKTsKK30KKwordm9pZCBMb2NhbFN0b3JhZ2VFbnRyeTo6TWVyZ2VGcm9tKGNvbnN0IExvY2FsU3RvcmFnZUVudHJ5JiBmcm9tKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfbWVyZ2VfZnJvbV9zdGFydDpjb2JhbHQuc3RvcmFnZS5Mb2NhbFN0b3JhZ2VFbnRyeSkKKyAgaWYgKEdPT0dMRV9QUkVESUNUX0ZBTFNFKCZmcm9tID09IHRoaXMpKSBNZXJnZUZyb21GYWlsKF9fTElORV9fKTsKKyAgaWYgKGZyb20ua2V5KCkuc2l6ZSgpID4gMCkgeworCisgICAga2V5Xy5Bc3NpZ25XaXRoRGVmYXVsdCgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIGZyb20ua2V5Xyk7CisgIH0KKyAgaWYgKGZyb20udmFsdWUoKS5zaXplKCkgPiAwKSB7CisKKyAgICB2YWx1ZV8uQXNzaWduV2l0aERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBmcm9tLnZhbHVlXyk7CisgIH0KK30KKwordm9pZCBMb2NhbFN0b3JhZ2VFbnRyeTo6Q29weUZyb20oY29uc3QgTG9jYWxTdG9yYWdlRW50cnkmIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19jb3B5X2Zyb21fc3RhcnQ6Y29iYWx0LnN0b3JhZ2UuTG9jYWxTdG9yYWdlRW50cnkpCisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKworYm9vbCBMb2NhbFN0b3JhZ2VFbnRyeTo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKKworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBMb2NhbFN0b3JhZ2VFbnRyeTo6U3dhcChMb2NhbFN0b3JhZ2VFbnRyeSogb3RoZXIpIHsKKyAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgSW50ZXJuYWxTd2FwKG90aGVyKTsKK30KK3ZvaWQgTG9jYWxTdG9yYWdlRW50cnk6OkludGVybmFsU3dhcChMb2NhbFN0b3JhZ2VFbnRyeSogb3RoZXIpIHsKKyAga2V5Xy5Td2FwKCZvdGhlci0+a2V5Xyk7CisgIHZhbHVlXy5Td2FwKCZvdGhlci0+dmFsdWVfKTsKKyAgX3Vua25vd25fZmllbGRzXy5Td2FwKCZvdGhlci0+X3Vua25vd25fZmllbGRzXyk7CisgIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7Cit9CisKKzo6c3RkOjpzdHJpbmcgTG9jYWxTdG9yYWdlRW50cnk6OkdldFR5cGVOYW1lKCkgY29uc3QgeworICByZXR1cm4gImNvYmFsdC5zdG9yYWdlLkxvY2FsU3RvcmFnZUVudHJ5IjsKK30KKworI2lmIFBST1RPQlVGX0lOTElORV9OT1RfSU5fSEVBREVSUworLy8gTG9jYWxTdG9yYWdlRW50cnkKKworLy8gb3B0aW9uYWwgc3RyaW5nIGtleSA9IDE7Cit2b2lkIExvY2FsU3RvcmFnZUVudHJ5OjpjbGVhcl9rZXkoKSB7CisgIGtleV8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQorIGNvbnN0IDo6c3RkOjpzdHJpbmcmIExvY2FsU3RvcmFnZUVudHJ5OjprZXkoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Y29iYWx0LnN0b3JhZ2UuTG9jYWxTdG9yYWdlRW50cnkua2V5KQorICByZXR1cm4ga2V5Xy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9Cisgdm9pZCBMb2NhbFN0b3JhZ2VFbnRyeTo6c2V0X2tleShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAKKyAga2V5Xy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0OmNvYmFsdC5zdG9yYWdlLkxvY2FsU3RvcmFnZUVudHJ5LmtleSkKK30KKyB2b2lkIExvY2FsU3RvcmFnZUVudHJ5OjpzZXRfa2V5KGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIAorICBrZXlfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpjb2JhbHQuc3RvcmFnZS5Mb2NhbFN0b3JhZ2VFbnRyeS5rZXkpCit9Cisgdm9pZCBMb2NhbFN0b3JhZ2VFbnRyeTo6c2V0X2tleShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgCisgIGtleV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCisgICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Y29iYWx0LnN0b3JhZ2UuTG9jYWxTdG9yYWdlRW50cnkua2V5KQorfQorIDo6c3RkOjpzdHJpbmcqIExvY2FsU3RvcmFnZUVudHJ5OjptdXRhYmxlX2tleSgpIHsKKyAgCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmNvYmFsdC5zdG9yYWdlLkxvY2FsU3RvcmFnZUVudHJ5LmtleSkKKyAgcmV0dXJuIGtleV8uTXV0YWJsZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KKyA6OnN0ZDo6c3RyaW5nKiBMb2NhbFN0b3JhZ2VFbnRyeTo6cmVsZWFzZV9rZXkoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmNvYmFsdC5zdG9yYWdlLkxvY2FsU3RvcmFnZUVudHJ5LmtleSkKKyAgCisgIHJldHVybiBrZXlfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9Cisgdm9pZCBMb2NhbFN0b3JhZ2VFbnRyeTo6c2V0X2FsbG9jYXRlZF9rZXkoOjpzdGQ6OnN0cmluZyoga2V5KSB7CisgIGlmIChrZXkgIT0gTlVMTCkgeworICAgIAorICB9IGVsc2UgeworICAgIAorICB9CisgIGtleV8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIGtleSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmNvYmFsdC5zdG9yYWdlLkxvY2FsU3RvcmFnZUVudHJ5LmtleSkKK30KKworLy8gb3B0aW9uYWwgc3RyaW5nIHZhbHVlID0gMjsKK3ZvaWQgTG9jYWxTdG9yYWdlRW50cnk6OmNsZWFyX3ZhbHVlKCkgeworICB2YWx1ZV8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQorIGNvbnN0IDo6c3RkOjpzdHJpbmcmIExvY2FsU3RvcmFnZUVudHJ5Ojp2YWx1ZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpjb2JhbHQuc3RvcmFnZS5Mb2NhbFN0b3JhZ2VFbnRyeS52YWx1ZSkKKyAgcmV0dXJuIHZhbHVlXy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9Cisgdm9pZCBMb2NhbFN0b3JhZ2VFbnRyeTo6c2V0X3ZhbHVlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIAorICB2YWx1ZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpjb2JhbHQuc3RvcmFnZS5Mb2NhbFN0b3JhZ2VFbnRyeS52YWx1ZSkKK30KKyB2b2lkIExvY2FsU3RvcmFnZUVudHJ5OjpzZXRfdmFsdWUoY29uc3QgY2hhciogdmFsdWUpIHsKKyAgCisgIHZhbHVlXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgOjpzdGQ6OnN0cmluZyh2YWx1ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6Y29iYWx0LnN0b3JhZ2UuTG9jYWxTdG9yYWdlRW50cnkudmFsdWUpCit9Cisgdm9pZCBMb2NhbFN0b3JhZ2VFbnRyeTo6c2V0X3ZhbHVlKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICAKKyAgdmFsdWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLAorICAgICAgOjpzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmNvYmFsdC5zdG9yYWdlLkxvY2FsU3RvcmFnZUVudHJ5LnZhbHVlKQorfQorIDo6c3RkOjpzdHJpbmcqIExvY2FsU3RvcmFnZUVudHJ5OjptdXRhYmxlX3ZhbHVlKCkgeworICAKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Y29iYWx0LnN0b3JhZ2UuTG9jYWxTdG9yYWdlRW50cnkudmFsdWUpCisgIHJldHVybiB2YWx1ZV8uTXV0YWJsZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KKyA6OnN0ZDo6c3RyaW5nKiBMb2NhbFN0b3JhZ2VFbnRyeTo6cmVsZWFzZV92YWx1ZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Y29iYWx0LnN0b3JhZ2UuTG9jYWxTdG9yYWdlRW50cnkudmFsdWUpCisgIAorICByZXR1cm4gdmFsdWVfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9Cisgdm9pZCBMb2NhbFN0b3JhZ2VFbnRyeTo6c2V0X2FsbG9jYXRlZF92YWx1ZSg6OnN0ZDo6c3RyaW5nKiB2YWx1ZSkgeworICBpZiAodmFsdWUgIT0gTlVMTCkgeworICAgIAorICB9IGVsc2UgeworICAgIAorICB9CisgIHZhbHVlXy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpjb2JhbHQuc3RvcmFnZS5Mb2NhbFN0b3JhZ2VFbnRyeS52YWx1ZSkKK30KKworI2VuZGlmICAvLyBQUk9UT0JVRl9JTkxJTkVfTk9UX0lOX0hFQURFUlMKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKK2NvbnN0IGludCBMb2NhbFN0b3JhZ2U6OmtJZEZpZWxkTnVtYmVyOworY29uc3QgaW50IExvY2FsU3RvcmFnZTo6a0xvY2FsU3RvcmFnZUVudHJpZXNGaWVsZE51bWJlcjsKKyNlbmRpZiAgLy8gIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKKworTG9jYWxTdG9yYWdlOjpMb2NhbFN0b3JhZ2UoKQorICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUxpdGUoKSwgX2FyZW5hX3B0cl8oTlVMTCkgeworICBTaGFyZWRDdG9yKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb25zdHJ1Y3Rvcjpjb2JhbHQuc3RvcmFnZS5Mb2NhbFN0b3JhZ2UpCit9CisKK3ZvaWQgTG9jYWxTdG9yYWdlOjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7CisgIF9pc19kZWZhdWx0X2luc3RhbmNlXyA9IHRydWU7Cit9CisKK0xvY2FsU3RvcmFnZTo6TG9jYWxTdG9yYWdlKGNvbnN0IExvY2FsU3RvcmFnZSYgZnJvbSkKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VMaXRlKCksCisgICAgX2FyZW5hX3B0cl8oTlVMTCkgeworICBTaGFyZWRDdG9yKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvcHlfY29uc3RydWN0b3I6Y29iYWx0LnN0b3JhZ2UuTG9jYWxTdG9yYWdlKQorfQorCit2b2lkIExvY2FsU3RvcmFnZTo6U2hhcmVkQ3RvcigpIHsKKyAgICBfaXNfZGVmYXVsdF9pbnN0YW5jZV8gPSBmYWxzZTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmcoKTsKKyAgX2NhY2hlZF9zaXplXyA9IDA7CisgIGlkXy5VbnNhZmVTZXREZWZhdWx0KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CisKK0xvY2FsU3RvcmFnZTo6fkxvY2FsU3RvcmFnZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGRlc3RydWN0b3I6Y29iYWx0LnN0b3JhZ2UuTG9jYWxTdG9yYWdlKQorICBTaGFyZWREdG9yKCk7Cit9CisKK3ZvaWQgTG9jYWxTdG9yYWdlOjpTaGFyZWREdG9yKCkgeworICBpZF8uRGVzdHJveU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKKyAgI2lmZGVmIEdPT0dMRV9QUk9UT0JVRl9OT19TVEFUSUNfSU5JVElBTElaRVIKKyAgaWYgKHRoaXMgIT0gJmRlZmF1bHRfaW5zdGFuY2UoKSkgeworICAjZWxzZQorICBpZiAodGhpcyAhPSBkZWZhdWx0X2luc3RhbmNlXykgeworICAjZW5kaWYKKyAgfQorfQorCit2b2lkIExvY2FsU3RvcmFnZTo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgeworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOworICBfY2FjaGVkX3NpemVfID0gc2l6ZTsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Cit9Citjb25zdCBMb2NhbFN0b3JhZ2UmIExvY2FsU3RvcmFnZTo6ZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyNpZmRlZiBHT09HTEVfUFJPVE9CVUZfTk9fU1RBVElDX0lOSVRJQUxJWkVSCisgIHByb3RvYnVmX0FkZERlc2Nfc3RvcmFnZV8yZXByb3RvKCk7CisjZWxzZQorICBpZiAoZGVmYXVsdF9pbnN0YW5jZV8gPT0gTlVMTCkgcHJvdG9idWZfQWRkRGVzY19zdG9yYWdlXzJlcHJvdG8oKTsKKyNlbmRpZgorICByZXR1cm4gKmRlZmF1bHRfaW5zdGFuY2VfOworfQorCitMb2NhbFN0b3JhZ2UqIExvY2FsU3RvcmFnZTo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBOVUxMOworCitMb2NhbFN0b3JhZ2UqIExvY2FsU3RvcmFnZTo6TmV3KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSBjb25zdCB7CisgIExvY2FsU3RvcmFnZSogbiA9IG5ldyBMb2NhbFN0b3JhZ2U7CisgIGlmIChhcmVuYSAhPSBOVUxMKSB7CisgICAgYXJlbmEtPk93bihuKTsKKyAgfQorICByZXR1cm4gbjsKK30KKwordm9pZCBMb2NhbFN0b3JhZ2U6OkNsZWFyKCkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfY2xlYXJfc3RhcnQ6Y29iYWx0LnN0b3JhZ2UuTG9jYWxTdG9yYWdlKQorICBpZF8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworICBsb2NhbF9zdG9yYWdlX2VudHJpZXNfLkNsZWFyKCk7Cit9CisKK2Jvb2wgTG9jYWxTdG9yYWdlOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKKyNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghR09PR0xFX1BSRURJQ1RfVFJVRShFWFBSRVNTSU9OKSkgZ290byBmYWlsdXJlCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHRhZzsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX3N0YXJ0OmNvYmFsdC5zdG9yYWdlLkxvY2FsU3RvcmFnZSkKKyAgZm9yICg7OykgeworICAgIDo6c3RkOjpwYWlyPCA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiwgYm9vbD4gcCA9IGlucHV0LT5SZWFkVGFnV2l0aEN1dG9mZigxMjcpOworICAgIHRhZyA9IHAuZmlyc3Q7CisgICAgaWYgKCFwLnNlY29uZCkgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7CisgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgaWQgPSAxOworICAgICAgY2FzZSAxOiB7CisgICAgICAgIGlmICh0YWcgPT0gMTApIHsKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCisgICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfaWQoKSkpOworICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VmVyaWZ5VXRmOFN0cmluZygKKyAgICAgICAgICAgIHRoaXMtPmlkKCkuZGF0YSgpLCB0aGlzLT5pZCgpLmxlbmd0aCgpLAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlBBUlNFLAorICAgICAgICAgICAgImNvYmFsdC5zdG9yYWdlLkxvY2FsU3RvcmFnZS5pZCIpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDE4KSkgZ290byBwYXJzZV9sb2NhbF9zdG9yYWdlX2VudHJpZXM7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyByZXBlYXRlZCAuY29iYWx0LnN0b3JhZ2UuTG9jYWxTdG9yYWdlRW50cnkgbG9jYWxfc3RvcmFnZV9lbnRyaWVzID0gMjsKKyAgICAgIGNhc2UgMjogeworICAgICAgICBpZiAodGFnID09IDE4KSB7CisgICAgICAgICBwYXJzZV9sb2NhbF9zdG9yYWdlX2VudHJpZXM6CisgICAgICAgICAgRE9fKGlucHV0LT5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKTsKKyAgICAgICAgIHBhcnNlX2xvb3BfbG9jYWxfc3RvcmFnZV9lbnRyaWVzOgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWxOb1JlY3Vyc2lvbkRlcHRoKAorICAgICAgICAgICAgICAgIGlucHV0LCBhZGRfbG9jYWxfc3RvcmFnZV9lbnRyaWVzKCkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDE4KSkgZ290byBwYXJzZV9sb29wX2xvY2FsX3N0b3JhZ2VfZW50cmllczsKKyAgICAgICAgaW5wdXQtPlVuc2FmZURlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgZ290byBzdWNjZXNzOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgZGVmYXVsdDogeworICAgICAgaGFuZGxlX3VudXN1YWw6CisgICAgICAgIGlmICh0YWcgPT0gMCB8fAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKKyAgICAgICAgICBnb3RvIHN1Y2Nlc3M7CisgICAgICAgIH0KKyAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTa2lwRmllbGQoaW5wdXQsIHRhZykpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KK3N1Y2Nlc3M6CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9zdWNjZXNzOmNvYmFsdC5zdG9yYWdlLkxvY2FsU3RvcmFnZSkKKyAgcmV0dXJuIHRydWU7CitmYWlsdXJlOgorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2VfZmFpbHVyZTpjb2JhbHQuc3RvcmFnZS5Mb2NhbFN0b3JhZ2UpCisgIHJldHVybiBmYWxzZTsKKyN1bmRlZiBET18KK30KKwordm9pZCBMb2NhbFN0b3JhZ2U6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfc3RhcnQ6Y29iYWx0LnN0b3JhZ2UuTG9jYWxTdG9yYWdlKQorICAvLyBvcHRpb25hbCBzdHJpbmcgaWQgPSAxOworICBpZiAodGhpcy0+aWQoKS5zaXplKCkgPiAwKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlZlcmlmeVV0ZjhTdHJpbmcoCisgICAgICB0aGlzLT5pZCgpLmRhdGEoKSwgdGhpcy0+aWQoKS5sZW5ndGgoKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTRVJJQUxJWkUsCisgICAgICAiY29iYWx0LnN0b3JhZ2UuTG9jYWxTdG9yYWdlLmlkIik7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nTWF5YmVBbGlhc2VkKAorICAgICAgMSwgdGhpcy0+aWQoKSwgb3V0cHV0KTsKKyAgfQorCisgIC8vIHJlcGVhdGVkIC5jb2JhbHQuc3RvcmFnZS5Mb2NhbFN0b3JhZ2VFbnRyeSBsb2NhbF9zdG9yYWdlX2VudHJpZXMgPSAyOworICBmb3IgKHVuc2lnbmVkIGludCBpID0gMCwgbiA9IHRoaXMtPmxvY2FsX3N0b3JhZ2VfZW50cmllc19zaXplKCk7IGkgPCBuOyBpKyspIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlKAorICAgICAgMiwgdGhpcy0+bG9jYWxfc3RvcmFnZV9lbnRyaWVzKGkpLCBvdXRwdXQpOworICB9CisKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV9lbmQ6Y29iYWx0LnN0b3JhZ2UuTG9jYWxTdG9yYWdlKQorfQorCitpbnQgTG9jYWxTdG9yYWdlOjpCeXRlU2l6ZSgpIGNvbnN0IHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2J5dGVfc2l6ZV9zdGFydDpjb2JhbHQuc3RvcmFnZS5Mb2NhbFN0b3JhZ2UpCisgIGludCB0b3RhbF9zaXplID0gMDsKKworICAvLyBvcHRpb25hbCBzdHJpbmcgaWQgPSAxOworICBpZiAodGhpcy0+aWQoKS5zaXplKCkgPiAwKSB7CisgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICB0aGlzLT5pZCgpKTsKKyAgfQorCisgIC8vIHJlcGVhdGVkIC5jb2JhbHQuc3RvcmFnZS5Mb2NhbFN0b3JhZ2VFbnRyeSBsb2NhbF9zdG9yYWdlX2VudHJpZXMgPSAyOworICB0b3RhbF9zaXplICs9IDEgKiB0aGlzLT5sb2NhbF9zdG9yYWdlX2VudHJpZXNfc2l6ZSgpOworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmxvY2FsX3N0b3JhZ2VfZW50cmllc19zaXplKCk7IGkrKykgeworICAgIHRvdGFsX3NpemUgKz0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKKyAgICAgICAgdGhpcy0+bG9jYWxfc3RvcmFnZV9lbnRyaWVzKGkpKTsKKyAgfQorCisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CisgIF9jYWNoZWRfc2l6ZV8gPSB0b3RhbF9zaXplOworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKKyAgcmV0dXJuIHRvdGFsX3NpemU7Cit9CisKK3ZvaWQgTG9jYWxTdG9yYWdlOjpDaGVja1R5cGVBbmRNZXJnZUZyb20oCisgICAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlTGl0ZSYgZnJvbSkgeworICBNZXJnZUZyb20oKjo6Z29vZ2xlOjpwcm90b2J1Zjo6ZG93bl9jYXN0PGNvbnN0IExvY2FsU3RvcmFnZSo+KCZmcm9tKSk7Cit9CisKK3ZvaWQgTG9jYWxTdG9yYWdlOjpNZXJnZUZyb20oY29uc3QgTG9jYWxTdG9yYWdlJiBmcm9tKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfbWVyZ2VfZnJvbV9zdGFydDpjb2JhbHQuc3RvcmFnZS5Mb2NhbFN0b3JhZ2UpCisgIGlmIChHT09HTEVfUFJFRElDVF9GQUxTRSgmZnJvbSA9PSB0aGlzKSkgTWVyZ2VGcm9tRmFpbChfX0xJTkVfXyk7CisgIGxvY2FsX3N0b3JhZ2VfZW50cmllc18uTWVyZ2VGcm9tKGZyb20ubG9jYWxfc3RvcmFnZV9lbnRyaWVzXyk7CisgIGlmIChmcm9tLmlkKCkuc2l6ZSgpID4gMCkgeworCisgICAgaWRfLkFzc2lnbldpdGhEZWZhdWx0KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgZnJvbS5pZF8pOworICB9Cit9CisKK3ZvaWQgTG9jYWxTdG9yYWdlOjpDb3B5RnJvbShjb25zdCBMb2NhbFN0b3JhZ2UmIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19jb3B5X2Zyb21fc3RhcnQ6Y29iYWx0LnN0b3JhZ2UuTG9jYWxTdG9yYWdlKQorICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK2Jvb2wgTG9jYWxTdG9yYWdlOjpJc0luaXRpYWxpemVkKCkgY29uc3QgeworCisgIHJldHVybiB0cnVlOworfQorCit2b2lkIExvY2FsU3RvcmFnZTo6U3dhcChMb2NhbFN0b3JhZ2UqIG90aGVyKSB7CisgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgIEludGVybmFsU3dhcChvdGhlcik7Cit9Cit2b2lkIExvY2FsU3RvcmFnZTo6SW50ZXJuYWxTd2FwKExvY2FsU3RvcmFnZSogb3RoZXIpIHsKKyAgaWRfLlN3YXAoJm90aGVyLT5pZF8pOworICBsb2NhbF9zdG9yYWdlX2VudHJpZXNfLlVuc2FmZUFyZW5hU3dhcCgmb3RoZXItPmxvY2FsX3N0b3JhZ2VfZW50cmllc18pOworICBfdW5rbm93bl9maWVsZHNfLlN3YXAoJm90aGVyLT5fdW5rbm93bl9maWVsZHNfKTsKKyAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKK30KKworOjpzdGQ6OnN0cmluZyBMb2NhbFN0b3JhZ2U6OkdldFR5cGVOYW1lKCkgY29uc3QgeworICByZXR1cm4gImNvYmFsdC5zdG9yYWdlLkxvY2FsU3RvcmFnZSI7Cit9CisKKyNpZiBQUk9UT0JVRl9JTkxJTkVfTk9UX0lOX0hFQURFUlMKKy8vIExvY2FsU3RvcmFnZQorCisvLyBvcHRpb25hbCBzdHJpbmcgaWQgPSAxOwordm9pZCBMb2NhbFN0b3JhZ2U6OmNsZWFyX2lkKCkgeworICBpZF8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQorIGNvbnN0IDo6c3RkOjpzdHJpbmcmIExvY2FsU3RvcmFnZTo6aWQoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Y29iYWx0LnN0b3JhZ2UuTG9jYWxTdG9yYWdlLmlkKQorICByZXR1cm4gaWRfLkdldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KKyB2b2lkIExvY2FsU3RvcmFnZTo6c2V0X2lkKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIAorICBpZF8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpjb2JhbHQuc3RvcmFnZS5Mb2NhbFN0b3JhZ2UuaWQpCit9Cisgdm9pZCBMb2NhbFN0b3JhZ2U6OnNldF9pZChjb25zdCBjaGFyKiB2YWx1ZSkgeworICAKKyAgaWRfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpjb2JhbHQuc3RvcmFnZS5Mb2NhbFN0b3JhZ2UuaWQpCit9Cisgdm9pZCBMb2NhbFN0b3JhZ2U6OnNldF9pZChjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgCisgIGlkXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwKKyAgICAgIDo6c3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpjb2JhbHQuc3RvcmFnZS5Mb2NhbFN0b3JhZ2UuaWQpCit9CisgOjpzdGQ6OnN0cmluZyogTG9jYWxTdG9yYWdlOjptdXRhYmxlX2lkKCkgeworICAKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Y29iYWx0LnN0b3JhZ2UuTG9jYWxTdG9yYWdlLmlkKQorICByZXR1cm4gaWRfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CisgOjpzdGQ6OnN0cmluZyogTG9jYWxTdG9yYWdlOjpyZWxlYXNlX2lkKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpjb2JhbHQuc3RvcmFnZS5Mb2NhbFN0b3JhZ2UuaWQpCisgIAorICByZXR1cm4gaWRfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9Cisgdm9pZCBMb2NhbFN0b3JhZ2U6OnNldF9hbGxvY2F0ZWRfaWQoOjpzdGQ6OnN0cmluZyogaWQpIHsKKyAgaWYgKGlkICE9IE5VTEwpIHsKKyAgICAKKyAgfSBlbHNlIHsKKyAgICAKKyAgfQorICBpZF8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIGlkKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Y29iYWx0LnN0b3JhZ2UuTG9jYWxTdG9yYWdlLmlkKQorfQorCisvLyByZXBlYXRlZCAuY29iYWx0LnN0b3JhZ2UuTG9jYWxTdG9yYWdlRW50cnkgbG9jYWxfc3RvcmFnZV9lbnRyaWVzID0gMjsKK2ludCBMb2NhbFN0b3JhZ2U6OmxvY2FsX3N0b3JhZ2VfZW50cmllc19zaXplKCkgY29uc3QgeworICByZXR1cm4gbG9jYWxfc3RvcmFnZV9lbnRyaWVzXy5zaXplKCk7Cit9Cit2b2lkIExvY2FsU3RvcmFnZTo6Y2xlYXJfbG9jYWxfc3RvcmFnZV9lbnRyaWVzKCkgeworICBsb2NhbF9zdG9yYWdlX2VudHJpZXNfLkNsZWFyKCk7Cit9Citjb25zdCA6OmNvYmFsdDo6c3RvcmFnZTo6TG9jYWxTdG9yYWdlRW50cnkmIExvY2FsU3RvcmFnZTo6bG9jYWxfc3RvcmFnZV9lbnRyaWVzKGludCBpbmRleCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0OmNvYmFsdC5zdG9yYWdlLkxvY2FsU3RvcmFnZS5sb2NhbF9zdG9yYWdlX2VudHJpZXMpCisgIHJldHVybiBsb2NhbF9zdG9yYWdlX2VudHJpZXNfLkdldChpbmRleCk7Cit9Cis6OmNvYmFsdDo6c3RvcmFnZTo6TG9jYWxTdG9yYWdlRW50cnkqIExvY2FsU3RvcmFnZTo6bXV0YWJsZV9sb2NhbF9zdG9yYWdlX2VudHJpZXMoaW50IGluZGV4KSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmNvYmFsdC5zdG9yYWdlLkxvY2FsU3RvcmFnZS5sb2NhbF9zdG9yYWdlX2VudHJpZXMpCisgIHJldHVybiBsb2NhbF9zdG9yYWdlX2VudHJpZXNfLk11dGFibGUoaW5kZXgpOworfQorOjpjb2JhbHQ6OnN0b3JhZ2U6OkxvY2FsU3RvcmFnZUVudHJ5KiBMb2NhbFN0b3JhZ2U6OmFkZF9sb2NhbF9zdG9yYWdlX2VudHJpZXMoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Y29iYWx0LnN0b3JhZ2UuTG9jYWxTdG9yYWdlLmxvY2FsX3N0b3JhZ2VfZW50cmllcykKKyAgcmV0dXJuIGxvY2FsX3N0b3JhZ2VfZW50cmllc18uQWRkKCk7Cit9Cis6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Y29iYWx0OjpzdG9yYWdlOjpMb2NhbFN0b3JhZ2VFbnRyeSA+KgorTG9jYWxTdG9yYWdlOjptdXRhYmxlX2xvY2FsX3N0b3JhZ2VfZW50cmllcygpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpjb2JhbHQuc3RvcmFnZS5Mb2NhbFN0b3JhZ2UubG9jYWxfc3RvcmFnZV9lbnRyaWVzKQorICByZXR1cm4gJmxvY2FsX3N0b3JhZ2VfZW50cmllc187Cit9Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Y29iYWx0OjpzdG9yYWdlOjpMb2NhbFN0b3JhZ2VFbnRyeSA+JgorTG9jYWxTdG9yYWdlOjpsb2NhbF9zdG9yYWdlX2VudHJpZXMoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0OmNvYmFsdC5zdG9yYWdlLkxvY2FsU3RvcmFnZS5sb2NhbF9zdG9yYWdlX2VudHJpZXMpCisgIHJldHVybiBsb2NhbF9zdG9yYWdlX2VudHJpZXNfOworfQorCisjZW5kaWYgIC8vIFBST1RPQlVGX0lOTElORV9OT1RfSU5fSEVBREVSUworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPj0gMTkwMAorY29uc3QgaW50IFN0b3JhZ2U6OmtDb29raWVzRmllbGROdW1iZXI7Citjb25zdCBpbnQgU3RvcmFnZTo6a0xvY2FsU3RvcmFnZXNGaWVsZE51bWJlcjsKKyNlbmRpZiAgLy8gIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKKworU3RvcmFnZTo6U3RvcmFnZSgpCisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlTGl0ZSgpLCBfYXJlbmFfcHRyXyhOVUxMKSB7CisgIFNoYXJlZEN0b3IoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvbnN0cnVjdG9yOmNvYmFsdC5zdG9yYWdlLlN0b3JhZ2UpCit9CisKK3ZvaWQgU3RvcmFnZTo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkgeworICBfaXNfZGVmYXVsdF9pbnN0YW5jZV8gPSB0cnVlOworfQorCitTdG9yYWdlOjpTdG9yYWdlKGNvbnN0IFN0b3JhZ2UmIGZyb20pCisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlTGl0ZSgpLAorICAgIF9hcmVuYV9wdHJfKE5VTEwpIHsKKyAgU2hhcmVkQ3RvcigpOworICBNZXJnZUZyb20oZnJvbSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb3B5X2NvbnN0cnVjdG9yOmNvYmFsdC5zdG9yYWdlLlN0b3JhZ2UpCit9CisKK3ZvaWQgU3RvcmFnZTo6U2hhcmVkQ3RvcigpIHsKKyAgICBfaXNfZGVmYXVsdF9pbnN0YW5jZV8gPSBmYWxzZTsKKyAgX2NhY2hlZF9zaXplXyA9IDA7Cit9CisKK1N0b3JhZ2U6On5TdG9yYWdlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZGVzdHJ1Y3Rvcjpjb2JhbHQuc3RvcmFnZS5TdG9yYWdlKQorICBTaGFyZWREdG9yKCk7Cit9CisKK3ZvaWQgU3RvcmFnZTo6U2hhcmVkRHRvcigpIHsKKyAgI2lmZGVmIEdPT0dMRV9QUk9UT0JVRl9OT19TVEFUSUNfSU5JVElBTElaRVIKKyAgaWYgKHRoaXMgIT0gJmRlZmF1bHRfaW5zdGFuY2UoKSkgeworICAjZWxzZQorICBpZiAodGhpcyAhPSBkZWZhdWx0X2luc3RhbmNlXykgeworICAjZW5kaWYKKyAgfQorfQorCit2b2lkIFN0b3JhZ2U6OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKKyAgX2NhY2hlZF9zaXplXyA9IHNpemU7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOworfQorY29uc3QgU3RvcmFnZSYgU3RvcmFnZTo6ZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyNpZmRlZiBHT09HTEVfUFJPVE9CVUZfTk9fU1RBVElDX0lOSVRJQUxJWkVSCisgIHByb3RvYnVmX0FkZERlc2Nfc3RvcmFnZV8yZXByb3RvKCk7CisjZWxzZQorICBpZiAoZGVmYXVsdF9pbnN0YW5jZV8gPT0gTlVMTCkgcHJvdG9idWZfQWRkRGVzY19zdG9yYWdlXzJlcHJvdG8oKTsKKyNlbmRpZgorICByZXR1cm4gKmRlZmF1bHRfaW5zdGFuY2VfOworfQorCitTdG9yYWdlKiBTdG9yYWdlOjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7CisKK1N0b3JhZ2UqIFN0b3JhZ2U6Ok5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3QgeworICBTdG9yYWdlKiBuID0gbmV3IFN0b3JhZ2U7CisgIGlmIChhcmVuYSAhPSBOVUxMKSB7CisgICAgYXJlbmEtPk93bihuKTsKKyAgfQorICByZXR1cm4gbjsKK30KKwordm9pZCBTdG9yYWdlOjpDbGVhcigpIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2NsZWFyX3N0YXJ0OmNvYmFsdC5zdG9yYWdlLlN0b3JhZ2UpCisgIGNvb2tpZXNfLkNsZWFyKCk7CisgIGxvY2FsX3N0b3JhZ2VzXy5DbGVhcigpOworfQorCitib29sIFN0b3JhZ2U6Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgeworI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCFHT09HTEVfUFJFRElDVF9UUlVFKEVYUFJFU1NJT04pKSBnb3RvIGZhaWx1cmUKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3RhcnQ6Y29iYWx0LnN0b3JhZ2UuU3RvcmFnZSkKKyAgZm9yICg7OykgeworICAgIDo6c3RkOjpwYWlyPCA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiwgYm9vbD4gcCA9IGlucHV0LT5SZWFkVGFnV2l0aEN1dG9mZigxMjcpOworICAgIHRhZyA9IHAuZmlyc3Q7CisgICAgaWYgKCFwLnNlY29uZCkgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7CisgICAgICAvLyByZXBlYXRlZCAuY29iYWx0LnN0b3JhZ2UuQ29va2llIGNvb2tpZXMgPSAxOworICAgICAgY2FzZSAxOiB7CisgICAgICAgIGlmICh0YWcgPT0gMTApIHsKKyAgICAgICAgICBET18oaW5wdXQtPkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpOworICAgICAgICAgcGFyc2VfbG9vcF9jb29raWVzOgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWxOb1JlY3Vyc2lvbkRlcHRoKAorICAgICAgICAgICAgICAgIGlucHV0LCBhZGRfY29va2llcygpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxMCkpIGdvdG8gcGFyc2VfbG9vcF9jb29raWVzOworICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxOCkpIGdvdG8gcGFyc2VfbG9vcF9sb2NhbF9zdG9yYWdlczsKKyAgICAgICAgaW5wdXQtPlVuc2FmZURlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyByZXBlYXRlZCAuY29iYWx0LnN0b3JhZ2UuTG9jYWxTdG9yYWdlIGxvY2FsX3N0b3JhZ2VzID0gMjsKKyAgICAgIGNhc2UgMjogeworICAgICAgICBpZiAodGFnID09IDE4KSB7CisgICAgICAgICAgRE9fKGlucHV0LT5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKTsKKyAgICAgICAgIHBhcnNlX2xvb3BfbG9jYWxfc3RvcmFnZXM6CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbE5vUmVjdXJzaW9uRGVwdGgoCisgICAgICAgICAgICAgICAgaW5wdXQsIGFkZF9sb2NhbF9zdG9yYWdlcygpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxOCkpIGdvdG8gcGFyc2VfbG9vcF9sb2NhbF9zdG9yYWdlczsKKyAgICAgICAgaW5wdXQtPlVuc2FmZURlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgZ290byBzdWNjZXNzOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgZGVmYXVsdDogeworICAgICAgaGFuZGxlX3VudXN1YWw6CisgICAgICAgIGlmICh0YWcgPT0gMCB8fAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKKyAgICAgICAgICBnb3RvIHN1Y2Nlc3M7CisgICAgICAgIH0KKyAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTa2lwRmllbGQoaW5wdXQsIHRhZykpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KK3N1Y2Nlc3M6CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9zdWNjZXNzOmNvYmFsdC5zdG9yYWdlLlN0b3JhZ2UpCisgIHJldHVybiB0cnVlOworZmFpbHVyZToKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX2ZhaWx1cmU6Y29iYWx0LnN0b3JhZ2UuU3RvcmFnZSkKKyAgcmV0dXJuIGZhbHNlOworI3VuZGVmIERPXworfQorCit2b2lkIFN0b3JhZ2U6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfc3RhcnQ6Y29iYWx0LnN0b3JhZ2UuU3RvcmFnZSkKKyAgLy8gcmVwZWF0ZWQgLmNvYmFsdC5zdG9yYWdlLkNvb2tpZSBjb29raWVzID0gMTsKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDAsIG4gPSB0aGlzLT5jb29raWVzX3NpemUoKTsgaSA8IG47IGkrKykgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2UoCisgICAgICAxLCB0aGlzLT5jb29raWVzKGkpLCBvdXRwdXQpOworICB9CisKKyAgLy8gcmVwZWF0ZWQgLmNvYmFsdC5zdG9yYWdlLkxvY2FsU3RvcmFnZSBsb2NhbF9zdG9yYWdlcyA9IDI7CisgIGZvciAodW5zaWduZWQgaW50IGkgPSAwLCBuID0gdGhpcy0+bG9jYWxfc3RvcmFnZXNfc2l6ZSgpOyBpIDwgbjsgaSsrKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZSgKKyAgICAgIDIsIHRoaXMtPmxvY2FsX3N0b3JhZ2VzKGkpLCBvdXRwdXQpOworICB9CisKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV9lbmQ6Y29iYWx0LnN0b3JhZ2UuU3RvcmFnZSkKK30KKworaW50IFN0b3JhZ2U6OkJ5dGVTaXplKCkgY29uc3QgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfYnl0ZV9zaXplX3N0YXJ0OmNvYmFsdC5zdG9yYWdlLlN0b3JhZ2UpCisgIGludCB0b3RhbF9zaXplID0gMDsKKworICAvLyByZXBlYXRlZCAuY29iYWx0LnN0b3JhZ2UuQ29va2llIGNvb2tpZXMgPSAxOworICB0b3RhbF9zaXplICs9IDEgKiB0aGlzLT5jb29raWVzX3NpemUoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5jb29raWVzX3NpemUoKTsgaSsrKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAorICAgICAgICB0aGlzLT5jb29raWVzKGkpKTsKKyAgfQorCisgIC8vIHJlcGVhdGVkIC5jb2JhbHQuc3RvcmFnZS5Mb2NhbFN0b3JhZ2UgbG9jYWxfc3RvcmFnZXMgPSAyOworICB0b3RhbF9zaXplICs9IDEgKiB0aGlzLT5sb2NhbF9zdG9yYWdlc19zaXplKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+bG9jYWxfc3RvcmFnZXNfc2l6ZSgpOyBpKyspIHsKKyAgICB0b3RhbF9zaXplICs9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemVOb1ZpcnR1YWwoCisgICAgICAgIHRoaXMtPmxvY2FsX3N0b3JhZ2VzKGkpKTsKKyAgfQorCisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CisgIF9jYWNoZWRfc2l6ZV8gPSB0b3RhbF9zaXplOworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKKyAgcmV0dXJuIHRvdGFsX3NpemU7Cit9CisKK3ZvaWQgU3RvcmFnZTo6Q2hlY2tUeXBlQW5kTWVyZ2VGcm9tKAorICAgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUxpdGUmIGZyb20pIHsKKyAgTWVyZ2VGcm9tKCo6Omdvb2dsZTo6cHJvdG9idWY6OmRvd25fY2FzdDxjb25zdCBTdG9yYWdlKj4oJmZyb20pKTsKK30KKwordm9pZCBTdG9yYWdlOjpNZXJnZUZyb20oY29uc3QgU3RvcmFnZSYgZnJvbSkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX21lcmdlX2Zyb21fc3RhcnQ6Y29iYWx0LnN0b3JhZ2UuU3RvcmFnZSkKKyAgaWYgKEdPT0dMRV9QUkVESUNUX0ZBTFNFKCZmcm9tID09IHRoaXMpKSBNZXJnZUZyb21GYWlsKF9fTElORV9fKTsKKyAgY29va2llc18uTWVyZ2VGcm9tKGZyb20uY29va2llc18pOworICBsb2NhbF9zdG9yYWdlc18uTWVyZ2VGcm9tKGZyb20ubG9jYWxfc3RvcmFnZXNfKTsKK30KKwordm9pZCBTdG9yYWdlOjpDb3B5RnJvbShjb25zdCBTdG9yYWdlJiBmcm9tKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfY29weV9mcm9tX3N0YXJ0OmNvYmFsdC5zdG9yYWdlLlN0b3JhZ2UpCisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKworYm9vbCBTdG9yYWdlOjpJc0luaXRpYWxpemVkKCkgY29uc3QgeworCisgIHJldHVybiB0cnVlOworfQorCit2b2lkIFN0b3JhZ2U6OlN3YXAoU3RvcmFnZSogb3RoZXIpIHsKKyAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgSW50ZXJuYWxTd2FwKG90aGVyKTsKK30KK3ZvaWQgU3RvcmFnZTo6SW50ZXJuYWxTd2FwKFN0b3JhZ2UqIG90aGVyKSB7CisgIGNvb2tpZXNfLlVuc2FmZUFyZW5hU3dhcCgmb3RoZXItPmNvb2tpZXNfKTsKKyAgbG9jYWxfc3RvcmFnZXNfLlVuc2FmZUFyZW5hU3dhcCgmb3RoZXItPmxvY2FsX3N0b3JhZ2VzXyk7CisgIF91bmtub3duX2ZpZWxkc18uU3dhcCgmb3RoZXItPl91bmtub3duX2ZpZWxkc18pOworICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOworfQorCis6OnN0ZDo6c3RyaW5nIFN0b3JhZ2U6OkdldFR5cGVOYW1lKCkgY29uc3QgeworICByZXR1cm4gImNvYmFsdC5zdG9yYWdlLlN0b3JhZ2UiOworfQorCisjaWYgUFJPVE9CVUZfSU5MSU5FX05PVF9JTl9IRUFERVJTCisvLyBTdG9yYWdlCisKKy8vIHJlcGVhdGVkIC5jb2JhbHQuc3RvcmFnZS5Db29raWUgY29va2llcyA9IDE7CitpbnQgU3RvcmFnZTo6Y29va2llc19zaXplKCkgY29uc3QgeworICByZXR1cm4gY29va2llc18uc2l6ZSgpOworfQordm9pZCBTdG9yYWdlOjpjbGVhcl9jb29raWVzKCkgeworICBjb29raWVzXy5DbGVhcigpOworfQorY29uc3QgOjpjb2JhbHQ6OnN0b3JhZ2U6OkNvb2tpZSYgU3RvcmFnZTo6Y29va2llcyhpbnQgaW5kZXgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpjb2JhbHQuc3RvcmFnZS5TdG9yYWdlLmNvb2tpZXMpCisgIHJldHVybiBjb29raWVzXy5HZXQoaW5kZXgpOworfQorOjpjb2JhbHQ6OnN0b3JhZ2U6OkNvb2tpZSogU3RvcmFnZTo6bXV0YWJsZV9jb29raWVzKGludCBpbmRleCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpjb2JhbHQuc3RvcmFnZS5TdG9yYWdlLmNvb2tpZXMpCisgIHJldHVybiBjb29raWVzXy5NdXRhYmxlKGluZGV4KTsKK30KKzo6Y29iYWx0OjpzdG9yYWdlOjpDb29raWUqIFN0b3JhZ2U6OmFkZF9jb29raWVzKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmNvYmFsdC5zdG9yYWdlLlN0b3JhZ2UuY29va2llcykKKyAgcmV0dXJuIGNvb2tpZXNfLkFkZCgpOworfQorOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OmNvYmFsdDo6c3RvcmFnZTo6Q29va2llID4qCitTdG9yYWdlOjptdXRhYmxlX2Nvb2tpZXMoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Y29iYWx0LnN0b3JhZ2UuU3RvcmFnZS5jb29raWVzKQorICByZXR1cm4gJmNvb2tpZXNfOworfQorY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OmNvYmFsdDo6c3RvcmFnZTo6Q29va2llID4mCitTdG9yYWdlOjpjb29raWVzKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpjb2JhbHQuc3RvcmFnZS5TdG9yYWdlLmNvb2tpZXMpCisgIHJldHVybiBjb29raWVzXzsKK30KKworLy8gcmVwZWF0ZWQgLmNvYmFsdC5zdG9yYWdlLkxvY2FsU3RvcmFnZSBsb2NhbF9zdG9yYWdlcyA9IDI7CitpbnQgU3RvcmFnZTo6bG9jYWxfc3RvcmFnZXNfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGxvY2FsX3N0b3JhZ2VzXy5zaXplKCk7Cit9Cit2b2lkIFN0b3JhZ2U6OmNsZWFyX2xvY2FsX3N0b3JhZ2VzKCkgeworICBsb2NhbF9zdG9yYWdlc18uQ2xlYXIoKTsKK30KK2NvbnN0IDo6Y29iYWx0OjpzdG9yYWdlOjpMb2NhbFN0b3JhZ2UmIFN0b3JhZ2U6OmxvY2FsX3N0b3JhZ2VzKGludCBpbmRleCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0OmNvYmFsdC5zdG9yYWdlLlN0b3JhZ2UubG9jYWxfc3RvcmFnZXMpCisgIHJldHVybiBsb2NhbF9zdG9yYWdlc18uR2V0KGluZGV4KTsKK30KKzo6Y29iYWx0OjpzdG9yYWdlOjpMb2NhbFN0b3JhZ2UqIFN0b3JhZ2U6Om11dGFibGVfbG9jYWxfc3RvcmFnZXMoaW50IGluZGV4KSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmNvYmFsdC5zdG9yYWdlLlN0b3JhZ2UubG9jYWxfc3RvcmFnZXMpCisgIHJldHVybiBsb2NhbF9zdG9yYWdlc18uTXV0YWJsZShpbmRleCk7Cit9Cis6OmNvYmFsdDo6c3RvcmFnZTo6TG9jYWxTdG9yYWdlKiBTdG9yYWdlOjphZGRfbG9jYWxfc3RvcmFnZXMoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Y29iYWx0LnN0b3JhZ2UuU3RvcmFnZS5sb2NhbF9zdG9yYWdlcykKKyAgcmV0dXJuIGxvY2FsX3N0b3JhZ2VzXy5BZGQoKTsKK30KKzo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpjb2JhbHQ6OnN0b3JhZ2U6OkxvY2FsU3RvcmFnZSA+KgorU3RvcmFnZTo6bXV0YWJsZV9sb2NhbF9zdG9yYWdlcygpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpjb2JhbHQuc3RvcmFnZS5TdG9yYWdlLmxvY2FsX3N0b3JhZ2VzKQorICByZXR1cm4gJmxvY2FsX3N0b3JhZ2VzXzsKK30KK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpjb2JhbHQ6OnN0b3JhZ2U6OkxvY2FsU3RvcmFnZSA+JgorU3RvcmFnZTo6bG9jYWxfc3RvcmFnZXMoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0OmNvYmFsdC5zdG9yYWdlLlN0b3JhZ2UubG9jYWxfc3RvcmFnZXMpCisgIHJldHVybiBsb2NhbF9zdG9yYWdlc187Cit9CisKKyNlbmRpZiAgLy8gUFJPVE9CVUZfSU5MSU5FX05PVF9JTl9IRUFERVJTCisKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChuYW1lc3BhY2Vfc2NvcGUpCisKK30gIC8vIG5hbWVzcGFjZSBzdG9yYWdlCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnbG9iYWxfc2NvcGUpCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3N0b3JhZ2Uvc3RvcmUvc3RvcmFnZS5wYi5oIGIvc3JjL2NvYmFsdC9zdG9yYWdlL3N0b3JlL3N0b3JhZ2UucGIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTBhMjlhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9zdG9yYWdlL3N0b3JlL3N0b3JhZ2UucGIuaApAQCAtMCwwICsxLDEwNDQgQEAKKy8vIEdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbXBpbGVyLiAgRE8gTk9UIEVESVQhCisvLyBzb3VyY2U6IHN0b3JhZ2UucHJvdG8KKworI2lmbmRlZiBQUk9UT0JVRl9zdG9yYWdlXzJlcHJvdG9fX0lOQ0xVREVECisjZGVmaW5lIFBST1RPQlVGX3N0b3JhZ2VfMmVwcm90b19fSU5DTFVERUQKKworI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKworI2lmIEdPT0dMRV9QUk9UT0JVRl9WRVJTSU9OIDwgMzAwMDAwMAorI2Vycm9yIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IGEgbmV3ZXIgdmVyc2lvbiBvZiBwcm90b2Mgd2hpY2ggaXMKKyNlcnJvciBpbmNvbXBhdGlibGUgd2l0aCB5b3VyIFByb3RvY29sIEJ1ZmZlciBoZWFkZXJzLiAgUGxlYXNlIHVwZGF0ZQorI2Vycm9yIHlvdXIgaGVhZGVycy4KKyNlbmRpZgorI2lmIDMwMDAwMDAgPCBHT09HTEVfUFJPVE9CVUZfTUlOX1BST1RPQ19WRVJTSU9OCisjZXJyb3IgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgYW4gb2xkZXIgdmVyc2lvbiBvZiBwcm90b2Mgd2hpY2ggaXMKKyNlcnJvciBpbmNvbXBhdGlibGUgd2l0aCB5b3VyIFByb3RvY29sIEJ1ZmZlciBoZWFkZXJzLiAgUGxlYXNlCisjZXJyb3IgcmVnZW5lcmF0ZSB0aGlzIGZpbGUgd2l0aCBhIG5ld2VyIHZlcnNpb24gb2YgcHJvdG9jLgorI2VuZGlmCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvYXJlbmEuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvYXJlbmFzdHJpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX2xpdGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5oPgorLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGluY2x1ZGVzKQorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBzdG9yYWdlIHsKKworLy8gSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZGV0YWlsIC0tIGRvIG5vdCBjYWxsIHRoZXNlLgordm9pZCBwcm90b2J1Zl9BZGREZXNjX3N0b3JhZ2VfMmVwcm90bygpOwordm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX3N0b3JhZ2VfMmVwcm90bygpOwordm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfc3RvcmFnZV8yZXByb3RvKCk7CisKK2NsYXNzIENvb2tpZTsKK2NsYXNzIExvY2FsU3RvcmFnZTsKK2NsYXNzIExvY2FsU3RvcmFnZUVudHJ5OworY2xhc3MgU3RvcmFnZTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBDb29raWUgOiBwdWJsaWMgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlTGl0ZSB7CisgcHVibGljOgorICBDb29raWUoKTsKKyAgdmlydHVhbCB+Q29va2llKCk7CisKKyAgQ29va2llKGNvbnN0IENvb2tpZSYgZnJvbSk7CisKKyAgaW5saW5lIENvb2tpZSYgb3BlcmF0b3I9KGNvbnN0IENvb2tpZSYgZnJvbSkgeworICAgIENvcHlGcm9tKGZyb20pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHN0YXRpYyBjb25zdCBDb29raWUmIGRlZmF1bHRfaW5zdGFuY2UoKTsKKworICAjaWZkZWYgR09PR0xFX1BST1RPQlVGX05PX1NUQVRJQ19JTklUSUFMSVpFUgorICAvLyBSZXR1cm5zIHRoZSBpbnRlcm5hbCBkZWZhdWx0IGluc3RhbmNlIHBvaW50ZXIuIFRoaXMgZnVuY3Rpb24gY2FuCisgIC8vIHJldHVybiBOVUxMIHRodXMgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IHRoZSB1c2VyLiBUaGlzIGlzIGludGVuZGVkCisgIC8vIGZvciBQcm90b2J1ZiBpbnRlcm5hbCBjb2RlLiBQbGVhc2UgdXNlIGRlZmF1bHRfaW5zdGFuY2UoKSBkZWNsYXJlZAorICAvLyBhYm92ZSBpbnN0ZWFkLgorICBzdGF0aWMgaW5saW5lIGNvbnN0IENvb2tpZSogaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9pbnN0YW5jZV87CisgIH0KKyAgI2VuZGlmCisKKyAgR09PR0xFX0FUVFJJQlVURV9OT0lOTElORSB2b2lkIFN3YXAoQ29va2llKiBvdGhlcik7CisKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBpbmxpbmUgQ29va2llKiBOZXcoKSBjb25zdCB7IHJldHVybiBOZXcoTlVMTCk7IH0KKworICBDb29raWUqIE5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3Q7CisgIHZvaWQgQ2hlY2tUeXBlQW5kTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUxpdGUmIGZyb20pOworICB2b2lkIENvcHlGcm9tKGNvbnN0IENvb2tpZSYgZnJvbSk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IENvb2tpZSYgZnJvbSk7CisgIHZvaWQgQ2xlYXIoKTsKKyAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7CisKKyAgaW50IEJ5dGVTaXplKCkgY29uc3Q7CisgIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOworICB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OworICB2b2lkIERpc2NhcmRVbmtub3duRmllbGRzKCk7CisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgeyByZXR1cm4gX2NhY2hlZF9zaXplXzsgfQorICBwcml2YXRlOgorICB2b2lkIFNoYXJlZEN0b3IoKTsKKyAgdm9pZCBTaGFyZWREdG9yKCk7CisgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7CisgIHZvaWQgSW50ZXJuYWxTd2FwKENvb2tpZSogb3RoZXIpOworICBwcml2YXRlOgorICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogR2V0QXJlbmFOb1ZpcnR1YWwoKSBjb25zdCB7CisgICAgcmV0dXJuIF9hcmVuYV9wdHJfOworICB9CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBNYXliZUFyZW5hUHRyKCkgY29uc3QgeworICAgIHJldHVybiBfYXJlbmFfcHRyXzsKKyAgfQorICBwdWJsaWM6CisKKyAgOjpzdGQ6OnN0cmluZyBHZXRUeXBlTmFtZSgpIGNvbnN0OworCisgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgIHZvaWQgY2xlYXJfbmFtZSgpOworICBzdGF0aWMgY29uc3QgaW50IGtOYW1lRmllbGROdW1iZXIgPSAxOworICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBuYW1lKCkgY29uc3Q7CisgIHZvaWQgc2V0X25hbWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOworICB2b2lkIHNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX25hbWUoKTsKKyAgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV9uYW1lKCk7CisgIHZvaWQgc2V0X2FsbG9jYXRlZF9uYW1lKDo6c3RkOjpzdHJpbmcqIG5hbWUpOworCisgIC8vIG9wdGlvbmFsIHN0cmluZyB2YWx1ZSA9IDI7CisgIHZvaWQgY2xlYXJfdmFsdWUoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrVmFsdWVGaWVsZE51bWJlciA9IDI7CisgIGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKCkgY29uc3Q7CisgIHZvaWQgc2V0X3ZhbHVlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgdm9pZCBzZXRfdmFsdWUoY29uc3QgY2hhciogdmFsdWUpOworICB2b2lkIHNldF92YWx1ZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX3ZhbHVlKCk7CisgIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2VfdmFsdWUoKTsKKyAgdm9pZCBzZXRfYWxsb2NhdGVkX3ZhbHVlKDo6c3RkOjpzdHJpbmcqIHZhbHVlKTsKKworICAvLyBvcHRpb25hbCBzdHJpbmcgZG9tYWluID0gMzsKKyAgdm9pZCBjbGVhcl9kb21haW4oKTsKKyAgc3RhdGljIGNvbnN0IGludCBrRG9tYWluRmllbGROdW1iZXIgPSAzOworICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBkb21haW4oKSBjb25zdDsKKyAgdm9pZCBzZXRfZG9tYWluKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgdm9pZCBzZXRfZG9tYWluKGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgdm9pZCBzZXRfZG9tYWluKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7CisgIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfZG9tYWluKCk7CisgIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2VfZG9tYWluKCk7CisgIHZvaWQgc2V0X2FsbG9jYXRlZF9kb21haW4oOjpzdGQ6OnN0cmluZyogZG9tYWluKTsKKworICAvLyBvcHRpb25hbCBzdHJpbmcgcGF0aCA9IDQ7CisgIHZvaWQgY2xlYXJfcGF0aCgpOworICBzdGF0aWMgY29uc3QgaW50IGtQYXRoRmllbGROdW1iZXIgPSA0OworICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBwYXRoKCkgY29uc3Q7CisgIHZvaWQgc2V0X3BhdGgoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOworICB2b2lkIHNldF9wYXRoKGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgdm9pZCBzZXRfcGF0aChjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX3BhdGgoKTsKKyAgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV9wYXRoKCk7CisgIHZvaWQgc2V0X2FsbG9jYXRlZF9wYXRoKDo6c3RkOjpzdHJpbmcqIHBhdGgpOworCisgIC8vIG9wdGlvbmFsIGludDY0IGNyZWF0aW9uX3RpbWVfdXMgPSA1OworICB2b2lkIGNsZWFyX2NyZWF0aW9uX3RpbWVfdXMoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrQ3JlYXRpb25UaW1lVXNGaWVsZE51bWJlciA9IDU7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50NjQgY3JlYXRpb25fdGltZV91cygpIGNvbnN0OworICB2b2lkIHNldF9jcmVhdGlvbl90aW1lX3VzKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50NjQgdmFsdWUpOworCisgIC8vIG9wdGlvbmFsIGludDY0IGV4cGlyYXRpb25fdGltZV91cyA9IDY7CisgIHZvaWQgY2xlYXJfZXhwaXJhdGlvbl90aW1lX3VzKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga0V4cGlyYXRpb25UaW1lVXNGaWVsZE51bWJlciA9IDY7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50NjQgZXhwaXJhdGlvbl90aW1lX3VzKCkgY29uc3Q7CisgIHZvaWQgc2V0X2V4cGlyYXRpb25fdGltZV91cyg6Omdvb2dsZTo6cHJvdG9idWY6OmludDY0IHZhbHVlKTsKKworICAvLyBvcHRpb25hbCBpbnQ2NCBsYXN0X2FjY2Vzc190aW1lX3VzID0gNzsKKyAgdm9pZCBjbGVhcl9sYXN0X2FjY2Vzc190aW1lX3VzKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga0xhc3RBY2Nlc3NUaW1lVXNGaWVsZE51bWJlciA9IDc7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50NjQgbGFzdF9hY2Nlc3NfdGltZV91cygpIGNvbnN0OworICB2b2lkIHNldF9sYXN0X2FjY2Vzc190aW1lX3VzKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50NjQgdmFsdWUpOworCisgIC8vIG9wdGlvbmFsIGJvb2wgc2VjdXJlID0gODsKKyAgdm9pZCBjbGVhcl9zZWN1cmUoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrU2VjdXJlRmllbGROdW1iZXIgPSA4OworICBib29sIHNlY3VyZSgpIGNvbnN0OworICB2b2lkIHNldF9zZWN1cmUoYm9vbCB2YWx1ZSk7CisKKyAgLy8gb3B0aW9uYWwgYm9vbCBodHRwX29ubHkgPSA5OworICB2b2lkIGNsZWFyX2h0dHBfb25seSgpOworICBzdGF0aWMgY29uc3QgaW50IGtIdHRwT25seUZpZWxkTnVtYmVyID0gOTsKKyAgYm9vbCBodHRwX29ubHkoKSBjb25zdDsKKyAgdm9pZCBzZXRfaHR0cF9vbmx5KGJvb2wgdmFsdWUpOworCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpjb2JhbHQuc3RvcmFnZS5Db29raWUpCisgcHJpdmF0ZToKKworICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciBfdW5rbm93bl9maWVsZHNfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBfYXJlbmFfcHRyXzsKKworICBib29sIF9pc19kZWZhdWx0X2luc3RhbmNlXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgbmFtZV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyIHZhbHVlXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgZG9tYWluXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgcGF0aF87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50NjQgY3JlYXRpb25fdGltZV91c187CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50NjQgZXhwaXJhdGlvbl90aW1lX3VzXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQ2NCBsYXN0X2FjY2Vzc190aW1lX3VzXzsKKyAgYm9vbCBzZWN1cmVfOworICBib29sIGh0dHBfb25seV87CisgIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87CisgICNpZmRlZiBHT09HTEVfUFJPVE9CVUZfTk9fU1RBVElDX0lOSVRJQUxJWkVSCisgIGZyaWVuZCB2b2lkICBwcm90b2J1Zl9BZGREZXNjX3N0b3JhZ2VfMmVwcm90b19pbXBsKCk7CisgICNlbHNlCisgIGZyaWVuZCB2b2lkICBwcm90b2J1Zl9BZGREZXNjX3N0b3JhZ2VfMmVwcm90bygpOworICAjZW5kaWYKKyAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19zdG9yYWdlXzJlcHJvdG8oKTsKKyAgZnJpZW5kIHZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX3N0b3JhZ2VfMmVwcm90bygpOworCisgIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CisgIHN0YXRpYyBDb29raWUqIGRlZmF1bHRfaW5zdGFuY2VfOworfTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgTG9jYWxTdG9yYWdlRW50cnkgOiBwdWJsaWMgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlTGl0ZSB7CisgcHVibGljOgorICBMb2NhbFN0b3JhZ2VFbnRyeSgpOworICB2aXJ0dWFsIH5Mb2NhbFN0b3JhZ2VFbnRyeSgpOworCisgIExvY2FsU3RvcmFnZUVudHJ5KGNvbnN0IExvY2FsU3RvcmFnZUVudHJ5JiBmcm9tKTsKKworICBpbmxpbmUgTG9jYWxTdG9yYWdlRW50cnkmIG9wZXJhdG9yPShjb25zdCBMb2NhbFN0b3JhZ2VFbnRyeSYgZnJvbSkgeworICAgIENvcHlGcm9tKGZyb20pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHN0YXRpYyBjb25zdCBMb2NhbFN0b3JhZ2VFbnRyeSYgZGVmYXVsdF9pbnN0YW5jZSgpOworCisgICNpZmRlZiBHT09HTEVfUFJPVE9CVUZfTk9fU1RBVElDX0lOSVRJQUxJWkVSCisgIC8vIFJldHVybnMgdGhlIGludGVybmFsIGRlZmF1bHQgaW5zdGFuY2UgcG9pbnRlci4gVGhpcyBmdW5jdGlvbiBjYW4KKyAgLy8gcmV0dXJuIE5VTEwgdGh1cyBzaG91bGQgbm90IGJlIHVzZWQgYnkgdGhlIHVzZXIuIFRoaXMgaXMgaW50ZW5kZWQKKyAgLy8gZm9yIFByb3RvYnVmIGludGVybmFsIGNvZGUuIFBsZWFzZSB1c2UgZGVmYXVsdF9pbnN0YW5jZSgpIGRlY2xhcmVkCisgIC8vIGFib3ZlIGluc3RlYWQuCisgIHN0YXRpYyBpbmxpbmUgY29uc3QgTG9jYWxTdG9yYWdlRW50cnkqIGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfaW5zdGFuY2VfOworICB9CisgICNlbmRpZgorCisgIEdPT0dMRV9BVFRSSUJVVEVfTk9JTkxJTkUgdm9pZCBTd2FwKExvY2FsU3RvcmFnZUVudHJ5KiBvdGhlcik7CisKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBpbmxpbmUgTG9jYWxTdG9yYWdlRW50cnkqIE5ldygpIGNvbnN0IHsgcmV0dXJuIE5ldyhOVUxMKTsgfQorCisgIExvY2FsU3RvcmFnZUVudHJ5KiBOZXcoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpIGNvbnN0OworICB2b2lkIENoZWNrVHlwZUFuZE1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VMaXRlJiBmcm9tKTsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBMb2NhbFN0b3JhZ2VFbnRyeSYgZnJvbSk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IExvY2FsU3RvcmFnZUVudHJ5JiBmcm9tKTsKKyAgdm9pZCBDbGVhcigpOworICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdDsKKworICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKKyAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7CisgIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7CisgIHZvaWQgRGlzY2FyZFVua25vd25GaWVsZHMoKTsKKyAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCB7IHJldHVybiBfY2FjaGVkX3NpemVfOyB9CisgIHByaXZhdGU6CisgIHZvaWQgU2hhcmVkQ3RvcigpOworICB2b2lkIFNoYXJlZER0b3IoKTsKKyAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKKyAgdm9pZCBJbnRlcm5hbFN3YXAoTG9jYWxTdG9yYWdlRW50cnkqIG90aGVyKTsKKyAgcHJpdmF0ZToKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIEdldEFyZW5hTm9WaXJ0dWFsKCkgY29uc3QgeworICAgIHJldHVybiBfYXJlbmFfcHRyXzsKKyAgfQorICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogTWF5YmVBcmVuYVB0cigpIGNvbnN0IHsKKyAgICByZXR1cm4gX2FyZW5hX3B0cl87CisgIH0KKyAgcHVibGljOgorCisgIDo6c3RkOjpzdHJpbmcgR2V0VHlwZU5hbWUoKSBjb25zdDsKKworICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIGtleSA9IDE7CisgIHZvaWQgY2xlYXJfa2V5KCk7CisgIHN0YXRpYyBjb25zdCBpbnQga0tleUZpZWxkTnVtYmVyID0gMTsKKyAgY29uc3QgOjpzdGQ6OnN0cmluZyYga2V5KCkgY29uc3Q7CisgIHZvaWQgc2V0X2tleShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIHZvaWQgc2V0X2tleShjb25zdCBjaGFyKiB2YWx1ZSk7CisgIHZvaWQgc2V0X2tleShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX2tleSgpOworICA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX2tleSgpOworICB2b2lkIHNldF9hbGxvY2F0ZWRfa2V5KDo6c3RkOjpzdHJpbmcqIGtleSk7CisKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIHZhbHVlID0gMjsKKyAgdm9pZCBjbGVhcl92YWx1ZSgpOworICBzdGF0aWMgY29uc3QgaW50IGtWYWx1ZUZpZWxkTnVtYmVyID0gMjsKKyAgY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUoKSBjb25zdDsKKyAgdm9pZCBzZXRfdmFsdWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOworICB2b2lkIHNldF92YWx1ZShjb25zdCBjaGFyKiB2YWx1ZSk7CisgIHZvaWQgc2V0X3ZhbHVlKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7CisgIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfdmFsdWUoKTsKKyAgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV92YWx1ZSgpOworICB2b2lkIHNldF9hbGxvY2F0ZWRfdmFsdWUoOjpzdGQ6OnN0cmluZyogdmFsdWUpOworCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpjb2JhbHQuc3RvcmFnZS5Mb2NhbFN0b3JhZ2VFbnRyeSkKKyBwcml2YXRlOgorCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyIF91bmtub3duX2ZpZWxkc187CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIF9hcmVuYV9wdHJfOworCisgIGJvb2wgX2lzX2RlZmF1bHRfaW5zdGFuY2VfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciBrZXlfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciB2YWx1ZV87CisgIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87CisgICNpZmRlZiBHT09HTEVfUFJPVE9CVUZfTk9fU1RBVElDX0lOSVRJQUxJWkVSCisgIGZyaWVuZCB2b2lkICBwcm90b2J1Zl9BZGREZXNjX3N0b3JhZ2VfMmVwcm90b19pbXBsKCk7CisgICNlbHNlCisgIGZyaWVuZCB2b2lkICBwcm90b2J1Zl9BZGREZXNjX3N0b3JhZ2VfMmVwcm90bygpOworICAjZW5kaWYKKyAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19zdG9yYWdlXzJlcHJvdG8oKTsKKyAgZnJpZW5kIHZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX3N0b3JhZ2VfMmVwcm90bygpOworCisgIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CisgIHN0YXRpYyBMb2NhbFN0b3JhZ2VFbnRyeSogZGVmYXVsdF9pbnN0YW5jZV87Cit9OworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBMb2NhbFN0b3JhZ2UgOiBwdWJsaWMgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlTGl0ZSB7CisgcHVibGljOgorICBMb2NhbFN0b3JhZ2UoKTsKKyAgdmlydHVhbCB+TG9jYWxTdG9yYWdlKCk7CisKKyAgTG9jYWxTdG9yYWdlKGNvbnN0IExvY2FsU3RvcmFnZSYgZnJvbSk7CisKKyAgaW5saW5lIExvY2FsU3RvcmFnZSYgb3BlcmF0b3I9KGNvbnN0IExvY2FsU3RvcmFnZSYgZnJvbSkgeworICAgIENvcHlGcm9tKGZyb20pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHN0YXRpYyBjb25zdCBMb2NhbFN0b3JhZ2UmIGRlZmF1bHRfaW5zdGFuY2UoKTsKKworICAjaWZkZWYgR09PR0xFX1BST1RPQlVGX05PX1NUQVRJQ19JTklUSUFMSVpFUgorICAvLyBSZXR1cm5zIHRoZSBpbnRlcm5hbCBkZWZhdWx0IGluc3RhbmNlIHBvaW50ZXIuIFRoaXMgZnVuY3Rpb24gY2FuCisgIC8vIHJldHVybiBOVUxMIHRodXMgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IHRoZSB1c2VyLiBUaGlzIGlzIGludGVuZGVkCisgIC8vIGZvciBQcm90b2J1ZiBpbnRlcm5hbCBjb2RlLiBQbGVhc2UgdXNlIGRlZmF1bHRfaW5zdGFuY2UoKSBkZWNsYXJlZAorICAvLyBhYm92ZSBpbnN0ZWFkLgorICBzdGF0aWMgaW5saW5lIGNvbnN0IExvY2FsU3RvcmFnZSogaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9pbnN0YW5jZV87CisgIH0KKyAgI2VuZGlmCisKKyAgR09PR0xFX0FUVFJJQlVURV9OT0lOTElORSB2b2lkIFN3YXAoTG9jYWxTdG9yYWdlKiBvdGhlcik7CisKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBpbmxpbmUgTG9jYWxTdG9yYWdlKiBOZXcoKSBjb25zdCB7IHJldHVybiBOZXcoTlVMTCk7IH0KKworICBMb2NhbFN0b3JhZ2UqIE5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3Q7CisgIHZvaWQgQ2hlY2tUeXBlQW5kTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUxpdGUmIGZyb20pOworICB2b2lkIENvcHlGcm9tKGNvbnN0IExvY2FsU3RvcmFnZSYgZnJvbSk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IExvY2FsU3RvcmFnZSYgZnJvbSk7CisgIHZvaWQgQ2xlYXIoKTsKKyAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7CisKKyAgaW50IEJ5dGVTaXplKCkgY29uc3Q7CisgIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOworICB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OworICB2b2lkIERpc2NhcmRVbmtub3duRmllbGRzKCk7CisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgeyByZXR1cm4gX2NhY2hlZF9zaXplXzsgfQorICBwcml2YXRlOgorICB2b2lkIFNoYXJlZEN0b3IoKTsKKyAgdm9pZCBTaGFyZWREdG9yKCk7CisgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7CisgIHZvaWQgSW50ZXJuYWxTd2FwKExvY2FsU3RvcmFnZSogb3RoZXIpOworICBwcml2YXRlOgorICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogR2V0QXJlbmFOb1ZpcnR1YWwoKSBjb25zdCB7CisgICAgcmV0dXJuIF9hcmVuYV9wdHJfOworICB9CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBNYXliZUFyZW5hUHRyKCkgY29uc3QgeworICAgIHJldHVybiBfYXJlbmFfcHRyXzsKKyAgfQorICBwdWJsaWM6CisKKyAgOjpzdGQ6OnN0cmluZyBHZXRUeXBlTmFtZSgpIGNvbnN0OworCisgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBvcHRpb25hbCBzdHJpbmcgaWQgPSAxOworICB2b2lkIGNsZWFyX2lkKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga0lkRmllbGROdW1iZXIgPSAxOworICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBpZCgpIGNvbnN0OworICB2b2lkIHNldF9pZChjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIHZvaWQgc2V0X2lkKGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgdm9pZCBzZXRfaWQoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKKyAgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9pZCgpOworICA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX2lkKCk7CisgIHZvaWQgc2V0X2FsbG9jYXRlZF9pZCg6OnN0ZDo6c3RyaW5nKiBpZCk7CisKKyAgLy8gcmVwZWF0ZWQgLmNvYmFsdC5zdG9yYWdlLkxvY2FsU3RvcmFnZUVudHJ5IGxvY2FsX3N0b3JhZ2VfZW50cmllcyA9IDI7CisgIGludCBsb2NhbF9zdG9yYWdlX2VudHJpZXNfc2l6ZSgpIGNvbnN0OworICB2b2lkIGNsZWFyX2xvY2FsX3N0b3JhZ2VfZW50cmllcygpOworICBzdGF0aWMgY29uc3QgaW50IGtMb2NhbFN0b3JhZ2VFbnRyaWVzRmllbGROdW1iZXIgPSAyOworICBjb25zdCA6OmNvYmFsdDo6c3RvcmFnZTo6TG9jYWxTdG9yYWdlRW50cnkmIGxvY2FsX3N0b3JhZ2VfZW50cmllcyhpbnQgaW5kZXgpIGNvbnN0OworICA6OmNvYmFsdDo6c3RvcmFnZTo6TG9jYWxTdG9yYWdlRW50cnkqIG11dGFibGVfbG9jYWxfc3RvcmFnZV9lbnRyaWVzKGludCBpbmRleCk7CisgIDo6Y29iYWx0OjpzdG9yYWdlOjpMb2NhbFN0b3JhZ2VFbnRyeSogYWRkX2xvY2FsX3N0b3JhZ2VfZW50cmllcygpOworICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Y29iYWx0OjpzdG9yYWdlOjpMb2NhbFN0b3JhZ2VFbnRyeSA+KgorICAgICAgbXV0YWJsZV9sb2NhbF9zdG9yYWdlX2VudHJpZXMoKTsKKyAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OmNvYmFsdDo6c3RvcmFnZTo6TG9jYWxTdG9yYWdlRW50cnkgPiYKKyAgICAgIGxvY2FsX3N0b3JhZ2VfZW50cmllcygpIGNvbnN0OworCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpjb2JhbHQuc3RvcmFnZS5Mb2NhbFN0b3JhZ2UpCisgcHJpdmF0ZToKKworICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciBfdW5rbm93bl9maWVsZHNfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBfYXJlbmFfcHRyXzsKKworICBib29sIF9pc19kZWZhdWx0X2luc3RhbmNlXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgaWRfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Y29iYWx0OjpzdG9yYWdlOjpMb2NhbFN0b3JhZ2VFbnRyeSA+IGxvY2FsX3N0b3JhZ2VfZW50cmllc187CisgIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87CisgICNpZmRlZiBHT09HTEVfUFJPVE9CVUZfTk9fU1RBVElDX0lOSVRJQUxJWkVSCisgIGZyaWVuZCB2b2lkICBwcm90b2J1Zl9BZGREZXNjX3N0b3JhZ2VfMmVwcm90b19pbXBsKCk7CisgICNlbHNlCisgIGZyaWVuZCB2b2lkICBwcm90b2J1Zl9BZGREZXNjX3N0b3JhZ2VfMmVwcm90bygpOworICAjZW5kaWYKKyAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19zdG9yYWdlXzJlcHJvdG8oKTsKKyAgZnJpZW5kIHZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX3N0b3JhZ2VfMmVwcm90bygpOworCisgIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CisgIHN0YXRpYyBMb2NhbFN0b3JhZ2UqIGRlZmF1bHRfaW5zdGFuY2VfOworfTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgU3RvcmFnZSA6IHB1YmxpYyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VMaXRlIHsKKyBwdWJsaWM6CisgIFN0b3JhZ2UoKTsKKyAgdmlydHVhbCB+U3RvcmFnZSgpOworCisgIFN0b3JhZ2UoY29uc3QgU3RvcmFnZSYgZnJvbSk7CisKKyAgaW5saW5lIFN0b3JhZ2UmIG9wZXJhdG9yPShjb25zdCBTdG9yYWdlJiBmcm9tKSB7CisgICAgQ29weUZyb20oZnJvbSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgc3RhdGljIGNvbnN0IFN0b3JhZ2UmIGRlZmF1bHRfaW5zdGFuY2UoKTsKKworICAjaWZkZWYgR09PR0xFX1BST1RPQlVGX05PX1NUQVRJQ19JTklUSUFMSVpFUgorICAvLyBSZXR1cm5zIHRoZSBpbnRlcm5hbCBkZWZhdWx0IGluc3RhbmNlIHBvaW50ZXIuIFRoaXMgZnVuY3Rpb24gY2FuCisgIC8vIHJldHVybiBOVUxMIHRodXMgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IHRoZSB1c2VyLiBUaGlzIGlzIGludGVuZGVkCisgIC8vIGZvciBQcm90b2J1ZiBpbnRlcm5hbCBjb2RlLiBQbGVhc2UgdXNlIGRlZmF1bHRfaW5zdGFuY2UoKSBkZWNsYXJlZAorICAvLyBhYm92ZSBpbnN0ZWFkLgorICBzdGF0aWMgaW5saW5lIGNvbnN0IFN0b3JhZ2UqIGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfaW5zdGFuY2VfOworICB9CisgICNlbmRpZgorCisgIEdPT0dMRV9BVFRSSUJVVEVfTk9JTkxJTkUgdm9pZCBTd2FwKFN0b3JhZ2UqIG90aGVyKTsKKworICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIGlubGluZSBTdG9yYWdlKiBOZXcoKSBjb25zdCB7IHJldHVybiBOZXcoTlVMTCk7IH0KKworICBTdG9yYWdlKiBOZXcoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpIGNvbnN0OworICB2b2lkIENoZWNrVHlwZUFuZE1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VMaXRlJiBmcm9tKTsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCBTdG9yYWdlJiBmcm9tKTsKKyAgdm9pZCBNZXJnZUZyb20oY29uc3QgU3RvcmFnZSYgZnJvbSk7CisgIHZvaWQgQ2xlYXIoKTsKKyAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7CisKKyAgaW50IEJ5dGVTaXplKCkgY29uc3Q7CisgIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOworICB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OworICB2b2lkIERpc2NhcmRVbmtub3duRmllbGRzKCk7CisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgeyByZXR1cm4gX2NhY2hlZF9zaXplXzsgfQorICBwcml2YXRlOgorICB2b2lkIFNoYXJlZEN0b3IoKTsKKyAgdm9pZCBTaGFyZWREdG9yKCk7CisgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7CisgIHZvaWQgSW50ZXJuYWxTd2FwKFN0b3JhZ2UqIG90aGVyKTsKKyAgcHJpdmF0ZToKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIEdldEFyZW5hTm9WaXJ0dWFsKCkgY29uc3QgeworICAgIHJldHVybiBfYXJlbmFfcHRyXzsKKyAgfQorICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogTWF5YmVBcmVuYVB0cigpIGNvbnN0IHsKKyAgICByZXR1cm4gX2FyZW5hX3B0cl87CisgIH0KKyAgcHVibGljOgorCisgIDo6c3RkOjpzdHJpbmcgR2V0VHlwZU5hbWUoKSBjb25zdDsKKworICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gcmVwZWF0ZWQgLmNvYmFsdC5zdG9yYWdlLkNvb2tpZSBjb29raWVzID0gMTsKKyAgaW50IGNvb2tpZXNfc2l6ZSgpIGNvbnN0OworICB2b2lkIGNsZWFyX2Nvb2tpZXMoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrQ29va2llc0ZpZWxkTnVtYmVyID0gMTsKKyAgY29uc3QgOjpjb2JhbHQ6OnN0b3JhZ2U6OkNvb2tpZSYgY29va2llcyhpbnQgaW5kZXgpIGNvbnN0OworICA6OmNvYmFsdDo6c3RvcmFnZTo6Q29va2llKiBtdXRhYmxlX2Nvb2tpZXMoaW50IGluZGV4KTsKKyAgOjpjb2JhbHQ6OnN0b3JhZ2U6OkNvb2tpZSogYWRkX2Nvb2tpZXMoKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OmNvYmFsdDo6c3RvcmFnZTo6Q29va2llID4qCisgICAgICBtdXRhYmxlX2Nvb2tpZXMoKTsKKyAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OmNvYmFsdDo6c3RvcmFnZTo6Q29va2llID4mCisgICAgICBjb29raWVzKCkgY29uc3Q7CisKKyAgLy8gcmVwZWF0ZWQgLmNvYmFsdC5zdG9yYWdlLkxvY2FsU3RvcmFnZSBsb2NhbF9zdG9yYWdlcyA9IDI7CisgIGludCBsb2NhbF9zdG9yYWdlc19zaXplKCkgY29uc3Q7CisgIHZvaWQgY2xlYXJfbG9jYWxfc3RvcmFnZXMoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrTG9jYWxTdG9yYWdlc0ZpZWxkTnVtYmVyID0gMjsKKyAgY29uc3QgOjpjb2JhbHQ6OnN0b3JhZ2U6OkxvY2FsU3RvcmFnZSYgbG9jYWxfc3RvcmFnZXMoaW50IGluZGV4KSBjb25zdDsKKyAgOjpjb2JhbHQ6OnN0b3JhZ2U6OkxvY2FsU3RvcmFnZSogbXV0YWJsZV9sb2NhbF9zdG9yYWdlcyhpbnQgaW5kZXgpOworICA6OmNvYmFsdDo6c3RvcmFnZTo6TG9jYWxTdG9yYWdlKiBhZGRfbG9jYWxfc3RvcmFnZXMoKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OmNvYmFsdDo6c3RvcmFnZTo6TG9jYWxTdG9yYWdlID4qCisgICAgICBtdXRhYmxlX2xvY2FsX3N0b3JhZ2VzKCk7CisgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpjb2JhbHQ6OnN0b3JhZ2U6OkxvY2FsU3RvcmFnZSA+JgorICAgICAgbG9jYWxfc3RvcmFnZXMoKSBjb25zdDsKKworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Y29iYWx0LnN0b3JhZ2UuU3RvcmFnZSkKKyBwcml2YXRlOgorCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyIF91bmtub3duX2ZpZWxkc187CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIF9hcmVuYV9wdHJfOworCisgIGJvb2wgX2lzX2RlZmF1bHRfaW5zdGFuY2VfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Y29iYWx0OjpzdG9yYWdlOjpDb29raWUgPiBjb29raWVzXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OmNvYmFsdDo6c3RvcmFnZTo6TG9jYWxTdG9yYWdlID4gbG9jYWxfc3RvcmFnZXNfOworICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOworICAjaWZkZWYgR09PR0xFX1BST1RPQlVGX05PX1NUQVRJQ19JTklUSUFMSVpFUgorICBmcmllbmQgdm9pZCAgcHJvdG9idWZfQWRkRGVzY19zdG9yYWdlXzJlcHJvdG9faW1wbCgpOworICAjZWxzZQorICBmcmllbmQgdm9pZCAgcHJvdG9idWZfQWRkRGVzY19zdG9yYWdlXzJlcHJvdG8oKTsKKyAgI2VuZGlmCisgIGZyaWVuZCB2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2Nfc3RvcmFnZV8yZXByb3RvKCk7CisgIGZyaWVuZCB2b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9zdG9yYWdlXzJlcHJvdG8oKTsKKworICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOworICBzdGF0aWMgU3RvcmFnZSogZGVmYXVsdF9pbnN0YW5jZV87Cit9OworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2lmICFQUk9UT0JVRl9JTkxJTkVfTk9UX0lOX0hFQURFUlMKKy8vIENvb2tpZQorCisvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CitpbmxpbmUgdm9pZCBDb29raWU6OmNsZWFyX25hbWUoKSB7CisgIG5hbWVfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KK2lubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBDb29raWU6Om5hbWUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Y29iYWx0LnN0b3JhZ2UuQ29va2llLm5hbWUpCisgIHJldHVybiBuYW1lXy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CitpbmxpbmUgdm9pZCBDb29raWU6OnNldF9uYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIAorICBuYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0OmNvYmFsdC5zdG9yYWdlLkNvb2tpZS5uYW1lKQorfQoraW5saW5lIHZvaWQgQ29va2llOjpzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSkgeworICAKKyAgbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmNvYmFsdC5zdG9yYWdlLkNvb2tpZS5uYW1lKQorfQoraW5saW5lIHZvaWQgQ29va2llOjpzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgCisgIG5hbWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLAorICAgICAgOjpzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmNvYmFsdC5zdG9yYWdlLkNvb2tpZS5uYW1lKQorfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIENvb2tpZTo6bXV0YWJsZV9uYW1lKCkgeworICAKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Y29iYWx0LnN0b3JhZ2UuQ29va2llLm5hbWUpCisgIHJldHVybiBuYW1lXy5NdXRhYmxlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIENvb2tpZTo6cmVsZWFzZV9uYW1lKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpjb2JhbHQuc3RvcmFnZS5Db29raWUubmFtZSkKKyAgCisgIHJldHVybiBuYW1lXy5SZWxlYXNlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQoraW5saW5lIHZvaWQgQ29va2llOjpzZXRfYWxsb2NhdGVkX25hbWUoOjpzdGQ6OnN0cmluZyogbmFtZSkgeworICBpZiAobmFtZSAhPSBOVUxMKSB7CisgICAgCisgIH0gZWxzZSB7CisgICAgCisgIH0KKyAgbmFtZV8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIG5hbWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpjb2JhbHQuc3RvcmFnZS5Db29raWUubmFtZSkKK30KKworLy8gb3B0aW9uYWwgc3RyaW5nIHZhbHVlID0gMjsKK2lubGluZSB2b2lkIENvb2tpZTo6Y2xlYXJfdmFsdWUoKSB7CisgIHZhbHVlXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CitpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgQ29va2llOjp2YWx1ZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpjb2JhbHQuc3RvcmFnZS5Db29raWUudmFsdWUpCisgIHJldHVybiB2YWx1ZV8uR2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQoraW5saW5lIHZvaWQgQ29va2llOjpzZXRfdmFsdWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgCisgIHZhbHVlXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0OmNvYmFsdC5zdG9yYWdlLkNvb2tpZS52YWx1ZSkKK30KK2lubGluZSB2b2lkIENvb2tpZTo6c2V0X3ZhbHVlKGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIAorICB2YWx1ZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmNvYmFsdC5zdG9yYWdlLkNvb2tpZS52YWx1ZSkKK30KK2lubGluZSB2b2lkIENvb2tpZTo6c2V0X3ZhbHVlKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICAKKyAgdmFsdWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLAorICAgICAgOjpzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmNvYmFsdC5zdG9yYWdlLkNvb2tpZS52YWx1ZSkKK30KK2lubGluZSA6OnN0ZDo6c3RyaW5nKiBDb29raWU6Om11dGFibGVfdmFsdWUoKSB7CisgIAorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpjb2JhbHQuc3RvcmFnZS5Db29raWUudmFsdWUpCisgIHJldHVybiB2YWx1ZV8uTXV0YWJsZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KK2lubGluZSA6OnN0ZDo6c3RyaW5nKiBDb29raWU6OnJlbGVhc2VfdmFsdWUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmNvYmFsdC5zdG9yYWdlLkNvb2tpZS52YWx1ZSkKKyAgCisgIHJldHVybiB2YWx1ZV8uUmVsZWFzZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KK2lubGluZSB2b2lkIENvb2tpZTo6c2V0X2FsbG9jYXRlZF92YWx1ZSg6OnN0ZDo6c3RyaW5nKiB2YWx1ZSkgeworICBpZiAodmFsdWUgIT0gTlVMTCkgeworICAgIAorICB9IGVsc2UgeworICAgIAorICB9CisgIHZhbHVlXy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpjb2JhbHQuc3RvcmFnZS5Db29raWUudmFsdWUpCit9CisKKy8vIG9wdGlvbmFsIHN0cmluZyBkb21haW4gPSAzOworaW5saW5lIHZvaWQgQ29va2llOjpjbGVhcl9kb21haW4oKSB7CisgIGRvbWFpbl8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQoraW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIENvb2tpZTo6ZG9tYWluKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0OmNvYmFsdC5zdG9yYWdlLkNvb2tpZS5kb21haW4pCisgIHJldHVybiBkb21haW5fLkdldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KK2lubGluZSB2b2lkIENvb2tpZTo6c2V0X2RvbWFpbihjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAKKyAgZG9tYWluXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0OmNvYmFsdC5zdG9yYWdlLkNvb2tpZS5kb21haW4pCit9CitpbmxpbmUgdm9pZCBDb29raWU6OnNldF9kb21haW4oY29uc3QgY2hhciogdmFsdWUpIHsKKyAgCisgIGRvbWFpbl8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmNvYmFsdC5zdG9yYWdlLkNvb2tpZS5kb21haW4pCit9CitpbmxpbmUgdm9pZCBDb29raWU6OnNldF9kb21haW4oY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIAorICBkb21haW5fLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLAorICAgICAgOjpzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmNvYmFsdC5zdG9yYWdlLkNvb2tpZS5kb21haW4pCit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogQ29va2llOjptdXRhYmxlX2RvbWFpbigpIHsKKyAgCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmNvYmFsdC5zdG9yYWdlLkNvb2tpZS5kb21haW4pCisgIHJldHVybiBkb21haW5fLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogQ29va2llOjpyZWxlYXNlX2RvbWFpbigpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Y29iYWx0LnN0b3JhZ2UuQ29va2llLmRvbWFpbikKKyAgCisgIHJldHVybiBkb21haW5fLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CitpbmxpbmUgdm9pZCBDb29raWU6OnNldF9hbGxvY2F0ZWRfZG9tYWluKDo6c3RkOjpzdHJpbmcqIGRvbWFpbikgeworICBpZiAoZG9tYWluICE9IE5VTEwpIHsKKyAgICAKKyAgfSBlbHNlIHsKKyAgICAKKyAgfQorICBkb21haW5fLlNldEFsbG9jYXRlZE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBkb21haW4pOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpjb2JhbHQuc3RvcmFnZS5Db29raWUuZG9tYWluKQorfQorCisvLyBvcHRpb25hbCBzdHJpbmcgcGF0aCA9IDQ7CitpbmxpbmUgdm9pZCBDb29raWU6OmNsZWFyX3BhdGgoKSB7CisgIHBhdGhfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KK2lubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBDb29raWU6OnBhdGgoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Y29iYWx0LnN0b3JhZ2UuQ29va2llLnBhdGgpCisgIHJldHVybiBwYXRoXy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CitpbmxpbmUgdm9pZCBDb29raWU6OnNldF9wYXRoKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIAorICBwYXRoXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0OmNvYmFsdC5zdG9yYWdlLkNvb2tpZS5wYXRoKQorfQoraW5saW5lIHZvaWQgQ29va2llOjpzZXRfcGF0aChjb25zdCBjaGFyKiB2YWx1ZSkgeworICAKKyAgcGF0aF8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmNvYmFsdC5zdG9yYWdlLkNvb2tpZS5wYXRoKQorfQoraW5saW5lIHZvaWQgQ29va2llOjpzZXRfcGF0aChjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgCisgIHBhdGhfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLAorICAgICAgOjpzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmNvYmFsdC5zdG9yYWdlLkNvb2tpZS5wYXRoKQorfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIENvb2tpZTo6bXV0YWJsZV9wYXRoKCkgeworICAKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Y29iYWx0LnN0b3JhZ2UuQ29va2llLnBhdGgpCisgIHJldHVybiBwYXRoXy5NdXRhYmxlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIENvb2tpZTo6cmVsZWFzZV9wYXRoKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpjb2JhbHQuc3RvcmFnZS5Db29raWUucGF0aCkKKyAgCisgIHJldHVybiBwYXRoXy5SZWxlYXNlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQoraW5saW5lIHZvaWQgQ29va2llOjpzZXRfYWxsb2NhdGVkX3BhdGgoOjpzdGQ6OnN0cmluZyogcGF0aCkgeworICBpZiAocGF0aCAhPSBOVUxMKSB7CisgICAgCisgIH0gZWxzZSB7CisgICAgCisgIH0KKyAgcGF0aF8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHBhdGgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpjb2JhbHQuc3RvcmFnZS5Db29raWUucGF0aCkKK30KKworLy8gb3B0aW9uYWwgaW50NjQgY3JlYXRpb25fdGltZV91cyA9IDU7CitpbmxpbmUgdm9pZCBDb29raWU6OmNsZWFyX2NyZWF0aW9uX3RpbWVfdXMoKSB7CisgIGNyZWF0aW9uX3RpbWVfdXNfID0gR09PR0xFX0xPTkdMT05HKDApOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50NjQgQ29va2llOjpjcmVhdGlvbl90aW1lX3VzKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0OmNvYmFsdC5zdG9yYWdlLkNvb2tpZS5jcmVhdGlvbl90aW1lX3VzKQorICByZXR1cm4gY3JlYXRpb25fdGltZV91c187Cit9CitpbmxpbmUgdm9pZCBDb29raWU6OnNldF9jcmVhdGlvbl90aW1lX3VzKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50NjQgdmFsdWUpIHsKKyAgCisgIGNyZWF0aW9uX3RpbWVfdXNfID0gdmFsdWU7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Y29iYWx0LnN0b3JhZ2UuQ29va2llLmNyZWF0aW9uX3RpbWVfdXMpCit9CisKKy8vIG9wdGlvbmFsIGludDY0IGV4cGlyYXRpb25fdGltZV91cyA9IDY7CitpbmxpbmUgdm9pZCBDb29raWU6OmNsZWFyX2V4cGlyYXRpb25fdGltZV91cygpIHsKKyAgZXhwaXJhdGlvbl90aW1lX3VzXyA9IEdPT0dMRV9MT05HTE9ORygwKTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDY0IENvb2tpZTo6ZXhwaXJhdGlvbl90aW1lX3VzKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0OmNvYmFsdC5zdG9yYWdlLkNvb2tpZS5leHBpcmF0aW9uX3RpbWVfdXMpCisgIHJldHVybiBleHBpcmF0aW9uX3RpbWVfdXNfOworfQoraW5saW5lIHZvaWQgQ29va2llOjpzZXRfZXhwaXJhdGlvbl90aW1lX3VzKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50NjQgdmFsdWUpIHsKKyAgCisgIGV4cGlyYXRpb25fdGltZV91c18gPSB2YWx1ZTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpjb2JhbHQuc3RvcmFnZS5Db29raWUuZXhwaXJhdGlvbl90aW1lX3VzKQorfQorCisvLyBvcHRpb25hbCBpbnQ2NCBsYXN0X2FjY2Vzc190aW1lX3VzID0gNzsKK2lubGluZSB2b2lkIENvb2tpZTo6Y2xlYXJfbGFzdF9hY2Nlc3NfdGltZV91cygpIHsKKyAgbGFzdF9hY2Nlc3NfdGltZV91c18gPSBHT09HTEVfTE9OR0xPTkcoMCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjppbnQ2NCBDb29raWU6Omxhc3RfYWNjZXNzX3RpbWVfdXMoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Y29iYWx0LnN0b3JhZ2UuQ29va2llLmxhc3RfYWNjZXNzX3RpbWVfdXMpCisgIHJldHVybiBsYXN0X2FjY2Vzc190aW1lX3VzXzsKK30KK2lubGluZSB2b2lkIENvb2tpZTo6c2V0X2xhc3RfYWNjZXNzX3RpbWVfdXMoOjpnb29nbGU6OnByb3RvYnVmOjppbnQ2NCB2YWx1ZSkgeworICAKKyAgbGFzdF9hY2Nlc3NfdGltZV91c18gPSB2YWx1ZTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpjb2JhbHQuc3RvcmFnZS5Db29raWUubGFzdF9hY2Nlc3NfdGltZV91cykKK30KKworLy8gb3B0aW9uYWwgYm9vbCBzZWN1cmUgPSA4OworaW5saW5lIHZvaWQgQ29va2llOjpjbGVhcl9zZWN1cmUoKSB7CisgIHNlY3VyZV8gPSBmYWxzZTsKK30KK2lubGluZSBib29sIENvb2tpZTo6c2VjdXJlKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0OmNvYmFsdC5zdG9yYWdlLkNvb2tpZS5zZWN1cmUpCisgIHJldHVybiBzZWN1cmVfOworfQoraW5saW5lIHZvaWQgQ29va2llOjpzZXRfc2VjdXJlKGJvb2wgdmFsdWUpIHsKKyAgCisgIHNlY3VyZV8gPSB2YWx1ZTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpjb2JhbHQuc3RvcmFnZS5Db29raWUuc2VjdXJlKQorfQorCisvLyBvcHRpb25hbCBib29sIGh0dHBfb25seSA9IDk7CitpbmxpbmUgdm9pZCBDb29raWU6OmNsZWFyX2h0dHBfb25seSgpIHsKKyAgaHR0cF9vbmx5XyA9IGZhbHNlOworfQoraW5saW5lIGJvb2wgQ29va2llOjpodHRwX29ubHkoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Y29iYWx0LnN0b3JhZ2UuQ29va2llLmh0dHBfb25seSkKKyAgcmV0dXJuIGh0dHBfb25seV87Cit9CitpbmxpbmUgdm9pZCBDb29raWU6OnNldF9odHRwX29ubHkoYm9vbCB2YWx1ZSkgeworICAKKyAgaHR0cF9vbmx5XyA9IHZhbHVlOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0OmNvYmFsdC5zdG9yYWdlLkNvb2tpZS5odHRwX29ubHkpCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gTG9jYWxTdG9yYWdlRW50cnkKKworLy8gb3B0aW9uYWwgc3RyaW5nIGtleSA9IDE7CitpbmxpbmUgdm9pZCBMb2NhbFN0b3JhZ2VFbnRyeTo6Y2xlYXJfa2V5KCkgeworICBrZXlfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KK2lubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBMb2NhbFN0b3JhZ2VFbnRyeTo6a2V5KCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0OmNvYmFsdC5zdG9yYWdlLkxvY2FsU3RvcmFnZUVudHJ5LmtleSkKKyAgcmV0dXJuIGtleV8uR2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQoraW5saW5lIHZvaWQgTG9jYWxTdG9yYWdlRW50cnk6OnNldF9rZXkoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgCisgIGtleV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpjb2JhbHQuc3RvcmFnZS5Mb2NhbFN0b3JhZ2VFbnRyeS5rZXkpCit9CitpbmxpbmUgdm9pZCBMb2NhbFN0b3JhZ2VFbnRyeTo6c2V0X2tleShjb25zdCBjaGFyKiB2YWx1ZSkgeworICAKKyAga2V5Xy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgOjpzdGQ6OnN0cmluZyh2YWx1ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6Y29iYWx0LnN0b3JhZ2UuTG9jYWxTdG9yYWdlRW50cnkua2V5KQorfQoraW5saW5lIHZvaWQgTG9jYWxTdG9yYWdlRW50cnk6OnNldF9rZXkoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIAorICBrZXlfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLAorICAgICAgOjpzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmNvYmFsdC5zdG9yYWdlLkxvY2FsU3RvcmFnZUVudHJ5LmtleSkKK30KK2lubGluZSA6OnN0ZDo6c3RyaW5nKiBMb2NhbFN0b3JhZ2VFbnRyeTo6bXV0YWJsZV9rZXkoKSB7CisgIAorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpjb2JhbHQuc3RvcmFnZS5Mb2NhbFN0b3JhZ2VFbnRyeS5rZXkpCisgIHJldHVybiBrZXlfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogTG9jYWxTdG9yYWdlRW50cnk6OnJlbGVhc2Vfa2V5KCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpjb2JhbHQuc3RvcmFnZS5Mb2NhbFN0b3JhZ2VFbnRyeS5rZXkpCisgIAorICByZXR1cm4ga2V5Xy5SZWxlYXNlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQoraW5saW5lIHZvaWQgTG9jYWxTdG9yYWdlRW50cnk6OnNldF9hbGxvY2F0ZWRfa2V5KDo6c3RkOjpzdHJpbmcqIGtleSkgeworICBpZiAoa2V5ICE9IE5VTEwpIHsKKyAgICAKKyAgfSBlbHNlIHsKKyAgICAKKyAgfQorICBrZXlfLlNldEFsbG9jYXRlZE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBrZXkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpjb2JhbHQuc3RvcmFnZS5Mb2NhbFN0b3JhZ2VFbnRyeS5rZXkpCit9CisKKy8vIG9wdGlvbmFsIHN0cmluZyB2YWx1ZSA9IDI7CitpbmxpbmUgdm9pZCBMb2NhbFN0b3JhZ2VFbnRyeTo6Y2xlYXJfdmFsdWUoKSB7CisgIHZhbHVlXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CitpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgTG9jYWxTdG9yYWdlRW50cnk6OnZhbHVlKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0OmNvYmFsdC5zdG9yYWdlLkxvY2FsU3RvcmFnZUVudHJ5LnZhbHVlKQorICByZXR1cm4gdmFsdWVfLkdldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KK2lubGluZSB2b2lkIExvY2FsU3RvcmFnZUVudHJ5OjpzZXRfdmFsdWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgCisgIHZhbHVlXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0OmNvYmFsdC5zdG9yYWdlLkxvY2FsU3RvcmFnZUVudHJ5LnZhbHVlKQorfQoraW5saW5lIHZvaWQgTG9jYWxTdG9yYWdlRW50cnk6OnNldF92YWx1ZShjb25zdCBjaGFyKiB2YWx1ZSkgeworICAKKyAgdmFsdWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpjb2JhbHQuc3RvcmFnZS5Mb2NhbFN0b3JhZ2VFbnRyeS52YWx1ZSkKK30KK2lubGluZSB2b2lkIExvY2FsU3RvcmFnZUVudHJ5OjpzZXRfdmFsdWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIAorICB2YWx1ZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCisgICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Y29iYWx0LnN0b3JhZ2UuTG9jYWxTdG9yYWdlRW50cnkudmFsdWUpCit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogTG9jYWxTdG9yYWdlRW50cnk6Om11dGFibGVfdmFsdWUoKSB7CisgIAorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpjb2JhbHQuc3RvcmFnZS5Mb2NhbFN0b3JhZ2VFbnRyeS52YWx1ZSkKKyAgcmV0dXJuIHZhbHVlXy5NdXRhYmxlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIExvY2FsU3RvcmFnZUVudHJ5OjpyZWxlYXNlX3ZhbHVlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpjb2JhbHQuc3RvcmFnZS5Mb2NhbFN0b3JhZ2VFbnRyeS52YWx1ZSkKKyAgCisgIHJldHVybiB2YWx1ZV8uUmVsZWFzZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KK2lubGluZSB2b2lkIExvY2FsU3RvcmFnZUVudHJ5OjpzZXRfYWxsb2NhdGVkX3ZhbHVlKDo6c3RkOjpzdHJpbmcqIHZhbHVlKSB7CisgIGlmICh2YWx1ZSAhPSBOVUxMKSB7CisgICAgCisgIH0gZWxzZSB7CisgICAgCisgIH0KKyAgdmFsdWVfLlNldEFsbG9jYXRlZE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCB2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmNvYmFsdC5zdG9yYWdlLkxvY2FsU3RvcmFnZUVudHJ5LnZhbHVlKQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIExvY2FsU3RvcmFnZQorCisvLyBvcHRpb25hbCBzdHJpbmcgaWQgPSAxOworaW5saW5lIHZvaWQgTG9jYWxTdG9yYWdlOjpjbGVhcl9pZCgpIHsKKyAgaWRfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KK2lubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBMb2NhbFN0b3JhZ2U6OmlkKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0OmNvYmFsdC5zdG9yYWdlLkxvY2FsU3RvcmFnZS5pZCkKKyAgcmV0dXJuIGlkXy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CitpbmxpbmUgdm9pZCBMb2NhbFN0b3JhZ2U6OnNldF9pZChjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAKKyAgaWRfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCB2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Y29iYWx0LnN0b3JhZ2UuTG9jYWxTdG9yYWdlLmlkKQorfQoraW5saW5lIHZvaWQgTG9jYWxTdG9yYWdlOjpzZXRfaWQoY29uc3QgY2hhciogdmFsdWUpIHsKKyAgCisgIGlkXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgOjpzdGQ6OnN0cmluZyh2YWx1ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6Y29iYWx0LnN0b3JhZ2UuTG9jYWxTdG9yYWdlLmlkKQorfQoraW5saW5lIHZvaWQgTG9jYWxTdG9yYWdlOjpzZXRfaWQoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIAorICBpZF8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCisgICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Y29iYWx0LnN0b3JhZ2UuTG9jYWxTdG9yYWdlLmlkKQorfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIExvY2FsU3RvcmFnZTo6bXV0YWJsZV9pZCgpIHsKKyAgCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmNvYmFsdC5zdG9yYWdlLkxvY2FsU3RvcmFnZS5pZCkKKyAgcmV0dXJuIGlkXy5NdXRhYmxlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIExvY2FsU3RvcmFnZTo6cmVsZWFzZV9pZCgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Y29iYWx0LnN0b3JhZ2UuTG9jYWxTdG9yYWdlLmlkKQorICAKKyAgcmV0dXJuIGlkXy5SZWxlYXNlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQoraW5saW5lIHZvaWQgTG9jYWxTdG9yYWdlOjpzZXRfYWxsb2NhdGVkX2lkKDo6c3RkOjpzdHJpbmcqIGlkKSB7CisgIGlmIChpZCAhPSBOVUxMKSB7CisgICAgCisgIH0gZWxzZSB7CisgICAgCisgIH0KKyAgaWRfLlNldEFsbG9jYXRlZE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBpZCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmNvYmFsdC5zdG9yYWdlLkxvY2FsU3RvcmFnZS5pZCkKK30KKworLy8gcmVwZWF0ZWQgLmNvYmFsdC5zdG9yYWdlLkxvY2FsU3RvcmFnZUVudHJ5IGxvY2FsX3N0b3JhZ2VfZW50cmllcyA9IDI7CitpbmxpbmUgaW50IExvY2FsU3RvcmFnZTo6bG9jYWxfc3RvcmFnZV9lbnRyaWVzX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBsb2NhbF9zdG9yYWdlX2VudHJpZXNfLnNpemUoKTsKK30KK2lubGluZSB2b2lkIExvY2FsU3RvcmFnZTo6Y2xlYXJfbG9jYWxfc3RvcmFnZV9lbnRyaWVzKCkgeworICBsb2NhbF9zdG9yYWdlX2VudHJpZXNfLkNsZWFyKCk7Cit9CitpbmxpbmUgY29uc3QgOjpjb2JhbHQ6OnN0b3JhZ2U6OkxvY2FsU3RvcmFnZUVudHJ5JiBMb2NhbFN0b3JhZ2U6OmxvY2FsX3N0b3JhZ2VfZW50cmllcyhpbnQgaW5kZXgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpjb2JhbHQuc3RvcmFnZS5Mb2NhbFN0b3JhZ2UubG9jYWxfc3RvcmFnZV9lbnRyaWVzKQorICByZXR1cm4gbG9jYWxfc3RvcmFnZV9lbnRyaWVzXy5HZXQoaW5kZXgpOworfQoraW5saW5lIDo6Y29iYWx0OjpzdG9yYWdlOjpMb2NhbFN0b3JhZ2VFbnRyeSogTG9jYWxTdG9yYWdlOjptdXRhYmxlX2xvY2FsX3N0b3JhZ2VfZW50cmllcyhpbnQgaW5kZXgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Y29iYWx0LnN0b3JhZ2UuTG9jYWxTdG9yYWdlLmxvY2FsX3N0b3JhZ2VfZW50cmllcykKKyAgcmV0dXJuIGxvY2FsX3N0b3JhZ2VfZW50cmllc18uTXV0YWJsZShpbmRleCk7Cit9CitpbmxpbmUgOjpjb2JhbHQ6OnN0b3JhZ2U6OkxvY2FsU3RvcmFnZUVudHJ5KiBMb2NhbFN0b3JhZ2U6OmFkZF9sb2NhbF9zdG9yYWdlX2VudHJpZXMoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Y29iYWx0LnN0b3JhZ2UuTG9jYWxTdG9yYWdlLmxvY2FsX3N0b3JhZ2VfZW50cmllcykKKyAgcmV0dXJuIGxvY2FsX3N0b3JhZ2VfZW50cmllc18uQWRkKCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OmNvYmFsdDo6c3RvcmFnZTo6TG9jYWxTdG9yYWdlRW50cnkgPioKK0xvY2FsU3RvcmFnZTo6bXV0YWJsZV9sb2NhbF9zdG9yYWdlX2VudHJpZXMoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Y29iYWx0LnN0b3JhZ2UuTG9jYWxTdG9yYWdlLmxvY2FsX3N0b3JhZ2VfZW50cmllcykKKyAgcmV0dXJuICZsb2NhbF9zdG9yYWdlX2VudHJpZXNfOworfQoraW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpjb2JhbHQ6OnN0b3JhZ2U6OkxvY2FsU3RvcmFnZUVudHJ5ID4mCitMb2NhbFN0b3JhZ2U6OmxvY2FsX3N0b3JhZ2VfZW50cmllcygpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Y29iYWx0LnN0b3JhZ2UuTG9jYWxTdG9yYWdlLmxvY2FsX3N0b3JhZ2VfZW50cmllcykKKyAgcmV0dXJuIGxvY2FsX3N0b3JhZ2VfZW50cmllc187Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gU3RvcmFnZQorCisvLyByZXBlYXRlZCAuY29iYWx0LnN0b3JhZ2UuQ29va2llIGNvb2tpZXMgPSAxOworaW5saW5lIGludCBTdG9yYWdlOjpjb29raWVzX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBjb29raWVzXy5zaXplKCk7Cit9CitpbmxpbmUgdm9pZCBTdG9yYWdlOjpjbGVhcl9jb29raWVzKCkgeworICBjb29raWVzXy5DbGVhcigpOworfQoraW5saW5lIGNvbnN0IDo6Y29iYWx0OjpzdG9yYWdlOjpDb29raWUmIFN0b3JhZ2U6OmNvb2tpZXMoaW50IGluZGV4KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Y29iYWx0LnN0b3JhZ2UuU3RvcmFnZS5jb29raWVzKQorICByZXR1cm4gY29va2llc18uR2V0KGluZGV4KTsKK30KK2lubGluZSA6OmNvYmFsdDo6c3RvcmFnZTo6Q29va2llKiBTdG9yYWdlOjptdXRhYmxlX2Nvb2tpZXMoaW50IGluZGV4KSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmNvYmFsdC5zdG9yYWdlLlN0b3JhZ2UuY29va2llcykKKyAgcmV0dXJuIGNvb2tpZXNfLk11dGFibGUoaW5kZXgpOworfQoraW5saW5lIDo6Y29iYWx0OjpzdG9yYWdlOjpDb29raWUqIFN0b3JhZ2U6OmFkZF9jb29raWVzKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmNvYmFsdC5zdG9yYWdlLlN0b3JhZ2UuY29va2llcykKKyAgcmV0dXJuIGNvb2tpZXNfLkFkZCgpOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpjb2JhbHQ6OnN0b3JhZ2U6OkNvb2tpZSA+KgorU3RvcmFnZTo6bXV0YWJsZV9jb29raWVzKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0OmNvYmFsdC5zdG9yYWdlLlN0b3JhZ2UuY29va2llcykKKyAgcmV0dXJuICZjb29raWVzXzsKK30KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Y29iYWx0OjpzdG9yYWdlOjpDb29raWUgPiYKK1N0b3JhZ2U6OmNvb2tpZXMoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0OmNvYmFsdC5zdG9yYWdlLlN0b3JhZ2UuY29va2llcykKKyAgcmV0dXJuIGNvb2tpZXNfOworfQorCisvLyByZXBlYXRlZCAuY29iYWx0LnN0b3JhZ2UuTG9jYWxTdG9yYWdlIGxvY2FsX3N0b3JhZ2VzID0gMjsKK2lubGluZSBpbnQgU3RvcmFnZTo6bG9jYWxfc3RvcmFnZXNfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGxvY2FsX3N0b3JhZ2VzXy5zaXplKCk7Cit9CitpbmxpbmUgdm9pZCBTdG9yYWdlOjpjbGVhcl9sb2NhbF9zdG9yYWdlcygpIHsKKyAgbG9jYWxfc3RvcmFnZXNfLkNsZWFyKCk7Cit9CitpbmxpbmUgY29uc3QgOjpjb2JhbHQ6OnN0b3JhZ2U6OkxvY2FsU3RvcmFnZSYgU3RvcmFnZTo6bG9jYWxfc3RvcmFnZXMoaW50IGluZGV4KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Y29iYWx0LnN0b3JhZ2UuU3RvcmFnZS5sb2NhbF9zdG9yYWdlcykKKyAgcmV0dXJuIGxvY2FsX3N0b3JhZ2VzXy5HZXQoaW5kZXgpOworfQoraW5saW5lIDo6Y29iYWx0OjpzdG9yYWdlOjpMb2NhbFN0b3JhZ2UqIFN0b3JhZ2U6Om11dGFibGVfbG9jYWxfc3RvcmFnZXMoaW50IGluZGV4KSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmNvYmFsdC5zdG9yYWdlLlN0b3JhZ2UubG9jYWxfc3RvcmFnZXMpCisgIHJldHVybiBsb2NhbF9zdG9yYWdlc18uTXV0YWJsZShpbmRleCk7Cit9CitpbmxpbmUgOjpjb2JhbHQ6OnN0b3JhZ2U6OkxvY2FsU3RvcmFnZSogU3RvcmFnZTo6YWRkX2xvY2FsX3N0b3JhZ2VzKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmNvYmFsdC5zdG9yYWdlLlN0b3JhZ2UubG9jYWxfc3RvcmFnZXMpCisgIHJldHVybiBsb2NhbF9zdG9yYWdlc18uQWRkKCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OmNvYmFsdDo6c3RvcmFnZTo6TG9jYWxTdG9yYWdlID4qCitTdG9yYWdlOjptdXRhYmxlX2xvY2FsX3N0b3JhZ2VzKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0OmNvYmFsdC5zdG9yYWdlLlN0b3JhZ2UubG9jYWxfc3RvcmFnZXMpCisgIHJldHVybiAmbG9jYWxfc3RvcmFnZXNfOworfQoraW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpjb2JhbHQ6OnN0b3JhZ2U6OkxvY2FsU3RvcmFnZSA+JgorU3RvcmFnZTo6bG9jYWxfc3RvcmFnZXMoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0OmNvYmFsdC5zdG9yYWdlLlN0b3JhZ2UubG9jYWxfc3RvcmFnZXMpCisgIHJldHVybiBsb2NhbF9zdG9yYWdlc187Cit9CisKKyNlbmRpZiAgLy8gIVBST1RPQlVGX0lOTElORV9OT1RfSU5fSEVBREVSUworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobmFtZXNwYWNlX3Njb3BlKQorCit9ICAvLyBuYW1lc3BhY2Ugc3RvcmFnZQorfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2xvYmFsX3Njb3BlKQorCisjZW5kaWYgIC8vIFBST1RPQlVGX3N0b3JhZ2VfMmVwcm90b19fSU5DTFVERUQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3RvcmFnZS9zdG9yZS9zdG9yYWdlLnByb3RvIGIvc3JjL2NvYmFsdC9zdG9yYWdlL3N0b3JlL3N0b3JhZ2UucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVjMjhhZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvc3RvcmFnZS9zdG9yZS9zdG9yYWdlLnByb3RvCkBAIC0wLDAgKzEsODAgQEAKKy8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3N5bnRheCA9ICJwcm90bzMiOworCitvcHRpb24gb3B0aW1pemVfZm9yID0gTElURV9SVU5USU1FOworb3B0aW9uIGphdmFfcGFja2FnZSA9ICJkZXYuY29iYWx0LnN0b3JhZ2UiOworb3B0aW9uIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gIlN0b3JhZ2VQcm90byI7CisKK3BhY2thZ2UgY29iYWx0LnN0b3JhZ2U7CisKKy8vIEEgc2luZ2xlIGNvb2tpZSByZXByZXNlbnRhdGlvbi4KK21lc3NhZ2UgQ29va2llIHsKKyAgLy8gVGhlIG5hbWUgb2YgdGhlIGNvb2tpZS4KKyAgc3RyaW5nIG5hbWUgPSAxOworCisgIC8vIFRoZSB2YWx1ZSBvZiB0aGUgY29va2llLgorICBzdHJpbmcgdmFsdWUgPSAyOworCisgIC8vIFRoZSBkb21haW4gb2YgdGhlIHVybCBmb3Igd2hpY2ggdGhlIGNvb2tpZSBpcyBzdG9yZS4KKyAgc3RyaW5nIGRvbWFpbiA9IDM7CisKKyAgLy8gVGhlIHBhdGggb2YgdGhlIHVybCBmb3Igd2hpY2ggdGhlIGNvb2tpZSBpcyBzdG9yZWQuCisgIHN0cmluZyBwYXRoID0gNDsKKworICAvLyBUaGUgY3JlYXRpb24gdGltZSBmb3IgdGhlIGNvb2tpZSBpbiBtaWNyb3NlY29uZHMgc2luY2UKKyAgLy8gV2luZG93cyBlcG9jaCAtIDEvMS8xNjAxIFVUQy4KKyAgaW50NjQgY3JlYXRpb25fdGltZV91cyA9IDU7CisKKyAgLy8gVGhlIGV4cGlyYXRpb24gdGltZSBmb3IgdGhlIGNvb2tpZSBpbiBtaWNyb3NlY29uZHMgc2luY2UKKyAgLy8gV2luZG93cyBlcG9jaCAtIDEvMS8xNjAxIFVUQy4KKyAgaW50NjQgZXhwaXJhdGlvbl90aW1lX3VzID0gNjsKKworICAvLyBUaGUgbGFzdCBhY2Nlc3MgdGltZSBpbiBtaWNyb3NlY29uZHMgc2luY2UKKyAgLy8gV2luZG93cyBlcG9jaCAtIDEvMS8xNjAxIFVUQy4KKyAgaW50NjQgbGFzdF9hY2Nlc3NfdGltZV91cyA9IDc7CisKKyAgLy8gV2hldGhlciB0aGUgY29va2llIHNob3VsZCBiZSB0cmFuc21pdHRlZCBvbmx5IG92ZXIgc2VjdXJlIGNvbm5lY3Rpb24uCisgIC8vIERlZmF1bHRzIHRvIGZhbHNlLgorICBib29sIHNlY3VyZSA9IDg7CisKKyAgLy8gV2hldGhlciB0aGlzIGlzIGFuIEhUVFAtb25seSBjb29raWUuIERlZmF1bHRzIHRvIGZhbHNlLgorICBib29sIGh0dHBfb25seSA9IDk7Cit9CisKKy8vIEEgc2luZ2xlIGxvY2FsIHN0b3JhZ2UgZW50cnkuCittZXNzYWdlIExvY2FsU3RvcmFnZUVudHJ5IHsKKyAgLy8gVGhlIGtleSBmb3IgdGhlIGxvY2FsIHN0b3JhZ2UgZW50cnkuCisgIHN0cmluZyBrZXkgPSAxOworCisgIC8vIFRoZSB2YWx1ZSBvZiB0aGUgbG9jYWwgc3RvcmFnZSBlbnRyeS4KKyAgc3RyaW5nIHZhbHVlID0gMjsKK30KKworLy8gTXVsdGlwbGUgbG9jYWwgc3RvcmFnZXMgaWRlbnRpZmllZCBieSB1bmlxdWUgaWQuCittZXNzYWdlIExvY2FsU3RvcmFnZSB7CisgIC8vIEEgc2l0ZSBpZCBvZiB0aGUgbG9jYWwgc3RvcmFnZS4KKyAgc3RyaW5nIGlkID0gMTsKKyAgLy8gVGhlIGxvY2FsIHN0b3JhZ2UgZW50cmllcyBmb3IgaW5kaXZpZHVhbCBsb2NhbCBzdG9yYWdlLgorICByZXBlYXRlZCBMb2NhbFN0b3JhZ2VFbnRyeSBsb2NhbF9zdG9yYWdlX2VudHJpZXMgPSAyOworfQorCisvLyBUaGUgZnVsbCBzdG9yYWdlLgorbWVzc2FnZSBTdG9yYWdlIHsKKyAgLy8gQWxsIHRoZSBjb29raWVzLgorICByZXBlYXRlZCBDb29raWUgY29va2llcyA9IDE7CisgIC8vIEFsbCBsb2NhbCBzdG9yYWdlcy4KKyAgcmVwZWF0ZWQgTG9jYWxTdG9yYWdlIGxvY2FsX3N0b3JhZ2VzID0gMjsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3RvcmFnZS9zdG9yZS9zdG9yZS5neXAgYi9zcmMvY29iYWx0L3N0b3JhZ2Uvc3RvcmUvc3RvcmUuZ3lwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjYzdiNDQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L3N0b3JhZ2Uvc3RvcmUvc3RvcmUuZ3lwCkBAIC0wLDAgKzEsODUgQEAKKyMgQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworeworICAndGFyZ2V0cyc6IFsKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnbWVtb3J5X3N0b3JlJywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnbWVtb3J5X3N0b3JlLmgnLAorICAgICAgICAnbWVtb3J5X3N0b3JlLmNjJywKKyAgICAgICAgJ3N0b3JhZ2UucGIuY2MnLAorICAgICAgICAnc3RvcmFnZS5wYi5oJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChERVBUSCkvY29iYWx0L3N0b3JhZ2Uvc3RvcmFnZV9jb25zdGFudHMuZ3lwOnN0b3JhZ2VfY29uc3RhbnRzJywKKyAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9iYXNlL2Jhc2UuZ3lwOmJhc2UnLAorICAgICAgICAnPChERVBUSCkvbmV0L25ldC5neXA6bmV0JywKKyAgICAgICAgJzwoREVQVEgpL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3Byb3RvYnVmLmd5cDpwcm90b2J1Zl9saXRlJywKKyAgICAgIF0sCisgICAgICAnaW5jbHVkZV9kaXJzJzogWworICAgICAgICAjIEdldCBwcm90b2J1ZiBoZWFkZXJzIGZyb20gdGhlIGNocm9taXVtIHRyZWUuCisgICAgICAgICc8KERFUFRIKS90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMnLAorICAgICAgXSwKKyAgICAgICdkZWZpbmVzJzogWworICAgICAgICAjIFRoZSBnZW5lcmF0ZWQgY29kZSBuZWVkcyB0byBiZSBjb21waWxlZCB3aXRoIHRoZSBzYW1lIGZsYWdzIGFzIHRoZSBwcm90b2J1ZiBsaWJyYXJ5LgorICAgICAgICAjIE90aGVyd2lzZSB3ZSBnZXQgc3RhdGljIGluaXRpYWxpemVycyB3aGljaCBhcmUgbm90IHRocmVhZCBzYWZlLgorICAgICAgICAjIFRoaXMgbWFjcm8gbXVzdCBiZSBkZWZpbmVkIHRvIHN1cHByZXNzIHRoZSB1c2Ugb2YgZHluYW1pY19jYXN0PD4sCisgICAgICAgICMgd2hpY2ggcmVxdWlyZXMgUlRUSS4KKyAgICAgICAgJ0dPT0dMRV9QUk9UT0JVRl9OT19SVFRJJywKKyAgICAgICAgJ0dPT0dMRV9QUk9UT0JVRl9OT19TVEFUSUNfSU5JVElBTElaRVInLAorICAgICAgICAnSEFWRV9QVEhSRUFEJywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnbWVtb3J5X3N0b3JlX3Rlc3QnLAorICAgICAgJ3R5cGUnOiAnPChndGVzdF90YXJnZXRfdHlwZSknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdtZW1vcnlfc3RvcmVfdGVzdC5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9iYXNlL2Jhc2UuZ3lwOmJhc2UnLAorICAgICAgICAnPChERVBUSCkvY29iYWx0L3Rlc3QvdGVzdC5neXA6cnVuX2FsbF91bml0dGVzdHMnLAorICAgICAgICAnPChERVBUSCkvdGVzdGluZy9nbW9jay5neXA6Z21vY2snLAorICAgICAgICAnPChERVBUSCkvdGVzdGluZy9ndGVzdC5neXA6Z3Rlc3QnLAorICAgICAgICAnbWVtb3J5X3N0b3JlJywKKyAgICAgIF0sCisgICAgICAnaW5jbHVkZV9kaXJzJzogWworICAgICAgICAjIEdldCBwcm90b2J1ZiBoZWFkZXJzIGZyb20gdGhlIGNocm9taXVtIHRyZWUuCisgICAgICAgICc8KERFUFRIKS90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMnLAorICAgICAgXSwKKyAgICAgICdkZWZpbmVzJzogWworICAgICAgICAjIFRoZSBnZW5lcmF0ZWQgY29kZSBuZWVkcyB0byBiZSBjb21waWxlZCB3aXRoIHRoZSBzYW1lIGZsYWdzIGFzIHRoZSBwcm90b2J1ZiBsaWJyYXJ5LgorICAgICAgICAjIE90aGVyd2lzZSB3ZSBnZXQgc3RhdGljIGluaXRpYWxpemVycyB3aGljaCBhcmUgbm90IHRocmVhZCBzYWZlLgorICAgICAgICAjIFRoaXMgbWFjcm8gbXVzdCBiZSBkZWZpbmVkIHRvIHN1cHByZXNzIHRoZSB1c2Ugb2YgZHluYW1pY19jYXN0PD4sCisgICAgICAgICMgd2hpY2ggcmVxdWlyZXMgUlRUSS4KKyAgICAgICAgJ0dPT0dMRV9QUk9UT0JVRl9OT19SVFRJJywKKyAgICAgICAgJ0dPT0dMRV9QUk9UT0JVRl9OT19TVEFUSUNfSU5JVElBTElaRVInLAorICAgICAgICAnSEFWRV9QVEhSRUFEJywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnbWVtb3J5X3N0b3JlX3Rlc3RfZGVwbG95JywKKyAgICAgICd0eXBlJzogJ25vbmUnLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJ21lbW9yeV9zdG9yZV90ZXN0JywKKyAgICAgIF0sCisgICAgICAndmFyaWFibGVzJzogeworICAgICAgICAnZXhlY3V0YWJsZV9uYW1lJzogJ21lbW9yeV9zdG9yZV90ZXN0JywKKyAgICAgIH0sCisgICAgICAnaW5jbHVkZXMnOiBbICc8KERFUFRIKS9zdGFyYm9hcmQvYnVpbGQvZGVwbG95Lmd5cGknIF0sCisgICAgfSwKKyAgXSwKK30KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3RvcmFnZS9zdG9yZV91cGdyYWRlL3NxbF92ZnMuY2MgYi9zcmMvY29iYWx0L3N0b3JhZ2Uvc3RvcmVfdXBncmFkZS9zcWxfdmZzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyYjQzNDIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L3N0b3JhZ2Uvc3RvcmVfdXBncmFkZS9zcWxfdmZzLmNjCkBAIC0wLDAgKzEsMjYwIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiY29iYWx0L3N0b3JhZ2Uvc3RvcmVfdXBncmFkZS9zcWxfdmZzLmgiCisKKyNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJiYXNlL3JhbmRfdXRpbC5oIgorI2luY2x1ZGUgImJhc2Uvc3RyaW5nX3V0aWwuaCIKKyNpbmNsdWRlICJiYXNlL3N5bmNocm9uaXphdGlvbi9sb2NrLmgiCisjaW5jbHVkZSAiY29iYWx0L3N0b3JhZ2Uvc3RvcmVfdXBncmFkZS92aXJ0dWFsX2ZpbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc3RvcmFnZS9zdG9yZV91cGdyYWRlL3ZpcnR1YWxfZmlsZV9zeXN0ZW0uaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9zcWxpdGUvc3FsaXRlMy5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBzdG9yYWdlIHsKK25hbWVzcGFjZSBzdG9yZV91cGdyYWRlIHsKK25hbWVzcGFjZSB7CisKKy8vIEEgInN1YmNsYXNzIiBvZiBzcWxpdGUzX2ZpbGUgd2l0aCBvdXIgcmVxdWlyZWQgZGF0YSBzdHJ1Y3R1cmVzIGFkZGVkLgorc3RydWN0IHZpcnR1YWxfZmlsZSB7CisgIHNxbGl0ZTNfZmlsZSBzcWxfaW50ZXJuYWxfZmlsZTsKKyAgVmlydHVhbEZpbGUqIGZpbGU7CisgIGJhc2U6OkxvY2sqIGxvY2s7CisgIGludCBjdXJyZW50X2xvY2s7CisgIGludCBzaGFyZWQ7Cit9OworCitpbnQgVmZzQ2xvc2Uoc3FsaXRlM19maWxlKiBmaWxlKSB7CisgIHZpcnR1YWxfZmlsZSogdmZpbGUgPSByZWludGVycHJldF9jYXN0PHZpcnR1YWxfZmlsZSo+KGZpbGUpOworICBkZWxldGUgdmZpbGUtPmxvY2s7CisgIHJldHVybiBTUUxJVEVfT0s7Cit9CisKK2ludCBWZnNSZWFkKHNxbGl0ZTNfZmlsZSogZmlsZSwgdm9pZCogb3V0LCBpbnQgYnl0ZXMsIHNxbGl0ZV9pbnQ2NCBvZmZzZXQpIHsKKyAgdmlydHVhbF9maWxlKiB2ZmlsZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dmlydHVhbF9maWxlKj4oZmlsZSk7CisgIHZmaWxlLT5maWxlLT5SZWFkKG91dCwgYnl0ZXMsIHN0YXRpY19jYXN0PGludD4ob2Zmc2V0KSk7CisgIHJldHVybiBTUUxJVEVfT0s7Cit9CisKK2ludCBWZnNXcml0ZShzcWxpdGUzX2ZpbGUqIGZpbGUsIGNvbnN0IHZvaWQqIGRhdGEsIGludCBieXRlcywKKyAgICAgICAgICAgICBzcWxpdGUzX2ludDY0IG9mZnNldCkgeworICB2aXJ0dWFsX2ZpbGUqIHZmaWxlID0gcmVpbnRlcnByZXRfY2FzdDx2aXJ0dWFsX2ZpbGUqPihmaWxlKTsKKyAgdmZpbGUtPmZpbGUtPldyaXRlKGRhdGEsIGJ5dGVzLCBzdGF0aWNfY2FzdDxpbnQ+KG9mZnNldCkpOworICByZXR1cm4gU1FMSVRFX09LOworfQorCitpbnQgVmZzU3luYyhzcWxpdGUzX2ZpbGUqIHBGaWxlLCBpbnQgZmxhZ3MpIHsKKyAgVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUihwRmlsZSk7CisgIFVOUkVGRVJFTkNFRF9QQVJBTUVURVIoZmxhZ3MpOworICByZXR1cm4gU1FMSVRFX09LOworfQorCitpbnQgVmZzRmlsZUNvbnRyb2woc3FsaXRlM19maWxlKiBwRmlsZSwgaW50IG9wLCB2b2lkKiBwQXJnKSB7CisgIFVOUkVGRVJFTkNFRF9QQVJBTUVURVIocEZpbGUpOworICBVTlJFRkVSRU5DRURfUEFSQU1FVEVSKG9wKTsKKyAgVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUihwQXJnKTsKKyAgcmV0dXJuIFNRTElURV9PSzsKK30KKworaW50IFZmc1NlY3RvclNpemUoc3FsaXRlM19maWxlKiBmaWxlKSB7CisgIC8vIFRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgcmVhZCB3aXRob3V0IGRpc3R1cmJpbmcgb3RoZXIgYnl0ZXMgaW4gdGhlCisgIC8vIGZpbGUuCisgIFVOUkVGRVJFTkNFRF9QQVJBTUVURVIoZmlsZSk7CisgIHJldHVybiAxOworfQorCitpbnQgVmZzTG9jayhzcWxpdGUzX2ZpbGUqIGZpbGUsIGNvbnN0IGludCBtb2RlKSB7CisgIHZpcnR1YWxfZmlsZSogdmZpbGUgPSByZWludGVycHJldF9jYXN0PHZpcnR1YWxfZmlsZSo+KGZpbGUpOworICBiYXNlOjpBdXRvTG9jayBsb2NrKCp2ZmlsZS0+bG9jayk7CisKKyAgLy8gSWYgdGhlcmUgaXMgYWxyZWFkeSBhIGxvY2sgb2YgdGhpcyB0eXBlIG9yIG1vcmUgcmVzdHJpY3RpdmUsIGRvIG5vdGhpbmcKKyAgaWYgKHZmaWxlLT5jdXJyZW50X2xvY2sgPj0gbW9kZSkgeworICAgIHJldHVybiBTUUxJVEVfT0s7CisgIH0KKworICBpZiAobW9kZSA9PSBTUUxJVEVfTE9DS19TSEFSRUQpIHsKKyAgICBEQ0hFQ0tfRVEodmZpbGUtPmN1cnJlbnRfbG9jaywgU1FMSVRFX0xPQ0tfTk9ORSk7CisgICAgdmZpbGUtPnNoYXJlZCsrOworICAgIHZmaWxlLT5jdXJyZW50X2xvY2sgPSBTUUxJVEVfTE9DS19TSEFSRUQ7CisgIH0KKworICBpZiAobW9kZSA9PSBTUUxJVEVfTE9DS19SRVNFUlZFRCkgeworICAgIERDSEVDS19FUSh2ZmlsZS0+Y3VycmVudF9sb2NrLCBTUUxJVEVfTE9DS19TSEFSRUQpOworICAgIHZmaWxlLT5jdXJyZW50X2xvY2sgPSBTUUxJVEVfTE9DS19SRVNFUlZFRDsKKyAgfQorCisgIGlmIChtb2RlID09IFNRTElURV9MT0NLX0VYQ0xVU0lWRSkgeworICAgIGlmICh2ZmlsZS0+Y3VycmVudF9sb2NrID49IFNRTElURV9MT0NLX1BFTkRJTkcpIHsKKyAgICAgIHJldHVybiBTUUxJVEVfQlVTWTsKKyAgICB9CisgICAgdmZpbGUtPmN1cnJlbnRfbG9jayA9IFNRTElURV9MT0NLX1BFTkRJTkc7CisgICAgaWYgKHZmaWxlLT5zaGFyZWQgPiAxKSB7CisgICAgICAvLyBUaGVyZSBhcmUgc29tZSBvdXRzdGFuZGluZyBzaGFyZWQgbG9ja3MgKGdyZWF0ZXIgdGhhbiBvbmUgYmVjYXVzZSB0aGUKKyAgICAgIC8vIHBlbmRpbmcgbG9jayBpcyBhbiAidXBncmFkZWQiIHNoYXJlZCBsb2NrKQorICAgICAgcmV0dXJuIFNRTElURV9CVVNZOworICAgIH0KKyAgICAvLyBBY3F1aXJlIHRoZSBleGNsdXNpdmUgbG9jaworICAgIHZmaWxlLT5jdXJyZW50X2xvY2sgPSBTUUxJVEVfTE9DS19FWENMVVNJVkU7CisgIH0KKworICByZXR1cm4gU1FMSVRFX09LOworfQorCitpbnQgVmZzVW5sb2NrKHNxbGl0ZTNfZmlsZSogZmlsZSwgaW50IG1vZGUpIHsKKyAgRENIRUNLX0xFKG1vZGUsIFNRTElURV9MT0NLX1NIQVJFRCk7CisgIHZpcnR1YWxfZmlsZSogdmZpbGUgPSByZWludGVycHJldF9jYXN0PHZpcnR1YWxfZmlsZSo+KGZpbGUpOworICBiYXNlOjpBdXRvTG9jayBsb2NrKCp2ZmlsZS0+bG9jayk7CisKKyAgQ09NUElMRV9BU1NFUlQoU1FMSVRFX0xPQ0tfTk9ORSA8IFNRTElURV9MT0NLX1NIQVJFRCwKKyAgICAgICAgICAgICAgICAgc3FsaXRlX2xvY2tfY29uc3RhbnRzX29yZGVyX2hhc19jaGFuZ2VkKTsKKyAgQ09NUElMRV9BU1NFUlQoU1FMSVRFX0xPQ0tfU0hBUkVEIDwgU1FMSVRFX0xPQ0tfUkVTRVJWRUQsCisgICAgICAgICAgICAgICAgIHNxbGl0ZV9sb2NrX2NvbnN0YW50c19vcmRlcl9oYXNfY2hhbmdlZCk7CisgIENPTVBJTEVfQVNTRVJUKFNRTElURV9MT0NLX1JFU0VSVkVEIDwgU1FMSVRFX0xPQ0tfUEVORElORywKKyAgICAgICAgICAgICAgICAgc3FsaXRlX2xvY2tfY29uc3RhbnRzX29yZGVyX2hhc19jaGFuZ2VkKTsKKyAgQ09NUElMRV9BU1NFUlQoU1FMSVRFX0xPQ0tfUEVORElORyA8IFNRTElURV9MT0NLX0VYQ0xVU0lWRSwKKyAgICAgICAgICAgICAgICAgc3FsaXRlX2xvY2tfY29uc3RhbnRzX29yZGVyX2hhc19jaGFuZ2VkKTsKKworICBpZiAobW9kZSA9PSBTUUxJVEVfTE9DS19OT05FICYmIHZmaWxlLT5jdXJyZW50X2xvY2sgPj0gU1FMSVRFX0xPQ0tfU0hBUkVEKSB7CisgICAgdmZpbGUtPnNoYXJlZC0tOworICB9CisKKyAgdmZpbGUtPmN1cnJlbnRfbG9jayA9IG1vZGU7CisgIHJldHVybiBTUUxJVEVfT0s7Cit9CisKK2ludCBWZnNDaGVja1Jlc2VydmVkTG9jayhzcWxpdGUzX2ZpbGUqIGZpbGUsIGludCogcmVzdWx0KSB7CisgIHZpcnR1YWxfZmlsZSogdmZpbGUgPSByZWludGVycHJldF9jYXN0PHZpcnR1YWxfZmlsZSo+KGZpbGUpOworICBiYXNlOjpBdXRvTG9jayBsb2NrKCp2ZmlsZS0+bG9jayk7CisKKyAgLy8gVGhlIGZ1bmN0aW9uIGV4cGVjdHMgYSByZXN1bHQgaXMgMSBpZiB0aGUgbG9jayBpcyByZXNlcnZlZCwgcGVuZGluZywgb3IKKyAgLy8gZXhjbHVzaXZlOyAwIG90aGVyd2lzZS4KKyAgKnJlc3VsdCA9IHZmaWxlLT5jdXJyZW50X2xvY2sgPj0gU1FMSVRFX0xPQ0tfUkVTRVJWRUQgPyAxIDogMDsKKyAgcmV0dXJuIFNRTElURV9PSzsKK30KKworaW50IFZmc0ZpbGVTaXplKHNxbGl0ZTNfZmlsZSogZmlsZSwgc3FsaXRlM19pbnQ2NCogb3V0X3NpemUpIHsKKyAgdmlydHVhbF9maWxlKiB2ZmlsZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dmlydHVhbF9maWxlKj4oZmlsZSk7CisgICpvdXRfc2l6ZSA9IHZmaWxlLT5maWxlLT5TaXplKCk7CisgIHJldHVybiBTUUxJVEVfT0s7Cit9CisKK2ludCBWZnNUcnVuY2F0ZShzcWxpdGUzX2ZpbGUqIGZpbGUsIHNxbGl0ZTNfaW50NjQgc2l6ZSkgeworICB2aXJ0dWFsX2ZpbGUqIHZmaWxlID0gcmVpbnRlcnByZXRfY2FzdDx2aXJ0dWFsX2ZpbGUqPihmaWxlKTsKKyAgdmZpbGUtPmZpbGUtPlRydW5jYXRlKHN0YXRpY19jYXN0PGludD4oc2l6ZSkpOworICByZXR1cm4gU1FMSVRFX09LOworfQorCitpbnQgVmZzRGV2aWNlQ2hhcmFjdGVyaXN0aWNzKHNxbGl0ZTNfZmlsZSogZmlsZSkgeworICBVTlJFRkVSRU5DRURfUEFSQU1FVEVSKGZpbGUpOworICByZXR1cm4gMDsKK30KKworY29uc3Qgc3FsaXRlM19pb19tZXRob2RzIHNfY29iYWx0X3Zmc19pbyA9IHsKKyAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0cnVjdHVyZSB2ZXJzaW9uIG51bWJlcgorICAgIFZmc0Nsb3NlLCAgICAgICAgICAgICAgICAgLy8geENsb3NlCisgICAgVmZzUmVhZCwgICAgICAgICAgICAgICAgICAvLyB4UmVhZAorICAgIFZmc1dyaXRlLCAgICAgICAgICAgICAgICAgLy8geFdyaXRlCisgICAgVmZzVHJ1bmNhdGUsICAgICAgICAgICAgICAvLyB4VHJ1bmNhdGUKKyAgICBWZnNTeW5jLCAgICAgICAgICAgICAgICAgIC8vIHhTeW5jCisgICAgVmZzRmlsZVNpemUsICAgICAgICAgICAgICAvLyB4RmlsZVNpemUKKyAgICBWZnNMb2NrLCAgICAgICAgICAgICAgICAgIC8vIHhMb2NrCisgICAgVmZzVW5sb2NrLCAgICAgICAgICAgICAgICAvLyB4VW5sb2NrCisgICAgVmZzQ2hlY2tSZXNlcnZlZExvY2ssICAgICAvLyB4Q2hlY2tSZXNlcnZlZExvY2sKKyAgICBWZnNGaWxlQ29udHJvbCwgICAgICAgICAgIC8vIHhGaWxlQ29udHJvbAorICAgIFZmc1NlY3RvclNpemUsICAgICAgICAgICAgLy8geFNlY3RvclNpemUKKyAgICBWZnNEZXZpY2VDaGFyYWN0ZXJpc3RpY3MgIC8vIHhEZXZpY2VDaGFyYWN0ZXJpc3RpY3MKK307CisKK2ludCBWZnNPcGVuKHNxbGl0ZTNfdmZzKiBzcWxfdmZzLCBjb25zdCBjaGFyKiBwYXRoLCBzcWxpdGUzX2ZpbGUqIGZpbGUsCisgICAgICAgICAgICBpbnQgZmxhZ3MsIGludCogb3V0X2ZsYWdzKSB7CisgIFVOUkVGRVJFTkNFRF9QQVJBTUVURVIoZmxhZ3MpOworICBVTlJFRkVSRU5DRURfUEFSQU1FVEVSKG91dF9mbGFncyk7CisgIERDSEVDSyhwYXRoKSA8PCAiTlVMTCBmaWxlbmFtZSBub3Qgc3VwcG9ydGVkLiI7CisgIHZpcnR1YWxfZmlsZSogdmZpbGUgPSByZWludGVycHJldF9jYXN0PHZpcnR1YWxfZmlsZSo+KGZpbGUpOworICB2ZmlsZS0+bG9jayA9IG5ldyBiYXNlOjpMb2NrOworICBmaWxlLT5wTWV0aG9kcyA9ICZzX2NvYmFsdF92ZnNfaW87CisKKyAgVmlydHVhbEZpbGVTeXN0ZW0qIHZmcyA9CisgICAgICByZWludGVycHJldF9jYXN0PFZpcnR1YWxGaWxlU3lzdGVtKj4oc3FsX3Zmcy0+cEFwcERhdGEpOworICB2ZmlsZS0+ZmlsZSA9IHZmcy0+T3BlbihwYXRoKTsKKyAgcmV0dXJuIFNRTElURV9PSzsKK30KKworaW50IFZmc0RlbGV0ZShzcWxpdGUzX3Zmcyogc3FsX3ZmcywgY29uc3QgY2hhciogcGF0aCwgaW50IHN5bmNfZGlyKSB7CisgIFVOUkVGRVJFTkNFRF9QQVJBTUVURVIoc3luY19kaXIpOworICBWaXJ0dWFsRmlsZVN5c3RlbSogdmZzID0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8VmlydHVhbEZpbGVTeXN0ZW0qPihzcWxfdmZzLT5wQXBwRGF0YSk7CisgIHZmcy0+RGVsZXRlKHBhdGgpOworICByZXR1cm4gU1FMSVRFX09LOworfQorCitpbnQgVmZzRnVsbFBhdGhuYW1lKHNxbGl0ZTNfdmZzKiBzcWxfdmZzLCBjb25zdCBjaGFyKiBwYXRoLCBpbnQgb3V0X3NpemUsCisgICAgICAgICAgICAgICAgICAgIGNoYXIqIG91dF9wYXRoKSB7CisgIFVOUkVGRVJFTkNFRF9QQVJBTUVURVIoc3FsX3Zmcyk7CisgIHNpemVfdCBwYXRoX3NpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KG91dF9zaXplKTsKKyAgaWYgKGJhc2U6OnN0cmxjcHkob3V0X3BhdGgsIHBhdGgsIHBhdGhfc2l6ZSkgPCBwYXRoX3NpemUpIHsKKyAgICByZXR1cm4gU1FMSVRFX09LOworICB9CisgIHJldHVybiBTUUxJVEVfRVJST1I7Cit9CisKK2ludCBWZnNBY2Nlc3Moc3FsaXRlM192ZnMqIHNxbF92ZnMsIGNvbnN0IGNoYXIqIG5hbWUsIGludCBmbGFncywgaW50KiByZXN1bHQpIHsKKyAgVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUihuYW1lKTsKKyAgVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUihzcWxfdmZzKTsKKyAgVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUihmbGFncyk7CisgIC8vIFdlIHNob3VsZCBhbHdheXMgaGF2ZSBhIHZhbGlkLCByZWFkYWJsZS93cml0YWJsZSBmaWxlLgorICAqcmVzdWx0IHw9IFNRTElURV9BQ0NFU1NfRVhJU1RTIHwgU1FMSVRFX0FDQ0VTU19SRUFEV1JJVEU7CisgIHJldHVybiBTUUxJVEVfT0s7Cit9CisKK2ludCBWZnNSYW5kb21uZXNzKHNxbGl0ZTNfdmZzKiBzcWxfdmZzLCBpbnQgYnl0ZXMsIGNoYXIqIG91dCkgeworICBVTlJFRkVSRU5DRURfUEFSQU1FVEVSKHNxbF92ZnMpOworICBiYXNlOjpSYW5kQnl0ZXMob3V0LCBzdGF0aWNfY2FzdDxzaXplX3Q+KGJ5dGVzKSk7CisgIHJldHVybiBTUUxJVEVfT0s7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitTcWxWZnM6OlNxbFZmcyhjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgVmlydHVhbEZpbGVTeXN0ZW0qIHZmcykKKyAgICA6IHNxbF92ZnNfKG5ldyBzcWxpdGUzX3ZmcygpKSB7CisgIG1lbXNldChzcWxfdmZzXy5nZXQoKSwgMCwgc2l6ZW9mKHNxbGl0ZTNfdmZzKSk7CisgIHNxbF92ZnNfLT5pVmVyc2lvbiA9IDE7CisgIHNxbF92ZnNfLT5zek9zRmlsZSA9IHNpemVvZih2aXJ0dWFsX2ZpbGUpOworICBzcWxfdmZzXy0+bXhQYXRobmFtZSA9IFZpcnR1YWxGaWxlOjprTWF4VmZzUGF0aG5hbWU7CisgIHNxbF92ZnNfLT5wTmV4dCA9IE5VTEw7CisgIHNxbF92ZnNfLT56TmFtZSA9IG5hbWUuY19zdHIoKTsKKyAgc3FsX3Zmc18tPnBBcHBEYXRhID0gdmZzOworICBzcWxfdmZzXy0+eE9wZW4gPSBWZnNPcGVuOworICBzcWxfdmZzXy0+eERlbGV0ZSA9IFZmc0RlbGV0ZTsKKyAgc3FsX3Zmc18tPnhBY2Nlc3MgPSBWZnNBY2Nlc3M7CisgIHNxbF92ZnNfLT54RnVsbFBhdGhuYW1lID0gVmZzRnVsbFBhdGhuYW1lOworICBzcWxfdmZzXy0+eFJhbmRvbW5lc3MgPSBWZnNSYW5kb21uZXNzOworCisgIC8vIEVuc3VyZSB3ZSBhcmUgbm90IHJlZ2lzdGVyaW5nIG11bHRpcGxlIG9mIHRoZXNlIHdpdGggdGhlIHNhbWUgbmFtZS4KKyAgLy8gQmVoYXZpb3IgaXMgdW5kZWZpbmVkIGluIHRoYXQgY2FzZS4KKyAgRENIRUNLKHNxbGl0ZTNfdmZzX2ZpbmQobmFtZS5jX3N0cigpKSA9PSBOVUxMKTsKKworICBpbnQgcmV0ID0gc3FsaXRlM192ZnNfcmVnaXN0ZXIoc3FsX3Zmc18uZ2V0KCksIDEgLyogbWFrZV9kZWZhdWx0ICovKTsKKyAgRENIRUNLX0VRKHJldCwgU1FMSVRFX09LKTsKK30KKworU3FsVmZzOjp+U3FsVmZzKCkgeworICBpbnQgcmV0ID0gc3FsaXRlM192ZnNfdW5yZWdpc3RlcihzcWxfdmZzXy5nZXQoKSk7CisgIERDSEVDS19FUShyZXQsIFNRTElURV9PSyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBzdG9yZV91cGdyYWRlCit9ICAvLyBuYW1lc3BhY2Ugc3RvcmFnZQorfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zdG9yYWdlL3N0b3JlX3VwZ3JhZGUvc3FsX3Zmcy5oIGIvc3JjL2NvYmFsdC9zdG9yYWdlL3N0b3JlX3VwZ3JhZGUvc3FsX3Zmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMDU4OGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L3N0b3JhZ2Uvc3RvcmVfdXBncmFkZS9zcWxfdmZzLmgKQEAgLTAsMCArMSw0NSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBDT0JBTFRfU1RPUkFHRV9TVE9SRV9VUEdSQURFX1NRTF9WRlNfSF8KKyNkZWZpbmUgQ09CQUxUX1NUT1JBR0VfU1RPUkVfVVBHUkFERV9TUUxfVkZTX0hfCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCisKK3N0cnVjdCBzcWxpdGUzX3ZmczsKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2Ugc3RvcmFnZSB7CituYW1lc3BhY2Ugc3RvcmVfdXBncmFkZSB7CisKK2NsYXNzIFZpcnR1YWxGaWxlU3lzdGVtOworCisvLyBJbXBsZW1lbnQgdGhlIG5lY2Vzc2FyeSBBUElzIGZvciBhIFNxbGl0ZSB2aXJ0dWFsIGZpbGUgc3lzdGVtLgorLy8gRGlzcGF0Y2ggY2FsbHMgdG8gdGhlIG93bmluZyBWaXJ0dWFsRmlsZVN5c3RlbS4KK2NsYXNzIFNxbFZmcyB7CisgcHVibGljOgorICBTcWxWZnMoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIFZpcnR1YWxGaWxlU3lzdGVtKiB2ZnMpOworICB+U3FsVmZzKCk7CisKKyBwcml2YXRlOgorICBzY29wZWRfcHRyPHNxbGl0ZTNfdmZzPiBzcWxfdmZzXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBzdG9yZV91cGdyYWRlCit9ICAvLyBuYW1lc3BhY2Ugc3RvcmFnZQorfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIENPQkFMVF9TVE9SQUdFX1NUT1JFX1VQR1JBREVfU1FMX1ZGU19IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zdG9yYWdlL3N0b3JlX3VwZ3JhZGUvdGVzdGRhdGEvdGVzdC5zdG9yYWdlIGIvc3JjL2NvYmFsdC9zdG9yYWdlL3N0b3JlX3VwZ3JhZGUvdGVzdGRhdGEvdGVzdC5zdG9yYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMmM0YzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L3N0b3JhZ2Uvc3RvcmVfdXBncmFkZS90ZXN0ZGF0YS90ZXN0LnN0b3JhZ2UKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zdG9yYWdlL3N0b3JlX3VwZ3JhZGUvdXBncmFkZS5jYyBiL3NyYy9jb2JhbHQvc3RvcmFnZS9zdG9yZV91cGdyYWRlL3VwZ3JhZGUuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMxODEwNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvc3RvcmFnZS9zdG9yZV91cGdyYWRlL3VwZ3JhZGUuY2MKQEAgLTAsMCArMSwyMTAgQEAKKy8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJjb2JhbHQvc3RvcmFnZS9zdG9yZV91cGdyYWRlL3VwZ3JhZGUuaCIKKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHVwbGU+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgorI2luY2x1ZGUgImJhc2UvZmlsZV9wYXRoLmgiCisjaW5jbHVkZSAiY29iYWx0L3N0b3JhZ2Uvc3RvcmFnZV9jb25zdGFudHMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc3RvcmFnZS9zdG9yZS9zdG9yYWdlLnBiLmgiCisjaW5jbHVkZSAiY29iYWx0L3N0b3JhZ2Uvc3RvcmVfdXBncmFkZS9zcWxfdmZzLmgiCisjaW5jbHVkZSAiY29iYWx0L3N0b3JhZ2Uvc3RvcmVfdXBncmFkZS92aXJ0dWFsX2ZpbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc3RvcmFnZS9zdG9yZV91cGdyYWRlL3ZpcnR1YWxfZmlsZV9zeXN0ZW0uaCIKKyNpbmNsdWRlICJnb29nbGV1cmwvc3JjL2d1cmwuaCIKKyNpbmNsdWRlICJuYi9tZW1vcnlfc2NvcGUuaCIKKyNpbmNsdWRlICJuZXQvY29va2llcy9jYW5vbmljYWxfY29va2llLmgiCisjaW5jbHVkZSAic3FsL2Nvbm5lY3Rpb24uaCIKKyNpbmNsdWRlICJzcWwvc3RhdGVtZW50LmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3N0b3JhZ2UuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9zcWxpdGUvc3FsaXRlMy5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBzdG9yYWdlIHsKK25hbWVzcGFjZSBzdG9yZV91cGdyYWRlIHsKK25hbWVzcGFjZSB7CisKK2NvbnN0ZXhwciBjaGFyIGtEZWZhdWx0U2F2ZUZpbGVbXSA9ICJjb2JhbHRfc2F2ZS5iaW4iOworCit0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gU3RvcmFnZU1hcDsKKworY29uc3Qgc3RkOjpzdHJpbmcmIEdldEZpcnN0VmFsaWREYXRhYmFzZUZpbGUoCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBmaWxlbmFtZXMpIHsKKyAgLy8gQ2FsbGVyIG11c3QgZW5zdXJlIGF0IGxlYXN0IG9uZSBmaWxlIGV4aXN0cy4KKyAgRENIRUNLX0dUKGZpbGVuYW1lcy5zaXplKCksIHNpemVfdCgwKSk7CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmaWxlbmFtZXMuc2l6ZSgpOyArK2kpIHsKKyAgICBzcWw6OkNvbm5lY3Rpb24gY29ubmVjdGlvbjsKKyAgICBib29sIGlzX29wZW5lZCA9IGNvbm5lY3Rpb24uT3BlbihGaWxlUGF0aChmaWxlbmFtZXNbaV0pKTsKKyAgICBpZiAoIWlzX29wZW5lZCkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIGludCBlcnIgPSBjb25uZWN0aW9uLkV4ZWN1dGVBbmRSZXR1cm5FcnJvckNvZGUoInByYWdtYSBzY2hlbWFfdmVyc2lvbjsiKTsKKyAgICBpZiAoZXJyICE9IFNRTElURV9PSykgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIC8vIEZpbGUgY2FuIGJlIG9wZW5lZCBhcyBhIGRhdGFiYXNlLgorICAgIHJldHVybiBmaWxlbmFtZXNbaV07CisgIH0KKworICAvLyBDYWxsZXIgbXVzdCBoYW5kbGUgY2FzZSB3aGVyZSBhIHZhbGlkIGRhdGFiYXNlIGZpbGUgY2Fubm90IGJlIGZvdW5kLgorICBETE9HKFdBUk5JTkcpIDw8ICJDYW5ub3QgZmluZCB2YWxpZCBkYXRhYmFzZSBmaWxlIGluIHNhdmUgZGF0YSI7CisgIHJldHVybiBmaWxlbmFtZXNbMF07Cit9CisKK3ZvaWQgR2V0QWxsQ29va2llcyhzcWw6OkNvbm5lY3Rpb24qIGNvbm4sIFN0b3JhZ2UqIHN0b3JhZ2UpIHsKKyAgc3FsOjpTdGF0ZW1lbnQgZ2V0X2FsbChjb25uLT5HZXRDYWNoZWRTdGF0ZW1lbnQoCisgICAgICBTUUxfRlJPTV9IRVJFLAorICAgICAgIlNFTEVDVCBkb21haW4sIHBhdGgsIG5hbWUsIHZhbHVlLCBjcmVhdGlvbiwgZXhwaXJhdGlvbiwgbGFzdF9hY2Nlc3MsICIKKyAgICAgICJzZWN1cmUsIGh0dHBfb25seSBGUk9NIENvb2tpZVRhYmxlIikpOworICB3aGlsZSAoZ2V0X2FsbC5TdGVwKCkpIHsKKyAgICBDb29raWUqIGNvb2tpZSA9IHN0b3JhZ2UtPmFkZF9jb29raWVzKCk7CisgICAgY29va2llLT5zZXRfZG9tYWluKGdldF9hbGwuQ29sdW1uU3RyaW5nKDApKTsKKyAgICBjb29raWUtPnNldF9wYXRoKGdldF9hbGwuQ29sdW1uU3RyaW5nKDEpKTsKKyAgICBjb29raWUtPnNldF9uYW1lKGdldF9hbGwuQ29sdW1uU3RyaW5nKDIpKTsKKyAgICBjb29raWUtPnNldF92YWx1ZShnZXRfYWxsLkNvbHVtblN0cmluZygzKSk7CisgICAgY29va2llLT5zZXRfY3JlYXRpb25fdGltZV91cyhnZXRfYWxsLkNvbHVtbkludDY0KDQpKTsKKyAgICBjb29raWUtPnNldF9leHBpcmF0aW9uX3RpbWVfdXMoZ2V0X2FsbC5Db2x1bW5JbnQ2NCg1KSk7CisgICAgY29va2llLT5zZXRfbGFzdF9hY2Nlc3NfdGltZV91cyhnZXRfYWxsLkNvbHVtbkludDY0KDYpKTsKKyAgICBjb29raWUtPnNldF9zZWN1cmUoZ2V0X2FsbC5Db2x1bW5Cb29sKDcpKTsKKyAgICBjb29raWUtPnNldF9odHRwX29ubHkoZ2V0X2FsbC5Db2x1bW5Cb29sKDgpKTsKKworICAgIERMT0coSU5GTykgPDwgIkdldEFsbENvb2tpZXM6ICIKKyAgICAgICAgICAgICAgIDw8ICIgZG9tYWluPSIgPDwgY29va2llLT5kb21haW4oKSA8PCAiIHBhdGg9IiA8PCBjb29raWUtPnBhdGgoKQorICAgICAgICAgICAgICAgPDwgIiBuYW1lPSIgPDwgY29va2llLT5uYW1lKCkgPDwgIiB2YWx1ZT0iIDw8IGNvb2tpZS0+dmFsdWUoKQorICAgICAgICAgICAgICAgPDwgIiBjcmVhdGlvbj0iIDw8IGNvb2tpZS0+Y3JlYXRpb25fdGltZV91cygpCisgICAgICAgICAgICAgICA8PCAiIGV4cGlyYXRpb249IiA8PCBjb29raWUtPmV4cGlyYXRpb25fdGltZV91cygpCisgICAgICAgICAgICAgICA8PCAiIGxhc3RfYWNjZXNzPSIgPDwgY29va2llLT5sYXN0X2FjY2Vzc190aW1lX3VzKCkKKyAgICAgICAgICAgICAgIDw8ICIgc2V1Y3VyZT0iIDw8IGNvb2tpZS0+c2VjdXJlKCkKKyAgICAgICAgICAgICAgIDw8ICIgaHR0cF9vbmx5PSIgPDwgY29va2llLT5odHRwX29ubHkoKTsKKyAgfQorfQorCit2b2lkIEdldExvY2FsU3RvcmFnZShzcWw6OkNvbm5lY3Rpb24qIGNvbm4sIFN0b3JhZ2UqIHN0b3JhZ2UpIHsKKyAgc3FsOjpTdGF0ZW1lbnQgZ2V0X2FsbChjb25uLT5HZXRDYWNoZWRTdGF0ZW1lbnQoCisgICAgICBTUUxfRlJPTV9IRVJFLAorICAgICAgIlNFTEVDVCBzaXRlX2lkZW50aWZpZXIsIGtleSwgdmFsdWUgRlJPTSBMb2NhbFN0b3JhZ2VUYWJsZSIpKTsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIExvY2FsU3RvcmFnZSo+IG1hcF9zdG9yYWdlOworICB3aGlsZSAoZ2V0X2FsbC5TdGVwKCkpIHsKKyAgICBzdGQ6OnN0cmluZyBpZChnZXRfYWxsLkNvbHVtblN0cmluZygwKSk7CisgICAgRExPRyhJTkZPKSA8PCAiR2V0TG9jYWxTdG9yYWdlOiBpZD0iIDw8IGlkOworICAgIGlmIChtYXBfc3RvcmFnZVtpZF0gPT0gbnVsbHB0cikgeworICAgICAgTG9jYWxTdG9yYWdlKiBsb2NhbF9zdG9yYWdlID0gc3RvcmFnZS0+YWRkX2xvY2FsX3N0b3JhZ2VzKCk7CisgICAgICBsb2NhbF9zdG9yYWdlLT5zZXRfaWQoaWQpOworICAgICAgbWFwX3N0b3JhZ2VbaWRdID0gbG9jYWxfc3RvcmFnZTsKKyAgICB9CisgICAgTG9jYWxTdG9yYWdlRW50cnkqIGxvY2FsX3N0b3JhZ2VfZW50cnkgPQorICAgICAgICBtYXBfc3RvcmFnZVtpZF0tPmFkZF9sb2NhbF9zdG9yYWdlX2VudHJpZXMoKTsKKyAgICBsb2NhbF9zdG9yYWdlX2VudHJ5LT5zZXRfa2V5KGdldF9hbGwuQ29sdW1uU3RyaW5nKDEpKTsKKyAgICBsb2NhbF9zdG9yYWdlX2VudHJ5LT5zZXRfdmFsdWUoZ2V0X2FsbC5Db2x1bW5TdHJpbmcoMikpOworICAgIERMT0coSU5GTykgPDwgIkdldExvY2FsU3RvcmFnZToga2V5PSIgPDwgbG9jYWxfc3RvcmFnZV9lbnRyeS0+a2V5KCkKKyAgICAgICAgICAgICAgIDw8ICIgdmFsdWU9IiA8PCBsb2NhbF9zdG9yYWdlX2VudHJ5LT52YWx1ZSgpOworICB9Cit9CisKK2Jvb2wgT3BlbkNvbm5lY3Rpb24oY29uc3Qgc3RkOjp2ZWN0b3I8dWludDg+JiByYXdfYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9wdHI8VmlydHVhbEZpbGVTeXN0ZW0+JiB2ZnMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9wdHI8U3FsVmZzPiYgc3FsX3ZmcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NvcGVkX3B0cjxzcWw6OkNvbm5lY3Rpb24+JiBjb25uZWN0aW9uKSB7CisgIFZpcnR1YWxGaWxlU3lzdGVtOjpTZXJpYWxpemVkSGVhZGVyIGhlYWRlciA9IHt9OworCisgIGlmIChyYXdfYnl0ZXMuc2l6ZSgpID4gMCkgeworICAgIGNvbnN0IGNoYXIqIGJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHJhd19ieXRlcy5kYXRhKCkpOworICAgIGludCBidWZmZXJfc2l6ZSA9IHN0YXRpY19jYXN0PGludD4ocmF3X2J5dGVzLnNpemUoKSk7CisKKyAgICBpZiAocmF3X2J5dGVzLnNpemUoKSA+PSBzaXplb2YoVmlydHVhbEZpbGVTeXN0ZW06OlNlcmlhbGl6ZWRIZWFkZXIpKSB7CisgICAgICBtZW1jcHkoJmhlYWRlciwgYnVmZmVyLCBzaXplb2YoVmlydHVhbEZpbGVTeXN0ZW06OlNlcmlhbGl6ZWRIZWFkZXIpKTsKKyAgICB9CisKKyAgICBpZiAoIXZmcy0+RGVzZXJpYWxpemUocmF3X2J5dGVzLmRhdGEoKSwgYnVmZmVyX3NpemUpKSB7CisgICAgICBETE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGRlc2VyaWFsaXplIHZmcyI7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGZpbGVuYW1lcyA9IHZmcy0+TGlzdEZpbGVzKCk7CisgIGlmIChmaWxlbmFtZXMuc2l6ZSgpID09IDApIHsKKyAgICBmaWxlbmFtZXMucHVzaF9iYWNrKGtEZWZhdWx0U2F2ZUZpbGUpOworICB9CisKKyAgLy8gTGVnYWN5IFN0ZWVsIHNhdmUgZGF0YSBtYXkgY29udGFpbiBtdWx0aXBsZSBmaWxlcyAoZS5nLiBkYi1qb3VybmFsIGFzIHdlbGwKKyAgLy8gYXMgZGIpLCBzbyB1c2UgdGhlIGZpcnN0IG9uZSB0aGF0IGxvb2tzIGxpa2UgYSB2YWxpZCBkYXRhYmFzZSBmaWxlLgorICBjb25zdCBzdGQ6OnN0cmluZyYgc2F2ZV9uYW1lID0gR2V0Rmlyc3RWYWxpZERhdGFiYXNlRmlsZShmaWxlbmFtZXMpOworICBib29sIG9rID0gY29ubmVjdGlvbi0+T3BlbihGaWxlUGF0aChzYXZlX25hbWUpKTsKKyAgaWYgKCFvaykgeworICAgIERMT0coV0FSTklORykgPDwgIkZhaWxlZCB0byBvcGVuIGZpbGU6ICIgPDwgc2F2ZV9uYW1lOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIE9wZW4oKSBpcyBsYXp5LiBSdW4gYSBxdWljayBjaGVjayB0byBzZWUgaWYgdGhlIGRhdGFiYXNlIGlzIHZhbGlkLgorICBpbnQgZXJyID0gY29ubmVjdGlvbi0+RXhlY3V0ZUFuZFJldHVybkVycm9yQ29kZSgicHJhZ21hIHNjaGVtYV92ZXJzaW9uOyIpOworICBpZiAoZXJyICE9IFNRTElURV9PSykgeworICAgIC8vIERhdGFiYXNlIHNlZW1zIHRvIGJlIGludmFsaWQuCisgICAgRExPRyhXQVJOSU5HKSA8PCAiRGF0YWJhc2UgIiA8PCBzYXZlX25hbWUgPDwgIiBhcHBlYXJzIHRvIGJlIGNvcnJ1cHQuIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBEaXNhYmxlIGpvdXJuYWxpbmcgZm9yIG91ciBpbi1tZW1vcnkgZGF0YWJhc2UuCisgIHNxbDo6U3RhdGVtZW50IGRpc2FibGVfam91cm5hbCgKKyAgICAgIGNvbm5lY3Rpb24tPkdldFVuaXF1ZVN0YXRlbWVudCgiUFJBR01BIGpvdXJuYWxfbW9kZT1PRkYiKSk7CisgIG9rID0gZGlzYWJsZV9qb3VybmFsLlN0ZXAoKTsKKyAgRENIRUNLKG9rKTsKKworICByZXR1cm4gdHJ1ZTsKK30KK30gIC8vIG5hbWVzcGFjZQorCitib29sIElzVXBncmFkZVJlcXVpcmVkKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4PiYgYnVmZmVyKSB7CisgIGJvb2wgcmVzdWx0ID0gYnVmZmVyLnNpemUoKSA+PSBrU3RvcmFnZUhlYWRlclNpemUgJiYKKyAgICAgICAgICAgICAgICBtZW1jbXAocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oYnVmZmVyLmRhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgIGtPbGRTdG9yYWdlSGVhZGVyLCBrU3RvcmFnZUhlYWRlclNpemUpID09IDA7CisgIGlmIChyZXN1bHQpIHsKKyAgICBETE9HKElORk8pIDw8ICJTdG9yZSB1cGdyYWRlIHJlcXVpcmVkIjsKKyAgfSBlbHNlIHsKKyAgICBETE9HKElORk8pIDw8ICJTdG9yZSB1cGdyYWRlIG5vdCByZXF1aXJlZCI7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworYm9vbCBVcGdyYWRlU3RvcmUoc3RkOjp2ZWN0b3I8dWludDg+KiBidWZmZXIpIHsKKyAgc2NvcGVkX3B0cjxWaXJ0dWFsRmlsZVN5c3RlbT4gdmZzKG5ldyBWaXJ0dWFsRmlsZVN5c3RlbSgpKTsKKyAgc2NvcGVkX3B0cjxTcWxWZnM+IHNxbF92ZnMobmV3IFNxbFZmcygiY29iYWx0X3ZmcyIsIHZmcy5nZXQoKSkpOworICBzY29wZWRfcHRyPHNxbDo6Q29ubmVjdGlvbj4gY29ubmVjdGlvbihuZXcgc3FsOjpDb25uZWN0aW9uKCkpOworCisgIGlmICghT3BlbkNvbm5lY3Rpb24oKmJ1ZmZlciwgdmZzLCBzcWxfdmZzLCBjb25uZWN0aW9uKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIFN0b3JhZ2Ugc3RvcmFnZTsKKyAgR2V0QWxsQ29va2llcyhjb25uZWN0aW9uLmdldCgpLCAmc3RvcmFnZSk7CisgIEdldExvY2FsU3RvcmFnZShjb25uZWN0aW9uLmdldCgpLCAmc3RvcmFnZSk7CisgIGNvbm5lY3Rpb24tPkNsb3NlKCk7CisgIHNpemVfdCBzaXplID0gc3RvcmFnZS5CeXRlU2l6ZSgpOworICBidWZmZXItPnJlc2l6ZShrU3RvcmFnZUhlYWRlclNpemUgKyBzaXplKTsKKyAgY2hhciogYnVmZmVyX3B0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGJ1ZmZlci0+ZGF0YSgpKTsKKyAgbWVtY3B5KGJ1ZmZlcl9wdHIsIGtTdG9yYWdlSGVhZGVyLCBrU3RvcmFnZUhlYWRlclNpemUpOworICBpZiAoc2l6ZSA+IDAgJiYKKyAgICAgICFzdG9yYWdlLlNlcmlhbGl6ZVRvQXJyYXkoYnVmZmVyX3B0ciArIGtTdG9yYWdlSGVhZGVyU2l6ZSwgc2l6ZSkpIHsKKyAgICBETE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHNlcmlhbGl6ZSBtZXNzYWdlIHdpdGggc2l6ZT0iIDw8IHNpemU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorfSAgLy8gbmFtZXNwYWNlIHN0b3JlX3VwZ3JhZGUKK30gIC8vIG5hbWVzcGFjZSBzdG9yYWdlCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3N0b3JhZ2Uvc3RvcmVfdXBncmFkZS91cGdyYWRlLmd5cCBiL3NyYy9jb2JhbHQvc3RvcmFnZS9zdG9yZV91cGdyYWRlL3VwZ3JhZGUuZ3lwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMTk2OGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L3N0b3JhZ2Uvc3RvcmVfdXBncmFkZS91cGdyYWRlLmd5cApAQCAtMCwwICsxLDk4IEBACisjIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3sKKyAgJ3RhcmdldHMnOiBbCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ3N0b3JhZ2VfdXBncmFkZScsCisgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJy4uL3N0b3JlL3N0b3JhZ2UucGIuaCcsCisgICAgICAgICdzcWxfdmZzLmNjJywKKyAgICAgICAgJ3NxbF92ZnMuaCcsCisgICAgICAgICd1cGdyYWRlLmNjJywKKyAgICAgICAgJ3VwZ3JhZGUuaCcsCisgICAgICAgICd2aXJ0dWFsX2ZpbGUuY2MnLAorICAgICAgICAndmlydHVhbF9maWxlLmgnLAorICAgICAgICAndmlydHVhbF9maWxlX3N5c3RlbS5jYycsCisgICAgICAgICd2aXJ0dWFsX2ZpbGVfc3lzdGVtLmgnCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9iYXNlL2Jhc2UuZ3lwOmJhc2UnLAorICAgICAgICAnPChERVBUSCkvY29iYWx0L3N0b3JhZ2Uvc3RvcmFnZV9jb25zdGFudHMuZ3lwOnN0b3JhZ2VfY29uc3RhbnRzJywKKyAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9zdG9yYWdlL3N0b3JlL3N0b3JlLmd5cDptZW1vcnlfc3RvcmUnLAorICAgICAgICAnPChERVBUSCkvbmV0L25ldC5neXA6bmV0JywKKyAgICAgICAgJzwoREVQVEgpL3NxbC9zcWwuZ3lwOnNxbCcsCisgICAgICAgICc8KERFUFRIKS90aGlyZF9wYXJ0eS9wcm90b2J1Zi9wcm90b2J1Zi5neXA6cHJvdG9idWZfbGl0ZScsCisgICAgICBdLAorICAgICAgJ2RlZmluZXMnOiBbCisgICAgICAgICdHT09HTEVfUFJPVE9CVUZfTk9fUlRUSScsCisgICAgICAgICdHT09HTEVfUFJPVE9CVUZfTk9fU1RBVElDX0lOSVRJQUxJWkVSJywKKyAgICAgICAgJ0hBVkVfUFRIUkVBRCcsCisgICAgICBdLAorICAgICAgJ2luY2x1ZGVfZGlycyc6IFsKKyAgICAgICAgIyBHZXQgcHJvdG9idWYgaGVhZGVycyBmcm9tIHRoZSBjaHJvbWl1bSB0cmVlLgorICAgICAgICAnPChERVBUSCkvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjJywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnc3RvcmFnZV91cGdyYWRlX3Rlc3QnLAorICAgICAgJ3R5cGUnOiAnPChndGVzdF90YXJnZXRfdHlwZSknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICcuLi9zdG9yZS9zdG9yYWdlLnBiLmgnLAorICAgICAgICAndXBncmFkZV90ZXN0LmNjJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnc3RvcmFnZV91cGdyYWRlJywKKyAgICAgICAgJ3N0b3JhZ2VfdXBncmFkZV9jb3B5X3Rlc3RfZmlsZXMnLAorICAgICAgICAnPChERVBUSCkvY29iYWx0L2Jhc2UvYmFzZS5neXA6YmFzZScsCisgICAgICAgICc8KERFUFRIKS9jb2JhbHQvdGVzdC90ZXN0Lmd5cDpydW5fYWxsX3VuaXR0ZXN0cycsCisgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2dtb2NrLmd5cDpnbW9jaycsCisgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2d0ZXN0Lmd5cDpndGVzdCcsCisgICAgICAgICc8KERFUFRIKS90aGlyZF9wYXJ0eS9wcm90b2J1Zi9wcm90b2J1Zi5neXA6cHJvdG9idWZfbGl0ZScsCisgICAgICBdLAorICAgICAgJ2RlZmluZXMnOiBbCisgICAgICAgICdHT09HTEVfUFJPVE9CVUZfTk9fUlRUSScsCisgICAgICAgICdHT09HTEVfUFJPVE9CVUZfTk9fU1RBVElDX0lOSVRJQUxJWkVSJywKKyAgICAgICAgJ0hBVkVfUFRIUkVBRCcsCisgICAgICBdLAorICAgICAgJ2luY2x1ZGVfZGlycyc6IFsKKyAgICAgICAgIyBHZXQgcHJvdG9idWYgaGVhZGVycyBmcm9tIHRoZSBjaHJvbWl1bSB0cmVlLgorICAgICAgICAnPChERVBUSCkvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjJywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnc3RvcmFnZV91cGdyYWRlX3Rlc3RfZGVwbG95JywKKyAgICAgICd0eXBlJzogJ25vbmUnLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJ3N0b3JhZ2VfdXBncmFkZV90ZXN0JywKKyAgICAgIF0sCisgICAgICAndmFyaWFibGVzJzogeworICAgICAgICAnZXhlY3V0YWJsZV9uYW1lJzogJ3N0b3JhZ2VfdXBncmFkZV90ZXN0JywKKyAgICAgIH0sCisgICAgICAnaW5jbHVkZXMnOiBbICc8KERFUFRIKS9zdGFyYm9hcmQvYnVpbGQvZGVwbG95Lmd5cGknIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnc3RvcmFnZV91cGdyYWRlX2NvcHlfdGVzdF9maWxlcycsCisgICAgICAndHlwZSc6ICdub25lJywKKyAgICAgICd2YXJpYWJsZXMnOiB7CisgICAgICAgICdjb250ZW50X3Rlc3RfaW5wdXRfZmlsZXMnOiBbCisgICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9zdG9yYWdlL3N0b3JlX3VwZ3JhZGUvdGVzdGRhdGEvJywKKyAgICAgICAgXSwKKyAgICAgICAgJ2NvbnRlbnRfdGVzdF9vdXRwdXRfc3ViZGlyJzogJ2NvYmFsdC9zdG9yYWdlL3N0b3JlX3VwZ3JhZGUvdGVzdGRhdGEvJywKKyAgICAgIH0sCisgICAgICAnaW5jbHVkZXMnOiBbICc8KERFUFRIKS9zdGFyYm9hcmQvYnVpbGQvY29weV90ZXN0X2RhdGEuZ3lwaScgXSwKKyAgICB9LAorICBdLAorfQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zdG9yYWdlL3N0b3JlX3VwZ3JhZGUvdXBncmFkZS5oIGIvc3JjL2NvYmFsdC9zdG9yYWdlL3N0b3JlX3VwZ3JhZGUvdXBncmFkZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZjM0MjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L3N0b3JhZ2Uvc3RvcmVfdXBncmFkZS91cGdyYWRlLmgKQEAgLTAsMCArMSwzNyBAQAorLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBDT0JBTFRfU1RPUkFHRV9TVE9SRV9VUEdSQURFX1VQR1JBREVfSF8KKyNkZWZpbmUgQ09CQUxUX1NUT1JBR0VfU1RPUkVfVVBHUkFERV9VUEdSQURFX0hfCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIHN0b3JhZ2UgeworbmFtZXNwYWNlIHN0b3JlX3VwZ3JhZGUgeworCisvLyBDaGVja3Mgd2hldGhlciBzdG9yZSB1cGdyYWRlIGlzIHJlcXVpcmVkLgorYm9vbCBJc1VwZ3JhZGVSZXF1aXJlZChjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OD4mIGJ1ZmZlcik7CisKKy8vIFVwZ3JhZGVzIHRoZSBzdG9yZSBibG9iLgorYm9vbCBVcGdyYWRlU3RvcmUoc3RkOjp2ZWN0b3I8dWludDg+KiBidWZmZXIpOworCit9ICAvLyBuYW1lc3BhY2Ugc3RvcmVfdXBncmFkZQorfSAgLy8gbmFtZXNwYWNlIHN0b3JhZ2UKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBDT0JBTFRfU1RPUkFHRV9TVE9SRV9VUEdSQURFX1VQR1JBREVfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3RvcmFnZS9zdG9yZV91cGdyYWRlL3VwZ3JhZGVfbWFpbi5jYyBiL3NyYy9jb2JhbHQvc3RvcmFnZS9zdG9yZV91cGdyYWRlL3VwZ3JhZGVfbWFpbi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGE1NjA4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9zdG9yYWdlL3N0b3JlX3VwZ3JhZGUvdXBncmFkZV9tYWluLmNjCkBAIC0wLDAgKzEsNjUgQEAKKy8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJiYXNlL3BhdGhfc2VydmljZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL2dldF9hcHBsaWNhdGlvbl9rZXkuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS93cmFwX21haW4uaCIKKyNpbmNsdWRlICJjb2JhbHQvc3RvcmFnZS9zYXZlZ2FtZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zdG9yYWdlL3N0b3JlL21lbW9yeV9zdG9yZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zdG9yYWdlL3N0b3JlX3VwZ3JhZGUvdXBncmFkZS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBzdG9yYWdlIHsKK25hbWVzcGFjZSBzdG9yZV91cGdyYWRlIHsKKworc2l6ZV90IGtNYXhTYXZlR2FtZVNpemVCeXRlcyA9IDQgKiAxMDI0ICogMTAyNDsKK2NvbnN0IGNoYXIga0RlZmF1bHRVUkxbXSA9ICJodHRwczovL3d3dy55b3V0dWJlLmNvbS90diI7CisKK2ludCBVcGdyYWRlTWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgc3RkOjp2ZWN0b3I8dWludDg+IGJ1ZmZlcjsKKyAgU2F2ZWdhbWU6Ok9wdGlvbnMgb3B0aW9uczsKKworICBiYXNlOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4gcGFydGl0aW9uX2tleTsKKyAgcGFydGl0aW9uX2tleSA9IGJhc2U6OkdldEFwcGxpY2F0aW9uS2V5KEdVUkwoa0RlZmF1bHRVUkwpKTsKKworICBvcHRpb25zLmlkID0gcGFydGl0aW9uX2tleTsKKyAgb3B0aW9ucy5mYWxsYmFja190b19kZWZhdWx0X2lkID0gdHJ1ZTsKKworICBzY29wZWRfcHRyPFNhdmVnYW1lPiBzYXZlZ2FtZSA9IFNhdmVnYW1lOjpDcmVhdGUob3B0aW9ucyk7CisgIGlmICghc2F2ZWdhbWUtPlJlYWQoJmJ1ZmZlciwga01heFNhdmVHYW1lU2l6ZUJ5dGVzKSkgeworICAgIERMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gcmVhZCBzdG9yYWdlIjsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgRExPRyhJTkZPKSA8PCAicmVhZDogc2l6ZT0iIDw8IGJ1ZmZlci5zaXplKCk7CisgIGlmIChJc1VwZ3JhZGVSZXF1aXJlZChidWZmZXIpKSB7CisgICAgRExPRyhJTkZPKSA8PCAiVXBnYXJkZWQgcmVxdWlyZWQiOworICAgIGlmICghVXBncmFkZVN0b3JlKCZidWZmZXIpKSB7CisgICAgICBETE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHVwZ3JhZGUiOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfQorCisgIGlmICghc2F2ZWdhbWUtPldyaXRlKGJ1ZmZlcikpIHsKKyAgICBETE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHNhdmUiOworICAgIHJldHVybiAtMTsKKyAgfQorICBETE9HKElORk8pIDw8ICJTVUNDRVNTOiB1cGdhcmRlZCBzaXplPSIgPDwgYnVmZmVyLnNpemUoKTsKKyAgcmV0dXJuIDA7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBzdG9yZV91cGdyYWRlCit9ICAvLyBuYW1lc3BhY2Ugc3RvcmFnZQorfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCitDT0JBTFRfV1JBUF9TSU1QTEVfTUFJTihjb2JhbHQ6OnN0b3JhZ2U6OnN0b3JlX3VwZ3JhZGU6OlVwZ3JhZGVNYWluKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3RvcmFnZS9zdG9yZV91cGdyYWRlL3VwZ3JhZGVfdGVzdC5jYyBiL3NyYy9jb2JhbHQvc3RvcmFnZS9zdG9yZV91cGdyYWRlL3VwZ3JhZGVfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTdlYjkxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9zdG9yYWdlL3N0b3JlX3VwZ3JhZGUvdXBncmFkZV90ZXN0LmNjCkBAIC0wLDAgKzEsMTAzIEBACisvLyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiY29iYWx0L3N0b3JhZ2Uvc3RvcmVfdXBncmFkZS91cGdyYWRlLmgiCisKKyNpbmNsdWRlICJiYXNlL2Jhc2VfcGF0aHMuaCIKKyNpbmNsdWRlICJiYXNlL2ZpbGVfdXRpbC5oIgorI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgorI2luY2x1ZGUgImJhc2UvcGF0aF9zZXJ2aWNlLmgiCisjaW5jbHVkZSAiYmFzZS9wbGF0Zm9ybV9maWxlLmgiCisjaW5jbHVkZSAiYmFzZS90aW1lLmgiCisjaW5jbHVkZSAiY29iYWx0L3N0b3JhZ2Uvc3RvcmFnZV9jb25zdGFudHMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc3RvcmFnZS9zdG9yZS9zdG9yYWdlLnBiLmgiCisjaW5jbHVkZSAiZ29vZ2xldXJsL3NyYy9ndXJsLmgiCisjaW5jbHVkZSAibmV0L2Nvb2tpZXMvY2Fub25pY2FsX2Nvb2tpZS5oIgorI2luY2x1ZGUgInRlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay5oIgorI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBzdG9yYWdlIHsKK25hbWVzcGFjZSBzdG9yZV91cGdyYWRlIHsKK25hbWVzcGFjZSB7CisKK3N0ZDo6dmVjdG9yPHVpbnQ4PiBSZWFkRmlsZShjb25zdCBjaGFyKiBwYXRobmFtZSkgeworICBGaWxlUGF0aCBmaWxlX3BhdGg7CisgIEVYUEVDVF9UUlVFKFBhdGhTZXJ2aWNlOjpHZXQoYmFzZTo6RElSX1RFU1RfREFUQSwgJmZpbGVfcGF0aCkpOworICBmaWxlX3BhdGggPSBmaWxlX3BhdGguQXBwZW5kKHBhdGhuYW1lKTsKKyAgc3RkOjpzdHJpbmcgc3RyaW5nX291dDsKKyAgRVhQRUNUX1RSVUUoZmlsZV91dGlsOjpSZWFkRmlsZVRvU3RyaW5nKGZpbGVfcGF0aCwgJnN0cmluZ19vdXQpKTsKKyAgc3RkOjp2ZWN0b3I8dWludDg+IGJ1ZmZlcihzdHJpbmdfb3V0LmJlZ2luKCksIHN0cmluZ19vdXQuZW5kKCkpOworICByZXR1cm4gYnVmZmVyOworfQorCit2b2lkIFZhbGlkYXRlQ29va2llKGNvbnN0IGNvYmFsdDo6c3RvcmFnZTo6Q29va2llJiBjb29raWUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGRvbWFpbiwgY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgIGludDY0IGNyZWF0aW9uX3RpbWVfdXMsIGNvbnN0IGludDY0IGV4cGlyYXRpb25fdGltZV91cywKKyAgICAgICAgICAgICAgICAgICAgaW50NjQgbGFzdF9hY2Nlc3NfdGltZV91cywgYm9vbCBodHRwX29ubHkpIHsKKyAgRVhQRUNUX0VRKGNvb2tpZS5uYW1lKCksIG5hbWUpOworICBFWFBFQ1RfRVEoY29va2llLnZhbHVlKCksIHZhbHVlKTsKKyAgRVhQRUNUX0VRKGNvb2tpZS5kb21haW4oKSwgZG9tYWluKTsKKyAgRVhQRUNUX0VRKGNvb2tpZS5wYXRoKCksIHBhdGgpOworICBFWFBFQ1RfRVEoY29va2llLmNyZWF0aW9uX3RpbWVfdXMoKSwgY3JlYXRpb25fdGltZV91cyk7CisgIEVYUEVDVF9FUShjb29raWUuZXhwaXJhdGlvbl90aW1lX3VzKCksIGV4cGlyYXRpb25fdGltZV91cyk7CisgIEVYUEVDVF9FUShjb29raWUubGFzdF9hY2Nlc3NfdGltZV91cygpLCBsYXN0X2FjY2Vzc190aW1lX3VzKTsKKyAgRVhQRUNUX0VRKGNvb2tpZS5zZWN1cmUoKSwgZmFsc2UpOworICBFWFBFQ1RfRVEoY29va2llLmh0dHBfb25seSgpLCBodHRwX29ubHkpOworfQorCit2b2lkIFZhbGlkYXRlTG9jYWxTdG9yYWdlRW50cnkoCisgICAgY29uc3QgY29iYWx0OjpzdG9yYWdlOjpMb2NhbFN0b3JhZ2VFbnRyeSYgbG9jYWxfc3RvcmFnZV9lbnRyeSwKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgRVhQRUNUX0VRKGxvY2FsX3N0b3JhZ2VfZW50cnkua2V5KCksIGtleSk7CisgIEVYUEVDVF9FUShsb2NhbF9zdG9yYWdlX2VudHJ5LnZhbHVlKCksIHZhbHVlKTsKK30KKworVEVTVChTdG9yYWdlVXBncmFkZVRlc3QsIFVwZ3JhZGUpIHsKKyAgc3RkOjp2ZWN0b3I8dWludDg+IGJ1ZmZlciA9CisgICAgICBSZWFkRmlsZSgiY29iYWx0L3N0b3JhZ2Uvc3RvcmVfdXBncmFkZS90ZXN0ZGF0YS90ZXN0LnN0b3JhZ2UiKTsKKyAgRVhQRUNUX1RSVUUoSXNVcGdyYWRlUmVxdWlyZWQoYnVmZmVyKSk7CisgIEVYUEVDVF9UUlVFKFVwZ3JhZGVTdG9yZSgmYnVmZmVyKSk7CisKKyAgU3RvcmFnZSBzdG9yYWdlOworICBFWFBFQ1RfVFJVRShzdG9yYWdlLlBhcnNlRnJvbUFycmF5KGJ1ZmZlci5kYXRhKCkgKyBrU3RvcmFnZUhlYWRlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLnNpemUoKSkgLQorICAgICAgICAgICAgICBrU3RvcmFnZUhlYWRlclNpemUpOworCisgIGlmIChzdG9yYWdlLmNvb2tpZXMoMCkubmFtZSgpID09ICJmb28iKSB7CisgICAgVmFsaWRhdGVDb29raWUoc3RvcmFnZS5jb29raWVzKDApLCAiZm9vIiwgImJhciIsICJsb2NhbGhvc3QiLCAiLyIsCisgICAgICAgICAgICAgICAgICAgMTMxNzIyNzU3MjMyODY3NzYsIDEzMTkxMjMzMjgwMjg2Nzc2LCAxMzE5MTIzMzI4MDI4Njc3NiwKKyAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgIH0gZWxzZSB7CisgICAgVmFsaWRhdGVDb29raWUoc3RvcmFnZS5jb29raWVzKDEpLCAic2Vzc2lvbmlkIiwgIjQyNDIiLCAibG9jYWxob3N0IiwgIi8iLAorICAgICAgICAgICAgICAgICAgIDEzMTcyMjc4MjIxMTM5NTU4LCAxMzE5MTMxOTY4MDEzOTU1OCwgMTMxNzIyNzgyMjExMzk1NTgsCisgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CisgIH0KKworICBFWFBFQ1RfRVEoc3RvcmFnZS5sb2NhbF9zdG9yYWdlcygwKS5pZCgpLCAiaHR0cF9sb2NhbGhvc3RfODAwMC5sb2NhbHN0b3JhZ2UiKTsKKyAgaWYgKHN0b3JhZ2UubG9jYWxfc3RvcmFnZXMoMCkubG9jYWxfc3RvcmFnZV9lbnRyaWVzKDApLmtleSgpID09ICJmb28iKSB7CisgICAgVmFsaWRhdGVMb2NhbFN0b3JhZ2VFbnRyeSgKKyAgICAgICAgc3RvcmFnZS5sb2NhbF9zdG9yYWdlcygwKS5sb2NhbF9zdG9yYWdlX2VudHJpZXMoMCksICJmb28iLCAiYmFyIik7CisgIH0gZWxzZSB7CisgICAgVmFsaWRhdGVMb2NhbFN0b3JhZ2VFbnRyeSgKKyAgICAgICAgc3RvcmFnZS5sb2NhbF9zdG9yYWdlcygwKS5sb2NhbF9zdG9yYWdlX2VudHJpZXMoMSksICJkYXRhIiwKKyAgICAgICAgIntcIm15ZGF0YVwiOiBcIjEyM1wifSIpOworICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIHN0b3JlX3VwZ3JhZGUKK30gIC8vIG5hbWVzcGFjZSBzdG9yYWdlCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3N0b3JhZ2Uvc3RvcmVfdXBncmFkZS91cGdyYWRlX3Rvb2wuZ3lwIGIvc3JjL2NvYmFsdC9zdG9yYWdlL3N0b3JlX3VwZ3JhZGUvdXBncmFkZV90b29sLmd5cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzJmZDlmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9zdG9yYWdlL3N0b3JlX3VwZ3JhZGUvdXBncmFkZV90b29sLmd5cApAQCAtMCwwICsxLDI5IEBACisjIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3sKKyAgJ3RhcmdldHMnOiBbCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ3N0b3JhZ2VfdXBncmFkZV90b29sJywKKyAgICAgICd0eXBlJzogJzwoZmluYWxfZXhlY3V0YWJsZV90eXBlKScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ3VwZ3JhZGVfbWFpbi5jYycsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9zdG9yYWdlL3N0b3JhZ2UuZ3lwOnN0b3JhZ2UnLAorICAgICAgICAnPChERVBUSCkvY29iYWx0L3N0b3JhZ2Uvc3RvcmVfdXBncmFkZS91cGdyYWRlLmd5cDpzdG9yYWdlX3VwZ3JhZGUnLAorICAgICAgXSwKKyAgICB9LAorICBdLAorfQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zdG9yYWdlL3N0b3JlX3VwZ3JhZGUvdmlydHVhbF9maWxlLmNjIGIvc3JjL2NvYmFsdC9zdG9yYWdlL3N0b3JlX3VwZ3JhZGUvdmlydHVhbF9maWxlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNTdhYTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L3N0b3JhZ2Uvc3RvcmVfdXBncmFkZS92aXJ0dWFsX2ZpbGUuY2MKQEAgLTAsMCArMSwxODcgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJjb2JhbHQvc3RvcmFnZS9zdG9yZV91cGdyYWRlL3ZpcnR1YWxfZmlsZS5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIHN0b3JhZ2UgeworbmFtZXNwYWNlIHN0b3JlX3VwZ3JhZGUgeworbmFtZXNwYWNlIHsKKworLy8gV2UgbXVzdCB1c2UgZm9yd2FyZCBkZWNsYXJhdGlvbnMgdG8gYmUgYWJsZSB0byBzcGVjaWZ5IHRoZQorLy8gV0FSTl9VTlVTRURfUkVTVUxUIGF0dHJpYnV0ZS4KKworLy8gUmVhZCBzaXplIGJ5dGVzIGZyb20gYnVmZmVyIGludG8gZGVzdC4gVXBkYXRlcyBidWZmZXIgYW5kIGJ1ZmZlcl9yZW1haW5pbmcKKy8vIG9uIHN1Y2Nlc3MuCisvLyBSZXR1cm5zIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gYnVmZmVyIG92ZXJydW4KK2Jvb2wgUmVhZEJ1ZmZlcih1aW50OCogZGVzdCwgY29uc3QgdWludDgqKiBidWZmZXIsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgIHNpemVfdCogYnVmZmVyX3JlbWFpbmluZykgV0FSTl9VTlVTRURfUkVTVUxUOworCisvLyBXcml0ZSBzaXplIGJ5dGVzIGZyb20gc291cmNlIGludG8gYnVmZmVyLiBSZXR1cm4gIyBvZiBieXRlcyB3cml0dGVuLgorc2l6ZV90IFdyaXRlQnVmZmVyKHVpbnQ4KiBidWZmZXIsIGNvbnN0IHVpbnQ4KiBzb3VyY2UsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgIGJvb2wgZHJ5X3J1bikgV0FSTl9VTlVTRURfUkVTVUxUOworCitib29sIFJlYWRCdWZmZXIodWludDgqIGRlc3QsIGNvbnN0IHVpbnQ4KiogYnVmZmVyLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICBzaXplX3QqIGJ1ZmZlcl9yZW1haW5pbmcpIHsKKyAgaWYgKHNpemUgPiAqYnVmZmVyX3JlbWFpbmluZykgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBtZW1jcHkoZGVzdCwgKmJ1ZmZlciwgc2l6ZSk7CisgICpidWZmZXJfcmVtYWluaW5nIC09IHNpemU7CisgICpidWZmZXIgKz0gc2l6ZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3NpemVfdCBXcml0ZUJ1ZmZlcih1aW50OCogYnVmZmVyLCBjb25zdCB1aW50OCogc291cmNlLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICBib29sIGRyeV9ydW4pIHsKKyAgaWYgKCFkcnlfcnVuKSB7CisgICAgbWVtY3B5KGJ1ZmZlciwgc291cmNlLCBzaXplKTsKKyAgfQorICByZXR1cm4gc2l6ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK1ZpcnR1YWxGaWxlOjpWaXJ0dWFsRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgOiBuYW1lXyhuYW1lKSB7fQorVmlydHVhbEZpbGU6On5WaXJ0dWFsRmlsZSgpIHt9CisKK2ludCBWaXJ0dWFsRmlsZTo6UmVhZCh2b2lkKiBkZXN0LCBpbnQgYnl0ZXNfaW4sIGludCBvZmZzZXRfaW4pIGNvbnN0IHsKKyAgRENIRUNLX0dFKG9mZnNldF9pbiwgMCk7CisgIERDSEVDS19HRShieXRlc19pbiwgMCk7CisgIHNpemVfdCBvZmZzZXQgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KG9mZnNldF9pbik7CisgIHNpemVfdCBieXRlcyA9IHN0YXRpY19jYXN0PHNpemVfdD4oYnl0ZXNfaW4pOworICBzaXplX3Qgc2l6ZSA9IGJ1ZmZlcl8uc2l6ZSgpOworICBpZiAob2Zmc2V0ID4gc2l6ZSkgeworICAgIHJldHVybiAwOworICB9CisgIHNpemVfdCBieXRlc190b19yZWFkID0gc3RkOjptaW4oc3RhdGljX2Nhc3Q8c2l6ZV90PihzaXplIC0gb2Zmc2V0KSwgYnl0ZXMpOworICBpZiAoYnl0ZXNfdG9fcmVhZCA9PSAwKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgbWVtY3B5KGRlc3QsICZidWZmZXJfW29mZnNldF0sIGJ5dGVzX3RvX3JlYWQpOworICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihieXRlc190b19yZWFkKTsKK30KKworaW50IFZpcnR1YWxGaWxlOjpXcml0ZShjb25zdCB2b2lkKiBzb3VyY2UsIGludCBieXRlc19pbiwgaW50IG9mZnNldF9pbikgeworICBEQ0hFQ0tfR0Uob2Zmc2V0X2luLCAwKTsKKyAgRENIRUNLX0dFKGJ5dGVzX2luLCAwKTsKKyAgc2l6ZV90IGJ5dGVzID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihieXRlc19pbik7CisgIHNpemVfdCBvZmZzZXQgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KG9mZnNldF9pbik7CisgIGlmIChidWZmZXJfLnNpemUoKSA8IG9mZnNldCArIGJ5dGVzKSB7CisgICAgYnVmZmVyXy5yZXNpemUob2Zmc2V0ICsgYnl0ZXMpOworICB9CisKKyAgaWYgKCFidWZmZXJfLmVtcHR5KCkpIHsKKyAgICAvLyBzdGQ6OnZlY3RvciBkb2VzIG5vdCBkZWZpbmUgYWNjZXNzIHRvIHVuZGVybHlpbmcgYXJyYXkgd2hlbiBlbXB0eQorICAgIG1lbWNweSgmYnVmZmVyX1tvZmZzZXRdLCBzb3VyY2UsIGJ5dGVzKTsKKyAgfQorICByZXR1cm4gYnl0ZXNfaW47Cit9CisKK2ludCBWaXJ0dWFsRmlsZTo6VHJ1bmNhdGUoaW50IHNpemUpIHsKKyAgc2l6ZV90IG5ld3NpemUgPSBzdGQ6Om1pbihidWZmZXJfLnNpemUoKSwgc3RhdGljX2Nhc3Q8c2l6ZV90PihzaXplKSk7CisgIGJ1ZmZlcl8ucmVzaXplKG5ld3NpemUpOworICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihuZXdzaXplKTsKK30KKworaW50IFZpcnR1YWxGaWxlOjpTZXJpYWxpemUodWludDgqIGRlc3QsIGJvb2wgZHJ5X3J1bikgeworICB1aW50OCogY3VyX2J1ZmZlciA9IGRlc3Q7CisKKyAgLy8gV3JpdGUgZmlsZW5hbWUgbGVuZ3RoCisgIHVpbnQ2NCBuYW1lX2xlbmd0aCA9IG5hbWVfLmxlbmd0aCgpOworICBEQ0hFQ0tfTFQobmFtZV9sZW5ndGgsIGtNYXhWZnNQYXRobmFtZSk7CisgIGN1cl9idWZmZXIgKz0KKyAgICAgIFdyaXRlQnVmZmVyKGN1cl9idWZmZXIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPigmbmFtZV9sZW5ndGgpLAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5hbWVfbGVuZ3RoKSwgZHJ5X3J1bik7CisKKyAgLy8gV3JpdGUgdGhlIGZpbGVuYW1lCisgIGN1cl9idWZmZXIgKz0KKyAgICAgIFdyaXRlQnVmZmVyKGN1cl9idWZmZXIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPihuYW1lXy5jX3N0cigpKSwKKyAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHNpemVfdD4obmFtZV9sZW5ndGgpLCBkcnlfcnVuKTsKKworICAvLyBOT1RFOiBFbnN1cmUgdGhlIGZpbGUgc2l6ZSBpcyA2NC1iaXQgZm9yIGNvbXBhdGliaWxpdHkKKyAgLy8gd2l0aCBhbnkgZXhpc3Rpbmcgc2VyaWFsaXplZCBmaWxlcy4KKyAgdWludDY0IGZpbGVfc2l6ZSA9IHN0YXRpY19jYXN0PHVpbnQ2ND4oYnVmZmVyXy5zaXplKCkpOworICAvLyBXcml0ZSB0aGUgZmlsZSBjb250ZW50cyBzaXplCisgIGN1cl9idWZmZXIgKz0KKyAgICAgIFdyaXRlQnVmZmVyKGN1cl9idWZmZXIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPigmZmlsZV9zaXplKSwKKyAgICAgICAgICAgICAgICAgIHNpemVvZihmaWxlX3NpemUpLCBkcnlfcnVuKTsKKworICAvLyBXcml0ZSB0aGUgZmlsZSBjb250ZW50cworICBpZiAoIWJ1ZmZlcl8uZW1wdHkoKSkgeworICAgIC8vIHN0ZDo6dmVjdG9yIGRvZXMgbm90IGRlZmluZSBhY2Nlc3MgdG8gdW5kZXJseWluZyBhcnJheSB3aGVuIGVtcHR5CisgICAgY3VyX2J1ZmZlciArPSBXcml0ZUJ1ZmZlcihjdXJfYnVmZmVyLCAmYnVmZmVyX1swXSwgYnVmZmVyXy5zaXplKCksIGRyeV9ydW4pOworICB9CisKKyAgLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbgorICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihzdGQ6OmRpc3RhbmNlKGRlc3QsIGN1cl9idWZmZXIpKTsKK30KKworaW50IFZpcnR1YWxGaWxlOjpEZXNlcmlhbGl6ZShjb25zdCB1aW50OCogc291cmNlLCBzaXplX3QgYnVmZmVyX3JlbWFpbmluZykgeworICAvLyBSZWFkIGluIGZpbGVuYW1lIGxlbmd0aAorICBjb25zdCB1aW50OCogY3VyX2J1ZmZlciA9IHNvdXJjZTsKKyAgdWludDY0IG5hbWVfbGVuZ3RoOworICBib29sIHN1Y2Nlc3MgPSBSZWFkQnVmZmVyKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDgqPigmbmFtZV9sZW5ndGgpLCAmY3VyX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobmFtZV9sZW5ndGgpLCAmYnVmZmVyX3JlbWFpbmluZyk7CisgIGlmICghc3VjY2VzcykgeworICAgIERMT0coRVJST1IpIDw8ICJCdWZmZXIgb3ZlcnJ1biI7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaWYgKG5hbWVfbGVuZ3RoID49IGtNYXhWZnNQYXRobmFtZSkgeworICAgIERMT0coRVJST1IpIDw8ICJGaWxlbmFtZSB3YXMgbG9uZ2VyIHRoYW4gdGhlIG1heGltdW0gYWxsb3dlZC4iOworICAgIHJldHVybiAtMTsKKyAgfQorICAvLyBSZWFkIGluIGZpbGVuYW1lCisgIGNoYXIgbmFtZVtrTWF4VmZzUGF0aG5hbWVdOworICBzdWNjZXNzID0gUmVhZEJ1ZmZlcihyZWludGVycHJldF9jYXN0PHVpbnQ4Kj4obmFtZSksICZjdXJfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzaXplX3Q+KG5hbWVfbGVuZ3RoKSwgJmJ1ZmZlcl9yZW1haW5pbmcpOworICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICBETE9HKEVSUk9SKSA8PCAiQnVmZmVyIG92ZXJydW4iOworICAgIHJldHVybiAtMTsKKyAgfQorICBuYW1lXy5hc3NpZ24obmFtZSwgc3RhdGljX2Nhc3Q8c2l6ZV90PihuYW1lX2xlbmd0aCkpOworCisgIC8vIFJlYWQgaW4gZmlsZSBjb250ZW50cyBzaXplLgorICB1aW50NjQgZmlsZV9zaXplOworICBzdWNjZXNzID0gUmVhZEJ1ZmZlcihyZWludGVycHJldF9jYXN0PHVpbnQ4Kj4oJmZpbGVfc2l6ZSksICZjdXJfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZmlsZV9zaXplKSwgJmJ1ZmZlcl9yZW1haW5pbmcpOworICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICBETE9HKEVSUk9SKSA8PCAiQnVmZmVyIG92ZXJydW4iOworICAgIHJldHVybiAtMTsKKyAgfQorICAvLyBSZWFkIGluIHRoZSBmaWxlIGNvbnRlbnRzCisgIGJ1ZmZlcl8ucmVzaXplKHN0YXRpY19jYXN0PHNpemVfdD4oZmlsZV9zaXplKSk7CisKKyAgaWYgKCFidWZmZXJfLmVtcHR5KCkpIHsKKyAgICAvLyBzdGQ6OnZlY3RvciBkb2VzIG5vdCBkZWZpbmUgYWNjZXNzIHRvIHVuZGVybHlpbmcgYXJyYXkgd2hlbiBlbXB0eQorICAgIHN1Y2Nlc3MgPQorICAgICAgICBSZWFkQnVmZmVyKCZidWZmZXJfWzBdLCAmY3VyX2J1ZmZlciwgYnVmZmVyXy5zaXplKCksICZidWZmZXJfcmVtYWluaW5nKTsKKyAgICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICAgIERMT0coRVJST1IpIDw8ICJCdWZmZXIgb3ZlcnJ1biI7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICB9CisKKyAgLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZAorICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihzdGQ6OmRpc3RhbmNlKHNvdXJjZSwgY3VyX2J1ZmZlcikpOworfQorCit9ICAvLyBuYW1lc3BhY2Ugc3RvcmVfdXBncmFkZQorfSAgLy8gbmFtZXNwYWNlIHN0b3JhZ2UKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3RvcmFnZS9zdG9yZV91cGdyYWRlL3ZpcnR1YWxfZmlsZS5oIGIvc3JjL2NvYmFsdC9zdG9yYWdlL3N0b3JlX3VwZ3JhZGUvdmlydHVhbF9maWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA3Y2NlMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvc3RvcmFnZS9zdG9yZV91cGdyYWRlL3ZpcnR1YWxfZmlsZS5oCkBAIC0wLDAgKzEsNjkgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgQ09CQUxUX1NUT1JBR0VfU1RPUkVfVVBHUkFERV9WSVJUVUFMX0ZJTEVfSF8KKyNkZWZpbmUgQ09CQUxUX1NUT1JBR0VfU1RPUkVfVVBHUkFERV9WSVJUVUFMX0ZJTEVfSF8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKKyNpbmNsdWRlICJiYXNlL2NvbXBpbGVyX3NwZWNpZmljLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIHN0b3JhZ2UgeworbmFtZXNwYWNlIHN0b3JlX3VwZ3JhZGUgeworCitjbGFzcyBWaXJ0dWFsRmlsZVN5c3RlbTsKKworLy8gVmlydHVhbEZpbGUgaW1wbGVtZW50cyBhbiBpbi1tZW1vcnkgZmlsZSBzeXN0ZW0uIFRoZXNlCisvLyBhcmUgbWFuYWdlZCBieSBWaXJ0dWFsRmlsZVN5c3RlbSBmb3IgdXNlIGJ5IFNRTGl0ZTMuCisvLyBUaGUgZm9ybWF0IG9mIGEgc2VyaWFsaXplZCBWaXJ0dWFsRmlsZSBpcyBhcyBmb2xsb3dzOgorLy8gOC1ieXRlIG5hbWUgbGVuZ3RoCisvLyA8bmFtZSBsZW5ndGg+IEZpbGUgbmFtZSBzdHJpbmcKKy8vIDgtYnl0ZSBmaWxlIHNpemUKKy8vIDxmaWxlIHNpemU+IHJhdyBieXRlcy4KK2NsYXNzIFZpcnR1YWxGaWxlIHsKKyBwdWJsaWM6CisgIGVudW0geyBrTWF4VmZzUGF0aG5hbWUgPSA1MTIgfTsKKworICBpbnQgUmVhZCh2b2lkKiBkZXN0LCBpbnQgYnl0ZXMsIGludCBvZmZzZXQpIGNvbnN0OworICBpbnQgV3JpdGUoY29uc3Qgdm9pZCogc291cmNlLCBpbnQgYnl0ZXMsIGludCBvZmZzZXQpOworICBpbnQgVHJ1bmNhdGUoaW50IHNpemUpOworICBpbnQgU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oYnVmZmVyXy5zaXplKCkpOyB9CisKKyBwcml2YXRlOgorICBleHBsaWNpdCBWaXJ0dWFsRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSk7CisgIH5WaXJ0dWFsRmlsZSgpOworCisgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuCisgIGludCBTZXJpYWxpemUodWludDgqIGRlc3QsIGNvbnN0IGJvb2wgZHJ5X3J1bik7CisgIC8vIERlc2VyaWFsaXplcyBhIGZpbGUsIHJldHVybmluZyB0aGUgc2l6ZSBvZiB0aGUgZmlsZSBvcgorICAvLyA8IDAgb24gZXJyb3IuCisgIC8vIHxidWZmZXJfcmVtYWluaW5nfCBpcyB0aGUgbWF4aW11bSBzaXplIG9mIHxzb3VyY2V8CisgIGludCBEZXNlcmlhbGl6ZShjb25zdCB1aW50OCogc291cmNlLCBzaXplX3QgYnVmZmVyX3JlbWFpbmluZyk7CisKKyAgc3RkOjp2ZWN0b3I8dWludDg+IGJ1ZmZlcl87CisKKyAgc3RkOjpzdHJpbmcgbmFtZV87CisKKyAgZnJpZW5kIGNsYXNzIFZpcnR1YWxGaWxlU3lzdGVtOworICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oVmlydHVhbEZpbGUpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHN0b3JlX3VwZ3JhZGUKK30gIC8vIG5hbWVzcGFjZSBzdG9yYWdlCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gQ09CQUxUX1NUT1JBR0VfU1RPUkVfVVBHUkFERV9WSVJUVUFMX0ZJTEVfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3RvcmFnZS9zdG9yZV91cGdyYWRlL3ZpcnR1YWxfZmlsZV9zeXN0ZW0uY2MgYi9zcmMvY29iYWx0L3N0b3JhZ2Uvc3RvcmVfdXBncmFkZS92aXJ0dWFsX2ZpbGVfc3lzdGVtLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZGJhNDgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L3N0b3JhZ2Uvc3RvcmVfdXBncmFkZS92aXJ0dWFsX2ZpbGVfc3lzdGVtLmNjCkBAIC0wLDAgKzEsMTk1IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiY29iYWx0L3N0b3JhZ2Uvc3RvcmVfdXBncmFkZS92aXJ0dWFsX2ZpbGVfc3lzdGVtLmgiCisKKyNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJiYXNlL3N5bmNocm9uaXphdGlvbi9sb2NrLmgiCisjaW5jbHVkZSAiY29iYWx0L3N0b3JhZ2Uvc3RvcmFnZV9jb25zdGFudHMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc3RvcmFnZS9zdG9yZV91cGdyYWRlL3ZpcnR1YWxfZmlsZS5oIgorCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RyaW5nX3BvZW0uaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2Ugc3RvcmFnZSB7CituYW1lc3BhY2Ugc3RvcmVfdXBncmFkZSB7CisKKy8vIHN0YXRpYworaW50IFZpcnR1YWxGaWxlU3lzdGVtOjpHZXRIZWFkZXJWZXJzaW9uKGNvbnN0IFNlcmlhbGl6ZWRIZWFkZXImIGhlYWRlcikgeworICAvLyBDb3B5IHRoZSB2ZXJzaW9uIGludCB0byBhIGNoYXIgYnVmZmVyIHRvIGF2b2lkIGVuZGlhbiBpc3N1ZXMuCisgIGNoYXIgdmVyc2lvbltrU3RvcmFnZUhlYWRlclNpemVdOworICBtZW1jcHkodmVyc2lvbiwgJmhlYWRlci52ZXJzaW9uLCBzaXplb2YodmVyc2lvbikpOworCisgIGlmIChtZW1jbXAodmVyc2lvbiwga09sZFN0b3JhZ2VIZWFkZXIsIGtTdG9yYWdlSGVhZGVyU2l6ZSkgIT0gMCkgeworICAgIHJldHVybiAtMTsKKyAgfSBlbHNlIGlmIChoZWFkZXIuZmlsZV9zaXplIDwgc3RhdGljX2Nhc3Q8aW50PihzaXplb2YoU2VyaWFsaXplZEhlYWRlcikpKSB7CisgICAgcmV0dXJuIC0xOworICB9IGVsc2UgeworICAgIHJldHVybiB2ZXJzaW9uW2tTdG9yYWdlSGVhZGVyVmVyc2lvbkluZGV4XSAtICcwJzsKKyAgfQorfQorCisvLyBzdGF0aWMKK2ludCBWaXJ0dWFsRmlsZVN5c3RlbTo6R2V0Q3VycmVudFZlcnNpb24oKSB7CisgIGludCB2ZXJzaW9uOworICBtZW1jcHkoJnZlcnNpb24sIGtTdG9yYWdlSGVhZGVyLCBzaXplb2YodmVyc2lvbikpOworICByZXR1cm4gdmVyc2lvbjsKK30KKworVmlydHVhbEZpbGVTeXN0ZW06OlZpcnR1YWxGaWxlU3lzdGVtKCkge30KKworVmlydHVhbEZpbGVTeXN0ZW06On5WaXJ0dWFsRmlsZVN5c3RlbSgpIHsKKyAgRENIRUNLKHRocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOworICBiYXNlOjpBdXRvTG9jayBsb2NrKGZpbGVfdGFibGVfbG9ja18pOworICBDbGVhckZpbGVUYWJsZSgpOworfQorCitWaXJ0dWFsRmlsZSogVmlydHVhbEZpbGVTeXN0ZW06Ok9wZW4oY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKSB7CisgIGJhc2U6OkF1dG9Mb2NrIGxvY2soZmlsZV90YWJsZV9sb2NrXyk7CisgIFZpcnR1YWxGaWxlKiByZXN1bHQgPSBOVUxMOworICBGaWxlVGFibGU6Oml0ZXJhdG9yIGl0ID0gdGFibGVfLmZpbmQoZmlsZW5hbWUpOworICBpZiAoaXQgIT0gdGFibGVfLmVuZCgpKSB7CisgICAgcmVzdWx0ID0gaXQtPnNlY29uZDsKKyAgfSBlbHNlIHsKKyAgICByZXN1bHQgPSBuZXcgVmlydHVhbEZpbGUoZmlsZW5hbWUpOworICAgIHRhYmxlXy5pbnNlcnQoaXQsIEZpbGVUYWJsZTo6dmFsdWVfdHlwZShmaWxlbmFtZSwgcmVzdWx0KSk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IFZpcnR1YWxGaWxlU3lzdGVtOjpMaXN0RmlsZXMoKSB7CisgIGJhc2U6OkF1dG9Mb2NrIGxvY2soZmlsZV90YWJsZV9sb2NrXyk7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBmaWxlczsKKyAgZm9yIChGaWxlVGFibGU6Oml0ZXJhdG9yIGl0ID0gdGFibGVfLmJlZ2luKCk7IGl0ICE9IHRhYmxlXy5lbmQoKTsgKytpdCkgeworICAgIGZpbGVzLnB1c2hfYmFjayhpdC0+Zmlyc3QpOworICB9CisgIHJldHVybiBmaWxlczsKK30KKwordm9pZCBWaXJ0dWFsRmlsZVN5c3RlbTo6RGVsZXRlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSkgeworICBiYXNlOjpBdXRvTG9jayBsb2NrKGZpbGVfdGFibGVfbG9ja18pOworICBGaWxlVGFibGU6Oml0ZXJhdG9yIGl0ID0gdGFibGVfLmZpbmQoZmlsZW5hbWUpOworICBpZiAoaXQgIT0gdGFibGVfLmVuZCgpKSB7CisgICAgZGVsZXRlIGl0LT5zZWNvbmQ7CisgICAgdGFibGVfLmVyYXNlKGl0KTsKKyAgfQorfQorCitpbnQgVmlydHVhbEZpbGVTeXN0ZW06OlNlcmlhbGl6ZSh1aW50OCogYnVmZmVyLCBib29sIGRyeV9ydW4pIHsKKyAgRENIRUNLKHRocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOworICBiYXNlOjpBdXRvTG9jayBsb2NrKGZpbGVfdGFibGVfbG9ja18pOworICB1aW50OCogb3JpZ2luYWwgPSBidWZmZXI7CisKKyAgLy8gV2UgZG9uJ3Qga25vdyB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgZmlsZSB5ZXQsIHNvIGRlZmVyIHdyaXRpbmcgdGhlIGhlYWRlci4KKyAgYnVmZmVyICs9IHNpemVvZihTZXJpYWxpemVkSGVhZGVyKTsKKyAgaW50IHZhbGlkX2ZpbGVfY291bnQgPSAwOworCisgIC8vIFNlcmlhbGl6ZSBlYWNoIGZpbGUKKyAgZm9yIChGaWxlVGFibGU6Oml0ZXJhdG9yIGl0ID0gdGFibGVfLmJlZ2luKCk7IGl0ICE9IHRhYmxlXy5lbmQoKTsgKytpdCkgeworICAgIGlmIChpdC0+c2Vjb25kLT5TaXplKCkgPT0gMCkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIGludCBmaWxlX2J5dGVzID0gaXQtPnNlY29uZC0+U2VyaWFsaXplKGJ1ZmZlciwgZHJ5X3J1bik7CisgICAgYnVmZmVyICs9IGZpbGVfYnl0ZXM7CisgICAgdmFsaWRfZmlsZV9jb3VudCsrOworICB9CisgIGNvbnN0IGludCBieXRlc193cml0dGVuID0gc3RhdGljX2Nhc3Q8aW50PihidWZmZXIgLSBvcmlnaW5hbCk7CisgIGlmICghZHJ5X3J1bikgeworICAgIC8vIE5vdyB3ZSBjYW4gd3JpdGUgdGhlIGhlYWRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIuCisgICAgU2VyaWFsaXplZEhlYWRlciBoZWFkZXI7CisgICAgaGVhZGVyLnZlcnNpb24gPSBHZXRDdXJyZW50VmVyc2lvbigpOworICAgIGhlYWRlci5maWxlX2NvdW50ID0gdmFsaWRfZmlsZV9jb3VudDsKKyAgICBoZWFkZXIuZmlsZV9zaXplID0gYnl0ZXNfd3JpdHRlbjsKKyAgICBtZW1jcHkob3JpZ2luYWwsICZoZWFkZXIsIHNpemVvZihTZXJpYWxpemVkSGVhZGVyKSk7CisgIH0KKworICByZXR1cm4gYnl0ZXNfd3JpdHRlbjsKK30KKworYm9vbCBWaXJ0dWFsRmlsZVN5c3RlbTo6RGVzZXJpYWxpemUoY29uc3QgdWludDgqIGJ1ZmZlciwgaW50IGJ1ZmZlcl9zaXplX2luKSB7CisgIGNvbnN0IHVpbnQ4KiBjYWxsZXJfYnVmZmVyID0gYnVmZmVyOworCisgIGJhc2U6OkF1dG9Mb2NrIGxvY2soZmlsZV90YWJsZV9sb2NrXyk7CisgIENsZWFyRmlsZVRhYmxlKCk7CisKKyAgaWYgKGJ1ZmZlcl9zaXplX2luIDwgMCkgeworICAgIERMT0coRVJST1IpIDw8ICJCdWZmZXIgc2l6ZSBtdXN0IGJlIHBvc2l0aXZlOiAiIDw8IGJ1ZmZlcl9zaXplX2luCisgICAgICAgICAgICAgICAgPDwgIiA8IDAuIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBzaXplX3QgYnVmZmVyX3NpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGJ1ZmZlcl9zaXplX2luKTsKKworICAvLyBUaGUgc2l6ZSBvZiB0aGUgYnVmZmVyIG11c3QgYmUgY2hlY2tlZCBiZWZvcmUgY29weWluZyB0aGUgYmVnaW5uaW5nIG9mIGl0CisgIC8vIGludG8gYSBTZXJpYWxpemVkSGVhZGVyLgorICBpZiAoYnVmZmVyX3NpemUgPCBzaXplb2YoU2VyaWFsaXplZEhlYWRlcikpIHsKKyAgICBETE9HKEVSUk9SKSA8PCAiQnVmZmVyIHNpemUgIiA8PCBidWZmZXJfc2l6ZQorICAgICAgICAgICAgICAgIDw8ICIgaXMgdG9vIHNtYWxsIHRvIGNvbnRhaW4gYSBTZXJpYWxpemVkSGVhZGVyIG9mIHNpemUgIgorICAgICAgICAgICAgICAgIDw8IHNpemVvZihTZXJpYWxpemVkSGVhZGVyKSA8PCAiOyBvcGVyYXRpb24gYWJvcnRlZC4iOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIFJlYWQgaW4gZXhwZWN0ZWQgbnVtYmVyIG9mIGZpbGVzCisgIFNlcmlhbGl6ZWRIZWFkZXIgaGVhZGVyOworICBtZW1jcHkoJmhlYWRlciwgYnVmZmVyLCBzaXplb2YoU2VyaWFsaXplZEhlYWRlcikpOworICBidWZmZXIgKz0gc2l6ZW9mKFNlcmlhbGl6ZWRIZWFkZXIpOworCisgIGludCBidWZmZXJfdmVyc2lvbiA9IEdldEhlYWRlclZlcnNpb24oaGVhZGVyKTsKKyAgaWYgKGJ1ZmZlcl92ZXJzaW9uICE9IDApIHsKKyAgICAvLyBOb3RlOiBXZSB3b3VsZCBoYW5kbGUgb2xkIHZlcnNpb25zIGhlcmUsIGlmIG5lY2Vzc2FyeS4KKyAgICBETE9HKEVSUk9SKSA8PCAiQXR0ZW1wdGVkIHRvIGxvYWQgYSBkaWZmZXJlbnQgdmVyc2lvbjsgb3BlcmF0aW9uIGFib3J0ZWQuIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0gZWxzZSBpZiAoc3RhdGljX2Nhc3Q8c2l6ZV90PihoZWFkZXIuZmlsZV9zaXplKSAhPSBidWZmZXJfc2l6ZSkgeworICAgIERMT0coRVJST1IpIDw8ICJCdWZmZXIgc2l6ZSBtaXNtYXRjaDogIiA8PCBoZWFkZXIuZmlsZV9zaXplCisgICAgICAgICAgICAgICAgPDwgIiAhPSAiIDw8IGJ1ZmZlcl9zaXplOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgaGVhZGVyLmZpbGVfY291bnQ7ICsraSkgeworICAgIHNpemVfdCBidWZmZXJfdXNlZCA9IHN0YXRpY19jYXN0PHNpemVfdD4oYnVmZmVyIC0gY2FsbGVyX2J1ZmZlcik7CisgICAgaWYgKGJ1ZmZlcl9zaXplIDwgYnVmZmVyX3VzZWQpIHsKKyAgICAgIERMT0coRVJST1IpIDw8ICJCdWZmZXIgb3ZlcnJ1biBkZXNlcmlhbGl6aW5nIGZpbGVzIjsKKyAgICAgIENsZWFyRmlsZVRhYmxlKCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHNpemVfdCBidWZmZXJfcmVtYWluaW5nID0gYnVmZmVyX3NpemUgLSBidWZmZXJfdXNlZDsKKworICAgIFZpcnR1YWxGaWxlKiBmaWxlID0gbmV3IFZpcnR1YWxGaWxlKCIiKTsKKworICAgIGludCBieXRlcyA9IGZpbGUtPkRlc2VyaWFsaXplKGJ1ZmZlciwgYnVmZmVyX3JlbWFpbmluZyk7CisgICAgaWYgKGJ5dGVzID4gMCkgeworICAgICAgYnVmZmVyICs9IGJ5dGVzOworICAgICAgdGFibGVfW2ZpbGUtPm5hbWVfXSA9IGZpbGU7CisgICAgfSBlbHNlIHsKKyAgICAgIERMT0coV0FSTklORykgPDwgIkZhaWxlZCB0byBkZXNlcmlhbGl6ZSB2aXJ0dWFsIGZpbGUgc3lzdGVtLiI7CisgICAgICBkZWxldGUgZmlsZTsKKyAgICAgIENsZWFyRmlsZVRhYmxlKCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIFZpcnR1YWxGaWxlU3lzdGVtOjpDbGVhckZpbGVUYWJsZSgpIHsKKyAgRENIRUNLKHRocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOworICBmaWxlX3RhYmxlX2xvY2tfLkFzc2VydEFjcXVpcmVkKCk7CisgIGZvciAoRmlsZVRhYmxlOjppdGVyYXRvciBpdCA9IHRhYmxlXy5iZWdpbigpOyBpdCAhPSB0YWJsZV8uZW5kKCk7ICsraXQpIHsKKyAgICBkZWxldGUgaXQtPnNlY29uZDsKKyAgfQorICB0YWJsZV8uY2xlYXIoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHN0b3JlX3VwZ3JhZGUKK30gIC8vIG5hbWVzcGFjZSBzdG9yYWdlCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3N0b3JhZ2Uvc3RvcmVfdXBncmFkZS92aXJ0dWFsX2ZpbGVfc3lzdGVtLmggYi9zcmMvY29iYWx0L3N0b3JhZ2Uvc3RvcmVfdXBncmFkZS92aXJ0dWFsX2ZpbGVfc3lzdGVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUyZDY0MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvc3RvcmFnZS9zdG9yZV91cGdyYWRlL3ZpcnR1YWxfZmlsZV9zeXN0ZW0uaApAQCAtMCwwICsxLDkwIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaWZuZGVmIENPQkFMVF9TVE9SQUdFX1NUT1JFX1VQR1JBREVfVklSVFVBTF9GSUxFX1NZU1RFTV9IXworI2RlZmluZSBDT0JBTFRfU1RPUkFHRV9TVE9SRV9VUEdSQURFX1ZJUlRVQUxfRklMRV9TWVNURU1fSF8KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgorI2luY2x1ZGUgImJhc2Uvc3luY2hyb25pemF0aW9uL2xvY2suaCIKKyNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBzdG9yYWdlIHsKK25hbWVzcGFjZSBzdG9yZV91cGdyYWRlIHsKKworY2xhc3MgVmlydHVhbEZpbGU7CisKKy8vIEltcGxlbWVudHMgYSBzaW1wbGUgdmlydHVhbCBmaWxlc3lzdGVtLCBwcmltYXJpbHkgaW50ZW5kZWQgdG8KKy8vIGJlIHVzZWQgZm9yIHByb3ZpZGluZyBhbiBpbi1tZW1vcnkgZmlsZXN5c3RlbSB0aGF0IFNRTGl0ZSBjYW4gd3JpdGUgdG8sCisvLyBhbmQgYWxsb3dpbmcgdGhhdCBmaWxlc3lzdGVtIHRvIGJlIHNhdmVkIG91dCBpbnRvIGEgc2luZ2xlIG1lbW9yeSBidWZmZXIuCisvLyBDb250YWlucyBhIG1hcHBpbmcgZnJvbSBwYXRocyB0byB0aGVpciBjb3JyZXNwb25kaW5nIG1lbW9yeSBibG9ja3MuCisvLyBWaXJ0dWFsRmlsZVN5c3RlbSBtdXN0IGJlIHNlcmlhbGl6ZWQsIGRlc2VyaWFsaXplZCwgYW5kIGRlc3Ryb3llZCBvbiB0aGUKKy8vIHNhbWUgdGhyZWFkIGl0IHdhcyBjcmVhdGVkIG9uLgorLy8gT3Blbi9EZWxldGUgYXJlIHRocmVhZC1zYWZlIHNvIHRoYXQgU1FMIGNhbiBydW4gb24gYW55IHRocmVhZC4KK2NsYXNzIFZpcnR1YWxGaWxlU3lzdGVtIHsKKyBwdWJsaWM6CisgIHN0cnVjdCBTZXJpYWxpemVkSGVhZGVyIHsKKyAgICBpbnQzMiB2ZXJzaW9uOworICAgIGludDMyIGZpbGVfc2l6ZTsKKyAgICBpbnQzMiBmaWxlX2NvdW50OworICB9OworICAvLyBSZXR1cm5zIHRoZSB2ZXJzaW9uIG9mIHRoZSBWaXJ0dWFsRmlsZVN5c3RlbSBoZWFkZXIgaW4gYnVmZmVyLgorICAvLyAtMSBpZiBidWZmZXIgaXMgaW52YWxpZC4KKyAgc3RhdGljIGludCBHZXRIZWFkZXJWZXJzaW9uKGNvbnN0IFNlcmlhbGl6ZWRIZWFkZXImIGhlYWRlcik7CisgIHN0YXRpYyBpbnQgR2V0Q3VycmVudFZlcnNpb24oKTsKKworICBWaXJ0dWFsRmlsZVN5c3RlbSgpOworICB+VmlydHVhbEZpbGVTeXN0ZW0oKTsKKworICAvLyBTZXJpYWxpemVzIHRoZSBmaWxlIHN5c3RlbSBvdXQgdG8gYSBzaW5nbGUgY29udGlndW91cyBidWZmZXIuCisgIC8vIEEgZHJ5IHJ1biBvbmx5IGNhbGN1bGF0ZXMgdGhlIG51bWJlciBvZiBieXRlcyBuZWVkZWQuCisgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuLgorICBpbnQgU2VyaWFsaXplKHVpbnQ4KiBidWZmZXIsIGJvb2wgZHJ5X3J1bik7CisKKyAgLy8gRGVzZXJpYWxpemVzIGEgZmlsZSBzeXN0ZW0gZnJvbSBhIG1lbW9yeSBidWZmZXIuCisgIC8vIFJldHVybnMgZmFsc2Ugb24gZmFpbHVyZS4KKyAgYm9vbCBEZXNlcmlhbGl6ZShjb25zdCB1aW50OCogYnVmZmVyLCBpbnQgYnVmZmVyX3NpemUpOworCisgIC8vIFNpbXBsZSBmaWxlIG9wZW4uIFdpbGwgY3JlYXRlIGEgZmlsZSBpZiBpdCBkb2VzIG5vdCBleGlzdCwgYW5kIGZpbGVzIGFyZQorICAvLyBhbHdheXMgcmVhZGFibGUgYW5kIHdyaXRhYmxlLgorICBWaXJ0dWFsRmlsZSogT3Blbihjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpOworCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBMaXN0RmlsZXMoKTsKKworICB2b2lkIERlbGV0ZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpOworCisgcHJpdmF0ZToKKyAgdm9pZCBDbGVhckZpbGVUYWJsZSgpOworICB2b2lkIFNRTFJlZ2lzdGVyKCk7CisgIHZvaWQgU1FMVW5yZWdpc3RlcigpOworCisgIHR5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFZpcnR1YWxGaWxlKj4gRmlsZVRhYmxlOworICBGaWxlVGFibGUgdGFibGVfOworICAvLyBDZXJ0YWluIG9wZXJhdGlvbnMgKHNlcmlhbGl6ZSwgZGVzZXJpYWxpemUpIG11c3QgcnVuIG9uIHRoZSBzYW1lIHRocmVhZC4KKyAgYmFzZTo6VGhyZWFkQ2hlY2tlciB0aHJlYWRfY2hlY2tlcl87CisgIC8vIExvY2sgdG8gcHJvdGVjdCB0aGUgZmlsZSB0YWJsZS4gV2Ugd2FudCB0byBzdXBwb3J0IFNRTCBxdWVyaWVzIG9uIGFueQorICAvLyB0aHJlYWQuCisgIGJhc2U6OkxvY2sgZmlsZV90YWJsZV9sb2NrXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBzdG9yZV91cGdyYWRlCit9ICAvLyBuYW1lc3BhY2Ugc3RvcmFnZQorfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIENPQkFMVF9TVE9SQUdFX1NUT1JFX1VQR1JBREVfVklSVFVBTF9GSUxFX1NZU1RFTV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zdG9yYWdlL3N0b3JlX3VwZ3JhZGUvdmlydHVhbF9maWxlX3N5c3RlbV90ZXN0LmNjIGIvc3JjL2NvYmFsdC9zdG9yYWdlL3N0b3JlX3VwZ3JhZGUvdmlydHVhbF9maWxlX3N5c3RlbV90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ZjMxYTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L3N0b3JhZ2Uvc3RvcmVfdXBncmFkZS92aXJ0dWFsX2ZpbGVfc3lzdGVtX3Rlc3QuY2MKQEAgLTAsMCArMSwyNTUgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJjb2JhbHQvc3RvcmFnZS92aXJ0dWFsX2ZpbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc3RvcmFnZS92aXJ0dWFsX2ZpbGVfc3lzdGVtLmgiCisKKyNpbmNsdWRlICJiYXNlL2NvbXBpbGVyX3NwZWNpZmljLmgiCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgorI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RyaW5nX3BvZW0uaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2Ugc3RvcmFnZSB7CituYW1lc3BhY2Ugc3RvcmVfdXBncmFkZSB7CisKK2NsYXNzIFZpcnR1YWxGaWxlU3lzdGVtVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIFZpcnR1YWxGaWxlU3lzdGVtIHZmc187Cit9OworCitURVNUX0YoVmlydHVhbEZpbGVTeXN0ZW1UZXN0LCBXcml0ZUFuZFJlYWQpIHsKKyAgVmlydHVhbEZpbGUqIGZpbGUgPSB2ZnNfLk9wZW4oImZpbGUxLnRtcCIpOworICBBU1NFUlRfVFJVRShmaWxlKTsKKyAgRVhQRUNUX0VRKDAsIGZpbGUtPlNpemUoKSk7CisKKyAgaW50IGV4cGVjdGVkW10gPSB7MCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOX07CisgIGZpbGUtPldyaXRlKGV4cGVjdGVkLCBzaXplb2YoZXhwZWN0ZWQpLCAwKTsKKworICBjaGFyIG91dF9kYXRhWzEyOF07CisgIGludCBieXRlcyA9IGZpbGUtPlJlYWQob3V0X2RhdGEsIHNpemVvZihvdXRfZGF0YSksIDApOworICBFWFBFQ1RfRVEoYnl0ZXMsIHNpemVvZihleHBlY3RlZCkpOworICBFWFBFQ1RfRVEoMCwgbWVtY21wKGV4cGVjdGVkLCBvdXRfZGF0YSwgc2l6ZW9mKGV4cGVjdGVkKSkpOworfQorCitURVNUX0YoVmlydHVhbEZpbGVTeXN0ZW1UZXN0LCBSZWFkV3JpdGVPZmZzZXRzKSB7CisgIFZpcnR1YWxGaWxlKiBmaWxlID0gdmZzXy5PcGVuKCJmaWxlMS50bXAiKTsKKyAgQVNTRVJUX1RSVUUoZmlsZSk7CisgIEVYUEVDVF9FUSgwLCBmaWxlLT5TaXplKCkpOworCisgIGNoYXIgZXhwZWN0ZWRbXSA9IHswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5fTsKKyAgZmlsZS0+V3JpdGUoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksIDApOworCisgIC8vIFNlZWsgdG8gcG9zaXRpb24gNCBhbmQgcmVhZCBieXRlcy4KKyAgY2hhciBvdXRfZGF0YVsxMjhdOworICBpbnQgYnl0ZXMgPSBmaWxlLT5SZWFkKG91dF9kYXRhLCBzaXplb2Yob3V0X2RhdGEpLCA0KTsKKworICBjb25zdCBpbnQga0RhdGFTaXplID0gNjsKKyAgRVhQRUNUX0VRKGtEYXRhU2l6ZSwgYnl0ZXMpOworICBFWFBFQ1RfRVEoMCwgbWVtY21wKCZleHBlY3RlZFs0XSwgb3V0X2RhdGEsIGtEYXRhU2l6ZSkpOworCisgIC8vIFdyaXRlIHNvbWUgYnl0ZXMgaW50byB0aGUgbWlkZGxlCisgIGZpbGUtPldyaXRlKGV4cGVjdGVkLCAzLCAzKTsKKyAgY2hhciBleHBlY3RlZDFbXSA9IHswLCAxLCAyLCAwLCAxLCAyLCA2LCA3LCA4LCA5fTsKKyAgRVhQRUNUX0VRKHNpemVvZihleHBlY3RlZDEpLCBmaWxlLT5TaXplKCkpOworCisgIGJ5dGVzID0gZmlsZS0+UmVhZChvdXRfZGF0YSwgc2l6ZW9mKG91dF9kYXRhKSwgMCk7CisgIEVYUEVDVF9FUSgwLCBtZW1jbXAoZXhwZWN0ZWQxLCBvdXRfZGF0YSwgc3RhdGljX2Nhc3Q8c2l6ZV90PihieXRlcykpKTsKKworICAvLyBUcnkgdG8gcmVhZCBwYXN0IHRoZSBlbmQuCisgIGNvbnN0IGludCBrT2Zmc2V0UGFzdEVuZCA9IDEwMDAwMDsKKyAgYnl0ZXMgPSBmaWxlLT5SZWFkKG91dF9kYXRhLCBzaXplb2Yob3V0X2RhdGEpLCBrT2Zmc2V0UGFzdEVuZCk7CisgIEVYUEVDVF9FUSgwLCBieXRlcyk7CisKKyAgLy8gVHJ5IHRvIHdyaXRlIHBhc3QgdGhlIGVuZC4KKyAgZmlsZS0+V3JpdGUoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksIGtPZmZzZXRQYXN0RW5kKTsKKyAgRVhQRUNUX0VRKGtPZmZzZXRQYXN0RW5kICsgc2l6ZW9mKGV4cGVjdGVkKSwgZmlsZS0+U2l6ZSgpKTsKKworICAvLyBNYWtlIHN1cmUgdGhlIHdyaXRlIHBhc3QgdGhlIGVuZCB3b3JrZWQuCisgIGJ5dGVzID0gZmlsZS0+UmVhZChvdXRfZGF0YSwgc2l6ZW9mKG91dF9kYXRhKSwga09mZnNldFBhc3RFbmQpOworICBFWFBFQ1RfRVEoMCwgbWVtY21wKGV4cGVjdGVkLCBvdXRfZGF0YSwgc3RhdGljX2Nhc3Q8c2l6ZV90PihieXRlcykpKTsKK30KKworVEVTVF9GKFZpcnR1YWxGaWxlU3lzdGVtVGVzdCwgT3BlbikgeworICAvLyBDcmVhdGUgYSBmZXcgZmlsZXMgYW5kIHdyaXRlIHNvbWUgZGF0YQorICBWaXJ0dWFsRmlsZSogZmlsZSA9IHZmc18uT3BlbigiZmlsZTEudG1wIik7CisgIEFTU0VSVF9UUlVFKGZpbGUpOworICBFWFBFQ1RfRVEoMCwgZmlsZS0+U2l6ZSgpKTsKKworICAvLyBXcml0ZSBhIGZldyBieXRlcyBvZiByYW5kb20gZGF0YS4KKyAgZmlsZS0+V3JpdGUoInRlc3QiLCA0LCAwKTsKKyAgRVhQRUNUX0VRKDQsIGZpbGUtPlNpemUoKSk7CisKKyAgLy8gT3BlbiBhIG5ldyBmaWxlCisgIGZpbGUgPSB2ZnNfLk9wZW4oImZpbGUyLnRtcCIpOworICBBU1NFUlRfVFJVRShmaWxlKTsKKyAgRVhQRUNUX0VRKDAsIGZpbGUtPlNpemUoKSk7CisKKyAgLy8gVHJ5IHRvIHJlb3BlbiB0aGUgZXhpc3RpbmcgZmlsZS4KKyAgZmlsZSA9IHZmc18uT3BlbigiZmlsZTEudG1wIik7CisgIEFTU0VSVF9UUlVFKGZpbGUpOworICBFWFBFQ1RfRVEoNCwgZmlsZS0+U2l6ZSgpKTsKK30KKworVEVTVF9GKFZpcnR1YWxGaWxlU3lzdGVtVGVzdCwgVHJ1bmNhdGUpIHsKKyAgVmlydHVhbEZpbGUqIGZpbGUgPSB2ZnNfLk9wZW4oImZpbGUxLnRtcCIpOworICBBU1NFUlRfVFJVRShmaWxlKTsKKyAgRVhQRUNUX0VRKDAsIGZpbGUtPlNpemUoKSk7CisKKyAgY29uc3QgY2hhciogZGF0YSA9ICJ0ZXN0IjsKKyAgY2hhciBmaWxlX2NvbnRlbnRzWzRdOworICAvLyBXcml0ZSBhIGZldyBieXRlcyBvZiByYW5kb20gZGF0YS4KKyAgZmlsZS0+V3JpdGUoZGF0YSwgNCwgMCk7CisgIEVYUEVDVF9FUSg0LCBmaWxlLT5TaXplKCkpOworICBpbnQgYnl0ZXMgPSBmaWxlLT5SZWFkKGZpbGVfY29udGVudHMsIHNpemVvZihmaWxlX2NvbnRlbnRzKSwgMCk7CisgIEVYUEVDVF9FUSg0LCBieXRlcyk7CisgIEVYUEVDVF9FUSgwLCBtZW1jbXAoZmlsZV9jb250ZW50cywgZGF0YSwgc3RhdGljX2Nhc3Q8c2l6ZV90PihieXRlcykpKTsKKworICBmaWxlLT5UcnVuY2F0ZSgzKTsKKyAgRVhQRUNUX0VRKDMsIGZpbGUtPlNpemUoKSk7CisgIGJ5dGVzID0gZmlsZS0+UmVhZChmaWxlX2NvbnRlbnRzLCBzaXplb2YoZmlsZV9jb250ZW50cyksIDApOworICBFWFBFQ1RfRVEoMywgYnl0ZXMpOworICBFWFBFQ1RfRVEoMCwgbWVtY21wKGZpbGVfY29udGVudHMsIGRhdGEsIHN0YXRpY19jYXN0PHNpemVfdD4oYnl0ZXMpKSk7CisKKyAgZmlsZS0+VHJ1bmNhdGUoMCk7CisgIEVYUEVDVF9FUSgwLCBmaWxlLT5TaXplKCkpOworICBieXRlcyA9IGZpbGUtPlJlYWQoZmlsZV9jb250ZW50cywgc2l6ZW9mKGZpbGVfY29udGVudHMpLCAwKTsKKyAgRVhQRUNUX0VRKDAsIGJ5dGVzKTsKK30KKworVEVTVF9GKFZpcnR1YWxGaWxlU3lzdGVtVGVzdCwgU2VyaWFsaXplRGVzZXJpYWxpemUpIHsKKyAgLy8gQ3JlYXRlIGEgZmV3IGZpbGVzIGFuZCB3cml0ZSBzb21lIGRhdGEKKyAgVmlydHVhbEZpbGUqIGZpbGUgPSB2ZnNfLk9wZW4oImZpbGUxLnRtcCIpOworICBFWFBFQ1RfVFJVRShmaWxlICE9IE5VTEwpOworICBjb25zdCBjaGFyIGRhdGExW10gPSAiYWJjIjsKKyAgaW50IGRhdGExX3NpemUgPSAzOworICBmaWxlLT5Xcml0ZShkYXRhMSwgZGF0YTFfc2l6ZSwgMCk7CisKKyAgZmlsZSA9IHZmc18uT3BlbigiZmlsZTIudG1wIik7CisgIEVYUEVDVF9UUlVFKGZpbGUgIT0gTlVMTCk7CisgIGNvbnN0IGNoYXIgZGF0YTJbXSA9ICJkZWZnIjsKKyAgaW50IGRhdGEyX3NpemUgPSA0OworICBmaWxlLT5Xcml0ZShkYXRhMiwgZGF0YTJfc2l6ZSwgMCk7CisKKyAgZmlsZSA9IHZmc18uT3BlbigiZmlsZTMudG1wIik7CisgIEVYUEVDVF9UUlVFKGZpbGUgIT0gTlVMTCk7CisgIGNvbnN0IGNoYXIgZGF0YTNbXSA9ICIiOworICBpbnQgZGF0YTNfc2l6ZSA9IDA7CisgIGZpbGUtPldyaXRlKGRhdGEzLCBkYXRhM19zaXplLCAwKTsKKworICAvLyBGaXJzdCBwZXJmb3JtIGEgZHJ5IHJ1biB0byBmaWd1cmUgb3V0IGhvdyBtdWNoIHNwYWNlIHdlIG5lZWQuCisgIGludCBieXRlcyA9IHZmc18uU2VyaWFsaXplKE5VTEwsIHRydWUgLypkcnkgcnVuKi8pOworICBzY29wZWRfYXJyYXk8dWludDg+IGJ1ZmZlcihuZXcgdWludDhbc3RhdGljX2Nhc3Q8c2l6ZV90PihieXRlcyldKTsKKworICAvLyBOb3cgc2VyaWFsaXplIGFuZCBkZXNlcmlhbGl6ZQorICB2ZnNfLlNlcmlhbGl6ZShidWZmZXIuZ2V0KCksIGZhbHNlIC8qZHJ5IHJ1biovKTsKKworICAvLyBEZXNlcmlhbGl6ZSB0aGUgZGF0YSBpbnRvIGEgbmV3IHZmcworICBWaXJ0dWFsRmlsZVN5c3RlbSBuZXdfdmZzOworICBBU1NFUlRfVFJVRShuZXdfdmZzLkRlc2VyaWFsaXplKGJ1ZmZlci5nZXQoKSwgYnl0ZXMpKTsKKworICAvLyBNYWtlIHN1cmUgdGhlIG5ldyB2ZnMgY29udGFpbnMgYWxsIHRoZSBleHBlY3RlZCBkYXRhLgorICBjaGFyIGZpbGVfY29udGVudHNbVmlydHVhbEZpbGU6OmtNYXhWZnNQYXRobmFtZV07CisgIGZpbGUgPSBuZXdfdmZzLk9wZW4oImZpbGUxLnRtcCIpOworICBFWFBFQ1RfVFJVRShmaWxlICE9IE5VTEwpOworICBieXRlcyA9IGZpbGUtPlJlYWQoZmlsZV9jb250ZW50cywgc2l6ZW9mKGZpbGVfY29udGVudHMpLCAwKTsKKyAgRVhQRUNUX0VRKGRhdGExX3NpemUsIGJ5dGVzKTsKKyAgRVhQRUNUX0VRKDAsIG1lbWNtcChmaWxlX2NvbnRlbnRzLCBkYXRhMSwgc3RhdGljX2Nhc3Q8c2l6ZV90PihieXRlcykpKTsKKworICBmaWxlID0gbmV3X3Zmcy5PcGVuKCJmaWxlMi50bXAiKTsKKyAgRVhQRUNUX1RSVUUoZmlsZSAhPSBOVUxMKTsKKyAgYnl0ZXMgPSBmaWxlLT5SZWFkKGZpbGVfY29udGVudHMsIHNpemVvZihmaWxlX2NvbnRlbnRzKSwgMCk7CisgIEVYUEVDVF9FUShkYXRhMl9zaXplLCBieXRlcyk7CisgIEVYUEVDVF9FUSgwLCBtZW1jbXAoZmlsZV9jb250ZW50cywgZGF0YTIsIHN0YXRpY19jYXN0PHNpemVfdD4oYnl0ZXMpKSk7CisKKyAgZmlsZSA9IG5ld192ZnMuT3BlbigiZmlsZTMudG1wIik7CisgIEVYUEVDVF9UUlVFKGZpbGUgIT0gTlVMTCk7CisgIGJ5dGVzID0gZmlsZS0+UmVhZChmaWxlX2NvbnRlbnRzLCBzaXplb2YoZmlsZV9jb250ZW50cyksIDApOworICBFWFBFQ1RfRVEoZGF0YTNfc2l6ZSwgYnl0ZXMpOworICBFWFBFQ1RfRVEoMCwgbWVtY21wKGZpbGVfY29udGVudHMsIGRhdGEzLCBzdGF0aWNfY2FzdDxzaXplX3Q+KGJ5dGVzKSkpOworfQorCitURVNUX0YoVmlydHVhbEZpbGVTeXN0ZW1UZXN0LCBEZXNlcmlhbGl6ZVRydW5jYXRlZCkgeworICAvLyBDcmVhdGUgYSBmZXcgZmlsZXMgYW5kIHdyaXRlIHNvbWUgZGF0YQorICBWaXJ0dWFsRmlsZSogZmlsZSA9IHZmc18uT3BlbigiZmlsZTEudG1wIik7CisgIEVYUEVDVF9UUlVFKGZpbGUgIT0gTlVMTCk7CisgIGNvbnN0IGNoYXIgZGF0YTFbXSA9ICJhYmMiOworICBpbnQgZGF0YTFfc2l6ZSA9IDM7CisgIGZpbGUtPldyaXRlKGRhdGExLCBkYXRhMV9zaXplLCAwKTsKKworICBmaWxlID0gdmZzXy5PcGVuKCJmaWxlMi50bXAiKTsKKyAgRVhQRUNUX1RSVUUoZmlsZSAhPSBOVUxMKTsKKyAgY29uc3QgY2hhciBkYXRhMltdID0gImRlZmciOworICBpbnQgZGF0YTJfc2l6ZSA9IDQ7CisgIGZpbGUtPldyaXRlKGRhdGEyLCBkYXRhMl9zaXplLCAwKTsKKworICAvLyBGaXJzdCBwZXJmb3JtIGEgZHJ5IHJ1biB0byBmaWd1cmUgb3V0IGhvdyBtdWNoIHNwYWNlIHdlIG5lZWQuCisgIGludCBieXRlcyA9IHZmc18uU2VyaWFsaXplKE5VTEwsIHRydWUgLypkcnkgcnVuKi8pOworICBzY29wZWRfYXJyYXk8dWludDg+IGJ1ZmZlcihuZXcgdWludDhbc3RhdGljX2Nhc3Q8c2l6ZV90PihieXRlcyldKTsKKworICAvLyBOb3cgc2VyaWFsaXplIGFuZCBkZXNlcmlhbGl6ZQorICB2ZnNfLlNlcmlhbGl6ZShidWZmZXIuZ2V0KCksIGZhbHNlIC8qZHJ5IHJ1biovKTsKKworICBmb3IgKGludCBpID0gMTsgaSA8IGJ5dGVzOyBpKyspIHsKKyAgICAvLyBDb3JydXB0IHRoZSBoZWFkZXIKKyAgICBWaXJ0dWFsRmlsZVN5c3RlbTo6U2VyaWFsaXplZEhlYWRlciBoZWFkZXI7CisgICAgbWVtY3B5KCZoZWFkZXIsIGJ1ZmZlci5nZXQoKSwgc2l6ZW9mKGhlYWRlcikpOworICAgIGhlYWRlci5maWxlX3NpemUgPSBoZWFkZXIuZmlsZV9zaXplIC0gaTsKKyAgICBtZW1jcHkoYnVmZmVyLmdldCgpLCAmaGVhZGVyLCBzaXplb2YoaGVhZGVyKSk7CisKKyAgICAvLyBEZXNlcmlhbGl6ZSB0aGUgZGF0YSBpbnRvIGEgbmV3IHZmcworICAgIFZpcnR1YWxGaWxlU3lzdGVtIG5ld192ZnM7CisgICAgRVhQRUNUX0ZBTFNFKG5ld192ZnMuRGVzZXJpYWxpemUoYnVmZmVyLmdldCgpLCBieXRlcyAtIGkpKTsKKyAgfQorfQorCitURVNUX0YoVmlydHVhbEZpbGVTeXN0ZW1UZXN0LCBEZXNlcmlhbGl6ZUJhZERhdGEpIHsKKyAgc2NvcGVkX2FycmF5PHVpbnQ4PiBidWZmZXIobmV3IHVpbnQ4WzBdKTsKKyAgRVhQRUNUX0ZBTFNFKHZmc18uRGVzZXJpYWxpemUoYnVmZmVyLmdldCgpLCAwKSk7CisgIEVYUEVDVF9GQUxTRSh2ZnNfLkRlc2VyaWFsaXplKGJ1ZmZlci5nZXQoKSwgLTEpKTsKKyAgYnVmZmVyLnJlc2V0KG5ldyB1aW50OFsxXSk7CisgIEVYUEVDVF9GQUxTRSh2ZnNfLkRlc2VyaWFsaXplKGJ1ZmZlci5nZXQoKSwgMSkpOworICBidWZmZXIucmVzZXQobmV3IHVpbnQ4W3NpemVvZihWaXJ0dWFsRmlsZVN5c3RlbTo6U2VyaWFsaXplZEhlYWRlcildKTsKKyAgVmlydHVhbEZpbGVTeXN0ZW06OlNlcmlhbGl6ZWRIZWFkZXIgaGVhZGVyID0ge307CisgIGhlYWRlci52ZXJzaW9uID0gLTE7CisgIG1lbWNweShidWZmZXIuZ2V0KCksICZoZWFkZXIsIHNpemVvZihoZWFkZXIpKTsKKyAgRVhQRUNUX0ZBTFNFKHZmc18uRGVzZXJpYWxpemUoYnVmZmVyLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoVmlydHVhbEZpbGVTeXN0ZW06OlNlcmlhbGl6ZWRIZWFkZXIpKSk7CisgIG1lbWNweSgmKGhlYWRlci52ZXJzaW9uKSwgIlNBVjAiLCBzaXplb2YoaGVhZGVyLnZlcnNpb24pKTsKKyAgaGVhZGVyLmZpbGVfc2l6ZSA9IHNpemVvZihWaXJ0dWFsRmlsZVN5c3RlbTo6U2VyaWFsaXplZEhlYWRlcik7CisgIG1lbWNweShidWZmZXIuZ2V0KCksICZoZWFkZXIsIHNpemVvZihoZWFkZXIpKTsKKyAgRVhQRUNUX1RSVUUodmZzXy5EZXNlcmlhbGl6ZShidWZmZXIuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFZpcnR1YWxGaWxlU3lzdGVtOjpTZXJpYWxpemVkSGVhZGVyKSkpOworICBBU1NFUlRfRVEoMCwgdmZzXy5MaXN0RmlsZXMoKS5zaXplKCkpOworfQorCitURVNUX0YoVmlydHVhbEZpbGVTeXN0ZW1UZXN0LCBHZXRIZWFkZXJWZXJzaW9uKSB7CisgIFZpcnR1YWxGaWxlU3lzdGVtOjpTZXJpYWxpemVkSGVhZGVyIGhlYWRlcjsKKyAgbWVtc2V0KCZoZWFkZXIsIDAsIHNpemVvZihoZWFkZXIpKTsKKyAgaGVhZGVyLmZpbGVfc2l6ZSA9IHNpemVvZihoZWFkZXIpOworCisgIENPTVBJTEVfQVNTRVJUKHNpemVvZihoZWFkZXIudmVyc2lvbikgPT0gc2l6ZW9mKCJTQVYwIikgLSAxLAorICAgICAgICAgICAgICAgICBJbnZhbGlkX2hlYWRlcl92ZXJzaW9uX3NpemUpOworICBtZW1jcHkoJmhlYWRlci52ZXJzaW9uLCAiWFlaVyIsIHNpemVvZihoZWFkZXIudmVyc2lvbikpOworICBFWFBFQ1RfRVEoLTEsIFZpcnR1YWxGaWxlU3lzdGVtOjpHZXRIZWFkZXJWZXJzaW9uKGhlYWRlcikpOworICBtZW1jcHkoJmhlYWRlci52ZXJzaW9uLCAiU0FWMCIsIHNpemVvZihoZWFkZXIudmVyc2lvbikpOworICBFWFBFQ1RfRVEoMCwgVmlydHVhbEZpbGVTeXN0ZW06OkdldEhlYWRlclZlcnNpb24oaGVhZGVyKSk7CisgIG1lbWNweSgmaGVhZGVyLnZlcnNpb24sICJTQVYxIiwgc2l6ZW9mKGhlYWRlci52ZXJzaW9uKSk7CisgIEVYUEVDVF9FUSgxLCBWaXJ0dWFsRmlsZVN5c3RlbTo6R2V0SGVhZGVyVmVyc2lvbihoZWFkZXIpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHN0b3JlX3VwZ3JhZGUKK30gIC8vIG5hbWVzcGFjZSBzdG9yYWdlCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3N0b3JhZ2UvdXBncmFkZS9zY2hlbWFfdjEucHJvdG8gYi9zcmMvY29iYWx0L3N0b3JhZ2UvdXBncmFkZS9zY2hlbWFfdjEucHJvdG8KaW5kZXggYzI1MTZhNS4uNDNkOGExNSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zdG9yYWdlL3VwZ3JhZGUvc2NoZW1hX3YxLnByb3RvCisrKyBiL3NyYy9jb2JhbHQvc3RvcmFnZS91cGdyYWRlL3NjaGVtYV92MS5wcm90bwpAQCAtMzYsNyArMzYsNyBAQAogICByZXBlYXRlZCBMb2NhbFN0b3JhZ2VFbnRyeSBsb2NhbF9zdG9yYWdlX2VudHJpZXMgPSAyOwogCiAgIC8vIEEgc2luZ2xlIGNvb2tpZS4KLSAgbWVzYWdlIENvb2tpZSB7CisgIG1lc3NhZ2UgQ29va2llIHsKICAgICAvLyBVUkwgaW4gY2Fub25pY2FsIGZvcm0sIGUuZy4gImh0dHBzOi8vd3d3LmV4YW1wbGUuY29tLyIuIE11c3QgYmUgcHJvdmlkZWQKICAgICAvLyBvciB0aGUgY29va2llIHdpbGwgYmUgaWdub3JlZC4KICAgICBzdHJpbmcgdXJsID0gMTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3RvcmFnZS92aXJ0dWFsX2ZpbGUuY2MgYi9zcmMvY29iYWx0L3N0b3JhZ2UvdmlydHVhbF9maWxlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzhlMzFmLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvc3RvcmFnZS92aXJ0dWFsX2ZpbGUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgImNvYmFsdC9zdG9yYWdlL3ZpcnR1YWxfZmlsZS5oIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIHN0b3JhZ2UgewotbmFtZXNwYWNlIHsKLQotLy8gV2UgbXVzdCB1c2UgZm9yd2FyZCBkZWNsYXJhdGlvbnMgdG8gYmUgYWJsZSB0byBzcGVjaWZ5IHRoZQotLy8gV0FSTl9VTlVTRURfUkVTVUxUIGF0dHJpYnV0ZS4KLQotLy8gUmVhZCBzaXplIGJ5dGVzIGZyb20gYnVmZmVyIGludG8gZGVzdC4gVXBkYXRlcyBidWZmZXIgYW5kIGJ1ZmZlcl9yZW1haW5pbmcKLS8vIG9uIHN1Y2Nlc3MuCi0vLyBSZXR1cm5zIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gYnVmZmVyIG92ZXJydW4KLWJvb2wgUmVhZEJ1ZmZlcih1aW50OCogZGVzdCwgY29uc3QgdWludDgqKiBidWZmZXIsIHNpemVfdCBzaXplLAotICAgICAgICAgICAgICAgIHNpemVfdCogYnVmZmVyX3JlbWFpbmluZykgV0FSTl9VTlVTRURfUkVTVUxUOwotCi0vLyBXcml0ZSBzaXplIGJ5dGVzIGZyb20gc291cmNlIGludG8gYnVmZmVyLiBSZXR1cm4gIyBvZiBieXRlcyB3cml0dGVuLgotc2l6ZV90IFdyaXRlQnVmZmVyKHVpbnQ4KiBidWZmZXIsIGNvbnN0IHVpbnQ4KiBzb3VyY2UsIHNpemVfdCBzaXplLAotICAgICAgICAgICAgICAgICAgIGJvb2wgZHJ5X3J1bikgV0FSTl9VTlVTRURfUkVTVUxUOwotCi1ib29sIFJlYWRCdWZmZXIodWludDgqIGRlc3QsIGNvbnN0IHVpbnQ4KiogYnVmZmVyLCBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgICAgICBzaXplX3QqIGJ1ZmZlcl9yZW1haW5pbmcpIHsKLSAgaWYgKHNpemUgPiAqYnVmZmVyX3JlbWFpbmluZykgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBtZW1jcHkoZGVzdCwgKmJ1ZmZlciwgc2l6ZSk7Ci0gICpidWZmZXJfcmVtYWluaW5nIC09IHNpemU7Ci0gICpidWZmZXIgKz0gc2l6ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXNpemVfdCBXcml0ZUJ1ZmZlcih1aW50OCogYnVmZmVyLCBjb25zdCB1aW50OCogc291cmNlLCBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICBib29sIGRyeV9ydW4pIHsKLSAgaWYgKCFkcnlfcnVuKSB7Ci0gICAgbWVtY3B5KGJ1ZmZlciwgc291cmNlLCBzaXplKTsKLSAgfQotICByZXR1cm4gc2l6ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLVZpcnR1YWxGaWxlOjpWaXJ0dWFsRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgOiBuYW1lXyhuYW1lKSB7fQotVmlydHVhbEZpbGU6On5WaXJ0dWFsRmlsZSgpIHt9Ci0KLWludCBWaXJ0dWFsRmlsZTo6UmVhZCh2b2lkKiBkZXN0LCBpbnQgYnl0ZXNfaW4sIGludCBvZmZzZXRfaW4pIGNvbnN0IHsKLSAgRENIRUNLX0dFKG9mZnNldF9pbiwgMCk7Ci0gIERDSEVDS19HRShieXRlc19pbiwgMCk7Ci0gIHNpemVfdCBvZmZzZXQgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KG9mZnNldF9pbik7Ci0gIHNpemVfdCBieXRlcyA9IHN0YXRpY19jYXN0PHNpemVfdD4oYnl0ZXNfaW4pOwotICBzaXplX3Qgc2l6ZSA9IGJ1ZmZlcl8uc2l6ZSgpOwotICBpZiAob2Zmc2V0ID4gc2l6ZSkgewotICAgIHJldHVybiAwOwotICB9Ci0gIHNpemVfdCBieXRlc190b19yZWFkID0gc3RkOjptaW4oc3RhdGljX2Nhc3Q8c2l6ZV90PihzaXplIC0gb2Zmc2V0KSwgYnl0ZXMpOwotICBpZiAoYnl0ZXNfdG9fcmVhZCA9PSAwKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgbWVtY3B5KGRlc3QsICZidWZmZXJfW29mZnNldF0sIGJ5dGVzX3RvX3JlYWQpOwotICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihieXRlc190b19yZWFkKTsKLX0KLQotaW50IFZpcnR1YWxGaWxlOjpXcml0ZShjb25zdCB2b2lkKiBzb3VyY2UsIGludCBieXRlc19pbiwgaW50IG9mZnNldF9pbikgewotICBEQ0hFQ0tfR0Uob2Zmc2V0X2luLCAwKTsKLSAgRENIRUNLX0dFKGJ5dGVzX2luLCAwKTsKLSAgc2l6ZV90IGJ5dGVzID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihieXRlc19pbik7Ci0gIHNpemVfdCBvZmZzZXQgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KG9mZnNldF9pbik7Ci0gIGlmIChidWZmZXJfLnNpemUoKSA8IG9mZnNldCArIGJ5dGVzKSB7Ci0gICAgYnVmZmVyXy5yZXNpemUob2Zmc2V0ICsgYnl0ZXMpOwotICB9Ci0KLSAgaWYgKCFidWZmZXJfLmVtcHR5KCkpIHsKLSAgICAvLyBzdGQ6OnZlY3RvciBkb2VzIG5vdCBkZWZpbmUgYWNjZXNzIHRvIHVuZGVybHlpbmcgYXJyYXkgd2hlbiBlbXB0eQotICAgIG1lbWNweSgmYnVmZmVyX1tvZmZzZXRdLCBzb3VyY2UsIGJ5dGVzKTsKLSAgfQotICByZXR1cm4gYnl0ZXNfaW47Ci19Ci0KLWludCBWaXJ0dWFsRmlsZTo6VHJ1bmNhdGUoaW50IHNpemUpIHsKLSAgc2l6ZV90IG5ld3NpemUgPSBzdGQ6Om1pbihidWZmZXJfLnNpemUoKSwgc3RhdGljX2Nhc3Q8c2l6ZV90PihzaXplKSk7Ci0gIGJ1ZmZlcl8ucmVzaXplKG5ld3NpemUpOwotICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihuZXdzaXplKTsKLX0KLQotaW50IFZpcnR1YWxGaWxlOjpTZXJpYWxpemUodWludDgqIGRlc3QsIGJvb2wgZHJ5X3J1bikgewotICB1aW50OCogY3VyX2J1ZmZlciA9IGRlc3Q7Ci0KLSAgLy8gV3JpdGUgZmlsZW5hbWUgbGVuZ3RoCi0gIHVpbnQ2NCBuYW1lX2xlbmd0aCA9IG5hbWVfLmxlbmd0aCgpOwotICBEQ0hFQ0tfTFQobmFtZV9sZW5ndGgsIGtNYXhWZnNQYXRobmFtZSk7Ci0gIGN1cl9idWZmZXIgKz0KLSAgICAgIFdyaXRlQnVmZmVyKGN1cl9idWZmZXIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPigmbmFtZV9sZW5ndGgpLAotICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5hbWVfbGVuZ3RoKSwgZHJ5X3J1bik7Ci0KLSAgLy8gV3JpdGUgdGhlIGZpbGVuYW1lCi0gIGN1cl9idWZmZXIgKz0KLSAgICAgIFdyaXRlQnVmZmVyKGN1cl9idWZmZXIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPihuYW1lXy5jX3N0cigpKSwKLSAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHNpemVfdD4obmFtZV9sZW5ndGgpLCBkcnlfcnVuKTsKLQotICAvLyBOT1RFOiBFbnN1cmUgdGhlIGZpbGUgc2l6ZSBpcyA2NC1iaXQgZm9yIGNvbXBhdGliaWxpdHkKLSAgLy8gd2l0aCBhbnkgZXhpc3Rpbmcgc2VyaWFsaXplZCBmaWxlcy4KLSAgdWludDY0IGZpbGVfc2l6ZSA9IHN0YXRpY19jYXN0PHVpbnQ2ND4oYnVmZmVyXy5zaXplKCkpOwotICAvLyBXcml0ZSB0aGUgZmlsZSBjb250ZW50cyBzaXplCi0gIGN1cl9idWZmZXIgKz0KLSAgICAgIFdyaXRlQnVmZmVyKGN1cl9idWZmZXIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPigmZmlsZV9zaXplKSwKLSAgICAgICAgICAgICAgICAgIHNpemVvZihmaWxlX3NpemUpLCBkcnlfcnVuKTsKLQotICAvLyBXcml0ZSB0aGUgZmlsZSBjb250ZW50cwotICBpZiAoIWJ1ZmZlcl8uZW1wdHkoKSkgewotICAgIC8vIHN0ZDo6dmVjdG9yIGRvZXMgbm90IGRlZmluZSBhY2Nlc3MgdG8gdW5kZXJseWluZyBhcnJheSB3aGVuIGVtcHR5Ci0gICAgY3VyX2J1ZmZlciArPSBXcml0ZUJ1ZmZlcihjdXJfYnVmZmVyLCAmYnVmZmVyX1swXSwgYnVmZmVyXy5zaXplKCksIGRyeV9ydW4pOwotICB9Ci0KLSAgLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbgotICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihzdGQ6OmRpc3RhbmNlKGRlc3QsIGN1cl9idWZmZXIpKTsKLX0KLQotaW50IFZpcnR1YWxGaWxlOjpEZXNlcmlhbGl6ZShjb25zdCB1aW50OCogc291cmNlLCBzaXplX3QgYnVmZmVyX3JlbWFpbmluZykgewotICAvLyBSZWFkIGluIGZpbGVuYW1lIGxlbmd0aAotICBjb25zdCB1aW50OCogY3VyX2J1ZmZlciA9IHNvdXJjZTsKLSAgdWludDY0IG5hbWVfbGVuZ3RoOwotICBib29sIHN1Y2Nlc3MgPSBSZWFkQnVmZmVyKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDgqPigmbmFtZV9sZW5ndGgpLCAmY3VyX2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobmFtZV9sZW5ndGgpLCAmYnVmZmVyX3JlbWFpbmluZyk7Ci0gIGlmICghc3VjY2VzcykgewotICAgIERMT0coRVJST1IpIDw8ICJCdWZmZXIgb3ZlcnJ1biI7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgaWYgKG5hbWVfbGVuZ3RoID49IGtNYXhWZnNQYXRobmFtZSkgewotICAgIERMT0coRVJST1IpIDw8ICJGaWxlbmFtZSB3YXMgbG9uZ2VyIHRoYW4gdGhlIG1heGltdW0gYWxsb3dlZC4iOwotICAgIHJldHVybiAtMTsKLSAgfQotICAvLyBSZWFkIGluIGZpbGVuYW1lCi0gIGNoYXIgbmFtZVtrTWF4VmZzUGF0aG5hbWVdOwotICBzdWNjZXNzID0gUmVhZEJ1ZmZlcihyZWludGVycHJldF9jYXN0PHVpbnQ4Kj4obmFtZSksICZjdXJfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzaXplX3Q+KG5hbWVfbGVuZ3RoKSwgJmJ1ZmZlcl9yZW1haW5pbmcpOwotICBpZiAoIXN1Y2Nlc3MpIHsKLSAgICBETE9HKEVSUk9SKSA8PCAiQnVmZmVyIG92ZXJydW4iOwotICAgIHJldHVybiAtMTsKLSAgfQotICBuYW1lXy5hc3NpZ24obmFtZSwgc3RhdGljX2Nhc3Q8c2l6ZV90PihuYW1lX2xlbmd0aCkpOwotCi0gIC8vIFJlYWQgaW4gZmlsZSBjb250ZW50cyBzaXplLgotICB1aW50NjQgZmlsZV9zaXplOwotICBzdWNjZXNzID0gUmVhZEJ1ZmZlcihyZWludGVycHJldF9jYXN0PHVpbnQ4Kj4oJmZpbGVfc2l6ZSksICZjdXJfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZmlsZV9zaXplKSwgJmJ1ZmZlcl9yZW1haW5pbmcpOwotICBpZiAoIXN1Y2Nlc3MpIHsKLSAgICBETE9HKEVSUk9SKSA8PCAiQnVmZmVyIG92ZXJydW4iOwotICAgIHJldHVybiAtMTsKLSAgfQotICAvLyBSZWFkIGluIHRoZSBmaWxlIGNvbnRlbnRzCi0gIGJ1ZmZlcl8ucmVzaXplKHN0YXRpY19jYXN0PHNpemVfdD4oZmlsZV9zaXplKSk7Ci0KLSAgaWYgKCFidWZmZXJfLmVtcHR5KCkpIHsKLSAgICAvLyBzdGQ6OnZlY3RvciBkb2VzIG5vdCBkZWZpbmUgYWNjZXNzIHRvIHVuZGVybHlpbmcgYXJyYXkgd2hlbiBlbXB0eQotICAgIHN1Y2Nlc3MgPQotICAgICAgICBSZWFkQnVmZmVyKCZidWZmZXJfWzBdLCAmY3VyX2J1ZmZlciwgYnVmZmVyXy5zaXplKCksICZidWZmZXJfcmVtYWluaW5nKTsKLSAgICBpZiAoIXN1Y2Nlc3MpIHsKLSAgICAgIERMT0coRVJST1IpIDw8ICJCdWZmZXIgb3ZlcnJ1biI7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICB9Ci0KLSAgLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZAotICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihzdGQ6OmRpc3RhbmNlKHNvdXJjZSwgY3VyX2J1ZmZlcikpOwotfQotCi19ICAvLyBuYW1lc3BhY2Ugc3RvcmFnZQotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zdG9yYWdlL3ZpcnR1YWxfZmlsZS5oIGIvc3JjL2NvYmFsdC9zdG9yYWdlL3ZpcnR1YWxfZmlsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTg4Njc1Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvc3RvcmFnZS92aXJ0dWFsX2ZpbGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpZm5kZWYgQ09CQUxUX1NUT1JBR0VfVklSVFVBTF9GSUxFX0hfCi0jZGVmaW5lIENPQkFMVF9TVE9SQUdFX1ZJUlRVQUxfRklMRV9IXwotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImJhc2UvYmFzaWN0eXBlcy5oIgotI2luY2x1ZGUgImJhc2UvY29tcGlsZXJfc3BlY2lmaWMuaCIKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2Ugc3RvcmFnZSB7Ci1jbGFzcyBWaXJ0dWFsRmlsZVN5c3RlbTsKLQotLy8gVmlydHVhbEZpbGUgaW1wbGVtZW50cyBhbiBpbi1tZW1vcnkgZmlsZSBzeXN0ZW0uIFRoZXNlCi0vLyBhcmUgbWFuYWdlZCBieSBWaXJ0dWFsRmlsZVN5c3RlbSBmb3IgdXNlIGJ5IFNRTGl0ZTMuCi0vLyBUaGUgZm9ybWF0IG9mIGEgc2VyaWFsaXplZCBWaXJ0dWFsRmlsZSBpcyBhcyBmb2xsb3dzOgotLy8gOC1ieXRlIG5hbWUgbGVuZ3RoCi0vLyA8bmFtZSBsZW5ndGg+IEZpbGUgbmFtZSBzdHJpbmcKLS8vIDgtYnl0ZSBmaWxlIHNpemUKLS8vIDxmaWxlIHNpemU+IHJhdyBieXRlcy4KLWNsYXNzIFZpcnR1YWxGaWxlIHsKLSBwdWJsaWM6Ci0gIGVudW0geyBrTWF4VmZzUGF0aG5hbWUgPSA1MTIgfTsKLQotICBpbnQgUmVhZCh2b2lkKiBkZXN0LCBpbnQgYnl0ZXMsIGludCBvZmZzZXQpIGNvbnN0OwotICBpbnQgV3JpdGUoY29uc3Qgdm9pZCogc291cmNlLCBpbnQgYnl0ZXMsIGludCBvZmZzZXQpOwotICBpbnQgVHJ1bmNhdGUoaW50IHNpemUpOwotICBpbnQgU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oYnVmZmVyXy5zaXplKCkpOyB9Ci0KLSBwcml2YXRlOgotICBleHBsaWNpdCBWaXJ0dWFsRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSk7Ci0gIH5WaXJ0dWFsRmlsZSgpOwotCi0gIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuCi0gIGludCBTZXJpYWxpemUodWludDgqIGRlc3QsIGNvbnN0IGJvb2wgZHJ5X3J1bik7Ci0gIC8vIERlc2VyaWFsaXplcyBhIGZpbGUsIHJldHVybmluZyB0aGUgc2l6ZSBvZiB0aGUgZmlsZSBvcgotICAvLyA8IDAgb24gZXJyb3IuCi0gIC8vIHxidWZmZXJfcmVtYWluaW5nfCBpcyB0aGUgbWF4aW11bSBzaXplIG9mIHxzb3VyY2V8Ci0gIGludCBEZXNlcmlhbGl6ZShjb25zdCB1aW50OCogc291cmNlLCBzaXplX3QgYnVmZmVyX3JlbWFpbmluZyk7Ci0KLSAgc3RkOjp2ZWN0b3I8dWludDg+IGJ1ZmZlcl87Ci0KLSAgc3RkOjpzdHJpbmcgbmFtZV87Ci0KLSAgZnJpZW5kIGNsYXNzIFZpcnR1YWxGaWxlU3lzdGVtOwotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oVmlydHVhbEZpbGUpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHN0b3JhZ2UKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKLQotI2VuZGlmICAvLyBDT0JBTFRfU1RPUkFHRV9WSVJUVUFMX0ZJTEVfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3RvcmFnZS92aXJ0dWFsX2ZpbGVfc3lzdGVtLmNjIGIvc3JjL2NvYmFsdC9zdG9yYWdlL3ZpcnR1YWxfZmlsZV9zeXN0ZW0uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyYzYwMmUuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9zdG9yYWdlL3ZpcnR1YWxfZmlsZV9zeXN0ZW0uY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgImNvYmFsdC9zdG9yYWdlL3ZpcnR1YWxfZmlsZV9zeXN0ZW0uaCIKLQotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgImJhc2Uvc3luY2hyb25pemF0aW9uL2xvY2suaCIKLSNpbmNsdWRlICJjb2JhbHQvc3RvcmFnZS92aXJ0dWFsX2ZpbGUuaCIKLQotI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0cmluZ19wb2VtLmgiCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIHN0b3JhZ2UgewotCi1uYW1lc3BhY2UgewotLy8gVXBkYXRlIHRoaXMgYW55IHRpbWUgdGhlIHNlcmlhbGl6YXRpb24gZm9ybWF0IGNoYW5nZXMuCi1jb25zdCBjaGFyIGtWZXJzaW9uW10gPSAiU0FWMCI7Ci19ICAvLyBuYW1lc3BhY2UKLQotLy8gc3RhdGljCi1pbnQgVmlydHVhbEZpbGVTeXN0ZW06OkdldEhlYWRlclZlcnNpb24oY29uc3QgU2VyaWFsaXplZEhlYWRlciYgaGVhZGVyKSB7Ci0gIC8vIENvcHkgdGhlIHZlcnNpb24gaW50IHRvIGEgY2hhciBidWZmZXIgdG8gYXZvaWQgZW5kaWFuIGlzc3Vlcy4KLSAgY2hhciB2ZXJzaW9uWzRdOwotICBtZW1jcHkodmVyc2lvbiwgJmhlYWRlci52ZXJzaW9uLCBzaXplb2YodmVyc2lvbikpOwotCi0gIGlmIChtZW1jbXAodmVyc2lvbiwga1ZlcnNpb24sIDMpICE9IDApIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0gZWxzZSBpZiAoaGVhZGVyLmZpbGVfc2l6ZSA8IHN0YXRpY19jYXN0PGludD4oc2l6ZW9mKFNlcmlhbGl6ZWRIZWFkZXIpKSkgewotICAgIHJldHVybiAtMTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gdmVyc2lvblszXSAtICcwJzsKLSAgfQotfQotCi0vLyBzdGF0aWMKLWludCBWaXJ0dWFsRmlsZVN5c3RlbTo6R2V0Q3VycmVudFZlcnNpb24oKSB7Ci0gIENPTVBJTEVfQVNTRVJUKHNpemVvZihrVmVyc2lvbikgLSAxID09IDQsIFVuZXhwZWN0ZWRfdmVyc2lvbl9zaXplKTsKLSAgaW50IHZlcnNpb247Ci0gIG1lbWNweSgmdmVyc2lvbiwga1ZlcnNpb24sIHNpemVvZih2ZXJzaW9uKSk7Ci0gIHJldHVybiB2ZXJzaW9uOwotfQotCi1WaXJ0dWFsRmlsZVN5c3RlbTo6VmlydHVhbEZpbGVTeXN0ZW0oKSB7fQotCi1WaXJ0dWFsRmlsZVN5c3RlbTo6flZpcnR1YWxGaWxlU3lzdGVtKCkgewotICBEQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7Ci0gIGJhc2U6OkF1dG9Mb2NrIGxvY2soZmlsZV90YWJsZV9sb2NrXyk7Ci0gIENsZWFyRmlsZVRhYmxlKCk7Ci19Ci0KLVZpcnR1YWxGaWxlKiBWaXJ0dWFsRmlsZVN5c3RlbTo6T3Blbihjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpIHsKLSAgYmFzZTo6QXV0b0xvY2sgbG9jayhmaWxlX3RhYmxlX2xvY2tfKTsKLSAgVmlydHVhbEZpbGUqIHJlc3VsdCA9IE5VTEw7Ci0gIEZpbGVUYWJsZTo6aXRlcmF0b3IgaXQgPSB0YWJsZV8uZmluZChmaWxlbmFtZSk7Ci0gIGlmIChpdCAhPSB0YWJsZV8uZW5kKCkpIHsKLSAgICByZXN1bHQgPSBpdC0+c2Vjb25kOwotICB9IGVsc2UgewotICAgIHJlc3VsdCA9IG5ldyBWaXJ0dWFsRmlsZShmaWxlbmFtZSk7Ci0gICAgdGFibGVfLmluc2VydChpdCwgRmlsZVRhYmxlOjp2YWx1ZV90eXBlKGZpbGVuYW1lLCByZXN1bHQpKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gVmlydHVhbEZpbGVTeXN0ZW06Okxpc3RGaWxlcygpIHsKLSAgYmFzZTo6QXV0b0xvY2sgbG9jayhmaWxlX3RhYmxlX2xvY2tfKTsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGZpbGVzOwotICBmb3IgKEZpbGVUYWJsZTo6aXRlcmF0b3IgaXQgPSB0YWJsZV8uYmVnaW4oKTsgaXQgIT0gdGFibGVfLmVuZCgpOyArK2l0KSB7Ci0gICAgZmlsZXMucHVzaF9iYWNrKGl0LT5maXJzdCk7Ci0gIH0KLSAgcmV0dXJuIGZpbGVzOwotfQotCi12b2lkIFZpcnR1YWxGaWxlU3lzdGVtOjpEZWxldGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKSB7Ci0gIGJhc2U6OkF1dG9Mb2NrIGxvY2soZmlsZV90YWJsZV9sb2NrXyk7Ci0gIEZpbGVUYWJsZTo6aXRlcmF0b3IgaXQgPSB0YWJsZV8uZmluZChmaWxlbmFtZSk7Ci0gIGlmIChpdCAhPSB0YWJsZV8uZW5kKCkpIHsKLSAgICBkZWxldGUgaXQtPnNlY29uZDsKLSAgICB0YWJsZV8uZXJhc2UoaXQpOwotICB9Ci19Ci0KLWludCBWaXJ0dWFsRmlsZVN5c3RlbTo6U2VyaWFsaXplKHVpbnQ4KiBidWZmZXIsIGJvb2wgZHJ5X3J1bikgewotICBEQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7Ci0gIGJhc2U6OkF1dG9Mb2NrIGxvY2soZmlsZV90YWJsZV9sb2NrXyk7Ci0gIHVpbnQ4KiBvcmlnaW5hbCA9IGJ1ZmZlcjsKLQotICAvLyBXZSBkb24ndCBrbm93IHRoZSB0b3RhbCBzaXplIG9mIHRoZSBmaWxlIHlldCwgc28gZGVmZXIgd3JpdGluZyB0aGUgaGVhZGVyLgotICBidWZmZXIgKz0gc2l6ZW9mKFNlcmlhbGl6ZWRIZWFkZXIpOwotICBpbnQgdmFsaWRfZmlsZV9jb3VudCA9IDA7Ci0KLSAgLy8gU2VyaWFsaXplIGVhY2ggZmlsZQotICBmb3IgKEZpbGVUYWJsZTo6aXRlcmF0b3IgaXQgPSB0YWJsZV8uYmVnaW4oKTsgaXQgIT0gdGFibGVfLmVuZCgpOyArK2l0KSB7Ci0gICAgaWYgKGl0LT5zZWNvbmQtPlNpemUoKSA9PSAwKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgaW50IGZpbGVfYnl0ZXMgPSBpdC0+c2Vjb25kLT5TZXJpYWxpemUoYnVmZmVyLCBkcnlfcnVuKTsKLSAgICBidWZmZXIgKz0gZmlsZV9ieXRlczsKLSAgICB2YWxpZF9maWxlX2NvdW50Kys7Ci0gIH0KLSAgY29uc3QgaW50IGJ5dGVzX3dyaXR0ZW4gPSBzdGF0aWNfY2FzdDxpbnQ+KGJ1ZmZlciAtIG9yaWdpbmFsKTsKLSAgaWYgKCFkcnlfcnVuKSB7Ci0gICAgLy8gTm93IHdlIGNhbiB3cml0ZSB0aGUgaGVhZGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlci4KLSAgICBTZXJpYWxpemVkSGVhZGVyIGhlYWRlcjsKLSAgICBoZWFkZXIudmVyc2lvbiA9IEdldEN1cnJlbnRWZXJzaW9uKCk7Ci0gICAgaGVhZGVyLmZpbGVfY291bnQgPSB2YWxpZF9maWxlX2NvdW50OwotICAgIGhlYWRlci5maWxlX3NpemUgPSBieXRlc193cml0dGVuOwotICAgIG1lbWNweShvcmlnaW5hbCwgJmhlYWRlciwgc2l6ZW9mKFNlcmlhbGl6ZWRIZWFkZXIpKTsKLSAgfQotCi0gIHJldHVybiBieXRlc193cml0dGVuOwotfQotCi1ib29sIFZpcnR1YWxGaWxlU3lzdGVtOjpEZXNlcmlhbGl6ZShjb25zdCB1aW50OCogYnVmZmVyLCBpbnQgYnVmZmVyX3NpemVfaW4pIHsKLSAgY29uc3QgdWludDgqIGNhbGxlcl9idWZmZXIgPSBidWZmZXI7Ci0KLSAgYmFzZTo6QXV0b0xvY2sgbG9jayhmaWxlX3RhYmxlX2xvY2tfKTsKLSAgQ2xlYXJGaWxlVGFibGUoKTsKLQotICBpZiAoYnVmZmVyX3NpemVfaW4gPCAwKSB7Ci0gICAgRExPRyhFUlJPUikgPDwgIkJ1ZmZlciBzaXplIG11c3QgYmUgcG9zaXRpdmU6ICIgPDwgYnVmZmVyX3NpemVfaW4KLSAgICAgICAgICAgICAgICA8PCAiIDwgMC4iOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHNpemVfdCBidWZmZXJfc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oYnVmZmVyX3NpemVfaW4pOwotCi0gIC8vIFRoZSBzaXplIG9mIHRoZSBidWZmZXIgbXVzdCBiZSBjaGVja2VkIGJlZm9yZSBjb3B5aW5nIHRoZSBiZWdpbm5pbmcgb2YgaXQKLSAgLy8gaW50byBhIFNlcmlhbGl6ZWRIZWFkZXIuCi0gIGlmIChidWZmZXJfc2l6ZSA8IHNpemVvZihTZXJpYWxpemVkSGVhZGVyKSkgewotICAgIERMT0coRVJST1IpIDw8ICJCdWZmZXIgc2l6ZSAiIDw8IGJ1ZmZlcl9zaXplCi0gICAgICAgICAgICAgICAgPDwgIiBpcyB0b28gc21hbGwgdG8gY29udGFpbiBhIFNlcmlhbGl6ZWRIZWFkZXIgb2Ygc2l6ZSAiCi0gICAgICAgICAgICAgICAgPDwgc2l6ZW9mKFNlcmlhbGl6ZWRIZWFkZXIpIDw8ICI7IG9wZXJhdGlvbiBhYm9ydGVkLiI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gUmVhZCBpbiBleHBlY3RlZCBudW1iZXIgb2YgZmlsZXMKLSAgU2VyaWFsaXplZEhlYWRlciBoZWFkZXI7Ci0gIG1lbWNweSgmaGVhZGVyLCBidWZmZXIsIHNpemVvZihTZXJpYWxpemVkSGVhZGVyKSk7Ci0gIGJ1ZmZlciArPSBzaXplb2YoU2VyaWFsaXplZEhlYWRlcik7Ci0KLSAgaW50IGJ1ZmZlcl92ZXJzaW9uID0gR2V0SGVhZGVyVmVyc2lvbihoZWFkZXIpOwotICBpZiAoYnVmZmVyX3ZlcnNpb24gIT0gMCkgewotICAgIC8vIE5vdGU6IFdlIHdvdWxkIGhhbmRsZSBvbGQgdmVyc2lvbnMgaGVyZSwgaWYgbmVjZXNzYXJ5LgotICAgIERMT0coRVJST1IpIDw8ICJBdHRlbXB0ZWQgdG8gbG9hZCBhIGRpZmZlcmVudCB2ZXJzaW9uOyBvcGVyYXRpb24gYWJvcnRlZC4iOwotICAgIHJldHVybiBmYWxzZTsKLSAgfSBlbHNlIGlmIChzdGF0aWNfY2FzdDxzaXplX3Q+KGhlYWRlci5maWxlX3NpemUpICE9IGJ1ZmZlcl9zaXplKSB7Ci0gICAgRExPRyhFUlJPUikgPDwgIkJ1ZmZlciBzaXplIG1pc21hdGNoOiAiIDw8IGhlYWRlci5maWxlX3NpemUKLSAgICAgICAgICAgICAgICA8PCAiICE9ICIgPDwgYnVmZmVyX3NpemU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBoZWFkZXIuZmlsZV9jb3VudDsgKytpKSB7Ci0gICAgc2l6ZV90IGJ1ZmZlcl91c2VkID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihidWZmZXIgLSBjYWxsZXJfYnVmZmVyKTsKLSAgICBpZiAoYnVmZmVyX3NpemUgPCBidWZmZXJfdXNlZCkgewotICAgICAgRExPRyhFUlJPUikgPDwgIkJ1ZmZlciBvdmVycnVuIGRlc2VyaWFsaXppbmcgZmlsZXMiOwotICAgICAgQ2xlYXJGaWxlVGFibGUoKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgc2l6ZV90IGJ1ZmZlcl9yZW1haW5pbmcgPSBidWZmZXJfc2l6ZSAtIGJ1ZmZlcl91c2VkOwotCi0gICAgVmlydHVhbEZpbGUqIGZpbGUgPSBuZXcgVmlydHVhbEZpbGUoIiIpOwotCi0gICAgaW50IGJ5dGVzID0gZmlsZS0+RGVzZXJpYWxpemUoYnVmZmVyLCBidWZmZXJfcmVtYWluaW5nKTsKLSAgICBpZiAoYnl0ZXMgPiAwKSB7Ci0gICAgICBidWZmZXIgKz0gYnl0ZXM7Ci0gICAgICB0YWJsZV9bZmlsZS0+bmFtZV9dID0gZmlsZTsKLSAgICB9IGVsc2UgewotICAgICAgRExPRyhXQVJOSU5HKSA8PCAiRmFpbGVkIHRvIGRlc2VyaWFsaXplIHZpcnR1YWwgZmlsZSBzeXN0ZW0uIjsKLSAgICAgIGRlbGV0ZSBmaWxlOwotICAgICAgQ2xlYXJGaWxlVGFibGUoKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgVmlydHVhbEZpbGVTeXN0ZW06OkNsZWFyRmlsZVRhYmxlKCkgewotICBEQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7Ci0gIGZpbGVfdGFibGVfbG9ja18uQXNzZXJ0QWNxdWlyZWQoKTsKLSAgZm9yIChGaWxlVGFibGU6Oml0ZXJhdG9yIGl0ID0gdGFibGVfLmJlZ2luKCk7IGl0ICE9IHRhYmxlXy5lbmQoKTsgKytpdCkgewotICAgIGRlbGV0ZSBpdC0+c2Vjb25kOwotICB9Ci0gIHRhYmxlXy5jbGVhcigpOwotfQotCi19ICAvLyBuYW1lc3BhY2Ugc3RvcmFnZQotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zdG9yYWdlL3ZpcnR1YWxfZmlsZV9zeXN0ZW0uaCBiL3NyYy9jb2JhbHQvc3RvcmFnZS92aXJ0dWFsX2ZpbGVfc3lzdGVtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNDk1NzYuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9zdG9yYWdlL3ZpcnR1YWxfZmlsZV9zeXN0ZW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpZm5kZWYgQ09CQUxUX1NUT1JBR0VfVklSVFVBTF9GSUxFX1NZU1RFTV9IXwotI2RlZmluZSBDT0JBTFRfU1RPUkFHRV9WSVJUVUFMX0ZJTEVfU1lTVEVNX0hfCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImJhc2UvYmFzaWN0eXBlcy5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKLSNpbmNsdWRlICJiYXNlL3N5bmNocm9uaXphdGlvbi9sb2NrLmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2Ugc3RvcmFnZSB7Ci0KLWNsYXNzIFZpcnR1YWxGaWxlOwotCi0vLyBJbXBsZW1lbnRzIGEgc2ltcGxlIHZpcnR1YWwgZmlsZXN5c3RlbSwgcHJpbWFyaWx5IGludGVuZGVkIHRvCi0vLyBiZSB1c2VkIGZvciBwcm92aWRpbmcgYW4gaW4tbWVtb3J5IGZpbGVzeXN0ZW0gdGhhdCBTUUxpdGUgY2FuIHdyaXRlIHRvLAotLy8gYW5kIGFsbG93aW5nIHRoYXQgZmlsZXN5c3RlbSB0byBiZSBzYXZlZCBvdXQgaW50byBhIHNpbmdsZSBtZW1vcnkgYnVmZmVyLgotLy8gQ29udGFpbnMgYSBtYXBwaW5nIGZyb20gcGF0aHMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyBtZW1vcnkgYmxvY2tzLgotLy8gVmlydHVhbEZpbGVTeXN0ZW0gbXVzdCBiZSBzZXJpYWxpemVkLCBkZXNlcmlhbGl6ZWQsIGFuZCBkZXN0cm95ZWQgb24gdGhlCi0vLyBzYW1lIHRocmVhZCBpdCB3YXMgY3JlYXRlZCBvbi4KLS8vIE9wZW4vRGVsZXRlIGFyZSB0aHJlYWQtc2FmZSBzbyB0aGF0IFNRTCBjYW4gcnVuIG9uIGFueSB0aHJlYWQuCi1jbGFzcyBWaXJ0dWFsRmlsZVN5c3RlbSB7Ci0gcHVibGljOgotICBzdHJ1Y3QgU2VyaWFsaXplZEhlYWRlciB7Ci0gICAgaW50MzIgdmVyc2lvbjsKLSAgICBpbnQzMiBmaWxlX3NpemU7Ci0gICAgaW50MzIgZmlsZV9jb3VudDsKLSAgfTsKLSAgLy8gUmV0dXJucyB0aGUgdmVyc2lvbiBvZiB0aGUgVmlydHVhbEZpbGVTeXN0ZW0gaGVhZGVyIGluIGJ1ZmZlci4KLSAgLy8gLTEgaWYgYnVmZmVyIGlzIGludmFsaWQuCi0gIHN0YXRpYyBpbnQgR2V0SGVhZGVyVmVyc2lvbihjb25zdCBTZXJpYWxpemVkSGVhZGVyJiBoZWFkZXIpOwotICBzdGF0aWMgaW50IEdldEN1cnJlbnRWZXJzaW9uKCk7Ci0KLSAgVmlydHVhbEZpbGVTeXN0ZW0oKTsKLSAgflZpcnR1YWxGaWxlU3lzdGVtKCk7Ci0KLSAgLy8gU2VyaWFsaXplcyB0aGUgZmlsZSBzeXN0ZW0gb3V0IHRvIGEgc2luZ2xlIGNvbnRpZ3VvdXMgYnVmZmVyLgotICAvLyBBIGRyeSBydW4gb25seSBjYWxjdWxhdGVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgbmVlZGVkLgotICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbi4KLSAgaW50IFNlcmlhbGl6ZSh1aW50OCogYnVmZmVyLCBib29sIGRyeV9ydW4pOwotCi0gIC8vIERlc2VyaWFsaXplcyBhIGZpbGUgc3lzdGVtIGZyb20gYSBtZW1vcnkgYnVmZmVyLgotICAvLyBSZXR1cm5zIGZhbHNlIG9uIGZhaWx1cmUuCi0gIGJvb2wgRGVzZXJpYWxpemUoY29uc3QgdWludDgqIGJ1ZmZlciwgaW50IGJ1ZmZlcl9zaXplKTsKLQotICAvLyBTaW1wbGUgZmlsZSBvcGVuLiBXaWxsIGNyZWF0ZSBhIGZpbGUgaWYgaXQgZG9lcyBub3QgZXhpc3QsIGFuZCBmaWxlcyBhcmUKLSAgLy8gYWx3YXlzIHJlYWRhYmxlIGFuZCB3cml0YWJsZS4KLSAgVmlydHVhbEZpbGUqIE9wZW4oY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKTsKLQotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gTGlzdEZpbGVzKCk7Ci0KLSAgdm9pZCBEZWxldGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKTsKLQotIHByaXZhdGU6Ci0gIHZvaWQgQ2xlYXJGaWxlVGFibGUoKTsKLSAgdm9pZCBTUUxSZWdpc3RlcigpOwotICB2b2lkIFNRTFVucmVnaXN0ZXIoKTsKLQotICB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBWaXJ0dWFsRmlsZSo+IEZpbGVUYWJsZTsKLSAgRmlsZVRhYmxlIHRhYmxlXzsKLSAgLy8gQ2VydGFpbiBvcGVyYXRpb25zIChzZXJpYWxpemUsIGRlc2VyaWFsaXplKSBtdXN0IHJ1biBvbiB0aGUgc2FtZSB0aHJlYWQuCi0gIGJhc2U6OlRocmVhZENoZWNrZXIgdGhyZWFkX2NoZWNrZXJfOwotICAvLyBMb2NrIHRvIHByb3RlY3QgdGhlIGZpbGUgdGFibGUuIFdlIHdhbnQgdG8gc3VwcG9ydCBTUUwgcXVlcmllcyBvbiBhbnkKLSAgLy8gdGhyZWFkLgotICBiYXNlOjpMb2NrIGZpbGVfdGFibGVfbG9ja187Ci19OwotCi19ICAvLyBuYW1lc3BhY2Ugc3RvcmFnZQotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAotCi0jZW5kaWYgIC8vIENPQkFMVF9TVE9SQUdFX1ZJUlRVQUxfRklMRV9TWVNURU1fSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3RvcmFnZS92aXJ0dWFsX2ZpbGVfc3lzdGVtX3Rlc3QuY2MgYi9zcmMvY29iYWx0L3N0b3JhZ2UvdmlydHVhbF9maWxlX3N5c3RlbV90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzI1MjYxLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvc3RvcmFnZS92aXJ0dWFsX2ZpbGVfc3lzdGVtX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgImNvYmFsdC9zdG9yYWdlL3ZpcnR1YWxfZmlsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zdG9yYWdlL3ZpcnR1YWxfZmlsZV9zeXN0ZW0uaCIKLQotI2luY2x1ZGUgImJhc2UvY29tcGlsZXJfc3BlY2lmaWMuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCi0jaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdfcG9lbS5oIgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBzdG9yYWdlIHsKLQotY2xhc3MgVmlydHVhbEZpbGVTeXN0ZW1UZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgVmlydHVhbEZpbGVTeXN0ZW0gdmZzXzsKLX07Ci0KLVRFU1RfRihWaXJ0dWFsRmlsZVN5c3RlbVRlc3QsIFdyaXRlQW5kUmVhZCkgewotICBWaXJ0dWFsRmlsZSogZmlsZSA9IHZmc18uT3BlbigiZmlsZTEudG1wIik7Ci0gIEFTU0VSVF9UUlVFKGZpbGUpOwotICBFWFBFQ1RfRVEoMCwgZmlsZS0+U2l6ZSgpKTsKLQotICBpbnQgZXhwZWN0ZWRbXSA9IHswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5fTsKLSAgZmlsZS0+V3JpdGUoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksIDApOwotCi0gIGNoYXIgb3V0X2RhdGFbMTI4XTsKLSAgaW50IGJ5dGVzID0gZmlsZS0+UmVhZChvdXRfZGF0YSwgc2l6ZW9mKG91dF9kYXRhKSwgMCk7Ci0gIEVYUEVDVF9FUShieXRlcywgc2l6ZW9mKGV4cGVjdGVkKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZW1jbXAoZXhwZWN0ZWQsIG91dF9kYXRhLCBzaXplb2YoZXhwZWN0ZWQpKSk7Ci19Ci0KLVRFU1RfRihWaXJ0dWFsRmlsZVN5c3RlbVRlc3QsIFJlYWRXcml0ZU9mZnNldHMpIHsKLSAgVmlydHVhbEZpbGUqIGZpbGUgPSB2ZnNfLk9wZW4oImZpbGUxLnRtcCIpOwotICBBU1NFUlRfVFJVRShmaWxlKTsKLSAgRVhQRUNUX0VRKDAsIGZpbGUtPlNpemUoKSk7Ci0KLSAgY2hhciBleHBlY3RlZFtdID0gezAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDl9OwotICBmaWxlLT5Xcml0ZShleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSwgMCk7Ci0KLSAgLy8gU2VlayB0byBwb3NpdGlvbiA0IGFuZCByZWFkIGJ5dGVzLgotICBjaGFyIG91dF9kYXRhWzEyOF07Ci0gIGludCBieXRlcyA9IGZpbGUtPlJlYWQob3V0X2RhdGEsIHNpemVvZihvdXRfZGF0YSksIDQpOwotCi0gIGNvbnN0IGludCBrRGF0YVNpemUgPSA2OwotICBFWFBFQ1RfRVEoa0RhdGFTaXplLCBieXRlcyk7Ci0gIEVYUEVDVF9FUSgwLCBtZW1jbXAoJmV4cGVjdGVkWzRdLCBvdXRfZGF0YSwga0RhdGFTaXplKSk7Ci0KLSAgLy8gV3JpdGUgc29tZSBieXRlcyBpbnRvIHRoZSBtaWRkbGUKLSAgZmlsZS0+V3JpdGUoZXhwZWN0ZWQsIDMsIDMpOwotICBjaGFyIGV4cGVjdGVkMVtdID0gezAsIDEsIDIsIDAsIDEsIDIsIDYsIDcsIDgsIDl9OwotICBFWFBFQ1RfRVEoc2l6ZW9mKGV4cGVjdGVkMSksIGZpbGUtPlNpemUoKSk7Ci0KLSAgYnl0ZXMgPSBmaWxlLT5SZWFkKG91dF9kYXRhLCBzaXplb2Yob3V0X2RhdGEpLCAwKTsKLSAgRVhQRUNUX0VRKDAsIG1lbWNtcChleHBlY3RlZDEsIG91dF9kYXRhLCBzdGF0aWNfY2FzdDxzaXplX3Q+KGJ5dGVzKSkpOwotCi0gIC8vIFRyeSB0byByZWFkIHBhc3QgdGhlIGVuZC4KLSAgY29uc3QgaW50IGtPZmZzZXRQYXN0RW5kID0gMTAwMDAwOwotICBieXRlcyA9IGZpbGUtPlJlYWQob3V0X2RhdGEsIHNpemVvZihvdXRfZGF0YSksIGtPZmZzZXRQYXN0RW5kKTsKLSAgRVhQRUNUX0VRKDAsIGJ5dGVzKTsKLQotICAvLyBUcnkgdG8gd3JpdGUgcGFzdCB0aGUgZW5kLgotICBmaWxlLT5Xcml0ZShleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSwga09mZnNldFBhc3RFbmQpOwotICBFWFBFQ1RfRVEoa09mZnNldFBhc3RFbmQgKyBzaXplb2YoZXhwZWN0ZWQpLCBmaWxlLT5TaXplKCkpOwotCi0gIC8vIE1ha2Ugc3VyZSB0aGUgd3JpdGUgcGFzdCB0aGUgZW5kIHdvcmtlZC4KLSAgYnl0ZXMgPSBmaWxlLT5SZWFkKG91dF9kYXRhLCBzaXplb2Yob3V0X2RhdGEpLCBrT2Zmc2V0UGFzdEVuZCk7Ci0gIEVYUEVDVF9FUSgwLCBtZW1jbXAoZXhwZWN0ZWQsIG91dF9kYXRhLCBzdGF0aWNfY2FzdDxzaXplX3Q+KGJ5dGVzKSkpOwotfQotCi1URVNUX0YoVmlydHVhbEZpbGVTeXN0ZW1UZXN0LCBPcGVuKSB7Ci0gIC8vIENyZWF0ZSBhIGZldyBmaWxlcyBhbmQgd3JpdGUgc29tZSBkYXRhCi0gIFZpcnR1YWxGaWxlKiBmaWxlID0gdmZzXy5PcGVuKCJmaWxlMS50bXAiKTsKLSAgQVNTRVJUX1RSVUUoZmlsZSk7Ci0gIEVYUEVDVF9FUSgwLCBmaWxlLT5TaXplKCkpOwotCi0gIC8vIFdyaXRlIGEgZmV3IGJ5dGVzIG9mIHJhbmRvbSBkYXRhLgotICBmaWxlLT5Xcml0ZSgidGVzdCIsIDQsIDApOwotICBFWFBFQ1RfRVEoNCwgZmlsZS0+U2l6ZSgpKTsKLQotICAvLyBPcGVuIGEgbmV3IGZpbGUKLSAgZmlsZSA9IHZmc18uT3BlbigiZmlsZTIudG1wIik7Ci0gIEFTU0VSVF9UUlVFKGZpbGUpOwotICBFWFBFQ1RfRVEoMCwgZmlsZS0+U2l6ZSgpKTsKLQotICAvLyBUcnkgdG8gcmVvcGVuIHRoZSBleGlzdGluZyBmaWxlLgotICBmaWxlID0gdmZzXy5PcGVuKCJmaWxlMS50bXAiKTsKLSAgQVNTRVJUX1RSVUUoZmlsZSk7Ci0gIEVYUEVDVF9FUSg0LCBmaWxlLT5TaXplKCkpOwotfQotCi1URVNUX0YoVmlydHVhbEZpbGVTeXN0ZW1UZXN0LCBUcnVuY2F0ZSkgewotICBWaXJ0dWFsRmlsZSogZmlsZSA9IHZmc18uT3BlbigiZmlsZTEudG1wIik7Ci0gIEFTU0VSVF9UUlVFKGZpbGUpOwotICBFWFBFQ1RfRVEoMCwgZmlsZS0+U2l6ZSgpKTsKLQotICBjb25zdCBjaGFyKiBkYXRhID0gInRlc3QiOwotICBjaGFyIGZpbGVfY29udGVudHNbNF07Ci0gIC8vIFdyaXRlIGEgZmV3IGJ5dGVzIG9mIHJhbmRvbSBkYXRhLgotICBmaWxlLT5Xcml0ZShkYXRhLCA0LCAwKTsKLSAgRVhQRUNUX0VRKDQsIGZpbGUtPlNpemUoKSk7Ci0gIGludCBieXRlcyA9IGZpbGUtPlJlYWQoZmlsZV9jb250ZW50cywgc2l6ZW9mKGZpbGVfY29udGVudHMpLCAwKTsKLSAgRVhQRUNUX0VRKDQsIGJ5dGVzKTsKLSAgRVhQRUNUX0VRKDAsIG1lbWNtcChmaWxlX2NvbnRlbnRzLCBkYXRhLCBzdGF0aWNfY2FzdDxzaXplX3Q+KGJ5dGVzKSkpOwotCi0gIGZpbGUtPlRydW5jYXRlKDMpOwotICBFWFBFQ1RfRVEoMywgZmlsZS0+U2l6ZSgpKTsKLSAgYnl0ZXMgPSBmaWxlLT5SZWFkKGZpbGVfY29udGVudHMsIHNpemVvZihmaWxlX2NvbnRlbnRzKSwgMCk7Ci0gIEVYUEVDVF9FUSgzLCBieXRlcyk7Ci0gIEVYUEVDVF9FUSgwLCBtZW1jbXAoZmlsZV9jb250ZW50cywgZGF0YSwgc3RhdGljX2Nhc3Q8c2l6ZV90PihieXRlcykpKTsKLQotICBmaWxlLT5UcnVuY2F0ZSgwKTsKLSAgRVhQRUNUX0VRKDAsIGZpbGUtPlNpemUoKSk7Ci0gIGJ5dGVzID0gZmlsZS0+UmVhZChmaWxlX2NvbnRlbnRzLCBzaXplb2YoZmlsZV9jb250ZW50cyksIDApOwotICBFWFBFQ1RfRVEoMCwgYnl0ZXMpOwotfQotCi1URVNUX0YoVmlydHVhbEZpbGVTeXN0ZW1UZXN0LCBTZXJpYWxpemVEZXNlcmlhbGl6ZSkgewotICAvLyBDcmVhdGUgYSBmZXcgZmlsZXMgYW5kIHdyaXRlIHNvbWUgZGF0YQotICBWaXJ0dWFsRmlsZSogZmlsZSA9IHZmc18uT3BlbigiZmlsZTEudG1wIik7Ci0gIEVYUEVDVF9UUlVFKGZpbGUgIT0gTlVMTCk7Ci0gIGNvbnN0IGNoYXIgZGF0YTFbXSA9ICJhYmMiOwotICBpbnQgZGF0YTFfc2l6ZSA9IDM7Ci0gIGZpbGUtPldyaXRlKGRhdGExLCBkYXRhMV9zaXplLCAwKTsKLQotICBmaWxlID0gdmZzXy5PcGVuKCJmaWxlMi50bXAiKTsKLSAgRVhQRUNUX1RSVUUoZmlsZSAhPSBOVUxMKTsKLSAgY29uc3QgY2hhciBkYXRhMltdID0gImRlZmciOwotICBpbnQgZGF0YTJfc2l6ZSA9IDQ7Ci0gIGZpbGUtPldyaXRlKGRhdGEyLCBkYXRhMl9zaXplLCAwKTsKLQotICBmaWxlID0gdmZzXy5PcGVuKCJmaWxlMy50bXAiKTsKLSAgRVhQRUNUX1RSVUUoZmlsZSAhPSBOVUxMKTsKLSAgY29uc3QgY2hhciBkYXRhM1tdID0gIiI7Ci0gIGludCBkYXRhM19zaXplID0gMDsKLSAgZmlsZS0+V3JpdGUoZGF0YTMsIGRhdGEzX3NpemUsIDApOwotCi0gIC8vIEZpcnN0IHBlcmZvcm0gYSBkcnkgcnVuIHRvIGZpZ3VyZSBvdXQgaG93IG11Y2ggc3BhY2Ugd2UgbmVlZC4KLSAgaW50IGJ5dGVzID0gdmZzXy5TZXJpYWxpemUoTlVMTCwgdHJ1ZSAvKmRyeSBydW4qLyk7Ci0gIHNjb3BlZF9hcnJheTx1aW50OD4gYnVmZmVyKG5ldyB1aW50OFtzdGF0aWNfY2FzdDxzaXplX3Q+KGJ5dGVzKV0pOwotCi0gIC8vIE5vdyBzZXJpYWxpemUgYW5kIGRlc2VyaWFsaXplCi0gIHZmc18uU2VyaWFsaXplKGJ1ZmZlci5nZXQoKSwgZmFsc2UgLypkcnkgcnVuKi8pOwotCi0gIC8vIERlc2VyaWFsaXplIHRoZSBkYXRhIGludG8gYSBuZXcgdmZzCi0gIFZpcnR1YWxGaWxlU3lzdGVtIG5ld192ZnM7Ci0gIEFTU0VSVF9UUlVFKG5ld192ZnMuRGVzZXJpYWxpemUoYnVmZmVyLmdldCgpLCBieXRlcykpOwotCi0gIC8vIE1ha2Ugc3VyZSB0aGUgbmV3IHZmcyBjb250YWlucyBhbGwgdGhlIGV4cGVjdGVkIGRhdGEuCi0gIGNoYXIgZmlsZV9jb250ZW50c1tWaXJ0dWFsRmlsZTo6a01heFZmc1BhdGhuYW1lXTsKLSAgZmlsZSA9IG5ld192ZnMuT3BlbigiZmlsZTEudG1wIik7Ci0gIEVYUEVDVF9UUlVFKGZpbGUgIT0gTlVMTCk7Ci0gIGJ5dGVzID0gZmlsZS0+UmVhZChmaWxlX2NvbnRlbnRzLCBzaXplb2YoZmlsZV9jb250ZW50cyksIDApOwotICBFWFBFQ1RfRVEoZGF0YTFfc2l6ZSwgYnl0ZXMpOwotICBFWFBFQ1RfRVEoMCwgbWVtY21wKGZpbGVfY29udGVudHMsIGRhdGExLCBzdGF0aWNfY2FzdDxzaXplX3Q+KGJ5dGVzKSkpOwotCi0gIGZpbGUgPSBuZXdfdmZzLk9wZW4oImZpbGUyLnRtcCIpOwotICBFWFBFQ1RfVFJVRShmaWxlICE9IE5VTEwpOwotICBieXRlcyA9IGZpbGUtPlJlYWQoZmlsZV9jb250ZW50cywgc2l6ZW9mKGZpbGVfY29udGVudHMpLCAwKTsKLSAgRVhQRUNUX0VRKGRhdGEyX3NpemUsIGJ5dGVzKTsKLSAgRVhQRUNUX0VRKDAsIG1lbWNtcChmaWxlX2NvbnRlbnRzLCBkYXRhMiwgc3RhdGljX2Nhc3Q8c2l6ZV90PihieXRlcykpKTsKLQotICBmaWxlID0gbmV3X3Zmcy5PcGVuKCJmaWxlMy50bXAiKTsKLSAgRVhQRUNUX1RSVUUoZmlsZSAhPSBOVUxMKTsKLSAgYnl0ZXMgPSBmaWxlLT5SZWFkKGZpbGVfY29udGVudHMsIHNpemVvZihmaWxlX2NvbnRlbnRzKSwgMCk7Ci0gIEVYUEVDVF9FUShkYXRhM19zaXplLCBieXRlcyk7Ci0gIEVYUEVDVF9FUSgwLCBtZW1jbXAoZmlsZV9jb250ZW50cywgZGF0YTMsIHN0YXRpY19jYXN0PHNpemVfdD4oYnl0ZXMpKSk7Ci19Ci0KLVRFU1RfRihWaXJ0dWFsRmlsZVN5c3RlbVRlc3QsIERlc2VyaWFsaXplVHJ1bmNhdGVkKSB7Ci0gIC8vIENyZWF0ZSBhIGZldyBmaWxlcyBhbmQgd3JpdGUgc29tZSBkYXRhCi0gIFZpcnR1YWxGaWxlKiBmaWxlID0gdmZzXy5PcGVuKCJmaWxlMS50bXAiKTsKLSAgRVhQRUNUX1RSVUUoZmlsZSAhPSBOVUxMKTsKLSAgY29uc3QgY2hhciBkYXRhMVtdID0gImFiYyI7Ci0gIGludCBkYXRhMV9zaXplID0gMzsKLSAgZmlsZS0+V3JpdGUoZGF0YTEsIGRhdGExX3NpemUsIDApOwotCi0gIGZpbGUgPSB2ZnNfLk9wZW4oImZpbGUyLnRtcCIpOwotICBFWFBFQ1RfVFJVRShmaWxlICE9IE5VTEwpOwotICBjb25zdCBjaGFyIGRhdGEyW10gPSAiZGVmZyI7Ci0gIGludCBkYXRhMl9zaXplID0gNDsKLSAgZmlsZS0+V3JpdGUoZGF0YTIsIGRhdGEyX3NpemUsIDApOwotCi0gIC8vIEZpcnN0IHBlcmZvcm0gYSBkcnkgcnVuIHRvIGZpZ3VyZSBvdXQgaG93IG11Y2ggc3BhY2Ugd2UgbmVlZC4KLSAgaW50IGJ5dGVzID0gdmZzXy5TZXJpYWxpemUoTlVMTCwgdHJ1ZSAvKmRyeSBydW4qLyk7Ci0gIHNjb3BlZF9hcnJheTx1aW50OD4gYnVmZmVyKG5ldyB1aW50OFtzdGF0aWNfY2FzdDxzaXplX3Q+KGJ5dGVzKV0pOwotCi0gIC8vIE5vdyBzZXJpYWxpemUgYW5kIGRlc2VyaWFsaXplCi0gIHZmc18uU2VyaWFsaXplKGJ1ZmZlci5nZXQoKSwgZmFsc2UgLypkcnkgcnVuKi8pOwotCi0gIGZvciAoaW50IGkgPSAxOyBpIDwgYnl0ZXM7IGkrKykgewotICAgIC8vIENvcnJ1cHQgdGhlIGhlYWRlcgotICAgIFZpcnR1YWxGaWxlU3lzdGVtOjpTZXJpYWxpemVkSGVhZGVyIGhlYWRlcjsKLSAgICBtZW1jcHkoJmhlYWRlciwgYnVmZmVyLmdldCgpLCBzaXplb2YoaGVhZGVyKSk7Ci0gICAgaGVhZGVyLmZpbGVfc2l6ZSA9IGhlYWRlci5maWxlX3NpemUgLSBpOwotICAgIG1lbWNweShidWZmZXIuZ2V0KCksICZoZWFkZXIsIHNpemVvZihoZWFkZXIpKTsKLQotICAgIC8vIERlc2VyaWFsaXplIHRoZSBkYXRhIGludG8gYSBuZXcgdmZzCi0gICAgVmlydHVhbEZpbGVTeXN0ZW0gbmV3X3ZmczsKLSAgICBFWFBFQ1RfRkFMU0UobmV3X3Zmcy5EZXNlcmlhbGl6ZShidWZmZXIuZ2V0KCksIGJ5dGVzIC0gaSkpOwotICB9Ci19Ci0KLVRFU1RfRihWaXJ0dWFsRmlsZVN5c3RlbVRlc3QsIERlc2VyaWFsaXplQmFkRGF0YSkgewotICBzY29wZWRfYXJyYXk8dWludDg+IGJ1ZmZlcihuZXcgdWludDhbMF0pOwotICBFWFBFQ1RfRkFMU0UodmZzXy5EZXNlcmlhbGl6ZShidWZmZXIuZ2V0KCksIDApKTsKLSAgRVhQRUNUX0ZBTFNFKHZmc18uRGVzZXJpYWxpemUoYnVmZmVyLmdldCgpLCAtMSkpOwotICBidWZmZXIucmVzZXQobmV3IHVpbnQ4WzFdKTsKLSAgRVhQRUNUX0ZBTFNFKHZmc18uRGVzZXJpYWxpemUoYnVmZmVyLmdldCgpLCAxKSk7Ci0gIGJ1ZmZlci5yZXNldChuZXcgdWludDhbc2l6ZW9mKFZpcnR1YWxGaWxlU3lzdGVtOjpTZXJpYWxpemVkSGVhZGVyKV0pOwotICBWaXJ0dWFsRmlsZVN5c3RlbTo6U2VyaWFsaXplZEhlYWRlciBoZWFkZXIgPSB7fTsKLSAgaGVhZGVyLnZlcnNpb24gPSAtMTsKLSAgbWVtY3B5KGJ1ZmZlci5nZXQoKSwgJmhlYWRlciwgc2l6ZW9mKGhlYWRlcikpOwotICBFWFBFQ1RfRkFMU0UodmZzXy5EZXNlcmlhbGl6ZShidWZmZXIuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihWaXJ0dWFsRmlsZVN5c3RlbTo6U2VyaWFsaXplZEhlYWRlcikpKTsKLSAgbWVtY3B5KCYoaGVhZGVyLnZlcnNpb24pLCAiU0FWMCIsIHNpemVvZihoZWFkZXIudmVyc2lvbikpOwotICBoZWFkZXIuZmlsZV9zaXplID0gc2l6ZW9mKFZpcnR1YWxGaWxlU3lzdGVtOjpTZXJpYWxpemVkSGVhZGVyKTsKLSAgbWVtY3B5KGJ1ZmZlci5nZXQoKSwgJmhlYWRlciwgc2l6ZW9mKGhlYWRlcikpOwotICBFWFBFQ1RfVFJVRSh2ZnNfLkRlc2VyaWFsaXplKGJ1ZmZlci5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoVmlydHVhbEZpbGVTeXN0ZW06OlNlcmlhbGl6ZWRIZWFkZXIpKSk7Ci0gIEFTU0VSVF9FUSgwLCB2ZnNfLkxpc3RGaWxlcygpLnNpemUoKSk7Ci19Ci0KLVRFU1RfRihWaXJ0dWFsRmlsZVN5c3RlbVRlc3QsIEdldEhlYWRlclZlcnNpb24pIHsKLSAgVmlydHVhbEZpbGVTeXN0ZW06OlNlcmlhbGl6ZWRIZWFkZXIgaGVhZGVyOwotICBtZW1zZXQoJmhlYWRlciwgMCwgc2l6ZW9mKGhlYWRlcikpOwotICBoZWFkZXIuZmlsZV9zaXplID0gc2l6ZW9mKGhlYWRlcik7Ci0KLSAgQ09NUElMRV9BU1NFUlQoc2l6ZW9mKGhlYWRlci52ZXJzaW9uKSA9PSBzaXplb2YoIlNBVjAiKSAtIDEsCi0gICAgICAgICAgICAgICAgIEludmFsaWRfaGVhZGVyX3ZlcnNpb25fc2l6ZSk7Ci0gIG1lbWNweSgmaGVhZGVyLnZlcnNpb24sICJYWVpXIiwgc2l6ZW9mKGhlYWRlci52ZXJzaW9uKSk7Ci0gIEVYUEVDVF9FUSgtMSwgVmlydHVhbEZpbGVTeXN0ZW06OkdldEhlYWRlclZlcnNpb24oaGVhZGVyKSk7Ci0gIG1lbWNweSgmaGVhZGVyLnZlcnNpb24sICJTQVYwIiwgc2l6ZW9mKGhlYWRlci52ZXJzaW9uKSk7Ci0gIEVYUEVDVF9FUSgwLCBWaXJ0dWFsRmlsZVN5c3RlbTo6R2V0SGVhZGVyVmVyc2lvbihoZWFkZXIpKTsKLSAgbWVtY3B5KCZoZWFkZXIudmVyc2lvbiwgIlNBVjEiLCBzaXplb2YoaGVhZGVyLnZlcnNpb24pKTsKLSAgRVhQRUNUX0VRKDEsIFZpcnR1YWxGaWxlU3lzdGVtOjpHZXRIZWFkZXJWZXJzaW9uKGhlYWRlcikpOwotfQotCi19ICAvLyBuYW1lc3BhY2Ugc3RvcmFnZQotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zeXN0ZW1fd2luZG93L2lucHV0X2V2ZW50LmggYi9zcmMvY29iYWx0L3N5c3RlbV93aW5kb3cvaW5wdXRfZXZlbnQuaAppbmRleCBjZTdkZDVmLi40MjU0OGI5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3N5c3RlbV93aW5kb3cvaW5wdXRfZXZlbnQuaAorKysgYi9zcmMvY29iYWx0L3N5c3RlbV93aW5kb3cvaW5wdXRfZXZlbnQuaApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgImNvYmFsdC9iYXNlL2V2ZW50LmgiCiAjaW5jbHVkZSAiY29iYWx0L21hdGgvcG9pbnRfZi5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9ldmVudC5oIgorI2luY2x1ZGUgInN0YXJib2FyZC90aW1lLmgiCiAKIG5hbWVzcGFjZSBjb2JhbHQgewogbmFtZXNwYWNlIHN5c3RlbV93aW5kb3cgewpAQCAtNTUsMjAgKzU2LDIyIEBACiAgICAga0ZvcndhcmRCdXR0b24gPSAxIDw8IDgsCiAgIH07CiAKLSAgSW5wdXRFdmVudChUeXBlIHR5cGUsIGludCBkZXZpY2VfaWQsIGludCBrZXlfY29kZSwgdWludDMyIG1vZGlmaWVycywKLSAgICAgICAgICAgICBib29sIGlzX3JlcGVhdCwgY29uc3QgbWF0aDo6UG9pbnRGJiBwb3NpdGlvbiA9IG1hdGg6OlBvaW50RigpLAorICBJbnB1dEV2ZW50KFNiVGltZU1vbm90b25pYyB0aW1lc3RhbXAsIFR5cGUgdHlwZSwgaW50IGRldmljZV9pZCwKKyAgICAgICAgICAgICBpbnQga2V5X2NvZGUsIHVpbnQzMiBtb2RpZmllcnMsIGJvb2wgaXNfcmVwZWF0LAorICAgICAgICAgICAgIGNvbnN0IG1hdGg6OlBvaW50RiYgcG9zaXRpb24gPSBtYXRoOjpQb2ludEYoKSwKICAgICAgICAgICAgICBjb25zdCBtYXRoOjpQb2ludEYmIGRlbHRhID0gbWF0aDo6UG9pbnRGKCkKICNpZiBTQl9BUElfVkVSU0lPTiA+PSA2Ci0gICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAsCiAgICAgICAgICAgICAgZmxvYXQgcHJlc3N1cmUgPSAwLCBjb25zdCBtYXRoOjpQb2ludEYmIHNpemUgPSBtYXRoOjpQb2ludEYoKSwKICAgICAgICAgICAgICBjb25zdCBtYXRoOjpQb2ludEYmIHRpbHQgPSBtYXRoOjpQb2ludEYoKQogI2VuZGlmCiAjaWYgU0JfSEFTKE9OX1NDUkVFTl9LRVlCT0FSRCkKLSAgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICwKICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaW5wdXRfdGV4dCA9ICIiCiAjZW5kaWYgIC8vIFNCX0hBUyhPTl9TQ1JFRU5fS0VZQk9BUkQpCiAgICAgICAgICAgICAgKQotICAgICAgOiB0eXBlXyh0eXBlKSwKKyAgICAgIDogdGltZXN0YW1wXyh0aW1lc3RhbXApLAorICAgICAgICB0eXBlXyh0eXBlKSwKICAgICAgICAgZGV2aWNlX2lkXyhkZXZpY2VfaWQpLAogICAgICAgICBrZXlfY29kZV8oa2V5X2NvZGUpLAogICAgICAgICBtb2RpZmllcnNfKG1vZGlmaWVycyksCkBAIC05MCw2ICs5Myw3IEBACiAKICAgfklucHV0RXZlbnQoKSB7fQogCisgIFNiVGltZU1vbm90b25pYyB0aW1lc3RhbXAoKSBjb25zdCB7IHJldHVybiB0aW1lc3RhbXBfOyB9CiAgIFR5cGUgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIHR5cGVfOyB9CiAgIGludCBrZXlfY29kZSgpIGNvbnN0IHsgcmV0dXJuIGtleV9jb2RlXzsgfQogICBpbnQgZGV2aWNlX2lkKCkgY29uc3QgeyByZXR1cm4gZGV2aWNlX2lkXzsgfQpAQCAtMTA5LDYgKzExMyw3IEBACiAgIEJBU0VfRVZFTlRfU1VCQ0xBU1MoSW5wdXRFdmVudCk7CiAKICBwcml2YXRlOgorICBTYlRpbWVNb25vdG9uaWMgdGltZXN0YW1wXzsKICAgVHlwZSB0eXBlXzsKICAgaW50IGRldmljZV9pZF87CiAgIGludCBrZXlfY29kZV87CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3N5c3RlbV93aW5kb3cvc3lzdGVtX3dpbmRvdy5jYyBiL3NyYy9jb2JhbHQvc3lzdGVtX3dpbmRvdy9zeXN0ZW1fd2luZG93LmNjCmluZGV4IGY5YWFiNTEuLjdjOWRlMDQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc3lzdGVtX3dpbmRvdy9zeXN0ZW1fd2luZG93LmNjCisrKyBiL3NyYy9jb2JhbHQvc3lzdGVtX3dpbmRvdy9zeXN0ZW1fd2luZG93LmNjCkBAIC05OSw2ICs5OSwyMSBAQAogCiB2b2lkIFN5c3RlbVdpbmRvdzo6RGlzcGF0Y2hJbnB1dEV2ZW50KGNvbnN0IFNiSW5wdXREYXRhJiBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dEV2ZW50OjpUeXBlIHR5cGUsIGJvb2wgaXNfcmVwZWF0KSB7CisgIC8vIFVzZSB0aGUgY3VycmVudCB0aW1lIHVubGVzcyBpdCB3YXMgb3ZlcnJpZGRlbi4KKyAgU2JUaW1lTW9ub3RvbmljIHRpbWVzdGFtcCA9IDA7CisKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9JTlBVVF9USU1FU1RBTVBfQVBJX1ZFUlNJT04KKyAgYm9vbCB1c2VfaW5wdXRfdGltZXN0YW1wID0KKyAgICAgIFNiU3lzdGVtSGFzQ2FwYWJpbGl0eShrU2JTeXN0ZW1DYXBhYmlsaXR5U2V0c0lucHV0VGltZXN0YW1wKTsKKyAgaWYgKHVzZV9pbnB1dF90aW1lc3RhbXApIHsKKyAgICB0aW1lc3RhbXAgPSBkYXRhLnRpbWVzdGFtcDsKKyAgfQorI2VuZGlmCisKKyAgaWYgKHRpbWVzdGFtcCA9PSAwKSB7CisgICAgdGltZXN0YW1wID0gU2JUaW1lR2V0TW9ub3RvbmljTm93KCk7CisgIH0KKwogICAvLyBTdGFyYm9hcmQgaGFuZGlseSB1c2VzIHRoZSBNaWNyb3NvZnQga2V5IG1hcHBpbmcsIHdoaWNoIGlzIGFsc28gd2hhdCBDb2JhbHQKICAgLy8gdXNlcy4KICAgaW50IGtleV9jb2RlID0gc3RhdGljX2Nhc3Q8aW50PihkYXRhLmtleSk7CkBAIC0xMzQsNyArMTQ5LDggQEAKIAogI2lmIFNCX0hBUyhPTl9TQ1JFRU5fS0VZQk9BUkQpCiAgIHNjb3BlZF9wdHI8SW5wdXRFdmVudD4gaW5wdXRfZXZlbnQoCi0gICAgICBuZXcgSW5wdXRFdmVudCh0eXBlLCBkYXRhLmRldmljZV9pZCwga2V5X2NvZGUsIG1vZGlmaWVycywgaXNfcmVwZWF0LAorICAgICAgbmV3IElucHV0RXZlbnQodGltZXN0YW1wLCB0eXBlLCBkYXRhLmRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgIGtleV9jb2RlLCBtb2RpZmllcnMsIGlzX3JlcGVhdCwKICAgICAgICAgICAgICAgICAgICAgIG1hdGg6OlBvaW50RihkYXRhLnBvc2l0aW9uLngsIGRhdGEucG9zaXRpb24ueSksCiAgICAgICAgICAgICAgICAgICAgICBtYXRoOjpQb2ludEYoZGF0YS5kZWx0YS54LCBkYXRhLmRlbHRhLnkpLCBwcmVzc3VyZSwKICAgICAgICAgICAgICAgICAgICAgIG1hdGg6OlBvaW50RihkYXRhLnNpemUueCwgZGF0YS5zaXplLnkpLApAQCAtMTQyLDcgKzE1OCw4IEBACiAgICAgICAgICAgICAgICAgICAgICBkYXRhLmlucHV0X3RleHQgPyBkYXRhLmlucHV0X3RleHQgOiAiIikpOwogI2Vsc2UgICAvLyBTQl9IQVMoT05fU0NSRUVOX0tFWUJPQVJEKQogICBzY29wZWRfcHRyPElucHV0RXZlbnQ+IGlucHV0X2V2ZW50KAotICAgICAgbmV3IElucHV0RXZlbnQodHlwZSwgZGF0YS5kZXZpY2VfaWQsIGtleV9jb2RlLCBtb2RpZmllcnMsIGlzX3JlcGVhdCwKKyAgICAgIG5ldyBJbnB1dEV2ZW50KHRpbWVzdGFtcCwgdHlwZSwgZGF0YS5kZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICBrZXlfY29kZSwgbW9kaWZpZXJzLCBpc19yZXBlYXQsCiAgICAgICAgICAgICAgICAgICAgICBtYXRoOjpQb2ludEYoZGF0YS5wb3NpdGlvbi54LCBkYXRhLnBvc2l0aW9uLnkpLAogICAgICAgICAgICAgICAgICAgICAgbWF0aDo6UG9pbnRGKGRhdGEuZGVsdGEueCwgZGF0YS5kZWx0YS55KSwgcHJlc3N1cmUsCiAgICAgICAgICAgICAgICAgICAgICBtYXRoOjpQb2ludEYoZGF0YS5zaXplLngsIGRhdGEuc2l6ZS55KSwKQEAgLTE1MCw4ICsxNjcsOSBAQAogI2VuZGlmICAvLyBTQl9IQVMoT05fU0NSRUVOX0tFWUJPQVJEKQogI2Vsc2UKICAgc2NvcGVkX3B0cjxJbnB1dEV2ZW50PiBpbnB1dF9ldmVudCgKLSAgICAgIG5ldyBJbnB1dEV2ZW50KHR5cGUsIGRhdGEuZGV2aWNlX2lkLCBrZXlfY29kZSwgZGF0YS5rZXlfbW9kaWZpZXJzLAotICAgICAgICAgICAgICAgICAgICAgaXNfcmVwZWF0LCBtYXRoOjpQb2ludEYoZGF0YS5wb3NpdGlvbi54LCBkYXRhLnBvc2l0aW9uLnkpLAorICAgICAgbmV3IElucHV0RXZlbnQodGltZXN0YW1wLCB0eXBlLCBkYXRhLmRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgIGtleV9jb2RlLCBkYXRhLmtleV9tb2RpZmllcnMsIGlzX3JlcGVhdCwKKyAgICAgICAgICAgICAgICAgICAgIG1hdGg6OlBvaW50RihkYXRhLnBvc2l0aW9uLngsIGRhdGEucG9zaXRpb24ueSksCiAgICAgICAgICAgICAgICAgICAgICBtYXRoOjpQb2ludEYoZGF0YS5kZWx0YS54LCBkYXRhLmRlbHRhLnkpKSk7CiAjZW5kaWYKICAgZXZlbnRfZGlzcGF0Y2hlcigpLT5EaXNwYXRjaEV2ZW50KGlucHV0X2V2ZW50LlBhc3NBczxiYXNlOjpFdmVudD4oKSk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3Rlc3QvZG9jdW1lbnRfbG9hZGVyLmggYi9zcmMvY29iYWx0L3Rlc3QvZG9jdW1lbnRfbG9hZGVyLmgKaW5kZXggODVkMjg5YS4uZjg1NjkzYSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC90ZXN0L2RvY3VtZW50X2xvYWRlci5oCisrKyBiL3NyYy9jb2JhbHQvdGVzdC9kb2N1bWVudF9sb2FkZXIuaApAQCAtNTYsMTUgKzU2LDE2IEBACiAgICAgICAgIGRvbV9zdGF0X3RyYWNrZXJfKG5ldyBkb206OkRvbVN0YXRUcmFja2VyKCJJc0Rpc3BsYXllZFRlc3QiKSksCiAgICAgICAgIHJlc291cmNlX3Byb3ZpZGVyXyhyZXNvdXJjZV9wcm92aWRlcl9zdHViXy5nZXQoKSksCiAgICAgICAgIGh0bWxfZWxlbWVudF9jb250ZXh0XygKLSAgICAgICAgICAgICZmZXRjaGVyX2ZhY3RvcnlfLCBjc3NfcGFyc2VyXy5nZXQoKSwgZG9tX3BhcnNlcl8uZ2V0KCksCi0gICAgICAgICAgICBOVUxMIC8qIGNhbl9wbGF5X3R5cGVfaGFuZGxlciAgKi8sCisgICAgICAgICAgICAmZmV0Y2hlcl9mYWN0b3J5XywgbG9hZGVyX2ZhY3RvcnlfLmdldCgpLCBjc3NfcGFyc2VyXy5nZXQoKSwKKyAgICAgICAgICAgIGRvbV9wYXJzZXJfLmdldCgpLCBOVUxMIC8qIGNhbl9wbGF5X3R5cGVfaGFuZGxlciAgKi8sCiAgICAgICAgICAgICBOVUxMIC8qIHdlYl9tZWRpYV9wbGF5ZXJfZmFjdG9yeSAqLywgJnNjcmlwdF9ydW5uZXJfLAogICAgICAgICAgICAgTlVMTCAvKiBzY3JpcHRfdmFsdWVfZmFjdG9yeSAqLywgTlVMTCAvKiBtZWRpYV9zb3VyY2VfcmVnaXN0cnkgKi8sCiAgICAgICAgICAgICAmcmVzb3VyY2VfcHJvdmlkZXJfLCBOVUxMIC8qIGFuaW1hdGVkX2ltYWdlX3RyYWNrZXIgKi8sCiAgICAgICAgICAgICBpbWFnZV9jYWNoZV8uZ2V0KCksIE5VTEwgLyogcmVkdWNlZF9pbWFnZV9jYWNoZV9jYXBhY2l0eV9tYW5hZ2VyICovLAogICAgICAgICAgICAgTlVMTCAvKiByZW1vdGVfZm9udF9jYWNoZSAqLywgTlVMTCAvKiBtZXNoX2NhY2hlICovLAogICAgICAgICAgICAgZG9tX3N0YXRfdHJhY2tlcl8uZ2V0KCksICIiIC8qIGxhbmd1YWdlICovLAotICAgICAgICAgICAgYmFzZTo6a0FwcGxpY2F0aW9uU3RhdGVTdGFydGVkKSB7fQorICAgICAgICAgICAgYmFzZTo6a0FwcGxpY2F0aW9uU3RhdGVTdGFydGVkLAorICAgICAgICAgICAgTlVMTCAvKiBzeW5jaHJvbm91c19sb2FkZXJfaW50ZXJydXB0ICovKSB7fQogICB2b2lkIExvYWQoY29uc3QgR1VSTCYgdXJsKSB7CiAgICAgLy8gTG9hZCB0aGUgZG9jdW1lbnQgaW4gYSBuZXN0ZWQgbWVzc2FnZSBsb29wLgogICAgIGRvbTo6RG9jdW1lbnQ6Ok9wdGlvbnMgb3B0aW9ucyh1cmwpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC90ZXN0L2VtcHR5X2RvY3VtZW50LmggYi9zcmMvY29iYWx0L3Rlc3QvZW1wdHlfZG9jdW1lbnQuaAppbmRleCBiYjM2NjI2Li4wODgxN2RmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3Rlc3QvZW1wdHlfZG9jdW1lbnQuaAorKysgYi9zcmMvY29iYWx0L3Rlc3QvZW1wdHlfZG9jdW1lbnQuaApAQCAtMzEsMTAgKzMxLDEwIEBACiAgIEVtcHR5RG9jdW1lbnQoKQogICAgICAgOiBjc3NfcGFyc2VyXyhjc3NfcGFyc2VyOjpQYXJzZXI6OkNyZWF0ZSgpKSwKICAgICAgICAgZG9tX3N0YXRfdHJhY2tlcl8obmV3IGRvbTo6RG9tU3RhdFRyYWNrZXIoIkVtcHR5RG9jdW1lbnQiKSksCi0gICAgICAgIGh0bWxfZWxlbWVudF9jb250ZXh0XyhOVUxMLCBjc3NfcGFyc2VyXy5nZXQoKSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKyAgICAgICAgaHRtbF9lbGVtZW50X2NvbnRleHRfKE5VTEwsIE5VTEwsIGNzc19wYXJzZXJfLmdldCgpLCBOVUxMLCBOVUxMLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbV9zdGF0X3RyYWNrZXJfLmdldCgpLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OmtBcHBsaWNhdGlvblN0YXRlU3RhcnRlZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBkb21fc3RhdF90cmFja2VyXy5nZXQoKSwgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjprQXBwbGljYXRpb25TdGF0ZVN0YXJ0ZWQsIE5VTEwpLAogICAgICAgICBkb2N1bWVudF8obmV3IGRvbTo6RG9jdW1lbnQoJmh0bWxfZWxlbWVudF9jb250ZXh0XykpIHt9CiAKICAgZG9tOjpEb2N1bWVudCogZG9jdW1lbnQoKSB7IHJldHVybiBkb2N1bWVudF8uZ2V0KCk7IH0KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvdmVyc2lvbi5oIGIvc3JjL2NvYmFsdC92ZXJzaW9uLmgKaW5kZXggNzdhZDJjZC4uNDdiOWYyYyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC92ZXJzaW9uLmgKKysrIGIvc3JjL2NvYmFsdC92ZXJzaW9uLmgKQEAgLTE1LDYgKzE1LDYgQEAKICNkZWZpbmUgQ09CQUxUX1ZFUlNJT05fSF8KIAogLy8gQ29iYWx0IHJlbGVhc2UgbnVtYmVyLgotI2RlZmluZSBDT0JBTFRfVkVSU0lPTiAiMTYiCisjZGVmaW5lIENPQkFMVF9WRVJTSU9OICIxNyIKIAogI2VuZGlmICAvLyBDT0JBTFRfVkVSU0lPTl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvZ2V0X2VsZW1lbnRfdGV4dF90ZXN0LmNjIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvZ2V0X2VsZW1lbnRfdGV4dF90ZXN0LmNjCmluZGV4IGJiNTBiY2IuLjg4Y2E1M2IgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL2dldF9lbGVtZW50X3RleHRfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L3dlYmRyaXZlci9nZXRfZWxlbWVudF90ZXh0X3Rlc3QuY2MKQEAgLTQwLDEwICs0MCwxMCBAQAogICBHZXRFbGVtZW50VGV4dFRlc3QoKQogICAgICAgOiBjc3NfcGFyc2VyXyhjc3NfcGFyc2VyOjpQYXJzZXI6OkNyZWF0ZSgpKSwKICAgICAgICAgZG9tX3N0YXRfdHJhY2tlcl8obmV3IGRvbTo6RG9tU3RhdFRyYWNrZXIoIkdldEVsZW1lbnRUZXh0VGVzdCIpKSwKLSAgICAgICAgaHRtbF9lbGVtZW50X2NvbnRleHRfKE5VTEwsIGNzc19wYXJzZXJfLmdldCgpLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorICAgICAgICBodG1sX2VsZW1lbnRfY29udGV4dF8oTlVMTCwgTlVMTCwgY3NzX3BhcnNlcl8uZ2V0KCksIE5VTEwsIE5VTEwsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tX3N0YXRfdHJhY2tlcl8uZ2V0KCksICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6a0FwcGxpY2F0aW9uU3RhdGVTdGFydGVkKSB7fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgZG9tX3N0YXRfdHJhY2tlcl8uZ2V0KCksICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6a0FwcGxpY2F0aW9uU3RhdGVTdGFydGVkLCBOVUxMKSB7fQogCiAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CiAgICAgZG9tOjpEb2N1bWVudDo6T3B0aW9ucyBvcHRpb25zOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvc2VydmVyLmNjIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvc2VydmVyLmNjCmluZGV4IDc0ZWY3ZDEuLmIyZmU2NWYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3NlcnZlci5jYworKysgYi9zcmMvY29iYWx0L3dlYmRyaXZlci9zZXJ2ZXIuY2MKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlICJiYXNlL2JpbmQuaCIKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCiAjaW5jbHVkZSAiYmFzZS9qc29uL2pzb25fcmVhZGVyLmgiCiAjaW5jbHVkZSAiYmFzZS9qc29uL2pzb25fd3JpdGVyLmgiCiAjaW5jbHVkZSAiYmFzZS9zdHJpbmdfdXRpbC5oIgpAQCAtMjAwLDggKzIwMSw5IEBACiAKIHZvaWQgV2ViRHJpdmVyU2VydmVyOjpPbkh0dHBSZXF1ZXN0KGludCBjb25uZWN0aW9uX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV0OjpIdHRwU2VydmVyUmVxdWVzdEluZm8mIGluZm8pIHsKLSAgRENIRUNLKHRocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOworICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6d2ViZHJpdmVyIiwgIldlYkRyaXZlclNlcnZlcjo6T25IdHRwUmVxdWVzdCgpIik7CiAKKyAgRENIRUNLKHRocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOwogICBzdGQ6OnN0cmluZyBwYXRoID0gaW5mby5wYXRoOwogICBzaXplX3QgcXVlcnlfcG9zaXRpb24gPSBwYXRoLmZpbmQoIj8iKTsKICAgLy8gRGlzY2FyZCBhbnkgVVJMIHZhcmlhYmxlcyBmcm9tIHRoZSBwYXRoCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYmRyaXZlci93ZWJfZHJpdmVyX21vZHVsZS5jYyBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3dlYl9kcml2ZXJfbW9kdWxlLmNjCmluZGV4IGI0YzRjNjAuLjU1ZGE2ZTkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3dlYl9kcml2ZXJfbW9kdWxlLmNjCisrKyBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3dlYl9kcml2ZXJfbW9kdWxlLmNjCkBAIC0xOSw2ICsxOSw3IEBACiAKICNpbmNsdWRlICJiYXNlL2Jhc2U2NC5oIgogI2luY2x1ZGUgImJhc2UvYmluZC5oIgorI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKICNpbmNsdWRlICJiYXNlL2ZpbGVfdXRpbC5oIgogI2luY2x1ZGUgImJhc2UvdmFsdWVzLmgiCiAjaW5jbHVkZSAiY29iYWx0L3dlYmRyaXZlci9kaXNwYXRjaGVyLmgiCkBAIC0xNTAsNiArMTUxLDggQEAKIHZvaWQgT25QTkdFbmNvZGVDb21wbGV0ZShTY3JlZW5zaG90UmVzdWx0Q29udGV4dCogY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPGxvYWRlcjo6aW1hZ2U6OkVuY29kZWRTdGF0aWNJbWFnZT4mCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzZWRfaW1hZ2VfZGF0YSkgeworICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6V2ViRHJpdmVyIiwgIldlYkRyaXZlclNlcnZlcjo6b25QTkdFbmNvZGVDb21wbGV0ZSgpIik7CisKICAgRENIRUNLKGNvbnRleHQpOwogICBEQ0hFQ0soY29tcHJlc3NlZF9pbWFnZV9kYXRhLT5HZXRJbWFnZUZvcm1hdCgpID09CiAgICAgICAgICBsb2FkZXI6OmltYWdlOjpFbmNvZGVkU3RhdGljSW1hZ2U6OkltYWdlRm9ybWF0OjprUE5HKTsKQEAgLTU2Miw2ICs1NjUsNyBAQAogICAgIGNvbnN0IGJhc2U6OlZhbHVlKiBwYXJhbWV0ZXJzLAogICAgIGNvbnN0IFdlYkRyaXZlckRpc3BhdGNoZXI6OlBhdGhWYXJpYWJsZU1hcCogcGF0aF92YXJpYWJsZXMsCiAgICAgc2NvcGVkX3B0cjxXZWJEcml2ZXJEaXNwYXRjaGVyOjpDb21tYW5kUmVzdWx0SGFuZGxlcj4gcmVzdWx0X2hhbmRsZXIpIHsKKyAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OldlYkRyaXZlciIsICJXZWJEcml2ZXJNb2R1bGU6OlJlcXVlc3RTY3JlZW5zaG90KCkiKTsKICAgRENIRUNLKHRocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOwogCiAgIFNlc3Npb25Ecml2ZXIqIHNlc3Npb25fZHJpdmVyID0gTG9va1VwU2Vzc2lvbkRyaXZlck9yUmV0dXJuSW52YWxpZFJlc3BvbnNlKApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvd2ViZHJpdmVyLmd5cCBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3dlYmRyaXZlci5neXAKaW5kZXggNWQzNTY4MS4uZWI3MTY1YiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvd2ViZHJpdmVyLmd5cAorKysgYi9zcmMvY29iYWx0L3dlYmRyaXZlci93ZWJkcml2ZXIuZ3lwCkBAIC05NCw4ICs5NCw2IEBACiAgICAgICAnZGVwZW5kZW5jaWVzJzogWwogICAgICAgICAnPChERVBUSCkvYmFzZS9iYXNlLmd5cDpiYXNlJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9kb20vZG9tLmd5cDpkb20nLAotICAgICAgICAnPChERVBUSCkvY29iYWx0L2RvbS9kb20uZ3lwOmRvbV90ZXN0aW5nJywKLSAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9zcGVlY2gvc3BlZWNoLmd5cDpzcGVlY2gnLAogICAgICAgICAnPChERVBUSCkvbmV0L25ldC5neXA6aHR0cF9zZXJ2ZXInLAogICAgICAgICAnPChERVBUSCkvdGhpcmRfcGFydHkvaWN1L2ljdS5neXA6aWN1dWMnLAogICAgICAgXSwKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2Vic29ja2V0L3dlYnNvY2tldC5neXAgYi9zcmMvY29iYWx0L3dlYnNvY2tldC93ZWJzb2NrZXQuZ3lwCmluZGV4IGRmYzI2ZTYuLmE1YjEzNDcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvd2Vic29ja2V0L3dlYnNvY2tldC5neXAKKysrIGIvc3JjL2NvYmFsdC93ZWJzb2NrZXQvd2Vic29ja2V0Lmd5cApAQCAtNDEsNyArNDEsNiBAQAogICAgICAgICAnPChERVBUSCkvY29iYWx0L2Jhc2UvYmFzZS5neXA6YmFzZScsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvYnJvd3Nlci9icm93c2VyX2JpbmRpbmdzX2dlbi5neXA6Z2VuZXJhdGVkX3R5cGVzJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9kb20vZG9tLmd5cDpkb20nLAotICAgICAgICAnPChERVBUSCkvY29iYWx0L3NwZWVjaC9zcGVlY2guZ3lwOnNwZWVjaCcsCiAgICAgICAgICc8KERFUFRIKS9nb29nbGV1cmwvZ29vZ2xldXJsLmd5cDpnb29nbGV1cmwnLAogICAgICAgXSwKICAgICB9LApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC94aHIveGhyLmd5cCBiL3NyYy9jb2JhbHQveGhyL3hoci5neXAKaW5kZXggNzMwNTgwMi4uM2I2NmQ5OCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC94aHIveGhyLmd5cAorKysgYi9zcmMvY29iYWx0L3hoci94aHIuZ3lwCkBAIC0zMCw3ICszMCw2IEBACiAgICAgICBdLAogICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9kb20vZG9tLmd5cDpkb20nLAotICAgICAgICAnPChERVBUSCkvY29iYWx0L3NwZWVjaC9zcGVlY2guZ3lwOnNwZWVjaCcsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvZG9tX3BhcnNlci9kb21fcGFyc2VyLmd5cDpkb21fcGFyc2VyJywKICAgICAgIF0sCiAgICAgICAnY29uZGl0aW9ucyc6IFsKQEAgLTYyLDcgKzYxLDYgQEAKICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvYmFzZS9iYXNlLmd5cDpiYXNlJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9kb20vZG9tLmd5cDpkb20nLAotICAgICAgICAnPChERVBUSCkvY29iYWx0L3NwZWVjaC9zcGVlY2guZ3lwOnNwZWVjaCcsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvdGVzdC90ZXN0Lmd5cDpydW5fYWxsX3VuaXR0ZXN0cycsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2dtb2NrLmd5cDpnbW9jaycsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2d0ZXN0Lmd5cDpndGVzdCcsCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2F0b21pYy5oIGIvc3JjL3N0YXJib2FyZC9hdG9taWMuaAppbmRleCA4MGMzOTFmLi4wOGExYWFmIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2F0b21pYy5oCisrKyBiL3NyYy9zdGFyYm9hcmQvYXRvbWljLmgKQEAgLTMwLDYgKzMwLDkgQEAKIGV4dGVybiAiQyIgewogI2VuZGlmCiAKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9JTlRST0RVQ0VfQVRPTUlDOF9WRVJTSU9OCit0eXBlZGVmIGludDhfdCBTYkF0b21pYzg7CisjZW5kaWYKIHR5cGVkZWYgaW50MzJfdCBTYkF0b21pYzMyOwogCiAvLyBBdG9taWNhbGx5IGV4ZWN1dGU6CkBAIC04NSw2ICs4OCwxNSBAQAogc3RhdGljIFNiQXRvbWljMzIgU2JBdG9taWNBY3F1aXJlX0xvYWQodm9sYXRpbGUgY29uc3QgU2JBdG9taWMzMiogcHRyKTsKIHN0YXRpYyBTYkF0b21pYzMyIFNiQXRvbWljUmVsZWFzZV9Mb2FkKHZvbGF0aWxlIGNvbnN0IFNiQXRvbWljMzIqIHB0cik7CiAKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9JTlRST0RVQ0VfQVRPTUlDOF9WRVJTSU9OCisvLyBPdmVybG9hZGVkIGZ1bmN0aW9ucyBmb3IgQXRvbWljOC4KK3N0YXRpYyBTYkF0b21pYzggU2JBdG9taWNSZWxlYXNlX0NvbXBhcmVBbmRTd2FwOCh2b2xhdGlsZSBTYkF0b21pYzgqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkF0b21pYzggb2xkX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiQXRvbWljOCBuZXdfdmFsdWUpOworc3RhdGljIHZvaWQgU2JBdG9taWNOb0JhcnJpZXJfU3RvcmU4KHZvbGF0aWxlIFNiQXRvbWljOCogcHRyLCBTYkF0b21pYzggdmFsdWUpOworc3RhdGljIFNiQXRvbWljOCBTYkF0b21pY05vQmFycmllcl9Mb2FkOCh2b2xhdGlsZSBjb25zdCBTYkF0b21pYzgqIHB0cik7CisjZW5kaWYKKwogLy8gNjQtYml0IGF0b21pYyBvcGVyYXRpb25zIChvbmx5IGF2YWlsYWJsZSBvbiA2NC1iaXQgcHJvY2Vzc29ycykuCiAjaWYgU0JfSEFTKDY0X0JJVF9BVE9NSUNTKQogdHlwZWRlZiBpbnQ2NF90IFNiQXRvbWljNjQ7CkBAIC0yNDksNiArMjYxLDIyIEBACiBuYW1lc3BhY2Ugc3RhcmJvYXJkIHsKIG5hbWVzcGFjZSBhdG9taWMgewogCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfSU5UUk9EVUNFX0FUT01JQzhfVkVSU0lPTgoraW5saW5lIFNiQXRvbWljOCBSZWxlYXNlX0NvbXBhcmVBbmRTd2FwKHZvbGF0aWxlIFNiQXRvbWljOCogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiQXRvbWljOCBvbGRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JBdG9taWM4IG5ld192YWx1ZSkgeworICByZXR1cm4gU2JBdG9taWNSZWxlYXNlX0NvbXBhcmVBbmRTd2FwOChwdHIsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlKTsKK30KKworaW5saW5lIHZvaWQgTm9CYXJyaWVyX1N0b3JlKHZvbGF0aWxlIFNiQXRvbWljOCogcHRyLCBTYkF0b21pYzggdmFsdWUpIHsKKyAgU2JBdG9taWNOb0JhcnJpZXJfU3RvcmU4KHB0ciwgdmFsdWUpOworfQorCitpbmxpbmUgU2JBdG9taWM4IE5vQmFycmllcl9Mb2FkKHZvbGF0aWxlIGNvbnN0IFNiQXRvbWljOCogcHRyKSB7CisgIHJldHVybiBTYkF0b21pY05vQmFycmllcl9Mb2FkOChwdHIpOworfQorI2VuZGlmCisKIGlubGluZSBTYkF0b21pYzMyIE5vQmFycmllcl9Db21wYXJlQW5kU3dhcCh2b2xhdGlsZSBTYkF0b21pYzMyKiBwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JBdG9taWMzMiBvbGRfdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JBdG9taWMzMiBuZXdfdmFsdWUpIHsKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvYnVpbGQvYmFzZV9jb25maWd1cmF0aW9uLmd5cGkgYi9zcmMvc3RhcmJvYXJkL2J1aWxkL2Jhc2VfY29uZmlndXJhdGlvbi5neXBpCmluZGV4IDg5NDMxZjIuLjBhNzcwMDkgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvYnVpbGQvYmFzZV9jb25maWd1cmF0aW9uLmd5cGkKKysrIGIvc3JjL3N0YXJib2FyZC9idWlsZC9iYXNlX2NvbmZpZ3VyYXRpb24uZ3lwaQpAQCAtMTA5LDYgKzEwOSw5IEBACiAgICAgIyBVc2VkIHRvIHBpY2sgYSBwcm9wZXIgbWVkaWEgcGxhdGZvcm0uCiAgICAgJ3NiX21lZGlhX3BsYXRmb3JtJSc6ICdzdGFyYm9hcmQnLAogCisgICAgIyBVc2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIHBsYXllciBpcyBmaWx0ZXIgYmFzZWQuCisgICAgJ3NiX2ZpbHRlcl9iYXNlZF9wbGF5ZXIlJzogMSwKKwogICAgICMgQ29tcGlsZXIgY29uZmlndXJhdGlvbi4KIAogICAgICMgVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgYXJlIHVzZWQgdG8gc3BlY2lmeSBjb21waWxlciBhbmQgbGlua2VyCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2J1aWxkL2xpc3RfZG1wX2ZpbGVzLnB5IGIvc3JjL3N0YXJib2FyZC9idWlsZC9saXN0X2RtcF9maWxlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTdjZGU4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9idWlsZC9saXN0X2RtcF9maWxlcy5weQpAQCAtMCwwICsxLDM5IEBACisjIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisiIiJMaXN0IGRtcCBmaWxlcyBjb3JyZXNwb25kaW5nIHRvIGRtcC5zaGExIGZpbGVzIGZvdW5kIGluIGEgZGlyZWN0b3J5LgorCitTaW5jZSB0aGUgb3V0cHV0IG9mIHRoaXMgc2NyaXB0IGlzIGludGVuZGVkIHRvIGJlIHVzZSBieSBHWVAsIGFsbCByZXN1bHRpbmcKK3BhdGhzIGFyZSB1c2luZyBVbml4LXN0eWxlIGZvcndhcmQgc2xhc2hlcy4KKyIiIgorCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKKworaW1wb3J0IF9lbnYgICMgcHlsaW50OiBkaXNhYmxlPXVudXNlZC1pbXBvcnQKK2Zyb20gc3RhcmJvYXJkLnRvb2xzIGltcG9ydCBwYXRocworCisKK2RlZiBtYWluKGFyZ3YpOgorICBkbXBfZmlsZXMgPSBbXQorICBkaXJlY3RvcnlfZnJvbV9yZXBvX3Jvb3QgPSBhcmd2WzFdCisgIGRtcF9zaGExX2RpciA9IG9zLnBhdGguam9pbihwYXRocy5SRVBPU0lUT1JZX1JPT1QsIGRpcmVjdG9yeV9mcm9tX3JlcG9fcm9vdCkKKyAgZm9yIGZpbGVuYW1lIGluIG9zLmxpc3RkaXIoZG1wX3NoYTFfZGlyKToKKyAgICBpZiBmaWxlbmFtZVstODpdID09ICdkbXAuc2hhMSc6CisgICAgICBkbXBfZmlsZXMuYXBwZW5kKChvcy5wYXRoLmpvaW4oZG1wX3NoYTFfZGlyLCBmaWxlbmFtZSlbOi01XSkucmVwbGFjZSgKKyAgICAgICAgICAnXFwnLCAnLycpKQorICBwcmludCAnICcuam9pbihkbXBfZmlsZXMpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgc3lzLmV4aXQobWFpbihzeXMuYXJndikpCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vZXp0aW1lX3BvZW0uaCBiL3NyYy9zdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9lenRpbWVfcG9lbS5oCmluZGV4IDMxZDMwMWEuLmM2NmE4ZmMgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9lenRpbWVfcG9lbS5oCisrKyBiL3NyYy9zdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9lenRpbWVfcG9lbS5oCkBAIC0zMywxMiArMzMsMTkgQEAKICN1bmRlZiB0aW1ldmFsCiAjZGVmaW5lIHRpbWV2YWwgRXpUaW1lVmFsdWUKIAorI3VuZGVmIGdldHRpbWVvZmRheQogI2RlZmluZSBnZXR0aW1lb2ZkYXkoYSwgYikgRXpUaW1lVmFsdWVHZXROb3coYSwgYikKKyN1bmRlZiBnbXRpbWVfcgogI2RlZmluZSBnbXRpbWVfcihhLCBiKSBFelRpbWVURXhwbG9kZVVUQyhhLCBiKQorI3VuZGVmIGxvY2FsdGltZV9yCiAjZGVmaW5lIGxvY2FsdGltZV9yKGEsIGIpIEV6VGltZVRFeHBsb2RlTG9jYWwoYSwgYikKKyN1bmRlZiBta3RpbWUKICNkZWZpbmUgbWt0aW1lKHgpIEV6VGltZVRJbXBsb2RlTG9jYWwoeCkKKyN1bmRlZiB0aW1lCiAjZGVmaW5lIHRpbWUoeCkgRXpUaW1lVEdldE5vdyh4KQorI3VuZGVmIHRpbWVnbQogI2RlZmluZSB0aW1lZ20oeCkgRXpUaW1lVEltcGxvZGVVVEMoeCkKKyN1bmRlZiB0aW1lbG9jYWwKICNkZWZpbmUgdGltZWxvY2FsKHgpIEV6VGltZVRJbXBsb2RlTG9jYWwoeCkKIAogI2VuZGlmICAvLyBQT0VNX05PX0VNVUxBVElPTgpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL21hdGhfcG9lbS5oIGIvc3JjL3N0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL21hdGhfcG9lbS5oCmluZGV4IDZhMTc3YmYuLjBkYmY5OTYgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9tYXRoX3BvZW0uaAorKysgYi9zcmMvc3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vbWF0aF9wb2VtLmgKQEAgLTI3LDcgKzI3LDcgQEAKIAogLy8gVGFrZXMgZmxvb3Igb2YgYSBmbG9hdCB8ZnwuICBNZWFudCB0byBiZSBhIGRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yIHxmbG9vcmZ8CiBzdGF0aWMgU0JfQ19JTkxJTkUgZmxvYXQgUG9lbVNpbmdsZUZsb29yKGNvbnN0IGZsb2F0IGYpIHsKLSAgZG91YmxlIGQoZik7CisgIGRvdWJsZSBkID0gKGRvdWJsZSlmOwogICByZXR1cm4gU2JEb3VibGVGbG9vcihkKTsKIH0KIApAQCAtMzgsMjIgKzM4LDM4IEBACiAjaWYgIWRlZmluZWQoUE9FTV9OT19FTVVMQVRJT04pCiAKICNpbmNsdWRlIDxtYXRoLmg+CisjdW5kZWYgZmFicwogI2RlZmluZSBmYWJzKHgpIFNiRG91YmxlQWJzb2x1dGUoeCkKKyN1bmRlZiBmbG9vcgogI2RlZmluZSBmbG9vcih4KSBTYkRvdWJsZUZsb29yKHgpCisjdW5kZWYgZmxvb3JmCiAjZGVmaW5lIGZsb29yZih4KSBQb2VtU2luZ2xlRmxvb3IoeCkKKyN1bmRlZiBwb3cKICNkZWZpbmUgcG93KHgsIHkpIFNiRG91YmxlRXhwb25lbnQoeCwgeSkKIAorI3VuZGVmIGNlaWwKICNkZWZpbmUgY2VpbCh4KSBjZWlsKHgpCisjdW5kZWYgZm1vZAogI2RlZmluZSBmbW9kKHgsIHkpIGZtb2QoeCwgeSkKKyN1bmRlZiBtb2RmCiAjZGVmaW5lIG1vZGYoeCwgeSkgbW9kZih4LCB5KQorI3VuZGVmIGxvZwogI2RlZmluZSBsb2coeCkgbG9nKHgpCisjdW5kZWYgc3FydAogI2RlZmluZSBzcXJ0KHgpIHNxcnQoeCkKKyN1bmRlZiBzaW4KICNkZWZpbmUgc2luKHgpIHNpbih4KQorI3VuZGVmIGNvcwogI2RlZmluZSBjb3MoeCkgY29zKHgpCisjdW5kZWYgdGFuCiAjZGVmaW5lIHRhbih4KSB0YW4oeCkKKyN1bmRlZiBhdGFuCiAjZGVmaW5lIGF0YW4oeCkgYXRhbih4KQorI3VuZGVmIGF0YW4yCiAjZGVmaW5lIGF0YW4yKHgsIHkpIGF0YW4yKHgsIHkpCisjdW5kZWYgYXNpbgogI2RlZmluZSBhc2luKHgpIGFzaW4oeCkKKyN1bmRlZiBhY29zCiAjZGVmaW5lIGFjb3MoeCkgYWNvcyh4KQogI2VuZGlmICAvLyBQT0VNX05PX0VNVUxBVElPTgogCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RkaW9fcG9lbS5oIGIvc3JjL3N0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0ZGlvX3BvZW0uaAppbmRleCBlYWIzZjA1Li4zYjM1MzBmIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RkaW9fcG9lbS5oCisrKyBiL3NyYy9zdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdGRpb19wb2VtLmgKQEAgLTI5LDE0ICsyOSwyMyBAQAogLy8gdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgY2FuIGhhdmUgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cwogLy8gYW5kLCBvdXQgb2YgY29tcGF0aWJpbGl0eSBjb25jZXJucywgd2UgY2hvc2UgdG8gbm90IHVzZQogLy8gX19WQV9BUkdTX18gZnVuY3Rpb25hbGl0eS4KKyN1bmRlZiB2c25wcmludGYKICNkZWZpbmUgdnNucHJpbnRmIFNiU3RyaW5nRm9ybWF0CisjdW5kZWYgc25wcmludGYKICNkZWZpbmUgc25wcmludGYgU2JTdHJpbmdGb3JtYXRGCisjdW5kZWYgc3ByaW50ZgogI2RlZmluZSBzcHJpbnRmIFNiU3RyaW5nRm9ybWF0VW5zYWZlRgorI3VuZGVmIHZzc2NhbmYKICNkZWZpbmUgdnNzY2FuZiBTYlN0cmluZ1NjYW4KKyN1bmRlZiBzc2NhbmYKICNkZWZpbmUgc3NjYW5mIFNiU3RyaW5nU2NhbkYKKyN1bmRlZiBtYWxsb2MKICNkZWZpbmUgbWFsbG9jKHN6KSBTYk1lbW9yeUFsbG9jYXRlKHN6KQorI3VuZGVmIGNhbGxvYwogI2RlZmluZSBjYWxsb2MoYywgcykgU2JNZW1vcnlDYWxsb2MoYywgcykKKyN1bmRlZiBmcmVlCiAjZGVmaW5lIGZyZWUoYSkgU2JNZW1vcnlEZWFsbG9jYXRlKGEpCisjdW5kZWYgcmVhbGxvYwogI2RlZmluZSByZWFsbG9jKG0sIHN6KSBTYk1lbW9yeVJlYWxsb2NhdGUobSwgc3opCiAKICNlbmRpZiAgLy8gUE9FTV9OT19FTVVMQVRJT04KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdGRsaWJfcG9lbS5oIGIvc3JjL3N0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0ZGxpYl9wb2VtLmgKaW5kZXggZDQwN2QxNy4uYzA5NmFhMCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0ZGxpYl9wb2VtLmgKKysrIGIvc3JjL3N0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0ZGxpYl9wb2VtLmgKQEAgLTQ0LDE2ICs0NCwyMyBAQAogI2VuZGlmCiAKIC8vIG51bWJlciBjb252ZXJzaW9uIGZ1bmN0aW9ucworI3VuZGVmIHN0cnRvbAogI2RlZmluZSBzdHJ0b2wocywgbywgYikgU2JTdHJpbmdQYXJzZVNpZ25lZEludGVnZXIocywgbywgYikKKyN1bmRlZiBhdG9pCiAjZGVmaW5lIGF0b2kodikgU2JTdHJpbmdBVG9JKHYpCisjdW5kZWYgYXRvbAogI2RlZmluZSBhdG9sKHYpIFNiU3RyaW5nQVRvTCh2KQotI2RlZmluZSBzdHJ0b2wocywgbywgYikgU2JTdHJpbmdQYXJzZVNpZ25lZEludGVnZXIocywgbywgYikKKyN1bmRlZiBzdHJ0b3VsCiAjZGVmaW5lIHN0cnRvdWwocywgbywgYikgU2JTdHJpbmdQYXJzZVVuc2lnbmVkSW50ZWdlcihzLCBvLCBiKQorI3VuZGVmIHN0cnRvdWxsCiAjZGVmaW5lIHN0cnRvdWxsKHMsIG8sIGIpIFNiU3RyaW5nUGFyc2VVSW50NjQocywgbywgYikKKyN1bmRlZiBzdHJ0b2QKICNkZWZpbmUgc3RydG9kKHMsIG8pIFNiU3RyaW5nUGFyc2VEb3VibGUocywgbykKIAorI3VuZGVmIHFzb3J0CiAjZGVmaW5lIHFzb3J0KGIsIGVjLCBldywgYykgU2JTeXN0ZW1Tb3J0KGIsIGVjLCBldywgYyk7CiAKKyN1bmRlZiBhYnMKICNkZWZpbmUgYWJzKHgpIFBvZW1BYnMoeCkKIAogI2VuZGlmICAvLyBQT0VNX05PX0VNVUxBVElPTgpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0cmluZ19wb2VtLmggYi9zcmMvc3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RyaW5nX3BvZW0uaAppbmRleCBmNWYzNDM0Li4zZWIwN2RjIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RyaW5nX3BvZW0uaAorKysgYi9zcmMvc3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RyaW5nX3BvZW0uaApAQCAtMTYwLDIyICsxNjAsMzggQEAKIAogI2lmICFkZWZpbmVkKFBPRU1fTk9fRU1VTEFUSU9OKQogCisjdW5kZWYgc3RybGVuCiAjZGVmaW5lIHN0cmxlbihzKSBTYlN0cmluZ0dldExlbmd0aChzKQorI3VuZGVmIHN0cmNweQogI2RlZmluZSBzdHJjcHkobywgcykgU2JTdHJpbmdDb3B5VW5zYWZlKG8sIHMpCisjdW5kZWYgc3RybmNweQogI2RlZmluZSBzdHJuY3B5KG8sIHMsIGRzKSBQb2VtU3RyaW5nQ29weU4obywgcywgZHMpCisjdW5kZWYgc3RyY2F0CiAjZGVmaW5lIHN0cmNhdChvLCBzKSBQb2VtU3RyaW5nQ29uY2F0VW5zYWZlKG8sIHMpCisjdW5kZWYgc3RybmNhdAogI2RlZmluZSBzdHJuY2F0KG8sIHMsIGRzKSBQb2VtU3RyaW5nQ29uY2F0KG8sIHMsIGRzKQorI3VuZGVmIHN0cmR1cAogI2RlZmluZSBzdHJkdXAocykgU2JTdHJpbmdEdXBsaWNhdGUocykKKyN1bmRlZiBzdHJjaHIKICNkZWZpbmUgc3RyY2hyKHMsIGMpIFBvZW1GaW5kQ2hhcmFjdGVySW5TdHJpbmcocywgYykKKyN1bmRlZiBzdHJyY2hyCiAjZGVmaW5lIHN0cnJjaHIocywgYykgUG9lbUZpbmRMYXN0Q2hhcmFjdGVySW5TdHJpbmcocywgYykKKyN1bmRlZiBzdHJzdHIKICNkZWZpbmUgc3Ryc3RyKHMsIGMpIFNiU3RyaW5nRmluZFN0cmluZyhzLCBjKQorI3VuZGVmIHN0cm5jbXAKICNkZWZpbmUgc3RybmNtcChzMSwgczIsIGMpIFNiU3RyaW5nQ29tcGFyZShzMSwgczIsIGMpCisjdW5kZWYgc3RyY21wCiAjZGVmaW5lIHN0cmNtcChzMSwgczIpIFNiU3RyaW5nQ29tcGFyZUFsbChzMSwgczIpCiAKKyN1bmRlZiBtZW1jaHIKICNkZWZpbmUgbWVtY2hyKHMsIGMsIG4pIFNiTWVtb3J5RmluZEJ5dGUocywgYywgbikKKyN1bmRlZiBtZW1zZXQKICNkZWZpbmUgbWVtc2V0KHMsIGMsIG4pIFNiTWVtb3J5U2V0KHMsIGMsIG4pCisjdW5kZWYgbWVtY3B5CiAjZGVmaW5lIG1lbWNweShkLCBzLCBjKSBTYk1lbW9yeUNvcHkoZCwgcywgYykKKyN1bmRlZiBtZW1jbXAKICNkZWZpbmUgbWVtY21wKHMxLCBzMiwgbikgU2JNZW1vcnlDb21wYXJlKHMxLCBzMiwgbikKKyN1bmRlZiBtZW1tb3ZlCiAjZGVmaW5lIG1lbW1vdmUoZCwgcywgbikgU2JNZW1vcnlNb3ZlKGQsIHMsIG4pCiAKICNlbmRpZiAgLy8gUE9FTV9OT19FTVVMQVRJT04KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdzX3BvZW0uaCBiL3NyYy9zdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdzX3BvZW0uaAppbmRleCA4Zjk4YTA2Li5iM2RjZDhjIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RyaW5nc19wb2VtLmgKKysrIGIvc3JjL3N0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0cmluZ3NfcG9lbS5oCkBAIC0yMyw3ICsyMyw5IEBACiAKICNpbmNsdWRlICJzdGFyYm9hcmQvc3RyaW5nLmgiCiAKKyN1bmRlZiBzdHJjYXNlY21wCiAjZGVmaW5lIHN0cmNhc2VjbXAoczEsIHMyKSBTYlN0cmluZ0NvbXBhcmVOb0Nhc2UoczEsIHMyKQorI3VuZGVmIHN0cm5jYXNlY21wCiAjZGVmaW5lIHN0cm5jYXNlY21wKHMxLCBzMikgU2JTdHJpbmdDb21wYXJlTm9DYXNlTihzMSwgczIpCiAKICNlbmRpZiAgLy8gUE9FTV9OT19FTVVMQVRJT04KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJubGVuX3BvZW0uaCBiL3NyYy9zdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJubGVuX3BvZW0uaAppbmRleCBmYjJkNjc0Li5kMjQxM2MzIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3Rybmxlbl9wb2VtLmgKKysrIGIvc3JjL3N0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0cm5sZW5fcG9lbS5oCkBAIC0yOCw2ICsyOCw3IEBACiAgIHJldHVybiBpOwogfQogCisjdW5kZWYgc3RybmxlbgogI2RlZmluZSBzdHJubGVuKHMsIG1heGxlbikgU3RyaW5nR2V0TGVuZ3RoRml4ZWQocywgbWF4bGVuKQogCiAjZW5kaWYgIC8vIFNUQVJCT0FSRF9DTElFTlRfUE9SVElOR19QT0VNX1NUUk5MRU5fUE9FTV9IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3djaGFyX3BvZW0uaCBiL3NyYy9zdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS93Y2hhcl9wb2VtLmgKaW5kZXggNjhhZjczYy4uMThlYzU5NyAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3djaGFyX3BvZW0uaAorKysgYi9zcmMvc3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vd2NoYXJfcG9lbS5oCkBAIC0yMyw3ICsyMyw5IEBACiAKICNpbmNsdWRlICJzdGFyYm9hcmQvc3RyaW5nLmgiCiAKKyN1bmRlZiB2c3dwcmludGYKICNkZWZpbmUgdnN3cHJpbnRmIFNiU3RyaW5nRm9ybWF0V2lkZQorI3VuZGVmIHdjc25jbXAKICNkZWZpbmUgd2NzbmNtcChzMSwgczIsIGMpIFNiU3RyaW5nQ29tcGFyZVdpZGUoczEsIHMyLCBjKQogCiAjZW5kaWYgIC8vIFBPRU1fTk9fRU1VTEFUSU9OCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2NvbmZpZ3VyYXRpb24uaCBiL3NyYy9zdGFyYm9hcmQvY29uZmlndXJhdGlvbi5oCmluZGV4IDZiZDcwZjMuLjRkY2IwZmYgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvY29uZmlndXJhdGlvbi5oCisrKyBiL3NyYy9zdGFyYm9hcmQvY29uZmlndXJhdGlvbi5oCkBAIC02OCw2ICs2OCw5IEBACiAvLyAgIC8vICAgZXhwb3NlcyBmdW5jdGlvbmFsaXR5IGZvciBteSBuZXcgZmVhdHVyZS4KIC8vICAgI2RlZmluZSBTQl9NWV9FWFBFUklNRU5UQUxfRkVBVFVSRV9WRVJTSU9OIFNCX0VYUEVSSU1FTlRBTF9BUElfVkVSU0lPTgogCisvLyBBUEkgdmVyc2lvbiB3aGVyZSBjb21waWxpbmcgcGxheWVyX2ZpbHRlcl90ZXN0cyBpcyByZXF1aXJlZC4KKyNkZWZpbmUgU0JfUExBWUVSX0ZJTFRFUl9URVNUU19SRVFVSVJFRF9BUElfVkVSU0lPTiBTQl9FWFBFUklNRU5UQUxfQVBJX1ZFUlNJT04KKwogLy8gQVBJIHZlcnNpb24gd2hlcmUgU2JNZWRpYVRpbWUgaXMgZGVwcmVjYXRlZCAoZm9yIFNiVGltZSkuCiAjZGVmaW5lIFNCX0RFUFJFQ0FURV9TQl9NRURJQV9USU1FX0FQSV9WRVJTSU9OIFNCX0VYUEVSSU1FTlRBTF9BUElfVkVSU0lPTgogCkBAIC04MCw2ICs4Myw5IEBACiAvLyBNaW5pbXVtIEFQSSB2ZXJzaW9uIHdoZXJlIHN1cHBvcnRpbmcgYXVkaW9sZXNzIHZpZGVvIHBsYXliYWNrIGlzIHJlcXVpcmVkLgogI2RlZmluZSBTQl9BVURJT0xFU1NfVklERU9fQVBJX1ZFUlNJT04gU0JfRVhQRVJJTUVOVEFMX0FQSV9WRVJTSU9OCiAKKy8vIE1pbmltdW0gQVBJIHZlcnNpb24gd2hlcmUgc3VwcG9ydGluZyBhdWRpbyBvbmx5IHZpZGVvIHBsYXliYWNrIGlzIHJlcXVpcmVkLgorI2RlZmluZSBTQl9BVURJT19PTkxZX1ZJREVPX0FQSV9WRVJTSU9OIFNCX0VYUEVSSU1FTlRBTF9BUElfVkVSU0lPTgorCiAvLyBNaW5pbXVtIEFQSSB2ZXJzaW9uIHdoZXJlIGNhbGxpbmcgU2JQbGF5ZXJDcmVhdGUgbXV0aXBsZSB0aW1lcyAod2l0aG91dAogLy8gY2FsbGluZyBTYlBsYXllckRlc3Ryb3kgaW4gYmV0d2VlbikgbXVzdCBub3QgY3Jhc2gsIGFuZCBsaWtld2lzZSBjYWxsaW5nCiAvLyBTYkF1ZGlvU2lua0NyZWF0ZSBtdWx0aXBsZSB0aW1lcyAod2l0aG91dCBjYWxsaW5nIFNiQXVkaW9TaW5rRGVzdHJveSBpbgpAQCAtODgsMTEgKzk0LDIxIEBACiAvLyBrU2JBdWRpb25TaW5rSW52YWxpZCBpZiBhZGRpdGlvbmFsIGF1ZGlvIHNpbmtzIGFyZSBub3Qgc3VwcG9ydGVkLgogI2RlZmluZSBTQl9NVUxUSV9QTEFZRVJfQVBJX1ZFUlNJT04gU0JfRVhQRVJJTUVOVEFMX0FQSV9WRVJTSU9OCiAKLS8vIEFQSSB2ZXJzaW9uIHdoZXJlIERSTSBzZXNzaW9uIGNsb3NlZCBjYWxsYmFjayBpcyByZXF1aXJlZC4KLS8vICAgQWRkIGEgY2FsbGJhY2sgdG8gU2JEcm1DcmVhdGVTeXN0ZW0gdGhhdCBhbGxvd3MgYSBEUk0gc3lzdGVtIHRvCi0vLyAgIHNpZ25hbCB0aGF0IGEgRFJNIHNlc3Npb24gaGFzIGNsb3NlZCBmcm9tIHRoZSBTdGFyYm9hcmQgbGF5ZXIuCi0vLyAgIFByZXZpb3VzbHksIERSTSBzZXNzaW9ucyBjb3VsZCBvbmx5IGJlIGNsb3NlZCBmcm9tIHRoZSBhcHBsaWNhdGlvbiBsYXllci4KLSNkZWZpbmUgU0JfRFJNX1NFU1NJT05fQ0xPU0VEX0FQSV9WRVJTSU9OIFNCX0VYUEVSSU1FTlRBTF9BUElfVkVSU0lPTgorLy8gQVBJIHZlcnNpb24gd2hlcmUgcGFzc2luZyBOVUxMIGNhbGxiYWNrcyB0byBTYlBsYXllckNyZWF0ZSBvcgorLy8gU2JQbGF5ZXJDcmVhdGVXaXRoVXJsIG9yIFNiRHJtQ3JlYXRlU3lzdGVtIG11c3QgcmVzdWx0IGluIGludmFsaWQgcmV0dXJuCisvLyAofGtTYlBsYXllckludmFsaWR8IG9yIHxrU2JEcm1TeXN0ZW1JbnZhbGlkfCBhcHByb3ByaWF0ZWx5KS4KKyNkZWZpbmUgU0JfTlVMTF9DQUxMQkFDS1NfSU5WQUxJRF9SRVRVUk5fQVBJX1ZFUlNJT04gU0JfRVhQRVJJTUVOVEFMX0FQSV9WRVJTSU9OCisKKy8vIEFQSSB2ZXJzaW9uIHdoZXJlIHRoZSBmb2xsb3dpbmcgRFJNIHJlZmluZW1lbnRzIGFyZSBhdmFpbGFibGUuCisvLyAgIDEuIEFkZCBhIGNhbGxiYWNrIHRvIFNiRHJtQ3JlYXRlU3lzdGVtIHRoYXQgYWxsb3dzIGEgRFJNIHN5c3RlbSB0bworLy8gICAgICBzaWduYWwgdGhhdCBhIERSTSBzZXNzaW9uIGhhcyBjbG9zZWQgZnJvbSB0aGUgU3RhcmJvYXJkIGxheWVyLgorLy8gICAgICBQcmV2aW91c2x5LCBEUk0gc2Vzc2lvbnMgY291bGQgb25seSBiZSBjbG9zZWQgZnJvbSB0aGUgYXBwbGljYXRpb24KKy8vICAgICAgbGF5ZXIuCisvLyAgIDIuIEFsbG93IGNhbGxpbmcgfFNiRHJtU2Vzc2lvblVwZGF0ZVJlcXVlc3RGdW5jfCBhbmQKKy8vICAgICAgfFNiRHJtU2Vzc2lvblVwZGF0ZWRGdW5jfCB3aXRoIGV4dHJhIHN0YXR1cyBhbmQgb3B0aW9uYWwgZXJyb3IgbWVzc2FnZS4KKy8vICAgMy4gQWRkIHJlcXVlc3QgdHlwZSBwYXJhbWV0ZXIgdG8gfFNiRHJtU2Vzc2lvblVwZGF0ZVJlcXVlc3RGdW5jfCB0byBzdXBwb3J0CisvLyAgICAgIGluZGl2aWR1YWxpemF0aW9uLCBsaWNlbnNlIHJlbmV3YWwsIGFuZCBsaWNlbnNlIHJlbGVhc2UuCisjZGVmaW5lIFNCX0RSTV9SRUZJTkVNRU5UX0FQSV9WRVJTSU9OIFNCX0VYUEVSSU1FTlRBTF9BUElfVkVSU0lPTgogCiAvLyBBUEkgdmVyc2lvbiB3aGVyZSBrU2JTeXN0ZW1QYXRoU291cmNlRGlyZWN0b3J5IGlzIHJlbW92ZWQuCiAvLyAgIFRlc3QgY29kZSBsb29raW5nIGZvciBpdHMgc3RhdGljIGlucHV0IGZpbGVzIHNob3VsZCBpbnN0ZWFkIHVzZSB0aGUgYHRlc3RgCkBAIC0xMzQsNiArMTUwLDIwIEBACiAvLyAgIFBsZWFzZSBzZWUgdGhlIGNvbW1lbnQgaW4gYXVkaW9fc2luay5oIGZvciBtb3JlIGRldGFpbHMuCiAjZGVmaW5lIFNCX0FTWU5DX0FVRElPX0ZSQU1FU19SRVBPUlRJTkdfQVBJX1ZFUlNJT04gU0JfRVhQRVJJTUVOVEFMX0FQSV9WRVJTSU9OCiAKKy8vIEFQSSB2ZXJzaW9uIHdoZXJlIFNiQXRvbWljOCB0eXBlIGFuZCBtZW1vcnkgYWNjZXNzIGZ1bmN0aW9ucyBmb3IgaXQgYXJlCisvLyAgIGludHJvZHVjZWQuIFRoZXkgYXJlIHJlcXVpcmVkIHRvIGJlIGltcGxlbWVudGVkIGlmIGEgcGxhdGZvcm0gd2FudHMgdG8gdXNlCisvLyAgIFY4IGFzIGl0cyBKYXZhU2NyaXB0IGVuZ2luZS4KKyNkZWZpbmUgU0JfSU5UUk9EVUNFX0FUT01JQzhfVkVSU0lPTiBTQl9FWFBFUklNRU5UQUxfQVBJX1ZFUlNJT04KKworLy8gQVBJIHZlcnNpb24gd2hlcmUgU2JNZW1vcnlQcm90ZWN0IHdhcyBpbnRyb2R1Y2VkLiAgQWxsb3dzIG1lbW9yeQorLy8gICBwZXJtaXNzaW9ucyB0byBiZSBjaGFuZ2VkIHdpdGggYFNiTWVtb3J5UHJvdGVjdGAgYWZ0ZXIgdGhleSBhcmUgbWFwcGVkCisvLyAgIHdpdGggYFNiTWVtb3J5TWFwYC4KKyNkZWZpbmUgU0JfTUVNT1JZX1BST1RFQ1RfQVBJX1ZFUlNJT04gU0JfRVhQRVJJTUVOVEFMX0FQSV9WRVJTSU9OCisKKy8vIEFQSSB2ZXJzaW9uIHdoZXJlIFNiSW5wdXREYXRhIGFsbG93cyBwcm9wYWdhdGluZyBhIHx0aW1lc3RhbXB8IGZvciB0aGUgaW5wdXQKKy8vICAgZXZlbnQgdG8gdGhlIGRvbSBFdmVudC4KKyNkZWZpbmUgU0JfSU5QVVRfVElNRVNUQU1QX0FQSV9WRVJTSU9OIFNCX0VYUEVSSU1FTlRBTF9BUElfVkVSU0lPTgorCiAvLyAtLS0gUmVsZWFzZSBDYW5kaWRhdGUgRmVhdHVyZSBEZWZpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogLy8gLS0tIENvbW1vbiBEZXRlY3RlZCBGZWF0dXJlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC02MTIsNyArNjQyLDcgQEAKICNlbmRpZiAgLy8gZGVmaW5lZChTQl9IQVNfRFJNX0tFWV9TVEFUVVNFUykKICNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNgogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfRFJNX1NFU1NJT05fQ0xPU0VEX0FQSV9WRVJTSU9OCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfRFJNX1JFRklORU1FTlRfQVBJX1ZFUlNJT04KICNpZiBkZWZpbmVkKFNCX0hBU19EUk1fU0VTU0lPTl9DTE9TRUQpCiAjaWYgIVNCX0hBUyhEUk1fU0VTU0lPTl9DTE9TRUQpCiAjZXJyb3IgIlNCX0hBU19EUk1fU0VTU0lPTl9DTE9TRUQgaXMgcmVxdWlyZWQgaW4gdGhpcyBBUEkgdmVyc2lvbi4iCkBAIC02MjAsNyArNjUwLDcgQEAKICNlbHNlICAgLy8gZGVmaW5lZChTQl9IQVNfRFJNX1NFU1NJT05fQ0xPU0VEKQogI2RlZmluZSBTQl9IQVNfRFJNX1NFU1NJT05fQ0xPU0VEIDEKICNlbmRpZiAgLy8gZGVmaW5lZChTQl9IQVNfRFJNX1NFU1NJT05fQ0xPU0VEKQotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9EUk1fU0VTU0lPTl9DTE9TRURfQVBJX1ZFUlNJT04KKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfRFJNX1JFRklORU1FTlRfQVBJX1ZFUlNJT04KIAogI2lmIFNCX0FQSV9WRVJTSU9OID49IDUKICNpZiAhZGVmaW5lZChTQl9IQVNfU1BFRUNIX1JFQ09HTklaRVIpCkBAIC02NTAsNiArNjgwLDEwIEBACiAjZGVmaW5lIFNCX0hBU19BVURJT0xFU1NfVklERU8gMQogI2VuZGlmCiAKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfRklMVEVSX1RFU1RTX1JFUVVJUkVEX0FQSV9WRVJTSU9OCisjZGVmaW5lIFNCX0hBU19QTEFZRVJfRklMVEVSX1RFU1RTIDEKKyNlbmRpZgorCiAjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0VSUk9SX01FU1NBR0VfQVBJX1ZFUlNJT04KICNkZWZpbmUgU0JfSEFTX1BMQVlFUl9FUlJPUl9NRVNTQUdFIDEKICNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9jb250cmliL2NyZWF0b3IvY2kyMHgxMS9saWJyYXJpZXMuZ3lwaSBiL3NyYy9zdGFyYm9hcmQvY29udHJpYi9jcmVhdG9yL2NpMjB4MTEvbGlicmFyaWVzLmd5cGkKaW5kZXggNjBhMGY3ZS4uN2EzNzU0NCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9jb250cmliL2NyZWF0b3IvY2kyMHgxMS9saWJyYXJpZXMuZ3lwaQorKysgYi9zcmMvc3RhcmJvYXJkL2NvbnRyaWIvY3JlYXRvci9jaTIweDExL2xpYnJhcmllcy5neXBpCkBAIC0xNCw2ICsxNCwxNyBAQAogCiB7CiAgICd2YXJpYWJsZXMnOiB7CisgICAgIyBUaGlzIHBsYXRmb3JtIHVzZXMgYSBjb21wb3NpdG9yIHRvIHByZXNlbnQgdGhlIHJlbmRlcmluZyBvdXRwdXQsIHNvCisgICAgIyBzZXQgdGhlIHN3YXAgaW50ZXJ2YWwgdG8gdXBkYXRlIHRoZSBidWZmZXIgaW1tZWRpYXRlbHkuIFRoYXQgYnVmZmVyCisgICAgIyB3aWxsIHRoZW4gYmUgcHJlc2VudGVkIGJ5IHRoZSBjb21wb3NpdG9yIG9uIGl0cyBvd24gdGltZS4KKyAgICAnY29iYWx0X2VnbF9zd2FwX2ludGVydmFsJzogMCwKKworICAgICMgSG9vayBpbnRvIHRoZSBzd2FwIGJ1ZmZlcnMgY2FsbCB0byBmYWNpbGl0YXRlIHN5bmNocm9uaXphdGlvbiBvZiB0aGUKKyAgICAjIE9wZW5HTCBvdXRwdXQgd2l0aCB0aGUgcHVuY2gtdGhyb3VnaCB2aWRlbyBsYXllci4KKyAgICAnbGlua2VyX2ZsYWdzJzogWworICAgICAgJy1XbCwtLXdyYXA9ZWdsU3dhcEJ1ZmZlcnMnLAorICAgIF0sCisKICAgICAncGxhdGZvcm1fbGlicmFyaWVzJzogWwogICAgICAgJy1sRUdMJywKICAgICAgICctbEdMRVN2MicsCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2NvbnRyaWIvY3JlYXRvci9jaTIweDExL3N0YXJib2FyZF9wbGF0Zm9ybS5neXBpIGIvc3JjL3N0YXJib2FyZC9jb250cmliL2NyZWF0b3IvY2kyMHgxMS9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwaQppbmRleCBhYjM4MTM1Li5lZDhkODEwIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2NvbnRyaWIvY3JlYXRvci9jaTIweDExL3N0YXJib2FyZF9wbGF0Zm9ybS5neXBpCisrKyBiL3NyYy9zdGFyYm9hcmQvY29udHJpYi9jcmVhdG9yL2NpMjB4MTEvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cGkKQEAgLTIzLDYgKzIzLDcgQEAKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvY29udHJpYi9jcmVhdG9yL2NpMjB4MTEvc3lzdGVtX2dldF9wcm9wZXJ0eS5jYycsCiAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbGlua19yZWNlaXZlci5jYycsCiAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC94MTEvYXBwbGljYXRpb25feDExLmNjJywKKyAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3gxMS9lZ2xfc3dhcF9idWZmZXJzLmNjJywKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3gxMS93aW5kb3dfY3JlYXRlLmNjJywKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3gxMS93aW5kb3dfZGVzdHJveS5jYycsCiAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC94MTEvd2luZG93X2dldF9wbGF0Zm9ybV9oYW5kbGUuY2MnLApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9jb250cmliL2NyZWF0b3Ivc2hhcmVkL2NvbmZpZ3VyYXRpb25fcHVibGljLmggYi9zcmMvc3RhcmJvYXJkL2NvbnRyaWIvY3JlYXRvci9zaGFyZWQvY29uZmlndXJhdGlvbl9wdWJsaWMuaAppbmRleCAxZWEzYmVkLi4xNDYzMWZkIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2NvbnRyaWIvY3JlYXRvci9zaGFyZWQvY29uZmlndXJhdGlvbl9wdWJsaWMuaAorKysgYi9zcmMvc3RhcmJvYXJkL2NvbnRyaWIvY3JlYXRvci9zaGFyZWQvY29uZmlndXJhdGlvbl9wdWJsaWMuaApAQCAtOTAsMTEgKzkwLDYgQEAKIC8vIFRoZSBBUEkgdmVyc2lvbiBpbXBsZW1lbnRlZCBieSB0aGlzIHBsYXRmb3JtLgogI2RlZmluZSBTQl9BUElfVkVSU0lPTiA2CiAKLS8vIENJMjAgcGxhdGZvcm0gd2l0aCAxLjE0IHZlcnNpb24gb2YgU0dYIGxpYnJhcmllcyBkb2VzIG5vdCBzdXBwb3J0Ci0vLyBFR0xfQklORF9UT19URVhUVVJFX1JHQkEKLSNkZWZpbmUgU0JfSEFTX1FVSVJLX05PX0VHTF9CSU5EX1RPX1RFWFRVUkUgMQotCi0KIC8vIC0tLSBTeXN0ZW0gSGVhZGVyIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAvLyBBbnkgc3lzdGVtIGhlYWRlcnMgbGlzdGVkIGhlcmUgdGhhdCBhcmUgbm90IHByb3ZpZGVkIGJ5IHRoZSBwbGF0Zm9ybSB3aWxsIGJlCkBAIC0xMjcsMTUgKzEyMiw2IEBACiAvLyBXaGV0aGVyIHRoZSBjdXJyZW50IHBsYXRmb3JtIHByb3ZpZGVzIHNzaXplX3QuCiAjZGVmaW5lIFNCX0hBU19TU0laRV9UIDEKIAotLy8gV2hldGhlciB0aGUgY3VycmVudCBwbGF0Zm9ybSBoYXMgbWljcm9waG9uZSBzdXBwb3J0ZWQuCi0jZGVmaW5lIFNCX0hBU19NSUNST1BIT05FIDAKLQotLy8gV2hldGhlciB0aGUgY3VycmVudCBwbGF0Zm9ybSBoYXMgc3BlZWNoIHJlY29nbml6ZXIuCi0jZGVmaW5lIFNCX0hBU19TUEVFQ0hfUkVDT0dOSVpFUiAwCi0KLS8vIFdoZXRoZXIgdGhlIGN1cnJlbnQgcGxhdGZvcm0gaGFzIHNwZWVjaCBzeW50aGVzaXMuCi0jZGVmaW5lIFNCX0hBU19TUEVFQ0hfU1lOVEhFU0lTIDAKLQogLy8gVHlwZSBkZXRlY3Rpb24gZm9yIHdjaGFyX3QuCiAjaWYgZGVmaW5lZChfX1dDSEFSX01BWF9fKSAmJiBcCiAgICAgKF9fV0NIQVJfTUFYX18gPT0gMHg3ZmZmZmZmZiB8fCBfX1dDSEFSX01BWF9fID09IDB4ZmZmZmZmZmYpCkBAIC0xNTMsMTIgKzEzOSw2IEBACiAjZGVmaW5lIFNCX0lTX1dDSEFSX1RfU0lHTkVEIDEKICNlbmRpZgogCi0vLyAtLS0gQXJjaGl0ZWN0dXJlIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gT24gZGVmYXVsdCBMaW51eCwgeW91IG11c3QgYmUgYSBzdXBlcnVzZXIgaW4gb3JkZXIgdG8gc2V0IHJlYWwgdGltZQotLy8gc2NoZWR1bGluZyBvbiB0aHJlYWRzLgotI2RlZmluZSBTQl9IQVNfVEhSRUFEX1BSSU9SSVRZX1NVUFBPUlQgMAotCiAvLyAtLS0gQ29tcGlsZXIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogLy8gVGhlIHBsYXRmb3JtJ3MgYW5ub3RhdGlvbiBmb3IgZm9yY2luZyBhIEMgZnVuY3Rpb24gdG8gYmUgaW5saW5lZC4KQEAgLTI1NSw1NCArMjM1LDYgQEAKIC8vIFRoZSBzdHJpbmcgZm9ybSBvZiBTQl9QQVRIX1NFUF9DSEFSLgogI2RlZmluZSBTQl9QQVRIX1NFUF9TVFJJTkcgIjoiCiAKLS8vIC0tLSBNZW1vcnkgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBUaGUgbWVtb3J5IHBhZ2Ugc2l6ZSwgd2hpY2ggY29udHJvbHMgdGhlIHNpemUgb2YgY2h1bmtzIG9uIG1lbW9yeSB0aGF0Ci0vLyBhbGxvY2F0b3JzIGRlYWwgd2l0aCwgYW5kIHRoZSBhbGlnbm1lbnQgb2YgdGhvc2UgY2h1bmtzLiBUaGlzIGRvZXNuJ3QgaGF2ZSB0bwotLy8gYmUgdGhlIGhhcmR3YXJlLWRlZmluZWQgcGh5c2ljYWwgcGFnZSBzaXplLCBidXQgaXQgc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YKLS8vIGl0LgotI2RlZmluZSBTQl9NRU1PUllfUEFHRV9TSVpFIDQwOTYKLQotLy8gV2hldGhlciB0aGlzIHBsYXRmb3JtIGhhcyBhbmQgc2hvdWxkIHVzZSBhbiBNTUFQIGZ1bmN0aW9uIHRvIG1hcCBwaHlzaWNhbAotLy8gbWVtb3J5IHRvIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UuCi0jZGVmaW5lIFNCX0hBU19NTUFQIDEKLQotLy8gV2hldGhlciB0aGlzIHBsYXRmb3JtIGNhbiBtYXAgZXhlY3V0YWJsZSBtZW1vcnkuIEltcGxpZXMgU0JfSEFTX01NQVAuIFRoaXMgaXMKLS8vIHJlcXVpcmVkIGZvciBwbGF0Zm9ybXMgdGhhdCB3YW50IHRvIEpJVC4KLSNkZWZpbmUgU0JfQ0FOX01BUF9FWEVDVVRBQkxFX01FTU9SWSAxCi0KLS8vIFdoZXRoZXIgdGhpcyBwbGF0Zm9ybSBoYXMgYW5kIHNob3VsZCB1c2UgYW4gZ3Jvd2FibGUgaGVhcCAoZS5nLiB3aXRoIHNicmsoKSkKLS8vIHRvIG1hcCBwaHlzaWNhbCBtZW1vcnkgdG8gdGhlIHZpcnR1YWwgYWRkcmVzcyBzcGFjZS4KLSNkZWZpbmUgU0JfSEFTX1ZJUlRVQUxfUkVHSU9OUyAwCi0KLS8vIFNwZWNpZmllcyB0aGUgYWxpZ25tZW50IGZvciBJTyBCdWZmZXJzLCBpbiBieXRlcy4gU29tZSBsb3ctbGV2ZWwgbmV0d29yayBBUElzCi0vLyBtYXkgcmVxdWlyZSBidWZmZXJzIHRvIGhhdmUgYSBzcGVjaWZpYyBhbGlnbm1lbnQsIGFuZCB0aGlzIGlzIHRoZSBwbGFjZSB0bwotLy8gc3BlY2lmeSB0aGF0LgotI2RlZmluZSBTQl9ORVRXT1JLX0lPX0JVRkZFUl9BTElHTk1FTlQgMTYKLQotLy8gRGV0ZXJtaW5lcyB0aGUgYWxpZ25tZW50IHRoYXQgYWxsb2NhdGlvbnMgc2hvdWxkIGhhdmUgb24gdGhpcyBwbGF0Zm9ybS4KLSNkZWZpbmUgU0JfTUFMTE9DX0FMSUdOTUVOVCAoKHNpemVfdCkxNlUpCi0KLS8vIERldGVybWluZXMgdGhlIHRocmVzaGhvbGQgb2YgYWxsb2NhdGlvbiBzaXplIHRoYXQgc2hvdWxkIGJlIGRvbmUgd2l0aCBtbWFwCi0vLyAoaWYgYXZhaWxhYmxlKSwgcmF0aGVyIHRoYW4gYWxsb2NhdGVkIHdpdGhpbiB0aGUgY29yZSBoZWFwLgotI2RlZmluZSBTQl9ERUZBVUxUX01NQVBfVEhSRVNIT0xEICgoc2l6ZV90KSgyNTYgKiAxMDI0VSkpCi0KLS8vIERlZmluZXMgdGhlIHBhdGggd2hlcmUgbWVtb3J5IGRlYnVnZ2luZyBsb2dzIHNob3VsZCBiZSB3cml0dGVuIHRvLgotI2RlZmluZSBTQl9NRU1PUllfTE9HX1BBVEggIi90bXAvc3RhcmJvYXJkIgotCi0vLyAtLS0gVGhyZWFkIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gRGVmaW5lcyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2ltdWx0YW5lb3VzIHRocmVhZHMgZm9yIHRoaXMgcGxhdGZvcm0uIFNvbWUKLS8vIHBsYXRmb3JtcyByZXF1aXJlIHNoYXJpbmcgdGhyZWFkIGhhbmRsZXMgd2l0aCBvdGhlciBraW5kcyBvZiBzeXN0ZW0gaGFuZGxlcywKLS8vIGxpa2UgbXV0ZXhlcywgc28gd2Ugd2FudCB0byBrZWVwIHRoaXMgbWFuYWdhYmxlLgotI2RlZmluZSBTQl9NQVhfVEhSRUFEUyA5MAotCi0vLyBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGhyZWFkIGxvY2FsIHN0b3JhZ2Uga2V5cyBzdXBwb3J0ZWQgYnkgdGhpcyBwbGF0Zm9ybS4KLSNkZWZpbmUgU0JfTUFYX1RIUkVBRF9MT0NBTF9LRVlTIDUxMgotCi0vLyBUaGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIG5hbWUgZm9yIGEgdGhyZWFkLCBpbmNsdWRpbmcgdGhlIE5VTEwtdGVybWluYXRvci4KLSNkZWZpbmUgU0JfTUFYX1RIUkVBRF9OQU1FX0xFTkdUSCAxNjsKLQogLy8gLS0tIEdyYXBoaWNzIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIC8vIFNwZWNpZmllcyB3aGV0aGVyIHRoaXMgcGxhdGZvcm0gc3VwcG9ydHMgYSBwZXJmb3JtYW50IGFjY2VsZXJhdGVkIGJsaXR0ZXIKQEAgLTMyOSw2ICsyNjEsMjEgQEAKIC8vIHNjZW5lIGhhc24ndCBjaGFuZ2VkIGFyZSBlbmFibGVkLgogI2RlZmluZSBTQl9NVVNUX0ZSRVFVRU5UTFlfRkxJUF9ESVNQTEFZX0JVRkZFUiAwCiAKKy8vIENJMjAgcGxhdGZvcm0gd2l0aCAxLjE0IHZlcnNpb24gb2YgU0dYIGxpYnJhcmllcyBkb2VzIG5vdCBzdXBwb3J0CisvLyBFR0xfQklORF9UT19URVhUVVJFX1JHQkEKKyNkZWZpbmUgU0JfSEFTX1FVSVJLX05PX0VHTF9CSU5EX1RPX1RFWFRVUkUgMQorCisvLyAtLS0gSS9PIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gV2hldGhlciB0aGUgY3VycmVudCBwbGF0Zm9ybSBoYXMgbWljcm9waG9uZSBzdXBwb3J0ZWQuCisjZGVmaW5lIFNCX0hBU19NSUNST1BIT05FIDAKKworLy8gV2hldGhlciB0aGUgY3VycmVudCBwbGF0Zm9ybSBoYXMgc3BlZWNoIHJlY29nbml6ZXIuCisjZGVmaW5lIFNCX0hBU19TUEVFQ0hfUkVDT0dOSVpFUiAwCisKKy8vIFdoZXRoZXIgdGhlIGN1cnJlbnQgcGxhdGZvcm0gaGFzIHNwZWVjaCBzeW50aGVzaXMuCisjZGVmaW5lIFNCX0hBU19TUEVFQ0hfU1lOVEhFU0lTIDAKKwogLy8gLS0tIE1lZGlhIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIC8vIFNwZWNpZmllcyB3aGV0aGVyIHRoaXMgcGxhdGZvcm0gaGFzIHN1cHBvcnQgZm9yIGEgcG9zc2libHktZGVjcnlwdGluZwpAQCAtNDAzLDYgKzM1MCw0MSBAQAogLy8gdmFsdWUgbGVhZHMgdG8gbW9yZSBzdGFibGUgZnBzIGJ1dCBhbHNvIGNhdXNlcyB0aGUgYXBwIHRvIHVzZSBtb3JlIG1lbW9yeS4KICNkZWZpbmUgU0JfTUVESUFfTUFYSU1VTV9WSURFT19GUkFNRVMgMTIKIAorLy8gLS0tIE1lbW9yeSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRoZSBtZW1vcnkgcGFnZSBzaXplLCB3aGljaCBjb250cm9scyB0aGUgc2l6ZSBvZiBjaHVua3Mgb24gbWVtb3J5IHRoYXQKKy8vIGFsbG9jYXRvcnMgZGVhbCB3aXRoLCBhbmQgdGhlIGFsaWdubWVudCBvZiB0aG9zZSBjaHVua3MuIFRoaXMgZG9lc24ndCBoYXZlIHRvCisvLyBiZSB0aGUgaGFyZHdhcmUtZGVmaW5lZCBwaHlzaWNhbCBwYWdlIHNpemUsIGJ1dCBpdCBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZgorLy8gaXQuCisjZGVmaW5lIFNCX01FTU9SWV9QQUdFX1NJWkUgNDA5NgorCisvLyBXaGV0aGVyIHRoaXMgcGxhdGZvcm0gaGFzIGFuZCBzaG91bGQgdXNlIGFuIE1NQVAgZnVuY3Rpb24gdG8gbWFwIHBoeXNpY2FsCisvLyBtZW1vcnkgdG8gdGhlIHZpcnR1YWwgYWRkcmVzcyBzcGFjZS4KKyNkZWZpbmUgU0JfSEFTX01NQVAgMQorCisvLyBXaGV0aGVyIHRoaXMgcGxhdGZvcm0gY2FuIG1hcCBleGVjdXRhYmxlIG1lbW9yeS4gSW1wbGllcyBTQl9IQVNfTU1BUC4gVGhpcyBpcworLy8gcmVxdWlyZWQgZm9yIHBsYXRmb3JtcyB0aGF0IHdhbnQgdG8gSklULgorI2RlZmluZSBTQl9DQU5fTUFQX0VYRUNVVEFCTEVfTUVNT1JZIDEKKworLy8gV2hldGhlciB0aGlzIHBsYXRmb3JtIGhhcyBhbmQgc2hvdWxkIHVzZSBhbiBncm93YWJsZSBoZWFwIChlLmcuIHdpdGggc2JyaygpKQorLy8gdG8gbWFwIHBoeXNpY2FsIG1lbW9yeSB0byB0aGUgdmlydHVhbCBhZGRyZXNzIHNwYWNlLgorI2RlZmluZSBTQl9IQVNfVklSVFVBTF9SRUdJT05TIDAKKworLy8gU3BlY2lmaWVzIHRoZSBhbGlnbm1lbnQgZm9yIElPIEJ1ZmZlcnMsIGluIGJ5dGVzLiBTb21lIGxvdy1sZXZlbCBuZXR3b3JrIEFQSXMKKy8vIG1heSByZXF1aXJlIGJ1ZmZlcnMgdG8gaGF2ZSBhIHNwZWNpZmljIGFsaWdubWVudCwgYW5kIHRoaXMgaXMgdGhlIHBsYWNlIHRvCisvLyBzcGVjaWZ5IHRoYXQuCisjZGVmaW5lIFNCX05FVFdPUktfSU9fQlVGRkVSX0FMSUdOTUVOVCAxNgorCisvLyBEZXRlcm1pbmVzIHRoZSBhbGlnbm1lbnQgdGhhdCBhbGxvY2F0aW9ucyBzaG91bGQgaGF2ZSBvbiB0aGlzIHBsYXRmb3JtLgorI2RlZmluZSBTQl9NQUxMT0NfQUxJR05NRU5UICgoc2l6ZV90KTE2VSkKKworLy8gRGV0ZXJtaW5lcyB0aGUgdGhyZXNoaG9sZCBvZiBhbGxvY2F0aW9uIHNpemUgdGhhdCBzaG91bGQgYmUgZG9uZSB3aXRoIG1tYXAKKy8vIChpZiBhdmFpbGFibGUpLCByYXRoZXIgdGhhbiBhbGxvY2F0ZWQgd2l0aGluIHRoZSBjb3JlIGhlYXAuCisjZGVmaW5lIFNCX0RFRkFVTFRfTU1BUF9USFJFU0hPTEQgKChzaXplX3QpKDI1NiAqIDEwMjRVKSkKKworLy8gRGVmaW5lcyB0aGUgcGF0aCB3aGVyZSBtZW1vcnkgZGVidWdnaW5nIGxvZ3Mgc2hvdWxkIGJlIHdyaXR0ZW4gdG8uCisjZGVmaW5lIFNCX01FTU9SWV9MT0dfUEFUSCAiL3RtcC9zdGFyYm9hcmQiCisKIC8vIC0tLSBOZXR3b3JrIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAvLyBTcGVjaWZpZXMgd2hldGhlciB0aGlzIHBsYXRmb3JtIHN1cHBvcnRzIElQVjYuCkBAIC00MTEsNiArMzkzLDI4IEBACiAvLyBTcGVjaWZpZXMgd2hldGhlciB0aGlzIHBsYXRmb3JtIHN1cHBvcnRzIHBpcGUuCiAjZGVmaW5lIFNCX0hBU19QSVBFIDEKIAorLy8gLS0tIFRocmVhZCBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFdoZXRoZXIgdGhlIGN1cnJlbnQgcGxhdGZvcm0gc3VwcG9ydHMgdGhyZWFkIHByaW9yaXRpZXMuCisjZGVmaW5lIFNCX0hBU19USFJFQURfUFJJT1JJVFlfU1VQUE9SVCAwCisKKy8vIERlZmluZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHNpbXVsdGFuZW91cyB0aHJlYWRzIGZvciB0aGlzIHBsYXRmb3JtLiBTb21lCisvLyBwbGF0Zm9ybXMgcmVxdWlyZSBzaGFyaW5nIHRocmVhZCBoYW5kbGVzIHdpdGggb3RoZXIga2luZHMgb2Ygc3lzdGVtIGhhbmRsZXMsCisvLyBsaWtlIG11dGV4ZXMsIHNvIHdlIHdhbnQgdG8ga2VlcCB0aGlzIG1hbmFnYWJsZS4KKyNkZWZpbmUgU0JfTUFYX1RIUkVBRFMgOTAKKworLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIHRocmVhZCBsb2NhbCBzdG9yYWdlIGtleXMgc3VwcG9ydGVkIGJ5IHRoaXMgcGxhdGZvcm0uCisjZGVmaW5lIFNCX01BWF9USFJFQURfTE9DQUxfS0VZUyA1MTIKKworLy8gVGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBuYW1lIGZvciBhIHRocmVhZCwgaW5jbHVkaW5nIHRoZSBOVUxMLXRlcm1pbmF0b3IuCisjZGVmaW5lIFNCX01BWF9USFJFQURfTkFNRV9MRU5HVEggMTYKKworLy8gLS0tIFRpbWluZyBBUEkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFdoZXRoZXIgdGhpcyBwbGF0Zm9ybSBoYXMgYW4gQVBJIHRvIHJldHJpZXZlIGhvdyBsb25nIHRoZSBjdXJyZW50IHRocmVhZAorLy8gaGFzIHNwZW50IGluIHRoZSBleGVjdXRpbmcgc3RhdGUuCisjZGVmaW5lIFNCX0hBU19USU1FX1RIUkVBRF9OT1cgMQorCiAvLyAtLS0gVHVuZWFibGUgUGFyYW1ldGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogLy8gU3BlY2lmaWVzIHRoZSBuZXR3b3JrIHJlY2VpdmUgYnVmZmVyIHNpemUgaW4gYnl0ZXMsIHNldCB2aWEKQEAgLTQzMiwxMiArNDM2LDYgQEAKIC8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiB1c2VycyB0aGF0IGNhbiBiZSBzaWduZWQgaW4gYXQgdGhlIHNhbWUgdGltZS4KICNkZWZpbmUgU0JfVVNFUl9NQVhfU0lHTkVEX0lOIDEKIAotLy8gLS0tIFRpbWluZyBBUEkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIFdoZXRoZXIgdGhpcyBwbGF0Zm9ybSBoYXMgYW4gQVBJIHRvIHJldHJpZXZlIGhvdyBsb25nIHRoZSBjdXJyZW50IHRocmVhZAotLy8gaGFzIHNwZW50IGluIHRoZSBleGVjdXRpbmcgc3RhdGUuCi0jZGVmaW5lIFNCX0hBU19USU1FX1RIUkVBRF9OT1cgMQotCiAvLyAtLS0gUGxhdGZvcm0gU3BlY2lmaWMgQXVkaXRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogI2lmICFkZWZpbmVkKF9fR05VQ19fKQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9jb250cmliL2xpbnV4L3g2NHdsL2F0b21pY19wdWJsaWMuaCBiL3NyYy9zdGFyYm9hcmQvY29udHJpYi9saW51eC94NjR3bC9hdG9taWNfcHVibGljLmgKaW5kZXggNjNiY2M2YS4uNGY1ODcwNCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9jb250cmliL2xpbnV4L3g2NHdsL2F0b21pY19wdWJsaWMuaAorKysgYi9zcmMvc3RhcmJvYXJkL2NvbnRyaWIvbGludXgveDY0d2wvYXRvbWljX3B1YmxpYy5oCkBAIC0xLDQgKzEsNCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAvLwogLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2NvbnRyaWIvbGludXgveDY0d2wvY29uZmlndXJhdGlvbl9wdWJsaWMuaCBiL3NyYy9zdGFyYm9hcmQvY29udHJpYi9saW51eC94NjR3bC9jb25maWd1cmF0aW9uX3B1YmxpYy5oCmluZGV4IDk2MjhhNmUuLjQ5NmFjNWMgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvY29udHJpYi9saW51eC94NjR3bC9jb25maWd1cmF0aW9uX3B1YmxpYy5oCisrKyBiL3NyYy9zdGFyYm9hcmQvY29udHJpYi9saW51eC94NjR3bC9jb25maWd1cmF0aW9uX3B1YmxpYy5oCkBAIC0xLDQgKzEsNCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAvLwogLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2NvbnRyaWIvbGludXgveDY0d2wvZ3lwX2NvbmZpZ3VyYXRpb24uZ3lwaSBiL3NyYy9zdGFyYm9hcmQvY29udHJpYi9saW51eC94NjR3bC9neXBfY29uZmlndXJhdGlvbi5neXBpCmluZGV4IDA2ODM5NjguLjAxYTQ5N2MgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvY29udHJpYi9saW51eC94NjR3bC9neXBfY29uZmlndXJhdGlvbi5neXBpCisrKyBiL3NyYy9zdGFyYm9hcmQvY29udHJpYi9saW51eC94NjR3bC9neXBfY29uZmlndXJhdGlvbi5neXBpCkBAIC0xLDQgKzEsNCBAQAotIyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogIwogIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9jb250cmliL2xpbnV4L3g2NHdsL2d5cF9jb25maWd1cmF0aW9uLnB5IGIvc3JjL3N0YXJib2FyZC9jb250cmliL2xpbnV4L3g2NHdsL2d5cF9jb25maWd1cmF0aW9uLnB5CmluZGV4IDZjMmU3ZWQuLmQyNzI1MjIgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvY29udHJpYi9saW51eC94NjR3bC9neXBfY29uZmlndXJhdGlvbi5weQorKysgYi9zcmMvc3RhcmJvYXJkL2NvbnRyaWIvbGludXgveDY0d2wvZ3lwX2NvbmZpZ3VyYXRpb24ucHkKQEAgLTEsNCArMSw0IEBACi0jIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAjCiAjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2NvbnRyaWIvbGludXgveDY0d2wvbWFpbi5jYyBiL3NyYy9zdGFyYm9hcmQvY29udHJpYi9saW51eC94NjR3bC9tYWluLmNjCmluZGV4IGM4MzU5NzcuLjE2NTM4NTkgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvY29udHJpYi9saW51eC94NjR3bC9tYWluLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvY29udHJpYi9saW51eC94NjR3bC9tYWluLmNjCkBAIC0xLDQgKzEsNCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAvLwogLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2NvbnRyaWIvbGludXgveDY0d2wvcGxheWVyX291dHB1dF9tb2RlX3N1cHBvcnRlZC5jYyBiL3NyYy9zdGFyYm9hcmQvY29udHJpYi9saW51eC94NjR3bC9wbGF5ZXJfb3V0cHV0X21vZGVfc3VwcG9ydGVkLmNjCmluZGV4IDkxOTc4YzAuLjE2NmRlMDMgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvY29udHJpYi9saW51eC94NjR3bC9wbGF5ZXJfb3V0cHV0X21vZGVfc3VwcG9ydGVkLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvY29udHJpYi9saW51eC94NjR3bC9wbGF5ZXJfb3V0cHV0X21vZGVfc3VwcG9ydGVkLmNjCkBAIC0xLDQgKzEsNCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAvLwogLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2NvbnRyaWIvbGludXgveDY0d2wvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cCBiL3NyYy9zdGFyYm9hcmQvY29udHJpYi9saW51eC94NjR3bC9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwCmluZGV4IDNiMDg1ZmEuLjYyZjM1NWEgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvY29udHJpYi9saW51eC94NjR3bC9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwCisrKyBiL3NyYy9zdGFyYm9hcmQvY29udHJpYi9saW51eC94NjR3bC9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwCkBAIC0xLDQgKzEsNCBAQAotIyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogIwogIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9jb250cmliL2xpbnV4L3g2NHdsL3N0YXJib2FyZF9wbGF0Zm9ybS5neXBpIGIvc3JjL3N0YXJib2FyZC9jb250cmliL2xpbnV4L3g2NHdsL3N0YXJib2FyZF9wbGF0Zm9ybS5neXBpCmluZGV4IDc4YTQ5MzAuLjBkYmJkYzYgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvY29udHJpYi9saW51eC94NjR3bC9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwaQorKysgYi9zcmMvc3RhcmJvYXJkL2NvbnRyaWIvbGludXgveDY0d2wvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cGkKQEAgLTEsNCArMSw0IEBACi0jIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAjCiAjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2NvbnRyaWIvbGludXgveDY0d2wvc3lzdGVtX2dldF9wcm9wZXJ0eS5jYyBiL3NyYy9zdGFyYm9hcmQvY29udHJpYi9saW51eC94NjR3bC9zeXN0ZW1fZ2V0X3Byb3BlcnR5LmNjCmluZGV4IGE5NjUxYzUuLjdlMzI5MWQgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvY29udHJpYi9saW51eC94NjR3bC9zeXN0ZW1fZ2V0X3Byb3BlcnR5LmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvY29udHJpYi9saW51eC94NjR3bC9zeXN0ZW1fZ2V0X3Byb3BlcnR5LmNjCkBAIC0xLDQgKzEsNCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAvLwogLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCw4ICsxNCw4IEBACiAKICNpbmNsdWRlICJzdGFyYm9hcmQvc3lzdGVtLmgiCiAKLSNpbmNsdWRlIDxuZXRkYi5oPgogI2luY2x1ZGUgPGxpbnV4L2lmLmg+ICAvLyBOT0xJTlQoYnVpbGQvaW5jbHVkZV9hbHBoYSkKKyNpbmNsdWRlIDxuZXRkYi5oPgogI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgogI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KIApAQCAtNTUsMTMgKzU1LDEyIEBACiAgIH0KIAogICBzdHJ1Y3QgaWZyZXEqIGN1cl9pbnRlcmZhY2UgPSBjb25maWcuaWZjX3JlcTsKLSAgY29uc3Qgc3RydWN0IGlmcmVxKiBjb25zdCBlbmQgPSBjdXJfaW50ZXJmYWNlICsKLSAgICAgIChjb25maWcuaWZjX2xlbiAvIHNpemVvZihzdHJ1Y3QgaWZyZXEpKTsKKyAgY29uc3Qgc3RydWN0IGlmcmVxKiBjb25zdCBlbmQgPQorICAgICAgY3VyX2ludGVyZmFjZSArIChjb25maWcuaWZjX2xlbiAvIHNpemVvZihzdHJ1Y3QgaWZyZXEpKTsKIAogICBmb3IgKDsgY3VyX2ludGVyZmFjZSAhPSBlbmQ7ICsrY3VyX2ludGVyZmFjZSkgewotICAgIFNiU3RyaW5nQ29weShpbnRlcmZhY2UuaWZyX25hbWUsCi0gICAgICAgIGN1cl9pbnRlcmZhY2UtPmlmcl9uYW1lLAotICAgICAgICBzaXplb2YoY3VyX2ludGVyZmFjZS0+aWZyX25hbWUpKTsKKyAgICBTYlN0cmluZ0NvcHkoaW50ZXJmYWNlLmlmcl9uYW1lLCBjdXJfaW50ZXJmYWNlLT5pZnJfbmFtZSwKKyAgICAgICAgICAgICAgICAgc2l6ZW9mKGN1cl9pbnRlcmZhY2UtPmlmcl9uYW1lKSk7CiAgICAgaWYgKGlvY3RsKGZkLCBTSU9DR0lGRkxBR1MsICZpbnRlcmZhY2UpID09IC0xKSB7CiAgICAgICBjb250aW51ZTsKICAgICB9CkBAIC03MSw3ICs3MCw4IEBACiAgICAgaWYgKGlvY3RsKGZkLCBTSU9DR0lGSFdBRERSLCAmaW50ZXJmYWNlKSA9PSAtMSkgewogICAgICAgY29udGludWU7CiAgICAgfQotICAgIFNiU3RyaW5nRm9ybWF0RihvdXRfdmFsdWUsIHZhbHVlX2xlbmd0aCwgIiV4OiV4OiV4OiV4OiV4OiV4IiwKKyAgICBTYlN0cmluZ0Zvcm1hdEYoCisgICAgICAgIG91dF92YWx1ZSwgdmFsdWVfbGVuZ3RoLCAiJXg6JXg6JXg6JXg6JXg6JXgiLAogICAgICAgICBpbnRlcmZhY2UuaWZyX2FkZHIuc2FfZGF0YVswXSwgaW50ZXJmYWNlLmlmcl9hZGRyLnNhX2RhdGFbMV0sCiAgICAgICAgIGludGVyZmFjZS5pZnJfYWRkci5zYV9kYXRhWzJdLCBpbnRlcmZhY2UuaWZyX2FkZHIuc2FfZGF0YVszXSwKICAgICAgICAgaW50ZXJmYWNlLmlmcl9hZGRyLnNhX2RhdGFbNF0sIGludGVyZmFjZS5pZnJfYWRkci5zYV9kYXRhWzVdKTsKQEAgLTgwLDcgKzgwLDcgQEAKICAgcmV0dXJuIGZhbHNlOwogfQogCi0jZW5kaWYgICAvLyBTQl9BUElfVkVSU0lPTiA8IFNCX1BST1BFUlRZX1VVSURfUkVNT1ZFRF9BUElfVkVSU0lPTgorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA8IFNCX1BST1BFUlRZX1VVSURfUkVNT1ZFRF9BUElfVkVSU0lPTgogCiB9ICAvLyBuYW1lc3BhY2UKIApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9jb250cmliL2xpbnV4L3g2NHdsL3RocmVhZF90eXBlc19wdWJsaWMuaCBiL3NyYy9zdGFyYm9hcmQvY29udHJpYi9saW51eC94NjR3bC90aHJlYWRfdHlwZXNfcHVibGljLmgKaW5kZXggZjhkZjM1Zi4uZWM2ODc2YiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9jb250cmliL2xpbnV4L3g2NHdsL3RocmVhZF90eXBlc19wdWJsaWMuaAorKysgYi9zcmMvc3RhcmJvYXJkL2NvbnRyaWIvbGludXgveDY0d2wvdGhyZWFkX3R5cGVzX3B1YmxpYy5oCkBAIC0xLDQgKzEsNCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAvLwogLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2NvbnRyaWIvdGl6ZW4vYXJtdjdsL2NvbmZpZ3VyYXRpb25fcHVibGljLmggYi9zcmMvc3RhcmJvYXJkL2NvbnRyaWIvdGl6ZW4vYXJtdjdsL2NvbmZpZ3VyYXRpb25fcHVibGljLmgKaW5kZXggM2I5ZTk5Yi4uZTU5YjdlZSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9jb250cmliL3RpemVuL2FybXY3bC9jb25maWd1cmF0aW9uX3B1YmxpYy5oCisrKyBiL3NyYy9zdGFyYm9hcmQvY29udHJpYi90aXplbi9hcm12N2wvY29uZmlndXJhdGlvbl9wdWJsaWMuaApAQCAtMjUsMTcgKzI1LDYgQEAKIC8vIFRoZSBBUEkgdmVyc2lvbiBpbXBsZW1lbnRlZCBieSB0aGlzIHBsYXRmb3JtLgogI2RlZmluZSBTQl9BUElfVkVSU0lPTiA0CiAKLS8vIC0tLSBTeXN0ZW0gSGVhZGVyIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBXaGV0aGVyIHRoZSBjdXJyZW50IHBsYXRmb3JtIGhhcyBtaWNyb3Bob25lIHN1cHBvcnRlZC4KLSNkZWZpbmUgU0JfSEFTX01JQ1JPUEhPTkUgMAotCi0vLyBXaGV0aGVyIHRoZSBjdXJyZW50IHBsYXRmb3JtIGhhcyBzcGVlY2ggcmVjb2duaXplci4KLSNkZWZpbmUgU0JfSEFTX1NQRUVDSF9SRUNPR05JWkVSIDAKLQotLy8gV2hldGhlciB0aGUgY3VycmVudCBwbGF0Zm9ybSBoYXMgc3BlZWNoIHN5bnRoZXNpcy4KLSNkZWZpbmUgU0JfSEFTX1NQRUVDSF9TWU5USEVTSVMgMAotCiAvLyAtLS0gQXJjaGl0ZWN0dXJlIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogLy8gV2hldGhlciB0aGUgY3VycmVudCBwbGF0Zm9ybSBpcyBiaWcgZW5kaWFuLiBTQl9JU19MSVRUTEVfRU5ESUFOIHdpbGwgYmUKQEAgLTEwNCw2ICs5MywxNyBAQAogLy8gb24gdGhlIHNwZWNpZmljYWxseSBwaW5uZWQgY29yZS4KICNkZWZpbmUgU0JfSEFTX0NST1NTX0NPUkVfU0NIRURVTEVSIDEKIAorLy8gLS0tIEkvTyBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFdoZXRoZXIgdGhlIGN1cnJlbnQgcGxhdGZvcm0gaGFzIG1pY3JvcGhvbmUgc3VwcG9ydGVkLgorI2RlZmluZSBTQl9IQVNfTUlDUk9QSE9ORSAwCisKKy8vIFdoZXRoZXIgdGhlIGN1cnJlbnQgcGxhdGZvcm0gaGFzIHNwZWVjaCByZWNvZ25pemVyLgorI2RlZmluZSBTQl9IQVNfU1BFRUNIX1JFQ09HTklaRVIgMAorCisvLyBXaGV0aGVyIHRoZSBjdXJyZW50IHBsYXRmb3JtIGhhcyBzcGVlY2ggc3ludGhlc2lzLgorI2RlZmluZSBTQl9IQVNfU1BFRUNIX1NZTlRIRVNJUyAwCisKIC8vIC0tLSBNZWRpYSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAvLyBUaGUgbWF4aW11bSBhdWRpbyBiaXRyYXRlIHRoZSBwbGF0Zm9ybSBjYW4gZGVjb2RlLiAgVGhlIGZvbGxvd2luZyB2YWx1ZQpAQCAtMTQ5LDYgKzE0OSwxMiBAQAogLy8gdmFsdWUgbGVhZHMgdG8gbW9yZSBzdGFibGUgZnBzIGJ1dCBhbHNvIGNhdXNlcyB0aGUgYXBwIHRvIHVzZSBtb3JlIG1lbW9yeS4KICNkZWZpbmUgU0JfTUVESUFfTUFYSU1VTV9WSURFT19GUkFNRVMgMTIKIAorLy8gLS0tIFRpbWluZyBBUEkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFdoZXRoZXIgdGhpcyBwbGF0Zm9ybSBoYXMgYW4gQVBJIHRvIHJldHJpZXZlIGhvdyBsb25nIHRoZSBjdXJyZW50IHRocmVhZAorLy8gaGFzIHNwZW50IGluIHRoZSBleGVjdXRpbmcgc3RhdGUuCisjZGVmaW5lIFNCX0hBU19USU1FX1RIUkVBRF9OT1cgMQorCiAvLyAtLS0gQ29tbW9uIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIC8vIEluY2x1ZGUgdGhlIFRpemVuIGNvbmZpZ3VyYXRpb24gdGhhdCdzIGNvbW1vbiBiZXR3ZWVuIGFsbCBUaXplbi4KQEAgLTE1NywxMiArMTYzLDcgQEAKIC8vIC0tLSBVc2VyIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAvLyBUaGUgbWF4aW11bSBudW1iZXIgb2YgdXNlcnMgdGhhdCBjYW4gYmUgc2lnbmVkIGluIGF0IHRoZSBzYW1lIHRpbWUuCisjdW5kZWYgU0JfVVNFUl9NQVhfU0lHTkVEX0lOCiAjZGVmaW5lIFNCX1VTRVJfTUFYX1NJR05FRF9JTiAxCiAKLS8vIC0tLSBUaW1pbmcgQVBJIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBXaGV0aGVyIHRoaXMgcGxhdGZvcm0gaGFzIGFuIEFQSSB0byByZXRyaWV2ZSBob3cgbG9uZyB0aGUgY3VycmVudCB0aHJlYWQKLS8vIGhhcyBzcGVudCBpbiB0aGUgZXhlY3V0aW5nIHN0YXRlLgotI2RlZmluZSBTQl9IQVNfVElNRV9USFJFQURfTk9XIDEKLQogI2VuZGlmICAvLyBTVEFSQk9BUkRfQ09OVFJJQl9USVpFTl9BUk1WN0xfQ09ORklHVVJBVElPTl9QVUJMSUNfSF8KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvY29udHJpYi90aXplbi9zaGFyZWQvY29uZmlndXJhdGlvbl9wdWJsaWMuaCBiL3NyYy9zdGFyYm9hcmQvY29udHJpYi90aXplbi9zaGFyZWQvY29uZmlndXJhdGlvbl9wdWJsaWMuaAppbmRleCA5MTA5NjU1Li44ZjFmNDBhIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2NvbnRyaWIvdGl6ZW4vc2hhcmVkL2NvbmZpZ3VyYXRpb25fcHVibGljLmgKKysrIGIvc3JjL3N0YXJib2FyZC9jb250cmliL3RpemVuL3NoYXJlZC9jb25maWd1cmF0aW9uX3B1YmxpYy5oCkBAIC0xNCw4ICsxNCw4IEBACiAKIC8vIFRoZSBzaGFyZWQgU3RhcmJvYXJkIGNvbmZpZ3VyYXRpb24gZm9yIFJhc3BiZXJyeSBQaSBkZXZpY2VzLgogCi0jaWZuZGVmIFNUQVJCT0FSRF9USVpFTl9TSEFSRURfQ09ORklHVVJBVElPTl9QVUJMSUNfSF8KLSNkZWZpbmUgU1RBUkJPQVJEX1RJWkVOX1NIQVJFRF9DT05GSUdVUkFUSU9OX1BVQkxJQ19IXworI2lmbmRlZiBTVEFSQk9BUkRfQ09OVFJJQl9USVpFTl9TSEFSRURfQ09ORklHVVJBVElPTl9QVUJMSUNfSF8KKyNkZWZpbmUgU1RBUkJPQVJEX0NPTlRSSUJfVElaRU5fU0hBUkVEX0NPTkZJR1VSQVRJT05fUFVCTElDX0hfCiAKIC8vIC0tLSBTeXN0ZW0gSGVhZGVyIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC02NSw5ICs2NSwxMSBAQAogCiAvLyAtLS0gQXJjaGl0ZWN0dXJlIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotLy8gT24gZGVmYXVsdCBMaW51eCBkZXNrdG9wLCB5b3UgbXVzdCBiZSBhIHN1cGVydXNlciBpbiBvcmRlciB0byBzZXQgcmVhbCB0aW1lCi0vLyBzY2hlZHVsaW5nIG9uIHRocmVhZHMuCi0jZGVmaW5lIFNCX0hBU19USFJFQURfUFJJT1JJVFlfU1VQUE9SVCAwCisjZGVmaW5lIFNCX0lTX1RJWkVOX09TIDEKKworLy8gVGl6ZW4gdXNlcyBzeXN0ZW0gaWN1IHBhY2thZ2UuCisvLyB1bmRlZmluZWQgcmVmZXJlbmNlIHRvICdpY3VfNDY6OlRpbWVab25lOjpjcmVhdGVEZWZhdWx0KCknCisjZGVmaW5lIFNCX0hBU19RVUlSS19OT19USU1FWk9ORV9OQU1FX1NVUFBPUlQgMQogCiAvLyAtLS0gQXR0cmlidXRlIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMjAzLDE5ICsyMDUsNiBAQAogLy8gRGVmaW5lcyB0aGUgcGF0aCB3aGVyZSBtZW1vcnkgZGVidWdnaW5nIGxvZ3Mgc2hvdWxkIGJlIHdyaXR0ZW4gdG8uCiAjZGVmaW5lIFNCX01FTU9SWV9MT0dfUEFUSCAiL3RtcC9zdGFyYm9hcmQiCiAKLS8vIC0tLSBUaHJlYWQgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBEZWZpbmVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzaW11bHRhbmVvdXMgdGhyZWFkcyBmb3IgdGhpcyBwbGF0Zm9ybS4gU29tZQotLy8gcGxhdGZvcm1zIHJlcXVpcmUgc2hhcmluZyB0aHJlYWQgaGFuZGxlcyB3aXRoIG90aGVyIGtpbmRzIG9mIHN5c3RlbSBoYW5kbGVzLAotLy8gbGlrZSBtdXRleGVzLCBzbyB3ZSB3YW50IHRvIGtlZXAgdGhpcyBtYW5hZ2FibGUuCi0jZGVmaW5lIFNCX01BWF9USFJFQURTIDkwCi0KLS8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0aHJlYWQgbG9jYWwgc3RvcmFnZSBrZXlzIHN1cHBvcnRlZCBieSB0aGlzIHBsYXRmb3JtLgotI2RlZmluZSBTQl9NQVhfVEhSRUFEX0xPQ0FMX0tFWVMgNTEyCi0KLS8vIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgbmFtZSBmb3IgYSB0aHJlYWQsIGluY2x1ZGluZyB0aGUgTlVMTC10ZXJtaW5hdG9yLgotI2RlZmluZSBTQl9NQVhfVEhSRUFEX05BTUVfTEVOR1RIIDE2OwotCiAvLyAtLS0gR3JhcGhpY3MgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogLy8gU3BlY2lmaWVzIHdoZXRoZXIgdGhpcyBwbGF0Zm9ybSBzdXBwb3J0cyBhIHBlcmZvcm1hbnQgYWNjZWxlcmF0ZWQgYmxpdHRlcgpAQCAtMjQyLDYgKzIzMSwxMCBAQAogLy8gc2NlbmUgaGFzbid0IGNoYW5nZWQgYXJlIGVuYWJsZWQuCiAjZGVmaW5lIFNCX01VU1RfRlJFUVVFTlRMWV9GTElQX0RJU1BMQVlfQlVGRkVSIDAKIAorLy8gVGl6ZW4gVFYgcHJvZHVjdCBwb3NzaWJsZSB0byB1c2Ugd2F5bGFuZCBkaXNwbGF5IHZpZGVvIHdpbmRvdworLy8gaW5zdGVhZCBvZiBFdmFzX09iamVjdAorI2RlZmluZSBTQl9DQU5fVVNFX1dBWUxBTkRfVklERU9fV0lORE9XIDAKKwogLy8gLS0tIE5ldHdvcmsgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIC8vIFNwZWNpZmllcyB3aGV0aGVyIHRoaXMgcGxhdGZvcm0gc3VwcG9ydHMgSVBWNi4KQEAgLTI1MCw2ICsyNDMsMjMgQEAKIC8vIFNwZWNpZmllcyB3aGV0aGVyIHRoaXMgcGxhdGZvcm0gc3VwcG9ydHMgcGlwZS4KICNkZWZpbmUgU0JfSEFTX1BJUEUgMQogCisvLyAtLS0gVGhyZWFkIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gT24gZGVmYXVsdCBMaW51eCBkZXNrdG9wLCB5b3UgbXVzdCBiZSBhIHN1cGVydXNlciBpbiBvcmRlciB0byBzZXQgcmVhbCB0aW1lCisvLyBzY2hlZHVsaW5nIG9uIHRocmVhZHMuCisjZGVmaW5lIFNCX0hBU19USFJFQURfUFJJT1JJVFlfU1VQUE9SVCAwCisKKy8vIERlZmluZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHNpbXVsdGFuZW91cyB0aHJlYWRzIGZvciB0aGlzIHBsYXRmb3JtLiBTb21lCisvLyBwbGF0Zm9ybXMgcmVxdWlyZSBzaGFyaW5nIHRocmVhZCBoYW5kbGVzIHdpdGggb3RoZXIga2luZHMgb2Ygc3lzdGVtIGhhbmRsZXMsCisvLyBsaWtlIG11dGV4ZXMsIHNvIHdlIHdhbnQgdG8ga2VlcCB0aGlzIG1hbmFnYWJsZS4KKyNkZWZpbmUgU0JfTUFYX1RIUkVBRFMgOTAKKworLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIHRocmVhZCBsb2NhbCBzdG9yYWdlIGtleXMgc3VwcG9ydGVkIGJ5IHRoaXMgcGxhdGZvcm0uCisjZGVmaW5lIFNCX01BWF9USFJFQURfTE9DQUxfS0VZUyA1MTIKKworLy8gVGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBuYW1lIGZvciBhIHRocmVhZCwgaW5jbHVkaW5nIHRoZSBOVUxMLXRlcm1pbmF0b3IuCisjZGVmaW5lIFNCX01BWF9USFJFQURfTkFNRV9MRU5HVEggMTYKKwogLy8gLS0tIFR1bmVhYmxlIFBhcmFtZXRlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIC8vIFNwZWNpZmllcyB0aGUgbmV0d29yayByZWNlaXZlIGJ1ZmZlciBzaXplIGluIGJ5dGVzLCBzZXQgdmlhCkBAIC0yNzIsMTggKzI4Miw5IEBACiAjZGVmaW5lIFNCX1VTRVJfTUFYX1NJR05FRF9JTiAxCiAKIC8vIC0tLSBQbGF0Zm9ybSBTcGVjaWZpYyBBdWRpdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotI2RlZmluZSBTQl9JU19USVpFTl9PUyAxCi0KLS8vIFRpemVuIHVzZXMgc3lzdGVtIGljdSBwYWNrYWdlLgotLy8gdW5kZWZpbmVkIHJlZmVyZW5jZSB0byAnaWN1XzQ2OjpUaW1lWm9uZTo6Y3JlYXRlRGVmYXVsdCgpJwotI2RlZmluZSBTQl9IQVNfUVVJUktfTk9fVElNRVpPTkVfTkFNRV9TVVBQT1JUIDEKLQotLy8gVGl6ZW4gVFYgcHJvZHVjdCBwb3NzaWJsZSB0byB1c2Ugd2F5bGFuZCBkaXNwbGF5IHZpZGVvIHdpbmRvdwotLy8gaW5zdGVhZCBvZiBFdmFzX09iamVjdAotI2RlZmluZSBTQl9DQU5fVVNFX1dBWUxBTkRfVklERU9fV0lORE9XIDAKIAogI2lmICFkZWZpbmVkKF9fR05VQ19fKQogI2Vycm9yICJUaXplbiBidWlsZHMgbmVlZCBhIEdDQy1saWtlIGNvbXBpbGVyIChmb3IgdGhlIG1vbWVudCkuIgogI2VuZGlmCiAKLSNlbmRpZiAgLy8gU1RBUkJPQVJEX1RJWkVOX1NIQVJFRF9DT05GSUdVUkFUSU9OX1BVQkxJQ19IXworI2VuZGlmICAvLyBTVEFSQk9BUkRfQ09OVFJJQl9USVpFTl9TSEFSRURfQ09ORklHVVJBVElPTl9QVUJMSUNfSF8KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvY29udHJpYi90aXplbi9zaGFyZWQvZ3lwX2NvbmZpZ3VyYXRpb24uZ3lwaSBiL3NyYy9zdGFyYm9hcmQvY29udHJpYi90aXplbi9zaGFyZWQvZ3lwX2NvbmZpZ3VyYXRpb24uZ3lwaQppbmRleCA2ZTAwMmFkLi42ZDE2YTc4IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2NvbnRyaWIvdGl6ZW4vc2hhcmVkL2d5cF9jb25maWd1cmF0aW9uLmd5cGkKKysrIGIvc3JjL3N0YXJib2FyZC9jb250cmliL3RpemVuL3NoYXJlZC9neXBfY29uZmlndXJhdGlvbi5neXBpCkBAIC0zMiw4ICszMiw2IEBACiAgICAgJ2NvYmFsdF9lbmFibGVfaml0JzogMCwKIAogICAgICdsaW5rZXJfZmxhZ3MnOiBbCi0gICAgICAjIFdlIGRvbid0IHdyYXAgdGhlc2Ugc3ltYm9scywgYnV0IHRoaXMgZW5zdXJlcyB0aGF0IHRoZXkgYXJlbid0Ci0gICAgICAjIGxpbmtlZCBpbi4KICAgICAgICctV2wsLS13cmFwPWVnbEdldERpc3BsYXknLAogICAgIF0sCiAgICAgJ2xpbmtlcl9mbGFnc19nb2xkJzogWwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9jb250cmliL3RpemVuL3NoYXJlZC93YXlsYW5kL2FwcGxpY2F0aW9uX3RpemVuLmNjIGIvc3JjL3N0YXJib2FyZC9jb250cmliL3RpemVuL3NoYXJlZC93YXlsYW5kL2FwcGxpY2F0aW9uX3RpemVuLmNjCmluZGV4IDBkZWMzNWMuLjg1YTk0ODAgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvY29udHJpYi90aXplbi9zaGFyZWQvd2F5bGFuZC9hcHBsaWNhdGlvbl90aXplbi5jYworKysgYi9zcmMvc3RhcmJvYXJkL2NvbnRyaWIvdGl6ZW4vc2hhcmVkL3dheWxhbmQvYXBwbGljYXRpb25fdGl6ZW4uY2MKQEAgLTQ5LDYgKzQ5LDYgQEAKICAgcmV0dXJuIHdpbmRvdzsKIH0KIAotfSAgLy8gd2F5bGFuZAotfSAgLy8gc2hhcmVkCi19ICAvLyBzdGFyYm9hcmQKK30gIC8vIG5hbWVzcGFjZSB3YXlsYW5kCit9ICAvLyBuYW1lc3BhY2Ugc2hhcmVkCit9ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2NvbnRyaWIvdGl6ZW4vc2hhcmVkL3dheWxhbmQvYXBwbGljYXRpb25fdGl6ZW4uaCBiL3NyYy9zdGFyYm9hcmQvY29udHJpYi90aXplbi9zaGFyZWQvd2F5bGFuZC9hcHBsaWNhdGlvbl90aXplbi5oCmluZGV4IGU3NjZhODEuLmVlZTU4OGMgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvY29udHJpYi90aXplbi9zaGFyZWQvd2F5bGFuZC9hcHBsaWNhdGlvbl90aXplbi5oCisrKyBiL3NyYy9zdGFyYm9hcmQvY29udHJpYi90aXplbi9zaGFyZWQvd2F5bGFuZC9hcHBsaWNhdGlvbl90aXplbi5oCkBAIC00Myw4ICs0Myw4IEBACiAgIHRpemVuX3BvbGljeSogdHpfcG9saWN5XzsKIH07CiAKLX0gIC8vIHdheWxhbmQKLX0gIC8vIHNoYXJlZAotfSAgLy8gc3RhcmJvYXJkCit9ICAvLyBuYW1lc3BhY2Ugd2F5bGFuZAorfSAgLy8gbmFtZXNwYWNlIHNoYXJlZAorfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZAogCiAjZW5kaWYgIC8vIFNUQVJCT0FSRF9DT05UUklCX1RJWkVOX1NIQVJFRF9XQVlMQU5EX0FQUExJQ0FUSU9OX1RJWkVOX0hfCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2NvbnRyaWIvdGl6ZW4vc2hhcmVkL3dheWxhbmQvd2luZG93X2ludGVybmFsX3RpemVuLmNjIGIvc3JjL3N0YXJib2FyZC9jb250cmliL3RpemVuL3NoYXJlZC93YXlsYW5kL3dpbmRvd19pbnRlcm5hbF90aXplbi5jYwppbmRleCA3MjMwNTBjLi4zNGZjYTM1IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2NvbnRyaWIvdGl6ZW4vc2hhcmVkL3dheWxhbmQvd2luZG93X2ludGVybmFsX3RpemVuLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvY29udHJpYi90aXplbi9zaGFyZWQvd2F5bGFuZC93aW5kb3dfaW50ZXJuYWxfdGl6ZW4uY2MKQEAgLTM0LDggKzM0LDcgQEAKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCB0aXplbl92aXNpYmlsaXR5X2xpc3RlbmVyIHRpemVuX3Zpc2liaWxpdHlfbGlzdGVuZXIgPSB7Ci0gICAgV2luZG93Q2JWaXNpYmlsaXR5Q2hhbmdlCi19OworICAgIFdpbmRvd0NiVmlzaWJpbGl0eUNoYW5nZX07CiAKIFNiV2luZG93UHJpdmF0ZVRpemVuOjpTYldpbmRvd1ByaXZhdGVUaXplbih3bF9kaXNwbGF5KiBkaXNwbGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpemVuX3BvbGljeSogcG9saWN5LApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9kcm0uaCBiL3NyYy9zdGFyYm9hcmQvZHJtLmgKaW5kZXggNGJkZjRhYS4uYmJhNmVjNCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9kcm0uaAorKysgYi9zcmMvc3RhcmJvYXJkL2RybS5oCkBAIC0yOSw2ICsyOSwzMCBAQAogCiAvLyAtLS0gVHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAorLy8gVGhlIHR5cGUgb2YgdGhlIHNlc3Npb24gcmVxdWVzdC4KKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9lbmNyeXB0ZWQtbWVkaWEvI2lkbC1kZWYtbWVkaWFrZXltZXNzYWdldHlwZQordHlwZWRlZiBlbnVtIFNiRHJtU2Vzc2lvblJlcXVlc3RUeXBlIHsKKyAga1NiRHJtU2Vzc2lvblJlcXVlc3RUeXBlTGljZW5zZVJlcXVlc3QsCisgIGtTYkRybVNlc3Npb25SZXF1ZXN0VHlwZUxpY2Vuc2VSZW5ld2FsLAorICBrU2JEcm1TZXNzaW9uUmVxdWVzdFR5cGVMaWNlbnNlUmVsZWFzZSwKKyAga1NiRHJtU2Vzc2lvblJlcXVlc3RUeXBlSW5kaXZpZHVhbGl6YXRpb25SZXF1ZXN0LAorfSBTYkRybVNlc3Npb25SZXF1ZXN0VHlwZTsKKworLy8gVGhlIHN0YXR1cyBvZiBzZXNzaW9uIHJlbGF0ZWQgb3BlcmF0aW9ucy4KKy8vIFVzZWQgYnkgfFNiRHJtU2Vzc2lvblVwZGF0ZVJlcXVlc3RGdW5jfCwgfFNiRHJtU2Vzc2lvblVwZGF0ZWRGdW5jfCwgYW5kCisvLyB8U2JEcm1TZXJ2ZXJDZXJ0aWZpY2F0ZVVwZGF0ZWRGdW5jfCB0byBpbmRpY2F0ZSB0aGUgc3RhdHVzIG9mIHRoZSBvcGVyYXRpb24uCisvLyBodHRwczovL3czYy5naXRodWIuaW8vZW5jcnlwdGVkLW1lZGlhLyNlcnJvci1uYW1lcwordHlwZWRlZiBlbnVtIFNiRHJtU3RhdHVzIHsKKyAga1NiRHJtU3RhdHVzU3VjY2VzcywKKyAga1NiRHJtU3RhdHVzVHlwZUVycm9yLAorICBrU2JEcm1TdGF0dXNOb3RTdXBwb3J0ZWRFcnJvciwKKyAga1NiRHJtU3RhdHVzSW52YWxpZFN0YXRlRXJyb3IsCisgIGtTYkRybVN0YXR1c1F1b3RhRXhjZWVkZWRFcnJvciwKKyAgLy8gVGhlIGZvbGxvd2luZyBlcnJvciBjYW4gYmUgdXNlZCB3aGVuIHRoZSBlcnJvciBzdGF0dXMgY2Fubm90IGJlIG1hcHBlZCB0bworICAvLyBvbmUgb2YgdGhlIGFib3ZlIGVycm9ycy4KKyAga1NiRHJtU3RhdHVzVW5rbm93bkVycm9yLAorfSBTYkRybVN0YXR1czsKKwogLy8gU3RhdHVzIG9mIGEgcGFydGljdWxhciBtZWRpYSBrZXkuCiAvLyBodHRwczovL3czYy5naXRodWIuaW8vZW5jcnlwdGVkLW1lZGlhLyNpZGwtZGVmLU1lZGlhS2V5U3RhdHVzCiB0eXBlZGVmIGVudW0gU2JEcm1LZXlTdGF0dXMgewpAQCAtODksMTEgKzExMywzNCBAQAogLy8gU2JEcm1HZW5lcmF0ZVNlc3Npb25VcGRhdGVSZXF1ZXN0KCkgd2FzIGNhbGxlZCBvbi4gfGNvbnRleHR8IHdpbGwgYmUgdGhlIHNhbWUKIC8vIGNvbnRleHQgdGhhdCB3YXMgcGFzc2VkIGludG8gdGhlIGNhbGwgdG8gU2JEcm1DcmVhdGVTeXN0ZW0oKS4KIC8vCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfRFJNX1JFRklORU1FTlRfQVBJX1ZFUlNJT04KKy8vIHxzdGF0dXN8IGlzIHRoZSBzdGF0dXMgb2YgdGhlIHNlc3Npb24gcmVxdWVzdC4KKy8vCisvLyB8dHlwZXwgaXMgdGhlIHN0YXR1cyBvZiB0aGUgc2Vzc2lvbiByZXF1ZXN0LgorLy8KKy8vIHxlcnJvcl9tZXNzYWdlfCBtYXkgY29udGFpbiBhbiBvcHRpb25hbCBlcnJvciBtZXNzYWdlIHdoZW4gfHN0YXR1c3wgaXNuJ3QKKy8vIHxrU2JEcm1TdGF0dXNTdWNjZXNzfCB0byBwcm92aWRlIG1vcmUgZGV0YWlscyBhYm91dCB0aGUgZXJyb3IuICBJdCBtYXkgYmUKKy8vIE5VTEwgaWYgfHN0YXR1c3wgaXMgfGtTYkRybVN0YXR1c1N1Y2Nlc3N8IG9yIGlmIG5vIGVycm9yIG1lc3NhZ2UgY2FuIGJlCisvLyBwcm92aWRlZC4KKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfRFJNX1JFRklORU1FTlRfQVBJX1ZFUlNJT04KIC8vIHx0aWNrZXR8IHdpbGwgYmUgdGhlIHNhbWUgdGlja2V0IHRoYXQgd2FzIHBhc3NlZCB0bwogLy8gU2JEcm1HZW5lcmF0ZVNlc3Npb25VcGRhdGVSZXF1ZXN0KCkgb3IgfGtTYkRybVRpY2tldEludmFsaWR8IGlmIHRoZSB1cGRhdGUKIC8vIHJlcXVlc3Qgd2FzIGdlbmVyYXRlZCBieSB0aGUgRFJNIHN5c3RlbS4KIC8vCiAvLyB8c2Vzc2lvbl9pZHwgY2FuIGJlIE5VTEwgaWYgdGhlcmUgd2FzIGFuIGVycm9yIGdlbmVyYXRpbmcgdGhlIHJlcXVlc3QuCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfRFJNX1JFRklORU1FTlRfQVBJX1ZFUlNJT04KK3R5cGVkZWYgdm9pZCAoKlNiRHJtU2Vzc2lvblVwZGF0ZVJlcXVlc3RGdW5jKShTYkRybVN5c3RlbSBkcm1fc3lzdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkRybVN0YXR1cyBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JEcm1TZXNzaW9uUmVxdWVzdFR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlcnJvcl9tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIHNlc3Npb25faWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25faWRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBjb250ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb250ZW50X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdXJsKTsKKyNlbHNlICAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfRFJNX1JFRklORU1FTlRfQVBJX1ZFUlNJT04KIHR5cGVkZWYgdm9pZCAoKlNiRHJtU2Vzc2lvblVwZGF0ZVJlcXVlc3RGdW5jKShTYkRybVN5c3RlbSBkcm1fc3lzdGVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpY2tldCwKQEAgLTEwMiw2ICsxNDksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGNvbnRlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbnRlbnRfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB1cmwpOworI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9EUk1fUkVGSU5FTUVOVF9BUElfVkVSU0lPTgogCiAvLyBBIGNhbGxiYWNrIGZvciBub3RpZmljYXRpb25zIHRoYXQgYSBzZXNzaW9uIGhhcyBiZWVuIGFkZGVkLCBhbmQgc3Vic2VxdWVudAogLy8gZW5jcnlwdGVkIHNhbXBsZXMgYXJlIGFjdGl2ZWx5IHJlYWR5IHRvIGJlIGRlY29kZWQuIHxkcm1fc3lzdGVtfCB3aWxsIGJlIHRoZQpAQCAtMTEwLDEzICsxNTgsMzEgQEAKIC8vCiAvLyB8dGlja2V0fCB3aWxsIGJlIHRoZSBzYW1lIHRpY2tldCB0aGF0IHdhcyBwYXNzZWQgdG8gU2JEcm1VcGRhdGVTZXNzaW9uKCkuCiAvLworI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX0RSTV9SRUZJTkVNRU5UX0FQSV9WRVJTSU9OCisvLyB8c3RhdHVzfCBpcyB0aGUgc3RhdHVzIG9mIHRoZSBzZXNzaW9uIHJlcXVlc3QuCisvLworLy8gfGVycm9yX21lc3NhZ2V8IG1heSBjb250YWluIGFuIG9wdGlvbmFsIGVycm9yIG1lc3NhZ2Ugd2hlbiB8c3RhdHVzfCBpc24ndAorLy8gfGtTYkRybVN0YXR1c1N1Y2Nlc3N8IHRvIHByb3ZpZGUgbW9yZSBkZXRhaWxzIGFib3V0IHRoZSBlcnJvci4gIEl0IG1heSBiZQorLy8gTlVMTCBpZiB8c3RhdHVzfCBpcyB8a1NiRHJtU3RhdHVzU3VjY2Vzc3wgb3IgaWYgbm8gZXJyb3IgbWVzc2FnZSBjYW4gYmUKKy8vIHByb3ZpZGVkLgorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9EUk1fUkVGSU5FTUVOVF9BUElfVkVSU0lPTgogLy8gfHN1Y2NlZWRlZHwgaXMgd2hldGhlciB0aGUgc2Vzc2lvbiB3YXMgc3VjY2Vzc2Z1bGx5IHVwZGF0ZWQgb3Igbm90LgorI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX0RSTV9SRUZJTkVNRU5UX0FQSV9WRVJTSU9OCit0eXBlZGVmIHZvaWQgKCpTYkRybVNlc3Npb25VcGRhdGVkRnVuYykoU2JEcm1TeXN0ZW0gZHJtX3N5c3RlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JEcm1TdGF0dXMgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGVycm9yX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogc2Vzc2lvbl9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbl9pZF9zaXplKTsKKyNlbHNlICAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfRFJNX1JFRklORU1FTlRfQVBJX1ZFUlNJT04KIHR5cGVkZWYgdm9pZCAoKlNiRHJtU2Vzc2lvblVwZGF0ZWRGdW5jKShTYkRybVN5c3RlbSBkcm1fc3lzdGVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpY2tldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBzZXNzaW9uX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uX2lkX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZWVkZWQpOworI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9EUk1fUkVGSU5FTUVOVF9BUElfVkVSU0lPTgogCiAvLyBBIGNhbGxiYWNrIGZvciBub3RpZmljYXRpb25zIHRoYXQgdGhlIHN0YXR1cyBvZiBvbmUgb3IgbW9yZSBrZXlzIGluIGEgc2Vzc2lvbgogLy8gaGFzIGJlZW4gY2hhbmdlZC4gIEFsbCBrZXlzIG9mIHRoZSBzZXNzaW9uIGFuZCB0aGVpciBuZXcgc3RhdHVzIHdpbGwgYmUKQEAgLTE0MSw2ICsyMDcsMTYgQEAKICAgICBpbnQgc2Vzc2lvbl9pZF9zaXplKTsKICNlbmRpZiAgLy8gU0JfSEFTKERSTV9TRVNTSU9OX0NMT1NFRCkpCiAKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9EUk1fUkVGSU5FTUVOVF9BUElfVkVSU0lPTgorLy8gQSBjYWxsYmFjayB0byBub3RpZnkgdGhlIGNhbGxlciBvZiBTYkRybVVwZGF0ZVNlcnZlckNlcnRpZmljYXRlKCkgd2hldGhlciB0aGUKKy8vIHVwZGF0ZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgdXBkYXRlZCBvciBub3QuCit0eXBlZGVmIHZvaWQgKCpTYkRybVNlcnZlckNlcnRpZmljYXRlVXBkYXRlZEZ1bmMpKFNiRHJtU3lzdGVtIGRybV9zeXN0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiRHJtU3RhdHVzIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXJyb3JfbWVzc2FnZSk7CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX0RSTV9SRUZJTkVNRU5UX0FQSV9WRVJTSU9OCisKIC8vIC0tLSBDb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAvLyBBbiBpbnZhbGlkIFNiRHJtU3lzdGVtLgpAQCAtMTgyLDkgKzI1OCwzMSBAQAogLy8gU2JEcm1VcGRhdGVTZXNzaW9uKCkgaXMgY2FsbGVkLgogLy8gfGtleV9zdGF0dXNlc19jaGFuZ2VkX2NhbGxiYWNrfDogQSBmdW5jdGlvbiB0aGF0IGNhbiBiZSBjYWxsZWQgdG8gaW5kaWNhdGUKIC8vIHRoYXQga2V5IHN0YXR1c2VzIGhhdmUgY2hhbmdlZC4KLS8vIHxzZXNzaW9uX2Nsb3NlZF9jYWxsYmFja3w6IEEgZnVuY3Rpb24gdGhhdCBjYW4gYmUgY2FsbGVkIHRvIGluZGljYXRlIHRoYXQKLS8vIGEgc2Vzc2lvbiBoYXMgY2xvc2VkLgotI2lmIFNCX0hBUyhEUk1fU0VTU0lPTl9DTE9TRUQpCisvLyB8c2VydmVyX2NlcnRpZmljYXRlX3VwZGF0ZWRfY2FsbGJhY2t8OiBBIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHRvIHJlcG9ydAorLy8gd2hldGhlciB0aGUgc2VydmVyIGNlcnRpZmljYXRlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSB1cGRhdGVkLiAgSXQgaXMgY2FsbGVkCisvLyBvbmNlIGFuZCBvbmx5IG9uY2UuICBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBjYWxsYmFjayBpcyBjYWxsZWQgYmVmb3JlIHRoZQorLy8gZnVuY3Rpb24gcmV0dXJucy4KKy8vIHxzZXNzaW9uX2Nsb3NlZF9jYWxsYmFja3w6IEEgZnVuY3Rpb24gdGhhdCBjYW4gYmUgY2FsbGVkIHRvIGluZGljYXRlIHRoYXQgYQorLy8gc2Vzc2lvbiBoYXMgY2xvc2VkLgorI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX05VTExfQ0FMTEJBQ0tTX0lOVkFMSURfUkVUVVJOX0FQSV9WRVJTSU9OCisvLyBJZiB8TlVMTHwgaXMgcGFzc2VkIGZvciBhbnkgb2YgdGhlIGNhbGxiYWNrcyAofHVwZGF0ZV9yZXF1ZXN0X2NhbGxiYWNrfCwKKy8vIHxzZXNzaW9uX3VwZGF0ZWRfY2FsbGJhY2t8LCB8a2V5X3N0YXR1c2VzX2NoYW5nZWRfY2FsbGJhY2t8LAorLy8gfHNlcnZlcl9jZXJ0aWZpY2F0ZV91cGRhdGVkX2NhbGxiYWNrfCwgb3IgfHNlc3Npb25fY2xvc2VkX2NhbGxiYWNrfCksIHRoZW4KKy8vIHxrU2JEcm1TeXN0ZW1JbnZhbGlkfCBtdXN0IGJlIHJldHVybmVkLgorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9OVUxMX0NBTExCQUNLU19JTlZBTElEX1JFVFVSTl9BUElfVkVSU0lPTgorCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfRFJNX1JFRklORU1FTlRfQVBJX1ZFUlNJT04KKworU0JfRVhQT1JUIFNiRHJtU3lzdGVtIFNiRHJtQ3JlYXRlU3lzdGVtKAorICAgIGNvbnN0IGNoYXIqIGtleV9zeXN0ZW0sCisgICAgdm9pZCogY29udGV4dCwKKyAgICBTYkRybVNlc3Npb25VcGRhdGVSZXF1ZXN0RnVuYyB1cGRhdGVfcmVxdWVzdF9jYWxsYmFjaywKKyAgICBTYkRybVNlc3Npb25VcGRhdGVkRnVuYyBzZXNzaW9uX3VwZGF0ZWRfY2FsbGJhY2ssCisgICAgU2JEcm1TZXNzaW9uS2V5U3RhdHVzZXNDaGFuZ2VkRnVuYyBrZXlfc3RhdHVzZXNfY2hhbmdlZF9jYWxsYmFjaywKKyAgICBTYkRybVNlcnZlckNlcnRpZmljYXRlVXBkYXRlZEZ1bmMgc2VydmVyX2NlcnRpZmljYXRlX3VwZGF0ZWRfY2FsbGJhY2ssCisgICAgU2JEcm1TZXNzaW9uQ2xvc2VkRnVuYyBzZXNzaW9uX2Nsb3NlZF9jYWxsYmFjayk7CisKKyNlbGlmIFNCX0hBUyhEUk1fU0VTU0lPTl9DTE9TRUQpCiAKICNpZiAhU0JfSEFTKERSTV9LRVlfU1RBVFVTRVMpCiAjZXJyb3IgIlBsYXRmb3JtcyB3aXRoIFNCX0hBU19EUk1fU0VTU0lPTl9DTE9TRUQgbXVzdCBhbHNvIHNldCAiCkBAIC0yNDEsNyArMzM5LDcgQEAKIC8vIHx0aWNrZXR8OiBUaGUgb3BhcXVlIElEIHRoYXQgYWxsb3dzIHRvIGRpc3Rpbmd1aXNoIGNhbGxiYWNrcyBmcm9tIG11bHRpcGxlCiAvLyBjb25jdXJyZW50IGNhbGxzIHRvIFNiRHJtR2VuZXJhdGVTZXNzaW9uVXBkYXRlUmVxdWVzdCgpLCB3aGljaCB3aWxsIGJlIHBhc3NlZAogLy8gdG8gfHVwZGF0ZV9yZXF1ZXN0X2NhbGxiYWNrfCBhcy1pcy4gSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIgdG8KLS8vIGVzdGFibGlzaCB0aWNrZXQgdW5pcXVlbmVzcywgaXNzdWluZyBtdWx0aXBsZSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgdGlja2V0CisvLyBlc3RhYmxpc2ggdGlja2V0IHVuaXF1ZW5lc3MsIGlzc3VpbmcgbXVsdGlwbGUgcmVxdWVzdHMgd2l0aCB0aGUgc2FtZSB0aWNrZXQKIC8vIG1heSByZXN1bHQgaW4gdW5kZWZpbmVkIGJlaGF2aW9yLiBUaGUgdmFsdWUgfGtTYkRybVRpY2tldEludmFsaWR8IG11c3Qgbm90IGJlCiAvLyB1c2VkLgogLy8KQEAgLTMwNyw2ICs0MDUsMzcgQEAKIC8vIHxkcm1fc3lzdGVtfDogVGhlIERSTSBzeXN0ZW0gZm9yIHdoaWNoIGtleXMgc2hvdWxkIGJlIHJlbW92ZWQuCiBTQl9FWFBPUlQgdm9pZCBTYkRybVJlbW92ZUFsbEtleXMoU2JEcm1TeXN0ZW0gZHJtX3N5c3RlbSk7CiAKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9EUk1fUkVGSU5FTUVOVF9BUElfVkVSU0lPTgorCisvLyBSZXR1cm5zIHRydWUgaWYgc2VydmVyIGNlcnRpZmljYXRlIG9mIHxkcm1fc3lzdGVtfCBjYW4gYmUgdXBkYXRlZCB2aWEKKy8vIFNiRHJtVXBkYXRlU2VydmVyQ2VydGlmaWNhdGUoKS4gIFRoZSByZXR1cm4gdmFsdWUgc2hvdWxkIHJlbWFpbiB0aGUgc2FtZQorLy8gZHVyaW5nIHRoZSBsaWZlIHRpbWUgb2YgfGRybV9zeXN0ZW18LgorLy8KKy8vIHxkcm1fc3lzdGVtfDogVGhlIERSTSBzeXN0ZW0gdG8gY2hlY2sgaWYgaXRzIHNlcnZlciBjZXJ0aWZpY2F0ZSBpcyB1cGRhdGFibGUuCitTQl9FWFBPUlQgYm9vbCBTYkRybUlzU2VydmVyQ2VydGlmaWNhdGVVcGRhdGFibGUoU2JEcm1TeXN0ZW0gZHJtX3N5c3RlbSk7CisKKy8vIFVwZGF0ZSB0aGUgc2VydmVyIGNlcnRpZmljYXRlIG9mIHxkcm1fc3lzdGVtfC4gIFRoZSBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkCisvLyBtdWx0aXBsZSB0aW1lcy4gIEl0IGlzIHBvc3NpYmxlIHRoYXQgYSBjYWxsIHRvIGl0IGhhcHBlbnMgYmVmb3JlIHRoZSBjYWxsYmFjaworLy8gb2YgYSBwcmV2aW91cyBjYWxsIGlzIGNhbGxlZC4KKy8vIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBhZnRlcgorLy8gfFNiRHJtSXNTZXJ2ZXJDZXJ0aWZpY2F0ZVVwZGF0YWJsZXwgaXMgY2FsbGVkIGZpcnN0IGFuZCByZXR1cm5lZCB0cnVlLgorLy8KKy8vIHxkcm1fc3lzdGVtfDogVGhlIERSTSBzeXN0ZW0gd2hvc2Ugc2VydmVyIGNlcnRpZmljYXRlIGlzIGJlaW5nIHVwZGF0ZWQuCisvLyB8dGlja2V0fDogVGhlIG9wYXF1ZSBJRCB0aGF0IGFsbG93cyB0byBkaXN0aW5ndWlzaCBjYWxsYmFja3MgZnJvbSBtdWx0aXBsZQorLy8gY29uY3VycmVudCBjYWxscyB0byBTYkRybVVwZGF0ZVNlcnZlckNlcnRpZmljYXRlKCksIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvCisvLyB8c2VydmVyX2NlcnRpZmljYXRlX3VwZGF0ZWRfY2FsbGJhY2t8IGFzLWlzLiBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlCisvLyBjYWxsZXIgdG8gZXN0YWJsaXNoIHRpY2tldCB1bmlxdWVuZXNzLCBpc3N1aW5nIG11bHRpcGxlIHJlcXVlc3RzIHdpdGggdGhlCisvLyBzYW1lIHRpY2tldCBtYXkgcmVzdWx0IGluIHVuZGVmaW5lZCBiZWhhdmlvci4gVGhlIHZhbHVlIHxrU2JEcm1UaWNrZXRJbnZhbGlkfAorLy8gbXVzdCBub3QgYmUgdXNlZC4KKy8vIHxjZXJ0aWZpY2F0ZXw6IFBvaW50ZXIgdG8gdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZSBkYXRhLgorLy8gfGNlcnRpZmljYXRlX3NpemV8OiBTaXplIG9mIHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUgZGF0YS4KK1NCX0VYUE9SVCB2b2lkIFNiRHJtVXBkYXRlU2VydmVyQ2VydGlmaWNhdGUoU2JEcm1TeXN0ZW0gZHJtX3N5c3RlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogY2VydGlmaWNhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjZXJ0aWZpY2F0ZV9zaXplKTsKKworI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9EUk1fUkVGSU5FTUVOVF9BUElfVkVSU0lPTgorCiAvLyBEZXN0cm95cyB8ZHJtX3N5c3RlbXwsIHdoaWNoIGltcGxpY2l0bHkgcmVtb3ZlcyBhbGwga2V5cyBpbnN0YWxsZWQgaW4gaXQgYW5kCiAvLyBpbnZhbGlkYXRlcyBhbGwgb3V0c3RhbmRpbmcgc2Vzc2lvbiB1cGRhdGUgcmVxdWVzdHMuIEEgRFJNIHN5c3RlbSBjYW5ub3QgYmUKIC8vIGRlc3Ryb3llZCB1bmxlc3MgYW55IGFzc29jaWF0ZWQgU2JQbGF5ZXIgb3IgU2JEZWNvZGVyIGhhcyBmaXJzdCBiZWVuCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2lucHV0LmggYi9zcmMvc3RhcmJvYXJkL2lucHV0LmgKaW5kZXggZWJjMTA4Yi4uZTYxZDAwNCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9pbnB1dC5oCisrKyBiL3NyYy9zdGFyYm9hcmQvaW5wdXQuaApAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgInN0YXJib2FyZC9jb25maWd1cmF0aW9uLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL2V4cG9ydC5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9rZXkuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvdGltZS5oIgogI2luY2x1ZGUgInN0YXJib2FyZC90eXBlcy5oIgogI2luY2x1ZGUgInN0YXJib2FyZC93aW5kb3cuaCIKIApAQCAtMTQ3LDYgKzE0OCwxNSBAQAogCiAvLyBFdmVudCBkYXRhIGZvciB8a1NiRXZlbnRUeXBlSW5wdXR8IGV2ZW50cy4KIHR5cGVkZWYgc3RydWN0IFNiSW5wdXREYXRhIHsKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9JTlBVVF9USU1FU1RBTVBfQVBJX1ZFUlNJT04KKyAgLy8gVGhlIHRpbWUgdGhhdCBzaG91bGQgYmUgcmVwb3J0ZWQgZm9yIHRoaXMgZXZlbnQuIFRoaXMgaXMgaW50ZW5kZWQgdG8KKyAgLy8gZmFjaWxpdGF0ZSBjYWxjdWxhdGlvbiBvZiB0aW1lLXNlbnNpdGl2ZSBpbmZvcm1hdGlvbiAoZS5nLiB2ZWxvY2l0eSBmb3IKKyAgLy8ga1NiSW5wdXRFdmVudFR5cGVNb3ZlKS4gVGhpcyBtYXkgYmUgc2V0IHRvIDAgdG8gaGF2ZSB0aGUgcmVsZXZhbnQgc3lzdGVtcworICAvLyBhdXRvbWF0aWNhbGx5IHNldCB0aGUgdGltZXN0YW1wLiBIb3dldmVyLCB0aGlzIG1heSBoYXBwZW4gYXQgYSBsYXRlciB0aW1lLAorICAvLyBzbyB0aGUgcmVsYXRpdmUgdGltZSBiZXR3ZWVuIGV2ZW50cyBtYXkgbm90IGJlIHByZXNlcnZlZC4KKyAgU2JUaW1lTW9ub3RvbmljIHRpbWVzdGFtcDsKKyNlbmRpZgorCiAgIC8vIFRoZSB3aW5kb3cgaW4gd2hpY2ggdGhlIGlucHV0IHdhcyBnZW5lcmF0ZWQuCiAgIFNiV2luZG93IHdpbmRvdzsKIApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9saW51eC9zaGFyZWQvQlVJTEQuZ24gYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9CVUlMRC5nbgppbmRleCA3M2NlNzRlLi4wMTFmYjI2IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9CVUlMRC5nbgorKysgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9CVUlMRC5nbgpAQCAtNTUxLDcgKzU1MSw5IEBACiAgICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RybV9jcmVhdGVfc3lzdGVtLmNjIiwKICAgICAiLy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZHJtX2Rlc3Ryb3lfc3lzdGVtLmNjIiwKICAgICAiLy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZHJtX2dlbmVyYXRlX3Nlc3Npb25fdXBkYXRlX3JlcXVlc3QuY2MiLAorICAgICIvL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9kcm1faXNfc2VydmVyX2NlcnRpZmljYXRlX3VwZGF0YWJsZS5jYyIsCiAgICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RybV9zeXN0ZW1faW50ZXJuYWwuaCIsCisgICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RybV91cGRhdGVfc2VydmVyX2NlcnRpZmljYXRlLmNjIiwKICAgICAiLy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZHJtX3VwZGF0ZV9zZXNzaW9uLmNjIiwKICAgICAiLy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvaW1hZ2VfZGVjb2RlLmNjIiwKICAgICAiLy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvaW1hZ2VfaXNfZGVjb2RlX3N1cHBvcnRlZC5jYyIsCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9jb21waWxlcl9mbGFncy5neXBpIGIvc3JjL3N0YXJib2FyZC9saW51eC9zaGFyZWQvY29tcGlsZXJfZmxhZ3MuZ3lwaQppbmRleCAyMjIzYjMwLi5jODA0ZDZhIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9jb21waWxlcl9mbGFncy5neXBpCisrKyBiL3NyYy9zdGFyYm9hcmQvbGludXgvc2hhcmVkL2NvbXBpbGVyX2ZsYWdzLmd5cGkKQEAgLTEwNyw2ICsxMDcsOSBAQAogICAgICdjZmxhZ3NfY2MnOiBbCiAgICAgICAnLXN0ZD1nbnUrKzExJywKICAgICBdLAorICAgICdsZGZsYWdzJzogWworICAgICAgJy1XbCwtcnBhdGg9JE9SSUdJTi9saWInLAorICAgIF0sCiAgICAgJ3RhcmdldF9jb25kaXRpb25zJzogWwogICAgICAgWydzYl9wZWRhbnRpY193YXJuaW5ncz09MScsIHsKICAgICAgICAgJ2NmbGFncyc6IFsKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbGludXgvc2hhcmVkL2NvbmZpZ3VyYXRpb24uZ25pIGIvc3JjL3N0YXJib2FyZC9saW51eC9zaGFyZWQvY29uZmlndXJhdGlvbi5nbmkKaW5kZXggOTljYjc4ZS4uYzZjYzhkMCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9saW51eC9zaGFyZWQvY29uZmlndXJhdGlvbi5nbmkKKysrIGIvc3JjL3N0YXJib2FyZC9saW51eC9zaGFyZWQvY29uZmlndXJhdGlvbi5nbmkKQEAgLTMzLDcgKzMzLDcgQEAKIGdsX3R5cGUgPSAic3lzdGVtX2dsZXMzIgogCiAjIFVzZSBtZWRpYSBzb3VyY2UgZXh0ZW5zaW9uIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgY29uZm9ybWVkIHRvIHRoZQotIyBDYW5kaWRhdGUgUmVjb21tYW5kYXRpb24gb2YgSnVseSA1dGggMjAxNi4KKyMgQ2FuZGlkYXRlIFJlY29tbWVuZGF0aW9uIG9mIEp1bHkgNXRoIDIwMTYuCiBjb2JhbHRfdXNlX21lZGlhX3NvdXJjZV8yMDE2ID0gdHJ1ZQogCiAjIFVzZSBBU0FOIGJ5IGRlZmF1bHQgd2hlbiBidWlsZGluZyB3aXRoIENsYW5nLgpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9saW51eC9zaGFyZWQvY29uZmlndXJhdGlvbl9wdWJsaWMuaCBiL3NyYy9zdGFyYm9hcmQvbGludXgvc2hhcmVkL2NvbmZpZ3VyYXRpb25fcHVibGljLmgKaW5kZXggZTBjYmU4ZS4uOGY1MWE5ZiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9saW51eC9zaGFyZWQvY29uZmlndXJhdGlvbl9wdWJsaWMuaAorKysgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9jb25maWd1cmF0aW9uX3B1YmxpYy5oCkBAIC0yNCw3ICsyNCw3IEBACiAjZGVmaW5lIFNUQVJCT0FSRF9MSU5VWF9TSEFSRURfQ09ORklHVVJBVElPTl9QVUJMSUNfSF8KIAogI2lmbmRlZiBTQl9BUElfVkVSU0lPTgotI2RlZmluZSBTQl9BUElfVkVSU0lPTiA2CisjZGVmaW5lIFNCX0FQSV9WRVJTSU9OIFNCX0VYUEVSSU1FTlRBTF9BUElfVkVSU0lPTgogI2VuZGlmCiAKIC8vIC0tLSBTeXN0ZW0gSGVhZGVyIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNTksMTUgKzU5LDYgQEAKIC8vIFdoZXRoZXIgdGhlIGN1cnJlbnQgcGxhdGZvcm0gcHJvdmlkZXMgc3NpemVfdC4KICNkZWZpbmUgU0JfSEFTX1NTSVpFX1QgMQogCi0vLyBXaGV0aGVyIHRoZSBjdXJyZW50IHBsYXRmb3JtIGhhcyBtaWNyb3Bob25lIHN1cHBvcnRlZC4KLSNkZWZpbmUgU0JfSEFTX01JQ1JPUEhPTkUgMAotCi0vLyBXaGV0aGVyIHRoZSBjdXJyZW50IHBsYXRmb3JtIGhhcyBzcGVlY2ggcmVjb2duaXplci4KLSNkZWZpbmUgU0JfSEFTX1NQRUVDSF9SRUNPR05JWkVSIDAKLQotLy8gV2hldGhlciB0aGUgY3VycmVudCBwbGF0Zm9ybSBoYXMgc3BlZWNoIHN5bnRoZXNpcy4KLSNkZWZpbmUgU0JfSEFTX1NQRUVDSF9TWU5USEVTSVMgMAotCiAvLyBUeXBlIGRldGVjdGlvbiBmb3Igd2NoYXJfdC4KICNpZiBkZWZpbmVkKF9fV0NIQVJfTUFYX18pICYmIFwKICAgICAoX19XQ0hBUl9NQVhfXyA9PSAweDdmZmZmZmZmIHx8IF9fV0NIQVJfTUFYX18gPT0gMHhmZmZmZmZmZikKQEAgLTg1LDEyICs3Niw2IEBACiAjZGVmaW5lIFNCX0lTX1dDSEFSX1RfU0lHTkVEIDEKICNlbmRpZgogCi0vLyAtLS0gQXJjaGl0ZWN0dXJlIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gT24gZGVmYXVsdCBMaW51eCBkZXNrdG9wLCB5b3UgbXVzdCBiZSBhIHN1cGVydXNlciBpbiBvcmRlciB0byBzZXQgcmVhbCB0aW1lCi0vLyBzY2hlZHVsaW5nIG9uIHRocmVhZHMuCi0jZGVmaW5lIFNCX0hBU19USFJFQURfUFJJT1JJVFlfU1VQUE9SVCAwCi0KIC8vIC0tLSBBdHRyaWJ1dGUgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAvLyBUaGUgcGxhdGZvcm0ncyBhbm5vdGF0aW9uIGZvciBmb3JjaW5nIGEgQyBmdW5jdGlvbiB0byBiZSBpbmxpbmVkLgpAQCAtMTg3LDU0ICsxNzIsNiBAQAogLy8gVGhlIHN0cmluZyBmb3JtIG9mIFNCX1BBVEhfU0VQX0NIQVIuCiAjZGVmaW5lIFNCX1BBVEhfU0VQX1NUUklORyAiOiIKIAotLy8gLS0tIE1lbW9yeSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIFRoZSBtZW1vcnkgcGFnZSBzaXplLCB3aGljaCBjb250cm9scyB0aGUgc2l6ZSBvZiBjaHVua3Mgb24gbWVtb3J5IHRoYXQKLS8vIGFsbG9jYXRvcnMgZGVhbCB3aXRoLCBhbmQgdGhlIGFsaWdubWVudCBvZiB0aG9zZSBjaHVua3MuIFRoaXMgZG9lc24ndCBoYXZlIHRvCi0vLyBiZSB0aGUgaGFyZHdhcmUtZGVmaW5lZCBwaHlzaWNhbCBwYWdlIHNpemUsIGJ1dCBpdCBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZgotLy8gaXQuCi0jZGVmaW5lIFNCX01FTU9SWV9QQUdFX1NJWkUgNDA5NgotCi0vLyBXaGV0aGVyIHRoaXMgcGxhdGZvcm0gaGFzIGFuZCBzaG91bGQgdXNlIGFuIE1NQVAgZnVuY3Rpb24gdG8gbWFwIHBoeXNpY2FsCi0vLyBtZW1vcnkgdG8gdGhlIHZpcnR1YWwgYWRkcmVzcyBzcGFjZS4KLSNkZWZpbmUgU0JfSEFTX01NQVAgMQotCi0vLyBXaGV0aGVyIHRoaXMgcGxhdGZvcm0gY2FuIG1hcCBleGVjdXRhYmxlIG1lbW9yeS4gSW1wbGllcyBTQl9IQVNfTU1BUC4gVGhpcyBpcwotLy8gcmVxdWlyZWQgZm9yIHBsYXRmb3JtcyB0aGF0IHdhbnQgdG8gSklULgotI2RlZmluZSBTQl9DQU5fTUFQX0VYRUNVVEFCTEVfTUVNT1JZIDEKLQotLy8gV2hldGhlciB0aGlzIHBsYXRmb3JtIGhhcyBhbmQgc2hvdWxkIHVzZSBhbiBncm93YWJsZSBoZWFwIChlLmcuIHdpdGggc2JyaygpKQotLy8gdG8gbWFwIHBoeXNpY2FsIG1lbW9yeSB0byB0aGUgdmlydHVhbCBhZGRyZXNzIHNwYWNlLgotI2RlZmluZSBTQl9IQVNfVklSVFVBTF9SRUdJT05TIDAKLQotLy8gU3BlY2lmaWVzIHRoZSBhbGlnbm1lbnQgZm9yIElPIEJ1ZmZlcnMsIGluIGJ5dGVzLiBTb21lIGxvdy1sZXZlbCBuZXR3b3JrIEFQSXMKLS8vIG1heSByZXF1aXJlIGJ1ZmZlcnMgdG8gaGF2ZSBhIHNwZWNpZmljIGFsaWdubWVudCwgYW5kIHRoaXMgaXMgdGhlIHBsYWNlIHRvCi0vLyBzcGVjaWZ5IHRoYXQuCi0jZGVmaW5lIFNCX05FVFdPUktfSU9fQlVGRkVSX0FMSUdOTUVOVCAxNgotCi0vLyBEZXRlcm1pbmVzIHRoZSBhbGlnbm1lbnQgdGhhdCBhbGxvY2F0aW9ucyBzaG91bGQgaGF2ZSBvbiB0aGlzIHBsYXRmb3JtLgotI2RlZmluZSBTQl9NQUxMT0NfQUxJR05NRU5UICgoc2l6ZV90KTE2VSkKLQotLy8gRGV0ZXJtaW5lcyB0aGUgdGhyZXNoaG9sZCBvZiBhbGxvY2F0aW9uIHNpemUgdGhhdCBzaG91bGQgYmUgZG9uZSB3aXRoIG1tYXAKLS8vIChpZiBhdmFpbGFibGUpLCByYXRoZXIgdGhhbiBhbGxvY2F0ZWQgd2l0aGluIHRoZSBjb3JlIGhlYXAuCi0jZGVmaW5lIFNCX0RFRkFVTFRfTU1BUF9USFJFU0hPTEQgKChzaXplX3QpKDI1NiAqIDEwMjRVKSkKLQotLy8gRGVmaW5lcyB0aGUgcGF0aCB3aGVyZSBtZW1vcnkgZGVidWdnaW5nIGxvZ3Mgc2hvdWxkIGJlIHdyaXR0ZW4gdG8uCi0jZGVmaW5lIFNCX01FTU9SWV9MT0dfUEFUSCAiL3RtcC9zdGFyYm9hcmQiCi0KLS8vIC0tLSBUaHJlYWQgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBEZWZpbmVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzaW11bHRhbmVvdXMgdGhyZWFkcyBmb3IgdGhpcyBwbGF0Zm9ybS4gU29tZQotLy8gcGxhdGZvcm1zIHJlcXVpcmUgc2hhcmluZyB0aHJlYWQgaGFuZGxlcyB3aXRoIG90aGVyIGtpbmRzIG9mIHN5c3RlbSBoYW5kbGVzLAotLy8gbGlrZSBtdXRleGVzLCBzbyB3ZSB3YW50IHRvIGtlZXAgdGhpcyBtYW5hZ2FibGUuCi0jZGVmaW5lIFNCX01BWF9USFJFQURTIDkwCi0KLS8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0aHJlYWQgbG9jYWwgc3RvcmFnZSBrZXlzIHN1cHBvcnRlZCBieSB0aGlzIHBsYXRmb3JtLgotI2RlZmluZSBTQl9NQVhfVEhSRUFEX0xPQ0FMX0tFWVMgNTEyCi0KLS8vIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgbmFtZSBmb3IgYSB0aHJlYWQsIGluY2x1ZGluZyB0aGUgTlVMTC10ZXJtaW5hdG9yLgotI2RlZmluZSBTQl9NQVhfVEhSRUFEX05BTUVfTEVOR1RIIDE2OwotCiAvLyAtLS0gR3JhcGhpY3MgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogLy8gU3BlY2lmaWVzIHdoZXRoZXIgdGhpcyBwbGF0Zm9ybSBzdXBwb3J0cyBhIHBlcmZvcm1hbnQgYWNjZWxlcmF0ZWQgYmxpdHRlcgpAQCAtMjU3LDYgKzE5NCwxNyBAQAogLy8gc2NlbmUgaGFzbid0IGNoYW5nZWQgYXJlIGVuYWJsZWQuCiAjZGVmaW5lIFNCX01VU1RfRlJFUVVFTlRMWV9GTElQX0RJU1BMQVlfQlVGRkVSIDAKIAorLy8gLS0tIEkvTyBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFdoZXRoZXIgdGhlIGN1cnJlbnQgcGxhdGZvcm0gaGFzIG1pY3JvcGhvbmUgc3VwcG9ydGVkLgorI2RlZmluZSBTQl9IQVNfTUlDUk9QSE9ORSAwCisKKy8vIFdoZXRoZXIgdGhlIGN1cnJlbnQgcGxhdGZvcm0gaGFzIHNwZWVjaCByZWNvZ25pemVyLgorI2RlZmluZSBTQl9IQVNfU1BFRUNIX1JFQ09HTklaRVIgMAorCisvLyBXaGV0aGVyIHRoZSBjdXJyZW50IHBsYXRmb3JtIGhhcyBzcGVlY2ggc3ludGhlc2lzLgorI2RlZmluZSBTQl9IQVNfU1BFRUNIX1NZTlRIRVNJUyAwCisKIC8vIC0tLSBNZWRpYSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAvLyBUaGUgbWF4aW11bSBhdWRpbyBiaXRyYXRlIHRoZSBwbGF0Zm9ybSBjYW4gZGVjb2RlLiAgVGhlIGZvbGxvd2luZyB2YWx1ZQpAQCAtMzEyLDYgKzI2MCw0MSBAQAogLy8gdmFsdWUgbGVhZHMgdG8gbW9yZSBzdGFibGUgZnBzIGJ1dCBhbHNvIGNhdXNlcyB0aGUgYXBwIHRvIHVzZSBtb3JlIG1lbW9yeS4KICNkZWZpbmUgU0JfTUVESUFfTUFYSU1VTV9WSURFT19GUkFNRVMgMTIKIAorLy8gLS0tIE1lbW9yeSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRoZSBtZW1vcnkgcGFnZSBzaXplLCB3aGljaCBjb250cm9scyB0aGUgc2l6ZSBvZiBjaHVua3Mgb24gbWVtb3J5IHRoYXQKKy8vIGFsbG9jYXRvcnMgZGVhbCB3aXRoLCBhbmQgdGhlIGFsaWdubWVudCBvZiB0aG9zZSBjaHVua3MuIFRoaXMgZG9lc24ndCBoYXZlIHRvCisvLyBiZSB0aGUgaGFyZHdhcmUtZGVmaW5lZCBwaHlzaWNhbCBwYWdlIHNpemUsIGJ1dCBpdCBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZgorLy8gaXQuCisjZGVmaW5lIFNCX01FTU9SWV9QQUdFX1NJWkUgNDA5NgorCisvLyBXaGV0aGVyIHRoaXMgcGxhdGZvcm0gaGFzIGFuZCBzaG91bGQgdXNlIGFuIE1NQVAgZnVuY3Rpb24gdG8gbWFwIHBoeXNpY2FsCisvLyBtZW1vcnkgdG8gdGhlIHZpcnR1YWwgYWRkcmVzcyBzcGFjZS4KKyNkZWZpbmUgU0JfSEFTX01NQVAgMQorCisvLyBXaGV0aGVyIHRoaXMgcGxhdGZvcm0gY2FuIG1hcCBleGVjdXRhYmxlIG1lbW9yeS4gSW1wbGllcyBTQl9IQVNfTU1BUC4gVGhpcyBpcworLy8gcmVxdWlyZWQgZm9yIHBsYXRmb3JtcyB0aGF0IHdhbnQgdG8gSklULgorI2RlZmluZSBTQl9DQU5fTUFQX0VYRUNVVEFCTEVfTUVNT1JZIDEKKworLy8gV2hldGhlciB0aGlzIHBsYXRmb3JtIGhhcyBhbmQgc2hvdWxkIHVzZSBhbiBncm93YWJsZSBoZWFwIChlLmcuIHdpdGggc2JyaygpKQorLy8gdG8gbWFwIHBoeXNpY2FsIG1lbW9yeSB0byB0aGUgdmlydHVhbCBhZGRyZXNzIHNwYWNlLgorI2RlZmluZSBTQl9IQVNfVklSVFVBTF9SRUdJT05TIDAKKworLy8gU3BlY2lmaWVzIHRoZSBhbGlnbm1lbnQgZm9yIElPIEJ1ZmZlcnMsIGluIGJ5dGVzLiBTb21lIGxvdy1sZXZlbCBuZXR3b3JrIEFQSXMKKy8vIG1heSByZXF1aXJlIGJ1ZmZlcnMgdG8gaGF2ZSBhIHNwZWNpZmljIGFsaWdubWVudCwgYW5kIHRoaXMgaXMgdGhlIHBsYWNlIHRvCisvLyBzcGVjaWZ5IHRoYXQuCisjZGVmaW5lIFNCX05FVFdPUktfSU9fQlVGRkVSX0FMSUdOTUVOVCAxNgorCisvLyBEZXRlcm1pbmVzIHRoZSBhbGlnbm1lbnQgdGhhdCBhbGxvY2F0aW9ucyBzaG91bGQgaGF2ZSBvbiB0aGlzIHBsYXRmb3JtLgorI2RlZmluZSBTQl9NQUxMT0NfQUxJR05NRU5UICgoc2l6ZV90KTE2VSkKKworLy8gRGV0ZXJtaW5lcyB0aGUgdGhyZXNoaG9sZCBvZiBhbGxvY2F0aW9uIHNpemUgdGhhdCBzaG91bGQgYmUgZG9uZSB3aXRoIG1tYXAKKy8vIChpZiBhdmFpbGFibGUpLCByYXRoZXIgdGhhbiBhbGxvY2F0ZWQgd2l0aGluIHRoZSBjb3JlIGhlYXAuCisjZGVmaW5lIFNCX0RFRkFVTFRfTU1BUF9USFJFU0hPTEQgKChzaXplX3QpKDI1NiAqIDEwMjRVKSkKKworLy8gRGVmaW5lcyB0aGUgcGF0aCB3aGVyZSBtZW1vcnkgZGVidWdnaW5nIGxvZ3Mgc2hvdWxkIGJlIHdyaXR0ZW4gdG8uCisjZGVmaW5lIFNCX01FTU9SWV9MT0dfUEFUSCAiL3RtcC9zdGFyYm9hcmQiCisKIC8vIC0tLSBOZXR3b3JrIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAvLyBTcGVjaWZpZXMgd2hldGhlciB0aGlzIHBsYXRmb3JtIHN1cHBvcnRzIElQVjYuCkBAIC0zMjAsNiArMzAzLDIzIEBACiAvLyBTcGVjaWZpZXMgd2hldGhlciB0aGlzIHBsYXRmb3JtIHN1cHBvcnRzIHBpcGUuCiAjZGVmaW5lIFNCX0hBU19QSVBFIDEKIAorLy8gLS0tIFRocmVhZCBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIE9uIGRlZmF1bHQgTGludXggZGVza3RvcCwgeW91IG11c3QgYmUgYSBzdXBlcnVzZXIgaW4gb3JkZXIgdG8gc2V0IHJlYWwgdGltZQorLy8gc2NoZWR1bGluZyBvbiB0aHJlYWRzLgorI2RlZmluZSBTQl9IQVNfVEhSRUFEX1BSSU9SSVRZX1NVUFBPUlQgMAorCisvLyBEZWZpbmVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzaW11bHRhbmVvdXMgdGhyZWFkcyBmb3IgdGhpcyBwbGF0Zm9ybS4gU29tZQorLy8gcGxhdGZvcm1zIHJlcXVpcmUgc2hhcmluZyB0aHJlYWQgaGFuZGxlcyB3aXRoIG90aGVyIGtpbmRzIG9mIHN5c3RlbSBoYW5kbGVzLAorLy8gbGlrZSBtdXRleGVzLCBzbyB3ZSB3YW50IHRvIGtlZXAgdGhpcyBtYW5hZ2FibGUuCisjZGVmaW5lIFNCX01BWF9USFJFQURTIDkwCisKKy8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0aHJlYWQgbG9jYWwgc3RvcmFnZSBrZXlzIHN1cHBvcnRlZCBieSB0aGlzIHBsYXRmb3JtLgorI2RlZmluZSBTQl9NQVhfVEhSRUFEX0xPQ0FMX0tFWVMgNTEyCisKKy8vIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgbmFtZSBmb3IgYSB0aHJlYWQsIGluY2x1ZGluZyB0aGUgTlVMTC10ZXJtaW5hdG9yLgorI2RlZmluZSBTQl9NQVhfVEhSRUFEX05BTUVfTEVOR1RIIDE2CisKIC8vIC0tLSBUdW5lYWJsZSBQYXJhbWV0ZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAvLyBTcGVjaWZpZXMgdGhlIG5ldHdvcmsgcmVjZWl2ZSBidWZmZXIgc2l6ZSBpbiBieXRlcywgc2V0IHZpYQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9saW51eC9zaGFyZWQvZ3lwX2NvbmZpZ3VyYXRpb24ucHkgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9neXBfY29uZmlndXJhdGlvbi5weQppbmRleCAzM2JmNWM3Li44N2Q2MTBiIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9neXBfY29uZmlndXJhdGlvbi5weQorKysgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9neXBfY29uZmlndXJhdGlvbi5weQpAQCAtNzgsNyArNzgsNyBAQAogICAgIHJldHVybiBmaWx0ZXJzCiAKICAgX0ZJTFRFUkVEX1RFU1RTID0gewotICAgICAgJ3N0YXJib2FyZF9wbGF0Zm9ybV90ZXN0cyc6IFt0ZXN0X2ZpbHRlci5GSUxURVJfQUxMXSwKKyAgICAgICducGxiJzogWydTYkRybVRlc3QuQW55U3VwcG9ydGVkS2V5U3lzdGVtcycsXSwKICAgICAgICdwbGF5ZXJfZmlsdGVyX3Rlc3RzJzogWwogICAgICAgICAgICMgVGhlc2UgdGVzdHMgaGF2ZSBtZW1vcnkgbGVha3MgcmVsYXRlZCB0byBhdl9tYWxsb2MuCiAgICAgICAgICAgJ0F1ZGlvRGVjb2RlclRlc3RzL0F1ZGlvRGVjb2RlclRlc3QuKicsCkBAIC04Niw1ICs4Niw2IEBACiAgICAgICAgICAgIyBUaGVzZSB0ZXN0cyBmYWlsIG9uIGJ1aWxkYm90LgogICAgICAgICAgICdWaWRlb0RlY29kZXJUZXN0cy9WaWRlb0RlY29kZXJUZXN0LlNpbmdsZUludmFsaWRJbnB1dC8wJywKICAgICAgICAgICAnVmlkZW9EZWNvZGVyVGVzdHMvVmlkZW9EZWNvZGVyVGVzdC5TaW5nbGVJbnZhbGlkSW5wdXQvMScsCi0gICAgICBdCisgICAgICBdLAorICAgICAgJ3N0YXJib2FyZF9wbGF0Zm9ybV90ZXN0cyc6IFt0ZXN0X2ZpbHRlci5GSUxURVJfQUxMXSwKICAgfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9saW51eC9zaGFyZWQvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cGkgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwaQppbmRleCAwNTdkMWQ4Li5hN2Y2OTQ5IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwaQorKysgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwaQpAQCAtMTIsOCArMTIsMTIgQEAKICMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIHsKKyAgJ2luY2x1ZGVzJzogWworICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3BsYXllcl9maWx0ZXIuZ3lwaScsCisgIF0sCiAgICd2YXJpYWJsZXMnOiB7CiAgICAgJ3N0YXJib2FyZF9wbGF0Zm9ybV9zb3VyY2VzJzogWworICAgICAgJzxAKGZpbHRlcl9iYXNlZF9wbGF5ZXJfc291cmNlcyknLAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9saW51eC9zaGFyZWQvYXRvbWljX3B1YmxpYy5oJywKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvbGludXgvc2hhcmVkL2NvbmZpZ3VyYXRpb25fcHVibGljLmgnLAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9saW51eC9zaGFyZWQvZGVjb2RlX3RhcmdldF9nZXRfaW5mby5jYycsCkBAIC0zNSw2ICszOSw3IEBACiAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9hbHNhL2F1ZGlvX3NpbmtfaXNfYXVkaW9fZnJhbWVfc3RvcmFnZV90eXBlX3N1cHBvcnRlZC5jYycsCiAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9hbHNhL2F1ZGlvX3NpbmtfaXNfYXVkaW9fc2FtcGxlX3R5cGVfc3VwcG9ydGVkLmNjJywKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL2RsbWFsbG9jL21lbW9yeV9tYXAuY2MnLAorICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvZGxtYWxsb2MvbWVtb3J5X3Byb3RlY3QuY2MnLAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvZGxtYWxsb2MvbWVtb3J5X3VubWFwLmNjJywKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL2djYy9hdG9taWNfZ2NjX3B1YmxpYy5oJywKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL2lzby9jaGFyYWN0ZXJfaXNfYWxwaGFudW1lcmljLmNjJywKQEAgLTIyNywzOSArMjMyLDYgQEAKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9uZXcuY2MnLAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9kZWNvZGVkX2F1ZGlvX2ludGVybmFsLmNjJywKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZGVjb2RlZF9hdWRpb19pbnRlcm5hbC5oJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2F1ZGlvX2RlY29kZXJfaW50ZXJuYWwuaCcsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9hdWRpb19mcmFtZV90cmFja2VyLmNjJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2F1ZGlvX2ZyYW1lX3RyYWNrZXIuaCcsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9hdWRpb19yZW5kZXJlcl9pbnRlcm5hbC5jYycsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9hdWRpb19yZW5kZXJlcl9pbnRlcm5hbC5oJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2F1ZGlvX3JlbmRlcmVyX3NpbmsuaCcsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9hdWRpb19yZW5kZXJlcl9zaW5rX2ltcGwuY2MnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fcmVuZGVyZXJfc2lua19pbXBsLmgnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fcmVzYW1wbGVyX2ltcGwuY2MnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fdGltZV9zdHJldGNoZXIuY2MnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fdGltZV9zdHJldGNoZXIuaCcsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9jcHVfdmlkZW9fZnJhbWUuY2MnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvY3B1X3ZpZGVvX2ZyYW1lLmgnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvZGVjb2RlZF9hdWRpb19xdWV1ZS5jYycsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9kZWNvZGVkX2F1ZGlvX3F1ZXVlLmgnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvZmlsdGVyX2Jhc2VkX3BsYXllcl93b3JrZXJfaGFuZGxlci5jYycsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9maWx0ZXJfYmFzZWRfcGxheWVyX3dvcmtlcl9oYW5kbGVyLmgnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvbWVkaWFfdGltZV9wcm92aWRlci5oJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL21lZGlhX3RpbWVfcHJvdmlkZXJfaW1wbC5jYycsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9tZWRpYV90aW1lX3Byb3ZpZGVyX2ltcGwuaCcsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9wbGF5ZXJfY29tcG9uZW50cy5oJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3B1bmNob3V0X3ZpZGVvX3JlbmRlcmVyX3NpbmsuY2MnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvcHVuY2hvdXRfdmlkZW9fcmVuZGVyZXJfc2luay5oJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3ZpZGVvX2RlY29kZXJfaW50ZXJuYWwuaCcsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci92aWRlb19mcmFtZV9pbnRlcm5hbC5oJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3ZpZGVvX3JlbmRlcl9hbGdvcml0aG0uaCcsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci92aWRlb19yZW5kZXJfYWxnb3JpdGhtX2ltcGwuY2MnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdmlkZW9fcmVuZGVyX2FsZ29yaXRobV9pbXBsLmgnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdmlkZW9fcmVuZGVyZXJfaW50ZXJuYWwuY2MnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdmlkZW9fcmVuZGVyZXJfaW50ZXJuYWwuaCcsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci92aWRlb19yZW5kZXJlcl9zaW5rLmgnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvd3NvbGFfaW50ZXJuYWwuY2MnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvd3NvbGFfaW50ZXJuYWwuaCcsCiAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2lucHV0X2J1ZmZlcl9pbnRlcm5hbC5jYycsCiAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2lucHV0X2J1ZmZlcl9pbnRlcm5hbC5oJywKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvam9iX3F1ZXVlLmNjJywKQEAgLTMwOSw3ICsyODEsOSBAQAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9kcm1fY3JlYXRlX3N5c3RlbS5jYycsCiAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RybV9kZXN0cm95X3N5c3RlbS5jYycsCiAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RybV9nZW5lcmF0ZV9zZXNzaW9uX3VwZGF0ZV9yZXF1ZXN0LmNjJywKKyAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZHJtX2lzX3NlcnZlcl9jZXJ0aWZpY2F0ZV91cGRhdGFibGUuY2MnLAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9kcm1fc3lzdGVtX2ludGVybmFsLmgnLAorICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9kcm1fdXBkYXRlX3NlcnZlcl9jZXJ0aWZpY2F0ZS5jYycsCiAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RybV91cGRhdGVfc2Vzc2lvbi5jYycsCiAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2ltYWdlX2RlY29kZS5jYycsCiAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2ltYWdlX2lzX2RlY29kZV9zdXBwb3J0ZWQuY2MnLApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9saW51eC9zaGFyZWQvc3RhcmJvYXJkX3BsYXRmb3JtX3Rlc3RzLmd5cGkgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9zdGFyYm9hcmRfcGxhdGZvcm1fdGVzdHMuZ3lwaQppbmRleCA0ZWFhY2QxLi5lMjA2ZDlmIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9zdGFyYm9hcmRfcGxhdGZvcm1fdGVzdHMuZ3lwaQorKysgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9zdGFyYm9hcmRfcGxhdGZvcm1fdGVzdHMuZ3lwaQpAQCAtMTIsOSArMTIsNiBAQAogIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogewotICAnaW5jbHVkZXMnOiBbCi0gICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdGVzdGluZy9wbGF5ZXJfZmlsdGVyX3Rlc3RzLmd5cGknLAotICBdLAogICAndGFyZ2V0cyc6IFsKICAgICB7CiAgICAgICAndGFyZ2V0X25hbWUnOiAnc3RhcmJvYXJkX3BsYXRmb3JtX3Rlc3RzJywKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbGludXgvc2hhcmVkL3N5c3RlbV9oYXNfY2FwYWJpbGl0eS5jYyBiL3NyYy9zdGFyYm9hcmQvbGludXgvc2hhcmVkL3N5c3RlbV9oYXNfY2FwYWJpbGl0eS5jYwppbmRleCA4NTAzZWY0Li41ZDVkOWJmIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9zeXN0ZW1faGFzX2NhcGFiaWxpdHkuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9saW51eC9zaGFyZWQvc3lzdGVtX2hhc19jYXBhYmlsaXR5LmNjCkBAIC0yMiw2ICsyMiwxMCBAQAogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIGNhc2Uga1NiU3lzdGVtQ2FwYWJpbGl0eUNhblF1ZXJ5R1BVTWVtb3J5U3RhdHM6CiAgICAgICByZXR1cm4gZmFsc2U7CisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfSU5QVVRfVElNRVNUQU1QX0FQSV9WRVJTSU9OCisgICAgY2FzZSBrU2JTeXN0ZW1DYXBhYmlsaXR5U2V0c0lucHV0VGltZXN0YW1wOgorICAgICAgcmV0dXJuIGZhbHNlOworI2VuZGlmCiAgIH0KIAogICBTQl9ETE9HKFdBUk5JTkcpIDw8ICJVbnJlY29nbml6ZWQgY2FwYWJpbGl0eTogIiA8PCBjYXBhYmlsaXR5X2lkOwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9saW51eC94NjRkaXJlY3RmYi9mdXR1cmUvYXRvbWljX3B1YmxpYy5oIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjRkaXJlY3RmYi9mdXR1cmUvYXRvbWljX3B1YmxpYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGVmOGZkLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0ZGlyZWN0ZmIvZnV0dXJlL2F0b21pY19wdWJsaWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpZm5kZWYgU1RBUkJPQVJEX0xJTlVYX1g2NERJUkVDVEZCX0ZVVFVSRV9BVE9NSUNfUFVCTElDX0hfCi0jZGVmaW5lIFNUQVJCT0FSRF9MSU5VWF9YNjRESVJFQ1RGQl9GVVRVUkVfQVRPTUlDX1BVQkxJQ19IXwotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9hdG9taWNfcHVibGljLmgiCi0KLSNlbmRpZiAgLy8gU1RBUkJPQVJEX0xJTlVYX1g2NERJUkVDVEZCX0ZVVFVSRV9BVE9NSUNfUFVCTElDX0hfCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NGRpcmVjdGZiL2Z1dHVyZS9jb25maWd1cmF0aW9uX3B1YmxpYy5oIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjRkaXJlY3RmYi9mdXR1cmUvY29uZmlndXJhdGlvbl9wdWJsaWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkwNDJmZS4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NGRpcmVjdGZiL2Z1dHVyZS9jb25maWd1cmF0aW9uX3B1YmxpYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotLy8gVGhlIFN0YXJib2FyZCBjb25maWd1cmF0aW9uIGZvciBEZXNrdG9wIFg2NCBMaW51eCBjb25maWd1cmVkIGZvciB0aGUgZnV0dXJlCi0vLyBzdGFyYm9hcmQgQVBJLgotCi0jaWZuZGVmIFNUQVJCT0FSRF9MSU5VWF9YNjRESVJFQ1RGQl9GVVRVUkVfQ09ORklHVVJBVElPTl9QVUJMSUNfSF8KLSNkZWZpbmUgU1RBUkJPQVJEX0xJTlVYX1g2NERJUkVDVEZCX0ZVVFVSRV9DT05GSUdVUkFUSU9OX1BVQkxJQ19IXwotCi0vLyBUaGUgQVBJIHZlcnNpb24gaW1wbGVtZW50ZWQgYnkgdGhpcyBwbGF0Zm9ybS4KLSN1bmRlZiBTQl9BUElfVkVSU0lPTgotI2RlZmluZSBTQl9BUElfVkVSU0lPTiBTQl9FWFBFUklNRU5UQUxfQVBJX1ZFUlNJT04KLQotI3VuZGVmIFNCX0lTX1BMQVlFUl9QUk9EVUNJTkdfVEVYVFVSRQotI3VuZGVmIFNCX0lTX1BMQVlFUl9DT01QT1NJVEVECi0jdW5kZWYgU0JfSVNfUExBWUVSX1BVTkNIRURfT1VUCi0KLS8vIFdoZXRoZXIgdGhlIGN1cnJlbnQgcGxhdGZvcm0gaW1wbGVtZW50cyB0aGUgb24gc2NyZWVuIGtleWJvYXJkIGludGVyZmFjZS4KLSNkZWZpbmUgU0JfSEFTX09OX1NDUkVFTl9LRVlCT0FSRCAwCi0KLS8vIFdoZXRoZXIgdGhlIGN1cnJlbnQgcGxhdGZvcm0gdXNlcyBhIG1lZGlhIHBsYXllciB0aGF0IHJlbGllcyBvbiBhIFVSTC4KLSNkZWZpbmUgU0JfSEFTX1BMQVlFUl9XSVRIX1VSTCAwCi0KLS8vIEluY2x1ZGUgdGhlIFg2NERJUkVDVEZCIExpbnV4IGNvbmZpZ3VyYXRpb24uCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xpbnV4L3g2NGRpcmVjdGZiL2NvbmZpZ3VyYXRpb25fcHVibGljLmgiCi0KLSNlbmRpZiAgLy8gU1RBUkJPQVJEX0xJTlVYX1g2NERJUkVDVEZCX0ZVVFVSRV9DT05GSUdVUkFUSU9OX1BVQkxJQ19IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9saW51eC94NjRkaXJlY3RmYi9mdXR1cmUvZ3lwX2NvbmZpZ3VyYXRpb24uZ3lwaSBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0ZGlyZWN0ZmIvZnV0dXJlL2d5cF9jb25maWd1cmF0aW9uLmd5cGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YjkyMGQuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9saW51eC94NjRkaXJlY3RmYi9mdXR1cmUvZ3lwX2NvbmZpZ3VyYXRpb24uZ3lwaQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSMgQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotewotICAndGFyZ2V0X2RlZmF1bHRzJzogewotICAgICdkZWZhdWx0X2NvbmZpZ3VyYXRpb24nOiAnbGludXgteDY0ZGlyZWN0ZmItZnV0dXJlX2RlYnVnJywKLSAgICAnY29uZmlndXJhdGlvbnMnOiB7Ci0gICAgICAnbGludXgteDY0ZGlyZWN0ZmItZnV0dXJlX2RlYnVnJzogewotICAgICAgICAnaW5oZXJpdF9mcm9tJzogWydkZWJ1Z19iYXNlJ10sCi0gICAgICB9LAotICAgICAgJ2xpbnV4LXg2NGRpcmVjdGZiLWZ1dHVyZV9kZXZlbCc6IHsKLSAgICAgICAgJ2luaGVyaXRfZnJvbSc6IFsnZGV2ZWxfYmFzZSddLAotICAgICAgfSwKLSAgICAgICdsaW51eC14NjRkaXJlY3RmYi1mdXR1cmVfcWEnOiB7Ci0gICAgICAgICdpbmhlcml0X2Zyb20nOiBbJ3FhX2Jhc2UnXSwKLSAgICAgIH0sCi0gICAgICAnbGludXgteDY0ZGlyZWN0ZmItZnV0dXJlX2dvbGQnOiB7Ci0gICAgICAgICdpbmhlcml0X2Zyb20nOiBbJ2dvbGRfYmFzZSddLAotICAgICAgfSwKLSAgICB9LCAjIGVuZCBvZiBjb25maWd1cmF0aW9ucwotICB9LAotCi0gICdpbmNsdWRlcyc6IFsKLSAgICAnLi4vZ3lwX2NvbmZpZ3VyYXRpb24uZ3lwaScsCi0gIF0sCi19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NGRpcmVjdGZiL2Z1dHVyZS9neXBfY29uZmlndXJhdGlvbi5weSBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0ZGlyZWN0ZmIvZnV0dXJlL2d5cF9jb25maWd1cmF0aW9uLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTljYWI4Li4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0ZGlyZWN0ZmIvZnV0dXJlL2d5cF9jb25maWd1cmF0aW9uLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIiIiU3RhcmJvYXJkIExpbnV4IFg2NCBEaXJlY3RGQiBmdXR1cmUgcGxhdGZvcm0gY29uZmlndXJhdGlvbiBmb3IgZ3lwX2NvYmFsdC4iIiIKLQotZnJvbSBzdGFyYm9hcmQubGludXgueDY0ZGlyZWN0ZmIgaW1wb3J0IGd5cF9jb25maWd1cmF0aW9uIGFzIGxpbnV4X2NvbmZpZ3VyYXRpb24KLQotCi1kZWYgQ3JlYXRlUGxhdGZvcm1Db25maWcoKToKLSAgcmV0dXJuIGxpbnV4X2NvbmZpZ3VyYXRpb24uQ29iYWx0TGludXhYNjREaXJlY3RGYkNvbmZpZ3VyYXRpb24oCi0gICAgICAnbGludXgteDY0ZGlyZWN0ZmItZnV0dXJlJykKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0ZGlyZWN0ZmIvZnV0dXJlL3N0YXJib2FyZF9wbGF0Zm9ybS5neXAgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NGRpcmVjdGZiL2Z1dHVyZS9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmUwNjM5Li4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0ZGlyZWN0ZmIvZnV0dXJlL3N0YXJib2FyZF9wbGF0Zm9ybS5neXAKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi17Ci0gICd0YXJnZXRzJzogWwotICAgIHsKLSAgICAgICd0YXJnZXRfbmFtZSc6ICdzdGFyYm9hcmRfcGxhdGZvcm0nLAotICAgICAgJ3Byb2R1Y3RfbmFtZSc6ICdzdGFyYm9hcmRfcGxhdGZvcm1fZnV0dXJlJywKLSAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKLSAgICAgICdzb3VyY2VzJzogW10sCi0gICAgICAnZGVmaW5lcyc6IFsKLSAgICAgICAgIyBUaGlzIG11c3QgYmUgZGVmaW5lZCB3aGVuIGJ1aWxkaW5nIFN0YXJib2FyZCwgYW5kIG11c3Qgbm90IHdoZW4KLSAgICAgICAgIyBidWlsZGluZyBTdGFyYm9hcmQgY2xpZW50IGNvZGUuCi0gICAgICAgICdTVEFSQk9BUkRfSU1QTEVNRU5UQVRJT04nLAotICAgICAgXSwKLSAgICAgICdkZXBlbmRlbmNpZXMnOiBbCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvY29tbW9uL2NvbW1vbi5neXA6Y29tbW9uJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9saW51eC94NjRkaXJlY3RmYi9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwOnN0YXJib2FyZF9wbGF0Zm9ybScsCi0gICAgICAgICc8KERFUFRIKS90aGlyZF9wYXJ0eS9kbG1hbGxvYy9kbG1hbGxvYy5neXA6ZGxtYWxsb2MnLAotICAgICAgICAnPChERVBUSCkvdGhpcmRfcGFydHkvbGliZXZlbnQvbGliZXZlbnQuZ3lwOmxpYmV2ZW50JywKLSAgICAgIF0sCi0gICAgfSwKLSAgXSwKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0ZGlyZWN0ZmIvZnV0dXJlL3N0YXJib2FyZF9wbGF0Zm9ybV90ZXN0cy5neXAgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NGRpcmVjdGZiL2Z1dHVyZS9zdGFyYm9hcmRfcGxhdGZvcm1fdGVzdHMuZ3lwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTZlODkwLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0ZGlyZWN0ZmIvZnV0dXJlL3N0YXJib2FyZF9wbGF0Zm9ybV90ZXN0cy5neXAKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi17Ci0gICdpbmNsdWRlcyc6IFsKLSAgICAnPChERVBUSCkvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9zdGFyYm9hcmRfcGxhdGZvcm1fdGVzdHMuZ3lwaScsCi0gIF0sCi19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NGRpcmVjdGZiL2Z1dHVyZS90aHJlYWRfdHlwZXNfcHVibGljLmggYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NGRpcmVjdGZiL2Z1dHVyZS90aHJlYWRfdHlwZXNfcHVibGljLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ODAzYmUuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9saW51eC94NjRkaXJlY3RmYi9mdXR1cmUvdGhyZWFkX3R5cGVzX3B1YmxpYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBTVEFSQk9BUkRfTElOVVhfWDY0RElSRUNURkJfRlVUVVJFX1RIUkVBRF9UWVBFU19QVUJMSUNfSF8KLSNkZWZpbmUgU1RBUkJPQVJEX0xJTlVYX1g2NERJUkVDVEZCX0ZVVFVSRV9USFJFQURfVFlQRVNfUFVCTElDX0hfCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvbGludXgvc2hhcmVkL3RocmVhZF90eXBlc19wdWJsaWMuaCIKLQotI2VuZGlmICAvLyBTVEFSQk9BUkRfTElOVVhfWDY0RElSRUNURkJfRlVUVVJFX1RIUkVBRF9UWVBFU19QVUJMSUNfSF8KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0ZGlyZWN0ZmIvc2J2ZXJzaW9uLzQvYXRvbWljX3B1YmxpYy5oIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjRkaXJlY3RmYi9zYnZlcnNpb24vNC9hdG9taWNfcHVibGljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVmNjUzZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0ZGlyZWN0ZmIvc2J2ZXJzaW9uLzQvYXRvbWljX3B1YmxpYy5oCkBAIC0wLDAgKzEsMjMgQEAKKy8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIFRoaXMgZmlsZSB3YXMgaW5pdGlhbGx5IGdlbmVyYXRlZCBieSBjcmVhdGVfZGVyaXZlZF9idWlsZC5weSwKKy8vIHRob3VnaCBpdCBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIHNpbmNlIGl0cyBjcmVhdGlvbi4KKworI2lmbmRlZiBTVEFSQk9BUkRfTElOVVhfWDY0RElSRUNURkJfU0JWRVJTSU9OXzRfQVRPTUlDX1BVQkxJQ19IXworI2RlZmluZSBTVEFSQk9BUkRfTElOVVhfWDY0RElSRUNURkJfU0JWRVJTSU9OXzRfQVRPTUlDX1BVQkxJQ19IXworCisjaW5jbHVkZSAic3RhcmJvYXJkL2xpbnV4L3g2NGRpcmVjdGZiL2F0b21pY19wdWJsaWMuaCIKKworI2VuZGlmICAvLyBTVEFSQk9BUkRfTElOVVhfWDY0RElSRUNURkJfU0JWRVJTSU9OXzRfQVRPTUlDX1BVQkxJQ19IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9saW51eC94NjRkaXJlY3RmYi9zYnZlcnNpb24vNC9jb25maWd1cmF0aW9uX3B1YmxpYy5oIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjRkaXJlY3RmYi9zYnZlcnNpb24vNC9jb25maWd1cmF0aW9uX3B1YmxpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzOWJhZWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NGRpcmVjdGZiL3NidmVyc2lvbi80L2NvbmZpZ3VyYXRpb25fcHVibGljLmgKQEAgLTAsMCArMSwyNiBAQAorLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gVGhpcyBmaWxlIHdhcyBpbml0aWFsbHkgZ2VuZXJhdGVkIGJ5IGNyZWF0ZV9kZXJpdmVkX2J1aWxkLnB5LAorLy8gdGhvdWdoIGl0IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgc2luY2UgaXRzIGNyZWF0aW9uLgorCisjaWZuZGVmIFNUQVJCT0FSRF9MSU5VWF9YNjRESVJFQ1RGQl9TQlZFUlNJT05fNF9DT05GSUdVUkFUSU9OX1BVQkxJQ19IXworI2RlZmluZSBTVEFSQk9BUkRfTElOVVhfWDY0RElSRUNURkJfU0JWRVJTSU9OXzRfQ09ORklHVVJBVElPTl9QVUJMSUNfSF8KKworI3VuZGVmIFNCX0FQSV9WRVJTSU9OCisjZGVmaW5lIFNCX0FQSV9WRVJTSU9OIDQKKworI2luY2x1ZGUgInN0YXJib2FyZC9saW51eC94NjRkaXJlY3RmYi9jb25maWd1cmF0aW9uX3B1YmxpYy5oIgorCisjZW5kaWYgIC8vIFNUQVJCT0FSRF9MSU5VWF9YNjRESVJFQ1RGQl9TQlZFUlNJT05fNF9DT05GSUdVUkFUSU9OX1BVQkxJQ19IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9saW51eC94NjRkaXJlY3RmYi9zYnZlcnNpb24vNC9neXBfY29uZmlndXJhdGlvbi5neXBpIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjRkaXJlY3RmYi9zYnZlcnNpb24vNC9neXBfY29uZmlndXJhdGlvbi5neXBpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZDVjOTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NGRpcmVjdGZiL3NidmVyc2lvbi80L2d5cF9jb25maWd1cmF0aW9uLmd5cGkKQEAgLTAsMCArMSw0MCBAQAorIyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIFRoaXMgZmlsZSB3YXMgaW5pdGlhbGx5IGdlbmVyYXRlZCBieSBjcmVhdGVfZGVyaXZlZF9idWlsZC5weSwKKyMgdGhvdWdoIGl0IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgc2luY2UgaXRzIGNyZWF0aW9uLgorCit7CisgICd0YXJnZXRfZGVmYXVsdHMnOiB7CisgICAgJ2RlZmF1bHRfY29uZmlndXJhdGlvbic6ICdsaW51eC14NjRkaXJlY3RmYi1zYnZlcnNpb24tNF9kZWJ1ZycsCisgICAgJ2NvbmZpZ3VyYXRpb25zJzogeworICAgICAgJ2xpbnV4LXg2NGRpcmVjdGZiLXNidmVyc2lvbi00X2RlYnVnJzogeworICAgICAgICAnaW5oZXJpdF9mcm9tJzogWydkZWJ1Z19iYXNlJ10sCisgICAgICB9LAorICAgICAgJ2xpbnV4LXg2NGRpcmVjdGZiLXNidmVyc2lvbi00X2RldmVsJzogeworICAgICAgICAnaW5oZXJpdF9mcm9tJzogWydkZXZlbF9iYXNlJ10sCisgICAgICB9LAorICAgICAgJ2xpbnV4LXg2NGRpcmVjdGZiLXNidmVyc2lvbi00X3FhJzogeworICAgICAgICAnaW5oZXJpdF9mcm9tJzogWydxYV9iYXNlJ10sCisgICAgICB9LAorICAgICAgJ2xpbnV4LXg2NGRpcmVjdGZiLXNidmVyc2lvbi00X2dvbGQnOiB7CisgICAgICAgICdpbmhlcml0X2Zyb20nOiBbJ2dvbGRfYmFzZSddLAorICAgICAgfSwKKyAgICB9LCAjIGVuZCBvZiBjb25maWd1cmF0aW9ucworICB9LAorCisgICdpbmNsdWRlcyc6IFsKKyAgICAnPChERVBUSCkvc3RhcmJvYXJkL2xpbnV4L3g2NGRpcmVjdGZiL2d5cF9jb25maWd1cmF0aW9uLmd5cGknLAorICBdLAorfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9saW51eC94NjRkaXJlY3RmYi9zYnZlcnNpb24vNC9neXBfY29uZmlndXJhdGlvbi5weSBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0ZGlyZWN0ZmIvc2J2ZXJzaW9uLzQvZ3lwX2NvbmZpZ3VyYXRpb24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVhYWViZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0ZGlyZWN0ZmIvc2J2ZXJzaW9uLzQvZ3lwX2NvbmZpZ3VyYXRpb24ucHkKQEAgLTAsMCArMSw0NCBAQAorIyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIFRoaXMgZmlsZSB3YXMgaW5pdGlhbGx5IGdlbmVyYXRlZCBieSBjcmVhdGVfZGVyaXZlZF9idWlsZC5weSwKKyMgdGhvdWdoIGl0IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgc2luY2UgaXRzIGNyZWF0aW9uLgorCitpbXBvcnQgb3MKKworZnJvbSBzdGFyYm9hcmQubGludXgueDY0ZGlyZWN0ZmIgaW1wb3J0IGd5cF9jb25maWd1cmF0aW9uIGFzIHBhcmVudF9jb25maWd1cmF0aW9uCisKKworY2xhc3MgTGludXhYNjREaXJlY3RGYlNidmVyc2lvbjRDb25maWd1cmF0aW9uKAorICAgIHBhcmVudF9jb25maWd1cmF0aW9uLkNvYmFsdExpbnV4WDY0RGlyZWN0RmJDb25maWd1cmF0aW9uKToKKworICBkZWYgR2V0VmFyaWFibGVzKHNlbGYsIGNvbmZpZ19uYW1lKToKKyAgICB2YXJpYWJsZXMgPSBzdXBlcihMaW51eFg2NERpcmVjdEZiU2J2ZXJzaW9uNENvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgc2VsZikuR2V0VmFyaWFibGVzKGNvbmZpZ19uYW1lKQorICAgICMgVjggcmVxdWlyZXMgbmV3IFN0YXJib2FyZCBmZWF0dXJlcyBzbyB3ZSBtdXN0IHVzZSBTcGlkZXJNb25rZXkgaW4gb2xkZXIKKyAgICAjIHZlcnNpb25zIG9mIFN0YXJib2FyZC4KKyAgICB2YXJpYWJsZXMudXBkYXRlKHsKKyAgICAgICAgJ2phdmFzY3JpcHRfZW5naW5lJzogJ21vempzLTQ1JywKKyAgICAgICAgJ2NvYmFsdF9lbmFibGVfaml0JzogMCwKKyAgICB9KQorICAgIHJldHVybiB2YXJpYWJsZXMKKworICBkZWYgR2V0TGF1bmNoZXJQYXRoKHNlbGYpOgorICAgICIiIkdldHMgdGhlIHBhdGggdG8gdGhlIGxhdW5jaGVyIG1vZHVsZSBmb3IgdGhpcyBwbGF0Zm9ybS4iIiIKKyAgICByZXR1cm4gb3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKQorCisKK2RlZiBDcmVhdGVQbGF0Zm9ybUNvbmZpZygpOgorICByZXR1cm4gTGludXhYNjREaXJlY3RGYlNidmVyc2lvbjRDb25maWd1cmF0aW9uKAorICAgICAgJ2xpbnV4LXg2NGRpcmVjdGZiLXNidmVyc2lvbi00JykKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0ZGlyZWN0ZmIvc2J2ZXJzaW9uLzQvbGF1bmNoZXIucHkgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NGRpcmVjdGZiL3NidmVyc2lvbi80L2xhdW5jaGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzYzUwYjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NGRpcmVjdGZiL3NidmVyc2lvbi80L2xhdW5jaGVyLnB5CkBAIC0wLDAgKzEsMjUgQEAKKyMgQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyIiIlNwZWNpYWxpemVkIFN0YXJib2FyZCB2ZXJzaW9uIDQgbGF1bmNoZXIgZXhwcmVzc2luZyBubyBwcmVsb2FkIHN1cHBvcnQuIiIiCisKK2ltcG9ydCBzdGFyYm9hcmQubGludXguc2hhcmVkLmxhdW5jaGVyIGFzIGxhdW5jaGVyCisKKworY2xhc3MgTGF1bmNoZXIobGF1bmNoZXIuTGF1bmNoZXIpOgorCisgIGRlZiBTdXBwb3J0c1N1c3BlbmRSZXN1bWUoc2VsZik6CisgICAgIyBXaGlsZSB0ZWNobmljYWxseSBTdGFyYm9hcmQgdmVyc2lvbiA0IGRvZXMgc3VwcG9ydCBzdXNwZW5kL3Jlc3VtZSwgaXQKKyAgICAjIGRvZXMgbm90IHN1cHBvcnQgcHJlbG9hZCBhbmQgc28gd2UgcmV0dXJuIGZhbHNlIGhlcmUgdG8gYXZvaWQgcnVubmluZworICAgICMgdGVzdHMgd2hpY2ggYXNzdW1lICJTdXNwZW5kUmVzdW1lIiBzdXBwb3J0IGltcGxpZXMgcHJlbG9hZCBzdXBwb3J0LgorICAgIHJldHVybiBGYWxzZQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9saW51eC94NjRkaXJlY3RmYi9zYnZlcnNpb24vNC9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjRkaXJlY3RmYi9zYnZlcnNpb24vNC9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4OTAzZmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NGRpcmVjdGZiL3NidmVyc2lvbi80L3N0YXJib2FyZF9wbGF0Zm9ybS5neXAKQEAgLTAsMCArMSwyNCBAQAorIyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIFRoaXMgZmlsZSB3YXMgaW5pdGlhbGx5IGdlbmVyYXRlZCBieSBjcmVhdGVfZGVyaXZlZF9idWlsZC5weSwKKyMgdGhvdWdoIGl0IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgc2luY2UgaXRzIGNyZWF0aW9uLgorCit7CisgICdpbmNsdWRlcyc6IFsKKyAgICAjIE5vdGUgdGhhdCB3ZSBhcmUgJ2luY2x1ZGVzJ2luZyBhICdneXAnIGZpbGUsIG5vdCBhICdneXBpJyBmaWxlLiAgVGhlIGlkZWEKKyAgICAjIGlzIHRoYXQgd2UganVzdCB3YW50IHRoaXMgZmlsZSB0byAqYmUqIHRoZSBwYXJlbnQgZ3lwIGZpbGUuCisgICAgJzwoREVQVEgpL3N0YXJib2FyZC9saW51eC94NjRkaXJlY3RmYi9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwJywKKyAgXSwKK30KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0ZGlyZWN0ZmIvc2J2ZXJzaW9uLzQvc3RhcmJvYXJkX3BsYXRmb3JtX3Rlc3RzLmd5cCBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0ZGlyZWN0ZmIvc2J2ZXJzaW9uLzQvc3RhcmJvYXJkX3BsYXRmb3JtX3Rlc3RzLmd5cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmUwN2I0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjRkaXJlY3RmYi9zYnZlcnNpb24vNC9zdGFyYm9hcmRfcGxhdGZvcm1fdGVzdHMuZ3lwCkBAIC0wLDAgKzEsMjQgQEAKKyMgQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBUaGlzIGZpbGUgd2FzIGluaXRpYWxseSBnZW5lcmF0ZWQgYnkgY3JlYXRlX2Rlcml2ZWRfYnVpbGQucHksCisjIHRob3VnaCBpdCBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIHNpbmNlIGl0cyBjcmVhdGlvbi4KKworeworICAnaW5jbHVkZXMnOiBbCisgICAgIyBOb3RlIHRoYXQgd2UgYXJlICdpbmNsdWRlcydpbmcgYSAnZ3lwJyBmaWxlLCBub3QgYSAnZ3lwaScgZmlsZS4gIFRoZSBpZGVhCisgICAgIyBpcyB0aGF0IHdlIGp1c3Qgd2FudCB0aGlzIGZpbGUgdG8gKmJlKiB0aGUgcGFyZW50IGd5cCBmaWxlLgorICAgICc8KERFUFRIKS9zdGFyYm9hcmQvbGludXgveDY0ZGlyZWN0ZmIvc3RhcmJvYXJkX3BsYXRmb3JtX3Rlc3RzLmd5cCcsCisgIF0sCit9CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NGRpcmVjdGZiL3NidmVyc2lvbi80L3RocmVhZF90eXBlc19wdWJsaWMuaCBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0ZGlyZWN0ZmIvc2J2ZXJzaW9uLzQvdGhyZWFkX3R5cGVzX3B1YmxpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMDcwMGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NGRpcmVjdGZiL3NidmVyc2lvbi80L3RocmVhZF90eXBlc19wdWJsaWMuaApAQCAtMCwwICsxLDIzIEBACisvLyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBUaGlzIGZpbGUgd2FzIGluaXRpYWxseSBnZW5lcmF0ZWQgYnkgY3JlYXRlX2Rlcml2ZWRfYnVpbGQucHksCisvLyB0aG91Z2ggaXQgbWF5IGhhdmUgYmVlbiBtb2RpZmllZCBzaW5jZSBpdHMgY3JlYXRpb24uCisKKyNpZm5kZWYgU1RBUkJPQVJEX0xJTlVYX1g2NERJUkVDVEZCX1NCVkVSU0lPTl80X1RIUkVBRF9UWVBFU19QVUJMSUNfSF8KKyNkZWZpbmUgU1RBUkJPQVJEX0xJTlVYX1g2NERJUkVDVEZCX1NCVkVSU0lPTl80X1RIUkVBRF9UWVBFU19QVUJMSUNfSF8KKworI2luY2x1ZGUgInN0YXJib2FyZC9saW51eC94NjRkaXJlY3RmYi90aHJlYWRfdHlwZXNfcHVibGljLmgiCisKKyNlbmRpZiAgLy8gU1RBUkJPQVJEX0xJTlVYX1g2NERJUkVDVEZCX1NCVkVSU0lPTl80X1RIUkVBRF9UWVBFU19QVUJMSUNfSF8KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0ZGlyZWN0ZmIvc2J2ZXJzaW9uLzYvYXRvbWljX3B1YmxpYy5oIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjRkaXJlY3RmYi9zYnZlcnNpb24vNi9hdG9taWNfcHVibGljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJjMTU2MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0ZGlyZWN0ZmIvc2J2ZXJzaW9uLzYvYXRvbWljX3B1YmxpYy5oCkBAIC0wLDAgKzEsMjMgQEAKKy8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIFRoaXMgZmlsZSB3YXMgaW5pdGlhbGx5IGdlbmVyYXRlZCBieSBjcmVhdGVfZGVyaXZlZF9idWlsZC5weSwKKy8vIHRob3VnaCBpdCBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIHNpbmNlIGl0cyBjcmVhdGlvbi4KKworI2lmbmRlZiBTVEFSQk9BUkRfTElOVVhfWDY0RElSRUNURkJfU0JWRVJTSU9OXzZfQVRPTUlDX1BVQkxJQ19IXworI2RlZmluZSBTVEFSQk9BUkRfTElOVVhfWDY0RElSRUNURkJfU0JWRVJTSU9OXzZfQVRPTUlDX1BVQkxJQ19IXworCisjaW5jbHVkZSAic3RhcmJvYXJkL2xpbnV4L3g2NGRpcmVjdGZiL2F0b21pY19wdWJsaWMuaCIKKworI2VuZGlmICAvLyBTVEFSQk9BUkRfTElOVVhfWDY0RElSRUNURkJfU0JWRVJTSU9OXzZfQVRPTUlDX1BVQkxJQ19IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9saW51eC94NjRkaXJlY3RmYi9zYnZlcnNpb24vNi9jb25maWd1cmF0aW9uX3B1YmxpYy5oIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjRkaXJlY3RmYi9zYnZlcnNpb24vNi9jb25maWd1cmF0aW9uX3B1YmxpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MmU2NDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NGRpcmVjdGZiL3NidmVyc2lvbi82L2NvbmZpZ3VyYXRpb25fcHVibGljLmgKQEAgLTAsMCArMSwyNiBAQAorLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gVGhpcyBmaWxlIHdhcyBpbml0aWFsbHkgZ2VuZXJhdGVkIGJ5IGNyZWF0ZV9kZXJpdmVkX2J1aWxkLnB5LAorLy8gdGhvdWdoIGl0IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgc2luY2UgaXRzIGNyZWF0aW9uLgorCisjaWZuZGVmIFNUQVJCT0FSRF9MSU5VWF9YNjRESVJFQ1RGQl9TQlZFUlNJT05fNl9DT05GSUdVUkFUSU9OX1BVQkxJQ19IXworI2RlZmluZSBTVEFSQk9BUkRfTElOVVhfWDY0RElSRUNURkJfU0JWRVJTSU9OXzZfQ09ORklHVVJBVElPTl9QVUJMSUNfSF8KKworI3VuZGVmIFNCX0FQSV9WRVJTSU9OCisjZGVmaW5lIFNCX0FQSV9WRVJTSU9OIDYKKworI2luY2x1ZGUgInN0YXJib2FyZC9saW51eC94NjRkaXJlY3RmYi9jb25maWd1cmF0aW9uX3B1YmxpYy5oIgorCisjZW5kaWYgIC8vIFNUQVJCT0FSRF9MSU5VWF9YNjRESVJFQ1RGQl9TQlZFUlNJT05fNl9DT05GSUdVUkFUSU9OX1BVQkxJQ19IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9saW51eC94NjRkaXJlY3RmYi9zYnZlcnNpb24vNi9neXBfY29uZmlndXJhdGlvbi5neXBpIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjRkaXJlY3RmYi9zYnZlcnNpb24vNi9neXBfY29uZmlndXJhdGlvbi5neXBpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ODAyOGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NGRpcmVjdGZiL3NidmVyc2lvbi82L2d5cF9jb25maWd1cmF0aW9uLmd5cGkKQEAgLTAsMCArMSw0MCBAQAorIyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIFRoaXMgZmlsZSB3YXMgaW5pdGlhbGx5IGdlbmVyYXRlZCBieSBjcmVhdGVfZGVyaXZlZF9idWlsZC5weSwKKyMgdGhvdWdoIGl0IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgc2luY2UgaXRzIGNyZWF0aW9uLgorCit7CisgICd0YXJnZXRfZGVmYXVsdHMnOiB7CisgICAgJ2RlZmF1bHRfY29uZmlndXJhdGlvbic6ICdsaW51eC14NjRkaXJlY3RmYi1zYnZlcnNpb24tNl9kZWJ1ZycsCisgICAgJ2NvbmZpZ3VyYXRpb25zJzogeworICAgICAgJ2xpbnV4LXg2NGRpcmVjdGZiLXNidmVyc2lvbi02X2RlYnVnJzogeworICAgICAgICAnaW5oZXJpdF9mcm9tJzogWydkZWJ1Z19iYXNlJ10sCisgICAgICB9LAorICAgICAgJ2xpbnV4LXg2NGRpcmVjdGZiLXNidmVyc2lvbi02X2RldmVsJzogeworICAgICAgICAnaW5oZXJpdF9mcm9tJzogWydkZXZlbF9iYXNlJ10sCisgICAgICB9LAorICAgICAgJ2xpbnV4LXg2NGRpcmVjdGZiLXNidmVyc2lvbi02X3FhJzogeworICAgICAgICAnaW5oZXJpdF9mcm9tJzogWydxYV9iYXNlJ10sCisgICAgICB9LAorICAgICAgJ2xpbnV4LXg2NGRpcmVjdGZiLXNidmVyc2lvbi02X2dvbGQnOiB7CisgICAgICAgICdpbmhlcml0X2Zyb20nOiBbJ2dvbGRfYmFzZSddLAorICAgICAgfSwKKyAgICB9LCAjIGVuZCBvZiBjb25maWd1cmF0aW9ucworICB9LAorCisgICdpbmNsdWRlcyc6IFsKKyAgICAnPChERVBUSCkvc3RhcmJvYXJkL2xpbnV4L3g2NGRpcmVjdGZiL2d5cF9jb25maWd1cmF0aW9uLmd5cGknLAorICBdLAorfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9saW51eC94NjRkaXJlY3RmYi9zYnZlcnNpb24vNi9neXBfY29uZmlndXJhdGlvbi5weSBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0ZGlyZWN0ZmIvc2J2ZXJzaW9uLzYvZ3lwX2NvbmZpZ3VyYXRpb24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEwNjkxZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0ZGlyZWN0ZmIvc2J2ZXJzaW9uLzYvZ3lwX2NvbmZpZ3VyYXRpb24ucHkKQEAgLTAsMCArMSwzOCBAQAorIyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIFRoaXMgZmlsZSB3YXMgaW5pdGlhbGx5IGdlbmVyYXRlZCBieSBjcmVhdGVfZGVyaXZlZF9idWlsZC5weSwKKyMgdGhvdWdoIGl0IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgc2luY2UgaXRzIGNyZWF0aW9uLgorCitmcm9tIHN0YXJib2FyZC5saW51eC54NjRkaXJlY3RmYiBpbXBvcnQgZ3lwX2NvbmZpZ3VyYXRpb24gYXMgcGFyZW50X2NvbmZpZ3VyYXRpb24KKworCitjbGFzcyBMaW51eFg2NERpcmVjdEZiU2J2ZXJzaW9uNkNvbmZpZ3VyYXRpb24oCisgICAgcGFyZW50X2NvbmZpZ3VyYXRpb24uQ29iYWx0TGludXhYNjREaXJlY3RGYkNvbmZpZ3VyYXRpb24pOgorCisgIGRlZiBHZXRWYXJpYWJsZXMoc2VsZiwgY29uZmlnX25hbWUpOgorICAgIHZhcmlhYmxlcyA9IHN1cGVyKExpbnV4WDY0RGlyZWN0RmJTYnZlcnNpb242Q29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmKS5HZXRWYXJpYWJsZXMoY29uZmlnX25hbWUpCisgICAgIyBWOCByZXF1aXJlcyBuZXcgU3RhcmJvYXJkIGZlYXR1cmVzIHNvIHdlIG11c3QgdXNlIFNwaWRlck1vbmtleSBpbiBvbGRlcgorICAgICMgdmVyc2lvbnMgb2YgU3RhcmJvYXJkLgorICAgIHZhcmlhYmxlcy51cGRhdGUoeworICAgICAgICAnamF2YXNjcmlwdF9lbmdpbmUnOiAnbW96anMtNDUnLAorICAgICAgICAnY29iYWx0X2VuYWJsZV9qaXQnOiAwLAorICAgIH0pCisgICAgcmV0dXJuIHZhcmlhYmxlcworCisKK2RlZiBDcmVhdGVQbGF0Zm9ybUNvbmZpZygpOgorICByZXR1cm4gTGludXhYNjREaXJlY3RGYlNidmVyc2lvbjZDb25maWd1cmF0aW9uKAorICAgICAgJ2xpbnV4LXg2NGRpcmVjdGZiLXNidmVyc2lvbi02JykKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0ZGlyZWN0ZmIvc2J2ZXJzaW9uLzYvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cCBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0ZGlyZWN0ZmIvc2J2ZXJzaW9uLzYvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODkwM2ZiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjRkaXJlY3RmYi9zYnZlcnNpb24vNi9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwCkBAIC0wLDAgKzEsMjQgQEAKKyMgQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBUaGlzIGZpbGUgd2FzIGluaXRpYWxseSBnZW5lcmF0ZWQgYnkgY3JlYXRlX2Rlcml2ZWRfYnVpbGQucHksCisjIHRob3VnaCBpdCBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIHNpbmNlIGl0cyBjcmVhdGlvbi4KKworeworICAnaW5jbHVkZXMnOiBbCisgICAgIyBOb3RlIHRoYXQgd2UgYXJlICdpbmNsdWRlcydpbmcgYSAnZ3lwJyBmaWxlLCBub3QgYSAnZ3lwaScgZmlsZS4gIFRoZSBpZGVhCisgICAgIyBpcyB0aGF0IHdlIGp1c3Qgd2FudCB0aGlzIGZpbGUgdG8gKmJlKiB0aGUgcGFyZW50IGd5cCBmaWxlLgorICAgICc8KERFUFRIKS9zdGFyYm9hcmQvbGludXgveDY0ZGlyZWN0ZmIvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cCcsCisgIF0sCit9CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NGRpcmVjdGZiL3NidmVyc2lvbi82L3N0YXJib2FyZF9wbGF0Zm9ybV90ZXN0cy5neXAgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NGRpcmVjdGZiL3NidmVyc2lvbi82L3N0YXJib2FyZF9wbGF0Zm9ybV90ZXN0cy5neXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZlMDdiNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0ZGlyZWN0ZmIvc2J2ZXJzaW9uLzYvc3RhcmJvYXJkX3BsYXRmb3JtX3Rlc3RzLmd5cApAQCAtMCwwICsxLDI0IEBACisjIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgVGhpcyBmaWxlIHdhcyBpbml0aWFsbHkgZ2VuZXJhdGVkIGJ5IGNyZWF0ZV9kZXJpdmVkX2J1aWxkLnB5LAorIyB0aG91Z2ggaXQgbWF5IGhhdmUgYmVlbiBtb2RpZmllZCBzaW5jZSBpdHMgY3JlYXRpb24uCisKK3sKKyAgJ2luY2x1ZGVzJzogWworICAgICMgTm90ZSB0aGF0IHdlIGFyZSAnaW5jbHVkZXMnaW5nIGEgJ2d5cCcgZmlsZSwgbm90IGEgJ2d5cGknIGZpbGUuICBUaGUgaWRlYQorICAgICMgaXMgdGhhdCB3ZSBqdXN0IHdhbnQgdGhpcyBmaWxlIHRvICpiZSogdGhlIHBhcmVudCBneXAgZmlsZS4KKyAgICAnPChERVBUSCkvc3RhcmJvYXJkL2xpbnV4L3g2NGRpcmVjdGZiL3N0YXJib2FyZF9wbGF0Zm9ybV90ZXN0cy5neXAnLAorICBdLAorfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9saW51eC94NjRkaXJlY3RmYi9zYnZlcnNpb24vNi90aHJlYWRfdHlwZXNfcHVibGljLmggYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NGRpcmVjdGZiL3NidmVyc2lvbi82L3RocmVhZF90eXBlc19wdWJsaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmZiYmY5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjRkaXJlY3RmYi9zYnZlcnNpb24vNi90aHJlYWRfdHlwZXNfcHVibGljLmgKQEAgLTAsMCArMSwyMyBAQAorLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gVGhpcyBmaWxlIHdhcyBpbml0aWFsbHkgZ2VuZXJhdGVkIGJ5IGNyZWF0ZV9kZXJpdmVkX2J1aWxkLnB5LAorLy8gdGhvdWdoIGl0IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgc2luY2UgaXRzIGNyZWF0aW9uLgorCisjaWZuZGVmIFNUQVJCT0FSRF9MSU5VWF9YNjRESVJFQ1RGQl9TQlZFUlNJT05fNl9USFJFQURfVFlQRVNfUFVCTElDX0hfCisjZGVmaW5lIFNUQVJCT0FSRF9MSU5VWF9YNjRESVJFQ1RGQl9TQlZFUlNJT05fNl9USFJFQURfVFlQRVNfUFVCTElDX0hfCisKKyNpbmNsdWRlICJzdGFyYm9hcmQvbGludXgveDY0ZGlyZWN0ZmIvdGhyZWFkX3R5cGVzX3B1YmxpYy5oIgorCisjZW5kaWYgIC8vIFNUQVJCT0FSRF9MSU5VWF9YNjRESVJFQ1RGQl9TQlZFUlNJT05fNl9USFJFQURfVFlQRVNfUFVCTElDX0hfCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9jb2JhbHQvY29uZmlndXJhdGlvbi5neXBpIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvY29iYWx0L2NvbmZpZ3VyYXRpb24uZ3lwaQppbmRleCA5YmU3N2U5Li4yYmE1Mzg3IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9jb2JhbHQvY29uZmlndXJhdGlvbi5neXBpCisrKyBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL2NvYmFsdC9jb25maWd1cmF0aW9uLmd5cGkKQEAgLTE1LDYgKzE1LDEyIEBACiB7CiAgICd2YXJpYWJsZXMnOiB7CiAgICAgJ2VuYWJsZV9tYXBfdG9fbWVzaCUnOiAxLAorICAgICdlbmFibGVfa2V5X3N0YXR1c2VzX2NhbGxiYWNrJSc6ICc8ISh0ZXN0IC1lIC4uLy4uL3RoaXJkX3BhcnR5L2NkbS9jZG0vaW5jbHVkZS9jb250ZW50X2RlY3J5cHRpb25fbW9kdWxlLmggJiYgZ3JlcCAtcSBHZXRLZXlzIC4uLy4uL3RoaXJkX3BhcnR5L2NkbS9jZG0vaW5jbHVkZS9jb250ZW50X2RlY3J5cHRpb25fbW9kdWxlLmggJiYgZWNobyAxIHx8IGVjaG8gMCknLAorICB9LAorICAndGFyZ2V0X2RlZmF1bHRzJzogeworICAgICdkZWZpbmVzJzogWworICAgICAgJ0VOQUJMRV9LRVlfU1RBVFVTRVNfQ0FMTEJBQ0s9PChlbmFibGVfa2V5X3N0YXR1c2VzX2NhbGxiYWNrKScsCisgICAgXSwKICAgfSwKIAogICAnaW5jbHVkZXMnOiBbCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9jb25maWd1cmF0aW9uX3B1YmxpYy5oIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvY29uZmlndXJhdGlvbl9wdWJsaWMuaAppbmRleCBjYWExNzg3Li40YWVkNTYwIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9jb25maWd1cmF0aW9uX3B1YmxpYy5oCisrKyBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL2NvbmZpZ3VyYXRpb25fcHVibGljLmgKQEAgLTEwNiw4ICsxMDYsNyBAQAogLy8gdGV4dHVyZXMuIFRoZXNlIHRleHR1cmVzIHR5cGljYWxseSBvcmlnaW5hdGUgZnJvbSB2aWRlbyBkZWNvZGVycy4KICNkZWZpbmUgU0JfSEFTX05WMTJfVEVYVFVSRV9TVVBQT1JUIDEKIAotLy8gV2hldGhlciB0aGUgY3VycmVudCBwbGF0Zm9ybSBoYXMgc3BlZWNoIHN5bnRoZXNpcy4KLSNkZWZpbmUgU0JfSEFTX1NQRUVDSF9TWU5USEVTSVMgMAorLy8gLS0tIFNoYXJlZCBDb25maWd1cmF0aW9uIGFuZCBPdmVycmlkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIC8vIEluY2x1ZGUgdGhlIExpbnV4IGNvbmZpZ3VyYXRpb24gdGhhdCdzIGNvbW1vbiBiZXR3ZWVuIGFsbCBEZXNrdG9wIExpbnV4ZXMuCiAjaW5jbHVkZSAic3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9jb25maWd1cmF0aW9uX3B1YmxpYy5oIgpAQCAtMTE2LDYgKzExNSwxMCBAQAogI3VuZGVmIFNCX0hBU19NSUNST1BIT05FCiAjZGVmaW5lIFNCX0hBU19NSUNST1BIT05FIDEKIAorLy8gV2hldGhlciB0aGUgY3VycmVudCBwbGF0Zm9ybSBoYXMgc3BlZWNoIHN5bnRoZXNpcy4KKyN1bmRlZiBTQl9IQVNfU1BFRUNIX1NZTlRIRVNJUworI2RlZmluZSBTQl9IQVNfU1BFRUNIX1NZTlRIRVNJUyAwCisKICNpZiBTQl9BUElfVkVSU0lPTiA+PSA4CiAvLyBXaGV0aGVyIHRoZSBjdXJyZW50IHBsYXRmb3JtIGltcGxlbWVudHMgdGhlIG9uIHNjcmVlbiBrZXlib2FyZCBpbnRlcmZhY2UuCiAjZGVmaW5lIFNCX0hBU19PTl9TQ1JFRU5fS0VZQk9BUkQgMApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvZWdsL3N0YXJib2FyZF9wbGF0Zm9ybS5neXAgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9lZ2wvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cAppbmRleCBhNTc5NTlmLi4xYjE1YzkzIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9lZ2wvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cAorKysgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9lZ2wvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cApAQCAtMTMsMjMgKzEzLDYgQEAKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiB7CiAgICdpbmNsdWRlcyc6IFsKLSAgICAnLi4vc3RhcmJvYXJkX3BsYXRmb3JtLmd5cGknCi0gIF0sCi0gICd0YXJnZXRzJzogWwotICAgIHsKLSAgICAgICd0YXJnZXRfbmFtZSc6ICdzdGFyYm9hcmRfcGxhdGZvcm0nLAotICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAotICAgICAgJ3NvdXJjZXMnOiBbCi0gICAgICAgICc8QChzdGFyYm9hcmRfcGxhdGZvcm1fc291cmNlcyknLAotICAgICAgXSwKLSAgICAgICdkZWZpbmVzJzogWwotICAgICAgICAjIFRoaXMgbXVzdCBiZSBkZWZpbmVkIHdoZW4gYnVpbGRpbmcgU3RhcmJvYXJkLCBhbmQgbXVzdCBub3Qgd2hlbgotICAgICAgICAjIGJ1aWxkaW5nIFN0YXJib2FyZCBjbGllbnQgY29kZS4KLSAgICAgICAgJ1NUQVJCT0FSRF9JTVBMRU1FTlRBVElPTicsCi0gICAgICBdLAotICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKLSAgICAgICAgJzxAKHN0YXJib2FyZF9wbGF0Zm9ybV9kZXBlbmRlbmNpZXMpJywKLSAgICAgIF0sCi0gICAgfSwKKyAgICAnLi4vc3RhcmJvYXJkX3BsYXRmb3JtLmd5cCcKICAgXSwKIH0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL2VuYWJsZV9rZXlfc3RhdHVzZXMucHkgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9lbmFibGVfa2V5X3N0YXR1c2VzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MTRiNTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9lbmFibGVfa2V5X3N0YXR1c2VzLnB5CkBAIC0wLDAgKzEsODYgQEAKKyMKKyMgQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyIiIlV0aWxpdHkgdG8gYXBwbHkgR2V0S2V5cygpIHJlbGF0ZWQgY2hhbmdlcyB0byB3dl9jZG0uCisKK1N1Y2ggY2hhbmdlcyBhcmUgcmVxdWlyZWQgZm9yIHg2NHgxMS13diB0byBzdXBwb3J0IGtleSBzdGF0dXNlcy4KKyIiIgorCitpbXBvcnQgb3MKK2ltcG9ydCBzdWJwcm9jZXNzCisKKworZGVmIEdldFdpZGVWaW5lUGF0aCgpOgorICAiIiJGdW5jdGlvbiB0byByZXR1cm4gdGhlIHBhdGggdG8gd3YgY2RtLiIiIgorICBwYXRocyA9IFsnc3RhcmJvYXJkJywgJ2xpbnV4JywgJ3g2NHgxMScsICd3diddCisKKyAgY3VycmVudF9wYXRoID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGgucmVhbHBhdGgoX19maWxlX18pKQorICBmb3IgcGF0aCBpbiByZXZlcnNlZChwYXRocyk6CisgICAgYXNzZXJ0IG9zLnBhdGguYmFzZW5hbWUoY3VycmVudF9wYXRoKSA9PSBwYXRoCisgICAgY3VycmVudF9wYXRoID0gb3MucGF0aC5kaXJuYW1lKGN1cnJlbnRfcGF0aCkKKyAgcmV0dXJuIG9zLnBhdGguam9pbihjdXJyZW50X3BhdGgsICd0aGlyZF9wYXJ0eScsICdjZG0nKQorCisKK2RlZiBHZXRMYXN0R2l0Q29tbWl0KCk6CisgICIiIkZ1bmN0aW9uIHRvIHJldHVybiB0aGUgaGFzaCBvZiB0aGUgbGFzdCBjb21taXQuIiIiCisgIHJldHVybiBzdWJwcm9jZXNzLmNoZWNrX291dHB1dChbJ2dpdCcsICdsb2cnLCAnLS1vbmVsaW5lJywgJy0xJ10pWzo3XQorCisKK2RlZiBHZXRDdXJyZW50R2l0QnJhbmNoKCk6CisgICIiIkZ1bmN0aW9uIHRvIHJldHVybiB0aGUgY3VycmVudCBnaXQgYnJhbmNoLiIiIgorICBicmFuY2hlcyA9IHN1YnByb2Nlc3MuY2hlY2tfb3V0cHV0KFsnZ2l0JywgJ2JyYW5jaCddKS5zcGxpdCgnXG4nKQorICBjdXJyZW50X2JyYW5jaGVzID0gW2JyYW5jaCBmb3IgYnJhbmNoIGluIGJyYW5jaGVzIGlmIGJyYW5jaFs6Ml0gPT0gJyogJ10KKyAgaWYgbGVuKGN1cnJlbnRfYnJhbmNoZXMpID09IDE6CisgICAgcmV0dXJuIGN1cnJlbnRfYnJhbmNoZXNbMF1bMjpdLnN0cmlwKCkKKyAgcmV0dXJuICcnCisKKworZGVmIFBhdGNoV2lkZVZpbmUoKToKKyAgIiIiRnVuY3Rpb24gdG8gcGF0Y2ggd3YgY2RtIHdpdGggdGhlIGB3dl9jZG1fZ2V0X2tleXMuZGlmZmAgaWYgbm90IGFwcGxpZWQuIiIiCisgIG9zLmNoZGlyKEdldFdpZGVWaW5lUGF0aCgpKQorCisgIHdpdGggb3BlbignY2RtL2luY2x1ZGUvY29udGVudF9kZWNyeXB0aW9uX21vZHVsZS5oJykgYXMgZjoKKyAgICBpZiBmLnJlYWQoKS5maW5kKCdHZXRLZXlzJykgIT0gLTE6CisgICAgICAjIFdlIGhhdmUgYWxyZWFkeSBwYXRjaGVkIFdpZGVWaW5lCisgICAgICBwcmludCAnV2lkZVZpbmUgaGFzIGFscmVhZHkgYmVlbiBiZWVuIHBhdGNoZWQgd2l0aCBHZXRLZXlzKCkgc3VwcG9ydC4nCisgICAgICByZXR1cm4KKworICBpZiAoR2V0Q3VycmVudEdpdEJyYW5jaCgpICE9ICdtYXN0ZXInIGFuZAorICAgICAgR2V0Q3VycmVudEdpdEJyYW5jaCgpICE9ICcoSEVBRCBkZXRhY2hlZCBhdCA1YWUxOWIwKScgYW5kCisgICAgICBHZXRMYXN0R2l0Q29tbWl0KCkgIT0gJzVhZTE5YjAnKToKKyAgICByYWlzZSBFeGNlcHRpb24oJ1dpZGVWaW5lIGlzIG5vdCBhdCBtYXN0ZXIgb3IgYDVhZTE5YjBgJworICAgICAgICAgICAgICAgICAgICAnLCBub3QgcHJvY2VlZCB0byBhdm9pZCBvdmVyd3JpdGluZyBjaGFuZ2VzLicpCisKKyAgaWYgKHN1YnByb2Nlc3MuY2FsbChbJ2dpdCcsICdkaWZmJywgJy0tZXhpdC1jb2RlJ10pID09IDEgb3IKKyAgICAgIHN1YnByb2Nlc3MuY2FsbChbJ2dpdCcsICdkaWZmJywgJy0tY2FjaGVkJywgJy0tZXhpdC1jb2RlJ10pID09IDEpOgorICAgIHJhaXNlIEV4Y2VwdGlvbignV2lkZVZpbmUgcmVwb3NpdG9yeSBpcyBub3QgY2xlYW4uJykKKworICBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoCisgICAgICBbJ2dpdCcsICdjaGVja291dCcsICctLXF1aWV0JywgJy1iJywgJ3d2Mi4yJywgJ3RhZ3MvdjIuMiddKQorICBhc3NlcnQgR2V0TGFzdEdpdENvbW1pdCgpID09ICc1YWUxOWIwJworCisgIHN1YnByb2Nlc3MuY2hlY2tfY2FsbCgKKyAgICAgIFsnZ2l0JywgJ2FwcGx5JywgJy4uLy4uL3N0YXJib2FyZC9saW51eC94NjR4MTEvd3ZfY2RtX2dldF9rZXlzLmRpZmYnXSkKKyAgc3VicHJvY2Vzcy5jaGVja19jYWxsKAorICAgICAgWydnaXQnLCAnY29tbWl0JywgJy1hJywgJy0tcXVpZXQnLCAnLW0nLCAnIkFkZCBHZXRLZXlzKCkgc3VwcG9ydCInXSkKKworICB3aXRoIG9wZW4oJ2NkbS9pbmNsdWRlL2NvbnRlbnRfZGVjcnlwdGlvbl9tb2R1bGUuaCcpIGFzIGY6CisgICAgYXNzZXJ0IGYucmVhZCgpLmZpbmQoJ0dldEtleXMnKSAhPSAtMQorCisgIHByaW50KCdXaWRlVmluZSBoYXMgYmVlbiBwYXRjaGVkIHdpdGggR2V0S2V5cygpIHN1cHBvcnQsICcKKyAgICAgICAgJ3JlbWVtYmVyIHRvIHJlLXJ1biBneXBfZHJpdmVyIScpCisKKworUGF0Y2hXaWRlVmluZSgpCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9mdXR1cmUvYXRvbWljX3B1YmxpYy5oIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvZnV0dXJlL2F0b21pY19wdWJsaWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkwOGY3ZC4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9mdXR1cmUvYXRvbWljX3B1YmxpYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBTVEFSQk9BUkRfTElOVVhfWDY0WDExX0ZVVFVSRV9BVE9NSUNfUFVCTElDX0hfCi0jZGVmaW5lIFNUQVJCT0FSRF9MSU5VWF9YNjRYMTFfRlVUVVJFX0FUT01JQ19QVUJMSUNfSF8KLQotI2luY2x1ZGUgInN0YXJib2FyZC9saW51eC9zaGFyZWQvYXRvbWljX3B1YmxpYy5oIgotCi0jZW5kaWYgIC8vIFNUQVJCT0FSRF9MSU5VWF9YNjRYMTFfRlVUVVJFX0FUT01JQ19QVUJMSUNfSF8KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL2Z1dHVyZS9jb25maWd1cmF0aW9uX3B1YmxpYy5oIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvZnV0dXJlL2NvbmZpZ3VyYXRpb25fcHVibGljLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhN2UyMmQuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvZnV0dXJlL2NvbmZpZ3VyYXRpb25fcHVibGljLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0vLyBUaGUgU3RhcmJvYXJkIGNvbmZpZ3VyYXRpb24gZm9yIERlc2t0b3AgWDg2IExpbnV4IGNvbmZpZ3VyZWQgZm9yIHRoZSBmdXR1cmUKLS8vIHN0YXJib2FyZCBBUEkuCi0KLSNpZm5kZWYgU1RBUkJPQVJEX0xJTlVYX1g2NFgxMV9GVVRVUkVfQ09ORklHVVJBVElPTl9QVUJMSUNfSF8KLSNkZWZpbmUgU1RBUkJPQVJEX0xJTlVYX1g2NFgxMV9GVVRVUkVfQ09ORklHVVJBVElPTl9QVUJMSUNfSF8KLQotLy8gVGhlIEZ1dHVyZSBjb25maWd1cmF0aW9uIHNob3VsZCBleHBsaWNpdGx5IGFsd2F5cyBpbXBsZW1lbnQgdGhlIGV4cGVyaW1lbnRhbAotLy8gQVBJIHZlcnNpb24uCi0jZGVmaW5lIFNCX0FQSV9WRVJTSU9OIFNCX0VYUEVSSU1FTlRBTF9BUElfVkVSU0lPTgotCi0vLyBJbmNsdWRlIHRoZSBYNjRYMTEgTGludXggY29uZmlndXJhdGlvbi4KLSNpbmNsdWRlICJzdGFyYm9hcmQvbGludXgveDY0eDExL2NvbmZpZ3VyYXRpb25fcHVibGljLmgiCi0KLSNlbmRpZiAgLy8gU1RBUkJPQVJEX0xJTlVYX1g2NFgxMV9GVVRVUkVfQ09ORklHVVJBVElPTl9QVUJMSUNfSF8KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL2Z1dHVyZS9neXBfY29uZmlndXJhdGlvbi5neXBpIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvZnV0dXJlL2d5cF9jb25maWd1cmF0aW9uLmd5cGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjYjEyY2YuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvZnV0dXJlL2d5cF9jb25maWd1cmF0aW9uLmd5cGkKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0jIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXsKLSAgJ3RhcmdldF9kZWZhdWx0cyc6IHsKLSAgICAnZGVmYXVsdF9jb25maWd1cmF0aW9uJzogJ2xpbnV4LXg2NHgxMS1mdXR1cmVfZGVidWcnLAotICAgICdjb25maWd1cmF0aW9ucyc6IHsKLSAgICAgICdsaW51eC14NjR4MTEtZnV0dXJlX2RlYnVnJzogewotICAgICAgICAnaW5oZXJpdF9mcm9tJzogWydkZWJ1Z19iYXNlJ10sCi0gICAgICB9LAotICAgICAgJ2xpbnV4LXg2NHgxMS1mdXR1cmVfZGV2ZWwnOiB7Ci0gICAgICAgICdpbmhlcml0X2Zyb20nOiBbJ2RldmVsX2Jhc2UnXSwKLSAgICAgIH0sCi0gICAgICAnbGludXgteDY0eDExLWZ1dHVyZV9xYSc6IHsKLSAgICAgICAgJ2luaGVyaXRfZnJvbSc6IFsncWFfYmFzZSddLAotICAgICAgfSwKLSAgICAgICdsaW51eC14NjR4MTEtZnV0dXJlX2dvbGQnOiB7Ci0gICAgICAgICdpbmhlcml0X2Zyb20nOiBbJ2dvbGRfYmFzZSddLAotICAgICAgfSwKLSAgICB9LCAjIGVuZCBvZiBjb25maWd1cmF0aW9ucwotICB9LAotCi0gICdpbmNsdWRlcyc6IFsKLSAgICAnLi4vZ3lwX2NvbmZpZ3VyYXRpb24uZ3lwaScsCi0gIF0sCi19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9mdXR1cmUvZ3lwX2NvbmZpZ3VyYXRpb24ucHkgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9mdXR1cmUvZ3lwX2NvbmZpZ3VyYXRpb24ucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNjNlOTIuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvZnV0dXJlL2d5cF9jb25maWd1cmF0aW9uLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIiIiU3RhcmJvYXJkIExpbnV4IFg2NCBYMTEgZnV0dXJlIHBsYXRmb3JtIGNvbmZpZ3VyYXRpb24uIiIiCi0KLWZyb20gc3RhcmJvYXJkLmxpbnV4Lng2NHgxMSBpbXBvcnQgZ3lwX2NvbmZpZ3VyYXRpb24gYXMgbGludXhfY29uZmlndXJhdGlvbgotCi0KLWRlZiBDcmVhdGVQbGF0Zm9ybUNvbmZpZygpOgotICByZXR1cm4gbGludXhfY29uZmlndXJhdGlvbi5MaW51eFg2NFgxMUNvbmZpZ3VyYXRpb24oJ2xpbnV4LXg2NHgxMS1mdXR1cmUnKQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvZnV0dXJlL3N0YXJib2FyZF9wbGF0Zm9ybS5neXAgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9mdXR1cmUvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE0NTBjYy4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9mdXR1cmUvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLSMgQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLXsKLSAgJ2luY2x1ZGVzJzogWwotICAgICcuLi9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwaScKLSAgXSwKLSAgJ3RhcmdldHMnOiBbCi0gICAgewotICAgICAgJ3RhcmdldF9uYW1lJzogJ3N0YXJib2FyZF9wbGF0Zm9ybScsCi0gICAgICAncHJvZHVjdF9uYW1lJzogJ3N0YXJib2FyZF9wbGF0Zm9ybV9mdXR1cmUnLAotICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAotICAgICAgJ3NvdXJjZXMnOiBbCi0gICAgICAgICc8QChzdGFyYm9hcmRfcGxhdGZvcm1fc291cmNlcyknLAotICAgICAgXSwKLSAgICAgICdkZWZpbmVzJzogWwotICAgICAgICAjIFRoaXMgbXVzdCBiZSBkZWZpbmVkIHdoZW4gYnVpbGRpbmcgU3RhcmJvYXJkLCBhbmQgbXVzdCBub3Qgd2hlbgotICAgICAgICAjIGJ1aWxkaW5nIFN0YXJib2FyZCBjbGllbnQgY29kZS4KLSAgICAgICAgJ1NUQVJCT0FSRF9JTVBMRU1FTlRBVElPTicsCi0gICAgICBdLAotICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKLSAgICAgICAgJzxAKHN0YXJib2FyZF9wbGF0Zm9ybV9kZXBlbmRlbmNpZXMpJywKLSAgICAgIF0sCi0gICAgfSwKLSAgXSwKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL2Z1dHVyZS9zdGFyYm9hcmRfcGxhdGZvcm1fdGVzdHMuZ3lwIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvZnV0dXJlL3N0YXJib2FyZF9wbGF0Zm9ybV90ZXN0cy5neXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NmU4OTAuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvZnV0dXJlL3N0YXJib2FyZF9wbGF0Zm9ybV90ZXN0cy5neXAKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi17Ci0gICdpbmNsdWRlcyc6IFsKLSAgICAnPChERVBUSCkvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9zdGFyYm9hcmRfcGxhdGZvcm1fdGVzdHMuZ3lwaScsCi0gIF0sCi19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9mdXR1cmUvdGhyZWFkX3R5cGVzX3B1YmxpYy5oIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvZnV0dXJlL3RocmVhZF90eXBlc19wdWJsaWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFlNWRhOC4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9mdXR1cmUvdGhyZWFkX3R5cGVzX3B1YmxpYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBTVEFSQk9BUkRfTElOVVhfWDY0WDExX0ZVVFVSRV9USFJFQURfVFlQRVNfUFVCTElDX0hfCi0jZGVmaW5lIFNUQVJCT0FSRF9MSU5VWF9YNjRYMTFfRlVUVVJFX1RIUkVBRF9UWVBFU19QVUJMSUNfSF8KLQotI2luY2x1ZGUgInN0YXJib2FyZC9saW51eC9zaGFyZWQvdGhyZWFkX3R5cGVzX3B1YmxpYy5oIgotCi0jZW5kaWYgIC8vIFNUQVJCT0FSRF9MSU5VWF9YNjRYMTFfRlVUVVJFX1RIUkVBRF9UWVBFU19QVUJMSUNfSF8KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL2djemVhbC9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvZ2N6ZWFsL3N0YXJib2FyZF9wbGF0Zm9ybS5neXAKaW5kZXggNDJiMGJmNS4uMWIxNWM5MyAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvZ2N6ZWFsL3N0YXJib2FyZF9wbGF0Zm9ybS5neXAKKysrIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvZ2N6ZWFsL3N0YXJib2FyZF9wbGF0Zm9ybS5neXAKQEAgLTEzLDIxICsxMyw2IEBACiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogewogICAnaW5jbHVkZXMnOiBbCi0gICAgJy4uL3N0YXJib2FyZF9wbGF0Zm9ybS5neXBpJwotICBdLAotICAndGFyZ2V0cyc6IFsKLSAgICB7Ci0gICAgICAndGFyZ2V0X25hbWUnOiAnc3RhcmJvYXJkX3BsYXRmb3JtJywKLSAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKLSAgICAgICdzb3VyY2VzJzogWyc8QChzdGFyYm9hcmRfcGxhdGZvcm1fc291cmNlcyknXSwKLSAgICAgICdkZWZpbmVzJzogWwotICAgICAgICAjIFRoaXMgbXVzdCBiZSBkZWZpbmVkIHdoZW4gYnVpbGRpbmcgU3RhcmJvYXJkLCBhbmQgbXVzdCBub3Qgd2hlbgotICAgICAgICAjIGJ1aWxkaW5nIFN0YXJib2FyZCBjbGllbnQgY29kZS4KLSAgICAgICAgJ1NUQVJCT0FSRF9JTVBMRU1FTlRBVElPTicsCi0gICAgICBdLAotICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKLSAgICAgICAgJzxAKHN0YXJib2FyZF9wbGF0Zm9ybV9kZXBlbmRlbmNpZXMpJywKLSAgICAgIF0sCi0gICAgfSwKKyAgICAnLi4vc3RhcmJvYXJkX3BsYXRmb3JtLmd5cCcKICAgXSwKIH0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL2d5cF9jb25maWd1cmF0aW9uLmd5cGkgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9neXBfY29uZmlndXJhdGlvbi5neXBpCmluZGV4IGI1ZjFlZGUuLjRlMTg2MjAgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL2d5cF9jb25maWd1cmF0aW9uLmd5cGkKKysrIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvZ3lwX2NvbmZpZ3VyYXRpb24uZ3lwaQpAQCAtMTUsMTEgKzE1LDYgQEAKIHsKICAgJ3ZhcmlhYmxlcyc6IHsKICAgICAnZW5hYmxlX21hcF90b19tZXNoJSc6IDEsCi0KLSAgICAnY29iYWx0X3BsYXRmb3JtX2RlcGVuZGVuY2llcyc6IFsKLSAgICAgICMgR0wgTGludXggbWFrZXMgc29tZSBHTCBjYWxscyB3aXRoaW4gZGVjb2RlX3RhcmdldF9pbnRlcm5hbC5jYy4KLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvZWdsX2FuZF9nbGVzL2VnbF9hbmRfZ2xlcy5neXA6ZWdsX2FuZF9nbGVzJywKLSAgICBdLAogICB9LAogICAndGFyZ2V0X2RlZmF1bHRzJzogewogICAgICdkZWZhdWx0X2NvbmZpZ3VyYXRpb24nOiAnbGludXgteDY0eDExX2RlYnVnJywKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL2d5cF9jb25maWd1cmF0aW9uLnB5IGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvZ3lwX2NvbmZpZ3VyYXRpb24ucHkKaW5kZXggNTAwNTllNS4uNGU3NWZmOSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvZ3lwX2NvbmZpZ3VyYXRpb24ucHkKKysrIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvZ3lwX2NvbmZpZ3VyYXRpb24ucHkKQEAgLTEzLDYgKzEzLDggQEAKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAiIiJTdGFyYm9hcmQgTGludXggWDY0IFgxMSBwbGF0Zm9ybSBjb25maWd1cmF0aW9uLiIiIgogCitpbXBvcnQgb3MucGF0aAorCiBmcm9tIHN0YXJib2FyZC5saW51eC5zaGFyZWQgaW1wb3J0IGd5cF9jb25maWd1cmF0aW9uIGFzIHNoYXJlZF9jb25maWd1cmF0aW9uCiBmcm9tIHN0YXJib2FyZC50b29scy50b29sY2hhaW4gaW1wb3J0IGFyCiBmcm9tIHN0YXJib2FyZC50b29scy50b29sY2hhaW4gaW1wb3J0IGJhc2gKQEAgLTIwLDYgKzIyLDcgQEAKIGZyb20gc3RhcmJvYXJkLnRvb2xzLnRvb2xjaGFpbiBpbXBvcnQgY2xhbmd4eAogZnJvbSBzdGFyYm9hcmQudG9vbHMudG9vbGNoYWluIGltcG9ydCBjcAogZnJvbSBzdGFyYm9hcmQudG9vbHMudG9vbGNoYWluIGltcG9ydCB0b3VjaAorZnJvbSBzdGFyYm9hcmQudG9vbHMgaW1wb3J0IHBhdGhzCiAKIAogY2xhc3MgTGludXhYNjRYMTFDb25maWd1cmF0aW9uKHNoYXJlZF9jb25maWd1cmF0aW9uLkxpbnV4Q29uZmlndXJhdGlvbik6CkBAIC00NywxMSArNTAsMzEgQEAKICAgICAgICAgYXIuU3RhdGljVGhpbkxpbmtlcigpLAogICAgICAgICBhci5TdGF0aWNMaW5rZXIoKSwKICAgICAgICAgY2xhbmd4eC5FeGVjdXRhYmxlTGlua2VyKHBhdGg9Y3h4X3BhdGgpLAorICAgICAgICBjbGFuZ3h4LlNoYXJlZExpYnJhcnlMaW5rZXIocGF0aD1jeHhfcGF0aCksCiAgICAgICAgIGNwLkNvcHkoKSwKICAgICAgICAgdG91Y2guU3RhbXAoKSwKICAgICAgICAgYmFzaC5TaGVsbCgpLAogICAgIF0KIAorICBkZWYgR2V0VGVzdEZpbHRlcnMoc2VsZik6CisgICAgZmlsdGVycyA9IHN1cGVyKExpbnV4WDY0WDExQ29uZmlndXJhdGlvbiwgc2VsZikuR2V0VGVzdEZpbHRlcnMoKQorICAgICMgUmVtb3ZlIHRoZSBleGNsdXNpb24gZmlsdGVyIG9uIFNiRHJtVGVzdC5BbnlTdXBwb3J0ZWRLZXlTeXN0ZW1zLgorICAgICMgR2VuZXJhbGx5LCBjaGlsZHJlbiBvZiBsaW51eC9zaGFyZWQgZG8gbm90IHN1cHBvcnQgd2lkZXZpbmUsIGJ1dCBjaGlsZHJlbgorICAgICMgb2YgbGludXgveDY0eDExIGRvLCBpZiB0aGUgY29udGVudCBkZWNyeXB0aW9uIG1vZHVsZSBpcyBwcmVzZW50LgorCisgICAgaGFzX2NkbSA9IG9zLnBhdGguaXNmaWxlKAorICAgICAgICBvcy5wYXRoLmpvaW4ocGF0aHMuUkVQT1NJVE9SWV9ST09ULCAndGhpcmRfcGFydHknLCAnY2RtJywgJ2NkbScsCisgICAgICAgICAgICAgICAgICAgICAnaW5jbHVkZScsICdjb250ZW50X2RlY3J5cHRpb25fbW9kdWxlLmgnKSkKKworICAgIGlmIG5vdCBoYXNfY2RtOgorICAgICAgcmV0dXJuIGZpbHRlcnMKKworICAgIGZvciB0ZXN0X2ZpbHRlciBpbiBmaWx0ZXJzOgorICAgICAgaWYgKHRlc3RfZmlsdGVyLnRhcmdldF9uYW1lID09ICducGxiJyBhbmQKKyAgICAgICAgICB0ZXN0X2ZpbHRlci50ZXN0X25hbWUgPT0gJ1NiRHJtVGVzdC5BbnlTdXBwb3J0ZWRLZXlTeXN0ZW1zJyk6CisgICAgICAgIGZpbHRlcnMucmVtb3ZlKHRlc3RfZmlsdGVyKQorICAgIHJldHVybiBmaWx0ZXJzCisKIAogZGVmIENyZWF0ZVBsYXRmb3JtQ29uZmlnKCk6CiAgIHJldHVybiBMaW51eFg2NFgxMUNvbmZpZ3VyYXRpb24oKQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvbGlicmFyaWVzLmd5cGkgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9saWJyYXJpZXMuZ3lwaQppbmRleCA4MDI0NDA3Li5hYzAwOWFlIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9saWJyYXJpZXMuZ3lwaQorKysgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9saWJyYXJpZXMuZ3lwaQpAQCAtMTQsNiArMTQsMTcgQEAKIAogewogICAndmFyaWFibGVzJzogeworICAgICMgVGhpcyBwbGF0Zm9ybSB1c2VzIGEgY29tcG9zaXRvciB0byBwcmVzZW50IHRoZSByZW5kZXJpbmcgb3V0cHV0LCBzbworICAgICMgc2V0IHRoZSBzd2FwIGludGVydmFsIHRvIHVwZGF0ZSB0aGUgYnVmZmVyIGltbWVkaWF0ZWx5LiBUaGF0IGJ1ZmZlcgorICAgICMgd2lsbCB0aGVuIGJlIHByZXNlbnRlZCBieSB0aGUgY29tcG9zaXRvciBvbiBpdHMgb3duIHRpbWUuCisgICAgJ2NvYmFsdF9lZ2xfc3dhcF9pbnRlcnZhbCc6IDAsCisKKyAgICAjIEhvb2sgaW50byB0aGUgc3dhcCBidWZmZXJzIGNhbGwgdG8gZmFjaWxpdGF0ZSBzeW5jaHJvbml6YXRpb24gb2YgdGhlCisgICAgIyBPcGVuR0wgb3V0cHV0IHdpdGggdGhlIHB1bmNoLXRocm91Z2ggdmlkZW8gbGF5ZXIuCisgICAgJ2xpbmtlcl9mbGFncyc6IFsKKyAgICAgICctV2wsLS13cmFwPWVnbFN3YXBCdWZmZXJzJywKKyAgICBdLAorCiAgICAgJ2NvYmFsdF9wbGF0Zm9ybV9kZXBlbmRlbmNpZXMnOiBbCiAgICAgICAjIEdMIExpbnV4IG1ha2VzIHNvbWUgR0wgY2FsbHMgd2l0aGluIGRlY29kZV90YXJnZXRfaW50ZXJuYWwuY2MuCiAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL2VnbF9hbmRfZ2xlcy9lZ2xfYW5kX2dsZXMuZ3lwOmVnbF9hbmRfZ2xlcycsCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9tZWRpYV9pc19vdXRwdXRfcHJvdGVjdGVkLmNjIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvbWVkaWFfaXNfb3V0cHV0X3Byb3RlY3RlZC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWJlYThlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvbWVkaWFfaXNfb3V0cHV0X3Byb3RlY3RlZC5jYwpAQCAtMCwwICsxLDIxIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAic3RhcmJvYXJkL21lZGlhLmgiCisKK2Jvb2wgU2JNZWRpYUlzT3V0cHV0UHJvdGVjdGVkKCkgeworICAvLyBQcmV0ZW5kIHRoYXQgSERDUCBpcyBhbHdheXMgb24gYmVjYXVzZSBMaW51eCBpcyBvbmx5IGFibGUgdG8gcGxheSBTRAorICAvLyBwcm90ZWN0ZWQgY29udGVudC4KKyAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9tb2NrL2NvbmZpZ3VyYXRpb25fcHVibGljLmggYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9tb2NrL2NvbmZpZ3VyYXRpb25fcHVibGljLmgKaW5kZXggMmMwN2Q5Yy4uMWEyMzdmNiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvbW9jay9jb25maWd1cmF0aW9uX3B1YmxpYy5oCisrKyBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL21vY2svY29uZmlndXJhdGlvbl9wdWJsaWMuaApAQCAtODUsOSArODUsNiBAQAogLy8gV2hldGhlciB0aGUgY3VycmVudCBwbGF0Zm9ybSBpcyBleHBlY3RlZCB0byBoYXZlIGV4YWN0bHkgNiBjb3Jlcy4KICNkZWZpbmUgU0JfSEFTXzZfQ09SRVMgMAogCi0vLyBXaGV0aGVyIHRoZSBjdXJyZW50IHBsYXRmb3JtIHN1cHBvcnRzIHRocmVhZCBwcmlvcml0aWVzLgotI2RlZmluZSBTQl9IQVNfVEhSRUFEX1BSSU9SSVRZX1NVUFBPUlQgMAotCiAvLyBXaGV0aGVyIHRoZSBjdXJyZW50IHBsYXRmb3JtJ3MgdGhyZWFkIHNjaGVkdWxlciB3aWxsIGF1dG9tYXRpY2FsbHkgYmFsYW5jZQogLy8gdGhyZWFkcyBiZXR3ZWVuIGNvcmVzLCBhcyBvcHBvc2VkIHRvIHN5c3RlbXMgd2hlcmUgdGhyZWFkcyB3aWxsIG9ubHkgZXZlciBydW4KIC8vIG9uIHRoZSBzcGVjaWZpY2FsbHkgcGlubmVkIGNvcmUuCkBAIC0xMzAsMTUgKzEyNyw2IEBACiAvLyBXaGV0aGVyIHRoZSBjdXJyZW50IHBsYXRmb3JtIHByb3ZpZGVzIHNzaXplX3QuCiAjZGVmaW5lIFNCX0hBU19TU0laRV9UIDEKIAotLy8gV2hldGhlciB0aGUgY3VycmVudCBwbGF0Zm9ybSBoYXMgbWljcm9waG9uZSBzdXBwb3J0ZWQuCi0jZGVmaW5lIFNCX0hBU19NSUNST1BIT05FIDEKLQotLy8gV2hldGhlciB0aGUgY3VycmVudCBwbGF0Zm9ybSBoYXMgc3BlZWNoIHJlY29nbml6ZXIuCi0jZGVmaW5lIFNCX0hBU19TUEVFQ0hfUkVDT0dOSVpFUiAxCi0KLS8vIFdoZXRoZXIgdGhlIGN1cnJlbnQgcGxhdGZvcm0gaGFzIHNwZWVjaCBzeW50aGVzaXMuCi0jZGVmaW5lIFNCX0hBU19TUEVFQ0hfU1lOVEhFU0lTIDEKLQogLy8gVHlwZSBkZXRlY3Rpb24gZm9yIHdjaGFyX3QuCiAjaWYgZGVmaW5lZChfX1dDSEFSX01BWF9fKSAmJiBcCiAgICAgKF9fV0NIQVJfTUFYX18gPT0gMHg3ZmZmZmZmZiB8fCBfX1dDSEFSX01BWF9fID09IDB4ZmZmZmZmZmYpCkBAIC0yNjYsNTQgKzI1NCw2IEBACiAvLyBhY2Nlc3MgdGltZSBpcyBvZiAxIGRheSBwcmVjaXNpb24uCiAjdW5kZWYgU0JfSEFTX1FVSVJLX0ZJTEVTWVNURU1fQ09BUlNFX0FDQ0VTU19USU1FCiAKLS8vIC0tLSBNZW1vcnkgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBUaGUgbWVtb3J5IHBhZ2Ugc2l6ZSwgd2hpY2ggY29udHJvbHMgdGhlIHNpemUgb2YgY2h1bmtzIG9uIG1lbW9yeSB0aGF0Ci0vLyBhbGxvY2F0b3JzIGRlYWwgd2l0aCwgYW5kIHRoZSBhbGlnbm1lbnQgb2YgdGhvc2UgY2h1bmtzLiBUaGlzIGRvZXNuJ3QgaGF2ZSB0bwotLy8gYmUgdGhlIGhhcmR3YXJlLWRlZmluZWQgcGh5c2ljYWwgcGFnZSBzaXplLCBidXQgaXQgc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YKLS8vIGl0LgotI2RlZmluZSBTQl9NRU1PUllfUEFHRV9TSVpFIDQwOTYKLQotLy8gV2hldGhlciB0aGlzIHBsYXRmb3JtIGhhcyBhbmQgc2hvdWxkIHVzZSBhbiBNTUFQIGZ1bmN0aW9uIHRvIG1hcCBwaHlzaWNhbAotLy8gbWVtb3J5IHRvIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UuCi0jZGVmaW5lIFNCX0hBU19NTUFQIDAKLQotLy8gV2hldGhlciB0aGlzIHBsYXRmb3JtIGNhbiBtYXAgZXhlY3V0YWJsZSBtZW1vcnkuIEltcGxpZXMgU0JfSEFTX01NQVAuIFRoaXMgaXMKLS8vIHJlcXVpcmVkIGZvciBwbGF0Zm9ybXMgdGhhdCB3YW50IHRvIEpJVC4KLSNkZWZpbmUgU0JfQ0FOX01BUF9FWEVDVVRBQkxFX01FTU9SWSAwCi0KLS8vIFdoZXRoZXIgdGhpcyBwbGF0Zm9ybSBoYXMgYW5kIHNob3VsZCB1c2UgYW4gZ3Jvd2FibGUgaGVhcCAoZS5nLiB3aXRoIHNicmsoKSkKLS8vIHRvIG1hcCBwaHlzaWNhbCBtZW1vcnkgdG8gdGhlIHZpcnR1YWwgYWRkcmVzcyBzcGFjZS4KLSNkZWZpbmUgU0JfSEFTX1ZJUlRVQUxfUkVHSU9OUyAwCi0KLS8vIFNwZWNpZmllcyB0aGUgYWxpZ25tZW50IGZvciBJTyBCdWZmZXJzLCBpbiBieXRlcy4gU29tZSBsb3ctbGV2ZWwgbmV0d29yayBBUElzCi0vLyBtYXkgcmVxdWlyZSBidWZmZXJzIHRvIGhhdmUgYSBzcGVjaWZpYyBhbGlnbm1lbnQsIGFuZCB0aGlzIGlzIHRoZSBwbGFjZSB0bwotLy8gc3BlY2lmeSB0aGF0LgotI2RlZmluZSBTQl9ORVRXT1JLX0lPX0JVRkZFUl9BTElHTk1FTlQgMTYKLQotLy8gRGV0ZXJtaW5lcyB0aGUgYWxpZ25tZW50IHRoYXQgYWxsb2NhdGlvbnMgc2hvdWxkIGhhdmUgb24gdGhpcyBwbGF0Zm9ybS4KLSNkZWZpbmUgU0JfTUFMTE9DX0FMSUdOTUVOVCAoKHNpemVfdCkxNlUpCi0KLS8vIERldGVybWluZXMgdGhlIHRocmVzaGhvbGQgb2YgYWxsb2NhdGlvbiBzaXplIHRoYXQgc2hvdWxkIGJlIGRvbmUgd2l0aCBtbWFwCi0vLyAoaWYgYXZhaWxhYmxlKSwgcmF0aGVyIHRoYW4gYWxsb2NhdGVkIHdpdGhpbiB0aGUgY29yZSBoZWFwLgotI2RlZmluZSBTQl9ERUZBVUxUX01NQVBfVEhSRVNIT0xEICgoc2l6ZV90KSgyNTYgKiAxMDI0VSkpCi0KLS8vIERlZmluZXMgdGhlIHBhdGggd2hlcmUgbWVtb3J5IGRlYnVnZ2luZyBsb2dzIHNob3VsZCBiZSB3cml0dGVuIHRvLgotI2RlZmluZSBTQl9NRU1PUllfTE9HX1BBVEggIi90bXAvc3RhcmJvYXJkIgotCi0vLyAtLS0gVGhyZWFkIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gRGVmaW5lcyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2ltdWx0YW5lb3VzIHRocmVhZHMgZm9yIHRoaXMgcGxhdGZvcm0uIFNvbWUKLS8vIHBsYXRmb3JtcyByZXF1aXJlIHNoYXJpbmcgdGhyZWFkIGhhbmRsZXMgd2l0aCBvdGhlciBraW5kcyBvZiBzeXN0ZW0gaGFuZGxlcywKLS8vIGxpa2UgbXV0ZXhlcywgc28gd2Ugd2FudCB0byBrZWVwIHRoaXMgbWFuYWdhYmxlLgotI2RlZmluZSBTQl9NQVhfVEhSRUFEUyA5MAotCi0vLyBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGhyZWFkIGxvY2FsIHN0b3JhZ2Uga2V5cyBzdXBwb3J0ZWQgYnkgdGhpcyBwbGF0Zm9ybS4KLSNkZWZpbmUgU0JfTUFYX1RIUkVBRF9MT0NBTF9LRVlTIDUxMgotCi0vLyBUaGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIG5hbWUgZm9yIGEgdGhyZWFkLCBpbmNsdWRpbmcgdGhlIE5VTEwtdGVybWluYXRvci4KLSNkZWZpbmUgU0JfTUFYX1RIUkVBRF9OQU1FX0xFTkdUSCAxNjsKLQogLy8gLS0tIEdyYXBoaWNzIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIC8vIFNwZWNpZmllcyB3aGV0aGVyIHRoaXMgcGxhdGZvcm0gc3VwcG9ydHMgYSBwZXJmb3JtYW50IGFjY2VsZXJhdGVkIGJsaXR0ZXIKQEAgLTM0Miw2ICsyODIsMTcgQEAKIAogI2RlZmluZSBTQl9IQVNfVklSVFVBTF9SRUFMSVRZIDAKIAorLy8gLS0tIEkvTyBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFdoZXRoZXIgdGhlIGN1cnJlbnQgcGxhdGZvcm0gaGFzIG1pY3JvcGhvbmUgc3VwcG9ydGVkLgorI2RlZmluZSBTQl9IQVNfTUlDUk9QSE9ORSAxCisKKy8vIFdoZXRoZXIgdGhlIGN1cnJlbnQgcGxhdGZvcm0gaGFzIHNwZWVjaCByZWNvZ25pemVyLgorI2RlZmluZSBTQl9IQVNfU1BFRUNIX1JFQ09HTklaRVIgMQorCisvLyBXaGV0aGVyIHRoZSBjdXJyZW50IHBsYXRmb3JtIGhhcyBzcGVlY2ggc3ludGhlc2lzLgorI2RlZmluZSBTQl9IQVNfU1BFRUNIX1NZTlRIRVNJUyAxCisKIC8vIC0tLSBNZWRpYSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAvLyBBZnRlciBhIHNlZWsgaXMgdHJpZ2dlcnJlZCwgdGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gYXBwZW5kIHZpZGVvIGZyYW1lcwpAQCAtNDA4LDYgKzM1OSw0MSBAQAogLy8gdmFsdWUgbGVhZHMgdG8gbW9yZSBzdGFibGUgZnBzIGJ1dCBhbHNvIGNhdXNlcyB0aGUgYXBwIHRvIHVzZSBtb3JlIG1lbW9yeS4KICNkZWZpbmUgU0JfTUVESUFfTUFYSU1VTV9WSURFT19GUkFNRVMgMTIKIAorLy8gLS0tIE1lbW9yeSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRoZSBtZW1vcnkgcGFnZSBzaXplLCB3aGljaCBjb250cm9scyB0aGUgc2l6ZSBvZiBjaHVua3Mgb24gbWVtb3J5IHRoYXQKKy8vIGFsbG9jYXRvcnMgZGVhbCB3aXRoLCBhbmQgdGhlIGFsaWdubWVudCBvZiB0aG9zZSBjaHVua3MuIFRoaXMgZG9lc24ndCBoYXZlIHRvCisvLyBiZSB0aGUgaGFyZHdhcmUtZGVmaW5lZCBwaHlzaWNhbCBwYWdlIHNpemUsIGJ1dCBpdCBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZgorLy8gaXQuCisjZGVmaW5lIFNCX01FTU9SWV9QQUdFX1NJWkUgNDA5NgorCisvLyBXaGV0aGVyIHRoaXMgcGxhdGZvcm0gaGFzIGFuZCBzaG91bGQgdXNlIGFuIE1NQVAgZnVuY3Rpb24gdG8gbWFwIHBoeXNpY2FsCisvLyBtZW1vcnkgdG8gdGhlIHZpcnR1YWwgYWRkcmVzcyBzcGFjZS4KKyNkZWZpbmUgU0JfSEFTX01NQVAgMAorCisvLyBXaGV0aGVyIHRoaXMgcGxhdGZvcm0gY2FuIG1hcCBleGVjdXRhYmxlIG1lbW9yeS4gSW1wbGllcyBTQl9IQVNfTU1BUC4gVGhpcyBpcworLy8gcmVxdWlyZWQgZm9yIHBsYXRmb3JtcyB0aGF0IHdhbnQgdG8gSklULgorI2RlZmluZSBTQl9DQU5fTUFQX0VYRUNVVEFCTEVfTUVNT1JZIDAKKworLy8gV2hldGhlciB0aGlzIHBsYXRmb3JtIGhhcyBhbmQgc2hvdWxkIHVzZSBhbiBncm93YWJsZSBoZWFwIChlLmcuIHdpdGggc2JyaygpKQorLy8gdG8gbWFwIHBoeXNpY2FsIG1lbW9yeSB0byB0aGUgdmlydHVhbCBhZGRyZXNzIHNwYWNlLgorI2RlZmluZSBTQl9IQVNfVklSVFVBTF9SRUdJT05TIDAKKworLy8gU3BlY2lmaWVzIHRoZSBhbGlnbm1lbnQgZm9yIElPIEJ1ZmZlcnMsIGluIGJ5dGVzLiBTb21lIGxvdy1sZXZlbCBuZXR3b3JrIEFQSXMKKy8vIG1heSByZXF1aXJlIGJ1ZmZlcnMgdG8gaGF2ZSBhIHNwZWNpZmljIGFsaWdubWVudCwgYW5kIHRoaXMgaXMgdGhlIHBsYWNlIHRvCisvLyBzcGVjaWZ5IHRoYXQuCisjZGVmaW5lIFNCX05FVFdPUktfSU9fQlVGRkVSX0FMSUdOTUVOVCAxNgorCisvLyBEZXRlcm1pbmVzIHRoZSBhbGlnbm1lbnQgdGhhdCBhbGxvY2F0aW9ucyBzaG91bGQgaGF2ZSBvbiB0aGlzIHBsYXRmb3JtLgorI2RlZmluZSBTQl9NQUxMT0NfQUxJR05NRU5UICgoc2l6ZV90KTE2VSkKKworLy8gRGV0ZXJtaW5lcyB0aGUgdGhyZXNoaG9sZCBvZiBhbGxvY2F0aW9uIHNpemUgdGhhdCBzaG91bGQgYmUgZG9uZSB3aXRoIG1tYXAKKy8vIChpZiBhdmFpbGFibGUpLCByYXRoZXIgdGhhbiBhbGxvY2F0ZWQgd2l0aGluIHRoZSBjb3JlIGhlYXAuCisjZGVmaW5lIFNCX0RFRkFVTFRfTU1BUF9USFJFU0hPTEQgKChzaXplX3QpKDI1NiAqIDEwMjRVKSkKKworLy8gRGVmaW5lcyB0aGUgcGF0aCB3aGVyZSBtZW1vcnkgZGVidWdnaW5nIGxvZ3Mgc2hvdWxkIGJlIHdyaXR0ZW4gdG8uCisjZGVmaW5lIFNCX01FTU9SWV9MT0dfUEFUSCAiL3RtcC9zdGFyYm9hcmQiCisKIC8vIC0tLSBOZXR3b3JrIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAvLyBTcGVjaWZpZXMgd2hldGhlciB0aGlzIHBsYXRmb3JtIHN1cHBvcnRzIElQVjYuCkBAIC00MTYsNiArNDAyLDI4IEBACiAvLyBTcGVjaWZpZXMgd2hldGhlciB0aGlzIHBsYXRmb3JtIHN1cHBvcnRzIHBpcGUuCiAjZGVmaW5lIFNCX0hBU19QSVBFIDEKIAorLy8gLS0tIFRocmVhZCBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFdoZXRoZXIgdGhlIGN1cnJlbnQgcGxhdGZvcm0gc3VwcG9ydHMgdGhyZWFkIHByaW9yaXRpZXMuCisjZGVmaW5lIFNCX0hBU19USFJFQURfUFJJT1JJVFlfU1VQUE9SVCAwCisKKy8vIERlZmluZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHNpbXVsdGFuZW91cyB0aHJlYWRzIGZvciB0aGlzIHBsYXRmb3JtLiBTb21lCisvLyBwbGF0Zm9ybXMgcmVxdWlyZSBzaGFyaW5nIHRocmVhZCBoYW5kbGVzIHdpdGggb3RoZXIga2luZHMgb2Ygc3lzdGVtIGhhbmRsZXMsCisvLyBsaWtlIG11dGV4ZXMsIHNvIHdlIHdhbnQgdG8ga2VlcCB0aGlzIG1hbmFnYWJsZS4KKyNkZWZpbmUgU0JfTUFYX1RIUkVBRFMgOTAKKworLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIHRocmVhZCBsb2NhbCBzdG9yYWdlIGtleXMgc3VwcG9ydGVkIGJ5IHRoaXMgcGxhdGZvcm0uCisjZGVmaW5lIFNCX01BWF9USFJFQURfTE9DQUxfS0VZUyA1MTIKKworLy8gVGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBuYW1lIGZvciBhIHRocmVhZCwgaW5jbHVkaW5nIHRoZSBOVUxMLXRlcm1pbmF0b3IuCisjZGVmaW5lIFNCX01BWF9USFJFQURfTkFNRV9MRU5HVEggMTYKKworLy8gLS0tIFRpbWluZyBBUEkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFdoZXRoZXIgdGhpcyBwbGF0Zm9ybSBoYXMgYW4gQVBJIHRvIHJldHJpZXZlIGhvdyBsb25nIHRoZSBjdXJyZW50IHRocmVhZAorLy8gaGFzIHNwZW50IGluIHRoZSBleGVjdXRpbmcgc3RhdGUuCisjZGVmaW5lIFNCX0hBU19USU1FX1RIUkVBRF9OT1cgMQorCiAvLyAtLS0gVHVuZWFibGUgUGFyYW1ldGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogLy8gU3BlY2lmaWVzIHRoZSBuZXR3b3JrIHJlY2VpdmUgYnVmZmVyIHNpemUgaW4gYnl0ZXMsIHNldCB2aWEKQEAgLTQzNywxMiArNDQ1LDYgQEAKIC8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiB1c2VycyB0aGF0IGNhbiBiZSBzaWduZWQgaW4gYXQgdGhlIHNhbWUgdGltZS4KICNkZWZpbmUgU0JfVVNFUl9NQVhfU0lHTkVEX0lOIDEKIAotLy8gLS0tIFRpbWluZyBBUEkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIFdoZXRoZXIgdGhpcyBwbGF0Zm9ybSBoYXMgYW4gQVBJIHRvIHJldHJpZXZlIGhvdyBsb25nIHRoZSBjdXJyZW50IHRocmVhZAotLy8gaGFzIHNwZW50IGluIHRoZSBleGVjdXRpbmcgc3RhdGUuCi0jZGVmaW5lIFNCX0hBU19USU1FX1RIUkVBRF9OT1cgMQotCiAvLyAtLS0gUGxhdGZvcm0gU3BlY2lmaWMgQXVkaXRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogI2lmICFkZWZpbmVkKF9fR05VQ19fKQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvbW9jay9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvbW9jay9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwCmluZGV4IDJlOGI4NGEuLjYyMGNjMzAgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL21vY2svc3RhcmJvYXJkX3BsYXRmb3JtLmd5cAorKysgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9tb2NrL3N0YXJib2FyZF9wbGF0Zm9ybS5neXAKQEAgLTYxLDcgKzYxLDkgQEAKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9kcm1fY3JlYXRlX3N5c3RlbS5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZHJtX2Rlc3Ryb3lfc3lzdGVtLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9kcm1fZ2VuZXJhdGVfc2Vzc2lvbl91cGRhdGVfcmVxdWVzdC5jYycsCisgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZHJtX2lzX3NlcnZlcl9jZXJ0aWZpY2F0ZV91cGRhdGFibGUuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RybV9zeXN0ZW1faW50ZXJuYWwuaCcsCisgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZHJtX3VwZGF0ZV9zZXJ2ZXJfY2VydGlmaWNhdGUuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RybV91cGRhdGVfc2Vzc2lvbi5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZmlsZV9jYW5fb3Blbi5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZmlsZV9jbG9zZS5jYycsCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9tb3pqcy9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvbW96anMvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cAppbmRleCBkYjdjNDY4Li43NTk5MWE1IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9tb3pqcy9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwCisrKyBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL21vempzL3N0YXJib2FyZF9wbGF0Zm9ybS5neXAKQEAgLTEzLDIxICsxMyw2IEBACiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogewogICAnaW5jbHVkZXMnOiBbCi0gICAgJy4uL3N0YXJib2FyZF9wbGF0Zm9ybS5neXBpJwotICBdLAotICAndGFyZ2V0cyc6IFsKLSAgICB7Ci0gICAgICAndGFyZ2V0X25hbWUnOiAnc3RhcmJvYXJkX3BsYXRmb3JtJywKLSAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKLSAgICAgICdzb3VyY2VzJzogWyc8QChzdGFyYm9hcmRfcGxhdGZvcm1fc291cmNlcyknXSwKLSAgICAgICdkZWZpbmVzJzogWwotICAgICAgICAjIFRoaXMgbXVzdCBiZSBkZWZpbmVkIHdoZW4gYnVpbGRpbmcgU3RhcmJvYXJkLCBhbmQgbXVzdCBub3Qgd2hlbgotICAgICAgICAjIGJ1aWxkaW5nIFN0YXJib2FyZCBjbGllbnQgY29kZS4KLSAgICAgICAgJ1NUQVJCT0FSRF9JTVBMRU1FTlRBVElPTicsCi0gICAgICBdLAotICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKLSAgICAgICAgJzxAKHN0YXJib2FyZF9wbGF0Zm9ybV9kZXBlbmRlbmNpZXMpJywKLSAgICAgIF0sCi0gICAgfSwKKyAgICAnLi4vc3RhcmJvYXJkX3BsYXRmb3JtLmd5cCcKICAgXSwKIH0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL3Nhbml0aXplcl9vcHRpb25zLmNjIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvc2FuaXRpemVyX29wdGlvbnMuY2MKaW5kZXggZThhNGFlYS4uYTNjMzczNiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvc2FuaXRpemVyX29wdGlvbnMuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvc2FuaXRpemVyX29wdGlvbnMuY2MKQEAgLTM4LDYgKzM4LDcgQEAKIFNBTklUSVpFUl9IT09LX0FUVFJJQlVURSBjb25zdCBjaGFyKiBfX2xzYW5fZGVmYXVsdF9zdXBwcmVzc2lvbnMoKSB7CiAgIHJldHVybgogICAgICAgImxlYWs6ZWdsX2dhbGxpdW0uc29cbiIKKyAgICAgICJsZWFrOm52aWRpYVxuIgogICAgICAgImxlYWs6bGlic3BlZWNoZC5zb1xuIjsKIH0KIApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvc2J2ZXJzaW9uLzQvYXRvbWljX3B1YmxpYy5oIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvc2J2ZXJzaW9uLzQvYXRvbWljX3B1YmxpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMzgzMGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9zYnZlcnNpb24vNC9hdG9taWNfcHVibGljLmgKQEAgLTAsMCArMSwyMyBAQAorLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gVGhpcyBmaWxlIHdhcyBpbml0aWFsbHkgZ2VuZXJhdGVkIGJ5IGNyZWF0ZV9kZXJpdmVkX2J1aWxkLnB5LAorLy8gdGhvdWdoIGl0IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgc2luY2UgaXRzIGNyZWF0aW9uLgorCisjaWZuZGVmIFNUQVJCT0FSRF9MSU5VWF9YNjRYMTFfU0JWRVJTSU9OXzRfQVRPTUlDX1BVQkxJQ19IXworI2RlZmluZSBTVEFSQk9BUkRfTElOVVhfWDY0WDExX1NCVkVSU0lPTl80X0FUT01JQ19QVUJMSUNfSF8KKworI2luY2x1ZGUgInN0YXJib2FyZC9saW51eC94NjR4MTEvYXRvbWljX3B1YmxpYy5oIgorCisjZW5kaWYgIC8vIFNUQVJCT0FSRF9MSU5VWF9YNjRYMTFfU0JWRVJTSU9OXzRfQVRPTUlDX1BVQkxJQ19IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvc2J2ZXJzaW9uLzQvY29uZmlndXJhdGlvbl9wdWJsaWMuaCBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL3NidmVyc2lvbi80L2NvbmZpZ3VyYXRpb25fcHVibGljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU3ZWZiMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL3NidmVyc2lvbi80L2NvbmZpZ3VyYXRpb25fcHVibGljLmgKQEAgLTAsMCArMSwyNiBAQAorLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gVGhpcyBmaWxlIHdhcyBpbml0aWFsbHkgZ2VuZXJhdGVkIGJ5IGNyZWF0ZV9kZXJpdmVkX2J1aWxkLnB5LAorLy8gdGhvdWdoIGl0IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgc2luY2UgaXRzIGNyZWF0aW9uLgorCisjaWZuZGVmIFNUQVJCT0FSRF9MSU5VWF9YNjRYMTFfU0JWRVJTSU9OXzRfQ09ORklHVVJBVElPTl9QVUJMSUNfSF8KKyNkZWZpbmUgU1RBUkJPQVJEX0xJTlVYX1g2NFgxMV9TQlZFUlNJT05fNF9DT05GSUdVUkFUSU9OX1BVQkxJQ19IXworCisjdW5kZWYgU0JfQVBJX1ZFUlNJT04KKyNkZWZpbmUgU0JfQVBJX1ZFUlNJT04gNAorCisjaW5jbHVkZSAic3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9jb25maWd1cmF0aW9uX3B1YmxpYy5oIgorCisjZW5kaWYgIC8vIFNUQVJCT0FSRF9MSU5VWF9YNjRYMTFfU0JWRVJTSU9OXzRfQ09ORklHVVJBVElPTl9QVUJMSUNfSF8KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL3NidmVyc2lvbi80L2d5cF9jb25maWd1cmF0aW9uLmd5cGkgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9zYnZlcnNpb24vNC9neXBfY29uZmlndXJhdGlvbi5neXBpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmZjQxY2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9zYnZlcnNpb24vNC9neXBfY29uZmlndXJhdGlvbi5neXBpCkBAIC0wLDAgKzEsNDAgQEAKKyMgQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBUaGlzIGZpbGUgd2FzIGluaXRpYWxseSBnZW5lcmF0ZWQgYnkgY3JlYXRlX2Rlcml2ZWRfYnVpbGQucHksCisjIHRob3VnaCBpdCBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIHNpbmNlIGl0cyBjcmVhdGlvbi4KKworeworICAndGFyZ2V0X2RlZmF1bHRzJzogeworICAgICdkZWZhdWx0X2NvbmZpZ3VyYXRpb24nOiAnbGludXgteDY0eDExLXNidmVyc2lvbi00X2RlYnVnJywKKyAgICAnY29uZmlndXJhdGlvbnMnOiB7CisgICAgICAnbGludXgteDY0eDExLXNidmVyc2lvbi00X2RlYnVnJzogeworICAgICAgICAnaW5oZXJpdF9mcm9tJzogWydkZWJ1Z19iYXNlJ10sCisgICAgICB9LAorICAgICAgJ2xpbnV4LXg2NHgxMS1zYnZlcnNpb24tNF9kZXZlbCc6IHsKKyAgICAgICAgJ2luaGVyaXRfZnJvbSc6IFsnZGV2ZWxfYmFzZSddLAorICAgICAgfSwKKyAgICAgICdsaW51eC14NjR4MTEtc2J2ZXJzaW9uLTRfcWEnOiB7CisgICAgICAgICdpbmhlcml0X2Zyb20nOiBbJ3FhX2Jhc2UnXSwKKyAgICAgIH0sCisgICAgICAnbGludXgteDY0eDExLXNidmVyc2lvbi00X2dvbGQnOiB7CisgICAgICAgICdpbmhlcml0X2Zyb20nOiBbJ2dvbGRfYmFzZSddLAorICAgICAgfSwKKyAgICB9LCAjIGVuZCBvZiBjb25maWd1cmF0aW9ucworICB9LAorCisgICdpbmNsdWRlcyc6IFsKKyAgICAnPChERVBUSCkvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9neXBfY29uZmlndXJhdGlvbi5neXBpJywKKyAgXSwKK30KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL3NidmVyc2lvbi80L2d5cF9jb25maWd1cmF0aW9uLnB5IGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvc2J2ZXJzaW9uLzQvZ3lwX2NvbmZpZ3VyYXRpb24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA1OTk3OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL3NidmVyc2lvbi80L2d5cF9jb25maWd1cmF0aW9uLnB5CkBAIC0wLDAgKzEsNDMgQEAKKyMgQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBUaGlzIGZpbGUgd2FzIGluaXRpYWxseSBnZW5lcmF0ZWQgYnkgY3JlYXRlX2Rlcml2ZWRfYnVpbGQucHksCisjIHRob3VnaCBpdCBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIHNpbmNlIGl0cyBjcmVhdGlvbi4KKworaW1wb3J0IG9zCisKK2Zyb20gc3RhcmJvYXJkLmxpbnV4Lng2NHgxMSBpbXBvcnQgZ3lwX2NvbmZpZ3VyYXRpb24gYXMgcGFyZW50X2NvbmZpZ3VyYXRpb24KKworCitjbGFzcyBMaW51eFg2NFgxMVNidmVyc2lvbjRDb25maWd1cmF0aW9uKAorICAgIHBhcmVudF9jb25maWd1cmF0aW9uLkxpbnV4WDY0WDExQ29uZmlndXJhdGlvbik6CisKKyAgZGVmIEdldFZhcmlhYmxlcyhzZWxmLCBjb25maWdfbmFtZSk6CisgICAgdmFyaWFibGVzID0gc3VwZXIoTGludXhYNjRYMTFTYnZlcnNpb240Q29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmKS5HZXRWYXJpYWJsZXMoY29uZmlnX25hbWUpCisgICAgIyBWOCByZXF1aXJlcyBuZXcgU3RhcmJvYXJkIGZlYXR1cmVzIHNvIHdlIG11c3QgdXNlIFNwaWRlck1vbmtleSBpbiBvbGRlcgorICAgICMgdmVyc2lvbnMgb2YgU3RhcmJvYXJkLgorICAgIHZhcmlhYmxlcy51cGRhdGUoeworICAgICAgICAnamF2YXNjcmlwdF9lbmdpbmUnOiAnbW96anMtNDUnLAorICAgICAgICAnY29iYWx0X2VuYWJsZV9qaXQnOiAwLAorICAgIH0pCisgICAgcmV0dXJuIHZhcmlhYmxlcworCisgIGRlZiBHZXRMYXVuY2hlclBhdGgoc2VsZik6CisgICAgIiIiR2V0cyB0aGUgcGF0aCB0byB0aGUgbGF1bmNoZXIgbW9kdWxlIGZvciB0aGlzIHBsYXRmb3JtLiIiIgorICAgIHJldHVybiBvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pCisKKworZGVmIENyZWF0ZVBsYXRmb3JtQ29uZmlnKCk6CisgIHJldHVybiBMaW51eFg2NFgxMVNidmVyc2lvbjRDb25maWd1cmF0aW9uKCdsaW51eC14NjR4MTEtc2J2ZXJzaW9uLTQnKQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvc2J2ZXJzaW9uLzQvbGF1bmNoZXIucHkgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9zYnZlcnNpb24vNC9sYXVuY2hlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2M1MGIyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvc2J2ZXJzaW9uLzQvbGF1bmNoZXIucHkKQEAgLTAsMCArMSwyNSBAQAorIyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIiIiU3BlY2lhbGl6ZWQgU3RhcmJvYXJkIHZlcnNpb24gNCBsYXVuY2hlciBleHByZXNzaW5nIG5vIHByZWxvYWQgc3VwcG9ydC4iIiIKKworaW1wb3J0IHN0YXJib2FyZC5saW51eC5zaGFyZWQubGF1bmNoZXIgYXMgbGF1bmNoZXIKKworCitjbGFzcyBMYXVuY2hlcihsYXVuY2hlci5MYXVuY2hlcik6CisKKyAgZGVmIFN1cHBvcnRzU3VzcGVuZFJlc3VtZShzZWxmKToKKyAgICAjIFdoaWxlIHRlY2huaWNhbGx5IFN0YXJib2FyZCB2ZXJzaW9uIDQgZG9lcyBzdXBwb3J0IHN1c3BlbmQvcmVzdW1lLCBpdAorICAgICMgZG9lcyBub3Qgc3VwcG9ydCBwcmVsb2FkIGFuZCBzbyB3ZSByZXR1cm4gZmFsc2UgaGVyZSB0byBhdm9pZCBydW5uaW5nCisgICAgIyB0ZXN0cyB3aGljaCBhc3N1bWUgIlN1c3BlbmRSZXN1bWUiIHN1cHBvcnQgaW1wbGllcyBwcmVsb2FkIHN1cHBvcnQuCisgICAgcmV0dXJuIEZhbHNlCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9zYnZlcnNpb24vNC9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvc2J2ZXJzaW9uLzQvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjE0N2FhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvc2J2ZXJzaW9uLzQvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cApAQCAtMCwwICsxLDI0IEBACisjIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgVGhpcyBmaWxlIHdhcyBpbml0aWFsbHkgZ2VuZXJhdGVkIGJ5IGNyZWF0ZV9kZXJpdmVkX2J1aWxkLnB5LAorIyB0aG91Z2ggaXQgbWF5IGhhdmUgYmVlbiBtb2RpZmllZCBzaW5jZSBpdHMgY3JlYXRpb24uCisKK3sKKyAgJ2luY2x1ZGVzJzogWworICAgICMgTm90ZSB0aGF0IHdlIGFyZSAnaW5jbHVkZXMnaW5nIGEgJ2d5cCcgZmlsZSwgbm90IGEgJ2d5cGknIGZpbGUuICBUaGUgaWRlYQorICAgICMgaXMgdGhhdCB3ZSBqdXN0IHdhbnQgdGhpcyBmaWxlIHRvICpiZSogdGhlIHBhcmVudCBneXAgZmlsZS4KKyAgICAnPChERVBUSCkvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwJywKKyAgXSwKK30KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL3NidmVyc2lvbi80L3N0YXJib2FyZF9wbGF0Zm9ybV90ZXN0cy5neXAgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9zYnZlcnNpb24vNC9zdGFyYm9hcmRfcGxhdGZvcm1fdGVzdHMuZ3lwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYThmYzIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9zYnZlcnNpb24vNC9zdGFyYm9hcmRfcGxhdGZvcm1fdGVzdHMuZ3lwCkBAIC0wLDAgKzEsMjQgQEAKKyMgQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBUaGlzIGZpbGUgd2FzIGluaXRpYWxseSBnZW5lcmF0ZWQgYnkgY3JlYXRlX2Rlcml2ZWRfYnVpbGQucHksCisjIHRob3VnaCBpdCBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIHNpbmNlIGl0cyBjcmVhdGlvbi4KKworeworICAnaW5jbHVkZXMnOiBbCisgICAgIyBOb3RlIHRoYXQgd2UgYXJlICdpbmNsdWRlcydpbmcgYSAnZ3lwJyBmaWxlLCBub3QgYSAnZ3lwaScgZmlsZS4gIFRoZSBpZGVhCisgICAgIyBpcyB0aGF0IHdlIGp1c3Qgd2FudCB0aGlzIGZpbGUgdG8gKmJlKiB0aGUgcGFyZW50IGd5cCBmaWxlLgorICAgICc8KERFUFRIKS9zdGFyYm9hcmQvbGludXgveDY0eDExL3N0YXJib2FyZF9wbGF0Zm9ybV90ZXN0cy5neXAnLAorICBdLAorfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvc2J2ZXJzaW9uLzQvdGhyZWFkX3R5cGVzX3B1YmxpYy5oIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvc2J2ZXJzaW9uLzQvdGhyZWFkX3R5cGVzX3B1YmxpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNThjMGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9zYnZlcnNpb24vNC90aHJlYWRfdHlwZXNfcHVibGljLmgKQEAgLTAsMCArMSwyMyBAQAorLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gVGhpcyBmaWxlIHdhcyBpbml0aWFsbHkgZ2VuZXJhdGVkIGJ5IGNyZWF0ZV9kZXJpdmVkX2J1aWxkLnB5LAorLy8gdGhvdWdoIGl0IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgc2luY2UgaXRzIGNyZWF0aW9uLgorCisjaWZuZGVmIFNUQVJCT0FSRF9MSU5VWF9YNjRYMTFfU0JWRVJTSU9OXzRfVEhSRUFEX1RZUEVTX1BVQkxJQ19IXworI2RlZmluZSBTVEFSQk9BUkRfTElOVVhfWDY0WDExX1NCVkVSU0lPTl80X1RIUkVBRF9UWVBFU19QVUJMSUNfSF8KKworI2luY2x1ZGUgInN0YXJib2FyZC9saW51eC94NjR4MTEvdGhyZWFkX3R5cGVzX3B1YmxpYy5oIgorCisjZW5kaWYgIC8vIFNUQVJCT0FSRF9MSU5VWF9YNjRYMTFfU0JWRVJTSU9OXzRfVEhSRUFEX1RZUEVTX1BVQkxJQ19IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvc2J2ZXJzaW9uLzYvYXRvbWljX3B1YmxpYy5oIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvc2J2ZXJzaW9uLzYvYXRvbWljX3B1YmxpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyYWFjNzAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9zYnZlcnNpb24vNi9hdG9taWNfcHVibGljLmgKQEAgLTAsMCArMSwyMyBAQAorLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gVGhpcyBmaWxlIHdhcyBpbml0aWFsbHkgZ2VuZXJhdGVkIGJ5IGNyZWF0ZV9kZXJpdmVkX2J1aWxkLnB5LAorLy8gdGhvdWdoIGl0IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgc2luY2UgaXRzIGNyZWF0aW9uLgorCisjaWZuZGVmIFNUQVJCT0FSRF9MSU5VWF9YNjRYMTFfU0JWRVJTSU9OXzZfQVRPTUlDX1BVQkxJQ19IXworI2RlZmluZSBTVEFSQk9BUkRfTElOVVhfWDY0WDExX1NCVkVSU0lPTl82X0FUT01JQ19QVUJMSUNfSF8KKworI2luY2x1ZGUgInN0YXJib2FyZC9saW51eC94NjR4MTEvYXRvbWljX3B1YmxpYy5oIgorCisjZW5kaWYgIC8vIFNUQVJCT0FSRF9MSU5VWF9YNjRYMTFfU0JWRVJTSU9OXzZfQVRPTUlDX1BVQkxJQ19IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvc2J2ZXJzaW9uLzYvY29uZmlndXJhdGlvbl9wdWJsaWMuaCBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL3NidmVyc2lvbi82L2NvbmZpZ3VyYXRpb25fcHVibGljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc3MDE0NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL3NidmVyc2lvbi82L2NvbmZpZ3VyYXRpb25fcHVibGljLmgKQEAgLTAsMCArMSwyNiBAQAorLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gVGhpcyBmaWxlIHdhcyBpbml0aWFsbHkgZ2VuZXJhdGVkIGJ5IGNyZWF0ZV9kZXJpdmVkX2J1aWxkLnB5LAorLy8gdGhvdWdoIGl0IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgc2luY2UgaXRzIGNyZWF0aW9uLgorCisjaWZuZGVmIFNUQVJCT0FSRF9MSU5VWF9YNjRYMTFfU0JWRVJTSU9OXzZfQ09ORklHVVJBVElPTl9QVUJMSUNfSF8KKyNkZWZpbmUgU1RBUkJPQVJEX0xJTlVYX1g2NFgxMV9TQlZFUlNJT05fNl9DT05GSUdVUkFUSU9OX1BVQkxJQ19IXworCisjdW5kZWYgU0JfQVBJX1ZFUlNJT04KKyNkZWZpbmUgU0JfQVBJX1ZFUlNJT04gNgorCisjaW5jbHVkZSAic3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9jb25maWd1cmF0aW9uX3B1YmxpYy5oIgorCisjZW5kaWYgIC8vIFNUQVJCT0FSRF9MSU5VWF9YNjRYMTFfU0JWRVJTSU9OXzZfQ09ORklHVVJBVElPTl9QVUJMSUNfSF8KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL3NidmVyc2lvbi82L2d5cF9jb25maWd1cmF0aW9uLmd5cGkgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9zYnZlcnNpb24vNi9neXBfY29uZmlndXJhdGlvbi5neXBpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2OGQ2NDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9zYnZlcnNpb24vNi9neXBfY29uZmlndXJhdGlvbi5neXBpCkBAIC0wLDAgKzEsNDAgQEAKKyMgQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBUaGlzIGZpbGUgd2FzIGluaXRpYWxseSBnZW5lcmF0ZWQgYnkgY3JlYXRlX2Rlcml2ZWRfYnVpbGQucHksCisjIHRob3VnaCBpdCBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIHNpbmNlIGl0cyBjcmVhdGlvbi4KKworeworICAndGFyZ2V0X2RlZmF1bHRzJzogeworICAgICdkZWZhdWx0X2NvbmZpZ3VyYXRpb24nOiAnbGludXgteDY0eDExLXNidmVyc2lvbi02X2RlYnVnJywKKyAgICAnY29uZmlndXJhdGlvbnMnOiB7CisgICAgICAnbGludXgteDY0eDExLXNidmVyc2lvbi02X2RlYnVnJzogeworICAgICAgICAnaW5oZXJpdF9mcm9tJzogWydkZWJ1Z19iYXNlJ10sCisgICAgICB9LAorICAgICAgJ2xpbnV4LXg2NHgxMS1zYnZlcnNpb24tNl9kZXZlbCc6IHsKKyAgICAgICAgJ2luaGVyaXRfZnJvbSc6IFsnZGV2ZWxfYmFzZSddLAorICAgICAgfSwKKyAgICAgICdsaW51eC14NjR4MTEtc2J2ZXJzaW9uLTZfcWEnOiB7CisgICAgICAgICdpbmhlcml0X2Zyb20nOiBbJ3FhX2Jhc2UnXSwKKyAgICAgIH0sCisgICAgICAnbGludXgteDY0eDExLXNidmVyc2lvbi02X2dvbGQnOiB7CisgICAgICAgICdpbmhlcml0X2Zyb20nOiBbJ2dvbGRfYmFzZSddLAorICAgICAgfSwKKyAgICB9LCAjIGVuZCBvZiBjb25maWd1cmF0aW9ucworICB9LAorCisgICdpbmNsdWRlcyc6IFsKKyAgICAnPChERVBUSCkvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9neXBfY29uZmlndXJhdGlvbi5neXBpJywKKyAgXSwKK30KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL3NidmVyc2lvbi82L2d5cF9jb25maWd1cmF0aW9uLnB5IGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvc2J2ZXJzaW9uLzYvZ3lwX2NvbmZpZ3VyYXRpb24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y4NDY3YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL3NidmVyc2lvbi82L2d5cF9jb25maWd1cmF0aW9uLnB5CkBAIC0wLDAgKzEsMzcgQEAKKyMgQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBUaGlzIGZpbGUgd2FzIGluaXRpYWxseSBnZW5lcmF0ZWQgYnkgY3JlYXRlX2Rlcml2ZWRfYnVpbGQucHksCisjIHRob3VnaCBpdCBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIHNpbmNlIGl0cyBjcmVhdGlvbi4KKworZnJvbSBzdGFyYm9hcmQubGludXgueDY0eDExIGltcG9ydCBneXBfY29uZmlndXJhdGlvbiBhcyBwYXJlbnRfY29uZmlndXJhdGlvbgorCisKK2NsYXNzIExpbnV4WDY0WDExU2J2ZXJzaW9uNkNvbmZpZ3VyYXRpb24oCisgICAgcGFyZW50X2NvbmZpZ3VyYXRpb24uTGludXhYNjRYMTFDb25maWd1cmF0aW9uKToKKworICBkZWYgR2V0VmFyaWFibGVzKHNlbGYsIGNvbmZpZ19uYW1lKToKKyAgICB2YXJpYWJsZXMgPSBzdXBlcihMaW51eFg2NFgxMVNidmVyc2lvbjZDb25maWd1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYpLkdldFZhcmlhYmxlcyhjb25maWdfbmFtZSkKKyAgICAjIFY4IHJlcXVpcmVzIG5ldyBTdGFyYm9hcmQgZmVhdHVyZXMgc28gd2UgbXVzdCB1c2UgU3BpZGVyTW9ua2V5IGluIG9sZGVyCisgICAgIyB2ZXJzaW9ucyBvZiBTdGFyYm9hcmQuCisgICAgdmFyaWFibGVzLnVwZGF0ZSh7CisgICAgICAgICdqYXZhc2NyaXB0X2VuZ2luZSc6ICdtb3pqcy00NScsCisgICAgICAgICdjb2JhbHRfZW5hYmxlX2ppdCc6IDAsCisgICAgfSkKKyAgICByZXR1cm4gdmFyaWFibGVzCisKKworZGVmIENyZWF0ZVBsYXRmb3JtQ29uZmlnKCk6CisgIHJldHVybiBMaW51eFg2NFgxMVNidmVyc2lvbjZDb25maWd1cmF0aW9uKCdsaW51eC14NjR4MTEtc2J2ZXJzaW9uLTYnKQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvc2J2ZXJzaW9uLzYvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cCBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL3NidmVyc2lvbi82L3N0YXJib2FyZF9wbGF0Zm9ybS5neXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IxNDdhYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL3NidmVyc2lvbi82L3N0YXJib2FyZF9wbGF0Zm9ybS5neXAKQEAgLTAsMCArMSwyNCBAQAorIyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIFRoaXMgZmlsZSB3YXMgaW5pdGlhbGx5IGdlbmVyYXRlZCBieSBjcmVhdGVfZGVyaXZlZF9idWlsZC5weSwKKyMgdGhvdWdoIGl0IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgc2luY2UgaXRzIGNyZWF0aW9uLgorCit7CisgICdpbmNsdWRlcyc6IFsKKyAgICAjIE5vdGUgdGhhdCB3ZSBhcmUgJ2luY2x1ZGVzJ2luZyBhICdneXAnIGZpbGUsIG5vdCBhICdneXBpJyBmaWxlLiAgVGhlIGlkZWEKKyAgICAjIGlzIHRoYXQgd2UganVzdCB3YW50IHRoaXMgZmlsZSB0byAqYmUqIHRoZSBwYXJlbnQgZ3lwIGZpbGUuCisgICAgJzwoREVQVEgpL3N0YXJib2FyZC9saW51eC94NjR4MTEvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cCcsCisgIF0sCit9CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9zYnZlcnNpb24vNi9zdGFyYm9hcmRfcGxhdGZvcm1fdGVzdHMuZ3lwIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvc2J2ZXJzaW9uLzYvc3RhcmJvYXJkX3BsYXRmb3JtX3Rlc3RzLmd5cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWE4ZmMyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvc2J2ZXJzaW9uLzYvc3RhcmJvYXJkX3BsYXRmb3JtX3Rlc3RzLmd5cApAQCAtMCwwICsxLDI0IEBACisjIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgVGhpcyBmaWxlIHdhcyBpbml0aWFsbHkgZ2VuZXJhdGVkIGJ5IGNyZWF0ZV9kZXJpdmVkX2J1aWxkLnB5LAorIyB0aG91Z2ggaXQgbWF5IGhhdmUgYmVlbiBtb2RpZmllZCBzaW5jZSBpdHMgY3JlYXRpb24uCisKK3sKKyAgJ2luY2x1ZGVzJzogWworICAgICMgTm90ZSB0aGF0IHdlIGFyZSAnaW5jbHVkZXMnaW5nIGEgJ2d5cCcgZmlsZSwgbm90IGEgJ2d5cGknIGZpbGUuICBUaGUgaWRlYQorICAgICMgaXMgdGhhdCB3ZSBqdXN0IHdhbnQgdGhpcyBmaWxlIHRvICpiZSogdGhlIHBhcmVudCBneXAgZmlsZS4KKyAgICAnPChERVBUSCkvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9zdGFyYm9hcmRfcGxhdGZvcm1fdGVzdHMuZ3lwJywKKyAgXSwKK30KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL3NidmVyc2lvbi82L3RocmVhZF90eXBlc19wdWJsaWMuaCBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL3NidmVyc2lvbi82L3RocmVhZF90eXBlc19wdWJsaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzk1N2JjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvc2J2ZXJzaW9uLzYvdGhyZWFkX3R5cGVzX3B1YmxpYy5oCkBAIC0wLDAgKzEsMjMgQEAKKy8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIFRoaXMgZmlsZSB3YXMgaW5pdGlhbGx5IGdlbmVyYXRlZCBieSBjcmVhdGVfZGVyaXZlZF9idWlsZC5weSwKKy8vIHRob3VnaCBpdCBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIHNpbmNlIGl0cyBjcmVhdGlvbi4KKworI2lmbmRlZiBTVEFSQk9BUkRfTElOVVhfWDY0WDExX1NCVkVSU0lPTl82X1RIUkVBRF9UWVBFU19QVUJMSUNfSF8KKyNkZWZpbmUgU1RBUkJPQVJEX0xJTlVYX1g2NFgxMV9TQlZFUlNJT05fNl9USFJFQURfVFlQRVNfUFVCTElDX0hfCisKKyNpbmNsdWRlICJzdGFyYm9hcmQvbGludXgveDY0eDExL3RocmVhZF90eXBlc19wdWJsaWMuaCIKKworI2VuZGlmICAvLyBTVEFSQk9BUkRfTElOVVhfWDY0WDExX1NCVkVSU0lPTl82X1RIUkVBRF9UWVBFU19QVUJMSUNfSF8KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL3NraWEvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cCBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL3NraWEvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cAppbmRleCA1MjhkMWNkLi5jMzNlNGE4IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9za2lhL3N0YXJib2FyZF9wbGF0Zm9ybS5neXAKKysrIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvc2tpYS9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwCkBAIC0xMywyMSArMTMsNiBAQAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIHsKICAgJ2luY2x1ZGVzJzogWwotICAgICcuLi9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwaScKLSAgXSwKLSAgJ3RhcmdldHMnOiBbCi0gICAgewotICAgICAgJ3RhcmdldF9uYW1lJzogJ3N0YXJib2FyZF9wbGF0Zm9ybScsCi0gICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCi0gICAgICAnc291cmNlcyc6IFsnPEAoc3RhcmJvYXJkX3BsYXRmb3JtX3NvdXJjZXMpJ10sCi0gICAgICAnZGVmaW5lcyc6IFsKLSAgICAgICAgIyBUaGlzIG11c3QgYmUgZGVmaW5lZCB3aGVuIGJ1aWxkaW5nIFN0YXJib2FyZCwgYW5kIG11c3Qgbm90IHdoZW4KLSAgICAgICAgIyBidWlsZGluZyBTdGFyYm9hcmQgY2xpZW50IGNvZGUuCi0gICAgICAgICdTVEFSQk9BUkRfSU1QTEVNRU5UQVRJT04nLAotICAgICAgXSwKLSAgICAgICdkZXBlbmRlbmNpZXMnOiBbCi0gICAgICAgICc8QChzdGFyYm9hcmRfcGxhdGZvcm1fZGVwZW5kZW5jaWVzKScsCi0gICAgICBdLAotICAgIH0sCisgICAgJy4uL3N0YXJib2FyZF9wbGF0Zm9ybS5neXAnCiAgIF0sCiB9CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cAppbmRleCAxOGNmMTA0Li40NzMzMDc1IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwCisrKyBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL3N0YXJib2FyZF9wbGF0Zm9ybS5neXAKQEAgLTExLDYgKzExLDEwIEBACiAjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIE5vdGUsIHRoYXQgZGVzcGl0ZSB0aGUgZmlsZSBleHRlbnNpb24gIi5neXAiLCB0aGlzIGZpbGUgaXMgaW5jbHVkZWQgYnkgc2V2ZXJhbAorIyBwbGF0Zm9ybSB2YXJpYW50cyBvZiBsaW51eC14NjR4MTEsIGxpa2UgYSAiLmd5cGkiIGZpbGUsIHNpbmNlIHRob3NlIHBsYXRmb3JtcworIyBoYXZlIG5vIG5lZWQgdG8gbW9kaWZ5IHRoaXMgY29kZS4KIHsKICAgJ2luY2x1ZGVzJzogWwogICAgICdzdGFyYm9hcmRfcGxhdGZvcm0uZ3lwaScKQEAgLTE5LDYgKzIzLDcgQEAKICAgICB7CiAgICAgICAndGFyZ2V0X25hbWUnOiAnc3RhcmJvYXJkX3BsYXRmb3JtJywKICAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKwogICAgICAgJ3NvdXJjZXMnOiBbCiAgICAgICAgICc8QChzdGFyYm9hcmRfcGxhdGZvcm1fc291cmNlcyknLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3ZpZGVvX2RtcF9jb21tb24uY2MnLApAQCAtMzUsNiArNDAsMjAgQEAKICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCiAgICAgICAgICc8QChzdGFyYm9hcmRfcGxhdGZvcm1fZGVwZW5kZW5jaWVzKScsCiAgICAgICBdLAorICAgICAgJ2NvbmRpdGlvbnMnOiBbCisgICAgICAgIFsnaGFzX2NkbT09MScsIHsKKyAgICAgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9saW51eC94NjR4MTEvd2lkZXZpbmUuZ3lwOnd2Y2RtX3N0YXRpYycsCisgICAgICAgICAgXSwKKyAgICAgICAgICAnc291cmNlcyEnOiBbCisgICAgICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWVkaWEvbWVkaWFfaXNfb3V0cHV0X3Byb3RlY3RlZC5jYycsCisgICAgICAgICAgXSwKKyAgICAgICAgICAnc291cmNlcy8nOiBbCisgICAgICAgICAgICBbJ2V4Y2x1ZGUnLCAnc2hhcmVkL3N0dWIvZHJtXy4qJ10sCisgICAgICAgICAgICBbJ2V4Y2x1ZGUnLCAnc2hhcmVkL3N0dWIvbWVkaWFfaXNfc3VwcG9ydGVkXFwuY2MnXSwKKyAgICAgICAgICBdLAorICAgICAgICB9XSwKKyAgICAgIF0sCiAgICAgfSwKICAgXSwKIH0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL3N0YXJib2FyZF9wbGF0Zm9ybS5neXBpIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cGkKaW5kZXggNmU1NGViZi4uZWZkZjhlYSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cGkKKysrIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cGkKQEAgLTE1LDE3ICsxNSw0MyBAQAogICAnaW5jbHVkZXMnOiBbJy4uL3NoYXJlZC9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwaSddLAogCiAgICd2YXJpYWJsZXMnOiB7CisgICAgJ3ZhcmlhYmxlcyc6IHsKKyAgICAgICdoYXNfY2RtJSc6ICc8ISh0ZXN0IC1lIDwoREVQVEgpL3RoaXJkX3BhcnR5L2NkbS9jZG0vaW5jbHVkZS9jb250ZW50X2RlY3J5cHRpb25fbW9kdWxlLmggJiYgZWNobyAxIHx8IGVjaG8gMCknLAorICAgIH0sCisgICAgIyBUaGlzIGhhc19jZG0gZ2V0cyBleHBvcnRlZCB0byBneXAgZmlsZXMgdGhhdCBpbmNsdWRlIHRoaXMgb25lLgorICAgICdoYXNfY2RtJSc6ICc8KGhhc19jZG0pJywKICAgICAnc3RhcmJvYXJkX3BsYXRmb3JtX3NvdXJjZXMnOiBbCiAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9tYWluLmNjJywKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvbGludXgveDY0eDExL3Nhbml0aXplcl9vcHRpb25zLmNjJywKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvbGludXgveDY0eDExL3N5c3RlbV9nZXRfcHJvcGVydHkuY2MnLAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2xpbmtfcmVjZWl2ZXIuY2MnLAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQveDExL2FwcGxpY2F0aW9uX3gxMS5jYycsCisgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC94MTEvZWdsX3N3YXBfYnVmZmVycy5jYycsCiAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC94MTEvd2luZG93X2NyZWF0ZS5jYycsCiAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC94MTEvd2luZG93X2Rlc3Ryb3kuY2MnLAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQveDExL3dpbmRvd19nZXRfcGxhdGZvcm1faGFuZGxlLmNjJywKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3gxMS93aW5kb3dfZ2V0X3NpemUuY2MnLAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQveDExL3dpbmRvd19pbnRlcm5hbC5jYycsCiAgICAgXSwKKyAgICAnY29uZGl0aW9ucyc6IFsKKyAgICAgIFsnaGFzX2NkbT09MScsIHsKKyAgICAgICAgJ3N0YXJib2FyZF9wbGF0Zm9ybV9zb3VyY2VzJzogWworICAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvbGludXgveDY0eDExL21lZGlhX2lzX291dHB1dF9wcm90ZWN0ZWQuY2MnLAorCisgICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2RybS9kcm1fY2xvc2Vfc2Vzc2lvbi5jYycsCisgICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2RybS9kcm1fZGVzdHJveV9zeXN0ZW0uY2MnLAorICAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9kcm0vZHJtX2dlbmVyYXRlX3Nlc3Npb25fdXBkYXRlX3JlcXVlc3QuY2MnLAorICAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9kcm0vZHJtX3N5c3RlbV9pbnRlcm5hbC5oJywKKyAgICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvZHJtL2RybV91cGRhdGVfc2Vzc2lvbi5jYycsCisKKyAgICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aWRldmluZS9kcm1fY3JlYXRlX3N5c3RlbS5jYycsCisgICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2lkZXZpbmUvZHJtX2lzX3NlcnZlcl9jZXJ0aWZpY2F0ZV91cGRhdGFibGUuY2MnLAorICAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpZGV2aW5lL2RybV9zeXN0ZW1fd2lkZXZpbmUuY2MnLAorICAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpZGV2aW5lL2RybV9zeXN0ZW1fd2lkZXZpbmUuaCcsCisgICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2lkZXZpbmUvZHJtX3VwZGF0ZV9zZXJ2ZXJfY2VydGlmaWNhdGUuY2MnLAorICAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpZGV2aW5lL21lZGlhX2lzX3N1cHBvcnRlZC5jYycsCisgICAgICAgIF0sCisgICAgICB9XSwKKyAgICBdLAogICB9LAogfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvdjgvYXRvbWljX3B1YmxpYy5oIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvdjgvYXRvbWljX3B1YmxpYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzNkYzc3Li4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL3Y4L2F0b21pY19wdWJsaWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpZm5kZWYgU1RBUkJPQVJEX0xJTlVYX1g2NFgxMV9WOF9BVE9NSUNfUFVCTElDX0hfCi0jZGVmaW5lIFNUQVJCT0FSRF9MSU5VWF9YNjRYMTFfVjhfQVRPTUlDX1BVQkxJQ19IXwotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9hdG9taWNfcHVibGljLmgiCi0KLSNlbmRpZiAgLy8gU1RBUkJPQVJEX0xJTlVYX1g2NFgxMV9WOF9BVE9NSUNfUFVCTElDX0hfCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS92OC9jb25maWd1cmF0aW9uX3B1YmxpYy5oIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvdjgvY29uZmlndXJhdGlvbl9wdWJsaWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQwOGIwMy4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS92OC9jb25maWd1cmF0aW9uX3B1YmxpYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotLy8gVGhlIFN0YXJib2FyZCBjb25maWd1cmF0aW9uIGZvciBEZXNrdG9wIFg4NiBMaW51eCBjb25maWd1cmVkIGZvciB0aGUgZnV0dXJlCi0vLyBzdGFyYm9hcmQgQVBJLgotCi0jaWZuZGVmIFNUQVJCT0FSRF9MSU5VWF9YNjRYMTFfVjhfQ09ORklHVVJBVElPTl9QVUJMSUNfSF8KLSNkZWZpbmUgU1RBUkJPQVJEX0xJTlVYX1g2NFgxMV9WOF9DT05GSUdVUkFUSU9OX1BVQkxJQ19IXwotCi0vLyBJbmNsdWRlIHRoZSBYNjRYMTEgTGludXggY29uZmlndXJhdGlvbi4KLSNpbmNsdWRlICJzdGFyYm9hcmQvbGludXgveDY0eDExL2NvbmZpZ3VyYXRpb25fcHVibGljLmgiCi0KLSNlbmRpZiAgLy8gU1RBUkJPQVJEX0xJTlVYX1g2NFgxMV9WOF9DT05GSUdVUkFUSU9OX1BVQkxJQ19IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvdjgvZ3lwX2NvbmZpZ3VyYXRpb24uZ3lwaSBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL3Y4L2d5cF9jb25maWd1cmF0aW9uLmd5cGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ZDZlZTUuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvdjgvZ3lwX2NvbmZpZ3VyYXRpb24uZ3lwaQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLSMgQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotewotICAndmFyaWFibGVzJzogewotICAgICdqYXZhc2NyaXB0X2VuZ2luZSc6ICd2OCcsCi0gICAgJ2NvYmFsdF9lbmFibGVfaml0JzogMSwKLSAgfSwKLSAgJ3RhcmdldF9kZWZhdWx0cyc6IHsKLSAgICAnZGVmYXVsdF9jb25maWd1cmF0aW9uJzogJ2xpbnV4LXg2NHgxMS12OF9kZWJ1ZycsCi0gICAgJ2NvbmZpZ3VyYXRpb25zJzogewotICAgICAgJ2xpbnV4LXg2NHgxMS12OF9kZWJ1Zyc6IHsKLSAgICAgICAgJ2luaGVyaXRfZnJvbSc6IFsnZGVidWdfYmFzZSddLAotICAgICAgfSwKLSAgICAgICdsaW51eC14NjR4MTEtdjhfZGV2ZWwnOiB7Ci0gICAgICAgICdpbmhlcml0X2Zyb20nOiBbJ2RldmVsX2Jhc2UnXSwKLSAgICAgIH0sCi0gICAgICAnbGludXgteDY0eDExLXY4X3FhJzogewotICAgICAgICAnaW5oZXJpdF9mcm9tJzogWydxYV9iYXNlJ10sCi0gICAgICB9LAotICAgICAgJ2xpbnV4LXg2NHgxMS12OF9nb2xkJzogewotICAgICAgICAnaW5oZXJpdF9mcm9tJzogWydnb2xkX2Jhc2UnXSwKLSAgICAgIH0sCi0gICAgfSwgIyBlbmQgb2YgY29uZmlndXJhdGlvbnMKLSAgfSwKLQotICAnaW5jbHVkZXMnOiBbCi0gICAgJy4uL2d5cF9jb25maWd1cmF0aW9uLmd5cGknLAotICBdLAotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvdjgvZ3lwX2NvbmZpZ3VyYXRpb24ucHkgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS92OC9neXBfY29uZmlndXJhdGlvbi5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM4YmM3Mi4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS92OC9neXBfY29uZmlndXJhdGlvbi5weQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMgQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSIiIlN0YXJib2FyZCBMaW51eCBYNjQgWDExIFY4IHBsYXRmb3JtIGNvbmZpZ3VyYXRpb24uIiIiCi0KLWZyb20gc3RhcmJvYXJkLmxpbnV4Lng2NHgxMSBpbXBvcnQgZ3lwX2NvbmZpZ3VyYXRpb24gYXMgbGludXhfY29uZmlndXJhdGlvbgotCi0KLWRlZiBDcmVhdGVQbGF0Zm9ybUNvbmZpZygpOgotICByZXR1cm4gbGludXhfY29uZmlndXJhdGlvbi5MaW51eFg2NFgxMUNvbmZpZ3VyYXRpb24oJ2xpbnV4LXg2NHgxMS12OCcpCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS92OC9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvdjgvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJiMGJmNS4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS92OC9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotIyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotewotICAnaW5jbHVkZXMnOiBbCi0gICAgJy4uL3N0YXJib2FyZF9wbGF0Zm9ybS5neXBpJwotICBdLAotICAndGFyZ2V0cyc6IFsKLSAgICB7Ci0gICAgICAndGFyZ2V0X25hbWUnOiAnc3RhcmJvYXJkX3BsYXRmb3JtJywKLSAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKLSAgICAgICdzb3VyY2VzJzogWyc8QChzdGFyYm9hcmRfcGxhdGZvcm1fc291cmNlcyknXSwKLSAgICAgICdkZWZpbmVzJzogWwotICAgICAgICAjIFRoaXMgbXVzdCBiZSBkZWZpbmVkIHdoZW4gYnVpbGRpbmcgU3RhcmJvYXJkLCBhbmQgbXVzdCBub3Qgd2hlbgotICAgICAgICAjIGJ1aWxkaW5nIFN0YXJib2FyZCBjbGllbnQgY29kZS4KLSAgICAgICAgJ1NUQVJCT0FSRF9JTVBMRU1FTlRBVElPTicsCi0gICAgICBdLAotICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKLSAgICAgICAgJzxAKHN0YXJib2FyZF9wbGF0Zm9ybV9kZXBlbmRlbmNpZXMpJywKLSAgICAgIF0sCi0gICAgfSwKLSAgXSwKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL3Y4L3N0YXJib2FyZF9wbGF0Zm9ybV90ZXN0cy5neXAgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS92OC9zdGFyYm9hcmRfcGxhdGZvcm1fdGVzdHMuZ3lwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTZlODkwLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL3Y4L3N0YXJib2FyZF9wbGF0Zm9ybV90ZXN0cy5neXAKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi17Ci0gICdpbmNsdWRlcyc6IFsKLSAgICAnPChERVBUSCkvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9zdGFyYm9hcmRfcGxhdGZvcm1fdGVzdHMuZ3lwaScsCi0gIF0sCi19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS92OC90aHJlYWRfdHlwZXNfcHVibGljLmggYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS92OC90aHJlYWRfdHlwZXNfcHVibGljLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNTBhZDguLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvdjgvdGhyZWFkX3R5cGVzX3B1YmxpYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBTVEFSQk9BUkRfTElOVVhfWDY0WDExX1Y4X1RIUkVBRF9UWVBFU19QVUJMSUNfSF8KLSNkZWZpbmUgU1RBUkJPQVJEX0xJTlVYX1g2NFgxMV9WOF9USFJFQURfVFlQRVNfUFVCTElDX0hfCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvbGludXgvc2hhcmVkL3RocmVhZF90eXBlc19wdWJsaWMuaCIKLQotI2VuZGlmICAvLyBTVEFSQk9BUkRfTElOVVhfWDY0WDExX1Y4X1RIUkVBRF9UWVBFU19QVUJMSUNfSF8KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL3dpZGV2aW5lLmd5cCBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL3dpZGV2aW5lLmd5cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTU3MTIxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvd2lkZXZpbmUuZ3lwCkBAIC0wLDAgKzEsMzAgQEAKKyMgQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KK3sKKyAgJ3ZhcmlhYmxlcyc6IHsKKyAgICAgJ3BsYXRmb3JtX29lbV9zb3VyY2VzJzogWworICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQva2V5Ym94ZXMvbGludXgvbGludXguaCcsCisgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9rZXlib3hlcy9saW51eC9saW51eF9jbGllbnQuYycsCisgICAgICAgJ3d2X2tleWJveC5jYycsCisgICAgIF0sCisgIH0sCisgICdpbmNsdWRlcyc6IFsKKyAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aWRldmluZS93aWRldmluZS5neXBpJywKKyAgXSwKKyAgJ3RhcmdldF9kZWZhdWx0cyc6IHsKKyAgICAnZGVmaW5lcyc6IFsKKyAgICAgICdDT0JBTFRfV0lERVZJTkVfS0VZQk9YX0lOQ0xVREU9InN0YXJib2FyZC9rZXlib3hlcy93aWRldmluZV9zZXR0aW5nc19saW51eC5oIicsCisgICAgXSwKKyAgfSwKK30KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL3d2X2tleWJveC5jYyBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL3d2X2tleWJveC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTA1NGZjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvd3Zfa2V5Ym94LmNjCkBAIC0wLDAgKzEsNDcgQEAKKy8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyNpbmNsdWRlIDxjc3RyaW5nPgorCisjaW5jbHVkZSAic3RhcmJvYXJkL2tleWJveGVzL2xpbnV4L2xpbnV4LmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2RtL29lbWNyeXB0by9tb2NrL3NyYy9vZW1jcnlwdG9fa2V5Ym94X21vY2suaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jZG0vb2VtY3J5cHRvL21vY2svc3JjL3d2X2tleWJveC5oIgorCituYW1lc3BhY2Ugd3ZvZWNfbW9jayB7CisKK25hbWVzcGFjZSB7CisKKyNpZiBkZWZpbmVkKENPQkFMVF9XSURFVklORV9LRVlCT1hfSU5DTFVERSkKKyNpbmNsdWRlIENPQkFMVF9XSURFVklORV9LRVlCT1hfSU5DTFVERQorI2Vsc2UgIC8vIENPQkFMVF9XSURFVklORV9LRVlCT1hfSU5DTFVERQorI2Vycm9yICJDT0JBTFRfV0lERVZJTkVfS0VZQk9YX0lOQ0xVREUgaXMgbm90IGRlZmluZWQuIgorI2VuZGlmICAvLyBDT0JBTFRfV0lERVZJTkVfS0VZQk9YX0lOQ0xVREUKKworfSAgLy8gbmFtZXNwYWNlCisKK2Jvb2wgV3ZLZXlib3g6OlByZXBhcmUoKSB7CisgIC8vIE1ha2UgYSBsb2NhbCBjb3B5IG9mIHRoZSBrZXlib3guCisgIFdpZGV2aW5lS2V5Ym94IGtleWJveDsKKyAgbWVtY3B5KCZrZXlib3gsICZrS2V5Ym94LCBzaXplb2YoV2lkZXZpbmVLZXlib3gpKTsKKworICAvLyBVbm9iZnVzY2F0ZSB0aGUga2V5LgorICB1aW50OF90IGNsZWFyW3NpemVvZihrT2JmdXNjYXRlZEtleSldOworICAvLyBEZXNwaXRlIHRoZSBub24tY29uc3QgdHlwZSwgbGludXhfY2xpZW50IGRvZXMgbm90IG1vZGlmeSB0aGUgc2Vjb25kCisgIC8vIGFyZ3VtZW50LgorICBsaW51eF9jbGllbnQoY2xlYXIsIGNvbnN0X2Nhc3Q8dWludDhfdCo+KGtPYmZ1c2NhdGVkS2V5KSk7CisKKyAgLy8gTW92ZSB0aGUgY2xlYXIga2V5IGludG8gdGhlIGxvY2FsIGNvcHkgb2YgdGhlIGtleWJveC4KKyAgLy8gTk9URTogQ2xlYXIgZGV2aWNlIGtleXMgYXJlIGhhbGYgdGhlIHNpemUgb2Ygb2JmdXNjYXRlZCBvbmVzLgorICBtZW1jcHkoJmtleWJveC5kZXZpY2Vfa2V5XywgY2xlYXIsIHNpemVvZihrZXlib3guZGV2aWNlX2tleV8pKTsKKyAgbWVtc2V0KGNsZWFyLCAwLCBzaXplb2YoY2xlYXIpKTsKKworICAvLyBJbnN0YWxsIHRoZSBsb2NhbCBjb3B5IG9mIHRoZSBrZXlib3guCisgIHVpbnQ4X3QqIGJ5dGVzID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oJmtleWJveCk7CisgIEluc3RhbGxLZXlib3goYnl0ZXMsIHNpemVvZihrZXlib3gpKTsKKworICAvLyBXaXBlIHRoZSBsb2NhbCBjb3B5IG9mIHRoZSBrZXlib3guCisgIG1lbXNldCgma2V5Ym94LCAwLCBzaXplb2Yoa2V5Ym94KSk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB3dm9lY19tb2NrCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL21lZGlhLmggYi9zcmMvc3RhcmJvYXJkL21lZGlhLmgKaW5kZXggMGRkMTI1OS4uN2MxNzVhZCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9tZWRpYS5oCisrKyBiL3NyYy9zdGFyYm9hcmQvbWVkaWEuaApAQCAtMzUsOCArMzUsMTQgQEAKIC8vIFRpbWUgcmVwcmVzZW50ZWQgaW4gOTBLSHogdGlja3MuCiB0eXBlZGVmIGludDY0X3QgU2JNZWRpYVRpbWU7CiAKLSNkZWZpbmUgU0JfTUVESUFfVElNRV9UT19TQl9USU1FKG1lZGlhKSAobWVkaWEgKiAxMDAgLyA5KQotI2RlZmluZSBTQl9USU1FX1RPX1NCX01FRElBX1RJTUUodGltZSkgKHRpbWUgKiA5IC8gMTAwKQorI2RlZmluZSBTQl9NRURJQV9USU1FX1RPX1NCX1RJTUUobWVkaWEpIFwKKyAgKCgobWVkaWEgPT0gU0JfUExBWUVSX05PX0RVUkFUSU9OKSAgICBcCisgICAgICAgID8gU0JfUExBWUVSX05PX0RVUkFUSU9OICAgICAgICAgXAorICAgICAgICA6ICgobWVkaWEgPT0ga1NiSW50NjRNYXgpID8ga1NiSW50NjRNYXggOiAobWVkaWEgKiAxMDAgLyA5KSkpKQorI2RlZmluZSBTQl9USU1FX1RPX1NCX01FRElBX1RJTUUodGltZSkgXAorICAoKCh0aW1lID09IFNCX1BMQVlFUl9OT19EVVJBVElPTikgICAgXAorICAgICAgICA/IFNCX1BMQVlFUl9OT19EVVJBVElPTiAgICAgICAgXAorICAgICAgICA6ICgodGltZSA9PSBrU2JJbnQ2NE1heCkgPyBrU2JJbnQ2NE1heCA6ICh0aW1lICogOSAvIDEwMCkpKSkKICNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPCBTQl9ERVBSRUNBVEVfU0JfTUVESUFfVElNRV9BUElfVkVSU0lPTgogCiAvLyBUeXBlcyBvZiBtZWRpYSBjb21wb25lbnQgc3RyZWFtcy4KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbWVtb3J5LmggYi9zcmMvc3RhcmJvYXJkL21lbW9yeS5oCmluZGV4IGMxNzdhZTMuLjE4NjY3YmUgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvbWVtb3J5LmgKKysrIGIvc3JjL3N0YXJib2FyZC9tZW1vcnkuaApAQCAtMTk1LDcgKzE5NSw5IEBACiAvLwogLy8gfHNpemVfYnl0ZXN8OiBUaGUgYW1vdW50IG9mIHBoeXNpY2FsIG1lbW9yeSBwYWdlcyB0byBiZSBhbGxvY2F0ZWQuCiAvLyB8ZmxhZ3N8OiBUaGUgYml0d2lzZSBPUiBvZiB0aGUgcHJvdGVjdGlvbiBmbGFncyBmb3IgdGhlIG1hcHBlZCBtZW1vcnkKLS8vICAgYXMgc3BlY2lmaWVkIGluIHxTYk1lbW9yeU1hcEZsYWdzfC4KKy8vICAgYXMgc3BlY2lmaWVkIGluIHxTYk1lbW9yeU1hcEZsYWdzfC4gQWxsb2NhdGluZyBleGVjdXRhYmxlIG1lbW9yeSBpcyBub3QKKy8vICAgYWxsb3dlZCBhbmQgd2lsbCBmYWlsLiBJZiBleGVjdXRhYmxlIG1lbW9yeSBpcyBuZWVkZWQsIG1hcCBub24tZXhlY3V0YWJsZQorLy8gICBtZW1vcnkgZmlyc3QgYW5kIHRoZW4gc3dpdGNoIGFjY2VzcyB0byBleGVjdXRhYmxlIHVzaW5nIFNiTWVtb3J5UHJvdGVjdC4KIC8vIHxuYW1lfDogQSB2YWx1ZSB0aGF0IGFwcGVhcnMgaW4gdGhlIGRlYnVnZ2VyIG9uIHNvbWUgcGxhdGZvcm1zLiBUaGUgdmFsdWUKIC8vICAgY2FuIGJlIHVwIHRvIDMyIGJ5dGVzLgogU0JfRVhQT1JUIHZvaWQqIFNiTWVtb3J5TWFwKGludDY0X3Qgc2l6ZV9ieXRlcywgaW50IGZsYWdzLCBjb25zdCBjaGFyKiBuYW1lKTsKQEAgLTIxMCw2ICsyMTIsMTQgQEAKIC8vIHxTYk1lbW9yeVVubWFwKDB4QTAwMCwgMHgyMDAwKXwgc2hvdWxkIGZyZWUgYm90aCByZWdpb25zLgogU0JfRVhQT1JUIGJvb2wgU2JNZW1vcnlVbm1hcCh2b2lkKiB2aXJ0dWFsX2FkZHJlc3MsIGludDY0X3Qgc2l6ZV9ieXRlcyk7CiAKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9NRU1PUllfUFJPVEVDVF9BUElfVkVSU0lPTgorLy8gQ2hhbmdlIHRoZSBwcm90ZWN0aW9uIG9mIHxzaXplX2J5dGVzfCBvZiBwaHlzaWNhbCBwYWdlcywgc3RhcnRpbmcgZnJvbQorLy8gfHZpcnR1YWxfYWRkcmVzc3wsIHRvIHxmbGFnc3wsIHJldHVybmluZyB8dHJ1ZXwgb24gc3VjY2Vzcy4KK1NCX0VYUE9SVCBib29sIFNiTWVtb3J5UHJvdGVjdCh2b2lkKiB2aXJ0dWFsX2FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBzaXplX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncyk7CisjZW5kaWYKKwogI2lmIFNCX0NBTihNQVBfRVhFQ1VUQUJMRV9NRU1PUlkpCiAvLyBGbHVzaGVzIGFueSBkYXRhIGluIHRoZSBnaXZlbiB2aXJ0dWFsIGFkZHJlc3MgcmFuZ2UgdGhhdCBpcyBjYWNoZWQgbG9jYWxseSBpbgogLy8gdGhlIGN1cnJlbnQgcHJvY2Vzc29yIGNvcmUgdG8gcGh5c2ljYWwgbWVtb3J5LCBlbnN1cmluZyB0aGF0IGRhdGEgYW5kCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL25wbGIvYXRvbWljX3Rlc3QuY2MgYi9zcmMvc3RhcmJvYXJkL25wbGIvYXRvbWljX3Rlc3QuY2MKaW5kZXggOTU0MGMzMi4uZDllOWFmYSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9ucGxiL2F0b21pY190ZXN0LmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvbnBsYi9hdG9taWNfdGVzdC5jYwpAQCAtMjYsMjEgKzI2LDExOCBAQAogbmFtZXNwYWNlIHsKIAogLy8gU2V0cyB1cCBhbiBlbXB0eSB0ZXN0IGZpeHR1cmUsIHJlcXVpcmVkIGZvciB0eXBlZCB0ZXN0cy4KKy8vIEJhc2ljU2JBdG9taWNUZXN0IGNvbnRhaW5zIHRlc3QgY2FzZXMgYWxsIGVuYWJsZWQgYXRvbWljIHR5cGVzIHNob3VsZCBwYXNzLgogdGVtcGxhdGUgPGNsYXNzIFNiQXRvbWljVHlwZT4KLWNsYXNzIFNiQXRvbWljVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKK2NsYXNzIEJhc2ljU2JBdG9taWNUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewogIHB1YmxpYzoKLSAgU2JBdG9taWNUZXN0KCkge30KLSAgdmlydHVhbCB+U2JBdG9taWNUZXN0KCkge30KKyAgQmFzaWNTYkF0b21pY1Rlc3QoKSB7fQorICB2aXJ0dWFsIH5CYXNpY1NiQXRvbWljVGVzdCgpIHt9CiB9OwogCi0jaWYgU0JfSEFTKDY0X0JJVF9BVE9NSUNTKQotdHlwZWRlZiB0ZXN0aW5nOjpUeXBlczxTYkF0b21pYzMyLCBTYkF0b21pYzY0LCBTYkF0b21pY1B0cj4gU2JBdG9taWNUZXN0VHlwZXM7Ci0jZWxzZQotdHlwZWRlZiB0ZXN0aW5nOjpUeXBlczxTYkF0b21pYzMyLCBTYkF0b21pY1B0cj4gU2JBdG9taWNUZXN0VHlwZXM7Ci0jZW5kaWYKLVRZUEVEX1RFU1RfQ0FTRShTYkF0b21pY1Rlc3QsIFNiQXRvbWljVGVzdFR5cGVzKTsKKy8vIEFkdmFuY2VkU2JBdG9taWNUZXN0IHByb3ZpZGVzIHRlc3QgY292ZXJhZ2UgZm9yIGFsbCBhdG9taWMgZnVuY3Rpb25zLgorLy8gQXRvbWljOCBpcyByaWdodCBub3cgdGhlIG9ubHkgYXRvbWljIHR5cGUgbm90IHJlcXVpcmVkIHRvIHBhc3MKKy8vIEFkdmFuY2VkU2JBdG9taWNUZXN0LCBhcyBpdCBkb2VzIG5vdCBzdXBwb3J0IGltcGxlbWVudGF0aW9ucyBmb3IgdGhlIGZ1bGwKKy8vIHNldCBvZiBhdG9taWMgZnVuY3Rpb25zIGxpa2UgdGhlIG90aGVyIHR5cGVzIGRvLgordGVtcGxhdGUgPGNsYXNzIFNiQXRvbWljVHlwZT4KK2NsYXNzIEFkdmFuY2VkU2JBdG9taWNUZXN0IDogcHVibGljIEJhc2ljU2JBdG9taWNUZXN0PFNiQXRvbWljVHlwZT4geworIHB1YmxpYzoKKyAgQWR2YW5jZWRTYkF0b21pY1Rlc3QoKSB7fQorICB2aXJ0dWFsIH5BZHZhbmNlZFNiQXRvbWljVGVzdCgpIHt9Cit9OwogCi1UWVBFRF9URVNUKFNiQXRvbWljVGVzdCwgSW5jcmVtZW50U2luZ2xlVGhyZWFkKSB7Cit0eXBlZGVmIHRlc3Rpbmc6OlR5cGVzPAorI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX0lOVFJPRFVDRV9BVE9NSUM4X1ZFUlNJT04KKyAgICAgICAgICAgICAgICAgICAgICAgU2JBdG9taWM4LAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgIFNiQXRvbWljMzIsCisjaWYgU0JfSEFTKDY0X0JJVF9BVE9NSUNTKQorICAgICAgICAgICAgICAgICAgICAgICBTYkF0b21pYzY0LAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgIFNiQXRvbWljUHRyPiBCYXNpY1NiQXRvbWljVGVzdFR5cGVzOwordHlwZWRlZiB0ZXN0aW5nOjpUeXBlczxTYkF0b21pYzMyLAorI2lmIFNCX0hBUyg2NF9CSVRfQVRPTUlDUykKKyAgICAgICAgICAgICAgICAgICAgICAgU2JBdG9taWM2NCwKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICBTYkF0b21pY1B0cj4gQWR2YW5jZWRTYkF0b21pY1Rlc3RUeXBlczsKKworI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX0lOVFJPRFVDRV9BVE9NSUM4X1ZFUlNJT04KK1RZUEVEX1RFU1RfQ0FTRShCYXNpY1NiQXRvbWljVGVzdCwgQmFzaWNTYkF0b21pY1Rlc3RUeXBlcyk7CisjZWxzZQorVFlQRURfVEVTVF9DQVNFKEJhc2ljU2JBdG9taWNUZXN0LCBBZHZhbmNlZFNiQXRvbWljVGVzdFR5cGVzKTsKKyNlbmRpZgorCitUWVBFRF9URVNUX0NBU0UoQWR2YW5jZWRTYkF0b21pY1Rlc3QsIEFkdmFuY2VkU2JBdG9taWNUZXN0VHlwZXMpOworCisvLyBSZXR1cm4gYW4gU2JBdG9taWNUeXBlIHdpdGggdGhlIHZhbHVlIDB4YTVhNWE1Li4uCit0ZW1wbGF0ZSA8Y2xhc3MgU2JBdG9taWNUeXBlPgorU2JBdG9taWNUeXBlIFRlc3RGaWxsVmFsdWUoKSB7CisgIFNiQXRvbWljVHlwZSB2YWwgPSAwOworICBTYk1lbW9yeVNldCgmdmFsLCAweGE1LCBzaXplb2YoU2JBdG9taWNUeXBlKSk7CisgIHJldHVybiB2YWw7Cit9CisKKy8vIFJldHVybnMgdGhlIG51bWJlciBvZiBiaXRzIGluIGEgdHlwZS4KK3RlbXBsYXRlIDxjbGFzcyBUPgorVCBCaXRzKCkgeworICByZXR1cm4gKHNpemVvZihUKSAqIDgpOworfQorCisvLyBSZXR1cm5zIGEgdmFsdWUgd2l0aCB0aGUgaGlnaCBiaXQgfGJpdHN8IGZyb20gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IHNldC4KK3RlbXBsYXRlIDxjbGFzcyBTYkF0b21pY1R5cGU+CitTYkF0b21pY1R5cGUgR2V0SGlnaEJpdEF0KGludCBiaXRzKSB7CisgIHJldHVybiAoU2JBdG9taWNUeXBlKDEpIDw8IChCaXRzPFNiQXRvbWljVHlwZT4oKSAtIChiaXRzICsgMSkpKTsKK30KKworLy8gUHJvZHVjZXMgYSB0ZXN0IHZhbHVlIHRoYXQgaGFzIG5vbi16ZXJvIGJpdHMgaW4gYm90aCBoYWx2ZXMsIGZvciB0ZXN0aW5nCisvLyA2NC1iaXQgaW1wbGVtZW50YXRpb24gb24gMzItYml0IHBsYXRmb3Jtcy4KK3RlbXBsYXRlIDxjbGFzcyBTYkF0b21pY1R5cGU+CitTYkF0b21pY1R5cGUgR2V0VGVzdFZhbHVlKCkgeworICByZXR1cm4gR2V0SGlnaEJpdEF0PFNiQXRvbWljVHlwZT4oMSkgKyAxMTsKK30KKworVFlQRURfVEVTVChCYXNpY1NiQXRvbWljVGVzdCwgUmVsZWFzZUNvbXBhcmVBbmRTd2FwU2luZ2xlVGhyZWFkKSB7CisgIFR5cGVQYXJhbSB2YWx1ZSA9IDA7CisgIFR5cGVQYXJhbSBwcmV2ID0gYXRvbWljOjpSZWxlYXNlX0NvbXBhcmVBbmRTd2FwKCZ2YWx1ZSwgMCwgMSk7CisgIEVYUEVDVF9FUSgxLCB2YWx1ZSk7CisgIEVYUEVDVF9FUSgwLCBwcmV2KTsKKworICBjb25zdCBUeXBlUGFyYW0ga1Rlc3RWYWx1ZSA9IEdldFRlc3RWYWx1ZTxUeXBlUGFyYW0+KCk7CisgIHZhbHVlID0ga1Rlc3RWYWx1ZTsKKyAgcHJldiA9IGF0b21pYzo6UmVsZWFzZV9Db21wYXJlQW5kU3dhcCgmdmFsdWUsIDAsIDUpOworICBFWFBFQ1RfRVEoa1Rlc3RWYWx1ZSwgdmFsdWUpOworICBFWFBFQ1RfRVEoa1Rlc3RWYWx1ZSwgcHJldik7CisKKyAgdmFsdWUgPSBrVGVzdFZhbHVlOworICBwcmV2ID0gYXRvbWljOjpSZWxlYXNlX0NvbXBhcmVBbmRTd2FwKCZ2YWx1ZSwga1Rlc3RWYWx1ZSwgNSk7CisgIEVYUEVDVF9FUSg1LCB2YWx1ZSk7CisgIEVYUEVDVF9FUShrVGVzdFZhbHVlLCBwcmV2KTsKK30KKworVFlQRURfVEVTVChCYXNpY1NiQXRvbWljVGVzdCwgTm9CYXJyaWVyU3RvcmVTaW5nbGVUaHJlYWQpIHsKKyAgY29uc3QgVHlwZVBhcmFtIGtWYWwxID0gVGVzdEZpbGxWYWx1ZTxUeXBlUGFyYW0+KCk7CisgIGNvbnN0IFR5cGVQYXJhbSBrVmFsMiA9IHN0YXRpY19jYXN0PFR5cGVQYXJhbT4oLTEpOworCisgIFR5cGVQYXJhbSB2YWx1ZTsKKworICBhdG9taWM6Ok5vQmFycmllcl9TdG9yZSgmdmFsdWUsIGtWYWwxKTsKKyAgRVhQRUNUX0VRKGtWYWwxLCB2YWx1ZSk7CisgIGF0b21pYzo6Tm9CYXJyaWVyX1N0b3JlKCZ2YWx1ZSwga1ZhbDIpOworICBFWFBFQ1RfRVEoa1ZhbDIsIHZhbHVlKTsKK30KKworVFlQRURfVEVTVChCYXNpY1NiQXRvbWljVGVzdCwgTm9CYXJyaWVyTG9hZFNpbmdsZVRocmVhZCkgeworICBjb25zdCBUeXBlUGFyYW0ga1ZhbDEgPSBUZXN0RmlsbFZhbHVlPFR5cGVQYXJhbT4oKTsKKyAgY29uc3QgVHlwZVBhcmFtIGtWYWwyID0gc3RhdGljX2Nhc3Q8VHlwZVBhcmFtPigtMSk7CisKKyAgVHlwZVBhcmFtIHZhbHVlOworCisgIHZhbHVlID0ga1ZhbDE7CisgIEVYUEVDVF9FUShrVmFsMSwgYXRvbWljOjpOb0JhcnJpZXJfTG9hZCgmdmFsdWUpKTsKKyAgdmFsdWUgPSBrVmFsMjsKKyAgRVhQRUNUX0VRKGtWYWwyLCBhdG9taWM6Ok5vQmFycmllcl9Mb2FkKCZ2YWx1ZSkpOworfQorCitUWVBFRF9URVNUKEFkdmFuY2VkU2JBdG9taWNUZXN0LCBJbmNyZW1lbnRTaW5nbGVUaHJlYWQpIHsKICAgLy8gdXNlIGEgZ3VhcmQgdmFsdWUgdG8gbWFrZSBzdXJlIHRoZSBOb0JhcnJpZXJfQXRvbWljSW5jcmVtZW50IGRvZXNuJ3QgZ28KICAgLy8gb3V0c2lkZSB0aGUgZXhwZWN0ZWQgYWRkcmVzcyBib3VuZHMuICBUaGlzIGlzIGluIHBhcnRpY3VsYXIgdG8KICAgLy8gdGVzdCB0aGF0IHNvbWUgZnV0dXJlIGNoYW5nZSB0byB0aGUgYXNtIGNvZGUgZG9lc24ndCBjYXVzZSB0aGUKQEAgLTEwNiwyNiArMjAzLDcgQEAKICAgRVhQRUNUX0VRKHMubmV4dF93b3JkLCBuZXh0X3dvcmRfdmFsdWUpOwogfQogCi0vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYml0cyBpbiBhIHR5cGUuCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLVQgQml0cygpIHsKLSAgcmV0dXJuIChzaXplb2YoVCkgKiA4KTsKLX0KLQotLy8gUmV0dXJucyBhIHZhbHVlIHdpdGggdGhlIGhpZ2ggYml0IHxiaXRzfCBmcm9tIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBzZXQuCi10ZW1wbGF0ZSA8Y2xhc3MgU2JBdG9taWNUeXBlPgotU2JBdG9taWNUeXBlIEdldEhpZ2hCaXRBdChpbnQgYml0cykgewotICByZXR1cm4gKFNiQXRvbWljVHlwZSgxKSA8PCAoQml0czxTYkF0b21pY1R5cGU+KCkgLSAoYml0cyArIDEpKSk7Ci19Ci0KLS8vIFByb2R1Y2VzIGEgdGVzdCB2YWx1ZSB0aGF0IGhhcyBub24temVybyBiaXRzIGluIGJvdGggaGFsdmVzLCBmb3IgdGVzdGluZwotLy8gNjQtYml0IGltcGxlbWVudGF0aW9uIG9uIDMyLWJpdCBwbGF0Zm9ybXMuCi10ZW1wbGF0ZSA8Y2xhc3MgU2JBdG9taWNUeXBlPgotU2JBdG9taWNUeXBlIEdldFRlc3RWYWx1ZSgpIHsKLSAgcmV0dXJuIEdldEhpZ2hCaXRBdDxTYkF0b21pY1R5cGU+KDEpICsgMTE7Ci19Ci0KLVRZUEVEX1RFU1QoU2JBdG9taWNUZXN0LCBDb21wYXJlQW5kU3dhcFNpbmdsZVRocmVhZCkgeworVFlQRURfVEVTVChBZHZhbmNlZFNiQXRvbWljVGVzdCwgTm9CYXJyaWVyQ29tcGFyZUFuZFN3YXBTaW5nbGVUaHJlYWQpIHsKICAgVHlwZVBhcmFtIHZhbHVlID0gMDsKICAgVHlwZVBhcmFtIHByZXYgPSBhdG9taWM6Ok5vQmFycmllcl9Db21wYXJlQW5kU3dhcCgmdmFsdWUsIDAsIDEpOwogICBFWFBFQ1RfRVEoMSwgdmFsdWUpOwpAQCAtMTQzLDcgKzIyMSw3IEBACiAgIEVYUEVDVF9FUShrVGVzdFZhbHVlLCBwcmV2KTsKIH0KIAotVFlQRURfVEVTVChTYkF0b21pY1Rlc3QsIEV4Y2hhbmdlU2luZ2xlVGhyZWFkKSB7CitUWVBFRF9URVNUKEFkdmFuY2VkU2JBdG9taWNUZXN0LCBFeGNoYW5nZVNpbmdsZVRocmVhZCkgewogICBUeXBlUGFyYW0gdmFsdWUgPSAwOwogICBUeXBlUGFyYW0gbmV3X3ZhbHVlID0gYXRvbWljOjpOb0JhcnJpZXJfRXhjaGFuZ2UoJnZhbHVlLCAxKTsKICAgRVhQRUNUX0VRKDEsIHZhbHVlKTsKQEAgLTE2MSw3ICsyMzksNyBAQAogICBFWFBFQ1RfRVEoa1Rlc3RWYWx1ZSwgbmV3X3ZhbHVlKTsKIH0KIAotVFlQRURfVEVTVChTYkF0b21pY1Rlc3QsIEluY3JlbWVudEJvdW5kc1NpbmdsZVRocmVhZCkgeworVFlQRURfVEVTVChBZHZhbmNlZFNiQXRvbWljVGVzdCwgSW5jcmVtZW50Qm91bmRzU2luZ2xlVGhyZWFkKSB7CiAgIC8vIFRlc3QgYXQgcm9sbG92ZXIgYm91bmRhcnkgYmV0d2VlbiBpbnRfbWF4IGFuZCBpbnRfbWluCiAgIFR5cGVQYXJhbSB0ZXN0X3ZhbCA9IEdldEhpZ2hCaXRBdDxUeXBlUGFyYW0+KDApOwogICBUeXBlUGFyYW0gdmFsdWUgPSAtMSBeIHRlc3RfdmFsOwpAQCAtMTgzLDI1ICsyNjEsMTIgQEAKICAgRVhQRUNUX0VRKHRlc3RfdmFsIC0gMSwgdmFsdWUpOwogfQogCi0vLyBSZXR1cm4gYW4gU2JBdG9taWNUeXBlIHdpdGggdGhlIHZhbHVlIDB4YTVhNWE1Li4uCi10ZW1wbGF0ZSA8Y2xhc3MgU2JBdG9taWNUeXBlPgotU2JBdG9taWNUeXBlIFRlc3RGaWxsVmFsdWUoKSB7Ci0gIFNiQXRvbWljVHlwZSB2YWwgPSAwOwotICBTYk1lbW9yeVNldCgmdmFsLCAweGE1LCBzaXplb2YoU2JBdG9taWNUeXBlKSk7Ci0gIHJldHVybiB2YWw7Ci19Ci0KLVRZUEVEX1RFU1QoU2JBdG9taWNUZXN0LCBTdG9yZVNpbmdsZVRocmVhZCkgeworVFlQRURfVEVTVChBZHZhbmNlZFNiQXRvbWljVGVzdCwgQmFycmllclN0b3JlU2luZ2xlVGhyZWFkKSB7CiAgIGNvbnN0IFR5cGVQYXJhbSBrVmFsMSA9IFRlc3RGaWxsVmFsdWU8VHlwZVBhcmFtPigpOwogICBjb25zdCBUeXBlUGFyYW0ga1ZhbDIgPSBzdGF0aWNfY2FzdDxUeXBlUGFyYW0+KC0xKTsKIAogICBUeXBlUGFyYW0gdmFsdWU7CiAKLSAgYXRvbWljOjpOb0JhcnJpZXJfU3RvcmUoJnZhbHVlLCBrVmFsMSk7Ci0gIEVYUEVDVF9FUShrVmFsMSwgdmFsdWUpOwotICBhdG9taWM6Ok5vQmFycmllcl9TdG9yZSgmdmFsdWUsIGtWYWwyKTsKLSAgRVhQRUNUX0VRKGtWYWwyLCB2YWx1ZSk7Ci0KICAgYXRvbWljOjpBY3F1aXJlX1N0b3JlKCZ2YWx1ZSwga1ZhbDEpOwogICBFWFBFQ1RfRVEoa1ZhbDEsIHZhbHVlKTsKICAgYXRvbWljOjpBY3F1aXJlX1N0b3JlKCZ2YWx1ZSwga1ZhbDIpOwpAQCAtMjEzLDE4ICsyNzgsMTMgQEAKICAgRVhQRUNUX0VRKGtWYWwyLCB2YWx1ZSk7CiB9CiAKLVRZUEVEX1RFU1QoU2JBdG9taWNUZXN0LCBMb2FkU2luZ2xlVGhyZWFkKSB7CitUWVBFRF9URVNUKEFkdmFuY2VkU2JBdG9taWNUZXN0LCBCYXJyaWVyTG9hZFNpbmdsZVRocmVhZCkgewogICBjb25zdCBUeXBlUGFyYW0ga1ZhbDEgPSBUZXN0RmlsbFZhbHVlPFR5cGVQYXJhbT4oKTsKICAgY29uc3QgVHlwZVBhcmFtIGtWYWwyID0gc3RhdGljX2Nhc3Q8VHlwZVBhcmFtPigtMSk7CiAKICAgVHlwZVBhcmFtIHZhbHVlOwogCiAgIHZhbHVlID0ga1ZhbDE7Ci0gIEVYUEVDVF9FUShrVmFsMSwgYXRvbWljOjpOb0JhcnJpZXJfTG9hZCgmdmFsdWUpKTsKLSAgdmFsdWUgPSBrVmFsMjsKLSAgRVhQRUNUX0VRKGtWYWwyLCBhdG9taWM6Ok5vQmFycmllcl9Mb2FkKCZ2YWx1ZSkpOwotCi0gIHZhbHVlID0ga1ZhbDE7CiAgIEVYUEVDVF9FUShrVmFsMSwgYXRvbWljOjpBY3F1aXJlX0xvYWQoJnZhbHVlKSk7CiAgIHZhbHVlID0ga1ZhbDI7CiAgIEVYUEVDVF9FUShrVmFsMiwgYXRvbWljOjpBY3F1aXJlX0xvYWQoJnZhbHVlKSk7CkBAIC0yOTUsNyArMzU1LDcgQEAKIC8vIFRlc3RzIGEgIm9uY2UiLWxpa2UgZnVuY3Rpb25hbGl0eSBpbXBsZW1lbnRlZCB3aXRoIEF0b21pY3MuIFRoaXMgc2hvdWxkCiAvLyBlZmZlY3RpdmVseSB0ZXN0IG11bHRpLXRocmVhZGVkIENvbXBhcmVBbmRTd2FwLCBSZWxlYXNlX1N0b3JlIGFuZAogLy8gQWNxdWlyZV9Mb2FkLgotVFlQRURfVEVTVChTYkF0b21pY1Rlc3QsIE9uY2VNdWx0aXBsZVRocmVhZHMpIHsKK1RZUEVEX1RFU1QoQWR2YW5jZWRTYkF0b21pY1Rlc3QsIE9uY2VNdWx0aXBsZVRocmVhZHMpIHsKICAgY29uc3QgaW50IGtOdW1UcmlhbHMgPSAyNTsKICAgY29uc3QgaW50IGtOdW1UaHJlYWRzID0gMTI7CiAgIC8vIEVuc3VyZSBlYWNoIHRocmVhZCBoYXMgc2xpZ2h0bHkgZGlmZmVyZW50IGRhdGEgYnkgb2Zmc2V0dGluZyBpdCBhIGJpdCBhcwpAQCAtMzcyLDcgKzQzMiw3IEBACiAgIHJldHVybiBOVUxMOwogfQogCi1UWVBFRF9URVNUKFNiQXRvbWljVGVzdCwgSW5jcmVtZW50RGVjcmVtZW50TXVsdGlwbGVUaHJlYWRzKSB7CitUWVBFRF9URVNUKEFkdmFuY2VkU2JBdG9taWNUZXN0LCBJbmNyZW1lbnREZWNyZW1lbnRNdWx0aXBsZVRocmVhZHMpIHsKICAgY29uc3QgaW50IGtOdW1UcmlhbHMgPSAxNTsKICAgY29uc3QgaW50IGtOdW1UaHJlYWRzID0gMTI7CiAgIFNCX0NPTVBJTEVfQVNTRVJUKGtOdW1UaHJlYWRzICUgMiA9PSAwLCBrTnVtVGhyZWFkc19pc19ldmVuKTsKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbnBsYi9jb25kaXRpb25fdmFyaWFibGVfd2FpdF90aW1lZF90ZXN0LmNjIGIvc3JjL3N0YXJib2FyZC9ucGxiL2NvbmRpdGlvbl92YXJpYWJsZV93YWl0X3RpbWVkX3Rlc3QuY2MKaW5kZXggODY5OGUzNy4uZTcwYzZiOSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9ucGxiL2NvbmRpdGlvbl92YXJpYWJsZV93YWl0X3RpbWVkX3Rlc3QuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9ucGxiL2NvbmRpdGlvbl92YXJpYWJsZV93YWl0X3RpbWVkX3Rlc3QuY2MKQEAgLTEyOCw3ICsxMjgsOSBAQAogCiAgIC8vIFdlIHNob3VsZCBoYXZlIHdhaXRlZCBhdCBsZWFzdCB0aGUgZGVsYXlfYWZ0ZXJfc2lnbmFsIGFtb3VudCwgYnV0IG5vdCB0aGUKICAgLy8gZnVsbCBkZWxheS4KLSAgRVhQRUNUX0xUKGNvbnRleHQuZGVsYXlfYWZ0ZXJfc2lnbmFsLCBTYlRpbWVHZXRNb25vdG9uaWNOb3coKSAtIHN0YXJ0KTsKKyAgLy8gQWRkIHNvbWUgcGFkZGluZyB0byB0b2xlcmF0ZSBzbGlnaHRseSBpbXByZWNpc2Ugc2xlZXBzLgorICBFWFBFQ1RfTFQoY29udGV4dC5kZWxheV9hZnRlcl9zaWduYWwsIFNiVGltZUdldE1vbm90b25pY05vdygpIC0gc3RhcnQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29udGV4dC5kZWxheV9hZnRlcl9zaWduYWwgLyAxMCkpOwogICBFWFBFQ1RfR1Qoa0RlbGF5LCBTYlRpbWVHZXRNb25vdG9uaWNOb3coKSAtIHN0YXJ0KTsKIAogICBFWFBFQ1RfVFJVRShTYk11dGV4UmVsZWFzZSgmY29udGV4dC5tdXRleCkpOwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9ucGxiL2RybV9jcmVhdGVfc3lzdGVtX3Rlc3QuY2MgYi9zcmMvc3RhcmJvYXJkL25wbGIvZHJtX2NyZWF0ZV9zeXN0ZW1fdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTUwYTJkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9ucGxiL2RybV9jcmVhdGVfc3lzdGVtX3Rlc3QuY2MKQEAgLTAsMCArMSwxOTMgQEAKKy8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJzdGFyYm9hcmQvZHJtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL25wbGIvZHJtX2hlbHBlcnMuaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKKworbmFtZXNwYWNlIHN0YXJib2FyZCB7CituYW1lc3BhY2UgbnBsYiB7CituYW1lc3BhY2UgeworCitURVNUKFNiRHJtVGVzdCwgQW55U3VwcG9ydGVkS2V5U3lzdGVtcykgeworICBib29sIGFueV9zdXBwb3J0ZWRfa2V5X3N5c3RlbXMgPSBmYWxzZTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBTQl9BUlJBWV9TSVpFX0lOVChrS2V5U3lzdGVtcyk7ICsraSkgeworICAgIGNvbnN0IGNoYXIqIGtleV9zeXN0ZW0gPSBrS2V5U3lzdGVtc1tpXTsKKyAgICBTYkRybVN5c3RlbSBkcm1fc3lzdGVtID0gQ3JlYXRlRHVtbXlEcm1TeXN0ZW0oa2V5X3N5c3RlbSk7CisgICAgaWYgKFNiRHJtU3lzdGVtSXNWYWxpZChkcm1fc3lzdGVtKSkgeworICAgICAgU0JfRExPRyhJTkZPKSA8PCAiRHJtIHN5c3RlbSB3aXRoIGtleSBzeXN0ZW0gIiA8PCBrZXlfc3lzdGVtCisgICAgICAgICAgICAgICAgICAgIDw8ICIgaXMgdmFsaWQuIjsKKyAgICB9IGVsc2UgeworICAgICAgU0JfRExPRyhJTkZPKSA8PCAiRHJtIHN5c3RlbSB3aXRoIGtleSBzeXN0ZW0gIiA8PCBrZXlfc3lzdGVtCisgICAgICAgICAgICAgICAgICAgIDw8ICIgaXMgTk9UIHZhbGlkLiI7CisgICAgfQorICAgIGFueV9zdXBwb3J0ZWRfa2V5X3N5c3RlbXMgfD0gU2JEcm1TeXN0ZW1Jc1ZhbGlkKGRybV9zeXN0ZW0pOworICAgIFNiRHJtRGVzdHJveVN5c3RlbShkcm1fc3lzdGVtKTsKKyAgfQorICBFWFBFQ1RfVFJVRShhbnlfc3VwcG9ydGVkX2tleV9zeXN0ZW1zKSA8PCAiIG5vIERSTSBrZXkgc3lzdGVtcyBzdXBwb3J0ZWQiOworfQorCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfTlVMTF9DQUxMQkFDS1NfSU5WQUxJRF9SRVRVUk5fQVBJX1ZFUlNJT04KK1RFU1QoU2JEcm1UZXN0LCBOdWxsQ2FsbGJhY2tzKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgU0JfQVJSQVlfU0laRV9JTlQoa0tleVN5c3RlbXMpOyArK2kpIHsKKyAgICBjb25zdCBjaGFyKiBrZXlfc3lzdGVtID0ga0tleVN5c3RlbXNbaV07CisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfRFJNX1JFRklORU1FTlRfQVBJX1ZFUlNJT04KKyAgICB7CisgICAgICBTYkRybVN5c3RlbSBkcm1fc3lzdGVtID0gU2JEcm1DcmVhdGVTeXN0ZW0oCisgICAgICAgICAga2V5X3N5c3RlbSwgTlVMTCAvKiBjb250ZXh0ICovLAorICAgICAgICAgIE5VTEwgLyogc2Vzc2lvbl91cGRhdGVfcmVxdWVzdF9mdW5jICovLCBEdW1teVNlc3Npb25VcGRhdGVkRnVuYywKKyAgICAgICAgICBEdW1teVNlc3Npb25LZXlTdGF0dXNlc0NoYW5nZWRGdW5jLCBEdW1teVNlcnZlckNlcnRpZmljYXRlVXBkYXRlZEZ1bmMsCisgICAgICAgICAgRHVtbXlTZXNzaW9uQ2xvc2VkRnVuYyk7CisgICAgICBFWFBFQ1RfRkFMU0UoU2JEcm1TeXN0ZW1Jc1ZhbGlkKGRybV9zeXN0ZW0pKTsKKyAgICAgIFNiRHJtRGVzdHJveVN5c3RlbShkcm1fc3lzdGVtKTsKKyAgICB9CisgICAgeworICAgICAgU2JEcm1TeXN0ZW0gZHJtX3N5c3RlbSA9IFNiRHJtQ3JlYXRlU3lzdGVtKAorICAgICAgICAgIGtleV9zeXN0ZW0sIE5VTEwgLyogY29udGV4dCAqLywgRHVtbXlTZXNzaW9uVXBkYXRlUmVxdWVzdEZ1bmMsCisgICAgICAgICAgTlVMTCAvKnNlc3Npb25fdXBkYXRlZF9mdW5jICovLCBEdW1teVNlc3Npb25LZXlTdGF0dXNlc0NoYW5nZWRGdW5jLAorICAgICAgICAgIER1bW15U2VydmVyQ2VydGlmaWNhdGVVcGRhdGVkRnVuYywgRHVtbXlTZXNzaW9uQ2xvc2VkRnVuYyk7CisgICAgICBFWFBFQ1RfRkFMU0UoU2JEcm1TeXN0ZW1Jc1ZhbGlkKGRybV9zeXN0ZW0pKTsKKyAgICAgIFNiRHJtRGVzdHJveVN5c3RlbShkcm1fc3lzdGVtKTsKKyAgICB9CisgICAgeworICAgICAgU2JEcm1TeXN0ZW0gZHJtX3N5c3RlbSA9IFNiRHJtQ3JlYXRlU3lzdGVtKAorICAgICAgICAgIGtleV9zeXN0ZW0sIE5VTEwgLyogY29udGV4dCAqLywgRHVtbXlTZXNzaW9uVXBkYXRlUmVxdWVzdEZ1bmMsCisgICAgICAgICAgRHVtbXlTZXNzaW9uVXBkYXRlZEZ1bmMsIE5VTEwgLyogc2Vzc2lvbl9rZXlfc3RhdHVzZXNfY2hhbmdlZF9mdW5jICovLAorICAgICAgICAgIER1bW15U2VydmVyQ2VydGlmaWNhdGVVcGRhdGVkRnVuYywgRHVtbXlTZXNzaW9uQ2xvc2VkRnVuYyk7CisgICAgICBFWFBFQ1RfRkFMU0UoU2JEcm1TeXN0ZW1Jc1ZhbGlkKGRybV9zeXN0ZW0pKTsKKyAgICAgIFNiRHJtRGVzdHJveVN5c3RlbShkcm1fc3lzdGVtKTsKKyAgICB9CisgICAgeworICAgICAgU2JEcm1TeXN0ZW0gZHJtX3N5c3RlbSA9IFNiRHJtQ3JlYXRlU3lzdGVtKAorICAgICAgICAgIGtleV9zeXN0ZW0sIE5VTEwgLyogY29udGV4dCAqLywgRHVtbXlTZXNzaW9uVXBkYXRlUmVxdWVzdEZ1bmMsCisgICAgICAgICAgRHVtbXlTZXNzaW9uVXBkYXRlZEZ1bmMsIER1bW15U2Vzc2lvbktleVN0YXR1c2VzQ2hhbmdlZEZ1bmMsCisgICAgICAgICAgTlVMTCAvKiBzZXJ2ZXJfY2VydGlmaWNhdGRfdXBkYXRlZF9mdW5jICovLCBEdW1teVNlc3Npb25DbG9zZWRGdW5jKTsKKyAgICAgIEVYUEVDVF9GQUxTRShTYkRybVN5c3RlbUlzVmFsaWQoZHJtX3N5c3RlbSkpOworICAgICAgU2JEcm1EZXN0cm95U3lzdGVtKGRybV9zeXN0ZW0pOworICAgIH0KKyAgICB7CisgICAgICBTYkRybVN5c3RlbSBkcm1fc3lzdGVtID0gU2JEcm1DcmVhdGVTeXN0ZW0oCisgICAgICAgICAga2V5X3N5c3RlbSwgTlVMTCAvKiBjb250ZXh0ICovLCBEdW1teVNlc3Npb25VcGRhdGVSZXF1ZXN0RnVuYywKKyAgICAgICAgICBEdW1teVNlc3Npb25VcGRhdGVkRnVuYywgRHVtbXlTZXNzaW9uS2V5U3RhdHVzZXNDaGFuZ2VkRnVuYywKKyAgICAgICAgICBEdW1teVNlcnZlckNlcnRpZmljYXRlVXBkYXRlZEZ1bmMsIE5VTEwgLyogc2Vzc2lvbl9jbG9zZWRfZnVuYyAqLyk7CisgICAgICBFWFBFQ1RfRkFMU0UoU2JEcm1TeXN0ZW1Jc1ZhbGlkKGRybV9zeXN0ZW0pKTsKKyAgICAgIFNiRHJtRGVzdHJveVN5c3RlbShkcm1fc3lzdGVtKTsKKyAgICB9CisjZWxpZiBTQl9IQVMoRFJNX1NFU1NJT05fQ0xPU0VEKQorICAgIHsKKyAgICAgIFNiRHJtU3lzdGVtIGRybV9zeXN0ZW0gPSBTYkRybUNyZWF0ZVN5c3RlbSgKKyAgICAgICAgICBrZXlfc3lzdGVtLCBOVUxMIC8qIGNvbnRleHQgKi8sCisgICAgICAgICAgTlVMTCAvKiBzZXNzaW9uX3VwZGF0ZV9yZXF1ZXN0X2Z1bmMgKi8sIER1bW15U2Vzc2lvblVwZGF0ZWRGdW5jLAorICAgICAgICAgIER1bW15U2Vzc2lvbktleVN0YXR1c2VzQ2hhbmdlZEZ1bmMsIER1bW15U2Vzc2lvbkNsb3NlZEZ1bmMpOworICAgICAgRVhQRUNUX0ZBTFNFKFNiRHJtU3lzdGVtSXNWYWxpZChkcm1fc3lzdGVtKSk7CisgICAgICBTYkRybURlc3Ryb3lTeXN0ZW0oZHJtX3N5c3RlbSk7CisgICAgfQorICAgIHsKKyAgICAgIFNiRHJtU3lzdGVtIGRybV9zeXN0ZW0gPSBTYkRybUNyZWF0ZVN5c3RlbSgKKyAgICAgICAgICBrZXlfc3lzdGVtLCBOVUxMIC8qIGNvbnRleHQgKi8sIER1bW15U2Vzc2lvblVwZGF0ZVJlcXVlc3RGdW5jLAorICAgICAgICAgIE5VTEwgLypzZXNzaW9uX3VwZGF0ZWRfZnVuYyAqLywgRHVtbXlTZXNzaW9uS2V5U3RhdHVzZXNDaGFuZ2VkRnVuYywKKyAgICAgICAgICBEdW1teVNlc3Npb25DbG9zZWRGdW5jKTsKKyAgICAgIEVYUEVDVF9GQUxTRShTYkRybVN5c3RlbUlzVmFsaWQoZHJtX3N5c3RlbSkpOworICAgICAgU2JEcm1EZXN0cm95U3lzdGVtKGRybV9zeXN0ZW0pOworICAgIH0KKyAgICB7CisgICAgICBTYkRybVN5c3RlbSBkcm1fc3lzdGVtID0gU2JEcm1DcmVhdGVTeXN0ZW0oCisgICAgICAgICAga2V5X3N5c3RlbSwgTlVMTCAvKiBjb250ZXh0ICovLCBEdW1teVNlc3Npb25VcGRhdGVSZXF1ZXN0RnVuYywKKyAgICAgICAgICBEdW1teVNlc3Npb25VcGRhdGVkRnVuYywgTlVMTCAvKiBzZXNzaW9uX2tleV9zdGF0dXNlc19jaGFuZ2VkX2Z1bmMgKi8sCisgICAgICAgICAgRHVtbXlTZXNzaW9uQ2xvc2VkRnVuYyk7CisgICAgICBFWFBFQ1RfRkFMU0UoU2JEcm1TeXN0ZW1Jc1ZhbGlkKGRybV9zeXN0ZW0pKTsKKyAgICAgIFNiRHJtRGVzdHJveVN5c3RlbShkcm1fc3lzdGVtKTsKKyAgICB9CisgICAgeworICAgICAgU2JEcm1TeXN0ZW0gZHJtX3N5c3RlbSA9IFNiRHJtQ3JlYXRlU3lzdGVtKAorICAgICAgICAgIGtleV9zeXN0ZW0sIE5VTEwgLyogY29udGV4dCAqLywgRHVtbXlTZXNzaW9uVXBkYXRlUmVxdWVzdEZ1bmMsCisgICAgICAgICAgRHVtbXlTZXNzaW9uVXBkYXRlZEZ1bmMsIER1bW15U2Vzc2lvbktleVN0YXR1c2VzQ2hhbmdlZEZ1bmMsCisgICAgICAgICAgTlVMTCAvKiBzZXNzaW9uX2Nsb3NlZF9mdW5jICovKTsKKyAgICAgIEVYUEVDVF9GQUxTRShTYkRybVN5c3RlbUlzVmFsaWQoZHJtX3N5c3RlbSkpOworICAgICAgU2JEcm1EZXN0cm95U3lzdGVtKGRybV9zeXN0ZW0pOworICAgIH0KKyNlbGlmIFNCX0hBUyhEUk1fS0VZX1NUQVRVU0VTKQorICAgIHsKKyAgICAgIFNiRHJtU3lzdGVtIGRybV9zeXN0ZW0gPSBTYkRybUNyZWF0ZVN5c3RlbSgKKyAgICAgICAgICBrZXlfc3lzdGVtLCBOVUxMIC8qIGNvbnRleHQgKi8sCisgICAgICAgICAgTlVMTCAvKiBzZXNzaW9uX3VwZGF0ZV9yZXF1ZXN0X2Z1bmMgKi8sIER1bW15U2Vzc2lvblVwZGF0ZWRGdW5jLAorICAgICAgICAgIER1bW15U2Vzc2lvbktleVN0YXR1c2VzQ2hhbmdlZEZ1bmMpOworICAgICAgRVhQRUNUX0ZBTFNFKFNiRHJtU3lzdGVtSXNWYWxpZChkcm1fc3lzdGVtKSk7CisgICAgICBTYkRybURlc3Ryb3lTeXN0ZW0oZHJtX3N5c3RlbSk7CisgICAgfQorICAgIHsKKyAgICAgIFNiRHJtU3lzdGVtIGRybV9zeXN0ZW0gPSBTYkRybUNyZWF0ZVN5c3RlbSgKKyAgICAgICAgICBrZXlfc3lzdGVtLCBOVUxMIC8qIGNvbnRleHQgKi8sIER1bW15U2Vzc2lvblVwZGF0ZVJlcXVlc3RGdW5jLAorICAgICAgICAgIE5VTEwgLyogc2Vzc2lvbl91cGRhdGVkX2Z1bmMgKi8sIER1bW15U2Vzc2lvbktleVN0YXR1c2VzQ2hhbmdlZEZ1bmMpOworICAgICAgRVhQRUNUX0ZBTFNFKFNiRHJtU3lzdGVtSXNWYWxpZChkcm1fc3lzdGVtKSk7CisgICAgICBTYkRybURlc3Ryb3lTeXN0ZW0oZHJtX3N5c3RlbSk7CisgICAgfQorICAgIHsKKyAgICAgIFNiRHJtU3lzdGVtIGRybV9zeXN0ZW0gPSBTYkRybUNyZWF0ZVN5c3RlbSgKKyAgICAgICAgICBrZXlfc3lzdGVtLCBOVUxMIC8qIGNvbnRleHQgKi8sIER1bW15U2Vzc2lvblVwZGF0ZVJlcXVlc3RGdW5jLAorICAgICAgICAgIER1bW15U2Vzc2lvblVwZGF0ZWRGdW5jLAorICAgICAgICAgIE5VTEwgLyogc2Vzc2lvbl9rZXlfc3RhdHVzZXNfY2hhbmdlZF9mdW5jICovKTsKKyAgICAgIEVYUEVDVF9GQUxTRShTYkRybVN5c3RlbUlzVmFsaWQoZHJtX3N5c3RlbSkpOworICAgICAgU2JEcm1EZXN0cm95U3lzdGVtKGRybV9zeXN0ZW0pOworICAgIH0KKyNlbHNlCisgICAgeworICAgICAgU2JEcm1TeXN0ZW0gZHJtX3N5c3RlbSA9IFNiRHJtQ3JlYXRlU3lzdGVtKAorICAgICAgICAgIGtleV9zeXN0ZW0sIE5VTEwgLyogY29udGV4dCAqLywKKyAgICAgICAgICBOVUxMIC8qIHNlc3Npb25fdXBkYXRlX3JlcXVlc3RfZnVuYyAqLywgRHVtbXlTZXNzaW9uVXBkYXRlZEZ1bmMpOworICAgICAgRVhQRUNUX0ZBTFNFKFNiRHJtU3lzdGVtSXNWYWxpZChkcm1fc3lzdGVtKSk7CisgICAgfQorICAgIHsKKyAgICAgIFNiRHJtU3lzdGVtIGRybV9zeXN0ZW0gPSBTYkRybUNyZWF0ZVN5c3RlbSgKKyAgICAgICAgICBrZXlfc3lzdGVtLCBOVUxMIC8qIGNvbnRleHQgKi8sIER1bW15U2Vzc2lvblVwZGF0ZVJlcXVlc3RGdW5jLAorICAgICAgICAgIE5VTEwgLyogc2Vzc2lvbl91cGRhdGVkX2Z1bmMgKi8pOworICAgICAgRVhQRUNUX0ZBTFNFKFNiRHJtU3lzdGVtSXNWYWxpZChkcm1fc3lzdGVtKSk7CisgICAgICBTYkRybURlc3Ryb3lTeXN0ZW0oZHJtX3N5c3RlbSk7CisgICAgfQorI2VuZGlmICAvLyBTQl9IQVMoRFJNX0tFWV9TVEFUVVNFUykKKyAgfQorfQorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9OVUxMX0NBTExCQUNLU19JTlZBTElEX1JFVFVSTl9BUElfVkVSU0lPTgorCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfTVVMVElfUExBWUVSX0FQSV9WRVJTSU9OCitURVNUKFNiRHJtVGVzdCwgTXVsdGlEcm0pIHsKKyAgY29uc3QgaW50IGtNYXhQbGF5ZXJzUGVyS2V5U3lzdGVtID0gMTY7CisgIHN0ZDo6dmVjdG9yPFNiRHJtU3lzdGVtPiBjcmVhdGVkX2RybV9zeXN0ZW1zOworICBpbnQgbnVtYmVyX29mX2RybV9zeXN0ZW1zID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTWF4UGxheWVyc1BlcktleVN5c3RlbTsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBTQl9BUlJBWV9TSVpFX0lOVChrS2V5U3lzdGVtcyk7ICsraikgeworICAgICAgY29uc3QgY2hhcioga2V5X3N5c3RlbSA9IGtLZXlTeXN0ZW1zW2pdOworICAgICAgY3JlYXRlZF9kcm1fc3lzdGVtcy5wdXNoX2JhY2soQ3JlYXRlRHVtbXlEcm1TeXN0ZW0oa2V5X3N5c3RlbSkpOworICAgICAgaWYgKCFTYkRybVN5c3RlbUlzVmFsaWQoY3JlYXRlZF9kcm1fc3lzdGVtcy5iYWNrKCkpKSB7CisgICAgICAgIGNyZWF0ZWRfZHJtX3N5c3RlbXMucG9wX2JhY2soKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGNyZWF0ZWRfZHJtX3N5c3RlbXMuc2l6ZSgpID09IG51bWJlcl9vZl9kcm1fc3lzdGVtcykgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIG51bWJlcl9vZl9kcm1fc3lzdGVtcyA9IGNyZWF0ZWRfZHJtX3N5c3RlbXMuc2l6ZSgpOworICB9CisgIFNCX0RMT0coSU5GTykgPDwgIkNyZWF0ZWQgIiA8PCBudW1iZXJfb2ZfZHJtX3N5c3RlbXMKKyAgICAgICAgICAgICAgICA8PCAiIERSTSBzeXN0ZW1zIGluIHRvdGFsLiI7CisgIGZvciAoYXV0byBkcm1fc3lzdGVtIDogY3JlYXRlZF9kcm1fc3lzdGVtcykgeworICAgIFNiRHJtRGVzdHJveVN5c3RlbShkcm1fc3lzdGVtKTsKKyAgfQorfQorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9NVUxUSV9QTEFZRVJfQVBJX1ZFUlNJT04KKworfSAgLy8gbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgbnBsYgorfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9ucGxiL2RybV9oZWxwZXJzLmNjIGIvc3JjL3N0YXJib2FyZC9ucGxiL2RybV9oZWxwZXJzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZTFhNTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL25wbGIvZHJtX2hlbHBlcnMuY2MKQEAgLTAsMCArMSwxMDggQEAKKy8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJzdGFyYm9hcmQvbnBsYi9kcm1faGVscGVycy5oIgorCisjaW5jbHVkZSAic3RhcmJvYXJkL2RybS5oIgorCituYW1lc3BhY2Ugc3RhcmJvYXJkIHsKK25hbWVzcGFjZSBucGxiIHsKKworI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX0RSTV9SRUZJTkVNRU5UX0FQSV9WRVJTSU9OCisKK3ZvaWQgRHVtbXlTZXNzaW9uVXBkYXRlUmVxdWVzdEZ1bmMoU2JEcm1TeXN0ZW0gZHJtX3N5c3RlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JEcm1TdGF0dXMgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkRybVNlc3Npb25SZXF1ZXN0VHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlcnJvcl9tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBzZXNzaW9uX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbl9pZF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBjb250ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29udGVudF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB1cmwpIHt9CisKK3ZvaWQgRHVtbXlTZXNzaW9uVXBkYXRlZEZ1bmMoU2JEcm1TeXN0ZW0gZHJtX3N5c3RlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JEcm1TdGF0dXMgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlcnJvcl9tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBzZXNzaW9uX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbl9pZF9zaXplKSB7fQorCit2b2lkIER1bW15U2VydmVyQ2VydGlmaWNhdGVVcGRhdGVkRnVuYyhTYkRybVN5c3RlbSBkcm1fc3lzdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkRybVN0YXR1cyBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlcnJvcl9tZXNzYWdlKSB7fQorCisjZWxzZSAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfRFJNX1JFRklORU1FTlRfQVBJX1ZFUlNJT04KKwordm9pZCBEdW1teVNlc3Npb25VcGRhdGVSZXF1ZXN0RnVuYyhTYkRybVN5c3RlbSBkcm1fc3lzdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGlja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBzZXNzaW9uX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbl9pZF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBjb250ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29udGVudF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB1cmwpIHt9CisKK3ZvaWQgRHVtbXlTZXNzaW9uVXBkYXRlZEZ1bmMoU2JEcm1TeXN0ZW0gZHJtX3N5c3RlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogc2Vzc2lvbl9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25faWRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZWVkZWQpIHt9CisKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfRFJNX1JFRklORU1FTlRfQVBJX1ZFUlNJT04KKworI2lmIFNCX0hBUyhEUk1fS0VZX1NUQVRVU0VTKQordm9pZCBEdW1teVNlc3Npb25LZXlTdGF0dXNlc0NoYW5nZWRGdW5jKFNiRHJtU3lzdGVtIGRybV9zeXN0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBzZXNzaW9uX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uX2lkX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlcl9vZl9rZXlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNiRHJtS2V5SWQqIGtleV9pZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2JEcm1LZXlTdGF0dXMqIGtleV9zdGF0dXNlcykge30KKyNlbmRpZiAgLy8gU0JfSEFTKERSTV9LRVlfU1RBVFVTRVMpCisKK3ZvaWQgRHVtbXlTZXNzaW9uQ2xvc2VkRnVuYyhTYkRybVN5c3RlbSBkcm1fc3lzdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogc2Vzc2lvbl9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbl9pZF9zaXplKSB7fQorCitTYkRybVN5c3RlbSBDcmVhdGVEdW1teURybVN5c3RlbShjb25zdCBjaGFyKiBrZXlfc3lzdGVtKSB7CisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfRFJNX1JFRklORU1FTlRfQVBJX1ZFUlNJT04KKyAgcmV0dXJuIFNiRHJtQ3JlYXRlU3lzdGVtKAorICAgICAga2V5X3N5c3RlbSwgTlVMTCAvKiBjb250ZXh0ICovLCBEdW1teVNlc3Npb25VcGRhdGVSZXF1ZXN0RnVuYywKKyAgICAgIER1bW15U2Vzc2lvblVwZGF0ZWRGdW5jLCBEdW1teVNlc3Npb25LZXlTdGF0dXNlc0NoYW5nZWRGdW5jLAorICAgICAgRHVtbXlTZXJ2ZXJDZXJ0aWZpY2F0ZVVwZGF0ZWRGdW5jLCBEdW1teVNlc3Npb25DbG9zZWRGdW5jKTsKKyNlbGlmIFNCX0hBUyhEUk1fU0VTU0lPTl9DTE9TRUQpCisgIHJldHVybiBTYkRybUNyZWF0ZVN5c3RlbSgKKyAgICAgIGtleV9zeXN0ZW0sIE5VTEwgLyogY29udGV4dCAqLywgRHVtbXlTZXNzaW9uVXBkYXRlUmVxdWVzdEZ1bmMsCisgICAgICBEdW1teVNlc3Npb25VcGRhdGVkRnVuYywgRHVtbXlTZXNzaW9uS2V5U3RhdHVzZXNDaGFuZ2VkRnVuYywKKyAgICAgIER1bW15U2Vzc2lvbkNsb3NlZEZ1bmMpOworI2VsaWYgU0JfSEFTKERSTV9LRVlfU1RBVFVTRVMpCisgIHJldHVybiBTYkRybUNyZWF0ZVN5c3RlbSgKKyAgICAgIGtleV9zeXN0ZW0sIE5VTEwgLyogY29udGV4dCAqLywgRHVtbXlTZXNzaW9uVXBkYXRlUmVxdWVzdEZ1bmMsCisgICAgICBEdW1teVNlc3Npb25VcGRhdGVkRnVuYywgRHVtbXlTZXNzaW9uS2V5U3RhdHVzZXNDaGFuZ2VkRnVuYyk7CisjZWxzZSAgIC8vIFNCX0hBUyhEUk1fS0VZX1NUQVRVU0VTKQorICByZXR1cm4gU2JEcm1DcmVhdGVTeXN0ZW0oa2V5X3N5c3RlbSwgTlVMTCAvKiBjb250ZXh0ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRHVtbXlTZXNzaW9uVXBkYXRlUmVxdWVzdEZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEdW1teVNlc3Npb25VcGRhdGVkRnVuYyk7CisjZW5kaWYgIC8vIFNCX0hBUyhEUk1fS0VZX1NUQVRVU0VTKQorfQorCit9ICAvLyBuYW1lc3BhY2UgbnBsYgorfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9ucGxiL2RybV9oZWxwZXJzLmggYi9zcmMvc3RhcmJvYXJkL25wbGIvZHJtX2hlbHBlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzM1NzgwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9ucGxiL2RybV9oZWxwZXJzLmgKQEAgLTAsMCArMSw5NSBAQAorLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBTVEFSQk9BUkRfTlBMQl9EUk1fSEVMUEVSU19IXworI2RlZmluZSBTVEFSQk9BUkRfTlBMQl9EUk1fSEVMUEVSU19IXworCisjaW5jbHVkZSAic3RhcmJvYXJkL2RybS5oIgorCituYW1lc3BhY2Ugc3RhcmJvYXJkIHsKK25hbWVzcGFjZSBucGxiIHsKKworI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX0RSTV9SRUZJTkVNRU5UX0FQSV9WRVJTSU9OCisKK3ZvaWQgRHVtbXlTZXNzaW9uVXBkYXRlUmVxdWVzdEZ1bmMoU2JEcm1TeXN0ZW0gZHJtX3N5c3RlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JEcm1TdGF0dXMgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkRybVNlc3Npb25SZXF1ZXN0VHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlcnJvcl9tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBzZXNzaW9uX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbl9pZF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBjb250ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29udGVudF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB1cmwpOworCit2b2lkIER1bW15U2Vzc2lvblVwZGF0ZWRGdW5jKFNiRHJtU3lzdGVtIGRybV9zeXN0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiRHJtU3RhdHVzIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXJyb3JfbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogc2Vzc2lvbl9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25faWRfc2l6ZSk7CisKK3ZvaWQgRHVtbXlTZXJ2ZXJDZXJ0aWZpY2F0ZVVwZGF0ZWRGdW5jKFNiRHJtU3lzdGVtIGRybV9zeXN0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiRHJtU3RhdHVzIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGVycm9yX21lc3NhZ2UpOworCisjZWxzZSAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfRFJNX1JFRklORU1FTlRfQVBJX1ZFUlNJT04KKwordm9pZCBEdW1teVNlc3Npb25VcGRhdGVSZXF1ZXN0RnVuYyhTYkRybVN5c3RlbSBkcm1fc3lzdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGlja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBzZXNzaW9uX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbl9pZF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBjb250ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29udGVudF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB1cmwpOworCit2b2lkIER1bW15U2Vzc2lvblVwZGF0ZWRGdW5jKFNiRHJtU3lzdGVtIGRybV9zeXN0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIHNlc3Npb25faWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uX2lkX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VjY2VlZGVkKTsKKworI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9EUk1fUkVGSU5FTUVOVF9BUElfVkVSU0lPTgorCisjaWYgU0JfSEFTKERSTV9LRVlfU1RBVFVTRVMpCit2b2lkIER1bW15U2Vzc2lvbktleVN0YXR1c2VzQ2hhbmdlZEZ1bmMoU2JEcm1TeXN0ZW0gZHJtX3N5c3RlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIHNlc3Npb25faWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25faWRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyX29mX2tleXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2JEcm1LZXlJZCoga2V5X2lkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTYkRybUtleVN0YXR1cyoga2V5X3N0YXR1c2VzKTsKKyNlbmRpZiAgLy8gU0JfSEFTKERSTV9LRVlfU1RBVFVTRVMpCisKK3ZvaWQgRHVtbXlTZXNzaW9uQ2xvc2VkRnVuYyhTYkRybVN5c3RlbSBkcm1fc3lzdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogc2Vzc2lvbl9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbl9pZF9zaXplKTsKKworU2JEcm1TeXN0ZW0gQ3JlYXRlRHVtbXlEcm1TeXN0ZW0oY29uc3QgY2hhcioga2V5X3N5c3RlbSk7CisKK3N0YXRpYyBjb25zdCBjaGFyKiBrS2V5U3lzdGVtc1tdID0geworICAgICJjb20ud2lkZXZpbmUiLCAiY29tLndpZGV2aW5lLmFscGhhIiwgImNvbS55b3V0dWJlLnBsYXlyZWFkeSIsICJmYWlycGxheSIsCit9OworCit9ICAvLyBuYW1lc3BhY2UgbnBsYgorfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZAorCisjZW5kaWYgIC8vIFNUQVJCT0FSRF9OUExCX0RSTV9IRUxQRVJTX0hfCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL25wbGIvZHJtX2lzX3NlcnZlcl9jZXJ0aWZpY2F0ZV91cGRhdGFibGVfdGVzdC5jYyBiL3NyYy9zdGFyYm9hcmQvbnBsYi9kcm1faXNfc2VydmVyX2NlcnRpZmljYXRlX3VwZGF0YWJsZV90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MjY3NjkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL25wbGIvZHJtX2lzX3NlcnZlcl9jZXJ0aWZpY2F0ZV91cGRhdGFibGVfdGVzdC5jYwpAQCAtMCwwICsxLDU3IEBACisvLyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAic3RhcmJvYXJkL2RybS5oIgorCisjaW5jbHVkZSAic3RhcmJvYXJkL25wbGIvZHJtX2hlbHBlcnMuaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKKworbmFtZXNwYWNlIHN0YXJib2FyZCB7CituYW1lc3BhY2UgbnBsYiB7CituYW1lc3BhY2UgeworCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfRFJNX1JFRklORU1FTlRfQVBJX1ZFUlNJT04KKworVEVTVChTYkRybUlzU2VydmVyQ2VydGlmaWNhdGVVcGRhdGFibGVUZXN0LCBTdW5ueURheSkgeworICAvLyBFbnN1cmUgdGhhdCB8U2JEcm1Jc1NlcnZlckNlcnRpZmljYXRlVXBkYXRhYmxlfCBjYW4gYmUgY2FsbGVkIG92ZXIgYWxsIGtleQorICAvLyBzeXN0ZW1zLgorICBmb3IgKGF1dG8ga2V5X3N5c3RlbSA6IGtLZXlTeXN0ZW1zKSB7CisgICAgU2JEcm1TeXN0ZW0gZHJtX3N5c3RlbSA9IENyZWF0ZUR1bW15RHJtU3lzdGVtKGtleV9zeXN0ZW0pOworICAgIGlmICghU2JEcm1TeXN0ZW1Jc1ZhbGlkKGRybV9zeXN0ZW0pKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgU2JEcm1Jc1NlcnZlckNlcnRpZmljYXRlVXBkYXRhYmxlKGRybV9zeXN0ZW0pOworICAgIFNiRHJtRGVzdHJveVN5c3RlbShkcm1fc3lzdGVtKTsKKyAgfQorfQorCitURVNUKFNiRHJtSXNTZXJ2ZXJDZXJ0aWZpY2F0ZVVwZGF0YWJsZVRlc3QsIENvbnNpc3RlbmN5KSB7CisgIC8vIEVuc3VyZSB0aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBzYW1lIHJlc3VsdHMgZm9yIHRoZSBzYW1lIGtleSBzeXN0ZW0KKyAgLy8gd2hlbiBiZWluZyBjYWxsZWQgZm9yIG1vcmUgdGhhbiBvbmNlLgorICBmb3IgKGF1dG8ga2V5X3N5c3RlbSA6IGtLZXlTeXN0ZW1zKSB7CisgICAgU2JEcm1TeXN0ZW0gZHJtX3N5c3RlbSA9IENyZWF0ZUR1bW15RHJtU3lzdGVtKGtleV9zeXN0ZW0pOworICAgIGlmICghU2JEcm1TeXN0ZW1Jc1ZhbGlkKGRybV9zeXN0ZW0pKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgYm9vbCB1cGRhdGFibGUgPSBTYkRybUlzU2VydmVyQ2VydGlmaWNhdGVVcGRhdGFibGUoZHJtX3N5c3RlbSk7CisgICAgRVhQRUNUX0VRKFNiRHJtSXNTZXJ2ZXJDZXJ0aWZpY2F0ZVVwZGF0YWJsZShkcm1fc3lzdGVtKSwgdXBkYXRhYmxlKTsKKyAgICBTYkRybURlc3Ryb3lTeXN0ZW0oZHJtX3N5c3RlbSk7CisgIH0KK30KKworI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9EUk1fUkVGSU5FTUVOVF9BUElfVkVSU0lPTgorCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBucGxiCit9ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL25wbGIvZHJtX3VwZGF0ZV9zZXJ2ZXJfY2VydGlmaWNhdGVfdGVzdC5jYyBiL3NyYy9zdGFyYm9hcmQvbnBsYi9kcm1fdXBkYXRlX3NlcnZlcl9jZXJ0aWZpY2F0ZV90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZDBhOTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL25wbGIvZHJtX3VwZGF0ZV9zZXJ2ZXJfY2VydGlmaWNhdGVfdGVzdC5jYwpAQCAtMCwwICsxLDQ5IEBACisvLyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAic3RhcmJvYXJkL2RybS5oIgorCisjaW5jbHVkZSAic3RhcmJvYXJkL25wbGIvZHJtX2hlbHBlcnMuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvc3RyaW5nLmgiCisjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisKK25hbWVzcGFjZSBzdGFyYm9hcmQgeworbmFtZXNwYWNlIG5wbGIgeworbmFtZXNwYWNlIHsKKworI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX0RSTV9SRUZJTkVNRU5UX0FQSV9WRVJTSU9OCisKK1RFU1QoU2JEcm1VcGRhdGVTZXJ2ZXJDZXJ0aWZpY2F0ZVRlc3QsIFN1bm55RGF5KSB7CisgIC8vIEVuc3VyZSB0aGF0IHxTYkRybVVwZGF0ZVNlcnZlckNlcnRpZmljYXRlfCBjYW4gYmUgY2FsbGVkIG92ZXIgYWxsIGtleQorICAvLyBzeXN0ZW1zLgorICBmb3IgKGF1dG8ga2V5X3N5c3RlbSA6IGtLZXlTeXN0ZW1zKSB7CisgICAgU2JEcm1TeXN0ZW0gZHJtX3N5c3RlbSA9IENyZWF0ZUR1bW15RHJtU3lzdGVtKGtleV9zeXN0ZW0pOworICAgIGlmICghU2JEcm1TeXN0ZW1Jc1ZhbGlkKGRybV9zeXN0ZW0pKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgY29uc3QgY2hhciBrSW52YWxpZENlcnRpZmljYXRlW10gPSAiKkNvYmFsdCoiOworICAgIGlmIChTYkRybUlzU2VydmVyQ2VydGlmaWNhdGVVcGRhdGFibGUoZHJtX3N5c3RlbSkpIHsKKyAgICAgIFNiRHJtVXBkYXRlU2VydmVyQ2VydGlmaWNhdGUoZHJtX3N5c3RlbSwga1NiRHJtVGlja2V0SW52YWxpZCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtJbnZhbGlkQ2VydGlmaWNhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiU3RyaW5nR2V0TGVuZ3RoKGtJbnZhbGlkQ2VydGlmaWNhdGUpKTsKKyAgICB9CisgICAgU2JEcm1EZXN0cm95U3lzdGVtKGRybV9zeXN0ZW0pOworICB9Cit9CisKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfRFJNX1JFRklORU1FTlRfQVBJX1ZFUlNJT04KKworfSAgLy8gbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgbnBsYgorfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9ucGxiL21lbW9yeV9tYXBfdGVzdC5jYyBiL3NyYy9zdGFyYm9hcmQvbnBsYi9tZW1vcnlfbWFwX3Rlc3QuY2MKaW5kZXggMjc1MWUwMC4uZWI0Yzk0ZiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9ucGxiL21lbW9yeV9tYXBfdGVzdC5jYworKysgYi9zcmMvc3RhcmJvYXJkL25wbGIvbWVtb3J5X21hcF90ZXN0LmNjCkBAIC0xMDcsMjIgKzEwNywyMiBAQAogfQogCiAjaWYgU0JfQ0FOKE1BUF9FWEVDVVRBQkxFX01FTU9SWSkKKwogdHlwZWRlZiBpbnQgKCpTdW1GdW5jdGlvbikoaW50LCBpbnQpOwotc3RhdGljIGludCBzdW0oaW50IHgsIGludCB5KSB7CitzdGF0aWMgaW50IFN1bShpbnQgeCwgaW50IHkpIHsKICAgcmV0dXJuIHggKyB5OwogfQotc3RhdGljIGludCBzdW0yKGludCB4LCBpbnQgeSkgeworc3RhdGljIGludCBTdW0yKGludCB4LCBpbnQgeSkgewogICByZXR1cm4geCArIHkgKyB4OwogfQogCi0vLyBUaGlzIHRlc3QgaXMga25vd24gdG8gcnVuIG9uIHg2NCwgQVJNLCBhbmQgTUlQUzMyIHdpdGggTUlQUzMyIGFuZCBNSVBTMTYKLS8vIGluc3RydWN0aW9ucy4KLVRFU1QoU2JNZW1vcnlNYXBUZXN0LCBDYW5FeGVjdXRlTWFwcGVkTWVtb3J5V2l0aEV4ZWNGbGFnKSB7Ci0gIHZvaWQqIG1lbW9yeSA9IFNiTWVtb3J5TWFwKAotICAgICAga1NpemUsIGtTYk1lbW9yeU1hcFByb3RlY3RSZWFkV3JpdGUgfCBrU2JNZW1vcnlNYXBQcm90ZWN0RXhlYywgInRlc3QiKTsKLSAgQVNTRVJUX05FKGtGYWlsZWQsIG1lbW9yeSk7Ci0KLSAgLy8gVGhlcmUncyBubyByZWxpYWJsZSB3YXkgdG8gZGV0ZXJtaW5lIHRoZSBzaXplIG9mIHRoZSAnc3VtJyBmdW5jdGlvbi4gSWYgd2UKKy8vIENvcHkgdGhlIGNvbnRlbnRzIG9mIHxTdW18IGludG8gfG1lbW9yeXwsIHJldHVybmluZyBhbiBhc3NlcnRpb24gcmVzdWx0CisvLyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGNvcHkgd2FzIHN1Y2Nlc3NmdWwsIGFuZCBhIGZ1bmN0aW9uIHBvaW50ZXIgdG8gdGhlCisvLyBwb3NzaWJseSBjb3BpZWQgfFN1bXwgZnVuY3Rpb24gZGF0YS4gIENsaWVudHMgYXJlIGV4cGVjdGVkIHRvIGltbWVkaWF0ZWx5CisvLyBjYWxsIHxBU1NFUlR8IG9uIHRoZSBhc3NlcnRpb24gcmVzdWx0Lgorc3RkOjpwYWlyPDo6dGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0LCBTdW1GdW5jdGlvbj4gQ29weVN1bUZ1bmN0aW9uSW50b01lbW9yeSgKKyAgICB2b2lkKiBtZW1vcnkpIHsKKyAgLy8gVGhlcmUncyBubyByZWxpYWJsZSB3YXkgdG8gZGV0ZXJtaW5lIHRoZSBzaXplIG9mIHRoZSAnU3VtJyBmdW5jdGlvbi4gSWYgd2UKICAgLy8gYXNzdW1lIHRoZSBmdW5jdGlvbiBpcyBhdCBtb3N0IGEgY2VydGFpbiBzaXplLCB0aGVuIHdlIG1pZ2h0IHRyeSB0byByZWFkCiAgIC8vIGJleW9uZCBtYXBwZWQgbWVtb3J5IHdoZW4gY29weWluZyBpdCB0byB0aGUgZGVzdGluYXRpb24gYWRkcmVzcy4gV2UgY2FuCiAgIC8vIGdldCBhIHJlYXNvbmFibGUgdXBwZXIgYm91bmQgYnkgYXNzdW1pbmcgdGhhdCB0aGUgZnVuY3Rpb24ncyBpbXBsZW1lbnRhdGlvbgpAQCAtMTMyLDE4ICsxMzIsMTggQEAKICAgLy8gSG93ZXZlciwgc2luY2UgaXQncyBwb3NzaWJsZSB0aGUgZnVuY3Rpb24gbWF5IGNyb3NzIHRoZSBwYWdlIGJvdW5kYXJ5LCB3ZQogICAvLyBkZWZpbmUgdHdvIGZ1bmN0aW9ucyBhbmQgdXNlIHRoZSBvbmUgY2xvc2VzdCB0byB0aGUgc3RhcnQgb2YgYSBwYWdlLiBUaGVyZQogICAvLyBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGUgbGlua2VyIHdpbGwgcGxhY2UgdGhlc2UgZGVmaW5pdGlvbnMgc2VxdWVudGlhbGx5Ci0gIC8vIChhbHRob3VnaCBpdCBsaWtlbHkgd2lsbCksIHNvIHdlIGNhbid0IHVzZSB0aGUgYWRkcmVzcyBvZiAnc3VtMicgYXMgdGhlCi0gIC8vIGVuZCBvZiAnc3VtJy4KKyAgLy8gKGFsdGhvdWdoIGl0IGxpa2VseSB3aWxsKSwgc28gd2UgY2FuJ3QgdXNlIHRoZSBhZGRyZXNzIG9mICdTdW0yJyBhcyB0aGUKKyAgLy8gZW5kIG9mICdTdW0nLgogICAvLwogICAvLyBUbyBhdm9pZCB0aGUgcG9zc2liaWxpdHkgdGhhdCBDT01EQVQgZm9sZGluZyB3aWxsIGNvbWJpbmUgdGhlc2UgdHdvCiAgIC8vIGRlZmluaXRpb25zIGludG8gb25lLCBtYWtlIHN1cmUgdGhleSBhcmUgZGlmZmVyZW50LgogCiAgIC8vIEEgZnVuY3Rpb24gcG9pbnRlciBjYW4ndCBiZSBjYXN0IHRvIHZvaWQqLCBidXQgdWludDgqIHNlZW1zIHRvIGJlIG9rYXkuIFNvCiAgIC8vIGNhc3QgdG8gYSB1aW50KiB3aGljaCB3aWxsIGJlIGltcGxpY2l0bHkgY2FzdGVkIHRvIGEgdm9pZCogYmVsb3cuCi0gIFN1bUZ1bmN0aW9uIG9yaWdpbmFsX2Z1bmN0aW9uID0gJnN1bTsKLSAgaWYgKHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90Pigmc3VtMikgJSBTQl9NRU1PUllfUEFHRV9TSVpFIDwKLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90Pigmc3VtKSAlIFNCX01FTU9SWV9QQUdFX1NJWkUpIHsKLSAgICBvcmlnaW5hbF9mdW5jdGlvbiA9ICZzdW0yOworICBTdW1GdW5jdGlvbiBvcmlnaW5hbF9mdW5jdGlvbiA9ICZTdW07CisgIGlmIChyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oJlN1bTIpICUgU0JfTUVNT1JZX1BBR0VfU0laRSA8CisgICAgICByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oJlN1bSkgJSBTQl9NRU1PUllfUEFHRV9TSVpFKSB7CisgICAgb3JpZ2luYWxfZnVuY3Rpb24gPSAmU3VtMjsKICAgfQogCiAgIHVpbnQ4X3QqIHN1bV9mdW5jdGlvbl9zdGFydCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KG9yaWdpbmFsX2Z1bmN0aW9uKTsKQEAgLTE2MywxMSArMTYzLDI5IEBACiAgICAgICAocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHN1bV9mdW5jdGlvbl9zdGFydCkgLyBTQl9NRU1PUllfUEFHRV9TSVpFKSAqCiAgICAgICAgICAgU0JfTUVNT1JZX1BBR0VfU0laRSArCiAgICAgICBTQl9NRU1PUllfUEFHRV9TSVpFKTsKLSAgQVNTRVJUX1RSVUUoU2JNZW1vcnlJc0FsaWduZWQoc3VtX2Z1bmN0aW9uX3BhZ2VfZW5kLCBTQl9NRU1PUllfUEFHRV9TSVpFKSk7Ci0gIEFTU0VSVF9MVChzdW1fZnVuY3Rpb25fc3RhcnQsIHN1bV9mdW5jdGlvbl9wYWdlX2VuZCk7CisgIGlmICghU2JNZW1vcnlJc0FsaWduZWQoc3VtX2Z1bmN0aW9uX3BhZ2VfZW5kLCBTQl9NRU1PUllfUEFHRV9TSVpFKSkgeworICAgIHJldHVybiB7Ojp0ZXN0aW5nOjpBc3NlcnRpb25GYWlsdXJlKCkKKyAgICAgICAgICAgICAgICA8PCAiRXhwZWN0ZWQgfFN1bXwgcGFnZSBlbmQgKCIKKyAgICAgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDx2b2lkKj4oc3VtX2Z1bmN0aW9uX3BhZ2VfZW5kKQorICAgICAgICAgICAgICAgIDw8ICIpIHRvIGJlIGFsaWduZWQgdG8gIiA8PCBTQl9NRU1PUllfUEFHRV9TSVpFLAorICAgICAgICAgICAgbnVsbHB0cn07CisgIH0KKyAgaWYgKHN1bV9mdW5jdGlvbl9zdGFydCA+PSBzdW1fZnVuY3Rpb25fcGFnZV9lbmQpIHsKKyAgICByZXR1cm4gezo6dGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZSgpCisgICAgICAgICAgICAgICAgPDwgIkV4cGVjdGVkIHxTdW18IGZ1bmN0aW9uIHBhZ2Ugc3RhcnQgKCIKKyAgICAgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDx2b2lkKj4oc3VtX2Z1bmN0aW9uX3N0YXJ0KQorICAgICAgICAgICAgICAgIDw8ICIpIHRvIGJlIGxlc3MgdGhhbiB8U3VtfCBmdW5jdGlvbiBwYWdlIGVuZCAoIgorICAgICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PHZvaWQqPihzdW1fZnVuY3Rpb25fcGFnZV9lbmQpIDw8ICIpIiwKKyAgICAgICAgICAgIG51bGxwdHJ9OworICB9CiAKICAgc2l6ZV90IGJ5dGVzX3RvX2NvcHkgPSBzdW1fZnVuY3Rpb25fcGFnZV9lbmQgLSBzdW1fZnVuY3Rpb25fc3RhcnQ7Ci0gIEFTU0VSVF9MRShieXRlc190b19jb3B5LCBTQl9NRU1PUllfUEFHRV9TSVpFKTsKKyAgaWYgKGJ5dGVzX3RvX2NvcHkgPiBTQl9NRU1PUllfUEFHRV9TSVpFKSB7CisgICAgcmV0dXJuIHs6OnRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmUoKQorICAgICAgICAgICAgICAgIDw8ICJFeHBlY3RlZCBieXRlcyByZXF1aXJlZCB0byBjb3B5IHxTdW18IHRvIGJlIGxlc3MgdGhhbiAiCisgICAgICAgICAgICAgICAgPDwgU0JfTUVNT1JZX1BBR0VfU0laRSA8PCAiLCBBY3R1YWw6ICIgPDwgYnl0ZXNfdG9fY29weSwKKyAgICAgICAgICAgIG51bGxwdHJ9OworICB9CiAKICAgU2JNZW1vcnlDb3B5KG1lbW9yeSwgc3VtX2Z1bmN0aW9uX3N0YXJ0LCBieXRlc190b19jb3B5KTsKICAgU2JNZW1vcnlGbHVzaChtZW1vcnksIGJ5dGVzX3RvX2NvcHkpOwpAQCAtMTc1LDEyICsxOTMsMTAwIEBACiAgIFN1bUZ1bmN0aW9uIG1hcHBlZF9mdW5jdGlvbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8U3VtRnVuY3Rpb24+KAogICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4obWVtb3J5KSArIHN1bV9mdW5jdGlvbl9vZmZzZXQpOwogCi0gIEVYUEVDVF9FUSgoKm9yaWdpbmFsX2Z1bmN0aW9uKSgxLCAzKSwgKCptYXBwZWRfZnVuY3Rpb24pKDEsIDMpKTsKLSAgRVhQRUNUX0VRKCgqb3JpZ2luYWxfZnVuY3Rpb24pKDEwLCAtNSksICgqbWFwcGVkX2Z1bmN0aW9uKSgxMCwgLTUpKTsKLQotICBFWFBFQ1RfVFJVRShTYk1lbW9yeVVubWFwKG1lbW9yeSwga1NpemUpKTsKKyAgcmV0dXJuIHs6OnRlc3Rpbmc6OkFzc2VydGlvblN1Y2Nlc3MoKSwgbWFwcGVkX2Z1bmN0aW9ufTsKIH0KKworI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX01FTU9SWV9QUk9URUNUX0FQSV9WRVJTSU9OCisvLyBDb2JhbHQgY2FuIG5vdCBtYXAgZXhlY3V0YWJsZSBtZW1vcnkuIElmIGV4ZWN1dGFibGUgbWVtb3J5IGlzIG5lZWRlZCwgbWFwCisvLyBub24tZXhlY3V0YWJsZSBtZW1vcnkgZmlyc3QgYW5kIHVzZSBTYk1lbW9yeVByb3RlY3QgdG8gY2hhbmdlIG1lbW9yeSBhY2Nlc3NzCisvLyB0byBleGVjdXRhYmxlLgorVEVTVChTYk1lbW9yeU1hcFRlc3QsIENhbk5vdERpcmVjdGx5TWFwTWVtb3J5V2l0aEV4ZWNGbGFnKSB7CisgIFNiTWVtb3J5TWFwRmxhZ3MgZXhlY19mbGFnc1tdID0geworICAgIFNiTWVtb3J5TWFwRmxhZ3Moa1NiTWVtb3J5TWFwUHJvdGVjdEV4ZWMpLAorICAgIFNiTWVtb3J5TWFwRmxhZ3Moa1NiTWVtb3J5TWFwUHJvdGVjdFJlYWQgfCBrU2JNZW1vcnlNYXBQcm90ZWN0RXhlYyksCisgICAgU2JNZW1vcnlNYXBGbGFncyhrU2JNZW1vcnlNYXBQcm90ZWN0V3JpdGUgfCBrU2JNZW1vcnlNYXBQcm90ZWN0RXhlYyksCisgICAgU2JNZW1vcnlNYXBGbGFncyhrU2JNZW1vcnlNYXBQcm90ZWN0V3JpdGUgfCBrU2JNZW1vcnlNYXBQcm90ZWN0V3JpdGUgfAorICAgICAgICAgICAgICAgICAgICAga1NiTWVtb3J5TWFwUHJvdGVjdEV4ZWMpLAorICB9OworICBmb3IgKGF1dG8gZXhlY19mbGFnIDogZXhlY19mbGFncykgeworICAgIHZvaWQqIG1lbW9yeSA9IFNiTWVtb3J5TWFwKGtTaXplLCBleGVjX2ZsYWcsICJ0ZXN0Iik7CisgICAgQVNTRVJUX0VRKGtGYWlsZWQsIG1lbW9yeSk7CisgICAgRVhQRUNUX0ZBTFNFKFNiTWVtb3J5VW5tYXAobWVtb3J5LCAwKSk7CisgIH0KK30KKyNlbmRpZiAgLy8gU0JfTUVNT1JZX1BST1RFQ1RfQVBJX1ZFUlNJT04KICNlbmRpZiAgLy8gU0JfQ0FOKE1BUF9FWEVDVVRBQkxFX01FTU9SWSkKKworI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX01FTU9SWV9QUk9URUNUX0FQSV9WRVJTSU9OCitURVNUKFNiTWVtb3J5TWFwVGVzdCwgQ2FuQ2hhbmdlTWVtb3J5UHJvdGVjdGlvbikgeworICBTYk1lbW9yeU1hcEZsYWdzIGFsbF9mcm9tX2ZsYWdzW10gPSB7CisgICAgU2JNZW1vcnlNYXBGbGFncygwKSwKKyAgICBTYk1lbW9yeU1hcEZsYWdzKGtTYk1lbW9yeU1hcFByb3RlY3RSZWFkKSwKKyAgICBTYk1lbW9yeU1hcEZsYWdzKGtTYk1lbW9yeU1hcFByb3RlY3RXcml0ZSksCisgICAgU2JNZW1vcnlNYXBGbGFncyhrU2JNZW1vcnlNYXBQcm90ZWN0UmVhZCB8IGtTYk1lbW9yeU1hcFByb3RlY3RXcml0ZSksCisgIH07CisgIFNiTWVtb3J5TWFwRmxhZ3MgYWxsX3RvX2ZsYWdzW10gPSB7CisgICAgU2JNZW1vcnlNYXBGbGFncygwKSwKKyAgICBTYk1lbW9yeU1hcEZsYWdzKGtTYk1lbW9yeU1hcFByb3RlY3RSZWFkKSwKKyAgICBTYk1lbW9yeU1hcEZsYWdzKGtTYk1lbW9yeU1hcFByb3RlY3RXcml0ZSksCisgICAgU2JNZW1vcnlNYXBGbGFncyhrU2JNZW1vcnlNYXBQcm90ZWN0UmVhZCB8IGtTYk1lbW9yeU1hcFByb3RlY3RXcml0ZSksCisjaWYgU0JfQ0FOKE1BUF9FWEVDVVRBQkxFX01FTU9SWSkKKyAgICBTYk1lbW9yeU1hcEZsYWdzKGtTYk1lbW9yeU1hcFByb3RlY3RFeGVjKSwKKyAgICBTYk1lbW9yeU1hcEZsYWdzKGtTYk1lbW9yeU1hcFByb3RlY3RSZWFkIHwga1NiTWVtb3J5TWFwUHJvdGVjdEV4ZWMpLAorI2VuZGlmCisgIH07CisKKyAgZm9yIChTYk1lbW9yeU1hcEZsYWdzIGZyb21fZmxhZ3MgOiBhbGxfZnJvbV9mbGFncykgeworICAgIGZvciAoU2JNZW1vcnlNYXBGbGFncyB0b19mbGFncyA6IGFsbF90b19mbGFncykgeworICAgICAgdm9pZCogbWVtb3J5ID0gU2JNZW1vcnlNYXAoa1NpemUsIGZyb21fZmxhZ3MsICJ0ZXN0Iik7CisgICAgICAvLyBJZiB0aGUgcGxhdGZvcm0gZG9lcyBub3Qgc3VwcG9ydCBhIHBhcnRpY3VsYXIgcHJvdGVjdGlvbiBmbGFncworICAgICAgLy8gY29uZmlndXJhdGlvbiBpbiB0aGUgZmlyc3QgcGxhY2UsIHRoZW4ganVzdCBnaXZlIHRoZW0gYSBwYXNzLCBrbm93aW5nCisgICAgICAvLyB0aGF0IHRoYXQgZmVhdHVyZSB3aWxsIGJlIHRlc3RlZCBlbHNld2hlcmUuCisgICAgICBpZiAobWVtb3J5ID09IFNCX01FTU9SWV9NQVBfRkFJTEVEKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisjaWYgU0JfQ0FOKE1BUF9FWEVDVVRBQkxFX01FTU9SWSkKKyAgICAgIC8vIFdlIGNhbiBvbmx5IHRlc3QgdGhlIGFiaWxpdHkgdG8gZXhlY3V0ZSBtZW1vcnkgYWZ0ZXIgY2hhbmdpbmcKKyAgICAgIC8vIHByb3RlY3Rpb25zIGlmIHdlIGhhdmUgd3JpdGUgcGVybWlzc2lvbnMgZWl0aGVyIG5vdyBvciB0aGVuLCBiZWNhdXNlCisgICAgICAvLyB3ZSBoYXZlIHRvIGFjdHVhbGx5IHB1dCBhIHZhbGlkIGZ1bmN0aW9uIGludG8gdGhlIG1hcHBlZCBtZW1vcnkuCisgICAgICBTdW1GdW5jdGlvbiBtYXBwZWRfZnVuY3Rpb24gPSBudWxscHRyOworICAgICAgaWYgKGZyb21fZmxhZ3MgJiBrU2JNZW1vcnlNYXBQcm90ZWN0V3JpdGUpIHsKKyAgICAgICAgYXV0byBjb3B5X3N1bV9mdW5jdGlvbl9yZXN1bHQgPSBDb3B5U3VtRnVuY3Rpb25JbnRvTWVtb3J5KG1lbW9yeSk7CisgICAgICAgIEFTU0VSVF9UUlVFKGNvcHlfc3VtX2Z1bmN0aW9uX3Jlc3VsdC5maXJzdCk7CisgICAgICAgIG1hcHBlZF9mdW5jdGlvbiA9IGNvcHlfc3VtX2Z1bmN0aW9uX3Jlc3VsdC5zZWNvbmQ7CisgICAgICB9CisjZW5kaWYKKworICAgICAgaWYgKCFTYk1lbW9yeVByb3RlY3QobWVtb3J5LCBrU2l6ZSwgdG9fZmxhZ3MpKSB7CisgICAgICAgIEVYUEVDVF9UUlVFKFNiTWVtb3J5VW5tYXAobWVtb3J5LCBrU2l6ZSkpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworI2lmIFNCX0NBTihNQVBfRVhFQ1VUQUJMRV9NRU1PUlkpCisgICAgICBpZiAoKHRvX2ZsYWdzICYga1NiTWVtb3J5TWFwUHJvdGVjdEV4ZWMpICYmIG1hcHBlZF9mdW5jdGlvbiAhPSBudWxscHRyKSB7CisgICAgICAgIEVYUEVDVF9FUShTdW0oMHhjMGJhMTc4LCAweGJhZGYwMGQpLAorICAgICAgICAgICAgICAgICAgbWFwcGVkX2Z1bmN0aW9uKDB4YzBiYTE3OCwgMHhiYWRmMDBkKSk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgaWYgKHRvX2ZsYWdzICYga1NiTWVtb3J5TWFwUHJvdGVjdFJlYWQpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrU2l6ZTsgaSsrKSB7CisgICAgICAgICAgdm9sYXRpbGUgdWludDhfdCBmb3JjZV9yZWFkID0gc3RhdGljX2Nhc3Q8dWludDhfdCo+KG1lbW9yeSlbaV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICh0b19mbGFncyAmIGtTYk1lbW9yeU1hcFByb3RlY3RXcml0ZSkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtTaXplOyBpKyspIHsKKyAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90Kj4obWVtb3J5KVtpXSA9IDB4ZmY7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgRVhQRUNUX1RSVUUoU2JNZW1vcnlVbm1hcChtZW1vcnksIGtTaXplKSk7CisgICAgfQorICB9Cit9CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX01FTU9SWV9QUk9URUNUX0FQSV9WRVJTSU9OCisKICNlbmRpZiAgLy8gU0JfSEFTKE1NQVApCiAKIH0gIC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9ucGxiL25wbGIuZ3lwIGIvc3JjL3N0YXJib2FyZC9ucGxiL25wbGIuZ3lwCmluZGV4IGM5NTE2NzAuLmRhZDY4MTMgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvbnBsYi9ucGxiLmd5cAorKysgYi9zcmMvc3RhcmJvYXJkL25wbGIvbnBsYi5neXAKQEAgLTk5LDYgKzk5LDExIEBACiAgICAgICAgICdkb3VibGVfZmxvb3JfdGVzdC5jYycsCiAgICAgICAgICdkb3VibGVfaXNfZmluaXRlX3Rlc3QuY2MnLAogICAgICAgICAnZG91YmxlX2lzX25hbl90ZXN0LmNjJywKKyAgICAgICAgJ2RybV9jcmVhdGVfc3lzdGVtX3Rlc3QuY2MnLAorICAgICAgICAnZHJtX2hlbHBlcnMuY2MnLAorICAgICAgICAnZHJtX2hlbHBlcnMuaCcsCisgICAgICAgICdkcm1faXNfc2VydmVyX2NlcnRpZmljYXRlX3VwZGF0YWJsZV90ZXN0LmNjJywKKyAgICAgICAgJ2RybV91cGRhdGVfc2VydmVyX2NlcnRpZmljYXRlX3Rlc3QuY2MnLAogICAgICAgICAnZmlsZV9jYW5fb3Blbl90ZXN0LmNjJywKICAgICAgICAgJ2ZpbGVfY2xvc2VfdGVzdC5jYycsCiAgICAgICAgICdmaWxlX2dldF9pbmZvX3Rlc3QuY2MnLApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9ucGxiL3BsYXllcl9jcmVhdGVfdGVzdC5jYyBiL3NyYy9zdGFyYm9hcmQvbnBsYi9wbGF5ZXJfY3JlYXRlX3Rlc3QuY2MKaW5kZXggZDlkMDlhZS4uNTRlN2ZmYyAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9ucGxiL3BsYXllcl9jcmVhdGVfdGVzdC5jYworKysgYi9zcmMvc3RhcmJvYXJkL25wbGIvcGxheWVyX2NyZWF0ZV90ZXN0LmNjCkBAIC0zNSw3ICszNSwyOSBAQAogICBGYWtlR3JhcGhpY3NDb250ZXh0UHJvdmlkZXIgZmFrZV9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyXzsKIH07CiAKLVRFU1RfRihTYlBsYXllclRlc3QsIFN1bm55RGF5KSB7Cit2b2lkIER1bW15RGVhbGxvY2F0ZVNhbXBsZUZ1bmMoU2JQbGF5ZXIgcGxheWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogc2FtcGxlX2J1ZmZlcikge30KKwordm9pZCBEdW1teURlY29kZXJTdGF0dXNGdW5jKFNiUGxheWVyIHBsYXllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiTWVkaWFUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JQbGF5ZXJEZWNvZGVyU3RhdGUgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpY2tldCkge30KKwordm9pZCBEdW1teVN0YXR1c0Z1bmMoU2JQbGF5ZXIgcGxheWVyLAorICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgIFNiUGxheWVyU3RhdGUgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICBpbnQgdGlja2V0KSB7fQorCisjaWYgU0JfSEFTKFBMQVlFUl9FUlJPUl9NRVNTQUdFKQordm9pZCBEdW1teUVycm9yRnVuYyhTYlBsYXllciBwbGF5ZXIsCisgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgIFNiUGxheWVyRXJyb3IgZXJyb3IsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1lc3NhZ2UpIHt9CisjZW5kaWYgIC8vIFNCX0hBUyhQTEFZRVJfRVJST1JfTUVTU0FHRSkKKworU2JNZWRpYUF1ZGlvSGVhZGVyIEdldERlZmF1bHRBdWRpb0hlYWRlcigpIHsKICAgU2JNZWRpYUF1ZGlvSGVhZGVyIGF1ZGlvX2hlYWRlcjsKIAogICBhdWRpb19oZWFkZXIuZm9ybWF0X3RhZyA9IDB4ZmY7CkBAIC00OCw2ICs3MCwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faGVhZGVyLm51bWJlcl9vZl9jaGFubmVscyAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19oZWFkZXIuYml0c19wZXJfc2FtcGxlIC8gODsKIAorICByZXR1cm4gYXVkaW9faGVhZGVyOworfQorCitURVNUX0YoU2JQbGF5ZXJUZXN0LCBTdW5ueURheSkgeworICBTYk1lZGlhQXVkaW9IZWFkZXIgYXVkaW9faGVhZGVyID0gR2V0RGVmYXVsdEF1ZGlvSGVhZGVyKCk7CiAgIFNiTWVkaWFWaWRlb0NvZGVjIGtWaWRlb0NvZGVjID0ga1NiTWVkaWFWaWRlb0NvZGVjSDI2NDsKICAgU2JEcm1TeXN0ZW0ga0RybVN5c3RlbSA9IGtTYkRybVN5c3RlbUludmFsaWQ7CiAKQEAgLTY2LDExICs5MywxMiBAQAogI2lmIFNCX0FQSV9WRVJTSU9OIDwgU0JfREVQUkVDQVRFX1NCX01FRElBX1RJTUVfQVBJX1ZFUlNJT04KICAgICAgICAgU0JfUExBWUVSX05PX0RVUkFUSU9OLAogI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA8IFNCX0RFUFJFQ0FURV9TQl9NRURJQV9USU1FX0FQSV9WRVJTSU9OCi0gICAgICAgIGtTYkRybVN5c3RlbUludmFsaWQsICZhdWRpb19oZWFkZXIsIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAgIGtTYkRybVN5c3RlbUludmFsaWQsICZhdWRpb19oZWFkZXIsIER1bW15RGVhbGxvY2F0ZVNhbXBsZUZ1bmMsCisgICAgICAgIER1bW15RGVjb2RlclN0YXR1c0Z1bmMsIER1bW15U3RhdHVzRnVuYywKICNpZiBTQl9IQVMoUExBWUVSX0VSUk9SX01FU1NBR0UpCi0gICAgICAgIE5VTEwsCisgICAgICAgIER1bW15RXJyb3JGdW5jLAogI2VuZGlmICAvLyBTQl9IQVMoUExBWUVSX0VSUk9SX01FU1NBR0UpCi0gICAgICAgIE5VTEwsIG91dHB1dF9tb2RlLAorICAgICAgICBOVUxMIC8qIGNvbnRleHQgKi8sIG91dHB1dF9tb2RlLAogICAgICAgICBmYWtlX2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXJfLmRlY29kZXJfdGFyZ2V0X3Byb3ZpZGVyKCkpOwogICAgIEVYUEVDVF9UUlVFKFNiUGxheWVySXNWYWxpZChwbGF5ZXIpKTsKIApAQCAtODIsNiArMTEwLDk5IEBACiAgIH0KIH0KIAorI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX05VTExfQ0FMTEJBQ0tTX0lOVkFMSURfUkVUVVJOX0FQSV9WRVJTSU9OCitURVNUX0YoU2JQbGF5ZXJUZXN0LCBOdWxsQ2FsbGJhY2tzKSB7CisgIFNiTWVkaWFBdWRpb0hlYWRlciBhdWRpb19oZWFkZXIgPSBHZXREZWZhdWx0QXVkaW9IZWFkZXIoKTsKKyAgU2JNZWRpYVZpZGVvQ29kZWMga1ZpZGVvQ29kZWMgPSBrU2JNZWRpYVZpZGVvQ29kZWNIMjY0OworICBTYkRybVN5c3RlbSBrRHJtU3lzdGVtID0ga1NiRHJtU3lzdGVtSW52YWxpZDsKKworICBTYlBsYXllck91dHB1dE1vZGUgb3V0cHV0X21vZGVzW10gPSB7a1NiUGxheWVyT3V0cHV0TW9kZURlY29kZVRvVGV4dHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtTYlBsYXllck91dHB1dE1vZGVQdW5jaE91dH07CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBTQl9BUlJBWV9TSVpFX0lOVChvdXRwdXRfbW9kZXMpOyArK2kpIHsKKyAgICBTYlBsYXllck91dHB1dE1vZGUgb3V0cHV0X21vZGUgPSBvdXRwdXRfbW9kZXNbaV07CisgICAgaWYgKCFTYlBsYXllck91dHB1dE1vZGVTdXBwb3J0ZWQob3V0cHV0X21vZGUsIGtWaWRlb0NvZGVjLCBrRHJtU3lzdGVtKSkgeworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgeworICAgICAgU2JQbGF5ZXIgcGxheWVyID0gU2JQbGF5ZXJDcmVhdGUoCisgICAgICAgICAgZmFrZV9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyXy53aW5kb3coKSwga1NiTWVkaWFWaWRlb0NvZGVjSDI2NCwKKyAgICAgICAgICBrU2JNZWRpYUF1ZGlvQ29kZWNBYWMsCisjaWYgU0JfQVBJX1ZFUlNJT04gPCBTQl9ERVBSRUNBVEVfU0JfTUVESUFfVElNRV9BUElfVkVSU0lPTgorICAgICAgICAgIFNCX1BMQVlFUl9OT19EVVJBVElPTiwKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPCBTQl9ERVBSRUNBVEVfU0JfTUVESUFfVElNRV9BUElfVkVSU0lPTgorICAgICAgICAgIGtTYkRybVN5c3RlbUludmFsaWQsICZhdWRpb19oZWFkZXIsIE5VTEwgLyogZGVhbGxvY2F0ZV9zYW1wbGVfZnVuYyAqLywKKyAgICAgICAgICBEdW1teURlY29kZXJTdGF0dXNGdW5jLCBEdW1teVN0YXR1c0Z1bmMsCisjaWYgU0JfSEFTKFBMQVlFUl9FUlJPUl9NRVNTQUdFKQorICAgICAgICAgIER1bW15RXJyb3JGdW5jLAorI2VuZGlmICAvLyBTQl9IQVMoUExBWUVSX0VSUk9SX01FU1NBR0UpCisgICAgICAgICAgTlVMTCAvKiBjb250ZXh0ICovLCBvdXRwdXRfbW9kZSwKKyAgICAgICAgICBmYWtlX2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXJfLmRlY29kZXJfdGFyZ2V0X3Byb3ZpZGVyKCkpOworICAgICAgRVhQRUNUX0ZBTFNFKFNiUGxheWVySXNWYWxpZChwbGF5ZXIpKTsKKworICAgICAgU2JQbGF5ZXJEZXN0cm95KHBsYXllcik7CisgICAgfQorCisgICAgeworICAgICAgU2JQbGF5ZXIgcGxheWVyID0gU2JQbGF5ZXJDcmVhdGUoCisgICAgICAgICAgZmFrZV9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyXy53aW5kb3coKSwga1NiTWVkaWFWaWRlb0NvZGVjSDI2NCwKKyAgICAgICAgICBrU2JNZWRpYUF1ZGlvQ29kZWNBYWMsCisjaWYgU0JfQVBJX1ZFUlNJT04gPCBTQl9ERVBSRUNBVEVfU0JfTUVESUFfVElNRV9BUElfVkVSU0lPTgorICAgICAgICAgIFNCX1BMQVlFUl9OT19EVVJBVElPTiwKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPCBTQl9ERVBSRUNBVEVfU0JfTUVESUFfVElNRV9BUElfVkVSU0lPTgorICAgICAgICAgIGtTYkRybVN5c3RlbUludmFsaWQsICZhdWRpb19oZWFkZXIsIER1bW15RGVhbGxvY2F0ZVNhbXBsZUZ1bmMsCisgICAgICAgICAgTlVMTCAvKiBkZWNvZGVyX3N0YXR1c19mdW5jICovLCBEdW1teVN0YXR1c0Z1bmMsCisjaWYgU0JfSEFTKFBMQVlFUl9FUlJPUl9NRVNTQUdFKQorICAgICAgICAgIER1bW15RXJyb3JGdW5jLAorI2VuZGlmICAvLyBTQl9IQVMoUExBWUVSX0VSUk9SX01FU1NBR0UpCisgICAgICAgICAgTlVMTCAvKiBjb250ZXh0ICovLCBvdXRwdXRfbW9kZSwKKyAgICAgICAgICBmYWtlX2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXJfLmRlY29kZXJfdGFyZ2V0X3Byb3ZpZGVyKCkpOworICAgICAgRVhQRUNUX0ZBTFNFKFNiUGxheWVySXNWYWxpZChwbGF5ZXIpKTsKKworICAgICAgU2JQbGF5ZXJEZXN0cm95KHBsYXllcik7CisgICAgfQorCisgICAgeworICAgICAgU2JQbGF5ZXIgcGxheWVyID0gU2JQbGF5ZXJDcmVhdGUoCisgICAgICAgICAgZmFrZV9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyXy53aW5kb3coKSwga1NiTWVkaWFWaWRlb0NvZGVjSDI2NCwKKyAgICAgICAgICBrU2JNZWRpYUF1ZGlvQ29kZWNBYWMsCisjaWYgU0JfQVBJX1ZFUlNJT04gPCBTQl9ERVBSRUNBVEVfU0JfTUVESUFfVElNRV9BUElfVkVSU0lPTgorICAgICAgICAgIFNCX1BMQVlFUl9OT19EVVJBVElPTiwKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPCBTQl9ERVBSRUNBVEVfU0JfTUVESUFfVElNRV9BUElfVkVSU0lPTgorICAgICAgICAgIGtTYkRybVN5c3RlbUludmFsaWQsICZhdWRpb19oZWFkZXIsIER1bW15RGVhbGxvY2F0ZVNhbXBsZUZ1bmMsCisgICAgICAgICAgRHVtbXlEZWNvZGVyU3RhdHVzRnVuYywgTlVMTCAvKnN0YXR1c19mdW5jICovLAorI2lmIFNCX0hBUyhQTEFZRVJfRVJST1JfTUVTU0FHRSkKKyAgICAgICAgICBEdW1teUVycm9yRnVuYywKKyNlbmRpZiAgLy8gU0JfSEFTKFBMQVlFUl9FUlJPUl9NRVNTQUdFKQorICAgICAgICAgIE5VTEwgLyogY29udGV4dCAqLywgb3V0cHV0X21vZGUsCisgICAgICAgICAgZmFrZV9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyXy5kZWNvZGVyX3RhcmdldF9wcm92aWRlcigpKTsKKyAgICAgIEVYUEVDVF9GQUxTRShTYlBsYXllcklzVmFsaWQocGxheWVyKSk7CisKKyAgICAgIFNiUGxheWVyRGVzdHJveShwbGF5ZXIpOworICAgIH0KKworI2lmIFNCX0hBUyhQTEFZRVJfRVJST1JfTUVTU0FHRSkKKyAgICB7CisgICAgICBTYlBsYXllciBwbGF5ZXIgPSBTYlBsYXllckNyZWF0ZSgKKyAgICAgICAgICBmYWtlX2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXJfLndpbmRvdygpLCBrU2JNZWRpYVZpZGVvQ29kZWNIMjY0LAorICAgICAgICAgIGtTYk1lZGlhQXVkaW9Db2RlY0FhYywKKyNpZiBTQl9BUElfVkVSU0lPTiA8IFNCX0RFUFJFQ0FURV9TQl9NRURJQV9USU1FX0FQSV9WRVJTSU9OCisgICAgICAgICAgU0JfUExBWUVSX05PX0RVUkFUSU9OLAorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA8IFNCX0RFUFJFQ0FURV9TQl9NRURJQV9USU1FX0FQSV9WRVJTSU9OCisgICAgICAgICAga1NiRHJtU3lzdGVtSW52YWxpZCwgJmF1ZGlvX2hlYWRlciwgRHVtbXlEZWFsbG9jYXRlU2FtcGxlRnVuYywKKyAgICAgICAgICBEdW1teURlY29kZXJTdGF0dXNGdW5jLCBEdW1teVN0YXR1c0Z1bmMsIE5VTEwgLyplcnJvcl9mdW5jICovLAorICAgICAgICAgIE5VTEwgLyogY29udGV4dCAqLywgb3V0cHV0X21vZGUsCisgICAgICAgICAgZmFrZV9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyXy5kZWNvZGVyX3RhcmdldF9wcm92aWRlcigpKTsKKyAgICAgIEVYUEVDVF9GQUxTRShTYlBsYXllcklzVmFsaWQocGxheWVyKSk7CisKKyAgICAgIFNiUGxheWVyRGVzdHJveShwbGF5ZXIpOworICAgIH0KKyNlbmRpZiAgLy8gU0JfSEFTKFBMQVlFUl9FUlJPUl9NRVNTQUdFKQorICB9Cit9CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX05VTExfQ0FMTEJBQ0tTX0lOVkFMSURfUkVUVVJOX0FQSV9WRVJTSU9OCisKICNpZiBTQl9IQVMoQVVESU9MRVNTX1ZJREVPKQogVEVTVF9GKFNiUGxheWVyVGVzdCwgQXVkaW9sZXNzKSB7CiAgIFNiTWVkaWFWaWRlb0NvZGVjIGtWaWRlb0NvZGVjID0ga1NiTWVkaWFWaWRlb0NvZGVjSDI2NDsKQEAgLTk3LDE2ICsyMTgsMTcgQEAKICAgICB9CiAKICAgICBTYlBsYXllciBwbGF5ZXIgPSBTYlBsYXllckNyZWF0ZSgKLSAgICAgICAgZmFrZV9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyXy53aW5kb3coKSwga1NiTWVkaWFWaWRlb0NvZGVjSDI2NCwKKyAgICAgICAgZmFrZV9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyXy53aW5kb3coKSwga1ZpZGVvQ29kZWMsCiAgICAgICAgIGtTYk1lZGlhQXVkaW9Db2RlY05vbmUsCiAjaWYgU0JfQVBJX1ZFUlNJT04gPCBTQl9ERVBSRUNBVEVfU0JfTUVESUFfVElNRV9BUElfVkVSU0lPTgogICAgICAgICBTQl9QTEFZRVJfTk9fRFVSQVRJT04sCiAjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OIDwgU0JfREVQUkVDQVRFX1NCX01FRElBX1RJTUVfQVBJX1ZFUlNJT04KLSAgICAgICAga1NiRHJtU3lzdGVtSW52YWxpZCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKyAgICAgICAga1NiRHJtU3lzdGVtSW52YWxpZCwgTlVMTCAvKiBhdWRpb19oZWFkZXIgKi8sIER1bW15RGVhbGxvY2F0ZVNhbXBsZUZ1bmMsCisgICAgICAgIER1bW15RGVjb2RlclN0YXR1c0Z1bmMsIER1bW15U3RhdHVzRnVuYywKICNpZiBTQl9IQVMoUExBWUVSX0VSUk9SX01FU1NBR0UpCi0gICAgICAgIE5VTEwsCisgICAgICAgIER1bW15RXJyb3JGdW5jLAogI2VuZGlmICAvLyBTQl9IQVMoUExBWUVSX0VSUk9SX01FU1NBR0UpCi0gICAgICAgIE5VTEwsIG91dHB1dF9tb2RlLAorICAgICAgICBOVUxMIC8qIGNvbnRleHQgKi8sIG91dHB1dF9tb2RlLAogICAgICAgICBmYWtlX2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXJfLmRlY29kZXJfdGFyZ2V0X3Byb3ZpZGVyKCkpOwogICAgIEVYUEVDVF9UUlVFKFNiUGxheWVySXNWYWxpZChwbGF5ZXIpKTsKIApAQCAtMTE5LDIwICsyNDEsNDkgQEAKIH0KICNlbmRpZiAgLy8gU0JfSEFTKEFVRElPTEVTU19WSURFTykKIAorI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX0FVRElPX09OTFlfVklERU9fQVBJX1ZFUlNJT04KK1RFU1RfRihTYlBsYXllclRlc3QsIEF1ZGlvT25seSkgeworICBTYk1lZGlhQXVkaW9IZWFkZXIgYXVkaW9faGVhZGVyID0gR2V0RGVmYXVsdEF1ZGlvSGVhZGVyKCk7CisgIFNiTWVkaWFBdWRpb0NvZGVjIGtBdWRpb0NvZGVjID0ga1NiTWVkaWFBdWRpb0NvZGVjQWFjOworICBTYk1lZGlhVmlkZW9Db2RlYyBrVmlkZW9Db2RlYyA9IGtTYk1lZGlhVmlkZW9Db2RlY0gyNjQ7CisgIFNiRHJtU3lzdGVtIGtEcm1TeXN0ZW0gPSBrU2JEcm1TeXN0ZW1JbnZhbGlkOworCisgIFNiUGxheWVyT3V0cHV0TW9kZSBvdXRwdXRfbW9kZXNbXSA9IHtrU2JQbGF5ZXJPdXRwdXRNb2RlRGVjb2RlVG9UZXh0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1NiUGxheWVyT3V0cHV0TW9kZVB1bmNoT3V0fTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IFNCX0FSUkFZX1NJWkVfSU5UKG91dHB1dF9tb2Rlcyk7ICsraSkgeworICAgIFNiUGxheWVyT3V0cHV0TW9kZSBvdXRwdXRfbW9kZSA9IG91dHB1dF9tb2Rlc1tpXTsKKyAgICBpZiAoIVNiUGxheWVyT3V0cHV0TW9kZVN1cHBvcnRlZChvdXRwdXRfbW9kZSwga1ZpZGVvQ29kZWMsIGtEcm1TeXN0ZW0pKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBTYlBsYXllciBwbGF5ZXIgPSBTYlBsYXllckNyZWF0ZSgKKyAgICAgICAgZmFrZV9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyXy53aW5kb3coKSwga1NiTWVkaWFWaWRlb0NvZGVjTm9uZSwKKyAgICAgICAga0F1ZGlvQ29kZWMsCisjaWYgU0JfQVBJX1ZFUlNJT04gPCBTQl9ERVBSRUNBVEVfU0JfTUVESUFfVElNRV9BUElfVkVSU0lPTgorICAgICAgICBTQl9QTEFZRVJfTk9fRFVSQVRJT04sCisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OIDwgU0JfREVQUkVDQVRFX1NCX01FRElBX1RJTUVfQVBJX1ZFUlNJT04KKyAgICAgICAga1NiRHJtU3lzdGVtSW52YWxpZCwgJmF1ZGlvX2hlYWRlciwgRHVtbXlEZWFsbG9jYXRlU2FtcGxlRnVuYywKKyAgICAgICAgRHVtbXlEZWNvZGVyU3RhdHVzRnVuYywgRHVtbXlTdGF0dXNGdW5jLAorI2lmIFNCX0hBUyhQTEFZRVJfRVJST1JfTUVTU0FHRSkKKyAgICAgICAgRHVtbXlFcnJvckZ1bmMsCisjZW5kaWYgIC8vIFNCX0hBUyhQTEFZRVJfRVJST1JfTUVTU0FHRSkKKyAgICAgICAgTlVMTCAvKiBjb250ZXh0ICovLCBvdXRwdXRfbW9kZSwKKyAgICAgICAgZmFrZV9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyXy5kZWNvZGVyX3RhcmdldF9wcm92aWRlcigpKTsKKyAgICBFWFBFQ1RfVFJVRShTYlBsYXllcklzVmFsaWQocGxheWVyKSk7CisKKyAgICBpZiAob3V0cHV0X21vZGUgPT0ga1NiUGxheWVyT3V0cHV0TW9kZURlY29kZVRvVGV4dHVyZSkgeworICAgICAgU2JEZWNvZGVUYXJnZXQgY3VycmVudF9mcmFtZSA9IFNiUGxheWVyR2V0Q3VycmVudEZyYW1lKHBsYXllcik7CisgICAgfQorCisgICAgU2JQbGF5ZXJEZXN0cm95KHBsYXllcik7CisgIH0KK30KKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfQVVESU9fT05MWV9WSURFT19BUElfVkVSU0lPTgorCiAjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfTVVMVElfUExBWUVSX0FQSV9WRVJTSU9OCiBURVNUX0YoU2JQbGF5ZXJUZXN0LCBNdWx0aVBsYXllcikgewotICBTYk1lZGlhQXVkaW9IZWFkZXIgYXVkaW9faGVhZGVyOwotCi0gIGF1ZGlvX2hlYWRlci5mb3JtYXRfdGFnID0gMHhmZjsKLSAgYXVkaW9faGVhZGVyLm51bWJlcl9vZl9jaGFubmVscyA9IDI7Ci0gIGF1ZGlvX2hlYWRlci5zYW1wbGVzX3Blcl9zZWNvbmQgPSAyMjA1MDsKLSAgYXVkaW9faGVhZGVyLmJsb2NrX2FsaWdubWVudCA9IDQ7Ci0gIGF1ZGlvX2hlYWRlci5iaXRzX3Blcl9zYW1wbGUgPSAzMjsKLSAgYXVkaW9faGVhZGVyLmF1ZGlvX3NwZWNpZmljX2NvbmZpZ19zaXplID0gMDsKLSAgYXVkaW9faGVhZGVyLmF2ZXJhZ2VfYnl0ZXNfcGVyX3NlY29uZCA9IGF1ZGlvX2hlYWRlci5zYW1wbGVzX3Blcl9zZWNvbmQgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faGVhZGVyLm51bWJlcl9vZl9jaGFubmVscyAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19oZWFkZXIuYml0c19wZXJfc2FtcGxlIC8gODsKLQorICBTYk1lZGlhQXVkaW9IZWFkZXIgYXVkaW9faGVhZGVyID0gR2V0RGVmYXVsdEF1ZGlvSGVhZGVyKCk7CiAgIFNiRHJtU3lzdGVtIGtEcm1TeXN0ZW0gPSBrU2JEcm1TeXN0ZW1JbnZhbGlkOwogCiAgIGNvbnN0ZXhwciBTYlBsYXllck91dHB1dE1vZGUga091dHB1dE1vZGVzW10gPSB7CkBAIC0xOTIsOCArMzQzLDEwIEBACiAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgU0JfQVJSQVlfU0laRV9JTlQoa1ZpZGVvQ29kZWNzKTsgKytsKSB7CiAgICAgICAgICAgY3JlYXRlZF9wbGF5ZXJzLnB1c2hfYmFjayhTYlBsYXllckNyZWF0ZSgKICAgICAgICAgICAgICAgZmFrZV9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyXy53aW5kb3coKSwga1ZpZGVvQ29kZWNzW2xdLAotICAgICAgICAgICAgICBrQXVkaW9Db2RlY3Nba10sIGtTYkRybVN5c3RlbUludmFsaWQsICZhdWRpb19oZWFkZXIsIE5VTEwsIE5VTEwsCi0gICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIGtPdXRwdXRNb2Rlc1tqXSwKKyAgICAgICAgICAgICAga0F1ZGlvQ29kZWNzW2tdLCBrU2JEcm1TeXN0ZW1JbnZhbGlkLCAmYXVkaW9faGVhZGVyLAorICAgICAgICAgICAgICBEdW1teURlYWxsb2NhdGVTYW1wbGVGdW5jLCBEdW1teURlY29kZXJTdGF0dXNGdW5jLAorICAgICAgICAgICAgICBEdW1teVN0YXR1c0Z1bmMsIER1bW15RXJyb3JGdW5jLCBOVUxMIC8qIGNvbnRleHQgKi8sCisgICAgICAgICAgICAgIGtPdXRwdXRNb2Rlc1tqXSwKICAgICAgICAgICAgICAgZmFrZV9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyXy5kZWNvZGVyX3RhcmdldF9wcm92aWRlcigpKSk7CiAgICAgICAgICAgaWYgKCFTYlBsYXllcklzVmFsaWQoY3JlYXRlZF9wbGF5ZXJzLmJhY2soKSkpIHsKICAgICAgICAgICAgIGNyZWF0ZWRfcGxheWVycy5wb3BfYmFjaygpOwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9ucGxiL3BsYXllcl9jcmVhdGVfd2l0aF91cmxfdGVzdC5jYyBiL3NyYy9zdGFyYm9hcmQvbnBsYi9wbGF5ZXJfY3JlYXRlX3dpdGhfdXJsX3Rlc3QuY2MKaW5kZXggM2RlNTdkMC4uZDVjOWU2NSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9ucGxiL3BsYXllcl9jcmVhdGVfd2l0aF91cmxfdGVzdC5jYworKysgYi9zcmMvc3RhcmJvYXJkL25wbGIvcGxheWVyX2NyZWF0ZV93aXRoX3VybF90ZXN0LmNjCkBAIC0yNCw2ICsyNCwyNSBAQAogCiAjaWYgU0JfSEFTKFBMQVlFUl9XSVRIX1VSTCkKIAorY29uc3QgY2hhciBrUGxheWVyVXJsW10gPSAiYWJvdXQ6YmxhbmsiOworCit2b2lkIER1bW15UGxheWVyU3RhdHVzRnVuYyhTYlBsYXllciBwbGF5ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JQbGF5ZXJTdGF0ZSBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aWNrZXQpIHt9CisKK3ZvaWQgRHVtbXlFbmNyeXB0ZWRNZWRpYUluaXRhRGF0YUVuY291bnRlcmVkRnVuYygKKyAgICBTYlBsYXllciBwbGF5ZXIsCisgICAgdm9pZCogY29udGV4dCwKKyAgICBjb25zdCBjaGFyKiBpbml0X2RhdGFfdHlwZSwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBpbml0X2RhdGEsCisgICAgdW5zaWduZWQgaW50IGluaXRfZGF0YV9sZW5ndGgpIHt9CisKK3ZvaWQgRHVtbXlQbGF5ZXJFcnJvckZ1bmMoU2JQbGF5ZXIgcGxheWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBTYlBsYXllckVycm9yIGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtZXNzYWdlKSB7fQorCiBURVNUKFNiUGxheWVyVXJsVGVzdCwgU3VubnlEYXkpIHsKICAgU2JXaW5kb3dPcHRpb25zIHdpbmRvd19vcHRpb25zOwogICBTYldpbmRvd1NldERlZmF1bHRPcHRpb25zKCZ3aW5kb3dfb3B0aW9ucyk7CkBAIC0zOSwxMiArNTgsMTMgQEAKICAgICBpZiAoIVNiUGxheWVyT3V0cHV0TW9kZVN1cHBvcnRlZFdpdGhVcmwob3V0cHV0X21vZGUpKSB7CiAgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgY2hhciB1cmxbXSA9ICJhYm91dDpibGFuayI7Ci0gICAgU2JQbGF5ZXIgcGxheWVyID0gU2JQbGF5ZXJDcmVhdGVXaXRoVXJsKHVybCwgd2luZG93LAorICAgIFNiUGxheWVyIHBsYXllciA9IFNiUGxheWVyQ3JlYXRlV2l0aFVybCgKKyAgICAgICAga1BsYXllclVybCwgd2luZG93LAogI2lmIFNCX0FQSV9WRVJTSU9OIDwgU0JfREVQUkVDQVRFX1NCX01FRElBX1RJTUVfQVBJX1ZFUlNJT04KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0JfUExBWUVSX05PX0RVUkFUSU9OLAorICAgICAgICBTQl9QTEFZRVJfTk9fRFVSQVRJT04sCiAjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OIDwgU0JfREVQUkVDQVRFX1NCX01FRElBX1RJTUVfQVBJX1ZFUlNJT04KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgICAgIER1bW15UGxheWVyU3RhdHVzRnVuYywgRHVtbXlFbmNyeXB0ZWRNZWRpYUluaXRhRGF0YUVuY291bnRlcmVkRnVuYywKKyAgICAgICAgRHVtbXlQbGF5ZXJFcnJvckZ1bmMsIE5VTEwpOwogCiAgICAgRVhQRUNUX1RSVUUoU2JQbGF5ZXJJc1ZhbGlkKHBsYXllcikpOwogCkBAIC01OCw2ICs3OCw1NCBAQAogICBTYldpbmRvd0Rlc3Ryb3kod2luZG93KTsKIH0KIAorI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX05VTExfQ0FMTEJBQ0tTX0lOVkFMSURfUkVUVVJOX0FQSV9WRVJTSU9OCitURVNUKFNiUGxheWVyVXJsVGVzdCwgTnVsbENhbGxiYWNrcykgeworICBTYldpbmRvd09wdGlvbnMgd2luZG93X29wdGlvbnM7CisgIFNiV2luZG93U2V0RGVmYXVsdE9wdGlvbnMoJndpbmRvd19vcHRpb25zKTsKKworICBTYldpbmRvdyB3aW5kb3cgPSBTYldpbmRvd0NyZWF0ZSgmd2luZG93X29wdGlvbnMpOworICBFWFBFQ1RfVFJVRShTYldpbmRvd0lzVmFsaWQod2luZG93KSk7CisKKyAgU2JNZWRpYVZpZGVvQ29kZWMga1ZpZGVvQ29kZWMgPSBrU2JNZWRpYVZpZGVvQ29kZWNIMjY0OworICBTYkRybVN5c3RlbSBrRHJtU3lzdGVtID0ga1NiRHJtU3lzdGVtSW52YWxpZDsKKworICBTYlBsYXllck91dHB1dE1vZGUgb3V0cHV0X21vZGVzW10gPSB7a1NiUGxheWVyT3V0cHV0TW9kZURlY29kZVRvVGV4dHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtTYlBsYXllck91dHB1dE1vZGVQdW5jaE91dH07CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBTQl9BUlJBWV9TSVpFX0lOVChvdXRwdXRfbW9kZXMpOyArK2kpIHsKKyAgICBTYlBsYXllck91dHB1dE1vZGUgb3V0cHV0X21vZGUgPSBvdXRwdXRfbW9kZXNbaV07CisgICAgaWYgKCFTYlBsYXllck91dHB1dE1vZGVTdXBwb3J0ZWRXaXRoVXJsKG91dHB1dF9tb2RlKSkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIHsKKyAgICAgIFNiUGxheWVyIHBsYXllciA9CisgICAgICAgICAgU2JQbGF5ZXJDcmVhdGVXaXRoVXJsKGtQbGF5ZXJVcmwsIHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAvKiBwbGF5ZXJfc3RhdHVzX2Z1bmMgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIER1bW15RW5jcnlwdGVkTWVkaWFJbml0YURhdGFFbmNvdW50ZXJlZEZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIER1bW15UGxheWVyRXJyb3JGdW5jLCBOVUxMIC8qIGNvbnRleHQgKi8pOworICAgICAgRVhQRUNUX0ZBTFNFKFNiUGxheWVySXNWYWxpZChwbGF5ZXIpKTsKKyAgICAgIFNiUGxheWVyRGVzdHJveShwbGF5ZXIpOworICAgIH0KKyAgICB7CisgICAgICBTYlBsYXllciBwbGF5ZXIgPSBTYlBsYXllckNyZWF0ZVdpdGhVcmwoCisgICAgICAgICAga1BsYXllclVybCwgd2luZG93LCBEdW1teVBsYXllclN0YXR1c0Z1bmMsCisgICAgICAgICAgTlVMTCAvKiBlbmNyeXB0ZWRfbWVkaWFfaW5pdGFfZGF0YV9lbmNvdW50ZXJlZF9mdW5jICovLAorICAgICAgICAgIER1bW15UGxheWVyRXJyb3JGdW5jLCBOVUxMIC8qIGNvbnRleHQgKi8pOworICAgICAgRVhQRUNUX0ZBTFNFKFNiUGxheWVySXNWYWxpZChwbGF5ZXIpKTsKKyAgICAgIFNiUGxheWVyRGVzdHJveShwbGF5ZXIpOworICAgIH0KKyAgICB7CisgICAgICBTYlBsYXllciBwbGF5ZXIgPSBTYlBsYXllckNyZWF0ZVdpdGhVcmwoCisgICAgICAgICAga1BsYXllclVybCwgd2luZG93LCBEdW1teVBsYXllclN0YXR1c0Z1bmMsCisgICAgICAgICAgRHVtbXlFbmNyeXB0ZWRNZWRpYUluaXRhRGF0YUVuY291bnRlcmVkRnVuYywKKyAgICAgICAgICBOVUxMIC8qIHBsYXllcl9lcnJvcl9mdW5jICovLCBOVUxMIC8qIGNvbnRleHQgKi8pOworICAgICAgRVhQRUNUX0ZBTFNFKFNiUGxheWVySXNWYWxpZChwbGF5ZXIpKTsKKyAgICAgIFNiUGxheWVyRGVzdHJveShwbGF5ZXIpOworICAgIH0KKyAgfQorfQorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9OVUxMX0NBTExCQUNLU19JTlZBTElEX1JFVFVSTl9BUElfVkVSU0lPTgorCiAjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfTVVMVElfUExBWUVSX0FQSV9WRVJTSU9OCiBURVNUKFNiUGxheWVyVXJsVGVzdCwgTXVsdGlQbGF5ZXIpIHsKICAgU2JXaW5kb3dPcHRpb25zIHdpbmRvd19vcHRpb25zOwpAQCAtNzYsMTAgKzE0NCw5IEBACiAgICAgfQogICAgIGNvbnN0IGludCBrTWF4UGxheWVycyA9IDE2OwogICAgIHN0ZDo6dmVjdG9yPFNiUGxheWVyPiBjcmVhdGVkX3BsYXllcnM7Ci0gICAgY2hhciB1cmxbXSA9ICJhYm91dDpibGFuayI7CiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBrTWF4UGxheWVyczsgKytqKSB7CiAgICAgICBjcmVhdGVkX3BsYXllcnMucHVzaF9iYWNrKAotICAgICAgICAgIFNiUGxheWVyQ3JlYXRlV2l0aFVybCh1cmwsIHdpbmRvdywgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCkpOworICAgICAgICAgIFNiUGxheWVyQ3JlYXRlV2l0aFVybChrUGxheWVyVXJsLCB3aW5kb3csIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpKTsKICAgICAgIGlmICghU2JQbGF5ZXJJc1ZhbGlkKGNyZWF0ZWRfcGxheWVyc1tqXSkpIHsKICAgICAgICAgY3JlYXRlZF9wbGF5ZXJzLnBvcF9iYWNrKCk7CiAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9ucGxiL3NvY2tldF9zZW5kX3RvX3Rlc3QuY2MgYi9zcmMvc3RhcmJvYXJkL25wbGIvc29ja2V0X3NlbmRfdG9fdGVzdC5jYwppbmRleCBlNGZhZTAyLi5lODRmMGU3IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL25wbGIvc29ja2V0X3NlbmRfdG9fdGVzdC5jYworKysgYi9zcmMvc3RhcmJvYXJkL25wbGIvc29ja2V0X3NlbmRfdG9fdGVzdC5jYwpAQCAtMTc5LDcgKzE3OSw3IEBACiAgIGludCBrTnVtUmV0cmllcyA9IDEwMDA7CiAgIGZvciAoaW50IGkgPSAwOyBpIDwga051bVJldHJpZXM7ICsraSkgewogICAgIGNoYXIgYnVmZltrQ2h1bmtTaXplXSA9IHt9OwotICAgIFNiVGhyZWFkU2xlZXAoMSk7CisgICAgU2JUaHJlYWRTbGVlcChrU2JUaW1lTWlsbGlzZWNvbmQpOwogICAgIGludCByZXN1bHQgPSB0cmlvLT5jbGllbnRfc29ja2V0LT5TZW5kVG8oYnVmZiwgc2l6ZW9mKGJ1ZmYpLCBOVUxMKTsKIAogICAgIGlmIChyZXN1bHQgPCAwKSB7CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3BsYXllci5oIGIvc3JjL3N0YXJib2FyZC9wbGF5ZXIuaAppbmRleCA0NzI0MWRkLi41NGRkODNlIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3BsYXllci5oCisrKyBiL3NyYy9zdGFyYm9hcmQvcGxheWVyLmgKQEAgLTMxNCwxOSArMzE0LDIyIEBACiAKICNpZiBTQl9IQVMoUExBWUVSX1dJVEhfVVJMKQogCi0vLyBDcmVhdGVzIGEgVVJMLWJhc2VkIFNiUGxheWVyIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgb24gfHdpbmRvd3wgZm9yCi0vLyB0aGUgc3BlY2lmaWVkIFVSTCB8dXJsfCwgYWNxdWlyaW5nIGFsbCByZXNvdXJjZXMgbmVlZGVkIHRvIG9wZXJhdGUKLS8vIGl0LCBhbmQgcmV0dXJuaW5nIGFuIG9wYXF1ZSBoYW5kbGUgdG8gaXQuIFRoZSBleHBlY3RhdGlvbiBpcyB0aGF0IGEKLS8vIG5ldyBwbGF5ZXIgd2lsbCBiZSBjcmVhdGVkIGFuZCBkZXN0cm95ZWQgZm9yIGV2ZXJ5IHBsYXliYWNrLgorLy8gQ3JlYXRlcyBhIFVSTC1iYXNlZCBTYlBsYXllciB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIG9uIHx3aW5kb3d8IGZvciB0aGUKKy8vIHNwZWNpZmllZCBVUkwgfHVybHwsIGFjcXVpcmluZyBhbGwgcmVzb3VyY2VzIG5lZWRlZCB0byBvcGVyYXRlIGl0LCBhbmQKKy8vIHJldHVybmluZyBhbiBvcGFxdWUgaGFuZGxlIHRvIGl0LiBUaGUgZXhwZWN0YXRpb24gaXMgdGhhdCBhIG5ldyBwbGF5ZXIgd2lsbAorLy8gYmUgY3JlYXRlZCBhbmQgZGVzdHJveWVkIGZvciBldmVyeSBwbGF5YmFjay4KIC8vCi0vLyBJbiBtYW55IHdheXMgdGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIFNiUGxheWVyQ3JlYXRlLCBidXQgaXQgaXMKLS8vIG1pc3NpbmcgdGhlIGlucHV0IGFyZ3VtZW50cyByZWxhdGVkIHRvIHRoZSBjb25maWd1cmF0aW9uIGFuZCBmb3JtYXQKLS8vIG9mIHRoZSBhdWRpbyBhbmQgdmlkZW8gc3RyZWFtLCBhcyB3ZWxsIGFzIHRoZSBEUk0gc3lzdGVtLiBUaGUgRFJNCi0vLyBzeXN0ZW0gZm9yIGEgcGxheWVyIGNyZWF0ZWQgd2l0aCBTYlBsYXllckNyZWF0ZVdpdGhVcmwgY2FuIGJlIHNldAotLy8gYWZ0ZXIgY3JlYXRpb24gdXNpbmcgU2JQbGF5ZXJTZXREcm1TeXN0ZW0uIEJlY2F1c2UgdGhlIERSTSBzeXN0ZW0KLS8vIGlzIG5vdCBhdmFpbGFibGUgYXQgdGhlIHRpbWUgb2YgU2JQbGF5ZXJDcmVhdGVXaXRoVXJsLCBpdCB0YWtlcyBpbgotLy8gYSBjYWxsYmFjaywgfGVuY3J5cHRlZF9tZWRpYV9pbml0X2RhdGFfZW5jb3VudGVyZWRfY2J8LCB3aGljaCBpcwotLy8gcnVuIHdoZW4gZW5jcnlwdGVkIG1lZGlhIGluaXRpYWwgZGF0YSBpcyBlbmNvdW50ZXJlZC4KKy8vIEluIG1hbnkgd2F5cyB0aGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gU2JQbGF5ZXJDcmVhdGUsIGJ1dCBpdCBpcyBtaXNzaW5nCisvLyB0aGUgaW5wdXQgYXJndW1lbnRzIHJlbGF0ZWQgdG8gdGhlIGNvbmZpZ3VyYXRpb24gYW5kIGZvcm1hdCBvZiB0aGUgYXVkaW8gYW5kCisvLyB2aWRlbyBzdHJlYW0sIGFzIHdlbGwgYXMgdGhlIERSTSBzeXN0ZW0uIFRoZSBEUk0gc3lzdGVtIGZvciBhIHBsYXllciBjcmVhdGVkCisvLyB3aXRoIFNiUGxheWVyQ3JlYXRlV2l0aFVybCBjYW4gYmUgc2V0IGFmdGVyIGNyZWF0aW9uIHVzaW5nCisvLyBTYlBsYXllclNldERybVN5c3RlbS4gQmVjYXVzZSB0aGUgRFJNIHN5c3RlbSBpcyBub3QgYXZhaWxhYmxlIGF0IHRoZSB0aW1lIG9mCisvLyBTYlBsYXllckNyZWF0ZVdpdGhVcmwsIGl0IHRha2VzIGluIGEgY2FsbGJhY2ssCisvLyB8ZW5jcnlwdGVkX21lZGlhX2luaXRfZGF0YV9lbmNvdW50ZXJlZF9jYnwsIHdoaWNoIGlzIHJ1biB3aGVuIGVuY3J5cHRlZCBtZWRpYQorLy8gaW5pdGlhbCBkYXRhIGlzIGVuY291bnRlcmVkLgorI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX05VTExfQ0FMTEJBQ0tTX0lOVkFMSURfUkVUVVJOX0FQSV9WRVJTSU9OCisvLyBJZiB0aGUgY2FsbGJhY2sgaXMgfE5VTEx8LCB0aGVuIHxrU2JQbGF5ZXJJbnZhbGlkfCBtdXN0IGJlIHJldHVybmVkLgorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9OVUxMX0NBTExCQUNLU19JTlZBTElEX1JFVFVSTl9BUElfVkVSU0lPTgogU0JfRVhQT1JUIFNiUGxheWVyCiBTYlBsYXllckNyZWF0ZVdpdGhVcmwoY29uc3QgY2hhciogdXJsLAogICAgICAgICAgICAgICAgICAgICAgIFNiV2luZG93IHdpbmRvdywKQEAgLTM3OCw2ICszODEsMTAgQEAKIC8vIHx2aWRlb19jb2RlY3w6IFRoZSB2aWRlbyBjb2RlYyB1c2VkIGZvciB0aGUgcGxheWVyLiBJZiB8dmlkZW9fY29kZWN8IGlzCiAvLyAgIHxrU2JNZWRpYVZpZGVvQ29kZWNOb25lfCwgdGhlIHBsYXllciBpcyBhbiBhdWRpby1vbmx5IHBsYXllci4gSWYKIC8vICAgfHZpZGVvX2NvZGVjfCBpcyBhbnkgb3RoZXIgdmFsdWUsIHRoZSBwbGF5ZXIgaXMgYW4gYXVkaW8vdmlkZW8gZGVjb2Rlci4KKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9BVURJT19PTkxZX1ZJREVPX0FQSV9WRVJTSU9OCisvLyAgIFRoaXMgY2FuIGJlIHNldCB0byB8a1NiTWVkaWFWaWRlb0NvZGVjTm9uZXwgdG8gcGxheSBhIHZpZGVvIHdpdGggb25seSBhbgorLy8gICBhdWRpbyB0cmFjay4KKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfQVVESU9fT05MWV9WSURFT19BUElfVkVSU0lPTgogLy8KIC8vIHxhdWRpb19jb2RlY3w6IFRoZSBhdWRpbyBjb2RlYyB1c2VkIGZvciB0aGUgcGxheWVyLiBUaGUgdmFsdWUgc2hvdWxkIG5ldmVyCiAvLyAgIGJlIHxrU2JNZWRpYUF1ZGlvQ29kZWNOb25lfC4gSW4gYWRkaXRpb24sIHRoZSBjYWxsZXIgbXVzdCBwcm92aWRlIGEKQEAgLTQ0NSw2ICs0NTIsMTIgQEAKIC8vICAgcHJvdmlkZXIgbWF5IG5vdCBhbHdheXMgYmUgbmVlZGVkIGJ5IHRoZSBwbGF5ZXIsIGJ1dCBpZiBpdCBpcyBuZWVkZWQsIGFuZAogLy8gICB0aGUgcHJvdmlkZXIgaXMgbm90IGdpdmVuLCB0aGUgcGxheWVyIHdpbGwgZmFpbCBieSByZXR1cm5pbmcKIC8vICAgfGtTYlBsYXllckludmFsaWR8LgorLy8KKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9OVUxMX0NBTExCQUNLU19JTlZBTElEX1JFVFVSTl9BUElfVkVSU0lPTgorLy8gSWYgfE5VTEx8IGlzIHBhc3NlZCB0byBhbnkgb2YgdGhlIGNhbGxiYWNrcyAofHNhbXBsZV9kZWFsbG9jYXRvcl9mdW5jfCwKKy8vIHxkZWNvZGVyX3N0YXR1c19mdW5jfCwgfHBsYXllcl9zdGF0dXNfZnVuY3wsIG9yIHxwbGF5ZXJfZXJyb3JfZnVuY3wgaWYgaXQKKy8vIGFwcGxpZXMpLCB0aGVuIHxrU2JQbGF5ZXJJbnZhbGlkfCBtdXN0IGJlIHJldHVybmVkLgorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9OVUxMX0NBTExCQUNLU19JTlZBTElEX1JFVFVSTl9BUElfVkVSU0lPTgogU0JfRVhQT1JUIFNiUGxheWVyCiBTYlBsYXllckNyZWF0ZShTYldpbmRvdyB3aW5kb3csCiAgICAgICAgICAgICAgICBTYk1lZGlhVmlkZW9Db2RlYyB2aWRlb19jb2RlYywKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvcmFzcGkvMi9za2lhL2d5cF9jb25maWd1cmF0aW9uLnB5IGIvc3JjL3N0YXJib2FyZC9yYXNwaS8yL3NraWEvZ3lwX2NvbmZpZ3VyYXRpb24ucHkKaW5kZXggMGUyMDM2Yi4uNjYwZDk2NyAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9yYXNwaS8yL3NraWEvZ3lwX2NvbmZpZ3VyYXRpb24ucHkKKysrIGIvc3JjL3N0YXJib2FyZC9yYXNwaS8yL3NraWEvZ3lwX2NvbmZpZ3VyYXRpb24ucHkKQEAgLTEzLDggKzEzLDExIEBACiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogIiIiU3RhcmJvYXJkIFJhc3BiZXJyeSBQaSAyIHBsYXRmb3JtIGNvbmZpZ3VyYXRpb24gZm9yIGd5cF9jb2JhbHQuIiIiCiAKLWZyb20gc3RhcmJvYXJkLnJhc3BpLnNoYXJlZC5neXBfY29uZmlndXJhdGlvbiBpbXBvcnQgUmFzcGlQbGF0Zm9ybUNvbmZpZworaW1wb3J0IGltcG9ydGxpYgogCisjIHB5bGludDogZGlzYWJsZT1pbnZhbGlkLW5hbWUKK1Jhc3BpMlBsYXRmb3JtQ29uZmlnID0gaW1wb3J0bGliLmltcG9ydF9tb2R1bGUoCisgICAgJ3N0YXJib2FyZC5yYXNwaS4yLmd5cF9jb25maWd1cmF0aW9uJykuUmFzcGkyUGxhdGZvcm1Db25maWcKIAogZGVmIENyZWF0ZVBsYXRmb3JtQ29uZmlnKCk6Ci0gIHJldHVybiBSYXNwaVBsYXRmb3JtQ29uZmlnKCdyYXNwaS0yLXNraWEnKQorICByZXR1cm4gUmFzcGkyUGxhdGZvcm1Db25maWcoJ3Jhc3BpLTItc2tpYScpCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9hdWRpb19zaW5rX2lzX2F1ZGlvX3NhbXBsZV90eXBlX3N1cHBvcnRlZC5jYyBiL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL2F1ZGlvX3NpbmtfaXNfYXVkaW9fc2FtcGxlX3R5cGVfc3VwcG9ydGVkLmNjCmluZGV4IGY1MDI2YjguLjhlZTczZDkgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL2F1ZGlvX3NpbmtfaXNfYXVkaW9fc2FtcGxlX3R5cGVfc3VwcG9ydGVkLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL2F1ZGlvX3NpbmtfaXNfYXVkaW9fc2FtcGxlX3R5cGVfc3VwcG9ydGVkLmNjCkBAIC0xNiw1ICsxNiw1IEBACiAKIGJvb2wgU2JBdWRpb1NpbmtJc0F1ZGlvU2FtcGxlVHlwZVN1cHBvcnRlZCgKICAgICBTYk1lZGlhQXVkaW9TYW1wbGVUeXBlIGF1ZGlvX3NhbXBsZV90eXBlKSB7Ci0gIHJldHVybiBhdWRpb19zYW1wbGVfdHlwZSA9PSBrU2JNZWRpYUF1ZGlvU2FtcGxlVHlwZUludDE2OworICByZXR1cm4gYXVkaW9fc2FtcGxlX3R5cGUgPT0ga1NiTWVkaWFBdWRpb1NhbXBsZVR5cGVGbG9hdDMyOwogfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9yYXNwaS9zaGFyZWQvY29uZmlndXJhdGlvbl9wdWJsaWMuaCBiL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL2NvbmZpZ3VyYXRpb25fcHVibGljLmgKaW5kZXggNGYwNzU0My4uMDQwYjg0MSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9yYXNwaS9zaGFyZWQvY29uZmlndXJhdGlvbl9wdWJsaWMuaAorKysgYi9zcmMvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9jb25maWd1cmF0aW9uX3B1YmxpYy5oCkBAIC0xOCw3ICsxOCw3IEBACiAjZGVmaW5lIFNUQVJCT0FSRF9SQVNQSV9TSEFSRURfQ09ORklHVVJBVElPTl9QVUJMSUNfSF8KIAogLy8gVGhlIEFQSSB2ZXJzaW9uIGltcGxlbWVudGVkIGJ5IHRoaXMgcGxhdGZvcm0uCi0jZGVmaW5lIFNCX0FQSV9WRVJTSU9OIDYKKyNkZWZpbmUgU0JfQVBJX1ZFUlNJT04gU0JfRVhQRVJJTUVOVEFMX0FQSV9WRVJTSU9OCiAKIC8vIC0tLSBTeXN0ZW0gSGVhZGVyIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC00OSwxNSArNDksNiBAQAogLy8gV2hldGhlciB0aGUgY3VycmVudCBwbGF0Zm9ybSBwcm92aWRlcyB0aGUgc3RhbmRhcmQgaGVhZGVyIGZsb2F0LmguCiAjZGVmaW5lIFNCX0hBU19GTE9BVF9IIDEKIAotLy8gV2hldGhlciB0aGUgY3VycmVudCBwbGF0Zm9ybSBoYXMgbWljcm9waG9uZSBzdXBwb3J0ZWQuCi0jZGVmaW5lIFNCX0hBU19NSUNST1BIT05FIDAKLQotLy8gV2hldGhlciB0aGUgY3VycmVudCBwbGF0Zm9ybSBoYXMgc3BlZWNoIHJlY29nbml6ZXIuCi0jZGVmaW5lIFNCX0hBU19TUEVFQ0hfUkVDT0dOSVpFUiAwCi0KLS8vIFdoZXRoZXIgdGhlIGN1cnJlbnQgcGxhdGZvcm0gaGFzIHNwZWVjaCBzeW50aGVzaXMuCi0jZGVmaW5lIFNCX0hBU19TUEVFQ0hfU1lOVEhFU0lTIDAKLQogLy8gVHlwZSBkZXRlY3Rpb24gZm9yIHdjaGFyX3QuCiAjaWYgZGVmaW5lZChfX1dDSEFSX01BWF9fKSAmJiBcCiAgICAgKF9fV0NIQVJfTUFYX18gPT0gMHg3ZmZmZmZmZiB8fCBfX1dDSEFSX01BWF9fID09IDB4ZmZmZmZmZmYpCkBAIC03NSwxNCArNjYsNiBAQAogI2RlZmluZSBTQl9JU19XQ0hBUl9UX1NJR05FRCAxCiAjZW5kaWYKIAotLy8gLS0tIEFyY2hpdGVjdHVyZSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIE9uIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgUmFzcGJpYW4sIHJlYWwgdGltZSB0aHJlYWQgc2NoZWR1bGluZyBzZWVtcyB0byBiZQotLy8gYnJva2VuIGluIHRoYXQgaGlnaGVyIHByaW9yaXR5IHRocmVhZHMgZG8gbm90IGFsd2F5cyBoYXZlIHByaW9yaXR5IG92ZXIgbG93ZXIKLS8vIHByaW9yaXR5IHRocmVhZHMuICBJdCBsb29rcyBsaWtlIHRoZSB0aHJlYWQgY3JlYXRlZCBsYXN0IHdpbGwgYWx3YXlzIGhhdmUgdGhlCi0vLyBoaWdoZXN0IHByaW9yaXR5LgotI2RlZmluZSBTQl9IQVNfVEhSRUFEX1BSSU9SSVRZX1NVUFBPUlQgMQotCiAvLyAtLS0gQXR0cmlidXRlIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogLy8gVGhlIHBsYXRmb3JtJ3MgYW5ub3RhdGlvbiBmb3IgZm9yY2luZyBhIEMgZnVuY3Rpb24gdG8gYmUgaW5saW5lZC4KQEAgLTE3OSw1NCArMTYyLDYgQEAKIC8vIFRoZSBzdHJpbmcgZm9ybSBvZiBTQl9QQVRIX1NFUF9DSEFSLgogI2RlZmluZSBTQl9QQVRIX1NFUF9TVFJJTkcgIjoiCiAKLS8vIC0tLSBNZW1vcnkgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBUaGUgbWVtb3J5IHBhZ2Ugc2l6ZSwgd2hpY2ggY29udHJvbHMgdGhlIHNpemUgb2YgY2h1bmtzIG9uIG1lbW9yeSB0aGF0Ci0vLyBhbGxvY2F0b3JzIGRlYWwgd2l0aCwgYW5kIHRoZSBhbGlnbm1lbnQgb2YgdGhvc2UgY2h1bmtzLiBUaGlzIGRvZXNuJ3QgaGF2ZSB0bwotLy8gYmUgdGhlIGhhcmR3YXJlLWRlZmluZWQgcGh5c2ljYWwgcGFnZSBzaXplLCBidXQgaXQgc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YKLS8vIGl0LgotI2RlZmluZSBTQl9NRU1PUllfUEFHRV9TSVpFIDQwOTYKLQotLy8gV2hldGhlciB0aGlzIHBsYXRmb3JtIGhhcyBhbmQgc2hvdWxkIHVzZSBhbiBNTUFQIGZ1bmN0aW9uIHRvIG1hcCBwaHlzaWNhbAotLy8gbWVtb3J5IHRvIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UuCi0jZGVmaW5lIFNCX0hBU19NTUFQIDEKLQotLy8gV2hldGhlciB0aGlzIHBsYXRmb3JtIGNhbiBtYXAgZXhlY3V0YWJsZSBtZW1vcnkuIEltcGxpZXMgU0JfSEFTX01NQVAuIFRoaXMgaXMKLS8vIHJlcXVpcmVkIGZvciBwbGF0Zm9ybXMgdGhhdCB3YW50IHRvIEpJVC4KLSNkZWZpbmUgU0JfQ0FOX01BUF9FWEVDVVRBQkxFX01FTU9SWSAxCi0KLS8vIFdoZXRoZXIgdGhpcyBwbGF0Zm9ybSBoYXMgYW5kIHNob3VsZCB1c2UgYW4gZ3Jvd2FibGUgaGVhcCAoZS5nLiB3aXRoIHNicmsoKSkKLS8vIHRvIG1hcCBwaHlzaWNhbCBtZW1vcnkgdG8gdGhlIHZpcnR1YWwgYWRkcmVzcyBzcGFjZS4KLSNkZWZpbmUgU0JfSEFTX1ZJUlRVQUxfUkVHSU9OUyAwCi0KLS8vIFNwZWNpZmllcyB0aGUgYWxpZ25tZW50IGZvciBJTyBCdWZmZXJzLCBpbiBieXRlcy4gU29tZSBsb3ctbGV2ZWwgbmV0d29yayBBUElzCi0vLyBtYXkgcmVxdWlyZSBidWZmZXJzIHRvIGhhdmUgYSBzcGVjaWZpYyBhbGlnbm1lbnQsIGFuZCB0aGlzIGlzIHRoZSBwbGFjZSB0bwotLy8gc3BlY2lmeSB0aGF0LgotI2RlZmluZSBTQl9ORVRXT1JLX0lPX0JVRkZFUl9BTElHTk1FTlQgMTYKLQotLy8gRGV0ZXJtaW5lcyB0aGUgYWxpZ25tZW50IHRoYXQgYWxsb2NhdGlvbnMgc2hvdWxkIGhhdmUgb24gdGhpcyBwbGF0Zm9ybS4KLSNkZWZpbmUgU0JfTUFMTE9DX0FMSUdOTUVOVCAoKHNpemVfdCkxNlUpCi0KLS8vIERldGVybWluZXMgdGhlIHRocmVzaGhvbGQgb2YgYWxsb2NhdGlvbiBzaXplIHRoYXQgc2hvdWxkIGJlIGRvbmUgd2l0aCBtbWFwCi0vLyAoaWYgYXZhaWxhYmxlKSwgcmF0aGVyIHRoYW4gYWxsb2NhdGVkIHdpdGhpbiB0aGUgY29yZSBoZWFwLgotI2RlZmluZSBTQl9ERUZBVUxUX01NQVBfVEhSRVNIT0xEICgoc2l6ZV90KSgyNTYgKiAxMDI0VSkpCi0KLS8vIERlZmluZXMgdGhlIHBhdGggd2hlcmUgbWVtb3J5IGRlYnVnZ2luZyBsb2dzIHNob3VsZCBiZSB3cml0dGVuIHRvLgotI2RlZmluZSBTQl9NRU1PUllfTE9HX1BBVEggIi90bXAvc3RhcmJvYXJkIgotCi0vLyAtLS0gVGhyZWFkIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gRGVmaW5lcyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2ltdWx0YW5lb3VzIHRocmVhZHMgZm9yIHRoaXMgcGxhdGZvcm0uIFNvbWUKLS8vIHBsYXRmb3JtcyByZXF1aXJlIHNoYXJpbmcgdGhyZWFkIGhhbmRsZXMgd2l0aCBvdGhlciBraW5kcyBvZiBzeXN0ZW0gaGFuZGxlcywKLS8vIGxpa2UgbXV0ZXhlcywgc28gd2Ugd2FudCB0byBrZWVwIHRoaXMgbWFuYWdhYmxlLgotI2RlZmluZSBTQl9NQVhfVEhSRUFEUyA5MAotCi0vLyBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGhyZWFkIGxvY2FsIHN0b3JhZ2Uga2V5cyBzdXBwb3J0ZWQgYnkgdGhpcyBwbGF0Zm9ybS4KLSNkZWZpbmUgU0JfTUFYX1RIUkVBRF9MT0NBTF9LRVlTIDUxMgotCi0vLyBUaGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIG5hbWUgZm9yIGEgdGhyZWFkLCBpbmNsdWRpbmcgdGhlIE5VTEwtdGVybWluYXRvci4KLSNkZWZpbmUgU0JfTUFYX1RIUkVBRF9OQU1FX0xFTkdUSCAxNjsKLQogLy8gLS0tIEdyYXBoaWNzIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIC8vIFNwZWNpZmllcyB3aGV0aGVyIHRoaXMgcGxhdGZvcm0gc3VwcG9ydHMgYSBwZXJmb3JtYW50IGFjY2VsZXJhdGVkIGJsaXR0ZXIKQEAgLTI1Myw4ICsxODgsMjUgQEAKIC8vIHNjZW5lIGhhc24ndCBjaGFuZ2VkIGFyZSBlbmFibGVkLgogI2RlZmluZSBTQl9NVVNUX0ZSRVFVRU5UTFlfRkxJUF9ESVNQTEFZX0JVRkZFUiAwCiAKKy8vIC0tLSBJL08gQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBXaGV0aGVyIHRoZSBjdXJyZW50IHBsYXRmb3JtIGhhcyBtaWNyb3Bob25lIHN1cHBvcnRlZC4KKyNkZWZpbmUgU0JfSEFTX01JQ1JPUEhPTkUgMAorCisvLyBXaGV0aGVyIHRoZSBjdXJyZW50IHBsYXRmb3JtIGltcGxlbWVudHMgdGhlIG9uIHNjcmVlbiBrZXlib2FyZCBpbnRlcmZhY2UuCisjZGVmaW5lIFNCX0hBU19PTl9TQ1JFRU5fS0VZQk9BUkQgMAorCisvLyBXaGV0aGVyIHRoZSBjdXJyZW50IHBsYXRmb3JtIGhhcyBzcGVlY2ggcmVjb2duaXplci4KKyNkZWZpbmUgU0JfSEFTX1NQRUVDSF9SRUNPR05JWkVSIDAKKworLy8gV2hldGhlciB0aGUgY3VycmVudCBwbGF0Zm9ybSBoYXMgc3BlZWNoIHN5bnRoZXNpcy4KKyNkZWZpbmUgU0JfSEFTX1NQRUVDSF9TWU5USEVTSVMgMAorCiAvLyAtLS0gTWVkaWEgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAorLy8gV2hldGhlciB0aGUgY3VycmVudCBwbGF0Zm9ybSB1c2VzIGEgbWVkaWEgcGxheWVyIHRoYXQgcmVsaWVzIG9uIGEgVVJMLgorI2RlZmluZSBTQl9IQVNfUExBWUVSX1dJVEhfVVJMIDAKKwogLy8gVGhlIG1heGltdW0gYXVkaW8gYml0cmF0ZSB0aGUgcGxhdGZvcm0gY2FuIGRlY29kZS4gIFRoZSBmb2xsb3dpbmcgdmFsdWUKIC8vIGVxdWFscyB0byA1TSBieXRlcyBwZXIgc2Vjb25kcyB3aGljaCBpcyBtb3JlIHRoYW4gZW5vdWdoIGZvciBjb21wcmVzc2VkCiAvLyBhdWRpby4KQEAgLTMwNSw2ICsyNTcsNDggQEAKIC8vIHZhbHVlIGxlYWRzIHRvIG1vcmUgc3RhYmxlIGZwcyBidXQgYWxzbyBjYXVzZXMgdGhlIGFwcCB0byB1c2UgbW9yZSBtZW1vcnkuCiAjZGVmaW5lIFNCX01FRElBX01BWElNVU1fVklERU9fRlJBTUVTIDEyCiAKKy8vIC0tLSBNZW1vcnkgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBUaGUgbWVtb3J5IHBhZ2Ugc2l6ZSwgd2hpY2ggY29udHJvbHMgdGhlIHNpemUgb2YgY2h1bmtzIG9uIG1lbW9yeSB0aGF0CisvLyBhbGxvY2F0b3JzIGRlYWwgd2l0aCwgYW5kIHRoZSBhbGlnbm1lbnQgb2YgdGhvc2UgY2h1bmtzLiBUaGlzIGRvZXNuJ3QgaGF2ZSB0bworLy8gYmUgdGhlIGhhcmR3YXJlLWRlZmluZWQgcGh5c2ljYWwgcGFnZSBzaXplLCBidXQgaXQgc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YKKy8vIGl0LgorI2RlZmluZSBTQl9NRU1PUllfUEFHRV9TSVpFIDQwOTYKKworLy8gV2hldGhlciB0aGlzIHBsYXRmb3JtIGhhcyBhbmQgc2hvdWxkIHVzZSBhbiBNTUFQIGZ1bmN0aW9uIHRvIG1hcCBwaHlzaWNhbAorLy8gbWVtb3J5IHRvIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UuCisjZGVmaW5lIFNCX0hBU19NTUFQIDEKKworLy8gV2hldGhlciB0aGlzIHBsYXRmb3JtIGNhbiBtYXAgZXhlY3V0YWJsZSBtZW1vcnkuIEltcGxpZXMgU0JfSEFTX01NQVAuIFRoaXMgaXMKKy8vIHJlcXVpcmVkIGZvciBwbGF0Zm9ybXMgdGhhdCB3YW50IHRvIEpJVC4KKyNkZWZpbmUgU0JfQ0FOX01BUF9FWEVDVVRBQkxFX01FTU9SWSAxCisKKy8vIFdoZXRoZXIgdGhpcyBwbGF0Zm9ybSBoYXMgYW5kIHNob3VsZCB1c2UgYW4gZ3Jvd2FibGUgaGVhcCAoZS5nLiB3aXRoIHNicmsoKSkKKy8vIHRvIG1hcCBwaHlzaWNhbCBtZW1vcnkgdG8gdGhlIHZpcnR1YWwgYWRkcmVzcyBzcGFjZS4KKyNkZWZpbmUgU0JfSEFTX1ZJUlRVQUxfUkVHSU9OUyAwCisKKy8vIFNwZWNpZmllcyB0aGUgYWxpZ25tZW50IGZvciBJTyBCdWZmZXJzLCBpbiBieXRlcy4gU29tZSBsb3ctbGV2ZWwgbmV0d29yayBBUElzCisvLyBtYXkgcmVxdWlyZSBidWZmZXJzIHRvIGhhdmUgYSBzcGVjaWZpYyBhbGlnbm1lbnQsIGFuZCB0aGlzIGlzIHRoZSBwbGFjZSB0bworLy8gc3BlY2lmeSB0aGF0LgorI2RlZmluZSBTQl9ORVRXT1JLX0lPX0JVRkZFUl9BTElHTk1FTlQgMTYKKworLy8gRGV0ZXJtaW5lcyB0aGUgYWxpZ25tZW50IHRoYXQgYWxsb2NhdGlvbnMgc2hvdWxkIGhhdmUgb24gdGhpcyBwbGF0Zm9ybS4KKyNkZWZpbmUgU0JfTUFMTE9DX0FMSUdOTUVOVCAoKHNpemVfdCkxNlUpCisKKy8vIERldGVybWluZXMgdGhlIHRocmVzaGhvbGQgb2YgYWxsb2NhdGlvbiBzaXplIHRoYXQgc2hvdWxkIGJlIGRvbmUgd2l0aCBtbWFwCisvLyAoaWYgYXZhaWxhYmxlKSwgcmF0aGVyIHRoYW4gYWxsb2NhdGVkIHdpdGhpbiB0aGUgY29yZSBoZWFwLgorI2RlZmluZSBTQl9ERUZBVUxUX01NQVBfVEhSRVNIT0xEICgoc2l6ZV90KSgyNTYgKiAxMDI0VSkpCisKKy8vIERlZmluZXMgdGhlIHBhdGggd2hlcmUgbWVtb3J5IGRlYnVnZ2luZyBsb2dzIHNob3VsZCBiZSB3cml0dGVuIHRvLgorI2RlZmluZSBTQl9NRU1PUllfTE9HX1BBVEggIi90bXAvc3RhcmJvYXJkIgorCisvLyBUaGUgUmFzcGJlcnJ5IFBpIGRvZXMgbm90IGFwcGFyZW50bHkgYWxpZ24gZmllbGRzIGluIGEgaGVhcC1hbGxvY2F0ZWQgc3RydWN0CisvLyBieSBvdmVyIDE2IGJ5dGVzLgorI2RlZmluZSBTQl9IQVNfUVVJUktfRE9FU19OT1RfQUxJR05fRklFTERTX0lOX0hFQVBfT1ZFUl8xNl9CWVRFUyAxCisKKy8vIFRoZSBSYXNwYmVycnkgUGkgZG9lcyBub3QgYXBwYXJlbnRseSBhbGlnbiBzdGFjayB2YXJpYWJsZXMgYnkgb3ZlciAxNiBieXRlcy4KKyNkZWZpbmUgU0JfSEFTX1FVSVJLX0RPRVNfTk9UX1NUQUNLX0FMSUdOX09WRVJfMTZfQllURVMgMQorCiAvLyAtLS0gTmV0d29yayBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogLy8gU3BlY2lmaWVzIHdoZXRoZXIgdGhpcyBwbGF0Zm9ybSBzdXBwb3J0cyBJUFY2LgpAQCAtMzEzLDYgKzMwNywzMSBAQAogLy8gU3BlY2lmaWVzIHdoZXRoZXIgdGhpcyBwbGF0Zm9ybSBzdXBwb3J0cyBwaXBlLgogI2RlZmluZSBTQl9IQVNfUElQRSAxCiAKKy8vIC0tLSBUaHJlYWQgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBPbiB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIFJhc3BiaWFuLCByZWFsIHRpbWUgdGhyZWFkIHNjaGVkdWxpbmcgc2VlbXMgdG8gYmUKKy8vIGJyb2tlbiBpbiB0aGF0IGhpZ2hlciBwcmlvcml0eSB0aHJlYWRzIGRvIG5vdCBhbHdheXMgaGF2ZSBwcmlvcml0eSBvdmVyIGxvd2VyCisvLyBwcmlvcml0eSB0aHJlYWRzLiAgSXQgbG9va3MgbGlrZSB0aGUgdGhyZWFkIGNyZWF0ZWQgbGFzdCB3aWxsIGFsd2F5cyBoYXZlIHRoZQorLy8gaGlnaGVzdCBwcmlvcml0eS4KKyNkZWZpbmUgU0JfSEFTX1RIUkVBRF9QUklPUklUWV9TVVBQT1JUIDEKKworLy8gRGVmaW5lcyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2ltdWx0YW5lb3VzIHRocmVhZHMgZm9yIHRoaXMgcGxhdGZvcm0uIFNvbWUKKy8vIHBsYXRmb3JtcyByZXF1aXJlIHNoYXJpbmcgdGhyZWFkIGhhbmRsZXMgd2l0aCBvdGhlciBraW5kcyBvZiBzeXN0ZW0gaGFuZGxlcywKKy8vIGxpa2UgbXV0ZXhlcywgc28gd2Ugd2FudCB0byBrZWVwIHRoaXMgbWFuYWdhYmxlLgorI2RlZmluZSBTQl9NQVhfVEhSRUFEUyA5MAorCisvLyBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGhyZWFkIGxvY2FsIHN0b3JhZ2Uga2V5cyBzdXBwb3J0ZWQgYnkgdGhpcyBwbGF0Zm9ybS4KKyNkZWZpbmUgU0JfTUFYX1RIUkVBRF9MT0NBTF9LRVlTIDUxMgorCisvLyBUaGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIG5hbWUgZm9yIGEgdGhyZWFkLCBpbmNsdWRpbmcgdGhlIE5VTEwtdGVybWluYXRvci4KKyNkZWZpbmUgU0JfTUFYX1RIUkVBRF9OQU1FX0xFTkdUSCAxNgorCisvLyAtLS0gVGltaW5nIEFQSSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gV2hldGhlciB0aGlzIHBsYXRmb3JtIGhhcyBhbiBBUEkgdG8gcmV0cmlldmUgaG93IGxvbmcgdGhlIGN1cnJlbnQgdGhyZWFkCisvLyBoYXMgc3BlbnQgaW4gdGhlIGV4ZWN1dGluZyBzdGF0ZS4KKyNkZWZpbmUgU0JfSEFTX1RJTUVfVEhSRUFEX05PVyAxCisKIC8vIC0tLSBUdW5lYWJsZSBQYXJhbWV0ZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAvLyBTcGVjaWZpZXMgdGhlIG5ldHdvcmsgcmVjZWl2ZSBidWZmZXIgc2l6ZSBpbiBieXRlcywgc2V0IHZpYQpAQCAtMzM0LDE5ICszNTMsNiBAQAogLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIHVzZXJzIHRoYXQgY2FuIGJlIHNpZ25lZCBpbiBhdCB0aGUgc2FtZSB0aW1lLgogI2RlZmluZSBTQl9VU0VSX01BWF9TSUdORURfSU4gMQogCi0vLyBUaGUgUmFzcGJlcnJ5IFBpIGRvZXMgbm90IGFwcGFyZW50bHkgYWxpZ24gZmllbGRzIGluIGEgaGVhcC1hbGxvY2F0ZWQgc3RydWN0Ci0vLyBieSBvdmVyIDE2IGJ5dGVzLgotI2RlZmluZSBTQl9IQVNfUVVJUktfRE9FU19OT1RfQUxJR05fRklFTERTX0lOX0hFQVBfT1ZFUl8xNl9CWVRFUyAxCi0KLS8vIFRoZSBSYXNwYmVycnkgUGkgZG9lcyBub3QgYXBwYXJlbnRseSBhbGlnbiBzdGFjayB2YXJpYWJsZXMgYnkgb3ZlciAxNiBieXRlcy4KLSNkZWZpbmUgU0JfSEFTX1FVSVJLX0RPRVNfTk9UX1NUQUNLX0FMSUdOX09WRVJfMTZfQllURVMgMQotCi0vLyAtLS0gVGltaW5nIEFQSSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gV2hldGhlciB0aGlzIHBsYXRmb3JtIGhhcyBhbiBBUEkgdG8gcmV0cmlldmUgaG93IGxvbmcgdGhlIGN1cnJlbnQgdGhyZWFkCi0vLyBoYXMgc3BlbnQgaW4gdGhlIGV4ZWN1dGluZyBzdGF0ZS4KLSNkZWZpbmUgU0JfSEFTX1RJTUVfVEhSRUFEX05PVyAxCi0KIC8vIC0tLSBQbGF0Zm9ybSBTcGVjaWZpYyBBdWRpdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAjaWYgIWRlZmluZWQoX19HTlVDX18pCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9neXBfY29uZmlndXJhdGlvbi5weSBiL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL2d5cF9jb25maWd1cmF0aW9uLnB5CmluZGV4IGU3ZjI3ZGMuLmJiOWFlNGMgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL2d5cF9jb25maWd1cmF0aW9uLnB5CisrKyBiL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL2d5cF9jb25maWd1cmF0aW9uLnB5CkBAIC05NSw5ICs5NSwxMCBAQAogICAgIHJldHVybiBmaWx0ZXJzCiAKICAgX0ZJTFRFUkVEX1RFU1RTID0gewotICAgICAgIyBUaGUgUmFzUGkgdGVzdCBkZXZpY2VzIGRvbid0IGhhdmUgYWNjZXNzIHRvIGFuIElQVjYgbmV0d29yaywgc28KLSAgICAgICMgZGlzYWJsZSB0aGUgcmVsYXRlZCB0ZXN0cy4KICAgICAgICducGxiJzogWworICAgICAgICAgICdTYkRybVRlc3QuQW55U3VwcG9ydGVkS2V5U3lzdGVtcycsCisgICAgICAgICAgIyBUaGUgUmFzUGkgdGVzdCBkZXZpY2VzIGRvbid0IGhhdmUgYWNjZXNzIHRvIGFuIElQVjYgbmV0d29yaywgc28KKyAgICAgICAgICAjIGRpc2FibGUgdGhlIHJlbGF0ZWQgdGVzdHMuCiAgICAgICAgICAgJ1NiU29ja2V0QWRkcmVzc1R5cGVzL1NiU29ja2V0R2V0SW50ZXJmYWNlQWRkcmVzc1Rlc3QnCiAgICAgICAgICAgJy5TdW5ueURheURlc3RpbmF0aW9uLzEnLAogICAgICAgICAgICdTYlNvY2tldEFkZHJlc3NUeXBlcy9TYlNvY2tldEdldEludGVyZmFjZUFkZHJlc3NUZXN0JwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9yYXNwaS9zaGFyZWQvb3Blbl9tYXgvdmlkZW9fZGVjb2Rlci5jYyBiL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL29wZW5fbWF4L3ZpZGVvX2RlY29kZXIuY2MKaW5kZXggYmE3NDNmZC4uM2Q0OGExYSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9yYXNwaS9zaGFyZWQvb3Blbl9tYXgvdmlkZW9fZGVjb2Rlci5jYworKysgYi9zcmMvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9vcGVuX21heC92aWRlb19kZWNvZGVyLmNjCkBAIC0xNCw3ICsxNCw2IEBACiAKICNpbmNsdWRlICJzdGFyYm9hcmQvcmFzcGkvc2hhcmVkL29wZW5fbWF4L3ZpZGVvX2RlY29kZXIuaCIKIAotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9qb2JfcXVldWUuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvdGltZS5oIgogCiBuYW1lc3BhY2Ugc3RhcmJvYXJkIHsKQEAgLTMyLDE2ICszMSwxNCBAQAogCiB9ICAvLyBuYW1lc3BhY2UKIAotVmlkZW9EZWNvZGVyOjpWaWRlb0RlY29kZXIoU2JNZWRpYVZpZGVvQ29kZWMgdmlkZW9fY29kZWMsIEpvYlF1ZXVlKiBqb2JfcXVldWUpCitWaWRlb0RlY29kZXI6OlZpZGVvRGVjb2RlcihTYk1lZGlhVmlkZW9Db2RlYyB2aWRlb19jb2RlYykKICAgICA6IHJlc291cmNlX3Bvb2xfKG5ldyBEaXNwbWFueFJlc291cmNlUG9vbChrUmVzb3VyY2VQb29sU2l6ZSkpLAogICAgICAgZW9zX3dyaXR0ZW5fKGZhbHNlKSwKICAgICAgIHRocmVhZF8oa1NiVGhyZWFkSW52YWxpZCksCi0gICAgICByZXF1ZXN0X3RocmVhZF90ZXJtaW5hdGlvbl8oZmFsc2UpLAotICAgICAgam9iX3F1ZXVlXyhqb2JfcXVldWUpIHsKKyAgICAgIHJlcXVlc3RfdGhyZWFkX3Rlcm1pbmF0aW9uXyhmYWxzZSkgewogICBTQl9EQ0hFQ0sodmlkZW9fY29kZWMgPT0ga1NiTWVkaWFWaWRlb0NvZGVjSDI2NCk7Ci0gIFNCX0RDSEVDSyhqb2JfcXVldWVfICE9IE5VTEwpOwogICB1cGRhdGVfam9iXyA9IHN0ZDo6YmluZCgmVmlkZW9EZWNvZGVyOjpVcGRhdGUsIHRoaXMpOwotICB1cGRhdGVfam9iX3Rva2VuXyA9IGpvYl9xdWV1ZV8tPlNjaGVkdWxlKHVwZGF0ZV9qb2JfLCBrVXBkYXRlSW50ZXJ2YWwpOworICB1cGRhdGVfam9iX3Rva2VuXyA9IFNjaGVkdWxlKHVwZGF0ZV9qb2JfLCBrVXBkYXRlSW50ZXJ2YWwpOwogfQogCiBWaWRlb0RlY29kZXI6On5WaWRlb0RlY29kZXIoKSB7CkBAIC01Miw3ICs0OSw3IEBACiAgICAgfQogICAgIFNiVGhyZWFkSm9pbih0aHJlYWRfLCBOVUxMKTsKICAgfQotICBqb2JfcXVldWVfLT5SZW1vdmVKb2JCeVRva2VuKHVwZGF0ZV9qb2JfdG9rZW5fKTsKKyAgUmVtb3ZlSm9iQnlUb2tlbih1cGRhdGVfam9iX3Rva2VuXyk7CiB9CiAKIHZvaWQgVmlkZW9EZWNvZGVyOjpJbml0aWFsaXplKGNvbnN0IERlY29kZXJTdGF0dXNDQiYgZGVjb2Rlcl9zdGF0dXNfY2IsCkBAIC05OSw3ICs5Niw3IEBACiAgIGlmIChlb3Nfd3JpdHRlbl8pIHsKICAgICBUcnlUb0RlbGl2ZXJPbmVGcmFtZSgpOwogICB9Ci0gIHVwZGF0ZV9qb2JfdG9rZW5fID0gam9iX3F1ZXVlXy0+U2NoZWR1bGUodXBkYXRlX2pvYl8sIGtVcGRhdGVJbnRlcnZhbCk7CisgIHVwZGF0ZV9qb2JfdG9rZW5fID0gU2NoZWR1bGUodXBkYXRlX2pvYl8sIGtVcGRhdGVJbnRlcnZhbCk7CiB9CiAKIGJvb2wgVmlkZW9EZWNvZGVyOjpUcnlUb0RlbGl2ZXJPbmVGcmFtZSgpIHsKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL29wZW5fbWF4L3ZpZGVvX2RlY29kZXIuaCBiL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL29wZW5fbWF4L3ZpZGVvX2RlY29kZXIuaAppbmRleCA3YjUzODZjLi4xOGNmOWJkIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9vcGVuX21heC92aWRlb19kZWNvZGVyLmgKKysrIGIvc3JjL3N0YXJib2FyZC9yYXNwaS9zaGFyZWQvb3Blbl9tYXgvdmlkZW9fZGVjb2Rlci5oCkBAIC0zNywxMSArMzcsMTIgQEAKIG5hbWVzcGFjZSBvcGVuX21heCB7CiAKIGNsYXNzIFZpZGVvRGVjb2RlcgotICAgIDogcHVibGljIHN0YXJib2FyZDo6c2hhcmVkOjpzdGFyYm9hcmQ6OnBsYXllcjo6ZmlsdGVyOjpWaWRlb0RlY29kZXIgeworICAgIDogcHVibGljIDo6c3RhcmJvYXJkOjpzaGFyZWQ6OnN0YXJib2FyZDo6cGxheWVyOjpmaWx0ZXI6OlZpZGVvRGVjb2RlciwKKyAgICAgIHByaXZhdGUgOjpzdGFyYm9hcmQ6OnNoYXJlZDo6c3RhcmJvYXJkOjpwbGF5ZXI6OkpvYlF1ZXVlOjpKb2JPd25lciB7CiAgcHVibGljOgogICB0eXBlZGVmIDo6c3RhcmJvYXJkOjpzaGFyZWQ6OnN0YXJib2FyZDo6cGxheWVyOjpKb2JRdWV1ZSBKb2JRdWV1ZTsKIAotICBWaWRlb0RlY29kZXIoU2JNZWRpYVZpZGVvQ29kZWMgdmlkZW9fY29kZWMsIEpvYlF1ZXVlKiBqb2JfcXVldWUpOworICBleHBsaWNpdCBWaWRlb0RlY29kZXIoU2JNZWRpYVZpZGVvQ29kZWMgdmlkZW9fY29kZWMpOwogICB+VmlkZW9EZWNvZGVyKCkgb3ZlcnJpZGU7CiAKICAgdm9pZCBJbml0aWFsaXplKGNvbnN0IERlY29kZXJTdGF0dXNDQiYgZGVjb2Rlcl9zdGF0dXNfY2IsCkBAIC05MSw3ICs5Miw2IEBACiAgIHN0ZDo6cXVldWU8T01YX0JVRkZFUkhFQURFUlRZUEUqPiBmaWxsZWRfYnVmZmVyc187CiAgIHN0ZDo6cXVldWU8T01YX0JVRkZFUkhFQURFUlRZUEUqPiBmcmVlZF9idWZmZXJzXzsKIAotICBKb2JRdWV1ZSogam9iX3F1ZXVlXzsKICAgSm9iUXVldWU6OkpvYlRva2VuIHVwZGF0ZV9qb2JfdG9rZW5fOwogICBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gdXBkYXRlX2pvYl87CiB9OwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9yYXNwaS9zaGFyZWQvcGxheWVyX2NvbXBvbmVudHNfaW1wbC5jYyBiL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL3BsYXllcl9jb21wb25lbnRzX2ltcGwuY2MKaW5kZXggNjA0MjVhNS4uMzQxMjRiNiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9yYXNwaS9zaGFyZWQvcGxheWVyX2NvbXBvbmVudHNfaW1wbC5jYworKysgYi9zcmMvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9wbGF5ZXJfY29tcG9uZW50c19pbXBsLmNjCkBAIC02NywxMSArNjcsOSBAQAogICAgIFNCX0RDSEVDSyh2aWRlb19yZW5kZXJfYWxnb3JpdGhtKTsKICAgICBTQl9EQ0hFQ0sodmlkZW9fcmVuZGVyZXJfc2luayk7CiAKLSAgICB2aWRlb19kZWNvZGVyLT5yZXNldChuZXcgVmlkZW9EZWNvZGVySW1wbCh2aWRlb19wYXJhbWV0ZXJzLnZpZGVvX2NvZGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvX3BhcmFtZXRlcnMuam9iX3F1ZXVlKSk7CisgICAgdmlkZW9fZGVjb2Rlci0+cmVzZXQobmV3IFZpZGVvRGVjb2RlckltcGwodmlkZW9fcGFyYW1ldGVycy52aWRlb19jb2RlYykpOwogICAgIHZpZGVvX3JlbmRlcl9hbGdvcml0aG0tPnJlc2V0KG5ldyBWaWRlb1JlbmRlckFsZ29yaXRobUltcGwpOwotICAgICp2aWRlb19yZW5kZXJlcl9zaW5rID0gbmV3IFZpZGVvUmVuZGVyZXJTaW5rSW1wbCgKLSAgICAgICAgdmlkZW9fcGFyYW1ldGVycy5wbGF5ZXIsIHZpZGVvX3BhcmFtZXRlcnMuam9iX3F1ZXVlKTsKKyAgICAqdmlkZW9fcmVuZGVyZXJfc2luayA9IG5ldyBWaWRlb1JlbmRlcmVyU2lua0ltcGwodmlkZW9fcGFyYW1ldGVycy5wbGF5ZXIpOwogICB9CiAKICAgdm9pZCBHZXRBdWRpb1JlbmRlcmVyUGFyYW1zKGludCogbWF4X2NhY2hlZF9mcmFtZXMsCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwaSBiL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL3N0YXJib2FyZF9wbGF0Zm9ybS5neXBpCmluZGV4IGQxNzI0MzAuLjM2MTc4NmMgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL3N0YXJib2FyZF9wbGF0Zm9ybS5neXBpCisrKyBiL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL3N0YXJib2FyZF9wbGF0Zm9ybS5neXBpCkBAIC0xMiw2ICsxMiw5IEBACiAjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiB7CisgICdpbmNsdWRlcyc6IFsKKyAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9wbGF5ZXJfZmlsdGVyLmd5cGknLAorICBdLAogICAndmFyaWFibGVzJzogewogICAgICdzYl9wZWRhbnRpY193YXJuaW5ncyc6IDEsCiAgIH0sCkBAIC0zNSw2ICszOCw3IEBACiAgICAgICAndGFyZ2V0X25hbWUnOiAnc3RhcmJvYXJkX3BsYXRmb3JtJywKICAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKICAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnPEAoZmlsdGVyX2Jhc2VkX3BsYXllcl9zb3VyY2VzKScsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvbGludXgvc2hhcmVkL2F0b21pY19wdWJsaWMuaCcsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvbGludXgvc2hhcmVkL2NvbmZpZ3VyYXRpb25fcHVibGljLmgnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9zeXN0ZW1fZ2V0X2Nvbm5lY3Rpb25fdHlwZS5jYycsCkBAIC04OSw2ICs5Myw3IEBACiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL2RsbWFsbG9jL21lbW9yeV9mcmVlLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvZGxtYWxsb2MvbWVtb3J5X2ZyZWVfYWxpZ25lZC5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL2RsbWFsbG9jL21lbW9yeV9tYXAuY2MnLAorICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9kbG1hbGxvYy9tZW1vcnlfcHJvdGVjdC5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL2RsbWFsbG9jL21lbW9yeV9yZWFsbG9jYXRlX3VuY2hlY2tlZC5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL2RsbWFsbG9jL21lbW9yeV91bm1hcC5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL2djYy9hdG9taWNfZ2NjLmgnLApAQCAtMjgxLDM1ICsyODYsNiBAQAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbmV3LmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9kZWNvZGVkX2F1ZGlvX2ludGVybmFsLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9kZWNvZGVkX2F1ZGlvX2ludGVybmFsLmgnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9hdWRpb19kZWNvZGVyX2ludGVybmFsLmgnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9hdWRpb19mcmFtZV90cmFja2VyLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fZnJhbWVfdHJhY2tlci5oJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fcmVuZGVyZXJfaW50ZXJuYWwuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9hdWRpb19yZW5kZXJlcl9pbnRlcm5hbC5oJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fcmVuZGVyZXJfc2luay5oJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fcmVuZGVyZXJfc2lua19pbXBsLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fcmVuZGVyZXJfc2lua19pbXBsLmgnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9hdWRpb19yZXNhbXBsZXJfaW1wbC5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2F1ZGlvX3RpbWVfc3RyZXRjaGVyLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fdGltZV9zdHJldGNoZXIuaCcsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2RlY29kZWRfYXVkaW9fcXVldWUuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9kZWNvZGVkX2F1ZGlvX3F1ZXVlLmgnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9maWx0ZXJfYmFzZWRfcGxheWVyX3dvcmtlcl9oYW5kbGVyLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvZmlsdGVyX2Jhc2VkX3BsYXllcl93b3JrZXJfaGFuZGxlci5oJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvbWVkaWFfdGltZV9wcm92aWRlci5oJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvbWVkaWFfdGltZV9wcm92aWRlcl9pbXBsLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvbWVkaWFfdGltZV9wcm92aWRlcl9pbXBsLmgnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9wbGF5ZXJfY29tcG9uZW50cy5oJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdmlkZW9fZGVjb2Rlcl9pbnRlcm5hbC5oJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdmlkZW9fZnJhbWVfaW50ZXJuYWwuaCcsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3ZpZGVvX3JlbmRlcl9hbGdvcml0aG0uaCcsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3ZpZGVvX3JlbmRlcl9hbGdvcml0aG1faW1wbC5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3ZpZGVvX3JlbmRlcl9hbGdvcml0aG1faW1wbC5oJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdmlkZW9fcmVuZGVyZXJfaW50ZXJuYWwuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci92aWRlb19yZW5kZXJlcl9pbnRlcm5hbC5oJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdmlkZW9fcmVuZGVyZXJfc2luay5oJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvd3NvbGFfaW50ZXJuYWwuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci93c29sYV9pbnRlcm5hbC5oJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9pbnB1dF9idWZmZXJfaW50ZXJuYWwuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2lucHV0X2J1ZmZlcl9pbnRlcm5hbC5oJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9qb2JfcXVldWUuY2MnLApAQCAtMzU3LDcgKzMzMyw5IEBACiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZHJtX2NyZWF0ZV9zeXN0ZW0uY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RybV9kZXN0cm95X3N5c3RlbS5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZHJtX2dlbmVyYXRlX3Nlc3Npb25fdXBkYXRlX3JlcXVlc3QuY2MnLAorICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RybV9pc19zZXJ2ZXJfY2VydGlmaWNhdGVfdXBkYXRhYmxlLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9kcm1fc3lzdGVtX2ludGVybmFsLmgnLAorICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RybV91cGRhdGVfc2VydmVyX2NlcnRpZmljYXRlLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9kcm1fdXBkYXRlX3Nlc3Npb24uY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL21lZGlhX2lzX3N1cHBvcnRlZC5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvbWVkaWFfaXNfdHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzX3N1cHBvcnRlZC5jYycsCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9zeXN0ZW1fZ2V0X3Byb3BlcnR5LmNjIGIvc3JjL3N0YXJib2FyZC9yYXNwaS9zaGFyZWQvc3lzdGVtX2dldF9wcm9wZXJ0eS5jYwppbmRleCA5NGU1YTUzLi44ZWJiMmY5IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9zeXN0ZW1fZ2V0X3Byb3BlcnR5LmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL3N5c3RlbV9nZXRfcHJvcGVydHkuY2MKQEAgLTc1LDEwICs3NSw2IEBACiAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICBjYXNlIGtTYlN5c3RlbVByb3BlcnR5UGxhdGZvcm1VdWlkOgotICAgICAgU0JfTk9USU1QTEVNRU5URUQoKTsKLSAgICAgIHJldHVybiBDb3B5U3RyaW5nQW5kVGVzdElmU3VjY2VzcyhvdXRfdmFsdWUsIHZhbHVlX2xlbmd0aCwgIk4vQSIpOwotCiAgICAgZGVmYXVsdDoKICAgICAgIFNCX0RMT0coV0FSTklORykgPDwgX19GVU5DVElPTl9fCiAgICAgICAgICAgICAgICAgICAgICAgIDw8ICI6IFVucmVjb2duaXplZCBwcm9wZXJ0eTogIiA8PCBwcm9wZXJ0eV9pZDsKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL3ZpZGVvX3JlbmRlcmVyX3NpbmtfaW1wbC5jYyBiL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL3ZpZGVvX3JlbmRlcmVyX3NpbmtfaW1wbC5jYwppbmRleCA5Y2Y0NWU1Li43MWE0ZDdlIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC92aWRlb19yZW5kZXJlcl9zaW5rX2ltcGwuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9yYXNwaS9zaGFyZWQvdmlkZW9fcmVuZGVyZXJfc2lua19pbXBsLmNjCkBAIC0yNiwxNyArMjYsOSBAQAogdXNpbmcgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xOwogdXNpbmcgc3RkOjpwbGFjZWhvbGRlcnM6Ol8yOwogCi1WaWRlb1JlbmRlcmVyU2lua0ltcGw6OlZpZGVvUmVuZGVyZXJTaW5rSW1wbChTYlBsYXllciBwbGF5ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKb2JRdWV1ZSogam9iX3F1ZXVlKQotICAgIDogSm9iT3duZXIoam9iX3F1ZXVlKSwKLSAgICAgIHBsYXllcl8ocGxheWVyKSwKLSAgICAgIHpfaW5kZXhfKDApLAotICAgICAgeF8oMCksCi0gICAgICB5XygwKSwKLSAgICAgIHdpZHRoXygwKSwKLSAgICAgIGhlaWdodF8oMCkgeworVmlkZW9SZW5kZXJlclNpbmtJbXBsOjpWaWRlb1JlbmRlcmVyU2lua0ltcGwoU2JQbGF5ZXIgcGxheWVyKQorICAgIDogcGxheWVyXyhwbGF5ZXIpLCB6X2luZGV4XygwKSwgeF8oMCksIHlfKDApLCB3aWR0aF8oMCksIGhlaWdodF8oMCkgewogICBTQl9EQ0hFQ0soU2JQbGF5ZXJJc1ZhbGlkKHBsYXllcikpOwotICBTQl9EQ0hFQ0soam9iX3F1ZXVlKTsKIH0KIAogVmlkZW9SZW5kZXJlclNpbmtJbXBsOjp+VmlkZW9SZW5kZXJlclNpbmtJbXBsKCkgewpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9yYXNwaS9zaGFyZWQvdmlkZW9fcmVuZGVyZXJfc2lua19pbXBsLmggYi9zcmMvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC92aWRlb19yZW5kZXJlcl9zaW5rX2ltcGwuaAppbmRleCBhYzY1MGU4Li44MGFhM2EyIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC92aWRlb19yZW5kZXJlcl9zaW5rX2ltcGwuaAorKysgYi9zcmMvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC92aWRlb19yZW5kZXJlcl9zaW5rX2ltcGwuaApAQCAtMzAsOSArMzAsNyBAQAogICAgIDogcHVibGljIDo6c3RhcmJvYXJkOjpzaGFyZWQ6OnN0YXJib2FyZDo6cGxheWVyOjpmaWx0ZXI6OlZpZGVvUmVuZGVyZXJTaW5rLAogICAgICAgcHJpdmF0ZSA6OnN0YXJib2FyZDo6c2hhcmVkOjpzdGFyYm9hcmQ6OnBsYXllcjo6Sm9iUXVldWU6OkpvYk93bmVyIHsKICBwdWJsaWM6Ci0gIHR5cGVkZWYgOjpzdGFyYm9hcmQ6OnNoYXJlZDo6c3RhcmJvYXJkOjpwbGF5ZXI6OkpvYlF1ZXVlIEpvYlF1ZXVlOwotCi0gIFZpZGVvUmVuZGVyZXJTaW5rSW1wbChTYlBsYXllciBwbGF5ZXIsIEpvYlF1ZXVlKiBqb2JfcXVldWUpOworICBleHBsaWNpdCBWaWRlb1JlbmRlcmVyU2lua0ltcGwoU2JQbGF5ZXIgcGxheWVyKTsKICAgflZpZGVvUmVuZGVyZXJTaW5rSW1wbCgpIG92ZXJyaWRlOwogCiAgcHJpdmF0ZToKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL2RsbWFsbG9jL21lbW9yeV9wcm90ZWN0LmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvZGxtYWxsb2MvbWVtb3J5X3Byb3RlY3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcwNjM0ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL2RsbWFsbG9jL21lbW9yeV9wcm90ZWN0LmNjCkBAIC0wLDAgKzEsMjMgQEAKKy8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJzdGFyYm9hcmQvY29uZmlndXJhdGlvbi5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL2RsbWFsbG9jL3BhZ2VfaW50ZXJuYWwuaCIKKworI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX01FTU9SWV9QUk9URUNUX0FQSV9WRVJTSU9OCitib29sIFNiTWVtb3J5UHJvdGVjdCh2b2lkKiB2aXJ0dWFsX2FkZHJlc3MsIGludDY0X3Qgc2l6ZV9ieXRlcywgaW50IGZsYWdzKSB7CisgIHJldHVybiBTYlBhZ2VQcm90ZWN0KHZpcnR1YWxfYWRkcmVzcywgc2l6ZV9ieXRlcywgZmxhZ3MpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9kbG1hbGxvYy9wYWdlX2ludGVybmFsLmggYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9kbG1hbGxvYy9wYWdlX2ludGVybmFsLmgKaW5kZXggNDA3M2EyZS4uYzE2MWVlNyAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvZGxtYWxsb2MvcGFnZV9pbnRlcm5hbC5oCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL2RsbWFsbG9jL3BhZ2VfaW50ZXJuYWwuaApAQCAtMTI5LDcgKzEyOSwxMyBAQAogLy8gU2FtZSBhcyBTYlVubWFwKCksIGJ1dCBzaG91bGQgYmUgdXNlZCBvbmx5IGJ5IGRsbWFsbG9jIHRvIHVubWFwIHBhZ2VzCiAvLyBhbGxvY2F0ZWQgdmlhIE1hcFVudHJhY2tlZCgpLgogYm9vbCBTYlBhZ2VVbm1hcFVudHJhY2tlZCh2b2lkKiB2aXJ0dWFsX2FkZHJlc3MsIHNpemVfdCBzaXplX2J5dGVzKTsKKworI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX01FTU9SWV9QUk9URUNUX0FQSV9WRVJTSU9OCisvLyBDaGFuZ2UgdGhlIHByb3RlY3Rpb24gb2YgfHNpemVfYnl0ZXN8IG9mIHBoeXNpY2FsIHBhZ2VzLCBzdGFydGluZyBmcm9tCisvLyB8dmlydHVhbF9hZGRyZXNzfCwgdG8gfGZsYWdzfCwgcmV0dXJuaW5nIHx0cnVlfCBvbiBzdWNjZXNzLgorYm9vbCBTYlBhZ2VQcm90ZWN0KHZvaWQqIHZpcnR1YWxfYWRkcmVzcywgaW50NjRfdCBzaXplX2J5dGVzLCBpbnQgZmxhZ3MpOwogI2VuZGlmCisjZW5kaWYgIC8vIFNCX0hBUyhNTUFQKQogCiAvLyBSZXR1cm5zIHRoZSB0b3RhbCBhbW91bnQsIGluIGJ5dGVzLCBvZiBwaHlzaWNhbCBtZW1vcnkgYXZhaWxhYmxlLiBTaG91bGQKIC8vIGFsd2F5cyBiZSBhIG11bHRpcGxlIG9mIFNCX01FTU9SWV9QQUdFX1NJWkUuCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9mZm1wZWcvZmZtcGVnX2NvbW1vbi5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvZmZtcGVnL2ZmbXBlZ19jb21tb24uaAppbmRleCA4NmYwMTY5Li4zN2NkNzM0IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9mZm1wZWcvZmZtcGVnX2NvbW1vbi5oCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL2ZmbXBlZy9mZm1wZWdfY29tbW9uLmgKQEAgLTE5LDcgKzE5LDYgQEAKIGV4dGVybiAiQyIgewogI2luY2x1ZGUgPGxpYmF2Y29kZWMvYXZjb2RlYy5oPgogI2luY2x1ZGUgPGxpYmF2Zm9ybWF0L2F2Zm9ybWF0Lmg+Ci0jaW5jbHVkZSA8bGliYXZyZXNhbXBsZS9hdnJlc2FtcGxlLmg+CiAjaW5jbHVkZSA8bGliYXZ1dGlsL2F2dXRpbC5oPgogI2luY2x1ZGUgPGxpYmF2dXRpbC9pbWd1dGlscy5oPgogI2luY2x1ZGUgPGxpYmF2dXRpbC9vcHQuaD4KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL2djYy9hdG9taWNfZ2NjX3B1YmxpYy5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvZ2NjL2F0b21pY19nY2NfcHVibGljLmgKaW5kZXggY2RmOWZhOC4uMTk1NWEyOSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvZ2NjL2F0b21pY19nY2NfcHVibGljLmgKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvZ2NjL2F0b21pY19nY2NfcHVibGljLmgKQEAgLTEwMCw2ICsxMDAsMjkgQEAKICAgcmV0dXJuIF9fYXRvbWljX2xvYWRfbihwdHIsIF9fQVRPTUlDX1JFTEFYRUQpOwogfQogCisvLyA4LWJpdCBhdG9taWMgb3BlcmF0aW9ucy4KKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9FWFBFUklNRU5UQUxfQVBJX1ZFUlNJT04KK3N0YXRpYyBTQl9DX0ZPUkNFX0lOTElORSBTYkF0b21pYzgKK1NiQXRvbWljUmVsZWFzZV9Db21wYXJlQW5kU3dhcDgodm9sYXRpbGUgU2JBdG9taWM4KiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JBdG9taWM4IG9sZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkF0b21pYzggbmV3X3ZhbHVlKSB7CisgIGJvb2wgcmVzdWx0ID0gX19hdG9taWNfY29tcGFyZV9leGNoYW5nZV9uKHB0ciwgJm9sZF92YWx1ZSwgbmV3X3ZhbHVlLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fQVRPTUlDX1JFTEVBU0UsIF9fQVRPTUlDX1JFTEFYRUQpOworICBTQl9VTlJFRkVSRU5DRURfUEFSQU1FVEVSKHJlc3VsdCk7ICAvLyBNYWtlIGdjYyBjb21waWxlciBoYXBweS4KKyAgcmV0dXJuIG9sZF92YWx1ZTsKK30KKworc3RhdGljIFNCX0NfRk9SQ0VfSU5MSU5FIHZvaWQKK1NiQXRvbWljTm9CYXJyaWVyX1N0b3JlOCh2b2xhdGlsZSBTYkF0b21pYzgqIHB0ciwgU2JBdG9taWM4IHZhbHVlKSB7CisgIF9fYXRvbWljX3N0b3JlX24ocHRyLCB2YWx1ZSwgX19BVE9NSUNfUkVMQVhFRCk7Cit9CisKK3N0YXRpYyBTQl9DX0ZPUkNFX0lOTElORSBTYkF0b21pYzgKK1NiQXRvbWljTm9CYXJyaWVyX0xvYWQ4KHZvbGF0aWxlIGNvbnN0IFNiQXRvbWljOCogcHRyKSB7CisgIHJldHVybiBfX2F0b21pY19sb2FkX24ocHRyLCBfX0FUT01JQ19SRUxBWEVEKTsKK30KKyNlbmRpZgorCiAvLyA2NC1iaXQgYXRvbWljIG9wZXJhdGlvbnMgKG9ubHkgYXZhaWxhYmxlIG9uIDY0LWJpdCBwcm9jZXNzb3JzKS4KICNpZiBTQl9IQVMoNjRfQklUX0FUT01JQ1MpCiBzdGF0aWMgU0JfQ19GT1JDRV9JTkxJTkUgU2JBdG9taWM2NApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvbGludXgvcGFnZV9pbnRlcm5hbC5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL2xpbnV4L3BhZ2VfaW50ZXJuYWwuY2MKaW5kZXggYzA2ZTBjZC4uMTExM2RhMiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvbGludXgvcGFnZV9pbnRlcm5hbC5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9saW51eC9wYWdlX2ludGVybmFsLmNjCkBAIC03MCw2ICs3MCwxMyBAQAogdm9pZCogU2JQYWdlTWFwVW50cmFja2VkKHNpemVfdCBzaXplX2J5dGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAvKnVudXNlZF9uYW1lKi8pIHsKKyNpZiBTQl9DQU4oTUFQX0VYRUNVVEFCTEVfTUVNT1JZKSBcCisgICAgJiYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfTUVNT1JZX1BST1RFQ1RfQVBJX1ZFUlNJT04KKyAgaWYgKGZsYWdzICYga1NiTWVtb3J5TWFwUHJvdGVjdEV4ZWMpIHsKKyAgICAvLyBDb2JhbHQgZG9lcyBub3QgYWxsb3cgbWFwcGluZyBleGVjdXRhYmxlIG1lbW9yeSBkaXJlY3RseS4KKyAgICByZXR1cm4gU0JfTUVNT1JZX01BUF9GQUlMRUQ7CisgIH0KKyNlbmRpZgogICBpbnQgbW1hcF9wcm90ZWN0ID0gU2JNZW1vcnlNYXBGbGFnc1RvTW1hcFByb3RlY3QoZmxhZ3MpOwogICB2b2lkKiBtZW0gPSBtbWFwKDAsIHNpemVfYnl0ZXMsIG1tYXBfcHJvdGVjdCwgTUFQX1BSSVZBVEUgfCBNQVBfQU5PTiwgLTEsIDApOwogICByZXR1cm4gbWVtOwpAQCAtODQsNiArOTEsMTMgQEAKICAgcmV0dXJuIG11bm1hcChwdHIsIHNpemVfYnl0ZXMpID09IDA7CiB9CiAKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9NRU1PUllfUFJPVEVDVF9BUElfVkVSU0lPTgorYm9vbCBTYlBhZ2VQcm90ZWN0KHZvaWQqIHZpcnR1YWxfYWRkcmVzcywgaW50NjRfdCBzaXplX2J5dGVzLCBpbnQgZmxhZ3MpIHsKKyAgaW50IG1tYXBfcHJvdGVjdCA9IFNiTWVtb3J5TWFwRmxhZ3NUb01tYXBQcm90ZWN0KGZsYWdzKTsKKyAgcmV0dXJuIG1wcm90ZWN0KHZpcnR1YWxfYWRkcmVzcywgc2l6ZV9ieXRlcywgbW1hcF9wcm90ZWN0KSA9PSAwOworfQorI2VuZGlmCisKIHNpemVfdCBTYlBhZ2VHZXRUb3RhbFBoeXNpY2FsTWVtb3J5Qnl0ZXMoKSB7CiAgIC8vIExpbWl0IG91cnNlbHZlcyB0byByZW1haW4gc2ltaWxhciB0byBtb3JlIGNvbnN0cmFpbmVkIHBsYXRmb3Jtcy4KICAgcmV0dXJuIDEwMjRVICogMTAyNCAqIDEwMjQ7CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvYXBwbGljYXRpb24uaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9hcHBsaWNhdGlvbi5oCmluZGV4IDg4ZmE3OWQuLmM1ZjUzYjYgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9hcHBsaWNhdGlvbi5oCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9hcHBsaWNhdGlvbi5oCkBAIC0yNTAsNiArMjUwLDE2IEBACiAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAogICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQpOwogCisgIC8vIFRoaXMgaXMgY2FsbGVkIGltbWVkaWF0ZWx5IHdoZW4gU2JQbGF5ZXJTZXRCb3VuZHMgaXMgY2FsbGVkIGZvciBwdW5jaC1vdXQKKyAgLy8gdmlkZW8uIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgdG8gYmV0dGVyIHN5bmNocm9uaXplIHRoZSBwdW5jaC1vdXQKKyAgLy8gdmlkZW8gYm91bmRzIHdpdGggdGhlIHVwY29taW5nIHJlbmRlciBvdXRwdXQuCisgIHZpcnR1YWwgdm9pZCBQbGF5ZXJTZXRCb3VuZHMoU2JQbGF5ZXIgLyogcGxheWVyICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiB6X2luZGV4ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiB4ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiB5ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiB3aWR0aCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogaGVpZ2h0ICovKSB7fQorCiAgIC8vIFJlZ2lzdGVycyBhIHxjYWxsYmFja3wgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIHxUZWFyZG93bnwgaXMKICAgLy8gY2FsbGVkLgogICB2b2lkIFJlZ2lzdGVyVGVhcmRvd25DYWxsYmFjayhUZWFyZG93bkNhbGxiYWNrIGNhbGxiYWNrKSB7CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbmV0X2FyZ3MuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbmV0X2FyZ3MuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIwMGUzOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9uZXRfYXJncy5jYwpAQCAtMCwwICsxLDE1MCBAQAorLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL25ldF9hcmdzLmgiCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAic3RhcmJvYXJkL2NvbW1vbi9zY29wZWRfcHRyLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3NvY2tldF93YWl0ZXIuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvdGhyZWFkLmgiCisKKyNpZm5kZWYgTkVUX0FSR1NfUE9SVAorI2RlZmluZSBORVRfQVJHU19QT1JUIDQ5MzU1CisjZW5kaWYKKworLy8gQ29udHJvbHMgd2hldGhlciB1c2luZyBJUHY0IG9yIElQdjYuCisjaWZuZGVmIE5FVF9BUkdTX0lQX1ZFUlNJT04KKyNkZWZpbmUgTkVUX0FSR1NfSVBfVkVSU0lPTiBrU2JTb2NrZXRBZGRyZXNzVHlwZUlwdjQKKyNlbmRpZgorCituYW1lc3BhY2Ugc3RhcmJvYXJkIHsKK25hbWVzcGFjZSBzaGFyZWQgeworbmFtZXNwYWNlIHN0YXJib2FyZCB7CituYW1lc3BhY2UgeworCitzY29wZWRfcHRyPFNvY2tldD4gQ3JlYXRlTGlzdGVuU29ja2V0KCkgeworICBzY29wZWRfcHRyPFNvY2tldD4gc29ja2V0KAorICAgICAgbmV3IFNvY2tldChORVRfQVJHU19JUF9WRVJTSU9OLCBrU2JTb2NrZXRQcm90b2NvbFRjcCkpOworICBzb2NrZXQtPlNldFJldXNlQWRkcmVzcyh0cnVlKTsKKyAgU2JTb2NrZXRBZGRyZXNzIHNvY2tfYWRkcjsKKyAgLy8gSXAgYWRkcmVzcyB3aWxsIGJlIHNldCB0byAwLjAuMC4wIHNvIHRoYXQgaXQgd2lsbCBiaW5kIHRvIGFsbCBzb2NrZXRzLgorICBTYk1lbW9yeVNldCgmc29ja19hZGRyLCAwLCBzaXplb2YoU2JTb2NrZXRBZGRyZXNzKSk7CisgIHNvY2tfYWRkci50eXBlID0gTkVUX0FSR1NfSVBfVkVSU0lPTjsKKyAgc29ja19hZGRyLnBvcnQgPSBORVRfQVJHU19QT1JUOworICBTYlNvY2tldEVycm9yIHNvY2tfZXJyID0gc29ja2V0LT5CaW5kKCZzb2NrX2FkZHIpOworCisgIGNvbnN0IGNoYXIga0VyckZtdFtdID0gIlNvY2tldCBlcnJvciB3aGlsZSBhdHRlbXB0aW5nIHRvIGJpbmQsIGVycm9yID0gJWRcbiI7CisgIGlmIChzb2NrX2VyciAhPSBrU2JTb2NrZXRPaykgeworICAgIFNiTG9nUmF3Rm9ybWF0RihrRXJyRm10LCBzb2NrX2Vycik7CisgIH0KKyAgc29ja19lcnIgPSBzb2NrZXQtPkxpc3RlbigpOworICBpZiAoc29ja19lcnIgIT0ga1NiU29ja2V0T2spIHsKKyAgICBTYkxvZ1Jhd0Zvcm1hdEYoa0VyckZtdCwgc29ja19lcnIpOworICB9CisgIHJldHVybiBzb2NrZXQuUGFzcygpOworfQorCit2b2lkIFdhaXRVbnRpbFJlYWRhYmxlT3JDb25uZWN0aW9uUmVzZXQoU2JTb2NrZXQgc29jaykgeworICBTYlNvY2tldFdhaXRlciB3YWl0ZXIgPSBTYlNvY2tldFdhaXRlckNyZWF0ZSgpOworCisgIHN0cnVjdCBGIHsKKyAgICBzdGF0aWMgdm9pZCBXYWtlVXAoU2JTb2NrZXRXYWl0ZXIgd2FpdGVyLCBTYlNvY2tldCwgdm9pZCosIGludCkgeworICAgICAgU2JTb2NrZXRXYWl0ZXJXYWtlVXAod2FpdGVyKTsKKyAgICB9CisgIH07CisKKyAgU2JTb2NrZXRXYWl0ZXJBZGQod2FpdGVyLAorICAgICAgICAgICAgICAgICAgICBzb2NrLAorICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAmRjo6V2FrZVVwLAorICAgICAgICAgICAgICAgICAgICBrU2JTb2NrZXRXYWl0ZXJJbnRlcmVzdFJlYWQsCisgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsgIC8vIGZhbHNlIG1lYW5zIG9uZSBzaG90LgorCisgIFNiU29ja2V0V2FpdGVyV2FpdCh3YWl0ZXIpOworICBTYlNvY2tldFdhaXRlclJlbW92ZSh3YWl0ZXIsIHNvY2spOworICBTYlNvY2tldFdhaXRlckRlc3Ryb3kod2FpdGVyKTsKK30KKworc2NvcGVkX3B0cjxTb2NrZXQ+IFdhaXRGb3JDbGllbnRDb25uZWN0aW9uKFNvY2tldCogbGlzdGVuX3NvY2spIHsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBzY29wZWRfcHRyPFNvY2tldD4gY2xpZW50X2Nvbm5lY3Rpb24obGlzdGVuX3NvY2stPkFjY2VwdCgpKTsKKyAgICBpZiAoY2xpZW50X2Nvbm5lY3Rpb24pIHsKKyAgICAgIHJldHVybiBjbGllbnRfY29ubmVjdGlvbi5QYXNzKCk7CisgICAgfQorICAgIFNiVGhyZWFkU2xlZXAoa1NiVGltZU1pbGxpc2Vjb25kKTsKKyAgfQorfQorCitzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gU3BsaXRTdHJpbmdCeUxpbmVzKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHJpbmdfYnVmZikgeworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbGluZXM7CisgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICBzcyA8PCBzdHJpbmdfYnVmZjsKKyAgZm9yIChzdGQ6OnN0cmluZyBsaW5lOyBzdGQ6OmdldGxpbmUoc3MsIGxpbmUpOykgeworICAgIGlmICghbGluZS5lbXB0eSgpKSB7CisgICAgICBsaW5lcy5wdXNoX2JhY2sobGluZSk7CisgICAgfQorICB9CisgIHJldHVybiBsaW5lczsKK30KKworfSAgLy8gbmFtZXNwYWNlLgorCisvLyBDb21tYW5kIGxpbmUgc3dpdGNoIHVzZWZ1bCBmb3IgZGV0ZXJtaW5pbmcgaWYgTmV0QXJnc1dhaXRGb3JDb25uZWN0aW9uKCkKKy8vIHNob3VsZCBiZSBjYWxsZWQuCitjb25zdCBjaGFyIGtOZXRBcmdzQ29tbWFuZFN3aXRjaFdhaXRbXSA9ICJuZXRfYXJnc193YWl0X2Zvcl9jb25uZWN0aW9uIjsKKworLy8gV2FpdHMgdW50aWwuCitzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gTmV0QXJnc1dhaXRGb3JQYXlsb2FkKCkgeworICBzY29wZWRfcHRyPFNvY2tldD4gbGlzdGVuID0gQ3JlYXRlTGlzdGVuU29ja2V0KCk7CisgIHNjb3BlZF9wdHI8U29ja2V0PiBjbGllbnRfY29ubmVjdGlvbiA9IFdhaXRGb3JDbGllbnRDb25uZWN0aW9uKGxpc3Rlbi5nZXQoKSk7CisKKyAgc3RkOjpzdHJpbmcgc3RyX2J1ZmY7CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBjaGFyIGJ1ZmZbMTI4XTsKKyAgICBpbnQgcmVzdWx0ID0gY2xpZW50X2Nvbm5lY3Rpb24tPlJlY2VpdmVGcm9tKGJ1ZmYsIHNpemVvZihidWZmKSwgTlVMTCk7CisgICAgaWYgKHJlc3VsdCA+IDApIHsKKyAgICAgIHN0cl9idWZmLmFwcGVuZChidWZmLCBzdGF0aWNfY2FzdDxzaXplX3Q+KHJlc3VsdCkpOworICAgICAgY29udGludWU7CisgICAgfSBlbHNlIGlmIChyZXN1bHQgPT0gMCkgeworICAgICAgLy8gU29ja2V0IGhhcyBjbG9zZWQuCisgICAgICBicmVhazsKKyAgICB9IGVsc2UgaWYgKHJlc3VsdCA8IDApIHsgIC8vIEhhbmRsZSBlcnJvciBjb25kaXRpb24uCisgICAgICBTYlNvY2tldEVycm9yIGVyciA9IGNsaWVudF9jb25uZWN0aW9uLT5HZXRMYXN0RXJyb3IoKTsKKyAgICAgIGNsaWVudF9jb25uZWN0aW9uLT5DbGVhckxhc3RFcnJvcigpOworCisgICAgICBzd2l0Y2ggKGVycikgeworICAgICAgICBjYXNlIGtTYlNvY2tldE9rOiB7CisgICAgICAgICAgU0JfTk9UUkVBQ0hFRCgpIDw8ICJFeHBlY3RlZCBlcnJvciBjb25kaXRpb24gd2hlbiByZXR1cm4gdmFsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgImlzIDwgMC4iOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1NiU29ja2V0UGVuZGluZzogeworICAgICAgICAgIFdhaXRVbnRpbFJlYWRhYmxlT3JDb25uZWN0aW9uUmVzZXQoY2xpZW50X2Nvbm5lY3Rpb24tPnNvY2tldCgpKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIFNwbGl0U3RyaW5nQnlMaW5lcyhzdHJfYnVmZik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKK30gIC8vIG5hbWVzcGFjZSBzaGFyZWQKK30gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9uZXRfYXJncy5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL25ldF9hcmdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRiMTU1MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9uZXRfYXJncy5oCkBAIC0wLDAgKzEsNTUgQEAKKy8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisvLworLy8gTmV0QXJncyBpcyBhbiBvcHRpb25hbCBjb21wb25lbnQgdGhhdCBhbGxvd3Mgc29ja2V0IGFjY2VzcyB0byB0ZWxsIGFuCisvLyBleGVjdXRhYmxlIHdoYXQgaXQncyBjb21tYW5kIGFyZ3MgYXJlLgorLy8KKy8vICoqKioqKiAvLworLy8gVE9ETzogUmVtb3ZlIHRoZSBmb2xsb3dpbmc6CisvLyBJdCdzIHJlY29tbWVuZGVkIHRvIGNhbGwgTmV0TG9nV2FpdEZvckNsaWVudENvbm5lY3RlZCgpIHRvIGVuc3VyZSB0aGF0IHRoZQorLy8gTmV0TG9nIGlzIHJ1bm5pbmcgYSBwcmVkaWN0YWJsZSB0aW1lIGZyb20gbGF1bmNoLiBJdCdzIGFsc28gU1RST05HTFkKKy8vIHJlY29tbWVuZGVkIHRoYXQgTmV0TG9nRmx1c2hUaGVuQ2xvc2UoKSBpcyBjYWxsZWQgZHVyaW5nIHNodXRkb3duIHRvCisvLyBndWFyYW50ZWUgdGhhdCBhbnkgcGVuZGluZyBkYXRhIGlzIGZsdXNoZWQgb3V0IHRocm91Z2ggdGhlIG5ldHdvcmsgbGF5ZXIuCisvLyBGYWlsdXJlIHRvIGRvIHRoaXMgd2lsbCBvZnRlbiByZXN1bHQgaW4gdGhlIG5ldGxvZyBiZWluZyB0cnVuY2F0ZWQgYXMgdGhlCisvLyBwcm9jZXNzIHNodXRzIGRvd24uCisvLworLy8gVGhlIG5ldGxvZyBjcmVhdGUgYSBzZXJ2ZXIgdGhhdCB3aWxsIGJpbmQgdG8gaXAgMC4wLjAuMCAoYW5kIHNpbWlsYXIgaW4KKy8vIGlwdjYpIGFuZCB3aWxsIGxpc3RlbiBmb3IgY2xpZW50IGNvbm5lY3Rpb25zLiBTZWUgbmV0X2xvZy5jYyBmb3Igd2hpY2gKKy8vIHBvcnQgbmV0X2xvZyB3aWxsIGxpc3RlbiB0by4KKy8vCisvLyBTZWUgYWxzbyBuZXRfbG9nLnB5IGZvciBhbiBleGFtcGxlIHNjcmlwdCB0aGF0IGNhbiBjb25uZWN0IHRvIGEgcnVubmluZworLy8gbmV0bG9nIGluc3RhbmNlLgorCisjaWZuZGVmIFNUQVJCT0FSRF9TSEFSRURfU1RBUkJPQVJEX05FVF9BUkdTX0hfCisjZGVmaW5lIFNUQVJCT0FSRF9TSEFSRURfU1RBUkJPQVJEX05FVF9BUkdTX0hfCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2Ugc3RhcmJvYXJkIHsKK25hbWVzcGFjZSBzaGFyZWQgeworbmFtZXNwYWNlIHN0YXJib2FyZCB7CisKKy8vIENvbW1hbmQgbGluZSBzd2l0Y2ggdXNlZnVsIGZvciBkZXRlcm1pbmluZyBpZiBOZXRBcmdzV2FpdEZvckNvbm5lY3Rpb24oKQorLy8gc2hvdWxkIGJlIGNhbGxlZC4KK2V4dGVybiBjb25zdCBjaGFyIGtOZXRBcmdzQ29tbWFuZFN3aXRjaFdhaXRbXTsKKworLy8gV2FpdHMgdW50aWwgYXJncyBzdHJlYW0gaW4gd2l0aCBhIHNvY2tldCBjb25uZWN0aW9uIGFuZCBkYXRhIHJlY2VwdGlvbi4KK3N0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBOZXRBcmdzV2FpdEZvclBheWxvYWQoKTsKKworfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZAorfSAgLy8gbmFtZXNwYWNlIHNoYXJlZAorfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZAorCisjZW5kaWYgIC8vIFNUQVJCT0FSRF9TSEFSRURfU1RBUkJPQVJEX05FVF9BUkdTX0hfCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbmV0X2xvZy5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9uZXRfbG9nLmNjCmluZGV4IGExNzZmZTYuLjcxNTI2M2QgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9uZXRfbG9nLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9uZXRfbG9nLmNjCkBAIC0xNjYsNyArMTY2LDEzIEBACiAgICAgfQogICAgIGxvZ19tdXRleF8uUmVsZWFzZSgpOwogCi0gICAgU0JfTE9HX0lGKEVSUk9SLCBvdmVyZmxvdykgPDwgIk5ldCBsb2cgZHJvcHBlZCBidWZmZXIgZGF0YS4iOworICAgIGlmIChvdmVyZmxvdykgeworICAgICAgLy8gQ2FuJ3QgdXNlIFNCX0xPR19JRigpIGJlY2F1c2UgU0JfTE9HX0lGKCkgbWlnaHQgaGF2ZSB0cmlnZ2VyZWQgdGhpcworICAgICAgLy8gY2FsbCwgYW5kIHRoZXJlZm9yZSB3b3VsZCB0cmlnZ2VyZWQgcmVlbnRyYW50IGJlaGF2aW9yIGFuZCB0aGVuCisgICAgICAvLyBkZWFkbG9jay4gU2JMb2dSYXdGb3JtYXQoKSBpcyBhc3N1bWVkIHRvIGJlIHNhZmUgdG8gY2FsbC4gTm90ZSB0aGF0CisgICAgICAvLyBOZXRMb2dXcml0ZSgpIGlnbm9yZXMgcmVlbnRyYW50IGNhbGxzLgorICAgICAgU2JMb2dSYXcoIk5ldCBsb2cgZHJvcHBlZCBidWZmZXIgZGF0YS4iKTsKKyAgICB9CiAgIH0KIAogICB2b2lkIFdhaXRVbnRpbFdyaXRhYmxlT3JDb25uZWN0aW9uUmVzZXQoU2JTb2NrZXQgc29jaykgewpAQCAtMzQzLDYgKzM0OSw3IEBACiAgICAgU2NvcGVkTG9jayBsb2NrKHNvY2tldF9tdXRleF8pOwogICAgIGNsaWVudF9zb2NrZXRfID0gY2xpZW50X3NvY2tldC5QYXNzKCk7CiAgICAgY2xpZW50X3NvY2tldF8tPlNldFNlbmRCdWZmZXJTaXplKE5FVF9MT0dfU09DS0VUX0JVRkZFUl9TSVpFKTsKKyAgICBjbGllbnRfc29ja2V0Xy0+U2V0VGNwS2VlcEFsaXZlKHRydWUsIGtTYlRpbWVTZWNvbmQpOwogICB9CiAKICAgLy8gSGFzIGEgY2xpZW50IGV2ZXIgY29ubmVjdGVkPwpAQCAtMzU3LDExICszNjQsMTIgQEAKICAgfQogCiAgIHZvaWQgQ2xvc2UoKSB7Ci0gICAgd3JpdGVyX3RocmVhZF8tPkpvaW4oKTsKLSAgICB3cml0ZXJfdGhyZWFkXy5yZXNldChudWxscHRyKTsKKyAgICBpZiAod3JpdGVyX3RocmVhZF8pIHsKKyAgICAgIHdyaXRlcl90aHJlYWRfLT5Kb2luKCk7CisgICAgICB3cml0ZXJfdGhyZWFkXy5yZXNldChudWxscHRyKTsKKyAgICAgIEZsdXNoKCk7ICAvLyBPbmUgbGFzdCBmbHVzaCB0byB0aGUgc29ja2V0LgorICAgIH0KICAgICBzb2NrZXRfbGlzdGVuZXJfLnJlc2V0KCk7Ci0KLSAgICBGbHVzaCgpOyAgLy8gT25lIGxhc3QgZmx1c2ggdG8gdGhlIHNvY2tldC4KICAgICBTY29wZWRMb2NrIGxvY2soc29ja2V0X211dGV4Xyk7CiAgICAgY2xpZW50X3NvY2tldF8ucmVzZXQoKTsKICAgICBsaXN0ZW5fc29ja2V0Xy5yZXNldCgpOwpAQCAtNDkxLDcgKzQ5OSw5IEBACiAjaWYgIVNCX0xPR0dJTkdfSVNfT0ZGSUNJQUxfQlVJTEQKICAgU2NvcGVHdWFyZCBndWFyZDsKICAgaWYgKGd1YXJkLklzRW5hYmxlZCgpKSB7Ci0gICAgTmV0TG9nU2VydmVyOjpJbnN0YW5jZSgpLT5DbG9zZSgpOworICAgIE5ldExvZ1NlcnZlciogbmV0X2xvZyA9IE5ldExvZ1NlcnZlcjo6SW5zdGFuY2UoKTsKKyAgICBuZXRfbG9nLT5PbkxvZygiTmV0bG9nIGlzIGNsb3NpbmcgZG93blxuIik7CisgICAgbmV0X2xvZy0+Q2xvc2UoKTsKICAgfQogI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9hdWRpb19kZWNvZGVyX2ludGVybmFsLmggYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9hdWRpb19kZWNvZGVyX2ludGVybmFsLmgKaW5kZXggMzgyNDA4MS4uNTU4Y2M3YyAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fZGVjb2Rlcl9pbnRlcm5hbC5oCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2F1ZGlvX2RlY29kZXJfaW50ZXJuYWwuaApAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgInN0YXJib2FyZC9tZWRpYS5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvaW50ZXJuYWxfb25seS5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9kZWNvZGVkX2F1ZGlvX2ludGVybmFsLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9jYWxsYmFjay5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9pbnB1dF9idWZmZXJfaW50ZXJuYWwuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvdHlwZXMuaCIKIApAQCAtMzQsOCArMzUsOCBAQAogY2xhc3MgQXVkaW9EZWNvZGVyIHsKICBwdWJsaWM6CiAgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IENvbnN1bWVkQ0I7Ci0gIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IEVycm9yQ0I7CiAgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IE91dHB1dENCOworICB0eXBlZGVmIDo6c3RhcmJvYXJkOjpzaGFyZWQ6OnN0YXJib2FyZDo6cGxheWVyOjpmaWx0ZXI6OkVycm9yQ0IgRXJyb3JDQjsKIAogICB0eXBlZGVmIDo6c3RhcmJvYXJkOjpzaGFyZWQ6OnN0YXJib2FyZDo6cGxheWVyOjpEZWNvZGVkQXVkaW8gRGVjb2RlZEF1ZGlvOwogICB0eXBlZGVmIDo6c3RhcmJvYXJkOjpzaGFyZWQ6OnN0YXJib2FyZDo6cGxheWVyOjpJbnB1dEJ1ZmZlciBJbnB1dEJ1ZmZlcjsKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2F1ZGlvX3JlbmRlcmVyX2ludGVybmFsLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fcmVuZGVyZXJfaW50ZXJuYWwuY2MKaW5kZXggNTI5NGQxMC4uMzhlZTYxNCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fcmVuZGVyZXJfaW50ZXJuYWwuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fcmVuZGVyZXJfaW50ZXJuYWwuY2MKQEAgLTQ5LDkgKzQ5LDggQEAKICAgYm9vbCBlb3NfcmVhY2hlZF87CiB9OwogCi0vLyBBdWRpb1JlbmRlcmVyIHVzZXMgQXVkaW9UaW1lU3RyZXRjaGVyIGludGVybmFsbHkgdG8gYWRqdXN0IHRvIHBsYXliYWNrIHJhdGUKLS8vIGFuZCBBdWRpb1RpbWVTdHJldGNoZXIgY2FuIG9ubHkgcHJvY2VzcyBmbG9hdDMyIHNhbXBsZXMuICBTbyB3ZSB0cnkgdG8gdXNlCi0vLyBrU2JNZWRpYUF1ZGlvU2FtcGxlVHlwZUZsb2F0MzIgYW5kIG9ubHkgdXNlCisvLyBBdWRpb1JlbmRlcmVyIHVzZXMgQXVkaW9UaW1lU3RyZXRjaGVyIGludGVybmFsbHkgdG8gYWRqdXN0IHRvIHBsYXliYWNrIHJhdGUuCisvLyBTbyB3ZSB0cnkgdG8gdXNlIGtTYk1lZGlhQXVkaW9TYW1wbGVUeXBlRmxvYXQzMiBhbmQgb25seSB1c2UKIC8vIGtTYk1lZGlhQXVkaW9TYW1wbGVUeXBlSW50MTZEZXByZWNhdGVkIHdoZW4gZmxvYXQzMiBpcyBub3Qgc3VwcG9ydGVkLiAgVG8gdXNlCiAvLyBrU2JNZWRpYUF1ZGlvU2FtcGxlVHlwZUZsb2F0MzIgd2lsbCBjYXVzZSBhbiBleHRyYSBjb252ZXJzaW9uIGZyb20gZmxvYXQzMiB0bwogLy8gaW50MTYgYmVmb3JlIHRoZSBzYW1wbGVzIGFyZSBzZW50IHRvIHRoZSBhdWRpbyBzaW5rLgpAQCAtODIsNiArODEsNyBAQAogICAgICAgc2Vla2luZ18oZmFsc2UpLAogICAgICAgc2Vla2luZ190b190aW1lXygwKSwKICAgICAgIGxhc3RfbWVkaWFfdGltZV8oMCksCisgICAgICBlbmRlZF9jYl9jYWxsZWRfKGZhbHNlKSwKICAgICAgIGZyYW1lX2J1ZmZlcl8obWF4X2NhY2hlZF9mcmFtZXNfICogYnl0ZXNfcGVyX2ZyYW1lXyksCiAgICAgICBmcmFtZXNfc2VudF90b19zaW5rXygwKSwKICAgICAgIHBlbmRpbmdfZGVjb2Rlcl9vdXRwdXRzXygwKSwKQEAgLTExNSwxMSArMTE1LDYgQEAKICAgU0JfRENIRUNLKEJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CiB9CiAKLXZvaWQgQXVkaW9SZW5kZXJlcjo6SW5pdGlhbGl6ZShjb25zdCBBdWRpb0RlY29kZXI6OkVycm9yQ0ImIGVycm9yX2NiKSB7Ci0gIGRlY29kZXJfLT5Jbml0aWFsaXplKHN0ZDo6YmluZCgmQXVkaW9SZW5kZXJlcjo6T25EZWNvZGVyT3V0cHV0LCB0aGlzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfY2IpOwotfQotCiB2b2lkIEF1ZGlvUmVuZGVyZXI6OldyaXRlU2FtcGxlKAogICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8SW5wdXRCdWZmZXI+JiBpbnB1dF9idWZmZXIpIHsKICAgU0JfRENIRUNLKEJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CkBAIC0xODQsNiArMTc5LDIxIEBACiAgIHJldHVybiBzZWVraW5nXzsKIH0KIAordm9pZCBBdWRpb1JlbmRlcmVyOjpJbml0aWFsaXplKGNvbnN0IEVycm9yQ0ImIGVycm9yX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByZXJvbGxlZENCJiBwcmVyb2xsZWRfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRW5kZWRDQiYgZW5kZWRfY2IpIHsKKyAgU0JfRENIRUNLKHByZXJvbGxlZF9jYik7CisgIFNCX0RDSEVDSyhlbmRlZF9jYik7CisgIFNCX0RDSEVDSyghcHJlcm9sbGVkX2NiXyk7CisgIFNCX0RDSEVDSyghZW5kZWRfY2JfKTsKKworICBwcmVyb2xsZWRfY2JfID0gcHJlcm9sbGVkX2NiOworICBlbmRlZF9jYl8gPSBlbmRlZF9jYjsKKworICBkZWNvZGVyXy0+SW5pdGlhbGl6ZShzdGQ6OmJpbmQoJkF1ZGlvUmVuZGVyZXI6Ok9uRGVjb2Rlck91dHB1dCwgdGhpcyksCisgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2NiKTsKK30KKwogdm9pZCBBdWRpb1JlbmRlcmVyOjpQbGF5KCkgewogICBTQl9EQ0hFQ0soQmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKIApAQCAtMjM3LDYgKzI0Nyw3IEBACiAgICAgZW9zX3N0YXRlXyA9IGtFT1NOb3RSZWNlaXZlZDsKICAgICBzZWVraW5nX3RvX3RpbWVfID0gc3RkOjptYXg8U2JUaW1lPihzZWVrX3RvX3RpbWUsIDApOwogICAgIGxhc3RfbWVkaWFfdGltZV8gPSBzZWVrX3RvX3RpbWU7CisgICAgZW5kZWRfY2JfY2FsbGVkXyA9IGZhbHNlOwogICAgIHNlZWtpbmdfID0gdHJ1ZTsKICAgfQogCkBAIC0yNjEsNiArMjcyLDcgQEAKICAgZnJhbWVzX2luX2J1ZmZlcl9vbl9zaW5rX3RocmVhZF8gPSAwOwogICBvZmZzZXRfaW5fZnJhbWVzX29uX3NpbmtfdGhyZWFkXyA9IDA7CiAgIGZyYW1lc19jb25zdW1lZF9vbl9zaW5rX3RocmVhZF8gPSAwOworICBzaWxlbmNlX2ZyYW1lc193cml0dGVuX2FmdGVyX2Vvc19vbl9zaW5rX3RocmVhZF8gPSAwOwogCiAgIGlmIChmaXJzdF9pbnB1dF93cml0dGVuXykgewogICAgIGRlY29kZXJfLT5SZXNldCgpOwpAQCAtMjkxLDYgKzMwMywxMCBAQAogCiAgICAgKmlzX3BsYXlpbmcgPSAhcGF1c2VkXyAmJiAhc2Vla2luZ187CiAgICAgKmlzX2Vvc19wbGF5ZWQgPSBJc0VuZE9mU3RyZWFtUGxheWVkX0xvY2tlZCgpOworICAgIGlmICgqaXNfZW9zX3BsYXllZCAmJiAhZW5kZWRfY2JfY2FsbGVkXykgeworICAgICAgZW5kZWRfY2JfY2FsbGVkXyA9IHRydWU7CisgICAgICBTY2hlZHVsZShlbmRlZF9jYl8pOworICAgIH0KIAogICAgIGlmIChzZWVraW5nXyB8fCAhZGVjb2Rlcl9zYW1wbGVfcmF0ZV8pIHsKICAgICAgIHJldHVybiBzZWVraW5nX3RvX3RpbWVfOwpAQCAtMzM3LDEzICszNTMsMTcgQEAKICAgfQogICBpZiAoc3lzdGVtX2FuZF9tZWRpYV90aW1lX29mZnNldF8gPiAwKSB7CiAgICAgU2JUaW1lIG9mZnNldCA9IG5vdyAtIG1lZGlhX3RpbWU7Ci0gICAgU2JUaW1lIGRpZmYgPSBzdGQ6OmFicyhvZmZzZXQgLSBzeXN0ZW1fYW5kX21lZGlhX3RpbWVfb2Zmc2V0Xyk7Ci0gICAgbWF4X29mZnNldF9kaWZmZXJlbmNlXyA9IHN0ZDo6bWF4KGRpZmYsIG1heF9vZmZzZXRfZGlmZmVyZW5jZV8pOworICAgIFNiVGltZSBkcmlmdCA9IG9mZnNldCAtIHN5c3RlbV9hbmRfbWVkaWFfdGltZV9vZmZzZXRfOworICAgIG1pbl9kcmlmdF8gPSBzdGQ6Om1pbihkcmlmdCwgbWluX2RyaWZ0Xyk7CisgICAgbWF4X2RyaWZ0XyA9IHN0ZDo6bWF4KGRyaWZ0LCBtYXhfZHJpZnRfKTsKICAgICBTQl9MT0coRVJST1IpIDw8ICJNZWRpYSB0aW1lIHN0YXRzOiAoIiA8PCBub3cgPDwgIi0iCiAgICAgICAgICAgICAgICAgICA8PCBmcmFtZXNfY29uc3VtZWRfc2V0X2F0XyA8PCAiPSIgPDwgZWxhc3BlZF9zaW5jZV9sYXN0X3NldAogICAgICAgICAgICAgICAgICAgPDwgIikgKyAiIDw8IHRvdGFsX2ZyYW1lc19jb25zdW1lZF8gPDwgIiA9PiAiIDw8IGZyYW1lc19wbGF5ZWQKLSAgICAgICAgICAgICAgICAgIDw8ICIgPT4gIiA8PCBtZWRpYV90aW1lIDw8ICIgIGRpZmY6ICIgPDwgZGlmZiA8PCAiLyIKLSAgICAgICAgICAgICAgICAgIDw8IG1heF9vZmZzZXRfZGlmZmVyZW5jZV87CisgICAgICAgICAgICAgICAgICA8PCAiID0+ICIgPDwgbWVkaWFfdGltZSA8PCAiICBkcmlmdDogIiA8PCBkcmlmdCA8PCAiLyAoIgorICAgICAgICAgICAgICAgICAgPDwgbWluX2RyaWZ0XyA8PCAiLCAiIDw8IG1heF9kcmlmdF8gPDwgIikgIgorICAgICAgICAgICAgICAgICAgLy8gSG93IGxvbmcgdGhlIGF1ZGlvIGZyYW1lcyBsZWZ0IGluIHNpbmsgY2FuIGJlIHBsYXllZC4KKyAgICAgICAgICAgICAgICAgIDw8IChmcmFtZXNfc2VudF90b19zaW5rXyAtIGZyYW1lc19jb25zdW1lZF9ieV9zaW5rXykgKgorICAgICAgICAgICAgICAgICAgICAgICAgIGtTYlRpbWVTZWNvbmQgLyBzYW1wbGVzX3Blcl9zZWNvbmQ7CiAgIH0KICNlbmRpZiAgLy8gU0JfTE9HX01FRElBX1RJTUVfU1RBVFMKIApAQCAtMzc0LDYgKzM5NCwyMCBAQAogICB9IGVsc2UgewogICAgICpmcmFtZXNfaW5fYnVmZmVyID0gKm9mZnNldF9pbl9mcmFtZXMgPSAwOwogICB9CisKKyAgaWYgKCppc19lb3NfcmVhY2hlZCAmJiAqZnJhbWVzX2luX2J1ZmZlciA8IG1heF9jYWNoZWRfZnJhbWVzXykgeworICAgIC8vIEZpbGwgc2lsZW5jZSBmcmFtZXMgb24gRU9TIHRvIGVuc3VyZSBrZWVwIHRoZSBhdWRpbyBzaW5rIHBsYXlpbmcuCisgICAgYXV0byBzaWxlbmNlX2ZyYW1lc190b193cml0ZSA9IHN0ZDo6bWluKAorICAgICAgICBtYXhfY2FjaGVkX2ZyYW1lc18gLSAqZnJhbWVzX2luX2J1ZmZlciwgbWF4X2ZyYW1lc19wZXJfYXBwZW5kXyk7CisgICAgYXV0byBzdGFydF9vZmZzZXQgPQorICAgICAgICAoKm9mZnNldF9pbl9mcmFtZXMgKyAqZnJhbWVzX2luX2J1ZmZlcikgJSBtYXhfY2FjaGVkX2ZyYW1lc187CisgICAgc2lsZW5jZV9mcmFtZXNfdG9fd3JpdGUgPQorICAgICAgICBzdGQ6Om1pbihzaWxlbmNlX2ZyYW1lc190b193cml0ZSwgbWF4X2NhY2hlZF9mcmFtZXNfIC0gc3RhcnRfb2Zmc2V0KTsKKyAgICBTYk1lbW9yeVNldChmcmFtZV9idWZmZXJfLmRhdGEoKSArIHN0YXJ0X29mZnNldCAqIGJ5dGVzX3Blcl9mcmFtZV8sIDAsCisgICAgICAgICAgICAgICAgc2lsZW5jZV9mcmFtZXNfdG9fd3JpdGUgKiBieXRlc19wZXJfZnJhbWVfKTsKKyAgICBzaWxlbmNlX2ZyYW1lc193cml0dGVuX2FmdGVyX2Vvc19vbl9zaW5rX3RocmVhZF8gKz0gc2lsZW5jZV9mcmFtZXNfdG9fd3JpdGU7CisgICAgKmZyYW1lc19pbl9idWZmZXIgKz0gc2lsZW5jZV9mcmFtZXNfdG9fd3JpdGU7CisgIH0KIH0KIAogdm9pZCBBdWRpb1JlbmRlcmVyOjpDb25zdW1lRnJhbWVzKGludCBmcmFtZXNfY29uc3VtZWQKQEAgLTQxMiwyMSArNDQ2LDMwIEBACiAgIG11dGV4Xy5EQ2hlY2tBY3F1aXJlZCgpOwogCiAgIGlmIChmcmFtZXNfY29uc3VtZWRfb25fc2lua190aHJlYWRfID4gMCkgewotICAgIGZyYW1lc19jb25zdW1lZF9ieV9zaW5rXyArPSBmcmFtZXNfY29uc3VtZWRfb25fc2lua190aHJlYWRfOwotICAgIFNCX0RDSEVDSyhmcmFtZXNfY29uc3VtZWRfYnlfc2lua18gPD0gZnJhbWVzX3NlbnRfdG9fc2lua18pOworICAgIFNCX0RDSEVDSyhmcmFtZXNfY29uc3VtZWRfYnlfc2lua18gKyBmcmFtZXNfY29uc3VtZWRfb25fc2lua190aHJlYWRfIDw9CisgICAgICAgICAgICAgIGZyYW1lc19zZW50X3RvX3NpbmtfICsKKyAgICAgICAgICAgICAgICAgIHNpbGVuY2VfZnJhbWVzX3dyaXR0ZW5fYWZ0ZXJfZW9zX29uX3NpbmtfdGhyZWFkXyk7CisgICAgYXV0byBub25fc2lsZW5jZV9mcmFtZXNfY29uc3VtZWQgPQorICAgICAgICBzdGQ6Om1pbihmcmFtZXNfc2VudF90b19zaW5rXyAtIGZyYW1lc19jb25zdW1lZF9ieV9zaW5rXywKKyAgICAgICAgICAgICAgICAgZnJhbWVzX2NvbnN1bWVkX29uX3NpbmtfdGhyZWFkXyk7CisgICAgZnJhbWVzX2NvbnN1bWVkX2J5X3NpbmtfICs9IG5vbl9zaWxlbmNlX2ZyYW1lc19jb25zdW1lZDsKICAgICBmcmFtZXNfY29uc3VtZWRfYnlfc2lua19zaW5jZV9sYXN0X2dldF9jdXJyZW50X3RpbWVfICs9Ci0gICAgICAgIGZyYW1lc19jb25zdW1lZF9vbl9zaW5rX3RocmVhZF87Ci0gICAgZnJhbWVzX2NvbnN1bWVkX3NldF9hdF8gPSBzeXN0ZW1fdGltZV9vbl9jb25zdW1lX2ZyYW1lczsKKyAgICAgICAgbm9uX3NpbGVuY2VfZnJhbWVzX2NvbnN1bWVkOworICAgIGlmIChub25fc2lsZW5jZV9mcmFtZXNfY29uc3VtZWQgIT0gMCkgeworICAgICAgZnJhbWVzX2NvbnN1bWVkX3NldF9hdF8gPSBzeXN0ZW1fdGltZV9vbl9jb25zdW1lX2ZyYW1lczsKKyAgICB9CiAgICAgY29uc3VtZV9mcmFtZXNfY2FsbGVkXyA9IHRydWU7Ci0gICAgZnJhbWVzX2NvbnN1bWVkX29uX3NpbmtfdGhyZWFkXyA9IDA7CisgICAgZnJhbWVzX2NvbnN1bWVkX29uX3NpbmtfdGhyZWFkXyAtPSBub25fc2lsZW5jZV9mcmFtZXNfY29uc3VtZWQ7CiAgIH0KIAogICBpc19lb3NfcmVhY2hlZF9vbl9zaW5rX3RocmVhZF8gPSBlb3Nfc3RhdGVfID49IGtFT1NTZW50VG9TaW5rOwogICBpc19wbGF5aW5nX29uX3NpbmtfdGhyZWFkXyA9ICFwYXVzZWRfICYmICFzZWVraW5nXzsKLSAgZnJhbWVzX2luX2J1ZmZlcl9vbl9zaW5rX3RocmVhZF8gPQotICAgICAgc3RhdGljX2Nhc3Q8aW50PihmcmFtZXNfc2VudF90b19zaW5rXyAtIGZyYW1lc19jb25zdW1lZF9ieV9zaW5rXyk7CisgIGZyYW1lc19pbl9idWZmZXJfb25fc2lua190aHJlYWRfID0gc3RhdGljX2Nhc3Q8aW50PigKKyAgICAgIGZyYW1lc19zZW50X3RvX3NpbmtfICsgc2lsZW5jZV9mcmFtZXNfd3JpdHRlbl9hZnRlcl9lb3Nfb25fc2lua190aHJlYWRfIC0KKyAgICAgIGZyYW1lc19jb25zdW1lZF9ieV9zaW5rXyAtIGZyYW1lc19jb25zdW1lZF9vbl9zaW5rX3RocmVhZF8pOwogICBvZmZzZXRfaW5fZnJhbWVzX29uX3NpbmtfdGhyZWFkXyA9Ci0gICAgICBmcmFtZXNfY29uc3VtZWRfYnlfc2lua18gJSBtYXhfY2FjaGVkX2ZyYW1lc187CisgICAgICAoZnJhbWVzX2NvbnN1bWVkX2J5X3NpbmtfICsgZnJhbWVzX2NvbnN1bWVkX29uX3NpbmtfdGhyZWFkXykgJQorICAgICAgbWF4X2NhY2hlZF9mcmFtZXNfOwogfQogCiB2b2lkIEF1ZGlvUmVuZGVyZXI6Ok9uRmlyc3RPdXRwdXQoKSB7CkBAIC00MzYsMTggKzQ3OSwxOCBAQAogICBpbnQgZGVzdGluYXRpb25fc2FtcGxlX3JhdGUgPQogICAgICAgYXVkaW9fcmVuZGVyZXJfc2lua18tPkdldE5lYXJlc3RTdXBwb3J0ZWRTYW1wbGVGcmVxdWVuY3koCiAgICAgICAgICAgKmRlY29kZXJfc2FtcGxlX3JhdGVfKTsKLSAgdGltZV9zdHJldGNoZXJfLkluaXRpYWxpemUoY2hhbm5lbHNfLCBkZXN0aW5hdGlvbl9zYW1wbGVfcmF0ZSk7CisgIHRpbWVfc3RyZXRjaGVyXy5Jbml0aWFsaXplKHNpbmtfc2FtcGxlX3R5cGVfLCBjaGFubmVsc18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uX3NhbXBsZV9yYXRlKTsKIAogICBTYk1lZGlhQXVkaW9TYW1wbGVUeXBlIHNvdXJjZV9zYW1wbGVfdHlwZSA9IGRlY29kZXJfLT5HZXRTYW1wbGVUeXBlKCk7CiAgIFNiTWVkaWFBdWRpb0ZyYW1lU3RvcmFnZVR5cGUgc291cmNlX3N0b3JhZ2VfdHlwZSA9IGRlY29kZXJfLT5HZXRTdG9yYWdlVHlwZSgpOwogCi0gIC8vIEF1ZGlvVGltZVN0cmV0Y2hlciBvbmx5IHN1cHBvcnRzIGludGVybGVhdmVkIGZsb2F0MzIgc2FtcGxlcy4KICAgaWYgKCpkZWNvZGVyX3NhbXBsZV9yYXRlXyAhPSBkZXN0aW5hdGlvbl9zYW1wbGVfcmF0ZSB8fAotICAgICAgc291cmNlX3NhbXBsZV90eXBlICE9IGtTYk1lZGlhQXVkaW9TYW1wbGVUeXBlRmxvYXQzMiB8fAorICAgICAgc291cmNlX3NhbXBsZV90eXBlICE9IHNpbmtfc2FtcGxlX3R5cGVfIHx8CiAgICAgICBzb3VyY2Vfc3RvcmFnZV90eXBlICE9IGtTYk1lZGlhQXVkaW9GcmFtZVN0b3JhZ2VUeXBlSW50ZXJsZWF2ZWQpIHsKICAgICByZXNhbXBsZXJfID0gQXVkaW9SZXNhbXBsZXI6OkNyZWF0ZSgKICAgICAgICAgZGVjb2Rlcl8tPkdldFNhbXBsZVR5cGUoKSwgZGVjb2Rlcl8tPkdldFN0b3JhZ2VUeXBlKCksCi0gICAgICAgICpkZWNvZGVyX3NhbXBsZV9yYXRlXywga1NiTWVkaWFBdWRpb1NhbXBsZVR5cGVGbG9hdDMyLAorICAgICAgICAqZGVjb2Rlcl9zYW1wbGVfcmF0ZV8sIHNpbmtfc2FtcGxlX3R5cGVfLAogICAgICAgICBrU2JNZWRpYUF1ZGlvRnJhbWVTdG9yYWdlVHlwZUludGVybGVhdmVkLCBkZXN0aW5hdGlvbl9zYW1wbGVfcmF0ZSwKICAgICAgICAgY2hhbm5lbHNfKTsKICAgICBTQl9EQ0hFQ0socmVzYW1wbGVyXyk7CkBAIC01NDksNyArNTkyLDEwIEBACiAgICAgICB7CiAgICAgICAgIFNjb3BlZExvY2sgbG9jayhtdXRleF8pOwogICAgICAgICBlb3Nfc3RhdGVfID0ga0VPU0RlY29kZWQ7Ci0gICAgICAgIHNlZWtpbmdfID0gZmFsc2U7CisgICAgICAgIGlmIChzZWVraW5nXykgeworICAgICAgICAgIHNlZWtpbmdfID0gZmFsc2U7CisgICAgICAgICAgU2NoZWR1bGUocHJlcm9sbGVkX2NiXyk7CisgICAgICAgIH0KICAgICAgIH0KIAogICAgICAgcmVzYW1wbGVkX2F1ZGlvID0gcmVzYW1wbGVyXy0+V3JpdGVFbmRPZlN0cmVhbSgpOwpAQCAtNjAwLDYgKzY0Niw3IEBACiAgIGlmIChzZWVraW5nXyAmJiB0aW1lX3N0cmV0Y2hlcl8uSXNRdWV1ZUZ1bGwoKSkgewogICAgIFNjb3BlZExvY2sgbG9jayhtdXRleF8pOwogICAgIHNlZWtpbmdfID0gZmFsc2U7CisgICAgU2NoZWR1bGUocHJlcm9sbGVkX2NiXyk7CiAgIH0KIAogICBpZiAoc2Vla2luZ18gfHwgcGxheWJhY2tfcmF0ZV8gPT0gMC4wKSB7CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9hdWRpb19yZW5kZXJlcl9pbnRlcm5hbC5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fcmVuZGVyZXJfaW50ZXJuYWwuaAppbmRleCAxM2E5MmU5Li45NzVjYzQyIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9hdWRpb19yZW5kZXJlcl9pbnRlcm5hbC5oCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2F1ZGlvX3JlbmRlcmVyX2ludGVybmFsLmgKQEAgLTY2LDE4ICs2NiwyMiBAQAogICAgICAgICAgICAgICAgIGludCBtYXhfZnJhbWVzX3Blcl9hcHBlbmQpOwogICB+QXVkaW9SZW5kZXJlcigpOwogCi0gIHZvaWQgSW5pdGlhbGl6ZShjb25zdCBBdWRpb0RlY29kZXI6OkVycm9yQ0ImIGVycm9yX2NiKTsKICAgdm9pZCBXcml0ZVNhbXBsZShjb25zdCBzY29wZWRfcmVmcHRyPElucHV0QnVmZmVyPiYgaW5wdXRfYnVmZmVyKTsKICAgdm9pZCBXcml0ZUVuZE9mU3RyZWFtKCk7CiAKICAgdm9pZCBTZXRWb2x1bWUoZG91YmxlIHZvbHVtZSk7CiAKKyAgLy8gVE9ETzogUmVtb3ZlIHRoZSBlb3Mgc3RhdGUgcXVlcnlpbmcgZnVuY3Rpb25zIGFuZCB0aGVpciB0ZXN0cy4KICAgYm9vbCBJc0VuZE9mU3RyZWFtV3JpdHRlbigpIGNvbnN0OwogICBib29sIElzRW5kT2ZTdHJlYW1QbGF5ZWQoKSBjb25zdDsKICAgYm9vbCBDYW5BY2NlcHRNb3JlRGF0YSgpIGNvbnN0OworICAvLyBUT0RPOiBSZW1vdmUgdGhlIGZvbGxvd2luZyBmdW5jdGlvbiBhbmQgaXRzIHRlc3RzLgogICBib29sIElzU2Vla2luZ0luUHJvZ3Jlc3MoKSBjb25zdDsKIAogICAvLyBNZWRpYVRpbWVQcm92aWRlciBtZXRob2RzCisgIHZvaWQgSW5pdGlhbGl6ZShjb25zdCBFcnJvckNCJiBlcnJvcl9jYiwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFByZXJvbGxlZENCJiBwcmVyb2xsZWRfY2IsCisgICAgICAgICAgICAgICAgICBjb25zdCBFbmRlZENCJiBlbmRlZF9jYikgb3ZlcnJpZGU7CiAgIHZvaWQgUGxheSgpIG92ZXJyaWRlOwogICB2b2lkIFBhdXNlKCkgb3ZlcnJpZGU7CiAgIHZvaWQgU2V0UGxheWJhY2tSYXRlKGRvdWJsZSBwbGF5YmFja19yYXRlKSBvdmVycmlkZTsKQEAgLTk1LDYgKzk5LDkgQEAKICAgY29uc3QgaW50IG1heF9jYWNoZWRfZnJhbWVzXzsKICAgY29uc3QgaW50IG1heF9mcmFtZXNfcGVyX2FwcGVuZF87CiAKKyAgUHJlcm9sbGVkQ0IgcHJlcm9sbGVkX2NiXzsKKyAgRW5kZWRDQiBlbmRlZF9jYl87CisKICAgTXV0ZXggbXV0ZXhfOwogCiAgIGJvb2wgcGF1c2VkXzsKQEAgLTEwMyw2ICsxMTAsNyBAQAogICBTYlRpbWUgc2Vla2luZ190b190aW1lXzsKICAgU2JUaW1lIGxhc3RfbWVkaWFfdGltZV87CiAgIEF1ZGlvRnJhbWVUcmFja2VyIGF1ZGlvX2ZyYW1lX3RyYWNrZXJfOworICBib29sIGVuZGVkX2NiX2NhbGxlZF87CiAKICAgaW50NjRfdCBmcmFtZXNfc2VudF90b19zaW5rXzsKICAgaW50NjRfdCBmcmFtZXNfY29uc3VtZWRfYnlfc2lua187CkBAIC0xNjksMTAgKzE3NywxMiBAQAogICBpbnQ2NF90IG9mZnNldF9pbl9mcmFtZXNfb25fc2lua190aHJlYWRfID0gMDsKICAgaW50NjRfdCBmcmFtZXNfY29uc3VtZWRfb25fc2lua190aHJlYWRfID0gMDsKICAgU2JUaW1lIGZyYW1lc19jb25zdW1lZF9zZXRfYXRfb25fc2lua190aHJlYWRfID0gMDsKKyAgaW50NjRfdCBzaWxlbmNlX2ZyYW1lc193cml0dGVuX2FmdGVyX2Vvc19vbl9zaW5rX3RocmVhZF8gPSAwOwogCiAjaWYgU0JfTE9HX01FRElBX1RJTUVfU1RBVFMKICAgU2JUaW1lIHN5c3RlbV9hbmRfbWVkaWFfdGltZV9vZmZzZXRfID0gLTE7Ci0gIFNiVGltZSBtYXhfb2Zmc2V0X2RpZmZlcmVuY2VfID0gMDsKKyAgU2JUaW1lIG1pbl9kcmlmdF8gPSBrU2JUaW1lTWF4OworICBTYlRpbWUgbWF4X2RyaWZ0XyA9IDA7CiAgIGludDY0X3QgdG90YWxfZnJhbWVzX2NvbnN1bWVkXyA9IDA7CiAjZW5kaWYgIC8vIFNCX0xPR19NRURJQV9USU1FX1NUQVRTCiB9OwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fdGltZV9zdHJldGNoZXIuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9hdWRpb190aW1lX3N0cmV0Y2hlci5jYwppbmRleCA0ZjJjYmY1Li4xMWRkMWJiIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9hdWRpb190aW1lX3N0cmV0Y2hlci5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9hdWRpb190aW1lX3N0cmV0Y2hlci5jYwpAQCAtMjMsNiArMjMsNyBAQAogCiAjaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9tZWRpYS9tZWRpYV91dGlsLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci93c29sYV9pbnRlcm5hbC5oIgogCiBuYW1lc3BhY2Ugc3RhcmJvYXJkIHsKQEAgLTgxLDcgKzgyLDggQEAKIHN0YXRpYyBjb25zdCBpbnQga1N0YXJ0aW5nQ2FwYWNpdHlJbk1zID0gMjAwOwogCiBBdWRpb1RpbWVTdHJldGNoZXI6OkF1ZGlvVGltZVN0cmV0Y2hlcigpCi0gICAgOiBjaGFubmVsc18oMCksCisgICAgOiBzYW1wbGVfdHlwZV8oa1NiTWVkaWFBdWRpb1NhbXBsZVR5cGVGbG9hdDMyKSwKKyAgICAgIGNoYW5uZWxzXygwKSwKICAgICAgIGJ5dGVzX3Blcl9mcmFtZV8oMCksCiAgICAgICBzYW1wbGVzX3Blcl9zZWNvbmRfKDApLAogICAgICAgbXV0ZWRfcGFydGlhbF9mcmFtZV8oMCksCkBAIC05OSw5ICsxMDEsMTIgQEAKIAogQXVkaW9UaW1lU3RyZXRjaGVyOjp+QXVkaW9UaW1lU3RyZXRjaGVyKCkge30KIAotdm9pZCBBdWRpb1RpbWVTdHJldGNoZXI6OkluaXRpYWxpemUoaW50IGNoYW5uZWxzLCBpbnQgc2FtcGxlc19wZXJfc2Vjb25kKSB7Cit2b2lkIEF1ZGlvVGltZVN0cmV0Y2hlcjo6SW5pdGlhbGl6ZShTYk1lZGlhQXVkaW9TYW1wbGVUeXBlIHNhbXBsZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNhbXBsZXNfcGVyX3NlY29uZCkgeworICBzYW1wbGVfdHlwZV8gPSBzYW1wbGVfdHlwZTsKICAgY2hhbm5lbHNfID0gY2hhbm5lbHM7Ci0gIGJ5dGVzX3Blcl9mcmFtZV8gPSBzaXplb2YoZmxvYXQpICogY2hhbm5lbHNfOworICBieXRlc19wZXJfZnJhbWVfID0gbWVkaWE6OkdldEJ5dGVzUGVyU2FtcGxlKHNhbXBsZV90eXBlXykgKiBjaGFubmVsc187CiAgIHNhbXBsZXNfcGVyX3NlY29uZF8gPSBzYW1wbGVzX3Blcl9zZWNvbmQ7CiAgIGluaXRpYWxfY2FwYWNpdHlfID0gY2FwYWNpdHlfID0KICAgICAgIENvbnZlcnRNaWxsaXNlY29uZHNUb0ZyYW1lcyhrU3RhcnRpbmdDYXBhY2l0eUluTXMpOwpAQCAtMTQ0LDIyICsxNDksMjAgQEAKICAgaW50ZXJuYWw6OkdldFN5bW1ldHJpY0hhbm5pbmdXaW5kb3coMiAqIG9sYV93aW5kb3dfc2l6ZV8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25fd2luZG93Xy5nZXQoKSk7CiAKLSAgd3NvbGFfb3V0cHV0XyA9Ci0gICAgICBuZXcgRGVjb2RlZEF1ZGlvKGNoYW5uZWxzXywga1NiTWVkaWFBdWRpb1NhbXBsZVR5cGVGbG9hdDMyLAotICAgICAgICAgICAgICAgICAgICAgICBrU2JNZWRpYUF1ZGlvRnJhbWVTdG9yYWdlVHlwZUludGVybGVhdmVkLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAob2xhX3dpbmRvd19zaXplXyArIG9sYV9ob3Bfc2l6ZV8pICogYnl0ZXNfcGVyX2ZyYW1lXyk7CisgIHdzb2xhX291dHB1dF8gPSBuZXcgRGVjb2RlZEF1ZGlvKAorICAgICAgY2hhbm5lbHNfLCBzYW1wbGVfdHlwZV8sIGtTYk1lZGlhQXVkaW9GcmFtZVN0b3JhZ2VUeXBlSW50ZXJsZWF2ZWQsIDAsCisgICAgICAob2xhX3dpbmRvd19zaXplXyArIG9sYV9ob3Bfc2l6ZV8pICogYnl0ZXNfcGVyX2ZyYW1lXyk7CiAgIC8vIEluaXRpYWxpemUgZm9yIG92ZXJsYXAtYW5kLWFkZCBvZiB0aGUgZmlyc3QgYmxvY2suCiAgIFNiTWVtb3J5U2V0KHdzb2xhX291dHB1dF8tPmJ1ZmZlcigpLCAwLCB3c29sYV9vdXRwdXRfLT5zaXplKCkpOwogCiAgIC8vIEF1eGlsaWFyeSBjb250YWluZXJzLgotICBvcHRpbWFsX2Jsb2NrXyA9IG5ldyBEZWNvZGVkQXVkaW8oY2hhbm5lbHNfLCBrU2JNZWRpYUF1ZGlvU2FtcGxlVHlwZUZsb2F0MzIsCisgIG9wdGltYWxfYmxvY2tfID0gbmV3IERlY29kZWRBdWRpbyhjaGFubmVsc18sIHNhbXBsZV90eXBlXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtTYk1lZGlhQXVkaW9GcmFtZVN0b3JhZ2VUeXBlSW50ZXJsZWF2ZWQsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGFfd2luZG93X3NpemVfICogYnl0ZXNfcGVyX2ZyYW1lXyk7CiAgIHNlYXJjaF9ibG9ja18gPSBuZXcgRGVjb2RlZEF1ZGlvKAotICAgICAgY2hhbm5lbHNfLCBrU2JNZWRpYUF1ZGlvU2FtcGxlVHlwZUZsb2F0MzIsCi0gICAgICBrU2JNZWRpYUF1ZGlvRnJhbWVTdG9yYWdlVHlwZUludGVybGVhdmVkLCAwLAorICAgICAgY2hhbm5lbHNfLCBzYW1wbGVfdHlwZV8sIGtTYk1lZGlhQXVkaW9GcmFtZVN0b3JhZ2VUeXBlSW50ZXJsZWF2ZWQsIDAsCiAgICAgICAobnVtX2NhbmRpZGF0ZV9ibG9ja3NfICsgKG9sYV93aW5kb3dfc2l6ZV8gLSAxKSkgKiBieXRlc19wZXJfZnJhbWVfKTsKLSAgdGFyZ2V0X2Jsb2NrXyA9IG5ldyBEZWNvZGVkQXVkaW8oY2hhbm5lbHNfLCBrU2JNZWRpYUF1ZGlvU2FtcGxlVHlwZUZsb2F0MzIsCisgIHRhcmdldF9ibG9ja18gPSBuZXcgRGVjb2RlZEF1ZGlvKGNoYW5uZWxzXywgc2FtcGxlX3R5cGVfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrU2JNZWRpYUF1ZGlvRnJhbWVTdG9yYWdlVHlwZUludGVybGVhdmVkLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGFfd2luZG93X3NpemVfICogYnl0ZXNfcGVyX2ZyYW1lXyk7CiB9CkBAIC0xNjksMTAgKzE3Miw5IEBACiAgIFNCX0RDSEVDSyhieXRlc19wZXJfZnJhbWVfID4gMCk7CiAgIFNCX0RDSEVDSyhwbGF5YmFja19yYXRlID49IDApOwogCi0gIHNjb3BlZF9yZWZwdHI8RGVjb2RlZEF1ZGlvPiBkZXN0ID0KLSAgICAgIG5ldyBEZWNvZGVkQXVkaW8oY2hhbm5lbHNfLCBrU2JNZWRpYUF1ZGlvU2FtcGxlVHlwZUZsb2F0MzIsCi0gICAgICAgICAgICAgICAgICAgICAgIGtTYk1lZGlhQXVkaW9GcmFtZVN0b3JhZ2VUeXBlSW50ZXJsZWF2ZWQsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZF9mcmFtZXMgKiBieXRlc19wZXJfZnJhbWVfKTsKKyAgc2NvcGVkX3JlZnB0cjxEZWNvZGVkQXVkaW8+IGRlc3QgPSBuZXcgRGVjb2RlZEF1ZGlvKAorICAgICAgY2hhbm5lbHNfLCBzYW1wbGVfdHlwZV8sIGtTYk1lZGlhQXVkaW9GcmFtZVN0b3JhZ2VUeXBlSW50ZXJsZWF2ZWQsIDAsCisgICAgICByZXF1ZXN0ZWRfZnJhbWVzICogYnl0ZXNfcGVyX2ZyYW1lXyk7CiAKICAgaWYgKHBsYXliYWNrX3JhdGUgPT0gMCkgewogICAgIGRlc3QtPlNocmlua1RvKDApOwpAQCAtMzgyLDcgKzM4NCw2IEBACiAgICAgLy8gfHNlYXJjaF9ibG9ja198LgogICAgIG9wdGltYWxfaW5kZXggPSBpbnRlcm5hbDo6T3B0aW1hbEluZGV4KAogICAgICAgICBzZWFyY2hfYmxvY2tfLmdldCgpLCB0YXJnZXRfYmxvY2tfLmdldCgpLAotICAgICAgICBrU2JNZWRpYUF1ZGlvU2FtcGxlVHlwZUZsb2F0MzIsCiAgICAgICAgIGtTYk1lZGlhQXVkaW9GcmFtZVN0b3JhZ2VUeXBlSW50ZXJsZWF2ZWQsIGV4Y2x1ZGVfaXRlcnZhbCk7CiAKICAgICAvLyBUcmFuc2xhdGUgfGluZGV4fCB3LnIudC4gdGhlIGJlZ2lubmluZyBvZiB8YXVkaW9fYnVmZmVyX3wgYW5kIGV4dHJhY3QgdGhlCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9hdWRpb190aW1lX3N0cmV0Y2hlci5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fdGltZV9zdHJldGNoZXIuaAppbmRleCA4ZmY2MDMzLi5jOGI5NGYxIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9hdWRpb190aW1lX3N0cmV0Y2hlci5oCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2F1ZGlvX3RpbWVfc3RyZXRjaGVyLmgKQEAgLTUzLDcgKzUzLDkgQEAKICAgfkF1ZGlvVGltZVN0cmV0Y2hlcigpOwogCiAgIC8vIEluaXRpYWxpemVzIHRoaXMgb2JqZWN0IHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIGF1ZGlvIHN0cmVhbS4KLSAgdm9pZCBJbml0aWFsaXplKGludCBjaGFubmVscywgaW50IHNhbXBsZXNfcGVyX3NlY29uZCk7CisgIHZvaWQgSW5pdGlhbGl6ZShTYk1lZGlhQXVkaW9TYW1wbGVUeXBlIHNhbXBsZV90eXBlLAorICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgaW50IHNhbXBsZXNfcGVyX3NlY29uZCk7CiAKICAgLy8gVHJpZXMgdG8gZmlsbCB8cmVxdWVzdGVkX2ZyYW1lc3wgZnJhbWVzIGludG8gfGRlc3R8IHdpdGggcG9zc2libHkgc2NhbGVkCiAgIC8vIGRhdGEgZnJvbSBvdXIgfGF1ZGlvX2J1ZmZlcl98LiBEYXRhIGlzIHNjYWxlZCBiYXNlZCBvbiB8cGxheWJhY2tfcmF0ZXwsCkBAIC0xMjYsNiArMTI4LDkgQEAKICAgLy8gQ29udmVydHMgYSB0aW1lIGluIG1pbGxpc2Vjb25kcyB0byBmcmFtZXMgdXNpbmcgfHNhbXBsZXNfcGVyX3NlY29uZF98LgogICBpbnQgQ29udmVydE1pbGxpc2Vjb25kc1RvRnJhbWVzKGludCBtcykgY29uc3Q7CiAKKyAgLy8gQXVkaW8gc2luayBzYW1wbGUgdHlwZS4KKyAgU2JNZWRpYUF1ZGlvU2FtcGxlVHlwZSBzYW1wbGVfdHlwZV87CisKICAgLy8gTnVtYmVyIG9mIGNoYW5uZWxzIGluIGF1ZGlvIHN0cmVhbS4KICAgaW50IGNoYW5uZWxzXzsKIApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvY2FsbGJhY2suaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2NhbGxiYWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBjYzYxNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2NhbGxiYWNrLmgKQEAgLTAsMCArMSwzNiBAQAorLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBTVEFSQk9BUkRfU0hBUkVEX1NUQVJCT0FSRF9QTEFZRVJfRklMVEVSX0NBTExCQUNLX0hfCisjZGVmaW5lIFNUQVJCT0FSRF9TSEFSRURfU1RBUkJPQVJEX1BMQVlFUl9GSUxURVJfQ0FMTEJBQ0tfSF8KKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKK25hbWVzcGFjZSBzdGFyYm9hcmQgeworbmFtZXNwYWNlIHNoYXJlZCB7CituYW1lc3BhY2Ugc3RhcmJvYXJkIHsKK25hbWVzcGFjZSBwbGF5ZXIgeworbmFtZXNwYWNlIGZpbHRlciB7CisKK3R5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IEVycm9yQ0I7Cit0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBQcmVyb2xsZWRDQjsKK3R5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IEVuZGVkQ0I7CisKK30gIC8vIG5hbWVzcGFjZSBmaWx0ZXIKK30gIC8vIG5hbWVzcGFjZSBwbGF5ZXIKK30gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKK30gIC8vIG5hbWVzcGFjZSBzaGFyZWQKK30gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKKworI2VuZGlmICAvLyBTVEFSQk9BUkRfU0hBUkVEX1NUQVJCT0FSRF9QTEFZRVJfRklMVEVSX0NBTExCQUNLX0hfCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9kZWNvZGVkX2F1ZGlvX3F1ZXVlLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvZGVjb2RlZF9hdWRpb19xdWV1ZS5jYwppbmRleCA1MDk0NTNmLi5lYjBmMDgyIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9kZWNvZGVkX2F1ZGlvX3F1ZXVlLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2RlY29kZWRfYXVkaW9fcXVldWUuY2MKQEAgLTQzLDcgKzQzLDYgQEAKIAogdm9pZCBEZWNvZGVkQXVkaW9RdWV1ZTo6QXBwZW5kKAogICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVjb2RlZEF1ZGlvPiYgZGVjb2RlZF9hdWRpbykgewotICBTQl9EQ0hFQ0soZGVjb2RlZF9hdWRpby0+c2FtcGxlX3R5cGUoKSA9PSBrU2JNZWRpYUF1ZGlvU2FtcGxlVHlwZUZsb2F0MzIpOwogICBTQl9EQ0hFQ0soZGVjb2RlZF9hdWRpby0+c3RvcmFnZV90eXBlKCkgPT0KICAgICAgICAgICAgIGtTYk1lZGlhQXVkaW9GcmFtZVN0b3JhZ2VUeXBlSW50ZXJsZWF2ZWQpCiAgICAgICA8PCBkZWNvZGVkX2F1ZGlvLT5zdG9yYWdlX3R5cGUoKTsKQEAgLTExNiwxMSArMTE1LDIxIEBACiAgICAgICAvLyBpZiB8ZGVzdHwgaXMgTlVMTCwgdGhlcmUncyBubyBuZWVkIHRvIGNvcHkuCiAgICAgICBpZiAoZGVzdCkgewogICAgICAgICBTQl9EQ0hFQ0soYnVmZmVyLT5jaGFubmVscygpID09IGRlc3QtPmNoYW5uZWxzKCkpOwotICAgICAgICBjb25zdCBmbG9hdCogc291cmNlID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmbG9hdCo+KGJ1ZmZlci0+YnVmZmVyKCkpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+Y2hhbm5lbHMoKSAqIGN1cnJlbnRfYnVmZmVyX29mZnNldDsKLSAgICAgICAgZmxvYXQqIGRlc3RpbmF0aW9uID0gcmVpbnRlcnByZXRfY2FzdDxmbG9hdCo+KGRlc3QtPmJ1ZmZlcigpKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QtPmNoYW5uZWxzKCkgKiAoZGVzdF9mcmFtZV9vZmZzZXQgKyB0YWtlbik7Ci0gICAgICAgIFNiTWVtb3J5Q29weShkZXN0aW5hdGlvbiwgc291cmNlLCBjb3BpZWQgKiBkZXN0LT5jaGFubmVscygpICogNCk7CisgICAgICAgIGlmIChkZXN0LT5zYW1wbGVfdHlwZSgpID09IGtTYk1lZGlhQXVkaW9TYW1wbGVUeXBlRmxvYXQzMikgeworICAgICAgICAgIGNvbnN0IGZsb2F0KiBzb3VyY2UgPQorICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0Kj4oYnVmZmVyLT5idWZmZXIoKSkgKworICAgICAgICAgICAgICBidWZmZXItPmNoYW5uZWxzKCkgKiBjdXJyZW50X2J1ZmZlcl9vZmZzZXQ7CisgICAgICAgICAgZmxvYXQqIGRlc3RpbmF0aW9uID0gcmVpbnRlcnByZXRfY2FzdDxmbG9hdCo+KGRlc3QtPmJ1ZmZlcigpKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdC0+Y2hhbm5lbHMoKSAqIChkZXN0X2ZyYW1lX29mZnNldCArIHRha2VuKTsKKyAgICAgICAgICBTYk1lbW9yeUNvcHkoZGVzdGluYXRpb24sIHNvdXJjZSwgY29waWVkICogZGVzdC0+Y2hhbm5lbHMoKSAqIDQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNvbnN0IGludDE2X3QqIHNvdXJjZSA9CisgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgaW50MTZfdCo+KGJ1ZmZlci0+YnVmZmVyKCkpICsKKyAgICAgICAgICAgICAgYnVmZmVyLT5jaGFubmVscygpICogY3VycmVudF9idWZmZXJfb2Zmc2V0OworICAgICAgICAgIGludDE2X3QqIGRlc3RpbmF0aW9uID0gcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90Kj4oZGVzdC0+YnVmZmVyKCkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QtPmNoYW5uZWxzKCkgKiAoZGVzdF9mcmFtZV9vZmZzZXQgKyB0YWtlbik7CisgICAgICAgICAgU2JNZW1vcnlDb3B5KGRlc3RpbmF0aW9uLCBzb3VyY2UsIGNvcGllZCAqIGRlc3QtPmNoYW5uZWxzKCkgKiAyKTsKKyAgICAgICAgfQogICAgICAgfQogCiAgICAgICAvLyBJbmNyZWFzZSB0b3RhbCBudW1iZXIgb2YgZnJhbWVzIGNvcGllZCwgd2hpY2ggcmVndWxhdGVzIHdoZW4gdG8gZW5kCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9maWx0ZXJfYmFzZWRfcGxheWVyX3dvcmtlcl9oYW5kbGVyLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvZmlsdGVyX2Jhc2VkX3BsYXllcl93b3JrZXJfaGFuZGxlci5jYwppbmRleCBkMDMxNjdjLi41Y2M0MzhmIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9maWx0ZXJfYmFzZWRfcGxheWVyX3dvcmtlcl9oYW5kbGVyLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2ZpbHRlcl9iYXNlZF9wbGF5ZXJfd29ya2VyX2hhbmRsZXIuY2MKQEAgLTM2LDcgKzM2LDcgQEAKICAgICBNb25vdG9uaWNTeXN0ZW1UaW1lUHJvdmlkZXI7CiAKIC8vIFRPRE86IE1ha2UgdGhpcyBjb25maWd1cmFibGUgaW5zaWRlIFNiUGxheWVyQ3JlYXRlKCkuCi1jb25zdCBTYlRpbWVNb25vdG9uaWMga1VwZGF0ZUludGVydmFsID0gNSAqIGtTYlRpbWVNaWxsaXNlY29uZDsKK2NvbnN0IFNiVGltZU1vbm90b25pYyBrVXBkYXRlSW50ZXJ2YWwgPSAyMDAgKiBrU2JUaW1lTWlsbGlzZWNvbmQ7CiAKIGNsYXNzIE1vbm90b25pY1N5c3RlbVRpbWVQcm92aWRlckltcGwgOiBwdWJsaWMgTW9ub3RvbmljU3lzdGVtVGltZVByb3ZpZGVyIHsKICAgU2JUaW1lTW9ub3RvbmljIEdldE1vbm90b25pY05vdygpIGNvbnN0IG92ZXJyaWRlIHsKQEAgLTUzLDcgKzUzLDggQEAKICAgICBjb25zdCBTYk1lZGlhQXVkaW9IZWFkZXIqIGF1ZGlvX2hlYWRlciwKICAgICBTYlBsYXllck91dHB1dE1vZGUgb3V0cHV0X21vZGUsCiAgICAgU2JEZWNvZGVUYXJnZXRHcmFwaGljc0NvbnRleHRQcm92aWRlciogcHJvdmlkZXIpCi0gICAgOiB2aWRlb19jb2RlY18odmlkZW9fY29kZWMpLAorICAgIDogSm9iT3duZXIoa0RldGFjaGVkKSwKKyAgICAgIHZpZGVvX2NvZGVjXyh2aWRlb19jb2RlYyksCiAgICAgICBhdWRpb19jb2RlY18oYXVkaW9fY29kZWMpLAogICAgICAgZHJtX3N5c3RlbV8oZHJtX3N5c3RlbSksCiAgICAgICBvdXRwdXRfbW9kZV8ob3V0cHV0X21vZGUpLApAQCAtODIsMzcgKzgzLDMwIEBACiB9CiAKIGJvb2wgRmlsdGVyQmFzZWRQbGF5ZXJXb3JrZXJIYW5kbGVyOjpJbml0KAotICAgIFBsYXllcldvcmtlciogcGxheWVyX3dvcmtlciwKLSAgICBKb2JRdWV1ZSogam9iX3F1ZXVlLAogICAgIFNiUGxheWVyIHBsYXllciwKLSAgICBVcGRhdGVNZWRpYVRpbWVDQiB1cGRhdGVfbWVkaWFfdGltZV9jYiwKKyAgICBVcGRhdGVNZWRpYUluZm9DQiB1cGRhdGVfbWVkaWFfaW5mb19jYiwKICAgICBHZXRQbGF5ZXJTdGF0ZUNCIGdldF9wbGF5ZXJfc3RhdGVfY2IsCi0gICAgVXBkYXRlUGxheWVyU3RhdGVDQiB1cGRhdGVfcGxheWVyX3N0YXRlX2NiCi0jaWYgU0JfSEFTKFBMQVlFUl9FUlJPUl9NRVNTQUdFKQotICAgICwKLSAgICBVcGRhdGVQbGF5ZXJFcnJvckNCIHVwZGF0ZV9wbGF5ZXJfZXJyb3JfY2IKLSNlbmRpZiAgLy8gU0JfSEFTKFBMQVlFUl9FUlJPUl9NRVNTQUdFKQotICAgICkgeworICAgIFVwZGF0ZVBsYXllclN0YXRlQ0IgdXBkYXRlX3BsYXllcl9zdGF0ZV9jYiwKKyAgICBVcGRhdGVQbGF5ZXJFcnJvckNCIHVwZGF0ZV9wbGF5ZXJfZXJyb3JfY2IpIHsKICAgLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSBjYWxsZWQgb25jZS4KLSAgU0JfRENIRUNLKHBsYXllcl93b3JrZXJfID09IE5VTEwpOworICBTQl9EQ0hFQ0sodXBkYXRlX21lZGlhX2luZm9fY2JfID09IE5VTEwpOwogCiAgIC8vIEFsbCBwYXJhbWV0ZXJzIGhhdmUgdG8gYmUgdmFsaWQuCi0gIFNCX0RDSEVDSyhwbGF5ZXJfd29ya2VyKTsKLSAgU0JfRENIRUNLKGpvYl9xdWV1ZSk7Ci0gIFNCX0RDSEVDSyhqb2JfcXVldWUtPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CiAgIFNCX0RDSEVDSyhTYlBsYXllcklzVmFsaWQocGxheWVyKSk7Ci0gIFNCX0RDSEVDSyh1cGRhdGVfbWVkaWFfdGltZV9jYik7CisgIFNCX0RDSEVDSyh1cGRhdGVfbWVkaWFfaW5mb19jYik7CiAgIFNCX0RDSEVDSyhnZXRfcGxheWVyX3N0YXRlX2NiKTsKICAgU0JfRENIRUNLKHVwZGF0ZV9wbGF5ZXJfc3RhdGVfY2IpOwogCi0gIHBsYXllcl93b3JrZXJfID0gcGxheWVyX3dvcmtlcjsKLSAgam9iX3F1ZXVlXyA9IGpvYl9xdWV1ZTsKKyAgQXR0YWNoVG9DdXJyZW50VGhyZWFkKCk7CisKICAgcGxheWVyXyA9IHBsYXllcjsKLSAgdXBkYXRlX21lZGlhX3RpbWVfY2JfID0gdXBkYXRlX21lZGlhX3RpbWVfY2I7CisgIHVwZGF0ZV9tZWRpYV9pbmZvX2NiXyA9IHVwZGF0ZV9tZWRpYV9pbmZvX2NiOwogICBnZXRfcGxheWVyX3N0YXRlX2NiXyA9IGdldF9wbGF5ZXJfc3RhdGVfY2I7CiAgIHVwZGF0ZV9wbGF5ZXJfc3RhdGVfY2JfID0gdXBkYXRlX3BsYXllcl9zdGF0ZV9jYjsKICNpZiBTQl9IQVMoUExBWUVSX0VSUk9SX01FU1NBR0UpCiAgIHVwZGF0ZV9wbGF5ZXJfZXJyb3JfY2JfID0gdXBkYXRlX3BsYXllcl9lcnJvcl9jYjsKKyNlbHNlICAgLy8gU0JfSEFTKFBMQVlFUl9FUlJPUl9NRVNTQUdFKQorICBTQl9EQ0hFQ0soIXVwZGF0ZV9wbGF5ZXJfZXJyb3JfY2IpOwogI2VuZGlmICAvLyBTQl9IQVMoUExBWUVSX0VSUk9SX01FU1NBR0UpCiAKICAgc2NvcGVkX3B0cjxQbGF5ZXJDb21wb25lbnRzPiBwbGF5ZXJfY29tcG9uZW50cyA9IFBsYXllckNvbXBvbmVudHM6OkNyZWF0ZSgpOwpAQCAtMTI4LDUwICsxMjIsNjggQEAKICAgICB9CiAKICAgICBQbGF5ZXJDb21wb25lbnRzOjpBdWRpb1BhcmFtZXRlcnMgYXVkaW9fcGFyYW1ldGVycyA9IHsKLSAgICAgICAgYXVkaW9fY29kZWNfLCBhdWRpb19oZWFkZXJfLCBkcm1fc3lzdGVtXywgam9iX3F1ZXVlX307CisgICAgICAgIGF1ZGlvX2NvZGVjXywgYXVkaW9faGVhZGVyXywgZHJtX3N5c3RlbV99OwogCiAgICAgYXVkaW9fcmVuZGVyZXJfID0gcGxheWVyX2NvbXBvbmVudHMtPkNyZWF0ZUF1ZGlvUmVuZGVyZXIoYXVkaW9fcGFyYW1ldGVycyk7Ci0gICAgU0JfRENIRUNLKGF1ZGlvX3JlbmRlcmVyXyk7Ci0gICAgaWYgKGF1ZGlvX3JlbmRlcmVyXykgewotICAgICAgYXVkaW9fcmVuZGVyZXJfLT5TZXRQbGF5YmFja1JhdGUocGxheWJhY2tfcmF0ZV8pOwotICAgICAgYXVkaW9fcmVuZGVyZXJfLT5TZXRWb2x1bWUodm9sdW1lXyk7Ci0gICAgICBhdWRpb19yZW5kZXJlcl8tPkluaXRpYWxpemUoCi0gICAgICAgICAgc3RkOjpiaW5kKCZGaWx0ZXJCYXNlZFBsYXllcldvcmtlckhhbmRsZXI6Ok9uRXJyb3IsIHRoaXMpKTsKKyAgICBpZiAoIWF1ZGlvX3JlbmRlcmVyXykgeworICAgICAgU0JfRExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBjcmVhdGUgYXVkaW8gcmVuZGVyZXIiOworICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KKyAgICBhdWRpb19yZW5kZXJlcl8tPkluaXRpYWxpemUoCisgICAgICAgIHN0ZDo6YmluZCgmRmlsdGVyQmFzZWRQbGF5ZXJXb3JrZXJIYW5kbGVyOjpPbkVycm9yLCB0aGlzKSwKKyAgICAgICAgc3RkOjpiaW5kKCZGaWx0ZXJCYXNlZFBsYXllcldvcmtlckhhbmRsZXI6Ok9uUHJlcm9sbGVkLCB0aGlzLAorICAgICAgICAgICAgICAgICAga1NiTWVkaWFUeXBlQXVkaW8pLAorICAgICAgICBzdGQ6OmJpbmQoJkZpbHRlckJhc2VkUGxheWVyV29ya2VySGFuZGxlcjo6T25FbmRlZCwgdGhpcywKKyAgICAgICAgICAgICAgICAgIGtTYk1lZGlhVHlwZUF1ZGlvKSk7CisgICAgYXVkaW9fcmVuZGVyZXJfLT5TZXRQbGF5YmFja1JhdGUocGxheWJhY2tfcmF0ZV8pOworICAgIGF1ZGlvX3JlbmRlcmVyXy0+U2V0Vm9sdW1lKHZvbHVtZV8pOwogICB9IGVsc2UgewogICAgIG1lZGlhX3RpbWVfcHJvdmlkZXJfaW1wbF8ucmVzZXQoCiAgICAgICAgIG5ldyBNZWRpYVRpbWVQcm92aWRlckltcGwoc2NvcGVkX3B0cjxNb25vdG9uaWNTeXN0ZW1UaW1lUHJvdmlkZXI+KAogICAgICAgICAgICAgbmV3IE1vbm90b25pY1N5c3RlbVRpbWVQcm92aWRlckltcGwpKSk7CisgICAgbWVkaWFfdGltZV9wcm92aWRlcl9pbXBsXy0+SW5pdGlhbGl6ZSgKKyAgICAgICAgc3RkOjpiaW5kKCZGaWx0ZXJCYXNlZFBsYXllcldvcmtlckhhbmRsZXI6Ok9uRXJyb3IsIHRoaXMpLAorICAgICAgICBzdGQ6OmJpbmQoJkZpbHRlckJhc2VkUGxheWVyV29ya2VySGFuZGxlcjo6T25QcmVyb2xsZWQsIHRoaXMsCisgICAgICAgICAgICAgICAgICBrU2JNZWRpYVR5cGVBdWRpbyksCisgICAgICAgIHN0ZDo6YmluZCgmRmlsdGVyQmFzZWRQbGF5ZXJXb3JrZXJIYW5kbGVyOjpPbkVuZGVkLCB0aGlzLAorICAgICAgICAgICAgICAgICAga1NiTWVkaWFUeXBlQXVkaW8pKTsKICAgICBtZWRpYV90aW1lX3Byb3ZpZGVyX2ltcGxfLT5TZXRQbGF5YmFja1JhdGUocGxheWJhY2tfcmF0ZV8pOwogICB9CiAKLSAgUGxheWVyQ29tcG9uZW50czo6VmlkZW9QYXJhbWV0ZXJzIHZpZGVvX3BhcmFtZXRlcnMgPSB7Ci0gICAgICBwbGF5ZXJfLCAgICB2aWRlb19jb2RlY18sIGRybV9zeXN0ZW1fLAotICAgICAgam9iX3F1ZXVlXywgb3V0cHV0X21vZGVfLCBkZWNvZGVfdGFyZ2V0X2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXJffTsKKyAgaWYgKHZpZGVvX2NvZGVjXyAhPSBrU2JNZWRpYVZpZGVvQ29kZWNOb25lKSB7CisgICAgUGxheWVyQ29tcG9uZW50czo6VmlkZW9QYXJhbWV0ZXJzIHZpZGVvX3BhcmFtZXRlcnMgPSB7CisgICAgICAgIHBsYXllcl8sIHZpZGVvX2NvZGVjXywgZHJtX3N5c3RlbV8sIG91dHB1dF9tb2RlXywKKyAgICAgICAgZGVjb2RlX3RhcmdldF9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyX307CiAKLSAgOjpzdGFyYm9hcmQ6OlNjb3BlZExvY2sgbG9jayh2aWRlb19yZW5kZXJlcl9leGlzdGVuY2VfbXV0ZXhfKTsKKyAgICA6OnN0YXJib2FyZDo6U2NvcGVkTG9jayBsb2NrKHZpZGVvX3JlbmRlcmVyX2V4aXN0ZW5jZV9tdXRleF8pOwogCi0gIGF1dG8gbWVkaWFfdGltZV9wcm92aWRlciA9IEdldE1lZGlhVGltZVByb3ZpZGVyKCk7Ci0gIFNCX0RDSEVDSyhtZWRpYV90aW1lX3Byb3ZpZGVyKTsKKyAgICBhdXRvIG1lZGlhX3RpbWVfcHJvdmlkZXIgPSBHZXRNZWRpYVRpbWVQcm92aWRlcigpOworICAgIFNCX0RDSEVDSyhtZWRpYV90aW1lX3Byb3ZpZGVyKTsKIAotICB2aWRlb19yZW5kZXJlcl8gPSBwbGF5ZXJfY29tcG9uZW50cy0+Q3JlYXRlVmlkZW9SZW5kZXJlcih2aWRlb19wYXJhbWV0ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYV90aW1lX3Byb3ZpZGVyKTsKLSAgU0JfRENIRUNLKHZpZGVvX3JlbmRlcmVyXyk7Ci0gIGlmICh2aWRlb19yZW5kZXJlcl8pIHsKKyAgICB2aWRlb19yZW5kZXJlcl8gPSBwbGF5ZXJfY29tcG9uZW50cy0+Q3JlYXRlVmlkZW9SZW5kZXJlcigKKyAgICAgICAgdmlkZW9fcGFyYW1ldGVycywgbWVkaWFfdGltZV9wcm92aWRlcik7CisgICAgaWYgKCF2aWRlb19yZW5kZXJlcl8pIHsKKyAgICAgIFNCX0RMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIHZpZGVvIHJlbmRlcmVyIjsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAgICAgdmlkZW9fcmVuZGVyZXJfLT5Jbml0aWFsaXplKAotICAgICAgICBzdGQ6OmJpbmQoJkZpbHRlckJhc2VkUGxheWVyV29ya2VySGFuZGxlcjo6T25FcnJvciwgdGhpcykpOworICAgICAgICBzdGQ6OmJpbmQoJkZpbHRlckJhc2VkUGxheWVyV29ya2VySGFuZGxlcjo6T25FcnJvciwgdGhpcyksCisgICAgICAgIHN0ZDo6YmluZCgmRmlsdGVyQmFzZWRQbGF5ZXJXb3JrZXJIYW5kbGVyOjpPblByZXJvbGxlZCwgdGhpcywKKyAgICAgICAgICAgICAgICAgIGtTYk1lZGlhVHlwZVZpZGVvKSwKKyAgICAgICAgc3RkOjpiaW5kKCZGaWx0ZXJCYXNlZFBsYXllcldvcmtlckhhbmRsZXI6Ok9uRW5kZWQsIHRoaXMsCisgICAgICAgICAgICAgICAgICBrU2JNZWRpYVR5cGVWaWRlbykpOwogICB9CiAKLSAgdXBkYXRlX2pvYl90b2tlbl8gPSBqb2JfcXVldWVfLT5TY2hlZHVsZSh1cGRhdGVfam9iXywga1VwZGF0ZUludGVydmFsKTsKKyAgdXBkYXRlX2pvYl90b2tlbl8gPSBTY2hlZHVsZSh1cGRhdGVfam9iXywga1VwZGF0ZUludGVydmFsKTsKIAogICByZXR1cm4gdHJ1ZTsKIH0KIAogYm9vbCBGaWx0ZXJCYXNlZFBsYXllcldvcmtlckhhbmRsZXI6OlNlZWsoU2JUaW1lIHNlZWtfdG9fdGltZSwgaW50IHRpY2tldCkgewogICBTQl9VTlJFRkVSRU5DRURfUEFSQU1FVEVSKHRpY2tldCk7Ci0gIFNCX0RDSEVDSyhqb2JfcXVldWVfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOworICBTQl9EQ0hFQ0soQmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKIAotICBpZiAoIUdldE1lZGlhVGltZVByb3ZpZGVyKCkgfHwgIXZpZGVvX3JlbmRlcmVyXykgeworICBpZiAoIUdldE1lZGlhVGltZVByb3ZpZGVyKCkpIHsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIApAQCAtMTgxLDggKzE5MywxMiBAQAogICB9CiAKICAgR2V0TWVkaWFUaW1lUHJvdmlkZXIoKS0+UGF1c2UoKTsKLSAgdmlkZW9fcmVuZGVyZXJfLT5TZWVrKHNlZWtfdG9fdGltZSk7CisgIGlmICh2aWRlb19yZW5kZXJlcl8pIHsKKyAgICB2aWRlb19yZW5kZXJlcl8tPlNlZWsoc2Vla190b190aW1lKTsKKyAgfQogICBHZXRNZWRpYVRpbWVQcm92aWRlcigpLT5TZWVrKHNlZWtfdG9fdGltZSk7CisgIGF1ZGlvX3ByZXJvbGxlZF8gPSBmYWxzZTsKKyAgdmlkZW9fcHJlcm9sbGVkXyA9IGZhbHNlOwogICByZXR1cm4gdHJ1ZTsKIH0KIApAQCAtMTkwLDcgKzIwNiw3IEBACiAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxJbnB1dEJ1ZmZlcj4mIGlucHV0X2J1ZmZlciwKICAgICBib29sKiB3cml0dGVuKSB7CiAgIFNCX0RDSEVDSyhpbnB1dF9idWZmZXIpOwotICBTQl9EQ0hFQ0soam9iX3F1ZXVlXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKKyAgU0JfRENIRUNLKEJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CiAgIFNCX0RDSEVDSyh3cml0dGVuICE9IE5VTEwpOwogCiAgIGlmIChpbnB1dF9idWZmZXItPnNhbXBsZV90eXBlKCkgPT0ga1NiTWVkaWFUeXBlQXVkaW8pIHsKQEAgLTI2OCw3ICsyODQsNyBAQAogfQogCiBib29sIEZpbHRlckJhc2VkUGxheWVyV29ya2VySGFuZGxlcjo6V3JpdGVFbmRPZlN0cmVhbShTYk1lZGlhVHlwZSBzYW1wbGVfdHlwZSkgewotICBTQl9EQ0hFQ0soam9iX3F1ZXVlXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKKyAgU0JfRENIRUNLKEJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CiAKICAgaWYgKHNhbXBsZV90eXBlID09IGtTYk1lZGlhVHlwZUF1ZGlvKSB7CiAgICAgaWYgKCFhdWRpb19yZW5kZXJlcl8pIHsKQEAgLTI5OSw3ICszMTUsNyBAQAogfQogCiBib29sIEZpbHRlckJhc2VkUGxheWVyV29ya2VySGFuZGxlcjo6U2V0UGF1c2UoYm9vbCBwYXVzZSkgewotICBTQl9EQ0hFQ0soam9iX3F1ZXVlXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKKyAgU0JfRENIRUNLKEJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CiAKICAgaWYgKCFHZXRNZWRpYVRpbWVQcm92aWRlcigpKSB7CiAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMzE5LDcgKzMzNSw3IEBACiB9CiAKIGJvb2wgRmlsdGVyQmFzZWRQbGF5ZXJXb3JrZXJIYW5kbGVyOjpTZXRQbGF5YmFja1JhdGUoZG91YmxlIHBsYXliYWNrX3JhdGUpIHsKLSAgU0JfRENIRUNLKGpvYl9xdWV1ZV8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CisgIFNCX0RDSEVDSyhCZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwogCiAgIHBsYXliYWNrX3JhdGVfID0gcGxheWJhY2tfcmF0ZTsKIApAQCAtMzMyLDcgKzM0OCw3IEBACiB9CiAKIHZvaWQgRmlsdGVyQmFzZWRQbGF5ZXJXb3JrZXJIYW5kbGVyOjpTZXRWb2x1bWUoZG91YmxlIHZvbHVtZSkgewotICBTQl9EQ0hFQ0soam9iX3F1ZXVlXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKKyAgU0JfRENIRUNLKEJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CiAKICAgdm9sdW1lXyA9IHZvbHVtZTsKICAgaWYgKGF1ZGlvX3JlbmRlcmVyXykgewpAQCAtMzQyLDcgKzM1OCw3IEBACiAKIGJvb2wgRmlsdGVyQmFzZWRQbGF5ZXJXb3JrZXJIYW5kbGVyOjpTZXRCb3VuZHMoCiAgICAgY29uc3QgUGxheWVyV29ya2VyOjpCb3VuZHMmIGJvdW5kcykgewotICBTQl9EQ0hFQ0soam9iX3F1ZXVlXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKKyAgU0JfRENIRUNLKEJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CiAKICAgaWYgKFNiTWVtb3J5Q29tcGFyZSgmYm91bmRzXywgJmJvdW5kcywgc2l6ZW9mKGJvdW5kc18pKSAhPSAwKSB7CiAgICAgYm91bmRzXyA9IGJvdW5kczsKQEAgLTM1Nyw2NyArMzczLDgxIEBACiB9CiAKIHZvaWQgRmlsdGVyQmFzZWRQbGF5ZXJXb3JrZXJIYW5kbGVyOjpPbkVycm9yKCkgewotICBpZiAoIWpvYl9xdWV1ZV8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSkgewotICAgIGpvYl9xdWV1ZV8tPlNjaGVkdWxlKAotICAgICAgICBzdGQ6OmJpbmQoJkZpbHRlckJhc2VkUGxheWVyV29ya2VySGFuZGxlcjo6T25FcnJvciwgdGhpcykpOworICBpZiAoIUJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSkgeworICAgIFNjaGVkdWxlKHN0ZDo6YmluZCgmRmlsdGVyQmFzZWRQbGF5ZXJXb3JrZXJIYW5kbGVyOjpPbkVycm9yLCB0aGlzKSk7CiAgICAgcmV0dXJuOwogICB9CiAKICNpZiBTQl9IQVMoUExBWUVSX0VSUk9SX01FU1NBR0UpCiAgIGlmICh1cGRhdGVfcGxheWVyX2Vycm9yX2NiXykgewotICAgICgqcGxheWVyX3dvcmtlcl8uKgotICAgICB1cGRhdGVfcGxheWVyX2Vycm9yX2NiXykoIkZpbHRlckJhc2VkUGxheWVyV29ya2VySGFuZGxlciBlcnJvci4iKTsKKyAgICB1cGRhdGVfcGxheWVyX2Vycm9yX2NiXygiRmlsdGVyQmFzZWRQbGF5ZXJXb3JrZXJIYW5kbGVyIGVycm9yLiIpOwogICB9CiAjZWxzZSAgIC8vIFNCX0hBUyhQTEFZRVJfRVJST1JfTUVTU0FHRSkKLSAgKCpwbGF5ZXJfd29ya2VyXy4qdXBkYXRlX3BsYXllcl9zdGF0ZV9jYl8pKGtTYlBsYXllclN0YXRlRXJyb3IpOworICB1cGRhdGVfcGxheWVyX3N0YXRlX2NiXyhrU2JQbGF5ZXJTdGF0ZUVycm9yKTsKICNlbmRpZiAgLy8gU0JfSEFTKFBMQVlFUl9FUlJPUl9NRVNTQUdFKQogfQogCi0vLyBUT0RPOiBUaGlzIHNob3VsZCBiZSBkcml2ZW4gYnkgY2FsbGJhY2tzIGluc3RlYWQgcG9sbGluZy4KLXZvaWQgRmlsdGVyQmFzZWRQbGF5ZXJXb3JrZXJIYW5kbGVyOjpVcGRhdGUoKSB7Ci0gIFNCX0RDSEVDSyhqb2JfcXVldWVfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwotCi0gIGlmICghR2V0TWVkaWFUaW1lUHJvdmlkZXIoKSB8fCAhdmlkZW9fcmVuZGVyZXJfKSB7Cit2b2lkIEZpbHRlckJhc2VkUGxheWVyV29ya2VySGFuZGxlcjo6T25QcmVyb2xsZWQoU2JNZWRpYVR5cGUgbWVkaWFfdHlwZSkgeworICBpZiAoIUJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSkgeworICAgIFNjaGVkdWxlKHN0ZDo6YmluZCgmRmlsdGVyQmFzZWRQbGF5ZXJXb3JrZXJIYW5kbGVyOjpPblByZXJvbGxlZCwgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFfdHlwZSkpOwogICAgIHJldHVybjsKICAgfQogCi0gIGlmICgoKnBsYXllcl93b3JrZXJfLipnZXRfcGxheWVyX3N0YXRlX2NiXykoKSA9PSBrU2JQbGF5ZXJTdGF0ZVByZXJvbGxpbmcpIHsKLSAgICBib29sIGF1ZGlvX3NlZWtfaW5fcHJvZ3Jlc3MgPQotICAgICAgICBhdWRpb19yZW5kZXJlcl8gJiYgYXVkaW9fcmVuZGVyZXJfLT5Jc1NlZWtpbmdJblByb2dyZXNzKCk7Ci0gICAgaWYgKCFhdWRpb19zZWVrX2luX3Byb2dyZXNzICYmCi0gICAgICAgICF2aWRlb19yZW5kZXJlcl8tPlVwZGF0ZUFuZFJldHJpZXZlSXNTZWVraW5nSW5Qcm9ncmVzcygpKSB7Ci0gICAgICAoKnBsYXllcl93b3JrZXJfLip1cGRhdGVfcGxheWVyX3N0YXRlX2NiXykoa1NiUGxheWVyU3RhdGVQcmVzZW50aW5nKTsKLSAgICAgIGlmICghcGF1c2VkXykgewotICAgICAgICBHZXRNZWRpYVRpbWVQcm92aWRlcigpLT5QbGF5KCk7Ci0gICAgICB9CisgIFNCX0RDSEVDSyhnZXRfcGxheWVyX3N0YXRlX2NiXygpID09IGtTYlBsYXllclN0YXRlUHJlcm9sbGluZykKKyAgICAgIDw8ICJJbnZhbGlkIHBsYXllciBzdGF0ZSAiIDw8IGdldF9wbGF5ZXJfc3RhdGVfY2JfKCk7CisKKyAgYXVkaW9fcHJlcm9sbGVkXyB8PSBtZWRpYV90eXBlID09IGtTYk1lZGlhVHlwZUF1ZGlvOworICB2aWRlb19wcmVyb2xsZWRfIHw9IG1lZGlhX3R5cGUgPT0ga1NiTWVkaWFUeXBlVmlkZW87CisKKyAgaWYgKGF1ZGlvX3ByZXJvbGxlZF8gJiYgKCF2aWRlb19yZW5kZXJlcl8gfHwgdmlkZW9fcHJlcm9sbGVkXykpIHsKKyAgICB1cGRhdGVfcGxheWVyX3N0YXRlX2NiXyhrU2JQbGF5ZXJTdGF0ZVByZXNlbnRpbmcpOworICAgIGlmICghcGF1c2VkXykgeworICAgICAgR2V0TWVkaWFUaW1lUHJvdmlkZXIoKS0+UGxheSgpOwogICAgIH0KICAgfQorfQogCi0gIGlmICgoKnBsYXllcl93b3JrZXJfLipnZXRfcGxheWVyX3N0YXRlX2NiXykoKSA9PSBrU2JQbGF5ZXJTdGF0ZVByZXNlbnRpbmcpIHsKLSAgICBib29sIGlzX2F1ZGlvX3BsYXlpbmc7Ci0gICAgYm9vbCBpc19hdWRpb19lb3NfcGxheWVkOwotICAgIEdldE1lZGlhVGltZVByb3ZpZGVyKCktPkdldEN1cnJlbnRNZWRpYVRpbWUoJmlzX2F1ZGlvX3BsYXlpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXNfYXVkaW9fZW9zX3BsYXllZCk7Ci0gICAgaWYgKGlzX2F1ZGlvX2Vvc19wbGF5ZWQgJiYgdmlkZW9fcmVuZGVyZXJfLT5Jc0VuZE9mU3RyZWFtUGxheWVkKCkpIHsKLSAgICAgICgqcGxheWVyX3dvcmtlcl8uKnVwZGF0ZV9wbGF5ZXJfc3RhdGVfY2JfKShrU2JQbGF5ZXJTdGF0ZUVuZE9mU3RyZWFtKTsKK3ZvaWQgRmlsdGVyQmFzZWRQbGF5ZXJXb3JrZXJIYW5kbGVyOjpPbkVuZGVkKFNiTWVkaWFUeXBlIG1lZGlhX3R5cGUpIHsKKyAgaWYgKCFCZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpIHsKKyAgICBTY2hlZHVsZSgKKyAgICAgICAgc3RkOjpiaW5kKCZGaWx0ZXJCYXNlZFBsYXllcldvcmtlckhhbmRsZXI6Ok9uRW5kZWQsIHRoaXMsIG1lZGlhX3R5cGUpKTsKKyAgICByZXR1cm47CisgIH0KKyAgYXVkaW9fZW5kZWRfIHw9IG1lZGlhX3R5cGUgPT0ga1NiTWVkaWFUeXBlQXVkaW87CisgIHZpZGVvX2VuZGVkXyB8PSBtZWRpYV90eXBlID09IGtTYk1lZGlhVHlwZVZpZGVvOworCisgIGlmIChhdWRpb19lbmRlZF8gJiYgKCF2aWRlb19yZW5kZXJlcl8gfHwgdmlkZW9fZW5kZWRfKSkgeworICAgIHVwZGF0ZV9wbGF5ZXJfc3RhdGVfY2JfKGtTYlBsYXllclN0YXRlRW5kT2ZTdHJlYW0pOworICB9Cit9CisKK3ZvaWQgRmlsdGVyQmFzZWRQbGF5ZXJXb3JrZXJIYW5kbGVyOjpVcGRhdGUoKSB7CisgIFNCX0RDSEVDSyhCZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOworCisgIGlmICghR2V0TWVkaWFUaW1lUHJvdmlkZXIoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChnZXRfcGxheWVyX3N0YXRlX2NiXygpID09IGtTYlBsYXllclN0YXRlUHJlc2VudGluZykgeworICAgIGludCBkcm9wcGVkX2ZyYW1lcyA9IDA7CisgICAgaWYgKHZpZGVvX3JlbmRlcmVyXykgeworICAgICAgZHJvcHBlZF9mcmFtZXMgPSB2aWRlb19yZW5kZXJlcl8tPkdldERyb3BwZWRGcmFtZXMoKTsKICAgICB9Ci0KLSAgICBwbGF5ZXJfd29ya2VyXy0+VXBkYXRlRHJvcHBlZFZpZGVvRnJhbWVzKAotICAgICAgICB2aWRlb19yZW5kZXJlcl8tPkdldERyb3BwZWRGcmFtZXMoKSk7CiAgICAgYm9vbCBpc19wbGF5aW5nOwogICAgIGJvb2wgaXNfZW9zX3BsYXllZDsKLSAgICAoKnBsYXllcl93b3JrZXJfLioKLSAgICAgdXBkYXRlX21lZGlhX3RpbWVfY2JfKShHZXRNZWRpYVRpbWVQcm92aWRlcigpLT5HZXRDdXJyZW50TWVkaWFUaW1lKAotICAgICAgICAmaXNfcGxheWluZywgJmlzX2Vvc19wbGF5ZWQpKTsKKyAgICBhdXRvIG1lZGlhX3RpbWUgPSBHZXRNZWRpYVRpbWVQcm92aWRlcigpLT5HZXRDdXJyZW50TWVkaWFUaW1lKAorICAgICAgICAmaXNfcGxheWluZywgJmlzX2Vvc19wbGF5ZWQpOworICAgIHVwZGF0ZV9tZWRpYV9pbmZvX2NiXyhtZWRpYV90aW1lLCBkcm9wcGVkX2ZyYW1lcyk7CiAgIH0KIAotICB1cGRhdGVfam9iX3Rva2VuXyA9IGpvYl9xdWV1ZV8tPlNjaGVkdWxlKHVwZGF0ZV9qb2JfLCBrVXBkYXRlSW50ZXJ2YWwpOworICB1cGRhdGVfam9iX3Rva2VuXyA9IFNjaGVkdWxlKHVwZGF0ZV9qb2JfLCBrVXBkYXRlSW50ZXJ2YWwpOwogfQogCiB2b2lkIEZpbHRlckJhc2VkUGxheWVyV29ya2VySGFuZGxlcjo6U3RvcCgpIHsKLSAgU0JfRENIRUNLKGpvYl9xdWV1ZV8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CisgIFNCX0RDSEVDSyhCZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwogCi0gIGpvYl9xdWV1ZV8tPlJlbW92ZUpvYkJ5VG9rZW4odXBkYXRlX2pvYl90b2tlbl8pOworICBSZW1vdmVKb2JCeVRva2VuKHVwZGF0ZV9qb2JfdG9rZW5fKTsKIAogICBzY29wZWRfcHRyPFZpZGVvUmVuZGVyZXI+IHZpZGVvX3JlbmRlcmVyOwogICB7CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9maWx0ZXJfYmFzZWRfcGxheWVyX3dvcmtlcl9oYW5kbGVyLmggYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9maWx0ZXJfYmFzZWRfcGxheWVyX3dvcmtlcl9oYW5kbGVyLmgKaW5kZXggYTA0MDAwYy4uYWZlY2VmOSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvZmlsdGVyX2Jhc2VkX3BsYXllcl93b3JrZXJfaGFuZGxlci5oCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2ZpbHRlcl9iYXNlZF9wbGF5ZXJfd29ya2VyX2hhbmRsZXIuaApAQCAtMzcsNyArMzcsOCBAQAogbmFtZXNwYWNlIHBsYXllciB7CiBuYW1lc3BhY2UgZmlsdGVyIHsKIAotY2xhc3MgRmlsdGVyQmFzZWRQbGF5ZXJXb3JrZXJIYW5kbGVyIDogcHVibGljIFBsYXllcldvcmtlcjo6SGFuZGxlciB7CitjbGFzcyBGaWx0ZXJCYXNlZFBsYXllcldvcmtlckhhbmRsZXIgOiBwdWJsaWMgUGxheWVyV29ya2VyOjpIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBKb2JRdWV1ZTo6Sm9iT3duZXIgewogIHB1YmxpYzoKICAgRmlsdGVyQmFzZWRQbGF5ZXJXb3JrZXJIYW5kbGVyKAogICAgICAgU2JNZWRpYVZpZGVvQ29kZWMgdmlkZW9fY29kZWMsCkBAIC00OSwxNyArNTAsMTEgQEAKIAogIHByaXZhdGU6CiAgIGJvb2wgSXNQdW5jaG91dE1vZGUoKSBjb25zdDsKLSAgYm9vbCBJbml0KFBsYXllcldvcmtlciogcGxheWVyX3dvcmtlciwKLSAgICAgICAgICAgIEpvYlF1ZXVlKiBqb2JfcXVldWUsCi0gICAgICAgICAgICBTYlBsYXllciBwbGF5ZXIsCi0gICAgICAgICAgICBVcGRhdGVNZWRpYVRpbWVDQiB1cGRhdGVfbWVkaWFfdGltZV9jYiwKKyAgYm9vbCBJbml0KFNiUGxheWVyIHBsYXllciwKKyAgICAgICAgICAgIFVwZGF0ZU1lZGlhSW5mb0NCIHVwZGF0ZV9tZWRpYV9pbmZvX2NiLAogICAgICAgICAgICAgR2V0UGxheWVyU3RhdGVDQiBnZXRfcGxheWVyX3N0YXRlX2NiLAotICAgICAgICAgICAgVXBkYXRlUGxheWVyU3RhdGVDQiB1cGRhdGVfcGxheWVyX3N0YXRlX2NiCi0jaWYgU0JfSEFTKFBMQVlFUl9FUlJPUl9NRVNTQUdFKQotICAgICAgICAgICAgLAotICAgICAgICAgICAgVXBkYXRlUGxheWVyRXJyb3JDQiB1cGRhdGVfcGxheWVyX2Vycm9yX2NiCi0jZW5kaWYgIC8vIFNCX0hBUyhQTEFZRVJfRVJST1JfTUVTU0FHRSkKLSAgICAgICAgICAgICkgb3ZlcnJpZGU7CisgICAgICAgICAgICBVcGRhdGVQbGF5ZXJTdGF0ZUNCIHVwZGF0ZV9wbGF5ZXJfc3RhdGVfY2IsCisgICAgICAgICAgICBVcGRhdGVQbGF5ZXJFcnJvckNCIHVwZGF0ZV9wbGF5ZXJfZXJyb3JfY2IpIG92ZXJyaWRlOwogICBib29sIFNlZWsoU2JUaW1lIHNlZWtfdG9fdGltZSwgaW50IHRpY2tldCkgb3ZlcnJpZGU7CiAgIGJvb2wgV3JpdGVTYW1wbGUoY29uc3Qgc2NvcGVkX3JlZnB0cjxJbnB1dEJ1ZmZlcj4mIGlucHV0X2J1ZmZlciwKICAgICAgICAgICAgICAgICAgICBib29sKiB3cml0dGVuKSBvdmVycmlkZTsKQEAgLTcyLDE5ICs2NywxNyBAQAogCiAgIHZvaWQgVXBkYXRlKCk7CiAgIHZvaWQgT25FcnJvcigpOworICB2b2lkIE9uUHJlcm9sbGVkKFNiTWVkaWFUeXBlIG1lZGlhX3R5cGUpOworICB2b2lkIE9uRW5kZWQoU2JNZWRpYVR5cGUgbWVkaWFfdHlwZSk7CiAKICAgU2JEZWNvZGVUYXJnZXQgR2V0Q3VycmVudERlY29kZVRhcmdldCgpIG92ZXJyaWRlOwogICBNZWRpYVRpbWVQcm92aWRlciogR2V0TWVkaWFUaW1lUHJvdmlkZXIoKSBjb25zdDsKIAotICBQbGF5ZXJXb3JrZXIqIHBsYXllcl93b3JrZXJfID0gTlVMTDsKLSAgSm9iUXVldWUqIGpvYl9xdWV1ZV8gPSBOVUxMOwogICBTYlBsYXllciBwbGF5ZXJfID0ga1NiUGxheWVySW52YWxpZDsKLSAgVXBkYXRlTWVkaWFUaW1lQ0IgdXBkYXRlX21lZGlhX3RpbWVfY2JfID0gTlVMTDsKLSAgR2V0UGxheWVyU3RhdGVDQiBnZXRfcGxheWVyX3N0YXRlX2NiXyA9IE5VTEw7Ci0gIFVwZGF0ZVBsYXllclN0YXRlQ0IgdXBkYXRlX3BsYXllcl9zdGF0ZV9jYl8gPSBOVUxMOwotI2lmIFNCX0hBUyhQTEFZRVJfRVJST1JfTUVTU0FHRSkKLSAgVXBkYXRlUGxheWVyRXJyb3JDQiB1cGRhdGVfcGxheWVyX2Vycm9yX2NiXyA9IE5VTEw7Ci0jZW5kaWYgIC8vIFNCX0hBUyhQTEFZRVJfRVJST1JfTUVTU0FHRSkKKyAgVXBkYXRlTWVkaWFJbmZvQ0IgdXBkYXRlX21lZGlhX2luZm9fY2JfOworICBHZXRQbGF5ZXJTdGF0ZUNCIGdldF9wbGF5ZXJfc3RhdGVfY2JfOworICBVcGRhdGVQbGF5ZXJTdGF0ZUNCIHVwZGF0ZV9wbGF5ZXJfc3RhdGVfY2JfOworICBVcGRhdGVQbGF5ZXJFcnJvckNCIHVwZGF0ZV9wbGF5ZXJfZXJyb3JfY2JfOwogCiAgIFNiTWVkaWFWaWRlb0NvZGVjIHZpZGVvX2NvZGVjXzsKICAgU2JNZWRpYUF1ZGlvQ29kZWMgYXVkaW9fY29kZWNfOwpAQCAtMTEwLDYgKzEwMywxMSBAQAogICBKb2JRdWV1ZTo6Sm9iVG9rZW4gdXBkYXRlX2pvYl90b2tlbl87CiAgIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiB1cGRhdGVfam9iXzsKIAorICBib29sIGF1ZGlvX3ByZXJvbGxlZF8gPSBmYWxzZTsKKyAgYm9vbCB2aWRlb19wcmVyb2xsZWRfID0gZmFsc2U7CisgIGJvb2wgYXVkaW9fZW5kZWRfID0gZmFsc2U7CisgIGJvb2wgdmlkZW9fZW5kZWRfID0gZmFsc2U7CisKICAgLy8gQSBtdXRleCBndWFyZGluZyBjaGFuZ2VzIHRvIHRoZSBleGlzdGVuY2UgKGUuZy4gY3JlYXRpb24vZGVzdHJ1Y3Rpb24pCiAgIC8vIG9mIHRoZSB8dmlkZW9fcmVuZGVyZXJffCBvYmplY3QuICBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIGNhbGxzIHRvCiAgIC8vIEdldEN1cnJlbnREZWNvZGVUYXJnZXQoKSBuZWVkIHRvIGJlIHN1cHBvcnRlZCBvbiBhcmJpdHJhcnkgdGhyZWFkcywgYW5kCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9tZWRpYV90aW1lX3Byb3ZpZGVyLmggYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9tZWRpYV90aW1lX3Byb3ZpZGVyLmgKaW5kZXggMjExNDk1ZS4uYmZkYWNhNSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvbWVkaWFfdGltZV9wcm92aWRlci5oCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL21lZGlhX3RpbWVfcHJvdmlkZXIuaApAQCAtMTYsNiArMTYsNyBAQAogI2RlZmluZSBTVEFSQk9BUkRfU0hBUkVEX1NUQVJCT0FSRF9QTEFZRVJfRklMVEVSX01FRElBX1RJTUVfUFJPVklERVJfSF8KIAogI2luY2x1ZGUgInN0YXJib2FyZC9tZWRpYS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvY2FsbGJhY2suaCIKIAogbmFtZXNwYWNlIHN0YXJib2FyZCB7CiBuYW1lc3BhY2Ugc2hhcmVkIHsKQEAgLTI1LDYgKzI2LDkgQEAKIAogY2xhc3MgTWVkaWFUaW1lUHJvdmlkZXIgewogIHB1YmxpYzoKKyAgdmlydHVhbCB2b2lkIEluaXRpYWxpemUoY29uc3QgRXJyb3JDQiYgZXJyb3JfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByZXJvbGxlZENCJiBwcmVyb2xsZWRfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVuZGVkQ0ImIGVuZGVkX2NiKSA9IDA7CiAgIHZpcnR1YWwgdm9pZCBQbGF5KCkgPSAwOwogICB2aXJ0dWFsIHZvaWQgUGF1c2UoKSA9IDA7CiAgIHZpcnR1YWwgdm9pZCBTZXRQbGF5YmFja1JhdGUoZG91YmxlIHBsYXliYWNrX3JhdGUpID0gMDsKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL21lZGlhX3RpbWVfcHJvdmlkZXJfaW1wbC5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL21lZGlhX3RpbWVfcHJvdmlkZXJfaW1wbC5jYwppbmRleCBlNTI1MDczLi5hNmE4NWMwIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9tZWRpYV90aW1lX3Byb3ZpZGVyX2ltcGwuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvbWVkaWFfdGltZV9wcm92aWRlcl9pbXBsLmNjCkBAIC0yOCwyMCArMjgsMjIgQEAKICAgU0JfRENIRUNLKHN5c3RlbV90aW1lX3Byb3ZpZGVyXyk7CiB9CiAKLXZvaWQgTWVkaWFUaW1lUHJvdmlkZXJJbXBsOjpTZXRQbGF5YmFja1JhdGUoZG91YmxlIHBsYXliYWNrX3JhdGUpIHsKLSAgU0JfRENIRUNLKHRocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOwordm9pZCBNZWRpYVRpbWVQcm92aWRlckltcGw6OkluaXRpYWxpemUoY29uc3QgRXJyb3JDQiYgZXJyb3JfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcmVyb2xsZWRDQiYgcHJlcm9sbGVkX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRW5kZWRDQiYgZW5kZWRfY2IpIHsKKyAgU0JfVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUihlcnJvcl9jYik7CisgIFNCX0RDSEVDSyhCZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOworICBTQl9EQ0hFQ0socHJlcm9sbGVkX2NiKTsKKyAgU0JfRENIRUNLKGVuZGVkX2NiKTsKKyAgU0JfRENIRUNLKCFwcmVyb2xsZWRfY2JfKTsKKyAgU0JfRENIRUNLKCFlbmRlZF9jYl8pOwogCi0gIGlmIChwbGF5YmFja19yYXRlXyA9PSBwbGF5YmFja19yYXRlKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgU2NvcGVkTG9jayBzY29wZWRfbG9jayhtdXRleF8pOwotICBzZWVrX3RvX3RpbWVfID0gR2V0Q3VycmVudE1lZGlhVGltZV9Mb2NrZWQoJnNlZWtfdG9fdGltZV9zZXRfYXRfKTsKLSAgcGxheWJhY2tfcmF0ZV8gPSBwbGF5YmFja19yYXRlOworICBwcmVyb2xsZWRfY2JfID0gcHJlcm9sbGVkX2NiOworICBlbmRlZF9jYl8gPSBlbmRlZF9jYjsKIH0KIAogdm9pZCBNZWRpYVRpbWVQcm92aWRlckltcGw6OlBsYXkoKSB7Ci0gIFNCX0RDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKKyAgU0JfRENIRUNLKEJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CiAKICAgaWYgKGlzX3BsYXlpbmdfKSB7CiAgICAgcmV0dXJuOwpAQCAtNTMsNyArNTUsNyBAQAogfQogCiB2b2lkIE1lZGlhVGltZVByb3ZpZGVySW1wbDo6UGF1c2UoKSB7Ci0gIFNCX0RDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKKyAgU0JfRENIRUNLKEJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CiAKICAgaWYgKCFpc19wbGF5aW5nXykgewogICAgIHJldHVybjsKQEAgLTY0LDggKzY2LDIxIEBACiAgIGlzX3BsYXlpbmdfID0gZmFsc2U7CiB9CiAKK3ZvaWQgTWVkaWFUaW1lUHJvdmlkZXJJbXBsOjpTZXRQbGF5YmFja1JhdGUoZG91YmxlIHBsYXliYWNrX3JhdGUpIHsKKyAgU0JfRENIRUNLKEJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CisKKyAgaWYgKHBsYXliYWNrX3JhdGVfID09IHBsYXliYWNrX3JhdGUpIHsKKyAgICByZXR1cm47CisgIH0KKworICBTY29wZWRMb2NrIHNjb3BlZF9sb2NrKG11dGV4Xyk7CisgIHNlZWtfdG9fdGltZV8gPSBHZXRDdXJyZW50TWVkaWFUaW1lX0xvY2tlZCgmc2Vla190b190aW1lX3NldF9hdF8pOworICBwbGF5YmFja19yYXRlXyA9IHBsYXliYWNrX3JhdGU7Cit9CisKIHZvaWQgTWVkaWFUaW1lUHJvdmlkZXJJbXBsOjpTZWVrKFNiVGltZSBzZWVrX3RvX3RpbWUpIHsKLSAgU0JfRENIRUNLKHRocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOworICBTQl9EQ0hFQ0soQmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKKyAgU0JfRENIRUNLKHByZXJvbGxlZF9jYl8pOwogCiAgIFNjb3BlZExvY2sgc2NvcGVkX2xvY2sobXV0ZXhfKTsKIApAQCAtNzMsMTAgKzg4LDE1IEBACiAgIHNlZWtfdG9fdGltZV9zZXRfYXRfID0gc3lzdGVtX3RpbWVfcHJvdmlkZXJfLT5HZXRNb25vdG9uaWNOb3coKTsKICAgdmlkZW9fZHVyYXRpb25fID0gbnVsbG9wdDsKICAgaXNfdmlkZW9fZW5kX29mX3N0cmVhbV9yZWFjaGVkXyA9IGZhbHNlOworCisgIENhbmNlbFBlbmRpbmdKb2JzKCk7CisgIFNjaGVkdWxlKHByZXJvbGxlZF9jYl8pOwogfQogCiBTYlRpbWUgTWVkaWFUaW1lUHJvdmlkZXJJbXBsOjpHZXRDdXJyZW50TWVkaWFUaW1lKGJvb2wqIGlzX3BsYXlpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIGlzX2Vvc19wbGF5ZWQpIHsKKyAgU0JfRENIRUNLKGVuZGVkX2NiXyk7CisKICAgU2NvcGVkTG9jayBzY29wZWRfbG9jayhtdXRleF8pOwogCiAgIFNiVGltZSBjdXJyZW50ID0gR2V0Q3VycmVudE1lZGlhVGltZV9Mb2NrZWQoKTsKQEAgLTg2LDYgKzEwNiw3IEBACiAgICAgICBpc192aWRlb19lbmRfb2Zfc3RyZWFtX3JlYWNoZWRfICYmCiAgICAgICAoIXZpZGVvX2R1cmF0aW9uXy5oYXNfZW5nYWdlZCgpIHx8IGN1cnJlbnQgPj0gdmlkZW9fZHVyYXRpb25fLnZhbHVlKCkpOwogCisgIFNjaGVkdWxlKGVuZGVkX2NiXyk7CiAgIHJldHVybiBjdXJyZW50OwogfQogCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9tZWRpYV90aW1lX3Byb3ZpZGVyX2ltcGwuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL21lZGlhX3RpbWVfcHJvdmlkZXJfaW1wbC5oCmluZGV4IDdiYTMxMGMuLmQ4OGRkMWUgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL21lZGlhX3RpbWVfcHJvdmlkZXJfaW1wbC5oCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL21lZGlhX3RpbWVfcHJvdmlkZXJfaW1wbC5oCkBAIC0yMCw3ICsyMCw3IEBACiAjaW5jbHVkZSAic3RhcmJvYXJkL21lZGlhLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL211dGV4LmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9tZWRpYV90aW1lX3Byb3ZpZGVyLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvdGhyZWFkX2NoZWNrZXIuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvam9iX3F1ZXVlLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3RpbWUuaCIKIAogbmFtZXNwYWNlIHN0YXJib2FyZCB7CkBAIC0zMCw3ICszMCw4IEBACiBuYW1lc3BhY2UgZmlsdGVyIHsKIAogLy8gVGhpcyBjbGFzcyBwcm92aWRlcyB0aGUgbWVkaWEgcGxheWJhY2sgdGltZSB3aGVuIHRoZXJlIGlzbid0IGFuIGF1ZGlvIHRyYWNrLgotY2xhc3MgTWVkaWFUaW1lUHJvdmlkZXJJbXBsIDogcHVibGljIE1lZGlhVGltZVByb3ZpZGVyIHsKK2NsYXNzIE1lZGlhVGltZVByb3ZpZGVySW1wbCA6IHB1YmxpYyBNZWRpYVRpbWVQcm92aWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgSm9iUXVldWU6OkpvYk93bmVyIHsKICBwdWJsaWM6CiAgIGNsYXNzIE1vbm90b25pY1N5c3RlbVRpbWVQcm92aWRlciB7CiAgICBwdWJsaWM6CkBAIC00MSw5ICs0MiwxMiBAQAogICBleHBsaWNpdCBNZWRpYVRpbWVQcm92aWRlckltcGwoCiAgICAgICBzY29wZWRfcHRyPE1vbm90b25pY1N5c3RlbVRpbWVQcm92aWRlcj4gc3lzdGVtX3RpbWVfcHJvdmlkZXIpOwogCi0gIHZvaWQgU2V0UGxheWJhY2tSYXRlKGRvdWJsZSBwbGF5YmFja19yYXRlKSBvdmVycmlkZTsKKyAgdm9pZCBJbml0aWFsaXplKGNvbnN0IEVycm9yQ0ImIGVycm9yX2NiLAorICAgICAgICAgICAgICAgICAgY29uc3QgUHJlcm9sbGVkQ0ImIHByZXJvbGxlZF9jYiwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IEVuZGVkQ0ImIGVuZGVkX2NiKSBvdmVycmlkZTsKICAgdm9pZCBQbGF5KCkgb3ZlcnJpZGU7CiAgIHZvaWQgUGF1c2UoKSBvdmVycmlkZTsKKyAgdm9pZCBTZXRQbGF5YmFja1JhdGUoZG91YmxlIHBsYXliYWNrX3JhdGUpIG92ZXJyaWRlOwogICB2b2lkIFNlZWsoU2JUaW1lIHNlZWtfdG9fdGltZSkgb3ZlcnJpZGU7CiAgIFNiVGltZSBHZXRDdXJyZW50TWVkaWFUaW1lKGJvb2wqIGlzX3BsYXlpbmcsIGJvb2wqIGlzX2Vvc19wbGF5ZWQpIG92ZXJyaWRlOwogCkBAIC02MSwxMCArNjUsMTEgQEAKICAgLy8gc2hvdWxkIGhhbmRsZSB0aGlzIHByb3Blcmx5LgogICBTYlRpbWUgR2V0Q3VycmVudE1lZGlhVGltZV9Mb2NrZWQoU2JUaW1lTW9ub3RvbmljKiBjdXJyZW50X3RpbWUgPSBOVUxMKTsKIAotICBUaHJlYWRDaGVja2VyIHRocmVhZF9jaGVja2VyXzsKLQogICBzY29wZWRfcHRyPE1vbm90b25pY1N5c3RlbVRpbWVQcm92aWRlcj4gc3lzdGVtX3RpbWVfcHJvdmlkZXJfOwogCisgIFByZXJvbGxlZENCIHByZXJvbGxlZF9jYl87CisgIEVuZGVkQ0IgZW5kZWRfY2JfOworCiAgIE11dGV4IG11dGV4XzsKIAogICBkb3VibGUgcGxheWJhY2tfcmF0ZV8gPSAxLjA7CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9wbGF5ZXJfY29tcG9uZW50cy5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvcGxheWVyX2NvbXBvbmVudHMuaAppbmRleCBlZjhkZWMzLi5iYjlkMDk2IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9wbGF5ZXJfY29tcG9uZW50cy5oCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3BsYXllcl9jb21wb25lbnRzLmgKQEAgLTQ2LDE0ICs0NiwxMiBAQAogICAgIFNiTWVkaWFBdWRpb0NvZGVjIGF1ZGlvX2NvZGVjOwogICAgIGNvbnN0IFNiTWVkaWFBdWRpb0hlYWRlciYgYXVkaW9faGVhZGVyOwogICAgIFNiRHJtU3lzdGVtIGRybV9zeXN0ZW07Ci0gICAgSm9iUXVldWUqIGpvYl9xdWV1ZTsKICAgfTsKIAogICBzdHJ1Y3QgVmlkZW9QYXJhbWV0ZXJzIHsKICAgICBTYlBsYXllciBwbGF5ZXI7CiAgICAgU2JNZWRpYVZpZGVvQ29kZWMgdmlkZW9fY29kZWM7CiAgICAgU2JEcm1TeXN0ZW0gZHJtX3N5c3RlbTsKLSAgICBKb2JRdWV1ZSogam9iX3F1ZXVlOwogICAgIFNiUGxheWVyT3V0cHV0TW9kZSBvdXRwdXRfbW9kZTsKICAgICBTYkRlY29kZVRhcmdldEdyYXBoaWNzQ29udGV4dFByb3ZpZGVyKgogICAgICAgICBkZWNvZGVfdGFyZ2V0X2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXI7CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9wbGF5ZXJfZmlsdGVyLmd5cGkgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9wbGF5ZXJfZmlsdGVyLmd5cGkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc1ZmI3YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3BsYXllcl9maWx0ZXIuZ3lwaQpAQCAtMCwwICsxLDU2IEBACisjIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCit7CisgICd2YXJpYWJsZXMnOiB7CisgICAgJ2ZpbHRlcl9iYXNlZF9wbGF5ZXJfc291cmNlcyc6IFsKKyAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2F1ZGlvX2RlY29kZXJfaW50ZXJuYWwuaCcsCisgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9hdWRpb19mcmFtZV90cmFja2VyLmNjJywKKyAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2F1ZGlvX2ZyYW1lX3RyYWNrZXIuaCcsCisgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9hdWRpb19yZW5kZXJlcl9pbnRlcm5hbC5jYycsCisgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9hdWRpb19yZW5kZXJlcl9pbnRlcm5hbC5oJywKKyAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2F1ZGlvX3JlbmRlcmVyX3NpbmsuaCcsCisgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9hdWRpb19yZW5kZXJlcl9zaW5rX2ltcGwuY2MnLAorICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fcmVuZGVyZXJfc2lua19pbXBsLmgnLAorICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fcmVzYW1wbGVyLmgnLAorICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fcmVzYW1wbGVyX2ltcGwuY2MnLAorICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fdGltZV9zdHJldGNoZXIuY2MnLAorICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fdGltZV9zdHJldGNoZXIuaCcsCisgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9jYWxsYmFjay5oJywKKyAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2NwdV92aWRlb19mcmFtZS5jYycsCisgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9jcHVfdmlkZW9fZnJhbWUuaCcsCisgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9kZWNvZGVkX2F1ZGlvX3F1ZXVlLmNjJywKKyAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2RlY29kZWRfYXVkaW9fcXVldWUuaCcsCisgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9maWx0ZXJfYmFzZWRfcGxheWVyX3dvcmtlcl9oYW5kbGVyLmNjJywKKyAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2ZpbHRlcl9iYXNlZF9wbGF5ZXJfd29ya2VyX2hhbmRsZXIuaCcsCisgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9tZWRpYV90aW1lX3Byb3ZpZGVyLmgnLAorICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvbWVkaWFfdGltZV9wcm92aWRlcl9pbXBsLmNjJywKKyAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL21lZGlhX3RpbWVfcHJvdmlkZXJfaW1wbC5oJywKKyAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL21vY2tfYXVkaW9fZGVjb2Rlci5oJywKKyAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL21vY2tfYXVkaW9fcmVuZGVyZXJfc2luay5oJywKKyAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3BsYXllcl9jb21wb25lbnRzLmgnLAorICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvcHVuY2hvdXRfdmlkZW9fcmVuZGVyZXJfc2luay5jYycsCisgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9wdW5jaG91dF92aWRlb19yZW5kZXJlcl9zaW5rLmgnLAorICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdmlkZW9fZGVjb2Rlcl9pbnRlcm5hbC5oJywKKyAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3ZpZGVvX2ZyYW1lX2ludGVybmFsLmgnLAorICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdmlkZW9fcmVuZGVyX2FsZ29yaXRobS5oJywKKyAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3ZpZGVvX3JlbmRlcl9hbGdvcml0aG1faW1wbC5jYycsCisgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci92aWRlb19yZW5kZXJfYWxnb3JpdGhtX2ltcGwuaCcsCisgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci92aWRlb19yZW5kZXJlcl9pbnRlcm5hbC5jYycsCisgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci92aWRlb19yZW5kZXJlcl9pbnRlcm5hbC5oJywKKyAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3ZpZGVvX3JlbmRlcmVyX3NpbmsuaCcsCisgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci93c29sYV9pbnRlcm5hbC5jYycsCisgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci93c29sYV9pbnRlcm5hbC5oJywKKyAgICBdLAorICB9LAorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3Rlc3RpbmcvYXVkaW9fZGVjb2Rlcl90ZXN0LmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdGVzdGluZy9hdWRpb19kZWNvZGVyX3Rlc3QuY2MKaW5kZXggZjAwMzBhMS4uNjZmNzc4ZSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdGVzdGluZy9hdWRpb19kZWNvZGVyX3Rlc3QuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdGVzdGluZy9hdWRpb19kZWNvZGVyX3Rlc3QuY2MKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlICJzdGFyYm9hcmQvdGhyZWFkLmgiCiAjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCiAKKyNpZiBTQl9IQVMoUExBWUVSX0ZJTFRFUl9URVNUUykKIC8vIFRPRE86IFdyaXRlIHRlc3QgZm9yIEhFLUFBQwogCiBuYW1lc3BhY2Ugc3RhcmJvYXJkIHsKQEAgLTc0LDcgKzc1LDcgQEAKIAogICAgIFBsYXllckNvbXBvbmVudHM6OkF1ZGlvUGFyYW1ldGVycyBhdWRpb19wYXJhbWV0ZXJzID0gewogICAgICAgICBkbXBfcmVhZGVyXy5hdWRpb19jb2RlYygpLCBkbXBfcmVhZGVyXy5hdWRpb19oZWFkZXIoKSwKLSAgICAgICAga1NiRHJtU3lzdGVtSW52YWxpZCwgJmpvYl9xdWV1ZV99OworICAgICAgICBrU2JEcm1TeXN0ZW1JbnZhbGlkfTsKIAogICAgIHNjb3BlZF9wdHI8UGxheWVyQ29tcG9uZW50cz4gY29tcG9uZW50cyA9IFBsYXllckNvbXBvbmVudHM6OkNyZWF0ZSgpOwogICAgIGNvbXBvbmVudHMtPkNyZWF0ZUF1ZGlvQ29tcG9uZW50cyhhdWRpb19wYXJhbWV0ZXJzLCAmYXVkaW9fZGVjb2Rlcl8sCkBAIC0yNDAsNyArMjQxLDcgQEAKIAogICBQbGF5ZXJDb21wb25lbnRzOjpBdWRpb1BhcmFtZXRlcnMgYXVkaW9fcGFyYW1ldGVycyA9IHsKICAgICAgIGRtcF9yZWFkZXJfLmF1ZGlvX2NvZGVjKCksIGRtcF9yZWFkZXJfLmF1ZGlvX2hlYWRlcigpLAotICAgICAga1NiRHJtU3lzdGVtSW52YWxpZCwgJmpvYl9xdWV1ZV99OworICAgICAga1NiRHJtU3lzdGVtSW52YWxpZH07CiAKICAgc2NvcGVkX3B0cjxQbGF5ZXJDb21wb25lbnRzPiBjb21wb25lbnRzID0gUGxheWVyQ29tcG9uZW50czo6Q3JlYXRlKCk7CiAgIHNjb3BlZF9wdHI8QXVkaW9EZWNvZGVyPiBhdWRpb19kZWNvZGVyc1trRGVjb2RlcnNUb0NyZWF0ZV07CkBAIC0zNTAsMyArMzUxLDQgQEAKIH0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKIH0gIC8vIG5hbWVzcGFjZSBzaGFyZWQKIH0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKKyNlbmRpZiAgLy8gU0JfSEFTKFBMQVlFUl9GSUxURVJfVEVTVFMpCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci90ZXN0aW5nL2F1ZGlvX3JlbmRlcmVyX2ludGVybmFsX3Rlc3QuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci90ZXN0aW5nL2F1ZGlvX3JlbmRlcmVyX2ludGVybmFsX3Rlc3QuY2MKaW5kZXggMjE1ZGFkMS4uM2Q0MWJiMCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdGVzdGluZy9hdWRpb19yZW5kZXJlcl9pbnRlcm5hbF90ZXN0LmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3Rlc3RpbmcvYXVkaW9fcmVuZGVyZXJfaW50ZXJuYWxfdGVzdC5jYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgInN0YXJib2FyZC90aHJlYWQuaCIKICNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKIAorI2lmIFNCX0hBUyhQTEFZRVJfRklMVEVSX1RFU1RTKQogbmFtZXNwYWNlIHN0YXJib2FyZCB7CiBuYW1lc3BhY2Ugc2hhcmVkIHsKIG5hbWVzcGFjZSBzdGFyYm9hcmQgewpAQCAtNDQsNiArNDUsNyBAQAogdXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm47CiB1c2luZyA6OnRlc3Rpbmc6OlNhdmVBcmc7CiAKKy8vIFRPRE86IFdyaXRlIHRlc3RzIHRvIGNvdmVyIGNhbGxiYWNrcy4KIGNsYXNzIEF1ZGlvUmVuZGVyZXJUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CiAgcHJvdGVjdGVkOgogICBzdGF0aWMgY29uc3QgaW50IGtEZWZhdWx0TnVtYmVyT2ZDaGFubmVscyA9IDI7CkBAIC0xMDksNyArMTExLDEwIEBACiAgICAgICAgIG1ha2Vfc2NvcGVkX3B0cjxBdWRpb0RlY29kZXI+KGF1ZGlvX2RlY29kZXJfKSwKICAgICAgICAgbWFrZV9zY29wZWRfcHRyPEF1ZGlvUmVuZGVyZXJTaW5rPihhdWRpb19yZW5kZXJlcl9zaW5rXyksCiAgICAgICAgIEdldERlZmF1bHRBdWRpb0hlYWRlcigpLCBrTWF4Q2FjaGVkRnJhbWVzLCBrTWF4RnJhbWVzUGVyQXBwZW5kKSk7Ci0gICAgYXVkaW9fcmVuZGVyZXJfLT5Jbml0aWFsaXplKHN0ZDo6YmluZCgmQXVkaW9SZW5kZXJlclRlc3Q6Ok9uRXJyb3IsIHRoaXMpKTsKKyAgICBhdWRpb19yZW5kZXJlcl8tPkluaXRpYWxpemUoCisgICAgICAgIHN0ZDo6YmluZCgmQXVkaW9SZW5kZXJlclRlc3Q6Ok9uRXJyb3IsIHRoaXMpLAorICAgICAgICBzdGQ6OmJpbmQoJkF1ZGlvUmVuZGVyZXJUZXN0OjpPblByZXJvbGxlZCwgdGhpcyksCisgICAgICAgIHN0ZDo6YmluZCgmQXVkaW9SZW5kZXJlclRlc3Q6Ok9uRW5kZWQsIHRoaXMpKTsKICAgfQogCiAgIC8vIENyZWF0ZXMgYXVkaW8gYnVmZmVycywgZGVjb2RlcyB0aGVtLCBhbmQgcGFzc2VzIHRoZW0gb250byB0aGUgcmVuZGVyZXIsCkBAIC0xOTQsNiArMTk5LDggQEAKICAgfQogCiAgIHZvaWQgT25FcnJvcigpIHt9CisgIHZvaWQgT25QcmVyb2xsZWQoKSB7fQorICB2b2lkIE9uRW5kZWQoKSB7fQogCiAgIFNiTWVkaWFBdWRpb1NhbXBsZVR5cGUgc2FtcGxlX3R5cGVfOwogICBTYk1lZGlhQXVkaW9GcmFtZVN0b3JhZ2VUeXBlIHN0b3JhZ2VfdHlwZV87CkBAIC0yNTQsNiArMjYxLDggQEAKICAgRVhQRUNUX0ZBTFNFKGlzX2Vvc19wbGF5ZWQpOwogfQogCisvLyBUT0RPOiBhZGFwdCB0aGVzZSB0ZXN0cyBmb3IgYXN5bmMgYXVkaW8gZnJhbWVzIHJlcG9ydGluZy4KKyNpZiAhU0JfSEFTKEFTWU5DX0FVRElPX0ZSQU1FU19SRVBPUlRJTkcpCiBURVNUX0YoQXVkaW9SZW5kZXJlclRlc3QsIFN1bm55RGF5KSB7CiAgIHsKICAgICBJblNlcXVlbmNlIHNlcTsKQEAgLTc3NSw2ICs3ODQsNyBAQAogCiAgIEVYUEVDVF9UUlVFKGF1ZGlvX3JlbmRlcmVyXy0+SXNFbmRPZlN0cmVhbVBsYXllZCgpKTsKIH0KKyNlbmRpZiAgLy8gIVNCX0hBUyhBU1lOQ19BVURJT19GUkFNRVNfUkVQT1JUSU5HKQogCiAvLyBUT0RPOiBBZGQgbW9yZSBTZWVrIHRlc3RzLgogCkBAIC03ODUsMyArNzk1LDQgQEAKIH0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKIH0gIC8vIG5hbWVzcGFjZSBzaGFyZWQKIH0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKKyNlbmRpZiAgLy8gU0JfSEFTKFBMQVlFUl9GSUxURVJfVEVTVFMpCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci90ZXN0aW5nL21lZGlhX3RpbWVfcHJvdmlkZXJfaW1wbF90ZXN0LmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdGVzdGluZy9tZWRpYV90aW1lX3Byb3ZpZGVyX2ltcGxfdGVzdC5jYwppbmRleCAwMTU2YTNlLi5mYmU0OWY1IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci90ZXN0aW5nL21lZGlhX3RpbWVfcHJvdmlkZXJfaW1wbF90ZXN0LmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3Rlc3RpbmcvbWVkaWFfdGltZV9wcm92aWRlcl9pbXBsX3Rlc3QuY2MKQEAgLTE0LDExICsxNCwxMyBAQAogCiAjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9tZWRpYV90aW1lX3Byb3ZpZGVyX2ltcGwuaCIKIAorI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9qb2JfcXVldWUuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvdGhyZWFkLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3RpbWUuaCIKICNpbmNsdWRlICJ0ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2suaCIKICNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKIAorI2lmIFNCX0hBUyhQTEFZRVJfRklMVEVSX1RFU1RTKQogbmFtZXNwYWNlIHN0YXJib2FyZCB7CiBuYW1lc3BhY2Ugc2hhcmVkIHsKIG5hbWVzcGFjZSBzdGFyYm9hcmQgewpAQCAtNzMsNiArNzUsNyBAQAogICBTYlRpbWVNb25vdG9uaWMgY3VycmVudF90aW1lXzsKIH07CiAKKy8vIFRPRE86IFdyaXRlIHRlc3RzIHRvIGNvdmVyIGNhbGxiYWNrcy4KIGNsYXNzIE1lZGlhVGltZVByb3ZpZGVySW1wbFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKICBwcm90ZWN0ZWQ6CiAgIE1lZGlhVGltZVByb3ZpZGVySW1wbFRlc3QoKQpAQCAtODIsOCArODUsMTggQEAKICAgICAgICAgLy8gY2FuIGFkanVzdCBleHBlY3RhdGlvbiBvbiBpdC4gIFRoaXMgaXMgc2FmZSBpbiB0aGUgY29udGV4dCBvZiB0aGUKICAgICAgICAgLy8gdGVzdHMuCiAgICAgICAgIG1lZGlhX3RpbWVfcHJvdmlkZXJfaW1wbF8obWFrZV9zY29wZWRfcHRyPE1vbm90b25pY1N5c3RlbVRpbWVQcm92aWRlcj4oCi0gICAgICAgICAgICBzeXN0ZW1fdGltZV9wcm92aWRlcl8pKSB7fQorICAgICAgICAgICAgc3lzdGVtX3RpbWVfcHJvdmlkZXJfKSkgeworICAgIG1lZGlhX3RpbWVfcHJvdmlkZXJfaW1wbF8uSW5pdGlhbGl6ZSgKKyAgICAgICAgc3RkOjpiaW5kKCZNZWRpYVRpbWVQcm92aWRlckltcGxUZXN0OjpPbkVycm9yLCB0aGlzKSwKKyAgICAgICAgc3RkOjpiaW5kKCZNZWRpYVRpbWVQcm92aWRlckltcGxUZXN0OjpPblByZXJvbGxlZCwgdGhpcyksCisgICAgICAgIHN0ZDo6YmluZCgmTWVkaWFUaW1lUHJvdmlkZXJJbXBsVGVzdDo6T25FbmRlZCwgdGhpcykpOworICB9CiAKKyAgdm9pZCBPbkVycm9yKCkge30KKyAgdm9pZCBPblByZXJvbGxlZCgpIHt9CisgIHZvaWQgT25FbmRlZCgpIHt9CisKKyAgSm9iUXVldWUgam9iX3F1ZXVlXzsKICAgU3RyaWN0TW9jazxNb2NrTW9ub3RvbmljU3lzdGVtVGltZVByb3ZpZGVyPiogc3lzdGVtX3RpbWVfcHJvdmlkZXJfOwogICBNZWRpYVRpbWVQcm92aWRlckltcGwgbWVkaWFfdGltZV9wcm92aWRlcl9pbXBsXzsKIH07CkBAIC0yNzQsMyArMjg3LDQgQEAKIH0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKIH0gIC8vIG5hbWVzcGFjZSBzaGFyZWQKIH0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKKyNlbmRpZiAgLy8gU0JfSEFTKFBMQVlFUl9GSUxURVJfVEVTVFMpCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci90ZXN0aW5nL3BsYXllcl9maWx0ZXJfdGVzdHMuZ3lwIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdGVzdGluZy9wbGF5ZXJfZmlsdGVyX3Rlc3RzLmd5cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTViYTA3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdGVzdGluZy9wbGF5ZXJfZmlsdGVyX3Rlc3RzLmd5cApAQCAtMCwwICsxLDgxIEBACisjIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3sKKyAgJ3RhcmdldHMnOiBbCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ3BsYXllcl9maWx0ZXJfdGVzdHMnLAorICAgICAgJ3R5cGUnOiAnPChndGVzdF90YXJnZXRfdHlwZSknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvY29tbW9uL3Rlc3RfbWFpbi5jYycsCisgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3Rlc3RpbmcvYXVkaW9fZGVjb2Rlcl90ZXN0LmNjJywKKyAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdGVzdGluZy9hdWRpb19yZW5kZXJlcl9pbnRlcm5hbF90ZXN0LmNjJywKKyAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdGVzdGluZy9tZWRpYV90aW1lX3Byb3ZpZGVyX2ltcGxfdGVzdC5jYycsCisgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3Rlc3RpbmcvdmlkZW9fZGVjb2Rlcl90ZXN0LmNjJywKKyAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci92aWRlb19kbXBfY29tbW9uLmNjJywKKyAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci92aWRlb19kbXBfY29tbW9uLmgnLAorICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3ZpZGVvX2RtcF9yZWFkZXIuY2MnLAorICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3ZpZGVvX2RtcF9yZWFkZXIuaCcsCisgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvdGVzdGluZy9mYWtlX2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXIuY2MnLAorICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3Rlc3RpbmcvZmFrZV9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyLmgnLAorICAgICAgXSwKKyAgICAgICdkZWZpbmVzJzogWworICAgICAgICAjIFRoaXMgYWxsb3dzIHRoZSB0ZXN0cyB0byBpbmNsdWRlIGludGVybmFsIG9ubHkgaGVhZGVyIGZpbGVzLgorICAgICAgICAnU1RBUkJPQVJEX0lNUExFTUVOVEFUSU9OJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPEAoY29iYWx0X3BsYXRmb3JtX2RlcGVuZGVuY2llcyknLAorICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3N0YXJib2FyZC5neXA6c3RhcmJvYXJkJywKKyAgICAgICAgJzwoREVQVEgpL3Rlc3RpbmcvZ21vY2suZ3lwOmdtb2NrJywKKyAgICAgICAgJzwoREVQVEgpL3Rlc3RpbmcvZ3Rlc3QuZ3lwOmd0ZXN0JywKKyAgICAgICAgJ3BsYXllcl9maWx0ZXJfdGVzdHNfY29weV90ZXN0X2RhdGEnLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdwbGF5ZXJfZmlsdGVyX3Rlc3RzX2NvcHlfdGVzdF9kYXRhJywKKyAgICAgICd0eXBlJzogJ25vbmUnLAorICAgICAgJ3ZhcmlhYmxlcyc6IHsKKyAgICAgICAgJ2NvbnRlbnRfdGVzdF9pbnB1dF9maWxlcyc6IFsnPCFAKHB5dGhvbiA8KERFUFRIKS9zdGFyYm9hcmQvYnVpbGQvbGlzdF9kbXBfZmlsZXMucHkgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci90ZXN0ZGF0YSIpJ10sCisgICAgICAgICdjb250ZW50X3Rlc3Rfb3V0cHV0X3N1YmRpcic6ICdzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvdGVzdGRhdGEnLAorICAgICAgICAnZG93bmxvYWRfYXRfZ3lwX3RpbWUnOiBbJzwhQChkb3dubG9hZF9mcm9tX2dvb2dsZV9zdG9yYWdlIC0tbm9fcmVzdW1lIC0tbm9fYXV0aCAtLW51bV90aHJlYWRzIDggLS1idWNrZXQgY29iYWx0LXN0YXRpYy1zdG9yYWdlIC1kIDwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci90ZXN0ZGF0YSAtdiB8IGdyZXAgIlN1Y2Nlc3MiKSddLAorICAgICAgfSwKKyAgICAgICdhY3Rpb25zJyA6IFsKKyAgICAgICAgeworICAgICAgICAgICdhY3Rpb25fbmFtZSc6ICdwbGF5ZXJfZmlsdGVyX3Rlc3RzX2Rvd25sb2FkX3Rlc3RfZGF0YScsCisgICAgICAgICAgJ2FjdGlvbic6IFsgJ2Rvd25sb2FkX2Zyb21fZ29vZ2xlX3N0b3JhZ2UnLAorICAgICAgICAgICAgICAgICAgICAgICctLW5vX3Jlc3VtZScsCisgICAgICAgICAgICAgICAgICAgICAgJy0tbm9fYXV0aCcsCisgICAgICAgICAgICAgICAgICAgICAgJy0tbnVtX3RocmVhZHMnLCAnOCcsCisgICAgICAgICAgICAgICAgICAgICAgJy0tYnVja2V0JywgJ2NvYmFsdC1zdGF0aWMtc3RvcmFnZScsCisgICAgICAgICAgICAgICAgICAgICAgJy1kJywgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci90ZXN0ZGF0YScsCisgICAgICAgICAgXSwKKyAgICAgICAgICAnaW5wdXRzJzogW10sCisgICAgICAgICAgJ291dHB1dHMnOiBbJzwhQChweXRob24gPChERVBUSCkvc3RhcmJvYXJkL2J1aWxkL2xpc3RfZG1wX2ZpbGVzLnB5ICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvdGVzdGRhdGEiKSddLAorICAgICAgICB9LAorICAgICAgXSwKKyAgICAgICdpbmNsdWRlcyc6IFsnPChERVBUSCkvc3RhcmJvYXJkL2J1aWxkL2NvcHlfdGVzdF9kYXRhLmd5cGknXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdwbGF5ZXJfZmlsdGVyX3Rlc3RzX2RlcGxveScsCisgICAgICAndHlwZSc6ICdub25lJywKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICdwbGF5ZXJfZmlsdGVyX3Rlc3RzJywKKyAgICAgIF0sCisgICAgICAndmFyaWFibGVzJzogeworICAgICAgICAnZXhlY3V0YWJsZV9uYW1lJzogJ3BsYXllcl9maWx0ZXJfdGVzdHMnLAorICAgICAgfSwKKyAgICAgICdpbmNsdWRlcyc6IFsgJzwoREVQVEgpL3N0YXJib2FyZC9idWlsZC9kZXBsb3kuZ3lwaScgXSwKKyAgICB9LAorICBdLAorfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdGVzdGluZy9wbGF5ZXJfZmlsdGVyX3Rlc3RzLmd5cGkgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci90ZXN0aW5nL3BsYXllcl9maWx0ZXJfdGVzdHMuZ3lwaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYzOWU1Ni4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci90ZXN0aW5nL3BsYXllcl9maWx0ZXJfdGVzdHMuZ3lwaQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLSMgQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotewotICAndGFyZ2V0cyc6IFsKLSAgICB7Ci0gICAgICAndGFyZ2V0X25hbWUnOiAncGxheWVyX2ZpbHRlcl90ZXN0cycsCi0gICAgICAndHlwZSc6ICc8KGd0ZXN0X3RhcmdldF90eXBlKScsCi0gICAgICAnc291cmNlcyc6IFsKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9jb21tb24vdGVzdF9tYWluLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdGVzdGluZy9hdWRpb19kZWNvZGVyX3Rlc3QuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci90ZXN0aW5nL2F1ZGlvX3JlbmRlcmVyX2ludGVybmFsX3Rlc3QuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci90ZXN0aW5nL21lZGlhX3RpbWVfcHJvdmlkZXJfaW1wbF90ZXN0LmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdGVzdGluZy92aWRlb19kZWNvZGVyX3Rlc3QuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3ZpZGVvX2RtcF9jb21tb24uY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3ZpZGVvX2RtcF9jb21tb24uaCcsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvdmlkZW9fZG1wX3JlYWRlci5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvdmlkZW9fZG1wX3JlYWRlci5oJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC90ZXN0aW5nL2Zha2VfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlci5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvdGVzdGluZy9mYWtlX2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXIuaCcsCi0gICAgICBdLAotICAgICAgJ2RlZmluZXMnOiBbCi0gICAgICAgICMgVGhpcyBhbGxvd3MgdGhlIHRlc3RzIHRvIGluY2x1ZGUgaW50ZXJuYWwgb25seSBoZWFkZXIgZmlsZXMuCi0gICAgICAgICdTVEFSQk9BUkRfSU1QTEVNRU5UQVRJT04nLAotICAgICAgXSwKLSAgICAgICdkZXBlbmRlbmNpZXMnOiBbCi0gICAgICAgICc8QChjb2JhbHRfcGxhdGZvcm1fZGVwZW5kZW5jaWVzKScsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc3RhcmJvYXJkLmd5cDpzdGFyYm9hcmQnLAotICAgICAgICAnPChERVBUSCkvdGVzdGluZy9nbW9jay5neXA6Z21vY2snLAotICAgICAgICAnPChERVBUSCkvdGVzdGluZy9ndGVzdC5neXA6Z3Rlc3QnLAotICAgICAgICAncGxheWVyX2ZpbHRlcl90ZXN0c19jb3B5X3Rlc3RfZGF0YScsCi0gICAgICBdLAotICAgIH0sCi0gICAgewotICAgICAgJ3RhcmdldF9uYW1lJzogJ3BsYXllcl9maWx0ZXJfdGVzdHNfY29weV90ZXN0X2RhdGEnLAotICAgICAgJ3R5cGUnOiAnbm9uZScsCi0gICAgICAndmFyaWFibGVzJzogewotICAgICAgICAnY29udGVudF90ZXN0X2lucHV0X2ZpbGVzJzogWwotICAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvdGVzdGRhdGEnLAotICAgICAgICBdLAotICAgICAgICAnY29udGVudF90ZXN0X291dHB1dF9zdWJkaXInOiAnc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyJywKLSAgICAgIH0sCi0gICAgICAnaW5jbHVkZXMnOiBbJzwoREVQVEgpL3N0YXJib2FyZC9idWlsZC9jb3B5X3Rlc3RfZGF0YS5neXBpJ10sCi0gICAgfSwKLSAgICB7Ci0gICAgICAndGFyZ2V0X25hbWUnOiAncGxheWVyX2ZpbHRlcl90ZXN0c19kZXBsb3knLAotICAgICAgJ3R5cGUnOiAnbm9uZScsCi0gICAgICAnZGVwZW5kZW5jaWVzJzogWwotICAgICAgICAncGxheWVyX2ZpbHRlcl90ZXN0cycsCi0gICAgICBdLAotICAgICAgJ3ZhcmlhYmxlcyc6IHsKLSAgICAgICAgJ2V4ZWN1dGFibGVfbmFtZSc6ICdwbGF5ZXJfZmlsdGVyX3Rlc3RzJywKLSAgICAgIH0sCi0gICAgICAnaW5jbHVkZXMnOiBbICc8KERFUFRIKS9zdGFyYm9hcmQvYnVpbGQvZGVwbG95Lmd5cGknIF0sCi0gICAgfSwKLSAgXSwKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3Rlc3RpbmcvdmlkZW9fZGVjb2Rlcl90ZXN0LmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdGVzdGluZy92aWRlb19kZWNvZGVyX3Rlc3QuY2MKaW5kZXggMTdjZTk3YS4uM2RmOGQ4YyAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdGVzdGluZy92aWRlb19kZWNvZGVyX3Rlc3QuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdGVzdGluZy92aWRlb19kZWNvZGVyX3Rlc3QuY2MKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlICJzdGFyYm9hcmQvdGltZS5oIgogI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgogCisjaWYgU0JfSEFTKFBMQVlFUl9GSUxURVJfVEVTVFMpCiAvLyBUaGlzIGhhcyB0byBiZSBkZWZpbmVkIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlIGFzIGl0cyBpbnN0YW5jZSB3aWxsIGJlIHVzZWQKIC8vIGFzIFNiUGxheWVyLgogc3RydWN0IFNiUGxheWVyUHJpdmF0ZSB7fTsKQEAgLTExMiw3ICsxMTMsNiBAQAogICAgICAgICAmcGxheWVyXywKICAgICAgICAgZG1wX3JlYWRlcl8udmlkZW9fY29kZWMoKSwKICAgICAgICAga1NiRHJtU3lzdGVtSW52YWxpZCwKLSAgICAgICAgJmpvYl9xdWV1ZV8sCiAgICAgICAgIG91dHB1dF9tb2RlLAogICAgICAgICBmYWtlX2dyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXJfLmRlY29kZXJfdGFyZ2V0X3Byb3ZpZGVyKCl9OwogCkBAIC00MjcsNyArNDI3LDYgQEAKICAgICAgICAgICAgICAgJnBsYXllcnNbaV0sCiAgICAgICAgICAgICAgIGRtcF9yZWFkZXJfLnZpZGVvX2NvZGVjKCksCiAgICAgICAgICAgICAgIGtTYkRybVN5c3RlbUludmFsaWQsCi0gICAgICAgICAgICAgICZqb2JfcXVldWVfLAogICAgICAgICAgICAgICBvdXRwdXRfbW9kZSwKICAgICAgICAgICAgICAgZmFrZV9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyXy5kZWNvZGVyX3RhcmdldF9wcm92aWRlcigpfTsKIApAQCAtNjY4LDMgKzY2Nyw0IEBACiB9ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCiB9ICAvLyBuYW1lc3BhY2Ugc2hhcmVkCiB9ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCisjZW5kaWYgIC8vIFNCX0hBUyhQTEFZRVJfRklMVEVSX1RFU1RTKQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdmlkZW9fZGVjb2Rlcl9pbnRlcm5hbC5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdmlkZW9fZGVjb2Rlcl9pbnRlcm5hbC5oCmluZGV4IDU3NDk2NTguLmY1MGU0OGQgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3ZpZGVvX2RlY29kZXJfaW50ZXJuYWwuaAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci92aWRlb19kZWNvZGVyX2ludGVybmFsLmgKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlICJzdGFyYm9hcmQvY29uZmlndXJhdGlvbi5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9wbGF5ZXIuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL2ludGVybmFsX29ubHkuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2NhbGxiYWNrLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci92aWRlb19mcmFtZV9pbnRlcm5hbC5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9pbnB1dF9idWZmZXJfaW50ZXJuYWwuaCIKIApAQCAtNTQsNyArNTUsNyBAQAogICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248dm9pZChTdGF0dXMgc3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+JiBmcmFtZSk+CiAgICAgICBEZWNvZGVyU3RhdHVzQ0I7Ci0gIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IEVycm9yQ0I7CisgIHR5cGVkZWYgOjpzdGFyYm9hcmQ6OnNoYXJlZDo6c3RhcmJvYXJkOjpwbGF5ZXI6OmZpbHRlcjo6RXJyb3JDQiBFcnJvckNCOwogCiAgIHZpcnR1YWwgflZpZGVvRGVjb2RlcigpIHt9CiAKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3ZpZGVvX3JlbmRlcmVyX2ludGVybmFsLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdmlkZW9fcmVuZGVyZXJfaW50ZXJuYWwuY2MKaW5kZXggZGZkZjhkNi4uMWZiNzQyMSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdmlkZW9fcmVuZGVyZXJfaW50ZXJuYWwuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdmlkZW9fcmVuZGVyZXJfaW50ZXJuYWwuY2MKQEAgLTIzLDkgKzIzLDE1IEBACiBuYW1lc3BhY2UgcGxheWVyIHsKIG5hbWVzcGFjZSBmaWx0ZXIgewogCituYW1lc3BhY2UgeworCiB1c2luZyBzdGQ6OnBsYWNlaG9sZGVyczo6XzE7CiB1c2luZyBzdGQ6OnBsYWNlaG9sZGVyczo6XzI7CiAKK2NvbnN0IFNiVGltZSBrU2Vla1RpbWVvdXRSZXRyeUludGVydmFsID0gMjUgKiBrU2JUaW1lTWlsbGlzZWNvbmQ7CisKK30gIC8vIG5hbWVzcGFjZQorCiBWaWRlb1JlbmRlcmVyOjpWaWRlb1JlbmRlcmVyKHNjb3BlZF9wdHI8VmlkZW9EZWNvZGVyPiBkZWNvZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVRpbWVQcm92aWRlciogbWVkaWFfdGltZV9wcm92aWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVkX3B0cjxWaWRlb1JlbmRlckFsZ29yaXRobT4gYWxnb3JpdGhtLApAQCAtMzMsMTggKzM5LDIwIEBACiAgICAgOiBtZWRpYV90aW1lX3Byb3ZpZGVyXyhtZWRpYV90aW1lX3Byb3ZpZGVyKSwKICAgICAgIGFsZ29yaXRobV8oYWxnb3JpdGhtLlBhc3MoKSksCiAgICAgICBzaW5rXyhzaW5rKSwKLSAgICAgIHNlZWtpbmdfKGZhbHNlKSwKLSAgICAgIHNlZWtpbmdfdG9fdGltZV8oMCksCi0gICAgICBlbmRfb2Zfc3RyZWFtX3dyaXR0ZW5fKGZhbHNlKSwKLSAgICAgIG5lZWRfbW9yZV9pbnB1dF8odHJ1ZSksCiAgICAgICBkZWNvZGVyXyhkZWNvZGVyLlBhc3MoKSksCi0gICAgICBmaXJzdF9pbnB1dF93cml0dGVuXyhmYWxzZSkgeworICAgICAgZW5kX29mX3N0cmVhbV93cml0dGVuXyhmYWxzZSksCisgICAgICBlbmRlZF9jYl9jYWxsZWRfKGZhbHNlKSwKKyAgICAgIG5lZWRfbW9yZV9pbnB1dF8odHJ1ZSksCisgICAgICBzZWVraW5nXyhmYWxzZSksCisgICAgICBudW1iZXJfb2ZfZnJhbWVzXygwKSB7CiAgIFNCX0RDSEVDSyhkZWNvZGVyXyAhPSBOVUxMKTsKICAgU0JfRENIRUNLKGFsZ29yaXRobV8gIT0gTlVMTCk7CiAgIFNCX0RDSEVDSyhzaW5rXyAhPSBOVUxMKTsKIH0KIAogVmlkZW9SZW5kZXJlcjo6flZpZGVvUmVuZGVyZXIoKSB7CisgIFNCX0RDSEVDSyhCZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOworCiAgIHNpbmtfID0gTlVMTDsKIAogICAvLyBCZSBzdXJlIHRvIHJlbGVhc2UgYW55dGhpbmcgY3JlYXRlZCBieSB0aGUgZGVjb2Rlcl8gYmVmb3JlIHJlbGVhc2luZyB0aGUKQEAgLTUyLDExICs2MCwyNyBAQAogICBpZiAoZmlyc3RfaW5wdXRfd3JpdHRlbl8pIHsKICAgICBkZWNvZGVyXy0+UmVzZXQoKTsKICAgfQotICBmcmFtZXNfLmNsZWFyKCk7CisKKyAgLy8gTm93IGJvdGggdGhlIGRlY29kZXIgdGhyZWFkIGFuZCB0aGUgc2luayB0aHJlYWQgc2hvdWxkIGhhdmUgYmVlbiBzaHV0ZG93bi4KKyAgZGVjb2Rlcl9mcmFtZXNfLmNsZWFyKCk7CisgIHNpbmtfZnJhbWVzXy5jbGVhcigpOworICBudW1iZXJfb2ZfZnJhbWVzXy5zdG9yZSgwKTsKKwogICBkZWNvZGVyXy5yZXNldCgpOwogfQogCi12b2lkIFZpZGVvUmVuZGVyZXI6OkluaXRpYWxpemUoY29uc3QgRXJyb3JDQiYgZXJyb3JfY2IpIHsKK3ZvaWQgVmlkZW9SZW5kZXJlcjo6SW5pdGlhbGl6ZShjb25zdCBFcnJvckNCJiBlcnJvcl9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcmVyb2xsZWRDQiYgcHJlcm9sbGVkX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVuZGVkQ0ImIGVuZGVkX2NiKSB7CisgIFNCX0RDSEVDSyhCZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOworICBTQl9EQ0hFQ0socHJlcm9sbGVkX2NiKTsKKyAgU0JfRENIRUNLKGVuZGVkX2NiKTsKKyAgU0JfRENIRUNLKCFwcmVyb2xsZWRfY2JfKTsKKyAgU0JfRENIRUNLKCFlbmRlZF9jYl8pOworCisgIHByZXJvbGxlZF9jYl8gPSBwcmVyb2xsZWRfY2I7CisgIGVuZGVkX2NiXyA9IGVuZGVkX2NiOworCiAgIGRlY29kZXJfLT5Jbml0aWFsaXplKHN0ZDo6YmluZCgmVmlkZW9SZW5kZXJlcjo6T25EZWNvZGVyU3RhdHVzLCB0aGlzLCBfMSwgXzIpLAogICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9jYik7CiAgIGlmIChzaW5rXykgewpAQCAtNjQsMjAgKzg4LDEyIEBACiAgIH0KIH0KIAotdm9pZCBWaWRlb1JlbmRlcmVyOjpTZXRCb3VuZHMoaW50IHpfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCkgewotICBzaW5rXy0+U2V0Qm91bmRzKHpfaW5kZXgsIHgsIHksIHdpZHRoLCBoZWlnaHQpOwotfQotCiB2b2lkIFZpZGVvUmVuZGVyZXI6OldyaXRlU2FtcGxlKAogICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8SW5wdXRCdWZmZXI+JiBpbnB1dF9idWZmZXIpIHsKLSAgU0JfRENIRUNLKHRocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOworICBTQl9EQ0hFQ0soQmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKICAgU0JfRENIRUNLKGlucHV0X2J1ZmZlcik7CiAKLSAgaWYgKGVuZF9vZl9zdHJlYW1fd3JpdHRlbl8pIHsKKyAgaWYgKGVuZF9vZl9zdHJlYW1fd3JpdHRlbl8ubG9hZCgpKSB7CiAgICAgU0JfTE9HKEVSUk9SKSA8PCAiQXBwZW5kaW5nIHZpZGVvIHNhbXBsZSBhdCAiIDw8IGlucHV0X2J1ZmZlci0+dGltZXN0YW1wKCkKICAgICAgICAgICAgICAgICAgIDw8ICIgYWZ0ZXIgRU9TIHJlYWNoZWQuIjsKICAgICByZXR1cm47CkBAIC04OCwyOSArMTA0LDMxIEBACiAgICAgYWJzb2x1dGVfdGltZV9vZl9maXJzdF9pbnB1dF8gPSBTYlRpbWVHZXRNb25vdG9uaWNOb3coKTsKICAgfQogCi0gIHsKLSAgICBTY29wZWRMb2NrIGxvY2sobXV0ZXhfKTsKLSAgICBuZWVkX21vcmVfaW5wdXRfID0gZmFsc2U7Ci0gIH0KKyAgU0JfRENIRUNLKG5lZWRfbW9yZV9pbnB1dF8ubG9hZCgpKTsKKyAgbmVlZF9tb3JlX2lucHV0Xy5zdG9yZShmYWxzZSk7CiAKICAgZGVjb2Rlcl8tPldyaXRlSW5wdXRCdWZmZXIoaW5wdXRfYnVmZmVyKTsKIH0KIAogdm9pZCBWaWRlb1JlbmRlcmVyOjpXcml0ZUVuZE9mU3RyZWFtKCkgewotICBTQl9EQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7CisgIFNCX0RDSEVDSyhCZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwogCi0gIFNCX0xPR19JRihXQVJOSU5HLCBlbmRfb2Zfc3RyZWFtX3dyaXR0ZW5fKQorICBTQl9MT0dfSUYoV0FSTklORywgZW5kX29mX3N0cmVhbV93cml0dGVuXy5sb2FkKCkpCiAgICAgICA8PCAiVHJ5IHRvIHdyaXRlIEVPUyBhZnRlciBFT1MgaXMgcmVhY2hlZCI7Ci0gIGlmIChlbmRfb2Zfc3RyZWFtX3dyaXR0ZW5fKSB7CisgIGlmIChlbmRfb2Zfc3RyZWFtX3dyaXR0ZW5fLmxvYWQoKSkgewogICAgIHJldHVybjsKICAgfQotICBlbmRfb2Zfc3RyZWFtX3dyaXR0ZW5fID0gdHJ1ZTsKKyAgZW5kX29mX3N0cmVhbV93cml0dGVuXy5zdG9yZSh0cnVlKTsKKyAgaWYgKCFmaXJzdF9pbnB1dF93cml0dGVuXyAmJiAhZW5kZWRfY2JfY2FsbGVkXy5sb2FkKCkpIHsKKyAgICBlbmRlZF9jYl9jYWxsZWRfLnN0b3JlKHRydWUpOworICAgIFNjaGVkdWxlKGVuZGVkX2NiXyk7CisgIH0KICAgZmlyc3RfaW5wdXRfd3JpdHRlbl8gPSB0cnVlOwogICBkZWNvZGVyXy0+V3JpdGVFbmRPZlN0cmVhbSgpOwogfQogCiB2b2lkIFZpZGVvUmVuZGVyZXI6OlNlZWsoU2JUaW1lIHNlZWtfdG9fdGltZSkgewotICBTQl9EQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7CisgIFNCX0RDSEVDSyhCZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwogICBTQl9EQ0hFQ0soc2Vla190b190aW1lID49IDApOwogCiAgIGlmIChmaXJzdF9pbnB1dF93cml0dGVuXykgewpAQCAtMTE4LDc0ICsxMzYsNDEgQEAKICAgICBmaXJzdF9pbnB1dF93cml0dGVuXyA9IGZhbHNlOwogICB9CiAKLSAgU2NvcGVkTG9jayBsb2NrKG11dGV4Xyk7Ci0KKyAgLy8gQWZ0ZXIgZGVjb2Rlcl8tPlJlc2V0KCksIE9uRGVjb2RlclN0YXR1cygpIHdvbid0IGJlIGNhbGxlZCBiZWZvcmUgYW5vdGhlcgorICAvLyBXcml0ZVNhbXBsZSgpLiAgU28gaXQgaXMgc2FmZSB0byBtb2RpZnkgfHNlZWtpbmdfdG9fdGltZV98IGhlcmUuCiAgIHNlZWtpbmdfdG9fdGltZV8gPSBzdGQ6Om1heDxTYlRpbWU+KHNlZWtfdG9fdGltZSwgMCk7Ci0gIHNlZWtpbmdfID0gdHJ1ZTsKLSAgZW5kX29mX3N0cmVhbV93cml0dGVuXyA9IGZhbHNlOwotICBuZWVkX21vcmVfaW5wdXRfID0gdHJ1ZTsKKyAgc2Vla2luZ18uc3RvcmUodHJ1ZSk7CisgIGVuZF9vZl9zdHJlYW1fd3JpdHRlbl8uc3RvcmUoZmFsc2UpOworICBlbmRlZF9jYl9jYWxsZWRfLnN0b3JlKGZhbHNlKTsKKyAgbmVlZF9tb3JlX2lucHV0Xy5zdG9yZSh0cnVlKTsKIAotICBmcmFtZXNfLmNsZWFyKCk7Ci19CisgIENhbmNlbFBlbmRpbmdKb2JzKCk7CiAKLWJvb2wgVmlkZW9SZW5kZXJlcjo6SXNFbmRPZlN0cmVhbVBsYXllZCgpIGNvbnN0IHsKLSAgU0JfRENIRUNLKHRocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOwotICBTY29wZWRMb2NrIGxvY2sobXV0ZXhfKTsKLSAgcmV0dXJuIGVuZF9vZl9zdHJlYW1fd3JpdHRlbl8gJiYgZnJhbWVzXy5zaXplKCkgPD0gMTsKKyAgYXV0byBwcmVyb2xsX3RpbWVvdXQgPSBkZWNvZGVyXy0+R2V0UHJlcm9sbFRpbWVvdXQoKTsKKyAgaWYgKHByZXJvbGxfdGltZW91dCAhPSBrU2JUaW1lTWF4KSB7CisgICAgU2NoZWR1bGUoc3RkOjpiaW5kKCZWaWRlb1JlbmRlcmVyOjpPblNlZWtUaW1lb3V0LCB0aGlzKSwgcHJlcm9sbF90aW1lb3V0KTsKKyAgfQorCisgIFNjb3BlZExvY2sgc2NvcGVkX2xvY2tfZGVjb2Rlcl9mcmFtZXMoZGVjb2Rlcl9mcmFtZXNfbXV0ZXhfKTsKKyAgU2NvcGVkTG9jayBzY29wZWRfbG9ja19zaW5rX2ZyYW1lcyhzaW5rX2ZyYW1lc19tdXRleF8pOworICBkZWNvZGVyX2ZyYW1lc18uY2xlYXIoKTsKKyAgc2lua19mcmFtZXNfLmNsZWFyKCk7CisgIG51bWJlcl9vZl9mcmFtZXNfLnN0b3JlKDApOwogfQogCiBib29sIFZpZGVvUmVuZGVyZXI6OkNhbkFjY2VwdE1vcmVEYXRhKCkgY29uc3QgewotICBTQl9EQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7Ci0gIFNjb3BlZExvY2sgbG9jayhtdXRleF8pOwotICByZXR1cm4gZnJhbWVzXy5zaXplKCkgPCBkZWNvZGVyXy0+R2V0TWF4TnVtYmVyT2ZDYWNoZWRGcmFtZXMoKSAmJgotICAgICAgICAgIWVuZF9vZl9zdHJlYW1fd3JpdHRlbl8gJiYgbmVlZF9tb3JlX2lucHV0XzsKKyAgU0JfRENIRUNLKEJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CisgIHJldHVybiBudW1iZXJfb2ZfZnJhbWVzXy5sb2FkKCkgPAorICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGRlY29kZXJfLT5HZXRNYXhOdW1iZXJPZkNhY2hlZEZyYW1lcygpKSAmJgorICAgICAgICAgIWVuZF9vZl9zdHJlYW1fd3JpdHRlbl8ubG9hZCgpICYmIG5lZWRfbW9yZV9pbnB1dF8ubG9hZCgpOwogfQogCi1ib29sIFZpZGVvUmVuZGVyZXI6OlVwZGF0ZUFuZFJldHJpZXZlSXNTZWVraW5nSW5Qcm9ncmVzcygpIHsKLSAgU0JfRENIRUNLKHRocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOwotICBTY29wZWRMb2NrIGxvY2sobXV0ZXhfKTsKLSAgaWYgKHNlZWtpbmdfICYmICFmcmFtZXNfLmVtcHR5KCkpIHsKLSAgICBhdXRvIGVsYXBzZWQgPSBTYlRpbWVHZXRNb25vdG9uaWNOb3coKSAtIGFic29sdXRlX3RpbWVfb2ZfZmlyc3RfaW5wdXRfOwotICAgIHNlZWtpbmdfID0gZWxhcHNlZCA8IGRlY29kZXJfLT5HZXRQcmVyb2xsVGltZW91dCgpOwotICB9Ci0gIHJldHVybiBzZWVraW5nXzsKLX0KLQotdm9pZCBWaWRlb1JlbmRlcmVyOjpPbkRlY29kZXJTdGF0dXMoVmlkZW9EZWNvZGVyOjpTdGF0dXMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiYgZnJhbWUpIHsKLSAgU2NvcGVkTG9jayBsb2NrKG11dGV4Xyk7Ci0KLSAgaWYgKHN0YXR1cyA9PSBWaWRlb0RlY29kZXI6OmtSZWxlYXNlQWxsRnJhbWVzKSB7Ci0gICAgZnJhbWVzXy5jbGVhcigpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChmcmFtZSkgewotICAgIFNCX0RDSEVDSyhmaXJzdF9pbnB1dF93cml0dGVuXyk7Ci0KLSAgICBib29sIGZyYW1lX3Rvb19lYXJseSA9IGZhbHNlOwotICAgIGlmIChzZWVraW5nXykgewotICAgICAgaWYgKGZyYW1lLT5pc19lbmRfb2Zfc3RyZWFtKCkpIHsKLSAgICAgICAgc2Vla2luZ18gPSBmYWxzZTsKLSAgICAgIH0gZWxzZSBpZiAoZnJhbWUtPnRpbWVzdGFtcCgpIDwgc2Vla2luZ190b190aW1lXykgewotICAgICAgICBmcmFtZV90b29fZWFybHkgPSB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoIWZyYW1lX3Rvb19lYXJseSkgewotICAgICAgZnJhbWVzXy5wdXNoX2JhY2soZnJhbWUpOwotICAgIH0KLQotICAgIGlmIChzZWVraW5nXyAmJiBmcmFtZXNfLnNpemUoKSA+PSBkZWNvZGVyXy0+R2V0UHJlcm9sbEZyYW1lQ291bnQoKSkgewotICAgICAgc2Vla2luZ18gPSBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICBuZWVkX21vcmVfaW5wdXRfID0gKHN0YXR1cyA9PSBWaWRlb0RlY29kZXI6OmtOZWVkTW9yZUlucHV0KTsKLX0KLQotdm9pZCBWaWRlb1JlbmRlcmVyOjpSZW5kZXIoVmlkZW9SZW5kZXJlclNpbms6OkRyYXdGcmFtZUNCIGRyYXdfZnJhbWVfY2IpIHsKLSAgU2NvcGVkTG9jayBsb2NrKG11dGV4Xyk7Ci0gIGFsZ29yaXRobV8tPlJlbmRlcihtZWRpYV90aW1lX3Byb3ZpZGVyXywgJmZyYW1lc18sIGRyYXdfZnJhbWVfY2IpOwordm9pZCBWaWRlb1JlbmRlcmVyOjpTZXRCb3VuZHMoaW50IHpfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCkgeworICBzaW5rXy0+U2V0Qm91bmRzKHpfaW5kZXgsIHgsIHksIHdpZHRoLCBoZWlnaHQpOwogfQogCiBTYkRlY29kZVRhcmdldCBWaWRlb1JlbmRlcmVyOjpHZXRDdXJyZW50RGVjb2RlVGFyZ2V0KCkgewpAQCAtMTk3LDYgKzE4Miw3OSBAQAogICByZXR1cm4gZGVjb2Rlcl8tPkdldEN1cnJlbnREZWNvZGVUYXJnZXQoKTsKIH0KIAordm9pZCBWaWRlb1JlbmRlcmVyOjpPbkRlY29kZXJTdGF0dXMoVmlkZW9EZWNvZGVyOjpTdGF0dXMgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiYgZnJhbWUpIHsKKyAgaWYgKHN0YXR1cyA9PSBWaWRlb0RlY29kZXI6OmtSZWxlYXNlQWxsRnJhbWVzKSB7CisgICAgU2NvcGVkTG9jayBzY29wZWRfbG9ja19kZWNvZGVyX2ZyYW1lcyhkZWNvZGVyX2ZyYW1lc19tdXRleF8pOworICAgIFNjb3BlZExvY2sgc2NvcGVkX2xvY2tfc2lua19mcmFtZXMoc2lua19mcmFtZXNfbXV0ZXhfKTsKKyAgICBkZWNvZGVyX2ZyYW1lc18uY2xlYXIoKTsKKyAgICBzaW5rX2ZyYW1lc18uY2xlYXIoKTsKKyAgICBudW1iZXJfb2ZfZnJhbWVzXy5zdG9yZSgwKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoZnJhbWUpIHsKKyAgICBTQl9EQ0hFQ0soZmlyc3RfaW5wdXRfd3JpdHRlbl8pOworCisgICAgYm9vbCBmcmFtZV90b29fZWFybHkgPSBmYWxzZTsKKyAgICBpZiAoc2Vla2luZ18ubG9hZCgpKSB7CisgICAgICBpZiAoZnJhbWUtPmlzX2VuZF9vZl9zdHJlYW0oKSkgeworICAgICAgICBzZWVraW5nXy5zdG9yZShmYWxzZSk7CisgICAgICAgIFNjaGVkdWxlKHByZXJvbGxlZF9jYl8pOworICAgICAgfSBlbHNlIGlmIChmcmFtZS0+dGltZXN0YW1wKCkgPCBzZWVraW5nX3RvX3RpbWVfKSB7CisgICAgICAgIGZyYW1lX3Rvb19lYXJseSA9IHRydWU7CisgICAgICB9CisgICAgfQorICAgIGlmICghZnJhbWVfdG9vX2Vhcmx5KSB7CisgICAgICBTY29wZWRMb2NrIHNjb3BlZF9sb2NrKGRlY29kZXJfZnJhbWVzX211dGV4Xyk7CisgICAgICBkZWNvZGVyX2ZyYW1lc18ucHVzaF9iYWNrKGZyYW1lKTsKKyAgICAgIG51bWJlcl9vZl9mcmFtZXNfLmluY3JlbWVudCgpOworICAgIH0KKworICAgIGlmIChzZWVraW5nXy5sb2FkKCkgJiYKKyAgICAgICAgbnVtYmVyX29mX2ZyYW1lc18ubG9hZCgpID49CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihkZWNvZGVyXy0+R2V0UHJlcm9sbEZyYW1lQ291bnQoKSkpIHsKKyAgICAgIHNlZWtpbmdfLnN0b3JlKGZhbHNlKTsKKyAgICAgIFNjaGVkdWxlKHByZXJvbGxlZF9jYl8pOworICAgIH0KKyAgfQorCisgIG5lZWRfbW9yZV9pbnB1dF8uc3RvcmUoc3RhdHVzID09IFZpZGVvRGVjb2Rlcjo6a05lZWRNb3JlSW5wdXQpOworfQorCit2b2lkIFZpZGVvUmVuZGVyZXI6OlJlbmRlcihWaWRlb1JlbmRlcmVyU2luazo6RHJhd0ZyYW1lQ0IgZHJhd19mcmFtZV9jYikgeworICB7CisgICAgU2NvcGVkTG9jayBzY29wZWRfbG9ja19kZWNvZGVyX2ZyYW1lcyhkZWNvZGVyX2ZyYW1lc19tdXRleF8pOworICAgIHNpbmtfZnJhbWVzX211dGV4Xy5BY3F1aXJlKCk7CisgICAgc2lua19mcmFtZXNfLmluc2VydChzaW5rX2ZyYW1lc18uZW5kKCksIGRlY29kZXJfZnJhbWVzXy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2Rlcl9mcmFtZXNfLmVuZCgpKTsKKyAgICBkZWNvZGVyX2ZyYW1lc18uY2xlYXIoKTsKKyAgfQorICBzaXplX3QgbnVtYmVyX29mX3NpbmtfZnJhbWVzID0gc2lua19mcmFtZXNfLnNpemUoKTsKKyAgYWxnb3JpdGhtXy0+UmVuZGVyKG1lZGlhX3RpbWVfcHJvdmlkZXJfLCAmc2lua19mcmFtZXNfLCBkcmF3X2ZyYW1lX2NiKTsKKyAgbnVtYmVyX29mX2ZyYW1lc18uZmV0Y2hfc3ViKAorICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4obnVtYmVyX29mX3NpbmtfZnJhbWVzIC0gc2lua19mcmFtZXNfLnNpemUoKSkpOworICBpZiAobnVtYmVyX29mX2ZyYW1lc18ubG9hZCgpIDw9IDEgJiYgZW5kX29mX3N0cmVhbV93cml0dGVuXy5sb2FkKCkgJiYKKyAgICAgICFlbmRlZF9jYl9jYWxsZWRfLmxvYWQoKSkgeworICAgIGVuZGVkX2NiX2NhbGxlZF8uc3RvcmUodHJ1ZSk7CisgICAgU2NoZWR1bGUoZW5kZWRfY2JfKTsKKyAgfQorICBzaW5rX2ZyYW1lc19tdXRleF8uUmVsZWFzZSgpOworfQorCit2b2lkIFZpZGVvUmVuZGVyZXI6Ok9uU2Vla1RpbWVvdXQoKSB7CisgIFNCX0RDSEVDSyhCZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOworICBpZiAoc2Vla2luZ18ubG9hZCgpKSB7CisgICAgaWYgKG51bWJlcl9vZl9mcmFtZXNfLmxvYWQoKSA+IDApIHsKKyAgICAgIHNlZWtpbmdfLnN0b3JlKGZhbHNlKTsKKyAgICAgIFNjaGVkdWxlKHByZXJvbGxlZF9jYl8pOworICAgIH0gZWxzZSB7CisgICAgICBTY2hlZHVsZShzdGQ6OmJpbmQoJlZpZGVvUmVuZGVyZXI6Ok9uU2Vla1RpbWVvdXQsIHRoaXMpLAorICAgICAgICAgICAgICAga1NlZWtUaW1lb3V0UmV0cnlJbnRlcnZhbCk7CisgICAgfQorICB9Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBmaWx0ZXIKIH0gIC8vIG5hbWVzcGFjZSBwbGF5ZXIKIH0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3ZpZGVvX3JlbmRlcmVyX2ludGVybmFsLmggYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci92aWRlb19yZW5kZXJlcl9pbnRlcm5hbC5oCmluZGV4IGU5ODJhYjUuLjEzZTkyN2QgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3ZpZGVvX3JlbmRlcmVyX2ludGVybmFsLmgKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdmlkZW9fcmVuZGVyZXJfaW50ZXJuYWwuaApAQCAtMTcsMTIgKzE3LDE0IEBACiAKICNpbmNsdWRlIDxsaXN0PgogCisjaW5jbHVkZSAic3RhcmJvYXJkL2F0b21pYy5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9jb21tb24vcmVmX2NvdW50ZWQuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvY29tbW9uL3Njb3BlZF9wdHIuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL21lZGlhLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL211dGV4LmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9pbnRlcm5hbF9vbmx5LmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9jYWxsYmFjay5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvbWVkaWFfdGltZV9wcm92aWRlci5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdmlkZW9fZGVjb2Rlcl9pbnRlcm5hbC5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdmlkZW9fZnJhbWVfaW50ZXJuYWwuaCIKQEAgLTMwLDcgKzMyLDcgQEAKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3ZpZGVvX3JlbmRlcmVyX2ludGVybmFsLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci92aWRlb19yZW5kZXJlcl9zaW5rLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2lucHV0X2J1ZmZlcl9pbnRlcm5hbC5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3RocmVhZF9jaGVja2VyLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2pvYl9xdWV1ZS5oIgogI2luY2x1ZGUgInN0YXJib2FyZC90aW1lLmgiCiAKIG5hbWVzcGFjZSBzdGFyYm9hcmQgewpAQCAtNDEsMTggKzQzLDE5IEBACiAKIC8vIEEgY2xhc3MgdGhhdCBzaXRzIGluIGJldHdlZW4gdGhlIHZpZGVvIGRlY29kZXIsIHRoZSB2aWRlbyBzaW5rIGFuZCB0aGUKIC8vIHBpcGVsaW5lIHRvIGNvb3JkaW5hdGUgZGF0YSB0cmFuc2ZlciBiZXR3ZWVuIHRoZXNlIHBhcnRpZXMuCi1jbGFzcyBWaWRlb1JlbmRlcmVyIHsKK2NsYXNzIFZpZGVvUmVuZGVyZXIgOiBKb2JRdWV1ZTo6Sm9iT3duZXIgewogIHB1YmxpYzoKLSAgdHlwZWRlZiBWaWRlb0RlY29kZXI6OkVycm9yQ0IgRXJyb3JDQjsKLQorICAvLyBBbGwgb2YgdGhlIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIG9uIHRoZSBQbGF5ZXJXb3JrZXIgdGhyZWFkIHVubGVzcyBtYXJrZWQKKyAgLy8gb3RoZXJ3aXNlLgogICBWaWRlb1JlbmRlcmVyKHNjb3BlZF9wdHI8VmlkZW9EZWNvZGVyPiBkZWNvZGVyLAogICAgICAgICAgICAgICAgIE1lZGlhVGltZVByb3ZpZGVyKiBtZWRpYV90aW1lX3Byb3ZpZGVyLAogICAgICAgICAgICAgICAgIHNjb3BlZF9wdHI8VmlkZW9SZW5kZXJBbGdvcml0aG0+IGFsZ29yaXRobSwKICAgICAgICAgICAgICAgICBzY29wZWRfcmVmcHRyPFZpZGVvUmVuZGVyZXJTaW5rPiBzaW5rKTsKICAgflZpZGVvUmVuZGVyZXIoKTsKIAotICB2b2lkIEluaXRpYWxpemUoY29uc3QgRXJyb3JDQiYgZXJyb3JfY2IpOwotICB2b2lkIFNldEJvdW5kcyhpbnQgel9pbmRleCwgaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworICB2b2lkIEluaXRpYWxpemUoY29uc3QgRXJyb3JDQiYgZXJyb3JfY2IsCisgICAgICAgICAgICAgICAgICBjb25zdCBQcmVyb2xsZWRDQiYgcHJlcm9sbGVkX2NiLAorICAgICAgICAgICAgICAgICAgY29uc3QgRW5kZWRDQiYgZW5kZWRfY2IpOwogICBpbnQgR2V0RHJvcHBlZEZyYW1lcygpIGNvbnN0IHsgcmV0dXJuIGFsZ29yaXRobV8tPkdldERyb3BwZWRGcmFtZXMoKTsgfQogCiAgIHZvaWQgV3JpdGVTYW1wbGUoY29uc3Qgc2NvcGVkX3JlZnB0cjxJbnB1dEJ1ZmZlcj4mIGlucHV0X2J1ZmZlcik7CkBAIC02MCw0NCArNjMsNTcgQEAKIAogICB2b2lkIFNlZWsoU2JUaW1lIHNlZWtfdG9fdGltZSk7CiAKLSAgYm9vbCBJc0VuZE9mU3RyZWFtV3JpdHRlbigpIGNvbnN0IHsgcmV0dXJuIGVuZF9vZl9zdHJlYW1fd3JpdHRlbl87IH0KLSAgYm9vbCBJc0VuZE9mU3RyZWFtUGxheWVkKCkgY29uc3Q7CisgIGJvb2wgSXNFbmRPZlN0cmVhbVdyaXR0ZW4oKSBjb25zdCB7IHJldHVybiBlbmRfb2Zfc3RyZWFtX3dyaXR0ZW5fLmxvYWQoKTsgfQogICBib29sIENhbkFjY2VwdE1vcmVEYXRhKCkgY29uc3Q7Ci0gIGJvb2wgVXBkYXRlQW5kUmV0cmlldmVJc1NlZWtpbmdJblByb2dyZXNzKCk7CiAKKyAgLy8gQm90aCBvZiB0aGUgZm9sbG93aW5nIHR3byBmdW5jdGlvbnMgY2FuIGJlIGNhbGxlZCBvbiBhbnkgdGhyZWFkcy4KKyAgdm9pZCBTZXRCb3VuZHMoaW50IHpfaW5kZXgsIGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKICAgU2JEZWNvZGVUYXJnZXQgR2V0Q3VycmVudERlY29kZVRhcmdldCgpOwogCiAgcHJpdmF0ZToKICAgdHlwZWRlZiBzdGQ6Omxpc3Q8c2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPj4gRnJhbWVzOwogCisgIC8vIEJvdGggb2YgdGhlIGZvbGxvd2luZyB0d28gZnVuY3Rpb25zIGNhbiBiZSBjYWxsZWQgb24gYW55IHRocmVhZHMuCiAgIHZvaWQgT25EZWNvZGVyU3RhdHVzKFZpZGVvRGVjb2Rlcjo6U3RhdHVzIHN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiYgZnJhbWUpOwogICB2b2lkIFJlbmRlcihWaWRlb1JlbmRlcmVyU2luazo6RHJhd0ZyYW1lQ0IgZHJhd19mcmFtZV9jYik7Ci0KLSAgVGhyZWFkQ2hlY2tlciB0aHJlYWRfY2hlY2tlcl87Ci0gIE11dGV4IG11dGV4XzsKKyAgdm9pZCBPblNlZWtUaW1lb3V0KCk7CiAKICAgTWVkaWFUaW1lUHJvdmlkZXIqIGNvbnN0IG1lZGlhX3RpbWVfcHJvdmlkZXJfOwogICBzY29wZWRfcHRyPFZpZGVvUmVuZGVyQWxnb3JpdGhtPiBhbGdvcml0aG1fOwogICBzY29wZWRfcmVmcHRyPFZpZGVvUmVuZGVyZXJTaW5rPiBzaW5rXzsKLQotICBib29sIHNlZWtpbmdfOwotICBTYlRpbWVNb25vdG9uaWMgYWJzb2x1dGVfdGltZV9vZl9maXJzdF9pbnB1dF87Ci0KLSAgRnJhbWVzIGZyYW1lc187Ci0KLSAgU2JUaW1lIHNlZWtpbmdfdG9fdGltZV87Ci0gIGJvb2wgZW5kX29mX3N0cmVhbV93cml0dGVuXzsKLSAgYm9vbCBuZWVkX21vcmVfaW5wdXRfOwotCiAgIHNjb3BlZF9wdHI8VmlkZW9EZWNvZGVyPiBkZWNvZGVyXzsKIAorICBQcmVyb2xsZWRDQiBwcmVyb2xsZWRfY2JfOworICBFbmRlZENCIGVuZGVkX2NiXzsKKworICBTYlRpbWVNb25vdG9uaWMgYWJzb2x1dGVfdGltZV9vZl9maXJzdF9pbnB1dF8gPSAwOwogICAvLyBPdXIgb3duZXIgd2lsbCBhdHRlbXB0IHRvIHNlZWsgdG8gdGltZSAwIHdoZW4gcGxheWJhY2sgYmVnaW5zLiAgSW4KICAgLy8gZ2VuZXJhbCwgc2Vla2luZyBjb3VsZCByZXF1aXJlIGEgZnVsbCByZXNldCBvZiB0aGUgdW5kZXJseWluZyBkZWNvZGVyIG9uCiAgIC8vIHNvbWUgcGxhdGZvcm1zLCBzbyB3ZSBtYWtlIGFuIGVmZm9ydCB0byBpbXByb3ZlIHBsYXliYWNrIHN0YXJ0dXAKICAgLy8gcGVyZm9ybWFuY2UgYnkga2VlcGluZyB0cmFjayBvZiB3aGV0aGVyIHdlIGFscmVhZHkgaGF2ZSBhIGZyZXNoIGRlY29kZXIsCiAgIC8vIGFuZCBjYW4gdGh1cyBhdm9pZCBkb2luZyBhIGZ1bGwgcmVzZXQuCi0gIGJvb2wgZmlyc3RfaW5wdXRfd3JpdHRlbl87CisgIGJvb2wgZmlyc3RfaW5wdXRfd3JpdHRlbl8gPSBmYWxzZTsKKyAgYXRvbWljX2Jvb2wgZW5kX29mX3N0cmVhbV93cml0dGVuXzsKKyAgYXRvbWljX2Jvb2wgZW5kZWRfY2JfY2FsbGVkXzsKKworICBhdG9taWNfYm9vbCBuZWVkX21vcmVfaW5wdXRfOworICBhdG9taWNfYm9vbCBzZWVraW5nXzsKKyAgU2JUaW1lIHNlZWtpbmdfdG9fdGltZV8gPSAwOworCisgIC8vIHxudW1iZXJfb2ZfZnJhbWVzX3wgPSBkZWNvZGVyX2ZyYW1lc18uc2l6ZSgpICsgc2lua19mcmFtZXNfLnNpemUoKQorICBhdG9taWNfaW50MzJfdCBudW1iZXJfb2ZfZnJhbWVzXzsKKyAgLy8gfHNpbmtfZnJhbWVzX3wgaXMgbG9ja2VkIGluc2lkZSBWaWRlb1JlbmRlcmVyOjpSZW5kZXIoKSB3aGVuIGNhbGxpbmcKKyAgLy8gYWxnb3JpdGhtXy0+UmVuZGVyKCkuICBTbyBPbkRlY29kZXJTdGF0dXMoKSB3b24ndCB0cnkgdG8gbG9jayBhbmQgYXBwZW5kCisgIC8vIHRoZSBkZWNvZGVkIGZyYW1lcyB0byB8c2lua19mcmFtZXNffCBkaXJlY3RseSB0byBhdm9pZCBiZWluZyBibG9ja2VkLiAgSXQKKyAgLy8gd2lsbCBhcHBlbmQgbmV3bHkgZGVjb2RlZCBmcmFtZXMgdG8gfGRlY29kZXJfZnJhbWVzX3wgaW5zdGVhZC4gIE5vdGUgdGhhdAorICAvLyBib3RoIHxkZWNvZGVyX2ZyYW1lc198IGFuZCB8c2lua19mcmFtZXNffCBjYW4gYmUgdXNlZCBvbiBtdWx0aXBsZSB0aHJlYWRzLgorICAvLyBXaGVuIHRoZXkgYXJlIGJlaW5nIG1vZGlmaWVkIGF0IHRoZSBzYW1lIHRpbWUsIHxkZWNvZGVyX2ZyYW1lc19tdXRleF98CisgIC8vIHNob3VsZCBhbHdheXMgYmUgbG9ja2VkIGJlZm9yZSB8c2lua19mcmFtZXNfbXV0ZXhffCB0byBhdm9pZCBkZWFkbG9jay4KKyAgTXV0ZXggZGVjb2Rlcl9mcmFtZXNfbXV0ZXhfOworICBGcmFtZXMgZGVjb2Rlcl9mcmFtZXNfOworICBNdXRleCBzaW5rX2ZyYW1lc19tdXRleF87CisgIEZyYW1lcyBzaW5rX2ZyYW1lc187CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgZmlsdGVyCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci93c29sYV9pbnRlcm5hbC5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3dzb2xhX2ludGVybmFsLmNjCmluZGV4IDM3NDJkMGEuLjllZjhkMjIgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3dzb2xhX2ludGVybmFsLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3dzb2xhX2ludGVybmFsLmNjCkBAIC0yOTgsMTIgKzI5OCwxMCBAQAogCiBpbnQgT3B0aW1hbEluZGV4KGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVjb2RlZEF1ZGlvPiYgc2VhcmNoX2Jsb2NrLAogICAgICAgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPERlY29kZWRBdWRpbz4mIHRhcmdldF9ibG9jaywKLSAgICAgICAgICAgICAgICAgU2JNZWRpYUF1ZGlvU2FtcGxlVHlwZSBzYW1wbGVfdHlwZSwKICAgICAgICAgICAgICAgICAgU2JNZWRpYUF1ZGlvRnJhbWVTdG9yYWdlVHlwZSBzdG9yYWdlX3R5cGUsCiAgICAgICAgICAgICAgICAgIEludGVydmFsIGV4Y2x1ZGVfaW50ZXJ2YWwpIHsKICAgaW50IGNoYW5uZWxzID0gc2VhcmNoX2Jsb2NrLT5jaGFubmVscygpOwogICBTQl9EQ0hFQ0soY2hhbm5lbHMgPT0gdGFyZ2V0X2Jsb2NrLT5jaGFubmVscygpKTsKLSAgU0JfRENIRUNLKHNhbXBsZV90eXBlID09IGtTYk1lZGlhQXVkaW9TYW1wbGVUeXBlRmxvYXQzMik7CiAgIFNCX0RDSEVDSyhzdG9yYWdlX3R5cGUgPT0ga1NiTWVkaWFBdWRpb0ZyYW1lU3RvcmFnZVR5cGVJbnRlcmxlYXZlZCk7CiAKICAgaW50IHRhcmdldF9zaXplID0gdGFyZ2V0X2Jsb2NrLT5mcmFtZXMoKTsKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3dzb2xhX2ludGVybmFsLmggYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci93c29sYV9pbnRlcm5hbC5oCmluZGV4IGM0OWRjMGMuLjE0NWFmZjEgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3dzb2xhX2ludGVybmFsLmgKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvd3NvbGFfaW50ZXJuYWwuaApAQCAtNDMsNyArNDMsNiBAQAogLy8gfGV4Y2x1ZGVfaW50ZXJ2YWx8IGlzIGFuIGludGVydmFsIHRoYXQgaXMgZXhjbHVkZWQgZnJvbSB0aGUgc2VhcmNoLgogaW50IE9wdGltYWxJbmRleChjb25zdCBzY29wZWRfcmVmcHRyPERlY29kZWRBdWRpbz4mIHNlYXJjaF9ibG9jaywKICAgICAgICAgICAgICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxEZWNvZGVkQXVkaW8+JiB0YXJnZXRfYmxvY2ssCi0gICAgICAgICAgICAgICAgIFNiTWVkaWFBdWRpb1NhbXBsZVR5cGUgc2FtcGxlX3R5cGUsCiAgICAgICAgICAgICAgICAgIFNiTWVkaWFBdWRpb0ZyYW1lU3RvcmFnZVR5cGUgc3RvcmFnZV90eXBlLAogICAgICAgICAgICAgICAgICBJbnRlcnZhbCBleGNsdWRlX2ludGVydmFsKTsKIApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9qb2JfcXVldWUuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2pvYl9xdWV1ZS5jYwppbmRleCAwNzdiODg1Li4yNGZjYjQwIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2pvYl9xdWV1ZS5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2pvYl9xdWV1ZS5jYwpAQCAtMTgsNiArMTgsNyBAQAogCiAjaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9vbmNlLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3N5c3RlbS5oIgogI2luY2x1ZGUgInN0YXJib2FyZC90aHJlYWQuaCIKIAogbmFtZXNwYWNlIHN0YXJib2FyZCB7CkBAIC02MiwxMSArNjMsNyBAQAogCiB9ICAvLyBuYW1lc3BhY2UKIAotSm9iUXVldWU6OkpvYlF1ZXVlKCkKLSAgICA6IHRocmVhZF9pZF8oU2JUaHJlYWRHZXRJZCgpKSwKLSAgICAgIGNvbmRpdGlvbl8obXV0ZXhfKSwKLSAgICAgIGN1cnJlbnRfam9iX3Rva2VuXyhKb2JUb2tlbjo6a0ludmFsaWRUb2tlbiArIDEpLAotICAgICAgc3RvcHBlZF8oZmFsc2UpIHsKK0pvYlF1ZXVlOjpKb2JRdWV1ZSgpIDogdGhyZWFkX2lkXyhTYlRocmVhZEdldElkKCkpLCBjb25kaXRpb25fKG11dGV4XykgewogICBTQl9EQ0hFQ0soU2JUaHJlYWRJc1ZhbGlkSWQodGhyZWFkX2lkXykpOwogICBTZXRDdXJyZW50VGhyZWFkSm9iUXVldWUodGhpcyk7CiB9CkBAIC04OSwxMCArODYsMTAgQEAKICAgfQogCiAgIFNjb3BlZExvY2sgc2NvcGVkX2xvY2sobXV0ZXhfKTsKLSAgZm9yIChUaW1lVG9Kb2JNYXA6Oml0ZXJhdG9yIGl0ZXIgPSB0aW1lX3RvX2pvYl9tYXBfLmJlZ2luKCk7Ci0gICAgICAgaXRlciAhPSB0aW1lX3RvX2pvYl9tYXBfLmVuZCgpOyArK2l0ZXIpIHsKKyAgZm9yIChUaW1lVG9Kb2JSZWNvcmRNYXA6Oml0ZXJhdG9yIGl0ZXIgPSB0aW1lX3RvX2pvYl9yZWNvcmRfbWFwXy5iZWdpbigpOworICAgICAgIGl0ZXIgIT0gdGltZV90b19qb2JfcmVjb3JkX21hcF8uZW5kKCk7ICsraXRlcikgewogICAgIGlmIChpdGVyLT5zZWNvbmQuam9iX3Rva2VuID09IGpvYl90b2tlbikgewotICAgICAgdGltZV90b19qb2JfbWFwXy5lcmFzZShpdGVyKTsKKyAgICAgIHRpbWVfdG9fam9iX3JlY29yZF9tYXBfLmVyYXNlKGl0ZXIpOwogICAgICAgcmV0dXJuOwogICAgIH0KICAgfQpAQCAtMTAyLDcgKzk5LDcgQEAKICAgewogICAgIFNjb3BlZExvY2sgc2NvcGVkX2xvY2sobXV0ZXhfKTsKICAgICBzdG9wcGVkXyA9IHRydWU7Ci0gICAgdGltZV90b19qb2JfbWFwXy5jbGVhcigpOworICAgIHRpbWVfdG9fam9iX3JlY29yZF9tYXBfLmNsZWFyKCk7CiAgICAgY29uZGl0aW9uXy5TaWduYWwoKTsKICAgfQogfQpAQCAtMTUwLDE2ICsxNDcsMTkgQEAKIAogICBKb2JUb2tlbiBqb2JfdG9rZW4oY3VycmVudF9qb2JfdG9rZW5fKTsKICAgSm9iUmVjb3JkIGpvYl9yZWNvcmQgPSB7am9iX3Rva2VuLCBqb2IsIG93bmVyfTsKLQorI2lmIEVOQUJMRV9KT0JfUVVFVUVfUFJPRklMSU5HCisgIGpvYl9yZWNvcmQuc3RhY2tfc2l6ZSA9CisgICAgICBTYlN5c3RlbUdldFN0YWNrKGpvYl9yZWNvcmQuc3RhY2ssIGtQcm9maWxlU3RhY2tEZXB0aCk7CisjZW5kaWYgIC8vIEVOQUJMRV9KT0JfUVVFVUVfUFJPRklMSU5HCiAgIFNjb3BlZExvY2sgc2NvcGVkX2xvY2sobXV0ZXhfKTsKICAgaWYgKHN0b3BwZWRfKSB7CiAgICAgcmV0dXJuIEpvYlRva2VuKCk7CiAgIH0KICAgU2JUaW1lTW9ub3RvbmljIHRpbWVfdG9fcnVuX2pvYiA9IFNiVGltZUdldE1vbm90b25pY05vdygpICsgZGVsYXk7Ci0gIGJvb2wgaXNfZmlyc3Rfam9iID0gdGltZV90b19qb2JfbWFwXy5lbXB0eSgpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgdGltZV90b19ydW5fam9iIDwgdGltZV90b19qb2JfbWFwXy5iZWdpbigpLT5maXJzdDsKKyAgYm9vbCBpc19maXJzdF9qb2IgPSB0aW1lX3RvX2pvYl9yZWNvcmRfbWFwXy5lbXB0eSgpIHx8CisgICAgICAgICAgICAgICAgICAgICAgdGltZV90b19ydW5fam9iIDwgdGltZV90b19qb2JfcmVjb3JkX21hcF8uYmVnaW4oKS0+Zmlyc3Q7CiAKLSAgdGltZV90b19qb2JfbWFwXy5pbnNlcnQoc3RkOjptYWtlX3BhaXIodGltZV90b19ydW5fam9iLCBqb2JfcmVjb3JkKSk7CisgIHRpbWVfdG9fam9iX3JlY29yZF9tYXBfLmluc2VydChzdGQ6Om1ha2VfcGFpcih0aW1lX3RvX3J1bl9qb2IsIGpvYl9yZWNvcmQpKTsKICAgaWYgKGlzX2ZpcnN0X2pvYikgewogICAgIGNvbmRpdGlvbl8uU2lnbmFsKCk7CiAgIH0KQEAgLTE3NiwxMCArMTc2LDEwIEBACiAgIGJvb2wgc2hvdWxkX2tlZXBfcnVubmluZyA9IHRydWU7CiAgIHdoaWxlIChzaG91bGRfa2VlcF9ydW5uaW5nKSB7CiAgICAgc2hvdWxkX2tlZXBfcnVubmluZyA9IGZhbHNlOwotICAgIGZvciAoVGltZVRvSm9iTWFwOjppdGVyYXRvciBpdGVyID0gdGltZV90b19qb2JfbWFwXy5iZWdpbigpOwotICAgICAgICAgaXRlciAhPSB0aW1lX3RvX2pvYl9tYXBfLmVuZCgpOyArK2l0ZXIpIHsKKyAgICBmb3IgKFRpbWVUb0pvYlJlY29yZE1hcDo6aXRlcmF0b3IgaXRlciA9IHRpbWVfdG9fam9iX3JlY29yZF9tYXBfLmJlZ2luKCk7CisgICAgICAgICBpdGVyICE9IHRpbWVfdG9fam9iX3JlY29yZF9tYXBfLmVuZCgpOyArK2l0ZXIpIHsKICAgICAgIGlmIChpdGVyLT5zZWNvbmQub3duZXIgPT0gb3duZXIpIHsKLSAgICAgICAgdGltZV90b19qb2JfbWFwXy5lcmFzZShpdGVyKTsKKyAgICAgICAgdGltZV90b19qb2JfcmVjb3JkX21hcF8uZXJhc2UoaXRlcik7CiAgICAgICAgIHNob3VsZF9rZWVwX3J1bm5pbmcgPSB0cnVlOwogICAgICAgICBicmVhazsKICAgICAgIH0KQEAgLTE5MCwyNiArMTkwLDI3IEBACiBib29sIEpvYlF1ZXVlOjpUcnlUb1J1bk9uZUpvYihib29sIHdhaXRfZm9yX25leHRfam9iKSB7CiAgIFNCX0RDSEVDSyhCZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwogCi0gIEpvYiBqb2I7CisgIEpvYlJlY29yZCBqb2JfcmVjb3JkOwogCiAgIHsKICAgICBTY29wZWRMb2NrIHNjb3BlZF9sb2NrKG11dGV4Xyk7CiAgICAgaWYgKHN0b3BwZWRfKSB7CiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIGlmICh0aW1lX3RvX2pvYl9tYXBfLmVtcHR5KCkgJiYgd2FpdF9mb3JfbmV4dF9qb2IpIHsKKyAgICBpZiAodGltZV90b19qb2JfcmVjb3JkX21hcF8uZW1wdHkoKSAmJiB3YWl0X2Zvcl9uZXh0X2pvYikgewogICAgICAgLy8gfGtTYlRpbWVNYXh8IG1ha2VzIG1vcmUgc2Vuc2UgaGVyZSwgYnV0IHxrU2JUaW1lRGF5fCBpcyBtdWNoIHNhZmVyLgogICAgICAgY29uZGl0aW9uXy5XYWl0VGltZWQoa1NiVGltZURheSk7CiAgICAgfQotICAgIGlmICh0aW1lX3RvX2pvYl9tYXBfLmVtcHR5KCkpIHsKKyAgICBpZiAodGltZV90b19qb2JfcmVjb3JkX21hcF8uZW1wdHkoKSkgewogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBUaW1lVG9Kb2JNYXA6Oml0ZXJhdG9yIGZpcnN0X2RlbGF5ZWRfam9iID0gdGltZV90b19qb2JfbWFwXy5iZWdpbigpOworICAgIFRpbWVUb0pvYlJlY29yZE1hcDo6aXRlcmF0b3IgZmlyc3RfZGVsYXllZF9qb2IgPQorICAgICAgICB0aW1lX3RvX2pvYl9yZWNvcmRfbWFwXy5iZWdpbigpOwogICAgIFNiVGltZU1vbm90b25pYyBkZWxheSA9IGZpcnN0X2RlbGF5ZWRfam9iLT5maXJzdCAtIFNiVGltZUdldE1vbm90b25pY05vdygpOwogICAgIGlmIChkZWxheSA+IDApIHsKICAgICAgIGlmICh3YWl0X2Zvcl9uZXh0X2pvYikgewogICAgICAgICBjb25kaXRpb25fLldhaXRUaW1lZChkZWxheSk7Ci0gICAgICAgIGlmICh0aW1lX3RvX2pvYl9tYXBfLmVtcHR5KCkpIHsKKyAgICAgICAgaWYgKHRpbWVfdG9fam9iX3JlY29yZF9tYXBfLmVtcHR5KCkpIHsKICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgIH0gZWxzZSB7CkBAIC0yMTgsMTcgKzIxOSw0NSBAQAogICAgIH0KICAgICAvLyBUcnkgdG8gcmV0cmlldmUgdGhlIGpvYiBhZ2FpbiBhcyB0aGUgam9iIG1hcCBjYW4gYmUgYWx0ZXJlZCBkdXJpbmcgdGhlCiAgICAgLy8gd2FpdC4KLSAgICBmaXJzdF9kZWxheWVkX2pvYiA9IHRpbWVfdG9fam9iX21hcF8uYmVnaW4oKTsKKyAgICBmaXJzdF9kZWxheWVkX2pvYiA9IHRpbWVfdG9fam9iX3JlY29yZF9tYXBfLmJlZ2luKCk7CiAgICAgZGVsYXkgPSBmaXJzdF9kZWxheWVkX2pvYi0+Zmlyc3QgLSBTYlRpbWVHZXRNb25vdG9uaWNOb3coKTsKICAgICBpZiAoZGVsYXkgPiAwKSB7CiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIGpvYiA9IGZpcnN0X2RlbGF5ZWRfam9iLT5zZWNvbmQuam9iOwotICAgIHRpbWVfdG9fam9iX21hcF8uZXJhc2UoZmlyc3RfZGVsYXllZF9qb2IpOworICAgIGpvYl9yZWNvcmQgPSBmaXJzdF9kZWxheWVkX2pvYi0+c2Vjb25kOworICAgIHRpbWVfdG9fam9iX3JlY29yZF9tYXBfLmVyYXNlKGZpcnN0X2RlbGF5ZWRfam9iKTsKICAgfQogCi0gIFNCX0RDSEVDSyhqb2IpOwotICBqb2IoKTsKKyAgU0JfRENIRUNLKGpvYl9yZWNvcmQuam9iKTsKKworI2lmIEVOQUJMRV9KT0JfUVVFVUVfUFJPRklMSU5HCisgIFNiVGltZU1vbm90b25pYyBzdGFydCA9IFNiVGltZUdldE1vbm90b25pY05vdygpOworI2VuZGlmICAvLyBFTkFCTEVfSk9CX1FVRVVFX1BST0ZJTElORworCisgIGpvYl9yZWNvcmQuam9iKCk7CisKKyNpZiBFTkFCTEVfSk9CX1FVRVVFX1BST0ZJTElORworICBhdXRvIG5vdyA9IFNiVGltZUdldE1vbm90b25pY05vdygpOworICBhdXRvIGVsYXBzZWQgPSBub3cgLSBzdGFydDsKKyAgaWYgKGVsYXBzZWQgPiBtYXhfam9iX2ludGVydmFsXykgeworICAgIGpvYl9yZWNvcmRfd2l0aF9tYXhfaW50ZXJ2YWxfID0gam9iX3JlY29yZDsKKyAgICBtYXhfam9iX2ludGVydmFsXyA9IGVsYXBzZWQ7CisgIH0KKyAgaWYgKG5vdyAtIGxhc3RfcmVzZXRfdGltZV8gPiBrUHJvZmlsZVJlc2V0SW50ZXJ2YWwpIHsKKyAgICBTQl9MT0coSU5GTykgPDwgIj09PT09PT09PT09PT09PT0gTWF4IGpvYiB0YWtlcyAiIDw8IG1heF9qb2JfaW50ZXJ2YWxfOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgam9iX3JlY29yZC5zdGFja19zaXplOyArK2kpIHsKKyAgICAgIGNoYXIgZnVuY3Rpb25fbmFtZVsxMDI0XTsKKyAgICAgIGlmIChTYlN5c3RlbVN5bWJvbGl6ZShqb2JfcmVjb3JkLnN0YWNrW2ldLCBmdW5jdGlvbl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNCX0FSUkFZX1NJWkVfSU5UKGZ1bmN0aW9uX25hbWUpKSkgeworICAgICAgICBTQl9MT0coSU5GTykgPDwgIiAgICAiIDw8IGZ1bmN0aW9uX25hbWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBTQl9MT0coSU5GTykgPDwgIiAgICAiIDw8IGpvYl9yZWNvcmQuc3RhY2tbaV07CisgICAgICB9CisgICAgfQorICAgIGxhc3RfcmVzZXRfdGltZV8gPSBub3c7CisgICAgbWF4X2pvYl9pbnRlcnZhbF8gPSAwOworICB9CisjZW5kaWYgIC8vIEVOQUJMRV9KT0JfUVVFVUVfUFJPRklMSU5HCiAgIHJldHVybiB0cnVlOwogfQogCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2pvYl9xdWV1ZS5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9qb2JfcXVldWUuaAppbmRleCBhYjczNmVmLi41NWUxNTY3IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2pvYl9xdWV1ZS5oCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvam9iX3F1ZXVlLmgKQEAgLTI3LDYgKzI3LDExIEBACiAjZXJyb3IgIk9ubHkgQysrIGZpbGVzIGNhbiBpbmNsdWRlIHRoaXMgaGVhZGVyLiIKICNlbmRpZgogCisvLyBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZyBzdGF0ZW1lbnQgdG8gZW5hYmxlIEpvYlF1ZXVlIHByb2ZpbGluZywgd2hpY2ggd2lsbAorLy8gbG9nIHRoZSBzdGFjayB0cmFjZSBvZiB0aGUgam9iIHRoYXQgdGFrZXMgdGhlIGxvbmdlc3QgdGltZSB0byBleGVjdXRlIGV2ZXJ5IGEKKy8vIHdoaWxlLgorLy8gI2RlZmluZSBFTkFCTEVfSk9CX1FVRVVFX1BST0ZJTElORyAxCisKIG5hbWVzcGFjZSBzdGFyYm9hcmQgewogbmFtZXNwYWNlIHNoYXJlZCB7CiBuYW1lc3BhY2Ugc3RhcmJvYXJkIHsKQEAgLTU3LDEyICs2MiwyNiBAQAogCiAgIGNsYXNzIEpvYk93bmVyIHsKICAgIHByb3RlY3RlZDoKKyAgICBlbnVtIERldGFjaGVkU3RhdGUgeyBrRGV0YWNoZWQgfTsKKworICAgIGV4cGxpY2l0IEpvYk93bmVyKERldGFjaGVkU3RhdGUgZGV0YWNoZWRfc3RhdGUpIDogam9iX3F1ZXVlXyhOVUxMKSB7CisgICAgICBTQl9EQ0hFQ0soZGV0YWNoZWRfc3RhdGUgPT0ga0RldGFjaGVkKTsKKyAgICB9CiAgICAgZXhwbGljaXQgSm9iT3duZXIoSm9iUXVldWUqIGpvYl9xdWV1ZSA9IEpvYlF1ZXVlOjpjdXJyZW50KCkpCiAgICAgICAgIDogam9iX3F1ZXVlXyhqb2JfcXVldWUpIHsKICAgICAgIFNCX0RDSEVDSyhqb2JfcXVldWUpOwogICAgIH0KICAgICB+Sm9iT3duZXIoKSB7IENhbmNlbFBlbmRpbmdKb2JzKCk7IH0KIAorICAgIC8vIEFsbG93IHxKb2JPd25lcnwgY3JlYXRlZCBvbiBhbm90aGVyIHRocmVhZCB0byBydW4gb24gdGhlIGN1cnJlbnQgdGhyZWFkCisgICAgLy8gaWYgaXQgaXMgY3JlYXRlZCB3aXRoIHxrRGV0YWNoZWR8LgorICAgIC8vIE5vdGUgdGhhdCB0aGlzIG9wZXJhdGlvbiBpcyBub3QgdGhyZWFkIHNhZmUuICBJdCBpcyB0aGUgY2FsbGVyJ3MKKyAgICAvLyByZXNwb25zaWxpYml0eSB0byBlbnN1cmUgdGhhdCBjb25jdXJyZW5jeSBoYXNuJ3QgaGFwcGVuZWQgeWV0LgorICAgIHZvaWQgQXR0YWNoVG9DdXJyZW50VGhyZWFkKCkgeworICAgICAgU0JfRENIRUNLKGpvYl9xdWV1ZV8gPT0gTlVMTCk7CisgICAgICBqb2JfcXVldWVfID0gSm9iUXVldWU6OmN1cnJlbnQoKTsKKyAgICB9CisKICAgICBib29sIEJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSBjb25zdCB7CiAgICAgICByZXR1cm4gam9iX3F1ZXVlXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpOwogICAgIH0KQEAgLTk4LDEyICsxMTcsMjIgQEAKICAgc3RhdGljIEpvYlF1ZXVlKiBjdXJyZW50KCk7CiAKICBwcml2YXRlOgorI2lmIEVOQUJMRV9KT0JfUVVFVUVfUFJPRklMSU5HCisgIC8vIFJlc2V0IHRoZSBtYXggdmFsdWUgcGVyaW9kaWNhbGx5IHRvIGNhdGNoIGFsbCBsb2NhbCBwZWFrcy4KKyAgc3RhdGljIGNvbnN0IFNiVGltZSBrUHJvZmlsZVJlc2V0SW50ZXJ2YWwgPSBrU2JUaW1lU2Vjb25kOworICBzdGF0aWMgY29uc3QgaW50IGtQcm9maWxlU3RhY2tEZXB0aCA9IDEwOworI2VuZGlmICAvLyBFTkFCTEVfSk9CX1FVRVVFX1BST0ZJTElORworCiAgIHN0cnVjdCBKb2JSZWNvcmQgewogICAgIEpvYlRva2VuIGpvYl90b2tlbjsKICAgICBKb2Igam9iOwogICAgIEpvYk93bmVyKiBvd25lcjsKKyNpZiBFTkFCTEVfSk9CX1FVRVVFX1BST0ZJTElORworICAgIHZvaWQqIHN0YWNrW2tQcm9maWxlU3RhY2tEZXB0aF07CisgICAgaW50IHN0YWNrX3NpemU7CisjZW5kaWYgIC8vIEVOQUJMRV9KT0JfUVVFVUVfUFJPRklMSU5HCiAgIH07Ci0gIHR5cGVkZWYgc3RkOjptdWx0aW1hcDxTYlRpbWVNb25vdG9uaWMsIEpvYlJlY29yZD4gVGltZVRvSm9iTWFwOworICB0eXBlZGVmIHN0ZDo6bXVsdGltYXA8U2JUaW1lTW9ub3RvbmljLCBKb2JSZWNvcmQ+IFRpbWVUb0pvYlJlY29yZE1hcDsKIAogICBKb2JUb2tlbiBTY2hlZHVsZShKb2Igam9iLCBKb2JPd25lciogb3duZXIsIFNiVGltZU1vbm90b25pYyBkZWxheSk7CiAgIHZvaWQgUmVtb3ZlSm9ic0J5T3duZXIoSm9iT3duZXIqIG93bmVyKTsKQEAgLTExNyw5ICsxNDYsMTUgQEAKICAgU2JUaHJlYWRJZCB0aHJlYWRfaWRfOwogICBNdXRleCBtdXRleF87CiAgIENvbmRpdGlvblZhcmlhYmxlIGNvbmRpdGlvbl87Ci0gIGludDY0X3QgY3VycmVudF9qb2JfdG9rZW5fOwotICBUaW1lVG9Kb2JNYXAgdGltZV90b19qb2JfbWFwXzsKLSAgYm9vbCBzdG9wcGVkXzsKKyAgaW50NjRfdCBjdXJyZW50X2pvYl90b2tlbl8gPSBKb2JUb2tlbjo6a0ludmFsaWRUb2tlbiArIDE7CisgIFRpbWVUb0pvYlJlY29yZE1hcCB0aW1lX3RvX2pvYl9yZWNvcmRfbWFwXzsKKyAgYm9vbCBzdG9wcGVkXyA9IGZhbHNlOworCisjaWYgRU5BQkxFX0pPQl9RVUVVRV9QUk9GSUxJTkcKKyAgU2JUaW1lTW9ub3RvbmljIGxhc3RfcmVzZXRfdGltZV8gPSBTYlRpbWVHZXRNb25vdG9uaWNOb3coKTsKKyAgSm9iUmVjb3JkIGpvYl9yZWNvcmRfd2l0aF9tYXhfaW50ZXJ2YWxfOworICBTYlRpbWVNb25vdG9uaWMgbWF4X2pvYl9pbnRlcnZhbF8gPSAwOworI2VuZGlmICAvLyBFTkFCTEVfSk9CX1FVRVVFX1BST0ZJTElORwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIHBsYXllcgpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfY3JlYXRlLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfY3JlYXRlLmNjCmluZGV4IGM2Y2VkZDkuLjM5Y2ZlM2EgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX2NyZWF0ZS5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9jcmVhdGUuY2MKQEAgLTIyLDkgKzIyLDkgQEAKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2ZpbHRlcl9iYXNlZF9wbGF5ZXJfd29ya2VyX2hhbmRsZXIuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX2ludGVybmFsLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl93b3JrZXIuaCIKLSNpZiBTQl9QTEFZRVJfRU5BQkxFX1ZJREVPX0RVTVBFUgorI2lmIFNCX1BMQVlFUl9FTkFCTEVfVklERU9fRFVNUEVSICYmIFNCX0hBUyhQTEFZRVJfRklMVEVSX1RFU1RTKQogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci92aWRlb19kbXBfd3JpdGVyLmgiCi0jZW5kaWYgIC8vIFNCX1BMQVlFUl9FTkFCTEVfVklERU9fRFVNUEVSCisjZW5kaWYgIC8vIFNCX1BMQVlFUl9FTkFCTEVfVklERU9fRFVNUEVSICYmIFNCX0hBUyhQTEFZRVJfRklMVEVSX1RFU1RTKQogCiB1c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6bWVkaWFfc2Vzc2lvbjo6CiAgICAgVXBkYXRlQWN0aXZlU2Vzc2lvblBsYXRmb3JtUGxheWJhY2tTdGF0ZTsKQEAgLTU5LDYgKzU5LDE0IEBACiAgIFNCX1VOUkVGRVJFTkNFRF9QQVJBTUVURVIoZHVyYXRpb25fcHRzKTsKICNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPCBTQl9ERVBSRUNBVEVfU0JfTUVESUFfVElNRV9BUElfVkVSU0lPTgogCisgIGlmICghc2FtcGxlX2RlYWxsb2NhdGVfZnVuYyB8fCAhZGVjb2Rlcl9zdGF0dXNfZnVuYyB8fCAhcGxheWVyX3N0YXR1c19mdW5jCisjaWYgU0JfSEFTKFBMQVlFUl9FUlJPUl9NRVNTQUdFKQorICAgICAgfHwgIXBsYXllcl9lcnJvcl9mdW5jCisjZW5kaWYgIC8vIFNCX0hBUyhQTEFZRVJfRVJST1JfTUVTU0FHRSkKKyAgICAgICkgeworICAgIHJldHVybiBrU2JQbGF5ZXJJbnZhbGlkOworICB9CisKICAgY29uc3QgaW50NjRfdCBrRGVmYXVsdEJpdFJhdGUgPSAwOwogICBpZiAoYXVkaW9fY29kZWMgIT0ga1NiTWVkaWFBdWRpb0NvZGVjTm9uZSAmJgogICAgICAgIVNiTWVkaWFJc0F1ZGlvU3VwcG9ydGVkKGF1ZGlvX2NvZGVjLCBrRGVmYXVsdEJpdFJhdGUpKSB7CkBAIC02OSw3ICs3Nyw4IEBACiAgIGNvbnN0IGludCBrRGVmYXVsdEZyYW1lV2lkdGggPSAwOwogICBjb25zdCBpbnQga0RlZmF1bHRGcmFtZUhlaWdodCA9IDA7CiAgIGNvbnN0IGludCBrRGVmYXVsdEZyYW1lUmF0ZSA9IDA7Ci0gIGlmICghU2JNZWRpYUlzVmlkZW9TdXBwb3J0ZWQodmlkZW9fY29kZWMsIGtEZWZhdWx0RnJhbWVXaWR0aCwKKyAgaWYgKHZpZGVvX2NvZGVjICE9IGtTYk1lZGlhVmlkZW9Db2RlY05vbmUgJiYKKyAgICAgICFTYk1lZGlhSXNWaWRlb1N1cHBvcnRlZCh2aWRlb19jb2RlYywga0RlZmF1bHRGcmFtZVdpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtEZWZhdWx0RnJhbWVIZWlnaHQsIGtEZWZhdWx0Qml0UmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRGVmYXVsdEZyYW1lUmF0ZSkpIHsKICAgICBTQl9MT0coRVJST1IpIDw8ICJVbnN1cHBvcnRlZCB2aWRlbyBjb2RlYyAiIDw8IHZpZGVvX2NvZGVjOwpAQCAtODIsNiArOTEsMTMgQEAKICAgICByZXR1cm4ga1NiUGxheWVySW52YWxpZDsKICAgfQogCisgIGlmIChhdWRpb19jb2RlYyA9PSBrU2JNZWRpYUF1ZGlvQ29kZWNOb25lICYmCisgICAgICB2aWRlb19jb2RlYyA9PSBrU2JNZWRpYVZpZGVvQ29kZWNOb25lKSB7CisgICAgU0JfTE9HKEVSUk9SKSA8PCAiU2JQbGF5ZXJDcmVhdGUoKSByZXF1aXJlcyBhdCBsZWFzdCBvbmUgYXVkaW8gdHJhY2sgb3IiCisgICAgICAgICAgICAgICAgICA8PCAiIG9uZSB2aWRlbyB0cmFjay4iOworICAgIHJldHVybiBrU2JQbGF5ZXJJbnZhbGlkOworICB9CisKICAgaWYgKCFTYlBsYXllck91dHB1dE1vZGVTdXBwb3J0ZWQob3V0cHV0X21vZGUsIHZpZGVvX2NvZGVjLCBkcm1fc3lzdGVtKSkgewogICAgIFNCX0xPRyhFUlJPUikgPDwgIlVuc3VwcG9ydGVkIHBsYXllciBvdXRwdXQgbW9kZSAiIDw8IG91dHB1dF9tb2RlOwogICAgIHJldHVybiBrU2JQbGF5ZXJJbnZhbGlkOwpAQCAtOTMsMTggKzEwOSwxOSBAQAogICAgICAgbmV3IEZpbHRlckJhc2VkUGxheWVyV29ya2VySGFuZGxlcih2aWRlb19jb2RlYywgYXVkaW9fY29kZWMsIGRybV9zeXN0ZW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2hlYWRlciwgb3V0cHV0X21vZGUsIHByb3ZpZGVyKSk7CiAKLSAgU2JQbGF5ZXIgcGxheWVyID0gbmV3IFNiUGxheWVyUHJpdmF0ZShhdWRpb19jb2RlYywgc2FtcGxlX2RlYWxsb2NhdGVfZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyX3N0YXR1c19mdW5jLCBwbGF5ZXJfc3RhdHVzX2Z1bmMsCisgIFNiUGxheWVyIHBsYXllciA9CisgICAgICBuZXcgU2JQbGF5ZXJQcml2YXRlKGF1ZGlvX2NvZGVjLCB2aWRlb19jb2RlYywgc2FtcGxlX2RlYWxsb2NhdGVfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2Rlcl9zdGF0dXNfZnVuYywgcGxheWVyX3N0YXR1c19mdW5jLAogI2lmIFNCX0hBUyhQTEFZRVJfRVJST1JfTUVTU0FHRSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJfZXJyb3JfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyX2Vycm9yX2Z1bmMsCiAjZW5kaWYgIC8vIFNCX0hBUyhQTEFZRVJfRVJST1JfTUVTU0FHRSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LCBoYW5kbGVyLlBhc3MoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGhhbmRsZXIuUGFzcygpKTsKIAotI2lmIFNCX1BMQVlFUl9FTkFCTEVfVklERU9fRFVNUEVSCisjaWYgU0JfUExBWUVSX0VOQUJMRV9WSURFT19EVU1QRVIgJiYgU0JfSEFTKFBMQVlFUl9GSUxURVJfVEVTVFMpCiAgIHVzaW5nIDo6c3RhcmJvYXJkOjpzaGFyZWQ6OnN0YXJib2FyZDo6cGxheWVyOjp2aWRlb19kbXA6OlZpZGVvRG1wV3JpdGVyOwogICBWaWRlb0RtcFdyaXRlcjo6T25QbGF5ZXJDcmVhdGUocGxheWVyLCB2aWRlb19jb2RlYywgYXVkaW9fY29kZWMsIGRybV9zeXN0ZW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19oZWFkZXIpOwotI2VuZGlmICAvLyBTQl9QTEFZRVJfRU5BQkxFX1ZJREVPX0RVTVBFUgorI2VuZGlmICAvLyBTQl9QTEFZRVJfRU5BQkxFX1ZJREVPX0RVTVBFUiAmJiBTQl9IQVMoUExBWUVSX0ZJTFRFUl9URVNUUykKIAogICByZXR1cm4gcGxheWVyOwogfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfZGVzdHJveS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX2Rlc3Ryb3kuY2MKaW5kZXggYjM4MzU0Ni4uOTM3ZGRhNyAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfZGVzdHJveS5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9kZXN0cm95LmNjCkBAIC0xNiw5ICsxNiw5IEBACiAKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL21lZGlhX3Nlc3Npb24vcGxheWJhY2tfc3RhdGUuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX2ludGVybmFsLmgiCi0jaWYgU0JfUExBWUVSX0VOQUJMRV9WSURFT19EVU1QRVIKKyNpZiBTQl9QTEFZRVJfRU5BQkxFX1ZJREVPX0RVTVBFUiAmJiBTQl9IQVMoUExBWUVSX0ZJTFRFUl9URVNUUykKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvdmlkZW9fZG1wX3dyaXRlci5oIgotI2VuZGlmICAvLyBTQl9QTEFZRVJfRU5BQkxFX1ZJREVPX0RVTVBFUgorI2VuZGlmICAvLyBTQl9QTEFZRVJfRU5BQkxFX1ZJREVPX0RVTVBFUiAmJiBTQl9IQVMoUExBWUVSX0ZJTFRFUl9URVNUUykKIAogdXNpbmcgc3RhcmJvYXJkOjpzaGFyZWQ6Om1lZGlhX3Nlc3Npb246OmtOb25lOwogdXNpbmcgc3RhcmJvYXJkOjpzaGFyZWQ6Om1lZGlhX3Nlc3Npb246OgpAQCAtMzAsMTAgKzMwLDEwIEBACiAgIH0KICAgVXBkYXRlQWN0aXZlU2Vzc2lvblBsYXRmb3JtUGxheWJhY2tTdGF0ZShrTm9uZSk7CiAKLSNpZiBTQl9QTEFZRVJfRU5BQkxFX1ZJREVPX0RVTVBFUgorI2lmIFNCX1BMQVlFUl9FTkFCTEVfVklERU9fRFVNUEVSICYmIFNCX0hBUyhQTEFZRVJfRklMVEVSX1RFU1RTKQogICB1c2luZyA6OnN0YXJib2FyZDo6c2hhcmVkOjpzdGFyYm9hcmQ6OnBsYXllcjo6dmlkZW9fZG1wOjpWaWRlb0RtcFdyaXRlcjsKICAgVmlkZW9EbXBXcml0ZXI6Ok9uUGxheWVyRGVzdHJveShwbGF5ZXIpOwotI2VuZGlmICAvLyBTQl9QTEFZRVJfRU5BQkxFX1ZJREVPX0RVTVBFUgorI2VuZGlmICAvLyBTQl9QTEFZRVJfRU5BQkxFX1ZJREVPX0RVTVBFUiAmJiBTQl9IQVMoUExBWUVSX0ZJTFRFUl9URVNUUykKIAogICBkZWxldGUgcGxheWVyOwogfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfaW50ZXJuYWwuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9pbnRlcm5hbC5jYwppbmRleCBhMWQ3NzhhLi40OTMyMjIyIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9pbnRlcm5hbC5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9pbnRlcm5hbC5jYwpAQCAtMTQsMjEgKzE0LDMxIEBACiAKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX2ludGVybmFsLmgiCiAKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KIAotdXNpbmcgc3RhcmJvYXJkOjpzaGFyZWQ6OnN0YXJib2FyZDo6cGxheWVyOjpJbnB1dEJ1ZmZlcjsKKyNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCiAKIG5hbWVzcGFjZSB7CiAKLVNiVGltZSBHZXRNZWRpYVRpbWUoU2JUaW1lIG1lZGlhX3RpbWUsIFNiVGltZU1vbm90b25pYyBtZWRpYV90aW1lX3VwZGF0ZV90aW1lKSB7Cit1c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6c3RhcmJvYXJkOjpwbGF5ZXI6OklucHV0QnVmZmVyOwordXNpbmcgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xOwordXNpbmcgc3RkOjpwbGFjZWhvbGRlcnM6Ol8yOwordXNpbmcgc3RkOjpwbGFjZWhvbGRlcnM6Ol8zOworCitTYlRpbWUgR2V0TWVkaWFUaW1lKFNiVGltZSBtZWRpYV90aW1lLAorICAgICAgICAgICAgICAgICAgICBTYlRpbWVNb25vdG9uaWMgbWVkaWFfdGltZV91cGRhdGVfdGltZSwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBsYXliYWNrX3JhdGUpIHsKICAgU2JUaW1lTW9ub3RvbmljIGVsYXBzZWQgPSBTYlRpbWVHZXRNb25vdG9uaWNOb3coKSAtIG1lZGlhX3RpbWVfdXBkYXRlX3RpbWU7Ci0gIHJldHVybiBtZWRpYV90aW1lICsgZWxhcHNlZDsKKyAgcmV0dXJuIG1lZGlhX3RpbWUgKyBzdGF0aWNfY2FzdDxTYlRpbWU+KGVsYXBzZWQgKiBwbGF5YmFja19yYXRlKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlCiAKK2ludCBTYlBsYXllclByaXZhdGU6Om51bWJlcl9vZl9wbGF5ZXJzXyA9IDA7CisKIFNiUGxheWVyUHJpdmF0ZTo6U2JQbGF5ZXJQcml2YXRlKAogICAgIFNiTWVkaWFBdWRpb0NvZGVjIGF1ZGlvX2NvZGVjLAorICAgIFNiTWVkaWFWaWRlb0NvZGVjIHZpZGVvX2NvZGVjLAogICAgIFNiUGxheWVyRGVhbGxvY2F0ZVNhbXBsZUZ1bmMgc2FtcGxlX2RlYWxsb2NhdGVfZnVuYywKICAgICBTYlBsYXllckRlY29kZXJTdGF0dXNGdW5jIGRlY29kZXJfc3RhdHVzX2Z1bmMsCiAgICAgU2JQbGF5ZXJTdGF0dXNGdW5jIHBsYXllcl9zdGF0dXNfZnVuYywKQEAgLTQxLDI0ICs1MSwyNyBAQAogICAgICAgY29udGV4dF8oY29udGV4dCksCiAgICAgICB0aWNrZXRfKFNCX1BMQVlFUl9JTklUSUFMX1RJQ0tFVCksCiAgICAgICBtZWRpYV90aW1lXygwKSwKLSAgICAgIG1lZGlhX3RpbWVfdXBkYXRlX3RpbWVfKFNiVGltZUdldE1vbm90b25pY05vdygpKSwKKyAgICAgIG1lZGlhX3RpbWVfdXBkYXRlZF9hdF8oU2JUaW1lR2V0TW9ub3RvbmljTm93KCkpLAogICAgICAgZnJhbWVfd2lkdGhfKDApLAogICAgICAgZnJhbWVfaGVpZ2h0XygwKSwKLSAgICAgIGlzX3BhdXNlZF8odHJ1ZSksCisgICAgICBpc19wYXVzZWRfKGZhbHNlKSwKICAgICAgIHBsYXliYWNrX3JhdGVfKDEuMCksCiAgICAgICB2b2x1bWVfKDEuMCksCiAgICAgICB0b3RhbF92aWRlb19mcmFtZXNfKDApLAogICAgICAgZHJvcHBlZF92aWRlb19mcmFtZXNfKDApLAotICAgICAgd29ya2VyXyhuZXcgUGxheWVyV29ya2VyKHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29kZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyX3dvcmtlcl9oYW5kbGVyLlBhc3MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyX3N0YXR1c19mdW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllcl9zdGF0dXNfZnVuYywKKyAgICAgIHdvcmtlcl8obmV3IFBsYXllcldvcmtlcigKKyAgICAgICAgICBhdWRpb19jb2RlYywKKyAgICAgICAgICB2aWRlb19jb2RlYywKKyAgICAgICAgICBwbGF5ZXJfd29ya2VyX2hhbmRsZXIuUGFzcygpLAorICAgICAgICAgIHN0ZDo6YmluZCgmU2JQbGF5ZXJQcml2YXRlOjpVcGRhdGVNZWRpYUluZm8sIHRoaXMsIF8xLCBfMiwgXzMpLAorICAgICAgICAgIGRlY29kZXJfc3RhdHVzX2Z1bmMsCisgICAgICAgICAgcGxheWVyX3N0YXR1c19mdW5jLAogI2lmIFNCX0hBUyhQTEFZRVJfRVJST1JfTUVTU0FHRSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJfZXJyb3JfZnVuYywKKyAgICAgICAgICBwbGF5ZXJfZXJyb3JfZnVuYywKICNlbmRpZiAgLy8gU0JfSEFTKFBMQVlFUl9FUlJPUl9NRVNTQUdFKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCkpIHsKKyAgICAgICAgICB0aGlzLAorICAgICAgICAgIGNvbnRleHQpKSB7CisgICsrbnVtYmVyX29mX3BsYXllcnNfOwogfQogCiB2b2lkIFNiUGxheWVyUHJpdmF0ZTo6U2VlayhTYlRpbWUgc2Vla190b190aW1lLCBpbnQgdGlja2V0KSB7CkBAIC02Niw3ICs3OSw3IEBACiAgICAgc3RhcmJvYXJkOjpTY29wZWRMb2NrIGxvY2sobXV0ZXhfKTsKICAgICBTQl9EQ0hFQ0sodGlja2V0XyAhPSB0aWNrZXQpOwogICAgIG1lZGlhX3RpbWVfID0gc2Vla190b190aW1lOwotICAgIG1lZGlhX3RpbWVfdXBkYXRlX3RpbWVfID0gU2JUaW1lR2V0TW9ub3RvbmljTm93KCk7CisgICAgbWVkaWFfdGltZV91cGRhdGVkX2F0XyA9IFNiVGltZUdldE1vbm90b25pY05vdygpOwogICAgIHRpY2tldF8gPSB0aWNrZXQ7CiAgIH0KIApAQCAtMTE5LDcgKzEzMiw3IEBACiAgICAgb3V0X3BsYXllcl9pbmZvLT5jdXJyZW50X21lZGlhX3B0cyA9IFNCX1RJTUVfVE9fU0JfTUVESUFfVElNRShtZWRpYV90aW1lXyk7CiAgIH0gZWxzZSB7CiAgICAgb3V0X3BsYXllcl9pbmZvLT5jdXJyZW50X21lZGlhX3B0cyA9IFNCX1RJTUVfVE9fU0JfTUVESUFfVElNRSgKLSAgICAgICAgR2V0TWVkaWFUaW1lKG1lZGlhX3RpbWVfLCBtZWRpYV90aW1lX3VwZGF0ZV90aW1lXykpOworICAgICAgICBHZXRNZWRpYVRpbWUobWVkaWFfdGltZV8sIG1lZGlhX3RpbWVfdXBkYXRlZF9hdF8sIHBsYXliYWNrX3JhdGVfKSk7CiAgIH0KICNlbHNlICAgLy8gU0JfQVBJX1ZFUlNJT04gPCBTQl9ERVBSRUNBVEVfU0JfTUVESUFfVElNRV9BUElfVkVSU0lPTgogICBvdXRfcGxheWVyX2luZm8tPmR1cmF0aW9uID0gU0JfUExBWUVSX05PX0RVUkFUSU9OOwpAQCAtMTI3LDcgKzE0MCw3IEBACiAgICAgb3V0X3BsYXllcl9pbmZvLT5jdXJyZW50X21lZGlhX3RpbWVzdGFtcCA9IG1lZGlhX3RpbWVfOwogICB9IGVsc2UgewogICAgIG91dF9wbGF5ZXJfaW5mby0+Y3VycmVudF9tZWRpYV90aW1lc3RhbXAgPQotICAgICAgICBHZXRNZWRpYVRpbWUobWVkaWFfdGltZV8sIG1lZGlhX3RpbWVfdXBkYXRlX3RpbWVfKTsKKyAgICAgICAgR2V0TWVkaWFUaW1lKG1lZGlhX3RpbWVfLCBtZWRpYV90aW1lX3VwZGF0ZWRfYXRfLCBwbGF5YmFja19yYXRlXyk7CiAgIH0KICNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPCBTQl9ERVBSRUNBVEVfU0JfTUVESUFfVElNRV9BUElfVkVSU0lPTgogCkBAIC0xNDIsNiArMTU1LDcgQEAKIH0KIAogdm9pZCBTYlBsYXllclByaXZhdGU6OlNldFBhdXNlKGJvb2wgcGF1c2UpIHsKKyAgaXNfcGF1c2VkXyA9IHBhdXNlOwogICB3b3JrZXJfLT5TZXRQYXVzZShwYXVzZSk7CiB9CiAKQEAgLTE1NSwxNyArMTY5LDE1IEBACiAgIHdvcmtlcl8tPlNldFZvbHVtZSh2b2x1bWVfKTsKIH0KIAotdm9pZCBTYlBsYXllclByaXZhdGU6OlVwZGF0ZU1lZGlhVGltZShTYlRpbWUgbWVkaWFfdGltZSwgaW50IHRpY2tldCkgewordm9pZCBTYlBsYXllclByaXZhdGU6OlVwZGF0ZU1lZGlhSW5mbyhTYlRpbWUgbWVkaWFfdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRyb3BwZWRfdmlkZW9fZnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGlja2V0KSB7CiAgIHN0YXJib2FyZDo6U2NvcGVkTG9jayBsb2NrKG11dGV4Xyk7CiAgIGlmICh0aWNrZXRfICE9IHRpY2tldCkgewogICAgIHJldHVybjsKICAgfQogICBtZWRpYV90aW1lXyA9IG1lZGlhX3RpbWU7Ci0gIG1lZGlhX3RpbWVfdXBkYXRlX3RpbWVfID0gU2JUaW1lR2V0TW9ub3RvbmljTm93KCk7Ci19Ci0KLXZvaWQgU2JQbGF5ZXJQcml2YXRlOjpVcGRhdGVEcm9wcGVkVmlkZW9GcmFtZXMoaW50IGRyb3BwZWRfdmlkZW9fZnJhbWVzKSB7Ci0gIHN0YXJib2FyZDo6U2NvcGVkTG9jayBsb2NrKG11dGV4Xyk7CisgIG1lZGlhX3RpbWVfdXBkYXRlZF9hdF8gPSBTYlRpbWVHZXRNb25vdG9uaWNOb3coKTsKICAgZHJvcHBlZF92aWRlb19mcmFtZXNfID0gZHJvcHBlZF92aWRlb19mcmFtZXM7CiB9CiAKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX2ludGVybmFsLmggYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9pbnRlcm5hbC5oCmluZGV4IGMyNmNlZDUuLjI5YzA0MWMgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX2ludGVybmFsLmgKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfaW50ZXJuYWwuaApAQCAtMjQsMTMgKzI0LDEzIEBACiAjaW5jbHVkZSAic3RhcmJvYXJkL3RpbWUuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvd2luZG93LmgiCiAKLXN0cnVjdCBTYlBsYXllclByaXZhdGUKLSAgICA6IHN0YXJib2FyZDo6c2hhcmVkOjpzdGFyYm9hcmQ6OnBsYXllcjo6UGxheWVyV29ya2VyOjpIb3N0IHsKK3N0cnVjdCBTYlBsYXllclByaXZhdGUgewogIHB1YmxpYzoKICAgdHlwZWRlZiBzdGFyYm9hcmQ6OnNoYXJlZDo6c3RhcmJvYXJkOjpwbGF5ZXI6OlBsYXllcldvcmtlciBQbGF5ZXJXb3JrZXI7CiAKICAgU2JQbGF5ZXJQcml2YXRlKAogICAgICAgU2JNZWRpYUF1ZGlvQ29kZWMgYXVkaW9fY29kZWMsCisgICAgICBTYk1lZGlhVmlkZW9Db2RlYyB2aWRlb19jb2RlYywKICAgICAgIFNiUGxheWVyRGVhbGxvY2F0ZVNhbXBsZUZ1bmMgc2FtcGxlX2RlYWxsb2NhdGVfZnVuYywKICAgICAgIFNiUGxheWVyRGVjb2RlclN0YXR1c0Z1bmMgZGVjb2Rlcl9zdGF0dXNfZnVuYywKICAgICAgIFNiUGxheWVyU3RhdHVzRnVuYyBwbGF5ZXJfc3RhdHVzX2Z1bmMsCkBAIC02MiwxMCArNjIsMTIgQEAKIAogICBTYkRlY29kZVRhcmdldCBHZXRDdXJyZW50RGVjb2RlVGFyZ2V0KCk7CiAKKyAgflNiUGxheWVyUHJpdmF0ZSgpIHsgLS1udW1iZXJfb2ZfcGxheWVyc187IH0KKworICBzdGF0aWMgaW50IG51bWJlcl9vZl9wbGF5ZXJzKCkgeyByZXR1cm4gbnVtYmVyX29mX3BsYXllcnNfOyB9CisKICBwcml2YXRlOgotICAvLyBQbGF5ZXJXb3JrZXI6Okhvc3QgbWV0aG9kcy4KLSAgdm9pZCBVcGRhdGVNZWRpYVRpbWUoU2JUaW1lIG1lZGlhX3RpbWUsIGludCB0aWNrZXQpIG92ZXJyaWRlOwotICB2b2lkIFVwZGF0ZURyb3BwZWRWaWRlb0ZyYW1lcyhpbnQgZHJvcHBlZF92aWRlb19mcmFtZXMpIG92ZXJyaWRlOworICB2b2lkIFVwZGF0ZU1lZGlhSW5mbyhTYlRpbWUgbWVkaWFfdGltZSwgaW50IGRyb3BwZWRfdmlkZW9fZnJhbWVzLCBpbnQgdGlja2V0KTsKIAogICBTYlBsYXllckRlYWxsb2NhdGVTYW1wbGVGdW5jIHNhbXBsZV9kZWFsbG9jYXRlX2Z1bmNfOwogICB2b2lkKiBjb250ZXh0XzsKQEAgLTczLDcgKzc1LDcgQEAKICAgc3RhcmJvYXJkOjpNdXRleCBtdXRleF87CiAgIGludCB0aWNrZXRfOwogICBTYlRpbWUgbWVkaWFfdGltZV87Ci0gIFNiVGltZU1vbm90b25pYyBtZWRpYV90aW1lX3VwZGF0ZV90aW1lXzsKKyAgU2JUaW1lTW9ub3RvbmljIG1lZGlhX3RpbWVfdXBkYXRlZF9hdF87CiAgIGludCBmcmFtZV93aWR0aF87CiAgIGludCBmcmFtZV9oZWlnaHRfOwogICBib29sIGlzX3BhdXNlZF87CkBAIC04Myw2ICs4NSw4IEBACiAgIGludCBkcm9wcGVkX3ZpZGVvX2ZyYW1lc187CiAKICAgc3RhcmJvYXJkOjpzY29wZWRfcHRyPFBsYXllcldvcmtlcj4gd29ya2VyXzsKKworICBzdGF0aWMgaW50IG51bWJlcl9vZl9wbGF5ZXJzXzsKIH07CiAKICNlbmRpZiAgLy8gU1RBUkJPQVJEX1NIQVJFRF9TVEFSQk9BUkRfUExBWUVSX1BMQVlFUl9JTlRFUk5BTF9IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfc2V0X2JvdW5kcy5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3NldF9ib3VuZHMuY2MKaW5kZXggMGMwOTIxYy4uMjczNjdiZCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfc2V0X2JvdW5kcy5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9zZXRfYm91bmRzLmNjCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSAic3RhcmJvYXJkL3BsYXllci5oIgogCiAjaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2FwcGxpY2F0aW9uLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9pbnRlcm5hbC5oIgogCiB2b2lkIFNiUGxheWVyU2V0Qm91bmRzKFNiUGxheWVyIHBsYXllciwKQEAgLTI4LDQgKzI5LDYgQEAKICAgICByZXR1cm47CiAgIH0KICAgcGxheWVyLT5TZXRCb3VuZHMoel9pbmRleCwgeCwgeSwgd2lkdGgsIGhlaWdodCk7CisgIHN0YXJib2FyZDo6c2hhcmVkOjpzdGFyYm9hcmQ6OkFwcGxpY2F0aW9uOjpHZXQoKS0+UGxheWVyU2V0Qm91bmRzKAorICAgICAgcGxheWVyLCB6X2luZGV4LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKIH0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3dvcmtlci5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3dvcmtlci5jYwppbmRleCA3YzA1MGYyLi4wYmU0YmE2IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl93b3JrZXIuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfd29ya2VyLmNjCkBAIC0yOCw2ICsyOCw5IEBACiAKIG5hbWVzcGFjZSB7CiAKK3VzaW5nIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMTsKK3VzaW5nIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMjsKKwogLy8gOCBtcyBpcyBlbm91Z2ggdG8gZW5zdXJlIHRoYXQgRG9Xcml0ZVBlbmRpbmdTYW1wbGVzKCkgaXMgY2FsbGVkIHR3aWNlIGZvcgogLy8gZXZlcnkgZnJhbWUgaW4gSEZSLgogLy8gVE9ETzogUmVkdWNlIHRoaXMgYXMgdGhlcmUgc2hvdWxkIGJlIGVub3VnaCBmcmFtZXMgY2FjaGVzIGluIHRoZSByZW5kZXJlcnMuCkBAIC00NSw5ICs0OCwxMCBAQAogCiB9ICAvLyBuYW1lc3BhY2UKIAotUGxheWVyV29ya2VyOjpQbGF5ZXJXb3JrZXIoSG9zdCogaG9zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiTWVkaWFBdWRpb0NvZGVjIGF1ZGlvX2NvZGVjLAorUGxheWVyV29ya2VyOjpQbGF5ZXJXb3JrZXIoU2JNZWRpYUF1ZGlvQ29kZWMgYXVkaW9fY29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTYk1lZGlhVmlkZW9Db2RlYyB2aWRlb19jb2RlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlZF9wdHI8SGFuZGxlcj4gaGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFVwZGF0ZU1lZGlhSW5mb0NCIHVwZGF0ZV9tZWRpYV9pbmZvX2NiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JQbGF5ZXJEZWNvZGVyU3RhdHVzRnVuYyBkZWNvZGVyX3N0YXR1c19mdW5jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JQbGF5ZXJTdGF0dXNGdW5jIHBsYXllcl9zdGF0dXNfZnVuYywKICNpZiBTQl9IQVMoUExBWUVSX0VSUk9SX01FU1NBR0UpCkBAIC01Niw5ICs2MCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JQbGF5ZXIgcGxheWVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29udGV4dCkKICAgICA6IHRocmVhZF8oa1NiVGhyZWFkSW52YWxpZCksCi0gICAgICBob3N0Xyhob3N0KSwKICAgICAgIGF1ZGlvX2NvZGVjXyhhdWRpb19jb2RlYyksCisgICAgICB2aWRlb19jb2RlY18odmlkZW9fY29kZWMpLAogICAgICAgaGFuZGxlcl8oaGFuZGxlci5QYXNzKCkpLAorICAgICAgdXBkYXRlX21lZGlhX2luZm9fY2JfKHVwZGF0ZV9tZWRpYV9pbmZvX2NiKSwKICAgICAgIGRlY29kZXJfc3RhdHVzX2Z1bmNfKGRlY29kZXJfc3RhdHVzX2Z1bmMpLAogICAgICAgcGxheWVyX3N0YXR1c19mdW5jXyhwbGF5ZXJfc3RhdHVzX2Z1bmMpLAogI2lmIFNCX0hBUyhQTEFZRVJfRVJST1JfTUVTU0FHRSkKQEAgLTY4LDE0ICs3MywxNyBAQAogICAgICAgY29udGV4dF8oY29udGV4dCksCiAgICAgICB0aWNrZXRfKFNCX1BMQVlFUl9JTklUSUFMX1RJQ0tFVCksCiAgICAgICBwbGF5ZXJfc3RhdGVfKGtTYlBsYXllclN0YXRlSW5pdGlhbGl6ZWQpIHsKLSAgU0JfRENIRUNLKGhvc3RfICE9IE5VTEwpOwogICBTQl9EQ0hFQ0soaGFuZGxlcl8gIT0gTlVMTCk7CisgIFNCX0RDSEVDSyh1cGRhdGVfbWVkaWFfaW5mb19jYl8pOwogCiAgIFRocmVhZFBhcmFtIHRocmVhZF9wYXJhbSh0aGlzKTsKICAgdGhyZWFkXyA9IFNiVGhyZWFkQ3JlYXRlKDAsIGtTYlRocmVhZFByaW9yaXR5SGlnaCwga1NiVGhyZWFkTm9BZmZpbml0eSwgdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwbGF5ZXJfd29ya2VyIiwgJlBsYXllcldvcmtlcjo6VGhyZWFkRW50cnlQb2ludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aHJlYWRfcGFyYW0pOwotICBTQl9EQ0hFQ0soU2JUaHJlYWRJc1ZhbGlkKHRocmVhZF8pKTsKKyAgaWYgKCFTYlRocmVhZElzVmFsaWQodGhyZWFkXykpIHsKKyAgICBTQl9ETE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSB0aHJlYWQgaW4gUGxheWVyV29ya2VyIGNvbnN0cnVjdG9yLiI7CisgICAgcmV0dXJuOworICB9CiAgIFNjb3BlZExvY2sgc2NvcGVkX2xvY2sodGhyZWFkX3BhcmFtLm11dGV4KTsKICAgd2hpbGUgKCFqb2JfcXVldWVfKSB7CiAgICAgdGhyZWFkX3BhcmFtLmNvbmRpdGlvbl92YXJpYWJsZS5XYWl0KCk7CkBAIC05Myw5ICsxMDEsMTAgQEAKICAgLy8gZWZmZWN0cyBhcmUgZ29uZS4KIH0KIAotdm9pZCBQbGF5ZXJXb3JrZXI6OlVwZGF0ZU1lZGlhVGltZShTYlRpbWUgdGltZSkgewotICBob3N0Xy0+VXBkYXRlTWVkaWFUaW1lKHRpbWUsIHRpY2tldF8pOwordm9pZCBQbGF5ZXJXb3JrZXI6OlVwZGF0ZU1lZGlhSW5mbyhTYlRpbWUgdGltZSwgaW50IGRyb3BwZWRfdmlkZW9fZnJhbWVzKSB7CisgIHVwZGF0ZV9tZWRpYV9pbmZvX2NiXyh0aW1lLCBkcm9wcGVkX3ZpZGVvX2ZyYW1lcywgdGlja2V0Xyk7CiB9CisKIHZvaWQgUGxheWVyV29ya2VyOjpVcGRhdGVQbGF5ZXJTdGF0ZShTYlBsYXllclN0YXRlIHBsYXllcl9zdGF0ZSkgewogI2lmIFNCX0hBUyhQTEFZRVJfRVJST1JfTUVTU0FHRSkKICAgU0JfRENIRUNLKCFlcnJvcl9vY2N1cnJlZF8pIDw8ICJQbGF5ZXIgc3RhdGUgc2hvdWxkIG5vdCB1cGRhdGUgYWZ0ZXIgZXJyb3IuIjsKQEAgLTE1NywxNCArMTY2LDE2IEBACiB2b2lkIFBsYXllcldvcmtlcjo6RG9Jbml0KCkgewogICBTQl9EQ0hFQ0soam9iX3F1ZXVlXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKIAotICBpZiAoaGFuZGxlcl8tPkluaXQoCi0gICAgICAgICAgdGhpcywgam9iX3F1ZXVlXy5nZXQoKSwgcGxheWVyXywgJlBsYXllcldvcmtlcjo6VXBkYXRlTWVkaWFUaW1lLAotICAgICAgICAgICZQbGF5ZXJXb3JrZXI6OnBsYXllcl9zdGF0ZSwgJlBsYXllcldvcmtlcjo6VXBkYXRlUGxheWVyU3RhdGUKKyAgSGFuZGxlcjo6VXBkYXRlUGxheWVyRXJyb3JDQiB1cGRhdGVfcGxheWVyX2Vycm9yX2NiOwogI2lmIFNCX0hBUyhQTEFZRVJfRVJST1JfTUVTU0FHRSkKLSAgICAgICAgICAsCi0gICAgICAgICAgJlBsYXllcldvcmtlcjo6VXBkYXRlUGxheWVyRXJyb3IKKyAgdXBkYXRlX3BsYXllcl9lcnJvcl9jYiA9CisgICAgICBzdGQ6OmJpbmQoJlBsYXllcldvcmtlcjo6VXBkYXRlUGxheWVyRXJyb3IsIHRoaXMsIF8xKTsKICNlbmRpZiAgLy8gU0JfSEFTKFBMQVlFUl9FUlJPUl9NRVNTQUdFKQotICAgICAgICAgICkpIHsKKyAgaWYgKGhhbmRsZXJfLT5Jbml0KHBsYXllcl8sCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoJlBsYXllcldvcmtlcjo6VXBkYXRlTWVkaWFJbmZvLCB0aGlzLCBfMSwgXzIpLAorICAgICAgICAgICAgICAgICAgICAgc3RkOjpiaW5kKCZQbGF5ZXJXb3JrZXI6OnBsYXllcl9zdGF0ZSwgdGhpcyksCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoJlBsYXllcldvcmtlcjo6VXBkYXRlUGxheWVyU3RhdGUsIHRoaXMsIF8xKSwKKyAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZV9wbGF5ZXJfZXJyb3JfY2IpKSB7CiAgICAgVXBkYXRlUGxheWVyU3RhdGUoa1NiUGxheWVyU3RhdGVJbml0aWFsaXplZCk7CiAgIH0gZWxzZSB7CiAgICAgVXBkYXRlUGxheWVyRXJyb3IoIkZhaWxlZCB0byBpbml0aWFsaXplIFBsYXllcldvcmtlci4iKTsKQEAgLTE5OCw3ICsyMDksOSBAQAogICBpZiAoYXVkaW9fY29kZWNfICE9IGtTYk1lZGlhQXVkaW9Db2RlY05vbmUpIHsKICAgICBVcGRhdGVEZWNvZGVyU3RhdGUoa1NiTWVkaWFUeXBlQXVkaW8sIGtTYlBsYXllckRlY29kZXJTdGF0ZU5lZWRzRGF0YSk7CiAgIH0KLSAgVXBkYXRlRGVjb2RlclN0YXRlKGtTYk1lZGlhVHlwZVZpZGVvLCBrU2JQbGF5ZXJEZWNvZGVyU3RhdGVOZWVkc0RhdGEpOworICBpZiAodmlkZW9fY29kZWNfICE9IGtTYk1lZGlhVmlkZW9Db2RlY05vbmUpIHsKKyAgICBVcGRhdGVEZWNvZGVyU3RhdGUoa1NiTWVkaWFUeXBlVmlkZW8sIGtTYlBsYXllckRlY29kZXJTdGF0ZU5lZWRzRGF0YSk7CisgIH0KIH0KIAogdm9pZCBQbGF5ZXJXb3JrZXI6OkRvV3JpdGVTYW1wbGUoCkBAIC0yMjIsNiArMjM1LDcgQEAKICAgICBTQl9EQ0hFQ0soYXVkaW9fY29kZWNfICE9IGtTYk1lZGlhQXVkaW9Db2RlY05vbmUpOwogICAgIFNCX0RDSEVDSyghcGVuZGluZ19hdWRpb19idWZmZXJfKTsKICAgfSBlbHNlIHsKKyAgICBTQl9EQ0hFQ0sodmlkZW9fY29kZWNfICE9IGtTYk1lZGlhVmlkZW9Db2RlY05vbmUpOwogICAgIFNCX0RDSEVDSyghcGVuZGluZ192aWRlb19idWZmZXJfKTsKICAgfQogICBib29sIHdyaXR0ZW47CkBAIC0yNTcsNiArMjcxLDcgQEAKICAgICBEb1dyaXRlU2FtcGxlKGNvbW1vbjo6UmVzZXRBbmRSZXR1cm4oJnBlbmRpbmdfYXVkaW9fYnVmZmVyXykpOwogICB9CiAgIGlmIChwZW5kaW5nX3ZpZGVvX2J1ZmZlcl8pIHsKKyAgICBTQl9EQ0hFQ0sodmlkZW9fY29kZWNfICE9IGtTYk1lZGlhVmlkZW9Db2RlY05vbmUpOwogICAgIERvV3JpdGVTYW1wbGUoY29tbW9uOjpSZXNldEFuZFJldHVybigmcGVuZGluZ192aWRlb19idWZmZXJfKSk7CiAgIH0KIH0KQEAgLTI4MSw2ICsyOTYsNyBAQAogICAgIFNCX0RDSEVDSyhhdWRpb19jb2RlY18gIT0ga1NiTWVkaWFBdWRpb0NvZGVjTm9uZSk7CiAgICAgU0JfRENIRUNLKCFwZW5kaW5nX2F1ZGlvX2J1ZmZlcl8pOwogICB9IGVsc2UgeworICAgIFNCX0RDSEVDSyh2aWRlb19jb2RlY18gIT0ga1NiTWVkaWFWaWRlb0NvZGVjTm9uZSk7CiAgICAgU0JfRENIRUNLKCFwZW5kaW5nX3ZpZGVvX2J1ZmZlcl8pOwogICB9CiAKQEAgLTMyMSw3ICszMzcsMTEgQEAKICAgU0JfRENIRUNLKGpvYl9xdWV1ZV8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CiAKICAgaGFuZGxlcl8tPlN0b3AoKTsKLSAgVXBkYXRlUGxheWVyU3RhdGUoa1NiUGxheWVyU3RhdGVEZXN0cm95ZWQpOworICBoYW5kbGVyXy5yZXNldCgpOworCisgIGlmICghZXJyb3Jfb2NjdXJyZWRfKSB7CisgICAgVXBkYXRlUGxheWVyU3RhdGUoa1NiUGxheWVyU3RhdGVEZXN0cm95ZWQpOworICB9CiAgIGpvYl9xdWV1ZV8tPlN0b3BTb29uKCk7CiB9CiAKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3dvcmtlci5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfd29ya2VyLmgKaW5kZXggMTRmMTkzNi4uYzJiM2I3ZiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfd29ya2VyLmgKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfd29ya2VyLmgKQEAgLTQzLDE0ICs0Myw5IEBACiAvLyB0aGV5IG5lZWRuJ3QgbWFpbnRhaW4gdGhlIHRocmVhZCBhbmQgcXVldWUgaW50ZXJuYWxseS4KIGNsYXNzIFBsYXllcldvcmtlciB7CiAgcHVibGljOgotICBjbGFzcyBIb3N0IHsKLSAgIHB1YmxpYzoKLSAgICB2aXJ0dWFsIHZvaWQgVXBkYXRlTWVkaWFUaW1lKFNiVGltZSBtZWRpYV90aW1lLCBpbnQgdGlja2V0KSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIFVwZGF0ZURyb3BwZWRWaWRlb0ZyYW1lcyhpbnQgZHJvcHBlZF92aWRlb19mcmFtZXMpID0gMDsKLQotICAgcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkhvc3QoKSB7fQotICB9OworICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248CisgICAgICB2b2lkKFNiVGltZSBtZWRpYV90aW1lLCBpbnQgZHJvcHBlZF92aWRlb19mcmFtZXMsIGludCB0aWNrZXQpPgorICAgICAgVXBkYXRlTWVkaWFJbmZvQ0I7CiAKICAgc3RydWN0IEJvdW5kcyB7CiAgICAgaW50IHpfaW5kZXg7CkBAIC02MywyNyArNTgsMjAgQEAKICAgLy8gQWxsIGZ1bmN0aW9ucyBvZiB0aGlzIGNsYXNzIHdpbGwgYmUgY2FsbGVkIGZyb20gdGhlIEpvYlF1ZXVlIHRocmVhZC4KICAgY2xhc3MgSGFuZGxlciB7CiAgICBwdWJsaWM6Ci0gICAgdHlwZWRlZiB2b2lkIChQbGF5ZXJXb3JrZXI6OipVcGRhdGVNZWRpYVRpbWVDQikoU2JUaW1lIG1lZGlhX3RpbWUpOwotICAgIHR5cGVkZWYgU2JQbGF5ZXJTdGF0ZSAoUGxheWVyV29ya2VyOjoqR2V0UGxheWVyU3RhdGVDQikoKSBjb25zdDsKLSAgICB0eXBlZGVmIHZvaWQgKFBsYXllcldvcmtlcjo6KlVwZGF0ZVBsYXllclN0YXRlQ0IpKAotICAgICAgICBTYlBsYXllclN0YXRlIHBsYXllcl9zdGF0ZSk7Ci0gICAgdHlwZWRlZiB2b2lkIChQbGF5ZXJXb3JrZXI6OipVcGRhdGVQbGF5ZXJFcnJvckNCKSgKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpOworICAgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKFNiVGltZSBtZWRpYV90aW1lLCBpbnQgZHJvcHBlZF92aWRlb19mcmFtZXMpPgorICAgICAgICBVcGRhdGVNZWRpYUluZm9DQjsKKyAgICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248U2JQbGF5ZXJTdGF0ZSgpPiBHZXRQbGF5ZXJTdGF0ZUNCOworICAgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKFNiUGxheWVyU3RhdGUgcGxheWVyX3N0YXRlKT4gVXBkYXRlUGxheWVyU3RhdGVDQjsKKyAgICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSk+IFVwZGF0ZVBsYXllckVycm9yQ0I7CiAgICAgdmlydHVhbCB+SGFuZGxlcigpIHt9CiAKICAgICAvLyBBbGwgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgcmV0dXJuIGZhbHNlIHRvIHNpZ25hbCBhIGZhdGFsIGVycm9yLiAgVGhlCiAgICAgLy8gZXZlbnQgcHJvY2Vzc2luZyBsb29wIGluIFBsYXllcldvcmtlciB3aWxsIHRlcm1pbWF0ZSBpbiB0aGlzIGNhc2UuCi0gICAgdmlydHVhbCBib29sIEluaXQoUGxheWVyV29ya2VyKiBwbGF5ZXJfd29ya2VyLAotICAgICAgICAgICAgICAgICAgICAgIEpvYlF1ZXVlKiBqb2JfcXVldWUsCi0gICAgICAgICAgICAgICAgICAgICAgU2JQbGF5ZXIgcGxheWVyLAotICAgICAgICAgICAgICAgICAgICAgIFVwZGF0ZU1lZGlhVGltZUNCIHVwZGF0ZV9tZWRpYV90aW1lX2NiLAorICAgIHZpcnR1YWwgYm9vbCBJbml0KFNiUGxheWVyIHBsYXllciwKKyAgICAgICAgICAgICAgICAgICAgICBVcGRhdGVNZWRpYUluZm9DQiB1cGRhdGVfbWVkaWFfaW5mb19jYiwKICAgICAgICAgICAgICAgICAgICAgICBHZXRQbGF5ZXJTdGF0ZUNCIGdldF9wbGF5ZXJfc3RhdGVfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgVXBkYXRlUGxheWVyU3RhdGVDQiB1cGRhdGVfcGxheWVyX3N0YXRlX2NiCi0jaWYgU0JfSEFTKFBMQVlFUl9FUlJPUl9NRVNTQUdFKQotICAgICAgICAgICAgICAgICAgICAgICwKLSAgICAgICAgICAgICAgICAgICAgICBVcGRhdGVQbGF5ZXJFcnJvckNCIHVwZGF0ZV9wbGF5ZXJfZXJyb3JfY2IKLSNlbmRpZiAgLy8gU0JfSEFTKFBMQVlFUl9FUlJPUl9NRVNTQUdFKQotICAgICAgICAgICAgICAgICAgICAgICkgPSAwOworICAgICAgICAgICAgICAgICAgICAgIFVwZGF0ZVBsYXllclN0YXRlQ0IgdXBkYXRlX3BsYXllcl9zdGF0ZV9jYiwKKyAgICAgICAgICAgICAgICAgICAgICBVcGRhdGVQbGF5ZXJFcnJvckNCIHVwZGF0ZV9wbGF5ZXJfZXJyb3JfY2IpID0gMDsKICAgICB2aXJ0dWFsIGJvb2wgU2VlayhTYlRpbWUgc2Vla190b190aW1lLCBpbnQgdGlja2V0KSA9IDA7CiAgICAgdmlydHVhbCBib29sIFdyaXRlU2FtcGxlKGNvbnN0IHNjb3BlZF9yZWZwdHI8SW5wdXRCdWZmZXI+JiBpbnB1dF9idWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIHdyaXR0ZW4pID0gMDsKQEAgLTEwMiw5ICs5MCwxMCBAQAogICAgIHZpcnR1YWwgU2JEZWNvZGVUYXJnZXQgR2V0Q3VycmVudERlY29kZVRhcmdldCgpID0gMDsKICAgfTsKIAotICBQbGF5ZXJXb3JrZXIoSG9zdCogaG9zdCwKLSAgICAgICAgICAgICAgIFNiTWVkaWFBdWRpb0NvZGVjIGF1ZGlvX2NvZGVjLAorICBQbGF5ZXJXb3JrZXIoU2JNZWRpYUF1ZGlvQ29kZWMgYXVkaW9fY29kZWMsCisgICAgICAgICAgICAgICBTYk1lZGlhVmlkZW9Db2RlYyB2aWRlb19jb2RlYywKICAgICAgICAgICAgICAgIHNjb3BlZF9wdHI8SGFuZGxlcj4gaGFuZGxlciwKKyAgICAgICAgICAgICAgIFVwZGF0ZU1lZGlhSW5mb0NCIHVwZGF0ZV9tZWRpYV9pbmZvX2NiLAogICAgICAgICAgICAgICAgU2JQbGF5ZXJEZWNvZGVyU3RhdHVzRnVuYyBkZWNvZGVyX3N0YXR1c19mdW5jLAogICAgICAgICAgICAgICAgU2JQbGF5ZXJTdGF0dXNGdW5jIHBsYXllcl9zdGF0dXNfZnVuYywKICNpZiBTQl9IQVMoUExBWUVSX0VSUk9SX01FU1NBR0UpCkBAIC0xNTgsMTYgKzE0NywxMiBAQAogICAgIGpvYl9xdWV1ZV8tPlNjaGVkdWxlKHN0ZDo6YmluZCgmUGxheWVyV29ya2VyOjpEb1NldFZvbHVtZSwgdGhpcywgdm9sdW1lKSk7CiAgIH0KIAotICB2b2lkIFVwZGF0ZURyb3BwZWRWaWRlb0ZyYW1lcyhpbnQgZHJvcHBlZF92aWRlb19mcmFtZXMpIHsKLSAgICBob3N0Xy0+VXBkYXRlRHJvcHBlZFZpZGVvRnJhbWVzKGRyb3BwZWRfdmlkZW9fZnJhbWVzKTsKLSAgfQotCiAgIFNiRGVjb2RlVGFyZ2V0IEdldEN1cnJlbnREZWNvZGVUYXJnZXQoKSB7CiAgICAgcmV0dXJuIGhhbmRsZXJfLT5HZXRDdXJyZW50RGVjb2RlVGFyZ2V0KCk7CiAgIH0KIAogIHByaXZhdGU6Ci0gIHZvaWQgVXBkYXRlTWVkaWFUaW1lKFNiVGltZSB0aW1lKTsKKyAgdm9pZCBVcGRhdGVNZWRpYUluZm8oU2JUaW1lIHRpbWUsIGludCBkcm9wcGVkX3ZpZGVvX2ZyYW1lcyk7CiAKICAgU2JQbGF5ZXJTdGF0ZSBwbGF5ZXJfc3RhdGUoKSBjb25zdCB7IHJldHVybiBwbGF5ZXJfc3RhdGVfOyB9CiAgIHZvaWQgVXBkYXRlUGxheWVyU3RhdGUoU2JQbGF5ZXJTdGF0ZSBwbGF5ZXJfc3RhdGUpOwpAQCAtMTkxLDkgKzE3NiwxMCBAQAogICBTYlRocmVhZCB0aHJlYWRfOwogICBzY29wZWRfcHRyPEpvYlF1ZXVlPiBqb2JfcXVldWVfOwogCi0gIEhvc3QqIGhvc3RfOwogICBTYk1lZGlhQXVkaW9Db2RlYyBhdWRpb19jb2RlY187CisgIFNiTWVkaWFWaWRlb0NvZGVjIHZpZGVvX2NvZGVjXzsKICAgc2NvcGVkX3B0cjxIYW5kbGVyPiBoYW5kbGVyXzsKKyAgVXBkYXRlTWVkaWFJbmZvQ0IgdXBkYXRlX21lZGlhX2luZm9fY2JfOwogCiAgIFNiUGxheWVyRGVjb2RlclN0YXR1c0Z1bmMgZGVjb2Rlcl9zdGF0dXNfZnVuY187CiAgIFNiUGxheWVyU3RhdHVzRnVuYyBwbGF5ZXJfc3RhdHVzX2Z1bmNfOwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfd3JpdGVfc2FtcGxlLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfd3JpdGVfc2FtcGxlLmNjCmluZGV4IDNmYTIxMjkuLjgxNzZmNDcgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3dyaXRlX3NhbXBsZS5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl93cml0ZV9zYW1wbGUuY2MKQEAgLTE2LDkgKzE2LDkgQEAKIAogI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX2ludGVybmFsLmgiCi0jaWYgU0JfUExBWUVSX0VOQUJMRV9WSURFT19EVU1QRVIKKyNpZiBTQl9QTEFZRVJfRU5BQkxFX1ZJREVPX0RVTVBFUiAmJiBTQl9IQVMoUExBWUVSX0ZJTFRFUl9URVNUUykKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvdmlkZW9fZG1wX3dyaXRlci5oIgotI2VuZGlmICAvLyBTQl9QTEFZRVJfRU5BQkxFX1ZJREVPX0RVTVBFUgorI2VuZGlmICAvLyBTQl9QTEFZRVJfRU5BQkxFX1ZJREVPX0RVTVBFUiAmJiBTQl9IQVMoUExBWUVSX0ZJTFRFUl9URVNUUykKIAogI2lmIFNCX0FQSV9WRVJTSU9OIDwgU0JfREVQUkVDQVRFX1NCX01FRElBX1RJTUVfQVBJX1ZFUlNJT04KIHZvaWQgU2JQbGF5ZXJXcml0ZVNhbXBsZShTYlBsYXllciBwbGF5ZXIsCkBAIC01NywxMyArNTcsMTMgQEAKIAogICBTYlRpbWUgc2FtcGxlX3RpbWVzdGFtcCA9IFNCX01FRElBX1RJTUVfVE9fU0JfVElNRShzYW1wbGVfcHRzKTsKIAotI2lmIFNCX1BMQVlFUl9FTkFCTEVfVklERU9fRFVNUEVSCisjaWYgU0JfUExBWUVSX0VOQUJMRV9WSURFT19EVU1QRVIgJiYgU0JfSEFTKFBMQVlFUl9GSUxURVJfVEVTVFMpCiAgIHVzaW5nIDo6c3RhcmJvYXJkOjpzaGFyZWQ6OnN0YXJib2FyZDo6cGxheWVyOjp2aWRlb19kbXA6OlZpZGVvRG1wV3JpdGVyOwogICBWaWRlb0RtcFdyaXRlcjo6T25QbGF5ZXJXcml0ZVNhbXBsZSgKICAgICAgIHBsYXllciwgc2FtcGxlX3R5cGUsIHNhbXBsZV9idWZmZXJzLCBzYW1wbGVfYnVmZmVyX3NpemVzLAogICAgICAgbnVtYmVyX29mX3NhbXBsZV9idWZmZXJzLCBzYW1wbGVfdGltZXN0YW1wLCB2aWRlb19zYW1wbGVfaW5mbywKICAgICAgIHNhbXBsZV9kcm1faW5mbyk7Ci0jZW5kaWYgIC8vIFNCX1BMQVlFUl9FTkFCTEVfVklERU9fRFVNUEVSCisjZW5kaWYgIC8vIFNCX1BMQVlFUl9FTkFCTEVfVklERU9fRFVNUEVSICYmIFNCX0hBUyhQTEFZRVJfRklMVEVSX1RFU1RTKQogCiAgIHBsYXllci0+V3JpdGVTYW1wbGUoc2FtcGxlX3R5cGUsIHNhbXBsZV9idWZmZXJzLCBzYW1wbGVfYnVmZmVyX3NpemVzLAogICAgICAgICAgICAgICAgICAgICAgIG51bWJlcl9vZl9zYW1wbGVfYnVmZmVycywgc2FtcGxlX3RpbWVzdGFtcCwKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3dyaXRlX3NhbXBsZTIuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl93cml0ZV9zYW1wbGUyLmNjCmluZGV4IDE3ZGFiMzQuLjRiOTU4MjUgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3dyaXRlX3NhbXBsZTIuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfd3JpdGVfc2FtcGxlMi5jYwpAQCAtMTYsOSArMTYsOSBAQAogCiAjaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfaW50ZXJuYWwuaCIKLSNpZiBTQl9QTEFZRVJfRU5BQkxFX1ZJREVPX0RVTVBFUgorI2lmIFNCX1BMQVlFUl9FTkFCTEVfVklERU9fRFVNUEVSICYmIFNCX0hBUyhQTEFZRVJfRklMVEVSX1RFU1RTKQogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci92aWRlb19kbXBfd3JpdGVyLmgiCi0jZW5kaWYgIC8vIFNCX1BMQVlFUl9FTkFCTEVfVklERU9fRFVNUEVSCisjZW5kaWYgIC8vIFNCX1BMQVlFUl9FTkFCTEVfVklERU9fRFVNUEVSICYmIFNCX0hBUyhQTEFZRVJfRklMVEVSX1RFU1RTKQogCiAjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfREVQUkVDQVRFX1NCX01FRElBX1RJTUVfQVBJX1ZFUlNJT04KIHZvaWQgU2JQbGF5ZXJXcml0ZVNhbXBsZTIoU2JQbGF5ZXIgcGxheWVyLApAQCAtNTAsMTMgKzUwLDEzIEBACiAgICAgcmV0dXJuOwogICB9CiAKLSNpZiBTQl9QTEFZRVJfRU5BQkxFX1ZJREVPX0RVTVBFUgorI2lmIFNCX1BMQVlFUl9FTkFCTEVfVklERU9fRFVNUEVSICYmIFNCX0hBUyhQTEFZRVJfRklMVEVSX1RFU1RTKQogICB1c2luZyA6OnN0YXJib2FyZDo6c2hhcmVkOjpzdGFyYm9hcmQ6OnBsYXllcjo6dmlkZW9fZG1wOjpWaWRlb0RtcFdyaXRlcjsKICAgVmlkZW9EbXBXcml0ZXI6Ok9uUGxheWVyV3JpdGVTYW1wbGUoCiAgICAgICBwbGF5ZXIsIHNhbXBsZV90eXBlLCBzYW1wbGVfYnVmZmVycywgc2FtcGxlX2J1ZmZlcl9zaXplcywKICAgICAgIG51bWJlcl9vZl9zYW1wbGVfYnVmZmVycywgc2FtcGxlX3RpbWVzdGFtcCwgdmlkZW9fc2FtcGxlX2luZm8sCiAgICAgICBzYW1wbGVfZHJtX2luZm8pOwotI2VuZGlmICAvLyBTQl9QTEFZRVJfRU5BQkxFX1ZJREVPX0RVTVBFUgorI2VuZGlmICAvLyBTQl9QTEFZRVJfRU5BQkxFX1ZJREVPX0RVTVBFUiAmJiBTQl9IQVMoUExBWUVSX0ZJTFRFUl9URVNUUykKIAogICBwbGF5ZXItPldyaXRlU2FtcGxlKHNhbXBsZV90eXBlLCBzYW1wbGVfYnVmZmVycywgc2FtcGxlX2J1ZmZlcl9zaXplcywKICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJfb2Zfc2FtcGxlX2J1ZmZlcnMsIHNhbXBsZV90aW1lc3RhbXAsCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3ZpZGVvX2RtcF9jb21tb24uY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3ZpZGVvX2RtcF9jb21tb24uY2MKaW5kZXggYzcyOWJkMS4uMjEyYmI1MCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci92aWRlb19kbXBfY29tbW9uLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvdmlkZW9fZG1wX2NvbW1vbi5jYwpAQCAtMTYsNiArMTYsNyBAQAogCiAjaW5jbHVkZSA8bGltaXRzPgogCisjaWYgU0JfSEFTKFBMQVlFUl9GSUxURVJfVEVTVFMpCiBuYW1lc3BhY2Ugc3RhcmJvYXJkIHsKIG5hbWVzcGFjZSBzaGFyZWQgewogbmFtZXNwYWNlIHN0YXJib2FyZCB7CkBAIC05OSw4ICsxMDAsMTUgQEAKICAgUmVhZChyZWFkX2NiLCByZXZlcnNlX2J5dGVfb3JkZXIsICZhdWRpb19oZWFkZXItPmF1ZGlvX3NwZWNpZmljX2NvbmZpZ19zaXplKTsKICAgYXVkaW9faGVhZGVyLT5zdG9yZWRfYXVkaW9fc3BlY2lmaWNfY29uZmlnLnJlc2l6ZSgKICAgICAgIGF1ZGlvX2hlYWRlci0+YXVkaW9fc3BlY2lmaWNfY29uZmlnX3NpemUpOworI2lmIFNCX0FQSV9WRVJTSU9OID49IDYKICAgYXVkaW9faGVhZGVyLT5hdWRpb19zcGVjaWZpY19jb25maWcgPQogICAgICAgYXVkaW9faGVhZGVyLT5zdG9yZWRfYXVkaW9fc3BlY2lmaWNfY29uZmlnLmRhdGEoKTsKKyNlbHNlCisgIFNCX0RDSEVDSyg4ID49IGF1ZGlvX2hlYWRlci0+c3RvcmVkX2F1ZGlvX3NwZWNpZmljX2NvbmZpZy5zaXplKCkpOworICBTYk1lbW9yeUNvcHkoYXVkaW9faGVhZGVyLT5hdWRpb19zcGVjaWZpY19jb25maWcsCisgICAgICAgICAgICAgICBhdWRpb19oZWFkZXItPnN0b3JlZF9hdWRpb19zcGVjaWZpY19jb25maWcuZGF0YSgpLAorICAgICAgICAgICAgICAgYXVkaW9faGVhZGVyLT5zdG9yZWRfYXVkaW9fc3BlY2lmaWNfY29uZmlnLnNpemUoKSk7CisjZW5kaWYKICAgUmVhZChyZWFkX2NiLCBhdWRpb19oZWFkZXItPnN0b3JlZF9hdWRpb19zcGVjaWZpY19jb25maWcuZGF0YSgpLAogICAgICAgIGF1ZGlvX2hlYWRlci0+YXVkaW9fc3BlY2lmaWNfY29uZmlnX3NpemUpOwogfQpAQCAtMjYxLDMgKzI2OSw0IEBACiB9ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCiB9ICAvLyBuYW1lc3BhY2Ugc2hhcmVkCiB9ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCisjZW5kaWYgIC8vIFNCX0hBUyhQTEFZRVJfRklMVEVSX1RFU1RTKQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci92aWRlb19kbXBfY29tbW9uLmggYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3ZpZGVvX2RtcF9jb21tb24uaAppbmRleCAyMGExMGEzLi4wYjRiOTdlIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3ZpZGVvX2RtcF9jb21tb24uaAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3ZpZGVvX2RtcF9jb21tb24uaApAQCAtMjEsNyArMjEsOSBAQAogCiAjaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9tZWRpYS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKIAorI2lmIFNCX0hBUyhQTEFZRVJfRklMVEVSX1RFU1RTKQogbmFtZXNwYWNlIHN0YXJib2FyZCB7CiBuYW1lc3BhY2Ugc2hhcmVkIHsKIG5hbWVzcGFjZSBzdGFyYm9hcmQgewpAQCAtNzAsNyArNzIsMTMgQEAKICAgU2JNZWRpYUF1ZGlvSGVhZGVyV2l0aENvbmZpZyhjb25zdCBTYk1lZGlhQXVkaW9IZWFkZXJXaXRoQ29uZmlnJiB0aGF0KQogICAgICAgOiBTYk1lZGlhQXVkaW9IZWFkZXIodGhhdCksCiAgICAgICAgIHN0b3JlZF9hdWRpb19zcGVjaWZpY19jb25maWcodGhhdC5zdG9yZWRfYXVkaW9fc3BlY2lmaWNfY29uZmlnKSB7CisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gNgogICAgIGF1ZGlvX3NwZWNpZmljX2NvbmZpZyA9IHN0b3JlZF9hdWRpb19zcGVjaWZpY19jb25maWcuZGF0YSgpOworI2Vsc2UKKyAgICBTQl9EQ0hFQ0soOCA+PSBzdG9yZWRfYXVkaW9fc3BlY2lmaWNfY29uZmlnLnNpemUoKSk7CisgICAgU2JNZW1vcnlDb3B5KGF1ZGlvX3NwZWNpZmljX2NvbmZpZywgc3RvcmVkX2F1ZGlvX3NwZWNpZmljX2NvbmZpZy5kYXRhKCksCisgICAgICAgICAgICAgICAgIHN0b3JlZF9hdWRpb19zcGVjaWZpY19jb25maWcuc2l6ZSgpKTsKKyNlbmRpZgogICB9CiAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFNiTWVkaWFBdWRpb0hlYWRlcldpdGhDb25maWcmIHRoYXQpID0gZGVsZXRlOwogCkBAIC0xNjEsNCArMTY5LDUgQEAKIH0gIC8vIG5hbWVzcGFjZSBzaGFyZWQKIH0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKIAorI2VuZGlmICAvLyBTQl9IQVMoUExBWUVSX0ZJTFRFUl9URVNUUykKICNlbmRpZiAgLy8gU1RBUkJPQVJEX1NIQVJFRF9TVEFSQk9BUkRfUExBWUVSX1ZJREVPX0RNUF9DT01NT05fSF8KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvdmlkZW9fZG1wX3JlYWRlci5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvdmlkZW9fZG1wX3JlYWRlci5jYwppbmRleCBhNzM0MjVjLi44OGU4YjQ5IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3ZpZGVvX2RtcF9yZWFkZXIuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci92aWRlb19kbXBfcmVhZGVyLmNjCkBAIC0xNiw2ICsxNiw3IEBACiAKICNpbmNsdWRlIDxmdW5jdGlvbmFsPgogCisjaWYgU0JfSEFTKFBMQVlFUl9GSUxURVJfVEVTVFMpCiBuYW1lc3BhY2Ugc3RhcmJvYXJkIHsKIG5hbWVzcGFjZSBzaGFyZWQgewogbmFtZXNwYWNlIHN0YXJib2FyZCB7CkBAIC0yMTMsMyArMjE0LDQgQEAKIH0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKIH0gIC8vIG5hbWVzcGFjZSBzaGFyZWQKIH0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKKyNlbmRpZiAgLy8gU0JfSEFTKFBMQVlFUl9GSUxURVJfVEVTVFMpCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3ZpZGVvX2RtcF9yZWFkZXIuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvdmlkZW9fZG1wX3JlYWRlci5oCmluZGV4IGUzNjc0YWEuLmFkMDlkMDUgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvdmlkZW9fZG1wX3JlYWRlci5oCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvdmlkZW9fZG1wX3JlYWRlci5oCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2lucHV0X2J1ZmZlcl9pbnRlcm5hbC5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci92aWRlb19kbXBfY29tbW9uLmgiCiAKKyNpZiBTQl9IQVMoUExBWUVSX0ZJTFRFUl9URVNUUykKIG5hbWVzcGFjZSBzdGFyYm9hcmQgewogbmFtZXNwYWNlIHNoYXJlZCB7CiBuYW1lc3BhY2Ugc3RhcmJvYXJkIHsKQEAgLTEyMiw0ICsxMjMsNSBAQAogfSAgLy8gbmFtZXNwYWNlIHNoYXJlZAogfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZAogCisjZW5kaWYgIC8vIFNCX0hBUyhQTEFZRVJfRklMVEVSX1RFU1RTKQogI2VuZGlmICAvLyBTVEFSQk9BUkRfU0hBUkVEX1NUQVJCT0FSRF9QTEFZRVJfVklERU9fRE1QX1JFQURFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci92aWRlb19kbXBfd3JpdGVyLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci92aWRlb19kbXBfd3JpdGVyLmNjCmluZGV4IDY2MzM4YjQuLjUyMGJlODMgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvdmlkZW9fZG1wX3dyaXRlci5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3ZpZGVvX2RtcF93cml0ZXIuY2MKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9hcHBsaWNhdGlvbi5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9zdHJpbmcuaCIKIAorI2lmIFNCX0hBUyhQTEFZRVJfRklMVEVSX1RFU1RTKQogbmFtZXNwYWNlIHN0YXJib2FyZCB7CiBuYW1lc3BhY2Ugc2hhcmVkIHsKIG5hbWVzcGFjZSBzdGFyYm9hcmQgewpAQCAtMjAxLDMgKzIwMiw0IEBACiB9ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCiB9ICAvLyBuYW1lc3BhY2Ugc2hhcmVkCiB9ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCisjZW5kaWYgIC8vIFNCX0hBUyhQTEFZRVJfRklMVEVSX1RFU1RTKQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci92aWRlb19kbXBfd3JpdGVyLmggYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3ZpZGVvX2RtcF93cml0ZXIuaAppbmRleCAyM2Q1NjI4Li4wNTQ2M2NkIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3ZpZGVvX2RtcF93cml0ZXIuaAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3ZpZGVvX2RtcF93cml0ZXIuaApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgInN0YXJib2FyZC9wbGF5ZXIuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvdmlkZW9fZG1wX2NvbW1vbi5oIgogCisjaWYgU0JfSEFTKFBMQVlFUl9GSUxURVJfVEVTVFMpCiBuYW1lc3BhY2Ugc3RhcmJvYXJkIHsKIG5hbWVzcGFjZSBzaGFyZWQgewogbmFtZXNwYWNlIHN0YXJib2FyZCB7CkBAIC03Miw0ICs3Myw1IEBACiB9ICAvLyBuYW1lc3BhY2Ugc2hhcmVkCiB9ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCiAKKyNlbmRpZiAgLy8gU0JfSEFTKFBMQVlFUl9GSUxURVJfVEVTVFMpCiAjZW5kaWYgIC8vIFNUQVJCT0FSRF9TSEFSRURfU1RBUkJPQVJEX1BMQVlFUl9WSURFT19ETVBfV1JJVEVSX0hfCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2F0b21pY19wdWJsaWMuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvYXRvbWljX3B1YmxpYy5oCmluZGV4IGZjYWZjZGQuLmI1MDBmYmQgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvYXRvbWljX3B1YmxpYy5oCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvYXRvbWljX3B1YmxpYy5oCkBAIC0xMTAsNiArMTEwLDMwIEBACiAgIHJldHVybiAwOwogfQogCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfRVhQRVJJTUVOVEFMX0FQSV9WRVJTSU9OCitTQl9DX0ZPUkNFX0lOTElORSBTYkF0b21pYzgKK1NiQXRvbWljUmVsZWFzZV9Db21wYXJlQW5kU3dhcDgodm9sYXRpbGUgU2JBdG9taWM4KiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JBdG9taWM4IG9sZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkF0b21pYzggbmV3X3ZhbHVlKSB7CisgIFNCX1VOUkVGRVJFTkNFRF9QQVJBTUVURVIocHRyKTsKKyAgU0JfVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUihvbGRfdmFsdWUpOworICBTQl9VTlJFRkVSRU5DRURfUEFSQU1FVEVSKG5ld192YWx1ZSk7CisgIHJldHVybiAwOworfQorCitTQl9DX0ZPUkNFX0lOTElORSB2b2lkCitTYkF0b21pY05vQmFycmllcl9TdG9yZTgodm9sYXRpbGUgU2JBdG9taWM4KiBwdHIsIFNiQXRvbWljOCB2YWx1ZSkgeworICBTQl9VTlJFRkVSRU5DRURfUEFSQU1FVEVSKHB0cik7CisgIFNCX1VOUkVGRVJFTkNFRF9QQVJBTUVURVIodmFsdWUpOworfQorCitTQl9DX0ZPUkNFX0lOTElORSBTYkF0b21pYzgKK1NiQXRvbWljTm9CYXJyaWVyX0xvYWQ4KHZvbGF0aWxlIGNvbnN0IFNiQXRvbWljOCogcHRyKSB7CisgIFNCX1VOUkVGRVJFTkNFRF9QQVJBTUVURVIocHRyKTsKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKwogLy8gNjQtYml0IGF0b21pYyBvcGVyYXRpb25zIChvbmx5IGF2YWlsYWJsZSBvbiA2NC1iaXQgcHJvY2Vzc29ycykuCiAjaWYgU0JfSEFTKDY0X0JJVF9BVE9NSUNTKQogU0JfQ19GT1JDRV9JTkxJTkUgU2JBdG9taWM2NApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9kcm1fY3JlYXRlX3N5c3RlbS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZHJtX2NyZWF0ZV9zeXN0ZW0uY2MKaW5kZXggMWJmYjQyNS4uMzhjZjRjMSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9kcm1fY3JlYXRlX3N5c3RlbS5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RybV9jcmVhdGVfc3lzdGVtLmNjCkBAIC0xNCw3ICsxNCwyNyBAQAogCiAjaW5jbHVkZSAic3RhcmJvYXJkL2RybS5oIgogCi0jaWYgU0JfSEFTKERSTV9TRVNTSU9OX0NMT1NFRCkKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9EUk1fUkVGSU5FTUVOVF9BUElfVkVSU0lPTgorCitTYkRybVN5c3RlbSBTYkRybUNyZWF0ZVN5c3RlbSgKKyAgICBjb25zdCBjaGFyKiBrZXlfc3lzdGVtLAorICAgIHZvaWQqIGNvbnRleHQsCisgICAgU2JEcm1TZXNzaW9uVXBkYXRlUmVxdWVzdEZ1bmMgdXBkYXRlX3JlcXVlc3RfY2FsbGJhY2ssCisgICAgU2JEcm1TZXNzaW9uVXBkYXRlZEZ1bmMgc2Vzc2lvbl91cGRhdGVkX2NhbGxiYWNrLAorICAgIFNiRHJtU2Vzc2lvbktleVN0YXR1c2VzQ2hhbmdlZEZ1bmMga2V5X3N0YXR1c2VzX2NoYW5nZWRfY2FsbGJhY2ssCisgICAgU2JEcm1TZXJ2ZXJDZXJ0aWZpY2F0ZVVwZGF0ZWRGdW5jIHNlcnZlcl9jZXJ0aWZpY2F0ZV91cGRhdGVkX2NhbGxiYWNrLAorICAgIFNiRHJtU2Vzc2lvbkNsb3NlZEZ1bmMgc2Vzc2lvbl9jbG9zZWRfY2FsbGJhY2spIHsKKyAgU0JfVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUihjb250ZXh0KTsKKyAgU0JfVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUihrZXlfc3lzdGVtKTsKKyAgU0JfVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUih1cGRhdGVfcmVxdWVzdF9jYWxsYmFjayk7CisgIFNCX1VOUkVGRVJFTkNFRF9QQVJBTUVURVIoc2Vzc2lvbl91cGRhdGVkX2NhbGxiYWNrKTsKKyAgU0JfVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUihrZXlfc3RhdHVzZXNfY2hhbmdlZF9jYWxsYmFjayk7CisgIFNCX1VOUkVGRVJFTkNFRF9QQVJBTUVURVIoc2VydmVyX2NlcnRpZmljYXRlX3VwZGF0ZWRfY2FsbGJhY2spOworICBTQl9VTlJFRkVSRU5DRURfUEFSQU1FVEVSKHNlc3Npb25fY2xvc2VkX2NhbGxiYWNrKTsKKyAgcmV0dXJuIGtTYkRybVN5c3RlbUludmFsaWQ7Cit9CisKKyNlbGlmIFNCX0hBUyhEUk1fU0VTU0lPTl9DTE9TRUQpCiAKIFNiRHJtU3lzdGVtIFNiRHJtQ3JlYXRlU3lzdGVtKAogICAgIGNvbnN0IGNoYXIqIGtleV9zeXN0ZW0sCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RybV9pc19zZXJ2ZXJfY2VydGlmaWNhdGVfdXBkYXRhYmxlLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9kcm1faXNfc2VydmVyX2NlcnRpZmljYXRlX3VwZGF0YWJsZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDljZmY1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9kcm1faXNfc2VydmVyX2NlcnRpZmljYXRlX3VwZGF0YWJsZS5jYwpAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAic3RhcmJvYXJkL2RybS5oIgorCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfRFJNX1JFRklORU1FTlRfQVBJX1ZFUlNJT04KKworYm9vbCBTYkRybUlzU2VydmVyQ2VydGlmaWNhdGVVcGRhdGFibGUoU2JEcm1TeXN0ZW0gZHJtX3N5c3RlbSkgeworICBTQl9VTlJFRkVSRU5DRURfUEFSQU1FVEVSKGRybV9zeXN0ZW0pOworCisgIHJldHVybiBmYWxzZTsKK30KKworI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9EUk1fUkVGSU5FTUVOVF9BUElfVkVSU0lPTgpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9kcm1fdXBkYXRlX3NlcnZlcl9jZXJ0aWZpY2F0ZS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZHJtX3VwZGF0ZV9zZXJ2ZXJfY2VydGlmaWNhdGUuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAyMzQwYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZHJtX3VwZGF0ZV9zZXJ2ZXJfY2VydGlmaWNhdGUuY2MKQEAgLTAsMCArMSwyOSBAQAorLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgInN0YXJib2FyZC9kcm0uaCIKKworI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX0RSTV9SRUZJTkVNRU5UX0FQSV9WRVJTSU9OCisKK3ZvaWQgU2JEcm1VcGRhdGVTZXJ2ZXJDZXJ0aWZpY2F0ZShTYkRybVN5c3RlbSBkcm1fc3lzdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogY2VydGlmaWNhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNlcnRpZmljYXRlX3NpemUpIHsKKyAgU0JfVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUihkcm1fc3lzdGVtKTsKKyAgU0JfVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUih0aWNrZXQpOworICBTQl9VTlJFRkVSRU5DRURfUEFSQU1FVEVSKGNlcnRpZmljYXRlKTsKKyAgU0JfVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUihjZXJ0aWZpY2F0ZV9zaXplKTsKK30KKworI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9EUk1fUkVGSU5FTUVOVF9BUElfVkVSU0lPTgpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9tZW1vcnlfcHJvdGVjdC5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvbWVtb3J5X3Byb3RlY3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYzODcwMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvbWVtb3J5X3Byb3RlY3QuY2MKQEAgLTAsMCArMSwyNCBAQAorLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgInN0YXJib2FyZC9jb25maWd1cmF0aW9uLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgorCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfTUVNT1JZX1BST1RFQ1RfQVBJX1ZFUlNJT04KK2Jvb2wgU2JNZW1vcnlQcm90ZWN0KHZvaWQqIC8qdmlydHVhbF9hZGRyZXNzKi8sCisgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IC8qc2l6ZV9ieXRlcyovLAorICAgICAgICAgICAgICAgICAgICAgaW50IC8qZmxhZ3MqLykgeworICByZXR1cm4gZmFsc2U7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9hbmFsb2dfdGh1bWJzdGlja19pbnB1dC5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9hbmFsb2dfdGh1bWJzdGlja19pbnB1dC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAyYTEyZC4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC91d3AvYW5hbG9nX3RodW1ic3RpY2tfaW5wdXQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvdXdwL2FuYWxvZ190aHVtYnN0aWNrX2lucHV0LmgiCi0KLSNpbmNsdWRlIDxXaW5kb3dzLkdhbWluZy5JbnB1dC5oPgotI2luY2x1ZGUgPGFsZ29yaXRobT4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2Vycm9yX3V0aWxzLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3R5cGVzLmgiCi0KLSNwcmFnbWEgY29tbWVudChsaWIsICJ4aW5wdXQ5XzFfMC5saWIiKQotCi11c2luZyBXaW5kb3dzOjpGb3VuZGF0aW9uOjpDb2xsZWN0aW9uczo6SVZlY3RvclZpZXc7Ci11c2luZyBXaW5kb3dzOjpHYW1pbmc6OklucHV0OjpHYW1lcGFkOwotdXNpbmcgV2luZG93czo6R2FtaW5nOjpJbnB1dDo6R2FtZXBhZFJlYWRpbmc7Ci11c2luZyBXaW5kb3dzOjpHYW1pbmc6OklucHV0OjpSYXdHYW1lQ29udHJvbGxlcjsKLQotbmFtZXNwYWNlIHN0YXJib2FyZCB7Ci1uYW1lc3BhY2Ugc2hhcmVkIHsKLW5hbWVzcGFjZSB1d3AgewotbmFtZXNwYWNlIHsKLQotY29uc3QgaW50IGtNYXhQbGF5ZXJDb3VudGVyID0gNDsKLWNvbnN0IGZsb2F0IGtEZWFkWm9uZVRocmVzaG9sZCA9IC4yNGY7Ci0KLWZsb2F0IEFwcGx5TGluZWFyRGVhZFpvbmUoZmxvYXQgdmFsdWUsIGZsb2F0IG1heFZhbHVlLCBmbG9hdCBkZWFkWm9uZVNpemUpIHsKLSAgaWYgKHZhbHVlIDwgLWRlYWRab25lU2l6ZSkgewotICAgIC8vIEluY3JlYXNlIG5lZ2F0aXZlIHZhbHVlcyB0byByZW1vdmUgdGhlIGRlYWR6b25lIGRpc2NvbnRpbnVpdHkuCi0gICAgdmFsdWUgKz0gZGVhZFpvbmVTaXplOwotICB9IGVsc2UgaWYgKHZhbHVlID4gZGVhZFpvbmVTaXplKSB7Ci0gICAgLy8gRGVjcmVhc2UgcG9zaXRpdmUgdmFsdWVzIHRvIHJlbW92ZSB0aGUgZGVhZHpvbmUgZGlzY29udGludWl0eS4KLSAgICB2YWx1ZSAtPSBkZWFkWm9uZVNpemU7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gVmFsdWVzIGluc2lkZSB0aGUgZGVhZHpvbmUgY29tZSBvdXQgemVyby4KLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8vIFNjYWxlIGludG8gMC0xIHJhbmdlLgotICBmbG9hdCBzY2FsZWRWYWx1ZSA9IHZhbHVlIC8gKG1heFZhbHVlIC0gZGVhZFpvbmVTaXplKTsKLSAgcmV0dXJuIHN0ZDo6bWF4KC0xLmYsIHN0ZDo6bWluKHNjYWxlZFZhbHVlLCAxLmYpKTsKLX0KLQotdm9pZCBBcHBseVN0aWNrRGVhZFpvbmUoZmxvYXQgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHksCi0gICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtYXhfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBkZWFkX3pvbmVfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByZXN1bHRfeCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByZXN1bHRfeSkgewotICAqcmVzdWx0X3ggPSBBcHBseUxpbmVhckRlYWRab25lKHgsIG1heF92YWx1ZSwgZGVhZF96b25lX3NpemUpOwotICAqcmVzdWx0X3kgPSBBcHBseUxpbmVhckRlYWRab25lKHksIG1heF92YWx1ZSwgZGVhZF96b25lX3NpemUpOwotfQotCi1UaHVtYlN0aWNrcyBSZWFkVGh1bWJTdGljayhHYW1lcGFkIF4gY29udHJvbGxlcikgewotICBUaHVtYlN0aWNrcyBvdXRwdXQ7Ci0gIEdhbWVwYWRSZWFkaW5nIHJlYWRpbmcgPSBjb250cm9sbGVyLT5HZXRDdXJyZW50UmVhZGluZygpOwotCi0gIEFwcGx5U3RpY2tEZWFkWm9uZShzdGF0aWNfY2FzdDxmbG9hdD4ocmVhZGluZy5MZWZ0VGh1bWJzdGlja1gpLAotICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHJlYWRpbmcuTGVmdFRodW1ic3RpY2tZKSwgMS5mLAotICAgICAgICAgICAgICAgICAgICAga0RlYWRab25lVGhyZXNob2xkLCAmb3V0cHV0LmxlZnRfeCwgJm91dHB1dC5sZWZ0X3kpOwotCi0gIEFwcGx5U3RpY2tEZWFkWm9uZShzdGF0aWNfY2FzdDxmbG9hdD4ocmVhZGluZy5SaWdodFRodW1ic3RpY2tYKSwKLSAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0PihyZWFkaW5nLlJpZ2h0VGh1bWJzdGlja1kpLCAxLmYsCi0gICAgICAgICAgICAgICAgICAgICBrRGVhZFpvbmVUaHJlc2hvbGQsICZvdXRwdXQucmlnaHRfeCwgJm91dHB1dC5yaWdodF95KTsKLSAgcmV0dXJuIG91dHB1dDsKLX0KLX0gIC8vIG5hbWVzcGFjZQotCi12b2lkIEdldEdhbWVwYWRUaHVtYlN0aWNrcyhzdGQ6OnZlY3RvcjxUaHVtYlN0aWNrcz4qIGRlc3RpbmF0aW9uKSB7Ci0gIGRlc3RpbmF0aW9uLT5lcmFzZShkZXN0aW5hdGlvbi0+YmVnaW4oKSwgZGVzdGluYXRpb24tPmVuZCgpKTsKLQotICAvLyBUaGlzIHByb2ZpbGVkIHRvIGFuIGF2ZXJhZ2UgdGltZSBvZiAzM3VzIHRvIGV4ZWN1dGUuCi0gIElWZWN0b3JWaWV3PEdhbWVwYWQgXj4gXiBnYW1lcGFkcyA9IEdhbWVwYWQ6OkdhbWVwYWRzOwotCi0gIC8vIFRoaXMgcHJvZmlsZWQgdG8gdGFrZSBvbiBhdmVyYWdlIDl1cyBvZiB0aW1lIHRvIHJlYWQgY29udHJvbGxlciBzdGF0ZS4KLSAgY29uc3QgdWludDMyX3QgbiA9IGdhbWVwYWRzLT5TaXplOwotICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbjsgKytpKSB7Ci0gICAgR2FtZXBhZCBeIGdhbWVwYWQgPSBnYW1lcGFkcy0+R2V0QXQoaSk7Ci0gICAgVGh1bWJTdGlja3MgdGh1bWJfc3RpY2sgPSBSZWFkVGh1bWJTdGljayhnYW1lcGFkKTsKLSAgICBkZXN0aW5hdGlvbi0+cHVzaF9iYWNrKHRodW1iX3N0aWNrKTsKLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgdXdwCi19ICAvLyBuYW1lc3BhY2Ugc2hhcmVkCi19ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC91d3AvYW5hbG9nX3RodW1ic3RpY2tfaW5wdXQuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9hbmFsb2dfdGh1bWJzdGlja19pbnB1dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWYwZDQyLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9hbmFsb2dfdGh1bWJzdGlja19pbnB1dC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBTVEFSQk9BUkRfU0hBUkVEX1VXUF9BTkFMT0dfVEhVTUJTVElDS19JTlBVVF9IXwotI2RlZmluZSBTVEFSQk9BUkRfU0hBUkVEX1VXUF9BTkFMT0dfVEhVTUJTVElDS19JTlBVVF9IXwotCi0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3R5cGVzLmgiCi0KLW5hbWVzcGFjZSBzdGFyYm9hcmQgewotbmFtZXNwYWNlIHNoYXJlZCB7Ci1uYW1lc3BhY2UgdXdwIHsKLQotc3RydWN0IFRodW1iU3RpY2tzIHsKLSAgZmxvYXQgbGVmdF94ID0gMC4wZjsKLSAgZmxvYXQgbGVmdF95ID0gMC4wZjsKLSAgZmxvYXQgcmlnaHRfeCA9IDAuMGY7Ci0gIGZsb2F0IHJpZ2h0X3kgPSAwLjBmOwotfTsKLQotLy8gUmVhZHMgYWxsIGNvbm5lY3RlZCBnYW1lIHBhZHMgYW5kIHN0b3JlcyB0aGUgam95c3RpY2sgc3RhdGVzIGluIHRoZQotLy8gZGVzdGluYXRpb24gdmVjdG9yLiBOb3RlIHRoYXQgdGhlIGRlc3RpbmF0aW9uIHZlY3RvciBpcyB1bmNvbmRpdGlvbmFsbHkKLS8vIGNsZWFyZWQgYmVmb3JlIGJlaW5nIHBvcHVsYXRlZC4KLXZvaWQgR2V0R2FtZXBhZFRodW1iU3RpY2tzKHN0ZDo6dmVjdG9yPFRodW1iU3RpY2tzPiogZGVzdGluYXRpb24pOwotCi19ICAvLyBuYW1lc3BhY2UgdXdwCi19ICAvLyBuYW1lc3BhY2Ugc2hhcmVkCi19ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCi0KLSNlbmRpZiAgLy8gU1RBUkJPQVJEX1NIQVJFRF9VV1BfQU5BTE9HX1RIVU1CU1RJQ0tfSU5QVVRfSF8KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9hbmFsb2dfdGh1bWJzdGlja19pbnB1dF90aHJlYWQuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC91d3AvYW5hbG9nX3RodW1ic3RpY2tfaW5wdXRfdGhyZWFkLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDA1ZTZhLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9hbmFsb2dfdGh1bWJzdGlja19pbnB1dF90aHJlYWQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvdXdwL2FuYWxvZ190aHVtYnN0aWNrX2lucHV0X3RocmVhZC5oIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJzdGFyYm9hcmQvY29tbW9uL3RocmVhZC5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9kb3VibGUuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3V3cC9hbmFsb2dfdGh1bWJzdGlja19pbnB1dC5oIgotI2luY2x1ZGUgInN0YXJib2FyZC90aHJlYWQuaCIKLQotbmFtZXNwYWNlIHN0YXJib2FyZCB7Ci1uYW1lc3BhY2Ugc2hhcmVkIHsKLW5hbWVzcGFjZSB1d3AgewotCi1jbGFzcyBBbmFsb2dUaHVtYnN0aWNrVGhyZWFkOjpJbXBsIDogcHVibGljIFRocmVhZCB7Ci0gcHVibGljOgotICBleHBsaWNpdCBJbXBsKENhbGxiYWNrKiBjYikgOiBUaHJlYWQoIkFuYWxvZ0dhbWVwYWQiKSwgY2FsbGJhY2tfKGNiKSB7Ci0gICAgc3RpY2tfaXNfY2VudGVyZWRfW2tTYktleUdhbWVwYWRMZWZ0U3RpY2tMZWZ0XSA9IHRydWU7Ci0gICAgc3RpY2tfaXNfY2VudGVyZWRfW2tTYktleUdhbWVwYWRSaWdodFN0aWNrTGVmdF0gPSB0cnVlOwotICAgIHN0aWNrX2lzX2NlbnRlcmVkX1trU2JLZXlHYW1lcGFkTGVmdFN0aWNrVXBdID0gdHJ1ZTsKLSAgICBzdGlja19pc19jZW50ZXJlZF9ba1NiS2V5R2FtZXBhZFJpZ2h0U3RpY2tVcF0gPSB0cnVlOwotCi0gICAgVGhyZWFkOjpTdGFydCgpOwotICB9Ci0gIH5JbXBsKCkgeyBUaHJlYWQ6OkpvaW4oKTsgfQotCi0gIHZvaWQgUnVuKCkgb3ZlcnJpZGUgewotICAgIHdoaWxlICgham9pbl9jYWxsZWQoKSkgewotICAgICAgVXBkYXRlKCk7Ci0gICAgICAvLyAxMjBoeiB0byBwcm92aWRlIHNtb290aCA2MGZwcyBwbGF5YmFjay4KLSAgICAgIFNiVGhyZWFkU2xlZXAoa1NiVGltZVNlY29uZCAvIGtQb2xsaW5nRnJlcXVlbmN5KTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIFVwZGF0ZSgpIHsKLSAgICBUaHVtYlN0aWNrcyB0aHVtYl9zdGF0ZSA9IEdldENvbWJpbmVkVGh1bWJTdGlja1N0YXRlKCk7Ci0KLSAgICBGaXJlRXZlbnRJZk5lY2Vzc2FyeShrU2JLZXlHYW1lcGFkTGVmdFN0aWNrTGVmdCwgdGh1bWJfc3RhdGUubGVmdF94KTsKLSAgICBGaXJlRXZlbnRJZk5lY2Vzc2FyeShrU2JLZXlHYW1lcGFkTGVmdFN0aWNrVXAsIHRodW1iX3N0YXRlLmxlZnRfeSk7Ci0gICAgRmlyZUV2ZW50SWZOZWNlc3Nhcnkoa1NiS2V5R2FtZXBhZFJpZ2h0U3RpY2tMZWZ0LCB0aHVtYl9zdGF0ZS5yaWdodF94KTsKLSAgICBGaXJlRXZlbnRJZk5lY2Vzc2FyeShrU2JLZXlHYW1lcGFkUmlnaHRTdGlja1VwLCB0aHVtYl9zdGF0ZS5yaWdodF95KTsKLSAgfQotCi0gIHZvaWQgRmlyZUV2ZW50SWZOZWNlc3NhcnkoU2JLZXkgc2Jfa2V5LCBmbG9hdCB2YWx1ZSkgewotICAgIGlmICh2YWx1ZSA9PSAwLjBmKSB7Ci0gICAgICBpZiAoc3RpY2tfaXNfY2VudGVyZWRfW3NiX2tleV0pIHsKLSAgICAgICAgLy8gVGhlIHByZXZpb3VzIHN0aWNrIGlucHV0IGlzIGluIGNlbnRlciBwb3NpdGlvbiwgc28gaXQgaXMgbm90Ci0gICAgICAgIC8vIG5lY2Vzc2FyeSB0byBpbmplY3QgYW5vdGhlciBjZW50ZXIgaW5wdXQgZXZlbnQuCi0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIHN0aWNrX2lzX2NlbnRlcmVkX1tzYl9rZXldID0gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgc3RpY2tfaXNfY2VudGVyZWRfW3NiX2tleV0gPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBTYklucHV0VmVjdG9yIGlucHV0X3ZlY3RvciA9IHswLCAwfTsKLQotICAgIHN3aXRjaCAoc2Jfa2V5KSB7Ci0gICAgICBjYXNlIGtTYktleUdhbWVwYWRSaWdodFN0aWNrTGVmdDoKLSAgICAgIGNhc2Uga1NiS2V5R2FtZXBhZExlZnRTdGlja0xlZnQ6IHsKLSAgICAgICAgaW5wdXRfdmVjdG9yLnggPSB2YWx1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIGtTYktleUdhbWVwYWRSaWdodFN0aWNrVXA6Ci0gICAgICBjYXNlIGtTYktleUdhbWVwYWRMZWZ0U3RpY2tVcDogewotICAgICAgICBpbnB1dF92ZWN0b3IueSA9IC12YWx1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBkZWZhdWx0OiB7Ci0gICAgICAgIFNCX05PVFJFQUNIRUQoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhbGxiYWNrXy0+T25Kb3lzdGlja1VwZGF0ZShzYl9rZXksIGlucHV0X3ZlY3Rvcik7Ci0gIH0KLQotICBUaHVtYlN0aWNrcyBHZXRDb21iaW5lZFRodW1iU3RpY2tTdGF0ZSgpIHsKLSAgICBUaHVtYlN0aWNrcyBhbGxfdGh1bWJfc3RhdGU7Ci0gICAgR2V0R2FtZXBhZFRodW1iU3RpY2tzKCZ0aHVtYl9zdGlja3NfKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGh1bWJfc3RpY2tzXy5zaXplKCk7ICsraSkgewotICAgICAgVGh1bWJTdGlja3MgdGh1bWJfc3RhdGUgPSB0aHVtYl9zdGlja3NfW2ldOwotCi0gICAgICBhbGxfdGh1bWJfc3RhdGUubGVmdF94ICs9IHRodW1iX3N0YXRlLmxlZnRfeDsKLSAgICAgIGFsbF90aHVtYl9zdGF0ZS5sZWZ0X3kgKz0gdGh1bWJfc3RhdGUubGVmdF95OwotICAgICAgYWxsX3RodW1iX3N0YXRlLnJpZ2h0X3ggKz0gdGh1bWJfc3RhdGUucmlnaHRfeDsKLSAgICAgIGFsbF90aHVtYl9zdGF0ZS5yaWdodF95ICs9IHRodW1iX3N0YXRlLnJpZ2h0X3k7Ci0gICAgfQotCi0gICAgYWxsX3RodW1iX3N0YXRlLmxlZnRfeCA9IENsYW1wVG9aZXJvT25lKGFsbF90aHVtYl9zdGF0ZS5sZWZ0X3gpOwotICAgIGFsbF90aHVtYl9zdGF0ZS5sZWZ0X3kgPSBDbGFtcFRvWmVyb09uZShhbGxfdGh1bWJfc3RhdGUubGVmdF95KTsKLSAgICBhbGxfdGh1bWJfc3RhdGUucmlnaHRfeCA9IENsYW1wVG9aZXJvT25lKGFsbF90aHVtYl9zdGF0ZS5yaWdodF94KTsKLSAgICBhbGxfdGh1bWJfc3RhdGUucmlnaHRfeSA9IENsYW1wVG9aZXJvT25lKGFsbF90aHVtYl9zdGF0ZS5yaWdodF95KTsKLQotICAgIHJldHVybiBhbGxfdGh1bWJfc3RhdGU7Ci0gIH0KLQotICBzdGF0aWMgZmxvYXQgQ2xhbXBUb1plcm9PbmUoZmxvYXQgaW4pIHsKLSAgICByZXR1cm4gc3RkOjptYXgoLTEuMGYsIHN0ZDo6bWluKDEuMGYsIGluKSk7Ci0gIH0KLSAgQ2FsbGJhY2sqIGNhbGxiYWNrXzsKLSAgc3RkOjptYXA8U2JLZXksIGJvb2w+IHN0aWNrX2lzX2NlbnRlcmVkXzsKLSAgc3RkOjp2ZWN0b3I8VGh1bWJTdGlja3M+IHRodW1iX3N0aWNrc187Ci19OwotCi1BbmFsb2dUaHVtYnN0aWNrVGhyZWFkOjpBbmFsb2dUaHVtYnN0aWNrVGhyZWFkKENhbGxiYWNrKiBjYikgewotICBpbXBsXy5yZXNldChuZXcgSW1wbChjYikpOwotfQotCi1BbmFsb2dUaHVtYnN0aWNrVGhyZWFkOjp+QW5hbG9nVGh1bWJzdGlja1RocmVhZCgpIHsKLSAgaW1wbF8ucmVzZXQobnVsbHB0cik7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB1d3AKLX0gIC8vIG5hbWVzcGFjZSBzaGFyZWQKLX0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9hbmFsb2dfdGh1bWJzdGlja19pbnB1dF90aHJlYWQuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9hbmFsb2dfdGh1bWJzdGlja19pbnB1dF90aHJlYWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTViYmVmYS4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC91d3AvYW5hbG9nX3RodW1ic3RpY2tfaW5wdXRfdGhyZWFkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFNUQVJCT0FSRF9TSEFSRURfVVdQX0FOQUxPR19USFVNQlNUSUNLX0lOUFVUX1RIUkVBRF9IXwotI2RlZmluZSBTVEFSQk9BUkRfU0hBUkVEX1VXUF9BTkFMT0dfVEhVTUJTVElDS19JTlBVVF9USFJFQURfSF8KLQotI2luY2x1ZGUgInN0YXJib2FyZC9jb21tb24vc2NvcGVkX3B0ci5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9jb25maWd1cmF0aW9uLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL2lucHV0LmgiCi0KLW5hbWVzcGFjZSBzdGFyYm9hcmQgewotbmFtZXNwYWNlIHNoYXJlZCB7Ci1uYW1lc3BhY2UgdXdwIHsKLQotLy8gVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgdGhyZWFkIHRoYXQgd2lsbCBwb2xsIGFsbCBnYW1lcGFkcyBmb3IKLS8vIHRoZSBhbmFsb2cgc3RpY2tzLiBUaGUgc3RpY2tzIGFyZSBzdW1tZWQgdG9nZXRoZXIgYW5kIHRoZW4KLS8vIHRoZSBjYWxsYmFjayB3aWxsIGJlIGludm9rZWQgd2l0aCB0aGUgdGh1bWJzdGljayB2YWx1ZXMuCi1jbGFzcyBBbmFsb2dUaHVtYnN0aWNrVGhyZWFkIHsKLSBwdWJsaWM6Ci0gIGVudW0geyBrUG9sbGluZ0ZyZXF1ZW5jeSA9IDEyMCB9OyAgLy8gU21vb3RoIHBsYXliYWNrIGZvciA2MGZwcy4KLQotICBjbGFzcyBDYWxsYmFjayB7Ci0gICBwdWJsaWM6Ci0gICAgdmlydHVhbCB+Q2FsbGJhY2soKSB7fQotICAgIHZpcnR1YWwgdm9pZCBPbkpveXN0aWNrVXBkYXRlKFNiS2V5IGtleSwgU2JJbnB1dFZlY3RvciBwb3NpdGlvbikgPSAwOwotICB9OwotCi0gIGV4cGxpY2l0IEFuYWxvZ1RodW1ic3RpY2tUaHJlYWQoQ2FsbGJhY2sqIGNiKTsKLSAgfkFuYWxvZ1RodW1ic3RpY2tUaHJlYWQoKTsKLQotIHByaXZhdGU6Ci0gIFNCX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihBbmFsb2dUaHVtYnN0aWNrVGhyZWFkKTsKLSAgY2xhc3MgSW1wbDsKLSAgc2NvcGVkX3B0cjxJbXBsPiBpbXBsXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSB1d3AKLX0gIC8vIG5hbWVzcGFjZSBzaGFyZWQKLX0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKLQotI2VuZGlmICAvLyBTVEFSQk9BUkRfU0hBUkVEX1VXUF9BTkFMT0dfVEhVTUJTVElDS19JTlBVVF9USFJFQURfSF8KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9hcHBfYWNjZXNzb3JzLmggYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC91d3AvYXBwX2FjY2Vzc29ycy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmE2MjNhLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9hcHBfYWNjZXNzb3JzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaWZuZGVmIFNUQVJCT0FSRF9TSEFSRURfVVdQX0FQUF9BQ0NFU1NPUlNfSF8KLSNkZWZpbmUgU1RBUkJPQVJEX1NIQVJFRF9VV1BfQVBQX0FDQ0VTU09SU19IXwotCi0vLyBBIHNldCBvZiBhcHBsaWNhdGlvbiBhbmQgbWFpbi10aHJlYWQgYWNjZXNzb3JzCi0vLyBzbyBhcyB0byBhdm9pZCBpbmNsdWRpbmcgYXBwbGljYXRpb25fdXdwLmgKLQotI2luY2x1ZGUgPGFnaWxlLmg+Ci0jaW5jbHVkZSA8cHBsdGFza3MuaD4KLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9rZXkuaCIKLQotbmFtZXNwYWNlIHN0YXJib2FyZCB7Ci1uYW1lc3BhY2Ugc2hhcmVkIHsKLW5hbWVzcGFjZSB1d3AgewotCi0vLyBSZXR1cm5zIHRoZSBtYWluIHdpbmRvdydzIENvcmVEaXNwYXRjaGVyLgotUGxhdGZvcm06OkFnaWxlPFdpbmRvd3M6OlVJOjpDb3JlOjpDb3JlRGlzcGF0Y2hlcj4gR2V0RGlzcGF0Y2hlcigpOwotCi0vLyBSZXR1cm5zIHRoZSBtYWluIHdpbmRvdydzIFN5c3RlbU1lZGlhVHJhbnNwb3J0Q29udHJvbHMuCi1QbGF0Zm9ybTo6QWdpbGU8V2luZG93czo6TWVkaWE6OlN5c3RlbU1lZGlhVHJhbnNwb3J0Q29udHJvbHM+Ci0gICAgR2V0VHJhbnNwb3J0Q29udHJvbHMoKTsKLQotLy8gQXNrcyB0aGUgc2NyZWVuIHRvIHJlbWFpbiBhY3RpdmUgdmlhCi0vLyBXaW5kb3dzOjpTeXN0ZW06OkRpc3BsYXlSZXF1ZXN0LT5SZXF1ZXN0QWN0aXZlKCkKLXZvaWQgRGlzcGxheVJlcXVlc3RBY3RpdmUoKTsKLQotLy8gUmVsZWFzZXMgcHJldmlvdXMgc2NyZWVuIGFjdGl2ZSByZXF1ZXN0IHZpYQotLy8gV2luZG93czo6U3lzdGVtOjpEaXNwbGF5UmVxdWVzdC0+UmVxdWVzdFJlbGVhc2UoKQotdm9pZCBEaXNwbGF5UmVxdWVzdFJlbGVhc2UoKTsKLQotLy8gU2NoZWR1bGVzIGEgbGFtYmRhIHRvIHJ1biBvbiB0aGUgbWFpbiB0aHJlYWQgYW5kIHJldHVybnMgaW1tZWRpYXRlbHkuCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotdm9pZCBSdW5Jbk1haW5UaHJlYWRBc3luYyhjb25zdCBUJiBsYW1iZGEpIHsKLSAgR2V0RGlzcGF0Y2hlcigpLT5SdW5Bc3luYygKLSAgICBXaW5kb3dzOjpVSTo6Q29yZTo6Q29yZURpc3BhdGNoZXJQcmlvcml0eTo6Tm9ybWFsLAotICAgIHJlZiBuZXcgV2luZG93czo6VUk6OkNvcmU6OkRpc3BhdGNoZWRIYW5kbGVyKGxhbWJkYSkpOwotfQotCi0vLyBUcmllcyB0byBmZXRjaCBhbiBTU08gdG9rZW4sIHJldHVybmluZyBudWxscHRyIG9yIGV4Y2VwdGlvbiBvbiBmYWlsdXJlCi1jb25jdXJyZW5jeTo6dGFzazwKLSAgICBXaW5kb3dzOjpTZWN1cml0eTo6QXV0aGVudGljYXRpb246OldlYjo6Q29yZTo6V2ViVG9rZW5SZXF1ZXN0UmVzdWx0Xj4KLSAgICBUcnlUb0ZldGNoU3NvVG9rZW4oY29uc3Qgc3RkOjpzdHJpbmcmIHVybCk7Ci0KLXZvaWQgSW5qZWN0S2V5cHJlc3MoU2JLZXkga2V5KTsKLQotfSAgLy8gbmFtZXNwYWNlIHV3cAotfSAgLy8gbmFtZXNwYWNlIHNoYXJlZAotfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZAotI2VuZGlmICAvLyBTVEFSQk9BUkRfU0hBUkVEX1VXUF9BUFBfQUNDRVNTT1JTX0hfCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC91d3AvYXBwbGljYXRpb25fdXdwLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL2FwcGxpY2F0aW9uX3V3cC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZkYThhMi4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC91d3AvYXBwbGljYXRpb25fdXdwLmNjCisrKyAvZGV2L251bGwKQEAgLTEsOTEyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3V3cC9hcHBsaWNhdGlvbl91d3AuaCIKLQotI2luY2x1ZGUgPEQzRDExLmg+Ci0jaW5jbHVkZSA8V2luU29jazIuaD4KLSNpbmNsdWRlIDxtZmFwaS5oPgotI2luY2x1ZGUgPHBwbHRhc2tzLmg+Ci0jaW5jbHVkZSA8d2luZG93cy5oPgotI2luY2x1ZGUgPHdpbmRvd3Muc3lzdGVtLmRpc3BsYXkuaD4KLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2V2ZW50LmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL2ZpbGUuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvaW5wdXQuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL211dGV4LmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvYXBwbGljYXRpb24uaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9hdWRpb19zaW5rL2F1ZGlvX3NpbmtfaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9uZXRfbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC91d3AvYW5hbG9nX3RodW1ic3RpY2tfaW5wdXRfdGhyZWFkLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC91d3AvYXBwX2FjY2Vzc29ycy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvdXdwL2FzeW5jX3V0aWxzLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC91d3AvbG9nX2ZpbGVfaW1wbC5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvdXdwL3dhdGNoZG9nX2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvdXdwL3dpbmRvd19pbnRlcm5hbC5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX3ByaXZhdGUuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3djaGFyX3V0aWxzLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3N0cmluZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zeXN0ZW0uaCIKLQotbmFtZXNwYWNlIHNidXdwID0gc3RhcmJvYXJkOjpzaGFyZWQ6OnV3cDsKLW5hbWVzcGFjZSBzYndpbjMyID0gc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOwotCi11c2luZyBNaWNyb3NvZnQ6OldSTDo6Q29tUHRyOwotdXNpbmcgc3RhcmJvYXJkOjpzaGFyZWQ6OnN0YXJib2FyZDo6QXBwbGljYXRpb247Ci11c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6c3RhcmJvYXJkOjpDb21tYW5kTGluZTsKLXVzaW5nIHN0YXJib2FyZDo6c2hhcmVkOjpzdGFyYm9hcmQ6OmtOZXRMb2dDb21tYW5kU3dpdGNoV2FpdDsKLXVzaW5nIHN0YXJib2FyZDo6c2hhcmVkOjpzdGFyYm9hcmQ6Ok5ldExvZ0ZsdXNoVGhlbkNsb3NlOwotdXNpbmcgc3RhcmJvYXJkOjpzaGFyZWQ6OnN0YXJib2FyZDo6TmV0TG9nV2FpdEZvckNsaWVudENvbm5lY3RlZDsKLXVzaW5nIHN0YXJib2FyZDo6c2hhcmVkOjp1d3A6OkFwcGxpY2F0aW9uVXdwOwotdXNpbmcgc3RhcmJvYXJkOjpzaGFyZWQ6OnV3cDo6UnVuSW5NYWluVGhyZWFkQXN5bmM7Ci11c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6dXdwOjpXYWl0Rm9yUmVzdWx0OwotdXNpbmcgc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOjpwbGF0Zm9ybVN0cmluZ1RvU3RyaW5nOwotdXNpbmcgc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOjpzdHJpbmdUb1BsYXRmb3JtU3RyaW5nOwotdXNpbmcgc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOjp3Y2hhcl90VG9VVEY4OwotdXNpbmcgV2luZG93czo6QXBwbGljYXRpb25Nb2RlbDo6QWN0aXZhdGlvbjo6QWN0aXZhdGlvbktpbmQ7Ci11c2luZyBXaW5kb3dzOjpBcHBsaWNhdGlvbk1vZGVsOjpBY3RpdmF0aW9uOjpEaWFsUmVjZWl2ZXJBY3RpdmF0ZWRFdmVudEFyZ3M7Ci11c2luZyBXaW5kb3dzOjpBcHBsaWNhdGlvbk1vZGVsOjpBY3RpdmF0aW9uOjpJQWN0aXZhdGVkRXZlbnRBcmdzOwotdXNpbmcgV2luZG93czo6QXBwbGljYXRpb25Nb2RlbDo6QWN0aXZhdGlvbjo6SVByb3RvY29sQWN0aXZhdGVkRXZlbnRBcmdzOwotdXNpbmcgV2luZG93czo6QXBwbGljYXRpb25Nb2RlbDo6Q29yZTo6Q29yZUFwcGxpY2F0aW9uOwotdXNpbmcgV2luZG93czo6QXBwbGljYXRpb25Nb2RlbDo6Q29yZTo6Q29yZUFwcGxpY2F0aW9uVmlldzsKLXVzaW5nIFdpbmRvd3M6OkFwcGxpY2F0aW9uTW9kZWw6OkNvcmU6OklGcmFtZXdvcmtWaWV3OwotdXNpbmcgV2luZG93czo6QXBwbGljYXRpb25Nb2RlbDo6Q29yZTo6SUZyYW1ld29ya1ZpZXdTb3VyY2U7Ci11c2luZyBXaW5kb3dzOjpBcHBsaWNhdGlvbk1vZGVsOjpTdXNwZW5kaW5nRXZlbnRBcmdzOwotdXNpbmcgV2luZG93czo6Rm91bmRhdGlvbjo6Q29sbGVjdGlvbnM6OklWZWN0b3JWaWV3OwotdXNpbmcgV2luZG93czo6Rm91bmRhdGlvbjo6RXZlbnRIYW5kbGVyOwotdXNpbmcgV2luZG93czo6Rm91bmRhdGlvbjo6SUFzeW5jT3BlcmF0aW9uOwotdXNpbmcgV2luZG93czo6Rm91bmRhdGlvbjo6TWV0YWRhdGE6OkFwaUluZm9ybWF0aW9uOwotdXNpbmcgV2luZG93czo6Rm91bmRhdGlvbjo6VGltZVNwYW47Ci11c2luZyBXaW5kb3dzOjpGb3VuZGF0aW9uOjpUeXBlZEV2ZW50SGFuZGxlcjsKLXVzaW5nIFdpbmRvd3M6OkZvdW5kYXRpb246OlVyaTsKLXVzaW5nIFdpbmRvd3M6OkdyYXBoaWNzOjpEaXNwbGF5OjpDb3JlOjpIZG1pRGlzcGxheUluZm9ybWF0aW9uOwotdXNpbmcgV2luZG93czo6R3JhcGhpY3M6OkRpc3BsYXk6OkRpc3BsYXlJbmZvcm1hdGlvbjsKLXVzaW5nIFdpbmRvd3M6Okdsb2JhbGl6YXRpb246OkNhbGVuZGFyOwotdXNpbmcgV2luZG93czo6TWVkaWE6OlByb3RlY3Rpb246OkhkY3BQcm90ZWN0aW9uOwotdXNpbmcgV2luZG93czo6TWVkaWE6OlByb3RlY3Rpb246OkhkY3BTZXNzaW9uOwotdXNpbmcgV2luZG93czo6TWVkaWE6OlByb3RlY3Rpb246OkhkY3BTZXRQcm90ZWN0aW9uUmVzdWx0OwotdXNpbmcgV2luZG93czo6U2VjdXJpdHk6OkF1dGhlbnRpY2F0aW9uOjpXZWI6OkNvcmU6OldlYlRva2VuUmVxdWVzdFJlc3VsdDsKLXVzaW5nIFdpbmRvd3M6OlNlY3VyaXR5OjpBdXRoZW50aWNhdGlvbjo6V2ViOjpDb3JlOjpXZWJUb2tlblJlcXVlc3RTdGF0dXM7Ci11c2luZyBXaW5kb3dzOjpTZWN1cml0eTo6Q3JlZGVudGlhbHM6OldlYkFjY291bnRQcm92aWRlcjsKLXVzaW5nIFdpbmRvd3M6OlN0b3JhZ2U6OkZpbGVBdHRyaWJ1dGVzOwotdXNpbmcgV2luZG93czo6U3RvcmFnZTo6S25vd25Gb2xkZXJzOwotdXNpbmcgV2luZG93czo6U3RvcmFnZTo6U3RvcmFnZUZvbGRlcjsKLXVzaW5nIFdpbmRvd3M6OlN0b3JhZ2U6OlN0b3JhZ2VGaWxlOwotdXNpbmcgV2luZG93czo6U3lzdGVtOjpUaHJlYWRpbmc6OlRocmVhZFBvb2xUaW1lcjsKLXVzaW5nIFdpbmRvd3M6OlN5c3RlbTo6VGhyZWFkaW5nOjpUaW1lckVsYXBzZWRIYW5kbGVyOwotdXNpbmcgV2luZG93czo6U3lzdGVtOjpVc2VyQXV0aGVudGljYXRpb25TdGF0dXM7Ci11c2luZyBXaW5kb3dzOjpVSTo6Q29yZTo6Q29yZURpc3BhdGNoZXJQcmlvcml0eTsKLXVzaW5nIFdpbmRvd3M6OlVJOjpDb3JlOjpDb3JlUHJvY2Vzc0V2ZW50c09wdGlvbjsKLXVzaW5nIFdpbmRvd3M6OlVJOjpDb3JlOjpDb3JlV2luZG93OwotdXNpbmcgV2luZG93czo6VUk6OkNvcmU6OkRpc3BhdGNoZWRIYW5kbGVyOwotdXNpbmcgV2luZG93czo6VUk6OkNvcmU6OktleUV2ZW50QXJnczsKLXVzaW5nIFdpbmRvd3M6OlVJOjpWaWV3TWFuYWdlbWVudDo6QXBwbGljYXRpb25WaWV3OwotCi1uYW1lc3BhY2UgewotCi0vLyBQZXIgTWljcm9zb2Z0LCBIZGNwUHJvdGVjdGlvbjo6T24gbWVhbnMgSERDUCAxLnggcmVxdWlyZWQuCi1jb25zdCBIZGNwUHJvdGVjdGlvbiBrSERDUFByb3RlY3Rpb25Nb2RlID0gSGRjcFByb3RlY3Rpb246Ok9uOwotCi1jb25zdCBpbnQga1dpblNvY2tWZXJzaW9uTWFqb3IgPSAyOwotY29uc3QgaW50IGtXaW5Tb2NrVmVyc2lvbk1pbm9yID0gMjsKLQotY29uc3QgY2hhciBrRGlhbFBhcmFtUHJlZml4W10gPSAiY29iYWx0LWRpYWw6PyI7Ci1jb25zdCBjaGFyIGtMb2dQYXRoU3dpdGNoW10gPSAieGIxX2xvZ19maWxlIjsKLS8vIEEgc3BlY2lhbCBsb2cgdGhhdCB0aGUgYXBwIHdpbGwgcGVyaW9kaWNhbGx5IHdyaXRlIHRvLiBUaGlzIGFsbG93cwotLy8gdGVzdHMgdG8gZGV0ZXJtaW5lIGlmIHRoZSBhcHAgaXMgc3RpbGwgYWxpdmUuCi1jb25zdCBjaGFyIGtXYXRjaERvZ0xvZ1tdID0gInhiMV93YXRjaGRvZ19sb2ciOwotY29uc3QgY2hhciBrU3RhcmJvYXJkQXJndW1lbnRzUGF0aFtdID0gImFyZ3VtZW50c1xcc3RhcmJvYXJkX2FyZ3VtZW50cy50eHQiOwotY29uc3QgaW50NjRfdCBrTWF4QXJndW1lbnRGaWxlU2l6ZUJ5dGVzID0gNCAqIDEwMjQgKiAxMDI0OwotCi1pbnQgbWFpbl9yZXR1cm5fdmFsdWUgPSAwOwotCi0vLyBJRGlzcGxheVJlcXVlc3QgaXMgYm90aCAibm9uLWFnaWxlIiBhbmQgYXBwYXJlbnRseQotLy8gaW5jb21wYXRpYmxlIHdpdGggUGxhdGZvcm06OkFnaWxlIChpdCBkb2Vzbid0IGZ1bGx5IGltcGxlbWVudAotLy8gYSB0aHJlYWQgbWFyc2hhbGxlcikuIFdlIG11c3QgbmVpdGhlciB1c2UgQ29tUHRyIG9yIFBsYXRmb3JtOjpBZ2lsZQotLy8gaGVyZS4gV2UgbWFudWFsbHkgY3JlYXRlLCBhY2Nlc3MgcmVsZWFzZSBvbiB0aGUgbWFpbiBhcHAgdGhyZWFkIG9ubHkuCi1BQkk6OldpbmRvd3M6OlN5c3RlbTo6RGlzcGxheTo6SURpc3BsYXlSZXF1ZXN0KiBkaXNwbGF5X3JlcXVlc3QgPSBudWxscHRyOwotCi0vLyBJZiBhbiBhcmd2WzBdIGlzIHJlcXVpcmVkLCBmaWxsIGl0IGluIHdpdGggdGhlIHJlc3VsdCBvZgotLy8gR2V0TW9kdWxlRmlsZU5hbWUoKQotc3RkOjpzdHJpbmcgR2V0QXJndlplcm8oKSB7Ci0gIGNvbnN0IHNpemVfdCBrTWF4TW9kdWxlTmFtZVNpemUgPSBTQl9GSUxFX01BWF9OQU1FOwotICB3Y2hhcl90IGJ1ZmZlcltrTWF4TW9kdWxlTmFtZVNpemVdOwotICBEV09SRCByZXN1bHQgPSBHZXRNb2R1bGVGaWxlTmFtZShOVUxMLCBidWZmZXIsIGtNYXhNb2R1bGVOYW1lU2l6ZSk7Ci0gIHN0ZDo6c3RyaW5nIGFyZzsKLSAgaWYgKHJlc3VsdCA9PSAwKSB7Ci0gICAgYXJnID0gInVua25vd24iOwotICB9IGVsc2UgewotICAgIGFyZyA9IHdjaGFyX3RUb1VURjgoYnVmZmVyLCByZXN1bHQpLmNfc3RyKCk7Ci0gIH0KLSAgcmV0dXJuIGFyZzsKLX0KLQotaW50IE1ha2VEZXZpY2VJZCgpIHsKLSAgLy8gVE9ETzogRGV2aWNlcyBNSUdIVCBoYXZlIGNvbGxpZGluZyBoYXNoY29kZXMuIFNvbWUgb3RoZXIgdW5pcXVlIGludAotICAvLyBJRCBnZW5lcmF0aW9uIHRvb2wgd291bGQgYmUgYmV0dGVyLgotICB1c2luZyBXaW5kb3dzOjpTZWN1cml0eTo6RXhjaGFuZ2VBY3RpdmVTeW5jUHJvdmlzaW9uaW5nOjoKLSAgICAgIEVhc0NsaWVudERldmljZUluZm9ybWF0aW9uOwotICBhdXRvIGRldmljZV9pbmZvcm1hdGlvbiA9IHJlZiBuZXcgRWFzQ2xpZW50RGV2aWNlSW5mb3JtYXRpb24oKTsKLSAgUGxhdGZvcm06OlN0cmluZyBeIGRldmljZV9pZF9zdHJpbmcgPSBkZXZpY2VfaW5mb3JtYXRpb24tPklkLlRvU3RyaW5nKCk7Ci0gIHJldHVybiBkZXZpY2VfaWRfc3RyaW5nLT5HZXRIYXNoQ29kZSgpOwotfQotCi0jaWYgZGVmaW5lZChFTkFCTEVfREVCVUdfQ09NTUFORF9MSU5FX1NXSVRDSEVTKQotCi12b2lkIFNwbGl0QXJndW1lbnRzSW50b1ZlY3RvcihzdGQ6OnN0cmluZyogYXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAqcmVzdWx0KSB7Ci0gIFNCX0RDSEVDSyhhcmdzKTsKLSAgU0JfRENIRUNLKHJlc3VsdCk7Ci0gIHdoaWxlICghYXJncy0+ZW1wdHkoKSkgewotICAgIHNpemVfdCBuZXh0ID0gYXJncy0+ZmluZCgnOycpOwotICAgIHJlc3VsdC0+cHVzaF9iYWNrKGFyZ3MtPnN1YnN0cigwLCBuZXh0KSk7Ci0gICAgaWYgKG5leHQgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgKmFyZ3MgPSBhcmdzLT5zdWJzdHIobmV4dCArIDEpOwotICB9Ci19Ci0KLS8vIFBhcnNlcyBhIHN0YXJib2FyZDogVVJJIHNjaGVtZSBieSBzcGxpdHRpbmcgYXJncyBhdCAnOycgYm91bmRhcmllcy4KLXN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBQYXJzZVN0YXJib2FyZFVyaShjb25zdCBzdGQ6OnN0cmluZyYgdXJpKSB7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiByZXN1bHQ7Ci0gIHJlc3VsdC5wdXNoX2JhY2soR2V0QXJndlplcm8oKSk7Ci0KLSAgc2l6ZV90IGluZGV4ID0gdXJpLmZpbmQoJzonKTsKLSAgaWYgKGluZGV4ID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIGFyZ3MgPSB1cmkuc3Vic3RyKGluZGV4ICsgMSk7Ci0gIFNwbGl0QXJndW1lbnRzSW50b1ZlY3RvcigmYXJncywgJnJlc3VsdCk7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdm9pZCBBZGRBcmd1bWVudHNGcm9tRmlsZShjb25zdCBjaGFyKiBwYXRoLAotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIGFyZ3MpIHsKLSAgc3RhcmJvYXJkOjpTY29wZWRGaWxlIGZpbGUocGF0aCwga1NiRmlsZU9wZW5Pbmx5IHwga1NiRmlsZVJlYWQpOwotICBpZiAoIWZpbGUuSXNWYWxpZCgpKSB7Ci0gICAgU0JfTE9HKElORk8pIDw8IHBhdGggPDwgIiBpcyBub3QgdmFsaWQgZm9yIGFyZ3VtZW50cy4iOwotICAgIHJldHVybjsKLSAgfQotCi0gIGludDY0X3QgZmlsZV9zaXplID0gZmlsZS5HZXRTaXplKCk7Ci0gIGlmIChmaWxlX3NpemUgPiBrTWF4QXJndW1lbnRGaWxlU2l6ZUJ5dGVzKSB7Ci0gICAgU0JfRExPRyhFUlJPUikgPDwgIlRoZSBhcmd1bWVudHMgZmlsZSBpcyB0b28gYmlnLiI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKGZpbGVfc2l6ZSA8PSAwKSB7Ci0gICAgU0JfRExPRyhJTkZPKSA8PCAiQXJndW1lbnRzIGZpbGUgaXMgZW1wdHkuIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBhcmd1bWVudF9zdHJpbmcoZmlsZV9zaXplLCAnXDAnKTsKLSAgaW50IHJldHVybl92YWx1ZSA9IGZpbGUuUmVhZEFsbCgmYXJndW1lbnRfc3RyaW5nWzBdLCBmaWxlX3NpemUpOwotICBpZiAocmV0dXJuX3ZhbHVlIDwgMCkgewotICAgIFNCX0RMT0coRVJST1IpIDw8ICJFcnJvciB3aGlsZSByZWFkaW5nIGFyZ3VtZW50cyBmcm9tIGZpbGUuIjsKLSAgICByZXR1cm47Ci0gIH0KLSAgYXJndW1lbnRfc3RyaW5nLnJlc2l6ZShyZXR1cm5fdmFsdWUpOwotCi0gIFNwbGl0QXJndW1lbnRzSW50b1ZlY3RvcigmYXJndW1lbnRfc3RyaW5nLCBhcmdzKTsKLX0KLQotI2VuZGlmICAvLyBkZWZpbmVkKEVOQUJMRV9ERUJVR19DT01NQU5EX0xJTkVfU1dJVENIRVMpCi0KLXN0ZDo6dW5pcXVlX3B0cjxBcHBsaWNhdGlvbjo6RXZlbnQ+IE1ha2VEZWVwTGlua0V2ZW50KAotICBjb25zdCBzdGQ6OnN0cmluZyYgdXJpX3N0cmluZykgewotICBTQl9MT0coSU5GTykgPDwgIk5hdmlnYXRlIHRvOiBbIiA8PCB1cmlfc3RyaW5nIDw8ICJdIjsKLSAgY29uc3Qgc2l6ZV90IGtNYXhEZWVwTGlua1NpemUgPSAxMjggKiAxMDI0OwotICBjb25zdCBzdGQ6OnNpemVfdCB1cmlfc2l6ZSA9IHVyaV9zdHJpbmcuc2l6ZSgpOwotICBpZiAodXJpX3NpemUgPiBrTWF4RGVlcExpbmtTaXplKSB7Ci0gICAgU0JfTk9UUkVBQ0hFRCgpIDw8ICJBcHAgbGF1bmNoIGRhdGEgdG9vIGJpZzogIiA8PCB1cmlfc2l6ZTsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotCi0gIGNvbnN0IGludCBrQnVmZmVyU2l6ZSA9IHN0YXRpY19jYXN0PGludD4odXJpX3N0cmluZy5zaXplKCkpICsgMTsKLSAgY2hhciogZGVlcF9saW5rID0gbmV3IGNoYXJba0J1ZmZlclNpemVdOwotICBTQl9EQ0hFQ0soZGVlcF9saW5rKTsKLSAgU2JTdHJpbmdDb3B5KGRlZXBfbGluaywgdXJpX3N0cmluZy5jX3N0cigpLCBrQnVmZmVyU2l6ZSk7Ci0KLSAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxBcHBsaWNhdGlvbjo6RXZlbnQ+KAotICAgICAgbmV3IEFwcGxpY2F0aW9uOjpFdmVudChrU2JFdmVudFR5cGVMaW5rLCBkZWVwX2xpbmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcGxpY2F0aW9uOjpEZWxldGVBcnJheURlc3RydWN0b3I8Y29uc3QgY2hhcio+KSk7Ci19Ci0KLS8vIFJldHVybnMgaWYgfGZ1bGxfc3RyaW5nfCBlbmRzIHdpdGggfHN1YnN0cmluZ3wuCi1ib29sIGVuZHNfd2l0aChjb25zdCBzdGQ6OnN0cmluZyYgZnVsbF9zdHJpbmcsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWJzdHJpbmcpIHsKLSAgaWYgKHN1YnN0cmluZy5sZW5ndGgoKSA+IGZ1bGxfc3RyaW5nLmxlbmd0aCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiBzdGQ6OmVxdWFsKHN1YnN0cmluZy5yYmVnaW4oKSwgc3Vic3RyaW5nLnJlbmQoKSwgZnVsbF9zdHJpbmcucmJlZ2luKCkpOwotfQotCi1zdGQ6OnN0cmluZyBHZXRCaW5hcnlOYW1lKCkgewotICBzdGQ6OnN0cmluZyBmdWxsX2JpbmFyeV9wYXRoID0gR2V0QXJndlplcm8oKTsKLSAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBpbmRleCA9IGZ1bGxfYmluYXJ5X3BhdGgucmZpbmQoU0JfRklMRV9TRVBfQ0hBUik7Ci0gIGlmIChpbmRleCA9PSBzdGQ6OnN0cmluZzo6bnBvcykgewotICAgIHJldHVybiBmdWxsX2JpbmFyeV9wYXRoOwotICB9Ci0KLSAgcmV0dXJuIGZ1bGxfYmluYXJ5X3BhdGguc3Vic3RyKGluZGV4ICsgMSk7Ci19Ci19ICAvLyBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIHN0YXJib2FyZCB7Ci1uYW1lc3BhY2Ugc2hhcmVkIHsKLW5hbWVzcGFjZSB3aW4zMiB7Ci0vLyBDYWxsZWQgaW50byBkcm1fc3lzdGVtX3BsYXlyZWFkeS5jYwotZXh0ZXJuIHZvaWQgRHJtU3lzdGVtT25Vd3BSZXN1bWUoKTsKLX0gIC8vIG5hbWVzcGFjZSB3aW4zMgotfSAgLy8gbmFtZXNwYWNlIHNoYXJlZAotfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZAotCi1yZWYgY2xhc3MgQXBwIHNlYWxlZCA6IHB1YmxpYyBJRnJhbWV3b3JrVmlldyB7Ci0gcHVibGljOgotICBBcHAoKSA6IHByZXZpb3VzbHlfYWN0aXZhdGVkXyhmYWxzZSkge30KLQotICAvLyBJRnJhbWV3b3JrVmlldyBtZXRob2RzLgotICB2aXJ0dWFsIHZvaWQgSW5pdGlhbGl6ZShDb3JlQXBwbGljYXRpb25WaWV3XiBhcHBsaWNhdGlvbl92aWV3KSB7Ci0gICAgLy8gVGhlIGZvbGxvd2luZyBpbmNhbnRhdGlvbiBjcmVhdGVzIGEgRGlzcGxheVJlcXVlc3QgYW5kIG9idGFpbnMKLSAgICAvLyBpdCdzIHVuZGVybHlpbmcgQ09NIGludGVyZmFjZS4KLSAgICBDb21QdHI8SUluc3BlY3RhYmxlPiBpbnNwZWN0YWJsZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8SUluc3BlY3RhYmxlKj4oCi0gICAgICAgIHJlZiBuZXcgV2luZG93czo6U3lzdGVtOjpEaXNwbGF5OjpEaXNwbGF5UmVxdWVzdCgpKTsKLSAgICBDb21QdHI8QUJJOjpXaW5kb3dzOjpTeXN0ZW06OkRpc3BsYXk6OklEaXNwbGF5UmVxdWVzdD4gZHI7Ci0gICAgaW5zcGVjdGFibGUuQXMoJmRyKTsKLSAgICBkaXNwbGF5X3JlcXVlc3QgPSBkci5EZXRhY2goKTsKLQotICAgIFNiQXVkaW9TaW5rUHJpdmF0ZTo6SW5pdGlhbGl6ZSgpOwotICAgIENvcmVBcHBsaWNhdGlvbjo6U3VzcGVuZGluZyArPQotICAgICAgICByZWYgbmV3IEV2ZW50SGFuZGxlcjxTdXNwZW5kaW5nRXZlbnRBcmdzXj4odGhpcywgJkFwcDo6T25TdXNwZW5kaW5nKTsKLSAgICBDb3JlQXBwbGljYXRpb246OlJlc3VtaW5nICs9Ci0gICAgICAgIHJlZiBuZXcgRXZlbnRIYW5kbGVyPE9iamVjdF4+KHRoaXMsICZBcHA6Ok9uUmVzdW1pbmcpOwotICAgIGFwcGxpY2F0aW9uX3ZpZXctPkFjdGl2YXRlZCArPQotICAgICAgICByZWYgbmV3IFR5cGVkRXZlbnRIYW5kbGVyPENvcmVBcHBsaWNhdGlvblZpZXdeLCBJQWN0aXZhdGVkRXZlbnRBcmdzXj4oCi0gICAgICAgICAgICB0aGlzLCAmQXBwOjpPbkFjdGl2YXRlZCk7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgU2V0V2luZG93KENvcmVXaW5kb3deIHdpbmRvdykgewotICAgIEFwcGxpY2F0aW9uVXdwOjpHZXQoKS0+U2V0Q29yZVdpbmRvdyh3aW5kb3cpOwotICAgIHdpbmRvdy0+S2V5VXAgKz0gcmVmIG5ldyBUeXBlZEV2ZW50SGFuZGxlcjxDb3JlV2luZG93XiwgS2V5RXZlbnRBcmdzXj4oCi0gICAgICB0aGlzLCAmQXBwOjpPbktleVVwKTsKLSAgICB3aW5kb3ctPktleURvd24gKz0gcmVmIG5ldyBUeXBlZEV2ZW50SGFuZGxlcjxDb3JlV2luZG93XiwgS2V5RXZlbnRBcmdzXj4oCi0gICAgICB0aGlzLCAmQXBwOjpPbktleURvd24pOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIExvYWQoUGxhdGZvcm06OlN0cmluZ14gZW50cnlfcG9pbnQpIHsKLSAgICBlbnRyeV9wb2ludF8gPSB3Y2hhcl90VG9VVEY4KGVudHJ5X3BvaW50LT5EYXRhKCkpOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIFJ1bigpIHsKLSAgICBtYWluX3JldHVybl92YWx1ZSA9IGFwcGxpY2F0aW9uXy5SdW4oCi0gICAgICAgIHN0YXRpY19jYXN0PGludD4oYXJndl8uc2l6ZSgpKSwgY29uc3RfY2FzdDxjaGFyKio+KGFyZ3ZfLmRhdGEoKSkpOwotICB9Ci0gIHZpcnR1YWwgdm9pZCBVbmluaXRpYWxpemUoKSB7Ci0gICAgU2JBdWRpb1NpbmtQcml2YXRlOjpUZWFyRG93bigpOwotICAgIGRpc3BsYXlfcmVxdWVzdC0+UmVsZWFzZSgpOwotICAgIGRpc3BsYXlfcmVxdWVzdCA9IG51bGxwdHI7Ci0gIH0KLQotICB2b2lkIE9uU3VzcGVuZGluZyhQbGF0Zm9ybTo6T2JqZWN0XiBzZW5kZXIsIFN1c3BlbmRpbmdFdmVudEFyZ3NeIGFyZ3MpIHsKLSAgICBTQl9ETE9HKElORk8pIDw8ICJTdXNwZW5kaW5nIGFwcGxpY2F0aW9uLiI7Ci0gICAgLy8gTm90ZSBpZiB3ZSBkaXNwYXRjaCAic3VzcGVuZCIgaGVyZSBiZWZvcmUgcGF1c2UsIGFwcGxpY2F0aW9uLmNjCi0gICAgLy8gd2lsbCBpbmplY3QgdGhlICJwYXVzZSIgd2hpY2ggd2lsbCBjYXVzZSB1cyB0byBnbyBhc3luYyB3aGljaAotICAgIC8vIHdpbGwgY2F1c2UgdXMgdG8gbm90IGhhdmUgY29tcGxldGVkIHRoZSBzdXNwZW5kIG9wZXJhdGlvbiBiZWZvcmUKLSAgICAvLyByZXR1cm5pbmcsIHdoaWNoIFVXUCByZXF1aXJlcy4KLSAgICBBcHBsaWNhdGlvblV3cDo6R2V0KCktPkRpc3BhdGNoQW5kRGVsZXRlKAotICAgICAgICBuZXcgQXBwbGljYXRpb25Vd3A6OkV2ZW50KGtTYkV2ZW50VHlwZVBhdXNlLCBOVUxMLCBOVUxMKSk7Ci0gICAgQXBwbGljYXRpb25Vd3A6OkdldCgpLT5EaXNwYXRjaEFuZERlbGV0ZSgKLSAgICAgICAgbmV3IEFwcGxpY2F0aW9uVXdwOjpFdmVudChrU2JFdmVudFR5cGVTdXNwZW5kLCBOVUxMLCBOVUxMKSk7Ci0gIH0KLQotICB2b2lkIE9uUmVzdW1pbmcoUGxhdGZvcm06Ok9iamVjdF4gc2VuZGVyLCBQbGF0Zm9ybTo6T2JqZWN0XiBhcmdzKSB7Ci0gICAgU0JfRExPRyhJTkZPKSA8PCAiUmVzdW1pbmciOwotICAgIEFwcGxpY2F0aW9uVXdwOjpHZXQoKS0+RGlzcGF0Y2hBbmREZWxldGUoCi0gICAgICAgIG5ldyBBcHBsaWNhdGlvblV3cDo6RXZlbnQoa1NiRXZlbnRUeXBlUmVzdW1lLCBOVUxMLCBOVUxMKSk7Ci0gICAgQXBwbGljYXRpb25Vd3A6OkdldCgpLT5EaXNwYXRjaEFuZERlbGV0ZSgKLSAgICAgICAgbmV3IEFwcGxpY2F0aW9uVXdwOjpFdmVudChrU2JFdmVudFR5cGVVbnBhdXNlLCBOVUxMLCBOVUxMKSk7Ci0gICAgc2J3aW4zMjo6RHJtU3lzdGVtT25Vd3BSZXN1bWUoKTsKLSAgfQotCi0gIHZvaWQgT25LZXlVcChDb3JlV2luZG93XiBzZW5kZXIsIEtleUV2ZW50QXJnc14gYXJncykgewotICAgIEFwcGxpY2F0aW9uVXdwOjpHZXQoKS0+T25LZXlFdmVudChzZW5kZXIsIGFyZ3MsIHRydWUpOwotICB9Ci0KLSAgdm9pZCBPbktleURvd24oQ29yZVdpbmRvd14gc2VuZGVyLCBLZXlFdmVudEFyZ3NeIGFyZ3MpIHsKLSAgICBBcHBsaWNhdGlvblV3cDo6R2V0KCktPk9uS2V5RXZlbnQoc2VuZGVyLCBhcmdzLCBmYWxzZSk7Ci0gIH0KLQotICB2b2lkIE9uQWN0aXZhdGVkKAotICAgICAgQ29yZUFwcGxpY2F0aW9uVmlld14gYXBwbGljYXRpb25fdmlldywgSUFjdGl2YXRlZEV2ZW50QXJnc14gYXJncykgewotICAgIFNCX0xPRyhJTkZPKSA8PCAiT25BY3RpdmF0ZWQiOwotICAgIEFwcGxpY2F0aW9uVXdwKiBhcHBsaWNhdGlvbl91d3AgPSBBcHBsaWNhdGlvblV3cDo6R2V0KCk7Ci0gICAgTWljcm9zb2Z0OjpXUkw6OkNvbVB0cjxJRDNEMTJEZXZpY2U+IGRldmljZTsKLSAgICBIUkVTVUxUIGhyID0KLSAgICAgICAgRDNEMTJDcmVhdGVEZXZpY2UoTlVMTCwgRDNEX0ZFQVRVUkVfTEVWRUxfMTFfMCwgSUlEX1BQVl9BUkdTKCZkZXZpY2UpKTsKLSAgICBTQl9EQ0hFQ0soU1VDQ0VFREVEKGhyKSk7Ci0gICAgYXBwbGljYXRpb25fdXdwLT5TZXREM0QxMkRldmljZShkZXZpY2UpOwotICAgIHN0ZDo6c3RyaW5nIHN0YXJ0X3VybCA9IGVudHJ5X3BvaW50XzsKLSAgICBib29sIGNvbW1hbmRfbGluZV9zZXQgPSBmYWxzZTsKLQotICAgIC8vIFBsZWFzZSBzZWUgYXBwbGljYXRpb24gbGlmZWN5bGUgZGVzY3JpcHRpb246Ci0gICAgLy8gaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvd2luZG93cy91d3AvbGF1bmNoLXJlc3VtZS9hcHAtbGlmZWN5Y2xlCi0gICAgLy8gTm90ZSB0aGF0IHRoaXMgZG9jdW1lbnQgd2FzIHdyaXR0ZW4gZm9yIFhhbWwgYXBwcyBub3QgY29yZSBhcHBzLAotICAgIC8vIHNvIGZvciB1cyB0aGUgcHJlY2lzZSBBUEkgaXMgYSBsaXR0bGUgZGlmZmVyZW50LgotICAgIC8vIFRoZSBzdWJzdGFuY2UgaXMgdGhhdCwgd2hpbGUgT25BY3RpdmlhdGVkIGlzIGRlZmluaXRlbHkgY2FsbGVkIHRoZQotICAgIC8vIGZpcnN0IHRpbWUgdGhlIGFwcGxpY2F0aW9uIGlzIHN0YXJ0ZWQsIGl0IG1heSBhZGRpdGlvbmFsbHkgY2FsbGVkCi0gICAgLy8gaW4gb3RoZXIgY2FzZXMgd2hpbGUgdGhlIHByb2Nlc3MgaXMgYWxyZWFkeSBydW5uaW5nLiBTdGFyYm9hcmQKLSAgICAvLyBhcHBsaWNhdGlvbnMgY2Fubm90IGZ1bGx5IHJlc3RhcnQgaW4gYSBwcm9jZXNzIGxpZmVjeWNsZSwKLSAgICAvLyBzbyB3ZSBpbnRlcnByZXQgdGhlIGZpcnN0IGFjdGl2YXRpb24gYW5kIHRoZSBzdWJzZXF1ZW50IG9uZXMgZGlmZmVyZW50bHkuCi0gICAgaWYgKGFyZ3MtPktpbmQgPT0gQWN0aXZhdGlvbktpbmQ6OlByb3RvY29sKSB7Ci0gICAgICBVcmleIHVyaSA9IGR5bmFtaWNfY2FzdDxJUHJvdG9jb2xBY3RpdmF0ZWRFdmVudEFyZ3NePihhcmdzKS0+VXJpOwotCi0jaWYgZGVmaW5lZChFTkFCTEVfREVCVUdfQ09NTUFORF9MSU5FX1NXSVRDSEVTKQotICAgICAgLy8gVGhlIHN0YXJib2FyZDogc2NoZW1lIHByb3ZpZGVzIGNvbW1hbmRsaW5lIGFyZ3VtZW50cywgYnV0IHRoYXQncwotICAgICAgLy8gb25seSBhbGxvd2VkIGR1cmluZyBhIHByb2Nlc3MncyBmaXJzdCBhY3RpdmF0aW9uLgotICAgICAgc3RkOjpzdHJpbmcgc2NoZW1lID0gc2J3aW4zMjo6cGxhdGZvcm1TdHJpbmdUb1N0cmluZyh1cmktPlNjaGVtZU5hbWUpOwotICAgICAgaWYgKCFwcmV2aW91c2x5X2FjdGl2YXRlZF8gJiYgZW5kc193aXRoKHNjaGVtZSwgIi1zdGFyYm9hcmQiKSkgewotICAgICAgICBzdGQ6OnN0cmluZyB1cmlfc3RyaW5nID0gd2NoYXJfdFRvVVRGOCh1cmktPlJhd1VyaS0+RGF0YSgpKTsKLSAgICAgICAgLy8gYXJnc18gaXMgYSB2ZWN0b3Igb2Ygc3RkOjpzdHJpbmcsIGJ1dCBhcmd2XyBpcyBhIHZlY3RvciBvZgotICAgICAgICAvLyBjaGFyKiBpbnRvIGFyZ3NfIHNvIGFzIHRvIGNvbXBvc2UgYSBjaGFyKiouCi0gICAgICAgIGFyZ3NfID0gUGFyc2VTdGFyYm9hcmRVcmkodXJpX3N0cmluZyk7Ci0gICAgICAgIGZvciAoY29uc3Qgc3RkOjpzdHJpbmcmIGFyZyA6IGFyZ3NfKSB7Ci0gICAgICAgICAgYXJndl8ucHVzaF9iYWNrKGFyZy5jX3N0cigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEFwcGxpY2F0aW9uVXdwOjpHZXQoKS0+U2V0Q29tbWFuZExpbmUoCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGFyZ3ZfLnNpemUoKSksIGFyZ3ZfLmRhdGEoKSk7Ci0gICAgICAgIGNvbW1hbmRfbGluZV9zZXQgPSB0cnVlOwotICAgICAgfQotI2VuZGlmICAvLyBkZWZpbmVkKEVOQUJMRV9ERUJVR19DT01NQU5EX0xJTkVfU1dJVENIRVMpCi0gICAgICBpZiAodXJpLT5TY2hlbWVOYW1lLT5FcXVhbHMoInlvdXR1YmUiKSB8fAotICAgICAgICAgIHVyaS0+U2NoZW1lTmFtZS0+RXF1YWxzKCJtcy14YmwtMDc0NTk3NjkiKSkgewotICAgICAgICBzdGQ6OnN0cmluZyB1cmlfc3RyaW5nID0gc2J3aW4zMjo6cGxhdGZvcm1TdHJpbmdUb1N0cmluZyh1cmktPlJhd1VyaSk7Ci0KLSAgICAgICAgLy8gU3RyaXAgdGhlIHByb3RvY29sIGZyb20gdGhlIHVyaS4KLSAgICAgICAgc2l6ZV90IGluZGV4ID0gdXJpX3N0cmluZy5maW5kKCc6Jyk7Ci0gICAgICAgIGlmIChpbmRleCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewotICAgICAgICAgIHVyaV9zdHJpbmcgPSB1cmlfc3RyaW5nLnN1YnN0cihpbmRleCArIDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgUHJvY2Vzc0RlZXBMaW5rVXJpKCZ1cmlfc3RyaW5nKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGFyZ3MtPktpbmQgPT0gQWN0aXZhdGlvbktpbmQ6OkRpYWxSZWNlaXZlcikgewotICAgICAgRGlhbFJlY2VpdmVyQWN0aXZhdGVkRXZlbnRBcmdzXiBkaWFsX2FyZ3MgPQotICAgICAgICAgIGR5bmFtaWNfY2FzdDxEaWFsUmVjZWl2ZXJBY3RpdmF0ZWRFdmVudEFyZ3NePihhcmdzKTsKLSAgICAgIFNCX0NIRUNLKGRpYWxfYXJncyk7Ci0gICAgICBQbGF0Zm9ybTo6U3RyaW5nXiBhcmd1bWVudHMgPSBkaWFsX2FyZ3MtPkFyZ3VtZW50czsKLSAgICAgIGlmIChwcmV2aW91c2x5X2FjdGl2YXRlZF8pIHsKLSAgICAgICAgc3RkOjpzdHJpbmcgdXJpX3N0cmluZyA9Ci0gICAgICAgICAga0RpYWxQYXJhbVByZWZpeCArIHNid2luMzI6OnBsYXRmb3JtU3RyaW5nVG9TdHJpbmcoYXJndW1lbnRzKTsKLSAgICAgICAgUHJvY2Vzc0RlZXBMaW5rVXJpKCZ1cmlfc3RyaW5nKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIGFjdGl2YXRpb25fYXJncyA9ICItLXVybD0iOwotICAgICAgICBhY3RpdmF0aW9uX2FyZ3MuYXBwZW5kKHN0YXJ0X3VybCk7Ci0gICAgICAgIGFjdGl2YXRpb25fYXJncy5hcHBlbmQoIj8iKTsKLSAgICAgICAgYWN0aXZhdGlvbl9hcmdzLmFwcGVuZChzYndpbjMyOjpwbGF0Zm9ybVN0cmluZ1RvU3RyaW5nKGFyZ3VtZW50cykpOwotICAgICAgICBTQl9ETE9HKElORk8pIDw8ICJEaWFsIEFjdGl2YXRpb24gdXJsOiAiIDw8IGFjdGl2YXRpb25fYXJnczsKLSAgICAgICAgYXJnc18ucHVzaF9iYWNrKEdldEFyZ3ZaZXJvKCkpOwotICAgICAgICBhcmdzXy5wdXNoX2JhY2soYWN0aXZhdGlvbl9hcmdzKTsKLSAgICAgICAgLy8gU2V0IHBhcnRpdGlvbiBVUkwgaW4gY2FzZSBzdGFydF91cmwgaXMgdGhlIG1haW4gYXBwIGZpcnN0IHJ1bgotICAgICAgICAvLyBzcGVjaWFsIGNhc2UuCi0gICAgICAgIHN0ZDo6c3RyaW5nIHBhcnRpdGlvbl9hcmcgPSAiLS1sb2NhbF9zdG9yYWdlX3BhcnRpdGlvbl91cmw9IjsKLSAgICAgICAgcGFydGl0aW9uX2FyZy5hcHBlbmQoZW50cnlfcG9pbnRfKTsKLSAgICAgICAgYXJnc18ucHVzaF9iYWNrKHBhcnRpdGlvbl9hcmcpOwotICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c3RyaW5nJiBhcmcgOiBhcmdzXykgewotICAgICAgICAgIGFyZ3ZfLnB1c2hfYmFjayhhcmcuY19zdHIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgQXBwbGljYXRpb25Vd3A6OkdldCgpLT5TZXRDb21tYW5kTGluZShzdGF0aWNfY2FzdDxpbnQ+KGFyZ3ZfLnNpemUoKSksCi0gICAgICAgICAgYXJndl8uZGF0YSgpKTsKLSAgICAgICAgY29tbWFuZF9saW5lX3NldCA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIHByZXZpb3VzX2FjdGl2YXRpb25fa2luZF8gPSBhcmdzLT5LaW5kOwotCi0gICAgaWYgKCFwcmV2aW91c2x5X2FjdGl2YXRlZF8pIHsKLSAgICAgIGlmICghY29tbWFuZF9saW5lX3NldCkgewotICAgICAgICBhcmdzXy5wdXNoX2JhY2soR2V0QXJndlplcm8oKSk7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIHN0YXJ0X3VybF9hcmcgPSAiLS11cmw9IjsKLSAgICAgICAgc3RhcnRfdXJsX2FyZy5hcHBlbmQoc3RhcnRfdXJsKTsKLSAgICAgICAgYXJnc18ucHVzaF9iYWNrKHN0YXJ0X3VybF9hcmcpOwotICAgICAgICBzdGQ6OnN0cmluZyBwYXJ0aXRpb25fYXJnID0gIi0tbG9jYWxfc3RvcmFnZV9wYXJ0aXRpb25fdXJsPSI7Ci0gICAgICAgIHBhcnRpdGlvbl9hcmcuYXBwZW5kKGVudHJ5X3BvaW50Xyk7Ci0gICAgICAgIGFyZ3NfLnB1c2hfYmFjayhwYXJ0aXRpb25fYXJnKTsKLQotI2lmIGRlZmluZWQoRU5BQkxFX0RFQlVHX0NPTU1BTkRfTElORV9TV0lUQ0hFUykKLSAgICAgICAgY2hhciBjb250ZW50X2RpcmVjdG9yeVtTQl9GSUxFX01BWF9OQU1FXTsKLSAgICAgICAgY29udGVudF9kaXJlY3RvcnlbMF0gPSAnXDAnOwotICAgICAgICBpZiAoU2JTeXN0ZW1HZXRQYXRoKGtTYlN5c3RlbVBhdGhDb250ZW50RGlyZWN0b3J5LCBjb250ZW50X2RpcmVjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQl9BUlJBWV9TSVpFX0lOVChjb250ZW50X2RpcmVjdG9yeSkpKSB7Ci0gICAgICAgICAgc3RkOjpzdHJpbmcgYXJndW1lbnRzX2ZpbGVfcGF0aCA9IGNvbnRlbnRfZGlyZWN0b3J5OwotICAgICAgICAgIGFyZ3VtZW50c19maWxlX3BhdGggKz0gU0JfRklMRV9TRVBfU1RSSU5HOwotICAgICAgICAgIGFyZ3VtZW50c19maWxlX3BhdGggKz0ga1N0YXJib2FyZEFyZ3VtZW50c1BhdGg7Ci0gICAgICAgICAgQWRkQXJndW1lbnRzRnJvbUZpbGUoYXJndW1lbnRzX2ZpbGVfcGF0aC5jX3N0cigpLCAmYXJnc18pOwotICAgICAgICB9Ci0jZW5kaWYgIC8vIGRlZmluZWQoRU5BQkxFX0RFQlVHX0NPTU1BTkRfTElORV9TV0lUQ0hFUykKLQotICAgICAgICBmb3IgKGF1dG8mIGFyZyA6IGFyZ3NfKSB7Ci0gICAgICAgICAgYXJndl8ucHVzaF9iYWNrKGFyZy5jX3N0cigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEFwcGxpY2F0aW9uVXdwOjpHZXQoKS0+U2V0Q29tbWFuZExpbmUoCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGFyZ3ZfLnNpemUoKSksIGFyZ3ZfLmRhdGEoKSk7Ci0gICAgICB9Ci0KLSAgICAgIGNvbnN0IENvbW1hbmRMaW5lKiBjb21tYW5kX2xpbmUgPQotICAgICAgICAgIDo6c3RhcmJvYXJkOjpzaGFyZWQ6OnV3cDo6R2V0Q29tbWFuZExpbmVQb2ludGVyKGFwcGxpY2F0aW9uX3V3cCk7Ci0KLSNpZiBkZWZpbmVkKEVOQUJMRV9ERUJVR19DT01NQU5EX0xJTkVfU1dJVENIRVMpCi0gICAgICBpZiAoY29tbWFuZF9saW5lLT5IYXNTd2l0Y2goa1dhdGNoRG9nTG9nKSkgewotICAgICAgICAvLyBMYXVuY2ggYSB0aHJlYWQuCi0gICAgICAgIHN0ZDo6c3RyaW5nIHN3aXRjaF92YWwgPSBjb21tYW5kX2xpbmUtPkdldFN3aXRjaFZhbHVlKGtXYXRjaERvZ0xvZyk7Ci0gICAgICAgIGF1dG8gdXdwX2RpciA9Ci0gICAgICAgICAgICBXaW5kb3dzOjpTdG9yYWdlOjpBcHBsaWNhdGlvbkRhdGE6OkN1cnJlbnQtPkxvY2FsQ2FjaGVGb2xkZXI7Ci0gICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwotICAgICAgICBzcyA8PCBzYndpbjMyOjpwbGF0Zm9ybVN0cmluZ1RvU3RyaW5nKHV3cF9kaXItPlBhdGgpIDw8ICIvIgotICAgICAgICAgICA8PCBzd2l0Y2hfdmFsOwotICAgICAgICBzYnV3cDo6U3RhcnRXYXRjaGRvZ0xvZyhzcy5zdHIoKSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChjb21tYW5kX2xpbmUtPkhhc1N3aXRjaChrTG9nUGF0aFN3aXRjaCkpIHsKLSAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gICAgICAgIHNzIDw8IHNid2luMzI6OnBsYXRmb3JtU3RyaW5nVG9TdHJpbmcoCi0gICAgICAgICAgICBXaW5kb3dzOjpTdG9yYWdlOjpBcHBsaWNhdGlvbkRhdGE6OkN1cnJlbnQtPkxvY2FsQ2FjaGVGb2xkZXItPlBhdGgpOwotICAgICAgICBzcyA8PCAiXFwiIDw8ICIiIDw8IGNvbW1hbmRfbGluZS0+R2V0U3dpdGNoVmFsdWUoa0xvZ1BhdGhTd2l0Y2gpOwotICAgICAgICBzdGQ6OnN0cmluZyBmdWxsX3BhdGhfbG9nX2ZpbGUgPSBzcy5zdHIoKTsKLSAgICAgICAgc2J1d3A6Ok9wZW5Mb2dGaWxlV2luMzIoZnVsbF9wYXRoX2xvZ19maWxlLmNfc3RyKCkpOwotICAgICAgfSBlbHNlIHsKLSNpZiAhZGVmaW5lZChDT0JBTFRfQlVJTERfVFlQRV9HT0xEKQotICAgICAgICAvLyBMb2cgdG8gYSBmaWxlIG9uIHRoZSBsYXN0IHJlbW92YWJsZSBkZXZpY2UgYXZhaWxhYmxlIChwcm9iYWJseSB0aGUKLSAgICAgICAgLy8gbW9zdCByZWNlbnRseSBhZGRlZCByZW1vdmFibGUgZGV2aWNlKS4KLSAgICAgICAgaWYgKEtub3duRm9sZGVyczo6UmVtb3ZhYmxlRGV2aWNlcyAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgY29uY3VycmVuY3k6OmNyZWF0ZV90YXNrKAotICAgICAgICAgICAgICBLbm93bkZvbGRlcnM6OlJlbW92YWJsZURldmljZXMtPkdldEZvbGRlcnNBc3luYygpKS50aGVuKAotICAgICAgICAgICAgICBbXShjb25jdXJyZW5jeTo6dGFzazxJVmVjdG9yVmlldzxTdG9yYWdlRm9sZGVyXj5ePiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICBJVmVjdG9yVmlldzxTdG9yYWdlRm9sZGVyXj5eIHJlc3VsdHM7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSByZXN1bHQuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaChQbGF0Zm9ybTo6RXhjZXB0aW9uXikgewotICAgICAgICAgICAgICAgICAgU0JfTE9HKEVSUk9SKSA8PAotICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gb3BlbiBsb2cgZmlsZSBpbiBSZW1vdmFibGVEZXZpY2VzIjsKLSAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0cy0+U2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgU3RvcmFnZUZvbGRlcl4gZm9sZGVyID0gcmVzdWx0cy0+R2V0QXQocmVzdWx0cy0+U2l6ZSAtIDEpOwotICAgICAgICAgICAgICAgIENhbGVuZGFyXiBub3cgPSByZWYgbmV3IENhbGVuZGFyKCk7Ci0gICAgICAgICAgICAgICAgY2hhciBmaWxlbmFtZVsxMjhdOwotICAgICAgICAgICAgICAgIFNiU3RyaW5nRm9ybWF0RihmaWxlbmFtZSwgc2l6ZW9mKGZpbGVuYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgImNvYmFsdF9sb2dfJTA0ZCUwMmQlMDJkXyUwMmQlMDJkJTAyZC50eHQiLAotICAgICAgICAgICAgICAgICAgICBub3ctPlllYXIsIG5vdy0+TW9udGgsIG5vdy0+RGF5LAotICAgICAgICAgICAgICAgICAgICBub3ctPkhvdXIgKyBub3ctPkZpcnN0SG91ckluVGhpc1BlcmlvZCwKLSAgICAgICAgICAgICAgICAgICAgbm93LT5NaW51dGUsIG5vdy0+U2Vjb25kKTsKLSAgICAgICAgICAgICAgICBzYnV3cDo6T3BlbkxvZ0ZpbGVVV1AoZm9sZGVyLCBmaWxlbmFtZSk7Ci0gICAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0jZW5kaWYgIC8vICFkZWZpbmVkKENPQkFMVF9CVUlMRF9UWVBFX0dPTEQpCi0gICAgICB9Ci0jZW5kaWYgIC8vIGRlZmluZWQoRU5BQkxFX0RFQlVHX0NPTU1BTkRfTElORV9TV0lUQ0hFUykKLSAgICAgIFNCX0xPRyhJTkZPKSA8PCAiU3RhcnRpbmcgIiA8PCBHZXRCaW5hcnlOYW1lKCk7Ci0KLSAgICAgIENvcmVXaW5kb3c6OkdldEZvckN1cnJlbnRUaHJlYWQoKS0+QWN0aXZhdGUoKTsKLSAgICAgIC8vIENhbGwgRGlzcGF0Y2hTdGFydCBhc3luYyBzbyB0aGUgVVdQIHN5c3RlbSB0aGlua3Mgd2UncmUgYWN0aXZhdGVkLgotICAgICAgLy8gU29tZSB0b29scyBzZWVtIHRvIHdhbnQgdGhlIGFwcGxpY2F0aW9uIHRvIGJlIGFjdGl2YXRlZCBiZWZvcmUKLSAgICAgIC8vIGludGVyYWN0aW5nIHdpdGggdGhlbSwgc29tZSB0aGluZ3MgYXJlIGRpc2FsbG93ZWQgZHVyaW5nIGFjdGl2YXRpb24KLSAgICAgIC8vIChzdWNoIGFzIGV4aXRpbmcpLCBhbmQgRGlzcGF0Y2hTdGFydCAoZm9yIGV4YW1wbGUpIHJ1bnMKLSAgICAgIC8vIGF1dG9tYXRlZCB0ZXN0cyBzeW5jaHJvbm91c2x5LgotCi0gICAgICBSdW5Jbk1haW5UaHJlYWRBc3luYyhbdGhpc10oKSB7Ci0gICAgICAgIEFwcGxpY2F0aW9uVXdwOjpHZXQoKS0+RGlzcGF0Y2hTdGFydCgpOwotICAgICAgfSk7Ci0gICAgfQotICAgIHByZXZpb3VzbHlfYWN0aXZhdGVkXyA9IHRydWU7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHZvaWQgUHJvY2Vzc0RlZXBMaW5rVXJpKHN0ZDo6c3RyaW5nICp1cmlfc3RyaW5nKSB7Ci0gICAgU0JfRENIRUNLKHVyaV9zdHJpbmcpOwotICAgIGlmIChwcmV2aW91c2x5X2FjdGl2YXRlZF8pIHsKLSAgICAgIHN0ZDo6dW5pcXVlX3B0cjxBcHBsaWNhdGlvbjo6RXZlbnQ+IGV2ZW50ID0KLSAgICAgICAgTWFrZURlZXBMaW5rRXZlbnQoKnVyaV9zdHJpbmcpOwotICAgICAgU0JfRENIRUNLKGV2ZW50KTsKLSAgICAgIEFwcGxpY2F0aW9uVXdwOjpHZXQoKS0+SW5qZWN0KGV2ZW50LnJlbGVhc2UoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEFwcGxpY2F0aW9uVXdwOjpHZXQoKS0+U2V0U3RhcnRMaW5rKHVyaV9zdHJpbmctPmNfc3RyKCkpOwotICAgIH0KLSAgfQotCi0gIHN0ZDo6c3RyaW5nIGVudHJ5X3BvaW50XzsKLSAgYm9vbCBwcmV2aW91c2x5X2FjdGl2YXRlZF87Ci0gIC8vIE9ubHkgdmFsaWQgaWYgcHJldmlvdXNseV9hY3RpdmF0ZWRfIGlzIHRydWUKLSAgQWN0aXZhdGlvbktpbmQgcHJldmlvdXNfYWN0aXZhdGlvbl9raW5kXzsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGFyZ3NfOwotICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyICo+IGFyZ3ZfOwotCi0gIHN0YXJib2FyZDo6c2hhcmVkOjp1d3A6OkFwcGxpY2F0aW9uVXdwIGFwcGxpY2F0aW9uXzsKLX07Ci0KLXJlZiBjbGFzcyBEaXJlY3QzREFwcGxpY2F0aW9uU291cmNlIHNlYWxlZCA6IElGcmFtZXdvcmtWaWV3U291cmNlIHsKLSBwdWJsaWM6Ci0gIERpcmVjdDNEQXBwbGljYXRpb25Tb3VyY2UoKSB7fQotICB2aXJ0dWFsIElGcmFtZXdvcmtWaWV3XiBDcmVhdGVWaWV3KCkgewotICAgIHJldHVybiByZWYgbmV3IEFwcCgpOwotICB9Ci19OwotCi1uYW1lc3BhY2Ugc3RhcmJvYXJkIHsKLW5hbWVzcGFjZSBzaGFyZWQgewotbmFtZXNwYWNlIHV3cCB7Ci0KLUFwcGxpY2F0aW9uVXdwOjpBcHBsaWNhdGlvblV3cCgpCi0gICAgOiB3aW5kb3dfKGtTYldpbmRvd0ludmFsaWQpLAotICAgICAgbG9jYWxpemVkX3N0cmluZ3NfKFNiU3lzdGVtR2V0TG9jYWxlSWQoKSksCi0gICAgICBkZXZpY2VfaWRfKE1ha2VEZXZpY2VJZCgpKSB7Ci0gIGFuYWxvZ190aHVtYnN0aWNrX3RocmVhZF8ucmVzZXQobmV3IEFuYWxvZ1RodW1ic3RpY2tUaHJlYWQodGhpcykpOwotfQotCi1BcHBsaWNhdGlvblV3cDo6fkFwcGxpY2F0aW9uVXdwKCkgewotICBhbmFsb2dfdGh1bWJzdGlja190aHJlYWRfLnJlc2V0KG51bGxwdHIpOwotfQotCi12b2lkIEFwcGxpY2F0aW9uVXdwOjpJbml0aWFsaXplKCkge30KLQotdm9pZCBBcHBsaWNhdGlvblV3cDo6VGVhcmRvd24oKSB7Ci0gIENsb3NlV2F0Y2hkb2dMb2coKTsKLX0KLQotQXBwbGljYXRpb246OkV2ZW50KiBBcHBsaWNhdGlvblV3cDo6R2V0TmV4dEV2ZW50KCkgewotICBTQl9OT1RSRUFDSEVEKCk7Ci0gIHJldHVybiBudWxscHRyOwotfQotCi1TYldpbmRvdyBBcHBsaWNhdGlvblV3cDo6Q3JlYXRlV2luZG93Rm9yVVdQKGNvbnN0IFNiV2luZG93T3B0aW9ucyopIHsKLSAgLy8gVE9ETzogRGV0ZXJtaW5lIHdoeSBTQl9EQ0hFQ0soSXNDdXJyZW50VGhyZWFkKCkpIGZhaWxzIGluIG5wbGIsIGZpeCBpdCwKLSAgLy8gYW5kIGFkZCBiYWNrIHRoaXMgY2hlY2suCi0KLSAgaWYgKFNiV2luZG93SXNWYWxpZCh3aW5kb3dfKSkgewotICAgIHJldHVybiBrU2JXaW5kb3dJbnZhbGlkOwotICB9Ci0KLSAgLy8gR2V0IHRoZSBsb2dpY2FsIHJlc29sdXRpb24gaW4gcGl4ZWxzLiBTZWUgc2VjdGlvbiAiQm91bmRzIiBpbgotICAvLyBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy91d3AvYXBpL3dpbmRvd3MudWkuY29yZS5jb3Jld2luZG93LgotICBXaW5kb3dzOjpGb3VuZGF0aW9uOjpSZWN0IGJvdW5kc19pbl9kaXBzID0KLSAgICAgIENvcmVXaW5kb3c6OkdldEZvckN1cnJlbnRUaHJlYWQoKS0+Qm91bmRzOwotICBmbG9hdCBkcGkgPSBEaXNwbGF5SW5mb3JtYXRpb246OkdldEZvckN1cnJlbnRWaWV3KCktPkxvZ2ljYWxEcGk7Ci0gIGludCB3aWR0aCA9IHN0YXRpY19jYXN0PGludD4oYm91bmRzX2luX2RpcHMuV2lkdGggKiBkcGkgLyA5Ni4wZik7Ci0gIGludCBoZWlnaHQgPSBzdGF0aWNfY2FzdDxpbnQ+KGJvdW5kc19pbl9kaXBzLkhlaWdodCAqIGRwaSAvIDk2LjBmKTsKLQotICAvLyBGb3IgVVdQIG9uIFhCMSwgdGhlIGxvZ2ljYWwgcmVzb2x1dGlvbiBpcyBhbHdheXMgMTA4MHAsIHJlZ2FyZGxlc3Mgb2YgdGhlCi0gIC8vIGFjdHVhbCBvdXRwdXQgcmVzb2x1dGlvbiAtLSBzZWN0aW9uICJTY2FsZSBmYWN0b3IgYW5kIGFkYXB0aXZlIGxheW91dCIgaW4KLSAgLy8gImh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3dpbmRvd3MvdXdwL2lucHV0LWFuZC1kZXZpY2VzLwotICAvLyBkZXNpZ25pbmctZm9yLXR2Ii4gSG93ZXZlciwgaWYgdGhlIHN3YXAgY2hhaW4gdXNlcyBhIHNwZWNpYWwgc3VyZmFjZQotICAvLyBmb3JtYXQgKFIxMEcxMEIxMEEyKSwgaXQgY2FuIGJlIHBhc3NlZCB0byB0aGUgb3V0cHV0IHdpdGhvdXQgc2NhbGluZy4KLSAgYm9vbCBzdXBwb3J0c19oZG1pX2FwaSA9IEFwaUluZm9ybWF0aW9uOjpJc0FwaUNvbnRyYWN0UHJlc2VudCgKLSAgICAgICJXaW5kb3dzLkZvdW5kYXRpb24uVW5pdmVyc2FsQXBpQ29udHJhY3QiLCA0KTsKLSAgYm9vbCBpc19mdWxsc2NyZWVuID0gQXBwbGljYXRpb25WaWV3OjpHZXRGb3JDdXJyZW50VmlldygpLT5Jc0Z1bGxTY3JlZW5Nb2RlOwotICBpZiAoc3VwcG9ydHNfaGRtaV9hcGkgJiYgaXNfZnVsbHNjcmVlbikgewotICAgIC8vIFRoaXMgcmVwb3J0cyB0aGUgYWN0dWFsIG91dHB1dCByZXNvbHV0aW9uLgotICAgIGF1dG8gZGlzcGxheV9pbmZvID0gSGRtaURpc3BsYXlJbmZvcm1hdGlvbjo6R2V0Rm9yQ3VycmVudFZpZXcoKTsKLSAgICBhdXRvIGN1cnJlbnRfbW9kZSA9IGRpc3BsYXlfaW5mby0+R2V0Q3VycmVudERpc3BsYXlNb2RlKCk7Ci0gICAgd2lkdGggPSBzdGF0aWNfY2FzdDxpbnQ+KGN1cnJlbnRfbW9kZS0+UmVzb2x1dGlvbldpZHRoSW5SYXdQaXhlbHMpOwotICAgIGhlaWdodCA9IHN0YXRpY19jYXN0PGludD4oY3VycmVudF9tb2RlLT5SZXNvbHV0aW9uSGVpZ2h0SW5SYXdQaXhlbHMpOwotICB9Ci0KLSAgU0JfTE9HKElORk8pIDw8ICJXaW5kb3cgcmVzb2x1dGlvbiBpcyAiIDw8IHdpZHRoIDw8ICIgeCAiIDw8IGhlaWdodDsKLQotICB3aW5kb3dfID0gbmV3IFNiV2luZG93UHJpdmF0ZSh3aWR0aCwgaGVpZ2h0KTsKLSAgcmV0dXJuIHdpbmRvd187Ci19Ci0KLWJvb2wgQXBwbGljYXRpb25Vd3A6OkRlc3Ryb3lXaW5kb3coU2JXaW5kb3cgd2luZG93KSB7Ci0gIC8vIFRPRE86IERldGVybWluZSB3aHkgU0JfRENIRUNLKElzQ3VycmVudFRocmVhZCgpKSBmYWlscyBpbiBucGxiLCBmaXggaXQsCi0gIC8vIGFuZCBhZGQgYmFjayB0aGlzIGNoZWNrLgotCi0gIGlmICghU2JXaW5kb3dJc1ZhbGlkKHdpbmRvdykpIHsKLSAgICBTQl9ETE9HKEVSUk9SKSA8PCBfX0ZVTkNUSU9OX18gPDwgIjogSW52YWxpZCBjb250ZXh0LiI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgU0JfRENIRUNLKHdpbmRvd18gPT0gd2luZG93KTsKLSAgZGVsZXRlIHdpbmRvdzsKLSAgd2luZG93XyA9IGtTYldpbmRvd0ludmFsaWQ7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQXBwbGljYXRpb25Vd3A6OkRpc3BhdGNoTmV4dEV2ZW50KCkgewotICBjb3JlX3dpbmRvd18tPkFjdGl2YXRlKCk7Ci0gIGNvcmVfd2luZG93Xy0+RGlzcGF0Y2hlci0+UHJvY2Vzc0V2ZW50cygKLSAgICAgIENvcmVQcm9jZXNzRXZlbnRzT3B0aW9uOjpQcm9jZXNzVW50aWxRdWl0KTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1XaW5kb3dzOjpNZWRpYTo6UHJvdGVjdGlvbjo6SGRjcFNlc3Npb25eIEFwcGxpY2F0aW9uVXdwOjpHZXRIZGNwU2Vzc2lvbigpIHsKLSAgaWYgKCFoZGNwX3Nlc3Npb25fKSB7Ci0gICAgaGRjcF9zZXNzaW9uXyA9IHJlZiBuZXcgSGRjcFNlc3Npb24oKTsKLSAgfQotICByZXR1cm4gaGRjcF9zZXNzaW9uXzsKLX0KLQotdm9pZCBBcHBsaWNhdGlvblV3cDo6UmVzZXRIZGNwU2Vzc2lvbigpIHsKLSAgLy8gZGVsZXRlIHdpbGwgY2FsbCB0aGUgZGVzdHJ1Y3RvciwgYnV0IG5vdCBmcmVlIG1lbW9yeS4KLSAgLy8gVGhlIGRlc3RydWN0b3IgaXMgY2FsbGVkIGV4cGxpY2l0bHkgc28gdGhhdCBIRENQIHNlc3Npb24gY2FuIGJlCi0gIC8vIHRvcm4gZG93biBpbW1lZGlhdGVseS4KLSAgaWYgKGhkY3Bfc2Vzc2lvbl8pIHsKLSAgICBkZWxldGUgaGRjcF9zZXNzaW9uXzsKLSAgICBoZGNwX3Nlc3Npb25fID0gbnVsbHB0cjsKLSAgfQotfQotCi12b2lkIEFwcGxpY2F0aW9uVXdwOjpJbmplY3QoQXBwbGljYXRpb246OkV2ZW50KiBldmVudCkgewotICBSdW5Jbk1haW5UaHJlYWRBc3luYyhbdGhpcywgZXZlbnRdKCkgewotICAgIGJvb2wgcmVzdWx0ID0gRGlzcGF0Y2hBbmREZWxldGUoZXZlbnQpOwotICAgIGlmICghcmVzdWx0KSB7Ci0gICAgICBOZXRMb2dGbHVzaFRoZW5DbG9zZSgpOwotICAgICAgQ29yZUFwcGxpY2F0aW9uOjpFeGl0KCk7Ci0gICAgfQotICB9KTsKLX0KLQotdm9pZCBBcHBsaWNhdGlvblV3cDo6SW5qZWN0S2V5cHJlc3MoU2JLZXkga2V5KSB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxTYklucHV0RGF0YT4gcHJlc3NfZGF0YShuZXcgU2JJbnB1dERhdGEoKSk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxTYklucHV0RGF0YT4gdW5wcmVzc19kYXRhKG5ldyBTYklucHV0RGF0YSgpKTsKLQotICBTYk1lbW9yeVNldChwcmVzc19kYXRhLmdldCgpLCAwLCBzaXplb2YoKnByZXNzX2RhdGEpKTsKLSAgcHJlc3NfZGF0YS0+d2luZG93ID0gd2luZG93XzsKLSAgcHJlc3NfZGF0YS0+ZGV2aWNlX3R5cGUgPSBrU2JJbnB1dERldmljZVR5cGVLZXlib2FyZDsKLSAgcHJlc3NfZGF0YS0+ZGV2aWNlX2lkID0gZGV2aWNlX2lkKCk7Ci0gIHByZXNzX2RhdGEtPmtleSA9IGtleTsKLSAgcHJlc3NfZGF0YS0+dHlwZSA9IGtTYklucHV0RXZlbnRUeXBlUHJlc3M7Ci0KLSAgKnVucHJlc3NfZGF0YSA9ICpwcmVzc19kYXRhOwotICB1bnByZXNzX2RhdGEtPnR5cGUgPSBrU2JJbnB1dEV2ZW50VHlwZVVucHJlc3M7Ci0KLSAgSW5qZWN0KG5ldyBFdmVudChrU2JFdmVudFR5cGVJbnB1dCwgcHJlc3NfZGF0YS5yZWxlYXNlKCksCi0gICAgICAmQXBwbGljYXRpb246OkRlbGV0ZURlc3RydWN0b3I8U2JJbnB1dERhdGE+KSk7Ci0gIEluamVjdChuZXcgRXZlbnQoa1NiRXZlbnRUeXBlSW5wdXQsIHVucHJlc3NfZGF0YS5yZWxlYXNlKCksCi0gICAgICAmQXBwbGljYXRpb246OkRlbGV0ZURlc3RydWN0b3I8U2JJbnB1dERhdGE+KSk7Ci19Ci0KLXZvaWQgQXBwbGljYXRpb25Vd3A6OkluamVjdFRpbWVkRXZlbnQoQXBwbGljYXRpb246OlRpbWVkRXZlbnQqIHRpbWVkX2V2ZW50KSB7Ci0gIFNiVGltZU1vbm90b25pYyBkZWxheV91c2VjID0KLSAgICAgIHRpbWVkX2V2ZW50LT50YXJnZXRfdGltZSAtIFNiVGltZUdldE1vbm90b25pY05vdygpOwotICBpZiAoZGVsYXlfdXNlYyA8IDApIHsKLSAgICBkZWxheV91c2VjID0gMDsKLSAgfQotCi0gIC8vIFRpbWVTcGFuIHRpY2tzIGFyZSwgbGlrZSBGSUxFVElNRSwgMTAwbnMKLSAgY29uc3QgU2JUaW1lTW9ub3RvbmljIGtUaWNrc1BlclVzZWMgPSAxMDsKLQotICBUaW1lU3BhbiB0aW1lc3BhbjsKLSAgdGltZXNwYW4uRHVyYXRpb24gPSBkZWxheV91c2VjICoga1RpY2tzUGVyVXNlYzsKLQotICBTY29wZWRMb2NrIGxvY2sobXV0ZXhfKTsKLSAgVGhyZWFkUG9vbFRpbWVyXiB0aW1lciA9IFRocmVhZFBvb2xUaW1lcjo6Q3JlYXRlVGltZXIoCi0gICAgcmVmIG5ldyBUaW1lckVsYXBzZWRIYW5kbGVyKFt0aGlzLCB0aW1lZF9ldmVudF0oVGhyZWFkUG9vbFRpbWVyXiB0aW1lcikgewotICAgICAgUnVuSW5NYWluVGhyZWFkQXN5bmMoW3RoaXMsIHRpbWVkX2V2ZW50XSgpIHsKLSAgICAgICAgLy8gRXZlbiBpZiB0aGUgZXZlbnQgaXMgY2FuY2VsZWQsIHRoZSBjYWxsYmFjayBjYW4gc3RpbGwgZmlyZS4KLSAgICAgICAgLy8gVGh1cywgdGhlIGV4aXN0ZW5jZSBvZiBldmVudCBpbiB0aW1lcl9ldmVudF9tYXBfIGlzIHVzZWQKLSAgICAgICAgLy8gYXMgYSBzb3VyY2Ugb2YgdHJ1dGguCi0gICAgICAgIHN0ZDo6c2l6ZV90IG51bWJlcl9lcmFzZWQgPSAwOwotICAgICAgICB7Ci0gICAgICAgICAgU2NvcGVkTG9jayBsb2NrKG11dGV4Xyk7Ci0gICAgICAgICAgbnVtYmVyX2VyYXNlZCA9IHRpbWVyX2V2ZW50X21hcF8uZXJhc2UodGltZWRfZXZlbnQtPmlkKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobnVtYmVyX2VyYXNlZCA+IDApIHsKLSAgICAgICAgICB0aW1lZF9ldmVudC0+Y2FsbGJhY2sodGltZWRfZXZlbnQtPmNvbnRleHQpOwotICAgICAgICB9Ci0gICAgICB9KTsKLSAgICB9KSwgdGltZXNwYW4pOwotICB0aW1lcl9ldmVudF9tYXBfLmVtcGxhY2UodGltZWRfZXZlbnQtPmlkLCB0aW1lcik7Ci19Ci0KLXZvaWQgQXBwbGljYXRpb25Vd3A6OkNhbmNlbFRpbWVkRXZlbnQoU2JFdmVudElkIGV2ZW50X2lkKSB7Ci0gIFNjb3BlZExvY2sgbG9jayhtdXRleF8pOwotICBhdXRvIGl0ID0gdGltZXJfZXZlbnRfbWFwXy5maW5kKGV2ZW50X2lkKTsKLSAgaWYgKGl0ID09IHRpbWVyX2V2ZW50X21hcF8uZW5kKCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgaXQtPnNlY29uZC0+Q2FuY2VsKCk7Ci0gIHRpbWVyX2V2ZW50X21hcF8uZXJhc2UoaXQpOwotfQotCi1BcHBsaWNhdGlvbjo6VGltZWRFdmVudCogQXBwbGljYXRpb25Vd3A6OkdldE5leHREdWVUaW1lZEV2ZW50KCkgewotICBTQl9OT1RJTVBMRU1FTlRFRCgpOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotU2JUaW1lTW9ub3RvbmljIEFwcGxpY2F0aW9uVXdwOjpHZXROZXh0VGltZWRFdmVudFRhcmdldFRpbWUoKSB7Ci0gIFNCX05PVElNUExFTUVOVEVEKCk7Ci0gIHJldHVybiAwOwotfQotCi12b2lkIEFwcGxpY2F0aW9uVXdwOjpPbkpveXN0aWNrVXBkYXRlKFNiS2V5IGtleSwgU2JJbnB1dFZlY3RvciBpbnB1dF92ZWN0b3IpIHsKLSAgc2NvcGVkX3B0cjxTYklucHV0RGF0YT4gZGF0YShuZXcgU2JJbnB1dERhdGEoKSk7Ci0gIFNiTWVtb3J5U2V0KGRhdGEuZ2V0KCksIDAsIHNpemVvZigqZGF0YSkpOwotICBkYXRhLT53aW5kb3cgPSB3aW5kb3dfOwotICBkYXRhLT50eXBlID0ga1NiSW5wdXRFdmVudFR5cGVNb3ZlOwotICBkYXRhLT5kZXZpY2VfdHlwZSA9IGtTYklucHV0RGV2aWNlVHlwZUdhbWVwYWQ7Ci0gIGRhdGEtPmRldmljZV9pZCA9IGRldmljZV9pZCgpOwotICBkYXRhLT5rZXkgPSBrZXk7Ci0gIGRhdGEtPmNoYXJhY3RlciA9IDA7Ci0KLSAgZGF0YS0+a2V5X21vZGlmaWVycyA9IGtTYktleU1vZGlmaWVyc05vbmU7Ci0gIGRhdGEtPnBvc2l0aW9uID0gaW5wdXRfdmVjdG9yOwotCi0gIFNiS2V5TG9jYXRpb24ga2V5X2xvY2F0aW9uID0ga1NiS2V5TG9jYXRpb25VbnNwZWNpZmllZDsKLSAgc3dpdGNoIChrZXkpIHsKLSAgICBjYXNlIGtTYktleUdhbWVwYWRMZWZ0U3RpY2tMZWZ0OgotICAgIGNhc2Uga1NiS2V5R2FtZXBhZExlZnRTdGlja1VwOiB7Ci0gICAgICBrZXlfbG9jYXRpb24gPSBrU2JLZXlMb2NhdGlvbkxlZnQ7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBrU2JLZXlHYW1lcGFkUmlnaHRTdGlja0xlZnQ6Ci0gICAgY2FzZSBrU2JLZXlHYW1lcGFkUmlnaHRTdGlja1VwOiB7Ci0gICAgICBrZXlfbG9jYXRpb24gPSBrU2JLZXlMb2NhdGlvblJpZ2h0OwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGRlZmF1bHQ6IHsKLSAgICAgIFNCX05PVFJFQUNIRUQoKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIGRhdGEtPmtleV9sb2NhdGlvbiA9IGtleV9sb2NhdGlvbjsKLSAgSW5qZWN0KG5ldyBFdmVudChrU2JFdmVudFR5cGVJbnB1dCwgZGF0YS5yZWxlYXNlKCksCi0gICAgICAgICAgICAgICAgICAgJkFwcGxpY2F0aW9uOjpEZWxldGVEZXN0cnVjdG9yPFNiSW5wdXREYXRhPikpOwotfQotCi1QbGF0Zm9ybTo6U3RyaW5nXiBBcHBsaWNhdGlvblV3cDo6R2V0U3RyaW5nKAotICAgIGNvbnN0IGNoYXIqIGlkLCBjb25zdCBjaGFyKiBmYWxsYmFjaykgY29uc3QgewotICByZXR1cm4gc3RyaW5nVG9QbGF0Zm9ybVN0cmluZyhsb2NhbGl6ZWRfc3RyaW5nc18uR2V0U3RyaW5nKGlkLCBmYWxsYmFjaykpOwotfQotCi1ib29sIEFwcGxpY2F0aW9uVXdwOjpJc0hkY3BPbigpIHsKLSAgOjpzdGFyYm9hcmQ6OlNjb3BlZExvY2sgbG9jayhoZGNwX3Nlc3Npb25fbXV0ZXhfKTsKLQotICByZXR1cm4gR2V0SGRjcFNlc3Npb24oKS0+SXNFZmZlY3RpdmVQcm90ZWN0aW9uQXRMZWFzdChrSERDUFByb3RlY3Rpb25Nb2RlKTsKLX0KLQotYm9vbCBBcHBsaWNhdGlvblV3cDo6VHVybk9uSGRjcCgpIHsKLSAgSGRjcFNldFByb3RlY3Rpb25SZXN1bHQgcHJvdGVjdGlvbl9yZXN1bHQ7Ci0gIHsKLSAgICA6OnN0YXJib2FyZDo6U2NvcGVkTG9jayBsb2NrKGhkY3Bfc2Vzc2lvbl9tdXRleF8pOwotCi0gICAgcHJvdGVjdGlvbl9yZXN1bHQgPSBXYWl0Rm9yUmVzdWx0KAotICAgICAgICBHZXRIZGNwU2Vzc2lvbigpLT5TZXREZXNpcmVkTWluUHJvdGVjdGlvbkFzeW5jKGtIRENQUHJvdGVjdGlvbk1vZGUpKTsKLSAgfQotCi0gIGlmIChJc0hkY3BPbigpKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvLyBJZiB0aGUgb3BlcmF0aW9uIGRpZCBub3QgaGF2ZSBpbnRlbmRlZCByZXN1bHQsIGxvZyBzb21ldGhpbmcuCi0gIHN3aXRjaCAocHJvdGVjdGlvbl9yZXN1bHQpIHsKLSAgY2FzZSBIZGNwU2V0UHJvdGVjdGlvblJlc3VsdDo6U3VjY2VzczoKLSAgICBTQl9MT0coSU5GTykgPDwgIlN1Y2Nlc3NmdWxseSBzZXQgSERDUC4iOwotICAgIGJyZWFrOwotICBjYXNlIEhkY3BTZXRQcm90ZWN0aW9uUmVzdWx0OjpOb3RTdXBwb3J0ZWQ6Ci0gICAgU0JfTE9HKElORk8pIDw8ICJIRENQIGlzIG5vdCBzdXBwb3J0ZWQuIjsKLSAgICBicmVhazsKLSAgY2FzZSBIZGNwU2V0UHJvdGVjdGlvblJlc3VsdDo6VGltZWRPdXQ6Ci0gICAgU0JfTE9HKElORk8pIDw8ICJTZXR0aW5nIEhEQ1AgdGltZWQgb3V0LiI7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgSGRjcFNldFByb3RlY3Rpb25SZXN1bHQ6OlVua25vd25GYWlsdXJlOgotICAgIFNCX0xPRyhJTkZPKSA8PCAiVW5rbm93biBmYWlsdXJlIHJldHVybmVkIHdoaWxlIHNldHRpbmcgSERDUC4iOwotICAgIGJyZWFrOwotICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIEFwcGxpY2F0aW9uVXdwOjpUdXJuT2ZmSGRjcCgpIHsKLSAgewotICAgIDo6c3RhcmJvYXJkOjpTY29wZWRMb2NrIGxvY2soaGRjcF9zZXNzaW9uX211dGV4Xyk7Ci0gICAgUmVzZXRIZGNwU2Vzc2lvbigpOwotICB9Ci0gIGJvb2wgc3VjY2VzcyA9ICFTYk1lZGlhSXNPdXRwdXRQcm90ZWN0ZWQoKTsKLSAgcmV0dXJuIHN1Y2Nlc3M7Ci19Ci0KLVBsYXRmb3JtOjpBZ2lsZTxXaW5kb3dzOjpVSTo6Q29yZTo6Q29yZURpc3BhdGNoZXI+IEdldERpc3BhdGNoZXIoKSB7Ci0gIHJldHVybiBBcHBsaWNhdGlvblV3cDo6R2V0KCktPkdldERpc3BhdGNoZXIoKTsKLX0KLQotUGxhdGZvcm06OkFnaWxlPFdpbmRvd3M6Ok1lZGlhOjpTeXN0ZW1NZWRpYVRyYW5zcG9ydENvbnRyb2xzPgotICAgIEdldFRyYW5zcG9ydENvbnRyb2xzKCkgewotICByZXR1cm4gQXBwbGljYXRpb25Vd3A6OkdldCgpLT5HZXRUcmFuc3BvcnRDb250cm9scygpOwotfQotCi12b2lkIERpc3BsYXlSZXF1ZXN0QWN0aXZlKCkgewotICBSdW5Jbk1haW5UaHJlYWRBc3luYyhbXSgpIHsKLSAgICBpZiAoZGlzcGxheV9yZXF1ZXN0ICE9IG51bGxwdHIpIHsKLSAgICAgIGRpc3BsYXlfcmVxdWVzdC0+UmVxdWVzdEFjdGl2ZSgpOwotICAgIH0KLSAgfSk7Ci19Ci0KLXZvaWQgRGlzcGxheVJlcXVlc3RSZWxlYXNlKCkgewotICBSdW5Jbk1haW5UaHJlYWRBc3luYyhbXSgpIHsKLSAgICBpZiAoZGlzcGxheV9yZXF1ZXN0ICE9IG51bGxwdHIpIHsKLSAgICAgIGRpc3BsYXlfcmVxdWVzdC0+UmVxdWVzdFJlbGVhc2UoKTsKLSAgICB9Ci0gIH0pOwotfQotCi12b2lkIEluamVjdEtleXByZXNzKFNiS2V5IGtleSkgewotICBBcHBsaWNhdGlvblV3cDo6R2V0KCktPkluamVjdEtleXByZXNzKGtleSk7Ci19Ci0KLWJvb2wgSGFzTmV0TG9nU3dpdGNoKFBsYXRmb3JtOjpBcnJheTxQbGF0Zm9ybTo6U3RyaW5nXj5eIGFyZ3MpIHsKLSAgQ29tbWFuZExpbmU6OlN0cmluZ1ZlY3RvciBhcmdfdjsKLSAgZm9yIChQbGF0Zm9ybTo6U3RyaW5nXiBhcmcgOiBhcmdzKSB7Ci0gICAgYXJnX3YucHVzaF9iYWNrKHBsYXRmb3JtU3RyaW5nVG9TdHJpbmcoYXJnKSk7Ci0gIH0KLSAgQ29tbWFuZExpbmUgY21kX2xpbmUoYXJnX3YpOwotICByZXR1cm4gY21kX2xpbmUuSGFzU3dpdGNoKGtOZXRMb2dDb21tYW5kU3dpdGNoV2FpdCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB1d3AKLX0gIC8vIG5hbWVzcGFjZSBzaGFyZWQKLX0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKLQotW1BsYXRmb3JtOjpNVEFUaHJlYWRdCi1pbnQgbWFpbihQbGF0Zm9ybTo6QXJyYXk8UGxhdGZvcm06OlN0cmluZ14+XiBhcmdzKSB7Ci0gIGlmICghSXNEZWJ1Z2dlclByZXNlbnQoKSkgewotICAgIC8vIEJ5IGRlZmF1bHQsIGEgV2luZG93cyBhcHBsaWNhdGlvbiB3aWxsIGRpc3BsYXkgYSBkaWFsb2cgYm94Ci0gICAgLy8gd2hlbiBpdCBjcmFzaGVzLiBUaGlzIGlzIGV4dHJlbWVseSB1bmRlc2lyYWJsZSB3aGVuIHJ1biBvZmZsaW5lLgotICAgIC8vIFRoZSBmb2xsb3dpbmcgY29uZmlndXJlcyBtZXNzYWdlcyB0byBiZSBwcmludCB0byB0aGUgY29uc29sZSBpbnN0ZWFkLgotICAgIF9DcnRTZXRSZXBvcnRNb2RlKF9DUlRfQVNTRVJULCBfQ1JUREJHX01PREVfRklMRSB8IF9DUlREQkdfTU9ERV9ERUJVRyk7Ci0gICAgX0NydFNldFJlcG9ydE1vZGUoX0NSVF9FUlJPUiwgX0NSVERCR19NT0RFX0ZJTEUgfCBfQ1JUREJHX01PREVfREVCVUcpOwotICAgIF9DcnRTZXRSZXBvcnRNb2RlKF9DUlRfV0FSTiwgX0NSVERCR19NT0RFX0ZJTEUgfCBfQ1JUREJHX01PREVfREVCVUcpOwotICAgIF9DcnRTZXRSZXBvcnRGaWxlKF9DUlRfQVNTRVJULCBfQ1JUREJHX0ZJTEVfU1RERVJSKTsKLSAgfQotCi0gIFdTQURhdGEgd3NhRGF0YTsKLSAgaW50IGluaXRfcmVzdWx0ID0gV1NBU3RhcnR1cCgKLSAgICAgIE1BS0VXT1JEKGtXaW5Tb2NrVmVyc2lvbk1ham9yLCBrV2luU29ja1ZlcnNpb25NYWpvciksICZ3c2FEYXRhKTsKLQotICBTQl9DSEVDSyhpbml0X3Jlc3VsdCA9PSAwKTsKLSAgLy8gV1NBU3RhcnR1cCByZXR1cm5zIHRoZSBoaWdoZXN0IHZlcnNpb24gdGhhdCBpcyBzdXBwb3J0ZWQgdXAgdG8gdGhlIHZlcnNpb24KLSAgLy8gd2UgcmVxdWVzdC4KLSAgU0JfQ0hFQ0soTE9CWVRFKHdzYURhdGEud1ZlcnNpb24pID09IGtXaW5Tb2NrVmVyc2lvbk1ham9yICYmCi0gICAgICAgICAgIEhJQllURSh3c2FEYXRhLndWZXJzaW9uKSA9PSBrV2luU29ja1ZlcnNpb25NaW5vcik7Ci0KLSAgSFJFU1VMVCBociA9IE1GU3RhcnR1cChNRl9WRVJTSU9OKTsKLSAgU0JfRENIRUNLKFNVQ0NFRURFRChocikpOwotCi0gIHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6UmVnaXN0ZXJNYWluVGhyZWFkKCk7Ci0KLSAgaWYgKHN0YXJib2FyZDo6c2hhcmVkOjp1d3A6Okhhc05ldExvZ1N3aXRjaChhcmdzKSkgewotICAgIE5ldExvZ1dhaXRGb3JDbGllbnRDb25uZWN0ZWQoKTsKLSAgfQotICBhdXRvIGRpcmVjdDNEQXBwbGljYXRpb25Tb3VyY2UgPSByZWYgbmV3IERpcmVjdDNEQXBwbGljYXRpb25Tb3VyY2UoKTsKLSAgQ29yZUFwcGxpY2F0aW9uOjpSdW4oZGlyZWN0M0RBcHBsaWNhdGlvblNvdXJjZSk7Ci0gIE5ldExvZ0ZsdXNoVGhlbkNsb3NlKCk7Ci0KLSAgTUZTaHV0ZG93bigpOwotICBXU0FDbGVhbnVwKCk7Ci0KLSAgcmV0dXJuIG1haW5fcmV0dXJuX3ZhbHVlOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL2FwcGxpY2F0aW9uX3V3cC5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL2FwcGxpY2F0aW9uX3V3cC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTVkZTU5Li4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9hcHBsaWNhdGlvbl91d3AuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaWZuZGVmIFNUQVJCT0FSRF9TSEFSRURfVVdQX0FQUExJQ0FUSU9OX1VXUF9IXwotI2RlZmluZSBTVEFSQk9BUkRfU0hBUkVEX1VXUF9BUFBMSUNBVElPTl9VV1BfSF8KLQotI2luY2x1ZGUgPEQzRDEyLmg+Ci0jaW5jbHVkZSA8YWdpbGUuaD4KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2NvbmZpZ3VyYXRpb24uaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvaW5wdXQuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQva2V5LmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL211dGV4LmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9pbnRlcm5hbF9vbmx5LmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvYXBwbGljYXRpb24uaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9jb21tYW5kX2xpbmUuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9sb2NhbGl6ZWRfc3RyaW5ncy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvdXdwL2FuYWxvZ190aHVtYnN0aWNrX2lucHV0X3RocmVhZC5oIgotI2luY2x1ZGUgInN0YXJib2FyZC90eXBlcy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC93aW5kb3cuaCIKLQotbmFtZXNwYWNlIHN0YXJib2FyZCB7Ci1uYW1lc3BhY2Ugc2hhcmVkIHsKLW5hbWVzcGFjZSB1d3AgewotCi0vLyBJbmNsdWRpbmcgPGFnaWxlLmg+LCB3aWxsIGV2ZW50dWFsbHkgaW5jbHVkZSA8d2luZG93cy5oPiwgd2hpY2ggaW5jbHVkZXMKLS8vIEM6XFByb2dyYW0gRmlsZXMgKHg4NilcV2luZG93cyBLaXRzXDEwXEluY2x1ZGVcMTAuMC4xNTA2My4wXHVtXHByb2Nlc3NlbnYuaCwKLS8vIGxpbmUgMTY0IGluIHByb2Nlc3NlbnYuaCByZWRlZmluZXMgR2V0Q29tbWFuZExpbmUgdG8gR2V0Q29tbWFuZExpbmVXIGlmCi0vLyBVTklDT0RFIGlzIGRlZmluZWQuCi0vLyBUaGlzIGZ1bmN0aW9uIHdhcyBhZGRlZCBzbyB0aGF0IGl0IGNvdWxkIGJlIHVzZWQgYXMgYSB3b3JrIGFyb3VuZCB3aGVuCi0vLyBHZXRDb21tYW5kTGluZSgpIG5lZWRlZCB0byBiZSBjYWxsZWQuCi1jb25zdCBzdGFyYm9hcmQ6OkNvbW1hbmRMaW5lKgotR2V0Q29tbWFuZExpbmVQb2ludGVyKHN0YXJib2FyZDo6QXBwbGljYXRpb24qIGFwcCk7Ci0KLWNsYXNzIEFwcGxpY2F0aW9uVXdwIDogcHVibGljIHNoYXJlZDo6c3RhcmJvYXJkOjpBcHBsaWNhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBBbmFsb2dUaHVtYnN0aWNrVGhyZWFkOjpDYWxsYmFjayB7Ci0gcHVibGljOgotICBBcHBsaWNhdGlvblV3cCgpOwotICB+QXBwbGljYXRpb25Vd3AoKSBvdmVycmlkZTsKLQotICBzdGF0aWMgQXBwbGljYXRpb25Vd3AqIEdldCgpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8QXBwbGljYXRpb25Vd3AqPihzaGFyZWQ6OnN0YXJib2FyZDo6QXBwbGljYXRpb246OkdldCgpKTsKLSAgfQotCi0gIFNiV2luZG93IENyZWF0ZVdpbmRvd0ZvclVXUChjb25zdCBTYldpbmRvd09wdGlvbnMqIG9wdGlvbnMpOwotCi0gIGJvb2wgRGVzdHJveVdpbmRvdyhTYldpbmRvdyB3aW5kb3cpOwotCi0gIHZvaWQgRGlzcGF0Y2hTdGFydCgpIHsgc2hhcmVkOjpzdGFyYm9hcmQ6OkFwcGxpY2F0aW9uOjpEaXNwYXRjaFN0YXJ0KCk7IH0KLQotICAvLyBwdWJsaWMgZm9yIElGcmFtZXdvcmtWaWV3IHN1YmNsYXNzCi0gIHZvaWQgU2V0Q29tbWFuZExpbmUoaW50IGFyZ2MsIGNvbnN0IGNoYXIqKiBhcmd2KSB7Ci0gICAgc2hhcmVkOjpzdGFyYm9hcmQ6OkFwcGxpY2F0aW9uOjpTZXRDb21tYW5kTGluZShhcmdjLCBhcmd2KTsKLSAgfQotCi0gIC8vIHB1YmxpYyBmb3IgSUZyYW1ld29ya1ZpZXcgc3ViY2xhc3MKLSAgYm9vbCBEaXNwYXRjaEFuZERlbGV0ZShBcHBsaWNhdGlvbjo6RXZlbnQqIGV2ZW50KSB7Ci0gICAgcmV0dXJuIHNoYXJlZDo6c3RhcmJvYXJkOjpBcHBsaWNhdGlvbjo6RGlzcGF0Y2hBbmREZWxldGUoZXZlbnQpOwotICB9Ci0KLSAgUGxhdGZvcm06OkFnaWxlPFdpbmRvd3M6OlVJOjpDb3JlOjpDb3JlV2luZG93PiBHZXRDb3JlV2luZG93KCkgY29uc3QgewotICAgIHJldHVybiBjb3JlX3dpbmRvd187Ci0gIH0KLQotICBQbGF0Zm9ybTo6QWdpbGU8V2luZG93czo6VUk6OkNvcmU6OkNvcmVEaXNwYXRjaGVyPiBHZXREaXNwYXRjaGVyKCkgY29uc3QgewotICAgIHJldHVybiBkaXNwYXRjaGVyXzsKLSAgfQotCi0gIFBsYXRmb3JtOjpBZ2lsZTxXaW5kb3dzOjpNZWRpYTo6U3lzdGVtTWVkaWFUcmFuc3BvcnRDb250cm9scz4KLSAgICAgIEdldFRyYW5zcG9ydENvbnRyb2xzKCkgY29uc3QgewotICAgIHJldHVybiB0cmFuc3BvcnRfY29udHJvbHNfOwotICB9Ci0KLSAgLy8gcHVibGljIGZvciBJRnJhbWV3b3JrVmlldyBzdWJjbGFzcwotICB2b2lkIFNldENvcmVXaW5kb3coV2luZG93czo6VUk6OkNvcmU6OkNvcmVXaW5kb3deIHdpbmRvdykgewotICAgIGNvcmVfd2luZG93XyA9IHdpbmRvdzsKLQotICAgIGRpc3BhdGNoZXJfID0gd2luZG93LT5EaXNwYXRjaGVyOwotICAgIHRyYW5zcG9ydF9jb250cm9sc18gPQotICAgICAgICBXaW5kb3dzOjpNZWRpYTo6U3lzdGVtTWVkaWFUcmFuc3BvcnRDb250cm9sczo6R2V0Rm9yQ3VycmVudFZpZXcoKTsKLSAgfQotCi0gIHZvaWQgT25LZXlFdmVudChXaW5kb3dzOjpVSTo6Q29yZTo6Q29yZVdpbmRvd14gc2VuZGVyLAotICAgICAgICAgICAgICAgICAgV2luZG93czo6VUk6OkNvcmU6OktleUV2ZW50QXJnc14gYXJncywKLSAgICAgICAgICAgICAgICAgIGJvb2wgdXApOwotCi0gIHZvaWQgSW5qZWN0KEV2ZW50KiBldmVudCkgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBJbmplY3RLZXlwcmVzcyhTYktleSBrZXkpOwotCi0gIHZvaWQgU2V0U3RhcnRMaW5rKGNvbnN0IGNoYXIqIGxpbmspIHsKLSAgICBzaGFyZWQ6OnN0YXJib2FyZDo6QXBwbGljYXRpb246OlNldFN0YXJ0TGluayhsaW5rKTsKLSAgfQotCi0gIFBsYXRmb3JtOjpTdHJpbmdeIEdldFN0cmluZyhjb25zdCBjaGFyKiBpZCwgY29uc3QgY2hhciogZmFsbGJhY2spIGNvbnN0OwotCi0gIGJvb2wgSXNIZGNwT24oKTsKLSAgLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MuCi0gIGJvb2wgVHVybk9uSGRjcCgpOwotICAvLyBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcy4KLSAgYm9vbCBUdXJuT2ZmSGRjcCgpOwotCi0gIE1pY3Jvc29mdDo6V1JMOjpDb21QdHI8SUQzRDEyRGV2aWNlPiBHZXREM0QxMkRldmljZSgpIHsgcmV0dXJuIGQzZDEyZGV2aWNlXzsgfQotCi0gIHZvaWQgU2V0RDNEMTJEZXZpY2UoY29uc3QgTWljcm9zb2Z0OjpXUkw6OkNvbVB0cjxJRDNEMTJEZXZpY2U+JiBkZXZpY2UpIHsKLSAgICBkM2QxMmRldmljZV8gPSBkZXZpY2U7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIC0tLSBBcHBsaWNhdGlvbiBvdmVycmlkZXMgLS0tCi0gIGJvb2wgSXNTdGFydEltbWVkaWF0ZSgpIG92ZXJyaWRlIHsgcmV0dXJuIGZhbHNlOyB9Ci0gIHZvaWQgSW5pdGlhbGl6ZSgpIG92ZXJyaWRlOwotICB2b2lkIFRlYXJkb3duKCkgb3ZlcnJpZGU7Ci0gIEV2ZW50KiBHZXROZXh0RXZlbnQoKSBvdmVycmlkZTsKLSAgYm9vbCBEaXNwYXRjaE5leHRFdmVudCgpIG92ZXJyaWRlOwotICB2b2lkIEluamVjdFRpbWVkRXZlbnQoVGltZWRFdmVudCogdGltZWRfZXZlbnQpIG92ZXJyaWRlOwotICB2b2lkIENhbmNlbFRpbWVkRXZlbnQoU2JFdmVudElkIGV2ZW50X2lkKSBvdmVycmlkZTsKLSAgVGltZWRFdmVudCogR2V0TmV4dER1ZVRpbWVkRXZlbnQoKSBvdmVycmlkZTsKLSAgU2JUaW1lTW9ub3RvbmljIEdldE5leHRUaW1lZEV2ZW50VGFyZ2V0VGltZSgpIG92ZXJyaWRlOwotCi0gIGludCBkZXZpY2VfaWQoKSBjb25zdCB7IHJldHVybiBkZXZpY2VfaWRfOyB9Ci0gIHZvaWQgT25Kb3lzdGlja1VwZGF0ZShTYktleSBrZXksIFNiSW5wdXRWZWN0b3IgdmFsdWUpIG92ZXJyaWRlOwotCi0gIC8vIFRoZXNlIHR3byBmdW5jdGlvbnMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoaWxlIGhvbGRpbmcKLSAgLy8gfGhkY3Bfc2Vzc2lvbl9tdXRleF98LgotICBXaW5kb3dzOjpNZWRpYTo6UHJvdGVjdGlvbjo6SGRjcFNlc3Npb25eIEdldEhkY3BTZXNzaW9uKCk7Ci0gIHZvaWQgUmVzZXRIZGNwU2Vzc2lvbigpOwotCi0gIC8vIFRoZSBzaW5nbGUgb3BlbiB3aW5kb3csIGlmIGFueS4KLSAgU2JXaW5kb3cgd2luZG93XzsKLSAgUGxhdGZvcm06OkFnaWxlPFdpbmRvd3M6OlVJOjpDb3JlOjpDb3JlV2luZG93PiBjb3JlX3dpbmRvd187Ci0KLSAgUGxhdGZvcm06OkFnaWxlPFdpbmRvd3M6OlVJOjpDb3JlOjpDb3JlRGlzcGF0Y2hlcj4gZGlzcGF0Y2hlcl87Ci0gIFBsYXRmb3JtOjpBZ2lsZTxXaW5kb3dzOjpNZWRpYTo6U3lzdGVtTWVkaWFUcmFuc3BvcnRDb250cm9scz4KLSAgICAgIHRyYW5zcG9ydF9jb250cm9sc187Ci0KLSAgc2hhcmVkOjpzdGFyYm9hcmQ6OkxvY2FsaXplZFN0cmluZ3MgbG9jYWxpemVkX3N0cmluZ3NfOwotCi0gIE11dGV4IG11dGV4XzsKLSAgLy8gfHRpbWVyX2V2ZW50X21hcF98IGlzIGxvY2tlZCBieSB8bXV0ZXhffC4KLSAgc3RkOjp1bm9yZGVyZWRfbWFwPFNiRXZlbnRJZCwgV2luZG93czo6U3lzdGVtOjpUaHJlYWRpbmc6OlRocmVhZFBvb2xUaW1lcl4+Ci0gICAgICB0aW1lcl9ldmVudF9tYXBfOwotCi0gIE1pY3Jvc29mdDo6V1JMOjpDb21QdHI8SUQzRDEyRGV2aWNlPiBkM2QxMmRldmljZV87Ci0gIGludCBkZXZpY2VfaWRfOwotCi0gIC8vIHxoZGNwX3Nlc3Npb25ffCBpcyBsb2NrZWQgYnkgfGhkY3Bfc2Vzc2lvbl9tdXRleF98LgotICBNdXRleCBoZGNwX3Nlc3Npb25fbXV0ZXhfOwotICBXaW5kb3dzOjpNZWRpYTo6UHJvdGVjdGlvbjo6SGRjcFNlc3Npb25eIGhkY3Bfc2Vzc2lvbl87Ci0KLSAgc2NvcGVkX3B0cjxBbmFsb2dUaHVtYnN0aWNrVGhyZWFkPiBhbmFsb2dfdGh1bWJzdGlja190aHJlYWRfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHV3cAotfSAgLy8gbmFtZXNwYWNlIHNoYXJlZAotfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZAotCi0jZW5kaWYgIC8vIFNUQVJCT0FSRF9TSEFSRURfVVdQX0FQUExJQ0FUSU9OX1VXUF9IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL2FwcGxpY2F0aW9uX3V3cF9nZXRfY29tbWFuZGxpbmVfcG9pbnRlci5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9hcHBsaWNhdGlvbl91d3BfZ2V0X2NvbW1hbmRsaW5lX3BvaW50ZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3ZmIxNTcuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL2FwcGxpY2F0aW9uX3V3cF9nZXRfY29tbWFuZGxpbmVfcG9pbnRlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9hcHBsaWNhdGlvbi5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2NvbW1hbmRfbGluZS5oIgotCi1uYW1lc3BhY2Ugc3RhcmJvYXJkIHsKLW5hbWVzcGFjZSBzaGFyZWQgewotbmFtZXNwYWNlIHV3cCB7Ci0KLWNvbnN0IHN0YXJib2FyZDo6Q29tbWFuZExpbmUqCi1HZXRDb21tYW5kTGluZVBvaW50ZXIoc3RhcmJvYXJkOjpBcHBsaWNhdGlvbiogYXBwKSB7Ci0gIHJldHVybiBhcHAtPkdldENvbW1hbmRMaW5lKCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB1d3AKLX0gIC8vIG5hbWVzcGFjZSBzaGFyZWQKLX0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9hcHBsaWNhdGlvbl91d3Bfa2V5X2V2ZW50LmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL2FwcGxpY2F0aW9uX3V3cF9rZXlfZXZlbnQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZTdjMTYuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL2FwcGxpY2F0aW9uX3V3cF9rZXlfZXZlbnQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMTAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvdXdwL2FwcGxpY2F0aW9uX3V3cC5oIgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2V2ZW50LmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL2lucHV0LmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL2tleS5oIgotCi11c2luZyBXaW5kb3dzOjpVSTo6Q29yZTo6Q29yZVdpbmRvdzsKLXVzaW5nIFdpbmRvd3M6OlVJOjpDb3JlOjpLZXlFdmVudEFyZ3M7Ci11c2luZyBXaW5kb3dzOjpVSTo6Q29yZTo6Q29yZVZpcnR1YWxLZXlTdGF0ZXM7Ci11c2luZyBXaW5kb3dzOjpTeXN0ZW06OlZpcnR1YWxLZXk7Ci0KLW5hbWVzcGFjZSB7Ci0KLVNiS2V5IFZpcnR1YWxLZXlUb1NiS2V5KFZpcnR1YWxLZXkga2V5KSB7Ci0vLyBEaXNhYmxlIHdhcm5pbmcgZm9yIEludmFsaWQgdmFsaWQgdmFsdWVzIGZyb20gc3dpdGNoIG9mIGVudW0uCi0jcHJhZ21hIHdhcm5pbmcocHVzaCkKLSNwcmFnbWEgd2FybmluZyhkaXNhYmxlIDogNDA2MykKLSAgc3dpdGNoIChrZXkpIHsKLSAgICBjYXNlIFZpcnR1YWxLZXk6Ok5vbmU6Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpOYXZpZ2F0aW9uVmlldzoKLSAgICBjYXNlIFZpcnR1YWxLZXk6Ok5hdmlnYXRpb25NZW51OgotICAgIGNhc2UgVmlydHVhbEtleTo6TmF2aWdhdGlvblVwOgotICAgIGNhc2UgVmlydHVhbEtleTo6TmF2aWdhdGlvbkRvd246Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpOYXZpZ2F0aW9uTGVmdDoKLSAgICBjYXNlIFZpcnR1YWxLZXk6Ok5hdmlnYXRpb25SaWdodDoKLSAgICBjYXNlIFZpcnR1YWxLZXk6Ok5hdmlnYXRpb25BY2NlcHQ6Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpOYXZpZ2F0aW9uQ2FuY2VsOgotICAgICAgcmV0dXJuIGtTYktleVVua25vd247Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpDYW5jZWw6IHJldHVybiBrU2JLZXlDYW5jZWw7Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpCYWNrOiByZXR1cm4ga1NiS2V5QmFjazsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OlRhYjogcmV0dXJuIGtTYktleVRhYjsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OkNsZWFyOiByZXR1cm4ga1NiS2V5Q2xlYXI7Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpFbnRlcjogcmV0dXJuIGtTYktleVJldHVybjsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OlNoaWZ0OiByZXR1cm4ga1NiS2V5U2hpZnQ7Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpDb250cm9sOiByZXR1cm4ga1NiS2V5Q29udHJvbDsKLSAgICBjYXNlIFZpcnR1YWxLZXk6Ok1lbnU6IHJldHVybiBrU2JLZXlNZW51OwotICAgIGNhc2UgVmlydHVhbEtleTo6UGF1c2U6IHJldHVybiBrU2JLZXlQYXVzZTsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OkNhcGl0YWxMb2NrOiByZXR1cm4ga1NiS2V5Q2FwaXRhbDsKLSAgICAvLyBIYW5ndWwgYW5kIEthbmEgaGF2ZSB0aGUgc2FtZSBWaXJ0dWFsS2V5IGNvbnN0YW50Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpLYW5hOiByZXR1cm4ga1NiS2V5S2FuYTsKLSAgICBjYXNlIFZpcnR1YWxLZXk6Okp1bmphOiByZXR1cm4ga1NiS2V5SnVuamE7Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpGaW5hbDogcmV0dXJuIGtTYktleUZpbmFsOwotICAgIC8vIEhhbmphIGFuZCBLYW5qaSBoYXZlIHRoZSBzYW1lIFZpcnR1YWxLZXkgY29uc3RhbnQKLSAgICBjYXNlIFZpcnR1YWxLZXk6OkhhbmphOiByZXR1cm4ga1NiS2V5SGFuamE7Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpFc2NhcGU6IHJldHVybiBrU2JLZXlFc2NhcGU7Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpDb252ZXJ0OiByZXR1cm4ga1NiS2V5Q29udmVydDsKLSAgICBjYXNlIFZpcnR1YWxLZXk6Ok5vbkNvbnZlcnQ6IHJldHVybiBrU2JLZXlOb25jb252ZXJ0OwotICAgIGNhc2UgVmlydHVhbEtleTo6QWNjZXB0OiByZXR1cm4ga1NiS2V5QWNjZXB0OwotICAgIGNhc2UgVmlydHVhbEtleTo6TW9kZUNoYW5nZTogcmV0dXJuIGtTYktleU1vZGVjaGFuZ2U7Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpTcGFjZTogcmV0dXJuIGtTYktleVNwYWNlOwotICAgIGNhc2UgVmlydHVhbEtleTo6UGFnZVVwOiByZXR1cm4ga1NiS2V5UHJpb3I7Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpQYWdlRG93bjogcmV0dXJuIGtTYktleU5leHQ7Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpFbmQ6IHJldHVybiBrU2JLZXlFbmQ7Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpIb21lOiByZXR1cm4ga1NiS2V5SG9tZTsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OkxlZnQ6IHJldHVybiBrU2JLZXlMZWZ0OwotICAgIGNhc2UgVmlydHVhbEtleTo6VXA6IHJldHVybiBrU2JLZXlVcDsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OlJpZ2h0OiByZXR1cm4ga1NiS2V5UmlnaHQ7Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpEb3duOiByZXR1cm4ga1NiS2V5RG93bjsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OlNlbGVjdDogcmV0dXJuIGtTYktleVNlbGVjdDsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OlByaW50OiByZXR1cm4ga1NiS2V5UHJpbnQ7Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpFeGVjdXRlOiByZXR1cm4ga1NiS2V5RXhlY3V0ZTsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OlNuYXBzaG90OiByZXR1cm4ga1NiS2V5U25hcHNob3Q7Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpJbnNlcnQ6IHJldHVybiBrU2JLZXlJbnNlcnQ7Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpEZWxldGU6IHJldHVybiBrU2JLZXlEZWxldGU7Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpOdW1iZXIwOiByZXR1cm4ga1NiS2V5MDsKLSAgICBjYXNlIFZpcnR1YWxLZXk6Ok51bWJlcjE6IHJldHVybiBrU2JLZXkxOwotICAgIGNhc2UgVmlydHVhbEtleTo6TnVtYmVyMjogcmV0dXJuIGtTYktleTI7Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpOdW1iZXIzOiByZXR1cm4ga1NiS2V5MzsKLSAgICBjYXNlIFZpcnR1YWxLZXk6Ok51bWJlcjQ6IHJldHVybiBrU2JLZXk0OwotICAgIGNhc2UgVmlydHVhbEtleTo6TnVtYmVyNTogcmV0dXJuIGtTYktleTU7Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpOdW1iZXI2OiByZXR1cm4ga1NiS2V5NjsKLSAgICBjYXNlIFZpcnR1YWxLZXk6Ok51bWJlcjc6IHJldHVybiBrU2JLZXk3OwotICAgIGNhc2UgVmlydHVhbEtleTo6TnVtYmVyODogcmV0dXJuIGtTYktleTg7Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpOdW1iZXI5OiByZXR1cm4ga1NiS2V5OTsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OkE6IHJldHVybiBrU2JLZXlBOwotICAgIGNhc2UgVmlydHVhbEtleTo6QjogcmV0dXJuIGtTYktleUI7Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpDOiByZXR1cm4ga1NiS2V5QzsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OkQ6IHJldHVybiBrU2JLZXlEOwotICAgIGNhc2UgVmlydHVhbEtleTo6RTogcmV0dXJuIGtTYktleUU7Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpGOiByZXR1cm4ga1NiS2V5RjsKLSAgICBjYXNlIFZpcnR1YWxLZXk6Okc6IHJldHVybiBrU2JLZXlHOwotICAgIGNhc2UgVmlydHVhbEtleTo6SDogcmV0dXJuIGtTYktleUg7Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpJOiByZXR1cm4ga1NiS2V5STsKLSAgICBjYXNlIFZpcnR1YWxLZXk6Oko6IHJldHVybiBrU2JLZXlKOwotICAgIGNhc2UgVmlydHVhbEtleTo6SzogcmV0dXJuIGtTYktleUs7Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpMOiByZXR1cm4ga1NiS2V5TDsKLSAgICBjYXNlIFZpcnR1YWxLZXk6Ok06IHJldHVybiBrU2JLZXlNOwotICAgIGNhc2UgVmlydHVhbEtleTo6TjogcmV0dXJuIGtTYktleU47Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpPOiByZXR1cm4ga1NiS2V5TzsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OlA6IHJldHVybiBrU2JLZXlQOwotICAgIGNhc2UgVmlydHVhbEtleTo6UTogcmV0dXJuIGtTYktleVE7Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpSOiByZXR1cm4ga1NiS2V5UjsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OlM6IHJldHVybiBrU2JLZXlTOwotICAgIGNhc2UgVmlydHVhbEtleTo6VDogcmV0dXJuIGtTYktleVQ7Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpVOiByZXR1cm4ga1NiS2V5VTsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OlY6IHJldHVybiBrU2JLZXlWOwotICAgIGNhc2UgVmlydHVhbEtleTo6VzogcmV0dXJuIGtTYktleVc7Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpYOiByZXR1cm4ga1NiS2V5WDsKLSAgICBjYXNlIFZpcnR1YWxLZXk6Olk6IHJldHVybiBrU2JLZXlZOwotICAgIGNhc2UgVmlydHVhbEtleTo6WjogcmV0dXJuIGtTYktleVo7Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpMZWZ0V2luZG93czogcmV0dXJuIGtTYktleUx3aW47Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpSaWdodFdpbmRvd3M6IHJldHVybiBrU2JLZXlSd2luOwotICAgIGNhc2UgVmlydHVhbEtleTo6QXBwbGljYXRpb246IHJldHVybiBrU2JLZXlBcHBzOwotICAgIGNhc2UgVmlydHVhbEtleTo6U2xlZXA6IHJldHVybiBrU2JLZXlTbGVlcDsKLSAgICBjYXNlIFZpcnR1YWxLZXk6Ok51bWJlclBhZDA6IHJldHVybiBrU2JLZXlOdW1wYWQwOwotICAgIGNhc2UgVmlydHVhbEtleTo6TnVtYmVyUGFkMTogcmV0dXJuIGtTYktleU51bXBhZDE7Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpOdW1iZXJQYWQyOiByZXR1cm4ga1NiS2V5TnVtcGFkMjsKLSAgICBjYXNlIFZpcnR1YWxLZXk6Ok51bWJlclBhZDM6IHJldHVybiBrU2JLZXlOdW1wYWQzOwotICAgIGNhc2UgVmlydHVhbEtleTo6TnVtYmVyUGFkNDogcmV0dXJuIGtTYktleU51bXBhZDQ7Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpOdW1iZXJQYWQ1OiByZXR1cm4ga1NiS2V5TnVtcGFkNTsKLSAgICBjYXNlIFZpcnR1YWxLZXk6Ok51bWJlclBhZDY6IHJldHVybiBrU2JLZXlOdW1wYWQ2OwotICAgIGNhc2UgVmlydHVhbEtleTo6TnVtYmVyUGFkNzogcmV0dXJuIGtTYktleU51bXBhZDc7Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpOdW1iZXJQYWQ4OiByZXR1cm4ga1NiS2V5TnVtcGFkODsKLSAgICBjYXNlIFZpcnR1YWxLZXk6Ok51bWJlclBhZDk6IHJldHVybiBrU2JLZXlOdW1wYWQ5OwotICAgIGNhc2UgVmlydHVhbEtleTo6TXVsdGlwbHk6IHJldHVybiBrU2JLZXlNdWx0aXBseTsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OkFkZDogcmV0dXJuIGtTYktleUFkZDsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OlNlcGFyYXRvcjogcmV0dXJuIGtTYktleVNlcGFyYXRvcjsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OlN1YnRyYWN0OiByZXR1cm4ga1NiS2V5U3VidHJhY3Q7Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpEZWNpbWFsOiByZXR1cm4ga1NiS2V5RGVjaW1hbDsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OkRpdmlkZTogcmV0dXJuIGtTYktleURpdmlkZTsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OkYxOiByZXR1cm4ga1NiS2V5RjE7Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpGMjogcmV0dXJuIGtTYktleUYyOwotICAgIGNhc2UgVmlydHVhbEtleTo6RjM6IHJldHVybiBrU2JLZXlGMzsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OkY0OiByZXR1cm4ga1NiS2V5RjQ7Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpGNTogcmV0dXJuIGtTYktleUY1OwotICAgIGNhc2UgVmlydHVhbEtleTo6RjY6IHJldHVybiBrU2JLZXlGNjsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OkY3OiByZXR1cm4ga1NiS2V5Rjc7Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpGODogcmV0dXJuIGtTYktleUY4OwotICAgIGNhc2UgVmlydHVhbEtleTo6Rjk6IHJldHVybiBrU2JLZXlGOTsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OkYxMDogcmV0dXJuIGtTYktleUYxMDsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OkYxMTogcmV0dXJuIGtTYktleUYxMTsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OkYxMjogcmV0dXJuIGtTYktleUYxMjsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OkYxMzogcmV0dXJuIGtTYktleUYxMzsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OkYxNDogcmV0dXJuIGtTYktleUYxNDsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OkYxNTogcmV0dXJuIGtTYktleUYxNTsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OkYxNjogcmV0dXJuIGtTYktleUYxNjsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OkYxNzogcmV0dXJuIGtTYktleUYxNzsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OkYxODogcmV0dXJuIGtTYktleUYxODsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OkYxOTogcmV0dXJuIGtTYktleUYxOTsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OkYyMDogcmV0dXJuIGtTYktleUYyMDsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OkYyMTogcmV0dXJuIGtTYktleUYyMTsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OkYyMjogcmV0dXJuIGtTYktleUYyMjsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OkYyMzogcmV0dXJuIGtTYktleUYyMzsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OkYyNDogcmV0dXJuIGtTYktleUYyNDsKLSAgICAvLyBTYktleXMgd2VyZSBvcmlnaW5hbGx5IG1vZGVsZWQgYWZ0ZXIgdGhlIHdpbmRvd3MgdmlydHVhbCBrZXkgbWFwcGluZ3MgWzFdLgotICAgIC8vIFVXUCBWaXJ0dWFsS2V5IHVzZXMgYSB2ZXJ5IHNpbWlsYXIgbWFwcGluZywgYnV0IHRoZSBVV1AgZW51bSBkb2VzIG5vdAotICAgIC8vIGNvbnRhaW4gYWxsIG9mIHRoZSBWaXJ0dWFsLUtleSBDb2Rlcy4KLSAgICAvLyBbMV0gaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS93aW5kb3dzL2Rlc2t0b3AvZGQzNzU3MzElMjh2PXZzLjg1JTI5LmFzcHgKLSAgICBjYXNlIDB4QkE6IHJldHVybiBrU2JLZXlPZW0xOyAgLy8gVXNlZCBmb3IgIjs6IiBrZXkgd2l0aCBVUyBrZXlib2FyZHMuCi0gICAgY2FzZSAweEJCOiByZXR1cm4ga1NiS2V5T2VtUGx1czsKLSAgICBjYXNlIDB4QkM6IHJldHVybiBrU2JLZXlPZW1Db21tYTsKLSAgICBjYXNlIDB4QkQ6IHJldHVybiBrU2JLZXlPZW1NaW51czsKLSAgICBjYXNlIDB4QkU6IHJldHVybiBrU2JLZXlPZW1QZXJpb2Q7Ci0gICAgY2FzZSAweEJGOiByZXR1cm4ga1NiS2V5T2VtMjsgIC8vIFVzZWQgZm9yICIvPyIga2V5IHdpdGggVVMga2V5Ym9hcmRzLgotICAgIGNhc2UgMHhDMDogcmV0dXJuIGtTYktleU9lbTM7ICAvLyBVc2VkIGZvciAifiIgd2l0aCBVUyBrZXlib2FyZHMuCi0gICAgY2FzZSAweERCOiByZXR1cm4ga1NiS2V5T2VtNDsgIC8vIFVzZWQgZm9yICJbeyIgd2l0aCBVUyBrZXlib2FyZHMuCi0gICAgY2FzZSAweERDOiByZXR1cm4ga1NiS2V5T2VtNTsgIC8vIFVzZWQgZm9yICJcfCIgd2l0aCBVUyBrZXlib2FyZHMuCi0gICAgY2FzZSAweEREOiByZXR1cm4ga1NiS2V5T2VtNjsgIC8vIFVzZWQgZm9yICJdfSIgd2l0aCBVUyBrZXlib2FyZHMuCi0gICAgY2FzZSAweERFOiByZXR1cm4ga1NiS2V5T2VtNzsgIC8vIFVzZWQgZm9yIHF1b3RlcyB3aXRoIFVTIGtleWJvYXJkcy4KLSAgICBjYXNlIDB4REY6IHJldHVybiBrU2JLZXlPZW04OyAgLy8gVXNlZCBmb3IgbWlzYy4gY2hhcnMgd2l0aCBVUyBrZXlib2FyZHMuCi0gICAgY2FzZSAweEUyOiByZXR1cm4ga1NiS2V5T2VtMTAyOyAgLy8gVXNlZCBmb3IgIi8iIG9yIGFuZ2xlIGJyYWNrZXQga2V5cy4KLSAgICBjYXNlIFZpcnR1YWxLZXk6Ok51bWJlcktleUxvY2s6IHJldHVybiBrU2JLZXlOdW1sb2NrOwotICAgIGNhc2UgVmlydHVhbEtleTo6U2Nyb2xsOiByZXR1cm4ga1NiS2V5U2Nyb2xsOwotICAgIGNhc2UgVmlydHVhbEtleTo6TGVmdFNoaWZ0OiByZXR1cm4ga1NiS2V5THNoaWZ0OwotICAgIGNhc2UgVmlydHVhbEtleTo6UmlnaHRTaGlmdDogcmV0dXJuIGtTYktleVJzaGlmdDsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OkxlZnRDb250cm9sOiByZXR1cm4ga1NiS2V5TGNvbnRyb2w7Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpSaWdodENvbnRyb2w6IHJldHVybiBrU2JLZXlSY29udHJvbDsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OkxlZnRNZW51OiByZXR1cm4ga1NiS2V5TG1lbnU7Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpSaWdodE1lbnU6IHJldHVybiBrU2JLZXlSbWVudTsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OkdvQmFjazogcmV0dXJuIGtTYktleUJyb3dzZXJCYWNrOwotICAgIGNhc2UgVmlydHVhbEtleTo6R29Gb3J3YXJkOiByZXR1cm4ga1NiS2V5QnJvd3NlckZvcndhcmQ7Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpSZWZyZXNoOiByZXR1cm4ga1NiS2V5QnJvd3NlclJlZnJlc2g7Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpTdG9wOiByZXR1cm4ga1NiS2V5QnJvd3NlclN0b3A7Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpTZWFyY2g6IHJldHVybiBrU2JLZXlCcm93c2VyU2VhcmNoOwotICAgIGNhc2UgVmlydHVhbEtleTo6RmF2b3JpdGVzOiByZXR1cm4ga1NiS2V5QnJvd3NlckZhdm9yaXRlczsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OkdvSG9tZTogcmV0dXJuIGtTYktleUJyb3dzZXJIb21lOwotICAgIGNhc2UgVmlydHVhbEtleTo6TGVmdEJ1dHRvbjogcmV0dXJuIGtTYktleU1vdXNlMTsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OlJpZ2h0QnV0dG9uOiByZXR1cm4ga1NiS2V5TW91c2UyOwotICAgIGNhc2UgVmlydHVhbEtleTo6TWlkZGxlQnV0dG9uOiByZXR1cm4ga1NiS2V5TW91c2UzOwotICAgIGNhc2UgVmlydHVhbEtleTo6WEJ1dHRvbjE6IHJldHVybiBrU2JLZXlNb3VzZTQ7Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpYQnV0dG9uMjogcmV0dXJuIGtTYktleU1vdXNlNTsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OkdhbWVwYWRBOiByZXR1cm4ga1NiS2V5R2FtZXBhZDE7Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpHYW1lcGFkQjogcmV0dXJuIGtTYktleUdhbWVwYWQyOwotICAgIGNhc2UgVmlydHVhbEtleTo6R2FtZXBhZFg6IHJldHVybiBrU2JLZXlHYW1lcGFkMzsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OkdhbWVwYWRZOiByZXR1cm4ga1NiS2V5R2FtZXBhZDQ7Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpHYW1lcGFkUmlnaHRTaG91bGRlcjogcmV0dXJuIGtTYktleUdhbWVwYWRSaWdodEJ1bXBlcjsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OkdhbWVwYWRMZWZ0U2hvdWxkZXI6IHJldHVybiBrU2JLZXlHYW1lcGFkTGVmdEJ1bXBlcjsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OkdhbWVwYWRMZWZ0VHJpZ2dlcjogcmV0dXJuIGtTYktleUdhbWVwYWRMZWZ0VHJpZ2dlcjsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OkdhbWVwYWRSaWdodFRyaWdnZXI6IHJldHVybiBrU2JLZXlHYW1lcGFkUmlnaHRUcmlnZ2VyOwotICAgIGNhc2UgVmlydHVhbEtleTo6R2FtZXBhZERQYWRVcDogcmV0dXJuIGtTYktleUdhbWVwYWREUGFkVXA7Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpHYW1lcGFkRFBhZERvd246IHJldHVybiBrU2JLZXlHYW1lcGFkRFBhZERvd247Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpHYW1lcGFkRFBhZExlZnQ6IHJldHVybiBrU2JLZXlHYW1lcGFkRFBhZExlZnQ7Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpHYW1lcGFkRFBhZFJpZ2h0OiByZXR1cm4ga1NiS2V5R2FtZXBhZERQYWRSaWdodDsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OkdhbWVwYWRNZW51OiByZXR1cm4ga1NiS2V5R2FtZXBhZDY7Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpHYW1lcGFkVmlldzogcmV0dXJuIGtTYktleUdhbWVwYWQ1OwotICAgIGNhc2UgVmlydHVhbEtleTo6R2FtZXBhZExlZnRUaHVtYnN0aWNrQnV0dG9uOgotICAgICAgcmV0dXJuIGtTYktleUdhbWVwYWRMZWZ0U3RpY2s7Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpHYW1lcGFkUmlnaHRUaHVtYnN0aWNrQnV0dG9uOgotICAgICAgcmV0dXJuIGtTYktleUdhbWVwYWRSaWdodFN0aWNrOwotICAgIGNhc2UgVmlydHVhbEtleTo6R2FtZXBhZExlZnRUaHVtYnN0aWNrVXA6Ci0gICAgICByZXR1cm4ga1NiS2V5R2FtZXBhZExlZnRTdGlja1VwOwotICAgIGNhc2UgVmlydHVhbEtleTo6R2FtZXBhZExlZnRUaHVtYnN0aWNrRG93bjoKLSAgICAgIHJldHVybiBrU2JLZXlHYW1lcGFkTGVmdFN0aWNrRG93bjsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OkdhbWVwYWRMZWZ0VGh1bWJzdGlja1JpZ2h0OgotICAgICAgcmV0dXJuIGtTYktleUdhbWVwYWRMZWZ0U3RpY2tSaWdodDsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OkdhbWVwYWRMZWZ0VGh1bWJzdGlja0xlZnQ6Ci0gICAgICByZXR1cm4ga1NiS2V5R2FtZXBhZExlZnRTdGlja0xlZnQ7Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpHYW1lcGFkUmlnaHRUaHVtYnN0aWNrVXA6Ci0gICAgICByZXR1cm4ga1NiS2V5R2FtZXBhZFJpZ2h0U3RpY2tVcDsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OkdhbWVwYWRSaWdodFRodW1ic3RpY2tEb3duOgotICAgICAgcmV0dXJuIGtTYktleUdhbWVwYWRSaWdodFN0aWNrRG93bjsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OkdhbWVwYWRSaWdodFRodW1ic3RpY2tSaWdodDoKLSAgICAgIHJldHVybiBrU2JLZXlHYW1lcGFkUmlnaHRTdGlja1JpZ2h0OwotICAgIGNhc2UgVmlydHVhbEtleTo6R2FtZXBhZFJpZ2h0VGh1bWJzdGlja0xlZnQ6Ci0gICAgICByZXR1cm4ga1NiS2V5R2FtZXBhZFJpZ2h0U3RpY2tMZWZ0OwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4ga1NiS2V5VW5rbm93bjsKLSAgfQotI3ByYWdtYSB3YXJuaW5nKHBvcCkgIC8vIFdhcm5pbmcgNDA5MyAoSW52YWxpZCB2YWxpZCB2YWx1ZXMgZnJvbSBzd2l0Y2ggb2YgZW51bSkKLX0KLQotLy8gUmV0dXJucyB0cnVlIGlmIGEgZ2l2ZW4gVmlydHVhbEtleSBpcyBjdXJyZW50bHkgYmVpbmcgaGVsZCBkb3duLgotYm9vbCBJc0Rvd24oQ29yZVdpbmRvd14gc2VuZGVyLCBWaXJ0dWFsS2V5IGtleSkgewotICByZXR1cm4gKChzZW5kZXItPkdldEtleVN0YXRlKGtleSkgJiBDb3JlVmlydHVhbEtleVN0YXRlczo6RG93bikgPT0KLSAgICAgICAgICBDb3JlVmlydHVhbEtleVN0YXRlczo6RG93bik7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2Ugc3RhcmJvYXJkIHsKLW5hbWVzcGFjZSBzaGFyZWQgewotbmFtZXNwYWNlIHV3cCB7Ci0KLXZvaWQgQXBwbGljYXRpb25Vd3A6Ok9uS2V5RXZlbnQoCi0gICAgQ29yZVdpbmRvd14gc2VuZGVyLCBLZXlFdmVudEFyZ3NeIGFyZ3MsIGJvb2wgdXApIHsKLSAgYXJncy0+SGFuZGxlZCA9IHRydWU7Ci0gIFNiSW5wdXREYXRhKiBkYXRhID0gbmV3IFNiSW5wdXREYXRhKCk7Ci0gIFNiTWVtb3J5U2V0KGRhdGEsIDAsIHNpemVvZigqZGF0YSkpOwotCi0gIGRhdGEtPndpbmRvdyA9IHdpbmRvd187Ci0gIGRhdGEtPmRldmljZV90eXBlID0ga1NiSW5wdXREZXZpY2VUeXBlS2V5Ym9hcmQ7Ci0gIGRhdGEtPmRldmljZV9pZCA9IGRldmljZV9pZCgpOwotICBkYXRhLT5rZXkgPSBWaXJ0dWFsS2V5VG9TYktleShhcmdzLT5WaXJ0dWFsS2V5KTsKLQotICBpZiAodXApIHsKLSAgICBkYXRhLT50eXBlID0ga1NiSW5wdXRFdmVudFR5cGVVbnByZXNzOwotICB9IGVsc2UgewotICAgIGRhdGEtPnR5cGUgPSBrU2JJbnB1dEV2ZW50VHlwZVByZXNzOwotICB9Ci0KLSAgLy8gQnVpbGQgdXAga2V5X21vZGlmaWVycwotICBpZiAoSXNEb3duKHNlbmRlciwgVmlydHVhbEtleTo6TWVudSkgfHwKLSAgICAgIElzRG93bihzZW5kZXIsIFZpcnR1YWxLZXk6OkxlZnRNZW51KSB8fAotICAgICAgSXNEb3duKHNlbmRlciwgVmlydHVhbEtleTo6UmlnaHRNZW51KSkgewotICAgIGRhdGEtPmtleV9tb2RpZmllcnMgfD0ga1NiS2V5TW9kaWZpZXJzQWx0OwotICB9Ci0gIGlmIChJc0Rvd24oc2VuZGVyLCBWaXJ0dWFsS2V5OjpDb250cm9sKSB8fAotICAgICAgSXNEb3duKHNlbmRlciwgVmlydHVhbEtleTo6TGVmdENvbnRyb2wpIHx8Ci0gICAgICBJc0Rvd24oc2VuZGVyLCBWaXJ0dWFsS2V5OjpSaWdodENvbnRyb2wpKSB7Ci0gICAgZGF0YS0+a2V5X21vZGlmaWVycyB8PSBrU2JLZXlNb2RpZmllcnNDdHJsOwotICB9Ci0gIGlmIChJc0Rvd24oc2VuZGVyLCBWaXJ0dWFsS2V5OjpMZWZ0V2luZG93cykgfHwKLSAgICAgIElzRG93bihzZW5kZXIsIFZpcnR1YWxLZXk6OlJpZ2h0V2luZG93cykpIHsKLSAgICBkYXRhLT5rZXlfbW9kaWZpZXJzIHw9IGtTYktleU1vZGlmaWVyc01ldGE7Ci0gIH0KLSAgaWYgKElzRG93bihzZW5kZXIsIFZpcnR1YWxLZXk6OlNoaWZ0KSB8fAotICAgICAgSXNEb3duKHNlbmRlciwgVmlydHVhbEtleTo6TGVmdFNoaWZ0KSB8fAotICAgICAgSXNEb3duKHNlbmRlciwgVmlydHVhbEtleTo6UmlnaHRTaGlmdCkpIHsKLSAgICBkYXRhLT5rZXlfbW9kaWZpZXJzIHw9IGtTYktleU1vZGlmaWVyc1NoaWZ0OwotICB9Ci0KLSAgLy8gU2V0IGtleV9sb2NhdGlvbgotICBzd2l0Y2ggKGFyZ3MtPlZpcnR1YWxLZXkpIHsKLSAgICBjYXNlIFZpcnR1YWxLZXk6OkxlZnRNZW51OgotICAgIGNhc2UgVmlydHVhbEtleTo6TGVmdENvbnRyb2w6Ci0gICAgY2FzZSBWaXJ0dWFsS2V5OjpMZWZ0V2luZG93czoKLSAgICBjYXNlIFZpcnR1YWxLZXk6OkxlZnRTaGlmdDoKLSAgICAgIGRhdGEtPmtleV9sb2NhdGlvbiA9IGtTYktleUxvY2F0aW9uTGVmdDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVmlydHVhbEtleTo6UmlnaHRNZW51OgotICAgIGNhc2UgVmlydHVhbEtleTo6UmlnaHRDb250cm9sOgotICAgIGNhc2UgVmlydHVhbEtleTo6UmlnaHRXaW5kb3dzOgotICAgIGNhc2UgVmlydHVhbEtleTo6UmlnaHRTaGlmdDoKLSAgICAgIGRhdGEtPmtleV9sb2NhdGlvbiA9IGtTYktleUxvY2F0aW9uUmlnaHQ7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLQotICBEaXNwYXRjaEFuZERlbGV0ZShuZXcgRXZlbnQoa1NiRXZlbnRUeXBlSW5wdXQsIGRhdGEsCi0gICAgICAmQXBwbGljYXRpb246OkRlbGV0ZURlc3RydWN0b3I8U2JJbnB1dERhdGE+KSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB1d3AKLX0gIC8vIG5hbWVzcGFjZSBzaGFyZWQKLX0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9hc3luY191dGlscy5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL2FzeW5jX3V0aWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNGQ0ZTcuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL2FzeW5jX3V0aWxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaWZuZGVmIFNUQVJCT0FSRF9TSEFSRURfVVdQX0FTWU5DX1VUSUxTX0hfCi0jZGVmaW5lIFNUQVJCT0FSRF9TSEFSRURfVVdQX0FTWU5DX1VUSUxTX0hfCi0KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLSNpbmNsdWRlIDxwcGx0YXNrcy5oPgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotCi11c2luZyBXaW5kb3dzOjpGb3VuZGF0aW9uOjpJQXN5bmNPcGVyYXRpb247Ci0KLW5hbWVzcGFjZSBzdGFyYm9hcmQgewotbmFtZXNwYWNlIHNoYXJlZCB7Ci1uYW1lc3BhY2UgdXdwIHsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFRSZXN1bHQ+Ci1UUmVzdWx0IFdhaXRGb3JSZXN1bHQoSUFzeW5jT3BlcmF0aW9uPFRSZXN1bHQ+XiBvcGVyYXRpb24pIHsKLSAgdXNpbmcgY29uY3VycmVuY3k6OnRhc2tfY29udGludWF0aW9uX2NvbnRleHQ7Ci0gIEhBTkRMRSBldmVudCA9IENyZWF0ZUV2ZW50KG51bGxwdHIsIFRSVUUsIEZBTFNFLCBudWxscHRyKTsKLSAgY29uY3VycmVuY3k6OmNyZWF0ZV90YXNrKG9wZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tfY29udGludWF0aW9uX2NvbnRleHQ6OnVzZV9hcmJpdHJhcnkoKSkKLSAgICAgIC50aGVuKFsmZXZlbnRdKFRSZXN1bHQgcmVzdWx0KSB7Ci0gICAgICAgIFNCX1VOUkVGRVJFTkNFRF9QQVJBTUVURVIocmVzdWx0KTsKLSAgICAgICAgQk9PTCBzdWNjZXNzID0gU2V0RXZlbnQoZXZlbnQpOwotICAgICAgICBTQl9EQ0hFQ0soc3VjY2Vzcyk7Ci0gICAgICB9LCB0YXNrX2NvbnRpbnVhdGlvbl9jb250ZXh0Ojp1c2VfYXJiaXRyYXJ5KCkpOwotICBEV09SRCByZXR1cm5fdmFsdWUgPSBXYWl0Rm9yU2luZ2xlT2JqZWN0KGV2ZW50LCBJTkZJTklURSk7Ci0gIFNCX0RDSEVDSyhyZXR1cm5fdmFsdWUgPT0gV0FJVF9PQkpFQ1RfMCk7Ci0gIENsb3NlSGFuZGxlKGV2ZW50KTsKLSAgcmV0dXJuIG9wZXJhdGlvbi0+R2V0UmVzdWx0cygpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgdXdwCi19ICAvLyBuYW1lc3BhY2Ugc2hhcmVkCi19ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCi0KLSNlbmRpZiAgLy8gU1RBUkJPQVJEX1NIQVJFRF9VV1BfQVNZTkNfVVRJTFNfSF8KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9jb2JhbHQvY29iYWx0X3BsYXRmb3JtLmd5cCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9jb2JhbHQvY29iYWx0X3BsYXRmb3JtLmd5cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU1NmYxMy4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC91d3AvY29iYWx0L2NvYmFsdF9wbGF0Zm9ybS5neXAKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0jIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXsKLSAgJ3ZhcmlhYmxlcyc6IHsKLSAgICAnc2JfcGVkYW50aWNfd2FybmluZ3MnOiAxLAotICB9LAotICAndGFyZ2V0cyc6IFsKLSAgICB7Ci0gICAgICAndGFyZ2V0X25hbWUnOiAnY29iYWx0X3BsYXRmb3JtJywKLSAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKLSAgICAgICdzb3VyY2VzJzogWwotICAgICAgICAneGIxX21lZGlhX3Nlc3Npb25fY2xpZW50LmNjJywKLSAgICAgICAgJ3hiMV9tZWRpYV9zZXNzaW9uX2NsaWVudC5oJywKLSAgICAgICAgJ3hiMV9tZWRpYV9zZXNzaW9uX3VwZGF0ZXMuY2MnLAotICAgICAgICAneGhyX21vZGlmeV9oZWFkZXJzLmNjJywKLSAgICAgIF0sCi0gICAgICAnZGVwZW5kZW5jaWVzJzogWwotICAgICAgICAnPChERVBUSCkvY29iYWx0L21lZGlhX3Nlc3Npb24vbWVkaWFfc2Vzc2lvbi5neXA6bWVkaWFfc2Vzc2lvbicsCi0gICAgICBdLAotICAgICAgJ21zdnNfc2V0dGluZ3MnOiB7Ci0gICAgICAgICdWQ0NMQ29tcGlsZXJUb29sJzogewotICAgICAgICAgICdBZGRpdGlvbmFsT3B0aW9ucyc6IFsKLSAgICAgICAgICAnL1pXJywgICAgICAgICAgICMgV2luZG93cyBSdW50aW1lCi0gICAgICAgICAgJy9aVzpub3N0ZGxpYicsICAjIFdpbmRvd3MgUnVudGltZSwgbm8gZGVmYXVsdCAjdXNpbmcKLSAgICAgICAgICAnL0VIc2MnLCAgICAgICAgICMgQysrIGV4Y2VwdGlvbnMgKHJlcXVpcmVkIHdpdGggL1pXKQotICAgICAgICAgICcvRlUiPCh2aXN1YWxfc3R1ZGlvX2luc3RhbGxfcGF0aCkvbGliL3g4Ni9zdG9yZS9yZWZlcmVuY2VzL3BsYXRmb3JtLndpbm1kIicsCi0gICAgICAgICAgJy9GVSI8KHdpbmRvd3Nfc2RrX3BhdGgpL1JlZmVyZW5jZXMvPCh3aW5kb3dzX3Nka192ZXJzaW9uKS9XaW5kb3dzLkZvdW5kYXRpb24uRm91bmRhdGlvbkNvbnRyYWN0LzMuMC4wLjAvV2luZG93cy5Gb3VuZGF0aW9uLkZvdW5kYXRpb25Db250cmFjdC53aW5tZCInLAotICAgICAgICAgICcvRlUiPCh3aW5kb3dzX3Nka19wYXRoKS9SZWZlcmVuY2VzLzwod2luZG93c19zZGtfdmVyc2lvbikvV2luZG93cy5Gb3VuZGF0aW9uLlVuaXZlcnNhbEFwaUNvbnRyYWN0LzQuMC4wLjAvV2luZG93cy5Gb3VuZGF0aW9uLlVuaXZlcnNhbEFwaUNvbnRyYWN0Lndpbm1kIicsCi0gICAgICAgICAgXSwKLSAgICAgICAgfSwKLSAgICAgIH0sCi0gICAgICAnZGVmaW5lcyc6IFsKLSAgICAgICAgIyBWUzIwMTcgYWx3YXlzIGRlZmluZXMgdGhpcyBmb3IgVVdQIGFwcHMKLSAgICAgICAgJ1dJTkFQSV9GQU1JTFk9V0lOQVBJX0ZBTUlMWV9BUFAnLAotICAgICAgICAjIFZTMjAxNyBhbHdheXMgZGVmaW5lcyB0aGlzIGZvciBVV1AgYXBwcwotICAgICAgICAnX19XUkxfTk9fREVGQVVMVF9MSUJfXycsCi0gICAgICBdLAotICAgIH0sCi0gIF0sCi19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC91d3AvY29iYWx0L3hocl9tb2RpZnlfaGVhZGVycy5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9jb2JhbHQveGhyX21vZGlmeV9oZWFkZXJzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWJiMDg5Li4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9jb2JhbHQveGhyX21vZGlmeV9oZWFkZXJzLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJjb2JhbHQveGhyL3hocl9tb2RpZnlfaGVhZGVycy5oIgotCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAiYmFzZS9zeW5jaHJvbml6YXRpb24vd2FpdGFibGVfZXZlbnQuaCIKLQotI2luY2x1ZGUgInN0YXJib2FyZC9tdXRleC5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9vbmNlLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC91d3AvYXBwX2FjY2Vzc29ycy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvdXdwL2FzeW5jX3V0aWxzLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi93Y2hhcl91dGlscy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zdHJpbmcuaCIKLQotdXNpbmcgV2luZG93czo6U2VjdXJpdHk6OkF1dGhlbnRpY2F0aW9uOjpXZWI6OkNvcmU6OldlYlRva2VuUmVzcG9uc2U7Ci11c2luZyBXaW5kb3dzOjpTZWN1cml0eTo6QXV0aGVudGljYXRpb246OldlYjo6Q29yZTo6V2ViVG9rZW5SZXF1ZXN0UmVzdWx0OwotdXNpbmcgV2luZG93czo6U2VjdXJpdHk6OkF1dGhlbnRpY2F0aW9uOjpXZWI6OkNvcmU6OldlYlRva2VuUmVxdWVzdFN0YXR1czsKLXVzaW5nIFdpbmRvd3M6OlN5c3RlbTo6VXNlckF1dGhlbnRpY2F0aW9uU3RhdHVzOwotCi1uYW1lc3BhY2Ugc2J3aW4zMiA9IHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjsKLW5hbWVzcGFjZSBzYnV3cCA9IHN0YXJib2FyZDo6c2hhcmVkOjp1d3A7Ci0KLW5hbWVzcGFjZSB7Ci0KLWNvbnN0IGNoYXIga1hib3hMaXZlQWNjb3VudFByb3ZpZGVySWRbXSA9ICJodHRwczovL3hzdHMuYXV0aC54Ym94bGl2ZS5jb20iOwotCi0vLyBUaGUgbmFtZSBvZiB0aGUgaGVhZGVyIHRvIHNlbmQgdGhlIFNUUyB0b2tlbiBvdXQgb24uCi1jb25zdCBjaGFyIGtYYXV0aEhlYWRlck5hbWVbXSA9ICJBdXRob3JpemF0aW9uIjsKLQotLy8gVGhlIHByZWZpeCBmb3IgdGhlIHZhbHVlIG9mIHRoZSBBdXRob3JpemF0aW9uIGhlYWRlciB3aGVuIHRoZXJlIGlzIGFuIFhBdXRoCi0vLyB0b2tlbiB0byBhdHRhY2ggdG8gdGhlIHJlcXVlc3QuIFRoZSB0b2tlbiBpdHNlbGYgc2hvdWxkIGRpcmVjdGx5IGZvbGxvdyB0aGlzCi0vLyBwcmVmaXguCi1jb25zdCBjaGFyIGtYYXV0aEhlYWRlclByZWZpeFtdID0gIlhCTDMuMCB4PSI7Ci0KLS8vIFRoZSBuYW1lIG9mIHRoZSBoZWFkZXIgdG8gZGV0ZWN0IG9uIHJlcXVlc3RzIGFzIGEgdHJpZ2dlciB0byBhZGQgYW4gU1RTIHRva2VuCi0vLyBmb3IgdGhlIGdpdmVuIFJlbHlpbmdQYXJ0eUlkICh0aGUgdmFsdWUgb2YgdGhlIGhlYWRlcikuIFRoZSBoZWFkZXIgaXRzZWxmCi0vLyB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgb3V0Z29pbmcgcmVxdWVzdCwgYW5kIHJlcGxhY2VkIHdpdGggYW4gQXV0aG9yaXphdGlvbgotLy8gaGVhZGVyIHdpdGggYSB2YWxpZCBTVFMgdG9rZW4gZm9yIHRoZSBjdXJyZW50IHByaW1hcnkgdXNlci4KLWNvbnN0IGJhc2U6OlN0cmluZ1BpZWNlIGtYYXV0aFRyaWdnZXJIZWFkZXJOYW1lID0gIlgtU1RTLVJlbHlpbmdQYXJ0eUlkIjsKLQotY2xhc3MgTGFzdFRva2VuQ2FjaGUgewotICBib29sIGhhc19sYXN0X3Rva2VuXyA9IGZhbHNlOwotICBzdGQ6OnN0cmluZyBsYXN0X3Rva2VuXzsKLSAgc3RhcmJvYXJkOjpNdXRleCBtdXRleF87Ci0gcHVibGljOgotICBib29sIE1heWJlR2V0TGFzdFRva2VuKHN0ZDo6c3RyaW5nKiBvdXQpIHsKLSAgICBzdGFyYm9hcmQ6OlNjb3BlZExvY2sgbG9jayhtdXRleF8pOwotICAgIG91dC0+YXNzaWduKGxhc3RfdG9rZW5fKTsKLSAgICByZXR1cm4gaGFzX2xhc3RfdG9rZW5fOwotICB9Ci0KLSAgdm9pZCBTZXRMYXN0VG9rZW4oY29uc3Qgc3RkOjpzdHJpbmcmIGluKSB7Ci0gICAgc3RhcmJvYXJkOjpTY29wZWRMb2NrIGxvY2sobXV0ZXhfKTsKLSAgICBoYXNfbGFzdF90b2tlbl8gPSB0cnVlOwotICAgIGxhc3RfdG9rZW5fID0gaW47Ci0gIH0KLX07Ci0KLVNCX09OQ0VfSU5JVElBTElaRV9GVU5DVElPTihMYXN0VG9rZW5DYWNoZSwgR2V0TGFzdFRva2VuQ2FjaGUpOwotCi1ib29sIFBvcHVsYXRlVG9rZW4oY29uc3Qgc3RkOjpzdHJpbmcmIHJlbHlpbmdfcGFydHksIHN0ZDo6c3RyaW5nKiBvdXQpIHsKLSAgb3V0LT5jbGVhcigpOwotICBEQ0hFQ0soIXNidXdwOjpHZXREaXNwYXRjaGVyKCktPkhhc1RocmVhZEFjY2VzcykKLSAgICAgIDw8ICJNdXN0IG5vdCBiZSBjYWxsZWQgZnJvbSB0aGUgVVdQIG1haW4gdGhyZWFkIjsKLQotICBXZWJUb2tlblJlcXVlc3RSZXN1bHReIHRva2VuX3Jlc3VsdDsKLSAgdHJ5IHsKLSAgICB0b2tlbl9yZXN1bHQgPSBzYnV3cDo6VHJ5VG9GZXRjaFNzb1Rva2VuKHJlbHlpbmdfcGFydHkpLmdldCgpOwotICB9IGNhdGNoIChQbGF0Zm9ybTo6RXhjZXB0aW9uXikgewotICAgIHRva2VuX3Jlc3VsdCA9IG51bGxwdHI7Ci0gIH0KLSAgaWYgKCF0b2tlbl9yZXN1bHQgfHwKLSAgICAgIHRva2VuX3Jlc3VsdC0+UmVzcG9uc2VTdGF0dXMgIT0gV2ViVG9rZW5SZXF1ZXN0U3RhdHVzOjpTdWNjZXNzIHx8Ci0gICAgICB0b2tlbl9yZXN1bHQtPlJlc3BvbnNlRGF0YS0+U2l6ZSAhPSAxKSB7Ci0gICAgLy8gVGhlIHRva2VuIGlzIHZhbGlkIGZvciAxNiBob3VycywgaG93ZXZlciB0aGVyZSBhcHBlYXJzIHRvIGJlCi0gICAgLy8gbm8gZWFzeSB3YXkgZm9yIHVzIHRvIGNoZWNrIG9uIHRoZSBjbGllbnQgc2lkZSB3aGVuIGl0IGV4cGlyZXMuCi0gICAgLy8gV2UgbXVzdCB1c2UgaXQgaG91cmx5LgotICAgIC8vIEhvd2V2ZXIsIGl0IGFwcGVhcnMgdGhhdCBzb21ldGltZXMgYXNraW5nIGZvciBhIG5ldyB0b2tlbiB3aWxsCi0gICAgLy8gZmFpbCBmb3IgdW5rbm93biByZWFzb25zLgotICAgIC8vIFRoZXJlZm9yZSwgc2ltcGx5IHVzZSB0aGUgbGFzdCB0b2tlbiB3ZSBoYWQgaW4gY2FzZSBpdCdzIHN0aWxsIGdvb2QuCi0gICAgLy8gTm90ZSB0aGF0IHdoaWxlICJyZWx5aW5nX3BhcnR5IiBtYXkgY2hhbmdlIHNsaWdodGx5LCBpdAotICAgIC8vIG5ldmVyIGNoYW5nZXMgYW55IG9mIHRoZSB0b2tlbidzIGF0dHJpYnV0ZXMuCi0gICAgcmV0dXJuIEdldExhc3RUb2tlbkNhY2hlKCktPk1heWJlR2V0TGFzdFRva2VuKG91dCk7Ci0gIH0KLQotICBXZWJUb2tlblJlc3BvbnNlXiB0b2tlbl9yZXNwb25zZSA9IHRva2VuX3Jlc3VsdC0+UmVzcG9uc2VEYXRhLT5HZXRBdCgwKTsKLSAgKm91dCA9IHNid2luMzI6OnBsYXRmb3JtU3RyaW5nVG9TdHJpbmcodG9rZW5fcmVzcG9uc2UtPlRva2VuKTsKLSAgR2V0TGFzdFRva2VuQ2FjaGUoKS0+U2V0TGFzdFRva2VuKAotICAgICAgc2J3aW4zMjo6cGxhdGZvcm1TdHJpbmdUb1N0cmluZyh0b2tlbl9yZXNwb25zZS0+VG9rZW4pKTsKLSAgLy8gQWx3YXlzIGdldCB0aGUgdG9rZW4gdGhyb3VnaCB0aGUgY2FjaGUgc28gdGhlIGV4Y2VwdGlvbmFsIGNhc2UKLSAgLy8gaXMgbGVzcyBleGNlcHRpb25hbC4KLSAgcmV0dXJuIEdldExhc3RUb2tlbkNhY2hlKCktPk1heWJlR2V0TGFzdFRva2VuKG91dCk7Ci19Ci0KLXZvaWQgQXBwZW5kVXJsUGF0aChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgc3RkOjpzdHJpbmcqIHVybF9wYXJhbWV0ZXIpIHsKLSAgRENIRUNLKHVybF9wYXJhbWV0ZXIpOwotCi0gIGlmIChwYXRoLmVtcHR5KCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGQ6OnN0cmluZyYgdXJsKCp1cmxfcGFyYW1ldGVyKTsKLQotICAvLyBpZiBwYXRoIHN0YXJ0cyB3aXRoIGEgJy8nIGFuZCB1cmwgZW5kcyB3aXRoIGEgJy8nLCByZW1vdmUgdHJhaWxpbmcgc2xhc2gKLSAgLy8gZnJvbSB1cmwgYmVmb3JlIGFwcGVuZGluZyB0aGUgcGF0aAotICBpZiAoIXVybC5lbXB0eSgpICYmICoodXJsLnJiZWdpbigpKSA9PSAnLycgJiYgcGF0aFswXSA9PSAnLycpIHsKLSAgICB1cmwucmVzaXplKHVybC5zaXplKCkgLSAxKTsKLSAgfQotICB1cmwuYXBwZW5kKHBhdGgpOwotfQotCi1ib29sIFN0cmluZ1N0YXJ0c1dpdGgoY29uc3Qgc3RkOjpzdHJpbmcmIHN0ciwgY29uc3QgY2hhciogc3RhcnRzX3dpdGgpIHsKLSAgc2l6ZV90IHN0YXJ0c193aXRoX2xlbmd0aCA9IFNiU3RyaW5nR2V0TGVuZ3RoKHN0YXJ0c193aXRoKTsKLSAgaWYgKHN0ci5zaXplKCkgPCBzdGFydHNfd2l0aF9sZW5ndGgpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBzdWJfc3RyID0gc3RyLnN1YnN0cigwLCBzdGFydHNfd2l0aF9sZW5ndGgpOwotICByZXR1cm4gc3ViX3N0ciA9PSBzdGFydHNfd2l0aDsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIHhociB7Ci0KLXZvaWQgQ29iYWx0WGhyTW9kaWZ5SGVhZGVyKGNvbnN0IEdVUkwmIHJlcXVlc3RfdXJsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0OjpIdHRwUmVxdWVzdEhlYWRlcnMqIGhlYWRlcnMpIHsKLSAgRENIRUNLKGhlYWRlcnMpOwotCi0gIHN0ZDo6c3RyaW5nIHJlbHlpbmdfcGFydHk7Ci0gIGJvb2wgdHJpZ2dlcl9oZWFkZXJfZm91bmQgPSBoZWFkZXJzLT5HZXRIZWFkZXIoa1hhdXRoVHJpZ2dlckhlYWRlck5hbWUsCi0gICAgJnJlbHlpbmdfcGFydHkpOwotCi0gIGlmICghdHJpZ2dlcl9oZWFkZXJfZm91bmQpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAocmVxdWVzdF91cmwuaGFzX3BhdGgoKSkgewotICAgIHN0ZDo6c3RyaW5nIHJlcXVlc3RfdXJsX3BhdGggPSByZXF1ZXN0X3VybC5wYXRoKCk7Ci0gICAgQXBwZW5kVXJsUGF0aChyZXF1ZXN0X3VybF9wYXRoLCAmcmVseWluZ19wYXJ0eSk7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBvdXRfc3RyaW5nOwotICBpZiAoIVBvcHVsYXRlVG9rZW4ocmVseWluZ19wYXJ0eSwgJm91dF9zdHJpbmcpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGhlYWRlcnMtPlJlbW92ZUhlYWRlcihrWGF1dGhUcmlnZ2VySGVhZGVyTmFtZSk7Ci0gIGhlYWRlcnMtPlNldEhlYWRlcihrWGF1dGhIZWFkZXJOYW1lLCBvdXRfc3RyaW5nKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHhocgotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL2NvYmFsdC94aHJfbW9kaWZ5X2hlYWRlcnNfdGVzdC5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9jb2JhbHQveGhyX21vZGlmeV9oZWFkZXJzX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4YWEzMmMuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL2NvYmFsdC94aHJfbW9kaWZ5X2hlYWRlcnNfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJjb2JhbHQveGhyL3hocl9tb2RpZnlfaGVhZGVycy5oIgotCi0jaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCi0KLW5hbWVzcGFjZSBzdGFyYm9hcmQgewotbmFtZXNwYWNlIHNoYXJlZCB7Ci1uYW1lc3BhY2UgdXdwIHsKLW5hbWVzcGFjZSBjb2JhbHQgewotCi11c2luZyA6OmNvYmFsdDo6eGhyOjpDb2JhbHRYaHJNb2RpZnlIZWFkZXI7Ci11c2luZyBuZXQ6Okh0dHBSZXF1ZXN0SGVhZGVyczsKLWNvbnN0IHN0ZDo6c3RyaW5nIGtVcmxTdHJpbmcgPSAiaHR0cHM6Ly9leGFtcGxlLmNvbS9hYmMveHl6IjsKLQotVEVTVChYSFJNb2RpZmljYXRpb25UZXN0LCBFbXB0eUhlYWRlcnMpIHsKLSAgSHR0cFJlcXVlc3RIZWFkZXJzIGhlYWRlcnM7Ci0gIEdVUkwgdXJsKGtVcmxTdHJpbmcpOwotICBDb2JhbHRYaHJNb2RpZnlIZWFkZXIodXJsLCAmaGVhZGVycyk7Ci0gIEVYUEVDVF9UUlVFKGhlYWRlcnMuSXNFbXB0eSgpKTsKLX0KLQotVEVTVChYSFJNb2RpZmljYXRpb25UZXN0LCBIZWFkZXJOb3RGb3VuZCkgewotICBIdHRwUmVxdWVzdEhlYWRlcnMgaGVhZGVyczsKLSAgaGVhZGVycy5TZXRIZWFkZXIoIkF1dGhvcml6YXRpb24iLCAiQUJDIik7Ci0gIEdVUkwgdXJsKGtVcmxTdHJpbmcpOwotICBDb2JhbHRYaHJNb2RpZnlIZWFkZXIodXJsLCAmaGVhZGVycyk7Ci0gIEVYUEVDVF9GQUxTRSghaGVhZGVycy5Jc0VtcHR5KCkpOwotICBzdGQ6OnN0cmluZyBoZWFkZXJzX3NlcmlhbGl6ZWQgPSBoZWFkZXJzLlRvU3RyaW5nKCk7Ci0gIEVYUEVDVF9TVFJFUShoZWFkZXJzX3NlcmlhbGl6ZWQuY19zdHIoKSwgIkF1dGhvcml6YXRpb246IEFCQ1xyXG5cclxuIik7Ci19Ci0KLVRFU1QoWEhSTW9kaWZpY2F0aW9uVGVzdCwgSGVhZGVyUmVwbGFjZWQpIHsKLSAgSHR0cFJlcXVlc3RIZWFkZXJzIGhlYWRlcnM7Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBrWGF1dGhUcmlnZ2VySGVhZGVyTmFtZSA9ICJYLVNUUy1SZWx5aW5nUGFydHlJZCI7Ci0gIGhlYWRlcnMuU2V0SGVhZGVyKGtYYXV0aFRyaWdnZXJIZWFkZXJOYW1lLCAiQUJDIik7Ci0gIEVYUEVDVF9UUlVFKGhlYWRlcnMuSGFzSGVhZGVyKGtYYXV0aFRyaWdnZXJIZWFkZXJOYW1lKSk7Ci0gIEdVUkwgdXJsKGtVcmxTdHJpbmcpOwotICBDb2JhbHRYaHJNb2RpZnlIZWFkZXIodXJsLCAmaGVhZGVycyk7Ci0gIEVYUEVDVF9GQUxTRShoZWFkZXJzLkhhc0hlYWRlcihrWGF1dGhUcmlnZ2VySGVhZGVyTmFtZSkpOwotICBzdGQ6OnN0cmluZyBoZWFkZXJzX3NlcmlhbGl6ZWQgPSBoZWFkZXJzLlRvU3RyaW5nKCk7Ci0gIEVYUEVDVF9UUlVFKGhlYWRlcnNfc2VyaWFsaXplZC5maW5kKCJBdXRob3JpemF0aW9uOiBYQkwzLjAgeD0iKSAhPQotICAgICAgICAgICAgICBzdGQ6OnN0cmluZzo6bnBvcyk7Ci19Ci0KLVRFU1QoWEhSTW9kaWZpY2F0aW9uVGVzdCwgTXVsdGlwbGVIZWFkZXJzKSB7Ci0gIEh0dHBSZXF1ZXN0SGVhZGVycyBoZWFkZXJzOwotICBzdGF0aWMgY29uc3QgY2hhcioga1hhdXRoVHJpZ2dlckhlYWRlck5hbWUgPSAiWC1TVFMtUmVseWluZ1BhcnR5SWQiOwotICBoZWFkZXJzLlNldEhlYWRlcigiSDEiLCAiaDEiKTsKLSAgaGVhZGVycy5TZXRIZWFkZXIoIkgyIiwgImgyIik7Ci0gIGhlYWRlcnMuU2V0SGVhZGVyKCJIMyIsICJoMyIpOwotICBFWFBFQ1RfVFJVRShoZWFkZXJzLkhhc0hlYWRlcihrWGF1dGhUcmlnZ2VySGVhZGVyTmFtZSkpOwotICBHVVJMIHVybChrVXJsU3RyaW5nKTsKLSAgQ29iYWx0WGhyTW9kaWZ5SGVhZGVyKHVybCwgJmhlYWRlcnMpOwotICBFWFBFQ1RfVFJVRShoZWFkZXJzLkhhc0hlYWRlcigiSDEiKSk7Ci0gIEVYUEVDVF9UUlVFKGhlYWRlcnMuSGFzSGVhZGVyKCJIMiIpKTsKLSAgRVhQRUNUX1RSVUUoaGVhZGVycy5IYXNIZWFkZXIoIkgzIikpOwotICBFWFBFQ1RfRkFMU0UoaGVhZGVycy5IYXNIZWFkZXIoa1hhdXRoVHJpZ2dlckhlYWRlck5hbWUpKTsKLSAgc3RkOjpzdHJpbmcgaGVhZGVyc19zZXJpYWxpemVkID0gaGVhZGVycy5Ub1N0cmluZygpOwotICBFWFBFQ1RfVFJVRShoZWFkZXJzX3NlcmlhbGl6ZWQuZmluZCgiQXV0aG9yaXphdGlvbjogWEJMMy4wIHg9IikgIT0KLSAgICAgICAgICAgICAgc3RkOjpzdHJpbmc6Om5wb3MpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0Ci19ICAvLyBuYW1lc3BhY2UgdXdwCi19ICAvLyBuYW1lc3BhY2Ugc2hhcmVkCi19ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC91d3AvZGVjb2RlX3RhcmdldF9pbnRlcm5hbC5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9kZWNvZGVfdGFyZ2V0X2ludGVybmFsLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWQ0ODYzLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9kZWNvZGVfdGFyZ2V0X2ludGVybmFsLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzgzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3V3cC9kZWNvZGVfdGFyZ2V0X2ludGVybmFsLmgiCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvY29uZmlndXJhdGlvbi5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9lcnJvcl91dGlscy5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2FuZ2xlL2luY2x1ZGUvRUdML2VnbC5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2FuZ2xlL2luY2x1ZGUvRUdML2VnbGV4dC5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2FuZ2xlL2luY2x1ZGUvR0xFUzIvZ2wyLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvYW5nbGUvaW5jbHVkZS9HTEVTMi9nbDJleHQuaCIKLQotbmFtZXNwYWNlIHsKLQotdXNpbmcgTWljcm9zb2Z0OjpXUkw6OkNvbVB0cjsKLXVzaW5nIHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6Q2hlY2tSZXN1bHQ7Ci0KLS8vIHszQzNBNDNBQi1DNjlCLTQ2QzktQUE4RC1CMENGRkNENDU5NkR9Ci1jb25zdCBHVUlEIGtDb2JhbHROdjEyQmluZENocm9tYSA9IHsKLSAgICAweDNjM2E0M2FiLAotICAgIDB4YzY5YiwKLSAgICAweDQ2YzksCi0gICAgezB4YWEsIDB4OGQsIDB4YjAsIDB4Y2YsIDB4ZmMsIDB4ZDQsIDB4NTksIDB4NmR9fTsKLQotLy8ge0M2MkJGMThELUI1RUUtNDZCMS05QzMxLUY2MUJEOEFFM0IwRH0KLWNvbnN0IEdVSUQga0NvYmFsdER4Z2lCdWZmZXIgPSB7Ci0gICAgMFhjNjJiZjE4ZCwKLSAgICAwWGI1ZWUsCi0gICAgMFg0NmIxLAotICAgIHswWDljLCAwWDMxLCAwWGY2LCAwWDFiLCAwWGQ4LCAwWGFlLCAwWDNiLCAwWDBkfX07Ci0KLUNvbVB0cjxJRDNEMTFUZXh0dXJlMkQ+IENyZWF0ZUVtcHR5VGV4dHVyZSgKLSAgICBjb25zdCBDb21QdHI8SUQzRDExRGV2aWNlPiYgZDNkX2RldmljZSwKLSAgICBpbnQgd2lkdGgsCi0gICAgaW50IGhlaWdodCkgewotICBDb21QdHI8SUQzRDExVGV4dHVyZTJEPiB0ZXh0dXJlOwotICBEM0QxMV9URVhUVVJFMkRfREVTQyB0ZXh0dXJlX2Rlc2MgPSB7fTsKLSAgdGV4dHVyZV9kZXNjLldpZHRoID0gd2lkdGg7Ci0gIHRleHR1cmVfZGVzYy5IZWlnaHQgPSBoZWlnaHQ7Ci0gIHRleHR1cmVfZGVzYy5NaXBMZXZlbHMgPSAxOwotICB0ZXh0dXJlX2Rlc2MuQXJyYXlTaXplID0gMTsKLSAgdGV4dHVyZV9kZXNjLkZvcm1hdCA9IERYR0lfRk9STUFUX05WMTI7Ci0gIHRleHR1cmVfZGVzYy5TYW1wbGVEZXNjLkNvdW50ID0gMTsKLSAgdGV4dHVyZV9kZXNjLlNhbXBsZURlc2MuUXVhbGl0eSA9IDA7Ci0gIHRleHR1cmVfZGVzYy5Vc2FnZSA9IEQzRDExX1VTQUdFX0RFRkFVTFQ7Ci0gIHRleHR1cmVfZGVzYy5CaW5kRmxhZ3MgPQotICAgICAgRDNEMTFfQklORF9SRU5ERVJfVEFSR0VUIHwgRDNEMTFfQklORF9TSEFERVJfUkVTT1VSQ0U7Ci0gIENoZWNrUmVzdWx0KGQzZF9kZXZpY2UtPkNyZWF0ZVRleHR1cmUyRCgmdGV4dHVyZV9kZXNjLCBudWxscHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZS5HZXRBZGRyZXNzT2YoKSkpOwotICByZXR1cm4gdGV4dHVyZTsKLX0KLQotdm9pZCBVcGRhdGVUZXh0dXJlKAotICAgIGNvbnN0IENvbVB0cjxJRDNEMTFUZXh0dXJlMkQ+JiB0ZXh0dXJlLAotICAgIGNvbnN0IENvbVB0cjxJRDNEMTFWaWRlb0RldmljZTE+JiB2aWRlb19kZXZpY2UsCi0gICAgY29uc3QgQ29tUHRyPElEM0QxMVZpZGVvQ29udGV4dD4mIHZpZGVvX2NvbnRleHQsCi0gICAgY29uc3QgQ29tUHRyPElEM0QxMVZpZGVvUHJvY2Vzc29yRW51bWVyYXRvcj4mIHZpZGVvX2VudW1lcmF0b3IsCi0gICAgY29uc3QgQ29tUHRyPElEM0QxMVZpZGVvUHJvY2Vzc29yPiYgdmlkZW9fcHJvY2Vzc29yLAotICAgIGNvbnN0IENvbVB0cjxJTUZTYW1wbGU+JiB2aWRlb19zYW1wbGUsCi0gICAgY29uc3QgUkVDVCYgdmlkZW9fYXJlYSkgewotICBDb21QdHI8SU1GTWVkaWFCdWZmZXI+IG1lZGlhX2J1ZmZlcjsKLSAgQ2hlY2tSZXN1bHQodmlkZW9fc2FtcGxlLT5HZXRCdWZmZXJCeUluZGV4KDAsIG1lZGlhX2J1ZmZlci5HZXRBZGRyZXNzT2YoKSkpOwotCi0gIENvbVB0cjxJTUZEWEdJQnVmZmVyPiBkeGdpX2J1ZmZlcjsKLSAgQ2hlY2tSZXN1bHQobWVkaWFfYnVmZmVyLkFzKCZkeGdpX2J1ZmZlcikpOwotCi0gIENvbVB0cjxJRDNEMTFUZXh0dXJlMkQ+IGlucHV0X3RleHR1cmU7Ci0gIENoZWNrUmVzdWx0KGR4Z2lfYnVmZmVyLT5HZXRSZXNvdXJjZShJSURfUFBWX0FSR1MoJmlucHV0X3RleHR1cmUpKSk7Ci0KLSAgLy8gVGhlIFZpZGVvUHJvY2Vzc29yIG5lZWRzIHRvIGtub3cgd2hhdCBzdWJzZXQgb2YgdGhlIGRlY29kZWQKLSAgLy8gZnJhbWUgY29udGFpbnMgYWN0aXZlIHBpeGVscyB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuCi0gIHZpZGVvX2NvbnRleHQtPlZpZGVvUHJvY2Vzc29yU2V0U3RyZWFtU291cmNlUmVjdCh2aWRlb19wcm9jZXNzb3IuR2V0KCksIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFLCAmdmlkZW9fYXJlYSk7Ci0KLSAgRDNEMTFfVklERU9fUFJPQ0VTU09SX0lOUFVUX1ZJRVdfREVTQyBpbnB1dF9kZXNjID0ge307Ci0gIGlucHV0X2Rlc2MuVmlld0RpbWVuc2lvbiA9IEQzRDExX1ZQSVZfRElNRU5TSU9OX1RFWFRVUkUyRDsKLSAgaW5wdXRfZGVzYy5UZXh0dXJlMkQuTWlwU2xpY2UgPSAwOwotICBkeGdpX2J1ZmZlci0+R2V0U3VicmVzb3VyY2VJbmRleCgmaW5wdXRfZGVzYy5UZXh0dXJlMkQuQXJyYXlTbGljZSk7Ci0KLSAgQ29tUHRyPElEM0QxMVZpZGVvUHJvY2Vzc29ySW5wdXRWaWV3PiBpbnB1dF92aWV3OwotICBDaGVja1Jlc3VsdCh2aWRlb19kZXZpY2UtPkNyZWF0ZVZpZGVvUHJvY2Vzc29ySW5wdXRWaWV3KAotICAgICAgaW5wdXRfdGV4dHVyZS5HZXQoKSwgdmlkZW9fZW51bWVyYXRvci5HZXQoKSwgJmlucHV0X2Rlc2MsCi0gICAgICBpbnB1dF92aWV3LkdldEFkZHJlc3NPZigpKSk7Ci0KLSAgRDNEMTFfVklERU9fUFJPQ0VTU09SX09VVFBVVF9WSUVXX0RFU0Mgb3V0cHV0X2Rlc2MgPSB7fTsKLSAgb3V0cHV0X2Rlc2MuVmlld0RpbWVuc2lvbiA9IEQzRDExX1ZQT1ZfRElNRU5TSU9OX1RFWFRVUkUyRDsKLSAgb3V0cHV0X2Rlc2MuVGV4dHVyZTJELk1pcFNsaWNlID0gMDsKLQotICBDb21QdHI8SUQzRDExVmlkZW9Qcm9jZXNzb3JPdXRwdXRWaWV3PiBvdXRwdXRfdmlldzsKLSAgQ2hlY2tSZXN1bHQodmlkZW9fZGV2aWNlLT5DcmVhdGVWaWRlb1Byb2Nlc3Nvck91dHB1dFZpZXcoCi0gICAgICB0ZXh0dXJlLkdldCgpLCB2aWRlb19lbnVtZXJhdG9yLkdldCgpLCAmb3V0cHV0X2Rlc2MsCi0gICAgICBvdXRwdXRfdmlldy5HZXRBZGRyZXNzT2YoKSkpOwotCi0gIC8vIFdlIGhhdmUgYSBzaW5nbGUgdmlkZW8gc3RyZWFtLCB3aGljaCBpcyBlbmFibGVkIGZvciBkaXNwbGF5LgotICBEM0QxMV9WSURFT19QUk9DRVNTT1JfU1RSRUFNIHN0cmVhbV9pbmZvID0ge307Ci0gIHN0cmVhbV9pbmZvLkVuYWJsZSA9IFRSVUU7Ci0gIHN0cmVhbV9pbmZvLnBJbnB1dFN1cmZhY2UgPSBpbnB1dF92aWV3LkdldCgpOwotICBDaGVja1Jlc3VsdCh2aWRlb19jb250ZXh0LT5WaWRlb1Byb2Nlc3NvckJsdCgKLSAgICAgIHZpZGVvX3Byb2Nlc3Nvci5HZXQoKSwgb3V0cHV0X3ZpZXcuR2V0KCksIDAsIDEsICZzdHJlYW1faW5mbykpOwotfQotCi1Db21QdHI8SUQzRDExVGV4dHVyZTJEPiBDcmVhdGVWUFhUZXh0dXJlKGNvbnN0IENvbVB0cjxJRDNEMTFEZXZpY2U+JiBkM2RfZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2cHhfaW1hZ2VfdCogaW1nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCWVRFKiBmcmFtZV9idWZfbnYxMikgewotICBDb21QdHI8SUQzRDExVGV4dHVyZTJEPiB0ZXh0dXJlOwotICBEM0QxMV9URVhUVVJFMkRfREVTQyB0ZXh0dXJlX2Rlc2MgPSB7fTsKLSAgdGV4dHVyZV9kZXNjLldpZHRoID0gaW1nLT53OwotICB0ZXh0dXJlX2Rlc2MuSGVpZ2h0ID0gaW1nLT5oOwotICB0ZXh0dXJlX2Rlc2MuTWlwTGV2ZWxzID0gMTsKLSAgdGV4dHVyZV9kZXNjLkFycmF5U2l6ZSA9IDE7Ci0gIHRleHR1cmVfZGVzYy5Gb3JtYXQgPSBEWEdJX0ZPUk1BVF9OVjEyOwotICB0ZXh0dXJlX2Rlc2MuU2FtcGxlRGVzYy5Db3VudCA9IDE7Ci0gIHRleHR1cmVfZGVzYy5TYW1wbGVEZXNjLlF1YWxpdHkgPSAwOwotICB0ZXh0dXJlX2Rlc2MuVXNhZ2UgPSBEM0QxMV9VU0FHRV9ERUZBVUxUOwotICB0ZXh0dXJlX2Rlc2MuQmluZEZsYWdzID0gRDNEMTFfQklORF9ERUNPREVSIHwgRDNEMTFfQklORF9TSEFERVJfUkVTT1VSQ0U7Ci0KLSAgQllURSogcERhdGEgPSBmcmFtZV9idWZfbnYxMjsKLSAgU2JNZW1vcnlDb3B5KHBEYXRhLCBpbWctPnBsYW5lc1tWUFhfUExBTkVfWV0sIGltZy0+dyAqIGltZy0+aCk7Ci0gIHBEYXRhICs9IHRleHR1cmVfZGVzYy5XaWR0aCAqIHRleHR1cmVfZGVzYy5IZWlnaHQ7Ci0KLSAgdW5zaWduZWQgaW50IGogPSAwOwotICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IChpbWctPncgKiBpbWctPmggLyA0KTsgaSsrKSB7Ci0gICAgcERhdGFbaisrXSA9IGltZy0+cGxhbmVzW1ZQWF9QTEFORV9VXVtpXTsKLSAgICBwRGF0YVtqKytdID0gaW1nLT5wbGFuZXNbVlBYX1BMQU5FX1ZdW2ldOwotICB9Ci0KLSAgRDNEMTFfU1VCUkVTT1VSQ0VfREFUQSB0U0RhdGE7Ci0gIHRTRGF0YS5wU3lzTWVtID0gZnJhbWVfYnVmX252MTI7Ci0gIHRTRGF0YS5TeXNNZW1QaXRjaCA9IGltZy0+dzsKLSAgdFNEYXRhLlN5c01lbVNsaWNlUGl0Y2ggPSBpbWctPncgKiBpbWctPmggKyAoaW1nLT53ICogaW1nLT5oIC8gMik7Ci0gIENoZWNrUmVzdWx0KGQzZF9kZXZpY2UtPkNyZWF0ZVRleHR1cmUyRCgmdGV4dHVyZV9kZXNjLCAmdFNEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZS5HZXRBZGRyZXNzT2YoKSkpOwotICByZXR1cm4gdGV4dHVyZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi12b2lkIFNiRGVjb2RlVGFyZ2V0UHJpdmF0ZTo6Q3JlYXRlR0xTdXJmYWNlc05WMTIoCi0gICAgY29uc3QgQ29tUHRyPElEM0QxMVRleHR1cmUyRD4mIHRleHR1cmUsCi0gICAgaW50IGRpc3BsYXlfd2lkdGgsCi0gICAgaW50IGRpc3BsYXlfaGVpZ2h0KSB7Ci0gIFNiRGVjb2RlVGFyZ2V0SW5mb1BsYW5lKiBwbGFuZVkgPSAmKGluZm8ucGxhbmVzW2tTYkRlY29kZVRhcmdldFBsYW5lWV0pOwotICBTYkRlY29kZVRhcmdldEluZm9QbGFuZSogcGxhbmVVViA9ICYoaW5mby5wbGFuZXNba1NiRGVjb2RlVGFyZ2V0UGxhbmVVVl0pOwotCi0gIHBsYW5lWS0+d2lkdGggPSBpbmZvLndpZHRoOwotICBwbGFuZVktPmhlaWdodCA9IGluZm8uaGVpZ2h0OwotICBwbGFuZVktPmNvbnRlbnRfcmVnaW9uLmxlZnQgPSAwOwotICBwbGFuZVktPmNvbnRlbnRfcmVnaW9uLnRvcCA9IGRpc3BsYXlfaGVpZ2h0OwotICBwbGFuZVktPmNvbnRlbnRfcmVnaW9uLnJpZ2h0ID0gZGlzcGxheV93aWR0aDsKLSAgcGxhbmVZLT5jb250ZW50X3JlZ2lvbi5ib3R0b20gPSAwOwotCi0gIHBsYW5lVVYtPndpZHRoID0gaW5mby53aWR0aCAvIDI7Ci0gIHBsYW5lVVYtPmhlaWdodCA9IGluZm8uaGVpZ2h0IC8gMjsKLSAgcGxhbmVVVi0+Y29udGVudF9yZWdpb24ubGVmdCA9IHBsYW5lWS0+Y29udGVudF9yZWdpb24ubGVmdCAvIDI7Ci0gIHBsYW5lVVYtPmNvbnRlbnRfcmVnaW9uLnRvcCA9IHBsYW5lWS0+Y29udGVudF9yZWdpb24udG9wIC8gMjsKLSAgcGxhbmVVVi0+Y29udGVudF9yZWdpb24ucmlnaHQgPSBwbGFuZVktPmNvbnRlbnRfcmVnaW9uLnJpZ2h0IC8gMjsKLSAgcGxhbmVVVi0+Y29udGVudF9yZWdpb24uYm90dG9tID0gcGxhbmVZLT5jb250ZW50X3JlZ2lvbi5ib3R0b20gLyAyOwotCi0gIEVHTGludCBsdW1hX3RleHR1cmVfYXR0cmlidXRlc1tdID0ge0VHTF9XSURUSCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RUdMaW50PihpbmZvLndpZHRoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMX0hFSUdIVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RUdMaW50PihpbmZvLmhlaWdodCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTF9URVhUVVJFX1RBUkdFVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMX1RFWFRVUkVfMkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTF9URVhUVVJFX0ZPUk1BVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMX1RFWFRVUkVfUkdCQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMX05PTkV9OwotCi0gIEVHTERpc3BsYXkgZGlzcGxheSA9IGVnbEdldERpc3BsYXkoRUdMX0RFRkFVTFRfRElTUExBWSk7Ci0KLSAgRUdMQ29uZmlnIGNvbmZpZzsKLSAgRUdMaW50IGF0dHJpYnV0ZV9saXN0W10gPSB7RUdMX1NVUkZBQ0VfVFlQRSwgIC8vIHRoaXMgbXVzdCBiZSBmaXJzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xfV0lORE9XX0JJVCB8IEVHTF9QQlVGRkVSX0JJVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMX1JFRF9TSVpFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xfR1JFRU5fU0laRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMX0JMVUVfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMX0FMUEhBX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTF9CSU5EX1RPX1RFWFRVUkVfUkdCQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMX1RSVUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTF9SRU5ERVJBQkxFX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTF9PUEVOR0xfRVMyX0JJVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMX05PTkV9OwotCi0gIEVHTGludCBudW1fY29uZmlnczsKLSAgYm9vbCBvayA9IGVnbENob29zZUNvbmZpZyhkaXNwbGF5LCBhdHRyaWJ1dGVfbGlzdCwgJmNvbmZpZywgMSwgJm51bV9jb25maWdzKTsKLSAgU0JfRENIRUNLKG9rKTsKLSAgU0JfRENIRUNLKG51bV9jb25maWdzID09IDEpOwotCi0gIEdMdWludCBnbF90ZXh0dXJlc1syXSA9IHswfTsKLSAgZ2xHZW5UZXh0dXJlcygyLCBnbF90ZXh0dXJlcyk7Ci0gIFNCX0RDSEVDSyhnbEdldEVycm9yKCkgPT0gR0xfTk9fRVJST1IpOwotCi0gIC8vIFRoaXMgdGVsbHMgQU5HTEUgdGhhdCB0aGUgdGV4dHVyZSBpdCBjcmVhdGVzIHNob3VsZCBkcmF3Ci0gIC8vIHRoZSBsdW1hIGNoYW5uZWwgb24gUjguCi0gIEhSRVNVTFQgaHIgPSB0ZXh0dXJlLT5TZXRQcml2YXRlRGF0YShrQ29iYWx0TnYxMkJpbmRDaHJvbWEsIDAsIG51bGxwdHIpOwotICBTQl9EQ0hFQ0soU1VDQ0VFREVEKGhyKSk7Ci0KLSAgc3VyZmFjZVswXSA9IGVnbENyZWF0ZVBidWZmZXJGcm9tQ2xpZW50QnVmZmVyKGRpc3BsYXksIEVHTF9EM0RfVEVYVFVSRV9BTkdMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmUuR2V0KCksIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx1bWFfdGV4dHVyZV9hdHRyaWJ1dGVzKTsKLQotICBTQl9EQ0hFQ0soc3VyZmFjZVswXSAhPSBFR0xfTk9fU1VSRkFDRSk7Ci0KLSAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBnbF90ZXh0dXJlc1swXSk7Ci0gIFNCX0RDSEVDSyhnbEdldEVycm9yKCkgPT0gR0xfTk9fRVJST1IpOwotCi0gIG9rID0gZWdsQmluZFRleEltYWdlKGRpc3BsYXksIHN1cmZhY2VbMF0sIEVHTF9CQUNLX0JVRkZFUik7Ci0gIFNCX0RDSEVDSyhvayk7Ci0KLSAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSKTsKLSAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTElORUFSKTsKLQotICBwbGFuZVktPnRleHR1cmUgPSBnbF90ZXh0dXJlc1swXTsKLSAgcGxhbmVZLT5nbF90ZXh0dXJlX3RhcmdldCA9IEdMX1RFWFRVUkVfMkQ7Ci0gIHBsYW5lWS0+Z2xfdGV4dHVyZV9mb3JtYXQgPSBHTF9SRURfRVhUOwotCi0gIC8vIFRoaXMgdGVsbHMgQU5HTEUgdGhhdCB0aGUgdGV4dHVyZSBpdCBjcmVhdGVzIHNob3VsZCBkcmF3Ci0gIC8vIHRoZSBjaHJvbWEgY2hhbm5lbCBvbiBSOEc4LgotICBib29sIGJpbmRfY2hyb21hID0gdHJ1ZTsKLSAgaHIgPSB0ZXh0dXJlLT5TZXRQcml2YXRlRGF0YShrQ29iYWx0TnYxMkJpbmRDaHJvbWEsIDEsICZiaW5kX2Nocm9tYSk7Ci0gIFNCX0RDSEVDSyhTVUNDRUVERUQoaHIpKTsKLQotICBFR0xpbnQgY2hyb21hX3RleHR1cmVfYXR0cmlidXRlc1tdID0ge0VHTF9XSURUSCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxFR0xpbnQ+KGluZm8ud2lkdGgpIC8gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xfSEVJR0hULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEVHTGludD4oaW5mby5oZWlnaHQpIC8gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xfVEVYVFVSRV9UQVJHRVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMX1RFWFRVUkVfMkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMX1RFWFRVUkVfRk9STUFULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTF9URVhUVVJFX1JHQkEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMX05PTkV9OwotICBzdXJmYWNlWzFdID0gZWdsQ3JlYXRlUGJ1ZmZlckZyb21DbGllbnRCdWZmZXIoZGlzcGxheSwgRUdMX0QzRF9URVhUVVJFX0FOR0xFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZS5HZXQoKSwgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hyb21hX3RleHR1cmVfYXR0cmlidXRlcyk7Ci0KLSAgU0JfRENIRUNLKHN1cmZhY2VbMV0gIT0gRUdMX05PX1NVUkZBQ0UpOwotCi0gIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgZ2xfdGV4dHVyZXNbMV0pOwotICBTQl9EQ0hFQ0soZ2xHZXRFcnJvcigpID09IEdMX05PX0VSUk9SKTsKLQotICBvayA9IGVnbEJpbmRUZXhJbWFnZShkaXNwbGF5LCBzdXJmYWNlWzFdLCBFR0xfQkFDS19CVUZGRVIpOwotICBTQl9EQ0hFQ0sob2spOwotCi0gIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX0xJTkVBUik7Ci0gIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX0xJTkVBUik7Ci0KLSAgcGxhbmVVVi0+dGV4dHVyZSA9IGdsX3RleHR1cmVzWzFdOwotICBwbGFuZVVWLT5nbF90ZXh0dXJlX3RhcmdldCA9IEdMX1RFWFRVUkVfMkQ7Ci0gIHBsYW5lVVYtPmdsX3RleHR1cmVfZm9ybWF0ID0gR0xfUkdfRVhUOwotCi0gIGhyID0gdGV4dHVyZS0+U2V0UHJpdmF0ZURhdGEoa0NvYmFsdER4Z2lCdWZmZXIsIDAsIG51bGxwdHIpOwotICBTQl9EQ0hFQ0soU1VDQ0VFREVEKGhyKSk7Ci19Ci0KLVNiRGVjb2RlVGFyZ2V0UHJpdmF0ZTo6U2JEZWNvZGVUYXJnZXRQcml2YXRlKAotICAgIGNvbnN0IENvbVB0cjxJRDNEMTFEZXZpY2U+JiBkM2RfZGV2aWNlLAotICAgIGNvbnN0IHZweF9pbWFnZV90KiBpbWcsCi0gICAgQllURSogZnJhbWVfYnVmX252MTIpCi0gICAgOiByZWZjb3VudCgxKSwgZDNkX2RldmljZV8oZDNkX2RldmljZSkgewotICBTYk1lbW9yeVNldCgmaW5mbywgMCwgc2l6ZW9mKGluZm8pKTsKLSAgaW5mby5mb3JtYXQgPSBrU2JEZWNvZGVUYXJnZXRGb3JtYXQyUGxhbmVZVVZOVjEyOwotICBpbmZvLmlzX29wYXF1ZSA9IHRydWU7Ci0gIGluZm8ud2lkdGggPSBpbWctPnc7Ci0gIGluZm8uaGVpZ2h0ID0gaW1nLT5oOwotCi0gIGQzZF90ZXh0dXJlID0gQ3JlYXRlVlBYVGV4dHVyZShkM2RfZGV2aWNlLCBpbWcsIGZyYW1lX2J1Zl9udjEyKTsKLSAgQ3JlYXRlR0xTdXJmYWNlc05WMTIoZDNkX3RleHR1cmUsIGltZy0+ZF93LCBpbWctPmRfaCk7Ci19Ci0KLVNiRGVjb2RlVGFyZ2V0UHJpdmF0ZTo6U2JEZWNvZGVUYXJnZXRQcml2YXRlKAotICAgIGNvbnN0IENvbVB0cjxJRDNEMTFEZXZpY2U+JiBkM2RfZGV2aWNlLAotICAgIGNvbnN0IENvbVB0cjxJRDNEMTFWaWRlb0RldmljZTE+JiB2aWRlb19kZXZpY2UsCi0gICAgY29uc3QgQ29tUHRyPElEM0QxMVZpZGVvQ29udGV4dD4mIHZpZGVvX2NvbnRleHQsCi0gICAgY29uc3QgQ29tUHRyPElEM0QxMVZpZGVvUHJvY2Vzc29yRW51bWVyYXRvcj4mIHZpZGVvX2VudW1lcmF0b3IsCi0gICAgY29uc3QgQ29tUHRyPElEM0QxMVZpZGVvUHJvY2Vzc29yPiYgdmlkZW9fcHJvY2Vzc29yLAotICAgIGNvbnN0IENvbVB0cjxJTUZTYW1wbGU+JiB2aWRlb19zYW1wbGUsCi0gICAgY29uc3QgUkVDVCYgdmlkZW9fYXJlYSkKLSAgICA6IHJlZmNvdW50KDEpIHsKLSAgU2JNZW1vcnlTZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7Ci0gIGluZm8uZm9ybWF0ID0ga1NiRGVjb2RlVGFyZ2V0Rm9ybWF0MlBsYW5lWVVWTlYxMjsKLSAgaW5mby5pc19vcGFxdWUgPSB0cnVlOwotICBpbmZvLndpZHRoID0gdmlkZW9fYXJlYS5yaWdodDsKLSAgaW5mby5oZWlnaHQgPSB2aWRlb19hcmVhLmJvdHRvbTsKLQotICBkM2RfdGV4dHVyZSA9IENyZWF0ZUVtcHR5VGV4dHVyZShkM2RfZGV2aWNlLCBpbmZvLndpZHRoLCBpbmZvLmhlaWdodCk7Ci0gIGlmICh2aWRlb19zYW1wbGUpIHsKLSAgICBVcGRhdGVUZXh0dXJlKGQzZF90ZXh0dXJlLCB2aWRlb19kZXZpY2UsIHZpZGVvX2NvbnRleHQsIHZpZGVvX2VudW1lcmF0b3IsCi0gICAgICAgICAgICAgICAgICB2aWRlb19wcm9jZXNzb3IsIHZpZGVvX3NhbXBsZSwgdmlkZW9fYXJlYSk7Ci0gIH0KLSAgQ3JlYXRlR0xTdXJmYWNlc05WMTIoZDNkX3RleHR1cmUsIGluZm8ud2lkdGgsIGluZm8uaGVpZ2h0KTsKLX0KLQotU2JEZWNvZGVUYXJnZXRQcml2YXRlOjp+U2JEZWNvZGVUYXJnZXRQcml2YXRlKCkgewotICBnbERlbGV0ZVRleHR1cmVzKDEsICYoaW5mby5wbGFuZXNba1NiRGVjb2RlVGFyZ2V0UGxhbmVZXS50ZXh0dXJlKSk7Ci0gIGdsRGVsZXRlVGV4dHVyZXMoMSwgJihpbmZvLnBsYW5lc1trU2JEZWNvZGVUYXJnZXRQbGFuZVVWXS50ZXh0dXJlKSk7Ci0KLSAgRUdMRGlzcGxheSBkaXNwbGF5ID0gZWdsR2V0RGlzcGxheShFR0xfREVGQVVMVF9ESVNQTEFZKTsKLQotICBlZ2xSZWxlYXNlVGV4SW1hZ2UoZGlzcGxheSwgc3VyZmFjZVswXSwgRUdMX0JBQ0tfQlVGRkVSKTsKLSAgZWdsRGVzdHJveVN1cmZhY2UoZGlzcGxheSwgc3VyZmFjZVswXSk7Ci0KLSAgZWdsUmVsZWFzZVRleEltYWdlKGRpc3BsYXksIHN1cmZhY2VbMV0sIEVHTF9CQUNLX0JVRkZFUik7Ci0gIGVnbERlc3Ryb3lTdXJmYWNlKGRpc3BsYXksIHN1cmZhY2VbMV0pOwotfQotCi1ib29sIFNiRGVjb2RlVGFyZ2V0UHJpdmF0ZTo6VXBkYXRlKAotICAgIGNvbnN0IENvbVB0cjxJRDNEMTFEZXZpY2U+JiBkM2RfZGV2aWNlLAotICAgIGNvbnN0IENvbVB0cjxJRDNEMTFWaWRlb0RldmljZTE+JiB2aWRlb19kZXZpY2UsCi0gICAgY29uc3QgQ29tUHRyPElEM0QxMVZpZGVvQ29udGV4dD4mIHZpZGVvX2NvbnRleHQsCi0gICAgY29uc3QgQ29tUHRyPElEM0QxMVZpZGVvUHJvY2Vzc29yRW51bWVyYXRvcj4mIHZpZGVvX2VudW1lcmF0b3IsCi0gICAgY29uc3QgQ29tUHRyPElEM0QxMVZpZGVvUHJvY2Vzc29yPiYgdmlkZW9fcHJvY2Vzc29yLAotICAgIGNvbnN0IENvbVB0cjxJTUZTYW1wbGU+JiB2aWRlb19zYW1wbGUsCi0gICAgY29uc3QgUkVDVCYgdmlkZW9fYXJlYSkgewotICAvLyBPbmx5IGFsbG93IHVwZGF0aW5nIGlmIHRoaXMgaXMgdGhlIG9ubHkgcmVmZXJlbmNlLiBPdGhlcndpc2UgdGhlIHVwZGF0ZQotICAvLyBtYXkgY2hhbmdlIHNvbWV0aGluZyB0aGF0J3MgY3VycmVudGx5IGJlaW5nIHVzZWQuCi0gIGlmIChTYkF0b21pY05vQmFycmllcl9Mb2FkKCZyZWZjb3VudCkgPiAxKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gVGhlIGRlY29kZSB0YXJnZXQgaW5mbyBtdXN0IGJlIGNvbXBhdGlibGUuIFRoZSByZXNvbHV0aW9uIHNob3VsZCBtYXRjaAotICAvLyBleGFjdGx5LCBvdGhlcndpc2UgdGhlIHNoYWRlciBtYXkgc2FtcGxlIGludmFsaWQgdGV4ZWxzIGFsb25nIHRoZQotICAvLyB0ZXh0dXJlIGJvcmRlci4KLSAgaWYgKGluZm8uZm9ybWF0ICE9IGtTYkRlY29kZVRhcmdldEZvcm1hdDJQbGFuZVlVVk5WMTIgfHwKLSAgICAgIGluZm8uaXNfb3BhcXVlICE9IHRydWUgfHwgaW5mby53aWR0aCAhPSB2aWRlb19hcmVhLnJpZ2h0IHx8Ci0gICAgICBpbmZvLmhlaWdodCAhPSB2aWRlb19hcmVhLmJvdHRvbSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIFNCX1VOUkVGRVJFTkNFRF9QQVJBTUVURVIoZDNkX2RldmljZSk7Ci0gIFVwZGF0ZVRleHR1cmUoZDNkX3RleHR1cmUsIHZpZGVvX2RldmljZSwgdmlkZW9fY29udGV4dCwgdmlkZW9fZW51bWVyYXRvciwKLSAgICAgICAgICAgICAgICB2aWRlb19wcm9jZXNzb3IsIHZpZGVvX3NhbXBsZSwgdmlkZW9fYXJlYSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIFNiRGVjb2RlVGFyZ2V0UHJpdmF0ZTo6QWRkUmVmKCkgewotICBTYkF0b21pY0JhcnJpZXJfSW5jcmVtZW50KCZyZWZjb3VudCwgMSk7Ci19Ci0KLXZvaWQgU2JEZWNvZGVUYXJnZXRQcml2YXRlOjpSZWxlYXNlKCkgewotICBpbnQgbmV3X2NvdW50ID0gU2JBdG9taWNCYXJyaWVyX0luY3JlbWVudCgmcmVmY291bnQsIC0xKTsKLSAgU0JfRENIRUNLKG5ld19jb3VudCA+PSAwKTsKLSAgaWYgKG5ld19jb3VudCA9PSAwKSB7Ci0gICAgZGVsZXRlIHRoaXM7Ci0gIH0KLX0KLQotdm9pZCBTYkRlY29kZVRhcmdldFJlbGVhc2UoU2JEZWNvZGVUYXJnZXQgZGVjb2RlX3RhcmdldCkgewotICBpZiAoU2JEZWNvZGVUYXJnZXRJc1ZhbGlkKGRlY29kZV90YXJnZXQpKSB7Ci0gICAgZGVjb2RlX3RhcmdldC0+UmVsZWFzZSgpOwotICB9Ci19Ci0KLVNiRGVjb2RlVGFyZ2V0Rm9ybWF0IFNiRGVjb2RlVGFyZ2V0R2V0Rm9ybWF0KFNiRGVjb2RlVGFyZ2V0IGRlY29kZV90YXJnZXQpIHsKLSAgLy8gTm90ZSB0aGF0IGtTYkRlY29kZVRhcmdldEZvcm1hdDJQbGFuZVlVVk5WMTIgcmVwcmVzZW50cyBEWEdJX0ZPUk1BVF9OVjEyLgotICBTQl9EQ0hFQ0soa1NiRGVjb2RlVGFyZ2V0Rm9ybWF0MlBsYW5lWVVWTlYxMiA9PSBkZWNvZGVfdGFyZ2V0LT5pbmZvLmZvcm1hdCk7Ci0gIHJldHVybiBkZWNvZGVfdGFyZ2V0LT5pbmZvLmZvcm1hdDsKLX0KLQotYm9vbCBTYkRlY29kZVRhcmdldEdldEluZm8oU2JEZWNvZGVUYXJnZXQgZGVjb2RlX3RhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiRGVjb2RlVGFyZ2V0SW5mbyogb3V0X2luZm8pIHsKLSAgaWYgKCFvdXRfaW5mbyB8fCAhU2JNZW1vcnlJc1plcm8ob3V0X2luZm8sIHNpemVvZigqb3V0X2luZm8pKSkgewotICAgIFNCX0RDSEVDSyhmYWxzZSkgPDwgIm91dF9pbmZvIG11c3QgYmUgemVyb2VkIG91dC4iOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBTYk1lbW9yeUNvcHkob3V0X2luZm8sICZkZWNvZGVfdGFyZ2V0LT5pbmZvLCBzaXplb2YoKm91dF9pbmZvKSk7Ci0gIHJldHVybiB0cnVlOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9kZWNvZGVfdGFyZ2V0X2ludGVybmFsLmggYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC91d3AvZGVjb2RlX3RhcmdldF9pbnRlcm5hbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzcyNWIyLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9kZWNvZGVfdGFyZ2V0X2ludGVybmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaWZuZGVmIFNUQVJCT0FSRF9TSEFSRURfVVdQX0RFQ09ERV9UQVJHRVRfSU5URVJOQUxfSF8KLSNkZWZpbmUgU1RBUkJPQVJEX1NIQVJFRF9VV1BfREVDT0RFX1RBUkdFVF9JTlRFUk5BTF9IXwotCi0jaW5jbHVkZSA8RDNkMTFfMS5oPgotI2luY2x1ZGUgPG1maWRsLmg+Ci0jaW5jbHVkZSA8d3JsL2NsaWVudC5oPgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2F0b21pYy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9kZWNvZGVfdGFyZ2V0LmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9saWJ2cHhfeGIxL3ZweF94YjFfdmlkZW9fZGVjb2Rlci5oIgotCi1zdHJ1Y3QgU2JEZWNvZGVUYXJnZXRQcml2YXRlIHsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIHVzaW5nIENvbVB0ciA9IE1pY3Jvc29mdDo6V1JMOjpDb21QdHI8VD47Ci0KLSAgU2JBdG9taWMzMiByZWZjb3VudDsKLQotICAvLyBQdWJsaWNseSBhY2Nlc3NpYmxlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkZWNvZGUgdGFyZ2V0LgotICBTYkRlY29kZVRhcmdldEluZm8gaW5mbzsKLQotICBDb21QdHI8SUQzRDExVGV4dHVyZTJEPiBkM2RfdGV4dHVyZTsKLQotICAvLyBFR0xTdXJmYWNlIGlzIGRlZmluZWQgYXMgdm9pZCogaW4gInRoaXJkX3BhcnR5L2FuZ2xlL2luY2x1ZGUvRUdML2VnbC5oIi4KLSAgLy8gVXNlIHZvaWQqIGRpcmVjdGx5IGhlcmUgdG8gYXZvaWQgYGVnbC5oYCBiZWluZyBpbmNsdWRlZCBicm9hZGx5LgotICB2b2lkKiBzdXJmYWNlWzJdOwotCi0gIENvbVB0cjxJRDNEMTFUZXh0dXJlMkQ+IGQzZF90ZXh0dXJlc19bM107Ci0gIHZvaWQqIHN1cmZhY2VfWzNdID0ge307Ci0gIENvbVB0cjxJRDNEMTFEZXZpY2U+IGQzZF9kZXZpY2VfID0gbnVsbHB0cjsKLQotICBTYkRlY29kZVRhcmdldFByaXZhdGUoCi0gICAgICBjb25zdCBDb21QdHI8SUQzRDExRGV2aWNlPiYgZDNkX2RldmljZSwKLSAgICAgIGNvbnN0IENvbVB0cjxJRDNEMTFWaWRlb0RldmljZTE+JiB2aWRlb19kZXZpY2UsCi0gICAgICBjb25zdCBDb21QdHI8SUQzRDExVmlkZW9Db250ZXh0PiYgdmlkZW9fY29udGV4dCwKLSAgICAgIGNvbnN0IENvbVB0cjxJRDNEMTFWaWRlb1Byb2Nlc3NvckVudW1lcmF0b3I+JiB2aWRlb19lbnVtZXJhdG9yLAotICAgICAgY29uc3QgQ29tUHRyPElEM0QxMVZpZGVvUHJvY2Vzc29yPiYgdmlkZW9fcHJvY2Vzc29yLAotICAgICAgY29uc3QgQ29tUHRyPElNRlNhbXBsZT4mIHZpZGVvX3NhbXBsZSwKLSAgICAgIGNvbnN0IFJFQ1QmIHZpZGVvX2FyZWEpOwotCi0gIC8vIFRoaXMgY29uc3RydWN0b3Igd29ya3MgcHJvcGVybHkgZm9yIFhib3ggT25lIHBsYXRmb3JtIG9ubHkKLSAgU2JEZWNvZGVUYXJnZXRQcml2YXRlKGNvbnN0IENvbVB0cjxJRDNEMTFEZXZpY2U+JiBkM2RfZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdnB4X2ltYWdlX3QqIGltZywKLSAgICAgICAgICAgICAgICAgICAgICAgIEJZVEUqIGZyYW1lX2J1Zl9udjEyKTsKLQotICB+U2JEZWNvZGVUYXJnZXRQcml2YXRlKCk7Ci0KLSAgLy8gVXBkYXRlIHRoZSBleGlzdGluZyB0ZXh0dXJlIHdpdGggdGhlIGdpdmVuIHZpZGVvX3NhbXBsZSdzIGRhdGEuCi0gIC8vIElmIHRoZSBjdXJyZW50IG9iamVjdCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBuZXcgdmlkZW9fc2FtcGxlLCB0aGVuCi0gIC8vIHRoaXMgd2lsbCByZXR1cm4gZmFsc2UsIGFuZCB0aGUgY2FsbGVyIHNob3VsZCBqdXN0IGNyZWF0ZSBhIG5ldwotICAvLyBkZWNvZGUgdGFyZ2V0IGZvciB0aGUgc2FtcGxlLgotICBib29sIFVwZGF0ZShjb25zdCBDb21QdHI8SUQzRDExRGV2aWNlPiYgZDNkX2RldmljZSwKLSAgICAgICAgICAgICAgY29uc3QgQ29tUHRyPElEM0QxMVZpZGVvRGV2aWNlMT4mIHZpZGVvX2RldmljZSwKLSAgICAgICAgICAgICAgY29uc3QgQ29tUHRyPElEM0QxMVZpZGVvQ29udGV4dD4mIHZpZGVvX2NvbnRleHQsCi0gICAgICAgICAgICAgIGNvbnN0IENvbVB0cjxJRDNEMTFWaWRlb1Byb2Nlc3NvckVudW1lcmF0b3I+JiB2aWRlb19lbnVtZXJhdG9yLAotICAgICAgICAgICAgICBjb25zdCBDb21QdHI8SUQzRDExVmlkZW9Qcm9jZXNzb3I+JiB2aWRlb19wcm9jZXNzb3IsCi0gICAgICAgICAgICAgIGNvbnN0IENvbVB0cjxJTUZTYW1wbGU+JiB2aWRlb19zYW1wbGUsCi0gICAgICAgICAgICAgIGNvbnN0IFJFQ1QmIHZpZGVvX2FyZWEpOwotICB2b2lkIENyZWF0ZUdMU3VyZmFjZXNOVjEyKGNvbnN0IENvbVB0cjxJRDNEMTFUZXh0dXJlMkQ+JiB0ZXh0dXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXNwbGF5X3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXNwbGF5X2hlaWdodCk7Ci0gIHZvaWQgQWRkUmVmKCk7Ci0gIHZvaWQgUmVsZWFzZSgpOwotfTsKLQotI2VuZGlmICAvLyBTVEFSQk9BUkRfU0hBUkVEX1VXUF9ERUNPREVfVEFSR0VUX0lOVEVSTkFMX0hfCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC91d3AvZ2V0X2hvbWVfZGlyZWN0b3J5LmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL2dldF9ob21lX2RpcmVjdG9yeS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMwOGEzYi4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC91d3AvZ2V0X2hvbWVfZGlyZWN0b3J5LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL25vdXNlci91c2VyX2ludGVybmFsLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi93Y2hhcl91dGlscy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zdHJpbmcuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc3lzdGVtLmgiCi0KLXVzaW5nIFdpbmRvd3M6OlN0b3JhZ2U6OkFwcGxpY2F0aW9uRGF0YTsKLQotbmFtZXNwYWNlIHNid2luMzIgPSBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI7Ci0KLW5hbWVzcGFjZSBzdGFyYm9hcmQgewotbmFtZXNwYWNlIHNoYXJlZCB7Ci1uYW1lc3BhY2Ugbm91c2VyIHsKLQotYm9vbCBHZXRIb21lRGlyZWN0b3J5KFNiVXNlciB1c2VyLCBjaGFyKiBvdXRfcGF0aCwgaW50IHBhdGhfc2l6ZSkgewotICBpZiAodXNlciAhPSBTYlVzZXJHZXRDdXJyZW50KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgc3RkOjpzdHJpbmcgaG9tZV9kaXJlY3RvcnkgPSBzYndpbjMyOjpwbGF0Zm9ybVN0cmluZ1RvU3RyaW5nKAotICAgICAgQXBwbGljYXRpb25EYXRhOjpDdXJyZW50LT5Mb2NhbEZvbGRlci0+UGF0aCk7Ci0gIHJldHVybiBTYlN0cmluZ0NvcHkob3V0X3BhdGgsIGhvbWVfZGlyZWN0b3J5LmNfc3RyKCksIHBhdGhfc2l6ZSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBub3VzZXIKLX0gIC8vIG5hbWVzcGFjZSBzaGFyZWQKLX0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9sb2dfZmlsZV9pbXBsLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL2xvZ19maWxlX2ltcGwuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMWY2ZTAuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL2xvZ19maWxlX2ltcGwuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC91d3AvbG9nX2ZpbGVfaW1wbC5oIgotCi0jaW5jbHVkZSA8cHBsdGFza3MuaD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJzdGFyYm9hcmQvY29tbW9uL3Njb3BlZF9wdHIuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbXV0ZXguaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvb25jZS5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvdXdwL2xvZ193cml0ZXJfdXdwLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC91d3AvbG9nX3dyaXRlcl93aW4zMi5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zdHJpbmcuaCIKLQotdXNpbmcgV2luZG93czo6U3RvcmFnZTo6U3RvcmFnZUZvbGRlcjsKLQotbmFtZXNwYWNlIHN0YXJib2FyZCB7Ci1uYW1lc3BhY2Ugc2hhcmVkIHsKLW5hbWVzcGFjZSB1d3AgewotCi1uYW1lc3BhY2UgewotCi1jbGFzcyBMb2dGaWxlSW1wbCB7Ci0gcHVibGljOgotICBzdGF0aWMgTG9nRmlsZUltcGwqIEdldEluc3RhbmNlKCk7Ci0KLSAgdm9pZCBPcGVuVVdQKFN0b3JhZ2VGb2xkZXJeIGZvbGRlciwgY29uc3QgY2hhciogZmlsZW5hbWUpIHsKLSAgICBTY29wZWRMb2NrIGxvY2sobXV0ZXhfKTsKLSAgICBpbXBsXy5yZXNldCgpOwotICAgIGltcGxfID0gQ3JlYXRlTG9nV3JpdGVyVVdQKGZvbGRlciwgZmlsZW5hbWUpOwotICB9Ci0KLSAgdm9pZCBPcGVuV2luMzIoY29uc3QgY2hhciogcGF0aCkgewotICAgIFNjb3BlZExvY2sgbG9jayhtdXRleF8pOwotICAgIGltcGxfLnJlc2V0KCk7Ci0gICAgaW1wbF8gPSBDcmVhdGVMb2dXcml0ZXJXaW4zMihwYXRoKTsKLSAgfQotCi0gIHZvaWQgQ2xvc2UoKSB7Ci0gICAgU2NvcGVkTG9jayBsb2NrKG11dGV4Xyk7Ci0gICAgaW1wbF8ucmVzZXQoKTsKLSAgfQotCi0gIHZvaWQgV3JpdGUoY29uc3QgY2hhciogdGV4dCwgaW50IHRleHRfbGVuZ3RoKSB7Ci0gICAgU2NvcGVkTG9jayBsb2NrKG11dGV4Xyk7Ci0gICAgaWYgKGltcGxfKSB7Ci0gICAgICBpbXBsXy0+V3JpdGUodGV4dCwgdGV4dF9sZW5ndGgpOwotICAgIH0KLSAgfQotCi0gcHJpdmF0ZToKLSAgTG9nRmlsZUltcGwoKSB7fQotICBzdGFyYm9hcmQ6Ok11dGV4IG11dGV4XzsKLSAgc3RhcmJvYXJkOjpzY29wZWRfcHRyPElMb2dXcml0ZXI+IGltcGxfOwotfTsKLQotU0JfT05DRV9JTklUSUFMSVpFX0ZVTkNUSU9OKExvZ0ZpbGVJbXBsLCBMb2dGaWxlSW1wbDo6R2V0SW5zdGFuY2UpOwotCi19ICAvLyBuYW1lc3BhY2UKLQotdm9pZCBDbG9zZUxvZ0ZpbGUoKSB7Ci0gIExvZ0ZpbGVJbXBsOjpHZXRJbnN0YW5jZSgpLT5DbG9zZSgpOwotfQotCi12b2lkIE9wZW5Mb2dGaWxlVVdQKFN0b3JhZ2VGb2xkZXJeIGZvbGRlciwgY29uc3QgY2hhciogZmlsZW5hbWUpIHsKLSAgTG9nRmlsZUltcGw6OkdldEluc3RhbmNlKCktPk9wZW5VV1AoZm9sZGVyLCBmaWxlbmFtZSk7Ci19Ci0KLXZvaWQgT3BlbkxvZ0ZpbGVXaW4zMihjb25zdCBjaGFyKiBwYXRoKSB7Ci0gIExvZ0ZpbGVJbXBsOjpHZXRJbnN0YW5jZSgpLT5PcGVuV2luMzIocGF0aCk7Ci19Ci0KLXZvaWQgV3JpdGVUb0xvZ0ZpbGUoY29uc3QgY2hhciogdGV4dCwgaW50IHRleHRfbGVuZ3RoKSB7Ci0gIGlmICh0ZXh0X2xlbmd0aCA8PSAwKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIExvZ0ZpbGVJbXBsOjpHZXRJbnN0YW5jZSgpLT5Xcml0ZSh0ZXh0LCB0ZXh0X2xlbmd0aCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB1d3AKLX0gIC8vIG5hbWVzcGFjZSBzaGFyZWQKLX0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9sb2dfZmlsZV9pbXBsLmggYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC91d3AvbG9nX2ZpbGVfaW1wbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmQxYzE3Li4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9sb2dfZmlsZV9pbXBsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0vLyBUaGlzIGhlYWRlciBwcm92aWRlcyBhIG1lY2hhbmlzbSBmb3IgbXVsdGlwbGUgQW5kcm9pZCBsb2dnaW5nCi0vLyBmb3JtYXRzIHRvIHNoYXJlIGEgc2luZ2xlIGxvZyBmaWxlIGhhbmRsZS4KLQotI2lmbmRlZiBTVEFSQk9BUkRfU0hBUkVEX1VXUF9MT0dfRklMRV9JTVBMX0hfCi0jZGVmaW5lIFNUQVJCT0FSRF9TSEFSRURfVVdQX0xPR19GSUxFX0lNUExfSF8KLQotbmFtZXNwYWNlIHN0YXJib2FyZCB7Ci1uYW1lc3BhY2Ugc2hhcmVkIHsKLW5hbWVzcGFjZSB1d3AgewotCi12b2lkIE9wZW5Mb2dGaWxlVVdQKFdpbmRvd3M6OlN0b3JhZ2U6OlN0b3JhZ2VGb2xkZXJeIGZvbGRlciwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZW5hbWUpOwotCi12b2lkIE9wZW5Mb2dGaWxlV2luMzIoY29uc3QgY2hhciogcGF0aCk7Ci0KLXZvaWQgQ2xvc2VMb2dGaWxlKCk7Ci12b2lkIFdyaXRlVG9Mb2dGaWxlKGNvbnN0IGNoYXIqIHRleHQsIGludCB0ZXh0X2xlbmd0aCk7Ci0KLX0gIC8vIG5hbWVzcGFjZSB1d3AKLX0gIC8vIG5hbWVzcGFjZSBzaGFyZWQKLX0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKLQotI2VuZGlmICAvLyBTVEFSQk9BUkRfU0hBUkVEX1VXUF9MT0dfRklMRV9JTVBMX0hfCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC91d3AvbG9nX3Jhdy5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9sb2dfcmF3LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2E3M2M3Li4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9sb2dfcmF3LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8d2luZG93cy5oPgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbmV0X2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvdXdwL2xvZ19maWxlX2ltcGwuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc3RyaW5nLmgiCi0KLW5hbWVzcGFjZSBzYnV3cCA9IHN0YXJib2FyZDo6c2hhcmVkOjp1d3A7Ci0KLW5hbWVzcGFjZSB7Ci0KLXZvaWQgT3V0cHV0VG9EZWJ1Z0NvbnNvbGUoY29uc3QgY2hhciogbWVzc2FnZSkgewotICAvLyBPdXRwdXREZWJ1Z1N0cmluZ0EgbWF5IHN0YWxsIGZvciBtdWx0aXBsZSBzZWNvbmRzIGlmIHRoZSBvdXRwdXQgc3RyaW5nIGlzCi0gIC8vIHRvbyBsb25nLiBTcGxpdCB8bWVzc2FnZXwgaW50byBzaG9ydGVyIHN0cmluZ3MgZm9yIG91dHB1dC4KLSAgY2hhciBidWZmZXJbNTEyXTsKLSAgZm9yICg7OykgewotICAgIGVycm5vX3QgcmVzdWx0ID0gc3RybmNweV9zKGJ1ZmZlciwgbWVzc2FnZSwgX1RSVU5DQVRFKTsKLSAgICBpZiAocmVzdWx0ID09IDApIHsKLSAgICAgIE91dHB1dERlYnVnU3RyaW5nQShidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgfSBlbHNlIGlmIChyZXN1bHQgPT0gU1RSVU5DQVRFKSB7Ci0gICAgICBPdXRwdXREZWJ1Z1N0cmluZ0EoYnVmZmVyKTsKLSAgICAgIG1lc3NhZ2UgKz0gc2l6ZW9mKGJ1ZmZlcikgLSAxOwotICAgIH0gZWxzZSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlLgotCi12b2lkIFNiTG9nUmF3KGNvbnN0IGNoYXIqIG1lc3NhZ2UpIHsKLSAgZnByaW50ZihzdGRlcnIsICIlcyIsIG1lc3NhZ2UpOwotICBzYnV3cDo6V3JpdGVUb0xvZ0ZpbGUoCi0gICAgICBtZXNzYWdlLCBzdGF0aWNfY2FzdDxpbnQ+KFNiU3RyaW5nR2V0TGVuZ3RoKG1lc3NhZ2UpKSk7Ci0KLSAgT3V0cHV0VG9EZWJ1Z0NvbnNvbGUobWVzc2FnZSk7Ci0gIHN0YXJib2FyZDo6c2hhcmVkOjpzdGFyYm9hcmQ6Ok5ldExvZ1dyaXRlKG1lc3NhZ2UpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL2xvZ19yYXdfZm9ybWF0LmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL2xvZ19yYXdfZm9ybWF0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjY0ZmJlLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9sb2dfcmF3X2Zvcm1hdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi12b2lkIFNiTG9nUmF3Rm9ybWF0KGNvbnN0IGNoYXIqIGZvcm1hdCwgdmFfbGlzdCBhcmd1bWVudHMpIHsKLSAgY2hhciBsb2dfYnVmZmVyWzE2ICogMTAyNF07Ci0gIHZzbnByaW50Zl9zKGxvZ19idWZmZXIsIF9UUlVOQ0FURSwgZm9ybWF0LCBhcmd1bWVudHMpOwotICBTYkxvZ1Jhdyhsb2dfYnVmZmVyKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9sb2dfd3JpdGVyX2ludGVyZmFjZS5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL2xvZ193cml0ZXJfaW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NTU4M2IuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL2xvZ193cml0ZXJfaW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaWZuZGVmIFNUQVJCT0FSRF9TSEFSRURfVVdQX0xPR19XUklURVJfSU5URVJGQUNFX0hfCi0jZGVmaW5lIFNUQVJCT0FSRF9TSEFSRURfVVdQX0xPR19XUklURVJfSU5URVJGQUNFX0hfCi0KLW5hbWVzcGFjZSBzdGFyYm9hcmQgewotbmFtZXNwYWNlIHNoYXJlZCB7Ci1uYW1lc3BhY2UgdXdwIHsKLQotY2xhc3MgSUxvZ1dyaXRlciB7Ci0gcHVibGljOgotICBJTG9nV3JpdGVyKCkge30KLSAgdmlydHVhbCB+SUxvZ1dyaXRlcigpIHt9Ci0gIHZpcnR1YWwgdm9pZCBXcml0ZShjb25zdCBjaGFyKiBjb250ZW50LCBpbnQgc2l6ZSkgPSAwOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHV3cAotfSAgLy8gbmFtZXNwYWNlIHNoYXJlZAotfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZAotCi0jZW5kaWYgIC8vIFNUQVJCT0FSRF9TSEFSRURfVVdQX0xPR19XUklURVJfSU5URVJGQUNFX0hfCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC91d3AvbG9nX3dyaXRlcl91d3AuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC91d3AvbG9nX3dyaXRlcl91d3AuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNDk1OWMuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL2xvZ193cml0ZXJfdXdwLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3V3cC9sb2dfd3JpdGVyX3V3cC5oIgotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2NvbW1vbi9zZW1hcGhvcmUuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL211dGV4LmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL29uY2UuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3djaGFyX3V0aWxzLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3N0cmluZy5oIgotCi11c2luZyBXaW5kb3dzOjpGb3VuZGF0aW9uOjpBc3luY09wZXJhdGlvbkNvbXBsZXRlZEhhbmRsZXI7Ci11c2luZyBXaW5kb3dzOjpGb3VuZGF0aW9uOjpBc3luY1N0YXR1czsKLXVzaW5nIFdpbmRvd3M6OkZvdW5kYXRpb246OklBc3luY09wZXJhdGlvbjsKLXVzaW5nIFdpbmRvd3M6OlN0b3JhZ2U6OkZpbGVBY2Nlc3NNb2RlOwotdXNpbmcgV2luZG93czo6U3RvcmFnZTo6U3RvcmFnZUZpbGU7Ci11c2luZyBXaW5kb3dzOjpTdG9yYWdlOjpTdG9yYWdlRm9sZGVyOwotdXNpbmcgV2luZG93czo6U3RvcmFnZTo6U3RyZWFtczo6RGF0YVdyaXRlcjsKLXVzaW5nIFdpbmRvd3M6OlN0b3JhZ2U6OlN0cmVhbXM6OklSYW5kb21BY2Nlc3NTdHJlYW07Ci11c2luZyBXaW5kb3dzOjpTdG9yYWdlOjpTdHJlYW1zOjpJT3V0cHV0U3RyZWFtOwotCi1uYW1lc3BhY2Ugc3RhcmJvYXJkIHsKLW5hbWVzcGFjZSBzaGFyZWQgewotbmFtZXNwYWNlIHV3cCB7Ci1uYW1lc3BhY2UgewotCi1jbGFzcyBTaGFyZWRNdXRleCB7Ci0gcHVibGljOgotICBTaGFyZWRNdXRleCgpIDogc2VtYV8oMSkge30KLSAgdm9pZCBBY3F1aXJlKCkgeyBzZW1hXy5UYWtlKCk7IH0KLSAgdm9pZCBSZWxlYXNlKCkgeyBzZW1hXy5QdXQoKTsgfQotICBib29sIEFjcXVpcmVUcnkoKSB7IHJldHVybiBzZW1hXy5UYWtlVHJ5KCk7IH0KLSBwcml2YXRlOgotICBTZW1hcGhvcmUgc2VtYV87Ci19OwotCi1jbGFzcyBMb2dXcml0ZXJVV1AgOiBwdWJsaWMgSUxvZ1dyaXRlciB7Ci0gcHVibGljOgotICBMb2dXcml0ZXJVV1AoU3RvcmFnZUZvbGRlcl4gZm9sZGVyLCBjb25zdCBjaGFyKiBmaWxlbmFtZSkgewotICAgIE9wZW5Mb2dGaWxlKGZvbGRlciwgZmlsZW5hbWUpOwotICB9Ci0KLSAgfkxvZ1dyaXRlclVXUCgpIHsKLSAgICBDbG9zZUxvZ0ZpbGUoKTsKLSAgfQotCi0gIHZvaWQgV3JpdGUoY29uc3QgY2hhciogY29udGVudCwgaW50IHNpemUpIG92ZXJyaWRlIHsKLSAgICBXcml0ZVRvTG9nRmlsZShjb250ZW50LCBzaXplKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gU2JNdXRleCBpcyBub3QgcmVlbnRyYW50LCBzbyBmYWN0b3Igb3V0IGNsb3NlIGxvZyBmaWxlIGZ1bmN0aW9uYWxpdHkgZm9yCi0gIC8vIHVzZSBieSBvdGhlciBmdW5jdGlvbnMuCi0gIHZvaWQgQ2xvc2VMb2dGaWxlX0xvY2tlZCgpIHsKLSAgICBsb2dfd3JpdGVyXyA9IG51bGxwdHI7Ci0gIH0KLQotICB2b2lkIENsb3NlTG9nRmlsZSgpIHsKLSAgICBsb2dfbXV0ZXhfLkFjcXVpcmUoKTsKLSAgICBDbG9zZUxvZ0ZpbGVfTG9ja2VkKCk7Ci0gICAgbG9nX211dGV4Xy5SZWxlYXNlKCk7Ci0gIH0KLQotICB2b2lkIE9wZW5Mb2dGaWxlKFN0b3JhZ2VGb2xkZXJeIGZvbGRlciwgY29uc3QgY2hhciogZmlsZW5hbWUpIHsKLSAgICBzdGQ6OndzdHJpbmcgd2ZpbGVuYW1lID0gd2luMzI6OkNTdHJpbmdUb1dTdHJpbmcoZmlsZW5hbWUpOwotCi0gICAgbG9nX211dGV4Xy5BY3F1aXJlKCk7Ci0gICAgQ2xvc2VMb2dGaWxlX0xvY2tlZCgpOwotCi0gICAgLy8gTWFudWFsbHkgc2V0IHRoZSBjb21wbGV0aW9uIGNhbGxiYWNrIGZ1bmN0aW9uIGluc3RlYWQgb2YgdXNpbmcKLSAgICAvLyBjb25jdXJyZW5jeTo6Y3JlYXRlX3Rhc2soKSBzaW5jZSB0aG9zZSB0YXNrcyBtYXkgbm90IGV4ZWN1dGUgYmVmb3JlIHRoZQotICAgIC8vIFVJIHRocmVhZCB3YW50cyB0aGUgbG9nX211dGV4XyB0byBvdXRwdXQgYW5vdGhlciBsb2cuCi0gICAgYXV0byB0YXNrID0gZm9sZGVyLT5DcmVhdGVGaWxlQXN5bmMoCi0gICAgICAgIHJlZiBuZXcgUGxhdGZvcm06OlN0cmluZyh3ZmlsZW5hbWUuY19zdHIoKSksCi0gICAgICAgIFdpbmRvd3M6OlN0b3JhZ2U6OkNyZWF0aW9uQ29sbGlzaW9uT3B0aW9uOjpSZXBsYWNlRXhpc3RpbmcpOwotICAgIHRhc2stPkNvbXBsZXRlZCA9IHJlZiBuZXcgQXN5bmNPcGVyYXRpb25Db21wbGV0ZWRIYW5kbGVyPFN0b3JhZ2VGaWxlXj4oCi0gICAgICAgIFtmb2xkZXIsIHRoaXNdKElBc3luY09wZXJhdGlvbjxTdG9yYWdlRmlsZV4+XiBvcCwgQXN5bmNTdGF0dXMpIHsKLSAgICAgICAgaWYgKG9wLT5TdGF0dXMgIT0gQXN5bmNTdGF0dXM6OkNvbXBsZXRlZCkgewotICAgICAgICAgIHRoaXMtPmxvZ19tdXRleF8uUmVsZWFzZSgpOwotICAgICAgICAgIFNCX0xPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBvcGVuIGxvZyBmaWxlIGluIGZvbGRlciAiCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCB3aW4zMjo6cGxhdGZvcm1TdHJpbmdUb1N0cmluZyhmb2xkZXItPk5hbWUpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgYXV0byB0YXNrID0gb3AtPkdldFJlc3VsdHMoKS0+T3BlbkFzeW5jKEZpbGVBY2Nlc3NNb2RlOjpSZWFkV3JpdGUpOwotICAgICAgICAgIHRhc2stPkNvbXBsZXRlZCA9IHJlZiBuZXcKLSAgICAgICAgICAgICAgQXN5bmNPcGVyYXRpb25Db21wbGV0ZWRIYW5kbGVyPElSYW5kb21BY2Nlc3NTdHJlYW1ePigKLSAgICAgICAgICAgICAgW3RoaXNdKElBc3luY09wZXJhdGlvbjxJUmFuZG9tQWNjZXNzU3RyZWFtXj5eIG9wLCBBc3luY1N0YXR1cykgewotICAgICAgICAgICAgICAgIHRoaXMtPmxvZ193cml0ZXJfID0gcmVmIG5ldyBEYXRhV3JpdGVyKAotICAgICAgICAgICAgICAgICAgICBvcC0+R2V0UmVzdWx0cygpLT5HZXRPdXRwdXRTdHJlYW1BdCgwKSk7Ci0gICAgICAgICAgICAgICAgdGhpcy0+bG9nX211dGV4Xy5SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgIH0pOwotICAgICAgICB9IGNhdGNoKFBsYXRmb3JtOjpFeGNlcHRpb25eKSB7Ci0gICAgICAgICAgdGhpcy0+bG9nX211dGV4Xy5SZWxlYXNlKCk7Ci0gICAgICAgICAgU0JfTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIG9wZW4gbG9nIGZpbGUgaW4gZm9sZGVyICIKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8IHdpbjMyOjpwbGF0Zm9ybVN0cmluZ1RvU3RyaW5nKGZvbGRlci0+TmFtZSk7Ci0gICAgICAgIH0KLSAgICAgIH0pOwotICB9Ci0KLSAgdm9pZCBXcml0ZVRvTG9nRmlsZShjb25zdCBjaGFyKiB0ZXh0LCBpbnQgdGV4dF9sZW5ndGgpIHsKLSAgICBpZiAodGV4dF9sZW5ndGggPD0gMCkgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBsb2dfbXV0ZXhfLkFjcXVpcmUoKTsKLSAgICBpZiAobG9nX3dyaXRlcl8pIHsKLSAgICAgIGxvZ193cml0ZXJfLT5Xcml0ZUJ5dGVzKHJlZiBuZXcgUGxhdGZvcm06OkFycmF5PHVuc2lnbmVkIGNoYXI+KAotICAgICAgICAgICh1bnNpZ25lZCBjaGFyKikgdGV4dCwgdGV4dF9sZW5ndGgpKTsKLQotICAgICAgLy8gTWFudWFsbHkgc2V0IHRoZSBjb21wbGV0aW9uIGNhbGxiYWNrIGZ1bmN0aW9uIGluc3RlYWQgb2YgdXNpbmcKLSAgICAgIC8vIGNvbmN1cnJlbmN5OjpjcmVhdGVfdGFzaygpIHNpbmNlIHRob3NlIHRhc2tzIG1heSBub3QgZXhlY3V0ZSBiZWZvcmUgdGhlCi0gICAgICAvLyBVSSB0aHJlYWQgd2FudHMgdGhlIGxvZ19tdXRleF8gdG8gb3V0cHV0IGFub3RoZXIgbG9nLgotICAgICAgYXV0byB0YXNrID0gbG9nX3dyaXRlcl8tPlN0b3JlQXN5bmMoKTsKLSAgICAgIHRhc2stPkNvbXBsZXRlZCA9IHJlZiBuZXcgQXN5bmNPcGVyYXRpb25Db21wbGV0ZWRIYW5kbGVyPHVuc2lnbmVkIGludD4oCi0gICAgICAgICAgW3RoaXNdKElBc3luY09wZXJhdGlvbjx1bnNpZ25lZCBpbnQ+XiwgQXN5bmNTdGF0dXMpIHsKLSAgICAgICAgICAgIGF1dG8gdGFzayA9IHRoaXMtPmxvZ193cml0ZXJfLT5GbHVzaEFzeW5jKCk7Ci0gICAgICAgICAgICB0YXNrLT5Db21wbGV0ZWQgPSByZWYgbmV3IEFzeW5jT3BlcmF0aW9uQ29tcGxldGVkSGFuZGxlcjxib29sPigKLSAgICAgICAgICAgICAgICBbdGhpc10oSUFzeW5jT3BlcmF0aW9uPGJvb2w+XiwgQXN5bmNTdGF0dXMpIHsKLSAgICAgICAgICAgICAgICAgIHRoaXMtPmxvZ19tdXRleF8uUmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgIH0pOwotICAgIH0gZWxzZSB7Ci0gICAgICBsb2dfbXV0ZXhfLlJlbGVhc2UoKTsKLSAgICB9Ci0gIH0KLSAgU2hhcmVkTXV0ZXggbG9nX211dGV4XzsKLSAgLy8gVGhlIFdpbmRvd3MgU3RvcmFnZSBBUEkgbXVzdCBiZSB1c2VkIGluIG9yZGVyIHRvIGFjY2VzcyBmaWxlcyBpbgotICAvLyBwcml2aWxlZ2VkIGFyZWFzIChlLmcuIEtub3duRm9sZGVyczo6UmVtb3ZhYmxlRGV2aWNlcykuIFRoZSB3aW4zMgotICAvLyBmaWxlIEFQSSB1c2VkIGJ5IFNiRmlsZSByZXR1cm5zIGFjY2VzcyBkZW5pZWQgZXJyb3JzIGluIHRoZXNlIHNpdHVhdGlvbnMuCi0gIERhdGFXcml0ZXJeIGxvZ193cml0ZXJfID0gbnVsbHB0cjsKLX07Ci19ICAvLyBuYW1lc3BhY2UuCi0KLXNjb3BlZF9wdHI8SUxvZ1dyaXRlcj4gQ3JlYXRlTG9nV3JpdGVyVVdQKAotICAgIFdpbmRvd3M6OlN0b3JhZ2U6OlN0b3JhZ2VGb2xkZXJeIGZvbGRlciwgY29uc3QgY2hhciogZmlsZW5hbWUpIHsKLSAgc2NvcGVkX3B0cjxJTG9nV3JpdGVyPiBvdXRwdXQobmV3IExvZ1dyaXRlclVXUChmb2xkZXIsIGZpbGVuYW1lKSk7Ci0gIHJldHVybiBvdXRwdXQuUGFzcygpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgdXdwCi19ICAvLyBuYW1lc3BhY2Ugc2hhcmVkCi19ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC91d3AvbG9nX3dyaXRlcl91d3AuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9sb2dfd3JpdGVyX3V3cC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTA5NzhiLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9sb2dfd3JpdGVyX3V3cC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBTVEFSQk9BUkRfU0hBUkVEX1VXUF9MT0dfV1JJVEVSX1VXUF9IXwotI2RlZmluZSBTVEFSQk9BUkRfU0hBUkVEX1VXUF9MT0dfV1JJVEVSX1VXUF9IXwotCi0jaW5jbHVkZSA8cHBsdGFza3MuaD4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9jb21tb24vc2NvcGVkX3B0ci5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvdXdwL2xvZ193cml0ZXJfaW50ZXJmYWNlLmgiCi0KLW5hbWVzcGFjZSBzdGFyYm9hcmQgewotbmFtZXNwYWNlIHNoYXJlZCB7Ci1uYW1lc3BhY2UgdXdwIHsKLQotc3RhcmJvYXJkOjpzY29wZWRfcHRyPElMb2dXcml0ZXI+IENyZWF0ZUxvZ1dyaXRlclVXUCgKLSAgICBXaW5kb3dzOjpTdG9yYWdlOjpTdG9yYWdlRm9sZGVyXiBmb2xkZXIsIGNvbnN0IGNoYXIqIGZpbGVuYW1lKTsKLQotfSAgLy8gbmFtZXNwYWNlIHV3cAotfSAgLy8gbmFtZXNwYWNlIHNoYXJlZAotfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZAotCi0jZW5kaWYgIC8vIFNUQVJCT0FSRF9TSEFSRURfVVdQX0xPR19XUklURVJfVVdQX0hfCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC91d3AvbG9nX3dyaXRlcl93aW4zMi5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9sb2dfd3JpdGVyX3dpbjMyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTBlMTFhLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9sb2dfd3JpdGVyX3dpbjMyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvdXdwL2xvZ193cml0ZXJfd2luMzIuaCIKLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9jb21tb24vc2NvcGVkX3B0ci5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9jb21tb24vc2VtYXBob3JlLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL2ZpbGUuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3N0cmluZy5oIgotCi11c2luZyBzdGFyYm9hcmQ6OnNjb3BlZF9wdHI7Ci11c2luZyBzdGFyYm9hcmQ6OlNjb3BlZEZpbGU7Ci0KLW5hbWVzcGFjZSBzdGFyYm9hcmQgewotbmFtZXNwYWNlIHNoYXJlZCB7Ci1uYW1lc3BhY2UgdXdwIHsKLW5hbWVzcGFjZSB7Ci0KLWNsYXNzIExvZ1dyaXRlcldpbjMyIDogcHVibGljIElMb2dXcml0ZXIgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgTG9nV3JpdGVyV2luMzIoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVfcGF0aCkgewotICAgIFNiRmlsZUVycm9yIG91dF9lcnJvciA9IGtTYkZpbGVPazsKLSAgICBib29sIGNyZWF0ZWRfb2sgPSBmYWxzZTsKLSAgICBmaWxlXy5yZXNldCgKLSAgICAgICAgbmV3IFNjb3BlZEZpbGUoZmlsZV9wYXRoLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgIGtTYkZpbGVDcmVhdGVBbHdheXMgfCBrU2JGaWxlV3JpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICZjcmVhdGVkX29rLAotICAgICAgICAgICAgICAgICAgICAgICAmb3V0X2Vycm9yKSk7Ci0gICAgaWYgKCFjcmVhdGVkX29rIHx8IG91dF9lcnJvciAhPSBrU2JGaWxlT2spIHsKLSAgICAgIFNCX0xPRyhFUlJPUikgPDwgIkNvdWxkIG5vdCBjcmVhdGUgd2F0Y2hkb2cgZmlsZSAiIDw8IGZpbGVfcGF0aDsKLSAgICAgIGZpbGVfLnJlc2V0KCk7Ci0gICAgfQotICB9Ci0KLSAgfkxvZ1dyaXRlcldpbjMyKCkgewotICAgIEZsdXNoVG9EaXNrKCk7Ci0gIH0KLQotICB2b2lkIFdyaXRlKGNvbnN0IGNoYXIqIGNvbnRlbnQsIGludCBzaXplKSBvdmVycmlkZSB7Ci0gICAgc3RhcmJvYXJkOjpTY29wZWRMb2NrIGxvY2sobXV0ZXhfKTsKLSAgICBpZiAoSXNWYWxpZF9Mb2NrZWQoKSkgewotICAgICAgZmlsZV8tPldyaXRlKGNvbnRlbnQsIHNpemUpOwotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGJvb2wgSXNWYWxpZF9Mb2NrZWQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGZpbGVfICYmIGZpbGVfLT5Jc1ZhbGlkKCk7Ci0gIH0KLQotICB2b2lkIEZsdXNoVG9EaXNrKCkgIHsKLSAgICBzdGFyYm9hcmQ6OlNjb3BlZExvY2sgbG9jayhtdXRleF8pOwotICAgIGlmIChJc1ZhbGlkX0xvY2tlZCgpKSB7Ci0gICAgICBmaWxlXy0+Rmx1c2goKTsKLSAgICB9Ci0gIH0KLSAgc3RkOjpzdHJpbmcgZmlsZV9wYXRoXzsKLSAgc3RhcmJvYXJkOjpNdXRleCBtdXRleF87Ci0gIHNjb3BlZF9wdHI8U2NvcGVkRmlsZT4gZmlsZV87Ci19OwotCi19ICAvLyBuYW1lc3BhY2UuCi0KLXNjb3BlZF9wdHI8SUxvZ1dyaXRlcj4gQ3JlYXRlTG9nV3JpdGVyV2luMzIoY29uc3QgY2hhciogcGF0aCkgewotICBzY29wZWRfcHRyPElMb2dXcml0ZXI+IG91dHB1dChuZXcgTG9nV3JpdGVyV2luMzIocGF0aCkpOwotICByZXR1cm4gb3V0cHV0LlBhc3MoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHV3cAotfSAgLy8gbmFtZXNwYWNlIHNoYXJlZAotfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL2xvZ193cml0ZXJfd2luMzIuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9sb2dfd3JpdGVyX3dpbjMyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjZDIzM2UuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL2xvZ193cml0ZXJfd2luMzIuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpZm5kZWYgU1RBUkJPQVJEX1NIQVJFRF9VV1BfTE9HX1dSSVRFUl9XSU4zMl9IXwotI2RlZmluZSBTVEFSQk9BUkRfU0hBUkVEX1VXUF9MT0dfV1JJVEVSX1dJTjMyX0hfCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvY29tbW9uL3Njb3BlZF9wdHIuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3V3cC9sb2dfd3JpdGVyX2ludGVyZmFjZS5oIgotCi1uYW1lc3BhY2Ugc3RhcmJvYXJkIHsKLW5hbWVzcGFjZSBzaGFyZWQgewotbmFtZXNwYWNlIHV3cCB7Ci0KLXN0YXJib2FyZDo6c2NvcGVkX3B0cjxJTG9nV3JpdGVyPiBDcmVhdGVMb2dXcml0ZXJXaW4zMihjb25zdCBjaGFyKiBwYXRoKTsKLQotfSAgLy8gbmFtZXNwYWNlIHV3cAotfSAgLy8gbmFtZXNwYWNlIHNoYXJlZAotfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZAotCi0jZW5kaWYgIC8vIFNUQVJCT0FSRF9TSEFSRURfVVdQX0xPR19XUklURVJfV0lOMzJfSF8KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9tZWRpYV9nZXRfYXVkaW9fY29uZmlndXJhdGlvbi5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9tZWRpYV9nZXRfYXVkaW9fY29uZmlndXJhdGlvbi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU3YzkyMy4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC91d3AvbWVkaWFfZ2V0X2F1ZGlvX2NvbmZpZ3VyYXRpb24uY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lZGlhLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC91d3Avd2FzYXBpX2F1ZGlvLmgiCi0KLXVzaW5nIHN0YXJib2FyZDo6c2hhcmVkOjp1d3A6OldBU0FQSUF1ZGlvRGV2aWNlOwotCi1TQl9FWFBPUlQgYm9vbCBTYk1lZGlhR2V0QXVkaW9Db25maWd1cmF0aW9uKAotICAgIGludCBvdXRwdXRfaW5kZXgsCi0gICAgU2JNZWRpYUF1ZGlvQ29uZmlndXJhdGlvbiogb3V0X2NvbmZpZ3VyYXRpb24pIHsKLSAgaWYgKG91dHB1dF9pbmRleCAhPSAwIHx8IG91dF9jb25maWd1cmF0aW9uID09IE5VTEwpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBvdXRfY29uZmlndXJhdGlvbi0+aW5kZXggPSAwOwotICBvdXRfY29uZmlndXJhdGlvbi0+Y29ubmVjdG9yID0ga1NiTWVkaWFBdWRpb0Nvbm5lY3Rvck5vbmU7Ci0gIG91dF9jb25maWd1cmF0aW9uLT5sYXRlbmN5ID0gMDsKLSAgb3V0X2NvbmZpZ3VyYXRpb24tPmNvZGluZ190eXBlID0ga1NiTWVkaWFBdWRpb0NvZGluZ1R5cGVQY207Ci0KLSAgTWljcm9zb2Z0OjpXUkw6OkNvbVB0cjxXQVNBUElBdWRpb0RldmljZT4gYXVkaW9EZXZpY2UgPQotICAgICAgTWljcm9zb2Z0OjpXUkw6Ok1ha2U8V0FTQVBJQXVkaW9EZXZpY2U+KCk7Ci0KLSAgaW50IGNoYW5uZWxzID0gYXVkaW9EZXZpY2UtPkdldE51bUNoYW5uZWxzKCk7Ci0KLSAgaWYgKGNoYW5uZWxzIDwgMikgewotICAgIG91dF9jb25maWd1cmF0aW9uLT5udW1iZXJfb2ZfY2hhbm5lbHMgPSAyOwotICB9IGVsc2UgewotICAgIG91dF9jb25maWd1cmF0aW9uLT5udW1iZXJfb2ZfY2hhbm5lbHMgPSBjaGFubmVsczsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL21lZGlhX2lzX2F1ZGlvX3N1cHBvcnRlZC5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9tZWRpYV9pc19hdWRpb19zdXBwb3J0ZWQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNWUyNmYuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL21lZGlhX2lzX2F1ZGlvX3N1cHBvcnRlZC5jYworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9tZWRpYS9tZWRpYV9zdXBwb3J0X2ludGVybmFsLmgiCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvY29uZmlndXJhdGlvbi5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZWRpYS5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvdXdwL3dhc2FwaV9hdWRpby5oIgotCi11c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6dXdwOjpXQVNBUElBdWRpb0RldmljZTsKLQotU0JfRVhQT1JUIGJvb2wgU2JNZWRpYUlzQXVkaW9TdXBwb3J0ZWQoU2JNZWRpYUF1ZGlvQ29kZWMgYXVkaW9fY29kZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGJpdHJhdGUpIHsKLSAgLy8gVE9ETzogQWRkIE9wdXMuCi0gIGlmIChhdWRpb19jb2RlYyAhPSBrU2JNZWRpYUF1ZGlvQ29kZWNBYWMpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBNaWNyb3NvZnQ6OldSTDo6Q29tUHRyPFdBU0FQSUF1ZGlvRGV2aWNlPiBhdWRpb0RldmljZSA9Ci0gICAgICBNaWNyb3NvZnQ6OldSTDo6TWFrZTxXQVNBUElBdWRpb0RldmljZT4oKTsKLQotICBpbnQ2NF90IGxvY2FsX2JpdHJhdGUgPSBhdWRpb0RldmljZS0+R2V0Qml0cmF0ZSgpOwotCi0gIGlmIChsb2NhbF9iaXRyYXRlIDw9IDApIHsKLSAgICBsb2NhbF9iaXRyYXRlID0gU0JfTUVESUFfTUFYX0FVRElPX0JJVFJBVEVfSU5fQklUU19QRVJfU0VDT05EOwotICB9Ci0KLSAgLy8gSGVyZSB3ZSBzYXkgOiAiVGhlIGFwcCBjYW5ub3QgcGxheSBhbnkgZW5jb2RlZCBhdWRpbyB3aG9zZSBlbmNvZGVkIGJpdHJhdGUKLSAgLy8gZXhjZWVkcyB0aGUgb3V0cHV0IGJpdHJhdGUiCi0gIHJldHVybiBiaXRyYXRlIDw9IGxvY2FsX2JpdHJhdGU7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC91d3AvbWVkaWFfaXNfb3V0cHV0X3Byb3RlY3RlZC5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9tZWRpYV9pc19vdXRwdXRfcHJvdGVjdGVkLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjA4Y2IwLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9tZWRpYV9pc19vdXRwdXRfcHJvdGVjdGVkLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9tZWRpYS5oIgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC91d3AvYXBwbGljYXRpb25fdXdwLmgiCi0KLWJvb2wgU2JNZWRpYUlzT3V0cHV0UHJvdGVjdGVkKCkgewotICByZXR1cm4gc3RhcmJvYXJkOjpzaGFyZWQ6OnV3cDo6QXBwbGljYXRpb25Vd3A6OkdldCgpLT5Jc0hkY3BPbigpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL21lZGlhX2lzX3ZpZGVvX3N1cHBvcnRlZC5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9tZWRpYV9pc192aWRlb19zdXBwb3J0ZWQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZTRlYWIuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL21lZGlhX2lzX3ZpZGVvX3N1cHBvcnRlZC5jYworKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWVkaWEvbWVkaWFfc3VwcG9ydF9pbnRlcm5hbC5oIgotCi0jaW5jbHVkZSA8ZDNkMTEuaD4KLSNpbmNsdWRlIDxkM2QxMi5oPgotI2luY2x1ZGUgPG1mYXBpLmg+Ci0jaW5jbHVkZSA8bWZpZGwuaD4KLSNpbmNsdWRlIDx3cmwvY2xpZW50Lmg+Ci0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3V3cC9hcHBsaWNhdGlvbl91d3AuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9saWJ2cHhfeGIxL2xpYnZweC92cHgvdnA4ZHguaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9saWJ2cHhfeGIxL2xpYnZweC92cHgvdnB4X2RlY29kZXIuaCIKLQotbmFtZXNwYWNlIHsKLQotdXNpbmcgOjpzdGFyYm9hcmQ6OnNoYXJlZDo6dXdwOjpBcHBsaWNhdGlvblV3cDsKLQotY29uc3QgaW50IGtNYXhWcHhHcHVEZWNvZGVUYXJnZXRXaWR0aCA9IDM4NDA7Ci1jb25zdCBpbnQga01heFZweEdwdURlY29kZVRhcmdldEhlaWdodCA9IDIxNjA7Ci1jb25zdCBpbnQga01heFZweEdwdURlY29kZXJDcHVDb3JlVXNlID0gNDsKLQotfSAgLy8gbmFtZXNwYWNlCi0KLSNpZiBTQl9IQVMoTUVESUFfV0VCTV9WUDlfU1VQUE9SVCkKLQotbmFtZXNwYWNlIHsKLS8vIENhY2hlIHRoZSBWUDkgc3VwcG9ydCBzdGF0dXMgc2luY2UgdGhlIGNoZWNrIG1heSBiZSBleHBlbnNpdmUuCi1lbnVtIFZwOVN1cHBvcnQgeyBrVnA5U3VwcG9ydFVua25vd24sIGtWcDlTdXBwb3J0WWVzLCBrVnA5U3VwcG9ydE5vIH07Ci1WcDlTdXBwb3J0IHNfdnA5X2h3X3N1cHBvcnQgPSBrVnA5U3VwcG9ydFVua25vd247Ci1WcDlTdXBwb3J0IHNfdnA5X2dwdV9zdXBwb3J0ID0ga1ZwOVN1cHBvcnRVbmtub3duOwotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIENoZWNrIGZvciBWUDkgc3VwcG9ydC4gU2luY2UgdGhpcyBpcyB1c2VkIGJ5IGEgc3RhcmJvYXJkIGZ1bmN0aW9uLCBpdAotLy8gY2Fubm90IGRlcGVuZCBvbiBvdGhlciBtb2R1bGVzIChlLmcuIEFOR0xFKS4KLVNCX0VYUE9SVCBib29sIElzVnA5SHdEZWNvZGVyU3VwcG9ydGVkKCkgewotICBpZiAoc192cDlfaHdfc3VwcG9ydCA9PSBrVnA5U3VwcG9ydFVua25vd24pIHsKLSAgICAvLyBUcnkgaW5pdGlhbGl6aW5nIHRoZSBWUDkgZGVjb2RlciB0byBkZXRlcm1pbmUgaWYgaXQgaXMgc3VwcG9ydGVkLgotICAgIEhSRVNVTFQgaHI7Ci0KLSAgICBNaWNyb3NvZnQ6OldSTDo6Q29tUHRyPElEM0QxMURldmljZT4gZDNkX2RldmljZTsKLSAgICBociA9IEQzRDExQ3JlYXRlRGV2aWNlKG51bGxwdHIsIEQzRF9EUklWRVJfVFlQRV9IQVJEV0FSRSwgbnVsbHB0ciwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIDAsIEQzRDExX1NES19WRVJTSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZDNkX2RldmljZS5HZXRBZGRyZXNzT2YoKSwgbnVsbHB0ciwgbnVsbHB0cik7Ci0KLSAgICBVSU5UIHJlc2V0X3Rva2VuID0gMDsKLSAgICBNaWNyb3NvZnQ6OldSTDo6Q29tUHRyPElNRkRYR0lEZXZpY2VNYW5hZ2VyPiBkZXZpY2VfbWFuYWdlcjsKLSAgICBpZiAoU1VDQ0VFREVEKGhyKSkgewotICAgICAgaHIgPSBNRkNyZWF0ZURYR0lEZXZpY2VNYW5hZ2VyKCZyZXNldF90b2tlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfbWFuYWdlci5HZXRBZGRyZXNzT2YoKSk7Ci0gICAgfQotICAgIGlmIChTVUNDRUVERUQoaHIpKSB7Ci0gICAgICBociA9IGRldmljZV9tYW5hZ2VyLT5SZXNldERldmljZShkM2RfZGV2aWNlLkdldCgpLCByZXNldF90b2tlbik7Ci0gICAgfQotCi0gICAgTWljcm9zb2Z0OjpXUkw6OkNvbVB0cjxJTUZUcmFuc2Zvcm0+IHRyYW5zZm9ybTsKLSAgICBpZiAoU1VDQ0VFREVEKGhyKSkgewotICAgICAgaHIgPSBDb0NyZWF0ZUluc3RhbmNlKENMU0lEX01TVlB4RGVjb2RlciwgbnVsbHB0ciwgQ0xTQ1RYX0lOUFJPQ19TRVJWRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSUlEX1BQVl9BUkdTKHRyYW5zZm9ybS5HZXRBZGRyZXNzT2YoKSkpOwotICAgIH0KLQotICAgIGlmIChTVUNDRUVERUQoaHIpKSB7Ci0gICAgICBociA9IHRyYW5zZm9ybS0+UHJvY2Vzc01lc3NhZ2UoTUZUX01FU1NBR0VfU0VUX0QzRF9NQU5BR0VSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVMT05HX1BUUihkZXZpY2VfbWFuYWdlci5HZXQoKSkpOwotICAgIH0KLQotICAgIHNfdnA5X2h3X3N1cHBvcnQgPSBTVUNDRUVERUQoaHIpID8ga1ZwOVN1cHBvcnRZZXMgOiBrVnA5U3VwcG9ydE5vOwotICB9Ci0gIHJldHVybiBzX3ZwOV9od19zdXBwb3J0ID09IGtWcDlTdXBwb3J0WWVzOwotfQotCi1TQl9FWFBPUlQgYm9vbCBJc1ZwOUdQVURlY29kZXJTdXBwb3J0ZWQoKSB7Ci0gIGlmIChzX3ZwOV9ncHVfc3VwcG9ydCA9PSBrVnA5U3VwcG9ydFVua25vd24pIHsKLSAgICBEM0QxMl9DT01NQU5EX1FVRVVFX0RFU0MgZGVzYyA9IHt9OwotICAgIGRlc2MuRmxhZ3MgPSBEM0QxMl9DT01NQU5EX1FVRVVFX0ZMQUdfTk9ORTsKLSAgICBkZXNjLlR5cGUgPSBEM0QxMl9DT01NQU5EX0xJU1RfVFlQRV9ESVJFQ1Q7Ci0gICAgTWljcm9zb2Z0OjpXUkw6OkNvbVB0cjxJRDNEMTJDb21tYW5kUXVldWU+IGQzZDEycXVldWU7Ci0gICAgQXBwbGljYXRpb25Vd3AqIGFwcGxpY2F0aW9uX3V3cCA9IEFwcGxpY2F0aW9uVXdwOjpHZXQoKTsKLSAgICBTQl9DSEVDSyhhcHBsaWNhdGlvbl91d3AtPkdldEQzRDEyRGV2aWNlKCkpOwotICAgIEhSRVNVTFQgaHIgPSBhcHBsaWNhdGlvbl91d3AtPkdldEQzRDEyRGV2aWNlKCktPkNyZWF0ZUNvbW1hbmRRdWV1ZSgKLSAgICAgICAgJmRlc2MsIElJRF9QUFZfQVJHUygmZDNkMTJxdWV1ZSkpOwotICAgIGlmIChGQUlMRUQoaHIpKSB7Ci0gICAgICBTQl9MT0coV0FSTklORykKLSAgICAgICAgICA8PCAiQ291bGQgbm90IGNyZWF0ZSBEWDEyIGNvbW1hbmQgcXVldWU6IGNhbm5vdCB1c2UgR1BVIFZQOSI7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHZweF9jb2RlY19jdHggdnB4X2NvbnRleHQgPSB7fTsKLSAgICB2cHhfY29kZWNfZGVjX2NmZ190IHZweF9jb25maWcgPSB7fTsKLSAgICB2cHhfY29uZmlnLncgPSBrTWF4VnB4R3B1RGVjb2RlVGFyZ2V0V2lkdGg7Ci0gICAgdnB4X2NvbmZpZy5oID0ga01heFZweEdwdURlY29kZVRhcmdldEhlaWdodDsKLSAgICB2cHhfY29uZmlnLnRocmVhZHMgPSBrTWF4VnB4R3B1RGVjb2RlckNwdUNvcmVVc2U7Ci0KLSAgICB2cHhfY29uZmlnLmh3X2RldmljZSA9IGFwcGxpY2F0aW9uX3V3cC0+R2V0RDNEMTJEZXZpY2UoKS5HZXQoKTsKLSAgICB2cHhfY29uZmlnLmh3X2NvbW1hbmRfcXVldWUgPSBkM2QxMnF1ZXVlLkdldCgpOwotICAgIHZweF9jb2RlY19lcnJfdCBzdGF0dXMgPQotICAgICAgICB2cHhfY29kZWNfZGVjX2luaXQoJnZweF9jb250ZXh0LCB2cHhfY29kZWNfdnA5X2R4KCksICZ2cHhfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVlBYX0NPREVDX1VTRV9GUkFNRV9USFJFQURJTkcpOwotICAgIHNfdnA5X2dwdV9zdXBwb3J0ID0KLSAgICAgICAgKHN0YXR1cyA9PSBWUFhfQ09ERUNfT0spID8ga1ZwOVN1cHBvcnRZZXMgOiBrVnA5U3VwcG9ydE5vOwotICAgIHZweF9jb2RlY19kZXN0cm95KCZ2cHhfY29udGV4dCk7Ci0gIH0KLSAgcmV0dXJuIHNfdnA5X2dwdV9zdXBwb3J0ID09IGtWcDlTdXBwb3J0WWVzOwotfQotCi0jZWxzZSAgLy8gU0JfSEFTKE1FRElBX1dFQk1fVlA5X1NVUFBPUlQpCi0KLWJvb2wgSXNWcDlId0RlY29kZXJTdXBwb3J0ZWQoKSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBJc1ZwOUdQVURlY29kZXJTdXBwb3J0ZWQoKSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotI2VuZGlmCi0KLVNCX0VYUE9SVCBib29sIFNiTWVkaWFJc1ZpZGVvU3VwcG9ydGVkKFNiTWVkaWFWaWRlb0NvZGVjIHZpZGVvX2NvZGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lX3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lX2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgYml0cmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcHMpIHsKLSAgaW50IG1heF93aWR0aCA9IDE5MjA7Ci0gIGludCBtYXhfaGVpZ2h0ID0gMTA4MDsKLQotICBpZiAodmlkZW9fY29kZWMgPT0ga1NiTWVkaWFWaWRlb0NvZGVjVnA5KSB7Ci0vLyBWcDkgc3VwcG9ydHMgOGsgb25seSBpbiB3aGl0ZWxpc3RlZCBwbGF0Zm9ybXMsIHVwIHRvIDRrIGluIHRoZSBvdGhlcnMuCi0jaWZkZWYgRU5BQkxFX1ZQOV84S19TVVBQT1JUCi0gICAgbWF4X3dpZHRoID0gNzY4MDsKLSAgICBtYXhfaGVpZ2h0ID0gNDMyMDsKLSNlbHNlICAgLy8gRU5BQkxFX1ZQOV84S19TVVBQT1JUCi0gICAgbWF4X3dpZHRoID0gMzg0MDsKLSAgICBtYXhfaGVpZ2h0ID0gMjE2MDsKLSNlbmRpZiAgLy8gRU5BQkxFX1ZQOV84S19TVVBQT1JUCi0gIH0gZWxzZSBpZiAodmlkZW9fY29kZWMgPT0ga1NiTWVkaWFWaWRlb0NvZGVjSDI2NCkgewotLy8gTm90IGFsbCBkZXZpY2VzIGNhbiBzdXBwb3J0IDRrIEgyNjQ7IHNvbWUgKGUuZy4geGIxKSBtYXkgY3Jhc2ggaW4KLS8vIHRoZSBkZWNvZGVyIGlmIHByb3ZpZGVkIHRvbyBoaWdoIG9mIGEgcmVzb2x1dGlvbi4gVGhlcmVmb3JlCi0vLyBwbGF0Zm9ybXMgbXVzdCBleHBsaWNpdGx5IG9wdC1pbiB0byBzdXBwb3J0IDRrIEgyNjQuCi0jaWZkZWYgRU5BQkxFX0gyNjRfNEtfU1VQUE9SVAotICAgIG1heF93aWR0aCA9IDM4NDA7Ci0gICAgbWF4X2hlaWdodCA9IDIxNjA7Ci0jZW5kaWYgIC8vIEVOQUJMRV9IMjY0XzRLX1NVUFBPUlQKLSAgfQotCi0gIGlmIChmcmFtZV93aWR0aCA+IG1heF93aWR0aCB8fCBmcmFtZV9oZWlnaHQgPiBtYXhfaGVpZ2h0KSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gSXMgYml0cmF0ZSBpbiByYW5nZT8KLSAgaWYgKGJpdHJhdGUgPiBTQl9NRURJQV9NQVhfVklERU9fQklUUkFURV9JTl9CSVRTX1BFUl9TRUNPTkQpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKGZwcyA+IDYwKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICh2aWRlb19jb2RlYyA9PSBrU2JNZWRpYVZpZGVvQ29kZWNIMjY0KSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgaWYgKHZpZGVvX2NvZGVjID09IGtTYk1lZGlhVmlkZW9Db2RlY1ZwOSkgewotICAgIGlmIChJc1ZwOUh3RGVjb2RlclN1cHBvcnRlZCgpKQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgaWYgKElzVnA5R1BVRGVjb2RlclN1cHBvcnRlZCgpKQotICAgICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL21lZGlhX3NldF9vdXRwdXRfcHJvdGVjdGlvbi5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9tZWRpYV9zZXRfb3V0cHV0X3Byb3RlY3Rpb24uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyOWU5NGEuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL21lZGlhX3NldF9vdXRwdXRfcHJvdGVjdGlvbi5jYworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVkaWEuaCIKLQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3V3cC9hcHBsaWNhdGlvbl91d3AuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvdGltZS5oIgotCi11c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6dXdwOjpBcHBsaWNhdGlvblV3cDsKLQotYm9vbCBTYk1lZGlhU2V0T3V0cHV0UHJvdGVjdGlvbihib29sIHNob3VsZF9lbmFibGVfZGhjcCkgewotICBib29sIGlzX2hkY3Bfb24gPSBTYk1lZGlhSXNPdXRwdXRQcm90ZWN0ZWQoKTsKLQotICBpZiAoaXNfaGRjcF9vbiA9PSBzaG91bGRfZW5hYmxlX2RoY3ApIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIFNCX0xPRyhJTkZPKSA8PCAiQXR0ZW1wdGluZyB0byAiCi0gICAgICAgICAgICAgICA8PCAoc2hvdWxkX2VuYWJsZV9kaGNwID8gImVuYWJsZSIgOiAiZGlzYWJsZSIpCi0gICAgICAgICAgICAgICA8PCAiIG91dHB1dCBwcm90ZWN0aW9uLiAgQ3VycmVudCBzdGF0dXM6ICIKLSAgICAgICAgICAgICAgIDw8IChpc19oZGNwX29uID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7Ci0gIFNiVGltZU1vbm90b25pYyB0aWNrID0gU2JUaW1lR2V0TW9ub3RvbmljTm93KCk7Ci0KLSAgYm9vbCBoZGNwX3N1Y2Nlc3MgPSBmYWxzZTsKLSAgaWYgKHNob3VsZF9lbmFibGVfZGhjcCkgewotICAgIGhkY3Bfc3VjY2VzcyA9IEFwcGxpY2F0aW9uVXdwOjpHZXQoKS0+VHVybk9uSGRjcCgpOwotICB9IGVsc2UgewotICAgIGhkY3Bfc3VjY2VzcyA9IEFwcGxpY2F0aW9uVXdwOjpHZXQoKS0+VHVybk9mZkhkY3AoKTsKLSAgfQotCi0gIGlzX2hkY3Bfb24gPSAoaGRjcF9zdWNjZXNzID8gc2hvdWxkX2VuYWJsZV9kaGNwIDogIXNob3VsZF9lbmFibGVfZGhjcCk7Ci0KLSAgU2JUaW1lTW9ub3RvbmljIHRvY2sgPSBTYlRpbWVHZXRNb25vdG9uaWNOb3coKTsKLSAgU0JfTE9HKElORk8pIDw8ICJPdXRwdXQgcHJvdGVjdGlvbiBpcyAiCi0gICAgICAgICAgICAgICA8PCAoaXNfaGRjcF9vbiA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpCi0gICAgICAgICAgICAgICA8PCAiLiAgVG9nZ2xpbmcgSERDUCB0b29rICIgPDwgKHRvY2sgLSB0aWNrKSAvIGtTYlRpbWVNaWxsaXNlY29uZAotICAgICAgICAgICAgICAgPDwgIiBtaWxsaXNlY29uZHMuIjsKLSAgcmV0dXJuIGhkY3Bfc3VjY2VzczsKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9taWNyb3Bob25lX2ltcGwuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC91d3AvbWljcm9waG9uZV9pbXBsLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzFiYWViLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9taWNyb3Bob25lX2ltcGwuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1OTQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL21pY3JvcGhvbmUvbWljcm9waG9uZV9pbnRlcm5hbC5oIgotCi0vLyBXaW5kb3dzIGhlYWRlcnMuCi0jaW5jbHVkZSA8Y29sbGVjdGlvbi5oPgotI2luY2x1ZGUgPE1lbW9yeUJ1ZmZlci5oPgotI2luY2x1ZGUgPHBwbHRhc2tzLmg+Ci0KLS8vIEMrKyBoZWFkZXJzLgotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxkZXF1ZT4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2F0b21pYy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9jb21tb24vc2VtYXBob3JlLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL2NvbW1vbi90aHJlYWQuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL211dGV4LmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC91d3AvYXBwX2FjY2Vzc29ycy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvdXdwL2FwcGxpY2F0aW9uX3V3cC5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvdXdwL2FzeW5jX3V0aWxzLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9lcnJvcl91dGlscy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvd2NoYXJfdXRpbHMuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc3RyaW5nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3RpbWUuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvdXNlci5oIgotCi0jaWYgIVNCX0hBUyhNSUNST1BIT05FKQotI2Vycm9yIE1pY3JvcGhvbmUgZXhwZWN0ZWQgdG8gYmUgZW5hYmxlZCB3aGVuIGNvbXBpbGluZyBhIG1pY3JvcGhvbmUgaW1wbC4KLSNlbmRpZgotCi11c2luZyBjb25jdXJyZW5jeTo6dGFza19jb250aW51YXRpb25fY29udGV4dDsKLXVzaW5nIE1pY3Jvc29mdDo6V1JMOjpDb21QdHI7Ci11c2luZyBzdGFyYm9hcmQ6Ok11dGV4OwotdXNpbmcgc3RhcmJvYXJkOjpzY29wZWRfcHRyOwotdXNpbmcgc3RhcmJvYXJkOjpTY29wZWRMb2NrOwotdXNpbmcgc3RhcmJvYXJkOjpTZW1hcGhvcmU7Ci11c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6dXdwOjpBcHBsaWNhdGlvblV3cDsKLXVzaW5nIHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6Q2hlY2tSZXN1bHQ7Ci11c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OnBsYXRmb3JtU3RyaW5nVG9TdHJpbmc7Ci11c2luZyBXaW5kb3dzOjpEZXZpY2VzOjpFbnVtZXJhdGlvbjo6RGV2aWNlSW5mb3JtYXRpb247Ci11c2luZyBXaW5kb3dzOjpEZXZpY2VzOjpFbnVtZXJhdGlvbjo6RGV2aWNlSW5mb3JtYXRpb25Db2xsZWN0aW9uOwotdXNpbmcgV2luZG93czo6Rm91bmRhdGlvbjo6RXZlbnRSZWdpc3RyYXRpb25Ub2tlbjsKLXVzaW5nIFdpbmRvd3M6OkZvdW5kYXRpb246OklNZW1vcnlCdWZmZXJCeXRlQWNjZXNzOwotdXNpbmcgV2luZG93czo6Rm91bmRhdGlvbjo6SU1lbW9yeUJ1ZmZlclJlZmVyZW5jZTsKLXVzaW5nIFdpbmRvd3M6OkZvdW5kYXRpb246OlR5cGVkRXZlbnRIYW5kbGVyOwotdXNpbmcgV2luZG93czo6Rm91bmRhdGlvbjo6VXJpOwotdXNpbmcgV2luZG93czo6TWVkaWE6OkF1ZGlvOjpBdWRpb0RldmljZUlucHV0Tm9kZTsKLXVzaW5nIFdpbmRvd3M6Ok1lZGlhOjpBdWRpbzo6QXVkaW9EZXZpY2VOb2RlQ3JlYXRpb25TdGF0dXM7Ci11c2luZyBXaW5kb3dzOjpNZWRpYTo6QXVkaW86OkF1ZGlvRnJhbWVPdXRwdXROb2RlOwotdXNpbmcgV2luZG93czo6TWVkaWE6OkF1ZGlvOjpBdWRpb0dyYXBoOwotdXNpbmcgV2luZG93czo6TWVkaWE6OkF1ZGlvOjpBdWRpb0dyYXBoQ3JlYXRpb25TdGF0dXM7Ci11c2luZyBXaW5kb3dzOjpNZWRpYTo6QXVkaW86OkF1ZGlvR3JhcGhTZXR0aW5nczsKLXVzaW5nIFdpbmRvd3M6Ok1lZGlhOjpBdWRpbzo6Q3JlYXRlQXVkaW9EZXZpY2VJbnB1dE5vZGVSZXN1bHQ7Ci11c2luZyBXaW5kb3dzOjpNZWRpYTo6QXVkaW86OkNyZWF0ZUF1ZGlvR3JhcGhSZXN1bHQ7Ci11c2luZyBXaW5kb3dzOjpNZWRpYTo6QXVkaW86OlF1YW50dW1TaXplU2VsZWN0aW9uTW9kZTsKLXVzaW5nIFdpbmRvd3M6Ok1lZGlhOjpBdWRpb0J1ZmZlcjsKLXVzaW5nIFdpbmRvd3M6Ok1lZGlhOjpBdWRpb0J1ZmZlckFjY2Vzc01vZGU7Ci11c2luZyBXaW5kb3dzOjpNZWRpYTo6QXVkaW9GcmFtZTsKLXVzaW5nIFdpbmRvd3M6Ok1lZGlhOjpDYXB0dXJlOjpNZWRpYUNhdGVnb3J5OwotdXNpbmcgV2luZG93czo6TWVkaWE6OkRldmljZXM6Ok1lZGlhRGV2aWNlOwotdXNpbmcgV2luZG93czo6TWVkaWE6Ok1lZGlhUHJvcGVydGllczo6QXVkaW9FbmNvZGluZ1Byb3BlcnRpZXM7Ci11c2luZyBXaW5kb3dzOjpNZWRpYTo6UmVuZGVyOjpBdWRpb1JlbmRlckNhdGVnb3J5OwotdXNpbmcgV2luZG93czo6U3lzdGVtOjpMYXVuY2hlcjsKLQotbmFtZXNwYWNlIHsKLQotLy8gSXQgYXBwZWFycyB0aGF0IGNvYmFsdCB3aWxsIG9ubHkgcmVxdWVzdCAxNmtoei4KLWNvbnN0IGludCBrTWluU2FtcGxlUmF0ZSA9IDE2MDAwOwotY29uc3QgaW50IGtNYXhTYW1wbGVSYXRlID0gNDQxMDA7Ci1jb25zdCBpbnQga051bUNoYW5uZWxzID0gMTsKLWNvbnN0IGludCBrT3V0cHV0Qnl0ZXNQZXJTYW1wbGUgPSBzaXplb2YoaW50MTZfdCk7Ci1jb25zdCBpbnQga01pblJlYWRTaXplQnl0ZXMgPSA0MDk2OwotY29uc3QgaW50IGtNaWNHYWluID0gMTsKLQotLy8gQ29udHJvbHMgdGhlIGFtb3VudCBvZiB0aW1lIHRoYXQgYSBtaWNyb3Bob25lIHdpbGwgcmVjb3JkIG11dGVkIGF1ZGlvCi0vLyBiZWZvcmUgaXQgc2lnbmFscyBhIHJlYWQgZXJyb3IuIFdpdGhvdXQgdGhpcyB0cmlnZ2VyLCB0aGUgYXBwCi0vLyB3aWxsIGNvbnRpbnVvdXNseSB3YWl0IGZvciBhdWRpbyBkYXRhLiBUaGlzIGhhcHBlbnMgd2l0aCB0aGUgS2luZWN0Ci0vLyBkZXZpY2UsIHdoaWNoIHdoZW4gZGlzY29ubmVjdGVkIHdpbGwgc3RpbGwgcmVjb3JkIDAtdmFsdWUgc2FtcGxlcy4KLWNvbnN0IFNiVGltZSBrVGltZU11dGVkVGhyZXNob2xkID0gMyAqIGtTYlRpbWVTZWNvbmQ7Ci0KLS8vIE1hcHMgWy0xLjBmLCAxLjBmXSAtPiBbLTMyNzY4LCAzMjc2N10KLS8vIFZhbHVlcyBvdXRzaWRlIG9mIFstMS4wZiwgMS4wXSBhcmUgY2xhbXBlZC4KLWludDE2X3QgVG8xNkJpdFBjbShmbG9hdCB2YWwpIHsKLSAgc3RhdGljIGNvbnN0IGZsb2F0IGtNYXhGbG9hdFZhbHVlID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQxNl90Pjo6bWF4KCk7Ci0gIHN0YXRpYyBjb25zdCBmbG9hdCBrTG93RmxvYXRWYWx1ZSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MTZfdD46Omxvd2VzdCgpOwotICBpZiAodmFsID09IDAuMGYpIHsKLSAgICByZXR1cm4gMDsKLSAgfSBlbHNlIGlmICh2YWwgPiAwLjBmKSB7Ci0gICAgaWYgKHZhbCA+IDEuMGYpIHsKLSAgICAgIHZhbCA9IDEuMDsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDE2X3Q+KHZhbCAqIGtNYXhGbG9hdFZhbHVlKTsKLSAgfSBlbHNlIHsKLSAgICBpZiAodmFsIDwgLTEuMGYpIHsKLSAgICAgIHZhbCA9IC0xLjA7Ci0gICAgfQotICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQxNl90PigtMS4wZiAqIHZhbCAqIGtMb3dGbG9hdFZhbHVlKTsKLSAgfQotfQotCi1jb25zdCBjaGFyKiBUb1N0cmluZyhBdWRpb0RldmljZU5vZGVDcmVhdGlvblN0YXR1cyBzdGF0dXMpIHsKLSAgc3dpdGNoIChzdGF0dXMpIHsKLSAgICBjYXNlIEF1ZGlvRGV2aWNlTm9kZUNyZWF0aW9uU3RhdHVzOjpBY2Nlc3NEZW5pZWQ6Ci0gICAgICByZXR1cm4gIkFjY2Vzc0RlbmllZCI7Ci0gICAgY2FzZSBBdWRpb0RldmljZU5vZGVDcmVhdGlvblN0YXR1czo6RGV2aWNlTm90QXZhaWxhYmxlOgotICAgICAgcmV0dXJuICJEZXZpY2VOb3RBdmFpbGFibGUiOwotICAgIGNhc2UgQXVkaW9EZXZpY2VOb2RlQ3JlYXRpb25TdGF0dXM6OkZvcm1hdE5vdFN1cHBvcnRlZDoKLSAgICAgIHJldHVybiAiRm9ybWF0Tm90U3VwcG9ydGVkIjsKLSAgICBjYXNlIEF1ZGlvRGV2aWNlTm9kZUNyZWF0aW9uU3RhdHVzOjpTdWNjZXNzOgotICAgICAgcmV0dXJuICJTdWNjZXNzIjsKLSAgICBjYXNlIEF1ZGlvRGV2aWNlTm9kZUNyZWF0aW9uU3RhdHVzOjpVbmtub3duRmFpbHVyZToKLSAgICAgIHJldHVybiAiVW5rbm93bkZhaWx1cmUiOwotICB9Ci0gIHJldHVybiAiVW5rbm93biI7Ci19Ci0KLWJvb2wgSXNVaVRocmVhZCgpIHsKLSAgYXV0byBkaXNwYXRjaGVyID0gc3RhcmJvYXJkOjpzaGFyZWQ6OnV3cDo6R2V0RGlzcGF0Y2hlcigpOwotICAvLyBJcyBVSSB0aHJlYWQuCi0gIHJldHVybiBkaXNwYXRjaGVyLT5IYXNUaHJlYWRBY2Nlc3M7Ci19Ci0KLXZvaWQgTGF1bmNoTWljcm9waG9uZVBlcm1pc3Npb25zQXBwQXN5bmMoKSB7Ci0gIC8vIFNjaGVkdWxlIGEgdGFzayB0byBydW4gb24gdGhlIG1haW4gdGhyZWFkIHdoaWNoIHdpbGwgbGF1bmNoIGEgVVJJIHRvCi0gIC8vIHJlcXVlc3QgbWljcm9waG9uZSBwZXJtaXNzaW9ucy4KLSAgYXV0byBtYWluX3RocmVhZF90YXNrID0gW10oKSB7Ci0gICAgYXV0byB1cmkgPSByZWYgbmV3IFVyaSgibXMtc2V0dGluZ3M6cHJpdmFjeS1taWNyb3Bob25lIik7Ci0KLSAgICBjb25jdXJyZW5jeTo6Y3JlYXRlX3Rhc2soTGF1bmNoZXI6OkxhdW5jaFVyaUFzeW5jKHVyaSkpCi0gICAgLnRoZW4oW10oY29uY3VycmVuY3k6OnRhc2s8Ym9vbD4gcHJldmlvdXNfdGFzayl7Ci0gICAgICB0cnkgewotICAgICAgICBib29sIGxhdW5jaGVkX29rID0gISFwcmV2aW91c190YXNrLmdldCgpOwotICAgICAgICBTQl9MT0dfSUYoRVJST1IsICFsYXVuY2hlZF9vayk7Ci0gICAgICB9IGNhdGNoIChQbGF0Zm9ybTo6RXhjZXB0aW9uXiBlKSB7Ci0gICAgICAgIEhSRVNVTFQgaHIgPSBlLT5IUmVzdWx0OwotICAgICAgICBzdGQ6OnN0cmluZyBtc2cgPSBwbGF0Zm9ybVN0cmluZ1RvU3RyaW5nKGUtPk1lc3NhZ2UpOwotICAgICAgICBTQl9MT0coRVJST1IpCi0gICAgICAgICAgICA8PCAiRXhjZXB0aW9uIHdoaWxlIGxhdW5jaGluZyBwZXJtaXNzaW9ucyBhcHAsIEhSRVNVTFQ6ICIgPDwgaHIKLSAgICAgICAgICAgIDw8ICIsIG1zZzogIiA8PCBtc2c7Ci0gICAgICB9Ci0gICAgfSk7Ci0gIH07Ci0gIHN0YXJib2FyZDo6c2hhcmVkOjp1d3A6OlJ1bkluTWFpblRocmVhZEFzeW5jKG1haW5fdGhyZWFkX3Rhc2spOwotfQotCi1zdGQ6OnZlY3RvcjxEZXZpY2VJbmZvcm1hdGlvbl4+IEdldEFsbE1pY3JvcGhvbmVEZXZpY2VzKCkgewotICBzdGQ6OnZlY3RvcjxEZXZpY2VJbmZvcm1hdGlvbl4+IG91dHB1dDsKLSAgUGxhdGZvcm06OlN0cmluZ14gYXVkaW9fc3RyID0gTWVkaWFEZXZpY2U6OkdldEF1ZGlvQ2FwdHVyZVNlbGVjdG9yKCk7Ci0gIERldmljZUluZm9ybWF0aW9uQ29sbGVjdGlvbl4gYWxsX2RldmljZXMgPQotICAgICAgc3RhcmJvYXJkOjpzaGFyZWQ6OnV3cDo6V2FpdEZvclJlc3VsdCgKLSAgICAgICAgICBEZXZpY2VJbmZvcm1hdGlvbjo6RmluZEFsbEFzeW5jKGF1ZGlvX3N0cikpOwotICBmb3IgKERldmljZUluZm9ybWF0aW9uXiBkZXZfaW5mbyA6IGFsbF9kZXZpY2VzKSB7Ci0gICAgb3V0cHV0LnB1c2hfYmFjayhkZXZfaW5mbyk7Ci0gIH0KLQotICByZXR1cm4gb3V0cHV0OwotfQotCi1BdWRpb0dyYXBoXiBDcmVhdGVBdWRpb0dyYXBoKEF1ZGlvUmVuZGVyQ2F0ZWdvcnkgY2F0ZWdvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YW50dW1TaXplU2VsZWN0aW9uTW9kZSBzZWxlY3Rpb25fbW9kZSkgewotICBBdWRpb0dyYXBoU2V0dGluZ3NeIHNldHRpbmdzID0gcmVmIG5ldyBBdWRpb0dyYXBoU2V0dGluZ3MoY2F0ZWdvcnkpOwotICBzZXR0aW5ncy0+UXVhbnR1bVNpemVTZWxlY3Rpb25Nb2RlID0gc2VsZWN0aW9uX21vZGU7Ci0gIENyZWF0ZUF1ZGlvR3JhcGhSZXN1bHReIHJlc3VsdCA9Ci0gICAgICBzdGFyYm9hcmQ6OnNoYXJlZDo6dXdwOjpXYWl0Rm9yUmVzdWx0KEF1ZGlvR3JhcGg6OkNyZWF0ZUFzeW5jKHNldHRpbmdzKSk7Ci0gIFNCX0RDSEVDSyhyZXN1bHQtPlN0YXR1cyA9PSBBdWRpb0dyYXBoQ3JlYXRpb25TdGF0dXM6OlN1Y2Nlc3MpOwotICBBdWRpb0dyYXBoXiBncmFwaCA9IHJlc3VsdC0+R3JhcGg7Ci0gIHJldHVybiBncmFwaDsKLX0KLXN0ZDo6dmVjdG9yPEF1ZGlvRGV2aWNlSW5wdXROb2RlXj4gR2VuZXJhdGVBdWRpb0lucHV0Tm9kZXMoCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8RGV2aWNlSW5mb3JtYXRpb25ePiYgbWljcm9waG9uZV9kZXZpY2VzLAotICAgIEF1ZGlvRW5jb2RpbmdQcm9wZXJ0aWVzXiBlbmNvZGluZ19wcm9wZXJ0aWVzLAotICAgIEF1ZGlvR3JhcGheIGdyYXBoKSB7Ci0gIHN0ZDo6dmVjdG9yPEF1ZGlvRGV2aWNlSW5wdXROb2RlXj4gb3V0cHV0OwotCi0gIFNiVGltZSBzdGFydF90aW1lID0gU2JUaW1lR2V0TW9ub3RvbmljTm93KCk7Ci0KLSAgYm9vbCBoYWRfcGVybWlzc2lvbnNfZXJyb3IgPSBmYWxzZTsKLSAgZm9yIChEZXZpY2VJbmZvcm1hdGlvbl4gbWljIDogbWljcm9waG9uZV9kZXZpY2VzKSB7Ci0gICAgYXV0byBjcmVhdGVfbWljcm9waG9uZV9pbnB1dF90YXNrID0gZ3JhcGgtPkNyZWF0ZURldmljZUlucHV0Tm9kZUFzeW5jKAotICAgICAgICBNZWRpYUNhdGVnb3J5OjpTcGVlY2gsIGVuY29kaW5nX3Byb3BlcnRpZXMsIG1pYyk7Ci0gICAgQ3JlYXRlQXVkaW9EZXZpY2VJbnB1dE5vZGVSZXN1bHReIGRldmljZUlucHV0Tm9kZVJlc3VsdCA9Ci0gICAgICAgIHN0YXJib2FyZDo6c2hhcmVkOjp1d3A6OldhaXRGb3JSZXN1bHQoY3JlYXRlX21pY3JvcGhvbmVfaW5wdXRfdGFzayk7Ci0KLSAgICBhdXRvIHN0YXR1cyA9IGRldmljZUlucHV0Tm9kZVJlc3VsdC0+U3RhdHVzOwotICAgIEF1ZGlvRGV2aWNlSW5wdXROb2RlXiBpbnB1dF9ub2RlID0gZGV2aWNlSW5wdXROb2RlUmVzdWx0LT5EZXZpY2VJbnB1dE5vZGU7Ci0KLSAgICBpZiAoc3RhdHVzICE9IEF1ZGlvRGV2aWNlTm9kZUNyZWF0aW9uU3RhdHVzOjpTdWNjZXNzKSB7Ci0gICAgICBTQl9MT0coSU5GTykgPDwgIkZhaWxlZCB0byBjcmVhdGUgbWljcm9waG9uZSB3aXRoIGRldmljZSBuYW1lIFwiIgotICAgICAgICAgICAgICAgICAgIDw8IHBsYXRmb3JtU3RyaW5nVG9TdHJpbmcobWljLT5OYW1lKSA8PCAiXCIgYmVjYXVzZSAiCi0gICAgICAgICAgICAgICAgICAgPDwgVG9TdHJpbmcoc3RhdHVzKTsKLSAgICAgIGlmIChzdGF0dXMgPT0gQXVkaW9EZXZpY2VOb2RlQ3JlYXRpb25TdGF0dXM6OkFjY2Vzc0RlbmllZCkgewotICAgICAgICAvLyBUaGUgdXNlciBoYXNuJ3QgZ2l2ZW4gY29iYWx0IGFjY2VzcyB0byB0aGUgbWljcm9waG9uZSBiZWNhdXNlIHRoZXkKLSAgICAgICAgLy8gZGVjbGluZWQgYWNjZXNzIHRvIHRoZSBtaWNyb3Bob25lIG5vdyBvciBwcmV2aW91c2x5LgotICAgICAgICBoYWRfcGVybWlzc2lvbnNfZXJyb3IgPSB0cnVlOwotICAgICAgfQotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIFNCX0xPRyhJTkZPKSA8PCAiQ3JlYXRlZCBhIG1pY3JvcGhvbmUgd2l0aCBkZXZpY2UgXCIiCi0gICAgICAgICAgICAgICAgIDw8IHBsYXRmb3JtU3RyaW5nVG9TdHJpbmcobWljLT5OYW1lKSA8PCAiXCIiOwotICAgIGlucHV0X25vZGUtPkNvbnN1bWVJbnB1dCA9IHRydWU7Ci0gICAgaW5wdXRfbm9kZS0+T3V0Z29pbmdHYWluID0ga01pY0dhaW47Ci0gICAgb3V0cHV0LnB1c2hfYmFjayhpbnB1dF9ub2RlKTsKLSAgfQotCi0gIFNiVGltZSBkZWx0YV90aW1lID0gU2JUaW1lR2V0TW9ub3RvbmljTm93KCkgLSBzdGFydF90aW1lOwotICBjb25zdCBib29sIGhhZF91aV9pbnRlcmFjdGlvbiA9IGRlbHRhX3RpbWUgPiAoa1NiVGltZU1pbGxpc2Vjb25kKjI1MCk7Ci0KLSAgLy8gV2Ugb25seSBjYXJlIHRvIHJldHJ5IHBlcm1pc3Npb25zIGlmIHRoZXJlIHdlcmUKLSAgLy8gMS4gTm8gbWljcm9waG9uZXMgdGhhdCBjb3VsZCBiZSBvcGVuZWQuCi0gIC8vIDIuIFRoZXJlIGFyZSAxIG9yIG1vcmUgbWljcm9waG9uZXMgdGhhdCBoYWQgZXJyb3JzLgotICAvLyAzLiBUaGVyZSB3YXMgbm8gVUkgaW50ZXJhY3Rpb24sIHdoaWNoIGlzIGRldGVjdGVkIGlmIHRoZSBhdWRpbwotICAvLyBub2RlIGNyZWF0aW9uIGNvbXBsZXRlZCByZWFsbHkgcXVpY2tseS4gQSBxdWljayBhY3Rpb24gc3VnZ2VzdHMKLSAgLy8gdGhhdCB0aGVyZSB3YXMgbm8gdXNlciBpbnRlcmFjdGlvbiBhbmQgdGhlcmVmb3JlIHdlIGFyZSBpbiBhCi0gIC8vIHBlcm1pc3Npb25zICJjb29sZG93biIgcGVyaW9kLiBUaGVzZSB0eXBpY2FsbHkgbGFzdCBmb3IgMzAgbWludXRlcwotICAvLyBhbmQgdGhlIHdvcmsgYXJvdW5kIHJlcXVpcmVzIGFuIGV4cGxpY2l0IHBlcm1pc3Npb25zIHJlcXVlc3QuCi0gIGNvbnN0IGJvb2wgZG9fbGF1bmNoX21pY3JvcGhvbmVfcGVybWlzc2lvbnNfYXBwID0KLSAgICAgb3V0cHV0LmVtcHR5KCkgJiYgaGFkX3Blcm1pc3Npb25zX2Vycm9yICYmCi0gICAgICFoYWRfdWlfaW50ZXJhY3Rpb247Ci0KLSAgaWYgKGRvX2xhdW5jaF9taWNyb3Bob25lX3Blcm1pc3Npb25zX2FwcCkgewotICAgIExhdW5jaE1pY3JvcGhvbmVQZXJtaXNzaW9uc0FwcEFzeW5jKCk7Ci0gIH0KLSAgcmV0dXJuIG91dHB1dDsKLX0KLQotLy8gUmVpbnRlcnByZXRzIHVuZGVybHlpbmcgYnVmZmVyIHR5cGUgdG8gbWF0Y2ggZGVzdGluYXRpb24gdmVjdG9yLgotdm9pZCBFeHRyYWN0UmF3QXVkaW9EYXRhKEF1ZGlvRnJhbWVPdXRwdXROb2RlXiBub2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiogZGVzdGluYXRpb24pIHsKLSAgQXVkaW9GcmFtZV4gYXVkaW9fZnJhbWUgPSBub2RlLT5HZXRGcmFtZSgpOwotICBBdWRpb0J1ZmZlcl4gYXVkaW9fYnVmZmVyID0KLSAgICAgIGF1ZGlvX2ZyYW1lLT5Mb2NrQnVmZmVyKEF1ZGlvQnVmZmVyQWNjZXNzTW9kZTo6UmVhZCk7Ci0gIElNZW1vcnlCdWZmZXJSZWZlcmVuY2VeIG1lbW9yeV9idWZmZXJfcmVmZXJlbmNlID0KLSAgICAgIGF1ZGlvX2J1ZmZlci0+Q3JlYXRlUmVmZXJlbmNlKCk7Ci0KLSAgQ29tUHRyPElNZW1vcnlCdWZmZXJCeXRlQWNjZXNzPiBtZW1vcnlfYnl0ZV9hY2Nlc3M7Ci0gIEhSRVNVTFQgaHIgPSByZWludGVycHJldF9jYXN0PElJbnNwZWN0YWJsZSo+KG1lbW9yeV9idWZmZXJfcmVmZXJlbmNlKQotICAgICAgICAgICAgICAgICAgIC0+UXVlcnlJbnRlcmZhY2UoSUlEX1BQVl9BUkdTKCZtZW1vcnlfYnl0ZV9hY2Nlc3MpKTsKLSAgQ2hlY2tSZXN1bHQoaHIpOwotCi0gIEJZVEUqIGRhdGEgPSBudWxscHRyOwotICBVSU5UMzIgY2FwYWNpdHkgPSAwOwotICBociA9IG1lbW9yeV9ieXRlX2FjY2Vzcy0+R2V0QnVmZmVyKCZkYXRhLCAmY2FwYWNpdHkpOwotICBDaGVja1Jlc3VsdChocik7Ci0KLSAgLy8gQXVkaW8gZGF0YSBpcyBmbG9hdCBkYXRhLCBzbyB0aGUgYnVmZmVyIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LgotICBTQl9EQ0hFQ0soY2FwYWNpdHkgJSBzaXplb2YoZmxvYXQpID09IDApOwotCi0gIGlmIChjYXBhY2l0eSA+IDApIHsKLSAgICBmbG9hdCogdHlwZWRfZGF0YSA9IHJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQqPihkYXRhKTsKLSAgICBjb25zdCBzaXplX3QgdHlwZWRfZGF0YV9zaXplID0gY2FwYWNpdHkgLyBzaXplb2YoZmxvYXQpOwotICAgIGRlc3RpbmF0aW9uLT5pbnNlcnQoZGVzdGluYXRpb24tPmVuZCgpLCB0eXBlZF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZWRfZGF0YSArIHR5cGVkX2RhdGFfc2l6ZSk7Ci0gIH0KLX0KLQotLy8gVGltZXIgdXNlZnVsIGZvciBkZXRlY3RpbmcgdGhhdCB0aGUgbWljcm9waG9uZSBoYXMgYmVlbiBtdXRlZCBmb3IgYSBjZXJ0YWluCi0vLyBhbW91bnQgb2YgdGltZS4KLWNsYXNzIE11dGVkVHJpZ2dlciB7Ci0gcHVibGljOgotICB2b2lkIFNpZ25hbE11dGVkKCkgewotICAgIGlmIChzdGF0ZV8gPT0ga0lzTXV0ZWQpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc3RhdGVfID0ga0lzTXV0ZWQ7Ci0gICAgdGltZV9zdGFydF8gPSBTYlRpbWVHZXRNb25vdG9uaWNOb3coKTsKLSAgfQotCi0gIHZvaWQgU2lnbmFsU291bmQoKSB7Ci0gICAgc3RhdGVfID0ga0ZvdW5kU291bmQ7Ci0gIH0KLQotICBib29sIElzTXV0ZWQoU2JUaW1lTW9ub3RvbmljIGR1cmF0aW9uX3RoZXNob2xkKSBjb25zdCB7Ci0gICAgaWYgKHN0YXRlXyAhPSBrSXNNdXRlZCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBTYlRpbWVNb25vdG9uaWMgZHVyYXRpb24gPSBTYlRpbWVHZXRNb25vdG9uaWNOb3coKSAtIHRpbWVfc3RhcnRfOwotICAgIHJldHVybiBkdXJhdGlvbiA+IGR1cmF0aW9uX3RoZXNob2xkOwotICB9Ci0KLSBwcml2YXRlOgotICBlbnVtIFN0YXRlIHsKLSAgICBrSW5pdGlhbGl6ZWQsCi0gICAga0lzTXV0ZWQsCi0gICAga0ZvdW5kU291bmQKLSAgfTsKLSAgU3RhdGUgc3RhdGVfID0ga0luaXRpYWxpemVkOwotICBTYlRpbWVNb25vdG9uaWMgdGltZV9zdGFydF8gPSAwOwotfTsKLQotLy8gTWljcm9waG9uZVByb2Nlc3NvciBlbmNhcHN1bGF0ZXMgTWljcm9zb2Z0J3MgYXVkaW8gYXBpLiBBbGwgYXZhaWxhYmxlCi0vLyBtaWNyb3Bob25lcyBhcmUgcXVlcmllZCBhbmQgaW5zdGFudGlhdGVkLiBUaGlzIGNsYXNzIHdpbGwgbWl4IHRoZSBhdWRpbwotLy8gdG9nZXRoZXIgaW50byBvbmUgc2lnbmVkIDE2LWJpdCBwY20gc3RyZWFtLgotLy8KLS8vIFdoZW4gdGhlIG1pY3JvcGhvbmUgaXMgY3JlYXRlZCBpdCB3aWxsIGZpbmQgYWxsIGF2YWlsYWJsZSBtaWNyb3Bob25lcyBhbmQKLS8vIGltbWVkaWF0ZWx5IHN0YXJ0IHJlY29yZGluZy4gQSBjYWxsYmFjayB3aWxsIGJlIGNyZWF0ZWQgd2hpY2ggd2lsbCBwcm9jZXNzCi0vLyBhdWRpbyBkYXRhIHdoZW4gbmV3IHNhbXBsZXMgYXJlIGF2YWlsYWJsZS4gVGhlIE1pY3JvcGhvbmUgd2lsbCBzdG9wCi0vLyByZWNvcmRpbmcgd2hlbiBDbG9zZSgpIGlzIGNhbGxlZC4KLWNsYXNzIE1pY3JvcGhvbmVQcm9jZXNzb3IgOiBwdWJsaWMgc3RhcmJvYXJkOjpUaHJlYWQgewotIHB1YmxpYzoKLSAgLy8gVGhpcyB3aWxsIHRyeSBhbmQgY3JlYXRlIGEgbWljcm9waG9uZS4gVGhpcyB3aWxsIGZhaWwgKHJldHVybiBudWxsKSBpZgotICAvLyB0aGVyZSBhcmUgbm90IGF2YWlsYWJsZSBtaWNyb3Bob25lcy4KLSAgc3RhdGljIHNjb3BlZF9wdHI8TWljcm9waG9uZVByb2Nlc3Nvcj4gVHJ5Q3JlYXRlQW5kU3RhcnRSZWNvcmRpbmcoCi0gICAgICBzaXplX3QgbWF4X251bV9zYW1wbGVzLAotICAgICAgaW50IHNhbXBsZV9yYXRlKSB7Ci0gICAgc2NvcGVkX3B0cjxNaWNyb3Bob25lUHJvY2Vzc29yPiBvdXRwdXQ7Ci0KLSAgICBzdGQ6OnZlY3RvcjxEZXZpY2VJbmZvcm1hdGlvbl4+IG1pY3JvcGhvbmVfZGV2aWNlcyA9Ci0gICAgICAgIEdldEFsbE1pY3JvcGhvbmVEZXZpY2VzKCk7Ci0gICAgaWYgKG1pY3JvcGhvbmVfZGV2aWNlcy5lbXB0eSgpKSB7ICAvLyBVbmV4cGVjdGVkIGNvbmRpdGlvbi4KLSAgICAgIHJldHVybiBvdXRwdXQuUGFzcygpOwotICAgIH0KLQotICAgIG91dHB1dC5yZXNldChuZXcgTWljcm9waG9uZVByb2Nlc3NvcigKLSAgICAgICAgbWF4X251bV9zYW1wbGVzLCBzYW1wbGVfcmF0ZSwgbWljcm9waG9uZV9kZXZpY2VzKSk7Ci0KLSAgICBpZiAob3V0cHV0LT5pbnB1dF9ub2Rlc18uZW1wdHkoKSkgewotICAgICAgb3V0cHV0LnJlc2V0KG51bGxwdHIpOwotICAgIH0KLSAgICByZXR1cm4gb3V0cHV0LlBhc3MoKTsKLSAgfQotCi0gIHZpcnR1YWwgfk1pY3JvcGhvbmVQcm9jZXNzb3IoKSB7Ci0gICAgVGhyZWFkOjpKb2luKCk7Ci0gICAgYXVkaW9fZ3JhcGhfLT5TdG9wKCk7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgdGhhdCBoYXZlIGJlZW4gd3JpdHRlbiwgb3IgLTEgaWYgdGhlcmUKLSAgLy8gd2FzIGEgcmVhZCBlcnJvci4KLSAgaW50IFJlYWQoaW50MTZfdCogb3V0X2F1ZGlvX2RhdGEsIHNpemVfdCBvdXRfYXVkaW9fY291bnQpIHsKLSAgICBTY29wZWRMb2NrIGxvY2sobXV0ZXhfKTsKLSAgICBpZiAobXV0ZWRfdGltZXJfLklzTXV0ZWQoa1RpbWVNdXRlZFRocmVzaG9sZCkpIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBvdXRfYXVkaW9fY291bnQgPSBzdGQ6Om1pbihvdXRfYXVkaW9fY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNtX2F1ZGlvX2RhdGFfLnNpemUoKSk7Ci0gICAgdXNpbmcgaXRlciA9IHN0ZDo6dmVjdG9yPGludDE2X3Q+OjppdGVyYXRvcjsKLSAgICBpdGVyIGl0X2JlZ2luID0gcGNtX2F1ZGlvX2RhdGFfLmJlZ2luKCk7Ci0gICAgaXRlciBpdF9lbmQgPSBwY21fYXVkaW9fZGF0YV8uYmVnaW4oKSArIG91dF9hdWRpb19jb3VudDsKLSAgICBzdGQ6OmNvcHkoaXRfYmVnaW4sIGl0X2VuZCwgb3V0X2F1ZGlvX2RhdGEpOwotICAgIHBjbV9hdWRpb19kYXRhXy5lcmFzZShpdF9iZWdpbiwgaXRfZW5kKTsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihvdXRfYXVkaW9fY291bnQpOwotICB9Ci0KLSBwcml2YXRlOgotICBleHBsaWNpdCBNaWNyb3Bob25lUHJvY2Vzc29yKAotICAgICAgc2l6ZV90IG1heF9udW1fc2FtcGxlcywKLSAgICAgIGludCBzYW1wbGVfcmF0ZSwKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPERldmljZUluZm9ybWF0aW9uXj4mIG1pY3JvcGhvbmVfZGV2aWNlcykKLSAgICAgICAgICA6IFRocmVhZCgiTWljcm9waG9uZVByb2Nlc3NvciIpLAotICAgICAgICAgICAgbWF4X251bV9zYW1wbGVzXyhtYXhfbnVtX3NhbXBsZXMpIHsKLSAgICBhdWRpb19ncmFwaF8gPSBDcmVhdGVBdWRpb0dyYXBoKEF1ZGlvUmVuZGVyQ2F0ZWdvcnk6OlNwZWVjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YW50dW1TaXplU2VsZWN0aW9uTW9kZTo6U3lzdGVtRGVmYXVsdCk7Ci0gICAgd2F2ZV9lbmNvZGVyXyA9Ci0gICAgICAgIEF1ZGlvRW5jb2RpbmdQcm9wZXJ0aWVzOjpDcmVhdGVQY20oc2FtcGxlX3JhdGUsIGtOdW1DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNik7ICAvLyA0LWJ5dGUgZmxvYXQuCi0gICAgU0JfRENIRUNLKGF1ZGlvX2dyYXBoXyk7Ci0gICAgaW5wdXRfbm9kZXNfID0gR2VuZXJhdGVBdWRpb0lucHV0Tm9kZXMobWljcm9waG9uZV9kZXZpY2VzLCB3YXZlX2VuY29kZXJfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2dyYXBoXyk7Ci0gICAgZm9yIChBdWRpb0RldmljZUlucHV0Tm9kZV4gaW5wdXRfbm9kZSA6IGlucHV0X25vZGVzXykgewotICAgICAgQXVkaW9GcmFtZU91dHB1dE5vZGVeIGF1ZGlvX2ZyYW1lX25vZGUgPQotICAgICAgICAgIGF1ZGlvX2dyYXBoXy0+Q3JlYXRlRnJhbWVPdXRwdXROb2RlKHdhdmVfZW5jb2Rlcl8pOwotICAgICAgYXVkaW9fZnJhbWVfbm9kZS0+Q29uc3VtZUlucHV0ID0gdHJ1ZTsKLSAgICAgIGlucHV0X25vZGUtPkFkZE91dGdvaW5nQ29ubmVjdGlvbihhdWRpb19mcmFtZV9ub2RlKTsKLSAgICAgIGF1ZGlvX2NoYW5uZWxfLmVtcGxhY2VfYmFjayhuZXcgc3RkOjp2ZWN0b3I8ZmxvYXQ+KCkpOwotICAgICAgYXVkaW9fZnJhbWVfbm9kZXNfLnB1c2hfYmFjayhhdWRpb19mcmFtZV9ub2RlKTsKLSAgICB9Ci0gICAgLy8gVXBkYXRlIHRoZSBhdWRpbyBkYXRhIHdoZW5ldmVyIGEgbmV3IGF1ZGlvIHNhbXBsZSBoYXMgYmVlbiBmaW5pc2hlZC4KLSAgICBhdWRpb19ncmFwaF8tPlN0YXJ0KCk7Ci0gICAgVGhyZWFkOjpTdGFydCgpOwotICB9Ci0KLSAgdm9pZCBSdW4oKSBvdmVycmlkZSB7Ci0gICAgd2hpbGUgKCFqb2luX2NhbGxlZCgpKSB7Ci0gICAgICBTbGVlcE1pbGxpc2Vjb25kcygxKTsKLSAgICAgIFByb2Nlc3MoKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIFByb2Nlc3MoKSB7Ci0gICAgU2NvcGVkTG9jayBsb2NrKG11dGV4Xyk7Ci0gICAgaWYgKGF1ZGlvX2ZyYW1lX25vZGVzXy5lbXB0eSgpKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXVkaW9fZnJhbWVfbm9kZXNfLnNpemUoKTsgKytpKSB7Ci0gICAgICBFeHRyYWN0UmF3QXVkaW9EYXRhKGF1ZGlvX2ZyYW1lX25vZGVzX1tpXSwgYXVkaW9fY2hhbm5lbF9baV0uZ2V0KCkpOwotICAgIH0KLQotICAgIHNpemVfdCBudW1fZWxlbWVudHMgPSBtYXhfbnVtX3NhbXBsZXNfOwotICAgIGZvciAoY29uc3QgYXV0byYgYXVkaW9fZGF0dW0gOiBhdWRpb19jaGFubmVsXykgewotICAgICAgbnVtX2VsZW1lbnRzID0gc3RkOjptaW4oYXVkaW9fZGF0dW0tPnNpemUoKSwgbnVtX2VsZW1lbnRzKTsKLSAgICB9Ci0gICAgaWYgKG51bV9lbGVtZW50cyA9PSAwKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYm9vbCBpc19tdXRlZCA9IHRydWU7Ci0gICAgLy8gTWl4IGFsbCBhdmFpbGFibGUgYXVkaW8gY2hhbm5lbHMgdG9nZXRoZXIgYW5kIGNvbnZlcnQgdG8gb3V0cHV0IGJ1ZmZlcgotICAgIC8vIGZvcm1hdC4gRGV0ZWN0IGlmIGF1ZGlvIGlzIG11dGVkLgotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2VsZW1lbnRzOyArK2kpIHsKLSAgICAgIGZsb2F0IG1peGVkX3NhbXBsZSA9IDAuMGY7Ci0gICAgICBmb3IgKGNvbnN0IGF1dG8mIGF1ZGlvX2RhdHVtIDogYXVkaW9fY2hhbm5lbF8pIHsKLSAgICAgICAgZmxvYXQgc2FtcGxlID0gKCphdWRpb19kYXR1bSlbaV07Ci0gICAgICAgIGlmIChzYW1wbGUgIT0gMC4wKSB7Ci0gICAgICAgICAgaXNfbXV0ZWQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBtaXhlZF9zYW1wbGUgKz0gc2FtcGxlOwotICAgICAgfQotICAgICAgcGNtX2F1ZGlvX2RhdGFfLnB1c2hfYmFjayhUbzE2Qml0UGNtKG1peGVkX3NhbXBsZSkpOwotICAgIH0KLQotICAgIC8vIFRyaW0gdmFsdWVzIGZyb20gZmluaXNoZWQgcGNtX2RhdGEgaWYgdGhlIGJ1ZmZlciBoYXMgZXhjZWVkZWQgaXQncwotICAgIC8vIGFsbG93ZWQgc2l6ZS4KLSAgICBpZiAocGNtX2F1ZGlvX2RhdGFfLnNpemUoKSA+IG1heF9udW1fc2FtcGxlc18pIHsKLSAgICAgIHNpemVfdCBudW1fZGVsZXRlID0gcGNtX2F1ZGlvX2RhdGFfLnNpemUoKSAtIG1heF9udW1fc2FtcGxlc187Ci0gICAgICBwY21fYXVkaW9fZGF0YV8uZXJhc2UocGNtX2F1ZGlvX2RhdGFfLmJlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNtX2F1ZGlvX2RhdGFfLmJlZ2luKCkgKyBudW1fZGVsZXRlKTsKLSAgICB9Ci0KLSAgICBpZiAoaXNfbXV0ZWQpIHsKLSAgICAgIG11dGVkX3RpbWVyXy5TaWduYWxNdXRlZCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBtdXRlZF90aW1lcl8uU2lnbmFsU291bmQoKTsKLSAgICB9Ci0gICAgLy8gVHJpbSB2YWx1ZXMgZnJvbSBzb3VyY2UgY2hhbm5lbHMgdGhhdCB3ZXJlIGp1c3QgdHJhbnNmZXJlZCB0bwotICAgIC8vIHBjbV9hdWRpb19kYXRhLgotICAgIGZvciAoY29uc3QgYXV0byYgYXVkaW9fZGF0dW0gOiBhdWRpb19jaGFubmVsXykgewotICAgICAgYXVkaW9fZGF0dW0tPmVyYXNlKGF1ZGlvX2RhdHVtLT5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RhdHVtLT5iZWdpbigpICsgbnVtX2VsZW1lbnRzKTsKLSAgICB9Ci0gIH0KLQotICBBdWRpb0dyYXBoXiBhdWRpb19ncmFwaF8gPSBudWxscHRyOwotICBBdWRpb0VuY29kaW5nUHJvcGVydGllc14gd2F2ZV9lbmNvZGVyXzsKLSAgc3RkOjp2ZWN0b3I8QXVkaW9EZXZpY2VJbnB1dE5vZGVePiBpbnB1dF9ub2Rlc187Ci0gIHN0ZDo6dmVjdG9yPEF1ZGlvRnJhbWVPdXRwdXROb2RlXj4gYXVkaW9fZnJhbWVfbm9kZXNfOwotICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8c3RkOjp2ZWN0b3I8ZmxvYXQ+Pj4gYXVkaW9fY2hhbm5lbF87Ci0gIHN0ZDo6dmVjdG9yPGludDE2X3Q+IHBjbV9hdWRpb19kYXRhXzsKLSAgc2l6ZV90IG1heF9udW1fc2FtcGxlc18gPSAwOwotICBNdXRlZFRyaWdnZXIgbXV0ZWRfdGltZXJfOwotICBNdXRleCBtdXRleF87Ci19OwotCi0vLyBJbXBsZW1lbnRzIHRoZSBTYk1pY3JvcGhvbmVQcml2YXRlIGludGVyZmFjZS4KLWNsYXNzIE1pY3JvcGhvbmVJbXBsIDogcHVibGljIFNiTWljcm9waG9uZVByaXZhdGUgewotIHB1YmxpYzoKLSAgTWljcm9waG9uZUltcGwoaW50IHNhbXBsZV9yYXRlLCBpbnQgYnVmZmVyX3NpemVfYnl0ZXMpCi0gICAgICA6IGJ1ZmZlcl9zaXplX2J5dGVzXyhidWZmZXJfc2l6ZV9ieXRlcyksCi0gICAgICAgIHNhbXBsZV9yYXRlXyhzYW1wbGVfcmF0ZSkgewotICB9Ci0KLSAgfk1pY3JvcGhvbmVJbXBsKCkgeyBDbG9zZSgpOyB9Ci0KLSAgYm9vbCBPcGVuKCkgb3ZlcnJpZGUgewotICAgIGlmICghbWljcm9waG9uZV8pIHsKLSAgICAgIGlmIChJc1VpVGhyZWFkKCkpIHsKLSAgICAgICAgU0JfTE9HKElORk8pIDw8ICJDb3VsZCBub3Qgb3BlbiBtaWNyb3Bob25lIGZyb20gVUkgdGhyZWFkLiI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIG1pY3JvcGhvbmVfID0gTWljcm9waG9uZVByb2Nlc3Nvcjo6VHJ5Q3JlYXRlQW5kU3RhcnRSZWNvcmRpbmcoCi0gICAgICAgICAgYnVmZmVyX3NpemVfYnl0ZXNfIC8ga091dHB1dEJ5dGVzUGVyU2FtcGxlLAotICAgICAgICAgIHNhbXBsZV9yYXRlXyk7Ci0gICAgfQotICAgIHJldHVybiBtaWNyb3Bob25lXyAhPSBudWxscHRyOwotICB9Ci0KLSAgYm9vbCBDbG9zZSgpIG92ZXJyaWRlIHsKLSAgICBtaWNyb3Bob25lXy5yZXNldChudWxscHRyKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGludCBSZWFkKHZvaWQqIG91dF9hdWRpb19kYXRhLCBpbnQgYXVkaW9fZGF0YV9zaXplKSBvdmVycmlkZSB7Ci0gICAgaWYgKCFtaWNyb3Bob25lXykgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpbnQxNl90KiBwY21fYnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxpbnQxNio+KG91dF9hdWRpb19kYXRhKTsKLSAgICBzaXplX3QgcGNtX2J1ZmZlcl9jb3VudCA9IGF1ZGlvX2RhdGFfc2l6ZSAvIGtPdXRwdXRCeXRlc1BlclNhbXBsZTsKLSAgICBpbnQgbl9zYW1wbGVzID0gbWljcm9waG9uZV8tPlJlYWQocGNtX2J1ZmZlciwgcGNtX2J1ZmZlcl9jb3VudCk7Ci0gICAgaWYgKG5fc2FtcGxlcyA8IDApIHsKLSAgICAgIHJldHVybiAtMTsgIC8vIElzIGVycm9yLgotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gbl9zYW1wbGVzICoga091dHB1dEJ5dGVzUGVyU2FtcGxlOwotICAgIH0KLSAgfQotCi0gcHJpdmF0ZToKLSAgY29uc3QgaW50IGJ1ZmZlcl9zaXplX2J5dGVzXzsKLSAgY29uc3QgaW50IHNhbXBsZV9yYXRlXzsKLSAgc2NvcGVkX3B0cjxNaWNyb3Bob25lUHJvY2Vzc29yPiBtaWNyb3Bob25lXzsKLX07Ci0KLS8vIFNpbmdsZXRvbiBhY2Nlc3MgaXMgcmVxdWlyZWQgYnkgdGhlIG1pY3JvcGhvbmUgaW50ZXJmYWNlIGFzIHNwZWNpZmllZCBieQotLy8gbnBsYi4KLWNvbnN0IFNiTWljcm9waG9uZUlkIGtTaW5nbGV0b25JZCA9Ci0gICAgcmVpbnRlcnByZXRfY2FzdDxTYk1pY3JvcGhvbmVJZD4oMHgxKTsKLXN0YXJib2FyZDo6YXRvbWljX3BvaW50ZXI8TWljcm9waG9uZUltcGwqPiBzX3NpbmdsZXRvbl9wb2ludGVyOwotCi19ICAvLyBuYW1lc3BhY2UuCi0KLWludCBTYk1pY3JvcGhvbmVQcml2YXRlOjpHZXRBdmFpbGFibGVNaWNyb3Bob25lcygKLSAgICBTYk1pY3JvcGhvbmVJbmZvKiBvdXRfaW5mb19hcnJheSwKLSAgICBpbnQgaW5mb19hcnJheV9zaXplKSB7Ci0KLSAgc3RkOjp2ZWN0b3I8RGV2aWNlSW5mb3JtYXRpb25ePiBtaWNfZGV2aWNlcyA9IEdldEFsbE1pY3JvcGhvbmVEZXZpY2VzKCk7Ci0gIGlmIChtaWNfZGV2aWNlcy5lbXB0eSgpKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgaWYgKG91dF9pbmZvX2FycmF5ICYmIChpbmZvX2FycmF5X3NpemUgPj0gMSkpIHsKLSAgICBTYk1pY3JvcGhvbmVJbmZvIGluZm87Ci0gICAgaW5mby5pZCA9IGtTaW5nbGV0b25JZDsKLSAgICBpbmZvLnR5cGUgPSBrU0JNaWNyb3Bob25lQW5hbG9nSGVhZHNldDsKLSAgICBpbmZvLm1heF9zYW1wbGVfcmF0ZV9oeiA9IGtNYXhTYW1wbGVSYXRlOwotICAgIGluZm8ubWluX3JlYWRfc2l6ZSA9IGtNaW5SZWFkU2l6ZUJ5dGVzOwotCi0jaWYgU0JfQVBJX1ZFUlNJT04gPj0gOQotICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGFsbF9taWNfbmFtZXM7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtaWNfZGV2aWNlcy5zaXplKCk7ICsraSkgewotICAgICAgRGV2aWNlSW5mb3JtYXRpb25eIG1pY19kZXYgPSBtaWNfZGV2aWNlc1tpXTsKLSAgICAgIGlmIChpID4gMCkgewotICAgICAgICBhbGxfbWljX25hbWVzIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBhbGxfbWljX25hbWVzIDw8ICJbIiA8PCBwbGF0Zm9ybVN0cmluZ1RvU3RyaW5nKG1pY19kZXYtPk5hbWUpIDw8ICJdIjsKLSAgICB9Ci0gICAgU2JTdHJpbmdDb3B5KGluZm8ubGFiZWwsIGFsbF9taWNfbmFtZXMuc3RyKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgU0JfQVJSQVlfU0laRShpbmZvLmxhYmVsKSk7Ci0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDkKLSAgICBvdXRfaW5mb19hcnJheVswXSA9IGluZm87Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLWJvb2wgU2JNaWNyb3Bob25lUHJpdmF0ZTo6SXNNaWNyb3Bob25lU2FtcGxlUmF0ZVN1cHBvcnRlZCgKLSAgICBTYk1pY3JvcGhvbmVJZCBpZCwKLSAgICBpbnQgc2FtcGxlX3JhdGVfaW5faHopIHsKLSAgaWYgKCFTYk1pY3JvcGhvbmVJZElzVmFsaWQoaWQpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiAoa01pblNhbXBsZVJhdGUgPD0gc2FtcGxlX3JhdGVfaW5faHopICYmCi0gICAgICAgICAoc2FtcGxlX3JhdGVfaW5faHogPD0ga01heFNhbXBsZVJhdGUpOwotfQotCi1TYk1pY3JvcGhvbmUgU2JNaWNyb3Bob25lUHJpdmF0ZTo6Q3JlYXRlTWljcm9waG9uZShTYk1pY3JvcGhvbmVJZCBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzYW1wbGVfcmF0ZV9pbl9oeiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZmZXJfc2l6ZV9ieXRlcykgewotICBpZiAoIVNiTWljcm9waG9uZUlkSXNWYWxpZChpZCkpIHsKLSAgICByZXR1cm4ga1NiTWljcm9waG9uZUludmFsaWQ7Ci0gIH0KLSAgaWYgKHNhbXBsZV9yYXRlX2luX2h6IDwga01pblNhbXBsZVJhdGUpIHsKLSAgICByZXR1cm4ga1NiTWljcm9waG9uZUludmFsaWQ7Ci0gIH0KLSAgaWYgKHNhbXBsZV9yYXRlX2luX2h6ID4ga01heFNhbXBsZVJhdGUpIHsKLSAgICByZXR1cm4ga1NiTWljcm9waG9uZUludmFsaWQ7Ci0gIH0KLSAgaWYgKGJ1ZmZlcl9zaXplX2J5dGVzIDw9IDApIHsKLSAgICByZXR1cm4ga1NiTWljcm9waG9uZUludmFsaWQ7Ci0gIH0KLSAgLy8gUmVxdWlyZWQgdG8gY29uZm9ybSB0byBucGxiIHRlc3QuCi0gIGlmIChidWZmZXJfc2l6ZV9ieXRlcyA+PSAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKSAtIDEpKSB7Ci0gICAgcmV0dXJuIGtTYk1pY3JvcGhvbmVJbnZhbGlkOwotICB9Ci0gIC8vIElkIHdpbGwgZWl0aGVyIGJ5IDEgb3IgMC4gQXQgdGhpcyB0aW1lIHRoZXJlIGlzIG9ubHkgb25lIG1pY3JvcGhvbmUuCi0gIFNCX0RDSEVDSyhpZCA9PSBrU2luZ2xldG9uSWQpOwotICBpZiAoc19zaW5nbGV0b25fcG9pbnRlci5sb2FkKCkpIHsKLSAgICByZXR1cm4ga1NiTWljcm9waG9uZUludmFsaWQ7Ci0gIH0KLSAgTWljcm9waG9uZUltcGwqIG5ld19taWNyb3Bob25lID0KLSAgICAgIG5ldyBNaWNyb3Bob25lSW1wbChzYW1wbGVfcmF0ZV9pbl9oeiwgYnVmZmVyX3NpemVfYnl0ZXMpOwotCi0gIHNfc2luZ2xldG9uX3BvaW50ZXIuc3RvcmUobmV3X21pY3JvcGhvbmUpOwotICByZXR1cm4gbmV3X21pY3JvcGhvbmU7Ci19Ci0KLXZvaWQgU2JNaWNyb3Bob25lUHJpdmF0ZTo6RGVzdHJveU1pY3JvcGhvbmUoU2JNaWNyb3Bob25lIG1pY3JvcGhvbmUpIHsKLSAgU0JfRENIRUNLKG1pY3JvcGhvbmUgPT0gc19zaW5nbGV0b25fcG9pbnRlci5sb2FkKCkpOwotICBzX3NpbmdsZXRvbl9wb2ludGVyLnN0b3JlKG51bGxwdHIpOwotICBkZWxldGUgbWljcm9waG9uZTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9wbGF5ZXJfY29tcG9uZW50c19pbXBsLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL3BsYXllcl9jb21wb25lbnRzX2ltcGwuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNTk4MDEuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL3BsYXllcl9jb21wb25lbnRzX2ltcGwuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvcGxheWVyX2NvbXBvbmVudHMuaCIKLQotI2luY2x1ZGUgInN0YXJib2FyZC9jb21tb24vcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvY29tbW9uL3Njb3BlZF9wdHIuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL2xpYnZweF94YjEvdnB4X3hiMV92aWRlb19kZWNvZGVyLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWVkaWEvbWVkaWFfc3VwcG9ydF9pbnRlcm5hbC5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fZGVjb2Rlcl9pbnRlcm5hbC5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fcmVuZGVyZXJfc2lua19pbXBsLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci92aWRlb19kZWNvZGVyX2ludGVybmFsLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci92aWRlb19yZW5kZXJfYWxnb3JpdGhtLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci92aWRlb19yZW5kZXJfYWxnb3JpdGhtX2ltcGwuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3ZpZGVvX3JlbmRlcmVyX3NpbmsuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2F1ZGlvX2RlY29kZXIuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3ZpZGVvX2RlY29kZXIuaCIKLQotbmFtZXNwYWNlIHN0YXJib2FyZCB7Ci1uYW1lc3BhY2Ugc2hhcmVkIHsKLW5hbWVzcGFjZSBzdGFyYm9hcmQgewotbmFtZXNwYWNlIHBsYXllciB7Ci1uYW1lc3BhY2UgZmlsdGVyIHsKLQotbmFtZXNwYWNlIHsKLQotY2xhc3MgUGxheWVyQ29tcG9uZW50c0ltcGwgOiBwdWJsaWMgUGxheWVyQ29tcG9uZW50cyB7Ci0gIHZvaWQgQ3JlYXRlQXVkaW9Db21wb25lbnRzKAotICAgICAgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBhdWRpb19wYXJhbWV0ZXJzLAotICAgICAgc2NvcGVkX3B0cjxBdWRpb0RlY29kZXI+KiBhdWRpb19kZWNvZGVyLAotICAgICAgc2NvcGVkX3B0cjxBdWRpb1JlbmRlcmVyU2luaz4qIGF1ZGlvX3JlbmRlcmVyX3NpbmspIG92ZXJyaWRlIHsKLSAgICB1c2luZyBBdWRpb0RlY29kZXJJbXBsID0gOjpzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OkF1ZGlvRGVjb2RlcjsKLQotICAgIFNCX0RDSEVDSyhhdWRpb19kZWNvZGVyKTsKLSAgICBTQl9EQ0hFQ0soYXVkaW9fcmVuZGVyZXJfc2luayk7Ci0KLSAgICBhdWRpb19kZWNvZGVyLT5yZXNldChuZXcgQXVkaW9EZWNvZGVySW1wbChhdWRpb19wYXJhbWV0ZXJzLmF1ZGlvX2NvZGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhcmFtZXRlcnMuYXVkaW9faGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhcmFtZXRlcnMuZHJtX3N5c3RlbSkpOwotICAgIGF1ZGlvX3JlbmRlcmVyX3NpbmstPnJlc2V0KG5ldyBBdWRpb1JlbmRlcmVyU2lua0ltcGwpOwotICB9Ci0KLSAgdm9pZCBDcmVhdGVWaWRlb0NvbXBvbmVudHMoCi0gICAgICBjb25zdCBWaWRlb1BhcmFtZXRlcnMmIHZpZGVvX3BhcmFtZXRlcnMsCi0gICAgICBzY29wZWRfcHRyPFZpZGVvRGVjb2Rlcj4qIHZpZGVvX2RlY29kZXIsCi0gICAgICBzY29wZWRfcHRyPFZpZGVvUmVuZGVyQWxnb3JpdGhtPiogdmlkZW9fcmVuZGVyX2FsZ29yaXRobSwKLSAgICAgIHNjb3BlZF9yZWZwdHI8VmlkZW9SZW5kZXJlclNpbms+KiB2aWRlb19yZW5kZXJlcl9zaW5rKSBvdmVycmlkZSB7Ci0gICAgdXNpbmcgVmlkZW9EZWNvZGVySW1wbCA9IDo6c3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOjpWaWRlb0RlY29kZXI7Ci0gICAgdXNpbmcgVmlkZW9EZWNvZGVyVnB4ID0gOjpzdGFyYm9hcmQ6OnNoYXJlZDo6dnB4OjpWaWRlb0RlY29kZXI7Ci0KLSAgICBTQl9EQ0hFQ0sodmlkZW9fZGVjb2Rlcik7Ci0gICAgU0JfRENIRUNLKHZpZGVvX3JlbmRlcl9hbGdvcml0aG0pOwotICAgIFNCX0RDSEVDSyh2aWRlb19yZW5kZXJlcl9zaW5rKTsKLQotICAgIGNvbnN0IGJvb2wgdXNlX3NvZnR3YXJlX3ZwOSA9Ci0gICAgICAgICh2aWRlb19wYXJhbWV0ZXJzLnZpZGVvX2NvZGVjID09IGtTYk1lZGlhVmlkZW9Db2RlY1ZwOSkgJiYKLSAgICAgICAgIUlzVnA5SHdEZWNvZGVyU3VwcG9ydGVkKCk7Ci0KLSAgICBpZiAodXNlX3NvZnR3YXJlX3ZwOSkgewotICAgICAgLy8gU29mdHdhcmUgdnA5IGlzIHRoZSBzcGVjaWFsIGNhc2UuCi0gICAgICBzY29wZWRfcHRyPFZpZGVvRGVjb2RlclZweD4gdmlkZW9fZGVjb2Rlcl9pbXBsKG5ldyBWaWRlb0RlY29kZXJWcHgoCi0gICAgICAgICAgdmlkZW9fcGFyYW1ldGVycy52aWRlb19jb2RlYywgdmlkZW9fcGFyYW1ldGVycy5vdXRwdXRfbW9kZSwKLSAgICAgICAgICB2aWRlb19wYXJhbWV0ZXJzLmRlY29kZV90YXJnZXRfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcikpOwotICAgICAgKnZpZGVvX3JlbmRlcmVyX3NpbmsgPSB2aWRlb19kZWNvZGVyX2ltcGwtPkdldFNpbmsoKTsKLSAgICAgIHZpZGVvX2RlY29kZXItPnJlc2V0KHZpZGVvX2RlY29kZXJfaW1wbC5yZWxlYXNlKCkpOwotICAgICAgdmlkZW9fcmVuZGVyX2FsZ29yaXRobS0+cmVzZXQobmV3IFZpZGVvUmVuZGVyQWxnb3JpdGhtSW1wbCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNjb3BlZF9wdHI8VmlkZW9EZWNvZGVySW1wbD4gdmlkZW9fZGVjb2Rlcl9pbXBsKG5ldyBWaWRlb0RlY29kZXJJbXBsKAotICAgICAgICB2aWRlb19wYXJhbWV0ZXJzLnZpZGVvX2NvZGVjLCB2aWRlb19wYXJhbWV0ZXJzLm91dHB1dF9tb2RlLAotICAgICAgICB2aWRlb19wYXJhbWV0ZXJzLmRlY29kZV90YXJnZXRfZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlciwKLSAgICAgICAgdmlkZW9fcGFyYW1ldGVycy5kcm1fc3lzdGVtKSk7Ci0gICAgICAqdmlkZW9fcmVuZGVyZXJfc2luayA9IHZpZGVvX2RlY29kZXJfaW1wbC0+R2V0U2luaygpOwotICAgICAgdmlkZW9fZGVjb2Rlci0+cmVzZXQodmlkZW9fZGVjb2Rlcl9pbXBsLnJlbGVhc2UoKSk7Ci0gICAgICB2aWRlb19yZW5kZXJfYWxnb3JpdGhtLT5yZXNldChuZXcgVmlkZW9SZW5kZXJBbGdvcml0aG1JbXBsKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIEdldEF1ZGlvUmVuZGVyZXJQYXJhbXMoaW50KiBtYXhfY2FjaGVkX2ZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogbWF4X2ZyYW1lc19wZXJfYXBwZW5kKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgU0JfRENIRUNLKG1heF9jYWNoZWRfZnJhbWVzKTsKLSAgICBTQl9EQ0hFQ0sobWF4X2ZyYW1lc19wZXJfYXBwZW5kKTsKLQotICAgICptYXhfY2FjaGVkX2ZyYW1lcyA9IDI1NiAqIDEwMjQ7Ci0gICAgKm1heF9mcmFtZXNfcGVyX2FwcGVuZCA9IDE2Mzg0OwotICB9Ci19OwotCi19ICAvLyBuYW1lc3BhY2UKLQotLy8gc3RhdGljCi1zY29wZWRfcHRyPFBsYXllckNvbXBvbmVudHM+IFBsYXllckNvbXBvbmVudHM6OkNyZWF0ZSgpIHsKLSAgcmV0dXJuIG1ha2Vfc2NvcGVkX3B0cjxQbGF5ZXJDb21wb25lbnRzPihuZXcgUGxheWVyQ29tcG9uZW50c0ltcGwpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgZmlsdGVyCi19ICAvLyBuYW1lc3BhY2UgcGxheWVyCi19ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCi19ICAvLyBuYW1lc3BhY2Ugc2hhcmVkCi19ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC91d3Avc3NvLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL3Nzby5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM3OGM3OC4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC91d3Avc3NvLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3V3cC9hcHBfYWNjZXNzb3JzLmgiCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvZmlsZS5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3djaGFyX3V0aWxzLmgiCi0KLW5hbWVzcGFjZSBzYnV3cCA9IHN0YXJib2FyZDo6c2hhcmVkOjp1d3A7Ci1uYW1lc3BhY2Ugc2J3aW4zMiA9IHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjsKLQotdXNpbmcgV2luZG93czo6U2VjdXJpdHk6OkF1dGhlbnRpY2F0aW9uOjpXZWI6OkNvcmU6OgotICAgIFdlYkF1dGhlbnRpY2F0aW9uQ29yZU1hbmFnZXI7Ci11c2luZyBXaW5kb3dzOjpTZWN1cml0eTo6QXV0aGVudGljYXRpb246OldlYjo6Q29yZTo6V2ViVG9rZW5SZXF1ZXN0OwotdXNpbmcgV2luZG93czo6U2VjdXJpdHk6OkF1dGhlbnRpY2F0aW9uOjpXZWI6OkNvcmU6OldlYlRva2VuUmVzcG9uc2U7Ci11c2luZyBXaW5kb3dzOjpTZWN1cml0eTo6QXV0aGVudGljYXRpb246OldlYjo6Q29yZTo6V2ViVG9rZW5SZXF1ZXN0UmVzdWx0OwotdXNpbmcgV2luZG93czo6U2VjdXJpdHk6OkF1dGhlbnRpY2F0aW9uOjpXZWI6OkNvcmU6OldlYlRva2VuUmVxdWVzdFN0YXR1czsKLXVzaW5nIFdpbmRvd3M6OlNlY3VyaXR5OjpDcmVkZW50aWFsczo6V2ViQWNjb3VudFByb3ZpZGVyOwotCi1uYW1lc3BhY2UgewotCi1jb25zdCBjaGFyIGtYYm94TGl2ZUFjY291bnRQcm92aWRlcklkW10gPSAiaHR0cHM6Ly94c3RzLmF1dGgueGJveGxpdmUuY29tIjsKLQotLy8gRmlsZW5hbWUsIHBsYWNlZCBpbiB0aGUgY2FjaGUgZGlyLCB3aG9zZSBwcmVzZW5jZSBpbmRpY2F0ZXMKLS8vIHRoYXQgdGhlIHVzZXIgaGFzIHJlamVjdGVkIHRoZSBTU08gYXBwcm92YWwgZGlhbG9nCi1jb25zdCBjaGFyIGtTc29SZWplY3Rpb25GaWxlbmFtZVtdID0gInNzb19yZWplY3Rpb24iOwotCi1zdGQ6OnN0cmluZyBHZXRTc29SZWplY3Rpb25GaWxlUGF0aCgpIHsKLSAgY2hhciBwYXRoW1NCX0ZJTEVfTUFYX1BBVEhdOwotICBib29sIHN1Y2Nlc3MgPSBTYlN5c3RlbUdldFBhdGgoa1NiU3lzdGVtUGF0aENhY2hlRGlyZWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCwgU0JfRklMRV9NQVhfUEFUSCk7Ci0gIFNCX0RDSEVDSyhzdWNjZXNzKTsKLSAgc3RkOjpzdHJpbmcgZmlsZV9wYXRoKHBhdGgpOwotICBmaWxlX3BhdGguYXBwZW5kKDEsICcvJyk7Ci0gIGZpbGVfcGF0aC5hcHBlbmQoa1Nzb1JlamVjdGlvbkZpbGVuYW1lKTsKLQotICByZXR1cm4gZmlsZV9wYXRoOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIHN0YXJib2FyZCB7Ci1uYW1lc3BhY2Ugc2hhcmVkIHsKLW5hbWVzcGFjZSB1d3AgewotCi1jb25jdXJyZW5jeTo6dGFzazxXZWJUb2tlblJlcXVlc3RSZXN1bHRePiBUcnlUb0ZldGNoU3NvVG9rZW4oCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIHVybCwgYm9vbCBwcm9tcHQpOwotCi1jb25jdXJyZW5jeTo6dGFzazxXZWJUb2tlblJlcXVlc3RSZXN1bHRePiBUcnlUb0ZldGNoU3NvVG9rZW4oCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIHVybCkgewotICByZXR1cm4gVHJ5VG9GZXRjaFNzb1Rva2VuKHVybCwgZmFsc2UpOwotfQotCi1jb25jdXJyZW5jeTo6dGFzazxXZWJUb2tlblJlcXVlc3RSZXN1bHRePiBUcnlUb0ZldGNoU3NvVG9rZW5BbmRQcm9tcHQoCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIHVybCkgewotICByZXR1cm4gVHJ5VG9GZXRjaFNzb1Rva2VuKHVybCwgdHJ1ZSk7Ci19Ci0KLWNvbmN1cnJlbmN5Ojp0YXNrPFdlYlRva2VuUmVxdWVzdFJlc3VsdF4+IFRyeVRvRmV0Y2hTc29Ub2tlbigKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgdXJsLCBib29sIHByb21wdCkgewotICBpZiAoU2JGaWxlRXhpc3RzKEdldFNzb1JlamVjdGlvbkZpbGVQYXRoKCkuY19zdHIoKSkpIHsKLSAgICBjb25jdXJyZW5jeTo6dGFza19jb21wbGV0aW9uX2V2ZW50PFdlYlRva2VuUmVxdWVzdFJlc3VsdF4+IHJlc3VsdDsKLSAgICByZXN1bHQuc2V0KG51bGxwdHIpOwotICAgIHJldHVybiBjb25jdXJyZW5jeTo6dGFzazxXZWJUb2tlblJlcXVlc3RSZXN1bHRePihyZXN1bHQpOwotICB9Ci0gIHJldHVybiBjb25jdXJyZW5jeTo6Y3JlYXRlX3Rhc2soCi0gICAgICBXZWJBdXRoZW50aWNhdGlvbkNvcmVNYW5hZ2VyOjpGaW5kQWNjb3VudFByb3ZpZGVyQXN5bmMoCi0gICAgICAgICAgc2J3aW4zMjo6c3RyaW5nVG9QbGF0Zm9ybVN0cmluZyhrWGJveExpdmVBY2NvdW50UHJvdmlkZXJJZCkpKQotICAudGhlbihbdXJsLCBwcm9tcHRdKGNvbmN1cnJlbmN5Ojp0YXNrPFdlYkFjY291bnRQcm92aWRlcl4+IHByZXZpb3VzX3Rhc2spIHsKLSAgICBXZWJBY2NvdW50UHJvdmlkZXJeIHhib3hfcHJvdmlkZXIgPSBudWxscHRyOwotICAgIHRyeSB7Ci0gICAgICB4Ym94X3Byb3ZpZGVyID0gcHJldmlvdXNfdGFzay5nZXQoKTsKLSAgICB9IGNhdGNoIChQbGF0Zm9ybTo6RXhjZXB0aW9uXikgewotICAgICAgU0JfTE9HKElORk8pIDw8ICJFeGNlcHRpb24gd2l0aCBGaW5kQWNjb3VudFByb3ZpZGVyQXN5bmMiOwotICAgICAgY29uY3VycmVuY3k6OnRhc2tfY29tcGxldGlvbl9ldmVudDxXZWJUb2tlblJlcXVlc3RSZXN1bHRePiByZXN1bHQ7Ci0gICAgICByZXN1bHQuc2V0KG51bGxwdHIpOwotICAgICAgcmV0dXJuIGNvbmN1cnJlbmN5Ojp0YXNrPFdlYlRva2VuUmVxdWVzdFJlc3VsdF4+KHJlc3VsdCk7Ci0gICAgfQotICAgIFdlYlRva2VuUmVxdWVzdF4gcmVxdWVzdCA9IHJlZiBuZXcgV2ViVG9rZW5SZXF1ZXN0KHhib3hfcHJvdmlkZXIpOwotICAgIHJlcXVlc3QtPlByb3BlcnRpZXMtPkluc2VydCgiVXJsIiwKLSAgICAgICAgc2J3aW4zMjo6c3RyaW5nVG9QbGF0Zm9ybVN0cmluZyh1cmwpKTsKLSAgICByZXF1ZXN0LT5Qcm9wZXJ0aWVzLT5JbnNlcnQoIlRhcmdldCIsICJ4Ym94bGl2ZS5zaWduaW4iKTsKLSAgICByZXF1ZXN0LT5Qcm9wZXJ0aWVzLT5JbnNlcnQoIlBvbGljeSIsICJERUxFR0FUSU9OIik7Ci0KLSAgICBib29sIG1haW5fdGhyZWFkID0gc2J1d3A6OkdldERpc3BhdGNoZXIoKS0+SGFzVGhyZWFkQWNjZXNzOwotCi0gICAgaWYgKG1haW5fdGhyZWFkICYmIHByb21wdCkgewotICAgICAgcmV0dXJuIGNvbmN1cnJlbmN5OjpjcmVhdGVfdGFzaygKLSAgICAgICAgICBXZWJBdXRoZW50aWNhdGlvbkNvcmVNYW5hZ2VyOjpSZXF1ZXN0VG9rZW5Bc3luYyhyZXF1ZXN0KSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBjb25jdXJyZW5jeTo6Y3JlYXRlX3Rhc2soCi0gICAgICAgICAgV2ViQXV0aGVudGljYXRpb25Db3JlTWFuYWdlcjo6R2V0VG9rZW5TaWxlbnRseUFzeW5jKHJlcXVlc3QpKTsKLSAgICB9Ci0gIH0pCi0gIC50aGVuKFt1cmxdKGNvbmN1cnJlbmN5Ojp0YXNrPFdlYlRva2VuUmVxdWVzdFJlc3VsdF4+IHByZXZpb3VzX3Rhc2spIHsKLSAgICBXZWJUb2tlblJlcXVlc3RSZXN1bHReIHRva2VuX3Jlc3VsdCA9IHByZXZpb3VzX3Rhc2suZ2V0KCk7Ci0gICAgdHJ5IHsKLSAgICAgIHRva2VuX3Jlc3VsdCA9IHByZXZpb3VzX3Rhc2suZ2V0KCk7Ci0gICAgfSBjYXRjaChQbGF0Zm9ybTo6RXhjZXB0aW9uXiBleCkgewotICAgICAgU0JfTE9HKElORk8pIDw8ICJFeGNlcHRpb24gZHVyaW5nIFJlcXVlc3RUb2tlbkFzeW5jIjsKLSAgICAgIGNvbmN1cnJlbmN5Ojp0YXNrX2NvbXBsZXRpb25fZXZlbnQ8V2ViVG9rZW5SZXF1ZXN0UmVzdWx0Xj4gcmVzdWx0OwotICAgICAgcmVzdWx0LnNldF9leGNlcHRpb24oZXgpOwotICAgICAgcmV0dXJuIGNvbmN1cnJlbmN5Ojp0YXNrPFdlYlRva2VuUmVxdWVzdFJlc3VsdF4+KHJlc3VsdCk7Ci0gICAgfQotCi0gICAgaWYgKCF0b2tlbl9yZXN1bHQpIHsKLSAgICAgIHJldHVybiBwcmV2aW91c190YXNrOwotICAgIH0KLQotICAgIHN3aXRjaCAodG9rZW5fcmVzdWx0LT5SZXNwb25zZVN0YXR1cykgewotICAgICAgY2FzZSBXZWJUb2tlblJlcXVlc3RTdGF0dXM6OlVzZXJDYW5jZWw6IHsKLSAgICAgICAgYm9vbCBjcmVhdGVkOwotICAgICAgICBTYkZpbGUgZmlsZSA9IFNiRmlsZU9wZW4oR2V0U3NvUmVqZWN0aW9uRmlsZVBhdGgoKS5jX3N0cigpLAotICAgICAgICAgICAga1NiRmlsZVJlYWQgfCBrU2JGaWxlT3BlbkFsd2F5cywgJmNyZWF0ZWQsIG51bGxwdHIpOwotICAgICAgICBTYkZpbGVDbG9zZShmaWxlKTsKLSAgICAgICAgcmV0dXJuIHByZXZpb3VzX3Rhc2s7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgV2ViVG9rZW5SZXF1ZXN0U3RhdHVzOjpVc2VySW50ZXJhY3Rpb25SZXF1aXJlZDogewotICAgICAgICBjb25jdXJyZW5jeTo6dGFza19jb21wbGV0aW9uX2V2ZW50PFdlYlRva2VuUmVxdWVzdFJlc3VsdF4+IGNvbXBsZXRpb247Ci0gICAgICAgIFJ1bkluTWFpblRocmVhZEFzeW5jKFt1cmwsIGNvbXBsZXRpb25dKCkgewotICAgICAgICAgIC8vIFdoZW4gd2UgcnVuIFRyeVRvRmV0Y2hTc29Ub2tlbkFuZFByb21wdCBpbiB0aGUgbWFpbiB0aHJlYWQsCi0gICAgICAgICAgLy8gd2UnbGwgYWx3YXlzIGFzayBmb3IgdXNlciBpbnB1dCB2aWEgUmVxdWVzdFRva2VuQXN5bmMsIHdoaWNoCi0gICAgICAgICAgLy8gbmV2ZXIgcmV0dXJucyB0aGlzIGNhc2UuCi0gICAgICAgICAgVHJ5VG9GZXRjaFNzb1Rva2VuQW5kUHJvbXB0KHVybCkKLSAgICAgICAgICAudGhlbihbY29tcGxldGlvbl0oY29uY3VycmVuY3k6OnRhc2s8V2ViVG9rZW5SZXF1ZXN0UmVzdWx0Xj4gcmVzdWx0KSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICBjb21wbGV0aW9uLnNldChyZXN1bHQuZ2V0KCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoUGxhdGZvcm06OkV4Y2VwdGlvbl4gZXgpIHsKLSAgICAgICAgICAgICAgY29tcGxldGlvbi5zZXRfZXhjZXB0aW9uKGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9KTsKLSAgICAgICAgfSk7Ci0KLSAgICAgICAgcmV0dXJuIGNvbmN1cnJlbmN5Ojp0YXNrPFdlYlRva2VuUmVxdWVzdFJlc3VsdF4+KGNvbXBsZXRpb24pOwotICAgICAgfQotCi0gICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gcHJldmlvdXNfdGFzazsKLSAgICB9Ci0gIH0pOwotfQotCi19ICAvLyBuYW1lc3BhY2UgdXdwCi19ICAvLyBuYW1lc3BhY2Ugc2hhcmVkCi19ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC91d3Avc3RhcmJvYXJkX3BsYXRmb3JtLmd5cGkgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC91d3Avc3RhcmJvYXJkX3BsYXRmb3JtLmd5cGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMjk0NGQuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL3N0YXJib2FyZF9wbGF0Zm9ybS5neXBpCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotIyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotewotICAndmFyaWFibGVzJzogewotICAgICdzdGFyYm9hcmRfcGxhdGZvcm1fZGVwZW5kZW50X2ZpbGVzJzogWwotICAgICAgJ2FuYWxvZ190aHVtYnN0aWNrX2lucHV0LmNjJywKLSAgICAgICdhbmFsb2dfdGh1bWJzdGlja19pbnB1dC5oJywKLSAgICAgICdhbmFsb2dfdGh1bWJzdGlja19pbnB1dF90aHJlYWQuY2MnLAotICAgICAgJ2FuYWxvZ190aHVtYnN0aWNrX2lucHV0X3RocmVhZC5oJywKLSAgICAgICdhcHBsaWNhdGlvbl91d3Bfa2V5X2V2ZW50LmNjJywKLSAgICAgICdhcHBsaWNhdGlvbl91d3BfZ2V0X2NvbW1hbmRsaW5lX3BvaW50ZXIuY2MnLAotICAgICAgJ2FwcGxpY2F0aW9uX3V3cC5jYycsCi0gICAgICAnYXBwbGljYXRpb25fdXdwLmgnLAotICAgICAgJ2FzeW5jX3V0aWxzLmgnLAotICAgICAgJ2dldF9ob21lX2RpcmVjdG9yeS5jYycsCi0gICAgICAnbG9nX2ZpbGVfaW1wbC5jYycsCi0gICAgICAnbG9nX2ZpbGVfaW1wbC5oJywKLSAgICAgICdsb2dfcmF3LmNjJywKLSAgICAgICdsb2dfcmF3X2Zvcm1hdC5jYycsCi0gICAgICAnbG9nX3dyaXRlcl9pbnRlcmZhY2UuaCcsCi0gICAgICAnbG9nX3dyaXRlcl91d3AuY2MnLAotICAgICAgJ2xvZ193cml0ZXJfdXdwLmgnLAotICAgICAgJ2xvZ193cml0ZXJfd2luMzIuY2MnLAotICAgICAgJ2xvZ193cml0ZXJfd2luMzIuaCcsCi0gICAgICAnbWVkaWFfZ2V0X2F1ZGlvX2NvbmZpZ3VyYXRpb24uY2MnLAotICAgICAgJ21lZGlhX2lzX2F1ZGlvX3N1cHBvcnRlZC5jYycsCi0gICAgICAnbWVkaWFfaXNfb3V0cHV0X3Byb3RlY3RlZC5jYycsCi0gICAgICAnbWVkaWFfc2V0X291dHB1dF9wcm90ZWN0aW9uLmNjJywKLSAgICAgICdzc28uY2MnLAotICAgICAgJ3N5c3RlbV9jbGVhcl9wbGF0Zm9ybV9lcnJvci5jYycsCi0gICAgICAnc3lzdGVtX2dldF9kZXZpY2VfdHlwZS5jYycsCi0gICAgICAnc3lzdGVtX2dldF9wcm9wZXJ0eS5jYycsCi0gICAgICAnc3lzdGVtX2dldF90b3RhbF9jcHVfbWVtb3J5LmNjJywKLSAgICAgICdzeXN0ZW1fZ2V0X3VzZWRfY3B1X21lbW9yeS5jYycsCi0gICAgICAnc3lzdGVtX3BsYXRmb3JtX2Vycm9yX2ludGVybmFsLmNjJywKLSAgICAgICdzeXN0ZW1fcGxhdGZvcm1fZXJyb3JfaW50ZXJuYWwuaCcsCi0gICAgICAnc3lzdGVtX3JhaXNlX3BsYXRmb3JtX2Vycm9yLmNjJywKLSAgICAgICd3YXNhcGlfYXVkaW8uY2MnLAotICAgICAgJ3dhc2FwaV9hdWRpby5oJywKLSAgICAgICd3YXRjaGRvZ19sb2cuY2MnLAotICAgICAgJ3dhdGNoZG9nX2xvZy5oJywKLSAgICAgICd3aW5kb3dfY3JlYXRlLmNjJywKLSAgICAgICd3aW5kb3dfZGVzdHJveS5jYycsCi0gICAgICAnd2luZG93X2dldF9wbGF0Zm9ybV9oYW5kbGUuY2MnLAotICAgICAgJ3dpbmRvd19nZXRfc2l6ZS5jYycsCi0gICAgICAnd2luZG93X2ludGVybmFsLmNjJywKLSAgICAgICd3aW5kb3dfaW50ZXJuYWwuaCcsCi0gICAgICAnd2luZG93X3NldF9kZWZhdWx0X29wdGlvbnMuY2MnLAotICAgICAgJ3dpbnJ0X3dvcmthcm91bmQuaCcsCi0KLSAgICAgICdwcml2YXRlL2tleXMuY2MnLAotICAgICAgJ3ByaXZhdGUva2V5cy5oJywKLQotICAgICAgIyBNaWNyb3Bob25lIHNlY3Rpb24uCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC91d3AvbWljcm9waG9uZV9pbXBsLmNjJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9taWNyb3Bob25lL21pY3JvcGhvbmVfZ2V0X2F2YWlsYWJsZS5jYycsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWljcm9waG9uZS9taWNyb3Bob25lX2dldF9hdmFpbGFibGUuaCcsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWljcm9waG9uZS9taWNyb3Bob25lX2Nsb3NlLmNjJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9taWNyb3Bob25lL21pY3JvcGhvbmVfY2xvc2UuaCcsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWljcm9waG9uZS9taWNyb3Bob25lX2NyZWF0ZS5jYycsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWljcm9waG9uZS9taWNyb3Bob25lX2NyZWF0ZS5oJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9taWNyb3Bob25lL21pY3JvcGhvbmVfZGVzdHJveS5jYycsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWljcm9waG9uZS9taWNyb3Bob25lX2Rlc3Ryb3kuaCcsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWljcm9waG9uZS9taWNyb3Bob25lX2dldF9hdmFpbGFibGUuY2MnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL21pY3JvcGhvbmUvbWljcm9waG9uZV9nZXRfYXZhaWxhYmxlLmgnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL21pY3JvcGhvbmUvbWljcm9waG9uZV9pbnRlcm5hbC5oJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9taWNyb3Bob25lL21pY3JvcGhvbmVfaXNfc2FtcGxlX3JhdGVfc3VwcG9ydGVkLmNjJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9taWNyb3Bob25lL21pY3JvcGhvbmVfb3Blbi5jYycsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWljcm9waG9uZS9taWNyb3Bob25lX3JlYWQuY2MnLAotCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbG9jYWxpemVkX3N0cmluZ3MuY2MnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3N5c3RlbV9yZXF1ZXN0X3BhdXNlLmNjJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9zeXN0ZW1fcmVxdWVzdF9zdG9wLmNjJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9zeXN0ZW1fcmVxdWVzdF9zdXNwZW5kLmNjJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9zeXN0ZW1fcmVxdWVzdF91bnBhdXNlLmNjJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9zeXN0ZW1fc3VwcG9ydHNfcmVzdW1lLmNjJywKLSAgICBdCi0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9zeXN0ZW1fY2xlYXJfcGxhdGZvcm1fZXJyb3IuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC91d3Avc3lzdGVtX2NsZWFyX3BsYXRmb3JtX2Vycm9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWEyYTM3Li4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9zeXN0ZW1fY2xlYXJfcGxhdGZvcm1fZXJyb3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3N5c3RlbS5oIgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC91d3Avc3lzdGVtX3BsYXRmb3JtX2Vycm9yX2ludGVybmFsLmgiCi0KLXZvaWQgU2JTeXN0ZW1DbGVhclBsYXRmb3JtRXJyb3IoU2JTeXN0ZW1QbGF0Zm9ybUVycm9yIGhhbmRsZSkgewotICBpZiAoU2JTeXN0ZW1QbGF0Zm9ybUVycm9ySXNWYWxpZChoYW5kbGUpKSB7Ci0gICAgaGFuZGxlLT5DbGVhckFuZERlbGV0ZSgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC91d3Avc3lzdGVtX2dldF9kZXZpY2VfdHlwZS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9zeXN0ZW1fZ2V0X2RldmljZV90eXBlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2NlMzIzLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9zeXN0ZW1fZ2V0X2RldmljZV90eXBlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9zeXN0ZW0uaCIKLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3djaGFyX3V0aWxzLmgiCi0KLXVzaW5nIFdpbmRvd3M6OlN5c3RlbTo6UHJvZmlsZTo6QW5hbHl0aWNzSW5mbzsKLXVzaW5nIFdpbmRvd3M6OlN5c3RlbTo6UHJvZmlsZTo6QW5hbHl0aWNzVmVyc2lvbkluZm87Ci0KLVNiU3lzdGVtRGV2aWNlVHlwZSBTYlN5c3RlbUdldERldmljZVR5cGUoKSB7Ci0gIEFuYWx5dGljc1ZlcnNpb25JbmZvXiB2ZXJzaW9uX2luZm8gPSBBbmFseXRpY3NJbmZvOjpWZXJzaW9uSW5mbzsKLSAgc3RkOjpzdHJpbmcgZmFtaWx5ID0gc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOjpwbGF0Zm9ybVN0cmluZ1RvU3RyaW5nKAotICAgICAgdmVyc2lvbl9pbmZvLT5EZXZpY2VGYW1pbHkpOwotCi0gIGlmIChmYW1pbHkuY29tcGFyZSgiV2luZG93cy5EZXNrdG9wIikgPT0gMCkgewotICAgIHJldHVybiBrU2JTeXN0ZW1EZXZpY2VUeXBlRGVza3RvcFBDOwotICB9Ci0gIGlmIChmYW1pbHkuY29tcGFyZSgiV2luZG93cy5YYm94IikgPT0gMCkgewotICAgIHJldHVybiBrU2JTeXN0ZW1EZXZpY2VUeXBlR2FtZUNvbnNvbGU7Ci0gIH0KLSAgU0JfTk9UUkVBQ0hFRCgpOwotICByZXR1cm4ga1NiU3lzdGVtRGV2aWNlVHlwZVVua25vd247Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC91d3Avc3lzdGVtX2dldF9wcm9wZXJ0eS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9zeXN0ZW1fZ2V0X3Byb3BlcnR5LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzgxODE0Li4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9zeXN0ZW1fZ2V0X3Byb3BlcnR5LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc3lzdGVtLmgiCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC91d3AvYXBwbGljYXRpb25fdXdwLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC91d3AvcHJpdmF0ZS9rZXlzLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi93Y2hhcl91dGlscy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zdHJpbmcuaCIKLQotdXNpbmcgV2luZG93czo6U2VjdXJpdHk6OkV4Y2hhbmdlQWN0aXZlU3luY1Byb3Zpc2lvbmluZzo6Ci0gICAgRWFzQ2xpZW50RGV2aWNlSW5mb3JtYXRpb247Ci11c2luZyBXaW5kb3dzOjpTeXN0ZW06OlByb2ZpbGU6OkFuYWx5dGljc0luZm87Ci11c2luZyBXaW5kb3dzOjpTeXN0ZW06OlByb2ZpbGU6OkFuYWx5dGljc1ZlcnNpb25JbmZvOwotCi1uYW1lc3BhY2Ugc2J3aW4zMiA9IHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjsKLQotbmFtZXNwYWNlIHsKLWJvb2wgQ29weVN0cmluZ0FuZFRlc3RJZlN1Y2Nlc3MoY2hhciogb3V0X3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWVfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmcm9tX3ZhbHVlKSB7Ci0gIGlmIChTYlN0cmluZ0dldExlbmd0aChmcm9tX3ZhbHVlKSArIDEgPiB2YWx1ZV9sZW5ndGgpCi0gICAgcmV0dXJuIGZhbHNlOwotICBTYlN0cmluZ0NvcHkob3V0X3ZhbHVlLCBmcm9tX3ZhbHVlLCB2YWx1ZV9sZW5ndGgpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBTdGFydHNXaXRoKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIsIGNvbnN0IGNoYXIqIHByZWZpeCkgewotICBzaXplX3QgbGVuID0gU2JTdHJpbmdHZXRMZW5ndGgocHJlZml4KTsKLSAgaWYgKHN0ci5zaXplKCkgPCBsZW4pIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gMCA9PSBzdHIuY29tcGFyZSgwLCBsZW4sIHByZWZpeCk7Ci19Ci0KLWNvbnN0IHN0ZDo6c2l6ZV90IGtPc1ZlcnNpb25TaXplID0gMTI4OwotCi1zdHJ1Y3QgV2luZG93c1ZlcnNpb24gewotICB1aW50MTZfdCBtYWpvcl92ZXJzaW9uOwotICB1aW50MTZfdCBtaW5vcl92ZXJzaW9uOwotICB1aW50MTZfdCBidWlsZF92ZXJzaW9uOwotICB1aW50MTZfdCByZXZpc2lvbjsKLX07Ci0KLWJvb2wgR2V0V2luZG93c1ZlcnNpb24oV2luZG93c1ZlcnNpb24qIHZlcnNpb24pIHsKLSAgU0JfRENIRUNLKHZlcnNpb24pOwotICBBbmFseXRpY3NWZXJzaW9uSW5mb14gdmVyc2lvbl9pbmZvID0gQW5hbHl0aWNzSW5mbzo6VmVyc2lvbkluZm87Ci0gIHN0ZDo6c3RyaW5nIGRldmljZV9mYW1pbHlfdmVyc2lvbiA9Ci0gICAgICBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OnBsYXRmb3JtU3RyaW5nVG9TdHJpbmcoCi0gICAgICAgICAgdmVyc2lvbl9pbmZvLT5EZXZpY2VGYW1pbHlWZXJzaW9uKTsKLSAgaWYgKGRldmljZV9mYW1pbHlfdmVyc2lvbi5lbXB0eSgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHVpbnQ2NF90IHZlcnNpb25faW5mb19hbGwgPQotICAgICAgU2JTdHJpbmdQYXJzZVVJbnQ2NChkZXZpY2VfZmFtaWx5X3ZlcnNpb24uY19zdHIoKSwgbnVsbHB0ciwgMTApOwotICBpZiAodmVyc2lvbl9pbmZvX2FsbCA9PSAwKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHZlcnNpb24tPm1ham9yX3ZlcnNpb24gPSAodmVyc2lvbl9pbmZvX2FsbCA+PiA0OCkgJiAweEZGRkY7Ci0gIHZlcnNpb24tPm1pbm9yX3ZlcnNpb24gPSAodmVyc2lvbl9pbmZvX2FsbCA+PiAzMikgJiAweEZGRkY7Ci0gIHZlcnNpb24tPmJ1aWxkX3ZlcnNpb24gPSAodmVyc2lvbl9pbmZvX2FsbCA+PiAxNikgJiAweEZGRkY7Ci0gIHZlcnNpb24tPnJldmlzaW9uID0gdmVyc2lvbl9pbmZvX2FsbCAmIDB4RkZGRjsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWNvbnN0IGNoYXIga1hib3hPbmVTa3VQcmVmaXhbXSA9ICJYQk9YX09ORV8iOwotCi19ICAvLyBuYW1lc3BhY2UKLQotYm9vbCBTYlN5c3RlbUdldFByb3BlcnR5KFNiU3lzdGVtUHJvcGVydHlJZCBwcm9wZXJ0eV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBvdXRfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlX2xlbmd0aCkgewotICBpZiAoIW91dF92YWx1ZSB8fCAhdmFsdWVfbGVuZ3RoKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgdXNpbmcgc2J3aW4zMjo6cGxhdGZvcm1TdHJpbmdUb1N0cmluZzsKLSAgdXNpbmcgc3RhcmJvYXJkOjpzaGFyZWQ6OnV3cDo6U3BlZWNoQXBpS2V5OwotCi0gIHN3aXRjaCAocHJvcGVydHlfaWQpIHsKLSAgICBjYXNlIGtTYlN5c3RlbVByb3BlcnR5TW9kZWxZZWFyOgotICAgIGNhc2Uga1NiU3lzdGVtUHJvcGVydHlOZXR3b3JrT3BlcmF0b3JOYW1lOgotICAgIGNhc2Uga1NiU3lzdGVtUHJvcGVydHlVc2VyQWdlbnRBdXhGaWVsZDoKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBjYXNlIGtTYlN5c3RlbVByb3BlcnR5U3BlZWNoQXBpS2V5OgotICAgICAgQ29weVN0cmluZ0FuZFRlc3RJZlN1Y2Nlc3Mob3V0X3ZhbHVlLCB2YWx1ZV9sZW5ndGgsIFNwZWVjaEFwaUtleSgpKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIGNhc2Uga1NiU3lzdGVtUHJvcGVydHlCcmFuZE5hbWU6IHsKLSAgICAgIEVhc0NsaWVudERldmljZUluZm9ybWF0aW9uXiBjdXJyZW50X2RldmljZV9pbmZvID0KLSAgICAgICAgICByZWYgbmV3IEVhc0NsaWVudERldmljZUluZm9ybWF0aW9uKCk7Ci0gICAgICBzdGQ6OnN0cmluZyBicmFuZF9uYW1lID0KLSAgICAgICAgICBwbGF0Zm9ybVN0cmluZ1RvU3RyaW5nKGN1cnJlbnRfZGV2aWNlX2luZm8tPlN5c3RlbU1hbnVmYWN0dXJlcik7Ci0gICAgICBpZiAoYnJhbmRfbmFtZS5lbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBDb3B5U3RyaW5nQW5kVGVzdElmU3VjY2VzcyhvdXRfdmFsdWUsIHZhbHVlX2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmFuZF9uYW1lLmNfc3RyKCkpOwotICAgIH0KLSAgICBjYXNlIGtTYlN5c3RlbVByb3BlcnR5RmlybXdhcmVWZXJzaW9uOiB7Ci0gICAgICBXaW5kb3dzVmVyc2lvbiB2ZXJzaW9uID0gezB9OwotICAgICAgaWYgKCFHZXRXaW5kb3dzVmVyc2lvbigmdmVyc2lvbikpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaW50IHJldHVybl92YWx1ZSA9IFNiU3RyaW5nRm9ybWF0RigKLSAgICAgICAgICBvdXRfdmFsdWUsIHZhbHVlX2xlbmd0aCwgIiV1LiV1LiV1LiV1IiwgdmVyc2lvbi5tYWpvcl92ZXJzaW9uLAotICAgICAgICAgIHZlcnNpb24ubWlub3JfdmVyc2lvbiwgdmVyc2lvbi5idWlsZF92ZXJzaW9uLCB2ZXJzaW9uLnJldmlzaW9uKTsKLSAgICAgIHJldHVybiAoKHJldHVybl92YWx1ZSA+IDApICYmIChyZXR1cm5fdmFsdWUgPCB2YWx1ZV9sZW5ndGgpKTsKLSAgICB9Ci0gICAgY2FzZSBrU2JTeXN0ZW1Qcm9wZXJ0eUNoaXBzZXRNb2RlbE51bWJlcjogewotICAgICAgc3RkOjpzdHJpbmcgc2t1ID0gcGxhdGZvcm1TdHJpbmdUb1N0cmluZygKLSAgICAgICAgICAocmVmIG5ldyBFYXNDbGllbnREZXZpY2VJbmZvcm1hdGlvbigpKS0+U3lzdGVtU2t1KTsKLQotICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0OwotICAgICAgaWYgKFN0YXJ0c1dpdGgoc2t1LCBrWGJveE9uZVNrdVByZWZpeCkpIHsKLSAgICAgICAgcmVzdWx0ID0gIlhib3hPbmUiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzdWx0ID0gc2t1OwotICAgICAgfQotCi0gICAgICByZXR1cm4gQ29weVN0cmluZ0FuZFRlc3RJZlN1Y2Nlc3Mob3V0X3ZhbHVlLCB2YWx1ZV9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmNfc3RyKCkpOwotICAgIH0KLSAgICBjYXNlIGtTYlN5c3RlbVByb3BlcnR5TW9kZWxOYW1lOiB7Ci0gICAgICBzdGQ6OnN0cmluZyBza3UgPSBwbGF0Zm9ybVN0cmluZ1RvU3RyaW5nKAotICAgICAgICAgIChyZWYgbmV3IEVhc0NsaWVudERldmljZUluZm9ybWF0aW9uKCkpLT5TeXN0ZW1Ta3UpOwotCi0gICAgICBzdGQ6OnN0cmluZyBmcmllbmRseV9uYW1lOwotCi0gICAgICBpZiAoc2t1ID09ICJYQk9YX09ORV9EVSIpIHsKLSAgICAgICAgZnJpZW5kbHlfbmFtZSA9ICJYYm94T25lIjsKLSAgICAgIH0gZWxzZSBpZiAoc2t1ID09ICJYQk9YX09ORV9FRCIpIHsKLSAgICAgICAgZnJpZW5kbHlfbmFtZSA9ICJYYm94T25lIFMiOwotICAgICAgfSBlbHNlIGlmIChza3UgPT0gIlhCT1hfT05FX0NIIiB8fCBza3UgPT0gIlhCT1hfT05FX1NDIikgewotICAgICAgICBmcmllbmRseV9uYW1lID0gIlhib3hPbmUgWCI7Ci0gICAgICB9IGVsc2UgaWYgKFN0YXJ0c1dpdGgoc2t1LCBrWGJveE9uZVNrdVByZWZpeCkpIHsKLSAgICAgICAgZnJpZW5kbHlfbmFtZSA9ICJYYm94T25lICIgKyBza3U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmcmllbmRseV9uYW1lID0gc2t1OwotICAgICAgfQotCi0gICAgICByZXR1cm4gQ29weVN0cmluZ0FuZFRlc3RJZlN1Y2Nlc3Mob3V0X3ZhbHVlLCB2YWx1ZV9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJpZW5kbHlfbmFtZS5jX3N0cigpKTsKLSAgICB9Ci0gICAgY2FzZSBrU2JTeXN0ZW1Qcm9wZXJ0eUZyaWVuZGx5TmFtZTogewotICAgICAgRWFzQ2xpZW50RGV2aWNlSW5mb3JtYXRpb25eIGN1cnJlbnRfZGV2aWNlX2luZm8gPQotICAgICAgICAgIHJlZiBuZXcgRWFzQ2xpZW50RGV2aWNlSW5mb3JtYXRpb24oKTsKLSAgICAgIHN0ZDo6c3RyaW5nIGZyaWVuZGx5X25hbWUgPQotICAgICAgICAgIHBsYXRmb3JtU3RyaW5nVG9TdHJpbmcoY3VycmVudF9kZXZpY2VfaW5mby0+RnJpZW5kbHlOYW1lKTsKLSAgICAgIGlmIChmcmllbmRseV9uYW1lLmVtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgcmV0dXJuIENvcHlTdHJpbmdBbmRUZXN0SWZTdWNjZXNzKG91dF92YWx1ZSwgdmFsdWVfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyaWVuZGx5X25hbWUuY19zdHIoKSk7Ci0gICAgfQotICAgIGNhc2Uga1NiU3lzdGVtUHJvcGVydHlQbGF0Zm9ybU5hbWU6IHsKLSAgICAgIEVhc0NsaWVudERldmljZUluZm9ybWF0aW9uXiBjdXJyZW50X2RldmljZV9pbmZvID0KLSAgICAgICAgICByZWYgbmV3IEVhc0NsaWVudERldmljZUluZm9ybWF0aW9uKCk7Ci0gICAgICBzdGQ6OnN0cmluZyBvcGVyYXRpbmdfc3lzdGVtID0KLSAgICAgICAgICBwbGF0Zm9ybVN0cmluZ1RvU3RyaW5nKGN1cnJlbnRfZGV2aWNlX2luZm8tPk9wZXJhdGluZ1N5c3RlbSk7Ci0KLSAgICAgIEFuYWx5dGljc1ZlcnNpb25JbmZvXiB2ZXJzaW9uX2luZm8gPSBBbmFseXRpY3NJbmZvOjpWZXJzaW9uSW5mbzsKLSAgICAgIHN0ZDo6c3RyaW5nIG9zX25hbWVfYW5kX3ZlcnNpb24gPQotICAgICAgICAgIHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6cGxhdGZvcm1TdHJpbmdUb1N0cmluZygKLSAgICAgICAgICAgICAgY3VycmVudF9kZXZpY2VfaW5mby0+T3BlcmF0aW5nU3lzdGVtKTsKLSAgICAgIGlmIChvc19uYW1lX2FuZF92ZXJzaW9uLmVtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICBXaW5kb3dzVmVyc2lvbiBvc192ZXJzaW9uOwotICAgICAgaWYgKCFHZXRXaW5kb3dzVmVyc2lvbigmb3NfdmVyc2lvbikpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICBvc19uYW1lX2FuZF92ZXJzaW9uICs9ICIgIjsKLSAgICAgIGNoYXIgb3NfdmVyc2lvbl9idWZmZXJba09zVmVyc2lvblNpemVdOwotICAgICAgb3NfdmVyc2lvbl9idWZmZXJbMF0gPSAnXDAnOwotCi0gICAgICBpbnQgcmV0dXJuX3ZhbHVlID0KLSAgICAgICAgICBTYlN0cmluZ0Zvcm1hdEYob3NfdmVyc2lvbl9idWZmZXIsIHZhbHVlX2xlbmd0aCwgIiV1LiV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgb3NfdmVyc2lvbi5tYWpvcl92ZXJzaW9uLCBvc192ZXJzaW9uLm1pbm9yX3ZlcnNpb24pOwotICAgICAgaWYgKChyZXR1cm5fdmFsdWUgPCAwKSB8fCAocmV0dXJuX3ZhbHVlID49IHZhbHVlX2xlbmd0aCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICBvc19uYW1lX2FuZF92ZXJzaW9uLmFwcGVuZChvc192ZXJzaW9uX2J1ZmZlcik7Ci0KLSAgICAgIHJldHVybiBDb3B5U3RyaW5nQW5kVGVzdElmU3VjY2VzcyhvdXRfdmFsdWUsIHZhbHVlX2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc19uYW1lX2FuZF92ZXJzaW9uLmNfc3RyKCkpOwotICAgIH0KLSNpZiBTQl9BUElfVkVSU0lPTiA8IFNCX1BST1BFUlRZX1VVSURfUkVNT1ZFRF9BUElfVkVSU0lPTgotICAgIGNhc2Uga1NiU3lzdGVtUHJvcGVydHlQbGF0Zm9ybVV1aWQ6IHsKLSAgICAgIFNCX05PVElNUExFTUVOVEVEKCk7Ci0gICAgICByZXR1cm4gQ29weVN0cmluZ0FuZFRlc3RJZlN1Y2Nlc3Mob3V0X3ZhbHVlLCB2YWx1ZV9sZW5ndGgsICJOL0EiKTsKLSAgICB9Ci0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OIDwgU0JfUFJPUEVSVFlfVVVJRF9SRU1PVkVEX0FQSV9WRVJTSU9OCi0gICAgZGVmYXVsdDoKLSAgICAgIFNCX0RMT0coV0FSTklORykgPDwgX19GVU5DVElPTl9fCi0gICAgICAgICAgICAgICAgICAgICAgIDw8ICI6IFVucmVjb2duaXplZCBwcm9wZXJ0eTogIiA8PCBwcm9wZXJ0eV9pZDsKLSAgICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9zeXN0ZW1fZ2V0X3RvdGFsX2NwdV9tZW1vcnkuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC91d3Avc3lzdGVtX2dldF90b3RhbF9jcHVfbWVtb3J5LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTNmZDdkLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9zeXN0ZW1fZ2V0X3RvdGFsX2NwdV9tZW1vcnkuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3N5c3RlbS5oIgotCi11c2luZyBXaW5kb3dzOjpTeXN0ZW06Ok1lbW9yeU1hbmFnZXI7Ci0KLWludDY0X3QgU2JTeXN0ZW1HZXRUb3RhbENQVU1lbW9yeSgpIHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PGludDY0X3Q+KE1lbW9yeU1hbmFnZXI6OkFwcE1lbW9yeVVzYWdlTGltaXQpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL3N5c3RlbV9nZXRfdXNlZF9jcHVfbWVtb3J5LmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL3N5c3RlbV9nZXRfdXNlZF9jcHVfbWVtb3J5LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGM5YzBkLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9zeXN0ZW1fZ2V0X3VzZWRfY3B1X21lbW9yeS5jYworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc3lzdGVtLmgiCi0KLXVzaW5nIFdpbmRvd3M6OlN5c3RlbTo6TWVtb3J5TWFuYWdlcjsKLQotaW50NjRfdCBTYlN5c3RlbUdldFVzZWRDUFVNZW1vcnkoKSB7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ2NF90PihNZW1vcnlNYW5hZ2VyOjpBcHBNZW1vcnlVc2FnZSk7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC91d3Avc3lzdGVtX3BsYXRmb3JtX2Vycm9yX2ludGVybmFsLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL3N5c3RlbV9wbGF0Zm9ybV9lcnJvcl9pbnRlcm5hbC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI0NmY3MC4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC91d3Avc3lzdGVtX3BsYXRmb3JtX2Vycm9yX2ludGVybmFsLmNjCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvdXdwL3N5c3RlbV9wbGF0Zm9ybV9lcnJvcl9pbnRlcm5hbC5oIgotCi11c2luZyBXaW5kb3dzOjpGb3VuZGF0aW9uOjpBc3luY09wZXJhdGlvbkNvbXBsZXRlZEhhbmRsZXI7Ci11c2luZyBXaW5kb3dzOjpGb3VuZGF0aW9uOjpBc3luY1N0YXR1czsKLXVzaW5nIFdpbmRvd3M6OkZvdW5kYXRpb246OklBc3luY09wZXJhdGlvbjsKLXVzaW5nIFdpbmRvd3M6OlVJOjpQb3B1cHM6OklVSUNvbW1hbmQ7Ci11c2luZyBXaW5kb3dzOjpVSTo6UG9wdXBzOjpNZXNzYWdlRGlhbG9nOwotdXNpbmcgV2luZG93czo6VUk6OlBvcHVwczo6VUlDb21tYW5kOwotdXNpbmcgV2luZG93czo6VUk6OlBvcHVwczo6VUlDb21tYW5kSW52b2tlZEhhbmRsZXI7Ci0KLVNiQXRvbWljMzIgU2JTeXN0ZW1QbGF0Zm9ybUVycm9yUHJpdmF0ZTo6c19lcnJvcl9jb3VudCA9IDA7Ci0KLVNiU3lzdGVtUGxhdGZvcm1FcnJvclByaXZhdGU6OlNiU3lzdGVtUGxhdGZvcm1FcnJvclByaXZhdGUoQXBwbGljYXRpb25Vd3AqIGFwcCwKLSAgICBTYlN5c3RlbVBsYXRmb3JtRXJyb3JUeXBlIHR5cGUsIFNiU3lzdGVtUGxhdGZvcm1FcnJvckNhbGxiYWNrIGNhbGxiYWNrLAotICAgIHZvaWQqIHVzZXJfZGF0YSkKLSAgICA6IGNhbGxiYWNrXyhjYWxsYmFjayksCi0gICAgICB1c2VyX2RhdGFfKHVzZXJfZGF0YSkgewotICBTQl9EQ0hFQ0sodHlwZSA9PSBrU2JTeXN0ZW1QbGF0Zm9ybUVycm9yVHlwZUNvbm5lY3Rpb25FcnJvcik7Ci0KLSAgLy8gT25seSBvbmUgZXJyb3IgZGlhbG9nIGNhbiBiZSBkaXNwbGF5ZWQgYXQgYSB0aW1lLgotICBpZiAoU2JBdG9taWNOb0JhcnJpZXJfSW5jcmVtZW50KCZzX2Vycm9yX2NvdW50LCAxKSAhPSAxKSB7Ci0gICAgU2JBdG9taWNOb0JhcnJpZXJfSW5jcmVtZW50KCZzX2Vycm9yX2NvdW50LCAtMSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgTWVzc2FnZURpYWxvZ14gZGlhbG9nID0gcmVmIG5ldyBNZXNzYWdlRGlhbG9nKAotICAgICAgYXBwLT5HZXRTdHJpbmcoIlVOQUJMRV9UT19DT05UQUNUX1lPVVRVQkVfMSIsCi0gICAgICAgICAgIlNvcnJ5LCBjb3VsZCBub3QgY29ubmVjdCB0byBZb3VUdWJlLiIpKTsKLSAgZGlhbG9nLT5Db21tYW5kcy0+QXBwZW5kKAotICAgICAgTWFrZVVJQ29tbWFuZCgKLSAgICAgICAgICBhcHAsCi0gICAgICAgICAgIk9GRkxJTkVfTUVTU0FHRV9UUllfQUdBSU4iLCAiVHJ5IGFnYWluIiwKLSAgICAgICAgICBrU2JTeXN0ZW1QbGF0Zm9ybUVycm9yUmVzcG9uc2VQb3NpdGl2ZSkpOwotICBkaWFsb2ctPkNvbW1hbmRzLT5BcHBlbmQoCi0gICAgICBNYWtlVUlDb21tYW5kKAotICAgICAgICAgIGFwcCwKLSAgICAgICAgICAiRVhJVF9CVVRUT04iLCAiRXhpdCIsCi0gICAgICAgICAga1NiU3lzdGVtUGxhdGZvcm1FcnJvclJlc3BvbnNlQ2FuY2VsKSk7Ci0gIGRpYWxvZy0+RGVmYXVsdENvbW1hbmRJbmRleCA9IDA7Ci0gIGRpYWxvZy0+Q2FuY2VsQ29tbWFuZEluZGV4ID0gMTsKLQotICB0cnkgewotICAgIGRpYWxvZ19vcGVyYXRpb25fID0gZGlhbG9nLT5TaG93QXN5bmMoKTsKLSAgICAvLyBOT1RFOiBJdCdzIHBvc3NpYmxlIHRvIHVzZSB0aGUgIkNvbXBsZXRlZCIgY2FsbGJhY2sgdG8gZGVsZXRlIHRoaXMKLSAgICAvLyBvYmplY3Qgb25jZSB0aGUgZGlhbG9nIGlzIGZpbmlzaGVkLiBIb3dldmVyLCB0aGlzIGludHJvZHVjZXMgYQotICAgIC8vIHBvc3NpYmxlIHJhY2UgY29uZGl0aW9uIGJldHdlZW4gZGVsZXRpbmcgdGhlIG9iamVjdCBhbmQKLSAgICAvLyBTYlN5c3RlbUNsZWFyUGxhdGZvcm1FcnJvcigpLiBPdGhlciBpbXBsZW1lbnRhdGlvbnMgZGVsZXRlIHRoZSBvYmplY3QKLSAgICAvLyBvbmx5IHdoZW4gU2JTeXN0ZW1DbGVhclBsYXRmb3JtRXJyb3IoKSBpcyBjYWxsZWQuIEdvIHdpdGggdGhpcwotICAgIC8vIGFwcHJvYWNoIHRvIGF2b2lkIHRoZSBwb3NzaWJsZSByYWNlIGNvbmRpdGlvbi4KLSAgICBkaWFsb2dfb3BlcmF0aW9uXy0+Q29tcGxldGVkID0KLSAgICAgICAgcmVmIG5ldyBBc3luY09wZXJhdGlvbkNvbXBsZXRlZEhhbmRsZXI8SVVJQ29tbWFuZCBePigKLSAgICAgICAgICBbXShJQXN5bmNPcGVyYXRpb248SVVJQ29tbWFuZF4+XiwgQXN5bmNTdGF0dXMpIHsKLSAgICAgICAgICAgIFNCX0RDSEVDSyhTYkF0b21pY05vQmFycmllcl9Mb2FkKCZzX2Vycm9yX2NvdW50KSA+IDApOwotICAgICAgICAgICAgU2JBdG9taWNOb0JhcnJpZXJfSW5jcmVtZW50KCZzX2Vycm9yX2NvdW50LCAtMSk7Ci0gICAgICAgICAgfSk7Ci0gIH0gY2F0Y2goUGxhdGZvcm06OkV4Y2VwdGlvbl4pIHsKLSAgICBTQl9MT0coRVJST1IpIDw8ICJVbmFibGUgdG8gcmFpc2UgU2JTeXN0ZW1QbGF0Zm9ybUVycm9yIjsKLSAgICBTYkF0b21pY05vQmFycmllcl9JbmNyZW1lbnQoJnNfZXJyb3JfY291bnQsIC0xKTsKLSAgfQotfQotCi1ib29sIFNiU3lzdGVtUGxhdGZvcm1FcnJvclByaXZhdGU6OklzVmFsaWQoKSBjb25zdCB7Ci0gIHJldHVybiBkaWFsb2dfb3BlcmF0aW9uXy5HZXQoKSAhPSBudWxscHRyOwotfQotCi12b2lkIFNiU3lzdGVtUGxhdGZvcm1FcnJvclByaXZhdGU6OkNsZWFyQW5kRGVsZXRlKCkgewotICBpZiAoSXNWYWxpZCgpKSB7Ci0gICAgZGlhbG9nX29wZXJhdGlvbl8tPkNhbmNlbCgpOwotICB9Ci0gIGRlbGV0ZSB0aGlzOwotfQotCi1JVUlDb21tYW5kXiBTYlN5c3RlbVBsYXRmb3JtRXJyb3JQcml2YXRlOjpNYWtlVUlDb21tYW5kKEFwcGxpY2F0aW9uVXdwKiBhcHAsCi0gICAgY29uc3QgY2hhciogaWQsIGNvbnN0IGNoYXIqIGZhbGxiYWNrLAotICAgIFNiU3lzdGVtUGxhdGZvcm1FcnJvclJlc3BvbnNlIHJlc3BvbnNlKSB7Ci0gIFBsYXRmb3JtOjpTdHJpbmdeIGxhYmVsID0gYXBwLT5HZXRTdHJpbmcoaWQsIGZhbGxiYWNrKTsKLSAgcmV0dXJuIHJlZiBuZXcgVUlDb21tYW5kKGxhYmVsLAotICAgIHJlZiBuZXcgVUlDb21tYW5kSW52b2tlZEhhbmRsZXIoCi0gICAgICBbdGhpcywgcmVzcG9uc2VdKElVSUNvbW1hbmReIGNvbW1hbmQpIHsKLSAgICAgICAgY2FsbGJhY2tfKHJlc3BvbnNlLCB1c2VyX2RhdGFfKTsKLSAgICAgIH0pKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9zeXN0ZW1fcGxhdGZvcm1fZXJyb3JfaW50ZXJuYWwuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9zeXN0ZW1fcGxhdGZvcm1fZXJyb3JfaW50ZXJuYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY1NDZlNy4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC91d3Avc3lzdGVtX3BsYXRmb3JtX2Vycm9yX2ludGVybmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaWZuZGVmIFNUQVJCT0FSRF9TSEFSRURfVVdQX1NZU1RFTV9QTEFURk9STV9FUlJPUl9JTlRFUk5BTF9IXwotI2RlZmluZSBTVEFSQk9BUkRfU0hBUkVEX1VXUF9TWVNURU1fUExBVEZPUk1fRVJST1JfSU5URVJOQUxfSF8KLQotI2luY2x1ZGUgInN0YXJib2FyZC9hdG9taWMuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3V3cC9hcHBsaWNhdGlvbl91d3AuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc3lzdGVtLmgiCi0KLS8vIE5vdGUgdGhhdCB0aGlzIGlzIGEgInN0cnVjdCIgYW5kIG5vdCBhICJjbGFzcyIgYmVjYXVzZQotLy8gdGhhdCdzIGhvdyBpdCdzIGRlZmluZWQgaW4gc3RhcmJvYXJkL3N5c3RlbS5oCi1zdHJ1Y3QgU2JTeXN0ZW1QbGF0Zm9ybUVycm9yUHJpdmF0ZSB7Ci0gIHR5cGVkZWYgc3RhcmJvYXJkOjpzaGFyZWQ6OnV3cDo6QXBwbGljYXRpb25Vd3AgQXBwbGljYXRpb25Vd3A7Ci0KLSAgU2JTeXN0ZW1QbGF0Zm9ybUVycm9yUHJpdmF0ZShjb25zdCBTYlN5c3RlbVBsYXRmb3JtRXJyb3JQcml2YXRlJikgPSBkZWxldGU7Ci0gIFNiU3lzdGVtUGxhdGZvcm1FcnJvclByaXZhdGUmIG9wZXJhdG9yPShjb25zdCBTYlN5c3RlbVBsYXRmb3JtRXJyb3JQcml2YXRlJikKLSAgICAgID0gZGVsZXRlOwotCi0gIFNiU3lzdGVtUGxhdGZvcm1FcnJvclByaXZhdGUoQXBwbGljYXRpb25Vd3AqIGFwcCwKLSAgICAgIFNiU3lzdGVtUGxhdGZvcm1FcnJvclR5cGUgdHlwZSwgU2JTeXN0ZW1QbGF0Zm9ybUVycm9yQ2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICB2b2lkKiB1c2VyX2RhdGEpOwotICBib29sIElzVmFsaWQoKSBjb25zdDsKLSAgdm9pZCBDbGVhckFuZERlbGV0ZSgpOwotCi0gcHJpdmF0ZToKLSAgdHlwZWRlZiBXaW5kb3dzOjpVSTo6UG9wdXBzOjpJVUlDb21tYW5kIElVSUNvbW1hbmQ7Ci0gIHR5cGVkZWYgV2luZG93czo6Rm91bmRhdGlvbjo6SUFzeW5jT3BlcmF0aW9uPElVSUNvbW1hbmRePiBEaWFsb2dPcGVyYXRpb247Ci0KLSAgSVVJQ29tbWFuZF4gTWFrZVVJQ29tbWFuZChBcHBsaWNhdGlvblV3cCogYXBwLCBjb25zdCBjaGFyKiBpZCwKLSAgICAgIGNvbnN0IGNoYXIqIGZhbGxiYWNrLCBTYlN5c3RlbVBsYXRmb3JtRXJyb3JSZXNwb25zZSByZXNwb25zZSk7Ci0KLSAgU2JTeXN0ZW1QbGF0Zm9ybUVycm9yQ2FsbGJhY2sgY2FsbGJhY2tfOwotICB2b2lkKiB1c2VyX2RhdGFfOwotICBQbGF0Zm9ybTo6QWdpbGU8RGlhbG9nT3BlcmF0aW9uPiBkaWFsb2dfb3BlcmF0aW9uXzsKLQotICBzdGF0aWMgU2JBdG9taWMzMiBzX2Vycm9yX2NvdW50OwotfTsKLQotI2VuZGlmICAvLyBTVEFSQk9BUkRfU0hBUkVEX1VXUF9TWVNURU1fUExBVEZPUk1fRVJST1JfSU5URVJOQUxfSF8KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9zeXN0ZW1fcmFpc2VfcGxhdGZvcm1fZXJyb3IuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC91d3Avc3lzdGVtX3JhaXNlX3BsYXRmb3JtX2Vycm9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGQyOTU5Li4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC9zeXN0ZW1fcmFpc2VfcGxhdGZvcm1fZXJyb3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3N5c3RlbS5oIgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC91d3AvYXBwbGljYXRpb25fdXdwLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC91d3Avc3lzdGVtX3BsYXRmb3JtX2Vycm9yX2ludGVybmFsLmgiCi0KLXVzaW5nIHN0YXJib2FyZDo6c2hhcmVkOjp1d3A6OkFwcGxpY2F0aW9uVXdwOwotCi1TYlN5c3RlbVBsYXRmb3JtRXJyb3IgU2JTeXN0ZW1SYWlzZVBsYXRmb3JtRXJyb3IoCi0gICAgU2JTeXN0ZW1QbGF0Zm9ybUVycm9yVHlwZSB0eXBlLAotICAgIFNiU3lzdGVtUGxhdGZvcm1FcnJvckNhbGxiYWNrIGNhbGxiYWNrLAotICAgIHZvaWQqIHVzZXJfZGF0YSkgewotICBBcHBsaWNhdGlvblV3cCogYXBwID0gQXBwbGljYXRpb25Vd3A6OkdldCgpOwotICBpZiAoIWFwcCkgewotICAgIHJldHVybiBrU2JTeXN0ZW1QbGF0Zm9ybUVycm9ySW52YWxpZDsKLSAgfQotCi0gIFNiU3lzdGVtUGxhdGZvcm1FcnJvciBoYW5kbGUgPSBuZXcgU2JTeXN0ZW1QbGF0Zm9ybUVycm9yUHJpdmF0ZSgKLSAgICAgIGFwcCwgdHlwZSwgY2FsbGJhY2ssIHVzZXJfZGF0YSk7Ci0gIGlmICghaGFuZGxlLT5Jc1ZhbGlkKCkpIHsKLSAgICBoYW5kbGUtPkNsZWFyQW5kRGVsZXRlKCk7Ci0gICAgaGFuZGxlID0ga1NiU3lzdGVtUGxhdGZvcm1FcnJvckludmFsaWQ7Ci0gIH0KLQotICByZXR1cm4gaGFuZGxlOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL3dhc2FwaV9hdWRpby5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC93YXNhcGlfYXVkaW8uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYzdmZDEuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL3dhc2FwaV9hdWRpby5jYworKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3V3cC93YXNhcGlfYXVkaW8uaCIKLQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLQotbmFtZXNwYWNlIHN0YXJib2FyZCB7Ci1uYW1lc3BhY2Ugc2hhcmVkIHsKLW5hbWVzcGFjZSB1d3AgewotCi11c2luZyBNaWNyb3NvZnQ6OldSTDo6Q29tUHRyOwotdXNpbmcgV2luZG93czo6TWVkaWE6OkRldmljZXM6Ok1lZGlhRGV2aWNlOwotCi1uYW1lc3BhY2UgewotY29uc3QgaW50IGtXYWl0Rm9yQWN0aXZhdGVUaW1lb3V0ID0gNTAwOyAgLy8gMC41IHNlYwotfSAgLy8gbmFtZXNwYWNlCi0KLVdBU0FQSUF1ZGlvRGV2aWNlOjpXQVNBUElBdWRpb0RldmljZSgpIHsKLSAgSW5pdGlhbGl6ZUF1ZGlvRGV2aWNlKCk7Ci0gIENsb3NlSGFuZGxlKGFjdGl2YXRlX2NvbXBsZXRlZF8pOwotfQotCi12b2lkIFdBU0FQSUF1ZGlvRGV2aWNlOjpJbml0aWFsaXplQXVkaW9EZXZpY2UoKSB7Ci0gIENvbVB0cjxJQWN0aXZhdGVBdWRpb0ludGVyZmFjZUFzeW5jT3BlcmF0aW9uPiBhc3luY19vcGVyYXRpb247Ci0KLSAgLy8gRGVmYXVsdCBBdWRpbyBEZXZpY2UgUmVuZGVyZXIKLSAgUGxhdGZvcm06OlN0cmluZyBeIGRldmljZUlkU3RyaW5nID0gTWVkaWFEZXZpY2U6OkdldERlZmF1bHRBdWRpb1JlbmRlcklkKAotICAgICAgV2luZG93czo6TWVkaWE6OkRldmljZXM6OkF1ZGlvRGV2aWNlUm9sZTo6RGVmYXVsdCk7Ci0KLSAgaWYgKEZBSUxFRChBY3RpdmF0ZUF1ZGlvSW50ZXJmYWNlQXN5bmMoZGV2aWNlSWRTdHJpbmctPkRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191dWlkb2YoSUF1ZGlvQ2xpZW50MyksIG51bGxwdHIsIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhc3luY19vcGVyYXRpb24pKSkgewotICAgIHJldHVybjsKLSAgfQotICBXYWl0Rm9yU2luZ2xlT2JqZWN0KGFjdGl2YXRlX2NvbXBsZXRlZF8sIGtXYWl0Rm9yQWN0aXZhdGVUaW1lb3V0KTsKLX0KLQotSFJFU1VMVCBXQVNBUElBdWRpb0RldmljZTo6QWN0aXZhdGVDb21wbGV0ZWQoCi0gICAgSUFjdGl2YXRlQXVkaW9JbnRlcmZhY2VBc3luY09wZXJhdGlvbiogb3BlcmF0aW9uKSB7Ci0gIEhSRVNVTFQgaHIgPSBTX09LOwotICBIUkVTVUxUIGhyX2FjdGl2YXRlID0gU19PSzsKLSAgQ29tUHRyPElVbmtub3duPiBhdWRpb19pbnRlcmZhY2U7Ci0KLSAgLy8gQ2hlY2sgZm9yIGEgc3VjY2Vzc2Z1bCBhY3RpdmF0aW9uIHJlc3VsdAotICBociA9IG9wZXJhdGlvbi0+R2V0QWN0aXZhdGVSZXN1bHQoJmhyX2FjdGl2YXRlLCAmYXVkaW9faW50ZXJmYWNlKTsKLQotICBpZiAoU1VDQ0VFREVEKGhyKSAmJiBTVUNDRUVERUQoaHJfYWN0aXZhdGUpKSB7Ci0gICAgLy8gR2V0IHRoZSBwb2ludGVyIGZvciB0aGUgQXVkaW8gQ2xpZW50LgotICAgIGhyID0gYXVkaW9faW50ZXJmYWNlLT5RdWVyeUludGVyZmFjZShJSURfUFBWX0FSR1MoJmF1ZGlvX2NsaWVudF8pKTsKLSAgICBTQl9EQ0hFQ0soYXVkaW9fY2xpZW50Xyk7Ci0gICAgaWYgKFNVQ0NFRURFRChocikpIHsKLSAgICAgIEF1ZGlvQ2xpZW50UHJvcGVydGllcyBhdWRpb19wcm9wcyA9IHswfTsKLSAgICAgIGF1ZGlvX3Byb3BzLmNiU2l6ZSA9IHNpemVvZihBdWRpb0NsaWVudFByb3BlcnRpZXMpOwotICAgICAgYXVkaW9fcHJvcHMuYklzT2ZmbG9hZCA9IGZhbHNlOwotICAgICAgYXVkaW9fcHJvcHMuZUNhdGVnb3J5ID0gQXVkaW9DYXRlZ29yeV9NZWRpYTsKLQotICAgICAgaHIgPSBhdWRpb19jbGllbnRfLT5TZXRDbGllbnRQcm9wZXJ0aWVzKCZhdWRpb19wcm9wcyk7Ci0gICAgICBpZiAoU1VDQ0VFREVEKGhyKSkgewotICAgICAgICBXQVZFRk9STUFURVgqIGZvcm1hdDsKLSAgICAgICAgaHIgPSBhdWRpb19jbGllbnRfLT5HZXRNaXhGb3JtYXQoJmZvcm1hdCk7Ci0gICAgICAgIFNCX0RDSEVDSyhmb3JtYXQpOwotICAgICAgICBpZiAoU1VDQ0VFREVEKGhyKSkgewotICAgICAgICAgIGJpdHJhdGVfID0gZm9ybWF0LT5uU2FtcGxlc1BlclNlYyAqIGZvcm1hdC0+d0JpdHNQZXJTYW1wbGU7Ci0gICAgICAgICAgY2hhbm5lbHNfID0gZm9ybWF0LT5uQ2hhbm5lbHM7Ci0gICAgICAgICAgQ29UYXNrTWVtRnJlZShmb3JtYXQpOwotICAgICAgICB9ICAvLyBhdWRpb19jbGllbnRfLT5HZXRNaXhGb3JtYXQKLSAgICAgIH0gICAgLy8gYXVkaW9fY2xpZW50Xy0+U2V0Q2xpZW50UHJvcGVydGllcwotICAgIH0gICAgICAvLyBhdWRpb19pbnRlcmZhY2UtPlF1ZXJ5SW50ZXJmYWNlCi0gIH0KLQotICBhdWRpb19jbGllbnRfID0gbnVsbHB0cjsKLSAgU2V0RXZlbnQoYWN0aXZhdGVfY29tcGxldGVkXyk7Ci0KLSAgLy8gTmVlZCB0byByZXR1cm4gU19PSwotICByZXR1cm4gU19PSzsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHV3cAotfSAgLy8gbmFtZXNwYWNlIHNoYXJlZAotfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL3dhc2FwaV9hdWRpby5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL3dhc2FwaV9hdWRpby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjI1ZDY2Li4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC93YXNhcGlfYXVkaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpZm5kZWYgU1RBUkJPQVJEX1NIQVJFRF9VV1BfV0FTQVBJX0FVRElPX0hfCi0jZGVmaW5lIFNUQVJCT0FSRF9TSEFSRURfVVdQX1dBU0FQSV9BVURJT19IXwotCi0jaW5jbHVkZSA8QXVkaW9jbGllbnQuaD4KLSNpbmNsdWRlIDxtbWRldmljZWFwaS5oPgotI2luY2x1ZGUgPHdybFxpbXBsZW1lbnRzLmg+Ci0KLW5hbWVzcGFjZSBzdGFyYm9hcmQgewotbmFtZXNwYWNlIHNoYXJlZCB7Ci1uYW1lc3BhY2UgdXdwIHsKLQotY2xhc3MgV0FTQVBJQXVkaW9EZXZpY2UKLSAgICA6IHB1YmxpYyBNaWNyb3NvZnQ6OldSTDo6UnVudGltZUNsYXNzPAotICAgICAgICAgIE1pY3Jvc29mdDo6V1JMOjpSdW50aW1lQ2xhc3NGbGFnczxNaWNyb3NvZnQ6OldSTDo6Q2xhc3NpY0NvbT4sCi0gICAgICAgICAgTWljcm9zb2Z0OjpXUkw6OkZ0bUJhc2UsCi0gICAgICAgICAgSUFjdGl2YXRlQXVkaW9JbnRlcmZhY2VDb21wbGV0aW9uSGFuZGxlcj4gewotIHB1YmxpYzoKLSAgV0FTQVBJQXVkaW9EZXZpY2U6OldBU0FQSUF1ZGlvRGV2aWNlKCk7Ci0KLSAgaW50IEdldE51bUNoYW5uZWxzKCkgY29uc3QgeyByZXR1cm4gY2hhbm5lbHNfOyB9Ci0gIGludCBHZXRCaXRyYXRlKCkgY29uc3QgeyByZXR1cm4gYml0cmF0ZV87IH0KLQotIHByaXZhdGU6Ci0gIFNURE1FVEhPRChBY3RpdmF0ZUNvbXBsZXRlZCkoSUFjdGl2YXRlQXVkaW9JbnRlcmZhY2VBc3luY09wZXJhdGlvbiopOwotICB2b2lkIEluaXRpYWxpemVBdWRpb0RldmljZSgpOwotCi0gIEhBTkRMRSBhY3RpdmF0ZV9jb21wbGV0ZWRfID0gQ3JlYXRlRXZlbnQobnVsbHB0ciwgVFJVRSwgRkFMU0UsIG51bGxwdHIpOwotICBNaWNyb3NvZnQ6OldSTDo6Q29tUHRyPElBdWRpb0NsaWVudDM+IGF1ZGlvX2NsaWVudF8gPSBudWxscHRyOwotICBpbnQgYml0cmF0ZV8gPSAtMTsKLSAgaW50IGNoYW5uZWxzXyA9IC0xOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHV3cAotfSAgLy8gbmFtZXNwYWNlIHNoYXJlZAotfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZAotCi0jZW5kaWYgIC8vIFNUQVJCT0FSRF9TSEFSRURfVVdQX1dBU0FQSV9BVURJT19IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL3dhdGNoZG9nX2xvZy5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC93YXRjaGRvZ19sb2cuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmY2QxOWIuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL3dhdGNoZG9nX2xvZy5jYworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3V3cC93YXRjaGRvZ19sb2cuaCIKLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9jb21tb24vc2NvcGVkX3B0ci5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9jb21tb24vc2VtYXBob3JlLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL2NvbW1vbi90aHJlYWQuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvZmlsZS5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc3RyaW5nLmgiCi0KLW5hbWVzcGFjZSBzdGFyYm9hcmQgewotbmFtZXNwYWNlIHNoYXJlZCB7Ci1uYW1lc3BhY2UgdXdwIHsKLW5hbWVzcGFjZSB7Ci0KLS8vIFRoZSBXYXRjaERvZ1RocmVhZCB3aWxsIHByaW50IG91dCAiYWxpdmU6IDxDT1VOVD5cbiIgcGVyaW9kaWNhbGx5IHRvIGEKLS8vIGZpbGUuIE9uIGRlc3RydWN0aW9uIFdhdGNoRG9nVGhyZWFkIHdpbGwgd3JpdGUgb3V0ICJkb25lXG4iLgotLy8gVGhpcyBhbGxvd3MgYSB0ZXN0IHJ1bm5lciB0byBhY2N1cmF0ZWx5IGRldGVybWluZSB3aGV0aGVyIHRoaXMgcHJvY2VzcwotLy8gaXMgc3RpbGwgYWxpdmUsIGZpbmlzaGVkLCBvciBjcmFzaGVkLgotY2xhc3MgV2F0Y2hEb2dUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFdhdGNoRG9nVGhyZWFkKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlX3BhdGgpCi0gICAgICA6IFRocmVhZCgiV2F0Y2hEb2dMb2ciKSwgZmlsZV9wYXRoXyhmaWxlX3BhdGgpIHsKLSAgICBTdGFydCgpOwotICB9Ci0KLSAgfldhdGNoRG9nVGhyZWFkKCkgewotICAgIEpvaW4oKTsKLSAgfQotCi0gIHZvaWQgUnVuKCkgb3ZlcnJpZGUgewotICAgIHN0YXRpYyBjb25zdCBTYlRpbWUga1NsZWVwVGltZSA9IGtTYlRpbWVNaWxsaXNlY29uZCAqIDI1MDsKLSAgICBpbnQgY291bnRlciA9IDA7Ci0gICAgYm9vbCBjcmVhdGVkX29rID0gZmFsc2U7Ci0gICAgU2JGaWxlRXJyb3Igb3V0X2Vycm9yID0ga1NiRmlsZU9rOwotICAgIFNiRmlsZSBmaWxlX2hhbmRsZSA9IFNiRmlsZU9wZW4oZmlsZV9wYXRoXy5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1NiRmlsZUNyZWF0ZUFsd2F5cyB8IGtTYkZpbGVXcml0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcmVhdGVkX29rLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dF9lcnJvcik7Ci0gICAgaWYgKCFjcmVhdGVkX29rKSB7Ci0gICAgICBTQl9MT0coRVJST1IpIDw8ICJDb3VsZCBub3QgY3JlYXRlIHdhdGNoZG9nIGZpbGUgIiA8PCBmaWxlX3BhdGhfOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICB3aGlsZSAoIVdhaXRGb3JKb2luKGtTbGVlcFRpbWUpKSB7Ci0gICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgICAgIHNzIDw8ICJhbGl2ZTogIiA8PCBjb3VudGVyKysgPDwgIlxuIjsKLSAgICAgIHN0ZDo6c3RyaW5nIHN0ciA9IHNzLnN0cigpOwotICAgICAgU2JGaWxlV3JpdGUoZmlsZV9oYW5kbGUsIHN0ci5jX3N0cigpLCBzdGF0aWNfY2FzdDxpbnQ+KHN0ci5zaXplKCkpKTsKLSAgICAgIFNiRmlsZUZsdXNoKGZpbGVfaGFuZGxlKTsKLSAgICB9Ci0gICAgY29uc3QgY2hhciBrRG9uZVtdID0gImRvbmVcbiI7Ci0gICAgU2JGaWxlV3JpdGUoZmlsZV9oYW5kbGUsIGtEb25lLCBzdGF0aWNfY2FzdDxpbnQ+KFNiU3RyaW5nR2V0TGVuZ3RoKGtEb25lKSkpOwotICAgIFNiRmlsZUZsdXNoKGZpbGVfaGFuZGxlKTsKLSAgICBTYlRocmVhZFNsZWVwKDUwICoga1NiVGltZU1pbGxpc2Vjb25kKTsKLSAgICBib29sIGNsb3NlZCA9IFNiRmlsZUNsb3NlKGZpbGVfaGFuZGxlKTsKLSAgICBTQl9MT0dfSUYoRVJST1IsIGNsb3NlZCkgPDwgIkNvdWxkIG5vdCBjbG9zZSBmaWxlICIgPDwgZmlsZV9wYXRoXzsKLSAgfQotCi0gcHJpdmF0ZToKLSAgc3RkOjpzdHJpbmcgZmlsZV9wYXRoXzsKLX07Ci1zdGFyYm9hcmQ6OnNjb3BlZF9wdHI8V2F0Y2hEb2dUaHJlYWQ+IHNfd2F0Y2hkb2dfc2luZ2xldG9uXzsKLX0gIC8vIG5hbWVzcGFjZS4KLQotdm9pZCBTdGFydFdhdGNoZG9nTG9nKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSB7Ci0gIGlmIChzX3dhdGNoZG9nX3NpbmdsZXRvbl8uZ2V0KCkpIHsKLSAgICBTQl9MT0coRVJST1IpIDw8ICJXYXRjaERvZ1RocmVhZCBleGlzdHMsIGFib3J0aW5nLiI7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHNfd2F0Y2hkb2dfc2luZ2xldG9uXy5yZXNldChuZXcgV2F0Y2hEb2dUaHJlYWQocGF0aCkpOwotfQotCi12b2lkIENsb3NlV2F0Y2hkb2dMb2coKSB7Ci0gIHNfd2F0Y2hkb2dfc2luZ2xldG9uXy5yZXNldChudWxscHRyKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHV3cAotfSAgLy8gbmFtZXNwYWNlIHNoYXJlZAotfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL3dhdGNoZG9nX2xvZy5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL3dhdGNoZG9nX2xvZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDBiY2IyLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC93YXRjaGRvZ19sb2cuaAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpZm5kZWYgU1RBUkJPQVJEX1NIQVJFRF9VV1BfV0FUQ0hET0dfTE9HX0hfCi0jZGVmaW5lIFNUQVJCT0FSRF9TSEFSRURfVVdQX1dBVENIRE9HX0xPR19IXwotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi1uYW1lc3BhY2Ugc3RhcmJvYXJkIHsKLW5hbWVzcGFjZSBzaGFyZWQgewotbmFtZXNwYWNlIHV3cCB7Ci0KLS8vIFN0YXJ0cyBhIHdhdGNoIGRvZyBsb2cgZmlsZS4gVGhpcyBmaWxlIGhhcyAiYWxpdmUiIHByaW50ZWQKLS8vIHRvIGl0IHBlcmlvZGljYWxseSBhbmQgImRvbmUiIHdoZW4gaXQgZmluaXNoZXMuIFVzZWZ1bCBmb3IKLS8vIHRlc3RzIHRvIGRldGVybWluZSB3aGVuIHRoZSBwcm9jZXNzIGV4aXRzLiBPbmx5IG9uZSB3YXRjaGRvZwotLy8gbG9nIGNhbiBiZSBhY3RpdmUgaW4gdGhlIHByb2Nlc3MuCi12b2lkIFN0YXJ0V2F0Y2hkb2dMb2coY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpOwotdm9pZCBDbG9zZVdhdGNoZG9nTG9nKCk7Ci0KLX0gIC8vIG5hbWVzcGFjZSB1d3AKLX0gIC8vIG5hbWVzcGFjZSBzaGFyZWQKLX0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKLQotI2VuZGlmICAvLyBTVEFSQk9BUkRfU0hBUkVEX1VXUF9XQVRDSERPR19MT0dfSF8KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC93aW5kb3dfY3JlYXRlLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL3dpbmRvd19jcmVhdGUuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjYTU1OTAuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL3dpbmRvd19jcmVhdGUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3dpbmRvdy5oIgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC91d3AvYXBwbGljYXRpb25fdXdwLmgiCi0KLVNiV2luZG93IFNiV2luZG93Q3JlYXRlKGNvbnN0IFNiV2luZG93T3B0aW9ucyogb3B0aW9ucykgewotICBTYldpbmRvd09wdGlvbnMgZGVmYXVsdF9vcHRpb25zOwotICBpZiAob3B0aW9ucyA9PSBudWxscHRyKSB7Ci0gICAgU2JXaW5kb3dTZXREZWZhdWx0T3B0aW9ucygmZGVmYXVsdF9vcHRpb25zKTsKLSAgICBvcHRpb25zID0gJmRlZmF1bHRfb3B0aW9uczsKLSAgfQotICByZXR1cm4gc3RhcmJvYXJkOjpzaGFyZWQ6OnV3cDo6QXBwbGljYXRpb25Vd3A6OkdldCgpLT5DcmVhdGVXaW5kb3dGb3JVV1AoCi0gICAgICBvcHRpb25zKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC93aW5kb3dfZGVzdHJveS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC93aW5kb3dfZGVzdHJveS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRiNzM5My4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC91d3Avd2luZG93X2Rlc3Ryb3kuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3dpbmRvdy5oIgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC91d3AvYXBwbGljYXRpb25fdXdwLmgiCi0KLWJvb2wgU2JXaW5kb3dEZXN0cm95KFNiV2luZG93IHdpbmRvdykgewotICByZXR1cm4gc3RhcmJvYXJkOjpzaGFyZWQ6OnV3cDo6QXBwbGljYXRpb25Vd3A6OkdldCgpLT5EZXN0cm95V2luZG93KHdpbmRvdyk7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC91d3Avd2luZG93X2dldF9wbGF0Zm9ybV9oYW5kbGUuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC91d3Avd2luZG93X2dldF9wbGF0Zm9ybV9oYW5kbGUuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNzgwYmQuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL3dpbmRvd19nZXRfcGxhdGZvcm1faGFuZGxlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvdXdwL3dpbmRvd19pbnRlcm5hbC5oIgotI2luY2x1ZGUgInN0YXJib2FyZC93aW5kb3cuaCIKLQotdm9pZCogU2JXaW5kb3dHZXRQbGF0Zm9ybUhhbmRsZShTYldpbmRvdyB3aW5kb3cpIHsKLSAgaWYgKCFTYldpbmRvd0lzVmFsaWQod2luZG93KSkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8RUdMTmF0aXZlV2luZG93VHlwZT4od2luZG93LT5lZ2xfbmF0aXZlX3dpbmRvdygpKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC93aW5kb3dfZ2V0X3NpemUuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC91d3Avd2luZG93X2dldF9zaXplLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MThhNTM4Li4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC93aW5kb3dfZ2V0X3NpemUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3dpbmRvdy5oIgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvdXdwL3dpbmRvd19pbnRlcm5hbC5oIgotCi1ib29sIFNiV2luZG93R2V0U2l6ZShTYldpbmRvdyB3aW5kb3csIFNiV2luZG93U2l6ZSogc2l6ZSkgewotICBpZiAoIVNiV2luZG93SXNWYWxpZCh3aW5kb3cpKSB7Ci0gICAgU0JfRExPRyhFUlJPUikgPDwgX19GVU5DVElPTl9fIDw8ICI6IEludmFsaWQgd2luZG93LiI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgc2l6ZS0+d2lkdGggPSB3aW5kb3ctPndpZHRoOwotICBzaXplLT5oZWlnaHQgPSB3aW5kb3ctPmhlaWdodDsKLSAgLy8gVGhlIHZpZGVvIHJlc29sdXRpb24gaXMgdGhlIHNhbWUgYXMgdGhlIGdyYXBoaWNzIHJlc29sdXRpb24uCi0gIHNpemUtPnZpZGVvX3BpeGVsX3JhdGlvID0gMS4wZjsKLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC91d3Avd2luZG93X2ludGVybmFsLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL3dpbmRvd19pbnRlcm5hbC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEyM2M1OS4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC91d3Avd2luZG93X2ludGVybmFsLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3V3cC9hcHBsaWNhdGlvbl91d3AuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3V3cC93aW5kb3dfaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9hbmdsZS9pbmNsdWRlL2FuZ2xlX3dpbmRvd3NzdG9yZS5oIgotCi11c2luZyBXaW5kb3dzOjpVSTo6Q29yZTo6Q29yZVdpbmRvdzsKLQotU2JXaW5kb3dQcml2YXRlOjpTYldpbmRvd1ByaXZhdGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQotICAgIDogd2lkdGgod2lkdGgpLAotICAgICAgaGVpZ2h0KGhlaWdodCkgewotICBhbmdsZV9wcm9wZXJ0eV9zZXQgPSByZWYgbmV3IFdpbmRvd3M6OkZvdW5kYXRpb246OkNvbGxlY3Rpb25zOjpQcm9wZXJ0eVNldCgpOwotICBhbmdsZV9wcm9wZXJ0eV9zZXQtPkluc2VydCgKLSAgICAgIHJlZiBuZXcgUGxhdGZvcm06OlN0cmluZyhFR0xOYXRpdmVXaW5kb3dUeXBlUHJvcGVydHkpLAotICAgICAgc3RhcmJvYXJkOjpzaGFyZWQ6OnV3cDo6QXBwbGljYXRpb25Vd3A6OkdldCgpLT5HZXRDb3JlV2luZG93KCkuR2V0KCkpOwotICBhbmdsZV9wcm9wZXJ0eV9zZXQtPkluc2VydCgKLSAgICAgIHJlZiBuZXcgUGxhdGZvcm06OlN0cmluZyhFR0xSZW5kZXJTdXJmYWNlU2l6ZVByb3BlcnR5KSwKLSAgICAgIFdpbmRvd3M6OkZvdW5kYXRpb246OlByb3BlcnR5VmFsdWU6OkNyZWF0ZVNpemUoCi0gICAgICAgICAgV2luZG93czo6Rm91bmRhdGlvbjo6U2l6ZSh3aWR0aCwgaGVpZ2h0KSkpOwotfQotCi1TYldpbmRvd1ByaXZhdGU6On5TYldpbmRvd1ByaXZhdGUoKSB7fQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL3dpbmRvd19pbnRlcm5hbC5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL3dpbmRvd19pbnRlcm5hbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWNiYWRiLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC93aW5kb3dfaW50ZXJuYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpZm5kZWYgU1RBUkJPQVJEX1NIQVJFRF9VV1BfV0lORE9XX0lOVEVSTkFMX0hfCi0jZGVmaW5lIFNUQVJCT0FSRF9TSEFSRURfVVdQX1dJTkRPV19JTlRFUk5BTF9IXwotCi0jaW5jbHVkZSA8RUdML2VnbC5oPgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2F0b21pYy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC90aW1lLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3dpbmRvdy5oIgotCi1zdHJ1Y3QgU2JXaW5kb3dQcml2YXRlIHsKLSAgU2JXaW5kb3dQcml2YXRlKGludCB3aWR0aCwgaW50IGhlaWdodCk7Ci0gIH5TYldpbmRvd1ByaXZhdGUoKTsKLQotICBFR0xOYXRpdmVXaW5kb3dUeXBlIGVnbF9uYXRpdmVfd2luZG93KCkgY29uc3QgewotICAgIHJldHVybiByZWludGVycHJldF9jYXN0PEVHTE5hdGl2ZVdpbmRvd1R5cGU+KGFuZ2xlX3Byb3BlcnR5X3NldCk7Ci0gIH0KLQotICAvLyBUaGUgd2lkdGggb2YgdGhpcyB3aW5kb3cuCi0gIGludCB3aWR0aDsKLQotICAvLyBUaGUgaGVpZ2h0IG9mIHRoaXMgd2luZG93LgotICBpbnQgaGVpZ2h0OwotCi0gcHJpdmF0ZToKLSAgV2luZG93czo6Rm91bmRhdGlvbjo6Q29sbGVjdGlvbnM6OlByb3BlcnR5U2V0XiBhbmdsZV9wcm9wZXJ0eV9zZXQ7Ci19OwotCi0jZW5kaWYgIC8vIFNUQVJCT0FSRF9TSEFSRURfVVdQX1dJTkRPV19JTlRFUk5BTF9IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL3dpbmRvd19zZXRfZGVmYXVsdF9vcHRpb25zLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvdXdwL3dpbmRvd19zZXRfZGVmYXVsdF9vcHRpb25zLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGI1NTAwLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3V3cC93aW5kb3dfc2V0X2RlZmF1bHRfb3B0aW9ucy5jYworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3dpbmRvdy5oIgotCi12b2lkIFNiV2luZG93U2V0RGVmYXVsdE9wdGlvbnMoU2JXaW5kb3dPcHRpb25zKiBvcHRpb25zKSB7Ci0gIFNiTWVtb3J5U2V0KG9wdGlvbnMsIDAsIHNpemVvZigqb3B0aW9ucykpOwotICBvcHRpb25zLT5zaXplLndpZHRoID0gMTkyMDsKLSAgb3B0aW9ucy0+c2l6ZS5oZWlnaHQgPSAxMDgwOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2F5bGFuZC9hcHBsaWNhdGlvbl93YXlsYW5kLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2F5bGFuZC9hcHBsaWNhdGlvbl93YXlsYW5kLmNjCmluZGV4IDUxYjkzZTIuLjBkYTc4ZjkgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dheWxhbmQvYXBwbGljYXRpb25fd2F5bGFuZC5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93YXlsYW5kL2FwcGxpY2F0aW9uX3dheWxhbmQuY2MKQEAgLTEsNCArMSw0IEBACi0vLyBDb3B5cmlnaHQgMjAxNiBTYW1zdW5nIEVsZWN0cm9uaWNzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8gQ29weXJpZ2h0IDIwMTggU2Ftc3VuZyBFbGVjdHJvbmljcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIC8vCiAvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIC8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE2LDggKzE2LDggQEAKIAogI2luY2x1ZGUgPEVHTC9lZ2wuaD4KICNpbmNsdWRlIDxwb2xsLmg+Ci0jaW5jbHVkZSA8c3lzL2V2ZW50ZmQuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvZXZlbnRmZC5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiAjaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgpAQCAtNDUsMTIgKzQ1LDEwIEBACiAKIHZvaWQgR2xvYmFsT2JqZWN0UmVtb3ZlKHZvaWQqLCBzdHJ1Y3Qgd2xfcmVnaXN0cnkqLCB1aW50MzJfdCkge30KIAotc3RhdGljIHN0cnVjdCB3bF9yZWdpc3RyeV9saXN0ZW5lciByZWdpc3RyeV9saXN0ZW5lciA9IHsKLSAgICAmR2xvYmFsT2JqZWN0QXZhaWxhYmxlLAotICAgICZHbG9iYWxPYmplY3RSZW1vdmUKLX07CitzdGF0aWMgc3RydWN0IHdsX3JlZ2lzdHJ5X2xpc3RlbmVyIHJlZ2lzdHJ5X2xpc3RlbmVyID0geyZHbG9iYWxPYmplY3RBdmFpbGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZHbG9iYWxPYmplY3RSZW1vdmV9OwogCi19Cit9ICAvLyBuYW1lc3BhY2UKIAogLy8gVGl6ZW4gYXBwbGljYXRpb24gZW5naW5lIHVzaW5nIHRoZSBnZW5lcmljIHF1ZXVlIGFuZCBhIHRpemVuIGltcGxlbWVudGF0aW9uLgogQXBwbGljYXRpb25XYXlsYW5kOjpBcHBsaWNhdGlvbldheWxhbmQoZmxvYXQgdmlkZW9fcGl4ZWxfcmF0aW8pCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93YXlsYW5kL2Rldl9pbnB1dC5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dheWxhbmQvZGV2X2lucHV0LmNjCmluZGV4IDlkZjlmN2MuLjdiOGQ3MTggMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dheWxhbmQvZGV2X2lucHV0LmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dheWxhbmQvZGV2X2lucHV0LmNjCkBAIC00MDMsMTQgKzQwMywxMSBAQAogfQogCiBjb25zdCBzdHJ1Y3Qgd2xfa2V5Ym9hcmRfbGlzdGVuZXIga2V5Ym9hcmRfbGlzdGVuZXIgPSB7Ci0gICAgJktleWJvYXJkSGFuZGxlS2V5TWFwLAotICAgICZLZXlib2FyZEhhbmRsZUVudGVyLAotICAgICZLZXlib2FyZEhhbmRsZUxlYXZlLAotICAgICZLZXlib2FyZEhhbmRsZUtleSwKLSAgICAmS2V5Ym9hcmRIYW5kbGVNb2RpZmllcnMsCisgICAgJktleWJvYXJkSGFuZGxlS2V5TWFwLCAmS2V5Ym9hcmRIYW5kbGVFbnRlciwgICAgICZLZXlib2FyZEhhbmRsZUxlYXZlLAorICAgICZLZXlib2FyZEhhbmRsZUtleSwgICAgJktleWJvYXJkSGFuZGxlTW9kaWZpZXJzLAogfTsKIAotfQorfSAgLy8gbmFtZXNwYWNlCiAKIERldklucHV0OjpEZXZJbnB1dCgpCiAgICAgOiB3bF9zZWF0XyhOVUxMKSwKQEAgLTQ5Nyw5ICs0OTQsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qga2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdGF0ZSkgewotICBib29sIHJlcGVhdGFibGUgPSAoa2V5ID09IEtFWV9MRUZUIHx8IGtleSA9PSBLRVlfUklHSFQgfHwga2V5ID09IEtFWV9VUCB8fCBrZXkgPT0gS0VZX0RPV04pOwotICBTQl9ETE9HKElORk8pIDw8ICJbS2V5XSBLZXkgOiIgPDwga2V5IDw8ICIsIHN0YXRlOiIgPDwgc3RhdGUgPDwgIiByZXBlYXRhYmxlICIgPDwgcmVwZWF0YWJsZQotICAgICAgICAgICAgICAgIDw8ICIga2V5X3JlcGVhdF9rZXlfICIgPDwga2V5X3JlcGVhdF9rZXlfIDw8ICIga2V5X3JlcGVhdF9zdGF0ZV8gIiA8PCBrZXlfcmVwZWF0X3N0YXRlXzsKKyAgYm9vbCByZXBlYXRhYmxlID0KKyAgICAgIChrZXkgPT0gS0VZX0xFRlQgfHwga2V5ID09IEtFWV9SSUdIVCB8fCBrZXkgPT0gS0VZX1VQIHx8IGtleSA9PSBLRVlfRE9XTik7CisgIFNCX0RMT0coSU5GTykgPDwgIltLZXldIEtleSA6IiA8PCBrZXkgPDwgIiwgc3RhdGU6IiA8PCBzdGF0ZSA8PCAiIHJlcGVhdGFibGUgIgorICAgICAgICAgICAgICAgIDw8IHJlcGVhdGFibGUgPDwgIiBrZXlfcmVwZWF0X2tleV8gIiA8PCBrZXlfcmVwZWF0X2tleV8KKyAgICAgICAgICAgICAgICA8PCAiIGtleV9yZXBlYXRfc3RhdGVfICIgPDwga2V5X3JlcGVhdF9zdGF0ZV87CiAgIGlmIChzdGF0ZSAmJiByZXBlYXRhYmxlICYmIGtleSA9PSBrZXlfcmVwZWF0X2tleV8gJiYga2V5X3JlcGVhdF9zdGF0ZV8pCiAgICAgcmV0dXJuOwogCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93YXlsYW5kL2VnbF93b3JrYXJvdW5kLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2F5bGFuZC9lZ2xfd29ya2Fyb3VuZC5jYwppbmRleCAyNGJkMDk3Li45NDYzZDcyIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93YXlsYW5kL2VnbF93b3JrYXJvdW5kLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dheWxhbmQvZWdsX3dvcmthcm91bmQuY2MKQEAgLTEyLDE0ICsxMiwxNSBAQAogLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL2Rpc3BsYXkuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93YXlsYW5kL25hdGl2ZV9kaXNwbGF5X3R5cGUuaCIKIAogZXh0ZXJuICJDIiBFR0xEaXNwbGF5IF9fcmVhbF9lZ2xHZXREaXNwbGF5KEVHTE5hdGl2ZURpc3BsYXlUeXBlIG5hdGl2ZV9kaXNwbGF5KTsKIGV4dGVybiAiQyIgRUdMRGlzcGxheSBfX3dyYXBfZWdsR2V0RGlzcGxheShFR0xOYXRpdmVEaXNwbGF5VHlwZSBuYXRpdmVfZGlzcGxheSk7CiAKLWV4dGVybiAiQyIgRUdMRGlzcGxheSBfX3dyYXBfZWdsR2V0RGlzcGxheShFR0xOYXRpdmVEaXNwbGF5VHlwZSBuYXRpdmVfZGlzcGxheSkgeworZXh0ZXJuICJDIiBFR0xEaXNwbGF5IF9fd3JhcF9lZ2xHZXREaXNwbGF5KAorICAgIEVHTE5hdGl2ZURpc3BsYXlUeXBlIG5hdGl2ZV9kaXNwbGF5KSB7CiAgIFNCX0xPRyhJTkZPKSA8PCAiIF9fd3JhcF9lZ2xHZXREaXNwbGF5ICI7CiAgIHJldHVybiBfX3JlYWxfZWdsR2V0RGlzcGxheSgoRUdMTmF0aXZlRGlzcGxheVR5cGUpV2F5bGFuZE5hdGl2ZURpc3BsYXlUeXBlKCkpOwogfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2F5bGFuZC9uYXRpdmVfZGlzcGxheV90eXBlLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2F5bGFuZC9uYXRpdmVfZGlzcGxheV90eXBlLmNjCmluZGV4IDAzZTExOGMuLjBhYjU1MzggMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dheWxhbmQvbmF0aXZlX2Rpc3BsYXlfdHlwZS5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93YXlsYW5kL25hdGl2ZV9kaXNwbGF5X3R5cGUuY2MKQEAgLTE3LDkgKzE3LDkgQEAKICNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93YXlsYW5kL2FwcGxpY2F0aW9uX3dheWxhbmQuaCIKIAotTmF0aXZlRGlzcGxheVR5cGUgV2F5bGFuZE5hdGl2ZURpc3BsYXlUeXBlKCkKLXsKLSAgd2xfZGlzcGxheSogZGlzcGxheSA9IHN0YXJib2FyZDo6c2hhcmVkOjp3YXlsYW5kOjpBcHBsaWNhdGlvbldheWxhbmQ6OkdldCgpLT5HZXRXTERpc3BsYXkoKTsKK05hdGl2ZURpc3BsYXlUeXBlIFdheWxhbmROYXRpdmVEaXNwbGF5VHlwZSgpIHsKKyAgd2xfZGlzcGxheSogZGlzcGxheSA9CisgICAgICBzdGFyYm9hcmQ6OnNoYXJlZDo6d2F5bGFuZDo6QXBwbGljYXRpb25XYXlsYW5kOjpHZXQoKS0+R2V0V0xEaXNwbGF5KCk7CiAgIFNCX0xPRyhJTkZPKSA8PCAiIFNiTmF0aXZlRGlzcGxheVR5cGUoKSAiIDw8IGRpc3BsYXk7CiAgIHJldHVybiAoTmF0aXZlRGlzcGxheVR5cGUpZGlzcGxheTsKIH0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dheWxhbmQvbmF0aXZlX2Rpc3BsYXlfdHlwZS5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2F5bGFuZC9uYXRpdmVfZGlzcGxheV90eXBlLmgKaW5kZXggNGVlZjA4Yy4uYjRjMTE2ZCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2F5bGFuZC9uYXRpdmVfZGlzcGxheV90eXBlLmgKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2F5bGFuZC9uYXRpdmVfZGlzcGxheV90eXBlLmgKQEAgLTI0LDQgKzI0LDQgQEAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmCi0jZW5kaWYgLy9TVEFSQk9BUkRfU0hBUkVEX1dBWUxBTkRfTkFUSVZFX0RJU1BMQVlfVFlQRV9IXworI2VuZGlmICAvLyBTVEFSQk9BUkRfU0hBUkVEX1dBWUxBTkRfTkFUSVZFX0RJU1BMQVlfVFlQRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2F5bGFuZC93aW5kb3dfaW50ZXJuYWwuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93YXlsYW5kL3dpbmRvd19pbnRlcm5hbC5jYwppbmRleCBiY2U3YmM3Li42ZjMyM2M0IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93YXlsYW5kL3dpbmRvd19pbnRlcm5hbC5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93YXlsYW5kL3dpbmRvd19pbnRlcm5hbC5jYwpAQCAtMSw0ICsxLDQgQEAKLS8vIENvcHlyaWdodCAyMDE2IFNhbXN1bmcgRWxlY3Ryb25pY3MuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLyBDb3B5cmlnaHQgMjAxOCBTYW1zdW5nIEVsZWN0cm9uaWNzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogLy8KIC8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtNDYsMTIgKzQ2LDggQEAKIHZvaWQgU2hlbGxTdXJmYWNlUG9wdXBEb25lKHZvaWQqLCBzdHJ1Y3Qgd2xfc2hlbGxfc3VyZmFjZSopIHt9CiAKIHN0cnVjdCB3bF9zaGVsbF9zdXJmYWNlX2xpc3RlbmVyIHNoZWxsX3N1cmZhY2VfbGlzdGVuZXIgPSB7Ci0gICAgJlNoZWxsU3VyZmFjZVBpbmcsCi0gICAgJlNoZWxsU3VyZmFjZUNvbmZpZ3VyZSwKLSAgICAmU2hlbGxTdXJmYWNlUG9wdXBEb25lCi19OwotCi19CisgICAgJlNoZWxsU3VyZmFjZVBpbmcsICZTaGVsbFN1cmZhY2VDb25maWd1cmUsICZTaGVsbFN1cmZhY2VQb3B1cERvbmV9OworfSAgLy8gbmFtZXNwYWNlCiAKIFNiV2luZG93UHJpdmF0ZTo6U2JXaW5kb3dQcml2YXRlKHdsX2NvbXBvc2l0b3IqIGNvbXBvc2l0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3bF9zaGVsbCogc2hlbGwsCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9fX2luaXRfXy5weSBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL19faW5pdF9fLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL19faW5pdF9fLnB5CisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2FkYXB0ZXJfdXRpbHMuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9hZGFwdGVyX3V0aWxzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTAyMzE0Li4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2FkYXB0ZXJfdXRpbHMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9hZGFwdGVyX3V0aWxzLmgiCi0KLSNpbmNsdWRlIDx3aW5zb2NrMi5oPgotCi0jaW5jbHVkZSA8aXBobHBhcGkuaD4KLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF9pbnRlcm5hbC5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zb2NrZXQuaCIKLQotbmFtZXNwYWNlIHsKLWNvbnN0IFVMT05HIGtEZWZhdWx0QWRhcHRlckluZm9CdWZmZXJTaXplSW5CeXRlcyA9IDE2ICogMTAyNDsKLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2Ugc3RhcmJvYXJkIHsKLW5hbWVzcGFjZSBzaGFyZWQgewotbmFtZXNwYWNlIHdpbjMyIHsKLQotYm9vbCBHZXRBZGFwdGVycyhjb25zdCBTYlNvY2tldEFkZHJlc3NUeXBlIGFkZHJlc3NfdHlwZSwKLSAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGNoYXJbXT4qIGFkYXB0ZXJfaW5mbykgewotICBTQl9EQ0hFQ0soYWRhcHRlcl9pbmZvKTsKLQotICBVTE9ORyBmYW1pbHkgPSAwOwotICBpbnQgYWRkcmVzc19sZW5ndGhfYnl0ZXMgPSAwOwotCi0gIHN3aXRjaCAoYWRkcmVzc190eXBlKSB7Ci0gICAgY2FzZSBrU2JTb2NrZXRBZGRyZXNzVHlwZUlwdjQ6Ci0gICAgICBmYW1pbHkgPSBBRl9JTkVUOwotICAgICAgYWRkcmVzc19sZW5ndGhfYnl0ZXMgPSBrQWRkcmVzc0xlbmd0aElwdjQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGtTYlNvY2tldEFkZHJlc3NUeXBlSXB2NjoKLSAgICAgIGZhbWlseSA9IEFGX0lORVQ2OwotICAgICAgYWRkcmVzc19sZW5ndGhfYnl0ZXMgPSBrQWRkcmVzc0xlbmd0aElwdjY7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgU0JfTk9UUkVBQ0hFRCgpIDw8ICJJbnZhbGlkIGFkZHJlc3MgdHlwZTogIiA8PCBhZGRyZXNzX3R5cGU7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBVTE9ORyBhZGFwdGVyX2FkZHJlc3Nlc19udW1iZXJfYnl0ZXMgPSBrRGVmYXVsdEFkYXB0ZXJJbmZvQnVmZmVyU2l6ZUluQnl0ZXM7Ci0KLSAgZm9yIChpbnQgdHJ5X2NvdW50ID0gMDsgdHJ5X2NvdW50ICE9IDI7ICsrdHJ5X2NvdW50KSB7Ci0gICAgLy8gVXNpbmcgYXV0byBmb3IgcmV0dXJuIHZhbHVlIGhlcmUsIHNpbmNlIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB3aW5kb3dzIHVzZQotICAgIC8vIHNsaWdodGx5IGRpZmZlcmVudCBkYXRhdHlwZXMuICBUaGVzZSBkaWZmZXJlbmNlcyBkbyBub3QgbWF0dGVyIHRvIHVzLCBidXQKLSAgICAvLyB0aGUgY29tcGlsZXIgbWlnaHQgd2FybiBvbiB0aGVtLgotICAgIGFkYXB0ZXJfaW5mby0+cmVzZXQobmV3IGNoYXJbYWRhcHRlcl9hZGRyZXNzZXNfbnVtYmVyX2J5dGVzXSk7Ci0gICAgUElQX0FEQVBURVJfQUREUkVTU0VTIGFkYXB0ZXJfYWRkcmVzc2VzID0KLSAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQSVBfQURBUFRFUl9BRERSRVNTRVM+KGFkYXB0ZXJfaW5mby0+Z2V0KCkpOwotCi0gICAgLy8gTm90ZTogSWYgfEdldEFkYXB0ZXJBZGRyZXNzZXN8IGRlZW1zIHRoYXQgYnVmZmVyIHN1cHBsaWVkIGlzIG5vdCBlbm91Z2gsCi0gICAgLy8gaXQgd2lsbCByZXR1cm4gdGhlIHJlY29tbWVuZGVkIG51bWJlciBvZiBieXRlcyBpbgotICAgIC8vIHxhZGFwdGVyX2FkZHJlc3Nlc19udW1iZXJfYnl0ZXN8LgotICAgIGF1dG8gcmV0dmFsID0gR2V0QWRhcHRlcnNBZGRyZXNzZXMoCi0gICAgICAgIGZhbWlseSwgR0FBX0ZMQUdfU0tJUF9GUklFTkRMWV9OQU1FIHwgR0FBX0ZMQUdfU0tJUF9ETlNfU0VSVkVSLCBudWxscHRyLAotICAgICAgICBhZGFwdGVyX2FkZHJlc3NlcywgJmFkYXB0ZXJfYWRkcmVzc2VzX251bWJlcl9ieXRlcyk7Ci0KLSAgICBpZiAocmV0dmFsID09IEVSUk9SX1NVQ0NFU1MpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBpZiAocmV0dmFsICE9IEVSUk9SX0JVRkZFUl9PVkVSRkxPVykgewotICAgICAgLy8gT25seSByZXRyeSB3aXRoIG1vcmUgbWVtb3J5IGlmIHRoZSBlcnJvciBzYXlzIHNvLgotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIFNCX0xPRyhFUlJPUikgPDwgIkdldEFkYXB0ZXJBZGRyZXNzZXMoKSBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICIgPDwgcmV0dmFsOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHdpbjMyCi19ICAvLyBuYW1lc3BhY2Ugc2hhcmVkCi19ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9hZGFwdGVyX3V0aWxzLmggYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9hZGFwdGVyX3V0aWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZTExZmEuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvYWRhcHRlcl91dGlscy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBTVEFSQk9BUkRfU0hBUkVEX1dJTjMyX0FEQVBURVJfVVRJTFNfSF8KLSNkZWZpbmUgU1RBUkJPQVJEX1NIQVJFRF9XSU4zMl9BREFQVEVSX1VUSUxTX0hfCi0KLSNpbmNsdWRlIDx3aW5zb2NrMi5oPgotCi0jaW5jbHVkZSA8aWZkZWYuaD4KLSNpbmNsdWRlIDxpcGhscGFwaS5oPgotCi0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NvY2tldC5oIgotCi1uYW1lc3BhY2Ugc3RhcmJvYXJkIHsKLW5hbWVzcGFjZSBzaGFyZWQgewotbmFtZXNwYWNlIHdpbjMyIHsKLQotLy8gUmV0dXJucyBhbGwgb2YgdGhlIHJlc3VsdHMgZm9yIHdpMzIncwotYm9vbCBHZXRBZGFwdGVycyhjb25zdCBTYlNvY2tldEFkZHJlc3NUeXBlIGFkZHJlc3NfdHlwZSwKLSAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGNoYXJbXT4qIGFkYXB0ZXJfaW5mbyk7Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZiBhIElQX0FEQVBURVJfQUREUkVTU0VTIElmVHlwZSBpcyBhCi0vLyBub24tbG9vcGJhY2sgRXRoZXJuZXQgaW50ZXJmYWNlLgotaW5saW5lIGJvb2wgSXNJZlR5cGVFdGhlcm5ldChEV09SRCBpZnR5cGUpIHsKLSAgc3dpdGNoIChpZnR5cGUpIHsKLSAgICBjYXNlIElGX1RZUEVfRVRIRVJORVRfQ1NNQUNEOgotICAgIGNhc2UgSUZfVFlQRV9JRUVFODAyMTE6Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBjYXNlIElGX1RZUEVfU09GVFdBUkVfTE9PUEJBQ0s6Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2Ugd2luMzIKLX0gIC8vIG5hbWVzcGFjZSBzaGFyZWQKLX0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKLQotI2VuZGlmICAvLyBTVEFSQk9BUkRfU0hBUkVEX1dJTjMyX0FEQVBURVJfVVRJTFNfSF8KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2FwcGxpY2F0aW9uX3dpbjMyLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvYXBwbGljYXRpb25fd2luMzIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5Y2RiYzYuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvYXBwbGljYXRpb25fd2luMzIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMzUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvYXBwbGljYXRpb25fd2luMzIuaCIKLQotI2luY2x1ZGUgPHdpbmRvd3MuaD4gIC8vIE5PTElOVChidWlsZC9pbmNsdWRlX29yZGVyKQotI2luY2x1ZGUgPHdpbmRvd3N4Lmg+ICAvLyBOT0xJTlQoYnVpbGQvaW5jbHVkZV9vcmRlcikKLQotI2luY2x1ZGUgPGNzdGRpbz4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJzdGFyYm9hcmQvaW5wdXQuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQva2V5LmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvYXBwbGljYXRpb24uaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2RpYWxvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvZXJyb3JfdXRpbHMuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9wcml2YXRlLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi93Y2hhcl91dGlscy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvd2luZG93X2ludGVybmFsLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3N5c3RlbS5oIgotCi11c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6c3RhcmJvYXJkOjpBcHBsaWNhdGlvbjsKLXVzaW5nIHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6QXBwbGljYXRpb25XaW4zMjsKLXVzaW5nIHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6Q1N0cmluZ1RvV1N0cmluZzsKLXVzaW5nIHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6RGVidWdMb2dXaW5FcnJvcjsKLQotbmFtZXNwYWNlIHsKLQotc3RhdGljIGNvbnN0IGludCBrU2JNb3VzZURldmljZUlkID0gMTsKLQotc3RhdGljIGNvbnN0IFRDSEFSIGtXaW5kb3dDbGFzc05hbWVbXSA9IEwid2luZG93X2NsYXNzX25hbWUiOwotCi1MUkVTVUxUIENBTExCQUNLIFduZFByb2MoSFdORCBoV25kLCBVSU5UIG1zZywgV1BBUkFNIHdfcGFyYW0sIExQQVJBTSBsX3BhcmFtKSB7Ci0gIHJldHVybiBBcHBsaWNhdGlvbldpbjMyOjpHZXQoKS0+V2luZG93UHJvY2VzcyhoV25kLCBtc2csIHdfcGFyYW0sIGxfcGFyYW0pOwotfQotCi1ib29sIFJlZ2lzdGVyV2luZG93Q2xhc3MoKSB7Ci0gIFdORENMQVNTRVggd2luZG93X2NsYXNzOwotICB3aW5kb3dfY2xhc3MuY2JTaXplID0gc2l6ZW9mKFdORENMQVNTRVgpOwotICAvLyBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L3dpbmRvd3MvZGVza3RvcC9mZjcyOTE3Nih2PXZzLjg1KS5hc3B4Ci0gIHdpbmRvd19jbGFzcy5zdHlsZSA9IENTX0hSRURSQVcgfCBDU19WUkVEUkFXIHwgQ1NfT1dOREM7Ci0gIHdpbmRvd19jbGFzcy5scGZuV25kUHJvYyA9IFduZFByb2M7Ci0gIHdpbmRvd19jbGFzcy5jYkNsc0V4dHJhID0gMDsKLSAgd2luZG93X2NsYXNzLmNiV25kRXh0cmEgPSAwOwotICB3aW5kb3dfY2xhc3MuaEluc3RhbmNlID0gR2V0TW9kdWxlSGFuZGxlKG51bGxwdHIpOwotICAvLyBUT0RPOiBBZGQgWW91VHViZSBpY29uLgotICB3aW5kb3dfY2xhc3MuaEljb24gPSBMb2FkSWNvbih3aW5kb3dfY2xhc3MuaEluc3RhbmNlLCBJRElfQVBQTElDQVRJT04pOwotICB3aW5kb3dfY2xhc3MuaEljb25TbSA9IExvYWRJY29uKHdpbmRvd19jbGFzcy5oSW5zdGFuY2UsIElESV9BUFBMSUNBVElPTik7Ci0gIHdpbmRvd19jbGFzcy5oQ3Vyc29yID0gTG9hZEN1cnNvcihOVUxMLCBJRENfQVJST1cpOwotICB3aW5kb3dfY2xhc3MuaGJyQmFja2dyb3VuZCA9IChIQlJVU0gpKENPTE9SX1dJTkRPVyArIDEpOwotICB3aW5kb3dfY2xhc3MubHBzek1lbnVOYW1lID0gTlVMTDsKLSAgd2luZG93X2NsYXNzLmxwc3pDbGFzc05hbWUgPSBrV2luZG93Q2xhc3NOYW1lOwotCi0gIGlmICghOjpSZWdpc3RlckNsYXNzRXgoJndpbmRvd19jbGFzcykpIHsKLSAgICBTQl9MT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gcmVnaXN0ZXIgd2luZG93IjsKLSAgICBEZWJ1Z0xvZ1dpbkVycm9yKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vLyBDcmVhdGUgYSBXaW5kb3dzIHdpbmRvdy4KLUhXTkQgQ3JlYXRlV2luZG93SW5zdGFuY2UoY29uc3QgU2JXaW5kb3dPcHRpb25zJiBvcHRpb25zKSB7Ci0gIERXT1JEIGR3U3R5bGUgPSBXU19PVkVSTEFQUEVEIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUgfCBXU19DTElQU0lCTElOR1MgfAotICAgICAgICAgICAgICAgICAgV1NfQ0xJUENISUxEUkVOIHwgV1NfTUlOSU1JWkVCT1ggfCBXU19NQVhJTUlaRUJPWDsKLSAgaWYgKG9wdGlvbnMud2luZG93ZWQpIHsKLSAgICBkd1N0eWxlIHw9IFdTX01BWElNSVpFOwotICB9Ci0gIGNvbnN0IHN0ZDo6d3N0cmluZyB3aWRlX3dpbmRvd19uYW1lID0gQ1N0cmluZ1RvV1N0cmluZyhvcHRpb25zLm5hbWUpOwotICBjb25zdCBIV05EIHdpbmRvdyA9IENyZWF0ZVdpbmRvdygKLSAgICAgIGtXaW5kb3dDbGFzc05hbWUsIHdpZGVfd2luZG93X25hbWUuY19zdHIoKSwgZHdTdHlsZSwgQ1dfVVNFREVGQVVMVCwKLSAgICAgIENXX1VTRURFRkFVTFQsIG9wdGlvbnMuc2l6ZS53aWR0aCwgb3B0aW9ucy5zaXplLmhlaWdodCwgbnVsbHB0ciwgbnVsbHB0ciwKLSAgICAgIEdldE1vZHVsZUhhbmRsZShudWxscHRyKSwgbnVsbHB0cik7Ci0gIFNldEZvcmVncm91bmRXaW5kb3cod2luZG93KTsKLSAgaWYgKHdpbmRvdyA9PSBudWxscHRyKSB7Ci0gICAgU0JfTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSB3aW5kb3cuIjsKLSAgICBEZWJ1Z0xvZ1dpbkVycm9yKCk7Ci0gIH0KLQotICByZXR1cm4gd2luZG93OwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotLy8gTm90ZSB0aGF0IHRoaXMgaXMgYSAic3RydWN0IiBhbmQgbm90IGEgImNsYXNzIiBiZWNhdXNlCi0vLyB0aGF0J3MgaG93IGl0J3MgZGVmaW5lZCBpbiBzdGFyYm9hcmQvc3lzdGVtLmgKLXN0cnVjdCBTYlN5c3RlbVBsYXRmb3JtRXJyb3JQcml2YXRlIHsKLSAgU2JTeXN0ZW1QbGF0Zm9ybUVycm9yUHJpdmF0ZShjb25zdCBTYlN5c3RlbVBsYXRmb3JtRXJyb3JQcml2YXRlJikgPSBkZWxldGU7Ci0gIFNiU3lzdGVtUGxhdGZvcm1FcnJvclByaXZhdGUmIG9wZXJhdG9yPShjb25zdCBTYlN5c3RlbVBsYXRmb3JtRXJyb3JQcml2YXRlJikgPQotICAgICAgZGVsZXRlOwotCi0gIFNiU3lzdGVtUGxhdGZvcm1FcnJvclByaXZhdGUoU2JTeXN0ZW1QbGF0Zm9ybUVycm9yVHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiU3lzdGVtUGxhdGZvcm1FcnJvckNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXJfZGF0YSkKLSAgICAgIDogY2FsbGJhY2tfKGNhbGxiYWNrKSwgdXNlcl9kYXRhXyh1c2VyX2RhdGEpIHsKLSAgICBpZiAodHlwZSAhPSBrU2JTeXN0ZW1QbGF0Zm9ybUVycm9yVHlwZUNvbm5lY3Rpb25FcnJvcikKLSAgICAgIFNCX05PVFJFQUNIRUQoKTsKLQotICAgIEFwcGxpY2F0aW9uV2luMzIqIGFwcCA9IEFwcGxpY2F0aW9uV2luMzI6OkdldCgpOwotICAgIGNvbnN0IGJvb2wgY3JlYXRlZF9kaWFsb2cgPSBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OlNob3dPa0NhbmNlbERpYWxvZygKLSAgICAgICAgYXBwLT5HZXRDb3JlV2luZG93KCktPkdldFdpbmRvd0hhbmRsZSgpLAotICAgICAgICAiIiwgIC8vIE5vIHRpdGxlLgotICAgICAgICBhcHAtPkdldExvY2FsaXplZFN0cmluZygiVU5BQkxFX1RPX0NPTlRBQ1RfWU9VVFVCRV8xIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNvcnJ5LCBjb3VsZCBub3QgY29ubmVjdCB0byBZb3VUdWJlLiIpLAotICAgICAgICBhcHAtPkdldExvY2FsaXplZFN0cmluZygiUkVUUllfQlVUVE9OIiwgIlJldHJ5IiksCi0gICAgICAgIFt0aGlzLCBjYWxsYmFjaywgdXNlcl9kYXRhXSgpIHsKLSAgICAgICAgICBjYWxsYmFjayhrU2JTeXN0ZW1QbGF0Zm9ybUVycm9yUmVzcG9uc2VQb3NpdGl2ZSwgdXNlcl9kYXRhKTsKLSAgICAgICAgfSwKLSAgICAgICAgYXBwLT5HZXRMb2NhbGl6ZWRTdHJpbmcoIkVYSVRfQlVUVE9OIiwgIkV4aXQiKSwKLSAgICAgICAgW3RoaXMsIGNhbGxiYWNrLCB1c2VyX2RhdGFdKCkgewotICAgICAgICAgIGNhbGxiYWNrKGtTYlN5c3RlbVBsYXRmb3JtRXJyb3JSZXNwb25zZU5lZ2F0aXZlLCB1c2VyX2RhdGEpOwotICAgICAgICB9KTsKLSAgICBTQl9EQ0hFQ0soIWNyZWF0ZWRfZGlhbG9nKTsKLSAgICBpZiAoIWNyZWF0ZWRfZGlhbG9nKSB7Ci0gICAgICBTQl9MT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIGRpYWxvZyEiOwotICAgIH0KLSAgfQotCi0gIHZvaWQgQ2xlYXIoKSB7IHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6Q2FuY2VsRGlhbG9nKCk7IH0KLQotIHByaXZhdGU6Ci0gIFNiU3lzdGVtUGxhdGZvcm1FcnJvckNhbGxiYWNrIGNhbGxiYWNrXzsKLSAgdm9pZCogdXNlcl9kYXRhXzsKLX07Ci0KLW5hbWVzcGFjZSBzdGFyYm9hcmQgewotbmFtZXNwYWNlIHNoYXJlZCB7Ci1uYW1lc3BhY2Ugd2luMzIgewotCi1BcHBsaWNhdGlvbldpbjMyOjpBcHBsaWNhdGlvbldpbjMyKCkKLSAgICA6IGxvY2FsaXplZF9zdHJpbmdzXyhTYlN5c3RlbUdldExvY2FsZUlkKCkpIHt9Ci1BcHBsaWNhdGlvbldpbjMyOjp+QXBwbGljYXRpb25XaW4zMigpIHt9Ci0KLVNiV2luZG93IEFwcGxpY2F0aW9uV2luMzI6OkNyZWF0ZVdpbmRvd0ZvcldpbjMyKAotICAgIGNvbnN0IFNiV2luZG93T3B0aW9ucyogb3B0aW9ucykgewotICBpZiAoU2JXaW5kb3dJc1ZhbGlkKHdpbmRvd18uZ2V0KCkpKSB7Ci0gICAgU0JfTE9HKFdBUk5JTkcpIDw8ICJSZXR1cm5pbmcgZXhpc3Rpbmcgd2luZG93IGluc3RhbmNlLiI7Ci0gICAgcmV0dXJuIHdpbmRvd18uZ2V0KCk7Ci0gIH0KLQotICBSZWdpc3RlcldpbmRvd0NsYXNzKCk7Ci0gIEhXTkQgd2luZG93OwotICBpZiAob3B0aW9ucykgewotICAgIHdpbmRvdyA9IENyZWF0ZVdpbmRvd0luc3RhbmNlKCpvcHRpb25zKTsKLSAgICB3aW5kb3dfLnJlc2V0KG5ldyBTYldpbmRvd1ByaXZhdGUob3B0aW9ucywgd2luZG93KSk7Ci0gIH0gZWxzZSB7Ci0gICAgU2JXaW5kb3dPcHRpb25zIGRlZmF1bHRfb3B0aW9uczsKLSAgICBTYldpbmRvd1NldERlZmF1bHRPcHRpb25zKCZkZWZhdWx0X29wdGlvbnMpOwotICAgIHdpbmRvdyA9IENyZWF0ZVdpbmRvd0luc3RhbmNlKGRlZmF1bHRfb3B0aW9ucyk7Ci0gICAgd2luZG93Xy5yZXNldChuZXcgU2JXaW5kb3dQcml2YXRlKCZkZWZhdWx0X29wdGlvbnMsIHdpbmRvdykpOwotICB9Ci0gIFNob3dXaW5kb3cod2luZG93LCBTV19TSE9XKTsKLSAgVXBkYXRlV2luZG93KHdpbmRvdyk7Ci0gIHJldHVybiB3aW5kb3dfLmdldCgpOwotfQotCi1ib29sIEFwcGxpY2F0aW9uV2luMzI6OkRlc3Ryb3lXaW5kb3coU2JXaW5kb3cgd2luZG93KSB7Ci0gIGlmICghU2JXaW5kb3dJc1ZhbGlkKHdpbmRvdykgfHwgd2luZG93ICE9IHdpbmRvd18uZ2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgd2luZG93Xy5yZXNldCgpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotU2JTeXN0ZW1QbGF0Zm9ybUVycm9yIEFwcGxpY2F0aW9uV2luMzI6Ok9uU2JTeXN0ZW1SYWlzZVBsYXRmb3JtRXJyb3IoCi0gICAgU2JTeXN0ZW1QbGF0Zm9ybUVycm9yVHlwZSB0eXBlLAotICAgIFNiU3lzdGVtUGxhdGZvcm1FcnJvckNhbGxiYWNrIGNhbGxiYWNrLAotICAgIHZvaWQqIHVzZXJfZGF0YSkgewotICByZXR1cm4gbmV3IFNiU3lzdGVtUGxhdGZvcm1FcnJvclByaXZhdGUodHlwZSwgY2FsbGJhY2ssIHVzZXJfZGF0YSk7Ci19Ci0KLXZvaWQgQXBwbGljYXRpb25XaW4zMjo6T25TYlN5c3RlbUNsZWFyUGxhdGZvcm1FcnJvcigKLSAgICBTYlN5c3RlbVBsYXRmb3JtRXJyb3IgaGFuZGxlKSB7Ci0gIGlmIChoYW5kbGUgPT0ga1NiU3lzdGVtUGxhdGZvcm1FcnJvckludmFsaWQpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgc3RhdGljX2Nhc3Q8U2JTeXN0ZW1QbGF0Zm9ybUVycm9yUHJpdmF0ZSo+KGhhbmRsZSktPkNsZWFyKCk7Ci0gIC8vIFRPRE86IERldGVybWluZSBpZiB0aGlzIHNob3VsZCBhY3R1YWxseSBiZSBkZWxldGVkIGFuZCBpZiBzbywgZGVsZXRlIG9yCi0gIC8vIGRvbid0IGNvbnNpc3RlbnRseSBhY3Jvc3MgcGxhdGZvcm1zLgotICBkZWxldGUgaGFuZGxlOwotfQotCi1BcHBsaWNhdGlvbjo6RXZlbnQqIEFwcGxpY2F0aW9uV2luMzI6OldhaXRGb3JTeXN0ZW1FdmVudFdpdGhUaW1lb3V0KAotICAgIFNiVGltZSB0aW1lKSB7Ci0gIFByb2Nlc3NOZXh0U3lzdGVtTWVzc2FnZSgpOwotICBpZiAocGVuZGluZ19ldmVudF8pIHsKLSAgICBFdmVudCogb3V0ID0gcGVuZGluZ19ldmVudF87Ci0gICAgcGVuZGluZ19ldmVudF8gPSBudWxscHRyOwotICAgIHJldHVybiBvdXQ7Ci0gIH0KLQotICBTY29wZWRMb2NrIGxvY2soc3RvcF93YWl0aW5nX2Zvcl9zeXN0ZW1fZXZlbnRzX211dGV4Xyk7Ci0gIGlmICh0aW1lIDw9IFNiVGltZUdldE1vbm90b25pY05vdygpIHx8IHN0b3Bfd2FpdGluZ19mb3Jfc3lzdGVtX2V2ZW50c18pIHsKLSAgICBzdG9wX3dhaXRpbmdfZm9yX3N5c3RlbV9ldmVudHNfID0gZmFsc2U7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLQotICByZXR1cm4gV2FpdEZvclN5c3RlbUV2ZW50V2l0aFRpbWVvdXQodGltZSk7Ci19Ci0KLUxSRVNVTFQgQXBwbGljYXRpb25XaW4zMjo6V2luZG93UHJvY2VzcyhIV05EIGhXbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBtc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1BBUkFNIHdfcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBBUkFNIGxfcGFyYW0pIHsKLSAgc3dpdGNoIChtc2cpIHsKLSAgICAvLyBJbnB1dCBtZXNzYWdlIGhhbmRsaW5nLgotICAgIGNhc2UgV01fTUJVVFRPTkRPV046Ci0gICAgY2FzZSBXTV9MQlVUVE9ORE9XTjoKLSAgICBjYXNlIFdNX1JCVVRUT05ET1dOOgotICAgIGNhc2UgV01fTUJVVFRPTlVQOgotICAgIGNhc2UgV01fTEJVVFRPTlVQOgotICAgIGNhc2UgV01fUkJVVFRPTlVQOgotICAgIGNhc2UgV01fTU9VU0VNT1ZFOgotICAgIGNhc2UgV01fTU9VU0VXSEVFTDoKLSAgICAgIHBlbmRpbmdfZXZlbnRfID0KLSAgICAgICAgICBQcm9jZXNzV2luTW91c2VFdmVudChHZXRDb3JlV2luZG93KCksIG1zZywgd19wYXJhbSwgbF9wYXJhbSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFdNX0tFWURPV046Ci0gICAgY2FzZSBXTV9TWVNLRVlET1dOOgotICAgIGNhc2UgV01fS0VZVVA6Ci0gICAgY2FzZSBXTV9TWVNLRVlVUDoKLSAgICAgIHBlbmRpbmdfZXZlbnRfID0KLSAgICAgICAgICBQcm9jZXNzV2luS2V5RXZlbnQoR2V0Q29yZVdpbmRvdygpLCBtc2csIHdfcGFyYW0sIGxfcGFyYW0pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBXTV9ERVNUUk9ZOgotICAgICAgU0JfTE9HKElORk8pIDw8ICJSZWNlaXZlZCBkZXN0cm95IG1lc3NhZ2U7IHBvc3RpbmcgUXVpdCBtZXNzYWdlIjsKLSAgICAgIC8vIFBhdXNlIGFuZCBzdXNwZW5kIHRoZSBhcHBsaWNhdGlvbiBmaXJzdCBzbyB3ZSBjYW4gZG8gc29tZSBjbGVhbnVwCi0gICAgICAvLyBiZWZvcmUgdGhlIHdpbmRvdyBpcyBkZXN0cm95ZWQgKGUuZy4gc3RvcHBpbmcgcmFzdGVyaXphdGlvbikuCi0gICAgICBEaXNwYXRjaEFuZERlbGV0ZShuZXcgRXZlbnQoa1NiRXZlbnRUeXBlUGF1c2UsIE5VTEwsIE5VTEwpKTsKLSAgICAgIERpc3BhdGNoQW5kRGVsZXRlKG5ldyBFdmVudChrU2JFdmVudFR5cGVTdXNwZW5kLCBOVUxMLCBOVUxMKSk7Ci0gICAgICBQb3N0UXVpdE1lc3NhZ2UoMCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIERlZldpbmRvd1Byb2NXKGhXbmQsIG1zZywgd19wYXJhbSwgbF9wYXJhbSk7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLWludCBBcHBsaWNhdGlvbldpbjMyOjpSdW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7Ci0gIGludCByZXR1cm5fdmFsID0gQXBwbGljYXRpb246OlJ1bihhcmdjLCBhcmd2KTsKLSAgcmV0dXJuIHJldHVybl92YWw7Ci19Ci0KLXZvaWQgQXBwbGljYXRpb25XaW4zMjo6UHJvY2Vzc05leHRTeXN0ZW1NZXNzYWdlKCkgewotICBNU0cgbXNnOwotICBCT09MIHBlZWtfbWVzc2FnZV9yZXR1cm4gPSBQZWVrTWVzc2FnZSgmbXNnLCBOVUxMLCAwLCAwLCBQTV9SRU1PVkUpOwotICBpZiAocGVla19tZXNzYWdlX3JldHVybiA9PSAwKSB7ICAvLyAwIGluZGljYXRlcyBubyBtZXNzYWdlcyBhdmFpbGFibGUuCi0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKCFEaWFsb2dIYW5kbGVNZXNzYWdlKCZtc2cpKSB7Ci0gICAgVHJhbnNsYXRlTWVzc2FnZSgmbXNnKTsKLSAgICBEaXNwYXRjaE1lc3NhZ2UoJm1zZyk7Ci0gIH0KLSAgaWYgKG1zZy5tZXNzYWdlID09IFdNX1FVSVQpIHsKLSAgICBTQl9MT0coSU5GTykgPDwgIlJlY2VpdmVkIFF1aXQgbWVzc2FnZTsgc3RvcHBpbmcgYXBwbGljYXRpb24iOwotICAgIFNiU3lzdGVtUmVxdWVzdFN0b3AobXNnLndQYXJhbSk7Ci0gIH0KLX0KLQotQXBwbGljYXRpb246OkV2ZW50KiBBcHBsaWNhdGlvbldpbjMyOjpQcm9jZXNzV2luTW91c2VFdmVudChTYldpbmRvdyB3aW5kb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUEFSQU0gd19wYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBBUkFNIGxfcGFyYW0pIHsKLSAgU2JJbnB1dERhdGEqIGRhdGEgPSBuZXcgU2JJbnB1dERhdGEoKTsKLSAgU2JNZW1vcnlTZXQoZGF0YSwgMCwgc2l6ZW9mKCpkYXRhKSk7Ci0KLSAgZGF0YS0+d2luZG93ID0gd2luZG93OwotICBkYXRhLT5kZXZpY2VfdHlwZSA9IGtTYklucHV0RGV2aWNlVHlwZU1vdXNlOwotICBkYXRhLT5kZXZpY2VfaWQgPSBrU2JNb3VzZURldmljZUlkOwotICBzd2l0Y2ggKG1zZykgewotICAgIGNhc2UgV01fTEJVVFRPTkRPV046Ci0gICAgICBkYXRhLT5rZXkgPSBrU2JLZXlNb3VzZTE7Ci0gICAgICBkYXRhLT50eXBlID0ga1NiSW5wdXRFdmVudFR5cGVQcmVzczsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgV01fUkJVVFRPTkRPV046Ci0gICAgICBkYXRhLT5rZXkgPSBrU2JLZXlNb3VzZTI7Ci0gICAgICBkYXRhLT50eXBlID0ga1NiSW5wdXRFdmVudFR5cGVQcmVzczsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgV01fTUJVVFRPTkRPV046Ci0gICAgICBkYXRhLT5rZXkgPSBrU2JLZXlNb3VzZTM7Ci0gICAgICBkYXRhLT50eXBlID0ga1NiSW5wdXRFdmVudFR5cGVQcmVzczsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgV01fTEJVVFRPTlVQOgotICAgICAgZGF0YS0+a2V5ID0ga1NiS2V5TW91c2UxOwotICAgICAgZGF0YS0+dHlwZSA9IGtTYklucHV0RXZlbnRUeXBlVW5wcmVzczsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgV01fUkJVVFRPTlVQOgotICAgICAgZGF0YS0+a2V5ID0ga1NiS2V5TW91c2UyOwotICAgICAgZGF0YS0+dHlwZSA9IGtTYklucHV0RXZlbnRUeXBlVW5wcmVzczsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgV01fTUJVVFRPTlVQOgotICAgICAgZGF0YS0+a2V5ID0ga1NiS2V5TW91c2UzOwotICAgICAgZGF0YS0+dHlwZSA9IGtTYklucHV0RXZlbnRUeXBlVW5wcmVzczsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgV01fTU9VU0VNT1ZFOgotICAgICAgZGF0YS0+dHlwZSA9IGtTYklucHV0RXZlbnRUeXBlTW92ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgV01fTU9VU0VXSEVFTDogewotICAgICAgZGF0YS0+dHlwZSA9IGtTYklucHV0RXZlbnRUeXBlV2hlZWw7Ci0gICAgICBpbnQgd2hlZWxfZGVsdGEgPSBHRVRfV0hFRUxfREVMVEFfV1BBUkFNKHdfcGFyYW0pOwotICAgICAgLy8gUGVyIE1TRlQsIHN0YW5kYXJkIG1vdXNlIHdoZWVsIGluY3JlbWVudHMgYXJlIG11bHRpcGxlcyBvZiAxMjAuIEZvcgotICAgICAgLy8gc21vb3RoIHNjcm9sbGluZywgdGhpcyBtYXkgYmUgbGVzcy4KLSAgICAgIC8vIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvd2luZG93cy9kZXNrdG9wL21zNjQ1NjE3KHY9dnMuODUpLmFzcHgKLSAgICAgIGRhdGEtPmRlbHRhLnkgPSB3aGVlbF9kZWx0YSAvIDEyMC4wZjsKLSAgICB9IGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBTQl9MT0coV0FSTklORykgPDwgIlJlY2VpdmVkIHVucmVjb2duaXplZCBNU0cgY29kZSAiIDw8IG1zZzsKLSAgICAgIHJldHVybiBudWxscHRyOwotICB9Ci0KLSAgZGF0YS0+cHJlc3N1cmUgPSBOQU47Ci0gIGRhdGEtPnNpemUgPSB7TkFOLCBOQU59OwotICBkYXRhLT50aWx0ID0ge05BTiwgTkFOfTsKLSAgZGF0YS0+cG9zaXRpb24ueCA9IEdFVF9YX0xQQVJBTShsX3BhcmFtKTsKLSAgZGF0YS0+cG9zaXRpb24ueSA9IEdFVF9ZX0xQQVJBTShsX3BhcmFtKTsKLQotICByZXR1cm4gbmV3IEFwcGxpY2F0aW9uOjpFdmVudChrU2JFdmVudFR5cGVJbnB1dCwgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFwcGxpY2F0aW9uOjpEZWxldGVEZXN0cnVjdG9yPFNiSW5wdXREYXRhPik7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB3aW4zMgotfSAgLy8gbmFtZXNwYWNlIHNoYXJlZAotfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvYXBwbGljYXRpb25fd2luMzIuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2FwcGxpY2F0aW9uX3dpbjMyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNDNhOTUuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvYXBwbGljYXRpb25fd2luMzIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaWZuZGVmIFNUQVJCT0FSRF9TSEFSRURfV0lOMzJfQVBQTElDQVRJT05fV0lOMzJfSF8KLSNkZWZpbmUgU1RBUkJPQVJEX1NIQVJFRF9XSU4zMl9BUFBMSUNBVElPTl9XSU4zMl9IXwotCi0vLyBXaW5kb3dzIGhlYWRlcnMuCi0jaW5jbHVkZSA8d2luZG93cy5oPgotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL211dGV4LmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvYXBwbGljYXRpb24uaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9sb2NhbGl6ZWRfc3RyaW5ncy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3F1ZXVlX2FwcGxpY2F0aW9uLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi93aW5kb3dfaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc3lzdGVtLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3dpbmRvdy5oIgotCi1uYW1lc3BhY2Ugc3RhcmJvYXJkIHsKLW5hbWVzcGFjZSBzaGFyZWQgewotbmFtZXNwYWNlIHdpbjMyIHsKLQotY2xhc3MgQXBwbGljYXRpb25XaW4zMiA6IHB1YmxpYyBzdGFyYm9hcmQ6OlF1ZXVlQXBwbGljYXRpb24gewotIHB1YmxpYzoKLSAgQXBwbGljYXRpb25XaW4zMigpOwotICB+QXBwbGljYXRpb25XaW4zMigpIG92ZXJyaWRlOwotCi0gIHN0YXRpYyBBcHBsaWNhdGlvbldpbjMyKiBHZXQoKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PEFwcGxpY2F0aW9uV2luMzIqPigKLSAgICAgICAgOjpzdGFyYm9hcmQ6OnNoYXJlZDo6c3RhcmJvYXJkOjpBcHBsaWNhdGlvbjo6R2V0KCkpOwotICB9Ci0KLSAgU2JXaW5kb3cgQ3JlYXRlV2luZG93Rm9yV2luMzIoY29uc3QgU2JXaW5kb3dPcHRpb25zKiBvcHRpb25zKTsKLQotICBib29sIERlc3Ryb3lXaW5kb3coU2JXaW5kb3cgd2luZG93KTsKLQotICB2b2lkIERpc3BhdGNoU3RhcnQoKSB7IHN0YXJib2FyZDo6QXBwbGljYXRpb246OkRpc3BhdGNoU3RhcnQoKTsgfQotCi0gIFNiV2luZG93IEdldENvcmVXaW5kb3coKSB7Ci0gICAgcmV0dXJuIFNiV2luZG93SXNWYWxpZCh3aW5kb3dfLmdldCgpKSA/IHdpbmRvd18uZ2V0KCkgOiBrU2JXaW5kb3dJbnZhbGlkOwotICB9Ci0KLSAgU2JTeXN0ZW1QbGF0Zm9ybUVycm9yIE9uU2JTeXN0ZW1SYWlzZVBsYXRmb3JtRXJyb3IoCi0gICAgICBTYlN5c3RlbVBsYXRmb3JtRXJyb3JUeXBlIHR5cGUsCi0gICAgICBTYlN5c3RlbVBsYXRmb3JtRXJyb3JDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgIHZvaWQqIHVzZXJfZGF0YSk7Ci0KLSAgdm9pZCBPblNiU3lzdGVtQ2xlYXJQbGF0Zm9ybUVycm9yKFNiU3lzdGVtUGxhdGZvcm1FcnJvciBoYW5kbGUpOwotCi0gIHN0ZDo6c3RyaW5nIEdldExvY2FsaXplZFN0cmluZyhjb25zdCBjaGFyKiBpZCwgY29uc3QgY2hhciogZmFsbGJhY2spIGNvbnN0IHsKLSAgICByZXR1cm4gbG9jYWxpemVkX3N0cmluZ3NfLkdldFN0cmluZyhpZCwgZmFsbGJhY2spOwotICB9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIGl0IGlzIHZhbGlkIHRvIHBvbGwvcXVlcnkgZm9yIHN5c3RlbSBldmVudHMuCi0gIGJvb2wgTWF5SGF2ZVN5c3RlbUV2ZW50cygpIG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KLQotICAvLyBXYWl0cyBmb3IgYW4gZXZlbnQgdW50aWwgdGhlIHRpbWVvdXQgfHRpbWV8IHJ1bnMgb3V0LiAgSWYgYW4gZXZlbnQgb2NjdXJzCi0gIC8vIGluIHRoaXMgdGltZSwgaXQgaXMgcmV0dXJuZWQsIG90aGVyd2lzZSBOVUxMIGlzIHJldHVybmVkLiBJZiB8dGltZXwgaXMgemVybwotICAvLyBvciBuZWdhdGl2ZSwgdGhlbiB0aGlzIHNob3VsZCBmdW5jdGlvbiBlZmZlY3RpdmVseSBsaWtlIGEgbm8td2FpdCBwb2xsLgotICBFdmVudCogV2FpdEZvclN5c3RlbUV2ZW50V2l0aFRpbWVvdXQoU2JUaW1lIHRpbWUpIG92ZXJyaWRlOwotCi0gIC8vIFdha2VzIHVwIGFueSB0aHJlYWQgd2FpdGluZyB3aXRoaW4gYSBjYWxsIHRvCi0gIC8vIFdhaXRGb3JTeXN0ZW1FdmVudFdpdGhUaW1lb3V0KCkuCi0gIHZvaWQgV2FrZVN5c3RlbUV2ZW50V2FpdCgpIG92ZXJyaWRlIHsKLSAgICBTY29wZWRMb2NrIGxvY2soc3RvcF93YWl0aW5nX2Zvcl9zeXN0ZW1fZXZlbnRzX211dGV4Xyk7Ci0gICAgc3RvcF93YWl0aW5nX2Zvcl9zeXN0ZW1fZXZlbnRzXyA9IHRydWU7Ci0gIH0KLQotICBMUkVTVUxUIFdpbmRvd1Byb2Nlc3MoSFdORCBoV25kLCBVSU5UIG1zZywgV1BBUkFNIHdfcGFyYW0sIExQQVJBTSBsX3BhcmFtKTsKLSAgVk9JRCBUaW1lZEV2ZW50Q2FsbGJhY2soUFZPSUQgbHAsIEJPT0xFQU4gdGltZXJfb3Jfd2FpdF9maXJlZCk7Ci0KLSAgLy8gTm9uLXZpcnR1YWwgb3ZlcnJpZGUuIENhbGxzIGludG8gc3VwZXIgY2xhc3MgUnVuKCkuCi0gIGludCBSdW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KTsKLQotIHByaXZhdGU6Ci0gIC8vIC0tLSBBcHBsaWNhdGlvbiBvdmVycmlkZXMgLS0tCi0gIGJvb2wgSXNTdGFydEltbWVkaWF0ZSgpIG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KLSAgdm9pZCBJbml0aWFsaXplKCkgb3ZlcnJpZGUge30KLSAgdm9pZCBUZWFyZG93bigpIG92ZXJyaWRlIHt9Ci0KLSAgdm9pZCBQcm9jZXNzTmV4dFN5c3RlbU1lc3NhZ2UoKTsKLSAgU2JUaW1lTW9ub3RvbmljIEdldE5leHRUaW1lZEV2ZW50VGFyZ2V0VGltZSgpIG92ZXJyaWRlIHsKLSAgICByZXR1cm4gU2JUaW1lR2V0TW9ub3RvbmljTm93KCk7Ci0gIH0KLQotICAvLyBQcm9jZXNzZXMgd2luZG93IGtleSBldmVudHMsIHJldHVybmluZyBhIGNvcnJlc3BvbmRpbmcgRXZlbnQgaW5zdGFuY2UuCi0gIC8vIFRoaXMgdHJhbnNmZXJzIG93bmVyc2hpcCBvZiB0aGUgcmV0dXJuZWQgRXZlbnQuCi0gIEV2ZW50KiBQcm9jZXNzV2luS2V5RXZlbnQoU2JXaW5kb3cgd2luZG93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdQQVJBTSB3X3BhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQVJBTSBsX3BhcmFtKTsKLQotICAvLyBQcm9jZXNzZXMgd2luZG93IG1vdXNlIGV2ZW50cywgcmV0dXJuaW5nIGEgY29ycmVzcG9uZGluZyBFdmVudCBpbnN0YW5jZS4KLSAgLy8gVGhpcyB0cmFuc2ZlcnMgb3duZXJzaGlwIG9mIHRoZSByZXR1cm5lZCBFdmVudC4gVGhlIEV2ZW50IG1heSBiZSBudWxscHRyLgotICBFdmVudCogUHJvY2Vzc1dpbk1vdXNlRXZlbnQoU2JXaW5kb3cgd2luZG93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBtc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUEFSQU0gd19wYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQVJBTSBsX3BhcmFtKTsKLQotICBFdmVudCogcGVuZGluZ19ldmVudF8gPSBudWxscHRyOwotCi0gIC8vIFRoZSBzaW5nbGUgb3BlbiB3aW5kb3csIGlmIGFueS4KLSAgc3RkOjp1bmlxdWVfcHRyPFNiV2luZG93UHJpdmF0ZT4gd2luZG93XzsKLQotICBzdGFyYm9hcmQ6OkxvY2FsaXplZFN0cmluZ3MgbG9jYWxpemVkX3N0cmluZ3NfOwotCi0gIE11dGV4IHN0b3Bfd2FpdGluZ19mb3Jfc3lzdGVtX2V2ZW50c19tdXRleF87Ci0gIGJvb2wgc3RvcF93YWl0aW5nX2Zvcl9zeXN0ZW1fZXZlbnRzXzsKLQotICAvLyBUaGUgY3VycmVudCBkZXByZXNzZWQgU2JLZXlNb2RpZmllcnMgLSBpZiB0aGVyZSBhcmUgYW55LgotICB1bnNpZ25lZCBpbnQgY3VycmVudF9rZXlfbW9kaWZpZXJzXyA9IDA7Ci19OwotCi19ICAvLyBuYW1lc3BhY2Ugd2luMzIKLX0gIC8vIG5hbWVzcGFjZSBzaGFyZWQKLX0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKLQotI2VuZGlmICAvLyBTVEFSQk9BUkRfU0hBUkVEX1dJTjMyX0FQUExJQ0FUSU9OX1dJTjMyX0hfCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9hcHBsaWNhdGlvbl93aW4zMl9rZXlfZXZlbnQuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9hcHBsaWNhdGlvbl93aW4zMl9rZXlfZXZlbnQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMDg4M2EuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvYXBwbGljYXRpb25fd2luMzJfa2V5X2V2ZW50LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2FwcGxpY2F0aW9uX3dpbjMyLmgiCi0KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLSNpbmNsdWRlICJzdGFyYm9hcmQvZXZlbnQuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvaW5wdXQuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQva2V5LmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvYXBwbGljYXRpb24uaCIKLQotdXNpbmcgc3RhcmJvYXJkOjpzaGFyZWQ6OnN0YXJib2FyZDo6QXBwbGljYXRpb247Ci0KLW5hbWVzcGFjZSB7Ci0KLWNvbnN0IGludCBrU2JLZXlib2FyZERldmljZUlkID0gMTsKLQotU2JLZXkgVmlydHVhbEtleUNvZGVUb1NiS2V5KFdQQVJBTSB2aXJ0dWFsX2tleV9jb2RlKSB7Ci0gIC8vIEtleWJvYXJkIGNvZGUgcmVmZXJlbmNlOgotICAvLyBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L3dpbmRvd3MvZGVza3RvcC9kZDM3NTczMSh2PXZzLjg1KS5hc3B4Ci0gIHN3aXRjaCAodmlydHVhbF9rZXlfY29kZSkgewotICAgIGNhc2UgVktfQ0FOQ0VMOiByZXR1cm4ga1NiS2V5Q2FuY2VsOwotICAgIGNhc2UgVktfQkFDSzogcmV0dXJuIGtTYktleUJhY2s7Ci0gICAgY2FzZSBWS19UQUI6IHJldHVybiBrU2JLZXlUYWI7Ci0gICAgY2FzZSBWS19DTEVBUjogcmV0dXJuIGtTYktleUNsZWFyOwotICAgIGNhc2UgVktfUkVUVVJOOiByZXR1cm4ga1NiS2V5UmV0dXJuOwotICAgIGNhc2UgVktfU0hJRlQ6IHJldHVybiBrU2JLZXlTaGlmdDsKLSAgICBjYXNlIFZLX0NPTlRST0w6IHJldHVybiBrU2JLZXlDb250cm9sOwotICAgIGNhc2UgVktfTUVOVTogcmV0dXJuIGtTYktleU1lbnU7Ci0gICAgY2FzZSBWS19QQVVTRTogcmV0dXJuIGtTYktleVBhdXNlOwotICAgIGNhc2UgVktfQ0FQSVRBTDogcmV0dXJuIGtTYktleUNhcGl0YWw7Ci0gICAgLy8gSGFuZ3VsIGFuZCBLYW5hIGhhdmUgdGhlIHNhbWUgVmlydHVhbEtleSBjb25zdGFudAotICAgIGNhc2UgVktfS0FOQTogcmV0dXJuIGtTYktleUthbmE7Ci0gICAgY2FzZSBWS19KVU5KQTogcmV0dXJuIGtTYktleUp1bmphOwotICAgIGNhc2UgVktfRklOQUw6IHJldHVybiBrU2JLZXlGaW5hbDsKLSAgICAvLyBIYW5qYSBhbmQgS2FuamkgaGF2ZSB0aGUgc2FtZSBWaXJ0dWFsS2V5IGNvbnN0YW50Ci0gICAgY2FzZSBWS19IQU5KQTogcmV0dXJuIGtTYktleUhhbmphOwotICAgIGNhc2UgVktfRVNDQVBFOiByZXR1cm4ga1NiS2V5RXNjYXBlOwotICAgIGNhc2UgVktfQ09OVkVSVDogcmV0dXJuIGtTYktleUNvbnZlcnQ7Ci0gICAgY2FzZSBWS19OT05DT05WRVJUOiByZXR1cm4ga1NiS2V5Tm9uY29udmVydDsKLSAgICBjYXNlIFZLX0FDQ0VQVDogcmV0dXJuIGtTYktleUFjY2VwdDsKLSAgICBjYXNlIFZLX01PREVDSEFOR0U6IHJldHVybiBrU2JLZXlNb2RlY2hhbmdlOwotICAgIGNhc2UgVktfU1BBQ0U6IHJldHVybiBrU2JLZXlTcGFjZTsKLSAgICBjYXNlIFZLX1BSSU9SOiByZXR1cm4ga1NiS2V5UHJpb3I7Ci0gICAgY2FzZSBWS19ORVhUOiByZXR1cm4ga1NiS2V5TmV4dDsKLSAgICBjYXNlIFZLX0VORDogcmV0dXJuIGtTYktleUVuZDsKLSAgICBjYXNlIFZLX0hPTUU6IHJldHVybiBrU2JLZXlIb21lOwotICAgIGNhc2UgVktfTEVGVDogcmV0dXJuIGtTYktleUxlZnQ7Ci0gICAgY2FzZSBWS19VUDogcmV0dXJuIGtTYktleVVwOwotICAgIGNhc2UgVktfUklHSFQ6IHJldHVybiBrU2JLZXlSaWdodDsKLSAgICBjYXNlIFZLX0RPV046IHJldHVybiBrU2JLZXlEb3duOwotICAgIGNhc2UgVktfU0VMRUNUOiByZXR1cm4ga1NiS2V5U2VsZWN0OwotICAgIGNhc2UgVktfUFJJTlQ6IHJldHVybiBrU2JLZXlQcmludDsKLSAgICBjYXNlIFZLX0VYRUNVVEU6IHJldHVybiBrU2JLZXlFeGVjdXRlOwotICAgIGNhc2UgVktfU05BUFNIT1Q6IHJldHVybiBrU2JLZXlTbmFwc2hvdDsKLSAgICBjYXNlIFZLX0lOU0VSVDogcmV0dXJuIGtTYktleUluc2VydDsKLSAgICBjYXNlIFZLX0RFTEVURTogcmV0dXJuIGtTYktleURlbGV0ZTsKLSAgICBjYXNlIFZLX09FTV9QRVJJT0Q6IHJldHVybiBrU2JLZXlPZW1QZXJpb2Q7Ci0gICAgY2FzZSAweDMwOiByZXR1cm4ga1NiS2V5MDsKLSAgICBjYXNlIDB4MzE6IHJldHVybiBrU2JLZXkxOwotICAgIGNhc2UgMHgzMjogcmV0dXJuIGtTYktleTI7Ci0gICAgY2FzZSAweDMzOiByZXR1cm4ga1NiS2V5MzsKLSAgICBjYXNlIDB4MzQ6IHJldHVybiBrU2JLZXk0OwotICAgIGNhc2UgMHgzNTogcmV0dXJuIGtTYktleTU7Ci0gICAgY2FzZSAweDM2OiByZXR1cm4ga1NiS2V5NjsKLSAgICBjYXNlIDB4Mzc6IHJldHVybiBrU2JLZXk3OwotICAgIGNhc2UgMHgzODogcmV0dXJuIGtTYktleTg7Ci0gICAgY2FzZSAweDM5OiByZXR1cm4ga1NiS2V5OTsKLSAgICBjYXNlIDB4NDE6IHJldHVybiBrU2JLZXlBOwotICAgIGNhc2UgMHg0MjogcmV0dXJuIGtTYktleUI7Ci0gICAgY2FzZSAweDQzOiByZXR1cm4ga1NiS2V5QzsKLSAgICBjYXNlIDB4NDQ6IHJldHVybiBrU2JLZXlEOwotICAgIGNhc2UgMHg0NTogcmV0dXJuIGtTYktleUU7Ci0gICAgY2FzZSAweDQ2OiByZXR1cm4ga1NiS2V5RjsKLSAgICBjYXNlIDB4NDc6IHJldHVybiBrU2JLZXlHOwotICAgIGNhc2UgMHg0ODogcmV0dXJuIGtTYktleUg7Ci0gICAgY2FzZSAweDQ5OiByZXR1cm4ga1NiS2V5STsKLSAgICBjYXNlIDB4NEE6IHJldHVybiBrU2JLZXlKOwotICAgIGNhc2UgMHg0QjogcmV0dXJuIGtTYktleUs7Ci0gICAgY2FzZSAweDRDOiByZXR1cm4ga1NiS2V5TDsKLSAgICBjYXNlIDB4NEQ6IHJldHVybiBrU2JLZXlNOwotICAgIGNhc2UgMHg0RTogcmV0dXJuIGtTYktleU47Ci0gICAgY2FzZSAweDRGOiByZXR1cm4ga1NiS2V5TzsKLSAgICBjYXNlIDB4NTA6IHJldHVybiBrU2JLZXlQOwotICAgIGNhc2UgMHg1MTogcmV0dXJuIGtTYktleVE7Ci0gICAgY2FzZSAweDUyOiByZXR1cm4ga1NiS2V5UjsKLSAgICBjYXNlIDB4NTM6IHJldHVybiBrU2JLZXlTOwotICAgIGNhc2UgMHg1NDogcmV0dXJuIGtTYktleVQ7Ci0gICAgY2FzZSAweDU1OiByZXR1cm4ga1NiS2V5VTsKLSAgICBjYXNlIDB4NTY6IHJldHVybiBrU2JLZXlWOwotICAgIGNhc2UgMHg1NzogcmV0dXJuIGtTYktleVc7Ci0gICAgY2FzZSAweDU4OiByZXR1cm4ga1NiS2V5WDsKLSAgICBjYXNlIDB4NTk6IHJldHVybiBrU2JLZXlZOwotICAgIGNhc2UgMHg1QTogcmV0dXJuIGtTYktleVo7Ci0gICAgY2FzZSBWS19MV0lOOiByZXR1cm4ga1NiS2V5THdpbjsKLSAgICBjYXNlIFZLX1JXSU46IHJldHVybiBrU2JLZXlSd2luOwotICAgIGNhc2UgVktfQVBQUzogcmV0dXJuIGtTYktleUFwcHM7Ci0gICAgY2FzZSBWS19TTEVFUDogcmV0dXJuIGtTYktleVNsZWVwOwotICAgIGNhc2UgVktfTlVNUEFEMDogcmV0dXJuIGtTYktleU51bXBhZDA7Ci0gICAgY2FzZSBWS19OVU1QQUQxOiByZXR1cm4ga1NiS2V5TnVtcGFkMTsKLSAgICBjYXNlIFZLX05VTVBBRDI6IHJldHVybiBrU2JLZXlOdW1wYWQyOwotICAgIGNhc2UgVktfTlVNUEFEMzogcmV0dXJuIGtTYktleU51bXBhZDM7Ci0gICAgY2FzZSBWS19OVU1QQUQ0OiByZXR1cm4ga1NiS2V5TnVtcGFkNDsKLSAgICBjYXNlIFZLX05VTVBBRDU6IHJldHVybiBrU2JLZXlOdW1wYWQ1OwotICAgIGNhc2UgVktfTlVNUEFENjogcmV0dXJuIGtTYktleU51bXBhZDY7Ci0gICAgY2FzZSBWS19OVU1QQUQ3OiByZXR1cm4ga1NiS2V5TnVtcGFkNzsKLSAgICBjYXNlIFZLX05VTVBBRDg6IHJldHVybiBrU2JLZXlOdW1wYWQ4OwotICAgIGNhc2UgVktfTlVNUEFEOTogcmV0dXJuIGtTYktleU51bXBhZDk7Ci0gICAgY2FzZSBWS19NVUxUSVBMWTogcmV0dXJuIGtTYktleU11bHRpcGx5OwotICAgIGNhc2UgVktfQUREOiByZXR1cm4ga1NiS2V5QWRkOwotICAgIGNhc2UgVktfU0VQQVJBVE9SOiByZXR1cm4ga1NiS2V5U2VwYXJhdG9yOwotICAgIGNhc2UgVktfU1VCVFJBQ1Q6IHJldHVybiBrU2JLZXlTdWJ0cmFjdDsKLSAgICBjYXNlIFZLX0RFQ0lNQUw6IHJldHVybiBrU2JLZXlEZWNpbWFsOwotICAgIGNhc2UgVktfRElWSURFOiByZXR1cm4ga1NiS2V5RGl2aWRlOwotICAgIGNhc2UgVktfRjE6IHJldHVybiBrU2JLZXlGMTsKLSAgICBjYXNlIFZLX0YyOiByZXR1cm4ga1NiS2V5RjI7Ci0gICAgY2FzZSBWS19GMzogcmV0dXJuIGtTYktleUYzOwotICAgIGNhc2UgVktfRjQ6IHJldHVybiBrU2JLZXlGNDsKLSAgICBjYXNlIFZLX0Y1OiByZXR1cm4ga1NiS2V5RjU7Ci0gICAgY2FzZSBWS19GNjogcmV0dXJuIGtTYktleUY2OwotICAgIGNhc2UgVktfRjc6IHJldHVybiBrU2JLZXlGNzsKLSAgICBjYXNlIFZLX0Y4OiByZXR1cm4ga1NiS2V5Rjg7Ci0gICAgY2FzZSBWS19GOTogcmV0dXJuIGtTYktleUY5OwotICAgIGNhc2UgVktfRjEwOiByZXR1cm4ga1NiS2V5RjEwOwotICAgIGNhc2UgVktfRjExOiByZXR1cm4ga1NiS2V5RjExOwotICAgIGNhc2UgVktfRjEyOiByZXR1cm4ga1NiS2V5RjEyOwotICAgIGNhc2UgVktfRjEzOiByZXR1cm4ga1NiS2V5RjEzOwotICAgIGNhc2UgVktfRjE0OiByZXR1cm4ga1NiS2V5RjE0OwotICAgIGNhc2UgVktfRjE1OiByZXR1cm4ga1NiS2V5RjE1OwotICAgIGNhc2UgVktfRjE2OiByZXR1cm4ga1NiS2V5RjE2OwotICAgIGNhc2UgVktfRjE3OiByZXR1cm4ga1NiS2V5RjE3OwotICAgIGNhc2UgVktfRjE4OiByZXR1cm4ga1NiS2V5RjE4OwotICAgIGNhc2UgVktfRjE5OiByZXR1cm4ga1NiS2V5RjE5OwotICAgIGNhc2UgVktfRjIwOiByZXR1cm4ga1NiS2V5RjIwOwotICAgIGNhc2UgVktfRjIxOiByZXR1cm4ga1NiS2V5RjIxOwotICAgIGNhc2UgVktfRjIyOiByZXR1cm4ga1NiS2V5RjIyOwotICAgIGNhc2UgVktfRjIzOiByZXR1cm4ga1NiS2V5RjIzOwotICAgIGNhc2UgVktfRjI0OiByZXR1cm4ga1NiS2V5RjI0OwotICAgIGNhc2UgVktfTlVNTE9DSzogcmV0dXJuIGtTYktleU51bWxvY2s7Ci0gICAgY2FzZSBWS19TQ1JPTEw6IHJldHVybiBrU2JLZXlTY3JvbGw7Ci0gICAgY2FzZSBWS19MU0hJRlQ6IHJldHVybiBrU2JLZXlMc2hpZnQ7Ci0gICAgY2FzZSBWS19SU0hJRlQ6IHJldHVybiBrU2JLZXlSc2hpZnQ7Ci0gICAgY2FzZSBWS19MQ09OVFJPTDogcmV0dXJuIGtTYktleUxjb250cm9sOwotICAgIGNhc2UgVktfUkNPTlRST0w6IHJldHVybiBrU2JLZXlSY29udHJvbDsKLSAgICBjYXNlIFZLX0xNRU5VOiByZXR1cm4ga1NiS2V5TG1lbnU7Ci0gICAgY2FzZSBWS19STUVOVTogcmV0dXJuIGtTYktleVJtZW51OwotICAgIGNhc2UgVktfQlJPV1NFUl9CQUNLOiByZXR1cm4ga1NiS2V5QnJvd3NlckJhY2s7Ci0gICAgY2FzZSBWS19CUk9XU0VSX0ZPUldBUkQ6IHJldHVybiBrU2JLZXlCcm93c2VyRm9yd2FyZDsKLSAgICBjYXNlIFZLX0JST1dTRVJfUkVGUkVTSDogcmV0dXJuIGtTYktleUJyb3dzZXJSZWZyZXNoOwotICAgIGNhc2UgVktfQlJPV1NFUl9TVE9QOiByZXR1cm4ga1NiS2V5QnJvd3NlclN0b3A7Ci0gICAgY2FzZSBWS19CUk9XU0VSX1NFQVJDSDogcmV0dXJuIGtTYktleUJyb3dzZXJTZWFyY2g7Ci0gICAgY2FzZSBWS19CUk9XU0VSX0ZBVk9SSVRFUzogcmV0dXJuIGtTYktleUJyb3dzZXJGYXZvcml0ZXM7Ci0gICAgY2FzZSBWS19CUk9XU0VSX0hPTUU6IHJldHVybiBrU2JLZXlCcm93c2VySG9tZTsKLSAgICBjYXNlIFZLX0xCVVRUT046IHJldHVybiBrU2JLZXlNb3VzZTE7Ci0gICAgY2FzZSBWS19SQlVUVE9OOiByZXR1cm4ga1NiS2V5TW91c2UyOwotICAgIGNhc2UgVktfTUJVVFRPTjogcmV0dXJuIGtTYktleU1vdXNlMzsKLSAgICBjYXNlIFZLX1hCVVRUT04xOiByZXR1cm4ga1NiS2V5TW91c2U0OwotICAgIGNhc2UgVktfWEJVVFRPTjI6IHJldHVybiBrU2JLZXlNb3VzZTU7Ci0gICAgZGVmYXVsdDoKLSAgICAgIFNCX0xPRyhXQVJOSU5HKSA8PCAiVW5yZWNvZ25pemVkIGtleSBoaXQuIjsKLSAgICAgIHJldHVybiBrU2JLZXlVbmtub3duOwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2Ugc3RhcmJvYXJkIHsKLW5hbWVzcGFjZSBzaGFyZWQgewotbmFtZXNwYWNlIHdpbjMyIHsKLQotLy8gVE9ETzogUGx1ZyBpbnRvIFhJbnB1dCBBUElzIGZvciBYYm94IGNvbnRyb2xsZXIgaW5wdXQ/Ci1BcHBsaWNhdGlvbjo6RXZlbnQqIEFwcGxpY2F0aW9uV2luMzI6OlByb2Nlc3NXaW5LZXlFdmVudChTYldpbmRvdyB3aW5kb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIG1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdQQVJBTSB3X3BhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBBUkFNIGxfcGFyYW0pIHsKLSAgU2JJbnB1dERhdGEqIGRhdGEgPSBuZXcgU2JJbnB1dERhdGEoKTsKLSAgU2JNZW1vcnlTZXQoZGF0YSwgMCwgc2l6ZW9mKCpkYXRhKSk7Ci0KLSAgZGF0YS0+d2luZG93ID0gd2luZG93OwotICBkYXRhLT5kZXZpY2VfdHlwZSA9IGtTYklucHV0RGV2aWNlVHlwZUtleWJvYXJkOwotICAvLyBUT0RPOiBEbyBzb21lIG1vcmUgaW50ZWxsaWdlbnQgaGFuZGxpbmcgbG9naWMgaGVyZSB0byBkZXRlcm1pbmUKLSAgLy8gYSB1bmlxdWUgZGV2aWNlIElELgotICBkYXRhLT5kZXZpY2VfaWQgPSBrU2JLZXlib2FyZERldmljZUlkOwotICBkYXRhLT5rZXkgPSBWaXJ0dWFsS2V5Q29kZVRvU2JLZXkod19wYXJhbSk7Ci0KLSAgY29uc3QgYm9vbCB3YXNfZG93biA9ICgobF9wYXJhbSAmICgxIDw8IDMwKSkgIT0gMCk7Ci0gIGNvbnN0IGJvb2wgdXAgPSBtc2cgIT0gV01fS0VZRE9XTiAmJiBtc2cgIT0gV01fU1lTS0VZRE9XTjsKLQotICBkYXRhLT50eXBlID0gdXAgPyBrU2JJbnB1dEV2ZW50VHlwZVVucHJlc3MgOiBrU2JJbnB1dEV2ZW50VHlwZVByZXNzOwotCi0gIFNiS2V5TW9kaWZpZXJzIGN1cnJlbnRfbW9kaWZpZXIgPSBrU2JLZXlNb2RpZmllcnNOb25lOwotICBpZiAoZGF0YS0+a2V5ID09IGtTYktleVNoaWZ0IHx8IGRhdGEtPmtleSA9PSBrU2JLZXlSc2hpZnQgfHwKLSAgICAgIGRhdGEtPmtleSA9PSBrU2JLZXlMc2hpZnQpIHsKLSAgICBjdXJyZW50X21vZGlmaWVyID0ga1NiS2V5TW9kaWZpZXJzU2hpZnQ7Ci0gIH0gZWxzZSBpZiAoZGF0YS0+a2V5ID09IGtTYktleU1lbnUgfHwgZGF0YS0+a2V5ID09IGtTYktleVJtZW51IHx8Ci0gICAgICAgICAgICAgZGF0YS0+a2V5ID09IGtTYktleUxtZW51KSB7Ci0gICAgY3VycmVudF9tb2RpZmllciA9IGtTYktleU1vZGlmaWVyc0FsdDsKLSAgfSBlbHNlIGlmIChkYXRhLT5rZXkgPT0ga1NiS2V5Q29udHJvbCB8fCBkYXRhLT5rZXkgPT0ga1NiS2V5UmNvbnRyb2wgfHwKLSAgICAgICAgICAgICBkYXRhLT5rZXkgPT0ga1NiS2V5TGNvbnRyb2wpIHsKLSAgICBjdXJyZW50X21vZGlmaWVyID0ga1NiS2V5TW9kaWZpZXJzQ3RybDsKLSAgfSBlbHNlIGlmIChkYXRhLT5rZXkgPT0ga1NiS2V5UndpbiB8fCBkYXRhLT5rZXkgPT0ga1NiS2V5THdpbikgewotICAgIGN1cnJlbnRfbW9kaWZpZXIgPSBrU2JLZXlNb2RpZmllcnNNZXRhOwotICB9Ci0KLSAgLy8gRWl0aGVyIGFkZCBvciByZW1vdmUgdGhlIGN1cnJlbnQgbW9kaWZpZXIga2V5IGJlaW5nIHByZXNzZWQgb3IgcmVsZWFzZWQuCi0gIC8vIFRoaXMgbm9vcHMgZm9yIGtTYktleU1vZGlmaWVyc05vbmUuCi0gIGlmICh1cCkgewotICAgIGN1cnJlbnRfa2V5X21vZGlmaWVyc18gJj0gfmN1cnJlbnRfbW9kaWZpZXI7Ci0gIH0gZWxzZSB7Ci0gICAgY3VycmVudF9rZXlfbW9kaWZpZXJzXyB8PSBjdXJyZW50X21vZGlmaWVyOwotICB9Ci0gIGRhdGEtPmtleV9tb2RpZmllcnMgPSBjdXJyZW50X2tleV9tb2RpZmllcnNfOwotCi0gIHN3aXRjaCAoZGF0YS0+a2V5KSB7Ci0gICAgY2FzZSBrU2JLZXlMc2hpZnQ6Ci0gICAgY2FzZSBrU2JLZXlMbWVudToKLSAgICBjYXNlIGtTYktleUxjb250cm9sOgotICAgIGNhc2Uga1NiS2V5THdpbjoKLSAgICAgIGRhdGEtPmtleV9sb2NhdGlvbiA9IGtTYktleUxvY2F0aW9uTGVmdDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Uga1NiS2V5UnNoaWZ0OgotICAgIGNhc2Uga1NiS2V5Um1lbnU6Ci0gICAgY2FzZSBrU2JLZXlSY29udHJvbDoKLSAgICBjYXNlIGtTYktleVJ3aW46Ci0gICAgICBkYXRhLT5rZXlfbG9jYXRpb24gPSBrU2JLZXlMb2NhdGlvblJpZ2h0OwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgcmV0dXJuIG5ldyBBcHBsaWNhdGlvbjo6RXZlbnQoa1NiRXZlbnRUeXBlSW5wdXQsIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBcHBsaWNhdGlvbjo6RGVsZXRlRGVzdHJ1Y3RvcjxTYklucHV0RGF0YT4pOwotfQotCi19ICAvLyBuYW1lc3BhY2Ugd2luMzIKLX0gIC8vIG5hbWVzcGFjZSBzaGFyZWQKLX0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2F0b21pY19wdWJsaWMuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2F0b21pY19wdWJsaWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYwODhiMy4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9hdG9taWNfcHVibGljLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBTVEFSQk9BUkRfU0hBUkVEX1dJTjMyX0FUT01JQ19QVUJMSUNfSF8KLSNkZWZpbmUgU1RBUkJPQVJEX1NIQVJFRF9XSU4zMl9BVE9NSUNfUFVCTElDX0hfCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvYXRvbWljLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLy8gRGVjbGFyYXRpb25zIGZvciBXaW5kb3dzIEludHJpbnNpYyBGdW5jdGlvbnMKLS8vIERlZmluZWQgaGVyZSB0byBhdm9pZCBpbmNsdWRpbmcgV2luZG93cyBoZWFkZXJzCi0vLyBTZWUgaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS93NTQwNWg5NS5hc3B4Ci0KLWxvbmcgX0ludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlKAotICBsb25nIHZvbGF0aWxlICogRGVzdGluYXRpb24sCi0gIGxvbmcgRXhjaGFuZ2UsCi0gIGxvbmcgQ29tcGFyYW5kCi0pOwotI3ByYWdtYSBpbnRyaW5zaWMoX0ludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlKQotCi1fX2ludDY0IF9JbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZTY0KAotICBfX2ludDY0IHZvbGF0aWxlICogRGVzdGluYXRpb24sCi0gIF9faW50NjQgRXhjaGFuZ2UsCi0gIF9faW50NjQgQ29tcGFyYW5kCi0pOwotI3ByYWdtYSBpbnRyaW5zaWMoX0ludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlNjQpCi0KLWxvbmcgX0ludGVybG9ja2VkRXhjaGFuZ2UoCi0gIGxvbmcgdm9sYXRpbGUgKiBUYXJnZXQsCi0gIGxvbmcgVmFsdWUKLSk7Ci0jcHJhZ21hIGludHJpbnNpYyhfSW50ZXJsb2NrZWRFeGNoYW5nZSkKLQotX19pbnQ2NCBfSW50ZXJsb2NrZWRFeGNoYW5nZTY0KAotICBfX2ludDY0IHZvbGF0aWxlICogVGFyZ2V0LAotICBfX2ludDY0IFZhbHVlCi0pOwotI3ByYWdtYSBpbnRyaW5zaWMoX0ludGVybG9ja2VkRXhjaGFuZ2U2NCkKLQotbG9uZyBfSW50ZXJsb2NrZWRFeGNoYW5nZUFkZCgKLSAgbG9uZyB2b2xhdGlsZSAqIEFkZGVuZCwKLSAgbG9uZyBWYWx1ZQotKTsKLSNwcmFnbWEgaW50cmluc2ljKF9JbnRlcmxvY2tlZEV4Y2hhbmdlQWRkKQotCi1fX2ludDY0IF9JbnRlcmxvY2tlZEV4Y2hhbmdlQWRkNjQoCi0gIF9faW50NjQgdm9sYXRpbGUgKiBBZGRlbmQsCi0gIF9faW50NjQgVmFsdWUKLSk7Ci0jcHJhZ21hIGludHJpbnNpYyhfSW50ZXJsb2NrZWRFeGNoYW5nZUFkZDY0KQotCi12b2lkIF9SZWFkV3JpdGVCYXJyaWVyKHZvaWQpOwotI3ByYWdtYSBpbnRyaW5zaWMoX1JlYWRXcml0ZUJhcnJpZXIpCi0KLVNCX0NfRk9SQ0VfSU5MSU5FIFNiQXRvbWljMzIKLVNiQXRvbWljTm9CYXJyaWVyX0NvbXBhcmVBbmRTd2FwKHZvbGF0aWxlIFNiQXRvbWljMzIqIHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiQXRvbWljMzIgb2xkX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JBdG9taWMzMiBuZXdfdmFsdWUpIHsKLSAgLy8gTm90ZSB0aGlzIGRvZXMgYSBmdWxsIG1lbW9yeSBiYXJyaWVyCi0gIHJldHVybiBfSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2UoCi0gICAgICAodm9sYXRpbGUgbG9uZyopIHB0ciwgKGxvbmcpIG5ld192YWx1ZSwgKGxvbmcpIG9sZF92YWx1ZSk7Ci19Ci0KLVNCX0NfRk9SQ0VfSU5MSU5FIFNiQXRvbWljMzIKLVNiQXRvbWljTm9CYXJyaWVyX0V4Y2hhbmdlKHZvbGF0aWxlIFNiQXRvbWljMzIqIHB0ciwgU2JBdG9taWMzMiBuZXdfdmFsdWUpIHsKLSAgLy8gTm90ZSB0aGlzIGRvZXMgYSBmdWxsIG1lbW9yeSBiYXJyaWVyCi0gIHJldHVybiBfSW50ZXJsb2NrZWRFeGNoYW5nZSgodm9sYXRpbGUgbG9uZyopcHRyLCAobG9uZyluZXdfdmFsdWUpOwotfQotCi1TQl9DX0ZPUkNFX0lOTElORSBTYkF0b21pYzMyCi1TYkF0b21pY05vQmFycmllcl9JbmNyZW1lbnQodm9sYXRpbGUgU2JBdG9taWMzMiogcHRyLCBTYkF0b21pYzMyIGluY3JlbWVudCkgewotICByZXR1cm4gU2JBdG9taWNCYXJyaWVyX0luY3JlbWVudChwdHIsIGluY3JlbWVudCk7Ci19Ci0KLVNCX0NfRk9SQ0VfSU5MSU5FIFNiQXRvbWljMzIgU2JBdG9taWNCYXJyaWVyX0luY3JlbWVudCh2b2xhdGlsZSBTYkF0b21pYzMyKiBwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JBdG9taWMzMiBpbmNyZW1lbnQpIHsKLSAgLy8gTm90ZSBJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkIGRvZXMgYSBmdWxsIG1lbW9yeSBiYXJyaWVyCi0gIHJldHVybiBpbmNyZW1lbnQgKyBfSW50ZXJsb2NrZWRFeGNoYW5nZUFkZCgKLSAgICAgICh2b2xhdGlsZSBsb25nICopcHRyLCAobG9uZylpbmNyZW1lbnQpOwotfQotCi1TQl9DX0ZPUkNFX0lOTElORSBTYkF0b21pYzMyCi1TYkF0b21pY0FjcXVpcmVfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgU2JBdG9taWMzMiogcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiQXRvbWljMzIgb2xkX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiQXRvbWljMzIgbmV3X3ZhbHVlKSB7Ci0gIC8vIE5vdGUgdGhpcyBkb2VzIGEgZnVsbCBtZW1vcnkgYmFycmllcgotICByZXR1cm4gX0ludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlKAotICAgICAgKHZvbGF0aWxlIGxvbmcqKSBwdHIsIChsb25nKSBuZXdfdmFsdWUsIChsb25nKSBvbGRfdmFsdWUpOwotfQotCi1TQl9DX0ZPUkNFX0lOTElORSBTYkF0b21pYzMyCi1TYkF0b21pY1JlbGVhc2VfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgU2JBdG9taWMzMiogcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiQXRvbWljMzIgb2xkX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiQXRvbWljMzIgbmV3X3ZhbHVlKSB7Ci0gIC8vIE5vdGUgdGhpcyBkb2VzIGEgZnVsbCBtZW1vcnkgYmFycmllcgotICByZXR1cm4gX0ludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlKAotICAgICAgKHZvbGF0aWxlIGxvbmcqKSBwdHIsIChsb25nKSBuZXdfdmFsdWUsIChsb25nKSBvbGRfdmFsdWUpOwotfQotCi0vLyBOT1RFOiBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2YyMHcweDVlLmFzcHgKLS8vIHN0YXRlcyBfUmVhZFdyaXRlQmFycmllcigpIGlzIGRlcHJlY2F0ZWQgYW5kCi0vLyByZWNvbW1lbmRzICJhdG9taWNfdGhyZWFkX2ZlbmNlIiwgd2hpY2ggaXMgQysrMTEgYW5kIHZpb2xhdGVzCi0vLyBTdGFyYm9hcmQncyAiQy1vbmx5IGhlYWRlciIgcG9saWN5Ci1TQl9DX0ZPUkNFX0lOTElORSB2b2lkIFNiQXRvbWljTWVtb3J5QmFycmllcigpIHsKLSAgX1JlYWRXcml0ZUJhcnJpZXIoKTsKLX0KLQotU0JfQ19GT1JDRV9JTkxJTkUgdm9pZCBTYkF0b21pY05vQmFycmllcl9TdG9yZSh2b2xhdGlsZSBTYkF0b21pYzMyKiBwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiQXRvbWljMzIgdmFsdWUpIHsKLSAgKnB0ciA9IHZhbHVlOwotfQotCi1TQl9DX0ZPUkNFX0lOTElORSB2b2lkIFNiQXRvbWljQWNxdWlyZV9TdG9yZSh2b2xhdGlsZSBTYkF0b21pYzMyKiBwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkF0b21pYzMyIHZhbHVlKSB7Ci0gICpwdHIgPSB2YWx1ZTsKLSAgU2JBdG9taWNNZW1vcnlCYXJyaWVyKCk7Ci19Ci0KLVNCX0NfRk9SQ0VfSU5MSU5FIHZvaWQgU2JBdG9taWNSZWxlYXNlX1N0b3JlKHZvbGF0aWxlIFNiQXRvbWljMzIqIHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiQXRvbWljMzIgdmFsdWUpIHsKLSAgU2JBdG9taWNNZW1vcnlCYXJyaWVyKCk7Ci0gICpwdHIgPSB2YWx1ZTsKLX0KLQotU0JfQ19GT1JDRV9JTkxJTkUgU2JBdG9taWMzMgotU2JBdG9taWNOb0JhcnJpZXJfTG9hZCh2b2xhdGlsZSBjb25zdCBTYkF0b21pYzMyKiBwdHIpIHsKLSAgcmV0dXJuICpwdHI7Ci19Ci0KLVNCX0NfRk9SQ0VfSU5MSU5FIFNiQXRvbWljMzIKLVNiQXRvbWljQWNxdWlyZV9Mb2FkKHZvbGF0aWxlIGNvbnN0IFNiQXRvbWljMzIqIHB0cikgewotICBTYkF0b21pYzMyIHZhbHVlID0gKnB0cjsKLSAgU2JBdG9taWNNZW1vcnlCYXJyaWVyKCk7Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotU0JfQ19GT1JDRV9JTkxJTkUgU2JBdG9taWMzMgotU2JBdG9taWNSZWxlYXNlX0xvYWQodm9sYXRpbGUgY29uc3QgU2JBdG9taWMzMiogcHRyKSB7Ci0gIFNiQXRvbWljTWVtb3J5QmFycmllcigpOwotICByZXR1cm4gKnB0cjsKLX0KLQotLy8gNjQtYml0IGF0b21pYyBvcGVyYXRpb25zIChvbmx5IGF2YWlsYWJsZSBvbiA2NC1iaXQgcHJvY2Vzc29ycykuCi0jaWYgU0JfSEFTKDY0X0JJVF9BVE9NSUNTKQotU0JfQ19GT1JDRV9JTkxJTkUgU2JBdG9taWM2NAotU2JBdG9taWNOb0JhcnJpZXJfQ29tcGFyZUFuZFN3YXA2NCh2b2xhdGlsZSBTYkF0b21pYzY0KiBwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiQXRvbWljNjQgb2xkX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkF0b21pYzY0IG5ld192YWx1ZSkgewotICByZXR1cm4gX0ludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlNjQocHRyLCBuZXdfdmFsdWUsIG9sZF92YWx1ZSk7Ci19Ci0KLVNCX0NfRk9SQ0VfSU5MSU5FIFNiQXRvbWljNjQKLVNiQXRvbWljTm9CYXJyaWVyX0V4Y2hhbmdlNjQodm9sYXRpbGUgU2JBdG9taWM2NCogcHRyLCBTYkF0b21pYzY0IG5ld192YWx1ZSkgewotICByZXR1cm4gX0ludGVybG9ja2VkRXhjaGFuZ2U2NChwdHIsIG5ld192YWx1ZSk7Ci19Ci0KLVNCX0NfRk9SQ0VfSU5MSU5FIFNiQXRvbWljNjQKLVNiQXRvbWljTm9CYXJyaWVyX0luY3JlbWVudDY0KHZvbGF0aWxlIFNiQXRvbWljNjQqIHB0ciwgU2JBdG9taWM2NCBpbmNyZW1lbnQpIHsKLSAgcmV0dXJuIGluY3JlbWVudCArIF9JbnRlcmxvY2tlZEV4Y2hhbmdlQWRkNjQocHRyLCBpbmNyZW1lbnQpOwotfQotCi1TQl9DX0ZPUkNFX0lOTElORSBTYkF0b21pYzY0Ci1TYkF0b21pY0JhcnJpZXJfSW5jcmVtZW50NjQodm9sYXRpbGUgU2JBdG9taWM2NCogcHRyLCBTYkF0b21pYzY0IGluY3JlbWVudCkgewotICAvLyBOb3RlIHRoaXMgZG9lcyBhIGZ1bGwgbWVtb3J5IGJhcnJpZXIKLSAgcmV0dXJuIGluY3JlbWVudCArIF9JbnRlcmxvY2tlZEV4Y2hhbmdlQWRkNjQocHRyLCBpbmNyZW1lbnQpOwotfQotCi1TQl9DX0ZPUkNFX0lOTElORSBTYkF0b21pYzY0Ci1TYkF0b21pY0FjcXVpcmVfQ29tcGFyZUFuZFN3YXA2NCh2b2xhdGlsZSBTYkF0b21pYzY0KiBwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkF0b21pYzY0IG9sZF92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiQXRvbWljNjQgbmV3X3ZhbHVlKSB7Ci0gIC8vIE5vdGUgdGhpcyBkb2VzIGEgZnVsbCBtZW1vcnkgYmFycmllcgotICByZXR1cm4gX0ludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlNjQocHRyLCBuZXdfdmFsdWUsIG9sZF92YWx1ZSk7Ci19Ci0KLVNCX0NfRk9SQ0VfSU5MSU5FIFNiQXRvbWljNjQKLVNiQXRvbWljUmVsZWFzZV9Db21wYXJlQW5kU3dhcDY0KHZvbGF0aWxlIFNiQXRvbWljNjQqIHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiQXRvbWljNjQgb2xkX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JBdG9taWM2NCBuZXdfdmFsdWUpIHsKLSAgLy8gTm90ZSB0aGlzIGRvZXMgYSBmdWxsIG1lbW9yeSBiYXJyaWVyCi0gIHJldHVybiBfSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2U2NChwdHIsIG5ld192YWx1ZSwgb2xkX3ZhbHVlKTsKLX0KLQotU0JfQ19GT1JDRV9JTkxJTkUgdm9pZCBTYkF0b21pY05vQmFycmllcl9TdG9yZTY0KHZvbGF0aWxlIFNiQXRvbWljNjQqIHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkF0b21pYzY0IHZhbHVlKSB7Ci0gICpwdHIgPSB2YWx1ZTsKLX0KLQotU0JfQ19GT1JDRV9JTkxJTkUgdm9pZCBTYkF0b21pY0FjcXVpcmVfU3RvcmU2NCh2b2xhdGlsZSBTYkF0b21pYzY0KiBwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiQXRvbWljNjQgdmFsdWUpIHsKLSAgKnB0ciA9IHZhbHVlOwotICBTYkF0b21pY01lbW9yeUJhcnJpZXIoKTsKLX0KLQotU0JfQ19GT1JDRV9JTkxJTkUgdm9pZCBTYkF0b21pY1JlbGVhc2VfU3RvcmU2NCh2b2xhdGlsZSBTYkF0b21pYzY0KiBwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiQXRvbWljNjQgdmFsdWUpIHsKLSAgU2JBdG9taWNNZW1vcnlCYXJyaWVyKCk7Ci0gICpwdHIgPSB2YWx1ZTsKLX0KLQotU0JfQ19GT1JDRV9JTkxJTkUgU2JBdG9taWM2NAotU2JBdG9taWNOb0JhcnJpZXJfTG9hZDY0KHZvbGF0aWxlIGNvbnN0IFNiQXRvbWljNjQqIHB0cikgewotICByZXR1cm4gKnB0cjsKLX0KLQotU0JfQ19GT1JDRV9JTkxJTkUgU2JBdG9taWM2NAotU2JBdG9taWNBY3F1aXJlX0xvYWQ2NCh2b2xhdGlsZSBjb25zdCBTYkF0b21pYzY0KiBwdHIpIHsKLSAgU2JBdG9taWM2NCB2YWx1ZSA9ICpwdHI7Ci0gIFNiQXRvbWljTWVtb3J5QmFycmllcigpOwotICByZXR1cm4gdmFsdWU7Ci19Ci0KLVNCX0NfRk9SQ0VfSU5MSU5FIFNiQXRvbWljNjQKLVNiQXRvbWljUmVsZWFzZV9Mb2FkNjQodm9sYXRpbGUgY29uc3QgU2JBdG9taWM2NCogcHRyKSB7Ci0gIFNiQXRvbWljTWVtb3J5QmFycmllcigpOwotICByZXR1cm4gKnB0cjsKLX0KLSNlbmRpZiAgLy8gU0JfSEFTKDY0X0JJVF9BVE9NSUNTKQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0gIC8vIGV4dGVybiAiQyIKLSNlbmRpZgotCi0jZW5kaWYgIC8vIFNUQVJCT0FSRF9TSEFSRURfV0lOMzJfQVRPTUlDX1BVQkxJQ19IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvYXRvbWljX3F1ZXVlLmggYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9hdG9taWNfcXVldWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc2ODEzYS4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9hdG9taWNfcXVldWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpZm5kZWYgU1RBUkJPQVJEX1NIQVJFRF9XSU4zMl9BVE9NSUNfUVVFVUVfSF8KLSNkZWZpbmUgU1RBUkJPQVJEX1NIQVJFRF9XSU4zMl9BVE9NSUNfUVVFVUVfSF8KLQotI2luY2x1ZGUgPGRlcXVlPgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL211dGV4LmgiCi0KLW5hbWVzcGFjZSBzdGFyYm9hcmQgewotbmFtZXNwYWNlIHNoYXJlZCB7Ci1uYW1lc3BhY2Ugd2luMzIgewotCi0vLyBBIHNpbXBsZSB0aHJlYWQtc2FmZSBwcm9kdWNlciAvIGNvbnN1bWVyIHF1ZXVlLiBFbGVtZW50cyBhcmUgYWRkZWQgdmlhCi0vLyBQb3BCYWNrKCkgYW5kIHJlbW92ZWQgdmlhIFBvcEZyb250KCkuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRGF0YT4KLWNsYXNzIEF0b21pY1F1ZXVlIHsKLSBwdWJsaWM6Ci0gIHNpemVfdCBQdXNoQmFjayhEYXRhIGRhdGFfcHRyKSB7Ci0gICAgU2NvcGVkTG9jayBsb2NrKG11dGV4Xyk7Ci0gICAgZGF0YV9xdWV1ZV8ucHVzaF9iYWNrKGRhdGFfcHRyKTsKLSAgICByZXR1cm4gZGF0YV9xdWV1ZV8uc2l6ZSgpOwotICB9Ci0KLSAgRGF0YSBQb3BGcm9udCgpIHsKLSAgICBTY29wZWRMb2NrIGxvY2sobXV0ZXhfKTsKLSAgICBpZiAoZGF0YV9xdWV1ZV8uZW1wdHkoKSkgewotICAgICAgRGF0YSBlbXB0eSA9IERhdGEoKTsKLSAgICAgIHJldHVybiBlbXB0eTsKLSAgICB9Ci0gICAgRGF0YSBkYXRhX3B0ciA9IGRhdGFfcXVldWVfLmZyb250KCk7Ci0gICAgZGF0YV9xdWV1ZV8ucG9wX2Zyb250KCk7Ci0gICAgcmV0dXJuIGRhdGFfcHRyOwotICB9Ci0KLSAgYm9vbCBJc0VtcHR5KCkgY29uc3QgewotICAgIFNjb3BlZExvY2sgbG9jayhtdXRleF8pOwotICAgIHJldHVybiBkYXRhX3F1ZXVlXy5lbXB0eSgpOwotICB9Ci0KLSAgc2l6ZV90IFNpemUoKSBjb25zdCB7Ci0gICAgU2NvcGVkTG9jayBsb2NrKG11dGV4Xyk7Ci0gICAgcmV0dXJuIGRhdGFfcXVldWVfLnNpemUoKTsKLSAgfQotCi0gIHZvaWQgQ2xlYXIoKSB7Ci0gICAgU2NvcGVkTG9jayBsb2NrKG11dGV4Xyk7Ci0gICAgc3RkOjpkZXF1ZTxEYXRhPiBlbXB0eTsKLSAgICBkYXRhX3F1ZXVlXy5zd2FwKGVtcHR5KTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgdXNpbmcgTXV0ZXggPSA6OnN0YXJib2FyZDo6TXV0ZXg7Ci0gIHVzaW5nIFNjb3BlZExvY2sgPSA6OnN0YXJib2FyZDo6U2NvcGVkTG9jazsKLSAgc3RkOjpkZXF1ZTxEYXRhPiBkYXRhX3F1ZXVlXzsKLSAgOjpzdGFyYm9hcmQ6Ok11dGV4IG11dGV4XzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSB3aW4zMgotfSAgLy8gbmFtZXNwYWNlIHNoYXJlZAotfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZAotCi0jZW5kaWYgIC8vIFNUQVJCT0FSRF9TSEFSRURfV0lOMzJfQVRPTUlDX1FVRVVFX0hfCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9hdWRpb19kZWNvZGVyLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvYXVkaW9fZGVjb2Rlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg1MTg1Ny4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9hdWRpb19kZWNvZGVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2F1ZGlvX2RlY29kZXIuaCIKLQotI2luY2x1ZGUgInN0YXJib2FyZC9hdG9taWMuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvYXVkaW9fc2luay5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9tZWRpYV9jb21tb24uaCIKLQotbmFtZXNwYWNlIHN0YXJib2FyZCB7Ci1uYW1lc3BhY2Ugc2hhcmVkIHsKLW5hbWVzcGFjZSB3aW4zMiB7Ci0KLWNsYXNzIEF1ZGlvRGVjb2Rlcjo6Q2FsbGJhY2tTY2hlZHVsZXIgOiBwcml2YXRlIEpvYk93bmVyIHsKLSBwdWJsaWM6Ci0gIENhbGxiYWNrU2NoZWR1bGVyKCkgOiBjYWxsYmFja19zaWduYWxlZF8oZmFsc2UpIHt9Ci0KLSAgdm9pZCBTZXRDYWxsYmFja09uY2UoQ29uc3VtZWRDQiBjYikgewotICAgIFNCX0RDSEVDSyhjYik7Ci0gICAgOjpzdGFyYm9hcmQ6OlNjb3BlZExvY2sgbG9jayhtdXRleF8pOwotICAgIGlmICghY2JfKSB7Ci0gICAgICBjYl8gPSBjYjsKLSAgICB9Ci0gIH0KLQotICB2b2lkIFNjaGVkdWxlQ2FsbGJhY2tJZk5lY2Vzc2FyeSgpIHsKLSAgICA6OnN0YXJib2FyZDo6U2NvcGVkTG9jayBsb2NrKG11dGV4Xyk7Ci0gICAgaWYgKCFjYl8gfHwgY2FsbGJhY2tfc2lnbmFsZWRfKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhbGxiYWNrX3NpZ25hbGVkXyA9IHRydWU7Ci0gICAgSm9iT3duZXI6OlNjaGVkdWxlKGNiXyk7Ci0gIH0KLQotICB2b2lkIE9uQ2FsbGJhY2tTaWduYWxlZCgpIHsKLSAgICA6OnN0YXJib2FyZDo6U2NvcGVkTG9jayBsb2NrKG11dGV4Xyk7Ci0gICAgY2FsbGJhY2tfc2lnbmFsZWRfID0gZmFsc2U7Ci0gIH0KLQotICBDb25zdW1lZENCIGNiXzsKLSAgOjpzdGFyYm9hcmQ6Ok11dGV4IG11dGV4XzsKLSAgYm9vbCBjYWxsYmFja19zaWduYWxlZF87Ci19OwotCi1BdWRpb0RlY29kZXI6OkF1ZGlvRGVjb2RlcihTYk1lZGlhQXVkaW9Db2RlYyBhdWRpb19jb2RlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNiTWVkaWFBdWRpb0hlYWRlciYgYXVkaW9faGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JEcm1TeXN0ZW0gZHJtX3N5c3RlbSkKLSAgICA6IGF1ZGlvX2NvZGVjXyhhdWRpb19jb2RlYyksCi0gICAgICBhdWRpb19oZWFkZXJfKGF1ZGlvX2hlYWRlciksCi0gICAgICBkcm1fc3lzdGVtXyhkcm1fc3lzdGVtKSwKLSAgICAgIHNhbXBsZV90eXBlXyhrU2JNZWRpYUF1ZGlvU2FtcGxlVHlwZUZsb2F0MzIpLAotICAgICAgc3RyZWFtX2VuZGVkXyhmYWxzZSkgewotICBTQl9EQ0hFQ0soYXVkaW9fY29kZWMgPT0ga1NiTWVkaWFBdWRpb0NvZGVjQWFjKTsKLX0KLQotQXVkaW9EZWNvZGVyOjp+QXVkaW9EZWNvZGVyKCkgewotICBTQl9EQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7Ci0KLSAgZGVjb2Rlcl90aHJlYWRfLnJlc2V0KG51bGxwdHIpOwotICBkZWNvZGVyX2ltcGxfLnJlc2V0KG51bGxwdHIpOwotICBjYWxsYmFja19zY2hlZHVsZXJfLnJlc2V0KG51bGxwdHIpOwotfQotCi12b2lkIEF1ZGlvRGVjb2Rlcjo6SW5pdGlhbGl6ZShjb25zdCBPdXRwdXRDQiYgb3V0cHV0X2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXJyb3JDQiYgZXJyb3JfY2IpIHsKLSAgU0JfRENIRUNLKHRocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOwotICBTQl9VTlJFRkVSRU5DRURfUEFSQU1FVEVSKGVycm9yX2NiKTsKLQotICBTQl9EQ0hFQ0sob3V0cHV0X2NiKTsKLSAgU0JfRENIRUNLKCFvdXRwdXRfY2JfKTsKLSAgb3V0cHV0X2NiXyA9IG91dHB1dF9jYjsKLSAgZGVjb2Rlcl9pbXBsXyA9IEFic3RyYWN0V2luMzJBdWRpb0RlY29kZXI6OkNyZWF0ZSgKLSAgICAgIGF1ZGlvX2NvZGVjXywgR2V0U3RvcmFnZVR5cGUoKSwgR2V0U2FtcGxlVHlwZSgpLCBhdWRpb19oZWFkZXJfLAotICAgICAgZHJtX3N5c3RlbV8pOwotICBkZWNvZGVyX3RocmVhZF8ucmVzZXQobmV3IEF1ZGlvRGVjb2RlclRocmVhZChkZWNvZGVyX2ltcGxfLmdldCgpLCB0aGlzKSk7Ci0gIGNhbGxiYWNrX3NjaGVkdWxlcl8ucmVzZXQobmV3IENhbGxiYWNrU2NoZWR1bGVyKCkpOwotfQotCi12b2lkIEF1ZGlvRGVjb2Rlcjo6RGVjb2RlKGNvbnN0IHNjb3BlZF9yZWZwdHI8SW5wdXRCdWZmZXI+JiBpbnB1dF9idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbnN1bWVkQ0ImIGNvbnN1bWVkX2NiKSB7Ci0gIFNCX0RDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKLSAgU0JfRENIRUNLKGlucHV0X2J1ZmZlcik7Ci0KLSAgY2FsbGJhY2tfc2NoZWR1bGVyXy0+U2V0Q2FsbGJhY2tPbmNlKGNvbnN1bWVkX2NiKTsKLSAgY2FsbGJhY2tfc2NoZWR1bGVyXy0+T25DYWxsYmFja1NpZ25hbGVkKCk7Ci0gIGNvbnN0IGJvb2wgY2FuX3Rha2VfbW9yZV9kYXRhID0gZGVjb2Rlcl90aHJlYWRfLT5RdWV1ZUlucHV0KGlucHV0X2J1ZmZlcik7Ci0gIGlmIChjYW5fdGFrZV9tb3JlX2RhdGEpIHsKLSAgICBjYWxsYmFja19zY2hlZHVsZXJfLT5TY2hlZHVsZUNhbGxiYWNrSWZOZWNlc3NhcnkoKTsKLSAgfQotCi0gIGlmIChzdHJlYW1fZW5kZWRfKSB7Ci0gICAgU0JfTE9HKEVSUk9SKSA8PCAiRGVjb2RlKCkgaXMgY2FsbGVkIGFmdGVyIFdyaXRlRW5kT2ZTdHJlYW0oKSBpcyBjYWxsZWQuIjsKLSAgICByZXR1cm47Ci0gIH0KLX0KLQotdm9pZCBBdWRpb0RlY29kZXI6OldyaXRlRW5kT2ZTdHJlYW0oKSB7Ci0gIFNCX0RDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKLQotICA6OnN0YXJib2FyZDo6U2NvcGVkTG9jayBsb2NrKG11dGV4Xyk7Ci0gIHN0cmVhbV9lbmRlZF8gPSB0cnVlOwotICBkZWNvZGVyX3RocmVhZF8tPlF1ZXVlRW5kT2ZTdHJlYW0oKTsKLX0KLQotc2NvcGVkX3JlZnB0cjxBdWRpb0RlY29kZXI6OkRlY29kZWRBdWRpbz4gQXVkaW9EZWNvZGVyOjpSZWFkKCkgewotICBTQl9EQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7Ci0KLSAgRGVjb2RlZEF1ZGlvUHRyIGRhdGEgPSBkZWNvZGVkX2RhdGFfLlBvcEZyb250KCk7Ci0gIFNCX0RDSEVDSyhkYXRhKTsKLSAgcmV0dXJuIGRhdGE7Ci19Ci0KLXZvaWQgQXVkaW9EZWNvZGVyOjpSZXNldCgpIHsKLSAgU0JfRENIRUNLKHRocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOwotCi0gIGRlY29kZXJfdGhyZWFkXy5yZXNldChudWxscHRyKTsKLSAgZGVjb2Rlcl9pbXBsXy0+UmVzZXQoKTsKLQotICBkZWNvZGVkX2RhdGFfLkNsZWFyKCk7Ci0gIHN0cmVhbV9lbmRlZF8gPSBmYWxzZTsKLSAgY2FsbGJhY2tfc2NoZWR1bGVyXy5yZXNldChuZXcgQ2FsbGJhY2tTY2hlZHVsZXIoKSk7Ci0gIENhbmNlbFBlbmRpbmdKb2JzKCk7Ci0KLSAgZGVjb2Rlcl90aHJlYWRfLnJlc2V0KG5ldyBBdWRpb0RlY29kZXJUaHJlYWQoZGVjb2Rlcl9pbXBsXy5nZXQoKSwgdGhpcykpOwotfQotCi1TYk1lZGlhQXVkaW9TYW1wbGVUeXBlIEF1ZGlvRGVjb2Rlcjo6R2V0U2FtcGxlVHlwZSgpIGNvbnN0IHsKLSAgU0JfRENIRUNLKHRocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOwotCi0gIHJldHVybiBzYW1wbGVfdHlwZV87Ci19Ci0KLWludCBBdWRpb0RlY29kZXI6OkdldFNhbXBsZXNQZXJTZWNvbmQoKSBjb25zdCB7Ci0gIHJldHVybiBkZWNvZGVyX2ltcGxfLT5HZXRTYW1wbGVzUGVyU2Vjb25kKCk7Ci19Ci0KLXZvaWQgQXVkaW9EZWNvZGVyOjpPbkF1ZGlvRGVjb2RlZChEZWNvZGVkQXVkaW9QdHIgZGF0YSkgewotICBkZWNvZGVkX2RhdGFfLlB1c2hCYWNrKGRhdGEpOwotICBpZiAob3V0cHV0X2NiXykgewotICAgIFNjaGVkdWxlKG91dHB1dF9jYl8pOwotICB9Ci0gIGNhbGxiYWNrX3NjaGVkdWxlcl8tPlNjaGVkdWxlQ2FsbGJhY2tJZk5lY2Vzc2FyeSgpOwotfQotCi19ICAvLyBuYW1lc3BhY2Ugd2luMzIKLX0gIC8vIG5hbWVzcGFjZSBzaGFyZWQKLX0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2F1ZGlvX2RlY29kZXIuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2F1ZGlvX2RlY29kZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRkNmNmNC4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9hdWRpb19kZWNvZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaWZuZGVmIFNUQVJCT0FSRF9TSEFSRURfV0lOMzJfQVVESU9fREVDT0RFUl9IXwotI2RlZmluZSBTVEFSQk9BUkRfU0hBUkVEX1dJTjMyX0FVRElPX0RFQ09ERVJfSF8KLQotI2luY2x1ZGUgInN0YXJib2FyZC9jb21tb24vcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvY29tbW9uL3Njb3BlZF9wdHIuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvY29uZmlndXJhdGlvbi5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9kcm0uaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVkaWEuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL2ludGVybmFsX29ubHkuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZGVjb2RlZF9hdWRpb19pbnRlcm5hbC5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fZGVjb2Rlcl9pbnRlcm5hbC5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9qb2JfcXVldWUuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC90aHJlYWRfY2hlY2tlci5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvYXRvbWljX3F1ZXVlLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9hdWRpb19kZWNvZGVyX3RocmVhZC5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvbWVkaWFfY29tbW9uLmgiCi0KLW5hbWVzcGFjZSBzdGFyYm9hcmQgewotbmFtZXNwYWNlIHNoYXJlZCB7Ci1uYW1lc3BhY2Ugd2luMzIgewotCi1jbGFzcyBBdWRpb0RlY29kZXIKLSAgICA6IHB1YmxpYyA6OnN0YXJib2FyZDo6c2hhcmVkOjpzdGFyYm9hcmQ6OnBsYXllcjo6ZmlsdGVyOjpBdWRpb0RlY29kZXIsCi0gICAgICBwcml2YXRlIDo6c3RhcmJvYXJkOjpzaGFyZWQ6OnN0YXJib2FyZDo6cGxheWVyOjpKb2JRdWV1ZTo6Sm9iT3duZXIsCi0gICAgICBwcml2YXRlIEF1ZGlvRGVjb2RlZENhbGxiYWNrIHsKLSBwdWJsaWM6Ci0gIEF1ZGlvRGVjb2RlcihTYk1lZGlhQXVkaW9Db2RlYyBhdWRpb19jb2RlYywKLSAgICAgICAgICAgICAgIGNvbnN0IFNiTWVkaWFBdWRpb0hlYWRlciYgYXVkaW9faGVhZGVyLAotICAgICAgICAgICAgICAgU2JEcm1TeXN0ZW0gZHJtX3N5c3RlbSk7Ci0gIH5BdWRpb0RlY29kZXIoKSBvdmVycmlkZTsKLQotICB2b2lkIEluaXRpYWxpemUoY29uc3QgT3V0cHV0Q0ImIG91dHB1dF9jYiwgY29uc3QgRXJyb3JDQiYgZXJyb3JfY2IpIG92ZXJyaWRlOwotICB2b2lkIERlY29kZShjb25zdCBzY29wZWRfcmVmcHRyPElucHV0QnVmZmVyPiYgaW5wdXRfYnVmZmVyLAotICAgICAgICAgICAgICBjb25zdCBDb25zdW1lZENCJiBjb25zdW1lZF9jYikgb3ZlcnJpZGU7Ci0gIHZvaWQgV3JpdGVFbmRPZlN0cmVhbSgpIG92ZXJyaWRlOwotICBzY29wZWRfcmVmcHRyPERlY29kZWRBdWRpbz4gUmVhZCgpIG92ZXJyaWRlOwotICB2b2lkIFJlc2V0KCkgb3ZlcnJpZGU7Ci0gIFNiTWVkaWFBdWRpb1NhbXBsZVR5cGUgR2V0U2FtcGxlVHlwZSgpIGNvbnN0IG92ZXJyaWRlOwotICBpbnQgR2V0U2FtcGxlc1BlclNlY29uZCgpIGNvbnN0IG92ZXJyaWRlOwotCi0gIFNiTWVkaWFBdWRpb0ZyYW1lU3RvcmFnZVR5cGUgR2V0U3RvcmFnZVR5cGUoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIGtTYk1lZGlhQXVkaW9GcmFtZVN0b3JhZ2VUeXBlSW50ZXJsZWF2ZWQ7Ci0gIH0KLSAgdm9pZCBPbkF1ZGlvRGVjb2RlZChEZWNvZGVkQXVkaW9QdHIgZGF0YSkgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBjbGFzcyBDYWxsYmFja1NjaGVkdWxlcjsKLQotICA6OnN0YXJib2FyZDo6c2hhcmVkOjpzdGFyYm9hcmQ6OlRocmVhZENoZWNrZXIgdGhyZWFkX2NoZWNrZXJfOwotCi0gIGNvbnN0IFNiTWVkaWFBdWRpb0NvZGVjIGF1ZGlvX2NvZGVjXzsKLSAgY29uc3QgU2JNZWRpYUF1ZGlvSGVhZGVyIGF1ZGlvX2hlYWRlcl87Ci0gIFNiRHJtU3lzdGVtIGNvbnN0IGRybV9zeXN0ZW1fOwotICBjb25zdCBTYk1lZGlhQXVkaW9TYW1wbGVUeXBlIHNhbXBsZV90eXBlXzsKLSAgYm9vbCBzdHJlYW1fZW5kZWRfOwotCi0gIEF0b21pY1F1ZXVlPERlY29kZWRBdWRpb1B0cj4gZGVjb2RlZF9kYXRhXzsKLSAgc2NvcGVkX3B0cjxBdWRpb0RlY29kZXI6OkNhbGxiYWNrU2NoZWR1bGVyPiBjYWxsYmFja19zY2hlZHVsZXJfOwotICBzY29wZWRfcHRyPEFic3RyYWN0V2luMzJBdWRpb0RlY29kZXI+IGRlY29kZXJfaW1wbF87Ci0gIHNjb3BlZF9wdHI8QXVkaW9EZWNvZGVyVGhyZWFkPiBkZWNvZGVyX3RocmVhZF87Ci0gIE91dHB1dENCIG91dHB1dF9jYl87Ci0KLSAgTXV0ZXggbXV0ZXhfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHdpbjMyCi19ICAvLyBuYW1lc3BhY2Ugc2hhcmVkCi19ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCi0KLSNlbmRpZiAgLy8gU1RBUkJPQVJEX1NIQVJFRF9XSU4zMl9BVURJT19ERUNPREVSX0hfCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9hdWRpb19kZWNvZGVyX3RocmVhZC5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2F1ZGlvX2RlY29kZXJfdGhyZWFkLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDUzYjYzLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2F1ZGlvX2RlY29kZXJfdGhyZWFkLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2F1ZGlvX2RlY29kZXJfdGhyZWFkLmgiCi0KLSNpbmNsdWRlIDxkZXF1ZT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLW5hbWVzcGFjZSBzdGFyYm9hcmQgewotbmFtZXNwYWNlIHNoYXJlZCB7Ci1uYW1lc3BhY2Ugd2luMzIgewotbmFtZXNwYWNlIHsKLQotLy8gU2l6ZSBvZiB0aGUgcXVldWUgZm9yIGF1ZGlvIHVuaXRzLgotY29uc3Qgc2l6ZV90IGtNYXhQcm9jZXNzaW5nRWxlbWVudHMgPSA2NDsKLQotc2l6ZV90IFdyaXRlQXNNdWNoQXNQb3NzaWJsZSgKLSAgICBzdGQ6OmRlcXVlPHNjb3BlZF9yZWZwdHI8SW5wdXRCdWZmZXI+ID4qIGRhdGFfcXVldWUsCi0gICAgQWJzdHJhY3RXaW4zMkF1ZGlvRGVjb2RlciogYXVkaW9fZGVjb2RlcikgewotICBjb25zdCBzaXplX3Qgb3JpZ2luYWxfc2l6ZSA9IGRhdGFfcXVldWUtPnNpemUoKTsKLSAgd2hpbGUgKCFkYXRhX3F1ZXVlLT5lbXB0eSgpKSB7Ci0gICAgc2NvcGVkX3JlZnB0cjxJbnB1dEJ1ZmZlcj4gYnVmZiA9IGRhdGFfcXVldWUtPmZyb250KCk7Ci0gICAgZGF0YV9xdWV1ZS0+cG9wX2Zyb250KCk7Ci0KLSAgICBpZiAoYnVmZikgewotICAgICAgaWYgKCFhdWRpb19kZWNvZGVyLT5UcnlXcml0ZShidWZmKSkgewotICAgICAgICBkYXRhX3F1ZXVlLT5wdXNoX2Zyb250KGJ1ZmYpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgYXVkaW9fZGVjb2Rlci0+V3JpdGVFbmRPZlN0cmVhbSgpOwotICAgIH0KLSAgfQotICByZXR1cm4gb3JpZ2luYWxfc2l6ZSAtIGRhdGFfcXVldWUtPnNpemUoKTsKLX0KLQotc3RkOjp2ZWN0b3I8RGVjb2RlZEF1ZGlvUHRyPiBSZWFkQWxsRGVjb2RlZEF1ZGlvU2FtcGxlcygKLSAgICBBYnN0cmFjdFdpbjMyQXVkaW9EZWNvZGVyKiBhdWRpb19kZWNvZGVyKSB7Ci0gIHN0ZDo6dmVjdG9yPERlY29kZWRBdWRpb1B0cj4gZGVjb2RlZF9hdWRpb19vdXQ7Ci0gIHdoaWxlIChEZWNvZGVkQXVkaW9QdHIgZGVjb2RlZF9kYXR1bSA9IGF1ZGlvX2RlY29kZXItPlByb2Nlc3NBbmRSZWFkKCkpIHsKLSAgICBkZWNvZGVkX2F1ZGlvX291dC5wdXNoX2JhY2soZGVjb2RlZF9kYXR1bSk7Ci0gIH0KLSAgcmV0dXJuIGRlY29kZWRfYXVkaW9fb3V0OwotfQotCi19ICAvLyBuYW1lc3BhY2UuCi0KLUF1ZGlvRGVjb2RlclRocmVhZDo6QXVkaW9EZWNvZGVyVGhyZWFkKEFic3RyYWN0V2luMzJBdWRpb0RlY29kZXIqIGRlY29kZXJfaW1wbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGVjb2RlZENhbGxiYWNrKiBjYWxsYmFjaykKLSAgICA6IFRocmVhZCgiQXVkaW9EZWNvZGVyVGhyZWFkIiksCi0gICAgICB3aW4zMl9hdWRpb19kZWNvZGVyXyhkZWNvZGVyX2ltcGwpLAotICAgICAgY2FsbGJhY2tfKGNhbGxiYWNrKSB7Ci0gIFN0YXJ0KCk7Ci19Ci0KLUF1ZGlvRGVjb2RlclRocmVhZDo6fkF1ZGlvRGVjb2RlclRocmVhZCgpIHsKLSAgSm9pbigpOwotfQotCi1ib29sIEF1ZGlvRGVjb2RlclRocmVhZDo6UXVldWVJbnB1dChjb25zdCBzY29wZWRfcmVmcHRyPElucHV0QnVmZmVyPiYgYnVmZmVyKSB7Ci0gIHsKLSAgICA6OnN0YXJib2FyZDo6U2NvcGVkTG9jayBsb2NrKGlucHV0X2J1ZmZlcl9xdWV1ZV9tdXRleF8pOwotICAgIGlucHV0X2J1ZmZlcl9xdWV1ZV8ucHVzaF9iYWNrKGJ1ZmZlcik7Ci0gIH0KLQotICAvLyBpbmNyZW1lbnQoKSByZXR1cm5zIHRoZSBwcmV2aW91cyB2YWx1ZS4KLSAgc2l6ZV90IGVsZW1lbnRfY291bnQgPSBwcm9jZXNzaW5nX2VsZW1lbnRzXy5pbmNyZW1lbnQoKSArIDE7Ci0gIHNlbWFwaG9yZV8uUHV0KCk7Ci0gIHJldHVybiBlbGVtZW50X2NvdW50IDwga01heFByb2Nlc3NpbmdFbGVtZW50czsKLX0KLQotdm9pZCBBdWRpb0RlY29kZXJUaHJlYWQ6OlF1ZXVlRW5kT2ZTdHJlYW0oKSB7Ci0gIHNjb3BlZF9yZWZwdHI8SW5wdXRCdWZmZXI+IGVtcHR5OwotICBRdWV1ZUlucHV0KGVtcHR5KTsKLX0KLQotdm9pZCBBdWRpb0RlY29kZXJUaHJlYWQ6OlJ1bigpIHsKLSAgc3RkOjpkZXF1ZTxzY29wZWRfcmVmcHRyPElucHV0QnVmZmVyPiA+IGxvY2FsX3F1ZXVlOwotCi0gIHdoaWxlICgham9pbl9jYWxsZWQoKSkgewotICAgIGlmIChsb2NhbF9xdWV1ZS5lbXB0eSgpKSB7Ci0gICAgICBUcmFuc2ZlclBlbmRpbmdJbnB1dFRvKCZsb2NhbF9xdWV1ZSk7Ci0gICAgfQotICAgIGJvb2wgd29ya19kb25lID0gZmFsc2U7Ci0gICAgc2l6ZV90IG51bWJlcl93cml0dGVuID0KLSAgICAgICAgV3JpdGVBc011Y2hBc1Bvc3NpYmxlKCZsb2NhbF9xdWV1ZSwgd2luMzJfYXVkaW9fZGVjb2Rlcl8pOwotICAgIGlmIChudW1iZXJfd3JpdHRlbiA+IDApIHsKLSAgICAgIHByb2Nlc3NpbmdfZWxlbWVudHNfLmZldGNoX3N1YihzdGF0aWNfY2FzdDxpbnQzMl90PihudW1iZXJfd3JpdHRlbikpOwotICAgICAgd29ya19kb25lID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBzdGQ6OnZlY3RvcjxEZWNvZGVkQXVkaW9QdHI+IGRlY29kZWRfYXVkaW8gPQotICAgICAgICBSZWFkQWxsRGVjb2RlZEF1ZGlvU2FtcGxlcyh3aW4zMl9hdWRpb19kZWNvZGVyXyk7Ci0KLSAgICBpZiAoIWRlY29kZWRfYXVkaW8uZW1wdHkoKSkgewotICAgICAgd29ya19kb25lID0gdHJ1ZTsKLSAgICAgIGZvciAoYXV0byBpdCA9IGRlY29kZWRfYXVkaW8uYmVnaW4oKTsgaXQgIT0gZGVjb2RlZF9hdWRpby5lbmQoKTsgKytpdCkgewotICAgICAgICBjYWxsYmFja18tPk9uQXVkaW9EZWNvZGVkKCppdCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCF3b3JrX2RvbmUpIHsKLSAgICAgIHNlbWFwaG9yZV8uVGFrZVdhaXQoa1NiVGltZU1pbGxpc2Vjb25kKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBBdWRpb0RlY29kZXJUaHJlYWQ6OlRyYW5zZmVyUGVuZGluZ0lucHV0VG8oCi0gICAgc3RkOjpkZXF1ZTxzY29wZWRfcmVmcHRyPElucHV0QnVmZmVyPiA+KiBkZXN0aW5hdGlvbikgewotICA6OnN0YXJib2FyZDo6U2NvcGVkTG9jayBsb2NrKGlucHV0X2J1ZmZlcl9xdWV1ZV9tdXRleF8pOwotICB3aGlsZSAoIWlucHV0X2J1ZmZlcl9xdWV1ZV8uZW1wdHkoKSkgewotICAgIGRlc3RpbmF0aW9uLT5wdXNoX2JhY2soaW5wdXRfYnVmZmVyX3F1ZXVlXy5mcm9udCgpKTsKLSAgICBpbnB1dF9idWZmZXJfcXVldWVfLnBvcF9mcm9udCgpOwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB3aW4zMgotfSAgLy8gbmFtZXNwYWNlIHNoYXJlZAotfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvYXVkaW9fZGVjb2Rlcl90aHJlYWQuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2F1ZGlvX2RlY29kZXJfdGhyZWFkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NzEwZmQuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvYXVkaW9fZGVjb2Rlcl90aHJlYWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpZm5kZWYgU1RBUkJPQVJEX1NIQVJFRF9XSU4zMl9BVURJT19ERUNPREVSX1RIUkVBRF9IXwotI2RlZmluZSBTVEFSQk9BUkRfU0hBUkVEX1dJTjMyX0FVRElPX0RFQ09ERVJfVEhSRUFEX0hfCi0KLSNpbmNsdWRlIDxkZXF1ZT4KLSNpbmNsdWRlIDxxdWV1ZT4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9jb21tb24vcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvY29tbW9uL3Njb3BlZF9wdHIuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvY29tbW9uL3NlbWFwaG9yZS5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9jb21tb24vdGhyZWFkLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lZGlhLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2RlY29kZWRfYXVkaW9faW50ZXJuYWwuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2F1ZGlvX2RlY29kZXJfaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL21lZGlhX2NvbW1vbi5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvd2luMzJfYXVkaW9fZGVjb2Rlci5oIgotCi1uYW1lc3BhY2Ugc3RhcmJvYXJkIHsKLW5hbWVzcGFjZSBzaGFyZWQgewotbmFtZXNwYWNlIHdpbjMyIHsKLQotY2xhc3MgQXVkaW9EZWNvZGVkQ2FsbGJhY2sgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+QXVkaW9EZWNvZGVkQ2FsbGJhY2soKSB7fQotICB2aXJ0dWFsIHZvaWQgT25BdWRpb0RlY29kZWQoRGVjb2RlZEF1ZGlvUHRyIGRhdGEpID0gMDsKLX07Ci0KLS8vIFRoaXMgZGVjb2RlciB0aHJlYWQgc2ltcGxpZmllcyBkZWNvZGluZyBtZWRpYS4gRGF0YSBpcyBwdXNoZWQgaW4gdmlhCi0vLyBRdWV1ZUlucHV0KCkgYW5kIFF1ZXVlRW5kT2ZTdHJlYW0oKSBhbmQgb3V0cHV0IGRhdGEgaXMgcHVzaGVkIHZpYQotLy8gdGhlIEF1ZGlvRGVjb2RlZENhbGxiYWNrLgotY2xhc3MgQXVkaW9EZWNvZGVyVGhyZWFkIDogcHJpdmF0ZSBUaHJlYWQgewotIHB1YmxpYzoKLSAgQXVkaW9EZWNvZGVyVGhyZWFkKEFic3RyYWN0V2luMzJBdWRpb0RlY29kZXIqIGRlY29kZXJfaW1wbCwKLSAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGVjb2RlZENhbGxiYWNrKiBjYWxsYmFjayk7Ci0gIH5BdWRpb0RlY29kZXJUaHJlYWQoKSBvdmVycmlkZTsKLQotICAvLyBSZXR1cm5zIHRydWUgaWYgbW9yZSBpbnB1dCBjYW4gYmUgcHVzaGVkIHRvIHRoaXMgdGhyZWFkLgotICBib29sIFF1ZXVlSW5wdXQoY29uc3Qgc2NvcGVkX3JlZnB0cjxJbnB1dEJ1ZmZlcj4mIGJ1ZmZlcik7Ci0gIHZvaWQgUXVldWVFbmRPZlN0cmVhbSgpOwotCi0gcHJpdmF0ZToKLSAgdm9pZCBSdW4oKSBvdmVycmlkZTsKLSAgdm9pZCBUcmFuc2ZlclBlbmRpbmdJbnB1dFRvKAotICAgICAgc3RkOjpkZXF1ZTxzY29wZWRfcmVmcHRyPElucHV0QnVmZmVyPiA+KiBkZXN0aW5hdGlvbik7Ci0gIEFic3RyYWN0V2luMzJBdWRpb0RlY29kZXIqIHdpbjMyX2F1ZGlvX2RlY29kZXJfOwotICBBdWRpb0RlY29kZWRDYWxsYmFjayogY2FsbGJhY2tfOwotCi0gIHN0ZDo6ZGVxdWU8c2NvcGVkX3JlZnB0cjxJbnB1dEJ1ZmZlcj4gPiBpbnB1dF9idWZmZXJfcXVldWVfOwotICA6OnN0YXJib2FyZDo6TXV0ZXggaW5wdXRfYnVmZmVyX3F1ZXVlX211dGV4XzsKLSAgYXRvbWljX2ludDMyX3QgcHJvY2Vzc2luZ19lbGVtZW50c187Ci0gIFNlbWFwaG9yZSBzZW1hcGhvcmVfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHdpbjMyCi19ICAvLyBuYW1lc3BhY2Ugc2hhcmVkCi19ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCi0KLSNlbmRpZiAgLy8gU1RBUkJPQVJEX1NIQVJFRF9XSU4zMl9BVURJT19ERUNPREVSX1RIUkVBRF9IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvYXVkaW9fc2luay5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2F1ZGlvX3NpbmsuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYWFmYjMuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvYXVkaW9fc2luay5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ0NiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSA8YmFzZXR5cHMuaD4KLSNpbmNsdWRlIDx3cmwuaD4KLSNpbmNsdWRlIDx4YXVkaW8yLmg+Ci0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8bGltaXRzPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9hdG9taWMuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvY29uZGl0aW9uX3ZhcmlhYmxlLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL2NvbmZpZ3VyYXRpb24uaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL211dGV4LmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvYXVkaW9fc2luay9hdWRpb19zaW5rX2ludGVybmFsLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3RocmVhZC5oIgotI2luY2x1ZGUgInN0YXJib2FyZC90aW1lLmgiCi0KLW5hbWVzcGFjZSBzdGFyYm9hcmQgewotbmFtZXNwYWNlIHNoYXJlZCB7Ci1uYW1lc3BhY2Ugd2luMzIgewotbmFtZXNwYWNlIHsKLQotdXNpbmcgTWljcm9zb2Z0OjpXUkw6OkNvbVB0cjsKLQotY29uc3QgaW50IGtNYXhCdWZmZXJzU3VibWl0dGVkUGVyTG9vcCA9IDI7Ci0KLS8vIEZhaWxzIGFuIFNCX0RDSEVDSyBpZiBhbiBIUkVTVUxUIGlzIG5vdCBTX09LCi12b2lkIENIRUNLX0hSRVNVTFRfT0soSFJFU1VMVCBocikgewotICBTQl9EQ0hFQ0soU1VDQ0VFREVEKGhyKSkgPDwgc3RkOjpoZXggPDwgaHI7Ci19Ci0KLVdPUkQgU2FtcGxlVHlwZVRvRm9ybWF0VGFnKFNiTWVkaWFBdWRpb1NhbXBsZVR5cGUgdHlwZSkgewotICBzd2l0Y2ggKHR5cGUpIHsKLSNpZiBTQl9IQVNfUVVJUksoU1VQUE9SVF9JTlQxNl9BVURJT19TQU1QTEVTKQotICAgIGNhc2Uga1NiTWVkaWFBdWRpb1NhbXBsZVR5cGVJbnQxNjoKLSAgICAgIHJldHVybiBXQVZFX0ZPUk1BVF9QQ007Ci0jZW5kaWYgIC8vIFNCX0hBU19RVUlSSyhTVVBQT1JUX0lOVDE2X0FVRElPX1NBTVBMRVMpCi0gICAgY2FzZSBrU2JNZWRpYUF1ZGlvU2FtcGxlVHlwZUZsb2F0MzI6Ci0gICAgICByZXR1cm4gV0FWRV9GT1JNQVRfSUVFRV9GTE9BVDsKLSAgICBkZWZhdWx0OgotICAgICAgU0JfTk9UUkVBQ0hFRCgpOwotICAgICAgcmV0dXJuIDA7Ci0gIH0KLX0KLQotV09SRCBTYW1wbGVUeXBlVG9CaXRzUGVyU2FtcGxlKFNiTWVkaWFBdWRpb1NhbXBsZVR5cGUgdHlwZSkgewotICBzd2l0Y2ggKHR5cGUpIHsKLSNpZiBTQl9IQVNfUVVJUksoU1VQUE9SVF9JTlQxNl9BVURJT19TQU1QTEVTKQotICAgIGNhc2Uga1NiTWVkaWFBdWRpb1NhbXBsZVR5cGVJbnQxNjoKLSAgICAgIHJldHVybiAxNjsKLSNlbmRpZiAgLy8gU0JfSEFTX1FVSVJLKFNVUFBPUlRfSU5UMTZfQVVESU9fU0FNUExFUykKLSAgICBjYXNlIGtTYk1lZGlhQXVkaW9TYW1wbGVUeXBlRmxvYXQzMjoKLSAgICAgIHJldHVybiAzMjsKLSAgICBkZWZhdWx0OgotICAgICAgU0JfTk9UUkVBQ0hFRCgpOwotICAgICAgcmV0dXJuIDA7Ci0gIH0KLX0KLQotY2xhc3MgWEF1ZGlvQXVkaW9TaW5rVHlwZTsKLQotY2xhc3MgWEF1ZGlvQXVkaW9TaW5rIDogcHVibGljIFNiQXVkaW9TaW5rUHJpdmF0ZSB7Ci0gcHVibGljOgotICBYQXVkaW9BdWRpb1NpbmsoWEF1ZGlvQXVkaW9TaW5rVHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgIElYQXVkaW8yU291cmNlVm9pY2UqIHNvdXJjZV92b2ljZSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IFdBVkVGT1JNQVRFWCYgd2Z4LAotICAgICAgICAgICAgICAgICAgU2JBdWRpb1NpbmtGcmFtZUJ1ZmZlcnMgZnJhbWVfYnVmZmVycywKLSAgICAgICAgICAgICAgICAgIGludCBmcmFtZV9idWZmZXJzX3NpemVfaW5fZnJhbWVzLAotICAgICAgICAgICAgICAgICAgU2JBdWRpb1NpbmtVcGRhdGVTb3VyY2VTdGF0dXNGdW5jIHVwZGF0ZV9zb3VyY2Vfc3RhdHVzX2Z1bmMsCi0gICAgICAgICAgICAgICAgICBTYkF1ZGlvU2lua0NvbnN1bWVGcmFtZXNGdW5jIGNvbnN1bWVfZnJhbWVfZnVuYywKLSAgICAgICAgICAgICAgICAgIHZvaWQqIGNvbnRleHQpOwotICB+WEF1ZGlvQXVkaW9TaW5rKCkgb3ZlcnJpZGUge30KLQotICBib29sIElzVHlwZShUeXBlKiB0eXBlKSBvdmVycmlkZTsKLSAgdm9pZCBTZXRQbGF5YmFja1JhdGUoZG91YmxlIHBsYXliYWNrX3JhdGUpIG92ZXJyaWRlIHsKLSAgICBTQl9EQ0hFQ0socGxheWJhY2tfcmF0ZSA+PSAwLjApOwotICAgIGlmIChwbGF5YmFja19yYXRlICE9IDAuMCAmJiBwbGF5YmFja19yYXRlICE9IDEuMCkgewotICAgICAgU0JfTk9USU1QTEVNRU5URUQoKSA8PCAiVE9ETzogT25seSBwbGF5YmFjayByYXRlcyBvZiAwLjAgYW5kIDEuMCBhcmUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3VycmVudGx5IHN1cHBvcnRlZC4iOwotICAgICAgcGxheWJhY2tfcmF0ZSA9IChwbGF5YmFja19yYXRlID4gMC4wKSA/IDEuMCA6IDAuMDsKLSAgICB9Ci0gICAgU2NvcGVkTG9jayBsb2NrKG11dGV4Xyk7Ci0gICAgcGxheWJhY2tfcmF0ZV8gPSBwbGF5YmFja19yYXRlOwotICB9Ci0gIHZvaWQgU2V0Vm9sdW1lKGRvdWJsZSB2b2x1bWUpIG92ZXJyaWRlIHsKLSAgICBTY29wZWRMb2NrIGxvY2sobXV0ZXhfKTsKLSAgICB2b2x1bWVfID0gdm9sdW1lOwotICB9Ci0gIHZvaWQgUHJvY2VzcygpOwotCi0gIHZvaWQgU3RvcENhbGxiYWNrcygpIHsKLSAgICBTYkF0b21pY0JhcnJpZXJfSW5jcmVtZW50KCZzdG9wX2NhbGxiYWNrc18sIDEpOwotICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGFueSBjYWxsIHRvIFByb2Nlc3MoKSByZXR1cm5zIHNvIHdlIGtub3cgdGhhdAotICAgIC8vIG5vIGZ1dHVyZSBjYWxsYmFja3Mgd2lsbCBiZSBpbnZva2VkLgotICAgIHByb2Nlc3NfbXV0ZXhfLkFjcXVpcmUoKTsKLSAgICBwcm9jZXNzX211dGV4Xy5SZWxlYXNlKCk7Ci0KLSAgICAvLyBUaGlzIG11c3QgaGFwcGVuIG9uIGEgbm9uLVhBdWRpbyBjYWxsYmFjayB0aHJlYWQuCi0gICAgc291cmNlX3ZvaWNlXy0+RGVzdHJveVZvaWNlKCk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGJvb2wgQXJlQ2FsbGJhY2tzU3RvcHBlZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gU2JBdG9taWNBY3F1aXJlX0xvYWQoJnN0b3BfY2FsbGJhY2tzXykgIT0gMDsKLSAgfQotICB2b2lkIFN1Ym1pdFNvdXJjZUJ1ZmZlcihpbnQgb2Zmc2V0X2luX2ZyYW1lcywgaW50IGNvdW50X2ZyYW1lcyk7Ci0KLSAgLy8gSWYgdHJ1ZSwgdGhpcyBpbnN0YW5jZSdzIHNvdXJjZV92b2ljZV8gaGFzIGJlZW4gZGVzdHJveWVkIGFuZAotICAvLyBmdXR1cmUgUHJvY2VzcygpIGNhbGxzIHNob3VsZCByZXR1cm4gaW1tZWRpYXRlbHkuCi0gIFNiQXRvbWljMzIgc3RvcF9jYWxsYmFja3NfOwotCi0gIFhBdWRpb0F1ZGlvU2lua1R5cGUqIGNvbnN0IHR5cGVfOwotICBjb25zdCBTYkF1ZGlvU2lua1VwZGF0ZVNvdXJjZVN0YXR1c0Z1bmMgdXBkYXRlX3NvdXJjZV9zdGF0dXNfZnVuY187Ci0gIGNvbnN0IFNiQXVkaW9TaW5rQ29uc3VtZUZyYW1lc0Z1bmMgY29uc3VtZV9mcmFtZV9mdW5jXzsKLSAgdm9pZCogY29uc3QgY29udGV4dF87Ci0KLSAgU2JBdWRpb1NpbmtGcmFtZUJ1ZmZlcnMgZnJhbWVfYnVmZmVyc187Ci0gIGNvbnN0IGludCBmcmFtZV9idWZmZXJzX3NpemVfaW5fZnJhbWVzXzsKLSAgY29uc3QgV0FWRUZPUk1BVEVYIHdmeF87Ci0KLSAgLy8gTm90ZTogZGVzcGl0ZSBzb21lIGRvY3VtZW50YXRpb24gdG8gdGhlIGNvbnRyYXJ5LCBpdCBhcHBlYXJzCi0gIC8vIHRoYXQgSVhBdWRpbzJTb3VyY2VWb2ljZSBjYW5ub3QgYmUgYSBDb21QdHIuCi0gIElYQXVkaW8yU291cmNlVm9pY2UqIHNvdXJjZV92b2ljZV87Ci0KLSAgLy8gfHByb2Nlc3NfbXV0ZXhffCBpcyBoZWxkIGR1cmluZyBQcm9jZXNzLiBPdGhlcnMgbWF5IHJhcGlkbHkKLSAgLy8gYWNxdWlyZS9yZWxlYXNlIHRvIGVuc3VyZSB0aGV5IHdhaXQgdW50aWwgdGhlIGN1cnJlbnQgUHJvY2VzcygpIGVuZHMuCi0gIE11dGV4IHByb2Nlc3NfbXV0ZXhfOwotICAvLyB8bXV0ZXhffCBwcm90ZWN0cyB8cGxheWJhY2tfcmF0ZV98IGFuZCB8dm9sdW1lX3wuCi0gIE11dGV4IG11dGV4XzsKLSAgZG91YmxlIHBsYXliYWNrX3JhdGVfOwotICBkb3VibGUgdm9sdW1lXzsKLSAgLy8gVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgYXJlIG9ubHkgdXNlZCBpbnNpZGUgUHJvY2VzcygpLiAgVG8ga2VlcCBpdCBpbiB0aGUKLSAgLy8gY2xhc3Mgc2ltcGx5IHRvIGFsbG93IHRoZW0gdG8gYmUga2VwdCBiZXR3ZWVuIFByb2Nlc3MoKSBjYWxscy4KLSAgaW50IHN1Ym1pdGVkX2ZyYW1lc187Ci0gIGludCBzYW1wbGVzX3BsYXllZF87Ci0gIGludCBxdWV1ZWRfYnVmZmVyc187Ci0gIGJvb2wgd2FzX3BsYXlpbmdfOwotICBkb3VibGUgY3VycmVudF92b2x1bWVfOwotfTsKLQotY2xhc3MgWEF1ZGlvQXVkaW9TaW5rVHlwZSA6IHB1YmxpYyBTYkF1ZGlvU2lua1ByaXZhdGU6OlR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBJWEF1ZGlvMkVuZ2luZUNhbGxiYWNrIHsKLSBwdWJsaWM6Ci0gIFhBdWRpb0F1ZGlvU2lua1R5cGUoKTsKLQotICBTYkF1ZGlvU2luayBDcmVhdGUoCi0gICAgICBpbnQgY2hhbm5lbHMsCi0gICAgICBpbnQgc2FtcGxpbmdfZnJlcXVlbmN5X2h6LAotICAgICAgU2JNZWRpYUF1ZGlvU2FtcGxlVHlwZSBhdWRpb19zYW1wbGVfdHlwZSwKLSAgICAgIFNiTWVkaWFBdWRpb0ZyYW1lU3RvcmFnZVR5cGUgYXVkaW9fZnJhbWVfc3RvcmFnZV90eXBlLAotICAgICAgU2JBdWRpb1NpbmtGcmFtZUJ1ZmZlcnMgZnJhbWVfYnVmZmVycywKLSAgICAgIGludCBmcmFtZV9idWZmZXJzX3NpemVfaW5fZnJhbWVzLAotICAgICAgU2JBdWRpb1NpbmtVcGRhdGVTb3VyY2VTdGF0dXNGdW5jIHVwZGF0ZV9zb3VyY2Vfc3RhdHVzX2Z1bmMsCi0gICAgICBTYkF1ZGlvU2lua0NvbnN1bWVGcmFtZXNGdW5jIGNvbnN1bWVfZnJhbWVzX2Z1bmMsCi0gICAgICB2b2lkKiBjb250ZXh0KTsKLQotICBib29sIElzVmFsaWQoU2JBdWRpb1NpbmsgYXVkaW9fc2luaykgb3ZlcnJpZGUgewotICAgIHJldHVybiBhdWRpb19zaW5rICE9IGtTYkF1ZGlvU2lua0ludmFsaWQgJiYgYXVkaW9fc2luay0+SXNUeXBlKHRoaXMpOwotICB9Ci0KLSAgdm9pZCBEZXN0cm95KFNiQXVkaW9TaW5rIGF1ZGlvX3NpbmspIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgLy8gSVhBdWRpbzJFbmdpbmVDYWxsYmFjayBtZXRob2RzCi0gIC8vIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgcGVyaW9kaWNhbGx5IHdpdGggYW4gaW50ZXJ2YWwgb2YgfjEwbXMuCi0gIHZvaWQgT25Qcm9jZXNzaW5nUGFzc1N0YXJ0KCkgb3ZlcnJpZGU7Ci0gIHZvaWQgT25Qcm9jZXNzaW5nUGFzc0VuZCgpIG92ZXJyaWRlIHt9Ci0gIHZvaWQgT25Dcml0aWNhbEVycm9yKEhSRVNVTFQpIG92ZXJyaWRlIHt9Ci0KLSAgQ29tUHRyPElYQXVkaW8yPiB4X2F1ZGlvMl87Ci0gIElYQXVkaW8yTWFzdGVyaW5nVm9pY2UqIG1hc3RlcmluZ192b2ljZV87Ci0KLSAgLy8gVGhpcyBtdXRleCBwcm90ZWN0cyB8YXVkaW9fc2lua3NfdG9fYWRkX3wgYW5kIHxhdWRpb19zaW5rc190b19kZWxldGVffC4KLSAgTXV0ZXggbXV0ZXhfOwotICBzdGQ6OnZlY3RvcjxYQXVkaW9BdWRpb1NpbmsqPiBhdWRpb19zaW5rc190b19hZGRfOwotICBzdGQ6OnZlY3RvcjxTYkF1ZGlvU2luaz4gYXVkaW9fc2lua3NfdG9fZGVsZXRlXzsKLQotICAvLyBUaGlzIG11c3Qgb25seSBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBPblByb2Nlc3NpbmdQYXNzU3RhcnQgY2FsbGJhY2sKLSAgc3RkOjp2ZWN0b3I8WEF1ZGlvQXVkaW9TaW5rKj4gYXVkaW9fc2lua3Nfb25feGF1ZGlvX2NhbGxiYWNrc187Ci19OwotCi1YQXVkaW9BdWRpb1Npbms6OlhBdWRpb0F1ZGlvU2luaygKLSAgICBYQXVkaW9BdWRpb1NpbmtUeXBlKiB0eXBlLAotICAgIElYQXVkaW8yU291cmNlVm9pY2UqIHNvdXJjZV92b2ljZSwKLSAgICBjb25zdCBXQVZFRk9STUFURVgmIHdmeCwKLSAgICBTYkF1ZGlvU2lua0ZyYW1lQnVmZmVycyBmcmFtZV9idWZmZXJzLAotICAgIGludCBmcmFtZV9idWZmZXJzX3NpemVfaW5fZnJhbWVzLAotICAgIFNiQXVkaW9TaW5rVXBkYXRlU291cmNlU3RhdHVzRnVuYyB1cGRhdGVfc291cmNlX3N0YXR1c19mdW5jLAotICAgIFNiQXVkaW9TaW5rQ29uc3VtZUZyYW1lc0Z1bmMgY29uc3VtZV9mcmFtZV9mdW5jLAotICAgIHZvaWQqIGNvbnRleHQpCi0gICAgOiBzdG9wX2NhbGxiYWNrc18oMCksCi0gICAgICB0eXBlXyh0eXBlKSwKLSAgICAgIHNvdXJjZV92b2ljZV8oc291cmNlX3ZvaWNlKSwKLSAgICAgIHVwZGF0ZV9zb3VyY2Vfc3RhdHVzX2Z1bmNfKHVwZGF0ZV9zb3VyY2Vfc3RhdHVzX2Z1bmMpLAotICAgICAgY29uc3VtZV9mcmFtZV9mdW5jXyhjb25zdW1lX2ZyYW1lX2Z1bmMpLAotICAgICAgY29udGV4dF8oY29udGV4dCksCi0gICAgICBmcmFtZV9idWZmZXJzXyhmcmFtZV9idWZmZXJzKSwKLSAgICAgIGZyYW1lX2J1ZmZlcnNfc2l6ZV9pbl9mcmFtZXNfKGZyYW1lX2J1ZmZlcnNfc2l6ZV9pbl9mcmFtZXMpLAotICAgICAgd2Z4Xyh3ZngpLAotICAgICAgcGxheWJhY2tfcmF0ZV8oMS4wKSwKLSAgICAgIHZvbHVtZV8oMS4wKSwKLSAgICAgIHN1Ym1pdGVkX2ZyYW1lc18oMCksCi0gICAgICBzYW1wbGVzX3BsYXllZF8oMCksCi0gICAgICBxdWV1ZWRfYnVmZmVyc18oMCksCi0gICAgICB3YXNfcGxheWluZ18oZmFsc2UpLAotICAgICAgY3VycmVudF92b2x1bWVfKDEuMCkgewotICBDSEVDS19IUkVTVUxUX09LKHNvdXJjZV92b2ljZV8tPlN0b3AoMCkpOwotfQotCi1ib29sIFhBdWRpb0F1ZGlvU2luazo6SXNUeXBlKFR5cGUqIHR5cGUpIHsKLSAgcmV0dXJuIHR5cGVfID09IHR5cGU7Ci19Ci0KLXZvaWQgWEF1ZGlvQXVkaW9TaW5rOjpQcm9jZXNzKCkgewotICBTY29wZWRMb2NrIHByb2Nlc3NfbG9jayhwcm9jZXNzX211dGV4Xyk7Ci0gIGlmIChBcmVDYWxsYmFja3NTdG9wcGVkKCkpIHsKLSAgICAvLyBXZSBtdXN0IG5vdCBjb250aW51ZSBpbiB0aGlzIGNhc2UsIHNpbmNlIHxzb3VyY2Vfdm9pY2VffCBoYXMgYmVlbgotICAgIC8vIGRlc3Ryb3llZC4KLSAgICByZXR1cm47Ci0gIH0KLSAgaW50IGZyYW1lc19pbl9idWZmZXIsIG9mZnNldF9pbl9mcmFtZXM7Ci0gIGJvb2wgaXNfcGxheWluZywgaXNfZW9zX3JlYWNoZWQ7Ci0gIGJvb2wgaXNfcGxheWJhY2tfcmF0ZV96ZXJvID0gZmFsc2U7Ci0gIGJvb2wgc2hvdWxkX3NldF92b2x1bWUgPSBmYWxzZTsKLQotICAvLyBUaGlzIGZ1bmN0aW9uIGlzIHJ1biBvbiB0aGUgWEF1ZGlvIHRocmVhZCBhbmQgc2hvdWxkbid0IGJlIGJsb2NrZWQuCi0gIGlmIChtdXRleF8uQWNxdWlyZVRyeSgpKSB7Ci0gICAgaXNfcGxheWJhY2tfcmF0ZV96ZXJvID0gcGxheWJhY2tfcmF0ZV8gPT0gMC4wOwotICAgIHNob3VsZF9zZXRfdm9sdW1lID0gY3VycmVudF92b2x1bWVfICE9IHZvbHVtZV87Ci0gICAgY3VycmVudF92b2x1bWVfID0gdm9sdW1lXzsKLSAgICBtdXRleF8uUmVsZWFzZSgpOwotICB9Ci0KLSAgaWYgKHNob3VsZF9zZXRfdm9sdW1lKSB7Ci0gICAgQ0hFQ0tfSFJFU1VMVF9PSyhzb3VyY2Vfdm9pY2VfLT5TZXRWb2x1bWUoY3VycmVudF92b2x1bWVfKSk7Ci0gIH0KLQotICB1cGRhdGVfc291cmNlX3N0YXR1c19mdW5jXygmZnJhbWVzX2luX2J1ZmZlciwgJm9mZnNldF9pbl9mcmFtZXMsICZpc19wbGF5aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXNfZW9zX3JlYWNoZWQsIGNvbnRleHRfKTsKLSAgaWYgKGlzX3BsYXliYWNrX3JhdGVfemVybykgewotICAgIGlzX3BsYXlpbmcgPSBmYWxzZTsKLSAgfQotCi0gIGlmIChpc19wbGF5aW5nICE9IHdhc19wbGF5aW5nXykgewotICAgIGlmIChpc19wbGF5aW5nKSB7Ci0gICAgICBDSEVDS19IUkVTVUxUX09LKHNvdXJjZV92b2ljZV8tPlN0YXJ0KDApKTsKLSAgICB9IGVsc2UgewotICAgICAgQ0hFQ0tfSFJFU1VMVF9PSyhzb3VyY2Vfdm9pY2VfLT5TdG9wKDApKTsKLSAgICB9Ci0gIH0KLSAgd2FzX3BsYXlpbmdfID0gaXNfcGxheWluZzsKLQotICAvLyBUT0RPOiBtYWtlIHN1cmUgdGhhdCBmcmFtZXNfaW5fYnVmZmVyIGlzIGxhcmdlIGVub3VnaAotICAvLyB0aGF0IGl0IGV4Y2VlZHMgdGhlIHZvaWNlIHN0YXRlIHBvb2wgaW50ZXJ2YWwKLSAgaWYgKCFpc19wbGF5aW5nIHx8IGZyYW1lc19pbl9idWZmZXIgPT0gMCB8fCBpc19wbGF5YmFja19yYXRlX3plcm8pIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgaW50IHVuc3VibWl0dGVkX2ZyYW1lcyA9IGZyYW1lc19pbl9idWZmZXIgLSBzdWJtaXRlZF9mcmFtZXNfOwotICBpbnQgdW5zdWJtaXR0ZWRfc3RhcnQgPQotICAgICAgKG9mZnNldF9pbl9mcmFtZXMgKyBzdWJtaXRlZF9mcmFtZXNfKSAlIGZyYW1lX2J1ZmZlcnNfc2l6ZV9pbl9mcmFtZXNfOwotICBpZiAodW5zdWJtaXR0ZWRfZnJhbWVzID09IDAgfHwgcXVldWVkX2J1ZmZlcnNfICsga01heEJ1ZmZlcnNTdWJtaXR0ZWRQZXJMb29wID4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYQVVESU8yX01BWF9RVUVVRURfQlVGRkVSUykgewotICAgIC8vIHN1Ym1pdCBub3RoaW5nCi0gIH0gZWxzZSBpZiAodW5zdWJtaXR0ZWRfc3RhcnQgKyB1bnN1Ym1pdHRlZF9mcmFtZXMgPD0KLSAgICAgICAgICAgICBmcmFtZV9idWZmZXJzX3NpemVfaW5fZnJhbWVzXykgewotICAgIFN1Ym1pdFNvdXJjZUJ1ZmZlcih1bnN1Ym1pdHRlZF9zdGFydCwgdW5zdWJtaXR0ZWRfZnJhbWVzKTsKLSAgfSBlbHNlIHsKLSAgICBpbnQgY291bnRfdGFpbF9mcmFtZXMgPSBmcmFtZV9idWZmZXJzX3NpemVfaW5fZnJhbWVzXyAtIHVuc3VibWl0dGVkX3N0YXJ0OwotICAgIC8vIE5vdGUgc2luY2Ugd2UgY2FuIHN1Ym1pdCB1cCB0byB0d28gc291cmNlIGJ1ZmZlcnMgYXQgYSB0aW1lLAotICAgIC8vIGtNYXhCdWZmZXJzU3VibWl0dGVkUGVyTG9vcCA9IDIuCi0gICAgU3VibWl0U291cmNlQnVmZmVyKHVuc3VibWl0dGVkX3N0YXJ0LCBjb3VudF90YWlsX2ZyYW1lcyk7Ci0gICAgU3VibWl0U291cmNlQnVmZmVyKDAsIHVuc3VibWl0dGVkX2ZyYW1lcyAtIGNvdW50X3RhaWxfZnJhbWVzKTsKLSAgfQotICBzdWJtaXRlZF9mcmFtZXNfID0gZnJhbWVzX2luX2J1ZmZlcjsKLQotICBYQVVESU8yX1ZPSUNFX1NUQVRFIHZvaWNlX3N0YXRlOwotICBzb3VyY2Vfdm9pY2VfLT5HZXRTdGF0ZSgmdm9pY2Vfc3RhdGUpOwotCi0gIGludDY0X3QgY29uc3VtZWRfZnJhbWVzID0gdm9pY2Vfc3RhdGUuU2FtcGxlc1BsYXllZCAtIHNhbXBsZXNfcGxheWVkXzsKLSAgU0JfRENIRUNLKGNvbnN1bWVkX2ZyYW1lcyA+PSAwKTsKLSAgU0JfRENIRUNLKGNvbnN1bWVkX2ZyYW1lcyA8PSBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCgpKTsKLSAgaW50IGNvbnN1bWVkX2ZyYW1lc19pbnQgPSBzdGF0aWNfY2FzdDxpbnQ+KGNvbnN1bWVkX2ZyYW1lcyk7Ci0KLSAgY29uc3VtZV9mcmFtZV9mdW5jXyhjb25zdW1lZF9mcmFtZXNfaW50LCBjb250ZXh0Xyk7Ci0gIHN1Ym1pdGVkX2ZyYW1lc18gLT0gY29uc3VtZWRfZnJhbWVzX2ludDsKLSAgc2FtcGxlc19wbGF5ZWRfID0gdm9pY2Vfc3RhdGUuU2FtcGxlc1BsYXllZDsKLSAgcXVldWVkX2J1ZmZlcnNfID0gdm9pY2Vfc3RhdGUuQnVmZmVyc1F1ZXVlZDsKLX0KLQotdm9pZCBYQXVkaW9BdWRpb1Npbms6OlN1Ym1pdFNvdXJjZUJ1ZmZlcihpbnQgb2Zmc2V0X2luX2ZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50X2ZyYW1lcykgewotICBYQVVESU8yX0JVRkZFUiBhdWRpb19idWZmZXJfaW5mbzsKLQotICBhdWRpb19idWZmZXJfaW5mby5GbGFncyA9IDA7Ci0gIGF1ZGlvX2J1ZmZlcl9pbmZvLkF1ZGlvQnl0ZXMgPSB3ZnhfLm5DaGFubmVscyAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZV9idWZmZXJzX3NpemVfaW5fZnJhbWVzXyAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2Z4Xy53Qml0c1BlclNhbXBsZSAvIDgpOwotICBhdWRpb19idWZmZXJfaW5mby5wQXVkaW9EYXRhID0gc3RhdGljX2Nhc3Q8Y29uc3QgQllURSo+KGZyYW1lX2J1ZmZlcnNfWzBdKTsKLSAgYXVkaW9fYnVmZmVyX2luZm8uUGxheUJlZ2luID0gb2Zmc2V0X2luX2ZyYW1lczsKLSAgYXVkaW9fYnVmZmVyX2luZm8uUGxheUxlbmd0aCA9IGNvdW50X2ZyYW1lczsKLSAgYXVkaW9fYnVmZmVyX2luZm8uTG9vcEJlZ2luID0gMDsKLSAgYXVkaW9fYnVmZmVyX2luZm8uTG9vcExlbmd0aCA9IDA7Ci0gIGF1ZGlvX2J1ZmZlcl9pbmZvLkxvb3BDb3VudCA9IDA7Ci0gIGF1ZGlvX2J1ZmZlcl9pbmZvLnBDb250ZXh0ID0gbnVsbHB0cjsKLSAgQ0hFQ0tfSFJFU1VMVF9PSyhzb3VyY2Vfdm9pY2VfLT5TdWJtaXRTb3VyY2VCdWZmZXIoJmF1ZGlvX2J1ZmZlcl9pbmZvKSk7Ci19Ci0KLVhBdWRpb0F1ZGlvU2lua1R5cGU6OlhBdWRpb0F1ZGlvU2lua1R5cGUoKSB7Ci0gIENIRUNLX0hSRVNVTFRfT0soWEF1ZGlvMkNyZWF0ZSgmeF9hdWRpbzJfLCAwLCBYQVVESU8yX0RFRkFVTFRfUFJPQ0VTU09SKSk7Ci0KLSNpZiAhZGVmaW5lZChDT0JBTFRfQlVJTERfVFlQRV9HT0xEKQotICBYQVVESU8yX0RFQlVHX0NPTkZJR1VSQVRJT04gZGVidWdfY29uZmlnID0ge307Ci0gIGRlYnVnX2NvbmZpZy5UcmFjZU1hc2sgPSBYQVVESU8yX0xPR19FUlJPUlMgfCBYQVVESU8yX0xPR19XQVJOSU5HUyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBYQVVESU8yX0xPR19JTkZPIHwgWEFVRElPMl9MT0dfREVUQUlMIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFhBVURJTzJfTE9HX1RJTUlORyB8IFhBVURJTzJfTE9HX0xPQ0tTOwotICBkZWJ1Z19jb25maWcuTG9nVGhyZWFkSUQgPSBUUlVFOwotICBkZWJ1Z19jb25maWcuTG9nRmlsZWxpbmUgPSBUUlVFOwotICBkZWJ1Z19jb25maWcuTG9nRnVuY3Rpb25OYW1lID0gVFJVRTsKLSAgZGVidWdfY29uZmlnLkxvZ1RpbWluZyA9IFRSVUU7Ci0gIHhfYXVkaW8yXy0+U2V0RGVidWdDb25maWd1cmF0aW9uKCZkZWJ1Z19jb25maWcsIE5VTEwpOwotI2VuZGlmICAvLyAhZGVmaW5lZChDT0JBTFRfQlVJTERfVFlQRV9HT0xEKQotCi0gIHhfYXVkaW8yXy0+UmVnaXN0ZXJGb3JDYWxsYmFja3ModGhpcyk7Ci0gIENIRUNLX0hSRVNVTFRfT0soeF9hdWRpbzJfLT5DcmVhdGVNYXN0ZXJpbmdWb2ljZSgmbWFzdGVyaW5nX3ZvaWNlXykpOwotfQotCi1TYkF1ZGlvU2luayBYQXVkaW9BdWRpb1NpbmtUeXBlOjpDcmVhdGUoCi0gICAgaW50IGNoYW5uZWxzLAotICAgIGludCBzYW1wbGluZ19mcmVxdWVuY3lfaHosCi0gICAgU2JNZWRpYUF1ZGlvU2FtcGxlVHlwZSBhdWRpb19zYW1wbGVfdHlwZSwKLSAgICBTYk1lZGlhQXVkaW9GcmFtZVN0b3JhZ2VUeXBlIGF1ZGlvX2ZyYW1lX3N0b3JhZ2VfdHlwZSwKLSAgICBTYkF1ZGlvU2lua0ZyYW1lQnVmZmVycyBmcmFtZV9idWZmZXJzLAotICAgIGludCBmcmFtZV9idWZmZXJzX3NpemVfaW5fZnJhbWVzLAotICAgIFNiQXVkaW9TaW5rVXBkYXRlU291cmNlU3RhdHVzRnVuYyB1cGRhdGVfc291cmNlX3N0YXR1c19mdW5jLAotICAgIFNiQXVkaW9TaW5rQ29uc3VtZUZyYW1lc0Z1bmMgY29uc3VtZV9mcmFtZXNfZnVuYywKLSAgICB2b2lkKiBjb250ZXh0KSB7Ci0gIFNCX0RDSEVDSyhhdWRpb19mcmFtZV9zdG9yYWdlX3R5cGUgPT0KLSAgICAgICAgICAgIGtTYk1lZGlhQXVkaW9GcmFtZVN0b3JhZ2VUeXBlSW50ZXJsZWF2ZWQpOwotCi0gIFdBVkVGT1JNQVRFWCB3Zng7Ci0KLSAgd2Z4LndGb3JtYXRUYWcgPSBTYW1wbGVUeXBlVG9Gb3JtYXRUYWcoYXVkaW9fc2FtcGxlX3R5cGUpOwotICB3ZngubkNoYW5uZWxzID0gc3RhdGljX2Nhc3Q8V09SRD4oY2hhbm5lbHMpOwotICB3ZngublNhbXBsZXNQZXJTZWMgPSBzYW1wbGluZ19mcmVxdWVuY3lfaHo7Ci0gIHdmeC5uQXZnQnl0ZXNQZXJTZWMgPSBjaGFubmVscyAqCi0gICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVUeXBlVG9CaXRzUGVyU2FtcGxlKGF1ZGlvX3NhbXBsZV90eXBlKSAqCi0gICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ19mcmVxdWVuY3lfaHogLyA4OwotICB3Zngud0JpdHNQZXJTYW1wbGUgPSBTYW1wbGVUeXBlVG9CaXRzUGVyU2FtcGxlKGF1ZGlvX3NhbXBsZV90eXBlKTsKLSAgd2Z4Lm5CbG9ja0FsaWduID0gc3RhdGljX2Nhc3Q8V09SRD4oKGNoYW5uZWxzICogd2Z4LndCaXRzUGVyU2FtcGxlKSAvIDgpOwotICB3ZnguY2JTaXplID0gMDsKLQotICBJWEF1ZGlvMlNvdXJjZVZvaWNlKiBzb3VyY2Vfdm9pY2U7Ci0gIENIRUNLX0hSRVNVTFRfT0soeF9hdWRpbzJfLT5DcmVhdGVTb3VyY2VWb2ljZSgmc291cmNlX3ZvaWNlLCAmd2Z4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEFVRElPMl9WT0lDRV9OT1BJVENILCAxLmYpKTsKLQotICBYQXVkaW9BdWRpb1NpbmsqIGF1ZGlvX3NpbmsgPSBuZXcgWEF1ZGlvQXVkaW9TaW5rKAotICAgICAgdGhpcywgc291cmNlX3ZvaWNlLCB3ZngsIGZyYW1lX2J1ZmZlcnMsIGZyYW1lX2J1ZmZlcnNfc2l6ZV9pbl9mcmFtZXMsCi0gICAgICB1cGRhdGVfc291cmNlX3N0YXR1c19mdW5jLCBjb25zdW1lX2ZyYW1lc19mdW5jLCBjb250ZXh0KTsKLQotICBTY29wZWRMb2NrIGxvY2sobXV0ZXhfKTsKLSAgYXVkaW9fc2lua3NfdG9fYWRkXy5wdXNoX2JhY2soYXVkaW9fc2luayk7Ci0gIHJldHVybiBhdWRpb19zaW5rOwotfQotCi12b2lkIFhBdWRpb0F1ZGlvU2lua1R5cGU6OkRlc3Ryb3koU2JBdWRpb1NpbmsgYXVkaW9fc2luaykgewotICBpZiAoYXVkaW9fc2luayA9PSBrU2JBdWRpb1NpbmtJbnZhbGlkKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmICghSXNWYWxpZChhdWRpb19zaW5rKSkgewotICAgIFNCX0xPRyhXQVJOSU5HKSA8PCAiYXVkaW9fc2luayBpcyBpbnZhbGlkLiI7Ci0gICAgcmV0dXJuOwotICB9Ci0gIC8vIFByZXZpb3VzIHZlcnNpb25zIG9mIHRoaXMgY29kZSB3YWl0ZWQgZm9yIHRoZSBuZXh0IE9uUHJvY2Vzc2luZ1Bhc3NTdGFydCgpCi0gIC8vIGNhbGwgdG8gb2NjdXIgYmVmb3JlIHJldHVybmluZy4gSG93ZXZlciwgdmFyaW91cyBjaXJjdW1zdGFuY2VzIGNvdWxkCi0gIC8vIGNhdXNlIHRoYXQgbmV2ZXIgdG8gaGFwcGVuLCBlc3BlY2lhbGx5IGR1cmluZyBVV1Agc3VzcGVuZC4KLSAgLy8gSW5zdGVhZCwgd2UgcmV0dXJuIGltbWVkaWF0ZWx5LCBlbnN1cmluZyBubyBTYkF1ZGlvU2luayBjYWxsYmFja3Mgb2NjdXIKLSAgLy8gYW5kIHBvc3Rwb25lIHRoZSBkZWxldGUgaXRzZWxmIHVudGlsIHRoZSBuZXh0IE9uUHJvY2Vzc2luZ1Bhc3NTdGFydCgpCi0gIHN0YXRpY19jYXN0PFhBdWRpb0F1ZGlvU2luayo+KGF1ZGlvX3NpbmspLT5TdG9wQ2FsbGJhY2tzKCk7Ci0KLSAgU2NvcGVkTG9jayBsb2NrKG11dGV4Xyk7Ci0gIGF1ZGlvX3NpbmtzX3RvX2RlbGV0ZV8ucHVzaF9iYWNrKGF1ZGlvX3NpbmspOwotfQotCi12b2lkIFhBdWRpb0F1ZGlvU2lua1R5cGU6Ok9uUHJvY2Vzc2luZ1Bhc3NTdGFydCgpIHsKLSAgaWYgKG11dGV4Xy5BY3F1aXJlVHJ5KCkpIHsKLSAgICBpZiAoIWF1ZGlvX3NpbmtzX3RvX2FkZF8uZW1wdHkoKSkgewotICAgICAgYXVkaW9fc2lua3Nfb25feGF1ZGlvX2NhbGxiYWNrc18uaW5zZXJ0KAotICAgICAgICAgIGF1ZGlvX3NpbmtzX29uX3hhdWRpb19jYWxsYmFja3NfLmVuZCgpLCBhdWRpb19zaW5rc190b19hZGRfLmJlZ2luKCksCi0gICAgICAgICAgYXVkaW9fc2lua3NfdG9fYWRkXy5lbmQoKSk7Ci0gICAgICBhdWRpb19zaW5rc190b19hZGRfLmNsZWFyKCk7Ci0gICAgfQotICAgIGlmICghYXVkaW9fc2lua3NfdG9fZGVsZXRlXy5lbXB0eSgpKSB7Ci0gICAgICBmb3IgKGF1dG8gc2luayA6IGF1ZGlvX3NpbmtzX3RvX2RlbGV0ZV8pIHsKLSAgICAgICAgYXVkaW9fc2lua3Nfb25feGF1ZGlvX2NhbGxiYWNrc18uZXJhc2UoCi0gICAgICAgICAgICBzdGQ6OmZpbmQoYXVkaW9fc2lua3Nfb25feGF1ZGlvX2NhbGxiYWNrc18uYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zaW5rc19vbl94YXVkaW9fY2FsbGJhY2tzXy5lbmQoKSwgc2luaykpOwotICAgICAgICBkZWxldGUgc2luazsKLSAgICAgIH0KLSAgICAgIGF1ZGlvX3NpbmtzX3RvX2RlbGV0ZV8uY2xlYXIoKTsKLSAgICB9Ci0gICAgbXV0ZXhfLlJlbGVhc2UoKTsKLSAgfQotCi0gIGZvciAoWEF1ZGlvQXVkaW9TaW5rKiBzaW5rIDogYXVkaW9fc2lua3Nfb25feGF1ZGlvX2NhbGxiYWNrc18pIHsKLSAgICBzaW5rLT5Qcm9jZXNzKCk7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlCi19ICAvLyBuYW1lc3BhY2Ugd2luMzIKLX0gIC8vIG5hbWVzcGFjZSBzaGFyZWQKLX0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKLQotbmFtZXNwYWNlIHsKLVNiQXVkaW9TaW5rUHJpdmF0ZTo6VHlwZSogYXVkaW9fc2lua187Ci19ICAvLyBuYW1lc3BhY2UKLQotLy8gc3RhdGljCi12b2lkIFNiQXVkaW9TaW5rUHJpdmF0ZTo6UGxhdGZvcm1Jbml0aWFsaXplKCkgewotICBTQl9EQ0hFQ0soIWF1ZGlvX3NpbmtfKTsKLSAgYXVkaW9fc2lua18gPSBuZXcgc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOjpYQXVkaW9BdWRpb1NpbmtUeXBlKCk7Ci0gIFNldFByaW1hcnlUeXBlKGF1ZGlvX3NpbmtfKTsKLSAgRW5hYmxlRmFsbGJhY2tUb1N0dWIoKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIFNiQXVkaW9TaW5rUHJpdmF0ZTo6UGxhdGZvcm1UZWFyRG93bigpIHsKLSAgU0JfRENIRUNLKGF1ZGlvX3NpbmtfID09IEdldFByaW1hcnlUeXBlKCkpOwotICBTZXRQcmltYXJ5VHlwZShudWxscHRyKTsKLSAgZGVsZXRlIGF1ZGlvX3NpbmtfOwotICBhdWRpb19zaW5rXyA9IG51bGxwdHI7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9hdWRpb19zaW5rX2dldF9tYXhfY2hhbm5lbHMuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9hdWRpb19zaW5rX2dldF9tYXhfY2hhbm5lbHMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwZDdmOTMuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvYXVkaW9fc2lua19nZXRfbWF4X2NoYW5uZWxzLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9hdWRpb19zaW5rLmgiCi0KLWludCBTYkF1ZGlvU2lua0dldE1heENoYW5uZWxzKCkgewotICByZXR1cm4gNjsKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2F1ZGlvX3NpbmtfZ2V0X25lYXJlc3Rfc3VwcG9ydGVkX3NhbXBsZV9mcmVxdWVuY3kuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9hdWRpb19zaW5rX2dldF9uZWFyZXN0X3N1cHBvcnRlZF9zYW1wbGVfZnJlcXVlbmN5LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWQzNzQwLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2F1ZGlvX3NpbmtfZ2V0X25lYXJlc3Rfc3VwcG9ydGVkX3NhbXBsZV9mcmVxdWVuY3kuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2F1ZGlvX3NpbmsuaCIKLQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLQotaW50IFNiQXVkaW9TaW5rR2V0TmVhcmVzdFN1cHBvcnRlZFNhbXBsZUZyZXF1ZW5jeShpbnQgc2FtcGxpbmdfZnJlcXVlbmN5X2h6KSB7Ci0gIGlmIChzYW1wbGluZ19mcmVxdWVuY3lfaHogPD0gMCkgewotICAgIFNCX0xPRyhFUlJPUikgPDwgIkludmFsaWQgYXVkaW8gc2FtcGxpbmcgZnJlcXVlbmN5ICIKLSAgICAgICAgICAgICAgICAgIDw8IHNhbXBsaW5nX2ZyZXF1ZW5jeV9oejsKLSAgICByZXR1cm4gMTsKLSAgfQotICByZXR1cm4gc2FtcGxpbmdfZnJlcXVlbmN5X2h6OwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvYXVkaW9fc2lua19pc19hdWRpb19mcmFtZV9zdG9yYWdlX3R5cGVfc3VwcG9ydGVkLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvYXVkaW9fc2lua19pc19hdWRpb19mcmFtZV9zdG9yYWdlX3R5cGVfc3VwcG9ydGVkLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmE2MDNhLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2F1ZGlvX3NpbmtfaXNfYXVkaW9fZnJhbWVfc3RvcmFnZV90eXBlX3N1cHBvcnRlZC5jYworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvYXVkaW9fc2luay5oIgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotCi1ib29sIFNiQXVkaW9TaW5rSXNBdWRpb0ZyYW1lU3RvcmFnZVR5cGVTdXBwb3J0ZWQoCi0gICAgU2JNZWRpYUF1ZGlvRnJhbWVTdG9yYWdlVHlwZSBhdWRpb19mcmFtZV9zdG9yYWdlX3R5cGUpIHsKLSAgc3dpdGNoIChhdWRpb19mcmFtZV9zdG9yYWdlX3R5cGUpIHsKLSAgICBjYXNlIGtTYk1lZGlhQXVkaW9GcmFtZVN0b3JhZ2VUeXBlSW50ZXJsZWF2ZWQ6Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBjYXNlIGtTYk1lZGlhQXVkaW9GcmFtZVN0b3JhZ2VUeXBlUGxhbmFyOgotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGRlZmF1bHQ6Ci0gICAgICBTQl9OT1RSRUFDSEVEKCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2F1ZGlvX3NpbmtfaXNfYXVkaW9fc2FtcGxlX3R5cGVfc3VwcG9ydGVkLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvYXVkaW9fc2lua19pc19hdWRpb19zYW1wbGVfdHlwZV9zdXBwb3J0ZWQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmM2M0MTcuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvYXVkaW9fc2lua19pc19hdWRpb19zYW1wbGVfdHlwZV9zdXBwb3J0ZWQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2F1ZGlvX3NpbmsuaCIKLQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLQotYm9vbCBTYkF1ZGlvU2lua0lzQXVkaW9TYW1wbGVUeXBlU3VwcG9ydGVkKAotICAgIFNiTWVkaWFBdWRpb1NhbXBsZVR5cGUgYXVkaW9fc2FtcGxlX3R5cGUpIHsKLSAgc3dpdGNoIChhdWRpb19zYW1wbGVfdHlwZSkgewotI2lmIFNCX0hBU19RVUlSSyhTVVBQT1JUX0lOVDE2X0FVRElPX1NBTVBMRVMpCi0gICAgY2FzZSBrU2JNZWRpYUF1ZGlvU2FtcGxlVHlwZUludDE2OgotICAgICAgcmV0dXJuIHRydWU7Ci0jZW5kaWYgIC8vIFNCX0hBU19RVUlSSyhTVVBQT1JUX0lOVDE2X0FVRElPX1NBTVBMRVMpCi0gICAgY2FzZSBrU2JNZWRpYUF1ZGlvU2FtcGxlVHlwZUZsb2F0MzI6Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBkZWZhdWx0OgotICAgICAgU0JfTk9UUkVBQ0hFRCgpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9hdWRpb190cmFuc2Zvcm0uY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9hdWRpb190cmFuc2Zvcm0uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YzAzYjEuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvYXVkaW9fdHJhbnNmb3JtLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2F1ZGlvX3RyYW5zZm9ybS5oIgotCi0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvZXJyb3JfdXRpbHMuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL21lZGlhX2NvbW1vbi5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvbWVkaWFfZm91bmRhdGlvbl91dGlscy5oIgotCi1uYW1lc3BhY2Ugc3RhcmJvYXJkIHsKLW5hbWVzcGFjZSBzaGFyZWQgewotbmFtZXNwYWNlIHdpbjMyIHsKLQotdXNpbmcgTWljcm9zb2Z0OjpXUkw6OkNvbVB0cjsKLQotbmFtZXNwYWNlIHsKLQotR1VJRCBDb252ZXJ0VG9XaW4zMkF1ZGlvQ29kZWMoU2JNZWRpYUF1ZGlvQ29kZWMgY29kZWMpIHsKLSAgc3dpdGNoIChjb2RlYykgewotICAgIGNhc2Uga1NiTWVkaWFBdWRpb0NvZGVjTm9uZTogewotICAgICAgcmV0dXJuIE1GQXVkaW9Gb3JtYXRfUENNOwotICAgIH0KLSAgICBjYXNlIGtTYk1lZGlhQXVkaW9Db2RlY0FhYzogewotICAgICAgcmV0dXJuIE1GQXVkaW9Gb3JtYXRfQUFDOwotICAgIH0KLSAgICBjYXNlIGtTYk1lZGlhQXVkaW9Db2RlY09wdXM6IHsKLSAgICAgIHJldHVybiBNRkF1ZGlvRm9ybWF0X09wdXM7Ci0gICAgfQotICAgIGRlZmF1bHQ6IHsKLSAgICAgIFNCX05PVElNUExFTUVOVEVEKCk7Ci0gICAgICByZXR1cm4gTUZBdWRpb0Zvcm1hdF9QQ007Ci0gICAgfQotICB9Ci19Ci0KLWNsYXNzIFdpbkF1ZGlvRm9ybWF0IHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFdpbkF1ZGlvRm9ybWF0KGNvbnN0IFNiTWVkaWFBdWRpb0hlYWRlciYgYXVkaW9faGVhZGVyKSB7Ci0gICAgLy8gVGhlIFdBVkVGT1JNQVRFWCBzdHJ1Y3R1cmUgaGFzIG1hbnkgc3BlY2lhbGl6YXRpb25zIHdpdGggdmFyeWluZwotICAgIC8vIGRhdGEgYXR0YWNoZWQgYXQgdGhlIGVuZC4KLSAgICBmb3JtYXRfYnVmZmVyXy5yZXNpemUoc2l6ZW9mKFdBVkVGT1JNQVRFWCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19oZWFkZXIuYXVkaW9fc3BlY2lmaWNfY29uZmlnX3NpemUpOwotICAgIFdBVkVGT1JNQVRFWCogd2F2ZV9mb3JtYXQgPSBXYXZlRm9ybWF0RGF0YSgpOwotCi0gICAgd2F2ZV9mb3JtYXQtPm5BdmdCeXRlc1BlclNlYyA9IGF1ZGlvX2hlYWRlci5hdmVyYWdlX2J5dGVzX3Blcl9zZWNvbmQ7Ci0gICAgd2F2ZV9mb3JtYXQtPm5CbG9ja0FsaWduID0gYXVkaW9faGVhZGVyLmJsb2NrX2FsaWdubWVudDsKLSAgICB3YXZlX2Zvcm1hdC0+bkNoYW5uZWxzID0gYXVkaW9faGVhZGVyLm51bWJlcl9vZl9jaGFubmVsczsKLSAgICB3YXZlX2Zvcm1hdC0+blNhbXBsZXNQZXJTZWMgPSBhdWRpb19oZWFkZXIuc2FtcGxlc19wZXJfc2Vjb25kOwotICAgIHdhdmVfZm9ybWF0LT53Qml0c1BlclNhbXBsZSA9IGF1ZGlvX2hlYWRlci5iaXRzX3Blcl9zYW1wbGU7Ci0gICAgd2F2ZV9mb3JtYXQtPndGb3JtYXRUYWcgPSBhdWRpb19oZWFkZXIuZm9ybWF0X3RhZzsKLSAgICB3YXZlX2Zvcm1hdC0+Y2JTaXplID0gYXVkaW9faGVhZGVyLmF1ZGlvX3NwZWNpZmljX2NvbmZpZ19zaXplOwotCi0gICAgaWYgKGF1ZGlvX2hlYWRlci5hdWRpb19zcGVjaWZpY19jb25maWdfc2l6ZSA+IDApIHsKLSAgICAgIHVpbnQ4X3QqIGNvbmZpZ19kYXRhID0gZm9ybWF0X2J1ZmZlcl8uZGF0YSgpICsgc2l6ZW9mKFdBVkVGT1JNQVRFWCk7Ci0gICAgICBTYk1lbW9yeUNvcHkoY29uZmlnX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgYXVkaW9faGVhZGVyLmF1ZGlvX3NwZWNpZmljX2NvbmZpZywKLSAgICAgICAgICAgICAgICAgICBhdWRpb19oZWFkZXIuYXVkaW9fc3BlY2lmaWNfY29uZmlnX3NpemUpOwotICAgIH0KLSAgfQotCi0gIFdBVkVGT1JNQVRFWCogV2F2ZUZvcm1hdERhdGEoKSB7Ci0gICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8V0FWRUZPUk1BVEVYKj4oZm9ybWF0X2J1ZmZlcl8uZGF0YSgpKTsKLSAgfQotICBVSU5UMzIgU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PFVJTlQzMj4oZm9ybWF0X2J1ZmZlcl8uc2l6ZSgpKTsgfQotCi0gcHJpdmF0ZToKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZm9ybWF0X2J1ZmZlcl87Ci19OwotCi19ICAvLyBuYW1lc3BhY2UuCi0KLXNjb3BlZF9wdHI8TWVkaWFUcmFuc2Zvcm0+IENyZWF0ZUF1ZGlvVHJhbnNmb3JtKAotICAgIGNvbnN0IFNiTWVkaWFBdWRpb0hlYWRlciYgYXVkaW8sCi0gICAgU2JNZWRpYUF1ZGlvQ29kZWMgY29kZWMpIHsKLSAgQ29tUHRyPElNRlRyYW5zZm9ybT4gdHJhbnNmb3JtOwotICBIUkVTVUxUIGhyID0gQ3JlYXRlRGVjb2RlclRyYW5zZm9ybShDTFNJRF9NU0FBQ0RlY01GVCwgJnRyYW5zZm9ybSk7Ci0gIENoZWNrUmVzdWx0KGhyKTsKLQotICBDb21QdHI8SU1GTWVkaWFUeXBlPiBpbnB1dF90eXBlOwotICBociA9IE1GQ3JlYXRlTWVkaWFUeXBlKCZpbnB1dF90eXBlKTsKLSAgQ2hlY2tSZXN1bHQoaHIpOwotCi0gIFdpbkF1ZGlvRm9ybWF0IGF1ZGlvX2ZtdChhdWRpbyk7Ci0gIGhyID0gTUZJbml0TWVkaWFUeXBlRnJvbVdhdmVGb3JtYXRFeCgKLSAgICAgIGlucHV0X3R5cGUuR2V0KCksIGF1ZGlvX2ZtdC5XYXZlRm9ybWF0RGF0YSgpLCBhdWRpb19mbXQuU2l6ZSgpKTsKLQotICBDaGVja1Jlc3VsdChocik7Ci0KLSAgaHIgPSBpbnB1dF90eXBlLT5TZXRVSU5UMzIoTUZfTVRfQUFDX1BBWUxPQURfVFlQRSwgMCk7ICAvLyByYXcgYWFjCi0gIENoZWNrUmVzdWx0KGhyKTsKLQotICBHVUlEIHdpbjMyX2F1ZGlvX3R5cGUgPSBDb252ZXJ0VG9XaW4zMkF1ZGlvQ29kZWMoY29kZWMpOwotICBociA9IGlucHV0X3R5cGUtPlNldEdVSUQoTUZfTVRfU1VCVFlQRSwgd2luMzJfYXVkaW9fdHlwZSk7Ci0gIENoZWNrUmVzdWx0KGhyKTsKLQotICBzdGQ6OnZlY3RvcjxDb21QdHI8SU1GTWVkaWFUeXBlPj4gYXZhaWxhYmxlX3R5cGVzID0KLSAgICAgIEdldEFsbElucHV0TWVkaWFUeXBlcyhNZWRpYVRyYW5zZm9ybTo6a1N0cmVhbUlkLCB0cmFuc2Zvcm0uR2V0KCkpOwotCi0gIGF2YWlsYWJsZV90eXBlcyA9IEZpbHRlck1lZGlhQnlTdWJUeXBlKGF2YWlsYWJsZV90eXBlcywgd2luMzJfYXVkaW9fdHlwZSk7Ci0gIFNCX0RDSEVDSyhhdmFpbGFibGVfdHlwZXMuc2l6ZSgpKTsKLQotICBDb21QdHI8SU1GTWVkaWFUeXBlPiBzZWxlY3RlZCA9IGF2YWlsYWJsZV90eXBlc1swXTsKLSAgc3RkOjp2ZWN0b3I8R1VJRD4gYXR0cmlicyA9IHsKLSAgICAgIE1GX01UX0FVRElPX0JMT0NLX0FMSUdOTUVOVCwgTUZfTVRfQVVESU9fU0FNUExFU19QRVJfU0VDT05ELAotICAgICAgTUZfTVRfQVVESU9fQVZHX0JZVEVTX1BFUl9TRUNPTkQsIE1GX01UX0FVRElPX05VTV9DSEFOTkVMUywKLSAgfTsKLQotICBmb3IgKGF1dG8gaXQgPSBhdHRyaWJzLmJlZ2luKCk7IGl0ICE9IGF0dHJpYnMuZW5kKCk7ICsraXQpIHsKLSAgICBDb3B5VWludDMyUHJvcGVydHkoKml0LCBpbnB1dF90eXBlLkdldCgpLCBzZWxlY3RlZC5HZXQoKSk7Ci0gIH0KLQotICBzY29wZWRfcHRyPE1lZGlhVHJhbnNmb3JtPiBvdXRwdXQobmV3IE1lZGlhVHJhbnNmb3JtKHRyYW5zZm9ybSkpOwotICBvdXRwdXQtPlNldElucHV0VHlwZShzZWxlY3RlZCk7Ci0gIG91dHB1dC0+U2V0T3V0cHV0VHlwZUJ5U3ViVHlwZShNRkF1ZGlvRm9ybWF0X0Zsb2F0KTsKLQotICByZXR1cm4gb3V0cHV0LlBhc3MoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHdpbjMyCi19ICAvLyBuYW1lc3BhY2Ugc2hhcmVkCi19ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9hdWRpb190cmFuc2Zvcm0uaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2F1ZGlvX3RyYW5zZm9ybS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzNiMjNmLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2F1ZGlvX3RyYW5zZm9ybS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBTVEFSQk9BUkRfU0hBUkVEX1dJTjMyX0FVRElPX1RSQU5TRk9STV9IXwotI2RlZmluZSBTVEFSQk9BUkRfU0hBUkVEX1dJTjMyX0FVRElPX1RSQU5TRk9STV9IXwotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2NvbW1vbi9zY29wZWRfcHRyLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lZGlhLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9tZWRpYV90cmFuc2Zvcm0uaCIKLQotbmFtZXNwYWNlIHN0YXJib2FyZCB7Ci1uYW1lc3BhY2Ugc2hhcmVkIHsKLW5hbWVzcGFjZSB3aW4zMiB7Ci0KLXNjb3BlZF9wdHI8TWVkaWFUcmFuc2Zvcm0+IENyZWF0ZUF1ZGlvVHJhbnNmb3JtKAotICAgIGNvbnN0IFNiTWVkaWFBdWRpb0hlYWRlciYgYXVkaW8sCi0gICAgU2JNZWRpYUF1ZGlvQ29kZWMgY29kZWMpOwotCi19ICAvLyBuYW1lc3BhY2Ugd2luMzIKLX0gIC8vIG5hbWVzcGFjZSBzaGFyZWQKLX0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKLQotI2VuZGlmICAvLyBTVEFSQk9BUkRfU0hBUkVEX1dJTjMyX0FVRElPX1RSQU5TRk9STV9IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvYXV0b19ldmVudF9oYW5kbGUuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2F1dG9fZXZlbnRfaGFuZGxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0YzNjY2YuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvYXV0b19ldmVudF9oYW5kbGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpZm5kZWYgU1RBUkJPQVJEX1NIQVJFRF9XSU4zMl9BVVRPX0VWRU5UX0hBTkRMRV9IXwotI2RlZmluZSBTVEFSQk9BUkRfU0hBUkVEX1dJTjMyX0FVVE9fRVZFTlRfSEFORExFX0hfCi0KLSNpbmNsdWRlIDx3aW5zb2NrMi5oPgotCi1uYW1lc3BhY2Ugc3RhcmJvYXJkIHsKLW5hbWVzcGFjZSBzaGFyZWQgewotbmFtZXNwYWNlIHdpbjMyIHsKLQotY2xhc3MgQXV0b0V2ZW50SGFuZGxlIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEF1dG9FdmVudEhhbmRsZShXU0FFVkVOVCBldmVudCkgOiBldmVudF8oZXZlbnQpIHt9Ci0KLSAgfkF1dG9FdmVudEhhbmRsZSgpIHsgQ2xlYW51cEV4aXN0aW5nRXZlbnQoKTsgfQotCi0gIHZvaWQgUmVzZXQoV1NBRVZFTlQgbmV3X2V2ZW50KSB7Ci0gICAgQ2xlYW51cEV4aXN0aW5nRXZlbnQoKTsKLSAgICBldmVudF8gPSBuZXdfZXZlbnQ7Ci0gIH0KLQotICBib29sIElzVmFsaWQoKSBjb25zdCB7IHJldHVybiBldmVudF8gIT0gV1NBX0lOVkFMSURfRVZFTlQ7IH0KLQotICBXU0FFVkVOVCBHZXRFdmVudCgpIHsgcmV0dXJuIGV2ZW50XzsgfQotCi0gcHJpdmF0ZToKLSAgQXV0b0V2ZW50SGFuZGxlKGNvbnN0IEF1dG9FdmVudEhhbmRsZSYpID0gZGVsZXRlOwotICBBdXRvRXZlbnRIYW5kbGUmIG9wZXJhdG9yPShjb25zdCBBdXRvRXZlbnRIYW5kbGUmKSA9IGRlbGV0ZTsKLQotICB2b2lkIENsZWFudXBFeGlzdGluZ0V2ZW50KCkgewotICAgIGlmIChJc1ZhbGlkKCkpIHsKLSAgICAgIFdTQUNsb3NlRXZlbnQoZXZlbnRfKTsKLSAgICAgIGV2ZW50XyA9IFdTQV9JTlZBTElEX0VWRU5UOwotICAgIH0KLSAgfQotCi0gIFdTQUVWRU5UIGV2ZW50XzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSB3aW4zMgotfSAgLy8gbmFtZXNwYWNlIHNoYXJlZAotfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZAotCi0jZW5kaWYgIC8vIFNUQVJCT0FSRF9TSEFSRURfV0lOMzJfQVVUT19FVkVOVF9IQU5ETEVfSF8KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2J5dGVfc3dhcC5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2J5dGVfc3dhcC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVmNGZkOS4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9ieXRlX3N3YXAuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0vLyBOb3QgYnJlYWtpbmcgdGhlc2UgZnVuY3Rpb25zIHVwIGJlY2F1c2UgaG93ZXZlciBvbmUgaXMgaW1wbGVtZW50ZWQsIHRoZQotLy8gb3RoZXJzIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBzaW1pbGFybHkuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvYnl0ZV9zd2FwLmgiCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotaW50MTZfdCBTYkJ5dGVTd2FwUzE2KGludDE2X3QgdmFsdWUpIHsKLSAgcmV0dXJuIF9ieXRlc3dhcF91c2hvcnQodmFsdWUpOwotfQotCi11aW50MTZfdCBTYkJ5dGVTd2FwVTE2KHVpbnQxNl90IHZhbHVlKSB7Ci0gIHJldHVybiBfYnl0ZXN3YXBfdXNob3J0KHZhbHVlKTsKLX0KLQotaW50MzJfdCBTYkJ5dGVTd2FwUzMyKGludDMyX3QgdmFsdWUpIHsKLSAgcmV0dXJuIF9ieXRlc3dhcF91bG9uZyh2YWx1ZSk7Ci19Ci0KLXVpbnQzMl90IFNiQnl0ZVN3YXBVMzIodWludDMyX3QgdmFsdWUpIHsKLSAgcmV0dXJuIF9ieXRlc3dhcF91bG9uZyh2YWx1ZSk7Ci19Ci0KLWludDY0X3QgU2JCeXRlU3dhcFM2NChpbnQ2NF90IHZhbHVlKSB7Ci0gIHJldHVybiBfYnl0ZXN3YXBfdWludDY0KHZhbHVlKTsKLX0KLQotdWludDY0X3QgU2JCeXRlU3dhcFU2NCh1aW50NjRfdCB2YWx1ZSkgewotICByZXR1cm4gX2J5dGVzd2FwX3VpbnQ2NCh2YWx1ZSk7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9jb25kaXRpb25fdmFyaWFibGVfYnJvYWRjYXN0LmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvY29uZGl0aW9uX3ZhcmlhYmxlX2Jyb2FkY2FzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJiOWVhNS4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9jb25kaXRpb25fdmFyaWFibGVfYnJvYWRjYXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9jb25kaXRpb25fdmFyaWFibGUuaCIKLQotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotYm9vbCBTYkNvbmRpdGlvblZhcmlhYmxlQnJvYWRjYXN0KFNiQ29uZGl0aW9uVmFyaWFibGUqIGNvbmRpdGlvbikgewotICBpZiAoIWNvbmRpdGlvbikgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBXYWtlQWxsQ29uZGl0aW9uVmFyaWFibGUocmVpbnRlcnByZXRfY2FzdDxQQ09ORElUSU9OX1ZBUklBQkxFPihjb25kaXRpb24pKTsKLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9jb25kaXRpb25fdmFyaWFibGVfY3JlYXRlLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvY29uZGl0aW9uX3ZhcmlhYmxlX2NyZWF0ZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ3NGE2Zi4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9jb25kaXRpb25fdmFyaWFibGVfY3JlYXRlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9jb25kaXRpb25fdmFyaWFibGUuaCIKLQotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotYm9vbCBTYkNvbmRpdGlvblZhcmlhYmxlQ3JlYXRlKFNiQ29uZGl0aW9uVmFyaWFibGUqIG91dF9jb25kaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JNdXRleCogLypvcHRfbXV0ZXgqLykgewotICBpZiAoIW91dF9jb25kaXRpb24pIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgSW5pdGlhbGl6ZUNvbmRpdGlvblZhcmlhYmxlKAotICAgICAgcmVpbnRlcnByZXRfY2FzdDxQQ09ORElUSU9OX1ZBUklBQkxFPihvdXRfY29uZGl0aW9uKSk7Ci0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvY29uZGl0aW9uX3ZhcmlhYmxlX2Rlc3Ryb3kuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9jb25kaXRpb25fdmFyaWFibGVfZGVzdHJveS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEyNGU0Ny4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9jb25kaXRpb25fdmFyaWFibGVfZGVzdHJveS5jYworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvY29uZGl0aW9uX3ZhcmlhYmxlLmgiCi0KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLWJvb2wgU2JDb25kaXRpb25WYXJpYWJsZURlc3Ryb3koU2JDb25kaXRpb25WYXJpYWJsZSogY29uZGl0aW9uKSB7Ci0gIGlmICghY29uZGl0aW9uKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvY29uZGl0aW9uX3ZhcmlhYmxlX3NpZ25hbC5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2NvbmRpdGlvbl92YXJpYWJsZV9zaWduYWwuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlOGU2N2IuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvY29uZGl0aW9uX3ZhcmlhYmxlX3NpZ25hbC5jYworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvY29uZGl0aW9uX3ZhcmlhYmxlLmgiCi0KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLWJvb2wgU2JDb25kaXRpb25WYXJpYWJsZVNpZ25hbChTYkNvbmRpdGlvblZhcmlhYmxlKiBjb25kaXRpb24pIHsKLSAgaWYgKCFjb25kaXRpb24pIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgV2FrZUNvbmRpdGlvblZhcmlhYmxlKHJlaW50ZXJwcmV0X2Nhc3Q8UENPTkRJVElPTl9WQVJJQUJMRT4oY29uZGl0aW9uKSk7Ci0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvY29uZGl0aW9uX3ZhcmlhYmxlX3dhaXQuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9jb25kaXRpb25fdmFyaWFibGVfd2FpdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIyNGFmYy4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9jb25kaXRpb25fdmFyaWFibGVfd2FpdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvY29uZGl0aW9uX3ZhcmlhYmxlLmgiCi0KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLVNiQ29uZGl0aW9uVmFyaWFibGVSZXN1bHQgU2JDb25kaXRpb25WYXJpYWJsZVdhaXQoCi0gICAgU2JDb25kaXRpb25WYXJpYWJsZSogY29uZGl0aW9uLAotICAgIFNiTXV0ZXgqIG11dGV4KSB7Ci0gIGlmICghY29uZGl0aW9uIHx8ICFtdXRleCkgewotICAgIHJldHVybiBrU2JDb25kaXRpb25WYXJpYWJsZUZhaWxlZDsKLSAgfQotICBib29sIHJlc3VsdCA9IFNsZWVwQ29uZGl0aW9uVmFyaWFibGVTUlcoCi0gICAgICByZWludGVycHJldF9jYXN0PFBDT05ESVRJT05fVkFSSUFCTEU+KGNvbmRpdGlvbiksCi0gICAgICByZWludGVycHJldF9jYXN0PFBTUldMT0NLPihtdXRleCksIElORklOSVRFLCAwKTsKLQotICByZXR1cm4gcmVzdWx0ID8ga1NiQ29uZGl0aW9uVmFyaWFibGVTaWduYWxlZCA6IGtTYkNvbmRpdGlvblZhcmlhYmxlRmFpbGVkOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvY29uZGl0aW9uX3ZhcmlhYmxlX3dhaXRfdGltZWQuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9jb25kaXRpb25fdmFyaWFibGVfd2FpdF90aW1lZC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk2NzY5NS4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9jb25kaXRpb25fdmFyaWFibGVfd2FpdF90aW1lZC5jYworKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvY29uZGl0aW9uX3ZhcmlhYmxlLmgiCi0KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RpbWVfdXRpbHMuaCIKLQotdXNpbmcgc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOjpDb252ZXJ0U2JUaW1lVG9NaWxsaXNSb3VuZFVwOwotCi1TYkNvbmRpdGlvblZhcmlhYmxlUmVzdWx0IFNiQ29uZGl0aW9uVmFyaWFibGVXYWl0VGltZWQoCi0gICAgU2JDb25kaXRpb25WYXJpYWJsZSogY29uZGl0aW9uLAotICAgIFNiTXV0ZXgqIG11dGV4LAotICAgIFNiVGltZSB0aW1lb3V0KSB7Ci0gIGlmICghY29uZGl0aW9uIHx8ICFtdXRleCkgewotICAgIHJldHVybiBrU2JDb25kaXRpb25WYXJpYWJsZUZhaWxlZDsKLSAgfQotCi0gIGlmICh0aW1lb3V0IDwgMCkgewotICAgIHRpbWVvdXQgPSAwOwotICB9Ci0gIGJvb2wgcmVzdWx0ID0gU2xlZXBDb25kaXRpb25WYXJpYWJsZVNSVygKLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UENPTkRJVElPTl9WQVJJQUJMRT4oY29uZGl0aW9uKSwKLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UFNSV0xPQ0s+KG11dGV4KSwKLSAgICAgIENvbnZlcnRTYlRpbWVUb01pbGxpc1JvdW5kVXAodGltZW91dCksIDApOwotCi0gIGlmICh0aW1lb3V0ID09IDApIHsKLSAgICAvLyBQZXIgZG9jdW1lbnRhdGlvbiwgIklmIHRoZSB8dGltZW91dF9kdXJhdGlvbnwgdmFsdWUgaXMgbGVzcyB0aGFuCi0gICAgLy8gb3IgZXF1YWwgdG8gemVybywgdGhlIGZ1bmN0aW9uIHJldHVybnMgYXMgcXVpY2tseSBhcyBwb3NzaWJsZSB3aXRoIGEKLSAgICAvLyBrU2JDb25kaXRpb25WYXJpYWJsZVRpbWVkT3V0IHJlc3VsdC4iCi0gICAgcmV0dXJuIGtTYkNvbmRpdGlvblZhcmlhYmxlVGltZWRPdXQ7Ci0gIH0KLQotICBpZiAocmVzdWx0KSB7Ci0gICAgcmV0dXJuIGtTYkNvbmRpdGlvblZhcmlhYmxlU2lnbmFsZWQ7Ci0gIH0KLQotICBpZiAoR2V0TGFzdEVycm9yKCkgPT0gRVJST1JfVElNRU9VVCkgewotICAgIHJldHVybiBrU2JDb25kaXRpb25WYXJpYWJsZVRpbWVkT3V0OwotICB9Ci0gIHJldHVybiBrU2JDb25kaXRpb25WYXJpYWJsZUZhaWxlZDsKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2RlY29kZV90YXJnZXRfaW50ZXJuYWwuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9kZWNvZGVfdGFyZ2V0X2ludGVybmFsLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmFmMzJhLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2RlY29kZV90YXJnZXRfaW50ZXJuYWwuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMzEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvZGVjb2RlX3RhcmdldF9pbnRlcm5hbC5oIgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2NvbmZpZ3VyYXRpb24uaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvZXJyb3JfdXRpbHMuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9hbmdsZS9pbmNsdWRlL0VHTC9lZ2wuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9hbmdsZS9pbmNsdWRlL0VHTC9lZ2xleHQuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9hbmdsZS9pbmNsdWRlL0dMRVMyL2dsMi5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2FuZ2xlL2luY2x1ZGUvR0xFUzIvZ2wyZXh0LmgiCi0KLW5hbWVzcGFjZSB7Ci0KLXVzaW5nIE1pY3Jvc29mdDo6V1JMOjpDb21QdHI7Ci11c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OkNoZWNrUmVzdWx0OwotCi0vLyB7M0MzQTQzQUItQzY5Qi00NkM5LUFBOEQtQjBDRkZDRDQ1OTZEfQotY29uc3QgR1VJRCBrQ29iYWx0TnYxMkJpbmRDaHJvbWEgPSB7Ci0gICAgMHgzYzNhNDNhYiwKLSAgICAweGM2OWIsCi0gICAgMHg0NmM5LAotICAgIHsweGFhLCAweDhkLCAweGIwLCAweGNmLCAweGZjLCAweGQ0LCAweDU5LCAweDZkfX07Ci0KLS8vIHtDNjJCRjE4RC1CNUVFLTQ2QjEtOUMzMS1GNjFCRDhBRTNCMER9Ci1jb25zdCBHVUlEIGtDb2JhbHREeGdpQnVmZmVyID0gewotICAgIDBYYzYyYmYxOGQsCi0gICAgMFhiNWVlLAotICAgIDBYNDZiMSwKLSAgICB7MFg5YywgMFgzMSwgMFhmNiwgMFgxYiwgMFhkOCwgMFhhZSwgMFgzYiwgMFgwZH19OwotCi1Db21QdHI8SUQzRDExVGV4dHVyZTJEPiBBbGxvY2F0ZVRleHR1cmUoCi0gICAgY29uc3QgQ29tUHRyPElEM0QxMURldmljZT4mIGQzZF9kZXZpY2UsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICBDb21QdHI8SUQzRDExVGV4dHVyZTJEPiB0ZXh0dXJlOwotICBEM0QxMV9URVhUVVJFMkRfREVTQyB0ZXh0dXJlX2Rlc2MgPSB7fTsKLSAgdGV4dHVyZV9kZXNjLldpZHRoID0gd2lkdGg7Ci0gIHRleHR1cmVfZGVzYy5IZWlnaHQgPSBoZWlnaHQ7Ci0gIHRleHR1cmVfZGVzYy5NaXBMZXZlbHMgPSAxOwotICB0ZXh0dXJlX2Rlc2MuQXJyYXlTaXplID0gMTsKLSAgdGV4dHVyZV9kZXNjLkZvcm1hdCA9IERYR0lfRk9STUFUX05WMTI7Ci0gIHRleHR1cmVfZGVzYy5TYW1wbGVEZXNjLkNvdW50ID0gMTsKLSAgdGV4dHVyZV9kZXNjLlNhbXBsZURlc2MuUXVhbGl0eSA9IDA7Ci0gIHRleHR1cmVfZGVzYy5Vc2FnZSA9IEQzRDExX1VTQUdFX0RFRkFVTFQ7Ci0gIHRleHR1cmVfZGVzYy5CaW5kRmxhZ3MgPQotICAgICAgRDNEMTFfQklORF9SRU5ERVJfVEFSR0VUIHwgRDNEMTFfQklORF9TSEFERVJfUkVTT1VSQ0U7Ci0gIENoZWNrUmVzdWx0KGQzZF9kZXZpY2UtPkNyZWF0ZVRleHR1cmUyRCgmdGV4dHVyZV9kZXNjLCBudWxscHRyLAotICAgICAgdGV4dHVyZS5HZXRBZGRyZXNzT2YoKSkpOwotICByZXR1cm4gdGV4dHVyZTsKLX0KLQotdm9pZCBVcGRhdGVUZXh0dXJlKAotICAgIGNvbnN0IENvbVB0cjxJRDNEMTFUZXh0dXJlMkQ+JiB0ZXh0dXJlLAotICAgIGNvbnN0IENvbVB0cjxJRDNEMTFWaWRlb0RldmljZTE+JiB2aWRlb19kZXZpY2UsCi0gICAgY29uc3QgQ29tUHRyPElEM0QxMVZpZGVvQ29udGV4dD4mIHZpZGVvX2NvbnRleHQsCi0gICAgY29uc3QgQ29tUHRyPElEM0QxMVZpZGVvUHJvY2Vzc29yRW51bWVyYXRvcj4mIHZpZGVvX2VudW1lcmF0b3IsCi0gICAgY29uc3QgQ29tUHRyPElEM0QxMVZpZGVvUHJvY2Vzc29yPiYgdmlkZW9fcHJvY2Vzc29yLAotICAgIGNvbnN0IENvbVB0cjxJTUZTYW1wbGU+JiB2aWRlb19zYW1wbGUsIGNvbnN0IFJFQ1QmIHZpZGVvX2FyZWEpIHsKLSAgQ29tUHRyPElNRk1lZGlhQnVmZmVyPiBtZWRpYV9idWZmZXI7Ci0gIENoZWNrUmVzdWx0KHZpZGVvX3NhbXBsZS0+R2V0QnVmZmVyQnlJbmRleCgwLCBtZWRpYV9idWZmZXIuR2V0QWRkcmVzc09mKCkpKTsKLQotICBDb21QdHI8SU1GRFhHSUJ1ZmZlcj4gZHhnaV9idWZmZXI7Ci0gIENoZWNrUmVzdWx0KG1lZGlhX2J1ZmZlci5BcygmZHhnaV9idWZmZXIpKTsKLQotICBDb21QdHI8SUQzRDExVGV4dHVyZTJEPiBpbnB1dF90ZXh0dXJlOwotICBDaGVja1Jlc3VsdChkeGdpX2J1ZmZlci0+R2V0UmVzb3VyY2UoSUlEX1BQVl9BUkdTKCZpbnB1dF90ZXh0dXJlKSkpOwotCi0gIC8vIFRoZSBWaWRlb1Byb2Nlc3NvciBuZWVkcyB0byBrbm93IHdoYXQgc3Vic2V0IG9mIHRoZSBkZWNvZGVkCi0gIC8vIGZyYW1lIGNvbnRhaW5zIGFjdGl2ZSBwaXhlbHMgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyLgotICB2aWRlb19jb250ZXh0LT5WaWRlb1Byb2Nlc3NvclNldFN0cmVhbVNvdXJjZVJlY3QoCi0gICAgICB2aWRlb19wcm9jZXNzb3IuR2V0KCksIDAsIFRSVUUsICZ2aWRlb19hcmVhKTsKLQotICBEM0QxMV9WSURFT19QUk9DRVNTT1JfSU5QVVRfVklFV19ERVNDIGlucHV0X2Rlc2MgPSB7fTsKLSAgaW5wdXRfZGVzYy5WaWV3RGltZW5zaW9uID0gRDNEMTFfVlBJVl9ESU1FTlNJT05fVEVYVFVSRTJEOwotICBpbnB1dF9kZXNjLlRleHR1cmUyRC5NaXBTbGljZSA9IDA7Ci0gIGR4Z2lfYnVmZmVyLT5HZXRTdWJyZXNvdXJjZUluZGV4KCZpbnB1dF9kZXNjLlRleHR1cmUyRC5BcnJheVNsaWNlKTsKLQotICBDb21QdHI8SUQzRDExVmlkZW9Qcm9jZXNzb3JJbnB1dFZpZXc+IGlucHV0X3ZpZXc7Ci0gIENoZWNrUmVzdWx0KHZpZGVvX2RldmljZS0+Q3JlYXRlVmlkZW9Qcm9jZXNzb3JJbnB1dFZpZXcoCi0gICAgICBpbnB1dF90ZXh0dXJlLkdldCgpLCB2aWRlb19lbnVtZXJhdG9yLkdldCgpLCAmaW5wdXRfZGVzYywKLSAgICAgIGlucHV0X3ZpZXcuR2V0QWRkcmVzc09mKCkpKTsKLQotICBEM0QxMV9WSURFT19QUk9DRVNTT1JfT1VUUFVUX1ZJRVdfREVTQyBvdXRwdXRfZGVzYyA9IHt9OwotICBvdXRwdXRfZGVzYy5WaWV3RGltZW5zaW9uID0gRDNEMTFfVlBPVl9ESU1FTlNJT05fVEVYVFVSRTJEOwotICBvdXRwdXRfZGVzYy5UZXh0dXJlMkQuTWlwU2xpY2UgPSAwOwotCi0gIENvbVB0cjxJRDNEMTFWaWRlb1Byb2Nlc3Nvck91dHB1dFZpZXc+IG91dHB1dF92aWV3OwotICBDaGVja1Jlc3VsdCh2aWRlb19kZXZpY2UtPkNyZWF0ZVZpZGVvUHJvY2Vzc29yT3V0cHV0VmlldygKLSAgICAgIHRleHR1cmUuR2V0KCksIHZpZGVvX2VudW1lcmF0b3IuR2V0KCksICZvdXRwdXRfZGVzYywKLSAgICAgIG91dHB1dF92aWV3LkdldEFkZHJlc3NPZigpKSk7Ci0KLSAgLy8gV2UgaGF2ZSBhIHNpbmdsZSB2aWRlbyBzdHJlYW0sIHdoaWNoIGlzIGVuYWJsZWQgZm9yIGRpc3BsYXkuCi0gIEQzRDExX1ZJREVPX1BST0NFU1NPUl9TVFJFQU0gc3RyZWFtX2luZm8gPSB7fTsKLSAgc3RyZWFtX2luZm8uRW5hYmxlID0gVFJVRTsKLSAgc3RyZWFtX2luZm8ucElucHV0U3VyZmFjZSA9IGlucHV0X3ZpZXcuR2V0KCk7Ci0gIENoZWNrUmVzdWx0KHZpZGVvX2NvbnRleHQtPlZpZGVvUHJvY2Vzc29yQmx0KAotICAgICAgdmlkZW9fcHJvY2Vzc29yLkdldCgpLCBvdXRwdXRfdmlldy5HZXQoKSwgMCwgMSwgJnN0cmVhbV9pbmZvKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1TYkRlY29kZVRhcmdldFByaXZhdGU6OlNiRGVjb2RlVGFyZ2V0UHJpdmF0ZSgKLSAgICBjb25zdCBDb21QdHI8SUQzRDExRGV2aWNlPiYgZDNkX2RldmljZSwKLSAgICBjb25zdCBDb21QdHI8SUQzRDExVmlkZW9EZXZpY2UxPiYgdmlkZW9fZGV2aWNlLAotICAgIGNvbnN0IENvbVB0cjxJRDNEMTFWaWRlb0NvbnRleHQ+JiB2aWRlb19jb250ZXh0LAotICAgIGNvbnN0IENvbVB0cjxJRDNEMTFWaWRlb1Byb2Nlc3NvckVudW1lcmF0b3I+JiB2aWRlb19lbnVtZXJhdG9yLAotICAgIGNvbnN0IENvbVB0cjxJRDNEMTFWaWRlb1Byb2Nlc3Nvcj4mIHZpZGVvX3Byb2Nlc3NvciwKLSAgICBjb25zdCBDb21QdHI8SU1GU2FtcGxlPiYgdmlkZW9fc2FtcGxlLCBjb25zdCBSRUNUJiB2aWRlb19hcmVhKQotICAgIDogcmVmY291bnQoMSkgewotICBTYk1lbW9yeVNldCgmaW5mbywgMCwgc2l6ZW9mKGluZm8pKTsKLSAgaW5mby5mb3JtYXQgPSBrU2JEZWNvZGVUYXJnZXRGb3JtYXQyUGxhbmVZVVZOVjEyOwotICBpbmZvLmlzX29wYXF1ZSA9IHRydWU7Ci0gIGluZm8ud2lkdGggPSB2aWRlb19hcmVhLnJpZ2h0OwotICBpbmZvLmhlaWdodCA9IHZpZGVvX2FyZWEuYm90dG9tOwotCi0gIGQzZF90ZXh0dXJlID0gQWxsb2NhdGVUZXh0dXJlKGQzZF9kZXZpY2UsIGluZm8ud2lkdGgsIGluZm8uaGVpZ2h0KTsKLSAgaWYgKHZpZGVvX3NhbXBsZSkgewotICAgIFVwZGF0ZVRleHR1cmUoZDNkX3RleHR1cmUsIHZpZGVvX2RldmljZSwgdmlkZW9fY29udGV4dCwgdmlkZW9fZW51bWVyYXRvciwKLSAgICAgICAgdmlkZW9fcHJvY2Vzc29yLCB2aWRlb19zYW1wbGUsIHZpZGVvX2FyZWEpOwotICB9Ci0KLSAgU2JEZWNvZGVUYXJnZXRJbmZvUGxhbmUqIHBsYW5lWSA9ICYoaW5mby5wbGFuZXNba1NiRGVjb2RlVGFyZ2V0UGxhbmVZXSk7Ci0gIFNiRGVjb2RlVGFyZ2V0SW5mb1BsYW5lKiBwbGFuZVVWID0gJihpbmZvLnBsYW5lc1trU2JEZWNvZGVUYXJnZXRQbGFuZVVWXSk7Ci0KLSAgcGxhbmVZLT53aWR0aCA9IGluZm8ud2lkdGg7Ci0gIHBsYW5lWS0+aGVpZ2h0ID0gaW5mby5oZWlnaHQ7Ci0gIHBsYW5lWS0+Y29udGVudF9yZWdpb24ubGVmdCA9IDA7Ci0gIHBsYW5lWS0+Y29udGVudF9yZWdpb24udG9wID0gaW5mby5oZWlnaHQ7Ci0gIHBsYW5lWS0+Y29udGVudF9yZWdpb24ucmlnaHQgPSBpbmZvLndpZHRoOwotICBwbGFuZVktPmNvbnRlbnRfcmVnaW9uLmJvdHRvbSA9IDA7Ci0KLSAgcGxhbmVVVi0+d2lkdGggPSBpbmZvLndpZHRoIC8gMjsKLSAgcGxhbmVVVi0+aGVpZ2h0ID0gaW5mby5oZWlnaHQgLyAyOwotICBwbGFuZVVWLT5jb250ZW50X3JlZ2lvbi5sZWZ0ID0gcGxhbmVZLT5jb250ZW50X3JlZ2lvbi5sZWZ0IC8gMjsKLSAgcGxhbmVVVi0+Y29udGVudF9yZWdpb24udG9wID0gcGxhbmVZLT5jb250ZW50X3JlZ2lvbi50b3AgLyAyOwotICBwbGFuZVVWLT5jb250ZW50X3JlZ2lvbi5yaWdodCA9IHBsYW5lWS0+Y29udGVudF9yZWdpb24ucmlnaHQgLyAyOwotICBwbGFuZVVWLT5jb250ZW50X3JlZ2lvbi5ib3R0b20gPSBwbGFuZVktPmNvbnRlbnRfcmVnaW9uLmJvdHRvbSAvIDI7Ci0KLSAgRUdMaW50IGx1bWFfdGV4dHVyZV9hdHRyaWJ1dGVzW10gPSB7RUdMX1dJRFRILAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxFR0xpbnQ+KGluZm8ud2lkdGgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xfSEVJR0hULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxFR0xpbnQ+KGluZm8uaGVpZ2h0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMX1RFWFRVUkVfVEFSR0VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xfVEVYVFVSRV8yRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMX1RFWFRVUkVfRk9STUFULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xfVEVYVFVSRV9SR0JBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xfTk9ORX07Ci0KLSAgRUdMRGlzcGxheSBkaXNwbGF5ID0gZWdsR2V0RGlzcGxheShFR0xfREVGQVVMVF9ESVNQTEFZKTsKLQotICBFR0xDb25maWcgY29uZmlnOwotICBFR0xpbnQgYXR0cmlidXRlX2xpc3RbXSA9IHsKLSAgICBFR0xfU1VSRkFDRV9UWVBFLCAgLy8gdGhpcyBtdXN0IGJlIGZpcnN0Ci0gICAgRUdMX1dJTkRPV19CSVQgfCBFR0xfUEJVRkZFUl9CSVQsCi0gICAgRUdMX1JFRF9TSVpFLAotICAgIDgsCi0gICAgRUdMX0dSRUVOX1NJWkUsCi0gICAgOCwKLSAgICBFR0xfQkxVRV9TSVpFLAotICAgIDgsCi0gICAgRUdMX0FMUEhBX1NJWkUsCi0gICAgOCwKLSAgICBFR0xfQklORF9UT19URVhUVVJFX1JHQkEsCi0gICAgRUdMX1RSVUUsCi0gICAgRUdMX1JFTkRFUkFCTEVfVFlQRSwKLSAgICBFR0xfT1BFTkdMX0VTMl9CSVQsCi0gICAgRUdMX05PTkUKLSAgfTsKLQotICBFR0xpbnQgbnVtX2NvbmZpZ3M7Ci0gIGJvb2wgb2sgPSBlZ2xDaG9vc2VDb25maWcoCi0gICAgICBkaXNwbGF5LCBhdHRyaWJ1dGVfbGlzdCwgJmNvbmZpZywgMSwgJm51bV9jb25maWdzKTsKLSAgU0JfRENIRUNLKG9rKTsKLSAgU0JfRENIRUNLKG51bV9jb25maWdzID09IDEpOwotCi0gIEdMdWludCBnbF90ZXh0dXJlc1syXSA9IHswfTsKLSAgZ2xHZW5UZXh0dXJlcygyLCBnbF90ZXh0dXJlcyk7Ci0gIFNCX0RDSEVDSyhnbEdldEVycm9yKCkgPT0gR0xfTk9fRVJST1IpOwotCi0gIC8vIFRoaXMgdGVsbHMgQU5HTEUgdGhhdCB0aGUgdGV4dHVyZSBpdCBjcmVhdGVzIHNob3VsZCBkcmF3Ci0gIC8vIHRoZSBsdW1hIGNoYW5uZWwgb24gUjguCi0gIEhSRVNVTFQgaHIgPSBkM2RfdGV4dHVyZS0+U2V0UHJpdmF0ZURhdGEoa0NvYmFsdE52MTJCaW5kQ2hyb21hLCAwLCBudWxscHRyKTsKLSAgU0JfRENIRUNLKFNVQ0NFRURFRChocikpOwotCi0gIHN1cmZhY2VbMF0gPSBlZ2xDcmVhdGVQYnVmZmVyRnJvbUNsaWVudEJ1ZmZlcihkaXNwbGF5LCBFR0xfRDNEX1RFWFRVUkVfQU5HTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkM2RfdGV4dHVyZS5HZXQoKSwgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHVtYV90ZXh0dXJlX2F0dHJpYnV0ZXMpOwotCi0gIFNCX0RDSEVDSyhzdXJmYWNlWzBdICE9IEVHTF9OT19TVVJGQUNFKTsKLQotICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIGdsX3RleHR1cmVzWzBdKTsKLSAgU0JfRENIRUNLKGdsR2V0RXJyb3IoKSA9PSBHTF9OT19FUlJPUik7Ci0KLSAgb2sgPSBlZ2xCaW5kVGV4SW1hZ2UoZGlzcGxheSwgc3VyZmFjZVswXSwgRUdMX0JBQ0tfQlVGRkVSKTsKLSAgU0JfRENIRUNLKG9rKTsKLQotICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9MSU5FQVIpOwotICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOwotCi0gIHBsYW5lWS0+dGV4dHVyZSA9IGdsX3RleHR1cmVzWzBdOwotICBwbGFuZVktPmdsX3RleHR1cmVfdGFyZ2V0ID0gR0xfVEVYVFVSRV8yRDsKLSAgcGxhbmVZLT5nbF90ZXh0dXJlX2Zvcm1hdCA9IEdMX1JFRF9FWFQ7Ci0KLSAgLy8gVGhpcyB0ZWxscyBBTkdMRSB0aGF0IHRoZSB0ZXh0dXJlIGl0IGNyZWF0ZXMgc2hvdWxkIGRyYXcKLSAgLy8gdGhlIGNocm9tYSBjaGFubmVsIG9uIFI4RzguCi0gIGJvb2wgYmluZF9jaHJvbWEgPSB0cnVlOwotICBociA9IGQzZF90ZXh0dXJlLT5TZXRQcml2YXRlRGF0YShrQ29iYWx0TnYxMkJpbmRDaHJvbWEsIDEsICZiaW5kX2Nocm9tYSk7Ci0gIFNCX0RDSEVDSyhTVUNDRUVERUQoaHIpKTsKLQotICBFR0xpbnQgY2hyb21hX3RleHR1cmVfYXR0cmlidXRlc1tdID0gewotICAgICAgRUdMX1dJRFRILAotICAgICAgc3RhdGljX2Nhc3Q8RUdMaW50PihpbmZvLndpZHRoKSAvIDIsCi0gICAgICBFR0xfSEVJR0hULAotICAgICAgc3RhdGljX2Nhc3Q8RUdMaW50PihpbmZvLmhlaWdodCkgLyAyLAotICAgICAgRUdMX1RFWFRVUkVfVEFSR0VULAotICAgICAgRUdMX1RFWFRVUkVfMkQsCi0gICAgICBFR0xfVEVYVFVSRV9GT1JNQVQsCi0gICAgICBFR0xfVEVYVFVSRV9SR0JBLAotICAgICAgRUdMX05PTkV9OwotICBzdXJmYWNlWzFdID0gZWdsQ3JlYXRlUGJ1ZmZlckZyb21DbGllbnRCdWZmZXIoZGlzcGxheSwgRUdMX0QzRF9URVhUVVJFX0FOR0xFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZDNkX3RleHR1cmUuR2V0KCksIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNocm9tYV90ZXh0dXJlX2F0dHJpYnV0ZXMpOwotCi0gIFNCX0RDSEVDSyhzdXJmYWNlWzFdICE9IEVHTF9OT19TVVJGQUNFKTsKLQotICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIGdsX3RleHR1cmVzWzFdKTsKLSAgU0JfRENIRUNLKGdsR2V0RXJyb3IoKSA9PSBHTF9OT19FUlJPUik7Ci0KLSAgb2sgPSBlZ2xCaW5kVGV4SW1hZ2UoZGlzcGxheSwgc3VyZmFjZVsxXSwgRUdMX0JBQ0tfQlVGRkVSKTsKLSAgU0JfRENIRUNLKG9rKTsKLQotICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9MSU5FQVIpOwotICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOwotCi0gIHBsYW5lVVYtPnRleHR1cmUgPSBnbF90ZXh0dXJlc1sxXTsKLSAgcGxhbmVVVi0+Z2xfdGV4dHVyZV90YXJnZXQgPSBHTF9URVhUVVJFXzJEOwotICBwbGFuZVVWLT5nbF90ZXh0dXJlX2Zvcm1hdCA9IEdMX1JHX0VYVDsKLQotICBociA9IGQzZF90ZXh0dXJlLT5TZXRQcml2YXRlRGF0YShrQ29iYWx0RHhnaUJ1ZmZlciwgMCwgbnVsbHB0cik7Ci0gIFNCX0RDSEVDSyhTVUNDRUVERUQoaHIpKTsKLX0KLQotU2JEZWNvZGVUYXJnZXRQcml2YXRlOjp+U2JEZWNvZGVUYXJnZXRQcml2YXRlKCkgewotICBnbERlbGV0ZVRleHR1cmVzKDEsICYoaW5mby5wbGFuZXNba1NiRGVjb2RlVGFyZ2V0UGxhbmVZXS50ZXh0dXJlKSk7Ci0gIGdsRGVsZXRlVGV4dHVyZXMoMSwgJihpbmZvLnBsYW5lc1trU2JEZWNvZGVUYXJnZXRQbGFuZVVWXS50ZXh0dXJlKSk7Ci0KLSAgRUdMRGlzcGxheSBkaXNwbGF5ID0gZWdsR2V0RGlzcGxheShFR0xfREVGQVVMVF9ESVNQTEFZKTsKLQotICBlZ2xSZWxlYXNlVGV4SW1hZ2UoZGlzcGxheSwgc3VyZmFjZVswXSwgRUdMX0JBQ0tfQlVGRkVSKTsKLSAgZWdsRGVzdHJveVN1cmZhY2UoZGlzcGxheSwgc3VyZmFjZVswXSk7Ci0KLSAgZWdsUmVsZWFzZVRleEltYWdlKGRpc3BsYXksIHN1cmZhY2VbMV0sIEVHTF9CQUNLX0JVRkZFUik7Ci0gIGVnbERlc3Ryb3lTdXJmYWNlKGRpc3BsYXksIHN1cmZhY2VbMV0pOwotfQotCi1ib29sIFNiRGVjb2RlVGFyZ2V0UHJpdmF0ZTo6VXBkYXRlKAotICAgIGNvbnN0IENvbVB0cjxJRDNEMTFEZXZpY2U+JiBkM2RfZGV2aWNlLAotICAgIGNvbnN0IENvbVB0cjxJRDNEMTFWaWRlb0RldmljZTE+JiB2aWRlb19kZXZpY2UsCi0gICAgY29uc3QgQ29tUHRyPElEM0QxMVZpZGVvQ29udGV4dD4mIHZpZGVvX2NvbnRleHQsCi0gICAgY29uc3QgQ29tUHRyPElEM0QxMVZpZGVvUHJvY2Vzc29yRW51bWVyYXRvcj4mIHZpZGVvX2VudW1lcmF0b3IsCi0gICAgY29uc3QgQ29tUHRyPElEM0QxMVZpZGVvUHJvY2Vzc29yPiYgdmlkZW9fcHJvY2Vzc29yLAotICAgIGNvbnN0IENvbVB0cjxJTUZTYW1wbGU+JiB2aWRlb19zYW1wbGUsCi0gICAgY29uc3QgUkVDVCYgdmlkZW9fYXJlYSkgewotICAvLyBPbmx5IGFsbG93IHVwZGF0aW5nIGlmIHRoaXMgaXMgdGhlIG9ubHkgcmVmZXJlbmNlLiBPdGhlcndpc2UgdGhlIHVwZGF0ZQotICAvLyBtYXkgY2hhbmdlIHNvbWV0aGluZyB0aGF0J3MgY3VycmVudGx5IGJlaW5nIHVzZWQuCi0gIGlmIChTYkF0b21pY05vQmFycmllcl9Mb2FkKCZyZWZjb3VudCkgPiAxKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gVGhlIGRlY29kZSB0YXJnZXQgaW5mbyBtdXN0IGJlIGNvbXBhdGlibGUuIFRoZSByZXNvbHV0aW9uIHNob3VsZCBtYXRjaAotICAvLyBleGFjdGx5LCBvdGhlcndpc2UgdGhlIHNoYWRlciBtYXkgc2FtcGxlIGludmFsaWQgdGV4ZWxzIGFsb25nIHRoZQotICAvLyB0ZXh0dXJlIGJvcmRlci4KLSAgaWYgKGluZm8uZm9ybWF0ICE9IGtTYkRlY29kZVRhcmdldEZvcm1hdDJQbGFuZVlVVk5WMTIgfHwKLSAgICAgIGluZm8uaXNfb3BhcXVlICE9IHRydWUgfHwKLSAgICAgIGluZm8ud2lkdGggIT0gdmlkZW9fYXJlYS5yaWdodCB8fAotICAgICAgaW5mby5oZWlnaHQgIT0gdmlkZW9fYXJlYS5ib3R0b20pIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBTQl9VTlJFRkVSRU5DRURfUEFSQU1FVEVSKGQzZF9kZXZpY2UpOwotICBVcGRhdGVUZXh0dXJlKGQzZF90ZXh0dXJlLCB2aWRlb19kZXZpY2UsIHZpZGVvX2NvbnRleHQsIHZpZGVvX2VudW1lcmF0b3IsCi0gICAgICB2aWRlb19wcm9jZXNzb3IsIHZpZGVvX3NhbXBsZSwgdmlkZW9fYXJlYSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIFNiRGVjb2RlVGFyZ2V0UHJpdmF0ZTo6QWRkUmVmKCkgewotICBTYkF0b21pY0JhcnJpZXJfSW5jcmVtZW50KCZyZWZjb3VudCwgMSk7Ci19Ci0KLXZvaWQgU2JEZWNvZGVUYXJnZXRQcml2YXRlOjpSZWxlYXNlKCkgewotICBpbnQgbmV3X2NvdW50ID0gU2JBdG9taWNCYXJyaWVyX0luY3JlbWVudCgmcmVmY291bnQsIC0xKTsKLSAgU0JfRENIRUNLKG5ld19jb3VudCA+PSAwKTsKLSAgaWYgKG5ld19jb3VudCA9PSAwKSB7Ci0gICAgZGVsZXRlIHRoaXM7Ci0gIH0KLX0KLQotdm9pZCBTYkRlY29kZVRhcmdldFJlbGVhc2UoU2JEZWNvZGVUYXJnZXQgZGVjb2RlX3RhcmdldCkgewotICBpZiAoU2JEZWNvZGVUYXJnZXRJc1ZhbGlkKGRlY29kZV90YXJnZXQpKSB7Ci0gICAgZGVjb2RlX3RhcmdldC0+UmVsZWFzZSgpOwotICB9Ci19Ci0KLVNiRGVjb2RlVGFyZ2V0Rm9ybWF0IFNiRGVjb2RlVGFyZ2V0R2V0Rm9ybWF0KFNiRGVjb2RlVGFyZ2V0IGRlY29kZV90YXJnZXQpIHsKLSAgLy8gTm90ZSB0aGF0IGtTYkRlY29kZVRhcmdldEZvcm1hdDJQbGFuZVlVVk5WMTIgcmVwcmVzZW50cyBEWEdJX0ZPUk1BVF9OVjEyLgotICBTQl9EQ0hFQ0soa1NiRGVjb2RlVGFyZ2V0Rm9ybWF0MlBsYW5lWVVWTlYxMiA9PQotICAgICAgICAgICAgZGVjb2RlX3RhcmdldC0+aW5mby5mb3JtYXQpOwotICByZXR1cm4gZGVjb2RlX3RhcmdldC0+aW5mby5mb3JtYXQ7Ci19Ci0KLWJvb2wgU2JEZWNvZGVUYXJnZXRHZXRJbmZvKFNiRGVjb2RlVGFyZ2V0IGRlY29kZV90YXJnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTYkRlY29kZVRhcmdldEluZm8qIG91dF9pbmZvKSB7Ci0gIGlmICghb3V0X2luZm8gfHwgIVNiTWVtb3J5SXNaZXJvKG91dF9pbmZvLCBzaXplb2YoKm91dF9pbmZvKSkpIHsKLSAgICBTQl9EQ0hFQ0soZmFsc2UpIDw8ICJvdXRfaW5mbyBtdXN0IGJlIHplcm9lZCBvdXQuIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgU2JNZW1vcnlDb3B5KG91dF9pbmZvLCAmZGVjb2RlX3RhcmdldC0+aW5mbywgc2l6ZW9mKCpvdXRfaW5mbykpOwotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2RlY29kZV90YXJnZXRfaW50ZXJuYWwuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2RlY29kZV90YXJnZXRfaW50ZXJuYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBjY2UxNy4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9kZWNvZGVfdGFyZ2V0X2ludGVybmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaWZuZGVmIFNUQVJCT0FSRF9TSEFSRURfV0lOMzJfREVDT0RFX1RBUkdFVF9JTlRFUk5BTF9IXwotI2RlZmluZSBTVEFSQk9BUkRfU0hBUkVEX1dJTjMyX0RFQ09ERV9UQVJHRVRfSU5URVJOQUxfSF8KLQotI2luY2x1ZGUgPEQzZDExXzEuaD4KLSNpbmNsdWRlIDxtZmlkbC5oPgotI2luY2x1ZGUgPHdybC9jbGllbnQuaD4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9hdG9taWMuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvZGVjb2RlX3RhcmdldC5oIgotCi1zdHJ1Y3QgU2JEZWNvZGVUYXJnZXRQcml2YXRlIHsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIHVzaW5nIENvbVB0ciA9IE1pY3Jvc29mdDo6V1JMOjpDb21QdHI8VD47Ci0KLSAgU2JBdG9taWMzMiByZWZjb3VudDsKLQotICAvLyBQdWJsaWNseSBhY2Nlc3NpYmxlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkZWNvZGUgdGFyZ2V0LgotICBTYkRlY29kZVRhcmdldEluZm8gaW5mbzsKLQotICBDb21QdHI8SUQzRDExVGV4dHVyZTJEPiBkM2RfdGV4dHVyZTsKLQotICAvLyBFR0xTdXJmYWNlIGlzIGRlZmluZWQgYXMgdm9pZCogaW4gInRoaXJkX3BhcnR5L2FuZ2xlL2luY2x1ZGUvRUdML2VnbC5oIi4KLSAgLy8gVXNlIHZvaWQqIGRpcmVjdGx5IGhlcmUgdG8gYXZvaWQgYGVnbC5oYCBiZWluZyBpbmNsdWRlZCBicm9hZGx5LgotICB2b2lkKiBzdXJmYWNlWzJdOwotCi0gIFNiRGVjb2RlVGFyZ2V0UHJpdmF0ZSgKLSAgICAgIGNvbnN0IENvbVB0cjxJRDNEMTFEZXZpY2U+JiBkM2RfZGV2aWNlLAotICAgICAgY29uc3QgQ29tUHRyPElEM0QxMVZpZGVvRGV2aWNlMT4mIHZpZGVvX2RldmljZSwKLSAgICAgIGNvbnN0IENvbVB0cjxJRDNEMTFWaWRlb0NvbnRleHQ+JiB2aWRlb19jb250ZXh0LAotICAgICAgY29uc3QgQ29tUHRyPElEM0QxMVZpZGVvUHJvY2Vzc29yRW51bWVyYXRvcj4mIHZpZGVvX2VudW1lcmF0b3IsCi0gICAgICBjb25zdCBDb21QdHI8SUQzRDExVmlkZW9Qcm9jZXNzb3I+JiB2aWRlb19wcm9jZXNzb3IsCi0gICAgICBjb25zdCBDb21QdHI8SU1GU2FtcGxlPiYgdmlkZW9fc2FtcGxlLAotICAgICAgY29uc3QgUkVDVCYgdmlkZW9fYXJlYSk7Ci0gIH5TYkRlY29kZVRhcmdldFByaXZhdGUoKTsKLQotICAvLyBVcGRhdGUgdGhlIGV4aXN0aW5nIHRleHR1cmUgd2l0aCB0aGUgZ2l2ZW4gdmlkZW9fc2FtcGxlJ3MgZGF0YS4KLSAgLy8gSWYgdGhlIGN1cnJlbnQgb2JqZWN0IGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIG5ldyB2aWRlb19zYW1wbGUsIHRoZW4KLSAgLy8gdGhpcyB3aWxsIHJldHVybiBmYWxzZSwgYW5kIHRoZSBjYWxsZXIgc2hvdWxkIGp1c3QgY3JlYXRlIGEgbmV3Ci0gIC8vIGRlY29kZSB0YXJnZXQgZm9yIHRoZSBzYW1wbGUuCi0gIGJvb2wgVXBkYXRlKAotICAgICAgY29uc3QgQ29tUHRyPElEM0QxMURldmljZT4mIGQzZF9kZXZpY2UsCi0gICAgICBjb25zdCBDb21QdHI8SUQzRDExVmlkZW9EZXZpY2UxPiYgdmlkZW9fZGV2aWNlLAotICAgICAgY29uc3QgQ29tUHRyPElEM0QxMVZpZGVvQ29udGV4dD4mIHZpZGVvX2NvbnRleHQsCi0gICAgICBjb25zdCBDb21QdHI8SUQzRDExVmlkZW9Qcm9jZXNzb3JFbnVtZXJhdG9yPiYgdmlkZW9fZW51bWVyYXRvciwKLSAgICAgIGNvbnN0IENvbVB0cjxJRDNEMTFWaWRlb1Byb2Nlc3Nvcj4mIHZpZGVvX3Byb2Nlc3NvciwKLSAgICAgIGNvbnN0IENvbVB0cjxJTUZTYW1wbGU+JiB2aWRlb19zYW1wbGUsCi0gICAgICBjb25zdCBSRUNUJiB2aWRlb19hcmVhKTsKLQotICB2b2lkIEFkZFJlZigpOwotICB2b2lkIFJlbGVhc2UoKTsKLX07Ci0KLSNlbmRpZiAgLy8gU1RBUkJPQVJEX1NIQVJFRF9XSU4zMl9ERUNPREVfVEFSR0VUX0lOVEVSTkFMX0hfCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9kZWNyeXB0aW5nX2RlY29kZXIuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9kZWNyeXB0aW5nX2RlY29kZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNWNiNmMuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZGVjcnlwdGluZ19kZWNvZGVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzYyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2RlY3J5cHRpbmdfZGVjb2Rlci5oIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPG51bWVyaWM+Ci0KLSNpbmNsdWRlICJzdGFyYm9hcmQvYnl0ZV9zd2FwLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL2NvbW1vbi9yZWZfY291bnRlZC5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9lcnJvcl91dGlscy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvbWVkaWFfZm91bmRhdGlvbl91dGlscy5oIgotCi1uYW1lc3BhY2Ugc3RhcmJvYXJkIHsKLW5hbWVzcGFjZSBzaGFyZWQgewotbmFtZXNwYWNlIHdpbjMyIHsKLQotbmFtZXNwYWNlIHsKLQotQ29tUHRyPElNRlNhbXBsZT4gQ3JlYXRlU2FtcGxlKGNvbnN0IHZvaWQqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB3aW4zMl90aW1lc3RhbXApIHsKLSAgQ29tUHRyPElNRk1lZGlhQnVmZmVyPiBidWZmZXI7Ci0gIEhSRVNVTFQgaHIgPSBNRkNyZWF0ZU1lbW9yeUJ1ZmZlcihzaXplLCAmYnVmZmVyKTsKLSAgQ2hlY2tSZXN1bHQoaHIpOwotCi0gIEJZVEUqIGJ1ZmZlcl9wdHI7Ci0gIGhyID0gYnVmZmVyLT5Mb2NrKCZidWZmZXJfcHRyLCAwLCAwKTsKLSAgQ2hlY2tSZXN1bHQoaHIpOwotCi0gIFNiTWVtb3J5Q29weShidWZmZXJfcHRyLCBkYXRhLCBzaXplKTsKLQotICBociA9IGJ1ZmZlci0+VW5sb2NrKCk7Ci0gIENoZWNrUmVzdWx0KGhyKTsKLQotICBociA9IGJ1ZmZlci0+U2V0Q3VycmVudExlbmd0aChzaXplKTsKLSAgQ2hlY2tSZXN1bHQoaHIpOwotCi0gIENvbVB0cjxJTUZTYW1wbGU+IGlucHV0OwotICBociA9IE1GQ3JlYXRlU2FtcGxlKCZpbnB1dCk7Ci0gIENoZWNrUmVzdWx0KGhyKTsKLQotICBociA9IGlucHV0LT5BZGRCdWZmZXIoYnVmZmVyLkdldCgpKTsKLSAgQ2hlY2tSZXN1bHQoaHIpOwotCi0gIC8vIHNhbXBsZSB0aW1lIGlzIGluIDEwMCBuYW5vc2Vjb25kcy4KLSAgaW5wdXQtPlNldFNhbXBsZVRpbWUod2luMzJfdGltZXN0YW1wKTsKLSAgcmV0dXJuIGlucHV0OwotfQotCi12b2lkIEF0dGFjaERybURhdGFUb1NhbXBsZShDb21QdHI8SU1GU2FtcGxlPiBzYW1wbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2FtcGxlX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBrZXlfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQga2V5X2lkX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBpdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpdl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2JEcm1TdWJTYW1wbGVNYXBwaW5nKiBzdWJzYW1wbGVfbWFwcGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdWJzYW1wbGVfY291bnQpIHsKLSAgaWYgKGl2X3NpemUgPT0gMTYgJiYgU2JNZW1vcnlJc1plcm8oaXYgKyA4LCA4KSkgewotICAgIC8vIEZvciBpdiB0aGF0IGlzIDE2IGJ5dGVzIGxvbmcgYnV0IHRoZSB0aGUgbGFzdCA4IGJ5dGVzIGlzIDAsIHdlIHRyZWF0Ci0gICAgLy8gaXQgYXMgYW4gOCBieXRlcyBpdi4KLSAgICBpdl9zaXplID0gODsKLSAgfQotICBzYW1wbGUtPlNldEJsb2IoTUZTYW1wbGVFeHRlbnNpb25fRW5jcnlwdGlvbl9TYW1wbGVJRCwKLSAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVUlOVDgqPihpdiksCi0gICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxVSU5UMzI+KGl2X3NpemUpKTsKLSAgU0JfRENIRUNLKGtleV9pZF9zaXplID09IHNpemVvZihHVUlEKSk7Ci0gIEdVSUQgZ3VpZCA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IEdVSUQqPihrZXlfaWQpOwotCi0gIGd1aWQuRGF0YTEgPSBTYkJ5dGVTd2FwVTMyKGd1aWQuRGF0YTEpOwotICBndWlkLkRhdGEyID0gU2JCeXRlU3dhcFUxNihndWlkLkRhdGEyKTsKLSAgZ3VpZC5EYXRhMyA9IFNiQnl0ZVN3YXBVMTYoZ3VpZC5EYXRhMyk7Ci0KLSAgc2FtcGxlLT5TZXRHVUlEKE1GU2FtcGxlRXh0ZW5zaW9uX0NvbnRlbnRfS2V5SUQsIGd1aWQpOwotCi0gIFNCX0RDSEVDSyhzaXplb2YoRFdPUkQpICogMiA9PSBzaXplb2YoU2JEcm1TdWJTYW1wbGVNYXBwaW5nKSk7Ci0KLSAgU2JEcm1TdWJTYW1wbGVNYXBwaW5nIGRlZmF1bHRfc3Vic2FtcGxlID0gezAsIHNhbXBsZV9zaXplfTsKLSAgaWYgKHN1YnNhbXBsZV9jb3VudCA9PSAwKSB7Ci0gICAgc3Vic2FtcGxlX21hcHBpbmcgPSAmZGVmYXVsdF9zdWJzYW1wbGU7Ci0gICAgc3Vic2FtcGxlX2NvdW50ID0gMTsKLSAgfQotICBzYW1wbGUtPlNldEJsb2IoCi0gICAgICBNRlNhbXBsZUV4dGVuc2lvbl9FbmNyeXB0aW9uX1N1YlNhbXBsZU1hcHBpbmdTcGxpdCwKLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVUlOVDgqPihzdWJzYW1wbGVfbWFwcGluZyksCi0gICAgICBzdGF0aWNfY2FzdDxVSU5UMzI+KHN1YnNhbXBsZV9jb3VudCAqIHNpemVvZihTYkRybVN1YlNhbXBsZU1hcHBpbmcpKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1EZWNyeXB0aW5nRGVjb2Rlcjo6RGVjcnlwdGluZ0RlY29kZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVkX3B0cjxNZWRpYVRyYW5zZm9ybT4gZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkRybVN5c3RlbSBkcm1fc3lzdGVtKQotICAgIDogdHlwZV8odHlwZSksIGRlY29kZXJfKGRlY29kZXIuUGFzcygpKSB7Ci0gIFNCX0RDSEVDSyhkZWNvZGVyXy5nZXQoKSk7Ci0gIGRybV9zeXN0ZW1fID0gc3RhdGljX2Nhc3Q8U2JEcm1TeXN0ZW1QbGF5cmVhZHkqPihkcm1fc3lzdGVtKTsKLX0KLQotRGVjcnlwdGluZ0RlY29kZXI6On5EZWNyeXB0aW5nRGVjb2RlcigpIHsKLSAgUmVzZXQoKTsKLX0KLQotYm9vbCBEZWNyeXB0aW5nRGVjb2Rlcjo6VHJ5V3JpdGVJbnB1dEJ1ZmZlcigKLSAgICBjb25zdCBzY29wZWRfcmVmcHRyPElucHV0QnVmZmVyPiYgaW5wdXRfYnVmZmVyLAotICAgIGludCBieXRlc190b19za2lwX2luX3NhbXBsZSkgewotICBTQl9EQ0hFQ0soaW5wdXRfYnVmZmVyKTsKLSAgU0JfRENIRUNLKGJ5dGVzX3RvX3NraXBfaW5fc2FtcGxlID49IDApOwotCi0gIENvbVB0cjxJTUZTYW1wbGU+IGlucHV0X3NhbXBsZTsKLQotICBjb25zdCBTYkRybVNhbXBsZUluZm8qIGRybV9pbmZvID0gaW5wdXRfYnVmZmVyLT5kcm1faW5mbygpOwotICBjb25zdCB1aW50OF90KiBrZXlfaWQgPSBOVUxMOwotICBpbnQga2V5X2lkX3NpemUgPSAwOwotICBib29sIGVuY3J5cHRlZCA9IGZhbHNlOwotCi0gIGlmIChkcm1faW5mbyAhPSBOVUxMICYmIGRybV9pbmZvLT5pZGVudGlmaWVyX3NpemUgPT0gMTYgJiYKLSAgICAgIChkcm1faW5mby0+aW5pdGlhbGl6YXRpb25fdmVjdG9yX3NpemUgPT0gOCB8fAotICAgICAgIGRybV9pbmZvLT5pbml0aWFsaXphdGlvbl92ZWN0b3Jfc2l6ZSA9PSAxNikpIHsKLSAgICBrZXlfaWQgPSBkcm1faW5mby0+aWRlbnRpZmllcjsKLSAgICBrZXlfaWRfc2l6ZSA9IGRybV9pbmZvLT5pZGVudGlmaWVyX3NpemU7Ci0gICAgZW5jcnlwdGVkID0gdHJ1ZTsKLSAgfQotCi0gIGlmIChpbnB1dF9idWZmZXIgPT0gbGFzdF9pbnB1dF9idWZmZXJfKSB7Ci0gICAgU0JfRENIRUNLKGxhc3RfaW5wdXRfc2FtcGxlXyk7Ci0gICAgaW5wdXRfc2FtcGxlID0gbGFzdF9pbnB1dF9zYW1wbGVfOwotICB9IGVsc2UgewotICAgIGlmIChpbnB1dF9idWZmZXItPnNpemUoKSA8IGJ5dGVzX3RvX3NraXBfaW5fc2FtcGxlKSB7Ci0gICAgICBTQl9OT1RSRUFDSEVEKCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgY29uc3Qgdm9pZCogZGF0YSA9IGlucHV0X2J1ZmZlci0+ZGF0YSgpICsgYnl0ZXNfdG9fc2tpcF9pbl9zYW1wbGU7Ci0gICAgaW50IHNpemUgPSBpbnB1dF9idWZmZXItPnNpemUoKSAtIGJ5dGVzX3RvX3NraXBfaW5fc2FtcGxlOwotCi0gICAgc3RkOjppbnQ2NF90IHdpbjMyX3RpbWVzdGFtcCA9Ci0gICAgICAgIENvbnZlcnRUb1dpbjMyVGltZShpbnB1dF9idWZmZXItPnRpbWVzdGFtcCgpKTsKLSAgICBjb25zdCB1aW50OF90KiBpdiA9IE5VTEw7Ci0gICAgaW50IGl2X3NpemUgPSAwOwotICAgIGNvbnN0IFNiRHJtU3ViU2FtcGxlTWFwcGluZyogc3Vic2FtcGxlX21hcHBpbmcgPSBOVUxMOwotICAgIGludCBzdWJzYW1wbGVfY291bnQgPSAwOwotCi0gICAgaWYgKGRybV9pbmZvICE9IE5VTEwgJiYgZHJtX2luZm8tPmluaXRpYWxpemF0aW9uX3ZlY3Rvcl9zaXplICE9IDApIHsKLSAgICAgIGlmIChieXRlc190b19za2lwX2luX3NhbXBsZSAhPSAwKSB7Ci0gICAgICAgIGlmIChkcm1faW5mby0+c3Vic2FtcGxlX2NvdW50ICE9IDAgJiYgZHJtX2luZm8tPnN1YnNhbXBsZV9jb3VudCAhPSAxKSB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkcm1faW5mby0+c3Vic2FtcGxlX2NvdW50ID09IDEpIHsKLSAgICAgICAgICBpZiAoZHJtX2luZm8tPnN1YnNhbXBsZV9tYXBwaW5nWzBdLmNsZWFyX2J5dGVfY291bnQgIT0KLSAgICAgICAgICAgICAgYnl0ZXNfdG9fc2tpcF9pbl9zYW1wbGUpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN1YnNhbXBsZV9tYXBwaW5nID0gZHJtX2luZm8tPnN1YnNhbXBsZV9tYXBwaW5nOwotICAgICAgICBzdWJzYW1wbGVfY291bnQgPSBkcm1faW5mby0+c3Vic2FtcGxlX2NvdW50OwotICAgICAgfQotCi0gICAgICBpdiA9IGRybV9pbmZvLT5pbml0aWFsaXphdGlvbl92ZWN0b3I7Ci0gICAgICBpdl9zaXplID0gZHJtX2luZm8tPmluaXRpYWxpemF0aW9uX3ZlY3Rvcl9zaXplOwotICAgIH0KLQotICAgIC8vIE1GU2FtcGxlRXh0ZW5zaW9uX0NsZWFuUG9pbnQgaXMgYSBrZXktZnJhbWUgZm9yIHRoZSB2aWRlbyArIGF1ZGlvLiBJdCBpcwotICAgIC8vIG5vdCBzZXQgaGVyZSBiZWNhdXNlIHRoZSB3aW4zMiBzeXN0ZW0gaXMgc21hcnQgZW5vdWdoIHRvIGZpZ3VyZSB0aGlzIG91dC4KLSAgICAvLyBJdCB3aWxsIHByb2JhYmx5IGJlIHRvdGFsbHkgb2sgdG8gbm90IHNldCB0aGlzIGF0IGFsbC4gUmVzb2x1dGlvbjogSWYKLSAgICAvLyB0aGVyZSBhcmUgcHJvYmxlbXMgd2l0aCB3aW4zMiB2aWRlbyBkZWNvZGluZywgY29tZSBiYWNrIHRvIHRoaXMgYW5kIHNlZQotICAgIC8vIGlmIHNldHRpbmcgdGhpcyB3aWxsIGZpeCBpdC4gVEhpcyB3aWxsIGJlIHVzZWQgaWYKLSAgICAvLyBTYk1lZGlhVmlkZW9TYW1wbGVJbmZvOjppc19rZXlfZnJhbWUgaXMgdHJ1ZSBpbnNpZGUgb2YgdGhlIHRoaXMgZnVuY3Rpb24KLSAgICAvLyAod2hpY2ggd2lsbCByZWNlaXZlIGFuIElucHV0QnVmZmVyKS4KLSAgICBpbnB1dF9zYW1wbGUgPSBDcmVhdGVTYW1wbGUoZGF0YSwgc2l6ZSwgd2luMzJfdGltZXN0YW1wKTsKLQotICAgIGlmIChlbmNyeXB0ZWQpIHsKLSAgICAgIEF0dGFjaERybURhdGFUb1NhbXBsZShpbnB1dF9zYW1wbGUsIHNpemUsIGtleV9pZCwga2V5X2lkX3NpemUsIGl2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl2X3NpemUsIHN1YnNhbXBsZV9tYXBwaW5nLCBzdWJzYW1wbGVfY291bnQpOwotICAgIH0KLSAgICBsYXN0X2lucHV0X2J1ZmZlcl8gPSBpbnB1dF9idWZmZXI7Ci0gICAgbGFzdF9pbnB1dF9zYW1wbGVfID0gaW5wdXRfc2FtcGxlOwotICB9Ci0KLSAgaWYgKGVuY3J5cHRlZCkgewotICAgIGlmICghZGVjcnlwdG9yXykgewotICAgICAgaWYgKGRlY29kZXJfLT5kcmFpbmluZygpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlmICghZGVjb2Rlcl8tPmRyYWluZWQoKSkgewotICAgICAgICBkZWNvZGVyXy0+RHJhaW4oKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgZGVjb2Rlcl8tPlJlc2V0RnJvbURyYWluZWQoKTsKLSAgICAgIHNjb3BlZF9yZWZwdHI8U2JEcm1TeXN0ZW1QbGF5cmVhZHk6OkxpY2Vuc2U+IGxpY2Vuc2UgPQotICAgICAgICAgIGRybV9zeXN0ZW1fLT5HZXRMaWNlbnNlKGtleV9pZCwga2V5X2lkX3NpemUpOwotICAgICAgaWYgKGxpY2Vuc2UgJiYgbGljZW5zZS0+dXNhYmxlKCkpIHsKLSAgICAgICAgZGVjcnlwdG9yXy5yZXNldChuZXcgTWVkaWFUcmFuc2Zvcm0obGljZW5zZS0+ZGVjcnlwdG9yKCkpKTsKLSAgICAgICAgYm9vbCBzdWNjZXNzID0gQWN0aXZhdGVEZWNyeXB0b3IoKTsKLSAgICAgICAgaWYgKCFzdWNjZXNzKSB7Ci0gICAgICAgICAgZGVjcnlwdG9yXy5yZXNldCgpOwotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBpZiAoIWRlY3J5cHRvcl8pIHsKLSAgICAgIFNCX05PVFJFQUNIRUQoKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICBpZiAoZW5jcnlwdGVkKSB7Ci0gICAgcmV0dXJuIGRlY3J5cHRvcl8tPlRyeVdyaXRlKGlucHV0X3NhbXBsZSk7Ci0gIH0KLSAgcmV0dXJuIGRlY29kZXJfLT5UcnlXcml0ZShpbnB1dF9zYW1wbGUpOwotfQotCi1ib29sIERlY3J5cHRpbmdEZWNvZGVyOjpQcm9jZXNzQW5kUmVhZChDb21QdHI8SU1GU2FtcGxlPiogb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tUHRyPElNRk1lZGlhVHlwZT4qIG5ld190eXBlKSB7Ci0gIGJvb2wgZGlkX3NvbWV0aGluZyA9IGZhbHNlOwotCi0gICpvdXRwdXQgPSBkZWNvZGVyXy0+VHJ5UmVhZChuZXdfdHlwZSk7Ci0gIGRpZF9zb21ldGhpbmcgfD0gKm91dHB1dCAhPSBOVUxMOwotCi0gIGlmIChkZWNyeXB0b3JfKSB7Ci0gICAgaWYgKCFwZW5kaW5nX2RlY3J5cHRvcl9vdXRwdXRfKSB7Ci0gICAgICBDb21QdHI8SU1GTWVkaWFUeXBlPiBpZ25vcmVkX3R5cGU7Ci0gICAgICBwZW5kaW5nX2RlY3J5cHRvcl9vdXRwdXRfID0gZGVjcnlwdG9yXy0+VHJ5UmVhZCgmaWdub3JlZF90eXBlKTsKLSAgICAgIGRpZF9zb21ldGhpbmcgfD0gcGVuZGluZ19kZWNyeXB0b3Jfb3V0cHV0XyAhPSBOVUxMOwotICAgIH0KLQotICAgIGlmIChwZW5kaW5nX2RlY3J5cHRvcl9vdXRwdXRfKSB7Ci0gICAgICBpZiAoZGVjb2Rlcl8tPlRyeVdyaXRlKHBlbmRpbmdfZGVjcnlwdG9yX291dHB1dF8pKSB7Ci0gICAgICAgIHBlbmRpbmdfZGVjcnlwdG9yX291dHB1dF8uUmVzZXQoKTsKLSAgICAgICAgZGlkX3NvbWV0aGluZyA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGRlY3J5cHRvcl8tPmRyYWluZWQoKSAmJiAhZGVjb2Rlcl8tPmRyYWluaW5nKCkgJiYKLSAgICAgICAgIWRlY29kZXJfLT5kcmFpbmVkKCkpIHsKLSAgICAgIGRlY29kZXJfLT5EcmFpbigpOwotICAgICAgZGlkX3NvbWV0aGluZyA9IHRydWU7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIGRpZF9zb21ldGhpbmc7Ci19Ci0KLXZvaWQgRGVjcnlwdGluZ0RlY29kZXI6OkRyYWluKCkgewotICBpZiAoZGVjcnlwdG9yXykgewotICAgIGRlY3J5cHRvcl8tPkRyYWluKCk7Ci0gIH0gZWxzZSB7Ci0gICAgZGVjb2Rlcl8tPkRyYWluKCk7Ci0gIH0KLX0KLQotYm9vbCBEZWNyeXB0aW5nRGVjb2Rlcjo6QWN0aXZhdGVEZWNyeXB0b3IoKSB7Ci0gIFNCX0RDSEVDSyhkZWNyeXB0b3JfKTsKLQotICBDb21QdHI8SU1GTWVkaWFUeXBlPiBkZWNvZGVyX291dHB1dF90eXBlID0gZGVjb2Rlcl8tPkdldEN1cnJlbnRPdXRwdXRUeXBlKCk7Ci0gIGRlY3J5cHRvcl8tPlNldElucHV0VHlwZShkZWNvZGVyXy0+R2V0Q3VycmVudElucHV0VHlwZSgpKTsKLQotICBHVUlEIG9yaWdpbmFsX3N1Yl90eXBlOwotICBkZWNvZGVyX291dHB1dF90eXBlLT5HZXRHVUlEKE1GX01UX1NVQlRZUEUsICZvcmlnaW5hbF9zdWJfdHlwZSk7Ci0KLSAgLy8gRW5zdXJlIHRoYXQgdGhlIGRlY3J5cHRvciBhbmQgdGhlIGRlY29kZXIgYWdyZWVzIG9uIHRoZSBwcm90ZWN0aW9uIG9mCi0gIC8vIHNhbXBsZXMgdHJhbnNmZXJyZWQgYmV0d2VlbiB0aGVtLgotICBDb21QdHI8SU1GU2FtcGxlUHJvdGVjdGlvbj4gZGVjcnlwdGlvbl9zYW1wbGVfcHJvdGVjdGlvbiA9Ci0gICAgICBkZWNyeXB0b3JfLT5HZXRTYW1wbGVQcm90ZWN0aW9uKCk7Ci0gIFNCX0RDSEVDSyhkZWNyeXB0aW9uX3NhbXBsZV9wcm90ZWN0aW9uKTsKLQotICBEV09SRCBkZWNyeXB0aW9uX3Byb3RlY3Rpb25fdmVyc2lvbjsKLSAgSFJFU1VMVCBociA9IGRlY3J5cHRpb25fc2FtcGxlX3Byb3RlY3Rpb24tPkdldE91dHB1dFByb3RlY3Rpb25WZXJzaW9uKAotICAgICAgJmRlY3J5cHRpb25fcHJvdGVjdGlvbl92ZXJzaW9uKTsKLSAgQ2hlY2tSZXN1bHQoaHIpOwotCi0gIENvbVB0cjxJTUZTYW1wbGVQcm90ZWN0aW9uPiBkZWNvZGVyX3NhbXBsZV9wcm90ZWN0aW9uID0KLSAgICAgIGRlY29kZXJfLT5HZXRTYW1wbGVQcm90ZWN0aW9uKCk7Ci0gIFNCX0RDSEVDSyhkZWNvZGVyX3NhbXBsZV9wcm90ZWN0aW9uKTsKLQotICBEV09SRCBkZWNvZGVyX3Byb3RlY3Rpb25fdmVyc2lvbjsKLSAgaHIgPSBkZWNvZGVyX3NhbXBsZV9wcm90ZWN0aW9uLT5HZXRJbnB1dFByb3RlY3Rpb25WZXJzaW9uKAotICAgICAgJmRlY29kZXJfcHJvdGVjdGlvbl92ZXJzaW9uKTsKLSAgQ2hlY2tSZXN1bHQoaHIpOwotCi0gIERXT1JEIHByb3RlY3Rpb25fdmVyc2lvbiA9Ci0gICAgICBzdGQ6Om1pbihkZWNvZGVyX3Byb3RlY3Rpb25fdmVyc2lvbiwgZGVjcnlwdGlvbl9wcm90ZWN0aW9uX3ZlcnNpb24pOwotICBpZiAocHJvdGVjdGlvbl92ZXJzaW9uIDwgU0FNUExFX1BST1RFQ1RJT05fVkVSU0lPTl9SQzQpIHsKLSAgICBTQl9OT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBCWVRFKiBjZXJ0X2RhdGEgPSBOVUxMOwotICBEV09SRCBjZXJ0X2RhdGFfc2l6ZSA9IDA7Ci0KLSAgaHIgPSBkZWNvZGVyX3NhbXBsZV9wcm90ZWN0aW9uLT5HZXRQcm90ZWN0aW9uQ2VydGlmaWNhdGUoCi0gICAgICBwcm90ZWN0aW9uX3ZlcnNpb24sICZjZXJ0X2RhdGEsICZjZXJ0X2RhdGFfc2l6ZSk7Ci0gIENoZWNrUmVzdWx0KGhyKTsKLQotICBCWVRFKiBjcnlwdF9zZWVkID0gTlVMTDsKLSAgRFdPUkQgY3J5cHRfc2VlZF9zaXplID0gMDsKLSAgaHIgPSBkZWNyeXB0aW9uX3NhbXBsZV9wcm90ZWN0aW9uLT5Jbml0T3V0cHV0UHJvdGVjdGlvbigKLSAgICAgIHByb3RlY3Rpb25fdmVyc2lvbiwgMCwgY2VydF9kYXRhLCBjZXJ0X2RhdGFfc2l6ZSwgJmNyeXB0X3NlZWQsCi0gICAgICAmY3J5cHRfc2VlZF9zaXplKTsKLSAgaWYgKEZBSUxFRChocikpIHsKLSAgICAvLyBUaGlzIGNhbiBoYXBwZW4gaWYgd2UgY2FsbCBJbml0T3V0cHV0UHJvdGVjdGlvbiB3aGlsZSBwcm9jZXNpbmcKLSAgICAvLyBhIFVXUCByZXN1bWUgZXZlbnQgb3Igc2hvcnRseSBhZnRlci4KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgQ2hlY2tSZXN1bHQoaHIpOwotCi0gIGhyID0gZGVjb2Rlcl9zYW1wbGVfcHJvdGVjdGlvbi0+SW5pdElucHV0UHJvdGVjdGlvbigKLSAgICAgIHByb3RlY3Rpb25fdmVyc2lvbiwgMCwgY3J5cHRfc2VlZCwgY3J5cHRfc2VlZF9zaXplKTsKLSAgQ2hlY2tSZXN1bHQoaHIpOwotCi0gIENvVGFza01lbUZyZWUoY2VydF9kYXRhKTsKLSAgQ29UYXNrTWVtRnJlZShjcnlwdF9zZWVkKTsKLQotICAvLyBFbnN1cmUgdGhhdCB0aGUgaW5wdXQgdHlwZSBvZiB0aGUgZGVjb2RlciBpcyB0aGUgb3V0cHV0IHR5cGUgb2YgdGhlCi0gIC8vIGRlY3J5cHRvci4KLSAgQ29tUHRyPElNRk1lZGlhVHlwZT4gZGVjb2Rlcl9pbnB1dF90eXBlOwotICBzdGQ6OnZlY3RvcjxDb21QdHI8SU1GTWVkaWFUeXBlPj4gZGVjcnlwdG9yX291dHB1dF90eXBlcyA9Ci0gICAgICBkZWNyeXB0b3JfLT5HZXRBdmFpbGFibGVPdXRwdXRUeXBlcygpOwotICBTQl9EQ0hFQ0soIWRlY3J5cHRvcl9vdXRwdXRfdHlwZXMuZW1wdHkoKSk7Ci0KLSAgZGVjcnlwdG9yXy0+U2V0T3V0cHV0VHlwZShkZWNyeXB0b3Jfb3V0cHV0X3R5cGVzWzBdKTsKLSAgZGVjb2Rlcl8tPlNldElucHV0VHlwZShkZWNyeXB0b3Jfb3V0cHV0X3R5cGVzWzBdKTsKLQotICBzdGQ6OnZlY3RvcjxDb21QdHI8SU1GTWVkaWFUeXBlPj4gZGVjb2Rlcl9vdXRwdXRfdHlwZXMgPQotICAgICAgZGVjb2Rlcl8tPkdldEF2YWlsYWJsZU91dHB1dFR5cGVzKCk7Ci0gIGZvciAoYXV0byBvdXRwdXRfdHlwZSA6IGRlY29kZXJfb3V0cHV0X3R5cGVzKSB7Ci0gICAgR1VJRCBzdWJfdHlwZTsKLSAgICBvdXRwdXRfdHlwZS0+R2V0R1VJRChNRl9NVF9TVUJUWVBFLCAmc3ViX3R5cGUpOwotICAgIGlmIChJc0VxdWFsR1VJRChzdWJfdHlwZSwgb3JpZ2luYWxfc3ViX3R5cGUpKSB7Ci0gICAgICBkZWNvZGVyXy0+U2V0T3V0cHV0VHlwZShvdXRwdXRfdHlwZSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgRGVjcnlwdGluZ0RlY29kZXI6OlJlc2V0KCkgewotICBpZiAoZGVjcnlwdG9yXykgewotICAgIGRlY3J5cHRvcl8tPlJlc2V0KCk7Ci0gIH0KLSAgZGVjb2Rlcl8tPlJlc2V0KCk7Ci0KLSAgbGFzdF9pbnB1dF9idWZmZXJfID0gbnVsbHB0cjsKLSAgbGFzdF9pbnB1dF9zYW1wbGVfID0gbnVsbHB0cjsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHdpbjMyCi19ICAvLyBuYW1lc3BhY2Ugc2hhcmVkCi19ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9kZWNyeXB0aW5nX2RlY29kZXIuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2RlY3J5cHRpbmdfZGVjb2Rlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjVkNjEyLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2RlY3J5cHRpbmdfZGVjb2Rlci5oCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBTVEFSQk9BUkRfU0hBUkVEX1dJTjMyX0RFQ1JZUFRJTkdfREVDT0RFUl9IXwotI2RlZmluZSBTVEFSQk9BUkRfU0hBUkVEX1dJTjMyX0RFQ1JZUFRJTkdfREVDT0RFUl9IXwotCi0jaW5jbHVkZSA8RDNEMTEuaD4KLSNpbmNsdWRlIDxtZmFwaS5oPgotI2luY2x1ZGUgPG1mZXJyb3IuaD4KLSNpbmNsdWRlIDxtZmlkbC5oPgotI2luY2x1ZGUgPHdybFxjbGllbnQuaD4KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJzdGFyYm9hcmQvY29tbW9uL3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL2NvbW1vbi9zY29wZWRfcHRyLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL2RybS5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZWRpYS5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvZHJtX3N5c3RlbV9wbGF5cmVhZHkuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL21lZGlhX2NvbW1vbi5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvbWVkaWFfdHJhbnNmb3JtLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3R5cGVzLmgiCi0KLW5hbWVzcGFjZSBzdGFyYm9hcmQgewotbmFtZXNwYWNlIHNoYXJlZCB7Ci1uYW1lc3BhY2Ugd2luMzIgewotCi0vLyBUaGlzIGNsYXNzIG1haW50YWlucyBhIE1lZGlhVHJhbnNmb3JtIGJhc2VkIGRlY29kaW5nIHN0cmVhbS4gIFdoZW4gdGhlCi0vLyBzdHJlYW0gaXMgZW5jcnlwdGVkLCBpdCBhbHNvIGNvbnRhaW5zIGEgTWVkaWFUcmFuc2Zvcm0gYmFzZWQgZGVjcnlwdG9yIGFuZAotLy8gbWFuYWdlcyB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiB0aGUgZGVjcnlwdG9yIGFuZCB0aGUgZGVjb2Rlci4KLWNsYXNzIERlY3J5cHRpbmdEZWNvZGVyIHsKLSBwdWJsaWM6Ci0gIERlY3J5cHRpbmdEZWNvZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlLAotICAgICAgICAgICAgICAgICAgICBzY29wZWRfcHRyPE1lZGlhVHJhbnNmb3JtPiBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICBTYkRybVN5c3RlbSBkcm1fc3lzdGVtKTsKLSAgfkRlY3J5cHRpbmdEZWNvZGVyKCk7Ci0KLSAgTWVkaWFUcmFuc2Zvcm0qIEdldERlY29kZXIoKSB7IHJldHVybiBkZWNvZGVyXy5nZXQoKTsgfQotCi0gIGJvb2wgVHJ5V3JpdGVJbnB1dEJ1ZmZlcihjb25zdCBzY29wZWRfcmVmcHRyPElucHV0QnVmZmVyPiYgaW5wdXRfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ5dGVzX3RvX3NraXBfaW5fc2FtcGxlKTsKLQotICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBhbnkgaW50ZXJuYWwgYWN0aW9ucyBzdWNjZWVkZWQsIHRoaXMgaW1wbGllcyB0aGF0Ci0gIC8vIHRoZSBjYWxsZXIgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiBhZ2FpbiB0byBwcm9jZXNzIGZ1cnRoZXIuCi0gIC8vIHxvdXRwdXR8IGNvbnRhaW5zIHRoZSBkZWNyeXB0ZWQgYW5kIGRlY29kZWQgb3V0cHV0IGlmIHRoZXJlIGlzIGFueS4KLSAgLy8gfG5ld190eXBlfCBjb250YWlucyB0aGUgbmV3IG91dHB1dCB0eXBlIGluIGNhc2UgdGhlIG91dHB1dCB0eXBlIG9mIHRoZQotICAvLyBkZWNvZGluZyBzdHJlYW0gaXMgY2hhbmdlZC4KLSAgYm9vbCBQcm9jZXNzQW5kUmVhZChDb21QdHI8SU1GU2FtcGxlPiogb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgIENvbVB0cjxJTUZNZWRpYVR5cGU+KiBuZXdfdHlwZSk7Ci0gIHZvaWQgRHJhaW4oKTsKLSAgdm9pZCBSZXNldCgpOwotCi0gcHJpdmF0ZToKLSAgYm9vbCBBY3RpdmF0ZURlY3J5cHRvcigpOwotCi0gIC8vIFRPRE86IENsYXJpZnkgdGhlIHRocmVhZCBwYXR0ZXJuIG9mIHRoaXMgY2xhc3MuCi0gIGNvbnN0IHN0ZDo6c3RyaW5nIHR5cGVfOyAgLy8gRm9yIGRlYnVnZ2luZyBwdXJwb3NlLgotICBTYkRybVN5c3RlbVBsYXlyZWFkeSogZHJtX3N5c3RlbV87Ci0KLSAgc2NvcGVkX3B0cjxNZWRpYVRyYW5zZm9ybT4gZGVjcnlwdG9yXzsKLSAgc2NvcGVkX3B0cjxNZWRpYVRyYW5zZm9ybT4gZGVjb2Rlcl87Ci0KLSAgc2NvcGVkX3JlZnB0cjxJbnB1dEJ1ZmZlcj4gbGFzdF9pbnB1dF9idWZmZXJfOwotICBDb21QdHI8SU1GU2FtcGxlPiBsYXN0X2lucHV0X3NhbXBsZV87Ci0KLSAgQ29tUHRyPElNRlNhbXBsZT4gcGVuZGluZ19kZWNyeXB0b3Jfb3V0cHV0XzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSB3aW4zMgotfSAgLy8gbmFtZXNwYWNlIHNoYXJlZAotfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZAotCi0jZW5kaWYgIC8vIFNUQVJCT0FSRF9TSEFSRURfV0lOMzJfREVDUllQVElOR19ERUNPREVSX0hfCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9kaWFsb2cuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9kaWFsb2cuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhYzVhZTAuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZGlhbG9nLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2RpYWxvZy5oIgotCi0jaW5jbHVkZSA8d2luZGVmLmg+Ci0jaW5jbHVkZSA8d2luZG93cy5oPgotI2luY2x1ZGUgPHdpbmRvd3N4Lmg+Ci0KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2Vycm9yX3V0aWxzLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi93Y2hhcl91dGlscy5oIgotCi10eXBlZGVmIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBEaWFsb2dDYWxsYmFjazsKLQotdXNpbmcgc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOjpEZWJ1Z0xvZ1dpbkVycm9yOwotdXNpbmcgc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOjpDU3RyaW5nVG9XU3RyaW5nOwotCi1uYW1lc3BhY2UgewotSFdORCBnX2N1cnJlbnRfZGlhbG9nX2hhbmRsZSA9IG51bGxwdHI7Ci1EaWFsb2dDYWxsYmFjayBnX29rX2NhbGxiYWNrOwotRGlhbG9nQ2FsbGJhY2sgZ19jYW5jZWxfY2FsbGJhY2s7Ci19ICAvLyBuYW1lc3BhY2UKLQotLy8gV3JhcHMgdGhlIHdpbjMyIERpYWxvZyBpbnRlcmZhY2UgZm9yIGJ1aWxkaW5nIERpYWxvZ3MgYXQgcnVudGltZS4KLS8vIGh0dHBzOi8vYmxvZ3MubXNkbi5taWNyb3NvZnQuY29tL29sZG5ld3RoaW5nLzIwMDUwNDI5LTAwLz9wPTM1NzQzCi1jbGFzcyBEaWFsb2dUZW1wbGF0ZUJ1aWxkZXIgewotIHB1YmxpYzoKLSAgTFBDRExHVEVNUExBVEUgQnVpbGRUZW1wbGF0ZSgpIHsgcmV0dXJuIChMUENETEdURU1QTEFURSkmdlswXTsgfQotICB2b2lkIEFsaWduVG9Ed29yZCgpIHsKLSAgICBpZiAodi5zaXplKCkgJSA0KQotICAgICAgV3JpdGUoTlVMTCwgNCAtICh2LnNpemUoKSAlIDQpKTsKLSAgfQotICB2b2lkIFdyaXRlKExQQ1ZPSUQgcHZXcml0ZSwgRFdPUkQgY2JXcml0ZSkgewotICAgIHYuaW5zZXJ0KHYuZW5kKCksIGNiV3JpdGUsIDApOwotICAgIGlmIChwdldyaXRlKQotICAgICAgQ29weU1lbW9yeSgmdlt2LnNpemUoKSAtIGNiV3JpdGVdLCBwdldyaXRlLCBjYldyaXRlKTsKLSAgfQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgdm9pZCBXcml0ZShUIHQpIHsKLSAgICBXcml0ZSgmdCwgc2l6ZW9mKFQpKTsKLSAgfQotICB2b2lkIFdyaXRlU3RyaW5nKExQQ1dTVFIgcHN6KSB7Ci0gICAgV3JpdGUocHN6LCAobHN0cmxlblcocHN6KSArIDEpICogc2l6ZW9mKFdDSEFSKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHN0ZDo6dmVjdG9yPEJZVEU+IHY7Ci19OwotCi1JTlRfUFRSIENBTExCQUNLIERpYWxvZ1Byb2NlZHVyZUNhbGxiYWNrKEhXTkQgZGlhbG9nX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUEFSQU0gd19wYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBBUkFNIC8qbF9wYXJhbSovKSB7Ci0gIFNCX0NIRUNLKCFnX2N1cnJlbnRfZGlhbG9nX2hhbmRsZSB8fCBkaWFsb2dfaGFuZGxlID09IGdfY3VycmVudF9kaWFsb2dfaGFuZGxlKQotICAgICAgPDwgIlJlY2VpdmVkIGNhbGxiYWNrIG9uIG5vbi1hY3RpdmUgZGlhbG9nISBPbmx5IG9uZSBkaWFsb2cgYXQgYSB0aW1lIGlzICIKLSAgICAgICAgICJzdXBwb3J0ZWQuIjsKLSAgc3dpdGNoIChtZXNzYWdlKSB7Ci0gICAgY2FzZSBXTV9JTklURElBTE9HOgotICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgY2FzZSBXTV9DT01NQU5EOgotICAgICAgYXV0byBjb21tYW5kX2lkID0gR0VUX1dNX0NPTU1BTkRfSUQod19wYXJhbSwgbF9wYXJhbSk7Ci0gICAgICBpZiAoY29tbWFuZF9pZCA9PSBJRENBTkNFTCkgewotICAgICAgICBnX2NhbmNlbF9jYWxsYmFjaygpOwotICAgICAgfSBlbHNlIGlmIChjb21tYW5kX2lkID09IElET0spIHsKLSAgICAgICAgZ19va19jYWxsYmFjaygpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgfQotICAgICAgRW5kRGlhbG9nKGRpYWxvZ19oYW5kbGUsIDApOwotICAgICAgZ19jdXJyZW50X2RpYWxvZ19oYW5kbGUgPSBudWxscHRyOwotICAgICAgcmV0dXJuIFRSVUU7Ci0gIH0KLSAgcmV0dXJuIEZBTFNFOwotfQotCi1uYW1lc3BhY2Ugc3RhcmJvYXJkIHsKLW5hbWVzcGFjZSBzaGFyZWQgewotbmFtZXNwYWNlIHdpbjMyIHsKLQotYm9vbCBTaG93T2tDYW5jZWxEaWFsb2coSFdORCBod25kLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRpdGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb2tfbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIERpYWxvZ0NhbGxiYWNrIG9rX2NhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNhbmNlbF9tZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgRGlhbG9nQ2FsbGJhY2sgY2FuY2VsX2NhbGxiYWNrKSB7Ci0gIGlmIChnX2N1cnJlbnRfZGlhbG9nX2hhbmRsZSAhPSBudWxscHRyKSB7Ci0gICAgU0JfTE9HKFdBUk5JTkcpIDw8ICJBbHJlYWR5IHNob3dpbmcgYSBkaWFsb2c7IGNhbmNlbGxpbmcgZXhpc3RpbmcgYW5kICIKLSAgICAgICAgICAgICAgICAgICAgICAgInJlcGxhY2luZyB3aXRoIG5ldyBkaWFsb2ciOwotICAgIENhbmNlbERpYWxvZygpOwotICB9Ci0gIGdfb2tfY2FsbGJhY2sgPSBva19jYWxsYmFjazsKLSAgZ19jYW5jZWxfY2FsbGJhY2sgPSBjYW5jZWxfY2FsbGJhY2s7Ci0gIC8vIEdldCB0aGUgZGV2aWNlIGNvbnRleHQgKERDKSBhbmQgZnJvbSB0aGUgc3lzdGVtIHNvIHdlIGNhbiBzY2FsZSBvdXIgZm9udHMKLSAgLy8gY29ycmVjdGx5LgotICBIREMgaGRjID0gR2V0REMoTlVMTCk7Ci0gIFNCX0NIRUNLKGhkYyk7Ci0gIE5PTkNMSUVOVE1FVFJJQ1NXIG5jbSA9IHtzaXplb2YobmNtKX07Ci0gIGJvb2wgcmV0cmlldmVkX3N5c3RlbV9wYXJhbXMgPQotICAgICAgU3lzdGVtUGFyYW1ldGVyc0luZm9XKFNQSV9HRVROT05DTElFTlRNRVRSSUNTLCAwLCAmbmNtLCAwKTsKLQotICBpZiAoIXJldHJpZXZlZF9zeXN0ZW1fcGFyYW1zKSB7Ci0gICAgRGVidWdMb2dXaW5FcnJvcigpOwotICAgIFJlbGVhc2VEQyhOVUxMLCBoZGMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBEaWFsb2dUZW1wbGF0ZUJ1aWxkZXIgZGlhbG9nX3RlbXBsYXRlOwotICBjb25zdCBpbnQgaGVscF9pZCA9IDA7Ci0gIGNvbnN0IGludCBleHRlbmRlZF9zdHlsZSA9IDA7Ci0KLSAgY29uc3QgaW50IHdpbmRvd193aWR0aCA9IDIwMDsKLSAgY29uc3QgaW50IHdpbmRvd19oZWlnaHQgPSA4MDsKLSAgY29uc3QgaW50IHdpbmRvd194ID0gMzI7Ci0gIGNvbnN0IGludCB3aW5kb3dfeSA9IDMyOwotCi0gIGNvbnN0IGludCBlZGdlX3BhZGRpbmcgPSA3OwotCi0gIGNvbnN0IGludCBidXR0b25faGVpZ2h0ID0gMTQ7Ci0gIGNvbnN0IGludCBidXR0b25fd2lkdGggPSA1MDsKLSAgY29uc3QgaW50IGJ1dHRvbl95ID0gd2luZG93X2hlaWdodCAtIGJ1dHRvbl9oZWlnaHQgLSBlZGdlX3BhZGRpbmc7Ci0gIGNvbnN0IGludCBsZWZ0X2J1dHRvbl94ID0gd2luZG93X3dpZHRoIC8gMiAtIGJ1dHRvbl93aWR0aCAtIGVkZ2VfcGFkZGluZyAvIDI7Ci0gIGNvbnN0IGludCByaWdodF9idXR0b25feCA9IHdpbmRvd193aWR0aCAvIDIgKyBlZGdlX3BhZGRpbmcgLyAyOwotICBjb25zdCBpbnQgdGV4dF93aWR0aCA9IHdpbmRvd193aWR0aCAtIGVkZ2VfcGFkZGluZyAqIDI7Ci0gIGNvbnN0IGludCB0ZXh0X2hlaWdodCA9IHdpbmRvd193aWR0aCAtIGVkZ2VfcGFkZGluZyAqIDMgLSBidXR0b25faGVpZ2h0OwotICBjb25zdCBpbnQgZXh0cmFfZGF0YSA9IDA7Ci0KLSAgLy8gQ3JlYXRlIGEgZGlhbG9nIHRlbXBsYXRlLgotICAvLyBUaGUgZm9sbG93aW5nIE1TRE4gYmxvZ3Bvc3RzIGV4cGxhaW5zIGhvdyB0aGlzIGlzIGFsbCBsYWlkIG91dDoKLSAgLy8gaHR0cHM6Ly9ibG9ncy5tc2RuLm1pY3Jvc29mdC5jb20vb2xkbmV3dGhpbmcvMjAwNDA2MjMtMDAvP3A9Mzg3NTMKLSAgLy8gaHR0cHM6Ly9ibG9ncy5tc2RuLm1pY3Jvc29mdC5jb20vb2xkbmV3dGhpbmcvMjAwNTA0MjktMDAvP3A9MzU3NDMKLSAgLy8gTW9yZSBvZmZpY2lhbCBkb2N1bWVudGF0aW9uOgotICAvLyBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L3dpbmRvd3MvZGVza3RvcC9tczY0NDk5Nih2PXZzLjg1KS5hc3B4I21vZGVsZXNzX2JveAotICBkaWFsb2dfdGVtcGxhdGUuV3JpdGU8V09SRD4oMSk7ICAgICAgIC8vIGRpYWxvZyB2ZXJzaW9uCi0gIGRpYWxvZ190ZW1wbGF0ZS5Xcml0ZTxXT1JEPigweEZGRkYpOyAgLy8gZXh0ZW5kZWQgZGlhbG9nIHRlbXBsYXRlCi0gIGRpYWxvZ190ZW1wbGF0ZS5Xcml0ZTxEV09SRD4oaGVscF9pZCk7Ci0gIGRpYWxvZ190ZW1wbGF0ZS5Xcml0ZTxEV09SRD4oZXh0ZW5kZWRfc3R5bGUpOwotICBkaWFsb2dfdGVtcGxhdGUuV3JpdGU8RFdPUkQ+KFdTX0NBUFRJT04gfCBXU19TWVNNRU5VIHwgRFNfU0VURk9OVCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFNfTU9EQUxGUkFNRSk7Ci0gIGRpYWxvZ190ZW1wbGF0ZS5Xcml0ZTxXT1JEPigzKTsgIC8vIG51bWJlciBvZiBjb250cm9scwotICBkaWFsb2dfdGVtcGxhdGUuV3JpdGU8V09SRD4od2luZG93X3gpOwotICBkaWFsb2dfdGVtcGxhdGUuV3JpdGU8V09SRD4od2luZG93X3kpOwotICBkaWFsb2dfdGVtcGxhdGUuV3JpdGU8V09SRD4od2luZG93X3dpZHRoKTsKLSAgZGlhbG9nX3RlbXBsYXRlLldyaXRlPFdPUkQ+KHdpbmRvd19oZWlnaHQpOwotICBkaWFsb2dfdGVtcGxhdGUuV3JpdGVTdHJpbmcoTCIiKTsgIC8vIG5vIG1lbnUKLSAgZGlhbG9nX3RlbXBsYXRlLldyaXRlU3RyaW5nKEwiIik7ICAvLyBkZWZhdWx0IGRpYWxvZyBjbGFzcwotICAvLyBUaXRsZS4KLSAgZGlhbG9nX3RlbXBsYXRlLldyaXRlU3RyaW5nKAotICAgICAgKExQQ1dTVFIpc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOjpDU3RyaW5nVG9XU3RyaW5nKHRpdGxlLmNfc3RyKCkpCi0gICAgICAgICAgLmNfc3RyKCkpOwotCi0gIC8vIFNlZSBmb2xsb3dpbmcgZm9yIGluZm8gb24gaG93IHRoZSBmb250IHN0eWxpbmcgaXMgY2FsY3VsYXRlZDoKLSAgLy8gaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS93aW5kb3dzL2Rlc2t0b3AvZmY2ODQxNzModj12cy44NSkuYXNweAotICBpZiAobmNtLmxmTWVzc2FnZUZvbnQubGZIZWlnaHQgPCAwKSB7Ci0gICAgbmNtLmxmTWVzc2FnZUZvbnQubGZIZWlnaHQgPQotICAgICAgICAtTXVsRGl2KG5jbS5sZk1lc3NhZ2VGb250LmxmSGVpZ2h0LCA3MiwgR2V0RGV2aWNlQ2FwcyhoZGMsIExPR1BJWEVMU1kpKTsKLSAgfQotICBkaWFsb2dfdGVtcGxhdGUuV3JpdGU8V09SRD4oKFdPUkQpbmNtLmxmTWVzc2FnZUZvbnQubGZIZWlnaHQpOwotICBkaWFsb2dfdGVtcGxhdGUuV3JpdGU8V09SRD4oKFdPUkQpbmNtLmxmTWVzc2FnZUZvbnQubGZXZWlnaHQpOwotICBkaWFsb2dfdGVtcGxhdGUuV3JpdGU8QllURT4obmNtLmxmTWVzc2FnZUZvbnQubGZJdGFsaWMpOwotICBkaWFsb2dfdGVtcGxhdGUuV3JpdGU8QllURT4obmNtLmxmTWVzc2FnZUZvbnQubGZDaGFyU2V0KTsKLSAgZGlhbG9nX3RlbXBsYXRlLldyaXRlU3RyaW5nKG5jbS5sZk1lc3NhZ2VGb250LmxmRmFjZU5hbWUpOwotCi0gIC8vIE1lc3NhZ2UgdGV4dC4KLSAgZGlhbG9nX3RlbXBsYXRlLkFsaWduVG9Ed29yZCgpOwotICBkaWFsb2dfdGVtcGxhdGUuV3JpdGU8RFdPUkQ+KGhlbHBfaWQpOwotICBkaWFsb2dfdGVtcGxhdGUuV3JpdGU8RFdPUkQ+KGV4dGVuZGVkX3N0eWxlKTsKLSAgZGlhbG9nX3RlbXBsYXRlLldyaXRlPERXT1JEPihXU19DSElMRCB8IFdTX1ZJU0lCTEUpOwotICBkaWFsb2dfdGVtcGxhdGUuV3JpdGU8V09SRD4oZWRnZV9wYWRkaW5nKTsKLSAgZGlhbG9nX3RlbXBsYXRlLldyaXRlPFdPUkQ+KGVkZ2VfcGFkZGluZyk7Ci0gIGRpYWxvZ190ZW1wbGF0ZS5Xcml0ZTxXT1JEPih0ZXh0X3dpZHRoKTsKLSAgZGlhbG9nX3RlbXBsYXRlLldyaXRlPFdPUkQ+KHRleHRfaGVpZ2h0KTsKLSAgZGlhbG9nX3RlbXBsYXRlLldyaXRlPERXT1JEPigoRFdPUkQpLTEpOwotICBkaWFsb2dfdGVtcGxhdGUuV3JpdGU8RFdPUkQ+KDB4MDA4MkZGRkYpOwotICBkaWFsb2dfdGVtcGxhdGUuV3JpdGVTdHJpbmcoCi0gICAgICAoTFBDV1NUUilzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OkNTdHJpbmdUb1dTdHJpbmcobWVzc2FnZS5jX3N0cigpKQotICAgICAgICAgIC5jX3N0cigpKTsKLSAgZGlhbG9nX3RlbXBsYXRlLldyaXRlPFdPUkQ+KGV4dHJhX2RhdGEpOwotCi0gIC8vIENhbmNlbCBidXR0b24uCi0gIGRpYWxvZ190ZW1wbGF0ZS5BbGlnblRvRHdvcmQoKTsKLSAgZGlhbG9nX3RlbXBsYXRlLldyaXRlPERXT1JEPihoZWxwX2lkKTsKLSAgZGlhbG9nX3RlbXBsYXRlLldyaXRlPERXT1JEPihleHRlbmRlZF9zdHlsZSk7Ci0gIGRpYWxvZ190ZW1wbGF0ZS5Xcml0ZTxEV09SRD4oV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCU19ERUZQVVNIQlVUVE9OKTsKLSAgZGlhbG9nX3RlbXBsYXRlLldyaXRlPFdPUkQ+KGxlZnRfYnV0dG9uX3gpOwotICBkaWFsb2dfdGVtcGxhdGUuV3JpdGU8V09SRD4oYnV0dG9uX3kpOwotICBkaWFsb2dfdGVtcGxhdGUuV3JpdGU8V09SRD4oYnV0dG9uX3dpZHRoKTsKLSAgZGlhbG9nX3RlbXBsYXRlLldyaXRlPFdPUkQ+KGJ1dHRvbl9oZWlnaHQpOwotICBkaWFsb2dfdGVtcGxhdGUuV3JpdGU8RFdPUkQ+KElEQ0FOQ0VMKTsKLSAgZGlhbG9nX3RlbXBsYXRlLldyaXRlPERXT1JEPigweDAwODBGRkZGKTsKLSAgZGlhbG9nX3RlbXBsYXRlLldyaXRlU3RyaW5nKAotICAgICAgKExQQ1dTVFIpc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOjpDU3RyaW5nVG9XU3RyaW5nKAotICAgICAgICAgIGNhbmNlbF9tZXNzYWdlLmNfc3RyKCkpCi0gICAgICAgICAgLmNfc3RyKCkpOwotICBkaWFsb2dfdGVtcGxhdGUuV3JpdGU8V09SRD4oZXh0cmFfZGF0YSk7Ci0KLSAgLy8gT2sgYnV0dG9uLgotICBkaWFsb2dfdGVtcGxhdGUuQWxpZ25Ub0R3b3JkKCk7Ci0gIGRpYWxvZ190ZW1wbGF0ZS5Xcml0ZTxEV09SRD4oaGVscF9pZCk7Ci0gIGRpYWxvZ190ZW1wbGF0ZS5Xcml0ZTxEV09SRD4oZXh0ZW5kZWRfc3R5bGUpOwotICBkaWFsb2dfdGVtcGxhdGUuV3JpdGU8RFdPUkQ+KFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlNfREVGUFVTSEJVVFRPTik7ICAvLyBzdHlsZQotICBkaWFsb2dfdGVtcGxhdGUuV3JpdGU8V09SRD4ocmlnaHRfYnV0dG9uX3gpOwotICBkaWFsb2dfdGVtcGxhdGUuV3JpdGU8V09SRD4oYnV0dG9uX3kpOwotICBkaWFsb2dfdGVtcGxhdGUuV3JpdGU8V09SRD4oYnV0dG9uX3dpZHRoKTsKLSAgZGlhbG9nX3RlbXBsYXRlLldyaXRlPFdPUkQ+KGJ1dHRvbl9oZWlnaHQpOwotICBkaWFsb2dfdGVtcGxhdGUuV3JpdGU8RFdPUkQ+KElET0spOwotICBkaWFsb2dfdGVtcGxhdGUuV3JpdGU8RFdPUkQ+KDB4MDA4MEZGRkYpOwotICBkaWFsb2dfdGVtcGxhdGUuV3JpdGVTdHJpbmcoCi0gICAgICAoTFBDV1NUUilzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OkNTdHJpbmdUb1dTdHJpbmcob2tfbWVzc2FnZS5jX3N0cigpKQotICAgICAgICAgIC5jX3N0cigpKTsKLSAgZGlhbG9nX3RlbXBsYXRlLldyaXRlPFdPUkQ+KGV4dHJhX2RhdGEpOwotCi0gIFJlbGVhc2VEQyhOVUxMLCBoZGMpOwotICAvLyBUZW1wbGF0ZSBpcyByZWFkeSAtIGdvIGRpc3BsYXkgaXQuCi0gIGdfY3VycmVudF9kaWFsb2dfaGFuZGxlID0gQ3JlYXRlRGlhbG9nSW5kaXJlY3QoCi0gICAgICBHZXRNb2R1bGVIYW5kbGUobnVsbHB0ciksIGRpYWxvZ190ZW1wbGF0ZS5CdWlsZFRlbXBsYXRlKCksIGh3bmQsCi0gICAgICBEaWFsb2dQcm9jZWR1cmVDYWxsYmFjayk7Ci0gIFNob3dXaW5kb3coZ19jdXJyZW50X2RpYWxvZ19oYW5kbGUsIFNXX1NIT1cpOwotICByZXR1cm4gZ19jdXJyZW50X2RpYWxvZ19oYW5kbGUgIT0gbnVsbHB0cjsKLX0KLQotYm9vbCBEaWFsb2dIYW5kbGVNZXNzYWdlKE1TRyogbXNnKSB7Ci0gIHJldHVybiBJc1dpbmRvdyhnX2N1cnJlbnRfZGlhbG9nX2hhbmRsZSkgJiYKLSAgICAgICAgIElzRGlhbG9nTWVzc2FnZShnX2N1cnJlbnRfZGlhbG9nX2hhbmRsZSwgbXNnKTsKLX0KLQotdm9pZCBDYW5jZWxEaWFsb2coKSB7Ci0gIGlmIChnX2N1cnJlbnRfZGlhbG9nX2hhbmRsZSAhPSBudWxscHRyKSB7Ci0gICAgRW5kRGlhbG9nKGdfY3VycmVudF9kaWFsb2dfaGFuZGxlLCAwKTsKLSAgICBnX2N1cnJlbnRfZGlhbG9nX2hhbmRsZSA9IG51bGxwdHI7Ci0gIH0KLX0KLQotfSAgLy8gIG5hbWVzcGFjZSB3aW4zMgotfSAgLy8gIG5hbWVzcGFjZSBzaGFyZWQKLX0gIC8vICBuYW1lc3BhY2Ugc3RhcmJvYXJkCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9kaWFsb2cuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2RpYWxvZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGFkZjI5Li4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2RpYWxvZy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBTVEFSQk9BUkRfU0hBUkVEX1dJTjMyX0RJQUxPR19IXwotI2RlZmluZSBTVEFSQk9BUkRfU0hBUkVEX1dJTjMyX0RJQUxPR19IXwotCi0jaW5jbHVkZSA8d2luZG93cy5oPgotCi0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLW5hbWVzcGFjZSBzdGFyYm9hcmQgewotbmFtZXNwYWNlIHNoYXJlZCB7Ci1uYW1lc3BhY2Ugd2luMzIgewotCi10eXBlZGVmIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBEaWFsb2dDYWxsYmFjazsKLQotLy8gU2hvd3MgYSBtb2RlbGVzcyBPSy9DYW5jZWwtc3R5bGUgZGlhbG9nLiBPbmx5IG9uZSBkaWFsb2cgbWF5IGJlIHNob3duIGF0IGEKLS8vIHRpbWUuCi1ib29sIFNob3dPa0NhbmNlbERpYWxvZyhIV05EIGh3bmQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdGl0bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBva19tZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgRGlhbG9nQ2FsbGJhY2sgb2tfY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY2FuY2VsX21lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBEaWFsb2dDYWxsYmFjayBjYW5jZWxfY2FsbGJhY2spOwotCi0vLyBDYW5jZWxzIHRoZSBjdXJyZW50IGRpYWxvZyB0aGF0IGlzIHNob3dpbmcsIGlmIHRoZXJlIGlzIG9uZS4KLXZvaWQgQ2FuY2VsRGlhbG9nKCk7Ci0KLWJvb2wgRGlhbG9nSGFuZGxlTWVzc2FnZShNU0cqIG1zZyk7Ci0KLX0gIC8vICBuYW1lc3BhY2Ugd2luMzIKLX0gIC8vICBuYW1lc3BhY2Ugc2hhcmVkCi19ICAvLyAgbmFtZXNwYWNlIHN0YXJib2FyZAotCi0jZW5kaWYgIC8vIFNUQVJCT0FSRF9TSEFSRURfV0lOMzJfRElBTE9HX0hfCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9kaXJlY3RvcnlfY2FuX29wZW4uY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9kaXJlY3RvcnlfY2FuX29wZW4uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiOGNiMzAuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZGlyZWN0b3J5X2Nhbl9vcGVuLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9kaXJlY3RvcnkuaCIKLQotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2RpcmVjdG9yeV9pbnRlcm5hbC5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvZmlsZV9pbnRlcm5hbC5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvd2NoYXJfdXRpbHMuaCIKLQotYm9vbCBTYkRpcmVjdG9yeUNhbk9wZW4oY29uc3QgY2hhciogcGF0aCkgewotICB1c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OklzQWJzb2x1dGVQYXRoOwotICB1c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OklzVmFsaWRIYW5kbGU7Ci0gIHVzaW5nIHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6Tm9ybWFsaXplV2luMzJQYXRoOwotICB1c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OlRyaW1FeHRyYUZpbGVTZXBhcmF0b3JzOwotCi0gIGlmICgocGF0aCA9PSBudWxscHRyKSB8fCAocGF0aFswXSA9PSAnXDAnKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHN0ZDo6d3N0cmluZyBwYXRoX3dzdHJpbmcgPSBOb3JtYWxpemVXaW4zMlBhdGgocGF0aCk7Ci0gIFRyaW1FeHRyYUZpbGVTZXBhcmF0b3JzKCZwYXRoX3dzdHJpbmcpOwotCi0gIGlmICghSXNBYnNvbHV0ZVBhdGgocGF0aF93c3RyaW5nKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIFdJTjMyX0ZJTkRfREFUQSBmaW5kX2RhdGEgPSB7MH07Ci0KLSAgSEFORExFIHNlYXJjaF9oYW5kbGUgPSBGaW5kRmlyc3RGaWxlRXhXKAotICAgICAgcGF0aF93c3RyaW5nLmNfc3RyKCksIEZpbmRFeEluZm9TdGFuZGFyZCwgJmZpbmRfZGF0YSwKLSAgICAgIEZpbmRFeFNlYXJjaE5hbWVNYXRjaCwgTlVMTCwgRklORF9GSVJTVF9FWF9DQVNFX1NFTlNJVElWRSk7Ci0gIGlmICghSXNWYWxpZEhhbmRsZShzZWFyY2hfaGFuZGxlKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIEZpbmRDbG9zZShzZWFyY2hfaGFuZGxlKTsKLQotICByZXR1cm4gZmluZF9kYXRhLmR3RmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlk7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9kaXJlY3RvcnlfY2xvc2UuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9kaXJlY3RvcnlfY2xvc2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNzc2NWEuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZGlyZWN0b3J5X2Nsb3NlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9kaXJlY3RvcnkuaCIKLQotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvZGlyZWN0b3J5X2ludGVybmFsLmgiCi0KLWJvb2wgU2JEaXJlY3RvcnlDbG9zZShTYkRpcmVjdG9yeSBkaXJlY3RvcnkpIHsKLSAgaWYgKCFTYkRpcmVjdG9yeUlzVmFsaWQoZGlyZWN0b3J5KSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGJvb2wgc3VjY2VzcyA9IENsb3NlSGFuZGxlKGRpcmVjdG9yeS0+ZGlyZWN0b3J5X2hhbmRsZSk7Ci0KLSAgZGVsZXRlIGRpcmVjdG9yeTsKLQotICByZXR1cm4gc3VjY2VzczsKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2RpcmVjdG9yeV9jcmVhdGUuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9kaXJlY3RvcnlfY3JlYXRlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzZkYWY5Li4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2RpcmVjdG9yeV9jcmVhdGUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2RpcmVjdG9yeS5oIgotCi0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvZGlyZWN0b3J5X2ludGVybmFsLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX2ludGVybmFsLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi93Y2hhcl91dGlscy5oIgotCi11c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OkRpcmVjdG9yeUV4aXN0czsKLXVzaW5nIHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6RGlyZWN0b3J5RXhpc3RzT3JDcmVhdGVkOwotdXNpbmcgc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOjpJc0Fic29sdXRlUGF0aDsKLXVzaW5nIHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6Tm9ybWFsaXplV2luMzJQYXRoOwotdXNpbmcgc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOjpUcmltRXh0cmFGaWxlU2VwYXJhdG9yczsKLQotYm9vbCBTYkRpcmVjdG9yeUNyZWF0ZShjb25zdCBjaGFyKiBwYXRoKSB7Ci0gIGlmICgocGF0aCA9PSBudWxscHRyKSB8fCAocGF0aFswXSA9PSAnXDAnKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHN0ZDo6d3N0cmluZyBwYXRoX3dzdHJpbmcgPSBOb3JtYWxpemVXaW4zMlBhdGgocGF0aCk7Ci0gIFRyaW1FeHRyYUZpbGVTZXBhcmF0b3JzKCZwYXRoX3dzdHJpbmcpOwotCi0gIGlmICghSXNBYnNvbHV0ZVBhdGgocGF0aF93c3RyaW5nKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiBEaXJlY3RvcnlFeGlzdHNPckNyZWF0ZWQocGF0aF93c3RyaW5nKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2RpcmVjdG9yeV9nZXRfbmV4dC5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2RpcmVjdG9yeV9nZXRfbmV4dC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE0YzFiNi4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9kaXJlY3RvcnlfZ2V0X25leHQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2RpcmVjdG9yeS5oIgotCi0jaW5jbHVkZSA8d2luZG93cy5oPgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zdHJpbmcuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2RpcmVjdG9yeV9pbnRlcm5hbC5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvd2NoYXJfdXRpbHMuaCIKLQotbmFtZXNwYWNlIHsKLS8vIE9uZSBvZiB0aGUgZW50cmllcyBvZiBGSUxFX0lEX0JPVEhfRElSX0lORk8gaXMgYSBmaWxlIHBhdGgsIHNvIG1ha2UgdGhlCi0vLyBidWZmZXIgYXQtbGVhc3Qgb25lIHBhdGggYmlnLgotY29uc3Qgc3RkOjpzaXplX3Qga0RpcmVjdG9yeUluZm9CdWZmZXJTaXplID0KLSAgICBTQl9GSUxFX01BWF9QQVRIICsgc2l6ZW9mKEZJTEVfSURfQk9USF9ESVJfSU5GTyk7Ci0KLXN0ZDo6ZGVxdWU8c3RkOjpzdHJpbmc+IEdldERpcmVjdG9yeUVudHJpZXMoSEFORExFIGRpcmVjdG9yeV9oYW5kbGUpIHsKLSAgLy8gQWNjb3JkaW5nIHRvCi0gIC8vIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvd2luZG93cy9kZXNrdG9wL2FhMzY0MjI2KHY9dnMuODUpLmFzcHgsCi0gIC8vIEZJTEVfSURfQk9USF9ESVJfSU5GTyBtdXN0IGJlIGFsaWduZWQgb24gYSBEV09SRExPTkcgYm91bmRhcnkuCi0gIGFsaWduYXMoCi0gICAgICBzaXplb2YoRFdPUkRMT05HKSkgY2hhciBkaXJlY3RvcnlfaW5mb19idWZmZXJba0RpcmVjdG9yeUluZm9CdWZmZXJTaXplXTsKLQotICBzdGQ6OmRlcXVlPHN0ZDo6c3RyaW5nPiBlbnRyaWVzOwotICBCT09MIGRpcmVjdG9yeV9pbmZvX3N1Y2Nlc3MgPSBHZXRGaWxlSW5mb3JtYXRpb25CeUhhbmRsZUV4KAotICAgICAgZGlyZWN0b3J5X2hhbmRsZSwgRmlsZUlkQm90aERpcmVjdG9yeUluZm8sIGRpcmVjdG9yeV9pbmZvX2J1ZmZlciwKLSAgICAgIFNCX0FSUkFZX1NJWkUoZGlyZWN0b3J5X2luZm9fYnVmZmVyKSk7Ci0KLSAgaWYgKCFkaXJlY3RvcnlfaW5mb19zdWNjZXNzKSB7Ci0gICAgcmV0dXJuIGVudHJpZXM7Ci0gIH0KLQotICBjb25zdCBjaGFyKiBkaXJlY3RvcnlfaW5mb19wb2ludGVyID0gZGlyZWN0b3J5X2luZm9fYnVmZmVyOwotICBEV09SRCBuZXh0X2VudHJ5X29mZnNldCA9IDA7Ci0KLSAgZG8gewotICAgIGF1dG8gZGlyZWN0b3J5X2luZm8gPQotICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IEZJTEVfSURfQk9USF9ESVJfSU5GTyo+KGRpcmVjdG9yeV9pbmZvX3BvaW50ZXIpOwotCi0gICAgLy8gRmlsZU5hbWUgaXMgaW4gVW5pY29kZSwgc28gZGl2aWRlIGJ5IDIgdG8gZ2V0IHRoZSByZWFsIGxlbmd0aC4KLSAgICBEV09SRCBudW1iZXJfY2hhcmFjdGVyc19pbl9maWxlbmFtZSA9IGRpcmVjdG9yeV9pbmZvLT5GaWxlTmFtZUxlbmd0aCAvIDI7Ci0gICAgc3RkOjpzdHJpbmcgYXNjaWlfcGF0aCA9IHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6d2NoYXJfdFRvVVRGOCgKLSAgICAgICAgZGlyZWN0b3J5X2luZm8tPkZpbGVOYW1lLCBudW1iZXJfY2hhcmFjdGVyc19pbl9maWxlbmFtZSk7Ci0gICAgU0JfRENIRUNLKGFzY2lpX3BhdGguc2l6ZSgpID09IG51bWJlcl9jaGFyYWN0ZXJzX2luX2ZpbGVuYW1lKTsKLSAgICBib29sIGlzX2RvdHRlZF9kaXJlY3RvcnkgPQotICAgICAgICAhYXNjaWlfcGF0aC5jb21wYXJlKCIuIikgfHwgIWFzY2lpX3BhdGguY29tcGFyZSgiLi4iKTsKLSAgICBpZiAoIWlzX2RvdHRlZF9kaXJlY3RvcnkpIHsKLSAgICAgIGVudHJpZXMuZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShhc2NpaV9wYXRoKSk7Ci0gICAgfQotICAgIG5leHRfZW50cnlfb2Zmc2V0ID0gZGlyZWN0b3J5X2luZm8tPk5leHRFbnRyeU9mZnNldDsKLSAgICBkaXJlY3RvcnlfaW5mb19wb2ludGVyICs9IG5leHRfZW50cnlfb2Zmc2V0OwotICB9IHdoaWxlIChuZXh0X2VudHJ5X29mZnNldCAhPSAwKTsKLQotICByZXR1cm4gZW50cmllczsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLWJvb2wgU2JEaXJlY3RvcnlHZXROZXh0KFNiRGlyZWN0b3J5IGRpcmVjdG9yeSwgU2JEaXJlY3RvcnlFbnRyeSogb3V0X2VudHJ5KSB7Ci0gIGlmICghU2JEaXJlY3RvcnlJc1ZhbGlkKGRpcmVjdG9yeSkgfHwgKG91dF9lbnRyeSA9PSBudWxscHRyKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGF1dG8mIG5leHRfZGlyZWN0b3J5X2VudHJpZXMgPSBkaXJlY3RvcnktPm5leHRfZGlyZWN0b3J5X2VudHJpZXM7Ci0gIGlmIChuZXh0X2RpcmVjdG9yeV9lbnRyaWVzLmVtcHR5KCkpIHsKLSAgICBuZXh0X2RpcmVjdG9yeV9lbnRyaWVzID0gR2V0RGlyZWN0b3J5RW50cmllcyhkaXJlY3RvcnktPmRpcmVjdG9yeV9oYW5kbGUpOwotICB9Ci0KLSAgaWYgKG5leHRfZGlyZWN0b3J5X2VudHJpZXMuZW1wdHkoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGJvb2wgc3VjY2VzcyA9IHRydWU7Ci0gIGNvbnN0IGludCBlbnRyeV9uYW1lX3NpemUgPSBTQl9BUlJBWV9TSVpFX0lOVChvdXRfZW50cnktPm5hbWUpOwotICBpZiAoU2JTdHJpbmdDb3B5KG91dF9lbnRyeS0+bmFtZSwgbmV4dF9kaXJlY3RvcnlfZW50cmllcy5yYmVnaW4oKS0+Y19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICBlbnRyeV9uYW1lX3NpemUpID49IGVudHJ5X25hbWVfc2l6ZSkgewotICAgIHN1Y2Nlc3MgPSBmYWxzZTsKLSAgfQotICBkaXJlY3RvcnktPm5leHRfZGlyZWN0b3J5X2VudHJpZXMucG9wX2JhY2soKTsKLSAgcmV0dXJuIHN1Y2Nlc3M7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9kaXJlY3RvcnlfaW50ZXJuYWwuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9kaXJlY3RvcnlfaW50ZXJuYWwuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjNTdlNDEuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZGlyZWN0b3J5X2ludGVybmFsLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2RpcmVjdG9yeV9pbnRlcm5hbC5oIgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2RpcmVjdG9yeS5oIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvaW50ZXJuYWxfb25seS5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvZmlsZV9pbnRlcm5hbC5oIgotCi1uYW1lc3BhY2Ugc3RhcmJvYXJkIHsKLW5hbWVzcGFjZSBzaGFyZWQgewotbmFtZXNwYWNlIHdpbjMyIHsKLQotYm9vbCBIYXNWYWxpZEhhbmRsZShTYkRpcmVjdG9yeSBkaXJlY3RvcnkpIHsKLSAgaWYgKCFTYkRpcmVjdG9yeUlzVmFsaWQoZGlyZWN0b3J5KSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gZGlyZWN0b3J5LT5IYXNWYWxpZEhhbmRsZSgpOwotfQotCi0vLyBUaGlzIGZ1bmN0aW9uIHN0cmlwcyB0cmFpbGluZyBmaWxlIHNlcGFyYXRvcnMgZnJvbSBhIGRpcmVjdG9yeSBuYW1lLgotLy8gRm9yIGV4YW1wbGUgaWYgdGhlIGRpcmVjdG9yeSBuYW1lIHdhcyAiQzpcXFRlbXBcXFxcXFwiLCBpdCB3b3VsZAotLy8gc3RyaXAgdGhlbSwgc28gdGhhdCB0aGUgZGlyZWN0b3J5IG5hbWUgaXMgbm93IHRvIGJlICJDOlxcdGVtcCIuCi12b2lkIFRyaW1FeHRyYUZpbGVTZXBhcmF0b3JzKHN0ZDo6d3N0cmluZyogZGlybmFtZV9wb2ludGVyKSB7Ci0gIFNCX0RDSEVDSyhkaXJuYW1lX3BvaW50ZXIpOwotICBzdGQ6OndzdHJpbmcmIGRpcm5hbWUgPSAqZGlybmFtZV9wb2ludGVyOwotICBhdXRvIG5ld19lbmQgPQotICAgICAgc3RkOjpmaW5kX2lmX25vdChkaXJuYW1lLnJiZWdpbigpLCBkaXJuYW1lLnJlbmQoKSwgW10od2NoYXJfdCBjKSB7Ci0gICAgICAgIHJldHVybiBjID09IFNCX0ZJTEVfU0VQX0NIQVIgfHwgYyA9PSBTQl9GSUxFX0FMVF9TRVBfQ0hBUjsKLSAgICAgIH0pOwotICBkaXJuYW1lLmVyYXNlKG5ld19lbmQuYmFzZSgpLCBkaXJuYW1lLmVuZCgpKTsKLX0KLQotYm9vbCBJc0Fic29sdXRlUGF0aChjb25zdCBzdGQ6OndzdHJpbmcmIHBhdGgpIHsKLSAgd2NoYXJfdCBmdWxsX3BhdGhbU0JfRklMRV9NQVhfUEFUSF07Ci0gIERXT1JEIGZ1bGxfcGF0aF9zaXplID0KLSAgICAgIEdldEZ1bGxQYXRoTmFtZVcocGF0aC5jX3N0cigpLCBTQl9BUlJBWV9TSVpFKGZ1bGxfcGF0aCksIGZ1bGxfcGF0aCwgTlVMTCk7Ci0gIGlmIChmdWxsX3BhdGhfc2l6ZSA9PSAwKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW50IHBhdGhfc2l6ZSA9IHN0YXRpY19jYXN0PGludD4ocGF0aC5zaXplKCkpOwotICByZXR1cm4gQ29tcGFyZVN0cmluZ0V4KExPQ0FMRV9OQU1FX1VTRVJfREVGQVVMVCwgTk9STV9JR05PUkVDQVNFLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGguY19zdHIoKSwgcGF0aF9zaXplLCBmdWxsX3BhdGgsIGZ1bGxfcGF0aF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIDApID09IENTVFJfRVFVQUw7Ci19Ci0KLWJvb2wgRGlyZWN0b3J5RXhpc3RzKGNvbnN0IHN0ZDo6d3N0cmluZyYgZGlyX3BhdGgpIHsKLSAgaWYgKGRpcl9wYXRoLmVtcHR5KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgc3RkOjp3c3RyaW5nIG5vcm1fZGlyX3BhdGggPSBOb3JtYWxpemVXaW4zMlBhdGgoZGlyX3BhdGgpOwotICBXSU4zMl9GSUxFX0FUVFJJQlVURV9EQVRBIGF0dHJpYnV0ZV9kYXRhID0gezB9OwotICBpZiAoIUdldEZpbGVBdHRyaWJ1dGVzRXhXKG5vcm1fZGlyX3BhdGguY19zdHIoKSwgR2V0RmlsZUV4SW5mb1N0YW5kYXJkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVfZGF0YSkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIChhdHRyaWJ1dGVfZGF0YS5kd0ZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKTsKLX0KLQotYm9vbCBDcmVhdGVEaXJlY3RvcnlIaWVhcmNoeShjb25zdCBzdGQ6OndzdHJpbmcmIHdmdWxsX3BhdGgpIHsKLSAgaWYgKERpcmVjdG9yeUV4aXN0c09yQ3JlYXRlZCh3ZnVsbF9wYXRoKSkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIGNvbnN0IHdjaGFyX3Qga1BhdGhTZXBhcmF0b3JzW10gPSB7IFNCX0ZJTEVfU0VQX0NIQVIsIFNCX0ZJTEVfQUxUX1NFUF9DSEFSIH07Ci0gIHNpemVfdCBwYXRoX2VuZCA9IDA7Ci0gIGRvIHsKLSAgICBwYXRoX2VuZCA9IHdmdWxsX3BhdGguZmluZF9maXJzdF9vZihrUGF0aFNlcGFyYXRvcnMsIHBhdGhfZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNCX0FSUkFZX1NJWkUoa1BhdGhTZXBhcmF0b3JzKSk7Ci0gICAgaWYgKHBhdGhfZW5kID09IHN0ZDo6d3N0cmluZzo6bnBvcykgewotICAgICAgcGF0aF9lbmQgPSB3ZnVsbF9wYXRoLnNpemUoKTsKLSAgICB9Ci0gICAgc3RkOjp3c3RyaW5nIHRlbXBfcGF0aCA9IHdmdWxsX3BhdGguc3Vic3RyKDAsIHBhdGhfZW5kKTsKLSAgICBEaXJlY3RvcnlFeGlzdHNPckNyZWF0ZWQodGVtcF9wYXRoKTsKLSAgfSB3aGlsZSAocGF0aF9lbmQgPCB3ZnVsbF9wYXRoLnNpemUoKSk7Ci0KLSAgcmV0dXJuIERpcmVjdG9yeUV4aXN0c09yQ3JlYXRlZCh3ZnVsbF9wYXRoKTsKLX0KLQotYm9vbCBEaXJlY3RvcnlFeGlzdHNPckNyZWF0ZWQoY29uc3Qgc3RkOjp3c3RyaW5nJiB3cGF0aCkgewotICByZXR1cm4gRGlyZWN0b3J5RXhpc3RzKHdwYXRoKSB8fCBDcmVhdGVEaXJlY3RvcnlXKHdwYXRoLmNfc3RyKCksIE5VTEwpOwotfQotCi19ICAvLyBuYW1lc3BhY2Ugd2luMzIKLX0gIC8vIG5hbWVzcGFjZSBzaGFyZWQKLX0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2RpcmVjdG9yeV9pbnRlcm5hbC5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZGlyZWN0b3J5X2ludGVybmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhODJkZGQuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZGlyZWN0b3J5X2ludGVybmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaWZuZGVmIFNUQVJCT0FSRF9TSEFSRURfV0lOMzJfRElSRUNUT1JZX0lOVEVSTkFMX0hfCi0jZGVmaW5lIFNUQVJCT0FSRF9TSEFSRURfV0lOMzJfRElSRUNUT1JZX0lOVEVSTkFMX0hfCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvZGlyZWN0b3J5LmgiCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8ZGVxdWU+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9pbnRlcm5hbF9vbmx5LmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX2ludGVybmFsLmgiCi0KLSNwcmFnbWEgd2FybmluZyhwdXNoKQotCi0vLyBTYkZpbGVQcml2YXRlIGlzIGRlZmluZWQgYXMgYSBzdHJ1Y3QsIGJ1dCBmb3Igd2luZG93cyBpbXBsZW1lbnRhdGlvbgotLy8gZW5vdWdoIGZ1bmN0aW9uYWxpdHkgaGFzIGJlZW4gYWRkZWQgc28gdGhhdCBpdCB3YXJyYW50cyBiZWluZyBhIGNsYXNzCi0vLyBwZXIgR29vZ2xlJ3MgQysrIHN0eWxlIGd1aWRlLiAgVGhpcyBtaXNtYXRjaCBjYXVzZXMgdGhlIE1pY3Jvc29mdCdzIGNvbXBpbGVyCi0vLyB0byBnZW5lcmF0ZSBhIHdhcm5pbmcuCi0jcHJhZ21hIHdhcm5pbmcoZGlzYWJsZSA6IDQwOTkpCi0KLWNsYXNzIFNiRGlyZWN0b3J5UHJpdmF0ZSB7Ci0gcHVibGljOgotICBleHBsaWNpdCBTYkRpcmVjdG9yeVByaXZhdGUoSEFORExFIGhhbmRsZSkgOiBkaXJlY3RvcnlfaGFuZGxlKGhhbmRsZSkge30KLQotICBib29sIEhhc1ZhbGlkSGFuZGxlKCkgY29uc3QgewotICAgIHJldHVybiBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OklzVmFsaWRIYW5kbGUoZGlyZWN0b3J5X2hhbmRsZSk7Ci0gIH0KLQotICBIQU5ETEUgZGlyZWN0b3J5X2hhbmRsZTsKLSAgc3RkOjpkZXF1ZTxzdGQ6OnN0cmluZz4gbmV4dF9kaXJlY3RvcnlfZW50cmllczsKLQotICAvLyBTYkRpcmVjdG9yeVByaXZhdGUgaXMgbmVpdGhlciBjb3B5YWJsZSBub3IgbW92YWJsZS4KLSAgU2JEaXJlY3RvcnlQcml2YXRlKGNvbnN0IFNiRGlyZWN0b3J5UHJpdmF0ZSYpID0gZGVsZXRlOwotICBTYkRpcmVjdG9yeVByaXZhdGUmIG9wZXJhdG9yPShjb25zdCBTYkRpcmVjdG9yeVByaXZhdGUmKSA9IGRlbGV0ZTsKLX07Ci0jcHJhZ21hIHdhcm5pbmcocG9wKQotCi1uYW1lc3BhY2Ugc3RhcmJvYXJkIHsKLW5hbWVzcGFjZSBzaGFyZWQgewotbmFtZXNwYWNlIHdpbjMyIHsKLQotYm9vbCBIYXNWYWxpZEhhbmRsZShTYkRpcmVjdG9yeSBkaXJlY3RvcnkpOwotCi0vLyBUaGlzIGZ1bmN0aW9uIHN0cmlwcyB0cmFpbGluZyBmaWxlIHNlcGFyYXRvcnMgZnJvbSBhIGRpcmVjdG9yeSBuYW1lLgotLy8gRm9yIGV4YW1wbGUgaWYgdGhlIGRpcmVjdG9yeSBuYW1lIHdhcyAiQzpcXFRlbXBcXFxcXFwiLCBpdCB3b3VsZAotLy8gc3RyaXAgdGhlbSwgc28gdGhhdCB0aGUgZGlyZWN0b3J5IG5hbWUgaXMgbm93IHRvIGJlICJDOlxcdGVtcCIuCi12b2lkIFRyaW1FeHRyYUZpbGVTZXBhcmF0b3JzKHN0ZDo6d3N0cmluZyogZGlybmFtZV9wb2ludGVyKTsKLQotYm9vbCBJc0Fic29sdXRlUGF0aChjb25zdCBzdGQ6OndzdHJpbmcmIHBhdGgpOwotCi1ib29sIERpcmVjdG9yeUV4aXN0cyhjb25zdCBzdGQ6OndzdHJpbmcmIGRpcl9wYXRoKTsKLQotLy8gRGlyZWN0b3J5IGhpZXJhcmNoeSBpcyBjcmVhdGVkIGZyb20gdGlwIGRvd24gdG8gcm9vdC4gVGhpcyBpcyBuZWNlc3NhcnkKLS8vIGJlY2F1c2UgVVdQIGhhcyBpc3N1ZXMgd2l0aCBib3R0b20gdXAgZGlyZWN0b3J5IGNyZWF0aW9uIGR1ZSB0byBwZXJtaXNzaW9ucy4KLWJvb2wgQ3JlYXRlRGlyZWN0b3J5SGllYXJjaHkoY29uc3Qgc3RkOjp3c3RyaW5nJiB3ZnVsbF9wYXRoKTsKLQotYm9vbCBEaXJlY3RvcnlFeGlzdHNPckNyZWF0ZWQoY29uc3Qgc3RkOjp3c3RyaW5nJiB3cGF0aCk7Ci0KLX0gIC8vIG5hbWVzcGFjZSB3aW4zMgotfSAgLy8gbmFtZXNwYWNlIHNoYXJlZAotfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZAotCi0jZW5kaWYgIC8vIFNUQVJCT0FSRF9TSEFSRURfV0lOMzJfRElSRUNUT1JZX0lOVEVSTkFMX0hfCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9kaXJlY3Rvcnlfb3Blbi5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2RpcmVjdG9yeV9vcGVuLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGFkN2FhLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2RpcmVjdG9yeV9vcGVuLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9kaXJlY3RvcnkuaCIKLQotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvZGlyZWN0b3J5X2ludGVybmFsLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX2ludGVybmFsLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi93Y2hhcl91dGlscy5oIgotCi1TYkRpcmVjdG9yeSBTYkRpcmVjdG9yeU9wZW4oY29uc3QgY2hhciogcGF0aCwgU2JGaWxlRXJyb3IqIG91dF9lcnJvcikgewotICB1c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OkNTdHJpbmdUb1dTdHJpbmc7Ci0gIHVzaW5nIHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6Tm9ybWFsaXplV2luMzJQYXRoOwotCi0gIGlmICgocGF0aCA9PSBudWxscHRyKSB8fCAocGF0aFswXSA9PSAnXDAnKSkgewotICAgIGlmIChvdXRfZXJyb3IpIHsKLSAgICAgICpvdXRfZXJyb3IgPSBrU2JGaWxlRXJyb3JOb3RGb3VuZDsKLSAgICB9Ci0gICAgcmV0dXJuIGtTYkRpcmVjdG9yeUludmFsaWQ7Ci0gIH0KLQotICBzdGQ6OndzdHJpbmcgcGF0aF93c3RyaW5nID0gTm9ybWFsaXplV2luMzJQYXRoKHBhdGgpOwotCi0gIGlmICghc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOjpJc0Fic29sdXRlUGF0aChwYXRoX3dzdHJpbmcpKSB7Ci0gICAgaWYgKG91dF9lcnJvcikgewotICAgICAgKm91dF9lcnJvciA9IGtTYkZpbGVFcnJvck5vdEZvdW5kOwotICAgIH0KLSAgICByZXR1cm4ga1NiRGlyZWN0b3J5SW52YWxpZDsKLSAgfQotCi0gIEhBTkRMRSBkaXJlY3RvcnlfaGFuZGxlID0gc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOjpPcGVuRmlsZU9yRGlyZWN0b3J5KAotICAgICAgcGF0aCwga1NiRmlsZU9wZW5Pbmx5IHwga1NiRmlsZVJlYWQsIG51bGxwdHIsIG91dF9lcnJvcik7Ci0KLSAgaWYgKCFzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OklzVmFsaWRIYW5kbGUoZGlyZWN0b3J5X2hhbmRsZSkpIHsKLSAgICByZXR1cm4ga1NiRGlyZWN0b3J5SW52YWxpZDsKLSAgfQotCi0gIEZJTEVfQkFTSUNfSU5GTyBiYXNpY19pbmZvID0gezB9OwotICBCT09MIGJhc2ljX2luZm9fc3VjY2VzcyA9IEdldEZpbGVJbmZvcm1hdGlvbkJ5SGFuZGxlRXgoCi0gICAgICBkaXJlY3RvcnlfaGFuZGxlLCBGaWxlQmFzaWNJbmZvLCAmYmFzaWNfaW5mbywgc2l6ZW9mKEZJTEVfQkFTSUNfSU5GTykpOwotCi0gIGlmICghYmFzaWNfaW5mb19zdWNjZXNzIHx8Ci0gICAgICAhKGJhc2ljX2luZm8uRmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpKSB7Ci0gICAgQ2xvc2VIYW5kbGUoZGlyZWN0b3J5X2hhbmRsZSk7Ci0gICAgaWYgKG91dF9lcnJvcikgewotICAgICAgKm91dF9lcnJvciA9IGtTYkZpbGVFcnJvck5vdEFEaXJlY3Rvcnk7Ci0gICAgfQotICAgIHJldHVybiBrU2JEaXJlY3RvcnlJbnZhbGlkOwotICB9Ci0KLSAgcmV0dXJuIG5ldyBTYkRpcmVjdG9yeVByaXZhdGUoZGlyZWN0b3J5X2hhbmRsZSk7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9kcm1fY3JlYXRlX3N5c3RlbS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2RybV9jcmVhdGVfc3lzdGVtLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWI4YTU1Li4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2RybV9jcmVhdGVfc3lzdGVtLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9kcm0uaCIKLQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2RybV9zeXN0ZW1fcGxheXJlYWR5LmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3N0cmluZy5oIgotCi1TYkRybVN5c3RlbSBTYkRybUNyZWF0ZVN5c3RlbSgKLSAgICBjb25zdCBjaGFyKiBrZXlfc3lzdGVtLAotICAgIHZvaWQqIGNvbnRleHQsCi0gICAgU2JEcm1TZXNzaW9uVXBkYXRlUmVxdWVzdEZ1bmMgdXBkYXRlX3JlcXVlc3RfY2FsbGJhY2ssCi0gICAgU2JEcm1TZXNzaW9uVXBkYXRlZEZ1bmMgc2Vzc2lvbl91cGRhdGVkX2NhbGxiYWNrLAotICAgIFNiRHJtU2Vzc2lvbktleVN0YXR1c2VzQ2hhbmdlZEZ1bmMga2V5X3N0YXR1c2VzX2NoYW5nZWRfY2FsbGJhY2ssCi0gICAgU2JEcm1TZXNzaW9uQ2xvc2VkRnVuYyBzZXNzaW9uX2Nsb3NlZF9jYWxsYmFjaykgewotICB1c2luZyA6OnN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6U2JEcm1TeXN0ZW1QbGF5cmVhZHk7Ci0KLSAgaWYgKFNiU3RyaW5nQ29tcGFyZUFsbChrZXlfc3lzdGVtLCAiY29tLnlvdXR1YmUucGxheXJlYWR5IikgIT0gMCkgewotICAgIFNCX0RMT0coV0FSTklORykgPDwgIkludmFsaWQga2V5IHN5c3RlbSAiIDw8IGtleV9zeXN0ZW07Ci0gICAgcmV0dXJuIGtTYkRybVN5c3RlbUludmFsaWQ7Ci0gIH0KLQotICByZXR1cm4gbmV3IFNiRHJtU3lzdGVtUGxheXJlYWR5KGNvbnRleHQsIHVwZGF0ZV9yZXF1ZXN0X2NhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25fdXBkYXRlZF9jYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfc3RhdHVzZXNfY2hhbmdlZF9jYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uX2Nsb3NlZF9jYWxsYmFjayk7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9kcm1fc3lzdGVtX3BsYXlyZWFkeS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2RybV9zeXN0ZW1fcGxheXJlYWR5LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWJiMWE0Li4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2RybV9zeXN0ZW1fcGxheXJlYWR5LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzM0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2RybV9zeXN0ZW1fcGxheXJlYWR5LmgiCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8Y2N0eXBlPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2NvbmZpZ3VyYXRpb24uaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tdXRleC5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9vbmNlLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3N0cmluZy5oIgotCi1uYW1lc3BhY2UgewotCi1jb25zdCBib29sIGtMb2dQbGF5cmVhZHlDaGFsbGVuZ2VSZXNwb25zZSA9IGZhbHNlOwotCi1zdGQ6OnN0cmluZyBHZXRIZXhSZXByZXNlbnRhdGlvbihjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSkgewotICBjb25zdCBjaGFyIGtIZXhbXSA9ICIwMTIzNDU2Nzg5QUJDREVGIjsKLQotICBzdGQ6OnN0cmluZ3N0cmVhbSByZXByZXNlbnRhdGlvbjsKLSAgc3RkOjpzdHJpbmdzdHJlYW0gYXNjaWk7Ci0gIGNvbnN0IHVpbnQ4X3QqIGJpbmFyeSA9IHN0YXRpY19jYXN0PGNvbnN0IHVpbnQ4X3QqPihkYXRhKTsKLSAgYm9vbCBuZXdfbGluZSA9IHRydWU7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0gICAgaWYgKG5ld19saW5lKSB7Ci0gICAgICBuZXdfbGluZSA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXByZXNlbnRhdGlvbiA8PCAnICc7Ci0gICAgfQotICAgIGFzY2lpIDw8IChzdGQ6OmlzcHJpbnQoYmluYXJ5W2ldKSA/IHN0YXRpY19jYXN0PGNoYXI+KGJpbmFyeVtpXSkgOiAnPycpOwotICAgIHJlcHJlc2VudGF0aW9uIDw8IGtIZXhbYmluYXJ5W2ldIC8gMTZdIDw8IGtIZXhbYmluYXJ5W2ldICUgMTZdOwotICAgIGlmIChpICUgMTYgPT0gMTUgJiYgaSAhPSBzaXplIC0gMSkgewotICAgICAgcmVwcmVzZW50YXRpb24gPDwgIiAoIiA8PCBhc2NpaS5zdHIoKSA8PCAnKScgPDwgc3RkOjplbmRsOwotICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gZW1wdHk7Ci0gICAgICBhc2NpaS5zd2FwKGVtcHR5KTsgIC8vIENsZWFyIHRoZSBhc2NpaSBzdHJlYW0KLSAgICAgIG5ld19saW5lID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICBpZiAoIWFzY2lpLnN0cigpLmVtcHR5KCkpIHsKLSAgICByZXByZXNlbnRhdGlvbiA8PCAnKCcgPDwgYXNjaWkuc3RyKCkgPDwgJyknIDw8IHN0ZDo6ZW5kbDsKLSAgfQotCi0gIHJldHVybiByZXByZXNlbnRhdGlvbi5zdHIoKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdGQ6OnN0cmluZyBHZXRIZXhSZXByZXNlbnRhdGlvbihjb25zdCBUJiB2YWx1ZSkgewotICByZXR1cm4gR2V0SGV4UmVwcmVzZW50YXRpb24oJnZhbHVlLCBzaXplb2YoVCkpOwotfQotCi1jbGFzcyBBY3RpdmVEcm1TeXN0ZW1zIHsKLSBwdWJsaWM6Ci0gIDo6c3RhcmJvYXJkOjpNdXRleCBtdXRleF87Ci0gIHN0ZDo6dmVjdG9yPHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6U2JEcm1TeXN0ZW1QbGF5cmVhZHkqPiBhY3RpdmVfc3lzdGVtc187Ci19OwotCi1TQl9PTkNFX0lOSVRJQUxJWkVfRlVOQ1RJT04oQWN0aXZlRHJtU3lzdGVtcywgR2V0QWN0aXZlRHJtU3lzdGVtcyk7Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2Ugc3RhcmJvYXJkIHsKLW5hbWVzcGFjZSBzaGFyZWQgewotbmFtZXNwYWNlIHdpbjMyIHsKLQotdm9pZCBEcm1TeXN0ZW1PblV3cFJlc3VtZSgpIHsKLSAgOjpzdGFyYm9hcmQ6OlNjb3BlZExvY2sgbG9jayhHZXRBY3RpdmVEcm1TeXN0ZW1zKCktPm11dGV4Xyk7Ci0gIGZvciAoU2JEcm1TeXN0ZW1QbGF5cmVhZHkqIGl0ZW0gOiBHZXRBY3RpdmVEcm1TeXN0ZW1zKCktPmFjdGl2ZV9zeXN0ZW1zXykgewotICAgIGl0ZW0tPk9uVXdwUmVzdW1lKCk7Ci0gIH0KLX0KLQotU2JEcm1TeXN0ZW1QbGF5cmVhZHk6OlNiRHJtU3lzdGVtUGxheXJlYWR5KAotICAgIHZvaWQqIGNvbnRleHQsCi0gICAgU2JEcm1TZXNzaW9uVXBkYXRlUmVxdWVzdEZ1bmMgc2Vzc2lvbl91cGRhdGVfcmVxdWVzdF9jYWxsYmFjaywKLSAgICBTYkRybVNlc3Npb25VcGRhdGVkRnVuYyBzZXNzaW9uX3VwZGF0ZWRfY2FsbGJhY2ssCi0gICAgU2JEcm1TZXNzaW9uS2V5U3RhdHVzZXNDaGFuZ2VkRnVuYyBrZXlfc3RhdHVzZXNfY2hhbmdlZF9jYWxsYmFjaywKLSAgICBTYkRybVNlc3Npb25DbG9zZWRGdW5jIHNlc3Npb25fY2xvc2VkX2NhbGxiYWNrKQotICAgIDogY29udGV4dF8oY29udGV4dCksCi0gICAgICBzZXNzaW9uX3VwZGF0ZV9yZXF1ZXN0X2NhbGxiYWNrXyhzZXNzaW9uX3VwZGF0ZV9yZXF1ZXN0X2NhbGxiYWNrKSwKLSAgICAgIHNlc3Npb25fdXBkYXRlZF9jYWxsYmFja18oc2Vzc2lvbl91cGRhdGVkX2NhbGxiYWNrKSwKLSAgICAgIGtleV9zdGF0dXNlc19jaGFuZ2VkX2NhbGxiYWNrXyhrZXlfc3RhdHVzZXNfY2hhbmdlZF9jYWxsYmFjayksCi0gICAgICBzZXNzaW9uX2Nsb3NlZF9jYWxsYmFja18oc2Vzc2lvbl9jbG9zZWRfY2FsbGJhY2spLAotICAgICAgY3VycmVudF9zZXNzaW9uX2lkXygxKSB7Ci0gIFNCX0RDSEVDSyhzZXNzaW9uX3VwZGF0ZV9yZXF1ZXN0X2NhbGxiYWNrKTsKLSAgU0JfRENIRUNLKHNlc3Npb25fdXBkYXRlZF9jYWxsYmFjayk7Ci0gIFNCX0RDSEVDSyhrZXlfc3RhdHVzZXNfY2hhbmdlZF9jYWxsYmFjayk7Ci0gIFNCX0RDSEVDSyhzZXNzaW9uX2Nsb3NlZF9jYWxsYmFjayk7Ci0KLSAgU2NvcGVkTG9jayBsb2NrKEdldEFjdGl2ZURybVN5c3RlbXMoKS0+bXV0ZXhfKTsKLSAgR2V0QWN0aXZlRHJtU3lzdGVtcygpLT5hY3RpdmVfc3lzdGVtc18ucHVzaF9iYWNrKHRoaXMpOwotfQotCi1TYkRybVN5c3RlbVBsYXlyZWFkeTo6flNiRHJtU3lzdGVtUGxheXJlYWR5KCkgewotICBTQl9EQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7Ci0gIFNjb3BlZExvY2sgbG9jayhHZXRBY3RpdmVEcm1TeXN0ZW1zKCktPm11dGV4Xyk7Ci0gIGF1dG8mIGFjdGl2ZV9zeXN0ZW1zID0gR2V0QWN0aXZlRHJtU3lzdGVtcygpLT5hY3RpdmVfc3lzdGVtc187Ci0gIGFjdGl2ZV9zeXN0ZW1zLmVyYXNlKHN0ZDo6cmVtb3ZlKAotICAgICAgYWN0aXZlX3N5c3RlbXMuYmVnaW4oKSwgYWN0aXZlX3N5c3RlbXMuZW5kKCksIHRoaXMpKTsKLX0KLQotdm9pZCBTYkRybVN5c3RlbVBsYXlyZWFkeTo6R2VuZXJhdGVTZXNzaW9uVXBkYXRlUmVxdWVzdCgKLSAgICBpbnQgdGlja2V0LAotICAgIGNvbnN0IGNoYXIqIHR5cGUsCi0gICAgY29uc3Qgdm9pZCogaW5pdGlhbGl6YXRpb25fZGF0YSwKLSAgICBpbnQgaW5pdGlhbGl6YXRpb25fZGF0YV9zaXplKSB7Ci0gIFNCX0RDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKLQotICBpZiAoU2JTdHJpbmdDb21wYXJlQWxsKCJjZW5jIiwgdHlwZSkgIT0gMCkgewotICAgIFNCX05PVFJFQUNIRUQoKSA8PCAiSW52YWxpZCBpbml0aWFsaXphdGlvbiBkYXRhIHR5cGUgIiA8PCB0eXBlOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIHNlc3Npb25faWQgPSBHZW5lcmF0ZUFuZEFkdmFuY2VTZXNzaW9uSWQoKTsKLSAgc2NvcGVkX3JlZnB0cjxMaWNlbnNlPiBsaWNlbnNlID0KLSAgICAgIExpY2Vuc2U6OkNyZWF0ZShpbml0aWFsaXphdGlvbl9kYXRhLCBpbml0aWFsaXphdGlvbl9kYXRhX3NpemUpOwotICBjb25zdCBzdGQ6OnN0cmluZyYgY2hhbGxlbmdlID0gbGljZW5zZS0+bGljZW5zZV9jaGFsbGVuZ2UoKTsKLSAgaWYgKGNoYWxsZW5nZS5lbXB0eSgpKSB7Ci0gICAgLy8gU2lnbmFsIGFuIGVycm9yIHdpdGggfHNlc3Npb25faWR8IGFzIE5VTEwuCi0gICAgU0JfTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGdlbmVyYXRlIGxpY2Vuc2UgY2hhbGxlbmdlIjsKLSAgICBzZXNzaW9uX3VwZGF0ZV9yZXF1ZXN0X2NhbGxiYWNrXyh0aGlzLCBjb250ZXh0XywgdGlja2V0LCBOVUxMLCAwLCBOVUxMLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICAgIHJldHVybjsKLSAgfQotCi0gIFNCX0xPRyhJTkZPKSA8PCAiU2VuZCBjaGFsbGVuZ2UgZm9yIGtleSBpZCAiCi0gICAgICAgICAgICAgICA8PCBHZXRIZXhSZXByZXNlbnRhdGlvbihsaWNlbnNlLT5rZXlfaWQoKSkgPDwgIiBpbiBzZXNzaW9uICIKLSAgICAgICAgICAgICAgIDw8IHNlc3Npb25faWQ7Ci0gIFNCX0xPR19JRihJTkZPLCBrTG9nUGxheXJlYWR5Q2hhbGxlbmdlUmVzcG9uc2UpCi0gICAgICA8PCBHZXRIZXhSZXByZXNlbnRhdGlvbihjaGFsbGVuZ2UuZGF0YSgpLCBjaGFsbGVuZ2Uuc2l6ZSgpKTsKLQotICBzZXNzaW9uX3VwZGF0ZV9yZXF1ZXN0X2NhbGxiYWNrXyh0aGlzLCBjb250ZXh0XywgdGlja2V0LCBzZXNzaW9uX2lkLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oc2Vzc2lvbl9pZC5zaXplKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFsbGVuZ2UuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihjaGFsbGVuZ2Uuc2l6ZSgpKSwgTlVMTCk7Ci0gIHBlbmRpbmdfcmVxdWVzdHNfW3Nlc3Npb25faWRdID0gbGljZW5zZTsKLX0KLQotdm9pZCBTYkRybVN5c3RlbVBsYXlyZWFkeTo6VXBkYXRlU2Vzc2lvbihpbnQgdGlja2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBrZXlfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogc2Vzc2lvbl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25faWRfc2l6ZSkgewotICBTQl9EQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7Ci0KLSAgc3RkOjpzdHJpbmcgc2Vzc2lvbl9pZF9jb3B5KHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPihzZXNzaW9uX2lkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25faWRfc2l6ZSk7Ci0gIGF1dG8gaXRlciA9IHBlbmRpbmdfcmVxdWVzdHNfLmZpbmQoc2Vzc2lvbl9pZF9jb3B5KTsKLSAgU0JfRENIRUNLKGl0ZXIgIT0gcGVuZGluZ19yZXF1ZXN0c18uZW5kKCkpOwotICBpZiAoaXRlciA9PSBwZW5kaW5nX3JlcXVlc3RzXy5lbmQoKSkgewotICAgIFNCX05PVFJFQUNIRUQoKSA8PCAiSW52YWxpZCBzZXNzaW9uIGlkICIgPDwgc2Vzc2lvbl9pZF9jb3B5OwotICAgIHJldHVybjsKLSAgfQotCi0gIHNjb3BlZF9yZWZwdHI8TGljZW5zZT4gbGljZW5zZSA9IGl0ZXItPnNlY29uZDsKLQotICBTQl9MT0coSU5GTykgPDwgIkFkZGluZyBwbGF5cmVhZHkgcmVzcG9uc2UgZm9yIGtleSBpZCAiCi0gICAgICAgICAgICAgICA8PCBHZXRIZXhSZXByZXNlbnRhdGlvbihsaWNlbnNlLT5rZXlfaWQoKSk7Ci0gIFNCX0xPR19JRihJTkZPLCBrTG9nUGxheXJlYWR5Q2hhbGxlbmdlUmVzcG9uc2UpCi0gICAgICA8PCBHZXRIZXhSZXByZXNlbnRhdGlvbihrZXksIGtleV9zaXplKTsKLQotICBsaWNlbnNlLT5VcGRhdGVMaWNlbnNlKGtleSwga2V5X3NpemUpOwotCi0gIGlmIChsaWNlbnNlLT51c2FibGUoKSkgewotICAgIFNCX0xPRyhJTkZPKSA8PCAiU3VjY2Vzc2Z1bGx5IGFkZCBrZXkgZm9yIGtleSBpZCAiCi0gICAgICAgICAgICAgICAgIDw8IEdldEhleFJlcHJlc2VudGF0aW9uKGxpY2Vuc2UtPmtleV9pZCgpKSA8PCAiIGluIHNlc3Npb24gIgotICAgICAgICAgICAgICAgICA8PCBzZXNzaW9uX2lkX2NvcHk7Ci0gICAgewotICAgICAgU2NvcGVkTG9jayBsb2NrKG11dGV4Xyk7Ci0gICAgICBzdWNjZXNzZnVsX3JlcXVlc3RzX1tpdGVyLT5maXJzdF0gPQotICAgICAgICAgIExpY2Vuc2VJbmZvKGtTYkRybUtleVN0YXR1c1VzYWJsZSwgbGljZW5zZSk7Ci0gICAgfQotICAgIHNlc3Npb25fdXBkYXRlZF9jYWxsYmFja18odGhpcywgY29udGV4dF8sIHRpY2tldCwgc2Vzc2lvbl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25faWRfc2l6ZSwgdHJ1ZSk7Ci0KLSAgICB7Ci0gICAgICBTY29wZWRMb2NrIGxvY2sobXV0ZXhfKTsKLSAgICAgIFJlcG9ydEtleVN0YXR1c0NoYW5nZWRfTG9ja2VkKHNlc3Npb25faWRfY29weSk7Ci0gICAgfQotICAgIHBlbmRpbmdfcmVxdWVzdHNfLmVyYXNlKGl0ZXIpOwotICB9IGVsc2UgewotICAgIFNCX0xPRyhJTkZPKSA8PCAiRmFpbGVkIHRvIGFkZCBrZXkgZm9yIHNlc3Npb24gIiA8PCBzZXNzaW9uX2lkX2NvcHk7Ci0gICAgLy8gRG9uJ3QgcmVwb3J0IGl0IGFzIGEgZmFpbHVyZSBhcyBvdGhlcndpc2UgdGhlIEpTIHBsYXllciBpcyBnb2luZyB0bwotICAgIC8vIHRlcm1pbmF0ZSB0aGUgdmlkZW8uCi0gICAgc2Vzc2lvbl91cGRhdGVkX2NhbGxiYWNrXyh0aGlzLCBjb250ZXh0XywgdGlja2V0LCBzZXNzaW9uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbl9pZF9zaXplLCB0cnVlKTsKLSAgICAvLyBXaGVuIFVwZGF0ZUxpY2Vuc2UoKSBmYWlscywgdGhlIHxsaWNlbnNlfCBtdXN0IGhhdmUgZ2VuZXJhdGVkIGEgbmV3Ci0gICAgLy8gY2hhbGxlbmdlIGludGVybmFsbHkuICBTZW5kIHRoaXMgY2hhbGxlbmdlIGFnYWluLgotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjaGFsbGVuZ2UgPSBsaWNlbnNlLT5saWNlbnNlX2NoYWxsZW5nZSgpOwotICAgIGlmIChjaGFsbGVuZ2UuZW1wdHkoKSkgewotICAgICAgU0JfTk9UUkVBQ0hFRCgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIFNCX0xPRyhJTkZPKSA8PCAiU2VuZCBjaGFsbGVuZ2UgYWdhaW4gZm9yIGtleSBpZCAiCi0gICAgICAgICAgICAgICAgIDw8IEdldEhleFJlcHJlc2VudGF0aW9uKGxpY2Vuc2UtPmtleV9pZCgpKSA8PCAiIGluIHNlc3Npb24gIgotICAgICAgICAgICAgICAgICA8PCBzZXNzaW9uX2lkOwotICAgIFNCX0xPR19JRihJTkZPLCBrTG9nUGxheXJlYWR5Q2hhbGxlbmdlUmVzcG9uc2UpCi0gICAgICAgIDw8IEdldEhleFJlcHJlc2VudGF0aW9uKGNoYWxsZW5nZS5kYXRhKCksIGNoYWxsZW5nZS5zaXplKCkpOwotCi0gICAgLy8gV2UgaGF2ZSB1c2UgfGtTYkRybVRpY2tldEludmFsaWR8IGFzIHRoZSBsaWNlbnNlIGNoYWxsZW5nZSBpcyBub3QgYQotICAgIC8vIHJlc3VsdCBvZiBHZW5lcmF0ZVNlc3Npb25VcGRhdGVSZXF1ZXN0KCkuCi0gICAgc2Vzc2lvbl91cGRhdGVfcmVxdWVzdF9jYWxsYmFja18oCi0gICAgICAgIHRoaXMsIGNvbnRleHRfLCBrU2JEcm1UaWNrZXRJbnZhbGlkLCBzZXNzaW9uX2lkLCBzZXNzaW9uX2lkX3NpemUsCi0gICAgICAgIGNoYWxsZW5nZS5jX3N0cigpLCBzdGF0aWNfY2FzdDxpbnQ+KGNoYWxsZW5nZS5zaXplKCkpLCBOVUxMKTsKLSAgfQotfQotCi12b2lkIFNiRHJtU3lzdGVtUGxheXJlYWR5OjpDbG9zZVNlc3Npb24oY29uc3Qgdm9pZCogc2Vzc2lvbl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbl9pZF9zaXplKSB7Ci0gIFNCX0RDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKLQotICBrZXlfc3RhdHVzZXNfY2hhbmdlZF9jYWxsYmFja18odGhpcywgY29udGV4dF8sIHNlc3Npb25faWQsIHNlc3Npb25faWRfc2l6ZSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIG51bGxwdHIpOwotCi0gIHN0ZDo6c3RyaW5nIHNlc3Npb25faWRfY29weShzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oc2Vzc2lvbl9pZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uX2lkX3NpemUpOwotICBwZW5kaW5nX3JlcXVlc3RzXy5lcmFzZShzZXNzaW9uX2lkX2NvcHkpOwotCi0gIFNjb3BlZExvY2sgbG9jayhtdXRleF8pOwotICBzdWNjZXNzZnVsX3JlcXVlc3RzXy5lcmFzZShzZXNzaW9uX2lkX2NvcHkpOwotfQotCi1TYkRybVN5c3RlbVByaXZhdGU6OkRlY3J5cHRTdGF0dXMgU2JEcm1TeXN0ZW1QbGF5cmVhZHk6OkRlY3J5cHQoCi0gICAgSW5wdXRCdWZmZXIqIGJ1ZmZlcikgewotICBjb25zdCBTYkRybVNhbXBsZUluZm8qIGRybV9pbmZvID0gYnVmZmVyLT5kcm1faW5mbygpOwotCi0gIGlmIChkcm1faW5mbyA9PSBOVUxMIHx8IGRybV9pbmZvLT5pbml0aWFsaXphdGlvbl92ZWN0b3Jfc2l6ZSA9PSAwKSB7Ci0gICAgcmV0dXJuIGtTdWNjZXNzOwotICB9Ci0KLSAgR1VJRCBrZXlfaWQ7Ci0gIGlmIChkcm1faW5mby0+aWRlbnRpZmllcl9zaXplICE9IHNpemVvZihrZXlfaWQpKSB7Ci0gICAgcmV0dXJuIGtSZXRyeTsKLSAgfQotICBrZXlfaWQgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBHVUlEKj4oZHJtX2luZm8tPmlkZW50aWZpZXIpOwotCi0gIFNjb3BlZExvY2sgbG9jayhtdXRleF8pOwotICBmb3IgKGF1dG8mIGl0ZW0gOiBzdWNjZXNzZnVsX3JlcXVlc3RzXykgewotICAgIGlmIChpdGVtLnNlY29uZC5saWNlbnNlXy0+a2V5X2lkKCkgPT0ga2V5X2lkKSB7Ci0gICAgICBpZiAoYnVmZmVyLT5zYW1wbGVfdHlwZSgpID09IGtTYk1lZGlhVHlwZUF1ZGlvKSB7Ci0gICAgICAgIHJldHVybiBrU3VjY2VzczsKLSAgICAgIH0KLQotICAgICAgaWYgKGl0ZW0uc2Vjb25kLmxpY2Vuc2VfLT5Jc0hEQ1BSZXF1aXJlZCgpKSB7Ci0gICAgICAgIGlmICghU2JNZWRpYVNldE91dHB1dFByb3RlY3Rpb24odHJ1ZSkpIHsKLSAgICAgICAgICBTQl9MT0coSU5GTykgPDwgIkhEQ1AgcmVxdWlyZWQgYnV0IG5vdCBhdmFpbGFibGUiOwotICAgICAgICAgIGl0ZW0uc2Vjb25kLnN0YXR1c18gPSBrU2JEcm1LZXlTdGF0dXNSZXN0cmljdGVkOwotICAgICAgICAgIFJlcG9ydEtleVN0YXR1c0NoYW5nZWRfTG9ja2VkKGl0ZW0uZmlyc3QpOwotICAgICAgICAgIHJldHVybiBrUmV0cnk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgcmV0dXJuIGtTdWNjZXNzOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBrUmV0cnk7Ci19Ci0KLXZvaWQgU2JEcm1TeXN0ZW1QbGF5cmVhZHk6OlJlcG9ydEtleVN0YXR1c0NoYW5nZWRfTG9ja2VkKAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXNzaW9uX2lkKSB7Ci0gIC8vIG11dGV4XyBtdXN0IGJlIGhlbGQgYnkgY2FsbGVyCi0gIDo6c3RhcmJvYXJkOjpTY29wZWRUcnlMb2NrIGxvY2tfc2hvdWxkX2ZhaWwobXV0ZXhfKTsKLSAgU0JfRENIRUNLKCFsb2NrX3Nob3VsZF9mYWlsLmlzX2xvY2tlZCgpKTsKLQotICBMaWNlbnNlSW5mbyYgaXRlbSA9IHN1Y2Nlc3NmdWxfcmVxdWVzdHNfW3Nlc3Npb25faWRdOwotCi0gIEdVSUQga2V5X2lkID0gaXRlbS5saWNlbnNlXy0+a2V5X2lkKCk7Ci0gIFNiRHJtS2V5SWQgZHJtX2tleV9pZDsKLSAgU0JfRENIRUNLKHNpemVvZihkcm1fa2V5X2lkLmlkZW50aWZpZXIpID49IHNpemVvZihrZXlfaWQpKTsKLSAgU2JNZW1vcnlDb3B5KCYoZHJtX2tleV9pZC5pZGVudGlmaWVyKSwgJmtleV9pZCwgc2l6ZW9mKGtleV9pZCkpOwotICBkcm1fa2V5X2lkLmlkZW50aWZpZXJfc2l6ZSA9IHNpemVvZihrZXlfaWQpOwotCi0gIGtleV9zdGF0dXNlc19jaGFuZ2VkX2NhbGxiYWNrXyh0aGlzLCBjb250ZXh0XywKLSAgICAgIHNlc3Npb25faWQuZGF0YSgpLCBzdGF0aWNfY2FzdDxpbnQ+KHNlc3Npb25faWQuc2l6ZSgpKSwKLSAgICAgIDEsICZkcm1fa2V5X2lkLCAmKGl0ZW0uc3RhdHVzXykpOwotfQotCi1zY29wZWRfcmVmcHRyPFNiRHJtU3lzdGVtUGxheXJlYWR5OjpMaWNlbnNlPiBTYkRybVN5c3RlbVBsYXlyZWFkeTo6R2V0TGljZW5zZSgKLSAgICBjb25zdCB1aW50OF90KiBrZXlfaWQsCi0gICAgaW50IGtleV9pZF9zaXplKSB7Ci0gIEdVSUQga2V5X2lkX2NvcHk7Ci0gIGlmIChrZXlfaWRfc2l6ZSAhPSBzaXplb2Yoa2V5X2lkX2NvcHkpKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAga2V5X2lkX2NvcHkgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBHVUlEKj4oa2V5X2lkKTsKLQotICBTY29wZWRMb2NrIGxvY2sobXV0ZXhfKTsKLQotICBmb3IgKGF1dG8mIGl0ZW0gOiBzdWNjZXNzZnVsX3JlcXVlc3RzXykgewotICAgIGlmIChpdGVtLnNlY29uZC5saWNlbnNlXy0+a2V5X2lkKCkgPT0ga2V5X2lkX2NvcHkpIHsKLSAgICAgIHJldHVybiBpdGVtLnNlY29uZC5saWNlbnNlXzsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBTYkRybVN5c3RlbVBsYXlyZWFkeTo6T25Vd3BSZXN1bWUoKSB7Ci0gIGZvciAoYXV0byYgaXRlbSA6IHN1Y2Nlc3NmdWxfcmVxdWVzdHNfKSB7Ci0gICAgc2Vzc2lvbl9jbG9zZWRfY2FsbGJhY2tfKHRoaXMsIGNvbnRleHRfLAotICAgICAgICBpdGVtLmZpcnN0LmRhdGEoKSwgc3RhdGljX2Nhc3Q8aW50PihpdGVtLmZpcnN0LnNpemUoKSkpOwotICB9Ci19Ci0KLXN0ZDo6c3RyaW5nIFNiRHJtU3lzdGVtUGxheXJlYWR5OjpHZW5lcmF0ZUFuZEFkdmFuY2VTZXNzaW9uSWQoKSB7Ci0gIFNCX0RDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKLQotICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgc3MgPDwgY3VycmVudF9zZXNzaW9uX2lkXzsKLSAgKytjdXJyZW50X3Nlc3Npb25faWRfOwotICByZXR1cm4gc3Muc3RyKCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB3aW4zMgotfSAgLy8gbmFtZXNwYWNlIHNoYXJlZAotfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZHJtX3N5c3RlbV9wbGF5cmVhZHkuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2RybV9zeXN0ZW1fcGxheXJlYWR5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NDQ0YjMuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZHJtX3N5c3RlbV9wbGF5cmVhZHkuaAorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaWZuZGVmIFNUQVJCT0FSRF9TSEFSRURfV0lOMzJfRFJNX1NZU1RFTV9QTEFZUkVBRFlfSF8KLSNkZWZpbmUgU1RBUkJPQVJEX1NIQVJFRF9XSU4zMl9EUk1fU1lTVEVNX1BMQVlSRUFEWV9IXwotCi0jaW5jbHVkZSA8bWZhcGkuaD4KLSNpbmNsdWRlIDxtZmlkbC5oPgotI2luY2x1ZGUgPHdybC5oPgotI2luY2x1ZGUgPHdybC9jbGllbnQuaD4KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJzdGFyYm9hcmQvY29tbW9uL3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL211dGV4LmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvZHJtL2RybV9zeXN0ZW1faW50ZXJuYWwuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC90aHJlYWRfY2hlY2tlci5oIgotCi1uYW1lc3BhY2Ugc3RhcmJvYXJkIHsKLW5hbWVzcGFjZSBzaGFyZWQgewotbmFtZXNwYWNlIHdpbjMyIHsKLQotLy8gQWRhcHRzIFBsYXlSZWFkeSBkZWNyeXB0aW9uIG1vZHVsZSB0byBTdGFyYm9hcmQncyB8U2JEcm1TeXN0ZW18LgotY2xhc3MgU2JEcm1TeXN0ZW1QbGF5cmVhZHkgOiBwdWJsaWMgU2JEcm1TeXN0ZW1Qcml2YXRlIHsKLSBwdWJsaWM6Ci0gIGNsYXNzIExpY2Vuc2UgOiBwdWJsaWMgUmVmQ291bnRlZFRocmVhZFNhZmU8TGljZW5zZT4gewotICAgcHVibGljOgotICAgIHN0YXRpYyBzY29wZWRfcmVmcHRyPExpY2Vuc2U+IENyZWF0ZShjb25zdCB2b2lkKiBpbml0aWFsaXphdGlvbl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5pdGlhbGl6YXRpb25fZGF0YV9zaXplKTsKLQotICAgIHZpcnR1YWwgfkxpY2Vuc2UoKSB7fQotCi0gICAgdmlydHVhbCBHVUlEIGtleV9pZCgpIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsIGJvb2wgdXNhYmxlKCkgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgbGljZW5zZV9jaGFsbGVuZ2UoKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCBNaWNyb3NvZnQ6OldSTDo6Q29tUHRyPElNRlRyYW5zZm9ybT4gZGVjcnlwdG9yKCkgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBVcGRhdGVMaWNlbnNlKGNvbnN0IHZvaWQqIGxpY2Vuc2UsIGludCBsaWNlbnNlX3NpemUpID0gMDsKLSAgICB2aXJ0dWFsIGJvb2wgSXNIRENQUmVxdWlyZWQoKSA9IDA7Ci0gIH07Ci0KLSAgU2JEcm1TeXN0ZW1QbGF5cmVhZHkoCi0gICAgICB2b2lkKiBjb250ZXh0LAotICAgICAgU2JEcm1TZXNzaW9uVXBkYXRlUmVxdWVzdEZ1bmMgc2Vzc2lvbl91cGRhdGVfcmVxdWVzdF9jYWxsYmFjaywKLSAgICAgIFNiRHJtU2Vzc2lvblVwZGF0ZWRGdW5jIHNlc3Npb25fdXBkYXRlZF9jYWxsYmFjaywKLSAgICAgIFNiRHJtU2Vzc2lvbktleVN0YXR1c2VzQ2hhbmdlZEZ1bmMga2V5X3N0YXR1c2VzX2NoYW5nZWRfY2FsbGJhY2ssCi0gICAgICBTYkRybVNlc3Npb25DbG9zZWRGdW5jIHNlc3Npb25fY2xvc2VkX2NhbGxiYWNrKTsKLSAgflNiRHJtU3lzdGVtUGxheXJlYWR5KCkgb3ZlcnJpZGU7Ci0KLSAgLy8gRnJvbSB8U2JEcm1TeXN0ZW1Qcml2YXRlfC4KLSAgdm9pZCBHZW5lcmF0ZVNlc3Npb25VcGRhdGVSZXF1ZXN0KGludCB0aWNrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogaW5pdGlhbGl6YXRpb25fZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbml0aWFsaXphdGlvbl9kYXRhX3NpemUpIG92ZXJyaWRlOwotCi0gIHZvaWQgVXBkYXRlU2Vzc2lvbihpbnQgdGlja2V0LAotICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCoga2V5LAotICAgICAgICAgICAgICAgICAgICAgaW50IGtleV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogc2Vzc2lvbl9pZCwKLSAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uX2lkX3NpemUpIG92ZXJyaWRlOwotCi0gIHZvaWQgQ2xvc2VTZXNzaW9uKGNvbnN0IHZvaWQqIHNlc3Npb25faWQsIGludCBzZXNzaW9uX2lkX3NpemUpIG92ZXJyaWRlOwotCi0gIERlY3J5cHRTdGF0dXMgRGVjcnlwdChJbnB1dEJ1ZmZlciogYnVmZmVyKSBvdmVycmlkZTsKLQotICAvLyBVc2VkIGJ5IGF1ZGlvIGFuZCB2aWRlbyBkZWNvZGVycyB0byByZXRyaWV2ZSB0aGUgZGVjcnlwdG9ycy4KLSAgc2NvcGVkX3JlZnB0cjxMaWNlbnNlPiBHZXRMaWNlbnNlKGNvbnN0IHVpbnQ4X3QqIGtleV9pZCwgaW50IGtleV9pZF9zaXplKTsKLQotICB2b2lkIE9uVXdwUmVzdW1lKCk7Ci0KLSBwcml2YXRlOgotICBzdGQ6OnN0cmluZyBHZW5lcmF0ZUFuZEFkdmFuY2VTZXNzaW9uSWQoKTsKLSAgLy8gTm90ZTogcmVxdWlyZXMgbXV0ZXhfIHRvIGJlIGhlbGQKLSAgdm9pZCBSZXBvcnRLZXlTdGF0dXNDaGFuZ2VkX0xvY2tlZChjb25zdCBzdGQ6OnN0cmluZyYgc2Vzc2lvbl9pZCk7Ci0KLSAgOjpzdGFyYm9hcmQ6OnNoYXJlZDo6c3RhcmJvYXJkOjpUaHJlYWRDaGVja2VyIHRocmVhZF9jaGVja2VyXzsKLQotICB2b2lkKiBjb250ZXh0XzsKLSAgU2JEcm1TZXNzaW9uVXBkYXRlUmVxdWVzdEZ1bmMgc2Vzc2lvbl91cGRhdGVfcmVxdWVzdF9jYWxsYmFja187Ci0gIFNiRHJtU2Vzc2lvblVwZGF0ZWRGdW5jIHNlc3Npb25fdXBkYXRlZF9jYWxsYmFja187Ci0gIFNiRHJtU2Vzc2lvbktleVN0YXR1c2VzQ2hhbmdlZEZ1bmMga2V5X3N0YXR1c2VzX2NoYW5nZWRfY2FsbGJhY2tfOwotICBTYkRybVNlc3Npb25DbG9zZWRGdW5jIHNlc3Npb25fY2xvc2VkX2NhbGxiYWNrXzsKLSAgaW50IGN1cnJlbnRfc2Vzc2lvbl9pZF87Ci0KLSAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHNjb3BlZF9yZWZwdHI8TGljZW5zZT4gPiBwZW5kaW5nX3JlcXVlc3RzXzsKLQotICAvLyB8c3VjY2Vzc2Z1bF9yZXF1ZXN0c198IGNhbiBiZSBhY2Nlc3NlZCBmcm9tIG1vcmUgdGhhbiBvbmUgdGhyZWFkLiAgR3VhcmQKLSAgLy8gaXQgYnkgYSBtdXRleC4KLSAgTXV0ZXggbXV0ZXhfOwotCi0gIHN0cnVjdCBMaWNlbnNlSW5mbyB7Ci0gICAgTGljZW5zZUluZm8oU2JEcm1LZXlTdGF0dXMgc3RhdHVzLCBjb25zdCBzY29wZWRfcmVmcHRyPExpY2Vuc2U+JiBsaWNlbnNlKQotICAgICAgICA6IHN0YXR1c18oc3RhdHVzKSwgbGljZW5zZV8obGljZW5zZSkge30KLSAgICBMaWNlbnNlSW5mbygpIDogc3RhdHVzXyhrU2JEcm1LZXlTdGF0dXNFcnJvcikge30KLQotICAgIFNiRHJtS2V5U3RhdHVzIHN0YXR1c187Ci0gICAgc2NvcGVkX3JlZnB0cjxMaWNlbnNlPiBsaWNlbnNlXzsKLSAgfTsKLQotICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgTGljZW5zZUluZm8+IHN1Y2Nlc3NmdWxfcmVxdWVzdHNfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHdpbjMyCi19ICAvLyBuYW1lc3BhY2Ugc2hhcmVkCi19ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCi0KLSNlbmRpZiAgLy8gU1RBUkJPQVJEX1NIQVJFRF9XSU4zMl9EUk1fU1lTVEVNX1BMQVlSRUFEWV9IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZHhfY29udGV4dF92aWRlb19kZWNvZGVyLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZHhfY29udGV4dF92aWRlb19kZWNvZGVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWQzNGMyLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2R4X2NvbnRleHRfdmlkZW9fZGVjb2Rlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2R4X2NvbnRleHRfdmlkZW9fZGVjb2Rlci5oIgotCi0jaW5jbHVkZSA8RDNEMTEuaD4KLSNpbmNsdWRlIDxEM0QxMV80Lmg+Ci0jaW5jbHVkZSA8bWZhcGkuaD4KLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2FuZ2xlL2luY2x1ZGUvRUdML2VnbC5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2FuZ2xlL2luY2x1ZGUvRUdML2VnbGV4dC5oIgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotCi1uYW1lc3BhY2Ugc3RhcmJvYXJkIHsKLW5hbWVzcGFjZSBzaGFyZWQgewotbmFtZXNwYWNlIHdpbjMyIHsKLQotSGFyZHdhcmVEZWNvZGVyQ29udGV4dCBHZXREaXJlY3RYRm9ySGFyZHdhcmVEZWNvZGluZygpIHsKLSAgSFJFU1VMVCByZXN1bHQgPSBTX09LOwotICBFR0xEaXNwbGF5IGRpc3BsYXkgPSBlZ2xHZXREaXNwbGF5KEVHTF9ERUZBVUxUX0RJU1BMQVkpOwotICBQRk5FR0xRVUVSWURJU1BMQVlBVFRSSUJFWFRQUk9DIHF1ZXJ5X2Rpc3BsYXk7Ci0KLSAgcXVlcnlfZGlzcGxheSA9IHJlaW50ZXJwcmV0X2Nhc3Q8UEZORUdMUVVFUllESVNQTEFZQVRUUklCRVhUUFJPQz4oCi0gICAgICBlZ2xHZXRQcm9jQWRkcmVzcygiZWdsUXVlcnlEaXNwbGF5QXR0cmliRVhUIikpOwotICBTQl9EQ0hFQ0socXVlcnlfZGlzcGxheSAhPSBudWxscHRyKTsKLQotICBQRk5FR0xRVUVSWURFVklDRUFUVFJJQkVYVFBST0MgcXVlcnlfZGV2aWNlOwotICBxdWVyeV9kZXZpY2UgPSByZWludGVycHJldF9jYXN0PFBGTkVHTFFVRVJZREVWSUNFQVRUUklCRVhUUFJPQz4oCi0gICAgICBlZ2xHZXRQcm9jQWRkcmVzcygiZWdsUXVlcnlEZXZpY2VBdHRyaWJFWFQiKSk7Ci0gIFNCX0RDSEVDSyhxdWVyeV9kZXZpY2UgIT0gbnVsbHB0cik7Ci0KLSAgaW50cHRyX3QgZWdsX2RldmljZSA9IDA7Ci0gIHF1ZXJ5X2Rpc3BsYXkoZGlzcGxheSwgRUdMX0RFVklDRV9FWFQsICZlZ2xfZGV2aWNlKTsKLSAgU0JfRENIRUNLKGVnbF9kZXZpY2UgIT0gMCk7Ci0KLSAgaW50cHRyX3QgZGV2aWNlOwotICBxdWVyeV9kZXZpY2UocmVpbnRlcnByZXRfY2FzdDxFR0xEZXZpY2VFWFQ+KGVnbF9kZXZpY2UpLAotICAgICAgRUdMX0QzRDExX0RFVklDRV9BTkdMRSwgJmRldmljZSk7Ci0KLSAgSUQzRDExRGV2aWNlKiBvdXRwdXRfZHhfZGV2aWNlID0gcmVpbnRlcnByZXRfY2FzdDxJRDNEMTFEZXZpY2UqPihkZXZpY2UpOwotICBJTUZEWEdJRGV2aWNlTWFuYWdlciogZHhnaV9kZXZpY2VfbWdyID0gbnVsbHB0cjsKLQotICBVSU5UIHRva2VuID0gMDsKLSAgcmVzdWx0ID0gTUZDcmVhdGVEWEdJRGV2aWNlTWFuYWdlcigmdG9rZW4sICZkeGdpX2RldmljZV9tZ3IpOwotICBTQl9EQ0hFQ0socmVzdWx0ID09IFNfT0spOwotICBTQl9EQ0hFQ0soZHhnaV9kZXZpY2VfbWdyKTsKLQotICByZXN1bHQgPSBkeGdpX2RldmljZV9tZ3ItPlJlc2V0RGV2aWNlKG91dHB1dF9keF9kZXZpY2UsIHRva2VuKTsKLSAgU0JfRENIRUNLKFNVQ0NFRURFRChyZXN1bHQpKTsKLQotICBIYXJkd2FyZURlY29kZXJDb250ZXh0IG91dHB1dCA9IHsKLSAgICBvdXRwdXRfZHhfZGV2aWNlLAotICAgIGR4Z2lfZGV2aWNlX21ncgotICB9OwotICByZXR1cm4gb3V0cHV0OwotfQotCi19ICAvLyBuYW1lc3BhY2Ugd2luMzIKLX0gIC8vIG5hbWVzcGFjZSBzaGFyZWQKLX0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2R4X2NvbnRleHRfdmlkZW9fZGVjb2Rlci5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZHhfY29udGV4dF92aWRlb19kZWNvZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZGY0ZWEuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZHhfY29udGV4dF92aWRlb19kZWNvZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaWZuZGVmIFNUQVJCT0FSRF9TSEFSRURfV0lOMzJfRFhfQ09OVEVYVF9WSURFT19ERUNPREVSX0hfCi0jZGVmaW5lIFNUQVJCT0FSRF9TSEFSRURfV0lOMzJfRFhfQ09OVEVYVF9WSURFT19ERUNPREVSX0hfCi0KLSNpbmNsdWRlIDx3cmxcY2xpZW50Lmg+ICAvLyBGb3IgQ29tUHRyLgotCi1zdHJ1Y3QgSUQzRDExRGV2aWNlOwotc3RydWN0IElEM0QxMURldmljZUNvbnRleHQ7Ci1zdHJ1Y3QgSU1GRFhHSURldmljZU1hbmFnZXI7Ci0KLW5hbWVzcGFjZSBzdGFyYm9hcmQgewotbmFtZXNwYWNlIHNoYXJlZCB7Ci1uYW1lc3BhY2Ugd2luMzIgewotCi1zdHJ1Y3QgSGFyZHdhcmVEZWNvZGVyQ29udGV4dCB7Ci0gIE1pY3Jvc29mdDo6V1JMOjpDb21QdHI8SUQzRDExRGV2aWNlPiBkeF9kZXZpY2Vfb3V0OwotICBNaWNyb3NvZnQ6OldSTDo6Q29tUHRyPElNRkRYR0lEZXZpY2VNYW5hZ2VyPiBkeGdpX2RldmljZV9tYW5hZ2VyX291dDsKLX07Ci0KLUhhcmR3YXJlRGVjb2RlckNvbnRleHQgR2V0RGlyZWN0WEZvckhhcmR3YXJlRGVjb2RpbmcoKTsKLQotfSAgLy8gbmFtZXNwYWNlIHdpbjMyCi19ICAvLyBuYW1lc3BhY2Ugc2hhcmVkCi19ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCi0jZW5kaWYgIC8vIFNUQVJCT0FSRF9TSEFSRURfV0lOMzJfRFhfQ09OVEVYVF9WSURFT19ERUNPREVSX0hfCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9lcnJvcl91dGlscy5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2Vycm9yX3V0aWxzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTUyODIxLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2Vycm9yX3V0aWxzLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLS8vIE5vdCBicmVha2luZyB0aGVzZSBmdW5jdGlvbnMgdXAgYmVjYXVzZSBob3dldmVyIG9uZSBpcyBpbXBsZW1lbnRlZCwgdGhlCi0vLyBvdGhlcnMgc2hvdWxkIGJlIGltcGxlbWVudGVkIHNpbWlsYXJseS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvZXJyb3JfdXRpbHMuaCIKLQotI2luY2x1ZGUgPE1mYXBpLmg+Ci0jaW5jbHVkZSA8TWZlcnJvci5oPgotI2luY2x1ZGUgPHByb3B2YXJ1dGlsLmg+Ci0KLSNpbmNsdWRlIDx1dGlsaXR5PgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvd2NoYXJfdXRpbHMuaCIKLQotbmFtZXNwYWNlIHN0YXJib2FyZCB7Ci1uYW1lc3BhY2Ugc2hhcmVkIHsKLW5hbWVzcGFjZSB3aW4zMiB7Ci1uYW1lc3BhY2UgewotCi1zdGQ6OnN0cmluZyBHZXRGb3JtYXRIcmVzdWx0TWVzc2FnZShIUkVTVUxUIGhyKSB7Ci0gIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwotICBMUFdTVFIgZXJyb3JfbWVzc2FnZTsKLSAgaW50IG1lc3NhZ2Vfc2l6ZSA9IEZvcm1hdE1lc3NhZ2UoCi0gICAgICBGT1JNQVRfTUVTU0FHRV9GUk9NX1NZU1RFTSB8IEZPUk1BVF9NRVNTQUdFX0FMTE9DQVRFX0JVRkZFUiB8Ci0gICAgICAgICAgRk9STUFUX01FU1NBR0VfSUdOT1JFX0lOU0VSVFMsCi0gICAgICBudWxscHRyLCAgLy8gVW51c2VkIHdpdGggRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU0uCi0gICAgICBociwgTUFLRUxBTkdJRChMQU5HX05FVVRSQUwsIFNVQkxBTkdfREVGQVVMVCksCi0gICAgICAoTFBUU1RSKSZlcnJvcl9tZXNzYWdlLAotICAgICAgMCwgIC8vIE1pbmltdW0gc2l6ZSBmb3Igb3V0cHV0IGJ1ZmZlci4KLSAgICAgIG51bGxwdHIpOwotICBTQl9EQ0hFQ0sobWVzc2FnZV9zaXplKTsKLSAgc3MgPDwgd2NoYXJfdFRvVVRGOChlcnJvcl9tZXNzYWdlKTsKLSAgTG9jYWxGcmVlKGVycm9yX21lc3NhZ2UpOwotICByZXR1cm4gc3Muc3RyKCk7Ci19Ci0KLQotI2RlZmluZSBNQUtFX0hSX1BBSVIoWCkgc3RkOjpwYWlyPEhSRVNVTFQsIHN0ZDo6c3RyaW5nPihYLCAjWCkKLWNvbnN0IHN0ZDo6cGFpcjxIUkVTVUxULCBzdGQ6OnN0cmluZz4ga0hyZXN1bHRWYWx1ZVN0cmluZ3NbXSA9IHsKLSAgTUFLRV9IUl9QQUlSKFNfT0spLAotICBNQUtFX0hSX1BBSVIoTUZfRV9QTEFURk9STV9OT1RfSU5JVElBTElaRUQpLAotICBNQUtFX0hSX1BBSVIoTUZfRV9CVUZGRVJUT09TTUFMTCksCi0gIE1BS0VfSFJfUEFJUihNRl9FX0lOVkFMSURSRVFVRVNUKSwKLSAgTUFLRV9IUl9QQUlSKE1GX0VfSU5WQUxJRFNUUkVBTU5VTUJFUiksCi0gIE1BS0VfSFJfUEFJUihNRl9FX0lOVkFMSURNRURJQVRZUEUpLAotICBNQUtFX0hSX1BBSVIoTUZfRV9OT1RBQ0NFUFRJTkcpLAotICBNQUtFX0hSX1BBSVIoTUZfRV9OT1RfSU5JVElBTElaRUQpLAotICBNQUtFX0hSX1BBSVIoTUZfRV9VTlNVUFBPUlRFRF9SRVBSRVNFTlRBVElPTiksCi0gIE1BS0VfSFJfUEFJUihNRl9FX05PX01PUkVfVFlQRVMpLAotICBNQUtFX0hSX1BBSVIoTUZfRV9VTlNVUFBPUlRFRF9TRVJWSUNFKSwKLSAgTUFLRV9IUl9QQUlSKE1GX0VfVU5FWFBFQ1RFRCksCi0gIE1BS0VfSFJfUEFJUihNRl9FX0lOVkFMSUROQU1FKSwKLSAgTUFLRV9IUl9QQUlSKE1GX0VfSU5WQUxJRFRZUEUpLAotICBNQUtFX0hSX1BBSVIoTUZfRV9JTlZBTElEX0ZJTEVfRk9STUFUKSwKLSAgTUFLRV9IUl9QQUlSKE1GX0VfSU5WQUxJRElOREVYKSwKLSAgTUFLRV9IUl9QQUlSKE1GX0VfSU5WQUxJRF9USU1FU1RBTVApLAotICBNQUtFX0hSX1BBSVIoTUZfRV9VTlNVUFBPUlRFRF9TQ0hFTUUpLAotICBNQUtFX0hSX1BBSVIoTUZfRV9VTlNVUFBPUlRFRF9CWVRFU1RSRUFNX1RZUEUpLAotICBNQUtFX0hSX1BBSVIoTUZfRV9VTlNVUFBPUlRFRF9USU1FX0ZPUk1BVCksCi0gIE1BS0VfSFJfUEFJUihNRl9FX05PX1NBTVBMRV9USU1FU1RBTVApLAotICBNQUtFX0hSX1BBSVIoTUZfRV9OT19TQU1QTEVfRFVSQVRJT04pLAotICBNQUtFX0hSX1BBSVIoTUZfRV9JTlZBTElEX1NUUkVBTV9EQVRBKSwKLSAgTUFLRV9IUl9QQUlSKE1GX0VfUlRfVU5BVkFJTEFCTEUpLAotICBNQUtFX0hSX1BBSVIoTUZfRV9VTlNVUFBPUlRFRF9SQVRFKSwKLSAgTUFLRV9IUl9QQUlSKE1GX0VfVEhJTk5JTkdfVU5TVVBQT1JURUQpLAotICBNQUtFX0hSX1BBSVIoTUZfRV9SRVZFUlNFX1VOU1VQUE9SVEVEKSwKLSAgTUFLRV9IUl9QQUlSKE1GX0VfVU5TVVBQT1JURURfUkFURV9UUkFOU0lUSU9OKSwKLSAgTUFLRV9IUl9QQUlSKE1GX0VfUkFURV9DSEFOR0VfUFJFRU1QVEVEKSwKLSAgTUFLRV9IUl9QQUlSKE1GX0VfTk9UX0ZPVU5EKSwKLSAgTUFLRV9IUl9QQUlSKE1GX0VfTk9UX0FWQUlMQUJMRSksCi0gIE1BS0VfSFJfUEFJUihNRl9FX05PX0NMT0NLKSwKLSAgTUFLRV9IUl9QQUlSKE1GX1NfTVVMVElQTEVfQkVHSU4pLAotICBNQUtFX0hSX1BBSVIoTUZfRV9NVUxUSVBMRV9CRUdJTiksCi0gIE1BS0VfSFJfUEFJUihNRl9FX01VTFRJUExFX1NVQlNDUklCRVJTKSwKLSAgTUFLRV9IUl9QQUlSKE1GX0VfVElNRVJfT1JQSEFORUQpLAotICBNQUtFX0hSX1BBSVIoTUZfRV9TVEFURV9UUkFOU0lUSU9OX1BFTkRJTkcpLAotICBNQUtFX0hSX1BBSVIoTUZfRV9VTlNVUFBPUlRFRF9TVEFURV9UUkFOU0lUSU9OKSwKLSAgTUFLRV9IUl9QQUlSKE1GX0VfVU5SRUNPVkVSQUJMRV9FUlJPUl9PQ0NVUlJFRCksCi0gIE1BS0VfSFJfUEFJUihNRl9FX1NBTVBMRV9IQVNfVE9PX01BTllfQlVGRkVSUyksCi0gIE1BS0VfSFJfUEFJUihNRl9FX1NBTVBMRV9OT1RfV1JJVEFCTEUpLAotICBNQUtFX0hSX1BBSVIoTUZfRV9JTlZBTElEX0tFWSksCi0gIE1BS0VfSFJfUEFJUihNRl9FX0JBRF9TVEFSVFVQX1ZFUlNJT04pLAotICBNQUtFX0hSX1BBSVIoTUZfRV9VTlNVUFBPUlRFRF9DQVBUSU9OKSwKLSAgTUFLRV9IUl9QQUlSKE1GX0VfSU5WQUxJRF9QT1NJVElPTiksCi0gIE1BS0VfSFJfUEFJUihNRl9FX0FUVFJJQlVURU5PVEZPVU5EKSwKLSAgTUFLRV9IUl9QQUlSKE1GX0VfUFJPUEVSVFlfVFlQRV9OT1RfQUxMT1dFRCksCi0gIE1BS0VfSFJfUEFJUihNRl9FX1RPUE9fSU5WQUxJRF9PUFRJT05BTF9OT0RFKSwKLSAgTUFLRV9IUl9QQUlSKE1GX0VfVE9QT19DQU5OT1RfRklORF9ERUNSWVBUT1IpLAotICBNQUtFX0hSX1BBSVIoTUZfRV9UT1BPX0NPREVDX05PVF9GT1VORCksCi0gIE1BS0VfSFJfUEFJUihNRl9FX1RPUE9fQ0FOTk9UX0NPTk5FQ1QpLAotICBNQUtFX0hSX1BBSVIoTUZfRV9UT1BPX1VOU1VQUE9SVEVEKSwKLSAgTUFLRV9IUl9QQUlSKE1GX0VfVE9QT19JTlZBTElEX1RJTUVfQVRUUklCVVRFUyksCi0gIE1BS0VfSFJfUEFJUihNRl9FX1RPUE9fTE9PUFNfSU5fVE9QT0xPR1kpLAotICBNQUtFX0hSX1BBSVIoTUZfRV9UT1BPX01JU1NJTkdfUFJFU0VOVEFUSU9OX0RFU0NSSVBUT1IpLAotICBNQUtFX0hSX1BBSVIoTUZfRV9UT1BPX01JU1NJTkdfU1RSRUFNX0RFU0NSSVBUT1IpLAotICBNQUtFX0hSX1BBSVIoTUZfRV9UT1BPX1NUUkVBTV9ERVNDUklQVE9SX05PVF9TRUxFQ1RFRCksCi0gIE1BS0VfSFJfUEFJUihNRl9FX1RPUE9fTUlTU0lOR19TT1VSQ0UpLAotICBNQUtFX0hSX1BBSVIoTUZfRV9UT1BPX1NJTktfQUNUSVZBVEVTX1VOU1VQUE9SVEVEKSwKLSAgTUFLRV9IUl9QQUlSKE1GX0VfVFJBTlNGT1JNX1RZUEVfTk9UX1NFVCksCi0gIE1BS0VfSFJfUEFJUihNRl9FX1RSQU5TRk9STV9TVFJFQU1fQ0hBTkdFKSwKLSAgTUFLRV9IUl9QQUlSKE1GX0VfVFJBTlNGT1JNX0lOUFVUX1JFTUFJTklORyksCi0gIE1BS0VfSFJfUEFJUihNRl9FX1RSQU5TRk9STV9QUk9GSUxFX01JU1NJTkcpLAotICBNQUtFX0hSX1BBSVIoTUZfRV9UUkFOU0ZPUk1fUFJPRklMRV9JTlZBTElEX09SX0NPUlJVUFQpLAotICBNQUtFX0hSX1BBSVIoTUZfRV9UUkFOU0ZPUk1fUFJPRklMRV9UUlVOQ0FURUQpLAotICBNQUtFX0hSX1BBSVIoTUZfRV9UUkFOU0ZPUk1fUFJPUEVSVFlfUElEX05PVF9SRUNPR05JWkVEKSwKLSAgTUFLRV9IUl9QQUlSKE1GX0VfVFJBTlNGT1JNX1BST1BFUlRZX1ZBUklBTlRfVFlQRV9XUk9ORyksCi0gIE1BS0VfSFJfUEFJUihNRl9FX1RSQU5TRk9STV9QUk9QRVJUWV9OT1RfV1JJVEVBQkxFKSwKLSAgTUFLRV9IUl9QQUlSKE1GX0VfVFJBTlNGT1JNX1BST1BFUlRZX0FSUkFZX1ZBTFVFX1dST05HX05VTV9ESU0pLAotICBNQUtFX0hSX1BBSVIoTUZfRV9UUkFOU0ZPUk1fUFJPUEVSVFlfVkFMVUVfU0laRV9XUk9ORyksCi0gIE1BS0VfSFJfUEFJUihNRl9FX1RSQU5TRk9STV9QUk9QRVJUWV9WQUxVRV9PVVRfT0ZfUkFOR0UpLAotICBNQUtFX0hSX1BBSVIoTUZfRV9UUkFOU0ZPUk1fUFJPUEVSVFlfVkFMVUVfSU5DT01QQVRJQkxFKSwKLSAgTUFLRV9IUl9QQUlSKE1GX0VfVFJBTlNGT1JNX05PVF9QT1NTSUJMRV9GT1JfQ1VSUkVOVF9PVVRQVVRfTUVESUFUWVBFKSwKLSAgTUFLRV9IUl9QQUlSKE1GX0VfVFJBTlNGT1JNX05PVF9QT1NTSUJMRV9GT1JfQ1VSUkVOVF9JTlBVVF9NRURJQVRZUEUpLAotICBNQUtFX0hSX1BBSVIoTUZfRV9UUkFOU0ZPUk1fTk9UX1BPU1NJQkxFX0ZPUl9DVVJSRU5UX01FRElBVFlQRV9DT01CSU5BVElPTiksCi0gIE1BS0VfSFJfUEFJUihNRl9FX1RSQU5TRk9STV9DT05GTElDVFNfV0lUSF9PVEhFUl9DVVJSRU5UTFlfRU5BQkxFRF9GRUFUVVJFUyksCi0gIE1BS0VfSFJfUEFJUihNRl9FX1RSQU5TRk9STV9ORUVEX01PUkVfSU5QVVQpLAotICBNQUtFX0hSX1BBSVIoTUZfRV9UUkFOU0ZPUk1fTk9UX1BPU1NJQkxFX0ZPUl9DVVJSRU5UX1NQS1JfQ09ORklHKSwKLSAgTUFLRV9IUl9QQUlSKE1GX0VfVFJBTlNGT1JNX0NBTk5PVF9DSEFOR0VfTUVESUFUWVBFX1dISUxFX1BST0NFU1NJTkcpLAotICBNQUtFX0hSX1BBSVIoTUZfU19UUkFOU0ZPUk1fRE9fTk9UX1BST1BBR0FURV9FVkVOVCksCi0gIE1BS0VfSFJfUEFJUihNRl9FX1VOU1VQUE9SVEVEX0QzRF9UWVBFKSwKLSAgTUFLRV9IUl9QQUlSKE1GX0VfVFJBTlNGT1JNX0FTWU5DX0xPQ0tFRCksCi0gIE1BS0VfSFJfUEFJUihNRl9FX1RSQU5TRk9STV9DQU5OT1RfSU5JVElBTElaRV9BQ01fRFJJVkVSKSwKLX07Ci0jdW5kZWYgTUFLRV9IUl9QQUlSCi0KLWJvb2wgRmluZEhSZXN1bHRFbnVtU3RyaW5nKEhSRVNVTFQgaHIsIHN0ZDo6c3RyaW5nKiBvdXRwdXQpIHsKLSAgY29uc3Qgc2l6ZV90IG4gPSBzaXplb2Yoa0hyZXN1bHRWYWx1ZVN0cmluZ3MpIC8KLSAgICAgICAgICAgICAgICAgICBzaXplb2YoKmtIcmVzdWx0VmFsdWVTdHJpbmdzKTsKLQotICBmb3IgKGF1dG8gaSA9IDA7IGkgPCBuOyArK2kpIHsKLSAgICBjb25zdCBhdXRvJiBlbGVtcyA9IGtIcmVzdWx0VmFsdWVTdHJpbmdzW2ldOwotICAgIGlmIChociA9PSBlbGVtcy5maXJzdCkgewotICAgICAgKm91dHB1dCA9IGVsZW1zLnNlY29uZDsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLX0KLQotc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IFdpbjMyRXJyb3JDb2RlJiBlcnJvcl9jb2RlKSB7Ci0gIExQV1NUUiBlcnJvcl9tZXNzYWdlOwotICBpbnQgbWVzc2FnZV9zaXplID0gRm9ybWF0TWVzc2FnZSgKLSAgICAgIEZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNIHwgRk9STUFUX01FU1NBR0VfQUxMT0NBVEVfQlVGRkVSIHwKLSAgICAgICAgICBGT1JNQVRfTUVTU0FHRV9JR05PUkVfSU5TRVJUUywKLSAgICAgIG51bGxwdHIsICAvLyBVbnVzZWQgd2l0aCBGT1JNQVRfTUVTU0FHRV9GUk9NX1NZU1RFTS4KLSAgICAgIGVycm9yX2NvZGUuR2V0SFJFU1VMVCgpLCBNQUtFTEFOR0lEKExBTkdfTkVVVFJBTCwgU1VCTEFOR19ERUZBVUxUKSwKLSAgICAgIChMUFRTVFIpJmVycm9yX21lc3NhZ2UsCi0gICAgICAwLCAgLy8gTWluaW11bSBzaXplIGZvciBvdXRwdXQgYnVmZmVyLgotICAgICAgbnVsbHB0cik7Ci0gIFNCX0RDSEVDSyhtZXNzYWdlX3NpemUpOwotICBvcyA8PCB3Y2hhcl90VG9VVEY4KGVycm9yX21lc3NhZ2UpOwotICBMb2NhbEZyZWUoZXJyb3JfbWVzc2FnZSk7Ci0KLSAgcmV0dXJuIG9zOwotfQotCi12b2lkIERlYnVnTG9nV2luRXJyb3IoKSB7Ci0jaWYgZGVmaW5lZChfREVCVUcpCi0gIERXT1JEIGVycm9yX2NvZGUgPSBHZXRMYXN0RXJyb3IoKTsKLSAgaWYgKCFlcnJvcl9jb2RlKQotICAgIHJldHVybjsKLQotICBTQl9MT0coRVJST1IpIDw8IFdpbjMyRXJyb3JDb2RlKGVycm9yX2NvZGUpOwotI2VuZGlmICAvLyBkZWZpbmVkKF9ERUJVRykKLX0KLQotc3RkOjpzdHJpbmcgSFJlc3VsdFRvU3RyaW5nKEhSRVNVTFQgaHIpIHsKLSAgc3RkOjpzdHJpbmcgZW51bV9zdHI7Ci0gIGJvb2wgaGFzX2VudW1fc3RyID0gRmluZEhSZXN1bHRFbnVtU3RyaW5nKGhyLCAmZW51bV9zdHIpOwotICBzdGQ6OnN0cmluZyBlcnJvcl9tZXNzYWdlID0gR2V0Rm9ybWF0SHJlc3VsdE1lc3NhZ2UoaHIpOwotCi0gIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwotICBpZiAoaGFzX2VudW1fc3RyKSB7Ci0gICAgc3MgPDwgZW51bV9zdHIgPDwgIjogIjsKLSAgfQotCi0gIHNzIDw8ICJcIiIgPDwgZXJyb3JfbWVzc2FnZSA8PCAiXCIiOwotICByZXR1cm4gc3Muc3RyKCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB3aW4zMgotfSAgLy8gbmFtZXNwYWNlIHNoYXJlZAotfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZXJyb3JfdXRpbHMuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2Vycm9yX3V0aWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNzYxZDkuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZXJyb3JfdXRpbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLS8vIE5vdCBicmVha2luZyB0aGVzZSBmdW5jdGlvbnMgdXAgYmVjYXVzZSBob3dldmVyIG9uZSBpcyBpbXBsZW1lbnRlZCwgdGhlCi0vLyBvdGhlcnMgc2hvdWxkIGJlIGltcGxlbWVudGVkIHNpbWlsYXJseS4KLQotI2lmbmRlZiBTVEFSQk9BUkRfU0hBUkVEX1dJTjMyX0VSUk9SX1VUSUxTX0hfCi0jZGVmaW5lIFNUQVJCT0FSRF9TSEFSRURfV0lOMzJfRVJST1JfVVRJTFNfSF8KLQotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLQotbmFtZXNwYWNlIHN0YXJib2FyZCB7Ci1uYW1lc3BhY2Ugc2hhcmVkIHsKLW5hbWVzcGFjZSB3aW4zMiB7Ci0KLWNsYXNzIFdpbjMyRXJyb3JDb2RlIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFdpbjMyRXJyb3JDb2RlKERXT1JEIGVycm9yX2NvZGUpIDogZXJyb3JfY29kZV8oZXJyb3JfY29kZSkge30KLQotICBIUkVTVUxUIEdldEhSRVNVTFQoKSBjb25zdCB7IHJldHVybiBIUkVTVUxUX0ZST01fV0lOMzIoZXJyb3JfY29kZV8pOyB9Ci0KLSBwcml2YXRlOgotICBEV09SRCBlcnJvcl9jb2RlXzsKLX07Ci0KLXN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBXaW4zMkVycm9yQ29kZSYgZXJyb3JfY29kZSk7Ci0KLS8vIENoZWNrcyBmb3Igc3lzdGVtIGVycm9ycyBhbmQgbG9ncyBhIGh1bWFuLXJlYWRhYmxlIGVycm9yIGlmIEdldExhc3RFcnJvcigpCi0vLyByZXR1cm5zIGFuIGVycm9yIGNvZGUuIE5vb3BzIG9uIG5vbi1kZWJ1ZyBidWlsZHMuCi12b2lkIERlYnVnTG9nV2luRXJyb3IoKTsKLQotc3RkOjpzdHJpbmcgSFJlc3VsdFRvU3RyaW5nKEhSRVNVTFQgaHIpOwotCi1pbmxpbmUgdm9pZCBDaGVja1Jlc3VsdChIUkVTVUxUIGhyKSB7Ci0gIFNCX0RDSEVDSyhTVUNDRUVERUQoaHIpKSA8PCAiSFJFU1VMVCB3YXMgIiA8PCBzdGQ6OmhleCA8PCBocgotICAgICAgPDwgIiB3aGljaCB0cmFuc2xhdGVzIHRvXG4tLS0+IFwiIiA8PCBIUmVzdWx0VG9TdHJpbmcoaHIpIDw8ICJcIiI7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB3aW4zMgotfSAgLy8gbmFtZXNwYWNlIHNoYXJlZAotfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZAotCi0jZW5kaWYgIC8vIFNUQVJCT0FSRF9TSEFSRURfV0lOMzJfRVJST1JfVVRJTFNfSF8KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2ZpbGVfY2FuX29wZW4uY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX2Nhbl9vcGVuLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGYxOWY2Li4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2ZpbGVfY2FuX29wZW4uY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2ZpbGUuaCIKLQotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvZmlsZV9pbnRlcm5hbC5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvd2NoYXJfdXRpbHMuaCIKLQotYm9vbCBTYkZpbGVDYW5PcGVuKGNvbnN0IGNoYXIqIHBhdGgsIGludCBmbGFncykgewotICBpZiAoKHBhdGggPT0gbnVsbHB0cikgfHwgKHBhdGhbMF0gPT0gJ1wwJykpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBib29sIGNhbl9yZWFkID0gZmxhZ3MgJiBrU2JGaWxlUmVhZDsKLSAgYm9vbCBjYW5fd3JpdGUgPSBmbGFncyAmIGtTYkZpbGVXcml0ZTsKLSAgaWYgKCFjYW5fcmVhZCAmJiAhY2FuX3dyaXRlKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgc3RkOjp3c3RyaW5nIHBhdGhfd3N0cmluZyA9IHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6Q1N0cmluZ1RvV1N0cmluZyhwYXRoKTsKLSAgV0lOMzJfRklORF9EQVRBIGZpbmRfZGF0YSA9IHswfTsKLQotICBIQU5ETEUgc2VhcmNoX2hhbmRsZSA9IEZpbmRGaXJzdEZpbGVFeFcoCi0gICAgICBwYXRoX3dzdHJpbmcuY19zdHIoKSwgRmluZEV4SW5mb1N0YW5kYXJkLCAmZmluZF9kYXRhLAotICAgICAgRmluZEV4U2VhcmNoTmFtZU1hdGNoLCBOVUxMLCBGSU5EX0ZJUlNUX0VYX0NBU0VfU0VOU0lUSVZFKTsKLSAgaWYgKCFzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OklzVmFsaWRIYW5kbGUoc2VhcmNoX2hhbmRsZSkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBib29sIGNhbl9vcGVuID0gdHJ1ZTsKLQotICBpZiAoKChmaW5kX2RhdGEuZHdGaWxlQXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX1JFQURPTkxZKSAmJiBjYW5fd3JpdGUpIHx8Ci0gICAgICAhc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOjpQYXRoRW5kc1dpdGgocGF0aF93c3RyaW5nLCBmaW5kX2RhdGEuY0ZpbGVOYW1lKSkgewotICAgIGNhbl9vcGVuID0gZmFsc2U7Ci0gIH0KLQotICBGaW5kQ2xvc2Uoc2VhcmNoX2hhbmRsZSk7Ci0KLSAgcmV0dXJuIGNhbl9vcGVuOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZmlsZV9jbG9zZS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2ZpbGVfY2xvc2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNDEzNTkuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZmlsZV9jbG9zZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvZmlsZS5oIgotCi0jaW5jbHVkZSA8d2luZG93cy5oPgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9lcnJvcl91dGlscy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvZmlsZV9pbnRlcm5hbC5oIgotCi11c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OkRlYnVnTG9nV2luRXJyb3I7Ci0KLWJvb2wgU2JGaWxlQ2xvc2UoU2JGaWxlIGZpbGUpIHsKLSAgaWYgKCFTYkZpbGVJc1ZhbGlkKGZpbGUpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgYm9vbCBzdWNjZXNzID0gQ2xvc2VIYW5kbGUoZmlsZS0+ZmlsZV9oYW5kbGUpOwotCi0gIGlmICghc3VjY2VzcykgewotICAgIERlYnVnTG9nV2luRXJyb3IoKTsKLSAgfQotCi0gIGRlbGV0ZSBmaWxlOwotCi0gIHJldHVybiBzdWNjZXNzOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZmlsZV9kZWxldGUuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX2RlbGV0ZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZmYTIxYy4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX2RlbGV0ZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvZmlsZS5oIgotCi0jaW5jbHVkZSA8d2luZG93cy5oPgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX2ludGVybmFsLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi93Y2hhcl91dGlscy5oIgotCi1ib29sIFNiRmlsZURlbGV0ZShjb25zdCBjaGFyKiBwYXRoKSB7Ci0gIHVzaW5nIHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6Q1N0cmluZ1RvV1N0cmluZzsKLSAgdXNpbmcgc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOjpOb3JtYWxpemVXaW4zMlBhdGg7Ci0KLSAgaWYgKChwYXRoID09IG51bGxwdHIpIHx8ICpwYXRoID09ICdcMCcpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoIVNiRmlsZUV4aXN0cyhwYXRoKSkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgc3RkOjp3c3RyaW5nIHBhdGhfd3N0cmluZyA9IE5vcm1hbGl6ZVdpbjMyUGF0aChwYXRoKTsKLQotICAvLyBSZW1vdmUgZmlsZSBvciBlbXB0eSBkaXJlY3RvcnkuCi0gIHJldHVybiBEZWxldGVGaWxlVyhwYXRoX3dzdHJpbmcuY19zdHIoKSkgfHwKLSAgICAgICAgIFJlbW92ZURpcmVjdG9yeVcocGF0aF93c3RyaW5nLmNfc3RyKCkpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZmlsZV9leGlzdHMuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX2V4aXN0cy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc1N2NiMi4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX2V4aXN0cy5jYworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvZmlsZS5oIgotCi0jaW5jbHVkZSA8d2luZG93cy5oPgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX2ludGVybmFsLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi93Y2hhcl91dGlscy5oIgotCi1ib29sIFNiRmlsZUV4aXN0cyhjb25zdCBjaGFyKiBwYXRoKSB7Ci0gIHVzaW5nIHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6Q1N0cmluZ1RvV1N0cmluZzsKLSAgdXNpbmcgc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOjpJc1ZhbGlkSGFuZGxlOwotICB1c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6Ok5vcm1hbGl6ZVdpbjMyUGF0aDsKLSAgdXNpbmcgc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOjpQYXRoRW5kc1dpdGg7Ci0KLSAgaWYgKChwYXRoID09IG51bGxwdHIpIHx8IChwYXRoWzBdID09ICdcMCcpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgc3RkOjp3c3RyaW5nIHBhdGhfd3N0cmluZyA9IE5vcm1hbGl6ZVdpbjMyUGF0aChwYXRoKTsKLSAgLy8gV2luMzIgZG9lcyBub3QgbGlrZSBhIHRyYWlsaW5nICJcXCIgb24gdGhlIHBhdGggbmFtZXMgZm9yIGRpcmVjdG9yaWVzLAotICAvLyBzbyBpdCdzIG5lZWRzIHRvIGJlIGNob3BwZWQgb2ZmLgotICBpZiAoIXBhdGhfd3N0cmluZy5lbXB0eSgpICYmIChwYXRoX3dzdHJpbmcuYmFjaygpID09ICdcXCcpKSB7Ci0gICAgcGF0aF93c3RyaW5nLnBvcF9iYWNrKCk7Ci0gIH0KLQotICBXSU4zMl9GSU5EX0RBVEEgZmluZF9kYXRhID0gezB9OwotCi0gIEhBTkRMRSBzZWFyY2hfaGFuZGxlID0gRmluZEZpcnN0RmlsZUV4VygKLSAgICAgIHBhdGhfd3N0cmluZy5jX3N0cigpLCBGaW5kRXhJbmZvU3RhbmRhcmQsICZmaW5kX2RhdGEsCi0gICAgICBGaW5kRXhTZWFyY2hOYW1lTWF0Y2gsIE5VTEwsIEZJTkRfRklSU1RfRVhfQ0FTRV9TRU5TSVRJVkUpOwotCi0gIGlmICghSXNWYWxpZEhhbmRsZShzZWFyY2hfaGFuZGxlKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIEZpbmRDbG9zZShzZWFyY2hfaGFuZGxlKTsKLQotICByZXR1cm4gUGF0aEVuZHNXaXRoKHBhdGhfd3N0cmluZywgZmluZF9kYXRhLmNGaWxlTmFtZSk7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX2ZsdXNoLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZmlsZV9mbHVzaC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM5NjU1Yy4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX2ZsdXNoLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9maWxlLmgiCi0KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX2ludGVybmFsLmgiCi0KLWJvb2wgU2JGaWxlRmx1c2goU2JGaWxlIGZpbGUpIHsKLSAgaWYgKCFzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6Okhhc1ZhbGlkSGFuZGxlKGZpbGUpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIEZsdXNoRmlsZUJ1ZmZlcnMoZmlsZS0+ZmlsZV9oYW5kbGUpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZmlsZV9nZXRfaW5mby5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2ZpbGVfZ2V0X2luZm8uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMjU3NTMuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZmlsZV9nZXRfaW5mby5jYworKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvZmlsZS5oIgotCi0jaW5jbHVkZSA8d2luZG93cy5oPgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvZmlsZV9pbnRlcm5hbC5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvdGltZV91dGlscy5oIgotCi1ib29sIFNiRmlsZUdldEluZm8oU2JGaWxlIGZpbGUsIFNiRmlsZUluZm8qIG91dF9pbmZvKSB7Ci0gIGlmICghc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOjpIYXNWYWxpZEhhbmRsZShmaWxlKSB8fCAhb3V0X2luZm8pIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBGSUxFX0JBU0lDX0lORk8gYmFzaWNfaW5mbyA9IHswfTsKLSAgQk9PTCBiYXNpY19pbmZvX3N1Y2Nlc3MgPSBHZXRGaWxlSW5mb3JtYXRpb25CeUhhbmRsZUV4KAotICAgICAgZmlsZS0+ZmlsZV9oYW5kbGUsIEZpbGVCYXNpY0luZm8sICZiYXNpY19pbmZvLCBzaXplb2YoRklMRV9CQVNJQ19JTkZPKSk7Ci0gIGlmICghYmFzaWNfaW5mb19zdWNjZXNzKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgRklMRV9TVEFOREFSRF9JTkZPIHN0YW5kYXJkX2luZm8gPSB7MH07Ci0gIEJPT0wgc3RhbmRhcmRfaW5mb19zdWNjZXNzID0KLSAgICAgIEdldEZpbGVJbmZvcm1hdGlvbkJ5SGFuZGxlRXgoZmlsZS0+ZmlsZV9oYW5kbGUsIEZpbGVTdGFuZGFyZEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFuZGFyZF9pbmZvLCBzaXplb2YoRklMRV9TVEFOREFSRF9JTkZPKSk7Ci0gIGlmICghc3RhbmRhcmRfaW5mb19zdWNjZXNzKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgb3V0X2luZm8tPnNpemUgPSBzdGFuZGFyZF9pbmZvLkVuZE9mRmlsZS5RdWFkUGFydDsKLSAgU0JfRENIRUNLKG91dF9pbmZvLT5zaXplID49IDApOwotCi0gIHVzaW5nIHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6Q29udmVydEZpbGVUaW1lVGlja3NUb1NiVGltZTsKLQotICBvdXRfaW5mby0+Y3JlYXRpb25fdGltZSA9Ci0gICAgICBDb252ZXJ0RmlsZVRpbWVUaWNrc1RvU2JUaW1lKGJhc2ljX2luZm8uQ3JlYXRpb25UaW1lKTsKLSAgb3V0X2luZm8tPmxhc3RfYWNjZXNzZWQgPQotICAgICAgQ29udmVydEZpbGVUaW1lVGlja3NUb1NiVGltZShiYXNpY19pbmZvLkxhc3RBY2Nlc3NUaW1lKTsKLSAgb3V0X2luZm8tPmxhc3RfbW9kaWZpZWQgPQotICAgICAgQ29udmVydEZpbGVUaW1lVGlja3NUb1NiVGltZShiYXNpY19pbmZvLkxhc3RXcml0ZVRpbWUpOwotCi0gIG91dF9pbmZvLT5pc19zeW1ib2xpY19saW5rID0gZmFsc2U7Ci0gIG91dF9pbmZvLT5pc19kaXJlY3RvcnkgPSBzdGFuZGFyZF9pbmZvLkRpcmVjdG9yeTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2ZpbGVfZ2V0X3BhdGhfaW5mby5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2ZpbGVfZ2V0X3BhdGhfaW5mby5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRlMDA3MS4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX2dldF9wYXRoX2luZm8uY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9maWxlLmgiCi0KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX2ludGVybmFsLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aW1lX3V0aWxzLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi93Y2hhcl91dGlscy5oIgotCi1uYW1lc3BhY2UgewotCi1ib29sIElzRHJpdmVMZXR0ZXIod2NoYXJfdCBkcml2ZV9sZXR0ZXIpIHsKLSAgaWYgKEwnQScgPD0gZHJpdmVfbGV0dGVyICYmIGRyaXZlX2xldHRlciA8PSAnWicpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGlmIChMJ2EnIDw9IGRyaXZlX2xldHRlciAmJiBkcml2ZV9sZXR0ZXIgPD0gJ3onKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIElzUm9vdERpcmVjdG9yeShzdGQ6OndzdHJpbmcgd3BhdGgpIHsKLSAgaWYgKHdwYXRoLmxlbmd0aCgpID4gMykgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIFN0cmlwIG9wdGlvbmFsIHRyYWlsaW5nIHNsYXNoLgotICBpZiAod3BhdGgubGVuZ3RoKCkgPT0gMykgewotICAgIGlmICh3cGF0aC5iYWNrKCkgIT0gTCdcXCcpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgd3BhdGgucG9wX2JhY2soKTsKLSAgfQotCi0gIGlmICh3cGF0aC5sZW5ndGgoKSA9PSAyKSB7Ci0gICAgaWYgKElzRHJpdmVMZXR0ZXIod3BhdGhbMF0pICYmIHdwYXRoWzFdID09ICc6JykgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLWJvb2wgU2JGaWxlR2V0UGF0aEluZm8oY29uc3QgY2hhciogcGF0aCwgU2JGaWxlSW5mbyogb3V0X2luZm8pIHsKLSAgdXNpbmcgc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOjpDU3RyaW5nVG9XU3RyaW5nOwotICB1c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6Ok5vcm1hbGl6ZVdpbjMyUGF0aDsKLQotICBpZiAoIXBhdGggfHwgcGF0aFswXSA9PSAnXDAnIHx8ICFvdXRfaW5mbykgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHN0ZDo6d3N0cmluZyBwYXRoX3dzdHJpbmcgPSBOb3JtYWxpemVXaW4zMlBhdGgocGF0aCk7Ci0KLSAgLy8gR2V0RmlsZUF0dHJpYnV0ZXNFeFcoLi4uKSBkb2VzIG5vdCBoYW5kbGUgcm9vdCBkaXJlY3RvcmllcwotICAvLyB3ZSB3ZSBoYXZlIHRvIGhhbmRsZSBpdCBoZXJlLgotICBpZiAoSXNSb290RGlyZWN0b3J5KHBhdGhfd3N0cmluZykpIHsKLSAgICBvdXRfaW5mby0+aXNfZGlyZWN0b3J5ID0gdHJ1ZTsKLSAgICBvdXRfaW5mby0+bGFzdF9tb2RpZmllZCA9IDA7Ci0gICAgb3V0X2luZm8tPmxhc3RfYWNjZXNzZWQgPSAwOwotICAgIG91dF9pbmZvLT5jcmVhdGlvbl90aW1lID0gMDsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIFdJTjMyX0ZJTEVfQVRUUklCVVRFX0RBVEEgYXR0cmlidXRlX2RhdGEgPSB7MH07Ci0gIGlmICghR2V0RmlsZUF0dHJpYnV0ZXNFeFcocGF0aF93c3RyaW5nLmNfc3RyKCksIEdldEZpbGVFeEluZm9TdGFuZGFyZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlX2RhdGEpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgb3V0X2luZm8tPnNpemUgPSBzdGF0aWNfY2FzdDxpbnQ2NF90PihhdHRyaWJ1dGVfZGF0YS5uRmlsZVNpemVIaWdoKSA8PCAzMiB8Ci0gICAgICAgICAgICAgICAgICAgYXR0cmlidXRlX2RhdGEubkZpbGVTaXplTG93OwotICBTQl9EQ0hFQ0sob3V0X2luZm8tPnNpemUgPj0gMCk7Ci0KLSAgdXNpbmcgc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOjpDb252ZXJ0RmlsZVRpbWVUb1NiVGltZTsKLQotICBvdXRfaW5mby0+Y3JlYXRpb25fdGltZSA9Ci0gICAgICBDb252ZXJ0RmlsZVRpbWVUb1NiVGltZShhdHRyaWJ1dGVfZGF0YS5mdENyZWF0aW9uVGltZSk7Ci0gIG91dF9pbmZvLT5sYXN0X2FjY2Vzc2VkID0KLSAgICAgIENvbnZlcnRGaWxlVGltZVRvU2JUaW1lKGF0dHJpYnV0ZV9kYXRhLmZ0TGFzdEFjY2Vzc1RpbWUpOwotICBvdXRfaW5mby0+bGFzdF9tb2RpZmllZCA9Ci0gICAgICBDb252ZXJ0RmlsZVRpbWVUb1NiVGltZShhdHRyaWJ1dGVfZGF0YS5mdExhc3RXcml0ZVRpbWUpOwotCi0gIG91dF9pbmZvLT5pc19zeW1ib2xpY19saW5rID0gZmFsc2U7Ci0gIG91dF9pbmZvLT5pc19kaXJlY3RvcnkgPQotICAgICAgKGF0dHJpYnV0ZV9kYXRhLmR3RmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpOwotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZmlsZV9pbnRlcm5hbC5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2ZpbGVfaW50ZXJuYWwuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMjY0MWIuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZmlsZV9pbnRlcm5hbC5jYworKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX2ludGVybmFsLmgiCi0KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvZXJyb3JfdXRpbHMuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3djaGFyX3V0aWxzLmgiCi0KLW5hbWVzcGFjZSBzYndpbjMyID0gc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOwotCi1uYW1lc3BhY2Ugc3RhcmJvYXJkIHsKLW5hbWVzcGFjZSBzaGFyZWQgewotbmFtZXNwYWNlIHdpbjMyIHsKLQotbmFtZXNwYWNlIHsKLWNvbnN0IGNoYXIga1VuaXhTZXBbXSA9ICIvIjsKLWNvbnN0IGNoYXIga1dpbjMyU2VwW10gPSAiXFwiOwotY29uc3Qgd2NoYXJfdCBrVW5peFNlcFdbXSA9IEwiLyI7Ci1jb25zdCB3Y2hhcl90IGtXaW4zMlNlcFdbXSA9IEwiXFwiOwotCi1ib29sIElzUGF0aE5vcm1hbGl6ZWQoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cmluZykgewotICByZXR1cm4gc3RyaW5nLmZpbmQoa1VuaXhTZXApID09IHN0ZDo6c3RyaW5nOjpucG9zOwotfQotCi1ib29sIElzUGF0aE5vcm1hbGl6ZWQoY29uc3Qgc3RkOjp3c3RyaW5nJiBzdHJpbmcpIHsKLSAgcmV0dXJuIHN0cmluZy5maW5kKGtVbml4U2VwVykgPT0gc3RkOjp3c3RyaW5nOjpucG9zOwotfQotCi1zdGQ6OnN0cmluZyBOb3JtYWxpemVQYXRoU2VwYXJhdG9yKHN0ZDo6c3RyaW5nIHN0cikgewotICBzaXplX3Qgc3RhcnRfcG9zID0gMDsKLSAgd2hpbGUgKChzdGFydF9wb3MgPSBzdHIuZmluZChrVW5peFNlcCwgc3RhcnRfcG9zKSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICBzdHIucmVwbGFjZShzdGFydF9wb3MsIHNpemVvZihrVW5peFNlcCkgLSAxLCBrV2luMzJTZXApOwotICAgIHN0YXJ0X3BvcyArPSBzaXplb2Yoa1dpbjMyU2VwKSAtIDE7Ci0gIH0KLSAgcmV0dXJuIHN0cjsKLX0KLQotc3RkOjp3c3RyaW5nIE5vcm1hbGl6ZVBhdGhTZXBhcmF0b3Ioc3RkOjp3c3RyaW5nIHN0cikgewotICBzaXplX3Qgc3RhcnRfcG9zID0gMDsKLSAgd2hpbGUgKChzdGFydF9wb3MgPSBzdHIuZmluZChrVW5peFNlcFcsIHN0YXJ0X3BvcykpICE9IHN0ZDo6d3N0cmluZzo6bnBvcykgewotICAgIHN0ci5yZXBsYWNlKHN0YXJ0X3Bvcywgc2l6ZW9mKGtVbml4U2VwVykgLyAyIC0gMSwga1dpbjMyU2VwVyk7Ci0gICAgc3RhcnRfcG9zICs9IHNpemVvZihrV2luMzJTZXBXKSAvIDIgLSAxOwotICB9Ci0gIHJldHVybiBzdHI7Ci19Ci0KLWJvb2wgU3RyaW5nQ2FuTmFycm93KGNvbnN0IHN0ZDo6d3N0cmluZyYgc3RyKSB7Ci0gIGZvciAod2NoYXJfdCB2YWx1ZSA6IHN0cikgewotICAgIGNoYXIgbmFycm93X3ZhbCA9IHN0YXRpY19jYXN0PGNoYXI+KHZhbHVlKTsKLSAgICBpZiAodmFsdWUgIT0gbmFycm93X3ZhbCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLXN0ZDo6d3N0cmluZyBOb3JtYWxpemVXaW4zMlBhdGgoc3RkOjpzdHJpbmcgc3RyKSB7Ci0gIHJldHVybiBOb3JtYWxpemVXaW4zMlBhdGgoQ1N0cmluZ1RvV1N0cmluZyhzdHIuY19zdHIoKSkpOwotfQotCi1zdGQ6OndzdHJpbmcgTm9ybWFsaXplV2luMzJQYXRoKHN0ZDo6d3N0cmluZyBzdHIpIHsKLSAgcmV0dXJuIE5vcm1hbGl6ZVBhdGhTZXBhcmF0b3Ioc3RyKTsKLX0KLQotSEFORExFIE9wZW5GaWxlT3JEaXJlY3RvcnkoY29uc3QgY2hhciogcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIG91dF9jcmVhdGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JGaWxlRXJyb3IqIG91dF9lcnJvcikgewotICBjb25zdCBEV09SRCBzaGFyZV9tb2RlID0gRklMRV9TSEFSRV9SRUFEIHwgRklMRV9TSEFSRV9XUklURTsKLQotICBEV09SRCBjcmVhdGlvbl9kaXNwb3NpdGlvbiA9IDA7Ci0gIGlmIChmbGFncyAmIGtTYkZpbGVDcmVhdGVPbmx5KSB7Ci0gICAgU0JfRENIRUNLKCFjcmVhdGlvbl9kaXNwb3NpdGlvbik7Ci0gICAgU0JfRENIRUNLKCEoZmxhZ3MgJiBrU2JGaWxlQ3JlYXRlQWx3YXlzKSk7Ci0gICAgY3JlYXRpb25fZGlzcG9zaXRpb24gPSBDUkVBVEVfTkVXOwotICB9Ci0KLSAgaWYgKG91dF9jcmVhdGVkKSB7Ci0gICAgKm91dF9jcmVhdGVkID0gZmFsc2U7Ci0gIH0KLQotICBpZiAoZmxhZ3MgJiBrU2JGaWxlQ3JlYXRlQWx3YXlzKSB7Ci0gICAgU0JfRENIRUNLKCFjcmVhdGlvbl9kaXNwb3NpdGlvbik7Ci0gICAgU0JfRENIRUNLKCEoZmxhZ3MgJiBrU2JGaWxlQ3JlYXRlT25seSkpOwotICAgIGNyZWF0aW9uX2Rpc3Bvc2l0aW9uID0gQ1JFQVRFX0FMV0FZUzsKLSAgfQotCi0gIGlmIChmbGFncyAmIGtTYkZpbGVPcGVuVHJ1bmNhdGVkKSB7Ci0gICAgU0JfRENIRUNLKCFjcmVhdGlvbl9kaXNwb3NpdGlvbik7Ci0gICAgU0JfRENIRUNLKGZsYWdzICYga1NiRmlsZVdyaXRlKTsKLSAgICBjcmVhdGlvbl9kaXNwb3NpdGlvbiA9IFRSVU5DQVRFX0VYSVNUSU5HOwotICB9Ci0KLSAgaWYgKGZsYWdzICYga1NiRmlsZU9wZW5Pbmx5KSB7Ci0gICAgU0JfRENIRUNLKCEoZmxhZ3MgJiBrU2JGaWxlT3BlbkFsd2F5cykpOwotICAgIGNyZWF0aW9uX2Rpc3Bvc2l0aW9uID0gT1BFTl9FWElTVElORzsKLSAgfQotCi0gIGlmIChmbGFncyAmIGtTYkZpbGVPcGVuQWx3YXlzKSB7Ci0gICAgU0JfRENIRUNLKCEoZmxhZ3MgJiBrU2JGaWxlT3Blbk9ubHkpKTsKLSAgICBjcmVhdGlvbl9kaXNwb3NpdGlvbiA9IE9QRU5fQUxXQVlTOwotICB9Ci0KLSAgaWYgKCFjcmVhdGlvbl9kaXNwb3NpdGlvbiAmJiAhKGZsYWdzICYga1NiRmlsZU9wZW5Pbmx5KSAmJgotICAgICAgIShmbGFncyAmIGtTYkZpbGVPcGVuQWx3YXlzKSkgewotICAgIFNCX05PVFJFQUNIRUQoKTsKLSAgICBlcnJubyA9IEVOT1RTVVA7Ci0gICAgaWYgKG91dF9lcnJvcikgewotICAgICAgKm91dF9lcnJvciA9IGtTYkZpbGVFcnJvckZhaWxlZDsKLSAgICB9Ci0KLSAgICByZXR1cm4ga1NiRmlsZUludmFsaWQ7Ci0gIH0KLQotICBEV09SRCBkZXNpcmVkX2FjY2VzcyA9IDA7Ci0gIGlmIChmbGFncyAmIGtTYkZpbGVSZWFkKSB7Ci0gICAgZGVzaXJlZF9hY2Nlc3MgfD0gR0VORVJJQ19SRUFEOwotICB9Ci0KLSAgY29uc3QgYm9vbCBvcGVuX2ZpbGVfaW5fd3JpdGVfbW9kZSA9IGZsYWdzICYga1NiRmlsZVdyaXRlOwotICBpZiAob3Blbl9maWxlX2luX3dyaXRlX21vZGUpIHsKLSAgICBkZXNpcmVkX2FjY2VzcyB8PSBHRU5FUklDX1dSSVRFOwotICB9Ci0KLSAgLy8gVE9ETzogU3VwcG9ydCBhc3luY2hyb25vdXMgSU8sIGlmIG5lY2Vzc2FyeS4KLSAgU0JfRENIRUNLKCEoZmxhZ3MgJiBrU2JGaWxlQXN5bmMpKTsKLQotICBTQl9EQ0hFQ0soZGVzaXJlZF9hY2Nlc3MgIT0gMCkgPDwgIkludmFsaWQgcGVybWlzc2lvbiBmbGFnLiI7Ci0KLSAgc3RkOjp3c3RyaW5nIHBhdGhfd3N0cmluZyA9IE5vcm1hbGl6ZVdpbjMyUGF0aChwYXRoKTsKLQotICBDUkVBVEVGSUxFMl9FWFRFTkRFRF9QQVJBTUVURVJTIGNyZWF0ZV9leF9wYXJhbXMgPSB7MH07Ci0gIC8vIEVuYWJsaW5nIHxGSUxFX0ZMQUdfQkFDS1VQX1NFTUFOVElDU3wgYWxsb3dzIHVzIHRvIGZpZ3VyZSBvdXQgaWYgdGhlIHBhdGgKLSAgLy8gaXMgYSBkaXJlY3RvcnkuCi0gIGNyZWF0ZV9leF9wYXJhbXMuZHdGaWxlRmxhZ3MgPSBGSUxFX0ZMQUdfQkFDS1VQX1NFTUFOVElDUzsKLSAgY3JlYXRlX2V4X3BhcmFtcy5kd0ZpbGVGbGFncyB8PSBGSUxFX0ZMQUdfUE9TSVhfU0VNQU5USUNTOwotICBjcmVhdGVfZXhfcGFyYW1zLmR3RmlsZUF0dHJpYnV0ZXMgPSBGSUxFX0FUVFJJQlVURV9OT1JNQUw7Ci0gIGNyZWF0ZV9leF9wYXJhbXMuZHdTZWN1cml0eVFvc0ZsYWdzID0gU0VDVVJJVFlfQU5PTllNT1VTOwotICBjcmVhdGVfZXhfcGFyYW1zLmR3U2l6ZSA9IHNpemVvZihDUkVBVEVGSUxFMl9FWFRFTkRFRF9QQVJBTUVURVJTKTsKLQotICBjb25zdCBib29sIGZpbGVfZXhpc3RzX3ByaW9yX3RvX29wZW4gPSBTYkZpbGVFeGlzdHMocGF0aCk7Ci0KLSAgSEFORExFIGZpbGVfaGFuZGxlID0KLSAgICAgIENyZWF0ZUZpbGUyKHBhdGhfd3N0cmluZy5jX3N0cigpLCBkZXNpcmVkX2FjY2Vzcywgc2hhcmVfbW9kZSwKLSAgICAgICAgICAgICAgICAgIGNyZWF0aW9uX2Rpc3Bvc2l0aW9uLCAmY3JlYXRlX2V4X3BhcmFtcyk7Ci0KLSAgY29uc3QgYm9vbCBmaWxlX2V4aXN0c19hZnRlcl9vcGVuID0gU2JGaWxlRXhpc3RzKHBhdGgpOwotCi0gIGlmIChvdXRfY3JlYXRlZCAmJiBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OklzVmFsaWRIYW5kbGUoZmlsZV9oYW5kbGUpKSB7Ci0gICAgaWYgKGZsYWdzICYga1NiRmlsZUNyZWF0ZUFsd2F5cykgewotICAgICAgKm91dF9jcmVhdGVkID0gZmlsZV9leGlzdHNfYWZ0ZXJfb3BlbjsKLSAgICB9IGVsc2UgewotICAgICAgKm91dF9jcmVhdGVkID0gKCFmaWxlX2V4aXN0c19wcmlvcl90b19vcGVuICYmIGZpbGVfZXhpc3RzX2FmdGVyX29wZW4pOwotICAgIH0KLSAgfQotCi0gIGNvbnN0IERXT1JEIGxhc3RfZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKLQotICBpZiAob3V0X2Vycm9yKSB7Ci0gICAgaWYgKHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6SXNWYWxpZEhhbmRsZShmaWxlX2hhbmRsZSkpIHsKLSAgICAgICpvdXRfZXJyb3IgPSBrU2JGaWxlT2s7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHN3aXRjaCAobGFzdF9lcnJvcikgewotICAgICAgICBjYXNlIEVSUk9SX0FDQ0VTU19ERU5JRUQ6Ci0gICAgICAgICAgKm91dF9lcnJvciA9IGtTYkZpbGVFcnJvckFjY2Vzc0RlbmllZDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFUlJPUl9GSUxFX0VYSVNUUzogewotICAgICAgICAgIGlmIChmbGFncyAmIGtTYkZpbGVDcmVhdGVPbmx5KSB7Ci0gICAgICAgICAgICAqb3V0X2Vycm9yID0ga1NiRmlsZUVycm9yRXhpc3RzOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAqb3V0X2Vycm9yID0ga1NiRmlsZUVycm9yQWNjZXNzRGVuaWVkOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEVSUk9SX0ZJTEVfTk9UX0ZPVU5EOgotICAgICAgICAgICpvdXRfZXJyb3IgPSBrU2JGaWxlRXJyb3JOb3RGb3VuZDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAqb3V0X2Vycm9yID0ga1NiRmlsZUVycm9yRmFpbGVkOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHJldHVybiBmaWxlX2hhbmRsZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHdpbjMyCi19ICAvLyBuYW1lc3BhY2Ugc2hhcmVkCi19ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX2ludGVybmFsLmggYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX2ludGVybmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkODcyZTIuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZmlsZV9pbnRlcm5hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBTVEFSQk9BUkRfU0hBUkVEX1dJTjMyX0ZJTEVfSU5URVJOQUxfSF8KLSNkZWZpbmUgU1RBUkJPQVJEX1NIQVJFRF9XSU4zMl9GSUxFX0lOVEVSTkFMX0hfCi0KLSNpbmNsdWRlIDx3dHlwZXMuaD4KLQotI2luY2x1ZGUgPGN3Y2hhcj4gIC8vIFRoaXMgZmlsZSBpbmNsdWRlZCBmb3Igc3RkOjp3Y3NsZW4uCi0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2ZpbGUuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL2ludGVybmFsX29ubHkuaCIKLQotbmFtZXNwYWNlIHN0YXJib2FyZCB7Ci1uYW1lc3BhY2Ugc2hhcmVkIHsKLW5hbWVzcGFjZSB3aW4zMiB7Ci0KLWlubGluZSBib29sIElzVmFsaWRIYW5kbGUoSEFORExFIGhhbmRsZSkgewotICByZXR1cm4gaGFuZGxlICE9IElOVkFMSURfSEFORExFX1ZBTFVFOwotfQotCi19ICAvLyBuYW1lc3BhY2Ugd2luMzIKLX0gIC8vIG5hbWVzcGFjZSBzaGFyZWQKLX0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKLQotI3ByYWdtYSB3YXJuaW5nKHB1c2gpCi0KLS8vIFNiRmlsZVByaXZhdGUgaXMgZGVmaW5lZCBhcyBhIHN0cnVjdCwgYnV0IGZvciB3aW5kb3dzIGltcGxlbWVudGF0aW9uCi0vLyBlbm91Z2ggZnVuY3Rpb25hbGl0eSBoYXMgYmVlbiBhZGRlZCBzbyB0aGF0IGl0IHdhcnJhbnRzIGJlaW5nIGEgY2xhc3MKLS8vIHBlciBHb29nbGUncyBDKysgc3R5bGUgZ3VpZGUuICBUaGlzIG1pc21hdGNoIGNhdXNlcyB0aGUgTWljcm9zb2Z0J3MgY29tcGlsZXIKLS8vIHRvIGdlbmVyYXRlIGEgd2FybmluZy4KLSNwcmFnbWEgd2FybmluZyhkaXNhYmxlIDogNDA5OSkKLQotY2xhc3MgU2JGaWxlUHJpdmF0ZSB7Ci0gcHVibGljOgotICBleHBsaWNpdCBTYkZpbGVQcml2YXRlKEhBTkRMRSBoYW5kbGUpIDogZmlsZV9oYW5kbGUoaGFuZGxlKSB7fQotCi0gIGJvb2wgSGFzVmFsaWRIYW5kbGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6SXNWYWxpZEhhbmRsZShmaWxlX2hhbmRsZSk7Ci0gIH0KLQotICBIQU5ETEUgZmlsZV9oYW5kbGU7Ci0KLSAgLy8gU2JGaWxlUHJpdmF0ZSBpcyBuZWl0aGVyIGNvcHlhYmxlIG5vciBtb3ZhYmxlLgotICBTYkZpbGVQcml2YXRlKGNvbnN0IFNiRmlsZVByaXZhdGUmKSA9IGRlbGV0ZTsKLSAgU2JGaWxlUHJpdmF0ZSYgb3BlcmF0b3I9KGNvbnN0IFNiRmlsZVByaXZhdGUmKSA9IGRlbGV0ZTsKLX07Ci0jcHJhZ21hIHdhcm5pbmcocG9wKQotCi1uYW1lc3BhY2Ugc3RhcmJvYXJkIHsKLW5hbWVzcGFjZSBzaGFyZWQgewotbmFtZXNwYWNlIHdpbjMyIHsKLQotaW5saW5lIGJvb2wgSGFzVmFsaWRIYW5kbGUoU2JGaWxlIGZpbGUpIHsKLSAgaWYgKCFTYkZpbGVJc1ZhbGlkKGZpbGUpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIGZpbGUtPkhhc1ZhbGlkSGFuZGxlKCk7Ci19Ci0KLWlubGluZSBib29sIFBhdGhFbmRzV2l0aChjb25zdCBzdGQ6OndzdHJpbmcmIHBhdGgsIGNvbnN0IHdjaGFyX3QqIGZpbGVuYW1lKSB7Ci0gIHNpemVfdCBmaWxlbmFtZV9sZW5ndGggPSBzdGQ6Ondjc2xlbihmaWxlbmFtZSk7Ci0gIGlmIChmaWxlbmFtZV9sZW5ndGggPiBwYXRoLnNpemUoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHNpemVfdCBwYXRoX29mZnNldCA9IHBhdGguc2l6ZSgpIC0gZmlsZW5hbWVfbGVuZ3RoOwotCi0gIHJldHVybiB3Y3NjbXAocGF0aC5jX3N0cigpICsgcGF0aF9vZmZzZXQsIGZpbGVuYW1lKSA9PSAwOwotfQotCi0vLyBQYXRoJ3MgZnJvbSBjb2JhbHQgdXNlICIvIiBhcyBhIHBhdGggc2VwYXJhdG9yLiBUaGlzIGZ1bmN0aW9uIHdpbGwKLS8vIHJlcGxhY2UgYWxsIG9mIHRoZSAiLyIgd2l0aCAiXCIuCi1zdGQ6OndzdHJpbmcgTm9ybWFsaXplV2luMzJQYXRoKHN0ZDo6c3RyaW5nIHN0cik7Ci1zdGQ6OndzdHJpbmcgTm9ybWFsaXplV2luMzJQYXRoKHN0ZDo6d3N0cmluZyBzdHIpOwotCi1IQU5ETEUgT3BlbkZpbGVPckRpcmVjdG9yeShjb25zdCBjaGFyKiBwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogb3V0X2NyZWF0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTYkZpbGVFcnJvciogb3V0X2Vycm9yKTsKLQotfSAgLy8gbmFtZXNwYWNlIHdpbjMyCi19ICAvLyBuYW1lc3BhY2Ugc2hhcmVkCi19ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCi0KLSNlbmRpZiAgLy8gU1RBUkJPQVJEX1NIQVJFRF9XSU4zMl9GSUxFX0lOVEVSTkFMX0hfCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX29wZW4uY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX29wZW4uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NDA3YzUuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZmlsZV9vcGVuLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9maWxlLmgiCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2ZpbGVfaW50ZXJuYWwuaCIKLQotU2JGaWxlIFNiRmlsZU9wZW4oY29uc3QgY2hhciogcGF0aCwKLSAgICAgICAgICAgICAgICAgIGludCBmbGFncywKLSAgICAgICAgICAgICAgICAgIGJvb2wqIG91dF9jcmVhdGVkLAotICAgICAgICAgICAgICAgICAgU2JGaWxlRXJyb3IqIG91dF9lcnJvcikgewotICBpZiAoKHBhdGggPT0gbnVsbHB0cikgfHwgKHBhdGhbMF0gPT0gJ1wwJykpIHsKLSAgICBpZiAob3V0X2NyZWF0ZWQpIHsKLSAgICAgICpvdXRfY3JlYXRlZCA9IGZhbHNlOwotICAgIH0KLSAgICBpZiAob3V0X2Vycm9yKSB7Ci0gICAgICAqb3V0X2Vycm9yID0ga1NiRmlsZUVycm9yTm90QUZpbGU7Ci0gICAgfQotICAgIHJldHVybiBrU2JGaWxlSW52YWxpZDsKLSAgfQotCi0gIEhBTkRMRSBmaWxlX2hhbmRsZSA9Ci0gICAgICBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6Ok9wZW5GaWxlT3JEaXJlY3RvcnkocGF0aCwgZmxhZ3MsIG91dF9jcmVhdGVkLCBvdXRfZXJyb3IpOwotCi0gIGlmICghc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOjpJc1ZhbGlkSGFuZGxlKGZpbGVfaGFuZGxlKSkgewotICAgIHJldHVybiBrU2JGaWxlSW52YWxpZDsKLSAgfQotCi0gIHJldHVybiBuZXcgU2JGaWxlUHJpdmF0ZShmaWxlX2hhbmRsZSk7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX3JlYWQuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX3JlYWQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyZTZkYjguLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZmlsZV9yZWFkLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9maWxlLmgiCi0KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX2ludGVybmFsLmgiCi0KLWludCBTYkZpbGVSZWFkKFNiRmlsZSBmaWxlLCBjaGFyKiBkYXRhLCBpbnQgc2l6ZSkgewotICBTQl9EQ0hFQ0soKHNpemUgPT0gMCkgfHwgKGRhdGEgIT0gbnVsbHB0cikpOwotCi0gIGlmICghc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOjpIYXNWYWxpZEhhbmRsZShmaWxlKSkgewotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIGlmIChzaXplIDwgMCkgewotICAgIFNCX05PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0gZWxzZSBpZiAoc2l6ZSA9PSAwKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBEV09SRCBudW1iZXJfYnl0ZXNfcmVhZCA9IDA7Ci0gIEJPT0wgc3VjY2VzcyA9Ci0gICAgICBSZWFkRmlsZShmaWxlLT5maWxlX2hhbmRsZSwgZGF0YSwgc2l6ZSwgJm51bWJlcl9ieXRlc19yZWFkLCBudWxscHRyKTsKLQotICAvLyBTaW5jZSB3ZSBhcmUgb25seSBkb2luZyBzeW5jaG9ybm91cyBJTywgc3VjY2VzcyA9PSBGQUxTRSBpbXBsaWVzIHRoYXQKLSAgLy8gc29tZXRoaW5nIGlzIHdyb25nLgotICBpZiAoIXN1Y2Nlc3MpIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICByZXR1cm4gbnVtYmVyX2J5dGVzX3JlYWQ7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX3NlZWsuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX3NlZWsuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZjU2ZmEuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZmlsZV9zZWVrLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9maWxlLmgiCi0KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2ZpbGVfaW50ZXJuYWwuaCIKLQotaW50NjRfdCBTYkZpbGVTZWVrKFNiRmlsZSBmaWxlLCBTYkZpbGVXaGVuY2Ugd2hlbmNlLCBpbnQ2NF90IG9mZnNldCkgewotICBpZiAoIXN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6SGFzVmFsaWRIYW5kbGUoZmlsZSkpIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBMQVJHRV9JTlRFR0VSIG5ld19maWxlX3BvaW50ZXIgPSB7MH07Ci0gIExBUkdFX0lOVEVHRVIgb2Zmc2V0X2FyZ3VtZW50ID0gezB9OwotICBvZmZzZXRfYXJndW1lbnQuUXVhZFBhcnQgPSBvZmZzZXQ7Ci0gIEJPT0wgc3VjY2VzcyA9Ci0gICAgICBTZXRGaWxlUG9pbnRlckV4KGZpbGUtPmZpbGVfaGFuZGxlLCBvZmZzZXRfYXJndW1lbnQsICZuZXdfZmlsZV9wb2ludGVyLAotICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxEV09SRD4od2hlbmNlKSk7Ci0KLSAgaWYgKCFzdWNjZXNzKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgcmV0dXJuIG5ld19maWxlX3BvaW50ZXIuUXVhZFBhcnQ7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX3RydW5jYXRlLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZmlsZV90cnVuY2F0ZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQyNjI2Yi4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX3RydW5jYXRlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvZmlsZS5oIgotCi0jaW5jbHVkZSA8d2luZG93cy5oPgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvZmlsZV9pbnRlcm5hbC5oIgotCi1uYW1lc3BhY2Ugewotc3RhdGljIGNvbnN0IGNoYXIgazRLWmVyb1BhZ2VbNCAqIDEwMjRdID0gezB9OwotCi1ib29sIFdyaXRlWmVyb3NUb0ZpbGUoSEFORExFIGZpbGVfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgIExBUkdFX0lOVEVHRVIgYmVnaW4sCi0gICAgICAgICAgICAgICAgICAgICAgTEFSR0VfSU5URUdFUiBlbmQpIHsKLSAgU0JfRENIRUNLKHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6SXNWYWxpZEhhbmRsZShmaWxlX2hhbmRsZSkpOwotICBpbnQ2NF90IGJ5dGVzX2xlZnRfdG9fd3JpdGUgPSBlbmQuUXVhZFBhcnQgLSBiZWdpbi5RdWFkUGFydDsKLSAgaWYgKGJ5dGVzX2xlZnRfdG9fd3JpdGUgPD0gMCkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLy8gU2V0IHRoZSBmaWxlIHBvaW50ZXIgdG8gfGJlZ2lufC4KLSAgaWYgKCFTZXRGaWxlUG9pbnRlckV4KGZpbGVfaGFuZGxlLCBiZWdpbiwgTlVMTCwgRklMRV9CRUdJTikpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBXcml0ZSBmcm9tIHplcm9zIGZyb20gfGJlZ2lufCB0byB8ZW5kfC4KLSAgd2hpbGUgKGJ5dGVzX2xlZnRfdG9fd3JpdGUgPiAwKSB7Ci0gICAgaW50NjRfdCBieXRlc190b193cml0ZSA9Ci0gICAgICAgIHN0ZDo6bWluPGludDY0X3Q+KFNCX0FSUkFZX1NJWkUoazRLWmVyb1BhZ2UpLCBieXRlc19sZWZ0X3RvX3dyaXRlKTsKLSAgICBTQl9EQ0hFQ0soYnl0ZXNfdG9fd3JpdGUgPD0ga1NiSW50MzJNYXgpOwotCi0gICAgRFdPUkQgYnl0ZXNfd3JpdHRlbiA9IDA7Ci0gICAgaWYgKCFXcml0ZUZpbGUoZmlsZV9oYW5kbGUsIGs0S1plcm9QYWdlLCBzdGF0aWNfY2FzdDxpbnQ+KGJ5dGVzX3RvX3dyaXRlKSwKLSAgICAgICAgICAgICAgICAgICAmYnl0ZXNfd3JpdHRlbiwgTlVMTCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBieXRlc19sZWZ0X3RvX3dyaXRlIC09IGJ5dGVzX3dyaXR0ZW47Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLWJvb2wgU2JGaWxlVHJ1bmNhdGUoU2JGaWxlIGZpbGUsIGludDY0X3QgbGVuZ3RoKSB7Ci0gIGlmICghc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOjpIYXNWYWxpZEhhbmRsZShmaWxlKSB8fCBsZW5ndGggPCAwKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgSEFORExFIGZpbGVfaGFuZGxlID0gZmlsZS0+ZmlsZV9oYW5kbGU7Ci0KLSAgLy8gR2V0IGN1cnJlbnQgcG9zaXRpb24uCi0gIExBUkdFX0lOVEVHRVIgY3VycmVudF9wb3NpdGlvbiA9IHswfTsKLSAgQk9PTCBzdWNjZXNzID0KLSAgICAgIFNldEZpbGVQb2ludGVyRXgoZmlsZV9oYW5kbGUsIHswfSwgJmN1cnJlbnRfcG9zaXRpb24sIEZJTEVfQ1VSUkVOVCk7Ci0KLSAgaWYgKCFzdWNjZXNzKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgYm9vbCByZXR1cm5fdmFsdWUgPSBmYWxzZTsKLSAgZG8gewotICAgIExBUkdFX0lOVEVHRVIgb2xkX2VvZiA9IHswfTsKLSAgICBpZiAoIVNldEZpbGVQb2ludGVyRXgoZmlsZV9oYW5kbGUsIHswfSwgJm9sZF9lb2YsIEZJTEVfRU5EKSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgTEFSR0VfSU5URUdFUiBuZXdfZW9mID0gezB9OwotICAgIG5ld19lb2YuUXVhZFBhcnQgPSBsZW5ndGg7Ci0gICAgaWYgKCFTZXRGaWxlUG9pbnRlckV4KGZpbGVfaGFuZGxlLCBuZXdfZW9mLCBOVUxMLCBGSUxFX0JFR0lOKSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKCFTZXRFbmRPZkZpbGUoZmlsZV9oYW5kbGUpKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBXcml0ZVplcm9zVG9GaWxlKGZpbGVfaGFuZGxlLCBvbGRfZW9mLCBuZXdfZW9mKTsKLSAgICByZXR1cm5fdmFsdWUgPSB0cnVlOwotICB9IHdoaWxlICgwKTsKLQotICAvLyBTZXQgdGhlIGZpbGUgcG9pbnRlciBwb3NpdGlvbiBiYWNrIHdoZXJlIGl0IHdhcy4KLSAgU2V0RmlsZVBvaW50ZXJFeChmaWxlX2hhbmRsZSwgY3VycmVudF9wb3NpdGlvbiwgTlVMTCwgRklMRV9CRUdJTik7Ci0KLSAgcmV0dXJuIHJldHVybl92YWx1ZTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2ZpbGVfd3JpdGUuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX3dyaXRlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjNiZjY4Li4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2ZpbGVfd3JpdGUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2ZpbGUuaCIKLQotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2ZpbGVfaW50ZXJuYWwuaCIKLQotaW50IFNiRmlsZVdyaXRlKFNiRmlsZSBmaWxlLCBjb25zdCBjaGFyKiBkYXRhLCBpbnQgc2l6ZSkgewotICAvLyBUT0RPOiBTdXBwb3J0IGFzeW5jaHJvbm91cyBJTywgaWYgbmVjZXNzYXJ5LgotICBTQl9EQ0hFQ0soKHNpemUgPT0gMCkgfHwgKGRhdGEgIT0gbnVsbHB0cikpOwotICBpZiAoIVNiRmlsZUlzVmFsaWQoZmlsZSkpIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgaWYgKHNpemUgPCAwKSB7Ci0gICAgU0JfTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiAtMTsKLSAgfSBlbHNlIGlmIChzaXplID09IDApIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIERXT1JEIGJ5dGVzX3dyaXR0ZW4gPSAwOwotICBib29sIHN1Y2Nlc3MgPSBXcml0ZUZpbGUoZmlsZS0+ZmlsZV9oYW5kbGUsIGRhdGEsIHNpemUsICZieXRlc193cml0dGVuLCBOVUxMKTsKLSAgaWYgKCFzdWNjZXNzKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgcmV0dXJuIGJ5dGVzX3dyaXR0ZW47Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9nZXRfaG9tZV9kaXJlY3RvcnkuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9nZXRfaG9tZV9kaXJlY3RvcnkuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ZTExZTUuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZ2V0X2hvbWVfZGlyZWN0b3J5LmNjCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgPG9iamJhc2UuaD4KLSNpbmNsdWRlIDxzaGxvYmouaD4KLSNpbmNsdWRlIDxzaGx3YXBpLmg+Ci0KLS8vIFdpbmRvd3MgZGVmaW5lcyBHZXRDb21tYW5kTGluZSBhcyBhIG1hY3JvIHRvIEdldENvbW1hbmRMaW5lVyB3aGljaAotLy8gYnJlYWtzIG91ciBBcHBsaWNhdGlvbjo6R2V0Q29tbWFuZExpbmUgY2FsbCBiZWxvdzsgdGh1cyB3ZSB1bmRlZmluZQotLy8gaXQgYWZ0ZXIgaW5jbHVkaW5nIG91ciBXaW5kb3dzIGhlYWRlcnMuCi0jdW5kZWYgR2V0Q29tbWFuZExpbmUKLQotI2luY2x1ZGUgPGNzdGRsaWI+Ci0jaW5jbHVkZSA8Y3N0cmluZz4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9ub3VzZXIvdXNlcl9pbnRlcm5hbC5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2FwcGxpY2F0aW9uLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvY29tbWFuZF9saW5lLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9hcHBsaWNhdGlvbl93aW4zMi5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvZXJyb3JfdXRpbHMuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3djaGFyX3V0aWxzLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3N0cmluZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zeXN0ZW0uaCIKLQotbmFtZXNwYWNlIHNid2luMzIgPSBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI7Ci0KLXVzaW5nIHN0YXJib2FyZDo6c2hhcmVkOjpzdGFyYm9hcmQ6OkNvbW1hbmRMaW5lOwotCi1uYW1lc3BhY2Ugc3RhcmJvYXJkIHsKLW5hbWVzcGFjZSBzaGFyZWQgewotbmFtZXNwYWNlIG5vdXNlciB7Ci0KLWJvb2wgR2V0SG9tZURpcmVjdG9yeShTYlVzZXIgdXNlciwgY2hhciogb3V0X3BhdGgsIGludCBwYXRoX3NpemUpIHsKLSAgaWYgKHVzZXIgIT0gU2JVc2VyR2V0Q3VycmVudCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgUFdTVFIgbG9jYWxfYXBwX2RhdGFfcGF0aCA9IG51bGxwdHI7Ci0KLSAgaWYgKFNfT0sgPT0gU0hHZXRLbm93bkZvbGRlclBhdGgoRk9MREVSSURfTG9jYWxBcHBEYXRhLCAwLCBudWxscHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbG9jYWxfYXBwX2RhdGFfcGF0aCkpIHsKLSAgICBUQ0hBUiB3aWRlX3BhdGhbTUFYX1BBVEhdOwotICAgIHdjc2NweSh3aWRlX3BhdGgsIGxvY2FsX2FwcF9kYXRhX3BhdGgpOwotICAgIENvVGFza01lbUZyZWUobG9jYWxfYXBwX2RhdGFfcGF0aCk7Ci0gICAgLy8gSW5zdGVhZCBvZiB1c2luZyB0aGUgcmF3IGxvY2FsIEFwcERhdGEgZGlyZWN0b3J5LCB3ZSBjcmVhdGUgYSBwcm9ncmFtCi0gICAgLy8gYXBwIGRpcmVjdG9yeSBpZiBpdCBkb2Vzbid0IGV4aXN0IGFscmVhZHkuCi0gICAgVENIQVIgcHJvZ3JhbV9uYW1lW01BWF9QQVRIXTsKLSAgICBEV09SRCBwcm9ncmFtX25hbWVfbGVuZ3RoID0gR2V0TW9kdWxlRmlsZU5hbWUoTlVMTCwgcHJvZ3JhbV9uYW1lLCBNQVhfUEFUSCk7Ci0gICAgaWYgKHByb2dyYW1fbmFtZV9sZW5ndGggPT0gMCkgewotICAgICAgU0JfTE9HKEVSUk9SKSA8PCAiR2V0TW9kdWxlRmlsZU5hbWUgZmFpbGVkIjsKLSAgICAgIHNid2luMzI6OkRlYnVnTG9nV2luRXJyb3IoKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgUGF0aFN0cmlwUGF0aChwcm9ncmFtX25hbWUpOwotICAgIFBhdGhBcHBlbmQod2lkZV9wYXRoLCBwcm9ncmFtX25hbWUpOwotICAgIGlmICghUGF0aEZpbGVFeGlzdHMod2lkZV9wYXRoKSkgewotICAgICAgU0VDVVJJVFlfQVRUUklCVVRFUyBzZWN1cml0eV9hdHRyaWJ1dGVzID0ge3NpemVvZihTRUNVUklUWV9BVFRSSUJVVEVTKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBUUlVFfTsKLSAgICAgIGNvbnN0IEJPT0wgY3JlYXRlZF9kaXJlY3RvcnkgPQotICAgICAgICAgIENyZWF0ZURpcmVjdG9yeSh3aWRlX3BhdGgsICZzZWN1cml0eV9hdHRyaWJ1dGVzKTsKLSAgICAgIGlmICghY3JlYXRlZF9kaXJlY3RvcnkpIHsKLSAgICAgICAgU0JfTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBob21lIGRpcmVjdG9yeSI7Ci0gICAgICAgIHNid2luMzI6OkRlYnVnTG9nV2luRXJyb3IoKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLQotICAgIGNvbnN0IHNpemVfdCBhY3R1YWxfcGF0aF9sZW5ndGggPSB3Y3NsZW4od2lkZV9wYXRoKTsKLSAgICBpZiAocGF0aF9zaXplIDwgYWN0dWFsX3BhdGhfbGVuZ3RoKSB7Ci0gICAgICBTQl9MT0coRVJST1IpIDw8ICJIb21lIGRpcmVjdG9yeSBsZW5ndGggZXhjZWVkcyBtYXggcGF0aCBzaXplIjsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgc3RkOjp3Y3N0b21icyhvdXRfcGF0aCwgd2lkZV9wYXRoLCBhY3R1YWxfcGF0aF9sZW5ndGggKyAxKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBTQl9MT0coRVJST1IpIDw8ICJVbmFibGUgdG8gb3BlbiBsb2NhbCBBcHBEYXRhIGFzIGhvbWUgZGlyZWN0b3J5LiI7Ci0gIHNid2luMzI6OkRlYnVnTG9nV2luRXJyb3IoKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi19ICAvLyBuYW1lc3BhY2Ugbm91c2VyCi19ICAvLyBuYW1lc3BhY2Ugc2hhcmVkCi19ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9neXBfY29uZmlndXJhdGlvbi5weSBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2d5cF9jb25maWd1cmF0aW9uLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjllYzRmLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2d5cF9jb25maWd1cmF0aW9uLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLSMgQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSIiIlN0YXJib2FyZCB3aW4zMiBzaGFyZWQgcGxhdGZvcm0gY29uZmlndXJhdGlvbiBmb3IgZ3lwX2NvYmFsdC4iIiIKLQotaW1wb3J0IGxvZ2dpbmcKLWltcG9ydCBvcwotaW1wb3J0IHJlCi1pbXBvcnQgc3VicHJvY2VzcwotaW1wb3J0IHN5cwotCi1pbXBvcnQgY29uZmlnLmJhc2UKLWltcG9ydCBzdGFyYm9hcmQuc2hhcmVkLndpbjMyLnNka19jb25maWd1cmF0aW9uIGFzIHNka19jb25maWd1cmF0aW9uCi1mcm9tIHN0YXJib2FyZC50b29scy5wYXRocyBpbXBvcnQgU1RBUkJPQVJEX1JPT1QKLWZyb20gc3RhcmJvYXJkLnRvb2xzLnRlc3RpbmcgaW1wb3J0IHRlc3RfZmlsdGVyCi0KLQotZGVmIEdldFdpbmRvd3NWZXJzaW9uKCk6Ci0gIG91dCA9IHN1YnByb2Nlc3MuY2hlY2tfb3V0cHV0KCd2ZXInLCB1bml2ZXJzYWxfbmV3bGluZXM9VHJ1ZSwgc2hlbGw9VHJ1ZSkKLSAgbGluZXMgPSBbbCBmb3IgbCBpbiBvdXQuc3BsaXQoJ1xuJykgaWYgbF0KLSAgZm9yIGwgaW4gbGluZXM6Ci0gICAgbSA9IHJlLnNlYXJjaChyJ1ZlcnNpb25ccyhbMC05XC5dKyknLCBvdXQpCi0gICAgaWYgbSBhbmQgbS5ncm91cCgxKToKLSAgICAgIG1ham9yLCBtaW5vciwgYnVpbGQgPSBtLmdyb3VwKDEpLnNwbGl0KCcuJykKLSAgICAgIHJldHVybiAoaW50KG1ham9yKSwgaW50KG1pbm9yKSwgaW50KGJ1aWxkKSkKLSAgcmFpc2UgSU9FcnJvcignQ291bGQgbm90IHJldHJpZXZlIHdpbmRvd3MgdmVyc2lvbicpCi0KLQotZGVmIF9RdW90ZVBhdGgocGF0aCk6Ci0gIHJldHVybiAnIicgKyBwYXRoICsgJyInCi0KLQotY2xhc3MgV2luMzJDb25maWd1cmF0aW9uKGNvbmZpZy5iYXNlLlBsYXRmb3JtQ29uZmlnQmFzZSk6Ci0gICIiIlN0YXJib2FyZCBNaWNyb3NvZnQgV2luZG93cyBwbGF0Zm9ybSBjb25maWd1cmF0aW9uLiIiIgotCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBwbGF0Zm9ybSk6Ci0gICAgc3VwZXIoV2luMzJDb25maWd1cmF0aW9uLCBzZWxmKS5fX2luaXRfXyhwbGF0Zm9ybSkKLSAgICBzZWxmLnNkayA9IHNka19jb25maWd1cmF0aW9uLlNka0NvbmZpZ3VyYXRpb24oKQotCi0gIGRlZiBHZXRWYXJpYWJsZXMoc2VsZiwgY29uZmlndXJhdGlvbik6Ci0gICAgc2RrID0gc2VsZi5zZGsKLSAgICB2YXJpYWJsZXMgPSBzdXBlcihXaW4zMkNvbmZpZ3VyYXRpb24sIHNlbGYpLkdldFZhcmlhYmxlcyhjb25maWd1cmF0aW9uKQotICAgIHZhcmlhYmxlcy51cGRhdGUoewotICAgICAgICAndmlzdWFsX3N0dWRpb19pbnN0YWxsX3BhdGgnOiBzZGsudnNfaW5zdGFsbF9kaXJfd2l0aF92ZXJzaW9uLAotICAgICAgICAnd2luZG93c19zZGtfcGF0aCc6IHNkay53aW5kb3dzX3Nka19wYXRoLAotICAgICAgICAnd2luZG93c19zZGtfdmVyc2lvbic6IHNkay5yZXF1aXJlZF9zZGtfdmVyc2lvbiwKLSAgICB9KQotICAgIHJldHVybiB2YXJpYWJsZXMKLQotICBkZWYgR2V0RW52aXJvbm1lbnRWYXJpYWJsZXMoc2VsZik6Ci0gICAgc2RrID0gc2VsZi5zZGsKLSAgICBjbCA9IF9RdW90ZVBhdGgob3MucGF0aC5qb2luKHNkay52c19ob3N0X3Rvb2xzX3BhdGgsICdjbC5leGUnKSkKLSAgICBsaWIgPSBfUXVvdGVQYXRoKG9zLnBhdGguam9pbihzZGsudnNfaG9zdF90b29sc19wYXRoLCAnbGliLmV4ZScpKQotICAgIGxpbmsgPSBfUXVvdGVQYXRoKG9zLnBhdGguam9pbihzZGsudnNfaG9zdF90b29sc19wYXRoLCAnbGluay5leGUnKSkKLSAgICByYyA9IF9RdW90ZVBhdGgob3MucGF0aC5qb2luKHNkay53aW5kb3dzX3Nka19ob3N0X3Rvb2xzLCAncmMuZXhlJykpCi0gICAgZW52X3ZhcmlhYmxlcyA9IHsKLSAgICAgICAgJ0FSJzogbGliLAotICAgICAgICAnQVJfSE9TVCc6IGxpYiwKLSAgICAgICAgJ0NDJzogY2wsCi0gICAgICAgICdDWFgnOiBjbCwKLSAgICAgICAgJ0xEJzogbGluaywKLSAgICAgICAgJ1JDJzogcmMsCi0gICAgICAgICdWU19JTlNUQUxMX0RJUic6IHNkay52c19pbnN0YWxsX2RpciwKLSAgICAgICAgJ0NDX0hPU1QnOiBjbCwKLSAgICAgICAgJ0NYWF9IT1NUJzogY2wsCi0gICAgICAgICdMRF9IT1NUJzogbGluaywKLSAgICAgICAgJ0FSRkxBR1NfSE9TVCc6ICdyY3MnLAotICAgICAgICAnQVJUSElORkxBR1NfSE9TVCc6ICdyY3NUJywKLSAgICB9Ci0gICAgcmV0dXJuIGVudl92YXJpYWJsZXMKLQotICBkZWYgR2V0QnVpbGRGb3JtYXQoc2VsZik6Ci0gICAgIiIiUmV0dXJucyB0aGUgZGVzaXJlZCBidWlsZCBmb3JtYXQuIiIiCi0gICAgIyBUaGUgY29tbWEgbWVhbnMgdGhhdCBuaW5qYSwgbXN2c19tYWtlZmlsZSwgd2lsbCBiZSBjaGFpbmVkIGFuZCB1c2UgdGhlCi0gICAgIyBzYW1lIGlucHV0IGluZm9ybWF0aW9uIHNvIHRoYXQgLmd5cCBmaWxlcyB3aWxsIG9ubHkgaGF2ZSB0byBiZSBwYXJzZWQKLSAgICAjIG9uY2UuCi0gICAgcmV0dXJuICduaW5qYSxtc3ZzX21ha2VmaWxlJwotCi0gIGRlZiBHZXRHZW5lcmF0b3JWYXJpYWJsZXMoc2VsZiwgY29uZmlndXJhdGlvbik6Ci0gICAgIiIiUmV0dXJucyBhIGRpY3Qgb2YgZ2VuZXJhdG9yIHZhcmlhYmxlcyBmb3IgdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24uIiIiCi0gICAgXyA9IGNvbmZpZ3VyYXRpb24KLSAgICBnZW5lcmF0b3JfdmFyaWFibGVzID0gewotICAgICAgICAnbXN2c192ZXJzaW9uJzogMjAxNywKLSAgICAgICAgJ21zdnNfcGxhdGZvcm0nOiAneDY0JywKLSAgICAgICAgJ21zdnNfdGVtcGxhdGVfcHJlZml4JzogJ3dpbi8nLAotICAgICAgICAnbXN2c19kZXBsb3lfZGlyJzogJycsCi0gICAgICAgICdxdGNyZWF0b3Jfc2Vzc2lvbl9uYW1lX3ByZWZpeCc6ICdjb2JhbHQnLAotICAgIH0KLSAgICByZXR1cm4gZ2VuZXJhdG9yX3ZhcmlhYmxlcwotCi0gIGRlZiBHZXRUb29sY2hhaW4oc2VsZik6Ci0gICAgc3lzLnBhdGguYXBwZW5kKG9zLnBhdGguam9pbihTVEFSQk9BUkRfUk9PVCwgJ3NoYXJlZCcsICdtc3ZjJywgJ3V3cCcpKQotICAgIGZyb20gbXN2Y190b29sY2hhaW4gaW1wb3J0IE1TVkNVV1BUb29sY2hhaW4gICMgcHlsaW50OiBkaXNhYmxlPWctaW1wb3J0LW5vdC1hdC10b3AsZy1iYWQtaW1wb3J0LW9yZGVyCi0gICAgcmV0dXJuIE1TVkNVV1BUb29sY2hhaW4oKQotCi0gIGRlZiBJc1dpbjEwb3JIaWdoZXIoc2VsZik6Ci0gICAgdHJ5OgotICAgICAgIyBCb3RoIFdpbjEwIGFuZCBXaW4yMDE2LVNlcnZlciB3aWxsIHJldHVybiAxMC4wKwotICAgICAgbWFqb3IsIF8sIF8gPSBHZXRXaW5kb3dzVmVyc2lvbigpCi0gICAgICByZXR1cm4gbWFqb3IgPj0gMTAKLSAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6Ci0gICAgICBwcmludCAnRXJyb3Igd2hpbGUgZ2V0dGluZyB2ZXJzaW9uIGZvciB3aW5kb3dzOiAnICsgc3RyKGUpCi0gICAgcmV0dXJuIEZhbHNlCi0KLSAgZGVmIEdldFRlc3RGaWx0ZXJzKHNlbGYpOgotICAgICIiIkdldHMgYWxsIHRlc3RzIHRvIGJlIGV4Y2x1ZGVkIGZyb20gYSB1bml0IHRlc3QgcnVuLgotCi0gICAgUmV0dXJuczoKLSAgICAgIEEgbGlzdCBvZiBpbml0aWFsaXplZCBUZXN0RmlsdGVyIG9iamVjdHMuCi0gICAgIiIiCi0KLSAgICBpZiBub3Qgc2VsZi5Jc1dpbjEwb3JIaWdoZXIoKToKLSAgICAgIGxvZ2dpbmcuZXJyb3IoJ1Rlc3RzIGNhbiBvbmx5IGJlIGV4ZWN1dGVkIG9uIFdpbjEwIGFuZCBoaWdoZXIuJykKLSAgICAgIHJldHVybiBbdGVzdF9maWx0ZXIuRElTQUJMRV9URVNUSU5HXQotICAgIGVsc2U6Ci0gICAgICBmaWx0ZXJzID0gc3VwZXIoV2luMzJDb25maWd1cmF0aW9uLCBzZWxmKS5HZXRUZXN0RmlsdGVycygpCi0gICAgICBmb3IgdGFyZ2V0LCB0ZXN0cyBpbiBzZWxmLl9GSUxURVJFRF9URVNUUy5pdGVyaXRlbXMoKToKLSAgICAgICAgZmlsdGVycy5leHRlbmQodGVzdF9maWx0ZXIuVGVzdEZpbHRlcih0YXJnZXQsIHRlc3QpIGZvciB0ZXN0IGluIHRlc3RzKQotICAgICAgcmV0dXJuIGZpbHRlcnMKLQotICBfRklMVEVSRURfVEVTVFMgPSB7Ci0gICAgICAnYmluZGluZ3NfdGVzdCc6IFsKLSAgICAgICAgICAnRXZhbHVhdGVTY3JpcHRUZXN0LlRocmVlQXJndW1lbnRzJywKLSAgICAgICAgICAnR2FyYmFnZUNvbGxlY3Rpb25UZXN0LionLAotICAgICAgXSwKLSAgICAgICducGxiJzogW3Rlc3RfZmlsdGVyLkZJTFRFUl9BTExdLAotICAgICAgJ25wbGJfYmxpdHRlcl9waXhlbF90ZXN0cyc6IFt0ZXN0X2ZpbHRlci5GSUxURVJfQUxMXSwKLSAgICAgICdwb2VtX3VuaXR0ZXN0cyc6IFt0ZXN0X2ZpbHRlci5GSUxURVJfQUxMXSwKLSAgICAgICdzdGFyYm9hcmRfcGxhdGZvcm1fdGVzdHMnOiBbdGVzdF9maWx0ZXIuRklMVEVSX0FMTF0sCi0gICAgICAnd2ViZHJpdmVyX3Rlc3QnOiBbdGVzdF9maWx0ZXIuRklMVEVSX0FMTF0sCi0KLSAgICAgICMgVGhlIFdpbmRvd3MgcGxhdGZvcm0gdXNlcyBEM0Q5IHdoaWNoIGRvZXNuJ3QgbGV0IHlvdSBjcmVhdGUgYSBEM0QKLSAgICAgICMgZGV2aWNlIHdpdGhvdXQgYSBkaXNwbGF5LCBjYXVzaW5nIHRoZXNlIHVuaXQgdGVzdHMgdG8gZXJyb25lb3VzbHkKLSAgICAgICMgZmFpbCBvbiB0aGUgYnVpbGRib3RzLCBzbyB0aGV5IGFyZSBkaXNhYmxlZCBmb3IgV2luZG93cyBvbmx5LgotICAgICAgJ2xheW91dF90ZXN0cyc6IFt0ZXN0X2ZpbHRlci5GSUxURVJfQUxMXSwKLSAgICAgICdyZW5kZXJlcl90ZXN0JzogW3Rlc3RfZmlsdGVyLkZJTFRFUl9BTExdLAotCi0gICAgICAjIFRPRE86IGVuYWJsZSBwbGF5ZXIgZmlsdGVyIHRlc3RzLgotICAgICAgJ3BsYXllcl9maWx0ZXJfdGVzdHMnOiBbdGVzdF9maWx0ZXIuRklMVEVSX0FMTF0sCi0KLSAgICAgICMgTm8gbmV0d29yayBvbiBXaW5kb3dzLCB5ZXQuCi0gICAgICAnd2ViX3BsYXRmb3JtX3Rlc3RzJzogW3Rlc3RfZmlsdGVyLkZJTFRFUl9BTExdLAotICAgICAgJ25ldF91bml0dGVzdHMnOiBbdGVzdF9maWx0ZXIuRklMVEVSX0FMTF0sCi0gIH0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2xvZy5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2xvZy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UxY2I4NS4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9sb2cuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotCi12b2lkIFNiTG9nKFNiTG9nUHJpb3JpdHkgLypwcmlvcml0eSovLCBjb25zdCBjaGFyKiBtZXNzYWdlKSB7Ci0gIFNiTG9nUmF3KG1lc3NhZ2UpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbG9nX2ZpbGVfaW1wbC5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2xvZ19maWxlX2ltcGwuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZmI5NWQuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbG9nX2ZpbGVfaW1wbC5jYworKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9sb2dfZmlsZV9pbXBsLmgiCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJzdGFyYm9hcmQvZmlsZS5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbXV0ZXguaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvb25jZS5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvZmlsZV9pbnRlcm5hbC5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zdHJpbmcuaCIKLQotbmFtZXNwYWNlIHsKLQotU2JNdXRleCBsb2dfbXV0ZXggPSBTQl9NVVRFWF9JTklUSUFMSVpFUjsKLVNiRmlsZSBsb2dfZmlsZSA9IGtTYkZpbGVJbnZhbGlkOwotCi0vLyBTYk11dGV4IGlzIG5vdCByZWVudHJhbnQsIHNvIGZhY3RvciBvdXQgY2xvc2UgbG9nIGZpbGUgZnVuY3Rpb25hbGl0eSBmb3IgdXNlCi0vLyBieSBvdGhlciBmdW5jdGlvbnMuCi12b2lkIENsb3NlTG9nRmlsZVdpdGhvdXRMb2NrKCkgewotICBpZiAoU2JGaWxlSXNWYWxpZChsb2dfZmlsZSkpIHsKLSAgICBTYkZpbGVGbHVzaChsb2dfZmlsZSk7Ci0gICAgU2JGaWxlQ2xvc2UobG9nX2ZpbGUpOwotICAgIGxvZ19maWxlID0ga1NiRmlsZUludmFsaWQ7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBzdGFyYm9hcmQgewotbmFtZXNwYWNlIHNoYXJlZCB7Ci1uYW1lc3BhY2Ugd2luMzIgewotCi12b2lkIENsb3NlTG9nRmlsZSgpIHsKLSAgU2JNdXRleEFjcXVpcmUoJmxvZ19tdXRleCk7Ci0gIENsb3NlTG9nRmlsZVdpdGhvdXRMb2NrKCk7Ci0gIFNiTXV0ZXhSZWxlYXNlKCZsb2dfbXV0ZXgpOwotfQotCi12b2lkIE9wZW5Mb2dJbkNhY2hlRGlyZWN0b3J5KGNvbnN0IGNoYXIqIGxvZ19maWxlX25hbWUsIGludCBjcmVhdGlvbl9mbGFncykgewotICBTQl9EQ0hFQ0soKGNyZWF0aW9uX2ZsYWdzICYga1NiRmlsZU9wZW5BbHdheXMpIHx8Ci0gICAgICAgICAgICAoY3JlYXRpb25fZmxhZ3MgJiBrU2JGaWxlQ3JlYXRlQWx3YXlzKSk7Ci0gIFNCX0RDSEVDSyhTYlN0cmluZ0dldExlbmd0aChsb2dfZmlsZV9uYW1lKSAhPSAwKTsKLSAgU0JfRENIRUNLKFNiU3RyaW5nRmluZENoYXJhY3Rlcihsb2dfZmlsZV9uYW1lLCBTQl9GSUxFX1NFUF9DSEFSKSA9PSBudWxscHRyKTsKLSAgY2hhciBvdXRfcGF0aFtTQl9GSUxFX01BWF9QQVRIICsgMV07Ci0gIG91dF9wYXRoWzBdID0gJ1wwJzsKLQotICBpZiAoIVNiU3lzdGVtR2V0UGF0aChrU2JTeXN0ZW1QYXRoQ2FjaGVEaXJlY3RvcnksIG91dF9wYXRoLAotICAgICAgICAgICAgICAgICAgICAgICBTQl9BUlJBWV9TSVpFX0lOVChvdXRfcGF0aCkpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgY29uc3QgaW50IHBhdGhfc2l6ZSA9IFNCX0FSUkFZX1NJWkVfSU5UKG91dF9wYXRoKTsKLSAgaWYgKFNiU3RyaW5nQ29uY2F0KG91dF9wYXRoLCBTQl9GSUxFX1NFUF9TVFJJTkcsIHBhdGhfc2l6ZSkgPj0gcGF0aF9zaXplKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChTYlN0cmluZ0NvbmNhdChvdXRfcGF0aCwgbG9nX2ZpbGVfbmFtZSwgcGF0aF9zaXplKSA+PSBwYXRoX3NpemUpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBPcGVuTG9nRmlsZShvdXRfcGF0aCwgY3JlYXRpb25fZmxhZ3MpOwotfQotCi12b2lkIE9wZW5Mb2dGaWxlKGNvbnN0IGNoYXIqIHBhdGgsIGNvbnN0IGludCBjcmVhdGlvbl9mbGFncykgewotICBTQl9EQ0hFQ0soKGNyZWF0aW9uX2ZsYWdzICYga1NiRmlsZU9wZW5BbHdheXMpIHx8Ci0gICAgICAgICAgICAoY3JlYXRpb25fZmxhZ3MgJiBrU2JGaWxlQ3JlYXRlQWx3YXlzKSk7Ci0gIFNCX0RMT0coSU5GTykgPDwgIkxvZ2dpbmcgdG8gWyIgPDwgcGF0aCA8PCAiXSI7Ci0KLSAgaW50IGZsYWdzID0gY3JlYXRpb25fZmxhZ3MgfCBrU2JGaWxlV3JpdGU7Ci0KLSAgU2JNdXRleEFjcXVpcmUoJmxvZ19tdXRleCk7Ci0gIENsb3NlTG9nRmlsZVdpdGhvdXRMb2NrKCk7Ci0gIGlmICgocGF0aCAhPSBudWxscHRyKSAmJiAocGF0aFswXSAhPSAnXDAnKSkgewotICAgIGxvZ19maWxlID0gU2JGaWxlT3BlbihwYXRoLCBmbGFncywgbnVsbHB0ciwgbnVsbHB0cik7Ci0gICAgU0JfRENIRUNLKFNiRmlsZUlzVmFsaWQobG9nX2ZpbGUpKTsKLSAgfQotCi0gIFNiTXV0ZXhSZWxlYXNlKCZsb2dfbXV0ZXgpOwotfQotCi12b2lkIFdyaXRlVG9Mb2dGaWxlKGNvbnN0IGNoYXIqIHRleHQsIGNvbnN0IGludCB0ZXh0X2xlbmd0aCkgewotICBpZiAodGV4dF9sZW5ndGggPD0gMCkgewotICAgIHJldHVybjsKLSAgfQotICBTYk11dGV4QWNxdWlyZSgmbG9nX211dGV4KTsKLSAgaWYgKCFTYkZpbGVJc1ZhbGlkKGxvZ19maWxlKSkgewotICAgIFNiTXV0ZXhSZWxlYXNlKCZsb2dfbXV0ZXgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGludCBieXRlc193cml0dGVuID0gU2JGaWxlV3JpdGVBbGwobG9nX2ZpbGUsIHRleHQsIHRleHRfbGVuZ3RoKTsKLSAgU0JfRENIRUNLKHRleHRfbGVuZ3RoID09IGJ5dGVzX3dyaXR0ZW4pOwotCi0gIFNiRmlsZUZsdXNoKGxvZ19maWxlKTsKLSAgU2JNdXRleFJlbGVhc2UoJmxvZ19tdXRleCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB3aW4zMgotfSAgLy8gbmFtZXNwYWNlIHNoYXJlZAotfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbG9nX2ZpbGVfaW1wbC5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbG9nX2ZpbGVfaW1wbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWQyOGI5Li4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2xvZ19maWxlX2ltcGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLS8vIFRoaXMgaGVhZGVyIHByb3ZpZGVzIGEgbWVjaGFuaXNtIGZvciBtdWx0aXBsZSBBbmRyb2lkIGxvZ2dpbmcKLS8vIGZvcm1hdHMgdG8gc2hhcmUgYSBzaW5nbGUgbG9nIGZpbGUgaGFuZGxlLgotCi0jaWZuZGVmIFNUQVJCT0FSRF9TSEFSRURfV0lOMzJfTE9HX0ZJTEVfSU1QTF9IXwotI2RlZmluZSBTVEFSQk9BUkRfU0hBUkVEX1dJTjMyX0xPR19GSUxFX0lNUExfSF8KLQotI2luY2x1ZGUgInN0YXJib2FyZC9maWxlLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL211dGV4LmgiCi0KLW5hbWVzcGFjZSBzdGFyYm9hcmQgewotbmFtZXNwYWNlIHNoYXJlZCB7Ci1uYW1lc3BhY2Ugd2luMzIgewotCi0vLyBDbG9zZXMgdGhlIGxvZyBmaWxlLgotdm9pZCBDbG9zZUxvZ0ZpbGUoKTsKLQotLy8gT3BlbnMgYSBmaWxlIGluIHxrU2JTeXN0ZW1QYXRoQ2FjaGVEaXJlY3Rvcnl8IGRpcmVjdG9yeS4KLS8vIHxsb2dfZmlsZV9uYW1lfDogQy1zdHlsZSBzdHJpbmcgb2YgYSBmaWxlbmFtZQotLy8gfGNyZWF0aW9uX2ZsYWdzfDogTXVzdCBiZSBrU2JGaWxlQ3JlYXRlQWx3YXlzICh3aGljaCB3aWxsIHRydW5jYXRlIHRoZSBmaWxlKQotLy8gICB8a1NiRmlsZU9wZW5BbHdheXN8LCB3aGljaCBjYW4gYmUgdXNlZCB0byBhcHBlbmQgdG8gdGhlIGZpbGUuCi12b2lkIE9wZW5Mb2dJbkNhY2hlRGlyZWN0b3J5KGNvbnN0IGNoYXIqIGxvZ19maWxlX25hbWUsIGludCBjcmVhdGlvbl9mbGFncyk7Ci0KLS8vIE9wZW5zIGEgZmlsZSBhdCB8bG9nX2ZpbGVfcGF0aHwgd2l0aCB8Y3JlYXRpb25fZmxhZ3N8LgotLy8gfGxvZ19maWxlX25hbWV8OiBDLXN0eWxlIHN0cmluZyBvZiBhIGZpbGVuYW1lCi0vLyB8Y3JlYXRpb25fZmxhZ3N8OiBNdXN0IGJlIGtTYkZpbGVDcmVhdGVBbHdheXMgKHdoaWNoIHdpbGwgdHJ1bmNhdGUgdGhlIGZpbGUpCi0vLyAgIHxrU2JGaWxlT3BlbkFsd2F5c3wsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGFwcGVuZCB0byB0aGUgZmlsZS4KLXZvaWQgT3BlbkxvZ0ZpbGUoY29uc3QgY2hhciogbG9nX2ZpbGVfcGF0aCwgaW50IGNyZWF0aW9uX2ZsYWdzKTsKLQotLy8gV3JpdGVzIHx0ZXh0X2xlbmd0aHwgYnl0ZXMgc3RhcnRpbmcgZnJvbSB8dGV4dHwgdG8gdGhlIGN1cnJlbnQgbG9nIGZpbGUuCi12b2lkIFdyaXRlVG9Mb2dGaWxlKGNvbnN0IGNoYXIqIHRleHQsIGNvbnN0IGludCB0ZXh0X2xlbmd0aCk7Ci0KLX0gIC8vIG5hbWVzcGFjZSB3aW4zMgotfSAgLy8gbmFtZXNwYWNlIHNoYXJlZAotfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZAotCi0jZW5kaWYgIC8vIFNUQVJCT0FSRF9TSEFSRURfV0lOMzJfTE9HX0ZJTEVfSU1QTF9IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbG9nX2ZsdXNoLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbG9nX2ZsdXNoLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzVhZjQzLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2xvZ19mbHVzaC5jYworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi12b2lkIFNiTG9nRmx1c2goKSB7Ci0gIGZmbHVzaChzdGRlcnIpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbG9nX2Zvcm1hdC5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2xvZ19mb3JtYXQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNTQzMGIuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbG9nX2Zvcm1hdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0KLXZvaWQgU2JMb2dGb3JtYXQoY29uc3QgY2hhciogZm9ybWF0LCB2YV9saXN0IGFyZ3VtZW50cykgewotICBTYkxvZ1Jhd0Zvcm1hdChmb3JtYXQsIGFyZ3VtZW50cyk7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9sb2dfaXNfdHR5LmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbG9nX2lzX3R0eS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBkYmM3Ny4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9sb2dfaXNfdHR5LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLQotYm9vbCBTYkxvZ0lzVHR5KCkgewotICByZXR1cm4gZmFsc2U7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9sb2dfcmF3LmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbG9nX3Jhdy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFlZWQwNy4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9sb2dfcmF3LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8d2luZG93cy5oPgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbmV0X2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvbG9nX2ZpbGVfaW1wbC5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zdHJpbmcuaCIKLQotbmFtZXNwYWNlIHNid2luMzIgPSBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI7Ci0KLXZvaWQgU2JMb2dSYXcoY29uc3QgY2hhciogbWVzc2FnZSkgewotICBmcHJpbnRmKHN0ZGVyciwgIiVzIiwgbWVzc2FnZSk7Ci0gIE91dHB1dERlYnVnU3RyaW5nQShtZXNzYWdlKTsKLSAgc2J3aW4zMjo6V3JpdGVUb0xvZ0ZpbGUoCi0gICAgICBtZXNzYWdlLCBzdGF0aWNfY2FzdDxpbnQ+KFNiU3RyaW5nR2V0TGVuZ3RoKG1lc3NhZ2UpKSk7Ci0KLSAgc3RhcmJvYXJkOjpzaGFyZWQ6OnN0YXJib2FyZDo6TmV0TG9nV3JpdGUobWVzc2FnZSk7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9sb2dfcmF3X2R1bXBfc3RhY2suY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9sb2dfcmF3X2R1bXBfc3RhY2suY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MmEwNTYuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbG9nX3Jhd19kdW1wX3N0YWNrLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLQotdm9pZCBTYkxvZ1Jhd0R1bXBTdGFjayhpbnQgLypmcmFtZXNfdG9fc2tpcCovKSB7Ci0gIFNiTG9nUmF3KCJUT0RPIHN0YWNrIGR1bXAgbm90IGltcGxlbWVudGVkXG4iKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2xvZ19yYXdfZm9ybWF0LmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbG9nX3Jhd19mb3JtYXQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlYjQyMDcuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbG9nX3Jhd19mb3JtYXQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2xvZ19maWxlX2ltcGwuaCIKLQotc3RhdGljIGNvbnN0IGludCBrTWF4TG9nTGluZUNoYXJzID0gMTYgKiAxMDI0OwotCi1uYW1lc3BhY2Ugc2J3aW4zMiA9IHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjsKLQotdm9pZCBTYkxvZ1Jhd0Zvcm1hdChjb25zdCBjaGFyKiBmb3JtYXQsIHZhX2xpc3QgYXJndW1lbnRzKSB7Ci0gIGNoYXIgbG9nX2J1ZmZlcltrTWF4TG9nTGluZUNoYXJzXSA9IHswfTsKLSAgaW50IHJlc3VsdCA9IHZzcHJpbnRmX3MobG9nX2J1ZmZlciwga01heExvZ0xpbmVDaGFycy0xLCBmb3JtYXQsIGFyZ3VtZW50cyk7Ci0gIGlmIChyZXN1bHQgPiAwKSB7Ci0gICAgU2JMb2dSYXcobG9nX2J1ZmZlcik7Ci0gIH0gZWxzZSB7Ci0gICAgU2JMb2dSYXcoIltsb2cgbGluZSB0b28gbG9uZ10iKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbWVkaWFfY29tbW9uLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbWVkaWFfY29tbW9uLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGU2OTM4Li4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL21lZGlhX2NvbW1vbi5jYworKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9tZWRpYV9jb21tb24uaCIKLQotI2luY2x1ZGUgPE1mYXBpLmg+Ci0jaW5jbHVkZSA8TWZlcnJvci5oPgotI2luY2x1ZGUgPE1maWRsLmg+Ci0jaW5jbHVkZSA8TWZvYmplY3RzLmg+Ci0jaW5jbHVkZSA8UnBjLmg+Ci0jaW5jbHVkZSA8Y29tdXRpbC5oPgotI2luY2x1ZGUgPHdybFxjbGllbnQuaD4gIC8vIEZvciBDb21QdHIuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvY29tbW9uL3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL2NvbmZpZ3VyYXRpb24uaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lZGlhLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL211dGV4LmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9wbGF5ZXJfY29tcG9uZW50cy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9pbnB1dF9idWZmZXJfaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc3RyaW5nLmgiCi0KLW5hbWVzcGFjZSBzdGFyYm9hcmQgewotbmFtZXNwYWNlIHNoYXJlZCB7Ci1uYW1lc3BhY2Ugd2luMzIgewotCi0vLyBDb252ZXJ0cyBtaWNyb3NlY29uZHMgdG8gMTBNaHogKDEwMG5zIHRpbWUpLgotaW50NjRfdCBDb252ZXJ0VG9XaW4zMlRpbWUoU2JUaW1lIGlucHV0KSB7Ci0gIGludDY0X3Qgb3V0ID0gaW5wdXQ7Ci0gIG91dCAqPSAxMDsKLSAgcmV0dXJuIG91dDsKLX0KLQotLy8gQ29udmVydCB0aGUgb3RoZXIgd2F5IGFyb3VuZC4KLVNiVGltZSBDb252ZXJ0VG9TYlRpbWUoaW50NjRfdCBpbnB1dCkgewotICBTYlRpbWUgb3V0ID0gaW5wdXQ7Ci0gIG91dCAvPSAxMDsKLSAgcmV0dXJuIG91dDsKLX0KLQotc3RkOjp2ZWN0b3I8Q29tUHRyPElNRk1lZGlhVHlwZT4+IEdldEFsbE91dHB1dE1lZGlhVHlwZXMoCi0gICAgaW50IHN0cmVhbV9pZCwKLSAgICBJTUZUcmFuc2Zvcm0qIGRlY29kZXIpIHsKLSAgc3RkOjp2ZWN0b3I8Q29tUHRyPElNRk1lZGlhVHlwZT4+IG91dHB1dDsKLSAgZm9yIChpbnQgaW5kZXggPSAwOzsgKytpbmRleCkgewotICAgIENvbVB0cjxJTUZNZWRpYVR5cGU+IG1lZGlhX3R5cGU7Ci0gICAgSFJFU1VMVCBociA9IGRlY29kZXItPkdldE91dHB1dEF2YWlsYWJsZVR5cGUoc3RyZWFtX2lkLCBpbmRleCwgJm1lZGlhX3R5cGUpOwotICAgIGlmIChTVUNDRUVERUQoaHIpKSB7Ci0gICAgICBvdXRwdXQucHVzaF9iYWNrKG1lZGlhX3R5cGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBTQl9EQ0hFQ0soaHIgPT0gTUZfRV9OT19NT1JFX1RZUEVTKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICByZXR1cm4gb3V0cHV0OwotfQotCi1zdGQ6OnZlY3RvcjxDb21QdHI8SU1GTWVkaWFUeXBlPj4gR2V0QWxsSW5wdXRNZWRpYVR5cGVzKAotICAgIGludCBzdHJlYW1faWQsCi0gICAgSU1GVHJhbnNmb3JtKiB0cmFuc2Zvcm0pIHsKLSAgc3RkOjp2ZWN0b3I8Q29tUHRyPElNRk1lZGlhVHlwZT4+IGlucHV0X3R5cGVzOwotCi0gIGZvciAoRFdPUkQgaSA9IDA7OyArK2kpIHsKLSAgICBDb21QdHI8SU1GTWVkaWFUeXBlPiBjdXJyX3R5cGU7Ci0gICAgSFJFU1VMVCBociA9IHRyYW5zZm9ybS0+R2V0SW5wdXRBdmFpbGFibGVUeXBlKHN0cmVhbV9pZCwgaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vycl90eXBlLkdldEFkZHJlc3NPZigpKTsKLSAgICBpZiAoRkFJTEVEKGhyKSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGlucHV0X3R5cGVzLnB1c2hfYmFjayhjdXJyX3R5cGUpOwotICB9Ci0gIHJldHVybiBpbnB1dF90eXBlczsKLX0KLQotc3RkOjp2ZWN0b3I8Q29tUHRyPElNRk1lZGlhVHlwZT4+IEZpbHRlck1lZGlhQnlTdWJUeXBlKAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENvbVB0cjxJTUZNZWRpYVR5cGU+PiYgaW5wdXQsCi0gICAgR1VJRCBzdWJfdHlwZV9maWx0ZXIpIHsKLSAgc3RkOjp2ZWN0b3I8Q29tUHRyPElNRk1lZGlhVHlwZT4+IG91dHB1dDsKLSAgZm9yIChhdXRvIGl0ID0gaW5wdXQuYmVnaW4oKTsgaXQgIT0gaW5wdXQuZW5kKCk7ICsraXQpIHsKLSAgICBDb21QdHI8SU1GTWVkaWFUeXBlPiBtZWRpYV90eXBlID0gKml0OwotICAgIEdVSUQgbWVkaWFfc3ViX3R5cGUgPSB7MH07Ci0gICAgbWVkaWFfdHlwZS0+R2V0R1VJRChNRl9NVF9TVUJUWVBFLCAmbWVkaWFfc3ViX3R5cGUpOwotICAgIGlmIChJc0VxdWFsR1VJRChtZWRpYV9zdWJfdHlwZSwgc3ViX3R5cGVfZmlsdGVyKSkgewotICAgICAgb3V0cHV0LnB1c2hfYmFjayhtZWRpYV90eXBlKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG91dHB1dDsKLX0KLQotSFJFU1VMVCBDcmVhdGVEZWNvZGVyVHJhbnNmb3JtKGNvbnN0IEdVSUQmIGRlY29kZXJfZ3VpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21QdHI8SU1GVHJhbnNmb3JtPiogdHJhbnNmb3JtKSB7Ci0gIHJldHVybiBDb0NyZWF0ZUluc3RhbmNlKGRlY29kZXJfZ3VpZCwgTlVMTCwgQ0xTQ1RYX0lOUFJPQ19TRVJWRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIElJRF9QUFZfQVJHUyh0cmFuc2Zvcm0tPkdldEFkZHJlc3NPZigpKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB3aW4zMgotfSAgLy8gbmFtZXNwYWNlIHNoYXJlZAotfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbWVkaWFfY29tbW9uLmggYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9tZWRpYV9jb21tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIzZjY3Ny4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9tZWRpYV9jb21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpZm5kZWYgU1RBUkJPQVJEX1NIQVJFRF9XSU4zMl9NRURJQV9DT01NT05fSF8KLSNkZWZpbmUgU1RBUkJPQVJEX1NIQVJFRF9XSU4zMl9NRURJQV9DT01NT05fSF8KLQotI2luY2x1ZGUgPEQzRDExLmg+Ci0jaW5jbHVkZSA8TWZhcGkuaD4KLSNpbmNsdWRlIDxNZmVycm9yLmg+Ci0jaW5jbHVkZSA8TWZpZGwuaD4KLSNpbmNsdWRlIDxNZm9iamVjdHMuaD4KLSNpbmNsdWRlIDxScGMuaD4KLSNpbmNsdWRlIDxjb211dGlsLmg+Ci0jaW5jbHVkZSA8d3JsXGNsaWVudC5oPiAgLy8gRm9yIENvbVB0ci4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJzdGFyYm9hcmQvY29tbW9uL3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL2NvbmZpZ3VyYXRpb24uaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lZGlhLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL211dGV4LmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9wbGF5ZXJfY29tcG9uZW50cy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdmlkZW9fZnJhbWVfaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvaW5wdXRfYnVmZmVyX2ludGVybmFsLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3N0cmluZy5oIgotCi1uYW1lc3BhY2Ugc3RhcmJvYXJkIHsKLW5hbWVzcGFjZSBzaGFyZWQgewotbmFtZXNwYWNlIHdpbjMyIHsKLQotdXNpbmcgRGVjb2RlZEF1ZGlvID0gOjpzdGFyYm9hcmQ6OnNoYXJlZDo6c3RhcmJvYXJkOjpwbGF5ZXI6OkRlY29kZWRBdWRpbzsKLXVzaW5nIERlY29kZWRBdWRpb1B0ciA9IDo6c3RhcmJvYXJkOjpzY29wZWRfcmVmcHRyPERlY29kZWRBdWRpbz47Ci11c2luZyBJbnB1dEJ1ZmZlciA9IDo6c3RhcmJvYXJkOjpzaGFyZWQ6OnN0YXJib2FyZDo6cGxheWVyOjpJbnB1dEJ1ZmZlcjsKLXVzaW5nIFBsYXllckNvbXBvbmVudHMgPQotICAgIDo6c3RhcmJvYXJkOjpzaGFyZWQ6OnN0YXJib2FyZDo6cGxheWVyOjpmaWx0ZXI6OlBsYXllckNvbXBvbmVudHM7Ci11c2luZyBTdGF0dXMgPQotICAgIDo6c3RhcmJvYXJkOjpzaGFyZWQ6OnN0YXJib2FyZDo6cGxheWVyOjpmaWx0ZXI6OlZpZGVvRGVjb2Rlcjo6U3RhdHVzOwotdXNpbmcgVmlkZW9GcmFtZSA9IDo6c3RhcmJvYXJkOjpzaGFyZWQ6OnN0YXJib2FyZDo6cGxheWVyOjpmaWx0ZXI6OlZpZGVvRnJhbWU7Ci11c2luZyBWaWRlb0ZyYW1lUHRyID0gOjpzdGFyYm9hcmQ6OnNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT47Ci11c2luZyBNaWNyb3NvZnQ6OldSTDo6Q29tUHRyOwotCi0vLyBDb252ZXJ0cyBtaWNyb3NlY29uZHMgdG8gMTBNaHogKDEwMG5zIHRpbWUpLgotaW50NjRfdCBDb252ZXJ0VG9XaW4zMlRpbWUoU2JUaW1lIGlucHV0KTsKLQotLy8gQ29udmVydCB0aGUgb3RoZXIgd2F5IGFyb3VuZC4KLVNiVGltZSBDb252ZXJ0VG9TYlRpbWUoaW50NjRfdCBpbnB1dCk7Ci0KLXN0ZDo6dmVjdG9yPENvbVB0cjxJTUZNZWRpYVR5cGU+PiBHZXRBbGxPdXRwdXRNZWRpYVR5cGVzKGludCBzdHJlYW1faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTUZUcmFuc2Zvcm0qIGRlY29kZXIpOwotc3RkOjp2ZWN0b3I8Q29tUHRyPElNRk1lZGlhVHlwZT4+IEdldEFsbElucHV0TWVkaWFUeXBlcygKLSAgICBpbnQgc3RyZWFtX2lkLAotICAgIElNRlRyYW5zZm9ybSogdHJhbnNmb3JtKTsKLQotc3RkOjp2ZWN0b3I8Q29tUHRyPElNRk1lZGlhVHlwZT4+IEZpbHRlck1lZGlhQnlTdWJUeXBlKAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENvbVB0cjxJTUZNZWRpYVR5cGU+PiYgaW5wdXQsCi0gICAgR1VJRCBzdWJfdHlwZV9maWx0ZXIpOwotCi1IUkVTVUxUIENyZWF0ZURlY29kZXJUcmFuc2Zvcm0oY29uc3QgR1VJRCYgZGVjb2Rlcl9ndWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbVB0cjxJTUZUcmFuc2Zvcm0+KiB0cmFuc2Zvcm0pOwotCi19ICAvLyBuYW1lc3BhY2Ugd2luMzIKLX0gIC8vIG5hbWVzcGFjZSBzaGFyZWQKLX0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKLQotI2VuZGlmICAvLyBTVEFSQk9BUkRfU0hBUkVEX1dJTjMyX01FRElBX0NPTU1PTl9IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbWVkaWFfZm91bmRhdGlvbl91dGlscy5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL21lZGlhX2ZvdW5kYXRpb25fdXRpbHMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZTlmMDMuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbWVkaWFfZm91bmRhdGlvbl91dGlscy5jYworKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9tZWRpYV9mb3VuZGF0aW9uX3V0aWxzLmgiCi0KLSNpbmNsdWRlIDxNZmFwaS5oPgotI2luY2x1ZGUgPE1mZXJyb3IuaD4KLSNpbmNsdWRlIDxwcm9wdmFydXRpbC5oPgotCi0jaW5jbHVkZSA8aW9zPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2Vycm9yX3V0aWxzLmgiCi0KLW5hbWVzcGFjZSBzdGFyYm9hcmQgewotbmFtZXNwYWNlIHNoYXJlZCB7Ci1uYW1lc3BhY2Ugd2luMzIgewotCi11c2luZyA6OnN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6Q2hlY2tSZXN1bHQ7Ci0KLW5hbWVzcGFjZSB7Ci0KLSNkZWZpbmUgTUFLRV9HVUlEX1BBSVIoWCkgc3RkOjpwYWlyPEdVSUQsIHN0ZDo6c3RyaW5nPihYLCAjWCkKLQotY29uc3Qgc3RkOjpwYWlyPEdVSUQsIHN0ZDo6c3RyaW5nPiBrTWZNdEF1ZGlvW10gPSB7Ci0gIE1BS0VfR1VJRF9QQUlSKE1GX01UX0FBQ19QQVlMT0FEX1RZUEUpLAotICBNQUtFX0dVSURfUEFJUihNRl9NVF9BVURJT19BVkdfQllURVNfUEVSX1NFQ09ORCksCi0gIE1BS0VfR1VJRF9QQUlSKE1GX01UX0FVRElPX0JJVFNfUEVSX1NBTVBMRSksCi0gIE1BS0VfR1VJRF9QQUlSKE1GX01UX0FVRElPX0JMT0NLX0FMSUdOTUVOVCksCi0gIE1BS0VfR1VJRF9QQUlSKE1GX01UX0FVRElPX0NIQU5ORUxfTUFTSyksCi0gIE1BS0VfR1VJRF9QQUlSKE1GX01UX0FVRElPX0ZMT0FUX1NBTVBMRVNfUEVSX1NFQ09ORCksCi0gIE1BS0VfR1VJRF9QQUlSKE1GX01UX0FVRElPX05VTV9DSEFOTkVMUyksCi0gIE1BS0VfR1VJRF9QQUlSKE1GX01UX0FVRElPX1NBTVBMRVNfUEVSX0JMT0NLKSwKLSAgTUFLRV9HVUlEX1BBSVIoTUZfTVRfQVVESU9fU0FNUExFU19QRVJfU0VDT05EKSwKLSAgTUFLRV9HVUlEX1BBSVIoTUZfTVRfQVVESU9fTlVNX0NIQU5ORUxTKSwKLSAgTUFLRV9HVUlEX1BBSVIoTUZfTVRfTUFKT1JfVFlQRSksCi0gIE1BS0VfR1VJRF9QQUlSKE1GX01UX0FVRElPX1BSRUZFUl9XQVZFRk9STUFURVgpLAotICBNQUtFX0dVSURfUEFJUihNRl9NVF9VU0VSX0RBVEEpLAotICBNQUtFX0dVSURfUEFJUihNRl9NVF9TVUJUWVBFKSwKLSAgTUFLRV9HVUlEX1BBSVIoTUZBdWRpb0Zvcm1hdF9BQUMpLAotICBNQUtFX0dVSURfUEFJUihNRkF1ZGlvRm9ybWF0X0FEVFMpLAotICBNQUtFX0dVSURfUEFJUihNRkF1ZGlvRm9ybWF0X0FMQUMpLAotICBNQUtFX0dVSURfUEFJUihNRkF1ZGlvRm9ybWF0X0FNUl9OQiksCi0gIE1BS0VfR1VJRF9QQUlSKE1GQXVkaW9Gb3JtYXRfQU1SX1dCKSwKLSAgTUFLRV9HVUlEX1BBSVIoTUZBdWRpb0Zvcm1hdF9BTVJfV1ApLAotICBNQUtFX0dVSURfUEFJUihNRkF1ZGlvRm9ybWF0X0RvbGJ5X0FDMyksCi0gIE1BS0VfR1VJRF9QQUlSKE1GQXVkaW9Gb3JtYXRfRG9sYnlfQUMzX1NQRElGKSwKLSAgTUFLRV9HVUlEX1BBSVIoTUZBdWRpb0Zvcm1hdF9Eb2xieV9ERFBsdXMpLAotICBNQUtFX0dVSURfUEFJUihNRkF1ZGlvRm9ybWF0X0RSTSksCi0gIE1BS0VfR1VJRF9QQUlSKE1GQXVkaW9Gb3JtYXRfRFRTKSwKLSAgTUFLRV9HVUlEX1BBSVIoTUZBdWRpb0Zvcm1hdF9GTEFDKSwKLSAgTUFLRV9HVUlEX1BBSVIoTUZBdWRpb0Zvcm1hdF9GbG9hdCksCi0gIE1BS0VfR1VJRF9QQUlSKE1GQXVkaW9Gb3JtYXRfRmxvYXRfU3BhdGlhbE9iamVjdHMpLAotICBNQUtFX0dVSURfUEFJUihNRkF1ZGlvRm9ybWF0X01QMyksCi0gIE1BS0VfR1VJRF9QQUlSKE1GQXVkaW9Gb3JtYXRfTVBFRyksCi0gIE1BS0VfR1VJRF9QQUlSKE1GQXVkaW9Gb3JtYXRfTVNQMSksCi0gIE1BS0VfR1VJRF9QQUlSKE1GQXVkaW9Gb3JtYXRfT3B1cyksCi0gIE1BS0VfR1VJRF9QQUlSKE1GQXVkaW9Gb3JtYXRfUENNKSwKLSAgTUFLRV9HVUlEX1BBSVIoTUZBdWRpb0Zvcm1hdF9XTUFTUERJRiksCi0gIE1BS0VfR1VJRF9QQUlSKE1GQXVkaW9Gb3JtYXRfV01BdWRpb19Mb3NzbGVzcyksCi0gIE1BS0VfR1VJRF9QQUlSKE1GQXVkaW9Gb3JtYXRfV01BdWRpb1Y4KSwKLSAgTUFLRV9HVUlEX1BBSVIoTUZBdWRpb0Zvcm1hdF9XTUF1ZGlvVjkpLAotICBNQUtFX0dVSURfUEFJUihNRkF1ZGlvRm9ybWF0X1dNQXVkaW9WOSksCi0gIE1BS0VfR1VJRF9QQUlSKE1GTWVkaWFUeXBlX0F1ZGlvKSwKLX07Ci0jdW5kZWYgTUFLRV9HVUlEX1BBSVIKLQotc3RkOjpzdHJpbmcgR3VpZFRvRmFsbGJhY2tTdHJpbmcoR1VJRCBndWlkKSB7Ci0gIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwotICB3Y2hhcl90KiBndWlkX3N0ciA9IG51bGxwdHI7Ci0gIFN0cmluZ0Zyb21DTFNJRChndWlkLCAmZ3VpZF9zdHIpOwotICBzcyA8PCBndWlkX3N0cjsKLSAgQ29UYXNrTWVtRnJlZShndWlkX3N0cik7Ci0gIHJldHVybiBzcy5zdHIoKTsKLX0KLQotc3RkOjpzdHJpbmcgTWZHdWlkVG9TdHJpbmcoR1VJRCBndWlkKSB7Ci0gIGNvbnN0IHNpemVfdCBuID0gc2l6ZW9mKGtNZk10QXVkaW8pIC8gc2l6ZW9mKCprTWZNdEF1ZGlvKTsKLSAgZm9yIChhdXRvIGkgPSAwOyBpIDwgbjsgKytpKSB7Ci0gICAgY29uc3QgYXV0byYgZWxlbXMgPSBrTWZNdEF1ZGlvW2ldOwotICAgIGlmIChndWlkID09IGVsZW1zLmZpcnN0KSB7Ci0gICAgICByZXR1cm4gZWxlbXMuc2Vjb25kOwotICAgIH0KLSAgfQotICByZXR1cm4gR3VpZFRvRmFsbGJhY2tTdHJpbmcoZ3VpZCk7Ci19Ci0KLXN0ZDo6c3RyaW5nIEltZkF0dHJpYnV0ZXNUb1N0cmluZyhJTUZBdHRyaWJ1dGVzKiB0eXBlKSB7Ci0gIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwotICBVSU5UMzIgbiA9IDA7Ci0gIEhSRVNVTFQgaHIgPSB0eXBlLT5HZXRDb3VudCgmbik7Ci0gIENoZWNrUmVzdWx0KGhyKTsKLSAgZm9yIChVSU5UMzIgaSA9IDA7IGkgPCBuOyArK2kpIHsKLSAgICBHVUlEIGtleTsKLSAgICBQUk9QVkFSSUFOVCB2YWw7Ci0gICAgdHlwZS0+R2V0SXRlbUJ5SW5kZXgoaSwgJmtleSwgJnZhbCk7Ci0KLSAgICBNRl9BVFRSSUJVVEVfVFlQRSBhdHRyaWJfdHlwZTsKLSAgICBociA9IHR5cGUtPkdldEl0ZW1UeXBlKGtleSwgJmF0dHJpYl90eXBlKTsKLSAgICBDaGVja1Jlc3VsdChocik7Ci0KLSAgICBzdGQ6OnN0cmluZyBrZXlfc3RyID0gTWZHdWlkVG9TdHJpbmcoa2V5KTsKLSAgICBzcyA8PCBrZXlfc3RyIDw8ICI6ICI7Ci0KLSAgICBzd2l0Y2ggKGF0dHJpYl90eXBlKSB7Ci0gICAgICBjYXNlIE1GX0FUVFJJQlVURV9HVUlEOiB7Ci0gICAgICAgIEdVSUQgdmFsdWVfZ3VpZDsKLSAgICAgICAgaHIgPSB0eXBlLT5HZXRHVUlEKGtleSwgJnZhbHVlX2d1aWQpOwotICAgICAgICBzcyA8PCBNZkd1aWRUb1N0cmluZyh2YWx1ZV9ndWlkKSA8PCAiXG4iOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBNRl9BVFRSSUJVVEVfRE9VQkxFOiB7Ci0gICAgICAgIGRvdWJsZSB2YWx1ZSA9IDA7Ci0gICAgICAgIGhyID0gdHlwZS0+R2V0RG91YmxlKGtleSwgJnZhbHVlKTsKLSAgICAgICAgc3MgPDwgdmFsdWUgPDwgIlxuIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgTUZfQVRUUklCVVRFX0JMT0I6IHsKLSAgICAgICAgLy8gU2tpcC4KLSAgICAgICAgc3MgPDwgIjxCTE9CPiIgPDwgIlxuIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgTUZfQVRUUklCVVRFX1VJTlQzMjogewotICAgICAgICBVSU5UMzIgaW50X3ZhbCA9IDA7Ci0gICAgICAgIGhyID0gdHlwZS0+R2V0VUlOVDMyKGtleSwgJmludF92YWwpOwotICAgICAgICBzcyA8PCBpbnRfdmFsIDw8ICJcbiI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIE1GX0FUVFJJQlVURV9VSU5UNjQ6IHsKLSAgICAgICAgVUlOVDY0IGludF92YWwgPSAwOwotICAgICAgICBociA9IHR5cGUtPkdldFVJTlQ2NChrZXksICZpbnRfdmFsKTsKLSAgICAgICAgc3MgPDwgaW50X3ZhbCA8PCAiXG4iOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBNRl9BVFRSSUJVVEVfU1RSSU5HOiB7Ci0gICAgICAgIHdjaGFyX3QgYnVmZlsxMjhdOwotICAgICAgICBVSU5UIGJ1ZmZfc2l6ZSA9IHNpemVvZihidWZmKTsKLSAgICAgICAgaHIgPSB0eXBlLT5HZXRTdHJpbmcoa2V5LCBidWZmLCBidWZmX3NpemUsIE5VTEwpOwotICAgICAgICBDaGVja1Jlc3VsdChocik7Ci0gICAgICAgIHNzIDw8IGJ1ZmYgPDwgIlxuIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBkZWZhdWx0OiB7Ci0gICAgICAgIFNCX05PVElNUExFTUVOVEVEKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotICBzcyA8PCAiXG4iOwotICByZXR1cm4gc3Muc3RyKCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZS4KLQotdm9pZCBDb3B5VWludDMyUHJvcGVydHkoR1VJRCBrZXksIGNvbnN0IElNRk1lZGlhVHlwZSogc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgSU1GTWVkaWFUeXBlKiBkZXN0aW5hdGlvbikgewotICBVSU5UMzIgdmFsID0gMDsKLSAgY29uc3RfY2FzdDxJTUZNZWRpYVR5cGUqPihzb3VyY2UpLT5HZXRVSU5UMzIoa2V5LCAmdmFsKTsKLSAgSFJFU1VMVCBociA9IGRlc3RpbmF0aW9uLT5TZXRVSU5UMzIoa2V5LCB2YWwpOwotICBDaGVja1Jlc3VsdChocik7Ci19Ci0KLXN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBJTUZNZWRpYVR5cGUmIG1lZGlhX3R5cGUpIHsKLSAgY29uc3QgSU1GQXR0cmlidXRlcyogYXR0cmlicyA9ICZtZWRpYV90eXBlOyAgLy8gVXBjYXN0LgotICBzdGQ6OnN0cmluZyBvdXRwdXRfc3RyID0KLSAgICAgIEltZkF0dHJpYnV0ZXNUb1N0cmluZyhjb25zdF9jYXN0PElNRkF0dHJpYnV0ZXMqPihhdHRyaWJzKSk7Ci0gIG9zIDw8IG91dHB1dF9zdHI7Ci0gIHJldHVybiBvczsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHdpbjMyCi19ICAvLyBuYW1lc3BhY2Ugc2hhcmVkCi19ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9tZWRpYV9mb3VuZGF0aW9uX3V0aWxzLmggYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9tZWRpYV9mb3VuZGF0aW9uX3V0aWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4OGNjNWMuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbWVkaWFfZm91bmRhdGlvbl91dGlscy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgPHdybC9jbGllbnQuaD4KLSNpbmNsdWRlIDxNZm9iamVjdHMuaD4KLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2lmbmRlZiBTVEFSQk9BUkRfU0hBUkVEX1dJTjMyX01FRElBX0ZPVU5EQVRJT05fVVRJTFNfSF8KLSNkZWZpbmUgU1RBUkJPQVJEX1NIQVJFRF9XSU4zMl9NRURJQV9GT1VOREFUSU9OX1VUSUxTX0hfCi0KLW5hbWVzcGFjZSBzdGFyYm9hcmQgewotbmFtZXNwYWNlIHNoYXJlZCB7Ci1uYW1lc3BhY2Ugd2luMzIgewotCi1zdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgSU1GTWVkaWFUeXBlJiBtZWRpYV90eXBlKTsKLQotc3RkOjpzdHJpbmcgVG9TdHJpbmcoSU1GQXR0cmlidXRlcyogdHlwZSk7Ci0KLXZvaWQgQ29weVVpbnQzMlByb3BlcnR5KEdVSUQga2V5LCBjb25zdCBJTUZNZWRpYVR5cGUqIHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIElNRk1lZGlhVHlwZSogZGVzdGluYXRpb24pOwotCi19ICAvLyBuYW1lc3BhY2Ugd2luMzIKLX0gIC8vIG5hbWVzcGFjZSBzaGFyZWQKLX0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKLQotI2VuZGlmICAvLyBTVEFSQk9BUkRfU0hBUkVEX1dJTjMyX01FRElBX0ZPVU5EQVRJT05fVVRJTFNfSF8KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL21lZGlhX2lzX2F1ZGlvX3N1cHBvcnRlZC5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL21lZGlhX2lzX2F1ZGlvX3N1cHBvcnRlZC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM2OTM2ZC4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9tZWRpYV9pc19hdWRpb19zdXBwb3J0ZWQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWVkaWEvbWVkaWFfc3VwcG9ydF9pbnRlcm5hbC5oIgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2NvbmZpZ3VyYXRpb24uaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVkaWEuaCIKLQotU0JfRVhQT1JUIGJvb2wgU2JNZWRpYUlzQXVkaW9TdXBwb3J0ZWQoU2JNZWRpYUF1ZGlvQ29kZWMgYXVkaW9fY29kZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGJpdHJhdGUpIHsKLSAgLy8gVE9ETzogQWRkIE9wdXMuCi0gIGlmIChhdWRpb19jb2RlYyAhPSBrU2JNZWRpYUF1ZGlvQ29kZWNBYWMpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIGJpdHJhdGUgPD0gU0JfTUVESUFfTUFYX0FVRElPX0JJVFJBVEVfSU5fQklUU19QRVJfU0VDT05EOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbWVkaWFfaXNfb3V0cHV0X3Byb3RlY3RlZC5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL21lZGlhX2lzX291dHB1dF9wcm90ZWN0ZWQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYjM1MzMuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbWVkaWFfaXNfb3V0cHV0X3Byb3RlY3RlZC5jYworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVkaWEuaCIKLQotYm9vbCBTYk1lZGlhSXNPdXRwdXRQcm90ZWN0ZWQoKSB7Ci0gIFNCX05PVElNUExFTUVOVEVEKCk7Ci0gIHJldHVybiBmYWxzZTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL21lZGlhX2lzX3N1cHBvcnRlZC5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL21lZGlhX2lzX3N1cHBvcnRlZC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI3ZjYyNS4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9tZWRpYV9pc19zdXBwb3J0ZWQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZWRpYS5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zdHJpbmcuaCIKLQotLy8gVE9ETzogRmlsbCB0aGlzIGluIGZvciBEUk0uCi1TQl9FWFBPUlQgYm9vbCBTYk1lZGlhSXNTdXBwb3J0ZWQoU2JNZWRpYVZpZGVvQ29kZWMgdmlkZW9fY29kZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JNZWRpYUF1ZGlvQ29kZWMgYXVkaW9fY29kZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcioga2V5X3N5c3RlbSkgewotICBTQl9VTlJFRkVSRU5DRURfUEFSQU1FVEVSKHZpZGVvX2NvZGVjKTsKLSAgU0JfVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUihhdWRpb19jb2RlYyk7Ci0gIFNCX1VOUkVGRVJFTkNFRF9QQVJBTUVURVIoa2V5X3N5c3RlbSk7Ci0gIHJldHVybiAwID09IFNiU3RyaW5nQ29tcGFyZUFsbChrZXlfc3lzdGVtLCAiY29tLnlvdXR1YmUucGxheXJlYWR5Iik7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9tZWRpYV9pc192aWRlb19zdXBwb3J0ZWQuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9tZWRpYV9pc192aWRlb19zdXBwb3J0ZWQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMWNhMzUuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbWVkaWFfaXNfdmlkZW9fc3VwcG9ydGVkLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9tZWRpYS9tZWRpYV9zdXBwb3J0X2ludGVybmFsLmgiCi0KLSNpbmNsdWRlIDxkM2QxMS5oPgotI2luY2x1ZGUgPG1mYXBpLmg+Ci0jaW5jbHVkZSA8bWZpZGwuaD4KLSNpbmNsdWRlIDx3cmwvY2xpZW50Lmg+Ci0KLW5hbWVzcGFjZSB7Ci0KLSNpZiBTQl9IQVMoTUVESUFfV0VCTV9WUDlfU1VQUE9SVCkKLS8vIENhY2hlIHRoZSBWUDkgc3VwcG9ydCBzdGF0dXMgc2luY2UgdGhlIGNoZWNrIG1heSBiZSBleHBlbnNpdmUuCi1lbnVtIFZwOVN1cHBvcnQgewotICBrVnA5U3VwcG9ydFVua25vd24sCi0gIGtWcDlTdXBwb3J0WWVzLAotICBrVnA5U3VwcG9ydE5vCi19OwotVnA5U3VwcG9ydCBzX3ZwOV9zdXBwb3J0ID0ga1ZwOVN1cHBvcnRVbmtub3duOwotCi0vLyBDaGVjayBmb3IgVlA5IHN1cHBvcnQuIFNpbmNlIHRoaXMgaXMgdXNlZCBieSBhIHN0YXJib2FyZCBmdW5jdGlvbiwgaXQKLS8vIGNhbm5vdCBkZXBlbmQgb24gb3RoZXIgbW9kdWxlcyAoZS5nLiBBTkdMRSkuCi1ib29sIElzVnA5U3VwcG9ydGVkKCkgewotICBpZiAoc192cDlfc3VwcG9ydCA9PSBrVnA5U3VwcG9ydFVua25vd24pIHsKLSAgICAvLyBUcnkgaW5pdGlhbGl6aW5nIHRoZSBWUDkgZGVjb2RlciB0byBkZXRlcm1pbmUgaWYgaXQgaXMgc3VwcG9ydGVkLgotICAgIEhSRVNVTFQgaHI7Ci0KLSAgICBNaWNyb3NvZnQ6OldSTDo6Q29tUHRyPElEM0QxMURldmljZT4gZDNkX2RldmljZTsKLSAgICBociA9IEQzRDExQ3JlYXRlRGV2aWNlKG51bGxwdHIsIEQzRF9EUklWRVJfVFlQRV9IQVJEV0FSRSwgbnVsbHB0ciwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIDAsIEQzRDExX1NES19WRVJTSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZDNkX2RldmljZS5HZXRBZGRyZXNzT2YoKSwgbnVsbHB0ciwgbnVsbHB0cik7Ci0KLSAgICBVSU5UIHJlc2V0X3Rva2VuID0gMDsKLSAgICBNaWNyb3NvZnQ6OldSTDo6Q29tUHRyPElNRkRYR0lEZXZpY2VNYW5hZ2VyPiBkZXZpY2VfbWFuYWdlcjsKLSAgICBpZiAoU1VDQ0VFREVEKGhyKSkgewotICAgICAgaHIgPSBNRkNyZWF0ZURYR0lEZXZpY2VNYW5hZ2VyKCZyZXNldF90b2tlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfbWFuYWdlci5HZXRBZGRyZXNzT2YoKSk7Ci0gICAgfQotICAgIGlmIChTVUNDRUVERUQoaHIpKSB7Ci0gICAgICBociA9IGRldmljZV9tYW5hZ2VyLT5SZXNldERldmljZShkM2RfZGV2aWNlLkdldCgpLCByZXNldF90b2tlbik7Ci0gICAgfQotCi0gICAgTWljcm9zb2Z0OjpXUkw6OkNvbVB0cjxJTUZUcmFuc2Zvcm0+IHRyYW5zZm9ybTsKLSAgICBpZiAoU1VDQ0VFREVEKGhyKSkgewotICAgICAgaHIgPSBDb0NyZWF0ZUluc3RhbmNlKENMU0lEX01TVlB4RGVjb2RlciwgbnVsbHB0ciwgQ0xTQ1RYX0lOUFJPQ19TRVJWRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSUlEX1BQVl9BUkdTKHRyYW5zZm9ybS5HZXRBZGRyZXNzT2YoKSkpOwotICAgIH0KLQotICAgIGlmIChTVUNDRUVERUQoaHIpKSB7Ci0gICAgICBociA9IHRyYW5zZm9ybS0+UHJvY2Vzc01lc3NhZ2UoTUZUX01FU1NBR0VfU0VUX0QzRF9NQU5BR0VSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVMT05HX1BUUihkZXZpY2VfbWFuYWdlci5HZXQoKSkpOwotICAgIH0KLQotICAgIHNfdnA5X3N1cHBvcnQgPSBTVUNDRUVERUQoaHIpID8ga1ZwOVN1cHBvcnRZZXMgOiBrVnA5U3VwcG9ydE5vOwotICB9Ci0gIHJldHVybiBzX3ZwOV9zdXBwb3J0ID09IGtWcDlTdXBwb3J0WWVzOwotfQotI2Vsc2UgIC8vIFNCX0hBUyhNRURJQV9XRUJNX1ZQOV9TVVBQT1JUKQotYm9vbCBJc1ZwOVN1cHBvcnRlZCgpIHsKLSAgcmV0dXJuIGZhbHNlOwotfQotI2VuZGlmCi0KLX0gIC8vIG5hbWVzcGFjZQotCi1TQl9FWFBPUlQgYm9vbCBTYk1lZGlhSXNWaWRlb1N1cHBvcnRlZChTYk1lZGlhVmlkZW9Db2RlYyB2aWRlb19jb2RlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZV93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZV9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGJpdHJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnBzKSB7Ci0gIGludCBtYXhfd2lkdGggPSAxOTIwOwotICBpbnQgbWF4X2hlaWdodCA9IDEwODA7Ci0KLSAgaWYgKHZpZGVvX2NvZGVjID09IGtTYk1lZGlhVmlkZW9Db2RlY1ZwOSkgewotICAgIC8vIFZwOSBzdXBwb3J0cyA4ayBvbmx5IGluIHdoaXRlbGlzdGVkIHBsYXRmb3JtcywgdXAgdG8gNGsgaW4gdGhlIG90aGVycy4KLSNpZmRlZiBFTkFCTEVfVlA5XzhLX1NVUFBPUlQKLSAgICBtYXhfd2lkdGggPSA3NjgwOwotICAgIG1heF9oZWlnaHQgPSA0MzIwOwotI2Vsc2UgIC8vIEVOQUJMRV9WUDlfOEtfU1VQUE9SVAotICAgIG1heF93aWR0aCA9IDM4NDA7Ci0gICAgbWF4X2hlaWdodCA9IDIxNjA7Ci0jZW5kaWYgIC8vIEVOQUJMRV9WUDlfOEtfU1VQUE9SVAotICB9IGVsc2UgaWYgKHZpZGVvX2NvZGVjID09IGtTYk1lZGlhVmlkZW9Db2RlY0gyNjQpIHsKLSAgICAvLyBOb3QgYWxsIGRldmljZXMgY2FuIHN1cHBvcnQgNGsgSDI2NDsgc29tZSAoZS5nLiB4YjEpIG1heSBjcmFzaCBpbgotICAgIC8vIHRoZSBkZWNvZGVyIGlmIHByb3ZpZGVkIHRvbyBoaWdoIG9mIGEgcmVzb2x1dGlvbi4gVGhlcmVmb3JlCi0gICAgLy8gcGxhdGZvcm1zIG11c3QgZXhwbGljaXRseSBvcHQtaW4gdG8gc3VwcG9ydCA0ayBIMjY0LgotI2lmZGVmIEVOQUJMRV9IMjY0XzRLX1NVUFBPUlQKLSAgICBtYXhfd2lkdGggPSAzODQwOwotICAgIG1heF9oZWlnaHQgPSAyMTYwOwotI2VuZGlmICAvLyBFTkFCTEVfSDI2NF80S19TVVBQT1JUCi0gIH0KLQotICBpZiAoZnJhbWVfd2lkdGggPiBtYXhfd2lkdGggfHwgZnJhbWVfaGVpZ2h0ID4gbWF4X2hlaWdodCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIElzIGJpdHJhdGUgaW4gcmFuZ2U/Ci0gIGlmIChiaXRyYXRlID4gU0JfTUVESUFfTUFYX1ZJREVPX0JJVFJBVEVfSU5fQklUU19QRVJfU0VDT05EKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmIChmcHMgPiA2MCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAodmlkZW9fY29kZWMgPT0ga1NiTWVkaWFWaWRlb0NvZGVjSDI2NCkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIGlmICh2aWRlb19jb2RlYyA9PSBrU2JNZWRpYVZpZGVvQ29kZWNWcDkpIHsKLSAgICByZXR1cm4gSXNWcDlTdXBwb3J0ZWQoKTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9tZWRpYV90cmFuc2Zvcm0uY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9tZWRpYV90cmFuc2Zvcm0uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NjVhOWQuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbWVkaWFfdHJhbnNmb3JtLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzU3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL21lZGlhX3RyYW5zZm9ybS5oIgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2NvbW1vbi9zY29wZWRfcHRyLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvYXVkaW9fdHJhbnNmb3JtLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9lcnJvcl91dGlscy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvbWVkaWFfY29tbW9uLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9tZWRpYV9mb3VuZGF0aW9uX3V0aWxzLmgiCi0KLW5hbWVzcGFjZSBzdGFyYm9hcmQgewotbmFtZXNwYWNlIHNoYXJlZCB7Ci1uYW1lc3BhY2Ugd2luMzIgewotCi11c2luZyBNaWNyb3NvZnQ6OldSTDo6Q29tUHRyOwotdXNpbmcgOjpzdGFyYm9hcmQ6OnNoYXJlZDo6c3RhcmJvYXJkOjpUaHJlYWRDaGVja2VyOwotCi1uYW1lc3BhY2UgewotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXZvaWQgUmVsZWFzZUlmTm90TnVsbChUKiogcHRyKSB7Ci0gIGlmICgqcHRyKSB7Ci0gICAgKCpwdHIpLT5SZWxlYXNlKCk7Ci0gICAgKnB0ciA9IE5VTEw7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLU1lZGlhVHJhbnNmb3JtOjpNZWRpYVRyYW5zZm9ybShDTFNJRCBjbHNpZCkKLSAgICA6IHRocmVhZF9jaGVja2VyXyhUaHJlYWRDaGVja2VyOjprU2V0VGhyZWFkSWRPbkZpcnN0Q2hlY2spLAotICAgICAgc3RhdGVfKGtDYW5BY2NlcHRJbnB1dCksCi0gICAgICBzdHJlYW1fYmVndW5fKGZhbHNlKSwKLSAgICAgIGRpc2NvbnRpbnVpdHlfKHRydWUpLAotICAgICAgdGhyb3R0bGVfaW5wdXRzXyhmYWxzZSkgewotICBIUkVTVUxUIGhyID0gQ3JlYXRlRGVjb2RlclRyYW5zZm9ybShjbHNpZCwgJnRyYW5zZm9ybV8pOwotICBDaGVja1Jlc3VsdChocik7Ci19Ci0KLU1lZGlhVHJhbnNmb3JtOjpNZWRpYVRyYW5zZm9ybSgKLSAgICBjb25zdCBNaWNyb3NvZnQ6OldSTDo6Q29tUHRyPElNRlRyYW5zZm9ybT4mIHRyYW5zZm9ybSkKLSAgICA6IHRyYW5zZm9ybV8odHJhbnNmb3JtKSwKLSAgICAgIHRocmVhZF9jaGVja2VyXyhUaHJlYWRDaGVja2VyOjprU2V0VGhyZWFkSWRPbkZpcnN0Q2hlY2spLAotICAgICAgc3RhdGVfKGtDYW5BY2NlcHRJbnB1dCksCi0gICAgICBzdHJlYW1fYmVndW5fKGZhbHNlKSwKLSAgICAgIGRpc2NvbnRpbnVpdHlfKHRydWUpLAotICAgICAgdGhyb3R0bGVfaW5wdXRzXyhmYWxzZSkgewotICBTQl9EQ0hFQ0sodHJhbnNmb3JtXyk7Ci19Ci0KLWJvb2wgTWVkaWFUcmFuc2Zvcm06OlRyeVdyaXRlKGNvbnN0IENvbVB0cjxJTUZTYW1wbGU+JiBpbnB1dCkgewotICBTQl9EQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7Ci0KLSAgaWYgKHN0YXRlXyAhPSBrQ2FuQWNjZXB0SW5wdXQpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoIXN0cmVhbV9iZWd1bl8pIHsKLSAgICBTZW5kTWVzc2FnZShNRlRfTUVTU0FHRV9OT1RJRllfQkVHSU5fU1RSRUFNSU5HKTsKLSAgICBTZW5kTWVzc2FnZShNRlRfTUVTU0FHRV9OT1RJRllfU1RBUlRfT0ZfU1RSRUFNKTsKLSAgICBzdHJlYW1fYmVndW5fID0gdHJ1ZTsKLSAgfQotCi0gIEhSRVNVTFQgaHIgPSB0cmFuc2Zvcm1fLT5Qcm9jZXNzSW5wdXQoa1N0cmVhbUlkLCBpbnB1dC5HZXQoKSwgMCk7Ci0KLSAgaWYgKFNVQ0NFRURFRChocikpIHsKLSAgICAvLyBTb21lIHRyYW5zZm9ybXMgZG8gbm90IHJldHVybiBNRl9FX05PVEFDQ0VQVElORy4gVG8gYXZvaWQgZmxvb2RpbmcKLSAgICAvLyB0aGVzZSB0cmFuc2Zvcm1zLCBpbnB1dCBpcyBvbmx5IGFsbG93ZWQgd2hlbiBQcm9jZXNzT3V0cHV0IHJldHVybnMKLSAgICAvLyBNRl9FX1RSQU5TRk9STV9ORUVEX01PUkVfSU5QVVQuCi0gICAgaWYgKHRocm90dGxlX2lucHV0c18pIHsKLSAgICAgIHN0YXRlXyA9IGtDYW5Qcm92aWRlT3V0cHV0OwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBpZiAoaHIgPT0gTUZfRV9OT1RBQ0NFUFRJTkcpIHsKLSAgICBzdGF0ZV8gPSBrQ2FuUHJvdmlkZU91dHB1dDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgU0JfTk9UUkVBQ0hFRCgpIDw8ICJVbmV4cGVjdGVkIHJldHVybiB2YWx1ZSAiIDw8IGhyOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLUNvbVB0cjxJTUZTYW1wbGU+IE1lZGlhVHJhbnNmb3JtOjpUcnlSZWFkKENvbVB0cjxJTUZNZWRpYVR5cGU+KiBuZXdfdHlwZSkgewotICBTQl9EQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7Ci0gIFNCX0RDSEVDSyhuZXdfdHlwZSk7Ci0KLSAgaWYgKHN0YXRlXyA9PSBrRHJhaW5lZCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgQ29tUHRyPElNRlNhbXBsZT4gc2FtcGxlOwotICBIUkVTVUxUIGhyID0gUHJvY2Vzc091dHB1dCgmc2FtcGxlKTsKLQotICBpZiAoaHIgPT0gTUZfRV9UUkFOU0ZPUk1fU1RSRUFNX0NIQU5HRSkgewotICAgIGhyID0gdHJhbnNmb3JtXy0+R2V0T3V0cHV0QXZhaWxhYmxlVHlwZShrU3RyZWFtSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAvLyBUeXBlSW5kZXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3R5cGUtPkdldEFkZHJlc3NPZigpKTsKLSAgICBDaGVja1Jlc3VsdChocik7Ci0gICAgU2V0T3V0cHV0VHlwZSgqbmV3X3R5cGUpOwotCi0gICAgaHIgPSBQcm9jZXNzT3V0cHV0KCZzYW1wbGUpOwotICB9Ci0KLSAgaWYgKGhyID09IE1GX0VfVFJBTlNGT1JNX05FRURfTU9SRV9JTlBVVCkgewotICAgIGlmIChzdGF0ZV8gPT0ga0NhblByb3ZpZGVPdXRwdXQpIHsKLSAgICAgIHN0YXRlXyA9IGtDYW5BY2NlcHRJbnB1dDsKLSAgICB9Ci0gICAgaWYgKHN0YXRlXyA9PSBrRHJhaW5pbmcpIHsKLSAgICAgIHN0YXRlXyA9IGtEcmFpbmVkOwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGlmIChGQUlMRUQoaHIpKSB7Ci0gICAgLy8gU29tZXRpbWVzIHRoZSBkZWNyeXB0b3IgcmVmdXNlIHRvIGVtaXQgb3V0cHV0IGFmdGVyIHNodXR0aW5nIGRvd24uCi0gICAgU0JfRENIRUNLKGhyID09IE1GX0VfSU5WQUxJRFJFUVVFU1QpOwotICAgIGlmIChzdGF0ZV8gPT0ga0RyYWluaW5nKSB7Ci0gICAgICBzdGF0ZV8gPSBrRHJhaW5lZDsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBTQl9EQ0hFQ0soc2FtcGxlKTsKLQotICBpZiAoZGlzY29udGludWl0eV8pIHsKLSAgICBzYW1wbGUtPlNldFVJTlQzMihNRlNhbXBsZUV4dGVuc2lvbl9EaXNjb250aW51aXR5LCBUUlVFKTsKLSAgICBkaXNjb250aW51aXR5XyA9IGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIHNhbXBsZTsKLX0KLQotdm9pZCBNZWRpYVRyYW5zZm9ybTo6RHJhaW4oKSB7Ci0gIFNCX0RDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKLSAgU0JfRENIRUNLKHN0YXRlXyAhPSBrRHJhaW5pbmcgJiYgc3RhdGVfICE9IGtEcmFpbmVkKTsKLQotICBpZiAoc3RhdGVfID09IGtEcmFpbmluZyB8fCBzdGF0ZV8gPT0ga0RyYWluZWQpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoIXN0cmVhbV9iZWd1bl8pIHsKLSAgICBzdGF0ZV8gPSBrRHJhaW5lZDsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBUaGUgVlA5IGNvZGVjIG1heSBjcmFzaCB3aGVuIE1GVF9NRVNTQUdFX05PVElGWV9FTkRfT0ZfU1RSRUFNIGlzIHByb2Nlc3NlZAotICAvLyBhdCB0aGUgc2FtZSB0aW1lIGFuIElNRlNhbXBsZSBpcyByZWxlYXNlZC4gUGVyIGRvY3VtZW50YXRpb24sIHRoZSBjbGllbnQKLSAgLy8gaXMgbm90IHJlcXVpcmVkIHRvIHNlbmQgdGhpcyBtZXNzYWdlIGZvciBJTUZUcmFuc2Zvcm1zLiBBdm9pZCB0aGUgcG9zc2libGUKLSAgLy8gcmFjZSBjb25kaXRpb24gYnkgbm90IHNlbmRpbmcgdGhpcyBtZXNzYWdlLgotICAvLyBTZW5kTWVzc2FnZShNRlRfTUVTU0FHRV9OT1RJRllfRU5EX09GX1NUUkVBTSk7Ci0gIFNlbmRNZXNzYWdlKE1GVF9NRVNTQUdFX0NPTU1BTkRfRFJBSU4pOwotICBzdGF0ZV8gPSBrRHJhaW5pbmc7Ci19Ci0KLWJvb2wgTWVkaWFUcmFuc2Zvcm06OmRyYWluaW5nKCkgY29uc3QgewotICBTQl9EQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7Ci0gIHJldHVybiBzdGF0ZV8gPT0ga0RyYWluaW5nOwotfQotCi1ib29sIE1lZGlhVHJhbnNmb3JtOjpkcmFpbmVkKCkgY29uc3QgewotICBTQl9EQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7Ci0gIHJldHVybiBzdGF0ZV8gPT0ga0RyYWluZWQ7Ci19Ci0KLXZvaWQgTWVkaWFUcmFuc2Zvcm06OlJlc2V0RnJvbURyYWluZWQoKSB7Ci0gIFNCX0RDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKLSAgU0JfRENIRUNLKGRyYWluZWQoKSk7Ci0KLSAgc3RhdGVfID0ga0NhbkFjY2VwdElucHV0OwotICBzdHJlYW1fYmVndW5fID0gZmFsc2U7Ci0gIGRpc2NvbnRpbnVpdHlfID0gdHJ1ZTsKLX0KLQotQ29tUHRyPElNRk1lZGlhVHlwZT4gTWVkaWFUcmFuc2Zvcm06OkdldEN1cnJlbnRJbnB1dFR5cGUoKSB7Ci0gIENvbVB0cjxJTUZNZWRpYVR5cGU+IHR5cGU7Ci0gIEhSRVNVTFQgaHIgPSB0cmFuc2Zvcm1fLT5HZXRJbnB1dEN1cnJlbnRUeXBlKGtTdHJlYW1JZCwgdHlwZS5HZXRBZGRyZXNzT2YoKSk7Ci0gIENoZWNrUmVzdWx0KGhyKTsKLSAgcmV0dXJuIHR5cGU7Ci19Ci0KLXZvaWQgTWVkaWFUcmFuc2Zvcm06OlNldElucHV0VHlwZShjb25zdCBDb21QdHI8SU1GTWVkaWFUeXBlPiYgaW5wdXRfdHlwZSkgewotICBIUkVTVUxUIGhyID0gdHJhbnNmb3JtXy0+U2V0SW5wdXRUeXBlKDAsIGlucHV0X3R5cGUuR2V0KCksIDApOwotICBDaGVja1Jlc3VsdChocik7Ci19Ci0KLXN0ZDo6dmVjdG9yPENvbVB0cjxJTUZNZWRpYVR5cGU+PiBNZWRpYVRyYW5zZm9ybTo6R2V0QXZhaWxhYmxlSW5wdXRUeXBlcygpIHsKLSAgcmV0dXJuIEdldEFsbElucHV0TWVkaWFUeXBlcyhrU3RyZWFtSWQsIHRyYW5zZm9ybV8uR2V0KCkpOwotfQotCi1Db21QdHI8SU1GTWVkaWFUeXBlPiBNZWRpYVRyYW5zZm9ybTo6R2V0Q3VycmVudE91dHB1dFR5cGUoKSB7Ci0gIENvbVB0cjxJTUZNZWRpYVR5cGU+IHR5cGU7Ci0gIEhSRVNVTFQgaHIgPSB0cmFuc2Zvcm1fLT5HZXRPdXRwdXRDdXJyZW50VHlwZShrU3RyZWFtSWQsIHR5cGUuR2V0QWRkcmVzc09mKCkpOwotICBDaGVja1Jlc3VsdChocik7Ci0gIHJldHVybiB0eXBlOwotfQotCi12b2lkIE1lZGlhVHJhbnNmb3JtOjpTZXRPdXRwdXRUeXBlKGNvbnN0IENvbVB0cjxJTUZNZWRpYVR5cGU+JiBvdXRwdXRfdHlwZSkgewotICBIUkVTVUxUIGhyID0gdHJhbnNmb3JtXy0+U2V0T3V0cHV0VHlwZSgwLCBvdXRwdXRfdHlwZS5HZXQoKSwgMCk7Ci0gIENoZWNrUmVzdWx0KGhyKTsKLX0KLQotc3RkOjp2ZWN0b3I8Q29tUHRyPElNRk1lZGlhVHlwZT4+IE1lZGlhVHJhbnNmb3JtOjpHZXRBdmFpbGFibGVPdXRwdXRUeXBlcygpIHsKLSAgc3RkOjp2ZWN0b3I8Q29tUHRyPElNRk1lZGlhVHlwZT4+IG91dHB1dF90eXBlczsKLQotICBmb3IgKERXT1JEIGkgPSAwOzsgKytpKSB7Ci0gICAgQ29tUHRyPElNRk1lZGlhVHlwZT4gY3Vycl90eXBlOwotICAgIEhSRVNVTFQgaHIgPSB0cmFuc2Zvcm1fLT5HZXRPdXRwdXRBdmFpbGFibGVUeXBlKGtTdHJlYW1JZCwgaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyX3R5cGUuR2V0QWRkcmVzc09mKCkpOwotICAgIGlmIChGQUlMRUQoaHIpKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgb3V0cHV0X3R5cGVzLnB1c2hfYmFjayhjdXJyX3R5cGUpOwotICB9Ci0KLSAgcmV0dXJuIG91dHB1dF90eXBlczsKLX0KLQotdm9pZCBNZWRpYVRyYW5zZm9ybTo6U2V0T3V0cHV0VHlwZUJ5U3ViVHlwZShHVUlEIHN1YnR5cGUpIHsKLSAgZm9yIChpbnQgaW5kZXggPSAwOzsgKytpbmRleCkgewotICAgIENvbVB0cjxJTUZNZWRpYVR5cGU+IG1lZGlhX3R5cGU7Ci0gICAgSFJFU1VMVCBociA9Ci0gICAgICAgIHRyYW5zZm9ybV8tPkdldE91dHB1dEF2YWlsYWJsZVR5cGUoa1N0cmVhbUlkLCBpbmRleCwgJm1lZGlhX3R5cGUpOwotICAgIGlmIChTVUNDRUVERUQoaHIpKSB7Ci0gICAgICBHVUlEIG1lZGlhX3N1Yl90eXBlID0ge307Ci0gICAgICBtZWRpYV90eXBlLT5HZXRHVUlEKE1GX01UX1NVQlRZUEUsICZtZWRpYV9zdWJfdHlwZSk7Ci0gICAgICBpZiAobWVkaWFfc3ViX3R5cGUgPT0gc3VidHlwZSkgewotICAgICAgICBTZXRPdXRwdXRUeXBlKG1lZGlhX3R5cGUpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIFNCX0RDSEVDSyhociA9PSBNRl9FX05PX01PUkVfVFlQRVMpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIFNCX05PVFJFQUNIRUQoKTsKLX0KLQotQ29tUHRyPElNRkF0dHJpYnV0ZXM+IE1lZGlhVHJhbnNmb3JtOjpHZXRBdHRyaWJ1dGVzKCkgewotICBDb21QdHI8SU1GQXR0cmlidXRlcz4gYXR0cmlidXRlczsKLSAgSFJFU1VMVCBociA9IHRyYW5zZm9ybV8tPkdldEF0dHJpYnV0ZXMoYXR0cmlidXRlcy5HZXRBZGRyZXNzT2YoKSk7Ci0gIENoZWNrUmVzdWx0KGhyKTsKLSAgcmV0dXJuIGF0dHJpYnV0ZXM7Ci19Ci0KLUNvbVB0cjxJTUZBdHRyaWJ1dGVzPiBNZWRpYVRyYW5zZm9ybTo6R2V0T3V0cHV0U3RyZWFtQXR0cmlidXRlcygpIHsKLSAgQ29tUHRyPElNRkF0dHJpYnV0ZXM+IGF0dHJpYnV0ZXM7Ci0gIEhSRVNVTFQgaHIgPQotICAgICAgdHJhbnNmb3JtXy0+R2V0T3V0cHV0U3RyZWFtQXR0cmlidXRlcygwLCBhdHRyaWJ1dGVzLkdldEFkZHJlc3NPZigpKTsKLSAgQ2hlY2tSZXN1bHQoaHIpOwotICByZXR1cm4gYXR0cmlidXRlczsKLX0KLQotQ29tUHRyPElNRlNhbXBsZVByb3RlY3Rpb24+IE1lZGlhVHJhbnNmb3JtOjpHZXRTYW1wbGVQcm90ZWN0aW9uKCkgewotICBDb21QdHI8SU1GU2FtcGxlUHJvdGVjdGlvbj4gc2FtcGxlX3Byb3RlY3Rpb247Ci0gIEhSRVNVTFQgaHIgPSB0cmFuc2Zvcm1fLkFzKCZzYW1wbGVfcHJvdGVjdGlvbik7Ci0gIENoZWNrUmVzdWx0KGhyKTsKLSAgcmV0dXJuIHNhbXBsZV9wcm90ZWN0aW9uOwotfQotCi12b2lkIE1lZGlhVHJhbnNmb3JtOjpHZXRTdHJlYW1Db3VudChEV09SRCogaW5wdXRfc3RyZWFtX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQqIG91dHB1dF9zdHJlYW1fY291bnQpIHsKLSAgU0JfRENIRUNLKGlucHV0X3N0cmVhbV9jb3VudCk7Ci0gIFNCX0RDSEVDSyhvdXRwdXRfc3RyZWFtX2NvdW50KTsKLSAgSFJFU1VMVCBociA9Ci0gICAgICB0cmFuc2Zvcm1fLT5HZXRTdHJlYW1Db3VudChpbnB1dF9zdHJlYW1fY291bnQsIG91dHB1dF9zdHJlYW1fY291bnQpOwotICBDaGVja1Jlc3VsdChocik7Ci19Ci0KLXZvaWQgTWVkaWFUcmFuc2Zvcm06OlNlbmRNZXNzYWdlKE1GVF9NRVNTQUdFX1RZUEUgbXNnLCBVTE9OR19QVFIgZGF0YSAvKj0gMCovKSB7Ci0gIEhSRVNVTFQgaHIgPSB0cmFuc2Zvcm1fLT5Qcm9jZXNzTWVzc2FnZShtc2csIGRhdGEpOwotICBDaGVja1Jlc3VsdChocik7Ci19Ci0KLXZvaWQgTWVkaWFUcmFuc2Zvcm06OlJlc2V0KCkgewotICBpZiAoc3RyZWFtX2JlZ3VuXykgewotICAgIFNlbmRNZXNzYWdlKE1GVF9NRVNTQUdFX0NPTU1BTkRfRkxVU0gpOwotICB9Ci0gIHN0YXRlXyA9IGtDYW5BY2NlcHRJbnB1dDsKLSAgZGlzY29udGludWl0eV8gPSB0cnVlOwotICB0aHJlYWRfY2hlY2tlcl8uRGV0YWNoKCk7Ci19Ci0KLXZvaWQgTWVkaWFUcmFuc2Zvcm06OlByZXBhcmVPdXRwdXREYXRhQnVmZmVyKAotICAgIE1GVF9PVVRQVVRfREFUQV9CVUZGRVIqIG91dHB1dF9kYXRhX2J1ZmZlcikgewotICBvdXRwdXRfZGF0YV9idWZmZXItPmR3U3RyZWFtSUQgPSBrU3RyZWFtSWQ7Ci0gIG91dHB1dF9kYXRhX2J1ZmZlci0+cFNhbXBsZSA9IE5VTEw7Ci0gIG91dHB1dF9kYXRhX2J1ZmZlci0+ZHdTdGF0dXMgPSAwOwotICBvdXRwdXRfZGF0YV9idWZmZXItPnBFdmVudHMgPSBOVUxMOwotCi0gIE1GVF9PVVRQVVRfU1RSRUFNX0lORk8gb3V0cHV0X3N0cmVhbV9pbmZvOwotICBIUkVTVUxUIGhyID0gdHJhbnNmb3JtXy0+R2V0T3V0cHV0U3RyZWFtSW5mbyhrU3RyZWFtSWQsICZvdXRwdXRfc3RyZWFtX2luZm8pOwotICBDaGVja1Jlc3VsdChocik7Ci0KLSAgc3RhdGljIGNvbnN0IERXT1JEIGtGbGFnQXV0b0FsbG9jYXRlTWVtb3J5ID0KLSAgICAgIE1GVF9PVVRQVVRfU1RSRUFNX1BST1ZJREVTX1NBTVBMRVMgfAotICAgICAgTUZUX09VVFBVVF9TVFJFQU1fQ0FOX1BST1ZJREVfU0FNUExFUzsKLSAgaWYgKChvdXRwdXRfc3RyZWFtX2luZm8uZHdGbGFncyAmIGtGbGFnQXV0b0FsbG9jYXRlTWVtb3J5KSAhPSAwKSB7Ci0gICAgLy8gVHJ5IHRvIGxldCB0aGUgSU1GVHJhbnNmb3JtIGFsbG9jYXRlIHRoZSBtZW1vcnkgaWYgcG9zc2libGUuCi0gICAgcmV0dXJuOwotICB9Ci0KLSAgQ29tUHRyPElNRlNhbXBsZT4gc2FtcGxlOwotICBociA9IE1GQ3JlYXRlU2FtcGxlKCZzYW1wbGUpOwotICBDaGVja1Jlc3VsdChocik7Ci0KLSAgQ29tUHRyPElNRk1lZGlhQnVmZmVyPiBidWZmZXI7Ci0gIGhyID0gTUZDcmVhdGVBbGlnbmVkTWVtb3J5QnVmZmVyKG91dHB1dF9zdHJlYW1faW5mby5jYlNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9zdHJlYW1faW5mby5jYkFsaWdubWVudCwgJmJ1ZmZlcik7Ci0gIENoZWNrUmVzdWx0KGhyKTsKLQotICBociA9IHNhbXBsZS0+QWRkQnVmZmVyKGJ1ZmZlci5HZXQoKSk7Ci0gIENoZWNrUmVzdWx0KGhyKTsKLQotICBvdXRwdXRfZGF0YV9idWZmZXItPnBTYW1wbGUgPSBzYW1wbGUuRGV0YWNoKCk7Ci19Ci0KLUhSRVNVTFQgTWVkaWFUcmFuc2Zvcm06OlByb2Nlc3NPdXRwdXQoQ29tUHRyPElNRlNhbXBsZT4qIHNhbXBsZSkgewotICBTQl9EQ0hFQ0soc2FtcGxlKTsKLQotICBNRlRfT1VUUFVUX0RBVEFfQlVGRkVSIG91dHB1dF9kYXRhX2J1ZmZlcjsKLSAgUHJlcGFyZU91dHB1dERhdGFCdWZmZXIoJm91dHB1dF9kYXRhX2J1ZmZlcik7Ci0KLSAgY29uc3QgRFdPUkQga0ZsYWdzID0gMDsKLSAgY29uc3QgRFdPUkQga051bWJlck9mQnVmZmVycyA9IDE7Ci0gIERXT1JEIHN0YXR1cyA9IDA7Ci0gIEhSRVNVTFQgaHIgPSB0cmFuc2Zvcm1fLT5Qcm9jZXNzT3V0cHV0KGtGbGFncywga051bWJlck9mQnVmZmVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dF9kYXRhX2J1ZmZlciwgJnN0YXR1cyk7Ci0KLSAgU0JfRENIRUNLKCFvdXRwdXRfZGF0YV9idWZmZXIucEV2ZW50cyk7Ci0KLSAgKnNhbXBsZSA9IG91dHB1dF9kYXRhX2J1ZmZlci5wU2FtcGxlOwotICBSZWxlYXNlSWZOb3ROdWxsKCZvdXRwdXRfZGF0YV9idWZmZXIucEV2ZW50cyk7Ci0gIFJlbGVhc2VJZk5vdE51bGwoJm91dHB1dF9kYXRhX2J1ZmZlci5wU2FtcGxlKTsKLQotICBpZiAob3V0cHV0X2RhdGFfYnVmZmVyLmR3U3RhdHVzID09IE1GVF9PVVRQVVRfREFUQV9CVUZGRVJfTk9fU0FNUExFKSB7Ci0gICAgaHIgPSBNRl9FX1RSQU5TRk9STV9ORUVEX01PUkVfSU5QVVQ7Ci0gIH0KLQotICByZXR1cm4gaHI7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB3aW4zMgotfSAgLy8gbmFtZXNwYWNlIHNoYXJlZAotfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbWVkaWFfdHJhbnNmb3JtLmggYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9tZWRpYV90cmFuc2Zvcm0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ4NzM2ZS4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9tZWRpYV90cmFuc2Zvcm0uaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaWZuZGVmIFNUQVJCT0FSRF9TSEFSRURfV0lOMzJfTUVESUFfVFJBTlNGT1JNX0hfCi0jZGVmaW5lIFNUQVJCT0FSRF9TSEFSRURfV0lOMzJfTUVESUFfVFJBTlNGT1JNX0hfCi0KLSNpbmNsdWRlIDxtZmFwaS5oPgotI2luY2x1ZGUgPG1mZXJyb3IuaD4KLSNpbmNsdWRlIDxtZmlkbC5oPgotI2luY2x1ZGUgPHdybFxjbGllbnQuaD4KLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9jb21tb24vc2NvcGVkX3B0ci5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZWRpYS5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3RocmVhZF9jaGVja2VyLmgiCi0KLW5hbWVzcGFjZSBzdGFyYm9hcmQgewotbmFtZXNwYWNlIHNoYXJlZCB7Ci1uYW1lc3BhY2Ugd2luMzIgewotCi0vLyBXcmFwcGVyIGNsYXNzIGZvciBJTUZUcmFuc2Zvcm0gd2l0aCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uYWxpdGllczoKLS8vIDEuIFN0YXRlIG1hbmFnZW1lbnQ6Ci0vLyAgICBJdCBzdXBwb3J0cyBhIG9uZSB3YXkgbGlmZSBjeWNsZSBmcm9tICJrQ2FuQWNjZXB0SW5wdXQva0NhblByb3ZpZGVPdXRwdXQiCi0vLyAgICB0byAia0RyYWluaW5nIiB0aGVuIHRvICJrRHJhaW5lZCIuCi0vLyAyLiBNYW5hZ2VzIHN0YXRlcyBsaWtlIGlucHV0L291dHB1dCB0eXBlcywgdmFyaW91cyBhdHRyaWJ1dGVzLCBhbmQgc2FtcGxlCi0vLyAgICBwcm90ZWN0aW9uLCBldGMuCi0vLyAzLiBTZW5kIG1lc3NhZ2UgdG8gdGhlIHVuZGVybHlpbmcgdHJhbnNmb3JtLgotLy8gVGhpcyBzaW1wbGlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBoaWdoZXIgbGV2ZWwgZGVjb2RlciBtZWNoYW5pc20gdGhhdAotLy8gbWF5IGRlYWwgd2l0aCB0d28gSU1GVHJhbnNmb3Jtczogb25lIGRlY29kZXIgYW5kIG9uZSBkZWNyeXB0b3IuCi1jbGFzcyBNZWRpYVRyYW5zZm9ybSB7Ci0gcHVibGljOgotICBlbnVtIHsga1N0cmVhbUlkID0gMCB9OwotICBleHBsaWNpdCBNZWRpYVRyYW5zZm9ybShDTFNJRCBjbHNpZCk7Ci0gIGV4cGxpY2l0IE1lZGlhVHJhbnNmb3JtKAotICAgICAgY29uc3QgTWljcm9zb2Z0OjpXUkw6OkNvbVB0cjxJTUZUcmFuc2Zvcm0+JiB0cmFuc2Zvcm0pOwotCi0gIC8vIEJ5IGRlZmF1bHQsIHRoZSBpbnB1dCB0aHJvdHRsZSBpcyBkaXNhYmxlZCwgYW5kIGlucHV0cyBjYW4gYmUgd3JpdHRlbiB0bwotICAvLyB0aGUgdHJhbnNmb3JtIHVudGlsIHJlamVjdGVkOyBpLmUuIHRoZSB0cmFuc2Zvcm0gaXMga2VwdCBmdWxsIG9mIGlucHV0cy4KLSAgLy8gSG93ZXZlciwgc29tZSB0cmFuc2Zvcm1zIG1heSBuZXZlciByZXBvcnQgdGhhdCB0aGV5IGFyZSBmdWxsLCBzbyBlbmFibGluZwotICAvLyB0aGUgaW5wdXQgdGhyb3R0bGUgd2lsbCBhbGxvdyBpbnB1dHMgb25seSB3aGVuIHRoZSB0cmFuc2Zvcm0gcmVwb3J0cyB0aGF0Ci0gIC8vIGl0IG5lZWRzIG1vcmUgaW5wdXQuCi0gIHZvaWQgRW5hYmxlSW5wdXRUaHJvdHRsZShib29sIGVuYWJsZSkgeyB0aHJvdHRsZV9pbnB1dHNfID0gZW5hYmxlOyB9Ci0KLSAgYm9vbCBUcnlXcml0ZShjb25zdCBNaWNyb3NvZnQ6OldSTDo6Q29tUHRyPElNRlNhbXBsZT4mIGlucHV0KTsKLSAgTWljcm9zb2Z0OjpXUkw6OkNvbVB0cjxJTUZTYW1wbGU+IFRyeVJlYWQoCi0gICAgICBNaWNyb3NvZnQ6OldSTDo6Q29tUHRyPElNRk1lZGlhVHlwZT4qIG5ld190eXBlKTsKLSAgdm9pZCBEcmFpbigpOwotICBib29sIGRyYWluaW5nKCkgY29uc3Q7Ci0gIGJvb2wgZHJhaW5lZCgpIGNvbnN0OwotICAvLyBPbmNlIHRoZSB0cmFuc2Zvcm0gaXMgZHJhaW5lZCwgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIHRvIGFsbG93IHRoZQotICAvLyB0cmFuc2Zvcm0gdG8gYWNjZXB0IG5ldyBpbnB1dCBhcyBhIG5ld2x5IGNyZWF0ZWQgdHJhbnNmb3JtLiAgVGhpcyBhbGxvd3MKLSAgLy8gdGhlIHJldXNlIG9mIGV4aXN0aW5nIHRyYW5zZm9ybSB3aXRob3V0IHJlLW5lZ290aWF0aW5nIGFsbCB0eXBlcyBhbmQKLSAgLy8gYXR0cmlidXRlcy4KLSAgdm9pZCBSZXNldEZyb21EcmFpbmVkKCk7Ci0KLSAgTWljcm9zb2Z0OjpXUkw6OkNvbVB0cjxJTUZNZWRpYVR5cGU+IEdldEN1cnJlbnRJbnB1dFR5cGUoKTsKLSAgdm9pZCBTZXRJbnB1dFR5cGUoY29uc3QgTWljcm9zb2Z0OjpXUkw6OkNvbVB0cjxJTUZNZWRpYVR5cGU+JiB0eXBlKTsKLSAgc3RkOjp2ZWN0b3I8TWljcm9zb2Z0OjpXUkw6OkNvbVB0cjxJTUZNZWRpYVR5cGU+PiBHZXRBdmFpbGFibGVJbnB1dFR5cGVzKCk7Ci0KLSAgTWljcm9zb2Z0OjpXUkw6OkNvbVB0cjxJTUZNZWRpYVR5cGU+IEdldEN1cnJlbnRPdXRwdXRUeXBlKCk7Ci0gIHZvaWQgU2V0T3V0cHV0VHlwZShjb25zdCBNaWNyb3NvZnQ6OldSTDo6Q29tUHRyPElNRk1lZGlhVHlwZT4mIHR5cGUpOwotICBzdGQ6OnZlY3RvcjxNaWNyb3NvZnQ6OldSTDo6Q29tUHRyPElNRk1lZGlhVHlwZT4+IEdldEF2YWlsYWJsZU91dHB1dFR5cGVzKCk7Ci0gIHZvaWQgU2V0T3V0cHV0VHlwZUJ5U3ViVHlwZShHVUlEIHN1YnR5cGUpOwotCi0gIE1pY3Jvc29mdDo6V1JMOjpDb21QdHI8SU1GQXR0cmlidXRlcz4gR2V0QXR0cmlidXRlcygpOwotICBNaWNyb3NvZnQ6OldSTDo6Q29tUHRyPElNRkF0dHJpYnV0ZXM+IEdldE91dHB1dFN0cmVhbUF0dHJpYnV0ZXMoKTsKLQotICBNaWNyb3NvZnQ6OldSTDo6Q29tUHRyPElNRlNhbXBsZVByb3RlY3Rpb24+IEdldFNhbXBsZVByb3RlY3Rpb24oKTsKLSAgdm9pZCBHZXRTdHJlYW1Db3VudChEV09SRCogaW5wdXRfc3RyZWFtY291bnQsIERXT1JEKiBvdXRwdXRfc3RyZWFtX2NvdW50KTsKLQotICB2b2lkIFNlbmRNZXNzYWdlKE1GVF9NRVNTQUdFX1RZUEUgbXNnLCBVTE9OR19QVFIgZGF0YSA9IDApOwotCi0gIC8vIFJlc2V0IHRoZSBtZWRpYSB0cmFuc2Zvcm0gdG8gaXRzIG9yaWdpbmFsIHN0YXRlLgotICB2b2lkIFJlc2V0KCk7Ci0KLSBwcml2YXRlOgotICBlbnVtIFN0YXRlIHsga0NhbkFjY2VwdElucHV0LCBrQ2FuUHJvdmlkZU91dHB1dCwga0RyYWluaW5nLCBrRHJhaW5lZCB9OwotCi0gIHZvaWQgUHJlcGFyZU91dHB1dERhdGFCdWZmZXIoTUZUX09VVFBVVF9EQVRBX0JVRkZFUiogb3V0cHV0X2RhdGFfYnVmZmVyKTsKLSAgSFJFU1VMVCBQcm9jZXNzT3V0cHV0KE1pY3Jvc29mdDo6V1JMOjpDb21QdHI8SU1GU2FtcGxlPiogc2FtcGxlKTsKLQotICBNaWNyb3NvZnQ6OldSTDo6Q29tUHRyPElNRlRyYW5zZm9ybT4gdHJhbnNmb3JtXzsKLQotICA6OnN0YXJib2FyZDo6c2hhcmVkOjpzdGFyYm9hcmQ6OlRocmVhZENoZWNrZXIgdGhyZWFkX2NoZWNrZXJfOwotICBTdGF0ZSBzdGF0ZV87Ci0gIGJvb2wgc3RyZWFtX2JlZ3VuXzsKLSAgYm9vbCBkaXNjb250aW51aXR5XzsKLSAgYm9vbCB0aHJvdHRsZV9pbnB1dHNfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHdpbjMyCi19ICAvLyBuYW1lc3BhY2Ugc2hhcmVkCi19ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCi0KLSNlbmRpZiAgLy8gU1RBUkJPQVJEX1NIQVJFRF9XSU4zMl9NRURJQV9UUkFOU0ZPUk1fSF8KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL21lbW9yeV9hbGxvY2F0ZV9hbGlnbmVkX3VuY2hlY2tlZC5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL21lbW9yeV9hbGxvY2F0ZV9hbGlnbmVkX3VuY2hlY2tlZC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIxNjFmYi4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9tZW1vcnlfYWxsb2NhdGVfYWxpZ25lZF91bmNoZWNrZWQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgotCi0jaW5jbHVkZSA8bWFsbG9jLmg+Ci0KLXZvaWQqIFNiTWVtb3J5QWxsb2NhdGVBbGlnbmVkVW5jaGVja2VkKHNpemVfdCBhbGlnbm1lbnQsIHNpemVfdCBzaXplKSB7Ci0gIHJldHVybiBfYWxpZ25lZF9tYWxsb2Moc2l6ZSwgYWxpZ25tZW50KTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL21lbW9yeV9hbGxvY2F0ZV91bmNoZWNrZWQuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9tZW1vcnlfYWxsb2NhdGVfdW5jaGVja2VkLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTg1ZjkxLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL21lbW9yeV9hbGxvY2F0ZV91bmNoZWNrZWQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgotCi0jaW5jbHVkZSA8d2luZG93cy5oPgotCi12b2lkKiBTYk1lbW9yeUFsbG9jYXRlVW5jaGVja2VkKHNpemVfdCBzaXplKSB7Ci0gIHJldHVybiBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2l6ZSk7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9tZW1vcnlfZnJlZS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL21lbW9yeV9mcmVlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmI4M2ZjLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL21lbW9yeV9mcmVlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLQotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotdm9pZCBTYk1lbW9yeUZyZWUodm9pZCogbWVtb3J5KSB7Ci0gIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIG1lbW9yeSk7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9tZW1vcnlfZnJlZV9hbGlnbmVkLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbWVtb3J5X2ZyZWVfYWxpZ25lZC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQwZDBjNi4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9tZW1vcnlfZnJlZV9hbGlnbmVkLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLQotI2luY2x1ZGUgPG1hbGxvYy5oPgotCi12b2lkIFNiTWVtb3J5RnJlZUFsaWduZWQodm9pZCogbWVtb3J5KSB7Ci0gIF9hbGlnbmVkX2ZyZWUobWVtb3J5KTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL21lbW9yeV9nZXRfc3RhY2tfYm91bmRzLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbWVtb3J5X2dldF9zdGFja19ib3VuZHMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYzg3N2UuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbWVtb3J5X2dldF9zdGFja19ib3VuZHMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgotCi0jaW5jbHVkZSA8d2luZG93cy5oPgotCi12b2lkIFNiTWVtb3J5R2V0U3RhY2tCb3VuZHModm9pZCoqIG91dF9oaWdoLCB2b2lkKiogb3V0X2xvdykgewotICBfTlRfVElCKiB0aWIgPSByZWludGVycHJldF9jYXN0PF9OVF9USUIqPihOdEN1cnJlbnRUZWIoKSk7Ci0gICpvdXRfaGlnaCA9IHRpYi0+U3RhY2tCYXNlOwotICAqb3V0X2xvdyA9IHRpYi0+U3RhY2tMaW1pdDsKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL21lbW9yeV9tYXAuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9tZW1vcnlfbWFwLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTRhNWVjLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL21lbW9yeV9tYXAuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgotCi0jaW5jbHVkZSA8d2luZG93cy5oPgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL21lbW9yeV9yZXBvcnRlcl9pbnRlcm5hbC5oIgotCi12b2lkKiBTYk1lbW9yeU1hcChpbnQ2NF90IHNpemVfYnl0ZXMsIGludCBmbGFncywgY29uc3QgY2hhciogbmFtZSkgewotICBTQl9VTlJFRkVSRU5DRURfUEFSQU1FVEVSKG5hbWUpOwotICBpZiAoc2l6ZV9ieXRlcyA9PSAwKSB7Ci0gICAgcmV0dXJuIFNCX01FTU9SWV9NQVBfRkFJTEVEOwotICB9Ci0gIFVMT05HIHByb3RlY3QgPSBQQUdFX05PQUNDRVNTOwotICAvLyB8ZmxhZ3N8IGlzIGEgYml0bWFzayBvZiBTYk1lbW9yeU1hcEZsYWdzLCBidXQgfHByb3RlY3R8IGlzIG5vdCBhIGJpdG1hc2suCi0gIHN3aXRjaCAoZmxhZ3MpIHsKLSAgICBjYXNlIGtTYk1lbW9yeU1hcFByb3RlY3RSZWFkOgotICAgICAgcHJvdGVjdCA9IFBBR0VfUkVBRE9OTFk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGtTYk1lbW9yeU1hcFByb3RlY3RXcml0ZToKLSAgICAgIC8vIFdpbmRvd3MgZG9lcyBub3QgcHJvdmlkZSB3cml0ZSBvbmx5IG1vZGUgcHJpdmlsZWdlcwotICAgICAgLy8gYXJlIGVzY2FsYXRlZCB0byByZWFkL3dyaXRlLgotICAgIGNhc2Uga1NiTWVtb3J5TWFwUHJvdGVjdFJlYWRXcml0ZToKLSAgICAgIHByb3RlY3QgPSBQQUdFX1JFQURXUklURTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBTQl9OT1RSRUFDSEVEKCk7Ci0gIH0KLSAgdm9pZCogbWVtb3J5ID0gVmlydHVhbEFsbG9jRnJvbUFwcChOVUxMLCBzaXplX2J5dGVzLCBNRU1fQ09NTUlULCBwcm90ZWN0KTsKLSAgaWYgKFBBR0VfUkVBRE9OTFkgIT0gcHJvdGVjdCkgewotICAgIFNiTWVtb3J5UmVwb3J0ZXJSZXBvcnRNYXBwZWRNZW1vcnkobWVtb3J5LCBzaXplX2J5dGVzKTsKLSAgfQotICByZXR1cm4gbWVtb3J5OwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbWVtb3J5X3JlYWxsb2NhdGVfdW5jaGVja2VkLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbWVtb3J5X3JlYWxsb2NhdGVfdW5jaGVja2VkLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGVlNjg5Li4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL21lbW9yeV9yZWFsbG9jYXRlX3VuY2hlY2tlZC5jYworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCi0KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLXZvaWQqIFNiTWVtb3J5UmVhbGxvY2F0ZVVuY2hlY2tlZCh2b2lkKiBtZW1vcnksIHNpemVfdCBzaXplKSB7Ci0gIGlmIChtZW1vcnkgPT0gTlVMTCkgewotICAgIHJldHVybiBTYk1lbW9yeUFsbG9jYXRlVW5jaGVja2VkKHNpemUpOwotICB9Ci0gIHJldHVybiBIZWFwUmVBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBtZW1vcnksIHNpemUpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbWVtb3J5X3VubWFwLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbWVtb3J5X3VubWFwLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWY2MmZiLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL21lbW9yeV91bm1hcC5jYworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCi0KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9tZW1vcnlfcmVwb3J0ZXJfaW50ZXJuYWwuaCIKLQotYm9vbCBTYk1lbW9yeVVubWFwKHZvaWQqIHZpcnR1YWxfYWRkcmVzcywgaW50NjRfdCBzaXplX2J5dGVzKSB7Ci0gIC8vIE5vdGUgdGhhdCBTYk1lbW9yeVVubWFwIGRvY3VtZW50YXRpb24gc2F5cyB0aGF0ICJUaGlzIGZ1bmN0aW9uIGNhbgotICAvLyB1bm1hcCBtdWx0aXBsZSBjb250aWd1b3VzIHJlZ2lvbnMgdGhhdCB3ZXJlIG1hcHBlZCB3aXRoIHNlcGFyYXRlIGNhbGxzCi0gIC8vIHRvIFNiTWVtb3J5TWFwKCkiLiBCZWNhdXNlIG9mIHRoYXQsIHdlIGNhbm5vdCB1c2UgTUVNX0ZSRUUgaGVyZS4KLSAgU2JNZW1vcnlSZXBvcnRlclJlcG9ydFVubWFwcGVkTWVtb3J5KHZpcnR1YWxfYWRkcmVzcywgc2l6ZV9ieXRlcyk7Ci0gIHJldHVybiBWaXJ0dWFsRnJlZSh2aXJ0dWFsX2FkZHJlc3MsIHNpemVfYnl0ZXMsIE1FTV9ERUNPTU1JVCk7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9tdXRleF9hY3F1aXJlLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbXV0ZXhfYWNxdWlyZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFjYTA1ZC4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9tdXRleF9hY3F1aXJlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9tdXRleC5oIgotCi0jaW5jbHVkZSA8d2luZG93cy5oPgotCi1TYk11dGV4UmVzdWx0IFNiTXV0ZXhBY3F1aXJlKFNiTXV0ZXgqIG11dGV4KSB7Ci0gIEFjcXVpcmVTUldMb2NrRXhjbHVzaXZlKHJlaW50ZXJwcmV0X2Nhc3Q8UFNSV0xPQ0s+KG11dGV4KSk7Ci0gIHJldHVybiBrU2JNdXRleEFjcXVpcmVkOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbXV0ZXhfYWNxdWlyZV90cnkuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9tdXRleF9hY3F1aXJlX3RyeS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM0Y2VlMi4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9tdXRleF9hY3F1aXJlX3RyeS5jYworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvbXV0ZXguaCIKLQotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotU2JNdXRleFJlc3VsdCBTYk11dGV4QWNxdWlyZVRyeShTYk11dGV4KiBtdXRleCkgewotICBib29sIHJlc3VsdCA9IFRyeUFjcXVpcmVTUldMb2NrRXhjbHVzaXZlKHJlaW50ZXJwcmV0X2Nhc3Q8UFNSV0xPQ0s+KG11dGV4KSk7Ci0gIHJldHVybiByZXN1bHQgPyBrU2JNdXRleEFjcXVpcmVkIDoga1NiTXV0ZXhCdXN5OwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbXV0ZXhfY3JlYXRlLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbXV0ZXhfY3JlYXRlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTRjMWNlLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL211dGV4X2NyZWF0ZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvbXV0ZXguaCIKLQotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotYm9vbCBTYk11dGV4Q3JlYXRlKFNiTXV0ZXgqIG11dGV4KSB7Ci0gIGlmICghbXV0ZXgpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgSW5pdGlhbGl6ZVNSV0xvY2socmVpbnRlcnByZXRfY2FzdDxQU1JXTE9DSz4obXV0ZXgpKTsKLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9tdXRleF9kZXN0cm95LmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbXV0ZXhfZGVzdHJveS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAyODY4Ny4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9tdXRleF9kZXN0cm95LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9tdXRleC5oIgotCi0jaW5jbHVkZSA8d2luZG93cy5oPgotCi1ib29sIFNiTXV0ZXhEZXN0cm95KFNiTXV0ZXgqIG11dGV4KSB7Ci0gIGlmICghbXV0ZXgpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKFNiTXV0ZXhBY3F1aXJlVHJ5KG11dGV4KSA9PSBrU2JNdXRleEJ1c3kpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9tdXRleF9yZWxlYXNlLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbXV0ZXhfcmVsZWFzZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM1MDA5MC4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9tdXRleF9yZWxlYXNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9tdXRleC5oIgotCi0jaW5jbHVkZSA8d2luZG93cy5oPgotCi1ib29sIFNiTXV0ZXhSZWxlYXNlKFNiTXV0ZXgqIG11dGV4KSB7Ci0gIFJlbGVhc2VTUldMb2NrRXhjbHVzaXZlKHJlaW50ZXJwcmV0X2Nhc3Q8UFNSV0xPQ0s+KG11dGV4KSk7Ci0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvb25jZS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL29uY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MDkxNmMuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvb25jZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvb25jZS5oIgotCi0jaW5jbHVkZSA8d2luZG93cy5oPgotCi1uYW1lc3BhY2UgewotQk9PTCBDQUxMQkFDSyBPbmNlVHJhbXBvbGluZShQSU5JVF9PTkNFIG9uY2VfY29udHJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW1ldGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiogY29udGV4dCkgewotICBTQl9VTlJFRkVSRU5DRURfUEFSQU1FVEVSKGNvbnRleHQpOwotICBTQl9VTlJFRkVSRU5DRURfUEFSQU1FVEVSKG9uY2VfY29udHJvbCk7Ci0gIHN0YXRpY19jYXN0PFNiT25jZUluaXRSb3V0aW5lPihwYXJhbWV0ZXIpKCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotYm9vbCBTYk9uY2UoU2JPbmNlQ29udHJvbCogb25jZV9jb250cm9sLCBTYk9uY2VJbml0Um91dGluZSBpbml0X3JvdXRpbmUpIHsKLSAgaWYgKCFvbmNlX2NvbnRyb2wgfHwgIWluaXRfcm91dGluZSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gSW5pdE9uY2VFeGVjdXRlT25jZShyZWludGVycHJldF9jYXN0PFBJTklUX09OQ0U+KG9uY2VfY29udHJvbCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uY2VUcmFtcG9saW5lLCBpbml0X3JvdXRpbmUsIE5VTEwpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvcGxheWVyX2NvbXBvbmVudHNfaW1wbC5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3BsYXllcl9jb21wb25lbnRzX2ltcGwuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0YTcwYjIuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvcGxheWVyX2NvbXBvbmVudHNfaW1wbC5jYworKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3BsYXllcl9jb21wb25lbnRzLmgiCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvY29tbW9uL3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL2NvbW1vbi9zY29wZWRfcHRyLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9hdWRpb19kZWNvZGVyX2ludGVybmFsLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9hdWRpb19yZW5kZXJlcl9zaW5rX2ltcGwuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3ZpZGVvX2RlY29kZXJfaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3ZpZGVvX3JlbmRlcl9hbGdvcml0aG0uaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3ZpZGVvX3JlbmRlcl9hbGdvcml0aG1faW1wbC5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdmlkZW9fcmVuZGVyZXJfc2luay5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvYXVkaW9fZGVjb2Rlci5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvdmlkZW9fZGVjb2Rlci5oIgotCi1uYW1lc3BhY2Ugc3RhcmJvYXJkIHsKLW5hbWVzcGFjZSBzaGFyZWQgewotbmFtZXNwYWNlIHN0YXJib2FyZCB7Ci1uYW1lc3BhY2UgcGxheWVyIHsKLW5hbWVzcGFjZSBmaWx0ZXIgewotCi1uYW1lc3BhY2UgewotCi1jbGFzcyBQbGF5ZXJDb21wb25lbnRzSW1wbCA6IHB1YmxpYyBQbGF5ZXJDb21wb25lbnRzIHsKLSAgdm9pZCBDcmVhdGVBdWRpb0NvbXBvbmVudHMoCi0gICAgICBjb25zdCBBdWRpb1BhcmFtZXRlcnMmIGF1ZGlvX3BhcmFtZXRlcnMsCi0gICAgICBzY29wZWRfcHRyPEF1ZGlvRGVjb2Rlcj4qIGF1ZGlvX2RlY29kZXIsCi0gICAgICBzY29wZWRfcHRyPEF1ZGlvUmVuZGVyZXJTaW5rPiogYXVkaW9fcmVuZGVyZXJfc2luaykgb3ZlcnJpZGUgewotICAgIHVzaW5nIEF1ZGlvRGVjb2RlckltcGwgPSA6OnN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6QXVkaW9EZWNvZGVyOwotCi0gICAgU0JfRENIRUNLKGF1ZGlvX2RlY29kZXIpOwotICAgIFNCX0RDSEVDSyhhdWRpb19yZW5kZXJlcl9zaW5rKTsKLQotICAgIGF1ZGlvX2RlY29kZXItPnJlc2V0KG5ldyBBdWRpb0RlY29kZXJJbXBsKGF1ZGlvX3BhcmFtZXRlcnMuYXVkaW9fY29kZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGFyYW1ldGVycy5hdWRpb19oZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGFyYW1ldGVycy5kcm1fc3lzdGVtKSk7Ci0gICAgYXVkaW9fcmVuZGVyZXJfc2luay0+cmVzZXQobmV3IEF1ZGlvUmVuZGVyZXJTaW5rSW1wbCk7Ci0gIH0KLQotICB2b2lkIENyZWF0ZVZpZGVvQ29tcG9uZW50cygKLSAgICAgIGNvbnN0IFZpZGVvUGFyYW1ldGVycyYgdmlkZW9fcGFyYW1ldGVycywKLSAgICAgIHNjb3BlZF9wdHI8VmlkZW9EZWNvZGVyPiogdmlkZW9fZGVjb2RlciwKLSAgICAgIHNjb3BlZF9wdHI8VmlkZW9SZW5kZXJBbGdvcml0aG0+KiB2aWRlb19yZW5kZXJfYWxnb3JpdGhtLAotICAgICAgc2NvcGVkX3JlZnB0cjxWaWRlb1JlbmRlcmVyU2luaz4qIHZpZGVvX3JlbmRlcmVyX3NpbmspIG92ZXJyaWRlIHsKLSAgICB1c2luZyBWaWRlb0RlY29kZXJJbXBsID0gOjpzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OlZpZGVvRGVjb2RlcjsKLQotICAgIFNCX0RDSEVDSyh2aWRlb19kZWNvZGVyKTsKLSAgICBTQl9EQ0hFQ0sodmlkZW9fcmVuZGVyX2FsZ29yaXRobSk7Ci0gICAgU0JfRENIRUNLKHZpZGVvX3JlbmRlcmVyX3NpbmspOwotCi0gICAgc2NvcGVkX3B0cjxWaWRlb0RlY29kZXJJbXBsPiB2aWRlb19kZWNvZGVyX2ltcGwobmV3IFZpZGVvRGVjb2RlckltcGwoCi0gICAgICAgIHZpZGVvX3BhcmFtZXRlcnMudmlkZW9fY29kZWMsIHZpZGVvX3BhcmFtZXRlcnMub3V0cHV0X21vZGUsCi0gICAgICAgIHZpZGVvX3BhcmFtZXRlcnMuZGVjb2RlX3RhcmdldF9ncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyLAotICAgICAgICB2aWRlb19wYXJhbWV0ZXJzLmRybV9zeXN0ZW0pKTsKLSAgICAqdmlkZW9fcmVuZGVyZXJfc2luayA9IHZpZGVvX2RlY29kZXJfaW1wbC0+R2V0U2luaygpOwotICAgIHZpZGVvX2RlY29kZXItPnJlc2V0KHZpZGVvX2RlY29kZXJfaW1wbC5yZWxlYXNlKCkpOwotICAgIHZpZGVvX3JlbmRlcl9hbGdvcml0aG0tPnJlc2V0KG5ldyBWaWRlb1JlbmRlckFsZ29yaXRobUltcGwpOwotICB9Ci0KLSAgdm9pZCBHZXRBdWRpb1JlbmRlcmVyUGFyYW1zKGludCogbWF4X2NhY2hlZF9mcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIG1heF9mcmFtZXNfcGVyX2FwcGVuZCkgY29uc3Qgb3ZlcnJpZGUgewotICAgIFNCX0RDSEVDSyhtYXhfY2FjaGVkX2ZyYW1lcyk7Ci0gICAgU0JfRENIRUNLKG1heF9mcmFtZXNfcGVyX2FwcGVuZCk7Ci0KLSAgICAqbWF4X2NhY2hlZF9mcmFtZXMgPSAyNTYgKiAxMDI0OwotICAgICptYXhfZnJhbWVzX3Blcl9hcHBlbmQgPSAxNjM4NDsKLSAgfQotfTsKLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIHN0YXRpYwotc2NvcGVkX3B0cjxQbGF5ZXJDb21wb25lbnRzPiBQbGF5ZXJDb21wb25lbnRzOjpDcmVhdGUoKSB7Ci0gIHJldHVybiBtYWtlX3Njb3BlZF9wdHI8UGxheWVyQ29tcG9uZW50cz4obmV3IFBsYXllckNvbXBvbmVudHNJbXBsKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGZpbHRlcgotfSAgLy8gbmFtZXNwYWNlIHBsYXllcgotfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZAotfSAgLy8gbmFtZXNwYWNlIHNoYXJlZAotfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvcGxheXJlYWR5X2xpY2Vuc2UuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9wbGF5cmVhZHlfbGljZW5zZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI5YjExZS4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9wbGF5cmVhZHlfbGljZW5zZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2RybV9zeXN0ZW1fcGxheXJlYWR5LmgiCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvY29uZmlndXJhdGlvbi5oIgotCi1uYW1lc3BhY2Ugc3RhcmJvYXJkIHsKLW5hbWVzcGFjZSBzaGFyZWQgewotbmFtZXNwYWNlIHdpbjMyIHsKLQotc2NvcGVkX3JlZnB0cjxTYkRybVN5c3RlbVBsYXlyZWFkeTo6TGljZW5zZT4KLVNiRHJtU3lzdGVtUGxheXJlYWR5OjpMaWNlbnNlOjpDcmVhdGUoY29uc3Qgdm9pZCogaW5pdGlhbGl6YXRpb25fZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluaXRpYWxpemF0aW9uX2RhdGFfc2l6ZSkgewotICBTQl9VTlJFRkVSRU5DRURfUEFSQU1FVEVSKGluaXRpYWxpemF0aW9uX2RhdGEpOwotICBTQl9VTlJFRkVSRU5DRURfUEFSQU1FVEVSKGluaXRpYWxpemF0aW9uX2RhdGFfc2l6ZSk7Ci0gIHJldHVybiBOVUxMOwotfQotCi19ICAvLyBuYW1lc3BhY2Ugd2luMzIKLX0gIC8vIG5hbWVzcGFjZSBzaGFyZWQKLX0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3Nka19jb25maWd1cmF0aW9uLnB5IGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc2RrX2NvbmZpZ3VyYXRpb24ucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZDEwM2QuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc2RrX2NvbmZpZ3VyYXRpb24ucHkKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0jIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWltcG9ydCBsb2dnaW5nCi1pbXBvcnQgb3MKLQotY2xhc3MgU2RrQ29uZmlndXJhdGlvbjoKLSAgcmVxdWlyZWRfc2RrX3ZlcnNpb24gPSAnMTAuMC4xNTA2My4wJwotCi0gICMgRGVmYXVsdCBXaW5kb3dzIFNESyBiaW4gZGlyZWN0b3J5LgotICB3aW5kb3dzX3Nka19iaW5fZGlyID0gJ0M6XFxQcm9ncmFtIEZpbGVzICh4ODYpXFxXaW5kb3dzIEtpdHNcXDEwXFxiaW4nCi0KLSAgIyB3aW5kb3dzX3Nka19ob3N0X3Rvb2xzIHdpbGwgYmUgc2V0IHRvLCBlZywKLSAgIyAnQzpcXFByb2dyYW0gRmlsZXMgKHg4NilcXFdpbmRvd3MgS2l0c1xcMTBcXGJpblwxMC4wLjE1MDYzLjAnCi0KLSAgIyB3aW5kb3dzX3Nka19wYXRoIHdpbGwgYmUgc2V0IHRvLCBlZwotICAjICdDOlxcUHJvZ3JhbSBGaWxlcyAoeDg2KVxcV2luZG93cyBLaXRzXFwxMCcKLQotICAjIERlZmF1bHQgVmlzdWFsIFN0dWRpbyBJbnN0YWxsIGRpcmVjdG9yeS4KLSAgdnNfaW5zdGFsbF9kaXIgPSAoJ0M6XFxQcm9ncmFtIEZpbGVzICh4ODYpXFxNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbycKLSAgICAgICAgICAgICAgICAgICAgKyAnXFwyMDE3XFxQcm9mZXNzaW9uYWwnKQotCi0gICMgdnNfaW5zdGFsbF9kaXJfd2l0aF92ZXJzaW9uIHdpbGwgYmUgc2V0IHRvLCBlZwotICAjICJDOlxQcm9ncmFtIEZpbGVzICh4ODYpXE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvXDIwMTdcUHJvZmVzc2lvbmFsXFZDXFRvb2xzCi0gICMgXE1TVkNcMTQuMTAuMjUwMTcKLQotICAjIHZzX2hvc3RfdG9vbHNfcGF0aCB3aWxsIGJlIHNldCB0bywgZWcKLSAgIyAiQzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxNaWNyb3NvZnQgVmlzdWFsIFN0dWRpb1wyMDE3XFByb2Zlc3Npb25hbFxWQ1xUb29scwotICAjIFxNU1ZDXDE0LjEwLjI1MDE3XGJpblxIb3N0WDY0XHg2NAotCi0gIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAjIE1heWJlIG92ZXJyaWRlIFdpbmRvd3MgU0RLIGJpbiBkaXJlY3Rvcnkgd2l0aCBlbnZpcm9ubWVudCB2YXJpYWJsZS4KLSAgICB3aW5kb3dzX3Nka19iaW5fdmFyID0gJ1dpbmRvd3NTZGtCaW5QYXRoJwotICAgIGlmIHdpbmRvd3Nfc2RrX2Jpbl92YXIgaW4gb3MuZW52aXJvbjoKLSAgICAgIHNlbGYud2luZG93c19zZGtfYmluX2RpciA9IG9zLmVudmlyb25bd2luZG93c19zZGtfYmluX3Zhcl0KLSAgICBlbGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLndpbmRvd3Nfc2RrX2Jpbl9kaXIpOgotICAgICAgIyBJZiB0aGUgYWJvdmUgZmFpbHMsIHRoaXMgaXMgb3VyIGxhc3QgZ3Vlc3MuCi0gICAgICBzZWxmLndpbmRvd3Nfc2RrX2Jpbl9kaXIgPSBzZWxmLndpbmRvd3Nfc2RrX2Jpbl9kaXIucmVwbGFjZSgKLSAgICAgICAgJ1Byb2dyYW0gRmlsZXMgKHg4NiknLCAnbWFwcGVkUHJvZ3JhbUZpbGVzJykKLQotICAgIHNlbGYud2luZG93c19zZGtfaG9zdF90b29scyA9IG9zLnBhdGguam9pbigKLSAgICAgICAgc2VsZi53aW5kb3dzX3Nka19iaW5fZGlyLCBzZWxmLnJlcXVpcmVkX3Nka192ZXJzaW9uLCAneDY0JykKLQotICAgIHNlbGYud2luZG93c19zZGtfcGF0aCA9IG9zLnBhdGguZGlybmFtZShzZWxmLndpbmRvd3Nfc2RrX2Jpbl9kaXIpCi0KLSAgICAjIE1heWJlIG92ZXJyaWRlIFZpc3VhbCBTdHVkaW8gaW5zdGFsbCBkaXJlY3Rvcnkgd2l0aCBlbnZpcm9ubWVudCB2YXJpYWJsZS4KLSAgICB2c19pbnN0YWxsX2Rpcl92YXIgPSAnVlNJTlNUQUxMRElSJwotICAgIGlmIHZzX2luc3RhbGxfZGlyX3ZhciBpbiBvcy5lbnZpcm9uOgotICAgICAgc2VsZi52c19pbnN0YWxsX2RpciA9IG9zLmVudmlyb25bdnNfaW5zdGFsbF9kaXJfdmFyXQotICAgIGVsaWYgbm90IG9zLnBhdGguZXhpc3RzKHNlbGYudnNfaW5zdGFsbF9kaXIpOgotICAgICAgIyBJZiB0aGUgYWJvdmUgZmFpbHMsIHRoaXMgaXMgb3VyIGxhc3QgZ3Vlc3MuCi0gICAgICBzZWxmLnZzX2luc3RhbGxfZGlyID0gc2VsZi52c19pbnN0YWxsX2Rpci5yZXBsYWNlKCdQcm9ncmFtIEZpbGVzICh4ODYpJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcHBlZFByb2dyYW1GaWxlcycpCi0KLSAgICBzZWxmLnZzX2luc3RhbGxfZGlyX3dpdGhfdmVyc2lvbiA9IChzZWxmLnZzX2luc3RhbGxfZGlyCi0gICAgICAgICsgJ1xcVkNcXFRvb2xzXFxNU1ZDJyArICdcXDE0LjEwLjI1MDE3JykKLSAgICBzZWxmLnZzX2hvc3RfdG9vbHNfcGF0aCA9IChzZWxmLnZzX2luc3RhbGxfZGlyX3dpdGhfdmVyc2lvbgotICAgICAgICArICdcXGJpblxcSG9zdFg2NFxceDY0JykKLQotICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLnZzX2hvc3RfdG9vbHNfcGF0aCk6Ci0gICAgICBsb2dnaW5nLmNyaXRpY2FsKCdFeHBlY3RlZCBWaXN1YWwgU3R1ZGlvIHBhdGggXCIlc1wiIG5vdCBmb3VuZC4nLAotICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnZzX2hvc3RfdG9vbHNfcGF0aCkKLSAgICBzZWxmLl9DaGVja1dpbmRvd3NTZGtWZXJzaW9uKCkKLQotICBkZWYgX0NoZWNrV2luZG93c1Nka1ZlcnNpb24oc2VsZik6Ci0gICAgaWYgb3MucGF0aC5leGlzdHMoc2VsZi53aW5kb3dzX3Nka19ob3N0X3Rvb2xzKToKLSAgICAgIHJldHVybiBUcnVlCi0KLSAgICBpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLndpbmRvd3Nfc2RrX2Jpbl9kaXIpOgotICAgICAgY29udGVudHMgPSBvcy5saXN0ZGlyKHNlbGYud2luZG93c19zZGtfYmluX2RpcikKLSAgICAgIGNvbnRlbnRzID0gW2NvbnRlbnQgZm9yIGNvbnRlbnQgaW4gY29udGVudHMKLSAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoCi0gICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihzZWxmLndpbmRvd3Nfc2RrX2Jpbl9kaXIsIGNvbnRlbnQpKV0KLSAgICAgIG5vbl9zZGtfZGlycyA9IFsnYXJtJywgJ2FybTY0JywgJ3g2NCcsICd4ODYnXQotICAgICAgaW5zdGFsbGVkX3Nka3MgPSBbY29udGVudCBmb3IgY29udGVudCBpbiBjb250ZW50cwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgY29udGVudCBub3QgaW4gbm9uX3Nka19kaXJzXQotICAgICAgbG9nZ2luZy5jcml0aWNhbCgnV2luZG93cyBTREsgdmVyc2lvbnMgXCIlc1wiIGZvdW5kLiIgXCIlc1wiIHJlcXVpcmVkLicsCi0gICAgICAgICAgICAgICAgICAgICAgIGluc3RhbGxlZF9zZGtzLCBzZWxmLnJlcXVpcmVkX3Nka192ZXJzaW9uKQotICAgIGVsc2U6Ci0gICAgICBsb2dnaW5nLmNyaXRpY2FsKCdXaW5kb3dzIFNESyB2ZXJzaW9ucyBcIiVzXCIgcmVxdWlyZWQuJywKLSAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXF1aXJlZF9zZGtfdmVyc2lvbikKLSAgICByZXR1cm4gRmFsc2UKLQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc2V0X25vbl9ibG9ja2luZ19pbnRlcm5hbC5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NldF9ub25fYmxvY2tpbmdfaW50ZXJuYWwuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ZDc0YWEuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc2V0X25vbl9ibG9ja2luZ19pbnRlcm5hbC5jYworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NldF9ub25fYmxvY2tpbmdfaW50ZXJuYWwuaCIKLQotI2luY2x1ZGUgPHdpbnNvY2syLmg+Ci0KLW5hbWVzcGFjZSBzdGFyYm9hcmQgewotbmFtZXNwYWNlIHNoYXJlZCB7Ci1uYW1lc3BhY2Ugd2luMzIgewotCi1ib29sIFNldE5vbkJsb2NraW5nKFNPQ0tFVCBzb2NrZXRfaGFuZGxlKSB7Ci0gIHVfbG9uZyBrT25lID0gMTsKLSAgYm9vbCBzdWNjZXNzID0gKGlvY3Rsc29ja2V0KHNvY2tldF9oYW5kbGUsIEZJT05CSU8sICZrT25lKSA9PSAwKTsKLSAgcmV0dXJuIHN1Y2Nlc3M7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB3aW4zMgotfSAgLy8gbmFtZXNwYWNlIHNoYXJlZAotfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc2V0X25vbl9ibG9ja2luZ19pbnRlcm5hbC5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc2V0X25vbl9ibG9ja2luZ19pbnRlcm5hbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDVhMTRiLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NldF9ub25fYmxvY2tpbmdfaW50ZXJuYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpZm5kZWYgU1RBUkJPQVJEX1NIQVJFRF9XSU4zMl9TRVRfTk9OX0JMT0NLSU5HX0lOVEVSTkFMX0hfCi0jZGVmaW5lIFNUQVJCT0FSRF9TSEFSRURfV0lOMzJfU0VUX05PTl9CTE9DS0lOR19JTlRFUk5BTF9IXwotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9pbnRlcm5hbF9vbmx5LmgiCi0KLSNpbmNsdWRlIDx3aW5zb2NrMi5oPgotCi1uYW1lc3BhY2Ugc3RhcmJvYXJkIHsKLW5hbWVzcGFjZSBzaGFyZWQgewotbmFtZXNwYWNlIHdpbjMyIHsKLQotLy8gTWFrZXMgdGhlIHNvY2tldCBmaWxlIGRlc2NyaXB0b3Igbm9uLWJsb2NraW5nLgotYm9vbCBTZXROb25CbG9ja2luZyhTT0NLRVQgc29ja2V0X2hhbmRsZSk7Ci0KLX0gIC8vIG5hbWVzcGFjZSB3aW4zMgotfSAgLy8gbmFtZXNwYWNlIHNoYXJlZAotfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZAotCi0jZW5kaWYgIC8vIFNUQVJCT0FSRF9TSEFSRURfV0lOMzJfU0VUX05PTl9CTE9DS0lOR19JTlRFUk5BTF9IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X2FjY2VwdC5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF9hY2NlcHQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmYzY4ZGIuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X2FjY2VwdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc29ja2V0LmgiCi0KLSNpbmNsdWRlIDx3aW5zb2NrMi5oPgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvc2V0X25vbl9ibG9ja2luZ19pbnRlcm5hbC5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X2ludGVybmFsLmgiCi0KLW5hbWVzcGFjZSBzYndpbjMyID0gc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOwotCi1TYlNvY2tldCBTYlNvY2tldEFjY2VwdChTYlNvY2tldCBzb2NrZXQpIHsKLSAgaWYgKCFTYlNvY2tldElzVmFsaWQoc29ja2V0KSkgewotICAgIHJldHVybiBrU2JTb2NrZXRJbnZhbGlkOwotICB9Ci0KLSAgU0JfRENIRUNLKHNvY2tldC0+c29ja2V0X2hhbmRsZSAhPSBJTlZBTElEX1NPQ0tFVCk7Ci0KLSAgU09DS0VUIHNvY2tldF9oYW5kbGUgPSBhY2NlcHQoc29ja2V0LT5zb2NrZXRfaGFuZGxlLCBudWxscHRyLCBudWxscHRyKTsKLSAgaWYgKHNvY2tldF9oYW5kbGUgPT0gSU5WQUxJRF9TT0NLRVQpIHsKLSAgICBzb2NrZXQtPmVycm9yID0gc2J3aW4zMjo6VHJhbnNsYXRlU29ja2V0RXJyb3JTdGF0dXMoV1NBR2V0TGFzdEVycm9yKCkpOwotICAgIHJldHVybiBrU2JTb2NrZXRJbnZhbGlkOwotICB9Ci0KLSAgLy8gQWxsIFN0YXJib2FyZCBzb2NrZXRzIGFyZSBub24tYmxvY2tpbmcsIHNvIGxldCdzIGVuc3VyZSBpdC4KLSAgaWYgKCFzYndpbjMyOjpTZXROb25CbG9ja2luZyhzb2NrZXRfaGFuZGxlKSkgewotICAgIC8vIFNvbWV0aGluZyB3ZW50IHdyb25nLCB3ZSdsbCBjbGVhbiB1cCBhbmQgcmV0dXJuIGZhaWx1cmUuCi0gICAgc29ja2V0LT5lcnJvciA9IHNid2luMzI6OlRyYW5zbGF0ZVNvY2tldEVycm9yU3RhdHVzKFdTQUdldExhc3RFcnJvcigpKTsKLSAgICBjbG9zZXNvY2tldChzb2NrZXRfaGFuZGxlKTsKLSAgICByZXR1cm4ga1NiU29ja2V0SW52YWxpZDsKLSAgfQotCi0gIHNvY2tldC0+ZXJyb3IgPSBrU2JTb2NrZXRPazsKLQotICAvLyBBZG9wdCB0aGUgbmV3bHkgYWNjZXB0ZWQgc29ja2V0LgotICByZXR1cm4gbmV3IFNiU29ja2V0UHJpdmF0ZShzb2NrZXQtPmFkZHJlc3NfdHlwZSwgc29ja2V0LT5wcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JTb2NrZXRQcml2YXRlOjpCaW5kVGFyZ2V0OjprQWNjZXB0ZWQpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X2JpbmQuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfYmluZC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAwYzhlMS4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfYmluZC5jYworKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc29ja2V0LmgiCi0KLSNpbmNsdWRlIDx3aW5zb2NrMi5oPgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF9pbnRlcm5hbC5oIgotCi1uYW1lc3BhY2Ugc2J3aW4zMiA9IHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjsKLQotbmFtZXNwYWNlIHsKLQotYm9vbCBJc0lwdjZJbmFkZHJBbnkoY29uc3QgU2JTb2NrZXRBZGRyZXNzKiBsb2NhbF9hZGRyZXNzKSB7Ci0gIHJldHVybiBTYk1lbW9yeUlzWmVybyhsb2NhbF9hZGRyZXNzLT5hZGRyZXNzLCBzYndpbjMyOjprQWRkcmVzc0xlbmd0aElwdjYpOwotfQotYm9vbCBJc0lwdjRJbmFkZHJBbnkoY29uc3QgU2JTb2NrZXRBZGRyZXNzKiBsb2NhbF9hZGRyZXNzKSB7Ci0gIHJldHVybiBTYk1lbW9yeUlzWmVybyhsb2NhbF9hZGRyZXNzLT5hZGRyZXNzLCBzYndpbjMyOjprQWRkcmVzc0xlbmd0aElwdjQpOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotU2JTb2NrZXRFcnJvciBTYlNvY2tldEJpbmQoU2JTb2NrZXQgc29ja2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2JTb2NrZXRBZGRyZXNzKiBsb2NhbF9hZGRyZXNzKSB7Ci0gIGlmICghU2JTb2NrZXRJc1ZhbGlkKHNvY2tldCkpIHsKLSAgICBTQl9ETE9HKEVSUk9SKSA8PCBfX0ZVTkNUSU9OX18gPDwgIjogSW52YWxpZCBzb2NrZXQiOwotICAgIHJldHVybiBrU2JTb2NrZXRFcnJvckZhaWxlZDsKLSAgfQotCi0gIHNid2luMzI6OlNvY2tBZGRyIHNvY2tfYWRkcjsKLSAgaWYgKCFzb2NrX2FkZHIuRnJvbVNiU29ja2V0QWRkcmVzcyhsb2NhbF9hZGRyZXNzKSkgewotICAgIFNCX0RMT0coRVJST1IpIDw8IF9fRlVOQ1RJT05fXyA8PCAiOiBJbnZhbGlkIGFkZHJlc3MiOwotICAgIHJldHVybiAoc29ja2V0LT5lcnJvciA9IHNid2luMzI6OlRyYW5zbGF0ZVNvY2tldEVycm9yU3RhdHVzKEVJTlZBTCkpOwotICB9Ci0KLSAgU0JfRENIRUNLKHNvY2tldC0+c29ja2V0X2hhbmRsZSAhPSBJTlZBTElEX1NPQ0tFVCk7Ci0gIGlmIChsb2NhbF9hZGRyZXNzLT50eXBlICE9IHNvY2tldC0+YWRkcmVzc190eXBlKSB7Ci0gICAgU0JfRExPRyhFUlJPUikgPDwgX19GVU5DVElPTl9fIDw8ICI6IEluY29tcGF0aWJsZSBhZGRyZXNzZXM6ICIKLSAgICAgICAgICAgICAgICAgICA8PCAic29ja2V0IHR5cGUgPSAiIDw8IHNvY2tldC0+YWRkcmVzc190eXBlCi0gICAgICAgICAgICAgICAgICAgPDwgIiwgYXJndW1lbnQgdHlwZSA9ICIgPDwgbG9jYWxfYWRkcmVzcy0+dHlwZTsKLSAgICByZXR1cm4gKHNvY2tldC0+ZXJyb3IgPSBzYndpbjMyOjpUcmFuc2xhdGVTb2NrZXRFcnJvclN0YXR1cyhFQUZOT1NVUFBPUlQpKTsKLSAgfQotCi0gIHN3aXRjaCAobG9jYWxfYWRkcmVzcy0+dHlwZSkgewotICAgIGNhc2Uga1NiU29ja2V0QWRkcmVzc1R5cGVJcHY2OgotICAgICAgaWYgKCFJc0lwdjZJbmFkZHJBbnkobG9jYWxfYWRkcmVzcykpIHsKLSAgICAgICAgc29ja2V0LT5ib3VuZF90byA9IFNiU29ja2V0UHJpdmF0ZTo6QmluZFRhcmdldDo6a090aGVyOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgc29ja2V0LT5ib3VuZF90byA9IFNiU29ja2V0UHJpdmF0ZTo6QmluZFRhcmdldDo6a0FueTsKLQotICAgICAgLy8gV2hlbiBiaW5kaW5nIHRvIHRoZSBJUFY2IGFueSBhZGRyZXNzLCBlbnN1cmUgdGhhdCB0aGUgSVBWNl9WNk9OTFkgZmxhZwotICAgICAgLy8gaXMgb2ZmIHRvIGFsbG93IGluY29taW5nIElQVjQgY29ubmVjdGlvbnMgb24gdGhlIHNhbWUgc29ja2V0LgotICAgICAgLy8gU2VlIGh0dHBzOi8vd3d3LmlldGYub3JnL3JmYy9yZmMzNDkzLnR4dCBmb3IgZGV0YWlscy4KLSAgICAgIGlmICghc2J3aW4zMjo6U2V0Qm9vbGVhblNvY2tldE9wdGlvbihzb2NrZXQsIElQUFJPVE9fSVBWNiwgSVBWNl9WNk9OTFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklQVjZfVjZPTkxZIiwgZmFsc2UpKSB7Ci0gICAgICAgIC8vIFNpbGVudGx5IGlnbm9yZSBlcnJvcnMsIGFzc3VtZSB0aGUgZGVmYXVsdCBiZWhhdmlvciBpcyBhcyBleHBlY3RlZC4KLSAgICAgICAgc29ja2V0LT5lcnJvciA9IGtTYlNvY2tldE9rOwotICAgIH0KLQotICAgIGJyZWFrOwotICAgIGNhc2Uga1NiU29ja2V0QWRkcmVzc1R5cGVJcHY0OgotICAgICAgc29ja2V0LT5ib3VuZF90byA9IElzSXB2NEluYWRkckFueShsb2NhbF9hZGRyZXNzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFNiU29ja2V0UHJpdmF0ZTo6QmluZFRhcmdldDo6a0FueQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFNiU29ja2V0UHJpdmF0ZTo6QmluZFRhcmdldDo6a090aGVyOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICBpbnQgcmVzdWx0ID0KLSAgICAgIGJpbmQoc29ja2V0LT5zb2NrZXRfaGFuZGxlLCBzb2NrX2FkZHIuc29ja2FkZHIoKSwgc29ja19hZGRyLmxlbmd0aCk7Ci0gIGlmIChyZXN1bHQgPT0gU09DS0VUX0VSUk9SKSB7Ci0gICAgaW50IGxhc3RfZXJyb3IgPSBXU0FHZXRMYXN0RXJyb3IoKTsKLSAgICBTQl9ETE9HKEVSUk9SKSA8PCBfX0ZVTkNUSU9OX18KLSAgICAgICAgICAgICAgICAgICA8PCAiOiBCaW5kIGZhaWxlZC4gbGFzdF9lcnJvcj0iIDw8IGxhc3RfZXJyb3I7Ci0gICAgcmV0dXJuIChzb2NrZXQtPmVycm9yID0gc2J3aW4zMjo6VHJhbnNsYXRlU29ja2V0RXJyb3JTdGF0dXMobGFzdF9lcnJvcikpOwotICB9Ci0KLSAgcmV0dXJuIChzb2NrZXQtPmVycm9yID0ga1NiU29ja2V0T2spOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X2NsZWFyX2xhc3RfZXJyb3IuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfY2xlYXJfbGFzdF9lcnJvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MyOGQ5Yi4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfY2xlYXJfbGFzdF9lcnJvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc29ja2V0LmgiCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF9pbnRlcm5hbC5oIgotCi1ib29sIFNiU29ja2V0Q2xlYXJMYXN0RXJyb3IoU2JTb2NrZXQgc29ja2V0KSB7Ci0gIGlmICghU2JTb2NrZXRJc1ZhbGlkKHNvY2tldCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBzb2NrZXQtPmVycm9yID0ga1NiU29ja2V0T2s7Ci0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X2Nvbm5lY3QuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfY29ubmVjdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMzMzc2OC4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfY29ubmVjdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc29ja2V0LmgiCi0KLSNpbmNsdWRlIDx3aW5zb2NrMi5oPgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X2ludGVybmFsLmgiCi0KLW5hbWVzcGFjZSBzYndpbjMyID0gc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOwotCi1TYlNvY2tldEVycm9yIFNiU29ja2V0Q29ubmVjdChTYlNvY2tldCBzb2NrZXQsIGNvbnN0IFNiU29ja2V0QWRkcmVzcyogYWRkcmVzcykgewotICBpZiAoIVNiU29ja2V0SXNWYWxpZChzb2NrZXQpKSB7Ci0gICAgcmV0dXJuIGtTYlNvY2tldEVycm9yRmFpbGVkOwotICB9Ci0KLSAgc2J3aW4zMjo6U29ja0FkZHIgc29ja19hZGRyOwotICBpZiAoIXNvY2tfYWRkci5Gcm9tU2JTb2NrZXRBZGRyZXNzKGFkZHJlc3MpKSB7Ci0gICAgU0JfRExPRyhFUlJPUikgPDwgX19GVU5DVElPTl9fIDw8ICI6IEludmFsaWQgYWRkcmVzcyI7Ci0gICAgcmV0dXJuIChzb2NrZXQtPmVycm9yID0ga1NiU29ja2V0RXJyb3JGYWlsZWQpOwotICB9Ci0KLSAgU0JfRENIRUNLKHNvY2tldC0+c29ja2V0X2hhbmRsZSAhPSBJTlZBTElEX1NPQ0tFVCk7Ci0gIGlmIChhZGRyZXNzLT50eXBlICE9IHNvY2tldC0+YWRkcmVzc190eXBlKSB7Ci0gICAgU0JfRExPRyhFUlJPUikgPDwgX19GVU5DVElPTl9fIDw8ICI6IEluY29tcGF0aWJsZSBhZGRyZXNzZXM6ICIKLSAgICAgICAgICAgICAgICAgICA8PCAic29ja2V0IHR5cGUgPSAiIDw8IHNvY2tldC0+YWRkcmVzc190eXBlCi0gICAgICAgICAgICAgICAgICAgPDwgIiwgYXJndW1lbnQgdHlwZSA9ICIgPDwgYWRkcmVzcy0+dHlwZTsKLSAgICByZXR1cm4gKHNvY2tldC0+ZXJyb3IgPSBrU2JTb2NrZXRFcnJvckZhaWxlZCk7Ci0gIH0KLQotICBpbnQgcmVzdWx0ID0KLSAgICAgIGNvbm5lY3Qoc29ja2V0LT5zb2NrZXRfaGFuZGxlLCBzb2NrX2FkZHIuc29ja2FkZHIoKSwgc29ja19hZGRyLmxlbmd0aCk7Ci0KLSAgaWYgKHJlc3VsdCAhPSBTT0NLRVRfRVJST1IpIHsKLSAgICBzb2NrZXQtPmJvdW5kX3RvID0gU2JTb2NrZXRQcml2YXRlOjpCaW5kVGFyZ2V0OjprQW55OwotICAgIHJldHVybiAoc29ja2V0LT5lcnJvciA9IGtTYlNvY2tldE9rKTsKLSAgfQotCi0gIGNvbnN0IGludCBsYXN0X2Vycm9yID0gV1NBR2V0TGFzdEVycm9yKCk7Ci0gIGlmIChsYXN0X2Vycm9yID09IFdTQUVXT1VMREJMT0NLKSB7Ci0gICAgc29ja2V0LT5ib3VuZF90byA9IFNiU29ja2V0UHJpdmF0ZTo6QmluZFRhcmdldDo6a0FueTsKLSAgICByZXR1cm4gKHNvY2tldC0+ZXJyb3IgPSBrU2JTb2NrZXRQZW5kaW5nKTsKLSAgfQotCi0gIFNCX0RMT0coRVJST1IpIDw8IF9fRlVOQ1RJT05fXyA8PCAiOiBjb25uZWN0IGZhaWxlZDogIiA8PCBsYXN0X2Vycm9yOwotICByZXR1cm4gKHNvY2tldC0+ZXJyb3IgPSBrU2JTb2NrZXRFcnJvckZhaWxlZCk7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfY3JlYXRlLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X2NyZWF0ZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYxOTY3Zi4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfY3JlYXRlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc29ja2V0LmgiCi0KLSNpbmNsdWRlIDx3aW5zb2NrMi5oPgotI2luY2x1ZGUgPG1zd3NvY2suaD4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NldF9ub25fYmxvY2tpbmdfaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF9pbnRlcm5hbC5oIgotCi1uYW1lc3BhY2Ugc2J3aW4zMiA9IHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjsKLQotU2JTb2NrZXQgU2JTb2NrZXRDcmVhdGUoU2JTb2NrZXRBZGRyZXNzVHlwZSBhZGRyZXNzX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBTYlNvY2tldFByb3RvY29sIHByb3RvY29sKSB7Ci0gIGludCBzb2NrZXRfZG9tYWluOwotICBzd2l0Y2ggKGFkZHJlc3NfdHlwZSkgewotICAgIGNhc2Uga1NiU29ja2V0QWRkcmVzc1R5cGVJcHY0OgotICAgICAgc29ja2V0X2RvbWFpbiA9IEFGX0lORVQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGtTYlNvY2tldEFkZHJlc3NUeXBlSXB2NjoKLSAgICAgIHNvY2tldF9kb21haW4gPSBBRl9JTkVUNjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBTQl9OT1RSRUFDSEVEKCk7Ci0gICAgICByZXR1cm4ga1NiU29ja2V0SW52YWxpZDsKLSAgfQotCi0gIGludCBzb2NrZXRfdHlwZTsKLSAgaW50IHNvY2tldF9wcm90b2NvbDsKLSAgc3dpdGNoIChwcm90b2NvbCkgewotICAgIGNhc2Uga1NiU29ja2V0UHJvdG9jb2xUY3A6Ci0gICAgICBzb2NrZXRfdHlwZSA9IFNPQ0tfU1RSRUFNOwotICAgICAgc29ja2V0X3Byb3RvY29sID0gSVBQUk9UT19UQ1A7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGtTYlNvY2tldFByb3RvY29sVWRwOgotICAgICAgc29ja2V0X3R5cGUgPSBTT0NLX0RHUkFNOwotICAgICAgc29ja2V0X3Byb3RvY29sID0gSVBQUk9UT19VRFA7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgU0JfTk9UUkVBQ0hFRCgpOwotICAgICAgcmV0dXJuIGtTYlNvY2tldEludmFsaWQ7Ci0gIH0KLQotICAvLyBXU0FTb2NrZXQgd2l0aCBkd0ZsYWdzPTAsIGluc3RlYWQgb2Ygc29ja2V0KCkgY3JlYXRlcyBzb2NrZXRzIHRoYXQgZG8gbm90Ci0gIC8vIHN1cHBvcnQgb3ZlcmxhcHBlZCBJTy4KLSAgU09DS0VUIHNvY2tldF9oYW5kbGUgPQotICAgICAgV1NBU29ja2V0Vyhzb2NrZXRfZG9tYWluLCBzb2NrZXRfdHlwZSwgc29ja2V0X3Byb3RvY29sLCBudWxscHRyLCAwLCAwKTsKLSAgaWYgKHNvY2tldF9oYW5kbGUgPT0gSU5WQUxJRF9TT0NLRVQpIHsKLSAgICByZXR1cm4ga1NiU29ja2V0SW52YWxpZDsKLSAgfQotCi0gIC8vIEZyb20KLSAgLy8gaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS93aW5kb3dzL2Rlc2t0b3AvY2MxMzYxMDModj12cy44NSkuYXNweDoKLSAgLy8gIldoZW4gdGhlIFRhcmdldE9zVmVyc2lvbiBtZW1iZXIgaXMgc2V0IHRvIGEgdmFsdWUgZm9yIFdpbmRvd3MgVmlzdGEgb3IKLSAgLy8gbGF0ZXIsIHJlZHVjdGlvbnMgdG8gdGhlIFRDUCByZWNlaXZlIGJ1ZmZlciBzaXplIG9uIHRoaXMgc29ja2V0IHVzaW5nIHRoZQotICAvLyBTT19SQ1ZCVUYgc29ja2V0IG9wdGlvbiBhcmUgYWxsb3dlZCBldmVuIGFmdGVyIGEgVENQIGNvbm5lY3Rpb24gaGFzIGJlZW4KLSAgLy8gZXN0YWJsaXNobWVudC4iCi0gIC8vICJXaGVuIHRoZSBUYXJnZXRPc1ZlcnNpb24gbWVtYmVyIGlzIHNldCB0byBhIHZhbHVlIGZvciBXaW5kb3dzIFZpc3RhIG9yCi0gIC8vIGxhdGVyLCByZWNlaXZlIHdpbmRvdyBhdXRvLXR1bmluZyBpcyBlbmFibGVkIGFuZCB0aGUgVENQIHdpbmRvdyBzY2FsZQotICAvLyBmYWN0b3IgaXMgcmVkdWNlZCB0byAyIGZyb20gdGhlIGRlZmF1bHQgdmFsdWUgb2YgOC4iCi0KLSAgLy8gVGhlIG1haW4gaW1wZXR1cyBmb3IgdGhpcyBjaGFuZ2U6Ci0KLSAgLy8gIlRoZSBXc2FCZWhhdmlvckF1dG9UdW5pbmcgb3B0aW9uIGlzIG5lZWRlZCBvbiBXaW5kb3dzIFZpc3RhIGZvciBzb21lCi0gIC8vIEludGVybmV0IGdhdGV3YXkgZGV2aWNlcyBhbmQgZmlyZXdhbGxzIHRoYXQgZG8gbm90IGNvcnJlY3RseSBzdXBwb3J0IGRhdGEKLSAgLy8gZmxvd3MgZm9yIFRDUCBjb25uZWN0aW9ucyB0aGF0IHVzZSB0aGUgV1NvcHQgZXh0ZW5zaW9uIGFuZCBhIHdpbmRvd3Mgc2NhbGUKLSAgLy8gZmFjdG9yLiBPbiBXaW5kb3dzIFZpc3RhLCBhIHJlY2VpdmVyIGJ5IGRlZmF1bHQgbmVnb3RpYXRlcyBhIHdpbmRvdyBzY2FsZQotICAvLyBmYWN0b3Igb2YgOCBmb3IgYSBtYXhpbXVtIHRydWUgd2luZG93IHNpemUgb2YgMTYsNzc2LDk2MCBieXRlcy4gV2hlbiBkYXRhCi0gIC8vIGJlZ2lucyB0byBmbG93IG9uIGEgZmFzdCBsaW5rLCBXaW5kb3dzIGluaXRpYWxseSBzdGFydHMgd2l0aCBhIDY0IEtpbG9ieXRlCi0gIC8vIHRydWUgd2luZG93IHNpemUgYnkgc2V0dGluZyB0aGUgV2luZG93IGZpZWxkIG9mIHRoZSBUQ1AgaGVhZGVyIHRvIDI1NiBhbmQKLSAgLy8gc2V0dGluZyB0aGUgd2luZG93IHNjYWxlIGZhY3RvciB0byA4IGluIHRoZSBUQ1Agb3B0aW9ucyAoMjU2KjJeOD02NEtCKS4KLSAgLy8gU29tZSBJbnRlcm5ldCBnYXRld2F5IGRldmljZXMgYW5kIGZpcmV3YWxscyBpZ25vcmUgdGhlIHdpbmRvdyBzY2FsZSBmYWN0b3IKLSAgLy8gYW5kIG9ubHkgbG9vayBhdCB0aGUgYWR2ZXJ0aXNlZCBXaW5kb3cgZmllbGQgaW4gdGhlIFRDUCBoZWFkZXIgc3BlY2lmaWVkIGFzCi0gIC8vIDI1NiwgYW5kIGRyb3AgaW5jb21pbmcgcGFja2V0cyBmb3IgdGhlIGNvbm5lY3Rpb24gdGhhdCBjb250YWluIG1vcmUgdGhhbgotICAvLyAyNTYgYnl0ZXMgb2YgVENQIGRhdGEuIFRvIHN1cHBvcnQgVENQIHJlY2VpdmUgd2luZG93IHNjYWxpbmcsIGEgZ2F0ZXdheQotICAvLyBkZXZpY2Ugb3IgZmlyZXdhbGwgbXVzdCBtb25pdG9yIHRoZSBUQ1AgaGFuZHNoYWtlIGFuZCB0cmFjayB0aGUgbmVnb3RpYXRlZAotICAvLyB3aW5kb3cgc2NhbGUgZmFjdG9yIGFzIHBhcnQgb2YgdGhlIFRDUCBjb25uZWN0aW9uIGRhdGEuIEFsc28gc29tZQotICAvLyBhcHBsaWNhdGlvbnMgYW5kIFRDUCBzdGFjayBpbXBsZW1lbnRhdGlvbnMgb24gb3RoZXIgcGxhdGZvcm1zIGlnbm9yZSB0aGUKLSAgLy8gVENQIFdTb3B0IGV4dGVuc2lvbiBhbmQgdGhlIHdpbmRvdyBzY2FsaW5nIGZhY3Rvci4gU28gdGhlIHJlbW90ZSBob3N0Ci0gIC8vIHNlbmRpbmcgdGhlIGRhdGEgbWF5IHNlbmQgZGF0YSBhdCB0aGUgcmF0ZSBhZHZlcnRpc2VkIGluIHRoZSBXaW5kb3cgZmllbGQKLSAgLy8gb2YgdGhlIFRDUCBoZWFkZXIgKDI1NiBieXRlcykuIFRoaXMgY2FuIHJlc3VsdCBpbiBkYXRhIGJlaW5nIHJlY2VpdmVkIHZlcnkKLSAgLy8gc2xvd2x5IGJ5IHRoZSByZWNlaXZlci4iCi0KLSAgaWYgKHByb3RvY29sID09IGtTYlNvY2tldFByb3RvY29sVGNwKSB7Ci0gICAgV1NBX0NPTVBBVElCSUxJVFlfTU9ERSBjb21wYXRpYmlsaXR5X21vZGUgPSB7V3NhQmVoYXZpb3JBbGwsIE5URERJX1ZJU1RBfTsKLQotICAgIERXT1JEIGtaZXJvID0gMDsKLSAgICBpbnQgcmV0dXJuX3ZhbHVlID0gV1NBSW9jdGwoCi0gICAgICAgIHNvY2tldF9oYW5kbGUsIFNJT19TRVRfQ09NUEFUSUJJTElUWV9NT0RFLCAmY29tcGF0aWJpbGl0eV9tb2RlLAotICAgICAgICBzaXplb2YoV1NBX0NPTVBBVElCSUxJVFlfTU9ERSksIG51bGxwdHIsIDAsICZrWmVybywgbnVsbHB0ciwgbnVsbHB0cik7Ci0gICAgaWYgKHJldHVybl92YWx1ZSA9PSBTT0NLRVRfRVJST1IpIHsKLSAgICAgIGNsb3Nlc29ja2V0KHNvY2tldF9oYW5kbGUpOwotICAgICAgcmV0dXJuIGtTYlNvY2tldEludmFsaWQ7Ci0gICAgfQotICB9Ci0KLSAgLy8gQWxsIFN0YXJib2FyZCBzb2NrZXRzIGFyZSBub24tYmxvY2tpbmcsIHNvIGxldCdzIGVuc3VyZSBpdC4KLSAgaWYgKCFzYndpbjMyOjpTZXROb25CbG9ja2luZyhzb2NrZXRfaGFuZGxlKSkgewotICAgIC8vIFNvbWV0aGluZyB3ZW50IHdyb25nLCB3ZSdsbCBjbGVhbiB1cCBhbmQgcmV0dXJuIGZhaWx1cmUuCi0gICAgY2xvc2Vzb2NrZXQoc29ja2V0X2hhbmRsZSk7Ci0gICAgcmV0dXJuIGtTYlNvY2tldEludmFsaWQ7Ci0gIH0KLQotICByZXR1cm4gbmV3IFNiU29ja2V0UHJpdmF0ZShhZGRyZXNzX3R5cGUsIHByb3RvY29sLCBzb2NrZXRfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYlNvY2tldFByaXZhdGU6OkJpbmRUYXJnZXQ6OmtVbmJvdW5kKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF9kZXN0cm95LmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X2Rlc3Ryb3kuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNDdjYWUuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X2Rlc3Ryb3kuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NvY2tldC5oIgotCi0jaW5jbHVkZSA8d2luc29jazIuaD4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF9pbnRlcm5hbC5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zb2NrZXRfd2FpdGVyLmgiCi0KLWJvb2wgU2JTb2NrZXREZXN0cm95KFNiU29ja2V0IHNvY2tldCkgewotICBpZiAoIVNiU29ja2V0SXNWYWxpZChzb2NrZXQpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgU0JfRENIRUNLKHNvY2tldC0+c29ja2V0X2hhbmRsZSAhPSBJTlZBTElEX1NPQ0tFVCk7Ci0KLSAgaWYgKHNvY2tldC0+d2FpdGVyICE9IG51bGxwdHIpIHsKLSAgICBib29sIHJlc3VsdCA9IFNiU29ja2V0V2FpdGVyUmVtb3ZlKHNvY2tldC0+d2FpdGVyLCBzb2NrZXQpOwotICAgIFNCX0RDSEVDSyhyZXN1bHQpOwotICB9Ci0KLSAgYm9vbCByZXN1bHQgPSBjbG9zZXNvY2tldChzb2NrZXQtPnNvY2tldF9oYW5kbGUpICE9IFNPQ0tFVF9FUlJPUjsKLQotICBkZWxldGUgc29ja2V0OwotICByZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X2ZyZWVfcmVzb2x1dGlvbi5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF9mcmVlX3Jlc29sdXRpb24uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMmNkZTAuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X2ZyZWVfcmVzb2x1dGlvbi5jYworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc29ja2V0LmgiCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0KLXZvaWQgU2JTb2NrZXRGcmVlUmVzb2x1dGlvbihTYlNvY2tldFJlc29sdXRpb24qIHJlc29sdXRpb24pIHsKLSAgaWYgKCFyZXNvbHV0aW9uKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHJlc29sdXRpb24tPmFkZHJlc3NlcykgewotICAgIGRlbGV0ZVtdIHJlc29sdXRpb24tPmFkZHJlc3NlczsKLSAgfQotCi0gIGRlbGV0ZSByZXNvbHV0aW9uOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X2dldF9pbnRlcmZhY2VfYWRkcmVzcy5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF9nZXRfaW50ZXJmYWNlX2FkZHJlc3MuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMGRlZDcuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X2dldF9pbnRlcmZhY2VfYWRkcmVzcy5jYworKysgL2Rldi9udWxsCkBAIC0xLDI4OSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NvY2tldC5oIgotCi0jaW5jbHVkZSA8d2luc29jazIuaD4KLQotI2luY2x1ZGUgPGlmZGVmLmg+Ci0jaW5jbHVkZSA8aXBobHBhcGkuaD4KLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJzdGFyYm9hcmQvYnl0ZV9zd2FwLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2FkYXB0ZXJfdXRpbHMuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF9pbnRlcm5hbC5oIgotCi1uYW1lc3BhY2Ugc2J3aW4zMiA9IHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjsKLQotbmFtZXNwYWNlIHsKLWNvbnN0IFVMT05HIGtEZWZhdWx0QWRhcHRlckluZm9CdWZmZXJTaXplSW5CeXRlcyA9IDE2ICogMTAyNDsKLQotYm9vbCBJc0FueUFkZHJlc3MoY29uc3QgU2JTb2NrZXRBZGRyZXNzJiBhZGRyZXNzKSB7Ci0gIHN3aXRjaCAoYWRkcmVzcy50eXBlKSB7Ci0gICAgY2FzZSBrU2JTb2NrZXRBZGRyZXNzVHlwZUlwdjQ6Ci0gICAgICByZXR1cm4gKGFkZHJlc3MuYWRkcmVzc1swXSA9PSAwICYmIGFkZHJlc3MuYWRkcmVzc1sxXSA9PSAwICYmCi0gICAgICAgICAgICAgIGFkZHJlc3MuYWRkcmVzc1syXSA9PSAwICYmIGFkZHJlc3MuYWRkcmVzc1szXSA9PSAwKTsKLSAgICBjYXNlIGtTYlNvY2tldEFkZHJlc3NUeXBlSXB2NjogewotICAgICAgYm9vbCBmb3VuZF9ub256ZXJvID0gZmFsc2U7Ci0gICAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpICE9IHNid2luMzI6OmtBZGRyZXNzTGVuZ3RoSXB2NjsgKytpKSB7Ci0gICAgICAgIGZvdW5kX25vbnplcm8gfD0gKGFkZHJlc3MuYWRkcmVzc1tpXSAhPSAwKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiAhZm91bmRfbm9uemVybzsKLSAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgIFNCX05PVFJFQUNIRUQoKSA8PCAiSW52YWxpZCBhZGRyZXNzIHR5cGUgIiA8PCBhZGRyZXNzLnR5cGU7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBHZW5lcmF0ZU5ldE1hc2tGcm9tUHJlZml4TGVuZ3RoKFVJTlQ4IHByZWZpeF9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyKiBjb25zdCBhZGRyZXNzX2JlZ2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiogY29uc3QgYWRkcmVzc19lbmQpIHsKLSAgU0JfRENIRUNLKGFkZHJlc3NfZW5kID49IGFkZHJlc3NfYmVnaW4pOwotICBTQl9EQ0hFQ0soKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGFkZHJlc3NfZW5kKSAtCi0gICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYWRkcmVzc19iZWdpbikpICUKLSAgICAgICAgICAgICAgICA0ID09Ci0gICAgICAgICAgICAwKTsKLSAgVUlOVDggb25lc19sZWZ0ID0gcHJlZml4X2xlbmd0aDsKLSAgY29uc3QgaW50IGtCaXRzSW5PbmVEV09SRCA9IHNpemVvZihVSU5UMzIpICogODsKLSAgZm9yIChVSU5UMzIqIGl0ZXJhdG9yID0gYWRkcmVzc19iZWdpbjsgaXRlcmF0b3IgIT0gYWRkcmVzc19lbmQ7ICsraXRlcmF0b3IpIHsKLSAgICBVSU5UOCBvbmVzX2luX3RoaXNfZHdvcmQgPSBzdGQ6Om1pbjxVSU5UOD4oa0JpdHNJbk9uZURXT1JELCBvbmVzX2xlZnQpOwotICAgIFVJTlQ2NCBtYXNrX3ZhbHVlID0KLSAgICAgICAga1NiVUludDY0TWF4IC0gKCgxVUxMIDw8IChrQml0c0luT25lRFdPUkQgLSBvbmVzX2luX3RoaXNfZHdvcmQpKSAtIDEpOwotICAgICppdGVyYXRvciA9Ci0gICAgICAgIFNCX0hPU1RfVE9fTkVUX1UzMihzdGF0aWNfY2FzdDxVSU5UMzI+KG1hc2tfdmFsdWUgJiBrU2JVSW50NjRNYXgpKTsKLSAgICBvbmVzX2xlZnQgLT0gb25lc19pbl90aGlzX2R3b3JkOwotICB9Ci19Ci0KLWJvb2wgUG9wdWxhdGVJbnRlcmZhY2VBZGRyZXNzKGNvbnN0IElQX0FEQVBURVJfVU5JQ0FTVF9BRERSRVNTJiB1bmljYXN0X2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYlNvY2tldEFkZHJlc3MqIG91dF9pbnRlcmZhY2VfaXApIHsKLSAgaWYgKCFvdXRfaW50ZXJmYWNlX2lwKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBjb25zdCBTT0NLRVRfQUREUkVTUyYgYWRkcmVzcyA9IHVuaWNhc3RfYWRkcmVzcy5BZGRyZXNzOwotICBzYndpbjMyOjpTb2NrQWRkciBhZGRyOwotICByZXR1cm4gYWRkci5Gcm9tU29ja2FkZHIoYWRkcmVzcy5scFNvY2thZGRyKSAmJgotICAgICAgICAgYWRkci5Ub1NiU29ja2V0QWRkcmVzcyhvdXRfaW50ZXJmYWNlX2lwKTsKLX0KLQotYm9vbCBQb3B1bGF0ZU5ldG1hc2soY29uc3QgSVBfQURBUFRFUl9VTklDQVNUX0FERFJFU1MmIHVuaWNhc3RfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgIFNiU29ja2V0QWRkcmVzcyogb3V0X25ldG1hc2spIHsKLSAgaWYgKCFvdXRfbmV0bWFzaykgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgY29uc3QgU09DS0VUX0FERFJFU1MmIGFkZHJlc3MgPSB1bmljYXN0X2FkZHJlc3MuQWRkcmVzczsKLSAgaWYgKGFkZHJlc3MubHBTb2NrYWRkciA9PSBudWxscHRyKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGNvbnN0IEFERFJFU1NfRkFNSUxZJiBmYW1pbHkgPSBhZGRyZXNzLmxwU29ja2FkZHItPnNhX2ZhbWlseTsKLQotICBzd2l0Y2ggKGZhbWlseSkgewotICAgIGNhc2UgQUZfSU5FVDoKLSAgICAgIG91dF9uZXRtYXNrLT50eXBlID0ga1NiU29ja2V0QWRkcmVzc1R5cGVJcHY0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBRl9JTkVUNjoKLSAgICAgIG91dF9uZXRtYXNrLT50eXBlID0ga1NiU29ja2V0QWRkcmVzc1R5cGVJcHY2OwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIFNCX05PVFJFQUNIRUQoKSA8PCAiSW52YWxpZCBmYW1pbHkgIiA8PCBmYW1pbHk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBVSU5UMzIqIGNvbnN0IGJlZ2luX25ldG1hc2sgPQotICAgICAgcmVpbnRlcnByZXRfY2FzdDxVSU5UMzIqPigmKG91dF9uZXRtYXNrLT5hZGRyZXNzWzBdKSk7Ci0gIFVJTlQzMiogY29uc3QgZW5kX25ldG1hc2sgPQotICAgICAgYmVnaW5fbmV0bWFzayArIFNCX0FSUkFZX1NJWkUob3V0X25ldG1hc2stPmFkZHJlc3MpIC8gc2l6ZW9mKFVJTlQzMik7Ci0KLSAgR2VuZXJhdGVOZXRNYXNrRnJvbVByZWZpeExlbmd0aCh1bmljYXN0X2FkZHJlc3MuT25MaW5rUHJlZml4TGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luX25ldG1hc2ssIGVuZF9uZXRtYXNrKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgR2V0TmV0bWFza0ZvckludGVyZmFjZUFkZHJlc3MoY29uc3QgU2JTb2NrZXRBZGRyZXNzJiBpbnRlcmZhY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JTb2NrZXRBZGRyZXNzKiBvdXRfbmV0bWFzaykgewotICBzdGQ6OnVuaXF1ZV9wdHI8Y2hhcltdPiBhZGFwdGVyX2luZm9fbWVtb3J5X2Jsb2NrOwotICBpZiAoIXNid2luMzI6OkdldEFkYXB0ZXJzKAotICAgICAgaW50ZXJmYWNlX2FkZHJlc3MudHlwZSwgJmFkYXB0ZXJfaW5mb19tZW1vcnlfYmxvY2spKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGNvbnN0IHZvaWQqIGNvbnN0IGludGVyZmFjZV9hZGRyZXNzX2J1ZmZlciA9Ci0gICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqIGNvbnN0PihpbnRlcmZhY2VfYWRkcmVzcy5hZGRyZXNzKTsKLSAgZm9yIChQSVBfQURBUFRFUl9BRERSRVNTRVMgYWRhcHRlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8UElQX0FEQVBURVJfQUREUkVTU0VTPigKLSAgICAgICAgICAgYWRhcHRlcl9pbmZvX21lbW9yeV9ibG9jay5nZXQoKSk7Ci0gICAgICAgYWRhcHRlciAhPSBudWxscHRyOyBhZGFwdGVyID0gYWRhcHRlci0+TmV4dCkgewotICAgIGlmICgoYWRhcHRlci0+T3BlclN0YXR1cyAhPSBJZk9wZXJTdGF0dXNVcCkgfHwKLSAgICAgICAgIXNid2luMzI6OklzSWZUeXBlRXRoZXJuZXQoYWRhcHRlci0+SWZUeXBlKSkgewotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgZm9yIChQSVBfQURBUFRFUl9VTklDQVNUX0FERFJFU1MgdW5pY2FzdF9hZGRyZXNzID0KLSAgICAgICAgICAgICBhZGFwdGVyLT5GaXJzdFVuaWNhc3RBZGRyZXNzOwotICAgICAgICAgdW5pY2FzdF9hZGRyZXNzICE9IG51bGxwdHI7IHVuaWNhc3RfYWRkcmVzcyA9IHVuaWNhc3RfYWRkcmVzcy0+TmV4dCkgewotICAgICAgc2J3aW4zMjo6U29ja0FkZHIgYWRkcjsKLSAgICAgIGlmICghYWRkci5Gcm9tU29ja2FkZHIodW5pY2FzdF9hZGRyZXNzLT5BZGRyZXNzLmxwU29ja2FkZHIpKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBjb25zdCB2b2lkKiB1bmljYXN0X2FkZHJlc3NfYnVmZmVyID0gbnVsbHB0cjsKLSAgICAgIGludCBieXRlc190b19jaGVjayA9IDA7Ci0KLSAgICAgIHN3aXRjaCAoaW50ZXJmYWNlX2FkZHJlc3MudHlwZSkgewotICAgICAgICBjYXNlIGtTYlNvY2tldEFkZHJlc3NUeXBlSXB2NDoKLSAgICAgICAgICB1bmljYXN0X2FkZHJlc3NfYnVmZmVyID0KLSAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oJihhZGRyLnNvY2thZGRyX2luKCktPnNpbl9hZGRyKSk7Ci0gICAgICAgICAgYnl0ZXNfdG9fY2hlY2sgPSBzYndpbjMyOjprQWRkcmVzc0xlbmd0aElwdjQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2Uga1NiU29ja2V0QWRkcmVzc1R5cGVJcHY2OgotICAgICAgICAgIHVuaWNhc3RfYWRkcmVzc19idWZmZXIgPQotICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHZvaWQqPigmKGFkZHIuc29ja2FkZHJfaW42KCktPnNpbjZfYWRkcikpOwotICAgICAgICAgIGJ5dGVzX3RvX2NoZWNrID0gc2J3aW4zMjo6a0FkZHJlc3NMZW5ndGhJcHY2OwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIFNCX0RMT0coRVJST1IpIDw8ICJJbnZhbGlkIGludGVyZmFjZSBhZGRyZXNzIHR5cGUgIgotICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGludGVyZmFjZV9hZGRyZXNzLnR5cGU7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICBpZiAoU2JNZW1vcnlDb21wYXJlKHVuaWNhc3RfYWRkcmVzc19idWZmZXIsIGludGVyZmFjZV9hZGRyZXNzX2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNfdG9fY2hlY2spICE9IDApIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChQb3B1bGF0ZU5ldG1hc2soKnVuaWNhc3RfYWRkcmVzcywgb3V0X25ldG1hc2spKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBJc1VuaXF1ZUxvY2FsQWRkcmVzcyhjb25zdCB1bnNpZ25lZCBjaGFyIGlwWzE2XSkgewotICAvLyBVbmlxdWUgTG9jYWwgQWRkcmVzc2VzIGFyZSBpbiBmZDA4OjovOC4KLSAgcmV0dXJuIGlwWzBdID09IDB4ZmQgJiYgaXBbMV0gPT0gMHgwODsKLX0KLQotYm9vbCBGaW5kSW50ZXJmYWNlSVAoY29uc3QgU2JTb2NrZXRBZGRyZXNzVHlwZSBhZGRyZXNzX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICBTYlNvY2tldEFkZHJlc3MqIG91dF9pbnRlcmZhY2VfaXAsCi0gICAgICAgICAgICAgICAgICAgICBTYlNvY2tldEFkZHJlc3MqIG91dF9uZXRtYXNrKSB7Ci0gIGlmIChvdXRfaW50ZXJmYWNlX2lwID09IG51bGxwdHIpIHsKLSAgICBTQl9OT1RSRUFDSEVEKCkgPDwgIm91dF9pbnRlcmZhY2VfaXAgbXVzdCBiZSBzcGVjaWZpZWQiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHN0ZDo6dW5pcXVlX3B0cjxjaGFyW10+IGFkYXB0ZXJfaW5mb19tZW1vcnlfYmxvY2s7Ci0gIGlmICghc2J3aW4zMjo6R2V0QWRhcHRlcnMoYWRkcmVzc190eXBlLCAmYWRhcHRlcl9pbmZvX21lbW9yeV9ibG9jaykpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmb3IgKFBJUF9BREFQVEVSX0FERFJFU1NFUyBhZGFwdGVyID0gcmVpbnRlcnByZXRfY2FzdDxQSVBfQURBUFRFUl9BRERSRVNTRVM+KAotICAgICAgICAgICBhZGFwdGVyX2luZm9fbWVtb3J5X2Jsb2NrLmdldCgpKTsKLSAgICAgICBhZGFwdGVyICE9IG51bGxwdHI7IGFkYXB0ZXIgPSBhZGFwdGVyLT5OZXh0KSB7Ci0gICAgaWYgKChhZGFwdGVyLT5PcGVyU3RhdHVzICE9IElmT3BlclN0YXR1c1VwKSB8fAotICAgICAgICAhc2J3aW4zMjo6SXNJZlR5cGVFdGhlcm5ldChhZGFwdGVyLT5JZlR5cGUpKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICBmb3IgKFBJUF9BREFQVEVSX1VOSUNBU1RfQUREUkVTUyB1bmljYXN0X2FkZHJlc3MgPQotICAgICAgICAgICAgIGFkYXB0ZXItPkZpcnN0VW5pY2FzdEFkZHJlc3M7Ci0gICAgICAgICB1bmljYXN0X2FkZHJlc3MgIT0gbnVsbHB0cjsgdW5pY2FzdF9hZGRyZXNzID0gdW5pY2FzdF9hZGRyZXNzLT5OZXh0KSB7Ci0gICAgICBpZiAodW5pY2FzdF9hZGRyZXNzLT5GbGFncyAmIChJUF9BREFQVEVSX0FERFJFU1NfVFJBTlNJRU5UKSkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGlmICghKHVuaWNhc3RfYWRkcmVzcy0+RmxhZ3MgJiBJUF9BREFQVEVSX0FERFJFU1NfRE5TX0VMSUdJQkxFKSkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgLy8gVE9ETzogRm9yIElQdjYsIFByaW9yaXRpemUgaW50ZXJmYWNlIHdpdGggaGlnaGVzdCBzY29wZS4KLSAgICAgIC8vIFNraXAgVUxBcyBmb3Igbm93LgotICAgICAgaWYgKGFkZHJlc3NfdHlwZSA9PSBrU2JTb2NrZXRBZGRyZXNzVHlwZUlwdjYpIHsKLSAgICAgICAgLy8gRG9jdW1lbnRhdGlvbiBvbiBNU0ROIHN0YXRlczoKLSAgICAgICAgLy8gIlRoZSBTT0NLQUREUiBzdHJ1Y3R1cmUgcG9pbnRlZCB0byBieSB0aGUgbHBTb2NrYWRkciBtZW1iZXIgdmFyaWVzCi0gICAgICAgIC8vIGRlcGVuZGluZyBvbiB0aGUgcHJvdG9jb2wgb3IgYWRkcmVzcyBmYW1pbHkgc2VsZWN0ZWQuIEZvciBleGFtcGxlLAotICAgICAgICAvLyB0aGUgc29ja2FkZHJfaW42IHN0cnVjdHVyZSBpcyB1c2VkIGZvciBhbiBJUHY2IHNvY2tldCBhZGRyZXNzCi0gICAgICAgIC8vIHdoaWxlIHRoZSBzb2NrYWRkcl9pbjQgc3RydWN0dXJlIGlzIHVzZWQgZm9yIGFuIElQdjQgc29ja2V0IGFkZHJlc3MuIgotICAgICAgICAvLyBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L3dpbmRvd3MvZGVza3RvcC9tczc0MDUwNyh2PXZzLjg1KS5hc3B4Ci0KLSAgICAgICAgc29ja2FkZHJfaW42KiBhZGRyID0gcmVpbnRlcnByZXRfY2FzdDxzb2NrYWRkcl9pbjYqPigKLSAgICAgICAgICAgIHVuaWNhc3RfYWRkcmVzcy0+QWRkcmVzcy5scFNvY2thZGRyKTsKLSAgICAgICAgU0JfRENIRUNLKGFkZHItPnNpbjZfZmFtaWx5ID09IEFGX0lORVQ2KTsKLSAgICAgICAgaWYgKElzVW5pcXVlTG9jYWxBZGRyZXNzKGFkZHItPnNpbjZfYWRkci51LkJ5dGUpKSB7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKCFQb3B1bGF0ZUludGVyZmFjZUFkZHJlc3MoKnVuaWNhc3RfYWRkcmVzcywgb3V0X2ludGVyZmFjZV9pcCkpIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBpZiAoIVBvcHVsYXRlTmV0bWFzaygqdW5pY2FzdF9hZGRyZXNzLCBvdXRfbmV0bWFzaykpIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgRmluZFNvdXJjZUFkZHJlc3NGb3JEZXN0aW5hdGlvbihjb25zdCBTYlNvY2tldEFkZHJlc3MmIGRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiU29ja2V0QWRkcmVzcyogb3V0X3NvdXJjZV9hZGRyZXNzKSB7Ci0gIFNiU29ja2V0IHNvY2tldCA9IFNiU29ja2V0Q3JlYXRlKGRlc3RpbmF0aW9uLnR5cGUsIGtTYlNvY2tldFByb3RvY29sVWRwKTsKLSAgaWYgKCFTYlNvY2tldElzVmFsaWQoc29ja2V0KSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIFNiU29ja2V0RXJyb3IgY29ubmVjdF9yZXR2YWwgPSBTYlNvY2tldENvbm5lY3Qoc29ja2V0LCAmZGVzdGluYXRpb24pOwotICBpZiAoY29ubmVjdF9yZXR2YWwgIT0ga1NiU29ja2V0T2spIHsKLSAgICBib29sIHNvY2tldF9kZXN0cm95ZWQgPSBTYlNvY2tldERlc3Ryb3koc29ja2V0KTsKLSAgICBTQl9EQ0hFQ0soc29ja2V0X2Rlc3Ryb3llZCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgYm9vbCBzdWNjZXNzID0gU2JTb2NrZXRHZXRMb2NhbEFkZHJlc3Moc29ja2V0LCBvdXRfc291cmNlX2FkZHJlc3MpOwotICBib29sIHNvY2tldF9kZXN0cm95ZWQgPSBTYlNvY2tldERlc3Ryb3koc29ja2V0KTsKLSAgU0JfRENIRUNLKHNvY2tldF9kZXN0cm95ZWQpOwotICByZXR1cm4gc3VjY2VzczsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLWJvb2wgU2JTb2NrZXRHZXRJbnRlcmZhY2VBZGRyZXNzKGNvbnN0IFNiU29ja2V0QWRkcmVzcyogY29uc3QgZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYlNvY2tldEFkZHJlc3MqIG91dF9zb3VyY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiU29ja2V0QWRkcmVzcyogb3V0X25ldG1hc2spIHsKLSAgaWYgKCFvdXRfc291cmNlX2FkZHJlc3MpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoZGVzdGluYXRpb24gPT0gbnVsbHB0cikgewotICAgIC8vIFJldHVybiBlaXRoZXIgYSB2NCBvciBhIHY2IGFkZHJlc3MuICBQZXIgc3BlYy4KLSAgICByZXR1cm4gKEZpbmRJbnRlcmZhY2VJUChrU2JTb2NrZXRBZGRyZXNzVHlwZUlwdjQsIG91dF9zb3VyY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfbmV0bWFzaykgfHwKLSAgICAgICAgICAgIEZpbmRJbnRlcmZhY2VJUChrU2JTb2NrZXRBZGRyZXNzVHlwZUlwdjYsIG91dF9zb3VyY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfbmV0bWFzaykpOwotICB9IGVsc2UgaWYgKElzQW55QWRkcmVzcygqZGVzdGluYXRpb24pKSB7Ci0gICAgcmV0dXJuIEZpbmRJbnRlcmZhY2VJUChkZXN0aW5hdGlvbi0+dHlwZSwgb3V0X3NvdXJjZV9hZGRyZXNzLCBvdXRfbmV0bWFzayk7Ci0gIH0KLQotICByZXR1cm4gKEZpbmRTb3VyY2VBZGRyZXNzRm9yRGVzdGluYXRpb24oKmRlc3RpbmF0aW9uLCBvdXRfc291cmNlX2FkZHJlc3MpICYmCi0gICAgICAgICAgR2V0TmV0bWFza0ZvckludGVyZmFjZUFkZHJlc3MoKm91dF9zb3VyY2VfYWRkcmVzcywgb3V0X25ldG1hc2spKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF9nZXRfbGFzdF9lcnJvci5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF9nZXRfbGFzdF9lcnJvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFkMmU5YS4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfZ2V0X2xhc3RfZXJyb3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NvY2tldC5oIgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfaW50ZXJuYWwuaCIKLQotU2JTb2NrZXRFcnJvciBTYlNvY2tldEdldExhc3RFcnJvcihTYlNvY2tldCBzb2NrZXQpIHsKLSAgaWYgKCFTYlNvY2tldElzVmFsaWQoc29ja2V0KSkgewotICAgIHJldHVybiBrU2JTb2NrZXRFcnJvckZhaWxlZDsKLSAgfQotCi0gIHJldHVybiBzb2NrZXQtPmVycm9yOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X2dldF9sb2NhbF9hZGRyZXNzLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X2dldF9sb2NhbF9hZGRyZXNzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGExYmY5Li4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF9nZXRfbG9jYWxfYWRkcmVzcy5jYworKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc29ja2V0LmgiCi0KLSNpbmNsdWRlIDx3aW5zb2NrMi5oPgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF9pbnRlcm5hbC5oIgotCi1uYW1lc3BhY2Ugc2J3aW4zMiA9IHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjsKLQotYm9vbCBTYlNvY2tldEdldExvY2FsQWRkcmVzcyhTYlNvY2tldCBzb2NrZXQsIFNiU29ja2V0QWRkcmVzcyogb3V0X2FkZHJlc3MpIHsKLSAgaWYgKCFTYlNvY2tldElzVmFsaWQoc29ja2V0KSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIHdpbnNvY2syIGNvbnNpZGVycyBjYWxsaW5nIGdldHNvY2tuYW1lKCkgb24gdW5ib3VuZCBzb2NrZXRzIHRvIGJlIGFuIGVycm9yLgotICAvLyBUaGVyZWZvcmUsIFNiU29ja2V0TGlzdGVuKCkgd2lsbCBjYWxsIFNiU29ja2V0QmluZCgpLgotICBpZiAoc29ja2V0LT5ib3VuZF90byA9PSBTYlNvY2tldFByaXZhdGU6OkJpbmRUYXJnZXQ6OmtVbmJvdW5kKSB7Ci0gICAgb3V0X2FkZHJlc3MtPnR5cGUgPSBzb2NrZXQtPmFkZHJlc3NfdHlwZTsKLSAgICBzd2l0Y2ggKHNvY2tldC0+YWRkcmVzc190eXBlKSB7Ci0gICAgICBjYXNlIGtTYlNvY2tldEFkZHJlc3NUeXBlSXB2NDoKLSAgICAgICAgU2JNZW1vcnlTZXQob3V0X2FkZHJlc3MtPmFkZHJlc3MsIDAsIHNid2luMzI6OmtBZGRyZXNzTGVuZ3RoSXB2NCk7Ci0gICAgICAgIG91dF9hZGRyZXNzLT5wb3J0ID0gMDsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBjYXNlIGtTYlNvY2tldEFkZHJlc3NUeXBlSXB2NjoKLSAgICAgICAgU2JNZW1vcnlTZXQob3V0X2FkZHJlc3MtPmFkZHJlc3MsIDAsIHNid2luMzI6OmtBZGRyZXNzTGVuZ3RoSXB2Nik7Ci0gICAgICAgIG91dF9hZGRyZXNzLT5wb3J0ID0gMDsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBTQl9OT1RSRUFDSEVEKCkgPDwgIkludmFsaWQgYWRkcmVzcyB0eXBlOiAiIDw8IHNvY2tldC0+YWRkcmVzc190eXBlOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgU0JfRENIRUNLKHNvY2tldC0+c29ja2V0X2hhbmRsZSAhPSBJTlZBTElEX1NPQ0tFVCk7Ci0gIHNid2luMzI6OlNvY2tBZGRyIHNvY2tfYWRkcjsKLSAgaW50IHJlc3VsdCA9IGdldHNvY2tuYW1lKHNvY2tldC0+c29ja2V0X2hhbmRsZSwgc29ja19hZGRyLnNvY2thZGRyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmc29ja19hZGRyLmxlbmd0aCk7Ci0gIGlmIChyZXN1bHQgPT0gU09DS0VUX0VSUk9SKSB7Ci0gICAgaW50IGxhc3RfZXJyb3IgPSBXU0FHZXRMYXN0RXJyb3IoKTsKLSAgICBTQl9MT0coRVJST1IpIDw8ICJnZXRzb2NrbmFtZSgpIGZhaWxlZCB3aXRoIGxhc3RfZXJyb3IgPSAiIDw8IGxhc3RfZXJyb3I7Ci0gICAgc29ja2V0LT5lcnJvciA9IHNid2luMzI6OlRyYW5zbGF0ZVNvY2tldEVycm9yU3RhdHVzKGxhc3RfZXJyb3IpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIXNvY2tfYWRkci5Ub1NiU29ja2V0QWRkcmVzcyhvdXRfYWRkcmVzcykpIHsKLSAgICBzb2NrZXQtPmVycm9yID0ga1NiU29ja2V0RXJyb3JGYWlsZWQ7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgc29ja2V0LT5lcnJvciA9IGtTYlNvY2tldE9rOwotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF9pbnRlcm5hbC5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF9pbnRlcm5hbC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFlOTVmZC4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfaW50ZXJuYWwuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X2ludGVybmFsLmgiCi0KLSNpbmNsdWRlIDx3aW5zb2NrMi5oPgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLQotbmFtZXNwYWNlIHN0YXJib2FyZCB7Ci1uYW1lc3BhY2Ugc2hhcmVkIHsKLW5hbWVzcGFjZSB3aW4zMiB7Ci0KLW5hbWVzcGFjZSB7Ci1jb25zdCBzb2NrbGVuX3Qga0FkZHJlc3NTdHJ1Y3RMZW5ndGhJcHY0ID0KLSAgICBzdGF0aWNfY2FzdDxzb2NrbGVuX3Q+KHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKTsKLWNvbnN0IHNvY2tsZW5fdCBrQWRkcmVzc1N0cnVjdExlbmd0aElwdjYgPQotICAgIHN0YXRpY19jYXN0PHNvY2tsZW5fdD4oc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpKTsKLX0KLQotU2JTb2NrZXRFcnJvciBUcmFuc2xhdGVTb2NrZXRFcnJvclN0YXR1cyhpbnQgZXJyb3IpIHsKLSAgc3dpdGNoIChlcnJvcikgewotICAgIGNhc2UgMDoKLSAgICAgIHJldHVybiBrU2JTb2NrZXRPazsKLQotICAgIC8vIE1pY3Jvc29mdCBXaW5zb2NrIGVycm9yIGNvZGVzOgotICAgIC8vICAgaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS93aW5kb3dzL2Rlc2t0b3AvbXM3NDA2Njgodj12cy44NSkuYXNweAotICAgIGNhc2UgV1NBRUlOUFJPR1JFU1M6Ci0gICAgY2FzZSBXU0FFV09VTERCTE9DSzoKLSAgICAgIHJldHVybiBrU2JTb2NrZXRQZW5kaW5nOwotI2lmIFNCX0hBUyhTT0NLRVRfRVJST1JfQ09OTkVDVElPTl9SRVNFVF9TVVBQT1JUKSB8fCBcCi0gICAgU0JfQVBJX1ZFUlNJT04gPj0gOQotICAgIGNhc2UgV1NBRUNPTk5SRVNFVDoKLSAgICBjYXNlIFdTQUVORVRSRVNFVDoKLSAgICBjYXNlIFdTQUVDT05OQUJPUlRFRDoKLSAgICAgIHJldHVybiBrU2JTb2NrZXRFcnJvckNvbm5lY3Rpb25SZXNldDsKLQotICAgIC8vIE1pY3Jvc29mdCBTeXN0ZW0gRXJyb3IgY29kZXM6Ci0gICAgLy8gICBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L3dpbmRvd3MvZGVza3RvcC9tczY4MTM4Mih2PXZzLjg1KS5hc3B4Ci0gICAgY2FzZSBFUlJPUl9CUk9LRU5fUElQRToKLSAgICAgIHJldHVybiBrU2JTb2NrZXRFcnJvckNvbm5lY3Rpb25SZXNldDsKLSNlbmRpZiAgLy8gI2lmIFNCX0hBUyhTT0NLRVRfRVJST1JfQ09OTkVDVElPTl9SRVNFVF9TVVBQT1JUKSB8fAotICAgICAgICAvLyAgICAgU0JfQVBJX1ZFUlNJT04gPj0gOQotICB9Ci0KLSAgLy8gSGVyZSdzIHdoZXJlIHdlIHdvdWxkIGJlIG1vcmUgbnVhbmNlZCBpZiB3ZSBuZWVkIHRvIGJlLgotICByZXR1cm4ga1NiU29ja2V0RXJyb3JGYWlsZWQ7Ci19Ci0KLWJvb2wgU2V0Qm9vbGVhblNvY2tldE9wdGlvbihTYlNvY2tldCBzb2NrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvcHRpb25fY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBvcHRpb25fbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHZhbHVlKSB7Ci0gIGlmICghU2JTb2NrZXRJc1ZhbGlkKHNvY2tldCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBTQl9EQ0hFQ0soc29ja2V0LT5zb2NrZXRfaGFuZGxlICE9IElOVkFMSURfU09DS0VUKTsKLSAgY29uc3QgaW50IG9uID0gdmFsdWUgPyAxIDogMDsKLSAgaW50IHJlc3VsdCA9IHNldHNvY2tvcHQoc29ja2V0LT5zb2NrZXRfaGFuZGxlLCBsZXZlbCwgb3B0aW9uX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCZvbiksIHNpemVvZihvbikpOwotICBpZiAocmVzdWx0ID09IFNPQ0tFVF9FUlJPUikgewotICAgIGludCBsYXN0X2Vycm9yID0gV1NBR2V0TGFzdEVycm9yKCk7Ci0gICAgU0JfRExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBzZXQgIiA8PCBvcHRpb25fbmFtZSA8PCAiIG9uIHNvY2tldCAiCi0gICAgICAgICAgICAgICAgICAgPDwgc29ja2V0LT5zb2NrZXRfaGFuZGxlIDw8ICIsIGxhc3RfZXJyb3IgPSAiIDw8IGxhc3RfZXJyb3I7Ci0gICAgc29ja2V0LT5lcnJvciA9IFRyYW5zbGF0ZVNvY2tldEVycm9yU3RhdHVzKGxhc3RfZXJyb3IpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHNvY2tldC0+ZXJyb3IgPSBrU2JTb2NrZXRPazsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgU2V0SW50ZWdlclNvY2tldE9wdGlvbihTYlNvY2tldCBzb2NrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvcHRpb25fY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBvcHRpb25fbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWUpIHsKLSAgaWYgKCFTYlNvY2tldElzVmFsaWQoc29ja2V0KSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIFNCX0RDSEVDSyhzb2NrZXQtPnNvY2tldF9oYW5kbGUgIT0gSU5WQUxJRF9TT0NLRVQpOwotICBpbnQgcmVzdWx0ID0gc2V0c29ja29wdChzb2NrZXQtPnNvY2tldF9oYW5kbGUsIGxldmVsLCBvcHRpb25fY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJnZhbHVlKSwgc2l6ZW9mKHZhbHVlKSk7Ci0gIGlmIChyZXN1bHQgPT0gU09DS0VUX0VSUk9SKSB7Ci0gICAgaW50IGxhc3RfZXJyb3IgPSBXU0FHZXRMYXN0RXJyb3IoKTsKLSAgICBTQl9ETE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHNldCAiIDw8IG9wdGlvbl9uYW1lIDw8ICIgb24gc29ja2V0ICIKLSAgICAgICAgICAgICAgICAgICA8PCBzb2NrZXQtPnNvY2tldF9oYW5kbGUgPDwgIiwgbGFzdF9lcnJvciA9ICIgPDwgbGFzdF9lcnJvcjsKLSAgICBzb2NrZXQtPmVycm9yID0gVHJhbnNsYXRlU29ja2V0RXJyb3JTdGF0dXMobGFzdF9lcnJvcik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgc29ja2V0LT5lcnJvciA9IGtTYlNvY2tldE9rOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBTb2NrQWRkcjo6RnJvbVNiU29ja2V0QWRkcmVzcyhjb25zdCBTYlNvY2tldEFkZHJlc3MqIGFkZHJlc3MpIHsKLSAgaWYgKCFhZGRyZXNzKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgbGVuZ3RoID0gc2l6ZW9mKHN0b3JhZ2VfKTsKLSAgc3dpdGNoIChhZGRyZXNzLT50eXBlKSB7Ci0gICAgY2FzZSBrU2JTb2NrZXRBZGRyZXNzVHlwZUlwdjQ6IHsKLSAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiogYWRkciA9IHNvY2thZGRyX2luKCk7Ci0gICAgICBsZW5ndGggPSBrQWRkcmVzc1N0cnVjdExlbmd0aElwdjQ7Ci0gICAgICBTYk1lbW9yeVNldChhZGRyLCAwLCBsZW5ndGgpOwotICAgICAgYWRkci0+c2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0gICAgICBhZGRyLT5zaW5fcG9ydCA9IGh0b25zKHN0YXRpY19jYXN0PFVTSE9SVD4oYWRkcmVzcy0+cG9ydCkpOwotICAgICAgU2JNZW1vcnlDb3B5KCZhZGRyLT5zaW5fYWRkciwgYWRkcmVzcy0+YWRkcmVzcywga0FkZHJlc3NMZW5ndGhJcHY0KTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIGtTYlNvY2tldEFkZHJlc3NUeXBlSXB2NjogewotICAgICAgc3RydWN0IHNvY2thZGRyX2luNiogYWRkcjYgPSBzb2NrYWRkcl9pbjYoKTsKLSAgICAgIGxlbmd0aCA9IGtBZGRyZXNzU3RydWN0TGVuZ3RoSXB2NjsKLSAgICAgIFNiTWVtb3J5U2V0KGFkZHI2LCAwLCBsZW5ndGgpOwotICAgICAgYWRkcjYtPnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7Ci0gICAgICBhZGRyNi0+c2luNl9wb3J0ID0gaHRvbnMoc3RhdGljX2Nhc3Q8VVNIT1JUPihhZGRyZXNzLT5wb3J0KSk7Ci0gICAgICBTYk1lbW9yeUNvcHkoJmFkZHI2LT5zaW42X2FkZHIsIGFkZHJlc3MtPmFkZHJlc3MsIGtBZGRyZXNzTGVuZ3RoSXB2Nik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgIFNCX05PVFJFQUNIRUQoKSA8PCAiVW5yZWNvZ25pemVkIGFkZHJlc3MgdHlwZTogIiA8PCBhZGRyZXNzLT50eXBlOwotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgU29ja0FkZHI6OlRvU2JTb2NrZXRBZGRyZXNzKFNiU29ja2V0QWRkcmVzcyogb3V0X2FkZHJlc3MpIGNvbnN0IHsKLSAgaWYgKCFvdXRfYWRkcmVzcykgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0vLyBDaGVjayB0aGF0IHdlIGhhdmUgYmVlbiBwcm9wZXJseSBpbml0aWFsaXplZC4KLSAgU0JfRENIRUNLKGxlbmd0aCA9PSBrQWRkcmVzc1N0cnVjdExlbmd0aElwdjQgfHwKLSAgICAgICAgICAgIGxlbmd0aCA9PSBrQWRkcmVzc1N0cnVjdExlbmd0aElwdjYpOwotCi0gIGlmIChmYW1pbHkoKSA9PSBBRl9JTkVUKSB7Ci0gICAgY29uc3Qgc3RydWN0IHNvY2thZGRyX2luKiBhZGRyID0gc29ja2FkZHJfaW4oKTsKLSAgICBpZiAobGVuZ3RoIDwga0FkZHJlc3NTdHJ1Y3RMZW5ndGhJcHY0KSB7Ci0gICAgICBTQl9OT1RSRUFDSEVEKCkgPDwgIkluc3VmZmljaWVudCBJTkVUIHNpemU6ICIgPDwgbGVuZ3RoOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIFNiTWVtb3J5Q29weShvdXRfYWRkcmVzcy0+YWRkcmVzcywgJmFkZHItPnNpbl9hZGRyLCBrQWRkcmVzc0xlbmd0aElwdjQpOwotICAgIG91dF9hZGRyZXNzLT5wb3J0ID0gbnRvaHMoYWRkci0+c2luX3BvcnQpOwotICAgIG91dF9hZGRyZXNzLT50eXBlID0ga1NiU29ja2V0QWRkcmVzc1R5cGVJcHY0OwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgaWYgKGZhbWlseSgpID09IEFGX0lORVQ2KSB7Ci0gICAgY29uc3Qgc3RydWN0IHNvY2thZGRyX2luNiogYWRkcjYgPSBzb2NrYWRkcl9pbjYoKTsKLSAgICBpZiAobGVuZ3RoIDwga0FkZHJlc3NTdHJ1Y3RMZW5ndGhJcHY2KSB7Ci0gICAgICBTQl9OT1RSRUFDSEVEKCkgPDwgIkluc3VmZmljaWVudCBJTkVUNiBzaXplOiAiIDw8IGxlbmd0aDsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBTYk1lbW9yeUNvcHkob3V0X2FkZHJlc3MtPmFkZHJlc3MsICZhZGRyNi0+c2luNl9hZGRyLCBrQWRkcmVzc0xlbmd0aElwdjYpOwotICAgIG91dF9hZGRyZXNzLT5wb3J0ID0gbnRvaHMoYWRkcjYtPnNpbjZfcG9ydCk7Ci0gICAgb3V0X2FkZHJlc3MtPnR5cGUgPSBrU2JTb2NrZXRBZGRyZXNzVHlwZUlwdjY7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBTQl9OT1RSRUFDSEVEKCkgPDwgIlVucmVjb2duaXplZCBhZGRyZXNzIGZhbWlseTogIiA8PCBmYW1pbHkoKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIFNvY2tBZGRyOjpGcm9tU29ja2FkZHIoY29uc3Qgc3RydWN0IHNvY2thZGRyKiBzb2NrX2FkZHIpIHsKLSAgaWYgKCFzb2NrX2FkZHIpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbnQgZmFtaWx5ID0gc29ja19hZGRyLT5zYV9mYW1pbHk7Ci0gIGlmIChmYW1pbHkgPT0gQUZfSU5FVCkgewotICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiogYWRkciA9Ci0gICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc3RydWN0IHNvY2thZGRyX2luKj4oc29ja19hZGRyKTsKLSAgICAqc29ja2FkZHJfaW4oKSA9ICphZGRyOwotICAgIGxlbmd0aCA9IHN0YXRpY19jYXN0PHNvY2tsZW5fdD4oc2l6ZW9mKCphZGRyKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSBpZiAoZmFtaWx5ID09IEFGX0lORVQ2KSB7Ci0gICAgY29uc3Qgc3RydWN0IHNvY2thZGRyX2luNiogYWRkciA9Ci0gICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc3RydWN0IHNvY2thZGRyX2luNio+KHNvY2tfYWRkcik7Ci0gICAgKnNvY2thZGRyX2luNigpID0gKmFkZHI7Ci0gICAgbGVuZ3RoID0gc3RhdGljX2Nhc3Q8c29ja2xlbl90PihzaXplb2YoKmFkZHIpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIFNCX0RMT0coV0FSTklORykgPDwgIlVucmVjb2duaXplZCBhZGRyZXNzIGZhbWlseTogIiA8PCBmYW1pbHk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHdpbjMyCi19ICAvLyBuYW1lc3BhY2Ugc2hhcmVkCi19ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfaW50ZXJuYWwuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF9pbnRlcm5hbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGEyYjBhLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF9pbnRlcm5hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpZm5kZWYgU1RBUkJPQVJEX1NIQVJFRF9XSU4zMl9TT0NLRVRfSU5URVJOQUxfSF8KLSNkZWZpbmUgU1RBUkJPQVJEX1NIQVJFRF9XSU4zMl9TT0NLRVRfSU5URVJOQUxfSF8KLQotI2luY2x1ZGUgPHdpbnNvY2syLmg+Ci0jaW5jbHVkZSA8V1MydGNwaXAuaD4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9hdG9taWMuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL2ludGVybmFsX29ubHkuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2F1dG9fZXZlbnRfaGFuZGxlLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NvY2tldC5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zb2NrZXRfd2FpdGVyLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3R5cGVzLmgiCi0KLW5hbWVzcGFjZSBzYndpbjMyID0gc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOwotCi1zdHJ1Y3QgU2JTb2NrZXRQcml2YXRlIHsKLSAgZW51bSBzdHJ1Y3QgQmluZFRhcmdldCB7Ci0gICAga1VuYm91bmQgPSAwLAotICAgIGtBbnkgPSAxLAotICAgIGtPdGhlciA9IDIsCi0gICAga0FjY2VwdGVkID0gMywKLSAgfTsKLQotICBTYlNvY2tldFByaXZhdGUoU2JTb2NrZXRBZGRyZXNzVHlwZSBhZGRyZXNzX3R5cGUsCi0gICAgICAgICAgICAgICAgICBTYlNvY2tldFByb3RvY29sIHByb3RvY29sLAotICAgICAgICAgICAgICAgICAgU09DS0VUIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgIEJpbmRUYXJnZXQgYm91bmRfdG8pCi0gICAgICA6IGFkZHJlc3NfdHlwZShhZGRyZXNzX3R5cGUpLAotICAgICAgICBwcm90b2NvbChwcm90b2NvbCksCi0gICAgICAgIHNvY2tldF9oYW5kbGUoaGFuZGxlKSwKLSAgICAgICAgc29ja2V0X2V2ZW50KFdTQV9JTlZBTElEX0VWRU5UKSwKLSAgICAgICAgd3JpdGFibGUoMCksCi0gICAgICAgIGVycm9yKGtTYlNvY2tldE9rKSwKLSAgICAgICAgd2FpdGVyKGtTYlNvY2tldFdhaXRlckludmFsaWQpLAotICAgICAgICBib3VuZF90byhib3VuZF90bykge30KLSAgflNiU29ja2V0UHJpdmF0ZSgpIHt9Ci0KLSAgLy8gVGhlIGFkZHJlc3MgZG9tYWluIG9mIHRoaXMgc29ja2V0LCBJUHY0IG9yIElQdjYuCi0gIFNiU29ja2V0QWRkcmVzc1R5cGUgYWRkcmVzc190eXBlOwotCi0gIC8vIFRoZSBwcm90b2NvbCBvZiB0aGlzIHNvY2tldCwgVURQIG9yIFRDUC4KLSAgU2JTb2NrZXRQcm90b2NvbCBwcm90b2NvbDsKLQotICAvLyBUaGUgaGFuZGxlIGZvciB0aGlzIHNvY2tldC4KLSAgU09DS0VUIHNvY2tldF9oYW5kbGU7Ci0KLSAgLy8gVGhlIGV2ZW50IHJlbGF0ZWQgdG8gdGhlIHNvY2tldF9oYW5kbGUuICBVc2VkIGZvciBTYlNvY2tldFdhaXRlci4KLSAgc2J3aW4zMjo6QXV0b0V2ZW50SGFuZGxlIHNvY2tldF9ldmVudDsKLQotICAvLyBTZXQgdG8gdHJ1ZSBiZXR3ZWVuIHdoZW4gc29ja2V0IGlzIHNob3duIGFzIHdyaXRhYmxlIHZpYSBXU0FFdmVudFNlbGVjdC8KLSAgLy8gV1NBV2FpdEZvck11bHRpcGxlRXZlbnRzIGFuZCB3aGVuIHdyaXRpbmcgdG8gdGhlIHNvY2tldCByZXR1cm5zCi0gIC8vIGZhaWxzIHdpdGggV1NBRVdPVUxEQkxPQ0suCi0gIC8vCi0gIC8vIFVzZWQgdG8gd29yayBhcm91bmQgdGhlIGZhY3QgdGhhdCBXU0FFdmVudFNlbGVjdCBmb3IgRkRfV1JJVEUgaXMKLSAgLy8gZWRnZS10cmlnZ2VyZWQsIHVubGlrZSBvdGhlciBldmVudHMuCi0gIC8vCi0gIC8vIFNlZSBNU0ROIGRvY3VtZW50YXRvIG4gZm9yIFdTQUV2ZW50U2VsZWN0IEZEX1dSSVRFIGZvciBtb3JlIGluZm8uCi0gIHN0YXJib2FyZDo6YXRvbWljX2Jvb2wgd3JpdGFibGU7Ci0KLSAgLy8gVGhlIGxhc3QgZXJyb3IgdGhhdCBvY2N1cnJlZCBvbiB0aGlzIHNvY2tldCwgb3Iga1NiU29ja2V0T2suCi0gIFNiU29ja2V0RXJyb3IgZXJyb3I7Ci0KLSAgLy8gVGhlIHdhaXRlciB0aGlzIHNvY2tldCBpcyByZWdpc3RlcmVkIHdpdGgsIG9yIGtTYlNvY2tldFdhaXRlckludmFsaWQuCi0gIFNiU29ja2V0V2FpdGVyIHdhaXRlcjsKLQotICBCaW5kVGFyZ2V0IGJvdW5kX3RvOwotfTsKLQotbmFtZXNwYWNlIHN0YXJib2FyZCB7Ci1uYW1lc3BhY2Ugc2hhcmVkIHsKLW5hbWVzcGFjZSB3aW4zMiB7Ci0KLWNvbnN0IHNvY2tsZW5fdCBrQWRkcmVzc0xlbmd0aElwdjQgPSA0OwotY29uc3Qgc29ja2xlbl90IGtBZGRyZXNzTGVuZ3RoSXB2NiA9IDE2OwotCi0vLyBUcmFuc2xhdGVzIGFuIGxhc3RfZXJyb3IgZnJvbSBhIHNvY2tldCBjYWxsIGludG8gYW4gU2JTb2NrZXRFcnJvci4KLVNiU29ja2V0RXJyb3IgVHJhbnNsYXRlU29ja2V0RXJyb3JTdGF0dXMoaW50IGVycm9yKTsKLQotLy8gU2V0cyBhIGJvb2xlYW4gc29ja2V0IG9wdGlvbiwgZG9pbmcgYWxsIGFwcHJvcHJpYXRlIGNoZWNrcy4KLWJvb2wgU2V0Qm9vbGVhblNvY2tldE9wdGlvbihTYlNvY2tldCBzb2NrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvcHRpb25fY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBvcHRpb25fbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHZhbHVlKTsKLQotLy8gU2V0cyBhbiBpbnRlZ2VyIHNvY2tldCBvcHRpb24sIGRvaW5nIGFsbCBhcHByb3ByaWF0ZSBjaGVja3MuCi1ib29sIFNldEludGVnZXJTb2NrZXRPcHRpb24oU2JTb2NrZXQgc29ja2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3B0aW9uX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogb3B0aW9uX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlKTsKLQotLy8gQSBoZWxwZXIgY2xhc3MgZm9yIGNvbnZlcnRpbmcgYmFjayBhbmQgZm9ydGggZnJvbSBzb2NrYWRkcnMsIHVnaC4KLWNsYXNzIFNvY2tBZGRyIHsKLSBwdWJsaWM6Ci0gIFNvY2tBZGRyKCkgOiBsZW5ndGgoc2l6ZW9mKHN0b3JhZ2VfKSkge30KLSAgflNvY2tBZGRyKCkge30KLQotICAvLyBJbml0aWFsaXplcyB0aGlzIFNvY2tBZGRyIHdpdGggdGhlIGdpdmVuIFNiU29ja2V0QWRkcmVzcywgb3ZlcndyaXRpbmcKLSAgLy8gYW55dGhpbmcgYW55IGFkZHJlc3MgcHJldmlvdXNseSBoZWxkLgotICBib29sIEZyb21TYlNvY2tldEFkZHJlc3MoY29uc3QgU2JTb2NrZXRBZGRyZXNzKiBhZGRyZXNzKTsKLQotICAvLyBJbml0aWFsaXplcyB0aGUgZ2l2ZW4gU2JTb2NrZXRBZGRyZXNzIHdpdGggdGhpcyBTb2NrQWRkciwgd2hpY2ggbXVzdCBoYXZlCi0gIC8vIGJlZW4gcHJldmlvdXNseSBpbml0aWFsaXplZC4KLSAgYm9vbCBUb1NiU29ja2V0QWRkcmVzcyhTYlNvY2tldEFkZHJlc3MqIG91dF9hZGRyZXNzKSBjb25zdDsKLQotICAvLyBJbml0aWFsaXplcyB0aGlzIFNvY2tBZGRyIHdpdGggfHNvY2tfYWRkcnwsIGFzc3VtaW5nIGl0IGlzIGFwcHJvcHJpYXRlbHkKLSAgLy8gc2l6ZWQgZm9yIGl0cyB0eXBlLgotICBib29sIEZyb21Tb2NrYWRkcihjb25zdCBzdHJ1Y3Qgc29ja2FkZHIqIHNvY2tfYWRkcik7Ci0KLSAgLy8gVGhlIHNvY2thZGRyIGZhbWlseS4gV2Ugb25seSBzdXBwb3J0IElORVQgYW5kIElORVQ2LgotICB1X3Nob3J0IGZhbWlseSgpIGNvbnN0IHsgcmV0dXJuIHNvY2thZGRyKCktPnNhX2ZhbWlseTsgfQotCi0gIHN0cnVjdCBzb2NrYWRkciogc29ja2FkZHIoKSB7Ci0gICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8c3RydWN0IHNvY2thZGRyKj4oJnN0b3JhZ2VfKTsKLSAgfQotCi0gIGNvbnN0IHN0cnVjdCBzb2NrYWRkciogc29ja2FkZHIoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc3RydWN0IHNvY2thZGRyKj4oJnN0b3JhZ2VfKTsKLSAgfQotCi0gIHN0cnVjdCBzb2NrYWRkcl9pbiogc29ja2FkZHJfaW4oKSB7Ci0gICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8c3RydWN0IHNvY2thZGRyX2luKj4oJnN0b3JhZ2VfKTsKLSAgfQotCi0gIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiogc29ja2FkZHJfaW4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc3RydWN0IHNvY2thZGRyX2luKj4oJnN0b3JhZ2VfKTsKLSAgfQotCi0gIHN0cnVjdCBzb2NrYWRkcl9pbjYqIHNvY2thZGRyX2luNigpIHsKLSAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxzdHJ1Y3Qgc29ja2FkZHJfaW42Kj4oJnN0b3JhZ2VfKTsKLSAgfQotCi0gIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbjYqIHNvY2thZGRyX2luNigpIGNvbnN0IHsKLSAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42Kj4oJnN0b3JhZ2VfKTsKLSAgfQotCi0gIC8vIFB1YmxpYyBvbiBwdXJwb3NlLCBiZWNhdXNlIGl0IHdpbGwgYmUgaGFuZHkgdG8gYmUgcGFzc2VkIGRpcmVjdGx5IGJ5Ci0gIC8vIHJlZmVyZW5jZSBpbnRvIG90aGVyIGZ1bmN0aW9ucy4KLSAgc29ja2xlbl90IGxlbmd0aDsKLQotIHByaXZhdGU6Ci0gIHNvY2thZGRyX3N0b3JhZ2Ugc3RvcmFnZV87Ci19OwotCi19ICAvLyBuYW1lc3BhY2Ugd2luMzIKLX0gIC8vIG5hbWVzcGFjZSBzaGFyZWQKLX0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKLQotI2VuZGlmICAvLyBTVEFSQk9BUkRfU0hBUkVEX1dJTjMyX1NPQ0tFVF9JTlRFUk5BTF9IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X2lzX2Nvbm5lY3RlZC5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF9pc19jb25uZWN0ZWQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZTk4MmQuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X2lzX2Nvbm5lY3RlZC5jYworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc29ja2V0LmgiCi0KLSNpbmNsdWRlIDx3aW5zb2NrMi5oPgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X2ludGVybmFsLmgiCi0KLWJvb2wgU2JTb2NrZXRJc0Nvbm5lY3RlZChTYlNvY2tldCBzb2NrZXQpIHsKLSAgaWYgKCFTYlNvY2tldElzVmFsaWQoc29ja2V0KSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIFNCX0RDSEVDSyhzb2NrZXQtPnNvY2tldF9oYW5kbGUgIT0gSU5WQUxJRF9TT0NLRVQpOwotCi0gIC8vIFRvIHRlbGwgaWYgaXQgaXMgcmVhbGx5IGNvbm5lY3RlZCwgd2UgcGVlayBhIGJ5dGUgZnJvbSB0aGUgc3RyZWFtLiBXZQotICAvLyBzaG91bGQgZ2V0IGEgYnl0ZSBiYWNrLCBvciBhbiBFQUdBSU4vRVdPVUxEQkxPQ0sgdGVsbGluZyB1cyB0aGUgc29ja2V0IGlzCi0gIC8vIHdhaXRpbmcgZm9yIGRhdGEuCi0gIGNoYXIgYzsKLSAgY29uc3QgaW50IHJlc3VsdCA9IHJlY3Yoc29ja2V0LT5zb2NrZXRfaGFuZGxlLCAmYywgMSwgTVNHX1BFRUspOwotICBpZiAocmVzdWx0ID09IDApIHsKLSAgICAvLyBJZiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQsIHRoZSByZXR1cm4gdmFsdWUgaXMgMC4KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBjb25zdCBpbnQgbGFzdF9lcnJvciA9IFdTQUdldExhc3RFcnJvcigpOwotICByZXR1cm4gKHJlc3VsdCA+IDAgfHwgbGFzdF9lcnJvciA9PSBXU0FFV09VTERCTE9DSyk7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfaXNfY29ubmVjdGVkX2FuZF9pZGxlLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X2lzX2Nvbm5lY3RlZF9hbmRfaWRsZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY2YzUwOC4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfaXNfY29ubmVjdGVkX2FuZF9pZGxlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9zb2NrZXQuaCIKLQotI2luY2x1ZGUgPHdpbnNvY2syLmg+Ci0KLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfaW50ZXJuYWwuaCIKLQotYm9vbCBTYlNvY2tldElzQ29ubmVjdGVkQW5kSWRsZShTYlNvY2tldCBzb2NrZXQpIHsKLSAgaWYgKCFTYlNvY2tldElzVmFsaWQoc29ja2V0KSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIFNCX0RDSEVDSyhzb2NrZXQtPnNvY2tldF9oYW5kbGUgIT0gSU5WQUxJRF9TT0NLRVQpOwotCi0gIC8vIFRvIHRlbGwgaWYgaXQgaXMgcmVhbGx5IGNvbm5lY3RlZCBhbmQgaWRsZSwgd2UgcGVlayBhIGJ5dGUgZnJvbSB0aGUKLSAgLy8gc3RyZWFtLiBXZSBzaG91bGQgZ2V0IGFuIEVBR0FJTi9FV09VTERCTE9DSyB0ZWxsaW5nIHVzIHRoZSBzb2NrZXQgaXMKLSAgLy8gd2FpdGluZyBmb3IgZGF0YS4KLSAgY2hhciBjOwotICBpbnQgcnYgPSByZWN2KHNvY2tldC0+c29ja2V0X2hhbmRsZSwgJmMsIDEsIE1TR19QRUVLKTsKLSAgaWYgKHJ2ICE9IFNPQ0tFVF9FUlJPUikgewotICAgIC8vIEVpdGhlciBub3QgY29ubmVjdGVkLCBvciBub3QgaWRsZS4KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gKFdTQUdldExhc3RFcnJvcigpID09IFdTQUVXT1VMREJMT0NLKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF9qb2luX211bHRpY2FzdF9ncm91cC5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF9qb2luX211bHRpY2FzdF9ncm91cC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU5ZmNiZC4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfam9pbl9tdWx0aWNhc3RfZ3JvdXAuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NvY2tldC5oIgotCi0jaW5jbHVkZSA8d2luc29jazIuaD4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF9pbnRlcm5hbC5oIgotCi1uYW1lc3BhY2Ugc2J3aW4zMiA9IHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjsKLQotYm9vbCBTYlNvY2tldEpvaW5NdWx0aWNhc3RHcm91cChTYlNvY2tldCBzb2NrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNiU29ja2V0QWRkcmVzcyogYWRkcmVzcykgewotICBpZiAoIVNiU29ja2V0SXNWYWxpZChzb2NrZXQpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKCFhZGRyZXNzKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgU0JfRENIRUNLKHNvY2tldC0+c29ja2V0X2hhbmRsZSAhPSBJTlZBTElEX1NPQ0tFVCk7Ci0gIGlwX21yZXEgaW1yZXEgPSB7MH07Ci0gIElOX0FERFIgYWRkciA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IElOX0FERFIqPihhZGRyZXNzLT5hZGRyZXNzKTsKLSAgaW1yZXEuaW1yX211bHRpYWRkci5zX2FkZHIgPSBhZGRyLlNfdW4uU19hZGRyOwotICBpbXJlcS5pbXJfaW50ZXJmYWNlLnNfYWRkciA9IElOQUREUl9BTlk7Ci0KLSAgaW50IHJlc3VsdCA9IHNldHNvY2tvcHQoc29ja2V0LT5zb2NrZXRfaGFuZGxlLCBJUFBST1RPX0lQLCBJUF9BRERfTUVNQkVSU0hJUCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJmltcmVxKSwgc2l6ZW9mKGltcmVxKSk7Ci0gIGlmIChyZXN1bHQgPT0gU09DS0VUX0VSUk9SKSB7Ci0gICAgaW50IGxhc3RfZXJyb3IgPSBXU0FHZXRMYXN0RXJyb3IoKTsKLSAgICBTQl9ETE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIElQX0FERF9NRU1CRVJTSElQIG9uIHNvY2tldCAiCi0gICAgICAgICAgICAgICAgICAgPDwgc29ja2V0LT5zb2NrZXRfaGFuZGxlIDw8ICIsIGxhc3RfZXJyb3IgPSAiIDw8IGxhc3RfZXJyb3I7Ci0gICAgc29ja2V0LT5lcnJvciA9IHNid2luMzI6OlRyYW5zbGF0ZVNvY2tldEVycm9yU3RhdHVzKGxhc3RfZXJyb3IpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHNvY2tldC0+ZXJyb3IgPSBrU2JTb2NrZXRPazsKLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfbGlzdGVuLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X2xpc3Rlbi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZmMjhmYi4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfbGlzdGVuLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9zb2NrZXQuaCIKLQotI2luY2x1ZGUgPHdpbnNvY2syLmg+Ci0KLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfaW50ZXJuYWwuaCIKLQotbmFtZXNwYWNlIHNid2luMzIgPSBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI7Ci0KLVNiU29ja2V0RXJyb3IgU2JTb2NrZXRMaXN0ZW4oU2JTb2NrZXQgc29ja2V0KSB7Ci0gIGlmICghU2JTb2NrZXRJc1ZhbGlkKHNvY2tldCkpIHsKLSAgICByZXR1cm4ga1NiU29ja2V0RXJyb3JGYWlsZWQ7Ci0gIH0KLQotICBTQl9EQ0hFQ0soc29ja2V0LT5zb2NrZXRfaGFuZGxlICE9IElOVkFMSURfU09DS0VUKTsKLQotICAvLyBVbmRlciB3aW5zb2NrLCBhIHNvY2tldCBtdXN0IGJlIGJvdW5kIGJlZm9yZSB3ZSBjYW4gbGlzdGVuIG9uIGl0LgotICBpZiAoc29ja2V0LT5ib3VuZF90byA9PSBTYlNvY2tldFByaXZhdGU6OkJpbmRUYXJnZXQ6OmtVbmJvdW5kKSB7Ci0gICAgLy8gQnkgbGlzdGVuaW5nIG9uIDo6LCB3ZSBjYW4gYWNjZXB0IGJvdGggSVB2NCBhbmQgSVB2NiBjb25uZWN0aW9ucy4KLSAgICBTYlNvY2tldEFkZHJlc3MgYW55X2FkZHJlc3MgPSB7MH07Ci0gICAgYW55X2FkZHJlc3MudHlwZSA9IHNvY2tldC0+YWRkcmVzc190eXBlOwotICAgIGlmIChTYlNvY2tldEJpbmQoc29ja2V0LCAmYW55X2FkZHJlc3MpICE9IGtTYlNvY2tldE9rKSB7Ci0gICAgICBTQl9ETE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIGJpbmQgYSBzb2NrZXQgZHVyaW5nIFNiTGlzdGVuLiI7Ci0gICAgICByZXR1cm4gKHNvY2tldC0+ZXJyb3IgPSBrU2JTb2NrZXRFcnJvckZhaWxlZCk7Ci0gICAgfQotCi0gICAgc29ja2V0LT5ib3VuZF90byA9IFNiU29ja2V0UHJpdmF0ZTo6QmluZFRhcmdldDo6a0FueTsKLSAgfQotCi0gIC8vIFRPRE86IERldGVybWluZSBpZiB3ZSBuZWVkIHRvIHNwZWNpZnkgYSA+IDAgYmFja2xvZy4gSXQgY2FuIGdvIHVwIHRvCi0gIC8vIFNPTUFYQ09OTiBhY2NvcmRpbmcgdG8gdGhlIGRvY3VtZW50YXRpb24uIFNldmVyYWwgcGxhY2VzIGluIGNocm9taXVtCi0gIC8vIHNwZWNpZnkgdGhlIGxpdGVyYWwgIjEwIiB3aXRoIHRoZSBjb21tZW50ICJtYXliZSBkb250IGFsbG93IGFueSBiYWNrbG9nPyIKLSAgaW50IHJlc3VsdCA9IGxpc3Rlbihzb2NrZXQtPnNvY2tldF9oYW5kbGUsIDApOwotICBpZiAocmVzdWx0ID09IFNPQ0tFVF9FUlJPUikgewotICAgIGludCBsYXN0X2Vycm9yID0gV1NBR2V0TGFzdEVycm9yKCk7Ci0gICAgU0JfTE9HKEVSUk9SKSA8PCAibGlzdGVuKCkgZmFpbGVkIHdpdGggbGFzdF9lcnJvciA9ICIgPDwgbGFzdF9lcnJvcjsKLSAgICByZXR1cm4gKHNvY2tldC0+ZXJyb3IgPSBzYndpbjMyOjpUcmFuc2xhdGVTb2NrZXRFcnJvclN0YXR1cyhsYXN0X2Vycm9yKSk7Ci0gIH0KLQotICByZXR1cm4gKHNvY2tldC0+ZXJyb3IgPSBrU2JTb2NrZXRPayk7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfcmVjZWl2ZV9mcm9tLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X3JlY2VpdmVfZnJvbS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAwZjMxZi4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfcmVjZWl2ZV9mcm9tLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc29ja2V0LmgiCi0KLSNpbmNsdWRlIDx3aW5zb2NrMi5oPgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X2ludGVybmFsLmgiCi0KLW5hbWVzcGFjZSBzYndpbjMyID0gc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOwotCi1uYW1lc3BhY2UgewotCi1ib29sIElzUmVwb3J0YWJsZUVycm5vKGludCBjb2RlKSB7Ci0gIHJldHVybiAoY29kZSAhPSBXU0FFV09VTERCTE9DSyAmJiBjb2RlICE9IFdTQUVDT05OUkVTRVQpOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotaW50IFNiU29ja2V0UmVjZWl2ZUZyb20oU2JTb2NrZXQgc29ja2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogb3V0X2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgU2JTb2NrZXRBZGRyZXNzKiBvdXRfc291cmNlKSB7Ci0gIGNvbnN0IGludCBrUmVjdkZsYWdzID0gMDsKLQotICBpZiAoIVNiU29ja2V0SXNWYWxpZChzb2NrZXQpKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgU0JfRENIRUNLKHNvY2tldC0+c29ja2V0X2hhbmRsZSAhPSBJTlZBTElEX1NPQ0tFVCk7Ci0gIGlmIChzb2NrZXQtPnByb3RvY29sID09IGtTYlNvY2tldFByb3RvY29sVGNwKSB7Ci0gICAgaWYgKG91dF9zb3VyY2UpIHsKLSAgICAgIHNid2luMzI6OlNvY2tBZGRyIHNvY2tfYWRkcjsKLSAgICAgIGludCByZXN1bHQgPSBnZXRwZWVybmFtZShzb2NrZXQtPnNvY2tldF9oYW5kbGUsIHNvY2tfYWRkci5zb2NrYWRkcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzb2NrX2FkZHIubGVuZ3RoKTsKLSAgICAgIGlmIChyZXN1bHQgPT0gU09DS0VUX0VSUk9SKSB7Ci0gICAgICAgIGludCBsYXN0X2Vycm9yID0gV1NBR2V0TGFzdEVycm9yKCk7Ci0gICAgICAgIFNCX0RMT0coRVJST1IpIDw8IF9fRlVOQ1RJT05fXwotICAgICAgICAgICAgICAgICAgICAgICA8PCAiOiBnZXRwZWVybmFtZSBmYWlsZWQsIGxhc3RfZXJyb3IgPSAiIDw8IGxhc3RfZXJyb3I7Ci0gICAgICAgIHNvY2tldC0+ZXJyb3IgPSBzYndpbjMyOjpUcmFuc2xhdGVTb2NrZXRFcnJvclN0YXR1cyhsYXN0X2Vycm9yKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotCi0gICAgICBpZiAoIXNvY2tfYWRkci5Ub1NiU29ja2V0QWRkcmVzcyhvdXRfc291cmNlKSkgewotICAgICAgICBTQl9ETE9HKEZBVEFMKSA8PCBfX0ZVTkNUSU9OX18gPDwgIjogQmFkIFRDUCBzb3VyY2UgYWRkcmVzcy4iOwotICAgICAgICBzb2NrZXQtPmVycm9yID0ga1NiU29ja2V0RXJyb3JGYWlsZWQ7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnQgYnl0ZXNfcmVhZCA9Ci0gICAgICAgIHJlY3Yoc29ja2V0LT5zb2NrZXRfaGFuZGxlLCBvdXRfZGF0YSwgZGF0YV9zaXplLCBrUmVjdkZsYWdzKTsKLSAgICBpZiAoYnl0ZXNfcmVhZCA+PSAwKSB7Ci0gICAgICBzb2NrZXQtPmVycm9yID0ga1NiU29ja2V0T2s7Ci0gICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihieXRlc19yZWFkKTsKLSAgICB9Ci0KLSAgICBpbnQgbGFzdF9lcnJvciA9IFdTQUdldExhc3RFcnJvcigpOwotICAgIGlmIChJc1JlcG9ydGFibGVFcnJubyhsYXN0X2Vycm9yKSAmJgotICAgICAgICBzb2NrZXQtPmVycm9yICE9IHNid2luMzI6OlRyYW5zbGF0ZVNvY2tldEVycm9yU3RhdHVzKGxhc3RfZXJyb3IpKSB7Ci0gICAgICBTQl9ETE9HKEVSUk9SKSA8PCAicmVjdiBmYWlsZWQsIGxhc3RfZXJyb3IgPSAiIDw8IGxhc3RfZXJyb3I7Ci0gICAgfQotICAgIHNvY2tldC0+ZXJyb3IgPSBzYndpbjMyOjpUcmFuc2xhdGVTb2NrZXRFcnJvclN0YXR1cyhsYXN0X2Vycm9yKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0gZWxzZSBpZiAoc29ja2V0LT5wcm90b2NvbCA9PSBrU2JTb2NrZXRQcm90b2NvbFVkcCkgewotICAgIHNid2luMzI6OlNvY2tBZGRyIHNvY2tfYWRkcjsKLSAgICBzc2l6ZV90IGJ5dGVzX3JlYWQgPQotICAgICAgICByZWN2ZnJvbShzb2NrZXQtPnNvY2tldF9oYW5kbGUsIG91dF9kYXRhLCBkYXRhX3NpemUsIGtSZWN2RmxhZ3MsCi0gICAgICAgICAgICAgICAgIHNvY2tfYWRkci5zb2NrYWRkcigpLCAmc29ja19hZGRyLmxlbmd0aCk7Ci0KLSAgICBpZiAoYnl0ZXNfcmVhZCA+PSAwKSB7Ci0gICAgICBpZiAob3V0X3NvdXJjZSkgewotICAgICAgICBpZiAoIXNvY2tfYWRkci5Ub1NiU29ja2V0QWRkcmVzcyhvdXRfc291cmNlKSkgewotICAgICAgICAgIFNCX0RMT0coRkFUQUwpIDw8IF9fRlVOQ1RJT05fXyA8PCAiOiBCYWQgVURQIHNvdXJjZSBhZGRyZXNzLiI7Ci0gICAgICAgICAgc29ja2V0LT5lcnJvciA9IGtTYlNvY2tldEVycm9yRmFpbGVkOwotICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBzb2NrZXQtPmVycm9yID0ga1NiU29ja2V0T2s7Ci0gICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihieXRlc19yZWFkKTsKLSAgICB9Ci0KLSAgICBpbnQgbGFzdF9lcnJvciA9IFdTQUdldExhc3RFcnJvcigpOwotICAgIGlmIChsYXN0X2Vycm9yICE9IFdTQUVXT1VMREJMT0NLICYmCi0gICAgICAgIHNvY2tldC0+ZXJyb3IgIT0gc2J3aW4zMjo6VHJhbnNsYXRlU29ja2V0RXJyb3JTdGF0dXMobGFzdF9lcnJvcikpIHsKLSAgICAgIFNCX0RMT0coRVJST1IpIDw8ICJyZWN2ZnJvbSBmYWlsZWQsIGxhc3RfZXJyb3IgPSAiIDw8IGxhc3RfZXJyb3I7Ci0gICAgfQotICAgIHNvY2tldC0+ZXJyb3IgPSBzYndpbjMyOjpUcmFuc2xhdGVTb2NrZXRFcnJvclN0YXR1cyhsYXN0X2Vycm9yKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBTQl9OT1RSRUFDSEVEKCkgPDwgIlVucmVjb2duaXplZCBwcm90b2NvbDogIiA8PCBzb2NrZXQtPnByb3RvY29sOwotICByZXR1cm4gLTE7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfcmVzb2x2ZS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF9yZXNvbHZlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmZlZjQ0Li4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF9yZXNvbHZlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9zb2NrZXQuaCIKLQotI2luY2x1ZGUgPHdpbnNvY2syLmg+Ci0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X2ludGVybmFsLmgiCi0KLW5hbWVzcGFjZSBzYndpbjMyID0gc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOwotCi1TYlNvY2tldFJlc29sdXRpb24qIFNiU29ja2V0UmVzb2x2ZShjb25zdCBjaGFyKiBob3N0bmFtZSwgaW50IGZpbHRlcnMpIHsKLSAgc3RydWN0IGFkZHJpbmZvKiBhaSA9IG51bGxwdHI7Ci0gIHN0cnVjdCBhZGRyaW5mbyBoaW50cyA9IHswfTsKLQotICBpZiAoZmlsdGVycyAmIGtTYlNvY2tldFJlc29sdmVGaWx0ZXJJcHY0KSB7Ci0gICAgaWYgKGZpbHRlcnMgJiBrU2JTb2NrZXRSZXNvbHZlRmlsdGVySXB2NikgewotICAgICAgaGludHMuYWlfZmFtaWx5ID0gQUZfVU5TUEVDOwotICAgIH0gZWxzZSB7Ci0gICAgICBoaW50cy5haV9mYW1pbHkgPSBBRl9JTkVUOwotICAgIH0KLSAgfSBlbHNlIGlmIChmaWx0ZXJzICYga1NiU29ja2V0UmVzb2x2ZUZpbHRlcklwdjYpIHsKLSAgICBoaW50cy5haV9mYW1pbHkgPSBBRl9JTkVUNjsKLSAgfSBlbHNlIHsKLSAgICBoaW50cy5haV9mYW1pbHkgPSBBRl9VTlNQRUM7Ci0gIH0KLQotICBoaW50cy5haV9mbGFncyA9IEFJX0FERFJDT05GSUc7Ci0gIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07Ci0KLSAgLy8gQWN0dWFsbHkgbWFrZSB0aGUgY2FsbCB0byBnZXQgdGhlIGRhdGEuCi0gIGludCBlcnIgPSBnZXRhZGRyaW5mbyhob3N0bmFtZSwgbnVsbHB0ciwgJmhpbnRzLCAmYWkpOwotICBpZiAoZXJyICE9IDAgfHwgYWkgPT0gbnVsbHB0cikgewotICAgIFNCX0RMT0coRVJST1IpIDw8ICJnZXRhZGRyaW5mbyBmYWlsZWQuICBsYXN0X2Vycm9yOiAiIDw8IFdTQUdldExhc3RFcnJvcigpOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0KLSAgaW50IGFkZHJlc3NfY291bnQgPSAwOwotICBmb3IgKGNvbnN0IGF1dG8qIGkgPSBhaTsgaSAhPSBudWxscHRyOyBpID0gaS0+YWlfbmV4dCkgewotICAgICsrYWRkcmVzc19jb3VudDsKLSAgfQotCi0gIFNiU29ja2V0UmVzb2x1dGlvbiogcmVzdWx0ID0gbmV3IFNiU29ja2V0UmVzb2x1dGlvbigpOwotCi0gIC8vIFRyYW5zbGF0ZSBhbGwgdGhlIHNvY2thZGRycy4KLSAgc3RkOjp2ZWN0b3I8c2J3aW4zMjo6U29ja0FkZHI+IHNvY2tfYWRkcnM7Ci0gIHNvY2tfYWRkcnMucmVzaXplKGFkZHJlc3NfY291bnQpOwotCi0gIHN0ZDo6dmVjdG9yPGJvb2w+IHBhcnNlZDsKLSAgcGFyc2VkLnJlc2l6ZShhZGRyZXNzX2NvdW50KTsKLQotICBpbnQgaW5kZXggPSAwOwotICBpbnQgc2tpcCA9IDA7Ci0gIGZvciAoY29uc3QgYXV0byAqaSA9IGFpOyBpICE9IG51bGxwdHI7IGkgPSBpLT5haV9uZXh0LCArK2luZGV4KSB7Ci0gICAgLy8gU2tpcCBvdmVyIGFueSBhZGRyZXNzZXMgd2UgY2FuJ3QgcGFyc2UuCi0gICAgcGFyc2VkW2luZGV4XSA9IHNvY2tfYWRkcnNbaW5kZXhdLkZyb21Tb2NrYWRkcihpLT5haV9hZGRyKTsKLSAgICBpZiAoIXBhcnNlZFtpbmRleF0pIHsKLSAgICAgICsrc2tpcDsKLSAgICB9Ci0gIH0KLQotICByZXN1bHQtPmFkZHJlc3NfY291bnQgPSBhZGRyZXNzX2NvdW50IC0gc2tpcDsKLSAgcmVzdWx0LT5hZGRyZXNzZXMgPSBuZXcgU2JTb2NrZXRBZGRyZXNzW3Jlc3VsdC0+YWRkcmVzc19jb3VudF07Ci0KLSAgaW50IHJlc3VsdF9pbmRleCA9IDA7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgYWRkcmVzc19jb3VudDsgKytpKSB7Ci0gICAgaWYgKHBhcnNlZFtpXSAmJgotICAgICAgICBzb2NrX2FkZHJzW2ldLlRvU2JTb2NrZXRBZGRyZXNzKCZyZXN1bHQtPmFkZHJlc3Nlc1tyZXN1bHRfaW5kZXhdKSkgewotICAgICAgKytyZXN1bHRfaW5kZXg7Ci0gICAgfQotICB9Ci0KLSAgZnJlZWFkZHJpbmZvKGFpKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF9zZW5kX3RvLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X3NlbmRfdG8uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NmMyYzMuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X3NlbmRfdG8uY2MKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NvY2tldC5oIgotCi0jaW5jbHVkZSA8d2luc29jazIuaD4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF9pbnRlcm5hbC5oIgotCi1uYW1lc3BhY2Ugc2J3aW4zMiA9IHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjsKLQotaW50IFNiU29ja2V0U2VuZFRvKFNiU29ja2V0IHNvY2tldCwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBkYXRhLAotICAgICAgICAgICAgICAgICAgIGludCBkYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgU2JTb2NrZXRBZGRyZXNzKiBkZXN0aW5hdGlvbikgewotICBjb25zdCBpbnQga1NlbmRGbGFncyA9IDA7Ci0gIGlmICghU2JTb2NrZXRJc1ZhbGlkKHNvY2tldCkpIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBTQl9EQ0hFQ0soc29ja2V0LT5zb2NrZXRfaGFuZGxlICE9IElOVkFMSURfU09DS0VUKTsKLSAgaWYgKHNvY2tldC0+cHJvdG9jb2wgPT0ga1NiU29ja2V0UHJvdG9jb2xUY3ApIHsKLSAgICBpZiAoZGVzdGluYXRpb24pIHsKLSAgICAgIFNCX0RMT0coRkFUQUwpIDw8ICJEZXN0aW5hdGlvbiBwYXNzZWQgdG8gVENQIHNlbmQuIjsKLSAgICAgIHNvY2tldC0+ZXJyb3IgPSBrU2JTb2NrZXRFcnJvckZhaWxlZDsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBpbnQgYnl0ZXNfd3JpdHRlbiA9Ci0gICAgICAgIHNlbmQoc29ja2V0LT5zb2NrZXRfaGFuZGxlLCBkYXRhLCBkYXRhX3NpemUsIGtTZW5kRmxhZ3MpOwotICAgIGlmIChieXRlc193cml0dGVuID49IDApIHsKLSAgICAgIHNvY2tldC0+ZXJyb3IgPSBrU2JTb2NrZXRPazsKLSAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGJ5dGVzX3dyaXR0ZW4pOwotICAgIH0KLQotICAgIGludCBsYXN0X2Vycm9yID0gV1NBR2V0TGFzdEVycm9yKCk7Ci0KLSAgICBpZiAoKGxhc3RfZXJyb3IgPT0gV1NBRVdPVUxEQkxPQ0spIHx8IChsYXN0X2Vycm9yID09IFdTQUVDT05OQUJPUlRFRCkpIHsKLSAgICAgIHNvY2tldC0+d3JpdGFibGUuc3RvcmUoZmFsc2UpOwotICAgIH0gZWxzZSB7Ci0gICAgICBTQl9ETE9HKEVSUk9SKSA8PCAic2VuZCBmYWlsZWQsIGxhc3RfZXJyb3IgPSAiIDw8IGxhc3RfZXJyb3I7Ci0gICAgfQotICAgIHNvY2tldC0+ZXJyb3IgPSBzYndpbjMyOjpUcmFuc2xhdGVTb2NrZXRFcnJvclN0YXR1cyhsYXN0X2Vycm9yKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0gZWxzZSBpZiAoc29ja2V0LT5wcm90b2NvbCA9PSBrU2JTb2NrZXRQcm90b2NvbFVkcCkgewotICAgIGlmICghZGVzdGluYXRpb24pIHsKLSAgICAgIFNCX0RMT0coRkFUQUwpIDw8ICJObyBkZXN0aW5hdGlvbiBwYXNzZWQgdG8gVURQIHNlbmQuIjsKLSAgICAgIHNvY2tldC0+ZXJyb3IgPSBrU2JTb2NrZXRFcnJvckZhaWxlZDsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBzYndpbjMyOjpTb2NrQWRkciBzb2NrX2FkZHI7Ci0gICAgY29uc3Qgc29ja2FkZHIqIHNvY2thZGRyID0gbnVsbHB0cjsKLSAgICBzb2NrbGVuX3Qgc29ja2FkZHJfbGVuZ3RoID0gMDsKLSAgICBpZiAoZGVzdGluYXRpb24pIHsKLSAgICAgIGlmICghc29ja19hZGRyLkZyb21TYlNvY2tldEFkZHJlc3MoZGVzdGluYXRpb24pKSB7Ci0gICAgICAgIFNCX0RMT0coRkFUQUwpIDw8ICJJbnZhbGlkIGRlc3RpbmF0aW9uIHBhc3NlZCB0byBVRFAgc2VuZC4iOwotICAgICAgICBzb2NrZXQtPmVycm9yID0ga1NiU29ja2V0RXJyb3JGYWlsZWQ7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgICAgIHNvY2thZGRyID0gc29ja19hZGRyLnNvY2thZGRyKCk7Ci0gICAgICBzb2NrYWRkcl9sZW5ndGggPSBzb2NrX2FkZHIubGVuZ3RoOwotICAgIH0KLQotICAgIGludCBieXRlc193cml0dGVuID0gc2VuZHRvKHNvY2tldC0+c29ja2V0X2hhbmRsZSwgZGF0YSwgZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtTZW5kRmxhZ3MsIHNvY2thZGRyLCBzb2NrYWRkcl9sZW5ndGgpOwotICAgIGlmIChieXRlc193cml0dGVuID49IDApIHsKLSAgICAgIHNvY2tldC0+ZXJyb3IgPSBrU2JTb2NrZXRPazsKLSAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGJ5dGVzX3dyaXR0ZW4pOwotICAgIH0KLQotICAgIGludCBsYXN0X2Vycm9yID0gV1NBR2V0TGFzdEVycm9yKCk7Ci0gICAgaWYgKGxhc3RfZXJyb3IgIT0gV1NBRVdPVUxEQkxPQ0spIHsKLSAgICAgIFNCX0RMT0coRVJST1IpIDw8ICJzZW5kdG8gZmFpbGVkLCBsYXN0X2Vycm9yID0gIiA8PCBsYXN0X2Vycm9yOwotICAgIH0KLSAgICBzb2NrZXQtPmVycm9yID0gc2J3aW4zMjo6VHJhbnNsYXRlU29ja2V0RXJyb3JTdGF0dXMobGFzdF9lcnJvcik7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgU0JfTk9UUkVBQ0hFRCgpIDw8ICJVbnJlY29nbml6ZWQgcHJvdG9jb2w6ICIgPDwgc29ja2V0LT5wcm90b2NvbDsKLSAgcmV0dXJuIC0xOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X3NldF9icm9hZGNhc3QuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfc2V0X2Jyb2FkY2FzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYwMTU2Yi4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfc2V0X2Jyb2FkY2FzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc29ja2V0LmgiCi0KLSNpbmNsdWRlIDx3aW5zb2NrMi5oPgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfaW50ZXJuYWwuaCIKLQotbmFtZXNwYWNlIHNid2luMzIgPSBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI7Ci0KLWJvb2wgU2JTb2NrZXRTZXRCcm9hZGNhc3QoU2JTb2NrZXQgc29ja2V0LCBib29sIHZhbHVlKSB7Ci0gIHJldHVybiBzYndpbjMyOjpTZXRCb29sZWFuU29ja2V0T3B0aW9uKHNvY2tldCwgU09MX1NPQ0tFVCwgU09fQlJPQURDQVNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU09fQlJPQURDQVNUIiwgdmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X3NldF9yZWNlaXZlX2J1ZmZlcl9zaXplLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X3NldF9yZWNlaXZlX2J1ZmZlcl9zaXplLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWQxMDhkLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF9zZXRfcmVjZWl2ZV9idWZmZXJfc2l6ZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc29ja2V0LmgiCi0KLSNpbmNsdWRlIDx3aW5zb2NrMi5oPgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfaW50ZXJuYWwuaCIKLQotbmFtZXNwYWNlIHNid2luMzIgPSBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI7Ci0KLWJvb2wgU2JTb2NrZXRTZXRSZWNlaXZlQnVmZmVyU2l6ZShTYlNvY2tldCBzb2NrZXQsIGludDMyX3Qgc2l6ZSkgewotICByZXR1cm4gc2J3aW4zMjo6U2V0SW50ZWdlclNvY2tldE9wdGlvbihzb2NrZXQsIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNPX1JDVkJVRiIsIHNpemUpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X3NldF9yZXVzZV9hZGRyZXNzLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X3NldF9yZXVzZV9hZGRyZXNzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTE0NWU2Li4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF9zZXRfcmV1c2VfYWRkcmVzcy5jYworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc29ja2V0LmgiCi0KLSNpbmNsdWRlIDx3aW5zb2NrMi5oPgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfaW50ZXJuYWwuaCIKLQotbmFtZXNwYWNlIHNid2luMzIgPSBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI7Ci0KLWJvb2wgU2JTb2NrZXRTZXRSZXVzZUFkZHJlc3MoU2JTb2NrZXQgc29ja2V0LCBib29sIHZhbHVlKSB7Ci0gIHJldHVybiBzYndpbjMyOjpTZXRCb29sZWFuU29ja2V0T3B0aW9uKHNvY2tldCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU09fUkVVU0VBRERSIiwgdmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X3NldF9zZW5kX2J1ZmZlcl9zaXplLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X3NldF9zZW5kX2J1ZmZlcl9zaXplLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzUwZTk1Li4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF9zZXRfc2VuZF9idWZmZXJfc2l6ZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc29ja2V0LmgiCi0KLSNpbmNsdWRlIDx3aW5zb2NrMi5oPgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfaW50ZXJuYWwuaCIKLQotbmFtZXNwYWNlIHNid2luMzIgPSBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI7Ci0KLWJvb2wgU2JTb2NrZXRTZXRTZW5kQnVmZmVyU2l6ZShTYlNvY2tldCBzb2NrZXQsIGludDMyX3Qgc2l6ZSkgewotICByZXR1cm4gc2J3aW4zMjo6U2V0SW50ZWdlclNvY2tldE9wdGlvbihzb2NrZXQsIFNPTF9TT0NLRVQsIFNPX1NOREJVRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNPX1NOREJVRiIsIHNpemUpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X3NldF90Y3Bfa2VlcF9hbGl2ZS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF9zZXRfdGNwX2tlZXBfYWxpdmUuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyODIwYzkuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X3NldF90Y3Bfa2VlcF9hbGl2ZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc29ja2V0LmgiCi0KLSNpbmNsdWRlIDx3aW5zb2NrMi5oPgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X2ludGVybmFsLmgiCi0KLW5hbWVzcGFjZSBzYndpbjMyID0gc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOwotCi1ib29sIFNiU29ja2V0U2V0VGNwS2VlcEFsaXZlKFNiU29ja2V0IHNvY2tldCwgYm9vbCB2YWx1ZSwgU2JUaW1lIHBlcmlvZCkgewotICBTQl9VTlJFRkVSRU5DRURfUEFSQU1FVEVSKHBlcmlvZCk7Ci0gIGNvbnN0IERXT1JEIHNob3VsZF9zZXRfa2VlcGFsaXZlID0gdmFsdWU7Ci0gIGJvb2wgcmVzdWx0ID0gc2J3aW4zMjo6U2V0Qm9vbGVhblNvY2tldE9wdGlvbigKLSAgICAgIHNvY2tldCwgU09MX1NPQ0tFVCwgU09fS0VFUEFMSVZFLCAiU09fS0VFUEFMSVZFIiwgdmFsdWUpOwotICByZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X3NldF90Y3Bfbm9fZGVsYXkuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfc2V0X3RjcF9ub19kZWxheS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk0ZDc0My4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfc2V0X3RjcF9ub19kZWxheS5jYworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc29ja2V0LmgiCi0KLSNpbmNsdWRlIDx3aW5zb2NrMi5oPgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfaW50ZXJuYWwuaCIKLQotbmFtZXNwYWNlIHNid2luMzIgPSBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI7Ci0KLWJvb2wgU2JTb2NrZXRTZXRUY3BOb0RlbGF5KFNiU29ja2V0IHNvY2tldCwgYm9vbCB2YWx1ZSkgewotICByZXR1cm4gc2J3aW4zMjo6U2V0Qm9vbGVhblNvY2tldE9wdGlvbihzb2NrZXQsIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRDUF9OT0RFTEFZIiwgdmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X3NldF90Y3Bfd2luZG93X3NjYWxpbmcuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfc2V0X3RjcF93aW5kb3dfc2NhbGluZy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEwZTI5YS4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfc2V0X3RjcF93aW5kb3dfc2NhbGluZy5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc29ja2V0LmgiCi0KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jaW5jbHVkZSA8d2luc29jazIuaD4KLQotLy8gTm90ZSB0aGF0IHdpbmRvd3MuaCBhbmQgd2luc29jazIuaCBtdXN0IGJlIGluY2x1ZGVkIGJlZm9yZSB0aGVzZS4KLSNpbmNsdWRlIDxtc3dzb2NrLmg+Ci0jaW5jbHVkZSA8c2RrZGRrdmVyLmg+Ci0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF9pbnRlcm5hbC5oIgotCi1ib29sIFNiU29ja2V0U2V0VGNwV2luZG93U2NhbGluZyhTYlNvY2tldCBzb2NrZXQsIGJvb2wgZW5hYmxlX3dpbmRvd19zY2FsaW5nKSB7Ci0gIC8vIEZyb20KLSAgLy8gaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS93aW5kb3dzL2Rlc2t0b3AvY2MxMzYxMDModj12cy44NSkuYXNweDoKLSAgLy8gIldoZW4gdGhlIFRhcmdldE9zVmVyc2lvbiBtZW1iZXIgaXMgc2V0IHRvIGEgdmFsdWUgZm9yIFdpbmRvd3MgVmlzdGEgb3IKLSAgLy8gbGF0ZXIsIHJlY2VpdmUgd2luZG93IGF1dG8tdHVuaW5nIGlzIGVuYWJsZWQgYW5kIHRoZSBUQ1Agd2luZG93IHNjYWxlCi0gIC8vIGZhY3RvciBpcyByZWR1Y2VkIHRvIDIgZnJvbSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiA4LiIKLQotICBjb25zdCBVTE9ORyB0YXJnZXRfb3NfdmVyc2lvbiA9Ci0gICAgICBlbmFibGVfd2luZG93X3NjYWxpbmcgPyBOVERESV9WSVNUQSA6IE5URERJX1dTMDM7Ci0gIFdTQV9DT01QQVRJQklMSVRZX01PREUgY29tcGF0aWJpbGl0eV9tb2RlID0ge1dzYUJlaGF2aW9yQXV0b1R1bmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X29zX3ZlcnNpb259OwotCi0gIERXT1JEIGtaZXJvID0gMDsKLSAgaW50IHJldHVybl92YWx1ZSA9IFdTQUlvY3RsKAotICAgICAgc29ja2V0LT5zb2NrZXRfaGFuZGxlLCBTSU9fU0VUX0NPTVBBVElCSUxJVFlfTU9ERSwgJmNvbXBhdGliaWxpdHlfbW9kZSwKLSAgICAgIHNpemVvZihXU0FfQ09NUEFUSUJJTElUWV9NT0RFKSwgbnVsbHB0ciwgMCwgJmtaZXJvLCBudWxscHRyLCBudWxscHRyKTsKLQotICByZXR1cm4gcmV0dXJuX3ZhbHVlICE9IFNPQ0tFVF9FUlJPUjsKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF93YWl0ZXJfYWRkLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X3dhaXRlcl9hZGQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNWQ5ZGMuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X3dhaXRlcl9hZGQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NvY2tldF93YWl0ZXIuaCIKLQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF93YWl0ZXJfaW50ZXJuYWwuaCIKLQotYm9vbCBTYlNvY2tldFdhaXRlckFkZChTYlNvY2tldFdhaXRlciB3YWl0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIFNiU29ja2V0IHNvY2tldCwKLSAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgU2JTb2NrZXRXYWl0ZXJDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IGludGVyZXN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwZXJzaXN0ZW50KSB7Ci0gIGlmICghU2JTb2NrZXRXYWl0ZXJJc1ZhbGlkKHdhaXRlcikpIHsKLSAgICBTQl9ETE9HKEVSUk9SKSA8PCBfX0ZVTkNUSU9OX18gPDwgIjogV2FpdGVyICgiIDw8IHdhaXRlciA8PCAiKSBpcyBpbnZhbGlkLiI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKCFTYlNvY2tldElzVmFsaWQoc29ja2V0KSkgewotICAgIFNCX0RMT0coRVJST1IpIDw8IF9fRlVOQ1RJT05fXyA8PCAiOiBTb2NrZXQgKCIgPDwgc29ja2V0IDw8ICIpIGlzIGludmFsaWQuIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoIWNhbGxiYWNrKSB7Ci0gICAgU0JfRExPRyhFUlJPUikgPDwgX19GVU5DVElPTl9fIDw8ICI6IE5vIGNhbGxiYWNrIHByb3ZpZGVkLiI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKCFpbnRlcmVzdHMpIHsKLSAgICBTQl9ETE9HKEVSUk9SKSA8PCBfX0ZVTkNUSU9OX18gPDwgIjogTm8gaW50ZXJlc3RzIHByb3ZpZGVkLiI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIHdhaXRlci0+QWRkKHNvY2tldCwgY29udGV4dCwgY2FsbGJhY2ssIGludGVyZXN0cywgcGVyc2lzdGVudCk7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfd2FpdGVyX2NyZWF0ZS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF93YWl0ZXJfY3JlYXRlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWU4Y2QwLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF93YWl0ZXJfY3JlYXRlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9zb2NrZXRfd2FpdGVyLmgiCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF93YWl0ZXJfaW50ZXJuYWwuaCIKLQotU2JTb2NrZXRXYWl0ZXIgU2JTb2NrZXRXYWl0ZXJDcmVhdGUoKSB7Ci0gIHJldHVybiBuZXcgU2JTb2NrZXRXYWl0ZXJQcml2YXRlKCk7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfd2FpdGVyX2Rlc3Ryb3kuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfd2FpdGVyX2Rlc3Ryb3kuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5YjM4ZTEuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X3dhaXRlcl9kZXN0cm95LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9zb2NrZXRfd2FpdGVyLmgiCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF93YWl0ZXJfaW50ZXJuYWwuaCIKLQotYm9vbCBTYlNvY2tldFdhaXRlckRlc3Ryb3koU2JTb2NrZXRXYWl0ZXIgd2FpdGVyKSB7Ci0gIGlmICghU2JTb2NrZXRXYWl0ZXJJc1ZhbGlkKHdhaXRlcikpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgZGVsZXRlIHdhaXRlcjsKLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfd2FpdGVyX2ludGVybmFsLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X3dhaXRlcl9pbnRlcm5hbC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU3OTRmMS4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfd2FpdGVyX2ludGVybmFsLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDg5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF93YWl0ZXJfaW50ZXJuYWwuaCIKLQotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9jb21tb24vb3B0aW9uYWwuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9lcnJvcl91dGlscy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X2ludGVybmFsLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfcHJpdmF0ZS5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvdGltZV91dGlscy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC90aHJlYWQuaCIKLQotbmFtZXNwYWNlIHNid2luMzIgPSBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI7Ci0KLW5hbWVzcGFjZSB7Ci0KLS8vIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gdGhhdCB0YWtlcyBkYXRhIGZyb20gfG5ldHdvcmtfZXZlbnRzfCwgYW5kIHRoZW4KLS8vIGFkZHMgdGhlIGJpdHdpc2UgT1JzIHxpbnRlcmVzdF90b19hZGR8IG9udG8gfGludGVyZXN0X291dHwuCi0vLyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHNlZQotLy8gaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS93aW5kb3dzL2Rlc2t0b3AvbXM3NDE1NzIodj12cy44NSkuYXNweC4KLXZvaWQgVHJhbnNsYXRlTmV0d29ya0JpdEludG9JbnRlcmVzdHMoY29uc3QgV1NBTkVUV09SS0VWRU5UUyYgbmV0d29ya19ldmVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRfdG9fY2hlY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiU29ja2V0V2FpdGVySW50ZXJlc3QgaW50ZXJlc3RfdG9fYWRkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYlNvY2tldFdhaXRlckludGVyZXN0KiBpbnRlcmVzdHNfb3V0KSB7Ci0gIFNCX0RDSEVDSyhpbnRlcmVzdHNfb3V0KTsKLQotICBzdGF0aWNfYXNzZXJ0KAotICAgICAgc2l6ZW9mKFNiU29ja2V0V2FpdGVySW50ZXJlc3QpID09IHNpemVvZihpbnQpLAotICAgICAgIkFzc3VtaW5nIHNpemUgb2YgZW51bSBpcyBzaXplIG9mIGludCwgZHVlIHRvIHRoZSBiaXRmaWVsZCBsb2dpYyBiZWxvdy4iKTsKLQotICBpZiAobmV0d29ya19ldmVudHMubE5ldHdvcmtFdmVudHMgJiAoMSA8PCBiaXRfdG9fY2hlY2spKSB7Ci0gICAgKihyZWludGVycHJldF9jYXN0PGludCo+KGludGVyZXN0c19vdXQpKSB8PQotICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGludGVyZXN0X3RvX2FkZCk7Ci0gICAgY29uc3QgaW50IGVycm9yX2NvZGUgPSBuZXR3b3JrX2V2ZW50cy5pRXJyb3JDb2RlW2JpdF90b19jaGVja107Ci0gICAgaWYgKGVycm9yX2NvZGUgIT0gMCkgewotICAgICAgU0JfRExPRyhFUlJPUikgPDwgIkVycm9yIG9uIG5ldHdvcmsgZXZlbnQgIiA8PCBiaXRfdG9fY2hlY2sgPDwgIiAiCi0gICAgICAgICAgICAgICAgICAgICA8PCBzYndpbjMyOjpXaW4zMkVycm9yQ29kZShlcnJvcl9jb2RlKTsKLSAgICB9Ci0gIH0KLX0KLQotU2JTb2NrZXRXYWl0ZXJJbnRlcmVzdCBEaXNjb3Zlck5ldHdvcmtFdmVudEludGVyZXN0cyhTT0NLRVQgc29ja2V0X2hhbmRsZSkgewotICAvLyBQbGVhc2UgdGFrZSBub3RlIHRoYXQgV1NBRW51bU5ldHdvcmtFdmVudHMgYmVsb3cgb25seSB3b3JrcyB3aXRoCi0gIC8vIFdTQUV2ZW50U2VsZWN0LgotICBTYlNvY2tldFdhaXRlckludGVyZXN0IGludGVyZXN0cyA9IGtTYlNvY2tldFdhaXRlckludGVyZXN0Tm9uZTsKLSAgV1NBTkVUV09SS0VWRU5UUyBuZXR3b3JrX2V2ZW50cyA9IHswfTsKLSAgaW50IHJldHVybl9jb2RlID0KLSAgICAgIFdTQUVudW1OZXR3b3JrRXZlbnRzKHNvY2tldF9oYW5kbGUsIG51bGxwdHIsICZuZXR3b3JrX2V2ZW50cyk7Ci0gIGlmIChyZXR1cm5fY29kZSA9PSBTT0NLRVRfRVJST1IpIHsKLSAgICBpbnQgbGFzdF9lcnJvciA9IFdTQUdldExhc3RFcnJvcigpOwotICAgIFNCX0RMT0coRVJST1IpIDw8ICJXU0FFbnVtTmV0d29ya0V2ZW50cyBmYWlsZWQgd2l0aCBsYXN0X2Vycm9yID0gIgotICAgICAgICAgICAgICAgICAgIDw8IHNid2luMzI6OldpbjMyRXJyb3JDb2RlKGxhc3RfZXJyb3IpOwotICAgIHJldHVybiBpbnRlcmVzdHM7Ci0gIH0KLQotICAvLyBUcmFuc2xhdGUgaW5mb3JtYXRpb24gZnJvbSBXU0FFbnVtTmV0d29ya0V2ZW50cyB0byBpbnRlcmVzdHM6Ci0gIC8vIEZyb20gdGhlIE1TRE4gZG9jdW1lbnRhdGlvbjoKLSAgLy8gaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS93aW5kb3dzL2Rlc2t0b3AvbXM3NDE1NzIodj12cy44NSkuYXNweAotICAvLyBUaGUgbE5ldHdvcmtFdmVudHMgbWVtYmVyIG9mIHRoZSBXU0FORVRXT1JLRVZFTlRTIHN0cnVjdHVyZSBpbmRpY2F0ZXMgd2hpY2gKLSAgLy8gb2YgdGhlIEZEX1hYWCBuZXR3b3JrIGV2ZW50cyBoYXZlIG9jY3VycmVkLiBUaGUgaUVycm9yQ29kZSBhcnJheSBpcyB1c2VkIHRvCi0gIC8vIGNvbnRhaW4gYW55IGFzc29jaWF0ZWQgZXJyb3IgY29kZXMgd2l0aCB0aGUgYXJyYXkgaW5kZXggY29ycmVzcG9uZGluZyB0bwotICAvLyB0aGUgcG9zaXRpb24gb2YgZXZlbnQgYml0cyBpbiBsTmV0d29ya0V2ZW50cy4gSWRlbnRpZmllcnMgc3VjaCBhcwotICAvLyBGRF9SRUFEX0JJVCBhbmQgRkRfV1JJVEVfQklUIGNhbiBiZSB1c2VkIHRvIGluZGV4IHRoZSBpRXJyb3JDb2RlIGFycmF5LgotICAvLyBOb3RlIHRoYXQgb25seSB0aG9zZSBlbGVtZW50cyBvZiB0aGUgaUVycm9yQ29kZSBhcnJheSBhcmUgc2V0IHRoYXQKLSAgLy8gY29ycmVzcG9uZCB0byB0aGUgYml0cyBzZXQgaW4gbE5ldHdvcmtFdmVudHMgcGFyYW1ldGVyCi0gIFRyYW5zbGF0ZU5ldHdvcmtCaXRJbnRvSW50ZXJlc3RzKG5ldHdvcmtfZXZlbnRzLCBGRF9SRUFEX0JJVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1NiU29ja2V0V2FpdGVySW50ZXJlc3RSZWFkLCAmaW50ZXJlc3RzKTsKLSAgVHJhbnNsYXRlTmV0d29ya0JpdEludG9JbnRlcmVzdHMobmV0d29ya19ldmVudHMsIEZEX0FDQ0VQVF9CSVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtTYlNvY2tldFdhaXRlckludGVyZXN0UmVhZCwgJmludGVyZXN0cyk7Ci0gIFRyYW5zbGF0ZU5ldHdvcmtCaXRJbnRvSW50ZXJlc3RzKG5ldHdvcmtfZXZlbnRzLCBGRF9DTE9TRV9CSVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtTYlNvY2tldFdhaXRlckludGVyZXN0UmVhZCwgJmludGVyZXN0cyk7Ci0KLSAgVHJhbnNsYXRlTmV0d29ya0JpdEludG9JbnRlcmVzdHMobmV0d29ya19ldmVudHMsIEZEX0NPTk5FQ1RfQklULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrU2JTb2NrZXRXYWl0ZXJJbnRlcmVzdFdyaXRlLCAmaW50ZXJlc3RzKTsKLSAgVHJhbnNsYXRlTmV0d29ya0JpdEludG9JbnRlcmVzdHMobmV0d29ya19ldmVudHMsIEZEX1dSSVRFX0JJVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1NiU29ja2V0V2FpdGVySW50ZXJlc3RXcml0ZSwgJmludGVyZXN0cyk7Ci0KLSAgcmV0dXJuIGludGVyZXN0czsKLX0KLQotLy8gVGhlIGZ1bmN0aW9uIGVyYXNlcyB0aGUgfGluZGV4fHRoIGVsZW1lbnQgZnJvbSB0aGUgY29sbGVjdGlvbiBieSBzd2FwcGluZwotLy8gaXQgd2l0aCB0aGUgbGFzdCBlbGVtZW50LiAgVGhpcyBvcGVyYXRpb24gbGVhdmVzIGFsbCB0aGUgb3RoZXIgZWxlbWVudHMgaW4KLS8vIHBsYWNlLCB3aGljaCBpcyB1c2VmdWwgZm9yIHNvbWUgb3BlcmF0aW9ucy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotdm9pZCBFcmFzZUluZGV4RnJvbVZlY3RvcihUKiBjb2xsZWN0aW9uX3BvaW50ZXIsIHN0ZDo6c2l6ZV90IGluZGV4KSB7Ci0gIFNCX0RDSEVDSyhjb2xsZWN0aW9uX3BvaW50ZXIpOwotICBUJiBjb2xsZWN0aW9uID0gKmNvbGxlY3Rpb25fcG9pbnRlcjsKLSAgY29uc3Qgc3RkOjpzaXplX3QgY3VycmVudF9zaXplID0gY29sbGVjdGlvbi5zaXplKCk7Ci0gIGlmIChjdXJyZW50X3NpemUgPD0gMSkgewotICAgIGNvbGxlY3Rpb24uY2xlYXIoKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgY29uc3Qgc3RkOjpzaXplX3QgbmV3X3NpemUgPSBjb2xsZWN0aW9uLnNpemUoKSAtIDE7Ci0gIHN0ZDo6c3dhcChjb2xsZWN0aW9uW2luZGV4XSwgY29sbGVjdGlvbltuZXdfc2l6ZV0pOwotICBjb2xsZWN0aW9uLnJlc2l6ZShuZXdfc2l6ZSk7Ci19Ci0KLVNiU29ja2V0V2FpdGVySW50ZXJlc3QgQ29tYmluZUludGVyZXN0cygKLSAgICBTYlNvY2tldFdhaXRlckludGVyZXN0IGEsIFNiU29ja2V0V2FpdGVySW50ZXJlc3QgYikgewotICBpbnQgYV9pbnQgPSBzdGF0aWNfY2FzdDxpbnQ+KGEpOwotICBpbnQgYl9pbnQgPSBzdGF0aWNfY2FzdDxpbnQ+KGIpOwotICByZXR1cm4gc3RhdGljX2Nhc3Q8U2JTb2NrZXRXYWl0ZXJJbnRlcmVzdD4oYV9pbnQgfCBiX2ludCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1TYlNvY2tldFdhaXRlclByaXZhdGU6OlNiU29ja2V0V2FpdGVyUHJpdmF0ZSgpCi0gICAgOiB0aHJlYWRfKFNiVGhyZWFkR2V0Q3VycmVudCgpKSwKLSAgICAgIHdha2V1cF9ldmVudF90b2tlbl8oLTEpLAotICAgICAgd2FrZXVwX2V2ZW50XyhDcmVhdGVFdmVudChudWxscHRyLCBmYWxzZSwgZmFsc2UsIG51bGxwdHIpKSB7Ci0gIHsKLSAgICBzdGFyYm9hcmQ6OlNjb3BlZExvY2sgbG9jayh1bmhhbmRsZWRfd2FrZXVwX2NvdW50X211dGV4Xyk7Ci0gICAgdW5oYW5kbGVkX3dha2V1cF9jb3VudF8gPSAwOwotICB9Ci0gIGlmICh3YWtldXBfZXZlbnRfLklzVmFsaWQoKSA9PSBmYWxzZSkgewotICAgIFNCX0RMT0coRVJST1IpIDw8ICJDb3VsZCBub3QgY3JlYXRlIHdha2V1cCBldmVudDogIgotICAgICAgICAgICAgICAgICAgIDw8IHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6V2luMzJFcnJvckNvZGUoR2V0TGFzdEVycm9yKCkpOwotICAgIHJldHVybjsKLSAgfQotICB3YWtldXBfZXZlbnRfdG9rZW5fID0KLSAgICAgIHdhaXRlZXNfLkFkZFNvY2tldEV2ZW50QW5kV2FpdGVlKHdha2V1cF9ldmVudF8uR2V0RXZlbnQoKSwgbnVsbHB0cik7Ci19Ci0KLVNiU29ja2V0V2FpdGVyUHJpdmF0ZTo6flNiU29ja2V0V2FpdGVyUHJpdmF0ZSgpIHsKLSAgZm9yIChhdXRvJiBpdCA6IHdhaXRlZXNfLkdldFdhaXRlZXMoKSkgewotICAgIGlmIChpdCkgewotICAgICAgU0JfRENIRUNLKENoZWNrU29ja2V0V2FpdGVySXNUaGlzKGl0LT5zb2NrZXQpKTsKLSAgICB9Ci0gIH0KLX0KLQotYm9vbCBTYlNvY2tldFdhaXRlclByaXZhdGU6OkFkZChTYlNvY2tldCBzb2NrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiU29ja2V0V2FpdGVyQ2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnRlcmVzdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcGVyc2lzdGVudCkgewotICBTQl9EQ0hFQ0soU2JUaHJlYWRJc0N1cnJlbnQodGhyZWFkXykpOwotCi0gIGlmICghU2JTb2NrZXRJc1ZhbGlkKHNvY2tldCkpIHsKLSAgICBTQl9ETE9HKEVSUk9SKSA8PCBfX0ZVTkNUSU9OX18gPDwgIjogU29ja2V0ICgiIDw8IHNvY2tldCA8PCAiKSBpcyBpbnZhbGlkLiI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKCFpbnRlcmVzdHMpIHsKLSAgICBTQl9ETE9HKEVSUk9SKSA8PCBfX0ZVTkNUSU9OX18gPDwgIjogTm8gaW50ZXJlc3RzIHByb3ZpZGVkLiI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gVGhlIHBvbGljeSBpcyBub3QgdG8gYWRkIGEgc29ja2V0IHRvIGEgd2FpdGVyIGlmIGl0IGlzIHJlZ2lzdGVyZWQgd2l0aAotICAvLyBhbm90aGVyIHdhaXRlci4KLQotICAvLyBUT0RPOiBJZiBhbnlvbmUgd2VyZSB0byB3YW50IHRvIGFkZCBhIHNvY2tldCB0byBhIGRpZmZlcmVudCB3YWl0ZXIsCi0gIC8vIGl0IHdvdWxkIHByb2JhYmx5IGJlIGFub3RoZXIgdGhyZWFkLCBzbyBkb2luZyB0aGlzIGNoZWNrIHdpdGhvdXQgbG9ja2luZyBpcwotICAvLyBwcm9iYWJseSB3cm9uZy4gQnV0LCBpdCBpcyBhbHNvIGEgcGFpbiwgYW5kLCBhdCB0aGlzIHByZWNpc2UgbW9tZW50LCBzb2NrZXQKLSAgLy8gYWNjZXNzIGlzIGFsbCBnb2luZyB0byBjb21lIGZyb20gb25lIEkvTyB0aHJlYWQgYW55d2F5LCBhbmQgdGhlcmUgd2lsbCBvbmx5Ci0gIC8vIGJlIG9uZSB3YWl0ZXIuCi0gIGlmIChTYlNvY2tldFdhaXRlcklzVmFsaWQoc29ja2V0LT53YWl0ZXIpKSB7Ci0gICAgaWYgKHNvY2tldC0+d2FpdGVyID09IHRoaXMpIHsKLSAgICAgIFNCX0RMT0coRVJST1IpIDw8IF9fRlVOQ1RJT05fXyA8PCAiOiBTb2NrZXQgYWxyZWFkeSBoYXMgdGhpcyB3YWl0ZXIgKCIKLSAgICAgICAgICAgICAgICAgICAgIDw8IHRoaXMgPDwgIikuIjsKLSAgICB9IGVsc2UgewotICAgICAgU0JfRExPRyhFUlJPUikgPDwgX19GVU5DVElPTl9fIDw8ICI6IFNvY2tldCBhbHJlYWR5IGhhcyB3YWl0ZXIgKCIKLSAgICAgICAgICAgICAgICAgICAgIDw8IHNvY2tldC0+d2FpdGVyIDw8ICIsIHRoaXM9IiA8PCB0aGlzIDw8ICIpLiI7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGludCBuZXR3b3JrX2V2ZW50X2ludGVyZXN0cyA9IDA7Ci0gIGlmIChpbnRlcmVzdHMgJiBrU2JTb2NrZXRXYWl0ZXJJbnRlcmVzdFJlYWQpIHsKLSAgICBuZXR3b3JrX2V2ZW50X2ludGVyZXN0cyB8PSBGRF9SRUFEIHwgRkRfQUNDRVBUIHwgRkRfQ0xPU0U7Ci0gIH0KLQotICBpZiAoaW50ZXJlc3RzICYga1NiU29ja2V0V2FpdGVySW50ZXJlc3RXcml0ZSkgewotICAgIG5ldHdvcmtfZXZlbnRfaW50ZXJlc3RzIHw9IEZEX0NPTk5FQ1QgfCBGRF9XUklURTsKLSAgfQotCi0gIGNvbnN0IEJPT0wgbWFudWFsX3Jlc2V0ID0gIXBlcnNpc3RlbnQ7Ci0KLSAgU0JfRENIRUNLKCFzb2NrZXQtPnNvY2tldF9ldmVudC5Jc1ZhbGlkKCkpOwotCi0gIHNvY2tldC0+c29ja2V0X2V2ZW50LlJlc2V0KAotICAgICAgQ3JlYXRlRXZlbnQobnVsbHB0ciwgbWFudWFsX3Jlc2V0LCBmYWxzZSwgbnVsbHB0cikpOwotICBpZiAoc29ja2V0LT5zb2NrZXRfZXZlbnQuR2V0RXZlbnQoKSA9PSBXU0FfSU5WQUxJRF9FVkVOVCkgewotICAgIGludCBsYXN0X2Vycm9yID0gV1NBR2V0TGFzdEVycm9yKCk7Ci0gICAgU0JfRExPRyhFUlJPUikgPDwgIkVycm9yIGNhbGxpbmcgV1NBQ3JlYXRlRXZlbnQoKSBsYXN0X2Vycm9yID0gIgotICAgICAgICAgICAgICAgICAgIDw8IHNid2luMzI6OldpbjMyRXJyb3JDb2RlKGxhc3RfZXJyb3IpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIE5vdGUgdGhhdCBXU0FFbnVtTmV0d29ya0V2ZW50cyB1c2VkIGVsc2V3aGVyZSBvbmx5IHdvcmtzIHdpdGgKLSAgLy8gV1NBRXZlbnRTZWxlY3QuCi0gIC8vIFBsZWFzZSBjb25zaWRlciB0aGF0IGJlZm9yZSBjaGFuZ2luZyB0aGlzIGNvZGUuCi0gIGludCByZXR1cm5fdmFsdWUgPQotICAgICAgV1NBRXZlbnRTZWxlY3Qoc29ja2V0LT5zb2NrZXRfaGFuZGxlLCBzb2NrZXQtPnNvY2tldF9ldmVudC5HZXRFdmVudCgpLAotICAgICAgICAgICAgICAgICAgICAgbmV0d29ya19ldmVudF9pbnRlcmVzdHMpOwotCi0gIGlmIChyZXR1cm5fdmFsdWUgPT0gU09DS0VUX0VSUk9SKSB7Ci0gICAgaW50IGxhc3RfZXJyb3IgPSBXU0FHZXRMYXN0RXJyb3IoKTsKLSAgICBTQl9ETE9HKEVSUk9SKSA8PCAiRXJyb3IgY2FsbGluZyBXU0FFdmVudFNlbGVjdCgpIGxhc3RfZXJyb3IgPSAiCi0gICAgICAgICAgICAgICAgICAgPDwgc2J3aW4zMjo6V2luMzJFcnJvckNvZGUobGFzdF9lcnJvcik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKHdhaXRlZXNfLkdldEhhbmRsZUFycmF5U2l6ZSgpID49IE1BWElNVU1fV0FJVF9PQkpFQ1RTKSB7Ci0gICAgU0JfRExPRyhFUlJPUikgPDwgIlJlYWNoZWQgbWF4ZWQgbnVtYmVyIG9mIHNvY2tldCBldmVudHMgKCIKLSAgICAgICAgICAgICAgICAgICA8PCBNQVhJTVVNX1dBSVRfT0JKRUNUUyA8PCAiKSI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPFdhaXRlZT4gd2FpdGVlKAotICAgICAgbmV3IFdhaXRlZSh0aGlzLCBzb2NrZXQsIGNvbnRleHQsIGNhbGxiYWNrLCBpbnRlcmVzdHMsIHBlcnNpc3RlbnQpKTsKLSAgd2FpdGVlc18uQWRkU29ja2V0RXZlbnRBbmRXYWl0ZWUoc29ja2V0LT5zb2NrZXRfZXZlbnQuR2V0RXZlbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHdhaXRlZSkpOwotICBzb2NrZXQtPndhaXRlciA9IHRoaXM7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgU2JTb2NrZXRXYWl0ZXJQcml2YXRlOjpSZW1vdmUoU2JTb2NrZXQgc29ja2V0KSB7Ci0gIFNCX0RDSEVDSyhTYlRocmVhZElzQ3VycmVudCh0aHJlYWRfKSk7Ci0KLSAgaWYgKCFDaGVja1NvY2tldFdhaXRlcklzVGhpcyhzb2NrZXQpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgc29ja2V0LT53YWl0ZXIgPSBrU2JTb2NrZXRXYWl0ZXJJbnZhbGlkOwotCi0gIHNvY2tldC0+c29ja2V0X2V2ZW50LlJlc2V0KG51bGxwdHIpOwotICByZXR1cm4gd2FpdGVlc18uUmVtb3ZlU29ja2V0KHNvY2tldCk7Ci19Ci0KLXZvaWQgU2JTb2NrZXRXYWl0ZXJQcml2YXRlOjpIYW5kbGVXYWtlVXBSZWFkKCkgewotICBTQl9MT0coSU5GTykgPDwgIkhhbmRsZVdha2VVcFJlYWQgaW5jcmVtZW50aW5nIGNvdW50ZXIuLiI7Ci0gIHN0YXJib2FyZDo6U2NvcGVkTG9jayBsb2NrKHVuaGFuZGxlZF93YWtldXBfY291bnRfbXV0ZXhfKTsKLSAgKyt1bmhhbmRsZWRfd2FrZXVwX2NvdW50XzsKLX0KLQotdm9pZCBTYlNvY2tldFdhaXRlclByaXZhdGU6OlNpZ25hbFdha2V1cEV2ZW50KCkgewotICBTQl9EQ0hFQ0sod2FrZXVwX2V2ZW50Xy5Jc1ZhbGlkKCkpOwotICBXU0FTZXRFdmVudCh3YWtldXBfZXZlbnRfLkdldEV2ZW50KCkpOwotfQotCi12b2lkIFNiU29ja2V0V2FpdGVyUHJpdmF0ZTo6UmVzZXRXYWtldXBFdmVudCgpIHsKLSAgU0JfRENIRUNLKHdha2V1cF9ldmVudF8uSXNWYWxpZCgpKTsKLSAgV1NBUmVzZXRFdmVudCh3YWtldXBfZXZlbnRfLkdldEV2ZW50KCkpOwotfQotCi1ib29sIFNiU29ja2V0V2FpdGVyUHJpdmF0ZTo6Q2hlY2tTb2NrZXRXYWl0ZXJJc1RoaXMoU2JTb2NrZXQgc29ja2V0KSB7Ci0gIGlmICghU2JTb2NrZXRJc1ZhbGlkKHNvY2tldCkpIHsKLSAgICBTQl9ETE9HKEVSUk9SKSA8PCBfX0ZVTkNUSU9OX18gPDwgIjogU29ja2V0ICgiIDw8IHNvY2tldCA8PCAiKSBpcyBpbnZhbGlkLiI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKHNvY2tldC0+d2FpdGVyICE9IHRoaXMpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBTYlNvY2tldFdhaXRlclByaXZhdGU6OldhaXQoKSB7Ci0gIFNCX0RDSEVDSyhTYlRocmVhZElzQ3VycmVudCh0aHJlYWRfKSk7Ci0KLSAgLy8gV2UgYmFzaWNhbGx5IHdhaXQgZm9yIHRoZSBsYXJnZXN0IGFtb3VudCBvZiB0aW1lIHRvIGFjaGlldmUgYW4gaW5kZWZpbml0ZQotICAvLyBibG9jay4KLSAgV2FpdFRpbWVkKGtTYlRpbWVNYXgpOwotfQotCi1TYlNvY2tldFdhaXRlclJlc3VsdCBTYlNvY2tldFdhaXRlclByaXZhdGU6OldhaXRUaW1lZChTYlRpbWUgZHVyYXRpb24pIHsKLSAgU0JfRENIRUNLKFNiVGhyZWFkSXNDdXJyZW50KHRocmVhZF8pKTsKLQotICBjb25zdCBTYlRpbWVNb25vdG9uaWMgc3RhcnRfdGltZSA9IFNiVGltZUdldE1vbm90b25pY05vdygpOwotICBpbnQ2NF90IGR1cmF0aW9uX2xlZnQgPSBkdXJhdGlvbjsKLQotICB3aGlsZSAodHJ1ZSkgewotICAgIC8vIHx3YWl0ZWVzX3wgY291bGQgaGF2ZSBiZWVuIG1vZGlmaWVkIGluIHRoZSBsYXN0IGxvb3AgaXRlcmF0aW9uLCBzbwotICAgIC8vIHJlLXJlYWQgaXQuCi0gICAgY29uc3QgRFdPUkQgbnVtYmVyX2V2ZW50cyA9Ci0gICAgICAgIHN0YXRpY19jYXN0PERXT1JEPih3YWl0ZWVzXy5HZXRIYW5kbGVBcnJheVNpemUoKSk7Ci0KLSAgICBjb25zdCBEV09SRCBtaWxsaXMgPSBzYndpbjMyOjpDb252ZXJ0U2JUaW1lVG9NaWxsaXNSb3VuZFVwKGR1cmF0aW9uX2xlZnQpOwotCi0gICAgewotICAgICAgc3RhcmJvYXJkOjpTY29wZWRMb2NrIGxvY2sodW5oYW5kbGVkX3dha2V1cF9jb3VudF9tdXRleF8pOwotICAgICAgaWYgKHVuaGFuZGxlZF93YWtldXBfY291bnRfID4gMCkgewotICAgICAgICAtLXVuaGFuZGxlZF93YWtldXBfY291bnRfOwotICAgICAgICAvLyBUaGUgc2lnbmFsaW5nIHRocmVhZCBhbHNvIHNldCB0aGUgZXZlbnQsIHNvIHJlc2V0IGl0LgotICAgICAgICBSZXNldFdha2V1cEV2ZW50KCk7Ci0gICAgICAgIHJldHVybiBrU2JTb2NrZXRXYWl0ZXJSZXN1bHRXb2tlblVwOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIFRoZXJlIHNob3VsZCBhbHdheXMgYmUgYSB3YWtldXAgZXZlbnQuCi0gICAgU0JfRENIRUNLKG51bWJlcl9ldmVudHMgPiAwKTsKLQotICAgIFNiU29ja2V0IG1heWJlX3dyaXRhYmxlX3NvY2tldCA9IGtTYlNvY2tldEludmFsaWQ7Ci0gICAgZm9yIChhdXRvJiBpdCA6IHdhaXRlZXNfLkdldFdhaXRlZXMoKSkgewotICAgICAgaWYgKCFpdCkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGlmICgoaXQtPmludGVyZXN0cyAmIGtTYlNvY2tldFdhaXRlckludGVyZXN0V3JpdGUpID09IDApIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBpZiAoaXQtPnNvY2tldC0+d3JpdGFibGUubG9hZCgpKSB7Ci0gICAgICAgIG1heWJlX3dyaXRhYmxlX3NvY2tldCA9IGl0LT5zb2NrZXQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICAgIGJvb2wgaGFzX3dyaXRhYmxlID0gKG1heWJlX3dyaXRhYmxlX3NvY2tldCAhPSBrU2JTb2NrZXRJbnZhbGlkKTsKLSAgICBEV09SRCByZXR1cm5fdmFsdWUgPSBXU0FXYWl0Rm9yTXVsdGlwbGVFdmVudHMoCi0gICAgICAgIG51bWJlcl9ldmVudHMsIHdhaXRlZXNfLkdldEhhbmRsZUFycmF5KCksCi0gICAgICAgIGZhbHNlLCBoYXNfd3JpdGFibGUgPyAwIDogbWlsbGlzLCBmYWxzZSk7Ci0KLSAgICBpZiAoaGFzX3dyaXRhYmxlIHx8ICgocmV0dXJuX3ZhbHVlID49IFdTQV9XQUlUX0VWRU5UXzApICYmCi0gICAgICAgIChyZXR1cm5fdmFsdWUgPCAoV1NBX1dBSVRfRVZFTlRfMCArIG51bWJlcl9ldmVudHMpKSkpIHsKLSAgICAgIGludDY0X3Qgc29ja2V0X2luZGV4OwotICAgICAgaWYgKGhhc193cml0YWJsZSkgewotICAgICAgICBzb2NrZXRfaW5kZXggPSB3YWl0ZWVzXy5HZXRJbmRleChtYXliZV93cml0YWJsZV9zb2NrZXQpLnZhbHVlKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzb2NrZXRfaW5kZXggPSBzdGF0aWNfY2FzdDxpbnQ2NF90PihyZXR1cm5fdmFsdWUpIC0KLSAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50NjRfdD4oV1NBX1dBSVRfRVZFTlRfMCk7Ci0gICAgICB9Ci0gICAgICBTQl9EQ0hFQ0soc29ja2V0X2luZGV4ID49IDApOwotICAgICAgaWYgKHNvY2tldF9pbmRleCA8IDApIHsKLSAgICAgICAgU0JfTk9UUkVBQ0hFRCgpIDw8ICJCYWQgc29ja2V0X2luZGV4LiAiIDw8IHNvY2tldF9pbmRleDsKLSAgICAgICAgcmV0dXJuIGtTYlNvY2tldFdhaXRlclJlc3VsdFRpbWVkT3V0OwotICAgICAgfQotCi0gICAgICAvLyBNYWtlIHN1cmUgd2FrZXVwX2V2ZW50X3Rva2VuXyBpcyBpbml0aWFsaXplZC4KLSAgICAgIFNCX0RDSEVDSyh3YWtldXBfZXZlbnRfdG9rZW5fID49IDApOwotCi0gICAgICBpZiAoc29ja2V0X2luZGV4ID09IHdha2V1cF9ldmVudF90b2tlbl8pIHsKLSAgICAgICAgc3RhcmJvYXJkOjpTY29wZWRMb2NrIGxvY2sodW5oYW5kbGVkX3dha2V1cF9jb3VudF9tdXRleF8pOwotICAgICAgICBTQl9EQ0hFQ0sodW5oYW5kbGVkX3dha2V1cF9jb3VudF8gPiAwKTsKLQotICAgICAgICAtLXVuaGFuZGxlZF93YWtldXBfY291bnRfOwotICAgICAgICAvLyBUaGlzIHdhcyBhIGR1bW15IGV2ZW50LiAgV2Ugd2VyZSB3b2tlbiB1cC4KLSAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGRvIG5vdCBuZWVkIHRvIHJlc2V0IHRoZSBldmVudCBoZXJlLAotICAgICAgICAvLyBzaW5jZSBpdCB3YXMgY3JlYXRlZCB1c2luZyBhbiBhdXRvLXJlc2V0IGZsYWcuCi0gICAgICAgIHJldHVybiBrU2JTb2NrZXRXYWl0ZXJSZXN1bHRXb2tlblVwOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgV2FpdGVlKiB3YWl0ZWUgPSB3YWl0ZWVzXy5HZXRXYWl0ZWVCeUluZGV4KHNvY2tldF9pbmRleCk7Ci0KLSAgICAgICAgLy8gUmVtb3ZlIHRoZSBub24tcGVyc2lzdGVudCB3YWl0ZWUgYmVmb3JlIGNhbGxpbmcgdGhlIGNhbGxiYWNrLCBzbwotICAgICAgICAvLyB0aGF0IHdlIGNhbiBhZGQgYW5vdGhlciB3YWl0ZWUgaW4gdGhlIGNhbGxiYWNrIGlmIHdlIG5lZWQgdG8uIFRoaXMKLSAgICAgICAgLy8gaXMgYWxzbyB3aHkgd2UgY29weSBhbGwgdGhlIGZpZWxkcyB3ZSBuZWVkIG91dCBvZiB3YWl0ZWUuCi0gICAgICAgIGNvbnN0IFNiU29ja2V0IHNvY2tldCA9IHdhaXRlZS0+c29ja2V0OwotICAgICAgICBjb25zdCBTYlNvY2tldFdhaXRlckNhbGxiYWNrIGNhbGxiYWNrID0gd2FpdGVlLT5jYWxsYmFjazsKLSAgICAgICAgdm9pZCogY29udGV4dCA9IHdhaXRlZS0+Y29udGV4dDsKLQotICAgICAgICAvLyBOb3RlOiB0aGlzIHNob3VsZCBhbHNvIGdvIGJlZm9yZSBSZW1vdmUoKS4KLSAgICAgICAgU2JTb2NrZXRXYWl0ZXJJbnRlcmVzdCBpbnRlcmVzdHMgPQotICAgICAgICAgICAgRGlzY292ZXJOZXR3b3JrRXZlbnRJbnRlcmVzdHMoc29ja2V0LT5zb2NrZXRfaGFuZGxlKTsKLQotICAgICAgICBpZiAoKHdhaXRlZS0+aW50ZXJlc3RzICYga1NiU29ja2V0V2FpdGVySW50ZXJlc3RXcml0ZSkgJiYKLSAgICAgICAgICAgICAgc29ja2V0LT53cml0YWJsZS5sb2FkKCkpIHsKLSAgICAgICAgICBpbnRlcmVzdHMgPSBDb21iaW5lSW50ZXJlc3RzKGludGVyZXN0cywga1NiU29ja2V0V2FpdGVySW50ZXJlc3RXcml0ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoaW50ZXJlc3RzICYga1NiU29ja2V0V2FpdGVySW50ZXJlc3RXcml0ZSkgewotICAgICAgICAgIHNvY2tldC0+d3JpdGFibGUuc3RvcmUodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXdhaXRlZS0+cGVyc2lzdGVudCkgewotICAgICAgICAgIFJlbW92ZSh3YWl0ZWUtPnNvY2tldCk7Ci0gICAgICAgIH0KLQotICAgICAgICBjYWxsYmFjayh0aGlzLCBzb2NrZXQsIGNvbnRleHQsIGludGVyZXN0cyk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChyZXR1cm5fdmFsdWUgPT0gV1NBX1dBSVRfRkFJTEVEKSB7Ci0gICAgICBTQl9ETE9HKEVSUk9SKSA8PCAiV2FpdCBmYWlsZWQgLS0gIgotICAgICAgICAgICAgICAgICAgICAgPDwgc2J3aW4zMjo6V2luMzJFcnJvckNvZGUoV1NBR2V0TGFzdEVycm9yKCkpOwotICAgICAgcmV0dXJuIGtTYlNvY2tldFdhaXRlclJlc3VsdEludmFsaWQ7Ci0gICAgfSBlbHNlIGlmIChyZXR1cm5fdmFsdWUgPT0gV1NBX1dBSVRfVElNRU9VVCkgewotICAgICAgLy8gRG8gbm90aGluZywgY2hlY2sgdGltZSBvdXJzZWx2ZXMuCi0gICAgfSBlbHNlIHsKLSAgICAgIFNCX05PVFJFQUNIRUQoKSA8PCAiVW5oYW5kbGVkIGNhc2U6ICIgPDwgcmV0dXJuX3ZhbHVlOwotICAgICAgcmV0dXJuIGtTYlNvY2tldFdhaXRlclJlc3VsdEludmFsaWQ7Ci0gICAgfQotCi0gICAgY29uc3QgaW50NjRfdCB0aW1lX2VsYXBzZWQgPQotICAgICAgICBzdGF0aWNfY2FzdDxzdGQ6OmludDY0X3Q+KFNiVGltZUdldE1vbm90b25pY05vdygpKSAtCi0gICAgICAgIHN0YXRpY19jYXN0PHN0ZDo6aW50NjRfdD4oc3RhcnRfdGltZSk7Ci0gICAgZHVyYXRpb25fbGVmdCAtPSB0aW1lX2VsYXBzZWQ7Ci0gICAgaWYgKGR1cmF0aW9uX2xlZnQgPCAwKSB7Ci0gICAgICByZXR1cm4ga1NiU29ja2V0V2FpdGVyUmVzdWx0VGltZWRPdXQ7Ci0gICAgfQotICB9Ci0KLSAgU0JfTk9UUkVBQ0hFRCgpIDw8ICJJbnZhbGlkIHN0YXRlIHJlYWNoZWQiOwotICByZXR1cm4ga1NiU29ja2V0V2FpdGVyUmVzdWx0SW52YWxpZDsKLX0KLQotdm9pZCBTYlNvY2tldFdhaXRlclByaXZhdGU6Oldha2VVcCgpIHsKLSAgLy8gSW5jcmVhc2luZyB1bmhhbmRsZWRfd2FrZXVwX2NvdW50X211dGV4XyBhbmQgY2FsbGluZyBTaWduYWxXYWtldXBFdmVudAotICAvLyBhdG9taWNhbGx5IGhlbHBzIGFkZCBhZGRpdGlvbmFsIGd1YXJhbnRlZXMgb2Ygd2hlbiB0aGUgd2FpdGVyIGNhbiBiZQotICAvLyB3b2tlbiB1cC4gIFdoaWxlIHdlIGNhbiBjb2RlIGFyb3VuZCB0aGlzIGVhc2lseSwgaGF2aW5nIGEgc3Ryb25nZXIKLSAgLy8gY291cGxpbmcgZW5hYmxlcyB1cyB0byBhZGQgRENIRUNLcyBmb3IgfHVuaGFuZGxlZF93YWtldXBfY291bnRffCBpbiBvdGhlcgotICAvLyBwYXJ0cyBvZiB0aGUgY29kZS4KLSAgc3RhcmJvYXJkOjpTY29wZWRMb2NrIGxvY2sodW5oYW5kbGVkX3dha2V1cF9jb3VudF9tdXRleF8pOwotICArK3VuaGFuZGxlZF93YWtldXBfY291bnRfOwotICBTaWduYWxXYWtldXBFdmVudCgpOwotfQotCi1TYlNvY2tldFdhaXRlclByaXZhdGU6OldhaXRlZSogU2JTb2NrZXRXYWl0ZXJQcml2YXRlOjpXYWl0ZWVSZWdpc3RyeTo6R2V0V2FpdGVlKAotICAgIFNiU29ja2V0IHNvY2tldCkgewotICBzdGFyYm9hcmQ6Om9wdGlvbmFsPGludDY0X3Q+IHRva2VuID0gR2V0SW5kZXgoc29ja2V0KTsKLSAgaWYgKCF0b2tlbikgewotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIHJldHVybiB3YWl0ZWVzX1t0b2tlbi52YWx1ZSgpXS5nZXQoKTsKLX0KLQotc3RhcmJvYXJkOjpvcHRpb25hbDxpbnQ2NF90PgotU2JTb2NrZXRXYWl0ZXJQcml2YXRlOjpXYWl0ZWVSZWdpc3RyeTo6R2V0SW5kZXgoU2JTb2NrZXQgc29ja2V0KSB7Ci0gIGF1dG8gaXRlcmF0b3IgPSBzb2NrZXRfdG9faW5kZXhfbWFwXy5maW5kKHNvY2tldCk7Ci0gIGlmIChpdGVyYXRvciA9PSBzb2NrZXRfdG9faW5kZXhfbWFwXy5lbmQoKSkgewotICAgIHJldHVybiBzdGFyYm9hcmQ6Om51bGxvcHQ7Ci0gIH0KLSAgcmV0dXJuIGl0ZXJhdG9yLT5zZWNvbmQ7Ci19Ci0KLVNiU29ja2V0V2FpdGVyUHJpdmF0ZTo6V2FpdGVlUmVnaXN0cnk6Okxvb2t1cFRva2VuCi1TYlNvY2tldFdhaXRlclByaXZhdGU6OldhaXRlZVJlZ2lzdHJ5OjpBZGRTb2NrZXRFdmVudEFuZFdhaXRlZSgKLSAgICBXU0FFVkVOVCBzb2NrZXRfZXZlbnQsCi0gICAgc3RkOjp1bmlxdWVfcHRyPFdhaXRlZT4gd2FpdGVlKSB7Ci0gIFNCX0RDSEVDSyhzb2NrZXRfZXZlbnQgIT0gV1NBX0lOVkFMSURfRVZFTlQpOwotICBTQl9EQ0hFQ0soc29ja2V0X2V2ZW50c18uc2l6ZSgpID09IHdhaXRlZXNfLnNpemUoKSk7Ci0gIFNiU29ja2V0IHNvY2tldCA9IGtTYlNvY2tldEludmFsaWQ7Ci0gIGlmICh3YWl0ZWUpIHsKLSAgICBzb2NrZXQgPSB3YWl0ZWUtPnNvY2tldDsKLSAgfQotICBzb2NrZXRfdG9faW5kZXhfbWFwXy5lbXBsYWNlKHNvY2tldCwgc29ja2V0X2V2ZW50c18uc2l6ZSgpKTsKLSAgc29ja2V0X2V2ZW50c18uZW1wbGFjZV9iYWNrKHNvY2tldF9ldmVudCk7Ci0gIHdhaXRlZXNfLmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUod2FpdGVlKSk7Ci0KLSAgcmV0dXJuIHNvY2tldF9ldmVudHNfLnNpemUoKSAtIDE7Ci19Ci0KLWJvb2wgU2JTb2NrZXRXYWl0ZXJQcml2YXRlOjpXYWl0ZWVSZWdpc3RyeTo6UmVtb3ZlU29ja2V0KFNiU29ja2V0IHNvY2tldCkgewotICBhdXRvIGl0ZXJhdG9yID0gc29ja2V0X3RvX2luZGV4X21hcF8uZmluZChzb2NrZXQpOwotICBpZiAoaXRlcmF0b3IgPT0gc29ja2V0X3RvX2luZGV4X21hcF8uZW5kKCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBjb25zdCBzdGQ6OnNpemVfdCBjdXJyZW50X3NpemUgPSBzb2NrZXRfZXZlbnRzXy5zaXplKCk7Ci0gIFNCX0RDSEVDSyhjdXJyZW50X3NpemUgPT0gd2FpdGVlc18uc2l6ZSgpKTsKLQotICBjb25zdCBzdGQ6OnNpemVfdCBzb2NrZXRfaW5kZXggPSBpdGVyYXRvci0+c2Vjb25kOwotICBTYlNvY2tldCBzb2NrZXRfdG9fc3dhcCA9IHdhaXRlZXNfW2N1cnJlbnRfc2l6ZSAtIDFdLT5zb2NrZXQ7Ci0KLSAgLy8gU2luY2UgfEVyYXNlSW5kZXhGcm9tVmVjdG9yfCB3aWxsIHN3YXAgdGhlIGxhc3Qgc29ja2V0IGFuZCB0aGUgc29ja2V0Ci0gIC8vIGF0IGN1cnJlbnQgaW5kZXgsIHxzb2NrZXRfdG9faW5kZXhffCB3aWxsIG5lZWQgdG8gYmUgdXBkYXRlZC4KLSAgc29ja2V0X3RvX2luZGV4X21hcF9bc29ja2V0X3RvX3N3YXBdID0gc29ja2V0X2luZGV4OwotICAvLyBOb3RlIHRoYXQgfEVyYXNlSW5kZXhGcm9tVmVjdG9yfCBvbmx5IHRvdWNoZXMgdGhlIGxhc3QgZWxlbWVudCBhbmQgdGhlCi0gIC8vIGVsZW1lbnQgdG8gcmVtb3ZlLgotICBFcmFzZUluZGV4RnJvbVZlY3Rvcigmc29ja2V0X2V2ZW50c18sIHNvY2tldF9pbmRleCk7Ci0gIEVyYXNlSW5kZXhGcm9tVmVjdG9yKCZ3YWl0ZWVzXywgc29ja2V0X2luZGV4KTsKLQotICBzb2NrZXRfdG9faW5kZXhfbWFwXy5lcmFzZShzb2NrZXQpOwotCi0gIFNCX0RDSEVDSyhzb2NrZXRfZXZlbnRzXy5zaXplKCkgPT0gd2FpdGVlc18uc2l6ZSgpKTsKLSAgU0JfRENIRUNLKHNvY2tldF9ldmVudHNfLnNpemUoKSA9PSBzb2NrZXRfdG9faW5kZXhfbWFwXy5zaXplKCkpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotU2JTb2NrZXRXYWl0ZXJQcml2YXRlOjpXYWl0ZWUqCi1TYlNvY2tldFdhaXRlclByaXZhdGU6OldhaXRlZVJlZ2lzdHJ5OjpHZXRXYWl0ZWVCeUluZGV4KAotICAgIGNvbnN0IFNiU29ja2V0V2FpdGVyUHJpdmF0ZTo6V2FpdGVlUmVnaXN0cnk6Okxvb2t1cFRva2VuIHNvY2tldF9pbmRleCkgewotICBTQl9EQ0hFQ0soc29ja2V0X2luZGV4ID49IDApOwotCi0gIFNCX0RDSEVDSyhzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4oc29ja2V0X2luZGV4KSA8PSBzb2NrZXRfZXZlbnRzXy5zaXplKCkpOwotICByZXR1cm4gd2FpdGVlc19bc29ja2V0X2luZGV4XS5nZXQoKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF93YWl0ZXJfaW50ZXJuYWwuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF93YWl0ZXJfaW50ZXJuYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIxZDkzYS4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfd2FpdGVyX2ludGVybmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBTVEFSQk9BUkRfU0hBUkVEX1dJTjMyX1NPQ0tFVF9XQUlURVJfSU5URVJOQUxfSF8KLSNkZWZpbmUgU1RBUkJPQVJEX1NIQVJFRF9XSU4zMl9TT0NLRVRfV0FJVEVSX0lOVEVSTkFMX0hfCi0KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jaW5jbHVkZSA8d2luc29jazIuaD4KLQotI2luY2x1ZGUgPGRlcXVlPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9jb21tb24vb3B0aW9uYWwuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbXV0ZXguaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL2ludGVybmFsX29ubHkuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2F1dG9fZXZlbnRfaGFuZGxlLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc29ja2V0LmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NvY2tldF93YWl0ZXIuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvdGhyZWFkLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3R5cGVzLmgiCi0KLW5hbWVzcGFjZSBzYndpbjMyID0gc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOwotCi0jcHJhZ21hIHdhcm5pbmcocHVzaCkKLQotLy8gU2JTb2NrZXRXYWl0ZXJQcml2YXRlIGlzIGRlZmluZWQgYXMgYSBzdHJ1Y3QsIGJ1dCBmb3Igd2luZG93cyBpbXBsZW1lbnRhdGlvbgotLy8gZW5vdWdoIGZ1bmN0aW9uYWxpdHkgaGFzIGJlZW4gYWRkZWQgc28gdGhhdCBpdCB3YXJyYW50cyBiZWluZyBhIGNsYXNzCi0vLyBwZXIgR29vZ2xlJ3MgQysrIHN0eWxlIGd1aWRlLiAgVGhpcyBtaXNtYXRjaCBjYXVzZXMgdGhlIE1pY3Jvc29mdCdzIGNvbXBpbGVyCi0vLyB0byBnZW5lcmF0ZSBhIHdhcm5pbmcuCi0jcHJhZ21hIHdhcm5pbmcoZGlzYWJsZSA6IDQwOTkpCi1jbGFzcyBTYlNvY2tldFdhaXRlclByaXZhdGUgewotIHB1YmxpYzoKLSAgU2JTb2NrZXRXYWl0ZXJQcml2YXRlKCk7Ci0gIH5TYlNvY2tldFdhaXRlclByaXZhdGUoKTsKLQotICAvLyBUaGVzZSBtZXRob2RzIGltcGxlbWVudCB0aGUgU2JTb2NrZXRXYWl0ZXIgQVBJIGRlZmluZWQgaW4gc29ja2V0X3dhaXRlci5oLgotICBib29sIEFkZChTYlNvY2tldCBzb2NrZXQsCi0gICAgICAgICAgIHZvaWQqIGNvbnRleHQsCi0gICAgICAgICAgIFNiU29ja2V0V2FpdGVyQ2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgIGludCBpbnRlcmVzdHMsCi0gICAgICAgICAgIGJvb2wgcGVyc2lzdGVudCk7Ci0gIGJvb2wgUmVtb3ZlKFNiU29ja2V0IHNvY2tldCk7Ci0gIHZvaWQgV2FpdCgpOwotICBTYlNvY2tldFdhaXRlclJlc3VsdCBXYWl0VGltZWQoU2JUaW1lIGR1cmF0aW9uKTsKLSAgdm9pZCBXYWtlVXAoKTsKLSAgdm9pZCBIYW5kbGVXYWtlVXBSZWFkKCk7Ci0KLSBwcml2YXRlOgotICAvLyBBIHJlZ2lzdHJhdGlvbiBvZiBhIHNvY2tldCB3aXRoIGEgc29ja2V0IHdhaXRlci4KLSAgc3RydWN0IFdhaXRlZSB7Ci0gICAgV2FpdGVlKFNiU29ja2V0V2FpdGVyIHdhaXRlciwKLSAgICAgICAgICAgU2JTb2NrZXQgc29ja2V0LAotICAgICAgICAgICB2b2lkKiBjb250ZXh0LAotICAgICAgICAgICBTYlNvY2tldFdhaXRlckNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICBpbnQgaW50ZXJlc3RzLAotICAgICAgICAgICBib29sIHBlcnNpc3RlbnQpCi0gICAgICAgIDogd2FpdGVyKHdhaXRlciksCi0gICAgICAgICAgc29ja2V0KHNvY2tldCksCi0gICAgICAgICAgY29udGV4dChjb250ZXh0KSwKLSAgICAgICAgICBjYWxsYmFjayhjYWxsYmFjayksCi0gICAgICAgICAgaW50ZXJlc3RzKGludGVyZXN0cyksCi0gICAgICAgICAgcGVyc2lzdGVudChwZXJzaXN0ZW50KSB7fQotICAgIC8vIFRoZSB3YWl0ZXIgdGhpcyBldmVudCBpcyByZWdpc3RlcmVkIHdpdGguCi0gICAgU2JTb2NrZXRXYWl0ZXIgd2FpdGVyOwotCi0gICAgLy8gVGhlIHNvY2tldCByZWdpc3RlcmVkIHdpdGggdGhlIHdhaXRlci4KLSAgICBTYlNvY2tldCBzb2NrZXQ7Ci0KLSAgICAvLyBBIGNvbnRleHQgdmFsdWUgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgY2FsbGJhY2suCi0gICAgdm9pZCogY29udGV4dDsKLQotICAgIC8vIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gb25lIG9yIG1vcmUgcmVnaXN0ZXJlZCBpbnRlcmVzdHMgYmVjb21lIHJlYWR5LgotICAgIFNiU29ja2V0V2FpdGVyQ2FsbGJhY2sgY2FsbGJhY2s7Ci0KLSAgICAvLyBUaGUgc2V0IG9mIGludGVyZXN0cyByZWdpc3RlcmVkIHdpdGggdGhlIHdhaXRlci4KLSAgICBpbnQgaW50ZXJlc3RzOwotCi0gICAgLy8gV2hldGhlciB0aGlzIFdhaXRlZSBzaG91bGQgc3RheSByZWdpc3RlcmVkIGFmdGVyIHRoZSBuZXh0IGNhbGxiYWNrLgotICAgIGJvb2wgcGVyc2lzdGVudDsKLSAgfTsKLQotICBjbGFzcyBXYWl0ZWVSZWdpc3RyeSB7Ci0gICBwdWJsaWM6Ci0gICAgdHlwZWRlZiBpbnQ2NF90IExvb2t1cFRva2VuOwotICAgIHR5cGVkZWYgc3RkOjpkZXF1ZTxzdGQ6OnVuaXF1ZV9wdHI8V2FpdGVlPj4gV2FpdGVlczsKLSAgICB0eXBlZGVmIHN0ZDo6dW5vcmRlcmVkX21hcDxTYlNvY2tldCwgc3RkOjpzaXplX3Q+IFNvY2tldFRvSW5kZXg7Ci0KLSAgICBXU0FFVkVOVCogR2V0SGFuZGxlQXJyYXkoKSB7IHJldHVybiBzb2NrZXRfZXZlbnRzXy5kYXRhKCk7IH0KLSAgICBzdGQ6OnNpemVfdCBHZXRIYW5kbGVBcnJheVNpemUoKSB7IHJldHVybiBzb2NrZXRfZXZlbnRzXy5zaXplKCk7IH0KLSAgICBjb25zdCBXYWl0ZWVzJiBHZXRXYWl0ZWVzKCkgY29uc3QgeyByZXR1cm4gd2FpdGVlc187IH0KLQotICAgIC8vIEdldHMgdGhlIFdhaXRlZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHNvY2tldCwgb3IgbnVsbHB0ci4KLSAgICBXYWl0ZWUqIEdldFdhaXRlZShTYlNvY2tldCBzb2NrZXQpOwotCi0gICAgLy8gR2V0cyB0aGUgaW5kZXggYnkgc29ja2V0Ci0gICAgc3RhcmJvYXJkOjpvcHRpb25hbDxpbnQ2NF90PiBHZXRJbmRleChTYlNvY2tldCBzb2NrZXQpOwotCi0gICAgLy8gR2V0cyB0aGUgV2FpdGVlIGJ5IGluZGV4LgotICAgIFdhaXRlZSogR2V0V2FpdGVlQnlJbmRleChMb29rdXBUb2tlbiBzb2NrZXRfaW5kZXgpOwotCi0gICAgLy8gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGV2ZW50LgotICAgIExvb2t1cFRva2VuIEFkZFNvY2tldEV2ZW50QW5kV2FpdGVlKFdTQUVWRU5UIHNvY2tldF9ldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8V2FpdGVlPiB3YWl0ZWUpOwotICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBzb2NrZXQgd2FzIGZvdW5kLCBhbmQgcmVtb3ZlZC4KLSAgICBib29sIFJlbW92ZVNvY2tldChTYlNvY2tldCBzb2NrZXQpOwotCi0gICBwcml2YXRlOgotICAgIFNvY2tldFRvSW5kZXggc29ja2V0X3RvX2luZGV4X21hcF87Ci0gICAgc3RkOjp2ZWN0b3I8V1NBRVZFTlQ+IHNvY2tldF9ldmVudHNfOwotICAgIHN0ZDo6ZGVxdWU8c3RkOjp1bmlxdWVfcHRyPFdhaXRlZT4+IHdhaXRlZXNfOwotICB9OwotCi0gIHZvaWQgU2lnbmFsV2FrZXVwRXZlbnQoKTsKLSAgdm9pZCBSZXNldFdha2V1cEV2ZW50KCk7Ci0KLSAgYm9vbCBDaGVja1NvY2tldFdhaXRlcklzVGhpcyhTYlNvY2tldCBzb2NrZXQpOwotCi0gIC8vIFRoZSB0aHJlYWQgdGhpcyB3YWl0ZXIgd2FzIGNyZWF0ZWQgb24uIEltbXV0YWJsZSwgc28gYWNjZXNzaWJsZSBmcm9tIGFueQotICAvLyB0aHJlYWQuCi0gIGNvbnN0IFNiVGhyZWFkIHRocmVhZF87Ci0KLSAgLy8gVGhlIHJlZ2lzdHJ5IG9mIGN1cnJlbnRseSByZWdpc3RlcmVkIFdhaXRlZXMuCi0gIFdhaXRlZVJlZ2lzdHJ5IHdhaXRlZXNfOwotICBXYWl0ZWVSZWdpc3RyeTo6TG9va3VwVG9rZW4gd2FrZXVwX2V2ZW50X3Rva2VuXzsKLQotICAvLyBUaGlzIG11dGV4IGNvdmVycyB0aGUgbmV4dCB0d28gdmFyaWFibGVzLgotICBzdGFyYm9hcmQ6Ok11dGV4IHVuaGFuZGxlZF93YWtldXBfY291bnRfbXV0ZXhfOwotICAvLyBOdW1iZXIgb2YgdGltZXMgd2FrZSB1cCBoYXMgYmVlbiBjYWxsZWQsIGFuZCBub3QgaGFuZGxlZC4KLSAgc3RkOjppbnQzMl90IHVuaGFuZGxlZF93YWtldXBfY291bnRfOwotICAvLyBUaGUgV1NBRXZlbnQgdGhhdCBpcyBzZXQgYnkgV2FrZXVwKCk7Ci0gIHNid2luMzI6OkF1dG9FdmVudEhhbmRsZSB3YWtldXBfZXZlbnRfOwotfTsKLSNwcmFnbWEgd2FybmluZyhwb3ApCi0KLSNlbmRpZiAgLy8gU1RBUkJPQVJEX1NIQVJFRF9XSU4zMl9TT0NLRVRfV0FJVEVSX0lOVEVSTkFMX0hfCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfd2FpdGVyX3JlbW92ZS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF93YWl0ZXJfcmVtb3ZlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjlhOTZjLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF93YWl0ZXJfcmVtb3ZlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9zb2NrZXRfd2FpdGVyLmgiCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF93YWl0ZXJfaW50ZXJuYWwuaCIKLQotYm9vbCBTYlNvY2tldFdhaXRlclJlbW92ZShTYlNvY2tldFdhaXRlciB3YWl0ZXIsIFNiU29ja2V0IHNvY2tldCkgewotICBpZiAoIVNiU29ja2V0V2FpdGVySXNWYWxpZCh3YWl0ZXIpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIHdhaXRlci0+UmVtb3ZlKHNvY2tldCk7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfd2FpdGVyX3dhaXQuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfd2FpdGVyX3dhaXQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5OGI2ZDEuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X3dhaXRlcl93YWl0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9zb2NrZXRfd2FpdGVyLmgiCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF93YWl0ZXJfaW50ZXJuYWwuaCIKLQotdm9pZCBTYlNvY2tldFdhaXRlcldhaXQoU2JTb2NrZXRXYWl0ZXIgd2FpdGVyKSB7Ci0gIGlmICghU2JTb2NrZXRXYWl0ZXJJc1ZhbGlkKHdhaXRlcikpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICB3YWl0ZXItPldhaXQoKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF93YWl0ZXJfd2FpdF90aW1lZC5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF93YWl0ZXJfd2FpdF90aW1lZC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgyMzIxOC4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfd2FpdGVyX3dhaXRfdGltZWQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NvY2tldF93YWl0ZXIuaCIKLQotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X3dhaXRlcl9pbnRlcm5hbC5oIgotCi1TYlNvY2tldFdhaXRlclJlc3VsdCBTYlNvY2tldFdhaXRlcldhaXRUaW1lZChTYlNvY2tldFdhaXRlciB3YWl0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYlRpbWUgZHVyYXRpb24pIHsKLSAgaWYgKCFTYlNvY2tldFdhaXRlcklzVmFsaWQod2FpdGVyKSkgewotICAgIHJldHVybiBrU2JTb2NrZXRXYWl0ZXJSZXN1bHRJbnZhbGlkOwotICB9Ci0KLSAgcmV0dXJuIHdhaXRlci0+V2FpdFRpbWVkKGR1cmF0aW9uKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF93YWl0ZXJfd2FrZV91cC5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF93YWl0ZXJfd2FrZV91cC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU4MzU2MC4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfd2FpdGVyX3dha2VfdXAuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NvY2tldF93YWl0ZXIuaCIKLQotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X3dhaXRlcl9pbnRlcm5hbC5oIgotCi12b2lkIFNiU29ja2V0V2FpdGVyV2FrZVVwKFNiU29ja2V0V2FpdGVyIHdhaXRlcikgewotICBpZiAoIVNiU29ja2V0V2FpdGVySXNWYWxpZCh3YWl0ZXIpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgd2FpdGVyLT5XYWtlVXAoKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3N0YXJib2FyZF9tYWluLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc3RhcmJvYXJkX21haW4uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExN2VkOTkuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc3RhcmJvYXJkX21haW4uY2MKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zdGFyYm9hcmRfbWFpbi5oIgotCi0jaW5jbHVkZSA8T2JqYmFzZS5oPgotI2luY2x1ZGUgPFdpblNvY2syLmg+Ci0jaW5jbHVkZSA8bWZhcGkuaD4KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLSNpbmNsdWRlIDxjc3RkaW8+Ci0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9hdWRpb19zaW5rL2F1ZGlvX3NpbmtfaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9jb21tYW5kX2xpbmUuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9uZXRfbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9hcHBsaWNhdGlvbl93aW4zMi5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX3ByaXZhdGUuaCIKLQotdXNpbmcgc3RhcmJvYXJkOjpzaGFyZWQ6OnN0YXJib2FyZDo6Q29tbWFuZExpbmU7Ci11c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6c3RhcmJvYXJkOjprTmV0TG9nQ29tbWFuZFN3aXRjaFdhaXQ7Ci11c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6c3RhcmJvYXJkOjpOZXRMb2dGbHVzaFRoZW5DbG9zZTsKLXVzaW5nIHN0YXJib2FyZDo6c2hhcmVkOjpzdGFyYm9hcmQ6Ok5ldExvZ1dhaXRGb3JDbGllbnRDb25uZWN0ZWQ7Ci11c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OkFwcGxpY2F0aW9uV2luMzI7Ci0KLW5hbWVzcGFjZSB7Ci0KLXZvaWQgV2FpdEZvck5ldExvZ0lmTmVjZXNzYXJ5KGNvbnN0IENvbW1hbmRMaW5lJiBjbWRfbGluZSkgewotICBpZiAoY21kX2xpbmUuSGFzU3dpdGNoKGtOZXRMb2dDb21tYW5kU3dpdGNoV2FpdCkpIHsKLSAgICBOZXRMb2dXYWl0Rm9yQ2xpZW50Q29ubmVjdGVkKCk7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlLgotCi1leHRlcm4gIkMiIGludCBTdGFyYm9hcmRNYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewotICBXU0FEYXRhIHdzYURhdGE7Ci0gIGNvbnN0IGludCBrV2luU29ja1ZlcnNpb25NYWpvciA9IDI7Ci0gIGNvbnN0IGludCBrV2luU29ja1ZlcnNpb25NaW5vciA9IDI7Ci0gIGNvbnN0IGludCBpbml0X3Jlc3VsdCA9IFdTQVN0YXJ0dXAoCi0gICAgICBNQUtFV09SRChrV2luU29ja1ZlcnNpb25NYWpvciwga1dpblNvY2tWZXJzaW9uTWFqb3IpLCAmd3NhRGF0YSk7Ci0KLSAgU0JfQ0hFQ0soaW5pdF9yZXN1bHQgPT0gMCk7Ci0gIC8vIFdTQVN0YXJ0dXAgcmV0dXJucyB0aGUgaGlnaGVzdCB2ZXJzaW9uIHRoYXQgaXMgc3VwcG9ydGVkIHVwIHRvIHRoZSB2ZXJzaW9uCi0gIC8vIHdlIHJlcXVlc3QuCi0gIFNCX0NIRUNLKExPQllURSh3c2FEYXRhLndWZXJzaW9uKSA9PSBrV2luU29ja1ZlcnNpb25NYWpvciAmJgotICAgICAgICAgICBISUJZVEUod3NhRGF0YS53VmVyc2lvbikgPT0ga1dpblNvY2tWZXJzaW9uTWlub3IpOwotCi0gIC8vIEluaXRpYWxpemUgQ09NIGZvciBYQXVkaW8yIEFQSXMuCi0gIENvSW5pdGlhbGl6ZShudWxscHRyKTsKLSAgU2JBdWRpb1NpbmtQcml2YXRlOjpJbml0aWFsaXplKCk7Ci0gIHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6UmVnaXN0ZXJNYWluVGhyZWFkKCk7Ci0gIC8vIFRPRE86IERvIHRoaXMgd2l0aCBTYk9uY2Ugd2hlbiBtZWRpYSBpcyBmaXJzdCB1c2VkIGluc3RlYWQuCi0gIEhSRVNVTFQgaHIgPSBNRlN0YXJ0dXAoTUZfVkVSU0lPTik7Ci0gIFNCX0RDSEVDSyhTVUNDRUVERUQoaHIpKTsKLQotICBXYWl0Rm9yTmV0TG9nSWZOZWNlc3NhcnkoQ29tbWFuZExpbmUoYXJnYywgYXJndikpOwotICBBcHBsaWNhdGlvbldpbjMyIGFwcGxpY2F0aW9uOwotICAvLyBUaGlzIHdpbGwgcnVuIHRoZSBtZXNzYWdlIGxvb3AuCi0gIGNvbnN0IGludCBtYWluX3JldHVybl92YWx1ZSA9IGFwcGxpY2F0aW9uLlJ1bihhcmdjLCBhcmd2KTsKLSAgTmV0TG9nRmx1c2hUaGVuQ2xvc2UoKTsKLQotICBNRlNodXRkb3duKCk7Ci0gIFdTQUNsZWFudXAoKTsKLSAgcmV0dXJuIG1haW5fcmV0dXJuX3ZhbHVlOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc3RhcmJvYXJkX21haW4uaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3N0YXJib2FyZF9tYWluLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMTllZTAuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc3RhcmJvYXJkX21haW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpZm5kZWYgU1RBUkJPQVJEX1NIQVJFRF9XSU4zMl9TVEFSQk9BUkRfTUFJTl9IXwotI2RlZmluZSBTVEFSQk9BUkRfU0hBUkVEX1dJTjMyX1NUQVJCT0FSRF9NQUlOX0hfCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvZXhwb3J0LmgiCi0KLWV4dGVybiAiQyIgU0JfRVhQT1JUX1BMQVRGT1JNIGludCBTdGFyYm9hcmRNYWluKGludCBhcmdjLCBjaGFyKiogYXJndik7Ci0KLSNlbmRpZiAgLy8gU1RBUkJPQVJEX1NIQVJFRF9XSU4zMl9TVEFSQk9BUkRfTUFJTl9IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc3RyaW5nX2NvbXBhcmVfbm9fY2FzZS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3N0cmluZ19jb21wYXJlX25vX2Nhc2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5YTlmMmIuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc3RyaW5nX2NvbXBhcmVfbm9fY2FzZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc3RyaW5nLmgiCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotaW50IFNiU3RyaW5nQ29tcGFyZU5vQ2FzZShjb25zdCBjaGFyKiBzdHJpbmcxLCBjb25zdCBjaGFyKiBzdHJpbmcyKSB7Ci0gIHJldHVybiBfc3RyaWNtcChzdHJpbmcxLCBzdHJpbmcyKTsKLX0KLQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc3RyaW5nX2NvbXBhcmVfbm9fY2FzZV9uLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc3RyaW5nX2NvbXBhcmVfbm9fY2FzZV9uLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2E3YjlkLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3N0cmluZ19jb21wYXJlX25vX2Nhc2Vfbi5jYworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc3RyaW5nLmgiCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotaW50IFNiU3RyaW5nQ29tcGFyZU5vQ2FzZU4oY29uc3QgY2hhciogc3RyaW5nMSwKLSAgY29uc3QgY2hhciogc3RyaW5nMiwgc2l6ZV90IGNvdW50KSB7Ci0gIHJldHVybiBfc3RybmljbXAoc3RyaW5nMSwgc3RyaW5nMiwgY291bnQpOwotfQotCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zdHJpbmdfY29tcGFyZV93aWRlLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc3RyaW5nX2NvbXBhcmVfd2lkZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc2ZDViNy4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zdHJpbmdfY29tcGFyZV93aWRlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9zdHJpbmcuaCIKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi1pbnQgU2JTdHJpbmdDb21wYXJlV2lkZShjb25zdCB3Y2hhcl90KiBzdHJpbmcxLCBjb25zdCB3Y2hhcl90KiBzdHJpbmcyLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGNvdW50KSB7Ci0gIHJldHVybiB3Y3NuY21wKHN0cmluZzEsIHN0cmluZzIsIGNvdW50KTsKLX0KLQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc3RyaW5nX2Zvcm1hdC5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3N0cmluZ19mb3JtYXQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMzk3MTguLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc3RyaW5nX2Zvcm1hdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc3RyaW5nLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi1pbnQgU2JTdHJpbmdGb3JtYXQoY2hhciogb3V0X2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZm9ybWF0LAotICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgYXJndW1lbnRzKSB7Ci0gIHJldHVybiB2c25wcmludGYob3V0X2J1ZmZlciwgYnVmZmVyX3NpemUsIGZvcm1hdCwgYXJndW1lbnRzKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3N0cmluZ19mb3JtYXRfd2lkZS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3N0cmluZ19mb3JtYXRfd2lkZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkyNThkYy4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zdHJpbmdfZm9ybWF0X3dpZGUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3N0cmluZy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotaW50IFNiU3RyaW5nRm9ybWF0V2lkZSh3Y2hhcl90KiBvdXRfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmd1bWVudHMpIHsKLSAgcmV0dXJuIF92c253cHJpbnRmKG91dF9idWZmZXIsIGJ1ZmZlcl9zaXplLCBmb3JtYXQsIGFyZ3VtZW50cyk7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zeXN0ZW1fYnJlYWtfaW50b19kZWJ1Z2dlci5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3N5c3RlbV9icmVha19pbnRvX2RlYnVnZ2VyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmVhMjdmLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3N5c3RlbV9icmVha19pbnRvX2RlYnVnZ2VyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9zeXN0ZW0uaCIKLQotI2luY2x1ZGUgPGludHJpbi5oPgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbmV0X2xvZy5oIgotCi12b2lkIFNiU3lzdGVtQnJlYWtJbnRvRGVidWdnZXIoKSB7Ci0gIC8vIE5vdGU6IG5laXRoZXIgRGVidWdCcmVhaygpIG5vciBFeGl0UHJvY2VzcygpIGFyZSB2YWxpZAotICAvLyBvbiBzb21lIFdpbmRvd3MgcGxhdGZvcm1zIChlZyBVV1ApIHNvIHdlIHVzZSBfX2RlYnVnYnJlYWsoKQotICAvLyBpbnN0ZWFkLgotICBzdGFyYm9hcmQ6OnNoYXJlZDo6c3RhcmJvYXJkOjpOZXRMb2dGbHVzaCgpOwotICBfX2RlYnVnYnJlYWsoKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3N5c3RlbV9jbGVhcl9sYXN0X2Vycm9yLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc3lzdGVtX2NsZWFyX2xhc3RfZXJyb3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMTQyM2QuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc3lzdGVtX2NsZWFyX2xhc3RfZXJyb3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3N5c3RlbS5oIgotCi0jaW5jbHVkZSA8d2luZG93cy5oPgotCi12b2lkIFNiU3lzdGVtQ2xlYXJMYXN0RXJyb3IoKSB7Ci0gIFNldExhc3RFcnJvcigwKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3N5c3RlbV9jbGVhcl9wbGF0Zm9ybV9lcnJvci5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3N5c3RlbV9jbGVhcl9wbGF0Zm9ybV9lcnJvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI1MjFiYi4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zeXN0ZW1fY2xlYXJfcGxhdGZvcm1fZXJyb3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9hcHBsaWNhdGlvbl93aW4zMi5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zeXN0ZW0uaCIKLQotdXNpbmcgc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOjpBcHBsaWNhdGlvbldpbjMyOwotCi12b2lkIFNiU3lzdGVtQ2xlYXJQbGF0Zm9ybUVycm9yKFNiU3lzdGVtUGxhdGZvcm1FcnJvciBoYW5kbGUpIHsKLSAgQXBwbGljYXRpb25XaW4zMjo6R2V0KCktPk9uU2JTeXN0ZW1DbGVhclBsYXRmb3JtRXJyb3IoaGFuZGxlKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3N5c3RlbV9nZXRfY29ubmVjdGlvbl90eXBlLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc3lzdGVtX2dldF9jb25uZWN0aW9uX3R5cGUuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZWQwNWQuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc3lzdGVtX2dldF9jb25uZWN0aW9uX3R5cGUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3N5c3RlbS5oIgotCi0jaW5jbHVkZSA8d2luc29jazIuaD4KLQotI2luY2x1ZGUgPGlmZGVmLmg+Ci0jaW5jbHVkZSA8aXBobHBhcGkuaD4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvYWRhcHRlcl91dGlscy5oIgotCi1uYW1lc3BhY2Ugc2J3aW4zMiA9IDo6c3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOwotCi1uYW1lc3BhY2UgewotLy8gUmV0dXJuIHRoZSBjb25uZWN0aW9uIHR5cGUgb2YgdGhlIGZpcnN0ICJ1cCIgZXRoZXJuZXQgaW50ZXJmYWNlLAotLy8gb3IgdW5rbm93biBpZiBub25lIGZvdW5kLgotU2JTeXN0ZW1Db25uZWN0aW9uVHlwZSBGaW5kQ29ubmVjdGlvblR5cGUoUElQX0FEQVBURVJfQUREUkVTU0VTIGFkYXB0ZXIpIHsKLSAgZm9yICg7IGFkYXB0ZXIgIT0gbnVsbHB0cjsgYWRhcHRlciA9IGFkYXB0ZXItPk5leHQpIHsKLSAgICBpZiAoKGFkYXB0ZXItPk9wZXJTdGF0dXMgIT0gSWZPcGVyU3RhdHVzVXApIHx8Ci0gICAgICAgICFzYndpbjMyOjpJc0lmVHlwZUV0aGVybmV0KGFkYXB0ZXItPklmVHlwZSkpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICAvLyBTb21lIGRldmljZXMgZG8gbm90IHJlcG9ydCBJZlR5cGUgY29ycmVjdGx5LgotICAgIC8vIFNvLCBhbiBleHRyYSBhdHRlbXB0IGF0IGRldGVybWluaW5nIGlmIGFuIGludGVyZmFjZSBpcyB3aXJlbGVzcyBpcyBtYWRlLgotICAgIGlmIChhZGFwdGVyLT5JZlR5cGUgPT0gSUZfVFlQRV9JRUVFODAyMTEgfHwKLSAgICAgICh3Y3NzdHIoYWRhcHRlci0+RGVzY3JpcHRpb24sIEwiV2lGaSIpICE9IG51bGxwdHIpKSB7Ci0gICAgICByZXR1cm4ga1NiU3lzdGVtQ29ubmVjdGlvblR5cGVXaXJlbGVzczsKLSAgICB9Ci0gICAgcmV0dXJuIGtTYlN5c3RlbUNvbm5lY3Rpb25UeXBlV2lyZWQ7Ci0gIH0KLSAgcmV0dXJuIGtTYlN5c3RlbUNvbm5lY3Rpb25UeXBlVW5rbm93bjsKLX0KLX0gIC8vIG5hbWVzcGFjZQotCi1TYlN5c3RlbUNvbm5lY3Rpb25UeXBlIFNiU3lzdGVtR2V0Q29ubmVjdGlvblR5cGUoKSB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxjaGFyW10+IGJ1ZmZlcjsKLSAgaWYgKCFzYndpbjMyOjpHZXRBZGFwdGVycyhrU2JTb2NrZXRBZGRyZXNzVHlwZUlwdjQsICZidWZmZXIpKSB7Ci0gICAgICByZXR1cm4ga1NiU3lzdGVtQ29ubmVjdGlvblR5cGVVbmtub3duOwotICB9Ci0gIFNiU3lzdGVtQ29ubmVjdGlvblR5cGUgcmVzdWx0ID0gRmluZENvbm5lY3Rpb25UeXBlKAotICAgICAgcmVpbnRlcnByZXRfY2FzdDxQSVBfQURBUFRFUl9BRERSRVNTRVM+KGJ1ZmZlci5nZXQoKSkpOwotICBpZiAocmVzdWx0ICE9IGtTYlN5c3RlbUNvbm5lY3Rpb25UeXBlVW5rbm93bikgewotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgaWYgKCFzYndpbjMyOjpHZXRBZGFwdGVycyhrU2JTb2NrZXRBZGRyZXNzVHlwZUlwdjYsICZidWZmZXIpKSB7Ci0gICAgICByZXR1cm4ga1NiU3lzdGVtQ29ubmVjdGlvblR5cGVVbmtub3duOwotICB9Ci0gIHJldHVybiBGaW5kQ29ubmVjdGlvblR5cGUoCi0gICAgICByZWludGVycHJldF9jYXN0PFBJUF9BREFQVEVSX0FERFJFU1NFUz4oYnVmZmVyLmdldCgpKSk7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zeXN0ZW1fZ2V0X2RldmljZV90eXBlLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc3lzdGVtX2dldF9kZXZpY2VfdHlwZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM1MWY1OC4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zeXN0ZW1fZ2V0X2RldmljZV90eXBlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9zeXN0ZW0uaCIKLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3djaGFyX3V0aWxzLmgiCi0KLVNiU3lzdGVtRGV2aWNlVHlwZSBTYlN5c3RlbUdldERldmljZVR5cGUoKSB7Ci0gIHJldHVybiBrU2JTeXN0ZW1EZXZpY2VUeXBlRGVza3RvcFBDOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc3lzdGVtX2dldF9lcnJvcl9zdHJpbmcuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zeXN0ZW1fZ2V0X2Vycm9yX3N0cmluZy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFhNTA3NC4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zeXN0ZW1fZ2V0X2Vycm9yX3N0cmluZy5jYworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc3lzdGVtLmgiCi0KLSNpbmNsdWRlIDxzc3RyZWFtPgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9lcnJvcl91dGlscy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zdHJpbmcuaCIKLQotaW50IFNiU3lzdGVtR2V0RXJyb3JTdHJpbmcoU2JTeXN0ZW1FcnJvciBlcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIG91dF9zdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaW5nX2xlbmd0aCkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICBvdXQgPDwgc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOjpXaW4zMkVycm9yQ29kZShlcnJvcik7Ci0gIGlmIChvdXRfc3RyaW5nICE9IG51bGxwdHIpIHsKLSAgICBTYlN0cmluZ0NvcHkob3V0X3N0cmluZywgb3V0LnN0cigpLmNfc3RyKCksIHN0cmluZ19sZW5ndGgpOwotICB9Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KG91dC5zdHIoKS5zaXplKCkpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc3lzdGVtX2dldF9sYXN0X2Vycm9yLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc3lzdGVtX2dldF9sYXN0X2Vycm9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTc2NzUzLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3N5c3RlbV9nZXRfbGFzdF9lcnJvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc3lzdGVtLmgiCi0KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLVNiU3lzdGVtRXJyb3IgU2JTeXN0ZW1HZXRMYXN0RXJyb3IoKSB7Ci0gIHJldHVybiBHZXRMYXN0RXJyb3IoKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3N5c3RlbV9nZXRfbG9jYWxlX2lkLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc3lzdGVtX2dldF9sb2NhbGVfaWQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZGJmMzQuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc3lzdGVtX2dldF9sb2NhbGVfaWQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3N5c3RlbS5oIgotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9vbmNlLmgiCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2Vycm9yX3V0aWxzLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi93Y2hhcl91dGlscy5oIgotCi11c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OkRlYnVnTG9nV2luRXJyb3I7Ci11c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OndjaGFyX3RUb1VURjg7Ci0KLW5hbWVzcGFjZSB7Ci1jbGFzcyBMb2NhbGVTdHJpbmcgewotIHB1YmxpYzoKLSAgc3RhdGljIExvY2FsZVN0cmluZyogR2V0KCk7Ci0gIGNvbnN0IGNoYXIqIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gdmFsdWVfLmNfc3RyKCk7IH0KLQotIHByaXZhdGU6Ci0gIExvY2FsZVN0cmluZygpIHsKLSAgICB3Y2hhcl90IG5hbWVbTE9DQUxFX05BTUVfTUFYX0xFTkdUSF07Ci0gICAgaW50IHJlc3VsdCA9IEdldFVzZXJEZWZhdWx0TG9jYWxlTmFtZShuYW1lLCBMT0NBTEVfTkFNRV9NQVhfTEVOR1RIKTsKLSAgICBpZiAocmVzdWx0ICE9IDApIHsKLSAgICAgIHZhbHVlXyA9IHdjaGFyX3RUb1VURjgobmFtZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIFNCX0xPRyhFUlJPUikgPDwgIkVycm9yIHJldHJpZXZpbmcgR2V0VXNlckRlZmF1bHRMb2NhbGVOYW1lIjsKLSAgICAgIERlYnVnTG9nV2luRXJyb3IoKTsKLSAgICAgIHZhbHVlXyA9ImVuLVVTIjsKLSAgICB9Ci0gIH0KLSAgc3RkOjpzdHJpbmcgdmFsdWVfOwotfTsKLQotU0JfT05DRV9JTklUSUFMSVpFX0ZVTkNUSU9OKExvY2FsZVN0cmluZywgTG9jYWxlU3RyaW5nOjpHZXQpOwotfSAgLy8gbmFtZXNwYWNlCi0KLWNvbnN0IGNoYXIqIFNiU3lzdGVtR2V0TG9jYWxlSWQoKSB7Ci0gIHJldHVybiBMb2NhbGVTdHJpbmc6OkdldCgpLT52YWx1ZSgpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc3lzdGVtX2dldF9udW1iZXJfb2ZfcHJvY2Vzc29ycy5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3N5c3RlbV9nZXRfbnVtYmVyX29mX3Byb2Nlc3NvcnMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ZWM0ZTAuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc3lzdGVtX2dldF9udW1iZXJfb2ZfcHJvY2Vzc29ycy5jYworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc3lzdGVtLmgiCi0KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLWludCBTYlN5c3RlbUdldE51bWJlck9mUHJvY2Vzc29ycygpIHsKLSAgLy8gTm90ZSB0aGF0IHRoaXMgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGxvZ2ljYWwgcHJvY2Vzc29ycy4KLSAgU1lTVEVNX0lORk8gc3lzdGVtX2luZm8gPSB7MH07Ci0gIEdldFN5c3RlbUluZm8oJnN5c3RlbV9pbmZvKTsKLSAgcmV0dXJuIHN5c3RlbV9pbmZvLmR3TnVtYmVyT2ZQcm9jZXNzb3JzOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc3lzdGVtX2dldF9wcm9wZXJ0eS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3N5c3RlbV9nZXRfcHJvcGVydHkuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZTk1MjIuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc3lzdGVtX2dldF9wcm9wZXJ0eS5jYworKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3N0cmluZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zeXN0ZW0uaCIKLQotbmFtZXNwYWNlIHsKLQotY29uc3QgY2hhcioga0ZyaWVuZGx5TmFtZSA9ICJXaW5kb3dzIERlc2t0b3AiOwotY29uc3QgY2hhcioga1BsYXRmb3JtTmFtZSA9ICJ3aW4zMjsgV2luZG93cyB4ODZfNjQiOwotCi1ib29sIENvcHlTdHJpbmdBbmRUZXN0SWZTdWNjZXNzKGNoYXIqIG91dF92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlX2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZnJvbV92YWx1ZSkgewotICBpZiAoU2JTdHJpbmdHZXRMZW5ndGgoZnJvbV92YWx1ZSkgKyAxID4gdmFsdWVfbGVuZ3RoKQotICAgIHJldHVybiBmYWxzZTsKLSAgU2JTdHJpbmdDb3B5KG91dF92YWx1ZSwgZnJvbV92YWx1ZSwgdmFsdWVfbGVuZ3RoKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1ib29sIFNiU3lzdGVtR2V0UHJvcGVydHkoU2JTeXN0ZW1Qcm9wZXJ0eUlkIHByb3BlcnR5X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIG91dF92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWVfbGVuZ3RoKSB7Ci0gIGlmICghb3V0X3ZhbHVlIHx8ICF2YWx1ZV9sZW5ndGgpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBzd2l0Y2ggKHByb3BlcnR5X2lkKSB7Ci0gICAgY2FzZSBrU2JTeXN0ZW1Qcm9wZXJ0eUJyYW5kTmFtZToKLSAgICBjYXNlIGtTYlN5c3RlbVByb3BlcnR5Q2hpcHNldE1vZGVsTnVtYmVyOgotICAgIGNhc2Uga1NiU3lzdGVtUHJvcGVydHlGaXJtd2FyZVZlcnNpb246Ci0gICAgY2FzZSBrU2JTeXN0ZW1Qcm9wZXJ0eU1vZGVsTmFtZToKLSAgICBjYXNlIGtTYlN5c3RlbVByb3BlcnR5TW9kZWxZZWFyOgotICAgIGNhc2Uga1NiU3lzdGVtUHJvcGVydHlOZXR3b3JrT3BlcmF0b3JOYW1lOgotICAgIGNhc2Uga1NiU3lzdGVtUHJvcGVydHlTcGVlY2hBcGlLZXk6Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBjYXNlIGtTYlN5c3RlbVByb3BlcnR5RnJpZW5kbHlOYW1lOgotICAgICAgcmV0dXJuIENvcHlTdHJpbmdBbmRUZXN0SWZTdWNjZXNzKG91dF92YWx1ZSwgdmFsdWVfbGVuZ3RoLCBrRnJpZW5kbHlOYW1lKTsKLQotICAgIGNhc2Uga1NiU3lzdGVtUHJvcGVydHlQbGF0Zm9ybU5hbWU6Ci0gICAgICByZXR1cm4gQ29weVN0cmluZ0FuZFRlc3RJZlN1Y2Nlc3Mob3V0X3ZhbHVlLCB2YWx1ZV9sZW5ndGgsIGtQbGF0Zm9ybU5hbWUpOwotCi0gICAgY2FzZSBrU2JTeXN0ZW1Qcm9wZXJ0eVBsYXRmb3JtVXVpZDoKLSAgICAgIFNCX05PVElNUExFTUVOVEVEKCk7Ci0gICAgICByZXR1cm4gQ29weVN0cmluZ0FuZFRlc3RJZlN1Y2Nlc3Mob3V0X3ZhbHVlLCB2YWx1ZV9sZW5ndGgsICJOL0EiKTsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBTQl9ETE9HKFdBUk5JTkcpIDw8IF9fRlVOQ1RJT05fXwotICAgICAgICAgICAgICAgICAgICAgICA8PCAiOiBVbnJlY29nbml6ZWQgcHJvcGVydHk6ICIgPDwgcHJvcGVydHlfaWQ7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3N5c3RlbV9nZXRfcmFuZG9tX2RhdGEuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zeXN0ZW1fZ2V0X3JhbmRvbV9kYXRhLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzRmNjk2Li4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3N5c3RlbV9nZXRfcmFuZG9tX2RhdGEuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3N5c3RlbS5oIgotCi0jaW5jbHVkZSA8d2luZG93cy5oPgotCi0vLyBUaGlzIG11c3QgYmUgaW5jbHVkZWQgYWZ0ZXIgd2luZG93cy5oCi0jaW5jbHVkZSA8YmNyeXB0Lmg+Ci0KLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9lcnJvcl91dGlscy5oIgotCi1uYW1lc3BhY2Ugc2J3aW4zMiA9IHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjsKLQotdm9pZCBTYlN5c3RlbUdldFJhbmRvbURhdGEodm9pZCogb3V0X2J1ZmZlciwgaW50IGJ1ZmZlcl9zaXplKSB7Ci0gIC8vIE5vdGU6IHRoaXMgbWlnaHQgbm90IGJlIHNlY3VyZSBiZWZvcmUgV2luZG93cyAxMCwgYXMKLSAgLy8gQkNSWVBUX1JOR19EVUFMX0VDX0FMR09SSVRITSBtaWdodCBiZSB1c2VkLiAgU2VlOgotICAvLyBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L3dpbmRvd3MvZGVza3RvcC9hYTM3NTUzNCUyOHY9dnMuODUlMjkuYXNweAotICAvLyAiV2luZG93cyAxMDogIEJlZ2lubmluZyB3aXRoIFdpbmRvd3MgMTAsIHRoZSBkdWFsIGVsbGlwdGljIGN1cnZlIHJhbmRvbQotICAvLyBudW1iZXIgZ2VuZXJhdG9yIGFsZ29yaXRobSBoYXMgYmVlbiByZW1vdmVkLiBFeGlzdGluZyB1c2VzIG9mIHRoaXMKLSAgLy8gYWxnb3JpdGhtIHdpbGwgY29udGludWUgdG8gd29yazsgaG93ZXZlciwgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGlzCi0gIC8vIGJhc2VkIG9uIHRoZSBBRVMgY291bnRlciBtb2RlIHNwZWNpZmllZCBpbiB0aGUgTklTVCBTUCA4MDAtOTAgc3RhbmRhcmQuIE5ldwotICAvLyBjb2RlIHNob3VsZCB1c2UgQkNSWVBUX1JOR19BTEdPUklUSE0sIGFuZCBpdCBpcyByZWNvbW1lbmRlZCB0aGF0IGV4aXN0aW5nCi0gIC8vIGNvZGUgYmUgY2hhbmdlZCB0byB1c2UgQkNSWVBUX1JOR19BTEdPUklUSE0uIgotICBOVFNUQVRVUyBzdGF0dXMgPQotICAgICAgQkNyeXB0R2VuUmFuZG9tKG51bGxwdHIsIHJlaW50ZXJwcmV0X2Nhc3Q8UFVDSEFSPihvdXRfYnVmZmVyKSwKLSAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfc2l6ZSwgQkNSWVBUX1VTRV9TWVNURU1fUFJFRkVSUkVEX1JORyk7Ci0gIFNCX0RDSEVDSyhzdGF0dXMgPT0gMCkgPDwgIkVycm9yIHdoaWxlIGNhbGxpbmcgQ3J5cHRHZW5SYW5kb206ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzYndpbjMyOjpXaW4zMkVycm9yQ29kZShHZXRMYXN0RXJyb3IoKSk7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zeXN0ZW1fZ2V0X3JhbmRvbV91aW50NjQuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zeXN0ZW1fZ2V0X3JhbmRvbV91aW50NjQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlYjk1ZjcuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc3lzdGVtX2dldF9yYW5kb21fdWludDY0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9zeXN0ZW0uaCIKLQotdWludDY0X3QgU2JTeXN0ZW1HZXRSYW5kb21VSW50NjQoKSB7Ci0gIHVpbnQ2NF90IHJldHVybl92YWx1ZSA9IDA7Ci0gIFNiU3lzdGVtR2V0UmFuZG9tRGF0YSgmcmV0dXJuX3ZhbHVlLCBzaXplb2YocmV0dXJuX3ZhbHVlKSk7Ci0gIHJldHVybiByZXR1cm5fdmFsdWU7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zeXN0ZW1fZ2V0X3N0YWNrLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc3lzdGVtX2dldF9zdGFjay5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMxZjkxOC4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zeXN0ZW1fZ2V0X3N0YWNrLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9zeXN0ZW0uaCIKLQotI2luY2x1ZGUgPFdpbmRvd3MuaD4NCi0KLV9fZGVjbHNwZWMobm9pbmxpbmUpIGludCBTYlN5c3RlbUdldFN0YWNrKHZvaWQqKiBvdXRfc3RhY2ssIGludCBzdGFja19zaXplKSB7Ci0gIFVMT05HIGZyYW1lc190b19za2lwID0gMTsNCi0gIGludCBudW1fY2FwdHVyZWQgPSBDYXB0dXJlU3RhY2tCYWNrVHJhY2UoZnJhbWVzX3RvX3NraXAsIHN0YWNrX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0X3N0YWNrLCBudWxscHRyKTsKLSAgcmV0dXJuIG51bV9jYXB0dXJlZDsKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3N5c3RlbV9nZXRfdG90YWxfY3B1X21lbW9yeS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3N5c3RlbV9nZXRfdG90YWxfY3B1X21lbW9yeS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M5MTM5OS4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zeXN0ZW1fZ2V0X3RvdGFsX2NwdV9tZW1vcnkuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3N5c3RlbS5oIgotCi0jaW5jbHVkZSA8d2luZG93cy5oPgotCi1pbnQ2NF90IFNiU3lzdGVtR2V0VG90YWxDUFVNZW1vcnkoKSB7Ci0gIE1FTU9SWVNUQVRVU0VYIHN0YXRleCA9IHswfTsKLSAgc3RhdGV4LmR3TGVuZ3RoID0gc2l6ZW9mKHN0YXRleCk7Ci0gIEdsb2JhbE1lbW9yeVN0YXR1c0V4KCZzdGF0ZXgpOwotICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50NjRfdD4oc3RhdGV4LnVsbFRvdGFsUGh5cyk7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zeXN0ZW1fZ2V0X3VzZWRfY3B1X21lbW9yeS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3N5c3RlbV9nZXRfdXNlZF9jcHVfbWVtb3J5LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2RkZWExLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3N5c3RlbV9nZXRfdXNlZF9jcHVfbWVtb3J5LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9zeXN0ZW0uaCIKLQotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLQotaW50NjRfdCBTYlN5c3RlbUdldFVzZWRDUFVNZW1vcnkoKSB7Ci0gIE1FTU9SWVNUQVRVU0VYIHN0YXRleCA9IHswfTsKLSAgc3RhdGV4LmR3TGVuZ3RoID0gc2l6ZW9mKHN0YXRleCk7Ci0gIEdsb2JhbE1lbW9yeVN0YXR1c0V4KCZzdGF0ZXgpOwotICBpbnQ2NF90IHJlbWFpbmluZ19ieXRlcyA9IHN0YXRpY19jYXN0PGludDY0X3Q+KHN0YXRleC51bGxUb3RhbFBoeXMpIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ2NF90PihzdGF0ZXgudWxsQXZhaWxQaHlzKTsKLSAgU0JfRENIRUNLKHJlbWFpbmluZ19ieXRlcyA+PSAwKTsKLSAgcmV0dXJuIHJlbWFpbmluZ19ieXRlczsKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3N5c3RlbV9pc19kZWJ1Z2dlcl9hdHRhY2hlZC5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3N5c3RlbV9pc19kZWJ1Z2dlcl9hdHRhY2hlZC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZlYzE2Mi4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zeXN0ZW1faXNfZGVidWdnZXJfYXR0YWNoZWQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3N5c3RlbS5oIgotCi0jaW5jbHVkZSA8d2luZG93cy5oPgotCi1ib29sIFNiU3lzdGVtSXNEZWJ1Z2dlckF0dGFjaGVkKCkgewotICByZXR1cm4gSXNEZWJ1Z2dlclByZXNlbnQoKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3N5c3RlbV9yYWlzZV9wbGF0Zm9ybV9lcnJvci5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3N5c3RlbV9yYWlzZV9wbGF0Zm9ybV9lcnJvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUzYjI0NS4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zeXN0ZW1fcmFpc2VfcGxhdGZvcm1fZXJyb3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9hcHBsaWNhdGlvbl93aW4zMi5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zeXN0ZW0uaCIKLQotdXNpbmcgc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOjpBcHBsaWNhdGlvbldpbjMyOwotCi1TYlN5c3RlbVBsYXRmb3JtRXJyb3IgU2JTeXN0ZW1SYWlzZVBsYXRmb3JtRXJyb3IoCi0gICAgU2JTeXN0ZW1QbGF0Zm9ybUVycm9yVHlwZSB0eXBlLAotICAgIFNiU3lzdGVtUGxhdGZvcm1FcnJvckNhbGxiYWNrIGNhbGxiYWNrLAotICAgIHZvaWQqIHVzZXJfZGF0YSkgewotICByZXR1cm4gQXBwbGljYXRpb25XaW4zMjo6R2V0KCktPk9uU2JTeXN0ZW1SYWlzZVBsYXRmb3JtRXJyb3IodHlwZSwgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyX2RhdGEpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX2NyZWF0ZS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9jcmVhdGUuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyN2ViMTAuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX2NyZWF0ZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3RocmVhZC5oIgotCi0jaW5jbHVkZSA8cHJvY2Vzcy5oPgotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvb25jZS5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvZXJyb3JfdXRpbHMuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9wcml2YXRlLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi93Y2hhcl91dGlscy5oIgotCi1uYW1lc3BhY2Ugc2J3aW4zMiA9IHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjsKLQotdXNpbmcgc2J3aW4zMjo6RGVidWdMb2dXaW5FcnJvcjsKLXVzaW5nIHNid2luMzI6OkdldFRocmVhZFN1YnN5c3RlbVNpbmdsZXRvbjsKLXVzaW5nIHNid2luMzI6OlNiVGhyZWFkUHJpdmF0ZTsKLXVzaW5nIHNid2luMzI6OlRocmVhZFN1YnN5c3RlbVNpbmdsZXRvbjsKLXVzaW5nIHNid2luMzI6OndjaGFyX3RUb1VURjg7Ci0KLW5hbWVzcGFjZSB7Ci0KLXZvaWQgUmVzZXRXaW5FcnJvcigpIHsKLSAgU2V0TGFzdEVycm9yKDApOwotfQotCi1jbGFzcyBUaHJlYWRDcmVhdGVJbmZvIHsKLSBwdWJsaWM6Ci0gIFNiVGhyZWFkUHJpdmF0ZSB0aHJlYWRfcHJpdmF0ZV87Ci0gIFNiVGhyZWFkRW50cnlQb2ludCBlbnRyeV9wb2ludF87Ci0gIHZvaWQqIHVzZXJfY29udGV4dF87Ci0gIHN0ZDo6c3RyaW5nIG5hbWVfOwotfTsKLQotaW50IFJ1blRocmVhZExvY2FsRGVzdHJ1Y3RvcnMoVGhyZWFkU3Vic3lzdGVtU2luZ2xldG9uKiBzaW5nbGV0b24pIHsKLSAgaW50IG51bV9kZXN0cnVjdG9yc19jYWxsZWQgPSAwOwotCi0gIGZvciAoYXV0byBpdCA9IHNpbmdsZXRvbi0+dGhyZWFkX2xvY2FsX2tleXNfLmJlZ2luKCk7Ci0gICAgICAgaXQgIT0gc2luZ2xldG9uLT50aHJlYWRfbG9jYWxfa2V5c18uZW5kKCk7KSB7Ci0gICAgYXV0byBjdXJyX2l0ID0gaXQrKzsKLQotICAgIGlmICghY3Vycl9pdC0+c2Vjb25kLT5kZXN0cnVjdG9yKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgYXV0byBrZXkgPSBjdXJyX2l0LT5zZWNvbmQ7Ci0gICAgdm9pZCogZW50cnkgPSBTYlRocmVhZEdldExvY2FsVmFsdWUoa2V5KTsKLSAgICBpZiAoIWVudHJ5KSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgU2JUaHJlYWRTZXRMb2NhbFZhbHVlKGtleSwgbnVsbHB0cik7Ci0gICAgKytudW1fZGVzdHJ1Y3RvcnNfY2FsbGVkOwotICAgIGN1cnJfaXQtPnNlY29uZC0+ZGVzdHJ1Y3RvcihlbnRyeSk7Ci0gIH0KLSAgcmV0dXJuIG51bV9kZXN0cnVjdG9yc19jYWxsZWQ7Ci19Ci0KLWludCBDb3VudFRsc09iamVjdHNSZW1haW5pbmcoVGhyZWFkU3Vic3lzdGVtU2luZ2xldG9uKiBzaW5nbGV0b24pIHsKLSAgaW50IG51bV9vYmplY3RzX3JlbWFpbiA9IDA7Ci0gIGZvciAoYXV0byBpdCA9IHNpbmdsZXRvbi0+dGhyZWFkX2xvY2FsX2tleXNfLmJlZ2luKCk7Ci0gICAgICAgaXQgIT0gc2luZ2xldG9uLT50aHJlYWRfbG9jYWxfa2V5c18uZW5kKCk7ICsraXQpIHsKLSAgICBpZiAoIWl0LT5zZWNvbmQtPmRlc3RydWN0b3IpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBhdXRvIGtleSA9IGl0LT5zZWNvbmQ7Ci0gICAgdm9pZCogZW50cnkgPSBTYlRocmVhZEdldExvY2FsVmFsdWUoa2V5KTsKLSAgICBpZiAoIWVudHJ5KSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgKytudW1fb2JqZWN0c19yZW1haW47Ci0gIH0KLSAgcmV0dXJuIG51bV9vYmplY3RzX3JlbWFpbjsKLX0KLQotdm9pZCBDYWxsVGhyZWFkTG9jYWxEZXN0cnVjdG9yc011bHRpcGxlVGltZXMoKSB7Ci0gIC8vIFRoZSBudW1iZXIgb2YgcGFzc2VzIGNvbmZvcm1zIHRvIHRoZSBiYXNlX3VuaXR0ZXN0cy4gVGhpcyBpcyB1c2VmdWwgZm9yCi0gIC8vIGRlc3RydWN0b3JzIHRoYXQgaW5zZXJ0IG5ldyBvYmplY3RzIGludG8gdGhyZWFkIGxvY2FsIHN0b3JhZ2UuIFRoZXNlCi0gIC8vIG9iamVjdHMgdGhlbiBuZWVkIHRvIGJlIGRlc3Ryb3llZCBhcyB3ZWxsIGluIHN1YnNlcXVlbnQgcGFzc2VzLiBUaGUgdG90YWwKLSAgLy8gbnVtYmVyIG9mIHBhc3NlcyBpcyA0LCB3aGljaCBpcyBvbmUgbW9yZSB0aGFuIHdoYXQgYmFzZV91bml0dGVzdCB0ZXN0cwotICAvLyBmb3IuCi0gIGNvbnN0IGludCBrTnVtRGVzdHJ1Y3RvclBhc3NlcyA9IDQ7Ci0KLSAgVGhyZWFkU3Vic3lzdGVtU2luZ2xldG9uKiBzaW5nbGV0b24gPSBHZXRUaHJlYWRTdWJzeXN0ZW1TaW5nbGV0b24oKTsKLSAgaW50IG51bV90bHNfb2JqZWN0c19yZW1haW5pbmcgPSAwOwotICAvLyBUT0RPIG5vdGUgdGhhdCB0aGUgaW1wbGVtZW50YXRpb24gYmVsb3cgaG9sZHMgYSBnbG9iYWwgbG9jawotICAvLyB3aGlsZSBwcm9jZXNzaW5nIFRMUyBkZXN0cnVjdG9ycyBvbiB0aHJlYWQgZXhpdC4gVGhpcyBjb3VsZAotICAvLyBiZSBhIGJvdHRsZW5lY2sgaW4gc29tZSBzY2VuYXJpb3MuIEEgbG9ja2xlc3MgYXBwcm9hY2ggbWF5IGJlIHByZWZlcnJhYmxlLgotICBTYk11dGV4QWNxdWlyZSgmc2luZ2xldG9uLT5tdXRleF8pOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwga051bURlc3RydWN0b3JQYXNzZXM7ICsraSkgewotICAgIC8vIFJ1biB0aHJvdWdoIGVhY2ggZGVzdHJ1Y3RvciBhbmQgY2FsbCBpdC4KLSAgICBjb25zdCBpbnQgbnVtX2Rlc3RydWN0b3JzX2NhbGxlZCA9IFJ1blRocmVhZExvY2FsRGVzdHJ1Y3RvcnMoc2luZ2xldG9uKTsKLSAgICBpZiAoMCA9PSBudW1fZGVzdHJ1Y3RvcnNfY2FsbGVkKSB7Ci0gICAgICBicmVhazsgIC8vIE5vIG1vcmUgZGVzdHJ1Y3RvcnMgdG8gY2FsbC4KLSAgICB9Ci0gIH0KLSAgbnVtX3Rsc19vYmplY3RzX3JlbWFpbmluZyA9IENvdW50VGxzT2JqZWN0c1JlbWFpbmluZyhzaW5nbGV0b24pOwotICBTYk11dGV4UmVsZWFzZSgmc2luZ2xldG9uLT5tdXRleF8pOwotCi0gIFNCX0RDSEVDSyhudW1fdGxzX29iamVjdHNfcmVtYWluaW5nID09IDApIDw8ICJEYW5nbGluZyBvYmplY3RzIGluIFRMUyBleGlzdC4iOwotfQotCi11bnNpZ25lZCBUaHJlYWRUcmFtcG9saW5lKHZvaWQqIHRocmVhZF9jcmVhdGVfaW5mb19jb250ZXh0KSB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxUaHJlYWRDcmVhdGVJbmZvPiBpbmZvKAotICAgICAgc3RhdGljX2Nhc3Q8VGhyZWFkQ3JlYXRlSW5mbyo+KHRocmVhZF9jcmVhdGVfaW5mb19jb250ZXh0KSk7Ci0KLSAgVGhyZWFkU3Vic3lzdGVtU2luZ2xldG9uKiBzaW5nbGV0b24gPSBHZXRUaHJlYWRTdWJzeXN0ZW1TaW5nbGV0b24oKTsKLSAgU2JUaHJlYWRTZXRMb2NhbFZhbHVlKHNpbmdsZXRvbi0+dGhyZWFkX3ByaXZhdGVfa2V5XywgJmluZm8tPnRocmVhZF9wcml2YXRlXyk7Ci0gIFNiVGhyZWFkU2V0TmFtZShpbmZvLT5uYW1lXy5jX3N0cigpKTsKLQotICB2b2lkKiByZXN1bHQgPSBpbmZvLT5lbnRyeV9wb2ludF8oaW5mby0+dXNlcl9jb250ZXh0Xyk7Ci0KLSAgQ2FsbFRocmVhZExvY2FsRGVzdHJ1Y3RvcnNNdWx0aXBsZVRpbWVzKCk7Ci0KLSAgU2JNdXRleEFjcXVpcmUoJmluZm8tPnRocmVhZF9wcml2YXRlXy5tdXRleF8pOwotICBpbmZvLT50aHJlYWRfcHJpdmF0ZV8ucmVzdWx0XyA9IHJlc3VsdDsKLSAgaW5mby0+dGhyZWFkX3ByaXZhdGVfLnJlc3VsdF9pc192YWxpZF8gPSB0cnVlOwotICBTYkNvbmRpdGlvblZhcmlhYmxlU2lnbmFsKCZpbmZvLT50aHJlYWRfcHJpdmF0ZV8uY29uZGl0aW9uXyk7Ci0gIHdoaWxlIChpbmZvLT50aHJlYWRfcHJpdmF0ZV8ud2FpdF9mb3Jfam9pbl8pIHsKLSAgICBTYkNvbmRpdGlvblZhcmlhYmxlV2FpdCgmaW5mby0+dGhyZWFkX3ByaXZhdGVfLmNvbmRpdGlvbl8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZm8tPnRocmVhZF9wcml2YXRlXy5tdXRleF8pOwotICB9Ci0gIFNiTXV0ZXhSZWxlYXNlKCZpbmZvLT50aHJlYWRfcHJpdmF0ZV8ubXV0ZXhfKTsKLQotICByZXR1cm4gMDsKLX0KLQotaW50IFNiVGhyZWFkUHJpb3JpdHlUb1dpbjMyUHJpb3JpdHkoU2JUaHJlYWRQcmlvcml0eSBwcmlvcml0eSkgewotICBzd2l0Y2ggKHByaW9yaXR5KSB7Ci0gICAgY2FzZSBrU2JUaHJlYWRQcmlvcml0eUxvd2VzdDoKLSAgICAgIHJldHVybiBUSFJFQURfUFJJT1JJVFlfTE9XRVNUOwotICAgIGNhc2Uga1NiVGhyZWFkUHJpb3JpdHlMb3c6Ci0gICAgICByZXR1cm4gVEhSRUFEX1BSSU9SSVRZX0JFTE9XX05PUk1BTDsKLSAgICBjYXNlIGtTYlRocmVhZFByaW9yaXR5Tm9ybWFsOgotICAgIGNhc2Uga1NiVGhyZWFkTm9Qcmlvcml0eToKLSAgICAgIHJldHVybiBUSFJFQURfUFJJT1JJVFlfTk9STUFMOwotICAgIGNhc2Uga1NiVGhyZWFkUHJpb3JpdHlIaWdoOgotICAgICAgcmV0dXJuIFRIUkVBRF9QUklPUklUWV9BQk9WRV9OT1JNQUw7Ci0gICAgY2FzZSBrU2JUaHJlYWRQcmlvcml0eUhpZ2hlc3Q6Ci0gICAgICByZXR1cm4gVEhSRUFEX1BSSU9SSVRZX0hJR0hFU1Q7Ci0gICAgY2FzZSBrU2JUaHJlYWRQcmlvcml0eVJlYWxUaW1lOgotICAgICAgcmV0dXJuIFRIUkVBRF9QUklPUklUWV9USU1FX0NSSVRJQ0FMOwotICB9Ci0gIFNCX05PVFJFQUNIRUQoKSA8PCAiSW52YWxpZCBwcmlvcml0eSAiIDw8IHByaW9yaXR5OwotICByZXR1cm4gMDsKLX0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBOb3RlIHRoYXQgU2V0VGhyZWFkQWZmaW5pdHlNYXNrKCkgaXMgbm90IGF2YWlsYWJsZSBvbiBzb21lCi0vLyBwbGF0Zm9ybXMgKGVnIFVXUCkuIElmIGl0J3MgbmVjZXNzYXJ5IGZvciBhIG5vbi1VV1AgcGxhdGZvcm0sCi0vLyBwbGVhc2UgZm9yayB0aGlzIGltcGxlbWVudGF0aW9uIGZvciBVV1AuCi1TYlRocmVhZCBTYlRocmVhZENyZWF0ZShpbnQ2NF90IHN0YWNrX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBTYlRocmVhZFByaW9yaXR5IHByaW9yaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgU2JUaHJlYWRBZmZpbml0eSAvKmFmZmluaXR5Ki8sCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sIGpvaW5hYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNiVGhyZWFkRW50cnlQb2ludCBlbnRyeV9wb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvbnRleHQpIHsKLSAgaWYgKGVudHJ5X3BvaW50ID09IE5VTEwpIHsKLSAgICByZXR1cm4ga1NiVGhyZWFkSW52YWxpZDsKLSAgfQotICBUaHJlYWRDcmVhdGVJbmZvKiBpbmZvID0gbmV3IFRocmVhZENyZWF0ZUluZm8oKTsKLQotICBpbmZvLT5lbnRyeV9wb2ludF8gPSBlbnRyeV9wb2ludDsKLSAgaW5mby0+dXNlcl9jb250ZXh0XyA9IGNvbnRleHQ7Ci0gIGluZm8tPnRocmVhZF9wcml2YXRlXy53YWl0X2Zvcl9qb2luXyA9IGpvaW5hYmxlOwotICBpZiAobmFtZSkgewotICAgIGluZm8tPm5hbWVfID0gbmFtZTsKLSAgfQotCi0gIC8vIENyZWF0ZSB0aGUgdGhyZWFkIHN1c3BlbmRlZCwgYW5kIHRoZW4gcmVzdW1lIG9uY2UgVGhyZWFkQ3JlYXRlSW5mbzo6aGFuZGxlXwotICAvLyBoYXMgYmVlbiBzZXQsIHNvIHRoYXQgaXQncyBhbHdheSB2YWxpZCBpbiB0aGUgVGhyZWFkQ3JlYXRlSW5mbwotICAvLyBkZXN0cnVjdG9yLgotICB1aW50cHRyX3QgaGFuZGxlID0KLSAgICAgIF9iZWdpbnRocmVhZGV4KE5VTEwsIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oc3RhY2tfc2l6ZSksCi0gICAgICAgICAgICAgICAgICAgICBUaHJlYWRUcmFtcG9saW5lLCBpbmZvLCBDUkVBVEVfU1VTUEVOREVELCBOVUxMKTsKLSAgU0JfRENIRUNLKGhhbmRsZSk7Ci0gIGluZm8tPnRocmVhZF9wcml2YXRlXy5oYW5kbGVfID0gcmVpbnRlcnByZXRfY2FzdDxIQU5ETEU+KGhhbmRsZSk7Ci0gIFJlc2V0V2luRXJyb3IoKTsKLSAgaWYgKHByaW9yaXR5ICE9IGtTYlRocmVhZE5vUHJpb3JpdHkgJiYKLSAgICAgICFTZXRUaHJlYWRQcmlvcml0eShpbmZvLT50aHJlYWRfcHJpdmF0ZV8uaGFuZGxlXywKLSAgICAgICAgICAgICAgICAgICAgICAgICBTYlRocmVhZFByaW9yaXR5VG9XaW4zMlByaW9yaXR5KHByaW9yaXR5KSkgJiYKLSAgICAgICFHZXRMYXN0RXJyb3IoKSkgewotICAgIFNCX0xPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBzZXQgcHJpb3JpdHkgZm9yIHRocmVhZCAiIDw8IChuYW1lID8gbmFtZSA6ICIiKQotICAgICAgICAgICAgICAgICAgPDwgIiB0byAiIDw8IHByaW9yaXR5OwotICAgIERlYnVnTG9nV2luRXJyb3IoKTsKLSAgfQotCi0gIFJlc3VtZVRocmVhZChpbmZvLT50aHJlYWRfcHJpdmF0ZV8uaGFuZGxlXyk7Ci0KLSAgcmV0dXJuICZpbmZvLT50aHJlYWRfcHJpdmF0ZV87Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfY3JlYXRlX2xvY2FsX2tleS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9jcmVhdGVfbG9jYWxfa2V5LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTdlY2U2Li4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9jcmVhdGVfbG9jYWxfa2V5LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC90aHJlYWQuaCIKLQotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbXV0ZXguaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9sb2NhbF9pbnRlcm5hbC5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX3ByaXZhdGUuaCIKLQotdXNpbmcgc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOjpHZXRUaHJlYWRTdWJzeXN0ZW1TaW5nbGV0b247Ci11c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OlRocmVhZFN1YnN5c3RlbVNpbmdsZXRvbjsKLQotbmFtZXNwYWNlIHN0YXJib2FyZCB7Ci1uYW1lc3BhY2Ugc2hhcmVkIHsKLW5hbWVzcGFjZSB3aW4zMiB7Ci0KLVNiVGhyZWFkTG9jYWxLZXkgU2JUaHJlYWRDcmVhdGVMb2NhbEtleUludGVybmFsKAotICAgIFNiVGhyZWFkTG9jYWxEZXN0cnVjdG9yIGRlc3RydWN0b3IsCi0gICAgVGhyZWFkU3Vic3lzdGVtU2luZ2xldG9uKiBzaW5nbGV0b24pIHsKLSAgLy8gTm90ZSB0aGF0IGRlc3RydWN0b3IgdXNlZCBoZXJlIHRvIGFsbG93IGRlc3RydWN0aW9uIG9mIG9iamVjdHMgY3JlYXRlZCBieQotICAvLyBUTFMgYWNjZXNzIGJ5IG5vbi1zdGFyYm9hcmQgdGhyZWFkcy4KLSAgLy8gTm90ZSB0aGF0IEZsc0FsbG9jJ3MgZGVzdHJ1Y3RvciBtZWNoYW5pc20gaXMgaW5zdWZmaWNpZW50IHRvIHBhc3MKLSAgLy8gYmFzZV91bml0dGVzdHMsIHdoaWNoIGV4cGVjdHMgdGhhdCBtdWx0aXBsZSBkZXN0cnVjdG9yIHBhc3NlcyBmb3IKLSAgLy8gb2JqZWN0cyB3aGljaCBpbnNlcnQgZGVzdHJ1Y3RhYmxlIFRMUyBwb2ludGVycyBhcyBzaWRlIGVmZmVjdHMuIEZvcgotICAvLyBzdGFyYm9hcmQgdGhyZWFkcywgdGhlIFRMUyBkZXN0cnVjdG9ycyB3aWxsIHJ1biBmaXJzdCBhbmQgc2V0IHRoZQotICAvLyBUTFMgcG9pbnRlcnMgdG8gbnVsbCwgdGhlbiB0aGUgZGVzdHJ1Y3RvcnMgd2lsbCBydW4gYSBzZWNvbmQgdGltZQotICAvLyBidXQgdGhpcyBpcyBva2F5IHNpbmNlIHRoZSBwb2ludGVycyB3aWxsIG5vdyBiZSBudWxscHRycywgd2hpY2ggaXMKLSAgLy8gYSBuby1vcC4gRm9yIG5vbiBzdGFyYm9hcmQgdGhyZWFkcywgb25seSB0aGUgc2Vjb25kYXJ5IGRlc3RydWN0b3IKLSAgLy8gd2lsbCBydW4uCi0gIERXT1JEIGluZGV4ID0gVGxzSW50ZXJuYWxBbGxvYyhkZXN0cnVjdG9yKTsKLQotICBpZiAoaW5kZXggPT0gVExTX09VVF9PRl9JTkRFWEVTKSB7Ci0gICAgcmV0dXJuIGtTYlRocmVhZExvY2FsS2V5SW52YWxpZDsKLSAgfQotCi0gIFNiVGhyZWFkTG9jYWxLZXlQcml2YXRlKiByZXN1bHQgPSBzdGF0aWNfY2FzdDxTYlRocmVhZExvY2FsS2V5UHJpdmF0ZSo+KAotICAgICAgU2JNZW1vcnlBbGxvY2F0ZU5vUmVwb3J0KHNpemVvZihTYlRocmVhZExvY2FsS2V5UHJpdmF0ZSkpKTsKLQotICBpZiAocmVzdWx0ID09IG51bGxwdHIpIHsKLSAgICByZXR1cm4ga1NiVGhyZWFkTG9jYWxLZXlJbnZhbGlkOwotICB9Ci0KLSAgcmVzdWx0LT50bHNfaW5kZXggPSBpbmRleDsKLSAgcmVzdWx0LT5kZXN0cnVjdG9yID0gZGVzdHJ1Y3RvcjsKLQotICBTYk11dGV4QWNxdWlyZSgmc2luZ2xldG9uLT5tdXRleF8pOwotICBzaW5nbGV0b24tPnRocmVhZF9sb2NhbF9rZXlzXy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoaW5kZXgsIHJlc3VsdCkpOwotICBTYk11dGV4UmVsZWFzZSgmc2luZ2xldG9uLT5tdXRleF8pOwotICByZXR1cm4gcmVzdWx0OwotfQotCi19ICAvLyBuYW1lc3BhY2Ugd2luMzIKLX0gIC8vIG5hbWVzcGFjZSBzaGFyZWQKLX0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKLQotU2JUaHJlYWRMb2NhbEtleSBTYlRocmVhZENyZWF0ZUxvY2FsS2V5KFNiVGhyZWFkTG9jYWxEZXN0cnVjdG9yIGRlc3RydWN0b3IpIHsKLSAgVGhyZWFkU3Vic3lzdGVtU2luZ2xldG9uKiBzaW5nbGV0b24gPSBHZXRUaHJlYWRTdWJzeXN0ZW1TaW5nbGV0b24oKTsKLSAgcmV0dXJuIFNiVGhyZWFkQ3JlYXRlTG9jYWxLZXlJbnRlcm5hbChkZXN0cnVjdG9yLCBzaW5nbGV0b24pOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX2Rlc3Ryb3lfbG9jYWxfa2V5LmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX2Rlc3Ryb3lfbG9jYWxfa2V5LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTRkYjFkLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9kZXN0cm95X2xvY2FsX2tleS5jYworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvdGhyZWFkLmgiCi0KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfbG9jYWxfaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9wcml2YXRlLmgiCi0KLXVzaW5nIHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6R2V0VGhyZWFkU3Vic3lzdGVtU2luZ2xldG9uOwotdXNpbmcgc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOjpUbHNJbnRlcm5hbEZyZWU7Ci11c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OlRocmVhZFN1YnN5c3RlbVNpbmdsZXRvbjsKLQotdm9pZCBTYlRocmVhZERlc3Ryb3lMb2NhbEtleShTYlRocmVhZExvY2FsS2V5IGtleSkgewotICBpZiAoIVNiVGhyZWFkSXNWYWxpZExvY2FsS2V5KGtleSkpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgLy8gVG8gbWF0Y2ggcHRocmVhZHMsIHRoZSB0aHJlYWQgbG9jYWwgcG9pbnRlciBmb3IgdGhlIGtleSBpcyBzZXQgdG8gbnVsbAotICAvLyBzbyB0aGF0IGEgc3VwcGxpZWQgZGVzdHJ1Y3RvciBkb2Vzbid0IHJ1bi4KLSAgU2JUaHJlYWRTZXRMb2NhbFZhbHVlKGtleSwgbnVsbHB0cik7Ci0gIERXT1JEIHRsc19pbmRleCA9IHN0YXRpY19jYXN0PFNiVGhyZWFkTG9jYWxLZXlQcml2YXRlKj4oa2V5KS0+dGxzX2luZGV4OwotICBUaHJlYWRTdWJzeXN0ZW1TaW5nbGV0b24qIHNpbmdsZXRvbiA9IEdldFRocmVhZFN1YnN5c3RlbVNpbmdsZXRvbigpOwotCi0gIFNiTXV0ZXhBY3F1aXJlKCZzaW5nbGV0b24tPm11dGV4Xyk7Ci0gIHNpbmdsZXRvbi0+dGhyZWFkX2xvY2FsX2tleXNfLmVyYXNlKHRsc19pbmRleCk7Ci0gIFNiTXV0ZXhSZWxlYXNlKCZzaW5nbGV0b24tPm11dGV4Xyk7Ci0KLSAgVGxzSW50ZXJuYWxGcmVlKHRsc19pbmRleCk7Ci0gIFNiTWVtb3J5RGVhbGxvY2F0ZU5vUmVwb3J0KGtleSk7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfZGV0YWNoLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX2RldGFjaC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIyYTEyZC4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfZGV0YWNoLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC90aHJlYWQuaCIKLQotI2luY2x1ZGUgInN0YXJib2FyZC9jb25kaXRpb25fdmFyaWFibGUuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbXV0ZXguaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9wcml2YXRlLmgiCi0KLXVzaW5nIHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6U2JUaHJlYWRQcml2YXRlOwotCi12b2lkIFNiVGhyZWFkRGV0YWNoKFNiVGhyZWFkIHRocmVhZCkgewotICBpZiAodGhyZWFkID09IGtTYlRocmVhZEludmFsaWQpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgU2JUaHJlYWRQcml2YXRlKiB0aHJlYWRfcHJpdmF0ZSA9IHN0YXRpY19jYXN0PFNiVGhyZWFkUHJpdmF0ZSo+KHRocmVhZCk7Ci0KLSAgU2JNdXRleEFjcXVpcmUoJnRocmVhZF9wcml2YXRlLT5tdXRleF8pOwotICB0aHJlYWRfcHJpdmF0ZS0+d2FpdF9mb3Jfam9pbl8gPSBmYWxzZTsKLSAgU2JDb25kaXRpb25WYXJpYWJsZVNpZ25hbCgmdGhyZWFkX3ByaXZhdGUtPmNvbmRpdGlvbl8pOwotICBTYk11dGV4UmVsZWFzZSgmdGhyZWFkX3ByaXZhdGUtPm11dGV4Xyk7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfZ2V0X2N1cnJlbnQuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfZ2V0X2N1cnJlbnQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyYmE1NDQuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX2dldF9jdXJyZW50LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC90aHJlYWQuaCIKLQotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX3ByaXZhdGUuaCIKLQotdXNpbmcgc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOjpHZXRDdXJyZW50U2JUaHJlYWRQcml2YXRlOwotdXNpbmcgc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOjpTYlRocmVhZFByaXZhdGU7Ci0KLVNiVGhyZWFkIFNiVGhyZWFkR2V0Q3VycmVudCgpIHsKLSAgcmV0dXJuIEdldEN1cnJlbnRTYlRocmVhZFByaXZhdGUoKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9nZXRfaWQuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfZ2V0X2lkLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmE3MjkzLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9nZXRfaWQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3RocmVhZC5oIgotCi0jaW5jbHVkZSA8d2luZG93cy5oPgotCi1TYlRocmVhZElkIFNiVGhyZWFkR2V0SWQoKSB7Ci0gIHJldHVybiBHZXRDdXJyZW50VGhyZWFkSWQoKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9nZXRfbG9jYWxfdmFsdWUuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfZ2V0X2xvY2FsX3ZhbHVlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGMxNzVkLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9nZXRfbG9jYWxfdmFsdWUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3RocmVhZC5oIgotCi0jaW5jbHVkZSA8d2luZG93cy5oPgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfbG9jYWxfaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9wcml2YXRlLmgiCi0KLXVzaW5nIHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6VGxzSW50ZXJuYWxHZXRWYWx1ZTsKLQotdm9pZCogU2JUaHJlYWRHZXRMb2NhbFZhbHVlKFNiVGhyZWFkTG9jYWxLZXkga2V5KSB7Ci0gIGlmICghU2JUaHJlYWRJc1ZhbGlkTG9jYWxLZXkoa2V5KSkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIERXT1JEIHRsc19pbmRleCA9IHN0YXRpY19jYXN0PFNiVGhyZWFkTG9jYWxLZXlQcml2YXRlKj4oa2V5KS0+dGxzX2luZGV4OwotICByZXR1cm4gVGxzSW50ZXJuYWxHZXRWYWx1ZSh0bHNfaW5kZXgpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX2dldF9uYW1lLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX2dldF9uYW1lLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2RkM2Q3Li4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9nZXRfbmFtZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvdGhyZWFkLmgiCi0KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc3RyaW5nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfcHJpdmF0ZS5oIgotCi11c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OkdldEN1cnJlbnRTYlRocmVhZFByaXZhdGU7Ci11c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OlNiVGhyZWFkUHJpdmF0ZTsKLQotdm9pZCBTYlRocmVhZEdldE5hbWUoY2hhciogYnVmZmVyLCBpbnQgYnVmZmVyX3NpemUpIHsKLSAgU2JUaHJlYWRQcml2YXRlKiB0aHJlYWRfcHJpdmF0ZSA9IEdldEN1cnJlbnRTYlRocmVhZFByaXZhdGUoKTsKLSAgU2JTdHJpbmdDb3B5KGJ1ZmZlciwgdGhyZWFkX3ByaXZhdGUtPm5hbWVfLmNfc3RyKCksIGJ1ZmZlcl9zaXplKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9pc19lcXVhbC5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9pc19lcXVhbC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NjMmQ2NC4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfaXNfZXF1YWwuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3RocmVhZC5oIgotCi1ib29sIFNiVGhyZWFkSXNFcXVhbChTYlRocmVhZCB0aHJlYWQxLCBTYlRocmVhZCB0aHJlYWQyKSB7Ci0gIHJldHVybiB0aHJlYWQxID09IHRocmVhZDI7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfam9pbi5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9qb2luLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGUxNTg5Li4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9qb2luLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC90aHJlYWQuaCIKLQotI2luY2x1ZGUgInN0YXJib2FyZC9jb25kaXRpb25fdmFyaWFibGUuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbXV0ZXguaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9wcml2YXRlLmgiCi0KLXVzaW5nIHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6U2JUaHJlYWRQcml2YXRlOwotCi1ib29sIFNiVGhyZWFkSm9pbihTYlRocmVhZCB0aHJlYWQsIHZvaWQqKiBvdXRfcmV0dXJuKSB7Ci0gIGlmICh0aHJlYWQgPT0ga1NiVGhyZWFkSW52YWxpZCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIFNiVGhyZWFkUHJpdmF0ZSogdGhyZWFkX3ByaXZhdGUgPSBzdGF0aWNfY2FzdDxTYlRocmVhZFByaXZhdGUqPih0aHJlYWQpOwotCi0gIFNiTXV0ZXhBY3F1aXJlKCZ0aHJlYWRfcHJpdmF0ZS0+bXV0ZXhfKTsKLSAgaWYgKCF0aHJlYWRfcHJpdmF0ZS0+d2FpdF9mb3Jfam9pbl8pIHsKLSAgICAvLyBUaHJlYWQgaGFzIGFscmVhZHkgYmVlbiBkZXRhY2hlZC4KLSAgICBTYk11dGV4UmVsZWFzZSgmdGhyZWFkX3ByaXZhdGUtPm11dGV4Xyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHdoaWxlICghdGhyZWFkX3ByaXZhdGUtPnJlc3VsdF9pc192YWxpZF8pIHsKLSAgICBTYkNvbmRpdGlvblZhcmlhYmxlV2FpdCgmdGhyZWFkX3ByaXZhdGUtPmNvbmRpdGlvbl8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRocmVhZF9wcml2YXRlLT5tdXRleF8pOwotICB9Ci0gIHRocmVhZF9wcml2YXRlLT53YWl0X2Zvcl9qb2luXyA9IGZhbHNlOwotICBTYkNvbmRpdGlvblZhcmlhYmxlU2lnbmFsKCZ0aHJlYWRfcHJpdmF0ZS0+Y29uZGl0aW9uXyk7Ci0gIGlmIChvdXRfcmV0dXJuICE9IE5VTEwpIHsKLSAgICAqb3V0X3JldHVybiA9IHRocmVhZF9wcml2YXRlLT5yZXN1bHRfOwotICB9Ci0gIFNiTXV0ZXhSZWxlYXNlKCZ0aHJlYWRfcHJpdmF0ZS0+bXV0ZXhfKTsKLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfbG9jYWxfaW50ZXJuYWwuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfbG9jYWxfaW50ZXJuYWwuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MzEzZDEuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX2xvY2FsX2ludGVybmFsLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX2xvY2FsX2ludGVybmFsLmgiCi0KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLW5hbWVzcGFjZSBzdGFyYm9hcmQgewotbmFtZXNwYWNlIHNoYXJlZCB7Ci1uYW1lc3BhY2Ugd2luMzIgewotCi0vLyBGbHNBbGxvYygpIGlzIGxpa2UgVGxzQWxsb2MoKSwgYnV0IGFsbG93cyBkZXN0cnVjdG9ycy4KLS8vIFRoZSBkb3duc2lkZSBpcyB0aGF0IEZsc0FsbG9jKCkgaGFzIGEgc21hbGwgdXBwZXIgbGltaXQgb2YKLS8vIGFib3V0IH4xMDAgYXZhaWxhYmxlIGtleXMuIFRvIHByb3ZpZGUgZXh0cmEga2V5cywgVGxzQWxsb2MoKQotLy8gaXMgdXNlZCB3aGVuZXZlciBhIGRlc3RydWN0b3IgaXMgbm90IG5lY2Vzc2FyeS4KLURXT1JEIFRsc0ludGVybmFsQWxsb2MoU2JUaHJlYWRMb2NhbERlc3RydWN0b3IgZGVzdHJ1Y3Rvcl9mbikgewotICBEV09SRCBvdXRwdXQgPSAwOwotICBpZiAoZGVzdHJ1Y3Rvcl9mbikgewotICAgIG91dHB1dCA9IEZsc0FsbG9jKGRlc3RydWN0b3JfZm4pOwotICB9IGVsc2UgewotICAgIG91dHB1dCA9IFRsc0FsbG9jKCk7Ci0gIH0KLSAgaWYgKG91dHB1dCA9PSBUTFNfT1VUX09GX0lOREVYRVMpIHsKLSAgICByZXR1cm4gVExTX09VVF9PRl9JTkRFWEVTOwotICB9Ci0gIHJldHVybiAob3V0cHV0IDw8IDEpIHwgKGRlc3RydWN0b3JfZm4gPyAweDEgOiAweDApOwotfQotCi12b2lkIFRsc0ludGVybmFsRnJlZShEV09SRCBrZXkpIHsKLSAgYm9vbCBoYXNfZGVzdHJ1Y3RvciA9IGtleSAmIDB4MTsKLSAgRFdPUkQgaW5kZXggPSBrZXkgPj4gMTsKLSAgaWYgKGhhc19kZXN0cnVjdG9yKSB7Ci0gICAgRmxzRnJlZShpbmRleCk7Ci0gIH0gZWxzZSB7Ci0gICAgVGxzRnJlZShpbmRleCk7Ci0gIH0KLX0KLQotdm9pZCogVGxzSW50ZXJuYWxHZXRWYWx1ZShEV09SRCBrZXkpIHsKLSAgYm9vbCBoYXNfZGVzdHJ1Y3RvciA9IGtleSAmIDB4MTsKLSAgRFdPUkQgaW5kZXggPSBrZXkgPj4gMTsKLSAgaWYgKGhhc19kZXN0cnVjdG9yKSB7Ci0gICAgcmV0dXJuIEZsc0dldFZhbHVlKGluZGV4KTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gVGxzR2V0VmFsdWUoaW5kZXgpOwotICB9Ci19Ci0KLWJvb2wgVGxzSW50ZXJuYWxTZXRWYWx1ZShEV09SRCBrZXksIHZvaWQqIHZhbHVlKSB7Ci0gIGJvb2wgaGFzX2Rlc3RydWN0b3IgPSBrZXkgJiAweDE7Ci0gIERXT1JEIGluZGV4ID0ga2V5ID4+IDE7Ci0gIGlmIChoYXNfZGVzdHJ1Y3RvcikgewotICAgIHJldHVybiBGbHNTZXRWYWx1ZShpbmRleCwgdmFsdWUpOwotICB9IGVsc2UgewotICAgIHJldHVybiBUbHNTZXRWYWx1ZShpbmRleCwgdmFsdWUpOwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB3aW4zMgotfSAgLy8gbmFtZXNwYWNlIHNoYXJlZAotfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX2xvY2FsX2ludGVybmFsLmggYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfbG9jYWxfaW50ZXJuYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U4ZDJjOC4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfbG9jYWxfaW50ZXJuYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpZm5kZWYgU1RBUkJPQVJEX1NIQVJFRF9XSU4zMl9USFJFQURfTE9DQUxfSU5URVJOQUxfSF8KLSNkZWZpbmUgU1RBUkJPQVJEX1NIQVJFRF9XSU4zMl9USFJFQURfTE9DQUxfSU5URVJOQUxfSF8KLQotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotI2luY2x1ZGUgInN0YXJib2FyZC90aHJlYWQuaCIKLQotbmFtZXNwYWNlIHN0YXJib2FyZCB7Ci1uYW1lc3BhY2Ugc2hhcmVkIHsKLW5hbWVzcGFjZSB3aW4zMiB7Ci0KLURXT1JEIFRsc0ludGVybmFsQWxsb2MoU2JUaHJlYWRMb2NhbERlc3RydWN0b3IgZGVzdHJ1Y3Rvcl9mbik7Ci12b2lkIFRsc0ludGVybmFsRnJlZShEV09SRCBrZXkpOwotCi12b2lkKiBUbHNJbnRlcm5hbEdldFZhbHVlKERXT1JEIGtleSk7Ci1ib29sIFRsc0ludGVybmFsU2V0VmFsdWUoRFdPUkQga2V5LCB2b2lkKiB2YWx1ZSk7Ci0KLX0gIC8vIG5hbWVzcGFjZSB3aW4zMgotfSAgLy8gbmFtZXNwYWNlIHNoYXJlZAotfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZAotCi0jZW5kaWYgIC8vIFNUQVJCT0FSRF9TSEFSRURfV0lOMzJfVEhSRUFEX0xPQ0FMX0lOVEVSTkFMX0hfCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfcHJpdmF0ZS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9wcml2YXRlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2UxN2NiLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9wcml2YXRlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC90aHJlYWQuaCIKLQotI2luY2x1ZGUgPHByb2Nlc3MuaD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL29uY2UuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9wcml2YXRlLmgiCi0KLXVzaW5nIHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6R2V0VGhyZWFkU3Vic3lzdGVtU2luZ2xldG9uOwotdXNpbmcgc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOjpTYlRocmVhZFByaXZhdGU7Ci11c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OlRocmVhZFN1YnN5c3RlbVNpbmdsZXRvbjsKLQotbmFtZXNwYWNlIHN0YXJib2FyZCB7Ci1uYW1lc3BhY2Ugc2hhcmVkIHsKLW5hbWVzcGFjZSB3aW4zMiB7Ci0KLVNCX09OQ0VfSU5JVElBTElaRV9GVU5DVElPTihUaHJlYWRTdWJzeXN0ZW1TaW5nbGV0b24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0VGhyZWFkU3Vic3lzdGVtU2luZ2xldG9uKTsKLQotdm9pZCBSZWdpc3Rlck1haW5UaHJlYWQoKSB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxTYlRocmVhZFByaXZhdGU+IHRocmVhZF9wcml2YXRlKG5ldyBTYlRocmVhZFByaXZhdGUoKSk7Ci0KLSAgLy8gR2V0Q3VycmVudFRocmVhZCgpIHJldHVybnMgYSBwc2V1ZG8taGFuZGxlIHRoYXQgbXVzdCBiZSBkdXBsaWNhdGVkCi0gIC8vIHRvIGJlIHVzZWQgaW4gZ2VuZXJhbCBjYXNlcy4KLSAgSEFORExFIHBzZXVkb19oYW5kbGUgPSBHZXRDdXJyZW50VGhyZWFkKCk7Ci0gIEhBTkRMRSBoYW5kbGU7Ci0gIEJPT0wgc3VjY2VzcyA9Ci0gICAgICBEdXBsaWNhdGVIYW5kbGUoR2V0Q3VycmVudFByb2Nlc3MoKSwgcHNldWRvX2hhbmRsZSwgR2V0Q3VycmVudFByb2Nlc3MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAmaGFuZGxlLCAwLCBmYWxzZSwgRFVQTElDQVRFX1NBTUVfQUNDRVNTKTsKLSAgU0JfRENIRUNLKHN1Y2Nlc3MpIDw8ICJEdXBsaWNhdGVIYW5kbGUgZmFpbGVkIjsKLQotICB0aHJlYWRfcHJpdmF0ZS0+aGFuZGxlXyA9IGhhbmRsZTsKLSAgdGhyZWFkX3ByaXZhdGUtPndhaXRfZm9yX2pvaW5fID0gZmFsc2U7Ci0KLSAgU2JUaHJlYWRTZXRMb2NhbFZhbHVlKEdldFRocmVhZFN1YnN5c3RlbVNpbmdsZXRvbigpLT50aHJlYWRfcHJpdmF0ZV9rZXlfLAotICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkX3ByaXZhdGUucmVsZWFzZSgpKTsKLX0KLQotU2JUaHJlYWRQcml2YXRlKiBHZXRDdXJyZW50U2JUaHJlYWRQcml2YXRlKCkgewotICBTYlRocmVhZFByaXZhdGUqIHNiX3RocmVhZF9wcml2YXRlID0KLSAgICAgIHN0YXRpY19jYXN0PFNiVGhyZWFkUHJpdmF0ZSo+KFNiVGhyZWFkR2V0TG9jYWxWYWx1ZSgKLSAgICAgICAgICBHZXRUaHJlYWRTdWJzeXN0ZW1TaW5nbGV0b24oKS0+dGhyZWFkX3ByaXZhdGVfa2V5XykpOwotICBpZiAoc2JfdGhyZWFkX3ByaXZhdGUgPT0gbnVsbHB0cikgewotICAgIC8vIFdlIGFyZSBsaWtlbHkgb24gYSB0aHJlYWQgd2UgZGlkIG5vdCBjcmVhdGUsIHNvIFRMUyBuZWVkcyB0byBiZSBzZXR1cC4KLSAgICBSZWdpc3Rlck1haW5UaHJlYWQoKTsKLSAgICBzYl90aHJlYWRfcHJpdmF0ZSA9IHN0YXRpY19jYXN0PFNiVGhyZWFkUHJpdmF0ZSo+KFNiVGhyZWFkR2V0TG9jYWxWYWx1ZSgKLSAgICAgICAgR2V0VGhyZWFkU3Vic3lzdGVtU2luZ2xldG9uKCktPnRocmVhZF9wcml2YXRlX2tleV8pKTsKLSAgICAvLyBUT0RPOiBDbGVhbiB1cCBUTFMgc3RvcmFnZSBmb3IgdGhyZWFkcyB3ZSBkbyBub3QgY3JlYXRlLgotICB9Ci0gIHJldHVybiBzYl90aHJlYWRfcHJpdmF0ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHdpbjMyCi19ICAvLyBuYW1lc3BhY2Ugc2hhcmVkCi19ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfcHJpdmF0ZS5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX3ByaXZhdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdiMDAzNi4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfcHJpdmF0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpZm5kZWYgU1RBUkJPQVJEX1NIQVJFRF9XSU4zMl9USFJFQURfUFJJVkFURV9IXwotI2RlZmluZSBTVEFSQk9BUkRfU0hBUkVEX1dJTjMyX1RIUkVBRF9QUklWQVRFX0hfCi0KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2NvbmRpdGlvbl92YXJpYWJsZS5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tdXRleC5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9vbmNlLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9pbnRlcm5hbF9vbmx5LmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3RocmVhZC5oIgotCi1zdHJ1Y3QgU2JUaHJlYWRMb2NhbEtleVByaXZhdGUgewotICBEV09SRCB0bHNfaW5kZXg7Ci0gIFNiVGhyZWFkTG9jYWxEZXN0cnVjdG9yIGRlc3RydWN0b3I7Ci19OwotCi1uYW1lc3BhY2Ugc3RhcmJvYXJkIHsKLW5hbWVzcGFjZSBzaGFyZWQgewotbmFtZXNwYWNlIHdpbjMyIHsKLQotY2xhc3MgVGhyZWFkU3Vic3lzdGVtU2luZ2xldG9uOwotCi0vLyBDcmVhdGVzIGEgU2JUaHJlYWRMb2NhbEtleSBnaXZlbiBhIFRocmVhZFN1YnN5c3RlbVNpbmdsZXRvbi4gVXNlZAotLy8gdG8gY3JlYXRlIHRoZSBmaXJzdCBTYlRocmVhZExvY2FsS2V5LgotU2JUaHJlYWRMb2NhbEtleSBTYlRocmVhZENyZWF0ZUxvY2FsS2V5SW50ZXJuYWwoCi0gICAgU2JUaHJlYWRMb2NhbERlc3RydWN0b3IgZGVzdHJ1Y3RvciwKLSAgICBUaHJlYWRTdWJzeXN0ZW1TaW5nbGV0b24qIHNpbmdsZXRvbik7Ci0KLS8vIFNpbmdsZXRvbiBzdGF0ZSBmb3IgdGhlIHRocmVhZCBzdWJzeXN0ZW0uCi1jbGFzcyBUaHJlYWRTdWJzeXN0ZW1TaW5nbGV0b24gewotIHB1YmxpYzoKLSAgVGhyZWFkU3Vic3lzdGVtU2luZ2xldG9uKCkKLSAgICAgIDogbXV0ZXhfKFNCX01VVEVYX0lOSVRJQUxJWkVSKSwKLSAgICAgICAgdGhyZWFkX3ByaXZhdGVfa2V5XyhTYlRocmVhZENyZWF0ZUxvY2FsS2V5SW50ZXJuYWwoTlVMTCwgdGhpcykpIHt9Ci0gIC8vIFRoaXMgbXV0ZXggcHJvdGVjdHMgYWxsIGNsYXNzIG1lbWJlcnMKLSAgU2JNdXRleCBtdXRleF87Ci0gIC8vIEFsbG9jYXRlZCB0aHJlYWRfbG9jYWxfa2V5cy4gTm90ZSB0aGF0IHN0ZDo6bWFwIGlzIHVzZWQKLSAgLy8gc28gdGhhdCBlbGVtZW50cyBjYW4gYmUgZGVsZXRlZCB3aXRob3V0IHRyaWdnZXJpbmcgYW4gYWxsb2NhdGlvbi4KLSAgc3RkOjptYXA8RFdPUkQsIFNiVGhyZWFkTG9jYWxLZXlQcml2YXRlKj4gdGhyZWFkX2xvY2FsX2tleXNfOwotICAvLyBUaHJlYWQtbG9jYWwga2V5IGZvciB0aGUgdGhyZWFkJ3MgU2JUaHJlYWRQcml2YXRlCi0gIFNiVGhyZWFkTG9jYWxLZXkgdGhyZWFkX3ByaXZhdGVfa2V5XzsKLX07Ci0KLS8vIE9idGFpbnMgdGhlIFRocmVhZHNTdWJzeXN0ZW1TaW5nbGV0b24oKTsKLVRocmVhZFN1YnN5c3RlbVNpbmdsZXRvbiogR2V0VGhyZWFkU3Vic3lzdGVtU2luZ2xldG9uKCk7Ci0KLS8vIFJlZ2lzdGVycyB0aGUgbWFpbiB0aHJlYWQuIHNldHRpbmcgaXQncyBTYlRocmVhZFByaXZhdGUqCi12b2lkIFJlZ2lzdGVyTWFpblRocmVhZCgpOwotCi0vLyBQcml2YXRlIHRocmVhZCBzdGF0ZSwgc3RvcmVkIGluIHRocmVhZCBsb2NhbCBzdG9yYWdlIGFuZAotLy8gY2xlYW5lZCB1cCB3aGVuIHRocmVhZCBleGl0cy4KLWNsYXNzIFNiVGhyZWFkUHJpdmF0ZSB7Ci0gcHVibGljOgotICBTYlRocmVhZFByaXZhdGUoKQotICAgICAgOiBtdXRleF8oU0JfTVVURVhfSU5JVElBTElaRVIpLAotICAgICAgICBjb25kaXRpb25fKFNCX0NPTkRJVElPTl9WQVJJQUJMRV9JTklUSUFMSVpFUiksCi0gICAgICAgIGhhbmRsZV8oTlVMTCksCi0gICAgICAgIHJlc3VsdF8oTlVMTCksCi0gICAgICAgIHdhaXRfZm9yX2pvaW5fKGZhbHNlKSwKLSAgICAgICAgcmVzdWx0X2lzX3ZhbGlkXyhmYWxzZSkge30KLQotICB+U2JUaHJlYWRQcml2YXRlKCkgewotICAgIGlmIChoYW5kbGVfKSB7Ci0gICAgICBDbG9zZUhhbmRsZShoYW5kbGVfKTsKLSAgICB9Ci0KLSAgICBTYk11dGV4RGVzdHJveSgmbXV0ZXhfKTsKLSAgICBTYkNvbmRpdGlvblZhcmlhYmxlRGVzdHJveSgmY29uZGl0aW9uXyk7Ci0gIH0KLQotICAvLyBUaGlzIG11dGV4IHByb3RlY3RzIGFsbCBjbGFzcyBtZW1iZXJzCi0gIFNiTXV0ZXggbXV0ZXhfOwotICBTYkNvbmRpdGlvblZhcmlhYmxlIGNvbmRpdGlvbl87Ci0gIHN0ZDo6c3RyaW5nIG5hbWVfOwotICBIQU5ETEUgaGFuZGxlXzsKLSAgLy8gVGhlIHJlc3VsdCBvZiB0aGUgdGhyZWFkLiBUaGUgcmV0dXJuIHZhbHVlIG9mIFNiVGhyZWFkRW50cnlQb2ludAotICAvLyB0byByZXR1cm4gdG8gU2JUaHJlYWRKb2luLgotICB2b2lkKiByZXN1bHRfOwotICAvLyBUcnVlIGlmIGEgdGhyZWFkIG11c3Qgd2FpdCB0byBiZSBqb2luZWQgYmVmb3JlIGNvbXBsZXRlbHkgZXhpdGluZy4KLSAgLy8gQ2hhbmdlcyB0byB0aGlzIG11c3Qgc2lnbmFsIHxjb25kaXRpb25ffC4KLSAgYm9vbCB3YWl0X2Zvcl9qb2luXzsKLSAgLy8gVHJ1ZSBpZiB8cmVzdWx0X3wgaXMgdmFsaWQgKHRoZSB0aHJlYWQgaGFzIGNvbXBsZXRlZCBhbmQgaXMgd2FpdGluZwotICAvLyB0byBleGl0KS4gQ2hhbmdlcyB0byB0aGlzIG11c3Qgc2lnbmFsIHxjb25kaXRpb25ffC4KLSAgYm9vbCByZXN1bHRfaXNfdmFsaWRfOwotfTsKLQotLy8gT2J0YWlucyB0aGUgY3VycmVudCB0aHJlYWQncyBTYlRocmVhZFByaXZhdGUqIGZyb20gdGhyZWFkLWxvY2FsIHN0b3JhZ2UuCi1TYlRocmVhZFByaXZhdGUqIEdldEN1cnJlbnRTYlRocmVhZFByaXZhdGUoKTsKLQotfSAgLy8gbmFtZXNwYWNlIHdpbjMyCi19ICAvLyBuYW1lc3BhY2Ugc2hhcmVkCi19ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCi0KLSNlbmRpZiAgLy8gU1RBUkJPQVJEX1NIQVJFRF9XSU4zMl9USFJFQURfUFJJVkFURV9IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX3NldF9sb2NhbF92YWx1ZS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9zZXRfbG9jYWxfdmFsdWUuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyZGJlMjQuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX3NldF9sb2NhbF92YWx1ZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvdGhyZWFkLmgiCi0KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9sb2NhbF9pbnRlcm5hbC5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX3ByaXZhdGUuaCIKLQotdXNpbmcgc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOjpUbHNJbnRlcm5hbFNldFZhbHVlOwotCi1ib29sIFNiVGhyZWFkU2V0TG9jYWxWYWx1ZShTYlRocmVhZExvY2FsS2V5IGtleSwgdm9pZCogdmFsdWUpIHsKLSAgaWYgKCFTYlRocmVhZElzVmFsaWRMb2NhbEtleShrZXkpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIERXT1JEIHRsc19pbmRleCA9IHN0YXRpY19jYXN0PFNiVGhyZWFkTG9jYWxLZXlQcml2YXRlKj4oa2V5KS0+dGxzX2luZGV4OwotICByZXR1cm4gVGxzSW50ZXJuYWxTZXRWYWx1ZSh0bHNfaW5kZXgsIHZhbHVlKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9zZXRfbmFtZS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9zZXRfbmFtZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE3ZGI5OC4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfc2V0X25hbWUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3RocmVhZC5oIgotCi0jaW5jbHVkZSA8d2luZG93cy5oPgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfcHJpdmF0ZS5oIgotCi11c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OkdldEN1cnJlbnRTYlRocmVhZFByaXZhdGU7Ci11c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OlNiVGhyZWFkUHJpdmF0ZTsKLQotbmFtZXNwYWNlIHsKLQotLy8gVGhlIGNvZGUgYmVsb3cgaXMgZnJvbQotLy8gaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS94Y2Iyejhocy5hc3B4Ci0vLyBBIHxkd1RocmVhZElEfCBvZiAtMSBtZWFucyAiY3VycmVudCB0aHJlYWQiOwotLy8KLS8vIFVzYWdlOiBTZXRUaHJlYWROYW1lICgoRFdPUkQpLTEsICJNYWluVGhyZWFkIik7Ci0vLwotY29uc3QgRFdPUkQgTVNfVkNfRVhDRVBUSU9OID0gMHg0MDZEMTM4ODsKLSNwcmFnbWEgcGFjayhwdXNoLCA4KQotdHlwZWRlZiBzdHJ1Y3QgdGFnVEhSRUFETkFNRV9JTkYgewotICBEV09SRCBkd1R5cGU7ICAgICAgLy8gTXVzdCBiZSAweDEwMDAuCi0gIExQQ1NUUiBzek5hbWU7ICAgICAvLyBQb2ludGVyIHRvIG5hbWUgKGluIHVzZXIgYWRkciBzcGFjZSkuCi0gIERXT1JEIGR3VGhyZWFkSUQ7ICAvLyBUaHJlYWQgSUQgKC0xPWNhbGxlciB0aHJlYWQpLgotICBEV09SRCBkd0ZsYWdzOyAgICAgLy8gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UsIG11c3QgYmUgemVyby4KLX0gVEhSRUFETkFNRV9JTkZPOwotI3ByYWdtYSBwYWNrKHBvcCkKLXZvaWQgU2V0VGhyZWFkTmFtZShEV09SRCBkd1RocmVhZElELCBjb25zdCBjaGFyKiB0aHJlYWROYW1lKSB7Ci0gIFRIUkVBRE5BTUVfSU5GTyBpbmZvOwotICBpbmZvLmR3VHlwZSA9IDB4MTAwMDsKLSAgaW5mby5zek5hbWUgPSB0aHJlYWROYW1lOwotICBpbmZvLmR3VGhyZWFkSUQgPSBkd1RocmVhZElEOwotICBpbmZvLmR3RmxhZ3MgPSAwOwotI3ByYWdtYSB3YXJuaW5nKHB1c2gpCi0jcHJhZ21hIHdhcm5pbmcoZGlzYWJsZSA6IDYzMjAgNjMyMikKLSAgX190cnkgewotICAgIFJhaXNlRXhjZXB0aW9uKE1TX1ZDX0VYQ0VQVElPTiwgMCwgc2l6ZW9mKGluZm8pIC8gc2l6ZW9mKFVMT05HX1BUUiksCi0gICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxVTE9OR19QVFIqPigmaW5mbykpOwotICB9IF9fZXhjZXB0KEVYQ0VQVElPTl9FWEVDVVRFX0hBTkRMRVIpIHsKLSAgfQotI3ByYWdtYSB3YXJuaW5nKHBvcCkKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLXZvaWQgU2JUaHJlYWRTZXROYW1lKGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgU2JUaHJlYWRQcml2YXRlKiB0aHJlYWRfcHJpdmF0ZSA9IEdldEN1cnJlbnRTYlRocmVhZFByaXZhdGUoKTsKLQotICAvLyBXZSBzdG9yZSB0aGUgdGhyZWFkIG5hbWUgaW4gb3VyIG93biBUTFMgY29udGV4dCBhcyB3ZWxsIGFzIHRlbGxpbmcKLSAgLy8gdGhlIE9TIGJlY2F1c2UgaXQncyBtdWNoIGVhc2llciB0byByZXRyaWV2ZSBmcm9tIG91ciBvd24gVExTIGNvbnRleHQuCi0gIHRocmVhZF9wcml2YXRlLT5uYW1lXyA9IG5hbWU7Ci0gIFNldFRocmVhZE5hbWUoc3RhdGljX2Nhc3Q8RFdPUkQ+KC0xKSwgbmFtZSk7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfc2xlZXAuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfc2xlZXAuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1Yzk2NWQuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX3NsZWVwLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC90aHJlYWQuaCIKLQotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvdGltZV91dGlscy5oIgotCi11c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OkNvbnZlcnRTYlRpbWVUb01pbGxpc1JvdW5kVXA7Ci0KLXZvaWQgU2JUaHJlYWRTbGVlcChTYlRpbWUgZHVyYXRpb24pIHsKLSAgaWYgKGR1cmF0aW9uIDwgMCkgewotICAgIHJldHVybjsKLSAgfQotICBTbGVlcChDb252ZXJ0U2JUaW1lVG9NaWxsaXNSb3VuZFVwKGR1cmF0aW9uKSk7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfdHlwZXNfcHVibGljLmggYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfdHlwZXNfcHVibGljLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NDMwNjguLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX3R5cGVzX3B1YmxpYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotLy8gSW5jbHVkZXMgdGhyZWFkaW5nIHByaW1pdGl2ZSB0eXBlcyBhbmQgaW5pdGlhbGl6ZXJzLgotCi0jaWZuZGVmIFNUQVJCT0FSRF9TSEFSRURfV0lOMzJfVEhSRUFEX1RZUEVTX1BVQkxJQ19IXwotI2RlZmluZSBTVEFSQk9BUkRfU0hBUkVEX1dJTjMyX1RIUkVBRF9UWVBFU19QVUJMSUNfSF8KLQotLy8gLS0tIFNiQ29uZGl0aW9uVmFyaWFibGUgLS0tCi0KLS8vIFRyYW5zcGFyZW50IENvbmRpdGlvbiBWYXJpYWJsZSBoYW5kbGUuCi0vLyBOb3RlOiByZXBsaWNhIG9mIFJUTF9DT05ESVRJT05fVkFSSUFCTEUgaW4gdW0vd2lubnQuaCB0byBhdm9pZCBpbmNsdWRlLgotdHlwZWRlZiBzdHJ1Y3QgV2luZG93c0NvbmRpdGlvblZhcmlhYmxlIHsgdm9pZCogcHRyOyB9IFNiQ29uZGl0aW9uVmFyaWFibGU7Ci0KLS8vIENvbmRpdGlvbiBWYXJpYWJsZSBzdGF0aWMgaW5pdGlhbGl6ZXIuCi0vLyBOb3RlOiByZXBsaWNhIG9mIFJUTF9DT05ESVRJT05fVkFSSUFCSUxFX0lOSVQgaW4gdW0vd2lubnQuaCB0byBhdm9pZCBpbmNsdWRlLgotI2RlZmluZSBTQl9DT05ESVRJT05fVkFSSUFCTEVfSU5JVElBTElaRVIgXAotICB7IDAgfQotCi0vLyAtLS0gU2JNdXRleCAtLS0KLQotLy8gVHJhbnNwYXJlbnQgTXV0ZXggaGFuZGxlLgotLy8gTm90ZSBTUldMb2NrJ3MgYXJlIHVzZWQgZm9yIFNiTXV0ZXggYmVjYXVzZToKLS8vIC0gTm9ybWFsIFdpbmRvd3MgQ3JlYXRlTXV0ZXgoKSBtdXRleGVzIGFyZSB2ZXJ5IGhlYXZ5LXdlaWdodAotLy8gLSBDcml0aWNhbCBzZWN0aW9ucyBkbyBub3QgaGF2ZSBhIHN0YXRpYyBpbml0aWFsaXplcgotLy8gTm90ZTogcmVwbGljYSBvZiBSVExfU1JXTE9DSyBpbiB1bS93aW5udC5oIHRvIGF2b2lkIGluY2x1ZGUuCi10eXBlZGVmIHN0cnVjdCBXaW5kb3dzU3J3TG9jayB7IHZvaWQqIHB0cjsgfSBTYk11dGV4OwotCi0vLyBNdXRleCBzdGF0aWMgaW5pdGlhbGl6ZXIuCi0vLyBOb3RlOiByZXBsaWNhIG9mIFJUTF9TUldMT0NLX0lOSVQgaW4gdW0vd2lubnQuaCB0byBhdm9pZCBpbmNsdWRlLgotI2RlZmluZSBTQl9NVVRFWF9JTklUSUFMSVpFUiBcCi0gIHsgMCB9Ci0KLS8vIC0tLSBTYk9uY2UgLS0tCi0KLS8vIFRyYW5zcGFyZW50IE9uY2UgY29udHJvbCBoYW5kbGUuCi10eXBlZGVmIHVuaW9uIFdpbmRvd3NSdW5PbmNlIHsgdm9pZCogcHRyOyB9IFNiT25jZUNvbnRyb2w7Ci0KLS8vIE9uY2Ugc3RhdGljIGluaXRpYWxpemVyLgotLy8gTm90ZTogcmVwbGljYSBvZiBSVExfUlVOX09OQ0VfSU5JVCBpbiB1bS93aW5udC5oIHRvIGF2b2lkIGluY2x1ZGUuCi0jZGVmaW5lIFNCX09OQ0VfSU5JVElBTElaRVIgXAotICB7IDAgfQotCi0vLyAtLS0gU2JUaHJlYWQgLS0tCi0KLS8vIFRyYW5zcGFyZW50IHB0aHJlYWQgaGFuZGxlLgotdHlwZWRlZiB2b2lkKiBTYlRocmVhZDsKLQotLy8gV2VsbC1kZWZpbmVkIGNvbnN0YW50IHZhbHVlIHRvIG1lYW4gIm5vIHRocmVhZCBoYW5kbGUuIgotI2RlZmluZSBrU2JUaHJlYWRJbnZhbGlkIChTYlRocmVhZCkgTlVMTAotCi0jZW5kaWYgIC8vIFNUQVJCT0FSRF9TSEFSRURfV0lOMzJfVEhSRUFEX1RZUEVTX1BVQkxJQ19IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX3lpZWxkLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX3lpZWxkLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjg3ODUyLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF95aWVsZC5jYworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvdGhyZWFkLmgiCi0KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLXZvaWQgU2JUaHJlYWRZaWVsZCgpIHsKLSAgU2xlZXAoMCk7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aW1lX2dldF9tb25vdG9uaWNfbm93LmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGltZV9nZXRfbW9ub3RvbmljX25vdy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc2MTM2OC4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aW1lX2dldF9tb25vdG9uaWNfbm93LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC90aW1lLmgiCi0KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0KLVNiVGltZU1vbm90b25pYyBTYlRpbWVHZXRNb25vdG9uaWNOb3coKSB7Ci0gIExBUkdFX0lOVEVHRVIgY291bnRzOwotICBib29sIHN1Y2Nlc3M7Ci0KLSAgc3VjY2VzcyA9IFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCZjb3VudHMpOwotCi0gIC8vICJPbiBzeXN0ZW1zIHRoYXQgcnVuIFdpbmRvd3MgWFAgb3IgbGF0ZXIsCi0gIC8vIHRoZSBmdW5jdGlvbiB3aWxsIGFsd2F5cyBzdWNjZWVkIGFuZCB3aWxsIHRodXMgbmV2ZXIgcmV0dXJuIHplcm8uIgotICAvLyBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L3dpbmRvd3MvZGVza3RvcC9tczY0NDkwNCh2PXZzLjg1KS5hc3B4Ci0gIFNCX0RDSEVDSyhzdWNjZXNzKTsKLQotICBMQVJHRV9JTlRFR0VSIGNvdW50c1BlclNlY29uZDsKLSAgc3VjY2VzcyA9IFF1ZXJ5UGVyZm9ybWFuY2VGcmVxdWVuY3koJmNvdW50c1BlclNlY29uZCk7Ci0gIC8vICJPbiBzeXN0ZW1zIHRoYXQgcnVuIFdpbmRvd3MgWFAgb3IgbGF0ZXIsCi0gIC8vIHRoZSBmdW5jdGlvbiB3aWxsIGFsd2F5cyBzdWNjZWVkIGFuZCB3aWxsIHRodXMgbmV2ZXIgcmV0dXJuIHplcm8uIgotICAvLyBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L3dpbmRvd3MvZGVza3RvcC9tczY0NDkwNSh2PXZzLjg1KS5hc3B4Ci0gIFNCX0RDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBBbiBvYnNlcnZlZCB2YWx1ZSBvZiBjb3VudHNQZXJTZWNvbmQgb24gYSBkZXNrdG9wIHg4NiBtYWNoaW5lIGlzCi0gIC8vIH4yLjVlNi4gV2l0aCB0aGlzIGZyZXF1ZW5jeSwgaXQgd2lsbCB0YWtlIH4zNzUwMCBkYXlzIHRvIGV4Y2VlZAotICAvLyAyXjUzLCB3aGljaCBpcyB0aGUgbWFudGlzc2EgcHJlY2lzaW9uIG9mIGEgZG91YmxlLgotICAvLyBIZW5jZSwgd2UgY2FuIHNhZmVseSBjb252ZXJ0IHRvIGEgZG91YmxlIGhlcmUgd2l0aG91dCBsb3NpbmcgcHJlY2lzaW9uLgotICBkb3VibGUgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8ZG91YmxlPihjb3VudHMuUXVhZFBhcnQpOwotICByZXN1bHQgKj0gKDEwMDAuMCAqIDEwMDAuMCkgLyBjb3VudHNQZXJTZWNvbmQuUXVhZFBhcnQ7Ci0KLSAgcmV0dXJuIHN0YXRpY19jYXN0PFNiVGltZU1vbm90b25pYz4ocmVzdWx0KTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RpbWVfZ2V0X25vdy5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RpbWVfZ2V0X25vdy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFhMWZiYy4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aW1lX2dldF9ub3cuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3RpbWUuaCIKLQotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotU2JUaW1lIFNiVGltZUdldE5vdygpIHsKLSAgU1lTVEVNVElNRSBzeXN0ZW1fdGltZTsKLSAgR2V0U3lzdGVtVGltZSgmc3lzdGVtX3RpbWUpOwotCi0gIEZJTEVUSU1FIGZpbGVfdGltZTsKLSAgU3lzdGVtVGltZVRvRmlsZVRpbWUoJnN5c3RlbV90aW1lLCAmZmlsZV90aW1lKTsKLQotICBVTEFSR0VfSU5URUdFUiBsYXJnZV9pbnQ7Ci0gIGxhcmdlX2ludC5Mb3dQYXJ0ID0gZmlsZV90aW1lLmR3TG93RGF0ZVRpbWU7Ci0gIGxhcmdlX2ludC5IaWdoUGFydCA9IGZpbGVfdGltZS5kd0hpZ2hEYXRlVGltZTsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PFNiVGltZT4obGFyZ2VfaW50LlF1YWRQYXJ0KSAvIDEwOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGltZV91dGlscy5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGltZV91dGlscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWE5ZTEyLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RpbWVfdXRpbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpZm5kZWYgU1RBUkJPQVJEX1NIQVJFRF9XSU4zMl9USU1FX1VUSUxTX0hfCi0jZGVmaW5lIFNUQVJCT0FSRF9TSEFSRURfV0lOMzJfVElNRV9VVElMU19IXwotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotCi1uYW1lc3BhY2Ugc3RhcmJvYXJkIHsKLW5hbWVzcGFjZSBzaGFyZWQgewotbmFtZXNwYWNlIHdpbjMyIHsKLQotaW5saW5lIFNiVGltZSBDb252ZXJ0RmlsZVRpbWVUaWNrc1RvU2JUaW1lKGNvbnN0IExBUkdFX0lOVEVHRVIgdGlja3MpIHsKLSAgLy8gQWNjb3JkaW5nIHRvCi0gIC8vIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvd2luZG93cy9kZXNrdG9wL21zNzI0Mjg0KHY9dnMuODUpLmFzcHgKLSAgLy8gRklMRVRJTUUgZm9ybWF0IGlzICJDb250YWlucyBhIDY0LWJpdCB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIG51bWJlciBvZgotICAvLyAxMDAtbmFub3NlY29uZCBpbnRlcnZhbHMgc2luY2UgSmFudWFyeSAxLCAxNjAxIChVVEMpIgotICBjb25zdCB1aW50NjRfdCBrTnVtYmVyMTAwbmFub3NlY29uZFRpY2tzSW5NaWNyb3NlY29uZCA9IDEwOwotICByZXR1cm4gdGlja3MuUXVhZFBhcnQgLyBrTnVtYmVyMTAwbmFub3NlY29uZFRpY2tzSW5NaWNyb3NlY29uZDsKLX0KLQotaW5saW5lIFNiVGltZSBDb252ZXJ0RmlsZVRpbWVUb1NiVGltZShjb25zdCBGSUxFVElNRSBmaWxlX3RpbWUpIHsKLSAgLy8gQWNjb3JkaW5nIHRvCi0gIC8vIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvd2luZG93cy9kZXNrdG9wL21zNzI0Mjg0KHY9dnMuODUpLmFzcHgKLSAgLy8gRklMRVRJTUUgZm9ybWF0IGlzICJDb250YWlucyBhIDY0LWJpdCB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIG51bWJlciBvZgotICAvLyAxMDAtbmFub3NlY29uZCBpbnRlcnZhbHMgc2luY2UgSmFudWFyeSAxLCAxNjAxIChVVEMpIgotICBMQVJHRV9JTlRFR0VSIHRpY2tzOwotICB0aWNrcy5RdWFkUGFydCA9IChzdGF0aWNfY2FzdDxMT05HTE9ORz4oZmlsZV90aW1lLmR3SGlnaERhdGVUaW1lKSA8PCAzMikgfAotICAgICAgICAgICAgICAgICAgIGZpbGVfdGltZS5kd0xvd0RhdGVUaW1lOwotICByZXR1cm4gQ29udmVydEZpbGVUaW1lVGlja3NUb1NiVGltZSh0aWNrcyk7Ci19Ci0KLWlubGluZSBTYlRpbWUgQ29udmVydFN5c3RlbVRpbWVUb1NiVGltZShjb25zdCBTWVNURU1USU1FIHN5c3RlbV90aW1lKSB7Ci0gIEZJTEVUSU1FIGZpbGVfdGltZSA9IHswfTsKLSAgU3lzdGVtVGltZVRvRmlsZVRpbWUoJnN5c3RlbV90aW1lLCAmZmlsZV90aW1lKTsKLSAgcmV0dXJuIENvbnZlcnRGaWxlVGltZVRvU2JUaW1lKGZpbGVfdGltZSk7Ci19Ci0KLS8vIE1hbnkgV2luMzIgY2FsbHMgdGFrZSBtaWxsaXMsIGJ1dCBTYlRpbWUgaXMgbWljcm9zZWNvbmRzLgotLy8gTWFueSBucGxiIHRlc3RzIGFzc3VtZSB3YWl0cyBhcmUgYXQgbGVhc3QgYXMgbG9uZyBhcyByZXF1ZXN0ZWQsIHNvCi0vLyByb3VuZCB1cC4KLWlubGluZSBEV09SRCBDb252ZXJ0U2JUaW1lVG9NaWxsaXNSb3VuZFVwKFNiVGltZSBkdXJhdGlvbikgewotICBjb25zdCBpbnQ2NF90IG1pbGxpc2Vjb25kc190b19zbGVlcCA9Ci0gICAgICAoZHVyYXRpb24gKyBrU2JUaW1lTWlsbGlzZWNvbmQgLSAxKSAvIGtTYlRpbWVNaWxsaXNlY29uZDsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PERXT1JEPihtaWxsaXNlY29uZHNfdG9fc2xlZXApOwotfQotCi19ICAvLyBuYW1lc3BhY2Ugd2luMzIKLX0gIC8vIG5hbWVzcGFjZSBzaGFyZWQKLX0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKLQotI2VuZGlmICAvLyBTVEFSQk9BUkRfU0hBUkVEX1dJTjMyX1RJTUVfVVRJTFNfSF8KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RpbWVfem9uZV9nZXRfY3VycmVudC5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RpbWVfem9uZV9nZXRfY3VycmVudC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA0MDA1OS4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aW1lX3pvbmVfZ2V0X2N1cnJlbnQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3RpbWVfem9uZS5oIgotCi0jaW5jbHVkZSA8d2luZG93cy5oPgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotU2JUaW1lWm9uZSBTYlRpbWVab25lR2V0Q3VycmVudCgpIHsKLSAgRFlOQU1JQ19USU1FX1pPTkVfSU5GT1JNQVRJT04gdGltZV96b25lX2luZm87Ci0KLSAgRFdPUkQgem9uZV9pZCA9IEdldER5bmFtaWNUaW1lWm9uZUluZm9ybWF0aW9uKCZ0aW1lX3pvbmVfaW5mbyk7Ci0KLSAgc3dpdGNoICh6b25lX2lkKSB7Ci0gIGNhc2UgVElNRV9aT05FX0lEX1VOS05PV046Ci0gICAgcmV0dXJuIHRpbWVfem9uZV9pbmZvLkJpYXM7Ci0gIGNhc2UgVElNRV9aT05FX0lEX1NUQU5EQVJEOgotICAgIHJldHVybiB0aW1lX3pvbmVfaW5mby5TdGFuZGFyZEJpYXM7Ci0gIGNhc2UgVElNRV9aT05FX0lEX0RBWUxJR0hUOgotICAgIHJldHVybiB0aW1lX3pvbmVfaW5mby5EYXlsaWdodEJpYXM7Ci0gIGRlZmF1bHQ6Ci0gICAgU0JfTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiAwOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aW1lX3pvbmVfZ2V0X25hbWUuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aW1lX3pvbmVfZ2V0X25hbWUuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlZjg4ZmIuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGltZV96b25lX2dldF9uYW1lLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC90aW1lX3pvbmUuaCIKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxXaW5kb3dzLmg+Ci0KLSNpbmNsdWRlICJzdGFyYm9hcmQvb25jZS5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvd2NoYXJfdXRpbHMuaCIKLQotbmFtZXNwYWNlIHsKLWNsYXNzIFRpbWVab25lU3RyaW5nIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBUaW1lWm9uZVN0cmluZyogR2V0KCk7Ci0gIGNvbnN0IGNoYXIqIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gdmFsdWVfLmNfc3RyKCk7IH0KLQotIHByaXZhdGU6Ci0gIFRpbWVab25lU3RyaW5nKCkgewotICAgIERZTkFNSUNfVElNRV9aT05FX0lORk9STUFUSU9OIHRpbWVfem9uZV9pbmZvOwotICAgIEdldER5bmFtaWNUaW1lWm9uZUluZm9ybWF0aW9uKCZ0aW1lX3pvbmVfaW5mbyk7Ci0KLSAgICBzdGQ6OndzdHJpbmcgd2lkZV9zdHJpbmcgPSB0aW1lX3pvbmVfaW5mby5UaW1lWm9uZUtleU5hbWU7Ci0gICAgdmFsdWVfID0gc3RhcmJvYXJkOjpzaGFyZWQ6OndpbjMyOjp3Y2hhcl90VG9VVEY4KHdpZGVfc3RyaW5nLmNfc3RyKCkpOwotICB9Ci0gIHN0ZDo6c3RyaW5nIHZhbHVlXzsKLX07Ci0KLVNCX09OQ0VfSU5JVElBTElaRV9GVU5DVElPTihUaW1lWm9uZVN0cmluZywgVGltZVpvbmVTdHJpbmc6OkdldCk7Ci19ICAvLyBuYW1lc3BhY2UuCi0KLWNvbnN0IGNoYXIqIFNiVGltZVpvbmVHZXROYW1lKCkgewotICBjb25zdCBjaGFyKiBvdXRwdXQgPSBUaW1lWm9uZVN0cmluZzo6R2V0KCktPnZhbHVlKCk7Ci0gIHJldHVybiBvdXRwdXQ7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi92aWRlb19kZWNvZGVyLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdmlkZW9fZGVjb2Rlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUzNWYxMS4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi92aWRlb19kZWNvZGVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjY4ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3ZpZGVvX2RlY29kZXIuaCIKLQotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0KLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9kZWNvZGVfdGFyZ2V0X2ludGVybmFsLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9keF9jb250ZXh0X3ZpZGVvX2RlY29kZXIuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2Vycm9yX3V0aWxzLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3RpbWUuaCIKLQotbmFtZXNwYWNlIHN0YXJib2FyZCB7Ci1uYW1lc3BhY2Ugc2hhcmVkIHsKLW5hbWVzcGFjZSB3aW4zMiB7Ci0KLW5hbWVzcGFjZSB7Ci0KLXVzaW5nIE1pY3Jvc29mdDo6V1JMOjpDb21QdHI7Ci11c2luZyA6OnN0YXJib2FyZDo6c2hhcmVkOjpzdGFyYm9hcmQ6OnBsYXllcjo6ZmlsdGVyOjpWaWRlb0ZyYW1lOwotdXNpbmcgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xOwotdXNpbmcgc3RkOjpwbGFjZWhvbGRlcnM6Ol8yOwotCi0vLyBMaW1pdCB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBvdXRwdXQgc2FtcGxlcyB0byBjb250cm9sIG1lbW9yeSB1c2FnZS4KLS8vIE5PVEU6IEhpZ2hlciBudW1iZXJzIG1heSByZXN1bHQgaW4gaW5jcmVhc2VkIGRyb3BwZWQgZnJhbWVzIHdoZW4gdGhlIHZpZGVvCi0vLyByZXNvbHV0aW9uIGNoYW5nZXMgZHVyaW5nIHBsYXliYWNrIChpZiB0aGUgZGVjb2RlciBpcyBub3QgZm9yY2VkIHRvIHVzZQotLy8gbWF4IHJlc29sdXRpb24gcmVzb3VyY2VzKS4KLWNvbnN0IGludCBrTWF4T3V0cHV0U2FtcGxlcyA9IDEwOwotCi0vLyBUaHJvdHRsZSB0aGUgbnVtYmVyIG9mIHF1ZXVlZCBpbnB1dHMgdG8gY29udHJvbCBtZW1vcnkgdXNhZ2UuCi1jb25zdCBpbnQga01heElucHV0U2FtcGxlcyA9IDE1OwotCi0vLyBQcmltZSB0aGUgVlA5IGRlY29kZXIgZm9yIGEgY2VydGFpbiBudW1iZXIgb2Ygb3V0cHV0IGZyYW1lcyB0byByZWR1Y2UKLS8vIGhpdGNoaW5nIGF0IHRoZSBzdGFydCBvZiBwbGF5YmFjay4KLWNvbnN0IGludCBrVnA5UHJpbWluZ0ZyYW1lQ291bnQgPSAxMDsKLQotLy8gRGVjb2RlIHRhcmdldHMgYXJlIGNhY2hlZCBmb3IgcmV1c2UuIEVuc3VyZSB0aGUgY2FjaGUgc2l6ZSBpcyBsYXJnZSBlbm91Z2gKLS8vIHRvIGFjY29tbW9kYXRlIHRoZSBkZXB0aCBvZiB0aGUgcHJlc2VudGF0aW9uIHN3YXAgY2hhaW4sIG90aGVyd2lzZSB0aGUKLS8vIHZpZGVvIHRleHR1cmVzIG1heSBiZSB1cGRhdGVkIGJlZm9yZSBvciB3aGlsZSB0aGV5IGFyZSBhY3R1YWxseSByZW5kZXJlZC4KLWNvbnN0IGludCBrRGVjb2RlVGFyZ2V0Q2FjaGVTaXplID0gMjsKLQotLy8gQWxsb2NhdGUgZGVjb2RlIHRhcmdldHMgYXQgdGhlIG1heGltdW0gc2l6ZSB0byBhbGxvdyB0aGVtIHRvIGJlIHJldXNlZCBmb3IKLS8vIGFsbCByZXNvbHV0aW9ucy4gVGhpcyBtaW5pbWl6ZXMgaGl0Y2hpbmcgZHVyaW5nIHJlc29sdXRpb24gY2hhbmdlcy4KLSNpZmRlZiBFTkFCTEVfVlA5XzhLX1NVUFBPUlQKLWNvbnN0IGludCBrTWF4RGVjb2RlVGFyZ2V0V2lkdGggPSA3NjgwOwotY29uc3QgaW50IGtNYXhEZWNvZGVUYXJnZXRIZWlnaHQgPSA0MzIwOwotI2Vsc2UgIC8vIEVOQUJMRV9WUDlfOEtfU1VQUE9SVAotY29uc3QgaW50IGtNYXhEZWNvZGVUYXJnZXRXaWR0aCA9IDM4NDA7Ci1jb25zdCBpbnQga01heERlY29kZVRhcmdldEhlaWdodCA9IDIxNjA7Ci0jZW5kaWYgIC8vIEVOQUJMRV9WUDlfOEtfU1VQUE9SCi0KLS8vIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gZmFjaWxpdGF0ZSBjcmVhdGlvbiBvZiBkZWNvZGUgdGFyZ2V0cyBpbiB0aGUKLS8vIGFwcHJvcHJpYXRlIGdyYXBoaWNzIGNvbnRleHQuCi1zdHJ1Y3QgQ3JlYXRlRGVjb2RlVGFyZ2V0Q29udGV4dCB7Ci0gIFZpZGVvRGVjb2RlciogdmlkZW9fZGVjb2RlcjsKLSAgU2JEZWNvZGVUYXJnZXQgb3V0X2RlY29kZV90YXJnZXQ7Ci19OwotCi1zY29wZWRfcHRyPE1lZGlhVHJhbnNmb3JtPiBDcmVhdGVWaWRlb1RyYW5zZm9ybShjb25zdCBHVUlEJiBkZWNvZGVyX2d1aWQsCi0gICAgY29uc3QgR1VJRCYgaW5wdXRfZ3VpZCwgY29uc3QgR1VJRCYgb3V0cHV0X2d1aWQsCi0gICAgY29uc3QgSU1GRFhHSURldmljZU1hbmFnZXIqIGRldmljZV9tYW5hZ2VyKSB7Ci0gIHNjb3BlZF9wdHI8TWVkaWFUcmFuc2Zvcm0+IG1lZGlhX3RyYW5zZm9ybShuZXcgTWVkaWFUcmFuc2Zvcm0oZGVjb2Rlcl9ndWlkKSk7Ci0KLSAgbWVkaWFfdHJhbnNmb3JtLT5FbmFibGVJbnB1dFRocm90dGxlKHRydWUpOwotICBtZWRpYV90cmFuc2Zvcm0tPlNlbmRNZXNzYWdlKE1GVF9NRVNTQUdFX1NFVF9EM0RfTUFOQUdFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTE9OR19QVFIoZGV2aWNlX21hbmFnZXIpKTsKLQotICAvLyBUZWxsIHRoZSBkZWNvZGVyIHRvIGFsbG9jYXRlIHJlc291cmNlcyBmb3IgdGhlIG1heGltdW0gcmVzb2x1dGlvbiBpbgotICAvLyBvcmRlciB0byBtaW5pbWl6ZSBoaXRjaGluZyBvbiByZXNvbHV0aW9uIGNoYW5nZXMuCi0gIENvbVB0cjxJTUZBdHRyaWJ1dGVzPiBhdHRyaWJ1dGVzID0gbWVkaWFfdHJhbnNmb3JtLT5HZXRBdHRyaWJ1dGVzKCk7Ci0gIENoZWNrUmVzdWx0KGF0dHJpYnV0ZXMtPlNldFVJTlQzMihNRl9NVF9ERUNPREVSX1VTRV9NQVhfUkVTT0xVVElPTiwgMSkpOwotCi0gIENvbVB0cjxJTUZNZWRpYVR5cGU+IGlucHV0X3R5cGU7Ci0gIENoZWNrUmVzdWx0KE1GQ3JlYXRlTWVkaWFUeXBlKCZpbnB1dF90eXBlKSk7Ci0gIENoZWNrUmVzdWx0KGlucHV0X3R5cGUtPlNldEdVSUQoTUZfTVRfTUFKT1JfVFlQRSwgTUZNZWRpYVR5cGVfVmlkZW8pKTsKLSAgQ2hlY2tSZXN1bHQoaW5wdXRfdHlwZS0+U2V0R1VJRChNRl9NVF9TVUJUWVBFLCBpbnB1dF9ndWlkKSk7Ci0gIENoZWNrUmVzdWx0KGlucHV0X3R5cGUtPlNldFVJTlQzMihNRl9NVF9JTlRFUkxBQ0VfTU9ERSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1GVmlkZW9JbnRlcmxhY2VfUHJvZ3Jlc3NpdmUpKTsKLSAgaWYgKGlucHV0X2d1aWQgPT0gTUZWaWRlb0Zvcm1hdF9WUDkwKSB7Ci0gICAgLy8gU2V0IHRoZSBleHBlY3RlZCB2aWRlbyByZXNvbHV0aW9uLiBTZXR0aW5nIHRoZSBwcm9wZXIgcmVzb2x1dGlvbiBjYW4KLSAgICAvLyBtaXRpZ2F0ZSBhIGZvcm1hdCBjaGFuZ2UsIGJ1dCB0aGUgZGVjb2RlciB3aWxsIGFkanVzdCB0byB0aGUgcmVhbAotICAgIC8vIHJlc29sdXRpb24gcmVnYXJkbGVzcy4KLSAgICBDaGVja1Jlc3VsdChNRlNldEF0dHJpYnV0ZVNpemUoaW5wdXRfdHlwZS5HZXQoKSwgTUZfTVRfRlJBTUVfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga01heERlY29kZVRhcmdldFdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrTWF4RGVjb2RlVGFyZ2V0SGVpZ2h0KSk7Ci0gIH0KLSAgbWVkaWFfdHJhbnNmb3JtLT5TZXRJbnB1dFR5cGUoaW5wdXRfdHlwZSk7Ci0KLSAgbWVkaWFfdHJhbnNmb3JtLT5TZXRPdXRwdXRUeXBlQnlTdWJUeXBlKG91dHB1dF9ndWlkKTsKLQotICByZXR1cm4gbWVkaWFfdHJhbnNmb3JtLlBhc3MoKTsKLX0KLQotY2xhc3MgVmlkZW9GcmFtZUltcGwgOiBwdWJsaWMgVmlkZW9GcmFtZSB7Ci0gcHVibGljOgotICBWaWRlb0ZyYW1lSW1wbChTYlRpbWUgdGltZXN0YW1wLCBzdGQ6OmZ1bmN0aW9uPHZvaWQoVmlkZW9GcmFtZSopPiByZWxlYXNlX2NiKQotICAgICAgOiBWaWRlb0ZyYW1lKHRpbWVzdGFtcCksIHJlbGVhc2VfY2JfKHJlbGVhc2VfY2IpIHsKLSAgICBTQl9EQ0hFQ0socmVsZWFzZV9jYl8pOwotICB9Ci0gIH5WaWRlb0ZyYW1lSW1wbCgpIHsgcmVsZWFzZV9jYl8odGhpcyk7IH0KLQotIHByaXZhdGU6Ci0gIHN0ZDo6ZnVuY3Rpb248dm9pZChWaWRlb0ZyYW1lKik+IHJlbGVhc2VfY2JfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlCi0KLWNsYXNzIFZpZGVvRGVjb2Rlcjo6U2luayA6IHB1YmxpYyBWaWRlb0RlY29kZXI6OlZpZGVvUmVuZGVyZXJTaW5rIHsKLSBwdWJsaWM6Ci0gIHZvaWQgUmVuZGVyKCkgewotICAgIFNCX0RDSEVDSyhyZW5kZXJfY2JfKTsKLQotICAgIHJlbmRlcl9jYl8oc3RkOjpiaW5kKCZTaW5rOjpEcmF3RnJhbWUsIHRoaXMsIF8xLCBfMikpOwotICB9Ci0KLSBwcml2YXRlOgotICB2b2lkIFNldFJlbmRlckNCKFJlbmRlckNCIHJlbmRlcl9jYikgb3ZlcnJpZGUgewotICAgIFNCX0RDSEVDSyghcmVuZGVyX2NiXyk7Ci0gICAgU0JfRENIRUNLKHJlbmRlcl9jYik7Ci0KLSAgICByZW5kZXJfY2JfID0gcmVuZGVyX2NiOwotICB9Ci0KLSAgdm9pZCBTZXRCb3VuZHMoaW50IHpfaW5kZXgsIGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSBvdmVycmlkZSB7Ci0gICAgU0JfVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUih6X2luZGV4KTsKLSAgICBTQl9VTlJFRkVSRU5DRURfUEFSQU1FVEVSKHgpOwotICAgIFNCX1VOUkVGRVJFTkNFRF9QQVJBTUVURVIoeSk7Ci0gICAgU0JfVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUih3aWR0aCk7Ci0gICAgU0JfVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUihoZWlnaHQpOwotICB9Ci0KLSAgRHJhd0ZyYW1lU3RhdHVzIERyYXdGcmFtZShjb25zdCBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+JiBmcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHJlbGVhc2VfdGltZV9pbl9uYW5vc2Vjb25kcykgewotICAgIFNCX1VOUkVGRVJFTkNFRF9QQVJBTUVURVIoZnJhbWUpOwotICAgIFNCX0RDSEVDSyhyZWxlYXNlX3RpbWVfaW5fbmFub3NlY29uZHMgPT0gMCk7Ci0KLSAgICByZXR1cm4ga05vdFJlbGVhc2VkOwotICB9Ci0KLSAgUmVuZGVyQ0IgcmVuZGVyX2NiXzsKLX07Ci0KLVZpZGVvRGVjb2Rlcjo6VmlkZW9EZWNvZGVyKAotICAgIFNiTWVkaWFWaWRlb0NvZGVjIHZpZGVvX2NvZGVjLAotICAgIFNiUGxheWVyT3V0cHV0TW9kZSBvdXRwdXRfbW9kZSwKLSAgICBTYkRlY29kZVRhcmdldEdyYXBoaWNzQ29udGV4dFByb3ZpZGVyKiBncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyLAotICAgIFNiRHJtU3lzdGVtIGRybV9zeXN0ZW0pCi0gICAgOiB2aWRlb19jb2RlY18odmlkZW9fY29kZWMpLAotICAgICAgZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcl8oZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlciksCi0gICAgICBkcm1fc3lzdGVtXyhkcm1fc3lzdGVtKSwKLSAgICAgIGRlY29kZXJfdGhyZWFkXyhrU2JUaHJlYWRJbnZhbGlkKSwKLSAgICAgIGRlY29kZXJfdGhyZWFkX3N0b3BfcmVxdWVzdGVkXyhmYWxzZSksCi0gICAgICBkZWNvZGVyX3RocmVhZF9zdG9wcGVkXyhmYWxzZSksCi0gICAgICBjdXJyZW50X2RlY29kZV90YXJnZXRfKGtTYkRlY29kZVRhcmdldEludmFsaWQpIHsKLSAgU0JfRENIRUNLKG91dHB1dF9tb2RlID09IGtTYlBsYXllck91dHB1dE1vZGVEZWNvZGVUb1RleHR1cmUpOwotCi0gIEhhcmR3YXJlRGVjb2RlckNvbnRleHQgaGFyZHdhcmVfY29udGV4dCA9IEdldERpcmVjdFhGb3JIYXJkd2FyZURlY29kaW5nKCk7Ci0gIGQzZF9kZXZpY2VfID0gaGFyZHdhcmVfY29udGV4dC5keF9kZXZpY2Vfb3V0OwotICBkZXZpY2VfbWFuYWdlcl8gPSBoYXJkd2FyZV9jb250ZXh0LmR4Z2lfZGV2aWNlX21hbmFnZXJfb3V0OwotICBDaGVja1Jlc3VsdChkM2RfZGV2aWNlXy5BcygmdmlkZW9fZGV2aWNlXykpOwotCi0gIENvbVB0cjxJRDNEMTFEZXZpY2VDb250ZXh0PiBkM2RfY29udGV4dDsKLSAgZDNkX2RldmljZV8tPkdldEltbWVkaWF0ZUNvbnRleHQoZDNkX2NvbnRleHQuR2V0QWRkcmVzc09mKCkpOwotICBDaGVja1Jlc3VsdChkM2RfY29udGV4dC5BcygmdmlkZW9fY29udGV4dF8pKTsKLX0KLQotVmlkZW9EZWNvZGVyOjp+VmlkZW9EZWNvZGVyKCkgewotICBTQl9EQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7Ci0gIFJlc2V0KCk7Ci0gIFNodXRkb3duQ29kZWMoKTsKLX0KLQotc2NvcGVkX3JlZnB0cjxWaWRlb0RlY29kZXI6OlZpZGVvUmVuZGVyZXJTaW5rPiBWaWRlb0RlY29kZXI6OkdldFNpbmsoKSB7Ci0gIGlmIChzaW5rXyA9PSBOVUxMKSB7Ci0gICAgc2lua18gPSBuZXcgU2luazsKLSAgfQotICByZXR1cm4gc2lua187Ci19Ci0KLXNpemVfdCBWaWRlb0RlY29kZXI6OkdldFByZXJvbGxGcmFtZUNvdW50KCkgY29uc3QgewotICByZXR1cm4ga01heE91dHB1dFNhbXBsZXM7Ci19Ci0KLXNpemVfdCBWaWRlb0RlY29kZXI6OkdldE1heE51bWJlck9mQ2FjaGVkRnJhbWVzKCkgY29uc3QgewotICByZXR1cm4ga01heE91dHB1dFNhbXBsZXM7Ci19Ci0KLXZvaWQgVmlkZW9EZWNvZGVyOjpJbml0aWFsaXplKGNvbnN0IERlY29kZXJTdGF0dXNDQiYgZGVjb2Rlcl9zdGF0dXNfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFcnJvckNCJiBlcnJvcl9jYikgewotICBTQl9EQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7Ci0gIFNCX0RDSEVDSyghZGVjb2Rlcl9zdGF0dXNfY2JfKTsKLSAgU0JfRENIRUNLKGRlY29kZXJfc3RhdHVzX2NiKTsKLSAgU0JfRENIRUNLKCFlcnJvcl9jYl8pOwotICBTQl9EQ0hFQ0soZXJyb3JfY2IpOwotICBkZWNvZGVyX3N0YXR1c19jYl8gPSBkZWNvZGVyX3N0YXR1c19jYjsKLSAgZXJyb3JfY2JfID0gZXJyb3JfY2I7Ci0gIEluaXRpYWxpemVDb2RlYygpOwotfQotCi12b2lkIFZpZGVvRGVjb2Rlcjo6V3JpdGVJbnB1dEJ1ZmZlcigKLSAgICBjb25zdCBzY29wZWRfcmVmcHRyPElucHV0QnVmZmVyPiYgaW5wdXRfYnVmZmVyKSB7Ci0gIFNCX0RDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKLSAgU0JfRENIRUNLKGlucHV0X2J1ZmZlcik7Ci0gIFNCX0RDSEVDSyhkZWNvZGVyX3N0YXR1c19jYl8pOwotICBFbnN1cmVEZWNvZGVyVGhyZWFkUnVubmluZygpOwotCi0gIFNjb3BlZExvY2sgbG9jayh0aHJlYWRfbG9ja18pOwotICB0aHJlYWRfZXZlbnRzXy5lbXBsYWNlX2JhY2soCi0gICAgICBuZXcgRXZlbnR7IEV2ZW50OjprV3JpdGVJbnB1dEJ1ZmZlciwgaW5wdXRfYnVmZmVyIH0pOwotfQotCi12b2lkIFZpZGVvRGVjb2Rlcjo6V3JpdGVFbmRPZlN0cmVhbSgpIHsKLSAgU0JfRENIRUNLKHRocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOwotICBTQl9EQ0hFQ0soZGVjb2Rlcl9zdGF0dXNfY2JfKTsKLSAgRW5zdXJlRGVjb2RlclRocmVhZFJ1bm5pbmcoKTsKLQotICBTY29wZWRMb2NrIGxvY2sodGhyZWFkX2xvY2tfKTsKLSAgdGhyZWFkX2V2ZW50c18uZW1wbGFjZV9iYWNrKG5ldyBFdmVudHsgRXZlbnQ6OmtXcml0ZUVuZE9mU3RyZWFtIH0pOwotfQotCi12b2lkIFZpZGVvRGVjb2Rlcjo6UmVzZXQoKSB7Ci0gIFNCX0RDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKLSAgU3RvcERlY29kZXJUaHJlYWQoKTsKLQotICAvLyBNYWtlIHN1cmUgYWxsIG91dHB1dCBzYW1wbGVzIGhhdmUgYmVlbiByZWxlYXNlZCBiZWZvcmUgZmx1c2hpbmcgdGhlCi0gIC8vIGRlY29kZXIuIEJlIHN1cmUgdG8gQWNxdWlyZSB0aGUgbXV0ZXhlcyBpbiB0aGUgc2FtZSBvcmRlciBhcwotICAvLyBDcmVhdGVEZWNvZGVUYXJnZXQgdG8gYXZvaWQgcG9zc2libGUgZGVhZGxvY2suCi0gIG91dHB1dHNfcmVzZXRfbG9ja18uQWNxdWlyZSgpOwotICB0aHJlYWRfbG9ja18uQWNxdWlyZSgpOwotICB0aHJlYWRfb3V0cHV0c18uY2xlYXIoKTsKLSAgdGhyZWFkX2xvY2tfLlJlbGVhc2UoKTsKLSAgb3V0cHV0c19yZXNldF9sb2NrXy5SZWxlYXNlKCk7Ci0KLSAgZGVjb2Rlcl9zdGF0dXNfY2JfKGtSZWxlYXNlQWxsRnJhbWVzLCBudWxscHRyKTsKLSAgZGVjb2Rlcl8tPlJlc2V0KCk7Ci19Ci0KLVNiRGVjb2RlVGFyZ2V0IFZpZGVvRGVjb2Rlcjo6R2V0Q3VycmVudERlY29kZVRhcmdldCgpIHsKLSAgU0JfRENIRUNLKHNpbmtfKTsKLQotICBzaW5rXy0+UmVuZGVyKCk7Ci0KLSAgLy8gRW5zdXJlIHRoZSBkZWNvZGUgdGFyZ2V0IGlzIGNyZWF0ZWQgb24gdGhlIHJlbmRlciB0aHJlYWQuCi0gIENyZWF0ZURlY29kZVRhcmdldENvbnRleHQgZGVjb2RlX3RhcmdldF9jb250ZXh0ID0geyB0aGlzIH07Ci0gIGdyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXJfLT5nbGVzX2NvbnRleHRfcnVubmVyKGdyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXJfLAotICAgICAgJlZpZGVvRGVjb2Rlcjo6Q3JlYXRlRGVjb2RlVGFyZ2V0SGVscGVyLCAmZGVjb2RlX3RhcmdldF9jb250ZXh0KTsKLQotICBTY29wZWRMb2NrIGxvY2soZGVjb2RlX3RhcmdldF9sb2NrXyk7Ci0gIGlmIChTYkRlY29kZVRhcmdldElzVmFsaWQoZGVjb2RlX3RhcmdldF9jb250ZXh0Lm91dF9kZWNvZGVfdGFyZ2V0KSkgewotICAgIGlmIChTYkRlY29kZVRhcmdldElzVmFsaWQoY3VycmVudF9kZWNvZGVfdGFyZ2V0XykpIHsKLSAgICAgIHByZXZfZGVjb2RlX3RhcmdldHNfLmVtcGxhY2VfYmFjayhjdXJyZW50X2RlY29kZV90YXJnZXRfKTsKLSAgICB9Ci0gICAgY3VycmVudF9kZWNvZGVfdGFyZ2V0XyA9IGRlY29kZV90YXJnZXRfY29udGV4dC5vdXRfZGVjb2RlX3RhcmdldDsKLSAgfQotICBpZiAoU2JEZWNvZGVUYXJnZXRJc1ZhbGlkKGN1cnJlbnRfZGVjb2RlX3RhcmdldF8pKSB7Ci0gICAgLy8gQWRkIGEgcmVmZXJlbmNlIGZvciB0aGUgY2FsbGVyLgotICAgIGN1cnJlbnRfZGVjb2RlX3RhcmdldF8tPkFkZFJlZigpOwotICB9Ci0gIHJldHVybiBjdXJyZW50X2RlY29kZV90YXJnZXRfOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgVmlkZW9EZWNvZGVyOjpDcmVhdGVEZWNvZGVUYXJnZXRIZWxwZXIodm9pZCogY29udGV4dCkgewotICBDcmVhdGVEZWNvZGVUYXJnZXRDb250ZXh0KiB0YXJnZXRfY29udGV4dCA9Ci0gICAgICBzdGF0aWNfY2FzdDxDcmVhdGVEZWNvZGVUYXJnZXRDb250ZXh0Kj4oY29udGV4dCk7Ci0gIHRhcmdldF9jb250ZXh0LT5vdXRfZGVjb2RlX3RhcmdldCA9Ci0gICAgICB0YXJnZXRfY29udGV4dC0+dmlkZW9fZGVjb2Rlci0+Q3JlYXRlRGVjb2RlVGFyZ2V0KCk7Ci19Ci0KLVNiRGVjb2RlVGFyZ2V0IFZpZGVvRGVjb2Rlcjo6Q3JlYXRlRGVjb2RlVGFyZ2V0KCkgewotICBSRUNUIHZpZGVvX2FyZWE7Ci0gIENvbVB0cjxJTUZTYW1wbGU+IHZpZGVvX3NhbXBsZTsKLQotICAvLyBEb24ndCBhbGxvdyBhIGRlY29kZXIgcmVzZXQgKGZsdXNoKSB3aGlsZSBhbiBJTUZTYW1wbGUgaXMKLSAgLy8gYWxpdmUuIEhvd2V2ZXIsIHRoZSBkZWNvZGVyIHRocmVhZCBzaG91bGQgYmUgYWxsb3dlZCB0byBjb250aW51ZQotICAvLyB3aGlsZSB0aGUgU2JEZWNvZGVUYXJnZXQgaXMgYmVpbmcgY3JlYXRlZC4KLSAgU2NvcGVkTG9jayByZXNldF9sb2NrKG91dHB1dHNfcmVzZXRfbG9ja18pOwotCi0gIC8vIFVzZSB0aGUgb2xkZXN0IG91dHB1dC4KLSAgdGhyZWFkX2xvY2tfLkFjcXVpcmUoKTsKLSAgaWYgKCF0aHJlYWRfb3V0cHV0c18uZW1wdHkoKSkgewotICAgIC8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCByZW1vdmUgb3V0cHV0IGZyYW1lcy4gSG93ZXZlciwgaXQncyBwb3NzaWJsZQotICAgIC8vIGZvciB0aGUgc2FtZSBmcmFtZSB0byBiZSByZXF1ZXN0ZWQgbXVsdGlwbGUgdGltZXMuIFRvIGF2b2lkIHJlLWNyZWF0aW5nCi0gICAgLy8gU2JEZWNvZGVUYXJnZXRzLCByZWxlYXNlIHRoZSB2aWRlb19zYW1wbGUgb25jZSBpdCBpcyB1c2VkIHRvIGNyZWF0ZQotICAgIC8vIGFuIG91dHB1dCBmcmFtZS4gVGhlIG5leHQgY2FsbCB0byBDcmVhdGVEZWNvZGVUYXJnZXQgZm9yIHRoZSBzYW1lIGZyYW1lCi0gICAgLy8gd2lsbCByZXR1cm4ga1NiRGVjb2RlVGFyZ2V0SW52YWxpZCwgYW5kIHxjdXJyZW50X2RlY29kZV90YXJnZXRffCB3aWxsCi0gICAgLy8gYmUgcmV1c2VkLgotICAgIE91dHB1dCYgb3V0cHV0ID0gdGhyZWFkX291dHB1dHNfLmZyb250KCk7Ci0gICAgdmlkZW9fYXJlYSA9IG91dHB1dC52aWRlb19hcmVhOwotICAgIHZpZGVvX3NhbXBsZS5Td2FwKG91dHB1dC52aWRlb19zYW1wbGUpOwotICB9Ci0gIHRocmVhZF9sb2NrXy5SZWxlYXNlKCk7Ci0KLSAgU2JEZWNvZGVUYXJnZXQgZGVjb2RlX3RhcmdldCA9IGtTYkRlY29kZVRhcmdldEludmFsaWQ7Ci0gIGlmICh2aWRlb19zYW1wbGUgIT0gbnVsbHB0cikgewotICAgIFNjb3BlZExvY2sgdGFyZ2V0X2xvY2soZGVjb2RlX3RhcmdldF9sb2NrXyk7Ci0KLSAgICAvLyBUcnkgcmV1c2luZyB0aGUgcHJldmlvdXMgZGVjb2RlIHRhcmdldCB0byBhdm9pZCB0aGUgcGVyZm9ybWFuY2UgaGl0IG9mCi0gICAgLy8gY3JlYXRpbmcgYSBuZXcgdGV4dHVyZS4KLSAgICBTQl9EQ0hFQ0socHJldl9kZWNvZGVfdGFyZ2V0c18uc2l6ZSgpIDw9IGtEZWNvZGVUYXJnZXRDYWNoZVNpemUgKyAxKTsKLSAgICBpZiAocHJldl9kZWNvZGVfdGFyZ2V0c18uc2l6ZSgpID49IGtEZWNvZGVUYXJnZXRDYWNoZVNpemUpIHsKLSAgICAgIGRlY29kZV90YXJnZXQgPSBwcmV2X2RlY29kZV90YXJnZXRzXy5mcm9udCgpOwotICAgICAgcHJldl9kZWNvZGVfdGFyZ2V0c18ucG9wX2Zyb250KCk7Ci0gICAgICBpZiAoIWRlY29kZV90YXJnZXQtPlVwZGF0ZShkM2RfZGV2aWNlXywgdmlkZW9fZGV2aWNlXywgdmlkZW9fY29udGV4dF8sCi0gICAgICAgICAgICAgIHZpZGVvX2VudW1lcmF0b3JfLCB2aWRlb19wcm9jZXNzb3JfLCB2aWRlb19zYW1wbGUsIHZpZGVvX2FyZWEpKSB7Ci0gICAgICAgIC8vIFRoZSBjYWNoZWQgZGVjb2RlIHRhcmdldCB3YXMgbm90IGNvbXBhdGlibGU7IGp1c3QgcmVsZWFzZSBpdC4KLSAgICAgICAgU2JEZWNvZGVUYXJnZXRSZWxlYXNlKGRlY29kZV90YXJnZXQpOwotICAgICAgICBkZWNvZGVfdGFyZ2V0ID0ga1NiRGVjb2RlVGFyZ2V0SW52YWxpZDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIVNiRGVjb2RlVGFyZ2V0SXNWYWxpZChkZWNvZGVfdGFyZ2V0KSkgewotICAgICAgZGVjb2RlX3RhcmdldCA9IG5ldyBTYkRlY29kZVRhcmdldFByaXZhdGUoZDNkX2RldmljZV8sIHZpZGVvX2RldmljZV8sCi0gICAgICAgICAgdmlkZW9fY29udGV4dF8sIHZpZGVvX2VudW1lcmF0b3JfLCB2aWRlb19wcm9jZXNzb3JfLAotICAgICAgICAgIHZpZGVvX3NhbXBsZSwgdmlkZW9fYXJlYSk7Ci0gICAgfQotCi0gICAgLy8gUmVsZWFzZSB0aGUgdmlkZW9fc2FtcGxlIGJlZm9yZSByZWxlYXNpbmcgdGhlIHJlc2V0IGxvY2suCi0gICAgdmlkZW9fc2FtcGxlLlJlc2V0KCk7Ci0gIH0KLSAgcmV0dXJuIGRlY29kZV90YXJnZXQ7Ci19Ci0KLXZvaWQgVmlkZW9EZWNvZGVyOjpJbml0aWFsaXplQ29kZWMoKSB7Ci0gIHNjb3BlZF9wdHI8TWVkaWFUcmFuc2Zvcm0+IG1lZGlhX3RyYW5zZm9ybTsKLQotICAvLyBJZiB0aGlzIGlzIHVwZGF0ZWQgdGhlbiBtZWRpYV9pc192aWRlb19zdXBwb3J0ZWQuY2MgYWxzbyBuZWVkcyB0byBiZQotICAvLyB1cGRhdGVkLgotICBzd2l0Y2ggKHZpZGVvX2NvZGVjXykgewotICAgIGNhc2Uga1NiTWVkaWFWaWRlb0NvZGVjSDI2NDogewotICAgICAgbWVkaWFfdHJhbnNmb3JtID0gQ3JlYXRlVmlkZW9UcmFuc2Zvcm0oCi0gICAgICAgICAgQ0xTSURfTVNIMjY0RGVjb2Rlck1GVCwgTUZWaWRlb0Zvcm1hdF9IMjY0LCBNRlZpZGVvRm9ybWF0X05WMTIsCi0gICAgICAgICAgZGV2aWNlX21hbmFnZXJfLkdldCgpKTsKLSAgICAgIHByaW1pbmdfb3V0cHV0X2NvdW50XyA9IDA7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBrU2JNZWRpYVZpZGVvQ29kZWNWcDk6IHsKLSAgICAgIG1lZGlhX3RyYW5zZm9ybSA9IENyZWF0ZVZpZGVvVHJhbnNmb3JtKAotICAgICAgICAgIENMU0lEX01TVlB4RGVjb2RlciwgTUZWaWRlb0Zvcm1hdF9WUDkwLCBNRlZpZGVvRm9ybWF0X05WMTIsCi0gICAgICAgICAgZGV2aWNlX21hbmFnZXJfLkdldCgpKTsKLSAgICAgIHByaW1pbmdfb3V0cHV0X2NvdW50XyA9IGtWcDlQcmltaW5nRnJhbWVDb3VudDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBkZWZhdWx0OiB7IFNCX05PVFJFQUNIRUQoKTsgfQotICB9Ci0KLSAgZGVjb2Rlcl8ucmVzZXQoCi0gICAgICBuZXcgRGVjcnlwdGluZ0RlY29kZXIoInZpZGVvIiwgbWVkaWFfdHJhbnNmb3JtLlBhc3MoKSwgZHJtX3N5c3RlbV8pKTsKLSAgTWVkaWFUcmFuc2Zvcm0qIHRyYW5zZm9ybSA9IGRlY29kZXJfLT5HZXREZWNvZGVyKCk7Ci0KLSAgRFdPUkQgaW5wdXRfc3RyZWFtX2NvdW50ID0gMDsKLSAgRFdPUkQgb3V0cHV0X3N0cmVhbV9jb3VudCA9IDA7Ci0gIHRyYW5zZm9ybS0+R2V0U3RyZWFtQ291bnQoJmlucHV0X3N0cmVhbV9jb3VudCwgJm91dHB1dF9zdHJlYW1fY291bnQpOwotICBTQl9EQ0hFQ0soMSA9PSBpbnB1dF9zdHJlYW1fY291bnQpOwotICBTQl9EQ0hFQ0soMSA9PSBvdXRwdXRfc3RyZWFtX2NvdW50KTsKLQotICBDb21QdHI8SU1GQXR0cmlidXRlcz4gYXR0cmlidXRlcyA9IHRyYW5zZm9ybS0+R2V0QXR0cmlidXRlcygpOwotICBDaGVja1Jlc3VsdChhdHRyaWJ1dGVzLT5TZXRVSU5UMzIoTUZfU0FfTUlOSU1VTV9PVVRQVVRfU0FNUExFX0NPVU5ULAotICAgICAga01heE91dHB1dFNhbXBsZXMpKTsKLQotICBVcGRhdGVWaWRlb0FyZWEodHJhbnNmb3JtLT5HZXRDdXJyZW50T3V0cHV0VHlwZSgpKTsKLQotICAvLyBUaGUgdHJhbnNmb3JtIG11c3Qgb3V0cHV0IHRleHR1cmVzIHRoYXQgYXJlIGJvdW5kIHRvIHNoYWRlciByZXNvdXJjZXMsCi0gIC8vIG9yIHdlIGNhbid0IGRyYXcgdGhlbSBsYXRlciB2aWEgQU5HTEUuCi0gIENvbVB0cjxJTUZBdHRyaWJ1dGVzPiBvdXRwdXRfYXR0cmlidXRlcyA9Ci0gICAgICB0cmFuc2Zvcm0tPkdldE91dHB1dFN0cmVhbUF0dHJpYnV0ZXMoKTsKLSAgQ2hlY2tSZXN1bHQob3V0cHV0X2F0dHJpYnV0ZXMtPlNldFVJTlQzMihNRl9TQV9EM0QxMV9CSU5ERkxBR1MsCi0gICAgICBEM0QxMV9CSU5EX1NIQURFUl9SRVNPVVJDRSB8IEQzRDExX0JJTkRfREVDT0RFUikpOwotCi0gIC8vIFRoZSByZXNvbHV0aW9uIGFuZCBmcmFtZXJhdGUgd2lsbCBhZGp1c3QgdG8gdGhlIGFjdHVhbCBjb250ZW50IGRhdGEuCi0gIEQzRDExX1ZJREVPX1BST0NFU1NPUl9DT05URU5UX0RFU0MgY29udGVudF9kZXNjID0ge307Ci0gIGNvbnRlbnRfZGVzYy5JbnB1dEZyYW1lRm9ybWF0ID0gRDNEMTFfVklERU9fRlJBTUVfRk9STUFUX1BST0dSRVNTSVZFOwotICBjb250ZW50X2Rlc2MuSW5wdXRGcmFtZVJhdGUuTnVtZXJhdG9yID0gNjA7Ci0gIGNvbnRlbnRfZGVzYy5JbnB1dEZyYW1lUmF0ZS5EZW5vbWluYXRvciA9IDE7Ci0gIGNvbnRlbnRfZGVzYy5JbnB1dFdpZHRoID0ga01heERlY29kZVRhcmdldFdpZHRoOwotICBjb250ZW50X2Rlc2MuSW5wdXRIZWlnaHQgPSBrTWF4RGVjb2RlVGFyZ2V0SGVpZ2h0OwotICBjb250ZW50X2Rlc2MuT3V0cHV0RnJhbWVSYXRlLk51bWVyYXRvciA9IDYwOwotICBjb250ZW50X2Rlc2MuT3V0cHV0RnJhbWVSYXRlLkRlbm9taW5hdG9yID0gMTsKLSAgY29udGVudF9kZXNjLk91dHB1dFdpZHRoID0ga01heERlY29kZVRhcmdldFdpZHRoOwotICBjb250ZW50X2Rlc2MuT3V0cHV0SGVpZ2h0ID0ga01heERlY29kZVRhcmdldEhlaWdodDsKLSAgY29udGVudF9kZXNjLlVzYWdlID0gRDNEMTFfVklERU9fVVNBR0VfUExBWUJBQ0tfTk9STUFMOwotICBDaGVja1Jlc3VsdCh2aWRlb19kZXZpY2VfLT5DcmVhdGVWaWRlb1Byb2Nlc3NvckVudW1lcmF0b3IoCi0gICAgICAmY29udGVudF9kZXNjLCB2aWRlb19lbnVtZXJhdG9yXy5HZXRBZGRyZXNzT2YoKSkpOwotICBDaGVja1Jlc3VsdCh2aWRlb19kZXZpY2VfLT5DcmVhdGVWaWRlb1Byb2Nlc3NvcigKLSAgICAgIHZpZGVvX2VudW1lcmF0b3JfLkdldCgpLCAwLCB2aWRlb19wcm9jZXNzb3JfLkdldEFkZHJlc3NPZigpKSk7Ci0gIHZpZGVvX2NvbnRleHRfLT5WaWRlb1Byb2Nlc3NvclNldFN0cmVhbUZyYW1lRm9ybWF0KAotICAgICAgdmlkZW9fcHJvY2Vzc29yXy5HZXQoKSwgTWVkaWFUcmFuc2Zvcm06OmtTdHJlYW1JZCwKLSAgICAgIEQzRDExX1ZJREVPX0ZSQU1FX0ZPUk1BVF9QUk9HUkVTU0lWRSk7Ci0gIHZpZGVvX2NvbnRleHRfLT5WaWRlb1Byb2Nlc3NvclNldFN0cmVhbUF1dG9Qcm9jZXNzaW5nTW9kZSgKLSAgICAgIHZpZGVvX3Byb2Nlc3Nvcl8uR2V0KCksIDAsIGZhbHNlKTsKLX0KLQotdm9pZCBWaWRlb0RlY29kZXI6OlNodXRkb3duQ29kZWMoKSB7Ci0gIFNCX0RDSEVDSyghU2JUaHJlYWRJc1ZhbGlkKGRlY29kZXJfdGhyZWFkXykpOwotICBTQl9EQ0hFQ0sodGhyZWFkX291dHB1dHNfLmVtcHR5KCkpOwotICBTQl9EQ0hFQ0soZGVjb2Rlcl8gIT0gbnVsbHB0cik7Ci0KLSAgLy8gV29yayBhcm91bmQgYSBWUDkgZGVjb2RlciBjcmFzaC4gQWxsIElNRlNhbXBsZXMgYW5kIGFueXRoaW5nIHRoYXQgbWF5Ci0gIC8vIHJlZmVyZW5jZSB0aGVtIGluZGlyZWN0bHkgKHRoZSBkM2QgdGV4dHVyZSBpbiBTYkRlY29kZVRhcmdldCkgbXVzdCBiZQotICAvLyByZWxlYXNlZCBiZWZvcmUgcmVsZWFzaW5nIHRoZSBJTUZUcmFuc2Zvcm0uIERvIHRoaXMgb24gdGhlIHJlbmRlciB0aHJlYWQKLSAgLy8gc2luY2UgZ3JhcGhpY3MgcmVzb3VyY2VzIGFyZSBiZWluZyByZWxlYXNlZC4KLSAgZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcl8tPmdsZXNfY29udGV4dF9ydW5uZXIoZ3JhcGhpY3NfY29udGV4dF9wcm92aWRlcl8sCi0gICAgICAmVmlkZW9EZWNvZGVyOjpSZWxlYXNlRGVjb2RlVGFyZ2V0cywgdGhpcyk7Ci0KLSAgLy8gTWljcm9zb2Z0IHJlY29tbWVuZGVkcyBzdGFsbGluZyB0byBsZXQgb3RoZXIgc3lzdGVtcyByZWxlYXNlIHRoZWlyCi0gIC8vIHJlZmVyZW5jZXMgdG8gdGhlIElNRlNhbXBsZXMuCi0gIGlmICh2aWRlb19jb2RlY18gPT0ga1NiTWVkaWFWaWRlb0NvZGVjVnA5KSB7Ci0gICAgU2JUaHJlYWRTbGVlcCgxNTAgKiBrU2JUaW1lTWlsbGlzZWNvbmQpOwotICB9Ci0gIGRlY29kZXJfLnJlc2V0KCk7Ci0gIHZpZGVvX3Byb2Nlc3Nvcl8uUmVzZXQoKTsKLSAgdmlkZW9fZW51bWVyYXRvcl8uUmVzZXQoKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIFZpZGVvRGVjb2Rlcjo6UmVsZWFzZURlY29kZVRhcmdldHModm9pZCogY29udGV4dCkgewotICBWaWRlb0RlY29kZXIqIHRoaXNfcHRyID0gc3RhdGljX2Nhc3Q8VmlkZW9EZWNvZGVyKj4oY29udGV4dCk7Ci0KLSAgU2NvcGVkTG9jayBsb2NrKHRoaXNfcHRyLT5kZWNvZGVfdGFyZ2V0X2xvY2tfKTsKLSAgd2hpbGUgKCF0aGlzX3B0ci0+cHJldl9kZWNvZGVfdGFyZ2V0c18uZW1wdHkoKSkgewotICAgIFNiRGVjb2RlVGFyZ2V0UmVsZWFzZSh0aGlzX3B0ci0+cHJldl9kZWNvZGVfdGFyZ2V0c18uZnJvbnQoKSk7Ci0gICAgdGhpc19wdHItPnByZXZfZGVjb2RlX3RhcmdldHNfLnBvcF9mcm9udCgpOwotICB9Ci0gIGlmIChTYkRlY29kZVRhcmdldElzVmFsaWQodGhpc19wdHItPmN1cnJlbnRfZGVjb2RlX3RhcmdldF8pKSB7Ci0gICAgU2JEZWNvZGVUYXJnZXRSZWxlYXNlKHRoaXNfcHRyLT5jdXJyZW50X2RlY29kZV90YXJnZXRfKTsKLSAgICB0aGlzX3B0ci0+Y3VycmVudF9kZWNvZGVfdGFyZ2V0XyA9IGtTYkRlY29kZVRhcmdldEludmFsaWQ7Ci0gIH0KLX0KLQotdm9pZCBWaWRlb0RlY29kZXI6OkVuc3VyZURlY29kZXJUaHJlYWRSdW5uaW5nKCkgewotICBTQl9EQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7Ci0KLSAgLy8gTk9URTogVGhlIHZpZGVvIGRlY29kZXIgdGhyZWFkIHdpbGwgZXhpdCBhZnRlciBwcm9jZXNzaW5nIHRoZQotICAvLyBrV3JpdGVFbmRPZlN0cmVhbSBldmVudC4gSW4gdGhpcyBjYXNlLCBSZXNldCBtdXN0IGJlIGNhbGxlZCAod2hpY2ggd2lsbAotICAvLyB0aGVuIFN0b3BEZWNvZGVyVGhyZWFkKSBiZWZvcmUgV3JpdGVJbnB1dEJ1ZmZlciBvciBXcml0ZUVuZE9mU3RyZWFtIGFnYWluLgotICBTQl9EQ0hFQ0soIWRlY29kZXJfdGhyZWFkX3N0b3BwZWRfKTsKLQotICBpZiAoIVNiVGhyZWFkSXNWYWxpZChkZWNvZGVyX3RocmVhZF8pKSB7Ci0gICAgU0JfRENIRUNLKGRlY29kZXJfICE9IG51bGxwdHIpOwotICAgIFNCX0RDSEVDSyh0aHJlYWRfZXZlbnRzXy5lbXB0eSgpKTsKLSAgICBkZWNvZGVyX3RocmVhZF9zdG9wX3JlcXVlc3RlZF8gPSBmYWxzZTsKLSAgICBkZWNvZGVyX3RocmVhZF8gPQotICAgICAgICBTYlRocmVhZENyZWF0ZSgwLCBrU2JUaHJlYWRQcmlvcml0eUhpZ2gsIGtTYlRocmVhZE5vQWZmaW5pdHksIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICJWaWRlb0RlY29kZXIiLCAmVmlkZW9EZWNvZGVyOjpEZWNvZGVyVGhyZWFkRW50cnksIHRoaXMpOwotICAgIFNCX0RDSEVDSyhTYlRocmVhZElzVmFsaWQoZGVjb2Rlcl90aHJlYWRfKSk7Ci0gIH0KLX0KLQotdm9pZCBWaWRlb0RlY29kZXI6OlN0b3BEZWNvZGVyVGhyZWFkKCkgewotICBTQl9EQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7Ci0gIGlmIChTYlRocmVhZElzVmFsaWQoZGVjb2Rlcl90aHJlYWRfKSkgewotICAgIGRlY29kZXJfdGhyZWFkX3N0b3BfcmVxdWVzdGVkXyA9IHRydWU7Ci0gICAgU2JUaHJlYWRKb2luKGRlY29kZXJfdGhyZWFkXywgbnVsbHB0cik7Ci0gICAgU0JfRENIRUNLKGRlY29kZXJfdGhyZWFkX3N0b3BwZWRfKTsKLSAgICBkZWNvZGVyX3RocmVhZF9zdG9wcGVkXyA9IGZhbHNlOwotICAgIGRlY29kZXJfdGhyZWFkXyA9IGtTYlRocmVhZEludmFsaWQ7Ci0gIH0KLSAgdGhyZWFkX2V2ZW50c18uY2xlYXIoKTsKLX0KLQotdm9pZCBWaWRlb0RlY29kZXI6OlVwZGF0ZVZpZGVvQXJlYShjb25zdCBDb21QdHI8SU1GTWVkaWFUeXBlPiYgbWVkaWEpIHsKLSAgTUZWaWRlb0FyZWEgdmlkZW9fYXJlYTsKLSAgSFJFU1VMVCBociA9IG1lZGlhLT5HZXRCbG9iKE1GX01UX01JTklNVU1fRElTUExBWV9BUEVSVFVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8VUlOVDgqPigmdmlkZW9fYXJlYSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodmlkZW9fYXJlYSksIG51bGxwdHIpOwotICBpZiAoU1VDQ0VFREVEKGhyKSkgewotICAgIHZpZGVvX2FyZWFfLmxlZnQgPSB2aWRlb19hcmVhLk9mZnNldFgudmFsdWU7Ci0gICAgdmlkZW9fYXJlYV8udG9wID0gdmlkZW9fYXJlYS5PZmZzZXRZLnZhbHVlOwotICAgIHZpZGVvX2FyZWFfLnJpZ2h0ID0gdmlkZW9fYXJlYV8ubGVmdCArIHZpZGVvX2FyZWEuQXJlYS5jeDsKLSAgICB2aWRlb19hcmVhXy5ib3R0b20gPSB2aWRlb19hcmVhXy50b3AgKyB2aWRlb19hcmVhLkFyZWEuY3k7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgVUlOVDMyIHdpZHRoOwotICBVSU5UMzIgaGVpZ2h0OwotICBociA9IE1GR2V0QXR0cmlidXRlU2l6ZShtZWRpYS5HZXQoKSwgTUZfTVRfRlJBTUVfU0laRSwgJndpZHRoLCAmaGVpZ2h0KTsKLSAgaWYgKFNVQ0NFRURFRChocikpIHsKLSAgICB2aWRlb19hcmVhXy5sZWZ0ID0gMDsKLSAgICB2aWRlb19hcmVhXy50b3AgPSAwOwotICAgIHZpZGVvX2FyZWFfLnJpZ2h0ID0gd2lkdGg7Ci0gICAgdmlkZW9fYXJlYV8uYm90dG9tID0gaGVpZ2h0OwotICAgIHJldHVybjsKLSAgfQotCi0gIFNCX05PVFJFQUNIRUQoKSA8PCAiQ291bGQgbm90IGRldGVybWluZSBuZXcgdmlkZW8gb3V0cHV0IHJlc29sdXRpb24iOwotfQotCi1zY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+IFZpZGVvRGVjb2Rlcjo6Q3JlYXRlVmlkZW9GcmFtZSgKLSAgICBjb25zdCBDb21QdHI8SU1GU2FtcGxlPiYgc2FtcGxlKSB7Ci0gIC8vIE5PVEU6IEFsbCBzYW1wbGVzIG11c3QgYmUgcmVsZWFzZWQgYmVmb3JlIGZsdXNoaW5nIHRoZSBkZWNvZGVyLiBTaW5jZQotICAvLyB0aGUgaG9zdCBtYXkgaGFuZyBvbnRvIFZpZGVvRnJhbWVzIHRoYXQgYXJlIGNyZWF0ZWQgaGVyZSwgbWFrZSB0aGVtCi0gIC8vIHdlYWsgcmVmZXJlbmNlcyB0byB0aGUgYWN0dWFsIHNhbXBsZS4KLSAgTE9OR0xPTkcgd2luMzJfc2FtcGxlX3RpbWUgPSAwOwotICBDaGVja1Jlc3VsdChzYW1wbGUtPkdldFNhbXBsZVRpbWUoJndpbjMyX3NhbXBsZV90aW1lKSk7Ci0gIFNiVGltZSBzYW1wbGVfdGltZSA9IENvbnZlcnRUb1NiVGltZSh3aW4zMl9zYW1wbGVfdGltZSk7Ci0KLSAgdGhyZWFkX2xvY2tfLkFjcXVpcmUoKTsKLSAgdGhyZWFkX291dHB1dHNfLmVtcGxhY2VfYmFjayhzYW1wbGVfdGltZSwgdmlkZW9fYXJlYV8sIHNhbXBsZSk7Ci0gIHRocmVhZF9sb2NrXy5SZWxlYXNlKCk7Ci0KLSAgLy8gVGhlICJuYXRpdmUgdGV4dHVyZSIgZm9yIHRoZSBWaWRlb0ZyYW1lIGlzIGFjdHVhbGx5IGp1c3QgdGhlIHRpbWVzdGFtcAotICAvLyBmb3IgdGhlIG91dHB1dCBzYW1wbGUuCi0gIHJldHVybiBuZXcgVmlkZW9GcmFtZUltcGwoCi0gICAgICBzYW1wbGVfdGltZSwgc3RkOjpiaW5kKCZWaWRlb0RlY29kZXI6OkRlbGV0ZVZpZGVvRnJhbWUsIHRoaXMsIF8xKSk7Ci19Ci0KLXZvaWQgVmlkZW9EZWNvZGVyOjpEZWxldGVWaWRlb0ZyYW1lKFZpZGVvRnJhbWUqIHZpZGVvX2ZyYW1lKSB7Ci0gIFNjb3BlZExvY2sgbG9jayh0aHJlYWRfbG9ja18pOwotICBmb3IgKGF1dG8gaXRlciA9IHRocmVhZF9vdXRwdXRzXy5iZWdpbigpOyBpdGVyICE9IHRocmVhZF9vdXRwdXRzXy5lbmQoKTsKLSAgICAgICArK2l0ZXIpIHsKLSAgICBpZiAoaXRlci0+dGltZSA9PSB2aWRlb19mcmFtZS0+dGltZXN0YW1wKCkpIHsKLSAgICAgIHRocmVhZF9vdXRwdXRzXy5lcmFzZShpdGVyKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotfQotCi12b2lkIFZpZGVvRGVjb2Rlcjo6RGVjb2RlclRocmVhZFJ1bigpIHsKLSAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxFdmVudD4gPiBwcmltaW5nX2V2ZW50czsKLSAgc3RkOjp1bmlxdWVfcHRyPEV2ZW50PiBldmVudDsKLSAgYm9vbCBpc19lbmRfb2Zfc3RyZWFtID0gZmFsc2U7Ci0KLSAgd2hpbGUgKCFkZWNvZGVyX3RocmVhZF9zdG9wX3JlcXVlc3RlZF8pIHsKLSAgICBpbnQgb3V0cHV0c190b19wcm9jZXNzID0gMTsKLSAgICBib29sIHdyb3RlX2lucHV0ID0gZmFsc2U7Ci0gICAgYm9vbCByZWFkX291dHB1dCA9IGZhbHNlOwotCi0gICAgLy8gUHJvY2VzcyBhIG5ldyBldmVudCBvciByZS10cnkgdGhlIHByZXZpb3VzIGV2ZW50LgotICAgIGlmIChldmVudCA9PSBudWxscHRyKSB7Ci0gICAgICBTY29wZWRMb2NrIGxvY2sodGhyZWFkX2xvY2tfKTsKLSAgICAgIGlmICghdGhyZWFkX2V2ZW50c18uZW1wdHkoKSkgewotICAgICAgICBldmVudC5zd2FwKHRocmVhZF9ldmVudHNfLmZyb250KCkpOwotICAgICAgICB0aHJlYWRfZXZlbnRzXy5wb3BfZnJvbnQoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoZXZlbnQgPT0gbnVsbHB0cikgewotICAgICAgU2JUaHJlYWRTbGVlcChrU2JUaW1lTWlsbGlzZWNvbmQpOwotICAgIH0gZWxzZSB7Ci0gICAgICBzd2l0Y2ggKGV2ZW50LT50eXBlKSB7Ci0gICAgICAgIGNhc2UgRXZlbnQ6OmtXcml0ZUlucHV0QnVmZmVyOgotICAgICAgICAgIFNCX0RDSEVDSyhldmVudC0+aW5wdXRfYnVmZmVyICE9IG51bGxwdHIpOwotICAgICAgICAgIGlmIChkZWNvZGVyXy0+VHJ5V3JpdGVJbnB1dEJ1ZmZlcihldmVudC0+aW5wdXRfYnVmZmVyLCAwKSkgewotICAgICAgICAgICAgaWYgKHByaW1pbmdfb3V0cHV0X2NvdW50XyA+IDApIHsKLSAgICAgICAgICAgICAgLy8gU2F2ZSB0aGlzIGV2ZW50IGZvciB0aGUgYWN0dWFsIHBsYXliYWNrLgotICAgICAgICAgICAgICBwcmltaW5nX2V2ZW50cy5lbXBsYWNlX2JhY2soZXZlbnQucmVsZWFzZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFRoZSBldmVudCB3YXMgc3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZC4gRGlzY2FyZCBpdC4KLSAgICAgICAgICAgIGV2ZW50LnJlc2V0KCk7Ci0gICAgICAgICAgICB3cm90ZV9pbnB1dCA9IHRydWU7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRoZSBkZWNvZGVyIG11c3QgYmUgZnVsbC4gUmUtdHJ5IHRoZSBldmVudCBvbiB0aGUgbmV4dAotICAgICAgICAgICAgLy8gaXRlcmF0aW9uLiBBZGRpdGlvbmFsbHksIHRyeSByZWFkaW5nIGFuIGV4dHJhIG91dHB1dCBmcmFtZSB0bwotICAgICAgICAgICAgLy8gc3RhcnQgZHJhaW5pbmcgdGhlIGRlY29kZXIuCi0gICAgICAgICAgICArK291dHB1dHNfdG9fcHJvY2VzczsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRXZlbnQ6OmtXcml0ZUVuZE9mU3RyZWFtOgotICAgICAgICAgIGV2ZW50LnJlc2V0KCk7Ci0gICAgICAgICAgZGVjb2Rlcl8tPkRyYWluKCk7Ci0gICAgICAgICAgaXNfZW5kX29mX3N0cmVhbSA9IHRydWU7Ci0gICAgICAgICAgd3JvdGVfaW5wdXQgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIFByb2Nlc3Mgb3V0cHV0IGZyYW1lKHMpLgotICAgIGZvciAoaW50IG91dHB1dHMgPSAwOyBvdXRwdXRzIDwgb3V0cHV0c190b19wcm9jZXNzOyArK291dHB1dHMpIHsKLSAgICAgIC8vIE5PVEU6IElNRlRyYW5zZm9ybTo6UHJvY2Vzc091dHB1dCAoY2FsbGVkIGJ5IGRlY29kZXJfLT5Qcm9jZXNzQW5kUmVhZCkKLSAgICAgIC8vIG1heSBzdGFsbCBpZiB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBJTUZTYW1wbGVzIHdvdWxkIGV4Y2VlZCB0aGUgdmFsdWUgb2YKLSAgICAgIC8vIE1GX1NBX01JTklNVU1fT1VUUFVUX1NBTVBMRV9DT1VOVC4KLSAgICAgIHRocmVhZF9sb2NrXy5BY3F1aXJlKCk7Ci0gICAgICBib29sIGlucHV0X2Z1bGwgPSB0aHJlYWRfZXZlbnRzXy5zaXplKCkgPj0ga01heElucHV0U2FtcGxlczsKLSAgICAgIGJvb2wgb3V0cHV0X2Z1bGwgPSB0aHJlYWRfb3V0cHV0c18uc2l6ZSgpID49IGtNYXhPdXRwdXRTYW1wbGVzOwotICAgICAgdGhyZWFkX2xvY2tfLlJlbGVhc2UoKTsKLQotICAgICAgU3RhdHVzIHN0YXR1cyA9IGlucHV0X2Z1bGwgPyBrQnVmZmVyRnVsbCA6IGtOZWVkTW9yZUlucHV0OwotICAgICAgZGVjb2Rlcl9zdGF0dXNfY2JfKHN0YXR1cywgbnVsbHB0cik7Ci0KLSAgICAgIGlmIChvdXRwdXRfZnVsbCkgewotICAgICAgICAvLyBXYWl0IGZvciB0aGUgYWN0aXZlIHNhbXBsZXMgdG8gYmUgY29uc3VtZWQgYmVmb3JlIHBvbGxpbmcgZm9yIG1vcmUuCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBDb21QdHI8SU1GU2FtcGxlPiBzYW1wbGU7Ci0gICAgICBDb21QdHI8SU1GTWVkaWFUeXBlPiBtZWRpYV90eXBlOwotICAgICAgZGVjb2Rlcl8tPlByb2Nlc3NBbmRSZWFkKCZzYW1wbGUsICZtZWRpYV90eXBlKTsKLSAgICAgIGlmIChtZWRpYV90eXBlKSB7Ci0gICAgICAgIFVwZGF0ZVZpZGVvQXJlYShtZWRpYV90eXBlKTsKLSAgICAgIH0KLSAgICAgIGlmIChzYW1wbGUpIHsKLSAgICAgICAgaWYgKHByaW1pbmdfb3V0cHV0X2NvdW50XyA+IDApIHsKLSAgICAgICAgICAvLyBJZ25vcmUgdGhlIG91dHB1dCBzYW1wbGVzIHdoaWxlIHByaW1pbmcgdGhlIGRlY29kZXIuCi0gICAgICAgICAgaWYgKC0tcHJpbWluZ19vdXRwdXRfY291bnRfID09IDApIHsKLSAgICAgICAgICAgIC8vIFJlcGxheSBhbGwgdGhlIHByaW1pbmcgZXZlbnRzIG9uY2UgcHJpbWluZyBpcyBmaW5pc2hlZC4KLSAgICAgICAgICAgIGlmIChldmVudCAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgIHByaW1pbmdfZXZlbnRzLmVtcGxhY2VfYmFjayhldmVudC5yZWxlYXNlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyZWFkX2xvY2tfLkFjcXVpcmUoKTsKLSAgICAgICAgICAgIHdoaWxlICghcHJpbWluZ19ldmVudHMuZW1wdHkoKSkgewotICAgICAgICAgICAgICB0aHJlYWRfZXZlbnRzXy5lbXBsYWNlX2Zyb250KHByaW1pbmdfZXZlbnRzLmJhY2soKS5yZWxlYXNlKCkpOwotICAgICAgICAgICAgICBwcmltaW5nX2V2ZW50cy5wb3BfYmFjaygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyZWFkX2xvY2tfLlJlbGVhc2UoKTsKLSAgICAgICAgICAgIGRlY29kZXJfLT5SZXNldCgpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBkZWNvZGVyX3N0YXR1c19jYl8oc3RhdHVzLCBDcmVhdGVWaWRlb0ZyYW1lKHNhbXBsZSkpOwotICAgICAgICB9Ci0gICAgICAgIHJlYWRfb3V0cHV0ID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoaXNfZW5kX29mX3N0cmVhbSkgewotICAgICAgICBkZWNvZGVyX3N0YXR1c19jYl8oa0J1ZmZlckZ1bGwsIFZpZGVvRnJhbWU6OkNyZWF0ZUVPU0ZyYW1lKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCF3cm90ZV9pbnB1dCAmJiAhcmVhZF9vdXRwdXQpIHsKLSAgICAgIC8vIFRocm90dGxlIGRlY29kZSBsb29wIHNpbmNlIG5vIEkvTyB3YXMgcG9zc2libGUuCi0gICAgICBTYlRocmVhZFNsZWVwKGtTYlRpbWVNaWxsaXNlY29uZCk7Ci0gICAgfQotICB9Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCogVmlkZW9EZWNvZGVyOjpEZWNvZGVyVGhyZWFkRW50cnkodm9pZCogY29udGV4dCkgewotICBTQl9EQ0hFQ0soY29udGV4dCk7Ci0gIFZpZGVvRGVjb2RlciogZGVjb2RlciA9IHN0YXRpY19jYXN0PFZpZGVvRGVjb2Rlcio+KGNvbnRleHQpOwotICBkZWNvZGVyLT5EZWNvZGVyVGhyZWFkUnVuKCk7Ci0gIGRlY29kZXItPmRlY29kZXJfdGhyZWFkX3N0b3BwZWRfID0gdHJ1ZTsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSB3aW4zMgotfSAgLy8gbmFtZXNwYWNlIHNoYXJlZAotfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZAotCi1uYW1lc3BhY2Ugc3RhcmJvYXJkIHsKLW5hbWVzcGFjZSBzaGFyZWQgewotbmFtZXNwYWNlIHN0YXJib2FyZCB7Ci1uYW1lc3BhY2UgcGxheWVyIHsKLW5hbWVzcGFjZSBmaWx0ZXIgewotCi0vLyBzdGF0aWMKLWJvb2wgVmlkZW9EZWNvZGVyOjpPdXRwdXRNb2RlU3VwcG9ydGVkKFNiUGxheWVyT3V0cHV0TW9kZSBvdXRwdXRfbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiTWVkaWFWaWRlb0NvZGVjIGNvZGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JEcm1TeXN0ZW0gZHJtX3N5c3RlbSkgewotICBTQl9VTlJFRkVSRU5DRURfUEFSQU1FVEVSKGNvZGVjKTsKLSAgU0JfVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUihkcm1fc3lzdGVtKTsKLSAgcmV0dXJuIG91dHB1dF9tb2RlID09IGtTYlBsYXllck91dHB1dE1vZGVEZWNvZGVUb1RleHR1cmU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBmaWx0ZXIKLX0gIC8vIG5hbWVzcGFjZSBwbGF5ZXIKLX0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKLX0gIC8vIG5hbWVzcGFjZSBzaGFyZWQKLX0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3ZpZGVvX2RlY29kZXIuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3ZpZGVvX2RlY29kZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAyZTMxMi4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi92aWRlb19kZWNvZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBTVEFSQk9BUkRfU0hBUkVEX1dJTjMyX1ZJREVPX0RFQ09ERVJfSF8KLSNkZWZpbmUgU1RBUkJPQVJEX1NIQVJFRF9XSU4zMl9WSURFT19ERUNPREVSX0hfCi0KLSNpbmNsdWRlIDxEM2QxMV8xLmg+Ci0jaW5jbHVkZSA8d3JsL2NsaWVudC5oPgotCi0jaW5jbHVkZSA8bGlzdD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJzdGFyYm9hcmQvY29tbW9uL3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL2NvbW1vbi9zY29wZWRfcHRyLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL2NvbmZpZ3VyYXRpb24uaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvZGVjb2RlX3RhcmdldC5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tdXRleC5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdmlkZW9fZGVjb2Rlcl9pbnRlcm5hbC5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdmlkZW9fcmVuZGVyZXJfc2luay5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3RocmVhZF9jaGVja2VyLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9kZWNyeXB0aW5nX2RlY29kZXIuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvdGhyZWFkLmgiCi0KLW5hbWVzcGFjZSBzdGFyYm9hcmQgewotbmFtZXNwYWNlIHNoYXJlZCB7Ci1uYW1lc3BhY2Ugd2luMzIgewotCi1jbGFzcyBWaWRlb0RlY29kZXIKLSAgICA6IHB1YmxpYyA6OnN0YXJib2FyZDo6c2hhcmVkOjpzdGFyYm9hcmQ6OnBsYXllcjo6ZmlsdGVyOjpWaWRlb0RlY29kZXIgewotIHB1YmxpYzoKLSAgdHlwZWRlZiA6OnN0YXJib2FyZDo6c2hhcmVkOjpzdGFyYm9hcmQ6OnBsYXllcjo6ZmlsdGVyOjpWaWRlb1JlbmRlcmVyU2luawotICAgICAgVmlkZW9SZW5kZXJlclNpbms7Ci0KLSAgY2xhc3MgU2luazsKLQotICBWaWRlb0RlY29kZXIoU2JNZWRpYVZpZGVvQ29kZWMgdmlkZW9fY29kZWMsCi0gICAgICAgICAgICAgICBTYlBsYXllck91dHB1dE1vZGUgb3V0cHV0X21vZGUsCi0gICAgICAgICAgICAgICBTYkRlY29kZVRhcmdldEdyYXBoaWNzQ29udGV4dFByb3ZpZGVyKiBncmFwaGljc19jb250ZXh0X3Byb3ZpZGVyLAotICAgICAgICAgICAgICAgU2JEcm1TeXN0ZW0gZHJtX3N5c3RlbSk7Ci0gIH5WaWRlb0RlY29kZXIoKSBvdmVycmlkZTsKLQotICBzY29wZWRfcmVmcHRyPFZpZGVvUmVuZGVyZXJTaW5rPiBHZXRTaW5rKCk7Ci0KLSAgLy8gSW1wbGVtZW50IFZpZGVvRGVjb2RlciBpbnRlcmZhY2UuCi0gIHZvaWQgSW5pdGlhbGl6ZShjb25zdCBEZWNvZGVyU3RhdHVzQ0ImIGRlY29kZXJfc3RhdHVzX2NiLAotICAgICAgICAgICAgICAgICAgY29uc3QgRXJyb3JDQiYgZXJyb3JfY2IpIG92ZXJyaWRlOwotICBzaXplX3QgR2V0UHJlcm9sbEZyYW1lQ291bnQoKSBjb25zdCBvdmVycmlkZTsKLSAgU2JUaW1lIEdldFByZXJvbGxUaW1lb3V0KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4ga1NiVGltZU1heDsgfQotICBzaXplX3QgR2V0TWF4TnVtYmVyT2ZDYWNoZWRGcmFtZXMoKSBjb25zdCBvdmVycmlkZTsKLQotICB2b2lkIFdyaXRlSW5wdXRCdWZmZXIoY29uc3Qgc2NvcGVkX3JlZnB0cjxJbnB1dEJ1ZmZlcj4mIGlucHV0X2J1ZmZlcikKLSAgICAgIG92ZXJyaWRlOwotICB2b2lkIFdyaXRlRW5kT2ZTdHJlYW0oKSBvdmVycmlkZTsKLSAgdm9pZCBSZXNldCgpIG92ZXJyaWRlOwotICBTYkRlY29kZVRhcmdldCBHZXRDdXJyZW50RGVjb2RlVGFyZ2V0KCkgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgdXNpbmcgQ29tUHRyID0gTWljcm9zb2Z0OjpXUkw6OkNvbVB0cjxUPjsKLQotICBzdHJ1Y3QgRXZlbnQgewotICAgIGVudW0gVHlwZSB7Ci0gICAgICBrV3JpdGVJbnB1dEJ1ZmZlciwKLSAgICAgIGtXcml0ZUVuZE9mU3RyZWFtLAotICAgIH07Ci0gICAgVHlwZSB0eXBlOwotICAgIHNjb3BlZF9yZWZwdHI8SW5wdXRCdWZmZXI+IGlucHV0X2J1ZmZlcjsKLSAgfTsKLQotICBzdHJ1Y3QgT3V0cHV0IHsKLSNpZiBTQl9BUElfVkVSU0lPTiA8IFNCX0RFUFJFQ0FURV9TQl9NRURJQV9USU1FX0FQSV9WRVJTSU9OCi0gICAgT3V0cHV0KFNiTWVkaWFUaW1lIHRpbWUsIGNvbnN0IFJFQ1QmIHZpZGVvX2FyZWEsCi0gICAgICAgICAgIGNvbnN0IENvbVB0cjxJTUZTYW1wbGU+JiB2aWRlb19zYW1wbGUpCi0gICAgICAgIDogdGltZSh0aW1lKSwgdmlkZW9fYXJlYSh2aWRlb19hcmVhKSwgdmlkZW9fc2FtcGxlKHZpZGVvX3NhbXBsZSkge30KLSAgICBTYk1lZGlhVGltZSB0aW1lOwotI2Vsc2UgICAvLyBTQl9BUElfVkVSU0lPTiA8IFNCX0RFUFJFQ0FURV9TQl9NRURJQV9USU1FX0FQSV9WRVJTSU9OCi0gICAgT3V0cHV0KFNiVGltZSB0aW1lLAotICAgICAgICAgICBjb25zdCBSRUNUJiB2aWRlb19hcmVhLAotICAgICAgICAgICBjb25zdCBDb21QdHI8SU1GU2FtcGxlPiYgdmlkZW9fc2FtcGxlKQotICAgICAgICA6IHRpbWUodGltZSksIHZpZGVvX2FyZWEodmlkZW9fYXJlYSksIHZpZGVvX3NhbXBsZSh2aWRlb19zYW1wbGUpIHt9Ci0gICAgU2JUaW1lIHRpbWU7Ci0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OIDwgU0JfREVQUkVDQVRFX1NCX01FRElBX1RJTUVfQVBJX1ZFUlNJT04KLSAgICBSRUNUIHZpZGVvX2FyZWE7Ci0gICAgQ29tUHRyPElNRlNhbXBsZT4gdmlkZW9fc2FtcGxlOwotICB9OwotCi0gIHZvaWQgSW5pdGlhbGl6ZUNvZGVjKCk7Ci0gIHZvaWQgU2h1dGRvd25Db2RlYygpOwotICBzdGF0aWMgdm9pZCBSZWxlYXNlRGVjb2RlVGFyZ2V0cyh2b2lkKiBjb250ZXh0KTsKLQotICB2b2lkIFVwZGF0ZVZpZGVvQXJlYShjb25zdCBDb21QdHI8SU1GTWVkaWFUeXBlPiYgbWVkaWEpOwotICBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+IENyZWF0ZVZpZGVvRnJhbWUoY29uc3QgQ29tUHRyPElNRlNhbXBsZT4mIHNhbXBsZSk7Ci0gIHZvaWQgRGVsZXRlVmlkZW9GcmFtZShWaWRlb0ZyYW1lKiB2aWRlb19mcmFtZSk7Ci0gIHN0YXRpYyB2b2lkIENyZWF0ZURlY29kZVRhcmdldEhlbHBlcih2b2lkKiBjb250ZXh0KTsKLSAgU2JEZWNvZGVUYXJnZXQgQ3JlYXRlRGVjb2RlVGFyZ2V0KCk7Ci0KLSAgdm9pZCBFbnN1cmVEZWNvZGVyVGhyZWFkUnVubmluZygpOwotICB2b2lkIFN0b3BEZWNvZGVyVGhyZWFkKCk7Ci0gIHZvaWQgRGVjb2RlclRocmVhZFJ1bigpOwotICBzdGF0aWMgdm9pZCogRGVjb2RlclRocmVhZEVudHJ5KHZvaWQqIGNvbnRleHQpOwotCi0gIDo6c3RhcmJvYXJkOjpzaGFyZWQ6OnN0YXJib2FyZDo6VGhyZWFkQ2hlY2tlciB0aHJlYWRfY2hlY2tlcl87Ci0KLSAgLy8gVGhlc2UgdmFyaWFibGVzIHdpbGwgYmUgaW5pdGlhbGl6ZWQgaW5zaWRlIGN0b3Igb3IgU2V0SG9zdCgpIGFuZCB3aWxsIG5vdAotICAvLyBiZSBjaGFuZ2VkIGR1cmluZyB0aGUgbGlmZSB0aW1lIG9mIHRoaXMgY2xhc3MuCi0gIGNvbnN0IFNiTWVkaWFWaWRlb0NvZGVjIHZpZGVvX2NvZGVjXzsKLSAgRGVjb2RlclN0YXR1c0NCIGRlY29kZXJfc3RhdHVzX2NiXzsKLSAgRXJyb3JDQiBlcnJvcl9jYl87Ci0gIFNiRGVjb2RlVGFyZ2V0R3JhcGhpY3NDb250ZXh0UHJvdmlkZXIqIGdyYXBoaWNzX2NvbnRleHRfcHJvdmlkZXJfOwotICBTYkRybVN5c3RlbSBjb25zdCBkcm1fc3lzdGVtXzsKLQotICAvLyBUaGVzZSBhcmUgcGxhdGZvcm0tc3BlY2lmaWMgb2JqZWN0cyByZXF1aXJlZCB0byBjcmVhdGUgYW5kIHVzZSBhIGNvZGVjLgotICBDb21QdHI8SUQzRDExRGV2aWNlPiBkM2RfZGV2aWNlXzsKLSAgQ29tUHRyPElNRkRYR0lEZXZpY2VNYW5hZ2VyPiBkZXZpY2VfbWFuYWdlcl87Ci0gIENvbVB0cjxJRDNEMTFWaWRlb0RldmljZTE+IHZpZGVvX2RldmljZV87Ci0gIENvbVB0cjxJRDNEMTFWaWRlb0NvbnRleHQ+IHZpZGVvX2NvbnRleHRfOwotICBDb21QdHI8SUQzRDExVmlkZW9Qcm9jZXNzb3JFbnVtZXJhdG9yPiB2aWRlb19lbnVtZXJhdG9yXzsKLSAgQ29tUHRyPElEM0QxMVZpZGVvUHJvY2Vzc29yPiB2aWRlb19wcm9jZXNzb3JfOwotCi0gIHNjb3BlZF9wdHI8RGVjcnlwdGluZ0RlY29kZXI+IGRlY29kZXJfOwotICBSRUNUIHZpZGVvX2FyZWFfOwotCi0gIFNiVGhyZWFkIGRlY29kZXJfdGhyZWFkXzsKLSAgdm9sYXRpbGUgYm9vbCBkZWNvZGVyX3RocmVhZF9zdG9wX3JlcXVlc3RlZF87Ci0gIGJvb2wgZGVjb2Rlcl90aHJlYWRfc3RvcHBlZF87Ci0gIE11dGV4IHRocmVhZF9sb2NrXzsKLSAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxFdmVudD4gPiB0aHJlYWRfZXZlbnRzXzsKLQotICAvLyBUaGlzIHN0cnVjdHVyZSBzaGFkb3dzIHRoZSBsaXN0IG9mIG91dHN0YW5kaW5nIGZyYW1lcyBoZWxkIGJ5IHRoZSBob3N0LgotICAvLyBXaGVuIGEgbmV3IG91dHB1dCBpcyBhZGRlZCB0byB0aGlzIHN0cnVjdHVyZSwgdGhlIGhvc3Qgc2hvdWxkIGJlIG5vdGlmaWVkCi0gIC8vIG9mIGEgbmV3IFZpZGVvRnJhbWUuIFdoZW4gdGhlIGhvc3QgZGVsZXRlcyB0aGUgVmlkZW9GcmFtZSwgdGhlIGRlbGV0ZQotICAvLyBjYWxsYmFjayBpcyB1c2VkIHRvIHVwZGF0ZSB0aGlzIHN0cnVjdHVyZS4gVGhlIFZpZGVvRGVjb2RlciBtYXkgbmVlZCB0bwotICAvLyBkZWxldGUgb3V0cHV0cyB3aXRob3V0IG5vdGlmeWluZyB0aGUgaG9zdC4gSW4gc3VjaCBhIHNpdHVhdGlvbiwgdGhlIGhvc3QncwotICAvLyBWaWRlb0ZyYW1lcyB3aWxsIGJlIGludmFsaWQgaWYgdGhleSBzdGlsbCByZXF1aXJlIHRoZSBJTUZTYW1wbGU7IGl0J3MKLSAgLy8gcG9zc2libGUgdGhhdCB0aGUgVmlkZW9GcmFtZSB3YXMgY29udmVydGVkIHRvIGEgdGV4dHVyZSBhbHJlYWR5LCBzbyBpdAotICAvLyB3aWxsIGNvbnRpbnVlIHRvIGJlIHZhbGlkIHNpbmNlIHRoZSBJTUZTYW1wbGUgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KLSAgTXV0ZXggb3V0cHV0c19yZXNldF9sb2NrXzsKLSAgc3RkOjpsaXN0PE91dHB1dD4gdGhyZWFkX291dHB1dHNfOwotCi0gIC8vIFRvIHdvcmthcm91bmQgdGhlIHN0YXJ0dXAgaGl0Y2ggZm9yIFZQOSwgZXhlcmNpc2UgdGhlIGRlY29kZXIgZm9yIGEKLSAgLy8gY2VydGFpbiBudW1iZXIgb2YgZnJhbWVzIHdoaWxlIHByZXJvbGxpbmcgdGhlIGluaXRpYWwgcGxheWJhY2suCi0gIGludCBwcmltaW5nX291dHB1dF9jb3VudF87Ci0KLSAgTXV0ZXggZGVjb2RlX3RhcmdldF9sb2NrXzsKLSAgU2JEZWNvZGVUYXJnZXQgY3VycmVudF9kZWNvZGVfdGFyZ2V0XzsKLSAgc3RkOjpsaXN0PFNiRGVjb2RlVGFyZ2V0PiBwcmV2X2RlY29kZV90YXJnZXRzXzsKLQotICBzY29wZWRfcmVmcHRyPFNpbms+IHNpbmtfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHdpbjMyCi19ICAvLyBuYW1lc3BhY2Ugc2hhcmVkCi19ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCi0KLSNlbmRpZiAgLy8gU1RBUkJPQVJEX1NIQVJFRF9XSU4zMl9WSURFT19ERUNPREVSX0hfCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi93Y2hhcl91dGlscy5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvd2NoYXJfdXRpbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0ZTdkNy4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi93Y2hhcl91dGlscy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBTVEFSQk9BUkRfU0hBUkVEX1dJTjMyX1dDSEFSX1VUSUxTX0hfCi0jZGVmaW5lIFNUQVJCT0FSRF9TSEFSRURfV0lOMzJfV0NIQVJfVVRJTFNfSF8KLQotI2luY2x1ZGUgPGNvZGVjdnQ+Ci0jaW5jbHVkZSA8Y3djaGFyPgotI2luY2x1ZGUgPGxvY2FsZT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLW5hbWVzcGFjZSBzdGFyYm9hcmQgewotbmFtZXNwYWNlIHNoYXJlZCB7Ci1uYW1lc3BhY2Ugd2luMzIgewotCi1pbmxpbmUgc3RkOjpzdHJpbmcgd2NoYXJfdFRvVVRGOChjb25zdCB3Y2hhcl90KiBjb25zdCBzdHIpIHsKLSAgc3RkOjp3c3RyaW5nX2NvbnZlcnQ8c3RkOjpjb2RlY3Z0X3V0Zjg8d2NoYXJfdD4sIHdjaGFyX3Q+IGNvbnZlcnRlcjsKLSAgcmV0dXJuIGNvbnZlcnRlci50b19ieXRlcyhzdHIpOwotfQotCi1pbmxpbmUgc3RkOjpzdHJpbmcgd2NoYXJfdFRvVVRGOChjb25zdCB3Y2hhcl90KiBjb25zdCBzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNpemVfdCBzaXplKSB7Ci0gIHN0ZDo6d3N0cmluZ19jb252ZXJ0PHN0ZDo6Y29kZWN2dF91dGY4PHdjaGFyX3Q+LCB3Y2hhcl90PiBjb252ZXJ0ZXI7Ci0gIHJldHVybiBjb252ZXJ0ZXIudG9fYnl0ZXMoc3RyLCBzdHIgKyBzaXplKTsKLX0KLQotaW5saW5lIHN0ZDo6d3N0cmluZyBDU3RyaW5nVG9XU3RyaW5nKGNvbnN0IGNoYXIqIHN0cikgewotICBzdGQ6OndzdHJpbmdfY29udmVydDxzdGQ6OmNvZGVjdnRfdXRmODx3Y2hhcl90Piwgd2NoYXJfdD4gY29udmVydGVyOwotICByZXR1cm4gY29udmVydGVyLmZyb21fYnl0ZXMoc3RyKTsKLX0KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXNfd2lucnQpCi1pbmxpbmUgc3RkOjpzdHJpbmcgcGxhdGZvcm1TdHJpbmdUb1N0cmluZyhQbGF0Zm9ybTo6U3RyaW5nXiB0b19jb252ZXJ0KSB7Ci0gIHN0ZDo6d3N0cmluZyB3cyh0b19jb252ZXJ0LT5CZWdpbigpLCB0b19jb252ZXJ0LT5FbmQoKSk7Ci0gIHJldHVybiB3Y2hhcl90VG9VVEY4KHdzLmRhdGEoKSwgd3Muc2l6ZSgpKTsKLX0KLQotaW5saW5lIFBsYXRmb3JtOjpTdHJpbmdeIHN0cmluZ1RvUGxhdGZvcm1TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHRvX2NvbnZlcnQpIHsKLSAgcmV0dXJuIHJlZiBuZXcgUGxhdGZvcm06OlN0cmluZyhDU3RyaW5nVG9XU3RyaW5nKHRvX2NvbnZlcnQuY19zdHIoKSkuY19zdHIoKSk7Ci19Ci0jZW5kaWYKLQotfSAgLy8gbmFtZXNwYWNlIHdpbjMyCi19ICAvLyBuYW1lc3BhY2Ugc2hhcmVkCi19ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCi0KLSNlbmRpZiAgLy8gU1RBUkJPQVJEX1NIQVJFRF9XSU4zMl9XQ0hBUl9VVElMU19IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvd2luMzJfYXVkaW9fZGVjb2Rlci5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3dpbjMyX2F1ZGlvX2RlY29kZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViODNhMTAuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvd2luMzJfYXVkaW9fZGVjb2Rlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi93aW4zMl9hdWRpb19kZWNvZGVyLmgiCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8cXVldWU+Ci0KLSNpbmNsdWRlICJzdGFyYm9hcmQvYXRvbWljLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvdGhyZWFkX2NoZWNrZXIuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2F0b21pY19xdWV1ZS5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvYXVkaW9fZGVjb2Rlci5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvYXVkaW9fdHJhbnNmb3JtLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9kZWNyeXB0aW5nX2RlY29kZXIuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2Vycm9yX3V0aWxzLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9tZWRpYV9mb3VuZGF0aW9uX3V0aWxzLmgiCi0KLW5hbWVzcGFjZSBzdGFyYm9hcmQgewotbmFtZXNwYWNlIHNoYXJlZCB7Ci1uYW1lc3BhY2Ugd2luMzIgewotCi11c2luZyBNaWNyb3NvZnQ6OldSTDo6Q29tUHRyOwotdXNpbmcgOjpzdGFyYm9hcmQ6OnNoYXJlZDo6c3RhcmJvYXJkOjpUaHJlYWRDaGVja2VyOwotdXNpbmcgOjpzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OkNyZWF0ZUF1ZGlvVHJhbnNmb3JtOwotCi1jb25zdCBzaXplX3Qga0FhY1NhbXBsZXNQZXJGcmFtZSA9IDEwMjQ7Ci0vLyBXZSBhcmUgdXNpbmcgZmxvYXQgc2FtcGxlcyBvbiBYYjEuCi1jb25zdCBzaXplX3Qga0J5dGVzUGVyU2FtcGxlID0gc2l6ZW9mKGZsb2F0KTsKLQotbmFtZXNwYWNlIHsKLQotY2xhc3MgQWJzdHJhY3RXaW4zMkF1ZGlvRGVjb2RlckltcGwgOiBwdWJsaWMgQWJzdHJhY3RXaW4zMkF1ZGlvRGVjb2RlciB7Ci0gcHVibGljOgotICBBYnN0cmFjdFdpbjMyQXVkaW9EZWNvZGVySW1wbChTYk1lZGlhQXVkaW9Db2RlYyBjb2RlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JNZWRpYUF1ZGlvRnJhbWVTdG9yYWdlVHlwZSBhdWRpb19mcmFtZV9mbXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiTWVkaWFBdWRpb1NhbXBsZVR5cGUgc2FtcGxlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNiTWVkaWFBdWRpb0hlYWRlciYgYXVkaW9faGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkRybVN5c3RlbSBkcm1fc3lzdGVtKQotICAgICAgOiB0aHJlYWRfY2hlY2tlcl8oVGhyZWFkQ2hlY2tlcjo6a1NldFRocmVhZElkT25GaXJzdENoZWNrKSwKLSAgICAgICAgY29kZWNfKGNvZGVjKSwKLSAgICAgICAgYXVkaW9fZnJhbWVfZm10XyhhdWRpb19mcmFtZV9mbXQpLAotICAgICAgICBzYW1wbGVfdHlwZV8oc2FtcGxlX3R5cGUpLAotICAgICAgICBudW1iZXJfb2ZfY2hhbm5lbHNfKGF1ZGlvX2hlYWRlci5udW1iZXJfb2ZfY2hhbm5lbHMpLAotICAgICAgICBoZWFhY19kZXRlY3RlZF8oZmFsc2UpLAotICAgICAgICBzYW1wbGVzX3Blcl9zZWNvbmRfKHN0YXRpY19jYXN0PGludD4oYXVkaW9faGVhZGVyLnNhbXBsZXNfcGVyX3NlY29uZCkpIHsKLSAgICBzY29wZWRfcHRyPE1lZGlhVHJhbnNmb3JtPiBhdWRpb19kZWNvZGVyID0KLSAgICAgICAgQ3JlYXRlQXVkaW9UcmFuc2Zvcm0oYXVkaW9faGVhZGVyLCBjb2RlY18pOwotICAgIGltcGxfLnJlc2V0KAotICAgICAgICBuZXcgRGVjcnlwdGluZ0RlY29kZXIoImF1ZGlvIiwgYXVkaW9fZGVjb2Rlci5QYXNzKCksIGRybV9zeXN0ZW0pKTsKLSAgfQotCi0gIHZvaWQgQ29uc3VtZShDb21QdHI8SU1GU2FtcGxlPiBzYW1wbGUpIHsKLSAgICBEV09SRCBidWZmX2NvdW50ID0gMDsKLSAgICBIUkVTVUxUIGhyID0gc2FtcGxlLT5HZXRCdWZmZXJDb3VudCgmYnVmZl9jb3VudCk7Ci0gICAgQ2hlY2tSZXN1bHQoaHIpOwotICAgIFNCX0RDSEVDSyhidWZmX2NvdW50ID09IDEpOwotCi0gICAgQ29tUHRyPElNRk1lZGlhQnVmZmVyPiBtZWRpYV9idWZmZXI7Ci0gICAgaHIgPSBzYW1wbGUtPkdldEJ1ZmZlckJ5SW5kZXgoMCwgJm1lZGlhX2J1ZmZlcik7Ci0gICAgaWYgKEZBSUxFRChocikpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBMT05HTE9ORyB3aW4zMl90aW1lc3RhbXAgPSAwOwotICAgIGhyID0gc2FtcGxlLT5HZXRTYW1wbGVUaW1lKCZ3aW4zMl90aW1lc3RhbXApOwotICAgIENoZWNrUmVzdWx0KGhyKTsKLQotICAgIEJZVEUqIGJ1ZmZlcjsKLSAgICBEV09SRCBsZW5ndGg7Ci0gICAgaHIgPSBtZWRpYV9idWZmZXItPkxvY2soJmJ1ZmZlciwgTlVMTCwgJmxlbmd0aCk7Ci0gICAgQ2hlY2tSZXN1bHQoaHIpOwotICAgIFNCX0RDSEVDSyhsZW5ndGgpOwotCi0gICAgY29uc3QgdWludDhfdCogZGF0YSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGJ1ZmZlcik7Ci0gICAgY29uc3Qgc2l6ZV90IGRhdGFfc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4obGVuZ3RoKTsKLQotICAgIGNvbnN0IHNpemVfdCBleHBlY3Rfc2l6ZV9pbl9ieXRlcyA9Ci0gICAgICAgIG51bWJlcl9vZl9jaGFubmVsc18gKiBrQWFjU2FtcGxlc1BlckZyYW1lICoga0J5dGVzUGVyU2FtcGxlOwotICAgIGlmIChkYXRhX3NpemUgLyBleHBlY3Rfc2l6ZV9pbl9ieXRlcyA9PSAyKSB7Ci0gICAgICBoZWFhY19kZXRlY3RlZF8uc3RvcmUodHJ1ZSk7Ci0gICAgfQotCi0gICAgRGVjb2RlZEF1ZGlvUHRyIGRhdGFfcHRyKAotICAgICAgICBuZXcgRGVjb2RlZEF1ZGlvKG51bWJlcl9vZl9jaGFubmVsc18sIHNhbXBsZV90eXBlXywgYXVkaW9fZnJhbWVfZm10XywKLSAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0VG9TYlRpbWUod2luMzJfdGltZXN0YW1wKSwgZGF0YV9zaXplKSk7Ci0KLSAgICBzdGQ6OmNvcHkoZGF0YSwgZGF0YSArIGRhdGFfc2l6ZSwgZGF0YV9wdHItPmJ1ZmZlcigpKTsKLQotICAgIG91dHB1dF9xdWV1ZV8ucHVzaChkYXRhX3B0cik7Ci0gICAgbWVkaWFfYnVmZmVyLT5VbmxvY2soKTsKLSAgfQotCi0gIGJvb2wgVHJ5V3JpdGUoY29uc3Qgc2NvcGVkX3JlZnB0cjxJbnB1dEJ1ZmZlcj4mIGJ1ZmYpIG92ZXJyaWRlIHsKLSAgICBTQl9EQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7Ci0KLSAgICAvLyBUaGUgaW5jb21pbmcgYXVkaW8gaXMgaW4gQURUUyBmb3JtYXQgd2hpY2ggaGFzIGEgNyBieXRlcyBoZWFkZXIuICBCdXQKLSAgICAvLyB0aGUgYXVkaW8gZGVjb2RlciBpcyBjb25maWd1cmVkIHRvIGFjY2VwdCByYXcgQUFDLiAgU28gd2UgaGF2ZSB0byBhZGp1c3QKLSAgICAvLyB0aGUgZGF0YSwgc2l6ZSwgYW5kIHN1YnNhbXBsZSBtYXBwaW5nIHRvIHNraXAgdGhlIEFEVFMgaGVhZGVyLgotICAgIGNvbnN0IGludCBrQURUU0hlYWRlclNpemUgPSA3OwotICAgIGNvbnN0IGJvb2wgd3JpdGVfb2sgPSBpbXBsXy0+VHJ5V3JpdGVJbnB1dEJ1ZmZlcihidWZmLCBrQURUU0hlYWRlclNpemUpOwotICAgIHJldHVybiB3cml0ZV9vazsKLSAgfQotCi0gIHZvaWQgV3JpdGVFbmRPZlN0cmVhbSgpIG92ZXJyaWRlIHsKLSAgICBTQl9EQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7Ci0KLSAgICBpbXBsXy0+RHJhaW4oKTsKLSAgICBDb21QdHI8SU1GU2FtcGxlPiBzYW1wbGU7Ci0gICAgQ29tUHRyPElNRk1lZGlhVHlwZT4gbWVkaWFfdHlwZTsKLSAgICB3aGlsZSAoaW1wbF8tPlByb2Nlc3NBbmRSZWFkKCZzYW1wbGUsICZtZWRpYV90eXBlKSkgewotICAgICAgaWYgKHNhbXBsZSkgewotICAgICAgICBDb25zdW1lKHNhbXBsZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIG91dHB1dF9xdWV1ZV8ucHVzaChuZXcgRGVjb2RlZEF1ZGlvKTsKLSAgfQotCi0gIHNjb3BlZF9yZWZwdHI8RGVjb2RlZEF1ZGlvPiBQcm9jZXNzQW5kUmVhZCgpIG92ZXJyaWRlIHsKLSAgICBTQl9EQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7Ci0KLSAgICBDb21QdHI8SU1GU2FtcGxlPiBzYW1wbGU7Ci0gICAgQ29tUHRyPElNRk1lZGlhVHlwZT4gbWVkaWFfdHlwZTsKLSAgICB3aGlsZSAoaW1wbF8tPlByb2Nlc3NBbmRSZWFkKCZzYW1wbGUsICZtZWRpYV90eXBlKSkgewotICAgICAgaWYgKHNhbXBsZSkgewotICAgICAgICBDb25zdW1lKHNhbXBsZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChvdXRwdXRfcXVldWVfLmVtcHR5KCkpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBzY29wZWRfcmVmcHRyPERlY29kZWRBdWRpbz4gb3V0cHV0ID0gb3V0cHV0X3F1ZXVlXy5mcm9udCgpOwotICAgIG91dHB1dF9xdWV1ZV8ucG9wKCk7Ci0gICAgcmV0dXJuIG91dHB1dDsKLSAgfQotCi0gIHZvaWQgUmVzZXQoKSBvdmVycmlkZSB7Ci0gICAgaW1wbF8tPlJlc2V0KCk7Ci0gICAgc3RkOjpxdWV1ZTxEZWNvZGVkQXVkaW9QdHI+IGVtcHR5OwotICAgIG91dHB1dF9xdWV1ZV8uc3dhcChlbXB0eSk7Ci0gICAgdGhyZWFkX2NoZWNrZXJfLkRldGFjaCgpOwotICB9Ci0KLSAgaW50IEdldFNhbXBsZXNQZXJTZWNvbmQoKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgaWYgKGhlYWFjX2RldGVjdGVkXy5sb2FkKCkpIHsKLSAgICAgIHJldHVybiBzYW1wbGVzX3Blcl9zZWNvbmRfICogMjsKLSAgICB9Ci0gICAgcmV0dXJuIHNhbXBsZXNfcGVyX3NlY29uZF87Ci0gIH0KLQotICAvLyBUaGUgb2JqZWN0IGlzIHNpbmdsZS10aHJlYWRlZCBhbmQgaXMgZHJpdmVuIGJ5IGEgZGVkaWNhdGVkIHRocmVhZC4KLSAgLy8gSG93ZXZlciB0aGUgdGhyZWFkIG1heSBnZXRzIGRlc3Ryb3llZCBhbmQgcmUtY3JlYXRlZCBvdmVyIHRoZSBsaWZlIHRpbWUgb2YKLSAgLy8gdGhpcyBvYmplY3QuICBXZSBlbmZvcmNlIHRoYXQgY2VydGFpbiBtZW1iZXIgZnVuY3Rpb25zIGNhbiBvbmx5IGNhbGxlZAotICAvLyBmcm9tIG9uZSB0aHJlYWQgd2hpbGUgc3RpbGwgYWxsb3dzIHRoaXMgb2JqZWN0IHRvIGJlIGRyaXZlbiBieSBkaWZmZXJlbnQKLSAgLy8gdGhyZWFkcyBieToKLSAgLy8gMS4gVGhlIHx0aHJlYWRfY2hlY2tlcl98IGlzIGluaXRpYWxseSBjcmVhdGVkIHdpdGhvdXQgYXR0YWNoaW5nIHRvIGFueQotICAvLyAgICB0aHJlYWQuCi0gIC8vIDIuIFdoZW4gYSB0aHJlYWQgaXMgZGVzdHJveWVkLCBSZXNldCgpIHdpbGwgYmUgY2FsbGVkIHdoaWNoIGluIHR1cm4gY2FsbHMKLSAgLy8gICAgRGV0YWNoKCkgb24gdGhlIHx0aHJlYWRfY2hlY2tlcl98IHRvIGFsbG93IHRoZSBvYmplY3QgdG8gYXR0YWNoIHRvIGEKLSAgLy8gICAgbmV3IHRocmVhZC4KLSAgOjpzdGFyYm9hcmQ6OnNoYXJlZDo6c3RhcmJvYXJkOjpUaHJlYWRDaGVja2VyIHRocmVhZF9jaGVja2VyXzsKLSAgY29uc3QgU2JNZWRpYUF1ZGlvQ29kZWMgY29kZWNfOwotICBjb25zdCBTYk1lZGlhQXVkaW9TYW1wbGVUeXBlIHNhbXBsZV90eXBlXzsKLSAgY29uc3QgU2JNZWRpYUF1ZGlvRnJhbWVTdG9yYWdlVHlwZSBhdWRpb19mcmFtZV9mbXRfOwotICBzY29wZWRfcHRyPERlY3J5cHRpbmdEZWNvZGVyPiBpbXBsXzsKLSAgc3RkOjpxdWV1ZTxEZWNvZGVkQXVkaW9QdHI+IG91dHB1dF9xdWV1ZV87Ci0gIHVpbnQxNl90IG51bWJlcl9vZl9jaGFubmVsc187Ci0gIGF0b21pY19ib29sIGhlYWFjX2RldGVjdGVkXzsKLSAgaW50IHNhbXBsZXNfcGVyX3NlY29uZF87Ci19OwotCi19ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlLgotCi1zY29wZWRfcHRyPEFic3RyYWN0V2luMzJBdWRpb0RlY29kZXI+IEFic3RyYWN0V2luMzJBdWRpb0RlY29kZXI6OkNyZWF0ZSgKLSAgICBTYk1lZGlhQXVkaW9Db2RlYyBjb2RlLAotICAgIFNiTWVkaWFBdWRpb0ZyYW1lU3RvcmFnZVR5cGUgYXVkaW9fZnJhbWVfZm10LAotICAgIFNiTWVkaWFBdWRpb1NhbXBsZVR5cGUgc2FtcGxlX3R5cGUsCi0gICAgY29uc3QgU2JNZWRpYUF1ZGlvSGVhZGVyJiBhdWRpb19oZWFkZXIsCi0gICAgU2JEcm1TeXN0ZW0gZHJtX3N5c3RlbSkgewotICByZXR1cm4gc2NvcGVkX3B0cjxBYnN0cmFjdFdpbjMyQXVkaW9EZWNvZGVyPigKLSAgICAgIG5ldyBBYnN0cmFjdFdpbjMyQXVkaW9EZWNvZGVySW1wbChjb2RlLCBhdWRpb19mcmFtZV9mbXQsIHNhbXBsZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2hlYWRlciwgZHJtX3N5c3RlbSkpOwotfQotCi19ICAvLyBuYW1lc3BhY2Ugd2luMzIKLX0gIC8vIG5hbWVzcGFjZSBzaGFyZWQKLX0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3dpbjMyX2F1ZGlvX2RlY29kZXIuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3dpbjMyX2F1ZGlvX2RlY29kZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEyMzdlOS4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi93aW4zMl9hdWRpb19kZWNvZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaWZuZGVmIFNUQVJCT0FSRF9TSEFSRURfV0lOMzJfV0lOMzJfQVVESU9fREVDT0RFUl9IXwotI2RlZmluZSBTVEFSQk9BUkRfU0hBUkVEX1dJTjMyX1dJTjMyX0FVRElPX0RFQ09ERVJfSF8KLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9jb21tb24vcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvY29tbW9uL3Njb3BlZF9wdHIuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvZHJtLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lZGlhLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2RlY29kZWRfYXVkaW9faW50ZXJuYWwuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL21lZGlhX2NvbW1vbi5oIgotI2luY2x1ZGUgInN0YXJib2FyZC90eXBlcy5oIgotCi1uYW1lc3BhY2Ugc3RhcmJvYXJkIHsKLW5hbWVzcGFjZSBzaGFyZWQgewotbmFtZXNwYWNlIHdpbjMyIHsKLQotLy8gQXVkaW9EZWNvZGVyIGZvciBXaW4zMi4KLWNsYXNzIEFic3RyYWN0V2luMzJBdWRpb0RlY29kZXIgewotIHB1YmxpYzoKLSAgc3RhdGljIHNjb3BlZF9wdHI8QWJzdHJhY3RXaW4zMkF1ZGlvRGVjb2Rlcj4gQ3JlYXRlKAotICAgICAgU2JNZWRpYUF1ZGlvQ29kZWMgY29kZWMsCi0gICAgICBTYk1lZGlhQXVkaW9GcmFtZVN0b3JhZ2VUeXBlIGF1ZGlvX2ZyYW1lX2ZtdCwKLSAgICAgIFNiTWVkaWFBdWRpb1NhbXBsZVR5cGUgc2FtcGxlX3R5cGUsCi0gICAgICBjb25zdCBTYk1lZGlhQXVkaW9IZWFkZXImIGF1ZGlvX2hlYWRlciwKLSAgICAgIFNiRHJtU3lzdGVtIGRybV9zeXN0ZW0pOwotICB2aXJ0dWFsIH5BYnN0cmFjdFdpbjMyQXVkaW9EZWNvZGVyKCkge30KLQotICAvLyBJTlBVVDoKLSAgLy8KLSAgdmlydHVhbCBib29sIFRyeVdyaXRlKGNvbnN0IHNjb3BlZF9yZWZwdHI8SW5wdXRCdWZmZXI+JiBidWZmKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBXcml0ZUVuZE9mU3RyZWFtKCkgPSAwOwotICAvLyBPVVRQVVQKLSAgLy8KLSAgdmlydHVhbCBEZWNvZGVkQXVkaW9QdHIgUHJvY2Vzc0FuZFJlYWQoKSA9IDA7Ci0gIC8vIFJlc2V0Ci0gIHZpcnR1YWwgdm9pZCBSZXNldCgpID0gMDsKLQotICAvLyBEeW5hbWljYWxseSBxdWVyeSB0aGUgYXVkaW8gZnJlcXVlbmN5IHRvIHN1cHBvcnQgSEUtQUFDLgotICB2aXJ0dWFsIGludCBHZXRTYW1wbGVzUGVyU2Vjb25kKCkgY29uc3QgPSAwOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHdpbjMyCi19ICAvLyBuYW1lc3BhY2Ugc2hhcmVkCi19ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCi0KLSNlbmRpZiAgLy8gU1RBUkJPQVJEX1NIQVJFRF9XSU4zMl9XSU4zMl9BVURJT19ERUNPREVSX0hfCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi93aW5kb3dfY3JlYXRlLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvd2luZG93X2NyZWF0ZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYwY2JkMi4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi93aW5kb3dfY3JlYXRlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC93aW5kb3cuaCIKLQotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvYXBwbGljYXRpb25fd2luMzIuaCIKLQotdXNpbmcgOjpzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OkFwcGxpY2F0aW9uV2luMzI7Ci0KLVNiV2luZG93IFNiV2luZG93Q3JlYXRlKGNvbnN0IFNiV2luZG93T3B0aW9ucyogb3B0aW9ucykgewotICByZXR1cm4gQXBwbGljYXRpb25XaW4zMjo6R2V0KCktPkNyZWF0ZVdpbmRvd0ZvcldpbjMyKG9wdGlvbnMpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvd2luZG93X2Rlc3Ryb3kuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi93aW5kb3dfZGVzdHJveS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRlMTEyYS4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi93aW5kb3dfZGVzdHJveS5jYworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2FwcGxpY2F0aW9uX3dpbjMyLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3dpbmRvdy5oIgotCi11c2luZyA6OnN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6QXBwbGljYXRpb25XaW4zMjsKLQotYm9vbCBTYldpbmRvd0Rlc3Ryb3koU2JXaW5kb3cgd2luZG93KSB7Ci0gIHJldHVybiBBcHBsaWNhdGlvbldpbjMyOjpHZXQoKS0+RGVzdHJveVdpbmRvdyh3aW5kb3cpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvd2luZG93X2dldF9wbGF0Zm9ybV9oYW5kbGUuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi93aW5kb3dfZ2V0X3BsYXRmb3JtX2hhbmRsZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBmNTkxOS4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi93aW5kb3dfZ2V0X3BsYXRmb3JtX2hhbmRsZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlIDxFR0wvZWdsLmg+Ci0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3dpbmRvd19pbnRlcm5hbC5oIgotI2luY2x1ZGUgInN0YXJib2FyZC93aW5kb3cuaCIKLQotdm9pZCogU2JXaW5kb3dHZXRQbGF0Zm9ybUhhbmRsZShTYldpbmRvdyB3aW5kb3cpIHsKLSAgaWYgKCFTYldpbmRvd0lzVmFsaWQod2luZG93KSkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8RUdMTmF0aXZlV2luZG93VHlwZT4od2luZG93LT5HZXRXaW5kb3dIYW5kbGUoKSk7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi93aW5kb3dfZ2V0X3NpemUuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi93aW5kb3dfZ2V0X3NpemUuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMDAyNDAuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvd2luZG93X2dldF9zaXplLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3dpbmRvd19pbnRlcm5hbC5oIgotI2luY2x1ZGUgInN0YXJib2FyZC93aW5kb3cuaCIKLQotYm9vbCBTYldpbmRvd0dldFNpemUoU2JXaW5kb3cgd2luZG93LCBTYldpbmRvd1NpemUqIHNpemUpIHsKLSAgaWYgKCFTYldpbmRvd0lzVmFsaWQod2luZG93KSkgewotICAgIFNCX0xPRyhFUlJPUikgPDwgX19GVU5DVElPTl9fIDw8ICI6IEludmFsaWQgd2luZG93LiI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgc2l6ZS0+d2lkdGggPSB3aW5kb3ctPndpZHRoOwotICBzaXplLT5oZWlnaHQgPSB3aW5kb3ctPmhlaWdodDsKLSAgLy8gVGhlIHZpZGVvIHJlc29sdXRpb24gaXMgdGhlIHNhbWUgYXMgdGhlIGdyYXBoaWNzIHJlc29sdXRpb24uCi0gIHNpemUtPnZpZGVvX3BpeGVsX3JhdGlvID0gMS4wZjsKLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi93aW5kb3dfaW50ZXJuYWwuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi93aW5kb3dfaW50ZXJuYWwuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYjAwMWUuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvd2luZG93X2ludGVybmFsLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvd2luZG93X2ludGVybmFsLmgiCi0KLS8vIFRPRE86IE1ha2Ugc3VyZSB0aGUgd2lkdGggYW5kIGhlaWdodCBoZXJlIGJlaGF2ZSB3ZWxsIGdpdmVuIHRoYXQgd2Ugd2FudAotLy8gMTA4MCB2aWRlbywgYnV0IHBlcmhhcHMgNGsgVUkgd2hlcmUgYXBwbGljYWJsZS4KLVNiV2luZG93UHJpdmF0ZTo6U2JXaW5kb3dQcml2YXRlKGNvbnN0IFNiV2luZG93T3B0aW9ucyogb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhXTkQgd2luZG93X2hhbmRsZSkKLSAgICA6IHdpZHRoKG9wdGlvbnMtPnNpemUud2lkdGgpLAotICAgICAgaGVpZ2h0KG9wdGlvbnMtPnNpemUuaGVpZ2h0KSwKLSAgICAgIHdpbmRvd19oYW5kbGVfKHdpbmRvd19oYW5kbGUpIHsKLSAgUkVDVCB3aW5kb3dfY2xpZW50X3JlY3Q7Ci0KLSAgaWYgKEdldENsaWVudFJlY3Qod2luZG93X2hhbmRsZV8sICZ3aW5kb3dfY2xpZW50X3JlY3QpKSB7Ci0gICAgd2lkdGggPSB3aW5kb3dfY2xpZW50X3JlY3QucmlnaHQgLSB3aW5kb3dfY2xpZW50X3JlY3QubGVmdDsKLSAgICBoZWlnaHQgPSB3aW5kb3dfY2xpZW50X3JlY3QuYm90dG9tIC0gd2luZG93X2NsaWVudF9yZWN0LnRvcDsKLSAgfQotfQotCi1TYldpbmRvd1ByaXZhdGU6On5TYldpbmRvd1ByaXZhdGUoKSB7fQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvd2luZG93X2ludGVybmFsLmggYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi93aW5kb3dfaW50ZXJuYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU4YTMwOC4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi93aW5kb3dfaW50ZXJuYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpZm5kZWYgU1RBUkJPQVJEX1NIQVJFRF9XSU4zMl9XSU5ET1dfSU5URVJOQUxfSF8KLSNkZWZpbmUgU1RBUkJPQVJEX1NIQVJFRF9XSU4zMl9XSU5ET1dfSU5URVJOQUxfSF8KLQotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLQotLy8gV2luZG93cyBoZWFkZXJzLgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9hdG9taWMuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvdGltZS5oIgotI2luY2x1ZGUgInN0YXJib2FyZC93aW5kb3cuaCIKLQotc3RydWN0IFNiV2luZG93UHJpdmF0ZSB7Ci0gIFNiV2luZG93UHJpdmF0ZShjb25zdCBTYldpbmRvd09wdGlvbnMqIG9wdGlvbnMsIEhXTkQgd2luZG93X2hhbmRsZSk7Ci0gIH5TYldpbmRvd1ByaXZhdGUoKTsKLQotICBIV05EIEdldFdpbmRvd0hhbmRsZSgpIHsgcmV0dXJuIHdpbmRvd19oYW5kbGVfOyB9Ci0KLSAgLy8gVGhlIHdpZHRoIG9mIHRoaXMgd2luZG93LgotICBpbnQgd2lkdGg7Ci0KLSAgLy8gVGhlIGhlaWdodCBvZiB0aGlzIHdpbmRvdy4KLSAgaW50IGhlaWdodDsKLQotIHByaXZhdGU6Ci0gIEhXTkQgd2luZG93X2hhbmRsZV87Ci19OwotCi0jZW5kaWYgIC8vIFNUQVJCT0FSRF9TSEFSRURfV0lOMzJfV0lORE9XX0lOVEVSTkFMX0hfCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi93aW5kb3dfc2V0X2RlZmF1bHRfb3B0aW9ucy5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3dpbmRvd19zZXRfZGVmYXVsdF9vcHRpb25zLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTg5ZjUyLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3dpbmRvd19zZXRfZGVmYXVsdF9vcHRpb25zLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvd2luZG93LmgiCi0KLXZvaWQgU2JXaW5kb3dTZXREZWZhdWx0T3B0aW9ucyhTYldpbmRvd09wdGlvbnMqIG9wdGlvbnMpIHsKLSAgU2JNZW1vcnlTZXQob3B0aW9ucywgMCwgc2l6ZW9mKCpvcHRpb25zKSk7Ci0gIG9wdGlvbnMtPnNpemUud2lkdGggPSAxOTIwOwotICBvcHRpb25zLT5zaXplLmhlaWdodCA9IDEwODA7Ci0gIG9wdGlvbnMtPm5hbWUgPSAiWW91VHViZSI7Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi93cm1faGVhZGVyLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvd3JtX2hlYWRlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcxMDZmYi4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi93cm1faGVhZGVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzk1ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3dybV9oZWFkZXIuaCIKLQotI2luY2x1ZGUgPGd1aWRkZWYuaD4KLSNpbmNsdWRlIDxpbml0Z3VpZC5oPgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2J5dGVfc3dhcC5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2Vycm9yX3V0aWxzLmgiCi0KLW5hbWVzcGFjZSBzdGFyYm9hcmQgewotbmFtZXNwYWNlIHNoYXJlZCB7Ci1uYW1lc3BhY2Ugd2luMzIgewotCi11c2luZyBNaWNyb3NvZnQ6OldSTDo6Q29tUHRyOwotCi1uYW1lc3BhY2UgewotCi0vLyBUaGUgcGxheXJlYWR5IHN5c3RlbSBpZCB1c2VkIHRvIGNyZWF0ZSB0aGUgY29udGVudCBoZWFkZXIuCi1ERUZJTkVfR1VJRChrUGxheXJlYWR5Q29udGVudEhlYWRlckNMU0lELAotICAgICAgICAgICAgMHhGNDYzNzAxMCwKLSAgICAgICAgICAgIDB4MDNDMywKLSAgICAgICAgICAgIDB4NDJDRCwKLSAgICAgICAgICAgIDB4QjksCi0gICAgICAgICAgICAweDMyLAotICAgICAgICAgICAgMHhCNCwKLSAgICAgICAgICAgIDB4OEEsCi0gICAgICAgICAgICAweERGLAotICAgICAgICAgICAgMHgzQSwKLSAgICAgICAgICAgIDB4NkEsCi0gICAgICAgICAgICAweDU0KTsKLQotLy8gVGhlIHBsYXlyZWFkeSBzeXN0ZW0gaWQgdXNlZCB0byBpZGVudGlmeSB0aGUgd3JtIGhlYWRlciBpbiB0aGUKLS8vIGluaXRpYWxpemF0aW9uIGRhdGEuCi1ERUZJTkVfR1VJRChrUGxheXJlYWR5SW5pdGlhbGl6YXRpb25EYXRhQ0xTSUQsCi0gICAgICAgICAgICAweDc5ZjAwNDlhLAotICAgICAgICAgICAgMHg0MDk4LAotICAgICAgICAgICAgMHg4NjQyLAotICAgICAgICAgICAgMHhhYiwKLSAgICAgICAgICAgIDB4OTIsCi0gICAgICAgICAgICAweGU2LAotICAgICAgICAgICAgMHg1YiwKLSAgICAgICAgICAgIDB4ZTAsCi0gICAgICAgICAgICAweDg4LAotICAgICAgICAgICAgMHg1ZiwKLSAgICAgICAgICAgIDB4OTUpOwotCi1jb25zdCB1aW50MTZfdCBrUGxheXJlYWR5V1JNVGFnID0gMHgwMDAxOwotCi1jbGFzcyBSZWFkZXIgewotIHB1YmxpYzoKLSAgUmVhZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW5ndGgpCi0gICAgICA6IHN0YXJ0XyhkYXRhKSwgY3Vycl8oZGF0YSksIGVuZF8oZGF0YSArIGxlbmd0aCkge30KLQotICBzaXplX3QgR2V0UG9zaXRpb24oKSBjb25zdCB7IHJldHVybiBjdXJyXyAtIHN0YXJ0XzsgfQotICBzaXplX3QgR2V0UmVtYWluaW5nKCkgY29uc3QgeyByZXR1cm4gZW5kXyAtIGN1cnJfOyB9Ci0KLSAgY29uc3QgdWludDhfdCogY3VycigpIGNvbnN0IHsgY3Vycl87IH0KLQotICBib29sIFNraXAoc2l6ZV90IGRpc3RhbmNlKSB7Ci0gICAgaWYgKGRpc3RhbmNlID4gR2V0UmVtYWluaW5nKCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgY3Vycl8gKz0gZGlzdGFuY2U7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBib29sIFJlYWRHVUlEKEdVSUQqIGd1aWQpIHsKLSAgICBpZiAoc2l6ZW9mKCpndWlkKSA+IEdldFJlbWFpbmluZygpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIFNiTWVtb3J5Q29weShndWlkLCBjdXJyXywgc2l6ZW9mKCpndWlkKSk7Ci0gICAgY3Vycl8gKz0gc2l6ZW9mKCpndWlkKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGJvb2wgUmVhZEJpZ0VuZGlhblUzMih1aW50MzJfdCogaSkgewotICAgIGlmIChzaXplb2YoKmkpID4gR2V0UmVtYWluaW5nKCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgKmkgPQotICAgICAgICBjdXJyX1swXSAqIDB4MTAwMDAwMCArIGN1cnJfWzFdICogMHgxMDAwMCArIGN1cnJfWzJdICogMHgxMDAgKyBjdXJyX1szXTsKLSAgICBjdXJyXyArPSBzaXplb2YoKmkpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgYm9vbCBSZWFkTGl0dGxlRW5kaWFuVTE2KHVpbnQxNl90KiBpKSB7Ci0gICAgaWYgKHNpemVvZigqaSkgPiBHZXRSZW1haW5pbmcoKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICAqaSA9IGN1cnJfWzBdICsgY3Vycl9bMV0gKiAweDEwMDsKLSAgICBjdXJyXyArPSBzaXplb2YoKmkpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSBwcml2YXRlOgotICBjb25zdCB1aW50OF90KiBjb25zdCBzdGFydF87Ci0gIGNvbnN0IHVpbnQ4X3QqIGN1cnJfOwotICBjb25zdCB1aW50OF90KiBjb25zdCBlbmRfOwotfTsKLQotc3RkOjp2ZWN0b3I8dWludDhfdD4gUGFyc2VXcm1IZWFkZXJGcm9tSW5pdGlhbGl6YXRpb25EYXRhKAotICAgIGNvbnN0IHZvaWQqIGluaXRpYWxpemF0aW9uX2RhdGEsCi0gICAgaW50IGluaXRpYWxpemF0aW9uX2RhdGFfc2l6ZSkgewotICBpZiAoaW5pdGlhbGl6YXRpb25fZGF0YV9zaXplID09IDApIHsKLSAgICBTQl9OT1RJTVBMRU1FTlRFRCgpOwotICAgIHJldHVybiBzdGQ6OnZlY3Rvcjx1aW50OF90PigpOwotICB9Ci0KLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gb3V0cHV0OwotICBjb25zdCB1aW50OF90KiBkYXRhID0gc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCo+KGluaXRpYWxpemF0aW9uX2RhdGEpOwotCi0gIFJlYWRlciByZWFkZXIoZGF0YSwgaW5pdGlhbGl6YXRpb25fZGF0YV9zaXplKTsKLSAgd2hpbGUgKHJlYWRlci5HZXRSZW1haW5pbmcoKSA+IDApIHsKLSAgICAvLyBQYXJzZSBwc3NoIGF0b20gKGJpZyBlbmRpYW4pCi0gICAgLy8KLSAgICAvLyA0IGJ5dGVzIC0tIHNpemUKLSAgICAvLyA0IGJ5dGVzIC0tICJwc3NoIgotICAgIC8vIDQgYnl0ZXMgLS0gZmxhZ3MKLSAgICAvLyAxNiBieXRlcyAtLSBndWlkCi0gICAgdWludDMyX3QgcHNzaF9zaXplOwotICAgIGlmICghcmVhZGVyLlJlYWRCaWdFbmRpYW5VMzIoJnBzc2hfc2l6ZSkpIHsKLSAgICAgIHJldHVybiBvdXRwdXQ7Ci0gICAgfQotCi0gICAgLy8gU2tpcHBpbmcgcHNzaCBhbmQgZmxhZ3MKLSAgICBpZiAoIXJlYWRlci5Ta2lwKDgpKSB7Ci0gICAgICByZXR1cm4gb3V0cHV0OwotICAgIH0KLSAgICBHVUlEIHN5c3RlbV9pZDsKLSAgICBpZiAoIXJlYWRlci5SZWFkR1VJRCgmc3lzdGVtX2lkKSkgewotICAgICAgcmV0dXJuIG91dHB1dDsKLSAgICB9Ci0gICAgaWYgKHN5c3RlbV9pZCAhPSBrUGxheXJlYWR5SW5pdGlhbGl6YXRpb25EYXRhQ0xTSUQpIHsKLSAgICAgIC8vIFNraXAgZW50aXJlIHBzc2ggYXRvbQotICAgICAgaWYgKCFyZWFkZXIuU2tpcChwc3NoX3NpemUgLSAyOCkpIHsKLSAgICAgICAgcmV0dXJuIG91dHB1dDsKLSAgICAgIH0KLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIC8vIDQgYnl0ZXMgLS0gc2l6ZSBvZiBQbGF5cmVhZHlPYmplY3QKLSAgICAvLyBmb2xsb3dlZCBieSBQbGF5cmVhZHlPYmplY3QKLQotICAgIC8vIFNraXAgc2l6ZSwgYW5kIGNvbnRpbnVlIHBhcnNpbmcKLSAgICBpZiAoIXJlYWRlci5Ta2lwKDQpKSB7Ci0gICAgICByZXR1cm4gb3V0cHV0OwotICAgIH0KLQotICAgIC8vIFBhcnNlIFBsYXlyZWFkeSBvYmplY3QgKGxpdHRsZSBlbmRpYW4pCi0gICAgLy8gNCBieXRlcyAtLSBzaXplCi0gICAgLy8gMiBieXRlcyAtLSByZWNvcmQgY291bnQKLSAgICAvLwotICAgIC8vIFBsYXlyZWFkeSBSZWNvcmQKLSAgICAvLyAyIGJ5dGVzIC0tIHR5cGUKLSAgICAvLyAyIGJ5dGVzIC0tIHNpemUgb2YgcmVjb3JkCi0gICAgLy8gbiBieXRlcyAtLSByZWNvcmQKLSAgICBpZiAoIXJlYWRlci5Ta2lwKDQpKSB7Ci0gICAgICByZXR1cm4gb3V0cHV0OwotICAgIH0KLSAgICB1aW50MTZfdCBudW1fcmVjb3JkczsKLSAgICBpZiAoIXJlYWRlci5SZWFkTGl0dGxlRW5kaWFuVTE2KCZudW1fcmVjb3JkcykpIHsKLSAgICAgIHJldHVybiBvdXRwdXQ7Ci0gICAgfQotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fcmVjb3JkczsgaSsrKSB7Ci0gICAgICB1aW50MTZfdCByZWNvcmRfdHlwZTsKLSAgICAgIGlmICghcmVhZGVyLlJlYWRMaXR0bGVFbmRpYW5VMTYoJnJlY29yZF90eXBlKSkgewotICAgICAgICByZXR1cm4gb3V0cHV0OwotICAgICAgfQotICAgICAgdWludDE2X3QgcmVjb3JkX3NpemU7Ci0gICAgICBpZiAoIXJlYWRlci5SZWFkTGl0dGxlRW5kaWFuVTE2KCZyZWNvcmRfc2l6ZSkpIHsKLSAgICAgICAgcmV0dXJuIG91dHB1dDsKLSAgICAgIH0KLSAgICAgIGlmICgocmVjb3JkX3R5cGUgJiBrUGxheXJlYWR5V1JNVGFnKSA9PSBrUGxheXJlYWR5V1JNVGFnKSB7Ci0gICAgICAgIHN0ZDo6Y29weShkYXRhICsgcmVhZGVyLkdldFBvc2l0aW9uKCksCi0gICAgICAgICAgICAgICAgICBkYXRhICsgcmVhZGVyLkdldFBvc2l0aW9uKCkgKyByZWNvcmRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcihvdXRwdXQpKTsKLSAgICAgICAgcmV0dXJuIG91dHB1dDsKLSAgICAgIH0KLSAgICAgIGlmICghcmVhZGVyLlNraXAocmVjb3JkX3NpemUpKSB7Ci0gICAgICAgIHJldHVybiBvdXRwdXQ7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIG91dHB1dDsKLX0KLQotdWludDMyX3QgQmFzZTY0VG9WYWx1ZSh1aW50OF90IGJ5dGUpIHsKLSAgaWYgKGJ5dGUgPj0gJ0EnICYmIGJ5dGUgPD0gJ1onKSB7Ci0gICAgcmV0dXJuIGJ5dGUgLSAnQSc7Ci0gIH0KLSAgaWYgKGJ5dGUgPj0gJ2EnICYmIGJ5dGUgPD0gJ3onKSB7Ci0gICAgcmV0dXJuIGJ5dGUgLSAnYScgKyAyNjsKLSAgfQotICBpZiAoYnl0ZSA+PSAnMCcgJiYgYnl0ZSA8PSAnOScpIHsKLSAgICByZXR1cm4gYnl0ZSAtICcwJyArIDUyOwotICB9Ci0gIGlmIChieXRlID09ICcrJykgewotICAgIHJldHVybiA2MjsKLSAgfQotICBpZiAoYnl0ZSA9PSAnLycpIHsKLSAgICByZXR1cm4gNjM7Ci0gIH0KLSAgU0JfRENIRUNLKGJ5dGUgPT0gJz0nKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0ZDo6c3RyaW5nIEJhc2U2NERlY29kZShjb25zdCBzdGQ6OndzdHJpbmcmIGlucHV0KSB7Ci0gIFNCX0RDSEVDSyhpbnB1dC5zaXplKCkgJSA0ID09IDApOwotCi0gIHN0ZDo6c3RyaW5nIG91dHB1dDsKLQotICBvdXRwdXQucmVzZXJ2ZShpbnB1dC5zaXplKCkgLyA0ICogMyk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5wdXQuc2l6ZSgpIC0gMzsgaSArPSA0KSB7Ci0gICAgdWludDMyX3QgZGVjb2RlZCA9Ci0gICAgICAgIEJhc2U2NFRvVmFsdWUoaW5wdXRbaV0pICogNCArIEJhc2U2NFRvVmFsdWUoaW5wdXRbaSArIDFdKSAvIDE2OwotICAgIG91dHB1dCArPSBzdGF0aWNfY2FzdDxjaGFyPihkZWNvZGVkKTsKLSAgICBpZiAoaW5wdXRbaSArIDJdICE9ICc9JykgewotICAgICAgZGVjb2RlZCA9IEJhc2U2NFRvVmFsdWUoaW5wdXRbaSArIDFdKSAlIDE2ICogMTYgKwotICAgICAgICAgICAgICAgIEJhc2U2NFRvVmFsdWUoaW5wdXRbaSArIDJdKSAvIDQ7Ci0gICAgICBvdXRwdXQgKz0gc3RhdGljX2Nhc3Q8Y2hhcj4oZGVjb2RlZCk7Ci0gICAgICBpZiAoaW5wdXRbaSArIDNdICE9ICc9JykgewotICAgICAgICBkZWNvZGVkID0KLSAgICAgICAgICAgIEJhc2U2NFRvVmFsdWUoaW5wdXRbaSArIDJdKSAlIDQgKiA2NCArIEJhc2U2NFRvVmFsdWUoaW5wdXRbaSArIDNdKTsKLSAgICAgICAgb3V0cHV0ICs9IHN0YXRpY19jYXN0PGNoYXI+KGRlY29kZWQpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHJldHVybiBvdXRwdXQ7Ci19Ci0KLUdVSUQgUGFyc2VLZXlJZEZyb21Xcm1IZWFkZXIoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHdybV9oZWFkZXIpIHsKLSAgLy8gVGhlIHdybV9oZWFkZXIgaXMgYW4gWE1MIGluIHdjaGFyX3QgdGhhdCBjb250YWlucyB0aGUgYmFzZTY0IGVuY29kZWQga2V5Ci0gIC8vIGlkIGluIDxLSUQ+IG5vZGUgaW4gYmFzZTY0LiAgVGhlIG9yaWdpbmFsIGtleSBpZCBzaG91bGQgYmUgMTYgY2hhcmFjdGVycywKLSAgLy8gc28gaXQgaXMgMjQgY2hhcmFjdGVycyBhZnRlciBiYXNlZDY0IGVuY29kZWQuCi0gIGNvbnN0IHNpemVfdCBrRW5jb2RlZEtleUlkTGVuZ3RoID0gMjQ7Ci0KLSAgU0JfRENIRUNLKHdybV9oZWFkZXIuc2l6ZSgpICUgMiA9PSAwKTsKLSAgc3RkOjp3c3RyaW5nIHdybV9oZWFkZXJfY29weSgKLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgd2NoYXJfdCo+KHdybV9oZWFkZXIuZGF0YSgpKSwKLSAgICAgIHdybV9oZWFkZXIuc2l6ZSgpIC8gMik7Ci0gIHN0ZDo6d3N0cmluZzo6c2l6ZV90eXBlIGJlZ2luID0gd3JtX2hlYWRlcl9jb3B5LmZpbmQoTCI8S0lEPiIpOwotICBpZiAoYmVnaW4gPT0gd3JtX2hlYWRlcl9jb3B5Lm5wb3MpIHsKLSAgICByZXR1cm4gV3JtSGVhZGVyOjprSW52YWxpZEtleUlkOwotICB9Ci0gIHN0ZDo6d3N0cmluZzo6c2l6ZV90eXBlIGVuZCA9IHdybV9oZWFkZXJfY29weS5maW5kKEwiPC9LSUQ+IiwgYmVnaW4pOwotICBpZiAoZW5kID09IHdybV9oZWFkZXJfY29weS5ucG9zKSB7Ci0gICAgcmV0dXJuIFdybUhlYWRlcjo6a0ludmFsaWRLZXlJZDsKLSAgfQotICBiZWdpbiArPSA1OwotICBpZiAoZW5kIC0gYmVnaW4gIT0ga0VuY29kZWRLZXlJZExlbmd0aCkgewotICAgIHJldHVybiBXcm1IZWFkZXI6OmtJbnZhbGlkS2V5SWQ7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBrZXlfaWRfaW5fc3RyaW5nID0KLSAgICAgIEJhc2U2NERlY29kZSh3cm1faGVhZGVyX2NvcHkuc3Vic3RyKGJlZ2luLCBrRW5jb2RlZEtleUlkTGVuZ3RoKSk7Ci0gIGlmIChrZXlfaWRfaW5fc3RyaW5nLnNpemUoKSAhPSBzaXplb2YoR1VJRCkpIHsKLSAgICByZXR1cm4gV3JtSGVhZGVyOjprSW52YWxpZEtleUlkOwotICB9Ci0KLSAgR1VJRCBrZXlfaWQgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBHVUlEKj4oa2V5X2lkX2luX3N0cmluZy5kYXRhKCkpOwotCi0gIGtleV9pZC5EYXRhMSA9IFNiQnl0ZVN3YXAoa2V5X2lkLkRhdGExKTsKLSAga2V5X2lkLkRhdGEyID0gU2JCeXRlU3dhcChrZXlfaWQuRGF0YTIpOwotICBrZXlfaWQuRGF0YTMgPSBTYkJ5dGVTd2FwKGtleV9pZC5EYXRhMyk7Ci0KLSAgcmV0dXJuIGtleV9pZDsKLX0KLQotQ29tUHRyPElTdHJlYW0+IENyZWF0ZVdybUhlYWRlclN0cmVhbShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgd3JtX2hlYWRlcikgewotICBDb21QdHI8SVN0cmVhbT4gc3RyZWFtOwotICBIUkVTVUxUIGhyID0gQ3JlYXRlU3RyZWFtT25IR2xvYmFsKE5VTEwsIFRSVUUsICZzdHJlYW0pOwotICBpZiAoRkFJTEVEKGhyKSkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgRFdPUkQgd3JtX2hlYWRlcl9zaXplID0gc3RhdGljX2Nhc3Q8RFdPUkQ+KHdybV9oZWFkZXIuc2l6ZSgpKTsKLSAgVUxPTkcgYnl0ZXNfd3JpdHRlbiA9IDA7Ci0KLSAgaWYgKHdybV9oZWFkZXJfc2l6ZSAhPSAwKSB7Ci0gICAgaHIgPSBzdHJlYW0tPldyaXRlKHdybV9oZWFkZXIuZGF0YSgpLCB3cm1faGVhZGVyX3NpemUsICZieXRlc193cml0dGVuKTsKLSAgICBpZiAoRkFJTEVEKGhyKSkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHN0cmVhbTsKLX0KLQotQ29tUHRyPElTdHJlYW0+IENyZWF0ZUNvbnRlbnRIZWFkZXJGcm9tV3JtSGVhZGVyKAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiB3cm1faGVhZGVyKSB7Ci0gIENvbVB0cjxJU3RyZWFtPiBjb250ZW50X2hlYWRlcjsKLSAgLy8gQXNzdW1lIHdlIHVzZSBvbmUgbGljZW5zZSBmb3Igb25lIHN0cmVhbS4KLSAgY29uc3QgRFdPUkQga051bVN0cmVhbXMgPSAxOwotICBjb25zdCBEV09SRCBrTmV4dFN0cmVhbUlkID0gc3RhdGljX2Nhc3Q8RFdPUkQ+KC0xKTsKLQotICBIUkVTVUxUIGhyID0gQ3JlYXRlU3RyZWFtT25IR2xvYmFsKE5VTEwsIFRSVUUsICZjb250ZW50X2hlYWRlcik7Ci0gIGlmIChGQUlMRUQoaHIpKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICAvLyBJbml0aWFsaXplIHNwSW5pdFN0bSB3aXRoIHRoZSByZXF1aXJlZCBkYXRhCi0gIC8vIEZvcm1hdDogKEFsbCBEV09SRCB2YWx1ZXMgYXJlIHNlcmlhbGl6ZWQgaW4gbGl0dGxlLWVuZGlhbiBvcmRlcikKLSAgLy8gW0dVSUQgKGNvbnRlbnQgcHJvdGVjdGlvbiBzeXN0ZW0gZ3VpZCwgc2VlIG1zcHJpdGEuaWRsKV0KLSAgLy8gW0RXT1JEIChzdHJlYW0gY291bnQsIHVzZSB0aGUgYWN0dWFsIHN0cmVhbSBjb3VudCBldmVuIGlmIGFsbCBzdHJlYW1zIGFyZQotICAvLyBlbmNyeXB0ZWQgdXNpbmcgdGhlIHNhbWUgZGF0YSwgbm90ZSB0aGF0IHplcm8gaXMgaW52YWxpZCldIFtEV09SRCAobmV4dAotICAvLyBzdHJlYW0gSUQsIHVzZSAtMSBpZiBhbGwgcmVtYWluaW5nIHN0cmVhbXMgYXJlIGVuY3J5cHRlZCB1c2luZyB0aGUgc2FtZQotICAvLyBkYXRhKV0gW0RXT1JEIChuZXh0IHN0cmVhbSdzIGJpbmFyeSBkYXRhIHNpemUpXSBbQllURSogKG5leHQgc3RyZWFtJ3MKLSAgLy8gYmluYXJ5IGRhdGEpXSB7IFJlcGVhdCBmcm9tICJuZXh0IHN0cmVhbSBJRCIgYWJvdmUgZm9yIGVhY2ggc3RyZWFtIH0KLSAgRFdPUkQgd3JtX2hlYWRlcl9zaXplID0gc3RhdGljX2Nhc3Q8RFdPUkQ+KHdybV9oZWFkZXIuc2l6ZSgpKTsKLSAgVUxPTkcgYnl0ZXNfd3JpdHRlbiA9IDA7Ci0gIGhyID0gY29udGVudF9oZWFkZXItPldyaXRlKCZrUGxheXJlYWR5Q29udGVudEhlYWRlckNMU0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoa1BsYXlyZWFkeUNvbnRlbnRIZWFkZXJDTFNJRCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlc193cml0dGVuKTsKLSAgaWYgKEZBSUxFRChocikpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGhyID0gY29udGVudF9oZWFkZXItPldyaXRlKCZrTnVtU3RyZWFtcywgc2l6ZW9mKGtOdW1TdHJlYW1zKSwgJmJ5dGVzX3dyaXR0ZW4pOwotICBpZiAoRkFJTEVEKGhyKSkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgaHIgPSBjb250ZW50X2hlYWRlci0+V3JpdGUoJmtOZXh0U3RyZWFtSWQsIHNpemVvZihrTmV4dFN0cmVhbUlkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzX3dyaXR0ZW4pOwotICBpZiAoRkFJTEVEKGhyKSkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgaHIgPSBjb250ZW50X2hlYWRlci0+V3JpdGUoJndybV9oZWFkZXJfc2l6ZSwgc2l6ZW9mKHdybV9oZWFkZXJfc2l6ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlc193cml0dGVuKTsKLSAgaWYgKEZBSUxFRChocikpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGlmICgwICE9IHdybV9oZWFkZXJfc2l6ZSkgewotICAgIGhyID0gY29udGVudF9oZWFkZXItPldyaXRlKHdybV9oZWFkZXIuZGF0YSgpLCB3cm1faGVhZGVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzX3dyaXR0ZW4pOwotICAgIGlmIChGQUlMRUQoaHIpKSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gY29udGVudF9oZWFkZXI7Ci19Ci0KLUNvbVB0cjxJU3RyZWFtPiBSZXNldFN0cmVhbVBvc2l0aW9uKGNvbnN0IENvbVB0cjxJU3RyZWFtPiYgc3RyZWFtKSB7Ci0gIGlmIChzdHJlYW0gPT0gTlVMTCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIExBUkdFX0lOVEVHRVIgc2Vla19wb3NpdGlvbiA9IHswfTsKLSAgSFJFU1VMVCBociA9IHN0cmVhbS0+U2VlayhzZWVrX3Bvc2l0aW9uLCBTVFJFQU1fU0VFS19TRVQsIE5VTEwpOwotICBDaGVja1Jlc3VsdChocik7Ci0gIHJldHVybiBzdHJlYW07Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZS4KLQotLy8gc3RhdGljCi1HVUlEIFdybUhlYWRlcjo6a0ludmFsaWRLZXlJZDsKLQotV3JtSGVhZGVyOjpXcm1IZWFkZXIoY29uc3Qgdm9pZCogaW5pdGlhbGl6YXRpb25fZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgIGludCBpbml0aWFsaXphdGlvbl9kYXRhX3NpemUpIHsKLSAgd3JtX2hlYWRlcl8gPSBQYXJzZVdybUhlYWRlckZyb21Jbml0aWFsaXphdGlvbkRhdGEoaW5pdGlhbGl6YXRpb25fZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25fZGF0YV9zaXplKTsKLSAga2V5X2lkXyA9IFBhcnNlS2V5SWRGcm9tV3JtSGVhZGVyKHdybV9oZWFkZXJfKTsKLX0KLQotQ29tUHRyPElTdHJlYW0+IFdybUhlYWRlcjo6Y29udGVudF9oZWFkZXIoKSBjb25zdCB7Ci0gIFNCX0RDSEVDSyhpc192YWxpZCgpKTsKLQotICBpZiAoa2V5X2lkXyA9PSBrSW52YWxpZEtleUlkKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgcmV0dXJuIFJlc2V0U3RyZWFtUG9zaXRpb24oQ3JlYXRlQ29udGVudEhlYWRlckZyb21Xcm1IZWFkZXIod3JtX2hlYWRlcl8pKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHdpbjMyCi19ICAvLyBuYW1lc3BhY2Ugc2hhcmVkCi19ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi93cm1faGVhZGVyLmggYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi93cm1faGVhZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMjQ4ZDIuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvd3JtX2hlYWRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBTVEFSQk9BUkRfU0hBUkVEX1dJTjMyX1dSTV9IRUFERVJfSF8KLSNkZWZpbmUgU1RBUkJPQVJEX1NIQVJFRF9XSU4zMl9XUk1fSEVBREVSX0hfCi0KLSNpbmNsdWRlIDxvYmppZGwuaD4KLSNpbmNsdWRlIDx3cmwuaD4KLSNpbmNsdWRlIDx3cmwvY2xpZW50Lmg+Ci0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC90eXBlcy5oIgotCi1uYW1lc3BhY2Ugc3RhcmJvYXJkIHsKLW5hbWVzcGFjZSBzaGFyZWQgewotbmFtZXNwYWNlIHdpbjMyIHsKLQotY2xhc3MgV3JtSGVhZGVyIHsKLSBwdWJsaWM6Ci0gIFdybUhlYWRlcihjb25zdCB2b2lkKiBpbml0aWFsaXphdGlvbl9kYXRhLCBpbnQgaW5pdGlhbGl6YXRpb25fZGF0YV9zaXplKTsKLQotICBzdGF0aWMgR1VJRCBrSW52YWxpZEtleUlkOwotCi0gIGJvb2wgaXNfdmFsaWQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGtleV9pZF8gIT0ga0ludmFsaWRLZXlJZCAmJiAhd3JtX2hlYWRlcl8uZW1wdHkoKTsKLSAgfQotICBjb25zdCBHVUlEJiBrZXlfaWQoKSBjb25zdCB7Ci0gICAgU0JfRENIRUNLKGlzX3ZhbGlkKCkpOwotICAgIHJldHVybiBrZXlfaWRfOwotICB9Ci0gIE1pY3Jvc29mdDo6V1JMOjpDb21QdHI8SVN0cmVhbT4gY29udGVudF9oZWFkZXIoKSBjb25zdDsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHdybV9oZWFkZXIoKSBjb25zdCB7IHJldHVybiB3cm1faGVhZGVyXzsgfQotCi0gcHJpdmF0ZToKLSAgR1VJRCBrZXlfaWRfOwotICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB3cm1faGVhZGVyXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSB3aW4zMgotfSAgLy8gbmFtZXNwYWNlIHNoYXJlZAotfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZAotCi0jZW5kaWYgIC8vIFNUQVJCT0FSRF9TSEFSRURfV0lOMzJfV1JNX0hFQURFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQveDExL2FwcGxpY2F0aW9uX3gxMS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3gxMS9hcHBsaWNhdGlvbl94MTEuY2MKaW5kZXggOWJjNWVmYy4uMTFmYTk2MyAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQveDExL2FwcGxpY2F0aW9uX3gxMS5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC94MTEvYXBwbGljYXRpb25feDExLmNjCkBAIC02OTYsOCArNjk2LDYgQEAKICAgICA6IHdha2VfdXBfYXRvbV8oTm9uZSksCiAgICAgICB3bV9kZWxldGVfYXRvbV8oTm9uZSksCiAgICAgICBjb21wb3NpdGVfZXZlbnRfaWRfKGtTYkV2ZW50SWRJbnZhbGlkKSwKLSAgICAgIGZyYW1lX3JlYWRfaW5kZXhfKDApLAotICAgICAgZnJhbWVzX3VwZGF0ZWRfKGZhbHNlKSwKICAgICAgIGRpc3BsYXlfKE5VTEwpLAogICAgICAgcGFzdGVfYnVmZmVyX2tleV9yZWxlYXNlX3BlbmRpbmdfKGZhbHNlKSB7CiAgIFNiQXVkaW9TaW5rUHJpdmF0ZTo6SW5pdGlhbGl6ZSgpOwpAQCAtNzU1LDM0ICs3NTMsMjcgQEAKICAgaWYgKCF3aW5kb3dzXy5lbXB0eSgpKSB7CiAgICAgU2JXaW5kb3cgd2luZG93ID0gd2luZG93c19bMF07CiAgICAgaWYgKFNiV2luZG93SXNWYWxpZCh3aW5kb3cpKSB7Ci0gICAgICBzdGQ6Om1hcDxpbnQsIEZyYW1lSW5mbz4gZnJhbWVfaW5mb3M7Ci0gICAgICB7Ci0gICAgICAgIFNjb3BlZExvY2sgbG9jayhmcmFtZV9tdXRleF8pOwotICAgICAgICBpZiAoZnJhbWVzX3VwZGF0ZWRfKSB7Ci0gICAgICAgICAgLy8gSW5jcmVtZW50IHRoZSBpbmRleCB0byB0aGUgbmV4dCBmcmFtZSwgd2hpY2ggaGFzIGJlZW4gd3JpdHRlbi4KLSAgICAgICAgICBmcmFtZV9yZWFkX2luZGV4XyA9IChmcmFtZV9yZWFkX2luZGV4XyArIDEpICUga051bUZyYW1lczsKLSAgICAgICAgICBmcmFtZV9pbmZvcy5zd2FwKGZyYW1lX2luZm9zX1tmcmFtZV9yZWFkX2luZGV4X10pOworICAgICAgU2NvcGVkTG9jayBsb2NrKGZyYW1lX211dGV4Xyk7CiAKLSAgICAgICAgICAvLyBDbGVhciB0aGUgZnJhbWUgd3JpdHRlbiBmbGFnLCBzbyB3ZSB3aWxsIG5vdCBhZHZhbmNlIGZyYW1lcyB1bnRpbAotICAgICAgICAgIC8vIHRoZSBuZXh0IGZyYW1lIGlzIHdyaXR0ZW4uCi0gICAgICAgICAgZnJhbWVzX3VwZGF0ZWRfID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KICAgICAgIHdpbmRvdy0+QmVnaW5Db21wb3NpdGUoKTsKLSAgICAgIGZvciAoYXV0byYgaXRlciA6IGZyYW1lX2luZm9zKSB7Ci0gICAgICAgIEZyYW1lSW5mbyYgZnJhbWVfaW5mbyA9IGl0ZXIuc2Vjb25kOwotCi0gICAgICAgIGlmIChmcmFtZV9pbmZvLmZyYW1lLT5pc19lbmRfb2Zfc3RyZWFtKCkpIHsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCisgICAgICBmb3IgKGF1dG8mIGZyYW1lX2luZm8gOiBjdXJyZW50X3ZpZGVvX2JvdW5kc18pIHsKKyAgICAgICAgLy8gR2V0IHRoZSBjYWNoZWQgdmlkZW8gZnJhbWUuCisgICAgICAgIFNiUGxheWVyIHBsYXllciA9IGZyYW1lX2luZm8ucGxheWVyOwogICAgICAgICBzY29wZWRfcmVmcHRyPENwdVZpZGVvRnJhbWU+IGNwdV92aWRlb19mcmFtZSA9Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxDcHVWaWRlb0ZyYW1lKj4oZnJhbWVfaW5mby5mcmFtZS5nZXQoKSk7Ci0KLSAgICAgICAgaWYgKGNwdV92aWRlb19mcmFtZSAmJgotICAgICAgICAgICAgY3B1X3ZpZGVvX2ZyYW1lLT5mb3JtYXQoKSAhPSBDcHVWaWRlb0ZyYW1lOjprQkdSQTMyKSB7Ci0gICAgICAgICAgY3B1X3ZpZGVvX2ZyYW1lID0gY3B1X3ZpZGVvX2ZyYW1lLT5Db252ZXJ0VG8oQ3B1VmlkZW9GcmFtZTo6a0JHUkEzMik7Ci0gICAgICAgICAgZnJhbWVfaW5mby5mcmFtZSA9IGNwdV92aWRlb19mcmFtZTsKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PENwdVZpZGVvRnJhbWUqPihjdXJyZW50X3ZpZGVvX2ZyYW1lc19bcGxheWVyXS5nZXQoKSk7CisgICAgICAgIGlmICghY3B1X3ZpZGVvX2ZyYW1lKSB7CisgICAgICAgICAgLy8gTmVlZCB0byBnZW5lcmF0ZSBhIG5ldyB2aWRlbyBmcmFtZS4KKyAgICAgICAgICBjcHVfdmlkZW9fZnJhbWUgPQorICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDcHVWaWRlb0ZyYW1lKj4obmV4dF92aWRlb19mcmFtZXNfW3BsYXllcl0uZ2V0KCkpOworICAgICAgICAgIGlmICghY3B1X3ZpZGVvX2ZyYW1lKSB7CisgICAgICAgICAgICAvLyBUaGUgcGxheWVyIHdhcyBhbHJlYWR5IGRlc3Ryb3llZCwgc28gbm90aGluZyB0byByZW5kZXIuCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGNwdV92aWRlb19mcmFtZS0+Zm9ybWF0KCkgIT0gQ3B1VmlkZW9GcmFtZTo6a0JHUkEzMikgeworICAgICAgICAgICAgY3B1X3ZpZGVvX2ZyYW1lID0gY3B1X3ZpZGVvX2ZyYW1lLT5Db252ZXJ0VG8oCisgICAgICAgICAgICAgICAgQ3B1VmlkZW9GcmFtZTo6a0JHUkEzMik7CisgICAgICAgICAgfQorICAgICAgICAgIGN1cnJlbnRfdmlkZW9fZnJhbWVzX1twbGF5ZXJdID0gY3B1X3ZpZGVvX2ZyYW1lOwogICAgICAgICB9CiAgICAgICAgIHdpbmRvdy0+Q29tcG9zaXRlVmlkZW9GcmFtZShmcmFtZV9pbmZvLngsIGZyYW1lX2luZm8ueSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lX2luZm8ud2lkdGgsIGZyYW1lX2luZm8uaGVpZ2h0LApAQCAtODAzLDI4ICs3OTQsNTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQpIHsKICAgU2NvcGVkTG9jayBsb2NrKGZyYW1lX211dGV4Xyk7Ci0gIC8vIEFsd2F5cyB3cml0ZSBhaGVhZCAxIGZyYW1lIG9mIHRoZSBjdXJyZW50IHJlYWQgZnJhbWUuCi0gIGludCB3cml0ZV9pbmRleCA9IChmcmFtZV9yZWFkX2luZGV4XyArIDEpICUga051bUZyYW1lczsKIAotICBmb3IgKGF1dG8gaXRlciA9IGZyYW1lX2luZm9zX1t3cml0ZV9pbmRleF0uYmVnaW4oKTsKLSAgICAgICBpdGVyICE9IGZyYW1lX2luZm9zX1t3cml0ZV9pbmRleF0uZW5kKCk7ICsraXRlcikgewotICAgIGlmIChpdGVyLT5zZWNvbmQucGxheWVyID09IHBsYXllcikgewotICAgICAgZnJhbWVfaW5mb3NfW3dyaXRlX2luZGV4XS5lcmFzZShpdGVyKTsKLSAgICAgIGJyZWFrOwotICAgIH0KKyAgaWYgKGZyYW1lLT5pc19lbmRfb2Zfc3RyZWFtKCkpIHsKKyAgICAvLyBSZW1vdmUgYWxsIHJlZmVyZW5jZXMgdGhlIHRoZSBwbGF5ZXIgYW5kIGl0cyByZXNvdXJjZXMuCisgICAgbmV4dF92aWRlb19mcmFtZXNfLmVyYXNlKHBsYXllcik7CisgICAgbmV4dF92aWRlb19ib3VuZHNfLmVyYXNlKHBsYXllcik7CisgIH0gZWxzZSB7CisgICAgbmV4dF92aWRlb19mcmFtZXNfW3BsYXllcl0gPSBmcmFtZTsKICAgfQogCi0gIC8vIENvcHkgdGhlIGZyYW1lLgotICBGcmFtZUluZm8mIGZyYW1lX2luZm8gPSBmcmFtZV9pbmZvc19bd3JpdGVfaW5kZXhdW3pfaW5kZXhdOworICAvLyBJbnZhbGlkYXRlIHRoZSBjYWNoZSBvZiB0aGlzIHBsYXllcidzIGN1cnJlbnQgZnJhbWUuCisgIGN1cnJlbnRfdmlkZW9fZnJhbWVzXy5lcmFzZShwbGF5ZXIpOworfQorCit2b2lkIEFwcGxpY2F0aW9uWDExOjpTd2FwQnVmZmVyc0JlZ2luKCkgeworICAvLyBQcmV2ZW50IGNvbXBvc2l0aW5nIHdoaWxlIHRoZSBHTCBsYXllciBpcyBjaGFuZ2luZy4KKyAgZnJhbWVfbXV0ZXhfLkFjcXVpcmUoKTsKK30KKwordm9pZCBBcHBsaWNhdGlvblgxMTo6U3dhcEJ1ZmZlcnNFbmQoKSB7CisgIC8vIERldGVybWluZSB0aGUgdmlkZW8gYm91bmRzIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2l0aCB0aGUgbmV3IEdMIGxheWVyLgorCisgIC8vIFNvcnQgdGhlIHZpZGVvIGJvdW5kcyBhY2NvcmRpbmcgdG8gdGhlaXIgel9pbmRleC4KKyAgY3VycmVudF92aWRlb19ib3VuZHNfLmNsZWFyKCk7CisgIGZvciAoYXV0byYgaXRlciA6IG5leHRfdmlkZW9fYm91bmRzXykgeworICAgIGNvbnN0IEZyYW1lSW5mbyYgYm91bmRzID0gaXRlci5zZWNvbmQ7CisgICAgYXV0byBwb3NpdGlvbiA9IGN1cnJlbnRfdmlkZW9fYm91bmRzXy5iZWdpbigpOworICAgIHdoaWxlIChwb3NpdGlvbiAhPSBjdXJyZW50X3ZpZGVvX2JvdW5kc18uZW5kKCkpIHsKKyAgICAgIGlmIChib3VuZHMuel9pbmRleCA8IHBvc2l0aW9uLT56X2luZGV4KSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgKytwb3NpdGlvbjsKKyAgICB9CisgICAgY3VycmVudF92aWRlb19ib3VuZHNfLmluc2VydChwb3NpdGlvbiwgYm91bmRzKTsKKyAgfQorCisgIGZyYW1lX211dGV4Xy5SZWxlYXNlKCk7Cit9CisKK3ZvaWQgQXBwbGljYXRpb25YMTE6OlBsYXllclNldEJvdW5kcyhTYlBsYXllciBwbGF5ZXIsCisgICAgaW50IHpfaW5kZXgsIGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgIFNjb3BlZExvY2sgbG9jayhmcmFtZV9tdXRleF8pOworCisgIC8vIFRoZSBib3VuZHMgc2hvdWxkIG9ubHkgdGFrZSBlZmZlY3Qgb25jZSB0aGUgVUkgZnJhbWUgaXMgc3VibWl0dGVkLgorICBGcmFtZUluZm8mIGZyYW1lX2luZm8gPSBuZXh0X3ZpZGVvX2JvdW5kc19bcGxheWVyXTsKICAgZnJhbWVfaW5mby5wbGF5ZXIgPSBwbGF5ZXI7Ci0gIGZyYW1lX2luZm8uZnJhbWUgPSBmcmFtZTsKICAgZnJhbWVfaW5mby56X2luZGV4ID0gel9pbmRleDsKICAgZnJhbWVfaW5mby54ID0geDsKICAgZnJhbWVfaW5mby55ID0geTsKICAgZnJhbWVfaW5mby53aWR0aCA9IHdpZHRoOwogICBmcmFtZV9pbmZvLmhlaWdodCA9IGhlaWdodDsKLQotICBmcmFtZXNfdXBkYXRlZF8gPSB0cnVlOwogfQogCiB2b2lkIEFwcGxpY2F0aW9uWDExOjpJbml0aWFsaXplKCkgewpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQveDExL2FwcGxpY2F0aW9uX3gxMS5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQveDExL2FwcGxpY2F0aW9uX3gxMS5oCmluZGV4IDg0MTY3MDUuLmEyY2Y2OTMgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3gxMS9hcHBsaWNhdGlvbl94MTEuaAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC94MTEvYXBwbGljYXRpb25feDExLmgKQEAgLTE3LDggKzE3LDggQEAKIAogI2luY2x1ZGUgPFgxMS9YbGliLmg+CiAKLSNpbmNsdWRlIDxtYXA+CiAjaW5jbHVkZSA8cXVldWU+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCkBAIC00OCw4ICs0OCwxNSBAQAogICBTYldpbmRvdyBDcmVhdGVXaW5kb3coY29uc3QgU2JXaW5kb3dPcHRpb25zKiBvcHRpb25zKTsKICAgYm9vbCBEZXN0cm95V2luZG93KFNiV2luZG93IHdpbmRvdyk7CiAKKyAgLy8gTWFrZSB0aGUgY3VycmVudCBHTCBsYXllciBhbmQgdmlkZW8gbGF5ZXIgdmlzaWJsZS4KICAgdm9pZCBDb21wb3NpdGUoKTsKIAorICAvLyBDYWxsIHRoaXMgZnVuY3Rpb24gYmVmb3JlIHVwZGF0aW5nIHRoZSBHTCBsYXllci4KKyAgdm9pZCBTd2FwQnVmZmVyc0JlZ2luKCk7CisKKyAgLy8gQ2FsbCB0aGlzIGZ1bmN0aW9uIGFmdGVyIHRoZSBHTCBsYXllciBoYXMgYmVlbiB1cGRhdGVkLgorICB2b2lkIFN3YXBCdWZmZXJzRW5kKCk7CisKICBwcm90ZWN0ZWQ6CiAgIHZvaWQgQWNjZXB0RnJhbWUoU2JQbGF5ZXIgcGxheWVyLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4mIGZyYW1lLApAQCAtNjQsNiArNzEsMTMgQEAKICAgYm9vbCBJc1ByZWxvYWRJbW1lZGlhdGUoKSBvdmVycmlkZSB7IHJldHVybiBIYXNQcmVsb2FkU3dpdGNoKCk7IH0KICNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gNgogCisgIHZvaWQgUGxheWVyU2V0Qm91bmRzKFNiUGxheWVyIHBsYXllciwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHpfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgIGludCB4LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0KSBvdmVycmlkZTsKKwogIHByb3RlY3RlZDoKICAgLy8gLS0tIEFwcGxpY2F0aW9uIG92ZXJyaWRlcyAtLS0KICAgdm9pZCBJbml0aWFsaXplKCkgb3ZlcnJpZGU7CkBAIC03OSw3ICs5Myw2IEBACiAKICAgc3RydWN0IEZyYW1lSW5mbyB7CiAgICAgU2JQbGF5ZXIgcGxheWVyOwotICAgIHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4gZnJhbWU7CiAgICAgaW50IHpfaW5kZXg7CiAgICAgaW50IHg7CiAgICAgaW50IHk7CkBAIC0xMTAsMTIgKzEyMywxOSBAQAogCiAgIFNiRXZlbnRJZCBjb21wb3NpdGVfZXZlbnRfaWRfOwogICBNdXRleCBmcmFtZV9tdXRleF87Ci0gIGludCBmcmFtZV9yZWFkX2luZGV4XzsKLSAgYm9vbCBmcmFtZXNfdXBkYXRlZF87CiAKLSAgc3RhdGljIGNvbnN0IGludCBrTnVtRnJhbWVzID0gMjsKLSAgLy8gVmlkZW8gZnJhbWVzIGZyb20gZGlmZmVyZW50IHZpZGVvcyBzb3J0ZWQgYnkgdGhlaXIgeiBpbmRpY2VzLgotICBzdGQ6Om1hcDxpbnQsIEZyYW1lSW5mbz4gZnJhbWVfaW5mb3NfW2tOdW1GcmFtZXNdOworICAvLyBUaGUgbGF0ZXN0IGZyYW1lIGZvciBldmVyeSBhY3RpdmUgcGxheWVyLgorICBzdGQ6OnVub3JkZXJlZF9tYXA8U2JQbGF5ZXIsIHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4+IG5leHRfdmlkZW9fZnJhbWVzXzsKKworICAvLyBSYXcgcGxheWVyIGZyYW1lcyBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQgdG8gYSBuZXcgZm9ybWF0IGJlZm9yZSBjb21wb3NpdGluZy4KKyAgc3RkOjp1bm9yZGVyZWRfbWFwPFNiUGxheWVyLCBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+PiBjdXJyZW50X3ZpZGVvX2ZyYW1lc187CisKKyAgLy8gRGF0YSBmb3IgdGhlIHVwY29taW5nIHJlbmRlciBmcmFtZSdzIHZpZGVvIGJvdW5kcy4KKyAgc3RkOjp1bm9yZGVyZWRfbWFwPFNiUGxheWVyLCBGcmFtZUluZm8+IG5leHRfdmlkZW9fYm91bmRzXzsKKworICAvLyBTb3J0ZWQgYXJyYXkgKGFjY29yZGluZyB0byB0aGUgel9pbmRleCkgb2YgdGhlIGN1cnJlbnQgcmVuZGVyIGZyYW1lJ3MKKyAgLy8gdmlkZW8gYm91bmRzLgorICBzdGQ6OnZlY3RvcjxGcmFtZUluZm8+IGN1cnJlbnRfdmlkZW9fYm91bmRzXzsKIAogICBEaXNwbGF5KiBkaXNwbGF5XzsKICAgU2JXaW5kb3dWZWN0b3Igd2luZG93c187CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC94MTEvZWdsX3N3YXBfYnVmZmVycy5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3gxMS9lZ2xfc3dhcF9idWZmZXJzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YzhjZTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC94MTEvZWdsX3N3YXBfYnVmZmVycy5jYwpAQCAtMCwwICsxLDM4IEBACisvLyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSA8RUdML2VnbC5oPgorI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQveDExL2FwcGxpY2F0aW9uX3gxMS5oIgorCitleHRlcm4gIkMiIHsKK0VHTEJvb2xlYW4gX19yZWFsX2VnbFN3YXBCdWZmZXJzKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UpOworCitFR0xCb29sZWFuIF9fd3JhcF9lZ2xTd2FwQnVmZmVycyhFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlKSB7CisgIC8vIFRoaXMgZnVuY3Rpb24gaXMgYSBwcm94eSBmb3Igd2hlbiB0aGUgR0wgbGF5ZXIgaXMgdXBkYXRlZC4gVW5mb3J0dW5hdGVseSwKKyAgLy8gT3BlbkdMIEVTIDIuMCAvIFgxMSBkbyBub3QgcHJvdmlkZSBpbnRlcmZhY2VzIHRvIGtub3cgb3IgY29udHJvbCBleGFjdGx5CisgIC8vIHdoZW4gdGhlIEdMIGxheWVyIGlzIHVwZGF0ZWQsIGJ1dCB3aXRoIGFuIGVnbFN3YXBJbnRlcnZhbCBvZiAwLCB0aGlzIGlzCisgIC8vIGEgZ29vZCBhcHByb3hpbWF0aW9uLgorICBFR0xCb29sZWFuIHJldHVybl92YWx1ZTsKKyAgc3RhcmJvYXJkOjpzaGFyZWQ6OngxMTo6QXBwbGljYXRpb25YMTEqIGFwcGxpY2F0aW9uID0KKyAgICAgIHN0YXRpY19jYXN0PHN0YXJib2FyZDo6c2hhcmVkOjp4MTE6OkFwcGxpY2F0aW9uWDExKj4oCisgICAgICAgICAgc3RhcmJvYXJkOjpzaGFyZWQ6OnN0YXJib2FyZDo6QXBwbGljYXRpb246OkdldCgpKTsKKworICAvLyBOb3RpZnkgdGhlIGFwcGxpY2F0aW9uIHdoZW4gdGhlIHN3YXAgaGFwcGVucyBzbyB0aGF0IGl0IGNhbiBzeW5jaHJvbml6ZQorICAvLyB0aGUgYm91bmRzIGZvciB0aGUgdmlkZW8gbGF5ZXIuCisgIGFwcGxpY2F0aW9uLT5Td2FwQnVmZmVyc0JlZ2luKCk7CisgIHJldHVybl92YWx1ZSA9IF9fcmVhbF9lZ2xTd2FwQnVmZmVycyhkcHksIHN1cmZhY2UpOworICBhcHBsaWNhdGlvbi0+U3dhcEJ1ZmZlcnNFbmQoKTsKKyAgcmV0dXJuIHJldHVybl92YWx1ZTsKK30KK30KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3gxMS93aW5kb3dfaW50ZXJuYWwuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC94MTEvd2luZG93X2ludGVybmFsLmNjCmluZGV4IGEwYzE1NDAuLjExNmE3YjEgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3gxMS93aW5kb3dfaW50ZXJuYWwuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQveDExL3dpbmRvd19pbnRlcm5hbC5jYwpAQCAtMjI3LDMwICsyMjcsMjEgQEAKICAgICAgICAgICAgICAgMCwgMCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCk7CiAKICAgICAvLyBJbml0aWFsbHkgYXNzdW1lIHdlIGRvbid0IGhhdmUgdG8gY2VudGVyIG9yIHNjYWxlLgotICAgIGludCB2aWRlb193aWR0aCA9IGZyYW1lLT53aWR0aCgpOwotICAgIGludCB2aWRlb19oZWlnaHQgPSBmcmFtZS0+aGVpZ2h0KCk7CiAgICAgaWYgKGJvdW5kc193aWR0aCAhPSB3aWR0aCB8fCBib3VuZHNfaGVpZ2h0ICE9IGhlaWdodCB8fAogICAgICAgICBmcmFtZS0+d2lkdGgoKSAhPSB3aWR0aCB8fCBmcmFtZS0+aGVpZ2h0KCkgIT0gaGVpZ2h0KSB7Ci0gICAgICAvLyBTY2FsZSB0byBmaXQgdGhlIHNtYWxsZXN0IGRpbWVuc2lvbiBvZiB0aGUgZnJhbWUgaW50byB0aGUgd2luZG93LgotICAgICAgZG91YmxlIHNjYWxlID0KLSAgICAgICAgICBzdGQ6Om1pbihib3VuZHNfd2lkdGggLyBzdGF0aWNfY2FzdDxkb3VibGU+KGZyYW1lLT53aWR0aCgpKSwKLSAgICAgICAgICAgICAgICAgICBib3VuZHNfaGVpZ2h0IC8gc3RhdGljX2Nhc3Q8ZG91YmxlPihmcmFtZS0+aGVpZ2h0KCkpKTsKLSAgICAgIC8vIENlbnRlciB0aGUgc2NhbGVkIGZyYW1lIHdpdGhpbiB0aGUgd2luZG93LgotICAgICAgdmlkZW9fd2lkdGggPSBzY2FsZSAqIGZyYW1lLT53aWR0aCgpOwotICAgICAgdmlkZW9faGVpZ2h0ID0gc2NhbGUgKiBmcmFtZS0+aGVpZ2h0KCk7CisgICAgICAvLyBUaGlzIHRyYW5zZm9ybSBtYXBzIHRoZSBkZXN0aW5hdGlvbiBwaXhlbCBiYWNrIHRvIHRoZSBzb3VyY2UgcGl4ZWwuCisgICAgICBkb3VibGUgc3ggPSBzdGF0aWNfY2FzdDxkb3VibGU+KGZyYW1lLT53aWR0aCgpKSAvIGJvdW5kc193aWR0aDsKKyAgICAgIGRvdWJsZSBzeSA9IHN0YXRpY19jYXN0PGRvdWJsZT4oZnJhbWUtPmhlaWdodCgpKSAvIGJvdW5kc19oZWlnaHQ7CiAgICAgICBYVHJhbnNmb3JtIHRyYW5zZm9ybSA9IHt7Ci0gICAgICAgICAgeyBYRG91YmxlVG9GaXhlZCgxKSwgWERvdWJsZVRvRml4ZWQoMCksIFhEb3VibGVUb0ZpeGVkKDApIH0sCi0gICAgICAgICAgeyBYRG91YmxlVG9GaXhlZCgwKSwgWERvdWJsZVRvRml4ZWQoMSksIFhEb3VibGVUb0ZpeGVkKDApIH0sCi0gICAgICAgICAgeyBYRG91YmxlVG9GaXhlZCgwKSwgWERvdWJsZVRvRml4ZWQoMCksIFhEb3VibGVUb0ZpeGVkKHNjYWxlKSB9CisgICAgICAgICAgeyBYRG91YmxlVG9GaXhlZChzeCksIFhEb3VibGVUb0ZpeGVkKDApLCBYRG91YmxlVG9GaXhlZCgwKSB9LAorICAgICAgICAgIHsgWERvdWJsZVRvRml4ZWQoMCksIFhEb3VibGVUb0ZpeGVkKHN5KSwgWERvdWJsZVRvRml4ZWQoMCkgfSwKKyAgICAgICAgICB7IFhEb3VibGVUb0ZpeGVkKDApLCBYRG91YmxlVG9GaXhlZCgwKSwgWERvdWJsZVRvRml4ZWQoMSkgfQogICAgICAgICB9fTsKICAgICAgIFhSZW5kZXJTZXRQaWN0dXJlVHJhbnNmb3JtKGRpc3BsYXksIHZpZGVvX3BpY3R1cmUsICZ0cmFuc2Zvcm0pOwogICAgIH0KLQotICAgIGludCBkZXN0X3ggPSBib3VuZHNfeCArIChib3VuZHNfd2lkdGggLSB2aWRlb193aWR0aCkgLyAyOwotICAgIGludCBkZXN0X3kgPSBib3VuZHNfeSArIChib3VuZHNfaGVpZ2h0IC0gdmlkZW9faGVpZ2h0KSAvIDI7CiAgICAgWFJlbmRlckNvbXBvc2l0ZShkaXNwbGF5LCBQaWN0T3BTcmMsIHZpZGVvX3BpY3R1cmUsIE5vbmUsCi0gICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGlvbl9waWN0dXJlLCAwLCAwLCAwLCAwLCBkZXN0X3gsIGRlc3RfeSwKLSAgICAgICAgICAgICAgICAgICAgIHZpZGVvX3dpZHRoLCB2aWRlb19oZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRpb25fcGljdHVyZSwgMCwgMCwgMCwgMCwgYm91bmRzX3gsIGJvdW5kc195LAorICAgICAgICAgICAgICAgICAgICAgYm91bmRzX3dpZHRoLCBib3VuZHNfaGVpZ2h0KTsKICAgfQogfQogCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3N0YXJib2FyZF9hbGwuZ3lwIGIvc3JjL3N0YXJib2FyZC9zdGFyYm9hcmRfYWxsLmd5cAppbmRleCA2OGQwNDg4Li4wN2MwZjY4IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3N0YXJib2FyZF9hbGwuZ3lwCisrKyBiL3NyYy9zdGFyYm9hcmQvc3RhcmJvYXJkX2FsbC5neXAKQEAgLTQxLDYgKzQxLDExIEBACiAgICAgICAgICAgICAnPChERVBUSCkvPChzdGFyYm9hcmRfcGF0aCkvc3RhcmJvYXJkX3BsYXRmb3JtX3Rlc3RzLmd5cDoqJywKICAgICAgICAgICBdLAogICAgICAgICB9XSwKKyAgICAgICAgWydzYl9maWx0ZXJfYmFzZWRfcGxheWVyPT0xJywgeworICAgICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci90ZXN0aW5nL3BsYXllcl9maWx0ZXJfdGVzdHMuZ3lwOionLAorICAgICAgICAgIF0sCisgICAgICAgIH1dLAogICAgICAgXSwKICAgICB9LAogICBdLApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zdHViL0JVSUxELmduIGIvc3JjL3N0YXJib2FyZC9zdHViL0JVSUxELmduCmluZGV4IDA0OGExZjUuLmJmZjgzY2EgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc3R1Yi9CVUlMRC5nbgorKysgYi9zcmMvc3RhcmJvYXJkL3N0dWIvQlVJTEQuZ24KQEAgLTIxMiw3ICsyMTIsOSBAQAogICAgICIvL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9kcm1fY3JlYXRlX3N5c3RlbS5jYyIsCiAgICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RybV9kZXN0cm95X3N5c3RlbS5jYyIsCiAgICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RybV9nZW5lcmF0ZV9zZXNzaW9uX3VwZGF0ZV9yZXF1ZXN0LmNjIiwKKyAgICAiLy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZHJtX2lzX3NlcnZlcl9jZXJ0aWZpY2F0ZV91cGRhdGFibGUuY2MiLAogICAgICIvL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9kcm1fc3lzdGVtX2ludGVybmFsLmgiLAorICAgICIvL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9kcm1fdXBkYXRlX3NlcnZlcl9jZXJ0aWZpY2F0ZS5jYyIsCiAgICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RybV91cGRhdGVfc2Vzc2lvbi5jYyIsCiAgICAgIi8vc3RhcmJvYXJkL3NoYXJlZC9zdHViL2ZpbGVfY2FuX29wZW4uY2MiLAogICAgICIvL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9maWxlX2Nsb3NlLmNjIiwKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc3R1Yi9jb25maWd1cmF0aW9uLmduaSBiL3NyYy9zdGFyYm9hcmQvc3R1Yi9jb25maWd1cmF0aW9uLmduaQppbmRleCA1NWE4ODZlLi5mNDE4ZGQ2IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3N0dWIvY29uZmlndXJhdGlvbi5nbmkKKysrIGIvc3JjL3N0YXJib2FyZC9zdHViL2NvbmZpZ3VyYXRpb24uZ25pCkBAIC0xOSw3ICsxOSw3IEBACiBnbF90eXBlID0gIm5vbmUiCiAKICMgVXNlIG1lZGlhIHNvdXJjZSBleHRlbnNpb24gaW1wbGVtZW50YXRpb24gdGhhdCBpcyBjb25mb3JtZWQgdG8gdGhlCi0jIENhbmRpZGF0ZSBSZWNvbW1hbmRhdGlvbiBvZiBKdWx5IDV0aCAyMDE2LgorIyBDYW5kaWRhdGUgUmVjb21tZW5kYXRpb24gb2YgSnVseSA1dGggMjAxNi4KIGNvYmFsdF91c2VfbWVkaWFfc291cmNlXzIwMTYgPSB0cnVlCiAKIGRlY2xhcmVfYXJncygpIHsKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc3R1Yi9jb25maWd1cmF0aW9uX3B1YmxpYy5oIGIvc3JjL3N0YXJib2FyZC9zdHViL2NvbmZpZ3VyYXRpb25fcHVibGljLmgKaW5kZXggYmVhNTYwNS4uNGU3NzQzZiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zdHViL2NvbmZpZ3VyYXRpb25fcHVibGljLmgKKysrIGIvc3JjL3N0YXJib2FyZC9zdHViL2NvbmZpZ3VyYXRpb25fcHVibGljLmgKQEAgLTg5LDE1ICs4OSw2IEBACiAvLyBXaGV0aGVyIHRoZSBjdXJyZW50IHBsYXRmb3JtIGlzIGV4cGVjdGVkIHRvIGhhdmUgZXhhY3RseSA2IGNvcmVzLgogI2RlZmluZSBTQl9IQVNfNl9DT1JFUyAwCiAKLS8vIFdoZXRoZXIgdGhlIGN1cnJlbnQgcGxhdGZvcm0gc3VwcG9ydHMgdGhyZWFkIHByaW9yaXRpZXMuCi0jZGVmaW5lIFNCX0hBU19USFJFQURfUFJJT1JJVFlfU1VQUE9SVCAwCi0KLS8vIFdoZXRoZXIgdGhlIGN1cnJlbnQgcGxhdGZvcm0gaW1wbGVtZW50cyB0aGUgb24gc2NyZWVuIGtleWJvYXJkIGludGVyZmFjZS4KLSNkZWZpbmUgU0JfSEFTX09OX1NDUkVFTl9LRVlCT0FSRCAwCi0KLS8vIFdoZXRoZXIgdGhlIGN1cnJlbnQgcGxhdGZvcm0gdXNlcyBhIG1lZGlhIHBsYXllciB0aGF0IHJlbGllcyBvbiBhIFVSTC4KLSNkZWZpbmUgU0JfSEFTX1BMQVlFUl9XSVRIX1VSTCAwCi0KIC8vIFdoZXRoZXIgdGhlIGN1cnJlbnQgcGxhdGZvcm0ncyB0aHJlYWQgc2NoZWR1bGVyIHdpbGwgYXV0b21hdGljYWxseSBiYWxhbmNlCiAvLyB0aHJlYWRzIGJldHdlZW4gY29yZXMsIGFzIG9wcG9zZWQgdG8gc3lzdGVtcyB3aGVyZSB0aHJlYWRzIHdpbGwgb25seSBldmVyIHJ1bgogLy8gb24gdGhlIHNwZWNpZmljYWxseSBwaW5uZWQgY29yZS4KQEAgLTE0NCwxNSArMTM1LDYgQEAKIC8vIFdoZXRoZXIgdGhlIGN1cnJlbnQgcGxhdGZvcm0gcHJvdmlkZXMgc3NpemVfdC4KICNkZWZpbmUgU0JfSEFTX1NTSVpFX1QgMQogCi0vLyBXaGV0aGVyIHRoZSBjdXJyZW50IHBsYXRmb3JtIGhhcyBtaWNyb3Bob25lIHN1cHBvcnRlZC4KLSNkZWZpbmUgU0JfSEFTX01JQ1JPUEhPTkUgMQotCi0vLyBXaGV0aGVyIHRoZSBjdXJyZW50IHBsYXRmb3JtIGhhcyBzcGVlY2ggcmVjb2duaXplci4KLSNkZWZpbmUgU0JfSEFTX1NQRUVDSF9SRUNPR05JWkVSIDEKLQotLy8gV2hldGhlciB0aGUgY3VycmVudCBwbGF0Zm9ybSBoYXMgc3BlZWNoIHN5bnRoZXNpcy4KLSNkZWZpbmUgU0JfSEFTX1NQRUVDSF9TWU5USEVTSVMgMQotCiAvLyBUeXBlIGRldGVjdGlvbiBmb3Igd2NoYXJfdC4KICNpZiBkZWZpbmVkKF9fV0NIQVJfTUFYX18pICYmIFwKICAgICAoX19XQ0hBUl9NQVhfXyA9PSAweDdmZmZmZmZmIHx8IF9fV0NIQVJfTUFYX18gPT0gMHhmZmZmZmZmZikKQEAgLTI4OSw1NCArMjcxLDYgQEAKIC8vIGFjY2VzcyB0aW1lIGlzIG9mIDEgZGF5IHByZWNpc2lvbi4KICN1bmRlZiBTQl9IQVNfUVVJUktfRklMRVNZU1RFTV9DT0FSU0VfQUNDRVNTX1RJTUUKIAotLy8gLS0tIE1lbW9yeSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIFRoZSBtZW1vcnkgcGFnZSBzaXplLCB3aGljaCBjb250cm9scyB0aGUgc2l6ZSBvZiBjaHVua3Mgb24gbWVtb3J5IHRoYXQKLS8vIGFsbG9jYXRvcnMgZGVhbCB3aXRoLCBhbmQgdGhlIGFsaWdubWVudCBvZiB0aG9zZSBjaHVua3MuIFRoaXMgZG9lc24ndCBoYXZlIHRvCi0vLyBiZSB0aGUgaGFyZHdhcmUtZGVmaW5lZCBwaHlzaWNhbCBwYWdlIHNpemUsIGJ1dCBpdCBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZgotLy8gaXQuCi0jZGVmaW5lIFNCX01FTU9SWV9QQUdFX1NJWkUgNDA5NgotCi0vLyBXaGV0aGVyIHRoaXMgcGxhdGZvcm0gaGFzIGFuZCBzaG91bGQgdXNlIGFuIE1NQVAgZnVuY3Rpb24gdG8gbWFwIHBoeXNpY2FsCi0vLyBtZW1vcnkgdG8gdGhlIHZpcnR1YWwgYWRkcmVzcyBzcGFjZS4KLSNkZWZpbmUgU0JfSEFTX01NQVAgMQotCi0vLyBXaGV0aGVyIHRoaXMgcGxhdGZvcm0gY2FuIG1hcCBleGVjdXRhYmxlIG1lbW9yeS4gSW1wbGllcyBTQl9IQVNfTU1BUC4gVGhpcyBpcwotLy8gcmVxdWlyZWQgZm9yIHBsYXRmb3JtcyB0aGF0IHdhbnQgdG8gSklULgotI2RlZmluZSBTQl9DQU5fTUFQX0VYRUNVVEFCTEVfTUVNT1JZIDEKLQotLy8gV2hldGhlciB0aGlzIHBsYXRmb3JtIGhhcyBhbmQgc2hvdWxkIHVzZSBhbiBncm93YWJsZSBoZWFwIChlLmcuIHdpdGggc2JyaygpKQotLy8gdG8gbWFwIHBoeXNpY2FsIG1lbW9yeSB0byB0aGUgdmlydHVhbCBhZGRyZXNzIHNwYWNlLgotI2RlZmluZSBTQl9IQVNfVklSVFVBTF9SRUdJT05TIDAKLQotLy8gU3BlY2lmaWVzIHRoZSBhbGlnbm1lbnQgZm9yIElPIEJ1ZmZlcnMsIGluIGJ5dGVzLiBTb21lIGxvdy1sZXZlbCBuZXR3b3JrIEFQSXMKLS8vIG1heSByZXF1aXJlIGJ1ZmZlcnMgdG8gaGF2ZSBhIHNwZWNpZmljIGFsaWdubWVudCwgYW5kIHRoaXMgaXMgdGhlIHBsYWNlIHRvCi0vLyBzcGVjaWZ5IHRoYXQuCi0jZGVmaW5lIFNCX05FVFdPUktfSU9fQlVGRkVSX0FMSUdOTUVOVCAxNgotCi0vLyBEZXRlcm1pbmVzIHRoZSBhbGlnbm1lbnQgdGhhdCBhbGxvY2F0aW9ucyBzaG91bGQgaGF2ZSBvbiB0aGlzIHBsYXRmb3JtLgotI2RlZmluZSBTQl9NQUxMT0NfQUxJR05NRU5UICgoc2l6ZV90KTE2VSkKLQotLy8gRGV0ZXJtaW5lcyB0aGUgdGhyZXNoaG9sZCBvZiBhbGxvY2F0aW9uIHNpemUgdGhhdCBzaG91bGQgYmUgZG9uZSB3aXRoIG1tYXAKLS8vIChpZiBhdmFpbGFibGUpLCByYXRoZXIgdGhhbiBhbGxvY2F0ZWQgd2l0aGluIHRoZSBjb3JlIGhlYXAuCi0jZGVmaW5lIFNCX0RFRkFVTFRfTU1BUF9USFJFU0hPTEQgKChzaXplX3QpKDI1NiAqIDEwMjRVKSkKLQotLy8gRGVmaW5lcyB0aGUgcGF0aCB3aGVyZSBtZW1vcnkgZGVidWdnaW5nIGxvZ3Mgc2hvdWxkIGJlIHdyaXR0ZW4gdG8uCi0jZGVmaW5lIFNCX01FTU9SWV9MT0dfUEFUSCAiL3RtcC9zdGFyYm9hcmQiCi0KLS8vIC0tLSBUaHJlYWQgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBEZWZpbmVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzaW11bHRhbmVvdXMgdGhyZWFkcyBmb3IgdGhpcyBwbGF0Zm9ybS4gU29tZQotLy8gcGxhdGZvcm1zIHJlcXVpcmUgc2hhcmluZyB0aHJlYWQgaGFuZGxlcyB3aXRoIG90aGVyIGtpbmRzIG9mIHN5c3RlbSBoYW5kbGVzLAotLy8gbGlrZSBtdXRleGVzLCBzbyB3ZSB3YW50IHRvIGtlZXAgdGhpcyBtYW5hZ2FibGUuCi0jZGVmaW5lIFNCX01BWF9USFJFQURTIDkwCi0KLS8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0aHJlYWQgbG9jYWwgc3RvcmFnZSBrZXlzIHN1cHBvcnRlZCBieSB0aGlzIHBsYXRmb3JtLgotI2RlZmluZSBTQl9NQVhfVEhSRUFEX0xPQ0FMX0tFWVMgNTEyCi0KLS8vIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgbmFtZSBmb3IgYSB0aHJlYWQsIGluY2x1ZGluZyB0aGUgTlVMTC10ZXJtaW5hdG9yLgotI2RlZmluZSBTQl9NQVhfVEhSRUFEX05BTUVfTEVOR1RIIDE2OwotCiAvLyAtLS0gR3JhcGhpY3MgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogLy8gU3BlY2lmaWVzIHdoZXRoZXIgdGhpcyBwbGF0Zm9ybSBzdXBwb3J0cyBhIHBlcmZvcm1hbnQgYWNjZWxlcmF0ZWQgYmxpdHRlcgpAQCAtMzY1LDggKzI5OSwyNSBAQAogCiAjZGVmaW5lIFNCX0hBU19WSVJUVUFMX1JFQUxJVFkgMQogCisvLyAtLS0gSS9PIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gV2hldGhlciB0aGUgY3VycmVudCBwbGF0Zm9ybSBoYXMgbWljcm9waG9uZSBzdXBwb3J0ZWQuCisjZGVmaW5lIFNCX0hBU19NSUNST1BIT05FIDEKKworLy8gV2hldGhlciB0aGUgY3VycmVudCBwbGF0Zm9ybSBpbXBsZW1lbnRzIHRoZSBvbiBzY3JlZW4ga2V5Ym9hcmQgaW50ZXJmYWNlLgorI2RlZmluZSBTQl9IQVNfT05fU0NSRUVOX0tFWUJPQVJEIDAKKworLy8gV2hldGhlciB0aGUgY3VycmVudCBwbGF0Zm9ybSBoYXMgc3BlZWNoIHJlY29nbml6ZXIuCisjZGVmaW5lIFNCX0hBU19TUEVFQ0hfUkVDT0dOSVpFUiAxCisKKy8vIFdoZXRoZXIgdGhlIGN1cnJlbnQgcGxhdGZvcm0gaGFzIHNwZWVjaCBzeW50aGVzaXMuCisjZGVmaW5lIFNCX0hBU19TUEVFQ0hfU1lOVEhFU0lTIDEKKwogLy8gLS0tIE1lZGlhIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKKy8vIFdoZXRoZXIgdGhlIGN1cnJlbnQgcGxhdGZvcm0gdXNlcyBhIG1lZGlhIHBsYXllciB0aGF0IHJlbGllcyBvbiBhIFVSTC4KKyNkZWZpbmUgU0JfSEFTX1BMQVlFUl9XSVRIX1VSTCAwCisKIC8vIEFmdGVyIGEgc2VlayBpcyB0cmlnZ2VycmVkLCB0aGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byBhcHBlbmQgdmlkZW8gZnJhbWVzCiAvLyBmcm9tIHRoZSBsYXN0IGtleSBmcmFtZSBiZWZvcmUgdGhlIHNlZWsgdGltZSBhbmQgYXBwZW5kIGF1ZGlvIGZyYW1lcyBmcm9tIHRoZQogLy8gc2VlayB0aW1lIGJlY2F1c2UgdXN1YWxseSBhbGwgYXVkaW8gZnJhbWVzIGFyZSBrZXkgZnJhbWVzLiAgT24gcGxhdGZvcm1zIHRoYXQKQEAgLTQzNSw2ICszODYsNDEgQEAKIC8vIHZhbHVlIGxlYWRzIHRvIG1vcmUgc3RhYmxlIGZwcyBidXQgYWxzbyBjYXVzZXMgdGhlIGFwcCB0byB1c2UgbW9yZSBtZW1vcnkuCiAjZGVmaW5lIFNCX01FRElBX01BWElNVU1fVklERU9fRlJBTUVTIDEyCiAKKy8vIC0tLSBNZW1vcnkgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBUaGUgbWVtb3J5IHBhZ2Ugc2l6ZSwgd2hpY2ggY29udHJvbHMgdGhlIHNpemUgb2YgY2h1bmtzIG9uIG1lbW9yeSB0aGF0CisvLyBhbGxvY2F0b3JzIGRlYWwgd2l0aCwgYW5kIHRoZSBhbGlnbm1lbnQgb2YgdGhvc2UgY2h1bmtzLiBUaGlzIGRvZXNuJ3QgaGF2ZSB0bworLy8gYmUgdGhlIGhhcmR3YXJlLWRlZmluZWQgcGh5c2ljYWwgcGFnZSBzaXplLCBidXQgaXQgc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YKKy8vIGl0LgorI2RlZmluZSBTQl9NRU1PUllfUEFHRV9TSVpFIDQwOTYKKworLy8gV2hldGhlciB0aGlzIHBsYXRmb3JtIGhhcyBhbmQgc2hvdWxkIHVzZSBhbiBNTUFQIGZ1bmN0aW9uIHRvIG1hcCBwaHlzaWNhbAorLy8gbWVtb3J5IHRvIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UuCisjZGVmaW5lIFNCX0hBU19NTUFQIDEKKworLy8gV2hldGhlciB0aGlzIHBsYXRmb3JtIGNhbiBtYXAgZXhlY3V0YWJsZSBtZW1vcnkuIEltcGxpZXMgU0JfSEFTX01NQVAuIFRoaXMgaXMKKy8vIHJlcXVpcmVkIGZvciBwbGF0Zm9ybXMgdGhhdCB3YW50IHRvIEpJVC4KKyNkZWZpbmUgU0JfQ0FOX01BUF9FWEVDVVRBQkxFX01FTU9SWSAxCisKKy8vIFdoZXRoZXIgdGhpcyBwbGF0Zm9ybSBoYXMgYW5kIHNob3VsZCB1c2UgYW4gZ3Jvd2FibGUgaGVhcCAoZS5nLiB3aXRoIHNicmsoKSkKKy8vIHRvIG1hcCBwaHlzaWNhbCBtZW1vcnkgdG8gdGhlIHZpcnR1YWwgYWRkcmVzcyBzcGFjZS4KKyNkZWZpbmUgU0JfSEFTX1ZJUlRVQUxfUkVHSU9OUyAwCisKKy8vIFNwZWNpZmllcyB0aGUgYWxpZ25tZW50IGZvciBJTyBCdWZmZXJzLCBpbiBieXRlcy4gU29tZSBsb3ctbGV2ZWwgbmV0d29yayBBUElzCisvLyBtYXkgcmVxdWlyZSBidWZmZXJzIHRvIGhhdmUgYSBzcGVjaWZpYyBhbGlnbm1lbnQsIGFuZCB0aGlzIGlzIHRoZSBwbGFjZSB0bworLy8gc3BlY2lmeSB0aGF0LgorI2RlZmluZSBTQl9ORVRXT1JLX0lPX0JVRkZFUl9BTElHTk1FTlQgMTYKKworLy8gRGV0ZXJtaW5lcyB0aGUgYWxpZ25tZW50IHRoYXQgYWxsb2NhdGlvbnMgc2hvdWxkIGhhdmUgb24gdGhpcyBwbGF0Zm9ybS4KKyNkZWZpbmUgU0JfTUFMTE9DX0FMSUdOTUVOVCAoKHNpemVfdCkxNlUpCisKKy8vIERldGVybWluZXMgdGhlIHRocmVzaGhvbGQgb2YgYWxsb2NhdGlvbiBzaXplIHRoYXQgc2hvdWxkIGJlIGRvbmUgd2l0aCBtbWFwCisvLyAoaWYgYXZhaWxhYmxlKSwgcmF0aGVyIHRoYW4gYWxsb2NhdGVkIHdpdGhpbiB0aGUgY29yZSBoZWFwLgorI2RlZmluZSBTQl9ERUZBVUxUX01NQVBfVEhSRVNIT0xEICgoc2l6ZV90KSgyNTYgKiAxMDI0VSkpCisKKy8vIERlZmluZXMgdGhlIHBhdGggd2hlcmUgbWVtb3J5IGRlYnVnZ2luZyBsb2dzIHNob3VsZCBiZSB3cml0dGVuIHRvLgorI2RlZmluZSBTQl9NRU1PUllfTE9HX1BBVEggIi90bXAvc3RhcmJvYXJkIgorCiAvLyAtLS0gTmV0d29yayBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogLy8gU3BlY2lmaWVzIHdoZXRoZXIgdGhpcyBwbGF0Zm9ybSBzdXBwb3J0cyBJUFY2LgpAQCAtNDQzLDYgKzQyOSwyOCBAQAogLy8gU3BlY2lmaWVzIHdoZXRoZXIgdGhpcyBwbGF0Zm9ybSBzdXBwb3J0cyBwaXBlLgogI2RlZmluZSBTQl9IQVNfUElQRSAxCiAKKy8vIC0tLSBUaHJlYWQgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBXaGV0aGVyIHRoZSBjdXJyZW50IHBsYXRmb3JtIHN1cHBvcnRzIHRocmVhZCBwcmlvcml0aWVzLgorI2RlZmluZSBTQl9IQVNfVEhSRUFEX1BSSU9SSVRZX1NVUFBPUlQgMAorCisvLyBEZWZpbmVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzaW11bHRhbmVvdXMgdGhyZWFkcyBmb3IgdGhpcyBwbGF0Zm9ybS4gU29tZQorLy8gcGxhdGZvcm1zIHJlcXVpcmUgc2hhcmluZyB0aHJlYWQgaGFuZGxlcyB3aXRoIG90aGVyIGtpbmRzIG9mIHN5c3RlbSBoYW5kbGVzLAorLy8gbGlrZSBtdXRleGVzLCBzbyB3ZSB3YW50IHRvIGtlZXAgdGhpcyBtYW5hZ2FibGUuCisjZGVmaW5lIFNCX01BWF9USFJFQURTIDkwCisKKy8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0aHJlYWQgbG9jYWwgc3RvcmFnZSBrZXlzIHN1cHBvcnRlZCBieSB0aGlzIHBsYXRmb3JtLgorI2RlZmluZSBTQl9NQVhfVEhSRUFEX0xPQ0FMX0tFWVMgNTEyCisKKy8vIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgbmFtZSBmb3IgYSB0aHJlYWQsIGluY2x1ZGluZyB0aGUgTlVMTC10ZXJtaW5hdG9yLgorI2RlZmluZSBTQl9NQVhfVEhSRUFEX05BTUVfTEVOR1RIIDE2CisKKy8vIC0tLSBUaW1pbmcgQVBJIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBXaGV0aGVyIHRoaXMgcGxhdGZvcm0gaGFzIGFuIEFQSSB0byByZXRyaWV2ZSBob3cgbG9uZyB0aGUgY3VycmVudCB0aHJlYWQKKy8vIGhhcyBzcGVudCBpbiB0aGUgZXhlY3V0aW5nIHN0YXRlLgorI2RlZmluZSBTQl9IQVNfVElNRV9USFJFQURfTk9XIDEKKwogLy8gLS0tIFR1bmVhYmxlIFBhcmFtZXRlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIC8vIFNwZWNpZmllcyB0aGUgbmV0d29yayByZWNlaXZlIGJ1ZmZlciBzaXplIGluIGJ5dGVzLCBzZXQgdmlhCkBAIC00NjQsMTIgKzQ3Miw2IEBACiAvLyBUaGUgbWF4aW11bSBudW1iZXIgb2YgdXNlcnMgdGhhdCBjYW4gYmUgc2lnbmVkIGluIGF0IHRoZSBzYW1lIHRpbWUuCiAjZGVmaW5lIFNCX1VTRVJfTUFYX1NJR05FRF9JTiAxCiAKLS8vIC0tLSBUaW1pbmcgQVBJIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBXaGV0aGVyIHRoaXMgcGxhdGZvcm0gaGFzIGFuIEFQSSB0byByZXRyaWV2ZSBob3cgbG9uZyB0aGUgY3VycmVudCB0aHJlYWQKLS8vIGhhcyBzcGVudCBpbiB0aGUgZXhlY3V0aW5nIHN0YXRlLgotI2RlZmluZSBTQl9IQVNfVElNRV9USFJFQURfTk9XIDEKLQogLy8gLS0tIFBsYXRmb3JtIFNwZWNpZmljIEF1ZGl0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKICNpZiAhZGVmaW5lZChfX0dOVUNfXykKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc3R1Yi9neXBfY29uZmlndXJhdGlvbi5neXBpIGIvc3JjL3N0YXJib2FyZC9zdHViL2d5cF9jb25maWd1cmF0aW9uLmd5cGkKaW5kZXggNjFmY2NhNC4uZTIxMjlhYSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zdHViL2d5cF9jb25maWd1cmF0aW9uLmd5cGkKKysrIGIvc3JjL3N0YXJib2FyZC9zdHViL2d5cF9jb25maWd1cmF0aW9uLmd5cGkKQEAgLTEzLDYgKzEzLDkgQEAKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiB7CiAgICd2YXJpYWJsZXMnOiB7CisgICAgIyBTdHViIGRvZXMgbm90IHVzZSBhIGZpbHRlci1iYXNlZCBwbGF5ZXIuCisgICAgJ3NiX2ZpbHRlcl9iYXNlZF9wbGF5ZXInOiAwLAorCiAgICAgJ3RhcmdldF9hcmNoJzogJ3g2NCcsCiAgICAgJ3RhcmdldF9vcyc6ICdsaW51eCcsCiAKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc3R1Yi9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwIGIvc3JjL3N0YXJib2FyZC9zdHViL3N0YXJib2FyZF9wbGF0Zm9ybS5neXAKaW5kZXggYjAzZjhjZS4uYjQ0ZWMwNCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zdHViL3N0YXJib2FyZF9wbGF0Zm9ybS5neXAKKysrIGIvc3JjL3N0YXJib2FyZC9zdHViL3N0YXJib2FyZF9wbGF0Zm9ybS5neXAKQEAgLTcyLDcgKzcyLDkgQEAKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9kcm1fY3JlYXRlX3N5c3RlbS5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZHJtX2Rlc3Ryb3lfc3lzdGVtLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9kcm1fZ2VuZXJhdGVfc2Vzc2lvbl91cGRhdGVfcmVxdWVzdC5jYycsCisgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZHJtX2lzX3NlcnZlcl9jZXJ0aWZpY2F0ZV91cGRhdGFibGUuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RybV9zeXN0ZW1faW50ZXJuYWwuaCcsCisgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZHJtX3VwZGF0ZV9zZXJ2ZXJfY2VydGlmaWNhdGUuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RybV91cGRhdGVfc2Vzc2lvbi5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZmlsZV9jYW5fb3Blbi5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZmlsZV9jbG9zZS5jYycsCkBAIC0xMTMsNiArMTE1LDcgQEAKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9tZW1vcnlfZ2V0X3N0YWNrX2JvdW5kcy5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvbWVtb3J5X21hcC5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvbWVtb3J5X21vdmUuY2MnLAorICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL21lbW9yeV9wcm90ZWN0LmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9tZW1vcnlfcmVhbGxvY2F0ZV91bmNoZWNrZWQuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL21lbW9yeV9zZXQuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL21lbW9yeV91bm1hcC5jYycsCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3N5c3RlbS5oIGIvc3JjL3N0YXJib2FyZC9zeXN0ZW0uaAppbmRleCBiZjJjNjhlLi5lMmNjN2EzIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3N5c3RlbS5oCisrKyBiL3NyYy9zdGFyYm9hcmQvc3lzdGVtLmgKQEAgLTE3NSwxMCArMTc1LDE5IEBACiAgIGtTYlN5c3RlbUNhcGFiaWxpdHlSZXZlcnNlZEVudGVyQW5kQmFjaywKIAogICAvLyBXaGV0aGVyIHRoaXMgc3lzdGVtIGhhcyB0aGUgYWJpbGl0eSB0byByZXBvcnQgb24gR1BVIG1lbW9yeSB1c2FnZS4KLSAgLy8gSWYgKGFuZCBvbmx5IGlmKSBhIHN5c3RlbSBoYXMgdGhpcyBjYXBjYWJpbGl0eSB3aWxsCisgIC8vIElmIChhbmQgb25seSBpZikgYSBzeXN0ZW0gaGFzIHRoaXMgY2FwYWJpbGl0eSB3aWxsCiAgIC8vIFNiU3lzdGVtR2V0VG90YWxHUFVNZW1vcnkoKSBhbmQgU2JTeXN0ZW1HZXRVc2VkR1BVTWVtb3J5KCkgYmUgdmFsaWQgdG8KICAgLy8gY2FsbC4KICAga1NiU3lzdGVtQ2FwYWJpbGl0eUNhblF1ZXJ5R1BVTWVtb3J5U3RhdHMsCisKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9JTlBVVF9USU1FU1RBTVBfQVBJX1ZFUlNJT04KKyAgLy8gV2hldGhlciB0aGlzIHN5c3RlbSBzZXRzIHRoZSB8dGltZXN0YW1wfCBmaWVsZCBvZiBTYklucHV0RGF0YS4gSWYgdGhlCisgIC8vIHN5c3RlbSBkb2VzIG5vdCBzZXQgdGhpcyBmaWVsZCwgdGhlbiBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgc2V0OyBob3dldmVyLAorICAvLyB0aGUgcmVsYXRpdmUgdGltZSBiZXR3ZWVuIGlucHV0IGV2ZW50cyBsaWtlbHkgd2lsbCBub3QgYmUgcHJlc2VydmVkLCBzbworICAvLyB0aW1lLXJlbGF0ZWQgY2FsY3VsYXRpb25zIChlLmcuIHZlbG9jaXR5IGZvciBtb3ZlIGV2ZW50cykgd2lsbCBiZQorICAvLyBpbmNvcnJlY3QuCisgIGtTYlN5c3RlbUNhcGFiaWxpdHlTZXRzSW5wdXRUaW1lc3RhbXAsCisjZW5kaWYKIH0gU2JTeXN0ZW1DYXBhYmlsaXR5SWQ7CiAKIC8vIEVudW1lcmF0aW9uIG9mIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlIHx0eXBlfCBwYXJhbWV0ZXIgcGFzc2VkIHRvICB0aGUKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvdG9vbHMvYnVpbGQucHkgYi9zcmMvc3RhcmJvYXJkL3Rvb2xzL2J1aWxkLnB5CmluZGV4IGZkMmFmNDguLjE5MzMzMGEgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvdG9vbHMvYnVpbGQucHkKKysrIGIvc3JjL3N0YXJib2FyZC90b29scy9idWlsZC5weQpAQCAtMjk1LDkgKzI5NSw5IEBACiAgIHRyeToKICAgICBsb2dnaW5nLmRlYnVnKCdMb2FkaW5nIHBsYXRmb3JtIGNvbmZpZ3VyYXRpb24gZm9yICIlcyIuJywgcGxhdGZvcm1fbmFtZSkKICAgICBpZiBwbGF0Zm9ybS5Jc1ZhbGlkKHBsYXRmb3JtX25hbWUpOgotICAgICAgcGxhdGZvcm1fcGF0aCA9IHBsYXRmb3JtLkdldChwbGF0Zm9ybV9uYW1lKS5wYXRoCi0gICAgICBtb2R1bGVfcGF0aCA9IG9zLnBhdGguam9pbihwYXRocy5SRVBPU0lUT1JZX1JPT1QsIHBsYXRmb3JtX3BhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZ3lwX2NvbmZpZ3VyYXRpb24ucHknKQorICAgICAgcGxhdGZvcm1fcGF0aCA9IG9zLnBhdGguam9pbihwYXRocy5SRVBPU0lUT1JZX1JPT1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtLkdldChwbGF0Zm9ybV9uYW1lKS5wYXRoKQorICAgICAgbW9kdWxlX3BhdGggPSBvcy5wYXRoLmpvaW4ocGxhdGZvcm1fcGF0aCwgJ2d5cF9jb25maWd1cmF0aW9uLnB5JykKICAgICAgIGlmIG5vdCBfTW9kdWxlTG9hZGVkKCdwbGF0Zm9ybV9tb2R1bGUnLCBtb2R1bGVfcGF0aCk6CiAgICAgICAgIHBsYXRmb3JtX21vZHVsZSA9IGltcC5sb2FkX3NvdXJjZSgncGxhdGZvcm1fbW9kdWxlJywgbW9kdWxlX3BhdGgpCiAgICAgICBlbHNlOgpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC90b29scy9jcmVhdGVfZGVyaXZlZF9idWlsZC5weSBiL3NyYy9zdGFyYm9hcmQvdG9vbHMvY3JlYXRlX2Rlcml2ZWRfYnVpbGQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE0ODE5MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvdG9vbHMvY3JlYXRlX2Rlcml2ZWRfYnVpbGQucHkKQEAgLTAsMCArMSwxOTUgQEAKKyMhL3Vzci9iaW4vcHl0aG9uCisjCisjIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisiIiJUb29sIHRvIGNyZWF0ZSBhIG5ldyBTdGFyYm9hcmQgYnVpbGQgZGVyaXZpbmcgZnJvbSBhbiBleGlzdGluZyBvbmUuCisKK1doZW4gdGhpcyB0b29sIGlzIHByb3ZpZGVkIHdpdGggaW5wdXQgZ2l2aW5nIHRoZSBkZXNpcmVkIGV4aXN0aW5nIGJ1aWxkIHBhdGggdG8KK2Rlcml2ZSBmcm9tIGFzIHdlbGwgYXMgYSBkZXN0aW5hdGlvbiBidWlsZCBwYXRoIHRvIGNyZWF0ZSwgaXQgd2lsbCBnZW5lcmF0ZQordGhlIGZpbGVzIG5lY2Vzc2FyeSBmb3IgYSBuZXcgYnVpbGQgdG8gYmUgY3JlYXRlZCBpbiB0aGUgZGVzdGluYXRpb24gYnVpbGQKK3BhdGguICBUaGUgZ2VuZXJhdGVkIGJ1aWxkIHdpbGwgYmUgaWRlbnRpY2FsIHRvIHRoZSBwcmV2aW91cyBidWlsZCBzaW5jZSBpdAorZGVyaXZlcyBhbGwgY29uZmlndXJhdGlvbiBmcm9tIGl0LiAgVGhlIGludGVuZGVkIHVzYWdlIG9mIHRoaXMgc2NyaXB0IGlzIHRvCittYWtlIGl0IGVhc3kgdG8gaW5pdGlhbGl6ZSBuZXcgU3RhcmJvYXJkIGJ1aWxkcyB0aGF0IGFyZSBsYXRlciBtYW51YWxseSB0d2Vha2VkCitieSBoYW5kLgorIiIiCisKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IGRhdGV0aW1lCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgdGV4dHdyYXAKKworaW1wb3J0IF9lbnYgICMgcHlsaW50OiBkaXNhYmxlPXVudXNlZC1pbXBvcnQKK2Zyb20gc3RhcmJvYXJkLnRvb2xzIGltcG9ydCBwYXRocworaW1wb3J0IHN0YXJib2FyZC50b29scy5lbnZpcm9ubWVudCBhcyBlbnZpcm9ubWVudAorCitURU1QTEFURV9ESVJFQ1RPUlkgPSAoCisgICAgb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksICdjcmVhdGVfZGVyaXZlZF9idWlsZF90ZW1wbGF0ZXMnKSkKKworIyBUaGUgbGlzdCBvZiBmaWxlcyB3ZSB3aWxsIGdlbmVyYXRlIGluIHRoZSBvdXRwdXQgZGlyZWN0b3J5LiAgRm9yIGVhY2ggb2YKKyMgdGhlc2UgZmlsZXMgaXQgaXMgZXhwZWN0ZWQgdGhhdCB0aGVyZSBleGlzdHMgYSBjb3JyZXNwb25kaW5nIHRlbXBsYXRlIGZpbGUgaW4KKyMgdGhlIGRpcmVjdG9yeSBURU1QTEFURV9ESVJFQ1RPUlkuCitGSUxFU19UT19HRU5FUkFURSA9IFsKKyAgICAnYXRvbWljX3B1YmxpYy5oJywKKyAgICAnY29uZmlndXJhdGlvbl9wdWJsaWMuaCcsCisgICAgJ2d5cF9jb25maWd1cmF0aW9uLmd5cGknLAorICAgICdneXBfY29uZmlndXJhdGlvbi5weScsCisgICAgJ3N0YXJib2FyZF9wbGF0Zm9ybS5neXAnLAorICAgICdzdGFyYm9hcmRfcGxhdGZvcm1fdGVzdHMuZ3lwJywKKyAgICAndGhyZWFkX3R5cGVzX3B1YmxpYy5oJywKK10KKworCitkZWYgX0dlbmVyYXRlRmlsZShvdXRwdXRfZmlsZV9wYXRoLCB0ZW1wbGF0ZV9maWxlX3BhdGgsIHRlbXBsYXRlX2RpY3Rpb25hcnkpOgorICAiIiJBcHBsaWVzIHRoZSBkaWN0aW9uYXJ5IHRvIHRoZSB0ZW1wbGF0ZSBmaWxlIGFuZCBvdXRwdXRzIHRvIG91dHB1dCBmaWxlLiIiIgorICBpZiBub3Qgb3MucGF0aC5leGlzdHMob3MucGF0aC5kaXJuYW1lKG91dHB1dF9maWxlX3BhdGgpKToKKyAgICBvcy5tYWtlZGlycyhvcy5wYXRoLmRpcm5hbWUob3V0cHV0X2ZpbGVfcGF0aCkpCisKKyAgd2l0aCBvcGVuKHRlbXBsYXRlX2ZpbGVfcGF0aCwgJ3InKSBhcyBmOgorICAgIHRlbXBsYXRlX2ZpbGVfY29udGVudHMgPSBmLnJlYWQoKQorCisgIHdpdGggb3BlbihvdXRwdXRfZmlsZV9wYXRoLCAndycpIGFzIGY6CisgICAgZi53cml0ZSh0ZW1wbGF0ZV9maWxlX2NvbnRlbnRzLmZvcm1hdCgqKnRlbXBsYXRlX2RpY3Rpb25hcnkpKQorCisKK2RlZiBfR2V0Q29weXJpZ2h0WWVhcigpOgorICAiIiJSZXR1cm5zIHRoZSB5ZWFyIHRvIGJlIHVzZWQgaW4gdGhlIGNvcHlyaWdodCBoZWFkZXIgY29tbWVudC4iIiIKKyAgcmV0dXJuIGRhdGV0aW1lLmRhdGV0aW1lLm5vdygpLnllYXIKKworCitkZWYgX0dldEF1dG9HZW5lcmF0ZWRQcmVhbWJsZUNvbW1lbnQobGFuZ3VhZ2UpOgorICAiIiJSZXR1cm5zIHRoZSBjb21tZW50IGFib3V0IGhvdyBhIGN1cnJlbnQgZmlsZSBpcyBhdXRvLWdlbmVyYXRlZC4iIiIKKyAgaWYgbGFuZ3VhZ2UgPT0gJ2NjJzoKKyAgICBjb21tZW50X3N0YXJ0ID0gJy8vJworICBlbGlmIGxhbmd1YWdlID09ICdweXRob24nOgorICAgIGNvbW1lbnRfc3RhcnQgPSAnIycKKyAgc2NyaXB0X3BhdGhfcmVsYXRpdmVfdG9fcmVwb3NpdG9yeSA9ICgKKyAgICAgIF9HZXRQYXRoUmVsYXRpdmVUb1JlcG9zaXRvcnkob3MucGF0aC5hYnNwYXRoKF9fZmlsZV9fKSkpCisgIHJldHVybiAoJ3tjb21tZW50X3N0YXJ0fSBUaGlzIGZpbGUgd2FzIGluaXRpYWxseSBnZW5lcmF0ZWQgYnkge30sXG4nCisgICAgICAgICAgJ3tjb21tZW50X3N0YXJ0fSB0aG91Z2ggaXQgbWF5IGhhdmUgYmVlbiBtb2RpZmllZCBzaW5jZSBpdHMgJworICAgICAgICAgICdjcmVhdGlvbi4nLmZvcm1hdCgKKyAgICAgICAgICAgICAgc2NyaXB0X3BhdGhfcmVsYXRpdmVfdG9fcmVwb3NpdG9yeSwgY29tbWVudF9zdGFydD1jb21tZW50X3N0YXJ0KSkKKworCitkZWYgX0dldFBhdGhSZWxhdGl2ZVRvU3RhcmJvYXJkUm9vdChwYXRoKToKKyAgYWJzcGF0aCA9IG9zLnBhdGguYWJzcGF0aChwYXRoKQorICAjIFRoaXMgaXMgYSBiaXQgdHJpY2t5IGJlY2F1c2UgdGhlcmUgY2FuIGJlIG11bHRpcGxlIFN0YXJib2FyZCByb290cy4KKyAgZm9yIHJvb3QgaW4gZW52aXJvbm1lbnQuR2V0U3RhcmJvYXJkUG9ydFJvb3RzKCk6CisgICAgYWJzcm9vdCA9IG9zLnBhdGguYWJzcGF0aChyb290KQorICAgIGlmIG9zLnBhdGguY29tbW9ucHJlZml4KFthYnNyb290LCBhYnNwYXRoXSkgPT0gYWJzcm9vdDoKKyAgICAgIHJldHVybiBvcy5wYXRoLnJlbHBhdGgoYWJzcGF0aCwgc3RhcnQ9YWJzcm9vdCkKKworICByYWlzZSBFeGNlcHRpb24oJ1BhdGggbm90IHJlbGF0aXZlIHRvIGFueSBTdGFyYm9hcmQgcm9vdC4nKQorCisKK2RlZiBfR2V0UGF0aFJlbGF0aXZlVG9SZXBvc2l0b3J5KHBhdGgpOgorICByZXR1cm4gb3MucGF0aC5yZWxwYXRoKG9zLnBhdGguYWJzcGF0aChwYXRoKSwgc3RhcnQ9cGF0aHMuUkVQT1NJVE9SWV9ST09UKQorCisKK2RlZiBfR2V0SW5jbHVkZUd1YXJkKG91dHB1dF9maWxlX3BhdGgpOgorICAiIiJSZXR1cm5zIHRoZSBpbmNsdWRlIGd1YXJkIGRlZmluZSB0byBiZSB1c2VkIGluIGdlbmVyYXRlZCBDKysgaGVhZGVycy4iIiIKKyAgcmVwb3NpdG9yeV9yZWxhdGl2ZV9wYXRoID0gX0dldFBhdGhSZWxhdGl2ZVRvUmVwb3NpdG9yeShvdXRwdXRfZmlsZV9wYXRoKQorICByZXR1cm4gKHJlcG9zaXRvcnlfcmVsYXRpdmVfcGF0aC51cHBlcigpLnJlcGxhY2Uob3Muc2VwLCAnXycpLnJlcGxhY2UoCisgICAgICAnLicsICdfJykgKyAnXycpCisKKworZGVmIF9HZXRCdWlsZE5hbWUob3V0cHV0X2J1aWxkX3BhdGgpOgorICAiIiJSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBidWlsZCAoZS5nLiBob3cgeW91IGlkZW50aWZ5IHRoZSBidWlsZCB0byBneXApLiIiIgorICBzdGFyYm9hcmRfcmVsYXRpdmVfcGF0aCA9IF9HZXRQYXRoUmVsYXRpdmVUb1N0YXJib2FyZFJvb3Qob3V0cHV0X2J1aWxkX3BhdGgpCisgIHJldHVybiBzdGFyYm9hcmRfcmVsYXRpdmVfcGF0aC5sb3dlcigpLnJlcGxhY2Uob3Muc2VwLCAnLScpCisKKworZGVmIF9HZXRQYXJlbnRJbXBvcnRQYXRoKHBhcmVudF9idWlsZF9wYXRoKToKKyAgcmVwb3NpdG9yeV9yZWxhdGl2ZV9wYXRoID0gX0dldFBhdGhSZWxhdGl2ZVRvUmVwb3NpdG9yeShwYXJlbnRfYnVpbGRfcGF0aCkKKyAgcmV0dXJuIHJlcG9zaXRvcnlfcmVsYXRpdmVfcGF0aC5yZXBsYWNlKG9zLnNlcCwgJy4nKQorCisKK2RlZiBfQ3JlYXRlRGVyaXZlZEJ1aWxkKHBhcmVudF9idWlsZF9wYXRoLCBwYXJlbnRfY29uZmlndXJhdGlvbl9jbGFzc19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2J1aWxkX3BhdGgpOgorICBnZW5lcmFsX3RlbXBsYXRlX2RpY3Rpb25hcnkgPSB7CisgICAgICAnY29weXJpZ2h0X3llYXInOgorICAgICAgICAgIF9HZXRDb3B5cmlnaHRZZWFyKCksCisgICAgICAnYXV0b19nZW5lcmF0ZWRfY2NfcHJlYW1ibGVfY29tbWVudCc6CisgICAgICAgICAgX0dldEF1dG9HZW5lcmF0ZWRQcmVhbWJsZUNvbW1lbnQoJ2NjJyksCisgICAgICAnYXV0b19nZW5lcmF0ZWRfcHl0aG9uX3ByZWFtYmxlX2NvbW1lbnQnOgorICAgICAgICAgIF9HZXRBdXRvR2VuZXJhdGVkUHJlYW1ibGVDb21tZW50KCdweXRob24nKSwKKyAgICAgICdwYXJlbnRfYnVpbGRfcGF0aCc6CisgICAgICAgICAgX0dldFBhdGhSZWxhdGl2ZVRvUmVwb3NpdG9yeShwYXJlbnRfYnVpbGRfcGF0aCksCisgICAgICAnYnVpbGRfbmFtZSc6CisgICAgICAgICAgX0dldEJ1aWxkTmFtZShvdXRwdXRfYnVpbGRfcGF0aCksCisgICAgICAncGFyZW50X2ltcG9ydF9wYXRoJzoKKyAgICAgICAgICBfR2V0UGFyZW50SW1wb3J0UGF0aChwYXJlbnRfYnVpbGRfcGF0aCksCisgICAgICAncGFyZW50X2NvbmZpZ3VyYXRpb25fY2xhc3NfbmFtZSc6CisgICAgICAgICAgcGFyZW50X2NvbmZpZ3VyYXRpb25fY2xhc3NfbmFtZSwKKyAgfQorCisgICMgR28gdGhyb3VnaCBlYWNoIGZpbGUgaW4gdGhlIGxpc3Qgb2YgZmlsZXMgdG8gZ2VuZXJhdGUgYW5kIGZvciBlYWNoIG9uZQorICAjIGFwcGx5IHRoZSBkaWN0aW9uYXJ5IHRvIHRoZSB0ZW1wbGF0ZSB0byBwcm9kdWNlIHRoZSBnZW5lcmF0ZWQgZmlsZS4KKyAgZm9yIGdlbl9maWxlIGluIEZJTEVTX1RPX0dFTkVSQVRFOgorICAgIG91dHB1dF9maWxlX3BhdGggPSBvcy5wYXRoLmpvaW4ob3V0cHV0X2J1aWxkX3BhdGgsIGdlbl9maWxlKQorCisgICAgIyBBcHBseSBwZXItZmlsZSBjdXN0b21pemF0aW9ucyB0byB0aGUgdGVtcGxhdGUgZGljdGlvbmFyeS4KKyAgICBmaWxlX3RlbXBsYXRlX2RpY3Rpb25hcnkgPSBnZW5lcmFsX3RlbXBsYXRlX2RpY3Rpb25hcnkKKyAgICBmaWxlX3RlbXBsYXRlX2RpY3Rpb25hcnlbJ2luY2x1ZGVfZ3VhcmQnXSA9ICgKKyAgICAgICAgX0dldEluY2x1ZGVHdWFyZChvdXRwdXRfZmlsZV9wYXRoKSkKKworICAgIF9HZW5lcmF0ZUZpbGUob3V0cHV0X2ZpbGVfcGF0aCwKKyAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihURU1QTEFURV9ESVJFQ1RPUlksIGdlbl9maWxlKSArICcudGVtcGxhdGUnLAorICAgICAgICAgICAgICAgICAgZmlsZV90ZW1wbGF0ZV9kaWN0aW9uYXJ5KQorCisKK2RlZiBtYWluKCk6CisgIGxvZ2dpbmcuYmFzaWNDb25maWcoCisgICAgICBsZXZlbD1sb2dnaW5nLklORk8sCisgICAgICBmb3JtYXQ9KCdbJShmaWxlbmFtZSlzOiUobGluZW5vKXMgLSAlKGFzY3RpbWUpcyAlKGxldmVsbmFtZSktOHNdICcKKyAgICAgICAgICAgICAgJyUobWVzc2FnZSlzJyksCisgICAgICBkYXRlZm10PSclbS0lZCAlSDolTScpCisKKyAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoCisgICAgICBmb3JtYXR0ZXJfY2xhc3M9YXJncGFyc2UuQXJndW1lbnREZWZhdWx0c0hlbHBGb3JtYXR0ZXIsCisgICAgICBkZXNjcmlwdGlvbj10ZXh0d3JhcC5kZWRlbnQoX19kb2NfXykpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAnLXAnLAorICAgICAgJy0tcGFyZW50X2J1aWxkX3BhdGgnLAorICAgICAgcmVxdWlyZWQ9VHJ1ZSwKKyAgICAgIHR5cGU9c3RyLAorICAgICAgaGVscD0nUGF0aCB0byB0aGUgYnVpbGQgdGhhdCB0aGUgZGVzdGluYXRpb24gYnVpbGQgd2lsbCBpbmhlcml0IGZyb20uJykKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICctYycsCisgICAgICAnLS1wYXJlbnRfY29uZmlndXJhdGlvbl9jbGFzc19uYW1lJywKKyAgICAgIHJlcXVpcmVkPVRydWUsCisgICAgICB0eXBlPXN0ciwKKyAgICAgIGhlbHA9J1RoZSBuYW1lIG9mIHRoZSBjbGFzcyBpbiB0aGUgcGFyZW50IGJ1aWxkXCdzIGd5cF9jb25maWd1cmF0aW9uLnB5ICcKKyAgICAgICdmaWxlIHRoYXQgdGhlIGRlcml2ZWQgYnVpbGRcJ3MgZ3lwX2NvbmZpZ3VyYXRpb24ucHkgc2hvdWxkICcKKyAgICAgICdkZXJpdmUgZnJvbS4gIFlvdSBtYXkgaGF2ZSB0byBvcGVuIHRoZSBwYXJlbnQgYnVpbGRcJ3MgJworICAgICAgJ2d5cF9jb25maWd1cmF0aW9uLnB5IGZpbGUgdG8ga25vdyB3aGF0IHRvIHBhc3MgaW4gZm9yIHRoaXMgJworICAgICAgJ3BhcmFtZXRlci4nKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgJy1vJywKKyAgICAgICctLW91dHB1dF9idWlsZF9wYXRoJywKKyAgICAgIHJlcXVpcmVkPVRydWUsCisgICAgICB0eXBlPXN0ciwKKyAgICAgIGhlbHA9J1BhdGggdG8gdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgZGVzdGluYXRpb24gYnVpbGRcJ3MgZmlsZXMgd2lsbCAnCisgICAgICAnYmUgY3JlYXRlZC4nKQorICBhcmd1bWVudHMgPSBwYXJzZXIucGFyc2VfYXJncygpCisKKyAgcmV0dXJuIF9DcmVhdGVEZXJpdmVkQnVpbGQoCisgICAgICBvcy5wYXRoLm5vcm1wYXRoKGFyZ3VtZW50cy5wYXJlbnRfYnVpbGRfcGF0aCksCisgICAgICBhcmd1bWVudHMucGFyZW50X2NvbmZpZ3VyYXRpb25fY2xhc3NfbmFtZSwKKyAgICAgIG9zLnBhdGgubm9ybXBhdGgoYXJndW1lbnRzLm91dHB1dF9idWlsZF9wYXRoKSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICBzeXMuZXhpdChtYWluKCkpCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3Rvb2xzL2NyZWF0ZV9kZXJpdmVkX2J1aWxkX3RlbXBsYXRlcy9hdG9taWNfcHVibGljLmgudGVtcGxhdGUgYi9zcmMvc3RhcmJvYXJkL3Rvb2xzL2NyZWF0ZV9kZXJpdmVkX2J1aWxkX3RlbXBsYXRlcy9hdG9taWNfcHVibGljLmgudGVtcGxhdGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg2ZjJmNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvdG9vbHMvY3JlYXRlX2Rlcml2ZWRfYnVpbGRfdGVtcGxhdGVzL2F0b21pY19wdWJsaWMuaC50ZW1wbGF0ZQpAQCAtMCwwICsxLDIyIEBACisvLyBDb3B5cmlnaHQge2NvcHlyaWdodF95ZWFyfSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCit7YXV0b19nZW5lcmF0ZWRfY2NfcHJlYW1ibGVfY29tbWVudH0KKworI2lmbmRlZiB7aW5jbHVkZV9ndWFyZH0KKyNkZWZpbmUge2luY2x1ZGVfZ3VhcmR9CisKKyNpbmNsdWRlICJ7cGFyZW50X2J1aWxkX3BhdGh9L2F0b21pY19wdWJsaWMuaCIKKworI2VuZGlmICAvLyB7aW5jbHVkZV9ndWFyZH0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvdG9vbHMvY3JlYXRlX2Rlcml2ZWRfYnVpbGRfdGVtcGxhdGVzL2NvbmZpZ3VyYXRpb25fcHVibGljLmgudGVtcGxhdGUgYi9zcmMvc3RhcmJvYXJkL3Rvb2xzL2NyZWF0ZV9kZXJpdmVkX2J1aWxkX3RlbXBsYXRlcy9jb25maWd1cmF0aW9uX3B1YmxpYy5oLnRlbXBsYXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NWMyNWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL3Rvb2xzL2NyZWF0ZV9kZXJpdmVkX2J1aWxkX3RlbXBsYXRlcy9jb25maWd1cmF0aW9uX3B1YmxpYy5oLnRlbXBsYXRlCkBAIC0wLDAgKzEsMjIgQEAKKy8vIENvcHlyaWdodCB7Y29weXJpZ2h0X3llYXJ9IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3thdXRvX2dlbmVyYXRlZF9jY19wcmVhbWJsZV9jb21tZW50fQorCisjaWZuZGVmIHtpbmNsdWRlX2d1YXJkfQorI2RlZmluZSB7aW5jbHVkZV9ndWFyZH0KKworI2luY2x1ZGUgIntwYXJlbnRfYnVpbGRfcGF0aH0vY29uZmlndXJhdGlvbl9wdWJsaWMuaCIKKworI2VuZGlmICAvLyB7aW5jbHVkZV9ndWFyZH0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvdG9vbHMvY3JlYXRlX2Rlcml2ZWRfYnVpbGRfdGVtcGxhdGVzL2d5cF9jb25maWd1cmF0aW9uLmd5cGkudGVtcGxhdGUgYi9zcmMvc3RhcmJvYXJkL3Rvb2xzL2NyZWF0ZV9kZXJpdmVkX2J1aWxkX3RlbXBsYXRlcy9neXBfY29uZmlndXJhdGlvbi5neXBpLnRlbXBsYXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZmE0OWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL3Rvb2xzL2NyZWF0ZV9kZXJpdmVkX2J1aWxkX3RlbXBsYXRlcy9neXBfY29uZmlndXJhdGlvbi5neXBpLnRlbXBsYXRlCkBAIC0wLDAgKzEsMzkgQEAKKyMgQ29weXJpZ2h0IHtjb3B5cmlnaHRfeWVhcn0gR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKwore2F1dG9fZ2VuZXJhdGVkX3B5dGhvbl9wcmVhbWJsZV9jb21tZW50fQorCit7eworICAndGFyZ2V0X2RlZmF1bHRzJzoge3sKKyAgICAnZGVmYXVsdF9jb25maWd1cmF0aW9uJzogJ3tidWlsZF9uYW1lfV9kZWJ1ZycsCisgICAgJ2NvbmZpZ3VyYXRpb25zJzoge3sKKyAgICAgICd7YnVpbGRfbmFtZX1fZGVidWcnOiB7eworICAgICAgICAnaW5oZXJpdF9mcm9tJzogWydkZWJ1Z19iYXNlJ10sCisgICAgICB9fSwKKyAgICAgICd7YnVpbGRfbmFtZX1fZGV2ZWwnOiB7eworICAgICAgICAnaW5oZXJpdF9mcm9tJzogWydkZXZlbF9iYXNlJ10sCisgICAgICB9fSwKKyAgICAgICd7YnVpbGRfbmFtZX1fcWEnOiB7eworICAgICAgICAnaW5oZXJpdF9mcm9tJzogWydxYV9iYXNlJ10sCisgICAgICB9fSwKKyAgICAgICd7YnVpbGRfbmFtZX1fZ29sZCc6IHt7CisgICAgICAgICdpbmhlcml0X2Zyb20nOiBbJ2dvbGRfYmFzZSddLAorICAgICAgfX0sCisgICAgfX0sICMgZW5kIG9mIGNvbmZpZ3VyYXRpb25zCisgIH19LAorCisgICdpbmNsdWRlcyc6IFsKKyAgICAnPChERVBUSCkve3BhcmVudF9idWlsZF9wYXRofS9neXBfY29uZmlndXJhdGlvbi5neXBpJywKKyAgXSwKK319CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3Rvb2xzL2NyZWF0ZV9kZXJpdmVkX2J1aWxkX3RlbXBsYXRlcy9neXBfY29uZmlndXJhdGlvbi5weS50ZW1wbGF0ZSBiL3NyYy9zdGFyYm9hcmQvdG9vbHMvY3JlYXRlX2Rlcml2ZWRfYnVpbGRfdGVtcGxhdGVzL2d5cF9jb25maWd1cmF0aW9uLnB5LnRlbXBsYXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MTkzOTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL3Rvb2xzL2NyZWF0ZV9kZXJpdmVkX2J1aWxkX3RlbXBsYXRlcy9neXBfY29uZmlndXJhdGlvbi5weS50ZW1wbGF0ZQpAQCAtMCwwICsxLDIyIEBACisjIENvcHlyaWdodCB7Y29weXJpZ2h0X3llYXJ9IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3thdXRvX2dlbmVyYXRlZF9weXRob25fcHJlYW1ibGVfY29tbWVudH0KKworCitmcm9tIHtwYXJlbnRfaW1wb3J0X3BhdGh9IGltcG9ydCBneXBfY29uZmlndXJhdGlvbiBhcyBwYXJlbnRfY29uZmlndXJhdGlvbgorCisKK2RlZiBDcmVhdGVQbGF0Zm9ybUNvbmZpZygpOgorICByZXR1cm4gcGFyZW50X2NvbmZpZ3VyYXRpb24ue3BhcmVudF9jb25maWd1cmF0aW9uX2NsYXNzX25hbWV9KCd7YnVpbGRfbmFtZX0nKQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC90b29scy9jcmVhdGVfZGVyaXZlZF9idWlsZF90ZW1wbGF0ZXMvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cC50ZW1wbGF0ZSBiL3NyYy9zdGFyYm9hcmQvdG9vbHMvY3JlYXRlX2Rlcml2ZWRfYnVpbGRfdGVtcGxhdGVzL3N0YXJib2FyZF9wbGF0Zm9ybS5neXAudGVtcGxhdGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY3ODk3ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvdG9vbHMvY3JlYXRlX2Rlcml2ZWRfYnVpbGRfdGVtcGxhdGVzL3N0YXJib2FyZF9wbGF0Zm9ybS5neXAudGVtcGxhdGUKQEAgLTAsMCArMSwyMyBAQAorIyBDb3B5cmlnaHQge2NvcHlyaWdodF95ZWFyfSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCit7YXV0b19nZW5lcmF0ZWRfcHl0aG9uX3ByZWFtYmxlX2NvbW1lbnR9CisKK3t7CisgICdpbmNsdWRlcyc6IFsKKyAgICAjIE5vdGUgdGhhdCB3ZSBhcmUgJ2luY2x1ZGVzJ2luZyBhICdneXAnIGZpbGUsIG5vdCBhICdneXBpJyBmaWxlLiAgVGhlIGlkZWEKKyAgICAjIGlzIHRoYXQgd2UganVzdCB3YW50IHRoaXMgZmlsZSB0byAqYmUqIHRoZSBwYXJlbnQgZ3lwIGZpbGUuCisgICAgJzwoREVQVEgpL3twYXJlbnRfYnVpbGRfcGF0aH0vc3RhcmJvYXJkX3BsYXRmb3JtLmd5cCcsCisgIF0sCit9fQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC90b29scy9jcmVhdGVfZGVyaXZlZF9idWlsZF90ZW1wbGF0ZXMvc3RhcmJvYXJkX3BsYXRmb3JtX3Rlc3RzLmd5cC50ZW1wbGF0ZSBiL3NyYy9zdGFyYm9hcmQvdG9vbHMvY3JlYXRlX2Rlcml2ZWRfYnVpbGRfdGVtcGxhdGVzL3N0YXJib2FyZF9wbGF0Zm9ybV90ZXN0cy5neXAudGVtcGxhdGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM4OWM5NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvdG9vbHMvY3JlYXRlX2Rlcml2ZWRfYnVpbGRfdGVtcGxhdGVzL3N0YXJib2FyZF9wbGF0Zm9ybV90ZXN0cy5neXAudGVtcGxhdGUKQEAgLTAsMCArMSwyMyBAQAorIyBDb3B5cmlnaHQge2NvcHlyaWdodF95ZWFyfSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCit7YXV0b19nZW5lcmF0ZWRfcHl0aG9uX3ByZWFtYmxlX2NvbW1lbnR9CisKK3t7CisgICdpbmNsdWRlcyc6IFsKKyAgICAjIE5vdGUgdGhhdCB3ZSBhcmUgJ2luY2x1ZGVzJ2luZyBhICdneXAnIGZpbGUsIG5vdCBhICdneXBpJyBmaWxlLiAgVGhlIGlkZWEKKyAgICAjIGlzIHRoYXQgd2UganVzdCB3YW50IHRoaXMgZmlsZSB0byAqYmUqIHRoZSBwYXJlbnQgZ3lwIGZpbGUuCisgICAgJzwoREVQVEgpL3twYXJlbnRfYnVpbGRfcGF0aH0vc3RhcmJvYXJkX3BsYXRmb3JtX3Rlc3RzLmd5cCcsCisgIF0sCit9fQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC90b29scy9jcmVhdGVfZGVyaXZlZF9idWlsZF90ZW1wbGF0ZXMvdGhyZWFkX3R5cGVzX3B1YmxpYy5oLnRlbXBsYXRlIGIvc3JjL3N0YXJib2FyZC90b29scy9jcmVhdGVfZGVyaXZlZF9idWlsZF90ZW1wbGF0ZXMvdGhyZWFkX3R5cGVzX3B1YmxpYy5oLnRlbXBsYXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MGMzMGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL3Rvb2xzL2NyZWF0ZV9kZXJpdmVkX2J1aWxkX3RlbXBsYXRlcy90aHJlYWRfdHlwZXNfcHVibGljLmgudGVtcGxhdGUKQEAgLTAsMCArMSwyMiBAQAorLy8gQ29weXJpZ2h0IHtjb3B5cmlnaHRfeWVhcn0gR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKwore2F1dG9fZ2VuZXJhdGVkX2NjX3ByZWFtYmxlX2NvbW1lbnR9CisKKyNpZm5kZWYge2luY2x1ZGVfZ3VhcmR9CisjZGVmaW5lIHtpbmNsdWRlX2d1YXJkfQorCisjaW5jbHVkZSAie3BhcmVudF9idWlsZF9wYXRofS90aHJlYWRfdHlwZXNfcHVibGljLmgiCisKKyNlbmRpZiAgLy8ge2luY2x1ZGVfZ3VhcmR9CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3Rvb2xzL2V4YW1wbGUvYXBwX2xhdW5jaGVyX2NsaWVudC5weSBiL3NyYy9zdGFyYm9hcmQvdG9vbHMvZXhhbXBsZS9hcHBfbGF1bmNoZXJfY2xpZW50LnB5CmluZGV4IGU2ZWU0OWUuLjY0MTAyN2UgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvdG9vbHMvZXhhbXBsZS9hcHBfbGF1bmNoZXJfY2xpZW50LnB5CisrKyBiL3NyYy9zdGFyYm9hcmQvdG9vbHMvZXhhbXBsZS9hcHBfbGF1bmNoZXJfY2xpZW50LnB5CkBAIC0xNSw2ICsxNSw3IEBACiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogIiIiQ2xpZW50IHRvIGxhdW5jaCBleGVjdXRhYmxlcyB2aWEgdGhlIG5ldyBsYXVuY2hlciBsb2dpYy4iIiIKIAoraW1wb3J0IHNpZ25hbAogaW1wb3J0IHN5cwogCiBpbXBvcnQgX2VudiAgIyBweWxpbnQ6IGRpc2FibGU9dW51c2VkLWltcG9ydApAQCAtMzksNiArNDAsMTUgQEAKICAgICAgIGFyZ3MucGxhdGZvcm0sIGFyZ3MudGFyZ2V0X25hbWUsIGFyZ3MuY29uZmlnLAogICAgICAgZGV2aWNlX2lkPWFyZ3MuZGV2aWNlX2lkLCB0YXJnZXRfcGFyYW1zPXRhcmdldF9wYXJhbXMsCiAgICAgICBvdXRfZGlyZWN0b3J5PWFyZ3Mub3V0X2RpcmVjdG9yeSkKKworICBkZWYgQWJvcnQoc2lnbnVtLCBmcmFtZSk6CisgICAgZGVsIHNpZ251bSwgZnJhbWUgICMgVW51c2VkLgorICAgIHN5cy5zdGRlcnIud3JpdGUoIktpbGxpbmcgdGhyZWFkXG4iKQorICAgIGxhdW5jaGVyLktpbGwoKQorICAgIHN5cy5leGl0KDEpCisKKyAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHSU5ULCBBYm9ydCkKKwogICByZXR1cm4gbGF1bmNoZXIuUnVuKCkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvdG9vbHMvbmV0X2FyZ3MucHkgYi9zcmMvc3RhcmJvYXJkL3Rvb2xzL25ldF9hcmdzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NmMwNmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL3Rvb2xzL25ldF9hcmdzLnB5CkBAIC0wLDAgKzEsMTAyIEBACisjCisjIENvcHlyaWdodCAyMDE4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyIiIkV4YW1wbGUgc2NyaXB0IGZvciBnZXR0aW5nIHRoZSBOZXQgQXJncy4iIiIKKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorCitpbXBvcnQgcHByaW50CisKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IHNvY2tldAoraW1wb3J0IHN5cworaW1wb3J0IHRocmVhZAoraW1wb3J0IHRpbWUKK2ltcG9ydCB0aHJlYWRpbmcKKworIyBSZXR1cm5zIHxUcnVlfCBpZiBhIGNvbm5lY3Rpb24gd2FzIG1hZGUgYW5kIHRoZSBOZXRBcmcgcGF5bG9hZCB3YXMgZGVsaXZlcmVkLgorIyBFeGFtcGxlOgorIyAgVHJ5Q29ubmVjdEFuZFNlbmROZXRBcmdzKCcxLjIuMy40JywgJzEyMzQnLCBbJy0tYXJndW1lbnQnLCAnLS1zd2l0Y2g9dmFsdWUnXSkKK2RlZiBUcnlDb25uZWN0QW5kU2VuZE5ldEFyZ3MoaG9zdCwgcG9ydCwgYXJnX2xpc3QpOgorICBhcmdfc3RyaW5nID0gJ1xuJy5qb2luKGFyZ19saXN0KQorCisgIHRyeToKKyAgICBzZXJ2ZXJfc29ja2V0ID0gc29ja2V0LmNyZWF0ZV9jb25uZWN0aW9uKChob3N0LCBwb3J0KSwgdGltZW91dCA9IC41KQorICAgIHJlc3VsdCA9IHNlcnZlcl9zb2NrZXQuc2VuZGFsbChhcmdfc3RyaW5nKQorICAgIHNlcnZlcl9zb2NrZXQuY2xvc2UoKQorICAgIHJldHVybiBUcnVlCisgIGV4Y2VwdCBzb2NrZXQudGltZW91dCBhcyBlcnI6CisgICAgcmV0dXJuIEZhbHNlCisgIGV4Y2VwdCBzb2NrZXQuZXJyb3IgYXMgKGVycl9ubywgZXJyX3N0cik6CisgICAgcHJpbnQoZXJyX25vLCBlcnJfc3RyKQorICAgIHJldHVybiBGYWxzZQorCitjbGFzcyBOZXRBcmdzVGhyZWFkKHRocmVhZGluZy5UaHJlYWQpOgorICAiIiJUaHJlYWRlZCB2ZXJzaW9uIG9mIE5ldEFyZ3MiIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgaG9zdCwgcG9ydCwgYXJnX2xpc3QpOgorICAgIHN1cGVyKE5ldEFyZ3NUaHJlYWQsIHNlbGYpLl9faW5pdF9fKCkKKyAgICBhc3NlcnQgaXNpbnN0YW5jZShhcmdfbGlzdCwgbGlzdCkKKyAgICBzZWxmLmhvc3QgPSBob3N0CisgICAgc2VsZi5wb3J0ID0gcG9ydAorICAgIHNlbGYuYXJnc19zZW50ID0gRmFsc2UKKyAgICBzZWxmLmpvaW5fY2FsbGVkID0gRmFsc2UKKyAgICBzZWxmLmFyZ19saXN0ID0gYXJnX2xpc3QKKyAgICBzZWxmLm11dGV4ID0gdGhyZWFkaW5nLkxvY2soKQorICAgIHNlbGYuc3RhcnQoKQorCisgIGRlZiBqb2luKHNlbGYpOgorICAgIHdpdGggc2VsZi5tdXRleDoKKyAgICAgIHNlbGYuam9pbl9jYWxsZWQgPSBUcnVlCisgICAgcmV0dXJuIHN1cGVyKE5ldEFyZ3NUaHJlYWQsIHNlbGYpLmpvaW4oKQorCisgIGRlZiBBcmdzU2VudChzZWxmKToKKyAgICB3aXRoIHNlbGYubXV0ZXg6CisgICAgICByZXR1cm4gc2VsZi5hcmdzX3NlbnQKKworICBkZWYgcnVuKHNlbGYpOgorICAgIHdoaWxlIFRydWU6CisgICAgICB3aXRoIHNlbGYubXV0ZXg6CisgICAgICAgIGlmIHNlbGYuam9pbl9jYWxsZWQ6CisgICAgICAgICAgYnJlYWsKKyAgICAgIGNvbm5lY3RlZF9hbmRfc2VudCA9IFRyeUNvbm5lY3RBbmRTZW5kTmV0QXJncygKKyAgICAgICAgICBzZWxmLmhvc3QsIHNlbGYucG9ydCwgc2VsZi5hcmdfbGlzdCkKKyAgICAgIGlmIGNvbm5lY3RlZF9hbmRfc2VudDoKKyAgICAgICAgd2l0aCBzZWxmLm11dGV4OgorICAgICAgICAgIHNlbGYuYXJnc19zZW50ID0gVHJ1ZQorICAgICAgICAgIGJyZWFrCisKK2RlZiBtYWluKGFyZ3YpOgorICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcihkZXNjcmlwdGlvbiA9ICdDb25uZWN0cyB0byB0aGUgd2VibG9nLicpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0taG9zdCcsIHR5cGU9c3RyLCByZXF1aXJlZCA9IEZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgPSAnbG9jYWxob3N0JywKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwID0gIkV4YW1wbGUgbG9jYWxob3N0IG9yIDEuMi4zLjQiKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXBvcnQnLCB0eXBlPWludCwgcmVxdWlyZWQgPSBGYWxzZSwgZGVmYXVsdCA9ICc0OTM1NScpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tYXJnJywgdHlwZT1zdHIsIHJlcXVpcmVkID0gVHJ1ZSkKKyAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKGFyZ3YpCisKKyAgbmV0X2FyZ3NfdGhyZWFkID0gTmV0QXJnc1RocmVhZCgKKyAgICAgICAgICBhcmdzLmhvc3QsIGFyZ3MucG9ydCwgW2FyZ3MuYXJnXSkKKworICB3aGlsZSBub3QgbmV0X2FyZ3NfdGhyZWFkLkFyZ3NTZW50KCk6CisgICAgcHJpbnQoIldhaXRpbmcgdG8gc2VuZCBhcmcgIiArIGFyZ3MuYXJnICsgIiB0byAiICsgc3RyKGFyZ3MuaG9zdCkgKworICAgICAgICAgICI6IiArIHN0cihhcmdzLnBvcnQpICsgIi4uLiIpCisgICAgdGltZS5zbGVlcCguNSkKKworICBwcmludCgiQXJndW1lbnQiLCBhcmdzLmFyZywgIndhcyBzZW50IHRvIiwgXAorICAgICAgICBhcmdzLmhvc3QgKyAiOiIgKyBzdHIoYXJncy5wb3J0KSkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgc3lzLmV4aXQobWFpbihzeXMuYXJndlsxOl0pKQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC90b29scy9uZXRfbG9nLnB5IGIvc3JjL3N0YXJib2FyZC90b29scy9uZXRfbG9nLnB5CmluZGV4IGY2ZDRkYzUuLjI0ZDlkYjkgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvdG9vbHMvbmV0X2xvZy5weQorKysgYi9zcmMvc3RhcmJvYXJkL3Rvb2xzL25ldF9sb2cucHkKQEAgLTIwLDYgKzIwLDcgQEAKIAogaW1wb3J0IGFyZ3BhcnNlCiBpbXBvcnQgcHByaW50CitpbXBvcnQgc2VsZWN0CiBpbXBvcnQgc29ja2V0CiBpbXBvcnQgc3lzCiBpbXBvcnQgdGltZQpAQCAtNDcsMTggKzQ4LDIxIEBACiAgICAgICBlbHNlOgogICAgICAgICByZXR1cm4gbG9nCiAgICAgZXhjZXB0IHNvY2tldC5lcnJvciBhcyAoZXJyX25vLCBlcnJfc3RyKToKLSAgICAgIHByaW50KGVycl9ubywgZXJyX3N0cikKKyAgICAgIHByaW50KF9fZmlsZV9fICsgIjogU29ja2V0IGVycm9yIHdoaWxlIHJlYWRpbmcgbG9nOiIgXAorICAgICAgICAgICAgKyBzdHIoZXJyX25vKSArICIgLSAiICsgc3RyKGVycl9zdHIpKQogICAgICAgc2VsZi5zZXJ2ZXJfc29ja2V0ID0gTm9uZQogICAgICAgcmV0dXJuIE5vbmUKIAogICAjIFByaXZhdGUgbWVtYmVycwogICBkZWYgX1RyeVJlYWQoc2VsZik6CiAgICAgdHJ5OgorICAgICAgcmVhZHlfbGlzdCwgXywgXyA9IHNlbGVjdC5zZWxlY3QoW3NlbGYuc2VydmVyX3NvY2tldF0sIFtdLCBbXSkKKyAgICAgIGlmIG5vdCByZWFkeV9saXN0OgorICAgICAgICByZXR1cm4gJycKICAgICAgIHJlc3VsdCA9IHNlbGYuc2VydmVyX3NvY2tldC5yZWN2KDEwMjQpCiAgICAgICAjIEFuIGVtcHR5IHN0cmluZyBpcyBhIGZsYWcgdGhhdCB0aGUgY29ubmVjdGlvbiBoYXMgY2xvc2VkLgogICAgICAgaWYgbGVuKHJlc3VsdCkgPT0gMDoKICAgICAgICAgcmV0dXJuIE5vbmUKLQogICAgICAgcmV0dXJuIHJlc3VsdAogICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IgYXMgKGVycl9ubywgZXJyX3N0cik6CiAgICAgICBpZiBlcnJfbm8gPT0gMTAwMzU6ICAjIERhdGEgbm90IHJlYWR5IHlldC4KQEAgLTc2LDYgKzgwLDcgQEAKICAgICBleGNlcHQgc29ja2V0LnRpbWVvdXQgYXMgZXJyOgogICAgICAgcmV0dXJuIE5vbmUKICAgICBleGNlcHQgc29ja2V0LmVycm9yIGFzIGVycjoKKyAgICAgIHByaW50KCJFcnJvciB3aGlsZSB0cnlpbmcgdG8gY3JlYXRlIHNvY2tldDogIiArIHN0cihlcnIpKQogICAgICAgcmV0dXJuIE5vbmUKIAogCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3Rvb2xzL3Rlc3RpbmcvYnVpbGRfdGVzdHMucHkgYi9zcmMvc3RhcmJvYXJkL3Rvb2xzL3Rlc3RpbmcvYnVpbGRfdGVzdHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAyNDcwZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvdG9vbHMvdGVzdGluZy9idWlsZF90ZXN0cy5weQpAQCAtMCwwICsxLDM2IEBACitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG9zCitpbXBvcnQgc3VicHJvY2VzcworCitkZWYgQnVpbGRUYXJnZXRzKHRhcmdldHMsIG91dF9kaXJlY3RvcnksIGRyeV9ydW49RmFsc2UsIGV4dHJhX2J1aWxkX2ZsYWdzPVtdKToKKyAgIiIiQnVpbGRzIGFsbCBzcGVjaWZpZWQgdGFyZ2V0cy4KKworICBBcmdzOgorICAgIGV4dHJhX2J1aWxkX2ZsYWdzOiBBZGRpdGlvbmFsIGNvbW1hbmQgbGluZSBmbGFncyB0byBwYXNzIHRvIG5pbmphLgorICAiIiIKKyAgaWYgbm90IHRhcmdldHM6CisgICAgbG9nZ2luZy5pbmZvKCdObyB0YXJnZXRzIHNwZWNpZmllZCwgbm90aGluZyB0byBidWlsZC4nKQorICAgIHJldHVybgorCisgIGFyZ3NfbGlzdCA9IFsibmluamEiLCAiLUMiLCBvdXRfZGlyZWN0b3J5XQorICBpZiBkcnlfcnVuOgorICAgIGFyZ3NfbGlzdC5hcHBlbmQoIi1uIikKKworICBhcmdzX2xpc3QuZXh0ZW5kKFsie31fZGVwbG95Ii5mb3JtYXQodGVzdF9uYW1lKSBmb3IgdGVzdF9uYW1lIGluIHRhcmdldHNdKQorICBhcmdzX2xpc3QuZXh0ZW5kKGV4dHJhX2J1aWxkX2ZsYWdzKQorCisgIGlmICJURVNUX1JVTk5FUl9CVUlMRF9GTEFHUyIgaW4gb3MuZW52aXJvbjoKKyAgICBhcmdzX2xpc3QuYXBwZW5kKG9zLmVudmlyb25bIlRFU1RfUlVOTkVSX0JVSUxEX0ZMQUdTIl0pCisKKyAgbG9nZ2luZy5pbmZvKCdCdWlsZGluZyB0YXJnZXRzIHdpdGggY29tbWFuZDogJXMnLCBzdHIoYXJnc19saXN0KSkKKworICB0cnk6CisgICAgIyBXZSBzZXQgc2hlbGw9VHJ1ZSBiZWNhdXNlIG90aGVyd2lzZSBXaW5kb3dzIGRvZXNuJ3QgcmVjb2duaXplCisgICAgIyBQQVRIIHByb3Blcmx5LgorICAgICMgICBodHRwczovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTE1NDUxCisgICAgIyBXZSBmbGF0dGVuIHRoZSBhcmd1bWVudHMgdG8gYSBzdHJpbmcgYmVjYXVzZSB3aXRoIHNoZWxsPVRydWUsIExpbnV4CisgICAgIyBkb2Vzbid0IHBhcnNlIHRoZW0gcHJvcGVybHkuCisgICAgIyAgIGh0dHBzOi8vYnVncy5weXRob24ub3JnL2lzc3VlNjY4OQorICAgIHJldHVybiBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoIiAiLmpvaW4oYXJnc19saXN0KSwgc2hlbGw9VHJ1ZSkKKyAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgIHJldHVybiAxCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3Rvb2xzL3Rlc3RpbmcvdGVzdF9ydW5uZXIucHkgYi9zcmMvc3RhcmJvYXJkL3Rvb2xzL3Rlc3RpbmcvdGVzdF9ydW5uZXIucHkKaW5kZXggMjFiYjE3OS4uMDNjYWFhNSAxMDA3NTUKLS0tIGEvc3JjL3N0YXJib2FyZC90b29scy90ZXN0aW5nL3Rlc3RfcnVubmVyLnB5CisrKyBiL3NyYy9zdGFyYm9hcmQvdG9vbHMvdGVzdGluZy90ZXN0X3J1bm5lci5weQpAQCAtMzAsNyArMzAsNyBAQAogZnJvbSBzdGFyYm9hcmQudG9vbHMgaW1wb3J0IGJ1aWxkCiBmcm9tIHN0YXJib2FyZC50b29scyBpbXBvcnQgY29tbWFuZF9saW5lCiBmcm9tIHN0YXJib2FyZC50b29scy50ZXN0aW5nIGltcG9ydCB0ZXN0X2ZpbHRlcgotCitmcm9tIHN0YXJib2FyZC50b29scy50ZXN0aW5nIGltcG9ydCBidWlsZF90ZXN0cwogCiBfVE9UQUxfVEVTVFNfUkVHRVggPSAociJcWz09PT09PT09PT1cXSAoLiopIHRlc3RzPyBmcm9tIC4qIgogICAgICAgICAgICAgICAgICAgICAgIHIidGVzdCBjYXNlcz8gcmFuLiBcKC4qIG1zIHRvdGFsXCkiKQpAQCAtMTcxLDggKzE3MSwxNCBAQAogY2xhc3MgVGVzdFJ1bm5lcihvYmplY3QpOgogICAiIiJSdW5zIHVuaXQgdGVzdHMuIiIiCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHBsYXRmb3JtLCBjb25maWcsIGRldmljZV9pZCwgc2luZ2xlX3RhcmdldCwKLSAgICAgICAgICAgICAgIHRhcmdldF9wYXJhbXMsIG91dF9kaXJlY3RvcnksIGFwcGxpY2F0aW9uX25hbWU9Tm9uZSwKKyAgZGVmIF9faW5pdF9fKHNlbGYsCisgICAgICAgICAgICAgICBwbGF0Zm9ybSwKKyAgICAgICAgICAgICAgIGNvbmZpZywKKyAgICAgICAgICAgICAgIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgIHNpbmdsZV90YXJnZXQsCisgICAgICAgICAgICAgICB0YXJnZXRfcGFyYW1zLAorICAgICAgICAgICAgICAgb3V0X2RpcmVjdG9yeSwKKyAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uX25hbWU9Tm9uZSwKICAgICAgICAgICAgICAgIGRyeV9ydW49RmFsc2UpOgogICAgIHNlbGYucGxhdGZvcm0gPSBwbGF0Zm9ybQogICAgIHNlbGYuY29uZmlnID0gY29uZmlnCkBAIC0yNTQsMzkgKzI2MCw2IEBACiAgICAgICAgIGVudl92YXJpYWJsZXNbdGVzdF0gPSB0ZXN0X2VudgogICAgIHJldHVybiBlbnZfdmFyaWFibGVzCiAKLSAgZGVmIF9CdWlsZFRlc3RzKHNlbGYsIG5pbmphX2ZsYWdzKToKLSAgICAiIiJCdWlsZHMgYWxsIHNwZWNpZmllZCB0ZXN0IGJpbmFyaWVzLgotCi0gICAgQXJnczoKLSAgICAgIG5pbmphX2ZsYWdzOiBDb21tYW5kIGxpbmUgZmxhZ3MgdG8gcGFzcyB0byBuaW5qYS4KLSAgICAiIiIKLSAgICBpZiBub3Qgc2VsZi50ZXN0X3RhcmdldHM6Ci0gICAgICByZXR1cm4KLQotICAgIGlmIHNlbGYub3V0X2RpcmVjdG9yeToKLSAgICAgIGJ1aWxkX2RpciA9IHNlbGYub3V0X2RpcmVjdG9yeQotICAgIGVsc2U6Ci0gICAgICBidWlsZF9kaXIgPSBhYnN0cmFjdF9sYXVuY2hlci5EeW5hbWljYWxseUJ1aWxkT3V0RGlyZWN0b3J5KAotICAgICAgICAgIHNlbGYucGxhdGZvcm0sIHNlbGYuY29uZmlnKQotCi0gICAgYXJnc19saXN0ID0gWyJuaW5qYSIsICItQyIsIGJ1aWxkX2Rpcl0KLSAgICBpZiBzZWxmLmRyeV9ydW46Ci0gICAgICBhcmdzX2xpc3QuYXBwZW5kKCItbiIpCi0gICAgYXJnc19saXN0LmV4dGVuZChbCi0gICAgICAgICJ7fV9kZXBsb3kiLmZvcm1hdCh0ZXN0X25hbWUpIGZvciB0ZXN0X25hbWUgaW4gc2VsZi50ZXN0X3RhcmdldHNdKQotICAgIGlmIG5pbmphX2ZsYWdzOgotICAgICAgYXJnc19saXN0LmFwcGVuZChuaW5qYV9mbGFncykKLSAgICBpZiAiVEVTVF9SVU5ORVJfQlVJTERfRkxBR1MiIGluIG9zLmVudmlyb246Ci0gICAgICBhcmdzX2xpc3QuYXBwZW5kKG9zLmVudmlyb25bIlRFU1RfUlVOTkVSX0JVSUxEX0ZMQUdTIl0pCi0gICAgc3lzLnN0ZGVyci53cml0ZSgie31cbiIuZm9ybWF0KGFyZ3NfbGlzdCkpCi0gICAgIyBXZSBzZXQgc2hlbGw9VHJ1ZSBiZWNhdXNlIG90aGVyd2lzZSBXaW5kb3dzIGRvZXNuJ3QgcmVjb2duaXplCi0gICAgIyBQQVRIIHByb3Blcmx5LgotICAgICMgICBodHRwczovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTE1NDUxCi0gICAgIyBXZSBmbGF0dGVuIHRoZSBhcmd1bWVudHMgdG8gYSBzdHJpbmcgYmVjYXVzZSB3aXRoIHNoZWxsPVRydWUsIExpbnV4Ci0gICAgIyBkb2Vzbid0IHBhcnNlIHRoZW0gcHJvcGVybHkuCi0gICAgIyAgIGh0dHBzOi8vYnVncy5weXRob24ub3JnL2lzc3VlNjY4OQotICAgIHN1YnByb2Nlc3MuY2hlY2tfY2FsbCgiICIuam9pbihhcmdzX2xpc3QpLCBzaGVsbD1UcnVlKQotCiAgIGRlZiBfUnVuVGVzdChzZWxmLCB0YXJnZXRfbmFtZSk6CiAgICAgIiIiUnVucyBhIHNpbmdsZSB1bml0IHRlc3QgYmluYXJ5IGFuZCBjb2xsZWN0cyBhbGwgb2YgdGhlIG91dHB1dC4KIApAQCAtMzEzLDkgKzI4NiwxMyBAQAogICAgIHRlc3RfcGFyYW1zLmV4dGVuZChzZWxmLnRhcmdldF9wYXJhbXMpCiAKICAgICBsYXVuY2hlciA9IGFic3RyYWN0X2xhdW5jaGVyLkxhdW5jaGVyRmFjdG9yeSgKLSAgICAgICAgc2VsZi5wbGF0Zm9ybSwgdGFyZ2V0X25hbWUsIHNlbGYuY29uZmlnLAotICAgICAgICBkZXZpY2VfaWQ9c2VsZi5kZXZpY2VfaWQsIHRhcmdldF9wYXJhbXM9dGVzdF9wYXJhbXMsCi0gICAgICAgIG91dHB1dF9maWxlPXdyaXRlX3BpcGUsIG91dF9kaXJlY3Rvcnk9c2VsZi5vdXRfZGlyZWN0b3J5LAorICAgICAgICBzZWxmLnBsYXRmb3JtLAorICAgICAgICB0YXJnZXRfbmFtZSwKKyAgICAgICAgc2VsZi5jb25maWcsCisgICAgICAgIGRldmljZV9pZD1zZWxmLmRldmljZV9pZCwKKyAgICAgICAgdGFyZ2V0X3BhcmFtcz10ZXN0X3BhcmFtcywKKyAgICAgICAgb3V0cHV0X2ZpbGU9d3JpdGVfcGlwZSwKKyAgICAgICAgb3V0X2RpcmVjdG9yeT1zZWxmLm91dF9kaXJlY3RvcnksCiAgICAgICAgIGVudl92YXJpYWJsZXM9ZW52KQogCiAgICAgdGVzdF9yZWFkZXIgPSBUZXN0TGluZVJlYWRlcihyZWFkX3BpcGUpCkBAIC0zMjUsOSArMzAyLDggQEAKICAgICBzZWxmLnRocmVhZHMuYXBwZW5kKHRlc3RfcmVhZGVyKQogCiAgICAgaWYgc2VsZi5kcnlfcnVuOgotICAgICAgc3lzLnN0ZG91dC53cml0ZSgKLSAgICAgICAgICAie30ge31cbiIuZm9ybWF0KHRhcmdldF9uYW1lLCB0ZXN0X3BhcmFtcykgaWYgdGVzdF9wYXJhbXMKLSAgICAgICAgICBlbHNlICJ7fVxuIi5mb3JtYXQodGFyZ2V0X25hbWUpKQorICAgICAgc3lzLnN0ZG91dC53cml0ZSgie30ge31cbiIuZm9ybWF0KHRhcmdldF9uYW1lLCB0ZXN0X3BhcmFtcykKKyAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdF9wYXJhbXMgZWxzZSAie31cbiIuZm9ybWF0KHRhcmdldF9uYW1lKSkKICAgICAgIHdyaXRlX3BpcGUuY2xvc2UoKQogICAgICAgcmVhZF9waXBlLmNsb3NlKCkKIApAQCAtNDA0LDYgKzM4MCwxMCBAQAogICAgICAgICBmYWlsZWRfdGVzdHMuYXBwZW5kKHRlc3RfZmFpbGVkX21hdGNoLmdyb3VwKDEpKQogICAgIHJldHVybiBmYWlsZWRfdGVzdHMKIAorICBkZWYgX0dldEZpbHRlcmVkVGVzdExpc3Qoc2VsZiwgdGFyZ2V0X25hbWUpOgorICAgIHJldHVybiBfRmlsdGVyVGVzdHMoW3RhcmdldF9uYW1lXSwgc2VsZi5fR2V0VGVzdEZpbHRlcnMoKSwgc2VsZi5jb25maWcpLmdldCgKKyAgICAgICAgdGFyZ2V0X25hbWUsIFtdKQorCiAgIGRlZiBfUHJvY2Vzc0FsbFRlc3RSZXN1bHRzKHNlbGYsIHJlc3VsdHMpOgogICAgICIiIkNvbGxlY3RzIGFuZCByZXR1cm5zIG91dHB1dCBmb3IgYWxsIHNlbGVjdGVkIHRlc3RzLgogCkBAIC00MjAsNiArNDAwLDggQEAKICAgICB0b3RhbF9ydW5fY291bnQgPSAwCiAgICAgdG90YWxfcGFzc2VkX2NvdW50ID0gMAogICAgIHRvdGFsX2ZhaWxlZF9jb3VudCA9IDAKKyAgICB0b3RhbF9mbGFreV9mYWlsZWRfY291bnQgPSAwCisgICAgdG90YWxfZmlsdGVyZWRfY291bnQgPSAwCiAKICAgICAjIElmIHRoZSBudW1iZXIgb2YgcnVuIHRlc3RzIGZyb20gYSB0ZXN0IGJpbmFyeSBjYW5ub3QgYmUKICAgICAjIGRldGVybWluZWQsIGFzc3VtZSBhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBydW5uaW5nIGl0LgpAQCAtNDM1LDYgKzQxNyw5IEBACiAgICAgICBmYWlsZWRfY291bnQgPSByZXN1bHRfc2V0WzNdCiAgICAgICBmYWlsZWRfdGVzdHMgPSByZXN1bHRfc2V0WzRdCiAgICAgICByZXR1cm5fY29kZSA9IHJlc3VsdF9zZXRbNV0KKyAgICAgIGZsYWt5X2ZhaWxlZF90ZXN0cyA9IFsKKyAgICAgICAgICB0ZXN0X25hbWUgZm9yIHRlc3RfbmFtZSBpbiBmYWlsZWRfdGVzdHMgaWYgIi5GTEFLWV8iIGluIHRlc3RfbmFtZQorICAgICAgXQogCiAgICAgICB0ZXN0X3N0YXR1cyA9ICJTVUNDRUVERUQiCiAgICAgICBpZiByZXR1cm5fY29kZSAhPSAwOgpAQCAtNDQzLDcgKzQyOCw3IEBACiAKICAgICAgIHByaW50ICJ7fToge30uIi5mb3JtYXQodGFyZ2V0X25hbWUsIHRlc3Rfc3RhdHVzKQogICAgICAgaWYgcnVuX2NvdW50ID09IDA6Ci0gICAgICAgIHByaW50IiAgUmVzdWx0cyBub3QgYXZhaWxhYmxlLiAgRGlkIHRoZSB0ZXN0IGNyYXNoP1xuIgorICAgICAgICBwcmludCAiICBSZXN1bHRzIG5vdCBhdmFpbGFibGUuICBEaWQgdGhlIHRlc3QgY3Jhc2g/XG4iCiAgICAgICAgIGNvbnRpbnVlCiAKICAgICAgIHByaW50ICIgIFRPVEFMIFRFU1RTIFJVTjoge30iLmZvcm1hdChydW5fY291bnQpCkBAIC00NTMsMTYgKzQzOCwyMyBAQAogICAgICAgaWYgZmFpbGVkX2NvdW50ID4gMDoKICAgICAgICAgcHJpbnQgIiAgRkFJTEVEOiB7fSIuZm9ybWF0KGZhaWxlZF9jb3VudCkKICAgICAgICAgdG90YWxfZmFpbGVkX2NvdW50ICs9IGZhaWxlZF9jb3VudAorICAgICAgICB0b3RhbF9mbGFreV9mYWlsZWRfY291bnQgKz0gbGVuKGZsYWt5X2ZhaWxlZF90ZXN0cykKICAgICAgICAgcHJpbnQgIlxuICBGQUlMRUQgVEVTVFM6IgogICAgICAgICBmb3IgbGluZSBpbiBmYWlsZWRfdGVzdHM6CiAgICAgICAgICAgcHJpbnQgIiAgICB7fSIuZm9ybWF0KGxpbmUpCisgICAgICBmaWx0ZXJlZF9jb3VudCA9IGxlbihzZWxmLl9HZXRGaWx0ZXJlZFRlc3RMaXN0KHRhcmdldF9uYW1lKSkKKyAgICAgIGlmIGZpbHRlcmVkX2NvdW50ID4gMDoKKyAgICAgICAgcHJpbnQgIiAgRklMVEVSRUQ6IHt9Ii5mb3JtYXQoZmlsdGVyZWRfY291bnQpCisgICAgICAgIHRvdGFsX2ZpbHRlcmVkX2NvdW50ICs9IGZpbHRlcmVkX2NvdW50CiAgICAgICAjIFByaW50IGEgc2luZ2xlIG5ld2xpbmUgdG8gc2VwYXJhdGUgcmVzdWx0cyBmcm9tIGVhY2ggdGVzdCBydW4KICAgICAgIHByaW50CiAKICAgICBvdmVyYWxsX3N0YXR1cyA9ICJTVUNDRUVERUQiCiAgICAgcmVzdWx0ID0gVHJ1ZQogCi0gICAgaWYgZXJyb3Igb3IgdG90YWxfZmFpbGVkX2NvdW50ID4gMDoKKyAgICAjIElmIHdlIG9ubHkgZmFpbGVkIHRlc3RzIHRoYXQgYXJlIGNvbnNpZGVyZWQgZmxha3ksIHRoZW4gY291bnQgdGhpcyBydW4KKyAgICAjIGFzIGEgcGFzcy4KKyAgICBpZiBlcnJvciBvciB0b3RhbF9mYWlsZWRfY291bnQgLSB0b3RhbF9mbGFreV9mYWlsZWRfY291bnQgPiAwOgogICAgICAgb3ZlcmFsbF9zdGF0dXMgPSAiRkFJTEVEIgogICAgICAgcmVzdWx0ID0gRmFsc2UKIApAQCAtNDcwLDYgKzQ2Miw4IEBACiAgICAgcHJpbnQgIiAgVE9UQUwgVEVTVFMgUlVOOiB7fSIuZm9ybWF0KHRvdGFsX3J1bl9jb3VudCkKICAgICBwcmludCAiICBUT1RBTCBURVNUUyBQQVNTRUQ6IHt9Ii5mb3JtYXQodG90YWxfcGFzc2VkX2NvdW50KQogICAgIHByaW50ICIgIFRPVEFMIFRFU1RTIEZBSUxFRDoge30iLmZvcm1hdCh0b3RhbF9mYWlsZWRfY291bnQpCisgICAgcHJpbnQgIiAgVE9UQUwgVEVTVFMgRklMVEVSRUQ6IHt9Ii5mb3JtYXQodG90YWxfZmlsdGVyZWRfY291bnQpCisgICAgcHJpbnQgIiAgVE9UQUwgRkxBS1kgVEVTVFMgRkFJTEVEOiB7fSIuZm9ybWF0KHRvdGFsX2ZsYWt5X2ZhaWxlZF9jb3VudCkKIAogICAgIHJldHVybiByZXN1bHQKIApAQCAtNDg1LDcgKzQ3OSwyMCBAQAogICAgIHJlc3VsdCA9IFRydWUKIAogICAgIHRyeToKLSAgICAgIHNlbGYuX0J1aWxkVGVzdHMobmluamFfZmxhZ3MpCisgICAgICBpZiBzZWxmLm91dF9kaXJlY3Rvcnk6CisgICAgICAgIG91dF9kaXJlY3RvcnkgPSBzZWxmLm91dF9kaXJlY3RvcnkKKyAgICAgIGVsc2U6CisgICAgICAgIG91dF9kaXJlY3RvcnkgPSBhYnN0cmFjdF9sYXVuY2hlci5EeW5hbWljYWxseUJ1aWxkT3V0RGlyZWN0b3J5KAorICAgICAgICAgICAgc2VsZi5wbGF0Zm9ybSwgc2VsZi5jb25maWcpCisKKyAgICAgIGlmIG5pbmphX2ZsYWdzOgorICAgICAgICBleHRyYV9mbGFncyA9IFtuaW5qYV9mbGFnc10KKyAgICAgIGVsc2U6CisgICAgICAgIGV4dHJhX2ZsYWdzID0gW10KKworICAgICAgYnVpbGRfdGVzdHMuQnVpbGRUYXJnZXRzKHNlbGYudGVzdF90YXJnZXRzLCBvdXRfZGlyZWN0b3J5LCBzZWxmLmRyeV9ydW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFfZmxhZ3MpCisKICAgICBleGNlcHQgc3VicHJvY2Vzcy5DYWxsZWRQcm9jZXNzRXJyb3IgYXMgZToKICAgICAgIHJlc3VsdCA9IEZhbHNlCiAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJFcnJvciBvY2N1cnJlZCBkdXJpbmcgYnVpbGRpbmcuXG4iKQpAQCAtNTI4LDkgKzUzNSw3IEBACiAgICAgICBhY3Rpb249InN0b3JlX3RydWUiLAogICAgICAgaGVscD0iU3BlY2lmaWVzIHRvIHNob3cgd2hhdCB3b3VsZCBiZSBkb25lIHdpdGhvdXQgYWN0dWFsbHkgZG9pbmcgaXQuIikKICAgYXJnX3BhcnNlci5hZGRfYXJndW1lbnQoCi0gICAgICAiLXQiLAotICAgICAgIi0tdGFyZ2V0X25hbWUiLAotICAgICAgaGVscD0iTmFtZSBvZiBleGVjdXRhYmxlIHRhcmdldC4iKQorICAgICAgIi10IiwgIi0tdGFyZ2V0X25hbWUiLCBoZWxwPSJOYW1lIG9mIGV4ZWN1dGFibGUgdGFyZ2V0LiIpCiAgIGFyZ19wYXJzZXIuYWRkX2FyZ3VtZW50KAogICAgICAgIi1hIiwKICAgICAgICItLWFwcGxpY2F0aW9uX25hbWUiLApAQCAtNTg3LDUgKzU5Miw2IEBACiAgIGVsc2U6CiAgICAgcmV0dXJuIDAKIAorCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICBzeXMuZXhpdChtYWluKCkpCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3Rvb2xzL3Rvb2xjaGFpbi9hYnN0cmFjdC5weSBiL3NyYy9zdGFyYm9hcmQvdG9vbHMvdG9vbGNoYWluL2Fic3RyYWN0LnB5CmluZGV4IDI1NGQyZTguLmRjOTY1MDMgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvdG9vbHMvdG9vbGNoYWluL2Fic3RyYWN0LnB5CisrKyBiL3NyYy9zdGFyYm9hcmQvdG9vbHMvdG9vbGNoYWluL2Fic3RyYWN0LnB5CkBAIC0zNTAsNiArMzUwLDQzIEBACiAgICAgcGFzcwogCiAKK2NsYXNzIFNoYXJlZExpYnJhcnlMaW5rZXIoVG9vbCk6CisgICIiIkxpbmtzIHNoYXJlZCBsaWJyYXJpZXMuIiIiCisKKyAgZGVmIElzUGxhdGZvcm1BZ25vc3RpYyhzZWxmKToKKyAgICByZXR1cm4gRmFsc2UKKworICBkZWYgR2V0UnVsZU5hbWUoc2VsZik6CisgICAgcmV0dXJuICdsaW5rX3NoYXJlZCcKKworICBkZWYgR2V0SGVhZGVyRGVwZW5kZW5jaWVzRmlsZVBhdGgoc2VsZik6CisgICAgIyBPbmx5IGFwcGxpY2FibGUgdG8gQyBmYW1pbHkgY29tcGlsZXJzLgorICAgIHJldHVybiBOb25lCisKKyAgZGVmIEdldEhlYWRlckRlcGVuZGVuY2llc0Zvcm1hdChzZWxmKToKKyAgICAjIE9ubHkgYXBwbGljYWJsZSB0byBDIGZhbWlseSBjb21waWxlcnMuCisgICAgcmV0dXJuIE5vbmUKKworICBAYWJjLmFic3RyYWN0bWV0aG9kCisgIGRlZiBHZXRGbGFncyhzZWxmLCBsZGZsYWdzKToKKyAgICAiIiJSZXR1cm5zIHRvb2wgZmxhZ3Mgc3BlY2lmaWMgdG8gYSB0YXJnZXQuCisKKyAgICBUaGlzIG1ldGhvZCB0cmFuc2xhdGVzIHBsYXRmb3JtLWFnbm9zdGljIGNvbmNlcHRzIGludG8gYSBjb21tYW5kIGxpbmUKKyAgICBhcmd1bWVudHMgdW5kZXJzdG9vZCBieSBhIHRvb2wuCisKKyAgICBBcmdzOgorICAgICAgbGRmbGFnczogQSBsaXN0IG9mIEdDQy1zdHlsZSBjb21tYW5kLWxpbmUgZmxhZ3MuIFNlZQorICAgICAgICBodHRwczovL2djYy5nbnUub3JnL29ubGluZWRvY3MvZ2NjL0xpbmstT3B0aW9ucy5odG1sI0xpbmstT3B0aW9ucyBmb3IKKyAgICAgICAgZGV0YWlscy4KKworICAgIFJldHVybnM6CisgICAgICBBIGxpc3Qgb2YgdW5xdW90ZWQgc3RyaW5ncywgb25lIGZvciBlYWNoIGZsYWcuIEl0IGlzIGEgcmVzcG9uc2liaWxpdHkgb2YgYQorICAgICAgY2FsbGVyIHRvIHF1b3RlIGZsYWdzIHRoYXQgY29udGFpbiBzcGVjaWFsIGNoYXJhY3RlcnMgKGFzIGRldGVybWluZWQgYnkgYQorICAgICAgc2hlbGwpIGJlZm9yZSBwYXNzaW5nIHRvIGEgdG9vbC4KKyAgICAiIiIKKyAgICBwYXNzCisKKwogY2xhc3MgU3RhbXAoVG9vbCk6CiAgICIiIlVwZGF0ZXMgdGhlIGFjY2VzcyBhbmQgbW9kaWZpY2F0aW9uIHRpbWVzIG9mIGEgZmlsZSB0byB0aGUgY3VycmVudCB0aW1lLiIiIgogCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3Rvb2xzL3Rvb2xjaGFpbi9jbGFuZ3h4LnB5IGIvc3JjL3N0YXJib2FyZC90b29scy90b29sY2hhaW4vY2xhbmd4eC5weQppbmRleCAzNzkxYTVmLi42ODY0NDVkIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3Rvb2xzL3Rvb2xjaGFpbi9jbGFuZ3h4LnB5CisrKyBiL3NyYy9zdGFyYm9hcmQvdG9vbHMvdG9vbGNoYWluL2NsYW5neHgucHkKQEAgLTE3LDggKzE3LDExIEBACiBmcm9tIHN0YXJib2FyZC50b29scy50b29sY2hhaW4gaW1wb3J0IGNvbW1vbgogCiAKLWNsYXNzIEV4ZWN1dGFibGVMaW5rZXIoYWJzdHJhY3QuRXhlY3V0YWJsZUxpbmtlcik6Ci0gICIiIkxpbmtzIGV4ZWN1dGFibGVzIHVzaW5nIENsYW5nIChpbnZva2VkIGFzIGNsYW5nKyspLiIiIgorY2xhc3MgRHluYW1pY0xpbmtlckJhc2Uob2JqZWN0KToKKyAgIiIiQSBiYXNlIGNsYXNzIGZvciBDbGFuZyBiYXNlZCBsaW5raW5nIG9mIGV4ZWN1dGFibGVzIGFuZCBzaGFyZWQgbGlicmFyaWVzLgorCisgIEludm9rZWQgYXMgY2xhbmcrKy4KKyAgIiIiCiAKICAgZGVmIF9faW5pdF9fKHNlbGYsICoqa3dhcmdzKToKICAgICBzZWxmLl9wYXRoID0gY29tbW9uLkdldFBhdGgoJ2NsYW5nKysnLCAqKmt3YXJncykKQEAgLTM1LDEwICszOCw2IEBACiAgIGRlZiBHZXRNYXhDb25jdXJyZW50UHJvY2Vzc2VzKHNlbGYpOgogICAgIHJldHVybiBzZWxmLl9tYXhfY29uY3VycmVudF9wcm9jZXNzZXMKIAotICBkZWYgR2V0Q29tbWFuZChzZWxmLCBwYXRoLCBleHRyYV9mbGFncywgZmxhZ3MsIHNoZWxsKToKLSAgICBkZWwgc2hlbGwgICMgTm90IHVzZWQuCi0gICAgcmV0dXJuICd7MH0gezF9IHsyfSBAJHJzcGZpbGUgLW8gJG91dCcuZm9ybWF0KHBhdGgsIGV4dHJhX2ZsYWdzLCBmbGFncykKLQogICBkZWYgR2V0RGVzY3JpcHRpb24oc2VsZik6CiAgICAgcmV0dXJuICdMSU5LICRvdXQnCiAKQEAgLTUwLDMgKzQ5LDI3IEBACiAKICAgZGVmIEdldEZsYWdzKHNlbGYsIGxkZmxhZ3MpOgogICAgIHJldHVybiBsZGZsYWdzCisKKworY2xhc3MgRXhlY3V0YWJsZUxpbmtlcihEeW5hbWljTGlua2VyQmFzZSwgYWJzdHJhY3QuRXhlY3V0YWJsZUxpbmtlcik6CisgICIiIkxpbmtzIGV4ZWN1dGFibGVzIHVzaW5nIENsYW5nIChpbnZva2VkIGFzIGNsYW5nKyspLiIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCAqKmt3YXJncyk6CisgICAgc3VwZXIoRXhlY3V0YWJsZUxpbmtlciwgc2VsZikuX19pbml0X18oKiprd2FyZ3MpCisKKyAgZGVmIEdldENvbW1hbmQoc2VsZiwgcGF0aCwgZXh0cmFfZmxhZ3MsIGZsYWdzLCBzaGVsbCk6CisgICAgZGVsIHNoZWxsICAjIE5vdCB1c2VkLgorICAgIHJldHVybiAnezB9IHsxfSB7Mn0gQCRyc3BmaWxlIC1vICRvdXQnLmZvcm1hdChwYXRoLCBleHRyYV9mbGFncywgZmxhZ3MpCisKKworY2xhc3MgU2hhcmVkTGlicmFyeUxpbmtlcihEeW5hbWljTGlua2VyQmFzZSwgYWJzdHJhY3QuU2hhcmVkTGlicmFyeUxpbmtlcik6CisgICIiIkxpbmtzIHNoYXJlZCBsaWJyYXJpZXMgdXNpbmcgQ2xhbmcgKGludm9rZWQgYXMgY2xhbmcrKykuIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsICoqa3dhcmdzKToKKyAgICBzdXBlcihTaGFyZWRMaWJyYXJ5TGlua2VyLCBzZWxmKS5fX2luaXRfXygqKmt3YXJncykKKworICBkZWYgR2V0Q29tbWFuZChzZWxmLCBwYXRoLCBleHRyYV9mbGFncywgZmxhZ3MsIHNoZWxsKToKKyAgICBkZWwgc2hlbGwgICMgTm90IHVzZWQuCisgICAgcmV0dXJuICgnezB9IC1zaGFyZWQgezF9IC1vICRvdXQgezJ9IC1XbCwtc29uYW1lPSRzb25hbWUgJworICAgICAgICAgICAgJy1XbCwtLXdob2xlLWFyY2hpdmUgQCRyc3BmaWxlIC1XbCwtLW5vLXdob2xlLWFyY2hpdmUnKS5mb3JtYXQoCisgICAgICAgICAgICAgICAgcGF0aCwgZXh0cmFfZmxhZ3MsIGZsYWdzKQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC93aW4vc2hhcmVkL2NvbmZpZ3VyYXRpb25fcHVibGljLmggYi9zcmMvc3RhcmJvYXJkL3dpbi9zaGFyZWQvY29uZmlndXJhdGlvbl9wdWJsaWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM4NjBmMC4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3dpbi9zaGFyZWQvY29uZmlndXJhdGlvbl9wdWJsaWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0vLyBPdGhlciBzb3VyY2UgZmlsZXMgc2hvdWxkIG5ldmVyIGluY2x1ZGUgdGhpcyBoZWFkZXIgZGlyZWN0bHksIGJ1dCBzaG91bGQKLS8vIGluY2x1ZGUgdGhlIGdlbmVyaWMgInN0YXJib2FyZC9jb25maWd1cmF0aW9uLmgiIGluc3RlYWQuCi0KLSNpZm5kZWYgU1RBUkJPQVJEX1dJTl9TSEFSRURfQ09ORklHVVJBVElPTl9QVUJMSUNfSF8KLSNkZWZpbmUgU1RBUkJPQVJEX1dJTl9TSEFSRURfQ09ORklHVVJBVElPTl9QVUJMSUNfSF8KLQotLy8gVGhlIEFQSSB2ZXJzaW9uIGltcGxlbWVudGVkIGJ5IHRoaXMgcGxhdGZvcm0uIFRoaXMgd2lsbCBnZW5lcmFsbHkgYmUgc2V0IHRvCi0vLyB0aGUgY3VycmVudCB2YWx1ZSBvZiBTQl9NQVhJTVVNX0FQSV9WRVJTSU9OIGF0IHRoZSB0aW1lIG9mIGltcGxlbWVudGF0aW9uLgotI2RlZmluZSBTQl9BUElfVkVSU0lPTiA3Ci0KLS8vIC0tLSBBcmNoaXRlY3R1cmUgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBXaGV0aGVyIHRoZSBjdXJyZW50IHBsYXRmb3JtIGlzIGJpZyBlbmRpYW4uIFNCX0lTX0xJVFRMRV9FTkRJQU4gd2lsbCBiZQotLy8gYXV0b21hdGljYWxseSBzZXQgYmFzZWQgb24gdGhpcy4KLSNkZWZpbmUgU0JfSVNfQklHX0VORElBTiAwCi0KLS8vIFdoZXRoZXIgdGhlIGN1cnJlbnQgcGxhdGZvcm0gaXMgYW4gQVJNIGFyY2hpdGVjdHVyZS4KLSNkZWZpbmUgU0JfSVNfQVJDSF9BUk0gMAotCi0vLyBXaGV0aGVyIHRoZSBjdXJyZW50IHBsYXRmb3JtIGlzIGEgTUlQUyBhcmNoaXRlY3R1cmUuCi0jZGVmaW5lIFNCX0lTX0FSQ0hfTUlQUyAwCi0KLS8vIFdoZXRoZXIgdGhlIGN1cnJlbnQgcGxhdGZvcm0gaXMgYSBQUEMgYXJjaGl0ZWN0dXJlLgotI2RlZmluZSBTQl9JU19BUkNIX1BQQyAwCi0KLS8vIFdoZXRoZXIgdGhlIGN1cnJlbnQgcGxhdGZvcm0gaXMgYW4geDg2IGFyY2hpdGVjdHVyZS4KLSNkZWZpbmUgU0JfSVNfQVJDSF9YODYgMQotCi0jZGVmaW5lIFNCX0lTXzMyX0JJVCAwCi0jZGVmaW5lIFNCX0lTXzY0X0JJVCAxCi0KLSNkZWZpbmUgU0JfSEFTXzMyX0JJVF9MT05HIDEKLSNkZWZpbmUgU0JfSEFTXzMyX0JJVF9QT0lOVEVSUyAwCi0KLSNkZWZpbmUgU0JfSEFTXzY0X0JJVF9MT05HIDAKLSNkZWZpbmUgU0JfSEFTXzY0X0JJVF9QT0lOVEVSUyAxCi0KLSNkZWZpbmUgU0JfSEFTX1NPQ0tFVF9FUlJPUl9DT05ORUNUSU9OX1JFU0VUX1NVUFBPUlQgMQotCi0vLyBDb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgdGhhdCBhbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gbWFrZSBzb21lIGdlbmVyYWwKLS8vIGNvbXBpbGUtdGltZSBkZWNpc2lvbnMgd2l0aCByZXNwZWN0IHRvIHRoZSB0aGUgbnVtYmVyIG9mIGNvcmVzIGxpa2VseSB0byBiZQotLy8gYXZhaWxhYmxlIG9uIHRoaXMgcGxhdGZvcm0uIEZvciBhIGRlZmluaXRpdmUgbWVhc3VyZSwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZAotLy8gc3RpbGwgY2FsbCBTYlN5c3RlbUdldE51bWJlck9mUHJvY2Vzc29ycyBhdCBydW50aW1lLgotCi0vLyBXaGV0aGVyIHRoZSBjdXJyZW50IHBsYXRmb3JtIGlzIGV4cGVjdGVkIHRvIGhhdmUgbWFueSBjb3JlcyAoPiA2KSwgb3IgYQotLy8gd2lsZGx5IHZhcnlpbmcgbnVtYmVyIG9mIGNvcmVzLgotI2RlZmluZSBTQl9IQVNfTUFOWV9DT1JFUyAxCi0KLS8vIFdoZXRoZXIgdGhlIGN1cnJlbnQgcGxhdGZvcm0gaXMgZXhwZWN0ZWQgdG8gaGF2ZSBleGFjdGx5IDEgY29yZS4KLSNkZWZpbmUgU0JfSEFTXzFfQ09SRSAwCi0KLS8vIFdoZXRoZXIgdGhlIGN1cnJlbnQgcGxhdGZvcm0gaXMgZXhwZWN0ZWQgdG8gaGF2ZSBleGFjdGx5IDIgY29yZXMuCi0jZGVmaW5lIFNCX0hBU18yX0NPUkVTIDAKLQotLy8gV2hldGhlciB0aGUgY3VycmVudCBwbGF0Zm9ybSBpcyBleHBlY3RlZCB0byBoYXZlIGV4YWN0bHkgNCBjb3Jlcy4KLSNkZWZpbmUgU0JfSEFTXzRfQ09SRVMgMAotCi0vLyBXaGV0aGVyIHRoZSBjdXJyZW50IHBsYXRmb3JtIGlzIGV4cGVjdGVkIHRvIGhhdmUgZXhhY3RseSA2IGNvcmVzLgotI2RlZmluZSBTQl9IQVNfNl9DT1JFUyAwCi0KLS8vIFdoZXRoZXIgdGhlIGN1cnJlbnQgcGxhdGZvcm0gc3VwcG9ydHMgdGhyZWFkIHByaW9yaXRpZXMuCi0jZGVmaW5lIFNCX0hBU19USFJFQURfUFJJT1JJVFlfU1VQUE9SVCAxCi0KLS8vIFdoZXRoZXIgdGhlIGN1cnJlbnQgcGxhdGZvcm0ncyB0aHJlYWQgc2NoZWR1bGVyIHdpbGwgYXV0b21hdGljYWxseSBiYWxhbmNlCi0vLyB0aHJlYWRzIGJldHdlZW4gY29yZXMsIGFzIG9wcG9zZWQgdG8gc3lzdGVtcyB3aGVyZSB0aHJlYWRzIHdpbGwgb25seSBldmVyIHJ1bgotLy8gb24gdGhlIHNwZWNpZmljYWxseSBwaW5uZWQgY29yZS4KLSNkZWZpbmUgU0JfSEFTX0NST1NTX0NPUkVfU0NIRURVTEVSIDEKLQotLy8gU29tZSBwbGF0Zm9ybXMgd2lsbCBub3QgYWxpZ24gdmFyaWFibGVzIG9uIHRoZSBzdGFjayB3aXRoIGFuIGFsaWdubWVudAotLy8gZ3JlYXRlciB0aGFuIDE2IGJ5dGVzLiBQbGF0Zm9ybXMgd2hlcmUgdGhpcyBpcyB0aGUgY2FzZSBzaG91bGQgZGVmaW5lIHRoZQotLy8gZm9sbG93aW5nIHF1aXJrLgotI3VuZGVmIFNCX0hBU19RVUlSS19ET0VTX05PVF9TVEFDS19BTElHTl9PVkVSXzE2X0JZVEVTCi0KLS8vIC0tLSBTeXN0ZW0gSGVhZGVyIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBBbnkgc3lzdGVtIGhlYWRlcnMgbGlzdGVkIGhlcmUgdGhhdCBhcmUgbm90IHByb3ZpZGVkIGJ5IHRoZSBwbGF0Zm9ybSB3aWxsIGJlCi0vLyBlbXVsYXRlZCBpbiBzdGFyYm9hcmQvdHlwZXMuaC4KLQotLy8gV2hldGhlciB0aGUgY3VycmVudCBwbGF0Zm9ybSBwcm92aWRlcyB0aGUgc3RhbmRhcmQgaGVhZGVyIHN0ZGFyZy5oLgotI2RlZmluZSBTQl9IQVNfU1REQVJHX0ggMAotCi0vLyBXaGV0aGVyIHRoZSBjdXJyZW50IHBsYXRmb3JtIHByb3ZpZGVzIHRoZSBzdGFuZGFyZCBoZWFkZXIgc3RkYm9vbC5oLgotI2RlZmluZSBTQl9IQVNfU1REQk9PTF9IIDAKLQotLy8gV2hldGhlciB0aGUgY3VycmVudCBwbGF0Zm9ybSBwcm92aWRlcyB0aGUgc3RhbmRhcmQgaGVhZGVyIHN0ZGRlZi5oLgotI2RlZmluZSBTQl9IQVNfU1REREVGX0ggMQotCi0vLyBXaGV0aGVyIHRoZSBjdXJyZW50IHBsYXRmb3JtIHByb3ZpZGVzIHRoZSBzdGFuZGFyZCBoZWFkZXIgc3RkaW50LmguCi0jZGVmaW5lIFNCX0hBU19TVERJTlRfSCAxCi0KLS8vIFdoZXRoZXIgdGhlIGN1cnJlbnQgcGxhdGZvcm0gcHJvdmlkZXMgdGhlIHN0YW5kYXJkIGhlYWRlciBpbnR0eXBlcy5oLgotI2RlZmluZSBTQl9IQVNfSU5UVFlQRVNfSCAxCi0KLS8vIFdoZXRoZXIgdGhlIGN1cnJlbnQgcGxhdGZvcm0gcHJvdmlkZXMgdGhlIHN0YW5kYXJkIGhlYWRlciB3Y2hhci5oLgotI2RlZmluZSBTQl9IQVNfV0NIQVJfSCAxCi0KLS8vIFdoZXRoZXIgdGhlIGN1cnJlbnQgcGxhdGZvcm0gcHJvdmlkZXMgdGhlIHN0YW5kYXJkIGhlYWRlciBsaW1pdHMuaC4KLSNkZWZpbmUgU0JfSEFTX0xJTUlUU19IIDEKLQotLy8gV2hldGhlciB0aGUgY3VycmVudCBwbGF0Zm9ybSBwcm92aWRlcyB0aGUgc3RhbmRhcmQgaGVhZGVyIGZsb2F0LmguCi0jZGVmaW5lIFNCX0hBU19GTE9BVF9IIDEKLQotLy8gV2hldGhlciB0aGUgY3VycmVudCBwbGF0Zm9ybSBwcm92aWRlcyBzc2l6ZV90LgotI2RlZmluZSBTQl9IQVNfU1NJWkVfVCAwCi0KLS8vIFdoZXRoZXIgdGhlIGN1cnJlbnQgcGxhdGZvcm0gaGFzIG1pY3JvcGhvbmUgc3VwcG9ydGVkLgotI2RlZmluZSBTQl9IQVNfTUlDUk9QSE9ORSAwCi0KLS8vIFdoZXRoZXIgdGhlIGN1cnJlbnQgcGxhdGZvcm0gaGFzIHNwZWVjaCBzeW50aGVzaXMuCi0jZGVmaW5lIFNCX0hBU19TUEVFQ0hfU1lOVEhFU0lTIDAKLQotLy8gV2hldGhlciB0aGUgY3VycmVudCBwbGF0Zm9ybSBoYXMgc3BlZWNoIHJlY29nbml6ZXIuCi0jZGVmaW5lIFNCX0hBU19TUEVFQ0hfUkVDT0dOSVpFUiAwCi0KLS8vIFdoZXRoZXIgdGhlIGN1cnJlbnQgcGxhdGZvcm0gaGFzIGEgRFJNIHNlc3Npb24gY2xvc2VkIGNhbGxiYWNrLgotI2RlZmluZSBTQl9IQVNfRFJNX1NFU1NJT05fQ0xPU0VEIDEKLQotI2lmICFkZWZpbmVkKF9fV0NIQVJfTUFYX18pCi0jaW5jbHVkZSA8d2NoYXIuaD4KLSNkZWZpbmUgX19XQ0hBUl9NQVhfXyBXQ0hBUl9NQVgKLSNlbmRpZgotCi0vLyBUeXBlIGRldGVjdGlvbiBmb3Igd2NoYXJfdC4KLSNpZiBkZWZpbmVkKF9fV0NIQVJfTUFYX18pICYmIFwKLSAgICAoX19XQ0hBUl9NQVhfXyA9PSAweDdmZmZmZmZmIHx8IF9fV0NIQVJfTUFYX18gPT0gMHhmZmZmZmZmZikKLSNkZWZpbmUgU0JfSVNfV0NIQVJfVF9VVEYzMiAxCi0jZWxpZiBkZWZpbmVkKF9fV0NIQVJfTUFYX18pICYmIFwKLSAgICAoX19XQ0hBUl9NQVhfXyA9PSAweDdmZmYgfHwgX19XQ0hBUl9NQVhfXyA9PSAweGZmZmYpCi0jZGVmaW5lIFNCX0lTX1dDSEFSX1RfVVRGMTYgMQotI2VuZGlmCi0KLS8vIENocm9tZSBvbmx5IGRlZmluZXMgdGhlc2UgdHdvIGlmIEFSTUVMIG9yIE1JUFNFTCBhcmUgZGVmaW5lZC4KLSNpZiBkZWZpbmVkKF9fQVJNRUxfXykKLS8vIENocm9tZSBoYXMgYW4gZXhjbHVzaW9uIGZvciBpT1MgaGVyZSwgd2Ugc2hvdWxkIHRvbyB3aGVuIHdlIHN1cHBvcnQgaU9TLgotI2RlZmluZSBTQl9JU19XQ0hBUl9UX1VOU0lHTkVEIDEKLSNlbGlmIGRlZmluZWQoX19NSVBTRUxfXykKLSNkZWZpbmUgU0JfSVNfV0NIQVJfVF9TSUdORUQgMQotI2VuZGlmCi0KLS8vIC0tLSBDb21waWxlciBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBUaGUgcGxhdGZvcm0ncyBhbm5vdGF0aW9uIGZvciBmb3JjaW5nIGEgQyBmdW5jdGlvbiB0byBiZSBpbmxpbmVkLgotLy8gICBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2J3MWhiZTZ5LmFzcHgjQW5jaG9yXzEKLSNkZWZpbmUgU0JfQ19GT1JDRV9JTkxJTkUgX19mb3JjZWlubGluZQotCi0vLyBUaGUgcGxhdGZvcm0ncyBhbm5vdGF0aW9uIGZvciBtYXJraW5nIGEgQyBmdW5jdGlvbiBhcyBzdWdnZXN0ZWQgdG8gYmUKLS8vIGlubGluZWQuCi0jZGVmaW5lIFNCX0NfSU5MSU5FIGlubGluZQotCi0vLyBUaGUgcGxhdGZvcm0ncyBhbm5vdGF0aW9uIGZvciBtYXJraW5nIGEgQyBmdW5jdGlvbiBhcyBmb3JjaWJseSBub3QKLS8vIGlubGluZWQuCi0jZGVmaW5lIFNCX0NfTk9JTkxJTkUgX19kZWNsc3BlYyhub2lubGluZSkKLQotLy8gVGhlIHBsYXRmb3JtJ3MgYW5ub3RhdGlvbiBmb3IgbWFya2luZyBhIHN5bWJvbCBhcyBleHBvcnRlZCBvdXRzaWRlIG9mIHRoZQotLy8gY3VycmVudCBzaGFyZWQgbGlicmFyeS4KLSNkZWZpbmUgU0JfRVhQT1JUX1BMQVRGT1JNIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQotCi0vLyBUaGUgcGxhdGZvcm0ncyBhbm5vdGF0aW9uIGZvciBtYXJraW5nIGEgc3ltYm9sIGFzIGltcG9ydGVkIGZyb20gb3V0c2lkZSBvZgotLy8gdGhlIGN1cnJlbnQgbGlua2luZyB1bml0LgotI2RlZmluZSBTQl9JTVBPUlRfUExBVEZPUk0KLQotLy8gT24gc29tZSBwbGF0Zm9ybXMgdGhlIF9fR05VQ19fIGlzIGRlZmluZWQgZXZlbiB0aG91Z2ggcGFydHMgb2YgdGhlCi0vLyBmdW5jdGlvbmFsaXR5IGFyZSBtaXNzaW5nLiBTZXR0aW5nIHRoaXMgdG8gbm9uLXplcm8gYWxsb3dzIGRpc2FibGluZyBtaXNzaW5nCi0vLyBmdW5jdGlvbmFsaXR5IGVuY291bnRlcmVkLgotI3VuZGVmIFNCX0hBU19RVUlSS19DT01QSUxFUl9TQVlTX0dOVUNfQlVUX0lTTlQKLQotLy8gT24gc29tZSBjb21waWxlcnMsIHRoZSBmcm9udGVuZCBoYXMgYSBxdWlyayBzdWNoIHRoYXQgI2lmZGVmIGNhbm5vdAotLy8gY29ycmVjdGx5IGRldGVjdCBfX2hhc19mZWF0dXJlIGlzIGRlZmluZWQsIGFuZCBhbiBleGFtcGxlIGVycm9yIHlvdSBnZXQgaXM6Ci0jdW5kZWYgU0JfSEFTX1FVSVJLX0hBU0ZFQVRVUkVfTk9UX0RFRklORURfQlVUX0lUX0lTCi0KLS8vIC0tLSBFeHRlbnNpb25zIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBHQ0MvQ2xhbmcgZG9lc24ndCBkZWZpbmUgYSBsb25nIGxvbmcgaGFzaCBmdW5jdGlvbiwgZXhjZXB0IGZvciBBbmRyb2lkIGFuZAotLy8gR2FtZSBjb25zb2xlcy4KLSNkZWZpbmUgU0JfSEFTX0xPTkdfTE9OR19IQVNIIDEKLQotLy8gR0NDL0NsYW5nIGRvZXNuJ3QgZGVmaW5lIGEgc3RyaW5nIGhhc2ggZnVuY3Rpb24sIGV4Y2VwdCBmb3IgR2FtZSBDb25zb2xlcy4KLSNkZWZpbmUgU0JfSEFTX1NUUklOR19IQVNIIDEKLQotLy8gRGVza3RvcCBMaW51eCBuZWVkcyBhIHVzaW5nIHN0YXRlbWVudCBmb3IgdGhlIGhhc2ggZnVuY3Rpb25zLgotI2RlZmluZSBTQl9IQVNfSEFTSF9VU0lORyAxCi0KLS8vIFNldCB0aGlzIHRvIDEgaWYgaGFzaCBmdW5jdGlvbnMgZm9yIGN1c3RvbSB0eXBlcyBjYW4gYmUgZGVmaW5lZCBhcyBhCi0vLyBoYXNoX3ZhbHVlKCkgZnVuY3Rpb24uIE90aGVyd2lzZSwgdGhleSBuZWVkIHRvIGJlIHBsYWNlZCBpbnNpZGUgYQotLy8gcGFydGlhbGx5LXNwZWNpZmllZCBoYXNoIHN0cnVjdCB0ZW1wbGF0ZSB3aXRoIGFuIG9wZXJhdG9yKCkuCi0jZGVmaW5lIFNCX0hBU19IQVNIX1ZBTFVFIDEKLQotLy8gU2V0IHRoaXMgdG8gMSBpZiB1c2Ugb2YgaGFzaF9tYXAgb3IgaGFzaF9zZXQgY2F1c2VzIGEgZGVwcmVjYXRpb24gd2FybmluZwotLy8gKHdoaWNoIHRoZW4gYnJlYWtzIHRoZSBidWlsZCkuCi0jZGVmaW5lIFNCX0hBU19IQVNIX1dBUk5JTkcgMQotI2RlZmluZSBfU0lMRU5DRV9TVERFWFRfSEFTSF9ERVBSRUNBVElPTl9XQVJOSU5HUwotCi0vLyBUaGUgbG9jYXRpb24gdG8gaW5jbHVkZSBoYXNoX21hcCBvbiB0aGlzIHBsYXRmb3JtLgotI2RlZmluZSBTQl9IQVNIX01BUF9JTkNMVURFIDxoYXNoX21hcD4KLQotLy8gQysrJ3MgaGFzaF9tYXAgYW5kIGhhc2hfc2V0IGFyZSBvZnRlbiBmb3VuZCBpbiBkaWZmZXJlbnQgbmFtZXNwYWNlcyBkZXBlbmRpbmcKLS8vIG9uIHRoZSBjb21waWxlci4KLSNkZWZpbmUgU0JfSEFTSF9OQU1FU1BBQ0Ugc3RkZXh0Ci0KLS8vIFRoZSBsb2NhdGlvbiB0byBpbmNsdWRlIGhhc2hfc2V0IG9uIHRoaXMgcGxhdGZvcm0uCi0jZGVmaW5lIFNCX0hBU0hfU0VUX0lOQ0xVREUgPGhhc2hfc2V0PgotCi0vLyBEZWZpbmUgdGhpcyB0byBob3cgdGhpcyBwbGF0Zm9ybSBjb3BpZXMgdmFyYXJncyBibG9ja3MuCi0jZGVmaW5lIFNCX1ZBX0NPUFkoZGVzdCwgc291cmNlKSB2YV9jb3B5KGRlc3QsIHNvdXJjZSkKLQotLy8gLS0tIEZpbGVzeXN0ZW0gQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIFRoZSBjdXJyZW50IHBsYXRmb3JtJ3MgbWF4aW11bSBsZW5ndGggb2YgdGhlIG5hbWUgb2YgYSBzaW5nbGUgZGlyZWN0b3J5Ci0vLyBlbnRyeSwgbm90IGluY2x1ZGluZyB0aGUgYWJzb2x1dGUgcGF0aC4KLSNkZWZpbmUgU0JfRklMRV9NQVhfTkFNRSAyNjAKLQotLy8gVGhlIGN1cnJlbnQgcGxhdGZvcm0ncyBtYXhpbXVtIGxlbmd0aCBvZiBhbiBhYnNvbHV0ZSBwYXRoLgotI2RlZmluZSBTQl9GSUxFX01BWF9QQVRIIDQwOTYKLQotLy8gVGhlIGN1cnJlbnQgcGxhdGZvcm0ncyBtYXhpbXVtIG51bWJlciBvZiBmaWxlcyB0aGF0IGNhbiBiZSBvcGVuZWQgYXQgdGhlCi0vLyBzYW1lIHRpbWUgYnkgb25lIHByb2Nlc3MuCi0vLyBUaGlzIGlzIHNldCB0byBNQVhJTVVNX1dBSVRfT0JKRUNUUyAtIDEsIHNpbmNlIHdlIHVzZSBXYWl0Rm9yTXVsdGlwbGVFdmVudHMKLS8vIGFuZCB0aGF0IG9ubHkgc3VwcG9ydHMgTUFYSU1VTV9XQUlUX09CSkVDVFMgZXZlbnRzLiAgVGhlIC0xIGlzIHNpbmNlIHdlCi0vLyB1c2UgYSBkdW1teSBldmVudCB0byB3YWtlIHVwIHRoZSBzb2NrZXQuCi0jZGVmaW5lIFNCX0ZJTEVfTUFYX09QRU4gNjMKLQotLy8gVGhlIGN1cnJlbnQgcGxhdGZvcm0ncyBmaWxlIHBhdGggY29tcG9uZW50IHNlcGFyYXRvciBjaGFyYWN0ZXIuIFRoaXMgaXMgdGhlCi0vLyBjaGFyYWN0ZXIgdGhhdCBhcHBlYXJzIGFmdGVyIGEgZGlyZWN0b3J5IGluIGEgZmlsZSBwYXRoLiBGb3IgZXhhbXBsZSwgdGhlCi0vLyBhYnNvbHV0ZSBjYW5vbmljYWwgcGF0aCBvZiB0aGUgZmlsZSAiL3BhdGgvdG8vYS9maWxlLnR4dCIgdXNlcyAnLycgYXMgYSBwYXRoCi0vLyBjb21wb25lbnQgc2VwYXJhdG9yIGNoYXJhY3Rlci4KLSNkZWZpbmUgU0JfRklMRV9TRVBfQ0hBUiAnXFwnCi0KLS8vIFRoZSBjdXJyZW50IHBsYXRmb3JtJ3MgYWx0ZXJuYXRlIGZpbGUgcGF0aCBjb21wb25lbnQgc2VwYXJhdG9yIGNoYXJhY3Rlci4KLS8vIFRoaXMgaXMgbGlrZSBTQl9GSUxFX1NFUF9DSEFSLCBleGNlcHQgaWYgeW91ciBwbGF0Zm9ybSBzdXBwb3J0cyBhbiBhbHRlcm5hdGUKLS8vIGNoYXJhY3RlciwgdGhlbiB5b3UgY2FuIHBsYWNlIHRoYXQgaGVyZS4gRm9yIGV4YW1wbGUsIG9uIHdpbmRvd3MgbWFjaGluZXMsCi0vLyB0aGUgcHJpbWFyeSBzZXBhcmF0b3IgY2hhcmFjdGVyIGlzIHByb2JhYmx5ICdcJywgYnV0IHRoZSBhbHRlcm5hdGUgaXMgJy8nLgotI2RlZmluZSBTQl9GSUxFX0FMVF9TRVBfQ0hBUiAnLycKLQotLy8gVGhlIGN1cnJlbnQgcGxhdGZvcm0ncyBzZWFyY2ggcGF0aCBjb21wb25lbnQgc2VwYXJhdG9yIGNoYXJhY3Rlci4gV2hlbgotLy8gc3BlY2lmeWluZyBhbiBvcmRlcmVkIGxpc3Qgb2YgYWJzb2x1dGUgcGF0aHMgb2YgZGlyZWN0b3JpZXMgdG8gc2VhcmNoIGZvciBhCi0vLyBnaXZlbiByZWFzb24sIHRoaXMgaXMgdGhlIGNoYXJhY3RlciB0aGF0IGFwcGVhcnMgYmV0d2VlbiBlbnRyaWVzLiBGb3IKLS8vIGV4YW1wbGUsIHRoZSBzZWFyY2ggcGF0aCBvZiAiL2V0Yy9zZWFyY2gvZmlyc3Q6L2V0Yy9zZWFyY2gvc2Vjb25kIiB1c2VzICc6JwotLy8gYXMgYSBzZWFyY2ggcGF0aCBjb21wb25lbnQgc2VwYXJhdG9yIGNoYXJhY3Rlci4KLSNkZWZpbmUgU0JfUEFUSF9TRVBfQ0hBUiAnOycKLQotLy8gVGhlIHN0cmluZyBmb3JtIG9mIFNCX0ZJTEVfU0VQX0NIQVIuCi0jZGVmaW5lIFNCX0ZJTEVfU0VQX1NUUklORyAiXFwiCi0KLS8vIFRoZSBzdHJpbmcgZm9ybSBvZiBTQl9GSUxFX0FMVF9TRVBfQ0hBUi4KLSNkZWZpbmUgU0JfRklMRV9BTFRfU0VQX1NUUklORyAiLyIKLQotLy8gVGhlIHN0cmluZyBmb3JtIG9mIFNCX1BBVEhfU0VQX0NIQVIuCi0jZGVmaW5lIFNCX1BBVEhfU0VQX1NUUklORyAiOyIKLQotLy8gT24gc29tZSBwbGF0Zm9ybXMgdGhlIGZpbGUgc3lzdGVtIHN0b3JlcyBhY2Nlc3MgdGltZXMgYXQgYSBjb2Fyc2VyCi0vLyBncmFudWxhcml0eSB0aGFuIG90aGVyIHRpbWVzLiBXaGVuIHRoaXMgcXVpcmsgaXMgZGVmaW5lZCwgd2UgYXNzdW1lIHRoZQotLy8gYWNjZXNzIHRpbWUgaXMgb2YgMSBkYXkgcHJlY2lzaW9uLgotI3VuZGVmIFNCX0hBU19RVUlSS19GSUxFU1lTVEVNX0NPQVJTRV9BQ0NFU1NfVElNRQotCi0vLyAtLS0gTWVtb3J5IENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gVGhlIG1lbW9yeSBwYWdlIHNpemUsIHdoaWNoIGNvbnRyb2xzIHRoZSBzaXplIG9mIGNodW5rcyBvbiBtZW1vcnkgdGhhdAotLy8gYWxsb2NhdG9ycyBkZWFsIHdpdGgsIGFuZCB0aGUgYWxpZ25tZW50IG9mIHRob3NlIGNodW5rcy4gVGhpcyBkb2Vzbid0IGhhdmUgdG8KLS8vIGJlIHRoZSBoYXJkd2FyZS1kZWZpbmVkIHBoeXNpY2FsIHBhZ2Ugc2l6ZSwgYnV0IGl0IHNob3VsZCBiZSBhIG11bHRpcGxlIG9mCi0vLyBpdC4KLSNkZWZpbmUgU0JfTUVNT1JZX1BBR0VfU0laRSA0MDk2Ci0KLS8vIFdoZXRoZXIgdGhpcyBwbGF0Zm9ybSBoYXMgYW5kIHNob3VsZCB1c2UgYW4gTU1BUCBmdW5jdGlvbiB0byBtYXAgcGh5c2ljYWwKLS8vIG1lbW9yeSB0byB0aGUgdmlydHVhbCBhZGRyZXNzIHNwYWNlLgotI2RlZmluZSBTQl9IQVNfTU1BUCAxCi0KLS8vIFdoZXRoZXIgdGhpcyBwbGF0Zm9ybSBjYW4gbWFwIGV4ZWN1dGFibGUgbWVtb3J5LiBJbXBsaWVzIFNCX0hBU19NTUFQLiBUaGlzIGlzCi0vLyByZXF1aXJlZCBmb3IgcGxhdGZvcm1zIHRoYXQgd2FudCB0byBKSVQuCi0jZGVmaW5lIFNCX0NBTl9NQVBfRVhFQ1VUQUJMRV9NRU1PUlkgMAotCi0vLyBXaGV0aGVyIHRoaXMgcGxhdGZvcm0gaGFzIGFuZCBzaG91bGQgdXNlIGFuIGdyb3dhYmxlIGhlYXAgKGUuZy4gd2l0aCBzYnJrKCkpCi0vLyB0byBtYXAgcGh5c2ljYWwgbWVtb3J5IHRvIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UuCi0jZGVmaW5lIFNCX0hBU19WSVJUVUFMX1JFR0lPTlMgMAotCi0vLyBTcGVjaWZpZXMgdGhlIGFsaWdubWVudCBmb3IgSU8gQnVmZmVycywgaW4gYnl0ZXMuIFNvbWUgbG93LWxldmVsIG5ldHdvcmsgQVBJcwotLy8gbWF5IHJlcXVpcmUgYnVmZmVycyB0byBoYXZlIGEgc3BlY2lmaWMgYWxpZ25tZW50LCBhbmQgdGhpcyBpcyB0aGUgcGxhY2UgdG8KLS8vIHNwZWNpZnkgdGhhdC4KLSNkZWZpbmUgU0JfTkVUV09SS19JT19CVUZGRVJfQUxJR05NRU5UIDE2Ci0KLS8vIERldGVybWluZXMgdGhlIGFsaWdubWVudCB0aGF0IGFsbG9jYXRpb25zIHNob3VsZCBoYXZlIG9uIHRoaXMgcGxhdGZvcm0uCi0jZGVmaW5lIFNCX01BTExPQ19BTElHTk1FTlQgKChzaXplX3QpMTZVKQotCi0vLyBEZXRlcm1pbmVzIHRoZSB0aHJlc2hob2xkIG9mIGFsbG9jYXRpb24gc2l6ZSB0aGF0IHNob3VsZCBiZSBkb25lIHdpdGggbW1hcAotLy8gKGlmIGF2YWlsYWJsZSksIHJhdGhlciB0aGFuIGFsbG9jYXRlZCB3aXRoaW4gdGhlIGNvcmUgaGVhcC4KLSNkZWZpbmUgU0JfREVGQVVMVF9NTUFQX1RIUkVTSE9MRCAoKHNpemVfdCkoMjU2ICogMTAyNFUpKQotCi0vLyBEZWZpbmVzIHRoZSBwYXRoIHdoZXJlIG1lbW9yeSBkZWJ1Z2dpbmcgbG9ncyBzaG91bGQgYmUgd3JpdHRlbiB0by4KLSNkZWZpbmUgU0JfTUVNT1JZX0xPR19QQVRIICIvdG1wL3N0YXJib2FyZCIKLQotLy8gLS0tIFRocmVhZCBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIERlZmluZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHNpbXVsdGFuZW91cyB0aHJlYWRzIGZvciB0aGlzIHBsYXRmb3JtLiBTb21lCi0vLyBwbGF0Zm9ybXMgcmVxdWlyZSBzaGFyaW5nIHRocmVhZCBoYW5kbGVzIHdpdGggb3RoZXIga2luZHMgb2Ygc3lzdGVtIGhhbmRsZXMsCi0vLyBsaWtlIG11dGV4ZXMsIHNvIHdlIHdhbnQgdG8ga2VlcCB0aGlzIG1hbmFnYWJsZS4KLSNkZWZpbmUgU0JfTUFYX1RIUkVBRFMgOTAKLQotLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIHRocmVhZCBsb2NhbCBzdG9yYWdlIGtleXMgc3VwcG9ydGVkIGJ5IHRoaXMgcGxhdGZvcm0uCi0jZGVmaW5lIFNCX01BWF9USFJFQURfTE9DQUxfS0VZUyA1MTIKLQotLy8gVGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBuYW1lIGZvciBhIHRocmVhZCwgaW5jbHVkaW5nIHRoZSBOVUxMLXRlcm1pbmF0b3IuCi0jZGVmaW5lIFNCX01BWF9USFJFQURfTkFNRV9MRU5HVEggMTY7Ci0KLS8vIC0tLSBHcmFwaGljcyBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBTcGVjaWZpZXMgd2hldGhlciB0aGlzIHBsYXRmb3JtIHN1cHBvcnRzIGEgcGVyZm9ybWFudCBhY2NlbGVyYXRlZCBibGl0dGVyCi0vLyBBUEkuIFRoZSBiYXNpYyByZXF1aXJlbWVudCBpcyBhIHNjYWxlZCwgY2xpcHBlZCwgYWxwaGEtYmxlbmRlZCBibGl0LgotI2RlZmluZSBTQl9IQVNfQkxJVFRFUiAwCi0KLS8vIFNwZWNpZmllcyB0aGUgcHJlZmVycmVkIGJ5dGUgb3JkZXIgb2YgY29sb3IgY2hhbm5lbHMgaW4gYSBwaXhlbC4gUmVmZXIgdG8KLS8vIHN0YXJib2FyZC9jb25maWd1cmF0aW9uLmggZm9yIHRoZSBwb3NzaWJsZSB2YWx1ZXMuIEVHTC9HTEVTIHBsYXRmb3JtcyBzaG91bGQKLS8vIGdlbmVyYWxseSBwcmVmZXIgYSBieXRlIG9yZGVyIG9mIFJHQkEsIHJlZ2FyZGxlc3Mgb2YgZW5kaWFubmVzcy4KLSNkZWZpbmUgU0JfUFJFRkVSUkVEX1JHQkFfQllURV9PUkRFUiBTQl9QUkVGRVJSRURfUkdCQV9CWVRFX09SREVSX1JHQkEKLQotLy8gSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbiBwbGF0Zm9ybSBzdXBwb3J0cyBiaWxpbmVhciBmaWx0ZXJpbmcuCi0vLyBUaGlzIGNhbiBiZSBjaGVja2VkIHRvIGVuYWJsZS9kaXNhYmxlIHJlbmRlcmVyIHRlc3RzIHRoYXQgdmVyaWZ5IHRoYXQgdGhpcyBpcwotLy8gd29ya2luZyBwcm9wZXJseS4KLSNkZWZpbmUgU0JfSEFTX0JJTElORUFSX0ZJTFRFUklOR19TVVBQT1JUIDEKLQotLy8gSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbiBwbGF0Zm9ybSBzdXBwb3J0cyByZW5kZXJpbmcgb2YgTlYxMgotLy8gdGV4dHVyZXMuIFRoZXNlIHRleHR1cmVzIHR5cGljYWxseSBvcmlnaW5hdGUgZnJvbSB2aWRlbyBkZWNvZGVycy4KLSNkZWZpbmUgU0JfSEFTX05WMTJfVEVYVFVSRV9TVVBQT1JUIDAKLQotLy8gV2hldGhlciB0aGUgY3VycmVudCBwbGF0Zm9ybSBzaG91bGQgZnJlcXVlbnRseSBmbGlwIGl0cyBkaXNwbGF5IGJ1ZmZlci4gIElmCi0vLyB0aGlzIGlzIG5vdCByZXF1aXJlZCAoaS5lLiBTQl9NVVNUX0ZSRVFVRU5UTFlfRkxJUF9ESVNQTEFZX0JVRkZFUiBpcyBzZXQgdG8KLS8vIDApLCB0aGVuIG9wdGltaXphdGlvbnMgYXJlIGVuYWJsZWQgc28gdGhlIGRpc3BsYXkgYnVmZmVyIGlzIG5vdCBmbGlwcGVkIGlmCi0vLyB0aGUgc2NlbmUgaGFzbid0IGNoYW5nZWQuCi0jZGVmaW5lIFNCX01VU1RfRlJFUVVFTlRMWV9GTElQX0RJU1BMQVlfQlVGRkVSIDAKLQotI2RlZmluZSBTQl9IQVNfVklSVFVBTF9SRUFMSVRZIDAKLQotLy8gLS0tIE1lZGlhIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIEFmdGVyIGEgc2VlayBpcyB0cmlnZ2VycmVkLCB0aGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byBhcHBlbmQgdmlkZW8gZnJhbWVzCi0vLyBmcm9tIHRoZSBsYXN0IGtleSBmcmFtZSBiZWZvcmUgdGhlIHNlZWsgdGltZSBhbmQgYXBwZW5kIGF1ZGlvIGZyYW1lcyBmcm9tIHRoZQotLy8gc2VlayB0aW1lIGJlY2F1c2UgdXN1YWxseSBhbGwgYXVkaW8gZnJhbWVzIGFyZSBrZXkgZnJhbWVzLiAgT24gcGxhdGZvcm1zIHRoYXQKLS8vIGNhbm5vdCBkZWNvZGUgdmlkZW8gZnJhbWVzIHdpdGhvdXQgZGlzcGxheWluZyB0aGVtLCB0aGlzIHdpbGwgY2F1c2UgdGhlIHZpZGVvCi0vLyBiZWluZyBwbGF5ZWQgd2l0aG91dCBhdWRpbyBmb3Igc2V2ZXJhbCBzZWNvbmRzIGFmdGVyIHNlZWtpbmcuICBXaGVuIHRoZQotLy8gZm9sbG93aW5nIG1hY3JvIGlzIGRlZmluZWQsIHRoZSBhcHAgd2lsbCBhcHBlbmQgYXVkaW8gZnJhbWVzIHN0YXJ0IGZyb20gdGhlCi0vLyB0aW1lc3RhbXAgdGhhdCBpcyBiZWZvcmUgdGhlIHRpbWVzdGFtcCBvZiB0aGUgdmlkZW8ga2V5IGZyYW1lIGJlaW5nIGFwcGVuZGVkLgotI3VuZGVmIFNCX0hBU19RVUlSS19TRUVLX1RPX0tFWUZSQU1FCi0KLS8vIGRsbWFsbG9jIHdpbGwgdXNlIHRoZSBmZnMgaW50cmluc2ljIGlmIGF2YWlsYWJsZS4gIFBsYXRmb3JtcyBvbiB3aGljaCB0aGlzIGlzCi0vLyBub3QgYXZhaWxhYmxlIHNob3VsZCBkZWZpbmUgdGhlIGZvbGxvd2luZyBxdWlyay4KLSN1bmRlZiBTQl9IQVNfUVVJUktfTk9fRkZTCi0KLS8vIFRoZSBtYXhpbXVtIGF1ZGlvIGJpdHJhdGUgdGhlIHBsYXRmb3JtIGNhbiBkZWNvZGUuICBUaGUgZm9sbG93aW5nIHZhbHVlCi0vLyBlcXVhbHMgdG8gNU0gYnl0ZXMgcGVyIHNlY29uZHMgd2hpY2ggaXMgbW9yZSB0aGFuIGVub3VnaCBmb3IgY29tcHJlc3NlZAotLy8gYXVkaW8uCi0jZGVmaW5lIFNCX01FRElBX01BWF9BVURJT19CSVRSQVRFX0lOX0JJVFNfUEVSX1NFQ09ORCAoNDAgKiAxMDI0ICogMTAyNCkKLQotLy8gVGhlIG1heGltdW0gdmlkZW8gYml0cmF0ZSB0aGUgcGxhdGZvcm0gY2FuIGRlY29kZS4gIFRoZSBmb2xsb3dpbmcgdmFsdWUKLS8vIGVxdWFscyB0byAyNU0gYnl0ZXMgcGVyIHNlY29uZHMgd2hpY2ggaXMgbW9yZSB0aGFuIGVub3VnaCBmb3IgY29tcHJlc3NlZAotLy8gdmlkZW8uCi0jZGVmaW5lIFNCX01FRElBX01BWF9WSURFT19CSVRSQVRFX0lOX0JJVFNfUEVSX1NFQ09ORCAoMjAwICogMTAyNCAqIDEwMjQpCi0KLS8vIFNwZWNpZmllcyB3aGV0aGVyIHRoaXMgcGxhdGZvcm0gaGFzIHdlYm0vdnA5IHN1cHBvcnQuICBUaGlzIHNob3VsZCBiZSBzZXQgdG8KLS8vIG5vbi16ZXJvIG9uIHBsYXRmb3JtcyB3aXRoIHdlYm0vdnA5IHN1cHBvcnQuCi0jZGVmaW5lIFNCX0hBU19NRURJQV9XRUJNX1ZQOV9TVVBQT1JUIDEKLQotLy8gU3BlY2lmaWVzIHRoZSBzdGFjayBzaXplIGZvciB0aHJlYWRzIGNyZWF0ZWQgaW5zaWRlIG1lZGlhIHN0YWNrLiAgU2V0IHRvIDAgdG8KLS8vIHVzZSB0aGUgZGVmYXVsdCB0aHJlYWQgc3RhY2sgc2l6ZS4gIFNldCB0byBub24temVybyB0byBleHBsaWNpdGx5IHNldCB0aGUKLS8vIHN0YWNrIHNpemUgZm9yIG1lZGlhIHN0YWNrIHRocmVhZHMuCi0jZGVmaW5lIFNCX01FRElBX1RIUkVBRF9TVEFDS19TSVpFIDBVCi0KLS8vIC0tLSBEZWNvZGVyLW9ubHkgUGFyYW1zIC0tLQotCi0vLyBTcGVjaWZpZXMgaG93IG1lZGlhIGJ1ZmZlcnMgbXVzdCBiZSBhbGlnbmVkIG9uIHRoaXMgcGxhdGZvcm0gYXMgc29tZQotLy8gZGVjb2RlcnMgbWF5IGhhdmUgc3BlY2lhbCByZXF1aXJlbWVudCBvbiB0aGUgYWxpZ25tZW50IG9mIGJ1ZmZlcnMgYmVpbmcKLS8vIGRlY29kZWQuCi0jZGVmaW5lIFNCX01FRElBX0JVRkZFUl9BTElHTk1FTlQgMTI4VQotCi0vLyBTcGVjaWZpZXMgaG93IHZpZGVvIGZyYW1lIGJ1ZmZlcnMgbXVzdCBiZSBhbGlnbmVkIG9uIHRoaXMgcGxhdGZvcm0uCi0jZGVmaW5lIFNCX01FRElBX1ZJREVPX0ZSQU1FX0FMSUdOTUVOVCAyNTZVCi0KLS8vIFRoZSBlbmNvZGVkIHZpZGVvIGZyYW1lcyBhcmUgY29tcHJlc3NlZCBpbiBkaWZmZXJlbnQgd2F5cywgc28gdGhlaXIgZGVjb2RpbmcKLS8vIHRpbWUgY2FuIHZhcnkgYSBsb3QuICBPY2Nhc2lvbmFsbHkgYSBzaW5nbGUgZnJhbWUgY2FuIHRha2UgbG9uZ2VyIHRpbWUgdG8KLS8vIGRlY29kZSB0aGFuIHRoZSBhdmVyYWdlIHRpbWUgcGVyIGZyYW1lLiAgVGhlIHBsYXllciBoYXMgdG8gY2FjaGUgc29tZSBmcmFtZXMKLS8vIHRvIGFjY291bnQgZm9yIHN1Y2ggaW5jb25zaXN0ZW5jeS4gIFRoZSBudW1iZXIgb2YgZnJhbWVzIGJlaW5nIGNhY2hlZCBhcmUKLS8vIGNvbnRyb2xsZWQgYnkgU0JfTUVESUFfTUFYSU1VTV9WSURFT19QUkVST0xMX0ZSQU1FUyBhbmQKLS8vIFNCX01FRElBX01BWElNVU1fVklERU9fRlJBTUVTLgotLy8KLS8vIFNwZWNpZnkgdGhlIG51bWJlciBvZiB2aWRlbyBmcmFtZXMgdG8gYmUgY2FjaGVkIGJlZm9yZSB0aGUgcGxheWJhY2sgc3RhcnRzLgotLy8gTm90ZSB0aGF0IHNldHRpbmcgdGhpcyB2YWx1ZSB0b28gbGFyZ2UgbWF5IGluY3JlYXNlIHRoZSBwbGF5YmFjayBzdGFydCBkZWxheS4KLSNkZWZpbmUgU0JfTUVESUFfTUFYSU1VTV9WSURFT19QUkVST0xMX0ZSQU1FUyA0Ci0KLS8vIFNwZWNpZnkgdGhlIG51bWJlciBvZiB2aWRlbyBmcmFtZXMgdG8gYmUgY2FjaGVkIGR1cmluZyBwbGF5YmFjay4gIEEgbGFyZ2UKLS8vIHZhbHVlIGxlYWRzIHRvIG1vcmUgc3RhYmxlIGZwcyBidXQgYWxzbyBjYXVzZXMgdGhlIGFwcCB0byB1c2UgbW9yZSBtZW1vcnkuCi0jZGVmaW5lIFNCX01FRElBX01BWElNVU1fVklERU9fRlJBTUVTIDEyCi0KLS8vIC0tLSBOZXR3b3JrIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBTcGVjaWZpZXMgd2hldGhlciB0aGlzIHBsYXRmb3JtIHN1cHBvcnRzIElQVjYuCi0jZGVmaW5lIFNCX0hBU19JUFY2IDEKLQotLy8gU3BlY2lmaWVzIHdoZXRoZXIgdGhpcyBwbGF0Zm9ybSBzdXBwb3J0cyBwaXBlLgotI2RlZmluZSBTQl9IQVNfUElQRSAxCi0KLS8vIC0tLSBUdW5lYWJsZSBQYXJhbWV0ZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBTcGVjaWZpZXMgdGhlIG5ldHdvcmsgcmVjZWl2ZSBidWZmZXIgc2l6ZSBpbiBieXRlcywgc2V0IHZpYQotLy8gU2JTb2NrZXRTZXRSZWNlaXZlQnVmZmVyU2l6ZSgpLgotLy8KLS8vIFNldHRpbmcgdGhpcyB0byAwIGluZGljYXRlcyB0aGF0IFNiU29ja2V0U2V0UmVjZWl2ZUJ1ZmZlclNpemUoKSBzaG91bGQKLS8vIG5vdCBiZSBjYWxsZWQuIFVzZSB0aGlzIGZvciBPU3MgKHN1Y2ggYXMgTGludXgpIHdoZXJlIHJlY2VpdmUgYnVmZmVyCi0vLyBhdXRvLXR1bmluZyBpcyBiZXR0ZXIuCi0vLwotLy8gT24gc29tZSBwbGF0Zm9ybXMsIHRoaXMgbWF5IGFmZmVjdCBtYXggVENQIHdpbmRvdyBzaXplIHdoaWNoIG1heQotLy8gZHJhbWF0aWNhbGx5IGFmZmVjdCB0aHJvdWdocHV0IGluIHRoZSBwcmVzZW5jZSBvZiBsYXRlbmN5LgotLy8KLS8vIElmIHlvdXIgcGxhdGZvcm0gZG9lcyBub3QgaGF2ZSBhIGdvb2QgVENQIGF1dG8tdHVuaW5nIG1lY2hhbmlzbSwKLS8vIGEgc2V0dGluZyBvZiAoMTI4ICogMTAyNCkgaGVyZSBpcyByZWNvbW1lbmRlZC4KLSNkZWZpbmUgU0JfTkVUV09SS19SRUNFSVZFX0JVRkZFUl9TSVpFICgwKQotCi0vLyAtLS0gVXNlciBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIHVzZXJzIHRoYXQgY2FuIGJlIHNpZ25lZCBpbiBhdCB0aGUgc2FtZSB0aW1lLgotI2RlZmluZSBTQl9VU0VSX01BWF9TSUdORURfSU4gMQotCi0vLyAtLS0gVGltaW5nIEFQSSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gV2hldGhlciB0aGlzIHBsYXRmb3JtIGhhcyBhbiBBUEkgdG8gcmV0cmlldmUgaG93IGxvbmcgdGhlIGN1cnJlbnQgdGhyZWFkCi0vLyBoYXMgc3BlbnQgaW4gdGhlIGV4ZWN1dGluZyBzdGF0ZS4KLSNkZWZpbmUgU0JfSEFTX1RJTUVfVEhSRUFEX05PVyAwCi0KLS8vIC0tLSBQbGF0Zm9ybSBTcGVjaWZpYyBBdWRpdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jZW5kaWYgIC8vIFNUQVJCT0FSRF9XSU5fU0hBUkVEX0NPTkZJR1VSQVRJT05fUFVCTElDX0hfCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3dpbi9zaGFyZWQvZ3lwX2NvbmZpZ3VyYXRpb24uZ3lwaSBiL3NyYy9zdGFyYm9hcmQvd2luL3NoYXJlZC9neXBfY29uZmlndXJhdGlvbi5neXBpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTA1YmE0Li4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvd2luL3NoYXJlZC9neXBfY29uZmlndXJhdGlvbi5neXBpCisrKyAvZGV2L251bGwKQEAgLTEsNDIyICswLDAgQEAKLSMgQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLXsKLSAgJ3ZhcmlhYmxlcyc6IHsKLSAgICAndGFyZ2V0X2FyY2gnOiAneDY0JywKLSAgICAndGFyZ2V0X29zJzogJ3dpbicsCi0KLSAgICAjIFVzZSBhIGhhcmR3YXJlIHJhc3Rlcml6ZXIgYW5kIGdyYXBoaWNhbCBzZXR1cC4KLSAgICAncmFzdGVyaXplcl90eXBlJzogJ2hhcmR3YXJlJywKLQotICAgICMgTGluayB3aXRoIGFuZ2xlCi0gICAgJ2dsX3R5cGUnOiAnYW5nbGUnLAotICAgICdhbmdsZV9wbGF0Zm9ybV93aW5kb3dzJzogMSwKLQotICAgICMgRnJhbWUgcHJlc2VudGF0aW9uIGlzIGJsb2NrZWQgb24gdnN5bmMsIHNvIHRoZSByZW5kZXIgdGhyZWFkIHdpbGwgYWxzbwotICAgICMgYmxvY2sgb24gdnN5bmMuIEhvd2V2ZXIsIHVzZSBhIG5vbi16ZXJvIG1pbmltdW0gZnJhbWUgdGltZSB0byBhdm9pZAotICAgICMgcG9zc2libGUgYnVzeS1sb29wcyBvbiB1bnJlbmRlcmVkIHN1Ym1pc3Npb25zLgotICAgICdjb2JhbHRfbWluaW11bV9mcmFtZV90aW1lX2luX21pbGxpc2Vjb25kcyc6ICcxJywKLQotICAgICdjb2JhbHRfc3BsYXNoX3NjcmVlbl9maWxlJzogJzwoREVQVEgpL2NvYmFsdC9icm93c2VyL3NwbGFzaF9zY3JlZW4veW91dHViZV9zcGxhc2hfc2NyZWVuLmh0bWwnLAotICAgICdmYWxsYmFja19zcGxhc2hfc2NyZWVuX3VybCc6ICdmaWxlOi8vL2NvYmFsdC9icm93c2VyL3NwbGFzaF9zY3JlZW4veW91dHViZV9zcGxhc2hfc2NyZWVuLmh0bWwnLAotCi0gICAgIyB3aW4td2luMzItbGliIGRvZXMgbm90IGxpbmsgdGhpcyBiaW5hcnkgc3VjY2Vzc2Z1bGx5IHRvZGF5LgotICAgICdidWlsZF9zbmFwc2hvdF9hcHBfc3RhdHMnOiAwLAotCi0gICAgIyBQbGF0Zm9ybS1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbnMgdG8gY29tcGlsZSBpbnRvIGNvYmFsdC4KLSAgICAnY29iYWx0X3BsYXRmb3JtX2RlcGVuZGVuY2llcyc6IFsKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvZWdsX2FuZF9nbGVzL2VnbF9hbmRfZ2xlcy5neXA6ZWdsX2FuZF9nbGVzJywKLSAgICBdLAotCi0gICAgJ2NvbmRpdGlvbnMnOiBbCi0gICAgICBbJ2NvYmFsdF9mYXN0YnVpbGQ9PTAnLCB7Ci0gICAgICAgICdtc3ZzX3NldHRpbmdzJzogewotICAgICAgICAgICdWQ0NMQ29tcGlsZXJUb29sJzogewotICAgICAgICAgICAgJ0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQnOiAnMycsCi0gICAgICAgICAgfSwKLSAgICAgICAgICAnVkNMaW5rZXJUb29sJzogewotICAgICAgICAgICAgJ0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbic6ICd0cnVlJywKLSAgICAgICAgICB9LAotICAgICAgICB9Ci0gICAgICAgIH1dLAotICAgIF0sCi0gIH0sCi0KLSAgJ3RhcmdldF9kZWZhdWx0cyc6IHsKLSAgICAnY29uZmlndXJhdGlvbnMnOiB7Ci0gICAgICAnd2lucnRfYmFzZSc6IHsKLSAgICAgICAgJ21zdnNfc2V0dGluZ3MnOiB7Ci0gICAgICAgICAgJ1ZDQ0xDb21waWxlclRvb2wnOiB7Ci0gICAgICAgICAgICAnQWRkaXRpb25hbE9wdGlvbnMnOiBbCi0gICAgICAgICAgICAgICcvWlcnLCAgICAgICAgICAgIyBXaW5kb3dzIFJ1bnRpbWUKLSAgICAgICAgICAgICAgJy9aVzpub3N0ZGxpYicsICAjIFdpbmRvd3MgUnVudGltZSwgbm8gZGVmYXVsdCAjdXNpbmcKLSAgICAgICAgICAgIF0KLSAgICAgICAgICB9Ci0gICAgICAgIH0sCi0gICAgICAgICdkZWZpbmVzJzogWwotICAgICAgICAgICMgVlMyMDE3IGFsd2F5cyBkZWZpbmVzIHRoaXMgZm9yIFVXUCBhcHBzCi0gICAgICAgICAgICdXSU5BUElfRkFNSUxZPVdJTkFQSV9GQU1JTFlfQVBQJywKLSAgICAgICAgICAjIFZTMjAxNyBhbHdheXMgZGVmaW5lcyB0aGlzIGZvciBVV1AgYXBwcwotICAgICAgICAgICAnX19XUkxfTk9fREVGQVVMVF9MSUJfXycsCi0gICAgICAgIF0KLSAgICAgIH0sICMgd2lucnRfYmFzZQotICAgICAgJ3dpbjMyX2Jhc2UnOiB7Ci0gICAgICAgICAgJ2Fic3RyYWN0JzogMSwKLSAgICAgICAgICAnbXN2c19zZXR0aW5ncyc6IHsKLSAgICAgICAgICAgICdWQ0xpbmtlclRvb2wnOiB7Ci0gICAgICAgICAgICAgICdTdWJTeXN0ZW0nOiAxLCAjIEJ1aWxkIGEgY29uc29sZSBhcHBsaWNhdGlvbiBieSBkZWZhdWx0LgotICAgICAgICAgICAgICAnQWRkaXRpb25hbERlcGVuZGVuY2llcyc6IFsKLSAgICAgICAgICAgICAgICAnc2hlbGwzMi5saWInLAotICAgICAgICAgICAgICAgICd3aW5tbS5saWInLAotICAgICAgICAgICAgICAgICdnZGkzMi5saWInLAotICAgICAgICAgICAgICAgICdkYmdoZWxwLmxpYicsCi0gICAgICAgICAgICAgICAgJ3VzZXIzMi5saWInLAotICAgICAgICAgICAgICAgICdzaGx3YXBpLmxpYicKLSAgICAgICAgICAgICAgXSwKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9LAotICAgICAgICAgICdtc3ZzX3RhcmdldF9wbGF0Zm9ybSc6ICd4NjQnLAotICAgICAgICAgICdkZWZpbmVzJzogWwotICAgICAgICAgICAgJ19XSU4zMicsCi0gICAgICAgICAgICAnV0lOMzInLAotICAgICAgICAgICAgJ1dJTkRPV1MnLAotICAgICAgICAgICAgJ19VTklDT0RFJywKLSAgICAgICAgICAgICdVTklDT0RFJywKLSAgICAgICAgICBdLAotICAgICAgfSwgIyB3aW4zMl9iYXNlCi0gICAgICAnbXN2c19iYXNlJzogewotICAgICAgICAnYWJzdHJhY3QnOiAxLAotICAgICAgICAnbXN2c19jb25maWd1cmF0aW9uX2F0dHJpYnV0ZXMnOiB7Ci0gICAgICAgICAgJ091dHB1dERpcmVjdG9yeSc6ICc8KERFUFRIKVxcYnVpbGRcXDwoYnVpbGRfZGlyX3ByZWZpeCkkKENvbmZpZ3VyYXRpb25OYW1lKScsCi0gICAgICAgICAgJ0ludGVybWVkaWF0ZURpcmVjdG9yeSc6ICckKE91dERpcilcXG9ialxcJChQcm9qZWN0TmFtZSknLAotICAgICAgICAgICdDaGFyYWN0ZXJTZXQnOiAnMScsCi0gICAgICAgIH0sCi0gICAgICAgICdtc3ZzX3N5c3RlbV9pbmNsdWRlX2RpcnMnOiBbCi0gICAgICAgICAgJzwod2luZG93c19zZGtfcGF0aCkvaW5jbHVkZS88KHdpbmRvd3Nfc2RrX3ZlcnNpb24pL3NoYXJlZCcsCi0gICAgICAgICAgJzwod2luZG93c19zZGtfcGF0aCkvaW5jbHVkZS88KHdpbmRvd3Nfc2RrX3ZlcnNpb24pL3VjcnQnLAotICAgICAgICAgICc8KHdpbmRvd3Nfc2RrX3BhdGgpL2luY2x1ZGUvPCh3aW5kb3dzX3Nka192ZXJzaW9uKS91bScsCi0gICAgICAgICAgJzwod2luZG93c19zZGtfcGF0aCkvaW5jbHVkZS88KHdpbmRvd3Nfc2RrX3ZlcnNpb24pL3dpbnJ0JywKLSAgICAgICAgICAnPCh3aW5kb3dzX3Nka19wYXRoKS9pbmNsdWRlLzwod2luZG93c19zZGtfdmVyc2lvbiknLAotICAgICAgICAgICc8KHZpc3VhbF9zdHVkaW9faW5zdGFsbF9wYXRoKS9pbmNsdWRlJywKLSAgICAgICAgICAnPCh2aXN1YWxfc3R1ZGlvX2luc3RhbGxfcGF0aCkvYXRsbWZjL2luY2x1ZGUnLAotICAgICAgICBdLAotICAgICAgICAnbXN2c19zZXR0aW5ncyc6IHsKLSAgICAgICAgICAnVkNMaW5rZXJUb29sJzogewotICAgICAgICAgICAgJ0FkZGl0aW9uYWxEZXBlbmRlbmNpZXMnOiBbCi0gICAgICAgICAgICAgICdtZnBsYXQubGliJywKLSAgICAgICAgICAgICAgJ21mdXVpZC5saWInLAotICAgICAgICAgICAgICAnd2luZG93c2FwcC5saWInLAotICAgICAgICAgICAgXSwKLSAgICAgICAgICAgICdBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzISc6IFsKLSAgICAgICAgICAgICAgJzwod2luZG93c19zZGtfcGF0aCkvbGliLzwod2luZG93c19zZGtfdmVyc2lvbikvdWNydC94ODYnLAotICAgICAgICAgICAgICAnPCh3aW5kb3dzX3Nka19wYXRoKS9saWIvPCh3aW5kb3dzX3Nka192ZXJzaW9uKS91bS94ODYnLAotICAgICAgICAgICAgICBdLAotICAgICAgICAgICAgJ0FkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXMnOiBbCi0gICAgICAgICAgICAgICc8KHdpbmRvd3Nfc2RrX3BhdGgpL2xpYi88KHdpbmRvd3Nfc2RrX3ZlcnNpb24pL3VjcnQveDY0JywKLSAgICAgICAgICAgICAgJzwod2luZG93c19zZGtfcGF0aCkvbGliLzwod2luZG93c19zZGtfdmVyc2lvbikvdW0veDY0JywKLSAgICAgICAgICAgICAgJzwodmlzdWFsX3N0dWRpb19pbnN0YWxsX3BhdGgpL2xpYi94NjQnLAotICAgICAgICAgICAgICBdLAotICAgICAgICAgIH0sCi0gICAgICAgICAgJ1ZDTGlicmFyaWFuVG9vbCc6IHsKLSAgICAgICAgICAgICdBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzISc6IFsKLSAgICAgICAgICAgICAgJzwod2luZG93c19zZGtfcGF0aCkvbGliLzwod2luZG93c19zZGtfdmVyc2lvbikvdWNydC94ODYnLAotICAgICAgICAgICAgICAnPCh3aW5kb3dzX3Nka19wYXRoKS9saWIvPCh3aW5kb3dzX3Nka192ZXJzaW9uKS91bS94ODYnLAotICAgICAgICAgICAgICBdLAotICAgICAgICAgICAgJ0FkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXMnOiBbCi0gICAgICAgICAgICAgICc8KHdpbmRvd3Nfc2RrX3BhdGgpL2xpYi88KHdpbmRvd3Nfc2RrX3ZlcnNpb24pL3VjcnQveDY0JywKLSAgICAgICAgICAgICAgJzwod2luZG93c19zZGtfcGF0aCkvbGliLzwod2luZG93c19zZGtfdmVyc2lvbikvdW0veDY0JywKLSAgICAgICAgICAgICAgJzwodmlzdWFsX3N0dWRpb19pbnN0YWxsX3BhdGgpL2xpYi94NjQnLAotICAgICAgICAgICAgICBdLAotICAgICAgICAgIH0sCi0gICAgICAgIH0sCi0gICAgICAgICdtc3ZzX3RhcmdldF9wbGF0Zm9ybSc6ICd4NjQnLAotICAgICAgICAjIEFkZCB0aGUgZGVmYXVsdCBpbXBvcnQgbGlicy4KLSAgICAgICAgJ2NvbmRpdGlvbnMnOiBbCi0gICAgICAgICAgWydzYl9wZWRhbnRpY193YXJuaW5ncz09MScsIHsKLSAgICAgICAgICAgICdtc3ZzX3NldHRpbmdzJzogewotICAgICAgICAgICAgICAnVkNDTENvbXBpbGVyVG9vbCc6IHsKLSAgICAgICAgICAgICAgICAjIEVuYWJsZSBzb21lIHdhcm5pbmdzLCBldmVuIHRob3NlIHRoYXQgYXJlIGRpc2FibGVkIGJ5IGRlZmF1bHQuCi0gICAgICAgICAgICAgICAgIyBTZWUgaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS8yM2s1ZDM4NS5hc3B4Ci0gICAgICAgICAgICAgICAgJ1dhcm5pbmdMZXZlbCc6ICc0JywKLSAgICAgICAgICAgICAgICAnQWRkaXRpb25hbE9wdGlvbnMnOiBbCi0gICAgICAgICAgICAgICAgICAjIFdhcm4gaWYgYW4gZW51bWVyYXRpb24gdmFsdWUgaXMgdW5oYW5kbGVkIGluIHN3aXRjaCAoQzQwNjIpLgotICAgICAgICAgICAgICAgICAgIyBUaGlzIHdhcm5pbmcgaXMgb2ZmIGJ5IGRlZmF1bHQsIHNvIGl0IG11c3QgYmUgdHVybmVkIG9uIGV4cGxpY2l0bHkuCi0gICAgICAgICAgICAgICAgICAnL3c0NDA2MicsCi0gICAgICAgICAgICAgICAgXSwKLSAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgfV0sCi0gICAgICAgICAgWydjb2JhbHRfZmFzdGJ1aWxkPT0wJywgewotICAgICAgICAgICAgJ21zdnNfc2V0dGluZ3MnOiB7Ci0gICAgICAgICAgICAgICdWQ0NMQ29tcGlsZXJUb29sJzogewotICAgICAgICAgICAgICAgICdEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0JzogJzMnLAotICAgICAgICAgICAgICAgICdBZGRpdGlvbmFsT3B0aW9ucyc6IFsKLSAgICAgICAgICAgICAgICAnL0ZTJywKLSAgICAgICAgICAgICAgICBdLAotICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAnVkNMaW5rZXJUb29sJzogewotICAgICAgICAgICAgICAgICdHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24nOiAndHJ1ZScsCi0gICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICB9LAotICAgICAgICAgIH1dLAotICAgICAgICBdLAotICAgICAgfSwKLSAgICAgICAnbXN2c19kZWJ1Zyc6IHsKLSAgICAgICAgICdpbmhlcml0X2Zyb20nOiBbJ2RlYnVnX2Jhc2UnLCAnbXN2c19iYXNlJ10sCi0gICAgICAgICAnbXN2c19zZXR0aW5ncyc6IHsKLSAgICAgICAgICAgJ1ZDQ0xDb21waWxlclRvb2wnOiB7Ci0gICAgICAgICAgICAgJ09wdGltaXphdGlvbic6ICcwJywKLSAgICAgICAgICAgICAnQmFzaWNSdW50aW1lQ2hlY2tzJzogJzMnLCAjIENoZWNrIHN0YWNrIGZyYW1lIHZhbGlkaXR5IGFuZCBjaGVjayBmb3IgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMgYXQgcnVuIHRpbWUuCi0gICAgICAgICAgICAgJ0FkZGl0aW9uYWxPcHRpb25zJzogWwotICAgICAgICAgICAgICAgJy9NRGQnLCAjIFVzZSBkZWJ1ZyBtdWx0aXRocmVhZGVkIGxpYnJhcnkuCi0gICAgICAgICAgICAgICAnL0dTJywKLSAgICAgICAgICAgICBdLAotICAgICAgICAgICB9LAotICAgICAgICAgICAnVkNMaW5rZXJUb29sJzogewotICAgICAgICAgICAgICdBZGRpdGlvbmFsRGVwZW5kZW5jaWVzJzogWydkYmdoZWxwLmxpYiddLAotICAgICAgICAgICAgICdMaW5rSW5jcmVtZW50YWwnOiAnMScsICAjIElOQ1JFTUVOVEFMOk5PCi0gICAgICAgICAgIH0sCi0gICAgICAgICB9LAotICAgICAgIH0sCi0gICAgICAgJ21zdnNfZGV2ZWwnOiB7Ci0gICAgICAgICAnaW5oZXJpdF9mcm9tJzogWydkZXZlbF9iYXNlJywgJ21zdnNfYmFzZSddLAotICAgICAgICAgJ21zdnNfc2V0dGluZ3MnOiB7Ci0gICAgICAgICAgICdWQ0NMQ29tcGlsZXJUb29sJzogewotICAgICAgICAgICAgICdPcHRpbWl6YXRpb24nOiAnMicsCi0gICAgICAgICAgICAgJ0FkZGl0aW9uYWxPcHRpb25zJzogWwotICAgICAgICAgICAgICAgJy9NRGQnLCAjIFVzZSBkZWJ1ZyBtdWx0aXRocmVhZGVkIGxpYnJhcnkuCi0gICAgICAgICAgICAgICAnL0dTJywKLSAgICAgICAgICAgICBdLAotICAgICAgICAgICB9LAotICAgICAgICAgICAnVkNMaW5rZXJUb29sJzogewotICAgICAgICAgICAgICdBZGRpdGlvbmFsRGVwZW5kZW5jaWVzJzogWydkYmdoZWxwLmxpYiddLAotICAgICAgICAgICAgICdMaW5rSW5jcmVtZW50YWwnOiAnMScsICAjIElOQ1JFTUVOVEFMOk5PCi0gICAgICAgICAgIH0sCi0gICAgICAgICB9LAotICAgICAgIH0sCi0gICAgICAgJ21zdnNfcWEnOiB7Ci0gICAgICAgICAnaW5oZXJpdF9mcm9tJzogWydxYV9iYXNlJywgJ21zdnNfYmFzZSddLAotICAgICAgICAgJ21zdnNfc2V0dGluZ3MnOiB7Ci0gICAgICAgICAgICdWQ0NMQ29tcGlsZXJUb29sJzogewotICAgICAgICAgICAgICdPcHRpbWl6YXRpb24nOiAnMicsCi0gICAgICAgICAgICAgJ0FkZGl0aW9uYWxPcHRpb25zJzogWwotICAgICAgICAgICAgICAgJy9NRCcsICMgVXNlIHJlbGVhc2UgbXVsdGl0aHJlYWRlZCBsaWJyYXJ5LgotICAgICAgICAgICAgIF0sCi0gICAgICAgICAgIH0sCi0gICAgICAgICAgICdWQ0xpbmtlclRvb2wnOiB7Ci0gICAgICAgICAgICAgJ0FkZGl0aW9uYWxEZXBlbmRlbmNpZXMnOiBbJ2RiZ2hlbHAubGliJ10sCi0gICAgICAgICAgICAgJ0xpbmtJbmNyZW1lbnRhbCc6ICcxJywgICMgSU5DUkVNRU5UQUw6Tk8KLSAgICAgICAgICAgICAnT3B0aW1pemVSZWZlcmVuY2VzJyA6ICcyJywgICMgT1BUOlJFRgotICAgICAgICAgICAgICdFbmFibGVDT01EQVRGb2xkaW5nJyA6ICcyJywgICMgT1BUOklDRgotICAgICAgICAgICB9LAotICAgICAgICAgfSwKLSAgICAgICAgICdtc3ZzX2Rpc2FibGVkX3dhcm5pbmdzJzogWwotICAgICAgICAgICAjIFVucmVmZXJlbmNlZCBhcmd1bWVudC4KLSAgICAgICAgICAgIyBPZnRlbiB2YXJpYWJsZXMgYXJlIG9ubHkgcmVmZXJlbmNlZCBpbiBEQ0hFQ0tzLgotICAgICAgICAgICA0MTAwLAotICAgICAgICAgICAjIFVucmVmZXJlbmNlZCB2YXJpYWJsZS4KLSAgICAgICAgICAgIyBPZnRlbiB2YXJpYWJsZXMgYXJlIG9ubHkgcmVmZXJlbmNlZCBpbiBEQ0hFQ0tzLgotICAgICAgICAgICA0MTg5LAotICAgICAgICAgXSwKLSAgICAgICB9LAotICAgICAgICdtc3ZzX2dvbGQnOiB7Ci0gICAgICAgICAnaW5oZXJpdF9mcm9tJzogWydnb2xkX2Jhc2UnLCAnbXN2c19iYXNlJ10sCi0gICAgICAgICAgJ21zdnNfc2V0dGluZ3MnOiB7Ci0gICAgICAgICAgICdWQ0NMQ29tcGlsZXJUb29sJzogewotICAgICAgICAgICAgICdPcHRpbWl6YXRpb24nOiAnMicsCi0gICAgICAgICAgICAgJ0FkZGl0aW9uYWxPcHRpb25zJzogWwotICAgICAgICAgICAgICAgJy9NRCcsICMgVXNlIHJlbGVhc2UgbXVsdGl0aHJlYWRlZCBsaWJyYXJ5LgotICAgICAgICAgICAgIF0sCi0gICAgICAgICAgIH0sCi0gICAgICAgICAgICdWQ0xpbmtlclRvb2wnOiB7Ci0gICAgICAgICAgICAgJ0xpbmtJbmNyZW1lbnRhbCc6ICcxJywgICMgSU5DUkVNRU5UQUw6Tk8KLSAgICAgICAgICAgICAnT3B0aW1pemVSZWZlcmVuY2VzJyA6ICcyJywgICMgT1BUOlJFRgotICAgICAgICAgICAgICdFbmFibGVDT01EQVRGb2xkaW5nJyA6ICcyJywgICMgT1BUOklDRgotICAgICAgICAgICB9LAotICAgICAgICAgfSwKLSAgICAgICAgICdtc3ZzX2Rpc2FibGVkX3dhcm5pbmdzJzogWwotICAgICAgICAgICAjIFVucmVmZXJlbmNlZCBhcmd1bWVudC4KLSAgICAgICAgICAgIyBPZnRlbiB2YXJpYWJsZXMgYXJlIG9ubHkgcmVmZXJlbmNlZCBpbiBEQ0hFQ0tzLgotICAgICAgICAgICA0MTAwLAotICAgICAgICAgICAjIFVucmVmZXJlbmNlZCB2YXJpYWJsZS4KLSAgICAgICAgICAgIyBPZnRlbiB2YXJpYWJsZXMgYXJlIG9ubHkgcmVmZXJlbmNlZCBpbiBEQ0hFQ0tzLgotICAgICAgICAgICA0MTg5LAotICAgICAgICAgXSwKLSAgICAgICB9LAotICAgIH0sCi0gICAgJ2RlZmluZXMnOiBbCi0gICAgICAjIERpc2FibGUgd2FybmluZ3MuICBUaGVzZSBvcHRpb25zIHdlcmUgaW5oZXJpdGVkIGZyb20gQ2hyb21pdW0uCi0gICAgICAnX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFJywKLSAgICAgICdfQ1JUX05PTlNURENfTk9fV0FSTklOR1MnLAotICAgICAgJ19DUlRfTk9OU1REQ19OT19ERVBSRUNBVEUnLAotICAgICAgJ19TQ0xfU0VDVVJFX05PX0RFUFJFQ0FURScsCi0gICAgICAjIERpc2FibGUgc3VnZ2VzdGlvbnMgdG8gc3dpdGNoIHRvIE1pY3Jvc29mdC1zcGVjaWZpYyBzZWN1cmUgQ1JULgotICAgICAgJ19DUlRfU0VDVVJFX05PX1dBUk5JTkdTJywKLSAgICAgICMgRGlzYWJsZSBzdXBwb3J0IGZvciBleGNlcHRpb25zIGluIFNUTCBpbiBvcmRlciB0byBkZXRlY3QgdGhlaXIgdXNlCi0gICAgICAjICh0aGUgdXNlIG9mIGV4Y2VwdGlvbnMgaXMgZm9yYmlkZGVuIGJ5IEdvb2dsZSBDKysgc3R5bGUgZ3VpZGUpLgotICAgICAgJ19IQVNfRVhDRVBUSU9OUz0wJywKLSAgICAgICdfX1NURENfRk9STUFUX01BQ1JPUycsICMgc28gdGhhdCB3ZSBnZXQgUFJJKgotICAgICAgIyBFbmFibGUgR05VIGV4dGVuc2lvbnMgdG8gZ2V0IHByb3RvdHlwZXMgbGlrZSBmZnNsLgotICAgICAgJ19HTlVfU09VUkNFPTEnLAotICAgICAgJ1dJTjMyX0xFQU5fQU5EX01FQU4nLAotICAgICAgIyBCeSBkZWZpbmluZyB0aGlzLCBNX1BJIHdpbGwgZ2V0ICNkZWZpbmVkLgotICAgICAgJ19VU0VfTUFUSF9ERUZJTkVTJywKLSAgICAgICMgbWluIGFuZCBtYXggY29sbGlkZSB3aXRoIHN0ZDo6bWluIGFuZCBzdGQ6Om1heAotICAgICAgJ05PTUlOTUFYJywKLSAgICAgICAjIENvbmZvcm0gd2l0aCBDOTkgc3BlYy4KLSAgICAgICdfQ1JUX1NURElPX0lTT19XSURFX1NQRUNJRklFUlMnLAotICAgIF0sCi0gICAgJ21zdnNfc2V0dGluZ3MnOiB7Ci0gICAgICAnVkNDTENvbXBpbGVyVG9vbCc6IHsKLSAgICAgICAgJ0ZvcmNlZEluY2x1ZGVGaWxlcyc6IFtdLAotCi0gICAgICAgICMgQ2hlY2sgZm9yIGJ1ZmZlciBvdmVycnVucy4KLSAgICAgICAgJ0J1ZmZlclNlY3VyaXR5Q2hlY2snOiAndHJ1ZScsCi0KLSAgICAgICAgJ0NvbmZvcm1hbmNlJzogWwotICAgICAgICAgICMgImZvciIgbG9vcCdzIGluaXRpYWxpemVyIGdvIG91dCBvZiBzY29wZSBhZnRlciB0aGUgZm9yIGxvb3AuCi0gICAgICAgICAgJ2ZvclNjb3BlJywKLSAgICAgICAgICAjIHdjaGFyX3QgaXMgdHJlYXRlZCBhcyBhIGJ1aWx0LWluIHR5cGUuCi0gICAgICAgICAgJ3djaGFyX3QnLAotICAgICAgICBdLAotCi0gICAgICAgICMgQ2hlY2sgZm9yIDY0LWJpdCBwb3J0YWJpbGl0eSBpc3N1ZXMuCi0gICAgICAgICdEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXMnOiAndHJ1ZScsCi0KLSAgICAgICAgIyBEaXNhYmxlIE1pY3Jvc29mdC1zcGVjaWZpYyBoZWFkZXIgZGVwZW5kZW5jeSB0cmFja2luZy4KLSAgICAgICAgIyBJbmNyZW1lbnRhbCBsaW5rZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgV2luZG93cyBtZXRhZGF0YSBpbmNsdWRlZAotICAgICAgICAjIGluIC5vYmogZmlsZXMgY29tcGlsZWQgd2l0aCBDKysvQ1ggc3VwcG9ydCAoL1pXKS4KLSAgICAgICAgJ01pbmltYWxSZWJ1aWxkJzogJ2ZhbHNlJywKLQotICAgICAgICAjIFRyZWF0IHdhcm5pbmdzIGFzIGVycm9ycy4KLSAgICAgICAgJ1dhcm5Bc0Vycm9yJzogJ3RydWUnLAotCi0gICAgICAgICMgRW5hYmxlIHNvbWUgd2FybmluZ3MsIGV2ZW4gdGhvc2UgdGhhdCBhcmUgZGlzYWJsZWQgYnkgZGVmYXVsdC4KLSAgICAgICAgIyBTZWUgaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS8yM2s1ZDM4NS5hc3B4Ci0gICAgICAgICdXYXJuaW5nTGV2ZWwnOiAnMicsCi0KLSAgICAgICAgJ0FkZGl0aW9uYWxPcHRpb25zJzogWwotICAgICAgICAgICcvZXJyb3JSZXBvcnQ6bm9uZScsICMgRG9uJ3Qgc2VuZCBlcnJvciByZXBvcnRzIHRvIE1TLgotICAgICAgICAgICcvRlMnLCAjIEZvcmNlIHN5bmMgUERCIHVwZGF0ZXMgZm9yIHBhcmFsbGVsIGNvbXBpbGUuCi0gICAgICAgIF0sCi0gICAgICB9LAotICAgICAgJ1ZDTGlua2VyVG9vbCc6IHsKLSAgICAgICAgJ1JhbmRvbWl6ZWRCYXNlQWRkcmVzcyc6ICcyJywgIyAvRFlOQU1JQ0JBU0UKLSAgICAgICAgIyBUT0RPOiBTdWJTeXN0ZW0gaXMgaGFyZGNvZGVkIGluCi0gICAgICAgICMgd2luXHNvdXJjZXNfdGVtcGxhdGUudmN4cHJvai4gVGhpcyB3aWxsIGhhdmUgdGhlIGV4ZSBiZWhhdmUgaW4gdGhlCi0gICAgICAgICMgZXhwZWN0ZWQgd2F5IGluIE1TVlM6IHdoZW4gaXQncyBydW4gd2l0aG91dCBkZWJ1ZyAoQ3RybCtGNSksIGl0Ci0gICAgICAgICMgd2lsbCBwYXVzZSBhZnRlciBmaW5pc2g7IHdoZW4gZGVidWdnaW5nIChGNSkgaXQgd2lsbCBub3QgcGF1c2UKLSAgICAgICAgIyBiZWZvcmUgdGhlIGNtZCB3aW5kb3cgZGlzYXBwZWFycy4KLSAgICAgICAgIyBDdXJyZW50bHkgdGhlIHZhbHVlIGlzIGlnbm9yZWQgYnkgbXN2c19tYWtlZmlsZS5weSB3aGljaCBnZW5lcmF0ZXMKLSAgICAgICAgIyB0aGUgTVNWUyBwcm9qZWN0IGZpbGVzIChpdCdzIGluICJkYXRhIiBpbiBHZW5lcmF0ZU91dHB1dCgpKS4gRml4Ci0gICAgICAgICMgaXQgaWYgd2UgZXZlciBuZWVkIHRvIGNoYW5nZSBTdWJTeXN0ZW0uCi0gICAgICAgICdTdWJTeXN0ZW0nOiAnMScsICMgQ09OU09MRQotICAgICAgICAnVGFyZ2V0TWFjaGluZSc6ICcxNycsICMgeDg2IC0gNjQKLSAgICAgICAgJ0FkZGl0aW9uYWxPcHRpb25zJzogWwotICAgICAgICAgICcvV0lOTUQ6Tk8nLCAjIERvIG5vdCBnZW5lcmF0ZSBhIFdpbk1EIGZpbGUuCi0gICAgICAgICAgJy9lcnJvclJlcG9ydDpub25lJywgIyBEb24ndCBzZW5kIGVycm9yIHJlcG9ydHMgdG8gTVMuCi0gICAgICAgIF0sCi0gICAgICB9LAotICAgICAgJ1ZDTGlicmFyaWFuVG9vbCc6IHsKLSAgICAgICAgJ0FkZGl0aW9uYWxPcHRpb25zJzogWwotICAgICAgICAgICMgTGlua2luZyBzdGF0aWNhbGx5IHdpdGggQysrL0NYIGxpYnJhcnkgaXMgbm90IHJlY29tbWVuZGVkLgotICAgICAgICAgICMgVE9ETzogUmVtb3ZlIGFmdGVyIHJlbW92aW5nIENvbXBvbmVudEV4dGVuc2lvbnMKLSAgICAgICAgICAnL2lnbm9yZTo0MjY0JywKLSAgICAgICAgXSwKLSAgICAgIH0sCi0gICAgfSwKLSAgICAnbXN2c19kaXNhYmxlZF93YXJuaW5ncyc6IFsKLSAgICAgICMgQ29uZGl0aW9uYWwgZXhwcmVzc2lvbiBpcyBjb25zdGFudC4KLSAgICAgICMgVHJpZ2dlcnMgaW4gbWFueSBsZWdpdGltYXRlIGNhc2VzLCBsaWtlIGJyYW5jaGluZyBvbiBhIGNvbnN0YW50IGRlY2xhcmVkCi0gICAgICAjIGluIHR5cGUgdHJhaXRzLgotICAgICAgNDEyNywKLSAgICAgICMgNDI0NCAoTGV2ZWwgMikgLSBJbXBsaWNpdCBjb252ZXJzaW9uIGZyb20gZmxvYXQgdG8gaW50Ci0gICAgICAjIDQyNDQgKExldmVsIDMpIC0gSW1wbGljaXQgY29udmVyc2lvbiBmcm9tIGludCB0byBzb21ldGhpbmcgc21hbGxlcgotICAgICAgIyB0aGFuIGludC4KLSAgICAgICMgNDI0NCAoTGV2ZWwgNCkgLSBJbXBsaWNpdCBjb252ZXJzaW9uIG9mIHR5cGVzLCB3aGljaCBtYXkgcmVzdWx0IGluCi0gICAgICAjIGRhdGEgbG9zcy4KLSAgICAgIDQyNDQsCi0gICAgICAjIENsYXNzIGhhcyB2aXJ0dWFsIGZ1bmN0aW9ucywgYnV0IGRlc3RydWN0b3IgaXMgbm90IHZpcnR1YWwuCi0gICAgICAjIEZhciBsZXNzIHVzZWZ1bCB0aGFuIGluIEdDQyBiZWNhdXNlIGRvZXNuJ3QgdGFrZSBpbnRvIGFjY291bnQgdGhlIGZhY3QKLSAgICAgICMgdGhhdCBkZXN0cnVjdG9yIGlzIG5vdCBwdWJsaWMuCi0gICAgICA0MjY1LAotICAgICAgIyBJbmNvbnNpc3RlbnQgRExMIGxpbmthZ2UKLSAgICAgIDQyNzMsCi0gICAgICAjIERvdWJsZSAtPiBmbG9hdCB0cnVuY2F0aW9uLiBOb3QgZW5hYmxlZCBvbiBvdGhlciBjb21waWxlcnMuCi0gICAgICA0MzA1LAotICAgICAgIyBjYXN0IHRydW5jYXRlcyBjb25zdGFudCB2YWx1ZS4KLSAgICAgICMgV2UgZG8gbm90IGNhcmUuCi0gICAgICA0MzEwLAotICAgICAgIyBBbiBydmFsdWUgY2Fubm90IGJlIGJvdW5kIHRvIGEgbm9uLWNvbnN0IHJlZmVyZW5jZS4KLSAgICAgICMgSW4gcHJldmlvdXMgdmVyc2lvbnMgb2YgVmlzdWFsIEMrKywgaXQgd2FzIHBvc3NpYmxlIHRvIGJpbmQgYW4gcnZhbHVlCi0gICAgICAjIHRvIGEgbm9uLWNvbnN0IHJlZmVyZW5jZSBpbiBhIGRpcmVjdCBpbml0aWFsaXphdGlvbi4gVGhpcyB3YXJuaW5nCi0gICAgICAjIGlzIHVzZWxlc3MgYXMgaXQgc2ltcGx5IGRlc2NyaWJlcyBwcm9wZXIgQysrIGJlaGF2aW9yLgotICAgICAgNDM1MCwKLSAgICAgICMgbGF5b3V0IG9mIGNsYXNzIG1heSBoYXZlIGNoYW5nZWQgZnJvbSBhIHByZXZpb3VzIHZlcnNpb24gb2YKLSAgICAgICMgdGhlIGNvbXBpbGVyIGR1ZSB0byBiZXR0ZXIgcGFja2luZyBvZiBtZW1iZXIuIFdlIGRvbid0IGNhcmUgYWJvdXQKLSAgICAgICMgYmluYXJ5IGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBjb21waWxlciB2ZXJzaW9ucy4KLSAgICAgIDQzNzEsCi0gICAgICAjIHJlbGF0aXZlIGluY2x1ZGUgcGF0aCBjb250YWlucyAnLi4nLgotICAgICAgIyBUaGlzIG9jY3VycyBpbiBhIGxvdCB0aGlyZCBwYXJ0eSBsaWJyYXJpZXMgYW5kIHdlIGRvbid0IGNhcmUuCi0gICAgICA0NDY0LAotICAgICAgIyBkZWNvcmF0ZWQgbmFtZSBsZW5ndGggZXhjZWVkZWQsIG5hbWUgd2FzIHRydW5jYXRlZC4KLSAgICAgIDQ1MDMsCi0gICAgICAjIGFzc2lnbm1lbnQgb3BlcmF0b3IgY291bGQgbm90IGJlIGdlbmVyYXRlZC4KLSAgICAgICMgVGhpcyBpcyBleHBlY3RlZCBmb3Igc3RydWN0cyB3aXRoIGNvbnN0IG1lbWJlcnMuCi0gICAgICA0NTEyLAotICAgICAgIyBVbnJlZmVyZW5jZWQgaW5saW5lIGZ1bmN0aW9uIGhhcyBiZWVuIHJlbW92ZWQuCi0gICAgICAjIFdoaWxlIGRldGVjdGlvbiBvZiBkZWFkIGNvZGUgaXMgZ29vZCwgdGhpcyB3YXJuaW5nIHRyaWdnZXJzIGluCi0gICAgICAjIHRoaXJkLXBhcnR5IGxpYnJhcmllcyB3aGljaCByZW5kZXJzIGl0IHVzZWxlc3MuCi0gICAgICA0NTE0LAotICAgICAgIyBFeHByZXNzaW9uIGJlZm9yZSBjb21tYSBoYXMgbm8gZWZmZWN0LgotICAgICAgIyBDYW5ub3QgYmUgdXNlZCBiZWNhdXNlIE1pY3Jvc29mdCB1c2VzIF9BU1NFUlRFKCgibWVzc2FnZSIsIDApKSB0cmljawotICAgICAgIyBpbiBtYWxsb2MuaCB3aGljaCBpcyBpbmNsdWRlZCBwcmV0dHkgbXVjaCBldmVyeXdoZXJlLgotICAgICAgNDU0OCwKLSAgICAgICMgVXNlIG9mIG5vZXhjZXB0IGluIHRhcmdldHMgY29tcGlsZWQgd2l0aG91dCAvRUhzYyB0cmlnZ2VycyBhIHdhcm5pbmcKLSAgICAgICMgInRlcm1pbmF0aW9uIG9uIGV4Y2VwdGlvbiBpcyBub3QgZ3VhcmFudGVlZCIgd2hpY2ggd2UgY29uc2lkZXIgYmVuaWduCi0gICAgICAjIGJlY2F1c2Ugd2UgZG9uJ3QgZXhwZWN0IGV4Y2VwdGlvbnMgdG8gY3Jvc3MgdGhlIGJvdW5kYXJ5IG9mIG1vZHVsZXMKLSAgICAgICMgY29tcGlsZWQgd2l0aCAvRUhzYy4KLSAgICAgIDQ1NzcsCi0gICAgICAjIENvcHkgY29uc3RydWN0b3IgY291bGQgbm90IGJlIGdlbmVyYXRlZCBiZWNhdXNlIGEgYmFzZSBjbGFzcyBjb3B5Ci0gICAgICAjIGNvbnN0cnVjdG9yIGlzIGluYWNjZXNzaWJsZS4KLSAgICAgICMgVGhpcyBpcyBhbiBleHBlY3RlZCBjb25zZXF1ZW5jZSBvZiB1c2luZyBESVNBTExPV19DT1BZX0FORF9BU1NJR04oKS4KLSAgICAgIDQ2MjUsCi0gICAgICAjIEFzc2lnbm1lbnQgb3BlcmF0b3IgY291bGQgbm90IGJlIGdlbmVyYXRlZCBiZWNhdXNlIGEgYmFzZSBjbGFzcwotICAgICAgIyBhc3NpZ25tZW50IG9wZXJhdG9yIGlzIGluYWNjZXNzaWJsZS4KLSAgICAgICMgVGhpcyBpcyBhbiBleHBlY3RlZCBjb25zZXF1ZW5jZSBvZiB1c2luZyBESVNBTExPV19DT1BZX0FORF9BU1NJR04oKS4KLSAgICAgIDQ2MjYsCi0gICAgICAjIERpZ3JhcGhzIG5vdCBzdXBwb3J0ZWQuCi0gICAgICAjIFRoYW5rcyBnb2QhCi0gICAgICA0NjI4LAotICAgICAgIyBTeW1ib2wgaXMgbm90IGRlZmluZWQgYXMgYSBwcmVwcm9jZXNzb3IgbWFjcm8sIHJlcGxhY2luZyB3aXRoICcwJy4KLSAgICAgICMgU2VlbXMgbGlrZSBjb21tb24gcHJhY3RpY2UsIHVzZWQgaW4gV2luZG93cyBTREsgYW5kIGd0ZXN0LgotICAgICAgNDY2OCwKLSAgICAgICMgRnVuY3Rpb24gbm90IGlubGluZWQuCi0gICAgICAjIEl0J3MgdXAgdG8gdGhlIGNvbXBpbGVyIHRvIGRlY2lkZSB3aGF0IHRvIGlubGluZS4KLSAgICAgIDQ3MTAsCi0gICAgICAjIEZ1bmN0aW9uIHNlbGVjdGVkIGZvciBpbmxpbmUgZXhwYW5zaW9uLgotICAgICAgIyBJdCdzIHVwIHRvIHRoZSBjb21waWxlciB0byBkZWNpZGUgd2hhdCB0byBpbmxpbmUuCi0gICAgICA0NzExLAotICAgICAgIyBUaGUgdHlwZSBhbmQgb3JkZXIgb2YgZWxlbWVudHMgY2F1c2VkIHRoZSBjb21waWxlciB0byBhZGQgcGFkZGluZwotICAgICAgIyB0byB0aGUgZW5kIG9mIGEgc3RydWN0LgotICAgICAgIyBVbnN1cnByaXNpbmdseSwgbW9zdCBvZiB0aGUgc3RydWN0cyBiZWNvbWUgbGFyZ2VyIGJlY2F1c2Ugb2YgcGFkZGluZwotICAgICAgIyBidXQgaXQncyBhIHVuaXZlcnNhbGx5IGFjY2VwdGFibGUgcHJpY2UgZm9yIGJldHRlciBwZXJmb3JtYW5jZS4KLSAgICAgIDQ4MjAsCi0gICAgICAjIERpc2FibGUgc3RhdGljIGFuYWx5emVyIHdhcm5pbmcgZm9yIHN0ZDo6bWluIGFuZCBzdGQ6Om1heCB3aXRoCi0gICAgICAjIG9iamVjdHMuCi0gICAgICAjIGh0dHBzOi8vY29ubmVjdC5taWNyb3NvZnQuY29tL1Zpc3VhbFN0dWRpby9mZWVkYmFjay9kZXRhaWxzLzc4MzgwOC9zdGF0aWMtYW5hbHl6ZXItd2FybmluZy1jMjgyODUtZm9yLXN0ZC1taW4tYW5kLXN0ZC1tYXgKLSAgICAgIDI4Mjg1LAotICAgIF0sCi0gIH0sICMgZW5kIG9mIHRhcmdldF9kZWZhdWx0cwotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC93aW4vc2hhcmVkL3N0YXJib2FyZF9wbGF0Zm9ybS5neXBpIGIvc3JjL3N0YXJib2FyZC93aW4vc2hhcmVkL3N0YXJib2FyZF9wbGF0Zm9ybS5neXBpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmJjMjgxLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvd2luL3NoYXJlZC9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwaQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NSArMCwwIEBACi0jIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi17Ci0gICd2YXJpYWJsZXMnOiB7Ci0gICAgJ3NiX3BlZGFudGljX3dhcm5pbmdzJzogMSwKLSAgICAnd2lucnQlJzogMSwKLQotICAgICMgVE9ETzogTW92ZSB0aGlzIGFuZCB0aGUgd2luMzIgZGVwZW5kZW5jaWVzIGJlbG93IHRvIGEgc2hhcmVkL3dpbjMyL3N0YXJib2FyZF9wbGF0Zm9ybS5neXBpPwotICAgICd1d3BfaW5jb21wYXRpYmxlX3dpbjMyJzogWwotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvYXBwbGljYXRpb25fd2luMzJfa2V5X2V2ZW50LmNjJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2FwcGxpY2F0aW9uX3dpbjMyLmNjJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2RlY29kZV90YXJnZXRfaW50ZXJuYWwuY2MnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZGVjb2RlX3RhcmdldF9pbnRlcm5hbC5oJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2RpYWxvZy5jYycsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9nZXRfaG9tZV9kaXJlY3RvcnkuY2MnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbG9nX2ZpbGVfaW1wbC5jYycsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9sb2dfZmlsZV9pbXBsLmgnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbG9nX3Jhdy5jYycsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9sb2dfcmF3X2Zvcm1hdC5jYycsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9tZWRpYV9pc19hdWRpb19zdXBwb3J0ZWQuY2MnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbWVkaWFfaXNfdmlkZW9fc3VwcG9ydGVkLmNjJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3BsYXllcl9jb21wb25lbnRzX2ltcGwuY2MnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvcGxheXJlYWR5X2xpY2Vuc2UuY2MnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc3RhcmJvYXJkX21haW4uY2MnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc3lzdGVtX2NsZWFyX3BsYXRmb3JtX2Vycm9yLmNjJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3N5c3RlbV9nZXRfZGV2aWNlX3R5cGUuY2MnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc3lzdGVtX2dldF9wcm9wZXJ0eS5jYycsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zeXN0ZW1fZ2V0X3RvdGFsX2NwdV9tZW1vcnkuY2MnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc3lzdGVtX2dldF91c2VkX2NwdV9tZW1vcnkuY2MnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc3lzdGVtX3JhaXNlX3BsYXRmb3JtX2Vycm9yLmNjJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3dpbmRvd19jcmVhdGUuY2MnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvd2luZG93X2Rlc3Ryb3kuY2MnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvd2luZG93X2dldF9wbGF0Zm9ybV9oYW5kbGUuY2MnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvd2luZG93X2dldF9zaXplLmNjJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3dpbmRvd19pbnRlcm5hbC5jYycsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi93aW5kb3dfaW50c2RmZHNmZXJuYWwuaCcsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi93aW5kb3dfc2V0X2RlZmF1bHRfb3B0aW9ucy5jYycsCi0gICAgXSwKLSAgICAnd2luMzJfc2hhcmVkX2RybV9maWxlcyc6IFsKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9kcm0vZHJtX2Nsb3NlX3Nlc3Npb24uY2MnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2RybS9kcm1fZGVzdHJveV9zeXN0ZW0uY2MnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2RybS9kcm1fZ2VuZXJhdGVfc2Vzc2lvbl91cGRhdGVfcmVxdWVzdC5jYycsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvZHJtL2RybV9zeXN0ZW1faW50ZXJuYWwuaCcsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvZHJtL2RybV91cGRhdGVfc2Vzc2lvbi5jYycsCi0KLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2RybV9jcmVhdGVfc3lzdGVtLmNjJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2RybV9zeXN0ZW1fcGxheXJlYWR5LmNjJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2RybV9zeXN0ZW1fcGxheXJlYWR5LmgnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvd3JtX2hlYWRlci5jYycsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi93cm1faGVhZGVyLmgnLAotICAgIF0sCi0KLSAgICAjIFBsZWFzZSBrZWVwIHRoaXMgaW4gc3luYyB3aXRoIHhiMS9zaGFyZWQvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cGkuCi0gICAgJ3dpbjMyX21lZGlhX3BsYXllcl9maWxlcyc6IFsKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2F0b21pY19xdWV1ZS5oJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2F1ZGlvX2RlY29kZXIuY2MnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvYXVkaW9fZGVjb2Rlci5oJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2F1ZGlvX2RlY29kZXJfdGhyZWFkLmNjJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2F1ZGlvX2RlY29kZXJfdGhyZWFkLmgnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvYXVkaW9fdHJhbnNmb3JtLmNjJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2F1ZGlvX3RyYW5zZm9ybS5oJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2RlY3J5cHRpbmdfZGVjb2Rlci5jYycsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9kZWNyeXB0aW5nX2RlY29kZXIuaCcsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9keF9jb250ZXh0X3ZpZGVvX2RlY29kZXIuY2MnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZHhfY29udGV4dF92aWRlb19kZWNvZGVyLmgnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbWVkaWFfY29tbW9uLmNjJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL21lZGlhX2NvbW1vbi5oJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL21lZGlhX2ZvdW5kYXRpb25fdXRpbHMuY2MnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbWVkaWFfZm91bmRhdGlvbl91dGlscy5oJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL21lZGlhX2lzX3N1cHBvcnRlZC5jYycsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9tZWRpYV90cmFuc2Zvcm0uY2MnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbWVkaWFfdHJhbnNmb3JtLmgnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdmlkZW9fZGVjb2Rlci5jYycsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi92aWRlb19kZWNvZGVyLmgnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvd2luMzJfYXVkaW9fZGVjb2Rlci5jYycsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi93aW4zMl9hdWRpb19kZWNvZGVyLmgnLAotICAgIF0sCi0gICAgJ3dpbjMyX3NoYXJlZF9tZWRpYV9wbGF5ZXJfZmlsZXMnOiBbCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWVkaWEvY29kZWNfdXRpbC5jYycsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWVkaWEvY29kZWNfdXRpbC5oJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9tZWRpYS9tZWRpYV9jYW5fcGxheV9taW1lX2FuZF9rZXlfc3lzdGVtLmNjJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9tZWRpYS9tZWRpYV9nZXRfYXVkaW9fb3V0cHV0X2NvdW50X3N0ZXJlb19vbmx5LmNjJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9tZWRpYS9tZWRpYV91dGlsLmNjJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9tZWRpYS9tZWRpYV91dGlsLmgnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9kZWNvZGVkX2F1ZGlvX2ludGVybmFsLmNjJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2F1ZGlvX2ZyYW1lX3RyYWNrZXIuY2MnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fZnJhbWVfdHJhY2tlci5oJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2F1ZGlvX3JlbmRlcmVyX3NpbmsuaCcsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9hdWRpb19yZW5kZXJlcl9zaW5rX2ltcGwuY2MnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fcmVuZGVyZXJfc2lua19pbXBsLmgnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fcmVzYW1wbGVyX2ltcGwuY2MnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fdGltZV9zdHJldGNoZXIuY2MnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvZGVjb2RlZF9hdWRpb19xdWV1ZS5jYycsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9maWx0ZXJfYmFzZWRfcGxheWVyX3dvcmtlcl9oYW5kbGVyLmNjJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2ZpbHRlcl9iYXNlZF9wbGF5ZXJfd29ya2VyX2hhbmRsZXIuaCcsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9tZWRpYV90aW1lX3Byb3ZpZGVyLmgnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvbWVkaWFfdGltZV9wcm92aWRlcl9pbXBsLmNjJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL21lZGlhX3RpbWVfcHJvdmlkZXJfaW1wbC5oJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3ZpZGVvX2ZyYW1lX2ludGVybmFsLmgnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdmlkZW9fcmVuZGVyX2FsZ29yaXRobS5oJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3ZpZGVvX3JlbmRlcl9hbGdvcml0aG1faW1wbC5jYycsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci92aWRlb19yZW5kZXJfYWxnb3JpdGhtX2ltcGwuaCcsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci93c29sYV9pbnRlcm5hbC5jYycsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2lucHV0X2J1ZmZlcl9pbnRlcm5hbC5jYycsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2lucHV0X2J1ZmZlcl9pbnRlcm5hbC5oJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvam9iX3F1ZXVlLmNjJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX2NyZWF0ZS5jYycsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9kZXN0cm95LmNjJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX2dldF9jdXJyZW50X2ZyYW1lLmNjJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX2dldF9pbmZvLmNjJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX2dldF9pbmZvMi5jYycsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9pbnRlcm5hbC5jYycsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9vdXRwdXRfbW9kZV9zdXBwb3J0ZWQuY2MnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfb3V0cHV0X21vZGVfc3VwcG9ydGVkLmgnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfc2Vlay5jYycsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9zZWVrMi5jYycsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9zZXRfYm91bmRzLmNjJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3NldF9wbGF5YmFja19yYXRlLmNjJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3NldF92b2x1bWUuY2MnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfd29ya2VyLmNjJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3dyaXRlX2VuZF9vZl9zdHJlYW0uY2MnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfd3JpdGVfc2FtcGxlLmNjJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3dyaXRlX3NhbXBsZTIuY2MnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9tZWRpYV9pc190cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3Nfc3VwcG9ydGVkLmNjJywKLQotICAgICAgIyBTaGFyZWQgcmVuZGVyZXJzCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9hdWRpb19yZW5kZXJlcl9pbnRlcm5hbC5jYycsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9hdWRpb19yZW5kZXJlcl9pbnRlcm5hbC5oJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3ZpZGVvX3JlbmRlcmVyX2ludGVybmFsLmNjJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3ZpZGVvX3JlbmRlcmVyX2ludGVybmFsLmgnLAotICAgIF0sCi0KLSAgICAnd2luMzJfc2hhcmVkX21pc2NfZmlsZXMnOiBbCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL2NvbW1vbi90aHJlYWQuY2MnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9jb21tb24vdGhyZWFkLmgnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL25ldF9sb2cuY2MnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL25ldF9sb2cuaCcsCi0gICAgXSwKLQotICAgICdzdGFyYm9hcmRfcGxhdGZvcm1fZGVwZW5kZW50X2ZpbGVzJzogWwotICAgICAgJzxAKHdpbjMyX3NoYXJlZF9taXNjX2ZpbGVzKScsCi0gICAgICAnPEAod2luMzJfbWVkaWFfcGxheWVyX2ZpbGVzKScsCi0gICAgICAnPEAod2luMzJfc2hhcmVkX2RybV9maWxlcyknLAotICAgICAgJzxAKHdpbjMyX3NoYXJlZF9tZWRpYV9wbGF5ZXJfZmlsZXMpJywKLSAgICBdCi0gIH0sCi0gICd0YXJnZXRzJzogWwotICAgIHsKLSAgICAgICd0YXJnZXRfbmFtZSc6ICdzdGFyYm9hcmRfcGxhdGZvcm0nLAotICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAotICAgICAgJ2hhcmRfZGVwZW5kZW5jeSc6IDEsCi0gICAgICAnbXN2c19zZXR0aW5ncyc6IHsKLSAgICAgICAgJ1ZDQ0xDb21waWxlclRvb2wnOiB7Ci0gICAgICAgICAgJ0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMnOiBbCi0gICAgICAgICAgICAnPChERVBUSCkvdGhpcmRfcGFydHkvYW5nbGUvaW5jbHVkZScsCi0gICAgICAgICAgICAnPChERVBUSCkvdGhpcmRfcGFydHkvYW5nbGUvaW5jbHVkZS9FR0wnLAotICAgICAgICAgICAgJzwoREVQVEgpL3RoaXJkX3BhcnR5L2FuZ2xlL2luY2x1ZGUvR0xFUzInLAotICAgICAgICAgICAgJzwoREVQVEgpL3RoaXJkX3BhcnR5L2FuZ2xlL2luY2x1ZGUvS0hSJywKLSAgICAgICAgICBdLAotICAgICAgICAgICdBZGRpdGlvbmFsT3B0aW9ucyc6IFsKLSAgICAgICAgICAgICcvRUhzYycsICAgICAgICAgIyBDKysgZXhjZXB0aW9ucyAocmVxdWlyZWQgd2l0aCAvWlcpCi0gICAgICAgICAgICAnL0ZVIjwodmlzdWFsX3N0dWRpb19pbnN0YWxsX3BhdGgpL2xpYi94ODYvc3RvcmUvcmVmZXJlbmNlcy9wbGF0Zm9ybS53aW5tZCInLAotICAgICAgICAgICAgJy9GVSI8KHdpbmRvd3Nfc2RrX3BhdGgpL1JlZmVyZW5jZXMvPCh3aW5kb3dzX3Nka192ZXJzaW9uKS9XaW5kb3dzLkZvdW5kYXRpb24uRm91bmRhdGlvbkNvbnRyYWN0LzMuMC4wLjAvV2luZG93cy5Gb3VuZGF0aW9uLkZvdW5kYXRpb25Db250cmFjdC53aW5tZCInLAotICAgICAgICAgICAgJy9GVSI8KHdpbmRvd3Nfc2RrX3BhdGgpL1JlZmVyZW5jZXMvPCh3aW5kb3dzX3Nka192ZXJzaW9uKS9XaW5kb3dzLkZvdW5kYXRpb24uVW5pdmVyc2FsQXBpQ29udHJhY3QvNC4wLjAuMC9XaW5kb3dzLkZvdW5kYXRpb24uVW5pdmVyc2FsQXBpQ29udHJhY3Qud2lubWQiJywKLSAgICAgICAgICBdCi0gICAgICAgIH0KLSAgICAgIH0sCi0gICAgICAnY29uZGl0aW9ucyc6IFsKLSAgICAgICAgWyd3aW5ydD09MScsIHsKLSAgICAgICAgICAnbXN2c19zZXR0aW5ncyc6IHsKLSAgICAgICAgICAgICdWQ0NMQ29tcGlsZXJUb29sJzogewotICAgICAgICAgICAgICAnQWRkaXRpb25hbE9wdGlvbnMnOiBbCi0gICAgICAgICAgICAgICAgJy9aVycsICAgICAgICAgICAjIFdpbmRvd3MgUnVudGltZQotICAgICAgICAgICAgICAgICcvWlc6bm9zdGRsaWInLCAgIyBXaW5kb3dzIFJ1bnRpbWUsIG5vIGRlZmF1bHQgI3VzaW5nCi0gICAgICAgICAgICAgIF0sCi0gICAgICAgICAgICB9LAotICAgICAgICAgIH0sCi0gICAgICAgICAgJ2RlZmluZXMnOiBbCi0gICAgICAgICAgICAjIFZTMjAxNyBhbHdheXMgZGVmaW5lcyB0aGlzIGZvciBVV1AgYXBwcwotICAgICAgICAgICAgJ1dJTkFQSV9GQU1JTFk9V0lOQVBJX0ZBTUlMWV9BUFAnLAotICAgICAgICAgICAgIyBWUzIwMTcgYWx3YXlzIGRlZmluZXMgdGhpcyBmb3IgVVdQIGFwcHMKLSAgICAgICAgICAgICdfX1dSTF9OT19ERUZBVUxUX0xJQl9fJywKLSAgICAgICAgICBdCi0gICAgICAgIH1dCi0gICAgICBdLAotICAgICAgJ3NvdXJjZXMnOiBbCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL2lzby9jaGFyYWN0ZXJfaXNfYWxwaGFudW1lcmljLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvaXNvL2NoYXJhY3Rlcl9pc19kaWdpdC5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL2lzby9jaGFyYWN0ZXJfaXNfaGV4X2RpZ2l0LmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvaXNvL2NoYXJhY3Rlcl9pc19zcGFjZS5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL2lzby9jaGFyYWN0ZXJfaXNfdXBwZXIuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9pc28vY2hhcmFjdGVyX3RvX2xvd2VyLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvaXNvL2NoYXJhY3Rlcl90b191cHBlci5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL2lzby9kb3VibGVfYWJzb2x1dGUuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9pc28vZG91YmxlX2V4cG9uZW50LmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvaXNvL2RvdWJsZV9mbG9vci5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL2lzby9kb3VibGVfaXNfZmluaXRlLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvaXNvL2RvdWJsZV9pc19uYW4uY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9pc28vbWVtb3J5X2NvbXBhcmUuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9pc28vbWVtb3J5X2NvcHkuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9pc28vbWVtb3J5X2ZpbmRfYnl0ZS5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL2lzby9tZW1vcnlfbW92ZS5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL2lzby9tZW1vcnlfc2V0LmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvaXNvL3N0cmluZ19jb21wYXJlLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvaXNvL3N0cmluZ19jb21wYXJlX2FsbC5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL2lzby9zdHJpbmdfZmluZF9jaGFyYWN0ZXIuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9pc28vc3RyaW5nX2ZpbmRfbGFzdF9jaGFyYWN0ZXIuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9pc28vc3RyaW5nX2ZpbmRfc3RyaW5nLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvaXNvL3N0cmluZ19nZXRfbGVuZ3RoLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvaXNvL3N0cmluZ19nZXRfbGVuZ3RoX3dpZGUuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9pc28vc3RyaW5nX3BhcnNlX2RvdWJsZS5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL2lzby9zdHJpbmdfcGFyc2Vfc2lnbmVkX2ludGVnZXIuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9pc28vc3RyaW5nX3BhcnNlX3VpbnQ2NC5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL2lzby9zdHJpbmdfcGFyc2VfdW5zaWduZWRfaW50ZWdlci5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL2lzby9zdHJpbmdfc2Nhbi5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL2lzby9zeXN0ZW1fYmluYXJ5X3NlYXJjaC5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL2lzby9zeXN0ZW1fc29ydC5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL25vdXNlci91c2VyX2dldF9jdXJyZW50LmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvbm91c2VyL3VzZXJfZ2V0X3Byb3BlcnR5LmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvbm91c2VyL3VzZXJfZ2V0X3NpZ25lZF9pbi5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL25vdXNlci91c2VyX2ludGVybmFsLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2F1ZGlvX3NpbmsvYXVkaW9fc2lua19jcmVhdGUuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvYXVkaW9fc2luay9hdWRpb19zaW5rX2Rlc3Ryb3kuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvYXVkaW9fc2luay9hdWRpb19zaW5rX2ludGVybmFsLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2F1ZGlvX3NpbmsvYXVkaW9fc2lua19pbnRlcm5hbC5oJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2F1ZGlvX3NpbmsvYXVkaW9fc2lua19pc192YWxpZC5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9hdWRpb19zaW5rL3N0dWJfYXVkaW9fc2lua190eXBlLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2F1ZGlvX3Npbmsvc3R1Yl9hdWRpb19zaW5rX3R5cGUuaCcsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9hcHBsaWNhdGlvbi5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9jb21tYW5kX2xpbmUuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvY29tbWFuZF9saW5lLmgnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvZXZlbnRfY2FuY2VsLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2V2ZW50X3NjaGVkdWxlLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2ZpbGVfc3RvcmFnZS9zdG9yYWdlX2Nsb3NlX3JlY29yZC5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9maWxlX3N0b3JhZ2Uvc3RvcmFnZV9kZWxldGVfcmVjb3JkLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2ZpbGVfc3RvcmFnZS9zdG9yYWdlX2dldF9yZWNvcmRfc2l6ZS5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9maWxlX3N0b3JhZ2Uvc3RvcmFnZV9vcGVuX3JlY29yZC5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9maWxlX3N0b3JhZ2Uvc3RvcmFnZV9yZWFkX3JlY29yZC5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9maWxlX3N0b3JhZ2Uvc3RvcmFnZV93cml0ZV9yZWNvcmQuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvZmlsZV9tb2RlX3N0cmluZ190b19mbGFncy5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9sb2dfbWVzc2FnZS5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9tZWRpYS9taW1lX3R5cGUuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWVkaWEvbWltZV90eXBlLmgnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvc3RyaW5nX2NvbmNhdC5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9zdHJpbmdfY29uY2F0X3dpZGUuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvc3RyaW5nX2NvcHkuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvc3RyaW5nX2NvcHlfd2lkZS5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9zdHJpbmdfZHVwbGljYXRlLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9hY2Nlc3NpYmlsaXR5X2dldF9kaXNwbGF5X3NldHRpbmdzLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9hY2Nlc3NpYmlsaXR5X2dldF90ZXh0X3RvX3NwZWVjaF9zZXR0aW5ncy5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvY3J5cHRvZ3JhcGh5X2NyZWF0ZV90cmFuc2Zvcm1lci5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvY3J5cHRvZ3JhcGh5X2Rlc3Ryb3lfdHJhbnNmb3JtZXIuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2NyeXB0b2dyYXBoeV9nZXRfdGFnLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9jcnlwdG9ncmFwaHlfc2V0X2F1dGhlbnRpY2F0ZWRfZGF0YS5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvY3J5cHRvZ3JhcGh5X3NldF9pbml0aWFsaXphdGlvbl92ZWN0b3IuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2NyeXB0b2dyYXBoeV90cmFuc2Zvcm0uY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2ltYWdlX2RlY29kZS5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvaW1hZ2VfaXNfZGVjb2RlX3N1cHBvcnRlZC5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvc3lzdGVtX2dldF90b3RhbF9ncHVfbWVtb3J5LmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9zeXN0ZW1fZ2V0X3VzZWRfZ3B1X21lbW9yeS5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvc3lzdGVtX2hhc19jYXBhYmlsaXR5LmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9zeXN0ZW1faGlkZV9zcGxhc2hfc2NyZWVuLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9zeXN0ZW1fc3ltYm9saXplLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi90aW1lX3pvbmVfZ2V0X2RzdF9uYW1lLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvYXVkaW9fc2luay5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2FkYXB0ZXJfdXRpbHMuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9hZGFwdGVyX3V0aWxzLmgnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9hdG9taWNfcHVibGljLmgnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9hdWRpb19zaW5rX2dldF9tYXhfY2hhbm5lbHMuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9hdWRpb19zaW5rX2dldF9uZWFyZXN0X3N1cHBvcnRlZF9zYW1wbGVfZnJlcXVlbmN5LmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvYXVkaW9fc2lua19pc19hdWRpb19mcmFtZV9zdG9yYWdlX3R5cGVfc3VwcG9ydGVkLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvYXVkaW9fc2lua19pc19hdWRpb19zYW1wbGVfdHlwZV9zdXBwb3J0ZWQuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9hdXRvX2V2ZW50X2hhbmRsZS5oJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvYnl0ZV9zd2FwLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvY29uZGl0aW9uX3ZhcmlhYmxlX2Jyb2FkY2FzdC5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2NvbmRpdGlvbl92YXJpYWJsZV9jcmVhdGUuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9jb25kaXRpb25fdmFyaWFibGVfZGVzdHJveS5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2NvbmRpdGlvbl92YXJpYWJsZV9zaWduYWwuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9jb25kaXRpb25fdmFyaWFibGVfd2FpdC5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2NvbmRpdGlvbl92YXJpYWJsZV93YWl0X3RpbWVkLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZGlyZWN0b3J5X2Nhbl9vcGVuLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZGlyZWN0b3J5X2Nsb3NlLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZGlyZWN0b3J5X2NyZWF0ZS5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2RpcmVjdG9yeV9nZXRfbmV4dC5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2RpcmVjdG9yeV9pbnRlcm5hbC5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2RpcmVjdG9yeV9pbnRlcm5hbC5oJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZGlyZWN0b3J5X29wZW4uY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9lcnJvcl91dGlscy5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2Vycm9yX3V0aWxzLmgnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX2Nhbl9vcGVuLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZmlsZV9jbG9zZS5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2ZpbGVfZGVsZXRlLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZmlsZV9leGlzdHMuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX2ZsdXNoLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZmlsZV9nZXRfaW5mby5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2ZpbGVfZ2V0X3BhdGhfaW5mby5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2ZpbGVfaW50ZXJuYWwuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX2ludGVybmFsLmgnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX29wZW4uY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX3JlYWQuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX3NlZWsuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9maWxlX3RydW5jYXRlLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvZmlsZV93cml0ZS5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2xvZy5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2xvZ19mbHVzaC5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2xvZ19mb3JtYXQuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9sb2dfaXNfdHR5LmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbG9nX3Jhd19kdW1wX3N0YWNrLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbWVtb3J5X2FsbG9jYXRlX2FsaWduZWRfdW5jaGVja2VkLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbWVtb3J5X2FsbG9jYXRlX3VuY2hlY2tlZC5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL21lbW9yeV9mcmVlLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbWVtb3J5X2ZyZWVfYWxpZ25lZC5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL21lbW9yeV9nZXRfc3RhY2tfYm91bmRzLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvbWVtb3J5X21hcC5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL21lbW9yeV9yZWFsbG9jYXRlX3VuY2hlY2tlZC5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL21lbW9yeV91bm1hcC5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL211dGV4X2FjcXVpcmUuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9tdXRleF9hY3F1aXJlX3RyeS5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL211dGV4X2NyZWF0ZS5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL211dGV4X2Rlc3Ryb3kuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9tdXRleF9yZWxlYXNlLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvb25jZS5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NldF9ub25fYmxvY2tpbmdfaW50ZXJuYWwuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zZXRfbm9uX2Jsb2NraW5nX2ludGVybmFsLmgnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfYWNjZXB0LmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X2JpbmQuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfY2xlYXJfbGFzdF9lcnJvci5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF9jb25uZWN0LmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X2NyZWF0ZS5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF9kZXN0cm95LmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X2ZyZWVfcmVzb2x1dGlvbi5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF9nZXRfbGFzdF9lcnJvci5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF9nZXRfbG9jYWxfYWRkcmVzcy5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF9nZXRfaW50ZXJmYWNlX2FkZHJlc3MuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfaW50ZXJuYWwuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfaW50ZXJuYWwuaCcsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF9pc19jb25uZWN0ZWQuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfaXNfY29ubmVjdGVkX2FuZF9pZGxlLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X2pvaW5fbXVsdGljYXN0X2dyb3VwLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X2xpc3Rlbi5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF9yZWNlaXZlX2Zyb20uY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfcmVzb2x2ZS5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF9zZW5kX3RvLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc3lzdGVtX2dldF9jb25uZWN0aW9uX3R5cGUuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zeXN0ZW1fZ2V0X2Vycm9yX3N0cmluZy5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3N5c3RlbV9nZXRfbnVtYmVyX29mX3Byb2Nlc3NvcnMuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zeXN0ZW1fZ2V0X3N0YWNrLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X3NldF9icm9hZGNhc3QuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfc2V0X3JlY2VpdmVfYnVmZmVyX3NpemUuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfc2V0X3JldXNlX2FkZHJlc3MuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfc2V0X3NlbmRfYnVmZmVyX3NpemUuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfc2V0X3RjcF9rZWVwX2FsaXZlLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X3NldF90Y3Bfbm9fZGVsYXkuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfc2V0X3RjcF93aW5kb3dfc2NhbGluZy5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3NvY2tldF93YWl0ZXJfYWRkLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X3dhaXRlcl9jcmVhdGUuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfd2FpdGVyX2Rlc3Ryb3kuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfd2FpdGVyX2ludGVybmFsLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc29ja2V0X3dhaXRlcl9yZW1vdmUuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfd2FpdGVyX3dhaXQuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfd2FpdGVyX3dhaXRfdGltZWQuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zb2NrZXRfd2FpdGVyX3dha2VfdXAuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zdHJpbmdfY29tcGFyZV9ub19jYXNlLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc3RyaW5nX2NvbXBhcmVfbm9fY2FzZV9uLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc3RyaW5nX2NvbXBhcmVfd2lkZS5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3N0cmluZ19mb3JtYXQuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zdHJpbmdfZm9ybWF0X3dpZGUuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zeXN0ZW1fYnJlYWtfaW50b19kZWJ1Z2dlci5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3N5c3RlbV9jbGVhcl9sYXN0X2Vycm9yLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc3lzdGVtX2dldF9sb2NhbGVfaWQuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zeXN0ZW1fZ2V0X3JhbmRvbV9kYXRhLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc3lzdGVtX2dldF9yYW5kb21fdWludDY0LmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc3lzdGVtX2dldF9sYXN0X2Vycm9yLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvc3lzdGVtX2lzX2RlYnVnZ2VyX2F0dGFjaGVkLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX2NyZWF0ZS5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9jcmVhdGVfbG9jYWxfa2V5LmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX2RldGFjaC5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9kZXN0cm95X2xvY2FsX2tleS5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9nZXRfY3VycmVudC5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9nZXRfaWQuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfZ2V0X2xvY2FsX3ZhbHVlLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX2dldF9uYW1lLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX2lzX2VxdWFsLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX2pvaW4uY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfbG9jYWxfaW50ZXJuYWwuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfbG9jYWxfaW50ZXJuYWwuaCcsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9wcml2YXRlLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX3ByaXZhdGUuaCcsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RocmVhZF9zZXRfbG9jYWxfdmFsdWUuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfc2V0X25hbWUuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfc2xlZXAuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfdHlwZXNfcHVibGljLmgnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfeWllbGQuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfeWllbGQuaCcsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3dpbjMyL3RpbWVfZ2V0X21vbm90b25pY19ub3cuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aW1lX2dldF9ub3cuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aW1lX3pvbmVfZ2V0X2N1cnJlbnQuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aW1lX3pvbmVfZ2V0X25hbWUuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aW1lX3V0aWxzLmgnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC93aW4zMi93Y2hhcl91dGlscy5oJywKLSAgICAgICAgIyBJbmNsdWRlIHByaXZhdGUgc3R1YnMsIGlmIHByZXNlbnQuCi0gICAgICAgICc8IUAocHl0aG9uICI8KERFUFRIKS9zdGFyYm9hcmQvdG9vbHMvZmluZF9wcml2YXRlX2ZpbGVzLnB5IiAiPChERVBUSCkiICJzaGFyZWQvc3R1Yi8qLmNjIiknLAotICAgICAgICAnPEAoc3RhcmJvYXJkX3BsYXRmb3JtX2RlcGVuZGVudF9maWxlcyknLAotICAgICAgXSwKLSAgICAgICdkZWZpbmVzJzogWwotICAgICAgICAjIFRoaXMgbXVzdCBiZSBkZWZpbmVkIHdoZW4gYnVpbGRpbmcgU3RhcmJvYXJkLCBhbmQgbXVzdCBub3Qgd2hlbgotICAgICAgICAjIGJ1aWxkaW5nIFN0YXJib2FyZCBjbGllbnQgY29kZS4KLSAgICAgICAgJ1NUQVJCT0FSRF9JTVBMRU1FTlRBVElPTicsCi0gICAgICAgICMgV2UgYXNzdW1lIG1vc3QgbW9kZXJuIFdpbmRvd3MgUENzIGNhbiBoYW5kbGUgNGsgSDI2NCBhbmQgOGsgVlA5LgotICAgICAgICAjIFRoZSBsYXR0ZXIgaXMgYWRkaXRpb25hbGx5IGdhdGVkIG9uIE1lZGlhIEZvdW5kYXRpb24gYWNjZWxlcmF0aW9uCi0gICAgICAgICMgc3VwcG9ydCBkdXJpbmcgcnVudGltZSBhbnl3YXkuCi0gICAgICAgICdFTkFCTEVfSDI2NF80S19TVVBQT1JUJywKLSAgICAgICAgJ0VOQUJMRV9WUDlfOEtfU1VQUE9SVCcsCi0gICAgICBdLAotICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKLSAgICAgICAgJ2NvbnZlcnRfaTE4bl9kYXRhJywKLSAgICAgIF0sCi0gICAgfSwKLSAgICB7Ci0gICAgICAndGFyZ2V0X25hbWUnOiAnY29udmVydF9pMThuX2RhdGEnLAotICAgICAgJ3R5cGUnOiAnbm9uZScsCi0gICAgICAnYWN0aW9ucyc6IFsKLSAgICAgICAgewotICAgICAgICAgICdhY3Rpb25fbmFtZSc6ICdjb252ZXJ0X2kxOG5fZGF0YScsCi0gICAgICAgICAgJ3ZhcmlhYmxlcyc6IHsKLSAgICAgICAgICAgICdpbnB1dF9maWxlcyc6Ci0gICAgICAgICAgICAgICc8IShmaW5kIDwoREVQVEgpL2NvYmFsdC9jb250ZW50L2kxOG4vcGxhdGZvcm0veGIxLyoueGxiKScsCi0gICAgICAgICAgfSwKLSAgICAgICAgICAnaW5jbHVkZXMnOiBbICcuLi8uLi9idWlsZC9jb252ZXJ0X2kxOG5fZGF0YS5neXBpJyBdLAotICAgICAgICB9LAotICAgICAgXSwKLSAgICB9Ci0gIF0sCi19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3dpbi9zaGFyZWQvc3lzdGVtX2dldF9wYXRoLmNjIGIvc3JjL3N0YXJib2FyZC93aW4vc2hhcmVkL3N5c3RlbV9nZXRfcGF0aC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjljNDkxZC4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3dpbi9zaGFyZWQvc3lzdGVtX2dldF9wYXRoLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc3lzdGVtLmgiCi0KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0vLyBwYXRoY2NoLmggbXVzdCBjb21lIGFmdGVyIHdpbmRvd3MuaC4KLSNpbmNsdWRlIDxwYXRoY2NoLmg+Ci0KLSNpbmNsdWRlIDxjb2RlY3Z0PgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaW5jbHVkZSA8bG9jYWxlPgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2RpcmVjdG9yeS5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2RpcmVjdG9yeV9pbnRlcm5hbC5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvZmlsZV9pbnRlcm5hbC5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvd2NoYXJfdXRpbHMuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvc3RyaW5nLmgiCi0KLW5hbWVzcGFjZSB7Ci0KLXVzaW5nIHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6Q3JlYXRlRGlyZWN0b3J5SGllYXJjaHk7Ci11c2luZyBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6Ok5vcm1hbGl6ZVdpbjMyUGF0aDsKLQotLy8gUGxhY2VzIHVwIHRvIHxwYXRoX3NpemV8IC0gMSBjaGFyYWN0ZXJzIG9mIHRoZSBwYXRoIHRvIHRoZSBjdXJyZW50Ci0vLyBleGVjdXRhYmxlIGluIHxvdXRfcGF0aHwsIGVuc3VyaW5nIGl0IGlzIE5VTEwtdGVybWluYXRlZC4gUmV0dXJucyBzdWNjZXNzCi0vLyBzdGF0dXMuIFRoZSByZXN1bHQgYmVpbmcgZ3JlYXRlciB0aGFuIHxwYXRoX3NpemV8IC0gMSBjaGFyYWN0ZXJzIGlzIGEKLS8vIGZhaWx1cmUuIHxvdXRfcGF0aHwgbWF5IGJlIHdyaXR0ZW4gdG8gaW4gdW5zdWNjZXNzZnVsIGNhc2VzLgotYm9vbCBHZXRFeGVjdXRhYmxlUGF0aChjaGFyKiBvdXRfcGF0aCwgaW50IHBhdGhfc2l6ZSkgewotICBpZiAoIW91dF9wYXRoIHx8IChwYXRoX3NpemUgPD0gMCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICB3Y2hhcl90IHdfZmlsZV9wYXRoW1NCX0ZJTEVfTUFYX1BBVEhdOwotICBEV09SRCBjaGFyYWN0ZXJzX3dyaXR0ZW4gPQotICAgICAgR2V0TW9kdWxlRmlsZU5hbWUoTlVMTCwgd19maWxlX3BhdGgsIFNCX0ZJTEVfTUFYX1BBVEgpOwotICBpZiAoY2hhcmFjdGVyc193cml0dGVuIDwgMSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBzdGQ6OnN0cmluZyB1dGY4X3N0cmluZyA9Ci0gICAgICBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OndjaGFyX3RUb1VURjgod19maWxlX3BhdGgpOwotICBpZiAodXRmOF9zdHJpbmcubGVuZ3RoKCkgPj0gcGF0aF9zaXplKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiBTYlN0cmluZ0NvcHkob3V0X3BhdGgsIHV0Zjhfc3RyaW5nLmNfc3RyKCksIHBhdGhfc2l6ZSk7Ci19Ci0KLS8vIFBsYWNlcyB1cCB0byB8cGF0aF9zaXplfCAtIDEgY2hhcmFjdGVycyBvZiB0aGUgcGF0aCB0byB0aGUgZGlyZWN0b3J5Ci0vLyBjb250YWluaW5nIHRoZSBjdXJyZW50IGV4ZWN1dGFibGUgaW4gfG91dF9wYXRofCwgZW5zdXJpbmcgaXQgaXMKLS8vIE5VTEwtdGVybWluYXRlZC4gUmV0dXJucyBzdWNjZXNzIHN0YXR1cy4gVGhlIHJlc3VsdCBiZWluZyBncmVhdGVyIHRoYW4KLS8vIHxwYXRoX3NpemV8IC0gMSBjaGFyYWN0ZXJzIGlzIGEgZmFpbHVyZS4gfG91dF9wYXRofCBtYXkgYmUgd3JpdHRlbiB0byBpbgotLy8gdW5zdWNjZXNzZnVsIGNhc2VzLgotYm9vbCBHZXRFeGVjdXRhYmxlRGlyZWN0b3J5KGNoYXIqIG91dF9wYXRoLCBpbnQgcGF0aF9zaXplKSB7Ci0gIGlmICghb3V0X3BhdGggfHwgKHBhdGhfc2l6ZSA8PSAwKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHdjaGFyX3Qgd19maWxlX3BhdGhbU0JfRklMRV9NQVhfUEFUSF07Ci0gIERXT1JEIGNoYXJhY3RlcnNfd3JpdHRlbiA9Ci0gICAgICBHZXRNb2R1bGVGaWxlTmFtZShOVUxMLCB3X2ZpbGVfcGF0aCwgU0JfRklMRV9NQVhfUEFUSCk7Ci0gIGlmIChjaGFyYWN0ZXJzX3dyaXR0ZW4gPCAxKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIFBhdGhDY2hSZW1vdmVGaWxlU3BlYyh3X2ZpbGVfcGF0aCwgU0JfRklMRV9NQVhfUEFUSCk7Ci0gIHN0ZDo6c3RyaW5nIHV0Zjhfc3RyaW5nID0KLSAgICAgIHN0YXJib2FyZDo6c2hhcmVkOjp3aW4zMjo6d2NoYXJfdFRvVVRGOCh3X2ZpbGVfcGF0aCk7Ci0gIGlmICh1dGY4X3N0cmluZy5sZW5ndGgoKSA+PSBwYXRoX3NpemUpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIFNiU3RyaW5nQ29weShvdXRfcGF0aCwgdXRmOF9zdHJpbmcuY19zdHIoKSwgcGF0aF9zaXplKTsKLX0KLQotYm9vbCBHZXRSZWxhdGl2ZURpcmVjdG9yeShjb25zdCBjaGFyKiByZWxhdGl2ZV9wYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBvdXRfcGF0aCwgaW50IHBhdGhfc2l6ZSkgewotICBpZiAoIW91dF9wYXRoIHx8IChwYXRoX3NpemUgPD0gMCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgY2hhciBmaWxlX3BhdGhbU0JfRklMRV9NQVhfUEFUSF07Ci0gIGZpbGVfcGF0aFswXSA9ICdcMCc7Ci0gIGlmICghR2V0RXhlY3V0YWJsZURpcmVjdG9yeShmaWxlX3BhdGgsIHBhdGhfc2l6ZSkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKFNiU3RyaW5nQ29uY2F0KGZpbGVfcGF0aCwgcmVsYXRpdmVfcGF0aCwgU0JfRklMRV9NQVhfUEFUSCkgPj0KLSAgICAgIHBhdGhfc2l6ZSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmICghQ3JlYXRlRGlyZWN0b3J5SGllYXJjaHkoTm9ybWFsaXplV2luMzJQYXRoKGZpbGVfcGF0aCkpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiBTYlN0cmluZ0NvcHkob3V0X3BhdGgsIGZpbGVfcGF0aCwgcGF0aF9zaXplKTsKLX0KLQotLy8gUGxhY2VzIHVwIHRvIHxwYXRoX3NpemV8IC0gMSBjaGFyYWN0ZXJzIG9mIHRoZSBwYXRoIHRvIHRoZSBjb250ZW50IGRpcmVjdG9yeQotLy8gaW4gfG91dF9wYXRofCwgZW5zdXJpbmcgaXQgaXMgTlVMTC10ZXJtaW5hdGVkLiBSZXR1cm5zIHN1Y2Nlc3MKLS8vIHN0YXR1cy4gVGhlIHJlc3VsdCBiZWluZyBncmVhdGVyIHRoYW4gfHBhdGhfc2l6ZXwgLSAxIGNoYXJhY3RlcnMgaXMgYQotLy8gZmFpbHVyZS4gfG91dF9wYXRofCBtYXkgYmUgd3JpdHRlbiB0byBpbiB1bnN1Y2Nlc3NmdWwgY2FzZXMuCi1ib29sIEdldENvbnRlbnRQYXRoKGNoYXIqIG91dF9wYXRoLCBpbnQgcGF0aF9zaXplKSB7Ci0gIHJldHVybiBHZXRSZWxhdGl2ZURpcmVjdG9yeSgiXFxjb250ZW50XFxkYXRhIiwgb3V0X3BhdGgsIHBhdGhfc2l6ZSk7Ci19Ci0KLWJvb2wgR2V0Q2FjaGVQYXRoKGNoYXIqIG91dF9wYXRoLCBpbnQgcGF0aF9zaXplKSB7Ci0gIHJldHVybiBHZXRSZWxhdGl2ZURpcmVjdG9yeSgiXFxjb250ZW50XFxjYWNoZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfcGF0aCwgcGF0aF9zaXplKTsKLX0KLQotYm9vbCBDcmVhdGVBbmRHZXRUZW1wUGF0aChjaGFyKiBvdXRfcGF0aCwgaW50IHBhdGhfc2l6ZSkgewotICBpZiAoIW91dF9wYXRoIHx8IChwYXRoX3NpemUgPD0gMCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgd2NoYXJfdCB3X2ZpbGVfcGF0aFtTQl9GSUxFX01BWF9QQVRIXTsKLSAgd19maWxlX3BhdGhbMF0gPSBMJ1wwJzsKLQotICBpbnQ2NF90IGNoYXJhY3RlcnNfd3JpdHRlbiA9Ci0gICAgICBzdGF0aWNfY2FzdDxpbnQ+KEdldFRlbXBQYXRoVyhTQl9GSUxFX01BWF9QQVRILCB3X2ZpbGVfcGF0aCkpOwotICBpZiAoY2hhcmFjdGVyc193cml0dGVuID49IChwYXRoX3NpemUgKyAxKSB8fCBjaGFyYWN0ZXJzX3dyaXR0ZW4gPCAxKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIFJlbW92ZSB0aGUgbGFzdCBzbGFzaCwgdG8gbWF0Y2ggb3RoZXIgU3RhcmJvYXJkIGltcGxlbWVudGF0aW9ucy4KLSAgd19maWxlX3BhdGhbY2hhcmFjdGVyc193cml0dGVuIC0gMV0gPSBMJ1wwJzsKLQotICBzdGQ6OnN0cmluZyB1dGY4X3N0cmluZyA9Ci0gICAgICBzdGFyYm9hcmQ6OnNoYXJlZDo6d2luMzI6OndjaGFyX3RUb1VURjgod19maWxlX3BhdGgpOwotCi0gIGlmIChTYlN0cmluZ0NvcHkob3V0X3BhdGgsIHV0Zjhfc3RyaW5nLmNfc3RyKCksIHBhdGhfc2l6ZSkgPj0gcGF0aF9zaXplKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIFNiRGlyZWN0b3J5Q3JlYXRlKG91dF9wYXRoKTsKLQotICBzaXplX3QgbGVuZ3RoID0gU2JTdHJpbmdHZXRMZW5ndGgob3V0X3BhdGgpOwotICBpZiAobGVuZ3RoIDwgMSB8fCBsZW5ndGggPiBwYXRoX3NpemUpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBOb3RlOiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgbWluaW1hbGx5IGltcGxlbWVudGVkIHRvIGFsbG93IHRlc3RzIHRvIHJ1bi4KLWJvb2wgU2JTeXN0ZW1HZXRQYXRoKFNiU3lzdGVtUGF0aElkIHBhdGhfaWQsIGNoYXIqIG91dF9wYXRoLCBpbnQgcGF0aF9zaXplKSB7Ci0gIGlmICghb3V0X3BhdGggfHwgKHBhdGhfc2l6ZSA8PSAwKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHN3aXRjaCAocGF0aF9pZCkgewotICAgIGNhc2Uga1NiU3lzdGVtUGF0aENvbnRlbnREaXJlY3Rvcnk6Ci0gICAgICByZXR1cm4gR2V0Q29udGVudFBhdGgob3V0X3BhdGgsIHBhdGhfc2l6ZSk7Ci0gICAgY2FzZSBrU2JTeXN0ZW1QYXRoRGVidWdPdXRwdXREaXJlY3Rvcnk6Ci0gICAgICByZXR1cm4gU2JTeXN0ZW1HZXRQYXRoKGtTYlN5c3RlbVBhdGhUZW1wRGlyZWN0b3J5LCBvdXRfcGF0aCwgcGF0aF9zaXplKTsKLSAgICBjYXNlIGtTYlN5c3RlbVBhdGhFeGVjdXRhYmxlRmlsZToKLSAgICAgIHJldHVybiBHZXRFeGVjdXRhYmxlUGF0aChvdXRfcGF0aCwgcGF0aF9zaXplKTsKLSAgICBjYXNlIGtTYlN5c3RlbVBhdGhUZW1wRGlyZWN0b3J5OgotICAgICAgcmV0dXJuIENyZWF0ZUFuZEdldFRlbXBQYXRoKG91dF9wYXRoLCBwYXRoX3NpemUpOwotICAgIGNhc2Uga1NiU3lzdGVtUGF0aENhY2hlRGlyZWN0b3J5OgotICAgICAgcmV0dXJuIEdldENhY2hlUGF0aChvdXRfcGF0aCwgcGF0aF9zaXplKTsKLSAgICBjYXNlIGtTYlN5c3RlbVBhdGhGb250Q29uZmlndXJhdGlvbkRpcmVjdG9yeToKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBjYXNlIGtTYlN5c3RlbVBhdGhGb250RGlyZWN0b3J5OgotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIC8vIFRPRE86IGltcGxlbWVudCBhbGwgdGhlIG90aGVyIGNhc2VzLgotICAgIGRlZmF1bHQ6Ci0gICAgICBTQl9OT1RJTVBMRU1FTlRFRCgpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3dpbi93aW4zMi9hdG9taWNfcHVibGljLmggYi9zcmMvc3RhcmJvYXJkL3dpbi93aW4zMi9hdG9taWNfcHVibGljLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZWFlZGYuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC93aW4vd2luMzIvYXRvbWljX3B1YmxpYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBTVEFSQk9BUkRfV0lOX1dJTjMyX0FUT01JQ19QVUJMSUNfSF8KLSNkZWZpbmUgU1RBUkJPQVJEX1dJTl9XSU4zMl9BVE9NSUNfUFVCTElDX0hfCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3dpbjMyL2F0b21pY19wdWJsaWMuaCIKLQotI2VuZGlmICAvLyBTVEFSQk9BUkRfV0lOX1dJTjMyX0FUT01JQ19QVUJMSUNfSF8KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvd2luL3dpbjMyL2NvbmZpZ3VyYXRpb25fcHVibGljLmggYi9zcmMvc3RhcmJvYXJkL3dpbi93aW4zMi9jb25maWd1cmF0aW9uX3B1YmxpYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWVkOWMxLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvd2luL3dpbjMyL2NvbmZpZ3VyYXRpb25fcHVibGljLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0vLyBPdGhlciBzb3VyY2UgZmlsZXMgc2hvdWxkIG5ldmVyIGluY2x1ZGUgdGhpcyBoZWFkZXIgZGlyZWN0bHksIGJ1dCBzaG91bGQKLS8vIGluY2x1ZGUgdGhlIGdlbmVyaWMgInN0YXJib2FyZC9jb25maWd1cmF0aW9uLmgiIGluc3RlYWQuCi0KLSNpZm5kZWYgU1RBUkJPQVJEX1dJTl9XSU4zMl9DT05GSUdVUkFUSU9OX1BVQkxJQ19IXwotI2RlZmluZSBTVEFSQk9BUkRfV0lOX1dJTjMyX0NPTkZJR1VSQVRJT05fUFVCTElDX0hfCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvd2luL3NoYXJlZC9jb25maWd1cmF0aW9uX3B1YmxpYy5oIgotCi0jZW5kaWYgIC8vIFNUQVJCT0FSRF9XSU5fV0lOMzJfQ09ORklHVVJBVElPTl9QVUJMSUNfSF8KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvd2luL3dpbjMyL2d5cF9jb25maWd1cmF0aW9uLmd5cGkgYi9zcmMvc3RhcmJvYXJkL3dpbi93aW4zMi9neXBfY29uZmlndXJhdGlvbi5neXBpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTg5MDk1Li4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvd2luL3dpbjMyL2d5cF9jb25maWd1cmF0aW9uLmd5cGkKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0jIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXsKLSAgJ3ZhcmlhYmxlcyc6IHsKLSAgICAnYW5nbGVfYnVpbGRfd2lucnQnOiAwLAotICAgICd3aW5ydCc6IDAsCi0gICAgJ2VuYWJsZV9kM2QxMV9mZWF0dXJlX2xldmVsXzExJzogMSwKLSAgICAnYW5nbGVfcGxhdGZvcm1fd2luZG93cyc6IDEsCi0gIH0sCi0gICdpbmNsdWRlcyc6IFsKLSAgICAnLi4vc2hhcmVkL2d5cF9jb25maWd1cmF0aW9uLmd5cGknLAotICBdLAotICAndGFyZ2V0X2RlZmF1bHRzJzogewotICAgICdkZWZhdWx0X2NvbmZpZ3VyYXRpb24nOiAnd2luMzJfZGVidWcnLAotICAgICdjb25maWd1cmF0aW9ucyc6IHsKLSAgICAgICd3aW4td2luMzJfZGVidWcnOiB7Ci0gICAgICAgICdpbmhlcml0X2Zyb20nOiBbJ3dpbjMyX2Jhc2UnLCAnbXN2c19kZWJ1ZyddLAotICAgICAgfSwKLSAgICAgICd3aW4td2luMzJfZGV2ZWwnOiB7Ci0gICAgICAgJ2luaGVyaXRfZnJvbSc6IFsnd2luMzJfYmFzZScsICdtc3ZzX2RldmVsJ10sCi0gICAgICB9LAotICAgICAgJ3dpbi13aW4zMl9xYSc6IHsKLSAgICAgICAgJ2luaGVyaXRfZnJvbSc6IFsnd2luMzJfYmFzZScsICdtc3ZzX3FhJ10sCi0gICAgICB9LAotICAgICAgJ3dpbi13aW4zMl9nb2xkJzogewotICAgICAgICAnaW5oZXJpdF9mcm9tJzogWyd3aW4zMl9iYXNlJywgJ21zdnNfZ29sZCddLAotICAgICAgfSwKLSAgICB9LCAgIyBlbmQgb2YgY29uZmlndXJhdGlvbnMKLSAgfSwKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvd2luL3dpbjMyL2d5cF9jb25maWd1cmF0aW9uLnB5IGIvc3JjL3N0YXJib2FyZC93aW4vd2luMzIvZ3lwX2NvbmZpZ3VyYXRpb24ucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlM2Y4OWQuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC93aW4vd2luMzIvZ3lwX2NvbmZpZ3VyYXRpb24ucHkKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0jIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0iIiJTdGFyYm9hcmQgd2luLXdpbjMyIHBsYXRmb3JtIGNvbmZpZ3VyYXRpb24gZm9yIGd5cF9jb2JhbHQuIiIiCi0KLWZyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KLQotaW1wb3J0IGltcAotaW1wb3J0IGxvZ2dpbmcKLWltcG9ydCBvcwotaW1wb3J0IHN5cwotCi0jIEltcG9ydCB0aGUgc2hhcmVkIHdpbiBwbGF0Zm9ybSBjb25maWd1cmF0aW9uLgotc3lzLnBhdGguYXBwZW5kKAotICAgIG9zLnBhdGgucmVhbHBhdGgoCi0gICAgICAgIG9zLnBhdGguam9pbigKLSAgICAgICAgICAgIG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksIG9zLnBhcmRpciwgb3MucGFyZGlyLCAnc2hhcmVkJywKLSAgICAgICAgICAgICd3aW4zMicpKSkKLWltcG9ydCBneXBfY29uZmlndXJhdGlvbgotCi0KLWRlZiBDcmVhdGVQbGF0Zm9ybUNvbmZpZygpOgotICB0cnk6Ci0gICAgd2luX2xpYl9jb25maWcgPSBXaW5XaW4zMlBsYXRmb3JtQ29uZmlnKCd3aW4td2luMzInKQotICAgIHJldHVybiB3aW5fbGliX2NvbmZpZwotICBleGNlcHQgUnVudGltZUVycm9yIGFzIGU6Ci0gICAgbG9nZ2luZy5jcml0aWNhbChlKQotICAgIHJldHVybiBOb25lCi0KLQotY2xhc3MgV2luV2luMzJQbGF0Zm9ybUNvbmZpZyhneXBfY29uZmlndXJhdGlvbi5XaW4zMkNvbmZpZ3VyYXRpb24pOgotICAiIiJTdGFyYm9hcmQgd2luLTMyIHBsYXRmb3JtIGNvbmZpZ3VyYXRpb24uIiIiCi0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIHBsYXRmb3JtKToKLSAgICBzdXBlcihXaW5XaW4zMlBsYXRmb3JtQ29uZmlnLCBzZWxmKS5fX2luaXRfXyhwbGF0Zm9ybSkKLQotICBkZWYgR2V0TGF1bmNoZXIoc2VsZik6Ci0gICAgIiIiR2V0cyB0aGUgbW9kdWxlIHVzZWQgdG8gbGF1bmNoIGFwcGxpY2F0aW9ucyBvbiB0aGlzIHBsYXRmb3JtLiIiIgotICAgIG1vZHVsZV9wYXRoID0gb3MucGF0aC5hYnNwYXRoKAotICAgICAgICBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgJ2xhdW5jaGVyLnB5JykpCi0KLSAgICBsYXVuY2hlcl9tb2R1bGUgPSBpbXAubG9hZF9zb3VyY2UoJ2xhdW5jaGVyJywgbW9kdWxlX3BhdGgpCi0gICAgcmV0dXJuIGxhdW5jaGVyX21vZHVsZQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC93aW4vd2luMzIvbGF1bmNoZXIucHkgYi9zcmMvc3RhcmJvYXJkL3dpbi93aW4zMi9sYXVuY2hlci5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI4Mjg0ZS4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3dpbi93aW4zMi9sYXVuY2hlci5weQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLSMhL3Vzci9iaW4vcHl0aG9uCi0jIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0iIiJTdGFyYm9hcmQgd2luLXdpbjMyIHBsYXRmb3JtIGNvbmZpZ3VyYXRpb24gZm9yIGd5cF9jb2JhbHQuIiIiCi0KLQotZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgotCi1pbXBvcnQgb3MKLWltcG9ydCBzdWJwcm9jZXNzCi1pbXBvcnQgc3lzCi1pbXBvcnQgdHJhY2ViYWNrCi0KLWltcG9ydCBzdGFyYm9hcmQudG9vbHMuYWJzdHJhY3RfbGF1bmNoZXIgYXMgYWJzdHJhY3RfbGF1bmNoZXIKLQotY2xhc3MgTGF1bmNoZXIoYWJzdHJhY3RfbGF1bmNoZXIuQWJzdHJhY3RMYXVuY2hlcik6Ci0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIHBsYXRmb3JtLCB0YXJnZXRfbmFtZSwgY29uZmlnLCBkZXZpY2VfaWQsICoqa3dhcmdzKToKLSAgICBzdXBlcihMYXVuY2hlciwgc2VsZikuX19pbml0X18ocGxhdGZvcm0sIHRhcmdldF9uYW1lLCBjb25maWcsIGRldmljZV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiprd2FyZ3MpCi0gICAgc2VsZi5leGVjdXRhYmxlID0gc2VsZi5HZXRUYXJnZXRQYXRoKCkKLQotICBkZWYgUnVuKHNlbGYpOgotICAgIHN5cy5zdGRlcnIud3JpdGUoJ1xuKioqUnVubmluZyBMYXVuY2hlcioqKlxuJykKLSAgICAiIiJSdW5zIGxhdW5jaGVyJ3MgZXhlY3V0YWJsZS4iIiIKLSAgICBzZWxmLnByb2MgPSBzdWJwcm9jZXNzLlBvcGVuKAotICAgICAgICBbc2VsZi5leGVjdXRhYmxlXSArIHNlbGYudGFyZ2V0X2NvbW1hbmRfbGluZV9wYXJhbXMsCi0gICAgICAgIHN0ZG91dD1zZWxmLm91dHB1dF9maWxlLAotICAgICAgICBzdGRlcnI9c2VsZi5vdXRwdXRfZmlsZSkKLSAgICBzZWxmLnBpZCA9IHNlbGYucHJvYy5waWQKLSAgICBzZWxmLnByb2MuY29tbXVuaWNhdGUoKQotICAgIHNlbGYucHJvYy5wb2xsKCkKLSAgICByZXR1cm4gc2VsZi5wcm9jLnJldHVybmNvZGUKLQotICBkZWYgS2lsbChzZWxmKToKLSAgICBzeXMuc3RkZXJyLndyaXRlKCJcbioqKktpbGxpbmcgTGF1bmNoZXIqKipcbiIpCi0gICAgaWYgc2VsZi5waWQ6Ci0gICAgICB0cnk6Ci0gICAgICAgIHNlbGYucHJvYy5raWxsKCkKLSAgICAgIGV4Y2VwdCBPU0Vycm9yOgotICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJFcnJvciBraWxsaW5nIGxhdW5jaGVyIHdpdGggU0lHS0lMTDpcbiIpCi0gICAgICAgIHRyYWNlYmFjay5wcmludF9leGMoZmlsZT1zeXMuc3RkZXJyKQotICAgICAgICAjIElmIGZvciBzb21lIHJlYXNvbiBLaWxsKCkgZmFpbHMgdGhlbiBvc18uZXhpdCgxKSB3aWxsIGtpbGwgdGhlCi0gICAgICAgICMgY2hpbGQgcHJvY2VzcyB3aXRob3V0IGNsZWFudXAuIE90aGVyd2lzZSB0aGUgcHJvY2VzcyB3aWxsIGhhbmcuCi0gICAgICAgIG9zLl9leGl0KDEpCi0gICAgZWxzZToKLSAgICAgIHN5cy5zdGRlcnIud3JpdGUoIktpbGwoKSBjYWxsZWQgYmVmb3JlIFJ1bigpLCBjYW5ub3Qga2lsbC5cbiIpCi0KLSAgICByZXR1cm4KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvd2luL3dpbjMyL2xpYi9hdG9taWNfcHVibGljLmggYi9zcmMvc3RhcmJvYXJkL3dpbi93aW4zMi9saWIvYXRvbWljX3B1YmxpYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODVmYjEyLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvd2luL3dpbjMyL2xpYi9hdG9taWNfcHVibGljLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaWZuZGVmIFNUQVJCT0FSRF9XSU5fV0lOMzJfTElCX0FUT01JQ19QVUJMSUNfSF8KLSNkZWZpbmUgU1RBUkJPQVJEX1dJTl9XSU4zMl9MSUJfQVRPTUlDX1BVQkxJQ19IXwotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9hdG9taWNfcHVibGljLmgiCi0KLSNlbmRpZiAgLy8gU1RBUkJPQVJEX1dJTl9XSU4zMl9MSUJfQVRPTUlDX1BVQkxJQ19IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC93aW4vd2luMzIvbGliL2NvbmZpZ3VyYXRpb25fcHVibGljLmggYi9zcmMvc3RhcmJvYXJkL3dpbi93aW4zMi9saWIvY29uZmlndXJhdGlvbl9wdWJsaWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI1ZjhiMS4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3dpbi93aW4zMi9saWIvY29uZmlndXJhdGlvbl9wdWJsaWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLS8vIE90aGVyIHNvdXJjZSBmaWxlcyBzaG91bGQgbmV2ZXIgaW5jbHVkZSB0aGlzIGhlYWRlciBkaXJlY3RseSwgYnV0IHNob3VsZAotLy8gaW5jbHVkZSB0aGUgZ2VuZXJpYyAic3RhcmJvYXJkL2NvbmZpZ3VyYXRpb24uaCIgaW5zdGVhZC4KLQotI2lmbmRlZiBTVEFSQk9BUkRfV0lOX1dJTjMyX0xJQl9DT05GSUdVUkFUSU9OX1BVQkxJQ19IXwotI2RlZmluZSBTVEFSQk9BUkRfV0lOX1dJTjMyX0xJQl9DT05GSUdVUkFUSU9OX1BVQkxJQ19IXwotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3dpbi9zaGFyZWQvY29uZmlndXJhdGlvbl9wdWJsaWMuaCIKLQotI2VuZGlmICAvLyBTVEFSQk9BUkRfV0lOX1dJTjMyX0xJQl9DT05GSUdVUkFUSU9OX1BVQkxJQ19IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC93aW4vd2luMzIvbGliL2d5cF9jb25maWd1cmF0aW9uLmd5cGkgYi9zcmMvc3RhcmJvYXJkL3dpbi93aW4zMi9saWIvZ3lwX2NvbmZpZ3VyYXRpb24uZ3lwaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVkYmQzYi4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3dpbi93aW4zMi9saWIvZ3lwX2NvbmZpZ3VyYXRpb24uZ3lwaQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSMgQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotewotICAndmFyaWFibGVzJzogewotICAgICMgVE9ETzogSW4gdGhlb3J5LCB0aGVyZSBhcmUgdG9vbHMgdGhhdCBjYW4gY29tYmluZSBzdGF0aWMgbGlicmFyaWVzIGludG8KLSAgICAjIHRoaWNrIHN0YXRpYyBsaWJyYXJpZXMgd2l0aCBhbGwgdGhlaXIgdHJhbnNpdGl2ZSBkZXBlbmRlbmNpZXMuIFVzaW5nCi0gICAgIyBzaGFyZWRfbGlicmFyeSBoZXJlIGNhbiBoYXZlIHVuZXhwZWN0ZWQgY29uc2VxdWVuY2VzLiBFeHBsb3JlIGJ1aWxkaW5nCi0gICAgIyB0aGlzIGludG8gYSB0aGljayBzdGF0aWMgbGlicmFyeSBpbnN0ZWFkLgotICAgICdmaW5hbF9leGVjdXRhYmxlX3R5cGUnOiAnc2hhcmVkX2xpYnJhcnknLAotICAgICdkZWZhdWx0X3JlbmRlcmVyX29wdGlvbnNfZGVwZW5kZW5jeSc6ICc8KERFUFRIKS9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9saWIvbGliLmd5cDpleHRlcm5hbF9yYXN0ZXJpemVyJywKLSAgICAnc2JfZW5hYmxlX2xpYic6IDEsCi0KLSAgICAjIFdlIHR1cm4gb2ZmIFYtU3luYyBhbmQgdGhyb3R0bGluZyBpbiBDb2JhbHQgc28gd2UgY2FuIGxldCB0aGUgY2xpZW50Ci0gICAgIyBkZWNpZGUgaWYgdGhleSB3YW50IHRob3NlIGZlYXR1cmVzLgotICAgICdjb2JhbHRfZWdsX3N3YXBfaW50ZXJ2YWwnOiAwLAotICAgICdjb2JhbHRfbWluaW11bV9mcmFtZV90aW1lX2luX21pbGxpc2Vjb25kcyc6IDAsCi0KLSAgICAnZW5hYmxlX21hcF90b19tZXNoJzogMSwKLSAgICAnYW5nbGVfYnVpbGRfd2lucnQnOiAwLAotICAgICd3aW5ydCc6IDAsCi0gICAgJ2VuYWJsZV9kM2QxMV9mZWF0dXJlX2xldmVsXzExJzogMSwKLSAgICAnY29iYWx0X3VzZXJfb25fZXhpdF9zdHJhdGVneSc6ICdub2V4aXQnLAotICB9LAotICAnaW5jbHVkZXMnOiBbCi0gICAgJy4uLy4uL3NoYXJlZC9neXBfY29uZmlndXJhdGlvbi5neXBpJywKLSAgXSwKLSAgJ3RhcmdldF9kZWZhdWx0cyc6IHsKLSAgICAnZGVmYXVsdF9jb25maWd1cmF0aW9uJzogJ3dpbi13aW4zMi1saWJfZGVidWcnLAotICAgICdjb25maWd1cmF0aW9ucyc6IHsKLQotICAgICAgJ3dpbi13aW4zMi1saWJfZGVidWcnOiB7Ci0gICAgICAgICdpbmhlcml0X2Zyb20nOiBbJ3dpbjMyX2Jhc2UnLCAnbXN2c19kZWJ1ZyddLAotICAgICAgfSwKLSAgICAgICd3aW4td2luMzItbGliX2RldmVsJzogewotICAgICAgICdpbmhlcml0X2Zyb20nOiBbJ3dpbjMyX2Jhc2UnLCAnbXN2c19kZXZlbCddLAotICAgICAgfSwKLSAgICAgICd3aW4td2luMzItbGliX3FhJzogewotICAgICAgICAnaW5oZXJpdF9mcm9tJzogWyd3aW4zMl9iYXNlJywgJ21zdnNfcWEnXSwKLSAgICAgIH0sCi0gICAgICAnd2luLXdpbjMyLWxpYl9nb2xkJzogewotICAgICAgICAnaW5oZXJpdF9mcm9tJzogWyd3aW4zMl9iYXNlJywgJ21zdnNfZ29sZCddLAotICAgICAgfSwKLSAgICB9LCAgIyBlbmQgb2YgY29uZmlndXJhdGlvbnMKLSAgfSwKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvd2luL3dpbjMyL2xpYi9neXBfY29uZmlndXJhdGlvbi5weSBiL3NyYy9zdGFyYm9hcmQvd2luL3dpbjMyL2xpYi9neXBfY29uZmlndXJhdGlvbi5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZjZmZhYS4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3dpbi93aW4zMi9saWIvZ3lwX2NvbmZpZ3VyYXRpb24ucHkKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0iIiJTdGFyYm9hcmQgd2luLXdpbjMyLWxpYiBwbGF0Zm9ybSBjb25maWd1cmF0aW9uIGZvciBneXBfY29iYWx0LiIiIgotCi1pbXBvcnQgbG9nZ2luZwotaW1wb3J0IG9zCi1pbXBvcnQgc3lzCi0KLSMgSW1wb3J0IHRoZSBzaGFyZWQgd2luIHBsYXRmb3JtIGNvbmZpZ3VyYXRpb24uCi1zeXMucGF0aC5hcHBlbmQoCi0gICAgb3MucGF0aC5yZWFscGF0aCgKLSAgICAgICAgb3MucGF0aC5qb2luKAotICAgICAgICAgICAgb3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgb3MucGFyZGlyLCBvcy5wYXJkaXIsIG9zLnBhcmRpciwKLSAgICAgICAgICAgICdzaGFyZWQnLCAnd2luMzInKSkpCi1pbXBvcnQgZ3lwX2NvbmZpZ3VyYXRpb24KLQotCi1kZWYgQ3JlYXRlUGxhdGZvcm1Db25maWcoKToKLSAgdHJ5OgotICAgIHJldHVybiBneXBfY29uZmlndXJhdGlvbi5XaW4zMkNvbmZpZ3VyYXRpb24oJ3dpbi13aW4zMi1saWInKQotICBleGNlcHQgUnVudGltZUVycm9yIGFzIGU6Ci0gICAgbG9nZ2luZy5jcml0aWNhbChlKQotICAgIHJldHVybiBOb25lCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3dpbi93aW4zMi9saWIvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cCBiL3NyYy9zdGFyYm9hcmQvd2luL3dpbjMyL2xpYi9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjA2M2JiLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvd2luL3dpbjMyL2xpYi9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotewotICAnaW5jbHVkZXMnOiBbCi0gICAgJy4uL3N0YXJib2FyZF9wbGF0Zm9ybS5neXBpJywKLSAgXSwKLSAgJ3ZhcmlhYmxlcyc6IHsKLSAgICAnc3RhcmJvYXJkX3BsYXRmb3JtX2RlcGVuZGVudF9maWxlcyc6IFsKLSAgICAgICc8QChiYXNlX3dpbjMyX3N0YXJib2FyZF9wbGF0Zm9ybV9kZXBlbmRlbnRfZmlsZXMpJywKLSAgICAgICc8QCh3aW4zMl9tZWRpYV9wbGF5ZXJfZmlsZXMpJywKLSAgICAgICc8QCh3aW4zMl9zaGFyZWRfZHJtX2ZpbGVzKScsCi0gICAgICAnPEAod2luMzJfc2hhcmVkX21lZGlhX3BsYXllcl9maWxlcyknLAotICAgIF0KLSAgfSwKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvd2luL3dpbjMyL2xpYi9zdGFyYm9hcmRfcGxhdGZvcm1fdGVzdHMuZ3lwIGIvc3JjL3N0YXJib2FyZC93aW4vd2luMzIvbGliL3N0YXJib2FyZF9wbGF0Zm9ybV90ZXN0cy5neXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZmM0MGUuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC93aW4vd2luMzIvbGliL3N0YXJib2FyZF9wbGF0Zm9ybV90ZXN0cy5neXAKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi17Ci0gICd2YXJpYWJsZXMnOiB7Ci0gICAgJ3NiX3BlZGFudGljX3dhcm5pbmdzJzogMSwKLSAgfSwKLSAgJ3RhcmdldHMnOiBbCi0gICAgewotICAgICAgJ3RhcmdldF9uYW1lJzogJ3N0YXJib2FyZF9wbGF0Zm9ybV90ZXN0cycsCi0gICAgICAndHlwZSc6ICc8KGd0ZXN0X3RhcmdldF90eXBlKScsCi0gICAgICAnc291cmNlcyc6IFsKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9jb21tb24vdGVzdF9tYWluLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL21lZGlhL21pbWVfdHlwZV90ZXN0LmNjJywKLSAgICAgIF0sCi0gICAgICAnZGVwZW5kZW5jaWVzJzogWwotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3N0YXJib2FyZC5neXA6c3RhcmJvYXJkJywKLSAgICAgICAgJzwoREVQVEgpL3Rlc3RpbmcvZ21vY2suZ3lwOmdtb2NrJywKLSAgICAgICAgJzwoREVQVEgpL3Rlc3RpbmcvZ3Rlc3QuZ3lwOmd0ZXN0JywKLSAgICAgIF0sCi0gICAgfSwKLSAgICB7Ci0gICAgICAndGFyZ2V0X25hbWUnOiAnc3RhcmJvYXJkX3BsYXRmb3JtX3Rlc3RzX2RlcGxveScsCi0gICAgICAndHlwZSc6ICdub25lJywKLSAgICAgICdkZXBlbmRlbmNpZXMnOiBbCi0gICAgICAgICc8KERFUFRIKS88KHN0YXJib2FyZF9wYXRoKS9zdGFyYm9hcmRfcGxhdGZvcm1fdGVzdHMuZ3lwOnN0YXJib2FyZF9wbGF0Zm9ybV90ZXN0cycsCi0gICAgICBdLAotICAgICAgJ3ZhcmlhYmxlcyc6IHsKLSAgICAgICAgJ2V4ZWN1dGFibGVfbmFtZSc6ICdzdGFyYm9hcmRfcGxhdGZvcm1fdGVzdHMnLAotICAgICAgfSwKLSAgICAgICdpbmNsdWRlcyc6IFsgJzwoREVQVEgpL3N0YXJib2FyZC9idWlsZC9kZXBsb3kuZ3lwaScgXSwKLSAgICB9LAotICBdLAotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC93aW4vd2luMzIvbGliL3RocmVhZF90eXBlc19wdWJsaWMuaCBiL3NyYy9zdGFyYm9hcmQvd2luL3dpbjMyL2xpYi90aHJlYWRfdHlwZXNfcHVibGljLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkYzYyMjEuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC93aW4vd2luMzIvbGliL3RocmVhZF90eXBlc19wdWJsaWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLS8vIEluY2x1ZGVzIHRocmVhZGluZyBwcmltaXRpdmUgdHlwZXMgYW5kIGluaXRpYWxpemVycy4KLQotI2lmbmRlZiBTVEFSQk9BUkRfV0lOX1dJTjMyX0xJQl9USFJFQURfVFlQRVNfUFVCTElDX0hfCi0jZGVmaW5lIFNUQVJCT0FSRF9XSU5fV0lOMzJfTElCX1RIUkVBRF9UWVBFU19QVUJMSUNfSF8KLQotI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvd2luMzIvdGhyZWFkX3R5cGVzX3B1YmxpYy5oIgotCi0jZW5kaWYgIC8vIFNUQVJCT0FSRF9XSU5fV0lOMzJfTElCX1RIUkVBRF9UWVBFU19QVUJMSUNfSF8KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvd2luL3dpbjMyL21haW4uY2MgYi9zcmMvc3RhcmJvYXJkL3dpbi93aW4zMi9tYWluLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDNlZjRkLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvd2luL3dpbjMyL21haW4uY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi9zdGFyYm9hcmRfbWFpbi5oIgotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKLSAgU3RhcmJvYXJkTWFpbihhcmdjLCBhcmd2KTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvd2luL3dpbjMyL3N0YXJib2FyZF9wbGF0Zm9ybS5neXAgYi9zcmMvc3RhcmJvYXJkL3dpbi93aW4zMi9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmZkYTVjLi4wMDAwMDAwCi0tLSBhL3NyYy9zdGFyYm9hcmQvd2luL3dpbjMyL3N0YXJib2FyZF9wbGF0Zm9ybS5neXAKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi17Ci0gICdpbmNsdWRlcyc6IFsKLSAgICAnc3RhcmJvYXJkX3BsYXRmb3JtLmd5cGknLAotICBdLAotICAndmFyaWFibGVzJzogewotICAgICdzdGFyYm9hcmRfcGxhdGZvcm1fZGVwZW5kZW50X2ZpbGVzJzogWwotICAgICAgJ21haW4uY2MnLAotICAgICAgJzxAKGJhc2Vfd2luMzJfc3RhcmJvYXJkX3BsYXRmb3JtX2RlcGVuZGVudF9maWxlcyknLAotICAgIF0KLSAgfSwKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvd2luL3dpbjMyL3N0YXJib2FyZF9wbGF0Zm9ybS5neXBpIGIvc3JjL3N0YXJib2FyZC93aW4vd2luMzIvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YmJkNmIuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC93aW4vd2luMzIvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cGkKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0jIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi17Ci0gICdpbmNsdWRlcyc6IFsKLSAgICAnLi4vc2hhcmVkL3N0YXJib2FyZF9wbGF0Zm9ybS5neXBpJywKLSAgXSwKLSAgJ3ZhcmlhYmxlcyc6IHsKLSAgICAnYmFzZV93aW4zMl9zdGFyYm9hcmRfcGxhdGZvcm1fZGVwZW5kZW50X2ZpbGVzJzogWwotICAgICAgJ2F0b21pY19wdWJsaWMuaCcsCi0gICAgICAnY29uZmlndXJhdGlvbl9wdWJsaWMuaCcsCi0gICAgICAndGhyZWFkX3R5cGVzX3B1YmxpYy5oJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9sb2NhbGl6ZWRfc3RyaW5ncy5jYycsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvbWVkaWEvbWVkaWFfZ2V0X2F1ZGlvX2NvbmZpZ3VyYXRpb25fc3RlcmVvX29ubHkuY2MnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3F1ZXVlX2FwcGxpY2F0aW9uLmNjJywKLSAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9zeXN0ZW1fcmVxdWVzdF9wYXVzZS5jYycsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvc3lzdGVtX3JlcXVlc3Rfc3RvcC5jYycsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvc3lzdGVtX3JlcXVlc3Rfc3VzcGVuZC5jYycsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvc3lzdGVtX3JlcXVlc3RfdW5wYXVzZS5jYycsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvc3lzdGVtX3N1cHBvcnRzX3Jlc3VtZS5jYycsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL21lZGlhX2lzX291dHB1dF9wcm90ZWN0ZWQuY2MnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9tZWRpYV9zZXRfb3V0cHV0X3Byb3RlY3Rpb24uY2MnLAotICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC93aW4vc2hhcmVkL3N5c3RlbV9nZXRfcGF0aC5jYycsCi0gICAgICAnPEAodXdwX2luY29tcGF0aWJsZV93aW4zMiknLAotICAgIF0sCi0gIH0sCi19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3dpbi93aW4zMi9zdGFyYm9hcmRfcGxhdGZvcm1fdGVzdHMuZ3lwIGIvc3JjL3N0YXJib2FyZC93aW4vd2luMzIvc3RhcmJvYXJkX3BsYXRmb3JtX3Rlc3RzLmd5cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZmYzQwZS4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3dpbi93aW4zMi9zdGFyYm9hcmRfcGxhdGZvcm1fdGVzdHMuZ3lwCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotIyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotewotICAndmFyaWFibGVzJzogewotICAgICdzYl9wZWRhbnRpY193YXJuaW5ncyc6IDEsCi0gIH0sCi0gICd0YXJnZXRzJzogWwotICAgIHsKLSAgICAgICd0YXJnZXRfbmFtZSc6ICdzdGFyYm9hcmRfcGxhdGZvcm1fdGVzdHMnLAotICAgICAgJ3R5cGUnOiAnPChndGVzdF90YXJnZXRfdHlwZSknLAotICAgICAgJ3NvdXJjZXMnOiBbCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvY29tbW9uL3Rlc3RfbWFpbi5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9tZWRpYS9taW1lX3R5cGVfdGVzdC5jYycsCi0gICAgICBdLAotICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zdGFyYm9hcmQuZ3lwOnN0YXJib2FyZCcsCi0gICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2dtb2NrLmd5cDpnbW9jaycsCi0gICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2d0ZXN0Lmd5cDpndGVzdCcsCi0gICAgICBdLAotICAgIH0sCi0gICAgewotICAgICAgJ3RhcmdldF9uYW1lJzogJ3N0YXJib2FyZF9wbGF0Zm9ybV90ZXN0c19kZXBsb3knLAotICAgICAgJ3R5cGUnOiAnbm9uZScsCi0gICAgICAnZGVwZW5kZW5jaWVzJzogWwotICAgICAgICAnPChERVBUSCkvPChzdGFyYm9hcmRfcGF0aCkvc3RhcmJvYXJkX3BsYXRmb3JtX3Rlc3RzLmd5cDpzdGFyYm9hcmRfcGxhdGZvcm1fdGVzdHMnLAotICAgICAgXSwKLSAgICAgICd2YXJpYWJsZXMnOiB7Ci0gICAgICAgICdleGVjdXRhYmxlX25hbWUnOiAnc3RhcmJvYXJkX3BsYXRmb3JtX3Rlc3RzJywKLSAgICAgIH0sCi0gICAgICAnaW5jbHVkZXMnOiBbICc8KERFUFRIKS9zdGFyYm9hcmQvYnVpbGQvZGVwbG95Lmd5cGknIF0sCi0gICAgfSwKLSAgXSwKLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvd2luL3dpbjMyL3RocmVhZF90eXBlc19wdWJsaWMuaCBiL3NyYy9zdGFyYm9hcmQvd2luL3dpbjMyL3RocmVhZF90eXBlc19wdWJsaWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVlMDUzYi4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3dpbi93aW4zMi90aHJlYWRfdHlwZXNfcHVibGljLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0vLyBJbmNsdWRlcyB0aHJlYWRpbmcgcHJpbWl0aXZlIHR5cGVzIGFuZCBpbml0aWFsaXplcnMuCi0KLSNpZm5kZWYgU1RBUkJPQVJEX1dJTl9XSU4zMl9USFJFQURfVFlQRVNfUFVCTElDX0hfCi0jZGVmaW5lIFNUQVJCT0FSRF9XSU5fV0lOMzJfVEhSRUFEX1RZUEVTX1BVQkxJQ19IXwotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC93aW4zMi90aHJlYWRfdHlwZXNfcHVibGljLmgiCi0KLSNlbmRpZiAgLy8gU1RBUkJPQVJEX1dJTl9XSU4zMl9USFJFQURfVFlQRVNfUFVCTElDX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYW5nbGUvc3JjL2xpYkFOR0xFL3JlbmRlcmVyL2QzZC9kM2QxMS93aW5ydC9Db3JlV2luZG93TmF0aXZlV2luZG93LmNwcCBiL3NyYy90aGlyZF9wYXJ0eS9hbmdsZS9zcmMvbGliQU5HTEUvcmVuZGVyZXIvZDNkL2QzZDExL3dpbnJ0L0NvcmVXaW5kb3dOYXRpdmVXaW5kb3cuY3BwCmluZGV4IDMyZDU2NzYuLjVkN2JlZmYgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9hbmdsZS9zcmMvbGliQU5HTEUvcmVuZGVyZXIvZDNkL2QzZDExL3dpbnJ0L0NvcmVXaW5kb3dOYXRpdmVXaW5kb3cuY3BwCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9hbmdsZS9zcmMvbGliQU5HTEUvcmVuZGVyZXIvZDNkL2QzZDExL3dpbnJ0L0NvcmVXaW5kb3dOYXRpdmVXaW5kb3cuY3BwCkBAIC0xOTEsNiArMTkxLDEzIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBDb21QdHI8SURYR0lEZXZpY2UxPiBwRFhHSURldmljZTsKKyAgICByZXN1bHQgPSBkZXZpY2UtPlF1ZXJ5SW50ZXJmYWNlKF9fdXVpZG9mKElEWEdJRGV2aWNlMSksICh2b2lkICoqKXBEWEdJRGV2aWNlLkdldEFkZHJlc3NPZigpKTsKKyAgICBpZiAoU1VDQ0VFREVEKHJlc3VsdCkpCisgICAgeworICAgICAgcERYR0lEZXZpY2UtPlNldE1heGltdW1GcmFtZUxhdGVuY3koc3dhcENoYWluRGVzYy5CdWZmZXJDb3VudCk7CisgICAgfQorCiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JsaW5rL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvYmluZGluZ3MvYmluZGluZ3NfdGVzdHMucHkgYi9zcmMvdGhpcmRfcGFydHkvYmxpbmsvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9iaW5kaW5ncy9iaW5kaW5nc190ZXN0cy5weQppbmRleCAxYzcyZTg1Li4xNGU1N2FhIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvYmxpbmsvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9iaW5kaW5ncy9iaW5kaW5nc190ZXN0cy5weQorKysgYi9zcmMvdGhpcmRfcGFydHkvYmxpbmsvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9iaW5kaW5ncy9iaW5kaW5nc190ZXN0cy5weQpAQCAtNTMsOCArNTMsOCBAQAogCiBQQVNTX01FU1NBR0UgPSAnQWxsIHRlc3RzIFBBU1MhJwogRkFJTF9NRVNTQUdFID0gIiIiU29tZSB0ZXN0cyBGQUlMIQotVG8gdXBkYXRlIHRoZSByZWZlcmVuY2UgZmlsZXMsIGV4ZWN1dGU6Ci0gICAgcnVuLWJpbmRpbmdzLXRlc3RzIC0tcmVzZXQtcmVzdWx0cworVG8gdXBkYXRlIHRoZSByZWZlcmVuY2UgZmlsZXMsIGV4ZWN1dGUgKGZyb20gY29iYWx0L2JpbmRpbmdzKToKKyAgICAuL3J1bl9jb2JhbHRfYmluZGluZ3NfdGVzdHMuc2ggLS1yZXNldC1yZXN1bHRzCiAKIElmIHRoZSBmYWlsdXJlcyBhcmUgbm90IGR1ZSB0byB5b3VyIGNoYW5nZXMsIHRlc3QgcmVzdWx0cyBtYXkgYmUgb3V0IG9mIHN5bmM7CiBwbGVhc2UgcmViYXNlbGluZSB0aGVtIGluIGEgc2VwYXJhdGUgQ0wsIGFmdGVyIGNoZWNraW5nIHRoYXQgdGVzdHMgZmFpbCBpbiBUb1QuCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvaWN1L2ljdS5neXAgYi9zcmMvdGhpcmRfcGFydHkvaWN1L2ljdS5neXAKaW5kZXggMzk4OTJmNy4uYTc0MTk1NyAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2ljdS9pY3UuZ3lwCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9pY3UvaWN1Lmd5cApAQCAtMzAxLDYgKzMwMSwxMiBAQAogICAgICAgICAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc3RhcmJvYXJkX2hlYWRlcnNfb25seS5neXA6c3RhcmJvYXJkX2hlYWRlcnNfb25seScsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgfV0sCisgICAgICAgICAgICBbJyhPUz09InN0YXJib2FyZCIpIGFuZCAodGFyZ2V0X29zPT0iYW5kcm9pZCIpJywgeworICAgICAgICAgICAgICAnY2ZsYWdzX2NjJzogWworICAgICAgICAgICAgICAgICMgcmVsZHRmbXQuY3BwIGNvbXBhcmVzICdVRGF0ZUZvcm1hdFN0eWxlJyBhbmQgJ0VTdHlsZScuCisgICAgICAgICAgICAgICAgJy1Xbm8tZW51bS1jb21wYXJlLXN3aXRjaCcsCisgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICB9XSwKICAgICAgICAgICAgIFsnKE9TPT0ibGJfc2hlbGwiIG9yIE9TPT0ic3RhcmJvYXJkIikgYW5kICh0YXJnZXRfb3M9PSJhbmRyb2lkIiBvciB0YXJnZXRfb3M9PSJsaW51eCIgb3IgY2xhbmc9PTEpJywgewogICAgICAgICAgICAgICAnY2ZsYWdzX2NjJzogWwogICAgICAgICAgICAgICAgICctZnJ0dGknLApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvLm1haWxtYXAgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC8ubWFpbG1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDI0MmE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvLm1haWxtYXAKQEAgLTAsMCArMSwxMiBAQAorPGpvaGFubi5rb2VuaWdAZHVjay5jb20+IDxqb2hhbm5rb2VuaWdAZ29vZ2xlLmNvbT4KK01pa2/FgmFqIFphbGV3c2tpIDxtaWtvbGFqekBnb29nbGUuY29tPgorUGFzY2FsIE1hc3NpbWlubyA8cGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20+Cis8cGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20+IDxza2FsQGdvb2dsZS5jb20+CitWaWthcyBBcm9yYSA8dmlrYXNhQGdvb2dsZS5jb20+Cis8dmlrYXNhQGdvb2dsZS5jb20+IDx2aWthc2FAZ21haWwuY29tPgorPHZpa2FzYUBnb29nbGUuY29tPiA8dmlrYWFzLmFyb3JhQGdtYWlsLmNvbT4KKzxzbG9ib2Rhbi5wcmlqaWNAaW1ndGVjLmNvbT4gPFNsb2JvZGFuLlByaWppY0BpbWd0ZWMuY29tPgorPHZyYWJhdWRAZ29vZ2xlLmNvbT4gPHZpbmNlbnQucmFiYXVkQGdtYWlsLmNvbT4KK1RhbWFyIExldnkgPHRhbWFyLmxldnlAaW50ZWwuY29tPgorPHFyY3pha0Bnb29nbGUuY29tPiA8cXJjemFrPgorSHVpIFN1IDxodWlzdUBnb29nbGUuY29tPgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvQVVUSE9SUyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL0FVVEhPUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNjN2I5YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL0FVVEhPUlMKQEAgLTAsMCArMSwzOSBAQAorQ29udHJpYnV0b3JzOgorLSBDaGFybGVzIE11bmdlciAoY2xtIGF0IGdvb2dsZSBkb3QgY29tKQorLSBDaHJpc3RpYW4gRHV2aXZpZXIgKGNkdXZpdmllciBhdCBnb29nbGUgZG90IGNvbSkKKy0gRGpvcmRqZSBQZXN1dCAoZGpvcmRqZSBkb3QgcGVzdXQgYXQgaW1ndGVjIGRvdCBjb20pCistIEh1aSBTdSAoaHVpc3UgYXQgZ29vZ2xlIGRvdCBjb20pCistIEphbWVzIFplcm4gKGp6ZXJuIGF0IGdvb2dsZSBkb3QgY29tKQorLSBKYW4gRW5nZWxoYXJkdCAoamVuZ2VsaCBhdCBtZWRvemFzIGRvdCBkZSkKKy0gSmVoYW4gKGplaGFuIGF0IGdpcmluc3R1ZCBkb3QgaW8pCistIEpvaGFubiAoam9oYW5uIGRvdCBrb2VuaWcgYXQgZHVjayBkb3QgY29tKQorLSBKb3ZhbiBaZWxpbmNldmljIChqb3ZhbiBkb3QgemVsaW5jZXZpYyBhdCBpbWd0ZWMgZG90IGNvbSkKKy0gSnlya2kgQWxha3VpamFsYSAoanlya2kgYXQgZ29vZ2xlIGRvdCBjb20pCistIExvZGUgVmFuZGV2ZW5uZSAobG9kZSBhdCBnb29nbGUgZG90IGNvbSkKKy0gTG91IFF1aWxsaW8gKGxvdXF1aWxsaW8gYXQgZ29vZ2xlIGRvdCBjb20pCistIE1hbnMgUnVsbGdhcmQgKG1hbnMgYXQgbWFuc3IgZG90IGNvbSkKKy0gTWFyY2luIEtvd2FsY3p5ayAocXJjemFrIGF0IGdvb2dsZSBkb3QgY29tKQorLSBNYXJ0aW4gT2xzc29uIChtbmVtbyBhdCBtaW5pbXVtIGRvdCBzZSkKKy0gTWlrb8WCYWogWmFsZXdza2kgKG1pa29sYWp6IGF0IGdvb2dsZSBkb3QgY29tKQorLSBNaXNsYXYgQnJhZGFjIChtaXNsYXZtIGF0IGdvb2dsZSBkb3QgY29tKQorLSBOaWNvIFdlYmVyICh0aGFraXMgYXQgY2hyb21pdW0gZG90IG9yZykKKy0gTm9lbCBDaHJvbWl1bSAobm9lbCBhdCBjaHJvbWl1bSBkb3Qgb3JnKQorLSBPd2VuIFJvZGxleSAob3JvZGxleSBhdCBnb29nbGUgZG90IGNvbSkKKy0gUGFyYWcgU2FsYXNha2FyIChpbWcgZG90IG1pcHMxIGF0IGdtYWlsIGRvdCBjb20pCistIFBhc2NhbCBNYXNzaW1pbm8gKHBhc2NhbCBkb3QgbWFzc2ltaW5vIGF0IGdtYWlsIGRvdCBjb20pCistIFBhd2XFgiBIYWpkYW4sIEpyIChwaGFqZGFuIGRvdCBqciBhdCBjaHJvbWl1bSBkb3Qgb3JnKQorLSBQaWVycmUgSm95ZSAocGllcnJlIGRvdCBwaHAgYXQgZ21haWwgZG90IGNvbSkKKy0gU2FtIENsZWdnIChzYmMgYXQgY2hyb21pdW0gZG90IG9yZykKKy0gU2NvdHQgSGFuY2hlciAoc2VoIGF0IGdvb2dsZSBkb3QgY29tKQorLSBTY290dCBMYVZhcm53YXkgKHNsYXZhcm53YXkgYXQgZ29vZ2xlIGRvdCBjb20pCistIFNjb3R0IFRhbGJvdCAocyBhdCBjaGlrYWNob3cgZG90IG9yZykKKy0gU2xvYm9kYW4gUHJpamljIChzbG9ib2RhbiBkb3QgcHJpamljIGF0IGltZ3RlYyBkb3QgY29tKQorLSBTb21uYXRoIEJhbmVyamVlIChzb21uYXRoIGRvdCBiYW5lcmplZSBhdCBnbWFpbCBkb3QgY29tKQorLSBTcmlyYW1hbiBUYWxsYW0gKHRtc3JpcmFtIGF0IGdvb2dsZSBkb3QgY29tKQorLSBUYW1hciBMZXZ5ICh0YW1hciBkb3QgbGV2eSBhdCBpbnRlbCBkb3QgY29tKQorLSBUaW1vdGh5IEd1ICh0aW1vdGh5Z3U5OSBhdCBnbWFpbCBkb3QgY29tKQorLSBVcnZhbmcgSm9zaGkgKHVydmFuZyBhdCBnb29nbGUgZG90IGNvbSkKKy0gVmlrYXMgQXJvcmEgKHZpa2FzYSBhdCBnb29nbGUgZG90IGNvbSkKKy0gVmluY2VudCBSYWJhdWQgKHZyYWJhdWQgYXQgZ29vZ2xlIGRvdCBjb20pCistIFZsYWQgVHN5cmtsZXZpY2ggKHZ0c3lya2xldmljaCBhdCBjaHJvbWl1bSBkb3Qgb3JnKQorLSBZYW5nIFpoYW5nICh5YW5nIGRvdCB6aGFuZyBhdCBhcm0gZG90IGNvbSkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL0FuZHJvaWQubWsgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NTJmNzcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjgwIEBACitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK1dFQlBfQ0ZMQUdTIDo9IC1XYWxsIC1EQU5EUk9JRCAtREhBVkVfTUFMTE9DX0ggLURIQVZFX1BUSFJFQUQgLURXRUJQX1VTRV9USFJFQUQKK1dFQlBfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4KKworaWZlcSAoJChBUFBfT1BUSU0pLHJlbGVhc2UpCisgIFdFQlBfQ0ZMQUdTICs9IC1maW5saW5lLWZ1bmN0aW9ucyAtZmZhc3QtbWF0aCBcCisgICAgICAgICAgICAgICAgIC1mZnVuY3Rpb24tc2VjdGlvbnMgLWZkYXRhLXNlY3Rpb25zCisgIGlmZXEgKCQoZmluZHN0cmluZyBjbGFuZywkKE5ES19UT09MQ0hBSU5fVkVSU0lPTikpLCkKKyAgICBXRUJQX0NGTEFHUyArPSAtZnJlbmFtZS1yZWdpc3RlcnMgLXMKKyAgZW5kaWYKK2VuZGlmCisKKyMgbWlwczMyIGZhaWxzIHRvIGJ1aWxkIHdpdGggY2xhbmcgZnJvbSByMTRiCisjIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC93ZWJwL2lzc3Vlcy9kZXRhaWw/aWQ9MzQzCitpZmVxICgkKGZpbmRzdHJpbmcgY2xhbmcsJChOREtfVE9PTENIQUlOX1ZFUlNJT04pKSxjbGFuZykKKyAgaWZlcSAoJChUQVJHRVRfQVJDSCksbWlwcykKKyAgICBjbGFuZ192ZXJzaW9uIDo9ICQoc2hlbGwgJChUQVJHRVRfQ0MpIC0tdmVyc2lvbikKKyAgICBpZm5lcSAoJChmaW5kc3RyaW5nIGNsYW5nIHZlcnNpb24gMywkKGNsYW5nX3ZlcnNpb24pKSwpCisgICAgICBXRUJQX0NGTEFHUyArPSAtbm8taW50ZWdyYXRlZC1hcworICAgIGVuZGlmCisgIGVuZGlmCitlbmRpZgorCitpZm5lcSAoJChmaW5kc3RyaW5nIGFybWVhYmktdjdhLCAkKFRBUkdFVF9BUkNIX0FCSSkpLCkKKyAgIyBTZXR0aW5nIExPQ0FMX0FSTV9ORU9OIHdpbGwgZW5hYmxlIC1tZnB1PW5lb24gd2hpY2ggbWF5IGNhdXNlIGlsbGVnYWwKKyAgIyBpbnN0cnVjdGlvbnMgdG8gYmUgZ2VuZXJhdGVkIGZvciBhcm12N2EgY29kZS4gSW5zdGVhZCB0YXJnZXQgdGhlIG5lb24gY29kZQorICAjIHNwZWNpZmljYWxseS4KKyAgTkVPTiA6PSBjLm5lb24KKyAgVVNFX0NQVUZFQVRVUkVTIDo9IHllcworICBXRUJQX0NGTEFHUyArPSAtREhBVkVfQ1BVX0ZFQVRVUkVTX0gKK2Vsc2UKKyAgTkVPTiA6PSBjCitlbmRpZgorCitkZWNfc3JjcyA6PSBcCisgICAgc3JjL2RlYy9hbHBoYV9kZWMuYyBcCisgICAgc3JjL2RlYy9idWZmZXJfZGVjLmMgXAorICAgIHNyYy9kZWMvZnJhbWVfZGVjLmMgXAorICAgIHNyYy9kZWMvaWRlY19kZWMuYyBcCisgICAgc3JjL2RlYy9pb19kZWMuYyBcCisgICAgc3JjL2RlYy9xdWFudF9kZWMuYyBcCisgICAgc3JjL2RlYy90cmVlX2RlYy5jIFwKKyAgICBzcmMvZGVjL3ZwOF9kZWMuYyBcCisgICAgc3JjL2RlYy92cDhsX2RlYy5jIFwKKyAgICBzcmMvZGVjL3dlYnBfZGVjLmMgXAorCitkZW11eF9zcmNzIDo9IFwKKyAgICBzcmMvZGVtdXgvYW5pbV9kZWNvZGUuYyBcCisgICAgc3JjL2RlbXV4L2RlbXV4LmMgXAorCitkc3BfZGVjX3NyY3MgOj0gXAorICAgIHNyYy9kc3AvYWxwaGFfcHJvY2Vzc2luZy5jIFwKKyAgICBzcmMvZHNwL2FscGhhX3Byb2Nlc3NpbmdfbWlwc19kc3BfcjIuYyBcCisgICAgc3JjL2RzcC9hbHBoYV9wcm9jZXNzaW5nX25lb24uJChORU9OKSBcCisgICAgc3JjL2RzcC9hbHBoYV9wcm9jZXNzaW5nX3NzZTIuYyBcCisgICAgc3JjL2RzcC9hbHBoYV9wcm9jZXNzaW5nX3NzZTQxLmMgXAorICAgIHNyYy9kc3AvY3B1LmMgXAorICAgIHNyYy9kc3AvZGVjLmMgXAorICAgIHNyYy9kc3AvZGVjX2NsaXBfdGFibGVzLmMgXAorICAgIHNyYy9kc3AvZGVjX21pcHMzMi5jIFwKKyAgICBzcmMvZHNwL2RlY19taXBzX2RzcF9yMi5jIFwKKyAgICBzcmMvZHNwL2RlY19tc2EuYyBcCisgICAgc3JjL2RzcC9kZWNfbmVvbi4kKE5FT04pIFwKKyAgICBzcmMvZHNwL2RlY19zc2UyLmMgXAorICAgIHNyYy9kc3AvZGVjX3NzZTQxLmMgXAorICAgIHNyYy9kc3AvZmlsdGVycy5jIFwKKyAgICBzcmMvZHNwL2ZpbHRlcnNfbWlwc19kc3BfcjIuYyBcCisgICAgc3JjL2RzcC9maWx0ZXJzX21zYS5jIFwKKyAgICBzcmMvZHNwL2ZpbHRlcnNfbmVvbi4kKE5FT04pIFwKKyAgICBzcmMvZHNwL2ZpbHRlcnNfc3NlMi5jIFwKKyAgICBzcmMvZHNwL2xvc3NsZXNzLmMgXAorICAgIHNyYy9kc3AvbG9zc2xlc3NfbWlwc19kc3BfcjIuYyBcCisgICAgc3JjL2RzcC9sb3NzbGVzc19tc2EuYyBcCisgICAgc3JjL2RzcC9sb3NzbGVzc19uZW9uLiQoTkVPTikgXAorICAgIHNyYy9kc3AvbG9zc2xlc3Nfc3NlMi5jIFwKKyAgICBzcmMvZHNwL3Jlc2NhbGVyLmMgXAorICAgIHNyYy9kc3AvcmVzY2FsZXJfbWlwczMyLmMgXAorICAgIHNyYy9kc3AvcmVzY2FsZXJfbWlwc19kc3BfcjIuYyBcCisgICAgc3JjL2RzcC9yZXNjYWxlcl9tc2EuYyBcCisgICAgc3JjL2RzcC9yZXNjYWxlcl9uZW9uLiQoTkVPTikgXAorICAgIHNyYy9kc3AvcmVzY2FsZXJfc3NlMi5jIFwKKyAgICBzcmMvZHNwL3Vwc2FtcGxpbmcuYyBcCisgICAgc3JjL2RzcC91cHNhbXBsaW5nX21pcHNfZHNwX3IyLmMgXAorICAgIHNyYy9kc3AvdXBzYW1wbGluZ19tc2EuYyBcCisgICAgc3JjL2RzcC91cHNhbXBsaW5nX25lb24uJChORU9OKSBcCisgICAgc3JjL2RzcC91cHNhbXBsaW5nX3NzZTIuYyBcCisgICAgc3JjL2RzcC91cHNhbXBsaW5nX3NzZTQxLmMgXAorICAgIHNyYy9kc3AveXV2LmMgXAorICAgIHNyYy9kc3AveXV2X21pcHMzMi5jIFwKKyAgICBzcmMvZHNwL3l1dl9taXBzX2RzcF9yMi5jIFwKKyAgICBzcmMvZHNwL3l1dl9uZW9uLiQoTkVPTikgXAorICAgIHNyYy9kc3AveXV2X3NzZTIuYyBcCisgICAgc3JjL2RzcC95dXZfc3NlNDEuYyBcCisKK2RzcF9lbmNfc3JjcyA6PSBcCisgICAgc3JjL2RzcC9jb3N0LmMgXAorICAgIHNyYy9kc3AvY29zdF9taXBzMzIuYyBcCisgICAgc3JjL2RzcC9jb3N0X21pcHNfZHNwX3IyLmMgXAorICAgIHNyYy9kc3AvY29zdF9zc2UyLmMgXAorICAgIHNyYy9kc3AvZW5jLmMgXAorICAgIHNyYy9kc3AvZW5jX2F2eDIuYyBcCisgICAgc3JjL2RzcC9lbmNfbWlwczMyLmMgXAorICAgIHNyYy9kc3AvZW5jX21pcHNfZHNwX3IyLmMgXAorICAgIHNyYy9kc3AvZW5jX21zYS5jIFwKKyAgICBzcmMvZHNwL2VuY19uZW9uLiQoTkVPTikgXAorICAgIHNyYy9kc3AvZW5jX3NzZTIuYyBcCisgICAgc3JjL2RzcC9lbmNfc3NlNDEuYyBcCisgICAgc3JjL2RzcC9sb3NzbGVzc19lbmMuYyBcCisgICAgc3JjL2RzcC9sb3NzbGVzc19lbmNfbWlwczMyLmMgXAorICAgIHNyYy9kc3AvbG9zc2xlc3NfZW5jX21pcHNfZHNwX3IyLmMgXAorICAgIHNyYy9kc3AvbG9zc2xlc3NfZW5jX21zYS5jIFwKKyAgICBzcmMvZHNwL2xvc3NsZXNzX2VuY19uZW9uLiQoTkVPTikgXAorICAgIHNyYy9kc3AvbG9zc2xlc3NfZW5jX3NzZTIuYyBcCisgICAgc3JjL2RzcC9sb3NzbGVzc19lbmNfc3NlNDEuYyBcCisgICAgc3JjL2RzcC9zc2ltLmMgXAorICAgIHNyYy9kc3Avc3NpbV9zc2UyLmMgXAorCitlbmNfc3JjcyA6PSBcCisgICAgc3JjL2VuYy9hbHBoYV9lbmMuYyBcCisgICAgc3JjL2VuYy9hbmFseXNpc19lbmMuYyBcCisgICAgc3JjL2VuYy9iYWNrd2FyZF9yZWZlcmVuY2VzX2Nvc3RfZW5jLmMgXAorICAgIHNyYy9lbmMvYmFja3dhcmRfcmVmZXJlbmNlc19lbmMuYyBcCisgICAgc3JjL2VuYy9jb25maWdfZW5jLmMgXAorICAgIHNyYy9lbmMvY29zdF9lbmMuYyBcCisgICAgc3JjL2VuYy9maWx0ZXJfZW5jLmMgXAorICAgIHNyYy9lbmMvZnJhbWVfZW5jLmMgXAorICAgIHNyYy9lbmMvaGlzdG9ncmFtX2VuYy5jIFwKKyAgICBzcmMvZW5jL2l0ZXJhdG9yX2VuYy5jIFwKKyAgICBzcmMvZW5jL25lYXJfbG9zc2xlc3NfZW5jLmMgXAorICAgIHNyYy9lbmMvcGljdHVyZV9lbmMuYyBcCisgICAgc3JjL2VuYy9waWN0dXJlX2NzcF9lbmMuYyBcCisgICAgc3JjL2VuYy9waWN0dXJlX3BzbnJfZW5jLmMgXAorICAgIHNyYy9lbmMvcGljdHVyZV9yZXNjYWxlX2VuYy5jIFwKKyAgICBzcmMvZW5jL3BpY3R1cmVfdG9vbHNfZW5jLmMgXAorICAgIHNyYy9lbmMvcHJlZGljdG9yX2VuYy5jIFwKKyAgICBzcmMvZW5jL3F1YW50X2VuYy5jIFwKKyAgICBzcmMvZW5jL3N5bnRheF9lbmMuYyBcCisgICAgc3JjL2VuYy90b2tlbl9lbmMuYyBcCisgICAgc3JjL2VuYy90cmVlX2VuYy5jIFwKKyAgICBzcmMvZW5jL3ZwOGxfZW5jLmMgXAorICAgIHNyYy9lbmMvd2VicF9lbmMuYyBcCisKK211eF9zcmNzIDo9IFwKKyAgICBzcmMvbXV4L2FuaW1fZW5jb2RlLmMgXAorICAgIHNyYy9tdXgvbXV4ZWRpdC5jIFwKKyAgICBzcmMvbXV4L211eGludGVybmFsLmMgXAorICAgIHNyYy9tdXgvbXV4cmVhZC5jIFwKKwordXRpbHNfZGVjX3NyY3MgOj0gXAorICAgIHNyYy91dGlscy9iaXRfcmVhZGVyX3V0aWxzLmMgXAorICAgIHNyYy91dGlscy9jb2xvcl9jYWNoZV91dGlscy5jIFwKKyAgICBzcmMvdXRpbHMvZmlsdGVyc191dGlscy5jIFwKKyAgICBzcmMvdXRpbHMvaHVmZm1hbl91dGlscy5jIFwKKyAgICBzcmMvdXRpbHMvcXVhbnRfbGV2ZWxzX2RlY191dGlscy5jIFwKKyAgICBzcmMvdXRpbHMvcmFuZG9tX3V0aWxzLmMgXAorICAgIHNyYy91dGlscy9yZXNjYWxlcl91dGlscy5jIFwKKyAgICBzcmMvdXRpbHMvdGhyZWFkX3V0aWxzLmMgXAorICAgIHNyYy91dGlscy91dGlscy5jIFwKKwordXRpbHNfZW5jX3NyY3MgOj0gXAorICAgIHNyYy91dGlscy9iaXRfd3JpdGVyX3V0aWxzLmMgXAorICAgIHNyYy91dGlscy9odWZmbWFuX2VuY29kZV91dGlscy5jIFwKKyAgICBzcmMvdXRpbHMvcXVhbnRfbGV2ZWxzX3V0aWxzLmMgXAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBsaWJ3ZWJwZGVjb2RlcgorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICAkKGRlY19zcmNzKSBcCisgICAgJChkc3BfZGVjX3NyY3MpIFwKKyAgICAkKHV0aWxzX2RlY19zcmNzKSBcCisKK0xPQ0FMX0NGTEFHUyA6PSAkKFdFQlBfQ0ZMQUdTKQorTE9DQUxfQ19JTkNMVURFUyArPSAkKExPQ0FMX1BBVEgpL3NyYworCisjIHByZWZlciBhcm0gb3ZlciB0aHVtYiBtb2RlIGZvciBwZXJmb3JtYW5jZSBnYWlucworTE9DQUxfQVJNX01PREUgOj0gYXJtCisKK2lmZXEgKCQoVVNFX0NQVUZFQVRVUkVTKSx5ZXMpCisgIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gY3B1ZmVhdHVyZXMKK2VuZGlmCisKK0xPQ0FMX01PRFVMRSA6PSB3ZWJwZGVjb2Rlcl9zdGF0aWMKKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQorCitpZmVxICgkKEVOQUJMRV9TSEFSRUQpLDEpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfV0hPTEVfU1RBVElDX0xJQlJBUklFUyA6PSB3ZWJwZGVjb2Rlcl9zdGF0aWMKKworTE9DQUxfTU9EVUxFIDo9IHdlYnBkZWNvZGVyCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKK2VuZGlmICAjIEVOQUJMRV9TSEFSRUQ9MQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBsaWJ3ZWJwCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgICQoZHNwX2VuY19zcmNzKSBcCisgICAgJChlbmNfc3JjcykgXAorICAgICQodXRpbHNfZW5jX3NyY3MpIFwKKworTE9DQUxfQ0ZMQUdTIDo9ICQoV0VCUF9DRkxBR1MpCitMT0NBTF9DX0lOQ0xVREVTICs9ICQoTE9DQUxfUEFUSCkvc3JjCisKKyMgcHJlZmVyIGFybSBvdmVyIHRodW1iIG1vZGUgZm9yIHBlcmZvcm1hbmNlIGdhaW5zCitMT0NBTF9BUk1fTU9ERSA6PSBhcm0KKworTE9DQUxfV0hPTEVfU1RBVElDX0xJQlJBUklFUyA6PSB3ZWJwZGVjb2Rlcl9zdGF0aWMKKworTE9DQUxfTU9EVUxFIDo9IHdlYnAKKworaWZlcSAoJChFTkFCTEVfU0hBUkVEKSwxKQorICBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCitlbHNlCisgIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKK2VuZGlmCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGxpYndlYnBkZW11eAorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoZGVtdXhfc3JjcykKKworTE9DQUxfQ0ZMQUdTIDo9ICQoV0VCUF9DRkxBR1MpCitMT0NBTF9DX0lOQ0xVREVTICs9ICQoTE9DQUxfUEFUSCkvc3JjCisKKyMgcHJlZmVyIGFybSBvdmVyIHRodW1iIG1vZGUgZm9yIHBlcmZvcm1hbmNlIGdhaW5zCitMT0NBTF9BUk1fTU9ERSA6PSBhcm0KKworTE9DQUxfTU9EVUxFIDo9IHdlYnBkZW11eAorCitpZmVxICgkKEVOQUJMRV9TSEFSRUQpLDEpCisgIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gd2VicAorICBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCitlbHNlCisgIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gd2VicAorICBpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCitlbmRpZgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBsaWJ3ZWJwbXV4CisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gJChtdXhfc3JjcykKKworTE9DQUxfQ0ZMQUdTIDo9ICQoV0VCUF9DRkxBR1MpCitMT0NBTF9DX0lOQ0xVREVTICs9ICQoTE9DQUxfUEFUSCkvc3JjCisKKyMgcHJlZmVyIGFybSBvdmVyIHRodW1iIG1vZGUgZm9yIHBlcmZvcm1hbmNlIGdhaW5zCitMT0NBTF9BUk1fTU9ERSA6PSBhcm0KKworTE9DQUxfTU9EVUxFIDo9IHdlYnBtdXgKKworaWZlcSAoJChFTkFCTEVfU0hBUkVEKSwxKQorICBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IHdlYnAKKyAgaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorZWxzZQorICBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IHdlYnAKKyAgaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQorZW5kaWYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworV0VCUF9TUkNfUEFUSCA6PSAkKExPQ0FMX1BBVEgpCitpbmNsdWRlICQoV0VCUF9TUkNfUEFUSCkvaW1hZ2Vpby9BbmRyb2lkLm1rCitpbmNsdWRlICQoV0VCUF9TUkNfUEFUSCkvZXhhbXBsZXMvQW5kcm9pZC5taworCitpZmVxICgkKFVTRV9DUFVGRUFUVVJFUykseWVzKQorICAkKGNhbGwgaW1wb3J0LW1vZHVsZSxhbmRyb2lkL2NwdWZlYXR1cmVzKQorZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL0NNYWtlTGlzdHMudHh0IGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEyNjNiMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMzcxIEBACitjbWFrZV9taW5pbXVtX3JlcXVpcmVkKFZFUlNJT04gMi44LjcpCisKK3Byb2plY3QobGlid2VicCBDKQorCisjIE9wdGlvbnMgZm9yIGNvZGVyIC8gZGVjb2RlciBleGVjdXRhYmxlcy4KK29wdGlvbihXRUJQX0VOQUJMRV9TSU1EICJFbmFibGUgYW55IFNJTUQgb3B0aW1pemF0aW9uLiIgT04pCitvcHRpb24oV0VCUF9CVUlMRF9DV0VCUCAiQnVpbGQgdGhlIGN3ZWJwIGNvbW1hbmQgbGluZSB0b29sLiIgT0ZGKQorb3B0aW9uKFdFQlBfQlVJTERfRFdFQlAgIkJ1aWxkIHRoZSBkd2VicCBjb21tYW5kIGxpbmUgdG9vbC4iIE9GRikKK29wdGlvbihXRUJQX0JVSUxEX0dJRjJXRUJQICJCdWlsZCB0aGUgZ2lmMndlYnAgY29udmVyc2lvbiB0b29sLiIgT0ZGKQorb3B0aW9uKFdFQlBfQlVJTERfSU1HMldFQlAgIkJ1aWxkIHRoZSBpbWcyd2VicCBhbmltYXRpb24gdG9vbC4iIE9GRikKK29wdGlvbihXRUJQX0JVSUxEX1dFQlBJTkZPICJCdWlsZCB0aGUgd2VicGluZm8gY29tbWFuZCBsaW5lIHRvb2wuIiBPRkYpCitvcHRpb24oV0VCUF9CVUlMRF9XRUJQX0pTICJFbXNjcmlwdGVuIGJ1aWxkIG9mIHdlYnAuanMuIiBPRkYpCitvcHRpb24oV0VCUF9ORUFSX0xPU1NMRVNTICJFbmFibGUgbmVhci1sb3NzbGVzcyBlbmNvZGluZyIgT04pCitvcHRpb24oV0VCUF9FTkFCTEVfU1dBUF8xNkJJVF9DU1AgIkVuYWJsZSBieXRlIHN3YXAgZm9yIDE2IGJpdCBjb2xvcnNwYWNlcy4iIE9GRikKKworaWYoV0VCUF9CVUlMRF9XRUJQX0pTKQorICBzZXQoV0VCUF9FTkFCTEVfU0lNRCBPRkYpCitlbmRpZigpCisKK3NldChXRUJQX0RFUF9MSUJSQVJJRVMpCitzZXQoV0VCUF9ERVBfSU5DTFVERV9ESVJTKQorCitpZihOT1QgQ01BS0VfQlVJTERfVFlQRSkKKyAgc2V0KENNQUtFX0JVSUxEX1RZUEUgIlJlbGVhc2UiIENBQ0hFCisgICAgIkJ1aWxkIHR5cGU6IFJlbGVhc2UsIERlYnVnIG9yIFJlbFdpdGhEZWJJbmZvIiBTVFJJTkcgRk9SQ0UKKyAgKQorZW5kaWYoKQorCisjIEluY2x1ZGUgZGVwZW5kZW5jaWVzLgoraW5jbHVkZShjbWFrZS9kZXBzLmNtYWtlKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBPcHRpb25zLgoraWYoV0VCUF9FTkFCTEVfU1dBUF8xNkJJVF9DU1ApCisgIGFkZF9kZWZpbml0aW9ucygtRFdFQlBfU1dBUF8xNkJJVF9DU1A9MSkKK2VuZGlmKCkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQW5kcm9pZCBvbmx5LgoraWYoQU5EUk9JRCkKKyAgaW5jbHVkZV9kaXJlY3Rvcmllcygke0FORFJPSURfTkRLfS9zb3VyY2VzL2FuZHJvaWQvY3B1ZmVhdHVyZXMpCisgIGFkZF9saWJyYXJ5KGNwdWZlYXR1cmVzIFNUQVRJQworICAgICR7QU5EUk9JRF9OREt9L3NvdXJjZXMvYW5kcm9pZC9jcHVmZWF0dXJlcy9jcHUtZmVhdHVyZXMuYworICApCisgIHRhcmdldF9saW5rX2xpYnJhcmllcyhjcHVmZWF0dXJlcyBkbCkKKyAgc2V0KFdFQlBfREVQX0xJQlJBUklFUyAke1dFQlBfREVQX0xJQlJBUklFU30gY3B1ZmVhdHVyZXMpCisgIHNldChXRUJQX0RFUF9JTkNMVURFX0RJUlMgJHtXRUJQX0RFUF9JTkNMVURFX0RJUlN9CisgICAgJHtBTkRST0lEX05ES30vc291cmNlcy9hbmRyb2lkL2NwdWZlYXR1cmVzCisgICkKKyAgYWRkX2RlZmluaXRpb25zKC1ESEFWRV9DUFVfRkVBVFVSRVNfSD0xKQorICBzZXQoSEFWRV9DUFVfRkVBVFVSRVNfSCAxKQorZWxzZSgpCisgIHNldChIQVZFX0NQVV9GRUFUVVJFU19IIDApCitlbmRpZigpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFdlYlAgc291cmNlIGZpbGVzLgorIyBSZWFkIHRoZSBNYWtlZmlsZS5hbSB0byBnZXQgdGhlIHNvdXJjZSBmaWxlcy4KKworIyBXZSBleHBlY3QgdGhlIE1ha2VmaWxlcyB0byBkZWZpbmUgdGhlIHNvdXJjZXMgYXMgZGVmaW5lZCBpbgorIyB0aGUgZmlyc3QgcmVnZXguIEUuZy46CisjIGxpYmltYWdlZGVjX2xhX1NPVVJDRVMgID0gaW1hZ2VfZGVjLmMgaW1hZ2VfZGVjLmgKK2Z1bmN0aW9uKHBhcnNlX01ha2VmaWxlX2FtIEZPTERFUiBWQVIgU1JDX1JFR0VYKQorICBmaWxlKFJFQUQgJHtGT0xERVJ9L01ha2VmaWxlLmFtIE1BS0VGSUxFX0FNKQorICBzdHJpbmcoUkVHRVggTUFUQ0hBTEwgIiR7U1JDX1JFR0VYfV9TT1VSQ0VTWyBdKlxcKz89WyBdK1swLTlhLXpcXC5fIF0qIgorICAgIEZJTEVTX1BFUl9MSU5FICR7TUFLRUZJTEVfQU19CisgICkKKyAgc2V0KFNSQ1MgJHske1ZBUn19KQorICBmb3JlYWNoKEZJTEVTICR7RklMRVNfUEVSX0xJTkV9KQorICAgIHN0cmluZyhGSU5EICR7RklMRVN9ICI9IiBPRkZTRVQpCisgICAgbWF0aChFWFBSIE9GRlNFVCAiJHtPRkZTRVR9ICsgMiIpCisgICAgc3RyaW5nKFNVQlNUUklORyAke0ZJTEVTfSAke09GRlNFVH0gLTEgRklMRVMpCisgICAgaWYoRklMRVMpCisgICAgICBzdHJpbmcoUkVHRVggTUFUQ0hBTEwgIlswLTlhLXpcXC5fXSsiCisgICAgICAgIEZJTEVTICR7RklMRVN9CisgICAgICApCisgICAgICBmb3JlYWNoKEZJTEUgJHtGSUxFU30pCisgICAgICAgIGxpc3QoQVBQRU5EIFNSQ1MgJHtGT0xERVJ9LyR7RklMRX0pCisgICAgICBlbmRmb3JlYWNoKCkKKyAgICBlbmRpZigpCisgIGVuZGZvcmVhY2goKQorICBzZXQoJHtWQVJ9ICR7U1JDU30gUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQorCitzZXQoV0VCUF9TUkNfRElSICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9zcmMpCitwYXJzZV9NYWtlZmlsZV9hbSgke1dFQlBfU1JDX0RJUn0vZGVjICJXRUJQX0RFQ19TUkNTIiAiIikKK3BhcnNlX01ha2VmaWxlX2FtKCR7V0VCUF9TUkNfRElSfS9kZW11eCAiV0VCUF9ERU1VWF9TUkNTIiAiIikKK3BhcnNlX01ha2VmaWxlX2FtKCR7V0VCUF9TUkNfRElSfS9kc3AgIldFQlBfRFNQX0NPTU1PTl9TUkNTIiAiQ09NTU9OIikKK3BhcnNlX01ha2VmaWxlX2FtKCR7V0VCUF9TUkNfRElSfS9kc3AgIldFQlBfRFNQX0VOQ19TUkNTIiAiRU5DIikKK3BhcnNlX01ha2VmaWxlX2FtKCR7V0VCUF9TUkNfRElSfS9kc3AgIldFQlBfRFNQX0VOQ19TUkNTIiAiZHNwX1teIF0qIikKK3BhcnNlX01ha2VmaWxlX2FtKCR7V0VCUF9TUkNfRElSfS9kc3AgIldFQlBfRFNQX0RFQ19TUkNTIiAiZGVjb2RlX1teIF0qIikKK3BhcnNlX01ha2VmaWxlX2FtKCR7V0VCUF9TUkNfRElSfS9lbmMgIldFQlBfRU5DX1NSQ1MiICIiKQorcGFyc2VfTWFrZWZpbGVfYW0oJHtXRUJQX1NSQ19ESVJ9L3V0aWxzICJXRUJQX1VUSUxTX0NPTU1PTl9TUkNTIiAiQ09NTU9OIikKK3BhcnNlX01ha2VmaWxlX2FtKCR7V0VCUF9TUkNfRElSfS91dGlscyAiV0VCUF9VVElMU19FTkNfU1JDUyIgIkVOQyIpCitwYXJzZV9NYWtlZmlsZV9hbSgke1dFQlBfU1JDX0RJUn0vdXRpbHMgIldFQlBfVVRJTFNfREVDX1NSQ1MiICJkZWNvZGVfW14gXSoiKQorCisjIFJlbW92ZSB0aGUgZmlsZXMgc3BlY2lmaWMgdG8gU0lNRCB3ZSBkb24ndCB1c2UuCitmb3JlYWNoKEZJTEUgJHtXRUJQX1NJTURfRklMRVNfTk9UX1RPX0lOQ0xVREV9KQorICBsaXN0KFJFTU9WRV9JVEVNIFdFQlBfRFNQX0VOQ19TUkNTICR7RklMRX0pCisgIGxpc3QoUkVNT1ZFX0lURU0gV0VCUF9EU1BfREVDX1NSQ1MgJHtGSUxFfSkKK2VuZGZvcmVhY2goKQorCisjIyMgRGVmaW5lIHRoZSBtYW5kYXRvcnkgbGlicmFyaWVzLgorIyBCdWlsZCB0aGUgd2VicGRlY29kZXIgbGlicmFyeS4KK2lmKE1TVkMpCisgICMgYXZvaWQgc2VjdXJpdHkgd2FybmluZ3MgZm9yIGUuZy4sIGZvcGVuKCkgdXNlZCBpbiB0aGUgZXhhbXBsZXMuCisgIGFkZF9kZWZpbml0aW9ucygtRF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTKQorZWxzZSgpCisgIGFkZF9kZWZpbml0aW9ucygtV2FsbCkKK2VuZGlmKCkKK2luY2x1ZGVfZGlyZWN0b3JpZXMoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9ICR7V0VCUF9ERVBfSU5DTFVERV9ESVJTfSkKK2FkZF9saWJyYXJ5KHdlYnBkZWNvZGUgT0JKRUNUICR7V0VCUF9ERUNfU1JDU30pCithZGRfbGlicmFyeSh3ZWJwZHNwZGVjb2RlIE9CSkVDVCAke1dFQlBfRFNQX0NPTU1PTl9TUkNTfSAke1dFQlBfRFNQX0RFQ19TUkNTfSkKK2FkZF9saWJyYXJ5KHdlYnB1dGlsc2RlY29kZSBPQkpFQ1QgJHtXRUJQX1VUSUxTX0NPTU1PTl9TUkNTfQorICAke1dFQlBfVVRJTFNfREVDX1NSQ1N9KQorYWRkX2xpYnJhcnkod2VicGRlY29kZXIgJDxUQVJHRVRfT0JKRUNUUzp3ZWJwZGVjb2RlPgorICAkPFRBUkdFVF9PQkpFQ1RTOndlYnBkc3BkZWNvZGU+ICQ8VEFSR0VUX09CSkVDVFM6d2VicHV0aWxzZGVjb2RlPikKK3RhcmdldF9saW5rX2xpYnJhcmllcyh3ZWJwZGVjb2RlciAke1dFQlBfREVQX0xJQlJBUklFU30pCisKKyMgQnVpbGQgdGhlIHdlYnAgbGlicmFyeS4KK2FkZF9saWJyYXJ5KHdlYnBlbmNvZGUgT0JKRUNUICR7V0VCUF9FTkNfU1JDU30pCithZGRfbGlicmFyeSh3ZWJwZHNwIE9CSkVDVCAke1dFQlBfRFNQX0NPTU1PTl9TUkNTfSAke1dFQlBfRFNQX0RFQ19TUkNTfQorICAke1dFQlBfRFNQX0VOQ19TUkNTfSkKK2FkZF9saWJyYXJ5KHdlYnB1dGlscyBPQkpFQ1QgJHtXRUJQX1VUSUxTX0NPTU1PTl9TUkNTfSAke1dFQlBfVVRJTFNfREVDX1NSQ1N9CisgICR7V0VCUF9VVElMU19FTkNfU1JDU30pCithZGRfbGlicmFyeSh3ZWJwICQ8VEFSR0VUX09CSkVDVFM6d2VicGRlY29kZT4gJDxUQVJHRVRfT0JKRUNUUzp3ZWJwZHNwPgorICAkPFRBUkdFVF9PQkpFQ1RTOndlYnBlbmNvZGU+ICQ8VEFSR0VUX09CSkVDVFM6d2VicHV0aWxzPikKK3RhcmdldF9saW5rX2xpYnJhcmllcyh3ZWJwICR7V0VCUF9ERVBfTElCUkFSSUVTfSkKKworIyBNYWtlIHN1cmUgdGhlIE9CSkVDVCBsaWJyYXJpZXMgYXJlIGJ1aWx0IHdpdGggcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZQorIyAoaXQgaXMgbm90IE9OIGJ5IGRlZmF1bHQpLgorc2V0X3RhcmdldF9wcm9wZXJ0aWVzKHdlYnBkZWNvZGUgd2VicGRzcGRlY29kZSB3ZWJwdXRpbHNkZWNvZGUKKyAgd2VicGVuY29kZSB3ZWJwZHNwIHdlYnB1dGlscyBQUk9QRVJUSUVTIFBPU0lUSU9OX0lOREVQRU5ERU5UX0NPREUgT04pCisKKyMgQnVpbGQgdGhlIHdlYnAgZGVtdXggbGlicmFyeS4KK2FkZF9saWJyYXJ5KHdlYnBkZW11eCAke1dFQlBfREVNVVhfU1JDU30pCit0YXJnZXRfbGlua19saWJyYXJpZXMod2VicGRlbXV4IHdlYnApCisKKyMgU2V0IHRoZSB2ZXJzaW9uIG51bWJlcnMuCitmdW5jdGlvbihwYXJzZV92ZXJzaW9uIEZJTEUgTkFNRSBWQVIpCisgIGZpbGUoUkVBRCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vc3JjLyR7RklMRX0gU09VUkNFX0ZJTEUpCisgIHN0cmluZyhSRUdFWCBNQVRDSCAiJHtOQU1FfV9sYV9MREZMQUdTW15cbl0qIC12ZXJzaW9uLWluZm8gWzAtOTpdKyIgVE1QCisgICAgJHtTT1VSQ0VfRklMRX0pCisgIHN0cmluZyhSRUdFWCBNQVRDSCAiWzAtOTpdKyIgVE1QICR7VE1QfSkKKyAgc3RyaW5nKFJFR0VYIFJFUExBQ0UgIjoiICIuIiBWRVJTSU9OICR7VE1QfSkKKyAgc2V0KCR7VkFSfSAiJHtWRVJTSU9OfSIgUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQorcGFyc2VfdmVyc2lvbihNYWtlZmlsZS5hbSB3ZWJwIFdFQlBfV0VCUF9TT1ZFUlNJT04pCitzZXRfdGFyZ2V0X3Byb3BlcnRpZXMod2VicCBQUk9QRVJUSUVTIFZFUlNJT04gJHtQQUNLQUdFX1ZFUlNJT059CisgIFNPVkVSU0lPTiAke1dFQlBfV0VCUF9TT1ZFUlNJT059KQorcGFyc2VfdmVyc2lvbihNYWtlZmlsZS5hbSB3ZWJwZGVjb2RlciBXRUJQX0RFQ09ERVJfU09WRVJTSU9OKQorc2V0X3RhcmdldF9wcm9wZXJ0aWVzKHdlYnBkZWNvZGVyIFBST1BFUlRJRVMgVkVSU0lPTiAke1BBQ0tBR0VfVkVSU0lPTn0KKyAgU09WRVJTSU9OICR7V0VCUF9ERUNPREVSX1NPVkVSU0lPTn0pCitwYXJzZV92ZXJzaW9uKGRlbXV4L01ha2VmaWxlLmFtIHdlYnBkZW11eCBXRUJQX0RFTVVYX1NPVkVSU0lPTikKK3NldF90YXJnZXRfcHJvcGVydGllcyh3ZWJwZGVtdXggUFJPUEVSVElFUyBWRVJTSU9OICR7UEFDS0FHRV9WRVJTSU9OfQorICBTT1ZFUlNJT04gJHtXRUJQX0RFTVVYX1NPVkVSU0lPTn0pCisKKyMgRGVmaW5lIHRoZSBsaWJyYXJpZXMgdG8gaW5zdGFsbC4KK3NldChJTlNUQUxMRURfTElCUkFSSUVTIHdlYnBkZWNvZGVyIHdlYnAgd2VicGRlbXV4KQorCisjIyMgRGVhbCB3aXRoIFNJTUQuCisjIENoYW5nZSB0aGUgY29tcGlsZSBmbGFncyBmb3IgU0lNRCBmaWxlcyB3ZSB1c2UuCitsaXN0KExFTkdUSCBXRUJQX1NJTURfRklMRVNfVE9fSU5DTFVERSBXRUJQX1NJTURfRklMRVNfVE9fSU5DTFVERV9MRU5HVEgpCittYXRoKEVYUFIgV0VCUF9TSU1EX0ZJTEVTX1RPX0lOQ0xVREVfUkFOR0UKKyAgIiR7V0VCUF9TSU1EX0ZJTEVTX1RPX0lOQ0xVREVfTEVOR1RIfS0xIgorKQorCitmb3JlYWNoKElfRklMRSBSQU5HRSAke1dFQlBfU0lNRF9GSUxFU19UT19JTkNMVURFX1JBTkdFfSkKKyAgbGlzdChHRVQgV0VCUF9TSU1EX0ZJTEVTX1RPX0lOQ0xVREUgJHtJX0ZJTEV9IEZJTEUpCisgIGxpc3QoR0VUIFdFQlBfU0lNRF9GTEFHU19UT19JTkNMVURFICR7SV9GSUxFfSBTSU1EX0NPTVBJTEVfRkxBRykKKyAgc2V0X3NvdXJjZV9maWxlc19wcm9wZXJ0aWVzKCR7RklMRX0gUFJPUEVSVElFUworICAgIENPTVBJTEVfRkxBR1MgJHtTSU1EX0NPTVBJTEVfRkxBR30KKyAgKQorZW5kZm9yZWFjaCgpCisKKyMgQnVpbGQgdGhlIGV4ZWN1dGFibGVzIGlmIGFza2VkIGZvci4KK2lmKFdFQlBfQlVJTERfQ1dFQlAgT1IgV0VCUF9CVUlMRF9EV0VCUCBPUgorICAgV0VCUF9CVUlMRF9HSUYyV0VCUCBPUiBXRUJQX0JVSUxEX0lNRzJXRUJQIE9SIFdFQlBfQlVJTERfV0VCUF9KUykKKyAgIyBFeGFtcGxlIHV0aWxpdHkgbGlicmFyeS4KKyAgcGFyc2VfTWFrZWZpbGVfYW0oJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2V4YW1wbGVzICJFWEFNUExFVVRJTF9TUkNTIgorICAgICJleGFtcGxlX3V0aWxfW14gXSoiKQorICBsaXN0KEFQUEVORCBFWEFNUExFVVRJTF9TUkNTCisgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2V4YW1wbGVzL3N0b3B3YXRjaC5oKQorICBhZGRfbGlicmFyeShleGFtcGxldXRpbCAke0VYQU1QTEVVVElMX1NSQ1N9KQorCisgIHBhcnNlX01ha2VmaWxlX2FtKCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9pbWFnZWlvICJJTUFHRUlPVVRJTFNfU1JDUyIKKyAgICAiaW1hZ2Vpb191dGlsX1teIF0qIikKKyAgYWRkX2xpYnJhcnkoaW1hZ2Vpb3V0aWwgJHtJTUFHRUlPVVRJTFNfU1JDU30pCisgIHRhcmdldF9saW5rX2xpYnJhcmllcyhpbWFnZWlvdXRpbCB3ZWJwKQorCisgICMgSW1hZ2UtZGVjb2RpbmcgdXRpbGl0eSBsaWJyYXJ5LgorICBwYXJzZV9NYWtlZmlsZV9hbSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vaW1hZ2VpbyAiSU1BR0VERUNfU1JDUyIKKyAgICAiaW1hZ2VkZWNfW14gXSoiKQorICBhZGRfbGlicmFyeShpbWFnZWRlYyAke0lNQUdFREVDX1NSQ1N9KQorICB0YXJnZXRfbGlua19saWJyYXJpZXMoaW1hZ2VkZWMgaW1hZ2Vpb3V0aWwgd2VicGRlbXV4IHdlYnAKKyAgICAke1dFQlBfREVQX0lNR19MSUJSQVJJRVN9KQorCisgICMgSW1hZ2UtZW5jb2RpbmcgdXRpbGl0eSBsaWJyYXJ5LgorICBwYXJzZV9NYWtlZmlsZV9hbSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vaW1hZ2VpbyAiSU1BR0VFTkNfU1JDUyIKKyAgICAiaW1hZ2VlbmNfW14gXSoiKQorICBhZGRfbGlicmFyeShpbWFnZWVuYyAke0lNQUdFRU5DX1NSQ1N9KQorICB0YXJnZXRfbGlua19saWJyYXJpZXMoaW1hZ2VlbmMgd2VicCkKKworICBzZXRfcHJvcGVydHkoVEFSR0VUIGV4YW1wbGV1dGlsIGltYWdlaW91dGlsIGltYWdlZGVjIGltYWdlZW5jCisgICAgUFJPUEVSVFkgSU5DTFVERV9ESVJFQ1RPUklFUworICAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9zcmMgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3NyYykKK2VuZGlmKCkKKworaWYoV0VCUF9CVUlMRF9EV0VCUCkKKyAgIyBkd2VicAorICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7V0VCUF9ERVBfSU1HX0lOQ0xVREVfRElSU30pCisgIHBhcnNlX01ha2VmaWxlX2FtKCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9leGFtcGxlcyAiRFdFQlBfU1JDUyIKKyAgICAiZHdlYnAiKQorICBhZGRfZXhlY3V0YWJsZShkd2VicCAke0RXRUJQX1NSQ1N9KQorICB0YXJnZXRfbGlua19saWJyYXJpZXMoZHdlYnAgZXhhbXBsZXV0aWwgaW1hZ2VkZWMgaW1hZ2VlbmMgd2VicGRlY29kZXIpCisgIGluc3RhbGwoVEFSR0VUUyBkd2VicCBSVU5USU1FIERFU1RJTkFUSU9OIGJpbikKKyAgc2V0X3Byb3BlcnR5KFRBUkdFVCBkd2VicCBQUk9QRVJUWSBJTkNMVURFX0RJUkVDVE9SSUVTCisgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3NyYyAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vc3JjKQorZW5kaWYoKQorCitpZihXRUJQX0JVSUxEX0NXRUJQKQorICAjIGN3ZWJwCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtXRUJQX0RFUF9JTUdfSU5DTFVERV9ESVJTfSkKKyAgcGFyc2VfTWFrZWZpbGVfYW0oJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2V4YW1wbGVzICJDV0VCUF9TUkNTIgorICAgICJjd2VicCIpCisgIGFkZF9leGVjdXRhYmxlKGN3ZWJwICR7Q1dFQlBfU1JDU30pCisgIHRhcmdldF9saW5rX2xpYnJhcmllcyhjd2VicCBleGFtcGxldXRpbCBpbWFnZWRlYyB3ZWJwKQorICBpbnN0YWxsKFRBUkdFVFMgY3dlYnAgUlVOVElNRSBERVNUSU5BVElPTiBiaW4pCisgIHNldF9wcm9wZXJ0eShUQVJHRVQgY3dlYnAgUFJPUEVSVFkgSU5DTFVERV9ESVJFQ1RPUklFUworICAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9zcmMgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3NyYykKK2VuZGlmKCkKKworaWYoV0VCUF9CVUlMRF9HSUYyV0VCUCBBTkQgTk9UIEdJRl9GT1VORCkKKyAgdW5zZXQoV0VCUF9CVUlMRF9HSUYyV0VCUCBDQUNIRSkKK2VuZGlmKCkKKworaWYoV0VCUF9CVUlMRF9HSUYyV0VCUCBPUiBXRUJQX0JVSUxEX0lNRzJXRUJQKQorICBwYXJzZV9NYWtlZmlsZV9hbSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vc3JjL211eCAiV0VCUF9NVVhfU1JDUyIKKyAgICAiIikKKyAgYWRkX2xpYnJhcnkod2VicG11eCAke1dFQlBfTVVYX1NSQ1N9KQorICB0YXJnZXRfbGlua19saWJyYXJpZXMod2VicG11eCB3ZWJwKQorICBwYXJzZV92ZXJzaW9uKG11eC9NYWtlZmlsZS5hbSB3ZWJwbXV4IFdFQlBfTVVYX1NPVkVSU0lPTikKKyAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKHdlYnBtdXggUFJPUEVSVElFUyBWRVJTSU9OICR7UEFDS0FHRV9WRVJTSU9OfQorICAgIFNPVkVSU0lPTiAke1dFQlBfTVVYX1NPVkVSU0lPTn0pCisgIGxpc3QoQVBQRU5EIElOU1RBTExFRF9MSUJSQVJJRVMgd2VicG11eCkKK2VuZGlmKCkKKworaWYoV0VCUF9CVUlMRF9HSUYyV0VCUCkKKyAgIyBnaWYyd2VicAorICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7V0VCUF9ERVBfR0lGX0lOQ0xVREVfRElSU30pCisgIHBhcnNlX01ha2VmaWxlX2FtKCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9leGFtcGxlcyAiR0lGMldFQlBfU1JDUyIKKyAgICAiZ2lmMndlYnAiKQorICBhZGRfZXhlY3V0YWJsZShnaWYyd2VicCAke0dJRjJXRUJQX1NSQ1N9KQorICB0YXJnZXRfbGlua19saWJyYXJpZXMoZ2lmMndlYnAgZXhhbXBsZXV0aWwgaW1hZ2Vpb3V0aWwgd2VicCB3ZWJwbXV4CisgICAgJHtXRUJQX0RFUF9HSUZfTElCUkFSSUVTfSkKKyAgaW5zdGFsbChUQVJHRVRTIGdpZjJ3ZWJwIFJVTlRJTUUgREVTVElOQVRJT04gYmluKQorICBzZXRfcHJvcGVydHkoVEFSR0VUIGdpZjJ3ZWJwIFBST1BFUlRZIElOQ0xVREVfRElSRUNUT1JJRVMKKyAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vc3JjICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9zcmMpCitlbmRpZigpCisKK2lmKFdFQlBfQlVJTERfSU1HMldFQlApCisgICMgaW1nMndlYnAKKyAgaW5jbHVkZV9kaXJlY3Rvcmllcygke1dFQlBfREVQX0lNR19JTkNMVURFX0RJUlN9KQorICBwYXJzZV9NYWtlZmlsZV9hbSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vZXhhbXBsZXMgIklNRzJXRUJQX1NSQ1MiCisgICAgImltZzJ3ZWJwIikKKyAgYWRkX2V4ZWN1dGFibGUoaW1nMndlYnAgJHtJTUcyV0VCUF9TUkNTfSkKKyAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGltZzJ3ZWJwIGV4YW1wbGV1dGlsIGltYWdlZGVjIGltYWdlaW91dGlsIHdlYnAgd2VicG11eCkKKyAgaW5zdGFsbChUQVJHRVRTIGltZzJ3ZWJwIFJVTlRJTUUgREVTVElOQVRJT04gYmluKQorICBzZXRfcHJvcGVydHkoVEFSR0VUIGltZzJ3ZWJwIFBST1BFUlRZIElOQ0xVREVfRElSRUNUT1JJRVMKKyAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vc3JjICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9zcmMpCitlbmRpZigpCisKK2lmIChXRUJQX0JVSUxEX1dFQlBJTkZPKQorICAjIHdlYnBpbmZvCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtXRUJQX0RFUF9JTUdfSU5DTFVERV9ESVJTfSkKKyAgcGFyc2VfTWFrZWZpbGVfYW0oJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2V4YW1wbGVzICJXRUJQSU5GT19TUkNTIgorICAgICJ3ZWJwaW5mbyIpCisgIGFkZF9leGVjdXRhYmxlKHdlYnBpbmZvICR7V0VCUElORk9fU1JDU30pCisgIHRhcmdldF9saW5rX2xpYnJhcmllcyh3ZWJwaW5mbyBleGFtcGxldXRpbCBpbWFnZWlvdXRpbCkKKyAgaW5zdGFsbChUQVJHRVRTIHdlYnBpbmZvIFJVTlRJTUUgREVTVElOQVRJT04gYmluKQorICBzZXRfcHJvcGVydHkoVEFSR0VUIHdlYnBpbmZvIFBST1BFUlRZIElOQ0xVREVfRElSRUNUT1JJRVMKKyAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vc3JjICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9zcmMpCitlbmRpZigpCisKK2lmKFdFQlBfQlVJTERfV0VCUF9KUykKKyAgIyBKYXZhU2NyaXB0IHZlcnNpb24KKyAgYWRkX2V4ZWN1dGFibGUod2VicF9qcworICAgICAgICAgICAgICAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vZXh0cmFzL3dlYnBfdG9fc2RsLmMpCisgIHRhcmdldF9saW5rX2xpYnJhcmllcyh3ZWJwX2pzIHdlYnBkZWNvZGVyIFNETCkKKyAgc2V0KFdFQlBfSEFWRV9TREwgMSkKKyAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKHdlYnBfanMgUFJPUEVSVElFUyBMSU5LX0ZMQUdTCisgICAgICAiLXMgRVhQT1JURURfRlVOQ1RJT05TPSdbXCJfV2VicFRvU0RMXCJdJyAtcyBJTlZPS0VfUlVOPTAgXAorICAgICAgIC1zIEVYVFJBX0VYUE9SVEVEX1JVTlRJTUVfTUVUSE9EUz0nW1wiY3dyYXBcIl0nIikKKyAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKHdlYnBfanMgUFJPUEVSVElFUyBPVVRQVVRfTkFNRSB3ZWJwKQorICB0YXJnZXRfY29tcGlsZV9kZWZpbml0aW9ucyh3ZWJwX2pzIFBVQkxJQyBFTVNDUklQVEVOIFdFQlBfSEFWRV9TREwpCisKKyAgIyBXQVNNIHZlcnNpb24KKyAgYWRkX2V4ZWN1dGFibGUod2VicF93YXNtCisgICAgICAgICAgICAgICAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9leHRyYXMvd2VicF90b19zZGwuYykKKyAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKHdlYnBfd2FzbSB3ZWJwZGVjb2RlciBTREwpCisgIHNldF90YXJnZXRfcHJvcGVydGllcyh3ZWJwX3dhc20gUFJPUEVSVElFUyBMSU5LX0ZMQUdTCisgICAgICAiLXMgV0FTTT0xIC1zICdCSU5BUllFTl9NRVRIT0Q9XCJuYXRpdmUtd2FzbVwiJyBcCisgICAgICAgLXMgRVhQT1JURURfRlVOQ1RJT05TPSdbXCJfV2VicFRvU0RMXCJdJyAtcyBJTlZPS0VfUlVOPTAgXAorICAgICAgIC1zIEVYVFJBX0VYUE9SVEVEX1JVTlRJTUVfTUVUSE9EUz0nW1wiY3dyYXBcIl0nIikKKyAgdGFyZ2V0X2NvbXBpbGVfZGVmaW5pdGlvbnMod2VicF93YXNtIFBVQkxJQyBFTVNDUklQVEVOIFdFQlBfSEFWRV9TREwpCisKKyAgdGFyZ2V0X2NvbXBpbGVfZGVmaW5pdGlvbnMod2VicGRlY29kZXIgUFVCTElDIEVNU0NSSVBURU4pCitlbmRpZigpCisKKyMgR2VuZXJhdGUgdGhlIGNvbmZpZy5oIGZpbGUuCitjb25maWd1cmVfZmlsZSgke0NNQUtFX0NVUlJFTlRfTElTVF9ESVJ9L2NtYWtlL2NvbmZpZy5oLmluCisgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9zcmMvd2VicC9jb25maWcuaCkKK2FkZF9kZWZpbml0aW9ucygtREhBVkVfQ09ORklHX0gpCisjIFRoZSB3ZWJwIGZvbGRlciBpcyBpbmNsdWRlZCBhcyB3ZSByZWZlcmVuY2UgY29uZmlnLmggYXMKKyMgLi4vd2VicC9jb25maWcuaCBvciB3ZWJwL2NvbmZpZy5oCitpbmNsdWRlX2RpcmVjdG9yaWVzKCR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSkKKworIyBJbnN0YWxsIHRoZSBkaWZmZXJlbnQgaGVhZGVycyBhbmQgbGlicmFyaWVzLgoraW5zdGFsbChGSUxFUyAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vc3JjL3dlYnAvZGVjb2RlLmgKKyAgICAgICAgICAgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3NyYy93ZWJwL2RlbXV4LmgKKyAgICAgICAgICAgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3NyYy93ZWJwL2VuY29kZS5oCisgICAgICAgICAgICAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9zcmMvd2VicC9tdXguaAorICAgICAgICAgICAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vc3JjL3dlYnAvbXV4X3R5cGVzLmgKKyAgICAgICAgICAgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3NyYy93ZWJwL3R5cGVzLmgKKyAgICAgICAgREVTVElOQVRJT04gaW5jbHVkZS93ZWJwKQoraW5zdGFsbChUQVJHRVRTICR7SU5TVEFMTEVEX0xJQlJBUklFU30KKyAgICAgICAgTElCUkFSWSBERVNUSU5BVElPTiBsaWIKKyAgICAgICAgQVJDSElWRSBERVNUSU5BVElPTiBsaWIpCisKKyMgQ3JlYXRlIHRoZSBDTWFrZSB2ZXJzaW9uIGZpbGUuCitpbmNsdWRlKENNYWtlUGFja2FnZUNvbmZpZ0hlbHBlcnMpCit3cml0ZV9iYXNpY19wYWNrYWdlX3ZlcnNpb25fZmlsZSgKKyAgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9XZWJQQ29uZmlnVmVyc2lvbi5jbWFrZSIKKyAgVkVSU0lPTiAke1BBQ0tBR0VfVkVSU0lPTn0KKyAgQ09NUEFUSUJJTElUWSBBbnlOZXdlclZlcnNpb24KKykKKworIyBDcmVhdGUgdGhlIENvbmZpZyBmaWxlLgoraW5jbHVkZShDTWFrZVBhY2thZ2VDb25maWdIZWxwZXJzKQorc2V0KENvbmZpZ1BhY2thZ2VMb2NhdGlvbiBzaGFyZS9XZWJQL2NtYWtlLykKK2NvbmZpZ3VyZV9wYWNrYWdlX2NvbmZpZ19maWxlKAorICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vY21ha2UvV2ViUENvbmZpZy5jbWFrZS5pbgorICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vV2ViUENvbmZpZy5jbWFrZQorICBJTlNUQUxMX0RFU1RJTkFUSU9OICR7Q29uZmlnUGFja2FnZUxvY2F0aW9ufQorKQorCisjIEluc3RhbGwgdGhlIGdlbmVyYXRlZCBDTWFrZSBmaWxlcy4KK2luc3RhbGwoCisgIEZJTEVTICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vV2ViUENvbmZpZ1ZlcnNpb24uY21ha2UiCisgICAgICAgICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vV2ViUENvbmZpZy5jbWFrZSIKKyAgREVTVElOQVRJT04gJHtDb25maWdQYWNrYWdlTG9jYXRpb259CispCisKKyMgSW5zdGFsbCB0aGUgbWFuIHBhZ2VzLgorc2V0KE1BTl9QQUdFUyBjd2VicC4xIGR3ZWJwLjEgZ2lmMndlYnAuMSBpbWcyd2VicC4xIHZ3ZWJwLjEgd2VicG11eC4xCisgIHdlYnBpbmZvLjEpCitzZXQoRVhFQ19CVUlMRFMgIkNXRUJQIiAiRFdFQlAiICJHSUYyV0VCUCIgIklNRzJXRUJQIiAiVldFQlAiICJXRUJQTVVYIgorICAiV0VCUElORk8iKQorbGlzdChMRU5HVEggTUFOX1BBR0VTIE1BTl9QQUdFU19MRU5HVEgpCittYXRoKEVYUFIgTUFOX1BBR0VTX1JBTkdFICIke01BTl9QQUdFU19MRU5HVEh9IC0gMSIpCisKK2ZvcmVhY2goSV9NQU4gUkFOR0UgJHtNQU5fUEFHRVNfUkFOR0V9KQorICBsaXN0KEdFVCBFWEVDX0JVSUxEUyAke0lfTUFOfSBFWEVDX0JVSUxEKQorICBpZihXRUJQX0JVSUxEXyR7RVhFQ19CVUlMRH0pCisgICAgbGlzdChHRVQgTUFOX1BBR0VTICR7SV9NQU59IE1BTl9QQUdFKQorICAgIGluc3RhbGwoRklMRVMgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L21hbi8ke01BTl9QQUdFfQorICAgICAgREVTVElOQVRJT04gJHtDTUFLRV9JTlNUQUxMX1BSRUZJWH0vc2hhcmUvbWFuL21hbjEKKyAgICAgIENPTVBPTkVOVCBkb2MKKyAgICApCisgIGVuZGlmKCkKK2VuZGZvcmVhY2goKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvQ09QWUlORyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL0NPUFlJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E2Zjk5NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL0NPUFlJTkcKQEAgLTAsMCArMSwzMCBAQAorQ29weXJpZ2h0IChjKSAyMDEwLCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKK21ldDoKKworICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgICAgZGlzdHJpYnV0aW9uLgorCisgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heQorICAgIGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCitMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKK0EgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCitIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCitTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCitMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKK0RBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCitPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9DaGFuZ2VMb2cgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9DaGFuZ2VMb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZkOWFjZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL0NoYW5nZUxvZwpAQCAtMCwwICsxLDM4NTIgQEAKKzhkNTEwNzUxIHdlYnAtY29udGFpbmVyLXNwZWM6IGNvcnJlY3QgZnJhbWUgZHVyYXRpb249MCBub3RlCitlNmIyMTY0ZSB2d2VicDogQ29weSBDaHJvbWUncyBiZWhhdmlvciB3L2ZyYW1lIGR1cmF0aW9uID09IDAKK2QyMGI3NzA3IHVwZGF0ZSBDaGFuZ2VMb2cgKHRhZzogdjEuMC4wLXJjMykKKzBkNWZhZDQ2IGFkZCBXRUJQX0RTUF9JTklUIC8gV0VCUF9EU1BfSU5JVF9GVU5DCitjMWNiODZhZiBmaXggMTZiIG92ZXJmbG93IGluIFNTRTIKK2U1NzdmZWI3IG1ha2VmaWxlLnVuaXg6IGFkZCBERUJVRyBmbGFnIGZvciBjb21waWxpbmcgdy8gZGVidWctc3ltYm9sCis5OWJlMzRiMyBjd2VicCxnZXRfZGlzdG86IGZpeCBicHAgb3V0cHV0CitmNTU2NWNhOCBjbWFrZTogTWFrZSBzdXJlIHdlIHVzZSBuZWFyLWxvc3NsZXNzIGJ5IGRlZmF1bHQuCitkODk4ZGMxNCBmaXggYnVnIGluIFdlYlBJbXBvcnQ1NjU6IGFscGhhIHZhbHVlIHdhcyBub3Qgc2V0Cis4ODI3ODRiMCB1cGRhdGUgQ2hhbmdlTG9nICh0YWc6IHYxLjAuMC1yYzIpCisyZjkzMGUwOCBSZXZlcnQgIlVzZSBwcm9wZXIgdGFyZ2V0cyBmb3IgQ01ha2UuIgorODE2NWU4ZmIgVXNlIHByb3BlciB0YXJnZXRzIGZvciBDTWFrZS4KKzNmMTU3ZGQ1IFJlbW92ZSBzb21lIHZlcnkgaGFyZCBUT0RPcy4KK2NkNzU4YTE3IHtkZSx9bXV4L01ha2VmaWxlLmFtOiBhZGQgbWlzc2luZyBoZWFkZXJzCitiODkyYjhiYSBtYWtlZmlsZS51bml4LGRpc3Q6IHVzZSBhc2NpaSBmb3IgdGV4dCBvdXRwdXQKKzY0YTU3ZDA1IGFkZCAtdmVyc2lvbiBvcHRpb24gdG8gYW5pbV9kdW1wLGFuaW1fZGlmZiBhbmQgaW1nMndlYnAKK2ZjMWI4ZTNhIHdlYnBfanM6IGZpeCB3ZWJwX2pzIGRlbW8gaHRtbAorMTVhYTQ4ZDkgdXBkYXRlIENoYW5nZUxvZyAodGFnOiB2MS4wLjAtcmMxKQorZTYwN2RhYmMgdXBkYXRlIEFVVEhPUlMKKzM4NDEwYzA4IFtDRkldIFJlbW92ZSBmdW5jdGlvbiBwb2ludGVyIGNhc3RzCitjNTdiMjczNiBidW1wIHZlcnNpb24gdG8gMS4wLjAKK2NiYTI4ODUzIHVwZGF0ZSBORVdTCitjOTA5ZDUzMSBNZXJnZSAicmVtb3ZlIHNvbWUgZGVwcmVjYXRpb24gd2FybmluZyBvbiBNYWNPU1giCisyMTc0NDNjNyByZW1vdmUgc29tZSBkZXByZWNhdGlvbiB3YXJuaW5nIG9uIE1hY09TWAorYjY3MmJkZmEgY29uZmlndXJlOiBxdWlldCBnbHV0IGRlcHJlY2F0aW9uIHdhcm5pbmdzIG9uIE9TIFgKK2RhYTlmY2FmIGNvbmZpZ3VyZTogdXNlIHNkbC1jb25maWcgaWYgYXZhaWxhYmxlCitkZDE3NGNhZSBNZXJnZSAiaW1hZ2VkZWM6IHN1cHBvcnQgbWV0YWRhdGEgcmVhZGluZyBmb3IgV2ViUCBpbWFnZSBkZWNvZGluZyIKKzY0MWNlZGNjIGltYWdlZGVjOiBzdXBwb3J0IG1ldGFkYXRhIHJlYWRpbmcgZm9yIFdlYlAgaW1hZ2UgZGVjb2RpbmcKKzA2NWIyY2UxIGFuaW1fZGlmZjogYWRkIGEgY291cGxlIG1pc3NpbmcgbmV3bGluZXMgaW4gSGVscCgpCitjNGNjMTE0NyBNZXJnZSAiZ2lmMndlYnA6IGZvcmNlIGxvdyBkdXJhdGlvbiBmcmFtZXMgdG8gMTAwbXMiCiswOTMzMzA5NyBnaWYyd2VicDogZm9yY2UgbG93IGR1cmF0aW9uIGZyYW1lcyB0byAxMDBtcworZTAzZjBlYzMgc2hhcnBfeXV2OiB1c2UgMTRiIGZpeGVkLXBvaW50IHByZWNpc2lvbiBmb3IgZ2FtbWEKK2IyZGIzNjFjIGltYWdlX2VuYyxXZWJQV3JpdGVQTkc6IG1vdmUgbG9jYWxzIGFmdGVyIHNldGptcAorNzRlODJlYzYgTWVyZ2UgIldlYlBQaWN0dXJlRGlzdG9ydGlvbjogZml4IGJpZy1lbmRpYW4gcmVzdWx0cyBvcmRlciIKKzY0NWQwNGNhIE1lcmdlICJjd2VicCxnZXRfZGlzdG86IHJlcG9ydCBicHAiCisxMjBmNThjMyBNZXJnZSAibG9zc2xlc3Mqc3NlMjogaW1wcm92ZSBub24tY29uc3QgMTYtYml0IHZlY3RvciBjcmVhdGlvbiIKK2E3ZmU5NDEyIFdlYlBQaWN0dXJlRGlzdG9ydGlvbjogZml4IGJpZy1lbmRpYW4gcmVzdWx0cyBvcmRlcgorZTI2ZmUwNjYgY3dlYnAsZ2V0X2Rpc3RvOiByZXBvcnQgYnBwCis5ZGY2NGUyOCBNZXJnZSBjaGFuZ2VzIElkNWI0YTFhNCxJYTIwY2U4NDQKKzgwNDM1MDRmIGxvc3NsZXNzKnNzZTI6IGltcHJvdmUgbm9uLWNvbnN0IDE2LWJpdCB2ZWN0b3IgY3JlYXRpb24KKzFlM2RmYzQ4IEltcG9ydDogZXh0cmFjdCBjb25kaXRpb24gZnJvbSBsb29wCiszYjA3ZDMyNyBJbXBvcnQsUkdCQTogZml4IGZvciBCaWdFbmRpYW4gaW1wb3J0Cis1NTE5NDhlNCBSZW1vdmUgdW51c2VkIGFyZ3VtZW50IGluIFZQOExCaXRzRW50cm9weS4KKzMwMDUyMzdhIFJlYWRXZWJQOiBmaXggZm9yIGJpZy1lbmRpYW4KKzQ5OWMzOTVhIE1lcmdlICJhbmltX2RpZmY6IGV4cG9zZSB0aGUgLW1heF9kaWZmIG9wdGlvbiIKK2Y2OWRjZDY5IE1lcmdlICJyZW1vdmUgV0VCUF9FWFBFUklNRU5UQUxfRkVBVFVSRVMiCiswN2Q4ODRkNSBhbmltX2RpZmY6IGV4cG9zZSB0aGUgLW1heF9kaWZmIG9wdGlvbgorZjRkZDkyNTYgcmVtb3ZlIFdFQlBfRVhQRVJJTUVOVEFMX0ZFQVRVUkVTCis5NGE4Mzc3YiBleHRyYWN0IHRoZSBjb21tYW5kLWxpbmUgcGFyc2luZyBoZWxwZXJzIHRvIGV4YW1wbGVfdXRpbAorZmMwOWU2ZTIgUE5NIGRlY29kZXI6IHByZXZlbnQgdW5zdXBwb3J0ZWQgZGVwdGg9MiBQQU0gY2FzZS4KKzZkZTU4NjAzIE1JUFM2NDogRml4IGRlZmluZWQtYnV0LW5vdC11c2VkIGVycm9ycyB3aXRoIFdFQlBfUkVEVUNFX0NTUAorY2JkZTU3MjggZ2lmMndlYnA6IGFkZCBzdXBwb3J0IGZvciByZWFkaW5nIGZyb20gc3RkaW4KK2NmMWM1MDU0IEFkZCBhbiBTU0U0IHZlcnNpb24gb2Ygc29tZSBsb3NzbGVzcyBjb2xvciB0cmFuc2Zvcm1zLgorNDVhOGI1ZWIgRml4IGxpbnQgZXJyb3Igd2l0aCBtYW4gcGFnZS4KK2NmZjM4ZThmIE1lcmdlICJQTkcgZGVjb2RlcjogaGFuZGxlIGdBTUEgY2h1bmsiCis1OWNiMWE0OCBNZXJnZSAiZW5hYmxlIGRjIGVycm9yLWRpZmZ1c2lvbiBhbHdheXMiCis3ODMxOGIzMCBQTkcgZGVjb2RlcjogaGFuZGxlIGdBTUEgY2h1bmsKKzY2NGMyMWRkIE1lcmdlICJyZW1vdmUgc29tZSBUT0RPcyIKKzgxNTY1MmRlIGVuYWJsZSBkYyBlcnJvci1kaWZmdXNpb24gYWx3YXlzCithZWM0NWNlYyByZW1vdmUgc29tZSBUT0RPcworNTcxNWRmY2UgZml4IGJsb2NrLWNvdW50W10gaW5jcmVtZW50IGluIGNhc2Ugb2YgbGFyZ2UgaW1hZ2UKK2MyZDA0ZjNlIGVuYWJsZSBEQyBlcnJvci1kaWZmdXNpb24gYWx3YXlzIGZvciBtdWx0aS1wYXNzCis5NmJmMDdjNSB1c2UgREMgZXJyb3IgZGlmZnVzaW9uIGZvciBVL1YgYXQgbG93LXF1YWxpdHkKKzFjNTkwMjBiIGZpeCBtaXNzaW5nIHNzZTQxIHRhcmdldHMgaW4gbWFrZWZpbGUudW5peAorN2E4ZTgxNGIgY29zbWV0aWNzOiBzL2NvbG9yX3NwYWNlL2NvbG9yc3BhY2UvCiswNWY2ZmUyNCB1cHNhbXBsaW5nOiBybSBhc3NlcnRzIHcvUkVEVUNFX0NTUCtPTUlUX0NfQ09ERQorYjRjZjU1OTcgTWVyZ2UgIlVwc2FtcGxpbmcgU1NFMi9TU0U0IHNwZWVkdXAuIgorY2NiZWIzMmMgTWFrZWZpbGUudmM6IGFkZCBtaXNzaW5nIHNzZTQxIGZpbGVzCis1NTQwM2E5YSBVcHNhbXBsaW5nIFNTRTIvU1NFNCBzcGVlZHVwLgorODA3YjUzYzQgSW1wbGVtZW50IHRoZSB1cHNhbXBsaW5nL3l1diBmdW5jdGlvbnMgaW4gU1NFNDEKKzg0MTAxYTgxIEZpeCB3YXNtIFdlYlAgY29tcGlsYXRpb24KKzhiZWJkMmEzIGZpeCB3YXJuaW5nIG9uIE1TVkMKK2E3ZjkzZmUzIHdlYnBtdXg6IGFsbG93IHJlYWRpbmcgYXJndW1lbnQgZnJvbSBhIGZpbGUKK2I2OWYxOGE3IGdpZjJ3ZWJwLjE6IGZpeCAtbG9vcF9jb21wYXRpYmlsaXR5IGxheW91dAorNzJkNTMwYzAgTWVyZ2UgImZpeCBsb3NzbGVzcyBkZWNvZGluZyB3L1dFQlBfUkVEVUNFX1NJWkUiCisyOTZjN2RjNCBmaXggbG9zc2xlc3MgZGVjb2Rpbmcgdy9XRUJQX1JFRFVDRV9TSVpFCiswZDVkMDI5YyBNZXJnZSAiSW1nSW9VdGlsUmVhZEZpbGU6IGZpeCBmaWxlIGxlYWsgdXBvbiBlcnJvciIKK2FlNTY4Y2U3IEltZ0lvVXRpbFJlYWRGaWxlOiBmaXggZmlsZSBsZWFrIHVwb24gZXJyb3IKKzc5NmI1YThhIE1lcmdlIHRhZyAndjAuNi4xJworNmI3YTk1ZmQgdXBkYXRlIENoYW5nZUxvZyAodGFnOiB2MC42LjEpCitmNjY5NTVkZSBXRUJQX1JFRFVDRV9DU1A6IHJlc3RyaWN0IGNvbG9yc3BhY2Ugc3VwcG9ydAorMWFmMGRmNzYgTWVyZ2UgIldFQlBfUkVEVUNFX0NTUDogcmVzdHJpY3QgY29sb3JzcGFjZSBzdXBwb3J0IgorNmRlMjBkZjAgV0VCUF9SRURVQ0VfQ1NQOiByZXN0cmljdCBjb2xvcnNwYWNlIHN1cHBvcnQKK2EyODlkOGU3IHVwZGF0ZSBDaGFuZ2VMb2cgKHRhZzogdjAuNi4xLXJjMikKK2MxMGE0OTNjIHZ3ZWJwOiBkaXNhYmxlIGRvdWJsZSBidWZmZXJpbmcgb24gd2luZG93cyAmIG1hYworMGQ0NDY2YzIgd2VicF90b19zZGwuYzogZml4IGZpbGUgbW9kZQorMWIyN2JmOGIgV0VCUF9SRURVQ0VfU0laRTogZGlzYWJsZSBhbGwgcmVzY2FsZXIgY29kZQorMTI2YmUxMDkgd2VicGluZm86IGFkZCAtdmVyc2lvbiBvcHRpb24KKzBkZjIyYjllIFdFQlBfUkVEVUNFX1NJWkU6IGRpc2FibGUgYWxsIHJlc2NhbGVyIGNvZGUKKzlhZGQ2MmI1IGJ1bXAgdmVyc2lvbiB0byAwLjYuMQorZDNlMjYxNDQgdXBkYXRlIE5FV1MKKzJlZGRhNjM5IFJFQURNRTogYWRkIHdlYnBpbmZvIHNlY3Rpb24KKzljYTU2OGVmIE1lcmdlICJyaWdodC1zaXplIHNvbWUgdGFibGVzIgorMzFmMTk5NWMgTWVyZ2UgIlNTRTIgaW1wbGVtZW50YXRpb24gb2YgSGFzQWxwaGFYWFgiCithODBjNDZiZCBTU0UyIGltcGxlbWVudGF0aW9uIG9mIEhhc0FscGhhWFhYCiswODM1MDdmMiByaWdodC1zaXplIHNvbWUgdGFibGVzCisyZTU3ODViMiBhbmltX3V0aWxzLmM6IHJlbW92ZSB3YXJuaW5nIHdoZW4gIWRlZmluZWQoV0VCUF9IQVZFX0dJRikKK2IyOTljNDdlIGFkZCBXRUJQX1JFRFVDRV9TSVpFCitmNTkzZDcxYSBlbmM6IGRpc2FibGUgcGljLT5zdGF0cy9leHRyYV9pbmZvIHcvV0VCUF9ESVNBQkxFX1NUQVRTCis1NDExNzlhOSBNZXJnZSAicHJlZGljdG9yX2VuYzogZml4IGJ1aWxkIHcvLS1kaXNhYmxlLW5lYXItbG9zc2xlc3MiCis1NzU1YTdlYyBwcmVkaWN0b3JfZW5jOiBmaXggYnVpbGQgdy8tLWRpc2FibGUtbmVhci1sb3NzbGVzcworZWFiNWJhYjcgYWRkIFdFQlBfRElTQUJMRV9TVEFUUworODA1MmM1ODUgcmVtb3ZlIHNvbWUgcGV0dHkgVE9ET3MgZnJvbSB2d2VicC4KK2MyNDUzNDNkIG1vdmUgTE9BRDh4NCBhbmQgU1RPUkU4eDIgY2xvc2VyIHRvIHRoZWlyIHVzZSBsb2NhdGlvbgorYjllNzM0ZmQgZGVjLGNvc21ldGljczogbm9ybWFsaXplIGZ1bmN0aW9uIG5hbWluZyBzdHlsZQorYzE4OGQ1NDYgZGVjOiBoYXJtb25pemUgZnVuY3Rpb24gc3VmZml4ZXMKKzI4YzVhYzgxIGRlY19zc2U0MTogaGFybW9uaXplIGZ1bmN0aW9uIHN1ZmZpeGVzCitlNjViNzJhMyBNZXJnZSAiaW50cm9kdWNlIFdlYlBIYXNBbHBoYThiIGFuZCBXZWJQSGFzQWxwaGEzMmIiCitiOTRjZWU5OCBkZWNfc3NlMjogcmVtb3ZlIEhFOHV2X1NTRTIKKzQ0YTBlZTNmIGludHJvZHVjZSBXZWJQSGFzQWxwaGE4YiBhbmQgV2ViUEhhc0FscGhhMzJiCithZWJmNTlhYyBNZXJnZSAiV2ViUFBpY3R1cmVBbGxvY0FSR0I6IGFsaWduIGFyZ2IgYWxsb2NhdGlvbiIKK2MxODQ2NjVlIFdlYlBQaWN0dXJlQWxsb2NBUkdCOiBhbGlnbiBhcmdiIGFsbG9jYXRpb24KKzNkYWY3NTA5IFdlYlBQYXJzZUhlYWRlcnM6IHJlbW92ZSBvYnNvbGV0ZSBhbmltYXRpb24gVE9ETworODAyODVkOTcgY21ha2U6IGF2b2lkIHNlY3VyaXR5IHdhcm5pbmdzIHVuZGVyIG1zdmMKKzY1MGVhYzU1IGNtYWtlOiBkb24ndCBzZXQgLVdhbGwgd2l0aCBNU1ZDCitjNDYyY2QwMCBSZW1vdmUgdXNlbGVzcyBjb2RlLgorMDFhOTgyMTcgTWVyZ2UgInJlbW92ZSBXZWJQV29ya2VySW1wbCBkZWNsYXJhdGlvbiBmcm9tIHRoZSBoZWFkZXIiCiszYzQ5ZmM0NyBNZXJnZSAidGhyZWFkX3V0aWxzOiBmaXggcG90ZW50aWFsbHkgYmFkIGNhbGwgdG8gRXhlY3V0ZSIKK2ZkZTI3ODJlIHRocmVhZF91dGlsczogZml4IHBvdGVudGlhbGx5IGJhZCBjYWxsIHRvIEV4ZWN1dGUKKzJhMjcwYzFkIHJlbW92ZSBXZWJQV29ya2VySW1wbCBkZWNsYXJhdGlvbiBmcm9tIHRoZSBoZWFkZXIKK2YxZjQzN2NjIHJlbW92ZSBtZW50aW9uIG9mICdsb3NzeS1vbmx5IHBhcmFtZXRlcnMnIGZyb20gdGhlIGRvYworMzg3OTA3NGQgTWVyZ2UgIldlYlBNZW1Ub1VpbnQzMjogcmVtb3ZlIHB0ciBjYXN0IHRvIGludCIKKzA0YjAyOWQyIFdlYlBNZW1Ub1VpbnQzMjogcmVtb3ZlIHB0ciBjYXN0IHRvIGludAorYjc5NzFkMGUgZHNwOiBhdm9pZCBkZWZpbmluZyBfQyBmdW5jdGlvbnMgdy9ORU9OIGJ1aWxkcworNmJhOTg3NjQgd2VicGRlYzogY29ycmVjdCBhbGxvYyBzaXplIGNoZWNrIHcvdXNlX2FyZ2IKKzVjZmIzYjBmIG5vcm1hbGl6ZSBpbmNsdWRlIGd1YXJkcworZjQzMzIwNWUgTWVyZ2UgY2hhbmdlcyBJYTE3YzdkZmMsSTc1NDIzYWJiLElhMmY3MTZiNCxJMTYxY2FhMTQsSTQyMTAwODFhLCAuLi4KKzhkMDMzYjE0IHtkZWMsZW5jfV9uZW9uOiBoYXJtb25pemUgZnVuY3Rpb24gc3VmZml4ZXMgeDIKKzAyOTVlOTgxIHVwc2FtcGxpbmdfbmVvbjogaGFybW9uaXplIGZ1bmN0aW9uIHN1ZmZpeGVzCitkNTcyYzRlNSB5dXZfbmVvbjogaGFybW9uaXplIGZ1bmN0aW9uIHN1ZmZpeGVzCithYjljMjUwMCByZXNjYWxlcl9uZW9uOiBoYXJtb25pemUgZnVuY3Rpb24gc3VmZml4ZXMKKzkzZTBjZTI3IGxvc3NsZXNzX25lb246IGhhcm1vbml6ZSBmdW5jdGlvbiBzdWZmaXhlcworMjJmYmM1MGUgbG9zc2xlc3NfZW5jX25lb246IGhhcm1vbml6ZSBmdW5jdGlvbiBzdWZmaXhlcworNDQ3ODc1YjQgZmlsdGVyc19uZW9uLGNvc21ldGljczogZml4IGluZGVudAorZTUxYmRkNDMgcmVtb3ZlIHVudXNlZCBWUDhUb2tlblRvU3RhdHMoKSBmdW5jdGlvbgorNzg1ZGE3ZWEgZW5jX25lb246IGhhcm1vbml6ZSBmdW5jdGlvbiBzdWZmaXhlcworYmMxYTI1MWYgZGVjX25lb246IGhhcm1vbml6ZSBmdW5jdGlvbiBzdWZmaXhlcworNjFlNTM1ZjEgZHNwL2xvc3NsZXNzOiB3b3JrYXJvdW5kIGdjYy00LjggYnVnIG9uIGFybQorNjhiMmVhYjcgY3dlYnA6IGZpeCBhbHBoYSByZXBvcnRpbmcgdy9sb3NzbGVzcyAmIG1ldGFkYXRhCiszMDA0MmZhYSBXZWJQRGVtdXhHZXRJOiBhZGQgZG9jIGRldGFpbHMgYXJvdW5kIFdlYlBGb3JtYXRGZWF0dXJlCiswYTE3ZjQ3MSBNZXJnZSAiV0lQOiBsaXN0IGluY2x1ZGVzIGFzIGRlc2NlbmRhbnRzIG9mIHRoZSBwcm9qZWN0IGRpciIKK2E0Mzk5NzIxIFdJUDogbGlzdCBpbmNsdWRlcyBhcyBkZXNjZW5kYW50cyBvZiB0aGUgcHJvamVjdCBkaXIKKzA4Mjc1NzA4IE1lcmdlICJNYWtlIHN1cmUgd2UgcmVhY2ggdGhlIGZ1bGwgcmFuZ2UgZm9yIGFscGhhIGJsZW5kaW5nLiIKK2QzNjFhNmE3IHl1dl9zc2UyOiBoYXJtb25pemUgZnVuY3Rpb24gc3VmZml4ZXMKKzY5MjFhYTZmIHVwc2FtcGxpbmdfc3NlMjogaGFybW9uaXplIGZ1bmN0aW9uIHN1ZmZpeGVzCiswOGM2N2QzZSBzc2ltX3NzZTI6IGhhcm1vbml6ZSBmdW5jdGlvbiBzdWZmaXhlcworNTgyYTFiNTcgcmVzY2FsZXJfc3NlMjogaGFybW9uaXplIGZ1bmN0aW9uIHN1ZmZpeGVzCisyYzFiMThiYSBsb3NzbGVzc19zc2UyOiBoYXJtb25pemUgZnVuY3Rpb24gc3VmZml4ZXMKKzBhYzQ2ZTgxIGxvc3NsZXNzX2VuY19zc2UyOiBoYXJtb25pemUgZnVuY3Rpb24gc3VmZml4ZXMKK2JjNjM0ZDU3IGVuY19zc2UyOiBoYXJtb25pemUgZnVuY3Rpb24gc3VmZml4ZXMKK2JjYjczNDdjIGRlY19zc2UyOiBoYXJtb25pemUgZnVuY3Rpb24gc3VmZml4ZXMKK2UxNGFkOTNjIE1ha2Ugc3VyZSB3ZSByZWFjaCB0aGUgZnVsbCByYW5nZSBmb3IgYWxwaGEgYmxlbmRpbmcuCis3MDM4Y2E4ZCBkZW11eCxTdG9yZUZyYW1lOiByZXN0b3JlIGhkciBzaXplIGNoZWNrIHRvIG1pbiByZXEKK2ZiM2RhYWQ2IGNwdTogZml4IHNzc2UzIGNoZWNrCitiZTU5MGUwNiBNZXJnZSAiRml4IENNYWtlIHJlZGVmaW5pdGlvbiBmb3IgSEFWRV9DUFVfRkVBVFVSRVNfSCIKKzM1ZjczNmUxIEZpeCBDTWFrZSByZWRlZmluaXRpb24gZm9yIEhBVkVfQ1BVX0ZFQVRVUkVTX0gKK2E1MjE2ZWZjIEZpeCBpbnRlZ2VyIG92ZXJmbG93IHdhcm5pbmcuCithOWM4OTE2YiBkZWNvZGUuaCxXZWJQSURlY0dldFJHQjogY2xhcmlmeSBvdXRwdXQgcHRyIHZhbGlkaXR5CiszYzc0YzY0NSBnaWYyd2VicDogaGFuZGxlIDEtZnJhbWUgY2FzZSBwcm9wZXJseSArIGZpeCBhbmltX2RpZmYKK2M3ZjI5NWQzIE1lcmdlICJnaWYyd2VicDogaW50cm9kdWNlIC1sb29wX2NvbXBhdGliaWxpdHkgb3B0aW9uIgorYjRlMDQ2NzcgZ2lmMndlYnA6IGludHJvZHVjZSAtbG9vcF9jb21wYXRpYmlsaXR5IG9wdGlvbgorZjc4ZGEzZGUgYWRkIExPQ0FMX0NMQU5HX1BSRVJFUSBhbmQgYXZvaWQgV09SS19BUk9VTkRfR0NDIHcvMy44KworMDFjNDI2ZjEgZGVmaW5lIFdFQlBfVVNFX0lOVFJJTlNJQ1Mgdy9nY2MtNC45KworODYzNTk3M2QgdXNlIHNkbC1jb25maWcgKGlmIGF2YWlsYWJsZSkgdG8gZGV0ZXJtaW5lIHRoZSBsaW5rIGZsYWdzCitlOTQ1OTM4MiB1c2UgQ1BQRkxBR1MgYmVmb3JlIENGTEFHUworNGE5ZDc4OGUgTWVyZ2UgIkFuZHJvaWQubWssbWlwczogZml4IGNsYW5nIGJ1aWxkIHdpdGggcjE1IgorNGZiZGM5ZmIgQW5kcm9pZC5tayxtaXBzOiBmaXggY2xhbmcgYnVpbGQgd2l0aCByMTUKK2E4MGZjYzRhIGlmZGVmIGNvZGUgbm90IHVzZWQgYnkgQ2hyb21lL0FuZHJvaWQuCiszOTkzYWYxMiBGaXggc2lnbmVkIGludGVnZXIgb3ZlcmZsb3dzLgorZjY2Zjk0ZWYgYW5pbV9kdW1wOiBzbWFsbCB0b29sIHRvIGR1bXAgZnJhbWVzIGZyb20gYW5pbWF0ZWQgV2ViUAorNmViYTg1N2IgTWVyZ2UgInJhdGlvbmFsaXplIHRoZSBNYWtlZmlsZS5hbSIKK2M1ZTM0ZmJhIGZ1bmN0aW9uIGRlZmluaXRpb24gY2xlYW51cAorMzgyMjc2MmEgcmF0aW9uYWxpemUgdGhlIE1ha2VmaWxlLmFtCis1MDFlZjZlNCBjb25maWd1cmUgc3R5bGUgZml4OiBhbmltZGlmZiAtPiBhbmltX2RpZmYKK2Y4YmRjMjY4IE1lcmdlICJwcm90ZWN0IGFnYWluc3QgTlVMTCBkdW1wX2ZvbGRlcltdIHZhbHVlIGluIFJlYWRBbmltYXRlZEltYWdlKCkiCisyM2JmYzY1MiBwcm90ZWN0IGFnYWluc3QgTlVMTCBkdW1wX2ZvbGRlcltdIHZhbHVlIGluIFJlYWRBbmltYXRlZEltYWdlKCkKKzhkYzNkNzFiIGNvc21ldGljcyxSZWFkQW5pbWF0ZWRXZWJQOiBjb3JyZWN0IGZ1bmN0aW9uIGNvbW1lbnQKKzViZDQwMDY2IE1lcmdlIGNoYW5nZXMgSTY2YTY0YTBhLEk0ZDJlNTIwZgorNzk0NTU3NWMgY29zbWV0aWNzLHdlYnBpbmZvOiByZW1vdmUgYW4gZWxzZSBhZnRlciBhIHJldHVybgorODcyOWZhMTEgY29zbWV0aWNzLGN3ZWJwOiByZW1vdmUgYW4gZWxzZSBhZnRlciBhIHJldHVybgorZjMyNGI3ZjkgY29zbWV0aWNzOiBub3JtYWxpemUgZm4gcHJvdG8gJiBkZWNsIHBhcmFtIG5hbWVzCis4NjllYjM2OSBDTWFrZSBjbGVhbnVwcy4KKzI4OWU2MmEzIFJlbW92ZSBkZWNsYXJhdGlvbiBvZiB1bmltcGxlbWVudGVkIFZQOEFwcGx5TmVhckxvc3NsZXNzUHJlZGljdAorMjBhOTQxODYgcG5tZGVjLFBBTTogdmFsaWRhdGUgZGVwdGggYmVmb3JlIGNhbGN1bGF0aW5nIGJ5dGVzX3Blcl9weAorMzQxMzBhZmUgYW5pbV9lbmNvZGU6IGZpeCBpbnRlZ2VyIG92ZXJmbG93Cis0MmM3OWFhNiBNZXJnZSAiRW5jb2RlcjogaGFybW9uaXplIGZ1bmN0aW9uIHN1ZmZpeGVzIgorYjA5MzA3ZGMgRW5jb2RlcjogaGFybW9uaXplIGZ1bmN0aW9uIHN1ZmZpeGVzCitiZWQwNDU2ZCBNZXJnZSAiU1NJTTogaGFybW9uaXplIHRoZSBmdW5jdGlvbiBzdWZmaXgiCis1NGY2YTNjZiBsb3NzbGVzc19zc2UyLmM6IGZpeCBzb21lIG1pc3NlZCBzdWZmaXggY2hhbmdlcworMDg4ZjFkY2MgU1NJTTogaGFybW9uaXplIHRoZSBmdW5jdGlvbiBzdWZmaXgKKzg2ZmM0ZGQ5IHdlYnBkZWM6IHVzZSBJbWdJb1V0aWxDaGVja1NpemVBcmd1bWVudHNPdmVyZmxvdworMDhlYTllY2QgaW1hZ2VpbzogYWRkIGFiaWxpdHkgcmVzdHJpY3QgbWF4IGltYWdlIHNpemUKKzZmOWRhYTRhIGpwZWdkZWMsUmVhZEVycm9yOiBmaXggbGVha3Mgb24gZXJyb3IKK2EwZjcyYTRmIFZQOExUcmFuc2Zvcm1Db2xvckZ1bmM6IGRyb3AgYW4gbm9uLXJlc3BlY3RlZCAnY29uc3QnIGZyb20gdGhlIHNpZ25hdHVyZS4KKzhjOTM0OTAyIE1lcmdlICJMb3NzZXNzIGRlYzogaGFybW9uaXplIHRoZSBmdW5jdGlvbiBzdWZmaXhlcyIKKzYyMjI0MmFhIExvc3Nlc3MgZGVjOiBoYXJtb25pemUgdGhlIGZ1bmN0aW9uIHN1ZmZpeGVzCisxNDExZjAyNyBMb3NzbGVzcyBFbmM6IGhhcm1vbml6ZSB0aGUgZnVuY3Rpb24gc3VmZml4ZXMKKzI0YWQyZTNjIGFkZCBjb25zdCB0byB0d28gdmFyaWFibGVzCis0NmVmZTA2MiBNZXJnZSAiQWxsb3cgdGhlIGxvc3NsZXNzIGNydW5jaGVyIHRvIHdvcmsgZm9yIGFscGhhLiIKKzhjM2Y5YTQ3IFNwZWVkLXVwIExaNzcuCisxYWVmNGM3MSBBbGxvdyB0aGUgbG9zc2xlc3MgY3J1bmNoZXIgdG8gd29yayBmb3IgYWxwaGEuCitiODgyMWRiZCBJbXByb3ZlIHRoZSBib3ggTFo3NyBzcGVlZC4KKzdiZWVkMjgwIGFkZCBtaXNzaW5nICgpcyB0byBtYWNybyBwYXJhbWV0ZXJzCis2NDczZDIwYiBNZXJnZSAiZml4IEFuZHJvaWQgc3RhbmRhbG9uZSB0b29sY2hhaW4gYnVpbGQiCitkY2VmZWQ5NSBNZXJnZSAiYnVpbGQuZ3JhZGxlOiBmaXggYXJtNjQgYnVpbGQiCiswYzgzYThiYyBNZXJnZSAieXV2OiBoYXJtb25pemUgc3VmZml4IG5hbWluZyIKK2M2ZDFkYjRiIGZpeCBBbmRyb2lkIHN0YW5kYWxvbmUgdG9vbGNoYWluIGJ1aWxkCis2NjNhNmQ5ZCB1bmlmeSB0aGUgQUxURVJOQVRFX0NPREUgZmxhZyB1c2FnZQorNzNlYTlmMjcgeXV2OiBoYXJtb25pemUgc3VmZml4IG5hbWluZworYzcxYjY4YWMgYnVpbGQuZ3JhZGxlOiBmaXggYXJtNjQgYnVpbGQKK2M0NTY4YjQ3IFJlc2NhbGVyOiBoYXJtb25pemUgdGhlIHN1ZmZpeCBuYW1pbmcKKzZjYjEzYjA1IE1lcmdlICJhbHBoYV9wcm9jZXNzaW5nOiBoYXJtb25pemUgdGhlIG5hbWluZyBzdWZmaXhlcyB0byBiZSBfQygpIgorODNhM2U2OWEgTWVyZ2UgInNpbXBsaWZ5IFdFQlBfRVhURVJOIG1hY3JvIgorNzI5NWZkZTIgTWVyZ2UgImZpbHRlcnM6IGhhcm1vbml6ZSB0aGUgc3VmZml4ZXMgbmFtaW5nIHRvIF9TU0UyKCksIF9DKCksIGV0Yy4iCis4ZTQyYmE0YyBzaW1wbGlmeSBXRUJQX0VYVEVSTiBtYWNybworMzMxYWIzNGIgY29zdCouYzogaGFybW9uaXplIHRoZSBzdWZmaXggbmFtaW5ncworYjE2MWY2NzAgZmlsdGVyczogaGFybW9uaXplIHRoZSBzdWZmaXhlcyBuYW1pbmcgdG8gX1NTRTIoKSwgX0MoKSwgZXRjLgorZGVjNWU0ZDMgYWxwaGFfcHJvY2Vzc2luZzogaGFybW9uaXplIHRoZSBuYW1pbmcgc3VmZml4ZXMgdG8gYmUgX0MoKQorNjg3OGQ0MjcgZml4IG1lbW9yeSBsZWFrIGluIFNETF9Jbml0KCkKKzQ2MWFlNTU1IE1lcmdlICJjb25maWd1cmU6IGZpeCB3YXJuaW5ncyBpbiBzZGwgY2hlY2siCis2MjQ4NmEyMiBjb25maWd1cmU6IHRlc3QgZm9yIC1XdW5kZWYKKzkyOTgyNjA5IGRzcC5oOiBmaXggLVd1bmRlZiB3L19fbWlwc19kc3BfcmV2CiswMjY1Y2VkZSBjb25maWd1cmU6IGZpeCB3YXJuaW5ncyBpbiBzZGwgY2hlY2sKKzg4YzczZDhhIGJhY2t3YXJkX3JlZmVyZW5jZXNfZW5jLmg6IGZpeCBXSU5ET1dfU0laRV9CSVRTIGNoZWNrCis0ZWE0OWY2YiByZXNjYWxlcl9zc2UyLmM6IGZpeCBXRUJQX1JFU0NBTEVSX0ZJWCAtPiBfUkZJWCB0eXBvCisxYjUyNjYzOCBDbGVhbi11cCBzb21lIENNYWtlCis4N2Y1N2E0YiBNZXJnZSAiY21ha2U6IGZpeCBnaWYgbGliIGRldGVjdGlvbiB3aGVuIGNyb3NzIGNvbXBpbGluZyIKK2IzNGE5ZGIxIGNvc21ldGljcyxkZWNfc3NlMjogcmVtb3ZlIHNvbWUgcmVkdW5kYW50IGNvbW1lbnRzCis0NzFjNTc1NSBjbWFrZTogZml4IGdpZiBsaWIgZGV0ZWN0aW9uIHdoZW4gY3Jvc3MgY29tcGlsaW5nCitjNzkzNDE3YSBjbWFrZTogZGlzYWJsZSBnaWYyd2VicCBpZiBnaWYgbGliIGlzbid0IGZvdW5kCitkY2JjMWM4OCBjbWFrZTogc3BsaXQgZ2lmIGRldGVjdGlvbiBmcm9tIElNRyBkZXBzCis2NmFkODRmMCBNZXJnZSAibXV4cmVhZDogcmVtb3ZlIHVucmVhY2hhYmxlIGNvZGUiCis1MGVjM2FiNyBtdXhyZWFkOiByZW1vdmUgdW5yZWFjaGFibGUgY29kZQorN2Q2N2ExNjQgTG9zc3kgZW5jb2Rpbmc6IHNtb290aGVuIHRyYW5zcGFyZW50IGFyZWFzIHRvIGltcHJvdmUgY29tcHJlc3Npb24KK2U1MDY1MGM3IE1lcmdlICJmaXggc2lnbmF0dXJlIGZvciBESVNBQkxFX1RPS0VOX0JVRkZFUiBjb21waWxhdGlvbiIKKzY3MWQyNTY3IGZpeCBzaWduYXR1cmUgZm9yIERJU0FCTEVfVE9LRU5fQlVGRkVSIGNvbXBpbGF0aW9uCitkNjc1NTU4MCBjcHUuY21ha2U6IHVzZSB1bmlxdWUgZmxhZyB0byB0ZXN0IHNpbWQgZGlzYWJsZSBmbGFncworMjg5MTQ1MjggTWVyZ2UgIlJlbW92ZSB0aGUgYXJnYiogZmlsZXMuIgorOGFjYjQ5NDIgUmVtb3ZlIHRoZSBhcmdiKiBmaWxlcy4KKzNiNjIzNDdiIFJFQURNRTogY29ycmVjdCBjbWFrZSBpbnZvY2F0aW9uIG5vdGUKKzdjYTBkZjEzIEhhdmUgdGhlIFNTRTIgdmVyc2lvbiBvZiBQYWNrQVJHQiB1c2UgY29tbW9uIGNvZGUuCis3YjI1MDQ1OSBNZXJnZSAiUmUtdXNlIHRoZSB0cmFuc2Zvcm1lZCBpbWFnZSB3aGVuIHRyeWluZyBzZXZlcmFsIExaNzcgaW4gbG9zc2xlc3MuIgorZTEzMjA3MmYgUmUtdXNlIHRoZSB0cmFuc2Zvcm1lZCBpbWFnZSB3aGVuIHRyeWluZyBzZXZlcmFsIExaNzcgaW4gbG9zc2xlc3MuCis1ZDdhNTBlZiBHZXQgY29kZSB0byBjb21waWxlIGluIEMrKy4KKzdiMDEyOTg3IGNvbmZpZ3VyZTogdGVzdCBmb3IgLVdwYXJlbnRoZXNlcy1lcXVhbGl0eQorZjA1NjlhZGIgRml4IG1hbiBwYWdlcyBmb3IgbXVsdGktdGhyZWFkaW5nLgorZjFkNWEzOTcgbXVsdGl0aHJlYWQgY3J1bmNoZXI6IG9ubHkgY29weSBzdGF0cyB3aGVuIHBpY3R1cmUtPnN0YXRzICE9IE5VTEwKK2Y4YzJhYzE1IE11bHRpLXRocmVhZCB0aGUgbG9zc2xlc3MgY3J1bmNoZXIuCithODhjNjUyMiBNZXJnZSAiSW50ZWdyYXRlIGEgbmV3IExaNzcgbG9va2luZyBmb3IgbWF0Y2hlcyBpbiB0aGUgbmVpZ2hib3Job29kIG9mIGEgcGl4ZWwgb25seS4iCis4ZjZkZjFkMCBVbnJvbGwgUHJlZGljdG9ycyAxMCwgMTEgYW5kIDEyLgorMzU1YzNkMWIgSW50ZWdyYXRlIGEgbmV3IExaNzcgbG9va2luZyBmb3IgbWF0Y2hlcyBpbiB0aGUgbmVpZ2hib3Job29kIG9mIGEgcGl4ZWwgb25seS4KK2ExNzc5YTAxIFJlZmFjdG9yIExaNzcgaGFuZGxpbmcgaW4gcHJlcGFyYXRpb24gZm9yIGEgbmV3IG1ldGhvZC4KKzY3ZGU2OGI1IEFuZHJvaWQubWsvYnVpbGQuZ3JhZGxlOiBmaXggbWlwcyBidWlsZCB3aXRoIGNsYW5nIGZyb20gcjE0YgorZjIwOWE1NDggVXNlIHRoZSBwbGFuZSBjb2RlIGFuZCBub3QgdGhlIGRpc3RhbmNlIHdoZW4gY29tcHV0aW5nIHN0YXRpc3RpY3MuCitiOTAzYjgwYyBTcGxpdCBjb3N0LWJhc2VkIGJhY2t3YXJkIHJlZmVyZW5jZXMgaW4gaXRzIG93biBmaWxlLgorNDk4Y2FkMzQgQ29zbWV0aWMgY2hhbmdlcyBpbiBiYWNrd2FyZCByZWZlcmVuY2UuCitlNGViNDU4NyBsb3NzbGVzcywgVlA4TFRyYW5zZm9ybUNvbG9yX0M6IG1ha2Ugc3VyZSBubyBvdmVyZmxvdyBoYXBwZW5zIHdpdGggY29sb3JzLgorYWY2ZGVhZmYgd2VicGluZm86IGhhbmRsZSBhbHBoYSBmbGFnIG1pc21hdGNoCis3Y2FlZjI5YiBGaXggdHlwbyB0aGF0IGNyZWVwZWQgaW4uCiszOWUxOWY5MiBNZXJnZSAibmVhciBsb3NzbGVzczogZml4IHVuc2lnbmVkIGludCBvdmVyZmxvdyB3YXJuaW5ncy4iCis5YmJjMDg5MSBuZWFyIGxvc3NsZXNzOiBmaXggdW5zaWduZWQgaW50IG92ZXJmbG93IHdhcm5pbmdzLgorZTExMThkNjIgTWVyZ2UgImNvc21ldGljcyxGaW5kQ2xvc2VzdERpc2NyZXRpemVkOiB1c2UgdWludCBpbiBtYXNrIGNyZWF0aW9uIgorMTg2YmM5YjcgTWVyZ2UgIndlYnBpbmZvOiB0b2xlcmF0ZSBBTFBIK1ZQOEwiCitiNTg4NzI5NyBjb3NtZXRpY3MsRmluZENsb3Nlc3REaXNjcmV0aXplZDogdXNlIHVpbnQgaW4gbWFzayBjcmVhdGlvbgorZjE3ODRhZWUgbmVhcl9sb3NzbGVzcyxGaW5kQ2xvc2VzdERpc2NyZXRpemVkOiB1c2UgdW5zaWduZWQgb3BzCiswZDIwYWJiMyB3ZWJwaW5mbzogdG9sZXJhdGUgQUxQSCtWUDhMCis5NzIxMDRiMyB3ZWJwbXV4OiB0b2xlcmF0ZSBmYWxzZSBwb3NpdGl2ZSBBbHBoYSBmbGFnCitkZDdlODNjYyB0aWZmZGVjLFJlYWRUSUZGOiBlbnN1cmUgZGF0YV9zaXplIGlzIDwgdHNpemVfdCBtYXgKK2Q5ODhlYjdiIHRpZmZkZWMsTXlSZWFkOiBxdWlldCAtV3Nob3J0ZW4tNjQtdG8tMzIgd2FybmluZworZGFiZGE3MDcgd2VicGluZm86IGFkZCBzdXBwb3J0IHRvIHBhcnNlIEFscGhhIGJpdHN0cmVhbQorNGMxMTc2NDMgd2VicGluZm86IGNvcnJlY3QgYmFja2dyb3VuZCBjb2xvciBvdXRwdXQsIEJHUkEtPkFSR0IKK2RlZmM5OGQ3IERvYzogY2xhcmlmeSB0aGUgcm9sZSBvZiBxdWFsaXR5IGluIFdlYlBDb25maWcuCitkNzhmZjc4MCBNZXJnZSAiRml4IGNvZGUgdG8gY29tcGlsZSB3aXRoIEMrKy4iCitjOGYxNDA5MyBGaXggY29kZSB0byBjb21waWxlIHdpdGggQysrLgorNDk3ZGM2YTcgcG5tZGVjOiBzYW5pdGl6ZSBpbnZhbGlkIGhlYWRlciBvdXRwdXQKK2Q3OGU1ODY3IE1lcmdlICJjb25maWd1cmU6IHRlc3QgZm9yIC1XY29uc3RhbnQtY29udmVyc2lvbiIKKzQ4MWU5MWViIE1lcmdlICJwbm1kZWMsUEFNOiBzZXQgYnl0ZXNfcGVyX3B4IGJhc2VkIG9uIGRlcHRoIHdoZW4gbWlzc2luZyIKKzkzYjEyNzUzIGNvbmZpZ3VyZTogdGVzdCBmb3IgLVdjb25zdGFudC1jb252ZXJzaW9uCis2NDVmMGM1MyBwbm1kZWMsUEFNOiBzZXQgYnl0ZXNfcGVyX3B4IGJhc2VkIG9uIGRlcHRoIHdoZW4gbWlzc2luZworZTkxNTQ2MDUgTWVyZ2UgInZ3ZWJwOiBhY3RpdmF0ZSBHTFVUIGRvdWJsZS1idWZmZXJpbmciCis4MThkNzk1YiB2d2VicDogYWN0aXZhdGUgR0xVVCBkb3VibGUtYnVmZmVyaW5nCitkNjNlNmY0YiBBZGQgYSBtYW4gcGFnZSBmb3Igd2VicGluZm8KKzRkNzA4NDM1IE1lcmdlICJORU9OOiBpbXBsZW1lbnQgQ29udmVydFJHQjI0VG9ZL0JHUjI0L0FSR0IvUkdCQTMyVG9VVi9BUkdCVG9VViIKK2ZhZjQyMjEzIE5FT046IGltcGxlbWVudCBDb252ZXJ0UkdCMjRUb1kvQkdSMjQvQVJHQi9SR0JBMzJUb1VWL0FSR0JUb1VWCitiNGQ1NzZmYSBJbnN0YWxsIG1hbiBwYWdlcyB3aXRoIENNYWtlLgorY2JjMWI5MjEgd2VicGluZm86IGFkZCBmZWF0dXJlcyB0byBwYXJzZSBiaXRzdHJlYW0gaGVhZGVyCitlNjQ0YzU1NiBGaXggYmFkIGJpdCB3cml0ZXIgaW5pdGlhbGl6YXRpb24uCitiNjJjZGFkMiBNZXJnZSAiSW1wbGVtZW50IGEgY3J1bmNoZXIgZm9yIGxvc3NsZXNzIGF0IG1ldGhvZCA2LiIKK2RhM2U0ZGZiIHVzZSB0aGUgZXhhY3QgY29uc3RhbnQgZm9yIHRoZSBnYW1tYSB0cmFuc2ZlciBmdW5jdGlvbgorYTljNzAxZTAgTWVyZ2UgInRpZmZkZWM6IGZpeCBFWFRSQVNBTVBMRVMgY2hlY2siCithZGFiOGNlMCBJbXBsZW1lbnQgYSBjcnVuY2hlciBmb3IgbG9zc2xlc3MgYXQgbWV0aG9kIDYuCisxYjkyYjIzNyBNZXJnZSAiRml4IFZQOEFwcGx5TmVhckxvc3NsZXNzIHRvIHJlc3BlY3QgY29uc3QgYW5kIHN0cmlkZS4iCisxOTIzZmYwMiB0aWZmZGVjOiBmaXggRVhUUkFTQU1QTEVTIGNoZWNrCis5N2NjZTViYSB0aWZmZGVjOiBvbmx5IHJlcXVlc3QgRVhUUkFTQU1QTEVTIHcvPiAzIHNhbXBsZXMvcHgKKzBkY2Q4NWI2IEZpeCBWUDhBcHBseU5lYXJMb3NzbGVzcyB0byByZXNwZWN0IGNvbnN0IGFuZCBzdHJpZGUuCitmNzY4MjE4OSB5dXY6IHJhdGlvbmFsaXplIHRoZSBDL1NTRTIgZnVuY3Rpb24gbmFtaW5nCis1MjI0NTQyNCBORU9OIGltcGxlbWVudGF0aW9uIG9mIHNvbWUgU2hhcnAtWVVWNDIwIGZ1bmN0aW9ucworNjkwZWZkODIgQXZvaWQgc2V2ZXJhbCBiYWNrd2FyZCByZWZlcmVuY2UgY29waWVzLgorNGJiMWY2MDcgc3JjL2RlYy92cDhfZGVjLmgsIGNvc21ldGljczogZml4IGNvbW1lbnRzCisyODU3NDhiZSBjbWFrZTogYnVpbGQvaW5zdGFsbCB3ZWJwaW5mbworNzhmZDE5OWMgYmFja3dhcmRfcmVmZXJlbmNlc19lbmMuYzogY2xlYXIgLVdzaGFkb3cgd2FybmluZ3MKK2FlODM2NDEwIFdlYlBMb2cyRmxvb3JDOiBjbGVhciAtV3NoYWRvdyB3YXJuaW5nCitkMGI3NDA0ZSBNZXJnZSAiV0FTTSBzdXBwb3J0IgorMTM0ZTMxNGYgV0FTTSBzdXBwb3J0CitjMDhhZGI2ZiBNZXJnZSAiVlA4TEVuYzogcmVtb3ZlIHVzZSBvZiBCaXRzTG9nMkNlaWxpbmcoKSIKKzI4YzM3ZWJkIFZQOExFbmM6IHJlbW92ZSB1c2Ugb2YgQml0c0xvZzJDZWlsaW5nKCkKKzJjYjU4YWIyIHdlYnBpbmZvOiBvdXRwdXQgZm9ybWF0IGFzIGEgaHVtYW4gcmVhZGFibGUgc3RyaW5nCitiYjE3NWE5MyBNZXJnZSAicmVuYW1lIHNvbWUgc3ltYm9scyBjbGFzaGluZyB3aXRoIE1TVkMgaGVhZGVycyIKKzM5ZWRhNjU4IFJlbW92ZSBhIGR1cGxpY2F0ZWQgcGl4ZWwgaGFzaCBpbXBsZW1lbnRhdGlvbi4KKzM2YjgyNzRkIHJlbmFtZSBzb21lIHN5bWJvbHMgY2xhc2hpbmcgd2l0aCBNU1ZDIGhlYWRlcnMKKzI3NGRhZjU0IEFkZCB3ZWJwaW5mbyB0b29sLgorZWM1MDM2ZTQgYWRkIGV4cGxpY2l0IHJlZmVyZW5jZSB0byAvdXNyL2xvY2FsL3tsaWIsaW5jfQorMThmMGRmYWMgTWVyZ2UgImZpeCBUSUZGIGVuY29kZXIgcmVnYXJkaW5nIHJnYkEvUkdCQSIKKzRlMmIwYjUwIE1lcmdlICJ3ZWJwZGVjLmg6IGZpeCBhIGRvYyB0eXBvIgorZTJlZWFiZmYgTWVyZ2UgIkluc3RhbGwgYmluYXJpZXMsIGxpYnJhcmllcyBhbmQgaGVhZGVycyBpbiBDTWFrZS4iCis4MzY2MDdlNiB3ZWJwZGVjLmg6IGZpeCBhIGRvYyB0eXBvCis5MjczZTQ0MSBmaXggVElGRiBlbmNvZGVyIHJlZ2FyZGluZyByZ2JBL1JHQkEKKzE3ZTNjMTFmIEFkZCBsaW1pdGVkIFBBTSBkZWNvZGluZyBzdXBwb3J0Cis1ZjYyNDg3MSBJbnN0YWxsIGJpbmFyaWVzLCBsaWJyYXJpZXMgYW5kIGhlYWRlcnMgaW4gQ01ha2UuCis5NzZhZGFjMSBNZXJnZSAibG9zc2xlc3MgaW5jcmVtZW50YWwgZGVjb2Rpbmc6IGZpeCBtaXNzaW5nIGVvc18gdGVzdCIKK2Y4ZmFkNGZhIGxvc3NsZXNzIGluY3JlbWVudGFsIGRlY29kaW5nOiBmaXggbWlzc2luZyBlb3NfIHRlc3QKKzI3NDE1ZDQxIE1lcmdlICJ2d2VicF9zZGw6IGZpeCB0aGUgbWFrZWZpbGUudW5peCIKKzQ5NTY2MTgyIE1lcmdlICJJbWdJb1V0aWxXcml0ZUZpbGUoKTogdXNlIEltZ0lvVXRpbFNldEJpbmFyeU1vZGUiCis2Zjc1YTUxYiBBbmFseXplIHRoZSB0cmFuc2Zvcm0gZW50cm9weSBvbiB0aGUgd2hvbGUgaW1hZ2UuCithNWU0ZTNhZiBVc2UgcGFsZXR0ZSBvbmx5IGlmIHdlIGNhbiBpbiBlbnRyb3B5IGFuYWx5c2lzLgorNzVhOWMzYzQgSW1wcm92ZSBjb21wcmVzc2lvbiBieSBiZXR0ZXIgZW50cm9weSBhbmFseXNpcy4KKzM5Y2Y2ZjRmIHZ3ZWJwX3NkbDogZml4IHRoZSBtYWtlZmlsZS51bml4Cis2OTliMDQxNiBJbWdJb1V0aWxXcml0ZUZpbGUoKTogdXNlIEltZ0lvVXRpbFNldEJpbmFyeU1vZGUKKzdkOTg1YmQxIEZpeCBzbWFsbCBlbnRyb3B5IGFuYWx5c2lzIGJ1Zy4KKzZlN2NhZjA2IE9wdGltaXplIHRoZSBjb2xvciBjYWNoZSBzaXplLgorODMzYzkyMTkgTW9yZSBlZmZpY2llbnQgc3RvY2hhc3RpYyBoaXN0b2dyYW0gbWVyZ2UuCis1MTgzMzI2YiBSZWZhY3RvciB0aGUgZ3JlZWR5IGhpc3RvZ3JhbSBtZXJnZS4KKzk5ZjZmNDYyIE1lcmdlICJoaXN0b2dyYW1fZW5jLmMsTXlSYW5kOiBzL3VsL3UvIGZvciB1bnNpZ25lZCBjb25zdGFudHMiCis4MGEyMjE4NiBzc2ltLmM6IHJlbW92ZSBkZWFkIGluY2x1ZGUKK2ExMjhkZmZmIGhpc3RvZ3JhbV9lbmMuYyxNeVJhbmQ6IHMvdWwvdS8gZm9yIHVuc2lnbmVkIGNvbnN0YW50cworNjkzYmY3NGUgbW92ZSB0aGUgU1NJTSBjYWxjdWxhdGlvbiBjb2RlIGluIHNzaW0uYyAvIHNzaW1fc3NlMi5jCisxMGQ3OTFjYSBNZXJnZSAiRml4IHRoZSByYW5kb20gZ2VuZXJhdG9yIGluIEhpc3RvZ3JhbUNvbWJpbmVTdG9jaGFzdGljLiIKK2ZhNjNhOTY2IEZpeCB0aGUgcmFuZG9tIGdlbmVyYXRvciBpbiBIaXN0b2dyYW1Db21iaW5lU3RvY2hhc3RpYy4KKzE2YmUxOTJmIFZQOExTZXRCaXRQb3M6IHJlbW92ZSB0aGUgZW9zXyBzZXR0aW5nCiswMjcxNTFjYSBkb24ndCBlcmFzZSB0aGUgc3VyZmFjZSBiZWZvcmUgYmxpdHRpbmcuCis0MTA1ZDU2NSBkaXNhYmxlIFdFQlBfVVNFX1hYWCBvcHRpbWlzYXRpb25zIHdoZW4gRU1TQ1JJUFRFTiBpcyBkZWZpbmVkCis5ZWUzMmE3NSBNZXJnZSAiV2ViUC1KUzogZW1zY3JpcHRlbi1iYXNlZCBKYXZhc2NyaXB0IGRlY29kZXIiCitjYTlmN2I3ZCBXZWJQLUpTOiBlbXNjcmlwdGVuLWJhc2VkIEphdmFzY3JpcHQgZGVjb2RlcgorODY4YWE2OTAgUGVyZm9ybSBncmVlZHkgaGlzdG9ncmFtIG1lcmdlIGluIGEgdW5pZmllZCB3YXkuCis1YjM5M2YyZCBNZXJnZSAiZml4IHBhdGggdHlwbyBmb3IgdndlYnBfc2RsIGluIE1ha2VmaWxlLnZjIgorZTAwMTJiZWEgQ01ha2U6IG9ubHkgdXNlIGxpYndlYnBkZWNvZGVyIGZvciBidWlsZGluZyBkd2VicAorODRjMmE3YjAgZml4IHBhdGggdHlwbyBmb3IgdndlYnBfc2RsIGluIE1ha2VmaWxlLnZjCisxYjBlNGFiZiBNZXJnZSAiQWRkIGEgZmxhZyB0byBkaXNhYmxlIFNJTUQgb3B0aW1pemF0aW9ucy4iCiszMjI2MzI1MCBBZGQgYSBmbGFnIHRvIGRpc2FibGUgU0lNRCBvcHRpbWl6YXRpb25zLgorYjQ5NGZkZWMgb3B0aW1pemUgdGhlIEFSR0ItPkFSR0IgSW1wb3J0IHRvIHVzZSBtZW1jcHkKK2YxNTM2MDM5IE1lcmdlICJSZWFkV2ViUDogZGVjb2RlIGRpcmVjdGx5IGludG8gYSBwcmUtYWxsb2NhdGVkIGJ1ZmZlciIKK2U2OWVkMjkxIFJlYWRXZWJQOiBkZWNvZGUgZGlyZWN0bHkgaW50byBhIHByZS1hbGxvY2F0ZWQgYnVmZmVyCis1N2Q4ZGU4YSBNZXJnZSAidndlYnBfc2RsOiBzaW1wbGUgdmlld2VyIGJhc2VkIG9uIFNETCIKKzVjZmQ0ZWJjIExaNzcgaW50ZXJ2YWwgc3BlZWR1cHMuIEZhc3Rlciwgc21hbGxlciwgc2ltcGxlci4KKzFlN2FkODhiIFBOTSBoZWFkZXIgZGVjb2RlcjogYWRkIHNvbWUgYmFzaWMgbnVtZXJpY2FsIHZhbGlkYXRpb24KKzE3Yzc4OTBjIE1lcmdlICJBZGQgYSBkZWNvZGVyIG9ubHkgbGlicmFyeSBmb3IgV2ViUCBpbiBDTWFrZS4iCitiZTczMzc4NiBNZXJnZSAiQWRkIGNsYW5nIGJ1aWxkIGZpeCBmb3IgTVNBIgorMDNjZGEwZTQgQWRkIGEgZGVjb2RlciBvbmx5IGxpYnJhcnkgZm9yIFdlYlAgaW4gQ01ha2UuCithYTg5MzkxNCBBZGQgY2xhbmcgYnVpbGQgZml4IGZvciBNU0EKKzMxYTkyZTk3IE1lcmdlICJpbWFnZWlvOiBhZGQgbGltaXRlZCBQTk0gc3VwcG9ydCBmb3IgcmVhZGluZyIKK2RjZjlkODJhIGltYWdlaW86IGFkZCBsaW1pdGVkIFBOTSBzdXBwb3J0IGZvciByZWFkaW5nCis2NTI0ZmNkNiB2d2VicF9zZGw6IHNpbXBsZSB2aWV3ZXIgYmFzZWQgb24gU0RMCis2Y2YyNGEyNCBnZXRfZGlzdG86IGZpeCByZWZlcmVuY2UgZmlsZSByZWFkCis0M2Q0NzJhYSBNZXJnZSB0YWcgJ3YwLjYuMCcKKzUwZDFhODQ4IHVwZGF0ZSBDaGFuZ2VMb2cgKHRhZzogdjAuNi4wLCBvcmlnaW4vMC42LjAsIDAuNi4wKQorMjBhN2ZlYTAgZXh0cmFzL01ha2VmaWxlLmFtOiBmaXggbGlid2VicGV4dHJhcy5sYSByZWZlcmVuY2UKKzQxNWYzZmZlIHVwZGF0ZSBDaGFuZ2VMb2cgKHRhZzogdjAuNi4wLXJjMykKKzNjNmQxMjI0IHVwZGF0ZSBORVdTCitlZTRhNDE0MSB1cGRhdGUgQVVUSE9SUworMzJlZDg1NmYgRml4ICJhbGx8bm8gZnJhbWVzIGFyZSBrZXlmcmFtZXMiIHNldHRpbmdzLgorMWMzMTkwYjYgTWVyZ2UgIkZpeCAiYWxsfG5vIGZyYW1lcyBhcmUga2V5ZnJhbWVzIiBzZXR0aW5ncy4iCitmNGRjNTZmZCBkaXNhYmxlIEdyYWRpZW50VW5maWx0ZXJfTkVPTgorNGYzZTNiYmQgZGlzYWJsZSBHcmFkaWVudFVuZmlsdGVyX05FT04KKzJkYzBiZGNhIEZpeCAiYWxsfG5vIGZyYW1lcyBhcmUga2V5ZnJhbWVzIiBzZXR0aW5ncy4KKzBkOGUwNTg4IGltZzJ3ZWJwOiB0cmVhdCAtbG9vcCBhcyBhIG5vLW9wIHcvc2luZ2xlIGltYWdlcworYjA0NTAxMzkgUmVhZEltYWdlKCk6IHJlc3RvcmUgc2l6ZSByZXBvcnRpbmcKKzBhZDNiNGVmIHVwZGF0ZSBDaGFuZ2VMb2cgKHRhZzogdjAuNi4wLXJjMikKKzY0NTE3MDllIGltZzJ3ZWJwLGdldF9kaXN0bzogZml4IGltYWdlIGRlY29kZSB3L1dJQyBidWlsZHMKKzkyNTA0ZDIxIGdldF9kaXN0bzogbWFrZSBSZWFkUGljdHVyZSgpIHJldHVybiBhIGJvb2wKK2MzZTRiM2E5IHVwZGF0ZSBORVdTCiszMzYzZWI2ZCBtYW4vaW1nMndlYnAuMTogZml4IGZvcm1hdHRpbmcgd2FybmluZworNGQxMzEyZjIgdXBkYXRlIE5FV1MKKzM2YzQyZWE0IGJ1bXAgdmVyc2lvbiB0byAwLjYuMAorYmI0OThhNTEgdXBkYXRlIEFVVEhPUlMKKzg0Y2VmMTZmIE1ha2VmaWxlLnZjOiBmaXggQ0ZHPWRlYnVnLWR5bmFtaWMgYnVpbGQKKzkxOWY5ZTJmIE1lcmdlICJhZGQgLnJjIGZpbGVzIGZvciB3aW5kb3dzIGRsbCB2ZXJzaW9uaW5nIgorZjFhZThhZjQgTWVyZ2UgIi5naXRpZ25vcmU6IGFkZCBpbWcyd2VicCIKKzQ2ODljZTE2IGN3ZWJwOiBhZGQgYSAtc2hhcnBfeXV2IG9wdGlvbiBmb3IgJ3NoYXJwJyBSR0ItPllVViBjb252ZXJzaW9uCis3OWJmNDZmMSByZW5hbWUgdGhlIHByZXRlbnRpb3VzIFNtYXJ0WVVWIGludG8gU2hhcnBZVVYKK2ViMWRjODlhIHNpbGVudGx5IGV4cG9zZSB1c2VfZGVsdGFfcGFsZXR0ZSBpbiB0aGUgV2ViUENvbmZpZyBBUEkKK2M4NWIwZGRlIC5naXRpZ25vcmU6IGFkZCBpbWcyd2VicAorNDNkM2YwMWEgYWRkIC5yYyBmaWxlcyBmb3Igd2luZG93cyBkbGwgdmVyc2lvbmluZworNjY4ZTFkZDQgc3JjL3tkZWMsZW5jLHV0aWxzfTogZ2l2ZSBmaWxlbmFtZXMgYSB1bmlxdWUgc3VmZml4CiswZTZiN2YzMyBNZXJnZSAiaW9zYnVpbGQuc2g6IG9ubHkgYWRkIHJlcXVpcmVkIGhlYWRlcnMgdG8gZnJhbWV3b3JrIgorMjllZDZmOWEgaW9zYnVpbGQuc2g6IG9ubHkgYWRkIHJlcXVpcmVkIGhlYWRlcnMgdG8gZnJhbWV3b3JrCis3MWM1M2YxYSBORU9OOiBzcGVlZC11cCBzdHJvbmcgZmlsdGVyaW5nCis3M2Y1NjdlYSBNZXJnZSAiZ2V0X2Rpc3RvOiByZW1vdmUgcmVkdW5kYW50IHJlYWRlciBjaGVjayIKKzllMTQyNzZmIE1lcmdlICJtYWtlZmlsZXM6IHBydW5lIGdldF9kaXN0byAmIHdlYnBfcXVhbGl0eSBkZXBzIgorOTk5NjViYWMgTWVyZ2UgIk1ha2VmaWxlLnZjOiBhZGQgZ2V0X2Rpc3RvLmV4ZSwgd2VicF9xdWFsaXR5LmV4ZSIKK2Q0OTEyMjM4IGdldF9kaXN0bzogcmVtb3ZlIHJlZHVuZGFudCByZWFkZXIgY2hlY2sKK2VhNDgyNDA5IG1ha2VmaWxlczogcHJ1bmUgZ2V0X2Rpc3RvICYgd2VicF9xdWFsaXR5IGRlcHMKKzJlZGU1YTE5IE1ha2VmaWxlLnZjOiBhZGQgZ2V0X2Rpc3RvLmV4ZSwgd2VicF9xdWFsaXR5LmV4ZQorYTM0NTA2OGEgQVJNOiBzcGVlZCB1cCBiaXRyZWFkZXIgYnkgYXZvaWRpbmcgdGFibGVzCisxZGM4MmE2YiBNZXJnZSAiaW50cm9kdWNlIGEgZ2VuZXJpYyBHZXRDb2VmZnMoKSBmdW5jdGlvbiBwb2ludGVyIgorODA3NGI4OWUgaW50cm9kdWNlIGEgZ2VuZXJpYyBHZXRDb2VmZnMoKSBmdW5jdGlvbiBwb2ludGVyCis3NDlhNDVhNSBNZXJnZSAiTkVPTjogaW1wbGVtZW50IGFscGhhLWZpbHRlcnMgKGhvcml6b250YWwvdmVydGljYWwvZ3JhZGllbnQpIgorNzRjMDUzYjUgTWVyZ2UgIk5FT046IGZpeCBvdmVyZmxvdyBpbiBTU0UgTnhOIGNhbGN1bGF0aW9uIgorMGEzYWVmZjcgTWVyZ2UgImRzcDogV2ViUEV4dHJhY3RHcmVlbiBmdW5jdGlvbiBmb3IgYWxwaGEgZGVjb21wcmVzc2lvbiIKKzFkZTkzMWM2IE5FT046IGltcGxlbWVudCBhbHBoYS1maWx0ZXJzIChob3Jpem9udGFsL3ZlcnRpY2FsL2dyYWRpZW50KQorOWIzYWNhNDAgTkVPTjogZml4IG92ZXJmbG93IGluIFNTRSBOeE4gY2FsY3VsYXRpb24KKzFjMDdhM2M2IGRzcDogV2ViUEV4dHJhY3RHcmVlbiBmdW5jdGlvbiBmb3IgYWxwaGEgZGVjb21wcmVzc2lvbgorOWVkNWUzZTUgdXNlIHBvaW50ZXJzIGZvciBXZWJQUmVzY2FsZXIncyBpbiBXZWJQRGVjUGFyYW1zCitkYjAxM2E4ZCBNZXJnZSAiQVJNOiBkb24ndCB1c2UgVVNFX0dFTkVSSUNfVFJFRSIKK2ZjZDQ3ODRkIHVzZSBhIDhiIHRhYmxlIGZvciBDLXZlcnNpb24gZm9yIGNseigpCitmYmI1YzQ3MyBBUk06IGRvbid0IHVzZSBVU0VfR0VORVJJQ19UUkVFCis4ZmRhNTYxMiBNZXJnZSAiYWRkIGEga1Nsb3dTU1NFMyBmZWF0dXJlIGZvciBDUFVJbmZvIgorODZiYmQyNDUgYWRkIGEga1Nsb3dTU1NFMyBmZWF0dXJlIGZvciBDUFVJbmZvCis3YzI3NzllOSBHZXQgY29kZSB0byBmdWxseSBjb21waWxlIGluIEMrKy4KKzI1MGMzNTg2IE1lcmdlICJXaGVuIGNvbXBpbGluZyBhcyBDKyssIGF2b2lkIG5hcnJvd2luZyB3YXJuaW5ncy4iCitjMDY0OGFjMiBXaGVuIGNvbXBpbGluZyBhcyBDKyssIGF2b2lkIG5hcnJvd2luZyB3YXJuaW5ncy4KKzBkNTVmNjBjIDQwJSBmYXN0ZXIgQXBwbHlBbHBoYU11bHRpcGx5X1NTRTIKKzQ5ZDAyODBkIE5FT046IGltcGxlbWVudCBzZXZlcmFsIGFscGhhLXByb2Nlc3NpbmcgZnVuY3Rpb25zCis0OGIxZTg1ZiBTU0UyOiAxNSUgZmFzdGVyIGFscGhhLXByb2Nlc3NpbmcgZnVuY3Rpb25zCitlM2I4YWJiYyBmaXggd2FybmluZyBmcm9tIHN0YXRpYyBhbmFseXNpcy4KKzI4ZmUwNTRlIFNTRTI6IDMwJSBmYXN0ZXIgQXBwbHlBbHBoYU11bHRpcGx5KCkKK2Y0NGFjZDI1IE1lcmdlICJQcm9wZXJseSBjb21wdXRlIHRoZSBvcHRpbWFsIGNvbG9yIGNhY2hlIHNpemUuIgorNTI3ODQ0ZmUgUHJvcGVybHkgY29tcHV0ZSB0aGUgb3B0aW1hbCBjb2xvciBjYWNoZSBzaXplLgorYmUwZWY2MzkgZml4IGEgY29tbWVudCB0eXBvCis4ODc0YjE2MiBGaXggYSBub24tZGV0ZXJtaW5pc3RpYyBjb2xvciBjYWNoZSBzaXplIGNvbXB1dGF0aW9uLgorZDcxMmUyMGQgRG8gbm90IGFsbG93IGEgY29sb3IgY2FjaGUgc2l6ZSBiaWdnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGNvbG9ycy4KK2VjZmYwNGY2IHJlLWludHJvZHVjZSBzb21lIGNvbW1lbnRzIGluIEh1ZmZtYW4gQ29zdC4KKzI1OWU5ODI4IHJlcGxhY2UgJ3B0ciArIHkgKiBzdHJpZGUnIGJ5ICdwdHIgKz0gc3RyaWRlJworMDBiMDhjODggTWVyZ2UgIk5FT046IDUlIGZhc3RlciBjb252ZXJzaW9uIHRvIFJHQjU2NSBhbmQgUkdCQTQ0NDQiCiswZTdmNDQ0NyBNZXJnZSAiTkVPTjogZmFzdGVyIGZhbmN5IHVwc2FtcGxpbmciCitiMDE2Y2I5MSBORU9OOiBmYXN0ZXIgZmFuY3kgdXBzYW1wbGluZworMWNiNjM4MDEgQ2FsbCB0aGUgQyBmdW5jdGlvbiB0byBmaW5pc2ggb2ZmIGxvc3NsZXNzIFNTRSBsb29wcyBvbmx5IHdoZW4gbmVjZXNzYXJ5LgorODc1ZmFmYzEgSW1wbGVtZW50IEJ1bmRsZUNvbG9yTWFwIGluIFNTRTIuCiszNjc0ZDQ5ZSBNZXJnZSAicmVtb3ZlIENsYW5nIHdhcm5pbmdzIHdpdGggdW51c2VkIGFyY2ggYXJndW1lbnRzLiIKK2YwNGViMzc2IE1lcmdlIHRhZyAndjAuNS4yJworMzQxZDcxMWMgTkVPTjogNSUgZmFzdGVyIGNvbnZlcnNpb24gdG8gUkdCNTY1IGFuZCBSR0JBNDQ0NAorYWJiNTQ4MjcgcmVtb3ZlIENsYW5nIHdhcm5pbmdzIHdpdGggdW51c2VkIGFyY2ggYXJndW1lbnRzLgorZWNlOTY4NGYgdXBkYXRlIENoYW5nZUxvZyAodGFnOiB2MC41LjItcmMyLCB0YWc6IHYwLjUuMiwgb3JpZ2luLzAuNS4yLCAwLjUuMikKK2FhNzc0NGNhIGFuaW1fdXRpbDogcXVpZXQgaW1wbGljaXQgY29udiB3YXJuaW5ncyBpbiAzMi1iaXQKK2Q5MTIwMjcxIGpwZWdkZWM6IGNvcnJlY3QgQ29udGV4dEZpbGwgc2lnbmF0dXJlCisyNGViMzk0MCBSZW1vdmUgc29tZSBlcnJvcnMgd2hlbiBjb21waWxpbmcgdGhlIGNvZGUgYXMgQysrLgorYTRhOGU1ZjMgdndlYnA6IGNsZWFyIGNhbnZhcyBkdXJpbmcgcmVzaXplIHcvbyBhbmltYXRpb24KKzY3YzI1YWQ1IHZ3ZWJwOiBjbGVhciBjYW52YXMgZHVyaW5nIHJlc2l6ZSB3L28gYW5pbWF0aW9uCithNGJiZTRiMyBmaXggaW5kZW50YXRpb24KKzMxY2EyYTgwIHRpZmZkZWM6IHJlc3RvcmUgbGlidGlmZiAzLjkueCBjb21wYXRpYmlsaXR5CitiMmY3N2I1NyB1cGRhdGUgTkVXUworNWFiNmQ5ZGUgQW5pbUVuY29kZXI6IGF2b2lkIGZyZWVpbmcgdW5pbml0aWFsaXplZCBtZW1vcnkgcG9pbnRlci4KK2YyOWJmNTgyIFdlYlBBbmltRW5jb2RlcjogSWYgJ21pbmltaXplX3NpemUnIGFuZCAnYWxsb3dfbWl4ZWQnIG9uLCB0cnkgbG9zc3kgKyBsb3NzbGVzcy4KKzNlYmUxYzAwIEFuaW1FbmNvZGVyOiBhdm9pZCBmcmVlaW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHBvaW50ZXIuCitkZjc4MGUwZSBmaXggYSBwb3RlbnRpYWwgb3ZlcmZsb3cgd2l0aCBNQUxMT0NfTElNSVQKKzU4ZmM1MDc4IE1lcmdlICJQcmVkaWN0b3JTdWI6IGltcGxlbWVudCBmdWxseS1TU0UyIHZlcnNpb24iCis5Y2M0MjE2NyBQcmVkaWN0b3JTdWI6IGltcGxlbWVudCBmdWxseS1TU0UyIHZlcnNpb24KKzBhYTFmMzVjIHJlbW92ZSBkZXBlbmRlbmN5IG9mIGltYWdlaW8vIHRvIHN0b3B3YXRjaC5oCitjYjllYzg0YiBNZXJnZSAicmVtb3ZlIHRoZSBkZXBlbmRlbmN5IHRvIHN0b3Bfd2F0Y2guW2NoXSBpbiBpbWFnZWlvIgorZGMwYzAxZmIgTWVyZ2UgImFuaW1fdXRpbDogcXVpZXQgaW1wbGljaXQgY29udiB3YXJuaW5ncyBpbiAzMi1iaXQiCis4MjdkM2M1MCBNZXJnZSAiZml4IGEgcG90ZW50aWFsIG92ZXJmbG93IHdpdGggTUFMTE9DX0xJTUlUIgorMWUyZTI1YjAgYW5pbV91dGlsOiBxdWlldCBpbXBsaWNpdCBjb252IHdhcm5pbmdzIGluIDMyLWJpdAorMjE4NDYwY2QgYnVtcCB2ZXJzaW9uIHRvIDAuNS4yCitkZTdkNjU0ZCB1cGRhdGUgQVVUSE9SUyAmIC5tYWlsbWFwCisyNzMzNjdjMSBNZXJnZSAiZHNwL2xvc3NsZXNzLmMsY29zbWV0aWNzOiBmaXggaW5kZW50IgorNzZiYmNmMmUgZml4IGEgcG90ZW50aWFsIG92ZXJmbG93IHdpdGggTUFMTE9DX0xJTUlUCis4YWMxYWJmZSBNZXJnZSAianBlZ2RlYzogY29ycmVjdCBDb250ZXh0RmlsbCBzaWduYXR1cmUiCitjYjIxNWFlZCByZW1vdmUgdGhlIGRlcGVuZGVuY3kgdG8gc3RvcF93YXRjaC5bY2hdIGluIGltYWdlaW8KKzI0MjMwMTdhIGRzcC9sb3NzbGVzcy5jLGNvc21ldGljczogZml4IGluZGVudAorNzRhMTJiMTAgaW9zYnVpbGQuc2g6IGFkZCBXZWJQRGVjb2Rlci5mcmFtZXdvcmsgKyBlbmNvZGVyCithOWNjNzYyMSBNZXJnZSAiaW9zYnVpbGQuc2g6IGFkZCBXZWJQRGVjb2Rlci5mcmFtZXdvcmsgKyBlbmNvZGVyIgorZmJiYTViYzIgb3B0aW1pemUgcHJlZGljdG9yICMxIGluIHBsYWluLUMgRm9yIHNvbWUgcmVhc29uLCBnY2MgaGFzIGhhcmQgdGltZSBpbmxpbmluZyB0aGlzIG9uZS4uLgorOWFlMGIzZjYgTWVyZ2UgIlNTRTI6IHNsaWdodGx5ICh+MiUpIGZhc3RlciBQcmVkaWN0b3IgIzEiCitjMWY5N2JkNyBTU0UyOiBzbGlnaHRseSAofjIlKSBmYXN0ZXIgUHJlZGljdG9yICMxCitlYTY2NGI4OSBTU0UyOiAxMCUgZmFzdGVyIFByZWRpY3RvciAjMTEKK2JlN2RjYzA4IEFuaW1FbmNvZGVyOiBDb3JyZWN0bHkgc2tpcCBhIGZyYW1lIHdoZW4gc3ViLXJlY3RhbmdsZSBpcyBlbXB0eS4KKzQwODg1ODMwIEZpeCBhc3NlcnRpb25zIGluIFdlYlBSZXNjYWxlckV4cG9ydFJvdygpCisxZDUwNDZkMSBpb3NidWlsZC5zaDogYWRkIFdlYlBEZWNvZGVyLmZyYW1ld29yayArIGVuY29kZXIKK2NlYzcyMDE0IGpwZWdkZWM6IGNvcnJlY3QgQ29udGV4dEZpbGwgc2lnbmF0dXJlCis4ZjM4YzcyZSBmaXggYSB0eXBvIGluIFdlYlBQaWN0dXJlWVVWQVRvQVJHQidzIGRvYworMzNjYTkzZjkgc3lzdGVtYXRpY2FsbHkgY2FsbCBXZWJQRGVtdXhSZWxlYXNlSXRlcmF0b3IoKSBvbiBkZWMtPnByZXZfaXRlcl8KKzc2ZTE5MDczIGRvYzogdXNlIHR3bydzIGNvbXBsZW1lbnQgZXhwbGljaXRseSBmb3IgdWludDgtPmludDggY29udmVyc2lvbgorZjkxYmE5NjMgQW5pbV9lbmNvZGVyOiBjb3JyZWN0bHkgaGFuZGxlIGVuYy0+cHJldl9jYW5kaWRhdGVfdW5kZWNpZGVkXworMjVkNzRlNjUgV2ViUFBpY3R1cmVEaXN0b3J0aW9uKCk6IGZyZWUoKSAtPiBXZWJQU2FmZUZyZWUoKQorMDNmMWMwMDggbXV4L01ha2VmaWxlLmFtOiBhZGQgbWlzc2luZyAtbG0KKzU4NDEwY2Q2IGZpeCBidWcgaW4gUmVmaW5lVXNpbmdEaXN0b3J0aW9uKCkKK2UxNjhhZjhjIGZpeCBmaWx0ZXJpbmcgYXV0by1hZGp1c3RtZW50CitlZDlkZWM0MSBmaXggZG9jIGFuZCBjb2RlIHNuaXBwZXQgZm9yIFdlYlBJTmV3RGVjb2RlcigpIGRvYworM2M0OTE3OGYgcHJldmVudCAzMmIgb3ZlcmZsb3cgZm9yIHZlcnkgbGFyZ2UgY2FudmFzX3dpZHRoIC8gaGVpZ2h0Cis5NTk1ZjI5MCBmaXggYW5pbV91dGlsLmMgY29tcGlsYXRpb24gd2hlbiBIQVZFX0dJRiBpcyBub3QgZGVmaW5lZC4KKzdlYzk1NTJjIE1ha2UgZ2lmIHRyYW5zcGFyZW50IGNvbG9yIHRvIGJlIHRyYW5zcGFyZW50IGJsYWNrCitiM2ZiOGJiNiBzbGlnaHRseSBmYXN0ZXIgUHJlZGljdG9yICMxMSBpbiBORU9OCis5ODcxMzM1ZiBBZGQgYSBDTWFrZSBvcHRpb24gZm9yIFdFQlBfU1dBUF8xNkJJVF9DU1AuCiswYWUzMjIyNiBGaXggbWlzc2luZyBjcHUtZmVhdHVyZXMgZm9yIEFuZHJvaWQuCithYjRjODA1NiBjcHUuY21ha2U6IGltcHJvdmUgd2VicF9jaGVja19jb21waWxlcl9mbGFnIG91dHB1dAorZWVjNWZhM2EgUHJvdmlkZSBzdXBwb3J0IGZvciBDTWFrZSBvbiBBbmRyb2lkIHN0dWRpbyAyLjIuCiswMDRkNTY5MCBTcGxpdCB0aGUgbWFpbiBDTWFrZSBmaWxlLgorNGZlNWQ1ODggQW5kcm9pZC5tazogdXNlIC1mdmlzaWJpbGl0eT1oaWRkZW4KK2JkNjNhMzFhIHZ3ZWJwOiBlbnN1cmUgc2V0ZW52KCkgaXMgYXZhaWxhYmxlIGluIHN0ZGxpYi5oCiszNjNhNTY4MSB2d2VicDogaGFuZGxlIHdpbmRvdyByZXNpemluZyBwcm9wZXJseQorYTBkMjc1M2YgbG93ZXIgV0VCUF9NQVhfQUxMT0NBQkxFX01FTU9SWSBkZWZhdWx0CiszMWZlMTFhNSAgZml4IGluZmluaXRlIGxvb3AgaW4gY2FzZSBvZiBQQVJUSVRJT04wIG92ZXJmbG93Cis1MzIyMTVkZCBDaGFuZ2UgdGhlIHJ1bGUgb2YgcGlja2luZyBVViBtb2RlIGluIE1CQW5hbHl6ZUJlc3RVVk1vZGUoKQorOWM3NWRiZDMgY3dlYnAuMTogaW1wcm92ZSBzb21lIGdyYW1tYXIKK2FmMmUwNWNiIHZ3ZWJwOiBDbGVhciBwcmV2aW91cyBmcmFtZSB3aGVuIGEga2V5IHRyaWdnZXJzIGEgcmVkcmF3CisyNmZmYTI5NiBBZGQgZGVzY3JpcHRpb25zIG9mIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpbiBoZWxwIGluZm8uCis3NDE2MjgwZCBGaXggYW4gdW5zaWduZWQgaW50ZWdlciBvdmVyZmxvdyBlcnJvciBpbiBlbmMvY29zdC5oCisxM2NmMWQyZSBEbyB0b2tlbiByZWNvcmRpbmcgYW5kIGNvdW50aW5nIGluIGEgc2luZ2xlIGxvb3AKK2ViOWE0Yjk3IFJlc2V0IHNlZ21lbnQgaWQgaWYgd2UgZGVjaWRlIG5vdCB0byB1cGRhdGUgc2VnbWVudCBtYXAKKzQyZWJlM2I3IGNvbmZpZ3VyZTogZml4IE5FT04gZmxhZyBkZXRlY3Rpb24gdW5kZXIgZ2NjIDYKKzc2ZWJiZmZmIE5FT046IGltcGxlbWVudCBwcmVkaWN0b3IgIzEzCis5NWIxMmEwOCBNZXJnZSAiUmV2ZXJ0IEF2ZXJhZ2UzIGFuZCBBdmVyYWdlNCIKKzU0YWIyZTc1IFJldmVydCBBdmVyYWdlMyBhbmQgQXZlcmFnZTQKK2ZlMTIzMzBjIDMtNSUgZmFzdGVyIFByZWRpY3RvciAjNSwgIzYsICM3IGFuZCAjMTAgZm9yIE5FT04KK2ZiZmIzYmVmIH4yJSBmYXN0ZXIgcHJlZGljdG9yICMxMCBmb3IgTkVPTgorZDRiN2Q4MDEgbG9zc2xlc3Nfc3NlMjogdXNlIHRoZSBsb2NhbCBmdW5jdGlvbnMKK2E1ZTNiMjI1IExvc3NsZXNzIGRlY29kZXIgU1NFMiBpbXByb3ZlbWVudHMuCis1OGExZjEyNCB+MiUgZmFzdGVyIHByZWRpY3RvciAjMTIgaW4gTkVPTi4KKzkwNmMzYjYzIE1lcmdlICJJbXBsZW1lbnQgbG9zc2xlc3MgdHJhbnNmb3JtcyBpbiBORU9OLiIKK2QyM2FiZTRlIEltcGxlbWVudCBsb3NzbGVzcyB0cmFuc2Zvcm1zIGluIE5FT04uCisyZTZjYjZmMyBHaXZlIG1vcmUgZmxleGliaWxpdHkgdG8gdGhlIHByZWRpY3RvciBnZW5lcmF0aW5nIG1hY3JvLgorMjhlMGJiNzAgTWVyZ2UgIkZpeCByYWNlIGNvbmRpdGlvbiBpbiBtdWx0aS10aHJlYWRpbmcgaW5pdGlhbGl6YXRpb24uIgorNjQ3MDQ1MzAgRml4IHJhY2UgY29uZGl0aW9uIGluIG11bHRpLXRocmVhZGluZyBpbml0aWFsaXphdGlvbi4KK2JkZWQ3ODQ4IGltZzJ3ZWJwOiBmaXggZGVmYXVsdCAtbG9zc2xlc3MgdmFsdWUgYW5kIHVzZSBwaWMuYXJnYj0xCiswZTYxYTUxMyBNZXJnZSAiaW1nMndlYnA6IGNvbnZlcnQgYSBzZXF1ZW5jZSBvZiBpbWFnZXMgdG8gYW4gYW5pbWF0ZWQgd2VicCIKKzFjYzc5ZTkyIEFuaW1FbmNvZGVyOiBDb3JyZWN0bHkgc2tpcCBhIGZyYW1lIHdoZW4gc3ViLXJlY3RhbmdsZSBpcyBlbXB0eS4KKzAzZjQwOTU1IGltZzJ3ZWJwOiBjb252ZXJ0IGEgc2VxdWVuY2Ugb2YgaW1hZ2VzIHRvIGFuIGFuaW1hdGVkIHdlYnAKK2VhNzJjZDYwIGFkZCBtaXNzaW5nICdleHRlcm4nIGtleXdvcmQgZm9yIHByZWRpY3RvciBkY2wKKzY3ODc5ZTZkIFNTRSBpbXBsZW1lbnRhdGlvbiBvZiBkZWNvZGluZyBwcmVkaWN0b3JzLgorMzRhZWU5OTAgTWVyZ2UgInZ3ZWJwOiBtYWtlICdkJyBrZXkgdG9nZ2xlIHRoZSBkZWJ1Z2dpbmcgb2YgZnJhZ21lbnRzIgorYTQxMjk2YWUgRml4IHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFsdWUuCitjODVhZGIzMyB2d2VicDogbWFrZSAnZCcga2V5IHRvZ2dsZSB0aGUgZGVidWdnaW5nIG9mIGZyYWdtZW50cworNDIzOWExNDggTWFrZSB0aGUgbG9zc2xlc3MgcHJlZGljdG9ycyB3b3JrIG9uIGEgYmF0Y2ggb2YgcGl4ZWxzLgorYmMxOGViYWQgZml4IGV4dHJhICdjb25zdCdzIGluIHNpZ25hdHVyZXMKKzcxZTJmNWNhIFJlbW92ZSBtZW1jcHkgaW4gbG9zc2xlc3MgZGVjb2RpbmcuCis3NDc0ZDQ2ZSBEbyBub3QgdXNlIGEgcmVnaXN0ZXIgYXJyYXkgaW4gU1NFLgorNjc3NDhiNDEgSW1wcm92ZSBsYXRlbmN5IG9mIEZUcmFuc2Zvcm0yLgorMTY5NTFiMTkgTWVyZ2UgIlByb3ZpZGUgYW4gU1NFIGltcGxlbWVudGF0aW9uIG9mIENvbnZlcnRCR1JBVG9SR0IiCis2NTQwY2QwZSBQcm92aWRlIGFuIFNTRSBpbXBsZW1lbnRhdGlvbiBvZiBDb252ZXJ0QkdSQVRvUkdCCitkZTU2OGFiZiBBbmRyb2lkLm1rOiB1c2UgLWZ2aXNpYmlsaXR5PWhpZGRlbgorM2MyYTYxYjAgcmVtb3ZlIHNvbWUgdW5uZWVkZWQgY2FzdHMKKzlhYzA2M2MzIGFkZCBkc3AgZnVuY3Rpb25zIGZvciBTbWFydFlVVgorMjJlZmFiZGQgTWVyZ2UgInNtYXJ0X3l1djogc3dpdGNoIHRvIHBsYW5hciBpbnN0ZWFkIG9mIHBhY2tlZCByL2cvYiBwcm9jZXNzaW5nIgorMWQ2ZTdiZjMgc21hcnRfeXV2OiBzd2l0Y2ggdG8gcGxhbmFyIGluc3RlYWQgb2YgcGFja2VkIHIvZy9iIHByb2Nlc3NpbmcKKzBhMzgzOGNhIGZpeCBidWcgaW4gUmVmaW5lVXNpbmdEaXN0b3J0aW9uKCkKK2MwNjk5NTE1IHdlYnBtdXggLWR1cmF0aW9uOiBzZXQgZGVmYXVsdCAnZW5kJyB2YWx1ZSBlcXVhbCB0byAnc3RhcnQnCis4M2NiZmEwOSBJbXBvcnQ6IHVzZSByZWxhdGl2ZSBwb2ludGVyIG9mZnNldHMKK2ExYWRlNDBlIFByZXByb2Nlc3NBUkdCOiB1c2UgcmVsYXRpdmUgcG9pbnRlciBvZmZzZXRzCitmZDRkMDkwZiBDb252ZXJ0V1JHQlRvWVVWOiB1c2UgcmVsYXRpdmUgcG9pbnRlciBvZmZzZXRzCis5ZGFhZDQ1OSBJbXBvcnRZVVZBRnJvbVJHQkE6IHVzZSByZWxhdGl2ZSBwb2ludGVyIG9mZnNldHMKK2Y5MGM2MGQxIE1lcmdlICJhZGQgYSAiLWR1cmF0aW9uIGR1cmF0aW9uLHN0YXJ0LGVuZCIgb3B0aW9uIHRvIHdlYnBtdXgiCiszZjE4MmQzNiBhZGQgYSAiLWR1cmF0aW9uIGR1cmF0aW9uLHN0YXJ0LGVuZCIgb3B0aW9uIHRvIHdlYnBtdXgKKzM0MmUxNWYwIEltcG9ydDogdXNlIHJlbGF0aXZlIHBvaW50ZXIgb2Zmc2V0cworMTE0N2FiNGUgUHJlcHJvY2Vzc0FSR0I6IHVzZSByZWxhdGl2ZSBwb2ludGVyIG9mZnNldHMKK2U0Y2Q0ZGFmIGZpeCBmaWx0ZXJpbmcgYXV0by1hZGp1c3RtZW50CitlNzE1Mjg1NiBmaXggZG9jIGFuZCBjb2RlIHNuaXBwZXQgZm9yIFdlYlBJTmV3RGVjb2RlcigpIGRvYworZGU5ZmE1MDcgQ29udmVydFdSR0JUb1lVVjogdXNlIHJlbGF0aXZlIHBvaW50ZXIgb2Zmc2V0cworZGViMWI4MzEgSW1wb3J0WVVWQUZyb21SR0JBOiB1c2UgcmVsYXRpdmUgcG9pbnRlciBvZmZzZXRzCitjMjg0NzgwZiBpbWFnZWlvX3V0aWw6IGFkZCBJbWdJb1V0aWxDaGVja1NpemVBcmd1bWVudHNPdmVyZmxvdworZTM3NTA4MGQgZ2lmZGVjLFJlbWFwOiBhdm9pZCBvdXQgb2YgYm91bmRzIGNvbG9ybWFwIHJlYWQKK2MyMjJhMDUzIGFkZGl0aW9uYWwgZml4IGZvciBzdHJpZGUgdHlwZSBhcyBzaXplX3QKK2JiMjMzNjE3IGZpeCBwb3RlbnRpYWwgb3ZlcmZsb3cgd2hlbiB3aWR0aCAqIGhlaWdodCAqIDQgPj0gKDE8PDMyKQorODgzZDQxZmIgZ2lmMndlYnA6IGZpeCBjcmFzaCB3aXRoIE5VTEwgZXh0ZW5zaW9uIGRhdGEKK2NhYzlhMzZhIGdpZmRlYyxSZW1hcDogYXZvaWQgb3V0IG9mIGJvdW5kcyBjb2xvcm1hcCByZWFkCis0NTk1ZTAxZiBSZXZlcnQgImdpZmRlYyxSZW1hcDogYXZvaWQgb3V0IG9mIGJvdW5kcyBjb2xvcm1hcCByZWFkIgorZmI1MmQ0NDMgZ2lmZGVjOiBtYWtlIHNvbWUgY29uc3RhbnRzIHVuc2lnbmVkCitmMDQ4ZDM4ZCBnaWZkZWMsUmVtYXA6IGF2b2lkIG91dCBvZiBib3VuZHMgY29sb3JtYXAgcmVhZAorMzFiMWUzNDMgZml4IFNTSU0gbWV0cmljIC4uLiBieSBpZ25vcmluZyB0b28tZGFyayBhcmVhCisyZjUxYjYxNCBpbnRyb2R1Y2UgV2ViUFBsYW5lRGlzdG9ydGlvbiB0byBjb21wdXRlIHBsYW5lIGRpc3RvcnRpb24KKzAxMDRkNzMwIGNvbmZpZ3VyZTogZml4IE5FT04gZmxhZyBkZXRlY3Rpb24gdW5kZXIgZ2NjIDYKKzI2NWFiYmU5IE1lcmdlICJhZGRpdGlvbmFsIGZpeCBmb3Igc3RyaWRlIHR5cGUgYXMgc2l6ZV90IgorZjc2MDFhYTYgTWVyZ2UgIkludHJvZHVjZSBhIGdlbmVyaWMgV2ViUEdldEltYWdlUmVhZGVyKHR5cGUpIGZ1bmN0aW9uIgorY2U4NzMzMjAgSW50cm9kdWNlIGEgZ2VuZXJpYyBXZWJQR2V0SW1hZ2VSZWFkZXIodHlwZSkgZnVuY3Rpb24KKzJhMjc3M2VhIGltYWdlaW8vKmRlYyxSZWFkKjogYWRkIGlucHV0IHBhcmFtZXRlciBjaGVja3MKKzlmNWM4ZWNhIGFkZGl0aW9uYWwgZml4IGZvciBzdHJpZGUgdHlwZSBhcyBzaXplX3QKKzRlYjVkZjI4IHJlbW92ZSB1bnVzZWQgc3RyaWRlIGZpZWxkcyBmcm9tIFZQOEl0ZXJhdG9yCisxMWJjNDIzYSBNSU5fTEVOR1RIIGNsZWFudXBzLgorMjczZDAzNWEgTWVyZ2UgImZpeCBhIHR5cG8gaW4gV2ViUFBpY3R1cmVZVVZBVG9BUkdCJ3MgZG9jIgorNGRiODJhMTcgTWVyZ2UgImZpeCBwb3RlbnRpYWwgb3ZlcmZsb3cgd2hlbiB3aWR0aCAqIGhlaWdodCAqIDQgPj0gKDE8PDMyKSIKK2UyYWZmYWNjIGZpeCBwb3RlbnRpYWwgb3ZlcmZsb3cgd2hlbiB3aWR0aCAqIGhlaWdodCAqIDQgPj0gKDE8PDMyKQorZGM3ODlhZGEgZml4IGEgdHlwbyBpbiBXZWJQUGljdHVyZVlVVkFUb0FSR0IncyBkb2MKKzUzOWY1YTY4IEZpeCBub24taW5jbHVkZWQgaGVhZGVyIGluIGNvbmZpZy5jLgorYWFmMmE2YTYgc3lzdGVtYXRpY2FsbHkgY2FsbCBXZWJQRGVtdXhSZWxlYXNlSXRlcmF0b3IoKSBvbiBkZWMtPnByZXZfaXRlcl8KKzIwZWY5OTE1IE1lcmdlICJpbWFnZWlvX3V0aWw6IGFkZCBJbWdJb1V0aWxDaGVja1NpemVBcmd1bWVudHNPdmVyZmxvdyIKK2JjODZiN2E4IGltYWdlaW9fdXRpbDogYWRkIEltZ0lvVXRpbENoZWNrU2l6ZUFyZ3VtZW50c092ZXJmbG93Cis4MDZmNjI3OSBnaWYyd2VicDogZml4IGNyYXNoIHdpdGggTlVMTCBleHRlbnNpb24gZGF0YQorNjhhZTViNjcgQWRkIGxpYndlYnAvc3JjL211eC9hbmltaS5oCisyOGNlMzA0MyBSZW1vdmUgc29tZSBlcnJvcnMgd2hlbiBjb21waWxpbmcgdGhlIGNvZGUgYXMgQysrLgorYjM0YWJjYjggRmF2b3Iga2VlcGluZyB0aGUgYXJlYXMgbG9jYWxseSBzaW1pbGFyIGluIHNwYXRpYWwgcHJlZGljdGlvbiBtb2RlIHNlbGVjdGlvbgorYmE4NDNhOTIgZml4IHNvbWUgU1NJTSBjYWxjdWxhdGlvbnMKKzUxYjcxZmQyIE1lcmdlICJ2d2VicDogZW5zdXJlIHNldGVudigpIGlzIGF2YWlsYWJsZSBpbiBzdGRsaWIuaCIKK2ZiMDE3NDNhIGdldF9kaXN0bzogZml4IHRoZSByL2cvYiBvcmRlciBmb3IgbHVtYSBjYWxjdWxhdGlvbgorYmZhYjg5NDcgdndlYnA6IGVuc3VyZSBzZXRlbnYoKSBpcyBhdmFpbGFibGUgaW4gc3RkbGliLmgKKzkzMTBkMTkyIHZ3ZWJwOiBoYW5kbGUgd2luZG93IHJlc2l6aW5nIHByb3Blcmx5CitmNzk0NTBjYSBTcGVlZHVwIEFwcGx5TWFwLgorY2ZkZGE3YzYgTWVyZ2UgInByZXZlbnQgMzJiIG92ZXJmbG93IGZvciB2ZXJ5IGxhcmdlIGNhbnZhc193aWR0aCAvIGhlaWdodCIKK2UzNjM5NmJhIE1lcmdlICJnZXRfZGlzdG86IG5ldyBvcHRpb24gdG8gY29tcHV0ZSBTU0lNIG1hcCBhbmQgY29udmVydCB0byBncmF5IgorMThhOWEwYWIgQWRkIGFuIEFQSSB0byBpbXBvcnQgYSBjb2xvci1tYXBwZWQgaW1hZ2UuCiszMGQ0MzcwNiBTcGVlZC11cCBDb21iaW5lZCBlbnRyb3B5IGZvciBwYWxldHRpemVkIGhpc3RvZ3JhbXMuCiszNmFhMDg3YiBnZXRfZGlzdG86IG5ldyBvcHRpb24gdG8gY29tcHV0ZSBTU0lNIG1hcCBhbmQgY29udmVydCB0byBncmF5Cis4NmE4NGIzNSAyeCBmYXN0ZXIgU1NFMiBpbXBsZW1lbnRhdGlvbiBvZiBTU0lNR2V0CitiODM4NGI1MyBsb3dlciBXRUJQX01BWF9BTExPQ0FCTEVfTUVNT1JZIGRlZmF1bHQKKzFjMzY0NDAwIHByZXZlbnQgMzJiIG92ZXJmbG93IGZvciB2ZXJ5IGxhcmdlIGNhbnZhc193aWR0aCAvIGhlaWdodAorZWVlMGNjZTEgTWVyZ2UgIlNtYWxsIExaNzcgc3BlZWR1cHMuIgorNWYxY2FmMjkgU21hbGwgTFo3NyBzcGVlZHVwcy4KKzFlZmZkZTdiIGZpeCBhbmltX3V0aWwuYyBjb21waWxhdGlvbiB3aGVuIEhBVkVfR0lGIGlzIG5vdCBkZWZpbmVkLgorYTJmZTliZjQgU3BlZWR1cCBUcmVsbGlzUXVhbnRpemVCbG9jaygpLgorNTczY2NlMjcgc21hcnRZVVYgaW1wcm92ZW1lbnRzCisyMWU3NTM3YSAgZml4IGluZmluaXRlIGxvb3AgaW4gY2FzZSBvZiBQQVJUSVRJT04wIG92ZXJmbG93CiswNTNhMTU2NSBNZXJnZSAiQ2hhbmdlIHRoZSBydWxlIG9mIHBpY2tpbmcgVVYgbW9kZSBpbiBNQkFuYWx5emVCZXN0VVZNb2RlKCkiCisxMzc3YWMyZSBDaGFuZ2UgdGhlIHJ1bGUgb2YgcGlja2luZyBVViBtb2RlIGluIE1CQW5hbHl6ZUJlc3RVVk1vZGUoKQorN2MxZmI3ZDAgZml4IHVpbnQzMl90IGluaXRpYWxpemF0aW9uICgwLiAtPiAwKQorYmZmZjBiZjMgc3BlZWQtdXAgU1NJTSBjYWxjdWxhdGlvbgorNjQ1NzdkZTggRGUtVlA4TC1pemUgR2V0RW50cm9wVW5yZWZpbmVkSGVscGVyLgorYTdiZTczMjggTWVyZ2UgInJlZmFjdG9yIHRoZSBQU05SIC8gU1NJTSBjYWxjdWxhdGlvbiBjb2RlIgorNTBjM2Q3ZGEgcmVmYWN0b3IgdGhlIFBTTlIgLyBTU0lNIGNhbGN1bGF0aW9uIGNvZGUKK2Q2MjI4YWVkIGluZGVudGF0aW9uIGZpeCBhZnRlciBJNzA1NWQzZWUzYmQ3ZWQ1ZTc4ZTk0YWU4MmNiODU4ZmE3ZGIzZGRjMAorZGQ1MzhiMTkgUmVtb3ZlIHVudXNlZCBkZWNsYXJhdGlvbi4KKzZjYzQ4YjE3IE1vdmUgc29tZSBsb3NzbGVzcyBsb2dpYyBvdXQgb2YgZHNwLgorNzgzNjNlOWUgTWVyZ2UgIlJlbW92ZSBhIHJlZHVuZGFudCBjYWxsIHRvIEluaXRMZWZ0KCkgaW4gVlA4SXRlcmF0b3JSZXNldCgpIgorZmZkMDE5MjkgUmVmYWN0b3IgVlA4SXRlcmF0b3JOZXh0KCkuCitjNGY2ZDljOSBSZW1vdmUgYSByZWR1bmRhbnQgY2FsbCB0byBJbml0TGVmdCgpIGluIFZQOEl0ZXJhdG9yUmVzZXQoKQorYzI3ZDgyMTAgTWVyZ2UgInNtYXJ0WVVWOiBzaW1wbGlmeSBtYWluIGxvb3AiCiswNzc5NTI5NiBzbWFydFlVVjogc2ltcGxpZnkgbWFpbiBsb29wCitjOWI0NTg2MyBTcGxpdCBvZmYgY29tbW9uIGxvc3NsZXNzIGRzcCBpbmxpbmUgZnVuY3Rpb25zLgorNDkwYWU1YjEgc21hcnRZVVY6IGltcHJvdmUgaW5pdGlhbCBzdGF0ZSBmb3IgZmFzdGVyIGNvbnZlcmdlbmNlCis4OTQyMzJiZSBzbWFydFlVVjogZml4IGFuZCBzaW1wbGlmeSB0aGUgb3Zlci16ZWFsb3VzIHN0b3AgY3JpdGVyaW9uCis4ZGUwODQ4MyBSZW1vdmUgdW51c2VkIGNvZGUgaW4gd2VicGkuaAorNDFjYWI3ZmUgaW1hZ2Vpby9BbmRyb2lkLm1rOiBjb3JyZWN0IGltYWdlZGVjIGRlcGVuZGVuY2llcworODJjOTFjNzAgTWVyZ2UgImxpYmltYWdlZW5jLmE6IGV4dHJhY3QgaW1hZ2Utc2F2aW5nIGNvZGUgZnJvbSBkd2VicCIKK2FmMWFkM2UyIGxpYmltYWdlZW5jLmE6IGV4dHJhY3QgaW1hZ2Utc2F2aW5nIGNvZGUgZnJvbSBkd2VicAorZGQ3MzA5ZTMgTWVyZ2UgImRvYzogdXNlIHR3bydzIGNvbXBsZW1lbnQgZXhwbGljaXRseSBmb3IgdWludDgtPmludDggY29udmVyc2lvbiIKKzYxMDU3NzdlIE1lcmdlICJhZGQgZ2lmMndlYnAgdG8gQ01ha2UiCisxM2FlMDExZSBkb2M6IHVzZSB0d28ncyBjb21wbGVtZW50IGV4cGxpY2l0bHkgZm9yIHVpbnQ4LT5pbnQ4IGNvbnZlcnNpb24KKzRiZGEwY2ZiIGFkZCBnaWYyd2VicCB0byBDTWFrZQorNjAyOWM3ZmUgTWVyZ2UgInJlbW92ZSBtZW50aW9uIG9mIGZyYWdtZW50LCBmcmdtLCBGUkdNLCBldGMuIgorNTQ1YzE0N2YgcmVtb3ZlIG1lbnRpb24gb2YgZnJhZ21lbnQsIGZyZ20sIEZSR00sIGV0Yy4KKzViNDZmN2ZjIGN3ZWJwLjE6IGltcHJvdmUgc29tZSBncmFtbWFyCis5ZTQ3OGY4MCBkZWMvdnA4bC5jOiBhZGQgYXNzZXJ0aW9ucyBpbiBFbWl0UmVzY2FsZWRSb3dzUkdCQS9ZVVZBCis0M2JkODk1OCBNYWtlIGdpZiB0cmFuc3BhcmVudCBjb2xvciB0byBiZSB0cmFuc3BhcmVudCBibGFjaworMDg4N2ZjMmQgTWVyZ2UgImdldF9kaXN0bzogYWRkIGEgJy1vIGZpbGUnIG9wdGlvbiB0byBzYXZlIGEgZGlmZiBtYXAiCiswZGU0OGUxOCBnZXRfZGlzdG86IGFkZCBhICctbyBmaWxlJyBvcHRpb24gdG8gc2F2ZSBhIGRpZmYgbWFwCiswYTU3YWQwZCBjb3NtZXRpY3M6IFdlYlBTYWZlQWxsb2MgLT4gV2ViUFNhZmVNYWxsb2MKKzBhNDY5OWJjIE1lcmdlICJXZWJQUGljdHVyZURpc3RvcnRpb24oKTogZnJlZSgpIC0+IFdlYlBTYWZlRnJlZSgpIgorMjlmZWRiZjUgQW5pbV9lbmNvZGVyOiBjb3JyZWN0bHkgaGFuZGxlIGVuYy0+cHJldl9jYW5kaWRhdGVfdW5kZWNpZGVkXworMzJkZWFkNGUgV2ViUFBpY3R1cmVEaXN0b3J0aW9uKCk6IGZyZWUoKSAtPiBXZWJQU2FmZUZyZWUoKQorODVjZDVkMDYgU21hcnRlciBMWjc3IGZvciB1bmlmb3JtIHJlZ2lvbnMuCis2NTg1MDc1ZiBDaGFuZ2UgUGl4ZWxzQXJlU2ltaWxhcigpIHRvIGhhbmRsZSBibGFjayBwaXhlbHMgY29ycmVjdGx5LgorYzBhMjdmZDIgdndlYnA6IENsZWFyIHByZXZpb3VzIGZyYW1lIHdoZW4gYSBrZXkgdHJpZ2dlcnMgYSByZWRyYXcKKzU3YTVlM2I2IHdlYnBfcXVhbGl0eSBzaG91bGQgcmV0dXJuICcwJyBpbiBjYXNlIG9mIHN1Y2Nlc3MuCis3ZjFiODk3YiBGYXN0ZXIgc3RvY2hhc3RpYyBoaXN0b2dyYW0gbWVyZ2luZy4KKzQ4YzgxMGI4IE1lcmdlICJyZW1vdmUgV0VCUF9GT1JDRV9BTElHTkVEIGFuZCB1c2UgbWVtY3B5KCkgaW5zdGVhZC4iCiszODg0OTcyZSByZW1vdmUgV0VCUF9GT1JDRV9BTElHTkVEIGFuZCB1c2UgbWVtY3B5KCkgaW5zdGVhZC4KKzQ4NWNhYzFhIHN3aXRjaCBsaWJpbWFnZWRlYy5hIGFuZCBsaWJpbWFnZWlvX3V0aWwuYSB0byBhdm9pZCB1bmRlZmluZWQgc3ltYm9sCiswMDVlMTViMSBNZXJnZSAie2V4dHJhcyxtdXh9L01ha2VmaWxlLmFtOiBhZGQgbWlzc2luZyAtbG0iCis2YWI0OTZlZCBmaXggc29tZSAndW5zaWduZWQgaW50ZWdlciBvdmVyZmxvdycgd2FybmluZ3MgaW4gdWJzYW4KKzhhNGViYzZhIFJldmVydCAiZml4ICd1bnNpZ25lZCBpbnRlZ2VyIG92ZXJmbG93JyB3YXJuaW5ncyBpbiB1YnNhbiIKKzlkNGYyMDlmIE1lcmdlIGNoYW5nZXMgSTI1NzExZGQ1LEk0MzE4OGZhYgorZTQ0ZjUyNDggZml4ICd1bnNpZ25lZCBpbnRlZ2VyIG92ZXJmbG93JyB3YXJuaW5ncyBpbiB1YnNhbgorMjdiNWQ5OTEgRml4IGFzc2VydGlvbnMgaW4gV2ViUFJlc2NhbGVyRXhwb3J0Um93KCkKKzc0ZjZmOWU3IEFkZCBkZXNjcmlwdGlvbnMgb2YgZGVmYXVsdCBjb25maWd1cmF0aW9uIGluIGhlbHAgaW5mby4KK2FhZjI1MzBjIHtleHRyYXMsbXV4fS9NYWtlZmlsZS5hbTogYWRkIG1pc3NpbmcgLWxtCisxMjY5ZGM3YyBSZWZhY3RvciBWUDhMQ29sb3JDYWNoZUNvbnRhaW5zKCkKKzQwODcyZmIyIGRlY19uZW9uLE5lZWRzSGV2OiBtaWNybyBvcHRpbWl6YXRpb24KKzdiNTRlMjZiIEFkZCBhIENNYWtlIG9wdGlvbiBmb3IgV0VCUF9TV0FQXzE2QklUX0NTUC4KK2QyMjIzZDhkIEZpeCBtaXNzaW5nIGNwdS1mZWF0dXJlcyBmb3IgQW5kcm9pZC4KK2JmMTZhNGI0IE1lcmdlICJjcHUuY21ha2U6IGltcHJvdmUgd2VicF9jaGVja19jb21waWxlcl9mbGFnIG91dHB1dCIKK2VlMTA1N2UzIGNwdS5jbWFrZTogaW1wcm92ZSB3ZWJwX2NoZWNrX2NvbXBpbGVyX2ZsYWcgb3V0cHV0CitiNTUxZTU4NyBjb3NtZXRpY3M6IGFkZCB7fXMgb24gY29udGludWVkIGNvbnRyb2wgc3RhdGVtZW50cworZDJlNDQ4NGUgZHNwL01ha2VmaWxlLmFtOiBwdXQgbXNhIHNvdXJjZSBpbiBjb3JyZWN0IGxpYgorYzdmNjZjODIgTWVyZ2UgInV0aWxzL3RocmVhZC5jLGNvc21ldGljczogam9pbiBhIGZldyBsaW5lcyIKKzk4ZDhmMjk1IE1lcmdlICJleGFtcGxlcy9NYWtlZmlsZS5hbSxjb3NtZXRpY3M6IHNvcnQgYmluYXJ5IHRhcmdldHMiCiszOWY0ZmZiYyB1dGlscy90aHJlYWQuYyxjb3NtZXRpY3M6IGpvaW4gYSBmZXcgbGluZXMKK2E4NmNlMmIxIE1lcmdlICJleHRyYXMvTWFrZWZpbGUuYW06IGRvbid0IGluc3RhbGwgbGlid2VicGV4dHJhcyIKKzZmYTlmZTI0IGV4dHJhcy9NYWtlZmlsZS5hbTogZG9uJ3QgaW5zdGFsbCBsaWJ3ZWJwZXh0cmFzCiswYjJjNThhOSBGaXggYW4gdW5zaWduZWQgaW50ZWdlciBvdmVyZmxvdyBlcnJvciBpbiBlbmMvY29zdC5oCitkN2NlNGEyZSBleGFtcGxlcy9NYWtlZmlsZS5hbSxjb3NtZXRpY3M6IHNvcnQgYmluYXJ5IHRhcmdldHMKKzM4NmU0YmEyIFJlc2V0IHNlZ21lbnQgaWQgaWYgd2UgZGVjaWRlIG5vdCB0byB1cGRhdGUgc2VnbWVudCBtYXAKKzdiODdlODQ4IE1lcmdlICJBZGQgTVNBIG9wdGltaXplZCBZVVYgdG8gUkdCIHVwc2FtcGxpbmcgZnVuY3Rpb25zIgorZDNkZGFjYjYgQWRkIE1TQSBvcHRpbWl6ZWQgWVVWIHRvIFJHQiB1cHNhbXBsaW5nIGZ1bmN0aW9ucworZWI5OGQ4ZDggd2VicF9xdWFsaXR5OiBkZXRlY3QgbG9zc2xlc3MgZm9ybWF0IGFuZCBmZWF0dXJlcworZWJlZTU3ZjQgbW92ZSBpbWFnZWlvL2V4YW1wbGVfdXRpbC5baGNdIChiYWNrIHRvKSBleGFtcGxlcy8KKzk5NTQyYmJmIHdlYnBkZWM6IHMvRXhVdGlsLy8KK2RhNTczY2Y0IGltYWdlaW9fdXRpbDogcy9FeFV0aWwvSW1nSW9VdGlsLworYmRkYTViZDQgc3BsaXQgZXhhbXBsZV91dGlsLmgKKzE1ZWQ0NjJiIC5naXRpZ25vcmU6IGFkZCBleHRyYXMve2dldF9kaXN0byx3ZWJwX3F1YWxpdHl9Cis3YmU1NzQ4OSBNZXJnZSAiVlA4RXN0aW1hdGVRdWFsaXR5KCk6IHJvdWdodHkgZXN0aW1hdGUgd2VicCBiaXRzdHJlYW0gcXVhbGl0eSBmYWN0b3IiCis1NzAyMDUyNSBNYWtlZmlsZS52YzogYWRkIG1pc3NpbmcgaW1hZ2VpbyB0YXJnZXQKK2U4YWI2YTgyIFZQOEVzdGltYXRlUXVhbGl0eSgpOiByb3VnaHR5IGVzdGltYXRlIHdlYnAgYml0c3RyZWFtIHF1YWxpdHkgZmFjdG9yCitmZWU3YjNkNiBNZXJnZSAiJ2V4dHJhcy9nZXRfZGlzdG8nIGV4YW1wbGU6IGNvbXB1dGUgUFNOUiBiZXR3ZWVuIHR3byBmaWxlcyIKKzFlN2Q0NDAxICdleHRyYXMvZ2V0X2Rpc3RvJyBleGFtcGxlOiBjb21wdXRlIFBTTlIgYmV0d2VlbiB0d28gZmlsZXMKKzRjZWNhYjYzIHBuZ2RlYy5jLGpwZWdkZWMuW2hjXTogcmVtb3ZlIHVubmVjZXNzYXJ5IGluY2x1ZGVzCisyNTlmMDQzNCBtYWtlZmlsZS51bml4OiBub3JtYWxpemUgaW1hZ2UgZGVjb2RlIGxpYiBuYW1lCitlZDM0YzM5YiBmaXg6IGV4YW1wbGVzL2xpYmV4YW1wbGVfZGVjLmEgPT4gaW1hZ2Vpby9saWJleGFtcGxlX2RlYy5hCiszM2Q4ZDBkNCBNZXJnZSAibW92ZSBleGFtcGxlcy97ZXhhbXBsZV91dGlsLGltYWdlX2RlY30gdG8gaW1hZ2Vpby8iCitjOTYwYjgyZSBNZXJnZSAiZXh0cmFzLmg6IGNvcnJlY3QgaW5jbHVkZSBndWFyZCIKK2ZlM2NkMjhhIE1lcmdlICIuZ2l0aWdub3JlOiBhZGQgLmdyYWRsZSwgL2J1aWxkIgorNDVmYmViYTUgTWVyZ2UgIkRvIHRva2VuIHJlY29yZGluZyBhbmQgY291bnRpbmcgaW4gYSBzaW5nbGUgbG9vcCIKKzRmMzNjODIwIC5naXRpZ25vcmU6IGFkZCAuZ3JhZGxlLCAvYnVpbGQKK2MzNzliNTVhIG1vdmUgZXhhbXBsZXMve2V4YW1wbGVfdXRpbCxpbWFnZV9kZWN9IHRvIGltYWdlaW8vCis1MTA4ZDlhYSBleHRyYXMuaDogY29ycmVjdCBpbmNsdWRlIGd1YXJkCithZDQ5N2ZiYyBtb3ZlIHNyYy9leHRyYXMgdG8gdGhlIHRvcC1sZXZlbAorMGMwZmI4MzIgRG8gdG9rZW4gcmVjb3JkaW5nIGFuZCBjb3VudGluZyBpbiBhIHNpbmdsZSBsb29wCis5YWM3NGY5MiBBZGQgTVNBIG9wdGltaXplZCByZXNjYWxpbmcgZnVuY3Rpb25zCitjYjE5ZGJjMSBBZGQgTVNBIG9wdGltaXplZCBjb2xvciB0cmFuc2Zvcm0gZnVuY3Rpb25zCiszZjQwNDJiNSBXZWJQQW5pbUVuY29kZXI6IElmICdtaW5pbWl6ZV9zaXplJyBhbmQgJ2FsbG93X21peGVkJyBvbiwgdHJ5IGxvc3N5ICsgbG9zc2xlc3MuCis1ZTJlYjg5ZSBjb3NtZXRpY3MsZHNwLyptc2EuYzogYXNzb2NpYXRlICcqJyB3aXRoIHRoZSB0eXBlCis1YjYwZGI1YyBGYXN0TUJBbmFseXplKCkgZm9yIHF1aWNrIGkxNi9pNCBkZWNpc2lvbgorNTY3ZTY5NzcgQWRkIE1TQSBvcHRpbWl6ZWQgQ29sbGVjdEhpc3RvZ3JhbSBmdW5jdGlvbgorYzU0YWI4ZGQgQWRkIE1TQSBvcHRpbWl6ZWQgcXVhbnRpemF0aW9uIGZ1bmN0aW9ucworZWM2ZjY4YzUgTWVyZ2UgIlJlbW92ZSBRdWFudGl6ZUJsb2NrV0hUKCkgaW4gZW5jLmMiCisyYTVjNDE3YyBBcHBseSB0aGUgUkxFIGhldXJpc3RpYyB0byBMWjc3LgorOTFiNTllODggUmVtb3ZlIFF1YW50aXplQmxvY2tXSFQoKSBpbiBlbmMuYworZmU1NzI3MzcgQWRkIE1TQSBvcHRpbWl6ZWQgU1NFIGZ1bmN0aW9ucworNmI1M2NhODcgY29zbWV0aWNzLChkZWN8ZW5jKV9zc2UyLmM6IGZpeCBpbmRlbnQKK2IxNWQwMGQ5IE1lcmdlICJBZGQgTVNBIG9wdGltaXplZCBlbmNvZGVyIEludHJhQ2hyb21hUHJlZHMgZnVuY3Rpb24iCithZmUzY2VjOCBBZGQgTVNBIG9wdGltaXplZCBlbmNvZGVyIEludHJhQ2hyb21hUHJlZHMgZnVuY3Rpb24KK2ZjOGNhZDlmIHJlZHVjZSB0aGUgbnVtYmVyIG9mIG1hbGxvYy9mcmVlIGN5Y2xlcyBpbiBodWZmbWFuLmMKKzdiNGIwNWUwIEFkZCBNU0Egb3B0aW1pemVkIGVuY29kZXIgSW50cmExNlByZWRzIGZ1bmN0aW9uCitjMTg3ODdhMCBBZGQgTVNBIG9wdGltaXplZCBlbmNvZGVyIEludHJhNFByZWRzIGZ1bmN0aW9uCis0NzlkMTkwOCB3ZWJwbXV4OiBBbHNvIHByaW50IGNvbXByZXNzaW9uIGluZm8gcGVyIGZyYW1lLgorYTgwZThjZmQgUHJvdmlkZSBzdXBwb3J0IGZvciBDTWFrZSBvbiBBbmRyb2lkIHN0dWRpbyAyLjIuCis2YzYyODQxMCBTcGxpdCB0aGUgbWFpbiBDTWFrZSBmaWxlLgorYmJiNmVjZDkgTWVyZ2UgIkFkZCBNU0Egb3B0aW1pemVkIGRpc3RvcnRpb24gZnVuY3Rpb25zIgorNzkxNTM5NmYgQWRkIE1TQSBvcHRpbWl6ZWQgZGlzdG9ydGlvbiBmdW5jdGlvbnMKKzY1MmU5NDRmIE1lcmdlICJidWlsZC5ncmFkbGU6IHJlbW92ZSB0YWIiCitjMDk5MWExNCBpbyxFbWl0UmVzY2FsZWRBbHBoYVlVVjogZmFjdG9yIG91dCBhIGNvbW1vbiBleHByCis0OGJmNWVkMSBidWlsZC5ncmFkbGU6IHJlbW92ZSB0YWIKK2JmZWY2YzlmIE1lcmdlIHRhZyAndjAuNS4xJworM2Q5N2JiNzUgdXBkYXRlIENoYW5nZUxvZyAodGFnOiB2MC41LjEsIG9yaWdpbi8wLjUuMSwgMC41LjEpCitkZWI1NGQ5MSBDbGFyaWZ5IHRoZSBleHBlY3RlZCAnY29uZmlnJyBsaWZlc3BhbiBpbiBXZWJQSURlY29kZSgpCis0MzUzMDhlMCBBZGQgTVNBIG9wdGltaXplZCBlbmNvZGVyIHRyYW5zZm9ybSBmdW5jdGlvbnMKK2RjZTY0YmZhIEFkZCBNU0Egb3B0aW1pemVkIGFscGhhIGZpbHRlciBmdW5jdGlvbnMKKzQyOTEyMGQwIEFkZCBNU0Egb3B0aW1pemVkIGNvbG9yIHRyYW5zZm9ybSBmdW5jdGlvbnMKK2M3ZTJkMjQ1IHVwZGF0ZSBDaGFuZ2VMb2cgKHRhZzogdjAuNS4xLXJjNSkKKzU1YjJmZWRlIG5vcm1hbGl6ZSB0aGUgbWFjcm9zJyAiZG8gey4uLn0gd2hpbGUgKDApIiBjb25zdHJ1Y3RzCis3MDFjNzcyZSBBZGQgTVNBIG9wdGltaXplZCBjb2xvcnNwYWNlIGNvbnZlcnNpb24gZnVuY3Rpb25zCitjN2ViMDZmNyBGaXggY29ybmVyIGNhc2UgaW4gQ29zdE1hbmFnZXJJbml0LgorZjkxOGNiMTAgZml4IHJlc2NhbGluZyBidWc6IGFscGhhIHBsYW5lIHdhc24ndCBmaWxsZWQgd2l0aCAweGZmCithYjc5MzdhNSBnaWYyd2VicDogbm9ybWFsaXplIHRoZSBudW1iZXIgb2YgLidzIGluIHRoZSBoZWxwIG1lc3NhZ2UKKzNjZGVjODQ3IHZ3ZWJwOiBub3JtYWxpemUgdGhlIG51bWJlciBvZiAuJ3MgaW4gdGhlIGhlbHAgbWVzc2FnZQorYmRmNjI0MWUgY3dlYnA6IG5vcm1hbGl6ZSB0aGUgbnVtYmVyIG9mIC4ncyBpbiB0aGUgaGVscCBtZXNzYWdlCiswNmEzOGM3YiBmaXggcmVzY2FsaW5nIGJ1ZzogYWxwaGEgcGxhbmUgd2Fzbid0IGZpbGxlZCB3aXRoIDB4ZmYKKzMxOWUzN2JlIEltcHJvdmUgbG9zc2xlc3MgY29tcHJlc3Npb24uCis2YTE5NzkzNyBBZGQgTVNBIG9wdGltaXplZCBpbnRyYSBwcmVkIGNocm9tYSBmdW5jdGlvbnMKKzQ0N2FkYmNlICdvdXIgYnVnIHRyYWNrZXInIC0+ICd0aGUgYnVnIHRyYWNrZXInCis5N2I5ZTY0NCBub3JtYWxpemUgdGhlIG51bWJlciBvZiAuJ3MgaW4gdGhlIGhlbHAgbWVzc2FnZQorMjkzZDc4NmYgQWRkZWQgTVNBIG9wdGltaXplZCBpbnRyYSBwcmVkaWN0aW9uIDE2eDE2IGZ1bmN0aW9ucworMGFmYTBjZTIgQWRkZWQgTVNBIG9wdGltaXplZCBpbnRyYSBwcmVkaWN0aW9uIDR4NCBmdW5jdGlvbnMKK2E2NjIxYmFjIEFkZGVkIE1TQSBvcHRpbWl6ZWQgc2ltcGxlIGVkZ2UgZmlsdGVyaW5nIGZ1bmN0aW9ucworYmI1MGJmNDIgcG5nZGVjLFJlYWRGdW5jOiB0aHJvdyBhbiBlcnJvciBvbiBpbnZhbGlkIHJlYWQKKzM4MDYzYWYxIGRlY29kZS5oLFdlYlBHZXRJbmZvOiBub3JtYWxpemUgZnVuY3Rpb24gY29tbWVudAorMWViZjE5M2MgQWRkZWQgTVNBIG9wdGltaXplZCBjaHJvbWEgZWRnZSBmaWx0ZXJpbmcgZnVuY3Rpb25zCis5YWQyMzUyZCBNZXJnZSAiQWRkZWQgTVNBIG9wdGltaXplZCBlZGdlIGZpbHRlcmluZyBmdW5jdGlvbnMiCis2MDc1MTA5NiBBZGRlZCBNU0Egb3B0aW1pemVkIGVkZ2UgZmlsdGVyaW5nIGZ1bmN0aW9ucworOWU4ZTFiN2IgSW5saW5lIEdldFJlc2lkdWFsIGZvciBzcGVlZC4KKzdkNThkMWI3IFNwZWVkLXVwIHVuaWZvcm0tcmVnaW9uIHByb2Nlc3NpbmcuCis4ZWM3MDMyYiBzaW1wbGlmeSBIaXN0b2dyYW1Db21iaW5lRW50cm9weUJpbigpCisyM2UyOWNiMSBNZXJnZSAiRml4IGEgYm91bmRhcnkgY2FzZSBpbiBCYWNrd2FyZFJlZmVyZW5jZXNIYXNoQ2hhaW5EaXN0YW5jZU9ubHkuIiBpbnRvIDAuNS4xCis0NzJhMDQ5YiByZW1vdmUgYmluX21hcFtdIGFsbG9jYXRpb24gYWx0b2dldGhlcgorMGJiMjNiMmMgZnJlZSAtPiBXZWJQU2FmZUZyZWUoKQorYTk3N2I0YjUgTWVyZ2UgInJld3JpdGUgdGhlIGJpbl9tYXAgY2x1c3RlcmluZyB0byB1c2UgbGVzcyBtZW1vcnkiCiszNTkxYmE2NiByZXdyaXRlIHRoZSBiaW5fbWFwIGNsdXN0ZXJpbmcgdG8gdXNlIGxlc3MgbWVtb3J5CitlNmFjNDUwYyB1dGlscy5baGNdOiBzL01BWF9DT0xPUl9DT1VOVC9NQVhfUEFMRVRURV9TSVpFLworZTdiOTE3NzIgTWVyZ2UgIkRlY29kZUltYWdlRGF0YSgpOiBjaGFuZ2UgdGhlIGluY29ycmVjdCBhc3NlcnQiIGludG8gMC41LjEKKzJhYmZhNTRmIERlY29kZUltYWdlRGF0YSgpOiBjaGFuZ2UgdGhlIGluY29ycmVjdCBhc3NlcnQKKzVhNDhmY2Q4IE1lcmdlICJjb25maWd1cmU6IHRlc3QgZm9yIC1XZmxvYXQtY29udmVyc2lvbiIKKzAxNzRkMThkIEZpeCBhIGJvdW5kYXJ5IGNhc2UgaW4gQmFja3dhcmRSZWZlcmVuY2VzSGFzaENoYWluRGlzdGFuY2VPbmx5LgorNmE5YzI2MmEgTWVyZ2UgIkFkZGVkIE1TQSBvcHRpbWl6ZWQgdHJhbnNmb3JtIGZ1bmN0aW9ucyIKK2NmYmNjNWVjIE1ha2Ugc3VyZSB0byBjb25zaWRlciBzbWFsbCBkaXN0YW5jZXMgaW4gTFo3Ny4KKzVlNjBjNDJhIEFkZGVkIE1TQSBvcHRpbWl6ZWQgdHJhbnNmb3JtIGZ1bmN0aW9ucworM2RjMjhkNzYgY29uZmlndXJlOiB0ZXN0IGZvciAtV2Zsb2F0LWNvbnZlcnNpb24KK2YyYTA5NDZhIGFkZCBzb21lIGFzc2VydHMgdG8gZGVsaW1pdCB0aGUgcGVyaW1ldGVyIG9mIENvc3RNYW5hZ2VyJ3Mgb3BlcmF0aW9uCis5YTU4M2M2NiBmaXggaW52YWxpZC13cml0ZSBidWcgZm9yIGFscGhhLWRlY29kaW5nCitmNjY1MTJkYiBtYWtlIGdyYWRsZXcgZXhlY3V0YWJsZQorNmZkYTU4ZjEgYmFja3dhcmRfcmVmZXJlbmNlczogcXVpZXQgZG91YmxlLT5pbnQgd2FybmluZworYTQ4Y2M5ZDIgTWVyZ2UgIkZpeCBhIGNvbXByZXNzaW9uIHJlZ3Jlc3Npb24gZm9yIGltYWdlcyB3aXRoIGxvbmcgdW5pZm9ybSByZWdpb25zLiIgaW50byAwLjUuMQorY2MyNzIwYzEgTWVyZ2UgIlJldmVydCBhbiBMWjc3IGJvdW5kYXJ5IGNvbnN0YW50LiIgaW50byAwLjUuMQorMDU5YWFiNGYgRml4IGEgY29tcHJlc3Npb24gcmVncmVzc2lvbiBmb3IgaW1hZ2VzIHdpdGggbG9uZyB1bmlmb3JtIHJlZ2lvbnMuCitiMGM3ZTQ5ZSBDaGVjayBtb3JlIGJhY2t3YXJkIG1hdGNoZXMgd2l0aCBoaWdoZXIgcXVhbGl0eS4KK2EzNjExNTEzIFJldmVydCBhbiBMWjc3IGJvdW5kYXJ5IGNvbnN0YW50LgorODE5MDM3NGMgUkVBRE1FOiBmaXggdHlwbworNzU1MWRiNDQgdXBkYXRlIE5FV1MKKzBmYjIyNjljIGJ1bXAgdmVyc2lvbiB0byAwLjUuMQorZjQ1Mzc2MTAgdXBkYXRlIEFVVEhPUlMgJiAubWFpbG1hcAorMzI1OTU3MWUgUmVmYWN0b3IgR2V0Q29sb3JQYWxldHRlIG1ldGhvZC4KKzFkZjVlMjYwIGF2b2lkIHVzaW5nIHRtcCBoaXN0b2dyYW0gaW4gUHJlcGFyZVBhaXIoKQorNzY4NTEyM2EgZml4IGNvbW1lbnQgdHlwb3MKK2EyNDZiOTIxIFNwZWVkdXAgYmFja3dhcmQgcmVmZXJlbmNlcy4KKzc2ZDczZjE4IE1lcmdlICJDb3N0TWFuYWdlcjogaW50cm9kdWNlIGEgZnJlZS1saXN0IG9mIH4xMCBpbnRlcnZhbHMiCitlYWIzOWQ4MSBDb3N0TWFuYWdlcjogaW50cm9kdWNlIGEgZnJlZS1saXN0IG9mIH4xMCBpbnRlcnZhbHMKKzRjNTlhYWMwIE1lcmdlICJtaXBzIG1zYSB3ZWJwIGNvbmZpZ3VyYXRpb24iCiswNDNjMzNmMSBNZXJnZSAiSW1wcm92ZSBzcGVlZCBhbmQgY29tcHJlc3Npb24gaW4gYmFja3dhcmQgcmVmZXJlbmNlIGZvciBsb3NzbGVzcy4iCis3MWJlOWI4YyBNZXJnZSAiY2xhcmlmeSB2YXJpYWJsZSBuYW1lcyBpbiBIaXN0b2dyYW1SZW1hcCgpIgorMGJhN2ZkNzAgSW1wcm92ZSBzcGVlZCBhbmQgY29tcHJlc3Npb24gaW4gYmFja3dhcmQgcmVmZXJlbmNlIGZvciBsb3NzbGVzcy4KKzA0ODFkNDJhIENvc3RNYW5hZ2VyOiBjYWNoZSBvbmUgaW50ZXJ2YWwgYW5kIHJlLXVzZSBpdCB3aGVuIHBvc3NpYmxlCis0MWI3ZTZiNSBNZXJnZSAiaGlzdG9ncmFtOiBmaXggYmluIGNhbGN1bGF0aW9uIgorOTZjM2Q2MjQgaGlzdG9ncmFtOiBmaXggYmluIGNhbGN1bGF0aW9uCitmZTllMzFlZiBjbGFyaWZ5IHZhcmlhYmxlIG5hbWVzIGluIEhpc3RvZ3JhbVJlbWFwKCkKK2NlM2M4MjQ3IGRpc2FibGUgbmVhci1sb3NzbGVzcyBxdWFudGl6YXRpb24gaWYgcGFsZXR0ZSBpcyB1c2VkCitlMTFkYTA4MSBtaXBzIG1zYSB3ZWJwIGNvbmZpZ3VyYXRpb24KKzVmOGY5OThkIG11eDogUHJlc2VuY2Ugb2YgdW5rbm93biBjaHVua3Mgc2hvdWxkIHRyaWdnZXIgVlA4WCBjaHVuayBvdXRwdXQuCitjYWRlYzBiMSBNZXJnZSAiU3luYyBtaXBzMzIgYW5kIGRzcF9yMiBZVVYtPlJHQiBjb2RlIHdpdGggQyB2ZXJpc29uIgorZDk2Mzc3NTggQ29tcHV0ZSB0aGUgaGFzaCBjaGFpbiBvbmNlIGFuZCBmb3IgYWxsIGZvciBsb3NzbGVzcyBjb21wcmVzc2lvbi4KKzUwYTQ4NjY1IFN5bmMgbWlwczMyIGFuZCBkc3BfcjIgWVVWLT5SR0IgY29kZSB3aXRoIEMgdmVyaXNvbgorZWVlNzg4ZTIgTWVyZ2UgImludHJvZHVjZSBhIGNvbW1vbiBzaWduYXR1cmUgZm9yIGFsbCBpbWFnZSByZWFkZXIgZnVuY3Rpb24iCitkNzdiODc3YyBpbnRyb2R1Y2UgYSBjb21tb24gc2lnbmF0dXJlIGZvciBhbGwgaW1hZ2UgcmVhZGVyIGZ1bmN0aW9uCitjYThkOTUxOSByZW1vdmUgc29tZSBvYnNvbGV0ZSBUT0RPcworYWUyYTcyMjIgY29sbGVjdCBhbGwgZGVjb2RpbmcgdXRpbGl0aWVzIGZyb20gZXhhbXBsZXMvIGluIGxpYmV4YW1wbGVkZWMuYQorMGI4YWU4NTIgTWVyZ2UgIk1vdmUgRGl0aGVyQ29tYmluZTh4OCB0byBkc3AvZGVjLmMiCis3N2NhZDg4NSBNZXJnZSAiUmVhZFdlYlA6IGF2b2lkIGNvbnZlcnNpb24gdG8gQVJHQiBpZiBmaW5hbCBmb3JtYXQgaXMgWVVWQSIKK2FiOGQ2Njk4IFJlYWRXZWJQOiBhdm9pZCBjb252ZXJzaW9uIHRvIEFSR0IgaWYgZmluYWwgZm9ybWF0IGlzIFlVVkEKK2Y4YjdjZTllIE1lcmdlICJ0ZXN0IHBvaW50ZXIgdG8gTlVMTCBleHBsaWNpdGx5IgorNWRmNmYyMTQgdGVzdCBwb2ludGVyIHRvIE5VTEwgZXhwbGljaXRseQorNzdmMjFjOWMgTW92ZSBEaXRoZXJDb21iaW5lOHg4IHRvIGRzcC9kZWMuYworYzllNmQ4NjUgQWRkIGdyYWRsZSBzdXBwb3J0CitjNjVmNDFlOCBSZXZlcnQgIkFkZCBncmFkbGUgc3VwcG9ydCIKK2JmNzMxZWRlIEFkZCBncmFkbGUgc3VwcG9ydAorMDgzMzNiODUgV2ViUEFuaW1FbmNvZGVyOiBEZXRlY3Qgd2hlbiBjYW52YXMgaXMgbW9kaWZpZWQsIHJlc3RvcmUgb25seSB3aGVuIG5lZWRlZC4KKzAyMDlkN2U2IE1lcmdlICJzcGVlZC11cCBNYXBUb1BhbGV0dGUoKSB3aXRoIGJpbmFyeSBzZWFyY2giCitmZGQyOWEzZCBzcGVlZC11cCBNYXBUb1BhbGV0dGUoKSB3aXRoIGJpbmFyeSBzZWFyY2gKK2NmNGE2NTFiIFJldmVydCAiUmVmYWN0b3IgR2V0Q29sb3JQYWxldHRlIG1ldGhvZC4iCiswYTI3YWNhMyBNZXJnZSBjaGFuZ2VzIElkZmE4Y2U4MyxJMTlhZGM5YzQKK2YyNWM0NDA2IFdlYlBBbmltRW5jb2RlcjogUmVzdG9yZSBvcmlnaW5hbCBjYW52YXMgYmV0d2VlbiBtdWx0aXBsZSBlbmNvZGVzLgorMTY5MDA0YjEgUmVmYWN0b3IgR2V0Q29sb3JQYWxldHRlIG1ldGhvZC4KKzU3NjM2MmFiIFZQOExEb0ZpbGxCaXRXaW5kb3c6IHN1cHBvcnQgYmlnLWVuZGlhbiBpbiBmYXN0IHBhdGgKK2FjNDllNGU0IGJpdF9yZWFkZXIuYzogcy9WUDhMX1VTRV9VTkFMSUdORURfTE9BRC9WUDhMX1VTRV9GQVNUX0xPQUQvCitkMzljZWI1OCBWUDhMRG9GaWxsQml0V2luZG93OiByZW1vdmUgc3RhbGUgVE9ETworMmVjMmRlMTQgTWVyZ2UgIlNwZWVkLXVwIEJhY2t3YXJkUmVmZXJlbmNlc0hhc2hDaGFpbkRpc3RhbmNlT25seS4iCiszZTAyM2MxNyBTcGVlZC11cCBCYWNrd2FyZFJlZmVyZW5jZXNIYXNoQ2hhaW5EaXN0YW5jZU9ubHkuCitmMmUxZWZiZSBJbXByb3ZlIG5lYXIgbG9zc2xlc3MgY29tcHJlc3Npb24gd2hlbiBhIHByZWRpY3Rpb24gZmlsdGVyIGlzIHVzZWQuCitlMTVhZmJjZSBkc3AuaDogZml4IHVic2FuIG1hY3JvIG5hbWUKK2U1M2M5Y2NiIGRzcC5oOiBhZGQgV0VCUF9VQlNBTl9JR05PUkVfVU5TSUdORURfT1ZFUkZMT1cKK2FmODFmZGI3IHV0aWxzLmg6IHF1aWV0IC1mc2FuaXRpemU9dW5kZWZpbmVkIHdhcm5pbmdzCitlYTBiZTM1NCBkc3AuaDogcmVtb3ZlIHV0aWxzLmggaW5jbHVkZQorY2QyNzZhZWMgdXRpbHMvKi5jOiAuLi91dGlscy91dGlscy5oIC0+IC4vdXRpbHMuaAorYzg5MjcxMzEgdXRpbHMvTWFrZWZpbGUuYW06IGFkZCBzb21lIG1pc3NpbmcgaGVhZGVycworZWEyNGUwMjYgTWVyZ2UgImRzcC5oOiBhZGQgV0VCUF9VQlNBTl9JR05PUkVfVU5ERUYiCiszNjllMjY0ZSBkc3AuaDogYWRkIFdFQlBfVUJTQU5fSUdOT1JFX1VOREVGCiswZDAyMGE3OCBNZXJnZSAiYWRkIHJ1bnRpbWUgTkVPTiBkZXRlY3Rpb24iCis1ZWUyMTM2YSBNZXJnZSAiYWRkIFZQOExBZGRQaXhlbHMoKSB0byBsb3NzbGVzcy5oIgorNDc0MzVhNjEgYWRkIFZQOExBZGRQaXhlbHMoKSB0byBsb3NzbGVzcy5oCis4ZmE2YWM2OCByZW1vdmUgdHdvIHVic2FuIHdhcm5pbmdzCis3NGZiNTZmYiBhZGQgcnVudGltZSBORU9OIGRldGVjdGlvbgorNDE1NGE4MzkgTUlQUyB1cGRhdGUgdG8gbmV3IFVuZmlsdGVyIEFQSQorYzgwYjlmYzggTWVyZ2UgImNoZXJyeS1waWNrIGRlY29kZXIgZml4IGZvciA2NC1iaXQgYW5kcm9pZCBkZXZpY2VzIgorNjIzNTE0N2UgY2hlcnJ5LXBpY2sgZGVjb2RlciBmaXggZm9yIDY0LWJpdCBhbmRyb2lkIGRldmljZXMKK2Q0MWI4YzQzIGNvbmZpZ3VyZTogdGVzdCBmb3IgLVdmb3JtYXQtKiB3Ly1XZm9ybWF0IHByZXNlbnQKKzVmOTU1ODlmIEZpeCBXRUJQX0FMSUdOIGluIGNhc2UgdGhlIGFyZ3VtZW50IGlzIGEgcG9pbnRlciB0byBhIHR5cGUgbGFyZ2VyIHRoYW4gYSBieXRlLgorMjMwOWZkNWMgcmVwbGFjZSBudW1fcGFydHNfIGJ5IG51bV9wYXJ0c19taW51c19vbmVfICh1bnNpZ25lZCkKKzk2MjlmNGJjIFNpbXBsaWZ5U2VnbWVudHM6IHF1aWV0IC1XYXJyYXktYm91bmRzIHdhcm5pbmcKK2RlNDc0OTJlIE1lcmdlICJ1cGRhdGUgdGhlIFVuZmlsdGVyIEFQSSBpbiBkc3AgdG8gcHJvY2VzcyBvbmUgcm93IGluZGVwZW5kZW50bHkiCisyMTAyY2NkMCB1cGRhdGUgdGhlIFVuZmlsdGVyIEFQSSBpbiBkc3AgdG8gcHJvY2VzcyBvbmUgcm93IGluZGVwZW5kZW50bHkKK2UzOTEyZDU2IFdlYlBBbmltRW5jb2RlcjogUmVzdG9yZSBjYW52YXMgYmVmb3JlIGV2YWx1YXRpbmcgYmxlbmRpbmcgcG9zc2liaWxpdHkuCis2ZTEyZTFlMyBXZWJQQW5pbUVuY29kZXI6IEZpeCBmb3Igc2luZ2xlLWZyYW1lIG9wdGltaXphdGlvbi4KKzYwMmYzNDRhIE1lcmdlIGNoYW5nZXMgSTFkMDNhY2FjLElmY2I2NDIxOQorOTVlY2NjZjYgb25seSBhcHBseSBjb2xvci1tYXBwaW5nIGZvciBhbHBoYSBvbiB0aGUgY3JvcHBlZCBhcmVhCis0N2RkMDcwOCBhbmltX2RpZmY6IEFkZCBhbiBleHBlcmltZW50YWwgb3B0aW9uIGZvciBtYXggaW50ZXItZnJhbWUgZGlmZi4KK2FhODA5Y2ZlIG9ubHkgYWxsb2NhdGUgYWxwaGFfcGxhbmVfIHVwIHRvIGNyb3BfYm90dG9tIHJvdworMzFmMmI4ZDggV2ViUEFuaW1FbmNvZGVyOiBGbGF0dGVuU2ltaWxhclBpeGVscygpOiBsb29rIGZvciBzaW1pbGFyCis3NzRkZmJkYyBwZXJmb3JtIGFscGhhIGZpbHRlcmluZyB3aXRoaW4gdGhlIGRlY29kaW5nIGxvb3AKK2E0Y2FlNjhkIGxvc3NsZXNzIGRlY29kaW5nOiBvbmx5IHByb2Nlc3MgZGVjb2RlZCByb3cgdXAgdG8gbGFzdF9yb3cKKzIzOGNkY2RiIE9ubHkgY2FsbCBXZWJQRGVxdWFudGl6ZUxldmVscygpIG9uIGNyb3BwZWQgYXJlYQorY2Y2YzcxM2EgYWxwaGE6IHByZXBhcmF0b3J5IGNsZWFudXAKK2I5NWFjMGEyIE1lcmdlICJWUDhHZXRIZWFkZXJzKCk6IGluaXRpYWxpemUgVlA4SW8gd2l0aCBzYW5lIHZhbHVlIGZvciBjcm9wL3NjYWxlIGRpbWVuc2lvbnMiCis4OTIzMTM5NCBWUDhHZXRIZWFkZXJzKCk6IGluaXRpYWxpemUgVlA4SW8gd2l0aCBzYW5lIHZhbHVlIGZvciBjcm9wL3NjYWxlIGRpbWVuc2lvbnMKKzU4MjhlMTk5IHVzZV84Yl9kZWNvZGUgLT4gdXNlXzhiX2RlY29kZV8KKzhkY2EwMjQ3IGZpeCBidWcgaW4gYWxwaGEuYyB0aGF0IHdhcyB0cmlnZ2VyaW5nIGEgbWVtb3J5IGVycm9yIGluIGluY3JlbWVudGFsIG1vZGUKKzlhOTUwYzUzIFdlYlBBbmltRW5jb2RlcjogRGlzYWJsZSBmaWx0ZXJpbmcgd2hlbiBibGVuZGluZyBpcyB1c2VkIHdpdGggbG9zc3kgZW5jb2RpbmcuCitlYjQyMzkwMyBXZWJQQW5pbUVuY29kZXI6IGNob29zZSBtYXggZGlmZiBmb3IgZnJhbWVyZWN0IGJhc2VkIG9uIHF1YWxpdHkuCitmZjBhOTRiZSBXZWJQQW5pbUVuY29kZXIgbG9zc3k6IGlnbm9yZSBzbWFsbCBwaXhlbCBkaWZmZXJlbmNlcyBmb3IgZnJhbWUgcmVjdGFuZ2xlcy4KK2Y4MDQwMDg0IGdpZjJ3ZWJwOiBSZW1vdmUgdGhlICdwcmV2X3RvX3ByZXZfY2FudmFzJyBidWZmZXIuCis2ZDhjMDdkMyBNZXJnZSAiV2ViUERlcXVhbnRpemVMZXZlbHMoKTogdXNlIHN0cmlkZSBpbiBDb3VudExldmVscygpIgorZDk2ZmU1ZTAgV2ViUERlcXVhbnRpemVMZXZlbHMoKTogdXNlIHN0cmlkZSBpbiBDb3VudExldmVscygpCitlYzFiMjQwNyBXZWJQUGljdHVyZUltcG9ydCo6IGNoZWNrIG91dHB1dCBwb2ludGVyCitjMDc2ODc2OSBNZXJnZSAiUmV2ZXJ0ICJSZS1lbmFibGUgZW5jb2Rpbmcgb2YgYWxwaGEgcGxhbmUgd2l0aCBjb2xvciBjYWNoZSBmb3IgbmV4dCByZWxlYXNlLiIiCis0MWYxNGJjYiBXZWJQUGljdHVyZUltcG9ydCo6IGNoZWNrIHNyYyBwb2ludGVyCis2NGVlZDM4NyBQYXNzIHN0cmlkZSBwYXJhbWV0ZXIgdG8gV2ViUERlcXVhbnRpemVMZXZlbHMoKQorOTc5MzRlMjQgUmV2ZXJ0ICJSZS1lbmFibGUgZW5jb2Rpbmcgb2YgYWxwaGEgcGxhbmUgd2l0aCBjb2xvciBjYWNoZSBmb3IgbmV4dCByZWxlYXNlLiIKK2U4OGM0Y2EwIGZpeCAtbSAyIG1vZGUtY29zdCBldmFsdWF0aW9uIChjYXVzaW5nIHBhcnRpdGlvbjAgb3ZlcmZsb3cpCis0NTYyZTgzZCBNZXJnZSAiYWRkIGV4dHJhIG1lYW5pbmcgdG8gV2ViUERlY0J1ZmZlcjo6aXNfZXh0ZXJuYWxfbWVtb3J5IgorYWJkYjEwOWYgYWRkIGV4dHJhIG1lYW5pbmcgdG8gV2ViUERlY0J1ZmZlcjo6aXNfZXh0ZXJuYWxfbWVtb3J5Cis4NzVhZWM3MCBlbmNfbmVvbixjb3NtZXRpY3M6IGJyZWFrIGxvbmcgY29tbWVudAorNzFlODU2Y2YgR2V0TUJTU0lNLGNvc21ldGljczogZml4IGFsaWdubWVudAorYTkwZWRmZmIgZml4IG1pc3NpbmcgJ2V4dGVybicgZm9yIFNTSU0gZnVuY3Rpb24gaW4gZHNwLworNDIzZWNhZjQgbW92ZSBzb21lIFNTSU0tYWNjdW11bGF0aW9uIGZ1bmN0aW9uIGZvciBkc3AvCitmMDhlNjYyNCBNZXJnZSAiRml4IEZpbmRDbG9zZXN0RGlzY3JldGl6ZWQgaW4gbmVhciBsb3NzbGVzczoiCiswZDQwY2M1ZSBlbmNfbmVvbixEaXN0bzR4NDogcmVtb3ZlIGFuIHVubmVjZXNzYXJ5IHRyYW5zcG9zZQorZThmZWIyMGUgRml4IEZpbmRDbG9zZXN0RGlzY3JldGl6ZWQgaW4gbmVhciBsb3NzbGVzczoKKzgyMDA2NDMwIGFuaW1fdXRpbDogcXVpZXQgc3RhdGljIGFuYWx5c2lzIHdhcm5pbmcKK2E2ZjIzYzQ5IE1lcmdlICJBbmltRW5jb2RlcjogU3VwcG9ydCBwcm9ncmVzcyBob29rIGFuZCB1c2VyIGRhdGEuIgorYTUxOTM3NzQgTWVyZ2UgIk5lYXIgbG9zc2xlc3MgZmVhdHVyZTogZml4IHNvbWUgY29tbWVudHMuIgorZGE5OGQzMWMgQW5pbUVuY29kZXI6IFN1cHBvcnQgcHJvZ3Jlc3MgaG9vayBhbmQgdXNlciBkYXRhLgorMzMzNTcxMzEgTmVhciBsb3NzbGVzcyBmZWF0dXJlOiBmaXggc29tZSBjb21tZW50cy4KKzBiZWVkMDFhIGNvc21ldGljczogZml4IGluZGVudCBhZnRlciAyZjVlODk4Cis2NzUzZjM1YyBNZXJnZSAiRlRyYW5zZm9ybVdIVCBvcHRpbWl6YXRpb24uIgorNjU4M2JiMWEgSW1wcm92ZSBTU0U0LjEgaW1wbGVtZW50YXRpb24gb2YgVFRyYW5zZm9ybS4KKzc1NjFkMGMzIEZUcmFuc2Zvcm1XSFQgb3B0aW1pemF0aW9uLgorN2NjZGI3MzQgZml4IGluZGVudGF0aW9uIGFmdGVyIHBhdGNoICMzMjgyMjAKKzZlYzBkMmE5IGNsYXJpZnkgdGhlIGxvZ2ljIG9mIHRoZSBlcnJvciBwYXRoIHdoZW4gZGVjb2RpbmcgZmFpbHMuCis4YWEzNTJiMiBNZXJnZSAiUmVtb3ZlIGFuIHVubmVjZXNzYXJ5IHRyYW5zcG9zaXRpb24gaW4gVFRyYW5zZm9ybS4iCitkYjg2MDg4NCBNZXJnZSAicmVtb3ZlIHVzZWxlc3MgI2luY2x1ZGUiCis5OTYwYzMxNiBSZW1vdmUgYW4gdW5uZWNlc3NhcnkgdHJhbnNwb3NpdGlvbiBpbiBUVHJhbnNmb3JtLgorNmUzNmI1MTEgU21hbGwgc3BlZWR1cCBpbiBGVHJhbnNmb3JtLgorOWRiZDRhYWQgTWVyZ2UgImZpeCBDIGFuZCBTSU1EIGZsYWdzIGNvbXBsZXRpb24uIgorZTYwODUzZWEgQWRkIG1pc3NpbmcgY29tbW9uX3NzZTIuaCBmaWxlIHRvIG1ha2VmaWxlLnVuaXgKKzY5NmViMmIwIGZpeCBDIGFuZCBTSU1EIGZsYWdzIGNvbXBsZXRpb24uCisyYjRmZTMzZSBNZXJnZSAiZml4IG11bHRpcGxlIGFsbG9jYXRpb24gZm9yIHRyYW5zZm9ybSBidWZmZXIiCisyZjVlODk4NiBmaXggbXVsdGlwbGUgYWxsb2NhdGlvbiBmb3IgdHJhbnNmb3JtIGJ1ZmZlcgorYmYyYjRmMTEgUmVncm91cCBjb21tb24gU1NFIGNvZGUgKyBvcHRpbWl6YXRpb24uCis0ZWQ2NTBhMSBmb3JjZSAiLXBhc3MgNiIgaWYgLXBzbnIgb3IgLXNpemUgaXMgdXNlZCBidXQgLXBhc3MgaXNuJ3QuCiszZWYxY2U5OCB5dXZfc3NlMjogZml4IC1XY29uc3RhbnQtY29udmVyc2lvbiB3YXJuaW5nCithN2EwM2U5ZiBNZXJnZSBjaGFuZ2VzIEk0ODUyZDE4ZixJNTFjY2I4NWQKKzVlMTIyYmQ2IGdpZjJ3ZWJwOiBzZXQgZW5jX29wdGlvbnMudmVyYm9zZSA9IDAgdy8tcXVpZXQKK2FiM2MyNTgzIGFuaW1fZW5jb2RlLERlZmF1bHRFbmNvZGVyT3B0aW9uczogaW5pdCB2ZXJib3NlCis4ZjBkZWU3NyBNZXJnZSAiY29uZmlndXJlOiBmaXggYnVpbHRpbiBkZXRlY3Rpb24gdy8tV2Vycm9yIgorNGE3Yjg1YTkgY21ha2U6IGZpeCBidWlsdGluIGRldGVjdGlvbiB3Ly1XZXJyb3IKK2I3NDY1N2ZiIGNvbmZpZ3VyZTogZml4IGJ1aWx0aW4gZGV0ZWN0aW9uIHcvLVdlcnJvcgorMzY2MWI5ODAgQWRkIGEgQ01ha2VMaXN0cy50eHQKKzc1ZjRhZjRkIHJlbW92ZSB1c2VsZXNzICNpbmNsdWRlCis2YzFkNzYzMSBhdm9pZCBZb2RhIHN0eWxlIGZvciBjb21wYXJpc29uCis4Y2U5NzVhYyBTU0Ugb3B0aW1pemF0aW9uIGZvciB2ZWN0b3IgbWlzbWF0Y2guCis3ZGI1MzgzMSBNZXJnZSB0YWcgJ3YwLjUuMCcKKzM3ZjA0OTQ5IHVwZGF0ZSBDaGFuZ2VMb2cgKHRhZzogdjAuNS4wLXJjMSwgdGFnOiB2MC41LjAsIG9yaWdpbi8wLjUuMCwgMC41LjApCis3ZTdiNmNjYyBmYXN0ZXIgcmdiNTY1L3JnYjQ0NDQvYXJnYiBvdXRwdXQKKzRjN2Y1NjVmIHVwZGF0ZSBORVdTCisxZjYyYjZiMiB1cGRhdGUgQVVUSE9SUworZTIyNGZkYzggdXBkYXRlIG1haWxtYXAKKzcxMTAwNTAwIGJ1bXAgdmVyc2lvbiB0byAwLjUuMAorMjMwYTY4NWUgUkVBRE1FOiB1cGRhdGUgaGVscCB0ZXh0LCByZXBvIGxpbmsKK2Q0OGU0MjdiIE1lcmdlICJkZW11eDogYWNjZXB0IHJhdyBiaXRzdHJlYW1zIgorOTlhMDFmNGYgTWVyZ2UgIlVuaWZ5IHNvbWUgZW50cm9weSBmdW5jdGlvbnMuIgorNGIwMjVmMTAgTWVyZ2UgImNvbmZpZ3VyZTogZGlzYWJsZSBhc3NlcnRzIGJ5IGRlZmF1bHQiCis5MmNiZGRmOCBNZXJnZSAiZml4IFByaW50QmxvY2tJbmZvKCkiCitjYTUwOWEzMyBVbmlmeSBzb21lIGVudHJvcHkgZnVuY3Rpb25zLgorMzY3YmY5MDMgZml4IFByaW50QmxvY2tJbmZvKCkKK2IwNTQ3ZmYwIG1vdmUgYmFjayBjb21tb24gY29uc3RhbnRzIGZvciBsb3NzbGVzc19lbmMqLmMgaW50byB0aGUgLmgKK2ZiNGM3ODMyIGxvc3NsZXNzOiBzaW1wbGVyIGFscGhhIGNsZWFudXAgcHJlcHJvY2Vzc2luZworYmE3ZjRiNjggTWVyZ2UgImFuaW1fZGlmZjogYWRkIGJyaWVmIGRlc2NyaXB0aW9uIG9mIG9wdGlvbnMiCis0N2RkZDVhNCBNb3ZlIHNvbWUgY29kZWMgbG9naWMgb3V0IG9mIC4vZHNwIC4KK2I0MTA2YzQ0IGFuaW1fZGlmZjogYWRkIGJyaWVmIGRlc2NyaXB0aW9uIG9mIG9wdGlvbnMKKzM1N2Y0NTVkIHl1dl9zc2UyOiBmaXggMzItYml0IHZpc3VhbCBzdHVkaW8gYnVpbGQKK2I5ZDgwZmE0IGNvbmZpZ3VyZTogZGlzYWJsZSBhc3NlcnRzIGJ5IGRlZmF1bHQKKzdiYWRkM2RhIGNvc21ldGljIGZpeDogc2l6ZW9mKHR5cGUpIC0+IHNpemVvZigqdmFyKQorODBjZTI3ZDMgU3BlZWQgdXAgMjQtYml0IHBhY2tpbmcgLyB1bnBhY2tpbmcgaW4gWVVWIC8gUkdCIGNvbnZlcnNpb25zLgorNjhlZWJjYjAgcmVtb3ZlIGEgVE9ETyBhYm91dCByb3RhdGlvbgorMmRlZTI5NjYgcmVtb3ZlIGZldyBvYnNvbGV0ZSBUT0RPIGFib3V0IGFsaWduZWQgbG9hZHMgaW4gU1NFMgorZTBjMGJiMzQgcmVtb3ZlIFRPRE8gYWJvdXQgdW51c2VkIHJlZl9sZl9kZWx0YVtdCis5Y2YxY2MyYiByZW1vdmUgZmV3IFRPRE86ICAgKiAyNTYgLT4gUkRfRElTVE9fTVVMVCAgICogZG9uJ3QgdXNlIFREaXN0byBmb3IgVVYgbW9kZSBwaWNraW5nCis3OTE4OTY0NSBNZXJnZSBjaGFuZ2VzIGZyb20gdG9waWMgJ2RlbXV4LWZyYWdtZW50LWNsZWFudXAnCis0NzM5OWY5MiBkZW11eDogcmVtb3ZlIEdldEZyYWdtZW50KCkKK2QzY2ZiNzlhIGRlbXV4OiByZW1vdmUgZGVhZCBmcmFnbWVudCByZWxhdGVkIFRPRE8KK2FiNzE0YjhhIGRlbXV4LCBGcmFtZTogcmVtb3ZlIGlzX2ZyYWdtZW50XyBmaWVsZAorYjEwNTkyMWMgeXV2X3NzZTIsIGNvc21ldGljczogZml4IGluZGVudAorNDY2YzkyZTggZGVtdXgsV2ViUEl0ZXJhdG9yOiByZW1vdmUgZnJhZ21lbnRfbnVtL251bV9mcmFnbWVudHMKKzExNzE0ZmYxIGRlbXV4OiByZW1vdmUgV2ViUERlbXV4U2VsZWN0RnJhZ21lbnQKK2MwZjdjYzQ3IGZpeCBmb3IgYnVnICMyODA6IFVNUiBpbiBuZXh0LT5iaXRzCis1NzhiZWViOCBNZXJnZSAiZW5jL01ha2VmaWxlLmFtOiBhZGQgbWlzc2luZyBoZWFkZXJzIgorMWE4MTlmMDAgbWFrZWZpbGUudW5peDogbWFrZSB2aXNpYmlsaXR5PWhpZGRlbiB0aGUgZGVmYXVsdAorZDRmOWMyZWYgZW5jL01ha2VmaWxlLmFtOiBhZGQgbWlzc2luZyBoZWFkZXJzCis4NDZjYWZmNCBjb25maWd1cmU6IGNoZWNrIGZvciAtZnZpc2liaWxpdHk9aGlkZGVuCiszZjNlYTJjNSBkZW11eDogYWNjZXB0IHJhdyBiaXRzdHJlYW1zCitkNmRhZDVkMCBtYW4gY3dlYnA6IGFkZCBwcmVjaXNpb24gYWJvdXQgZXhhY3RuZXNzIG9mIHRoZSAnbG9zc2xlc3MnIG1vZGUKKzQ2YmIxZTM0IE1lcmdlICJnaWZkZWM6IHJlbW92ZSB1dGlscy5oIGluY2x1ZGUiCisyYjg4MmU5NCBNZXJnZSAiTWFrZWZpbGUudmM6IGRlZmluZSBXRUJQX0hBVkVfR0lGIGZvciBnaWZkZWMuYyIKKzg5MmI5MjM4IE1lcmdlICJtYW4vKiwgQVVUSE9SUzogY2xhcmlmeSBvcmlnaW4gb2YgdGhlIHRvb2wiCitlNTY4N2ExOCBNZXJnZSAiZml4IG9wdGltaXplZCBidWlsZCB3aXRoIC1tY21vZGVsPW1lZGl1bSIKK2U1NmU2ODU5IE1ha2VmaWxlLnZjOiBkZWZpbmUgV0VCUF9IQVZFX0dJRiBmb3IgZ2lmZGVjLmMKKzQwNzdkOTQ0IGdpZmRlYzogcmVtb3ZlIHV0aWxzLmggaW5jbHVkZQorYjVlMzBkYWMgbWFuLyosIEFVVEhPUlM6IGNsYXJpZnkgb3JpZ2luIG9mIHRoZSB0b29sCitiMjc1ZTU5OCBmaXggb3B0aW1pemVkIGJ1aWxkIHdpdGggLW1jbW9kZWw9bWVkaXVtCis2NGRhNDVhOSBjb3NtZXRpY3MsIGN3ZWJwOiBmaXggaW5kZW50CiswMzhhMDYwZCBNZXJnZSAiYWRkIGRpc3RvLWJhc2VkIHJlZmluZW1lbnQgZm9yIFVWIG1vZGUgKGlmIG1ldGhvZCA9IDEgb3IgMikiCisyODM1MDg5ZCBQcm92aWRlIGFuIFNTRTIgaW1wbGVtZW50YXRpb24gb2YgQ29tYmluZWRTaGFubm9uRW50cm9weS4KK2U2YzkzNTE5IGFkZCBkaXN0by1iYXNlZCByZWZpbmVtZW50IGZvciBVViBtb2RlIChpZiBtZXRob2QgPSAxIG9yIDIpCiswNDUwN2RjOSBNZXJnZSAiZml4IHVuZGVmaW5lZCBiZWhhdmlvdXIgZHVyaW5nIHNoaWZ0LCB1c2luZyBhIGNhc3QiCis3OTNjNTI2MSBNZXJnZSAid2ljZGVjOiBhZGQgc3VwcG9ydCBmb3IgcmVhZGluZyBmcm9tIHN0ZGluIgorZDNkMTYzOTcgT3B0aW1pemUgdGhlIGhlYXAgdXNhZ2UgaW4gSGlzdG9ncmFtQ29tYmluZUdyZWVkeS4KKzIwMmE3MTBiIGZpeCB1bmRlZmluZWQgYmVoYXZpb3VyIGR1cmluZyBzaGlmdCwgdXNpbmcgYSBjYXN0CisxNGQyN2E0NiBpbXByb3ZlIG1ldGhvZCAjMiBieSBtZXJnaW5nIERpc3RvUmVmaW5lKCkgYW5kICBTaW1wbGVRdWFudGl6ZSgpCitjYjFjZTk5NiBNZXJnZSAiMTAlIGZhc3RlciB0YWJsZS1sZXNzIFNTRTIvTkVPTiB2ZXJzaW9uIG9mIFlVVi0+UkdCIGNvbnZlcnNpb24iCithYzc2MWEzNyAxMCUgZmFzdGVyIHRhYmxlLWxlc3MgU1NFMi9ORU9OIHZlcnNpb24gb2YgWVVWLT5SR0IgY29udmVyc2lvbgorNzlmY2YyOWEgd2ljZGVjOiBhZGQgc3VwcG9ydCBmb3IgcmVhZGluZyBmcm9tIHN0ZGluCiswMTVmMTczZiBNZXJnZSAiY3dlYnA6IGFkZCBzdXBwb3J0IGZvciBzdGRpbiBpbnB1dCIKK2E5OTQ3YzMyIGN3ZWJwOiBhZGQgc3VwcG9ydCBmb3Igc3RkaW4gaW5wdXQKKzdlYjAxZmYzIE1lcmdlICJJbXByb3ZlZCBhbHBoYSBjbGVhbnVwIGZvciB0aGUgd2VicCBlbmNvZGVyIHdoZW4gcHJlZGljdGlvbiB0cmFuc2Zvcm0gaXMgdXNlZC4iCitmYjhjOTEwNiBNZXJnZSAiaW50cm9kdWNlIFdlYlBNZW1Ub1VpbnQzMiBhbmQgV2ViUFVpbnQzMlRvTWVtIGZvciBtZW1vcnkgYWNjZXNzIgorYmQ5MWFmMjAgTWVyZ2UgImJpdF9yZWFkZXI6IHJlbW92ZSBhYXJjaDY0IEJJVFMgVE9ETyIKKzZjNzAyYjgxIFNwZWVkIHVwIGhhc2ggY2hhaW4gaW5pdGlhbGl6YXRpb24gdXNpbmcgbWVtc2V0LgorNGM2MGY2M2MgbWFrZSBSZWFkUE5HIGFuZCBSZWFkSlBFRyB0YWtlIGEgZmlsZW5hbWUgaW5zdGVhZCBvZiBhIEZJTEUKKzQ2NGVkMTBmIGJpdF9yZWFkZXI6IHJlbW92ZSBhYXJjaDY0IEJJVFMgVE9ETworZDQ3OGU1ODkgTWVyZ2UgImNvbmZpZ3VyZTogdXBkYXRlIGlzc3VlIHRyYWNrZXIiCis2OTM4MTExMyBJbXByb3ZlZCBhbHBoYSBjbGVhbnVwIGZvciB0aGUgd2VicCBlbmNvZGVyIHdoZW4gcHJlZGljdGlvbiB0cmFuc2Zvcm0gaXMgdXNlZC4KKzJjMDhhYWM4IGludHJvZHVjZSBXZWJQTWVtVG9VaW50MzIgYW5kIFdlYlBVaW50MzJUb01lbSBmb3IgbWVtb3J5IGFjY2VzcworMDEwY2EzZDEgRml4IEZpbmRNYXRjaExlbmd0aCB3aXRoIG5vbi1hbGlnbmVkIGJ1ZmZlcnMuCithOTBlMWUzZiBSRUFETUU6IGFkZCBwcmVyZXF1aXNpdGVzIGZvciBhbiBhdXRvY29uZiBidWlsZAorNDU4ZjA4NjYgY29uZmlndXJlOiB1cGRhdGUgaXNzdWUgdHJhY2tlcgorMzM5MTQ1OTUgdndlYnA6IHdvcmsgYXJvdW5kIHRoZSB0cmFuc3BhcmVudCBiYWNrZ3JvdW5kIHdpdGggR0xVVCBidWcKK2U0YTdlZWQ0IGNvc21ldGljczogZml4IGluZGVudAorMDgzNzUxMjkgTWVyZ2UgIk1ha2UgYSBzZXBhcmF0ZSBjYXNlIGZvciBsb3dfZWZmb3J0IGluIENvcHlJbWFnZVdpdGhQcmVkaWN0aW9uIgorYWEyZWIyZDQgTWVyZ2UgImNvc21ldGljczogZml4IGluZGVudCIKK2I3NTUxZTkwIGNvc21ldGljczogZml4IGluZGVudAorNWJkYTUyZDQgTWFrZSBhIHNlcGFyYXRlIGNhc2UgZm9yIGxvd19lZmZvcnQgaW4gQ29weUltYWdlV2l0aFByZWRpY3Rpb24KKzY2ZmE1OThhIE1lcmdlICJjb25maWd1cmU6IGZpeCBpbnRyaW5zaWNzIGJ1aWxkIHcvb2xkZXIgZ2NjIgorNWFlMjIwYmUgYmFja3dhcmRfcmVmZXJlbmNlcy5jOiBGaXhlZCBjb21waWxlciB3YXJuaW5nCisxNTU2ZGEwOSBNZXJnZSAiY29uZmlndXJlOiByZXN0b3JlIDIgd2FybmluZ3MiCis3MWExN2U1OCBjb25maWd1cmU6IHJlc3RvcmUgMiB3YXJuaW5ncworOWVlYWJjMDcgY29uZmlndXJlOiBmaXggaW50cmluc2ljcyBidWlsZCB3L29sZGVyIGdjYworMzYzYmFiZTIgTWVyZ2UgImZpeCBzb21lIHdhcm5pbmcgYWJvdXQgdW5hbGlnbmVkIDMyYiByZWFkcyIKK2ExNDExNzgyIE9wdGltaXphdGlvbiBpbiBoYXNoIGNoYWluIGNvbXBhcmlzb24gZm9yIDY0IGJpdCBBcnJheXMgd2VyZSBjb21wYXJlZCAzMiBiaXRzIGF0IGEgdGltZSwgaXQgaXMgbm93IGRvbmUgNjQgYml0cyBhdCBhIHRpbWUuIE92ZXJhbGwgZW5jb2Rpbmcgc3BlZWQtdXAgaXMgb25seSBvZiAwLjIlIG9uIEBza2FsJ3Mgc21hbGwgUE5HIGNvcnB1cy4gSXQgaXMgb2YgMyUgb24gbXkgaW5pdGlhbCAxLjMgTXAgZGVza3RvcCBzY3JlZW5zaG90IGltYWdlLgorODI5YmQxNDEgQ29tYmluZSBIdWZmbWFuIGNvc3QgYW5kIGJpdCBlbnRyb3B5IGludG8gb25lIGxvb3AKK2E3YTk1NGM4IE1lcmdlICJsb3NzbGVzczogbWFrZSBwcmVkaWN0aW9uIGluIGVuY29kZXIgd29yayBwZXIgc2NhbmxpbmUiCis2MWI2MDViNCBNZXJnZSAiZml4IG9mIHVuZGVmaW5lZCBtdWx0aXBseSAoaW50MzIgb3ZlcmZsb3cpIgorMjM5NDIxYzUgbG9zc2xlc3M6IG1ha2UgcHJlZGljdGlvbiBpbiBlbmNvZGVyIHdvcmsgcGVyIHNjYW5saW5lCitmNWNhNDBlMCBmaXggb2YgdW5kZWZpbmVkIG11bHRpcGx5IChpbnQzMiBvdmVyZmxvdykKKzVjZDJlZjRjIE1lcmdlIGNoYW5nZXMgZnJvbSB0b3BpYyAnd2luLXRocmVhZGluZy1jb21wYXQnCis3NmNlOTE4NyBNYWtlZmlsZS52YzogZW5hYmxlIFdFQlBfVVNFX1RIUkVBRCBmb3Igd2luZG93cyBwaG9uZQorZDJhZmU5NzQgdGhyZWFkOiB1c2UgQ3JlYXRlVGhyZWFkIGZvciB3aW5kb3dzIHBob25lCiswZmQwZTEyYiB0aHJlYWQ6IHVzZSBXYWl0Rm9yU2luZ2xlT2JqZWN0RXggaWYgYXZhaWxhYmxlCis2M2ZhZGM5ZiB0aHJlYWQ6IHVzZSBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uRXggaWYgYXZhaWxhYmxlCisxMTBhZDU4MyB0aHJlYWQ6IHVzZSBuYXRpdmUgd2luZG93cyBjb25kIHZhciBpZiBhdmFpbGFibGUKKzkxMmM5ZmRmIGRlYy93ZWJwOiB1c2UgR2V0TEUoMjR8MzIpIGZyb20gdXRpbHMKK2YxNjk0NDgxIHV0aWxzL0dldExFMzI6IGNvcnJlY3QgdWludDMyIHByb21vdGlvbgorMTU4NzYzZGUgTWVyZ2UgImFsd2F5cyBjYWxsIFdlYlBJbml0U2FtcGxlcnMoKSwgZG9uJ3QgdHJ5IHRvIGJlIHNtYXJ0IgorMzc3MGYzYmIgTWVyZ2UgImNsZWFudXAgdGhlIFlGSVgvVEZJWCBkaWZmZXJlbmNlIGJ5IHJlbW92aW5nIHNvbWUgY29kZSBhbmQgI2RlZmluZSIKK2E0MGY2MGE5IE1lcmdlICIzJSBzcGVlZCBpbXByb3ZlbWVudCBmb3IgbG9zc2xlc3Mgd2VicCBlbmNvZGVyIGZvciBsb3cgZWZmb3J0IG1vZGU6IgorZWQxYzJiYzYgYWx3YXlzIGNhbGwgV2ViUEluaXRTYW1wbGVycygpLCBkb24ndCB0cnkgdG8gYmUgc21hcnQKK2I4YzQ0ZjFhIDMlIHNwZWVkIGltcHJvdmVtZW50IGZvciBsb3NzbGVzcyB3ZWJwIGVuY29kZXIgZm9yIGxvdyBlZmZvcnQgbW9kZToKKzk5N2UxMDM4IGNsZWFudXAgdGhlIFlGSVgvVEZJWCBkaWZmZXJlbmNlIGJ5IHJlbW92aW5nIHNvbWUgY29kZSBhbmQgI2RlZmluZQorZDczZDFjOGIgTWVyZ2UgIk1ha2UgZGlzY2FyZGluZyBpbnZpc2libGUgUkdCIHZhbHVlcyAoY2xlYW51cCBhbHBoYSkgdGhlIGRlZmF1bHQuIgorMWY5YmU5N2MgTWFrZSBkaXNjYXJkaW5nIGludmlzaWJsZSBSR0IgdmFsdWVzIChjbGVhbnVwIGFscGhhKSB0aGUgZGVmYXVsdC4KK2YyNDAxMTdiIE1ha2UgZHdlYnAgbGlzdGVuIG1vcmUgdG8gdGhlIC1xdWlldCBmbGFnCitiMzdiMDE3OSBmaXggZm9yIGlzc3VlICMyNzU6IGRvbid0IGNvbXBhcmUgdG8gb3V0LW9mLWJvdW5kIHBvaW50ZXJzCisyMTczNWUwNiBzcGVlZC11cCB0cml2aWFsIG9uZS1zeW1ib2wgZGVjb2RpbmcgY2FzZSBmb3IgbG9zc2xlc3MKKzM5Nzg2M2JkIFJlZmFjdG9yIENvcHlQbGFuZSgpIGFuZCBDb3B5UGl4ZWxzKCkgbWV0aG9kczogcHV0IHRoZW0gaW4gdXRpbHMuCis2ZWNkNzJmOCBSZS1lbmFibGUgZW5jb2Rpbmcgb2YgYWxwaGEgcGxhbmUgd2l0aCBjb2xvciBjYWNoZSBmb3IgbmV4dCByZWxlYXNlLgorMWY3MTQ4YTQgTWVyZ2UgInJlbW92ZSB1bnVzZWQgZmllbGRzIGZyb20gV2ViUERlY29kZXJPcHRpb25zIGFuZCBXZWJQQml0c3RyZWFtRmVhdHVyZXMiCis2YWUzOTVmYSBNZXJnZSAidXNlIEV4UmVhZEZpbGUoKSBmb3IgUmVhZFlVVigpIgorODA3NmEwMGUgZ2l0aWdub3JlIGxpc3Q6IGFkZCBhbmltX2RpZmYuCisxYzE3MDJkOCB1c2UgRXhSZWFkRmlsZSgpIGZvciBSZWFkWVVWKCkKKzc3NWQzYTM3IHJlbW92ZSB1bnVzZWQgZmllbGRzIGZyb20gV2ViUERlY29kZXJPcHRpb25zIGFuZCBXZWJQQml0c3RyZWFtRmVhdHVyZXMKK2MxMzI0NWM3IEFuaW1FbmNvZGVyOiBBZGQgYSBHZXRFcnJvcigpIG1ldGhvZC4KKzY4OGIyNjVkIEFuaW1EZWNvZGVyIEFQSTogQWRkIGEgR2V0RGVtdXhlcigpIG1ldGhvZC4KKzFhYTRlM2Q2IFdlYlBBbmltRGVjb2RlcjogYWRkIGFuIG9wdGlvbiB0byBlbmFibGUgbXVsdGktdGhyZWFkZWQgZGVjb2RpbmcuCiszNTg0YWJjYSBBbmltRGVjb2Rlcjogb3B0aW9uIHRvIGRlY29kZSB0byBjb21tb24gY29sb3IgbW9kZXMuCithZmQ1YTYyYyBNZXJnZSAibXV4LmggZG9lcyBOT1QgbmVlZCB0byBpbmNsdWRlIGVuY29kZS5oIgorODU1MGQ0NDMgTWVyZ2UgIm1pZ3JhdGUgYW5pbV9kaWZmIHRvb2wgZnJvbSBDKysgdG8gQzg5IgorOTYyMDFlNTAgbWlncmF0ZSBhbmltX2RpZmYgdG9vbCBmcm9tIEMrKyB0byBDODkKKzk0NWNmYTNiIG11eC5oIGRvZXMgTk9UIG5lZWQgdG8gaW5jbHVkZSBlbmNvZGUuaAorOGRhMDdlOGQgTWVyZ2UgIn4yeCBmYXN0ZXIgU1NFMiBSR0IyNHRvWSwgQkdSMjR0b1ksIEFSR0JUb1l8VVYiCitiZmQzZmMwMiB+MnggZmFzdGVyIFNTRTIgUkdCMjR0b1ksIEJHUjI0dG9ZLCBBUkdCVG9ZfFVWCiswMjQzMjQyNyBtYW4vY3dlYnAuMSwgY29zbWV0aWNzOiBlc2NhcGUgJy0ncworOTZmNWI0MjMgbWFuL2N3ZWJwOiBncm91cCBsb3NzeS1vbmx5IG9wdGlvbnMKKzUyZmRiZGZlIGV4dHJhY3Qgc29tZSBSR0IyNCB0byBMdW1hIGNvbnZlcnNpb24gZnVuY3Rpb24gZnJvbSBlbmMvIHRvIGRzcC8KK2FiOGMyMzAwIGFkZCBtaXNzaW5nIFxuCis4MzA0MTc5YSBzeW5jIE5FV1Mgd2l0aCAwLjQuNAorNWJkMDRhMDggc3luYyB2ZXJzaW9ucyB3aXRoIDAuNC40Cis4ZjFmY2MxNSBNZXJnZSAiTW92ZSBBUkdCLT5ZVVYgZnVuY3Rpb25zIGZyb20gZGVjL3ZwOGwuYyB0byBkc3AveXV2LmMiCisyNWJmMmNlNSBmaXggc29tZSB3YXJuaW5nIGFib3V0IHVuYWxpZ25lZCAzMmIgcmVhZHMKKzkyMjI2OGZkIHMvVElGRi9XZWJQCitmYTg5MjdlZiBNb3ZlIEFSR0ItPllVViBmdW5jdGlvbnMgZnJvbSBkZWMvdnA4bC5jIHRvIGRzcC95dXYuYworOWIzNzM1OTggTWVyZ2UgImZvciBSZWFkWFhYWCgpIGltYWdlLXJlYWRlcnMsIHVzZSB0aGUgdmFsdWUgb2YgcGljLT51c2VfYXJnYiIKK2Y3YzUwN2E1IE1lcmdlICJyZW1vdmUgdW5uZWNlc3NhcnkgI2luY2x1ZGUgInl1di5oIiIKKzc4NjE1NzhiIGZvciBSZWFkWFhYWCgpIGltYWdlLXJlYWRlcnMsIHVzZSB0aGUgdmFsdWUgb2YgcGljLT51c2VfYXJnYgorMTRlNDA0M2IgcmVtb3ZlIHVubmVjZXNzYXJ5ICNpbmNsdWRlICJ5dXYuaCIKKzQ2OWJhMmNkIHZ3ZWJwOiBmaXggaW5jb3JyZWN0IGNsaXBwaW5nIHcvTk9fQkxFTkQKKzRiOTE4NmIyIHVwZGF0ZSBpc3N1ZSB0cmFja2VyIHVybAorZDY0ZDM3NmMgY2hhbmdlIFdFQlBfQUxJR05fQ1NUIHZhbHVlIHRvIDMxCitmNzE3YjgyOCB2cDhsLmMsIGNvc21ldGljczogZml4IGluZGVudCBhZnRlciA5NTUwOWY5Cis5MjdjY2RjNCBNZXJnZSAiZml4IGFsaWdubWVudCBvZiBhbGxvY2F0ZWQgbWVtb3J5IGluIEFsbG9jYXRlVHJhbnNmb3JtQnVmZmVyIgorZmVhOTRiMmIgZml4IGFsaWdubWVudCBvZiBhbGxvY2F0ZWQgbWVtb3J5IGluIEFsbG9jYXRlVHJhbnNmb3JtQnVmZmVyCis1YWE4ZDYxZiBNZXJnZSAiTUlQUzogcmVzY2FsZXIgY29kZSBzeW5jZWQgd2l0aCBDIGltcGxlbWVudGF0aW9uIgorZTdmYjI2N2QgTUlQUzogcmVzY2FsZXIgY29kZSBzeW5jZWQgd2l0aCBDIGltcGxlbWVudGF0aW9uCis5M2M4NmVkNSBNZXJnZSAiZm9ybWF0X2NvbnN0YW50cy5oOiBNS0ZPVVJDQywgY29ycmVjdCBjYXN0IgorNWQ3OTFkMjYgZm9ybWF0X2NvbnN0YW50cy5oOiBNS0ZPVVJDQywgY29ycmVjdCBjYXN0Cis2NTcyNmNkMyBkc3AvbG9zc2xlc3M6IEF2ZXJhZ2UyLCBtYWtlIGEgY29uc3RhbnQgdW5zaWduZWQKK2QyNmQ5ZGVmIFVzZSBfX2hhc19idWlsdGluIHRvIGNoZWNrIGNsYW5nIHN1cHBvcnQKKzEyZWMyMDRlIG1vdmVkIEFMSUdOX0NTVCBpbnRvIHV0aWwvdXRpbHMuaCBhbmQgcmVuYW1lZCBXRUJQX0FMSUdOX3h4eAorYTI2NDA4MzggTWVyZ2UgInJlc2NhbGVyOiB+MjAlIGZhc3RlciBTU0UyIGltcGxlbWVudGF0aW9uIGZvciBsb3NzbGVzcyBJbXBvcnRSb3dFeHBhbmQiCiszZmI2MDBkNSBNZXJnZSAid2ljZGVjOiBmaXggYWxwaGEgZGV0ZWN0aW9uIHcvNjRicHAgQkdSQS9SR0JBIgorNjdjNTQ3ZmQgcmVzY2FsZXI6IH4yMCUgZmFzdGVyIFNTRTIgaW1wbGVtZW50YXRpb24gZm9yIGxvc3NsZXNzIEltcG9ydFJvd0V4cGFuZAorOTllM2Y4MTIgTWVyZ2UgImxhcmdlIHJlLW9yZ2FuaXphdGlvbiBvZiB0aGUgZGVsdGEtcGFsZXR0aXphdGlvbiBjb2RlIgorOTU1MDlmOTkgbGFyZ2UgcmUtb3JnYW5pemF0aW9uIG9mIHRoZSBkZWx0YS1wYWxldHRpemF0aW9uIGNvZGUKKzc0ZmI0NThiIGZpeCBmb3Igd2VpcmQgbXN2YyB3YXJuaW5nIG1lc3NhZ2UKK2FlNDlhZDg2IE1lcmdlICJTU0UyIGltcGxlbWVudGF0aW9uIG9mIEltcG9ydFJvd1NocmluayIKKzkzMmZkNGRmIFNTRTIgaW1wbGVtZW50YXRpb24gb2YgSW1wb3J0Um93U2hyaW5rCitiYWRmY2JhYSB3aWNkZWM6IGZpeCBhbHBoYSBkZXRlY3Rpb24gdy82NGJwcCBCR1JBL1JHQkEKKzM1Y2FmYTZjIE1lcmdlICJpb3NidWlsZDogZml4IGxpbmtpbmcgd2l0aCBYY29kZSA3IC8gaU9TIFNESyA5IgorYjBjOWQ4YWYgbGFiZWwgcmVuYW1lOiBOT19DSEFOR0UgLT4gTm9DaGFuZ2UKK2I0ZTczMWNkIG5lb24taW1wbGVtZW50YXRpb24gZm9yIHJlc2NhbGVyIGNvZGUKK2RiMTMyMWE2IGlvc2J1aWxkOiBmaXggbGlua2luZyB3aXRoIFhjb2RlIDcgLyBpT1MgU0RLIDkKKzZkZmE1ZTNlIHJlc2NhbGVyOiBiZXR0ZXIgaGFuZGxpbmcgb2YgdGhlIGZ4eV9zY2FsZT0wIHNwZWNpYWwgY2FzZS4KKzU1YzA1MjkzIFJldmVydCAicmVzY2FsZXI6IGJldHRlciBoYW5kbGluZyBvZiB0aGUgZnh5X3NjYWxlPTAgc3BlY2lhbCBjYXNlLiIKKzlmMjI2YmY4IHJlc2NhbGVyOiBiZXR0ZXIgaGFuZGxpbmcgb2YgdGhlIGZ4eV9zY2FsZT0wIHNwZWNpYWwgY2FzZS4KK2Y3YjhmOTA3IGRlbHRhX3BhbGV0dGl6YXRpb24uKjogYWRkIGNvcHlyaWdodAorYzFlMWI3MTAgQ2hhbmdlZCBkZWx0YSBwYWxldHRlIHRvIGNvbXByZXNzIGJldHRlcgorMGRkMjgyNjcgTWVyZ2UgIkFkZCBkZWx0YV9wYWxldHRpemF0aW9uIGZlYXR1cmUgdG8gV2ViUCIKKzQ4ZjY2YjY2IEFkZCBkZWx0YV9wYWxldHRpemF0aW9uIGZlYXR1cmUgdG8gV2ViUAorMjc5MzNlMmEgYW5pbV9lbmNvZGVyOiBkcm9wIGEgZnJhbWUgaWYgaXQgaGFzIHNhbWUgcGl4ZWxzIGFzIHRoZSBwcmV2IGZyYW1lLgorZGY5ZjZlYzggTWVyZ2UgIndlYnBtdXgvRGlzcGxheUluZm86IHNlbmQgbm9uLWVycm9yIG91dHB1dCB0byBzdGRvdXQiCis4YWY0OTkzYiBNZXJnZSAicmVzY2FsZXJfbWlwc19kc3BfcjI6IGNvc21ldGljcywgZml4IGluZGVudCIKKzJiOWQyNDk1IE1lcmdlICJyZXNjYWxlcjogY29zbWV0aWNzLCBqb2luIHR3byBsaW5lcyIKK2NjMDIwYThjIHdlYnBtdXgvRGlzcGxheUluZm86IHNlbmQgbm9uLWVycm9yIG91dHB1dCB0byBzdGRvdXQKK2EyODhlNzQ2IGNvbmZpZ3VyZTogYWRkIC1Xc2hvcnRlbi02NC10by0zMgorYzRjM2NmMmQgcG5nZGVjOiBmaXggdHlwZSBjb252ZXJzaW9uIHdhcm5pbmdzCitiZWY4ZTk3ZCB3ZWJwbXV4OiBmaXggdHlwZSBjb252ZXJzaW9uIHdhcm5pbmcKKzVhODQ0NjBkIHJlc2NhbGVyX21pcHNfZHNwX3IyOiBjb3NtZXRpY3MsIGZpeCBpbmRlbnQKK2FjZGUwYWFlIHJlc2NhbGVyOiBjb3NtZXRpY3MsIGpvaW4gdHdvIGxpbmVzCiszMDZjZTRmZCByZXNjYWxlcjogbW92ZSB0aGUgMXgxIG9yIDJ4MSBoYW5kbGluZyBvbmUgbGV2ZWwgdXAKK2NjZWQ5NzRiIHJlbW92ZSBfbW1fc2V0X2VwaTY0eCgpLCB3aGljaCBpcyB0b28gc3BlY2lmaWMKKzU2NjY4YzlmIGZpeCB3YXJuaW5ncyBhYm91dCB1aW50NjRfdCAtPiB1aW50MzJfdCBjb252ZXJzaW9uCis3NmE3ZGMzOSByZXNjYWxlcjogYWRkIHNvbWUgU1NFMiBjb2RlCisxZGYxZDBlZSByZXNjYWxlcjogaGFybW9uaXplIGZ1bmN0aW9uIHByb3RvcworOWJhMTg5NGIgcmVzY2FsZXI6IHNpbXBsaWZ5IEltcG9ydFJvdyBsb2dpYworNWZmMDA3OWUgZml4IHJlc2NhbGVyIHZlcnRpY2FsIGludGVycG9sYXRpb24KK2NkODI0NDBlIFZQOExBbGxvY2F0ZUhpc3RvZ3JhbVNldDogYWxpZ24gaGlzdG9ncmFtW10gZW50cmllcworYTQwNmIxZGQgTWVyZ2UgImZpeCBtZW1vcnkgb3Zlci1hbGxvY2F0aW9uIGluIGxvc3NsZXNzIHJlc2NhbGVyIGluaXQiCiswZmRlMzNlMyBhZGQgbWlzc2luZyBjb25zdCBpbiBWUDhJbml0RnJhbWUgc2lnbmF0dXJlCithYzdkNWU4ZCBmaXggbWVtb3J5IG92ZXItYWxsb2NhdGlvbiBpbiBsb3NzbGVzcyByZXNjYWxlciBpbml0CiswMTdmOGNjYyBMb29zZW4gdGhlIGJ1ZmZlciBzaXplIGNoZWNrcyBmb3IgWS9VL1YvQSB0b28uCisxNWNhNTAxNCBsb29zZW4gdGhlIHBhZGRpbmcgY2hlY2sgb24gYnVmZmVyIHNpemUKK2Q2MjNhODcwIGRlY19uZW9uOiBhZGQgd2hpdGVzcGFjZSBhcm91bmQgc3RyaW5naXppbmcgb3BlcmF0b3IKKzI5Mzc3ZDU1IGRzcC9taXBzOiBjb3NtZXRpY3M6IGFkZCB3aGl0ZXNwYWNlIGFyb3VuZCBYU1RSIG1hY3JvCitlZWJhZjk3ZiBkc3AvbWlwczogYWRkIHdoaXRlc3BhY2UgYXJvdW5kIHN0cmluZ2l6aW5nIG9wZXJhdG9yCitkMzlkYzhmMyBDcmVhdGUgYSBXZWJQQW5pbURlY29kZXIgQVBJLgorMDNmYjc1MjIgZ2lmMndlYnA6IHByaW50IG91dHB1dCBmaWxlIHNpemUKKzE0ZWZhYmJmIEFuZHJvaWQ6IGxpbWl0IHVzZSBvZiBjcHVmZWF0dXJlcworN2I4M2FkYmUgcHJlcGFyYXRvcnkgY29zbWV0aWNzIGZvciBSZXNjYWxlciBjb2RlIGZpeCBhbmQgY2xlYW4tdXAKKzc3ZmI0MWMyIGRlYy92cDhsL0RlY29kZUFscGhhRGF0YTogcmVtb3ZlIHJlZHVuZGFudCBjYXN0Cis5MGZjZmNkOSBJbnNlcnQgbGVzcyBoYXNoIGNoYWluIGVudHJpZXMgZnJvbSB0aGUgYmVnaW5uaW5ncyBvZiBsb25nIGNvcGllcy4KK2JkNTU2MDRkIFNTRTI6IGFkZCB5dXY0NDQgY29udmVydGVycywgcmUtdXNpbmcgeXV2X3NzZTIuYworNDFhNWQ5OWQgYWRkIGEgLXF1aWV0IG9wdGlvbiB0byAnZHdlYnAnCis4MGFiM2VkYiBNZXJnZSAiUkVBRE1FOiB1cGRhdGUgZHdlYnAgaGVscCBvdXRwdXQgYWZ0ZXIgMWU1OTVmZSIKKzMyYjcxYjJlIFJFQURNRTogdXBkYXRlIGR3ZWJwIGhlbHAgb3V0cHV0IGFmdGVyIDFlNTk1ZmUKKzNlYzExODI3IHVzZSB0aGUgRGlzcGF0Y2hBbHBoYSgpIGNhbGwgZnJvbSBkc3AKK2M1ZjAwNjIxIGluY29ycG9yYXRlIGJ6ZXJvKCkgaW50byBXZWJQUmVzY2FsZXJJbml0KCkgaW5zdGVhZCBvZiBjYWxsIHNpdGUKKzNlYmNkZDQxIHJlbW92ZSBkdXBsaWNhdGUgIiNpbmNsdWRlIDxzdGRsaWIuaD4iCisxZTU5NWZlMSBkd2VicDogYWRkIC1yZXNpemUgYXMgYSBzeW5vbnltIGZvciAtc2NhbGUKKzI0YTk2OTMyIGRlYzogYWxsb3cgMCBhcyBhIHNjYWxpbmcgZGltZW5zaW9uCitiOTE4NzI0MiB1dGlscy9yZXNjYWxlcjogYWRkIFdlYlBSZXNjYWxlckdldFNjYWxlZERpbWVuc2lvbnMKKzkyM2U4ZWRhIE1lcmdlICJ1cGRhdGUgTkVXUyIKKzAyMGZkMDk5IE1lcmdlICJXZWJQUGljdHVyZURpc3RvcnRpb246IHN1cHBvcnQgQVJHQiBmb3JtYXQgZm9yICdwaWMnIHdoZW4gY29tcHV0aW5nIGRpc3RvcnRpb24uIgorNmE1MjkyZjYgdXBkYXRlIE5FV1MKKzU2YTJlOWY1IFdlYlBQaWN0dXJlRGlzdG9ydGlvbjogc3VwcG9ydCBBUkdCIGZvcm1hdCBmb3IgJ3BpYycgd2hlbiBjb21wdXRpbmcgZGlzdG9ydGlvbi4KKzBhZTU4MmU0IGNvbmZpZ3VyZTogdGVzdCBhbmQgYWRkIC1XdW5yZWFjaGFibGUtY29kZQorYzJmOWRjMDYgYml0X3dyaXRlcjogY29udmVydCBWUDhMIG1hY3JvIHZhbHVlcyB0byBpbW1lZGlhdGVzCitiOTY5Zjg4OCBSZWR1Y2UgbWFnaWMgaW4gcGFsZXR0ZSByZW9yZGVyaW5nCithY2IyOTdlOSBhbmltX2RpZmY6IGFkZCBhIC1yYXdfY29tcGFyaXNvbiBmbGFnCisxNTVjMWIyMiBNZXJnZSBjaGFuZ2VzIEk3NmY0ZDZmZSxJNDU0MzQ2MzkKKzcxN2U0ZDVhIG1pcHMzMi9taXBzRFNQcjI6IGZ1bmN0aW9uIEltcG9ydFJvdyByZWJhc2VkCis3ZGY5Mzg5MyBmaXggcmVzY2FsaW5nIGJ1ZyAodW5pbml0aWFsaXplZCByZWFkLCBzZWUgYnVnICMyNTQpLgorNWNkY2Q1NjEgbG9zc2xlc3NfZW5jX25lb246IGFkZCBWUDhMVHJhbnNmb3JtQ29sb3IKK2E1M2MzMzY5IGxvc3NsZXNzX25lb246IGFkZCBWUDhMVHJhbnNmb3JtQ29sb3JJbnZlcnNlCis5OTEzMWU3ZiBNZXJnZSBjaGFuZ2VzIEk5ZmIyNWE4OSxJYmM2NDhlOWUKK2M0NTU2NzY2IHNpbXBsaWZ5IHRoZSBtYWluIGxvb3AgZm9yIGRvd25zY2FsaW5nCisyYTAxMGY5OSBsb3NzbGVzc19uZW9uOiByZW1vdmUgcHJlZGljdG9ycyA1LTEzCitjYTIyMWJiYyBsbF9lbmNfbmVvbjogZW5hYmxlIFZQOExTdWJ0cmFjdEdyZWVuRnJvbUJsdWVBbmRSZWQKKzU4NWQ5M2RiIENvbnRhaW5lciBzcGVjOiBjbGFyaWZ5IG9yZGVyaW5nIG9mIEFMUEggY2h1bmsuCiswMWQ2MWZkOSBsb3NzbGVzczogfjIwICUgc3BlZWR1cAorZjcyMmM4ZjAgbG9zc2xlc3M6IFNwZWVkIHVwIENvbXB1dGVDYWNoZUVudHJvcHkgYnkgNDAgJQorMWNlZWNkYzggYWRkIGEgVlA4TENvbG9yQ2FjaGVTZXQoKSBtZXRob2QgZm9yIGNvbG9yIGNhY2hlCisxN2ViNjA5OSBsb3NzbGVzczogQWxsb3cgY29weWluZyBmcm9tIHByZXYgcm93IGluIHJsZS1tb2RlLgorZjNhN2E1YmYgbG9zc2xlc3M6IGJpdCB3cml0ZXIgb3B0aW1pemF0aW9uCitkOTdiOWZmNyBNZXJnZSBjaGFuZ2VzIGZyb20gdG9waWMgJ2xvc3NsZXNzLWVuYy1pbXByb3ZlbWVudHMnCiswMjUwZGZjYyBtc3ZjOiBmaXggcG9pbnRlciB0eXBlIHdhcm5pbmcgaW4gQml0c0xvZzJGbG9vcgorNTI5MzFmZDUgbG9zc2xlc3M6IGNvbWJpbmUgdGhlIEh1ZmZtYW4gY29kZSB3aXRoIGV4dHJhIGJpdHMKK2M0ODU1Y2EyIGxvc3NsZXNzOiBJbmxpbmluZyBhZGQgbGl0ZXJhbAorOGU5Yzk0ZGUgbG9zc2xlc3M6IHNpbXBsaWZ5IEhhc2hDaGFpbkZpbmRDb3B5IGhldXJpc3RpY3MKKzg4ODQyOWY0IGxvc3NsZXNzOiAwLjUgJSBjb21wcmVzc2lvbiBkZW5zaXR5IGltcHJvdmVtZW50Cis3YjIzYjE5OCBsb3NzbGVzczogQWRkIHplcm9lcyBpbnRvIHRoZSBwcmVkaWN0ZWQgaGlzdG9ncmFtcy4KKzg1YjQ0ZDhhIGxvc3NsZXNzOiBlbmNvZGluZywgZG9uJ3QgY29tcHV0ZSB1bm5lY2Vzc2FyeSBoaXN0bworZDkyNDUzZjMgbG9zc2xlc3M6IFJlbW92ZSBhYm91dCAyNSAlIG9mIHRoZSBzcGVlZCBkZWdyYWRhdGlvbgorMmNjZTAzMTcgRmFzdGVyIGFscGhhIGNvZGluZyBmb3Igd2VicAorNWU3NTY0MmUgbG9zc2xlc3M6IHJsZSBtb2RlIG5vdCB0byBhY2NlcHQgbGVuZ3RocyBzbWFsbGVyIHRoYW4gNC4KKzg0MzI2ZTRhIGxvc3NsZXNzOiBMZXNzIGNvZGUgZm9yIHRoZSBlbnRyb3B5IHNlbGVjdGlvbgorMTZhYjk1MWEgbG9zc2xlc3M6IDAuMzcgJSBjb21wcmVzc2lvbiBkZW5zaXR5IGltcHJvdmVtZW50Cis4MjJmMTEzZSBhZGQgV2ViUEZyZWUoKSB0byB0aGUgQVBJCiswYWUyYzJlNCBTU0UyL1NTRTQxOiBvcHRpbWl6ZSBTU0VfMTZ4TiBsb29wcworMzkyMTZlNTkgY29zbWV0aWNzOiBmaXggaW5kZW50IGFmdGVyIDMyNDYyYTA3Cis1NTllNTRjYSBNZXJnZSAiU1NFMjogc2xpZ2h0bHkgZmFzdGVyIEZUcmFuc2Zvcm1XSFQiCis4ZWY5YTYzYiBTU0UyOiBzbGlnaHRseSBmYXN0ZXIgRlRyYW5zZm9ybVdIVAorZjI3Zjc3MzUgbG9zc2xlc3NfbmVvbjogZW5hYmxlIFZQOExBZGRHcmVlblRvQmx1ZUFuZFJlZAorMzZlOWM0YmMgU1NFMjogbWlub3IgY29zbWV0cmljcyBvbiBpbi1sb29wIGZpbHRlciBjb2RlCis0NzQxZmFjNCBkc3AvbG9zc2xlc3NfKnNzZTI6IHJlbW92ZSBzb21lIHVubmVjZXNzYXJ5IGlubGluZXMKKzE4MTk5NjVlIGZpeCB3YXJuaW5nICgibGVmdCBzaGlmdCBvZiBuZWdhdGl2ZSB2YWx1ZSIpIHVzaW5nIGEgY2FzdAorNzAxNzAwMTQgU1NFMjogc3BlZWQtdXAgc29tZSBsb3NzbGVzcy1lbmNvZGluZyBmdW5jdGlvbnMKK2FiY2IwMTI4IE1lcmdlICJTU0UyOiBzbGlnaHRseSBmYXN0ZXIgKH41JSkgQWRkR3JlZW5Ub0JsdWVBbmRSZWQoKSIKKzJkZjViZDMwIE1lcmdlICJTcGVlZHVwIHRvIEh1ZmZtYW5Db3N0Q29tYmluZWRDb3VudCIKKzllMzU2ZDZiIFNTRTI6IHNsaWdodGx5IGZhc3RlciAofjUlKSBBZGRHcmVlblRvQmx1ZUFuZFJlZCgpCitmYzZjNzVhMiBTU0UyOiA1MyUgZmFzdGVyIFRyYW5zZm9ybUNvbG9yW0ludmVyc2VdCis0OTA3M2RhNiBTU0UyOiA0NiUgc3BlZWQtdXAgb2YgVHJhbnNmb3JtQ29sb3JbSW52ZXJzZV0KKzMyNDYyYTA3IFNwZWVkdXAgdG8gSHVmZm1hbkNvc3RDb21iaW5lZENvdW50CitmM2Q2ODdlMyBTU0U0LjEgaW1wbGVtZW50YXRpb24gb2Ygc29tZSBsb3NzbGVzcyBlbmNvZGluZyBmdW5jdGlvbnMKK2JmYzMwMGM3IFNTRTQuMSBpbXBsZW1lbnRhdGlvbiBvZiBzb21lIGFscGhhLXByb2Nlc3NpbmcgZnVuY3Rpb25zCis3ZjljOThmMiBNZXJnZSAic3NlMiBpbi1sb29wOiBzaW1wbGlmeSBTaWduZWRTaGlmdDhiKCkgYSBiaXQiCitlZjMxNGE1ZCBkZWNfc3NlMi9HZXROb3RIRVY6IG1pY3JvIG9wdGltaXphdGlvbgorYTcyOWNmZjkgc3NlMiBpbi1sb29wOiBzaW1wbGlmeSBTaWduZWRTaGlmdDhiKCkgYSBiaXQKKzQyMmVjOWZiIHNpbXBsaWZ5IExvYWQ4eDQoKSBhIGJpdAorOGRmMjM4ZWMgTWVyZ2UgInJlbW92ZSBzb21lIGR1cGxpY2F0ZSBGbGlwU2lnbigpIgorNzUxNTA2YzQgcmVtb3ZlIHNvbWUgZHVwbGljYXRlIEZsaXBTaWduKCkKKzY1ZWY1YWZjIE1lcmdlICJsb3NzbGVzczogMC4xMyUgY29tcHJlc3Npb24gZGVuc2l0eSBnYWluIgorMmJlZWYyZjIgbG9zc2xlc3M6IDAuMTMlIGNvbXByZXNzaW9uIGRlbnNpdHkgZ2FpbgorMzAzM2YyNGMgbG9zc2xlc3M6IDAuMDYgJSBjb21wcmVzc2lvbiBkZW5zaXR5IGltcHJvdmVtZW50Cis2NDk2MGRhOSBkZWNfbmVvbjogYWRkIFZFOHV2IC8gVkUxNgorMTRkYmQ4N2IgZGVjX25lb246IGFkZCBIRTh1diAvIEhFMTYKK2FjNzY4MDExIGludHJvZHVjZSBGVHJhbnNmb3JtMiB0byBwZXJmb3JtIHR3byB0cmFuc2Zvcm1zIGF0IGEgdGltZS4KK2FhNjA2NWFlIGRlY19uZW9uOiB1c2UgdmxkMV9kdXAobWVtKSByYXRoZXIgdGhhbiB2ZHVwKG1lbVswXSkKKzhiNjNhYzc4IE1lcmdlICJkZWNfbmVvbjogYWRkIFRNMTYiCitmNTFiZTA5ZSBNZXJnZSAiZGVjX25lb24vVHJ1ZU1vdGlvbjogc2ltcGx5IGxlZnQgYm9yZGVyIGxvYWQiCitkYzQ4MTk2YiBkZWNfbmVvbjogYWRkIFRNMTYKK2VhOTViMzA1IGRlY19uZW9uL1RydWVNb3Rpb246IHNpbXBseSBsZWZ0IGJvcmRlciBsb2FkCitmMjYyZDYxMiBzcGVlZC11cCBTZXRSZXNpZHVhbFNTRTIKK2JmNDZkMGFjIGZpeCBtaXBzMiBidWlsZCB0YXJnZXQKKzkyOWEwZmRjIGVuY19zc2UyL1RUcmFuc2Zvcm06IHNpbXBsaWZ5IGFicyBjYWxjdWxhdGlvbgorMTdkYmQwNTggZW5jX3NzZTIvQ29sbGVjdEhpc3RvZ3JhbTogc2ltcGxpZnkgYWJzIGNhbGN1bGF0aW9uCithNmMxNTkzNiBkZWNfbmVvbjogYWRkIERDMTYgaW50cmEgcHJlZGljdG9ycworMDNiNGY1MGQgTWFrZWZpbGUudmM6IGFkZCBhbmltX2RpZmYgYnVpbGQgc3VwcG9ydC4KKzFiOTg5ODc0IE1lcmdlIGNoYW5nZXMgSTljZDg0MTI1LEllZTdlMzg3ZixJNzU0OGJlNzIKK2FjZDdiNWFmIEludHJvZHVjZSBhIHRlc3QgdG9vbCBhbmltX2RpZmYuCitmMjc0YTk2YyBkc3AvZW5jX3NzZTI6IGFkZCBsdW1hNCBpbnRyYSBwcmVkaWN0b3JzCiswNDBiMTFiZCBkc3AvZW5jX3NzZTI6IGFkZCBjaHJvbWEgaW50cmEgcHJlZGljdG9ycworYWVlMDIxYmIgZHNwL2VuY19zc2UyOiBhZGQgbHVtYTE2IGludHJhIHByZWRpY3RvcnMKKzllMDBhNDk5IG1ha2VmaWxlLnVuaXg6IHJlbW92ZSBzdXBlcmNsZWFuIHRhcmdldAorY2VmYzljMDkgbWFrZWZpbGUudW5peDogY2xlYW4gdXAgYWZ0ZXIgZXh0cmFzIHRhcmdldAorNGM5YWYwMjMgZGVjX25lb246IGFkZCBEQzh1dk5vVG9wTGVmdAorZGQ1NWI4NzMgTWVyZ2UgImRvYy93ZWJwLWNvbnRhaW5lci1zcGVjOiB1cGRhdGUgcmVwbyBicm93c2VyIGxpbmsiCitmMDQ4Njk2OCBkb2Mvd2VicC1jb250YWluZXItc3BlYzogdXBkYXRlIHJlcG8gYnJvd3NlciBsaW5rCis5Mjg3NzYxZCBNZXJnZSAiR2V0UmVzaWR1YWxDb3N0U1NFMjogc2ltcGxpZnkgYWJzIGNhbGN1bGF0aW9uIgorMGUwMDkzNjYgZHNwL2NwdS5jKHg4Nik6IGNoZWNrIG1heGltdW0gc3VwcG9ydGVkIGNwdWlkIGZlYXR1cmUKK2IyNDNhNGJjIEdldFJlc2lkdWFsQ29zdFNTRTI6IHNpbXBsaWZ5IGFicyBjYWxjdWxhdGlvbgorNmQ0NjAyYjggTWVyZ2UgImZpeCB0eXBvOiBjb25zdGl0dXRlcyAtPiBjb25zdGl0dXRlIgorNWZlMWZlMzcgZml4IHR5cG86IGNvbnN0aXR1dGVzIC0+IGNvbnN0aXR1dGUKK2I4M2JkN2M0IE1lcmdlICJwb3B1bGF0ZSAnbGlid2VicGV4dHJhcycgd2l0aDogaW1wb3J0IGdyYXksIHJnYjU2NSBhbmQgcmdiNDQ0NCBmdW5jdGlvbnMiCitiMDExNGEzMiBNZXJnZSAiaGlzdG9ncmFtLmg6IGNvc21ldGljczogcmVtb3ZlIHVubmVjZXNzYXJ5IGluY2x1ZGVzIgorZmVhYjQ1ZWYgZ2lmZGVjOiBNb3ZlIGluY2x1c2lvbiBvZiB3ZWJwL2NvbmZpZy5oIHRvIGhlYWRlci4KK2RiYmE2N2QxIGhpc3RvZ3JhbS5oOiBjb3NtZXRpY3M6IHJlbW92ZSB1bm5lY2Vzc2FyeSBpbmNsdWRlcworZTk3OGZlYzYgTWVyZ2UgIlZQOExCaXRSZWFkZXI6IGZpeCByZW1haW5pbmcgdWJzYW4gZXJyb3Igd2l0aCBsYXJnZSBzaGlmdHMiCitkNmZlNTg4NCBNZXJnZSAiUmVjb25zdHJ1Y3RSb3c6IG1vdmUgc29tZSBvbmUtdGltZSBpbml0cyBvdXQgb2YgdGhlIG1haW4gbG9vcCIKK2EyMWQ2NDdjIFJlY29uc3RydWN0Um93OiBtb3ZlIHNvbWUgb25lLXRpbWUgaW5pdHMgb3V0IG9mIHRoZSBtYWluIGxvb3AKKzdhMDFjM2MzIFZQOExCaXRSZWFkZXI6IGZpeCByZW1haW5pbmcgdWJzYW4gZXJyb3Igd2l0aCBsYXJnZSBzaGlmdHMKKzdmYTY3YzliIGNoYW5nZSBHZXRQaXhQYWlySGFzaDY0KCkgcmV0dXJuIHR5cGUgdG8gdWludDMyX3QKK2VjMWZiOWY4IE1lcmdlICJkc3AvZW5jLmM6IGNvc21ldGljczogbW92ZSBEU1QoKSBkZWYgY2xvc2VyIHRvIHVzZSIKKzcwNzNiZmIzIE1lcmdlICJzcGxpdCA2NC1tdWx0IGhhc2hpbmcgaW50byB0d28gMzItYml0IG11bHRpcGxpZXMiCiswNzY4YjI1MiBkc3AvZW5jLmM6IGNvc21ldGljczogbW92ZSBEU1QoKSBkZWYgY2xvc2VyIHRvIHVzZQorNmE0OGI4ZjAgTWVyZ2UgImZpeCBNU1ZDIHNpemVfdC0+aW50IGNvbnZlcnNpb24gd2FybmluZyIKKzFkYjA3Y2RlIE1lcmdlICJhbmltX2VuY29kZTogY29zbWV0aWNzOiBmaXggYWxpZ25tZW50IgorZTI4MjcxYTMgYW5pbV9lbmNvZGU6IGNvc21ldGljczogZml4IGFsaWdubWVudAorN2ZlMzU3Yjggc3BsaXQgNjQtbXVsdCBoYXNoaW5nIGludG8gdHdvIDMyLWJpdCBtdWx0aXBsaWVzCithZjc0YzE0NSBwb3B1bGF0ZSAnbGlid2VicGV4dHJhcycgd2l0aDogaW1wb3J0IGdyYXksIHJnYjU2NSBhbmQgcmdiNDQ0NCBmdW5jdGlvbnMKKzYxMjE0MTM0IHJlbW92ZSBWUDhSZXNpZHVhbDo6Y29zdCB1bnVzZWQgZmllbGQKK2UyNTQ0ODIzIGZpeCBNU1ZDIHNpemVfdC0+aW50IGNvbnZlcnNpb24gd2FybmluZworYjY5YTZjMzUgdndlYnA6IGRvbid0IHJlZGVmaW5lIHNucHJpbnRmIHdpdGggVlMyMDE1KworMGFjMjljNTEgQW5pbUVuY29kZXIgQVBJOiBDb25zaXN0ZW50IHVzZSBvZiB0cmFpbGluZyB1bmRlcnNjb3JlcyBpbiBzdHJ1Y3QuCitkNDg0NTU1MCBBbmltRW5jb2RlciBBUEk6IFVzZSB0aW1lc3RhbXAgaW5zdGVhZCBvZiBkdXJhdGlvbiBhcyBpbnB1dCB0byBBZGQoKS4KKzk5MDRlMzY1IGRzcC9kZWNfc3NlMjogREM4dXYgLyBEQzh1dk5vTGVmdCBzcGVlZHVwCis3ZGYyMDQ5NyBkc3AvZGVjX3NzZTI6IERDMTYgLyBEQzE2Tm9MZWZ0IHNwZWVkdXAKKzhlNTE1ZGZlIE1lcmdlICJtYWtlZmlsZS51bml4OiBhZGQgc29tZSBtaXNzaW5nIGhlYWRlcnMiCitkYjEyMjUwZiBjb3NtZXRpY3M6IHZwOGVuY2kuaDogYnJlYWsgbG9uZyBsaW5lCitiZjUxNmE4NyBtYWtlZmlsZS51bml4OiBhZGQgc29tZSBtaXNzaW5nIGhlYWRlcnMKK2I0NGVkYTNmIGRzcDogYWRkIERTUF9JTklUX1NUVUIKKzAzZTc2ZTk2IGNsYXJpZnkgdGhlIGNvbW1lbnQgYWJvdXQgZG91YmxlLXNldHRpbmcgdGhlIHN0YXR1cyBpbiBTZXRFcnJvcigpCis5ZmVjZGQ3MSByZW1vdmUgdW51c2VkIEVtaXRSR0IoKQorNDNmMDEwZGQgbW92ZSBSZWNvbnN0cnVjdFJvdyB0byB0b3AKKzgyZDk4MDIwIGFkZCBhIGRlYy9jb21tb24uaCBoZWFkZXIgdG8gY29sbGVjdCBjb21tb24gZW5jL2RlYyAjZGVmaW5lcworNWQ0NzQ0YTIgTWVyZ2UgImVuY19zc2U0MTogYWRkIERpc3RvNHg0IC8gRGlzdG8xNngxNiIKK2UzODg4NmE3IG11eC5oOiBCdW1wIHVwIEFCSSB2ZXJzaW9uCis0NjMwNWNhNiBjb25maWd1cmU6IGFkZCAtLWRpc2FibGUtPGF2eDJ8c3NlNC4xfHNzZTI+CisyZmM4YjY1OCBDUFBGTEFHUy0+Q0ZMQUdTIGZvciBkZXRlY3Rpbmcgc3NlNC4xIGluIHByZXByb2Nlc3NvcgorMWEzMzhmYjMgZW5jX3NzZTQxOiBhZGQgRGlzdG80eDQgLyBEaXN0bzE2eDE2Cis5NDA1NTUwMyBlbmNvZGluZyBTU0U0LjEgc3R1YiBmb3IgU3RvcmVIaXN0b2dyYW0gKyBRdWFudGl6ZSArIFNTRV8xNnhOCitjNjQ2NTllMSByZW1vdmUgZHVwbGljYXRlIHZhcmlhYmxlcyBhZnRlciB0aGUgbG9zc2xlc3N7X2VuY30uYyBzcGxpdAorNjdiYTdjN2EgZW5jX3NzZTI6IGNhbGwgbG9jYWwgRlRyYW5zZm9ybSBpbiBDb2xsZWN0SGlzdG9ncmFtCisxODI0OTc5OSBkc3A6IHMvVlA4TFNldEhpc3RvZ3JhbURhdGEvVlA4U2V0SGlzdG9ncmFtRGF0YS8KK2VkZTVlMTU4IGNvc21ldGljczogZHNwL2xvc3NsZXNzLmg6IHJlb3JkZXIgcHJvdG90eXBlcworNTUzMDUxZjcgZHNwL2xvc3NsZXNzOiBzcGxpdCBlbmMvZGVjIGZ1bmN0aW9ucworOTA2NGFkYzggTWVyZ2UgImNvbmRpdGlvbmFsbHkgYWRkIC1tc3NlNC4xIGluIE1ha2VmaWxlLnVuaXgiCitjZWNmNTA5NiBkc3AveXV2Ki5jOiByZXdvcmsgV0VCUF9VU0VfPGFyY2g+IGlmZGVmCis2NTg0ZDM5OCBkc3AvdXBzYW1wbGluZyouYzogcmV3b3JrIFdFQlBfVVNFXzxhcmNoPiBpZmRlZgorODA4MDk0MjIgZHNwL3Jlc2NhbGVyKi5jOiByZXdvcmsgV0VCUF9VU0VfPGFyY2g+IGlmZGVmCisxZDkzZGRlYyBkc3AvbG9zc2xlc3MqLmM6IHJld29yayBXRUJQX1VTRV88YXJjaD4gaWZkZWYKKzczODA1ZmYyIGRzcC9maWx0ZXJzKi5jOiByZXdvcmsgV0VCUF9VU0VfPGFyY2g+IGlmZGVmCitmYmRjZWYyNCBkc3AvZW5jKi5jOiByZXdvcmsgV0VCUF9VU0VfPGFyY2g+IGlmZGVmCis2NmRlNjljMSBkc3AvZGVjKi5jOiByZXdvcmsgV0VCUF9VU0VfPGFyY2g+IGlmZGVmCis0OGU0ZmZkMSBkc3AvY29zdCouYzogcmV3b3JrIFdFQlBfVVNFXzxhcmNoPiBpZmRlZgorMjlmZDZmOTAgZHNwL2FyZ2IqLmM6IHJld29yayBXRUJQX1VTRV88YXJjaD4gaWZkZWYKKzgwZmYzODEzIGRzcC9hbHBoYSouYzogcmV3b3JrIFdFQlBfVVNFXzxhcmNoPiBpZmRlZgorYmYwOWNmMWUgY29uZGl0aW9uYWxseSBhZGQgLW1zc2U0LjEgaW4gTWFrZWZpbGUudW5peAorZTk1NzBkZDkgc3R1YiBmb3IgU1NFNC4xIHN1cHBvcnQuCis0YTk1Mzg0YiBNZXJnZSAiZHNwOiBhZGQgc3NlNC4xIGRldGVjdGlvbiIKK2NhYmY0YmQyIGRzcDogYWRkIHNzZTQuMSBkZXRlY3Rpb24KKzRlY2JhMWFiIHRocmVhZC5oOiByZW5hbWUgaW50ZXJmYWNlIHBhcmFtCitiOGQ3MDZjOCBNZXJnZSAic3luYyB2ZXJzaW9ucyB3aXRoIDAuNC4zIgorYWU2NGE3MTEgTWVyZ2UgImFkZCBzaGVsbCBmb3IgbGlid2VicGV4dHJhcyIKKzkyYTVkYTljIHN5bmMgdmVyc2lvbnMgd2l0aCAwLjQuMworOWQ0ZTJkMTYgTWVyZ2UgIn4zMCUgZmFzdGVyIHNtYXJ0LXl1diAoLXByZSA0KSB3aXRoIGVhcmx5LW91dCBjcml0ZXJpb24iCitiMWJkYmJhYiB+MzAlIGZhc3RlciBzbWFydC15dXYgKC1wcmUgNCkgd2l0aCBlYXJseS1vdXQgY3JpdGVyaW9uCis3ZWZiOTc0OCBNZXJnZSAiRGlzYWJsZSBORU9OIGNvZGUgb24gTmF0aXZlIENsaWVudCIKK2FjNGY1Nzg0IERpc2FibGUgTkVPTiBjb2RlIG9uIE5hdGl2ZSBDbGllbnQKKzA4NzNmODViIEFuaW1FbmNvZGVyIEFQSTogU3VwcG9ydCBpbnB1dCBmcmFtZXMgaW4gWVVWKEEpIGZvcm1hdC4KKzVjMTc2ZDJkIGFkZCBzaGVsbCBmb3IgbGlid2VicGV4dHJhcworNDRiZDk1NjEgZml4IHNpZ25hdHVyZSBmb3IgVlA4UmVjb3JkQ29lZmZUb2tlbnMoKQorYzliOGVhMGUgc21hbGwgY29zbWV0aWNzIG9uIFRva2VuQnVmZmVyLgorNzYzOTRjMDkgTWVyZ2UgIk1JUFM6IGRzcHIyOiBhZGRlZCBvcHRpbWl6YXRpb24gZm9yIFRydWVNb3Rpb24iCiswZjc3MzY5MyBXZWJQUGljdHVyZVJlc2NhbGU6IGFkZCBhIG5vdGUgYWJvdXQgMCB3aWR0aC9oZWlnaHQKKzI0MWJiNWQ5IE1JUFM6IGRzcHIyOiBhZGRlZCBvcHRpbWl6YXRpb24gZm9yIFRydWVNb3Rpb24KKzZjZWYwZTRmIGV4YW1wbGVzL0FuZHJvaWQubWs6IGFkZCB3ZWJwbXV4X2V4YW1wbGUgdGFyZ2V0Cis1M2MxNmZmMCBBbmRyb2lkLm1rOiBhZGQgd2VicG11eCB0YXJnZXQKKzIxODUyYTAwIEFuZHJvaWQubWs6IGFkZCB3ZWJwZGVtdXggdGFyZ2V0Cis4Njk3YTNiYyBBbmRyb2lkLm1rOiBhZGQgd2VicGRlY29kZXJ7LF9zdGF0aWN9IHRhcmdldHMKKzRhNjcwNDkxIEFuZHJvaWQubWs6IHNwbGl0IHNvdXJjZSBsaXN0cyBwZXItZGlyZWN0b3J5CitiNWU3OTQyMiBNSVBTOiBkc3ByMjogQWRkZWQgb3B0aW1pemF0aW9uIGZvciBzb21lIGNvbnZlcnQgZnVuY3Rpb25zCiswZjU5NWRiNiBNSVBTOiBkc3ByMjogQWRkZWQgb3B0aW1pemF0aW9uIGZvciBzb21lIGNvbnZlcnQgZnVuY3Rpb25zCis4YTIxOGI0YSBNSVBTOiBbbWlwczMyfGRzcHIyXTogR2V0UmVzaWR1YWxDb3N0IHJlYmFzZWQKK2VmOTg3NTAwIFNwZWVkdXAgbWV0aG9kIFN0b3JlSW1hZ2VUb0JpdE1hc2sgYnkgNSUuCis2MDJhMDBmOSBmaXggaU9TIGFybTY0IGJ1aWxkIHdpdGggWGNvZGUgNi4zCisyMzgyMDUwNyAxLTIlIGZhc3RlciBlbmNvZGluZyBieSByZW1vdmluZyBhbiBpbmRpcmVjdGlvbiBpbiBHZXRSZXNpZHVhbENvc3QoKQorZWRkYjdlNzAgTUlQUzogZHNwcjI6IGFkZGVkIG90cGltaXphdGlvbiBmb3IgREM4dXYsIERDOHV2Tm9Ub3AgYW5kIERDOHV2Tm9MZWZ0Cis3M2JhMjkxNSBNSVBTOiBkc3ByMjogYWRkZWQgb3B0aW1pemF0aW9uIGZvciBmdW5jdGlvbnMgUkQ0IGFuZCBMRDQKK2M3MTI5ZGE1IE1lcmdlICI0LTUlIGZhc3RlciBlbmNvZGluZyB1c2luZyBTU0UyIGZvciBHZXRSZXNpZHVhbENvc3QiCis5NDM4MGQwMCBNSVBTOiBkc3ByMjogYWRkZWQgb3B0aW1pemF0b24gZm9yIGZ1bmN0aW9ucyBWRTQgYW5kIERDNAorMmE0MDcwOTIgNC01JSBmYXN0ZXIgZW5jb2RpbmcgdXNpbmcgU1NFMiBmb3IgR2V0UmVzaWR1YWxDb3N0CisxN2UxOTg2MiBNZXJnZSAiTUlQUzogZHNwcjI6IGFkZGVkIG9wdGltaXphdGlvbiBmb3Igc2ltcGxlIGZpbHRlcmluZyBmdW5jdGlvbnMiCiszZWM0MDRjNCBNZXJnZSAiZHNwOiBub3JtYWxpemUgV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB1c2FnZSIKK2I5NjlmNWRmIGRzcDogbm9ybWFsaXplIFdFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdXNhZ2UKK2Q3YjhlNzExIE1JUFM6IGRzcHIyOiBhZGRlZCBvcHRpbWl6YXRpb24gZm9yIHNpbXBsZSBmaWx0ZXJpbmcgZnVuY3Rpb25zCisyMzVmNzc0ZSBNZXJnZSAiTUlQUzogZHNwcjI6IEFkZGVkIG9wdGltaXphdGlvbiBmb3IgZnVuY3Rpb24gVlA4TFRyYW5zZm9ybUNvbG9ySW52ZXJzZV9DIgorNDJhOGE2MjggTUlQUzogZHNwcjI6IEFkZGVkIG9wdGltaXphdGlvbiBmb3IgZnVuY3Rpb24gVlA4TFRyYW5zZm9ybUNvbG9ySW52ZXJzZV9DCitiNDQyYmVmMyBNZXJnZSAiQXBwbHlGaWx0ZXJzQW5kRW5jb2RlOiBvbmx5IGNvcHkgbG9zc2xlc3Mgc3RhdHMiCitiNTEwZmJmZSBkb2Mvd2VicC1jb250YWluZXItc3BlYzogbm90ZSBNU0Igb3JkZXIgZm9yIGNodW5rIGRpYWdyYW1zCis5YmMwZjkyMiBBcHBseUZpbHRlcnNBbmRFbmNvZGU6IG9ubHkgY29weSBsb3NzbGVzcyBzdGF0cworMzAzMGYxMTUgTWVyZ2UgImRzcC9taXBzOiBhZGQgc29tZSBtaXNzaW5nIFRTYW4gYW5ub3RhdGlvbnMiCitkZmNmNDU5MyBNZXJnZSAiTUlQUzogZHNwcjI6IEFkZGVkIG9wdGltaXphdGlvbiBmb3IgZnVuY3Rpb24gVlA4TEFkZEdyZWVuVG9CbHVlQW5kUmVkX0MiCis1NWM3NWEyNSBkc3AvbWlwczogYWRkIHNvbWUgbWlzc2luZyBUU2FuIGFubm90YXRpb25zCisyY2I4NzlmMCBNSVBTOiBkc3ByMjogQWRkZWQgb3B0aW1pemF0aW9uIGZvciBmdW5jdGlvbiBWUDhMQWRkR3JlZW5Ub0JsdWVBbmRSZWRfQworZTE1NTYwMTAgbW92ZSBzb21lIGNvc3QgdGFibGVzIGZyb20gZW5jLyB0byBkc3AvCitjM2EwMzE2OCBNZXJnZSAicGljdHVyZV9jc3A6IGZpeCBidWlsZCB3L1VTRV9HQU1NQV9DT01QUkVTU0lPTiB1bmRlZmluZWQiCiszOTUzN2Q3YyBNZXJnZSAiVlA4TERzcEluaXRNSVBTZHNwUjI6IGFkZCBtaXNzaW5nIFRTYW4gYW5ub3RhdGlvbiIKKzFkZDQxOWNlIHBpY3R1cmVfY3NwOiBmaXggYnVpbGQgdy9VU0VfR0FNTUFfQ09NUFJFU1NJT04gdW5kZWZpbmVkCis0M2ZkMzU0MyBWUDhMRHNwSW5pdE1JUFNkc3BSMjogYWRkIG1pc3NpbmcgVFNhbiBhbm5vdGF0aW9uCitjNzIzM2RmYyBNZXJnZSAiVlA4TERzcEluaXQ6IHJlbW92ZSBtZW1jcHkiCiswZWM0ZGE5NiBwaWN0dXJlX2NzcDo6SW5pdEdhbW1hVGFibGVzKjogYWRkIG1pc3NpbmcgVFNhbiBhbm5vdGF0aW9ucworMzU1NzlhNDkgVlA4TERzcEluaXQ6IHJlbW92ZSBtZW1jcHkKKzk3ZjZhZmY4IFZQOFlVVkluaXQ6IGFkZCBtaXNzaW5nIFRTYW4gYW5ub3RhdGlvbgorZjkwMTZkNjYgZHNwL2VuYzo6SW5pdFRhYmxlczogYWRkIG1pc3NpbmcgVFNhbiBhbm5vdGF0aW9uCitlM2Q5NzcxYSBWUDhFbmNEc3BDb3N0SW5pdCo6IGFkZCBtaXNzaW5nIFRTYW4gYW5ub3RhdGlvbnMKK2Q5N2MxNDNkIE1lcmdlICJkb2Mvd2VicC1jb250YWluZXItc3BlYzogY29zbWV0aWNzIgorMzA5Yjc5MDggTUlQUzogbWlwczMyOiBBZGRlZCBvcHRpbWl6YXRpb24gZm9yIGZ1bmN0aW9uIFNldFJlc2lkdWFsQ29lZmZzCithOTg3ZmFlZCBNSVBTOiBkc3ByMjogYWRkZWQgb3B0aW1pemF0aW9uIGZvciBmdW5jdGlvbiBHZXRSZXNpZHVhbENvc3QKK2U3ZDNkZjIzIGRvYy93ZWJwLWNvbnRhaW5lci1zcGVjOiBjb3NtZXRpY3MKK2JlNjYzNWU5IE1lcmdlICJWUDhUQnVmZmVyQ2xlYXI6IHJlbW92ZSBzb21lIG1pc2xlYWRpbmcgY29uc3QncyIKKzAyOTcxZTcyIE1lcmdlICJWUDhFbWl0VG9rZW5zOiByZW1vdmUgdW5uZWNlc3NhcnkgcGFyYW0gdm9pZCBjYXN0IgorM2I3N2U1YTcgVlA4VEJ1ZmZlckNsZWFyOiByZW1vdmUgc29tZSBtaXNsZWFkaW5nIGNvbnN0J3MKK2FhMTM5YzhmIFZQOEVtaXRUb2tlbnM6IHJlbW92ZSB1bm5lY2Vzc2FyeSBwYXJhbSB2b2lkIGNhc3QKK2MyNGQ4ZjE0IGNvc21ldGljczogdXBzYW1wbGluZ19zc2UyOiBhZGQgY29uc3QgdG8gc29tZSBjYXN0cworMTgyOWM0MmMgY29zbWV0aWNzOiBsb3NzbGVzc19zc2UyOiBhZGQgY29uc3QgdG8gc29tZSBjYXN0cworMTgzMTY4ZjMgY29zbWV0aWNzOiBlbmNfc3NlMjogYWRkIGNvbnN0IHRvIHNvbWUgY2FzdHMKKzg2MGJhZGNhIGNvc21ldGljczogZGVjX3NzZTI6IGFkZCBjb25zdCB0byBzb21lIGNhc3RzCiswMjU0ZGI5NyBjb3NtZXRpY3M6IGFyZ2Jfc3NlMjogYWRkIGNvbnN0IHRvIHNvbWUgY2FzdHMKKzFhYWRmODU2IGNvc21ldGljczogYWxwaGFfcHJvY2Vzc2luZ19zc2UyOiBhZGQgY29uc3QgdG8gc29tZSBjYXN0cworMTU3OWRlM2MgdndlYnA6IGNsZWFyIGNhbnZhcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggbG9vcAorNGI5ZmE1ZDAgTWVyZ2UgIndlYnAtY29udGFpbmVyLXNwZWM6IGNsYXJpZnkgYmFja2dyb3VuZCBjbGVhciBvbiBsb29wIgorNGM4MjI4NGQgVXBkYXRlZCB0aGUgbmVhci1sb3NzbGVzcyBsZXZlbCBtYXBwaW5nLgorNTYwMzk0Nzkgd2VicC1jb250YWluZXItc3BlYzogY2xhcmlmeSBiYWNrZ3JvdW5kIGNsZWFyIG9uIGxvb3AKKzE5ZjBiYTBlIEltcGxlbWVudCB0cnVlLW1vdGlvbiBwcmVkaWN0aW9uIGluIFNTRTIKKzc3NGQ0Y2I3IG1ha2UgVlA4UHJlZEx1bWExNltdIGFycmF5IG5vbi1jb25zdAorZDdlYWJiODAgTWVyZ2UgIk1JUFM6IGRzcHIyOiBBZGRlZCBvcHRpbWl6YXRpb24gZm9yIGZ1bmN0aW9uIENvbGxlY3RIaXN0b2dyYW0iCitmZTQyNzM5YyBVc2UgaW50ZWdlcnMgZm9yIGttaW4va21heCBmb3Igc2ltcGxpY2l0eS4KK2I5ZGYzNWY3IEFuaW1FbmNvZGUgQVBJOiBrbWF4PTAgc2hvdWxkIGltcGx5IGFsbCBrZXlmcmFtZXMuCis2Y2UyOTZkYSBNSVBTOiBkc3ByMjogQWRkZWQgb3B0aW1pemF0aW9uIGZvciBmdW5jdGlvbiBDb2xsZWN0SGlzdG9ncmFtCisyYzkwNmM0MCB2d2VicDogcmVtb3ZlIHVubmVjZXNzYXJ5IHN0YXRpYyBIZWxwKCkgcHJvdG90eXBlCitiZTBmZDFkNSBNZXJnZSAiZGVjL3ZwODogY2xlYXIgJ2RpdGhlcl8nIG9uIHNraXBwZWQgYmxvY2tzIgorZTk2MTcwZmUgTWVyZ2UgInZ3ZWJwL2FuaW1hdGlvbjogZGlzcGxheSBsYXN0IGZyYW1lIG9uIGVuZC1vZi1sb29wIgorMGYwMTdiNTYgdndlYnAvYW5pbWF0aW9uOiBkaXNwbGF5IGxhc3QgZnJhbWUgb24gZW5kLW9mLWxvb3AKK2M4NmI0MGNjIGVuYy9uZWFyX2xvc3NsZXNzLmM6IGZpeCBhbGlnbm1lbnQKKzY2OTM1ZmI5IGRlYy92cDg6IGNsZWFyICdkaXRoZXJfJyBvbiBza2lwcGVkIGJsb2NrcworYjdkZTc5NDYgTWVyZ2UgImxvc3NsZXNzX25lb246IGVuYWJsZSBzdWJ0cmFjdCBncmVlbiBmb3IgYWFyY2g2NCIKKzc3NzI0ZjcwIFNTRTIgdmVyc2lvbiBvZiBHcmFkaWVudFVuZmlsdGVyCis0MTZlMWNlYSBsb3NzbGVzc19uZW9uOiBlbmFibGUgc3VidHJhY3QgZ3JlZW4gZm9yIGFhcmNoNjQKKzcyODMxZjZiIFNwZWVkdXAgQW5hbHl6ZUFuZEluaXQgZm9yIGxvdyBlZmZvcnQgY29tcHJlc3Npb24uCithNjU5NzQ4MyBTcGVlZHVwIEFuYWx5emUgbWV0aG9kcyBmb3IgbG9zc2xlc3MgY29tcHJlc3Npb24uCis5OGM4MTM4NiBFbmFibGUgTmVhci1sb3NzbGVzcyBmZWF0dXJlLgorYzZiMjQ1NDMgQW5pbUVuY29kZXIgQVBJOiBGaXggZm9yIGttYXg9MSBhbmQgZGVmYXVsdCBrbWluIGNhc2UuCiswMjJkMmY4OCBhZGQgU1NFMiB2YXJpYW50cyBmb3IgYWxwaGEgZmlsdGVyaW5nIGZ1bmN0aW9ucworMmRiMTVhOTUgVGVtcG9yYXJpbHkgZGlzYWJsZSBlbmNvZGluZyBvZiBhbHBoYSBwbGFuZSB3aXRoIGNvbG9yIGNhY2hlLgorMWQ1NzVjY2QgTWVyZ2UgIkxvc3NsZXNzIGRlY29kaW5nOiBSZW1vdmUgYW4gdW5uZWNlc3NhcnkgaWYgY29uZGl0aW9uLiIKK2NhZmExZDg4IE1lcmdlICJTaW1wbGlmeSBiYWNrd2FyZCByZWZzIGNhbGN1bGF0aW9uIGZvciBsb3ctZWZmb3J0LiIKKzdhZmRhZjg0IEFscGhhIGNvZGluZzogcmVvcmdhbml6ZSB0aGUgZmlsdGVyL3VuZmlsdGVyaW5nIGNvZGUKKzRkNmQ3Mjg1IFNpbXBsaWZ5IGJhY2t3YXJkIHJlZnMgY2FsY3VsYXRpb24gZm9yIGxvdy1lZmZvcnQuCitlYzBkMWJlNSBDbGVhdXAgTmVhci1sb3NzbGVzcyBjb2RlLgorOTgxNGRkYjYgUmVtb3ZlIHRoZSBwb3N0LXRyYW5zZm9ybSBuZWFyLWxvc3NsZXNzIGhldXJpc3RpYy4KKzQ1MDllMzJlIExvc3NsZXNzIGRlY29kaW5nOiBSZW1vdmUgYW4gdW5uZWNlc3NhcnkgaWYgY29uZGl0aW9uLgorZjJlYmM0YTggTWVyZ2UgIlJlZ3Jlc3Npb24gZml4IGZvciBsb3NzbGVzcyBkZWNvZGluZyIKKzc4M2E4Y2RhIFJlZ3Jlc3Npb24gZml4IGZvciBsb3NzbGVzcyBkZWNvZGluZworOWEwNjJiOGUgQW5pbUVuY29kZXI6IEJ1Z2ZpeCBmb3Iga21pbiA9IDEgYW5kIGttYXggPSAyLgorMGYwMjdhNzIgc2ltcGxpZnkgc21hcnQgUkdCLT5ZVVYgY29udmVyc2lvbiBjb2RlCiswZDViMzM0ZSBCYWNrd2FyZFJlZmVyZW5jZXNIYXNoQ2hhaW5Gb2xsb3dDaG9zZW5QYXRoOiByZW1vdmUgdW51c2VkIHZhcmlhYmxlCitmNDgwZDFhNyBGaXggdG8gbmVhciBsb3NzbGVzcyBhcnRlZmFjdHMgb24gcGFsZXR0aXplZCBpbWFnZXMuCitkNDYxNWQwOCBNZXJnZSBjaGFuZ2VzIElhMTY4NjgyOCxJMzk5ZmRhNDAKK2NiNGExOGE3IHJlbmFtZSBIYXNoQ2hhaW5Jbml0IGludG8gSGFzaENoYWluUmVzZXQKK2YwNzllNDg3IHVzZSB1aW50MTZfdCBmb3IgY2hvc2VuX3BhdGhbXQorZGEwOTEyMTIgTUlQUzogZHNwcjI6IEFkZGVkIG9wdGltaXphdGlvbiBmb3IgZnVuY3Rpb24gRlRyYW5zZm9ybVdIVAorYjhjMjAxMzUgTWVyZ2UgIndpY2RlYzogKG1zdnMpIHF1aWV0IHNvbWUgL2FuYWx5emUgd2FybmluZ3MiCis5YjIyOGI1NCB3aWNkZWM6IChtc3ZzKSBxdWlldCBzb21lIC9hbmFseXplIHdhcm5pbmdzCitkYWViMjc2YSBNZXJnZSAiTUlQUzogZHNwcjI6IEFkZGVkIG9wdGltaXphdGlvbiBmb3IgTXVsdEFSR0JSb3cgZnVuY3Rpb24iCitjYzA4NzQyNCBNZXJnZSAiZHNwL2NwdTogKG1zdnMpIGFkZCBpbmNsdWRlIGZvciBfX2NwdWlkZXgiCis0YTgyYWFiNSBNZXJnZSBjaGFuZ2VzIEk4NzU0NGU5MixJMGJiNmNkYTUKKzdhMTkxMzk4IGR3ZWJwL1dyaXRlUE5HOiBtYXJrIHBuZyB2YXJpYWJsZXMgdm9sYXRpbGUKKzc3NWRmYWQyIGR3ZWJwOiBpbmNsdWRlIHNldGptcC5oIHcvV0VCUF9IQVZFX1BORworNDdkMjZiZTcgZHdlYnA6IGNvcnJlY3Qgc2lnbiBpbiBmb3JtYXQgc3RyaW5ncworZjBlMDY3N2IgVlA4TEVuY29kZVN0cmVhbTogYWRkIGFuIGFzc2VydAorYzVmNzc0N2YgVlA4TENvbG9yQ2FjaGVDb3B5OiBwcm9tb3RlIGFuIGludCBiZWZvcmUgc2hpZnRpbmcKKzBkZTVmMzNlIGRzcC9jcHU6IChtc3ZzKSBhZGQgaW5jbHVkZSBmb3IgX19jcHVpZGV4Cis3ZDg1MGY3YiBNSVBTOiBkc3ByMjogQWRkZWQgb3B0aW1pemF0aW9uIGZvciBNdWx0QVJHQlJvdyBmdW5jdGlvbgorNTQ4NzUyOTMgTUlQUzogZHNwcjI6IGFkZGVkIG9wdGltaXphdGlvbiBmb3IgZnVuY3Rpb24gUXVhbnRpemVCbG9jaworNGZiZTljZjIgZHNwL2NwdTogKG1zdnMpIGF2b2lkIGltbWludHJpbi5oIG9uIF9NX0FSTQorM2ZkNTkwMzkgc2ltcGxpZnkvcmVvcmdhbml6ZSBhcmd1bWVudHMgZm9yIENvbGxlY3RDb2xvckJsdWVUcmFuc2Zvcm1zCitiOWUzNTZiOSBEaXNhYmxlIGNvc3RseSBUcmFjZUJhY2t3YXJkcyBmb3IgbWV0aG9kPTAuCithN2U3Y2FhNCBNSVBTOiBkc3ByMjogYWRkZWQgb3B0aW1pemF0aW9uIGZvciBmdW5jdGlvbiBUcmFuc2Zvcm1Db2xvclJlZAorMmNiMzkxODAgTWVyZ2UgIk1JUFM6IGRzcHIyOiBhZGRlZCBvcHRpbWl6YXRpb24gZm9yIGZ1bmN0aW9uIFRyYW5zZm9ybUNvbG9yQmx1ZSIKKzI3OWU2NjEzIE1lcmdlICJkc3AvY3B1OiBhZGQgaW5jbHVkZSBmb3IgX3hnZXRidigpIHcvTVNWUyIKK2I2YzA0MjhlIGRzcC9jcHU6IGFkZCBpbmNsdWRlIGZvciBfeGdldGJ2KCkgdy9NU1ZTCitkMWM0ZmZhZSBnaWYyd2VicDogTW92ZSBHSUYgZGVjb2RpbmcgcmVsYXRlZCBjb2RlIHRvIGEgc3VwcG9ydCBsaWJyYXJ5LgorMDdjMzk1NTkgTWVyZ2UgIkFuaW1FbmNvZGVyIEFQSTogQWRkIGluZm8gaW4gUkVBRE1FLm11eCIKKzdiMTYxOTczIE1JUFM6IGRzcHIyOiBhZGRlZCBvcHRpbWl6YXRpb24gZm9yIGZ1bmN0aW9uIFRyYW5zZm9ybUNvbG9yQmx1ZQorZDdjNGIwMmEgY3B1OiBmaXggQVZYMiBkZXRlY3Rpb24gZm9yIGdjYy9jbGFuZyB0YXJnZXRzCis5ZDI5OTQ2OSBBbmltRW5jb2RlciBBUEk6IEFkZCBpbmZvIGluIFJFQURNRS5tdXgKK2Q1ODFiYTQwIGZvbGxvdy11cDogY2xlYW4gdXAgV2ViUFJlc2NhbGVyWFhYIGRzcCBmdW5jdGlvbgorZjg3NDBmMGQgZHNwOiBzL1VTRV9JTlRSSU5TSUNTL1dFQlBfVVNFX0lOVFJJTlNJQ1MvCitjZTczYWJlMCBNZXJnZSAiaW50cm9kdWNlIGEgc2VwYXJhdGUgV2ViUFJlc2NhbGVyRHNwSW5pdCB0byBpbml0aWFsaXplIHBvaW50ZXJzIgorYWI2NmJlY2EgaW50cm9kdWNlIGEgc2VwYXJhdGUgV2ViUFJlc2NhbGVyRHNwSW5pdCB0byBpbml0aWFsaXplIHBvaW50ZXJzCisyMDVjN2YyNiBmaXggaGFuZGxpbmcgb2YgemVyby1zaXplZCBwYXJ0aXRpb24gIzAgY29ybmVyIGNhc2UKK2NiY2RkNWZmIE1lcmdlICJtb3ZlIHJlc2NhbGVyIGZ1bmN0aW9ucyB0byByZXNjYWxlciogZmlsZXMgaW4gc3JjL2RzcC8iCitiZjU4NmU4OCBNZXJnZSBjaGFuZ2VzIEkyMzBiMzUzMixJZGYzMDU3YTcKKzZkYzc5ZGMyIE1lcmdlICJhbmltX2VuY29kZTogZml4IHR5cGUgY29udmVyc2lvbiB3YXJuaW5ncyIKKzExZmNlMjVhIE1lcmdlICJkZWNfbmVvbjogcmVtb3ZlIHJldHVybnMgZnJvbSB2b2lkIGZ1bmN0aW9ucyIKK2M0ZTYzZjk5IE1ha2VmaWxlLnZjOiBhZGQgZ2lmMndlYnAgdGFyZ2V0Cis0ZjQzZDM4YyBlbmFibGUgTkVPTiBmb3IgV2luZG93cyBBUk0gYnVpbGRzCiszZjY2MTVhYyBNYWtlZmlsZS52YzogYWRkIHJ1ZGltZW50YXJ5IFdpbmRvd3MgQVJNIHN1cHBvcnQKK2U3YzU5NTRjIGRlY19uZW9uOiByZW1vdmUgcmV0dXJucyBmcm9tIHZvaWQgZnVuY3Rpb25zCitmNzljMTYzYiBhbmltX2VuY29kZTogZml4IHR5cGUgY29udmVyc2lvbiB3YXJuaW5ncworMGY1NGYxZWMgUmVtb3ZlIGdpZjJ3ZWJwX3V0aWwgd2hpY2ggaXMgbm8gbG9uZ2VyIG5lZWRlZC4KK2NiY2JlZGQwIG1vdmUgcmVzY2FsZXIgZnVuY3Rpb25zIHRvIHJlc2NhbGVyKiBmaWxlcyBpbiBzcmMvZHNwLworYWM3OWVkMTkgd2VicG11eDogcmVtb3ZlIGV4cGVyaW1lbnRhbCBmcmFnbWVudCBoYW5kbGluZworZTg2OTRkNGQgbXV4OiByZW1vdmUgZXhwZXJpbWVudGFsIEZSR00gcGFyc2luZworOWU5MmI2ZWEgQW5pbUVuY29kZXIgQVBJOiBPcHRpbWl6ZSBzaW5nbGUtZnJhbWUgYW5pbWF0ZWQgaW1hZ2VzCithYmJhZTI3OSBNZXJnZSAiTW92ZSBvdmVyIGdpZjJ3ZWJwIHRvIHRoZSBuZXcgQW5pbUVuY29kZXIgQVBJLiIKK2EyOGM0YjM2IE1JUFM6IG1vdmUgV09SS19BUk9VTkRfR0NDIGRlZmluZSB0byBhcHByb3ByaWF0ZSBwbGFjZQorMDEyZDJjNjAgTUlQUzogZHNwcjI6IGFkZGVkIG9wdGltaXphdGlvbiBmb3IgZnVuY3Rpb25zIFNTRUF4QgorNjc3MjBjOGIgTW92ZSBvdmVyIGdpZjJ3ZWJwIHRvIHRoZSBuZXcgQW5pbUVuY29kZXIgQVBJLgorOTI0MWVjZjQgTUlQUzogZHNwcjI6IGFkZGVkIG9wdGltaXphdGlvbiBmb3IgZnVuY3Rpb24gQXZlcmFnZQorOTQyMjIxMWQgTWVyZ2UgIlR1bmUgQmFja3dhcmRSZWZlcmVuY2VzTHo3NyBmb3IgbG93X2VmZm9ydCAobT0wKS4iCitkZjQwMDU3YiBNZXJnZSAiU3BlZWR1cCBWUDhMR2V0SGlzdG9JbWFnZVN5bWJvbHMgZm9yIGxvdyBlZmZvcnQgKG09MCkgbW9kZS4iCitlYTA4NDY2ZCBUdW5lIEJhY2t3YXJkUmVmZXJlbmNlc0x6NzcgZm9yIGxvd19lZmZvcnQgKG09MCkuCitiMGI5NzNjMyBTcGVlZHVwIFZQOExHZXRIaXN0b0ltYWdlU3ltYm9scyBmb3IgbG93IGVmZm9ydCAobT0wKSBtb2RlLgorYzZkMzI5MjcgYXJnYl9zc2UyOiBjb3NtZXRpY3MKKzY3ZjYwMWNkIG1ha2UgdGhlICdsYXN0X2NwdWluZm9fdXNlZCcgdmFyaWFibGUgbmFtZXMgdW5pcXVlCitiOTQ4OTg2MSBBbmltRW5jb2RlciBBUEk6IEluaXQgbWV0aG9kIGZvciBkZWZhdWx0IG9wdGlvbnMuCis4NTZmOGVjMSBNZXJnZSAiQW5pbUVuY29kZXIgQVBJOiBSZW1vdmUgQW5pbUVuY29kZXJGcmFtZU9wdGlvbnMuIgorYzUzNzUxNGQgTWVyZ2UgIkFuaW1FbmNvZGVyIEFQSTogR2VuZXJhdGVDYW5kaWRhdGVzIGJ1Z2ZpeC4iCitkYzBjZTAzOSBNZXJnZSAiQW5pbUVuY29kZXIgQVBJOiBDb21wdXRlIGNoYW5nZSByZWN0YW5nbGUgZm9yIGZpcnN0IGZyYW1lIHRvby4iCitmMDBiNjM5YiBNZXJnZSAiQW5pbUVuY29kZXIgQVBJOiBJbiBBc3NlbWJsZSgpLCBhbHdheXMgc2V0IGFuaW1hdGlvbiBwYXJhbWV0ZXJzLiIKKzI5ZWQ3OTZjIE1lcmdlICJBbmltRW5jb2RlciBsaWIgY2xlYW51cDogcHJldiB0byBwcmV2IGNhbnZhcyBub3QgbmVlZGVkLiIKKzlmMGRkNmU1IE1lcmdlICJXZWJQQW5pbUVuY29kZXIgQVBJOiBIZWFkZXIgYW5kIGltcGxlbWVudGF0aW9uIgorNWU1NmJiZTAgQW5pbUVuY29kZXIgQVBJOiBSZW1vdmUgQW5pbUVuY29kZXJGcmFtZU9wdGlvbnMuCitiOTAyYzNlYSBBbmltRW5jb2RlciBBUEk6IEdlbmVyYXRlQ2FuZGlkYXRlcyBidWdmaXguCitlZjNjMzliYiBBbmltRW5jb2RlciBBUEk6IENvbXB1dGUgY2hhbmdlIHJlY3RhbmdsZSBmb3IgZmlyc3QgZnJhbWUgdG9vLgorZWVjNDIzYWIgQW5pbUVuY29kZXIgQVBJOiBJbiBBc3NlbWJsZSgpLCBhbHdheXMgc2V0IGFuaW1hdGlvbiBwYXJhbWV0ZXJzLgorYWUxYzA0NmUgQW5pbUVuY29kZXIgbGliIGNsZWFudXA6IHByZXYgdG8gcHJldiBjYW52YXMgbm90IG5lZWRlZC4KKzRiOTk3YWU0IFdlYlBBbmltRW5jb2RlciBBUEk6IEhlYWRlciBhbmQgaW1wbGVtZW50YXRpb24KKzcyMjA4YmVjIG1vdmUgYXJnYl8qLm8gYnVpbGQgdGFyZ2V0IHRvIGVuY29kZXIgbGlzdAorOTU5MjA1MzggTWVyZ2UgIm11bHRpLXRocmVhZCBmaXg6IGxvY2sgZWFjaCBlbnRyeSBwb2ludHMgd2l0aCBhIHN0YXRpYyB2YXIiCis0YzFiMzAwYSBNZXJnZSAiU1NFMiBpbXBsZW1lbnRhdGlvbiBvZiBWUDhQYWNrQVJHQiIKK2ZiY2MyMDA0IE1lcmdlICJhZGQgLVdmb3JtYXQtbm9ubGl0ZXJhbCBhbmQgLVdmb3JtYXQtc2VjdXJpdHkiCis4MGQ5NTBkOSBhZGQgLVdmb3JtYXQtbm9ubGl0ZXJhbCBhbmQgLVdmb3JtYXQtc2VjdXJpdHkKKzA0YzIwZTc1IE1lcmdlICJNSVBTOiBkc3ByMjogYWRkZWQgb3B0aW1pemF0aW9uIGZvciBmdW5jdGlvbiBJbnRyYTRQcmVkcyIKK2E0Mzc2OTRhIG11bHRpLXRocmVhZCBmaXg6IGxvY2sgZWFjaCBlbnRyeSBwb2ludHMgd2l0aCBhIHN0YXRpYyB2YXIKK2NhN2Y2MGRiIFNTRTIgaW1wbGVtZW50YXRpb24gb2YgVlA4UGFja0FSR0IKKzcyZDU3M2Y2IHNpbXBsaWZ5IHRoZSBQYWNrQVJHQiBzaWduYXR1cmUKKzRlMjU4OWZmIGRlbXV4OiByZXN0b3JlIHN0cmljdCBmcmFnbWVudCBmbGFnIGNoZWNrCis0YmE4ZTA3NCBNZXJnZSAid2VicC1jb250YWluZXItc3BlYzogcmVtb3ZlIHJlZmVyZW5jZXMgdG8gZnJhZ21lbnRzIgorZTc1MmYwYTYgTWVyZ2UgImRlbXV4OiByZW1vdmUgZXhwZXJpbWVudGFsIEZSR00gcGFyc2luZyIKK2Y4YWJiMTEyIE1lcmdlIGNoYW5nZXMgSTEwOWVjNGQ5LEk3M2ZlNzc0MworYWUyMTg4YTQgTUlQUzogZHNwcjI6IGFkZGVkIG9wdGltaXphdGlvbiBmb3IgZnVuY3Rpb24gSW50cmE0UHJlZHMKKzFmNGI4NjQyIG1vdmUgVlA4RW5jRHNwQVJHQkluaXQoKSBjYWxsIGNsb3NlciB0byB3aGVyZSBpdCdzIG5lZWRlZAorMTQxMDhkNzggZGVjX25lb246IGFkZCBEQzh1dk5vVG9wIC8gREM4dXZOb0xlZnQKK2Q4MzQwZGE3IGRlY19uZW9uOiBhZGQgREM4dXYKK2E2NmU2NmM3IHdlYnAtY29udGFpbmVyLXNwZWM6IHJlbW92ZSByZWZlcmVuY2VzIHRvIGZyYWdtZW50cworN2NlODc4OGIgTUlQUzogZHNwcjI6IGFkZGVkIG9wdGltaXphdGlvbiBmb3IgZnVuY3Rpb24gTWFrZUFSR0IzMgorMDEyZTYyM2QgZGVtdXg6IHJlbW92ZSBleHBlcmltZW50YWwgRlJHTSBwYXJzaW5nCis4N2MzZDUzMSBtZXRob2Q9MDogRG9uJ3QgZXZhbHVhdGUgYW55IHByZWRpY3RvcgorNmY0ZmNiOTggTWVyZ2UgIk1JUFM6IGRzcHIyOiBhZGRlZCBvcHRpbWl6YXRpb24gZm9yIGZ1bmN0aW9uIEltcG9ydFJvdyIKKzI0Mjg0NDU5IHJlcGxhY2UgdW5uZWVkZWQgY2FsbHMgdG8gSGlzdG9ncmFtQ29weSgpIGJ5IHN3YXBzCitiZGY3YjQwYyBNSVBTOiBkc3ByMjogYWRkZWQgb3B0aW1pemF0aW9uIGZvciBmdW5jdGlvbiBJbXBvcnRSb3cKK2U2NmE5MjI1IE1lcmdlICJNSVBTOiBkc3ByMjogYWRkZWQgb3B0aW1pemF0aW9uIGZvciBmdW5jdGlvbiBFeHBvcnRSb3dDIgorYzI3OWZlYzEgTUlQUzogZHNwcjI6IGFkZGVkIG9wdGltaXphdGlvbiBmb3IgZnVuY3Rpb24gRXhwb3J0Um93QworMzFhOWNmNjQgU3BlZWR1cCBXZWJQIGxvc3NsZXNzIGNvbXByZXNzaW9uIGZvciBsb3cgZWZmb3J0IChtPTApIG1vZGUgd2l0aCBmb2xsb3dpbmc6IC0gRGlzYWJsZSBDcm9zcy1Db2xvciB0cmFuc2Zvcm0uIC0gRXZhbHVhdGUgcHJlZGljdG9ycyAjMTEgKHBhZXRoKSwgIzEyIGFuZCAjMTMgb25seS4KKzkyNzVkOTFjIE1JUFM6IGRzcHIyOiBhZGRlZCBvcHRpbWl6YXRpb24gZm9yIGZ1bmN0aW9uIFRydWVNb3Rpb24KKzI2MTA2ZDY2IE1lcmdlICJlbmNfbmVvbjogZml4IGJ1aWxkaW5nIHdpdGggbm9uLVhjb2RlIGNsYW5nIChpT1MpIgorMWM0ZTNlZmUgdW5yb2xsIHRoZSBrQmFuZHNbXSBpbmRpcmVjdGlvbiB0byByZW1vdmUgYSBkZXJlZmVyZW5jZSBpbiBHZXRDb2VmZnMoKQorYTM5NDZiODkgZW5jX25lb246IGZpeCBidWlsZGluZyB3aXRoIG5vbi1YY29kZSBjbGFuZyAoaU9TKQorOGVkOWMwMGQgTWVyZ2UgInNpbXBsaWZ5IHRoZSBIaXN0b2dyYW0gc3RydWN0LCB0byBvbmx5IHN0b3JlIG1heF92YWx1ZSBhbmQgbGFzdF9ueiIKK2JhZDc3NTcxIHNpbXBsaWZ5IHRoZSBIaXN0b2dyYW0gc3RydWN0LCB0byBvbmx5IHN0b3JlIG1heF92YWx1ZSBhbmQgbGFzdF9uegorM2NjYTBkYzcgTUlQUzogZHNwcjI6IEFkZGVkIG9wdGltaXphdGlvbiBmb3IgRENNb2RlIGZ1bmN0aW9uCiszN2UzOTVmZCBNSVBTOiBmaXggZnVuY3Rpb25zIHRvIHVzZSBnZW5lcmljIEJQUyBpc3RlYWQgb2YgaGFyZGNvZGVkIHZhbHVlCis5NDc1YmVmNCBQaWNrQmVzdFVWOiBmaXggVlA4Q29weTE2eDggaW52b2NhdGlvbgorNDQxZjI3M2YgTWVyZ2UgY2hhbmdlcyBJNTVmOGRhNTIsSWQ3M2ExZTk2Cis0YTI3OWE2OCBjb3NtZXRpY3M6IGFkZCBzb21lIG1pc3NpbmcgIT0gTlVMTCBjb21wYXJpc29ucworNjZhZDM3MjUgZmFjdG9yaXplIEJQUyBkZWZpbml0aW9uIGluIGRzcC5oIGFuZCBhZGQgVlA4Q29weTE2eDgKKzQzMmU1YjU1IG1ha2UgQUxJR05feHh4IG5hbWluZyBjb25zaXN0ZW50Cis1NzYwNjA0NyBlbmNvZGVyOiBzd2l0Y2ggQlBTIHRvIDMyIGluc3RlYWQgb2YgMTYKKzFiNjZiYmU5IE1JUFM6IGRzcHIyOiBhZGRlZCBvcHRpbWl6YXRpb24gZm9yIGZ1bmN0aW9uIFRyYW5zZm9ybUNvbG9yX0MKK2M2ZDBmOWU3IGhpc3RvZ3JhbTogY29zbWV0aWNzCitmMzk5ZDMwNyBNZXJnZSBjaGFuZ2VzIEk2ZWFjMTdlNSxJMzJkMmI1MTQKKzlkZTkwNzRjIGRlY19uZW9uOiBhZGQgVE04dXYKKzhlNTE3ZWNhIGJpdF9yZWFkZXIva1ZQOE5ld1JhbmdlOiByYW5nZV90IC0+IHVpbnQ4X3QKK2UxODU3MTM5IGRzcDogaW5pdGlhbGl6ZSBWUDhQcmVkQ2hyb21hOCBpbiBWUDhEc3BJbml0KCkKK2UwYzgwOWFkIE1vdmUgRW50cm9weSBtZXRob2RzIHRvIGxvc3NsZXNzLmMKK2E5NmNjZjhmIGlvc2J1aWxkOiBhZGQgeDY0XzY0IHNpbXVsYXRvciBzdXBwb3J0CithMGRmNTUxMCBSZW1vdmUgaGFuZGxpbmcgZm9yIFdFQlBfSElOVF9HUkFQSAorNDEzZGZjMGMgTW92ZSBzdGF0aWMgbWV0aG9kIGRlZmluaXRpb24gYmVmb3JlIGl0cyB1c2FnZS4KKzBmMjM1NjY1IFVwZGF0ZSBCYWNrd2FyZFJlZnNXaXRoTG9jYWxDYWNoZS4KK2Q2OWUzNmVjIFJlbW92ZSBUT0RPcyBmcm9tIGxvc3NsZXNzIGVuY29kZXIgY29kZS4KK2ZkYWFjOGUwIE9wdG1pemUgVlA4TEdldEJhY2t3YXJkUmVmZXJlbmNlcyBMWjc3IHJlZmVyZW5jZXMuCisyZjBlMmJhOCBNSVBTOiBkc3ByMjogYWRkZWQgb3B0aW1pemF0aW9uIGZvciBmdW5jdGlvbiBTZWxlY3QKK2EzZTc5YTQ2IE1lcmdlICJXZWJQRW5jb2RlOiBTdXBwb3J0IGVuY29kaW5nIHNhbWUgcGljIHR3aWNlIChldmVuIGlmIG1vZGlmaWVkKSIKK2U0ZjRkZGRiIFdlYlBFbmNvZGU6IFN1cHBvcnQgZW5jb2Rpbmcgc2FtZSBwaWMgdHdpY2UgKGV2ZW4gaWYgbW9kaWZpZWQpCitjYmMzZmJiNCBNZXJnZSAiVXBkYXRlZCBWUDhMR2V0QmFja3dhcmRSZWZlcmVuY2VzIGFuZCBjb2xvciBjYWNoZS4iCis5NWE5YmQ4NSBVcGRhdGVkIFZQOExHZXRCYWNrd2FyZFJlZmVyZW5jZXMgYW5kIGNvbG9yIGNhY2hlLgorNTRmMmMxNGMgTUlQUzogZHNwcjI6IGFkZGVkIG9wdGltaXphdGlvbiBmb3IgZnVuY3Rpb24gRlRyYW5zZm9ybQorYWE0MmY0MjMgTUlQUzogZHNwcjI6IEFkZGVkIG9wdGltaXphdGlvbiBmb3IgZnVuY3Rpb24gVlA4TFN1YnRyYWN0R3JlZW5Gcm9tQmx1ZUFuZFJlZAorMTFhMjVmNzUgTWVyZ2UgIkZsYXR0ZW5TaW1pbGFyQmxvY2tzIHNob3VsZCBvbmx5IGJlIHRyaWVkIHdoZW4gYmxlbmRpbmcgaXMgcG9zc2libGUuIgorNWNjY2RhZGYgRmxhdHRlblNpbWlsYXJCbG9ja3Mgc2hvdWxkIG9ubHkgYmUgdHJpZWQgd2hlbiBibGVuZGluZyBpcyBwb3NzaWJsZS4KKzk1Y2E0NGE3IE1JUFM6IGRzcHIyOiBhZGRlZCBvcHRpbWl6YXRpb24gZm9yIERpc3RvNHg0Cis0MTcxYjY3MiBiYWNrd2FyZF9yZWZlcmVuY2VzLmM6IHJlaW5kZW50IGFmdGVyIGM4NTgxYjAKK2M4NTgxYjA2IE9wdGltaXplIEJhY2t3YXJkUmVmZXJlbmNlcyBmb3IgUkxFIGVuY29kaW5nLgorNTc5OGVlZTYgTUlQUzogZHNwcjI6IHVuZmlsdGVycyBidWdmaXggKEllN2I3Mzg3NDc4YTZiNWMzZjA4NjkxNjI4YWUwMGYwNTljZjZkODk5KQorNDE2N2EzZjUgT3B0aW1pemUgYmFja3dhcmRyZWZlcmVuY2VzCitkMTg1NTRjMyBNZXJnZSAid2VicC90eXBlcy5oOiB1c2UgaW5saW5lIGZvciBjbGFuZysrLy1zdGQ9YysrMTEiCis3NDg5YjBlNyBnaWYyd2VicDogQWRkICctbWluLXNpemUnIG9wdGlvbiB0byBnZXQgYmVzdCBjb21wcmVzc2lvbi4KKzc3YmRkZGYwIFNwZWVkIHVwIEJhY2t3YXJkUmVmZXJlbmNlcworNjYzODcxMGIgd2VicC90eXBlcy5oOiB1c2UgaW5saW5lIGZvciBjbGFuZysrLy1zdGQ9YysrMTEKK2FiZjA0MjA1IEVuYWJsZSBlbnRyb3B5IGJhc2VkIG1lcmdlIGhpc3RvIGZvciAocTwxMDApCis1NzIwMjJhMyBmaWx0ZXJzX21pcHNfZHNwX3IyLmM6IGRpc2FibGUgdW5maWx0ZXJzCithMjhlMjFiMSBNSVBTOiBkc3ByMjogQWRkZWQgb3B0aW1pemF0aW9uIGZvciBmdW5jdGlvbiBDbGFtcGVkQWRkU3VidHJhY3RGdWxsCisxOGQ1YTFlZiBNSVBTOiBkc3ByMjogYWRkZWQgb3B0aW1pemF0aW9uIGZvciBmdW5jdGlvbiBDbGFtcGVkQWRkU3VidHJhY3RIYWxmCis4MjlhOGMxOSBNSVBTOiBkc3ByMjogYWRkZWQgb3B0aW1pemF0aW9uIGZvciBJVHJhbnNmb3JtCitjOTRlZDQ5ZSBnaWYyd2VicDogVXNlIHRoZSBkZWZhdWx0IGhpbnQgaW5zdGVhZCBvZiBXRUJQX0hJTlRfR1JBUEguCis2NTNhY2U1NSBJbmNyZWFzZSB0aGUgTUFYX0NPTE9SX0NBQ0hFX0JJVFMgZnJvbSA5IHRvIDEwLgorOTE5MjIwYzcgQ2hhbmdlIHRoZSBsb2dpYyBhZGp1c3RpbmcgdGhlIEhpc3RvZ3JhbSBiaXRzLgorNTNiMDk2YzAgTWVyZ2UgIkZpeCBidWcgaW4gVlA4TENhbGN1bGF0ZUVzdGltYXRlRm9yQ2FjaGVTaXplLiIKK2U5MTJiZDU1IEZpeCBidWcgaW4gVlA4TENhbGN1bGF0ZUVzdGltYXRlRm9yQ2FjaGVTaXplLgorNTQxZDc4MzkgTWVyZ2UgImRlY19uZW9uOiBhZGQgUkQ0IGludHJhIHByZWRpY3RvciIKK2Y4Y2QwNjcyIE1lcmdlICJNYWtlZmlsZS52YzogYWRkIGEgJ2xlZ2FjeScgUlRMSUJDRkcgb3B0aW9uIgorMjI4ODFjOTkgZGVjX25lb246IGFkZCBSRDQgaW50cmEgcHJlZGljdG9yCis2MTNkMjgxZSB1cGRhdGUgTkVXUworMTMwNGViMzQgTWVyZ2UgImRlY19uZW9uOiBEQzQ6IHVzZSBwYWlyLXdpc2UgYWRkcyBmb3IgdG9wIHJvdyIKKzM0YzIwYzA2IE1ha2VmaWxlLnZjOiBhZGQgYSAnbGVnYWN5JyBSVExJQkNGRyBvcHRpb24KKzcwODMwMDZiIE1lcmdlICJkc3AvZGVjX3tuZW9uLHNzZTJ9OiBWRTQ6IG5vcm1hbGl6ZSB2YXJpYWJsZSBuYW1lcyIKKzBkYjkwMzFjIGRzcC9kZWNfe25lb24sc3NlMn06IFZFNDogbm9ybWFsaXplIHZhcmlhYmxlIG5hbWVzCitiNWJjMTUzMCBkZWNfbmVvbjogREM0OiB1c2UgcGFpci13aXNlIGFkZHMgZm9yIHRvcCByb3cKKzViOTBkOGZlIFVuaWZ5IHRoZSBBUEkgYmV0d2VlbiBWUDhCaXRXcml0ZXIgYW5kIFZQOExCaXRXcml0ZXIKK2Y3YWRhNTYwIE1lcmdlIGNoYW5nZXMgSTJlMDY5MDdiLElhOWVkNGNhNixJNzgyMjgyZmYKKzViZWI2YmYwIE1lcmdlICJkZWNfbmVvbjogYWRkIFZFNCBpbnRyYSBwcmVkaWN0b3IiCitlYmE2Y2UwNiBkZWNfbmVvbjogYWRkIERDNCBpbnRyYSBwcmVkaWN0b3IKKzc5YWJmYmQ5IGRlY19uZW9uOiBhZGQgVE00IGludHJhIHByZWRpY3RvcgorZmUzOTVmMGUgZGVjX25lb246IGFkZCBMRDQgaW50cmEgcHJlZGljdG9yCiszMmRlMzg1ZSBkZWNfbmVvbjogYWRkIFZFNCBpbnRyYSBwcmVkaWN0b3IKKzcyMzk1YmE5IE1lcmdlICJNb2RpZnkgQ29zdE1vZGVsIHRvIGFsbG9jYXRlIG9wdGltYWwgbWVtb3J5LiIKKzY1ZTVlYjhhIGdpZjJ3ZWJwOiBTdXBwb3J0IEdJRl9ESVNQT1NFX1JFU1RPUkVfUFJFVklPVVMKK2U0YzgyOWVmIGdpZjJ3ZWJwOiBIYW5kbGUgZnJhbWVzIHdpdGggb2RkIG9mZnNldHMgKyBkaXNwb3NhbCB0byBiYWNrZ3JvdW5kLgorYzJiNWEwMzkgTW9kaWZ5IENvc3RNb2RlbCB0byBhbGxvY2F0ZSBvcHRpbWFsIG1lbW9yeS4KK2I3YTMzZDdlIGltcGxlbWVudCBWRTQvSEU0L1JENC8uLi4gaW4gU1NFMgorOTdjNzZmMWYgbWFrZSBWUDhQcmVkTHVtYTRbXSBub24tY29uc3QgYW5kIGluaXRpYWxpemUgYXJyYXkgaW4gVlA4RHNwSW5pdCgpCiswZWE4YzZjMiBNZXJnZSAiUHJpbnRSZWc6IG91dHB1dCB0byBzdGRlcnIiCitkN2ZmMmY5NyBNZXJnZSAic3RvcHdhdGNoLmg6IGZpeCBpbmNsdWRlcyIKK2Y4NWVjNzEyIFByaW50UmVnOiBvdXRwdXQgdG8gc3RkZXJyCis1NGVkYmY2NSBzdG9wd2F0Y2guaDogZml4IGluY2x1ZGVzCisxMzkxNDJlNCBPcHRpbWl6ZSBCYWNrd2FyZFJlZmVyZW5jZUhhc2hDaGFpbkZvbGxvd1BhdGguCis1ZjM2YjY4ZCBlbmMvYmFja3dhcmRfcmVmZXJlbmNlcy5jOiBmaXggaW5kZW50CitlMGU5OTYwZCBNZXJnZSAic3luYyB2ZXJzaW9uIG51bWJlcnMgdG8gMC40LjIgcmVsZWFzZSIKKzY0YWM1MTQ0IHN5bmMgdmVyc2lvbiBudW1iZXJzIHRvIDAuNC4yIHJlbGVhc2UKK2MyNGY4OTU0IFNpbXBsaWZ5IGFuZCBzcGVlZHVwIEJhY2t3YXJkIHJlZnMgY29tcHV0YXRpb24uCitkMWMzNTllZiBmaXggc2hhcmVkIG9iamVjdCBidWlsZCB3aXRoIC1mdmlzaWJpbGl0eT1oaWRkZW4KK2E0YzNhMzFiIFdFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT046IGZpeCBnY2MgY29tcGF0IHdhcm5pbmcKK2YzNThlZWI4IGFkZCBjb2RlIGZvciB0ZXN0aW5nIHJhbmRvbSBpbmNyZW1lbnRhbCBkZWNvZGluZyBpbiBkd2VicAorODAyNDcyOTEgbWFyayBzb21lIGluaXQgZnVuY3Rpb24gYXMgYmVpbmcgc2FmZSBmb3IgdGhyZWFkX3Nhbml0aXplci4KKzc5YjViZGJmIGJpdF9yZWFkZXIuaDogY29zbWV0aWNzOiBmaXggYSB0eXBvCis2YzY3MzY4MSBJbXByb3ZlZCBuZWFyLWxvc3NsZXNzIG1vZGUuCiswY2UyN2U3MSBlbmNfbWlwczMyOiB3b3JrYXJvdW5kIGdjYy00LjkgYnVnCithY2ExYjk4ZiBlbmMvdnA4bC5jOiBmaXggaW5kZW50CitjYTAwNTAyNyBFdmFsdWF0ZSBub24tcGFsZXR0ZSBjb21wcmVzc2lvbiBmb3IgcGFsZXR0ZSBpbWFnZQorYzhhODdiYjYgQXNzaWduU2VnbWVudHM6IHF1aWV0IC1XYXJyYXktYm91bmRzIHdhcm5pbmcKKzMyZjY3ZTMwIE1lcmdlICJlbmNfbmVvbjogaW5pdGlhbGl6ZSB2ZWN0b3JzIHcvdmR1cF9uX3UzMiIKK2ZhYmM2NWRhIDEtMyUgZmFzdGVyIGVuY29kaW5nIG9wdGltaXppbmcgU1NFX054TiBmdW5jdGlvbnMKKzc1MzRkNzE2IGVuY19uZW9uOiBpbml0aWFsaXplIHZlY3RvcnMgdy92ZHVwX25fdTMyCis1ZjgxMzkxMiBNZXJnZSAiRml4IHJldHVybiBjb2RlIG9mIEVuY29kZUltYWdlSW50ZXJuYWwoKSIKK2UzMjFhYmU0IEZpeCByZXR1cm4gY29kZSBvZiBFbmNvZGVJbWFnZUludGVybmFsKCkKK2Y4MmNiMDZhIG9wdGltaXplIHBhbGV0dGUgb3JkZXJpbmcKK2Y1NDVmZWVlIGRvbid0IHNldCB0aGUgYWxwaGEgdmFsdWUgZm9yIGhpc3RvZ3JhbSBpbmRleCBpbWFnZQorMmQ5YjBhNDQgYWRkIFdlYlBEaXNwYXRjaEFscGhhVG9HcmVlbigpIHRvIGRzcAorMWJkNGMyYWQgTWVyZ2UgIkNoYW5nZSBFbnRyb3B5IGJhc2VkIEhpc3RvZ3JhbSBDb21iaW5lIGhldXJpc3RpYy4iCitlMjk1YjhmMSBNZXJnZSAiaW9zYnVpbGQ6IGNsZWFudXAiCisxYmU0ZTc2MCBNZXJnZSAiaW9zYnVpbGQ6IG91dHB1dCBhdXRvY29uZiByZXEuIG9uIGZhaWx1cmUiCitkNWU0OThkNCBDaGFuZ2UgRW50cm9weSBiYXNlZCBIaXN0b2dyYW0gQ29tYmluZSBoZXVyaXN0aWMuCis0N2EyZDhlMSBmaXggTVNWQyBmbG9hdC0+aW50IGNvbnZlcnNpb24gd2FybmluZworMDQxOTU2ZjYgaW9zYnVpbGQ6IGNsZWFudXAKKzc2N2ViNDAyIGlvc2J1aWxkOiBvdXRwdXQgYXV0b2NvbmYgcmVxLiBvbiBmYWlsdXJlCiszNWFkNDhiOCBIaXN0b0hlYXBJbml0OiBjb3JyZWN0IHBvc2l0aW9ucyBhbGxvY2F0aW9uIHNpemUKKzQ1ZDk2MzVmIGxvc3NsZXNzOiBlbnRyb3B5IGNsdXN0ZXJpbmcgZm9yIGhpZ2ggcXVhbGl0aWVzLgorZGMzN2RmOGMgZml4IHR5cGUgd2FybmluZyBmb3IgVlM5X3g2NAorOWY3ZDllNmQgaW9zYnVpbGQ6IG1ha2UgaU9TIDYgdGhlIG1pbmltdW0gcmVxdWlyZW1lbnQKK2ZkZDY1MjhiIFJlbW92ZSB1bnVzZWQgVlA4TERlY29kZXIgbWVtYmVyIHZhcmlhYmxlCitlYTNiYmE1YSBNZXJnZSAicmV3cml0ZSBEaXN0bzR4NCBpbiBlbmNfbmVvbi5jIHdpdGggaW50cmluc2ljIgorZjA2MGRmYzQgYWRkIGxvc3NsZXNzIGluY3JlbWVudGFsIGRlY29kaW5nIHN1cHBvcnQKK2FiNzA3OTRkIHJld3JpdGUgRGlzdG80eDQgaW4gZW5jX25lb24uYyB3aXRoIGludHJpbnNpYworZDQ0NzE2MzcgTUlQUzogZHNwcjI6IGFkZGVkIG9wdGltaXphdGlvbiBmb3IgZnVuY3Rpb24gRmlsdGVyTG9vcDI0CisyYWVmNTRkNCBNZXJnZSAicHJlcGFyZSBWUDhMRGVjb2RlSW1hZ2UgZm9yIGluY3JlbWVudGFsIGRlY29kZSIKK2FlZDBmNWEyIE1lcmdlICJNSVBTOiBkc3ByMjogYWRkZWQgb3B0aW1pemF0aW9uIGZvciBmdW5jdGlvbiBGaWx0ZXJMb29wMjYiCisyODYzMDY4NSBwcmVwYXJlIFZQOExEZWNvZGVJbWFnZSBmb3IgaW5jcmVtZW50YWwgZGVjb2RlCisyNDhmM2FlZCByZW1vdmUgYnItPmVycm9yXyBmaWVsZAorNDllMTUwNDQgTUlQUzogZHNwcjI6IGFkZGVkIG9wdGltaXphdGlvbiBmb3IgZnVuY3Rpb24gRmlsdGVyTG9vcDI2CiszODEyOGNiOSBpb2J1aWxkLnNoOiBvbmx5IGluc3RhbGwgLmggZmlsZXMgaW4gSGVhZGVycworYzc5MmQ0MTIgUHJlbXVsdGlwbHkgd2l0aCBhbHBoYSBkdXJpbmcgVS9WIGRvd25zYW1wbGluZworMGNjODExZDcgZ2lmMndlYnA6IEJhY2tncm91bmQgY29sb3IgY29ycmVjdGlvbgorZDcxNjdmZjcgQW1lbmQgdGhlIGxvc3NsZXNzIHNwZWMgYWNjb3JkaW5nIHRvIGlzc3VlICMyMDUsICMyMDYgYW5kICMyMjQKK2I5MDE0MTZiIFJlY29yZCB0aGUgbG9zc2xlc3Mgc2l6ZSBzdGF0cy4KK2NkZGQzMzQwIEFkZCBhIFdlYlBFeHRyYWN0QWxwaGEgZnVuY3Rpb24gdG8gZHNwCiswNzE2YTk4ZSBmaXggaW5kZW50IGFmdGVyIEkwMjA0OTQ5OTE3ODM2Zjc0YzBlYjRiYTVhN2Y0MDUyYTQ3OTc4MzNiCitmOWNlZDk1YSBPcHRpbWl6ZSBsb3NzbGVzcyBkZWNvZGluZyBmb3IgdHJpdmlhbChBUkIpIGNvZGVzLgorOTI0ZmNmZDkgTWVyZ2UgIndlYnBtdXg6IHNpbXBsaWZ5IEluaXRpYWxpemVDb25maWcoKSIKK2MwYTQ2MmNhIHdlYnBtdXg6IHNpbXBsaWZ5IEluaXRpYWxpemVDb25maWcoKQorNjk4NmJiNWUgd2VicG11eDogZml4IGluZGVudAorZjg5ZTE2OTAgd2VicG11eDogZml4IGV4aXQgc3RhdHVzIG9uIG51bWVyaWMgdmFsdWUgcGFyc2UgZXJyb3IKKzIxNzJjYjYyIE1lcmdlICJ3ZWJwbXV4OiBmaXggbG9vcF9jb3VudCByYW5nZSBjaGVjayIKK2UzYjM0M2VjIE1lcmdlICJleGFtcGxlczogd2FybiBvbiBpbnZhbGlkIG51bWVyaWMgcGFyYW1ldGVycyIKKzBlMjNjNDg3IHdlYnBtdXg6IGZpeCBsb29wX2NvdW50IHJhbmdlIGNoZWNrCis2MjA4MzM4YSBNZXJnZSAiZml4IGxvb3AgYnVnIGluIERpc3BhdGNoQWxwaGEoKSIKK2Q1MWYzZTQwIGdpZjJ3ZWJwOiBIYW5kbGUgZnJhbWVzIHdpdGggbWlzc2luZyAgZ3JhcGhpYyBjb250cm9sIGV4dGVuc2lvbgorNjkwYjQ5MWEgZml4IGxvb3AgYnVnIGluIERpc3BhdGNoQWxwaGEoKQorOTZkNDNhODcgZXhhbXBsZXM6IHdhcm4gb24gaW52YWxpZCBudW1lcmljIHBhcmFtZXRlcnMKKzMxMDFmNTM3IE1JUFM6IGRzcHIyOiBhZGRlZCBvcHRpbWl6YXRpb24gZm9yIFRyYW5zZm9ybU9uZQorYTZiYjliMTcgU1NFMiBmb3IgaW52ZXJzZSBNdWx0KEFSR0IpUm93IGFuZCBBcHBseUFscGhhTXVsdGlwbHkKK2Q4NGE4ZmZkIFJlbW92ZSBkZWZhdWx0IGluaXRpYWxpemF0aW9uIG9mIGRlY29kZXIgc3RhdHVzLgorYmU3MGI4NmMgY29uZmlndXJlOiBzaW1wbGlmeSBsaWJwbmctY29uZmlnIGludm9jYXRpb24KK2UwYTk5MzIxIFJlY3RpZnkgYnVnIGluIGxvc3NsZXNzIGluY3JlbWVudGFsIGRlY29kaW5nLgorZTI1MDJhOTcgTUlQUzogZHNwcjI6IGFkZGVkIG9wdGltaXphdGlvbiBmb3IgVHJhbnNmb3JtQUMzCisyNGUxMDcyYSBNSVBTOiBkc3ByMjogYWRkZWQgb3B0aW1pemF0aW9uIGZvciBUcmFuc2Zvcm1EQworYzBlODRkZjggTWVyZ2UgIlNsaWdodGx5IGZhc3RlciBsb3NzbGVzcyBkZWNvZGluZyAoMSUpIgorOGRkMjhiYjUgU2xpZ2h0bHkgZmFzdGVyIGxvc3NsZXNzIGRlY29kaW5nICgxJSkKK2YwMTAzNTk1IE1JUFM6IGRzcHIyOiBhZGRlZCBvcHRpbWl6YXRpb24gZm9yIENvbG9ySW5kZXhJbnZlcnNlVHJhbnNmb3JtcworZDMyNDJhZWUgbWFrZSBWUDhMU2V0Qml0UG9zKCkgc2V0IGJyLT5lb3NfIGZsYWcKK2E5ZGVjYjU1IExvc3NsZXNzIGRlY29kaW5nOiBmaXggZW9zXyBmbGFnIGNvbmRpdGlvbgorM2ZlYTZhMjggZml4IGVycm9uZW91cyBkZWMtPnN0YXR1c18gc2V0dGluZworODBiODA5OWYgTUlQUzogZHNwcjI6IGFkZCBzb21lIHNwZWNpZmljIG1pcHMgY29kZSB0byBjb21taXQgSTJjM2YyYjEyZjhkZjE1Yjc4NWZhZDVhOWM1NjMxNmU5NTRhZTBjNTMKK2U1NjQwNjI1IE1lcmdlICJmdXJ0aGVyIHJlZmluZSB0aGUgQ09QWV9QQVRURVJOIG9wdGltIGZvciBEZWNvZGVBbHBoYSIKKzg1NDUwOWZlIGVuYy9oaXN0b2dyYW0uYzogcmVpbmRlbnQgYWZ0ZXIgZjQwNTlkMAorMzQ0MjE5NjQgTWVyZ2UgIn4zLTUlIGZhc3RlciBlbmNvZGluZyBvcHRpbWl6aW5nIFBpY2tCZXN0SW50cmEqKCkiCis4NjUwNjljMSBmdXJ0aGVyIHJlZmluZSB0aGUgQ09QWV9QQVRURVJOIG9wdGltIGZvciBEZWNvZGVBbHBoYQorYTU5NTYyMjggYWRkZWQgQy1sZXZlbCBvcHRpbWl6YXRpb24gZm9yIERlY29kZUFscGhhRGF0YSBmdW5jdGlvbgorMTg3ZDM3OWQgYWRkIGEgZmFsbGJhY2sgdG8gQUxQSEFfTk9fQ09NUFJFU1NJT04KK2E0OGEyZDc2IH4zLTUlIGZhc3RlciBlbmNvZGluZyBvcHRpbWl6aW5nIFBpY2tCZXN0SW50cmEqKCkKK2E2MTQwMTk0IEV4VXRpbFJlYWRGcm9tU3RkaW46ICh3aW5kb3dzKSBvcGVuIHN0ZGluIGluIGJpbiBtb2RlCitlODBlYWIxZiB3ZWJwbXV4OiAod2luZG93cykgb3BlbiBzdGRvdXQgaW4gYmluYXJ5IG1vZGUKK2U5YmZiMTE2IGN3ZWJwOiAod2luZG93cykgb3BlbiBzdGRvdXQgaW4gYmluYXJ5IG1vZGUKKzU5MjdlMTViIGV4YW1wbGVfdXRpbDogYWRkIEV4VXRpbFNldEJpbmFyeU1vZGUKKzMwZjNiNzViIHdlYnBtdXggbWFuIHBhZ2U6IENsYXJpZnkgc29tZSB0aXRsZSwgZGVzY3JpcHRpb25zIGFuZCBleGFtcGxlcworNzdkNGM3ZTMgYWRkcmVzcyBjb3NtZXRpYyBjb21tZW50cyBmcm9tIHBhdGNoICM3MTM4MAorZjc1ZGZiZjIgU3BlZWQgdXAgSHVmZm1hbiBkZWNvZGluZyBmb3IgbG9zc2xlc3MKKzYzN2IzODg4IGRzcC9sb3NzbGVzczogd29ya2Fyb3VuZCBnY2MtNC45IGJ1ZyBvbiBhcm0KKzgzMjNhOTAzIGRzcC5oOiBjb2xsZWN0IGdjYy9jbGFuZyB2ZXJzaW9uIHRlc3QgbWFjcm9zCitlNmM0YjUyZiBtb3ZlIHN0YXRpYyBpbml0aWFsaXphdGlvbiBvZiBXZWJQWVVWNDQ0Q29udmVydGVyc1tdIHRvIHRoZSBJbml0IGZ1bmN0aW9uLgorNDk5MTFkNGQgTWVyZ2UgImZpeCBpbmRlbnRhdGlvbiIKK2Y0MDU5ZDBjIENvZGUgY2xlYW51cCBmb3IgSGlzdG9ncmFtUmVtYXAuCitlNjMyYjA5MiBmaXggaW5kZW50YXRpb24KK2Y1YzA0ZDY0IE1lcmdlICJhZGQgYSBEaXNwYXRjaEFscGhhKCkgZm9yIFNTRTIgdGhhdCBoYW5kbGVzIDggcGl4ZWxzIGF0IGEgdGltZSIKK2ZjOThlZGQ5IGFkZCBhIERpc3BhdGNoQWxwaGEoKSBmb3IgU1NFMiB0aGF0IGhhbmRsZXMgOCBwaXhlbHMgYXQgYSB0aW1lCis3M2QzNjFkZCBpbnRyb2R1Y2UgVlA4RW5jUXVhbnRpemUyQmxvY2tzIHRvIHF1YW50aXplIHR3byBibG9ja3MgYXQgYSB0aW1lCiswYjIxYzMwYiBNSVBTOiBkc3ByMjogYWRkZWQgb3B0aW1pemF0aW9uIGZvciBFbWl0QWxwaGFSR0IKKzk1M2FjZDU2IGVuY19uZW9uOiBlbmFibGUgUXVhbnRpemVCbG9jayBmb3IgYWFyY2g2NAorZjRhZTE0MzcgTUlQUzogbWlwczMyOiBjb2RlIHJlYmFzZQorNTY5NzcxNTQgTUlQUzogZHNwcjI6IGFkZGVkIG9wdGltaXphdGlvbnMgZm9yIFZQOFl1dlRvKgorMjUyM2FhNzMgU21hcnRSR0JZVVY6IGZpeCBvZGQtd2lkdGggcHJvYmxlbSB3aXRoIHBpeGVsIHJlcGxpY2F0aW9uCitlZTUyZGM0ZSBmaXggc29tZSBNU1ZDNjQgd2FybmluZyBhYm91dCBmbG9hdCBjb252ZXJzaW9uCiszZmNhODUxYSBjcHU6IGNoZWNrIGZvciBfTVNDX1ZFUiBiZWZvcmUgdXNpbmcgbXN2YyBpbmxpbmUgYXNtCitlMmE4M2Q3MSBmYXN0ZXIgUkdCLT5ZVVYgY29udmVyc2lvbiBmdW5jdGlvbiAofjclIHNwZWVkdXApCitkZTJkMDNlMSBNZXJnZSAiQWRkIHNtYXJ0IFJHQi0+WVVWIGNvbnZlcnNpb24gb3B0aW9uIC1wcmUgNCIKKzNmYzRjNTM5IEFkZCBzbWFydCBSR0ItPllVViBjb252ZXJzaW9uIG9wdGlvbiAtcHJlIDQKK2I0ZGM0MDY5IE1JUFM6IGRzcHIyOiBhZGRlZCBvcHRpbWl6YXRpb24gZm9yICh1bilmaWx0ZXJzCisxMzdlNjA5MCBNZXJnZSAiY29uZmlndXJlOiBhZGQgd29yayBhcm91bmQgZm9yIGdjYy00LjkgYWFyY2g2NCBidWciCitiNjFjOWNlYyBNSVBTOiBkc3ByMjogT3B0aW1pemF0aW9uIG9mIHNvbWUgc2ltcGxlIHBvaW50LXNhbXBsaW5nIGZ1bmN0aW9ucworZTJiOGNlYzAgY29uZmlndXJlOiBhZGQgd29yayBhcm91bmQgZm9yIGdjYy00LjkgYWFyY2g2NCBidWcKKzk4YzU0MTA3IE1JUFM6IG1pcHMzMnIyOiBhZGRlZCBvcHRpbWl6YXRpb24gZm9yIEJTd2FwMzIKK2RhYjcwMmIzIFVwZGF0ZSBQQVRFTlRTIHRvIHJlZmxlY3Qgcy9WUDgvV2ViTS9nCitiNTY0ZjdjNyBNZXJnZSAiTUlQUzogZGV0ZWN0IG1pcHMzMnI2IGFuZCBkaXNhYmxlIG1pcHMzMnIxIGNvZGUiCitiN2U1YTVjNCBNSVBTOiBkZXRlY3QgbWlwczMycjYgYW5kIGRpc2FibGUgbWlwczMycjEgY29kZQorNjNjMmZjMDIgQ29ycmVjdGx5IHVzZSB0aGUgQUNfQ0FOT05JQ0FMXyogbWFjcm9zCitiYjA3MDIyYiBNZXJnZSAiY29zbWV0aWNzIgorZTMwMGM5ZDggY29zbWV0aWNzCiswZTUxOWVlYSBNZXJnZSAiY29zbWV0aWNzOiByZW1vdmUgc29tZSBleHRyYW5lb3VzICdleHRlcm4ncyIKKzNlZjBmMDhhIE1lcmdlICJ2cDhlbmNpLmg6IGNvc21ldGljczogZml4ICcqJyBwbGFjZW1lbnQiCis0YzZkZGUzNyBiaXRfd3JpdGVyOiBjb3NtZXRpY3M6IHJlbmFtZSBrRmx1c2goKSAtPiBGbHVzaCgpCitmN2I0YzQ4YiBjb3NtZXRpY3M6IHJlbW92ZSBzb21lIGV4dHJhbmVvdXMgJ2V4dGVybidzCitiNDdmYjAwYSB2cDhlbmNpLmg6IGNvc21ldGljczogZml4ICcqJyBwbGFjZW1lbnQKK2I1YTM2Y2M5IGFkZCAtbmVhcl9sb3NzbGVzcyBbMC4uMTAwXSBleHBlcmltZW50YWwgb3B0aW9uCiswNTI0ZDllNSBkc3A6IGRldGVjdCBtaXBzNjQgJiBkaXNhYmxlIG1pcHMzMiBjb2RlCitkMzQ4NWQ5NiBjd2VicC4xOiBmaXggcXVhbGl0eSBkZXNjcmlwdGlvbiBwbGFjZW1lbnQKKzI5YTlmZTIyIE1lcmdlIHRhZyAndjAuNC4xJworOGFmMjc3MTggdXBkYXRlIENoYW5nZUxvZyAodGFnOiB2MC40LjEsIG9yaWdpbi8wLjQuMSwgMC40LjEpCitlMDllOWZmNiBSZWNvcmQgJiBsb2cgdGhlIGltYWdlIHByZS1wcm9jZXNzaW5nIHRpbWUuCitmNTljMGI0YiBpb3NidWlsZC5zaDogc3BlY2lmeSBvcHRpbWl6YXRpb24gZmxhZ3MKKzhkMzRlYTNlIHVwZGF0ZSBDaGFuZ2VMb2cgKHRhZzogdjAuNC4xLXJjMSkKK2RiYzNkYTY2IG1ha2VmaWxlLnVuaXg6IGFkZCB2d2VicC4xIHRvIHRoZSBkaXN0IHRhcmdldAorODlhN2M4M2MgdXBkYXRlIENoYW5nZUxvZworZmZlNjdlZTkgTWVyZ2UgInVwZGF0ZSBORVdTIGZvciB0aGUgbmV4dCByZWxlYXNlIiBpbnRvIDAuNC4xCisyZGVmMWZlNiBnaWYyd2VicDogZHVzdCB1cCB0aGUgaGVscCBtZXNzYWdlCitmYjY2OGQ3OCByZW1vdmUgLW5vYWxwaGFkaXRoZXIgb3B0aW9uIGZyb20gUkVBRE1FL3Z3ZWJwLjEKK2U0OWY2OTNiIHVwZGF0ZSBORVdTIGZvciB0aGUgbmV4dCByZWxlYXNlCitjZDAxMzU4MCBNZXJnZSAidXBkYXRlIEFVVEhPUlMiIGludG8gMC40LjEKKzI2OGQwMWViIHVwZGF0ZSBBVVRIT1JTCis4NTIxM2I5YiBidW1wIHZlcnNpb24gdG8gMC40LjEKKzY5NWY4MGFlIE1lcmdlICJyZXN0b3JlIG11eCBBUEkgY29tcGF0aWJpbGl0eSIgaW50byAwLjQuMQorODYyZDI5NmMgcmVzdG9yZSBtdXggQVBJIGNvbXBhdGliaWxpdHkKKzhmNmY4YzVkIHJlbW92ZSB0aGUgIVdFQlBfUkVGRVJFTkNFX0lNUExFTUVOVEFUSU9OIHR3ZWFrIGluIFB1dDh4OHV2CitkNzEzYTY5NiBNZXJnZSBjaGFuZ2VzIElmNGRlYmMxNSxJNDM3YTVkNWYgaW50byAwLjQuMQorYzJmYzUyZTQgcmVzdG9yZSBlbmNvZGUgQVBJIGNvbXBhdGliaWxpdHkKKzc5MzM2OGU4IHJlc3RvcmUgZGVjb2RlIEFQSSBjb21wYXRpYmlsaXR5CitiODk4NGYzMSBnaWYyd2VicDogZml4IGNvbXBpbGUgd2l0aCBnaWZsaWIgNS4xLjAKKzIyMmY5YjFhIGdpZjJ3ZWJwOiBzaW1wbGlmeSBnaWZsaWIgdmVyc2lvbiBjaGVja2luZworZDJjYzYxYjcgRXh0ZW5kIE1ha2VBUkdCMzIoKSB0byBhY2NlcHQgQWxwaGEgY2hhbm5lbC4KKzQ1OTViNjJiIE1lcmdlICJ1c2UgZXhwbGljaXQgc2l6ZSBvZiBrRXJyb3JNZXNzYWdlc1tdIGFycmF5cyIKKzE1N2RlMDE1IE1lcmdlICJBY3R1YXRlIG1lbW9yeSBzdGF0cyBmb3IgUFJJTlRfTUVNT1JZX0lORk8iCitmYmRhMmY0OSBKUEVHIGRlY29kZXI6IGRlbGF5IGNvbnZlcnNpb24gdG8gWVVWIHRvIFdlYlBFbmNvZGUoKSBjYWxsCiswYjc0N2IxYiB1c2UgZXhwbGljaXQgc2l6ZSBvZiBrRXJyb3JNZXNzYWdlc1tdIGFycmF5cworMzM5OGQ4MWEgQWN0dWF0ZSBtZW1vcnkgc3RhdHMgZm9yIFBSSU5UX01FTU9SWV9JTkZPCis2ZjMyMDJiZSBNZXJnZSAibW92ZSBXZWJQUGljdHVyZUluaXQgdG8gcGljdHVyZS5jIgorNmMzNDdiYmIgbW92ZSBXZWJQUGljdHVyZUluaXQgdG8gcGljdHVyZS5jCitmYjNhY2YxOSBmaXggY29uZmlndXJlIG1lc3NhZ2UgZm9yIG11bHRpLXRocmVhZAorNDBiMDg2ZjcgY29uZmlndXJlOiBjaGVjayBmb3IgX2JlZ2ludGhyZWFkZXgKKzE1NDlkNjIwIHJlb3JkZXIgdGhlIFlVVkEtPkFSR0IgYW5kIEFSR0ItPllVVkEgZnVuY3Rpb25zIGNvcnJlY3RseQorYzY0NjFiZmQgTWVyZ2UgImV4dHJhY3QgY29sb3JzcGFjZSBjb2RlIGZyb20gcGljdHVyZS5jIGludG8gcGljdHVyZV9jc3AuYyIKKzczNmYyYTE3IGV4dHJhY3QgY29sb3JzcGFjZSBjb2RlIGZyb20gcGljdHVyZS5jIGludG8gcGljdHVyZV9jc3AuYworNjQ1ZGFhMDMgTWVyZ2UgImNvbmZpZ3VyZTogY2hlY2sgZm9yIC1XZm9ybWF0LXNlY3VyaXR5IgorYWJhZmVkODYgY29uZmlndXJlOiBjaGVjayBmb3IgLVdmb3JtYXQtc2VjdXJpdHkKK2ZiYWRiNDgwIHNwbGl0IG1vbm9saXRoaWMgcGljdHVyZS5jIGludG8gcGljdHVyZV97dG9vbHMscHNucixyZXNjYWxlfS5jCitjNzZmMDdlYyBkZWNfbmVvbi9UcmFuc2Zvcm1BQzM6IGluaXRpYWxpemUgdmVjdG9yIHcvdmNyZWF0ZQorYmI0ZmMwNTEgZ2lmMndlYnA6IEFsbG93IHNpbmdsZS1mcmFtZSBhbmltYXRpb25zCis0NmZkNDRjMSB0aHJlYWQ6IHJlbW92ZSBoYXJtbGVzcyByYWNlIG9uIHN0YXR1c18gaW4gRW5kKCkKKzVhMWE3MjY0IE1lcmdlICJjb25maWd1cmU6IGNoZWNrIGZvciBfX2J1aWx0aW5fYnN3YXBYWCgpIgorNjc4MTQyM2IgY29uZmlndXJlOiBjaGVjayBmb3IgX19idWlsdGluX2Jzd2FwWFgoKQorNjQ1MGM0OGQgY29uZmlndXJlOiBmaXggaU9TIGJ1aWxkcworNjQyMmU2ODMgVlA4TEZpbGxCaXRXaW5kb3c6IGVuYWJsZSBmYXN0IHBhdGggZm9yIDMyLWJpdCBidWlsZHMKKzRmN2Y1MmIyIFZQOExGaWxsQml0V2luZG93OiByZXNwZWN0IFdFQlBfRk9SQ0VfQUxJR05FRAorZTQ1OGJhZGMgZW5kaWFuX2lubC5oOiBpbXBsZW1lbnQgaHRvbGVYWCB3aXRoIEJTd2FwWFgKK2YyNjY0ZDFhIGVuZGlhbl9pbmwuaDogYWRkIEJTd2FwMTYKKzZmYmY1MzQ1IE1lcmdlICJjb25maWd1cmU6IGFkZCAtLWVuYWJsZS1hbGlnbmVkIgorZGMwZjQ3OWQgY29uZmlndXJlOiBhZGQgLS1lbmFibGUtYWxpZ25lZAorOWNjNjllMmIgTWVyZ2UgImNvbmZpZ3VyZTogc3VwcG9ydCBXSUMgKyBPcGVuR0wgdW5kZXIgbWluZ3c2NCIKKzI1N2FkZmIwIHJlbW92ZSBleHBlcmltZW50YWwgWVVWNDQ0IFlVVjQyMiBhbmQgWVVWNDAwIGNvZGUKKzEwZjQyNTdjIGNvbmZpZ3VyZTogc3VwcG9ydCBXSUMgKyBPcGVuR0wgdW5kZXIgbWluZ3c2NAorMzgwY2NhNGYgY29uZmlndXJlLmFjOiBhZGQgQUNfQ19CSUdFTkRJQU4KK2VlNzBhOTAxIGVuZGlhbl9pbmwuaDogYWRkIEJTd2FwNjQKKzQ3Nzc5ZDQ2IGVuZGlhbl9pbmwuaDogYWRkIEJTd2FwMzIKK2Q1MTA0YjFmIHV0aWxzOiBhZGQgZW5kaWFuX2lubC5oCis1OGFiNjIyNCBNZXJnZSAibWFrZSBhbHBoYS1kZXRlY3Rpb24gbG9vcCBpbiBJc0tleUZyYW1lKCkgaW4gZ29vZCB4L3kgb3JkZXIiCis5ZDU2MjkwMiBtYWtlIGFscGhhLWRldGVjdGlvbiBsb29wIGluIElzS2V5RnJhbWUoKSBpbiBnb29kIHgveSBvcmRlcgorNTE2OTcxYjEgbG9zc2xlc3M6IFJlbW92ZSB1bmFsaWduZWQgcmVhZCB3YXJuaW5nCitiOGI1OTZmNiBNZXJnZSAiY29uZmlndXJlLmFjOiBhZGQgYW4gYXV0b2NvbmYgdmVyc2lvbiBwcmVyZXF1aXNpdGUiCiszNGIwMmY4YyBjb25maWd1cmUuYWM6IGFkZCBhbiBhdXRvY29uZiB2ZXJzaW9uIHByZXJlcXVpc2l0ZQorZTU5ZjUzNjAgbmVvbjogbm9ybWFsaXplIHZkdXBfbl8qIHVzYWdlCis2ZWU3MTYwZCBNZXJnZSBjaGFuZ2VzIEkwZGE3YjNkMyxJZGFkMmYyNzgsSTRhY2NjMzA1CithYmMwMmYyNCBNZXJnZSAiZml4ICh1bmNvbXBpbGVkKSB0eXBvIgorYmMwMzY3MGYgbmVvbjogYWRkIElOSVRfVkVDVE9SNAorNmMxYzYzMmIgbmVvbjogYWRkIElOSVRfVkVDVE9SMworZGM3Njg3ZTUgbmVvbjogYWRkIElOSVRfVkVDVE9SMgorNDUzNmU3YzQgYWRkIFdlYlBNdXhTZXRDYW52YXNTaXplKCkgdG8gdGhlIG11eCBBUEkKKzgyNGVhYjEwIGZpeCAodW5jb21waWxlZCkgdHlwbworMWYzZTVmMWUgcmVtb3ZlIHVudXNlZCAnc2hpZnQnIGFyZ3VtZW50IGFuZCBRRklYMiBkZWZpbmUKKzhlODY3MDUxIE1lcmdlICJWUDhMb2FkTmV3Qnl0ZXM6IHVzZSBfX2J1aWx0aW5fYnN3YXAzMiBpZiBhdmFpbGFibGUiCisxYjZhMjYzNSBNZXJnZSAiRml4IGhhbmRsaW5nIG9mIHdlaXJkIEdJRiB3aXRoIGNhbnZhcyBkaW1lbnNpb24gMHgwIgorMWRhM2Q0NjEgVlA4TG9hZE5ld0J5dGVzOiB1c2UgX19idWlsdGluX2Jzd2FwMzIgaWYgYXZhaWxhYmxlCisxNTgyZTQwMiBGaXggaGFuZGxpbmcgb2Ygd2VpcmQgR0lGIHdpdGggY2FudmFzIGRpbWVuc2lvbiAweDAKK2I4ODExZGFjIE1lcmdlICJyZW5hbWUgaW50ZXJmYWNlIC0+IHdpbnRlcmZhY2UiCitkYjhiOGI1ZiBGaXggbG9naWMgaW4gdGhlIEdJRiBMT09QLWRldGVjdGlvbiBwYXJzaW5nCisyNWFhZGRjOCByZW5hbWUgaW50ZXJmYWNlIC0+IHdpbnRlcmZhY2UKKzU1ODRkOWQyIG1ha2UgV2ViUFNldFdvcmtlckludGVyZmFjZSgpIGNoZWNrIGl0cyBhcmd1bWVudHMKK2E5ZWY3ZWY5IE1lcmdlICJjb3NtZXRpY3M6IHVwZGF0ZSB0aHJlYWQuaCBjb21tZW50cyIKK2M2YWY5OTkxIE1lcmdlICJkdXN0IHVwIHRoZSBoZWxwIG1lc3NhZ2UiCiswYThiODg2MyBkdXN0IHVwIHRoZSBoZWxwIG1lc3NhZ2UKK2E5Y2YzMTkxIGNvc21ldGljczogdXBkYXRlIHRocmVhZC5oIGNvbW1lbnRzCisyN2JmZWVlNCBRdWFudGl6ZUJsb2NrIFNTRTIgT3B0aW1pemF0aW9uOgorMmJjMGRjM2UgTWVyZ2UgIndlYnBtdXg6IHdhcm4gd2hlbiBvZGQgZnJhbWUgb2Zmc2V0cyBhcmUgdXNlZCIKKzMxMTRlYmU0IE1lcmdlIGNoYW5nZXMgSWQ4ZWRkM2MxLElkNDE4ZWI5NixJZGUwNWUzYmUKK2MwNzI2NjM0IHdlYnBtdXg6IHdhcm4gd2hlbiBvZGQgZnJhbWUgb2Zmc2V0cyBhcmUgdXNlZAorYzVjNmI0MDggTWVyZ2UgImFkZCBhbHBoYSBkaXRoZXJpbmcgZm9yIGxvc3N5IgorZDUxNDY3ODQgZXhhbXBsZXMvQW5kcm9pZC5tazogYWRkIGN3ZWJwCitjYTBmYTdjNyBBbmRyb2lkLm1rOiBtb3ZlIGR3ZWJwIHRvIGV4YW1wbGVzL0FuZHJvaWQubWsKKzczZDhmY2EwIEFuZHJvaWQubWs6IGFkZCBFTkFCTEVfU0hBUkVEIGZsYWcKKzZlOTMzMTdmIG11eHJlYWQ6IGZpeCBvdXQgb2YgYm91bmRzIHJlYWQKKzhiMGY2YTQ4IE1ha2VmaWxlLnZjOiBmaXggQ0ZMQUdTIGFzc2lnbm1lbnQgdy9IQVZFX0FWWDI9MQorYmJlMzJkZjEgYWRkIGFscGhhIGRpdGhlcmluZyBmb3IgbG9zc3kKKzc5MDIwNzY3IE1lcmdlICJtYWtlIGVycm9yLWNvZGUgcmVwb3J0aW5nIGNvbnNpc3RlbnQgdXBvbiBtYWxsb2MgZmFpbHVyZSIKKzc3YmY0NDEwIG1ha2UgZXJyb3ItY29kZSByZXBvcnRpbmcgY29uc2lzdGVudCB1cG9uIG1hbGxvYyBmYWlsdXJlCis3YTkzYzAwMCAqKi9NYWtlZmlsZS5hbTogcmVtb3ZlIHVudXNlZCBBTV9DUFBGTEFHUworMjRlMzA4MDUgQWRkIGFuIGludGVyZmFjZSBhYnN0cmFjdGlvbiB0byB0aGUgV2ViUCB3b3JrZXIgdGhyZWFkIGltcGxlbWVudGF0aW9uCitkNmNkNjM1OCBNZXJnZSAiZml4IG9yaWdfcmVjdD09TlVMTCBjYXNlIgorMmJmZDFmZmEgZml4IG9yaWdfcmVjdD09TlVMTCBjYXNlCiswNTllMjFjMSBNZXJnZSAiY29uZmlndXJlOiBtb3ZlIGNvbmZpZy5oIHRvIHNyYy93ZWJwL2NvbmZpZy5oIgorZjA1ZmUwMDYgcHJvcGVybHkgcmVwb3J0IGJhY2sgZW5jb2RpbmcgZXJyb3IgY29kZSBpbiBXZWJQRnJhbWVDYWNoZUFkZEZyYW1lKCkKKzMyYjMxMzc5IGNvbmZpZ3VyZTogbW92ZSBjb25maWcuaCB0byBzcmMvd2VicC9jb25maWcuaAorOTAwOTBkOTkgTWVyZ2UgY2hhbmdlcyBJN2M2NzVlNTEsSTg0ZjdkNzg1CithZTc2NjFiMyBtYWtlZmlsZXM6IGRlZmluZSBXRUJQX0hBVkVfQVZYMiB3aGVuIGFwcHJvcHJpYXRlCis2OWZjZTJlYSByZW1vdmUgdGhlIHNwZWNpYWwgY2FzaW5nIGZvciByZXMtPmZpcnN0IGluIFZQOFNldFJlc2lkdWFsQ29lZmZzCis2ZTYxYTNhOSBjb25maWd1cmU6IHRlc3QgZm9yIC1tc3NlMgorYjlkMmVmYzYgcmVuYW1lIHVwc2FtcGxpbmdfbWlwczMyLmMgdG8geXV2X21pcHMzMi5jCitiZGZlZWJhYSBkc3AveXV2OiBtb3ZlIHNzZTIgZnVuY3Rpb25zIHRvIHl1dl9zc2UyLmMKKzQ2YjMyZTg2IE1lcmdlICJjb25maWd1cmU6IHNldCBXRUJQX0hBVkVfQVZYMiB3aGVuIGF2YWlsYWJsZSIKKzg4MzA1ZGI0IE1lcmdlICJWUDhSYW5kb21CaXRzMjogcHJldmVudCBzaWduZWQgaW50IG92ZXJmbG93IgorNzNmZWU4OGMgVlA4UmFuZG9tQml0czI6IHByZXZlbnQgc2lnbmVkIGludCBvdmVyZmxvdworZGI0ODYwYjMgZW5jX3NzZTI6IHByZXZlbnQgc2lnbmVkIGludCBvdmVyZmxvdworM2ZkYWY0ZDIgTWVyZ2UgInJlYWwgZml4IGZvciBsb25nam1wIHdhcm5pbmciCiszODVlMzM0MCByZWFsIGZpeCBmb3IgbG9uZ2ptcCB3YXJuaW5nCisyMzBhMDU1NSBjb25maWd1cmU6IHNldCBXRUJQX0hBVkVfQVZYMiB3aGVuIGF2YWlsYWJsZQorYTJhYzhhNDIgcmVzdG9yZSBvcmlnaW5hbCB2YWx1ZV8vcmFuZ2VfIGZpZWxkIG9yZGVyCis1ZTJlZTU2ZiBNZXJnZSAicmVtb3ZlIGxpYndlYnBkc3BkZWNvZGUgZGVwIG9uIGxpYndlYnBkc3BfYXZ4MiIKKzYxMzYyZGI1IHJlbW92ZSBsaWJ3ZWJwZHNwZGVjb2RlIGRlcCBvbiBsaWJ3ZWJwZHNwX2F2eDIKKzQyYzQ0N2FlIE1lcmdlICJsb3NzeSBiaXQtcmVhZGVyIGNsZWFuLXVwOiIKKzQ3OWZmZDhiIE1lcmdlICJyZW1vdmUgdW51c2VkICNpbmNsdWRlJ3MiCis5NzU0ZDM5YSBNZXJnZSAic3Ryb25nIGZpbHRlcmluZyBzcGVlZC11cCAofjItMyUgeDg2LCB+MS0yJSBmb3IgTkVPTikiCisxNThhZmY5YiByZW1vdmUgdW51c2VkICNpbmNsdWRlJ3MKKzA5NTQ1ZWVhIGxvc3N5IGJpdC1yZWFkZXIgY2xlYW4tdXA6CitlYThiMGExNyBzdHJvbmcgZmlsdGVyaW5nIHNwZWVkLXVwICh+Mi0zJSB4ODYsIH4xLTIlIGZvciBORU9OKQorNjY3OWY4OTkgT3B0aW1pemUgVlA4U2V0UmVzaWR1YWxDb2VmZnMuCithYzU5MWNmMiBmaXggZm9yIGdjYy00Ljkgd2FybmluZ3MgYWJvdXQgbG9uZ2ptcCArIGxvY2FsIHZhcmlhYmxlcworNGRmYTg2YjIgZHNwL2NwdTogTmFDbCBoYXMgbm8gc3VwcG9ydCBmb3IgeGdldGJ2Cis0YzM5ODY5OSBNZXJnZSAiY3dlYnA6IGZhbGxiYWNrIHRvIG5hdGl2ZSB3ZWJwIGRlY29kZSBpbiBXSUMgYnVpbGRzIgorMzNhYTQ5N2UgTWVyZ2UgImN3ZWJwOiBhZGQgc29tZSBtaXNzaW5nIG5ld2xpbmVzIGluIGxvbmdoZWxwIG91dHB1dCIKK2M5YjM0MGEyIGZpeCBtaXNzaW5nIFdlYlBJbml0QWxwaGFQcm9jZXNzaW5nIGNhbGwgZm9yIHByZW11bHRpcGxpZWQgY29sb3JzcGFjZSBvdXRwdXQKKzU3ODk3YmFlIE1lcmdlICJsb3NzbGVzc19uZW9uOiB1c2UgdmNyZWF0ZV8qKCkgd2hlcmUgYXBwcm9wcmlhdGUiCis2YWE0Nzc3YiBNZXJnZSAiKGVuY3xkZWMpX25lb246IHVzZSB2Y3JlYXRlXyooKSB3aGVyZSBhcHByb3ByaWF0ZSIKKzBkMzQ2ZTQxIEFsd2F5cyByZWluaXQgVlA4VHJhbnNmb3JtV0hUIGluc3RlYWQgb2YgaGFyZC1jb2RpbmcKKzdkMDM5ZmMzIGN3ZWJwOiBmYWxsYmFjayB0byBuYXRpdmUgd2VicCBkZWNvZGUgaW4gV0lDIGJ1aWxkcworZDQ3MWY0MjQgY3dlYnA6IGFkZCBzb21lIG1pc3NpbmcgbmV3bGluZXMgaW4gbG9uZ2hlbHAgb3V0cHV0CitiZjBlMDAzMCBsb3NzbGVzc19uZW9uOiB1c2UgdmNyZWF0ZV8qKCkgd2hlcmUgYXBwcm9wcmlhdGUKKzkyNTFjMmY2IChlbmN8ZGVjKV9uZW9uOiB1c2UgdmNyZWF0ZV8qKCkgd2hlcmUgYXBwcm9wcmlhdGUKKzM5OWI5MTZkIGxvc3N5IGRlY29kaW5nOiBjb3JyZWN0IGFscGhhLXJlc2NhbGluZyBmb3IgWVVWQSBmb3JtYXQKKzc4YzEyZWQ4IE1lcmdlICJNYWtlZmlsZS52YzogYWRkIHJ1ZGltZW50YXJ5IGF2eDIgc3VwcG9ydCIKK2RjNWIxMjJmIHRyeSB0byByZW1vdmUgdGhlIHNwdXJpb3VzIHdhcm5pbmcgZm9yIHN0YXRpYyBhbmFseXNpcworZGRmZWZkNjIgTWFrZWZpbGUudmM6IGFkZCBydWRpbWVudGFyeSBhdngyIHN1cHBvcnQKK2E4OTExNjQzIE1lcmdlICJzaW1wbGlmeSBWUDhMSW5pdEJpdFJlYWRlcigpIgorZmRiY2Q0NGQgc2ltcGxpZnkgVlA4TEluaXRCaXRSZWFkZXIoKQorN2MwMDQyODcgbWFrZWZpbGUudW5peDogYWRkIHJ1ZGltZW50YXJ5IGF2eDIgc3VwcG9ydAorNTE1ZTM1Y2YgTWVyZ2UgImFkZCBzdHViIGRzcC9lbmNfYXZ4Mi5jIgorYTA1ZGMxNDAgU1NFMjogeXV2LT5yZ2Igc3BlZWQtdXAgZm9yIHBvaW50LXNhbXBsaW5nCisxNzhlOWE2OSBhZGQgc3R1YiBkc3AvZW5jX2F2eDIuYworMWI5OWMwOWMgTWVyZ2UgImNvbmZpZ3VyZTogYWRkIGEgdGVzdCBmb3IgLW1hdngyIgorZmU3MjgwNzEgY29uZmlndXJlOiBhZGQgYSB0ZXN0IGZvciAtbWF2eDIKK2U0NmEyNDdjIGNwdTogZml4IGNoZWNrIGZvciBfX2NwdWlkZXggYXZhaWxhYmlsaXR5CisxNzZmZGEyNiBmaXggdGhlIGJpdC13cml0ZXIgZm9yIGxvc3NsZXNzIGluIDMyYml0IG1vZGUKKzU0MTc4NGM3IGRzcC5oOiBhZGQgYSBjaGVjayBmb3IgQVZYMiAvIGRlZmluZSBXRUJQX1VTRV9BVlgyCitiZGIxNTFlZSBkc3AvY3B1OiBhZGQgQVZYMiBkZXRlY3Rpb24KK2FiOWYyZjg2IE1lcmdlICJyZXZhbXAgdGhlIHBvaW50LXNhbXBsaW5nIGZ1bmN0aW9ucyBieSBwcm9jZXNzaW5nIGEgZnVsbCBwbGFuZSIKK2EyZjhiMjg5IHJldmFtcCB0aGUgcG9pbnQtc2FtcGxpbmcgZnVuY3Rpb25zIGJ5IHByb2Nlc3NpbmcgYSBmdWxsIHBsYW5lCitlZjA3NjAyNiB1c2UgZGVjb2RlcidzIERTUCBmdW5jdGlvbnMgZm9yIGF1dG9maWx0ZXIKKzJiNWNiMzI2IE1lcmdlICJkc3AvY3B1OiBhZGQgQVZYIGRldGVjdGlvbiIKK2RmMDhlNjdlIGRzcC9jcHU6IGFkZCBBVlggZGV0ZWN0aW9uCitlMmY0MDVjOSBNZXJnZSAiY2xlYW4tdXAgYW5kIHNsaWdodCBzcGVlZC11cCBpbi1sb29wIGZpbHRlcmluZyBTU0UyIgorZjYwOTU3YmYgY2xlYW4tdXAgYW5kIHNsaWdodCBzcGVlZC11cCBpbi1sb29wIGZpbHRlcmluZyBTU0UyCis5ZmMzYWU0NiAuZ2l0YXR0cmlidXRlczogdHJlYXQgLnBwbSBhcyBiaW5hcnkKKzNkYTkyNGI1IE1lcmdlICJkc3AvV0VCUF9VU0VfTkVPTjogdGVzdCBmb3IgX19hYXJjaDY0X18iCitjNzE2NDQ5MCBBbmRyb2lkLm1rOiBhbHdheXMgaW5jbHVkZSAqX25lb24uYyBpbiB0aGUgYnVpbGQKK2E1NzdiMjNhIGRzcC9XRUJQX1VTRV9ORU9OOiB0ZXN0IGZvciBfX2FhcmNoNjRfXworNTRiZmZmY2EgbW92ZSBSZW1hcEJpdFJlYWRlcigpIGZyb20gaWRlYy5jIHRvIGJpdF9yZWFkZXIgY29kZQorMzQxNjhlY2IgTWVyZ2UgInJlbW92ZSBhbGwgdW51c2VkIGxheWVyIGNvZGUiCitmMWU3NzE3MyByZW1vdmUgYWxsIHVudXNlZCBsYXllciBjb2RlCitiMDc1N2RiNyBDb2RlIGNsZWFudXAgZm9yIFZQOExHZXRIaXN0b0ltYWdlU3ltYm9scy4KKzVmZTYyOGQzIG1ha2UgdGhlIHRva2VuIHBhZ2Ugc2l6ZSBiZSB2YXJpYWJsZSBpbnN0ZWFkIG9mIGZpeGVkIDgxOTIKK2Y5NDhkMDhjIG1lbW9yeSBkZWJ1ZzogYWxsb3cgc2V0dGluZyBwcmUtZGVmaW5lZCBtYWxsb2MgZmFpbHVyZSBwb2ludHMKK2NhM2Q3NDZlIHVzZSBibG9jay1iYXNlZCBhbGxvY2F0aW9uIGZvciBiYWNrd2FyZCByZWZzIHN0b3JhZ2UsIGFuZCBmcmVlLWxpc3RzCisxYmE2MWIwOSBlbmFibGUgTkVPTiBpbnRyaW5zaWNzIGluIGFhcmNoNjQgYnVpbGRzCitiOWQyYmI2NyBkc3AvbmVvbi5oOiBjb2FsZXNjZSBpbnRyaW5zaWNzLXJlbGF0ZWQgZGVmaW5lcworYjVjNzUyNTggaW9zYnVpbGQ6IGFkZCBzdXBwb3J0IGZvciBpT1N2Ny9hYXJjaDY0Cis5MzgzYWZkNSBSZWR1Y2UgbnVtYmVyIG9mIG1lbW9yeSBhbGxvY2F0aW9ucyB3aGlsZSBkZWNvZGluZyBsb3NzbGVzcy4KKzg4OGU2M2VkIE1lcmdlICJkc3AvbG9zc2xlc3M6IHByZXZlbnQgc2lnbmVkIGludCBvdmVyZmxvdyBpbiBsZWZ0IHNoaWZ0IG9wcyIKKzgxMzdmM2VkIE1lcmdlICJpbnN0cnVtZW50IG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzIGZvciBkZWJ1Z2dpbmciCisyYWExODczNiBpbnN0cnVtZW50IG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzIGZvciBkZWJ1Z2dpbmcKK2QzYmNmNzJiIERvbid0IGFsbG9jYXRlIFZQOExIYXNoQ2hhaW4sIGJ1dCB0cmVhdCBsaWtlIGF1dG9tYXRpYyBvYmplY3QKK2JkNmI4NjE5IGRzcC9sb3NzbGVzczogcHJldmVudCBzaWduZWQgaW50IG92ZXJmbG93IGluIGxlZnQgc2hpZnQgb3BzCitiN2YxOWI4MyBNZXJnZSAiZGVjL3ZwOGw6IHByZXZlbnQgc2lnbmVkIGludCBvdmVyZmxvdyBpbiBsZWZ0IHNoaWZ0IG9wcyIKKzI5MDU5ZDUxIE1lcmdlICJyZW1vdmUgc29tZSB1aW50NjRfdCBjYXN0cyBhbmQgdXNlLiIKK2U2OWExZGY0IGRlYy92cDhsOiBwcmV2ZW50IHNpZ25lZCBpbnQgb3ZlcmZsb3cgaW4gbGVmdCBzaGlmdCBvcHMKK2NmNWViOGFkIHJlbW92ZSBzb21lIHVpbnQ2NF90IGNhc3RzIGFuZCB1c2UuCiszOGUyZGIzZSBNSVBTOiBNSVBTMzJyMTogQWRkZWQgb3B0aW1pemF0aW9uIGZvciBIaXN0b2dyYW1BZGQuCitlMDYwOWFkZSBkd2VicDogZml4IGV4aXQgY29kZSBvbiB3ZWJwIGxvYWQgZmFpbHVyZQorYmJkMzU4YTggTWVyZ2UgImV4YW1wbGVfdXRpbC5oOiBhdm9pZCBmb3J3YXJkIGRlY2xhcmluZyBlbnVtcyIKKzg5NTVkYTIxIGV4YW1wbGVfdXRpbC5oOiBhdm9pZCBmb3J3YXJkIGRlY2xhcmluZyBlbnVtcworNmQ2ODY1ZjAgQWRkZWQgU1NFMiB2YXJpYW50cyBmb3IgQXZlcmFnZTIvMy80CitiM2E2MTZiMyBtYWtlIEhpc3RvZ3JhbUFkZCgpIGEgcG9pbnRlciBpbiBkc3AKK2M4YmJiNjM2IGRlY19uZW9uOiByZWxvY2F0ZSBzb21lIGlubGluZS1hc20gZGVmaW5lcworNGUzOTNiYjkgZGVjX25lb246IGVuYWJsZSBpbnRyaW5zaWNzLW9ubHkgZnVuY3Rpb25zCitiYTk5YTkyMiBkZWNfbmVvbjogdXNlIHBvc2l0aXZlIHRlc3RzIGZvciBVU0VfSU5UUklOU0lDUworNjkwNThmZjggTWVyZ2UgImV4YW1wbGVfdXRpbDogYWRkIEV4VXRpbERlY29kZVdlYlBJbmNyZW1lbnRhbCIKK2E3ODI4ZThiIGRlY19uZW9uOiBtYWtlIFdPUktfQVJPVU5EX0dDQyBjb25kaXRpb25hbCBvbiB2ZXJzaW9uCiszZjNkNzE3YSBNZXJnZSAiZW5jX25lb246IGVuYWJsZSBpbnRyaW5zaWNzLW9ubHkgZnVuY3Rpb25zIgorZGUzY2I2YzggTWVyZ2UgIm1vdmUgTE9DQUxfR0NDX1ZFUlNJT04gZGVmIHRvIGRzcC5oIgorMWIyZmUxNGQgZXhhbXBsZV91dGlsOiBhZGQgRXhVdGlsRGVjb2RlV2ViUEluY3JlbWVudGFsCitjYTQ5ZTdhZCBNZXJnZSAiZW5jX25lb246IG1vdmUgVHJhbnNwb3NlNHg0IHRvIGRzcC9uZW9uLmgiCithZDkwMGFiZCBNZXJnZSAiZml4IHdhcm5pbmcgYWJvdXQgc2l6ZV90IC0+IGludCBjb252ZXJzaW9uIgorNDgyNWI0MzYgZml4IHdhcm5pbmcgYWJvdXQgc2l6ZV90IC0+IGludCBjb252ZXJzaW9uCis0MmIzNWUwOCBlbmNfbmVvbjogZW5hYmxlIGludHJpbnNpY3Mtb25seSBmdW5jdGlvbnMKK2Y5MzdlMDEyIG1vdmUgTE9DQUxfR0NDX1ZFUlNJT04gZGVmIHRvIGRzcC5oCis1ZTFhMTdlZiBlbmNfbmVvbjogbW92ZSBUcmFuc3Bvc2U0eDQgdG8gZHNwL25lb24uaAorYzdiOTJhNWEgZGVjX25lb246IChXT1JLX0FST1VORF9HQ0MpIGRlbGV0ZSB1bnVzZWQgTG9hZDR4OAorOGU1ZjkwYjAgTWVyZ2UgIm1ha2UgRXhVdGlsTG9hZFdlYlAoKSBhY2NlcHQgTlVMTCBiaXRzdHJlYW0gcGFyYW0uIgorMDVkNGMxYjcgTWVyZ2UgImN3ZWJwOiBhZGQgd2VicGRlYyIKK2RkZWI2YWM4IGN3ZWJwOiBhZGQgd2VicGRlYworMzVkN2QwOTUgTWVyZ2UgIlJlZHVjZSBtZW1vcnkgZm9vdHByaW50IGZvciBlbmNvZGluZyBXZWJQIGxvc3NsZXNzLiIKKzBiODk2MTAxIFJlZHVjZSBtZW1vcnkgZm9vdHByaW50IGZvciBlbmNvZGluZyBXZWJQIGxvc3NsZXNzLgorZjBiNjVjOWEgbWFrZSBFeFV0aWxMb2FkV2ViUCgpIGFjY2VwdCBOVUxMIGJpdHN0cmVhbSBwYXJhbS4KKzljMGE2MGNjIE1lcmdlICJkd2VicDogbW92ZSB3ZWJwIGRlY29kaW5nIHRvIGV4YW1wbGVfdXRpbCIKKzFkNjJhY2Y2IE1JUFM6IE1JUFMzMnIxOiBBZGRlZCBvcHRpbWl6YXRpb24gZm9yIEh1ZmZtYW5Db3N0IGZ1bmN0aW9ucy4KKzRhMGU3MzkwIGR3ZWJwOiBtb3ZlIHdlYnAgZGVjb2RpbmcgdG8gZXhhbXBsZV91dGlsCitjMDIyMDQ2MCBNZXJnZSAiQnVnZml4OiBJbmNyZW1lbnRhbCBkZWNvZGUgb2YgbG9zc3ktYWxwaGEiCis4YzdjZDcyMiBCdWdmaXg6IEluY3JlbWVudGFsIGRlY29kZSBvZiBsb3NzeS1hbHBoYQorNzk1NTE1MmQgTUlQUzogZml4IGVycm9yIHdpdGggbnVtYmVyIG9mIHJlZ2lzdGVycy4KK2IxZGFiZTM3IE1lcmdlICJNb3ZlIHRoZSBIdWZmbWFuQ29zdCgpIGZ1bmN0aW9uIHRvIGRzcCBsaWIiCis3NWIxMjAwNiBNb3ZlIHRoZSBIdWZmbWFuQ29zdCgpIGZ1bmN0aW9uIHRvIGRzcCBsaWIKKzI3NzJiOGJkIE1JUFM6IGZpeCBhc3NlbWJsZXIgZXJyb3IgcmV2ZWFsZWQgYnkgY2xhbmcncyBkZWJ1ZyBidWlsZAorNjY1M2I2MDEgZW5jX21pcHMzMjogZml4IHVudXNlZCBzeW1ib2wgd2FybmluZyBpbiBkZWJ1ZworOGRlYzEyMDkgZW5jX21pcHMzMjogZGlzYWJsZSBJVHJhbnNmb3JtKE9uZSkgaW4gZGVidWcgYnVpbGRzCis5ODUxOWRkNSBlbmNfbmVvbjogY29udmVydCBEaXN0bzR4NCB0byBpbnRyaW5zaWNzCitmZTkzMTdjOSBjb3NtZXRpY3M6Cis5NTNiMDc0NiBlbmNfbmVvbjogY29zbWV0aWNzCithOWZjNjk3YyBNZXJnZSAiV0lQOiBleHRyYWN0IHRoZSBmbG9hdC1jYWxjdWxhdGlvbiBvZiBIdWZmbWFuQ29zdCBmcm9tIGxvb3AiCiszZjg0YjUyMSBNZXJnZSAicmVwbGFjZSBzb21lIG11bHQtbG9uZyAodm11bGxfdTgpIHdpdGggbXVsdC1sb25nLWFjY3VtdWxhdGUgKHZtbGFsX3U4KSIKKzRhZTA1MzNmIE1JUFM6IE1JUFMzMnIxOiBBZGRlZCBvcHRpbWl6YXRpb25zIGZvciBFeHRyYUNvc3QgZnVuY3Rpb25zLgorYjMwYTA0Y2YgV0lQOiBleHRyYWN0IHRoZSBmbG9hdC1jYWxjdWxhdGlvbiBvZiBIdWZmbWFuQ29zdCBmcm9tIGxvb3AKK2E4ZmU4Y2UyIE1lcmdlICJORU9OIGludHJpbnNpY3MgdmVyc2lvbiBvZiBDb2xsZWN0SGlzdG9ncmFtIgorOTUyMDNkMmQgTkVPTiBpbnRyaW5zaWNzIHZlcnNpb24gb2YgQ29sbGVjdEhpc3RvZ3JhbQorN2NhMmU3NGIgcmVwbGFjZSBzb21lIG11bHQtbG9uZyAodm11bGxfdTgpIHdpdGggbXVsdC1sb25nLWFjY3VtdWxhdGUgKHZtbGFsX3U4KQorNDFjNmVmYmQgZml4IGxvc3NsZXNzX25lb24uYworOGZmOTZhMDIgTkVPTiBpbnRyaW5zaWNzIHZlcnNpb24gb2YgRlRyYW5zZm9ybQorMDIxNGY0YTkgTWVyZ2UgIk1JUFM6IE1JUFMzMnIxOiBBZGRlZCBvcHRpbWl6YXRpb25zIGZvciBGYXN0TG9nMiIKK2JhYWJmMWVhIE1JUFM6IE1JUFMzMnIxOiBBZGRlZCBvcHRpbWl6YXRpb25zIGZvciBGYXN0TG9nMgorM2Q0OTg3MWQgTkVPTiBmdW5jdGlvbnMgZm9yIGxvc3NsZXNzIGNvZGluZworM2ZlMDI5MTUgTUlQUzogTUlQUzMycjE6IEFkZGVkIG9wdGltaXphdGlvbnMgZm9yIFNTRSBmdW5jdGlvbnMuCitjNTAzYjQ4NSBNZXJnZSAiZml4IHRoZSBnY2MtNC42LjAgYnVnIGJ5IGltcGxlbWVudGluZyBhbHRlcm5hdGl2ZSBtZXRob2QiCithYmU2ZjQ4NyBmaXggdGhlIGdjYy00LjYuMCBidWcgYnkgaW1wbGVtZW50aW5nIGFsdGVybmF0aXZlIG1ldGhvZAorNTU5OGJkZWMgZW5jX21pcHMzMi5jOiBmaXggZmlsZSBtb2RlCisyYjFiNGQ1YSBNSVBTOiBNSVBTMzJyMTogQWRkIG9wdGltaXphdGlvbiBmb3IgR2V0UmVzaWR1YWxDb3N0CitmMGExZjNjZCBNZXJnZSAiTUlQUzogTUlQUzMycjE6IEFkZGVkIG9wdGltaXphdGlvbiBmb3IgRlRyYW5zZm9ybSIKKzcyMzFmNjEwIE1JUFM6IE1JUFMzMnIxOiBBZGRlZCBvcHRpbWl6YXRpb24gZm9yIEZUcmFuc2Zvcm0KKzg2OWVhZjZjICB+MzAlIGVuY29kaW5nIHNwZWVkdXA6IHVzZSBORU9OIGZvciBRdWFudGl6ZUJsb2NrKCkKK2Y3NThhZjZiIGVuY19uZW9uOiBjb252ZXJ0IEZUcmFuc2Zvcm1XSFQgdG8gaW50cmluc2ljcworN2RhZDA5NWIgTUlQUzogTUlQUzMycjE6IEFkZGVkIG9wdGltaXphdGlvbiBmb3IgRGlzdG80eDQgKFRUcmFuc2Zvcm0pCisyMjk4ZDVmMyBNSVBTOiBNSVBTMzJyMTogQWRkZWQgb3B0aW1pemF0aW9uIGZvciBRdWFudGl6ZUJsb2NrCitlODgxNTBjOSBNZXJnZSAiTUlQUzogTUlQUzMycjE6IEFkZCBvcHRpbWl6YXRpb24gZm9yIElUcmFuc2Zvcm0iCitkZTY5M2YyNSBsb3NzbGVzc19uZW9uOiBkaXNhYmxlIFZQOExDb252ZXJ0KiBmdW5jdGlvbnMKKzQxNDMzMzJiIE5FT04gaW50cmluc2ljcyBmb3IgZW5jb2RpbmcKKzBjYTI5MTRiIE1JUFM6IE1JUFMzMnIxOiBBZGQgb3B0aW1pemF0aW9uIGZvciBJVHJhbnNmb3JtCis3MWJjYTVlYyBkZWNfbmVvbjogdXNlIHZzdF9sYW5lIGluc3RlYWQgb2YgdmdldF9sYW5lCitiZjA2MTA1MiBJbnRyaW5zaWNzIE5FT04gdmVyc2lvbiBvZiBUcmFuc2Zvcm1PbmUKKzE5YzZmMWJhIE1lcmdlICJkZWNfbmVvbjogdXNlIHZsZD9fbGFuZSBpbnN0ZWFkIG9mIHZzZXQ/X2xhbmUiCis3YTk0YzBjZiB1cHNhbXBsaW5nX25lb246IGRyb3AgTkVPTiBzdWZmaXggZnJvbSBsb2NhbCBmdW5jdGlvbnMKK2QxNDY2OWM4IHVwc2FtcGxpbmdfc3NlMjogZHJvcCBTU0UyIHN1ZmZpeCBmcm9tIGxvY2FsIGZ1bmN0aW9ucworMmNhNDJhNGYgZW5jX3NzZTI6IGRyb3AgU1NFMiBzdWZmaXggZnJvbSBsb2NhbCBmdW5jdGlvbnMKK2QwMzhlNjE5IGRlY19zc2UyOiBkcm9wIFNTRTIgc3VmZml4IGZyb20gbG9jYWwgZnVuY3Rpb25zCitmYTUyZDc1MiBkZWNfbmVvbjogdXNlIHZsZD9fbGFuZSBpbnN0ZWFkIG9mIHZzZXQ/X2xhbmUKK2M1MjBlNzdkIGNvc21ldGljOiBmaXggbG9uZyBsaW5lCis0YjBmMmRhZSBNZXJnZSAiYWRkIGludHJpbnNpY3MgTkVPTiBjb2RlIGZvciBjaHJvbWEgc3Ryb25nLWZpbHRlcmluZyIKK2UzNTFlYzA3IGFkZCBpbnRyaW5zaWNzIE5FT04gY29kZSBmb3IgY2hyb21hIHN0cm9uZy1maWx0ZXJpbmcKK2FhZjczNGI4IE1lcmdlICJBZGQgU1NFMiB2ZXJzaW9uIG9mIGZvcndhcmQgY3Jvc3MtY29sb3IgdHJhbnNmb3JtIgorYzkwYTkwMmUgQWRkIFNTRTIgdmVyc2lvbiBvZiBmb3J3YXJkIGNyb3NzLWNvbG9yIHRyYW5zZm9ybQorYmMzNzRmZjMgVXNlIGhpc3RvZ3JhbV9iaXRzIHRvIGluaXRhbGl6ZSB0cmFuc2Zvcm1fYml0cy4KKzIxMzI5OTJkIE1lcmdlICJBZGQgc3Ryb25nIGZpbHRlcmluZyBpbnRyaW5zaWNzIChpbm5lciBhbmQgb3V0ZXIgZWRnZXMpIgorNWZiZmYzYTYgQWRkIHN0cm9uZyBmaWx0ZXJpbmcgaW50cmluc2ljcyAoaW5uZXIgYW5kIG91dGVyIGVkZ2VzKQorZDQ4MTNmMGMgQWRkIFNTRTIgZnVuY3Rpb24gZm9yIEludmVyc2UgQ3Jvc3MtY29sb3IgVHJhbnNmb3JtCisyNjAyOTU2OCBkZWNfbmVvbjogYWRkIHN0cm9uZyBsb29wZmlsdGVyIGludHJpbnNpY3MKK2NjYTdkN2VmIE1lcmdlICJhZGQgaW50cmluc2ljcyB2ZXJzaW9uIG9mIFNpbXBsZUhGaWx0ZXIxNk5FT04oKSIKKzFhMDVkZmE3IHdpbmRvd3M6IGZpeCBkbGwgYnVpbGRzCitkNmM1MGQ4YSBNZXJnZSAiYWRkIHNvbWUgY29sb3JzcGFjZSBjb252ZXJzaW9uIGZ1bmN0aW9ucyBpbiBORU9OIgorNGZkN2M4MmUgU1NFMiB2YXJpYW50cyBvZiBTdWJ0cmFjdC1HcmVlbjogUmVjdGlmeSBsb29wIGNvbmRpdGlvbgorOTdlNWZhYzMgYWRkIHNvbWUgY29sb3JzcGFjZSBjb252ZXJzaW9uIGZ1bmN0aW9ucyBpbiBORU9OCitiOWE3YTQ1ZiBhZGQgaW50cmluc2ljcyB2ZXJzaW9uIG9mIFNpbXBsZUhGaWx0ZXIxNk5FT04oKQorZGFjY2JmNDAgYWRkIGxpZ2h0IGZpbHRlcmluZyBORU9OIGludHJpbnNpY3MKK2FmNDQ0NjA4IGZpeCB0eXBvIGluIFNUT1JFX1dIVAorNmFmNmI4ZTEgVHVuZSBIaXN0b2dyYW1Db21iaW5lQmluIGZvciBsYXJnZSBpbWFnZXMuCithZjkzYmRkNiB1c2UgV2ViUFNhZmVbQ01dYWxsb2MvV2ViUFNhZmVGcmVlIGluc3RlYWQgb2YgW2NtXWFsbG9jL2ZyZWUKKzUxZjQwNmE1IGxvc3NsZXNzX3NzZTI6IHJlbG9jYXRlIFZQOExEc3BJbml0U1NFMiBwcm90bworMGY0ZjcyMWIgc2VwYXJhdGUgU1NFMiBsb3NzbGVzcyBmdW5jdGlvbnMgaW50byBpdHMgb3duIGZpbGUKKzUxNGZjMjUxIFZQOExDb252ZXJ0RnJvbUJHUkE6IHVzZSBjb252ZXJzaW9uIGZ1bmN0aW9uIHBvaW50ZXJzCis2ZDJmMzUyNyBkc3AvZGVjOiBUcmFuc2Zvcm1EQ1VWOiB1c2UgVlA4VHJhbnNmb3JtREMKK2RlZmM4ZTFiIE1lcmdlICJmaXggb3V0LW9mLWJvdW5kIHJlYWQgZHVyaW5nIGFscGhhLXBsYW5lIGRlY29kaW5nIgorZmJlZDM2NDMgTWVyZ2UgImRzcDogcmV1c2Ugd2h0IHRyYW5zZm9ybSBmcm9tIGRlYyBpbiBlbmNvZGVyIgorZDg0NjcwODQgTWVyZ2UgIkFkZCBTU0UyIHZlcnNpb24gb2YgQVJHQiAtPiBCR1IvUkdCLy4uLiBjb252ZXJzaW9uIGZ1bmN0aW9ucyIKKzIwN2QwM2I0IGZpeCBvdXQtb2YtYm91bmQgcmVhZCBkdXJpbmcgYWxwaGEtcGxhbmUgZGVjb2RpbmcKK2QxYjMzYWQ1IDItNSUgZmFzdGVyIHRyZWxsaXMgd2l0aCBjbGFuZy9NYWNPUyAoYW5kIH4yLTMlIG9uIEFSTSkKKzM2OWMyNmRkIEFkZCBTU0UyIHZlcnNpb24gb2YgQVJHQiAtPiBCR1IvUkdCLy4uLiBjb252ZXJzaW9uIGZ1bmN0aW9ucworZGYyMzBmMjcgZHNwOiByZXVzZSB3aHQgdHJhbnNmb3JtIGZyb20gZGVjIGluIGVuY29kZXIKKzgwZTIxOGQ0IEFuZHJvaWQubWs6IGZpeCBidWlsZCB3aXRoIEFQUF9BQkk9YXJtZWFiaS12N2EtaGFyZAorNTlkYWYwODMgTWVyZ2UgImNvc21ldGljczoiCis1MzYyMjAwOCBjb3NtZXRpY3M6CiszZTdmMzRhMyBBc3NpZ25TZWdtZW50czogcXVpZXQgYXJyYXktYm91bmRzIHdhcm5pbmcKKzNjMmViZjU4IE1lcmdlICJVcGRhdGVIaXN0b2dyYW1Db3N0OiBhdm9pZCBpbXBsaWNpdCBkb3VibGUtPmZsb2F0IgorY2Y4MjFjODIgVXBkYXRlSGlzdG9ncmFtQ29zdDogYXZvaWQgaW1wbGljaXQgZG91YmxlLT5mbG9hdAorMzEyZTYzOGYgRXh0ZW5kIHRoZSBzZWFyY2ggc3BhY2UgZm9yIEdldEJlc3RHcmVlblJlZFRvQmx1ZQorMWM1ODUyNmYgRml4IGZldyBuaXRzCitmZWYyMjcwNCBPcHRpbWl6ZSBhbmQgcmUtc3RydWN0dXJlIFZQOExHZXRIaXN0b0ltYWdlU3ltYm9scworMDY4YjE0YWMgT3B0aW1pemUgbG9zc2xlc3MgZGVjb2RpbmcuCis1ZjBjZmE4MCBEbyBhIGJpbmFyeSBzZWFyY2ggdG8gZ2V0IHRoZSBvcHRpbXVtIGNhY2hlIGJpdHMuCisyNGNhMzY3OCBNZXJnZSAiYWxsb3cgJ2N3ZWJwIC1vIC0nIHRvIGVtaXQgb3V0cHV0IHRvIHN0ZG91dCIKK2UxMmY4NzRlIGFsbG93ICdjd2VicCAtbyAtJyB0byBlbWl0IG91dHB1dCB0byBzdGRvdXQKKzJiY2FkODliIGFsbG93IHNvbWUgbW9yZSBzdGRpbi9zdG91dCBJL08KKzg0ZWQ0YjNhIGZpeCBjd2VicC4xIHR5cG9zIGFmdGVyIHBhdGNoICM2OTE5OQorNjViOTlmMWMgYWRkIGEgLXogb3B0aW9uIHRvIGN3ZWJwLCBhbmQgV2ViUENvbmZpZ0xvc3NsZXNzUHJlc2V0KCkgZnVuY3Rpb24KKzMwMTc2NjE5IDQtNSUgZmFzdGVyIHRyZWxsaXMgYnkgcmVtb3Zpbmcgc29tZSB1bm5lZWRlZCBjYWxjdWxhdGlvbnMuCis2ODdhNThlYyBoaXN0b2dyYW0uYzogcmVpbmRlbnQgYWZ0ZXIgYjMzZThhMAorMDZkNDU2ZjYgTWVyZ2UgIn4zLTQlIGZhc3RlciBsb3NzbGVzcyBlbmNvZGluZyIKK2M2MGRlMjYwIH4zLTQlIGZhc3RlciBsb3NzbGVzcyBlbmNvZGluZworNDJlYjA2ZmMgTWVyZ2UgImZldyBjb3NtZXRpY3MgYWZ0ZXIgcGF0Y2ggIzY5MDc5IgorODJhZjgyNjQgZmV3IGNvc21ldGljcyBhZnRlciBwYXRjaCAjNjkwNzkKK2IzM2U4YTA1IFJlZmFjdG9yIGNvZGUgZm9yIEhpc3RvZ3JhbUNvbWJpbmUuCitjYTFiZmZmNSBNZXJnZSAiNS0xMCUgZW5jb2Rpbmcgc3BlZWR1cCB3aXRoIGZhc3RlciB0cmVsbGlzICgtbSA2KSIKKzVhZWViMDg3IDUtMTAlIGVuY29kaW5nIHNwZWVkdXAgd2l0aCBmYXN0ZXIgdHJlbGxpcyAoLW0gNikKKzgyYWUxYmYyIGNvc21ldGljczogbm9ybWFsaXplIFZQOEdldENQVUluZm8gY2hlY2tzCitlM2RkOTI0MyBNZXJnZSAiUmVmYWN0b3IgR2V0QmVzdFByZWRpY3RvckZvclRpbGUgZm9yIGZ1dHVyZSB0dW5pbmcuIgorMjA2Y2MxYmUgUmVmYWN0b3IgR2V0QmVzdFByZWRpY3RvckZvclRpbGUgZm9yIGZ1dHVyZSB0dW5pbmcuCiszY2I4NDA2MiBNZXJnZSAic3BlZWQtdXAgdHJlbGxpcyBxdWFudCAofjUtMTAlIG92ZXJhbGwgc3BlZWQtdXApIgorYjY2ZjIyMjcgTWVyZ2UgImxvc3N5IGVuY29kaW5nOiB+MyUgc3BlZWQtdXAiCis0Mjg3ZDBkNCBzcGVlZC11cCB0cmVsbGlzIHF1YW50ICh+NS0xMCUgb3ZlcmFsbCBzcGVlZC11cCkKKzM5MGM4YjMxIGxvc3N5IGVuY29kaW5nOiB+MyUgc3BlZWQtdXAKKzlhNDYzYzRhIE1lcmdlICJkZWNfbmVvbjogY29udmVydCBUcmFuc2Zvcm1XSFQgdG8gaW50cmluc2ljcyIKK2U4NjA1ZTk2IE1lcmdlICJkZWNfbmVvbjogYWRkIENvbnZlcnRVOFRvUzE2IgorNGFhM2U0MTIgTUlQUzogTUlQUzMycjE6IHJlc2NhbGVyIGJ1Z2ZpeAorYzE2Y2Q5OWEgU3BlZWQgdXAgbG9zc2xlc3MgZW5jb2Rlci4KKzlkNmI1ZmYxIGRlY19uZW9uOiBjb252ZXJ0IFRyYW5zZm9ybVdIVCB0byBpbnRyaW5zaWNzCisyZmYwYWFlMiBkZWNfbmVvbjogYWRkIENvbnZlcnRVOFRvUzE2Cis3N2E4ZjkxOSBmaXggY29tcGlsYXRpb24gd2l0aCBVU0VfWVVWaiBmbGFnCis0YWNiZWMxYiBNZXJnZSBjaGFuZ2VzIEkzYjI0MGZmYixJYTkzNzAyODMsSWEyZDI4NzI4CisyNzE5YmI3ZSBkZWNfbmVvbjogVHJhbnNmb3JtQUMzOiB3b3JrIG9uIHBhY2tlZCB2ZWN0b3JzCitiN2I2MGNhMSBkZWNfbmVvbjogYWRkIFNhdHVyYXRlQW5kU3RvcmU0eDQKK2I3Njg1ZDczIFJlc2NhbGU6IGxldCBJbXBvcnRSb3cgLyBFeHBvcnRSb3cgYmUgcG9pbnRlci10by1mdW5jdGlvbgorZTAyZjE2ZWYgZGVjX25lb24uYzogY29udmVydCBUcmFuc2Zvcm1EQyB0byBpbnRyaW5zaWNzCis5Y2JhOTYzZiBhZGQgbWlzc2luZyBmaWxlCis4OTkyZGRiNyB1c2Ugc3RhdGljIGNsaXBwaW5nIHRhYmxlcworMDIzNWQ1ZTQgMS0yJSBmYXN0ZXIgcXVhbnRpemF0aW9uIGluIFNTRTIKK2IyZmJjMzZjIGZpeCBWQzEyLXg2NCB3YXJuaW5nCis2ZTM3Y2I5NCBNZXJnZSAiY29zbWV0aWNzOiBiYWNrd2FyZF9yZWZlcmVuY2VzLmM6IHJlaW5kZW50IGFmdGVyIGE3ZDJlZTMiCithNDJlYTk3NCBjb3NtZXRpY3M6IGJhY2t3YXJkX3JlZmVyZW5jZXMuYzogcmVpbmRlbnQgYWZ0ZXIgYTdkMmVlMworNmMzMjc0NDIgTWVyZ2UgImZpeCBtaXNzaW5nIF9fQklHX0VORElBTl9fIGRlZmluaXRpb24gb24gc29tZSBwbGF0Zm9ybSIKK2E4YjZhYWQxIGZpeCBtaXNzaW5nIF9fQklHX0VORElBTl9fIGRlZmluaXRpb24gb24gc29tZSBwbGF0Zm9ybQorZmRlMjkwNGIgSW5jcmVhc2UgaW5pdGlhbCBidWZmZXIgc2l6ZSBmb3IgVlA4TCBCaXQgV3JpdGVyLgorYTdkMmVlMzkgT3B0aW1pemUgY2FjaGUgZXN0aW1hdGUgbG9naWMuCis3ZmI2MDk1YiBNZXJnZSAiZGVjX25lb24uYzogYWRkIFRyYW5zZm9ybUFDMyIKK2JmMTgyZTgzIFZQOExCaXRXcml0ZXI6IHVzZSBhIGJpdC1hY2N1bXVsYXRvcgorM2Y0MGI0YTUgTWVyZ2UgIk1JUFM6IE1JUFMzMnIxOiBjbGFuZyBtYWNybyB3YXJuaW5nIHJlc29sdmVkIgorMTY4NGY0ZWUgV2ViUCBEZWNvZGVyOiBNYXJrIHNvbWUgdHJ1bmNhdGVkIGJpdHN0cmVhbXMgYXMgaW52YWxpZAorYWNiZWRhYzQgTUlQUzogTUlQUzMycjE6IGNsYW5nIG1hY3JvIHdhcm5pbmcgcmVzb2x2ZWQKKzIyOGU0ODc3IGRlY19uZW9uLmM6IGFkZCBUcmFuc2Zvcm1BQzMKKzM5M2Y4OWI3IEFuZHJvaWQubWs6IGF2b2lkIGdjYy1zcGVjaWZpYyBmbGFncyB3aXRoIGNsYW5nCiszMmFlYWYxMSByZXZhbXAgVlA4TENvbG9yU3BhY2VUcmFuc2Zvcm0oKSBhIGJpdAorMGM3Y2M0Y2EgTWVyZ2UgIkRvbid0IGRlcmVmZXJlbmNlIE5VTEwsIGVuc3VyZSBIYXNoQ2hhaW4gZnVsbHkgaW5pdGlhbGl6ZWQiCiszOTEzMTZmZSBEb24ndCBkZXJlZmVyZW5jZSBOVUxMLCBlbnN1cmUgSGFzaENoYWluIGZ1bGx5IGluaXRpYWxpemVkCis5MjZmZjQwMiBXRUJQX1NXQVBfMTZCSVRfQ1NQOiByZW1vdmUgY29kZSBkdXAKKzFkMWNkM2JiIEZpeCBkZWNvZGUgYnVnIGZvciByZ2JBXzQ0NDQvUkdCQV80NDQ0IGNvbG9yLW1vZGVzLgorOTM5ZTcwZTcgdXBkYXRlIEFVVEhPUlMgZmlsZQorODkzNGE2MjIgY29zbWV0aWNzOiAqX21pcHMzMi5jCitkZDQzOGM5YSBNSVBTOiBNSVBTMzJyMTogT3B0aW1pemF0aW9uIG9mIHNvbWUgc2ltcGxlIHBvaW50LXNhbXBsaW5nIGZ1bmN0aW9ucy4gUEFUQ0ggWzYvNl0KKzUzNTIwOTExIEFkZGVkIHN1cHBvcnQgZm9yIGNhbGxpbmcgc2FtcGxpbmcgZnVuY3Rpb25zIHZpYSBwb2ludGVycy4KK2QxNmM2OTc0IE1JUFM6IE1JUFMzMnIxOiBPcHRpbWl6YXRpb24gb2YgZmlsdGVyIGZ1bmN0aW9ucy4gUEFUQ0ggWzUvNl0KKzA0MzM2ZmM3IE1JUFM6IE1JUFMzMnIxOiBPcHRpbWl6YXRpb24gb2YgZnVuY3Rpb24gVHJhbnNmb3JtT25lLiBQQVRDSCBbNC82XQorOTJkOGZjN2QgTUlQUzogTUlQUzMycjE6IE9wdGltaXphdGlvbiBvZiBmdW5jdGlvbiBXZWJQUmVzY2FsZXJJbXBvcnRSb3cuIFBBVENIIFszLzZdCitiYmMyM2ZmMyBwYXJzZSBvbmUgcm93IG9mIGludHJhIG1vZGVzIGFsdG9nZXRoZXIKK2EyZjYwOGY5IE1lcmdlICJNSVBTOiBNSVBTMzJyMTogT3B0aW1pemF0aW9uIG9mIGZ1bmN0aW9uIFdlYlBSZXNjYWxlckV4cG9ydFJvdy4gWzIvNl0iCis4ODIzMDg1NCBNSVBTOiBNSVBTMzJyMTogT3B0aW1pemF0aW9uIG9mIGZ1bmN0aW9uIFdlYlBSZXNjYWxlckV4cG9ydFJvdy4gWzIvNl0KK2M1YTViMDI4IGRlY29kZSBtdCtpbmNyZW1lbnRhbDogZml4IHNlZ2ZhdWx0IGluIGRlYnVnIGJ1aWxkcworOTg4MmIyZjkgYWx3YXlzIHVzZSBmYXN0LWFuYWx5c2lzIGZvciBhbGwgbWV0aG9kcy4KKzAwMGFkYWMwIE1lcmdlICJhdXRvY29uZjogdXBkYXRlIGF4X3B0aHJlYWQubTQiCisyZDJmYzM3ZCB1cGRhdGUgLmdpdGlnbm9yZQorNWJmNDI1NWEgTWVyZ2UgIk1ha2UgaXQgcG9zc2libGUgdG8gYXZvaWQgYXV0b21hZ2ljIGRlcGVuZGVuY2llcyIKK2MxY2IxOTMzIGRpc2FibGUgTkVPTiBmb3IgYXJtNjQgcGxhdGZvcm0KKzczYTMwNGU5IE1ha2UgaXQgcG9zc2libGUgdG8gYXZvaWQgYXV0b21hZ2ljIGRlcGVuZGVuY2llcworNGQ0OTNmOGQgTUlQUzogTUlQUzMycjE6IERlY29kZXIgYml0IHJlYWRlciBmdW5jdGlvbiBvcHRpbWl6ZWQuIFBBVENIIFsxLzZdCitjNzQxMTgzYyBtYWtlIFdlYlBDbGVhbnVwVHJhbnNwYXJlbnRBcmVhIHdvcmsgd2l0aCBhcmdiIHBpY3R1cmUKKzVkYTE4NTUyIGFkZCBhIGRlY29kaW5nIG9wdGlvbiB0byBmbGlwIGltYWdlIHZlcnRpY2FsbHkKKzAwYzNjNGUxIE1lcmdlICJhZGQgbWFuL3Z3ZWJwLjEiCisyYzZiYjQyOCBhZGQgbWFuL3Z3ZWJwLjEKK2VhNTlhOGU5IE1lcmdlICJNZXJnZSB0YWcgJ3YwLjQuMCciCis3NTc0YmVkNCBmaXggY29tbWVudHMgcmVsYXRlZCB0byBhcnJheSBzaXplcworMGI1YTkwZmQgZHdlYnAuMTogZml4IG9wdGlvbiBmb3JtYXR0aW5nCitlZmZjYjBmZCBNZXJnZSB0YWcgJ3YwLjQuMCcKKzdjNzYyNTVkIGF1dG9jb25mOiB1cGRhdGUgYXhfcHRocmVhZC5tNAorZmZmMmExMWIgbWFrZSAtc2hvcnQgd29yayB3aXRoIC1wcmludF9zc2ltLCAtcHJpbnRfcHNuciwgZXRjLgorNjhlNzkwMWQgdXBkYXRlIENoYW5nZUxvZyAodGFnOiB2MC40LjAtcmMxLCB0YWc6IHYwLjQuMCwgb3JpZ2luLzAuNC4wLCAwLjQuMCkKKzI1NmU0MzMzIHVwZGF0ZSBORVdTIGRlc2NyaXB0aW9uIHdpdGggbmV3IGdlbmVyYWwgZmVhdHVyZXMKKzI5NjI1MzQwIE1lcmdlICJnaWYyd2VicDogZG9uJ3QgdXNlIEM5OSAlenUiIGludG8gMC40LjAKKzNiOWY5ZGQwIGdpZjJ3ZWJwOiBkb24ndCB1c2UgQzk5ICV6dQorYjViMmUzYzcgY3dlYnA6IGZpeCBtZXRhZGF0YSBvdXRwdXQgdy9sb3NzeSthbHBoYQorYWQyNmRmMWEgbWFrZWZpbGUudW5peDogY2xlYW4gdXAgbGliZ2lmMndlYnBfdXRpbC5hCitjM2I0NTU3MCB1cGRhdGUgQ2hhbmdlbG9nCitjYTg0MTEyMSBNZXJnZSAiYnVtcCB2ZXJzaW9uIHRvIDAuNC4wIiBpbnRvIDAuNC4wCis4YzUyNGRiOCBidW1wIHZlcnNpb24gdG8gMC40LjAKK2VlYzIzOThjIHVwZGF0ZSBBVVRIT1JTICYgLm1haWxtYXAKK2I5YmJmNmExIHVwZGF0ZSBORVdTIGZvciAwLjQuMAorYzcyZTA4MTEgTWVyZ2UgImRlYy93ZWJwLmM6IGRvbid0IHdhaXQgZm9yIGRhdGEgYmVmb3JlIHJlcG9ydGluZyB3L2giCis1YWQ2NTMxNCBkZWMvZnJhbWUuYzogZml4IGZvcm1hdHRpbmcKK2Y3ZmM0YmM4IGRlYy93ZWJwLmM6IGRvbid0IHdhaXQgZm9yIGRhdGEgYmVmb3JlIHJlcG9ydGluZyB3L2gKKzY2YTMyYWY1IE1lcmdlICJORU9OIHNwZWVkIHVwIgorMjZkODQyZWIgTkVPTiBzcGVlZCB1cAorZjMwN2Y5OGIgTWVyZ2UgIndlYnBtdXg6IGxldCAtLSBzdG9wIHBhcmFtZXRlciBwYXJzaW5nIgorZmUwNTFkYTcgTWVyZ2UgIlJFQURNRTogYWRkIGEgc2VjdGlvbiBvbiBnaWYyd2VicCIKKzZmZDJiZDYyIE1lcmdlICJtYW5wYWdlIHBlZGFudHJ5IgorNGFmMTkwMDcgUkVBRE1FOiBhZGQgYSBzZWN0aW9uIG9uIGdpZjJ3ZWJwCis2ZjM2YWRlOSBtYW5wYWdlIHBlZGFudHJ5CitmOTAxNmNiOSBSRUFETUU6IHVwZGF0ZSBkd2VicCBvcHRpb25zCitiNGZhMGE0NyB3ZWJwbXV4OiBsZXQgLS0gc3RvcCBwYXJhbWV0ZXIgcGFyc2luZworYTlhMjBhY2YgZ2lmMndlYnA6IEFkZCBhIG11bHRpLXRocmVhZGVkIGVuY29kZSBvcHRpb24KKzQ5NWJlZjQxIGZpeCBidWcgaW4gVHJlbGxpc1F1YW50aXplCis2MDVhNzEyNyBzaW1wbGlmeSBfX2NwbHVzcGx1cyBpZmRlZgorMzMxMDlmOTkgTWVyZ2UgImRyb3A6IGlmZGVmIF9fY3BsdXNwbHVzIGNoZWNrcyBmcm9tIEMgZmlsZXMiCis3ZjlkZTBiOSBNZXJnZSBjaGFuZ2VzIEk5OTRhNTU4NyxJODQ2N2JiNzEsSTEzYjUwNjg4LEkxZTJjOWM3YgorNTQ1OTAzMGIgZ2lmMndlYnA6IGxldCAtLSBzdG9wIHBhcmFtZXRlciBwYXJzaW5nCithNGIwYWEwNiB2d2VicDogbGV0IC0tIHN0b3AgcGFyYW1ldGVyIHBhcnNpbmcKKzk4YWY2OGZlIGN3ZWJwOiBsZXQgLS0gc3RvcCBwYXJhbWV0ZXIgcGFyc2luZworYTMzODMxZTIgZHdlYnA6IGxldCAtLSBzdG9wIHBhcmFtZXRlciBwYXJzaW5nCiszNjMwMTI0OSBhZGQgc29tZSBjaGVja3Mgb24gZXJyb3IgcGF0aHMKK2NlNGM3MTM5IE1lcmdlICJhdXRvY29uZjogYWRkIC0tZGlzYWJsZS13aWMiCis1MjI3ZDk5MSBkcm9wOiBpZmRlZiBfX2NwbHVzcGx1cyBjaGVja3MgZnJvbSBDIGZpbGVzCitmNjQ1MzU1OSBkd2VicC4xOiBmaXggdHlwbworZjkxMDM0ZjIgTWVyZ2UgImN3ZWJwOiBwcmludCBtZXRhZGF0YSBzdGF0cyB3aGVuIG5vIG91dHB1dCBmaWxlIGlzIGdpdmVuIgorZDQ5MzQ1NTMgZ2lmMndlYnA6IEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgZm9yIGdpZmxpYiB2ZXJzaW9uIDw9IDQuMS4zCis0YzYxN2QzMiBnaWYyd2VicDogRGlzYWJsZSBvdXRwdXQgb2YgSUNDIHByb2ZpbGUgYnkgZGVmYXVsdAorNzNiNzMxZmIgaW50cm9kdWNlIGEgc3BlY2lhbCBxdWFudGl6YXRpb24gZnVuY3Rpb24gZm9yIFdIVAorNDFjMGNjNGIgTWFrZSBGb3J3YXJkIFdIVCB0cmFuc2Zvcm0gdXNlIDMyYml0IGZpeGVkLXBvaW50IGNhbGN1bGF0aW9uCithMzM1OWY1ZCBPbmx5IGNvbXB1dGUgcXVhbnRpemF0aW9uIHBhcmFtcyBvbmNlCis3MDQ5MDQzNyBjd2VicDogcHJpbnQgbWV0YWRhdGEgc3RhdHMgd2hlbiBubyBvdXRwdXQgZmlsZSBpcyBnaXZlbgorZDUxM2JiNjIgKiBmaXggb2ZmLWJ5LW9uZSB6dGhyZXNoIGNhbGN1bGF0aW9uICogcmVtb3ZlIHRoZSBzaGFycGVuaW5nIGZvciBub24gbHVtYS1BQyBjb2VmZnMgKiBhZGp1c3QgdGhlIGJpYXMgYSBsaXR0bGUgYml0IHRvIGNvbXBlbnNhdGUgZm9yIHRoaXMKK2FkOWRlYzBjIE1lcmdlICJjb3NtZXRpY3M6IGR3ZWJwOiBmaXggbG9jYWwgZnVuY3Rpb24gbmFtZSBmb3JtYXQiCitmNzM3ZjAzNyBNZXJnZSAiZHdlYnA6IHJlbW92ZSBhIGRlYWQgc3RvcmUiCiszYzNhNzBkYSBNZXJnZSAibWFrZWZpbGUudW5peDogaW5zdGFsbCBiaW5hcmllcyBpbiAkKERFU1RESVIpL2Jpbi8iCisxNTBiNjU1ZiBNZXJnZSAiQW5kcm9pZC5tazogYWRkIHNvbWUgcmVsZWFzZSBjb21waWxlIGZsYWdzIgorZGJlYmQzM2IgY29zbWV0aWNzOiBkd2VicDogZml4IGxvY2FsIGZ1bmN0aW9uIG5hbWUgZm9ybWF0CisyNzc0OTk1MSBkd2VicDogcmVtb3ZlIGEgZGVhZCBzdG9yZQorYTAxZTA0ZmUgYXV0b2NvbmY6IGFkZCAtLWRpc2FibGUtd2ljCis1MDA5YjIyNyBtYWtlZmlsZS51bml4OiBpbnN0YWxsIGJpbmFyaWVzIGluICQoREVTVERJUikvYmluLworYmFiMzBmY2EgTWVyZ2UgImZpeCAtcHJpbnRfcHNuciAvIHNzaW0gb3B0aW9ucyIKK2ViZWY3ZmIzIGZpeCAtcHJpbnRfcHNuciAvIHNzaW0gb3B0aW9ucworY2I2Mzc4NTUgTWVyZ2UgImZpeCBidWcgZHVlIHRvIG92ZXJ6ZWFsb3VzIGNoZWNrIGluIFdlYlBQaWN0dXJlWVVWQVRvQVJHQigpIgorODE4OTg4NWIgTWVyZ2UgIkVzdGltYXRlQmVzdEZpbHRlcjogdXNlIGFuIGludCB0byBpdGVyYXRlIFdFQlBfRklMVEVSX1RZUEUiCis0YWQ3ZDMzNSBBbmRyb2lkLm1rOiBhZGQgc29tZSByZWxlYXNlIGNvbXBpbGUgZmxhZ3MKK2MxMmUyMzY5IGNvc21ldGljczogZml4IGEgZmV3IHR5cG9zCis2ZjEwNDAzNCBmaXggYnVnIGR1ZSB0byBvdmVyemVhbG91cyBjaGVjayBpbiBXZWJQUGljdHVyZVlVVkFUb0FSR0IoKQorM2Y2YzM1YzYgRXN0aW1hdGVCZXN0RmlsdGVyOiB1c2UgYW4gaW50IHRvIGl0ZXJhdGUgV0VCUF9GSUxURVJfVFlQRQorY2M1NTc5MGUgTWVyZ2UgY2hhbmdlcyBJOGJiN2E0ZGMsSTJjMTgwMDUxLEkwMjFhMDE0ZixJOGEyMjRhNjIKK2M1MzZhZmI1IE1lcmdlICJjb3NtZXRpY3M6IGZpeCBzb21lIHR5cG9zIgorY2JkZDNlNmUgYWRkIGEgLWRpdGhlciBkaXRoZXJpbmcgb3B0aW9uIHRvIHRoZSBkZWNvZGVyCitlODEyNDAxMiBVcGRhdGVkIGlvc2J1aWxkLnNoIGZvciBYQ29kZSA1LngKKzQ5MzFjMzI5IGNvc21ldGljczogZml4IHNvbWUgdHlwb3MKKzA1YWFjZjc3IG11eDogYWRkIHNvbWUgbWlzc2luZyBjYXN0cworNjE3ZDkzNDggZW5jL3ZwOGw6IGFkZCBhIG1pc3NpbmcgY2FzdAorNDZkYjI4NjUgaWRlYzogYWRkIHNvbWUgbWlzc2luZyBjYXN0cworYjUyNGUzMzYgRXJyb3JTdGF0dXNMb3NzbGVzczogY29ycmVjdCByZXR1cm4gdHlwZQorY2IyNjFmNzkgZml4IGEgZGVzY2FsaW5nIGJ1ZyBmb3IgdmVydGljYWwvaG9yaXpvbnRhbCBVL1YgaW50ZXJwb2xhdGlvbgorYmNiMzk1NWMgTWVyZ2UgY2hhbmdlcyBJNDg5Njg0NjgsSTE4MWJjNzM2Cis3M2Y1MjEzMyBnaWYyd2VicDogQWRkIGEgbWl4ZWQgY29tcHJlc3Npb24gbW9kZQorNjE5ODcxNWUgZGVtdXg6IHNwbGl0IGNodW5rIHBhcnNpbmcgZnJvbSBQYXJzZVZQOFgKK2QyZTNmNGU2IGRlbXV4OiBhZGQgYSB0YWlsIHBvaW50ZXIgZm9yIGNodW5rcworODdjZmZjYzMgZGVtdXg6IGNvc21ldGljczogcy9oYXNfZnJhbWVzL2lzX2FuaW1hdGlvbi8KK2UxOGU2Njc3IGRlbXV4OiBzdHJpY3RseSBlbmZvcmNlIHRoZSBhbmltYXRpb24gZmxhZworYzRmMzlmNGEgZGVtdXg6IGNvc21ldGljczogcmVtb3ZlIGEgdXNlbGVzcyBicmVhaworNjFjYjg4NGQgZGVtdXg6IChub24tZXhwKSBmYWlsIGlmIHRoZSBmcmFnbWVudGVkIGZsYWcgaXMgc2V0CitmZjM3OWRiMyBmZXcgJSBzcGVlZHVwIG9mIGxvc3NsZXNzIGVuY29kaW5nCitkZjM2NDlhMiByZW1vdmUgYWxsIGRpc2FibGVkIGNvZGUgcmVsYXRlZCB0byBQLWZyYW1lcworNmQwY2IzZGUgTWVyZ2UgImdpZjJ3ZWJwOiBrbWluID0gMCBzaG91bGQgc3VwcHJlc3Mga2V5LWZyYW1lIGFkZGl0aW9uLiIKKzM2NTU1OTgzIGdpZjJ3ZWJwOiBrbWluID0gMCBzaG91bGQgc3VwcHJlc3Mga2V5LWZyYW1lIGFkZGl0aW9uLgorNzcwOGU2MDkgTWVyZ2UgImRldGVjdCBmbGF0bmVzcyBpbiBibG9ja3MgYW5kIGZhdm9yIERDIHByZWRpY3Rpb24iCiswNmIxNTAzZSBNZXJnZSAiYWRkIGNvbW1lbnQgYWJvdXQgdGhlIGtMZXZlbHNGcm9tRGVsdGFbXVtdIExVVCBnZW5lcmF0aW9uIgorNTkzNTI1OWMgYWRkIGNvbW1lbnQgYWJvdXQgdGhlIGtMZXZlbHNGcm9tRGVsdGFbXVtdIExVVCBnZW5lcmF0aW9uCitlMzMxMmVhNiBkZXRlY3QgZmxhdG5lc3MgaW4gYmxvY2tzIGFuZCBmYXZvciBEQyBwcmVkaWN0aW9uCitlYmM5YjFlZSBNZXJnZSAiVlBMQml0UmVhZGVyIGJ1Z2ZpeDogQ2F0Y2ggZXJyb3IgaWYgYml0X3BvcyA+IExCSVRTIHRvby4iCis5NmFkMGUwYSBWUExCaXRSZWFkZXIgYnVnZml4OiBDYXRjaCBlcnJvciBpZiBiaXRfcG9zID4gTEJJVFMgdG9vLgorYTAxNGU5YzkgdHVuZSBxdWFudGl6YXRpb24gYmlhc2VzIHRvd2FyZCBoaWdoZXIgcHJlY2lzaW9uCisxZTg5ODYxOSBhZGQgaGVscGZ1bCBQcmludEJsb2NrSW5mbygpIGZ1bmN0aW9uCis1OTZhNmQ3MyBtYWtlIHVzZSBvZiAnZXh0ZXJuJyBjb25zaXN0ZW50IGluIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucworYzhkNDhjNmUgTWVyZ2UgImV4dHJhY3QgcmFuZG9tIHV0aWxzIHRvIHRoZWlyIG93biBmaWxlIHV0aWwvcmFuZG9tLltjaF0iCis5OGFhMzNjZiBleHRyYWN0IHJhbmRvbSB1dGlscyB0byB0aGVpciBvd24gZmlsZSB1dGlsL3JhbmRvbS5bY2hdCis0MzJhNzIzZSBNZXJnZSAic3dpZzogYWRkIGJhc2ljIGdvIGJpbmRpbmdzIgorZmFiNjE4YjUgTWVyZ2UgInJlbmFtZSBsaWJ3ZWJwLmkgLT4gbGlid2VicC5zd2lnIgorZTRlN2ZjZDYgc3dpZzogYWRkIGJhc2ljIGdvIGJpbmRpbmdzCitkMzQwODcyMCBNZXJnZSAiZmFzdCBhdXRvLWRldGVybWluZWQgZmlsdGVyaW5nIHN0cmVuZ3RoIgorZjhiZmQ1Y2QgZmFzdCBhdXRvLWRldGVybWluZWQgZmlsdGVyaW5nIHN0cmVuZ3RoCithYzBiZjk1MSBzbWFsbCBjbGVhbi11cCBpbiBFeHBhbmRNYXRyaXgoKQorMTkzOTYwN2UgcmVuYW1lIGxpYndlYnAuaSAtPiBsaWJ3ZWJwLnN3aWcKKzQzMTQ4YjZjIGZpbHRlcmluZzogcHJlY29tcHV0ZSBpbGltaXQgYW5kIGhldl90aHJlc2hvbGQKKzE4Zjk5MmVjIHNpbXBsaWZ5IGZfaW5uZXIgY2FsY3VsYXRpb24gYSBsaXR0bGUKKzI0MWQxMWYxIGFkZCBtaXNzaW5nIGNvbnN0Cis4NmMwMDMxZSBhZGQgYSAnZm9ybWF0JyBmaWVsZCB0byBXZWJQQml0c3RyZWFtRmVhdHVyZXMKK2RkZTkxZmRlIERlbXV4OiBDb3JyZWN0IHRoZSBleHRlbmRlZCBmb3JtYXQgdmFsaWRhdGlvbgorNWQ2YzViZDIgYWRkIGVudHJ5IGZvciAnLXJlc2l6ZScgb3B0aW9uIGluIGN3ZWJwJ3MgbWFuCis3YzA5OGQxOCBVc2Ugc29tZSBnYW1tYS1jdXJ2ZSByYW5nZSBjb21wcmVzc2lvbiB3aGVuIGNvbXB1dGluZyBVL1YgYXZlcmFnZQorMGIyYjA1MDQgVXNlIGRldGVybWluaXN0aWMgcmFuZG9tLWRpdGhlcmluZyBkdXJpbmcgUkdCLT5ZVVYgY29udmVyc2lvbgorOGEyZmEwOTkgQWRkIGEgc2Vjb25kIG11bHRpLXRocmVhZCBtZXRob2QKKzdkNmYyZGEwIE1lcmdlICJ1cCB0byAyMCUgZmFzdGVyIG11bHRpLXRocmVhZGVkIGRlY29kaW5nIgorMjY2ZjYzZWEgTWVyZ2UgImxpYndlYnAuamFyOiBidWlsZCB3L0phdmEgMS42IGZvciBBbmRyb2lkIGNvbXBhdCIKKzA1MzIxNDljIHVwIHRvIDIwJSBmYXN0ZXIgbXVsdGktdGhyZWFkZWQgZGVjb2RpbmcKKzM4ZWZkYzJlIFNpbXBsaWZ5IHRoZSBnaWYyd2VicCB0b29sOiBtb3ZlIHRoZSBvcHRpbWl6YXRpb24gZGV0YWlscyB0byB1dGlsCitkZTg5OTUxNiBsaWJ3ZWJwLmphcjogYnVpbGQgdy9KYXZhIDEuNiBmb3IgQW5kcm9pZCBjb21wYXQKK2NiMjIxNTUyIERlY29kZSBhIGZ1bGwgcm93IG9mIGJpdHN0cmVhbSBiZWZvcmUgcmVjb25zdHJ1Y3RpbmcKK2RjYThhNGQzIE1lcmdlICJORU9OL3NpbXBsZSBsb29wZmlsdGVyOiBhdm9pZCBxNC1xNyByZWdpc3RlcnMiCis5ZTg0ZDkwMSBNZXJnZSAiTkVPTi9UcmFuc2Zvcm1XSFQ6IGF2b2lkIHE0LXE3IHJlZ2lzdGVycyIKK2ZjMTAyNDliIE5FT04vc2ltcGxlIGxvb3BmaWx0ZXI6IGF2b2lkIHE0LXE3IHJlZ2lzdGVycworMmYwOWQ2M2UgTkVPTi9UcmFuc2Zvcm1XSFQ6IGF2b2lkIHE0LXE3IHJlZ2lzdGVycworNzc1ODVhMmIgTWVyZ2UgInVzZSBhIG1hY3JvZnVuYyBmb3Igc2V0dGluZyBOekNvZWZmcyBiaXRzIgorZDE1NTUwN2MgTWVyZ2UgInVzZSBISU5UX0dSQVBIIGFzIGltYWdlX2hpbnQgZm9yIGdpZiBzb3VyY2UiCis5YzU2MTY0NiBNZXJnZSAib25seSBwcmludCBHSUZfRElTUE9TRV9XQVJOSU5HIG9uY2UiCiswNTg3OTg2NSB1c2UgSElOVF9HUkFQSCBhcyBpbWFnZV9oaW50IGZvciBnaWYgc291cmNlCiswYjI4ZDdhYiB1c2UgYSBtYWNyb2Z1bmMgZm9yIHNldHRpbmcgTnpDb2VmZnMgYml0cworZjliYmMyYTAgU3BlY2lhbC1jYXNlIHNwYXJzZSB0cmFuc2Zvcm0KKzAwMTI1MTk2IGdpZjJ3ZWJwOiBkZXRlY3QgYW5kIGZsYXR0ZW4gdW5pZm9ybWx5IHNpbWlsYXIgYmxvY2tzCiswZGVhZjBmYSBvbmx5IHByaW50IEdJRl9ESVNQT1NFX1dBUk5JTkcgb25jZQorNmE4YzBlYjcgTWVyZ2UgInNtYWxsIG9wdGltaXphdGlvbiBpbiBzZWdtZW50LXNtb290aGluZyBsb29wIgorZjcxNDZiYzEgc21hbGwgb3B0aW1pemF0aW9uIGluIHNlZ21lbnQtc21vb3RoaW5nIGxvb3AKKzVhNzUzM2NlIHNtYWxsIGdpZjJ3ZWJwIGZpeAorNGRmMGM4OWUgTWVyZ2UgY2hhbmdlcyBJYzY5NzY2MGMsSTI3Mjg1NTIxCis1YjJlNmJkMyBBbmRyb2lkLm1rOiBhZGQgYSBkd2VicCB0YXJnZXQKK2Y5MTBhODRlIEFuZHJvaWQubWs6IHVwZGF0ZSBidWlsZCBmbGFncworNjNmOWFiYTQgc3BlY2lhbC1jYXNlIFdIVCB0cmFuc2Zvcm0gd2hlbiB0aGVyZSdzIG9ubHkgREMKKzgwOTExYWVmIE1lcmdlICI3LTglIGZhc3RlciBkZWNvZGluZyBieSByZXdyaXRpbmcgR2V0Q29lZmZzKCkiCis2MDZjNDMwNCBnaWYyd2VicDogSW1wcm92ZWQgY29tcHJlc3Npb24gZm9yIGxvc3N5IGFuaW1hdGVkIFdlYlAKK2ZiODg3ZjdmIGdpZjJ3ZWJwOiBEaWZmZXJlbnQga21pbi9rbWF4IGRlZmF1bHRzIGZvciBsb3NzeSBhbmQgbG9zc2xlc3MKKzJhOTgxMzY2IDctOCUgZmFzdGVyIGRlY29kaW5nIGJ5IHJld3JpdGluZyBHZXRDb2VmZnMoKQorOTJkNDdlNGMgaW1wcm92ZSBWUDhMIHNpZ25hdHVyZSBkZXRlY3Rpb24gYnkgY2hlY2tpbmcgdGhlIHZlcnNpb24gYml0cyB0b28KKzVjZDQzZTQzIEFkZCAtaW5jcmVtZW50YWwgb3B0aW9uIHRvIGR3ZWJwCis1NGI4ZTNmNiB3ZWJwbXV4OiBEaXNwbGF5SW5mbygpOiByZW1vdmUgdW5uZWNlc3NhcnkgZXJyb3IgY2hlY2tzLgorNDBhZTM1MjAgZml4IG1lbWxlYWsgaW4gV2ViUElEZWxldGUoKQorZDk2NjI2NTggbXV4LmggZG9jOiBXZWJQTXV4R2V0RnJhbWUoKSBjYW4gcmV0dXJuIFdFQlBfTVVYX01FTU9SWV9FUlJPUiB0b28uCiswZTY3NDdmOCB3ZWJwbXV4IC1pbmZvOiBkaXNwbGF5IGRpbWVuc2lvbnMgYW5kIGhhc19hbHBoYSBwZXIgZnJhbWUKK2Q3OGE4MmM0IFNhbml0eSBjaGVjayBmb3IgdW5kZXJmbG93Cis4NDk4ZjRiZiBNZXJnZSAicmVtb3ZlIC1Xc2hhZG93IHdhcm5pbmdzIgorZTg5YzZmYzggQXZvaWQgYSBwb3RlbnRpYWwgbWVtbGVhaworM2ViZTE3NTcgTWVyZ2UgImJyZWFrIGRvd24gdGhlIHByb2JhIDRELWFycmF5IGludG8gc29tZSBoYW5keSBzdHJ1Y3RzIgorNmE0NDU1MGEgYnJlYWsgZG93biB0aGUgcHJvYmEgNEQtYXJyYXkgaW50byBzb21lIGhhbmR5IHN0cnVjdHMKKzJmNWU4OTM0IHJlbW92ZSAtV3NoYWRvdyB3YXJuaW5ncworYmYzYTI5YjMgTWVyZ2UgImFkZCBwcm9wZXIgV0VCUF9IQVZFX0dJRiBhbmQgV0VCUF9IQVZFX0dMIGZsYWdzIgorMmIwYTc1OTMgTWVyZ2UgImZpeCBzb21lIHdhcm5pbmdzIGZyb20gc3RhdGljIGFuYWx5c2lzIgorMjJkZDA3Y2UgbXV4Lmg6IFNvbWUgZG9jIGNvcnJlY3Rpb25zCis3OWZmMDM0NiBhZGQgcHJvcGVyIFdFQlBfSEFWRV9HSUYgYW5kIFdFQlBfSEFWRV9HTCBmbGFncworZDUxZjQ1ZjAgZml4IHNvbWUgd2FybmluZ3MgZnJvbSBzdGF0aWMgYW5hbHlzaXMKK2QxMzQzMDdiIGZpeCBjb252ZXJzaW9uIHdhcm5pbmcgb24gTVNWQworZDUzOGNlYTggZ2lmMndlYnA6IFN1cHBvcnQgYSAnbWluJyBhbmQgJ21heCcgIGtleSBmcmFtZSBpbnRlcnZhbAorODBiNTRlMWMgYWxsb3cgc2VhcmNoIHdpdGggdG9rZW4gYnVmZmVyIGxvb3AgYW5kIGZpeCBQQVJUSVRJT04wIHByb2JsZW0KK2I3ZDRlMDQyIGFkZCBWUDhFc3RpbWF0ZVRva2VuU2l6ZSgpCisxMGZkZGY1MyBlbmMvcXVhbnQuYzogc2lsZW5jZSBhIHdhcm5pbmcKKzM5OWNkNDU2IE1lcmdlICJmaXggY29tcGlsZSBlcnJvciBvbiBBUk0vZ2NjIgorOWYyNDUxOWUgZW5jb2RlcjogbWlzYyByYXRlLXJlbGF0ZWQgZml4ZXMKK2M2NjNiYjIxIE1lcmdlICJzaW1wbGlmeSBWUDhJdGVyYXRvclNhdmVCb3VuZGFyeSgpIGFyZyBwYXNzaW5nIgorZmE0NmIzMTIgRGVtdXguaDogQ29ycmVjdCBhIG1ldGhvZCBuYW1lIHJlZmVyZW5jZQorZjgzOThjOWQgZml4IGNvbXBpbGUgZXJyb3Igb24gQVJNL2djYworZjY5MWYwZTQgc2ltcGxpZnkgVlA4SXRlcmF0b3JTYXZlQm91bmRhcnkoKSBhcmcgcGFzc2luZworNDI1NDJiZTggdXAgdG8gNiUgZmFzdGVyIGVuY29kaW5nIHdpdGggY2xhbmcgY29tcGlsZXIKKzkzNDAyZjAyIG11bHRpLXRocmVhZGVkIHNlZ21lbnQgYW5hbHlzaXMKKzdlMmQ2NTk1IE1lcmdlICJyZW1vdmUgdGhlIFBBQ0soKSBiaXQtcGFja2luZyB0cmlja3MiCitjMTNmZWNmOSByZW1vdmUgdGhlIFBBQ0soKSBiaXQtcGFja2luZyB0cmlja3MKKzJmZDA5MWM5IE1lcmdlICJ1c2UgTlVMTCBmb3IgbGZfc3RhdHNfIHRlc3RpbmcsIG5vdCBib29sIgorYjExYzlkNjIgZHdlYnA6IHVzZSBkZWZhdWx0IGRjdF9tZXRob2QKKzRiYjg0NjVmIE1lcmdlICIoZGUpbXV4Lmg6IHdyYXAgcHNldWRvLWNvZGUgaW4gLyogKi8iCitjZmI1NmIxNyBtYWtlIC1wYXNzIG9wdGlvbiB3b3JrIHdpdGggdG9rZW4gYnVmZmVycworNTQxNmFhYjQgKGRlKW11eC5oOiB3cmFwIHBzZXVkby1jb2RlIGluIC8qICovCiszNWRiYTMzNyB1c2UgTlVMTCBmb3IgbGZfc3RhdHNfIHRlc3RpbmcsIG5vdCBib29sCis3MzNhN2ZhYSBlbmMtPkl0ZXJhdG9yIG1lbW9yeSBjbGVhbnVwCitlODFmYWM4NiBBZGQgc3VwcG9ydCBmb3IgIm5vIGJsZW5kIiBpbiB3ZWJwbXV4IGJpbmFyeQorM2I4MGJjNDggZ2lmMndlYnA6IFNlcGFyYXRlIG91dCBlYWNoIHN0ZXAgaW50byBhIG1ldGhvZAorYmVmN2U5Y2MgQWRkIGRvYyBwcmVjaXNpb24gYWJvdXQgZGVtdXggb2JqZWN0IGtlZXBpbmcgcG9pbnRlcnMgdG8gZGF0YS4KKzYxNDA1YTE0IGR3ZWJwOiBlbmFibGUgc3Rkb3V0IG91dHB1dCB3aXRoIFdJQworNmVhYmI4ODYgTWVyZ2UgIkFuaW1hdGVkIFdlYlA6IGFkZCAiZG8gbm8gYmxlbmQiIG9wdGlvbiB0byBzcGVjIgorYmUyMGRlY2IgZml4IGNvbXBpbGF0aW9uIGZvciBCSVRTIDI0CitlNThjYzEzNyBNZXJnZSAiZHdlYnA6IHMvdW5zaWduZWQgY2hhci91aW50OF90LyIKKzcyNTAxZDQzIGR3ZWJwOiBzL3Vuc2lnbmVkIGNoYXIvdWludDhfdC8KKzJjOTYzM2U4IE1lcmdlICJnaWYyd2VicDogSW5zZXJ0IGluZGVwZW5kZW50IGZyYW1lcyBhdCByZWd1bGFyIGludGVydmFscy4iCitmMGQ2YTE0YiBnaWYyd2VicDogSW5zZXJ0IGluZGVwZW5kZW50IGZyYW1lcyBhdCByZWd1bGFyIGludGVydmFscy4KK2IyNWE2ZmJmIHl1di5oOiBmaXggaW5kZW50CitlZGUzNjAyZSBNZXJnZSAiY29zbWV0aWNzOiBmaXggaW5kZW50IgorM2E2NTEyMmEgZHdlYnA6IGZpeCBzdGRvdXQgcmVsYXRlZCBvdXRwdXQKKzM4OGE3MjQ5IGNvc21ldGljczogZml4IGluZGVudAorNGM3MzIyYzggTWVyZ2UgImRzcDogbXN2YyBjb21wYXRpYmlsaXR5IgorZDUwYzdlMzIgTWVyZ2UgIjUtNyUgZmFzdGVyIFNTRTIgdmVyc2lvbnMgb2YgWVVWLT5SR0IgY29udmVyc2lvbiBmdW5jdGlvbnMiCitiOGFiNzg0NyBNZXJnZSAic2ltcGxpZnkgdXBzYW1wbGVyIGNhbGxzOiBvbmx5IGFsbG93ICdib3R0b20nIHRvIGJlIE5VTEwiCitkZjZjZWJmYSA1LTclIGZhc3RlciBTU0UyIHZlcnNpb25zIG9mIFlVVi0+UkdCIGNvbnZlcnNpb24gZnVuY3Rpb25zCithZDZhYzMyZCBzaW1wbGlmeSB1cHNhbXBsZXIgY2FsbHM6IG9ubHkgYWxsb3cgJ2JvdHRvbScgdG8gYmUgTlVMTAorYTVlOGFmYWYgb3V0cHV0IHRvIHN0ZG91dCBpZiBmaWxlIG5hbWUgaXMgIi0iCitmMzU4NDUwZiBkc3A6IG1zdmMgY29tcGF0aWJpbGl0eQorNDNhN2M4ZWIgTWVyZ2UgImNvc21ldGljcyIKKzRjNWYxOWMxIE1lcmdlICJiaXRfcmVhZGVyLmg6IGNvc21ldGljcyIKK2Y3MmZhYjcwIGNvc21ldGljcworMTRkZDVlNzggZml4IGNvbnN0LW5lc3MKK2IyMGFlYzQ5IE1lcmdlICJTdXBwb3J0IGZvciAnZG8gbm90IGJsZW5kJyBvcHRpb24gaW4gdndlYnAiCitkY2Y2NTIyMiBTdXBwb3J0IGZvciAnZG8gbm90IGJsZW5kJyBvcHRpb24gaW4gdndlYnAKK2Q1YmFkMDMzIEFuaW1hdGVkIFdlYlA6IGFkZCAiZG8gbm8gYmxlbmQiIG9wdGlvbiB0byBzcGVjCithMmY1ZjczZCBNZXJnZSAiU3VwcG9ydCBmb3IgIkRvIG5vdCBibGVuZCIgaW4gbXV4IGFuZCBkZW11eCBsaWJyYXJpZXMiCitlMDgxZjJmMyBQYWNrIGNvZGUgJiBleHRyYV9iaXRzIHRvIFN0cnVjdCAoVlA4TFByZWZpeENvZGUpLgorNjI4NDg1NGIgU3VwcG9ydCBmb3IgIkRvIG5vdCBibGVuZCIgaW4gbXV4IGFuZCBkZW11eCBsaWJyYXJpZXMKK2Y0ODZhYWE5IE1lcmdlICJzbGlnaHRseSBmYXN0ZXIgUGFyc2VJbnRyYU1vZGUiCitkMTcxODYzMiBzbGlnaHRseSBmYXN0ZXIgUGFyc2VJbnRyYU1vZGUKKzNjZWNhOGFkIGJpdF9yZWFkZXIuaDogY29zbWV0aWNzCis2OTI1N2Y3MCBDcmVhdGUgTFVUIGZvciBQcmVmaXhFbmNvZGUuCis5ODhiNzA4NCBhZGQgV2ViUFdvcmtlckV4ZWN1dGUoKSBmb3IgY29udmVuaWVudCBieXBhc3MKKzA2ZTI0OTg3IE1lcmdlICJWUDhFbmNJdGVyYXRvciBjbGVhbi11cCIKK2RlNGQ0YWQ1IFZQOEVuY0l0ZXJhdG9yIGNsZWFuLXVwCis3YmJlOTUyOSBNZXJnZSAiY29zbWV0aWNzOiB0aHJlYWQuYzogZHJvcCBhIHJlZHVuZGFudCBjb21tZW50IgorZGE0MTE0ODUgY29zbWV0aWNzOiB0aHJlYWQuYzogZHJvcCBhIHJlZHVuZGFudCBjb21tZW50CitmZWI0YjZlNiB0aHJlYWQuaDogI2lmZGVmIHdoZW4gY2hlY2tpbmcgV0VCUF9VU0VfVEhSRUFECis4OTI0YTNhNyB0aHJlYWQuYzogZHJvcCBXZWJQV29ya2VyIHByZWZpeCBmcm9tIHN0YXRpYyBmdW5jcworMWFlZDhmMmEgTWVyZ2UgImZpeCBpbmRlbnQiCis0MDM4ZWQxNSBmaXggaW5kZW50CisxNjkzZmQ5YiBEZW11eDogQSBuZXcgc3RhdGUgV0VCUF9ERU1VWF9QQVJTRV9FUlJPUgorOGRjYWU4YjMgZml4IHJlc2NhbGluZy13aXRoLWFscGhhIGluYWNjdXJhY3kKKzExMjQ5YWJmIE1lcmdlIGNoYW5nZXMgSTliNGRjMzZjLEk0ZTBlZWY0ZAorNTI1MDhhMWYgTXV4OiBzdXBwb3J0IHBhcnNpbmcgdW5rbm93biBjaHVua3Mgd2l0aGluIGEgZnJhbWUvZnJhZ21lbnQuCiswNWRiMDU3MiBXZWJQTXV4U2V0Q2h1bms6IHJlbW92ZSB1bnVzZWQgdmFyaWFibGUKKzhiYTFiZjYxIFN0cmljdGVyIGNoZWNrIGZvciBwcmVzZW5jZSBvZiBhbHBoYSB3aGVuIHdyaXRpbmcgbG9zc2xlc3MgaW1hZ2VzCithMDNjMzUxNiBEZW11eDogV2ViUEl0ZXJhdG9yIG5vdyBhbHNvIGRlbm90ZXMgaWYgdGhlIGZyYW1lIGhhcyBhbHBoYS4KKzZkZjc0M2EzIERlY29kZXI6IGhhbmRsZSBmcmFnbWVudHMgY2FzZSBjb3JyZWN0bHkgdG9vLgorZmFhNGIwN2UgU3VwcG9ydCBmb3IgdW5rbm93biBjaHVua3MgaW4gbXV4IGxpYnJhcnkKKzdkNjBiYmM2IFNwZWVkIHVwIEhhc2hDaGFpbkZpbmRDb3B5IGZ1bmN0aW9uLgorNjY3NDAxNDAgU3BlZWR1cCBBbHBoYSBwbGFuZSBlbmNvZGluZy4KK2I3MzQ2YTFlIDAuMSAlIHNwZWVkdXAgdG8gZGVjb2RpbmcKK2M2MDYxODJlIHdlYnAtY29udGFpbmVyLXNwZWM6IFRpZ2h0ZW4gbGFuZ3VhZ2UgYWRkZWQgYnkgbGFzdAorYTM0YTUwMjkgcG5nZGVjOiBvdXRwdXQgZXJyb3IgbWVzc2FnZXMgZnJvbSBsaWJwbmcKK2U4NGM2MjVkIE1lcmdlICJEZXRlY3QgY2FudmFzIGFuZCBpbWFnZSBzaXplIG1pc21hdGNoIGluIGRlY29kZXIuIgorZjYyNmZlMmUgRGV0ZWN0IGNhbnZhcyBhbmQgaW1hZ2Ugc2l6ZSBtaXNtYXRjaCBpbiBkZWNvZGVyLgorZjVmYmRlZTAgZGVtdXg6IHN0cmljdGVyIGltYWdlIGJvdW5kcyBjaGVjaworMzBjODE1OGEgYWRkIGV4dHJhIGFzc2VydCBpbiBIdWZmbWFuIGRlY29kZSBjb2RlCis4OTY3YjlmMyBTU0UyIGZvciBsb3NzbGVzcyBkZWNvZGluZyAoY3JpdGljYWwpIGZ1bmN0aW9ucy4KKzY5OWQ4MGVhIEp1bXAtbG9va3VwIGZvciBIdWZmbWFuIGNvZGluZworYzM0MzA3YWIgZml4IHNvbWUgVlM5IHdhcm5pbmdzIGFib3V0IHR5cGUgY29udmVyc2lvbgorZWVhZGEzNWMgcG5nZGVjOiBhZGQgbWlzc2luZyBpbmNsdWRlCis1NGI2NTEwOCBnaWYyd2VicDogSWYgYWxpZ25pbmcgdG8gZXZlbiBvZmZzZXRzLCBleHRyYSBwaXhlbHMgc2hvdWxkIGJlIHRyYW5zcGFyZW50CiswYmNmNWNlMyBNZXJnZSAicmVtb3ZlIGEgbWFsbG9jKCkgaW4gY2FzZSB3ZSdyZSB1c2luZyBvbmx5IEZJTFRFUl9OT05FIGZvciBhbHBoYSIKKzJjMDcxNDNiIHJlbW92ZSBhIG1hbGxvYygpIGluIGNhc2Ugd2UncmUgdXNpbmcgb25seSBGSUxURVJfTk9ORSBmb3IgYWxwaGEKK2E0ZDVmNTlkIEZhc3RlciBsb3NzbGVzcyBkZWNvZGluZworZmQ1M2JiNzUgTWVyZ2UgImFsdGVybmF0ZSBMVVQtYmFzZSByZXZlcnNlLWJpdHMgY29kZSIKK2QxYzE2NmVmIE1lcmdlICJDb250YWluZXIgc3BlYzogYSBjbGFyaWZpY2F0aW9uIG9uIGJhY2tncm91bmQgY29sb3IuIgorZmRiOTE3NzkgUmVuYW1lIGEgbWV0aG9kCis1ZTk2NzUzMiBDb250YWluZXIgc3BlYzogYSBjbGFyaWZpY2F0aW9uIG9uIGJhY2tncm91bmQgY29sb3IuCiszMGU3N2QwZiBNZXJnZSBicmFuY2ggJzAuMy4wJworMWI2MzFlMjkgYWx0ZXJuYXRlIExVVC1iYXNlIHJldmVyc2UtYml0cyBjb2RlCisyNGNjMzA3YSB+MjAlIGZhc3RlciBsb3NzbGVzcyBkZWNvZGluZworMzEzZDg1M2YgU3BlZWR1cCBmb3IgZGVjb2RpbmcgbG9zc2xlc3MgV2ViUCBwaG90b2dyYXBoczoKKzI0ZWUwOThhIGNoYW5nZSB0aGUgYnl0ZXNfcGVyX3BpeGVsc18gZmllbGQgaW50byBtb3JlIGV2b2NhdGl2ZSB1c2VfOGJfZGVjb2RlCisyYTA0YjAzNCB1cGRhdGUgQ2hhbmdlTG9nICh0YWc6IHYwLjMuMS1yYzIsIHRhZzogdjAuMy4xKQorNzI4ODk1MGIgUmVncmVzc2lvbiBmaXggZm9yIGFscGhhIGNoYW5uZWxzIHVzaW5nIGNvbG9yIGNhY2hlOgorMmUzNzdiNTMgd2ljZGVjOiBzaWxlbmNlIGEgZm9ybWF0IHdhcm5pbmcKK2FkOWU0MmE2IG11eGVkaXQ6IHNpbGVuY2Ugc29tZSB1bmluaXRpYWxpemVkIHdhcm5pbmdzCiszMzA3YzE2MyBEb24ndCBzZXQgYWxwaGEtY2hhbm5lbCB0byAweGZmIGZvciBhbHBoYS0+Z3JlZW4gdXBsaWZ0Cis1MTMwNzcwYyBNZXJnZSAid2ljZGVjOiBzaWxlbmNlIGEgZm9ybWF0IHdhcm5pbmciCithMzdlZmY0NyBSZWdyZXNzaW9uIGZpeCBmb3IgYWxwaGEgY2hhbm5lbHMgdXNpbmcgY29sb3IgY2FjaGU6CisyNDFjZjk5YiBNZXJnZSAibXV4ZWRpdDogc2lsZW5jZSBzb21lIHVuaW5pdGlhbGl6ZWQgd2FybmluZ3MiCitjOGY5Yzg0ZCBSZWdyZXNzaW9uIGZpeCBmb3IgYWxwaGEgdW5maWx0ZXJpbmc6CisxNGNkNWM2YyBtdXhlZGl0OiBzaWxlbmNlIHNvbWUgdW5pbml0aWFsaXplZCB3YXJuaW5ncworYTM2OGRiODEgZGVjL3ZwOGw6IHF1aWV0IHZzOSB4NjQgdHlwZSBjb252ZXJzaW9uIHdhcm5pbmcKK2ZmYWU5ZjMxIHdpY2RlYzogc2lsZW5jZSBhIGZvcm1hdCB3YXJuaW5nCis4Y2YwNzAxZSBBbHBoYSBlbmNvZGluZzogbmV2ZXIgZmlsdGVyIGluIGNhc2Ugb2YgTk9fQ09NUFJFU1NJT04KKzgyNWU3M2IxIHVwZGF0ZSBDaGFuZ2VMb2cgKHRhZzogdjAuMy4xLXJjMSkKK2FiZjZmNjkxIHVwZGF0ZSBORVdTCis1YTkyYzFhNSBidW1wIHZlcnNpb24gdG8gMC4zLjEKKzg2ZGFmNzdjIHN0b3JlIHRvcCBZL1UvViBzYW1wbGVzIGluIHBhY2tlZCBmYXNoaW9uCis2N2JjMzUzZSBSZXZlcnQgImFkZCBXZWJQQmxlbmRBbHBoYSgpIGZ1bmN0aW9uIHRvIGJsZW5kIGNvbG9ycyBhZ2FpbnN0IGJhY2tncm91bmQiCiswNjhkYjU5ZSBJbnRlcnR3aW5lZCBkZWNvZGluZyBvZiBhbHBoYSBhbmQgUkdCCiszOGNjMDExNCBTaW1wbGlmeSBmb3J3YXJkLVdIVCArIFNTRTIgdmVyc2lvbgorM2ZhNTk1YTUgU3VwcG9ydCBkZWNvZGluZyB1cHRvIGdpdmVuIHJvdyBpbiBERUNPREVfREFUQV9GVU5DCis1MjBmMDA1ZiBEZXF1YW50aXplTGV2ZWxzKCk6IEFkZCAncm93JyBhbmQgJ251bV9yb3dzJyBhcmdzCis0NzM3NGI4MiBBbHBoYSB1bmZpbHRlciBmb3IgZ2l2ZW4gc2V0IG9mIHJvd3MKK2YzMjA5N2UwIHByb2JlIGlucHV0IGZpbGUgYW5kIHF1aWNrLWNoZWNrIGZvciBXZWJQIGZvcm1hdC4KK2EyYWVkMWQwIGNvbmZpZ3VyZTogaW1wcm92ZSBnbC9nbHV0IGxpYnJhcnkgdGVzdAorYzdlODljYmIgdXBkYXRlIGNvcHlyaWdodCB0ZXh0CithMDAzODBkMiBjb25maWd1cmU6IHJlbW92ZSB1c2Ugb2YgQVNfVkFSX0FQUEVORAorYTk0YTg4ZGQgZml4IEVYSUYgcGFyc2luZyBpbiBQTkcKK2E3MWU1ZDg0IGFkZCBkb2MgcHJlY2lzaW9uIGZvciBXZWJQUGljdHVyZUNvcHkoKSBhbmQgV2ViUFBpY3R1cmVWaWV3KCkKKzgyODcwMTJlIHJlbW92ZSBkYXRhdHlwZSBxdWFsaWZpZXIgZm9yIHZtbnYKK2UxOTA4NDMwIGZpeCBhIG1lbW9yeSBsZWFrIGluIGdpZjJ3ZWJwCiswYjE4YjllZSBmaXggdHdvIG1pbm9yIG1lbW9yeSBsZWFrcyBpbiB3ZWJwbXV4CitkYjUwOTVkNSByZW1vdmUgc29tZSBjcnVmdCBmcm9tIHN3aWcvbGlid2VicC5qYXIKKzg1MGU5NTZmIFJFQURNRTogdXBkYXRlIHN3aWcgbm90ZXMKK2JkZGQ5YjBhIHN3aWcvcHl0aG9uOiBhZGQgbWluaW1hbCBkb2N1bWVudGF0aW9uCitkNTczYThkNSBzd2lnOiBhZGQgcHl0aG9uIGVuY29kZSBzdXBwb3J0Cis2YjkzMTg3NSBzd2lnL2phdmE6IHJlZHVjZSB3cmFwcGVyIGZ1bmN0aW9uIGNvZGUgZHVwbGljYXRpb24KKzZmZTUzNmY0IHN3aWcvamF2YTogcmV3b3JrIHVpbnQ4X3QgdHlwZW1hcAorYTJlYTQ2NDMgRml4IHRoZSBidWcgaW4gQXBwbHlQYWxldHRlLgorN2JiMjhkMmEgd2VicC9sb3NzbGVzczogZml4IGJpZyBlbmRpYW4gQkdSQSBvdXRwdXQKK2YwMzZkNGJmIFNwZWVkIHVwIEFwcGx5UGFsZXR0ZSBmb3IgQVJHQiBwaXhlbHMuCis4MTEyYzhjZiByZW1vdmUgc29tZSB3YXJuaW5nczoKK2NjMTI4ZTBiIEZ1cnRoZXIgcmVkdWNlIG1lbW9yeSB0byBkZWNvZGUgbG9zc3krYWxwaGEgaW1hZ2VzCiswN2RiNzBkMiBmaXggZm9yIGJpZy1lbmRpYW4KK2VkYThhN2RlIGdpZjJ3ZWJwOiBGaXggc2lnbmVkL3Vuc2lnbmVkIGNvbXBhcmlzb24gbWlzbWF0Y2gKKzMxZjM0NmZlIE1ha2VmaWxlLnZjOiBmaXggbGlid2VicGRlbXV4IGRsbCB2YXJpYWJsZSB0eXBvCis2Yzc2ZDI4ZSBzd2lnOiBhZGQgcHl0aG9uIChkZWNvZGUpIHN1cHBvcnQKK2I0ZjViYjZjIHN3aWc6IGNvc21ldGljcworNDk4ZDRkZDYgV2ViUC1Mb3NzbGVzcyBlbmNvZGluZyBpbXByb3ZlbWVudHMuCisyNmU3MjQ0MiBzd2lnOiBpZmRlZiBzb21lIEphdmEgc3BlY2lmaWMgY29kZQorOGVjZWM2ODYgY29uZmlndXJlOiBhZGQgd2FybmluZyByZWxhdGVkIGZsYWdzCitlNjc2YjA0MyBjb25maWd1cmU6IGFkZCBHTFVUIGRldGVjdGlvbjsgYnVpbGQgdndlYnAKK2IwZmZjNDM3IEFscGhhIGRlY29kaW5nOiBzaWduaWZpY2FudGx5IHJlZHVjZSBtZW1vcnkgdXNhZ2UKKzIwYWE3YThkIGNvbmZpZ3VyZTogYWRkIC0tZW5hYmxlLWV2ZXJ5dGhpbmcKK2I4MzA3Y2MwIGNvbmZpZ3VyZS5hYzogYWRkIHNvbWUgaGVscGVyIG1hY3JvcworOTgwZTdhZTkgUmVtb3ZlIHRoZSBnY2MgY29tcGlsYXRpb24gY29tbWVudHMKKzdmMjVmZjk5IGdpZjJ3ZWJwOiBGaXggSUNDIGFuZCBYTVAgc3VwcG9ydAorZDhlNTMyMTEgQWRkIG1pc3NpbmcgbmFtZSB0byBBVVRIT1JTCisxMWVkZjVlMiBEZW11eDogRml4IGEgcG90ZW50aWFsIG1lbWxlYWsKK2M3YjkyMTg0IGRvbid0IGZvcndhcmQgZGVjbGFyZSBlbnVtcworN2E2NTBjNmEgcHJldmVudCBzaWduZWQgaW50IG92ZXJmbG93IGluIGxlZnQgc2hpZnQgb3BzCiszMWJlYTMyNCBhZGQgcHJlY2lzaW9uIGFib3V0IGR5bmFtaWMgb3V0cHV0IHJlYWxsb2NhdGlvbiB3aXRoIElEZWNvZGVyCitjMjI4NzdmNyBBZGQgaW5jcmVtZW50YWwgc3VwcG9ydCBmb3IgZXh0ZW5kZWQgZm9ybWF0IGZpbGVzCis1MDUxMjQ1ZiBNYWtlZmlsZS52YzogaGF2ZSAnYWxsJyB0YXJnZXQgYnVpbGQgZXZlcnl0aGluZworODE5MWRlY2EgTWFrZWZpbGUudmM6IGZsYWdzIGNsZWFudXAKK2I5ZDc0NzM1IE1ha2VmaWxlLnZjOiBkcm9wIC9GRCBmbGFnCis1NTY4ZGJjZiB1cGRhdGUgZ2l0aWdub3JlCitmNGM3YjY1NCBXZWJQRW5jb2RlOiBBbiBhZGRpdGlvbmFsIGNoZWNrLiBTdGFydCBWUDhFbmNMb29wL1ZQOEVuY1Rva2VuTG9vcCBvbmx5IGlmIFZQOEVuY1N0YXJ0QWxwaGEgc3VjY2VlZGVkLgorMWZiMDRiZWMgcG5nZGVjOiBBdm9pZCBhIGRvdWJsZS1mcmVlLgorZGNiYjFjYTUgYWRkIFdlYlBCbGVuZEFscGhhKCkgZnVuY3Rpb24gdG8gYmxlbmQgY29sb3JzIGFnYWluc3QgYmFja2dyb3VuZAorYmM5ZjVmYmUgY29uZmlndXJlLmFjOiBhZGQgQU1fUFJPR19BUiBmb3IgYXV0b21ha2UgPj0gMS4xMgorYmY4NjdiZjIgVHVuZWQgY3Jvc3NfY29sb3IgcGFyYW1ldGVyIChzdGVwKSBmb3IgbG93ZXIgcXVhbAorOTBlMmVjNWEgTWVyZ2UgInByb2JlIGlucHV0IGZpbGUgYW5kIHF1aWNrLWNoZWNrIGZvciBXZWJQIGZvcm1hdC4iCis3MTgwZDdmZiBNZXJnZSAidXBkYXRlIGNvcHlyaWdodCB0ZXh0IgorODMwZjcyYjcgcHJvYmUgaW5wdXQgZmlsZSBhbmQgcXVpY2stY2hlY2sgZm9yIFdlYlAgZm9ybWF0LgorMmNjZjU4ZDYgY29uZmlndXJlOiBpbXByb3ZlIGdsL2dsdXQgbGlicmFyeSB0ZXN0CitkNjQwNjE0ZCB1cGRhdGUgY29weXJpZ2h0IHRleHQKK2MyMTEzYWQ0IE1lcmdlICJjb25maWd1cmU6IHJlbW92ZSB1c2Ugb2YgQVNfVkFSX0FQUEVORCIKKzkzMjZhNTZmIGNvbmZpZ3VyZTogcmVtb3ZlIHVzZSBvZiBBU19WQVJfQVBQRU5ECitlYTYzZDYxOSBmaXggYSB0eXBlIHdhcm5pbmcgb24gVlM5IHg4NgorYmVjMTEwOTIgZml4IEVYSUYgcGFyc2luZyBpbiBQTkcKK2I2ZTY1ZjNkIE1lcmdlICJmaXggd2FybmluZ3MgZm9yIHZzOSB4NjQiCis0Mzg5NDZkYyBmaXggd2FybmluZ3MgZm9yIHZzOSB4NjQKK2Y0NzEwZTNiIGNvbGxlY3QgbWFjcm9ibG9jayByZWNvbnN0cnVjdGlvbiBkYXRhIGluIFZQOE1CRGF0YSBzdHJ1Y3QKKzIzZDI4ZTIxIGFkZCBkb2MgcHJlY2lzaW9uIGZvciBXZWJQUGljdHVyZUNvcHkoKSBhbmQgV2ViUFBpY3R1cmVWaWV3KCkKKzUxOGYyY2Q3IGNvc21ldGljczogZ2lmMndlYnA6IGZpeCBpbmRlbnQKK2FmMzU4ZTY4IE1lcmdlICJyZW1vdmUgZGF0YXR5cGUgcXVhbGlmaWVyIGZvciB2bW52IgorM2ZlOTE2MzUgcmVtb3ZlIGRhdGF0eXBlIHF1YWxpZmllciBmb3Igdm1udgorNzY0ZmRmZmEgZml4IGEgbWVtb3J5IGxlYWsgaW4gZ2lmMndlYnAKKzNlNTlhNzRkIGZpeCB0d28gbWlub3IgbWVtb3J5IGxlYWtzIGluIHdlYnBtdXgKKzQ3Yjk4NjJmIE1lcmdlICJSRUFETUU6IHVwZGF0ZSBzd2lnIG5vdGVzIgorMzI1ZDE1ZmYgcmVtb3ZlIHNvbWUgY3J1ZnQgZnJvbSBzd2lnL2xpYndlYnAuamFyCis0YTc2MjdjMiBSRUFETUU6IHVwZGF0ZSBzd2lnIG5vdGVzCis1ZGE4MWUzMyBNZXJnZSAic3dpZy9weXRob246IGFkZCBtaW5pbWFsIGRvY3VtZW50YXRpb24iCitmMzllMDhmMiBNZXJnZSAic3dpZzogYWRkIHB5dGhvbiBlbmNvZGUgc3VwcG9ydCIKKzZjYTRhM2UzIE1lcmdlICJzd2lnL2phdmE6IHJlZHVjZSB3cmFwcGVyIGZ1bmN0aW9uIGNvZGUgZHVwbGljYXRpb24iCis4Zjg3MDJiMCBNZXJnZSAic3dpZy9qYXZhOiByZXdvcmsgdWludDhfdCB0eXBlbWFwIgorOTE0MTNiZTIgcmVkdWNlIG1lbW9yeSBmb3IgVlA4TUIgYW5kIHJlbW92ZSBiaXRmaWVsZHMgdXNlCis3NDEzMzk0ZSBGaXggdGhlIG1lbW9yeSBsZWFrIGluIEFwcGx5RmlsdGVycy4KKzIwNTNjMmNmIHNpbXBsaWZ5IHRoZSBhbHBoYS1maWx0ZXIgdGVzdGluZyBsb29wCis4MjViNjRkYiBzd2lnL3B5dGhvbjogYWRkIG1pbmltYWwgZG9jdW1lbnRhdGlvbgorMTQ2NzdlMTEgc3dpZzogYWRkIHB5dGhvbiBlbmNvZGUgc3VwcG9ydAorYTVjMjk3Yzggc3dpZy9qYXZhOiByZWR1Y2Ugd3JhcHBlciBmdW5jdGlvbiBjb2RlIGR1cGxpY2F0aW9uCithZDRhMzY3ZCBzd2lnL2phdmE6IHJld29yayB1aW50OF90IHR5cGVtYXAKKzBkMjU4NzZiIHVzZSB1aW50OF90IGZvciBpbnZfcGFsZXR0ZVtdCithZmEzNDUwYyBGaXggdGhlIGJ1ZyBpbiBBcHBseVBhbGV0dGUuCisyZDZhYzQyMiBNZXJnZSAid2VicC9sb3NzbGVzczogZml4IGJpZyBlbmRpYW4gQkdSQSBvdXRwdXQiCisyY2E4Mzk2OCB3ZWJwL2xvc3NsZXNzOiBmaXggYmlnIGVuZGlhbiBCR1JBIG91dHB1dAorNzQyMTEwY2MgU3BlZWQgdXAgQXBwbHlQYWxldHRlIGZvciBBUkdCIHBpeGVscy4KKzI0NTFlNDdkIG1pc2MgY29kZSBjbGVhbnVwCis4M2RiNDA0MyBNZXJnZSAic3dpZzogYWRkIHB5dGhvbiAoZGVjb2RlKSBzdXBwb3J0IgorZWVlZWE4YjUgTWVyZ2UgInN3aWc6IGNvc21ldGljcyIKK2Q1ZjliOGYzIE1lcmdlICJsaWJ3ZWJwOiBmaXggdnA4IGVuY29kZXIgbWVtIGFsbG9jIG9mZnNldHRpbmciCitkOGVkZDgzNSBsaWJ3ZWJwOiBmaXggdnA4IGVuY29kZXIgbWVtIGFsbG9jIG9mZnNldHRpbmcKKzg5ODNiODNlIHJlbW92ZSB1c2Ugb2YgYml0LWZpZWxkcyBpbiBWUDhGSW5mbworODdhNGZjYTIgcmVtb3ZlIHNvbWUgd2FybmluZ3M6CitiYThmNzRlMiBNZXJnZSAiZml4IGZvciBiaWctZW5kaWFuIgorYTY1MDY3ZmEgTWVyZ2UgIkZ1cnRoZXIgcmVkdWNlIG1lbW9yeSB0byBkZWNvZGUgbG9zc3krYWxwaGEgaW1hZ2VzIgorNjRjODQ0ODYgRnVydGhlciByZWR1Y2UgbWVtb3J5IHRvIGRlY29kZSBsb3NzeSthbHBoYSBpbWFnZXMKKzMzMjEzMGI5IE11eDogbWFrZSBhIGZldyBtZXRob2RzIHN0YXRpYworNDQzNzA2MTcgZml4IGZvciBiaWctZW5kaWFuCis1MTk5ZWFiNSBNZXJnZSAiYWRkIHVuY29tcHJlc3NlZCBUSUZGIG91dHB1dCBzdXBwb3J0IgorYTNhZWRlOTcgYWRkIHVuY29tcHJlc3NlZCBUSUZGIG91dHB1dCBzdXBwb3J0CitmOTc1YjY3ZiBNZXJnZSAiZ2lmMndlYnA6IEZpeCBzaWduZWQvdW5zaWduZWQgY29tcGFyaXNvbiBtaXNtYXRjaCIKKzVmYmM3MzRiIE1lcmdlICJHZXRGZWF0dXJlczogRGV0ZWN0IGludmFsaWQgVlA4WC9WUDgvVlA4TCBkYXRhIgorZDUwNjBjODcgTWVyZ2UgIm11eC5oOiBBIGNvbW1lbnQgZml4ICsgc29tZSBjb25zaXN0ZW5jeSBmaXhlcyIKKzM1MmQwZGVlIEdldEZlYXR1cmVzOiBEZXRlY3QgaW52YWxpZCBWUDhYL1ZQOC9WUDhMIGRhdGEKKzNlZjc5ZmVmIENvc21ldGljOiAid2lkdGggKiBoZWlnaHQiCiswNDNlMWFlNCBnaWYyd2VicDogRml4IHNpZ25lZC91bnNpZ25lZCBjb21wYXJpc29uIG1pc21hdGNoCis1ODE4Y2ZmNyBtdXguaDogQSBjb21tZW50IGZpeCArIHNvbWUgY29uc2lzdGVuY3kgZml4ZXMKKzExNTNmODg4IE1lcmdlICJzd2lnOiBpZmRlZiBzb21lIEphdmEgc3BlY2lmaWMgY29kZSIKKzNlZWVkYWUxIE1ha2VmaWxlLnZjOiBmaXggbGlid2VicGRlbXV4IGRsbCB2YXJpYWJsZSB0eXBvCitmOTgwZmFmNCBzd2lnOiBhZGQgcHl0aG9uIChkZWNvZGUpIHN1cHBvcnQKKzdmNWY0MmJiIHN3aWc6IGNvc21ldGljcworOGVhZTE4OGEgV2ViUC1Mb3NzbGVzcyBlbmNvZGluZyBpbXByb3ZlbWVudHMuCitjNzI0N2M0YyBzd2lnOiBpZmRlZiBzb21lIEphdmEgc3BlY2lmaWMgY29kZQorNGNiMjM0ZDUgTWVyZ2UgIk11eDogbWFrZSBWYWxpZGF0ZUZvclNpbmdsZUltYWdlKCkgbWV0aG9kIHN0YXRpYyIKK2VkNmY1MzA4IE1lcmdlICJBZGQgR2V0Q2FudmFzU2l6ZSgpIG1ldGhvZCB0byBtdXgiCisxZDUzMGM5YSBNdXg6IG1ha2UgVmFsaWRhdGVGb3JTaW5nbGVJbWFnZSgpIG1ldGhvZCBzdGF0aWMKK2JiYTRjMmIyIGNvbmZpZ3VyZTogYWRkIHdhcm5pbmcgcmVsYXRlZCBmbGFncworZmZmZWZkMTggQWRkIEdldENhbnZhc1NpemUoKSBtZXRob2QgdG8gbXV4Cis3MzJkYThkMCBNZXJnZSAiY29uZmlndXJlOiBhZGQgR0xVVCBkZXRlY3Rpb247IGJ1aWxkIHZ3ZWJwIgorMGU1MTNmN2EgY29uZmlndXJlOiBhZGQgR0xVVCBkZXRlY3Rpb247IGJ1aWxkIHZ3ZWJwCis1NWQxYzE1MCBNZXJnZSAiQWxwaGEgZGVjb2Rpbmc6IHNpZ25pZmljYW50bHkgcmVkdWNlIG1lbW9yeSB1c2FnZSIKKzEzZDk5ZmI1IE1lcmdlICJjb25maWd1cmU6IGFkZCAtLWVuYWJsZS1ldmVyeXRoaW5nIgorMmJmNjk4ZmUgTWVyZ2UgImNvbmZpZ3VyZS5hYzogYWRkIHNvbWUgaGVscGVyIG1hY3JvcyIKK2VkY2NkMTk0IEFscGhhIGRlY29kaW5nOiBzaWduaWZpY2FudGx5IHJlZHVjZSBtZW1vcnkgdXNhZ2UKKzNjYWZjYzlhIGNvbmZpZ3VyZTogYWRkIC0tZW5hYmxlLWV2ZXJ5dGhpbmcKKzRlZjE0NDc3IGNvbmZpZ3VyZS5hYzogYWRkIHNvbWUgaGVscGVyIG1hY3JvcworYTRlMWNkYmIgUmVtb3ZlIHRoZSBnY2MgY29tcGlsYXRpb24gY29tbWVudHMKKzYzOTNmZTRiIENvc21ldGljIGZpeGVzCis5YzRjZTk3MSBTaW1wbGlmeSBmb3J3YXJkLVdIVCArIFNTRTIgdmVyc2lvbgorODc4YjlkYTUgZml4IG1pc3NlZCBvcHRpbQorMDAwNDYxNzEgVlA4R2V0SW5mbygpOiBDaGVjayBmb3IgemVybyB3aWR0aCBvciBoZWlnaHQuCis5YmYzMTI5MyBhbGlnbiBWUDhFbmNvZGVyOjpuel8gYWxsb2NhdGlvbgorNWRhMTY1Y2YgZml4IENoZWNrTW9kZSgpIHNpZ25hdHVyZQorMGVjZTA3ZGMgTWVyZ2UgImV4cGxpY2l0bHkgcGFkIGJpdGZpZWxkcyB0byAzMi1iaXRzIgorOWRiYzlkMTkgZXhwbGljaXRseSBwYWQgYml0ZmllbGRzIHRvIDMyLWJpdHMKKzUzNjlhODBmIE1lcmdlICJwcmV2ZW50IHNpZ25lZCBpbnQgb3ZlcmZsb3cgaW4gbGVmdCBzaGlmdCBvcHMiCis3MGUzOTcxMiBNZXJnZSAiY29zbWV0aWNzOiByZW1vdmUgdW5uZWNlc3NhcnkgJzsncyIKK2QzMTM2Y2UyIE1lcmdlICJkb24ndCBmb3J3YXJkIGRlY2xhcmUgZW51bXMiCitiMjZlNWFkNSBnaWYyd2VicDogRml4IElDQyBhbmQgWE1QIHN1cHBvcnQKKzQ2MDg5YjIwIEFkZCBtaXNzaW5nIG5hbWUgdG8gQVVUSE9SUworOTQzMjhkNjQgRGVtdXg6IEZpeCBhIHBvdGVudGlhbCBtZW1sZWFrCis5NmU5NDhkNyBkb24ndCBmb3J3YXJkIGRlY2xhcmUgZW51bXMKK2Y0ZjkwODgwIHByZXZlbnQgc2lnbmVkIGludCBvdmVyZmxvdyBpbiBsZWZ0IHNoaWZ0IG9wcworMDI2MTU0NWUgY29zbWV0aWNzOiByZW1vdmUgdW5uZWNlc3NhcnkgJzsncworN2ViZGYxMTAgTWVyZ2UgIkZpeCBmZXcgbWlzc2luZyBjb21wYXJpc29ucyB0byBOVUxMIgorMTU3OTk4OWUgRml4IGZldyBtaXNzaW5nIGNvbXBhcmlzb25zIHRvIE5VTEwKK2VhMWIyMWNmIENsZWFuZWQgdXAgVlA4R2V0SGVhZGVycygpIHNvIHRoYXQgaXQgcGFyc2VzIG9ubHkgZnJhbWUgaGVhZGVyCitiNjZjYWVlNCBkd2VicDogYWRkIHN1cHBvcnQgZm9yIEJNUCBvdXRwdXQKK2ZmODg1YmZlIGFkZCBwcmVjaXNpb24gYWJvdXQgZHluYW1pYyBvdXRwdXQgcmVhbGxvY2F0aW9uIHdpdGggSURlY29kZXIKKzc5MjQxZDVhIE1lcmdlICJNYWtlZmlsZS52YzogaGF2ZSAnYWxsJyB0YXJnZXQgYnVpbGQgZXZlcnl0aGluZyIKK2FjMWM3MjliIE1lcmdlICJNYWtlZmlsZS52YzogZmxhZ3MgY2xlYW51cCIKKzExOGEwNTVjIE1lcmdlICJNYWtlZmlsZS52YzogZHJvcCAvRkQgZmxhZyIKK2VjYWQwMTA5IE1lcmdlICJ1cGRhdGUgZ2l0aWdub3JlIgorYTY4MWI0ZjQgUmVuYW1lIFBSRV9WUDggc3RhdGUgdG8gV0VCUF9IRUFERVIKK2VhZDRkNDc4IEFkZCBpbmNyZW1lbnRhbCBzdXBwb3J0IGZvciBleHRlbmRlZCBmb3JtYXQgZmlsZXMKKzY5ZDBmOTI2IE1ha2VmaWxlLnZjOiBoYXZlICdhbGwnIHRhcmdldCBidWlsZCBldmVyeXRoaW5nCis1Mjk2NzQ5OCBNYWtlZmlsZS52YzogZmxhZ3MgY2xlYW51cAorYzYxYmFmMGMgTWFrZWZpbGUudmM6IGRyb3AgL0ZEIGZsYWcKKzNhMTUxMjVkIHVwZGF0ZSBnaXRpZ25vcmUKKzUxNjdjYTQ3IE1lcmdlICJXZWJQRW5jb2RlOiBBbiBhZGRpdGlvbmFsIGNoZWNrLiBTdGFydCBWUDhFbmNMb29wL1ZQOEVuY1Rva2VuTG9vcCBvbmx5IGlmIFZQOEVuY1N0YXJ0QWxwaGEgc3VjY2VlZGVkLiIKKzY3NzA4ZDY3IFdlYlBFbmNvZGU6IEFuIGFkZGl0aW9uYWwgY2hlY2suIFN0YXJ0IFZQOEVuY0xvb3AvVlA4RW5jVG9rZW5Mb29wIG9ubHkgaWYgVlA4RW5jU3RhcnRBbHBoYSBzdWNjZWVkZWQuCitiNjg5MTJhZiBwbmdkZWM6IEF2b2lkIGEgZG91YmxlLWZyZWUuCis4MmFiYmUxMiBNZXJnZSAiY29uZmlndXJlLmFjOiBhZGQgQU1fUFJPR19BUiBmb3IgYXV0b21ha2UgPj0gMS4xMiIKK2U3ZDk1NDhjIGFkZCBXZWJQQmxlbmRBbHBoYSgpIGZ1bmN0aW9uIHRvIGJsZW5kIGNvbG9ycyBhZ2FpbnN0IGJhY2tncm91bmQKK2VkNGRjNzE3IGNvbmZpZ3VyZS5hYzogYWRkIEFNX1BST0dfQVIgZm9yIGF1dG9tYWtlID49IDEuMTIKK2RmNGE0MDZkIE1lcmdlIGJyYW5jaCAnMC4zLjAnCisxZTBkNGI4YyBVcGRhdGUgQ2hhbmdlTG9nICh0YWc6IHYwLjMuMC1yYzcsIHRhZzogdjAuMy4wKQorZDUyYjQwNWQgQ29zbWV0aWMgZml4ZXMKKzZjYjRhNjE4IG1pc2Mgc3R5bGUgZml4Cis2ODExMWFiMCBhZGQgbWlzc2luZyBZVVZBLT5BUkdCIGF1dG9tYXRpYyBjb252ZXJzaW9uIGluIFdlYlBFbmNvZGUoKQorZTlhNzk5MGIgQ29zbWV0aWMgZml4ZXMKKzQwM2JmZTgyIENvbnRhaW5lciBzcGVjOiBDbGFyaWZ5IGZyYW1lIGRpc3Bvc2FsCisyYWFhNDIzYiBNZXJnZSAiYWRkIG1pc3NpbmcgWVVWQS0+QVJHQiBhdXRvbWF0aWMgY29udmVyc2lvbiBpbiBXZWJQRW5jb2RlKCkiCiswN2Q4N2JkYSBhZGQgbWlzc2luZyBZVVZBLT5BUkdCIGF1dG9tYXRpYyBjb252ZXJzaW9uIGluIFdlYlBFbmNvZGUoKQorMTQyYzQ2MjkgbWlzYyBzdHlsZSBmaXgKKzNlN2ExM2EwIE1lcmdlICJDb250YWluZXIgc3BlYzogY2xhcmlmeSB0aGUgYmFja2dyb3VuZCBjb2xvciBmaWVsZCIgaW50byAwLjMuMAorMTRhZjc3NDUgY29udGFpbmVyIGRvYzogYWRkIGEgbm90ZSBhYm91dCB0aGUgJ0FOTUYnIHBheWxvYWQKK2NjNjM1ZWZhIENvbnRhaW5lciBzcGVjOiBjbGFyaWZ5IHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGZpZWxkCitlM2UzMzk0OSBjb250YWluZXIgZG9jOiBtb3ZlIFJJRkYgZGVzY3JpcHRpb24gdG8gb3duIHNlY3Rpb24KKzQyOTlmMzk4IGxpYndlYnAvbXV4OiBmaXggZG91YmxlIGZyZWUKKzMzZjlhNjkyIE1lcmdlICJkZW11eDoga2VlcCBhIGZyYW1lIHRhaWwgcG9pbnRlcjsgdXNlZCBpbiBBZGRGcmFtZSIgaW50byAwLjMuMAorYTJhN2I5NTkgdXNlIFdlYlBEYXRhQ29weSgpIGluc3RlYWQgb2YgcmUtY29kaW5nIGl0LgorNmYxOGYxMmYgZGVtdXg6IGtlZXAgYSBmcmFtZSB0YWlsIHBvaW50ZXI7IHVzZWQgaW4gQWRkRnJhbWUKK2U1YWY0OWU5IGFkZCBkb2MgcHJlY2lzaW9uIGFib3V0IFdlYlBQYXJzZUhlYWRlcnMoKSByZXR1cm4gY29kZXMKK2RiNDZkYWFiIE1lcmdlICJNYWtlZmlsZS52YzogZml4IGR5bmFtaWMgYnVpbGRzIiBpbnRvIDAuMy4wCis1M2M3N2FmYyBNZXJnZSAiZ2lmMndlYnA6IEJnY29sb3IgZml4IGZvciBhIHNwZWNpYWwgY2FzZSIgaW50byAwLjMuMAorYTVlYmQxNDMgZ2lmMndlYnA6IEJnY29sb3IgZml4IGZvciBhIHNwZWNpYWwgY2FzZQorNjM3OGYyMzggTWVyZ2UgInZ3ZWJwL2FuaW1hdGlvbjogZml4IGJhY2tncm91bmQgZGlzcG9zZSIgaW50byAwLjMuMAorM2M4ZWI5YTggZml4IGJhZCBzYXR1cmF0aW9uIG9yZGVyIGluIFF1YW50aXplQmxvY2sKKzA0YzdhMmVjIHZ3ZWJwL2FuaW1hdGlvbjogZml4IGJhY2tncm91bmQgZGlzcG9zZQorODFhNTA2OTUgTWFrZWZpbGUudmM6IGZpeCBkeW5hbWljIGJ1aWxkcworNWYyNWMzOTYgdXBkYXRlIENoYW5nZUxvZyAodGFnOiB2MC4zLjAtcmM2KQorMTRkNDJhZjIgZXhhbXBsZXM6IGRvbid0IHVzZSBDOTkgJXp1Cis1Y2NmMWZlNSB1cGRhdGUgQ2hhbmdlTG9nCisyNTYwYzI0MyB1cGRhdGUgTkVXUworZjQzYmFmYzMgTWVyZ2UgY2hhbmdlcyBJZWNjY2IwOWMsSWY1ZWU5ZmQyLEkzZTE4MWNlNCBpbnRvIDAuMy4wCithNzg4NjQ0ZiBkd2VicDogd2FybiB3aGVuIGRlY29kaW5nIGFuaW1hdGVkIHdlYnAncworMzAyZWZjZGIgRGVjb2RlOiByZXR1cm4gbW9yZSBtZWFuaW5nZnVsIGVycm9yIGZvciBhbmltYXRpb24KK2FkNDUyNzM1IFdlYlBCaXRzdHJlYW1GZWF0dXJlczogYWRkIGhhc19hbmltYXRpb24gZmllbGQKKzc4M2RmYTQ5IGRpc2FibGUgRlJHTSBkZWNvZGluZyBmb3IgZ29vZCBpbiBsaWJ3ZWJwbXV4Cis0Yjk1NmJlMCBVcGRhdGUgQ2hhbmdlTG9nCithZDhiODZkNyB1cGRhdGUgTkVXUworM2UwODRmNjMgTWVyZ2UgImRlbXV4IGNvc21ldGljczogY29tbWVudHMvcmVuYW1lIGludGVybmFsIGZ1bmN0aW9uIiBpbnRvIDAuMy4wCitkM2Y4YzYyMSBNZXJnZSAibW92ZSBXZWJQRmVhdHVyZUZsYWdzIGRlY2xhcmF0aW9uIiBpbnRvIDAuMy4wCis3Mzg2ZmU1MCBNZXJnZSAibGlid2VicHtkZW11eCxtdXh9OiBpbnN0YWxsIG11eF90eXBlcy5oIiBpbnRvIDAuMy4wCitkNmNkNGU5MCBNZXJnZSAiYnVtcCBkZWNvZGUgYWJpIiBpbnRvIDAuMy4wCisxN2Y4ZGE1YyBidW1wIGRlY29kZSBhYmkKKzk3Njg0YWUyIE1lcmdlICJhZGQgZG9jIHByZWNpc2lvbiBhYm91dCBXZWJQRGVtdXhQYXJ0aWFsKCkiIGludG8gMC4zLjAKK2Y5MzNmZDJhIG1vdmUgV2ViUEZlYXR1cmVGbGFncyBkZWNsYXJhdGlvbgorMjg5YmM0N2IgbGlid2VicHtkZW11eCxtdXh9OiBpbnN0YWxsIG11eF90eXBlcy5oCisyMjRlOGQ0NiBhZGQgZG9jIHByZWNpc2lvbiBhYm91dCBXZWJQRGVtdXhQYXJ0aWFsKCkKKzRjMThlODBjIGRlbXV4IGNvc21ldGljczogY29tbWVudHMvcmVuYW1lIGludGVybmFsIGZ1bmN0aW9uCis3Y2ZkMWJmMSB1cGRhdGUgQVVUSE9SUworNDAxZjdiODUgTWVyZ2UgInNwZWVkLXVwIGxvc3NsZXNzICh+MyUpIHdpdGggYWQtaG9jIGhpc3RvZ3JhbSBjb3N0IGV2YWx1YXRpb24iIGludG8gMC4zLjAKKzFmYzhmZmNhIE1lcmdlICJtYWtlZmlsZS51bml4OiBkaXN0IHJlbGF0ZWQgY2hhbmdlcyIgaW50byAwLjMuMAorOGE4OWM2ZWQgTWVyZ2UgY2hhbmdlcyBJNDY2YzM3N2YsSWI3NjFlYmQzLEk2OTQ4NTdmYyBpbnRvIDAuMy4wCitmNGZmYjJkNSBzcGVlZC11cCBsb3NzbGVzcyAofjMlKSB3aXRoIGFkLWhvYyBoaXN0b2dyYW0gY29zdCBldmFsdWF0aW9uCis3MjM4NDdkNSBnaWYyd2VicDogb25seSB3cml0ZSBlcnJvciBtZXNzYWdlcyB0byBzdGRlcnIKKzcwMWI5ZTJhIG1ha2VmaWxlLnVuaXg6IGRpc3QgcmVsYXRlZCBjaGFuZ2VzCitiYjg1YjQzNyBNZXJnZSAidXBkYXRlIE5FV1MiIGludG8gMC4zLjAKKzU5NDIzYTI0IGdpZjJ3ZWJwOiBmaXggY3Jhc2ggb24gb3BlbiBmYWlsdXJlIHdpdGggbGliZ2lmNQorOWFjYjE3ZGUgZ2lmMndlYnA6IHNpbGVuY2UgYSB1bnVzZWQgcGFyYW0gd2FybmluZworN2Q5ZmRjMjMgTWVyZ2UgIlJFQURNRSB1cGRhdGVzIiBpbnRvIDAuMy4wCis1NjIxOTM0ZSBNZXJnZSAiYnVpbGQ6IGZpeCBpbnN0YWxsIHJhY2Ugb24gc2hhcmVkIGhlYWRlcnMiIGludG8gMC4zLjAKKzcwODA5ZDg5IE1lcmdlICJidW1wIHZlcnNpb24gdG8gMC4zLjAiIGludG8gMC4zLjAKK2Q4NTFjZDFkIGRlbXV4OiBtYWtlIHRoZSBwYXJzZSBhIGJpdCBtb3JlIHN0cmljdAorMjhiYjQxMDcgdXBkYXRlIE5FV1MKK2NlZjkzODgyIGJ1bXAgdmVyc2lvbiB0byAwLjMuMAorOTA0ODQ5NGQgYnVpbGQ6IGZpeCBpbnN0YWxsIHJhY2Ugb24gc2hhcmVkIGhlYWRlcnMKKzFlNjdlOGVmIFJFQURNRSB1cGRhdGVzCis0MmI2MTFhNCBNZXJnZSAiY29uZmlndXJlOiBkcm9wIGV4cGVyaW1lbnRhbCBmcm9tIG11eC9kZW11eCIgaW50byAwLjMuMAorMDk2YThlMzIgTWVyZ2UgInZ3ZWJwOiBhZGQgY29sb3IgcHJvZmlsZSBzdXBwb3J0IiBpbnRvIDAuMy4wCitkZGZlZTVkYyB2d2VicDogYWRkIGNvbG9yIHByb2ZpbGUgc3VwcG9ydAorMGQ2OTI3ZDMgTWVyZ2UgIk1hcmsgZnJhZ21lbnQgb3B0aW9ucyBhcyBleHBlcmltZW50YWwgaW4gd2VicG11eCIgaW50byAwLjMuMAorNWRiZDQwMzAgTWFyayBmcmFnbWVudCBvcHRpb25zIGFzIGV4cGVyaW1lbnRhbCBpbiB3ZWJwbXV4CithMGE2NjQ4YyBjb25maWd1cmU6IGRyb3AgZXhwZXJpbWVudGFsIGZyb20gbXV4L2RlbXV4CitlZTY1YmFkOCBNZXJnZSAiYWRkIHN1cHBvcnQgZm9yIEJJVFMgPiAzMiIgaW50byAwLjMuMAorNzQ0OTMwZGIgYWRkIHN1cHBvcnQgZm9yIEJJVFMgPiAzMgorN2RkMjg4ZjAgY3dlYnA6IGZpeCBidWlsZAorMTlhOGRkMDEgTWVyZ2UgIk1ha2VmaWxlLnZjOiBhZGQgdndlYnAuZXhlIHRhcmdldCIgaW50byAwLjMuMAorNTBlZWRkYWQgTWVyZ2UgImV4YW1wbGVzOiBub3JtYWxpemUgaWNjIHJlbGF0ZWQgcHJvZ3JhbSBhcmd1bWVudHMiIGludG8gMC4zLjAKKzc1N2Y2MzdmIE1lcmdlICJNYWtlZmlsZS52YzogYWRkIGxpYndlYnBkZWNvZGVyIHRhcmdldCIgaW50byAwLjMuMAorYjY1YzRiN2MgTWFrZWZpbGUudmM6IGFkZCBsaWJ3ZWJwZGVjb2RlciB0YXJnZXQKK2Y4ZGI3YjRhIE1lcmdlICJ2d2VicDogcmVwbGFjZSBkb3VibGVzIHcvZmxvYXRzIHdoZXJlIGFwcHJvcHJpYXRlIiBpbnRvIDAuMy4wCitkOTlhYTU2ZiBNYWtlZmlsZS52YzogYWRkIHZ3ZWJwLmV4ZSB0YXJnZXQKKzAxMzAyM2U3IHZ3ZWJwOiByZXBsYWNlIGRvdWJsZXMgdy9mbG9hdHMgd2hlcmUgYXBwcm9wcmlhdGUKKzliM2RiODk0IFJFQURNRS5tdXg6IGFkZCB2ZXJzaW9uIHJlZmVyZW5jZQorN2I2YTI2Y2YgTWVyZ2UgImN3ZWJwOiBvdXRwdXQgbWV0YWRhdGEgc3RhdGlzdGljcyIgaW50byAwLjMuMAorZDhkYzcyYTAgZXhhbXBsZXM6IG5vcm1hbGl6ZSBpY2MgcmVsYXRlZCBwcm9ncmFtIGFyZ3VtZW50cworN2JmYzkwNTYgTWVyZ2UgIm1ha2UgYWxwaGEgdW5maWx0ZXIgd29yayBpbi1wbGFjZSIgaW50byAwLjMuMAorMDAzN2IyZDIgTWVyZ2UgImFkZCBMVVQtZnJlZSByZWZlcmVuY2UgY29kZSBmb3IgWVVWLT5SR0IgY29udmVyc2lvbi4iIGludG8gMC4zLjAKKzE2NmJmNzQ0IE1lcmdlICJkZW11eDogZGlzYWJsZSBmcmFnbWVudCBwYXJzaW5nIiBpbnRvIDAuMy4wCisxMjY5NzRiNCBhZGQgTFVULWZyZWUgcmVmZXJlbmNlIGNvZGUgZm9yIFlVVi0+UkdCIGNvbnZlcnNpb24uCiswYWVmM2ViZCBtYWtlIGFscGhhIHVuZmlsdGVyIHdvcmsgaW4tcGxhY2UKKzE0ZWY1MDA1IE1lcmdlICJSZW1vdmUgJ3N0YXR1czogZXhwZXJpbWVudGFsJyBmcm9tIGNvbnRhaW5lciBzcGVjIiBpbnRvIDAuMy4wCitkNDBjOThlMSBNZXJnZSAid2VicG11eCBiaW5hcnk6IHRpbnkgc3R5bGUgZml4IiBpbnRvIDAuMy4wCiswYmM0MjY4OSBjd2VicDogb3V0cHV0IG1ldGFkYXRhIHN0YXRpc3RpY3MKK2JjMDM5ODAzIE1lcmdlICJhdXRvY29uZjogbm9ybWFsaXplIGV4cGVyaW1lbnRhbCBkZWZpbmUiIGludG8gMC4zLjAKK2QxZTIxYjEzIFJlbW92ZSAnc3RhdHVzOiBleHBlcmltZW50YWwnIGZyb20gY29udGFpbmVyIHNwZWMKKzc2ODFiYjk2IHdlYnBtdXggYmluYXJ5OiB0aW55IHN0eWxlIGZpeAorYTNkZDNkMGYgYXZvaWQgaW5zdGFsbGluZyBleGFtcGxlX3V0aWwuaAorMjUyMzIwZTIgZGVtdXg6IGRpc2FibGUgZnJhZ21lbnQgcGFyc2luZworNTM3YmRlMDUgYXV0b2NvbmY6IG5vcm1hbGl6ZSBleHBlcmltZW50YWwgZGVmaW5lCis1ZTMzOGUwYiBNZXJnZSBjaGFuZ2VzIEkzM2U4YTYxMyxJOGU4YTdiNDQgaW50byAwLjMuMAorZDlkMGVhMWIgTWVyZ2UgY2hhbmdlcyBJZjIxZTNlYzcsSTk5MWZjMzBiIGludG8gMC4zLjAKKzYyN2Y1Y2E2IGF1dG9tYWtlOiBhZGQgcmVmZXJlbmNlIHRvIGxpYndlYnAgZm9yIG11eC9kZW11eAorZWVmNzNkMDcgZG9uJ3QgY29uc29saWRhdGUgcHJvYmEgc3RhdHMgdG9vIG9mdGVuCiswNWVjNGNjMiBsaWJ3ZWJweyxkZWNvZGVyfS5wYzogYWRkIHB0aHJlYWQgZmxhZ3MKKzFiZmNmNWJmIGFkZCBsaWJ3ZWJwbXV4LnBjCisyNmNhODQzZCBhZGQgbGlid2VicGRlbXV4LnBjCis2OWUyNTkwNiBNZXJnZSAiVHVuZSBMb3NzbGVzcyBjb21wcmVzc2lvbiBmb3IgbG93ZXIgcXVhbGl0aWVzLiIKKzA0NzhiNWQyIFR1bmUgTG9zc2xlc3MgY29tcHJlc3Npb24gZm9yIGxvd2VyIHF1YWxpdGllcy4KKzM5Zjc1ODZmIGFkZCBhIG1lbnRpb24gb2YgcGFyYWxsZWwgYWxwaGEgZW5jb2RpbmcgaW4gdGhlIE5FV1MKKzVhMjFkOTY3IE1lcmdlICIxLjV4LTJ4IGZhc3RlciBlbmNvZGluZyBmb3IgbWV0aG9kIDMgYW5kIHVwIgorOWJmYmRkMTQgMS41eC0yeCBmYXN0ZXIgZW5jb2RpbmcgZm9yIG1ldGhvZCAzIGFuZCB1cAorMjdkYzc0MWIgQ29ycmVjdCBmcmFtZSBvcHRpb25zIG9yZGVyIGluIFJFQURNRS5tdXgKK2JlMmZkMTczIE11eDogZml4IGEgc2NlbmFyaW8gd2l0aCBiYWQgQU5NRi9GUkdNIHNpemUKKzE5ZWIwMTJjIE1lcmdlICJEZW11eDogQWRkIG9wdGlvbiB0byBnZXQgZnJhbWUgY291bnQgdXNpbmcgR2V0SSgpIgorNzM2OGI4Y2IgTWVyZ2UgIldlYlBHZXRGZWF0dXJlcygpIG91dCBvZiBpZiBjb25kaXRpb24gZm9yIGNsYXJpdHkuIgorZjYwNGM5YTQgTWVyZ2UgImZpeCB3aW5kb3dzIGJ1aWxkIgorMTUzZjk0ZTggZml4IHdpbmRvd3MgYnVpbGQKKzg0N2I0OTI0IE1lcmdlICJ2d2VicDogdXNlIG1hZ2VudGEgZm9yICdpJ25mbyBkaXNwbGF5IgorMjVlYTQ2YmQgTWVyZ2UgInZ3ZWJwOiBhZGQga2V5Ym9hcmQgc2hvcnRjdXRzIHRvIGhlbHAgb3V0cHV0IgorYmVhN2NjYWYgdndlYnA6IHVzZSBtYWdlbnRhIGZvciAnaSduZm8gZGlzcGxheQorOGZhYjE2MWEgd2VicG11eDogY29ycmVjdCAtZnJhbWUgcGFyYW0gb3JkZXIgaW4gaGVscCBvdXRwdXQKKzAzY2MyM2Q2IHZ3ZWJwOiBhZGQga2V5Ym9hcmQgc2hvcnRjdXRzIHRvIGhlbHAgb3V0cHV0CiswNjhlYmE4ZCBEZW11eDogQWRkIG9wdGlvbiB0byBnZXQgZnJhbWUgY291bnQgdXNpbmcgR2V0SSgpCis5ODhiOGY1NiBXZWJQR2V0RmVhdHVyZXMoKSBvdXQgb2YgaWYgY29uZGl0aW9uIGZvciBjbGFyaXR5LgorNjkzM2Q5MTAgTWVyZ2UgImdpZjJ3ZWJwOiBCZSBsZW5pZW50IGFib3V0IGJhY2tncm91bmQgY29sb3IgaW5kZXguIgorNGQwZjdjNTUgTWVyZ2UgIldlYlBHZXRGZWF0dXJlcygpIGJlaGF2aW9yIGNoYW5nZToiCitmZGVlYjAxZCBnaWYyd2VicDogQmUgbGVuaWVudCBhYm91dCBiYWNrZ3JvdW5kIGNvbG9yIGluZGV4LgorYWQyNTAzMjAgTWVyZ2UgIm11bHRpLXRocmVhZGVkIGFscGhhIGVuY29kaW5nIGZvciBsb3NzeSIKKzRlMzJkM2UxIE1lcmdlICJmaXggY29tcGlsYXRpb24gb2YgdG9rZW4uYyIKK2Y4MTc5MzBhIG11bHRpLXRocmVhZGVkIGFscGhhIGVuY29kaW5nIGZvciBsb3NzeQorODgwNTAzNTEgZml4IGNvbXBpbGF0aW9uIG9mIHRva2VuLmMKK2ZjODE2MjE5IGNvZGUgdXNpbmcgdGhlIGFjdHVhbCB2YWx1ZXMgZm9yIG51bV9wYXJ0c18sIG5vdCB0aGUgb25lcyBmcm9tIGNvbmZpZworNzI2NTUzNTAgTWVyZ2UgIm1vdmUgdGhlIGNvbmZpZyBjaGVjayBmcm9tIC5jIHRvIC5oIgorZGQ5ZTc2ZjcgbW92ZSB0aGUgY29uZmlnIGNoZWNrIGZyb20gLmMgdG8gLmgKKzk1NmIyMTdhIFdlYlBHZXRGZWF0dXJlcygpIGJlaGF2aW9yIGNoYW5nZToKK2RmMDJlNGNlIFdlYlBEZW11eEdldEkgYmVoYXZpb3IgY2hhbmdlOgorNjMzYzAwNGQgTWVyZ2UgInJlYmFsYW5jZSBtZXRob2QgdG9vbHMgKC1tKSBmb3IgbWV0aG9kcyBbMC4uNF0iCis1OGNhNmY2NSByZWJhbGFuY2UgbWV0aG9kIHRvb2xzICgtbSkgZm9yIG1ldGhvZHMgWzAuLjRdCis3NjQ4YzNjYyBNZXJnZSAiZGVzY3JpYmUgcmQtb3B0IGxldmVscyBpbnRyb2R1Y2UgVlA4UkRMZXZlbCBlbnVtIgorNjdmYjEwMDMgTWVyZ2UgImF1dG9jb25mOiBlbmFibGUgc2lsZW50LXJ1bGVzIGJ5IGRlZmF1bHQiCithNTA0MmEzMiBHZXRWZXJzaW9uKCkgbWV0aG9kcyBmb3IgbXV4IGFuZCBkZW11eAorNTE4OTk1N2UgZGVzY3JpYmUgcmQtb3B0IGxldmVscyBpbnRyb2R1Y2UgVlA4UkRMZXZlbCBlbnVtCis0ZTA5NGFjZSBhdXRvY29uZjogZW5hYmxlIHNpbGVudC1ydWxlcyBieSBkZWZhdWx0CitiN2VhYTg1ZCBpbmxpbmUgVlA4TEZhc3RMb2cyKCkgYW5kIFZQOExGYXN0U0xvZzIgZm9yIHNtYWxsIHZhbHVlcworNWNmNzc5MmUgc3BsaXQgcXVhbnRfbGV2ZWxzLmMgaW50byBkZWNvZGVyIGFuZCBlbmNvZGVyIHZlcnNpb24KK2U1ZDNmZmUyIE1lcmdlICJVcGRhdGUgY29kZSBleGFtcGxlIGluIFJFQURNRS5tdXgiCithYzVhOTE1NiBVcGRhdGUgY29kZSBleGFtcGxlIGluIFJFQURNRS5tdXgKKzM4YTkxZTk5IEFkZCBleGFtcGxlIGNvZGUgc25pcHBldCBmb3IgZGVtdXggQVBJCis1ZjU1N2YzYyBSRUFETUUubXV4OiBhZGQgaW5mbyBhYm91dCBEZW11eCBBUEkgYW5kIHZ3ZWJwCitjMGJhMDkwMyBiYWNrd2FyZF9yZWZlcmVuY2VzOiBhdm9pZCBzaWduZWQgaW50ZWdlciBvdmVyZmxvdworOTQzMzg2ZGIgZGlzYWJsZSBTU0UyIGZvciBub3cKKzk0NzlmYjdkIGxvc3NsZXNzIGVuY29kaW5nIHNwZWVkdXAKK2VjMjAzMGE4IG1lcmdlIHR3byBsaW5lcyB0b2dldGhlcgorYjY3OTU2YzAgTWVyZ2UgIlJlbW92ZSBSZWFkT25lQml0KCkgYW5kIFJlYWRTeW1ib2xVbnNhZmUoKSIKKzE2NjdiZGVkIFJlbW92ZSBSZWFkT25lQml0KCkgYW5kIFJlYWRTeW1ib2xVbnNhZmUoKQorMzE1MTY2OWIgd2ljZGVjICsgZHdlYnAgY29zbWV0aWNzOiBub3JtYWxpemUgZm9ybWF0dGluZworOTI2NjhkYTYgY2hhbmdlIGRlZmF1bHQgZmlsdGVyaW5nIHBhcmFtZXRlcnM6ICAgKiB0eXBlIGlzIG5vdyAnc3Ryb25nJyAgICogc3RyZW5ndGggaXMgbm93ICc2MCcKK2I3NDkwZjg1IGludHJvZHVjZSBXRUJQX1JFRkVSRU5DRV9JTVBMRU1FTlRBVElPTiBjb21waWxlIG9wdGlvbgorMzM4Mzg4NTcgZmFzdGVyIGRlY29kaW5nICgzJS02JSkKKzVjM2UzODFiIE1lcmdlICJhZGQgYSAtanBlZ19saWtlIG9wdGlvbiIKK2MyMzExMDQ2IHJlbW92ZSB1bnVzZWQgZGVjbGFyYXRpb24gb2YgVlA4WmlnemFnCiszNjE1Mjk1NyBNZXJnZSAid2ljZGVjOiBhZGQgYWxwaGEgc3VwcG9ydCBmb3IgcGFsZXR0ZWQgZm9ybWF0cyIKK2M5ZjE2NDkwIHdpY2RlYzogYWRkIGFscGhhIHN1cHBvcnQgZm9yIHBhbGV0dGVkIGZvcm1hdHMKKzEyNjJmODFlIE1lcmdlICJ3aWNkZWM6IHNpbGVuY2Ugc29tZSB3YXJuaW5ncyIKK2U3ZWE2MWViIHdpY2RlYzogc2lsZW5jZSBzb21lIHdhcm5pbmdzCisyM2MwZjM1NCBmaXggbWlzc2luZyBpbnRwdHJfdC0+aW50IGNhc3QgZm9yIE1TVkMKK2U4OTUwNTlhIGFkZCBhIC1qcGVnX2xpa2Ugb3B0aW9uCisxZjgwM2Y2NCBNZXJnZSAiVHVuZSBhbHBoYSBxdWFsaXR5IG1hcHBpbmcgdG8gbW9yZSByZWFzb25hYmxlIHZhbHVlcy4iCisxMjY3ZDQ5OCBUdW5lIGFscGhhIHF1YWxpdHkgbWFwcGluZyB0byBtb3JlIHJlYXNvbmFibGUgdmFsdWVzLgorMDQzMDc2ZTIgTWVyZ2UgInNwZWVkLXVwIGxvc3NsZXNzIGluIEJhY2t3YXJkVHJhY2UiCitmM2E0NGRjZCByZW1vdmUgb25lIG1hbGxvYyBmcm9tIFRyYWNlQmFja3dhcmRzKCkKKzBmYzFhM2EwIHNwZWVkLXVwIGxvc3NsZXNzIGluIEJhY2t3YXJkVHJhY2UKKzdjNzMyZTU5IGN3ZWJwOiBjZW50cmFsaXplIFdlYlBDbGVhbnVwVHJhbnNwYXJlbnRBcmVhKCkKKzczODEyNTRlIE1lcmdlICJ3aWNkZWM6IGFkZCBJQ0MgcHJvZmlsZSBleHRyYWN0aW9uIgorZTgzZmY3ZGUgd2ljZGVjOiBhZGQgSUNDIHByb2ZpbGUgZXh0cmFjdGlvbgorMTQ2YzZlM2IgTWVyZ2UgImNvc21ldGljczogcG5nZGVjOiBub3JtYWxpemUgZGVmYXVsdCBsYWJlbCBsb2NhdGlvbiIKK2E4ZjU0OWQ3IE1lcmdlICJtYW5wYWdlczogaXRhbGljaXplIG9wdGlvbiBwYXJhbWV0ZXJzIgorZTExOGRiODMgTWVyZ2UgImVuY29kZS5oOiBub3RlIHRoZSBuZWVkIHRvIGZyZWUoKSBXZWJQTWVtb3J5V3JpdGVyIgorMWRmZWU2ZGIgY29zbWV0aWNzOiBwbmdkZWM6IG5vcm1hbGl6ZSBkZWZhdWx0IGxhYmVsIGxvY2F0aW9uCisxNGMzODIwMCBtYW5wYWdlczogaXRhbGljaXplIG9wdGlvbiBwYXJhbWV0ZXJzCis3ZGVmYmZhZCBlbmNvZGUuaDogbm90ZSB0aGUgbmVlZCB0byBmcmVlKCkgV2ViUE1lbW9yeVdyaXRlcgorODhkMzgyYTAgY3dlYnA6IGNsZWFudXAgYWZ0ZXIgbWVtb3J5X3dyaXRlcgorMTJkNmNlY2YgZml4IGV4dHJhIHNwYWNlIGluIGR3ZWJwLjEgbWFuCitiMDE2ODFhOSBGaXggZm9yIGRlbXV4ZXIgZnJhbWUgaXRlcmF0aW9uOgorNTZjMTJhYTYgRGVtdXhlciBjcmVhdGlvbiBmaXg6Cis2NmM4MTBiYyBhZGQgYSAteXV2IG9wdGlvbiB0byBkd2VicCAodmVyeSBzaW1pbGFyIHRvIC1wZ20pCis4NDFhM2JhNSBNZXJnZSAiUmVtb3ZlIC1Xc2hhZG93IHdhcm5pbmdzLiIKKzhmZDAyNTI3IE1lcmdlICJ1cHNhbXBsaW5nX25lb24uYzogZml4IGJ1aWxkIgorNmVmZWQyNjggUmVtb3ZlIC1Xc2hhZG93IHdhcm5pbmdzLgorNjA5MDRhYTYgTWVyZ2UgImFsbG93IFdlYlBJTmV3UkdCL1lVVkEgdG8gYmUgcGFzc2VkIGEgTlVMTCBvdXRwdXQgYnVmZmVyLiIKK2I3YWRmMzc2IGFsbG93IFdlYlBJTmV3UkdCL1lVVkEgdG8gYmUgcGFzc2VkIGEgTlVMTCBvdXRwdXQgYnVmZmVyLgorMjdmOGY3NDIgdXBzYW1wbGluZ19uZW9uLmM6IGZpeCBidWlsZAorMDZiOWNkZjEgZ2l0aWdub3JlOiBhZGQgSU9TIHJlbGF0ZWQgZGlyZWN0b3JpZXMKK2YxMTIyMjFlIE1lcmdlICJGaXggbW9yZSBjb21tZW50cyBmb3IgaW9idWlsZC5zaCIKK2ZlNGQyNWRkIEZpeCBtb3JlIGNvbW1lbnRzIGZvciBpb2J1aWxkLnNoCisxZGUzZTI1MiBNZXJnZSAiTkVPTiBvcHRpbWlzZWQgeXV2IHRvIHJnYiBjb252ZXJzaW9uIgorMDkwYjcwOGEgTkVPTiBvcHRpbWlzZWQgeXV2IHRvIHJnYiBjb252ZXJzaW9uCitkYWEwNjQ3NiBNZXJnZSAiQWRkIGlvcyBidWlsZCBzY3JpcHQgZm9yIGJ1aWxkaW5nIGlPUyBsaWJyYXJ5LiIKKzc5ZmUzOWUyIEFkZCBpb3MgYnVpbGQgc2NyaXB0IGZvciBidWlsZGluZyBpT1MgbGlicmFyeS4KKzEyNmMwMzVmIHJlbW92ZSBzb21lIG1vcmUgLVdzaGFkb3cgd2FybmluZ3MKKzUyMmU5ZDYxIE1lcmdlICJjd2VicDogZW5hYmxlICctbWV0YWRhdGEnIgorNzZlYzVmYTEgY3dlYnA6IGVuYWJsZSAnLW1ldGFkYXRhJworYWViOTFhOWQgTWVyZ2UgImNvc21ldGljczogYnJlYWsgYSBmZXcgbG9uZyBsaW5lcyIKK2JlN2M5NmIwIGNvc21ldGljczogYnJlYWsgYSBmZXcgbG9uZyBsaW5lcworY2ZmOGRkYjYgTWVyZ2UgImFkZCBsaWJ3ZWJwZGVjb2Rlci5wYyIKKzkzMTQ4YWI4IE1lcmdlICJsaWJ3ZWJwLnBjLmluOiBkZXRhYiIKKzY0NzdmOTU1IE1lcmdlICJNYWtlZmlsZS52Yzogbm9ybWFsaXplIHBhdGggc2VwYXJhdG9yIgorYmVkMWVkN2MgYWRkIGxpYndlYnBkZWNvZGVyLnBjCis0NjE2OGIyZCBsaWJ3ZWJwLnBjLmluOiBkZXRhYgorYTk0MWEzNDYgRml4ZWQgZmV3IG5pdHMgaW4gdGhlIGJ1aWxkIGZpbGVzLgorZGQ3YTQ5YjIgTWFrZWZpbGUudmM6IG5vcm1hbGl6ZSBwYXRoIHNlcGFyYXRvcgorOTE2MWJlODYgTWVyZ2UgImN3ZWJwOiBleHRyYWN0IFdJQyBkZWNvZGluZyB0byBpdHMgb3duIG1vZHVsZSIKKzA4ZTdjNThlIE1lcmdlICJQcm92aWRlIGFuIG9wdGlvbiB0byBidWlsZCBkZWNvZGVyIGxpYnJhcnkuIgorMGFlYmE1MjggUHJvdmlkZSBhbiBvcHRpb24gdG8gYnVpbGQgZGVjb2RlciBsaWJyYXJ5LgorNzU3ZWJjYjEgY2F0Y2ggbWFsbG9jKDApL2NhbGxvYygwKSB3aXRoIGFuIGFzc2VydAorMTUyZWMzZDIgTWVyZ2UgImhhbmRsZSBtYWxsb2MoMCkgYW5kIGNhbGxvYygwKSB1bmlmb3JtbHkgb24gYWxsIHBsYXRmb3JtcyIKK2E0NTJhNTU1IGN3ZWJwOiBleHRyYWN0IFdJQyBkZWNvZGluZyB0byBpdHMgb3duIG1vZHVsZQorMmIyNTJhNTMgTWVyZ2UgIlByb3ZpZGUgb3B0aW9uIHRvIHN3YXAgYnl0ZXMgZm9yIDE2IGJpdCBjb2xvcm1vZGVzIgorOTRhNDhiNGIgUHJvdmlkZSBvcHRpb24gdG8gc3dhcCBieXRlcyBmb3IgMTYgYml0IGNvbG9ybW9kZXMKKzQyZjhmOTM0IGhhbmRsZSBtYWxsb2MoMCkgYW5kIGNhbGxvYygwKSB1bmlmb3JtbHkgb24gYWxsIHBsYXRmb3JtcworOGIyMTUyYzUgTWVyZ2UgImFkZCBhbiBleHRyYSBhc3NlcnQgdG8gY2hlY2sgbWVtb3J5IGJvdW5kcyIKKzBkMTlmYmZmIHJlbW92ZSBzb21lIC1Xc2hhZG93IHdhcm5pbmdzCitjZDIyZjY1NSBhZGQgYW4gZXh0cmEgYXNzZXJ0IHRvIGNoZWNrIG1lbW9yeSBib3VuZHMKKzgxODlmZWRhIE1lcmdlICJBZGQgZGV0YWlscyBhbmQgcmVmZXJlbmNlIGFib3V0IHRoZSBZVVYtPlJHQiBjb252ZXJzaW9uIgorMWQyNzAyYjEgTWVyZ2UgIkZvcm1hdHRpbmcgZml4ZXMgaW4gbG9zc2xlc3MgYml0c3RyZWFtIHNwZWMiCis4NDI1YWFlZSBGb3JtYXR0aW5nIGZpeGVzIGluIGxvc3NsZXNzIGJpdHN0cmVhbSBzcGVjCithNTU2Y2IxYSBBZGQgZGV0YWlscyBhbmQgcmVmZXJlbmNlIGFib3V0IHRoZSBZVVYtPlJHQiBjb252ZXJzaW9uCitkOGYyMWUwYiBhZGQgbGluayB0byBTU0lNIGRlc2NyaXB0aW9uIG9uIFdpa2lwZWRpYQorMThlOTE2N2UgTWVyZ2UgIldlYlAtbG9zc2xlc3Mgc3BlYyBjbGFyaWZpY2F0aW9uczoiCis5OGUyNWI5YiBNZXJnZSAiY3dlYnA6IGFkZCAtbWV0YWRhdGEgb3B0aW9uIgorZjAxYzJhNTMgV2ViUC1sb3NzbGVzcyBzcGVjIGNsYXJpZmljYXRpb25zOgorZjRhOTc5NzAgTWVyZ2UgIkRpc3RvNHg0IGFuZCBEaXN0bzE2eDE2IGluIE5FT04iCis0N2I3YjBiYSBEaXN0bzR4NCBhbmQgRGlzdG8xNngxNiBpbiBORU9OCis3ZWFlZTlmMSBjd2VicDogYWRkIC1tZXRhZGF0YSBvcHRpb24KKzM2YzUyYzJjIHRpZmZkZWM6IHVzZSB0b2ZmX3QgZm9yIGV4aWYgaWZkIG9mZnNldAorN2M4MTExZTQgTWVyZ2UgImN3ZWJwL3RpZmZkZWM6IGFkZCBUSUZGIG1ldGFkYXRhIGV4dHJhY3Rpb24iCitlNjQwOWFkYyBSZW1vdmUgcmVkdW5kYW50IGluY2x1ZGUgZnJvbSBkc3AvbG9zc2xlc3MgY29kZS4KKzFhYjViM2E3IE1lcmdlICJjb25maWd1cmU6IGZpeCAtLXdpdGgtZ2lmaW5jbHVkZWRpciIKKzAzYzc0OWViIGNvbmZpZ3VyZTogZml4IC0td2l0aC1naWZpbmNsdWRlZGlyCis4YjY1MDYzNSBtdWx0aXBsZSBsaWJnaWYgdmVyc2lvbnMgc3VwcG9ydCBmb3IgZ2lmMndlYnAKKzQ3NmUyOTNmIGdpZjJ3ZWJwOiBVc2UgREdpZk9wZW5GaWxlTmFtZSgpCitiNTBmMjc3YiB0aWZmZGVjOiBjb3JyZWN0IGZvcm1hdCBzdHJpbmcKKzJiOTA0OGUzIE1lcmdlICJ0aWZmZGVjOiBjaGVjayBlcnJvciByZXR1cm5zIGZvciB3aWR0aC9oZWlnaHQiCithMWI1YTlhMyBNZXJnZSAiY3dlYnAvdGlmZjogdXNlIHRoZSBmaXJzdCBpbWFnZSBkaXJlY3RvcnkiCiswNzk0MjNmNSB0aWZmZGVjOiBjaGVjayBlcnJvciByZXR1cm5zIGZvciB3aWR0aC9oZWlnaHQKK2Q2MjgyNGFmIE1lcmdlICJjd2VicC9qcGVnZGVjOiBhZGQgSlBFRyBtZXRhZGF0YSBleHRyYWN0aW9uIgorMDNhZmFjYTQgTWVyZ2UgImN3ZWJwOiBhZGQgUE5HIG1ldGFkYXRhIGV4dHJhY3Rpb24iCisyYzcyNDk2OCBjd2VicC9qcGVnZGVjOiBhZGQgSlBFRyBtZXRhZGF0YSBleHRyYWN0aW9uCitkYmE2NGQ5MSBjd2VicDogYWRkIFBORyBtZXRhZGF0YSBleHRyYWN0aW9uCisxZjA3NWY4OSBMb3NzbGVzcyBzcGVjIGNvcnJlY3Rpb25zL3Jld29yZGluZy9jbGFyaWZpY2F0aW9ucworMjkxNGVjZmQgY3dlYnAvdGlmZmRlYzogYWRkIFRJRkYgbWV0YWRhdGEgZXh0cmFjdGlvbgorZDgyYTNlMzMgTW9yZSBjb3JyZWN0aW9ucy9jbGFyaWZpY2F0aW9ucyBpbiBsb3NzbGVzcyBzcGVjOgorYmQwMDI1NTcgY3dlYnAvdGlmZjogdXNlIHRoZSBmaXJzdCBpbWFnZSBkaXJlY3RvcnkKK2RmN2FhMDc2IE1lcmdlICJDbGVhbnVwIGFyb3VuZCBqcGVnZGVjIgorMGY1N2RjYzMgZGVjb2Rpbmcgc3BlZWQtdXAgKH4xJSkKK2JjZWMzMzliIExvc3NsZXNzIGJpdHN0cmVhbSBjbGFyaWZpY2F0aW9uOgorNmJmMjA4NzQgYWRkIGV4YW1wbGVzL21ldGFkYXRhLmMKKzIwN2Y4OWMwIE1lcmdlICJjb25maWd1cmU6IGFkZCBsaWJ3ZWJwZGVtdXggc3RhdHVzIHRvIHN1bW1hcnkiCisxYmQyODdhNiBDbGVhbnVwIGFyb3VuZCBqcGVnZGVjCis5MTQ1NTY3OSBNZXJnZSAiY29zbWV0aWNzOiB1c2UgJz09IDAnIGluIHNpemUgY2hlY2tzIgorZDZiODhiNzYgY29zbWV0aWNzOiB1c2UgJz09IDAnIGluIHNpemUgY2hlY2tzCitkM2RhY2UyZiBjb3NtZXRpY3M6IGpwZWdkZWMKKzJmNjlhZjczIGNvbmZpZ3VyZTogYWRkIGxpYndlYnBkZW11eCBzdGF0dXMgdG8gc3VtbWFyeQorMWMxYzU2NDYgY3dlYnA6IGV4dHJhY3QgdGlmZiBkZWNvZGluZyB0byBpdHMgb3duIG1vZHVsZQorNmE4NzFkNjYgY3dlYnA6IGV4dHJhY3QganBlZyBkZWNvZGluZyB0byBpdHMgb3duIG1vZHVsZQorMmVlMjI4ZjkgY3dlYnA6IGV4dHJhY3QgcG5nIGRlY29kaW5nIHRvIGl0cyBvd24gbW9kdWxlCis0Njc5ZGIwMCBNZXJnZSAiY3dlYnA6IGFkZCBtZXRhZGF0YSBmcmFtZXdvcmsiCis2M2FiYTNhZSBjd2VicDogYWRkIG1ldGFkYXRhIGZyYW1ld29yaworOTMxYmQ1MTYgbG9zc2xlc3MgYml0c3RyZWFtOiBibG9jayBzaXplIGJpdHMgY29ycmVjdGlvbgorZTRmYzRjMWMgbG9zc2xlc3MgYml0c3RyZWFtOiBibG9jayBzaXplIGJpdHMgY29ycmVjdGlvbgorZDY1ZWM2NzggZml4IGJ1aWxkLCBtb3ZlIHRva2VuLmMgdG8gc3JjL2VuYy8KKzY1N2Y1YzkxIG1vdmUgdG9rZW4gYnVmZmVyIHRvIGl0cyBvd24gZmlsZSAodG9rZW4uYykKK2MzNGEzNzU4IGludHJvZHVjZSBHZXRMYXJnZVZhbHVlKCkgdG8gc2xpbS1mYXN0IEdldENvZWZmcygpLgorZDU4MzhjZDUgZmFzdGVyIG5vbi10cmFuc3Bvc2luZyBTU0UyIDR4NCBGVHJhbnNmb3JtCitmNzYxOTFmOSBzcGVlZCB1cCBHZXRSZXNpZHVhbENvc3QoKQorYmEyYWEwZmQgQWRkIHN1cHBvcnQgZm9yIEJJVFM9MjQgY2FzZQorMmU3ZjZlOGUgbWFrZWZpbGUudW5peDogRGVwZW5kZW5jeSBvbiBsaWJyYXJpZXMKK2RjYTg0MjE5IE1lcmdlICJTZXBhcmF0ZSBvdXQgbXV4IGFuZCBkZW11eCBjb2RlIGFuZCBsaWJyYXJpZXM6IgorMjM3ODJmOTUgU2VwYXJhdGUgb3V0IG11eCBhbmQgZGVtdXggY29kZSBhbmQgbGlicmFyaWVzOgorYmQ1NmEwMWYgY29uZmlndXJlOiBhZGQgc3VtbWFyeSBvdXRwdXQKKzkwZTVlMzE5IGR3ZWJwIG1hbnVhbDogcG9pbnQgdG8gd2VicG11eCwgZ2lmMndlYnAuCis1NDA3OTBjYSBnaWYyd2VicC5jOiBhZGQgYSBub3RlIGFib3V0IHByZXJlcXVpc2l0ZXMKK2QxZWRmNjk3IGN3ZWJwIG1hbiBwYWdlOiBtZWFuaW5nIG9mICctcScgZm9yIGxvc3N5L2xvc3NsZXNzCis3OWVmYTFkMCBBZGQgbWFuIHBhZ2UgZm9yIGdpZjJ3ZWJwIHV0aWxpdHkKKzIyNDNlNDBjIE1lcmdlICJnaWYyd2VicCBidWlsZCBzdXBwb3J0IHdpdGggYXV0b2NvbmYgdG9vbHMiCitjNDBlZmNhMSBnaWYyd2VicCBidWlsZCBzdXBwb3J0IHdpdGggYXV0b2NvbmYgdG9vbHMKKzY1MjNlMmQ0IFdlYlAgQ29udGFpbmVyOgorNGRhNzg4ZGEgTWVyZ2UgInNpbXBsaWZ5IHRoZSBmd2QgdHJhbnNmb3JtIgorNDJjM2I1NTAgc2ltcGxpZnkgdGhlIGZ3ZCB0cmFuc2Zvcm0KKzQxYTZjZWQ5IHVzZXIgR0xmbG9hdCBpbnN0ZWFkIG9mIGZsb2F0CitiNTQyNjExOSBmaXggaW5kZW50YXRpb24KKzY4ZjI4MmY3ICogaGFuZGxlIG9mZnNldCBpbiBhbmltIHZpZXdlciAndndlYnAnICogZml4IGdpZjJ3ZWJwIHRvIGhhbmRsZSBkaXNwb3NhbCBtZXRob2QgYW5kIG9kZCBvZmZzZXQgY29ycmVjdGx5CisxMThjYjMxMiBNZXJnZSAiYWRkIFNTRTIgdmVyc2lvbiBvZiBTdW0gb2YgU3F1YXJlIGVycm9yIGZvciAxNngxNiwgMTZ4OCBhbmQgOHg4IGNhc2UiCis4YTdjM2NjOCBNZXJnZSAiQ2hhbmdlIHRoZSBvcmRlciBvZiAtZnJhbWUgYXJndW1lbnQgdG8gYmUgbW9yZSBuYXR1cmFsIgorOTllMGE3MDcgTWVyZ2UgIlNpbXBsaWZ5IHRoZSB0ZXh0dXJlIGV2YWx1YXRpb24gRGlzdG80eDQoKSIKKzBmOTIzYzNmIG1ha2UgdGhlIGJ1bmRsaW5nIHdvcmsgaW4gYSB0bXAgYnVmZmVyCitlNWMzYjNmNSBTaW1wbGlmeSB0aGUgdGV4dHVyZSBldmFsdWF0aW9uIERpc3RvNHg0KCkKKzQ4NjAwMDg0IENoYW5nZSB0aGUgb3JkZXIgb2YgLWZyYW1lIGFyZ3VtZW50IHRvIGJlIG1vcmUgbmF0dXJhbAorMzViZmQ0YzAgYWRkIFNTRTIgdmVyc2lvbiBvZiBTdW0gb2YgU3F1YXJlIGVycm9yIGZvciAxNngxNiwgMTZ4OCBhbmQgOHg4IGNhc2UKK2E3MzA1YzJlIENsYXJpZmljYXRpb24gZm9yIHVua25vd24gY2h1bmtzCis0YzQzOThlMiBSZWZpbmUgV2ViUCBDb250YWluZXIgU3BlYyB3cnQgdW5rbm93biBjaHVua3MuCisyY2E2NDJlMCBSZWN0aWZ5IFdlYlBNdXhHZXRGZWF0dXJlczoKKzdjYWFiMWQ4IFNvbWUgY29zbWV0aWMvY29tbWVudCBmaXhlcy4KKzYwYjI2NTFhIE1lcmdlICJXcml0ZSBhIEdJRiB0byBXZWJQIGNvbnZlcnRlciBiYXNlZCBvbiBsaWJnaWYuIgorYzcxMjdhNGQgTWVyZ2UgIkFkZCBORU9OIHZlcnNpb24gb2YgRlRyYW5zZm9ybVdIVCIKKzExYjI3MjEyIFdyaXRlIGEgR0lGIHRvIFdlYlAgY29udmVydGVyIGJhc2VkIG9uIGxpYmdpZi4KK2U5YTE1YTM3IEV4VXRpbFdyaXRlRmlsZSgpIHRvIHdyaXRlIG1lbW9yeSBzZWdtZW50IHRvIGZpbGUKKzc0MzU2ZWI1IEFkZCBhIHNpbXBsZSBjbGVhbnVwIHN0ZXAgaW4gbXV4IGFzc2VtYmx5OgorNTFiYjFlNWQgbXV4Lmg6IGNvcnJlY3QgV2ViUERlbXV4U2VsZWN0RnJhZ21lbnQoKSBwcm90b3R5cGUKKzIyYTBmZDlkIEFkZCBORU9OIHZlcnNpb24gb2YgRlRyYW5zZm9ybVdIVAorZmEzMGM4NjMgVXBkYXRlIG11eCBjb2RlIHRvIG1hdGNoIHRoZSBzcGVjIHdydCBhbmltYXRpb24KK2Q5YzVmYmVmIGJ5LXBhc3MgQW5hbHlzaXMgcGFzcyBpbiBjYXNlIHNlZ21lbnRzPTEKK2QyYWQ0NDUwIE1lcmdlIGNoYW5nZXMgSWJlY2NmZmMzLElkMTU4NWIxNgorNWM4YmUyNTEgTWVyZ2UgIkNodW5rIGZvdXJDQ3MgZm9yIFhNUC9FWElGIgorYTAwYTNkYWYgVXNlICdmcmdtJyBpbnN0ZWFkIG9mICd0aWxlJyBpbiB3ZWJwbXV4IHBhcmFtZXRlcnMKKzgxYjhhNzQxIERlc2lnbiBjaGFuZ2UgaW4gQU5NRiBhbmQgRlJHTSBjaHVua3M6CitmOTAzY2JhYiBDaHVuayBmb3VyQ0NzIGZvciBYTVAvRVhJRgorODEyOTMzZDYgVHVuZSBwZXJmb3JtYW5jZSBvZiBIaXN0b2dyYW1Db21iaW5lCis1MmFkMTk3OSBBbmltYXRpb24gc3BlY2lmaWNhdGlvbiBpbiBjb250YWluZXIgc3BlYworMDAxYjkzMDIgSW1hZ2UgZnJhZ21lbnQgc3BlY2lmaWNhdGlvbiBpbiBjb250YWluZXIgc3BlYworMzkxZjlkYjkgT3JkZXJpbmcgb2YgZGVzY3JpcHRpb24gb2YgYml0cyBpbiBjb250YWluZXIgc3BlYworZDU3MzU3NzYgTWV0YWRhdGEgc3BlY2lmaWNhdGlvbiBpbiBjb250YWluZXIgc3BlYworMWM0NjA5YjEgTWVyZ2UgY29tbWl0ICd2MC4yLjEnCiswY2E1ODRjYiBNZXJnZSAiQ29sb3IgcHJvZmlsZSBzcGVjaWZpY2F0aW9uIGluIGNvbnRhaW5lciBzcGVjIgorZThiNDFhZDEgYWRkIE5FT04gYXNtIHZlcnNpb24gZm9yIFdIVCBpbnZlcnNlIHRyYW5zZm9ybQorYWY2ZjBkYjIgQ29sb3IgcHJvZmlsZSBzcGVjaWZpY2F0aW9uIGluIGNvbnRhaW5lciBzcGVjCithNjFhODI0YiBNZXJnZSAiQWRkIE5VTEwgY2hlY2sgaW4gY2h1bmsgQVBJcyIKKzBlOGI3ZWVkIGZpeCBXZWJQUGljdHVyZVZpZXcoKSB1bmFzc2lnbmVkIHN0cmlkZXMKKzc1ZTVmMTdlIEFSTS9ORU9OOiAzMCUgZW5jb2Rpbmcgc3BlZWQtdXAKKzAyYjQzNTY4IEFkZCBOVUxMIGNoZWNrIGluIGNodW5rIEFQSXMKK2EwNzcwNzI3IG11eCBzdHJ1Y3QgbmFtaW5nCis2YzY2ZGRlOCBNZXJnZSAiVHVuZSBMb3NzbGVzcyBlbmNvZGVyIgorYWI1ZWEyMTcgVHVuZSBMb3NzbGVzcyBlbmNvZGVyCis3NGZlZmM4YyBVcGRhdGUgQ2hhbmdlTG9nICh0YWc6IHYwLjIuMSwgb3JpZ2luLzAuMi4wLCAwLjIuMCkKKzkyZjgwNTljIFJlbmFtZSBzb21lIGNodW5rczoKKzNiYjRiYmViIE1lcmdlICJNdXggQVBJIGNoYW5nZToiCitkMGM3OWYwNSBNdXggQVBJIGNoYW5nZToKK2FiYzA2MDQ0IE1lcmdlICJ1cGRhdGUgTkVXUyIgaW50byAwLjIuMAorNTdjZjMxM2IgdXBkYXRlIE5FV1MKKzI1ZjU4NWM0IGJ1bXAgdmVyc2lvbiB0byAwLjIuMQorZmVkN2MwNDggbGlid2VicDogdmFsaWRhdGUgY2h1bmsgc2l6ZSBpbiBQYXJzZU9wdGlvbmFsQ2h1bmtzCis1NTJjZDliYyBjd2VicCAod2luZG93cyk6IGZpeCBhbHBoYSBpbWFnZSBpbXBvcnQgb24gWFAKK2IxNGZlYTk5IGF1dG9jb25mL2xpYndlYnA6IGVuYWJsZSBkbGwgYnVpbGRzIGZvciBtaW5ndworNGE4ZmIyNzIgW2NkXXdlYnA6IGFsd2F5cyBvdXRwdXQgd2luZG93cyBlcnJvcnMKK2Q2NjIxNTgwIGZpeCBkb3VibGUgdG8gZmxvYXQgY29udmVyc2lvbiB3YXJuaW5nCis3MmI5NmE2OSBjd2VicDogZml4IGpwZyBlbmNvZGVzIG9uIFhQCis3MzRmNzYyYSBWUDhMQWxsb2NhdGVIaXN0b2dyYW1TZXQ6IGZpeCBvdmVyZmxvdyBpbiBzaXplIGNhbGN1bGF0aW9uCitmOWNiNThmYiBHZXRIaXN0b0JpdHM6IGZpeCBpbnRlZ2VyIG92ZXJmbG93CitiMzBhZGQyMCBFbmNvZGVJbWFnZUludGVybmFsOiBmaXggdW5pbml0aWFsaXplZCBmcmVlCiszZGU1OGQ3NyBmaXggdGhlIC1nL08zIGRpc2NyZXBhbmN5IGZvciAzMmJpdCBjb21waWxlCis3N2FhN2Q1MCBmaXggdGhlIEJJVFM9OCBjYXNlCitlNTk3MGJkYSBNYWtlICpJbml0U1NFMigpIGZ1bmN0aW9ucyBiZSBlbXB0eSBvbiBub24tU1NFMiBwbGF0Zm9ybQorZWY1Y2M0N2UgbWFrZSAqSW5pdFNTRTIoKSBmdW5jdGlvbnMgYmUgZW1wdHkgb24gbm9uLVNTRTIgcGxhdGZvcm0KK2M0ZWEyNTlkIG1ha2UgVlA4RHNwSW5pdE5FT04oKSBwdWJsaWMKKzgzNDRlYWRmIE1lcmdlICJsaWJ3ZWJwOiB2YWxpZGF0ZSBjaHVuayBzaXplIGluIFBhcnNlT3B0aW9uYWxDaHVua3MiCis0ODI4YmI5MyBNZXJnZSAiY3dlYnAgKHdpbmRvd3MpOiBmaXggYWxwaGEgaW1hZ2UgaW1wb3J0IG9uIFhQIgorMzA3NjMzMzMgbGlid2VicDogdmFsaWRhdGUgY2h1bmsgc2l6ZSBpbiBQYXJzZU9wdGlvbmFsQ2h1bmtzCis3MDQ4MTg5OCBBY2N1bXVsYXRlTFNJTTogZml4IGRvdWJsZSAtPiBmbG9hdCB3YXJuaW5ncworZWRhOGVlNGIgY3dlYnAgKHdpbmRvd3MpOiBmaXggYWxwaGEgaW1hZ2UgaW1wb3J0IG9uIFhQCitjNmU5ODY1OCBNZXJnZSAiYWRkIEVYUEVSSU1FTlRBTCBjb2RlIGZvciBZVVYtSlBFRyBjb2xvcnNwYWNlIgorZjAzNjBiNGYgYWRkIEVYUEVSSU1FTlRBTCBjb2RlIGZvciBZVVYtSlBFRyBjb2xvcnNwYWNlCitmODZlNmFiZSBhZGQgTFNJTSBtZXRyaWMgdG8gV2ViUFBpY3R1cmVEaXN0b3J0aW9uKCkKK2MzYWEyMTVhIFNwZWVkIHVwIEhpc3RvZ3JhbUNvbWJpbmUgZm9yIGxvd2VyIHF1YWxpdGllcy4KKzE3NjVjYjFjIE1lcmdlICJhdXRvY29uZi9saWJ3ZWJwOiBlbmFibGUgZGxsIGJ1aWxkcyBmb3IgbWluZ3ciCithMTM1NjJlOCBhdXRvY29uZi9saWJ3ZWJwOiBlbmFibGUgZGxsIGJ1aWxkcyBmb3IgbWluZ3cKKzlmNDY5YjU3IHR5cG86IG5vX2ZhbmN5IC0+IG5vX2ZhbmN5X3Vwc2FtcGxpbmcKKzFhMjdmMmY4IE1lcmdlICJmaXggZG91YmxlIHRvIGZsb2F0IGNvbnZlcnNpb24gd2FybmluZyIKK2NmMWU5MGRlIE1lcmdlICJjd2VicDogZml4IGpwZyBlbmNvZGVzIG9uIFhQIgorZjJiNWQxOWIgW2NkXXdlYnA6IGFsd2F5cyBvdXRwdXQgd2luZG93cyBlcnJvcnMKK2U4NTUyMDhjIGZpeCBkb3VibGUgdG8gZmxvYXQgY29udmVyc2lvbiB3YXJuaW5nCitlY2Q2NmY3NyBjd2VicDogZml4IGpwZyBlbmNvZGVzIG9uIFhQCis3YjNlYjM3MiBUdW5lIGxvc3NsZXNzIGNvbXByZXNzaW9uIHRvIGdldCBiZXR0ZXIgZ2FpbnMuCitjZThiZmY0NSBNZXJnZSAiVlA4TEFsbG9jYXRlSGlzdG9ncmFtU2V0OiBmaXggb3ZlcmZsb3cgaW4gc2l6ZSBjYWxjdWxhdGlvbiIKK2FiNWI2N2ExIE1lcmdlICJFbmNvZGVJbWFnZUludGVybmFsOiBmaXggdW5pbml0aWFsaXplZCBmcmVlIgorN2ZlZTVkMTIgTWVyZ2UgIkdldEhpc3RvQml0czogZml4IGludGVnZXIgb3ZlcmZsb3ciCithNmFlMDRkNCBWUDhMQWxsb2NhdGVIaXN0b2dyYW1TZXQ6IGZpeCBvdmVyZmxvdyBpbiBzaXplIGNhbGN1bGF0aW9uCis4MDIzN2M0MyBHZXRIaXN0b0JpdHM6IGZpeCBpbnRlZ2VyIG92ZXJmbG93Cis4YTk5NzIzNSBFbmNvZGVJbWFnZUludGVybmFsOiBmaXggdW5pbml0aWFsaXplZCBmcmVlCiswYjllNjgyOSBtaW5vciBjb3NtZXRpY3MKK2E3OTJiOTEzIGZpeCB0aGUgLWcvTzMgZGlzY3JlcGFuY3kgZm9yIDMyYml0IGNvbXBpbGUKKzczYmE0MzU3IE1lcmdlICJkZXRlY3QgYW5kIG1lcmdlIHNpbWlsYXIgc2VnbWVudHMiCitmZWU2NjI3NSBkZXRlY3QgYW5kIG1lcmdlIHNpbWlsYXIgc2VnbWVudHMKKzBjNDRmNDE1IHNyYy93ZWJwLyouaDogZG9uJ3QgZm9yd2FyZCBkZWNsYXJlIGVudW1zIGluIEMrKworZDdhNWFjODYgdndlYnA6IHVzZSBkZW11eCBpbnRlcmZhY2UKKzkzMWUwZWExIE1lcmdlICJyZXBsYWNlICd0eXBlZGVmIHN0cnVjdCB7fSBYOyIgYnkgInR5cGVkZWYgc3RydWN0IFggWDsgc3RydWN0IFgge307IiIKKzhmMjE2ZjdlIHJlbW92ZSBjYXNlcyBvZiBlcXVhbCBjb21wYXJpc29uIGZvciBxc29ydCgpCisyOGQyNWM4MiByZXBsYWNlICd0eXBlZGVmIHN0cnVjdCB7fSBYOyIgYnkgInR5cGVkZWYgc3RydWN0IFggWDsgc3RydWN0IFgge307IgorMmFmZWU2MGEgc3BlZWQgdXAgZm9yIEFSTSB1c2luZyA4Yml0IGZvciBib29sZWFuIGRlY29kZXIKKzU3MjVjYWJhIG5ldyBzZWdtZW50YXRpb24gYWxnb3JpdGhtCisyY2YxZjgxNSBNZXJnZSAiZml4IHRoZSBCSVRTPTggY2FzZSIKKzEyZjc4YWVjIGZpeCB0aGUgQklUUz04IGNhc2UKKzY5MjBjNzFmIGZpeCBNU1ZDIHdhcm5pbmdzIHJlZ2FyZGluZyBpbXBsaWNpdCB1aW50NjQgdG8gdWludDMyIGNvbnZlcnNpb25zCitmNmMwOTZhYSB3ZWJwbXV4IGJpbmFyeTogUmVuYW1lICd4bXAnIG9wdGlvbiB0byAnbWV0YScKK2RkZmU4NzFhIHdlYnBtdXggaGVscCBjb3JyZWN0aW9uCitiN2M1NTQ0MiBNZXJnZSAiTWFrZSAqSW5pdFNTRTIoKSBmdW5jdGlvbnMgYmUgZW1wdHkgb24gbm9uLVNTRTIgcGxhdGZvcm0iCisxYzA0YTBkNCBDb21tb24gQVBJcyBmb3IgY2h1bmtzIG1ldGFkYXRhIGFuZCBjb2xvciBwcm9maWxlLgorMmEzMTE3YTEgTWVyZ2UgIkNyZWF0ZSBXZWJQTXV4RnJhbWVJbmZvIHN0cnVjdCBmb3IgTXV4IEFQSXMiCis1YzNhNzIzMSBNYWtlICpJbml0U1NFMigpIGZ1bmN0aW9ucyBiZSBlbXB0eSBvbiBub24tU1NFMiBwbGF0Zm9ybQorN2M2ZTYwZjQgbWFrZSAqSW5pdFNTRTIoKSBmdW5jdGlvbnMgYmUgZW1wdHkgb24gbm9uLVNTRTIgcGxhdGZvcm0KK2M3ZWI0NTc2IG1ha2UgVlA4RHNwSW5pdE5FT04oKSBwdWJsaWMKK2FiMzIzNGFlIENyZWF0ZSBXZWJQTXV4RnJhbWVJbmZvIHN0cnVjdCBmb3IgTXV4IEFQSXMKK2UzOTkwZmQ4IEFsaWdubWVudCBmaXhlcworZTU1ZmJkNmQgTWVyZ2UgYnJhbmNoICcwLjIuMCcKKzQyMzhiYzBhIFVwZGF0ZSBDaGFuZ2VMb2cgKHRhZzogdjAuMi4wKQorYzY1NTM4MGMgZGVjL2lvLmM6IGNvc21ldGljcworZmUxOTU4ZjEgUkdCQTQ0NDQ6IGhhcm1vbml6ZSBsb3NzbGVzcy9sb3NzeSBhbHBoYSB2YWx1ZXMKKzY4MWNiMzBhIGZpeCBSR0JBNDQ0NCBvdXRwdXQgdy9mYW5jeSB1cHNhbXBsaW5nCitmMDZjMWQ4ZiBNZXJnZSAiQWxpZ25tZW50IGZpeCIgaW50byAwLjIuMAorZjU2ZTk4ZmQgQWxpZ25tZW50IGZpeAorNmZlODQzYmEgYXZvaWQgcmdiLXByZW11bHRpcGx5IGlmIHRoZXJlJ3Mgb25seSB0cml2aWFsIGFscGhhIHZhbHVlcworNTI4YTExYWYgZml4IHRoZSBBUkdCNDQ0NCBwcmVtdWx0aXBseSBhcml0aG1ldGljCithMGE0ODg1NSBMb3NzbGVzcyBkZWNvZGVyIGZpeCBmb3IgYSBzcGVjaWFsIHRyYW5zZm9ybSBvcmRlcgorNjJkZDliYjIgVXBkYXRlIGVuY29kaW5nIGhldXJpc3RpYyB3LnIudCBwYWxldHRlIGNvbG9ycy4KKzZmNDI3MmIwIHJlbW92ZSB1bnVzZWQgQXBwbHlJbnZlcnNlVHJhbnNmb3JtKCkKKzkzYmYwZmFhIFVwZGF0ZSBDaGFuZ2VMb2cgKHRhZzogdjAuMi4wLXJjMSkKKzU5MzRmYzU5IHVwZGF0ZSBBVVRIT1JTCiswMTRhNzExZCB1cGRhdGUgTkVXUworNDNiMGQ2MTAgYWRkIHN1cHBvcnQgZm9yIEFSR0IgLT4gWVVWQSBjb252ZXJzaW9uIGZvciBsb3NzbGVzcyBkZWNvZGVyCiszMzcwNWNhMCBidW1wIHZlcnNpb24gdG8gMC4yLjAKK2M0MGQ3ZWYxIGZpeCBhbHBoYS1wbGFuZSBjaGVjayArIGFkZCBleHRyYSBjaGVja3MKK2EwNmY4MDIzIE1PREVfWVVWQTogc2V0IGFscGhhIHRvIG9wYXF1ZSBpZiB0aGUgaW1hZ2UgaGFzIG5vbmUKKzUyYTg3ZGQ3IE1lcmdlICJzaWxlbmNlIG9uZSBtb3JlIHdhcm5pbmciIGludG8gMC4yLjAKKzNiMDIzMDkzIHNpbGVuY2Ugb25lIG1vcmUgd2FybmluZworZjk0YjA0ZjAgbW92ZSBzb21lIFJHQi0+WVVWIGZ1bmN0aW9ucyB0byB5dXYuaAorNGI3MWJhMDMgUkVBRE1FOiBzeW5jIFtjZF13ZWJwIGhlbHAgb3V0cHV0CitjOWFlNTdmNSBtYW4vZHdlYnAuMTogYWRkIGxpbmtzIHRvIG91dHB1dCBmaWxlIGZvcm1hdCBkZXRhaWxzCisyOTJlYzVjYyBxdWlldCBhIGZldyAndW5pbml0aWFsaXplZCcgd2FybmluZ3MKKzRhZjNmNmM0IGZpeCBpbmRlbnRhdGlvbgorOWIyNjFiZjUgcmVtb3ZlIHRoZSBsYXN0IE5PVF9IQVZFX0xPRzIgaW5zdGFuY2VzCiszMjNkYzRkOSByZW1vdmUgdXNlIG9mIGxvZzIoKS4gVXNlIFZQOExGYXN0TG9nMigpIGluc3RlYWQuCis4YzUxNWQ1NCBNZXJnZSAiaGFybmVzcyBzb21lIG1hbGxvYy9jYWxsb2MgdG8gdXNlIFdlYlBTYWZlTWFsbG9jIGFuZCBXZWJQU2FmZUNhbGxvYyIgaW50byAwLjIuMAorZDRiNGJiMDIgTWVyZ2UgY2hhbmdlcyBJNDYwOTA2MjgsSTFhNDFiMmNlIGludG8gMC4yLjAKK2JmZjM0YWMxIGhhcm5lc3Mgc29tZSBtYWxsb2MvY2FsbG9jIHRvIHVzZSBXZWJQU2FmZU1hbGxvYyBhbmQgV2ViUFNhZmVDYWxsb2MKK2EzYzA2M2M3IE1lcmdlICJleHRyYSBzaXplIGNoZWNrIGZvciBzZWN1cml0eSIgaW50byAwLjIuMAorNWU3OTYzMDAgTWVyZ2UgIldlYlBFbmNvZGU6IGNsZWFyIHN0YXRzIGF0IHRoZSBzdGFydCBvZiBlbmNvZGUiIGludG8gMC4yLjAKK2YxZWRmNjJmIE1lcmdlICJyYXRpb25hbGl6ZSB1c2Ugb2YgY29sb3ItY2FjaGUiIGludG8gMC4yLjAKK2MxOTMzMzE3IGV4dHJhIHNpemUgY2hlY2sgZm9yIHNlY3VyaXR5Cis5MDZiZTY1NyByYXRpb25hbGl6ZSB1c2Ugb2YgY29sb3ItY2FjaGUKK2RkMWMzODczIEFkZCBpbWFnZS1oaW50IGZvciBsb3ctY29sb3IgaW1hZ2VzLgorNGViN2FhNjQgTWVyZ2UgIldlYlBDaGVja01hbGxvYygpIGFuZCBXZWJQQ2hlY2tDYWxsb2MoKToiIGludG8gMC4yLjAKKzgwY2M3MzAzIFdlYlBDaGVja01hbGxvYygpIGFuZCBXZWJQQ2hlY2tDYWxsb2MoKToKKzE4M2NiYTgzIGNoZWNrIFZQOExCaXRXcml0ZXJJbml0IHJldHVybgorY2JmYTllZWMgbG9zc2xlc3M6IGZpeCBjcmFzaCBvbiB1c2VyIGFib3J0CisyNTZhZmVmYSBjd2VicDogZXhpdCBpbW1lZGlhdGVseSBvbiB2ZXJzaW9uIG1pc21hdGNoCis0NzVkODdkNyBXZWJQRW5jb2RlOiBjbGVhciBzdGF0cyBhdCB0aGUgc3RhcnQgb2YgZW5jb2RlCithN2NjNzI5MSBmaXggdHlwZSBhbmQgY29udmVyc2lvbiB3YXJuaW5ncworN2Q4NTNkNzkgYWRkIHN0YXRzIGZvciBsb3NzbGVzcworZDM5MTc3YjcgbWFrZSBRdWFudGl6ZUxldmVscygpIHN0b3JlIHRoZSBzdW0gb2Ygc3F1YXJlZCBlcnJvcgorNTk1NWNmNWUgcmVwbGFjZSB4KjE1NS8xMDAgYnkgeCoxMDE1ODE+PjE2Cis3ZDczMmY5MCBtYWtlIFF1YW50aXplTGV2ZWxzKCkgc3RvcmUgdGhlIHN1bSBvZiBzcXVhcmVkIGVycm9yCitlNDVhNDQ2YSByZXBsYWNlIHgqMTU1LzEwMCBieSB4KjEwMTU4MT4+MTYKKzE1OWI3NWQzIGN3ZWJwIG91dHB1dCBzaXplIGNvbnNpc3RlbmN5OgorY2JlZTU5ZWIgTWVyZ2UgY29tbWl0ICd2MC4xLjk5JworMTg4OWU5YjYgZHdlYnA6IHJlcG9ydCAtYWxwaGEgb3B0aW9uCiszYmMzZjdjMCBNZXJnZSAiZHdlYnA6IGFkZCBQQU0gb3V0cHV0IHN1cHBvcnQiIGludG8gMC4yLjAKK2Q5MTllZDA2IGR3ZWJwOiBhZGQgUEFNIG91dHB1dCBzdXBwb3J0Cis4NWUyMTVkMyBSRUFETUUvbWFucGFnZXMvY29uZmlndXJlOiB1cGRhdGUgd2Vic2l0ZSBsaW5rCitjM2EyMDdiOSBVcGRhdGUgQ2hhbmdlTG9nICh0YWc6IHYwLjEuOTkpCitkMWZkNzgyNiBNZXJnZSAiYWRkIGV4dHJhIHByZWNpc2lvbiBhYm91dCBkZWZhdWx0IHZhbHVlcyBhbmQgYmVoYXZpb3VyIiBpbnRvIDAuMi4wCitlZmM4MjZlMCBhZGQgZXh0cmEgcHJlY2lzaW9uIGFib3V0IGRlZmF1bHQgdmFsdWVzIGFuZCBiZWhhdmlvdXIKKzlmMjk2MzVkIGhlYWRlci9kb2MgY2xlYW4gdXAKK2ZmOWZkMWJhIE1ha2VmaWxlLnZjOiBmaXggd2VicG11eC5leGUgKi1keW5hbWljIGJ1aWxkcworOGFhY2M3YjAgcmVtb3ZlIElOQU0sIElDT1AsIC4uLiBjaHVua3MgZnJvbSB0aGUgdGVzdCB3ZWJwIGZpbGUuCisyZmMxMzAxNSBoYXJtb25pemUgYXV0aG9ycyBhcyAiTmFtZSAobWFpbEBhZGRyZXNzKSIKKzRhOWYzN2I3IE1lcmdlICJ1cGRhdGUgTkVXUyIgaW50byAwLjIuMAorNzQxNWFlMTMgbWFrZWZpbGUudW5peDogcHJvdmlkZSBleGFtcGxlcy93ZWJwbXV4IHRhcmdldAorY2U4MmNlZGMgdXBkYXRlIE5FV1MKKzY0MWUyOGU4IE1lcmdlICJtYW4vY3dlYnAuMTogd29yZGluZywgY2hhbmdlIHRoZSBkYXRlIiBpbnRvIDAuMi4wCitjMzdjMjNlNSBSRUFETUU6IGNvc21ldGljcworMzk3NmRjZDUgbWFuL2N3ZWJwLjE6IHdvcmRpbmcsIGNoYW5nZSB0aGUgZGF0ZQorM2U1YmJlMWMgTWVyZ2UgInJlbmFtZSAndXNlX2FyZ2JfaW5wdXQnIHRvICd1c2VfYXJnYiciIGludG8gMC4yLjAKK2NlOTA4NDdhIE1lcmdlICJhZGQgc29tZSBwYWRkaW5nIGJ5dGVzIGFyZWFzIGZvciBsYXRlciB1c2UiIGludG8gMC4yLjAKKzIzOTBkYWJjIE1lcmdlICJmaXhpbmcgdGhlIGZpbmRpbmdzIGJ5IEZyZWRlcmljIEtheXNlciB0byB0aGUgYml0c3RyZWFtIHNwZWMiIGludG8gMC4yLjAKKzAyNzUxNTkxIGFkZCBhIHZlcnkgY3J1ZGUgcHJvZ3Jlc3MgcmVwb3J0IGZvciBsb3NzbGVzcworYTRiOWIxYzYgUmVtb3ZlIHNvbWUgdW51c2VkIGVudW0gdmFsdWVzLgorZGQxMDgxNzYgcmVuYW1lICd1c2VfYXJnYl9pbnB1dCcgdG8gJ3VzZV9hcmdiJworOTA1MTZhZTggYWRkIHNvbWUgcGFkZGluZyBieXRlcyBhcmVhcyBmb3IgbGF0ZXIgdXNlCitkMDNiMjUwMyBmaXhpbmcgdGhlIGZpbmRpbmdzIGJ5IEZyZWRlcmljIEtheXNlciB0byB0aGUgYml0c3RyZWFtIHNwZWMKK2NlMTU2YWZjIGFkZCBtaXNzaW5nIEFCSSBjb21wYXRpYmlsaXR5IGNoZWNrcworOWQ0NTQxNmEgTWVyZ2UgIkRvYzogY29udGFpbmVyIHNwZWMgdGV4dCB0d2Vha3MiIGludG8gMC4yLjAKKzRlMmUwYThjIERvYzogY29udGFpbmVyIHNwZWMgdGV4dCB0d2Vha3MKK2Y3ZjE2YTI5IGFkZCBBQkkgY29tcGF0aWJpbGl0eSBjaGVjaworMmE3NzU1NzAgTWVyZ2UgInN3aWc6IGFkZCBXZWJQRW5jb2RlTG9zc2xlc3MqIHdyYXBwZXJzIiBpbnRvIDAuMi4wCithM2VjNjIyNSBtdXguaDogcmVtb3ZlICcqIGNvbnN0JyBmcm9tIGZ1bmN0aW9uIHBhcmFtZXRlcnMKKzMxNDI2ZWJhIGVuY29kZS5oOiByZW1vdmUgJyogY29uc3QnIGZyb20gZnVuY3Rpb24gcGFyYW1ldGVycworOTgzOGU1ZDUgZGVjb2RlLmg6IHJlbW92ZSAnKiBjb25zdCcgZnJvbSBmdW5jdGlvbiBwYXJhbWV0ZXJzCis0OTcyMzAyZCBzd2lnOiBhZGQgV2ViUEVuY29kZUxvc3NsZXNzKiB3cmFwcGVycworOWZmMDBjYWUgYnVtcCBlbmNvZGVyL2RlY29kZXIgdmVyc2lvbnMKK2MyNDE2YzliIGFkZCBsb3NzbGVzcyBxdWljayBlbmNvZGluZyBmdW5jdGlvbnMgdG8gdGhlIHB1YmxpYyBBUEkKKzRjMWY1ZDY0IE1lcmdlICJORVdTOiBtZW50aW9uIGRlY29kZV92cDguaCBpcyBubyBsb25nZXIgaW5zdGFsbGVkIiBpbnRvIDAuMi4wCis2Y2IyMjc3ZCBORVdTOiBtZW50aW9uIGRlY29kZV92cDguaCBpcyBubyBsb25nZXIgaW5zdGFsbGVkCitkNWU1YWQ2MyBtb3ZlIGRlY29kZV92cDguaCBmcm9tIHdlYnAvIHRvIGRlYy8KKzhkM2IwNGEyIE1lcmdlICJoZWFkZXIgY2xlYW4tdXAiIGludG8gMC4yLjAKKzAyMjAxYzM1IE1lcmdlICJyZW1vdmUgb25lIG1hbGxvYygpIGJ5IG1ha2luZyBjb2xvcl9jYWNoZSBub24gZHluYW1pYyIgaW50byAwLjIuMAorZDcwOGVjMTQgTWVyZ2UgIm1vdmUgTUlOL01BWF9ISVNUT19CSVRTIHRvIGZvcm1hdF9jb25zdGFudHMuaCIgaW50byAwLjIuMAorYWIyZGEzZTkgTWVyZ2UgImFkZCBhIG1hbGxvYygpIGNoZWNrIiBpbnRvIDAuMi4wCisyZDU3MWJkOCBhZGQgYSBtYWxsb2MoKSBjaGVjaworN2YwYzE3OGUgcmVtb3ZlIG9uZSBtYWxsb2MoKSBieSBtYWtpbmcgY29sb3JfY2FjaGUgbm9uIGR5bmFtaWMKKzY1NjljZDdjIE1lcmdlICJWUDhMRmlsbEJpdFdpbmRvdzogdXNlIDY0LWJpdCBwYXRoIGZvciBtc3ZjIHg2NCBidWlsZHMiIGludG8gMC4yLjAKKzIzZDM0ZjMxIGhlYWRlciBjbGVhbi11cAorMmEzYWI2ZjkgbW92ZSBNSU4vTUFYX0hJU1RPX0JJVFMgdG8gZm9ybWF0X2NvbnN0YW50cy5oCis5ODVkM2RhNiBNZXJnZSAic2h1ZmZsZSB2YXJpYWJsZXMgaW4gSGFzaENoYWluRmluZENvcHkiIGludG8gMC4yLjAKK2NkZjg4NWM2IHNodWZmbGUgdmFyaWFibGVzIGluIEhhc2hDaGFpbkZpbmRDb3B5CitjM2IwMTRkYiBBbmRyb2lkLm1rOiBhZGQgbWlzc2luZyBsb3NzbGVzcyBmaWxlcworOGMxY2M2YjUgbWFrZWZpbGUudW5peCBkaXN0OiBleHBsaWNpdGx5IG5hbWUgaW5zdGFsbGVkIGluY2x1ZGVzCis3ZjQ2NDdlZSBNZXJnZSAiY2xhcmlmeSB0aGUgY29sb3JzcGFjZSBuYW1pbmcgYW5kIGJ5dGUgb3JkZXJpbmcgb2YgZGVjb2RlZCBzYW1wbGVzIiBpbnRvIDAuMi4wCitjYmY2OTcyNCBjbGFyaWZ5IHRoZSBjb2xvcnNwYWNlIG5hbWluZyBhbmQgYnl0ZSBvcmRlcmluZyBvZiBkZWNvZGVkIHNhbXBsZXMKKzg1NzY1MGM4IE11eDogQWRkIFdlYlBEYXRhSW5pdCgpIGFuZCByZW1vdmUgV2ViUEltYWdlSW5mbworZmY3NzFlNzcgZG9uJ3QgaW5zdGFsbCB3ZWJwL2RlY29kZV92cDguaAorNTk2ZGZmNzggVlA4TEZpbGxCaXRXaW5kb3c6IHVzZSA2NC1iaXQgcGF0aCBmb3IgbXN2YyB4NjQgYnVpbGRzCiszY2E3Y2U5OCBNZXJnZSAiZG9jOiByZW1vdmUgbm9uLWZpbmFsaXplZCBjaHVuayByZWZlcmVuY2VzIiBpbnRvIDAuMi4wCisxZWZhYTVhMyBNZXJnZSAiYnVtcCB2ZXJzaW9ucyIgaW50byAwLjIuMAorNTFmYTEzZTEgTWVyZ2UgIlJFQURNRTogdXBkYXRlIGN3ZWJwIGhlbHAgb3V0cHV0IiBpbnRvIDAuMi4wCisxMmY5YWVkZSBSRUFETUU6IHVwZGF0ZSBjd2VicCBoZWxwIG91dHB1dAorZjBiNWRlZmIgYnVtcCB2ZXJzaW9ucworNGM0MmE2MWIgdXBkYXRlIEFVVEhPUlMKKzY0MzFhMWNlIGRvYzogcmVtb3ZlIG5vbi1maW5hbGl6ZWQgY2h1bmsgcmVmZXJlbmNlcworODEzMGM0Y2MgTWVyZ2UgImJ1aWxkOiByZW1vdmUgbGlid2VicG11eCBmcm9tIGRlZmF1bHQgdGFyZ2V0cy9jb25maWciCisyM2I0NDQzOCBNZXJnZSAiY29uZmlndXJlOiBicm9hZGVuIHRlc3QgZm9yIGxpYnBuZy1jb25maWciCis4NWJmZjJjZCBNZXJnZSAiZG9jOiBjb3JyZWN0IGxvc3NsZXNzIHByZWZpeCBjb2RpbmcgdGFibGUgJiBjb2RlIgorMDUxMDhmNmUgTWVyZ2UgIk1vcmUgc3BlYy9jb2RlIG1hdGNoaW5nIGluIG11eDoiCis2ODA4ZTY5ZCBNb3JlIHNwZWMvY29kZSBtYXRjaGluZyBpbiBtdXg6CitiZDJiNDZmNSBNZXJnZSAiZG9jL3dlYnAtY29udGFpbmVyLXNwZWM6IGxpZ2h0IGNvc21ldGljcyIKKzIwZWFkMzI5IGRvYy93ZWJwLWNvbnRhaW5lci1zcGVjOiBsaWdodCBjb3NtZXRpY3MKKzFkNDBhOGJjIGNvbmZpZ3VyZTogYWRkIHB0aHJlYWQgZGV0ZWN0aW9uCitiNWU5MDY3YSBmaXggc29tZSBpbnQgPC0+IHNpemVfdCBtaXggZm9yIGJ1ZmZlciBzaXplcworZTQxYTc1OTYgYnVpbGQ6IHJlbW92ZSBsaWJ3ZWJwbXV4IGZyb20gZGVmYXVsdCB0YXJnZXRzL2NvbmZpZworMGZjMmJhYWUgY29uZmlndXJlOiBicm9hZGVuIHRlc3QgZm9yIGxpYnBuZy1jb25maWcKKzQ1YjgyNzJjIE1lcmdlICJyZXN0b3JlIGF1dGhvcnNoaXAgdG8gbG9zc2xlc3MgYml0c3RyZWFtIGRvYyIKKzA2YmEwNTkwIHJlc3RvcmUgYXV0aG9yc2hpcCB0byBsb3NzbGVzcyBiaXRzdHJlYW0gZG9jCis0NGEwOWEzYyBhZGQgbWlzc2luZyBkZXNjcmlwdGlvbiBvZiB0aGUgYWxwaGEgZmlsdGVyaW5nIG1ldGhvZHMKKzYzZGI4N2RkIE1lcmdlICJ2d2VicDogYWRkIGNoZWNrYm9hcmQgYmFja2dyb3VuZCBmb3IgYWxwaGEgZGlzcGxheSIKK2E3M2I4OTc4IHZ3ZWJwOiBhZGQgY2hlY2tib2FyZCBiYWNrZ3JvdW5kIGZvciBhbHBoYSBkaXNwbGF5Cis5MzkxNThjZSBNZXJnZSAidndlYnA6IGZpeCBpbmZvIGRpc3BsYXkiCitiMzVjMDdkOSB2d2VicDogZml4IGluZm8gZGlzcGxheQorNDhiMzllYjEgZml4IHVuZGVyZmxvdyBmb3IgdmVyeSBzaG9ydCBiaXRzdHJlYW1zCis3ZTYyMjk4NCBjb3NtZXRpY3M6IHBhcmFtIGFsaWdubWVudCwgbWFucGFnZSB3b3JkaW5nCisxYmQ3ZGQ1MCBNZXJnZSBjaGFuZ2VzIEk3YjBhZmIwZCxJN2VjYzk3MDgKK2FjNjllNjNlIE1lcmdlICJVcGRhdGVkIGN3ZWJwIG1hbidzIGhlbHAgZm9yIEFscGhhICYgTG9zc2xlc3MuIgorYzBlODg1OWQgR2V0IHJpZCBvZiBpbWFnZV9pbmZvXyBmcm9tIFdlYlBDaHVuayBzdHJ1Y3QuCisxMzVjYTY5ZSBXZWJQIENvbnRhaW5lciBTcGVjOgorZWI2ZjliOGEgVXBkYXRlZCBjd2VicCBtYW4ncyBoZWxwIGZvciBBbHBoYSAmIExvc3NsZXNzLgorMGZhODQ0ZmIgY29zbWV0aWMgZml4ZXMgb24gYXNzZXJ0IGFuZCAnY29uc3QnIHdoZXJlIGFwcGxpY2FibGUKKzdmMjJiZDI1IGNoZWNrIGxpbWl0IG9mIHdpZHRoICogaGVpZ2h0IGlzIDMyIGJpdHMKKzE2YzQ2ZTgzIGF1dG9jb25mL21ha2U6IGNvc21ldGljczogYnJlYWsgbG9uZyBsaW5lcworYWIyMmEwN2EgY29uZmlndXJlOiBhZGQgaGVscGVyIG1hY3JvIHRvIGRlZmluZSAtLXdpdGgtKgorYzE3Njk5YjMgY29uZmlndXJlOiBhZGQgbGlidGlmZiB0ZXN0CiswZTA5NzMyYyBNZXJnZSAiY3dlYnA6IGZpeCBjcmFzaCB3aXRoIHl1diBpbnB1dCArIGxvc3NsZXNzIgorODhhNTEwZmYgTWVyZ2UgImZpeCBiaWctZW5kaWFuIFZQOExXcml0ZUJpdHMiCitkYTk5ZTNiZiBNZXJnZSAiTWFrZWZpbGUudmM6IHNwbGl0IG11eCBpbnRvIHNlcGFyYXRlIGxpYiIKKzdiZGEzOTJiIGN3ZWJwOiBmaXggY3Jhc2ggd2l0aCB5dXYgaW5wdXQgKyBsb3NzbGVzcworZjU2YTM2OWEgZml4IGJpZy1lbmRpYW4gVlA4TFdyaXRlQml0cworNTQxNjlkNmMgTWVyZ2UgImN3ZWJwOiBuYW1lIElucHV0RmlsZUZvcm1hdCBtZW1iZXJzIGNvbnNpc3RlbnRseSIKK2UyZmVlZmE5IE1ha2VmaWxlLnZjOiBzcGxpdCBtdXggaW50byBzZXBhcmF0ZSBsaWIKKzI3Y2FhNWFhIE1lcmdlICJjd2VicDogYWRkIGJhc2ljIFRJRkYgc3VwcG9ydCIKK2Q4OTIxZGQ0IGN3ZWJwOiBuYW1lIElucHV0RmlsZUZvcm1hdCBtZW1iZXJzIGNvbnNpc3RlbnRseQorNmY3NmQyNDYgY3dlYnA6IGFkZCBiYXNpYyBUSUZGIHN1cHBvcnQKKzQ2OTE0MDdiIE1lcmdlIGNoYW5nZXMgSWYzOWFiN2Y1LEkzNjU4YjVhZQorY2NhN2M3YjggRml4ZWQgbml0OiAxMCAtPiAxMC5mCis1ZDA5YTI0NCBXZWJQTXV4Q3JlYXRlKCkgZXJyb3IgaGFuZGxpbmc6Cis3NzczNDFjMyBGaXggYSBtZW1sZWFrIGluIFdlYlBNdXhDcmVhdGUoKQorNjFjOWQxNjEgZG9jOiBjb3JyZWN0IGxvc3NsZXNzIHByZWZpeCBjb2RpbmcgdGFibGUgJiBjb2RlCis0YzM5NzU3OSBNZXJnZSAibWFyayBWUDh7LEx9e0dldEluZm8sQ2hlY2tTaWduYXR1cmV9IGFzIFdFQlBfRVhURVJOIgorZTRlMzZjYzYgTWVyZ2UgIk11eDogQWxsb3cgb25seSBzb21lIGZyYW1lcy90aWxlcyB0byBoYXZlIGFscGhhLiIKK2FkMmFhZDNjIE1lcmdlICJXZWJQIERlY29kaW5nIGVycm9yIGhhbmRsaW5nOiIKKzk3NjQ5YzhmIE11eDogQWxsb3cgb25seSBzb21lIGZyYW1lcy90aWxlcyB0byBoYXZlIGFscGhhLgorZjg2NGJlM2IgTG93ZXIgdGhlIHF1YWxpdHkgc2V0dGluZ3MgZm9yIEFscGhhIGVuY29kaW5nLgorM2JhODFiYmUgV2ViUCBEZWNvZGluZyBlcnJvciBoYW5kbGluZzoKK2ZjYzY5OTIzIGFkZCBhdXRvbWF0aWMgWVVWQS9BUkdCIGNvbnZlcnNpb24gZHVyaW5nIFdlYlBFbmNvZGUoKQorODAyZTAxMmEgZml4IGNvbXBpbGF0aW9uIGluIG5vbi1GQU5DWV9VUFNBTVBMSU5HIG1vZGUKK2UwMTJkZmQ5IG1ha2Ugd2lkdGgvaGVpZ2h0IGNvZGluZyBtYXRjaCB0aGUgc3BlYworMjI4ZDk2YTUgbWFyayBWUDh7LEx9e0dldEluZm8sQ2hlY2tTaWduYXR1cmV9IGFzIFdFQlBfRVhURVJOCis2MzdhMzE0ZiByZW1vdmUgdGhlIG5vdyB1bnVzZWQgKktlZXBBIHZhcmlhbnRzCitkMTFmNmZjYyB3ZWJwbXV4IHJldHVybnMgZXJyb3Igc3RyaW5ncyByYXRoZXIgdGhhbiBudW1iZXJzCitmY2VjMDU5MyBtYWtlZmlsZS51bml4OiBjd2VicDogZml4IE9TWCBsaW5rCis2YjgxMWYxYiBNZXJnZSAiZG9jOiByZW1vdmUgbG9zc2xlc3MgcGRmIgorYzk2MzQ4MjEgZG9jOiByZW1vdmUgbG9zc2xlc3MgcGRmCitiOWFlNGYwZCBjb3NtZXRpY3MgYWZ0ZXIgbXV4IGNoYW5nZXMgYjc0ZWQ2ZSwgYjQ5NGFkNQorYjQ5NGFkNTAgTXV4OiBvbmx5IGFsbG93IGFkZGluZyBmcmFtZS90aWxlcyBhdCB0aGUgZW5kLgorMmMzNDFiMGUgTWVyZ2UgIkFkZGVkIGltYWdlIGNoYXJhY3RlcmlzdGljIGhpbnQgZm9yIHRoZSBjb2RlYy4iCitkMzczMDc2YSBBZGRlZCBpbWFnZSBjaGFyYWN0ZXJpc3RpYyBoaW50IGZvciB0aGUgY29kZWMuCisyZWQyYWRiNSBNZXJnZSAibXN2YzogYWRkIGludHJpbnNpYyBiYXNlZCBCaXRzTG9nMkZsb29yIgorZTU5NWU3YzUgTWVyZ2UgImFkZCBkZW11eC5jIHRvIHRoZSBtYWtlZmlsZXMiCitkYTQ3YjViZCBNZXJnZSAiZGVtdXg6IGFkZCB7TmV4dCxQcmV2fUNodW5rIgorZTVmNDY3NDIgYWRkIGRlbXV4LmMgdG8gdGhlIG1ha2VmaWxlcworNDcwODM5M2MgZGVtdXg6IGFkZCB7TmV4dCxQcmV2fUNodW5rCitlOGEwYTgyMSBkZW11eDogcXVpZXQgbXN2YyB3YXJuaW5ncworN2Y4NDcyYTYgVXBkYXRlIHRoZSBXZWJQIENvbnRhaW5lciBTcGVjLgorMzFiNjhmZTYgY2xlYW51cCBXZWJQUGljdHVyZSBzdHJ1Y3QgYW5kIEFQSQorOTE0NGExODYgYWRkIG92ZXJmbG93IGNoZWNrIGJlZm9yZSBjYWxsaW5nIG1hbGxvYygpCis4MTcyMGM5MSBjb25zaXN0ZW5jeSBjb3NtZXRpY3MKKzJlYmU4Mzk0IE1lcmdlICJBZGQga3JhbWRvd24gdmVyc2lvbiBpbmZvcm1hdGlvbiB0byBSRUFETUUiCis3MTQ0MzA4NCBlbmMvdnA4bC5jOiBmaXggYnVpbGQKK2I3YWMxOWZlIEFkZCBrcmFtZG93biB2ZXJzaW9uIGluZm9ybWF0aW9uIHRvIFJFQURNRQorZWZkY2I2NjcgTWVyZ2UgIkVkaXQgZm9yIGNvbnNpc3RlbmN5LCB1c2FnZSBhbmQgZ3JhbW1hci4iCiswODIyMDEwMiBFbmFibGUgYWxwaGEgaW4gdnZ3ZWJwCis4ZGU5YTA4NCBNZXJnZSAiTXV4IEFQSSBjaGFuZ2U6IgorYjc0ZWQ2ZTcgTXV4IEFQSSBjaGFuZ2U6CisyMzNhNTg5ZSB0YWtlIHBpY3R1cmUtPmFyZ2Jfc3RyaWRlIGludG8gYWNjb3VudCBmb3IgbG9zc2xlc3MgY29kaW5nCiswNGUzM2YxNyBFZGl0IGZvciBjb25zaXN0ZW5jeSwgdXNhZ2UgYW5kIGdyYW1tYXIuCithNTc1YjRiYyBNZXJnZSAiY29zbWV0aWNzOiBhZGQgbWlzc2luZyBjb25zdCIKKzhkOTliMGY0IE1lcmdlICJjb3NtZXRpY3M6IHJlbW92ZSB1bmltcGxlbWVudGVkIGZ1bmN0aW9uIHByb3RvIgorNjlkMDIyMTcgY29zbWV0aWNzOiBhZGQgbWlzc2luZyBjb25zdAorNWIwODMxOGIgY29zbWV0aWNzOiByZW1vdmUgdW5pbXBsZW1lbnRlZCBmdW5jdGlvbiBwcm90bworYjdmYjBlZDUgTG9nIHdhcm5pbmcgZm9yIHVuc3VwcG9ydGVkIG9wdGlvbnMgZm9yIGxvc3NsZXNzLgorZTFmNzY5ZmUgbXN2YzogYWRkIGludHJpbnNpYyBiYXNlZCBCaXRzTG9nMkZsb29yCis4YTY5YzdkOCBCdWctZml4OiBDbGFtcCBiYWNrd2FyZCBkaXN0IHRvIDEuCitiNWI2YWM5NyBNZXJnZSAiQnJpbmcgdGhlIHNwZWNpYWwgd3JpdGVyICdXZWJQTWVtb3J5V3JpdGVyJyB0byBwdWJsaWMgQVBJIgorYTZhMTkwOWYgTWVyZ2UgIkZpeCBmbG9hdGluZyBwb2ludCBleGNlcHRpb24gd2l0aCBjd2VicCAtcHJvZ3Jlc3MiCitmMmNlZTA2NyBGaXggZmxvYXRpbmcgcG9pbnQgZXhjZXB0aW9uIHdpdGggY3dlYnAgLXByb2dyZXNzCis5MWI3YThjNyBCcmluZyB0aGUgc3BlY2lhbCB3cml0ZXIgJ1dlYlBNZW1vcnlXcml0ZXInIHRvIHB1YmxpYyBBUEkKKzMxMGUyOTcyIHN1cHBvcnQgcmVzaXplIGFuZCBjcm9wIGZvciBSR0JBIGlucHV0CithODk4MzVkMyBNZXJnZSBjaGFuZ2VzIEljZTY2Mjk2MCxJZThkN2FhOTAsSTJkOTk2ZDVlLEkwMWMwNDc3MgorY2U2MTRjMGMgTWVyZ2UgImRlYy92cDg6IGF2b2lkIHNldHRpbmcgZGVjb2RlciBzdGF0dXMgdHdpY2UiCis5MDAyODVkYSBkZWMvdnA4OiBhdm9pZCBzZXR0aW5nIGRlY29kZXIgc3RhdHVzIHR3aWNlCis4MjI3YWRjOCBNZXJnZSBjaGFuZ2VzIEk2ZjAyYjBkMCxJNWNiYzljMGEsSTlkZDlkNGVkLElkNjg0ZDJhMQorZGNkYTU5YzEgTWVyZ2UgImRlbXV4OiByZW5hbWUgU2V0VGlsZSB0byBTZWxlY3RUaWxlIgorNjIyZWYxMmUgZGVtdXg6IHJlbmFtZSBTZXRUaWxlIHRvIFNlbGVjdFRpbGUKKzgxZWJkMzc1IE1lcmdlICJkZW11eDogYWRkIHtOZXh0LFByZXZ9RnJhbWUiCiswMmRkMzdhMiBkZW11eDogYWRkIHtOZXh0LFByZXZ9RnJhbWUKKzRiNzlmYTU5IE1lcmdlICJMaW1pdCB0aGUgbWF4aW11bSBzaXplIG9mIGh1ZmZtYW4gSW1hZ2UgdG8gMTZNQi4iCis5YWEzNGIzNCBNYW51YWxseSBudW1iZXIgImNoYXB0ZXJzLCIgYXMgY2hhcHRlciBudW1iZXJzIGFyZSB1c2VkIGluIHRoZSBuYXJyYXRpdmUuCisyYTRjNmMyOSBSZS13cmFwIGF0IDw9IDcyIGNvbHVtbnMKK2E0NWFkYzE5IEFwcGx5IGlubGluZSBlbXBoYXNpcyBhbmQgbW9ub3NwYWNpbmcsIHBlciBnZG9jIC8gUERGCis5MTAxMTIwNiBJbmNvcnBvcmF0ZSBnZG9jIGNoYW5nZXMgdGhyb3VnaCAyMDEyLTA2LTA4Cis3YTE4MjQ4NyBSZW1vdmVkIENvZGVSYXkgc3ludGF4IGRlY2xhcmF0aW9ucyAuLi4KK2IzZWMxOGM1IFByb3ZpZGUgZm9yIGNvZGUtYmxvY2sgc3ludGF4IGhpZ2hsaWdodGluZy4KKzcwOWQ3NzAyIFJlcGxhY2UgaGlnaCBBU0NJSSBhcnRpZmFjdHMgKGN1cmx5IHF1b3RlcywgZXRjLikuCis5MzBlOGFiYiBMb3NzbGVzcyBXZWJQIGRvYyBsYXJnZWx5IHBvcnRlZCB0byBtYXJrZG93biB0ZXh0LgorMThjYWUzN2IgbXN2Yzogc2lsZW5jZSBzb21lIGJ1aWxkIHdhcm5pbmdzCitiMzkyMzA4NCBMaW1pdCB0aGUgbWF4aW11bSBzaXplIG9mIGh1ZmZtYW4gSW1hZ2UgdG8gMTZNQi4KK2YxODBkZjJhIE1lcmdlICJsaWJ3ZWJwL2RlbXV4OiBhZGQgRnJhbWUvQ2h1bmsgaXRlcmF0aW9uIgorMmJiZTFjOWEgTWVyZ2UgIkVuYWJsZSBsb3NzbGVzcyBlbmNvZGVyIGNvZGUiCitkMDYwMWIwMSBNZXJnZSBjaGFuZ2VzIEkxZDk3YTYzMyxJODFjNTkwOTMKKzc4ZjNlMzQ1IEVuYWJsZSBsb3NzbGVzcyBlbmNvZGVyIGNvZGUKK2Q5NzRhOWNjIE1lcmdlICJsaWJ3ZWJwL2RlbXV4OiBhZGQgc2ltcGxlIGZvcm1hdCBwYXJzaW5nIgorMjZiZjIyMzIgTWVyZ2UgImxpYndlYnA6IGFkZCBXZWJQRGVtdXggc3R1YiBmdW5jdGlvbnMiCisyZjY2NjY4OCBNZXJnZSAibW9kaWZ5IFdlYlBQYXJzZUhlYWRlcnMgdG8gYWxsb3cgcmV1c2UgYnkgR2V0RmVhdHVyZXMiCitiNDAyYjFmYiBsaWJ3ZWJwL2RlbXV4OiBhZGQgRnJhbWUvQ2h1bmsgaXRlcmF0aW9uCithZDlhZGEzYiBsaWJ3ZWJwL2RlbXV4OiBhZGQgV2ViUERlbXV4R2V0SQorMmYyZDRkNTggbGlid2VicC9kZW11eDogYWRkIGV4dGVuZGVkIGZvcm1hdCBwYXJzaW5nCis5NjJkY2VmNiBsaWJ3ZWJwL2RlbXV4OiBhZGQgc2ltcGxlIGZvcm1hdCBwYXJzaW5nCitmOGY5NDA4MSBsaWJ3ZWJwOiBhZGQgV2ViUERlbXV4IHN0dWIgZnVuY3Rpb25zCitmYjQ3YmI1YyBNZXJnZSAiTnVtTmFtZWRFbGVtZW50cygpIHNob3VsZCB0YWtlIGFuIGVudW0gcGFyYW0uIgorN2M2ODk4MDUgRml4IGFzc2VydHMgaW4gUGFsZXR0ZSBhbmQgQmFja3dhcmRSZWZlcmVuY2UgY29kZS4KK2ZiZGNiN2VhIE51bU5hbWVkRWxlbWVudHMoKSBzaG91bGQgdGFrZSBhbiBlbnVtIHBhcmFtLgorZmI0OTQzYmQgbW9kaWZ5IFdlYlBQYXJzZUhlYWRlcnMgdG8gYWxsb3cgcmV1c2UgYnkgR2V0RmVhdHVyZXMKKzM2OTdiNWNlIHdyaXRlIGFuIGFkLWhvYyBFbmNvZGVJbWFnZUludGVybmFsIHZhcmlhbnQKK2VhZWU5ZTc5IEJ1Zy1GaXg6IERlY29kZSBzbWFsbCAobGVzcyB0aGFuIDMyIGJ5dGVzKSBpbWFnZXMuCiswYmNlYWU0OCBNZXJnZSAiY3dlYnA6IGZpeCBhbHBoYSByZXBvcnRpbmcgaW4gc3RhdHMgb3V0cHV0IgorMDQyNGIxZWYgUmViYXNlIGRlZmF1bHQgZW5jb2Rpbmcgc2V0dGluZ3MuCitjNzFmZjllMyBjd2VicDogZml4IGFscGhhIHJlcG9ydGluZyBpbiBzdGF0cyBvdXRwdXQKK2UyZmZlNDQ2IE1lcmdlICJTdG9wIGluZGVmaW5pdGUgcmVjdXJzaW9uIGZvciBIdWZmbWFuIEltYWdlLiIKKzcwZWIyYmQ2IFN0b3AgaW5kZWZpbml0ZSByZWN1cnNpb24gZm9yIEh1ZmZtYW4gSW1hZ2UuCitmM2JhYjhlYiBVcGRhdGUgdndlYnAKKzZkNWM3OTdjIFJlbW92ZSBzdXBwb3J0IGZvciBwYXJ0aWFsIGZpbGVzIGluIE11eC4KK2YxZGY1NTg3IFdlYlBNdXhBc3NlbWJsZSgpIHJldHVybnMgV2ViUERhdGEqLgorODE0YTA2MzkgUmVuYW1lICdBZGQnIEFQSXMgdG8gJ1NldCcuCitiYmIwMjE4ZiBVcGRhdGUgTXV4IHBzdWVkby1jb2RlIGV4YW1wbGVzLgorNGZjNGE0N2YgVXNlIFdlYlBEYXRhIGluIE1VWCBzZXQgQVBJcworYzY3YmM5NzkgTWVyZ2UgImFkZCBXZWJQUGljdHVyZUltcG9ydFJHQlgoKSBhbmQgV2ViUFBpY3R1cmVJbXBvcnRCR1JYKCkiCisyNzUxOWJjMiBhZGQgV2ViUFBpY3R1cmVJbXBvcnRSR0JYKCkgYW5kIFdlYlBQaWN0dXJlSW1wb3J0QkdSWCgpCitmODBjZDI3ZSBmYWN0b3JpemUgY29kZSBpbiBJbXBvcnQoKQorOWI3MTUwMjYgaGlzdG9ncmFtOiBhZGQgbG9nMiB3cmFwcGVyCis4YzM0Mzc4ZiBNZXJnZSAiZml4IHNvbWUgaW1wbGljaXQgdHlwZSBjb252ZXJzaW9uIHdhcm5pbmdzIgorNDJmNmRmOWQgZml4IHNvbWUgaW1wbGljaXQgdHlwZSBjb252ZXJzaW9uIHdhcm5pbmdzCisyNTBjMTZlMyBNZXJnZSAiZG9jOiB1cGRhdGUgbG9zc2xlc3MgcGRmIgorOWQ5ZGFiYTQgTWVyZ2UgImFkZCBhIFBERiBvZiB0aGUgbG9zc2xlc3Mgc3BlYyIKKzhmYmI5MTg4IHByZWZlciB3ZWJwL3R5cGVzLmggb3ZlciBzdGRpbnQuaAorMGNhMTcwYzIgZG9jOiB1cGRhdGUgbG9zc2xlc3MgcGRmCiswODYyYWM2ZSBhZGQgYSBQREYgb2YgdGhlIGxvc3NsZXNzIHNwZWMKKzQzNzk5OWZiIGludHJvZHVjZSBhIGdlbmVyaWMgV2ViUFBpY3R1cmVIYXNUcmFuc3BhcmVuY3koKSBmdW5jdGlvbgorZDJiNmM2YzAgY29zbWV0aWMgZml4ZXMgYWZ0ZXIgSWRhYmEyODFhCitiNGU2NjQ1YyBNZXJnZSAiYWRkIGNvbG9yc3BhY2UgZm9yIHByZW11bHRpcGxpZWQgYWxwaGEiCis0OGY4Mjc1NyBhZGQgY29sb3JzcGFjZSBmb3IgcHJlbXVsdGlwbGllZCBhbHBoYQorMDY5ZjkwM2EgQ2hhbmdlIGluIGxvc3NsZXNzIGJpdC1zdHJlYW0uCis1ZjdiYjNmNSBNZXJnZSAiV2ViUFJlcG9ydFByb2dyZXNzOiB1c2Ugbm9uLWVuY29kZXIgc3BlY2lmaWMgcGFyYW1zIgorZjE4MjgxZmYgV2ViUFJlcG9ydFByb2dyZXNzOiB1c2Ugbm9uLWVuY29kZXIgc3BlY2lmaWMgcGFyYW1zCis5ZWYzMjI4MyBBZGQgc3VwcG9ydCBmb3IgcmF3IGxvc3NsZXNzIGJpdHN0cmVhbSBpbiBkZWNvZGVyLgorN2NiZWUyOWEgRml4IGJ1ZzogSW5pdElvIHJlc2V0aW5nIGZhbmN5X3Vwc2FtcGxpbmcgZmxhZy4KKzg4MGZkOThjIHZ3ZWJwOiBmaXggZXhpdCB3L2ZyZWVnbHV0CisxODc1ZDkyNiB0cmFwIHR3byB1bmNoZWNrZWQgZXJyb3IgY29uZGl0aW9ucworODdiNGE5MDggbm8gbmVlZCB0byBoYXZlIG11eC5oIGFzIG5vaW5zdCBjbGF1c2UgaW4gZW5jLworODhmNDFlYzYgZG9jOiBmaXggYml0IGFsaWdubWVudCBpbiBWUDhYIGNodW5rCis1MmY1YTRlZiBNZXJnZSAiZml4IGJ1ZyB3aXRoIGxvc3N5LWFscGhhIG91dHB1dCBzdHJpZGUiCiszYmRlMjJkNyBmaXggYnVnIHdpdGggbG9zc3ktYWxwaGEgb3V0cHV0IHN0cmlkZQorNDJkNjFiNmQgdXBkYXRlIHRoZSBzcGVjIGZvciB0aGUgbG9zc3ktYWxwaGEgY29tcHJlc3Npb24gbWV0aG9kcy4KK2U3NWRjODA1IE1vdmUgc29tZSBtb3JlIGRlZmluZXMgdG8gZm9ybWF0X2NvbnN0YW50cy5oCitjMTNmNjYzMiBNb3ZlIGNvbnN0cyB0byBpbnRlcm5hbCBoZWFkZXIgZm9ybWF0X2NvbnN0YW50cy5oCis3ZjJkZmM5MiB1c2UgYSBiaXQtc2V0IHRyYW5zZm9ybXNfc2Vlbl8gaW5zdGVhZCBvZiBsb29waW5nCisxOGRhMWY1MyBtb2R1bGF0ZSBhbHBoYS1jb21wcmVzc2lvbiBlZmZvcnQgYWNjb3JkaW5nIHRvIGNvbmZpZy5tZXRob2QKK2Y1ZjJmZmY2IE1lcmdlICJBbHBoYSBmbGFnIGZpeCBmb3IgbG9zc2xlc3MuIgorYzk3NWM0NGUgQWxwaGEgZmxhZyBmaXggZm9yIGxvc3NsZXNzLgorNGYwNjdmYjIgTWVyZ2UgIkFuZHJvaWQ6IG9ubHkgYnVpbGQgZGVjX25lb24gd2l0aCBORU9OIHN1cHBvcnQiCisyNTVjNjZiNCBBbmRyb2lkOiBvbmx5IGJ1aWxkIGRlY19uZW9uIHdpdGggTkVPTiBzdXBwb3J0Cis4ZjkxMTdhOSBjb3NtZXRpY3M6IHNpZ25hdHVyZSBmaXhlcworMzliZjVkNjQgdXNlIGhlYWRlci1sZXNzIGxvc3NsZXNzIGJpdHN0cmVhbSBmb3IgYWxwaGEgY2hhbm5lbAorNzVkN2YzYjIgTWVyZ2UgIm1ha2UgaW5wdXQgZGF0YSBiZSAnY29uc3QnIGZvciBWUDhMSW52ZXJzZVRyYW5zZm9ybSgpIgorOWE3MjFjNmQgbWFrZSBpbnB1dCBkYXRhIGJlICdjb25zdCcgZm9yIFZQOExJbnZlcnNlVHJhbnNmb3JtKCkKKzlmYzY0ZWRjIERpc2FsbG93IHJlLXVzZSBvZiBzYW1lIHRyYW5zZm9ybWF0aW9uLgorOThlYzcxN2YgIHVzZSBhIGZ1bmN0aW9uIHBvaW50ZXIgZm9yIFByb2Nlc3NSb3dzKCkKK2Y3YWU1ZTM3IGNvc21ldGljczogam9pbiBsaW5lCisxNDBiODlhMyBmYWN0b3Igb3V0IGJ1ZmZlciBhbGxvYyBpbiBBbGxvY2F0ZUFSR0JCdWZmZXJzKCkKK2ExMDdkZmE4IFJlY3RpZnkgV2ViUFBhcnNlT3B0aW9uYWxDaHVua3MoKS4KKzIzN2VhYjY3IEFkZCB0d28gbW9yZSBjb2xvci1zcGFjZXMgZm9yIGxvc3NsZXNzIGRlY29kaW5nLgorMjdmNDE3YWIgZml4IG9ydGhvZ3JhcGhpYyB0eXBvCis0ODllYzMzNSBhZGQgVlA4TEVuY29kZVN0cmVhbSgpIHRvIGNvbXByZXNzIGxvc3NsZXNzIGltYWdlIHN0cmVhbQorZmE4YmMzZGIgbWFrZSBXZWJQRW5jb2RpbmdTZXRFcnJvcigpIHRha2UgYSBjb25zdCBwaWN0dXJlCis2Mzg1MjhjZCBiaXRzdHJlYW0gdXBkYXRlIGZvciBsb3NzeSBhbHBoYSBjb21wcmVzc2lvbgorZDczZTYzYTcgYWRkIERlcXVhbnRpemVMZXZlbHMoKSBwbGFjZWhvbGRlcgorZWMxMjJlMDkgcmVtb3ZlIGFyY2gtZGVwZW5kZW50IHJhbmQoKQorZDQwZTc2NTMgZml4IGFsaWdubWVudAorMWRkNmE4YjYgTWVyZ2UgInJlbW92ZSB0Y29kZXIsIHN3aXRjaCBhbHBoYS1wbGFuZSBjb21wcmVzc2lvbiB0byBsb3NzbGVzcyIKKzNlODYzZGRhIHJlbW92ZSB0Y29kZXIsIHN3aXRjaCBhbHBoYS1wbGFuZSBjb21wcmVzc2lvbiB0byBsb3NzbGVzcworOGQ3N2RjMjkgQWRkIHN1cHBvcnQgZm9yIGxvc3NsZXNzIGluIG11eDoKKzgzMWJkMTMxIE1ha2UgdGlsZSBzaXplIGEgZnVuY3Rpb24gb2YgZW5jb2RpbmcgbWV0aG9kLgorNzc4YzUyMjggTWVyZ2UgInJlbW92ZSBzb21lIHZhcmlhYmxlIHNoYWRvd2luZyIKKzgxN2M5ZGNlIEZldyBtb3JlIEh1ZmZtYW5UcmVlVG9rZW4gY29udmVyc2lvbnMuCiszN2E3N2E2YiByZW1vdmUgc29tZSB2YXJpYWJsZSBzaGFkb3dpbmcKKzg5YzA3Yzk2IE1lcmdlICJub3JtYWxpemUgZXhhbXBsZSBoZWFkZXIgaW5jbHVkZXMiCis0YWZmNDExZiBNZXJnZSAiYWRkIGV4YW1wbGVfdXRpbC5baGNdIgorMDBiMjllMjggbm9ybWFsaXplIGV4YW1wbGUgaGVhZGVyIGluY2x1ZGVzCiswNjEyNjNhNyBhZGQgZXhhbXBsZV91dGlsLltoY10KK2M2ODgyYzQ5IG1lcmdlIGFsbCB0cmVlIHByb2Nlc3NpbmcgaW50byBhIHNpbmdsZSBWUDhMUHJvY2Vzc1RyZWUoKQorOWM3YTNjZjUgZml4IFZQOExIaXN0b2dyYW1OdW1Db2RlcyB0byBoYW5kbGUgdGhlIGNhc2UgcGFsZXR0ZV9jb2RlX2JpdHMgPT0gMAorYjU1NTFkMmUgTWVyZ2UgIkFkZGVkIEh1ZmZtYW5UcmVlQ29kZSBTdHJ1Y3QgZm9yIHRyZWUgY29kZXMuIgorOGI4NWQwMWMgQWRkZWQgSHVmZm1hblRyZWVDb2RlIFN0cnVjdCBmb3IgdHJlZSBjb2Rlcy4KKzA5M2Y3NmQ4IE1lcmdlICJBbGxvY2F0ZSBzaW5nbGUgbWVtb3J5IGluIEdldEh1ZmZCaXRMZW5ndGhzQW5kQ29kZXMuIgorNDFkODA0OTQgQWxsb2NhdGUgc2luZ2xlIG1lbW9yeSBpbiBHZXRIdWZmQml0TGVuZ3Roc0FuZENvZGVzLgorMWIwNGY2ZDIgQ29ycmVjdCBzaXplIGluIFZQOEwgaGVhZGVyLgorMjkyNGE1YWUgTWFrZWZpbGUudmM6IHNwbGl0IG9iamVjdCBsaXN0cyBiYXNlZCBvbiBkaXJlY3RvcnkKK2M4ZjI0MTY1IE1lcmdlICJhZGQgYXNzZXJ0KHRva2VucykiCis0MzIzOTk0NyBhZGQgYXNzZXJ0KHRva2VucykKKzlmNTQ3NDUwIENhdGNoIGFuIGVycm9yIGluIERlY29kZUltYWdlRGF0YSgpLgorYWM4ZTVlNDIgbWlub3IgdHlwbyBhbmQgc3R5bGUgZml4Cis5ZjU2NmQxZCBjbGVhbi11cCBhcm91bmQgSHVmZm1hbi1lbmNvZGUKK2M1NzlhNzEwIEludHJvZHVjZSBDSFVOS19TSVpFX0JZVEVTIGluIG11eGkuaC4KKzE0NzU3ZjhhIE1ha2Ugc3VyZSBodWZmbWFuIHRyZWVzIGFsd2F5cyBoYXZlIHZhbGlkIHN5bWJvbHMKKzQxMDUwNjE4IG1ha2VmaWxlLnVuaXg6IGFkZCBzdXBwb3J0IGZvciBidWlsZGluZyB2d2VicAorNDhiMzc3MjEgTWVyZ2UgImZpeGVkIHNpZ25lZC91bnNpZ25lZCBjb21wYXJpc29uIHdhcm5pbmciCis1N2Y2OTZkYSBNZXJnZSAiRW5jb2RlSW1hZ2VJbnRlcm5hbDogZml4IHBvdGVudGlhbCBsZWFrIgorZDk3MmNkZjIgRW5jb2RlSW1hZ2VJbnRlcm5hbDogZml4IHBvdGVudGlhbCBsZWFrCis1Y2QxMmMzZCBmaXhlZCBzaWduZWQvdW5zaWduZWQgY29tcGFyaXNvbiB3YXJuaW5nCitjZGNhMzBkMCBNZXJnZSAiY29zbWV0aWNzOiBzaG9ydGVuIGxvbmcgbGluZSIKK2UwMjVmYjU1IGNvc21ldGljczogc2hvcnRlbiBsb25nIGxpbmUKKzIyNjcxZWQ2IE1lcmdlICJlbmMvdnA4bDogZml4IGRvdWJsZSBmcmVlIG9uIGVycm9yIgorZTFiOWIwNTIgTWVyZ2UgImNvc21ldGljczogVlA4TENyZWF0ZUh1ZmZtYW5UcmVlOiBmaXggaW5kZW50IgorYThlNzI1ZjggZW5jL3ZwOGw6IGZpeCBkb3VibGUgZnJlZSBvbiBlcnJvcgorMjc1NDFmYmQgY29zbWV0aWNzOiBWUDhMQ3JlYXRlSHVmZm1hblRyZWU6IGZpeCBpbmRlbnQKKzFkMzhiMjU4IGN3ZWJwL3dpbmRvd3M6IHVzZSBNQUtFX1JFRkdVSUQgd2hlcmUgYXBwcm9wcmlhdGUKKzgxN2VmNmU5IE1lcmdlICJjd2VicDogZml4IFdJQy9NaWNyb3NvZnQgU0RLIGNvbXBhdGliaWxpdHkgaXNzdWUiCis5MDJkM2UzYiBjd2VicDogZml4IFdJQy9NaWNyb3NvZnQgU0RLIGNvbXBhdGliaWxpdHkgaXNzdWUKKzg5ZDgwM2M0IE1lcmdlICJGaXggYSBjcmFzaCBkdWUgdG8gd3JvbmcgcG9pbnRlci1pbnRlZ2VyIGFyaXRobWV0aWMuIgorY2IxYmQ3NDEgTWVyZ2UgIkZpeCBhIGNyYXNoIGluIGxvc3NsZXNzIGRlY29kZXIuIgorZGUyZmUyMDIgTWVyZ2UgIlNvbWUgY2xlYW51cCBpbiBWUDhMQ3JlYXRlSHVmZm1hblRyZWUoKSAoYW5kIHJlbGF0ZWQgZnVuY3Rpb25zIENvbXBhcmVIdWZmbWFuVHJlZXMoKSBhbmQgU2V0Qml0RGVwdGhzKCkpOiAtIE1vdmUgJ3RyZWVfc2l6ZScgaW5pdGlhbGl6YXRpb24gYW5kIG1hbGxvYyBmb3IgJ3RyZWUgKyB0cmVlX3Bvb2wnICAgb3V0c2lkZSB0aGUgbG9vcC4gLSBTb21lIHJlbmFtZXMvdHdlYWtzIGZvciByZWFkYWJpbGl0eS4iCitjZTY5MTc3YSBGaXggYSBjcmFzaCBkdWUgdG8gd3JvbmcgcG9pbnRlci1pbnRlZ2VyIGFyaXRobWV0aWMuCitlNDBhMzY4NCBGaXggYSBjcmFzaCBpbiBsb3NzbGVzcyBkZWNvZGVyLgorMzkyN2ZmM2EgcmVtb3ZlIHVubmVlZGVkIGVycm9yIGNvbmRpdGlvbiBmb3IgV2ViUE11eE51bU5hbWVkRWxlbWVudHMoKQorMmMxNDBlMTEgU29tZSBjbGVhbnVwIGluIFZQOExDcmVhdGVIdWZmbWFuVHJlZSgpIChhbmQgcmVsYXRlZCBmdW5jdGlvbnMgQ29tcGFyZUh1ZmZtYW5UcmVlcygpIGFuZCBTZXRCaXREZXB0aHMoKSk6IC0gTW92ZSAndHJlZV9zaXplJyBpbml0aWFsaXphdGlvbiBhbmQgbWFsbG9jIGZvciAndHJlZSArIHRyZWVfcG9vbCcgICBvdXRzaWRlIHRoZSBsb29wLiAtIFNvbWUgcmVuYW1lcy90d2Vha3MgZm9yIHJlYWRhYmlsaXR5LgorODYxYTViN2IgYWRkIHN1cHBvcnQgZm9yIGFuaW1hdGlvbgorZWI1YzE2Y2MgTWVyZ2UgIlNldCBjb3JyZWN0IGVuY29kZSBzaXplIGluIGVuY29kZXIncyBzdGF0cy4iCis0YWJlMDRhMiBmaXggdGhlIHJldHVybiB2YWx1ZSBhbmQgaGFuZGxlIG1pc3NpbmcgaW5wdXQgZmlsZSBjYXNlLgorMmZhZmI4NTUgU2V0IGNvcnJlY3QgZW5jb2RlIHNpemUgaW4gZW5jb2RlcidzIHN0YXRzLgorZTcxNjdhMmIgUHJvdmlkZSBvbmUgZW50cnkgcG9pbnQgZm9yIGJhY2t3YXJkIHJlZmVyZW5jZXMuCitjNGNjYWI2NCBQcmludCByZWxldmFudCBsb3NzbGVzcyBlbmNvZGluZyBzdGF0cyBpbiBjd2VicC4KK2UzMzAyY2ZkIEdldEh1ZmZCaXRMZW5ndGhzQW5kQ29kZXM6IHJlZHVjZSBsZXZlbCBvZiBpbmRpcmVjdGlvbgorYjVmMmE5ZWQgZW5jL3ZwOGw6IGZpeCB1bmluaXRpYWxpemVkIHZhcmlhYmxlIHdhcm5pbmcKKzc4ODVmOGIyIG1ha2VmaWxlLnVuaXg6IGFkZCBsb3NzbGVzcyBlbmNvZGVyIGZpbGVzCisxMjYxYTRjOCBNZXJnZSAiY29zbWV0aWNzIgorMzkyNmI1YmUgTWVyZ2UgImRzcC9jcHUuYzogQW5kcm9pZDogZml4IGNyYXNoIG9uIG5vbi1uZW9uIGFybSBidWlsZHMiCis4MzRmOTM3ZiBkc3AvY3B1LmM6IEFuZHJvaWQ6IGZpeCBjcmFzaCBvbiBub24tbmVvbiBhcm0gYnVpbGRzCisxMjZlMTYwNiBjb3NtZXRpY3MKK2UzODYwMmQyIE1lcmdlIGJyYW5jaCAnbG9zc2xlc3NfZW5jb2RlcicKK2U4ZDNkNmEwIHNwbGl0IFN0b3JlSHVmZm1hbkNvZGUoKSBpbnRvIHNtYWxsZXIgZnVuY3Rpb25zCitkMGQ4ODk5MCBtb3JlIGNvbnNvbGlkYXRpb246IGludHJvZHVjZSBWUDhMSGlzdG9ncmFtU2V0CisxYTIxMGVmMSBiaWcgY29kZSBjbGVhbi11cCBhbmQgcmVmYWN0b3JpbmcgYW5kIG9wdGltaXphdGlvbgorNDFiNWM4ZmYgU29tZSBjb3NtZXRpY3MgaW4gaGlzdG9ncmFtLmMKK2FkYTZmZjc3IEFwcHJveGltYXRlIEZhc3RMb2cgYmV0d2VlbiB2YWx1ZSByYW5nZSBbMjU2LCA4MTkyXQorZWMxMjNjYTMgRm9yZ290IHRvIHVwZGF0ZSBvdXRfYml0X2Nvc3RzIHRvIHN5bWJvbF9iaXRfY29zdHMgYXQgb25lIGluc3RhbmNlLgorY2YzM2NjZDEgRXZhbHVhdGUgb3V0cHV0IGNsdXN0ZXIncyBiaXRfY29zdHMgb25jZSBpbiBIaXN0b2dyYW1SZWZpbmUuCis3ODFjMDFmNCBTaW1wbGUgSHVmZm1hbiBjb2RlIGNoYW5nZXMuCithMjg0OWJjNSBMb3NzbGVzcyBkZWNvZGVyOiByZW1vdmUgYW4gdW5uZWVkZWQgcGFyYW0gaW4gUmVhZEh1ZmZtYW5Db2RlTGVuZ3RocygpLgorYjM5ZTc0ODcgUmVkdWNpbmcgZW1lcmdpbmcgcGFsZXR0ZSBzaXplIGZyb20gMTEgdG8gOSBiaXRzLgorYmZjNzNkYjQgTW92ZSBHZXRIaXN0SW1hZ2VTeW1ib2xzIHRvIGhpc3RvZ3JhbS5jCis4ODlhNTc4NiBJbXByb3ZlIHByZWRpY3QgdnMgbm8tcHJlZGljdCBoZXVyaXN0aWMuCiswMWY1MDY2MyBjb2RlLW1vdmluZyBhbmQgY2xlYW4tdXAKKzMxMDM1ZjNiIHJlZHVjZSBtZW1vcnkgdXNhZ2UgYnkgYWxsb2NhdGluZyBvbmx5IG9uZSBoaXN0bworZmJiNTAxYjggUmVzdHJpY3QgaGlzdG9fYml0cyB0byBlbnN1cmUgaGlzdG9faW1hZ2Ugc2l6ZSBpcyB1bmRlciAzMk1CCis4NDE1ZGRmMyBmdXJ0aGVyIHNpbXBsaWZpY2F0aW9uIGZvciB0aGUgbWV0YS1IdWZmbWFuIGNvZGluZworZTQ5MTcyOTkgQSBxdWljayBwYXNzIG9mIGNsZWFudXAgaW4gYmFja3dhcmQgcmVmZXJlbmNlIGNvZGUKKzgzMzMyYjNjIE1ha2UgdHJhbnNmb3JtIGJpdHMgYSBmdW5jdGlvbiBvZiBlbmNvZGUgbWV0aG9kICgtbSkuCis3MjkyMGNhYSBpbnRyb2R1Y2UgLWxvc3NsZXNzIG9wdGlvbiwgcHJvdGVjdGVkIGJ5IFVTRV9MT1NTTEVTU19FTkNPREVSCitjNmFjNGRmYiBSdW4gVHJhY2VCYWNrd2FyZHMgZm9yIGhpZ2hlciBxdWFsaXRpZXMuCis0MTIyMjJjOCBNYWtlIGhpc3RvX2JpdHMgYW5kIHRyYW5zZm9ybV9iaXRzIGZ1bmN0aW9uIG9mIHF1YWxpdHkuCisxNDliNTA5OCBVcGRhdGUgbG9zc2xlc3MgZW5jb2RlciBzdHJhdGVneToKKzBlNmZhMDY1IGNhY2hlX2JpdHMgcGFzc2VkIHRvIEVuY29kZUltYWdlSW50ZXJuYWwoKQorZTM4YjQwYTkgRmFjdG9yaXplIGNvZGUgZm9yIGNsZWFyaW5nIEh0cmVlR3JvdXAuCis2ZjRhMTZlYSBSZW1vdmluZyB0aGUgaW5kaXJlY3Rpb24gb2YgbWV0YS1odWZmbWFuIHRhYmxlcy4KKzNkMzNlY2QxIFNvbWUgcmVuYW1pbmcvY29tbWVudHMgcmVsYXRlZCB0byBwYWxldHRlIGluIGxvc3NsZXNzIGVuY29kZXIuCis0ZDAyZDU4NiBMb3NzbGVzcyBlbmNvZGVyOiBjb3JyZWN0aW9uIGluIFBhbGV0dGUgc3RvcmFnZQorNGE2MzYyMzUgZml4IGEgbWVtbGVhayBpbiBFbmNvZGVJbWFnZUludGVybmFsKCkKKzA5OTNhNjExIEZ1bGwgYW5kIGZpbmFsIGZpeCBmb3IgcHJlZGljdGlvbiB0cmFuc2Zvcm0KK2FmZDIxMDJmIEZpeCBjcm9zcy1jb2xvciB0cmFuc2Zvcm0gaW4gbG9zc2xlc3MgZW5jb2RlcgorYjk2ZDg3NDAgTmVlZCB0byB3cml0ZSBhICcwJyBiaXQgYXQgdGhlIGVuZCBvZiB0cmFuc2Zvcm1zLgorNTRkYWQ3ZTUgQ29sb3IgY2FjaGUgc2l6ZSBzaG91bGQgYmUgY291bnRlZCBhcyAwIHdoZW4gY2FjaGUgYml0cyA9IDAKKzRmMGM1Y2FmIEZpeCBwcmVkaWN0aW9uIHRyYW5zZm9ybSBpbiBsb3NzbGVzcyBlbmNvZGVyLgorMzZkYWJkYWQgRml4IG1lbW9yeSBsZWFrIGluIG1ldGhvZCBFbmNvZGVJbWFnZUludGVybmFsIGZvciBoaXN0b2dyYW1faW1hZ2UuCiszNTJhNGY0OSBHZXQgcmlkIG9mIFBhY2tMaXRlcmFsQml0TGVuZ3RocygpCitkNjczYjZiOSBDaGFuZ2UgdGhlIHByZWRpY3RvciBmdW5jdGlvbiB0byBwYXNzIGxlZnQgcGl4ZWwKK2IyZjk5NDY1IEZpeCBDb3B5VGlsZVdpdGhQcmVkaWN0aW9uKCkKKzg0NTQ3ZjU0IEFkZCBFbmNvZGVJbWFnZUludGVybmFsKCkgbWV0aG9kLgorNmIzODM3OGEgR3VhcmQgdGhlIGxvc3NsZXNzIGVuY29kZXIgKGluIGZsdXgpIHVuZGVyIGEgZmxhZworMDlmNzUzMmMgRml4IGZldyBuaXRzIChjb25zdCBxdWFsaWZpZXJzKQorNjQ4YmUzOTMgQWRkZWQgaW1wbGVtZW50YXRpb24gZm9yIHZhcmlvdXMgbG9zc2xlc3MgZnVuY3Rpb25zCiszMjcxNGNlMyBBZGQgVlA4TCBwcmVmaXggdG8gYmFja3dhcmQgcmVmICYgaGlzdG9ncmFtIG1ldGhvZHMuCitmY2JhN2JlMiBGaXhlZCBoZWFkZXIgZmlsZSB0YWcgKFdFQlBfVVRJTFNfSFVGRk1BTl9FTkNPREVfSF8pCitiYzcwMzc0NiBBZGQgYmFja3dhcmRfcmVmLCBoaXN0b2dyYW0gJiBodWZmbWFuIGVuY29kZSBtb2R1bGVzIGZyb20gbG9zc2xlc3MuCitmZGNjYWFkZCBGaXhpbmcgbml0cworMjI3MTEwYzQgbGlid2VicCBpbnRlcmZhY2UgY2hhbmdlcyBmb3IgbG9zc2xlc3MgZW5jb2RpbmcuCis1MDY3OWFjZiBtaW5vciBzdHlsZSBmaXhlcworYjM4ZGZjY2YgcmVtb3ZlIHVubmVlZGVkIHJlZmVyZW5jZSB0byBOVU1fTElURVJBTF9DT0RFUworODk3OTY3NWIgaGFybW9uaXplIGhlYWRlciBkZXNjcmlwdGlvbgorYzA0ZWI3YmUgdGNvZGVyLmM6IGRlZmluZSBOT1RfSEFWRV9MT0cyIGZvciBNU1ZDIGJ1aWxkcworOWEyMTRmYTEgTWVyZ2UgIlZQOFtMXUdldEluZm86IGNoZWNrIGlucHV0IHBvaW50ZXJzIgorNWM1YmU4YmEgVlA4W0xdR2V0SW5mbzogY2hlY2sgaW5wdXQgcG9pbnRlcnMKKzBjMTg4ZmVjIE1lcmdlIGNoYW5nZXMgSTQzMWFjZGZlLEk3MTM2NTliNworYjM1MTVjNjIgbXV4OiBkcm9wICdjaHVuaycgZnJvbSBDaHVua0luZm8gbWVtYmVyIG5hbWVzCithZWE3OTIzYyBtdXhpLmg6IHJlbW92ZSBzb21lIHVudXNlZCBkZWZpbmVzCiswMTQyMjQ5MiB1cGRhdGUgTkVXUyBmaWxlIGZvciBuZXh0IHJlbGVhc2UKKzI5ZTNmN2VjIE1lcmdlICJkZWM6IHJlbW92ZSBkZXByZWNhdGVkIFdlYlBJTmV3KCkiCis0NzE4ZTQ0OSBNZXJnZSAibXV4ZWRpdDogYSBmZXcgbW9yZSBzaXplX3QgY2hhbmdlcyIKKzgyNjU0Zjk2IE1lcmdlICJtdXhlZGl0OiByZW1vdmUgYSBmZXcgcmVkdW5kYW50IE5VTEwgY2hlY2tzIgorMDJmMjdmYmQgZGVjOiByZW1vdmUgZGVwcmVjYXRlZCBXZWJQSU5ldygpCitjY2RkYjNmYyBtdXhlZGl0OiByZW1vdmUgYSBmZXcgcmVkdW5kYW50IE5VTEwgY2hlY2tzCithNmNkZjcxMCBtdXhlZGl0OiBhIGZldyBtb3JlIHNpemVfdCBjaGFuZ2VzCithMzg0Njg5MiBNZXJnZSAibXV4OiByZW1vdmUgdW51c2VkIExJU1RfSUQiCisxMWFlNDZhZSBhbHBoYS5jOiBxdWlldCBzb21lIHNpemVfdCAtPiBpbnQgY29udmVyc2lvbiB3YXJuaW5ncworZGVlNDY2OTIgbXV4OiByZW1vdmUgdW51c2VkIExJU1RfSUQKKzAzZjFmNDkzIG11eDogYWRkIHZlcnNpb24gY2hlY2tlZCBlbnRyeSBwb2ludHMKKzZhMGFiZGFhIE1lcmdlICJkb2M6IHRpbGUvYWxwaGEgY29ycmVjdGlvbnMiCitjODEzOWZiZSBNZXJnZSAiZmV3IGNvc21ldGljcyIKKzY4MzM4NzM3IE1lcmdlICJsb3NzbGVzczogcmVtb3ZlIHNvbWUgc2l6ZV90IC0+IGludCBjb252ZXJzaW9ucyIKKzUyNDllOTRhIGRvYzogdGlsZS9hbHBoYSBjb3JyZWN0aW9ucworZDk2ZTcyMmIgaHVmZm1hbjogcXVpZXQgaW50NjQgLT4gaW50IGNvbnZlcnNpb24gd2FybmluZworNTMyMDIwZjIgbG9zc2xlc3M6IHJlbW92ZSBzb21lIHNpemVfdCAtPiBpbnQgY29udmVyc2lvbnMKKzIzYmU2ZWRmIGZldyBjb3NtZXRpY3MKKzEzNDllZGFkIE1lcmdlICJjb25maWd1cmU6IEFDX0FSR18qIHVzZSBBU19IRUxQX1NUUklORyIKK2JmYmNjNjBhIGNvbmZpZ3VyZTogQUNfQVJHXyogdXNlIEFTX0hFTFBfU1RSSU5HCisxNDI3Y2E4ZSBNZXJnZSAiTWFrZWZpbGUuYW06IGhlYWRlciBmaWxlIG1haW50ZW5hbmNlIgorMDg3MzMyZTMgTWVyZ2UgInJlbW92ZSB1bnVzZWQgcGFyYW1ldGVyICdyb3VuZCcgZnJvbSBDYWxjUHJvYmEoKSIKKzk2MzBlMTY4IHJlbW92ZSB1bnVzZWQgcGFyYW1ldGVyICdyb3VuZCcgZnJvbSBDYWxjUHJvYmEoKQorOTIwOTJlYWEgTWVyZ2UgImJpdF9yZWFkZXIuaDogY29ycmVjdCBpbmNsdWRlIgorYTg3ZmMzZjYgTWVyZ2UgIm11eDogZW5zdXJlICMgaW1hZ2VzID0gIyB0aWxlcyIKKzUzYWY5OWIxIE1lcmdlICJtdXg6IHVzZSBzaXplX3QgY29uc2lzdGVudGx5IgorMzlhNTdkYWUgTWFrZWZpbGUuYW06IGhlYWRlciBmaWxlIG1haW50ZW5hbmNlCisxYmQwYmQwZCBiaXRfcmVhZGVyLmg6IGNvcnJlY3QgaW5jbHVkZQorMzI2YTNjNmIgbXV4OiBlbnN1cmUgIyBpbWFnZXMgPSAjIHRpbGVzCis5NTY2N2I4ZCBtdXg6IHVzZSBzaXplX3QgY29uc2lzdGVudGx5CisyMzFlYzFmYiBSZW1vdmluZyB0aGUgaW5kaXJlY3Rpb24gb2YgbWV0YS1odWZmbWFuIHRhYmxlcy4KKzE1ZWJjYmFhIGNoZWNrIHJldHVybiBwb2ludGVyIGZyb20gTXV4SW1hZ2VHZXRMaXN0RnJvbUlkCitiMGQ2YzRhNyBNZXJnZSAiY29uZmlndXJlOiByZW1vdmUgdGVzdCBmb3IgemxpYi5oIgorOGNjY2FjNTAgTWVyZ2UgImRzcC9sb3NzbGVzczogc2lsZW5jZSBzb21lIGJ1aWxkIHdhcm5pbmdzIgorYjA4ODE5YTYgZHNwL2xvc3NsZXNzOiBzaWxlbmNlIHNvbWUgYnVpbGQgd2FybmluZ3MKKzdhZTIyNTIxIEFuZHJvaWQubWs6IFNTRTIgJiBORU9OIHVwZGF0ZXMKKzBhNDllM2YzIE1lcmdlICJtYWtlZmlsZS51bml4IGFkZCBtaXNzaW5nIGhlYWRlciBmaWxlcyIKKzJlNzVhOWExIE1lcmdlICJkZWNvZGUuaDogdXNlIHNpemVfdCBjb25zaXN0ZW50bHkiCitmYTEzMDM1ZSBjb25maWd1cmU6IHJlbW92ZSB0ZXN0IGZvciB6bGliLmgKK2QzYWRjODFkIG1ha2VmaWxlLnVuaXggYWRkIG1pc3NpbmcgaGVhZGVyIGZpbGVzCisyNjJmZTAxYiBNZXJnZSAibWFrZWZpbGUudW5peCAmIEFuZHJvaWQubWs6IGNvc21ldGljcyIKKzRjY2UxMzdlIE1lcmdlICJlbmNfc3NlMiBhZGQgbWlzc2luZyBzdGRsaWIuaCBpbmNsdWRlIgorODAyNTZiODUgZW5jX3NzZTIgYWRkIG1pc3Npbmcgc3RkbGliLmggaW5jbHVkZQorOWIzZDFmM2EgZGVjb2RlLmg6IHVzZSBzaXplX3QgY29uc2lzdGVudGx5Cis2NDA4M2QzYyBNZXJnZSAiTWFrZWZpbGUuYW06IGNvc21ldGljcyIKK2RjZWI4YjRkIE1lcmdlIGNoYW5nZXMgSWYxMzMxZDNjLEk4NmZlMzg0NworMGUzM2Q3YmYgTWVyZ2UgIndlYnAvZGVjb2RlLmg6IGZpeCBwcm90b3R5cGVzIgorZmFjMGYxMmUgcmVuYW1lIEJpdFJlYWRlciB0byBWUDhMQml0UmVhZGVyCitmYmQ4MmI1YSB0eXBlcy5oOiBjZW50cmFsaXplIHVzZSBvZiBzdGRkZWYuaAorMjE1NDgzNWYgTWFrZWZpbGUuYW06IGNvc21ldGljcworMWM5MmJkMzcgdnA4aW86IHVzZSBzaXplX3QgZm9yIGJ1ZmZlciBzaXplCis5MGVhZDcxMCBmaXggc29tZSBtb3JlIHVpbnQzMl90IC0+IHNpemVfdCB0eXBpbmcKK2NiZTcwNWM3IHdlYnAvZGVjb2RlLmg6IGZpeCBwcm90b3R5cGVzCiszZjhlYzFjMiBtYWtlZmlsZS51bml4ICYgQW5kcm9pZC5tazogY29zbWV0aWNzCisyMTdlYzdmNCBSZW1vdmUgdGFicyBpbiBjb25maWd1cmUuYWMKK2IzZDM1ZmMxIE1lcmdlICJBbmRyb2lkLm1rICYgTWFrZWZpbGUudmM6IGFkZCBuZXcgZmlsZXMiCiswZGYwNGI5ZSBBbmRyb2lkLm1rICYgTWFrZWZpbGUudmM6IGFkZCBuZXcgZmlsZXMKK2U0ZjIwYzViIE1lcmdlICJhdXRvbWFrZTogcmVwbGFjZSAnc2lsZW50LXJ1bGVzJyB3L0FNX1NJTEVOVF9SVUxFUyIKKzhkMjU0YTA5IGNvc21ldGljcworNjg2MGMyZWEgZml4IHNvbWUgdWludDMyX3QgLT4gc2l6ZV90IHR5cGluZworNGFmMTg1OGEgRml4IGEgY3Jhc2ggZHVlIHRvIG1heCBzeW1ib2wgaW4gYSB0cmVlID49IGFscGhhYmV0IHNpemUKKzZmMDFiODMwIHNwbGl0IHRoZSBWUDggYW5kIFZQOEwgZGVjb2RpbmcgcHJvcGVybHkKK2YyNjIzZGJlIGVuYWJsZSBsb3NzbGVzcyBkZWNvZGVyCitiOTZlZmQ3ZCBhZGQgZGVjL3ZwOGkuaCBjaGFuZ2VzIGZyb20gZXhwZXJpbWVudGFsCisxOWY2Mzk4ZSBhZGQgZGVjL3ZwOGx7aS5oLC5jfSBmcm9tIGV4cGVyaW1lbnRhbAorYzRhZTUzYzggYWRkIHV0aWxzL2JpdF9yZWFkZXIuW2hjXSBjaGFuZ2VzIGZyb20gZXhwZXJpbWVudGFsCis1MTRkMDA4OSBhZGQgZHNwL2xvc3NsZXNzLltoY10gZnJvbSBleHBlcmltZW50YWwKKzljNjcyOTFkIGFkZCB1dGlscy9odWZmbWFuLltoY10gZnJvbSBleHBlcmltZW50YWwKKzMzNzkxNGEwIGFkZCB1dGlscy9jb2xvcl9jYWNoZS5baGNdIGZyb20gZXhwZXJpbWVudGFsCitiM2JmOGZlNyB0aGUgcmVhZC1vdmVyZmxvdyBjb2RlLXBhdGggd2Fzbid0IHJlcG9ydGluZyBhcyBhbiBlcnJvcgorMWRiODg4YmEgdGFrZSBjb2xvcnNwYWNlIGludG8gYWNjb3VudCB3aGVuIGNyb3BwaW5nCis2MWMyZDUxZiBtb3ZlIHRoZSByZXNjYWxpbmcgY29kZSBpbnRvIGl0cyBvd24gZmlsZSBhbmQgbWFrZSBlbmMvIGFuZCBkZWMvIHVzZSBpdC4KK2VmYzIwMTZhIE1ha2UgcmVzY2FsZXIgbWV0aG9kcyBnZW5lcmljCiszZWFjZWU4MSBNb3ZlIHJlc2NhbGVyIG1ldGhvZHMgb3V0IG9mIGlvLmMuCithNjliODkzZCBhdXRvbWFrZTogcmVwbGFjZSAnc2lsZW50LXJ1bGVzJyB3L0FNX1NJTEVOVF9SVUxFUworNmY3YmY2NDUgaXNzdWUgMTExOiBmaXggbGl0dGxlLWVuZGlhbiBwcm9ibGVtIGluIGJpdC1yZWFkZXIKK2VkMjc4ZTIyIFJlbW92ZWQgdW5uZWNlc3NhcnkgbG9va3VwCitjZDhjM2JhNyBmaXggc29tZSB3YXJuaW5nczogZG93bi1jYXN0IGFuZCBwb3NzaWJseS11bmluaXRpYWxpemVkIHZhcmlhYmxlCiswYTcxMDJiYSB+MSUgaW1wcm92ZW1lbnQgb2YgYWxwaGEgY29tcHJlc3Npb24KKzNiYzFiMTQxIE1lcmdlICJSZWZvcm1hdCBjb250YWluZXIgZG9jIgorZGMxN2FiZGMgbXV4OiBjb3NtZXRpY3MKK2NiNTgxMGRmIE1lcmdlICJXZWJQTXV4R2V0SW1hZ2U6IGFsbG93IGltYWdlIHBhcmFtIHRvIGJlIE5VTEwiCis1MDZhNGFmMiBtdXg6IGNvc21ldGljcworMTM1ZThiMTkgV2ViUE11eEdldEltYWdlOiBhbGxvdyBpbWFnZSBwYXJhbSB0byBiZSBOVUxMCitkZTU1NmI2OCBNZXJnZSAiUkVBRE1FLm11eDogcmV3b3JkIHNvbWUgZGVzY3JpcHRpb25zIgorMGVlMmFlYjkgTWFrZWZpbGUudmM6IHVzZSBiYXRjaCBtb2RlIHJ1bGVzCitkOWFjZGRjMCBtc3ZjOiBtb3ZlIHtpLHB9ZGIgY3JlYXRpb24gdG8gb2JqZWN0IGRpcmVjdG9yeQorMjM3YzlhYTcgTWVyZ2UgImV4cG9zZSBXZWJQRnJlZSBmdW5jdGlvbiBmb3IgRExMIGJ1aWxkcyIKK2IzZTQwNTRmIHNpbGVuY2UgbXN2YyBkZWJ1ZyBidWlsZCB3YXJuaW5nCis0NWZlYjU1ZCBleHBvc2UgV2ViUEZyZWUgZnVuY3Rpb24gZm9yIERMTCBidWlsZHMKKzExMzE2ZDg0IFJFQURNRS5tdXg6IHJld29yZCBzb21lIGRlc2NyaXB0aW9ucworNGJlNTJmNGEgZmFjdG9yaXplIFdlYlBNdXhWYWxpZGF0ZQorMTRmNmI5ZjYgbXV4OiBsaWdodCBjbGVhbnVwCis1ZTk2YTVkYiBhZGQgbW9yZSBwYXJhbSBjaGVja3MgdG8gV2ViUFBpY3R1cmVEaXN0b3J0aW9uKCkKKzhhYmFmODIwIE1lcmdlICJzaWxlbmNlIHNvbWUgdHlwZSBzaXplIHJlbGF0ZWQgd2FybmluZ3MiCisxNjAxYTM5YiBzaWxlbmNlIHNvbWUgdHlwZSBzaXplIHJlbGF0ZWQgd2FybmluZ3MKK2YzYWJlNTIwIE1lcmdlICJpZGVjOiBzaW1wbGlmeSBidWZmZXIgc2l6ZSBjYWxjdWxhdGlvbiIKK2E5YzVjZDRjIGlkZWM6IHNpbXBsaWZ5IGJ1ZmZlciBzaXplIGNhbGN1bGF0aW9uCis3YjA2YmQ3ZiBNZXJnZSAiY29uZmlndXJlL2F1dG9tYWtlOiBhZGQgc2lsZW50LXJ1bGVzIG9wdGlvbiIKK2U5YTdkMTQ1IFJlZm9ybWF0IGNvbnRhaW5lciBkb2MKK2Q0ZTVjN2YzIGNvbmZpZ3VyZS9hdXRvbWFrZTogYWRkIHNpbGVudC1ydWxlcyBvcHRpb24KKzUwODFkYjc4IGNvbmZpZ3VyZS9hdXRvbWFrZTogbm8gLXZlcnNpb24taW5mbyBmb3IgY29udmVuaWVuY2UgbGlicworODViNmZmNjggTWVyZ2UgImlkZWM6IGZpeCBXZWJQSVVwZGF0ZSBmYWlsdXJlIgorN2JiNmE5Y2MgaWRlYzogZml4IGludGVybmFsIHN0YXRlIGNvcnJ1cHRpb24KKzg5Y2QxYmI4IGlkZWM6IGZpeCBXZWJQSVVwZGF0ZSBmYWlsdXJlCiswMWI2MzgwNiA0LTUlIGZhc3RlciBkZWNvZGluZywgb3B0aW1pemVkIGJ5dGUgbG9hZHMgaW4gYXJpdGhtZXRpYyBkZWNvZGVyLgorNjMxMTE3ZWEgTWVyZ2UgImNvc21ldGljcyAmIHdhcm5pbmdzIgorYTBiMjczNmQgY29zbWV0aWNzICYgd2FybmluZ3MKK2Y3Mzk0N2Y0IHVzZSAzMmJpdCBmb3Igc3RvcmluZyBkZXF1YW50IGNvZWZmcywgaW5zdGVhZCBvZiAxNmIuCitiOTYwMDMwOCBNZXJnZSAic3RvcmUgcHJlZGljdGlvbiBtb2RlIGFycmF5IGFzIHVpbnQ4X3RbMTZdLCBub3QgaW50WzE2XS4iCis3YjY3ODgxYSBzdG9yZSBwcmVkaWN0aW9uIG1vZGUgYXJyYXkgYXMgdWludDhfdFsxNl0sIG5vdCBpbnRbMTZdLgorY2FiOGQ0ZGMgTWVyZ2UgIk5FT04gVHJhbnNmb3JtT25lIgorYmE1MDNmZGEgTkVPTiBUcmFuc2Zvcm1PbmUKKzlmNzQwZTNiIE1lcmdlICJnY2Mgd2FybmluZyBmaXg6IHJlbW92ZSB0aGUgJ2NvbnN0JyBxdWFsaWZpZXIuIgorZjc2ZDM1ODcgZ2NjIHdhcm5pbmcgZml4OiByZW1vdmUgdGhlICdjb25zdCcgcXVhbGlmaWVyLgorZTc4NDc4ZDYgTWVyZ2UgIndlYnBtdXg6IG1ha2UgbW9yZSB1c2Ugb2YgV2ViUERhdGEiCitmODViYmEzZCBNZXJnZSAibWFucGFnZXM6IGFkZCBCVUdTIHNlY3Rpb24iCis0OGE0M2JiZiBNZXJnZSAibWFrZWZpbGUudW5peDogdmFyaWFibGUgY29zbWV0aWNzIgorYzI3NGRjOTYgbWFrZWZpbGUudW5peDogdmFyaWFibGUgY29zbWV0aWNzCisxZjdiODU5NSByZS1vcmdhbml6ZSB0aGUgZXJyb3ItaGFuZGxpbmcgaW4gdGhlIG1haW4gbG9vcCBhIGJpdAorMTMzNmZhNzEgT25seSByZWNvbXB1dGUgbGV2ZWxfY29zdF9bXSB3aGVuIG5lZWRlZAorNzcxZWU0NDkgbWFucGFnZXM6IGFkZCBCVUdTIHNlY3Rpb24KKzBmNzgyMGU2IHdlYnBtdXg6IG1ha2UgbW9yZSB1c2Ugb2YgV2ViUERhdGEKKzk3NGFhZmYzIGV4YW1wbGVzOiBsb2dnaW5nIHVwZGF0ZXMKKzZjMTRhYWRkIE1lcmdlICJiZXR0ZXIgdG9rZW4gYnVmZmVyIGNvZGUiCitmNDA1NDI1MCBiZXR0ZXIgdG9rZW4gYnVmZmVyIGNvZGUKKzE4ZDk1OWZhIE1lcmdlICJtdXg6IGFkZCBXZWJQRGF0YSB0eXBlIgorZWVjNGI4NzcgbXV4OiBhZGQgV2ViUERhdGEgdHlwZQorMGRlMzA5NmIgdXNlIDE2Yml0IGNvdW50ZXJzIGZvciByZWNvcmRpbmcgcHJvYmEgY291bnRzCis3ZjIzNjc4ZCBmaXggZm9yIExldmVsQ29zdCArIGxpdHRsZSBzcGVlZC11cAorNzEwN2Q1NDQgZnVydGhlciBzcGVlZC11cC9jbGVhbnVwIG9mIFJlY29yZENvZWZmcygpIGFuZCBHZXRSZXNpZHVhbENvc3QoKQorZmQyMjEwNDAgSW50cm9kdWNlIFRva2VuIGJ1ZmZlciAodW51c2VkIGZvciBub3cpCis1ZmExNDhmNCBNZXJnZSAic3BlZWQtdXAgR2V0UmVzaWR1YWxDb3N0KCkiCisyOGE5ZDliNCBzcGVlZC11cCBHZXRSZXNpZHVhbENvc3QoKQorMTFlN2RhZGQgTWVyZ2UgIm1pc2MgY29zbWV0aWNzIgorMzc4MDg2YmQgbWlzYyBjb3NtZXRpY3MKK2Q2MTQ3OWY5IGFkZCAtcHJpbnRfcHNuciBhbmQgLXByaW50X3NzaW0gb3B0aW9ucyB0byBjd2VicC4KKzJlM2U4YjJlIGFkZCBhIFdlYlBDbGVhbnVwVHJhbnNwYXJlbnRBcmVhKCkgbWV0aG9kCis1NTJjMTIxNyBNZXJnZSAibXV4OiBwbHVnIHNvbWUgbWVtb3J5IGxlYWtzIG9uIGVycm9yIgorYTJhODFmN2QgTWVyZ2UgImZpeCBNYWNoLU8gc2hhcmVkIGxpYnJhcnkgYnVpbGQiCitiMzQ4MmM0MyBNZXJnZSAiZml4IGdjYy00LjAgYXBwbGUgMzItYml0IGJ1aWxkIgorZTRlM2VjMTkgZml4IGdjYy00LjAgYXBwbGUgMzItYml0IGJ1aWxkCitiMGQyZmVjZiBtdXg6IHBsdWcgc29tZSBtZW1vcnkgbGVha3Mgb24gZXJyb3IKK2YwZDJjN2E3IHBhc3Mgb2YgY29zbWV0aWNzCitiMzA5YTZmOSBmaXggTWFjaC1PIHNoYXJlZCBsaWJyYXJ5IGJ1aWxkCisyNDFkZGQzOCBkb2M6IGRlbGV0ZSBtdXggY29udGFpbmVyIHBkZgorOGIxYmEyNzIgZG9jOiB1cGRhdGUgVlA4IGRlY29kZSBndWlkZSBsaW5rCis3ZTQzNzFjNSBXZWJQTXV4Q3JlYXRlOiBmaXggdW5jaGVja2VkIG1hbGxvYworZWI0MjU1ODYgTWVyZ2UgImhhdmUgbWFrZWZpbGUudW5peCBjbGVhbiB1cCBzcmMvd2VicC8qfiB0b28iCithODVjMzYzMSBNZXJnZSAiY29ycmVjdCBFbmNvZGVBbHBoYSBkb2N1bWVudGF0aW9uIgorYTMzODQyZmQgTWVyZ2UgIlVwZGF0ZSB3ZWJwIGNvbnRhaW5lciBzcGVjIHdpdGggYWxwaGEgZmlsdGVyIG9wdGlvbnMuIgorOGQ2NDkwZGEgSW5jcmVtZW50YWwgc3VwcG9ydCBmb3Igc29tZSBvZiB0aGUgbXV4IEFQSXMuCitiODM3NWFiZCBoYXZlIG1ha2VmaWxlLnVuaXggY2xlYW4gdXAgc3JjL3dlYnAvKn4gdG9vCitiNTg1NWZjNyBjb3JyZWN0IEVuY29kZUFscGhhIGRvY3VtZW50YXRpb24KK2RiYTM3ZmVhIFVwZGF0ZSB3ZWJwIGNvbnRhaW5lciBzcGVjIHdpdGggYWxwaGEgZmlsdGVyIG9wdGlvbnMuCisyZTc0ZWM4YiBmaXggY29tcGlsZSB1bmRlciBNSU5HVworNzE2ZDFkN2YgZml4IHN1Ym9wdGltYWwgTUFYX0xFTiBjdXQtb2ZmIGxpbWl0Cis1N2NhYjdiOCBIYXJtb25pemUgdGhlIGFscGhhLWZpbHRlciBwcmVkaWN0aW9ucyBhdCBib3VuZGFyeQorM2E5ODk1MzQgTWVyZ2UgIkZpeCBidWcgZm9yIEFscGhhIGluIFJHQkFfNDQ0NCBjb2xvci1tb2RlLiIKKzhjYTIwNzZkIEludHJvZHVjZSBhICdmYXN0JyBhbHBoYSBtb2RlCisyMjFhMDZiYiBGaXggYnVnIGZvciBBbHBoYSBpbiBSR0JBXzQ0NDQgY29sb3ItbW9kZS4KK2FkMWUxNjNhIGNvc21ldGljczogbm9ybWFsaXplIGNvcHlyaWdodCBoZWFkZXJzCitjNzc0MjRkNyBjb3NtZXRpY3M6IGxpZ2h0IGluY2x1ZGUgY2xlYW51cAorOWQwZTE3YzkgZml4IG1zdmMgYnVpbGQgYnJlYWthZ2UgYWZ0ZXIgMjUyMDI4YQorN2M0YzE3N2MgU29tZSByZWFkYWJpbGl0eSBmaXhlcyBmb3IgbXV4IGxpYnJhcnkKK2Q4YTQ3ZTY2IE1lcmdlICJBZGQgcHJlZGljdGl2ZSBmaWx0ZXJpbmcgb3B0aW9uIGZvciBBbHBoYS4iCisyNTIwMjhhYSBBZGQgcHJlZGljdGl2ZSBmaWx0ZXJpbmcgb3B0aW9uIGZvciBBbHBoYS4KKzliNjliZTFjIE1lcmdlICJTaW1wbGlmeSBtdXggbGlicmFyeSBjb2RlIgorYTA1NjE3MGUgU2ltcGxpZnkgbXV4IGxpYnJhcnkgY29kZQorOTkyMTg3YTMgaW1wcm92ZSBsb2cyIHRlc3QKK2U4NTJmODMyIHVwZGF0ZSBBbmRyb2lkLm1rIGZpbGUgbGlzdAorYTkwY2IyYmUgcmVkdWNlIG51bWJlciBvZiBjb3BpZXMgYW5kIG1hbGxvY3MgaW4gYWxwaGEgcGxhbmUgZW5jL2RlYworYjE2NjJiMDUgZml4IHNvbWUgbW9yZSB0eXBlIGNvbnZlcnNpb24gd2FybmluZ3Mgdy9NU1ZDCisyMjNkOGM2MCBmaXggc29tZSB1aW50NjRfdCAtPiBpbnQgY29udmVyc2lvbiB3YXJuaW5ncyB3aXRoIE1TQworYzFhMDQzN2IgTWVyZ2UgInNpbXBsaWZ5IGNoZWNrcyBmb3IgZW5hYmxpbmcgU1NFMiBjb2RlIgorZjA2ODE3YWEgc2ltcGxpZnkgY2hlY2tzIGZvciBlbmFibGluZyBTU0UyIGNvZGUKKzk0OGQ0ZmU5IHNpbGVuY2UgYSBtc3ZjIGJ1aWxkIHdhcm5pbmcKKzkxMTc5NTQ5IHZ3ZWJwOiBtc3ZjIGJ1aWxkIHR3ZWFrcworNzkzN2I0MDkgc2ltcGxlIFdlYlAgdmlld2VyLCBiYXNlZCBvbiBPcGVuR0wKKzZhYWMxZGYxIGFkZCBhIGJ1bmNoIG9mIG1pc3NpbmcgJ2V4dGVybiAiQyInCis0MjFlYjk5ZCBNZXJnZSAiUmVtb3ZlIGFzc2lnbmVkLWJ1dC1ub3QtdXNlZCB2YXJpYWJsZSAiYnIiIgorOTFlMjdmNDUgYmV0dGVyIGZpdHRpbmcgbmFtZXMgZm9yIHVwc2FtcGxpbmcgZnVuY3Rpb25zCithNWQ3ZWQ1YyBSZW1vdmUgYXNzaWduZWQtYnV0LW5vdC11c2VkIHZhcmlhYmxlICJiciIKK2Y2MmQyYzk0IHJlbW92ZSB1bnVzZWQgJ2hhc19hbHBoYScgZnJvbSBWUDhHZXRJbmZvKCkgc2lnbmF0dXJlCiswOGU4NjU4MiB0cmFwIGFscGhhLWRlY29kaW5nIGVycm9yCitiMzYxZWNhMSBhZGQgY3V0LW9mZiB0byBhcml0aCBjb2RlciBwcm9iYWJpbGl0eSB1cGRhdGUuCis4NjY2YTkzYSBTb21lIGJ1Zy1maXhlcyBmb3IgaW1hZ2VzIHdpdGggYWxwaGEuCisyNzNhMTJhMCBmaXggb2ZmLWJ5LTEgZGlmZiBpbiBjYXNlIGNyb3BwaW5nIGFuZCBzaW1wbGUgZmlsdGVyaW5nCisyZjc0MWQxZSB3ZWJwbXV4OiBSZWFkSW1hZ2U6IGZpeCBwdHIgZnJlZSBpbiBlcnJvciBjYXNlCis3MjFmM2Y0OCBmaXggYWxwaGEgZGVjb2RlCis2MDk0MmM4YyBmaXggdGhlIGhhc19hbHBoYV8gb3JkZXIKKzMwOTcxYzllIEltcGxlbWVudCBwcm9ncmVzcyByZXBvcnQgKGFuZCB1c2VyIGFib3J0KQorZWRhNTIwYTkgY29zbWV0aWNzIGFmdGVyIDk1MjNmMmEKKzM4YmQ1YmI1IE1lcmdlICJCZXR0ZXIgYWxwaGEgc3VwcG9ydCBpbiB3ZWJwbXV4IGJpbmFyeSIKK2NjYmFlYmZlIE1lcmdlICJVcGRhdGVkIHRoZSBpbmNsdWRlcyB0byByZWxhdGl2ZSBwYXRocy4iCitkNzFmYmRjYyBmaXggc21hbGwgdHlwbyBpbiBlcnJvciBtZXNzYWdlIGFycmF5CitjZGY5N2FhMiBCZXR0ZXIgYWxwaGEgc3VwcG9ydCBpbiB3ZWJwbXV4IGJpbmFyeQorODg1ZjI1YmMgVXBkYXRlZCB0aGUgaW5jbHVkZXMgdG8gcmVsYXRpdmUgcGF0aHMuCithMGVjOWFhYyBVcGRhdGUgV2ViUCBlbmNvZGVyIChjd2VicCkgdG8gc3VwcG9ydCBBbHBoYS4KKzY2N2I3NjlhIEZpeGVkIHRoZSBpbmNsdWRlIGZvciB0eXBlcy5oIHdpdGhpbiBtdXguaAorOTUyM2YyYTUgQWRkIEFscGhhIEVuY29kZSBzdXBwb3J0IGZyb20gV2ViUEVuY29kZS4KKzE2NjEyZGRkIE1lcmdlICJBZGQgQWxwaGEgRGVjb2RlIHN1cHBvcnQgZnJvbSBXZWJQRGVjb2RlLiIKK2QxMTdhOTQwIEFkZCBBbHBoYSBEZWNvZGUgc3VwcG9ydCBmcm9tIFdlYlBEZWNvZGUuCis2NzIyODczNCBjb3NtZXRpY3MgYWZ0ZXIgZTE5NDdhOQorZTE5NDdhOTIgQWRkIEFscGhhIGVuY29kZS9kZWNvZGUgY29kZS4KK2FmYzRjNWQ2IHNpbXBsaWZ5IGNvZGUgYnkgaW50cm9kdWNpbmcgYSBDb3B5UGxhbmUoKSBoZWxwZXIgZnVuYworMTEzYjMxMjggTWVyZ2UgIk1VWCBBUEkgVXBkYXRlcyIKK2MzOThmNTk1IE1VWCBBUEkgVXBkYXRlcworNWFjZjA0ZWYgcmVtb3ZlIG9ycGhhbiBzb3VyY2UgZmlsZQorMDU5ZjAzZWYgTWVyZ2UgImRlYzogdmFsaWRhdGUgY29sb3JzcGFjZSBiZWZvcmUgdXNpbmcgYXMgYXJyYXkgaW5kZXgiCis3MGEwMzk4OSBNZXJnZSAiZmFjdG9yaXplIHNvbWUgY29kZSIKKzliMjQzYjNkIGZhY3Rvcml6ZSBzb21lIGNvZGUKKzM3MmUyYjQ2IENvcnJlY3QgYSBidWcgaW4gUmVhZFBORygpIHdpdGggR1JBWV9BTFBIQSBpbWFnZXMKKzQ2OWQ2ZWI5IE1lcmdlICJNYWtlZmlsZS5hbTogcmVtb3ZlIHJlZHVuZGFudCBub2luc3RfSEVBREVSUyIKKzlmZTMzNzJmIGRlYzogdmFsaWRhdGUgY29sb3JzcGFjZSBiZWZvcmUgdXNpbmcgYXMgYXJyYXkgaW5kZXgKKzg5NjIwMzBmIHJlbW92ZSBvcnBoYW4gc291cmNlIGZpbGUKK2NlZDNlM2Y0IE1ha2VmaWxlLmFtOiByZW1vdmUgcmVkdW5kYW50IG5vaW5zdF9IRUFERVJTCis5NjQzODdlZCB1c2UgV0VCUF9JTkxJTkUgZm9yIGlubGluZSBmdW5jdGlvbiBkZWNsYXJhdGlvbnMKKzkwODgwYTExIE1lcmdlICJtYW5wYWdlczogYnJlYWsgbG9uZyBsaW5lcyIKK2I1OTEwODk1IE1lcmdlICJtYW5wYWdlczogbWlub3IgZm9ybWF0dGluZyB1cGRhdGVzIgorNGM0NTFlNGEgTWVyZ2UgIlJlY3RpZnkgdGhlIENodW5rIHBhcnNpbmcgbG9naWMuIgorMDRlODRjZjEgZXhhbXBsZXM6IHNsaWdodCBjbGVhbnVwCiswOTk3MTdjZSBtYW5wYWdlczogYnJlYWsgbG9uZyBsaW5lcworMWRhZjM5YmIgbWFucGFnZXM6IG1pbm9yIGZvcm1hdHRpbmcgdXBkYXRlcworYWJkMDMwYjUgZml4IG1pc3NpbmcgIih2b2lkKSIgaW4gZnVuY3Rpb24gc2lnbmF0dXJlCitmNmE3ZDc1OCByZW1vdmUgdXNlbGVzcyB0ZXN0CitmMDdiMjEzOCBSZWN0aWZ5IHRoZSBDaHVuayBwYXJzaW5nIGxvZ2ljLgorYjg2MzRmN2Qgd2VicG11eDogZml4IGxpYiBsaW5rIG9yZGVyCis0MmMyZTY4MiBGaXggbWlzc2luZyBjb21hIChvbiB1bmNvbXBpbGVkIGNvZGUpCitkODMyOWQ0MSBBbmRyb2lkLm1rOiBhZGQgbWlzc2luZyBzb3VyY2UgZmlsZXMKKzEzYTU0ZGY1IE1lcmdlICJNb3JlIGFnZ3Jlc3NpdmUgY29weS1lZGl0OyBhZGQgVE9ETzsgdmFsaWRhdGUgSFRNTDUiCis4NjhiOTZhZSBNb3JlIGFnZ3Jlc3NpdmUgY29weS1lZGl0OyBhZGQgVE9ETzsgdmFsaWRhdGUgSFRNTDUKKzc2N2FmZWEyIGNvbmZpZ3VyZTogY2hlY2sgZm9yIGEgc3ltYm9sIGNvbnRhaW5lZCBpbiBsaWJwbmcKKzQwOGI4OTE4IE1lcmdlICJMaW5ld3JhcCBhdCA3MiBjb2xzLiBDYXN1YWwgY29weS1lZGl0LiIKKzNhZTMxOGM3IE1lcmdlICJSZXN0b3JlIChtb3N0KSBlbXBoYXNpczsgYWRkIGVtcGhhc2lzIHRvIG5vcm1hdGl2ZSBSRkMgMjExOSB0ZXJtcyAoTVVTVCwgZXRjLikiCis5MThlYjJkOCBNZXJnZSAiQmFzaWMgY29udGFpbmVyIGRvYyBzb3VyY2UgY2xlYW4tdXA7IGZpeCBsaXN0cyBhbmQgcHNldWRvY29kZSBibG9ja3MuIgorMDNiZWM5ZTAgTGluZXdyYXAgYXQgNzIgY29scy4gQ2FzdWFsIGNvcHktZWRpdC4KKzI2NzhkODE5IFJlc3RvcmUgKG1vc3QpIGVtcGhhc2lzOyBhZGQgZW1waGFzaXMgdG8gbm9ybWF0aXZlIFJGQyAyMTE5IHRlcm1zIChNVVNULCBldGMuKQorNDI4Njc0ZGEgQmFzaWMgY29udGFpbmVyIGRvYyBzb3VyY2UgY2xlYW4tdXA7IGZpeCBsaXN0cyBhbmQgcHNldWRvY29kZSBibG9ja3MuCis2YTc3ZDkyOCBNZXJnZSAiTWFrZWZpbGUudmM6IGNvc21ldGljcyIKKzI4YzM4ZThjIE1lcmdlICJNYWtlZmlsZS52YzogY29uZGVuc2UgZGlyZWN0b3J5IGNyZWF0aW9uIHJ1bGVzIgorNTViZTJjZjggSW5pdGlhbCBpbXBvcnQgb2YgY29udGFpbmVyIHNwZWMgZG9jdW1lbnQsIGZyb20gcGRmdG90ZXh0IHRyYW5zZm9ybS4KK2E4MmE3ODhiIE1ha2VmaWxlLnZjOiBjb3NtZXRpY3MKK2M4ZjQxY2U1IE1ha2VmaWxlLnZjOiBjb25kZW5zZSBkaXJlY3RvcnkgY3JlYXRpb24gcnVsZXMKKzJiODc3Y2QwIFNvbWUgZml4ZXMgdG8gTWFrZWZpbGUudmMgdG8gc3VwcG9ydCB0aGUgc3JjXG11eCBkaXJlY3RvcnkuCiszZWI5NjliMyBNZXJnZSAiQWRkIE1ha2VmaWxlLnZjIGZvciBNdXggbGlicmFyeSAmIGJpbmFyeS4iCitlNzhlOTcxZSBBZGQgTWFrZWZpbGUudmMgZm9yIE11eCBsaWJyYXJ5ICYgYmluYXJ5LgorNmFlZGRlNTggQWRkIG1hbnVhbCBmb3IgV2ViUE11eCB0b29sLgorOGEzNjBkMGEgTWVyZ2UgIkFkZGVkIFdlYlBNdXggQmluYXJ5LiIKK2E0ZjMyY2FlIEFkZGVkIFdlYlBNdXggQmluYXJ5LgorZjNiZjRjNzYgQWRkZWQgTXV4IENvbnRhaW5lciBTcGVjICYgUkVBRE1FIGZvciBNVVgtQVBJLgorOWY3NjFjZmEgQ2hhbmdlZCBmdW5jdGlvbiBzaWduYXR1cmUgZm9yIFdlYlBNdXhDcmVhdGUKKzVmMzFiNWVjIE1lcmdlICJBZGQgTXV4IGxpYnJhcnkgZm9yIG1hbmlwdWxhdGluZyBXZWJQIGNvbnRhaW5lci4iCisyMzE1Nzg1ZiBBZGQgTXV4IGxpYnJhcnkgZm9yIG1hbmlwdWxhdGluZyBXZWJQIGNvbnRhaW5lci4KKzdlMTk4YWJiIHVwZGF0ZSBDaGFuZ2VMb2cgKHRhZzogdjAuMS4zKQorZGZjOWMxZWEgSGFybW9uaXplIHRoZSBkYXRlcworMjhhZDcwYzUgRml4IFBORyBkZWNvZGluZyBidWcKKzg0NmU5M2M1IFVwZGF0ZSBBVVRIT1JTICYgYWRkIC5tYWlsbWFwCis1NjNlNTJkNiBjb3NtZXRpY3MgYWZ0ZXIgJzc2MDM2ZjUgUmVmYWN0b3IgZGVjb2RlciBsaWJyYXJ5JworNzYwMzZmNTQgUmVmYWN0b3IgZGVjb2RlciBsaWJyYXJ5CiszNzdlZjQzYyBjb25maWd1cmUuYWM6IHVwZGF0ZSBBQ19JTklUIHBhcmFtcworN2E4ZDg3NjIgdXNlIGEgdXNlci12aXNpYmxlIE1BQ1JPIGZvciBtYXggd2lkdGgvaGVpZ2h0LgorZDRlOWY1NTkgTkVPTiBkZWNvZGUgc3VwcG9ydCBpbiBXZWJQCiswZWU2ODNiNSB1cGRhdGUgbGlidG9vbCB2ZXJzaW9uLWluZm8KK2ZkYmUwMmM1IHdpbmRvd3M6IG1hdGNoIF9jb25kX2Rlc3Ryb3kgbG9naWMgdy9yZXR1cm4gdmFyaWFibGUgbmFtZQorMjA2YjY4NmIgUkVBRE1FOiBjb3JyZWN0IGFkdmFuY2VkIGRlY29kZSBhcGkgcHNldWRvLWNvZGUKKzZhMzJhMGY1IG1ha2UgVlA4Qml0UmVhZGVyIGEgdHlwZWRlZiwgZm9yIGJldHRlciByZS11c2UKK2IxMTJlODM2IGNyZWF0ZSBhIGxpYndlYnB1dGlscyB1bmRlciBzcmMvdXRpbHMKK2VlNjk3ZDlmIGhhcm1vbml6ZSB0aGUgaW5jbHVkZSBndWFyZHMgYW5kICNlbmRpZiBjb21tZW50cworYTFlYzA3YTYgRml4aW5nIGNvbXBpbGVyIGVycm9yIGluIG5vbiB4ODYgYXJjaC4KK2RjZmE1MDlhIEZpeGVkIHJlY3Vyc2l2ZSBpbmNsdXNpb24gb2YgYml0X3dyaXRlci5oIGFuZCB2cDhlbmNpLmguCitlMDZhYzA4OCBjcmVhdGUgYSBzZXBhcmF0ZSBsaWJ3ZWJwZHNwIHVuZGVyIHNyYy9kc3AKK2ViZWI0MTJhIHVzZSB1bnNpZ25lZCBpbnQgZm9yIGJpdGZpZWxkcworMzQxY2M1NmEgbWFrZSBrTmV3UmFuZ2UgYSBzdGF0aWMgYXJyYXkKKzIyN2E5MWU1IFJFQURNRTogbWlub3Igd29yZGluZyB1cGRhdGUKKzA1YmQ4ZTZhIGFkZCBtYW4gcGFnZXMgdG8gZGlzdAorODEyZGZhMWEgYnVtcCB1cCB2ZXJzaW9ucyBpbiBwcmVwYXJhdGlvbnMgZm9yIDAuMS4zCithNWI3OGM4MSB3cmFwIGFscGhhLXJlbGF0ZWQgb3B0aW9ucyB1bmRlciBXRUJQX0VYUEVSSU1FTlRBTF9GRUFUVVJFUyBmbGFnCiszNGRjNzkwNyByZWdlbiBDaGFuZ2VMb2cgZm9yIDAuMS4zLXJjMgorN2M0MzY2MzAgU2lsZW5jZSBzb21lIChtb3JlKSBWaXN1YWwgU3R1ZGlvIHdhcm5pbmdzLgorNjAzMDZlOGMgYWRkIHRvcC1sZXZlbCBnaXRhdHRyaWJ1dGVzCisyYWE2YjgwZSBTbGllbmNlIHNvbWUgVmlzdWFsIFN0dWRpbyB3YXJuaW5ncy4KKzRjYmJiMjkwIE1lcmdlICJidW1wIHVwIHZlcnNpb24gZm9yIG5leHQgZnJlZXplIgorYTMyOTE2NzQgYnVtcCB1cCB2ZXJzaW9uIGZvciBuZXh0IGZyZWV6ZQorYzdlODZhYmEgY29zbWV0aWNzOiBmaXggY29tbWVudCBsaW5lIGxlbmd0aHMKK2M5ZTAzN2FiIG1ha2VmaWxlLnVuaXg6IGFkZCBzaW1wbGUgZGlzdCB0YXJnZXQKKzg3ZDU4Y2U5IG1ha2VmaWxlLnVuaXg6IHJ1bGUgbWFpbnRlbmFuY2UKK2Q0NzdkZTc3IG1lbmQKK2ZhYzE1ZWM3IFVwZGF0ZSBORVdTICYgUkVBRE1FIGZvciBuZXh0IHJlbGVhc2UgVjAuMS4zCis2MjE1NTk1YyBNZXJnZSAiYWRkIGEgLXBhcnRpdGlvbl9saW1pdCBvcHRpb24gdG8gbGltaXQgdGhlIG51bWJlciBvZiBiaXRzIHVzZWQgYnkgaW50cmE0eDQiCiszODE0Yjc2YyBNZXJnZSAicmVvcmdhbml6ZSBjaHVuay1wYXJzaW5nIGNvZGUiCis5MDAyODZlMCBhZGQgYSAtcGFydGl0aW9uX2xpbWl0IG9wdGlvbiB0byBsaW1pdCB0aGUgbnVtYmVyIG9mIGJpdHMgdXNlZCBieSBpbnRyYTR4NAorY2QxMmI0YjAgYWRkIHRoZSBtaXNzaW5nIGNvc3QgZm9yIEk0L0kxNiBtb2RlIHNlbGVjdGlvbgorZGZjYzIxMzYgcmVvcmdhbml6ZSBjaHVuay1wYXJzaW5nIGNvZGUKKzNjZjIwMzA2IGluaXRpYWxpemUgcG9pbnRlcnMgdG8gZnVuY3Rpb24gd2l0aGluIFZQOERzcEluaXQoKQorZDIxYjQ3OTUgTWVyZ2UgIndpbmRvd3M6IGFkZCBkZWNvZGUgdGhyZWFkaW5nIHN1cHBvcnQiCis0NzNhZTk1MyBmaXggaGFuZyBvbiB0aHJlYWQgY3JlYXRpb24gZmFpbHVyZQorZmNjY2E0MjAgd2luZG93czogYWRkIGRlY29kZSB0aHJlYWRpbmcgc3VwcG9ydAorYTMxZjg0M2EgVXNlIHRoZSBleGFjdCBQTkdfSU5DTFVERVMvUE5HX0xJQlMgd2hlbiB0ZXN0aW5nIGZvciAtbHBuZworYWQ5YjQ1ZjEgTWVyZ2UgIk1ha2VmaWxlLnZjOiBydWxlIG1haW50ZW5hbmNlIgorNTY1YTJjYWIgTWFrZWZpbGUudmM6IHJ1bGUgbWFpbnRlbmFuY2UKKzJkMGRhNjgxIG1ha2VmaWxlLnVuaXg6IGRpc2FibGUgV3ZsYSBieSBkZWZhdWx0CitmYzc4MTVkNiBtdWx0aS10aHJlYWQgZGVjb2Rpbmc6IH4yNS0zMCUgZmFzdGVyCithY2Q4YmE0MiBpby0+dGVhcmRvd24oKSB3YXMgbm90IGFsd2F5cyBjYWxsZWQgdXBvbiBlcnJvcgorYzg1NTI3YjEgTWVyZ2UgIk1ha2VmaWxlLnZjOiBhZGQgRExMIGNvbmZpZ3MiCitlMWU5YmUzNSBjb3NtZXRpY3M6IHNwZWxsaW5nL2dyYW1tYXIgaW4gUkVBRE1FIGFuZCBsaWIgaGVhZGVycworYjRkMGVmOGYgTWFrZWZpbGUudmM6IGFkZCBETEwgY29uZmlncworOTk4NzU0YTcgcmVtb3ZlIHVudXNlZCBuYl9pNF8gYW5kIG5iX2kxNl8gZmllbGRzLgorOWYwMWNlM2EgcmVuYW1lIFdlYlBEZWNCdWZmZXI6Om1lbW9yeSAtPiBwcml2YXRlX21lbW9yeQorZmI1ZDY1OWIgZml4IGFuIG92ZXJmbG93IGJ1ZyBpbiBMVVQgY2FsY3VsYXRpb24KK2Q2NDZkNWM3IHN3aWc6IGFkZCBXZWJQRGVjb2RlQVJHQgorNzhhZWVkNDAgYWRkIG1pc3NpbmcgV2ViUERlY29kZUFSR0JJbnRvKCkgYW5kIHN3aXRjaCBBUkdCNDQ0NCB0byBSR0JBNDQ0NCBhcyB3YXMgaW50ZW5kZWQKK2NkN2M1MjkyIGV4cGxpY2l0bHkgbWFyayBsaWJyYXJ5IGZ1bmN0aW9ucyBhcyBleHRlcm4KKzE5ZGI1OWY4IGFkZCBzdXBwb3J0IGZvciBSR0I1NjUsIEFSR0I0NDQ0IGFuZCBBUkdCIGNvbG9yc3BhY2UgKGRlY29kZXIpCitjOTE1ZmIyYSBlbmNvZGVyIHNwZWVkLXVwOiBoYXJkY29kZSBzcGVjaWFsIGxldmVsIHZhbHVlcworYzU1OGJkYWQgUmVuYW1lIGFuZCBpbXByb3ZlIHRoZSBBUEkgdG8gcmV0cmlldmUgZGVjb2RlZCBhcmVhCitiZjU5OWQ3NCBNZXJnZSAibWFrZWZpbGUudW5peDogZGlzYWJsZSAtV3ZsYSBieSBkZWZhdWx0IgorYzllYTAzZDcgU1NFMiB2ZXJzaW9uIG9mIHN0cm9uZyBmaWx0ZXJpbmcKKzk5M2FmM2UyIG1ha2VmaWxlLnVuaXg6IGRpc2FibGUgLVd2bGEgYnkgZGVmYXVsdAorMzgyN2UxYmMgTWVyZ2UgImV4YW1wbGVzOiAod2luZG93cy9XSUMpIGFkZCBhbHBoYSBzdXBwb3J0IgorZTI5MWZhZTAgU1NFMiBmdW5jdGlvbnMgZm9yIHRoZSBmYW5jeSB1cHNhbXBsZXIuCithMDZiYmUyZSBhZGQgV2ViUElTZXRJT0hvb2tzKCkgdG8gc2V0IHNvbWUgY3VzdG9tIGhvb2tzIG9uIHRoZSBpbmNyZW1lbnRhbCBkZWNvZGVyIG9iamVjdC4KKzc2NDNhNmYyIE1lcmdlICJtYWtlZmlsZS51bml4OiB1c2UgdW5hbWUgdG8gZGV0ZWN0IE9TWCBlbnZpcm9ubWVudCIKKzUxNDJhMGJlIGV4cG9ydCBhbHBoYSBjaGFubmVsIChpZiBwcmVzZW50KSB3aGVuIGR1bXBpbmcgdG8gUEdNIGZvcm1hdAorMTRkNTczMWMgbWFrZWZpbGUudW5peDogdXNlIHVuYW1lIHRvIGRldGVjdCBPU1ggZW52aXJvbm1lbnQKKzA4MDU3MDYyIGV4YW1wbGVzOiBxdWlldCB3YXJuaW5ncworM2NmZTA4ODggZXhhbXBsZXM6ICh3aW5kb3dzL1dJQykgYWRkIGFscGhhIHN1cHBvcnQKKzEzZWQ5NGI4IGFkZCBjb21waWxlIHdhcm5pbmcgZm9yIHZhcmlhYmxlLWxlbmd0aC1hcnJheQorNWExOGViMWEgTWVyZ2UgImFkZCBBZHZhbmNlZCBEZWNvZGluZyBJbnRlcmZhY2UiCis1YzRmMjdmOSBhZGQgbWlzc2luZyBcbgorZjRjNGU0MTYgODAgY29scyBmaXgKK2QyNjAzMTA1IGFkZCBBZHZhbmNlZCBEZWNvZGluZyBJbnRlcmZhY2UKK2JkMmY2NWY2IHNzZTIgdmVyc2lvbiBvZiB0aGUgY29tcGxleCBmaWx0ZXIKKzk2ZWQ5Y2UwIHBlcmZvcm0gdHdvIGlkY3QgdHJhbnNmb3JtcyBhdCBhIHRpbWUgd2hlbiBwb3NzaWJsZQorMDFhZjdiNjkgdXNlIGFsaWduZWQgc3RvcmVkCiswZTFkMWZkZiBNZXJnZSAiTWFrZWZpbGUudmM6IGFkZCBleHBlcmltZW50YWwgdGFyZ2V0IgorMmExMjkyYTYgTWFrZWZpbGUudmM6IGFkZCBleHBlcmltZW50YWwgdGFyZ2V0CisyM2JmMzUxZSBFbmFibGUgZGVjb2RlIFNTRTIgZm9yIFZpc3VhbCBTdHVkaW8KKzEzMWE0YjdiIGRlYy9kc3Bfc3NlMjogZml4IHZpc3VhbCBzdHVkaW8gY29tcGlsZQorMDBkOWQ2ODAgc3dpZzogZmlsZSByZW9yZ2FuaXphdGlvbgorN2ZjN2UwZDkgTWVyZ2UgInN3aWcvamF2YTogYmFzaWMgZW5jb2RlIHN1cHBvcnQiCiszYmU1N2IxNiBmaXggTVNWQyBjb21waWxlIGZvciBXRUJQX0VYUEVSSU1FTlRBTF9GRUFUVVJFUworNDBhN2UzNDcgZGVjL2RzcDogZGlzYWJsZSBzc2UyIGZvciBWaXN1YWwgU3R1ZGlvIGJ1aWxkcworZTRkNTQwYzggYWRkIFNTRTIgY29kZSBmb3IgdHJhbnNmb3JtCis1NGYyMTcwYSBzd2lnL2phdmE6IGJhc2ljIGVuY29kZSBzdXBwb3J0CitjNWQ0NTg0YiBjYWxsIGZ1bmN0aW9uIHBvaW50ZXJzIGluc3RlYWQgb2YgQy12ZXJzaW9uCitlYTQzZjA0NSBNZXJnZSAiY29uZmlndXJlOiBtaW5ndzMyIHRhcmdldHM6IHRlc3QgZm9yIFdJQyBzdXBwb3J0IgorYTExMDA5ZDcgU1NFMiB2ZXJzaW9uIG9mIHNpbXBsZSBpbi1sb29wIGZpbHRlcmluZworNDI1NDhkYTkgc2hhdmUgb25lIHVubmVlZGVkIGZpbHRlci1jYWNoZSBsaW5lCiszMWY5ZGM2ZiBjb25maWd1cmU6IG1pbmd3MzIgdGFyZ2V0czogdGVzdCBmb3IgV0lDIHN1cHBvcnQKKzE5NTU5Njk5IE1lcmdlICJzcGxpdCBleHByZXNzaW9uIGluIHR3by4iCis0MTVkYmU0NiBzcGxpdCBleHByZXNzaW9uIGluIHR3by4KK2UyOTA3MmE4IGNvbmZpZ3VyZTogdGVzdCBmb3IgemxpYiBvbmx5IHcvLS1lbmFibGUtZXhwZXJpbWVudGFsCitiMmIwMDkwYiBTaW1wbGlmeSBWaXN1YWwgU3R1ZGlvIGlmZGVmcworY2E3YTJmZDYgQWRkIGVycm9yIHJlcG9ydGluZyBmcm9tIGVuY29kaW5nIGZhaWx1cmVzLgorNmM5NDA1ZGIgTWVyZ2UgIk1ha2VmaWxlLnZjOiByZXF1aXJlIENGRyB3aXRoIGNsZWFuIHRhcmdldCIKKzA0MjRlY2Q5IE1ha2VmaWxlLnZjOiByZXF1aXJlIENGRyB3aXRoIGNsZWFuIHRhcmdldAorMDAzNDE3YzcgRW5hYmxlIFNTRTIgZm9yIFZpc3VhbCBTdHVkaW8gYnVpbGRzCithZjEwZGI0YSBsaXR0bGUgc3BlZWQgdXAgZm9yIFZQOEJpdFVwZGF0ZSgpCitlNzE0MThmOCBtb3JlIE1TVkMgZmlsZXMgdG8gaWdub3JlCis0NmQ5MDM2MyBjb3NtZXRpY3MKK2VkZjU5YWIzIHR5cG8gZml4Cis3MjIyOWY1ZiBBZGQgc3VwcG9ydCBmb3IgeDY0IGFuZCBTU0UyIGJ1aWxkcyB1bmRlciBXaW5kb3dzLgorOTJlNWM2ZTEgVlA4R2V0SW5mbygpICsgV2ViUFJlc2V0RGVjUGFyYW1zKCkKKzQxNmI3YTZiIHJhaXNlIHRoZSBmaXhlZC1wb2ludCBwcmVjaXNpb24gZm9yIHRoZSByZXNjYWxlcgorYWE4N2U0ZTAgZml4IGFsaWdubWVudAorZWI2NjY3MGMgZGlzYWJsZSBXRUJQX0VYUEVSSU1FTlRBTF9GRUFUVVJFUworYzVhZTdmNjUgdHlwbyBmaXg6IFVTRV8gPT4gV0VCUF8KK2QwNDFlZmFlIHN3aWc6IGFkZCBsaWJ3ZWJwLmphci9saWJ3ZWJwX2phdmFfd3JhcC5jCitmNmZiMzg3NyBhZGQgc3dpZyBpbnRlcmZhY2UKK2U5MjczOTAyIGFsaWduIGJ1ZmZlciBmb3IgZG91YmxlIHRvbworODQyYzAwOWIgZml4IC1zdHJvbmcgb3B0aW9uCitkMGE3MDM4NyBNZXJnZSAiY29zbWV0aWNzIgorZmMwYTAyZTUgZml4IHRoZSBkaWNob3RvbXkgbG9vcAorMzgzNjljMDMgY29zbWV0aWNzCis4ZGZjNGM2ZiBmYWN0b3JpemUgYW5kIHVuaWZ5IEdldEFscGhhKCkgYmV0d2VlbiB0aGUgQyBhbmQgU1NFMiB2ZXJzaW9uCis2ZDBlNjZjMiBwcmVwYXJlIGV4cGVyaW1lbnRhdGlvbiB3aXRoIHl1djQ0NCAvIDQyMgorNzljYzQ5ZjUgYWRkIGEgLS1lbmFibGUtZXhwZXJpbWVudGFsIG9wdGlvbiB0byAnLi9jb25maWd1cmUnCitkNzU3NTIzOCBzc2UyIHZlcnNpb24gb2YgQ29sbGVjdEhpc3RvZ3JhbSgpCitjMWM3MjhkNiBhZGQgYW4gZXh0cmEgI2lmZGVmIFdFQlBfRVhQRVJJTUVOVEFMX0ZFQVRVUkVTIHRvIGF2b2lkICd1bnVzZWQgdmFyaWFibGUnIHdhcm5pbmcKKzYwYzYxZDJkIGFsd2F5cyBjYWxsIFZQKkVuY0RlbGV0ZUFscGhhKCkgdW5jb25kaXRpb25uYWxseSwgZm9yIHNpbXBsaWNpdHkKKzBmOGM2Mzg0IHNpbXBseSBkb24ndCBjYWxsIFdyaXRlRXh0ZW5zaW9ucygpIGlmIFdFQlBfRVhQRVJJTUVOVEFMX0ZFQVRVUkVTIGlzIG5vdCBkZWZpbmVkCis0N2M2NjFkNSByZW5hbWUgc3dhcCAtPiBzd2FwX3JiCisxMGQ1NWJiYiBtb3ZlIGNodW5rW10gZGVjbGFyYXRpb24gb3V0IG9mIHRoZSBmb3IoKSBsb29wCis1MTdjZWMyMSBmaXggaW5kZW50YXRpb24KK2Y3ZDllMjYxIGZpeCBtZXJnZSBwcm9ibGVtcworOGZkNDJiM2EgYWRkIGEgc3RyaWRlICdhX3N0cmlkZScgZm9yIHRoZSBhbHBoYSBwbGFuZQorYjhkY2JmMmYgZml4IGFscGhhLXBsYW5lIGNvcHkgYW5kIGNyb3AgbWV0aG9kcworY2RlZjg5ZGUgZml4IHNvbWUgJ3VudXNlZCB2YXJpYWJsZScgd2FybmluZworZmIyOWMyNjIgU1NFMiB2ZXJzaW9uIG9mIHRoZSBmd2QgdHJhbnNmb3JtIGFuZCB0aGUgc3F1YXJlZCBzdW0gbWV0cmljCisyYWI0YjcyZiBFWFBFUklNRU5UQUw6IGFkZCBzdXBwb3J0IGZvciBhbHBoYSBjaGFubmVsCitjZmJmODhhNiBhZGQgU1NFMiBmdW5jdGlvbnMuIH4yeCBmYXN0ZXIgZW5jb2Rpbmcgb24gYXZlcmFnZS4KK2U3ZmYzZjlhIG1lcmdlIHR3byBJVHJhbnNmb3JtcyB0b2dldGhlciB3aGVuIGFwcGxpY2FibGUgYW5kIGNoYW5nZSB0aGUgVFRyYW5zZm9ybSB0byByZXR1cm4gdGhlIHN1bSBkaXJlY3RseS4KK2NhNTU0MTM3IGZpeCBXZWJQSURlY0dldFJHQigpIHRvIGFjY2VwdCBhbnkgUkdCKEEpIG1vZGUsIG5vdCBqdXN0IE1PREVfUkdCCis4YWE1MGVmZCBmaXggc29tZSAnbWFuJyB0eXBvcworZDNmM2JkZGEgdXBkYXRlIENoYW5nZUxvZyAodGFnOiB2MC4xLjIpCitkN2U5YTY5YyB1cGRhdGUgY29udHJpYnV0b3IgbGlzdAorMjYxYWJiOGUgYWRkIGEgJ3N1cGVyY2xlYW4nIHNlY3Rpb24KKzI3NmFlODI1IFJlbW92ZSBmaWxlcyBub3QgbWVhbiB0byBiZSBpbiBnaXQsIGFuZCB1cGRhdGUgLmdpdGlnbm9yZQorMjQ4Njg0NTUgYnVpbGQ6IHByZXBhcmUgbGlid2VicC5wYworMTRjZWI2ZTggYWRkICItdmVyc2lvbiIgZGVzY3JpcHRpb24gdG8gbWFuIHBhZ2VzCitiMjQ3YTNiMiBDcmVhdGUgdGhlIG00IGRpcmVjdG9yeSwgYW5kIGFsc28gcGxhY2UgLmdpdGlnbm9yZSBpbiB0aGVyZSBmb3IgbGlidG9vbC4KK2NkZDczNGM5IFJlc29sdmUgYXV0b21ha2Ugd2FybmluZ3MKK2M1ZmE3MjZlIGJ1aWxkOiBhZGQgcGtnY29uZmlnIGZpbGVzCitiMjBhYWNhMiBidWlsZDoganVzdCB1c2UgYXV0b3JlY29uZiwgYXZvaWQgY2FsbGluZyB0b29scyBtYW51YWxseQorNGIwYjBkNjYgY3dlYnA6IHVzZSBtb2Rlcm4gZnVuY3Rpb25zCitlZmJjNmM0MSB1cGRhdGUgQW5kcm9pZC5taworNzc3NzU3MGIgYmV0dGVyIHZlcnNpb24gb2YgQ2hhbmdlTG9nCitmYTcwZDJiNyB1cGRhdGUgdmVyc2lvbiBudW1iZXIgaW4gdGhlIERPQworZjhkYjVkNWQgbW9yZSBDODktZml4ZXMKKzBkZTAxM2IzIGZpeCB0eXBvcworNjUwZmZhM2IgYWRkIHZlcnNpb24gZ2V0dGVycyBmb3IgZGVjb2RlciBhbmQgZW5jb2RlcgorYmU0ODY3ZDIgZG9jIGZvciBpbmNyZW1lbnRhbCBkZWNvZGluZworNTY3MzJhMWIgYWRkIGlkZWMub2JqIGluIE1TVkMgbWFrZWZpbGUKKzIwOGFmYjVlIGFkZCBjKysgZ3VhcmRzCis4YmY3NmZlMCBhZGQgaW5jcmVtZW50YWwgZGVjb2RpbmcKKzFmMjg4MzI4ICdpbmxpbmUnIGlzbid0IGRlZmluZWQgaW4gc3RyaWN0IGFuc2kgYzg5Cis4Yjc3YzYzMiBtb3ZlIHRoZSBxdWFudGl6YXRpb24gZnVuY3Rpb24gdG8gZHNwLmMKK2IyYzM1NzVjIGFkZCBhICdsYXN0X3knIGZpZWxkIHRvIFdlYlBEZWNQYXJhbXMKKzI2NTRjM2RhIGNvcnJlY3RseSBwYXNzIGFsb25nIHRoZSBleGFjdCBzYW1lIHN0YXR1cyByZXR1cm5lZCBmcm9tIFBhcnNlUGFydGl0aW9ucworNDcwNDE0NmEgYWRkIG1pc3NpbmcgcHJlY2lzaW9uIGluIHRoZSBtYW4KKzZkOTc4YTZjIGFkZCBlcnJvciBtZXNzYWdlcworNjQ2M2U2YWIgYWRkIHNvbWUgaW5zdGFsbCBpbnN0cnVjdGlvbnMsIGFuZCBmaXggaW50ZWwtbWFjIGZsYWdzCiswNWZiN2JmYyBNZXJnZSAiLmdpdGlnbm9yZTogaW5pdGlhbCB2ZXJzaW9uIgorYzMzZjAxOTUgLmdpdGlnbm9yZTogaW5pdGlhbCB2ZXJzaW9uCitlNTMyYjlhYiBNYWtlZmlsZTogYWxsb3cgb3V0IG9mIHRyZWUgYnVpbGRzCis0YzBkYTdhYSBlbmFibGUgc3BhcnNlIGRjL2FjIHRyYW5zZm9ybXMKKzA3ZGJiOGQ1IGNsYXJpZnkgdGhlIHJldHVybiBsb2dpYworNWM2OWUxYmIgZml4IGJpZ2dlci1ieS0xIGFycmF5Cis3YzUyNjdlMyBmaXggYSAoaGFybWxlc3MpIHR5cG86IG5vbl96ZXJvXyAtPiBub25femVyb19hY18KK2JjNzUyMTM1IGZpeCBtaXNzaW5nIGZyZWUoKQorYWYzZTJhYWEgcmVtb3ZlIHRyYWlsaW5nIHNwYWNlcworMTNlNTBkYTYgbWFrZSB0aGUgYml0cmVhZGVyIHByZWxvYWQgYXQgbGVhc3QgOGJpdHMsIGluc3RlYWQgb2YgcG9zdC1sb2FkIHRoZW0gKHRoaXMgbWFrZXMgaW5pdGlhbGl6YXRpb24gZWFzaWVyIGFuZCB3aWxsIGJlIGhlbHBmdWwgZm9yIGluY3JlbWVudGFsIGRlY29kaW5nKS4gTW9kaWZ5IFBhcnNlUGFydGl0aW9ucygpIHRvIGFjY29tbW9kYXRlIGZvciB0cnVuY2F0ZWQgaW5wdXQuCitmNDg4OGY3NyBlbWl0IDkgLSBuYl9iaXRzIHRyYWlsaW5nIHplcm9zIGluc3RlYWQgb2YgOAorM2RiNjUyNTUgc2VwYXJhdGUgYmxvY2stcGFyc2luZyBpbnRvIGEgdmlzaWJsZSBWUDhEZWNvZGVNQigpCithODcxZGUwMiBhZGQgbWlzc2luZyBleHRlcm4gIkMiCitiM2NlOGM1MiByZW1vdmUgYSBnY2Mgd2FybmluZyBhYm91dCB0eXBlIHB1biBieSB1c2luZyBhIHByb3BlciB1bmlvbidkIHR5cGUKK2UxODYzNzE1IHVwZGF0ZSBhZnRlciBhZGRpdGlvbiBvZiB3ZWJwaS5oCiszZTg1NmUyZCBFeHRyYWN0IHNvbWUgdXNlZnVsIGZ1bmN0aW9ucyBhcm91bmQgZGVjb2RpbmcgYnVmZmVyIFdlYlBEZWNQYXJhbXMuCitkNWJjMDVhNCBtYWtlIHRoZSBmaWx0ZXJpbmcgcHJvY2VzcyBtYXRjaCBsaWJ2cHggYW5kIGZmdnA4CitkZDYwMTM4ZCBhZGQgbWFuIHBhZ2VzIGZvciBjd2VicCgxKSBhbmQgZHdlYnAoMSkKK2M0ZmEzNjQ0IGZpeCBoZWFkZXIKKzViNzBiMzc4ICogYWRkIGFuIG9wdGlvbiB0byBieXBhc3NfZmlsdGVyaW5nIGluIFZQOElvLgorYjk3YTQwMDMgc2ltcGxpZnkgUXVhbnRpemVCbG9jayBjb2RlIGEgYml0Cis4NGI1OGViYiBhZGQgbW9yZSBjaGVja3MgYXJvdW5kIHBpY3R1cmUgYWxsb2NhdGlvbgorYjY1YTNlMTAgICAgIHJlbW92ZSBhYnNvbHV0ZV9kZWx0YV8gZmllbGQgYW5kIHN5bnRheCBjb2RlCiswNzQ0ZTg0MiBEb250JyBvcGVuIG91dHB1dCBmaWxlIHVudGlsIHdlJ3JlIHN1cmUgdGhlIGlucHV0IGZpbGUgaXMgdmFsaWQKK2Q1YmQ1NGM3IGZpeCB0eXBvIGFuZCBidWdneSBsaW5lCitmN2E5NTQ5ZCBBZGQgYSBzaW1wbGUgdG9wLWxldmVsIG1ha2VmaWxlLnVuaXggZm9yIHF1aWNrICYgZWFzeSBidWlsZC4KKzVmMzZiOTQ0IHVwZGF0ZSB0aGUgZG9jIGZvciB0aGUgLWYgb3B0aW9uCitmNjFkMTRhYSBhIFdlYlAgZW5jb2RlciBjb252ZXJ0cyBQTkcgJiBKUEVHIHRvIFdlYlAKKzgxYzk2NjIxIG9vcHM6IGZvcmdvdHRlbiBjYWxsIHRvIEluaXRpYWxpemUoKSArIG1vdmUgdGhlIGVycm9yIG1lc3NhZ2UgdG8gYSBtb3JlIHVzZWZ1bCBwbGFjZQorODdmZmEwMDUgdHlwbzogZml4IGEgbWlzc2luZyAnUicsIHdhcyBjb25mdXNpbmcuCitiMDRiODU3YSAqIGFkZCBkZWNvZGluZyBtZWFzdXJlbWVudCB1c2luZyBzdG9wd2F0Y2guaCAodXNlIC12IG9wdGlvbikgKiBzdXBwb3J0IFBORyBvdXRwdXQgdGhyb3VnaCBXSUMgb24gV2luMzIKKzc0NmE0ODIwICogbWFrZSAoKnB1dCkoKSBob29rIHJldHVybiBhIGJvb2wgZm9yIGFib3J0IHJlcXVlc3QuICogYWRkIGFuIGVudW0gZm9yIFZQOFN0YXR1cygpIHRvIG1ha2UgdGhpbmdzIGNsZWFyZXIKKzczYzk3M2U2ICogc3RyZW5ndGhlbiByaWZmL2NodW5rIHNpemUgY2hlY2tzICogZG9uJ3QgY29uc2lkZXIgb2RkLXNpemVkIGNodW5rcyBiZWluZyBhbiBlcnJvcgorMWRjNDYxMWEgYWRkIHN1cHBvcnQgZm9yIFBORyBvdXRwdXQgKGRlZmF1bHQpIHJlZ3VsYXJpemUgaW5jbHVkZSBndWFyZHMKKzg2MDY0MWRmIGZpeCBhIHR5cG86IHNpemVvZihrWU1vZGVQcm9iYUludGVyMCkgPT4gc2l6ZW9mKGtVVk1vZGVQcm9iYUludGVyMCkKKzMyNTRmYzUyIGZpeCBzb21lIHBldHR5IGNvbnN0bmVzcyBmaXggdGhlIC4vY29uZmlndXJlIGZpbGUgdG9vCis1MDRkMzM5MyBmaXggZW9mXyBtaXMtaW5pdGlhbGl6YXRpb24KKzJiYzA3NzhmIGxlZnRvdmVyIE1ha2VmaWxlLiogZnJvbSBwcmV2aW91cyBjb21taXQKK2QyY2YwNGU0IG1vdmUgTWFrZWZpbGUuYW0gb25lIGxldmVsIGJlbG93LCB0byBzcmMvZGVjIGZpeCB0eXBvcyBoZXJlIGFuZCB0aGVyZSBkd2VicCBpcyBub3cgYW4gaW5zdGFsbGVkIHByb2dyYW0KK2FkZTkyZGU4IHR5cG86IHZwOC5oIC0+IGRlY29kZV92cDguaAorZDcyNDEyNDEgZm9yZ290IHRvIGRlY2xhcmUgdHlwZXMuaCB0byBiZSBpbnN0YWxsZWQKKzY0MjFhN2E0IG1vdmUgdGhlIGRlY29kZXIgc291cmNldHJlZSB0byBhIHN1Yi1sb2NhdGlvbiBzcmMvZGVjIHRvIG1ha2Ugcm9vbSBmb3IgZnV0dXJlIGxpYnMgc291cmNlcworYTliM2VhYjYgY29ycmVjdCBsYXlvdXQgbmFtZSBpcyBJTUM0LgorMjMzMDUyMmMgaGFuZGxlIGNvcm5lciBjYXNlIG9mIHplcm8tZGltZW5zaW9ucworMjgwYzM2NTggbWFrZSBWUDhJbml0KCkgaGFuZGxlIHNob3J0IGJ1ZmZlcnMgKDwgMiBieXRlcykgY29ycmVjdGx5CitiMWM5ZThiNCBoYW5kbGUgZXJyb3IgY2FzZXMgbW9yZSByb2J1c3RseQorMGU5NDkzNWMgTWVyZ2UgInRhYmxlLWxlc3MgdmVyc2lvbiBvZiBjbGlwXzhiKCkiCisxZTBhMmQyNSB0YWJsZS1sZXNzIHZlcnNpb24gb2YgY2xpcF84YigpCitlMTIxMDllZSBkd2VicDogY2hhbmdlIC15dXYgb3B0aW9uIHRvIC1yYXcgY2hhbmdlIHRoZSBsYXlvdXQgdG8gSU1DMgorZDcyMTgwYTQgc3BlZWQtdXAgZmFuY3kgdXBzY2FsZXIKKzkxNDVmM2JjIHJlc2V0IGVvZl8gYXQgY29uc3RydWN0aW9uIHRpbWUKK2E3ZWUwNTU5IHNpbXBsaWZ5IHRoZSBsb2dpYyBvZiBHZXRDb2VmZnMoKQorZjY3YjU5MzkgbG90IG9mIGNvc21ldGljcworZWEyN2Q3YzYgZml4IGVuZGlhbiBwcm9ibGVtIG9uIFBvd2VyUEMKK2JlYjBhMWJhIGZpeCBzaWduYXR1cmUgb2YgVlA4U3RvcmVCbG9jaworYjEyOGM1ZTIgTWVyZ2UgImZhbmN5IGNocm9tYSB1cHNjYWxpbmciCis2YTM3YTJhYSBmYW5jeSBjaHJvbWEgdXBzY2FsaW5nCitmZjU2NWVkYyBmaXggdHdvIG51bWVyaWMgdHlwb3MKKzVhOTM2YTBhIHVzZSB1aW50cHRyX3QgZm9yIGNhc3RpbmcgcG9pbnRlcnMgdG8gaW50cworZTE0YTAzMDEgZm9yIGNyb3NzX2NvbXBpbGluZz15ZXMgdG8gcHJldmVudCBleGVjdXRpbmcgYW55IGJpbmFyeQorODNiNTQ1ZWUgYWRkIHZjOSsgbWFrZWZpbGUKKzI5NmY2OTE0IGZpeCBvdXRwdXQgbG9vcCBmb3Igc21hbGwgaGVpZ2h0CitjYmZiYjVjMyBjb252ZXJ0IHRvIHBsYWluLUMKK2YwOWY5NmVlIEZpeCBkZWNsYXJhdGlvbiBhZnRlciBzdGF0ZW1lbnQgd2FybmluZworNTk4MWVlNTUgRml4IFVWIHBsYW5lIGFjL2RjIHF1YW50aXplciB0cmFuc3Bvc2l0aW9uCitjOGQxNWVmYSBjb252ZXJ0IHRvIEFOU0ktQworYzNmNDFjYjQgSW5pdGlhbCBjb21taXQKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL0xJQ0VOU0UgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9MSUNFTlNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzM5NWM5Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL0xJQ0VOU0UKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi1Db3B5cmlnaHQgKGMpIDIwMTAsIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotbWV0OgotCi0gICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0KLSAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAgICBkaXN0cmlidXRpb24uCi0KLSAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5Ci0gICAgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLUxJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLUhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLVNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLUxJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi1USEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0oSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLU9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLUFkZGl0aW9uYWwgSVAgUmlnaHRzIEdyYW50IChQYXRlbnRzKQotCi0iVGhpcyBpbXBsZW1lbnRhdGlvbiIgbWVhbnMgdGhlIGNvcHlyaWdodGFibGUgd29ya3MgZGlzdHJpYnV0ZWQgYnkKLUdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBXZWJNIFByb2plY3QuCi0KLUdvb2dsZSBoZXJlYnkgZ3JhbnRzIHRvIHlvdSBhIHBlcnBldHVhbCwgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLAotbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikKLXBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsCi10cmFuc2ZlciwgYW5kIG90aGVyd2lzZSBydW4sIG1vZGlmeSBhbmQgcHJvcGFnYXRlIHRoZSBjb250ZW50cyBvZiB0aGlzCi1pbXBsZW1lbnRhdGlvbiBvZiBWUDgsIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50Ci1jbGFpbXMsIGJvdGggY3VycmVudGx5IG93bmVkIGJ5IEdvb2dsZSBhbmQgYWNxdWlyZWQgaW4gdGhlIGZ1dHVyZSwKLWxpY2Vuc2FibGUgYnkgR29vZ2xlIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGlzCi1pbXBsZW1lbnRhdGlvbiBvZiBWUDguIFRoaXMgZ3JhbnQgZG9lcyBub3QgaW5jbHVkZSBjbGFpbXMgdGhhdCB3b3VsZCBiZQotaW5mcmluZ2VkIG9ubHkgYXMgYSBjb25zZXF1ZW5jZSBvZiBmdXJ0aGVyIG1vZGlmaWNhdGlvbiBvZiB0aGlzCi1pbXBsZW1lbnRhdGlvbi4gSWYgeW91IG9yIHlvdXIgYWdlbnQgb3IgZXhjbHVzaXZlIGxpY2Vuc2VlIGluc3RpdHV0ZSBvcgotb3JkZXIgb3IgYWdyZWUgdG8gdGhlIGluc3RpdHV0aW9uIG9mIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55Ci1lbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nCi10aGF0IHRoaXMgaW1wbGVtZW50YXRpb24gb2YgVlA4IG9yIGFueSBjb2RlIGluY29ycG9yYXRlZCB3aXRoaW4gdGhpcwotaW1wbGVtZW50YXRpb24gb2YgVlA4IGNvbnN0aXR1dGVzIGRpcmVjdCBvciBjb250cmlidXRvcnkgcGF0ZW50Ci1pbmZyaW5nZW1lbnQsIG9yIGluZHVjZW1lbnQgb2YgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50Ci1yaWdodHMgZ3JhbnRlZCB0byB5b3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGlzIGltcGxlbWVudGF0aW9uIG9mIFZQOAotc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL01ha2VmaWxlLmFtIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y3M2IxMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsOSBAQAorQUNMT0NBTF9BTUZMQUdTID0gLUkgbTQKK1NVQkRJUlMgPSBzcmMgaW1hZ2VpbyBtYW4KK0VYVFJBX0RJU1QgPSBDT1BZSU5HIGF1dG9nZW4uc2gKKworaWYgV0FOVF9FWFRSQVMKKyAgU1VCRElSUyArPSBleHRyYXMKK2VuZGlmCisKK1NVQkRJUlMgKz0gZXhhbXBsZXMKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL01ha2VmaWxlLnZjIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvTWFrZWZpbGUudmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQxYmY4NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL01ha2VmaWxlLnZjCkBAIC0wLDAgKzEsNTE3IEBACisjCisjIFN0ZW0gZm9yIHN0YXRpYyBsaWJzIGFuZCBETExzCisjCitMSUJXRUJQREVDT0RFUl9CQVNFTkFNRSA9IGxpYndlYnBkZWNvZGVyCitMSUJXRUJQX0JBU0VOQU1FID0gbGlid2VicAorTElCV0VCUE1VWF9CQVNFTkFNRSA9IGxpYndlYnBtdXgKK0xJQldFQlBERU1VWF9CQVNFTkFNRSA9IGxpYndlYnBkZW11eAorCishSUZOREVGIEFSQ0gKKyFJRiAhIFsgY2wgMj4mMSB8IGZpbmQgIng4NiIgPiBOVUwgXQorQVJDSCA9IHg4NgorIUVMU0UgSUYgISBbIGNsIDI+JjEgfCBmaW5kICJ4NjQiID4gTlVMIF0KK0FSQ0ggPSB4NjQKKyFFTFNFIElGICEgWyBjbCAyPiYxIHwgZmluZCAiQVJNIiA+IE5VTCBdCitBUkNIID0gQVJNCishRUxTRQorIUVSUk9SIFVuYWJsZSB0byBhdXRvLWRldGVjdCB0b29sY2hhaW4gYXJjaGl0ZWN0dXJlISBcCitJZiBjbC5leGUgaXMgaW4geW91ciBQQVRIIHJlcnVuIG5tYWtlIHdpdGggQVJDSD08YXJjaD4uCishRU5ESUYKKyFFTkRJRgorCishSUYgIiQoQVJDSCkiID09ICJ4ODYiCitQTEFURk9STV9MREZMQUdTID0gL1NBRkVTRUgKKyFFTkRJRgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyBOb3RoaW5nIG1vcmUgdG8gZG8gYmVsb3cgdGhpcyBsaW5lIQorCitOT0xPR08gICAgID0gL25vbG9nbworQ0NOT0RCRyAgICA9IGNsLmV4ZSAkKE5PTE9HTykgL08yIC9ETkRFQlVHCitDQ0RFQlVHICAgID0gY2wuZXhlICQoTk9MT0dPKSAvT2QgL0dtIC9aaSAvRF9ERUJVRyAvUlRDMQorQ0ZMQUdTICAgICA9IC9JLiAvSXNyYyAkKE5PTE9HTykgL1czIC9FSHNjIC9jCitDRkxBR1MgICAgID0gJChDRkxBR1MpIC9EV0lOMzIgL0RfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUyAvRFdJTjMyX0xFQU5fQU5EX01FQU4KK0xERkxBR1MgICAgPSAvTEFSR0VBRERSRVNTQVdBUkUgL01BTklGRVNUIC9OWENPTVBBVCAvRFlOQU1JQ0JBU0UKK0xERkxBR1MgICAgPSAkKExERkxBR1MpICQoUExBVEZPUk1fTERGTEFHUykKK0xOS0RMTCAgICAgPSBsaW5rLmV4ZSAvRExMICQoTk9MT0dPKQorTE5LRVhFICAgICA9IGxpbmsuZXhlICQoTk9MT0dPKQorTE5LTElCICAgICA9IGxpYi5leGUgJChOT0xPR08pCitNVCAgICAgICAgID0gbXQuZXhlICQoTk9MT0dPKQorUkNOT0RCRyAgICA9IHJjLmV4ZSAkKE5PTE9HTykgL2wiMHgwNDA5IiAgIyAweDQwOSA9IFUuUy4gRW5nbGlzaAorUkNERUJVRyAgICA9ICQoUkNOT0RCRykgL0RfREVCVUcKKworIUlGICIkKEFSQ0gpIiA9PSAiQVJNIgorQ0ZMQUdTID0gJChDRkxBR1MpIC9EV0lOQVBJX0ZBTUlMWT1XSU5BUElfRkFNSUxZX1BIT05FX0FQUCAvRFdFQlBfVVNFX1RIUkVBRAorIUVMU0UKK0NGTEFHUyA9ICQoQ0ZMQUdTKSAvREhBVkVfV0lOQ09ERUNfSCAvRFdFQlBfVVNFX1RIUkVBRAorIUVORElGCisKK0NGR1NFVCAgICAgPSBGQUxTRQorIUlGICIkKE9CSkRJUikiID09ICIiCitPVVRESVIgPSAuLlxvYmpcCishRUxTRQorT1VURElSID0gJChPQkpESVIpCishRU5ESUYKKworIUlGICIkKEhBVkVfQVZYMikiID09ICIxIgorQ0ZMQUdTID0gJChDRkxBR1MpIC9EV0VCUF9IQVZFX0FWWDIKK0FWWDJfRkxBR1MgPSAvYXJjaDpBVlgyCishRU5ESUYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgUnVudGltZSBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24KKyFJRiAiJChSVExJQkNGRykiID09ICJzdGF0aWMiCitSVExJQiAgPSAvTVQKK1JUTElCRCA9IC9NVGQKKyFFTFNFIElGICIkKFJUTElCQ0ZHKSIgPT0gImxlZ2FjeSIKK1JUTElCQ0ZHID0gc3RhdGljCitSVExJQiAgPSAvTVQKK1JUTElCRCA9IC9NVGQKK0NGTEFHUyA9ICQoQ0ZMQUdTKSAvR1MtIC9hcmNoOklBMzIKKyFFTFNFCitSVExJQiAgID0gL01ECitSVExJQkQgID0gL01EZAorIUVORElGCitESVJCQVNFID0gJChPVVRESVIpXCQoQ0ZHKVwkKEFSQ0gpCitESVJPQkogPSAkKERJUkJBU0UpXG9iagorRElSTElCID0gJChESVJCQVNFKVxsaWIKK0RJUklOQyA9ICQoRElSQkFTRSlcaW5jbHVkZQorRElSQklOID0gJChESVJCQVNFKVxiaW4KK0xJQldFQlBfUERCTkFNRSA9ICQoRElST0JKKVwkKExJQldFQlBfQkFTRU5BTUUpLnBkYgorT1VUUFVUX0RJUlMgPSAkKERJUkJJTikgJChESVJJTkMpICQoRElSTElCKSBcCisgICAgICAgICAgICAgICQoRElST0JKKVxkZWMgXAorICAgICAgICAgICAgICAkKERJUk9CSilcZGVtdXggXAorICAgICAgICAgICAgICAkKERJUk9CSilcZHNwIFwKKyAgICAgICAgICAgICAgJChESVJPQkopXGVuYyBcCisgICAgICAgICAgICAgICQoRElST0JKKVxleGFtcGxlcyBcCisgICAgICAgICAgICAgICQoRElST0JKKVxleHRyYXMgXAorICAgICAgICAgICAgICAkKERJUk9CSilcaW1hZ2VpbyBcCisgICAgICAgICAgICAgICQoRElST0JKKVxtdXggXAorICAgICAgICAgICAgICAkKERJUk9CSilcdXRpbHMgXAorCisjIFRhcmdldCBjb25maWd1cmF0aW9uCishSUYgIiQoQ0ZHKSIgPT0gInJlbGVhc2Utc3RhdGljIgorQ0MgICAgICAgICAgICAgPSAkKENDTk9EQkcpCitTVEFUSUNMSUJCVUlMRCA9IFRSVUUKKyFFTFNFIElGICIkKENGRykiID09ICJkZWJ1Zy1zdGF0aWMiCitDQyAgICAgICAgICAgICA9ICQoQ0NERUJVRykKK1JUTElCICAgICAgICAgID0gJChSVExJQkQpCitTVEFUSUNMSUJCVUlMRCA9IFRSVUUKK0xJQldFQlBERUNPREVSX0JBU0VOQU1FID0gJChMSUJXRUJQREVDT0RFUl9CQVNFTkFNRSlfZGVidWcKK0xJQldFQlBfQkFTRU5BTUUgPSAkKExJQldFQlBfQkFTRU5BTUUpX2RlYnVnCitMSUJXRUJQTVVYX0JBU0VOQU1FID0gJChMSUJXRUJQTVVYX0JBU0VOQU1FKV9kZWJ1ZworTElCV0VCUERFTVVYX0JBU0VOQU1FID0gJChMSUJXRUJQREVNVVhfQkFTRU5BTUUpX2RlYnVnCishRUxTRSBJRiAiJChDRkcpIiA9PSAicmVsZWFzZS1keW5hbWljIgorQ0MgICAgICAgID0gJChDQ05PREJHKQorUkMgICAgICAgID0gJChSQ05PREJHKQorRExMQlVJTEQgID0gVFJVRQorIUVMU0UgSUYgIiQoQ0ZHKSIgPT0gImRlYnVnLWR5bmFtaWMiCitDQyAgICAgICAgPSAkKENDREVCVUcpCitSQyAgICAgICAgPSAkKFJDREVCVUcpCitSVExJQiAgICAgPSAkKFJUTElCRCkKK0RMTEJVSUxEICA9IFRSVUUKK0xJQldFQlBERUNPREVSX0JBU0VOQU1FID0gJChMSUJXRUJQREVDT0RFUl9CQVNFTkFNRSlfZGVidWcKK0xJQldFQlBfQkFTRU5BTUUgPSAkKExJQldFQlBfQkFTRU5BTUUpX2RlYnVnCitMSUJXRUJQTVVYX0JBU0VOQU1FID0gJChMSUJXRUJQTVVYX0JBU0VOQU1FKV9kZWJ1ZworTElCV0VCUERFTVVYX0JBU0VOQU1FID0gJChMSUJXRUJQREVNVVhfQkFTRU5BTUUpX2RlYnVnCishRU5ESUYKKworIUlGICIkKFNUQVRJQ0xJQkJVSUxEKSIgPT0gIlRSVUUiCitDQyAgICAgPSAkKENDKSAkKFJUTElCKQorQ0ZHU0VUID0gVFJVRQorTElCV0VCUERFQ09ERVIgPSAkKERJUkxJQilcJChMSUJXRUJQREVDT0RFUl9CQVNFTkFNRSkubGliCitMSUJXRUJQID0gJChESVJMSUIpXCQoTElCV0VCUF9CQVNFTkFNRSkubGliCitMSUJXRUJQTVVYID0gJChESVJMSUIpXCQoTElCV0VCUE1VWF9CQVNFTkFNRSkubGliCitMSUJXRUJQREVNVVggPSAkKERJUkxJQilcJChMSUJXRUJQREVNVVhfQkFTRU5BTUUpLmxpYgorIUVMU0UgSUYgIiQoRExMQlVJTEQpIiA9PSAiVFJVRSIKK0RMTElOQyA9IHdlYnBfZGxsLmgKK0NDICAgICA9ICQoQ0MpIC9JJChESVJPQkopIC9GSSQoRExMSU5DKSAkKFJUTElCKSAvRFdFQlBfRExMCitMSUJXRUJQREVDT0RFUiA9ICQoRElSTElCKVwkKExJQldFQlBERUNPREVSX0JBU0VOQU1FKV9kbGwubGliCitMSUJXRUJQID0gJChESVJMSUIpXCQoTElCV0VCUF9CQVNFTkFNRSlfZGxsLmxpYgorTElCV0VCUE1VWCA9ICQoRElSTElCKVwkKExJQldFQlBNVVhfQkFTRU5BTUUpX2RsbC5saWIKK0xJQldFQlBERU1VWCA9ICQoRElSTElCKVwkKExJQldFQlBERU1VWF9CQVNFTkFNRSlfZGxsLmxpYgorTElCV0VCUF9QREJOQU1FID0gJChESVJPQkopXCQoTElCV0VCUF9CQVNFTkFNRSlfZGxsLnBkYgorQ0ZHU0VUID0gVFJVRQorIUVORElGCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFVzYWdlCisjCishSUYgIiQoQ0ZHU0VUKSIgPT0gIkZBTFNFIgorIU1FU1NBR0UgVXNhZ2U6IG5tYWtlIC9mIE1ha2VmaWxlLnZjIFtDRkc9PGNvbmZpZz5dCishTUVTU0FHRSAuICAgICAgICAgIFtPQkpESVI9PHBhdGg+XSBbUlRMSUJDRkc9PHJ0bGliPl0gWzx0YXJnZXQ+XQorIU1FU1NBR0UKKyFNRVNTQUdFIHdoZXJlIDxjb25maWc+IGlzIG9uZSBvZjoKKyFNRVNTQUdFIC0gIHJlbGVhc2Utc3RhdGljICAgICAgICAgICAgICAgIC0gcmVsZWFzZSBzdGF0aWMgbGlicmFyeQorIU1FU1NBR0UgLSAgZGVidWctc3RhdGljICAgICAgICAgICAgICAgICAgLSBkZWJ1ZyBzdGF0aWMgbGlicmFyeQorIU1FU1NBR0UgLSAgcmVsZWFzZS1keW5hbWljICAgICAgICAgICAgICAgLSByZWxlYXNlIGR5bmFtaWMgbGluayBsaWJyYXJ5IChETEwpCishTUVTU0FHRSAtICBkZWJ1Zy1keW5hbWljICAgICAgICAgICAgICAgICAtIGRlYnVnIGR5bmFtaWMgbGluayBsaWJyYXJ5IChETEwpCishTUVTU0FHRQorIU1FU1NBR0UgPHRhcmdldD4gbWF5IGJlOgorIU1FU1NBR0UgLSAgY2xlYW4gICAgICAgICAgICAgICAgICAgICAgICAgLSBwZXJmb3JtIGEgY2xlYW4gZm9yIENGRworIU1FU1NBR0UgLSAgZXhwZXJpbWVudGFsICAgICAgICAgICAgICAgICAgLSBidWlsZCBDRkcgd2l0aCBleHBlcmltZW50YWwKKyFNRVNTQUdFIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXMgZW5hYmxlZC4KKyFNRVNTQUdFIC0gKGVtcHR5KSAgICAgICAgICAgICAgICAgICAgICAgIC0gYnVpbGQgbGlid2VicC1iYXNlZCB0YXJnZXRzIGZvciBDRkcKKyFNRVNTQUdFIC0gYWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gYnVpbGQgKGRlKW11eC1iYXNlZCB0YXJnZXRzIGZvciBDRkcKKyFNRVNTQUdFIC0gZ2lmMndlYnAgICAgICAgICAgICAgICAgICAgICAgIC0gcmVxdWlyZXMgbGliZ2lmICYgPj0gVlMyMDEzCishTUVTU0FHRSAtIGFuaW1fZGlmZiAgICAgICAgICAgICAgICAgICAgICAtIHJlcXVpcmVzIGxpYmdpZiAmID49IFZTMjAxMworIU1FU1NBR0UgLSBhbmltX2R1bXAKKyFNRVNTQUdFCishTUVTU0FHRSBSVExJQkNGRyBjb250cm9scyB0aGUgcnVudGltZSBsaWJyYXJ5IGxpbmthZ2UgLSAnc3RhdGljJyBvciAnZHluYW1pYycuCishTUVTU0FHRSAgICdsZWdhY3knIHdpbGwgcHJvZHVjZSBhIFdpbmRvd3MgMjAwMCBjb21wYXRpYmxlIGxpYnJhcnkuCishTUVTU0FHRSBPQkpESVIgaXMgdGhlIHBhdGggd2hlcmUgeW91IGxpa2UgdG8gYnVpbGQgKG9iaiwgYmlucywgZXRjLiksCishTUVTU0FHRSAgIGRlZmF1bHRzIHRvIC4uXG9iagorCishSUYgIiQoQ0ZHKSIgIT0gIiIKKyFNRVNTQUdFCishRVJST1IgcGxlYXNlIGNob29zZSBhIHZhbGlkIGNvbmZpZ3VyYXRpb24gaW5zdGVhZCBvZiAiJChDRkcpIgorIUVORElGCishRU5ESUYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgUnVsZXMKKyMKKyFJRiAiJChDRkdTRVQpIiA9PSAiVFJVRSIKKyMgQSBjb25maWcgd2FzIHByb3ZpZGVkLCBzbyB0aGUgbGlicmFyeSBjYW4gYmUgYnVpbHQuCisjCisKK0RFQ19PQkpTID0gXAorICAgICQoRElST0JKKVxkZWNcYWxwaGFfZGVjLm9iaiBcCisgICAgJChESVJPQkopXGRlY1xidWZmZXJfZGVjLm9iaiBcCisgICAgJChESVJPQkopXGRlY1xmcmFtZV9kZWMub2JqIFwKKyAgICAkKERJUk9CSilcZGVjXGlkZWNfZGVjLm9iaiBcCisgICAgJChESVJPQkopXGRlY1xpb19kZWMub2JqIFwKKyAgICAkKERJUk9CSilcZGVjXHF1YW50X2RlYy5vYmogXAorICAgICQoRElST0JKKVxkZWNcdHJlZV9kZWMub2JqIFwKKyAgICAkKERJUk9CSilcZGVjXHZwOF9kZWMub2JqIFwKKyAgICAkKERJUk9CSilcZGVjXHZwOGxfZGVjLm9iaiBcCisgICAgJChESVJPQkopXGRlY1x3ZWJwX2RlYy5vYmogXAorCitERU1VWF9PQkpTID0gXAorICAgICQoRElST0JKKVxkZW11eFxhbmltX2RlY29kZS5vYmogXAorICAgICQoRElST0JKKVxkZW11eFxkZW11eC5vYmogXAorCitEU1BfREVDX09CSlMgPSBcCisgICAgJChESVJPQkopXGRzcFxhbHBoYV9wcm9jZXNzaW5nLm9iaiBcCisgICAgJChESVJPQkopXGRzcFxhbHBoYV9wcm9jZXNzaW5nX21pcHNfZHNwX3IyLm9iaiBcCisgICAgJChESVJPQkopXGRzcFxhbHBoYV9wcm9jZXNzaW5nX25lb24ub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXGFscGhhX3Byb2Nlc3Npbmdfc3NlMi5vYmogXAorICAgICQoRElST0JKKVxkc3BcYWxwaGFfcHJvY2Vzc2luZ19zc2U0MS5vYmogXAorICAgICQoRElST0JKKVxkc3BcY3B1Lm9iaiBcCisgICAgJChESVJPQkopXGRzcFxkZWMub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXGRlY19jbGlwX3RhYmxlcy5vYmogXAorICAgICQoRElST0JKKVxkc3BcZGVjX21pcHMzMi5vYmogXAorICAgICQoRElST0JKKVxkc3BcZGVjX21pcHNfZHNwX3IyLm9iaiBcCisgICAgJChESVJPQkopXGRzcFxkZWNfbXNhLm9iaiBcCisgICAgJChESVJPQkopXGRzcFxkZWNfbmVvbi5vYmogXAorICAgICQoRElST0JKKVxkc3BcZGVjX3NzZTIub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXGRlY19zc2U0MS5vYmogXAorICAgICQoRElST0JKKVxkc3BcZmlsdGVycy5vYmogXAorICAgICQoRElST0JKKVxkc3BcZmlsdGVyc19taXBzX2RzcF9yMi5vYmogXAorICAgICQoRElST0JKKVxkc3BcZmlsdGVyc19tc2Eub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXGZpbHRlcnNfbmVvbi5vYmogXAorICAgICQoRElST0JKKVxkc3BcZmlsdGVyc19zc2UyLm9iaiBcCisgICAgJChESVJPQkopXGRzcFxsb3NzbGVzcy5vYmogXAorICAgICQoRElST0JKKVxkc3BcbG9zc2xlc3NfbWlwc19kc3BfcjIub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXGxvc3NsZXNzX21zYS5vYmogXAorICAgICQoRElST0JKKVxkc3BcbG9zc2xlc3NfbmVvbi5vYmogXAorICAgICQoRElST0JKKVxkc3BcbG9zc2xlc3Nfc3NlMi5vYmogXAorICAgICQoRElST0JKKVxkc3BccmVzY2FsZXIub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXHJlc2NhbGVyX21pcHMzMi5vYmogXAorICAgICQoRElST0JKKVxkc3BccmVzY2FsZXJfbWlwc19kc3BfcjIub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXHJlc2NhbGVyX21zYS5vYmogXAorICAgICQoRElST0JKKVxkc3BccmVzY2FsZXJfbmVvbi5vYmogXAorICAgICQoRElST0JKKVxkc3BccmVzY2FsZXJfc3NlMi5vYmogXAorICAgICQoRElST0JKKVxkc3BcdXBzYW1wbGluZy5vYmogXAorICAgICQoRElST0JKKVxkc3BcdXBzYW1wbGluZ19taXBzX2RzcF9yMi5vYmogXAorICAgICQoRElST0JKKVxkc3BcdXBzYW1wbGluZ19tc2Eub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXHVwc2FtcGxpbmdfbmVvbi5vYmogXAorICAgICQoRElST0JKKVxkc3BcdXBzYW1wbGluZ19zc2UyLm9iaiBcCisgICAgJChESVJPQkopXGRzcFx1cHNhbXBsaW5nX3NzZTQxLm9iaiBcCisgICAgJChESVJPQkopXGRzcFx5dXYub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXHl1dl9taXBzMzIub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXHl1dl9taXBzX2RzcF9yMi5vYmogXAorICAgICQoRElST0JKKVxkc3BceXV2X25lb24ub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXHl1dl9zc2UyLm9iaiBcCisgICAgJChESVJPQkopXGRzcFx5dXZfc3NlNDEub2JqIFwKKworRFNQX0VOQ19PQkpTID0gXAorICAgICQoRElST0JKKVxkc3BcY29zdC5vYmogXAorICAgICQoRElST0JKKVxkc3BcY29zdF9taXBzMzIub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXGNvc3RfbWlwc19kc3BfcjIub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXGNvc3Rfc3NlMi5vYmogXAorICAgICQoRElST0JKKVxkc3BcZW5jLm9iaiBcCisgICAgJChESVJPQkopXGRzcFxlbmNfYXZ4Mi5vYmogXAorICAgICQoRElST0JKKVxkc3BcZW5jX21pcHMzMi5vYmogXAorICAgICQoRElST0JKKVxkc3BcZW5jX21pcHNfZHNwX3IyLm9iaiBcCisgICAgJChESVJPQkopXGRzcFxlbmNfbXNhLm9iaiBcCisgICAgJChESVJPQkopXGRzcFxlbmNfbmVvbi5vYmogXAorICAgICQoRElST0JKKVxkc3BcZW5jX3NzZTIub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXGVuY19zc2U0MS5vYmogXAorICAgICQoRElST0JKKVxkc3BcbG9zc2xlc3NfZW5jLm9iaiBcCisgICAgJChESVJPQkopXGRzcFxsb3NzbGVzc19lbmNfbWlwczMyLm9iaiBcCisgICAgJChESVJPQkopXGRzcFxsb3NzbGVzc19lbmNfbWlwc19kc3BfcjIub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXGxvc3NsZXNzX2VuY19tc2Eub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXGxvc3NsZXNzX2VuY19uZW9uLm9iaiBcCisgICAgJChESVJPQkopXGRzcFxsb3NzbGVzc19lbmNfc3NlMi5vYmogXAorICAgICQoRElST0JKKVxkc3BcbG9zc2xlc3NfZW5jX3NzZTQxLm9iaiBcCisgICAgJChESVJPQkopXGRzcFxzc2ltLm9iaiBcCisgICAgJChESVJPQkopXGRzcFxzc2ltX3NzZTIub2JqIFwKKworRVhfQU5JTV9VVElMX09CSlMgPSBcCisgICAgJChESVJPQkopXGV4YW1wbGVzXGFuaW1fdXRpbC5vYmogXAorCitJTUFHRUlPX0RFQ19PQkpTID0gXAorICAgICQoRElST0JKKVxpbWFnZWlvXGltYWdlX2RlYy5vYmogXAorICAgICQoRElST0JKKVxpbWFnZWlvXGpwZWdkZWMub2JqIFwKKyAgICAkKERJUk9CSilcaW1hZ2Vpb1xtZXRhZGF0YS5vYmogXAorICAgICQoRElST0JKKVxpbWFnZWlvXHBuZ2RlYy5vYmogXAorICAgICQoRElST0JKKVxpbWFnZWlvXHBubWRlYy5vYmogXAorICAgICQoRElST0JKKVxpbWFnZWlvXHRpZmZkZWMub2JqIFwKKyAgICAkKERJUk9CSilcaW1hZ2Vpb1x3ZWJwZGVjLm9iaiBcCisgICAgJChESVJPQkopXGltYWdlaW9cd2ljZGVjLm9iaiBcCisKK0lNQUdFSU9fRU5DX09CSlMgPSBcCisgICAgJChESVJPQkopXGltYWdlaW9caW1hZ2VfZW5jLm9iaiBcCisKK0VYX0dJRl9ERUNfT0JKUyA9IFwKKyAgICAkKERJUk9CSilcZXhhbXBsZXNcZ2lmZGVjLm9iaiBcCisKK0VYX1VUSUxfT0JKUyA9IFwKKyAgICAkKERJUk9CSilcZXhhbXBsZXNcZXhhbXBsZV91dGlsLm9iaiBcCisKK0VOQ19PQkpTID0gXAorICAgICQoRElST0JKKVxlbmNcYWxwaGFfZW5jLm9iaiBcCisgICAgJChESVJPQkopXGVuY1xhbmFseXNpc19lbmMub2JqIFwKKyAgICAkKERJUk9CSilcZW5jXGJhY2t3YXJkX3JlZmVyZW5jZXNfY29zdF9lbmMub2JqIFwKKyAgICAkKERJUk9CSilcZW5jXGJhY2t3YXJkX3JlZmVyZW5jZXNfZW5jLm9iaiBcCisgICAgJChESVJPQkopXGVuY1xjb25maWdfZW5jLm9iaiBcCisgICAgJChESVJPQkopXGVuY1xjb3N0X2VuYy5vYmogXAorICAgICQoRElST0JKKVxlbmNcZmlsdGVyX2VuYy5vYmogXAorICAgICQoRElST0JKKVxlbmNcZnJhbWVfZW5jLm9iaiBcCisgICAgJChESVJPQkopXGVuY1xoaXN0b2dyYW1fZW5jLm9iaiBcCisgICAgJChESVJPQkopXGVuY1xpdGVyYXRvcl9lbmMub2JqIFwKKyAgICAkKERJUk9CSilcZW5jXG5lYXJfbG9zc2xlc3NfZW5jLm9iaiBcCisgICAgJChESVJPQkopXGVuY1xwaWN0dXJlX2VuYy5vYmogXAorICAgICQoRElST0JKKVxlbmNccGljdHVyZV9jc3BfZW5jLm9iaiBcCisgICAgJChESVJPQkopXGVuY1xwaWN0dXJlX3BzbnJfZW5jLm9iaiBcCisgICAgJChESVJPQkopXGVuY1xwaWN0dXJlX3Jlc2NhbGVfZW5jLm9iaiBcCisgICAgJChESVJPQkopXGVuY1xwaWN0dXJlX3Rvb2xzX2VuYy5vYmogXAorICAgICQoRElST0JKKVxlbmNccHJlZGljdG9yX2VuYy5vYmogXAorICAgICQoRElST0JKKVxlbmNccXVhbnRfZW5jLm9iaiBcCisgICAgJChESVJPQkopXGVuY1xzeW50YXhfZW5jLm9iaiBcCisgICAgJChESVJPQkopXGVuY1x0b2tlbl9lbmMub2JqIFwKKyAgICAkKERJUk9CSilcZW5jXHRyZWVfZW5jLm9iaiBcCisgICAgJChESVJPQkopXGVuY1x2cDhsX2VuYy5vYmogXAorICAgICQoRElST0JKKVxlbmNcd2VicF9lbmMub2JqIFwKKworRVhUUkFTX09CSlMgPSBcCisgICAgJChESVJPQkopXGV4dHJhc1xleHRyYXMub2JqIFwKKyAgICAkKERJUk9CSilcZXh0cmFzXHF1YWxpdHlfZXN0aW1hdGUub2JqIFwKKworSU1BR0VJT19VVElMX09CSlMgPSBcCisgICAgJChESVJPQkopXGltYWdlaW9caW1hZ2Vpb191dGlsLm9iaiBcCisKK01VWF9PQkpTID0gXAorICAgICQoRElST0JKKVxtdXhcYW5pbV9lbmNvZGUub2JqIFwKKyAgICAkKERJUk9CSilcbXV4XG11eGVkaXQub2JqIFwKKyAgICAkKERJUk9CSilcbXV4XG11eGludGVybmFsLm9iaiBcCisgICAgJChESVJPQkopXG11eFxtdXhyZWFkLm9iaiBcCisKK1VUSUxTX0RFQ19PQkpTID0gXAorICAgICQoRElST0JKKVx1dGlsc1xiaXRfcmVhZGVyX3V0aWxzLm9iaiBcCisgICAgJChESVJPQkopXHV0aWxzXGNvbG9yX2NhY2hlX3V0aWxzLm9iaiBcCisgICAgJChESVJPQkopXHV0aWxzXGZpbHRlcnNfdXRpbHMub2JqIFwKKyAgICAkKERJUk9CSilcdXRpbHNcaHVmZm1hbl91dGlscy5vYmogXAorICAgICQoRElST0JKKVx1dGlsc1xxdWFudF9sZXZlbHNfZGVjX3V0aWxzLm9iaiBcCisgICAgJChESVJPQkopXHV0aWxzXHJlc2NhbGVyX3V0aWxzLm9iaiBcCisgICAgJChESVJPQkopXHV0aWxzXHJhbmRvbV91dGlscy5vYmogXAorICAgICQoRElST0JKKVx1dGlsc1x0aHJlYWRfdXRpbHMub2JqIFwKKyAgICAkKERJUk9CSilcdXRpbHNcdXRpbHMub2JqIFwKKworVVRJTFNfRU5DX09CSlMgPSBcCisgICAgJChESVJPQkopXHV0aWxzXGJpdF93cml0ZXJfdXRpbHMub2JqIFwKKyAgICAkKERJUk9CSilcdXRpbHNcaHVmZm1hbl9lbmNvZGVfdXRpbHMub2JqIFwKKyAgICAkKERJUk9CSilcdXRpbHNccXVhbnRfbGV2ZWxzX3V0aWxzLm9iaiBcCisKK0xJQldFQlBERUNPREVSX09CSlMgPSAkKERFQ19PQkpTKSAkKERTUF9ERUNfT0JKUykgJChVVElMU19ERUNfT0JKUykKK0xJQldFQlBfT0JKUyA9ICQoTElCV0VCUERFQ09ERVJfT0JKUykgJChFTkNfT0JKUykgJChEU1BfRU5DX09CSlMpIFwKKyAgICAgICAgICAgICAgICQoVVRJTFNfRU5DX09CSlMpICQoRExMX09CSlMpCitMSUJXRUJQTVVYX09CSlMgPSAkKE1VWF9PQkpTKSAkKExJQldFQlBNVVhfT0JKUykKK0xJQldFQlBERU1VWF9PQkpTID0gJChERU1VWF9PQkpTKSAkKExJQldFQlBERU1VWF9PQkpTKQorCitPVVRfTElCUyA9ICQoTElCV0VCUERFQ09ERVIpICQoTElCV0VCUCkKKyFJRiAiJChBUkNIKSIgPT0gIkFSTSIKK2V4OiAkKE9VVF9MSUJTKQorYWxsOiBleAorIUVMU0UKK09VVF9FWEFNUExFUyA9ICQoRElSQklOKVxjd2VicC5leGUgJChESVJCSU4pXGR3ZWJwLmV4ZQorRVhUUkFfRVhBTVBMRVMgPSAkKERJUkJJTilcdndlYnAuZXhlICQoRElSQklOKVx3ZWJwbXV4LmV4ZSBcCisgICAgICAgICAgICAgICAgICQoRElSQklOKVxpbWcyd2VicC5leGUgJChESVJCSU4pXGdldF9kaXN0by5leGUgXAorICAgICAgICAgICAgICAgICAkKERJUkJJTilcd2VicF9xdWFsaXR5LmV4ZSAkKERJUkJJTilcdndlYnBfc2RsLmV4ZSBcCisgICAgICAgICAgICAgICAgICQoRElSQklOKVx3ZWJwaW5mby5leGUKKworZXg6ICQoT1VUX0xJQlMpICQoT1VUX0VYQU1QTEVTKQorYWxsOiBleCAkKEVYVFJBX0VYQU1QTEVTKQorIyBOQjogZ2lmMndlYnAuZXhlIGFuZCBhbmltX2RpZmYuZXhlIGFyZSBleGNsdWRlZCBmcm9tICdhbGwnIGFzIGxpYmdpZiByZXF1aXJlcworIyBDOTkgc3VwcG9ydCB3aGljaCBpcyBvbmx5IGF2YWlsYWJsZSBmcm9tIFZTMjAxMyBvbndhcmQuCitnaWYyd2VicDogJChESVJCSU4pXGdpZjJ3ZWJwLmV4ZQorYW5pbV9kaWZmOiAkKERJUkJJTilcYW5pbV9kaWZmLmV4ZQorYW5pbV9kdW1wOiAkKERJUkJJTilcYW5pbV9kdW1wLmV4ZQorCiskKERJUkJJTilcYW5pbV9kaWZmLmV4ZTogJChESVJPQkopXGV4YW1wbGVzXGFuaW1fZGlmZi5vYmogJChFWF9BTklNX1VUSUxfT0JKUykKKyQoRElSQklOKVxhbmltX2RpZmYuZXhlOiAkKEVYX1VUSUxfT0JKUykgJChJTUFHRUlPX1VUSUxfT0JKUykKKyQoRElSQklOKVxhbmltX2RpZmYuZXhlOiAkKEVYX0dJRl9ERUNfT0JKUykgJChMSUJXRUJQREVNVVgpICQoTElCV0VCUCkKKyQoRElSQklOKVxhbmltX2R1bXAuZXhlOiAkKERJUk9CSilcZXhhbXBsZXNcYW5pbV9kdW1wLm9iaiAkKEVYX0FOSU1fVVRJTF9PQkpTKQorJChESVJCSU4pXGFuaW1fZHVtcC5leGU6ICQoRVhfVVRJTF9PQkpTKSAkKElNQUdFSU9fVVRJTF9PQkpTKQorJChESVJCSU4pXGFuaW1fZHVtcC5leGU6ICQoRVhfR0lGX0RFQ19PQkpTKSAkKExJQldFQlBERU1VWCkgJChMSUJXRUJQKQorJChESVJCSU4pXGFuaW1fZHVtcC5leGU6ICQoSU1BR0VJT19FTkNfT0JKUykKKyQoRElSQklOKVxjd2VicC5leGU6ICQoRElST0JKKVxleGFtcGxlc1xjd2VicC5vYmogJChJTUFHRUlPX0RFQ19PQkpTKQorJChESVJCSU4pXGN3ZWJwLmV4ZTogJChJTUFHRUlPX1VUSUxfT0JKUykKKyQoRElSQklOKVxjd2VicC5leGU6ICQoTElCV0VCUERFTVVYKQorJChESVJCSU4pXGR3ZWJwLmV4ZTogJChESVJPQkopXGV4YW1wbGVzXGR3ZWJwLm9iaiAkKElNQUdFSU9fREVDX09CSlMpCiskKERJUkJJTilcZHdlYnAuZXhlOiAkKElNQUdFSU9fRU5DX09CSlMpCiskKERJUkJJTilcZHdlYnAuZXhlOiAkKElNQUdFSU9fVVRJTF9PQkpTKQorJChESVJCSU4pXGR3ZWJwLmV4ZTogJChMSUJXRUJQREVNVVgpCiskKERJUkJJTilcZ2lmMndlYnAuZXhlOiAkKERJUk9CSilcZXhhbXBsZXNcZ2lmMndlYnAub2JqICQoRVhfR0lGX0RFQ19PQkpTKQorJChESVJCSU4pXGdpZjJ3ZWJwLmV4ZTogJChFWF9VVElMX09CSlMpICQoSU1BR0VJT19VVElMX09CSlMpICQoTElCV0VCUE1VWCkKKyQoRElSQklOKVxnaWYyd2VicC5leGU6ICQoTElCV0VCUCkKKyQoRElSQklOKVx2d2VicC5leGU6ICQoRElST0JKKVxleGFtcGxlc1x2d2VicC5vYmogJChFWF9VVElMX09CSlMpCiskKERJUkJJTilcdndlYnAuZXhlOiAkKElNQUdFSU9fVVRJTF9PQkpTKSAkKExJQldFQlBERU1VWCkgJChMSUJXRUJQKQorJChESVJCSU4pXHZ3ZWJwX3NkbC5leGU6ICQoRElST0JKKVxleHRyYXNcdndlYnBfc2RsLm9iagorJChESVJCSU4pXHZ3ZWJwX3NkbC5leGU6ICQoRElST0JKKVxleHRyYXNcd2VicF90b19zZGwub2JqCiskKERJUkJJTilcdndlYnBfc2RsLmV4ZTogJChJTUFHRUlPX1VUSUxfT0JKUykgJChMSUJXRUJQKQorJChESVJCSU4pXHdlYnBtdXguZXhlOiAkKERJUk9CSilcZXhhbXBsZXNcd2VicG11eC5vYmogJChMSUJXRUJQTVVYKQorJChESVJCSU4pXHdlYnBtdXguZXhlOiAkKEVYX1VUSUxfT0JKUykgJChJTUFHRUlPX1VUSUxfT0JKUykgJChMSUJXRUJQKQorJChESVJCSU4pXGltZzJ3ZWJwLmV4ZTogJChESVJPQkopXGV4YW1wbGVzXGltZzJ3ZWJwLm9iaiAkKExJQldFQlBNVVgpCiskKERJUkJJTilcaW1nMndlYnAuZXhlOiAkKElNQUdFSU9fREVDX09CSlMpCiskKERJUkJJTilcaW1nMndlYnAuZXhlOiAkKEVYX1VUSUxfT0JKUykgJChJTUFHRUlPX1VUSUxfT0JKUykKKyQoRElSQklOKVxpbWcyd2VicC5leGU6ICQoTElCV0VCUERFTVVYKSAkKExJQldFQlApCiskKERJUkJJTilcZ2V0X2Rpc3RvLmV4ZTogJChESVJPQkopXGV4dHJhc1xnZXRfZGlzdG8ub2JqCiskKERJUkJJTilcZ2V0X2Rpc3RvLmV4ZTogJChJTUFHRUlPX0RFQ19PQkpTKSAkKElNQUdFSU9fVVRJTF9PQkpTKQorJChESVJCSU4pXGdldF9kaXN0by5leGU6ICQoTElCV0VCUERFTVVYKSAkKExJQldFQlApCiskKERJUkJJTilcd2VicF9xdWFsaXR5LmV4ZTogJChESVJPQkopXGV4dHJhc1x3ZWJwX3F1YWxpdHkub2JqCiskKERJUkJJTilcd2VicF9xdWFsaXR5LmV4ZTogJChJTUFHRUlPX1VUSUxfT0JKUykKKyQoRElSQklOKVx3ZWJwX3F1YWxpdHkuZXhlOiAkKEVYVFJBU19PQkpTKSAkKExJQldFQlApCiskKERJUkJJTilcd2VicGluZm8uZXhlOiAkKERJUk9CSilcZXhhbXBsZXNcd2VicGluZm8ub2JqCiskKERJUkJJTilcd2VicGluZm8uZXhlOiAkKElNQUdFSU9fREVDX09CSlMpCiskKERJUkJJTilcd2VicGluZm8uZXhlOiAkKEVYX1VUSUxfT0JKUykgJChJTUFHRUlPX1VUSUxfT0JKUykKKyQoRElSQklOKVx3ZWJwaW5mby5leGU6ICQoTElCV0VCUERFTVVYKSAkKExJQldFQlApCisKKyQoT1VUX0VYQU1QTEVTKTogJChFWF9VVElMX09CSlMpICQoTElCV0VCUCkKKyQoRVhfVVRJTF9PQkpTKSAkKElNQUdFSU9fVVRJTF9PQkpTKTogJChPVVRQVVRfRElSUykKKyQoSU1BR0VJT19ERUNfT0JKUykgJChJTUFHRUlPX0VOQ19PQkpTKSAkKEVYVFJBU19PQkpTKTogJChPVVRQVVRfRElSUykKKyFFTkRJRiAgIyBBUkNIID09IEFSTQorCiskKExJQldFQlBERUNPREVSKTogJChMSUJXRUJQREVDT0RFUl9PQkpTKQorJChMSUJXRUJQKTogJChMSUJXRUJQX09CSlMpCiskKExJQldFQlBNVVgpOiAkKExJQldFQlBNVVhfT0JKUykKKyQoTElCV0VCUERFTVVYKTogJChMSUJXRUJQREVNVVhfT0JKUykKKworJChMSUJXRUJQX09CSlMpICQoTElCV0VCUE1VWF9PQkpTKSAkKExJQldFQlBERU1VWF9PQkpTKTogJChPVVRQVVRfRElSUykKKworIUlGICIkKERMTEJVSUxEKSIgPT0gIlRSVUUiCiskKExJQldFQlBfT0JKUykgJChMSUJXRUJQTVVYX09CSlMpICQoTElCV0VCUERFTVVYX09CSlMpOiBcCisgICAgJChESVJPQkopXCQoRExMSU5DKQorCit7JChESVJPQkopfS5jeyQoRElST0JKKX0ub2JqOgorCSQoQ0MpICQoQ0ZMQUdTKSAvRmQkKExJQldFQlBfUERCTkFNRSkgL0ZvJEAgICQ8CisKK3tzcmN9LnJjeyQoRElST0JKKX0ucmVzOgorCSQoUkMpIC9mbyRAICQ8Cit7c3JjXGRlbXV4fS5yY3skKERJUk9CSilcZGVtdXh9LnJlczoKKwkkKFJDKSAvZm8kQCAkPAore3NyY1xtdXh9LnJjeyQoRElST0JKKVxtdXh9LnJlczoKKwkkKFJDKSAvZm8kQCAkPAorCiskKExJQldFQlApOiAkKERJUk9CSilcJChMSUJXRUJQX0JBU0VOQU1FOl9kZWJ1Zz0pLnJlcworJChMSUJXRUJQREVDT0RFUik6ICQoRElST0JKKVwkKExJQldFQlBERUNPREVSX0JBU0VOQU1FOl9kZWJ1Zz0pLnJlcworJChMSUJXRUJQTVVYKTogJChMSUJXRUJQKSAkKERJUk9CSilcbXV4XCQoTElCV0VCUE1VWF9CQVNFTkFNRTpfZGVidWc9KS5yZXMKKyQoTElCV0VCUERFTVVYKTogJChMSUJXRUJQKSAkKERJUk9CSilcZGVtdXhcJChMSUJXRUJQREVNVVhfQkFTRU5BTUU6X2RlYnVnPSkucmVzCisKKyQoTElCV0VCUERFQ09ERVIpICQoTElCV0VCUCkgJChMSUJXRUJQTVVYKSAkKExJQldFQlBERU1VWCk6CisJJChMTktETEwpIC9vdXQ6JChESVJCSU4pXCQoQEI6X2RsbD0uZGxsKSAvaW1wbGliOiRAICQoTEZMQUdTKSAkKioKKwkteGNvcHkgJChESVJPQkopXCoucGRiICQoRElSTElCKSAveQorCitjbGVhbjo6CisJQC1lcmFzZSAvcyAkKERJUk9CSilcJChETExJTkMpIDI+IE5VTAorIUVMU0UKKyQoTElCV0VCUERFQ09ERVIpICQoTElCV0VCUCkgJChMSUJXRUJQTVVYKSAkKExJQldFQlBERU1VWCk6CisJJChMTktMSUIpIC9vdXQ6JEAgJCoqCisJLXhjb3B5ICQoRElST0JKKVwqLnBkYiAkKERJUkxJQikgL3kKKyFFTkRJRgorCiskKE9VVFBVVF9ESVJTKToKKwlAaWYgbm90IGV4aXN0ICIkKEApIiBta2RpciAiJChAKSIKKworIyBnZW5lcmF0ZSBhIGhlbHBlciBpbmNsdWRlIHRvIGRlZmluZSBXRUJQX0VYVEVSTiBzdWl0YWJsZSBmb3IgdGhlIERMTCBidWlsZAorJChESVJPQkopXCQoRExMSU5DKToKKwlAZWNobyAjaWZuZGVmIFdFQlBfRExMX0hfID4gJEAKKwlAZWNobyAjZGVmaW5lIFdFQlBfRExMX0hfID4+ICRACisJQGVjaG8gI2RlZmluZSBXRUJQX0VYVEVSTiBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgPj4gJEAKKwlAZWNobyAjZW5kaWYgIC8qIFdFQlBfRExMX0hfICovID4+ICRACisKKy5TVUZGSVhFUzogLmMgLm9iaiAucmVzIC5leGUKKyMgRmlsZS1zcGVjaWZpYyBmbGFnIGJ1aWxkcy4gTm90ZSBiYXRjaCBydWxlcyB0YWtlIHByZWNlZGVuY2Ugb3ZlciB3aWxkY2FyZHMsCisjIHNvIGZvciBub3cgbmFtZSBlYWNoIGZpbGUgaW5kaXZpZHVhbGx5LgorJChESVJPQkopXGRzcFxlbmNfYXZ4Mi5vYmo6IHNyY1xkc3BcZW5jX2F2eDIuYworCSQoQ0MpICQoQ0ZMQUdTKSAkKEFWWDJfRkxBR1MpIC9GZCQoTElCV0VCUF9QREJOQU1FKSAvRm8kKERJUk9CSilcZHNwXCBcCisJICBzcmNcZHNwXCQoQEIpLmMKKyQoRElST0JKKVxleGFtcGxlc1xhbmltX2RpZmYub2JqOiBleGFtcGxlc1xhbmltX2RpZmYuYworCSQoQ0MpICQoQ0ZMQUdTKSAvRFdFQlBfSEFWRV9HSUYgL0ZkJChMSUJXRUJQX1BEQk5BTUUpIFwKKwkgIC9GbyQoRElST0JKKVxleGFtcGxlc1wgZXhhbXBsZXNcJChAQikuYworJChESVJPQkopXGV4YW1wbGVzXGFuaW1fZHVtcC5vYmo6IGV4YW1wbGVzXGFuaW1fZHVtcC5jCisJJChDQykgJChDRkxBR1MpIC9EV0VCUF9IQVZFX0dJRiAvRmQkKExJQldFQlBfUERCTkFNRSkgXAorCSAgL0ZvJChESVJPQkopXGV4YW1wbGVzXCBleGFtcGxlc1wkKEBCKS5jCiskKERJUk9CSilcZXhhbXBsZXNcYW5pbV91dGlsLm9iajogZXhhbXBsZXNcYW5pbV91dGlsLmMKKwkkKENDKSAkKENGTEFHUykgL0RXRUJQX0hBVkVfR0lGIC9GZCQoTElCV0VCUF9QREJOQU1FKSBcCisJICAvRm8kKERJUk9CSilcZXhhbXBsZXNcIGV4YW1wbGVzXCQoQEIpLmMKKyQoRElST0JKKVxleGFtcGxlc1xnaWYyd2VicC5vYmo6IGV4YW1wbGVzXGdpZjJ3ZWJwLmMKKwkkKENDKSAkKENGTEFHUykgL0RXRUJQX0hBVkVfR0lGIC9GZCQoTElCV0VCUF9QREJOQU1FKSBcCisJICAvRm8kKERJUk9CSilcZXhhbXBsZXNcIGV4YW1wbGVzXCQoQEIpLmMKKyQoRElST0JKKVxleGFtcGxlc1xnaWZkZWMub2JqOiBleGFtcGxlc1xnaWZkZWMuYworCSQoQ0MpICQoQ0ZMQUdTKSAvRFdFQlBfSEFWRV9HSUYgL0ZkJChMSUJXRUJQX1BEQk5BTUUpIFwKKwkgIC9GbyQoRElST0JKKVxleGFtcGxlc1wgZXhhbXBsZXNcJChAQikuYworIyBCYXRjaCBydWxlcwore2V4YW1wbGVzfS5jeyQoRElST0JKKVxleGFtcGxlc30ub2JqOjoKKwkkKENDKSAkKENGTEFHUykgL0ZkJChESVJPQkopXGV4YW1wbGVzXCAvRm8kKERJUk9CSilcZXhhbXBsZXNcICQ8Cit7ZXh0cmFzfS5jeyQoRElST0JKKVxleHRyYXN9Lm9iajo6CisJJChDQykgJChDRkxBR1MpIC9GZCQoRElST0JKKVxleHRyYXNcIC9GbyQoRElST0JKKVxleHRyYXNcICQ8Cit7aW1hZ2Vpb30uY3skKERJUk9CSilcaW1hZ2Vpb30ub2JqOjoKKwkkKENDKSAkKENGTEFHUykgL0ZkJChESVJPQkopXGltYWdlaW9cIC9GbyQoRElST0JKKVxpbWFnZWlvXCAkPAore3NyY1xkZWN9LmN7JChESVJPQkopXGRlY30ub2JqOjoKKwkkKENDKSAkKENGTEFHUykgL0ZkJChMSUJXRUJQX1BEQk5BTUUpIC9GbyQoRElST0JKKVxkZWNcICQ8Cit7c3JjXGRlbXV4fS5jeyQoRElST0JKKVxkZW11eH0ub2JqOjoKKwkkKENDKSAkKENGTEFHUykgL0ZkJChMSUJXRUJQX1BEQk5BTUUpIC9GbyQoRElST0JKKVxkZW11eFwgJDwKK3tzcmNcZHNwfS5jeyQoRElST0JKKVxkc3B9Lm9iajo6CisJJChDQykgJChDRkxBR1MpIC9GZCQoTElCV0VCUF9QREJOQU1FKSAvRm8kKERJUk9CSilcZHNwXCAkPAore3NyY1xlbmN9LmN7JChESVJPQkopXGVuY30ub2JqOjoKKwkkKENDKSAkKENGTEFHUykgL0ZkJChMSUJXRUJQX1BEQk5BTUUpIC9GbyQoRElST0JKKVxlbmNcICQ8Cit7c3JjXG11eH0uY3skKERJUk9CSilcbXV4fS5vYmo6OgorCSQoQ0MpICQoQ0ZMQUdTKSAvRmQkKExJQldFQlBfUERCTkFNRSkgL0ZvJChESVJPQkopXG11eFwgJDwKK3tzcmNcdXRpbHN9LmN7JChESVJPQkopXHV0aWxzfS5vYmo6OgorCSQoQ0MpICQoQ0ZMQUdTKSAvRmQkKExJQldFQlBfUERCTkFNRSkgL0ZvJChESVJPQkopXHV0aWxzXCAkPAorCit7JChESVJPQkopXGV4YW1wbGVzfS5vYmp7JChESVJCSU4pfS5leGU6CisJJChMTktFWEUpICQoTERGTEFHUykgL09VVDokQCAkKiogXAorCSAgICBvbGUzMi5saWIgd2luZG93c2NvZGVjcy5saWIgc2hsd2FwaS5saWIKKwkkKE1UKSAtbWFuaWZlc3QgJEAubWFuaWZlc3QgLW91dHB1dHJlc291cmNlOiRAOzEKKwlkZWwgJEAubWFuaWZlc3QKKworeyQoRElST0JKKVxleHRyYXN9Lm9ianskKERJUkJJTil9LmV4ZToKKwkkKExOS0VYRSkgJChMREZMQUdTKSAvT1VUOiRAICQqKiBcCisJICAgIG9sZTMyLmxpYiB3aW5kb3dzY29kZWNzLmxpYiBzaGx3YXBpLmxpYgorCSQoTVQpIC1tYW5pZmVzdCAkQC5tYW5pZmVzdCAtb3V0cHV0cmVzb3VyY2U6JEA7MQorCWRlbCAkQC5tYW5pZmVzdAorCitjbGVhbjo6CisJQC1lcmFzZSAvcyAkKERJUk9CSilcKi5kbGwgMj4gTlVMCisJQC1lcmFzZSAvcyAkKERJUk9CSilcKi5leHAgMj4gTlVMCisJQC1lcmFzZSAvcyAkKERJUk9CSilcKi5pZGIgMj4gTlVMCisJQC1lcmFzZSAvcyAkKERJUk9CSilcKi5saWIgMj4gTlVMCisJQC1lcmFzZSAvcyAkKERJUk9CSilcKi5vYmogMj4gTlVMCisJQC1lcmFzZSAvcyAkKERJUk9CSilcKi5wY2ggMj4gTlVMCisJQC1lcmFzZSAvcyAkKERJUk9CSilcKi5wZGIgMj4gTlVMCisJQC1lcmFzZSAvcyAkKERJUk9CSilcKi5yZXMgMj4gTlVMCisKKyFFTkRJRiAgIyBFbmQgb2YgY2FzZSB3aGVyZSBhIGNvbmZpZyB3YXMgcHJvdmlkZWQuCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9ORVdTIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvTkVXUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODBjYjdkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvTkVXUwpAQCAtMCwwICsxLDE5OSBAQAorLSA0LzIvMjAxODogdmVyc2lvbiAxLjAuMAorICBUaGlzIGlzIGEgYmluYXJ5IGNvbXBhdGlibGUgcmVsZWFzZS4KKyAgKiBsb3NzeSBlbmNvZGVyIGltcHJvdmVtZW50cyB0byBhdm9pZCBjaHJvbWEgc2hpZnRzIGluIHZhcmlvdXMgY2lyY3Vtc3RhbmNlcworICAgIChpc3N1ZXMgIzMwOCwgIzM0MCkKKyAgKiBiaWctZW5kaWFuIGZpeGVzIGZvciBkZWNvZGUsIFJHQkEgaW1wb3J0IGFuZCBXZWJQUGljdHVyZURpc3RvcnRpb24KKyAgVG9vbCB1cGRhdGVzOgorICAgIGdpZndlYnAsIGFuaW1fZGlmZiAtIGRlZmF1bHQgZHVyYXRpb24gYmVoYXZpb3IgKDw9IDEwbXMpIGNoYW5nZWQgdG8gbWF0Y2gKKyAgICAgICAgICAgICAgICAgICAgICAgICB3ZWIgYnJvd3NlcnMsIHRyYW5zY29kaW5nIHRvb2xzIChpc3N1ZSAjMzc5KQorICAgIGltZzJ3ZWJwLCB3ZWJwbXV4IC0gYWxsb3cgb3B0aW9ucyB0byBiZSBwYXNzZWQgaW4gdmlhIGEgZmlsZSAoaXNzdWUgIzM1NSkKKworLSAxMS8yNC8yMDE3OiB2ZXJzaW9uIDAuNi4xCisgIFRoaXMgaXMgYSBiaW5hcnkgY29tcGF0aWJsZSByZWxlYXNlLgorICAqIGxvc3NsZXNzIHBlcmZvcm1hbmNlIGFuZCBjb21wcmVzc2lvbiBpbXByb3ZlbWVudHMgKyBhIG5ldyAnY3J1bmNoZXInIG1vZGUKKyAgICAoLW0gNiAtcSAxMDApCisgICogQVJNIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyB3aXRoIGNsYW5nICgxNS0yMCUgdy9uZGsgcjE1YywgaXNzdWUgIzMzOSkKKyAgKiB3ZWJwLWpzOiBlbXNjcmlwdGVuL3dlYmFzc2VtYmx5IGJhc2VkIGphdmFzY3JpcHQgZGVjb2RlcgorICAqIG1pc2NlbGxhbmVvdXMgYnVnICYgYnVpbGQgZml4ZXMgKGlzc3VlICMzMjksICMzMzIsICMzNDMsICMzNTMsICMzNjAsICMzNjEsCisgICAgIzM2MykKKyAgVG9vbCB1cGRhdGVzIC8gYWRkaXRpb25zOgorICAgIGFkZGVkIHdlYnBpbmZvIC0gcHJpbnRzIGZpbGUgZm9ybWF0IGluZm9ybWF0aW9uIChpc3N1ZSAjMzMwKQorICAgIGdpZjJ3ZWJwIC0gbG9vcCBiZWhhdmlvciBtb2RpZmllZCB0byBtYXRjaCBDaHJvbWUgTTYzKyAoY3JidWcuY29tLzY0OTI2NCk7CisgICAgICAgICAgICAgICAnLWxvb3BfY29tcGF0aWJpbGl0eScgY2FuIGJlIHVzZWQgZm9yIHRoZSBvbGQgYmVoYXZpb3IKKworLSAxLzI2LzIwMTc6IHZlcnNpb24gMC42LjAKKyAgKiBsb3NzbGVzcyBwZXJmb3JtYW5jZSBhbmQgY29tcHJlc3Npb24gaW1wcm92ZW1lbnRzCisgICogbWlzY2VsbGFuZW91cyBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMgKFNTRTIsIE5FT04sIE1TQSkKKyAgKiB3ZWJwbXV4IGdhaW5lZCBhIC1kdXJhdGlvbiBvcHRpb24gYWxsb3dpbmcgZm9yIGZyYW1lIHRpbWluZyBtb2RpZmljYXRpb24KKyAgKiBuZXcgaW1nMndlYnAgdXRpbGl0eSBhbGxvd2luZyBhIHNlcXVlbmNlIG9mIGltYWdlcyB0byBiZSBjb252ZXJ0ZWQgdG8KKyAgICBhbmltYXRlZCB3ZWJwCisgICogQVBJIGNoYW5nZXM6CisgICAgLSBsaWJ3ZWJwOgorICAgICAgV2ViUFBpY3R1cmVTaGFycEFSR0JUb1lVVkEKKyAgICAgIFdlYlBQbGFuZURpc3RvcnRpb24KKyAgICAtIGxpYndlYnBtdXggLyBnaWYyd2VicDoKKyAgICAgIFdlYlBBbmltRW5jb2Rlck9wdGlvbnM6IGttYXggPD0gMCBub3cgZGlzYWJsZXMga2V5ZnJhbWVzLCBrbWF4ID09IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlcyBhbGwga2V5ZnJhbWVzLiBTZWUgbXV4LmggYW5kIHRoZSBnaWYyd2VicAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFucGFnZSBmb3IgZGV0YWlscy4KKworLSAxMi8xMy8yMDE2OiB2ZXJzaW9uIDAuNS4yCisgIFRoaXMgaXMgYSBiaW5hcnkgY29tcGF0aWJsZSByZWxlYXNlLgorICBUaGlzIHJlbGVhc2UgY292ZXJzIENWRS0yMDE2LTg4ODggYW5kIENWRS0yMDE2LTkwODUuCisgICogZnVydGhlciBzZWN1cml0eSByZWxhdGVkIGhhcmRlbmluZyBpbiB0aGUgdG9vbHM7IGZpeGVzIHRvCisgICAgZ2lmMndlYnAvQW5pbUVuY29kZXIgKGlzc3VlcyAjMzEwLCAjMzE0LCAjMzE2LCAjMzIyKSwgY3dlYnAvbGlid2VicCAoaXNzdWUKKyAgICAjMzEyKQorICAqIGZ1bGwgbGlid2VicCAoZW5jb2RlciAmIGRlY29kZXIpIGlPUyBmcmFtZXdvcms7IGxpYndlYnBkZWNvZGVyCisgICAgV2ViUC5mcmFtZXdvcmsgcmVuYW1lZCB0byBXZWJQRGVjb2Rlci5mcmFtZXdvcmsgKGlzc3VlICMzMDcpCisgICogQ01ha2Ugc3VwcG9ydCBmb3IgQW5kcm9pZCBTdHVkaW8gKDIuMikKKyAgKiBtaXNjZWxsYW5lb3VzIGJ1aWxkIHJlbGF0ZWQgZml4ZXMgKGlzc3VlICMzMDYsICMzMTMpCisgICogbWlzY2VsbGFuZW91cyBkb2N1bWVudGF0aW9uIGltcHJvdmVtZW50cyAoaXNzdWUgIzIyNSkKKyAgKiBtaW5vciBsb3NzeSBlbmNvZGVyIGZpeGVzIGFuZCBpbXByb3ZlbWVudHMKKworLSA2LzE0LzIwMTY6IHZlcnNpb24gMC41LjEKKyAgVGhpcyBpcyBhIGJpbmFyeSBjb21wYXRpYmxlIHJlbGVhc2UuCisgICogbWlzY2VsbGFuZW91cyBidWcgZml4ZXMgKGlzc3VlcyAjMjgwLCAjMjg5KQorICAqIHJldmVydGVkIGFscGhhIHBsYW5lIGVuY29kaW5nIHdpdGggY29sb3IgY2FjaGUgZm9yIGNvbXBhdGliaWxpdHkgd2l0aAorICAgIGxpYndlYnAgMC40LjAtPjAuNC4zIChpc3N1ZXMgIzI5MSwgIzI5OCkKKyAgKiBsb3NzbGVzcyBlbmNvZGluZyBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMKKyAgKiBtZW1vcnkgcmVkdWN0aW9uIGluIGJvdGggbG9zc2xlc3MgZW5jb2RpbmcgYW5kIGRlY29kaW5nCisgICogZm9yY2UgbXV4IG91dHB1dCB0byBiZSBpbiB0aGUgZXh0ZW5kZWQgZm9ybWF0IChWUDhYKSB3aGVuIHVuZGVmaW5lZCBjaHVua3MKKyAgICBhcmUgcHJlc2VudCAoaXNzdWUgIzI5NCkKKyAgKiBncmFkbGUsIGNtYWtlIGJ1aWxkIHN1cHBvcnQKKyAgKiB3b3JrYXJvdW5kIGZvciBjb21waWxlciBidWcgY2F1c2luZyA2NC1iaXQgZGVjb2RlIGZhaWx1cmVzIG9uIGFuZHJvaWQKKyAgICBkZXZpY2VzIHVzaW5nIGNsYW5nLTMuOCBpbiB0aGUgcjExYyBOREsKKyAgKiB2YXJpb3VzIFdlYlBBbmltRW5jb2RlciBpbXByb3ZlbWVudHMKKworLSAxMi8xNy8yMDE1OiB2ZXJzaW9uIDAuNS4wCisgICogbWlzY2VsbGFuZW91cyBidWcgJiBidWlsZCBmaXhlcyAoaXNzdWVzICMyMzQsICMyNTgsICMyNzQsICMyNzUsICMyNzgpCisgICogZW5jb2RlciAmIGRlY29kZXIgc3BlZWQtdXBzIG9uIHg4Ni9BUk0vTUlQUyBmb3IgbG9zc3kgJiBsb3NzbGVzcworICAgIC0gbm90ZSEgWVVWLT5SR0IgY29udmVyc2lvbiB3YXMgc3BlZC11cCwgYnV0IHRoZSByZXN1bHRzIHdpbGwgYmUgc2xpZ2h0bHkKKyAgICAgIGRpZmZlcmVudCBmcm9tIHByZXZpb3VzIHJlbGVhc2VzCisgICogdmFyaW91cyBsb3NzbGVzcyBlbmNvZGVyIGltcHJvdmVtZW50cworICAqIGdpZjJ3ZWJwIGltcHJvdmVtZW50cywgLW1pbl9zaXplIG9wdGlvbiBhZGRlZAorICAqIHRvb2xzIGZ1bGx5IHN1cHBvcnQgaW5wdXQgZnJvbSBzdGRpbiBhbmQgb3V0cHV0IHRvIHN0ZG91dCAoaXNzdWUgIzE2OCkKKyAgKiBOZXcgV2ViUEFuaW1FbmNvZGVyIEFQSSBmb3IgY3JlYXRpbmcgYW5pbWF0aW9ucworICAqIE5ldyBXZWJQQW5pbURlY29kZXIgQVBJIGZvciBkZWNvZGluZyBhbmltYXRpb25zCisgICogb3RoZXIgQVBJIGNoYW5nZXM6CisgICAgLSBsaWJ3ZWJwOgorICAgICAgV2ViUFBpY3R1cmVTbWFydEFSR0JUb1lVVkEoKSAoLXByZSA0IGluIGN3ZWJwKQorICAgICAgV2ViUENvbmZpZzo6ZXhhY3QgKC1leGFjdCBpbiBjd2VicDsgLWFscGhhX2NsZWFudXAgaXMgbm93IHRoZSBkZWZhdWx0KQorICAgICAgV2ViUENvbmZpZzo6bmVhcl9sb3NzbGVzcyAoLW5lYXJfbG9zc2xlc3MgaW4gY3dlYnApCisgICAgICBXZWJQRnJlZSgpIChmcmVlJ2luZyB3ZWJwIGFsbG9jYXRlZCBtZW1vcnkgaW4gb3RoZXIgbGFuZ3VhZ2VzKQorICAgICAgV2ViUENvbmZpZ0xvc3NsZXNzUHJlc2V0KCkKKyAgICAgIFdlYlBNZW1vcnlXcml0ZXJDbGVhcigpCisgICAgLSBsaWJ3ZWJwZGVtdXg6IHJlbW92ZWQgZXhwZXJpbWVudGFsIGZyYWdtZW50IHJlbGF0ZWQgZmllbGRzIGFuZCBmdW5jdGlvbnMKKyAgICAtIGxpYndlYnBtdXg6IFdlYlBNdXhTZXRDYW52YXNTaXplKCkKKyAgKiBuZXcgbGlid2VicGV4dHJhcyBsaWJyYXJ5IHdpdGggc29tZSB1bmNvbW1vbiBpbXBvcnQgZnVuY3Rpb25zOgorICAgIFdlYlBJbXBvcnRHcmF5L1dlYlBJbXBvcnRSR0I1NjUvV2ViUEltcG9ydFJHQjQ0NDQKKworLSAxMC8xNS8xNTogdmVyc2lvbiAwLjQuNAorICBUaGlzIGlzIGEgYmluYXJ5IGNvbXBhdGlibGUgcmVsZWFzZS4KKyAgKiByZXNjYWxpbmcgb3V0LW9mLWJvdW5kcyByZWFkIGZpeCAoaXNzdWUgIzI1NCkKKyAgKiB2YXJpb3VzIGJ1aWxkIGZpeGVzIGFuZCBpbXByb3ZlbWVudHMgKGlzc3VlcyAjMjUzLCAjMjU5LCAjMjYyLCAjMjY3LCAjMjY4KQorICAqIGNvbnRhaW5lciBkb2N1bWVudGF0aW9uIHVwZGF0ZQorICAqIGdpZjJ3ZWJwIHRyYW5zcGFyZW5jeSBmaXggKGlzc3VlICMyNDUpCisKKy0gMy8zLzE1OiB2ZXJzaW9uIDAuNC4zCisgIFRoaXMgaXMgYSBiaW5hcnkgY29tcGF0aWJsZSByZWxlYXNlLgorICAqIEFuZHJvaWQgLyBnY2MgLyBpT1MgLyBNU1ZTIGJ1aWxkIGZpeGVzIGFuZCBpbXByb3ZlbWVudHMKKyAgKiBsb3NzbGVzcyBkZWNvZGUgZml4IChpc3N1ZSAjMjM5IC0tIHNpbmNlIDAuNC4wKQorICAqIGRvY3VtZW50YXRpb24gLyB2d2VicCB1cGRhdGVzIGZvciBhbmltYXRpb24KKyAgKiBtdWx0aS10aHJlYWRpbmcgZml4IChpc3N1ZSAjMjM0KQorCistIDEwLzEzLzE0OiB2ZXJzaW9uIDAuNC4yCisgIFRoaXMgaXMgYSBiaW5hcnkgY29tcGF0aWJsZSByZWxlYXNlLgorICAqIEFuZHJvaWQgLyBnY2MgYnVpbGQgZml4ZXMKKyAgKiAoV2luZG93cykgZml4IHJlYWRpbmcgZnJvbSBzdGRpbiBhbmQgd3JpdGluZyB0byBzdGRvdXQKKyAgKiBnaWYyd2VicDogbWlzY2VsbGFuZW91cyBmaXhlcworICAqIGZpeCAnYWxwaGEtbGVhaycgd2l0aCBsb3NzeSBjb21wcmVzc2lvbiAoaXNzdWUgIzIyMCkKKyAgKiB0aGUgbG9zc2xlc3MgYml0c3RyZWFtIHNwZWMgaGFzIGJlZW4gYW1lbmRlZCB0byByZWZsZWN0IHRoZSBjdXJyZW50IGNvZGUKKworLSA3LzI0LzE0OiB2ZXJzaW9uIDAuNC4xCisgIFRoaXMgaXMgYSBiaW5hcnkgY29tcGF0aWJsZSByZWxlYXNlLgorICAqIEFBcmNoNjQgKGFybTY0KSAmIE1JUFMgc3VwcG9ydC9vcHRpbWl6YXRpb25zCisgICogTkVPTiBhc3NlbWJseSBhZGRpdGlvbnM6CisgICAgLSB+MjUlIGZhc3RlciBsb3NzeSBkZWNvZGUgLyBlbmNvZGUgKC1tIDQpCisgICAgLSB+MTAlIGZhc3RlciBsb3NzbGVzcyBkZWNvZGUKKyAgICAtIH41LTEwJSBmYXN0ZXIgbG9zc2xlc3MgZW5jb2RlICgtbSAzLzQpCisgICogZHdlYnAvdndlYnAgY2FuIHJlYWQgZnJvbSBzdGRpbgorICAqIGN3ZWJwL2dpZjJ3ZWJwIGNhbiB3cml0ZSB0byBzdGRvdXQKKyAgKiBjd2VicCBjYW4gcmVhZCB3ZWJwIGZpbGVzOyB1c2VmdWwgaWYgc3RvcmluZyBzb3VyY2VzIGFzIHdlYnAgbG9zc2xlc3MKKworLSAxMi8xOS8xMzogdmVyc2lvbiAwLjQuMAorICAqIGltcHJvdmVkIGdpZjJ3ZWJwIHRvb2wKKyAgKiBudW1lcm91cyBmaXhlcywgY29tcHJlc3Npb24gaW1wcm92ZW1lbnQgYW5kIHNwZWVkLXVwCisgICogZGl0aGVyIG9wdGlvbiBhZGRlZCB0byBkZWNvZGVyIChkd2VicCAtZGl0aGVyIDUwIC4uLikKKyAgKiBpbXByb3ZlZCBtdWx0aS10aHJlYWRlZCBtb2RlcyAoLW10IG9wdGlvbikKKyAgKiBpbXByb3ZlZCBmaWx0ZXJpbmcgc3RyZW5ndGggZGV0ZXJtaW5hdGlvbgorICAqIE5ldyBmdW5jdGlvbjogV2ViUE11eEdldENhbnZhc1NpemUKKyAgKiBCTVAgYW5kIFRJRkYgZm9ybWF0IG91dHB1dCBhZGRlZCB0byAnZHdlYnAnCisgICogU2lnbmlmaWNhbnQgbWVtb3J5IHJlZHVjdGlvbiBmb3IgZGVjb2RpbmcgbG9zc3kgaW1hZ2VzIHdpdGggYWxwaGEuCisgICogSW50ZXJ0d2luZWQgZGVjb2Rpbmcgb2YgUkdCIGFuZCBhbHBoYSBmb3IgYSBzaG9ydGVyCisgICAgdGltZS10by1maXJzdC1kZWNvZGVkLXBpeGVsLgorICAqIFdlYlBJdGVyYXRvciBoYXMgYSBuZXcgbWVtYmVyICdoYXNfYWxwaGEnIGRlbm90aW5nIHdoZXRoZXIgdGhlIGZyYW1lCisgICAgY29udGFpbnMgdHJhbnNwYXJlbmN5LgorICAqIENvbnRhaW5lciBzcGVjIGFtZW5kZWQgd2l0aCBuZXcgJ2JsZW5kaW5nIG1ldGhvZCcgZm9yIGFuaW1hdGlvbi4KKworLSA2LzEzLzEzOiB2ZXJzaW9uIDAuMy4xCisgIFRoaXMgaXMgYSBiaW5hcnkgY29tcGF0aWJsZSByZWxlYXNlLgorICAqIEFkZCBpbmNyZW1lbnRhbCBkZWNvZGluZyBzdXBwb3J0IGZvciBpbWFnZXMgY29udGFpbmluZyBBTFBIIGFuZCBJQ0NQIGNodW5rcy4KKyAgKiBQeXRob24gYmluZGluZ3MgdmlhIHN3aWcgZm9yIHRoZSBzaW1wbGUgZW5jb2RlL2RlY29kZSBpbnRlcmZhY2VzIHNpbWlsYXIgdG8KKyAgICBKYXZhLgorCistIDMvMjAvMTM6IHZlcnNpb24gMC4zLjAKKyAgVGhpcyBpcyBhIGJpbmFyeSBjb21wYXRpYmxlIHJlbGVhc2UuCisgICogV2ViUElOZXdSR0IvV2ViUElOZXdZVVZBIGFjY2VwdCBiZWluZyBwYXNzZWQgYSBOVUxMIG91dHB1dCBidWZmZXIKKyAgICBhbmQgd2lsbCBwZXJmb3JtIGF1dG8tYWxsb2NhdGlvbi4KKyAgKiBkZWZhdWx0IGZpbHRlciBvcHRpb24gaXMgbm93ICctc3Ryb25nIC1mIDYwJworICAqIGVuY29kaW5nIHNwZWVkLXVwIGZvciBsb3NzeSBtZXRob2RzIDMgdG8gNgorICAqIGFscGhhIGVuY29kaW5nIGNhbiBiZSBkb25lIGluIHBhcmFsbGVsIHRvIGxvc3N5IHVzaW5nICdjd2VicCAtbXQgLi4uJworICAqIGNvbG9yIHByb2ZpbGUsIG1ldGFkYXRhIChYTVAvRVhJRikgYW5kIGFuaW1hdGlvbiBzdXBwb3J0IGZpbmFsaXplZCBpbiB0aGUKKyAgICBjb250YWluZXIuCisgICogdmFyaW91cyBORU9OIGFzc2VtYmx5IGFkZGl0aW9ucworICBUb29sIHVwZGF0ZXMgLyBhZGRpdGlvbnM6CisgICAgKiBnaWYyd2VicCBhZGRlZAorICAgICogdndlYnAgZ2l2ZW4gY29sb3IgcHJvZmlsZSAmIGFuaW1hdGlvbiBzdXBwb3J0CisgICAgKiBjd2VicCBjYW4gcHJlc2VydmUgY29sb3IgcHJvZmlsZSAvIG1ldGFkYXRhIHdpdGggJy1tZXRhZGF0YScKKworLSAxMC8zMC8xMjogdmVyc2lvbiAwLjIuMQorICAqIFZhcmlvdXMgc2VjdXJpdHkgcmVsYXRlZCBmaXhlcworICAqIGN3ZWJwLmV4ZTogZml4IGltcG9ydCBlcnJvcnMgb24gV2luZG93cyBYUAorICAqIGVuYWJsZSBETEwgYnVpbGRzIGZvciBtaW5ndyB0YXJnZXRzCisKKy0gOC8zLzEyOiB2ZXJzaW9uIDAuMi4wCisgICogQWRkIHN1cHBvcnQgZm9yIEFSR0IgLT4gWVVWQSBjb252ZXJzaW9uIGZvciBsb3NzbGVzcyBkZWNvZGVyCisgICAgTmV3IGZ1bmN0aW9uczogV2ViUElOZXdZVVZBLCBXZWJQSURlY0dldFlVVkEKKyAgKiBBZGQgc3RhdHMgZm9yIGxvc3NsZXNzIGFuZCBhbHBoYSBlbmNvZGluZworICAqIFNlY3VyaXR5IHJlbGF0ZWQgaGFyZGVuaW5nOiBhbGxvY2F0aW9uIGFuZCBzaXplIGNoZWNrcworICAqIEFkZCBQQU0gb3V0cHV0IHN1cHBvcnQgdG8gZHdlYnAKKworLSA3LzE5LzEyOiB2ZXJzaW9uIDAuMS45OQorICAqIFRoaXMgaXMgYSBwcmUtcmVsZWFzZSBvZiAwLjIuMCwgbm90IGFuIHJjIHRvIGFsbG93IGZvciBmdXJ0aGVyCisgICAgaW5jb21wYXRpYmxlIGNoYW5nZXMgYmFzZWQgb24gdXNlciBmZWVkYmFjay4KKyAgKiBBbHBoYSBjaGFubmVsIGVuY29kZS9kZWNvZGUgc3VwcG9ydC4KKyAgKiBMb3NzbGVzcyBlbmNvZGVyL2RlY29kZXIuCisgICogQWRkIFRJRkYgaW5wdXQgc3VwcG9ydCB0byBjd2VicC4KKyAgSW5jb21wYXRpYmxlIGNoYW5nZXM6CisgICAgKiBUaGUgZW5jb2RlIEFCSSBoYXMgYmVlbiBtb2RpZmllZCB0byBzdXBwb3J0IGFscGhhIGVuY29kaW5nLgorICAgICogRGVwcmVjYXRlZCBmdW5jdGlvbiBXZWJQSU5ldygpIGhhcyBiZWVuIHJlbW92ZWQuCisgICAgKiBEZWNvZGUgZnVuY3Rpb24gc2lnbmF0dXJlcyBoYXZlIGNoYW5nZWQgdG8gY29uc2lzdGVudGx5IHVzZSBzaXplX3Qgb3ZlcgorICAgICAgaW50L3VpbnQzMl90LgorICAgICogZGVjb2RlX3ZwOC5oIGlzIG5vIGxvbmdlciBpbnN0YWxsZWQgc3lzdGVtLXdpZGUuCisgICAgKiBjd2VicCB3aWxsIGVuY29kZSB0aGUgYWxwaGEgY2hhbm5lbCBpZiBwcmVzZW50LgorCistIDkvMTkvMTE6IHZlcnNpb24gMC4xLjMKKyAgKiBBZHZhbmNlZCBkZWNvZGluZyBBUElzLgorICAqIE9uLXRoZS1mbHkgY3JvcHBpbmcgYW5kIHJlc2NhbGluZyBvZiBpbWFnZXMuCisgICogU1NFMiBpbnN0cnVjdGlvbnMgZm9yIGRlY29kaW5nIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnMgb24geDg2IGJhc2VkCisgICAgcGxhdGZvcm1zLgorICAqIFN1cHBvcnQgTXVsdGktdGhyZWFkZWQgZGVjb2RpbmcuCisgICogNDAlIGltcHJvdmVtZW50IGluIERlY29kaW5nIHBlcmZvcm1hbmNlLgorICAqIEFkZCBzdXBwb3J0IGZvciBSR0I1NjUsIFJHQkE0NDQ0ICYgQVJHQiBpbWFnZSBjb2xvcnNwYWNlLgorICAqIEJldHRlciBoYW5kbGluZyBvZiBsYXJnZSBwaWN0dXJlIGVuY29kaW5nLgorCistIDMvMjUvMTE6IHZlcnNpb24gMC4xLjIKKyAgKiBJbmNyZW1lbnRhbCBkZWNvZGluZzogcGljdHVyZSBjYW4gYmUgZGVjb2RlZCBieXRlLWJ5LWJ5dGUgaWYgbmVlZHMgYmUuCisgICogbG90IG9mIGJ1Zy1maXhlcywgY29uc29saWRhdGlvbiBhbmQgc3RhYmlsaXphdGlvbgorCistIDIvMjMvMTE6IGluaXRpYWwgcmVsZWFzZSBvZiB2ZXJzaW9uIDAuMSwgd2l0aCB0aGUgbmV3IGVuY29kZXIKKy0gOS8zMC8xMDogaW5pdGlhbCByZWxlYXNlIHZlcnNpb24gd2l0aCBvbmx5IHRoZSBsaWdodHdlaWdodCBkZWNvZGVyCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9QQVRFTlRTIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvUEFURU5UUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWVkZjYwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvUEFURU5UUwpAQCAtMCwwICsxLDIzIEBACitBZGRpdGlvbmFsIElQIFJpZ2h0cyBHcmFudCAoUGF0ZW50cykKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisiVGhlc2UgaW1wbGVtZW50YXRpb25zIiBtZWFucyB0aGUgY29weXJpZ2h0YWJsZSB3b3JrcyB0aGF0IGltcGxlbWVudCB0aGUgV2ViTQorY29kZWNzIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBXZWJNIFByb2plY3QuCisKK0dvb2dsZSBoZXJlYnkgZ3JhbnRzIHRvIHlvdSBhIHBlcnBldHVhbCwgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsCityb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8KK21ha2UsIGhhdmUgbWFkZSwgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIHRyYW5zZmVyLCBhbmQgb3RoZXJ3aXNlCitydW4sIG1vZGlmeSBhbmQgcHJvcGFnYXRlIHRoZSBjb250ZW50cyBvZiB0aGVzZSBpbXBsZW1lbnRhdGlvbnMgb2YgV2ViTSwgd2hlcmUKK3N1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcywgYm90aCBjdXJyZW50bHkgb3duZWQgYnkKK0dvb2dsZSBhbmQgYWNxdWlyZWQgaW4gdGhlIGZ1dHVyZSwgbGljZW5zYWJsZSBieSBHb29nbGUgdGhhdCBhcmUgbmVjZXNzYXJpbHkKK2luZnJpbmdlZCBieSB0aGVzZSBpbXBsZW1lbnRhdGlvbnMgb2YgV2ViTS4gVGhpcyBncmFudCBkb2VzIG5vdCBpbmNsdWRlIGNsYWltcwordGhhdCB3b3VsZCBiZSBpbmZyaW5nZWQgb25seSBhcyBhIGNvbnNlcXVlbmNlIG9mIGZ1cnRoZXIgbW9kaWZpY2F0aW9uIG9mIHRoZXNlCitpbXBsZW1lbnRhdGlvbnMuIElmIHlvdSBvciB5b3VyIGFnZW50IG9yIGV4Y2x1c2l2ZSBsaWNlbnNlZSBpbnN0aXR1dGUgb3Igb3JkZXIKK29yIGFncmVlIHRvIHRoZSBpbnN0aXR1dGlvbiBvZiBwYXRlbnQgbGl0aWdhdGlvbiBvciBhbnkgb3RoZXIgcGF0ZW50CitlbmZvcmNlbWVudCBhY3Rpdml0eSBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yCitjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IGFueSBvZiB0aGVzZSBpbXBsZW1lbnRhdGlvbnMgb2YgV2ViTQorb3IgYW55IGNvZGUgaW5jb3Jwb3JhdGVkIHdpdGhpbiBhbnkgb2YgdGhlc2UgaW1wbGVtZW50YXRpb25zIG9mIFdlYk0KK2NvbnN0aXR1dGUgZGlyZWN0IG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCBvciBpbmR1Y2VtZW50IG9mCitwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgcmlnaHRzIGdyYW50ZWQgdG8geW91IHVuZGVyIHRoaXMgTGljZW5zZQorZm9yIHRoZXNlIGltcGxlbWVudGF0aW9ucyBvZiBXZWJNIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoCitsaXRpZ2F0aW9uIGlzIGZpbGVkLgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvUkVBRE1FIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NmIzNzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9SRUFETUUKQEAgLTAsMCArMSw3ODIgQEAKKyAgICAgICAgICBfXyAgIF9fICBfX19fICBfX19fICBfX19fCisgICAgICAgICAvICBcXC8gIFwvICBfIFwvICBfICkvICBfIFwKKyAgICAgICAgIFwgICAgICAgLyAgIF9fLyAgXyAgXCAgIF9fLworICAgICAgICAgIFxfX1xfXy9cX19fXy9cX19fX18vX18vIF9fX18gIF9fXworICAgICAgICAgICAgICAgIC8gXy8gLyAgICBcICAgIFwgLyAgXyBcLyBfLworICAgICAgICAgICAgICAgLyAgXF8vICAgLyAvICAgXCBcICAgX18vICBcX18KKyAgICAgICAgICAgICAgIFxfX19fL19fX18vXF9fX19fL19fX19fL19fX18vdjEuMC4wCisKK0Rlc2NyaXB0aW9uOgorPT09PT09PT09PT09CisKK1dlYlAgY29kZWM6IGxpYnJhcnkgdG8gZW5jb2RlIGFuZCBkZWNvZGUgaW1hZ2VzIGluIFdlYlAgZm9ybWF0LiBUaGlzIHBhY2thZ2UKK2NvbnRhaW5zIHRoZSBsaWJyYXJ5IHRoYXQgY2FuIGJlIHVzZWQgaW4gb3RoZXIgcHJvZ3JhbXMgdG8gYWRkIFdlYlAgc3VwcG9ydCwKK2FzIHdlbGwgYXMgdGhlIGNvbW1hbmQgbGluZSB0b29scyAnY3dlYnAnIGFuZCAnZHdlYnAnLgorCitTZWUgaHR0cDovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9zcGVlZC93ZWJwCisKK1RoZSBsYXRlc3Qgc291cmNlIHRyZWUgaXMgYXZhaWxhYmxlIGF0CitodHRwczovL2Nocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vd2VibS9saWJ3ZWJwCisKK0l0IGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlIFdlYk0gcHJvamVjdC4KK1NlZSBodHRwOi8vd3d3LndlYm1wcm9qZWN0Lm9yZy9saWNlbnNlL3NvZnR3YXJlLyBvciB0aGUKKyJDT1BZSU5HIiBmaWxlIGZvciBkZXRhaWxzLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbAorcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZCBpbiB0aGUgZmlsZSBQQVRFTlRTLgorCitCdWlsZGluZzoKKz09PT09PT09PQorCitXaW5kb3dzIGJ1aWxkOgorLS0tLS0tLS0tLS0tLS0KKworQnkgcnVubmluZzoKKworICBubWFrZSAvZiBNYWtlZmlsZS52YyBDRkc9cmVsZWFzZS1zdGF0aWMgUlRMSUJDRkc9c3RhdGljIE9CSkRJUj1vdXRwdXQKKwordGhlIGRpcmVjdG9yeSBvdXRwdXRccmVsZWFzZS1zdGF0aWNcKHg2NHx4ODYpXGJpbiB3aWxsIGNvbnRhaW4gdGhlIHRvb2xzCitjd2VicC5leGUgYW5kIGR3ZWJwLmV4ZS4gVGhlIGRpcmVjdG9yeSBvdXRwdXRccmVsZWFzZS1zdGF0aWNcKHg2NHx4ODYpXGxpYiB3aWxsCitjb250YWluIHRoZSBsaWJ3ZWJwIHN0YXRpYyBsaWJyYXJ5LgorVGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgKHg4Ni94NjQpIGlzIGRldGVjdGVkIGJ5IE1ha2VmaWxlLnZjIGZyb20gdGhlIFZpc3VhbAorU3R1ZGlvIGNvbXBpbGVyIChjbC5leGUpIGF2YWlsYWJsZSBpbiB0aGUgc3lzdGVtIHBhdGguCisKK1VuaXggYnVpbGQgdXNpbmcgbWFrZWZpbGUudW5peDoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworT24gcGxhdGZvcm1zIHdpdGggR05VIHRvb2xzIGluc3RhbGxlZCAoZ2NjIGFuZCBtYWtlKSwgcnVubmluZworCisgIG1ha2UgLWYgbWFrZWZpbGUudW5peAorCit3aWxsIGJ1aWxkIHRoZSBiaW5hcmllcyBleGFtcGxlcy9jd2VicCBhbmQgZXhhbXBsZXMvZHdlYnAsIGFsb25nCit3aXRoIHRoZSBzdGF0aWMgbGlicmFyeSBzcmMvbGlid2VicC5hLiBObyBzeXN0ZW0td2lkZSBpbnN0YWxsYXRpb24KK2lzIHN1cHBsaWVkLCBhcyB0aGlzIGlzIGEgc2ltcGxlIGFsdGVybmF0aXZlIHRvIHRoZSBmdWxsIGluc3RhbGxhdGlvbgorc3lzdGVtIGJhc2VkIG9uIHRoZSBhdXRvY29uZiB0b29scyAoc2VlIGJlbG93KS4KK1BsZWFzZSByZWZlciB0byBtYWtlZmlsZS51bml4IGZvciBhZGRpdGlvbmFsIGRldGFpbHMgYW5kIGN1c3RvbWl6YXRpb25zLgorCitVc2luZyBhdXRvY29uZiB0b29sczoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUHJlcmVxdWlzaXRlczoKK0EgY29tcGlsZXIgKGUuZy4sIGdjYyksIG1ha2UsIGF1dG9jb25mLCBhdXRvbWFrZSwgbGlidG9vbC4KK09uIGEgRGViaWFuLWxpa2Ugc3lzdGVtIHRoZSBmb2xsb3dpbmcgc2hvdWxkIGluc3RhbGwgZXZlcnl0aGluZyB5b3UgbmVlZCBmb3IgYQorbWluaW1hbCBidWlsZDoKKyQgc3VkbyBhcHQtZ2V0IGluc3RhbGwgZ2NjIG1ha2UgYXV0b2NvbmYgYXV0b21ha2UgbGlidG9vbAorCitXaGVuIGJ1aWxkaW5nIGZyb20gZ2l0IHNvdXJjZXMsIHlvdSB3aWxsIG5lZWQgdG8gcnVuIGF1dG9nZW4uc2ggdG8gZ2VuZXJhdGUgdGhlCitjb25maWd1cmUgc2NyaXB0LgorCisuL2NvbmZpZ3VyZQorbWFrZQorbWFrZSBpbnN0YWxsCisKK3Nob3VsZCBiZSBhbGwgeW91IG5lZWQgdG8gaGF2ZSB0aGUgZm9sbG93aW5nIGZpbGVzCisKKy91c3IvbG9jYWwvaW5jbHVkZS93ZWJwL2RlY29kZS5oCisvdXNyL2xvY2FsL2luY2x1ZGUvd2VicC9lbmNvZGUuaAorL3Vzci9sb2NhbC9pbmNsdWRlL3dlYnAvdHlwZXMuaAorL3Vzci9sb2NhbC9saWIvbGlid2VicC4qCisvdXNyL2xvY2FsL2Jpbi9jd2VicAorL3Vzci9sb2NhbC9iaW4vZHdlYnAKKworaW5zdGFsbGVkLgorCitOb3RlOiBBIGRlY29kZS1vbmx5IGxpYnJhcnksIGxpYndlYnBkZWNvZGVyLCBpcyBhdmFpbGFibGUgdXNpbmcgdGhlCisnLS1lbmFibGUtbGlid2VicGRlY29kZXInIGZsYWcuIFRoZSBlbmNvZGUgbGlicmFyeSBpcyBidWlsdCBzZXBhcmF0ZWx5IGFuZCBjYW4KK2JlIGluc3RhbGxlZCBpbmRlcGVuZGVudGx5IHVzaW5nIGEgbWlub3IgbW9kaWZpY2F0aW9uIGluIHRoZSBjb3JyZXNwb25kaW5nCitNYWtlZmlsZS5hbSBjb25maWd1cmUgZmlsZXMgKHNlZSBjb21tZW50cyB0aGVyZSkuIFNlZSAnLi9jb25maWd1cmUgLS1oZWxwJyBmb3IKK21vcmUgb3B0aW9ucy4KKworQnVpbGRpbmcgZm9yIE1JUFMgTGludXg6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK01JUFMgTGludXggdG9vbGNoYWluIHN0YWJsZSBhdmFpbGFibGUgcmVsZWFzZXMgY2FuIGJlIGZvdW5kIGF0OgoraHR0cHM6Ly9jb21tdW5pdHkuaW1ndGVjLmNvbS9kZXZlbG9wZXJzL21pcHMvdG9vbHMvY29kZXNjYXBlLW1pcHMtc2RrL2F2YWlsYWJsZS1yZWxlYXNlcy8KKworIyBBZGQgdG9vbGNoYWluIHRvIFBBVEgKK2V4cG9ydCBQQVRIPSRQQVRIOi9wYXRoL3RvL3Rvb2xjaGFpbi9iaW4KKworIyAzMi1iaXQgYnVpbGQgZm9yIG1pcHMzMnI1IChwNTYwMCkKK0hPU1Q9bWlwcy1tdGktbGludXgtZ251CitNSVBTX0NGTEFHUz0iLU8zIC1taXBzMzJyNSAtbWFiaT0zMiAtbXR1bmU9cDU2MDAgLW1tc2EgLW1mcDY0IFwKKyAgLW1zY2hlZC13ZWlnaHQgLW1sb2FkLXN0b3JlLXBhaXJzIC1mUElFIgorTUlQU19MREZMQUdTPSItbWlwczMycjUgLW1hYmk9MzIgLW1tc2EgLW1mcDY0IC1waWUiCisKKyMgNjQtYml0IGJ1aWxkIGZvciBtaXBzNjRyNiAoaTY0MDApCitIT1NUPW1pcHMtaW1nLWxpbnV4LWdudQorTUlQU19DRkxBR1M9Ii1PMyAtbWlwczY0cjYgLW1hYmk9NjQgLW10dW5lPWk2NDAwIC1tbXNhIC1tZnA2NCBcCisgIC1tc2NoZWQtd2VpZ2h0IC1tbG9hZC1zdG9yZS1wYWlycyAtZlBJRSIKK01JUFNfTERGTEFHUz0iLW1pcHM2NHI2IC1tYWJpPTY0IC1tbXNhIC1tZnA2NCAtcGllIgorCisuL2NvbmZpZ3VyZSAtLWhvc3Q9JHtIT1NUfSAtLWJ1aWxkPWBjb25maWcuZ3Vlc3NgIFwKKyAgQ0M9IiR7SE9TVH0tZ2NjIC1FTCIgXAorICBDRkxBR1M9IiRNSVBTX0NGTEFHUyIgXAorICBMREZMQUdTPSIkTUlQU19MREZMQUdTIgorbWFrZQorbWFrZSBpbnN0YWxsCisKK0NNYWtlOgorLS0tLS0tCitXaXRoIENNYWtlLCB5b3UgY2FuIGNvbXBpbGUgbGlid2VicCwgY3dlYnAsIGR3ZWJwLCBnaWYyd2ViLCBpbWcyd2VicCwgd2VicGluZm8KK2FuZCB0aGUgSlMgYmluZGluZ3MuCisKK1ByZXJlcXVpc2l0ZXM6CitBIGNvbXBpbGVyIChlLmcuLCBnY2Mgd2l0aCBhdXRvdG9vbHMpIGFuZCBDTWFrZS4KK09uIGEgRGViaWFuLWxpa2Ugc3lzdGVtIHRoZSBmb2xsb3dpbmcgc2hvdWxkIGluc3RhbGwgZXZlcnl0aGluZyB5b3UgbmVlZCBmb3IgYQorbWluaW1hbCBidWlsZDoKKyQgc3VkbyBhcHQtZ2V0IGluc3RhbGwgYnVpbGQtZXNzZW50aWFsIGNtYWtlCisKK1doZW4gYnVpbGRpbmcgZnJvbSBnaXQgc291cmNlcywgeW91IHdpbGwgbmVlZCB0byBydW4gY21ha2UgdG8gZ2VuZXJhdGUgdGhlCittYWtlZmlsZXMuCisKK21rZGlyIGJ1aWxkICYmIGNkIGJ1aWxkICYmIGNtYWtlIC4uLworbWFrZQorbWFrZSBpbnN0YWxsCisKK0lmIHlvdSBhbHNvIHdhbnQgYW55IG9mIHRoZSBleGVjdXRhYmxlcywgeW91IHdpbGwgbmVlZCB0byBlbmFibGUgdGhlbSB0aHJvdWdoCitDTWFrZSwgZS5nLjoKKworY21ha2UgLURXRUJQX0JVSUxEX0NXRUJQPU9OIC1EV0VCUF9CVUlMRF9EV0VCUD1PTiAuLi8KKworb3IgdGhyb3VnaCB5b3VyIGZhdm9yaXRlIGludGVyZmFjZSAobGlrZSBjY21ha2Ugb3IgY21ha2UtcXQtZ3VpKS4KKworRmluYWxseSwgb25jZSBpbnN0YWxsZWQsIHlvdSBjYW4gYWxzbyB1c2UgV2ViUCBpbiB5b3VyIENNYWtlIHByb2plY3QgYnkgZG9pbmc6CisKK2ZpbmRfcGFja2FnZShXZWJQKQorCit3aGljaCB3aWxsIGRlZmluZSB0aGUgQ01ha2UgdmFyaWFibGVzIFdlYlBfSU5DTFVERV9ESVJTIGFuZCBXZWJQX0xJQlJBUklFUy4KKworR3JhZGxlOgorLS0tLS0tLQorVGhlIHN1cHBvcnQgZm9yIEdyYWRsZSBpcyBtaW5pbWFsOiBpdCBvbmx5IGhlbHBzIHlvdSBjb21waWxlIGxpYndlYnAsIGN3ZWJwIGFuZAorZHdlYnAgYW5kIHdlYnBtdXhfZXhhbXBsZS4KKworUHJlcmVxdWlzaXRlczoKK0EgY29tcGlsZXIgKGUuZy4sIGdjYyB3aXRoIGF1dG90b29scykgYW5kIGdyYWRsZS4KK09uIGEgRGViaWFuLWxpa2Ugc3lzdGVtIHRoZSBmb2xsb3dpbmcgc2hvdWxkIGluc3RhbGwgZXZlcnl0aGluZyB5b3UgbmVlZCBmb3IgYQorbWluaW1hbCBidWlsZDoKKyQgc3VkbyBhcHQtZ2V0IGluc3RhbGwgYnVpbGQtZXNzZW50aWFsIGdyYWRsZQorCitXaGVuIGJ1aWxkaW5nIGZyb20gZ2l0IHNvdXJjZXMsIHlvdSB3aWxsIG5lZWQgdG8gcnVuIHRoZSBHcmFkbGUgd3JhcHBlciB3aXRoIHRoZQorYXBwcm9wcmlhdGUgdGFyZ2V0LCBlLmcuIDoKKworLi9ncmFkbGV3IGJ1aWxkQWxsRXhlY3V0YWJsZXMKKworU1dJRyBiaW5kaW5nczoKKy0tLS0tLS0tLS0tLS0tCisKK1RvIGdlbmVyYXRlIGxhbmd1YWdlIGJpbmRpbmdzIGZyb20gc3dpZy9saWJ3ZWJwLnN3aWcgYXQgbGVhc3Qgc3dpZy0xLjMKKyhodHRwOi8vd3d3LnN3aWcub3JnKSBpcyByZXF1aXJlZC4KKworQ3VycmVudGx5IHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBtYXBwZWQ6CitEZWNvZGU6CisgIFdlYlBHZXREZWNvZGVyVmVyc2lvbgorICBXZWJQR2V0SW5mbworICBXZWJQRGVjb2RlUkdCQQorICBXZWJQRGVjb2RlQVJHQgorICBXZWJQRGVjb2RlQkdSQQorICBXZWJQRGVjb2RlQkdSCisgIFdlYlBEZWNvZGVSR0IKKworRW5jb2RlOgorICBXZWJQR2V0RW5jb2RlclZlcnNpb24KKyAgV2ViUEVuY29kZVJHQkEKKyAgV2ViUEVuY29kZUJHUkEKKyAgV2ViUEVuY29kZVJHQgorICBXZWJQRW5jb2RlQkdSCisgIFdlYlBFbmNvZGVMb3NzbGVzc1JHQkEKKyAgV2ViUEVuY29kZUxvc3NsZXNzQkdSQQorICBXZWJQRW5jb2RlTG9zc2xlc3NSR0IKKyAgV2ViUEVuY29kZUxvc3NsZXNzQkdSCisKK1NlZSBzd2lnL1JFQURNRSBmb3IgbW9yZSBkZXRhaWxlZCBidWlsZCBpbnN0cnVjdGlvbnMuCisKK0phdmEgYmluZGluZ3M6CisKK1RvIGJ1aWxkIHRoZSBzd2lnLWdlbmVyYXRlZCBKTkkgd3JhcHBlciBjb2RlIGF0IGxlYXN0IEpESy0xLjUgKG9yIGVxdWl2YWxlbnQpCitpcyBuZWNlc3NhcnkgZm9yIGVudW0gc3VwcG9ydC4gVGhlIG91dHB1dCBpcyBpbnRlbmRlZCB0byBiZSBhIHNoYXJlZCBvYmplY3QgLworRExMIHRoYXQgY2FuIGJlIGxvYWRlZCB2aWEgU3lzdGVtLmxvYWRMaWJyYXJ5KCJ3ZWJwX2puaSIpLgorCitQeXRob24gYmluZGluZ3M6CisKK1RvIGJ1aWxkIHRoZSBzd2lnLWdlbmVyYXRlZCBQeXRob24gZXh0ZW5zaW9uIGNvZGUgYXQgbGVhc3QgUHl0aG9uIDIuNiBpcworcmVxdWlyZWQuIFB5dGhvbiA8IDIuNiBtYXkgYnVpbGQgd2l0aCBzb21lIG1pbm9yIGNoYW5nZXMgdG8gbGlid2VicC5zd2lnIG9yIHRoZQorZ2VuZXJhdGVkIGNvZGUsIGJ1dCBpcyB1bnRlc3RlZC4KKworRW5jb2RpbmcgdG9vbDoKKz09PT09PT09PT09PT09CisKK1RoZSBleGFtcGxlcy8gZGlyZWN0b3J5IGNvbnRhaW5zIHRvb2xzIGZvciBlbmNvZGluZyAoY3dlYnApIGFuZAorZGVjb2RpbmcgKGR3ZWJwKSBpbWFnZXMuCisKK1RoZSBlYXNpZXN0IHVzZSBzaG91bGQgbG9vayBsaWtlOgorICBjd2VicCBpbnB1dC5wbmcgLXEgODAgLW8gb3V0cHV0LndlYnAKK3doaWNoIHdpbGwgY29udmVydCB0aGUgaW5wdXQgZmlsZSB0byBhIFdlYlAgZmlsZSB1c2luZyBhIHF1YWxpdHkgZmFjdG9yIG9mIDgwCitvbiBhIDAtPjEwMCBzY2FsZSAoMCBiZWluZyB0aGUgbG93ZXN0IHF1YWxpdHksIDEwMCBiZWluZyB0aGUgYmVzdC4gRGVmYXVsdAordmFsdWUgaXMgNzUpLgorWW91IG1pZ2h0IHdhbnQgdG8gdHJ5IHRoZSAtbG9zc2xlc3MgZmxhZyB0b28sIHdoaWNoIHdpbGwgY29tcHJlc3MgdGhlIHNvdXJjZQorKGluIFJHQkEgZm9ybWF0KSB3aXRob3V0IGFueSBsb3NzLiBUaGUgLXEgcXVhbGl0eSBwYXJhbWV0ZXIgd2lsbCBpbiB0aGlzIGNhc2UKK2NvbnRyb2wgdGhlIGFtb3VudCBvZiBwcm9jZXNzaW5nIHRpbWUgc3BlbnQgdHJ5aW5nIHRvIG1ha2UgdGhlIG91dHB1dCBmaWxlIGFzCitzbWFsbCBhcyBwb3NzaWJsZS4KKworQSBsb25nZXIgbGlzdCBvZiBvcHRpb25zIGlzIGF2YWlsYWJsZSB1c2luZyB0aGUgLWxvbmdoZWxwIGNvbW1hbmQgbGluZSBmbGFnOgorCis+IGN3ZWJwIC1sb25naGVscAorVXNhZ2U6CisgY3dlYnAgWy1wcmVzZXQgPC4uLj5dIFtvcHRpb25zXSBpbl9maWxlIFstbyBvdXRfZmlsZV0KKworSWYgaW5wdXQgc2l6ZSAoLXMpIGZvciBhbiBpbWFnZSBpcyBub3Qgc3BlY2lmaWVkLCBpdCBpcworYXNzdW1lZCB0byBiZSBhIFBORywgSlBFRywgVElGRiBvciBXZWJQIGZpbGUuCisKK09wdGlvbnM6CisgIC1oIC8gLWhlbHAgLi4uLi4uLi4uLi4uLiBzaG9ydCBoZWxwCisgIC1IIC8gLWxvbmdoZWxwIC4uLi4uLi4uLiBsb25nIGhlbHAKKyAgLXEgPGZsb2F0PiAuLi4uLi4uLi4uLi4uIHF1YWxpdHkgZmFjdG9yICgwOnNtYWxsLi4xMDA6YmlnKSwgZGVmYXVsdD03NQorICAtYWxwaGFfcSA8aW50PiAuLi4uLi4uLi4gdHJhbnNwYXJlbmN5LWNvbXByZXNzaW9uIHF1YWxpdHkgKDAuLjEwMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PTEwMAorICAtcHJlc2V0IDxzdHJpbmc+IC4uLi4uLi4gcHJlc2V0IHNldHRpbmcsIG9uZSBvZjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0LCBwaG90bywgcGljdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3aW5nLCBpY29uLCB0ZXh0CisgICAgIC1wcmVzZXQgbXVzdCBjb21lIGZpcnN0LCBhcyBpdCBvdmVyd3JpdGVzIG90aGVyIHBhcmFtZXRlcnMKKyAgLXogPGludD4gLi4uLi4uLi4uLi4uLi4uIGFjdGl2YXRlcyBsb3NzbGVzcyBwcmVzZXQgd2l0aCBnaXZlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgaW4gWzA6ZmFzdCwgLi4uLCA5OnNsb3dlc3RdCisKKyAgLW0gPGludD4gLi4uLi4uLi4uLi4uLi4uIGNvbXByZXNzaW9uIG1ldGhvZCAoMD1mYXN0LCA2PXNsb3dlc3QpLCBkZWZhdWx0PTQKKyAgLXNlZ21lbnRzIDxpbnQ+IC4uLi4uLi4uIG51bWJlciBvZiBzZWdtZW50cyB0byB1c2UgKDEuLjQpLCBkZWZhdWx0PTQKKyAgLXNpemUgPGludD4gLi4uLi4uLi4uLi4uIHRhcmdldCBzaXplIChpbiBieXRlcykKKyAgLXBzbnIgPGZsb2F0PiAuLi4uLi4uLi4uIHRhcmdldCBQU05SIChpbiBkQi4gdHlwaWNhbGx5OiA0MikKKworICAtcyA8aW50PiA8aW50PiAuLi4uLi4uLi4gaW5wdXQgc2l6ZSAod2lkdGggeCBoZWlnaHQpIGZvciBZVVYKKyAgLXNucyA8aW50PiAuLi4uLi4uLi4uLi4uIHNwYXRpYWwgbm9pc2Ugc2hhcGluZyAoMDpvZmYsIDEwMDptYXgpLCBkZWZhdWx0PTUwCisgIC1mIDxpbnQ+IC4uLi4uLi4uLi4uLi4uLiBmaWx0ZXIgc3RyZW5ndGggKDA9b2ZmLi4xMDApLCBkZWZhdWx0PTYwCisgIC1zaGFycG5lc3MgPGludD4gLi4uLi4uLiBmaWx0ZXIgc2hhcnBuZXNzICgwOm1vc3QgLi4gNzpsZWFzdCBzaGFycCksIGRlZmF1bHQ9MAorICAtc3Ryb25nIC4uLi4uLi4uLi4uLi4uLi4gdXNlIHN0cm9uZyBmaWx0ZXIgaW5zdGVhZCBvZiBzaW1wbGUgKGRlZmF1bHQpCisgIC1ub3N0cm9uZyAuLi4uLi4uLi4uLi4uLiB1c2Ugc2ltcGxlIGZpbHRlciBpbnN0ZWFkIG9mIHN0cm9uZworICAtc2hhcnBfeXV2IC4uLi4uLi4uLi4uLi4gdXNlIHNoYXJwZXIgKGFuZCBzbG93ZXIpIFJHQi0+WVVWIGNvbnZlcnNpb24KKyAgLXBhcnRpdGlvbl9saW1pdCA8aW50PiAuIGxpbWl0IHF1YWxpdHkgdG8gZml0IHRoZSA1MTJrIGxpbWl0IG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZmlyc3QgcGFydGl0aW9uICgwPW5vIGRlZ3JhZGF0aW9uIC4uLiAxMDA9ZnVsbCkKKyAgLXBhc3MgPGludD4gLi4uLi4uLi4uLi4uIGFuYWx5c2lzIHBhc3MgbnVtYmVyICgxLi4xMCkKKyAgLWNyb3AgPHg+IDx5PiA8dz4gPGg+IC4uIGNyb3AgcGljdHVyZSB3aXRoIHRoZSBnaXZlbiByZWN0YW5nbGUKKyAgLXJlc2l6ZSA8dz4gPGg+IC4uLi4uLi4uIHJlc2l6ZSBwaWN0dXJlIChhZnRlciBhbnkgY3JvcHBpbmcpCisgIC1tdCAuLi4uLi4uLi4uLi4uLi4uLi4uLiB1c2UgbXVsdGktdGhyZWFkaW5nIGlmIGF2YWlsYWJsZQorICAtbG93X21lbW9yeSAuLi4uLi4uLi4uLi4gcmVkdWNlIG1lbW9yeSB1c2FnZSAoc2xvd2VyIGVuY29kaW5nKQorICAtbWFwIDxpbnQ+IC4uLi4uLi4uLi4uLi4gcHJpbnQgbWFwIG9mIGV4dHJhIGluZm8KKyAgLXByaW50X3BzbnIgLi4uLi4uLi4uLi4uIHByaW50cyBhdmVyYWdlZCBQU05SIGRpc3RvcnRpb24KKyAgLXByaW50X3NzaW0gLi4uLi4uLi4uLi4uIHByaW50cyBhdmVyYWdlZCBTU0lNIGRpc3RvcnRpb24KKyAgLXByaW50X2xzaW0gLi4uLi4uLi4uLi4uIHByaW50cyBsb2NhbC1zaW1pbGFyaXR5IGRpc3RvcnRpb24KKyAgLWQgPGZpbGUucGdtPiAuLi4uLi4uLi4uIGR1bXAgdGhlIGNvbXByZXNzZWQgb3V0cHV0IChQR00gZmlsZSkKKyAgLWFscGhhX21ldGhvZCA8aW50PiAuLi4uIHRyYW5zcGFyZW5jeS1jb21wcmVzc2lvbiBtZXRob2QgKDAuLjEpLCBkZWZhdWx0PTEKKyAgLWFscGhhX2ZpbHRlciA8c3RyaW5nPiAuIHByZWRpY3RpdmUgZmlsdGVyaW5nIGZvciBhbHBoYSBwbGFuZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZSBvZjogbm9uZSwgZmFzdCAoZGVmYXVsdCkgb3IgYmVzdAorICAtZXhhY3QgLi4uLi4uLi4uLi4uLi4uLi4gcHJlc2VydmUgUkdCIHZhbHVlcyBpbiB0cmFuc3BhcmVudCBhcmVhLCBkZWZhdWx0PW9mZgorICAtYmxlbmRfYWxwaGEgPGhleD4gLi4uLi4gYmxlbmQgY29sb3JzIGFnYWluc3QgYmFja2dyb3VuZCBjb2xvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2VkIGFzIFJHQiB2YWx1ZXMgd3JpdHRlbiBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgaGV4YWRlY2ltYWwsIGUuZy4gMHhjMGUwZDAgZm9yIHJlZD0weGMwCisgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVlbj0weGUwIGFuZCBibHVlPTB4ZDAKKyAgLW5vYWxwaGEgLi4uLi4uLi4uLi4uLi4uIGRpc2NhcmQgYW55IHRyYW5zcGFyZW5jeSBpbmZvcm1hdGlvbgorICAtbG9zc2xlc3MgLi4uLi4uLi4uLi4uLi4gZW5jb2RlIGltYWdlIGxvc3NsZXNzbHksIGRlZmF1bHQ9b2ZmCisgIC1uZWFyX2xvc3NsZXNzIDxpbnQ+IC4uLiB1c2UgbmVhci1sb3NzbGVzcyBpbWFnZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlcHJvY2Vzc2luZyAoMC4uMTAwPW9mZiksIGRlZmF1bHQ9MTAwCisgIC1oaW50IDxzdHJpbmc+IC4uLi4uLi4uLiBzcGVjaWZ5IGltYWdlIGNoYXJhY3RlcmlzdGljcyBoaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lIG9mOiBwaG90bywgcGljdHVyZSBvciBncmFwaAorCisgIC1tZXRhZGF0YSA8c3RyaW5nPiAuLi4uLiBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBtZXRhZGF0YSB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weSBmcm9tIHRoZSBpbnB1dCB0byB0aGUgb3V0cHV0IGlmIHByZXNlbnQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZCB2YWx1ZXM6IGFsbCwgbm9uZSAoZGVmYXVsdCksIGV4aWYsIGljYywgeG1wCisKKyAgLXNob3J0IC4uLi4uLi4uLi4uLi4uLi4uIGNvbmRlbnNlIHByaW50ZWQgbWVzc2FnZQorICAtcXVpZXQgLi4uLi4uLi4uLi4uLi4uLi4gZG9uJ3QgcHJpbnQgYW55dGhpbmcKKyAgLXZlcnNpb24gLi4uLi4uLi4uLi4uLi4uIHByaW50IHZlcnNpb24gbnVtYmVyIGFuZCBleGl0CisgIC1ub2FzbSAuLi4uLi4uLi4uLi4uLi4uLiBkaXNhYmxlIGFsbCBhc3NlbWJseSBvcHRpbWl6YXRpb25zCisgIC12IC4uLi4uLi4uLi4uLi4uLi4uLi4uLiB2ZXJib3NlLCBlLmcuIHByaW50IGVuY29kaW5nL2RlY29kaW5nIHRpbWVzCisgIC1wcm9ncmVzcyAuLi4uLi4uLi4uLi4uLiByZXBvcnQgZW5jb2RpbmcgcHJvZ3Jlc3MKKworRXhwZXJpbWVudGFsIE9wdGlvbnM6CisgIC1qcGVnX2xpa2UgLi4uLi4uLi4uLi4uLiByb3VnaGx5IG1hdGNoIGV4cGVjdGVkIEpQRUcgc2l6ZQorICAtYWYgLi4uLi4uLi4uLi4uLi4uLi4uLi4gYXV0by1hZGp1c3QgZmlsdGVyIHN0cmVuZ3RoCisgIC1wcmUgPGludD4gLi4uLi4uLi4uLi4uLiBwcmUtcHJvY2Vzc2luZyBmaWx0ZXIKKworVGhlIG1haW4gb3B0aW9ucyB5b3UgbWlnaHQgd2FudCB0byB0cnkgaW4gb3JkZXIgdG8gZnVydGhlciB0dW5lIHRoZQordmlzdWFsIHF1YWxpdHkgYXJlOgorIC1wcmVzZXQKKyAtc25zCisgLWYKKyAtbQorCitOYW1lbHk6CisgICogJ3ByZXNldCcgd2lsbCBzZXQgdXAgYSBkZWZhdWx0IGVuY29kaW5nIGNvbmZpZ3VyYXRpb24gdGFyZ2V0aW5nIGEKKyAgICAgcGFydGljdWxhciB0eXBlIG9mIGlucHV0LiBJdCBzaG91bGQgYXBwZWFyIGZpcnN0IGluIHRoZSBsaXN0IG9mIG9wdGlvbnMsCisgICAgIHNvIHRoYXQgc3Vic2VxdWVudCBvcHRpb25zIGNhbiB0YWtlIGVmZmVjdCBvbiB0b3Agb2YgdGhpcyBwcmVzZXQuCisgICAgIERlZmF1bHQgdmFsdWUgaXMgJ2RlZmF1bHQnLgorICAqICdzbnMnIHdpbGwgcHJvZ3Jlc3NpdmVseSB0dXJuIG9uICh3aGVuIGdvaW5nIGZyb20gMCB0byAxMDApIHNvbWUgYWRkaXRpb25hbAorICAgICB2aXN1YWwgb3B0aW1pemF0aW9ucyAobGlrZTogc2VnbWVudGF0aW9uIG1hcCByZS1lbmZvcmNlbWVudCkuIFRoaXMgb3B0aW9uCisgICAgIHdpbGwgYmFsYW5jZSB0aGUgYml0IGFsbG9jYXRpb24gZGlmZmVyZW50bHkuIEl0IHRyaWVzIHRvIHRha2UgYml0cyBmcm9tIHRoZQorICAgICAiZWFzeSIgcGFydHMgb2YgdGhlIHBpY3R1cmUgYW5kIHVzZSB0aGVtIGluIHRoZSAiZGlmZmljdWx0IiBvbmVzIGluc3RlYWQuCisgICAgIFVzdWFsbHksIHJhaXNpbmcgdGhlIHNucyB2YWx1ZSAoYXQgZml4ZWQgLXEgdmFsdWUpIGxlYWRzIHRvIGxhcmdlciBmaWxlcywKKyAgICAgYnV0IHdpdGggYmV0dGVyIHF1YWxpdHkuCisgICAgIFR5cGljYWwgdmFsdWUgaXMgYXJvdW5kICc3NScuCisgICogJ2YnIG9wdGlvbiBkaXJlY3RseSBsaW5rcyB0byB0aGUgZmlsdGVyaW5nIHN0cmVuZ3RoIHVzZWQgYnkgdGhlIGNvZGVjJ3MKKyAgICAgaW4tbG9vcCBwcm9jZXNzaW5nLiBUaGUgaGlnaGVyIHRoZSB2YWx1ZSwgdGhlIHNtb290aGVyIHRoZQorICAgICBoaWdobHktY29tcHJlc3NlZCBhcmVhIHdpbGwgbG9vay4gVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIHdoZW4gYWltaW5nCisgICAgIGF0IHZlcnkgc21hbGwgZmlsZXMuIFR5cGljYWwgdmFsdWVzIGFyZSBhcm91bmQgMjAtMzAuIE5vdGUgdGhhdCB1c2luZyB0aGUKKyAgICAgb3B0aW9uIC1zdHJvbmcvLW5vc3Ryb25nIHdpbGwgY2hhbmdlIHRoZSB0eXBlIG9mIGZpbHRlcmluZy4gVXNlICItZiAwIiB0bworICAgICB0dXJuIGZpbHRlcmluZyBvZmYuCisgICogJ20nIGNvbnRyb2xzIHRoZSB0cmFkZS1vZmYgYmV0d2VlbiBlbmNvZGluZyBzcGVlZCBhbmQgcXVhbGl0eS4gRGVmYXVsdCBpcyA0LgorICAgICBZb3UgY2FuIHRyeSAtbSA1IG9yIC1tIDYgdG8gZXhwbG9yZSBtb3JlICh0aW1lLWNvbnN1bWluZykgZW5jb2RpbmcKKyAgICAgcG9zc2liaWxpdGllcy4gQSBsb3dlciB2YWx1ZSB3aWxsIHJlc3VsdCBpbiBmYXN0ZXIgZW5jb2RpbmcgYXQgdGhlIGV4cGVuc2UKKyAgICAgb2YgcXVhbGl0eS4KKworRGVjb2RpbmcgdG9vbDoKKz09PT09PT09PT09PT09CisKK1RoZXJlIGlzIGEgZGVjb2Rpbmcgc2FtcGxlIGluIGV4YW1wbGVzL2R3ZWJwLmMgd2hpY2ggd2lsbCB0YWtlCithIC53ZWJwIGZpbGUgYW5kIGRlY29kZSBpdCB0byBhIFBORyBpbWFnZSBmaWxlIChhbW9uZ3N0IG90aGVyIGZvcm1hdHMpLgorVGhpcyBpcyBzaW1wbHkgdG8gZGVtb25zdHJhdGUgdGhlIHVzZSBvZiB0aGUgQVBJLiBZb3UgY2FuIHZlcmlmeSB0aGUKK2ZpbGUgdGVzdC53ZWJwIGRlY29kZXMgdG8gZXhhY3RseSB0aGUgc2FtZSBhcyB0ZXN0X3JlZi5wcG0gYnkgdXNpbmc6CisKKyBjZCBleGFtcGxlcworIC4vZHdlYnAgdGVzdC53ZWJwIC1wcG0gLW8gdGVzdC5wcG0KKyBkaWZmIHRlc3QucHBtIHRlc3RfcmVmLnBwbQorCitUaGUgZnVsbCBsaXN0IG9mIG9wdGlvbnMgaXMgYXZhaWxhYmxlIHVzaW5nIC1oOgorCis+IGR3ZWJwIC1oCitVc2FnZTogZHdlYnAgaW5fZmlsZSBbb3B0aW9uc10gWy1vIG91dF9maWxlXQorCitEZWNvZGVzIHRoZSBXZWJQIGltYWdlIGZpbGUgdG8gUE5HIGZvcm1hdCBbRGVmYXVsdF0KK1VzZSBmb2xsb3dpbmcgb3B0aW9ucyB0byBjb252ZXJ0IGludG8gYWx0ZXJuYXRlIGltYWdlIGZvcm1hdHM6CisgIC1wYW0gLi4uLi4uLi4uIHNhdmUgdGhlIHJhdyBSR0JBIHNhbXBsZXMgYXMgYSBjb2xvciBQQU0KKyAgLXBwbSAuLi4uLi4uLi4gc2F2ZSB0aGUgcmF3IFJHQiBzYW1wbGVzIGFzIGEgY29sb3IgUFBNCisgIC1ibXAgLi4uLi4uLi4uIHNhdmUgYXMgdW5jb21wcmVzc2VkIEJNUCBmb3JtYXQKKyAgLXRpZmYgLi4uLi4uLi4gc2F2ZSBhcyB1bmNvbXByZXNzZWQgVElGRiBmb3JtYXQKKyAgLXBnbSAuLi4uLi4uLi4gc2F2ZSB0aGUgcmF3IFlVViBzYW1wbGVzIGFzIGEgZ3JheXNjYWxlIFBHTQorICAgICAgICAgICAgICAgICBmaWxlIHdpdGggSU1DNCBsYXlvdXQKKyAgLXl1diAuLi4uLi4uLi4gc2F2ZSB0aGUgcmF3IFlVViBzYW1wbGVzIGluIGZsYXQgbGF5b3V0CisKKyBPdGhlciBvcHRpb25zIGFyZToKKyAgLXZlcnNpb24gLi4uLi4gcHJpbnQgdmVyc2lvbiBudW1iZXIgYW5kIGV4aXQKKyAgLW5vZmFuY3kgLi4uLi4gZG9uJ3QgdXNlIHRoZSBmYW5jeSBZVVY0MjAgdXBzY2FsZXIKKyAgLW5vZmlsdGVyIC4uLi4gZGlzYWJsZSBpbi1sb29wIGZpbHRlcmluZworICAtbm9kaXRoZXIgLi4uLiBkaXNhYmxlIGRpdGhlcmluZworICAtZGl0aGVyIDxkPiAuLiBkaXRoZXJpbmcgc3RyZW5ndGggKGluIDAuLjEwMCkKKyAgLWFscGhhX2RpdGhlciAgdXNlIGFscGhhLXBsYW5lIGRpdGhlcmluZyBpZiBuZWVkZWQKKyAgLW10IC4uLi4uLi4uLi4gdXNlIG11bHRpLXRocmVhZGluZworICAtY3JvcCA8eD4gPHk+IDx3PiA8aD4gLi4uIGNyb3Agb3V0cHV0IHdpdGggdGhlIGdpdmVuIHJlY3RhbmdsZQorICAtcmVzaXplIDx3PiA8aD4gLi4uLi4uLi4uIHNjYWxlIHRoZSBvdXRwdXQgKCphZnRlciogYW55IGNyb3BwaW5nKQorICAtZmxpcCAuLi4uLi4uLiBmbGlwIHRoZSBvdXRwdXQgdmVydGljYWxseQorICAtYWxwaGEgLi4uLi4uLiBvbmx5IHNhdmUgdGhlIGFscGhhIHBsYW5lCisgIC1pbmNyZW1lbnRhbCAuIHVzZSBpbmNyZW1lbnRhbCBkZWNvZGluZyAodXNlZnVsIGZvciB0ZXN0cykKKyAgLWggLi4uLi4uLi4uLi4gdGhpcyBoZWxwIG1lc3NhZ2UKKyAgLXYgLi4uLi4uLi4uLi4gdmVyYm9zZSAoZS5nLiBwcmludCBlbmNvZGluZy9kZWNvZGluZyB0aW1lcykKKyAgLXF1aWV0IC4uLi4uLi4gcXVpZXQgbW9kZSwgZG9uJ3QgcHJpbnQgYW55dGhpbmcKKyAgLW5vYXNtIC4uLi4uLi4gZGlzYWJsZSBhbGwgYXNzZW1ibHkgb3B0aW1pemF0aW9ucworCitXZWJQIGZpbGUgYW5hbHlzaXMgdG9vbDoKKz09PT09PT09PT09PT09PT09PT09PT09PQorCisnd2VicGluZm8nIGNhbiBiZSB1c2VkIHRvIHByaW50IG91dCB0aGUgY2h1bmsgbGV2ZWwgc3RydWN0dXJlIGFuZCBiaXRzdHJlYW0KK2hlYWRlciBpbmZvcm1hdGlvbiBvZiBXZWJQIGZpbGVzLiBJdCBjYW4gYWxzbyBjaGVjayBpZiB0aGUgZmlsZXMgYXJlIG9mIHZhbGlkCitXZWJQIGZvcm1hdC4KKworVXNhZ2U6IHdlYnBpbmZvIFtvcHRpb25zXSBpbl9maWxlcworTm90ZTogdGhlcmUgY291bGQgYmUgbXVsdGlwbGUgaW5wdXQgZmlsZXM7CisgICAgICBvcHRpb25zIG11c3QgY29tZSBiZWZvcmUgaW5wdXQgZmlsZXMuCitPcHRpb25zOgorICAtdmVyc2lvbiAuLi4uLi4uLi4uLiBQcmludCB2ZXJzaW9uIG51bWJlciBhbmQgZXhpdC4KKyAgLXF1aWV0IC4uLi4uLi4uLi4uLi4gRG8gbm90IHNob3cgY2h1bmsgcGFyc2luZyBpbmZvcm1hdGlvbi4KKyAgLWRpYWcgLi4uLi4uLi4uLi4uLi4gU2hvdyBwYXJzaW5nIGVycm9yIGRpYWdub3Npcy4KKyAgLXN1bW1hcnkgLi4uLi4uLi4uLi4gU2hvdyBjaHVuayBzdGF0cyBzdW1tYXJ5LgorICAtYml0c3RyZWFtX2luZm8gLi4uLiBQYXJzZSBiaXRzdHJlYW0gaGVhZGVyLgorCitWaXN1YWxpemF0aW9uIHRvb2w6Cis9PT09PT09PT09PT09PT09PT09CisKK1RoZXJlJ3MgYSBsaXR0bGUgc2VsZi1zZXJ2ZSB2aXN1YWxpemF0aW9uIHRvb2wgY2FsbGVkICd2d2VicCcgdW5kZXIgdGhlCitleGFtcGxlcy8gZGlyZWN0b3J5LiBJdCB1c2VzIE9wZW5HTCB0byBvcGVuIGEgc2ltcGxlIGRyYXdpbmcgd2luZG93IGFuZCBzaG93CithIGRlY29kZWQgV2ViUCBmaWxlLiBJdCdzIG5vdCB5ZXQgaW50ZWdyYXRlZCBpbiB0aGUgYXV0b21ha2UgYnVpbGQgc3lzdGVtLCBidXQKK3lvdSBjYW4gdHJ5IHRvIG1hbnVhbGx5IGNvbXBpbGUgaXQgdXNpbmcgdGhlIHJlY29tbWVuZGF0aW9ucyBiZWxvdy4KKworVXNhZ2U6IHZ3ZWJwIGluX2ZpbGUgW29wdGlvbnNdCisKK0RlY29kZXMgdGhlIFdlYlAgaW1hZ2UgZmlsZSBhbmQgdmlzdWFsaXplIGl0IHVzaW5nIE9wZW5HTAorT3B0aW9ucyBhcmU6CisgIC12ZXJzaW9uIC4uLi4uIHByaW50IHZlcnNpb24gbnVtYmVyIGFuZCBleGl0CisgIC1ub2ljYyAuLi4uLi4uIGRvbid0IHVzZSB0aGUgaWNjIHByb2ZpbGUgaWYgcHJlc2VudAorICAtbm9mYW5jeSAuLi4uLiBkb24ndCB1c2UgdGhlIGZhbmN5IFlVVjQyMCB1cHNjYWxlcgorICAtbm9maWx0ZXIgLi4uLiBkaXNhYmxlIGluLWxvb3AgZmlsdGVyaW5nCisgIC1kaXRoZXIgPGludD4gIGRpdGhlcmluZyBzdHJlbmd0aCAoMC4uMTAwKSwgZGVmYXVsdD01MAorICAtbm9hbHBoYWRpdGhlciBkaXNhYmxlIGFscGhhIHBsYW5lIGRpdGhlcmluZworICAtbXQgLi4uLi4uLi4uLiB1c2UgbXVsdGktdGhyZWFkaW5nCisgIC1pbmZvIC4uLi4uLi4uIHByaW50IGluZm8KKyAgLWggLi4uLi4uLi4uLi4gdGhpcyBoZWxwIG1lc3NhZ2UKKworS2V5Ym9hcmQgc2hvcnRjdXRzOgorICAnYycgLi4uLi4uLi4uLi4uLi4uLiB0b2dnbGUgdXNlIG9mIGNvbG9yIHByb2ZpbGUKKyAgJ2knIC4uLi4uLi4uLi4uLi4uLi4gb3ZlcmxheSBmaWxlIGluZm9ybWF0aW9uCisgICdkJyAuLi4uLi4uLi4uLi4uLi4uIGRpc2FibGUgYmxlbmRpbmcgJiBkaXNwb3NhbCAoZGVidWcpCisgICdxJyAvICdRJyAvIEVTQyAuLi4uIHF1aXQKKworQnVpbGRpbmc6CistLS0tLS0tLS0KKworUHJlcmVxdWlzaXRlczoKKzEpIE9wZW5HTCAmIE9wZW5HTCBVdGlsaXR5IFRvb2xraXQgKEdMVVQpCisgIExpbnV4OgorICAgICQgc3VkbyBhcHQtZ2V0IGluc3RhbGwgZnJlZWdsdXQzLWRldiBtZXNhLWNvbW1vbi1kZXYKKyAgTWFjICsgWENvZGU6CisgICAgLSBUaGVzZSBsaWJyYXJpZXMgc2hvdWxkIGJlIGF2YWlsYWJsZSBpbiB0aGUgT3BlbkdMIC8gR0xVVCBmcmFtZXdvcmtzLgorICBXaW5kb3dzOgorICAgIGh0dHA6Ly9mcmVlZ2x1dC5zb3VyY2Vmb3JnZS5uZXQvaW5kZXgucGhwI2Rvd25sb2FkCisKKzIpIChPcHRpb25hbCkgcWNtcyAoUXVpY2sgQ29sb3IgTWFuYWdlbWVudCBTeXN0ZW0pCisgIGkuIERvd25sb2FkIHFjbXMgZnJvbSBNb3ppbGxhIC8gQ2hyb21pdW06CisgICAgaHR0cDovL2hnLm1vemlsbGEub3JnL21vemlsbGEtY2VudHJhbC9maWxlLzBlNzYzOWUzYmRmYi9nZngvcWNtcworICAgIGh0dHA6Ly9zcmMuY2hyb21pdW0ub3JnL3ZpZXd2Yy9jaHJvbWUvdHJ1bmsvc3JjL3RoaXJkX3BhcnR5L3FjbXMKKyAgaWkuIEJ1aWxkIGFuZCBhcmNoaXZlIHRoZSBzb3VyY2UgZmlsZXMgYXMgbGlicWNtcy5hIC8gcWNtcy5saWIKKyAgaWlpLiBVcGRhdGUgbWFrZWZpbGUudW5peCAvIE1ha2VmaWxlLnZjCisgICAgYSkgRGVmaW5lIFdFQlBfSEFWRV9RQ01TCisgICAgYikgVXBkYXRlIGluY2x1ZGUgLyBsaWJyYXJ5IHBhdGhzIHRvIHJlZmVyZW5jZSB0aGUgcWNtcyBkaXJlY3RvcnkuCisKK0J1aWxkIHVzaW5nIG1ha2VmaWxlLnVuaXggLyBNYWtlZmlsZS52YzoKKyQgbWFrZSAtZiBtYWtlZmlsZS51bml4IGV4YW1wbGVzL3Z3ZWJwCis+IG5tYWtlIC9mIE1ha2VmaWxlLnZjIENGRz1yZWxlYXNlLXN0YXRpYyBcCisgICAgLi4vb2JqL3g2NC9yZWxlYXNlLXN0YXRpYy9iaW4vdndlYnAuZXhlCisKK0FuaW1hdGlvbiBjcmVhdGlvbiB0b29sOgorPT09PT09PT09PT09PT09PT09PT09PT09CitUaGUgdXRpbGl0eSAnaW1nMndlYnAnIGNhbiB0dXJuIGEgc2VxdWVuY2Ugb2YgaW5wdXQgaW1hZ2VzIChQTkcsIEpQRUcsIC4uLikKK2ludG8gYW4gYW5pbWF0ZWQgV2ViUCBmaWxlLiBJdCBvZmZlcnMgZmluZSBjb250cm9sIG92ZXIgZHVyYXRpb24sIGVuY29kaW5nCittb2RlcywgZXRjLgorCitVc2FnZToKKworICBpbWcyd2VicCBbZmlsZS1sZXZlbCBvcHRpb25zXSBbaW1hZ2UgZmlsZXMuLi5dIFtwZXItZnJhbWUgb3B0aW9ucy4uLl0KKworRmlsZS1sZXZlbCBvcHRpb25zIChvbmx5IHVzZWQgYXQgdGhlIHN0YXJ0IG9mIGNvbXByZXNzaW9uKToKKyAtbWluX3NpemUgLi4uLi4uLi4uLi4uIG1pbmltaXplIHNpemUKKyAtbG9vcCA8aW50PiAuLi4uLi4uLi4uIGxvb3AgY291bnQgKGRlZmF1bHQ6IDAsID0gaW5maW5pdGUgbG9vcCkKKyAta21heCA8aW50PiAuLi4uLi4uLi4uIG1heGltdW0gbnVtYmVyIG9mIGZyYW1lIGJldHdlZW4ga2V5LWZyYW1lcworICAgICAgICAgICAgICAgICAgICAgICAgKDA9b25seSBrZXlmcmFtZXMpCisgLWttaW4gPGludD4gLi4uLi4uLi4uLiBtaW5pbXVtIG51bWJlciBvZiBmcmFtZSBiZXR3ZWVuIGtleS1mcmFtZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICgwPWRpc2FibGUga2V5LWZyYW1lcyBhbHRvZ2V0aGVyKQorIC1taXhlZCAuLi4uLi4uLi4uLi4uLi4gdXNlIG1peGVkIGxvc3N5L2xvc3NsZXNzIGF1dG9tYXRpYyBtb2RlCisgLXYgLi4uLi4uLi4uLi4uLi4uLi4uLiB2ZXJib3NlIG1vZGUKKyAtaCAuLi4uLi4uLi4uLi4uLi4uLi4uIHRoaXMgaGVscAorIC12ZXJzaW9uIC4uLi4uLi4uLi4uLi4gcHJpbnQgdmVyc2lvbiBudW1iZXIgYW5kIGV4aXQKKworUGVyLWZyYW1lIG9wdGlvbnMgKG9ubHkgdXNlZCBmb3Igc3Vic2VxdWVudCBpbWFnZXMgaW5wdXQpOgorIC1kIDxpbnQ+IC4uLi4uLi4uLi4uLi4gZnJhbWUgZHVyYXRpb24gaW4gbXMgKGRlZmF1bHQ6IDEwMCkKKyAtbG9zc2xlc3MgIC4uLi4uLi4uLi4uIHVzZSBsb3NzbGVzcyBtb2RlIChkZWZhdWx0KQorIC1sb3NzeSAuLi4gLi4uLi4uLi4uLi4gdXNlIGxvc3N5IG1vZGUKKyAtcSA8ZmxvYXQ+IC4uLi4uLi4uLi4uIHF1YWxpdHkKKyAtbSA8aW50PiAuLi4uLi4uLi4uLi4uIG1ldGhvZCB0byB1c2UKKworZXhhbXBsZTogaW1nMndlYnAgLWxvb3AgMiBpbjAucG5nIC1sb3NzeSBpbjEuanBnCisgICAgICAgICAgICAgICAgICAtZCA4MCBpbjIudGlmZiAtbyBvdXQud2VicAorCitBbmltYXRlZCBHSUYgY29udmVyc2lvbjoKKz09PT09PT09PT09PT09PT09PT09PT09PQorQW5pbWF0ZWQgR0lGIGZpbGVzIGNhbiBiZSBjb252ZXJ0ZWQgdG8gV2ViUCBmaWxlcyB3aXRoIGFuaW1hdGlvbiB1c2luZyB0aGUKK2dpZjJ3ZWJwIHV0aWxpdHkgYXZhaWxhYmxlIHVuZGVyIGV4YW1wbGVzLy4gVGhlIGZpbGVzIGNhbiB0aGVuIGJlIHZpZXdlZCB1c2luZwordndlYnAuCisKK1VzYWdlOgorIGdpZjJ3ZWJwIFtvcHRpb25zXSBnaWZfZmlsZSAtbyB3ZWJwX2ZpbGUKK09wdGlvbnM6CisgIC1oIC8gLWhlbHAgLi4uLi4uLi4uLi4uLiB0aGlzIGhlbHAKKyAgLWxvc3N5IC4uLi4uLi4uLi4uLi4uLi4uIGVuY29kZSBpbWFnZSB1c2luZyBsb3NzeSBjb21wcmVzc2lvbgorICAtbWl4ZWQgLi4uLi4uLi4uLi4uLi4uLi4gZm9yIGVhY2ggZnJhbWUgaW4gdGhlIGltYWdlLCBwaWNrIGxvc3N5CisgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBsb3NzbGVzcyBjb21wcmVzc2lvbiBoZXVyaXN0aWNhbGx5CisgIC1xIDxmbG9hdD4gLi4uLi4uLi4uLi4uLiBxdWFsaXR5IGZhY3RvciAoMDpzbWFsbC4uMTAwOmJpZykKKyAgLW0gPGludD4gLi4uLi4uLi4uLi4uLi4uIGNvbXByZXNzaW9uIG1ldGhvZCAoMD1mYXN0LCA2PXNsb3dlc3QpCisgIC1taW5fc2l6ZSAuLi4uLi4uLi4uLi4uLiBtaW5pbWl6ZSBvdXRwdXQgc2l6ZSAoZGVmYXVsdDpvZmYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3NzbGVzcyBjb21wcmVzc2lvbiBieSBkZWZhdWx0OyBjYW4gYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbWJpbmVkIHdpdGggLXEsIC1tLCAtbG9zc3kgb3IgLW1peGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zCisgIC1rbWluIDxpbnQ+IC4uLi4uLi4uLi4uLiBtaW4gZGlzdGFuY2UgYmV0d2VlbiBrZXkgZnJhbWVzCisgIC1rbWF4IDxpbnQ+IC4uLi4uLi4uLi4uLiBtYXggZGlzdGFuY2UgYmV0d2VlbiBrZXkgZnJhbWVzCisgIC1mIDxpbnQ+IC4uLi4uLi4uLi4uLi4uLiBmaWx0ZXIgc3RyZW5ndGggKDA9b2ZmLi4xMDApCisgIC1tZXRhZGF0YSA8c3RyaW5nPiAuLi4uLiBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBtZXRhZGF0YSB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weSBmcm9tIHRoZSBpbnB1dCB0byB0aGUgb3V0cHV0IGlmIHByZXNlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkIHZhbHVlczogYWxsLCBub25lLCBpY2MsIHhtcCAoZGVmYXVsdCkKKyAgLWxvb3BfY29tcGF0aWJpbGl0eSAuLi4uIHVzZSBjb21wYXRpYmlsaXR5IG1vZGUgZm9yIENocm9tZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiBwcmlvciB0byBNNjIgKGluY2x1c2l2ZSkKKyAgLW10IC4uLi4uLi4uLi4uLi4uLi4uLi4uIHVzZSBtdWx0aS10aHJlYWRpbmcgaWYgYXZhaWxhYmxlCisKKyAgLXZlcnNpb24gLi4uLi4uLi4uLi4uLi4uIHByaW50IHZlcnNpb24gbnVtYmVyIGFuZCBleGl0CisgIC12IC4uLi4uLi4uLi4uLi4uLi4uLi4uLiB2ZXJib3NlCisgIC1xdWlldCAuLi4uLi4uLi4uLi4uLi4uLiBkb24ndCBwcmludCBhbnl0aGluZworCitCdWlsZGluZzoKKy0tLS0tLS0tLQorV2l0aCB0aGUgbGliZ2lmIGRldmVsb3BtZW50IGZpbGVzIGluc3RhbGxlZCwgZ2lmMndlYnAgY2FuIGJlIGJ1aWx0IHVzaW5nCittYWtlZmlsZS51bml4OgorJCBtYWtlIC1mIG1ha2VmaWxlLnVuaXggZXhhbXBsZXMvZ2lmMndlYnAKKworb3IgdXNpbmcgYXV0b2NvbmY6CiskIC4vY29uZmlndXJlIC0tZW5hYmxlLWV2ZXJ5dGhpbmcKKyQgbWFrZQorCitDb21wYXJpc29uIG9mIGFuaW1hdGVkIGltYWdlczoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorVGVzdCB1dGlsaXR5IGFuaW1fZGlmZiB1bmRlciBleGFtcGxlcy8gY2FuIGJlIHVzZWQgdG8gY29tcGFyZSB0d28gYW5pbWF0ZWQKK2ltYWdlcyAoZWFjaCBjYW4gYmUgR0lGIG9yIFdlYlApLgorCitVc2FnZTogYW5pbV9kaWZmIDxpbWFnZTE+IDxpbWFnZTI+IFtvcHRpb25zXQorCitPcHRpb25zOgorICAtZHVtcF9mcmFtZXMgPGZvbGRlcj4gZHVtcCBkZWNvZGVkIGZyYW1lcyBpbiBQQU0gZm9ybWF0CisgIC1taW5fcHNuciA8ZmxvYXQ+IC4uLiBtaW5pbXVtIHBlci1mcmFtZSBQU05SCisgIC1yYXdfY29tcGFyaXNvbiAuLi4uLiBpZiB0aGlzIGZsYWcgaXMgbm90IHVzZWQsIFJHQiBpcworICAgICAgICAgICAgICAgICAgICAgICAgcHJlbXVsdGlwbGllZCBiZWZvcmUgY29tcGFyaXNvbgorICAtbWF4X2RpZmYgPGludD4gLi4uLi4gbWF4aW11bSBhbGxvd2VkIGRpZmZlcmVuY2UgcGVyIGNoYW5uZWwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJldHdlZW4gY29ycmVzcG9uZGluZyBwaXhlbHMgaW4gc3Vic2VxdWVudAorICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzCisgIC1oIC4uLi4uLi4uLi4uLi4uLi4uLiB0aGlzIGhlbHAKKyAgLXZlcnNpb24gLi4uLi4uLi4uLi4uIHByaW50IHZlcnNpb24gbnVtYmVyIGFuZCBleGl0CisKK0J1aWxkaW5nOgorLS0tLS0tLS0tCitXaXRoIHRoZSBsaWJnaWYgZGV2ZWxvcG1lbnQgZmlsZXMgYW5kIGEgQysrIGNvbXBpbGVyIGluc3RhbGxlZCwgYW5pbV9kaWZmIGNhbgorYmUgYnVpbHQgdXNpbmcgbWFrZWZpbGUudW5peDoKKyQgbWFrZSAtZiBtYWtlZmlsZS51bml4IGV4YW1wbGVzL2FuaW1fZGlmZgorCitvciB1c2luZyBhdXRvY29uZjoKKyQgLi9jb25maWd1cmUgLS1lbmFibGUtZXZlcnl0aGluZworJCBtYWtlCisKK0VuY29kaW5nIEFQSToKKz09PT09PT09PT09PT0KKworVGhlIG1haW4gZW5jb2RpbmcgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGUgaW4gdGhlIGhlYWRlciBzcmMvd2VicC9lbmNvZGUuaAorVGhlIHJlYWR5LXRvLXVzZSBvbmVzIGFyZToKK3NpemVfdCBXZWJQRW5jb2RlUkdCKGNvbnN0IHVpbnQ4X3QqIHJnYiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcXVhbGl0eV9mYWN0b3IsIHVpbnQ4X3QqKiBvdXRwdXQpOworc2l6ZV90IFdlYlBFbmNvZGVCR1IoY29uc3QgdWludDhfdCogYmdyLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICBmbG9hdCBxdWFsaXR5X2ZhY3RvciwgdWludDhfdCoqIG91dHB1dCk7CitzaXplX3QgV2ViUEVuY29kZVJHQkEoY29uc3QgdWludDhfdCogcmdiYSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHF1YWxpdHlfZmFjdG9yLCB1aW50OF90Kiogb3V0cHV0KTsKK3NpemVfdCBXZWJQRW5jb2RlQkdSQShjb25zdCB1aW50OF90KiBiZ3JhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcXVhbGl0eV9mYWN0b3IsIHVpbnQ4X3QqKiBvdXRwdXQpOworCitUaGV5IHdpbGwgY29udmVydCByYXcgUkdCIHNhbXBsZXMgdG8gYSBXZWJQIGRhdGEuIFRoZSBvbmx5IGNvbnRyb2wgc3VwcGxpZWQKK2lzIHRoZSBxdWFsaXR5IGZhY3Rvci4KKworVGhlcmUgYXJlIHNvbWUgdmFyaWFudHMgZm9yIHVzaW5nIHRoZSBsb3NzbGVzcyBmb3JtYXQ6CisKK3NpemVfdCBXZWJQRW5jb2RlTG9zc2xlc3NSR0IoY29uc3QgdWludDhfdCogcmdiLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIHVpbnQ4X3QqKiBvdXRwdXQpOworc2l6ZV90IFdlYlBFbmNvZGVMb3NzbGVzc0JHUihjb25zdCB1aW50OF90KiBiZ3IsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgdWludDhfdCoqIG91dHB1dCk7CitzaXplX3QgV2ViUEVuY29kZUxvc3NsZXNzUkdCQShjb25zdCB1aW50OF90KiByZ2JhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCB1aW50OF90Kiogb3V0cHV0KTsKK3NpemVfdCBXZWJQRW5jb2RlTG9zc2xlc3NCR1JBKGNvbnN0IHVpbnQ4X3QqIGJncmEsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIHVpbnQ4X3QqKiBvdXRwdXQpOworCitPZiBjb3Vyc2UgaW4gdGhpcyBjYXNlLCBubyBxdWFsaXR5IGZhY3RvciBpcyBuZWVkZWQgc2luY2UgdGhlIGNvbXByZXNzaW9uCitvY2N1cnMgd2l0aG91dCBsb3NzIG9mIHRoZSBpbnB1dCB2YWx1ZXMsIGF0IHRoZSBleHBlbnNlIG9mIGxhcmdlciBvdXRwdXQgc2l6ZXMuCisKK0FkdmFuY2VkIGVuY29kaW5nIEFQSToKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQSBtb3JlIGFkdmFuY2VkIEFQSSBpcyBiYXNlZCBvbiB0aGUgV2ViUENvbmZpZyBhbmQgV2ViUFBpY3R1cmUgc3RydWN0dXJlcy4KKworV2ViUENvbmZpZyBjb250YWlucyB0aGUgZW5jb2Rpbmcgc2V0dGluZ3MgYW5kIGlzIG5vdCB0aWVkIHRvIGEgcGFydGljdWxhcgorcGljdHVyZS4KK1dlYlBQaWN0dXJlIGNvbnRhaW5zIGlucHV0IGRhdGEsIG9uIHdoaWNoIHNvbWUgV2ViUENvbmZpZyB3aWxsIGJlIHVzZWQgZm9yCitjb21wcmVzc2lvbi4KK1RoZSBlbmNvZGluZyBmbG93IGxvb2tzIGxpa2U6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJFR0lOIFBTRVVETyBFWEFNUExFCisKKyNpbmNsdWRlIDx3ZWJwL2VuY29kZS5oPgorCisgIC8vIFNldHVwIGEgY29uZmlnLCBzdGFydGluZyBmb3JtIGEgcHJlc2V0IGFuZCB0dW5pbmcgc29tZSBhZGRpdGlvbmFsCisgIC8vIHBhcmFtZXRlcnMKKyAgV2ViUENvbmZpZyBjb25maWc7CisgIGlmICghV2ViUENvbmZpZ1ByZXNldCgmY29uZmlnLCBXRUJQX1BSRVNFVF9QSE9UTywgcXVhbGl0eV9mYWN0b3IpKQorICAgIHJldHVybiAwOyAgIC8vIHZlcnNpb24gZXJyb3IKKyAgfQorICAvLyAuLi4gYWRkaXRpb25hbCB0dW5pbmcKKyAgY29uZmlnLnNuc19zdHJlbmd0aCA9IDkwOworICBjb25maWcuZmlsdGVyX3NoYXJwbmVzcyA9IDY7CisgIGNvbmZpZ19lcnJvciA9IFdlYlBWYWxpZGF0ZUNvbmZpZygmY29uZmlnKTsgIC8vIG5vdCBtYW5kYXRvcnksIGJ1dCB1c2VmdWwKKworICAvLyBTZXR1cCB0aGUgaW5wdXQgZGF0YQorICBXZWJQUGljdHVyZSBwaWM7CisgIGlmICghV2ViUFBpY3R1cmVJbml0KCZwaWMpKSB7CisgICAgcmV0dXJuIDA7ICAvLyB2ZXJzaW9uIGVycm9yCisgIH0KKyAgcGljLndpZHRoID0gd2lkdGg7CisgIHBpYy5oZWlnaHQgPSBoZWlnaHQ7CisgIC8vIGFsbG9jYXRlZCBwaWN0dXJlIG9mIGRpbWVuc2lvbiB3aWR0aCB4IGhlaWdodAorICBpZiAoIVdlYlBQaWN0dXJlQWxsb2NhdGUoJnBpYykpIHsKKyAgICByZXR1cm4gMDsgICAvLyBtZW1vcnkgZXJyb3IKKyAgfQorICAvLyBhdCB0aGlzIHBvaW50LCAncGljJyBoYXMgYmVlbiBpbml0aWFsaXplZCBhcyBhIGNvbnRhaW5lciwKKyAgLy8gYW5kIGNhbiByZWNlaXZlIHRoZSBZL1UvViBzYW1wbGVzLgorICAvLyBBbHRlcm5hdGl2ZWx5LCBvbmUgY291bGQgdXNlIHJlYWR5LW1hZGUgaW1wb3J0IGZ1bmN0aW9ucyBsaWtlCisgIC8vIFdlYlBQaWN0dXJlSW1wb3J0UkdCKCksIHdoaWNoIHdpbGwgdGFrZSBjYXJlIG9mIG1lbW9yeSBhbGxvY2F0aW9uLgorICAvLyBJbiBhbnkgY2FzZSwgcGFzdCB0aGlzIHBvaW50LCBvbmUgd2lsbCBoYXZlIHRvIGNhbGwKKyAgLy8gV2ViUFBpY3R1cmVGcmVlKCZwaWMpIHRvIHJlY2xhaW0gbWVtb3J5LgorCisgIC8vIFNldCB1cCBhIGJ5dGUtb3V0cHV0IHdyaXRlIG1ldGhvZC4gV2ViUE1lbW9yeVdyaXRlciwgZm9yIGluc3RhbmNlLgorICBXZWJQTWVtb3J5V3JpdGVyIHdydDsKKyAgV2ViUE1lbW9yeVdyaXRlckluaXQoJndydCk7ICAgICAvLyBpbml0aWFsaXplICd3cnQnCisKKyAgcGljLndyaXRlciA9IE15RmlsZVdyaXRlcjsKKyAgcGljLmN1c3RvbV9wdHIgPSBteV9vcGFxdWVfc3RydWN0dXJlX3RvX21ha2VfTXlGaWxlV3JpdGVyX3dvcms7CisKKyAgLy8gQ29tcHJlc3MhCisgIGludCBvayA9IFdlYlBFbmNvZGUoJmNvbmZpZywgJnBpYyk7ICAgLy8gb2sgPSAwID0+IGVycm9yIG9jY3VycmVkIQorICBXZWJQUGljdHVyZUZyZWUoJnBpYyk7ICAvLyBtdXN0IGJlIGNhbGxlZCBpbmRlcGVuZGVudGx5IG9mIHRoZSAnb2snIHJlc3VsdC4KKworICAvLyBvdXRwdXQgZGF0YSBzaG91bGQgaGF2ZSBiZWVuIGhhbmRsZWQgYnkgdGhlIHdyaXRlciBhdCB0aGF0IHBvaW50LgorICAvLyAtPiBjb21wcmVzc2VkIGRhdGEgaXMgdGhlIG1lbW9yeSBidWZmZXIgZGVzY3JpYmVkIGJ5IHdydC5tZW0gLyB3cnQuc2l6ZQorCisgIC8vIGRlYWxsb2NhdGUgdGhlIG1lbW9yeSB1c2VkIGJ5IGNvbXByZXNzZWQgZGF0YQorICBXZWJQTWVtb3J5V3JpdGVyQ2xlYXIoJndydCk7CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVORCBQU0VVRE8gRVhBTVBMRQorCitEZWNvZGluZyBBUEk6Cis9PT09PT09PT09PT09CisKK1RoaXMgaXMgbWFpbmx5IGp1c3Qgb25lIGZ1bmN0aW9uIHRvIGNhbGw6CisKKyNpbmNsdWRlICJ3ZWJwL2RlY29kZS5oIgordWludDhfdCogV2ViUERlY29kZVJHQihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCk7CisKK1BsZWFzZSBoYXZlIGEgbG9vayBhdCB0aGUgZmlsZSBzcmMvd2VicC9kZWNvZGUuaCBmb3IgdGhlIGRldGFpbHMuCitUaGVyZSBhcmUgdmFyaWFudHMgZm9yIGRlY29kaW5nIGluIEJHUi9SR0JBL0FSR0IvQkdSQSBvcmRlciwgYWxvbmcgd2l0aAorZGVjb2RpbmcgdG8gcmF3IFknQ2JDciBzYW1wbGVzLiBPbmUgY2FuIGFsc28gZGVjb2RlIHRoZSBpbWFnZSBkaXJlY3RseSBpbnRvIGEKK3ByZS1hbGxvY2F0ZWQgYnVmZmVyLgorCitUbyBkZXRlY3QgYSBXZWJQIGZpbGUgYW5kIGdhdGhlciB0aGUgcGljdHVyZSdzIGRpbWVuc2lvbnMsIHRoZSBmdW5jdGlvbjoKKyAgaW50IFdlYlBHZXRJbmZvKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCk7CitpcyBzdXBwbGllZC4gTm8gZGVjb2RpbmcgaXMgaW52b2x2ZWQgd2hlbiB1c2luZyBpdC4KKworSW5jcmVtZW50YWwgZGVjb2RpbmcgQVBJOgorPT09PT09PT09PT09PT09PT09PT09PT09PQorCitJbiB0aGUgY2FzZSB3aGVuIGRhdGEgaXMgYmVpbmcgcHJvZ3Jlc3NpdmVseSB0cmFuc21pdHRlZCwgcGljdHVyZXMgY2FuIHN0aWxsCitiZSBpbmNyZW1lbnRhbGx5IGRlY29kZWQgdXNpbmcgYSBzbGlnaHRseSBtb3JlIGNvbXBsaWNhdGVkIEFQSS4gRGVjb2RlciBzdGF0ZQoraXMgc3RvcmVkIGludG8gYW4gaW5zdGFuY2Ugb2YgdGhlIFdlYlBJRGVjb2RlciBvYmplY3QuIFRoaXMgb2JqZWN0IGNhbiBiZQorY3JlYXRlZCB3aXRoIHRoZSBwdXJwb3NlIG9mIGRlY29kaW5nIGVpdGhlciBSR0Igb3IgWSdDYkNyIHNhbXBsZXMuCitGb3IgaW5zdGFuY2U6CisKKyAgV2ViUERlY0J1ZmZlciBidWZmZXI7CisgIFdlYlBJbml0RGVjQnVmZmVyKCZidWZmZXIpOworICBidWZmZXIuY29sb3JzcGFjZSA9IE1PREVfQkdSOworICAuLi4KKyAgV2ViUElEZWNvZGVyKiBpZGVjID0gV2ViUElOZXdEZWNvZGVyKCZidWZmZXIpOworCitBcyBkYXRhIGlzIG1hZGUgcHJvZ3Jlc3NpdmVseSBhdmFpbGFibGUsIHRoaXMgaW5jcmVtZW50YWwtZGVjb2RlciBvYmplY3QKK2NhbiBiZSB1c2VkIHRvIGRlY29kZSB0aGUgcGljdHVyZSBmdXJ0aGVyLiBUaGVyZSBhcmUgdHdvIChtdXR1YWxseSBleGNsdXNpdmUpCit3YXlzIHRvIHBhc3MgZnJlc2hseSBhcnJpdmVkIGRhdGE6CisKK2VpdGhlciBieSBhcHBlbmRpbmcgdGhlIGZyZXNoIGJ5dGVzOgorCisgIFdlYlBJQXBwZW5kKGlkZWMsIGZyZXNoX2RhdGEsIHNpemVfb2ZfZnJlc2hfZGF0YSk7CisKK29yIGJ5IGp1c3QgbWVudGlvbmluZyB0aGUgbmV3IHNpemUgb2YgdGhlIHRyYW5zbWl0dGVkIGRhdGE6CisKKyAgV2ViUElVcGRhdGUoaWRlYywgYnVmZmVyLCBzaXplX29mX3RyYW5zbWl0dGVkX2J1ZmZlcik7CisKK05vdGUgdGhhdCAnYnVmZmVyJyBjYW4gYmUgbW9kaWZpZWQgYmV0d2VlbiBlYWNoIGNhbGwgdG8gV2ViUElVcGRhdGUsIGluCitwYXJ0aWN1bGFyIHdoZW4gdGhlIGJ1ZmZlciBpcyByZXNpemVkIHRvIGFjY29tbW9kYXRlIGxhcmdlciBkYXRhLgorCitUaGVzZSBmdW5jdGlvbnMgd2lsbCByZXR1cm4gdGhlIGRlY29kaW5nIHN0YXR1czogZWl0aGVyIFZQOF9TVEFUVVNfU1VTUEVOREVEIGlmCitkZWNvZGluZyBpcyBub3QgZmluaXNoZWQgeWV0IG9yIFZQOF9TVEFUVVNfT0sgd2hlbiBkZWNvZGluZyBpcyBkb25lLiBBbnkgb3RoZXIKK3N0YXR1cyBpcyBhbiBlcnJvciBjb25kaXRpb24uCisKK1RoZSAnaWRlYycgb2JqZWN0IG11c3QgYWx3YXlzIGJlIHJlbGVhc2VkIChldmVuIHVwb24gYW4gZXJyb3IgY29uZGl0aW9uKSBieQorY2FsbGluZzogV2ViUERlbGV0ZShpZGVjKS4KKworVG8gcmV0cmlldmUgcGFydGlhbGx5IGRlY29kZWQgcGljdHVyZSBzYW1wbGVzLCBvbmUgbXVzdCB1c2UgdGhlIGNvcnJlc3BvbmRpbmcKK21ldGhvZDogV2ViUElEZWNHZXRSR0Igb3IgV2ViUElEZWNHZXRZVVZBLgorSXQgd2lsbCByZXR1cm4gdGhlIGxhc3QgZGlzcGxheWFibGUgcGl4ZWwgcm93LgorCitMYXN0bHksIG5vdGUgdGhhdCBkZWNvZGluZyBjYW4gYWxzbyBiZSBwZXJmb3JtZWQgaW50byBhIHByZS1hbGxvY2F0ZWQgcGl4ZWwKK2J1ZmZlci4gVGhpcyBidWZmZXIgbXVzdCBiZSBwYXNzZWQgd2hlbiBjcmVhdGluZyBhIFdlYlBJRGVjb2RlciwgY2FsbGluZworV2ViUElOZXdSR0IoKSBvciBXZWJQSU5ld1lVVkEoKS4KKworUGxlYXNlIGhhdmUgYSBsb29rIGF0IHRoZSBzcmMvd2VicC9kZWNvZGUuaCBoZWFkZXIgZm9yIGZ1cnRoZXIgZGV0YWlscy4KKworQWR2YW5jZWQgRGVjb2RpbmcgQVBJOgorPT09PT09PT09PT09PT09PT09PT09PQorCitXZWJQIGRlY29kaW5nIHN1cHBvcnRzIGFuIGFkdmFuY2VkIEFQSSB3aGljaCBwcm92aWRlcyBvbi10aGUtZmx5IGNyb3BwaW5nIGFuZAorcmVzY2FsaW5nLCBzb21ldGhpbmcgb2YgZ3JlYXQgdXNlZnVsbmVzcyBvbiBtZW1vcnktY29uc3RyYWluZWQgZW52aXJvbm1lbnRzIGxpa2UKK21vYmlsZSBwaG9uZXMuIEJhc2ljYWxseSwgdGhlIG1lbW9yeSB1c2FnZSB3aWxsIHNjYWxlIHdpdGggdGhlIG91dHB1dCdzIHNpemUsCitub3QgdGhlIGlucHV0J3MsIHdoZW4gb25lIG9ubHkgbmVlZHMgYSBxdWljayBwcmV2aWV3IG9yIGEgem9vbWVkIGluIHBvcnRpb24gb2YKK2FuIG90aGVyd2lzZSB0b28tbGFyZ2UgcGljdHVyZS4gU29tZSBDUFUgY2FuIGJlIHNhdmVkIHRvbywgaW5jaWRlbnRhbGx5LgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCRUdJTiBQU0VVRE8gRVhBTVBMRQorICAgICAvLyBBKSBJbml0IGEgY29uZmlndXJhdGlvbiBvYmplY3QKKyAgICAgV2ViUERlY29kZXJDb25maWcgY29uZmlnOworICAgICBDSEVDSyhXZWJQSW5pdERlY29kZXJDb25maWcoJmNvbmZpZykpOworCisgICAgIC8vIEIpIG9wdGlvbmFsOiByZXRyaWV2ZSB0aGUgYml0c3RyZWFtJ3MgZmVhdHVyZXMuCisgICAgIENIRUNLKFdlYlBHZXRGZWF0dXJlcyhkYXRhLCBkYXRhX3NpemUsICZjb25maWcuaW5wdXQpID09IFZQOF9TVEFUVVNfT0spOworCisgICAgIC8vIEMpIEFkanVzdCAnY29uZmlnJyBvcHRpb25zLCBpZiBuZWVkZWQKKyAgICAgY29uZmlnLm9wdGlvbnMubm9fZmFuY3lfdXBzYW1wbGluZyA9IDE7CisgICAgIGNvbmZpZy5vcHRpb25zLnVzZV9zY2FsaW5nID0gMTsKKyAgICAgY29uZmlnLm9wdGlvbnMuc2NhbGVkX3dpZHRoID0gc2NhbGVkV2lkdGgoKTsKKyAgICAgY29uZmlnLm9wdGlvbnMuc2NhbGVkX2hlaWdodCA9IHNjYWxlZEhlaWdodCgpOworICAgICAvLyBldGMuCisKKyAgICAgLy8gRCkgU3BlY2lmeSAnY29uZmlnJyBvdXRwdXQgb3B0aW9ucyBmb3Igc3BlY2lmeWluZyBvdXRwdXQgY29sb3JzcGFjZS4KKyAgICAgLy8gT3B0aW9uYWxseSB0aGUgZXh0ZXJuYWwgaW1hZ2UgZGVjb2RlIGJ1ZmZlciBjYW4gYWxzbyBiZSBzcGVjaWZpZWQuCisgICAgIGNvbmZpZy5vdXRwdXQuY29sb3JzcGFjZSA9IE1PREVfQkdSQTsKKyAgICAgLy8gT3B0aW9uYWxseSwgdGhlIGNvbmZpZy5vdXRwdXQgY2FuIGJlIHBvaW50ZWQgdG8gYW4gZXh0ZXJuYWwgYnVmZmVyIGFzCisgICAgIC8vIHdlbGwgZm9yIGRlY29kaW5nIHRoZSBpbWFnZS4gVGhpcyBleHRlcm5hbGx5IHN1cHBsaWVkIG1lbW9yeSBidWZmZXIKKyAgICAgLy8gc2hvdWxkIGJlIGJpZyBlbm91Z2ggdG8gc3RvcmUgdGhlIGRlY29kZWQgcGljdHVyZS4KKyAgICAgY29uZmlnLm91dHB1dC51LlJHQkEucmdiYSA9ICh1aW50OF90KikgbWVtb3J5X2J1ZmZlcjsKKyAgICAgY29uZmlnLm91dHB1dC51LlJHQkEuc3RyaWRlID0gc2NhbmxpbmVfc3RyaWRlOworICAgICBjb25maWcub3V0cHV0LnUuUkdCQS5zaXplID0gdG90YWxfc2l6ZV9vZl90aGVfbWVtb3J5X2J1ZmZlcjsKKyAgICAgY29uZmlnLm91dHB1dC5pc19leHRlcm5hbF9tZW1vcnkgPSAxOworCisgICAgIC8vIEUpIERlY29kZSB0aGUgV2ViUCBpbWFnZS4gVGhlcmUgYXJlIHR3byB2YXJpYW50cyB3LnIudCBkZWNvZGluZyBpbWFnZS4KKyAgICAgLy8gVGhlIGZpcnN0IG9uZSAoRS4xKSBkZWNvZGVzIHRoZSBmdWxsIGltYWdlIGFuZCB0aGUgc2Vjb25kIG9uZSAoRS4yKSBpcworICAgICAvLyB1c2VkIHRvIGluY3JlbWVudGFsbHkgZGVjb2RlIHRoZSBpbWFnZSB1c2luZyBzbWFsbCBpbnB1dCBidWZmZXJzLgorICAgICAvLyBBbnkgb25lIG9mIHRoZXNlIHN0ZXBzIGNhbiBiZSB1c2VkIHRvIGRlY29kZSB0aGUgV2ViUCBpbWFnZS4KKworICAgICAvLyBFLjEpIERlY29kZSBmdWxsIGltYWdlLgorICAgICBDSEVDSyhXZWJQRGVjb2RlKGRhdGEsIGRhdGFfc2l6ZSwgJmNvbmZpZykgPT0gVlA4X1NUQVRVU19PSyk7CisKKyAgICAgLy8gRS4yKSBEZWNvZGUgaW1hZ2UgaW5jcmVtZW50YWxseS4KKyAgICAgV2ViUElEZWNvZGVyKiBjb25zdCBpZGVjID0gV2ViUElEZWNvZGUoTlVMTCwgTlVMTCwgJmNvbmZpZyk7CisgICAgIENIRUNLKGlkZWMgIT0gTlVMTCk7CisgICAgIHdoaWxlIChieXRlc19yZW1haW5pbmcgPiAwKSB7CisgICAgICAgVlA4U3RhdHVzQ29kZSBzdGF0dXMgPSBXZWJQSUFwcGVuZChpZGVjLCBpbnB1dCwgYnl0ZXNfcmVhZCk7CisgICAgICAgaWYgKHN0YXR1cyA9PSBWUDhfU1RBVFVTX09LIHx8IHN0YXR1cyA9PSBWUDhfU1RBVFVTX1NVU1BFTkRFRCkgeworICAgICAgICAgYnl0ZXNfcmVtYWluaW5nIC09IGJ5dGVzX3JlYWQ7CisgICAgICAgfSBlbHNlIHsKKyAgICAgICAgIGJyZWFrOworICAgICAgIH0KKyAgICAgfQorICAgICBXZWJQSURlbGV0ZShpZGVjKTsKKworICAgICAvLyBGKSBEZWNvZGVkIGltYWdlIGlzIG5vdyBpbiBjb25maWcub3V0cHV0IChhbmQgY29uZmlnLm91dHB1dC51LlJHQkEpLgorICAgICAvLyBJdCBjYW4gYmUgc2F2ZWQsIGRpc3BsYXllZCBvciBvdGhlcndpc2UgcHJvY2Vzc2VkLgorCisgICAgIC8vIEcpIFJlY2xhaW0gbWVtb3J5IGFsbG9jYXRlZCBpbiBjb25maWcncyBvYmplY3QuIEl0J3Mgc2FmZSB0byBjYWxsCisgICAgIC8vIHRoaXMgZnVuY3Rpb24gZXZlbiBpZiB0aGUgbWVtb3J5IGlzIGV4dGVybmFsIGFuZCB3YXNuJ3QgYWxsb2NhdGVkCisgICAgIC8vIGJ5IFdlYlBEZWNvZGUoKS4KKyAgICAgV2ViUEZyZWVEZWNCdWZmZXIoJmNvbmZpZy5vdXRwdXQpOworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFTkQgUFNFVURPIEVYQU1QTEUKKworQnVnczoKKz09PT09CisKK1BsZWFzZSByZXBvcnQgYWxsIGJ1Z3MgdG8gdGhlIGlzc3VlIHRyYWNrZXI6CisgICAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3dlYnAKK1BhdGNoZXMgd2VsY29tZSEgU2VlIHRoaXMgcGFnZSB0byBnZXQgc3RhcnRlZDoKKyAgICBodHRwOi8vd3d3LndlYm1wcm9qZWN0Lm9yZy9jb2RlL2NvbnRyaWJ1dGUvc3VibWl0dGluZy1wYXRjaGVzLworCitEaXNjdXNzOgorPT09PT09PT0KKworRW1haWw6IHdlYnAtZGlzY3Vzc0B3ZWJtcHJvamVjdC5vcmcKK1dlYjogaHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2Evd2VibXByb2plY3Qub3JnL2dyb3VwL3dlYnAtZGlzY3VzcwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvUkVBRE1FLmNocm9taXVtIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvUkVBRE1FLmNocm9taXVtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGNhMWNmLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL1JFQURNRS5jaHJvbWl1bQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLU5hbWU6IFdlYlAgaW1hZ2UgZW5jb2Rlci9kZWNvZGVyCi1TaG9ydCBOYW1lOiBsaWJ3ZWJwCi1VUkw6IGh0dHA6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vc3BlZWQvd2VicAotVmVyc2lvbjogdjAuMy4xCi1MaWNlbnNlOiBCU0QKLUxpY2Vuc2UgRmlsZTogTElDRU5TRQotU2VjdXJpdHkgQ3JpdGljYWw6IFllcwotCi1EZXNjcmlwdGlvbjoKLVNvdXJjZSBhcmNoaXZlOgotICBodHRwOi8vY29kZS5nb29nbGUuY29tL3Avd2VicC9kb3dubG9hZHMvZGV0YWlsP25hbWU9bGlid2VicC0wLjMuMS50YXIuZ3oKLQotV2ViUCBpcyBhbiBpbWFnZSBmb3JtYXQgdGhhdCBkb2VzIGJvdGggbG9zc3kgYW5kIGxvc3NsZXNzIGNvbXByZXNzaW9uIG9mCi1kaWdpdGFsIHBob3RvZ3JhcGhpYyBpbWFnZXMuIFdlYlAgY29uc2lzdHMgb2YgYSBjb2RlYyBiYXNlZCBvbiBWUDgsIHRoYXQgR29vZ2xlCi1vcGVuLXNvdXJjZWQgaW4gTWF5IDIwMTAgYW5kIGEgY29udGFpbmVyIGJhc2VkIG9uIFJJRkYuIFdlYm1hc3RlcnMsIHdlYgotZGV2ZWxvcGVycyBhbmQgYnJvd3NlciBkZXZlbG9wZXJzIGNhbiB1c2UgV2ViUCB0byBjb21wcmVzcywgYXJjaGl2ZSBhbmQKLWRpc3RyaWJ1dGUgZGlnaXRhbCBpbWFnZXMgbW9yZSBlZmZpY2llbnRseS4KLQotTG9jYWwgY2hhbmdlczoKLSAqIFJlbW92ZWQgZXhhbXBsZXMvLCBkb2N1bWVudGF0aW9uIGFuZCBidWlsZCByZWxhdGVkIGZpbGVzLCBrZWVwaW5nIG9ubHkKLSAgIHRoZSBjb250ZW50cyBvZiBzcmMvIGxlc3MgbXV4LyB3aGljaCBpcyB1bnVzZWQuCi0gKiBNZXJnZWQgQ09QWUlORy9QQVRFTlRTIHRvIExJQ0VOU0UKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL1JFQURNRS5tdXggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9SRUFETUUubXV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNGY5MmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9SRUFETUUubXV4CkBAIC0wLDAgKzEsMjI3IEBACivvu78gICAgICAgICAgX18gICBfXyAgX19fXyAgX19fXyAgX19fXyAgX18gX18gIF8gICAgIF9fIF9fCisgICAgICAgICAvICBcXC8gIFwvICBfIFwvICBfIFwvICBfIFwvICBcICBcLyBcX19fL18gLyBfXAorICAgICAgICAgXCAgICAgICAvICAgX18vICBfICBcICAgX18vICAgICAgLyAgLyAgKF8vICAvX18KKyAgICAgICAgICBcX19cX18vXF9fX19fL19fX19fL19fLyAgXF9fLy9fL1xfX19fXy9fXy9fX18vdjEuMC4wCisKKworRGVzY3JpcHRpb246Cis9PT09PT09PT09PT0KKworV2ViUE11eDogc2V0IG9mIHR3byBsaWJyYXJpZXMgJ011eCcgYW5kICdEZW11eCcgZm9yIGNyZWF0aW9uLCBleHRyYWN0aW9uIGFuZAorbWFuaXB1bGF0aW9uIG9mIGFuIGV4dGVuZGVkIGZvcm1hdCBXZWJQIGZpbGUsIHdoaWNoIGNhbiBoYXZlIGZlYXR1cmVzIGxpa2UKK2NvbG9yIHByb2ZpbGUsIG1ldGFkYXRhIGFuZCBhbmltYXRpb24uIFJlZmVyZW5jZSBjb21tYW5kLWxpbmUgdG9vbHMgJ3dlYnBtdXgnCithbmQgJ3Z3ZWJwJyBhcyB3ZWxsIGFzIHRoZSBXZWJQIGNvbnRhaW5lciBzcGVjaWZpY2F0aW9uCisnZG9jL3dlYnAtY29udGFpbmVyLXNwZWMudHh0JyBhcmUgYWxzbyBwcm92aWRlZCBpbiB0aGlzIHBhY2thZ2UuCisKK1dlYlAgTXV4IHRvb2w6Cis9PT09PT09PT09PT09PQorCitUaGUgZXhhbXBsZXMvIGRpcmVjdG9yeSBjb250YWlucyBhIHRvb2wgKHdlYnBtdXgpIGZvciBtYW5pcHVsYXRpbmcgV2ViUAorZmlsZXMuIFRoZSB3ZWJwbXV4IHRvb2wgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGFuIGV4dGVuZGVkIGZvcm1hdCBXZWJQIGZpbGUgYW5kCithbHNvIHRvIGV4dHJhY3Qgb3Igc3RyaXAgcmVsZXZhbnQgZGF0YSBmcm9tIHN1Y2ggYSBmaWxlLgorCitBIGxpc3Qgb2Ygb3B0aW9ucyBpcyBhdmFpbGFibGUgdXNpbmcgdGhlIC1oZWxwIGNvbW1hbmQgbGluZSBmbGFnOgorCis+IHdlYnBtdXggLWhlbHAKK1VzYWdlOiB3ZWJwbXV4IC1nZXQgR0VUX09QVElPTlMgSU5QVVQgLW8gT1VUUFVUCisgICAgICAgd2VicG11eCAtc2V0IFNFVF9PUFRJT05TIElOUFVUIC1vIE9VVFBVVAorICAgICAgIHdlYnBtdXggLWR1cmF0aW9uIERVUkFUSU9OX09QVElPTlMgWy1kdXJhdGlvbiAuLi5dCisgICAgICAgICAgICAgICBJTlBVVCAtbyBPVVRQVVQKKyAgICAgICB3ZWJwbXV4IC1zdHJpcCBTVFJJUF9PUFRJT05TIElOUFVUIC1vIE9VVFBVVAorICAgICAgIHdlYnBtdXggLWZyYW1lIEZSQU1FX09QVElPTlMgWy1mcmFtZS4uLl0gWy1sb29wIExPT1BfQ09VTlRdCisgICAgICAgICAgICAgICBbLWJnY29sb3IgQkFDS0dST1VORF9DT0xPUl0gLW8gT1VUUFVUCisgICAgICAgd2VicG11eCAtaW5mbyBJTlBVVAorICAgICAgIHdlYnBtdXggWy1ofC1oZWxwXQorICAgICAgIHdlYnBtdXggLXZlcnNpb24KKyAgICAgICB3ZWJwbXV4IGFyZ3VtZW50X2ZpbGVfbmFtZQorCitHRVRfT1BUSU9OUzoKKyBFeHRyYWN0IHJlbGV2YW50IGRhdGE6CisgICBpY2MgICAgICAgZ2V0IElDQyBwcm9maWxlCisgICBleGlmICAgICAgZ2V0IEVYSUYgbWV0YWRhdGEKKyAgIHhtcCAgICAgICBnZXQgWE1QIG1ldGFkYXRhCisgICBmcmFtZSBuICAgZ2V0IG50aCBmcmFtZQorCitTRVRfT1BUSU9OUzoKKyBTZXQgY29sb3IgcHJvZmlsZS9tZXRhZGF0YToKKyAgIGljYyAgZmlsZS5pY2MgICAgIHNldCBJQ0MgcHJvZmlsZQorICAgZXhpZiBmaWxlLmV4aWYgICAgc2V0IEVYSUYgbWV0YWRhdGEKKyAgIHhtcCAgZmlsZS54bXAgICAgIHNldCBYTVAgbWV0YWRhdGEKKyAgIHdoZXJlOiAgICAnZmlsZS5pY2MnIGNvbnRhaW5zIHRoZSBJQ0MgcHJvZmlsZSB0byBiZSBzZXQsCisgICAgICAgICAgICAgJ2ZpbGUuZXhpZicgY29udGFpbnMgdGhlIEVYSUYgbWV0YWRhdGEgdG8gYmUgc2V0CisgICAgICAgICAgICAgJ2ZpbGUueG1wJyBjb250YWlucyB0aGUgWE1QIG1ldGFkYXRhIHRvIGJlIHNldAorCitEVVJBVElPTl9PUFRJT05TOgorIFNldCBkdXJhdGlvbiBvZiBzZWxlY3RlZCBmcmFtZXM6CisgICBkdXJhdGlvbiAgICAgICAgICAgIHNldCBkdXJhdGlvbiBmb3IgZWFjaCBmcmFtZXMKKyAgIGR1cmF0aW9uLGZyYW1lICAgICAgc2V0IGR1cmF0aW9uIG9mIGEgcGFydGljdWxhciBmcmFtZQorICAgZHVyYXRpb24sc3RhcnQsZW5kICBzZXQgZHVyYXRpb24gb2YgZnJhbWVzIGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWwgW3N0YXJ0LGVuZF0pCisgICB3aGVyZTogJ2R1cmF0aW9uJyBpcyB0aGUgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzCisgICAgICAgICAgJ3N0YXJ0JyBpcyB0aGUgc3RhcnQgZnJhbWUgaW5kZXgKKyAgICAgICAgICAnZW5kJyBpcyB0aGUgaW5jbHVzaXZlIGVuZCBmcmFtZSBpbmRleAorICAgICAgICAgICBUaGUgc3BlY2lhbCAnZW5kJyB2YWx1ZSAnMCcgbWVhbnM6IGxhc3QgZnJhbWUuCisKK1NUUklQX09QVElPTlM6CisgU3RyaXAgY29sb3IgcHJvZmlsZS9tZXRhZGF0YToKKyAgIGljYyAgICAgICBzdHJpcCBJQ0MgcHJvZmlsZQorICAgZXhpZiAgICAgIHN0cmlwIEVYSUYgbWV0YWRhdGEKKyAgIHhtcCAgICAgICBzdHJpcCBYTVAgbWV0YWRhdGEKKworRlJBTUVfT1BUSU9OUyhpKToKKyBDcmVhdGUgYW5pbWF0aW9uOgorICAgZmlsZV9pICtkaStbeGkreWlbK21pW2JpXV1dCisgICB3aGVyZTogICAgJ2ZpbGVfaScgaXMgdGhlIGkndGggYW5pbWF0aW9uIGZyYW1lIChXZWJQIGZvcm1hdCksCisgICAgICAgICAgICAgJ2RpJyBpcyB0aGUgcGF1c2UgZHVyYXRpb24gYmVmb3JlIG5leHQgZnJhbWUsCisgICAgICAgICAgICAgJ3hpJywneWknIHNwZWNpZnkgdGhlIGltYWdlIG9mZnNldCBmb3IgdGhpcyBmcmFtZSwKKyAgICAgICAgICAgICAnbWknIGlzIHRoZSBkaXNwb3NlIG1ldGhvZCBmb3IgdGhpcyBmcmFtZSAoMCBvciAxKSwKKyAgICAgICAgICAgICAnYmknIGlzIHRoZSBibGVuZGluZyBtZXRob2QgZm9yIHRoaXMgZnJhbWUgKCtiIG9yIC1iKQorCitMT09QX0NPVU5UOgorIE51bWJlciBvZiB0aW1lcyB0byByZXBlYXQgdGhlIGFuaW1hdGlvbi4KKyBWYWxpZCByYW5nZSBpcyAwIHRvIDY1NTM1IFtEZWZhdWx0OiAwIChpbmZpbml0ZSldLgorCitCQUNLR1JPVU5EX0NPTE9SOgorIEJhY2tncm91bmQgY29sb3Igb2YgdGhlIGNhbnZhcy4KKyAgQSxSLEcsQgorICB3aGVyZTogICAgJ0EnLCAnUicsICdHJyBhbmQgJ0InIGFyZSBpbnRlZ2VycyBpbiB0aGUgcmFuZ2UgMCB0byAyNTUgc3BlY2lmeWluZworICAgICAgICAgICAgdGhlIEFscGhhLCBSZWQsIEdyZWVuIGFuZCBCbHVlIGNvbXBvbmVudCB2YWx1ZXMgcmVzcGVjdGl2ZWx5CisgICAgICAgICAgICBbRGVmYXVsdDogMjU1LDI1NSwyNTUsMjU1XQorCitJTlBVVCAmIE9VVFBVVCBhcmUgaW4gV2ViUCBmb3JtYXQuCisKK05vdGU6IFRoZSBuYXR1cmUgb2YgRVhJRiwgWE1QIGFuZCBJQ0MgZGF0YSBpcyBub3QgY2hlY2tlZCBhbmQgaXMgYXNzdW1lZCB0byBiZQordmFsaWQuCisKK05vdGU6IGlmIGEgc2luZ2xlIGZpbGUgbmFtZSBpcyBwYXNzZWQgYXMgdGhlIGFyZ3VtZW50LCB0aGUgYXJndW1lbnRzIHdpbGwgYmUKK3Rva2VuaXplZCBmcm9tIHRoaXMgZmlsZS4gVGhlIGZpbGUgbmFtZSBtdXN0IG5vdCBzdGFydCB3aXRoIHRoZSBjaGFyYWN0ZXIgJy0nLgorCitWaXN1YWxpemF0aW9uIHRvb2w6Cis9PT09PT09PT09PT09PT09PT09CisKK1RoZSBleGFtcGxlcy8gZGlyZWN0b3J5IGFsc28gY29udGFpbnMgYSB0b29sICh2d2VicCkgZm9yIHZpZXdpbmcgV2ViUCBmaWxlcy4KK0l0IGRlY29kZXMgdGhlIGltYWdlIGFuZCB2aXN1YWxpemVzIGl0IHVzaW5nIE9wZW5HTC4gU2VlIHRoZSBsaWJ3ZWJwIFJFQURNRQorZm9yIGRldGFpbHMgb24gYnVpbGRpbmcgYW5kIHJ1bm5pbmcgdGhpcyBwcm9ncmFtLgorCitNdXggQVBJOgorPT09PT09PT0KK1RoZSBNdXggQVBJIGNvbnRhaW5zIG1ldGhvZHMgZm9yIGFkZGluZyBkYXRhIHRvIGFuZCByZWFkaW5nIGRhdGEgZnJvbSBXZWJQCitmaWxlcy4gVGhpcyBBUEkgY3VycmVudGx5IHN1cHBvcnRzIFhNUC9FWElGIG1ldGFkYXRhLCBJQ0MgcHJvZmlsZSBhbmQgYW5pbWF0aW9uLgorT3RoZXIgZmVhdHVyZXMgbWF5IGJlIGFkZGVkIGluIHN1YnNlcXVlbnQgcmVsZWFzZXMuCisKK0V4YW1wbGUjMSAocHNldWRvIGNvZGUpOiBDcmVhdGluZyBhIFdlYlBNdXggb2JqZWN0IHdpdGggaW1hZ2UgZGF0YSwgY29sb3IKK3Byb2ZpbGUgYW5kIFhNUCBtZXRhZGF0YS4KKworICBpbnQgY29weV9kYXRhID0gMDsKKyAgV2ViUE11eCogbXV4ID0gV2ViUE11eE5ldygpOworICAvLyAuLi4gKFByZXBhcmUgaW1hZ2UgZGF0YSkuCisgIFdlYlBNdXhTZXRJbWFnZShtdXgsICZpbWFnZSwgY29weV9kYXRhKTsKKyAgLy8gLi4uIChQcmVwYXJlIElDQyBwcm9maWxlIGRhdGEpLgorICBXZWJQTXV4U2V0Q2h1bmsobXV4LCAiSUNDUCIsICZpY2NfcHJvZmlsZSwgY29weV9kYXRhKTsKKyAgLy8gLi4uIChQcmVwYXJlIFhNUCBtZXRhZGF0YSkuCisgIFdlYlBNdXhTZXRDaHVuayhtdXgsICJYTVAgIiwgJnhtcCwgY29weV9kYXRhKTsKKyAgLy8gR2V0IGRhdGEgZnJvbSBtdXggaW4gV2ViUCBSSUZGIGZvcm1hdC4KKyAgV2ViUE11eEFzc2VtYmxlKG11eCwgJm91dHB1dF9kYXRhKTsKKyAgV2ViUE11eERlbGV0ZShtdXgpOworICAvLyAuLi4gKENvbnN1bWUgb3V0cHV0X2RhdGE7IGUuZy4gd3JpdGUgb3V0cHV0X2RhdGEuYnl0ZXMgdG8gZmlsZSkuCisgIFdlYlBEYXRhQ2xlYXIoJm91dHB1dF9kYXRhKTsKKworCitFeGFtcGxlIzIgKHBzZXVkbyBjb2RlKTogR2V0IGltYWdlIGFuZCBjb2xvciBwcm9maWxlIGRhdGEgZnJvbSBhIFdlYlAgZmlsZS4KKworICBpbnQgY29weV9kYXRhID0gMDsKKyAgLy8gLi4uIChSZWFkIGRhdGEgZnJvbSBmaWxlKS4KKyAgV2ViUE11eCogbXV4ID0gV2ViUE11eENyZWF0ZSgmZGF0YSwgY29weV9kYXRhKTsKKyAgV2ViUE11eEdldEZyYW1lKG11eCwgMSwgJmltYWdlKTsKKyAgLy8gLi4uIChDb25zdW1lIGltYWdlOyBlLmcuIGNhbGwgV2ViUERlY29kZSgpIHRvIGRlY29kZSB0aGUgZGF0YSkuCisgIFdlYlBNdXhHZXRDaHVuayhtdXgsICJJQ0NQIiwgJmljY19wcm9maWxlKTsKKyAgLy8gLi4uIChDb25zdW1lIGljY19wcm9maWxlKS4KKyAgV2ViUE11eERlbGV0ZShtdXgpOworICBmcmVlKGRhdGEpOworCisKK0ZvciBhIGRldGFpbGVkIE11eCBBUEkgcmVmZXJlbmNlLCBwbGVhc2UgcmVmZXIgdG8gdGhlIGhlYWRlciBmaWxlCisoc3JjL3dlYnAvbXV4LmgpLgorCitEZW11eCBBUEk6Cis9PT09PT09PT09CitUaGUgRGVtdXggQVBJIGVuYWJsZXMgZXh0cmFjdGlvbiBvZiBpbWFnZXMgYW5kIGV4dGVuZGVkIGZvcm1hdCBkYXRhIGZyb20KK1dlYlAgZmlsZXMuIFRoaXMgQVBJIGN1cnJlbnRseSBzdXBwb3J0cyByZWFkaW5nIG9mIFhNUC9FWElGIG1ldGFkYXRhLCBJQ0MKK3Byb2ZpbGUgYW5kIGFuaW1hdGVkIGltYWdlcy4gT3RoZXIgZmVhdHVyZXMgbWF5IGJlIGFkZGVkIGluIHN1YnNlcXVlbnQKK3JlbGVhc2VzLgorCitDb2RlIGV4YW1wbGU6IERlbXV4aW5nIFdlYlAgZGF0YSB0byBleHRyYWN0IGFsbCB0aGUgZnJhbWVzLCBJQ0MgcHJvZmlsZQorYW5kIEVYSUYvWE1QIG1ldGFkYXRhLgorCisgIFdlYlBEZW11eGVyKiBkZW11eCA9IFdlYlBEZW11eCgmd2VicF9kYXRhKTsKKyAgdWludDMyX3Qgd2lkdGggPSBXZWJQRGVtdXhHZXRJKGRlbXV4LCBXRUJQX0ZGX0NBTlZBU19XSURUSCk7CisgIHVpbnQzMl90IGhlaWdodCA9IFdlYlBEZW11eEdldEkoZGVtdXgsIFdFQlBfRkZfQ0FOVkFTX0hFSUdIVCk7CisgIC8vIC4uLiAoR2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBmZWF0dXJlcyBwcmVzZW50IGluIHRoZSBXZWJQIGZpbGUpLgorICB1aW50MzJfdCBmbGFncyA9IFdlYlBEZW11eEdldEkoZGVtdXgsIFdFQlBfRkZfRk9STUFUX0ZMQUdTKTsKKworICAvLyAuLi4gKEl0ZXJhdGUgb3ZlciBhbGwgZnJhbWVzKS4KKyAgV2ViUEl0ZXJhdG9yIGl0ZXI7CisgIGlmIChXZWJQRGVtdXhHZXRGcmFtZShkZW11eCwgMSwgJml0ZXIpKSB7CisgICAgZG8geworICAgICAgLy8gLi4uIChDb25zdW1lICdpdGVyJzsgZS5nLiBEZWNvZGUgJ2l0ZXIuZnJhZ21lbnQnIHdpdGggV2ViUERlY29kZSgpLAorICAgICAgLy8gLi4uIGFuZCBnZXQgb3RoZXIgZnJhbWUgcHJvcGVydGllcyBsaWtlIHdpZHRoLCBoZWlnaHQsIG9mZnNldHMgZXRjLgorICAgICAgLy8gLi4uIHNlZSAnc3RydWN0IFdlYlBJdGVyYXRvcicgYmVsb3cgZm9yIG1vcmUgaW5mbykuCisgICAgfSB3aGlsZSAoV2ViUERlbXV4TmV4dEZyYW1lKCZpdGVyKSk7CisgICAgV2ViUERlbXV4UmVsZWFzZUl0ZXJhdG9yKCZpdGVyKTsKKyAgfQorCisgIC8vIC4uLiAoRXh0cmFjdCBtZXRhZGF0YSkuCisgIFdlYlBDaHVua0l0ZXJhdG9yIGNodW5rX2l0ZXI7CisgIGlmIChmbGFncyAmIElDQ1BfRkxBRykgV2ViUERlbXV4R2V0Q2h1bmsoZGVtdXgsICJJQ0NQIiwgMSwgJmNodW5rX2l0ZXIpOworICAvLyAuLi4gKENvbnN1bWUgdGhlIElDQyBwcm9maWxlIGluICdjaHVua19pdGVyLmNodW5rJykuCisgIFdlYlBEZW11eFJlbGVhc2VDaHVua0l0ZXJhdG9yKCZjaHVua19pdGVyKTsKKyAgaWYgKGZsYWdzICYgRVhJRl9GTEFHKSBXZWJQRGVtdXhHZXRDaHVuayhkZW11eCwgIkVYSUYiLCAxLCAmY2h1bmtfaXRlcik7CisgIC8vIC4uLiAoQ29uc3VtZSB0aGUgRVhJRiBtZXRhZGF0YSBpbiAnY2h1bmtfaXRlci5jaHVuaycpLgorICBXZWJQRGVtdXhSZWxlYXNlQ2h1bmtJdGVyYXRvcigmY2h1bmtfaXRlcik7CisgIGlmIChmbGFncyAmIFhNUF9GTEFHKSBXZWJQRGVtdXhHZXRDaHVuayhkZW11eCwgIlhNUCAiLCAxLCAmY2h1bmtfaXRlcik7CisgIC8vIC4uLiAoQ29uc3VtZSB0aGUgWE1QIG1ldGFkYXRhIGluICdjaHVua19pdGVyLmNodW5rJykuCisgIFdlYlBEZW11eFJlbGVhc2VDaHVua0l0ZXJhdG9yKCZjaHVua19pdGVyKTsKKyAgV2ViUERlbXV4RGVsZXRlKGRlbXV4KTsKKworCitGb3IgYSBkZXRhaWxlZCBEZW11eCBBUEkgcmVmZXJlbmNlLCBwbGVhc2UgcmVmZXIgdG8gdGhlIGhlYWRlciBmaWxlCisoc3JjL3dlYnAvZGVtdXguaCkuCisKK0FuaW1FbmNvZGVyIEFQSToKKz09PT09PT09PT09PT09PT0KK1RoZSBBbmltRW5jb2RlciBBUEkgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGFuaW1hdGVkIFdlYlAgaW1hZ2VzLgorCitDb2RlIGV4YW1wbGU6CisKKyAgV2ViUEFuaW1FbmNvZGVyT3B0aW9ucyBlbmNfb3B0aW9uczsKKyAgV2ViUEFuaW1FbmNvZGVyT3B0aW9uc0luaXQoJmVuY19vcHRpb25zKTsKKyAgLy8gLi4uIChUdW5lICdlbmNfb3B0aW9ucycgYXMgbmVlZGVkKS4KKyAgV2ViUEFuaW1FbmNvZGVyKiBlbmMgPSBXZWJQQW5pbUVuY29kZXJOZXcod2lkdGgsIGhlaWdodCwgJmVuY19vcHRpb25zKTsKKyAgd2hpbGUoPHRoZXJlIGFyZSBtb3JlIGZyYW1lcz4pIHsKKyAgICBXZWJQQ29uZmlnIGNvbmZpZzsKKyAgICBXZWJQQ29uZmlnSW5pdCgmY29uZmlnKTsKKyAgICAvLyAuLi4gKFR1bmUgJ2NvbmZpZycgYXMgbmVlZGVkKS4KKyAgICBXZWJQQW5pbUVuY29kZXJBZGQoZW5jLCBmcmFtZSwgZHVyYXRpb24sICZjb25maWcpOworICB9CisgIFdlYlBBbmltRW5jb2RlckFzc2VtYmxlKGVuYywgd2VicF9kYXRhKTsKKyAgV2ViUEFuaW1FbmNvZGVyRGVsZXRlKGVuYyk7CisgIC8vIC4uLiAoV3JpdGUgdGhlICd3ZWJwX2RhdGEnIHRvIGEgZmlsZSwgb3IgcmUtbXV4IGl0IGZ1cnRoZXIpLgorCisKK0ZvciBhIGRldGFpbGVkIEFuaW1FbmNvZGVyIEFQSSByZWZlcmVuY2UsIHBsZWFzZSByZWZlciB0byB0aGUgaGVhZGVyIGZpbGUKKyhzcmMvd2VicC9tdXguaCkuCisKKworQnVnczoKKz09PT09CisKK1BsZWFzZSByZXBvcnQgYWxsIGJ1Z3MgdG8gdGhlIGlzc3VlIHRyYWNrZXI6CisgICAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3dlYnAKK1BhdGNoZXMgd2VsY29tZSEgU2VlIHRoaXMgcGFnZSB0byBnZXQgc3RhcnRlZDoKKyAgICBodHRwOi8vd3d3LndlYm1wcm9qZWN0Lm9yZy9jb2RlL2NvbnRyaWJ1dGUvc3VibWl0dGluZy1wYXRjaGVzLworCitEaXNjdXNzOgorPT09PT09PT0KKworRW1haWw6IHdlYnAtZGlzY3Vzc0B3ZWJtcHJvamVjdC5vcmcKK1dlYjogaHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2Evd2VibXByb2plY3Qub3JnL2dyb3VwL3dlYnAtZGlzY3VzcwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvUkVBRE1FLndlYnBfanMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9SRUFETUUud2VicF9qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODA1MzU0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvUkVBRE1FLndlYnBfanMKQEAgLTAsMCArMSw3NiBAQAorICAgICBfXyAgIF9fIF9fX18gX19fXyBfX19fICAgICBfXyAgX19fXworICAgIC8gIFxcLyAgXCAgXyBcICBfIFwgIF8gXCAgIChfXykvICBfX1wKKyAgICBcICAgICAgIC8gIF9fLyBfICBcICBfXy8gICBfKSAgXF8gICBcCisgICAgIFxfX1xfXy9fX19fXy9fX19fL18vICAgICAvX19fXy9fX19fLworCitEZXNjcmlwdGlvbjoKKz09PT09PT09PT09PQorCitUaGlzIGZpbGUgZGVzY3JpYmVzIHRoZSBjb21waWxhdGlvbiBvZiBsaWJ3ZWJwIGludG8gYSBKYXZhU2NyaXB0IGRlY29kZXIKK3VzaW5nIEVtc2NyaXB0ZW4gYW5kIENNYWtlLgorCisgLSBpbnN0YWxsIHRoZSBFbXNjcmlwdGVuIFNESyBmb2xsb3dpbmcgdGhlIHByb2NlZHVyZSBkZXNjcmliZWQgYXQ6CisgICBodHRwczovL2tyaXBrZW4uZ2l0aHViLmlvL2Vtc2NyaXB0ZW4tc2l0ZS9kb2NzL2dldHRpbmdfc3RhcnRlZC9kb3dubG9hZHMuaHRtbAorICAgQWZ0ZXIgaW5zdGFsbGF0aW9uLCB5b3Ugc2hvdWxkIGhhdmUgc29tZSBnbG9iYWwgdmFyaWFibGUgcG9zaXRpb25lZCB0byB0aGUKKyAgIGxvY2F0aW9uIG9mIHRoZSBTREsuIEluIHBhcnRpY3VsYXIsICRFTVNDUklQVEVOIHNob3VsZCBwb2ludCB0byB0aGUKKyAgIHRvcC1sZXZlbCBkaXJlY3RvcnkgY29udGFpbmluZyBFbXNjcmlwdGVuIHRvb2xzLgorCisgLSBtYWtlIHN1cmUgdGhlIGZpbGUgJEVNU0NSSVBURU4vY21ha2UvTW9kdWxlcy9QbGF0Zm9ybS9FbXNjcmlwdGVuLmNtYWtlIGlzCisgICBhY2Nlc3NpYmxlLiBUaGlzIGlzIHRoZSB0b29sY2hhaW4gZmlsZSB1c2VkIGJ5IENNYWtlIHRvIGludm9rZSBFbXNjcmlwdGVuLgorCisgLSBjb25maWd1cmUgdGhlIHByb2plY3QgJ1dFQlBfSlMnIHdpdGggQ01ha2UgdXNpbmc6CisKKyBjZCB3ZWJwX2pzICYmIFwKKyBjbWFrZSAtRFdFQlBfQlVJTERfV0VCUF9KUz1PTiBcCisgICAgICAgLURFTVNDUklQVEVOX0dFTkVSQVRFX0JJVENPREVfU1RBVElDX0xJQlJBUklFUz0xIFwKKyAgICAgICAtRENNQUtFX1RPT0xDSEFJTl9GSUxFPSRFTVNDUklQVEVOL2NtYWtlL01vZHVsZXMvUGxhdGZvcm0vRW1zY3JpcHRlbi5jbWFrZSBcCisgICAgICAgLi4vCisKKyAtIGNvbXBpbGUgd2VicC5qcyB1c2luZyAnbWFrZScuCisKKyAtIHRoYXQncyBpdCEgVXBvbiBjb21wbGV0aW9uLCB5b3Ugc2hvdWxkIGhhdmUgdGhlIHdlYnAuanMgYW5kCisgICB3ZWJwLmpzLm1lbSBmaWxlcyBnZW5lcmF0ZWQuCisKK1RoZSBjYWxsYWJsZSBKYXZhU2NyaXB0IGZ1bmN0aW9uIGlzIFdlYlBUb1NETCgpLCB3aGljaCBkZWNvZGVzIGEgcmF3IFdlYlAKK2JpdHN0cmVhbSBpbnRvIGEgY2FudmFzLiBTZWUgd2VicF9qcy9pbmRleC5odG1sIGZvciBhIHNpbXBsZSB1c2FnZSBzYW1wbGUKKyhzZWUgYmVsb3cgZm9yIGluc3RydWN0aW9ucykuCisKK0RlbW8gSFRNTCBwYWdlOgorPT09PT09PT09PT09PT09CisKKyAgIFRoZSBIVE1MIHBhZ2Ugd2VicF9qcy9pbmRleC5odG1sIHJlcXVpcmVzIGFuIEhUVFAgc2VydmVyIHRvIHNlcnZlIHRoZSBXZWJQCisgICBpbWFnZSBleGFtcGxlLiBJdCdzIGVhc3kgdG8ganVzdCB1c2UgUHl0aG9uIGZvciB0aGF0LgorCitjZCB3ZWJwX2pzICYmIHB5dGhvbiAtbSBTaW1wbGVIVFRQU2VydmVyIDgwODAKKworYW5kIHRoZW4gbmF2aWdhdGUgdG8gaHR0cDovL2xvY2FsaG9zdDo4MDgwIGluIHlvdXIgZmF2b3JpdGUgYnJvd3Nlci4KKworCitXZWItQXNzZW1ibHkgKFdBU00pIHZlcnNpb246Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgQ01ha2VMaXN0cy50eHQgaXMgY29uZmlndXJlZCB0byBidWlsZCB0aGUgV0FTTSB2ZXJzaW9uIHdoZW4gdXNpbmcKKyAgdGhlIG9wdGlvbiBXRUJQX0JVSUxEX1dFQlBfSlM9T04uIFRoZSBjb21waWxhdGlvbiBzdGVwIHdpbGwgYXNzZW1ibGUKKyAgdGhlIGZpbGVzICd3ZWJwX3dhc20uanMnLCAnd2VicF93YXNtLndhc20nIGluIHRoZSB3ZWJwX2pzLyBkaXJlY3RvcnkuCisgIFNlZSB3ZWJwX2pzL2luZGV4X3dhc20uaHRtbCBmb3IgYSBzaW1wbGUgZGVtbyBwYWdlIHVzaW5nIHRoZSBXQVNNIHZlcnNpb24KKyAgb2YgdGhlIGxpYnJhcnkuCisKKyAgWW91IHdpbGwgbmVlZCBhIGZhaXJseSByZWNlbnQgdmVyc2lvbiBvZiBFbXNjcmlwdGVuIChhdCBsZWFzdCAxLjM3LjgpIGFuZCBvZgorICB5b3VyIFdBU00tZW5hYmxlZCBicm93c2VyIHRvIHJ1biB0aGlzIHZlcnNpb24uIENvbnNpZGVyIGl0IHZlcnkgZXhwZXJpbWVudGFsIQorCitDYXZlYXQ6Cis9PT09PT09CisKKyAgLSBGaXJzdCBkZWNvZGluZyB1c2luZyB0aGUgbGlicmFyeSBpcyB1c3VhbGx5IHNsb3dlciwgZHVlIHRvIGp1c3QtaW4tdGltZQorICAgIGNvbXBpbGF0aW9uLgorCisgIC0gU29tZSB2ZXJzaW9ucyBvZiBsbHZtIHByb2R1Y2UgdGhlIGZvbGxvd2luZyBjb21waWxlIGVycm9yIHdoZW4gU1NFMiBpcworICAgIGVuYWJsZWQuCisKKyJVbnN1cHBvcnRlZDogICAlNTE2ID0gYml0Y2FzdCA8OCB4IGkxNj4gJTQ4MSB0byBpMTI4CisgTExWTSBFUlJPUjogQml0Q2FzdCBJbnN0cnVjdGlvbiBub3QgeWV0IHN1cHBvcnRlZCBmb3IgaW50ZWdlciB0eXBlcyBsYXJnZXIgdGhhbiA2NCBiaXRzIgorCisgICAgVGhlIGNvcnJlc3BvbmRpbmcgRW1zY3JpcHRlbiBidWcgaXMgYXQ6CisgICAgaHR0cHM6Ly9naXRodWIuY29tL2tyaXBrZW4vZW1zY3JpcHRlbi9pc3N1ZXMvMzc4OAorCisgICAgVGhlcmVmb3JlLCBTU0UyIG9wdGltaXphdGlvbiBpcyBjdXJyZW50bHkgZGlzYWJsZWQgaW4gQ01ha2VMaXN0cy50eHQuCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9hdXRvZ2VuLnNoIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvYXV0b2dlbi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44ZWY5YmFiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvYXV0b2dlbi5zaApAQCAtMCwwICsxLDIgQEAKKyMhIC9iaW4vc2ggLWUKK2V4ZWMgYXV0b3JlY29uZiAtZmkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2J1aWxkLmdyYWRsZSBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2J1aWxkLmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGFkMTI5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvYnVpbGQuZ3JhZGxlCkBAIC0wLDAgKzEsNDM5IEBACisvLyBEZWZpbmUgZGVwZW5kZW5jaWVzLgorYnVpbGRzY3JpcHQgeworICByZXBvc2l0b3JpZXMgeworICAgIG1hdmVuIHsKKyAgICAgIHVybCAiaHR0cHM6Ly9qY2VudGVyLmJpbnRyYXkuY29tIgorICAgIH0KKyAgfQorICBkZXBlbmRlbmNpZXMgeworICAgIGNsYXNzcGF0aCAiY29tLmFuZHJvaWQudG9vbHMuYnVpbGQ6Z3JhZGxlOiR7QU5EUk9JRF9HUkFETEVfUExVR0lOX1ZFUlNJT059IgorICB9Cit9CisKKy8vIERlZmluZSB2ZXJzaW9ucyBpbiB0aGUgcHJvamVjdC4KK3Byb2plY3QuZXh0IHsKKyAgYnVpbGRUb29sc1ZlcnNpb24gPSAiJHtCVUlMRF9UT09MU19WRVJTSU9OfSIKKyAgY29tcGlsZVNka1ZlcnNpb24gPSBDT01QSUxFX1NES19WRVJTSU9OLnRvSW50ZWdlcigpCit9CisKKy8vIENvcmUgbGlicmFyaWVzIGFuZCBleGVjdXRhYmxlcy4KK2FwcGx5IHBsdWdpbjogImMiCitkZWYgTkVPTgorbW9kZWwgeworICBidWlsZFR5cGVzIHsKKyAgICBkZWJ1ZworICAgIHJlbGVhc2UKKyAgfQorICBwbGF0Zm9ybXMgeworICAgIGFybSB7CisgICAgICBhcmNoaXRlY3R1cmUgImFybSIKKyAgICB9CisgICAgYXJtNjQgeworICAgICAgYXJjaGl0ZWN0dXJlICJhcm02NCIKKyAgICB9CisgICAgeDg2IHsKKyAgICAgIGFyY2hpdGVjdHVyZSAieDg2IgorICAgIH0KKyAgICB4NjQgeworICAgICAgYXJjaGl0ZWN0dXJlICJ4ODZfNjQiCisgICAgfQorICAgIG1pcHMzMnIyCisgICAgbWlwczMycjUKKyAgICBtaXBzNjRyNgorICB9CisgIHRvb2xDaGFpbnMgeworICAgIGdjYyhHY2MpIHsKKyAgICAgIHRhcmdldCgibWlwczMycjIiKSB7CisgICAgICAgIGNDb21waWxlci5hcmdzICItbWlwczMycjIiCisgICAgICB9CisgICAgICB0YXJnZXQoIm1pcHMzMnI1IikgeworICAgICAgICBjQ29tcGlsZXIuYXJncyAiLW1pcHMzMnI1IgorICAgICAgfQorICAgICAgdGFyZ2V0KCJtaXBzNjRyNiIpIHsKKyAgICAgICAgY0NvbXBpbGVyLmFyZ3MgIi1taXBzNjRyNiIKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgYmluYXJpZXMgeworICAgIGFsbCB7CisgICAgICBpZiAodG9vbENoYWluIGluIEdjYykgeworICAgICAgICBjQ29tcGlsZXIuYXJncyAiLWZQSUMiCisgICAgICAgIGNDb21waWxlci5hcmdzICItV2FsbCIKKyAgICAgICAgY0NvbXBpbGVyLmRlZmluZSAiQU5EUk9JRCIKKyAgICAgICAgY0NvbXBpbGVyLmRlZmluZSAiSEFWRV9NQUxMT0NfSCIKKyAgICAgIH0KKyAgICAgIC8vIE9wdGltaXphdGlvbnMuCisgICAgICBpZiAoYnVpbGRUeXBlID09IGJ1aWxkVHlwZXMucmVsZWFzZSkgeworICAgICAgICBpZiAodG9vbENoYWluIGluIEdjYykgeworICAgICAgICAgIGNDb21waWxlci5hcmdzICItZmlubGluZS1mdW5jdGlvbnMiCisgICAgICAgICAgY0NvbXBpbGVyLmFyZ3MgIi1mZmFzdC1tYXRoIgorICAgICAgICAgIGNDb21waWxlci5hcmdzICItZmZ1bmN0aW9uLXNlY3Rpb25zIgorICAgICAgICAgIGNDb21waWxlci5hcmdzICItZmRhdGEtc2VjdGlvbnMiCisgICAgICAgIH0KKyAgICAgICAgaWYgKHRvb2xDaGFpbiBpbiBDbGFuZykgeworICAgICAgICAgIGNDb21waWxlci5hcmdzICItZnJlbmFtZS1yZWdpc3RlcnMgLXMiCisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8vIG1pcHMzMiBmYWlscyB0byBidWlsZCB3aXRoIGNsYW5nIGZyb20gcjE0YgorICAgICAgLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3dlYnAvaXNzdWVzL2RldGFpbD9pZD0zNDMKKyAgICAgIGlmICh0b29sQ2hhaW4gaW4gQ2xhbmcpIHsKKyAgICAgICAgaWYgKGdldFRhcmdldFBsYXRmb3JtKCkgPT0gIm1pcHMiKSB7CisgICAgICAgICAgY0NvbXBpbGVyLmFyZ3MgIi1uby1pbnRlZ3JhdGVkLWFzIgorICAgICAgICB9CisgICAgICB9CisgICAgICAvLyBDaGVjayBmb3IgTkVPTiB1c2FnZS4KKyAgICAgIGlmIChnZXRUYXJnZXRQbGF0Zm9ybSgpID09ICJhcm0iKSB7CisgICAgICAgIE5FT04gPSAiYy5uZW9uIgorICAgICAgICBjQ29tcGlsZXIuZGVmaW5lICJIQVZFX0NQVV9GRUFUVVJFU19IIgorICAgICAgfSBlbHNlIHsKKyAgICAgICAgTkVPTiA9ICJjIgorICAgICAgfQorCisgICAgICBjQ29tcGlsZXIuYXJncyAiLUkiICsgZmlsZSgiLiIpLmFic29sdXRlUGF0aAorICAgIH0KKyAgICAvLyBMaW5rIHRvIHB0aHJlYWQgZm9yIHNoYXJlZCBsaWJyYXJpZXMuCisgICAgd2l0aFR5cGUoU2hhcmVkTGlicmFyeUJpbmFyeVNwZWMpIHsKKyAgICAgIGlmICh0b29sQ2hhaW4gaW4gR2NjKSB7CisgICAgICAgIGNDb21waWxlci5kZWZpbmUgIkhBVkVfUFRIUkVBRCIKKyAgICAgICAgY0NvbXBpbGVyLmRlZmluZSAiV0VCUF9VU0VfVEhSRUFEIgorICAgICAgICBsaW5rZXIuYXJncyAiLXB0aHJlYWQiCisgICAgICB9CisgICAgfQorICB9CisgIGNvbXBvbmVudHMgeworICAgIHdlYnAoTmF0aXZlTGlicmFyeVNwZWMpIHsKKyAgICAgIHNvdXJjZXMgeworICAgICAgICBjIHsKKyAgICAgICAgICBzb3VyY2UgeworICAgICAgICAgICAgc3JjRGlyICJzcmMvZGVjIgorICAgICAgICAgICAgaW5jbHVkZSAiYWxwaGFfZGVjLmMiCisgICAgICAgICAgICBpbmNsdWRlICJidWZmZXJfZGVjLmMiCisgICAgICAgICAgICBpbmNsdWRlICJmcmFtZV9kZWMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImlkZWNfZGVjLmMiCisgICAgICAgICAgICBpbmNsdWRlICJpb19kZWMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgInF1YW50X2RlYy5jIgorICAgICAgICAgICAgaW5jbHVkZSAidHJlZV9kZWMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgInZwOF9kZWMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgInZwOGxfZGVjLmMiCisgICAgICAgICAgICBpbmNsdWRlICJ3ZWJwX2RlYy5jIgorICAgICAgICAgICAgc3JjRGlyICJzcmMvZHNwIgorICAgICAgICAgICAgaW5jbHVkZSAiYWxwaGFfcHJvY2Vzc2luZy5jIgorICAgICAgICAgICAgaW5jbHVkZSAiYWxwaGFfcHJvY2Vzc2luZ19taXBzX2RzcF9yMi5jIgorICAgICAgICAgICAgaW5jbHVkZSAiYWxwaGFfcHJvY2Vzc2luZ19uZW9uLiRORU9OIgorICAgICAgICAgICAgaW5jbHVkZSAiYWxwaGFfcHJvY2Vzc2luZ19zc2UyLmMiCisgICAgICAgICAgICBpbmNsdWRlICJhbHBoYV9wcm9jZXNzaW5nX3NzZTQxLmMiCisgICAgICAgICAgICBpbmNsdWRlICJjcHUuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImRlYy5jIgorICAgICAgICAgICAgaW5jbHVkZSAiZGVjX2NsaXBfdGFibGVzLmMiCisgICAgICAgICAgICBpbmNsdWRlICJkZWNfbWlwczMyLmMiCisgICAgICAgICAgICBpbmNsdWRlICJkZWNfbWlwc19kc3BfcjIuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImRlY19tc2EuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImRlY19uZW9uLiRORU9OIgorICAgICAgICAgICAgaW5jbHVkZSAiZGVjX3NzZTIuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImRlY19zc2U0MS5jIgorICAgICAgICAgICAgaW5jbHVkZSAiZmlsdGVycy5jIgorICAgICAgICAgICAgaW5jbHVkZSAiZmlsdGVyc19taXBzX2RzcF9yMi5jIgorICAgICAgICAgICAgaW5jbHVkZSAiZmlsdGVyc19tc2EuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImZpbHRlcnNfbmVvbi4kTkVPTiIKKyAgICAgICAgICAgIGluY2x1ZGUgImZpbHRlcnNfc3NlMi5jIgorICAgICAgICAgICAgaW5jbHVkZSAibG9zc2xlc3MuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImxvc3NsZXNzX21pcHNfZHNwX3IyLmMiCisgICAgICAgICAgICBpbmNsdWRlICJsb3NzbGVzc19tc2EuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImxvc3NsZXNzX25lb24uJE5FT04iCisgICAgICAgICAgICBpbmNsdWRlICJsb3NzbGVzc19zc2UyLmMiCisgICAgICAgICAgICBpbmNsdWRlICJyZXNjYWxlci5jIgorICAgICAgICAgICAgaW5jbHVkZSAicmVzY2FsZXJfbWlwczMyLmMiCisgICAgICAgICAgICBpbmNsdWRlICJyZXNjYWxlcl9taXBzX2RzcF9yMi5jIgorICAgICAgICAgICAgaW5jbHVkZSAicmVzY2FsZXJfbXNhLmMiCisgICAgICAgICAgICBpbmNsdWRlICJyZXNjYWxlcl9uZW9uLiRORU9OIgorICAgICAgICAgICAgaW5jbHVkZSAicmVzY2FsZXJfc3NlMi5jIgorICAgICAgICAgICAgaW5jbHVkZSAidXBzYW1wbGluZy5jIgorICAgICAgICAgICAgaW5jbHVkZSAidXBzYW1wbGluZ19taXBzX2RzcF9yMi5jIgorICAgICAgICAgICAgaW5jbHVkZSAidXBzYW1wbGluZ19tc2EuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgInVwc2FtcGxpbmdfbmVvbi4kTkVPTiIKKyAgICAgICAgICAgIGluY2x1ZGUgInVwc2FtcGxpbmdfc3NlMi5jIgorICAgICAgICAgICAgaW5jbHVkZSAidXBzYW1wbGluZ19zc2U0MS5jIgorICAgICAgICAgICAgaW5jbHVkZSAieXV2LmMiCisgICAgICAgICAgICBpbmNsdWRlICJ5dXZfbWlwczMyLmMiCisgICAgICAgICAgICBpbmNsdWRlICJ5dXZfbWlwc19kc3BfcjIuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgInl1dl9uZW9uLiRORU9OIgorICAgICAgICAgICAgaW5jbHVkZSAieXV2X3NzZTIuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgInl1dl9zc2U0MS5jIgorICAgICAgICAgICAgc3JjRGlyICJzcmMvdXRpbHMiCisgICAgICAgICAgICBpbmNsdWRlICJiaXRfcmVhZGVyX3V0aWxzLmMiCisgICAgICAgICAgICBpbmNsdWRlICJjb2xvcl9jYWNoZV91dGlscy5jIgorICAgICAgICAgICAgaW5jbHVkZSAiZmlsdGVyc191dGlscy5jIgorICAgICAgICAgICAgaW5jbHVkZSAiaHVmZm1hbl91dGlscy5jIgorICAgICAgICAgICAgaW5jbHVkZSAicXVhbnRfbGV2ZWxzX2RlY191dGlscy5jIgorICAgICAgICAgICAgaW5jbHVkZSAicmFuZG9tX3V0aWxzLmMiCisgICAgICAgICAgICBpbmNsdWRlICJyZXNjYWxlcl91dGlscy5jIgorICAgICAgICAgICAgaW5jbHVkZSAidGhyZWFkX3V0aWxzLmMiCisgICAgICAgICAgICBpbmNsdWRlICJ1dGlscy5jIgorICAgICAgICAgICAgc3JjRGlyICJzcmMvZHNwIgorICAgICAgICAgICAgaW5jbHVkZSAiY29zdC5jIgorICAgICAgICAgICAgaW5jbHVkZSAiY29zdF9taXBzMzIuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImNvc3RfbWlwc19kc3BfcjIuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImNvc3Rfc3NlMi5jIgorICAgICAgICAgICAgaW5jbHVkZSAiZW5jLmMiCisgICAgICAgICAgICBpbmNsdWRlICJlbmNfYXZ4Mi5jIgorICAgICAgICAgICAgaW5jbHVkZSAiZW5jX21pcHMzMi5jIgorICAgICAgICAgICAgaW5jbHVkZSAiZW5jX21pcHNfZHNwX3IyLmMiCisgICAgICAgICAgICBpbmNsdWRlICJlbmNfbXNhLmMiCisgICAgICAgICAgICBpbmNsdWRlICJlbmNfbmVvbi4kTkVPTiIKKyAgICAgICAgICAgIGluY2x1ZGUgImVuY19zc2UyLmMiCisgICAgICAgICAgICBpbmNsdWRlICJlbmNfc3NlNDEuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImxvc3NsZXNzX2VuYy5jIgorICAgICAgICAgICAgaW5jbHVkZSAibG9zc2xlc3NfZW5jX21pcHMzMi5jIgorICAgICAgICAgICAgaW5jbHVkZSAibG9zc2xlc3NfZW5jX21pcHNfZHNwX3IyLmMiCisgICAgICAgICAgICBpbmNsdWRlICJsb3NzbGVzc19lbmNfbXNhLmMiCisgICAgICAgICAgICBpbmNsdWRlICJsb3NzbGVzc19lbmNfbmVvbi4kTkVPTiIKKyAgICAgICAgICAgIGluY2x1ZGUgImxvc3NsZXNzX2VuY19zc2UyLmMiCisgICAgICAgICAgICBpbmNsdWRlICJsb3NzbGVzc19lbmNfc3NlNDEuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgInNzaW0uYyIKKyAgICAgICAgICAgIGluY2x1ZGUgInNzaW1fc3NlMi5jIgorICAgICAgICAgICAgc3JjRGlyICJzcmMvZW5jIgorICAgICAgICAgICAgaW5jbHVkZSAiYWxwaGFfZW5jLmMiCisgICAgICAgICAgICBpbmNsdWRlICJhbmFseXNpc19lbmMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImJhY2t3YXJkX3JlZmVyZW5jZXNfY29zdF9lbmMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImJhY2t3YXJkX3JlZmVyZW5jZXNfZW5jLmMiCisgICAgICAgICAgICBpbmNsdWRlICJjb25maWdfZW5jLmMiCisgICAgICAgICAgICBpbmNsdWRlICJjb3N0X2VuYy5jIgorICAgICAgICAgICAgaW5jbHVkZSAiZmlsdGVyX2VuYy5jIgorICAgICAgICAgICAgaW5jbHVkZSAiZnJhbWVfZW5jLmMiCisgICAgICAgICAgICBpbmNsdWRlICJoaXN0b2dyYW1fZW5jLmMiCisgICAgICAgICAgICBpbmNsdWRlICJpdGVyYXRvcl9lbmMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgIm5lYXJfbG9zc2xlc3NfZW5jLmMiCisgICAgICAgICAgICBpbmNsdWRlICJwaWN0dXJlX2VuYy5jIgorICAgICAgICAgICAgaW5jbHVkZSAicGljdHVyZV9jc3BfZW5jLmMiCisgICAgICAgICAgICBpbmNsdWRlICJwaWN0dXJlX3BzbnJfZW5jLmMiCisgICAgICAgICAgICBpbmNsdWRlICJwaWN0dXJlX3Jlc2NhbGVfZW5jLmMiCisgICAgICAgICAgICBpbmNsdWRlICJwaWN0dXJlX3Rvb2xzX2VuYy5jIgorICAgICAgICAgICAgaW5jbHVkZSAicHJlZGljdG9yX2VuYy5jIgorICAgICAgICAgICAgaW5jbHVkZSAicXVhbnRfZW5jLmMiCisgICAgICAgICAgICBpbmNsdWRlICJzeW50YXhfZW5jLmMiCisgICAgICAgICAgICBpbmNsdWRlICJ0b2tlbl9lbmMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgInRyZWVfZW5jLmMiCisgICAgICAgICAgICBpbmNsdWRlICJ2cDhsX2VuYy5jIgorICAgICAgICAgICAgaW5jbHVkZSAid2VicF9lbmMuYyIKKyAgICAgICAgICAgIHNyY0RpciAic3JjL3V0aWxzIgorICAgICAgICAgICAgaW5jbHVkZSAiYml0X3dyaXRlcl91dGlscy5jIgorICAgICAgICAgICAgaW5jbHVkZSAiaHVmZm1hbl9lbmNvZGVfdXRpbHMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgInF1YW50X2xldmVsc191dGlscy5jIgorICAgICAgICAgIH0KKyAgICAgICAgICBleHBvcnRlZEhlYWRlcnMgeworICAgICAgICAgICAgc3JjRGlyICJzcmMiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgd2VicGRlbXV4KE5hdGl2ZUxpYnJhcnlTcGVjKSB7CisgICAgICBzb3VyY2VzIHsKKyAgICAgICAgYyB7CisgICAgICAgICAgc291cmNlIHsKKyAgICAgICAgICAgIHNyY0RpciAic3JjL2RlbXV4IgorICAgICAgICAgICAgaW5jbHVkZSAiYW5pbV9kZWNvZGUuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImRlbXV4LmMiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgd2VicG11eChOYXRpdmVMaWJyYXJ5U3BlYykgeworICAgICAgc291cmNlcyB7CisgICAgICAgIGMgeworICAgICAgICAgIHNvdXJjZSB7CisgICAgICAgICAgICBzcmNEaXIgInNyYy9tdXgvIgorICAgICAgICAgICAgaW5jbHVkZSAiYW5pbV9lbmNvZGUuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgIm11eGVkaXQuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgIm11eGludGVybmFsLmMiCisgICAgICAgICAgICBpbmNsdWRlICJtdXhyZWFkLmMiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLy8gRXhlY3V0YWJsZXMgZnJvbSBleGFtcGxlcy4KKyAgICBleGFtcGxlX3V0aWwoTmF0aXZlTGlicmFyeVNwZWMpIHsKKyAgICAgIGJpbmFyaWVzIHsKKyAgICAgICAgYWxsIHsKKyAgICAgICAgICBsaWIgbGlicmFyeTogIndlYnAiLCBsaW5rYWdlOiAic3RhdGljIgorICAgICAgICB9CisgICAgICB9CisgICAgICBzb3VyY2VzIHsKKyAgICAgICAgYyB7CisgICAgICAgICAgc291cmNlIHsKKyAgICAgICAgICAgIHNyY0RpciAiLi9leGFtcGxlcyIKKyAgICAgICAgICAgIGluY2x1ZGUgImV4YW1wbGVfdXRpbC5jIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGltYWdlaW9fdXRpbChOYXRpdmVMaWJyYXJ5U3BlYykgeworICAgICAgYmluYXJpZXMgeworICAgICAgICBhbGwgeworICAgICAgICAgIGxpYiBsaWJyYXJ5OiAid2VicCIsIGxpbmthZ2U6ICJzdGF0aWMiCisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHNvdXJjZXMgeworICAgICAgICBjIHsKKyAgICAgICAgICBzb3VyY2UgeworICAgICAgICAgICAgc3JjRGlyICIuL2ltYWdlaW8iCisgICAgICAgICAgICBpbmNsdWRlICJpbWFnZWlvX3V0aWwuYyIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBpbWFnZWRlYyhOYXRpdmVMaWJyYXJ5U3BlYykgeworICAgICAgYmluYXJpZXMgeworICAgICAgICBhbGwgeworICAgICAgICAgIGxpYiBsaWJyYXJ5OiAid2VicGRlbXV4IiwgbGlua2FnZTogInN0YXRpYyIKKyAgICAgICAgICBsaWIgbGlicmFyeTogIndlYnAiLCBsaW5rYWdlOiAic3RhdGljIgorICAgICAgICB9CisgICAgICB9CisgICAgICBzb3VyY2VzIHsKKyAgICAgICAgYyB7CisgICAgICAgICAgc291cmNlIHsKKyAgICAgICAgICAgIHNyY0RpciAiLi9pbWFnZWlvIgorICAgICAgICAgICAgaW5jbHVkZSAiaW1hZ2VfZGVjLmMiCisgICAgICAgICAgICBpbmNsdWRlICJqcGVnZGVjLmMiCisgICAgICAgICAgICBpbmNsdWRlICJtZXRhZGF0YS5jIgorICAgICAgICAgICAgaW5jbHVkZSAicG5nZGVjLmMiCisgICAgICAgICAgICBpbmNsdWRlICJwbm1kZWMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgInRpZmZkZWMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgIndlYnBkZWMuYyIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBpbWFnZWVuYyhOYXRpdmVMaWJyYXJ5U3BlYykgeworICAgICAgYmluYXJpZXMgeworICAgICAgICBhbGwgeworICAgICAgICAgIGxpYiBsaWJyYXJ5OiAid2VicCIsIGxpbmthZ2U6ICJzdGF0aWMiCisgICAgICAgICAgbGliIGxpYnJhcnk6ICJpbWFnZWlvX3V0aWwiLCBsaW5rYWdlOiAic3RhdGljIgorICAgICAgICB9CisgICAgICB9CisgICAgICBzb3VyY2VzIHsKKyAgICAgICAgYyB7CisgICAgICAgICAgc291cmNlIHsKKyAgICAgICAgICAgIHNyY0RpciAiLi9pbWFnZWlvIgorICAgICAgICAgICAgaW5jbHVkZSAiaW1hZ2VfZW5jLmMiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgY3dlYnAoTmF0aXZlRXhlY3V0YWJsZVNwZWMpIHsKKyAgICAgIGJpbmFyaWVzIHsKKyAgICAgICAgYWxsIHsKKyAgICAgICAgICBsaWIgbGlicmFyeTogImV4YW1wbGVfdXRpbCIsIGxpbmthZ2U6ICJzdGF0aWMiCisgICAgICAgICAgbGliIGxpYnJhcnk6ICJpbWFnZWRlYyIsIGxpbmthZ2U6ICJzdGF0aWMiCisgICAgICAgICAgbGliIGxpYnJhcnk6ICJpbWFnZWlvX3V0aWwiLCBsaW5rYWdlOiAic3RhdGljIgorICAgICAgICAgIGxpYiBsaWJyYXJ5OiAid2VicGRlbXV4IiwgbGlua2FnZTogInN0YXRpYyIKKyAgICAgICAgICBsaWIgbGlicmFyeTogIndlYnAiLCBsaW5rYWdlOiAic3RhdGljIgorICAgICAgICB9CisgICAgICB9CisgICAgICBzb3VyY2VzIHsKKyAgICAgICAgYyB7CisgICAgICAgICAgc291cmNlIHsKKyAgICAgICAgICAgIHNyY0RpciAiLi9leGFtcGxlcyIKKyAgICAgICAgICAgIGluY2x1ZGUgImN3ZWJwLmMiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgZHdlYnAoTmF0aXZlRXhlY3V0YWJsZVNwZWMpIHsKKyAgICAgIGJpbmFyaWVzIHsKKyAgICAgICAgYWxsIHsKKyAgICAgICAgICBsaWIgbGlicmFyeTogImV4YW1wbGVfdXRpbCIsIGxpbmthZ2U6ICJzdGF0aWMiCisgICAgICAgICAgbGliIGxpYnJhcnk6ICJpbWFnZWRlYyIsIGxpbmthZ2U6ICJzdGF0aWMiCisgICAgICAgICAgbGliIGxpYnJhcnk6ICJpbWFnZWVuYyIsIGxpbmthZ2U6ICJzdGF0aWMiCisgICAgICAgICAgbGliIGxpYnJhcnk6ICJpbWFnZWlvX3V0aWwiLCBsaW5rYWdlOiAic3RhdGljIgorICAgICAgICAgIGxpYiBsaWJyYXJ5OiAid2VicGRlbXV4IiwgbGlua2FnZTogInN0YXRpYyIKKyAgICAgICAgICBsaWIgbGlicmFyeTogIndlYnAiCisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHNvdXJjZXMgeworICAgICAgICBjIHsKKyAgICAgICAgICBzb3VyY2UgeworICAgICAgICAgICAgICBzcmNEaXIgIi4vZXhhbXBsZXMiCisgICAgICAgICAgICAgIGluY2x1ZGUgImR3ZWJwLmMiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgd2VicG11eF9leGFtcGxlKE5hdGl2ZUV4ZWN1dGFibGVTcGVjKSB7CisgICAgICBiaW5hcmllcyB7CisgICAgICAgIGFsbCB7CisgICAgICAgICAgbGliIGxpYnJhcnk6ICJleGFtcGxlX3V0aWwiLCBsaW5rYWdlOiAic3RhdGljIgorICAgICAgICAgIGxpYiBsaWJyYXJ5OiAiaW1hZ2Vpb191dGlsIiwgbGlua2FnZTogInN0YXRpYyIKKyAgICAgICAgICBsaWIgbGlicmFyeTogIndlYnBtdXgiLCBsaW5rYWdlOiAic3RhdGljIgorICAgICAgICAgIGxpYiBsaWJyYXJ5OiAid2VicCIKKyAgICAgICAgfQorICAgICAgfQorICAgICAgc291cmNlcyB7CisgICAgICAgIGMgeworICAgICAgICAgIHNvdXJjZSB7CisgICAgICAgICAgICBzcmNEaXIgIi4vZXhhbXBsZXMiCisgICAgICAgICAgICBpbmNsdWRlICJ3ZWJwbXV4LmMiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaW1nMndlYnBfZXhhbXBsZShOYXRpdmVFeGVjdXRhYmxlU3BlYykgeworICAgICAgYmluYXJpZXMgeworICAgICAgICBhbGwgeworICAgICAgICAgIGxpYiBsaWJyYXJ5OiAiZXhhbXBsZV91dGlsIiwgbGlua2FnZTogInN0YXRpYyIKKyAgICAgICAgICBsaWIgbGlicmFyeTogImltYWdlZGVjIiwgbGlua2FnZTogInN0YXRpYyIKKyAgICAgICAgICBsaWIgbGlicmFyeTogImltYWdlaW9fdXRpbCIsIGxpbmthZ2U6ICJzdGF0aWMiCisgICAgICAgICAgbGliIGxpYnJhcnk6ICJ3ZWJwbXV4IiwgbGlua2FnZTogInN0YXRpYyIKKyAgICAgICAgICBsaWIgbGlicmFyeTogIndlYnBkZW11eCIsIGxpbmthZ2U6ICJzdGF0aWMiCisgICAgICAgICAgbGliIGxpYnJhcnk6ICJ3ZWJwIgorICAgICAgICB9CisgICAgICB9CisgICAgICBzb3VyY2VzIHsKKyAgICAgICAgYyB7CisgICAgICAgICAgc291cmNlIHsKKyAgICAgICAgICAgIHNyY0RpciAiLi9leGFtcGxlcyIKKyAgICAgICAgICAgIGluY2x1ZGUgImltZzJ3ZWJwLmMiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgd2VicGluZm9fZXhhbXBsZShOYXRpdmVFeGVjdXRhYmxlU3BlYykgeworICAgICAgYmluYXJpZXMgeworICAgICAgICBhbGwgeworICAgICAgICAgIGxpYiBsaWJyYXJ5OiAiZXhhbXBsZV91dGlsIiwgbGlua2FnZTogInN0YXRpYyIKKyAgICAgICAgICBsaWIgbGlicmFyeTogImltYWdlaW9fdXRpbCIsIGxpbmthZ2U6ICJzdGF0aWMiCisgICAgICAgICAgbGliIGxpYnJhcnk6ICJ3ZWJwIgorICAgICAgICB9CisgICAgICB9CisgICAgICBzb3VyY2VzIHsKKyAgICAgICAgYyB7CisgICAgICAgICAgc291cmNlIHsKKyAgICAgICAgICAgIHNyY0RpciAiLi9leGFtcGxlcyIKKyAgICAgICAgICAgIGluY2x1ZGUgIndlYnBpbmZvLmMiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIHRhc2tzIHsKKyAgICAvLyBUYXNrIHRvIHRlc3QgYWxsIHBvc3NpYmxlIGNvbmZpZ3VyYXRpb25zLgorICAgIGJ1aWxkQWxsRXhlY3V0YWJsZXMoVGFzaykgeworICAgICAgZGVwZW5kc09uICQuYmluYXJpZXMuZmluZEFsbCB7IGl0LmJ1aWxkYWJsZSB9CisgICAgfQorICB9Cit9CisKKy8vIFRhc2sgdG8gZ2VuZXJhdGUgdGhlIHdyYXBwZXIuCit0YXNrIHdyYXBwZXIodHlwZTogV3JhcHBlcikgeworICBncmFkbGVWZXJzaW9uID0gJzIuMTMnCit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9jbWFrZS9XZWJQQ29uZmlnLmNtYWtlLmluIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvY21ha2UvV2ViUENvbmZpZy5jbWFrZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjNkZjJmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvY21ha2UvV2ViUENvbmZpZy5jbWFrZS5pbgpAQCAtMCwwICsxLDYgQEAKK0BQQUNLQUdFX0lOSVRACisKK3NldChXZWJQX0lOQ0xVREVfRElSUyAid2VicCIpCitzZXQoV0VCUF9JTkNMVURFX0RJUlMgJHtXZWJQX0lOQ0xVREVfRElSU30pCitzZXQoV2ViUF9MSUJSQVJJRVMgIkBJTlNUQUxMRURfTElCUkFSSUVTQCIpCitzZXQoV0VCUF9MSUJSQVJJRVMgIiR7V2ViUF9MSUJSQVJJRVN9IikKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2NtYWtlL2NvbmZpZy5oLmluIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvY21ha2UvY29uZmlnLmguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM4NGFjZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2NtYWtlL2NvbmZpZy5oLmluCkBAIC0wLDAgKzEsMTU2IEBACisvKiBBZGFwdGVkIGZyb20gdGhlIGF1dG90b29scyBzcmMvd2VicC9jb25maWcuaC5pbi4gICovCisKKy8qIERlZmluZSBpZiBidWlsZGluZyB1bml2ZXJzYWwgKGludGVybmFsIGhlbHBlciBtYWNybykgKi8KKy8qIFRPRE86IGhhbmRsZSBwcm9wZXJseSBpbiBDTWFrZSAqLworI2NtYWtlZGVmaW5lIEFDX0FQUExFX1VOSVZFUlNBTF9CVUlMRCAxCisKKy8qIFNldCB0byAxIGlmIF9fYnVpbHRpbl9ic3dhcDE2IGlzIGF2YWlsYWJsZSAqLworI2NtYWtlZGVmaW5lIEhBVkVfQlVJTFRJTl9CU1dBUDE2IDEKKworLyogU2V0IHRvIDEgaWYgX19idWlsdGluX2Jzd2FwMzIgaXMgYXZhaWxhYmxlICovCisjY21ha2VkZWZpbmUgSEFWRV9CVUlMVElOX0JTV0FQMzIgMQorCisvKiBTZXQgdG8gMSBpZiBfX2J1aWx0aW5fYnN3YXA2NCBpcyBhdmFpbGFibGUgKi8KKyNjbWFrZWRlZmluZSBIQVZFX0JVSUxUSU5fQlNXQVA2NCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8Y3B1LWZlYXR1cmVzLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfQ1BVX0ZFQVRVUkVTX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGRsZmNuLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfRExGQ05fSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8R0xVVC9nbHV0Lmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfR0xVVF9HTFVUX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPEdML2dsdXQuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9HTF9HTFVUX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGludHR5cGVzLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfSU5UVFlQRVNfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bWVtb3J5Lmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfTUVNT1JZX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPE9wZW5HTC9nbHV0Lmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfT1BFTkdMX0dMVVRfSCAxCisKKy8qIEhhdmUgUFRIUkVBRF9QUklPX0lOSEVSSVQuICovCisjY21ha2VkZWZpbmUgSEFWRV9QVEhSRUFEX1BSSU9fSU5IRVJJVCBASEFWRV9QVEhSRUFEX1BSSU9fSU5IRVJJVEAKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzaGx3YXBpLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU0hMV0FQSV9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRpbnQuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9TVERJTlRfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU1RETElCX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9TVFJJTkdTX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NUUklOR19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3RhdC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NZU19TVEFUX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NZU19UWVBFU19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9VTklTVERfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8d2luY29kZWMuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9XSU5DT0RFQ19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx3aW5kb3dzLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfV0lORE9XU19IIDEKKworLyogRGVmaW5lIHRvIHRoZSBzdWItZGlyZWN0b3J5IGluIHdoaWNoIGxpYnRvb2wgc3RvcmVzIHVuaW5zdGFsbGVkIGxpYnJhcmllcy4KKyAgICovCisvKiBUT0RPOiBoYW5kbGUgcHJvcGVybHkgaW4gQ01ha2UgKi8KKyNjbWFrZWRlZmluZSBMVF9PQkpESVIgIkBMVF9PQkpESVJAIgorCisvKiBOYW1lIG9mIHBhY2thZ2UgKi8KKyNjbWFrZWRlZmluZSBQQUNLQUdFICJAUFJPSkVDVF9OQU1FQCIKKworLyogRGVmaW5lIHRvIHRoZSBhZGRyZXNzIHdoZXJlIGJ1ZyByZXBvcnRzIGZvciB0aGlzIHBhY2thZ2Ugc2hvdWxkIGJlIHNlbnQuICovCisjY21ha2VkZWZpbmUgUEFDS0FHRV9CVUdSRVBPUlQgIkBQQUNLQUdFX0JVR1JFUE9SVEAiCisKKy8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KKyNjbWFrZWRlZmluZSBQQUNLQUdFX05BTUUgIkBQQUNLQUdFX05BTUVAIgorCisvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBhbmQgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCisjY21ha2VkZWZpbmUgUEFDS0FHRV9TVFJJTkcgIkBQQUNLQUdFX1NUUklOR0AiCisKKy8qIERlZmluZSB0byB0aGUgb25lIHN5bWJvbCBzaG9ydCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KKyNjbWFrZWRlZmluZSBQQUNLQUdFX1RBUk5BTUUgIkBQQUNLQUdFX1RBUk5BTUVAIgorCisvKiBEZWZpbmUgdG8gdGhlIGhvbWUgcGFnZSBmb3IgdGhpcyBwYWNrYWdlLiAqLworI2NtYWtlZGVmaW5lIFBBQ0tBR0VfVVJMICJAUEFDS0FHRV9VUkxAIgorCisvKiBEZWZpbmUgdG8gdGhlIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLworI2NtYWtlZGVmaW5lIFBBQ0tBR0VfVkVSU0lPTiAiQFBBQ0tBR0VfVkVSU0lPTkAiCisKKy8qIERlZmluZSB0byBuZWNlc3Nhcnkgc3ltYm9sIGlmIHRoaXMgY29uc3RhbnQgdXNlcyBhIG5vbi1zdGFuZGFyZCBuYW1lIG9uCisgICB5b3VyIHN5c3RlbS4gKi8KKyNjbWFrZWRlZmluZSBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAqLworI2NtYWtlZGVmaW5lIFNURENfSEVBREVSUyAxCisKKy8qIFZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2UgKi8KKyNjbWFrZWRlZmluZSBWRVJTSU9OICJAVkVSU0lPTkAiCisKKy8qIFNldCB0byAxIGlmIEFWWDIgaXMgc3VwcG9ydGVkICovCisjY21ha2VkZWZpbmUgV0VCUF9IQVZFX0FWWDIgMQorCisvKiBTZXQgdG8gMSBpZiBHSUYgbGlicmFyeSBpcyBpbnN0YWxsZWQgKi8KKyNjbWFrZWRlZmluZSBXRUJQX0hBVkVfR0lGIDEKKworLyogU2V0IHRvIDEgaWYgT3BlbkdMIGlzIHN1cHBvcnRlZCAqLworI2NtYWtlZGVmaW5lIFdFQlBfSEFWRV9HTCAxCisKKy8qIFNldCB0byAxIGlmIEpQRUcgbGlicmFyeSBpcyBpbnN0YWxsZWQgKi8KKyNjbWFrZWRlZmluZSBXRUJQX0hBVkVfSlBFRyAxCisKKy8qIFNldCB0byAxIGlmIE5FT04gaXMgc3VwcG9ydGVkICovCisjY21ha2VkZWZpbmUgV0VCUF9IQVZFX05FT04KKworLyogU2V0IHRvIDEgaWYgcnVudGltZSBkZXRlY3Rpb24gb2YgTkVPTiBpcyBlbmFibGVkICovCisvKiBUT0RPOiBoYW5kbGUgcHJvcGVybHkgaW4gQ01ha2UgKi8KKyNjbWFrZWRlZmluZSBXRUJQX0hBVkVfTkVPTl9SVENECisKKy8qIFNldCB0byAxIGlmIFBORyBsaWJyYXJ5IGlzIGluc3RhbGxlZCAqLworI2NtYWtlZGVmaW5lIFdFQlBfSEFWRV9QTkcgMQorCisvKiBTZXQgdG8gMSBpZiBTREwgbGlicmFyeSBpcyBpbnN0YWxsZWQgKi8KKyNjbWFrZWRlZmluZSBXRUJQX0hBVkVfU0RMIDEKKworLyogU2V0IHRvIDEgaWYgU1NFMiBpcyBzdXBwb3J0ZWQgKi8KKyNjbWFrZWRlZmluZSBXRUJQX0hBVkVfU1NFMiAxCisKKy8qIFNldCB0byAxIGlmIFNTRTQuMSBpcyBzdXBwb3J0ZWQgKi8KKyNjbWFrZWRlZmluZSBXRUJQX0hBVkVfU1NFNDEgMQorCisvKiBTZXQgdG8gMSBpZiBUSUZGIGxpYnJhcnkgaXMgaW5zdGFsbGVkICovCisjY21ha2VkZWZpbmUgV0VCUF9IQVZFX1RJRkYgMQorCisvKiBFbmFibGUgbmVhciBsb3NzbGVzcyBlbmNvZGluZyAqLworI2NtYWtlZGVmaW5lIFdFQlBfTkVBUl9MT1NTTEVTUyAxCisKKy8qIFVuZGVmaW5lIHRoaXMgdG8gZGlzYWJsZSB0aHJlYWQgc3VwcG9ydC4gKi8KKyNjbWFrZWRlZmluZSBXRUJQX1VTRV9USFJFQUQgMQorCisvKiBEZWZpbmUgV09SRFNfQklHRU5ESUFOIHRvIDEgaWYgeW91ciBwcm9jZXNzb3Igc3RvcmVzIHdvcmRzIHdpdGggdGhlIG1vc3QKKyAgIHNpZ25pZmljYW50IGJ5dGUgZmlyc3QgKGxpa2UgTW90b3JvbGEgYW5kIFNQQVJDLCB1bmxpa2UgSW50ZWwpLiAqLworI2lmIGRlZmluZWQgQUNfQVBQTEVfVU5JVkVSU0FMX0JVSUxECisjIGlmIGRlZmluZWQgX19CSUdfRU5ESUFOX18KKyMgIGRlZmluZSBXT1JEU19CSUdFTkRJQU4gMQorIyBlbmRpZgorI2Vsc2UKKyMgaWZuZGVmIFdPUkRTX0JJR0VORElBTgorIyAgdW5kZWYgV09SRFNfQklHRU5ESUFOCisjIGVuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2NtYWtlL2NwdS5jbWFrZSBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2NtYWtlL2NwdS5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWExYmZkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvY21ha2UvY3B1LmNtYWtlCkBAIC0wLDAgKzEsMTI1IEBACisjIyBDaGVjayBmb3IgU0lNRCBleHRlbnNpb25zLgoraW5jbHVkZShDTWFrZVB1c2hDaGVja1N0YXRlKQorCitmdW5jdGlvbih3ZWJwX2NoZWNrX2NvbXBpbGVyX2ZsYWcgV0VCUF9TSU1EX0ZMQUcgRU5BQkxFX1NJTUQpCisgIGlmKE5PVCBFTkFCTEVfU0lNRCkKKyAgICBtZXNzYWdlKFNUQVRVUyAiRGlzYWJsaW5nICR7V0VCUF9TSU1EX0ZMQUd9IG9wdGltaXphdGlvbi4iKQorICAgIHNldChXRUJQX0hBVkVfJHtXRUJQX1NJTURfRkxBR30gMCBQQVJFTlRfU0NPUEUpCisgICAgcmV0dXJuKCkKKyAgZW5kaWYoKQorICB1bnNldChXRUJQX0hBVkVfRkxBR18ke1dFQlBfU0lNRF9GTEFHfSBDQUNIRSkKKyAgY21ha2VfcHVzaF9jaGVja19zdGF0ZSgpCisgIHNldChDTUFLRV9SRVFVSVJFRF9JTkNMVURFUyAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0pCisgIGNoZWNrX2Nfc291cmNlX2NvbXBpbGVzKCIKKyAgICAgICNpbmNsdWRlIFwiJHtDTUFLRV9DVVJSRU5UX0xJU1RfRElSfS8uLi9zcmMvZHNwL2RzcC5oXCIKKyAgICAgIGludCBtYWluKHZvaWQpIHsKKyAgICAgICAgI2lmICFkZWZpbmVkKFdFQlBfVVNFXyR7V0VCUF9TSU1EX0ZMQUd9KQorICAgICAgICB0aGlzIGlzIG5vdCB2YWxpZCBjb2RlCisgICAgICAgICNlbmRpZgorICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAiIFdFQlBfSEFWRV9GTEFHXyR7V0VCUF9TSU1EX0ZMQUd9CisgICkKKyAgY21ha2VfcG9wX2NoZWNrX3N0YXRlKCkKKyAgaWYoV0VCUF9IQVZFX0ZMQUdfJHtXRUJQX1NJTURfRkxBR30pCisgICAgc2V0KFdFQlBfSEFWRV8ke1dFQlBfU0lNRF9GTEFHfSAxIFBBUkVOVF9TQ09QRSkKKyAgZWxzZSgpCisgICAgc2V0KFdFQlBfSEFWRV8ke1dFQlBfU0lNRF9GTEFHfSAwIFBBUkVOVF9TQ09QRSkKKyAgZW5kaWYoKQorZW5kZnVuY3Rpb24oKQorCisjIHRob3NlIGFyZSBpbmNsdWRlZCBpbiB0aGUgbmFtZXMgb2YgV0VCUF9VU0VfKiBpbiBjKysgY29kZS4KK3NldChXRUJQX1NJTURfRkxBR1MgIlNTRTI7U1NFNDE7QVZYMjtNSVBTMzI7TUlQU19EU1BfUjI7TkVPTjtNU0EiKQorc2V0KFdFQlBfU0lNRF9GSUxFX0VYVEVOU0lPTlMgIl9zc2UyLmM7X3NzZTQxLmM7X2F2eDIuYztfbWlwczMyLmM7X21pcHNfZHNwX3IyLmM7X25lb24uYztfbXNhLmMiKQoraWYoTVNWQykKKyAgIyBNU1ZDIGRvZXMgbm90IGhhdmUgYSBTU0U0IGZsYWcgYnV0IEFWWDIgc3VwcG9ydCBpbXBsaWVzCisgICMgU1NFNCBzdXBwb3J0LgorICBzZXQoU0lNRF9FTkFCTEVfRkxBR1MgIi9hcmNoOlNTRTI7L2FyY2g6QVZYMjsvYXJjaDpBVlgyOzs7OyIpCisgIHNldChTSU1EX0RJU0FCTEVfRkxBR1MpCitlbHNlKCkKKyAgc2V0KFNJTURfRU5BQkxFX0ZMQUdTICItbXNzZTI7LW1zc2U0LjE7LW1hdngyOy1taXBzMzI7LW1kc3ByMjstbWZwdT1uZW9uOy1tbXNhIikKKyAgc2V0KFNJTURfRElTQUJMRV9GTEFHUyAiLW1uby1zc2UyOy1tbm8tc3NlNC4xOy1tbm8tYXZ4Mjs7LW1uby1kc3ByMjs7LW1uby1tc2EiKQorZW5kaWYoKQorCitzZXQoV0VCUF9TSU1EX0ZJTEVTX1RPX05PVF9JTkNMVURFKQorc2V0KFdFQlBfU0lNRF9GSUxFU19UT19JTkNMVURFKQorc2V0KFdFQlBfU0lNRF9GTEFHU19UT19JTkNMVURFKQorCitpZigke0FORFJPSUR9KQorICBpZigke0FORFJPSURfQUJJfSBTVFJFUVVBTCAiYXJtZWFiaS12N2EiKQorICAgICMgVGhpcyBpcyBiZWNhdXNlIEFuZHJvaWQgc3R1ZGlvIHVzZXMgdGhlIGNvbmZpZ3VyYXRpb24KKyAgICAjICItbWFyY2g9YXJtdjctYSAtbWZsb2F0LWFiaT1zb2Z0ZnAgLW1mcHU9dmZwdjMtZDE2IgorICAgICMgdGhhdCBkb2VzIG5vdCB0cmlnZ2VyIG5lb24gb3B0aW1pemF0aW9ucyBidXQgc2hvdWxkCisgICAgIyAoYXMgdGhpcyBjb25maWd1cmF0aW9uIGRvZXMgbm90IGV4aXN0IGFueW1vcmUpLgorICAgIHNldChDTUFLRV9DX0ZMQUdTICIke0NNQUtFX0NfRkxBR1N9IC1tZnB1PW5lb24gIikKKyAgZW5kaWYoKQorZW5kaWYoKQorCitsaXN0KExFTkdUSCBXRUJQX1NJTURfRkxBR1MgV0VCUF9TSU1EX0ZMQUdTX0xFTkdUSCkKK21hdGgoRVhQUiBXRUJQX1NJTURfRkxBR1NfUkFOR0UgIiR7V0VCUF9TSU1EX0ZMQUdTX0xFTkdUSH0gLSAxIikKKworZm9yZWFjaChJX1NJTUQgUkFOR0UgJHtXRUJQX1NJTURfRkxBR1NfUkFOR0V9KQorICBsaXN0KEdFVCBXRUJQX1NJTURfRkxBR1MgJHtJX1NJTUR9IFdFQlBfU0lNRF9GTEFHKQorCisgICMgRmlyc3QgdHJ5IHdpdGggbm8gZXh0cmEgZmxhZyBhZGRlZCBhcyB0aGUgY29tcGlsZXIgbWlnaHQgaGF2ZSBkZWZhdWx0IGZsYWdzCisgICMgKGVzcGVjaWFsbHkgb24gQW5kcm9pZCkuCisgIHVuc2V0KFdFQlBfSEFWRV8ke1dFQlBfU0lNRF9GTEFHfSBDQUNIRSkKKyAgY21ha2VfcHVzaF9jaGVja19zdGF0ZSgpCisgIHNldChDTUFLRV9SRVFVSVJFRF9GTEFHUykKKyAgd2VicF9jaGVja19jb21waWxlcl9mbGFnKCR7V0VCUF9TSU1EX0ZMQUd9ICR7V0VCUF9FTkFCTEVfU0lNRH0pCisgIGlmKE5PVCBXRUJQX0hBVkVfJHtXRUJQX1NJTURfRkxBR30pCisgICAgbGlzdChHRVQgU0lNRF9FTkFCTEVfRkxBR1MgJHtJX1NJTUR9IFNJTURfQ09NUElMRV9GTEFHKQorICAgIHNldChDTUFLRV9SRVFVSVJFRF9GTEFHUyAke1NJTURfQ09NUElMRV9GTEFHfSkKKyAgICB3ZWJwX2NoZWNrX2NvbXBpbGVyX2ZsYWcoJHtXRUJQX1NJTURfRkxBR30gJHtXRUJQX0VOQUJMRV9TSU1EfSkKKyAgZWxzZSgpCisgICAgc2V0KFNJTURfQ09NUElMRV9GTEFHICIgIikKKyAgZW5kaWYoKQorICAjIENoZWNrIHdoaWNoIGZpbGVzIHdlIHNob3VsZCBpbmNsdWRlIG9yIG5vdC4KKyAgbGlzdChHRVQgV0VCUF9TSU1EX0ZJTEVfRVhURU5TSU9OUyAke0lfU0lNRH0gV0VCUF9TSU1EX0ZJTEVfRVhURU5TSU9OKQorICBmaWxlKEdMT0IgU0lNRF9GSUxFUyAiJHtDTUFLRV9DVVJSRU5UX0xJU1RfRElSfS8uLi8iCisgICAgInNyYy9kc3AvKiR7V0VCUF9TSU1EX0ZJTEVfRVhURU5TSU9OfSIKKyAgKQorICBpZihXRUJQX0hBVkVfJHtXRUJQX1NJTURfRkxBR30pCisgICAgIyBNZW1vcml6ZSB0aGUgZmlsZSBhbmQgZmxhZ3MuCisgICAgZm9yZWFjaChGSUxFICR7U0lNRF9GSUxFU30pCisgICAgICBsaXN0KEFQUEVORCBXRUJQX1NJTURfRklMRVNfVE9fSU5DTFVERSAke0ZJTEV9KQorICAgICAgbGlzdChBUFBFTkQgV0VCUF9TSU1EX0ZMQUdTX1RPX0lOQ0xVREUgJHtTSU1EX0NPTVBJTEVfRkxBR30pCisgICAgZW5kZm9yZWFjaCgpCisgIGVsc2UoKQorICAgICMgUmVtb3ZlIHRoZSBmaWxlIGZyb20gdGhlIGxpc3QuCisgICAgZm9yZWFjaChGSUxFICR7U0lNRF9GSUxFU30pCisgICAgICBsaXN0KEFQUEVORCBXRUJQX1NJTURfRklMRVNfTk9UX1RPX0lOQ0xVREUgJHtGSUxFfSkKKyAgICBlbmRmb3JlYWNoKCkKKyAgICAjIEV4cGxpY2l0bHkgZGlzYWJsZSBTSU1ELgorICAgIGlmKFNJTURfRElTQUJMRV9GTEFHUykKKyAgICAgIGxpc3QoR0VUIFNJTURfRElTQUJMRV9GTEFHUyAke0lfU0lNRH0gU0lNRF9DT01QSUxFX0ZMQUcpCisgICAgICBpbmNsdWRlKENoZWNrQ0NvbXBpbGVyRmxhZykKKyAgICAgIGlmKFNJTURfQ09NUElMRV9GTEFHKQorICAgICAgICB1bnNldChIQVNfQ09NUElMRV9GTEFHIENBQ0hFKQorICAgICAgICBjaGVja19jX2NvbXBpbGVyX2ZsYWcoJHtTSU1EX0NPTVBJTEVfRkxBR30gSEFTX0NPTVBJTEVfRkxBRykKKyAgICAgICAgaWYoSEFTX0NPTVBJTEVfRkxBRykKKyAgICAgICAgICAjIERvIG9uZSBtb3JlIGNoZWNrIGZvciBDbGFuZyB0byBjaXJjdW12ZW50IENNYWtlIGlzc3VlIDEzMTk0LgorICAgICAgICAgIGlmKENPTU1BTkQgY2hlY2tfY29tcGlsZXJfZmxhZ19jb21tb25fcGF0dGVybnMpCisgICAgICAgICAgICAjIE9ubHkgaW4gQ01ha2UgMy4wIGFuZCBhYm92ZS4KKyAgICAgICAgICAgIGNoZWNrX2NvbXBpbGVyX2ZsYWdfY29tbW9uX3BhdHRlcm5zKENPTU1PTl9QQVRURVJOUykKKyAgICAgICAgICBlbHNlKCkKKyAgICAgICAgICAgIHNldChDT01NT05fUEFUVEVSTlMpCisgICAgICAgICAgZW5kaWYoKQorICAgICAgICAgIHNldChDTUFLRV9SRVFVSVJFRF9ERUZJTklUSU9OUyAke1NJTURfQ09NUElMRV9GTEFHfSkKKyAgICAgICAgICBjaGVja19jX3NvdXJjZV9jb21waWxlcygiaW50IG1haW4odm9pZCkge3JldHVybiAwO30iCisgICAgICAgICAgICBGTEFHXyR7U0lNRF9DT01QSUxFX0ZMQUd9CisgICAgICAgICAgICBGQUlMX1JFR0VYICJ3YXJuaW5nOiBhcmd1bWVudCB1bnVzZWQgZHVyaW5nIGNvbXBpbGF0aW9uOiIKKyAgICAgICAgICAgICR7Q09NTU9OX1BBVFRFUk5TfQorICAgICAgICAgICkKKyAgICAgICAgICBpZihOT1QgRkxBR18ke1NJTURfQ09NUElMRV9GTEFHfSkKKyAgICAgICAgICAgIHVuc2V0KEhBU19DT01QSUxFX0ZMQUcgQ0FDSEUpCisgICAgICAgICAgZW5kaWYoKQorICAgICAgICBlbmRpZigpCisgICAgICAgIGlmKEhBU19DT01QSUxFX0ZMQUcpCisgICAgICAgICAgc2V0KENNQUtFX0NfRkxBR1MgIiR7Q01BS0VfQ19GTEFHU30gJHtTSU1EX0NPTVBJTEVfRkxBR30iKQorICAgICAgICBlbmRpZigpCisgICAgICBlbmRpZigpCisgICAgZW5kaWYoKQorICBlbmRpZigpCisgIGNtYWtlX3BvcF9jaGVja19zdGF0ZSgpCitlbmRmb3JlYWNoKCkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2NtYWtlL2RlcHMuY21ha2UgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9jbWFrZS9kZXBzLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNWQxMGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9jbWFrZS9kZXBzLmNtYWtlCkBAIC0wLDAgKzEsMTY2IEBACisjIEdlbmVyYXRlIHRoZSBjb25maWcuaCB0byBjb21waWxlIHdpdGggc3BlY2lmaWMgaW50cmluc2ljcyAvIGxpYnMuCisKKyMjIENoZWNrIGZvciBjb21waWxlciBvcHRpb25zLgoraW5jbHVkZShDaGVja0NTb3VyY2VDb21waWxlcykKK2NoZWNrX2Nfc291cmNlX2NvbXBpbGVzKCIKKyAgICBpbnQgbWFpbih2b2lkKSB7CisgICAgICAodm9pZClfX2J1aWx0aW5fYnN3YXAxNigwKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgIgorICBIQVZFX0JVSUxUSU5fQlNXQVAxNgorKQorY2hlY2tfY19zb3VyY2VfY29tcGlsZXMoIgorICAgIGludCBtYWluKHZvaWQpIHsKKyAgICAgICh2b2lkKV9fYnVpbHRpbl9ic3dhcDMyKDApOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAiCisgIEhBVkVfQlVJTFRJTl9CU1dBUDMyCispCitjaGVja19jX3NvdXJjZV9jb21waWxlcygiCisgICAgaW50IG1haW4odm9pZCkgeworICAgICAgKHZvaWQpX19idWlsdGluX2Jzd2FwNjQoMCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICIKKyAgSEFWRV9CVUlMVElOX0JTV0FQNjQKKykKKworIyMgQ2hlY2sgZm9yIGxpYnJhcmllcy4KK2ZpbmRfcGFja2FnZShUaHJlYWRzKQoraWYoVGhyZWFkc19GT1VORCkKKyAgaWYoQ01BS0VfVVNFX1BUSFJFQURTX0lOSVQpCisgICAgc2V0KENNQUtFX0NfRkxBR1MgIiR7Q01BS0VfQ19GTEFHU30gLXB0aHJlYWQiKQorICBlbmRpZigpCisgIGZvcmVhY2goUFRIUkVBRF9URVNUIEhBVkVfUFRIUkVBRF9QUklPX0lOSEVSSVQgUFRIUkVBRF9DUkVBVEVfVU5ERVRBQ0hFRCkKKyAgICBjaGVja19jX3NvdXJjZV9jb21waWxlcygiCisgICAgICAgICNpbmNsdWRlIDxwdGhyZWFkLmg+CisgICAgICAgIGludCBtYWluICh2b2lkKSB7CisgICAgICAgICAgaW50IGF0dHIgPSAke1BUSFJFQURfVEVTVH07CisgICAgICAgICAgcmV0dXJuIGF0dHI7CisgICAgICAgIH0KKyAgICAgICIgJHtQVEhSRUFEX1RFU1R9CisgICAgKQorICBlbmRmb3JlYWNoKCkKKyAgbGlzdChBUFBFTkQgV0VCUF9ERVBfTElCUkFSSUVTICR7Q01BS0VfVEhSRUFEX0xJQlNfSU5JVH0pCitlbmRpZigpCitzZXQoV0VCUF9VU0VfVEhSRUFEICR7VGhyZWFkc19GT1VORH0pCisKKyMgVE9ETzogdGhpcyBzZWVtcyB1bnVzZWQsIGNoZWNrIHdpdGggYXV0b3Rvb2xzLgorc2V0KExUX09CSkRJUiAiLmxpYnMvIikKKworIyBPbmx5IHVzZWZ1bCBmb3IgdndlYnAsIHNvIHVzZWxlc3MgZm9yIG5vdy4KKyMgZmluZF9wYWNrYWdlKE9wZW5HTCkKKyMgc2V0KFdFQlBfSEFWRV9HTCAke09QRU5HTF9GT1VORH0pCisjIHNldChXRUJQX0RFUF9JTkNMVURFX0RJUlMgJHtXRUJQX0RFUF9JTkNMVURFX0RJUlN9ICR7T1BFTkdMX0lOQ0xVREVfRElSU30pCisjIHNldChXRUJQX0RFUF9MSUJSQVJJRVMgJHtXRUJQX0RFUF9MSUJSQVJJRVN9ICR7T1BFTkdMX0xJQlJBUklFU30pCisKKyMgRmluZCB0aGUgc3RhbmRhcmQgQyBtYXRoIGxpYnJhcnkuCitmaW5kX2xpYnJhcnkoTUFUSF9MSUJSQVJZIE5BTUVTIG0pCitpZihNQVRIX0xJQlJBUlkpCisgIGxpc3QoQVBQRU5EIFdFQlBfREVQX0xJQlJBUklFUyAke01BVEhfTElCUkFSWX0pCitlbmRpZigpCisKKyMgRmluZCB0aGUgc3RhbmRhcmQgaW1hZ2UgbGlicmFyaWVzLgorc2V0KFdFQlBfREVQX0lNR19MSUJSQVJJRVMpCitzZXQoV0VCUF9ERVBfSU1HX0lOQ0xVREVfRElSUykKK2ZvcmVhY2goSV9MSUIgUE5HIEpQRUcgVElGRikKKyAgZmluZF9wYWNrYWdlKCR7SV9MSUJ9KQorICBzZXQoV0VCUF9IQVZFXyR7SV9MSUJ9ICR7JHtJX0xJQn1fRk9VTkR9KQorICBpZigke0lfTElCfV9GT1VORCkKKyAgICBsaXN0KEFQUEVORCBXRUJQX0RFUF9JTUdfTElCUkFSSUVTICR7JHtJX0xJQn1fTElCUkFSSUVTfSkKKyAgICBsaXN0KEFQUEVORCBXRUJQX0RFUF9JTUdfSU5DTFVERV9ESVJTCisgICAgICAgICAkeyR7SV9MSUJ9X0lOQ0xVREVfRElSfSAkeyR7SV9MSUJ9X0lOQ0xVREVfRElSU30pCisgIGVuZGlmKCkKK2VuZGZvcmVhY2goKQoraWYoV0VCUF9ERVBfSU1HX0lOQ0xVREVfRElSUykKKyAgbGlzdChSRU1PVkVfRFVQTElDQVRFUyBXRUJQX0RFUF9JTUdfSU5DTFVERV9ESVJTKQorZW5kaWYoKQorCisjIEdJRiBkZXRlY3Rpb24sIGdpZmRlYyBpc24ndCBwYXJ0IG9mIHRoZSBpbWFnZWlvIGxpYi4KK2luY2x1ZGUoQ01ha2VQdXNoQ2hlY2tTdGF0ZSkKK3NldChXRUJQX0RFUF9HSUZfTElCUkFSSUVTKQorc2V0KFdFQlBfREVQX0dJRl9JTkNMVURFX0RJUlMpCitmaW5kX3BhY2thZ2UoR0lGKQorc2V0KFdFQlBfSEFWRV9HSUYgJHtHSUZfRk9VTkR9KQoraWYoR0lGX0ZPVU5EKQorICAjIEdJRiBmaW5kX3BhY2thZ2Ugb25seSBsb2NhdGVzIHRoZSBoZWFkZXIgYW5kIGxpYnJhcnksIGl0IGRvZXNuJ3QgZmFpbAorICAjIGNvbXBpbGUgdGVzdHMgd2hlbiBkZXRlY3RpbmcgdGhlIHZlcnNpb24sIGJ1dCBmYWxscyBiYWNrIHRvIDMgKGFzIG9mIGF0CisgICMgbGVhc3QgY21ha2UgMy43LjIpLiBNYWtlIHN1cmUgdGhlIGxpYnJhcnkgbGlua3MgdG8gYXZvaWQgaW5jb3JyZWN0CisgICMgZGV0ZWN0aW9uIHdoZW4gY3Jvc3MgY29tcGlsaW5nLgorICBjbWFrZV9wdXNoX2NoZWNrX3N0YXRlKCkKKyAgc2V0KENNQUtFX1JFUVVJUkVEX0xJQlJBUklFUyAke0dJRl9MSUJSQVJJRVN9KQorICBzZXQoQ01BS0VfUkVRVUlSRURfSU5DTFVERVMgJHtHSUZfSU5DTFVERV9ESVJ9KQorICBjaGVja19jX3NvdXJjZV9jb21waWxlcygiCisgICAgICAjaW5jbHVkZSA8Z2lmX2xpYi5oPgorICAgICAgaW50IG1haW4odm9pZCkgeworICAgICAgICAodm9pZClER2lmT3BlbkZpbGVIYW5kbGU7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgIiBHSUZfQ09NUElMRVMKKyAgKQorICBjbWFrZV9wb3BfY2hlY2tfc3RhdGUoKQorICBpZihHSUZfQ09NUElMRVMpCisgICAgbGlzdChBUFBFTkQgV0VCUF9ERVBfR0lGX0xJQlJBUklFUyAke0dJRl9MSUJSQVJJRVN9KQorICAgIGxpc3QoQVBQRU5EIFdFQlBfREVQX0dJRl9JTkNMVURFX0RJUlMgJHtHSUZfSU5DTFVERV9ESVJ9KQorICBlbHNlKCkKKyAgICB1bnNldChHSUZfRk9VTkQpCisgIGVuZGlmKCkKK2VuZGlmKCkKKworIyMgQ2hlY2sgZm9yIHNwZWNpZmljIGhlYWRlcnMuCitpbmNsdWRlKENoZWNrSW5jbHVkZUZpbGVzKQorY2hlY2tfaW5jbHVkZV9maWxlcygic3RkbGliLmg7c3RkYXJnLmg7c3RyaW5nLmg7ZmxvYXQuaCIgU1REQ19IRUFERVJTKQorY2hlY2tfaW5jbHVkZV9maWxlcyhkbGZjbi5oIEhBVkVfRExGQ05fSCkKK2NoZWNrX2luY2x1ZGVfZmlsZXMoR0xVVC9nbHV0LmggSEFWRV9HTFVUX0dMVVRfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZXMoR0wvZ2x1dC5oIEhBVkVfR0xfR0xVVF9IKQorY2hlY2tfaW5jbHVkZV9maWxlcyhpbnR0eXBlcy5oIEhBVkVfSU5UVFlQRVNfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZXMobWVtb3J5LmggSEFWRV9NRU1PUllfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZXMoT3BlbkdML2dsdXQuaCBIQVZFX09QRU5HTF9HTFVUX0gpCitjaGVja19pbmNsdWRlX2ZpbGVzKHNobHdhcGkuaCBIQVZFX1NITFdBUElfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZXMoc3RkaW50LmggSEFWRV9TVERJTlRfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZXMoc3RkbGliLmggSEFWRV9TVERMSUJfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZXMoc3RyaW5ncy5oIEhBVkVfU1RSSU5HU19IKQorY2hlY2tfaW5jbHVkZV9maWxlcyhzdHJpbmcuaCBIQVZFX1NUUklOR19IKQorY2hlY2tfaW5jbHVkZV9maWxlcyhzeXMvc3RhdC5oIEhBVkVfU1lTX1NUQVRfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZXMoc3lzL3R5cGVzLmggSEFWRV9TWVNfVFlQRVNfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZXModW5pc3RkLmggSEFWRV9VTklTVERfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZXMod2luY29kZWMuaCBIQVZFX1dJTkNPREVDX0gpCitjaGVja19pbmNsdWRlX2ZpbGVzKHdpbmRvd3MuaCBIQVZFX1dJTkRPV1NfSCkKKworIyBXaW5kb3dzIHNwZWNpZmljcworaWYoSEFWRV9XSU5DT0RFQ19IKQorICBsaXN0KEFQUEVORCBXRUJQX0RFUF9MSUJSQVJJRVMgc2hsd2FwaSBvbGUzMiB3aW5kb3dzY29kZWNzKQorZW5kaWYoKQorCisjIyBDaGVjayBmb3IgU0lNRCBleHRlbnNpb25zLgoraW5jbHVkZSgke0NNQUtFX0NVUlJFTlRfTElTVF9ESVJ9L2NwdS5jbWFrZSkKKworIyMgRGVmaW5lIGV4dHJhIGluZm8uCitzZXQoUEFDS0FHRSAke1BST0pFQ1RfTkFNRX0pCitzZXQoUEFDS0FHRV9OQU1FICR7UFJPSkVDVF9OQU1FfSkKKworIyBSZWFkIGZyb20gY29uZmlndXJlLmFjLgorZmlsZShSRUFEICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9jb25maWd1cmUuYWMgQ09ORklHVVJFX0FDKQorc3RyaW5nKFJFR0VYIE1BVENIQUxMICJcXFsoWzAtOWEtelxcLjovXSopXFxdIgorICBDT05GSUdVUkVfQUNfUEFDS0FHRV9JTkZPICR7Q09ORklHVVJFX0FDfQorKQorZnVuY3Rpb24oc3RyaXBfYnJhY2tldCBWQVIpCisgIHN0cmluZyhMRU5HVEggJHske1ZBUn19IFRNUF9MRU4pCisgIG1hdGgoRVhQUiBUTVBfTEVOICR7VE1QX0xFTn0tMikKKyAgc3RyaW5nKFNVQlNUUklORyAkeyR7VkFSfX0gMSAke1RNUF9MRU59IFRNUF9TVUIpCisgIHNldCgke1ZBUn0gJHtUTVBfU1VCfSBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCisKK2xpc3QoR0VUIENPTkZJR1VSRV9BQ19QQUNLQUdFX0lORk8gMSBQQUNLQUdFX1ZFUlNJT04pCitzdHJpcF9icmFja2V0KFBBQ0tBR0VfVkVSU0lPTikKK2xpc3QoR0VUIENPTkZJR1VSRV9BQ19QQUNLQUdFX0lORk8gMiBQQUNLQUdFX0JVR1JFUE9SVCkKK3N0cmlwX2JyYWNrZXQoUEFDS0FHRV9CVUdSRVBPUlQpCitsaXN0KEdFVCBDT05GSUdVUkVfQUNfUEFDS0FHRV9JTkZPIDMgUEFDS0FHRV9VUkwpCitzdHJpcF9icmFja2V0KFBBQ0tBR0VfVVJMKQorCisjIEJ1aWxkIG1vcmUgaW5mby4KK3NldChQQUNLQUdFX1NUUklORyAiJHtQQUNLQUdFX05BTUV9ICR7UEFDS0FHRV9WRVJTSU9OfSIpCitzZXQoUEFDS0FHRV9UQVJOQU1FICR7UEFDS0FHRV9OQU1FfSkKK3NldChWRVJTSU9OICR7UEFDS0FHRV9WRVJTSU9OfSkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2NvbmZpZ3VyZS5hYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2NvbmZpZ3VyZS5hYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTZlNWZmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvY29uZmlndXJlLmFjCkBAIC0wLDAgKzEsODAyIEBACitBQ19JTklUKFtsaWJ3ZWJwXSwgWzEuMC4wXSwKKyAgICAgICAgW2h0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC93ZWJwXSwsCisgICAgICAgIFtodHRwOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3NwZWVkL3dlYnBdKQorQUNfQ0FOT05JQ0FMX0hPU1QKK0FDX1BSRVJFUShbMi42MF0pCitBTV9JTklUX0FVVE9NQUtFKFstV2FsbCBmb3JlaWduIHN1YmRpci1vYmplY3RzXSkKKworZG5sID09PSBhdXRvbWFrZSA+PSAxLjEyIHJlcXVpcmVzIHRoaXMgZm9yICd1bnVzdWFsIGFyY2hpdmVycycgc3VwcG9ydC4KK2RubCA9PT0gaXQgbXVzdCBvY2N1ciBiZWZvcmUgTFRfSU5JVCAoQUNfUFJPR19MSUJUT09MKS4KK200X2lmZGVmKFtBTV9QUk9HX0FSXSwgW0FNX1BST0dfQVJdKQorCitBQ19QUk9HX0xJQlRPT0wKK0FDX1BST0dfU0VECitBTV9QUk9HX0NDX0NfTworCitkbmwgPT09IEVuYWJsZSBsZXNzIHZlcmJvc2Ugb3V0cHV0IHdoZW4gYnVpbGRpbmcuCittNF9pZmRlZihbQU1fU0lMRU5UX1JVTEVTXSwgW0FNX1NJTEVOVF9SVUxFUyhbeWVzXSldKQorCitkbmwgPT0gdGVzdCBlbmRpYW5uZXNzCitBQ19DX0JJR0VORElBTgorCitkbmwgPT09IFNFVF9JRl9VTlNFVChzaGVsbF92YXIsIHZhbHVlKQorZG5sID09PSAgIFNldCB0aGUgc2hlbGwgdmFyaWFibGUgJ3NoZWxsX3ZhcicgdG8gJ3ZhbHVlJyBpZiBpdCBpcyB1bnNldC4KK0FDX0RFRlVOKFtTRVRfSUZfVU5TRVRdLCBbdGVzdCAiJHskMStzZXR9IiA9ICJzZXQiIHx8ICQxPSQyXSkKKworQUNfQVJHX0VOQUJMRShbZXZlcnl0aGluZ10sCisgICAgICAgICAgICAgIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1ldmVyeXRoaW5nXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0VuYWJsZSBhbGwgb3B0aW9uYWwgdGFyZ2V0cy4gVGhlc2UgY2FuIHN0aWxsIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZCB3aXRoIC0tZGlzYWJsZS10YXJnZXRdKSwKKyAgICAgICAgICAgICAgW1NFVF9JRl9VTlNFVChbZW5hYmxlX2xpYndlYnBkZWNvZGVyXSwgWyRlbmFibGV2YWxdKQorICAgICAgICAgICAgICAgU0VUX0lGX1VOU0VUKFtlbmFibGVfbGlid2VicGRlbXV4XSwgWyRlbmFibGV2YWxdKQorICAgICAgICAgICAgICAgU0VUX0lGX1VOU0VUKFtlbmFibGVfbGlid2VicGV4dHJhc10sIFskZW5hYmxldmFsXSkKKyAgICAgICAgICAgICAgIFNFVF9JRl9VTlNFVChbZW5hYmxlX2xpYndlYnBtdXhdLCBbJGVuYWJsZXZhbF0pXSkKKworZG5sID09PSBJZiAtLWVuYWJsZS1hc3NlcnRzIGlzIG5vdCBkZWZpbmVkLCBkZWZpbmUgTkRFQlVHCisKK0FDX01TR19DSEVDS0lORyh3aGV0aGVyIGFzc2VydHMgYXJlIGVuYWJsZWQpCitBQ19BUkdfRU5BQkxFKFthc3NlcnRzXSwKKyAgICAgICAgICAgICAgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWFzc2VydHNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbRW5hYmxlIGFzc2VydCBjaGVja3NdKSkKK2lmIHRlc3QgIngke2VuYWJsZV9hc3NlcnRzLW5vfSIgPSAieG5vIjsgdGhlbgorICBBTV9DUFBGTEFHUz0iJHtBTV9DUFBGTEFHU30gLUROREVCVUciCitmaQorQUNfTVNHX1JFU1VMVCgke2VuYWJsZV9hc3NlcnRzLW5vfSkKK0FDX1NVQlNUKFtBTV9DUFBGTEFHU10pCisKK0FDX0FSR19XSVRIKFtwa2djb25maWdkaXJdLCBBU19IRUxQX1NUUklORyhbLS13aXRoLXBrZ2NvbmZpZ2Rpcj1ESVJdLAorICAgICAgICAgICAgW1BhdGggdG8gdGhlIHBrZ2NvbmZpZyBkaXJlY3RvcnkgQDw6QExJQkRJUi9wa2djb25maWdAOj5AXSksCisgICAgICAgICAgICBbcGtnY29uZmlnZGlyPSIkd2l0aHZhbCJdLCBbcGtnY29uZmlnZGlyPScke2xpYmRpcn0vcGtnY29uZmlnJ10pCitBQ19TVUJTVChbcGtnY29uZmlnZGlyXSkKKworZG5sID09PSBURVNUX0FORF9BRERfQ0ZMQUdTKHZhciwgZmxhZykKK2RubCA9PT0gICBDaGVja3Mgd2hldGhlciAkQ0Mgc3VwcG9ydHMgJ2ZsYWcnIGFuZCBhZGRzIGl0IHRvICd2YXInCitkbmwgPT09ICAgb24gc3VjY2Vzcy4KK0FDX0RFRlVOKFtURVNUX0FORF9BRERfQ0ZMQUdTXSwKKyAgICAgICAgIFtTQVZFRF9DRkxBR1M9IiRDRkxBR1MiCisgICAgICAgICAgQ0ZMQUdTPSItV2Vycm9yICQyIgorICAgICAgICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciAkQ0Mgc3VwcG9ydHMgJDJdKQorICAgICAgICAgIGRubCBOb3RlIEFDX0xBTkdfUFJPR1JBTShbXSkgdXNlcyBhbiBvbGQtc3R5bGUgbWFpbiBkZWZpbml0aW9uLgorICAgICAgICAgIEFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1NPVVJDRShbaW50IG1haW4odm9pZCkgeyByZXR1cm4gMDsgfV0pXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbQUNfTVNHX1JFU1VMVChbeWVzXSldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG5sIFNpbXBseSBhcHBlbmQgdGhlIHZhcmlhYmxlIGF2b2lkaW5nIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbmwgY29tcGF0aWJpbGl0eSBpZmRlZiBmb3IgQVNfVkFSX0FQUEVORCBhcyB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG5sIHZhcmlhYmxlIHNob3VsZG4ndCBncm93IGFsbCB0aGF0IGxhcmdlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFskMT0iJHskMX0gJDIiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbQUNfTVNHX1JFU1VMVChbbm9dKV0pCisgICAgICAgICAgQ0ZMQUdTPSIkU0FWRURfQ0ZMQUdTIl0pCitURVNUX0FORF9BRERfQ0ZMQUdTKFtBTV9DRkxBR1NdLCBbLWZ2aXNpYmlsaXR5PWhpZGRlbl0pCitURVNUX0FORF9BRERfQ0ZMQUdTKFtBTV9DRkxBR1NdLCBbLVdhbGxdKQorVEVTVF9BTkRfQUREX0NGTEFHUyhbQU1fQ0ZMQUdTXSwgWy1XY29uc3RhbnQtY29udmVyc2lvbl0pCitURVNUX0FORF9BRERfQ0ZMQUdTKFtBTV9DRkxBR1NdLCBbLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnRdKQorVEVTVF9BTkRfQUREX0NGTEFHUyhbQU1fQ0ZMQUdTXSwgWy1XZXh0cmFdKQorVEVTVF9BTkRfQUREX0NGTEFHUyhbQU1fQ0ZMQUdTXSwgWy1XZmxvYXQtY29udmVyc2lvbl0pCitURVNUX0FORF9BRERfQ0ZMQUdTKFtBTV9DRkxBR1NdLCBbLVdmb3JtYXQgLVdmb3JtYXQtbm9ubGl0ZXJhbF0pCitURVNUX0FORF9BRERfQ0ZMQUdTKFtBTV9DRkxBR1NdLCBbLVdmb3JtYXQgLVdmb3JtYXQtc2VjdXJpdHldKQorVEVTVF9BTkRfQUREX0NGTEFHUyhbQU1fQ0ZMQUdTXSwgWy1XbWlzc2luZy1kZWNsYXJhdGlvbnNdKQorVEVTVF9BTkRfQUREX0NGTEFHUyhbQU1fQ0ZMQUdTXSwgWy1XbWlzc2luZy1wcm90b3R5cGVzXSkKK1RFU1RfQU5EX0FERF9DRkxBR1MoW0FNX0NGTEFHU10sIFstV29sZC1zdHlsZS1kZWZpbml0aW9uXSkKK1RFU1RfQU5EX0FERF9DRkxBR1MoW0FNX0NGTEFHU10sIFstV3BhcmVudGhlc2VzLWVxdWFsaXR5XSkKK1RFU1RfQU5EX0FERF9DRkxBR1MoW0FNX0NGTEFHU10sIFstV3NoYWRvd10pCitURVNUX0FORF9BRERfQ0ZMQUdTKFtBTV9DRkxBR1NdLCBbLVdzaG9ydGVuLTY0LXRvLTMyXSkKK1RFU1RfQU5EX0FERF9DRkxBR1MoW0FNX0NGTEFHU10sIFstV3VuZGVmXSkKK1RFU1RfQU5EX0FERF9DRkxBR1MoW0FNX0NGTEFHU10sIFstV3VucmVhY2hhYmxlLWNvZGVdKQorVEVTVF9BTkRfQUREX0NGTEFHUyhbQU1fQ0ZMQUdTXSwgWy1XdW51c2VkLWJ1dC1zZXQtdmFyaWFibGVdKQorVEVTVF9BTkRfQUREX0NGTEFHUyhbQU1fQ0ZMQUdTXSwgWy1XdW51c2VkXSkKK1RFU1RfQU5EX0FERF9DRkxBR1MoW0FNX0NGTEFHU10sIFstV3ZsYV0pCisjIGh0dHBzOi8vZ2NjLmdudS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTYyMDQwCisjIGh0dHBzOi8vZ2NjLmdudS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTYxNjIyCitBU19JRihbdGVzdCAiJEdDQyIgPSAieWVzIiBdLCBbCisgICAgICAgZ2NjX3ZlcnNpb249YCRDQyAtZHVtcHZlcnNpb25gCisgICAgICAgZ2NjX3dodF9idWc9IiIKKyAgICAgICBjYXNlICIkaG9zdF9jcHUiIGluCisgICAgICAgICBhYXJjaDY0fGFybTY0KQorICAgICAgICAgIGNhc2UgIiRnY2NfdmVyc2lvbiIgaW4KKyAgICAgICAgICAgIDQuOXw0LjkuMHw0LjkuMSkgZ2NjX3dodF9idWc9eWVzIDs7CisgICAgICAgICAgZXNhYworICAgICAgIGVzYWMKKyAgICAgICBBU19JRihbdGVzdCAiJGdjY193aHRfYnVnIiA9ICJ5ZXMiXSwgWworICAgICAgICAgICAgICBURVNUX0FORF9BRERfQ0ZMQUdTKFtBTV9DRkxBR1NdLCBbLWZyZW5hbWUtcmVnaXN0ZXJzXSldKV0pCisjIFVzZSAtZmxheC12ZWN0b3ItY29udmVyc2lvbnMsIGlmIGF2YWlsYWJsZSwgd2hlbiBidWlsZGluZyBpbnRyaW5zaWNzIHdpdGgKKyMgb2xkZXIgdmVyc2lvbnMgb2YgZ2NjLiBUaGUgZmxhZyBhcHBlYXJlZCBpbiA0LjMueCwgYnV0IGlmIGJhY2twb3J0ZWQsIGFuZAorIyAtZm5vLWxheC12ZWN0b3ItY29udmVyc2lvbnMgaXMgc2V0LCBlcnJvcnMgbWF5IG9jY3VyIHdpdGggdGhlIGludHJpbnNpY3MKKyMgZmlsZXMgYWxvbmcgd2l0aCB0aGUgb2xkZXIgc3lzdGVtIGluY2x1ZGVzLCBlLmcuLCBlbW1pbnRyaW4uaC4KKyMgT3JpZ2luYWxseSBvYnNlcnZlZCB3aXRoIGNjIChHQ0MpIDQuMi4xIDIwMDcwODMxIHBhdGNoZWQgW0ZyZWVCU0RdICg5LjMpLgorIyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avd2VicC9pc3N1ZXMvZGV0YWlsP2lkPTI3NAorQVNfSUYoW3Rlc3QgIiRHQ0MiID0gInllcyIgXSwgWworICAgICAgIGNhc2UgIiRob3N0X2NwdSIgaW4KKyAgICAgICAgIGFtZDY0fGk/ODZ8eDg2XzY0KQorICAgICAgICAgICBBQ19DT01QSUxFX0lGRUxTRSgKKyAgICAgICAgICAgICBkbmwgb25seSBjaGVjayBmb3IgLWZsYXgtdmVjdG9yLWNvbnZlcnNpb25zIHdpdGggb2xkZXIgZ2NjLCBza2lwCisgICAgICAgICAgICAgZG5sIGNsYW5nIGFzIGl0IHJlcG9ydHMgaXRzZWxmIGFzIDQuMi4xLCBidXQgdGhlIGZsYWcgaXNuJ3QgbmVlZGVkLgorICAgICAgICAgICAgIFtBQ19MQU5HX1NPVVJDRShbI2lmICFkZWZpbmVkKF9fY2xhbmdfXykgJiYgZGVmaW5lZChfX0dOVUNfXykgJiYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19HTlVDX18gPDwgOCkgfCBfX0dOVUNfTUlOT1JfXykgPCAweDQwMworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2Vycm9yIG9sZCBnY2MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1haW4odm9pZCkgeyByZXR1cm4gMDsgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKV0sLAorICAgICAgICAgICAgICBbVEVTVF9BTkRfQUREX0NGTEFHUyhbSU5UUklOU0lDU19DRkxBR1NdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbLWZsYXgtdmVjdG9yLWNvbnZlcnNpb25zXSldKQorICAgICAgICAgICA7OworICAgICAgIGVzYWNdKQorQUNfU1VCU1QoW0FNX0NGTEFHU10pCisKK2RubCA9PT0gQ2hlY2sgZm9yIG1hY2hpbmUgc3BlY2lmaWMgZmxhZ3MKK0FDX0FSR19FTkFCTEUoW2F2eDJdLAorICAgICAgICAgICAgICBBU19IRUxQX1NUUklORyhbLS1kaXNhYmxlLWF2eDJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbRGlzYWJsZSBkZXRlY3Rpb24gb2YgQVZYMiBzdXBwb3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAPDpAZGVmYXVsdD1hdXRvQDo+QF0pKQorCitBU19JRihbdGVzdCAieCRlbmFibGVfYXZ4MiIgIT0gInhubyIgLWEgIngkZW5hYmxlX3NzZTRfMSIgIT0gInhubyIgXAorICAgICAgICAgLWEgIngkZW5hYmxlX3NzZTIiICE9ICJ4bm8iXSwgWworICBBVlgyX0NGTEFHUz0iJElOVFJJTlNJQ1NfQ0ZMQUdTICRBVlgyX0ZMQUdTIgorICBURVNUX0FORF9BRERfQ0ZMQUdTKFtBVlgyX0ZMQUdTXSwgWy1tYXZ4Ml0pCisgIEFTX0lGKFt0ZXN0IC1uICIkQVZYMl9GTEFHUyJdLCBbCisgICAgU0FWRURfQ0ZMQUdTPSRDRkxBR1MKKyAgICBDRkxBR1M9IiRDRkxBR1MgJEFWWDJfRkxBR1MiCisgICAgQUNfQ0hFQ0tfSEVBREVSKFtpbW1pbnRyaW4uaF0sCisgICAgICAgICAgICAgICAgICAgIFtBQ19ERUZJTkUoV0VCUF9IQVZFX0FWWDIsIFsxXSwKKyAgICAgICAgICAgICAgICAgICAgIFtTZXQgdG8gMSBpZiBBVlgyIGlzIHN1cHBvcnRlZF0pXSwKKyAgICAgICAgICAgICAgICAgICAgW0FWWDJfRkxBR1M9IiJdLAorICAgICAgICAgICAgICAgICAgICBkbmwgaXQncyBpbGxlZ2FsIHRvIGRpcmVjdGx5IGluY2x1ZGUgYXZ4MmludHJpbi5oLCBidXQgaXQncworICAgICAgICAgICAgICAgICAgICBkbmwgaW5jbHVkZWQgY29uZGl0aW9uYWxseSBpbiBpbW1pbnRyaW4uaCwgdHJpY2t5IQorICAgICAgICAgICAgICAgICAgICBbI2lmbmRlZiBfX0FWWDJfXworICAgICAgICAgICAgICAgICAgICAgI2Vycm9yIGF2eDIgaXMgbm90IGVuYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgICBdKQorICAgIENGTEFHUz0kU0FWRURfQ0ZMQUdTXSkKKyAgQUNfU1VCU1QoW0FWWDJfRkxBR1NdKV0pCisKK0FDX0FSR19FTkFCTEUoW3NzZTQuMV0sCisgICAgICAgICAgICAgIEFTX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtc3NlNC4xXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0Rpc2FibGUgZGV0ZWN0aW9uIG9mIFNTRTQuMSBzdXBwb3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAPDpAZGVmYXVsdD1hdXRvQDo+QF0pKQorCitBU19JRihbdGVzdCAieCRlbmFibGVfc3NlNF8xIiAhPSAieG5vIiAtYSAieCRlbmFibGVfc3NlMiIgIT0gInhubyJdLCBbCisgIFNTRTQxX0ZMQUdTPSIkSU5UUklOU0lDU19DRkxBR1MgJFNTRTQxX0ZMQUdTIgorICBURVNUX0FORF9BRERfQ0ZMQUdTKFtTU0U0MV9GTEFHU10sIFstbXNzZTQuMV0pCisgIEFTX0lGKFt0ZXN0IC1uICIkU1NFNDFfRkxBR1MiXSwgWworICAgIFNBVkVEX0NGTEFHUz0kQ0ZMQUdTCisgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRTU0U0MV9GTEFHUyIKKyAgICBBQ19DSEVDS19IRUFERVIoW3NtbWludHJpbi5oXSwKKyAgICAgICAgICAgICAgICAgICAgW0FDX0RFRklORShXRUJQX0hBVkVfU1NFNDEsIFsxXSwKKyAgICAgICAgICAgICAgICAgICAgIFtTZXQgdG8gMSBpZiBTU0U0LjEgaXMgc3VwcG9ydGVkXSldLAorICAgICAgICAgICAgICAgICAgICBbU1NFNDFfRkxBR1M9IiJdKQorICAgIENGTEFHUz0kU0FWRURfQ0ZMQUdTXSkKKyAgQUNfU1VCU1QoW1NTRTQxX0ZMQUdTXSldKQorCitBQ19BUkdfRU5BQkxFKFtzc2UyXSwKKyAgICAgICAgICAgICAgQVNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1zc2UyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0Rpc2FibGUgZGV0ZWN0aW9uIG9mIFNTRTIgc3VwcG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDw6QGRlZmF1bHQ9YXV0b0A6PkBdKSkKKworQVNfSUYoW3Rlc3QgIngkZW5hYmxlX3NzZTIiICE9ICJ4bm8iXSwgWworICBTU0UyX0ZMQUdTPSIkSU5UUklOU0lDU19DRkxBR1MgJFNTRTJfRkxBR1MiCisgIFRFU1RfQU5EX0FERF9DRkxBR1MoW1NTRTJfRkxBR1NdLCBbLW1zc2UyXSkKKyAgQVNfSUYoW3Rlc3QgLW4gIiRTU0UyX0ZMQUdTIl0sIFsKKyAgICBTQVZFRF9DRkxBR1M9JENGTEFHUworICAgIENGTEFHUz0iJENGTEFHUyAkU1NFMl9GTEFHUyIKKyAgICBBQ19DSEVDS19IRUFERVIoW2VtbWludHJpbi5oXSwKKyAgICAgICAgICAgICAgICAgICAgW0FDX0RFRklORShXRUJQX0hBVkVfU1NFMiwgWzFdLAorICAgICAgICAgICAgICAgICAgICAgW1NldCB0byAxIGlmIFNTRTIgaXMgc3VwcG9ydGVkXSldLAorICAgICAgICAgICAgICAgICAgICBbU1NFMl9GTEFHUz0iIl0pCisgICAgQ0ZMQUdTPSRTQVZFRF9DRkxBR1NdKQorICBBQ19TVUJTVChbU1NFMl9GTEFHU10pXSkKKworQUNfQVJHX0VOQUJMRShbbmVvbl0sCisgICAgICAgICAgICAgIEFTX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtbmVvbl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtEaXNhYmxlIGRldGVjdGlvbiBvZiBORU9OIHN1cHBvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA8OkBkZWZhdWx0PWF1dG9AOj5AXSkpCisKK0FDX0FSR19FTkFCTEUoW25lb25fcnRjZF0sCisgICAgICAgICAgICAgIEFTX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtbmVvbi1ydGNkXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0Rpc2FibGUgcnVudGltZSBkZXRlY3Rpb24gb2YgTkVPTiBzdXBwb3J0IHZpYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL3Byb2MvY3B1aW5mbyBvbiBMaW51eCBob3N0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDw6QGRlZmF1bHQ9YXV0b0A6PkBdKSkKKyMgRm9yIEFSTSg3KSBob3N0czoKKyMgQm90aCBORU9OIGZsYWdzIHVuc2V0IGFuZCBORU9OIHN1cHBvcnQgZGV0ZWN0ZWQgPSBidWlsZCBhbGwgbW9kdWxlcyB3aXRoIE5FT04KKyMgTkVPTiBkZXRlY3RlZCB3aXRoIHRoZSB1c2Ugb2YgLW1mcHU9bmVvbiA9IGJ1aWxkIG9ubHkgTkVPTiBtb2R1bGVzIHdpdGggTkVPTgorQVNfSUYoW3Rlc3QgIngkZW5hYmxlX25lb24iICE9ICJ4bm8iXSwgWworICBjYXNlICIkaG9zdF9jcHUiIGluCisgICAgYXJtfGFybXY3KikKKyAgICAgICMgVGVzdCBmb3IgTkVPTiBzdXBwb3J0IHdpdGhvdXQgZmxhZ3MgYmVmb3JlIGZhbGxpbmcgYmFjayB0byAtbWZwdT1uZW9uCisgICAgICBmb3IgZmxhZyBpbiAnJyAnLW1mcHU9bmVvbic7IGRvCisgICAgICAgIExPQ0FMX05FT05fRkxBR1M9IiRJTlRSSU5TSUNTX0NGTEFHUyAkTkVPTl9GTEFHUyIKKyAgICAgICAgVEVTVF9BTkRfQUREX0NGTEFHUyhbTE9DQUxfTkVPTl9GTEFHU10sIFskZmxhZ10pCisgICAgICAgIFNBVkVEX0NGTEFHUz0kQ0ZMQUdTCisgICAgICAgIENGTEFHUz0iJENGTEFHUyAkTE9DQUxfTkVPTl9GTEFHUyIKKworICAgICAgICBkbmwgTm90ZSBBQ19MQU5HX1BST0dSQU0oW10pIHVzZXMgYW4gb2xkLXN0eWxlIG1haW4gZGVmaW5pdGlvbi4KKyAgICAgICAgQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfU09VUkNFKFsKKyAgICAgICAgICAjaW5jbHVkZSA8YXJtX25lb24uaD4KKyAgICAgICAgICBpbnQgbWFpbih2b2lkKSB7CisgICAgICAgICAgICBpbnQ4eDhfdCB2ID0gdmR1cF9uX3M4KDApOworICAgICAgICAgICAgKHZvaWQpdjsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgIH1dKV0sCisgICAgICAgICAgW05FT05fRkxBR1M9IiQoZWNobyAkTE9DQUxfTkVPTl9GTEFHUyB8ICRTRUQgJ3MvXiAqLy8nKSIKKyAgICAgICAgICAgQVNfSUYoW3Rlc3QgLW4gIiRORU9OX0ZMQUdTIl0sIFsKKyAgICAgICAgICAgICBBU19JRihbdGVzdCAiJHtob3N0X29zJSUtKn0iID0gImxpbnV4IiAtbyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIngkZW5hYmxlX25lb25fcnRjZCIgPSAieG5vIl0sIFsKKyAgICAgICAgICAgICAgIENGTEFHUz0kU0FWRURfQ0ZMQUdTCisgICAgICAgICAgICAgICBBQ19ERUZJTkUoV0VCUF9IQVZFX05FT04sIFsxXSwgW1NldCB0byAxIGlmIE5FT04gaXMgc3VwcG9ydGVkXSkKKyAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgXSxbCisgICAgICAgICAgICAgICBBQ19NU0dfV0FSTihtNF9ub3JtYWxpemUoW05FT04gcnVudGltZSBjcHUtZGV0ZWN0aW9uIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuYXZhaWxhYmxlIGZvciAke2hvc3Rfb3MlJS0qfS4gRm9yY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBDRkxBR1M9LW1mcHU9bmVvbiBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLWRpc2FibGUtbmVvbi1ydGNkLl0pKQorICAgICAgICAgICAgICAgZW5hYmxlX25lb25fcnRjZD1ubworICAgICAgICAgICAgICAgTkVPTl9GTEFHUz0iIgorICAgICAgICAgICAgIF0pCisgICAgICAgICAgIF0sWworICAgICAgICAgICAgIENGTEFHUz0kU0FWRURfQ0ZMQUdTCisgICAgICAgICAgICAgQUNfREVGSU5FKFdFQlBfSEFWRV9ORU9OLCBbMV0sIFtTZXQgdG8gMSBpZiBORU9OIGlzIHN1cHBvcnRlZF0pCisgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgXSldKQorICAgICAgICBDRkxBR1M9JFNBVkVEX0NGTEFHUworICAgICAgZG9uZQorCisgICAgICBBU19JRihbdGVzdCAtbiAiJE5FT05fRkxBR1MiXSwgWworICAgICAgICAjIElmIE5FT04gaXMgYXZhaWxhYmxlIGFuZCBydGNkIGlzIGRpc2FibGVkIGFwcGx5IE5FT05fRkxBR1MgZ2xvYmFsbHkuCisgICAgICAgIEFTX0lGKFt0ZXN0ICJ4JGVuYWJsZV9uZW9uX3J0Y2QiID0gInhubyJdLCBbCisgICAgICAgICAgQU1fQ0ZMQUdTPSIkQU1fQ0ZMQUdTICRORU9OX0ZMQUdTIgorICAgICAgICAgIE5FT05fRkxBR1M9IiJdLAorICAgICAgICAgIFtBQ19ERUZJTkUoV0VCUF9IQVZFX05FT05fUlRDRCwgWzFdLAorICAgICAgICAgICAgICAgICAgICAgW1NldCB0byAxIGlmIHJ1bnRpbWUgZGV0ZWN0aW9uIG9mIE5FT04gaXMgZW5hYmxlZF0pXSldKQorCisgICAgICBjYXNlICIkaG9zdF9vcyIgaW4KKyAgICAgICAgKmFuZHJvaWQqKSBBQ19DSEVDS19IRUFERVJTKFtjcHUtZmVhdHVyZXMuaF0pIDs7CisgICAgICBlc2FjCisgICAgICA7OworICBlc2FjCisgIEFDX1NVQlNUKFtORU9OX0ZMQUdTXSldKQorCitkbmwgPT09IENMRUFSX0xJQlZBUlMoW3Zhcl9wZnhdKQorZG5sID09PSAgIENsZWFycyA8dmFyX3BmeD5fe0lOQ0xVREVTLExJQlN9LgorQUNfREVGVU4oW0NMRUFSX0xJQlZBUlNdLCBbJDFfSU5DTFVERVM9IiI7ICQxX0xJQlM9IiJdKQorCitkbmwgPT09IFdJVEhMSUJfT1BUSU9OKFtvcHRfcGZ4XSwgW291dHZhcl9wZnhdKQorZG5sID09PSAgIERlZmluZXMgLS13aXRoLTxvcHRfcGZ4PntpbmNsdWRlLGxpYn1kaXIgb3B0aW9ucyB3aGljaCBzZXQKK2RubCA9PT0gICB0aGUgdmFyaWFibGVzIDxvdXR2YXJfcGZ4Pl97SU5DTFVERVMsTElCU30uCitBQ19ERUZVTihbV0lUSExJQl9PUFRJT05dLAorICBbQUNfQVJHX1dJVEgoWyQxaW5jbHVkZWRpcl0sCisgICAgICAgICAgICAgICBBU19IRUxQX1NUUklORyhbLS13aXRoLSQxaW5jbHVkZWRpcj1ESVJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3VzZSAkMiBpbmNsdWRlcyBmcm9tIERJUl0pLAorICAgICAgICAgICAgICAgJDJfSU5DTFVERVM9Ii1JJHdpdGh2YWwiKQorICAgQUNfQVJHX1dJVEgoWyQxbGliZGlyXSwKKyAgICAgICAgICAgICAgIEFTX0hFTFBfU1RSSU5HKFstLXdpdGgtJDFsaWJkaXI9RElSXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt1c2UgJDIgbGlicmFyaWVzIGZyb20gRElSXSksCisgICAgICAgICAgICAgICBbJDJfTElCUz0iLUwkd2l0aHZhbCJdKV0pCisKK2RubCA9PT0gTElCQ0hFQ0tfUFJPTE9HVUUoW3Zhcl9wZnhdKQorZG5sID09PSAgIENhY2hlcyB0aGUgY3VycmVudCB2YWx1ZXMgb2YgQ1BQRkxBR1MvTElCUyBpbiBTQVZFRF8qIHRoZW4KK2RubCA9PT0gICBwcmVwZW5kcyB0aGUgY3VycmVudCB2YWx1ZXMgd2l0aCA8dmFyX3BmeD5fe0lOQ0xVREVTLExJQlN9LgorQUNfREVGVU4oW0xJQkNIRUNLX1BST0xPR1VFXSwKKyAgICAgICAgIFtTQVZFRF9DUFBGTEFHUz0kQ1BQRkxBR1MKKyAgICAgICAgICBTQVZFRF9MSUJTPSRMSUJTCisgICAgICAgICAgQ1BQRkxBR1M9IiQkMV9JTkNMVURFUyAkQ1BQRkxBR1MiCisgICAgICAgICAgTElCUz0iJCQxX0xJQlMgJExJQlMiXSkKKworZG5sID09PSBMSUJDSEVDS19FUElMT0dVRShbdmFyX3BmeF0pCitkbmwgPT09ICAgUmVzdG9yZXMgdGhlIHZhbHVlcyBvZiBDUFBGTEFHUy9MSUJTIGZyb20gU0FWRURfKiBhbmQgZXhwb3J0cworZG5sID09PSAgIDx2YXJfcGZ4Pl97SU5DTFVERVMsTElCU30gd2l0aCBBQ19TVUJTVC4KK0FDX0RFRlVOKFtMSUJDSEVDS19FUElMT0dVRV0sCisgICAgICAgICBbQUNfU1VCU1QoJDFfTElCUykKKyAgICAgICAgICBBQ19TVUJTVCgkMV9JTkNMVURFUykKKyAgICAgICAgICBDUFBGTEFHUz0kU0FWRURfQ1BQRkxBR1MKKyAgICAgICAgICBMSUJTPSRTQVZFRF9MSUJTXSkKKworZG5sID09PSBDaGVjayBmb3IgZ2NjIGJ1aWx0aW5zCisKK2RubCA9PT0gQ0hFQ0tfRk9SX0JVSUxUSU4oW2J1aWx0aW5dLCBbcGFyYW1dLCBbZGVmaW5lXSkKK2RubCA9PT0gICBsaW5rcyBhIEMgQUNfTEFOR19QUk9HUkFNLCB3aXRoIDxidWlsdGluPig8cGFyYW0+KQorZG5sID09PSAgIEFDX0RFRklORSdpbmcgPGRlZmluZT4gaWYgc3VjY2Vzc2Z1bC4KK0FDX0RFRlVOKFtDSEVDS19GT1JfQlVJTFRJTl0sCisgICAgICAgICBbQUNfTEFOR19QVVNIKFtDXSkKKyAgICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkMV0pCisgICAgICAgICAgQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbXSwgWyh2b2lkKSQxKCQyKV0pXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbQUNfTVNHX1JFU1VMVChbeWVzXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUNfREVGSU5FKFskM10sIFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTZXQgdG8gMSBpZiAkMSBpcyBhdmFpbGFibGVdKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgW0FDX01TR19SRVNVTFQoW25vXSldKSwKKyAgICAgICAgICBBQ19MQU5HX1BPUF0pCisKK2RubCBBQ19DSEVDS19GVU5DIGRvZXNuJ3Qgd29yayB3aXRoIGJ1aWx0aW4ncy4KK0NIRUNLX0ZPUl9CVUlMVElOKFtfX2J1aWx0aW5fYnN3YXAxNl0sIFsxdSA8PCAxNV0sIFtIQVZFX0JVSUxUSU5fQlNXQVAxNl0pCitDSEVDS19GT1JfQlVJTFRJTihbX19idWlsdGluX2Jzd2FwMzJdLCBbMXUgPDwgMzFdLCBbSEFWRV9CVUlMVElOX0JTV0FQMzJdKQorQ0hFQ0tfRk9SX0JVSUxUSU4oW19fYnVpbHRpbl9ic3dhcDY0XSwgWzF1bGwgPDwgNjNdLCBbSEFWRV9CVUlMVElOX0JTV0FQNjRdKQorCitkbmwgPT09IENoZWNrIGZvciBwdGhyZWFkIHN1cHBvcnQKK0FDX0FSR19FTkFCTEUoW3RocmVhZGluZ10sCisgICAgICAgICAgICAgIEFTX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtdGhyZWFkaW5nXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0Rpc2FibGUgZGV0ZWN0aW9uIG9mIHRocmVhZCBzdXBwb3J0XSksLAorICAgICAgICAgICAgICBbZW5hYmxlX3RocmVhZGluZz15ZXNdKQoraWYgdGVzdCAiJGVuYWJsZV90aHJlYWRpbmciID0gInllcyI7IHRoZW4KKyAgQUNfTVNHX05PVElDRShbY2hlY2tpbmcgZm9yIHRocmVhZGluZyBzdXBwb3J0Li4uXSkKKyAgQVhfUFRIUkVBRChbQUNfREVGSU5FKFtXRUJQX1VTRV9USFJFQURdLCBbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbVW5kZWZpbmUgdGhpcyB0byBkaXNhYmxlIHRocmVhZCBzdXBwb3J0Ll0pCisgICAgICAgICAgICAgIExJQlM9IiRQVEhSRUFEX0xJQlMgJExJQlMiCisgICAgICAgICAgICAgIENGTEFHUz0iJENGTEFHUyAkUFRIUkVBRF9DRkxBR1MiCisgICAgICAgICAgICAgIENDPSIkUFRIUkVBRF9DQyIKKyAgICAgICAgICAgICBdLAorICAgICAgICAgICAgIFtBQ19DSEVDS19GVU5DKFtfYmVnaW50aHJlYWRleF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0FDX0RFRklORShbV0VCUF9VU0VfVEhSRUFEXSwgWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1VuZGVmaW5lIHRoaXMgdG8gZGlzYWJsZSB0aHJlYWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0Ll0pXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZW5hYmxlX3RocmVhZGluZz1ub10pXSkKK2ZpCitBQ19NU0dfTk9USUNFKFtjaGVja2luZyBpZiB0aHJlYWRpbmcgaXMgZW5hYmxlZC4uLiAke2VuYWJsZV90aHJlYWRpbmctbm99XSkKKworZG5sID09PSBjaGVjayBmb3IgT3BlbkdML0dMVVQgc3VwcG9ydCA9PT0KKworQUNfQVJHX0VOQUJMRShbZ2xdLCBBU19IRUxQX1NUUklORyhbLS1kaXNhYmxlLWdsXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0Rpc2FibGUgZGV0ZWN0aW9uIG9mIE9wZW5HTCBzdXBwb3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAPDpAZGVmYXVsdD1hdXRvQDo+QF0pKQorQVNfSUYoW3Rlc3QgIngkZW5hYmxlX2dsIiAhPSAieG5vIl0sIFsKKyAgQ0xFQVJfTElCVkFSUyhbR0xdKQorICBXSVRITElCX09QVElPTihbZ2xdLCBbR0xdKQorCisgIExJQkNIRUNLX1BST0xPR1VFKFtHTF0pCisKKyAgZ2x1dF9jZmxhZ3M9Im5vbmUiCisgIGdsdXRfbGRmbGFncz0ibm9uZSIKKyAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGRhcndpbiopCisgICAgICAjIFNwZWNpYWwgY2FzZSBmb3IgT1NYIGJ1aWxkcy4gQXBwZW5kIHRoZXNlIHRvIGdpdmUgdGhlIHVzZXIgYSBjaGFuY2UgdG8KKyAgICAgICMgb3ZlcnJpZGUgd2l0aCAtLXdpdGgtZ2wqCisgICAgICBnbHV0X2NmbGFncz0iJGdsdXRfY2ZsYWdzfC1mcmFtZXdvcmsgR0xVVCAtZnJhbWV3b3JrIE9wZW5HTCIKKyAgICAgIGdsdXRfbGRmbGFncz0iJGdsdXRfbGRmbGFnc3wtZnJhbWV3b3JrIEdMVVQgLWZyYW1ld29yayBPcGVuR0wiCisgICAgICAjIHF1aWV0IGRlcHJlY2F0aW9uIHdhcm5pbmdzIGZvciBnbHV0CisgICAgICBURVNUX0FORF9BRERfQ0ZMQUdTKFtBTV9DRkxBR1NdLCBbLVduby1kZXByZWNhdGVkLWRlY2xhcmF0aW9uc10pCisgICAgICA7OworICBlc2FjCisKKyAgR0xVVF9TQVZFRF9DUFBGTEFHUz0iJENQUEZMQUdTIgorICBTQVZFRF9JRlM9IiRJRlMiCisgIElGUz0ifCIKKyAgZm9yIGZsYWcgaW4gJGdsdXRfY2ZsYWdzOyBkbworICAgICMgcmVzdG9yZSBJRlMgaW1tZWRpYXRlbHkgYXMgdGhlIGF1dG9jb25mIG1hY3JvcyBtYXkgbmVlZCB0aGUgZGVmYXVsdC4KKyAgICBJRlM9IiRTQVZFRF9JRlMiCisgICAgdW5zZXQgYWNfY3ZfaGVhZGVyX0dMX2dsdXRfaAorICAgIHVuc2V0IGFjX2N2X2hlYWRlcl9PcGVuR0xfZ2x1dF9oCisKKyAgICBjYXNlICRmbGFnIGluCisgICAgICBub25lKSA7OworICAgICAgKikgQ1BQRkxBR1M9IiRmbGFnICRDUFBGTEFHUyI7OworICAgIGVzYWMKKyAgICBBQ19DSEVDS19IRUFERVJTKFtHTC9nbHV0LmggR0xVVC9nbHV0LmggT3BlbkdML2dsdXQuaF0sCisgICAgICAgICAgICAgICAgICAgICBbZ2x1dF9oZWFkZXJzPXllczsKKyAgICAgICAgICAgICAgICAgICAgICB0ZXN0ICIkZmxhZyIgPSAibm9uZSIgfHwgR0xfSU5DTFVERVM9IiRDUFBGTEFHUyI7CisgICAgICAgICAgICAgICAgICAgICAgYnJlYWtdKQorICAgIENQUEZMQUdTPSIkR0xVVF9TQVZFRF9DUFBGTEFHUyIKKyAgICB0ZXN0ICIkZ2x1dF9oZWFkZXJzIiA9ICJ5ZXMiICYmIGJyZWFrCisgIGRvbmUKKyAgSUZTPSIkU0FWRURfSUZTIgorCisgIGlmIHRlc3QgIiRnbHV0X2hlYWRlcnMiID0gInllcyI7IHRoZW4KKyAgICBBQ19MQU5HX1BVU0goW0NdKQorICAgIEdMVVRfU0FWRURfTERGTEFHUz0iJExERkxBR1MiCisgICAgU0FWRURfSUZTPSIkSUZTIgorICAgIElGUz0ifCIKKyAgICBmb3IgZmxhZyBpbiAkZ2x1dF9sZGZsYWdzOyBkbworICAgICAgIyByZXN0b3JlIElGUyBpbW1lZGlhdGVseSBhcyB0aGUgYXV0b2NvbmYgbWFjcm9zIG1heSBuZWVkIHRoZSBkZWZhdWx0LgorICAgICAgSUZTPSIkU0FWRURfSUZTIgorICAgICAgdW5zZXQgYWNfY3Zfc2VhcmNoX2dsQmVnaW4KKworICAgICAgY2FzZSAkZmxhZyBpbgorICAgICAgICBub25lKSA7OworICAgICAgICAqKSBMREZMQUdTPSIkZmxhZyAkTERGTEFHUyI7OworICAgICAgZXNhYworCisgICAgICAjIGZpbmQgbGliR0wKKyAgICAgIEdMX1NBVkVEX0xJQlM9IiRMSUJTIgorICAgICAgQUNfU0VBUkNIX0xJQlMoW2dsQmVnaW5dLCBbR0wgT3BlbkdMIG9wZW5nbDMyXSkKKyAgICAgIExJQlM9IiRHTF9TQVZFRF9MSUJTIgorCisgICAgICAjIEEgZGlyZWN0IGxpbmsgdG8gbGliR0wgbWF5IG5vdCBiZSBuZWNlc3Nhcnkgb24gZS5nLiwgbGludXguCisgICAgICBHTFVUX1NBVkVEX0xJQlM9IiRMSUJTIgorICAgICAgZm9yIGxpYiBpbiAiIiAiLWxnbHV0IiAiLWxnbHV0ICRhY19jdl9zZWFyY2hfZ2xCZWdpbiI7IGRvCisgICAgICAgIExJQlM9IiRsaWIiCisgICAgICAgIEFDX0xJTktfSUZFTFNFKAorICAgICAgICAgIFtBQ19MQU5HX1BST0dSQU0oWworICAgICAgICAgICAgICNpZmRlZiBfX2NwbHVzcGx1cworICAgICAgICAgICAgICMgZGVmaW5lIEVYVEVSTl9DIGV4dGVybiAiQyIKKyAgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICMgZGVmaW5lIEVYVEVSTl9DCisgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgRVhURVJOX0MgY2hhciBnbE9ydGhvKCk7CisgICAgICAgICAgICAgRVhURVJOX0MgY2hhciBnbHV0TWFpbkxvb3AoKTsKKyAgICAgICAgICAgIF0sWworICAgICAgICAgICAgIGdsT3J0aG8oKTsKKyAgICAgICAgICAgICBnbHV0TWFpbkxvb3AoKTsKKyAgICAgICAgICAgIF0pCisgICAgICAgICAgXSwKKyAgICAgICAgICBBQ19ERUZJTkUoV0VCUF9IQVZFX0dMLCBbMV0sCisgICAgICAgICAgICAgICAgICAgIFtTZXQgdG8gMSBpZiBPcGVuR0wgaXMgc3VwcG9ydGVkXSkKKyAgICAgICAgICBbZ2x1dF9zdXBwb3J0PXllc10sIFtdCisgICAgICAgICkKKyAgICAgICAgaWYgdGVzdCAiJGdsdXRfc3VwcG9ydCIgPSAieWVzIjsgdGhlbgorICAgICAgICAgIEdMX0xJQlM9IiRMREZMQUdTICRsaWIiCisgICAgICAgICAgYnJlYWsKKyAgICAgICAgZmkKKyAgICAgIGRvbmUKKyAgICAgIExJQlM9IiRHTFVUX1NBVkVEX0xJQlMiCisgICAgICBMREZMQUdTPSIkR0xVVF9TQVZFRF9MREZMQUdTIgorICAgICAgdGVzdCAiJGdsdXRfc3VwcG9ydCIgPSAieWVzIiAmJiBicmVhaworICAgIGRvbmUKKyAgICBJRlM9IiRTQVZFRF9JRlMiCisgICAgQUNfTEFOR19QT1AKKyAgZmkKKworICBMSUJDSEVDS19FUElMT0dVRShbR0xdKQorCisgIGlmIHRlc3QgIiRnbHV0X3N1cHBvcnQiID0gInllcyIgLWEgIiRlbmFibGVfbGlid2VicGRlbXV4IiA9ICJ5ZXMiOyB0aGVuCisgICAgYnVpbGRfdndlYnA9eWVzCisgIGZpCitdKQorQU1fQ09ORElUSU9OQUwoW0JVSUxEX1ZXRUJQXSwgW3Rlc3QgIiRidWlsZF92d2VicCIgPSAieWVzIl0pCisKK2RubCA9PT0gY2hlY2sgZm9yIFNETCBzdXBwb3J0ID09PQorCitBQ19BUkdfRU5BQkxFKFtzZGxdLAorICAgICAgICAgICAgICBBU19IRUxQX1NUUklORyhbLS1kaXNhYmxlLXNkbF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtEaXNhYmxlIGRldGVjdGlvbiBvZiBTREwgc3VwcG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDw6QGRlZmF1bHQ9YXV0b0A6PkBdKSkKK0FTX0lGKFt0ZXN0ICJ4JGVuYWJsZV9zZGwiICE9ICJ4bm8iXSwgWworICBDTEVBUl9MSUJWQVJTKFtTRExdKQorICBBQ19QQVRIX1BST0dTKFtMSUJTRExfQ09ORklHXSwgW3NkbC1jb25maWddKQorICBpZiB0ZXN0IC1uICIkTElCU0RMX0NPTkZJRyI7IHRoZW4KKyAgICBTRExfSU5DTFVERVM9YCRMSUJTRExfQ09ORklHIC0tY2ZsYWdzYAorICAgIFNETF9MSUJTPSJgJExJQlNETF9DT05GSUcgLS1saWJzYCIKKyAgZmkKKworICBXSVRITElCX09QVElPTihbc2RsXSwgW1NETF0pCisKKyAgc2RsX2hlYWRlcj0ibm8iCisgIExJQkNIRUNLX1BST0xPR1VFKFtTRExdKQorICBBQ19DSEVDS19IRUFERVIoW1NETC9TREwuaF0sIFtzZGxfaGVhZGVyPSJTREwvU0RMLmgiXSwKKyAgICAgICAgICAgICAgICAgIFtBQ19DSEVDS19IRUFERVIoW1NETC5oXSwgW3NkbF9oZWFkZXI9IlNETC5oIl0sCisgICAgICAgICAgICAgICAgICBbQUNfTVNHX1dBUk4oU0RMIGxpYnJhcnkgbm90IGF2YWlsYWJsZSAtIG5vIHNkbC5oKV0pXSkKKyAgaWYgdGVzdCB4IiRzZGxfaGVhZGVyIiAhPSAieG5vIjsgdGhlbgorICAgIEFDX0xBTkdfUFVTSChDKQorICAgIFNETF9TQVZFRF9MSUJTPSIkTElCUyIKKyAgICBmb3IgbGliIGluICIiICItbFNETCIgIi1sU0RMbWFpbiAtbFNETCI7IGRvCisgICAgICBMSUJTPSIkU0RMX1NBVkVEX0xJQlMgJGxpYiIKKyAgICAgICMgUGVyZm9ybSBhIGZ1bGwgbGluayB0byBlbnN1cmUgU0RMX21haW4gaXMgcmVzb2x2ZWQgaWYgbmVlZGVkLgorICAgICAgQUNfTElOS19JRkVMU0UoCisgICAgICAgIFtBQ19MQU5HX1NPVVJDRShbCisgICAgICAgICAgICNpbmNsdWRlIDwkc2RsX2hlYWRlcj4KKyAgICAgICAgICAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgICAgICAgICAgU0RMX0luaXQoMCk7CisgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgIH1dKV0sCisgICAgICAgIFtTRExfTElCUz0iJExERkxBR1MgJExJQlMiCisgICAgICAgICBTRExfSU5DTFVERVM9IiRTRExfSU5DTFVERVMgLURXRUJQX0hBVkVfU0RMIgorICAgICAgICAgQUNfREVGSU5FKFdFQlBfSEFWRV9TREwsIFsxXSwKKyAgICAgICAgICAgICAgICAgICBbU2V0IHRvIDEgaWYgU0RMIGxpYnJhcnkgaXMgaW5zdGFsbGVkXSkKKyAgICAgICAgIHNkbF9zdXBwb3J0PXllc10KKyAgICAgICkKKyAgICAgIGlmIHRlc3QgeCIkc2RsX3N1cHBvcnQiID0gInh5ZXMiOyB0aGVuCisgICAgICAgIGJyZWFrCisgICAgICBmaQorICAgIGRvbmUKKyAgICAjIExJQlMgaXMgcmVzdG9yZWQgYnkgTElCQ0hFQ0tfRVBJTE9HVUUKKyAgICBBQ19MQU5HX1BPUAorICAgIGlmIHRlc3QgeCIkc2RsX2hlYWRlciIgPSAieFNETC5oIjsgdGhlbgorICAgICAgU0RMX0lOQ0xVREVTPSIkU0RMX0lOQ0xVREVTIC1EV0VCUF9IQVZFX0pVU1RfU0RMX0giCisgICAgZmkKKyAgZmkKKyAgTElCQ0hFQ0tfRVBJTE9HVUUoW1NETF0pCisKKyAgaWYgdGVzdCB4IiRzZGxfc3VwcG9ydCIgPSAieHllcyI7IHRoZW4KKyAgICBidWlsZF92d2VicF9zZGw9eWVzCisgIGVsc2UKKyAgICBBQ19NU0dfV0FSTihPcHRpb25hbCBTREwgbGlicmFyeSBub3QgZm91bmQpCisgIGZpCitdKQorCitBTV9DT05ESVRJT05BTChbQlVJTERfVldFQlBfU0RMXSwgW3Rlc3QgIiRidWlsZF92d2VicF9zZGwiID0gInllcyJdKQorCitkbmwgPT09IGNoZWNrIGZvciBQTkcgc3VwcG9ydCA9PT0KKworQUNfQVJHX0VOQUJMRShbcG5nXSwgQVNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1wbmddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0Rpc2FibGUgZGV0ZWN0aW9uIG9mIFBORyBmb3JtYXQgc3VwcG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA8OkBkZWZhdWx0PWF1dG9AOj5AXSkpCitBU19JRihbdGVzdCAieCRlbmFibGVfcG5nIiAhPSAieG5vIl0sIFsKKyAgQ0xFQVJfTElCVkFSUyhbUE5HXSkKKyAgQUNfUEFUSF9QUk9HUyhbTElCUE5HX0NPTkZJR10sCisgICAgICAgICAgICAgICAgW2xpYnBuZy1jb25maWcgbGlicG5nMTYtY29uZmlnIGxpYnBuZzE1LWNvbmZpZyBsaWJwbmcxNC1jb25maWcgXAorICAgICAgICAgICAgICAgICBsaWJwbmcxMi1jb25maWddKQorICBpZiB0ZXN0IC1uICIkTElCUE5HX0NPTkZJRyI7IHRoZW4KKyAgICBQTkdfSU5DTFVERVM9YCRMSUJQTkdfQ09ORklHIC0tY2ZsYWdzYAorICAgIFBOR19MSUJTPSJgJExJQlBOR19DT05GSUcgLS1sZGZsYWdzYCIKKyAgZmkKKworICBXSVRITElCX09QVElPTihbcG5nXSwgW1BOR10pCisKKyAgTElCQ0hFQ0tfUFJPTE9HVUUoW1BOR10pCisgIEFDX0NIRUNLX0hFQURFUihwbmcuaCwKKyAgICBBQ19TRUFSQ0hfTElCUyhwbmdfZ2V0X2xpYnBuZ192ZXIsIFtwbmddLAorICAgICAgICAgICAgICAgICAgIFt0ZXN0ICIkYWNfY3Zfc2VhcmNoX3BuZ19nZXRfbGlicG5nX3ZlciIgPSAibm9uZSByZXF1aXJlZCIgXAorICAgICAgICAgICAgICAgICAgICAgIHx8IFBOR19MSUJTPSIkUE5HX0xJQlMgJGFjX2N2X3NlYXJjaF9wbmdfZ2V0X2xpYnBuZ192ZXIiCisgICAgICAgICAgICAgICAgICAgIFBOR19JTkNMVURFUz0iJFBOR19JTkNMVURFUyAtRFdFQlBfSEFWRV9QTkciCisgICAgICAgICAgICAgICAgICAgIEFDX0RFRklORShXRUJQX0hBVkVfUE5HLCBbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU2V0IHRvIDEgaWYgUE5HIGxpYnJhcnkgaXMgaW5zdGFsbGVkXSkKKyAgICAgICAgICAgICAgICAgICAgcG5nX3N1cHBvcnQ9eWVzCisgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAgICBbQUNfTVNHX1dBUk4oT3B0aW9uYWwgcG5nIGxpYnJhcnkgbm90IGZvdW5kKQorICAgICAgICAgICAgICAgICAgICBQTkdfTElCUz0iIgorICAgICAgICAgICAgICAgICAgICBQTkdfSU5DTFVERVM9IiIKKyAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICAgIFskTUFUSF9MSUJTXSksCisgICAgW0FDX01TR19XQVJOKHBuZyBsaWJyYXJ5IG5vdCBhdmFpbGFibGUgLSBubyBwbmcuaCkKKyAgICAgUE5HX0xJQlM9IiIKKyAgICAgUE5HX0lOQ0xVREVTPSIiCisgICAgXSwKKyAgKQorICBMSUJDSEVDS19FUElMT0dVRShbUE5HXSkKK10pCisKK2RubCA9PT0gY2hlY2sgZm9yIEpQRUcgc3VwcG9ydCA9PT0KKworQUNfQVJHX0VOQUJMRShbanBlZ10sCisgICAgICAgICAgICAgIEFTX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtanBlZ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtEaXNhYmxlIGRldGVjdGlvbiBvZiBKUEVHIGZvcm1hdCBzdXBwb3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAPDpAZGVmYXVsdD1hdXRvQDo+QF0pKQorQVNfSUYoW3Rlc3QgIngkZW5hYmxlX2pwZWciICE9ICJ4bm8iXSwgWworICBDTEVBUl9MSUJWQVJTKFtKUEVHXSkKKyAgV0lUSExJQl9PUFRJT04oW2pwZWddLCBbSlBFR10pCisKKyAgTElCQ0hFQ0tfUFJPTE9HVUUoW0pQRUddKQorICBBQ19DSEVDS19IRUFERVIoanBlZ2xpYi5oLAorICAgIEFDX0NIRUNLX0xJQihqcGVnLCBqcGVnX3NldF9kZWZhdWx0cywKKyAgICAgICAgICAgICAgICAgW0pQRUdfTElCUz0iJEpQRUdfTElCUyAtbGpwZWciCisgICAgICAgICAgICAgICAgICBKUEVHX0lOQ0xVREVTPSIkSlBFR19JTkNMVURFUyAtRFdFQlBfSEFWRV9KUEVHIgorICAgICAgICAgICAgICAgICAgQUNfREVGSU5FKFdFQlBfSEFWRV9KUEVHLCBbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NldCB0byAxIGlmIEpQRUcgbGlicmFyeSBpcyBpbnN0YWxsZWRdKQorICAgICAgICAgICAgICAgICAganBlZ19zdXBwb3J0PXllcworICAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICBBQ19NU0dfV0FSTihPcHRpb25hbCBqcGVnIGxpYnJhcnkgbm90IGZvdW5kKSwKKyAgICAgICAgICAgICAgICAgWyRNQVRIX0xJQlNdKSwKKyAgICBBQ19NU0dfV0FSTihqcGVnIGxpYnJhcnkgbm90IGF2YWlsYWJsZSAtIG5vIGpwZWdsaWIuaCkKKyAgKQorICBMSUJDSEVDS19FUElMT0dVRShbSlBFR10pCitdKQorCitkbmwgPT09IGNoZWNrIGZvciBUSUZGIHN1cHBvcnQgPT09CisKK0FDX0FSR19FTkFCTEUoW3RpZmZdLAorICAgICAgICAgICAgICBBU19IRUxQX1NUUklORyhbLS1kaXNhYmxlLXRpZmZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbRGlzYWJsZSBkZXRlY3Rpb24gb2YgVElGRiBmb3JtYXQgc3VwcG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDw6QGRlZmF1bHQ9YXV0b0A6PkBdKSkKK0FTX0lGKFt0ZXN0ICJ4JGVuYWJsZV90aWZmIiAhPSAieG5vIl0sIFsKKyAgQ0xFQVJfTElCVkFSUyhbVElGRl0pCisgIFdJVEhMSUJfT1BUSU9OKFt0aWZmXSwgW1RJRkZdKQorCisgIExJQkNIRUNLX1BST0xPR1VFKFtUSUZGXSkKKyAgQUNfQ0hFQ0tfSEVBREVSKHRpZmZpby5oLAorICAgIEFDX0NIRUNLX0xJQih0aWZmLCBUSUZGR2V0VmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgW1RJRkZfTElCUz0iJFRJRkZfTElCUyAtbHRpZmYiCisgICAgICAgICAgICAgICAgICBUSUZGX0lOQ0xVREVTPSIkVElGRl9JTkNMVURFUyAtRFdFQlBfSEFWRV9USUZGIgorICAgICAgICAgICAgICAgICAgQUNfREVGSU5FKFdFQlBfSEFWRV9USUZGLCBbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NldCB0byAxIGlmIFRJRkYgbGlicmFyeSBpcyBpbnN0YWxsZWRdKQorICAgICAgICAgICAgICAgICAgdGlmZl9zdXBwb3J0PXllcworICAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICBBQ19NU0dfV0FSTihPcHRpb25hbCB0aWZmIGxpYnJhcnkgbm90IGZvdW5kKSwKKyAgICAgICAgICAgICAgICAgWyRNQVRIX0xJQlNdKSwKKyAgICBBQ19NU0dfV0FSTih0aWZmIGxpYnJhcnkgbm90IGF2YWlsYWJsZSAtIG5vIHRpZmZpby5oKQorICApCisgIExJQkNIRUNLX0VQSUxPR1VFKFtUSUZGXSkKK10pCisKK2RubCA9PT0gY2hlY2sgZm9yIEdJRiBzdXBwb3J0ID09PQorCitBQ19BUkdfRU5BQkxFKFtnaWZdLCBBU19IRUxQX1NUUklORyhbLS1kaXNhYmxlLWdpZl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbRGlzYWJsZSBkZXRlY3Rpb24gb2YgR0lGIGZvcm1hdCBzdXBwb3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDw6QGRlZmF1bHQ9YXV0b0A6PkBdKSkKK0FTX0lGKFt0ZXN0ICJ4JGVuYWJsZV9naWYiICE9ICJ4bm8iXSwgWworICBDTEVBUl9MSUJWQVJTKFtHSUZdKQorICBXSVRITElCX09QVElPTihbZ2lmXSwgW0dJRl0pCisKKyAgTElCQ0hFQ0tfUFJPTE9HVUUoW0dJRl0pCisgIEFDX0NIRUNLX0hFQURFUihnaWZfbGliLmgsCisgICAgQUNfQ0hFQ0tfTElCKFtnaWZdLCBbREdpZk9wZW5GaWxlSGFuZGxlXSwKKyAgICAgICAgICAgICAgICAgW0dJRl9MSUJTPSIkR0lGX0xJQlMgLWxnaWYiCisgICAgICAgICAgICAgICAgICBBQ19ERUZJTkUoV0VCUF9IQVZFX0dJRiwgWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTZXQgdG8gMSBpZiBHSUYgbGlicmFyeSBpcyBpbnN0YWxsZWRdKQorICAgICAgICAgICAgICAgICAgZ2lmX3N1cHBvcnQ9eWVzCisgICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgIEFDX01TR19XQVJOKE9wdGlvbmFsIGdpZiBsaWJyYXJ5IG5vdCBmb3VuZCksCisgICAgICAgICAgICAgICAgIFskTUFUSF9MSUJTXSksCisgICAgQUNfTVNHX1dBUk4oZ2lmIGxpYnJhcnkgbm90IGF2YWlsYWJsZSAtIG5vIGdpZl9saWIuaCkKKyAgKQorICBMSUJDSEVDS19FUElMT0dVRShbR0lGXSkKKworICBpZiB0ZXN0ICIkZ2lmX3N1cHBvcnQiID0gInllcyIgLWEgXAorICAgICAgICAgICIkZW5hYmxlX2xpYndlYnBkZW11eCIgPSAieWVzIjsgdGhlbgorICAgIGJ1aWxkX2FuaW1fZGlmZj15ZXMKKyAgZmkKKworICBpZiB0ZXN0ICIkZ2lmX3N1cHBvcnQiID0gInllcyIgLWEgXAorICAgICAgICAgICIkZW5hYmxlX2xpYndlYnBtdXgiID0gInllcyI7IHRoZW4KKyAgICBidWlsZF9naWYyd2VicD15ZXMKKyAgZmkKK10pCitBTV9DT05ESVRJT05BTChbQlVJTERfQU5JTURJRkZdLCBbdGVzdCAiJHtidWlsZF9hbmltX2RpZmZ9IiA9ICJ5ZXMiXSkKK0FNX0NPTkRJVElPTkFMKFtCVUlMRF9HSUYyV0VCUF0sIFt0ZXN0ICIke2J1aWxkX2dpZjJ3ZWJwfSIgPSAieWVzIl0pCisKK2lmIHRlc3QgIiRlbmFibGVfbGlid2VicGRlbXV4IiA9ICJ5ZXMiIC1hICIkZW5hYmxlX2xpYndlYnBtdXgiID0gInllcyI7IHRoZW4KKyAgYnVpbGRfaW1nMndlYnA9eWVzCitmaQorQU1fQ09ORElUSU9OQUwoW0JVSUxEX0lNRzJXRUJQXSwgW3Rlc3QgIiR7YnVpbGRfaW1nMndlYnB9IiA9ICJ5ZXMiXSkKKworaWYgdGVzdCAiJGVuYWJsZV9saWJ3ZWJwbXV4IiA9ICJ5ZXMiOyB0aGVuCisgIGJ1aWxkX3dlYnBpbmZvPXllcworZmkKK0FNX0NPTkRJVElPTkFMKFtCVUlMRF9XRUJQSU5GT10sIFt0ZXN0ICIke2J1aWxkX3dlYnBpbmZvfSIgPSAieWVzIl0pCisKK2RubCA9PT0gY2hlY2sgZm9yIFdJQyBzdXBwb3J0ID09PQorCitBQ19BUkdfRU5BQkxFKFt3aWNdLAorICAgICAgICAgICAgICBBU19IRUxQX1NUUklORyhbLS1kaXNhYmxlLXdpY10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtEaXNhYmxlIFdpbmRvd3MgSW1hZ2luZyBDb21wb25lbnQgKFdJQykgZGV0ZWN0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDw6QGRlZmF1bHQ9YXV0b0A6PkBdKSwsCisgICAgICAgICAgICAgIFtlbmFibGVfd2ljPXllc10pCisKK2Nhc2UgJGhvc3Rfb3MgaW4KK21pbmd3KikKK2lmIHRlc3QgIiRlbmFibGVfd2ljIiA9ICJ5ZXMiOyB0aGVuCisgIEFDX0NIRUNLX0hFQURFUlMoW3dpbmNvZGVjLmggc2hsd2FwaS5oIHdpbmRvd3MuaF0pCisgIGlmIHRlc3QgIiRhY19jdl9oZWFkZXJfd2luY29kZWNfaCIgPSAieWVzIjsgdGhlbgorICAgIEFDX01TR19DSEVDS0lORyhmb3IgV2luZG93cyBJbWFnaW5nIENvbXBvbmVudCBzdXBwb3J0KQorICAgIFNBVkVEX0xJQlM9JExJQlMKKyAgICBMSUJTPSItbHNobHdhcGkgLWxvbGUzMiAkTElCUyIKKyAgICAjIG1hdGNoIGluY2x1ZGUgc3RydWN0dXJlIGZyb20gW2NkXXdlYnAuYworICAgIHdpY19oZWFkZXJzPSIKKyAgICAgICNkZWZpbmUgSU5JVEdVSUQKKyAgICAgICNkZWZpbmUgQ0lOVEVSRkFDRQorICAgICAgI2RlZmluZSBDT0JKTUFDUk9TCisgICAgICAjZGVmaW5lIF9XSU4zMl9JRSAweDUwMAorCisgICAgICAjaW5jbHVkZSA8c2hsd2FwaS5oPgorICAgICAgI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyAgICAgICNpbmNsdWRlIDx3aW5jb2RlYy5oPgorICAgICAgIgorICAgICMgdGVzdCBmb3IgZnVuY3Rpb25zIGZyb20gZWFjaCBsaWIgYW5kIHRoZSBHVUlEIGlzIGNyZWF0ZWQgcHJvcGVybHkKKyAgICB3aWNfbWFpbj0iCisgICAgICBpbnQgbWFpbih2b2lkKSB7CisgICAgICAgIENMU0lEX1dJQ0ltYWdpbmdGYWN0b3J5OworICAgICAgICBDb0luaXRpYWxpemUoTlVMTCk7CisgICAgICAgIFNIQ3JlYXRlU3RyZWFtT25GaWxlKE5VTEwsIDAsIE5VTEwpOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgICIKKyAgICBBQ19MQU5HX1BVU0goQykKKyAgICBBQ19MSU5LX0lGRUxTRSgKKyAgICAgIFtBQ19MQU5HX1NPVVJDRShbCisgICAgICAgICAkd2ljX2hlYWRlcnMKKyAgICAgICAgICR3aWNfbWFpbl0pXSwKKyAgICAgIFt3aWNfc3VwcG9ydD15ZXNdLAorICAgICAgW3dpY19zdXBwb3J0PW5vXQorICAgICkKKyAgICBBQ19MQU5HX1BPUAorCisgICAgdGVzdCAiJHdpY19zdXBwb3J0IiA9ICJ5ZXMiIHx8IExJQlM9JFNBVkVEX0xJQlMKKyAgICBBQ19NU0dfUkVTVUxUKCR7d2ljX3N1cHBvcnQtbm99KQorICBmaQorZmkKK2VzYWMKKworZG5sID09PSBJZiAtLWVuYWJsZS1zd2FwLTE2Yml0LWNzcCBpcyBkZWZpbmVkLCBhZGQgLURXRUJQX1NXQVBfMTZCSVRfQ1NQPTEKKworVVNFX1NXQVBfMTZCSVRfQ1NQPSIiCitBQ19NU0dfQ0hFQ0tJTkcoaWYgLS1lbmFibGUtc3dhcC0xNmJpdC1jc3Agb3B0aW9uIGlzIHNwZWNpZmllZCkKK0FDX0FSR19FTkFCTEUoW3N3YXAtMTZiaXQtY3NwXSwKKyAgICAgICAgICAgICAgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXN3YXAtMTZiaXQtY3NwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0VuYWJsZSBieXRlIHN3YXAgZm9yIDE2IGJpdCBjb2xvcnNwYWNlc10pKQoraWYgdGVzdCAiJGVuYWJsZV9zd2FwXzE2Yml0X2NzcCIgPSAieWVzIjsgdGhlbgorICBVU0VfU1dBUF8xNkJJVF9DU1A9Ii1EV0VCUF9TV0FQXzE2QklUX0NTUD0xIgorZmkKK0FDX01TR19SRVNVTFQoJHtlbmFibGVfc3dhcF8xNmJpdF9jc3Atbm99KQorQUNfU1VCU1QoVVNFX1NXQVBfMTZCSVRfQ1NQKQorCitkbmwgPT09IElmIC0tZGlzYWJsZS1uZWFyLWxvc3NsZXNzIGlzIGRlZmluZWQsIGFkZCAtRFdFQlBfTkVBUl9MT1NTTEVTUz0wCisKK0FDX0RFRklORShXRUJQX05FQVJfTE9TU0xFU1MsIFsxXSwgW0VuYWJsZSBuZWFyIGxvc3NsZXNzIGVuY29kaW5nXSkKK0FDX01TR19DSEVDS0lORyhpZiAtLWRpc2FibGUtbmVhci1sb3NzbGVzcyBvcHRpb24gaXMgc3BlY2lmaWVkKQorQUNfQVJHX0VOQUJMRShbbmVhcl9sb3NzbGVzc10sCisgICAgICAgICAgICAgIEFTX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtbmVhci1sb3NzbGVzc10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtEaXNhYmxlIG5lYXIgbG9zc2xlc3MgZW5jb2RpbmddKSwKKyAgICAgICAgICAgICAgW10sIFtlbmFibGVfbmVhcl9sb3NzbGVzcz15ZXNdKQoraWYgdGVzdCAiJGVuYWJsZV9uZWFyX2xvc3NsZXNzIiA9ICJubyI7IHRoZW4KKyAgQUNfREVGSU5FKFdFQlBfTkVBUl9MT1NTTEVTUywgWzBdLCBbRW5hYmxlIG5lYXIgbG9zc2xlc3MgZW5jb2RpbmddKQorICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorZWxzZQorICBBQ19NU0dfUkVTVUxUKFtub10pCitmaQorCitkbmwgPT09IENoZWNrIHdoZXRoZXIgbGlid2VicG11eCBzaG91bGQgYmUgYnVpbHQKK0FDX01TR19DSEVDS0lORyh3aGV0aGVyIGxpYndlYnBtdXggaXMgdG8gYmUgYnVpbHQpCitBQ19BUkdfRU5BQkxFKFtsaWJ3ZWJwbXV4XSwKKyAgICAgICAgICAgICAgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWxpYndlYnBtdXhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbQnVpbGQgbGlid2VicG11eCBAPDpAZGVmYXVsdD1ub0A6PkBdKSkKK0FDX01TR19SRVNVTFQoJHtlbmFibGVfbGlid2VicG11eC1ub30pCitBTV9DT05ESVRJT05BTChbV0FOVF9NVVhdLCBbdGVzdCAiJGVuYWJsZV9saWJ3ZWJwbXV4IiA9ICJ5ZXMiXSkKKworZG5sID09PSBDaGVjayB3aGV0aGVyIGxpYndlYnBkZW11eCBzaG91bGQgYmUgYnVpbHQKK0FDX01TR19DSEVDS0lORyh3aGV0aGVyIGxpYndlYnBkZW11eCBpcyB0byBiZSBidWlsdCkKK0FDX0FSR19FTkFCTEUoW2xpYndlYnBkZW11eF0sCisgICAgICAgICAgICAgIEFTX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtbGlid2VicGRlbXV4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0Rpc2FibGUgbGlid2VicGRlbXV4IEA8OkBkZWZhdWx0PW5vQDo+QF0pLAorICAgICAgICAgICAgICBbXSwgW2VuYWJsZV9saWJ3ZWJwZGVtdXg9eWVzXSkKK0FDX01TR19SRVNVTFQoJHtlbmFibGVfbGlid2VicGRlbXV4LW5vfSkKK0FNX0NPTkRJVElPTkFMKFtXQU5UX0RFTVVYXSwgW3Rlc3QgIiRlbmFibGVfbGlid2VicGRlbXV4IiA9ICJ5ZXMiXSkKKworZG5sID09PSBDaGVjayB3aGV0aGVyIGRlY29kZXIgbGlicmFyeSBzaG91bGQgYmUgYnVpbHQuCitBQ19NU0dfQ0hFQ0tJTkcod2hldGhlciBkZWNvZGVyIGxpYnJhcnkgaXMgdG8gYmUgYnVpbHQpCitBQ19BUkdfRU5BQkxFKFtsaWJ3ZWJwZGVjb2Rlcl0sCisgICAgICAgICAgICAgIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1saWJ3ZWJwZGVjb2Rlcl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtCdWlsZCBsaWJ3ZWJwZGVjb2RlciBAPDpAZGVmYXVsdD1ub0A6PkBdKSkKK0FDX01TR19SRVNVTFQoJHtlbmFibGVfbGlid2VicGRlY29kZXItbm99KQorQU1fQ09ORElUSU9OQUwoW0JVSUxEX0xJQldFQlBERUNPREVSXSwgW3Rlc3QgIiRlbmFibGVfbGlid2VicGRlY29kZXIiID0gInllcyJdKQorCitkbmwgPT09IENoZWNrIHdoZXRoZXIgbGlid2VicGV4dHJhcyBzaG91bGQgYmUgYnVpbHQKK0FDX01TR19DSEVDS0lORyh3aGV0aGVyIGxpYndlYnBleHRyYXMgaXMgdG8gYmUgYnVpbHQpCitBQ19BUkdfRU5BQkxFKFtsaWJ3ZWJwZXh0cmFzXSwKKyAgICAgICAgICAgICAgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWxpYndlYnBleHRyYXNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbQnVpbGQgbGlid2VicGV4dHJhcyBAPDpAZGVmYXVsdD1ub0A6PkBdKSkKK0FDX01TR19SRVNVTFQoJHtlbmFibGVfbGlid2VicGV4dHJhcy1ub30pCitBTV9DT05ESVRJT05BTChbV0FOVF9FWFRSQVNdLCBbdGVzdCAiJGVuYWJsZV9saWJ3ZWJwZXh0cmFzIiA9ICJ5ZXMiXSkKKworZG5sID09PT09PT09PT09PT09PT09PT09PT09PT0KKworQUNfQ09ORklHX01BQ1JPX0RJUihbbTRdKQorQUNfQ09ORklHX0hFQURFUlMoW3NyYy93ZWJwL2NvbmZpZy5oXSkKK0FDX0NPTkZJR19GSUxFUyhbTWFrZWZpbGUgc3JjL01ha2VmaWxlIG1hbi9NYWtlZmlsZSBcCisgICAgICAgICAgICAgICAgIGV4YW1wbGVzL01ha2VmaWxlIGV4dHJhcy9NYWtlZmlsZSBpbWFnZWlvL01ha2VmaWxlIFwKKyAgICAgICAgICAgICAgICAgc3JjL2RlYy9NYWtlZmlsZSBzcmMvZW5jL01ha2VmaWxlIHNyYy9kc3AvTWFrZWZpbGUgXAorICAgICAgICAgICAgICAgICBzcmMvZGVtdXgvTWFrZWZpbGUgc3JjL211eC9NYWtlZmlsZSBcCisgICAgICAgICAgICAgICAgIHNyYy91dGlscy9NYWtlZmlsZSBcCisgICAgICAgICAgICAgICAgIHNyYy9saWJ3ZWJwLnBjIHNyYy9saWJ3ZWJwZGVjb2Rlci5wYyBcCisgICAgICAgICAgICAgICAgIHNyYy9kZW11eC9saWJ3ZWJwZGVtdXgucGMgc3JjL211eC9saWJ3ZWJwbXV4LnBjXSkKKworCitBQ19PVVRQVVQKKworQUNfTVNHX05PVElDRShbCitXZWJQIENvbmZpZ3VyYXRpb24gU3VtbWFyeQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU2hhcmVkIGxpYnJhcmllczogJHtlbmFibGVfc2hhcmVkfQorU3RhdGljIGxpYnJhcmllczogJHtlbmFibGVfc3RhdGljfQorVGhyZWFkaW5nIHN1cHBvcnQ6ICR7ZW5hYmxlX3RocmVhZGluZy1ub30KK2xpYndlYnA6IHllcworbGlid2VicGRlY29kZXI6ICR7ZW5hYmxlX2xpYndlYnBkZWNvZGVyLW5vfQorbGlid2VicGRlbXV4OiAke2VuYWJsZV9saWJ3ZWJwZGVtdXgtbm99CitsaWJ3ZWJwbXV4OiAke2VuYWJsZV9saWJ3ZWJwbXV4LW5vfQorbGlid2VicGV4dHJhczogJHtlbmFibGVfbGlid2VicGV4dHJhcy1ub30KKworVG9vbHM6Citjd2VicCA6ICR7ZW5hYmxlX2xpYndlYnBkZW11eC1ub30KKyAgSW5wdXQgZm9ybWF0IHN1cHBvcnQKKyAgPT09PT09PT09PT09PT09PT09PT0KKyAgSlBFRyA6ICR7anBlZ19zdXBwb3J0LW5vfQorICBQTkcgIDogJHtwbmdfc3VwcG9ydC1ub30KKyAgVElGRiA6ICR7dGlmZl9zdXBwb3J0LW5vfQorICBXSUMgIDogJHt3aWNfc3VwcG9ydC1ub30KK2R3ZWJwIDogJHtlbmFibGVfbGlid2VicGRlbXV4LW5vfQorICBPdXRwdXQgZm9ybWF0IHN1cHBvcnQKKyAgPT09PT09PT09PT09PT09PT09PT09CisgIFBORyAgOiAke3BuZ19zdXBwb3J0LW5vfQorICBXSUMgIDogJHt3aWNfc3VwcG9ydC1ub30KK0dJRiBzdXBwb3J0IDogJHtnaWZfc3VwcG9ydC1ub30KK2FuaW1fZGlmZiAgIDogJHtidWlsZF9hbmltX2RpZmYtbm99CitnaWYyd2VicCAgICA6ICR7YnVpbGRfZ2lmMndlYnAtbm99CitpbWcyd2VicCAgICA6ICR7YnVpbGRfaW1nMndlYnAtbm99Cit3ZWJwbXV4ICAgICA6ICR7ZW5hYmxlX2xpYndlYnBtdXgtbm99Cit2d2VicCAgICAgICA6ICR7YnVpbGRfdndlYnAtbm99Cit3ZWJwaW5mbyAgICA6ICR7YnVpbGRfd2VicGluZm8tbm99CitTREwgc3VwcG9ydCA6ICR7c2RsX3N1cHBvcnQtbm99Cit2d2VicF9zZGwgICA6ICR7YnVpbGRfdndlYnBfc2RsLW5vfQorXSkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RlYy9hbHBoYS5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL2FscGhhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MWM0ODEuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL2FscGhhLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIEFscGhhLXBsYW5lIGRlY29tcHJlc3Npb24uCi0vLwotLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKLQotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCi0jZWxzZQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaW5jbHVkZSAiLi92cDhpLmgiCi0jaW5jbHVkZSAiLi92cDhsaS5oIgotI2luY2x1ZGUgIi4uL3V0aWxzL2ZpbHRlcnMuaCIKLSNpbmNsdWRlICIuLi91dGlscy9xdWFudF9sZXZlbHNfZGVjLmgiCi0jaW5jbHVkZSAiLi4vd2VicC9mb3JtYXRfY29uc3RhbnRzLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRGVjb2RlcyB0aGUgY29tcHJlc3NlZCBkYXRhICdkYXRhJyBvZiBzaXplICdkYXRhX3NpemUnIGludG8gdGhlICdvdXRwdXQnLgotLy8gVGhlICdvdXRwdXQnIGJ1ZmZlciBzaG91bGQgYmUgcHJlLWFsbG9jYXRlZCBhbmQgbXVzdCBiZSBvZiB0aGUgc2FtZQotLy8gZGltZW5zaW9uICdoZWlnaHQneCd3aWR0aCcsIGFzIHRoYXQgb2YgdGhlIGltYWdlLgotLy8KLS8vIFJldHVybnMgMSBvbiBzdWNjZXNzZnVsbHkgZGVjb2RpbmcgdGhlIGNvbXByZXNzZWQgYWxwaGEgYW5kCi0vLyAgICAgICAgIDAgaWYgZWl0aGVyOgotLy8gICAgICAgICAgIGVycm9yIGluIGJpdC1zdHJlYW0gaGVhZGVyIChpbnZhbGlkIGNvbXByZXNzaW9uIG1vZGUgb3IgZmlsdGVyKSwgb3IKLS8vICAgICAgICAgICBlcnJvciByZXR1cm5lZCBieSBhcHByb3ByaWF0ZSBjb21wcmVzc2lvbiBtZXRob2QuCi0KLXN0YXRpYyBpbnQgRGVjb2RlQWxwaGEoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCB1aW50OF90KiBvdXRwdXQpIHsKLSAgV0VCUF9GSUxURVJfVFlQRSBmaWx0ZXI7Ci0gIGludCBwcmVfcHJvY2Vzc2luZzsKLSAgaW50IHJzcnY7Ci0gIGludCBvayA9IDA7Ci0gIGludCBtZXRob2Q7Ci0gIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGFscGhhX2RhdGEgPSBkYXRhICsgQUxQSEFfSEVBREVSX0xFTjsKLSAgY29uc3Qgc2l6ZV90IGFscGhhX2RhdGFfc2l6ZSA9IGRhdGFfc2l6ZSAtIEFMUEhBX0hFQURFUl9MRU47Ci0KLSAgU0JfRENIRUNLKHdpZHRoID4gMCAmJiBoZWlnaHQgPiAwKTsKLSAgU0JfRENIRUNLKGRhdGEgIT0gTlVMTCAmJiBvdXRwdXQgIT0gTlVMTCk7Ci0KLSAgaWYgKGRhdGFfc2l6ZSA8PSBBTFBIQV9IRUFERVJfTEVOKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBtZXRob2QgPSAoZGF0YVswXSA+PiAwKSAmIDB4MDM7Ci0gIGZpbHRlciA9IChkYXRhWzBdID4+IDIpICYgMHgwMzsKLSAgcHJlX3Byb2Nlc3NpbmcgPSAoZGF0YVswXSA+PiA0KSAmIDB4MDM7Ci0gIHJzcnYgPSAoZGF0YVswXSA+PiA2KSAmIDB4MDM7Ci0gIGlmIChtZXRob2QgPCBBTFBIQV9OT19DT01QUkVTU0lPTiB8fAotICAgICAgbWV0aG9kID4gQUxQSEFfTE9TU0xFU1NfQ09NUFJFU1NJT04gfHwKLSAgICAgIGZpbHRlciA+PSBXRUJQX0ZJTFRFUl9MQVNUIHx8Ci0gICAgICBwcmVfcHJvY2Vzc2luZyA+IEFMUEhBX1BSRVBST0NFU1NFRF9MRVZFTFMgfHwKLSAgICAgIHJzcnYgIT0gMCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgaWYgKG1ldGhvZCA9PSBBTFBIQV9OT19DT01QUkVTU0lPTikgewotICAgIGNvbnN0IHNpemVfdCBhbHBoYV9kZWNvZGVkX3NpemUgPSBoZWlnaHQgKiB3aWR0aDsKLSAgICBvayA9IChhbHBoYV9kYXRhX3NpemUgPj0gYWxwaGFfZGVjb2RlZF9zaXplKTsKLSAgICBpZiAob2spIFNiTWVtb3J5Q29weShvdXRwdXQsIGFscGhhX2RhdGEsIGFscGhhX2RlY29kZWRfc2l6ZSk7Ci0gIH0gZWxzZSB7Ci0gICAgb2sgPSBWUDhMRGVjb2RlQWxwaGFJbWFnZVN0cmVhbSh3aWR0aCwgaGVpZ2h0LCBhbHBoYV9kYXRhLCBhbHBoYV9kYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQpOwotICB9Ci0KLSAgaWYgKG9rKSB7Ci0gICAgV2ViUFVuZmlsdGVyRnVuYyB1bmZpbHRlcl9mdW5jID0gV2ViUFVuZmlsdGVyc1tmaWx0ZXJdOwotICAgIGlmICh1bmZpbHRlcl9mdW5jICE9IE5VTEwpIHsKLSAgICAgIC8vIFRPRE8odmlrYXMpOiBJbXBsZW1lbnQgb24tdGhlLWZseSBkZWNvZGluZyAmIGZpbHRlciBtZWNoYW5pc20gdG8gZGVjb2RlCi0gICAgICAvLyBhbmQgYXBwbHkgZmlsdGVyIHBlciBpbWFnZS1yb3cuCi0gICAgICB1bmZpbHRlcl9mdW5jKHdpZHRoLCBoZWlnaHQsIHdpZHRoLCBvdXRwdXQpOwotICAgIH0KLSAgICBpZiAocHJlX3Byb2Nlc3NpbmcgPT0gQUxQSEFfUFJFUFJPQ0VTU0VEX0xFVkVMUykgewotICAgICAgb2sgPSBEZXF1YW50aXplTGV2ZWxzKG91dHB1dCwgd2lkdGgsIGhlaWdodCk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIG9rOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jb25zdCB1aW50OF90KiBWUDhEZWNvbXByZXNzQWxwaGFSb3dzKFZQOERlY29kZXIqIGNvbnN0IGRlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdywgaW50IG51bV9yb3dzKSB7Ci0gIGNvbnN0IGludCB3aWR0aCA9IGRlYy0+cGljX2hkcl8ud2lkdGhfOwotICBjb25zdCBpbnQgaGVpZ2h0ID0gZGVjLT5waWNfaGRyXy5oZWlnaHRfOwotCi0gIGlmIChyb3cgPCAwIHx8IG51bV9yb3dzIDwgMCB8fCByb3cgKyBudW1fcm93cyA+IGhlaWdodCkgewotICAgIHJldHVybiBOVUxMOyAgICAvLyBzYW5pdHkgY2hlY2suCi0gIH0KLQotICBpZiAocm93ID09IDApIHsKLSAgICAvLyBEZWNvZGUgZXZlcnl0aGluZyBkdXJpbmcgdGhlIGZpcnN0IGNhbGwuCi0gICAgU0JfRENIRUNLKCFkZWMtPmlzX2FscGhhX2RlY29kZWRfKTsKLSAgICBpZiAoIURlY29kZUFscGhhKGRlYy0+YWxwaGFfZGF0YV8sIChzaXplX3QpZGVjLT5hbHBoYV9kYXRhX3NpemVfLAotICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgZGVjLT5hbHBoYV9wbGFuZV8pKSB7Ci0gICAgICByZXR1cm4gTlVMTDsgIC8vIEVycm9yLgotICAgIH0KLSAgICBkZWMtPmlzX2FscGhhX2RlY29kZWRfID0gMTsKLSAgfQotCi0gIC8vIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgZGVjb2RlZCByb3cuCi0gIHJldHVybiBkZWMtPmFscGhhX3BsYW5lXyArIHJvdyAqIHdpZHRoOwotfQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RlYy9idWZmZXIuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RlYy9idWZmZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRlOGFiYi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kZWMvYnVmZmVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIEV2ZXJ5dGhpbmcgYWJvdXQgV2ViUERlY0J1ZmZlcgotLy8KLS8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2luY2x1ZGUgIi4vdnA4aS5oIgotI2luY2x1ZGUgIi4vd2VicGkuaCIKLSNpbmNsdWRlICIuLi91dGlscy91dGlscy5oIgotCi0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gV2ViUERlY0J1ZmZlcgotCi0vLyBOdW1iZXIgb2YgYnl0ZXMgcGVyIHBpeGVsIGZvciB0aGUgZGlmZmVyZW50IGNvbG9yLXNwYWNlcy4KLXN0YXRpYyBjb25zdCBpbnQga01vZGVCcHBbTU9ERV9MQVNUXSA9IHsKLSAgMywgNCwgMywgNCwgNCwgMiwgMiwKLSAgNCwgNCwgNCwgMiwgICAgLy8gcHJlLW11bHRpcGxpZWQgbW9kZXMKLSAgMSwgMSB9OwotCi0vLyBDaGVjayB0aGF0IHdlYnBfY3NwX21vZGUgaXMgd2l0aGluIHRoZSBib3VuZHMgb2YgV0VCUF9DU1BfTU9ERS4KLS8vIENvbnZlcnQgdG8gYW4gaW50ZWdlciB0byBoYW5kbGUgYm90aCB0aGUgdW5zaWduZWQvc2lnbmVkIGVudW0gY2FzZXMKLS8vIHdpdGhvdXQgdGhlIG5lZWQgZm9yIGNhc3RpbmcgdG8gcmVtb3ZlIHR5cGUgbGltaXQgd2FybmluZ3MuCi1zdGF0aWMgaW50IElzVmFsaWRDb2xvcnNwYWNlKGludCB3ZWJwX2NzcF9tb2RlKSB7Ci0gIHJldHVybiAod2VicF9jc3BfbW9kZSA+PSBNT0RFX1JHQiAmJiB3ZWJwX2NzcF9tb2RlIDwgTU9ERV9MQVNUKTsKLX0KLQotc3RhdGljIFZQOFN0YXR1c0NvZGUgQ2hlY2tEZWNCdWZmZXIoY29uc3QgV2ViUERlY0J1ZmZlciogY29uc3QgYnVmZmVyKSB7Ci0gIGludCBvayA9IDE7Ci0gIGNvbnN0IFdFQlBfQ1NQX01PREUgbW9kZSA9IGJ1ZmZlci0+Y29sb3JzcGFjZTsKLSAgY29uc3QgaW50IHdpZHRoID0gYnVmZmVyLT53aWR0aDsKLSAgY29uc3QgaW50IGhlaWdodCA9IGJ1ZmZlci0+aGVpZ2h0OwotICBpZiAoIUlzVmFsaWRDb2xvcnNwYWNlKG1vZGUpKSB7Ci0gICAgb2sgPSAwOwotICB9IGVsc2UgaWYgKCFXZWJQSXNSR0JNb2RlKG1vZGUpKSB7ICAgLy8gWVVWIGNoZWNrcwotICAgIGNvbnN0IFdlYlBZVVZBQnVmZmVyKiBjb25zdCBidWYgPSAmYnVmZmVyLT51LllVVkE7Ci0gICAgY29uc3QgdWludDY0X3QgeV9zaXplID0gKHVpbnQ2NF90KWJ1Zi0+eV9zdHJpZGUgKiBoZWlnaHQ7Ci0gICAgY29uc3QgdWludDY0X3QgdV9zaXplID0gKHVpbnQ2NF90KWJ1Zi0+dV9zdHJpZGUgKiAoKGhlaWdodCArIDEpIC8gMik7Ci0gICAgY29uc3QgdWludDY0X3Qgdl9zaXplID0gKHVpbnQ2NF90KWJ1Zi0+dl9zdHJpZGUgKiAoKGhlaWdodCArIDEpIC8gMik7Ci0gICAgY29uc3QgdWludDY0X3QgYV9zaXplID0gKHVpbnQ2NF90KWJ1Zi0+YV9zdHJpZGUgKiBoZWlnaHQ7Ci0gICAgb2sgJj0gKHlfc2l6ZSA8PSBidWYtPnlfc2l6ZSk7Ci0gICAgb2sgJj0gKHVfc2l6ZSA8PSBidWYtPnVfc2l6ZSk7Ci0gICAgb2sgJj0gKHZfc2l6ZSA8PSBidWYtPnZfc2l6ZSk7Ci0gICAgb2sgJj0gKGJ1Zi0+eV9zdHJpZGUgPj0gd2lkdGgpOwotICAgIG9rICY9IChidWYtPnVfc3RyaWRlID49ICh3aWR0aCArIDEpIC8gMik7Ci0gICAgb2sgJj0gKGJ1Zi0+dl9zdHJpZGUgPj0gKHdpZHRoICsgMSkgLyAyKTsKLSAgICBvayAmPSAoYnVmLT55ICE9IE5VTEwpOwotICAgIG9rICY9IChidWYtPnUgIT0gTlVMTCk7Ci0gICAgb2sgJj0gKGJ1Zi0+diAhPSBOVUxMKTsKLSAgICBpZiAobW9kZSA9PSBNT0RFX1lVVkEpIHsKLSAgICAgIG9rICY9IChidWYtPmFfc3RyaWRlID49IHdpZHRoKTsKLSAgICAgIG9rICY9IChhX3NpemUgPD0gYnVmLT5hX3NpemUpOwotICAgICAgb2sgJj0gKGJ1Zi0+YSAhPSBOVUxMKTsKLSAgICB9Ci0gIH0gZWxzZSB7ICAgIC8vIFJHQiBjaGVja3MKLSAgICBjb25zdCBXZWJQUkdCQUJ1ZmZlciogY29uc3QgYnVmID0gJmJ1ZmZlci0+dS5SR0JBOwotICAgIGNvbnN0IHVpbnQ2NF90IHNpemUgPSAodWludDY0X3QpYnVmLT5zdHJpZGUgKiBoZWlnaHQ7Ci0gICAgb2sgJj0gKHNpemUgPD0gYnVmLT5zaXplKTsKLSAgICBvayAmPSAoYnVmLT5zdHJpZGUgPj0gd2lkdGggKiBrTW9kZUJwcFttb2RlXSk7Ci0gICAgb2sgJj0gKGJ1Zi0+cmdiYSAhPSBOVUxMKTsKLSAgfQotICByZXR1cm4gb2sgPyBWUDhfU1RBVFVTX09LIDogVlA4X1NUQVRVU19JTlZBTElEX1BBUkFNOwotfQotCi1zdGF0aWMgVlA4U3RhdHVzQ29kZSBBbGxvY2F0ZUJ1ZmZlcihXZWJQRGVjQnVmZmVyKiBjb25zdCBidWZmZXIpIHsKLSAgY29uc3QgaW50IHcgPSBidWZmZXItPndpZHRoOwotICBjb25zdCBpbnQgaCA9IGJ1ZmZlci0+aGVpZ2h0OwotICBjb25zdCBXRUJQX0NTUF9NT0RFIG1vZGUgPSBidWZmZXItPmNvbG9yc3BhY2U7Ci0KLSAgaWYgKHcgPD0gMCB8fCBoIDw9IDAgfHwgIUlzVmFsaWRDb2xvcnNwYWNlKG1vZGUpKSB7Ci0gICAgcmV0dXJuIFZQOF9TVEFUVVNfSU5WQUxJRF9QQVJBTTsKLSAgfQotCi0gIGlmICghYnVmZmVyLT5pc19leHRlcm5hbF9tZW1vcnkgJiYgYnVmZmVyLT5wcml2YXRlX21lbW9yeSA9PSBOVUxMKSB7Ci0gICAgdWludDhfdCogb3V0cHV0OwotICAgIGludCB1dl9zdHJpZGUgPSAwLCBhX3N0cmlkZSA9IDA7Ci0gICAgdWludDY0X3QgdXZfc2l6ZSA9IDAsIGFfc2l6ZSA9IDAsIHRvdGFsX3NpemU7Ci0gICAgLy8gV2UgbmVlZCBtZW1vcnkgYW5kIGl0IGhhc24ndCBiZWVuIGFsbG9jYXRlZCB5ZXQuCi0gICAgLy8gPT4gaW5pdGlhbGl6ZSBvdXRwdXQgYnVmZmVyLCBub3cgdGhhdCBkaW1lbnNpb25zIGFyZSBrbm93bi4KLSAgICBjb25zdCBpbnQgc3RyaWRlID0gdyAqIGtNb2RlQnBwW21vZGVdOwotICAgIGNvbnN0IHVpbnQ2NF90IHNpemUgPSAodWludDY0X3Qpc3RyaWRlICogaDsKLQotICAgIGlmICghV2ViUElzUkdCTW9kZShtb2RlKSkgewotICAgICAgdXZfc3RyaWRlID0gKHcgKyAxKSAvIDI7Ci0gICAgICB1dl9zaXplID0gKHVpbnQ2NF90KXV2X3N0cmlkZSAqICgoaCArIDEpIC8gMik7Ci0gICAgICBpZiAobW9kZSA9PSBNT0RFX1lVVkEpIHsKLSAgICAgICAgYV9zdHJpZGUgPSB3OwotICAgICAgICBhX3NpemUgPSAodWludDY0X3QpYV9zdHJpZGUgKiBoOwotICAgICAgfQotICAgIH0KLSAgICB0b3RhbF9zaXplID0gc2l6ZSArIDIgKiB1dl9zaXplICsgYV9zaXplOwotCi0gICAgLy8gU2VjdXJpdHkvc2FuaXR5IGNoZWNrcwotICAgIG91dHB1dCA9ICh1aW50OF90KilXZWJQU2FmZU1hbGxvYyh0b3RhbF9zaXplLCBzaXplb2YoKm91dHB1dCkpOwotICAgIGlmIChvdXRwdXQgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfT1VUX09GX01FTU9SWTsKLSAgICB9Ci0gICAgYnVmZmVyLT5wcml2YXRlX21lbW9yeSA9IG91dHB1dDsKLQotICAgIGlmICghV2ViUElzUkdCTW9kZShtb2RlKSkgeyAgIC8vIFlVVkEgaW5pdGlhbGl6YXRpb24KLSAgICAgIFdlYlBZVVZBQnVmZmVyKiBjb25zdCBidWYgPSAmYnVmZmVyLT51LllVVkE7Ci0gICAgICBidWYtPnkgPSBvdXRwdXQ7Ci0gICAgICBidWYtPnlfc3RyaWRlID0gc3RyaWRlOwotICAgICAgYnVmLT55X3NpemUgPSAoc2l6ZV90KXNpemU7Ci0gICAgICBidWYtPnUgPSBvdXRwdXQgKyBzaXplOwotICAgICAgYnVmLT51X3N0cmlkZSA9IHV2X3N0cmlkZTsKLSAgICAgIGJ1Zi0+dV9zaXplID0gKHNpemVfdCl1dl9zaXplOwotICAgICAgYnVmLT52ID0gb3V0cHV0ICsgc2l6ZSArIHV2X3NpemU7Ci0gICAgICBidWYtPnZfc3RyaWRlID0gdXZfc3RyaWRlOwotICAgICAgYnVmLT52X3NpemUgPSAoc2l6ZV90KXV2X3NpemU7Ci0gICAgICBpZiAobW9kZSA9PSBNT0RFX1lVVkEpIHsKLSAgICAgICAgYnVmLT5hID0gb3V0cHV0ICsgc2l6ZSArIDIgKiB1dl9zaXplOwotICAgICAgfQotICAgICAgYnVmLT5hX3NpemUgPSAoc2l6ZV90KWFfc2l6ZTsKLSAgICAgIGJ1Zi0+YV9zdHJpZGUgPSBhX3N0cmlkZTsKLSAgICB9IGVsc2UgeyAgLy8gUkdCQSBpbml0aWFsaXphdGlvbgotICAgICAgV2ViUFJHQkFCdWZmZXIqIGNvbnN0IGJ1ZiA9ICZidWZmZXItPnUuUkdCQTsKLSAgICAgIGJ1Zi0+cmdiYSA9IG91dHB1dDsKLSAgICAgIGJ1Zi0+c3RyaWRlID0gc3RyaWRlOwotICAgICAgYnVmLT5zaXplID0gKHNpemVfdClzaXplOwotICAgIH0KLSAgfQotICByZXR1cm4gQ2hlY2tEZWNCdWZmZXIoYnVmZmVyKTsKLX0KLQotVlA4U3RhdHVzQ29kZSBXZWJQQWxsb2NhdGVEZWNCdWZmZXIoaW50IHcsIGludCBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUERlY29kZXJPcHRpb25zKiBjb25zdCBvcHRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUERlY0J1ZmZlciogY29uc3Qgb3V0KSB7Ci0gIGlmIChvdXQgPT0gTlVMTCB8fCB3IDw9IDAgfHwgaCA8PSAwKSB7Ci0gICAgcmV0dXJuIFZQOF9TVEFUVVNfSU5WQUxJRF9QQVJBTTsKLSAgfQotICBpZiAob3B0aW9ucyAhPSBOVUxMKSB7ICAgIC8vIEZpcnN0LCBhcHBseSBvcHRpb25zIGlmIHRoZXJlIGlzIGFueS4KLSAgICBpZiAob3B0aW9ucy0+dXNlX2Nyb3BwaW5nKSB7Ci0gICAgICBjb25zdCBpbnQgY3cgPSBvcHRpb25zLT5jcm9wX3dpZHRoOwotICAgICAgY29uc3QgaW50IGNoID0gb3B0aW9ucy0+Y3JvcF9oZWlnaHQ7Ci0gICAgICBjb25zdCBpbnQgeCA9IG9wdGlvbnMtPmNyb3BfbGVmdCAmIH4xOwotICAgICAgY29uc3QgaW50IHkgPSBvcHRpb25zLT5jcm9wX3RvcCAmIH4xOwotICAgICAgaWYgKHggPCAwIHx8IHkgPCAwIHx8IGN3IDw9IDAgfHwgY2ggPD0gMCB8fCB4ICsgY3cgPiB3IHx8IHkgKyBjaCA+IGgpIHsKLSAgICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfSU5WQUxJRF9QQVJBTTsgICAvLyBvdXQgb2YgZnJhbWUgYm91bmRhcnkuCi0gICAgICB9Ci0gICAgICB3ID0gY3c7Ci0gICAgICBoID0gY2g7Ci0gICAgfQotICAgIGlmIChvcHRpb25zLT51c2Vfc2NhbGluZykgewotICAgICAgaWYgKG9wdGlvbnMtPnNjYWxlZF93aWR0aCA8PSAwIHx8IG9wdGlvbnMtPnNjYWxlZF9oZWlnaHQgPD0gMCkgewotICAgICAgICByZXR1cm4gVlA4X1NUQVRVU19JTlZBTElEX1BBUkFNOwotICAgICAgfQotICAgICAgdyA9IG9wdGlvbnMtPnNjYWxlZF93aWR0aDsKLSAgICAgIGggPSBvcHRpb25zLT5zY2FsZWRfaGVpZ2h0OwotICAgIH0KLSAgfQotICBvdXQtPndpZHRoID0gdzsKLSAgb3V0LT5oZWlnaHQgPSBoOwotCi0gIC8vIFRoZW4sIGFsbG9jYXRlIGJ1ZmZlciBmb3IgcmVhbAotICByZXR1cm4gQWxsb2NhdGVCdWZmZXIob3V0KTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGNvbnN0cnVjdG9ycyAvIGRlc3RydWN0b3JzCi0KLWludCBXZWJQSW5pdERlY0J1ZmZlckludGVybmFsKFdlYlBEZWNCdWZmZXIqIGJ1ZmZlciwgaW50IHZlcnNpb24pIHsKLSAgaWYgKFdFQlBfQUJJX0lTX0lOQ09NUEFUSUJMRSh2ZXJzaW9uLCBXRUJQX0RFQ09ERVJfQUJJX1ZFUlNJT04pKSB7Ci0gICAgcmV0dXJuIDA7ICAvLyB2ZXJzaW9uIG1pc21hdGNoCi0gIH0KLSAgaWYgKGJ1ZmZlciA9PSBOVUxMKSByZXR1cm4gMDsKLSAgU2JNZW1vcnlTZXQoYnVmZmVyLCAwLCBzaXplb2YoKmJ1ZmZlcikpOwotICByZXR1cm4gMTsKLX0KLQotdm9pZCBXZWJQRnJlZURlY0J1ZmZlcihXZWJQRGVjQnVmZmVyKiBidWZmZXIpIHsKLSAgaWYgKGJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgaWYgKCFidWZmZXItPmlzX2V4dGVybmFsX21lbW9yeSkKLSAgICAgIFNiTWVtb3J5RGVhbGxvY2F0ZShidWZmZXItPnByaXZhdGVfbWVtb3J5KTsKLSAgICBidWZmZXItPnByaXZhdGVfbWVtb3J5ID0gTlVMTDsKLSAgfQotfQotCi12b2lkIFdlYlBDb3B5RGVjQnVmZmVyKGNvbnN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IHNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgV2ViUERlY0J1ZmZlciogY29uc3QgZHN0KSB7Ci0gIGlmIChzcmMgIT0gTlVMTCAmJiBkc3QgIT0gTlVMTCkgewotICAgICpkc3QgPSAqc3JjOwotICAgIGlmIChzcmMtPnByaXZhdGVfbWVtb3J5ICE9IE5VTEwpIHsKLSAgICAgIGRzdC0+aXNfZXh0ZXJuYWxfbWVtb3J5ID0gMTsgICAvLyBkc3QgYnVmZmVyIGRvZXNuJ3Qgb3duIHRoZSBtZW1vcnkuCi0gICAgICBkc3QtPnByaXZhdGVfbWVtb3J5ID0gTlVMTDsKLSAgICB9Ci0gIH0KLX0KLQotLy8gQ29weSBhbmQgdHJhbnNmZXIgb3duZXJzaGlwIGZyb20gc3JjIHRvIGRzdCAoYmV3YXJlIG9mIHBhcmFtZXRlciBvcmRlciEpCi12b2lkIFdlYlBHcmFiRGVjQnVmZmVyKFdlYlBEZWNCdWZmZXIqIGNvbnN0IHNyYywgV2ViUERlY0J1ZmZlciogY29uc3QgZHN0KSB7Ci0gIGlmIChzcmMgIT0gTlVMTCAmJiBkc3QgIT0gTlVMTCkgewotICAgICpkc3QgPSAqc3JjOwotICAgIGlmIChzcmMtPnByaXZhdGVfbWVtb3J5ICE9IE5VTEwpIHsKLSAgICAgIHNyYy0+aXNfZXh0ZXJuYWxfbWVtb3J5ID0gMTsgICAvLyBzcmMgcmVsaW5xdWlzaGVzIG93bmVyc2hpcAotICAgICAgc3JjLT5wcml2YXRlX21lbW9yeSA9IE5VTEw7Ci0gICAgfQotICB9Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL2RlY29kZV92cDguaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RlYy9kZWNvZGVfdnA4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZGIxNWEuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL2RlY29kZV92cDguaAorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gIExvdy1sZXZlbCBBUEkgZm9yIFZQOCBkZWNvZGVyCi0vLwotLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKLQotI2lmbmRlZiBXRUJQX1dFQlBfREVDT0RFX1ZQOF9IXwotI2RlZmluZSBXRUJQX1dFQlBfREVDT0RFX1ZQOF9IXwotCi0jaW5jbHVkZSAiLi4vd2VicC9kZWNvZGUuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBMb3dlci1sZXZlbCBBUEkKLS8vCi0vLyBUaGVzZSBmdW5jdGlvbnMgcHJvdmlkZSBmaW5lLWdyYWluZWQgY29udHJvbCBvZiB0aGUgZGVjb2RpbmcgcHJvY2Vzcy4KLS8vIFRoZSBjYWxsIGZsb3cgc2hvdWxkIHJlc2VtYmxlOgotLy8KLS8vICAgVlA4SW8gaW87Ci0vLyAgIFZQOEluaXRJbygmaW8pOwotLy8gICBpby5kYXRhID0gZGF0YTsKLS8vICAgaW8uZGF0YV9zaXplID0gc2l6ZTsKLS8vICAgLyogY3VzdG9taXplIGlvJ3MgZnVuY3Rpb25zIChzZXR1cCgpL3B1dCgpL3RlYXJkb3duKCkpIGlmIG5lZWRlZC4gKi8KLS8vCi0vLyAgIFZQOERlY29kZXIqIGRlYyA9IFZQOE5ldygpOwotLy8gICBib29sIG9rID0gVlA4RGVjb2RlKGRlYyk7Ci0vLyAgIGlmICghb2spIHByaW50ZigiRXJyb3I6ICVzXG4iLCBWUDhTdGF0dXNNZXNzYWdlKGRlYykpOwotLy8gICBWUDhEZWxldGUoZGVjKTsKLS8vICAgcmV0dXJuIG9rOwotCi0vLyBJbnB1dCAvIE91dHB1dAotdHlwZWRlZiBzdHJ1Y3QgVlA4SW8gVlA4SW87Ci10eXBlZGVmIGludCAoKlZQOElvUHV0SG9vaykoY29uc3QgVlA4SW8qIGlvKTsKLXR5cGVkZWYgaW50ICgqVlA4SW9TZXR1cEhvb2spKFZQOElvKiBpbyk7Ci10eXBlZGVmIHZvaWQgKCpWUDhJb1RlYXJkb3duSG9vaykoY29uc3QgVlA4SW8qIGlvKTsKLQotc3RydWN0IFZQOElvIHsKLSAgLy8gc2V0IGJ5IFZQOEdldEhlYWRlcnMoKQotICBpbnQgd2lkdGgsIGhlaWdodDsgICAgICAgICAvLyBwaWN0dXJlIGRpbWVuc2lvbnMsIGluIHBpeGVscyAoaW52YXJpYWJsZSkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIGFyZSB0aGUgb3JpZ2luYWwsIHVuY3JvcHBlZCBkaW1lbnNpb25zLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgYWN0dWFsIGFyZWEgcGFzc2VkIHRvIHB1dCgpIGlzIHN0b3JlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBtYl93IC8gbWJfaCBmaWVsZHMuCi0KLSAgLy8gc2V0IGJlZm9yZSBjYWxsaW5nIHB1dCgpCi0gIGludCBtYl95OyAgICAgICAgICAgICAgICAgIC8vIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IHJvd3MgKGluIHBpeGVscykKLSAgaW50IG1iX3c7ICAgICAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIHNhbXBsZQotICBpbnQgbWJfaDsgICAgICAgICAgICAgICAgICAvLyBudW1iZXIgb2Ygcm93cyBpbiB0aGUgc2FtcGxlCi0gIGNvbnN0IHVpbnQ4X3QqIHksICp1LCAqdjsgIC8vIHJvd3MgdG8gY29weSAoaW4geXV2NDIwIGZvcm1hdCkKLSAgaW50IHlfc3RyaWRlOyAgICAgICAgICAgICAgLy8gcm93IHN0cmlkZSBmb3IgbHVtYQotICBpbnQgdXZfc3RyaWRlOyAgICAgICAgICAgICAvLyByb3cgc3RyaWRlIGZvciBjaHJvbWEKLQotICB2b2lkKiBvcGFxdWU7ICAgICAgICAgICAgICAvLyB1c2VyIGRhdGEKLQotICAvLyBjYWxsZWQgd2hlbiBmcmVzaCBzYW1wbGVzIGFyZSBhdmFpbGFibGUuIEN1cnJlbnRseSwgc2FtcGxlcyBhcmUgaW4KLSAgLy8gWVVWNDIwIGZvcm1hdCwgYW5kIGNhbiBiZSB1cCB0byB3aWR0aCB4IDI0IGluIHNpemUgKGRlcGVuZGluZyBvbiB0aGUKLSAgLy8gaW4tbG9vcCBmaWx0ZXJpbmcgbGV2ZWwsIGUuZy4pLiBTaG91bGQgcmV0dXJuIGZhbHNlIGluIGNhc2Ugb2YgZXJyb3IKLSAgLy8gb3IgYWJvcnQgcmVxdWVzdC4gVGhlIGFjdHVhbCBzaXplIG9mIHRoZSBhcmVhIHRvIHVwZGF0ZSBpcyBtYl93IHggbWJfaAotICAvLyBpbiBzaXplLCB0YWtpbmcgY3JvcHBpbmcgaW50byBhY2NvdW50LgotICBWUDhJb1B1dEhvb2sgcHV0OwotCi0gIC8vIGNhbGxlZCBqdXN0IGJlZm9yZSBzdGFydGluZyB0byBkZWNvZGUgdGhlIGJsb2Nrcy4KLSAgLy8gTXVzdCByZXR1cm4gZmFsc2UgaW4gY2FzZSBvZiBzZXR1cCBlcnJvciwgdHJ1ZSBvdGhlcndpc2UuIElmIGZhbHNlIGlzCi0gIC8vIHJldHVybmVkLCB0ZWFyZG93bigpIHdpbGwgTk9UIGJlIGNhbGxlZC4gQnV0IGlmIHRoZSBzZXR1cCBzdWNjZWVkZWQKLSAgLy8gYW5kIHRydWUgaXMgcmV0dXJuZWQsIHRoZW4gdGVhcmRvd24oKSB3aWxsIGFsd2F5cyBiZSBjYWxsZWQgYWZ0ZXJ3YXJkLgotICBWUDhJb1NldHVwSG9vayBzZXR1cDsKLQotICAvLyBDYWxsZWQganVzdCBhZnRlciBibG9jayBkZWNvZGluZyBpcyBmaW5pc2hlZCAob3Igd2hlbiBhbiBlcnJvciBvY2N1cnJlZAotICAvLyBkdXJpbmcgcHV0KCkpLiBJcyBOT1QgY2FsbGVkIGlmIHNldHVwKCkgZmFpbGVkLgotICBWUDhJb1RlYXJkb3duSG9vayB0ZWFyZG93bjsKLQotICAvLyB0aGlzIGlzIGEgcmVjb21tZW5kYXRpb24gZm9yIHRoZSB1c2VyLXNpZGUgeXV2LT5yZ2IgY29udmVydGVyLiBUaGlzIGZsYWcKLSAgLy8gaXMgc2V0IHdoZW4gY2FsbGluZyBzZXR1cCgpIGhvb2sgYW5kIGNhbiBiZSBvdmVyd3JpdHRlbiBieSBpdC4gSXQgdGhlbgotICAvLyBjYW4gYmUgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uIGR1cmluZyB0aGUgcHV0KCkgbWV0aG9kLgotICBpbnQgZmFuY3lfdXBzYW1wbGluZzsKLQotICAvLyBJbnB1dCBidWZmZXIuCi0gIHNpemVfdCBkYXRhX3NpemU7Ci0gIGNvbnN0IHVpbnQ4X3QqIGRhdGE7Ci0KLSAgLy8gSWYgdHJ1ZSwgaW4tbG9vcCBmaWx0ZXJpbmcgd2lsbCBub3QgYmUgcGVyZm9ybWVkIGV2ZW4gaWYgcHJlc2VudCBpbiB0aGUKLSAgLy8gYml0c3RyZWFtLiBTd2l0Y2hpbmcgb2ZmIGZpbHRlcmluZyBtYXkgc3BlZWQgdXAgZGVjb2RpbmcgYXQgdGhlIGV4cGVuc2UKLSAgLy8gb2YgbW9yZSB2aXNpYmxlIGJsb2NraW5nLiBOb3RlIHRoYXQgb3V0cHV0IHdpbGwgYWxzbyBiZSBub24tY29tcGxpYW50Ci0gIC8vIHdpdGggdGhlIFZQOCBzcGVjaWZpY2F0aW9ucy4KLSAgaW50IGJ5cGFzc19maWx0ZXJpbmc7Ci0KLSAgLy8gQ3JvcHBpbmcgcGFyYW1ldGVycy4KLSAgaW50IHVzZV9jcm9wcGluZzsKLSAgaW50IGNyb3BfbGVmdCwgY3JvcF9yaWdodCwgY3JvcF90b3AsIGNyb3BfYm90dG9tOwotCi0gIC8vIFNjYWxpbmcgcGFyYW1ldGVycy4KLSAgaW50IHVzZV9zY2FsaW5nOwotICBpbnQgc2NhbGVkX3dpZHRoLCBzY2FsZWRfaGVpZ2h0OwotCi0gIC8vIElmIG5vbiBOVUxMLCBwb2ludGVyIHRvIHRoZSBhbHBoYSBkYXRhIChpZiBwcmVzZW50KSBjb3JyZXNwb25kaW5nIHRvIHRoZQotICAvLyBzdGFydCBvZiB0aGUgY3VycmVudCByb3cgKFRoYXQgaXM6IGl0IGlzIHByZS1vZmZzZXQgYnkgbWJfeSBhbmQgdGFrZXMKLSAgLy8gY3JvcHBpbmcgaW50byBhY2NvdW50KS4KLSAgY29uc3QgdWludDhfdCogYTsKLX07Ci0KLS8vIEludGVybmFsLCB2ZXJzaW9uLWNoZWNrZWQsIGVudHJ5IHBvaW50Ci1pbnQgVlA4SW5pdElvSW50ZXJuYWwoVlA4SW8qIGNvbnN0LCBpbnQpOwotCi0vLyBTZXQgdGhlIGN1c3RvbSBJTyBmdW5jdGlvbiBwb2ludGVycyBhbmQgdXNlci1kYXRhLiBUaGUgc2V0dGVyIGZvciBJTyBob29rcwotLy8gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgaW5pdGlhdGluZyBpbmNyZW1lbnRhbCBkZWNvZGluZy4gUmV0dXJucyB0cnVlIGlmCi0vLyBXZWJQSURlY29kZXIgb2JqZWN0IGlzIHN1Y2Nlc3NmdWxseSBtb2RpZmllZCwgZmFsc2Ugb3RoZXJ3aXNlLgotaW50IFdlYlBJU2V0SU9Ib29rcyhXZWJQSURlY29kZXIqIGNvbnN0IGlkZWMsCi0gICAgICAgICAgICAgICAgICAgIFZQOElvUHV0SG9vayBwdXQsCi0gICAgICAgICAgICAgICAgICAgIFZQOElvU2V0dXBIb29rIHNldHVwLAotICAgICAgICAgICAgICAgICAgICBWUDhJb1RlYXJkb3duSG9vayB0ZWFyZG93biwKLSAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlcl9kYXRhKTsKLQotLy8gTWFpbiBkZWNvZGluZyBvYmplY3QuIFRoaXMgaXMgYW4gb3BhcXVlIHN0cnVjdHVyZS4KLXR5cGVkZWYgc3RydWN0IFZQOERlY29kZXIgVlA4RGVjb2RlcjsKLQotLy8gQ3JlYXRlIGEgbmV3IGRlY29kZXIgb2JqZWN0LgotVlA4RGVjb2RlciogVlA4TmV3KHZvaWQpOwotCi0vLyBNdXN0IGJlIGNhbGxlZCB0byBtYWtlIHN1cmUgJ2lvJyBpcyBpbml0aWFsaXplZCBwcm9wZXJseS4KLS8vIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiB2ZXJzaW9uIG1pc21hdGNoLiBVcG9uIHN1Y2ggZmFpbHVyZSwgbm8gb3RoZXIKLS8vIGRlY29kaW5nIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgKFZQOERlY29kZSwgVlA4R2V0SGVhZGVycywgLi4uKQotc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhJbml0SW8oVlA4SW8qIGNvbnN0IGlvKSB7Ci0gIHJldHVybiBWUDhJbml0SW9JbnRlcm5hbChpbywgV0VCUF9ERUNPREVSX0FCSV9WRVJTSU9OKTsKLX0KLQotLy8gU3RhcnQgZGVjb2RpbmcgYSBuZXcgcGljdHVyZS4gUmV0dXJucyB0cnVlIGlmIG9rLgotaW50IFZQOEdldEhlYWRlcnMoVlA4RGVjb2RlciogY29uc3QgZGVjLCBWUDhJbyogY29uc3QgaW8pOwotCi0vLyBEZWNvZGUgYSBwaWN0dXJlLiBXaWxsIGNhbGwgVlA4R2V0SGVhZGVycygpIGlmIGl0IHdhc24ndCBkb25lIGFscmVhZHkuCi0vLyBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgZXJyb3IuCi1pbnQgVlA4RGVjb2RlKFZQOERlY29kZXIqIGNvbnN0IGRlYywgVlA4SW8qIGNvbnN0IGlvKTsKLQotLy8gUmV0dXJuIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBkZWNvZGVyOgotVlA4U3RhdHVzQ29kZSBWUDhTdGF0dXMoVlA4RGVjb2RlciogY29uc3QgZGVjKTsKLQotLy8gcmV0dXJuIHJlYWRhYmxlIHN0cmluZyBjb3JyZXNwb25kaW5nIHRvIHRoZSBsYXN0IHN0YXR1cy4KLWNvbnN0IGNoYXIqIFZQOFN0YXR1c01lc3NhZ2UoVlA4RGVjb2RlciogY29uc3QgZGVjKTsKLQotLy8gUmVzZXRzIHRoZSBkZWNvZGVyIGluIGl0cyBpbml0aWFsIHN0YXRlLCByZWNsYWltaW5nIG1lbW9yeS4KLS8vIE5vdCBhIG1hbmRhdG9yeSBjYWxsIGJldHdlZW4gY2FsbHMgdG8gVlA4RGVjb2RlKCkuCi12b2lkIFZQOENsZWFyKFZQOERlY29kZXIqIGNvbnN0IGRlYyk7Ci0KLS8vIERlc3Ryb3kgdGhlIGRlY29kZXIgb2JqZWN0Lgotdm9pZCBWUDhEZWxldGUoVlA4RGVjb2RlciogY29uc3QgZGVjKTsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE1pc2NlbGxhbmVvdXMgVlA4L1ZQOEwgYml0c3RyZWFtIHByb2JpbmcgZnVuY3Rpb25zLgotCi0vLyBSZXR1cm5zIHRydWUgaWYgdGhlIG5leHQgMyBieXRlcyBpbiBkYXRhIGNvbnRhaW4gdGhlIFZQOCBzaWduYXR1cmUuCi1XRUJQX0VYVEVSTihpbnQpIFZQOENoZWNrU2lnbmF0dXJlKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsIHNpemVfdCBkYXRhX3NpemUpOwotCi0vLyBWYWxpZGF0ZXMgdGhlIFZQOCBkYXRhLWhlYWRlciBhbmQgcmV0cmlldmVzIGJhc2ljIGhlYWRlciBpbmZvcm1hdGlvbiB2aXoKLS8vIHdpZHRoIGFuZCBoZWlnaHQuIFJldHVybnMgMCBpbiBjYXNlIG9mIGZvcm1hdHRpbmcgZXJyb3IuICp3aWR0aC8qaGVpZ2h0Ci0vLyBjYW4gYmUgcGFzc2VkIE5VTEwuCi1XRUJQX0VYVEVSTihpbnQpIFZQOEdldEluZm8oCi0gICAgY29uc3QgdWludDhfdCogZGF0YSwKLSAgICBzaXplX3QgZGF0YV9zaXplLCAgICAvLyBkYXRhIGF2YWlsYWJsZSBzbyBmYXIKLSAgICBzaXplX3QgY2h1bmtfc2l6ZSwgICAvLyB0b3RhbCBkYXRhIHNpemUgZXhwZWN0ZWQgaW4gdGhlIGNodW5rCi0gICAgaW50KiBjb25zdCB3aWR0aCwgaW50KiBjb25zdCBoZWlnaHQpOwotCi0vLyBSZXR1cm5zIHRydWUgaWYgdGhlIG5leHQgYnl0ZShzKSBpbiBkYXRhIGlzIGEgVlA4TCBzaWduYXR1cmUuCi1XRUJQX0VYVEVSTihpbnQpIFZQOExDaGVja1NpZ25hdHVyZShjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0KLS8vIFZhbGlkYXRlcyB0aGUgVlA4TCBkYXRhLWhlYWRlciBhbmQgcmV0cmlldmVzIGJhc2ljIGhlYWRlciBpbmZvcm1hdGlvbiB2aXoKLS8vIHdpZHRoLCBoZWlnaHQgYW5kIGFscGhhLiBSZXR1cm5zIDAgaW4gY2FzZSBvZiBmb3JtYXR0aW5nIGVycm9yLgotLy8gd2lkdGgvaGVpZ2h0L2hhc19hbHBoYSBjYW4gYmUgcGFzc2VkIE5VTEwuCi1XRUJQX0VYVEVSTihpbnQpIFZQOExHZXRJbmZvKAotICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsICAvLyBkYXRhIGF2YWlsYWJsZSBzbyBmYXIKLSAgICBpbnQqIGNvbnN0IHdpZHRoLCBpbnQqIGNvbnN0IGhlaWdodCwgaW50KiBjb25zdCBoYXNfYWxwaGEpOwotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKLQotI2VuZGlmICAvKiBXRUJQX1dFQlBfREVDT0RFX1ZQOF9IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL2ZyYW1lLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kZWMvZnJhbWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDczNTI4YS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kZWMvZnJhbWUuYworKysgL2Rldi9udWxsCkBAIC0xLDY5OSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gRnJhbWUtcmVjb25zdHJ1Y3Rpb24gZnVuY3Rpb24uIE1lbW9yeSBhbGxvY2F0aW9uLgotLy8KLS8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCi0KLSNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgotI2Vsc2UKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2luY2x1ZGUgIi4vdnA4aS5oIgotI2luY2x1ZGUgIi4uL3V0aWxzL3V0aWxzLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jZGVmaW5lIEFMSUdOX01BU0sgKDMyIC0gMSkKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEZpbHRlcmluZwotCi0vLyBrRmlsdGVyRXh0cmFSb3dzW10gPSBIb3cgbWFueSBleHRyYSBsaW5lcyBhcmUgbmVlZGVkIG9uIHRoZSBNQiBib3VuZGFyeQotLy8gZm9yIGNhY2hpbmcsIGdpdmVuIGEgZmlsdGVyaW5nIGxldmVsLgotLy8gU2ltcGxlIGZpbHRlcjogIHVwIHRvIDIgbHVtYSBzYW1wbGVzIGFyZSByZWFkIGFuZCAxIGlzIHdyaXR0ZW4uCi0vLyBDb21wbGV4IGZpbHRlcjogdXAgdG8gNCBsdW1hIHNhbXBsZXMgYXJlIHJlYWQgYW5kIDMgYXJlIHdyaXR0ZW4uIFNhbWUgZm9yCi0vLyAgICAgICAgICAgICAgICAgVS9WLCBzbyBpdCdzIDggc2FtcGxlcyB0b3RhbCAoYmVjYXVzZSBvZiB0aGUgMnggdXBzYW1wbGluZykuCi1zdGF0aWMgY29uc3QgdWludDhfdCBrRmlsdGVyRXh0cmFSb3dzWzNdID0geyAwLCAyLCA4IH07Ci0KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgaGV2X3RocmVzaF9mcm9tX2xldmVsKGludCBsZXZlbCwgaW50IGtleWZyYW1lKSB7Ci0gIGlmIChrZXlmcmFtZSkgewotICAgIHJldHVybiAobGV2ZWwgPj0gNDApID8gMiA6IChsZXZlbCA+PSAxNSkgPyAxIDogMDsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gKGxldmVsID49IDQwKSA/IDMgOiAobGV2ZWwgPj0gMjApID8gMiA6IChsZXZlbCA+PSAxNSkgPyAxIDogMDsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBEb0ZpbHRlcihjb25zdCBWUDhEZWNvZGVyKiBjb25zdCBkZWMsIGludCBtYl94LCBpbnQgbWJfeSkgewotICBjb25zdCBWUDhUaHJlYWRDb250ZXh0KiBjb25zdCBjdHggPSAmZGVjLT50aHJlYWRfY3R4XzsKLSAgY29uc3QgaW50IHlfYnBzID0gZGVjLT5jYWNoZV95X3N0cmlkZV87Ci0gIFZQOEZJbmZvKiBjb25zdCBmX2luZm8gPSBjdHgtPmZfaW5mb18gKyBtYl94OwotICB1aW50OF90KiBjb25zdCB5X2RzdCA9IGRlYy0+Y2FjaGVfeV8gKyBjdHgtPmlkXyAqIDE2ICogeV9icHMgKyBtYl94ICogMTY7Ci0gIGNvbnN0IGludCBsZXZlbCA9IGZfaW5mby0+Zl9sZXZlbF87Ci0gIGNvbnN0IGludCBpbGV2ZWwgPSBmX2luZm8tPmZfaWxldmVsXzsKLSAgY29uc3QgaW50IGxpbWl0ID0gMiAqIGxldmVsICsgaWxldmVsOwotICBpZiAobGV2ZWwgPT0gMCkgewotICAgIHJldHVybjsKLSAgfQotICBpZiAoZGVjLT5maWx0ZXJfdHlwZV8gPT0gMSkgeyAgIC8vIHNpbXBsZQotICAgIGlmIChtYl94ID4gMCkgewotICAgICAgVlA4U2ltcGxlSEZpbHRlcjE2KHlfZHN0LCB5X2JwcywgbGltaXQgKyA0KTsKLSAgICB9Ci0gICAgaWYgKGZfaW5mby0+Zl9pbm5lcl8pIHsKLSAgICAgIFZQOFNpbXBsZUhGaWx0ZXIxNmkoeV9kc3QsIHlfYnBzLCBsaW1pdCk7Ci0gICAgfQotICAgIGlmIChtYl95ID4gMCkgewotICAgICAgVlA4U2ltcGxlVkZpbHRlcjE2KHlfZHN0LCB5X2JwcywgbGltaXQgKyA0KTsKLSAgICB9Ci0gICAgaWYgKGZfaW5mby0+Zl9pbm5lcl8pIHsKLSAgICAgIFZQOFNpbXBsZVZGaWx0ZXIxNmkoeV9kc3QsIHlfYnBzLCBsaW1pdCk7Ci0gICAgfQotICB9IGVsc2UgeyAgICAvLyBjb21wbGV4Ci0gICAgY29uc3QgaW50IHV2X2JwcyA9IGRlYy0+Y2FjaGVfdXZfc3RyaWRlXzsKLSAgICB1aW50OF90KiBjb25zdCB1X2RzdCA9IGRlYy0+Y2FjaGVfdV8gKyBjdHgtPmlkXyAqIDggKiB1dl9icHMgKyBtYl94ICogODsKLSAgICB1aW50OF90KiBjb25zdCB2X2RzdCA9IGRlYy0+Y2FjaGVfdl8gKyBjdHgtPmlkXyAqIDggKiB1dl9icHMgKyBtYl94ICogODsKLSAgICBjb25zdCBpbnQgaGV2X3RocmVzaCA9Ci0gICAgICAgIGhldl90aHJlc2hfZnJvbV9sZXZlbChsZXZlbCwgZGVjLT5mcm1faGRyXy5rZXlfZnJhbWVfKTsKLSAgICBpZiAobWJfeCA+IDApIHsKLSAgICAgIFZQOEhGaWx0ZXIxNih5X2RzdCwgeV9icHMsIGxpbWl0ICsgNCwgaWxldmVsLCBoZXZfdGhyZXNoKTsKLSAgICAgIFZQOEhGaWx0ZXI4KHVfZHN0LCB2X2RzdCwgdXZfYnBzLCBsaW1pdCArIDQsIGlsZXZlbCwgaGV2X3RocmVzaCk7Ci0gICAgfQotICAgIGlmIChmX2luZm8tPmZfaW5uZXJfKSB7Ci0gICAgICBWUDhIRmlsdGVyMTZpKHlfZHN0LCB5X2JwcywgbGltaXQsIGlsZXZlbCwgaGV2X3RocmVzaCk7Ci0gICAgICBWUDhIRmlsdGVyOGkodV9kc3QsIHZfZHN0LCB1dl9icHMsIGxpbWl0LCBpbGV2ZWwsIGhldl90aHJlc2gpOwotICAgIH0KLSAgICBpZiAobWJfeSA+IDApIHsKLSAgICAgIFZQOFZGaWx0ZXIxNih5X2RzdCwgeV9icHMsIGxpbWl0ICsgNCwgaWxldmVsLCBoZXZfdGhyZXNoKTsKLSAgICAgIFZQOFZGaWx0ZXI4KHVfZHN0LCB2X2RzdCwgdXZfYnBzLCBsaW1pdCArIDQsIGlsZXZlbCwgaGV2X3RocmVzaCk7Ci0gICAgfQotICAgIGlmIChmX2luZm8tPmZfaW5uZXJfKSB7Ci0gICAgICBWUDhWRmlsdGVyMTZpKHlfZHN0LCB5X2JwcywgbGltaXQsIGlsZXZlbCwgaGV2X3RocmVzaCk7Ci0gICAgICBWUDhWRmlsdGVyOGkodV9kc3QsIHZfZHN0LCB1dl9icHMsIGxpbWl0LCBpbGV2ZWwsIGhldl90aHJlc2gpOwotICAgIH0KLSAgfQotfQotCi0vLyBGaWx0ZXIgdGhlIGRlY29kZWQgbWFjcm9ibG9jayByb3cgKGlmIG5lZWRlZCkKLXN0YXRpYyB2b2lkIEZpbHRlclJvdyhjb25zdCBWUDhEZWNvZGVyKiBjb25zdCBkZWMpIHsKLSAgaW50IG1iX3g7Ci0gIGNvbnN0IGludCBtYl95ID0gZGVjLT50aHJlYWRfY3R4Xy5tYl95XzsKLSAgU0JfRENIRUNLKGRlYy0+dGhyZWFkX2N0eF8uZmlsdGVyX3Jvd18pOwotICBmb3IgKG1iX3ggPSBkZWMtPnRsX21iX3hfOyBtYl94IDwgZGVjLT5icl9tYl94XzsgKyttYl94KSB7Ci0gICAgRG9GaWx0ZXIoZGVjLCBtYl94LCBtYl95KTsKLSAgfQotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gUHJlY29tcHV0ZSB0aGUgZmlsdGVyaW5nIHN0cmVuZ3RoIGZvciBlYWNoIHNlZ21lbnQgYW5kIGVhY2ggaTR4NC9pMTZ4MTYgbW9kZS4KLQotc3RhdGljIHZvaWQgUHJlY29tcHV0ZUZpbHRlclN0cmVuZ3RocyhWUDhEZWNvZGVyKiBjb25zdCBkZWMpIHsKLSAgaWYgKGRlYy0+ZmlsdGVyX3R5cGVfID4gMCkgewotICAgIGludCBzOwotICAgIGNvbnN0IFZQOEZpbHRlckhlYWRlciogY29uc3QgaGRyID0gJmRlYy0+ZmlsdGVyX2hkcl87Ci0gICAgZm9yIChzID0gMDsgcyA8IE5VTV9NQl9TRUdNRU5UUzsgKytzKSB7Ci0gICAgICBpbnQgaTR4NDsKLSAgICAgIC8vIEZpcnN0LCBjb21wdXRlIHRoZSBpbml0aWFsIGxldmVsCi0gICAgICBpbnQgYmFzZV9sZXZlbDsKLSAgICAgIGlmIChkZWMtPnNlZ21lbnRfaGRyXy51c2Vfc2VnbWVudF8pIHsKLSAgICAgICAgYmFzZV9sZXZlbCA9IGRlYy0+c2VnbWVudF9oZHJfLmZpbHRlcl9zdHJlbmd0aF9bc107Ci0gICAgICAgIGlmICghZGVjLT5zZWdtZW50X2hkcl8uYWJzb2x1dGVfZGVsdGFfKSB7Ci0gICAgICAgICAgYmFzZV9sZXZlbCArPSBoZHItPmxldmVsXzsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgYmFzZV9sZXZlbCA9IGhkci0+bGV2ZWxfOwotICAgICAgfQotICAgICAgZm9yIChpNHg0ID0gMDsgaTR4NCA8PSAxOyArK2k0eDQpIHsKLSAgICAgICAgVlA4RkluZm8qIGNvbnN0IGluZm8gPSAmZGVjLT5mc3RyZW5ndGhzX1tzXVtpNHg0XTsKLSAgICAgICAgaW50IGxldmVsID0gYmFzZV9sZXZlbDsKLSAgICAgICAgaWYgKGhkci0+dXNlX2xmX2RlbHRhXykgewotICAgICAgICAgIC8vIFRPRE8oc2thbCk6IG9ubHkgQ1VSUkVOVCBpcyBoYW5kbGVkIGZvciBub3cuCi0gICAgICAgICAgbGV2ZWwgKz0gaGRyLT5yZWZfbGZfZGVsdGFfWzBdOwotICAgICAgICAgIGlmIChpNHg0KSB7Ci0gICAgICAgICAgICBsZXZlbCArPSBoZHItPm1vZGVfbGZfZGVsdGFfWzBdOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBsZXZlbCA9IChsZXZlbCA8IDApID8gMCA6IChsZXZlbCA+IDYzKSA/IDYzIDogbGV2ZWw7Ci0gICAgICAgIGluZm8tPmZfbGV2ZWxfID0gbGV2ZWw7Ci0KLSAgICAgICAgaWYgKGhkci0+c2hhcnBuZXNzXyA+IDApIHsKLSAgICAgICAgICBpZiAoaGRyLT5zaGFycG5lc3NfID4gNCkgewotICAgICAgICAgICAgbGV2ZWwgPj49IDI7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxldmVsID4+PSAxOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAobGV2ZWwgPiA5IC0gaGRyLT5zaGFycG5lc3NfKSB7Ci0gICAgICAgICAgICBsZXZlbCA9IDkgLSBoZHItPnNoYXJwbmVzc187Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGluZm8tPmZfaWxldmVsXyA9IChsZXZlbCA8IDEpID8gMSA6IGxldmVsOwotICAgICAgICBpbmZvLT5mX2lubmVyXyA9IDA7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciBhIHJvdyBvZiBtYWNyb2Jsb2NrcyBpcyBmaW5pc2hlZCBkZWNvZGluZy4KLS8vIEl0IGFsc28gdGFrZXMgaW50byBhY2NvdW50IHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotLy8gICogSW4gY2FzZSBvZiBpbi1sb29wIGZpbHRlcmluZywgd2UgbXVzdCBob2xkIG9mZiBzZW5kaW5nIHNvbWUgb2YgdGhlIGJvdHRvbQotLy8gICAgcGl4ZWxzIGFzIHRoZXkgYXJlIHlldCB1bmZpbHRlcmVkLiBUaGV5IHdpbGwgYmUgd2hlbiB0aGUgbmV4dCBtYWNyb2Jsb2NrCi0vLyAgICByb3cgaXMgZGVjb2RlZC4gTWVhbndoaWxlLCB3ZSBtdXN0IHByZXNlcnZlIHRoZW0gYnkgcm90YXRpbmcgdGhlbSBpbiB0aGUKLS8vICAgIGNhY2hlIGFyZWEuIFRoaXMgZG9lc24ndCBob2xkIGZvciB0aGUgdmVyeSBib3R0b20gcm93IG9mIHRoZSB1bmNyb3BwZWQKLS8vICAgIHBpY3R1cmUgb2YgY291cnNlLgotLy8gICogd2UgbXVzdCBjbGlwIHRoZSByZW1haW5pbmcgcGl4ZWxzIGFnYWluc3QgdGhlIGNyb3BwaW5nIGFyZWEuIFRoZSBWUDhJbwotLy8gICAgc3RydWN0IG11c3QgaGF2ZSB0aGUgZm9sbG93aW5nIGZpZWxkcyBzZXQgY29ycmVjdGx5IGJlZm9yZSBjYWxsaW5nIHB1dCgpOgotCi0jZGVmaW5lIE1BQ1JPQkxPQ0tfVlBPUyhtYl95KSAgKChtYl95KSAqIDE2KSAgICAvLyB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiBhIE1CCi0KLS8vIEZpbmFsaXplIGFuZCB0cmFuc21pdCBhIGNvbXBsZXRlIHJvdy4gUmV0dXJuIGZhbHNlIGluIGNhc2Ugb2YgdXNlci1hYm9ydC4KLXN0YXRpYyBpbnQgRmluaXNoUm93KFZQOERlY29kZXIqIGNvbnN0IGRlYywgVlA4SW8qIGNvbnN0IGlvKSB7Ci0gIGludCBvayA9IDE7Ci0gIGNvbnN0IFZQOFRocmVhZENvbnRleHQqIGNvbnN0IGN0eCA9ICZkZWMtPnRocmVhZF9jdHhfOwotICBjb25zdCBpbnQgZXh0cmFfeV9yb3dzID0ga0ZpbHRlckV4dHJhUm93c1tkZWMtPmZpbHRlcl90eXBlX107Ci0gIGNvbnN0IGludCB5c2l6ZSA9IGV4dHJhX3lfcm93cyAqIGRlYy0+Y2FjaGVfeV9zdHJpZGVfOwotICBjb25zdCBpbnQgdXZzaXplID0gKGV4dHJhX3lfcm93cyAvIDIpICogZGVjLT5jYWNoZV91dl9zdHJpZGVfOwotICBjb25zdCBpbnQgeV9vZmZzZXQgPSBjdHgtPmlkXyAqIDE2ICogZGVjLT5jYWNoZV95X3N0cmlkZV87Ci0gIGNvbnN0IGludCB1dl9vZmZzZXQgPSBjdHgtPmlkXyAqIDggKiBkZWMtPmNhY2hlX3V2X3N0cmlkZV87Ci0gIHVpbnQ4X3QqIGNvbnN0IHlkc3QgPSBkZWMtPmNhY2hlX3lfIC0geXNpemUgKyB5X29mZnNldDsKLSAgdWludDhfdCogY29uc3QgdWRzdCA9IGRlYy0+Y2FjaGVfdV8gLSB1dnNpemUgKyB1dl9vZmZzZXQ7Ci0gIHVpbnQ4X3QqIGNvbnN0IHZkc3QgPSBkZWMtPmNhY2hlX3ZfIC0gdXZzaXplICsgdXZfb2Zmc2V0OwotICBjb25zdCBpbnQgZmlyc3Rfcm93ID0gKGN0eC0+bWJfeV8gPT0gMCk7Ci0gIGNvbnN0IGludCBsYXN0X3JvdyA9IChjdHgtPm1iX3lfID49IGRlYy0+YnJfbWJfeV8gLSAxKTsKLSAgaW50IHlfc3RhcnQgPSBNQUNST0JMT0NLX1ZQT1MoY3R4LT5tYl95Xyk7Ci0gIGludCB5X2VuZCA9IE1BQ1JPQkxPQ0tfVlBPUyhjdHgtPm1iX3lfICsgMSk7Ci0KLSAgaWYgKGN0eC0+ZmlsdGVyX3Jvd18pIHsKLSAgICBGaWx0ZXJSb3coZGVjKTsKLSAgfQotCi0gIGlmIChpby0+cHV0KSB7Ci0gICAgaWYgKCFmaXJzdF9yb3cpIHsKLSAgICAgIHlfc3RhcnQgLT0gZXh0cmFfeV9yb3dzOwotICAgICAgaW8tPnkgPSB5ZHN0OwotICAgICAgaW8tPnUgPSB1ZHN0OwotICAgICAgaW8tPnYgPSB2ZHN0OwotICAgIH0gZWxzZSB7Ci0gICAgICBpby0+eSA9IGRlYy0+Y2FjaGVfeV8gKyB5X29mZnNldDsKLSAgICAgIGlvLT51ID0gZGVjLT5jYWNoZV91XyArIHV2X29mZnNldDsKLSAgICAgIGlvLT52ID0gZGVjLT5jYWNoZV92XyArIHV2X29mZnNldDsKLSAgICB9Ci0KLSAgICBpZiAoIWxhc3Rfcm93KSB7Ci0gICAgICB5X2VuZCAtPSBleHRyYV95X3Jvd3M7Ci0gICAgfQotICAgIGlmICh5X2VuZCA+IGlvLT5jcm9wX2JvdHRvbSkgewotICAgICAgeV9lbmQgPSBpby0+Y3JvcF9ib3R0b207ICAgIC8vIG1ha2Ugc3VyZSB3ZSBkb24ndCBvdmVyZmxvdyBvbiBsYXN0IHJvdy4KLSAgICB9Ci0gICAgaW8tPmEgPSBOVUxMOwotICAgIGlmIChkZWMtPmFscGhhX2RhdGFfICE9IE5VTEwgJiYgeV9zdGFydCA8IHlfZW5kKSB7Ci0gICAgICAvLyBUT0RPKHNrYWwpOiBzZXZlcmFsIHRoaW5ncyB0byBjb3JyZWN0IGhlcmU6Ci0gICAgICAvLyAqIHRlc3RpbmcgcHJlc2VuY2Ugb2YgYWxwaGEgd2l0aCBkZWMtPmFscGhhX2RhdGFfIGlzIG5vdCBhIGdvb2QgaWRlYQotICAgICAgLy8gKiB3ZSdyZSBhY3R1YWxseSBkZWNvbXByZXNzaW5nIHRoZSBmdWxsIHBsYW5lIG9ubHkgb25jZS4gSXQgc2hvdWxkIGJlCi0gICAgICAvLyAgIG1vcmUgb2J2aW91cyBmcm9tIHNpZ25hdHVyZS4KLSAgICAgIC8vICogd2UgY291bGQgZnJlZSBhbHBoYV9kYXRhXyByaWdodCBhZnRlciB0aGlzIGNhbGwsIGJ1dCB3ZSBkb24ndCBvd24uCi0gICAgICBpby0+YSA9IFZQOERlY29tcHJlc3NBbHBoYVJvd3MoZGVjLCB5X3N0YXJ0LCB5X2VuZCAtIHlfc3RhcnQpOwotICAgICAgaWYgKGlvLT5hID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGRlY29kZSBhbHBoYSBkYXRhLiIpOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoeV9zdGFydCA8IGlvLT5jcm9wX3RvcCkgewotICAgICAgY29uc3QgaW50IGRlbHRhX3kgPSBpby0+Y3JvcF90b3AgLSB5X3N0YXJ0OwotICAgICAgeV9zdGFydCA9IGlvLT5jcm9wX3RvcDsKLSAgICAgIFNCX0RDSEVDSyghKGRlbHRhX3kgJiAxKSk7Ci0gICAgICBpby0+eSArPSBkZWMtPmNhY2hlX3lfc3RyaWRlXyAqIGRlbHRhX3k7Ci0gICAgICBpby0+dSArPSBkZWMtPmNhY2hlX3V2X3N0cmlkZV8gKiAoZGVsdGFfeSA+PiAxKTsKLSAgICAgIGlvLT52ICs9IGRlYy0+Y2FjaGVfdXZfc3RyaWRlXyAqIChkZWx0YV95ID4+IDEpOwotICAgICAgaWYgKGlvLT5hICE9IE5VTEwpIHsKLSAgICAgICAgaW8tPmEgKz0gaW8tPndpZHRoICogZGVsdGFfeTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHlfc3RhcnQgPCB5X2VuZCkgewotICAgICAgaW8tPnkgKz0gaW8tPmNyb3BfbGVmdDsKLSAgICAgIGlvLT51ICs9IGlvLT5jcm9wX2xlZnQgPj4gMTsKLSAgICAgIGlvLT52ICs9IGlvLT5jcm9wX2xlZnQgPj4gMTsKLSAgICAgIGlmIChpby0+YSAhPSBOVUxMKSB7Ci0gICAgICAgIGlvLT5hICs9IGlvLT5jcm9wX2xlZnQ7Ci0gICAgICB9Ci0gICAgICBpby0+bWJfeSA9IHlfc3RhcnQgLSBpby0+Y3JvcF90b3A7Ci0gICAgICBpby0+bWJfdyA9IGlvLT5jcm9wX3JpZ2h0IC0gaW8tPmNyb3BfbGVmdDsKLSAgICAgIGlvLT5tYl9oID0geV9lbmQgLSB5X3N0YXJ0OwotICAgICAgb2sgPSBpby0+cHV0KGlvKTsKLSAgICB9Ci0gIH0KLSAgLy8gcm90YXRlIHRvcCBzYW1wbGVzIGlmIG5lZWRlZAotICBpZiAoY3R4LT5pZF8gKyAxID09IGRlYy0+bnVtX2NhY2hlc18pIHsKLSAgICBpZiAoIWxhc3Rfcm93KSB7Ci0gICAgICBTYk1lbW9yeUNvcHkoZGVjLT5jYWNoZV95XyAtIHlzaXplLCB5ZHN0ICsgMTYgKiBkZWMtPmNhY2hlX3lfc3RyaWRlXywgeXNpemUpOwotICAgICAgU2JNZW1vcnlDb3B5KGRlYy0+Y2FjaGVfdV8gLSB1dnNpemUsIHVkc3QgKyA4ICogZGVjLT5jYWNoZV91dl9zdHJpZGVfLCB1dnNpemUpOwotICAgICAgU2JNZW1vcnlDb3B5KGRlYy0+Y2FjaGVfdl8gLSB1dnNpemUsIHZkc3QgKyA4ICogZGVjLT5jYWNoZV91dl9zdHJpZGVfLCB1dnNpemUpOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBvazsKLX0KLQotI3VuZGVmIE1BQ1JPQkxPQ0tfVlBPUwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1pbnQgVlA4UHJvY2Vzc1JvdyhWUDhEZWNvZGVyKiBjb25zdCBkZWMsIFZQOElvKiBjb25zdCBpbykgewotICBpbnQgb2sgPSAxOwotICBWUDhUaHJlYWRDb250ZXh0KiBjb25zdCBjdHggPSAmZGVjLT50aHJlYWRfY3R4XzsKLSAgaWYgKCFkZWMtPnVzZV90aHJlYWRzXykgewotICAgIC8vIGN0eC0+aWRfIGFuZCBjdHgtPmZfaW5mb18gYXJlIGFscmVhZHkgc2V0Ci0gICAgY3R4LT5tYl95XyA9IGRlYy0+bWJfeV87Ci0gICAgY3R4LT5maWx0ZXJfcm93XyA9IGRlYy0+ZmlsdGVyX3Jvd187Ci0gICAgb2sgPSBGaW5pc2hSb3coZGVjLCBpbyk7Ci0gIH0gZWxzZSB7Ci0gICAgV2ViUFdvcmtlciogY29uc3Qgd29ya2VyID0gJmRlYy0+d29ya2VyXzsKLSAgICAvLyBGaW5pc2ggcHJldmlvdXMgam9iICpiZWZvcmUqIHVwZGF0aW5nIGNvbnRleHQKLSAgICBvayAmPSBXZWJQV29ya2VyU3luYyh3b3JrZXIpOwotICAgIFNCX0RDSEVDSyh3b3JrZXItPnN0YXR1c18gPT0gT0spOwotICAgIGlmIChvaykgeyAgIC8vIHNwYXduIGEgbmV3IGRlYmxvY2tpbmcvb3V0cHV0IGpvYgotICAgICAgY3R4LT5pb18gPSAqaW87Ci0gICAgICBjdHgtPmlkXyA9IGRlYy0+Y2FjaGVfaWRfOwotICAgICAgY3R4LT5tYl95XyA9IGRlYy0+bWJfeV87Ci0gICAgICBjdHgtPmZpbHRlcl9yb3dfID0gZGVjLT5maWx0ZXJfcm93XzsKLSAgICAgIGlmIChjdHgtPmZpbHRlcl9yb3dfKSB7ICAgIC8vIGp1c3Qgc3dhcCBmaWx0ZXIgaW5mbwotICAgICAgICBWUDhGSW5mbyogY29uc3QgdG1wID0gY3R4LT5mX2luZm9fOwotICAgICAgICBjdHgtPmZfaW5mb18gPSBkZWMtPmZfaW5mb187Ci0gICAgICAgIGRlYy0+Zl9pbmZvXyA9IHRtcDsKLSAgICAgIH0KLSAgICAgIFdlYlBXb3JrZXJMYXVuY2god29ya2VyKTsKLSAgICAgIGlmICgrK2RlYy0+Y2FjaGVfaWRfID09IGRlYy0+bnVtX2NhY2hlc18pIHsKLSAgICAgICAgZGVjLT5jYWNoZV9pZF8gPSAwOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gb2s7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBGaW5pc2ggc2V0dGluZyB1cCB0aGUgZGVjb2RpbmcgcGFyYW1ldGVyIG9uY2UgdXNlcidzIHNldHVwKCkgaXMgY2FsbGVkLgotCi1WUDhTdGF0dXNDb2RlIFZQOEVudGVyQ3JpdGljYWwoVlA4RGVjb2RlciogY29uc3QgZGVjLCBWUDhJbyogY29uc3QgaW8pIHsKLSAgLy8gQ2FsbCBzZXR1cCgpIGZpcnN0LiBUaGlzIG1heSB0cmlnZ2VyIGFkZGl0aW9uYWwgZGVjb2RpbmcgZmVhdHVyZXMgb24gJ2lvJy4KLSAgLy8gTm90ZTogQWZ0ZXJ3YXJkLCB3ZSBtdXN0IGNhbGwgdGVhcmRvd24oKSBub3QgbWF0dGVyIHdoYXQuCi0gIGlmIChpby0+c2V0dXAgJiYgIWlvLT5zZXR1cChpbykpIHsKLSAgICBWUDhTZXRFcnJvcihkZWMsIFZQOF9TVEFUVVNfVVNFUl9BQk9SVCwgIkZyYW1lIHNldHVwIGZhaWxlZCIpOwotICAgIHJldHVybiBkZWMtPnN0YXR1c187Ci0gIH0KLQotICAvLyBEaXNhYmxlIGZpbHRlcmluZyBwZXIgdXNlciByZXF1ZXN0Ci0gIGlmIChpby0+YnlwYXNzX2ZpbHRlcmluZykgewotICAgIGRlYy0+ZmlsdGVyX3R5cGVfID0gMDsKLSAgfQotICAvLyBUT0RPKHNrYWwpOiBmaWx0ZXIgdHlwZSAvIHN0cmVuZ3RoIC8gc2hhcnBuZXNzIGZvcmNpbmcKLQotICAvLyBEZWZpbmUgdGhlIGFyZWEgd2hlcmUgd2UgY2FuIHNraXAgaW4tbG9vcCBmaWx0ZXJpbmcsIGluIGNhc2Ugb2YgY3JvcHBpbmcuCi0gIC8vCi0gIC8vICdTaW1wbGUnIGZpbHRlciByZWFkcyB0d28gbHVtYSBzYW1wbGVzIG91dHNpZGUgb2YgdGhlIG1hY3JvYmxvY2sgYW5kCi0gIC8vIGFuZCBmaWx0ZXJzIG9uZS4gSXQgZG9lc24ndCBmaWx0ZXIgdGhlIGNocm9tYSBzYW1wbGVzLiBIZW5jZSwgd2UgY2FuCi0gIC8vIGF2b2lkIGRvaW5nIHRoZSBpbi1sb29wIGZpbHRlcmluZyBiZWZvcmUgY3JvcF90b3AvY3JvcF9sZWZ0IHBvc2l0aW9uLgotICAvLyBGb3IgdGhlICdDb21wbGV4JyBmaWx0ZXIsIDMgc2FtcGxlcyBhcmUgcmVhZCBhbmQgdXAgdG8gMyBhcmUgZmlsdGVyZWQuCi0gIC8vIE1lYW5zOiB0aGVyZSdzIGEgZGVwZW5kZW5jeSBjaGFpbiB0aGF0IGdvZXMgYWxsIHRoZSB3YXkgdXAgdG8gdGhlCi0gIC8vIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgcGljdHVyZSAoTUIgIzApLiBXZSBtdXN0IGZpbHRlciBhbGwgdGhlIHByZXZpb3VzCi0gIC8vIG1hY3JvYmxvY2tzLgotICAvLyBUT0RPKHNrYWwpOiBhZGQgYW4gJ2FwcHJveGltYXRlX2RlY29kaW5nJyBvcHRpb24sIHRoYXQgd29uJ3QgcHJvZHVjZQotICAvLyBhIDE6MSBiaXQtZXhhY3RuZXNzIGZvciBjb21wbGV4IGZpbHRlcmluZz8KLSAgewotICAgIGNvbnN0IGludCBleHRyYV9waXhlbHMgPSBrRmlsdGVyRXh0cmFSb3dzW2RlYy0+ZmlsdGVyX3R5cGVfXTsKLSAgICBpZiAoZGVjLT5maWx0ZXJfdHlwZV8gPT0gMikgewotICAgICAgLy8gRm9yIGNvbXBsZXggZmlsdGVyLCB3ZSBuZWVkIHRvIHByZXNlcnZlIHRoZSBkZXBlbmRlbmN5IGNoYWluLgotICAgICAgZGVjLT50bF9tYl94XyA9IDA7Ci0gICAgICBkZWMtPnRsX21iX3lfID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgLy8gRm9yIHNpbXBsZSBmaWx0ZXIsIHdlIGNhbiBmaWx0ZXIgb25seSB0aGUgY3JvcHBlZCByZWdpb24uCi0gICAgICAvLyBXZSBpbmNsdWRlICdleHRyYV9waXhlbHMnIG9uIHRoZSBvdGhlciBzaWRlIG9mIHRoZSBib3VuZGFyeSwgc2luY2UKLSAgICAgIC8vIHZlcnRpY2FsIG9yIGhvcml6b250YWwgZmlsdGVyaW5nIG9mIHRoZSBwcmV2aW91cyBtYWNyb2Jsb2NrIGNhbgotICAgICAgLy8gbW9kaWZ5IHNvbWUgYWJ1dHRpbmcgcGl4ZWxzLgotICAgICAgZGVjLT50bF9tYl94XyA9IChpby0+Y3JvcF9sZWZ0IC0gZXh0cmFfcGl4ZWxzKSA+PiA0OwotICAgICAgZGVjLT50bF9tYl95XyA9IChpby0+Y3JvcF90b3AgLSBleHRyYV9waXhlbHMpID4+IDQ7Ci0gICAgICBpZiAoZGVjLT50bF9tYl94XyA8IDApIGRlYy0+dGxfbWJfeF8gPSAwOwotICAgICAgaWYgKGRlYy0+dGxfbWJfeV8gPCAwKSBkZWMtPnRsX21iX3lfID0gMDsKLSAgICB9Ci0gICAgLy8gV2UgbmVlZCBzb21lICdleHRyYScgcGl4ZWxzIG9uIHRoZSByaWdodC9ib3R0b20uCi0gICAgZGVjLT5icl9tYl95XyA9IChpby0+Y3JvcF9ib3R0b20gKyAxNSArIGV4dHJhX3BpeGVscykgPj4gNDsKLSAgICBkZWMtPmJyX21iX3hfID0gKGlvLT5jcm9wX3JpZ2h0ICsgMTUgKyBleHRyYV9waXhlbHMpID4+IDQ7Ci0gICAgaWYgKGRlYy0+YnJfbWJfeF8gPiBkZWMtPm1iX3dfKSB7Ci0gICAgICBkZWMtPmJyX21iX3hfID0gZGVjLT5tYl93XzsKLSAgICB9Ci0gICAgaWYgKGRlYy0+YnJfbWJfeV8gPiBkZWMtPm1iX2hfKSB7Ci0gICAgICBkZWMtPmJyX21iX3lfID0gZGVjLT5tYl9oXzsKLSAgICB9Ci0gIH0KLSAgUHJlY29tcHV0ZUZpbHRlclN0cmVuZ3RocyhkZWMpOwotICByZXR1cm4gVlA4X1NUQVRVU19PSzsKLX0KLQotaW50IFZQOEV4aXRDcml0aWNhbChWUDhEZWNvZGVyKiBjb25zdCBkZWMsIFZQOElvKiBjb25zdCBpbykgewotICBpbnQgb2sgPSAxOwotICBpZiAoZGVjLT51c2VfdGhyZWFkc18pIHsKLSAgICBvayA9IFdlYlBXb3JrZXJTeW5jKCZkZWMtPndvcmtlcl8pOwotICB9Ci0KLSAgaWYgKGlvLT50ZWFyZG93bikgewotICAgIGlvLT50ZWFyZG93bihpbyk7Ci0gIH0KLSAgcmV0dXJuIG9rOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRm9yIG11bHRpLXRocmVhZGVkIGRlY29kaW5nIHdlIG5lZWQgdG8gdXNlIDMgcm93cyBvZiAxNiBwaXhlbHMgYXMgZGVsYXkgbGluZS4KLS8vCi0vLyBSZWFzb24gaXM6IHRoZSBkZWJsb2NraW5nIGZpbHRlciBjYW5ub3QgZGVibG9jayB0aGUgYm90dG9tIGhvcml6b250YWwgZWRnZXMKLS8vIGltbWVkaWF0ZWx5LCBhbmQgbmVlZHMgdG8gd2FpdCBmb3IgZmlyc3QgZmV3IHJvd3Mgb2YgdGhlIG5leHQgbWFjcm9ibG9jayB0bwotLy8gYmUgZGVjb2RlZC4gSGVuY2UsIGRlYmxvY2tpbmcgaXMgbGFnZ2luZyBiZWhpbmQgYnkgNCBvciA4IHBpeGVscyAoZGVwZW5kaW5nCi0vLyBvbiBzdHJlbmd0aCkuCi0vLyBXaXRoIHR3byB0aHJlYWRzLCB0aGUgdmVydGljYWwgcG9zaXRpb25zIG9mIHRoZSByb3dzIGJlaW5nIGRlY29kZWQgYXJlOgotLy8gRGVjb2RlOiAgWyAwLi4xNV1bMTYuLjMxXVszMi4uNDddWzQ4Li42M11bNjQuLjc5XVsuLi4KLS8vIERlYmxvY2s6ICAgICAgICAgWyAwLi4xMV1bMTIuLjI3XVsyOC4uNDNdWzQ0Li41OV1bLi4uCi0vLyBJZiB3ZSB1c2UgdHdvIHRocmVhZHMgYW5kIHR3byBjYWNoZXMgb2YgMTYgcGl4ZWxzLCB0aGUgc2VxdWVuY2Ugd291bGQgYmU6Ci0vLyBEZWNvZGU6ICBbIDAuLjE1XVsxNi4uMzFdWyAwLi4xNSEhXVsxNi4uMzFdWyAwLi4xNV1bLi4uCi0vLyBEZWJsb2NrOiAgICAgICAgIFsgMC4uMTFdWzEyLi4yNyEhXVstNC4uMTFdWzEyLi4yN11bLi4uCi0vLyBUaGUgcHJvYmxlbSBvY2N1cnMgZHVyaW5nIHJvdyBbMTIuLjE1ISFdIHRoYXQgYm90aCB0aGUgZGVjb2RpbmcgYW5kCi0vLyBkZWJsb2NraW5nIHRocmVhZHMgYXJlIHdyaXRpbmcgc2ltdWx0YW5lb3VzbHkuCi0vLyBXaXRoIDMgY2FjaGUgbGluZXMsIG9uZSBnZXQgYSBzYWZlIHdyaXRlIHBhdHRlcm46Ci0vLyBEZWNvZGU6ICBbIDAuLjE1XVsxNi4uMzFdWzMyLi40N11bIDAuLjE1XVsxNi4uMzFdWzMyLi40N11bMC4uCi0vLyBEZWJsb2NrOiAgICAgICAgIFsgMC4uMTFdWzEyLi4yN11bMjguLjQzXVstNC4uMTFdWzEyLi4yN11bMjguLi4KLS8vIE5vdGUgdGhhdCBtdWx0aS10aHJlYWRlZCBvdXRwdXQgX3dpdGhvdXRfIGRlYmxvY2tpbmcgY2FuIG1ha2UgdXNlIG9mIHR3bwotLy8gY2FjaGUgbGluZXMgb2YgMTYgcGl4ZWxzIG9ubHksIHNpbmNlIHRoZXJlJ3Mgbm8gbGFnZ2luZyBiZWhpbmQuIFRoZSBkZWNvZGluZwotLy8gYW5kIG91dHB1dCBwcm9jZXNzIGhhdmUgbm9uLWNvbmN1cnJlbnQgd3JpdGluZzoKLS8vIERlY29kZTogIFsgMC4uMTVdWzE2Li4zMV1bIDAuLjE1XVsxNi4uMzFdWy4uLgotLy8gaW8tPnB1dDogICAgICAgICBbIDAuLjE1XVsxNi4uMzFdWyAwLi4xNV1bLi4uCi0KLSNkZWZpbmUgTVRfQ0FDSEVfTElORVMgMwotI2RlZmluZSBTVF9DQUNIRV9MSU5FUyAxICAgLy8gMSBjYWNoZSByb3cgb25seSBmb3Igc2luZ2xlLXRocmVhZGVkIGNhc2UKLQotLy8gSW5pdGlhbGl6ZSBtdWx0aS9zaW5nbGUtdGhyZWFkIHdvcmtlcgotc3RhdGljIGludCBJbml0VGhyZWFkQ29udGV4dChWUDhEZWNvZGVyKiBjb25zdCBkZWMpIHsKLSAgZGVjLT5jYWNoZV9pZF8gPSAwOwotICBpZiAoZGVjLT51c2VfdGhyZWFkc18pIHsKLSAgICBXZWJQV29ya2VyKiBjb25zdCB3b3JrZXIgPSAmZGVjLT53b3JrZXJfOwotICAgIGlmICghV2ViUFdvcmtlclJlc2V0KHdvcmtlcikpIHsKLSAgICAgIHJldHVybiBWUDhTZXRFcnJvcihkZWMsIFZQOF9TVEFUVVNfT1VUX09GX01FTU9SWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAidGhyZWFkIGluaXRpYWxpemF0aW9uIGZhaWxlZC4iKTsKLSAgICB9Ci0gICAgd29ya2VyLT5kYXRhMSA9IGRlYzsKLSAgICB3b3JrZXItPmRhdGEyID0gKHZvaWQqKSZkZWMtPnRocmVhZF9jdHhfLmlvXzsKLSAgICB3b3JrZXItPmhvb2sgPSAoV2ViUFdvcmtlckhvb2spRmluaXNoUm93OwotICAgIGRlYy0+bnVtX2NhY2hlc18gPQotICAgICAgKGRlYy0+ZmlsdGVyX3R5cGVfID4gMCkgPyBNVF9DQUNIRV9MSU5FUyA6IE1UX0NBQ0hFX0xJTkVTIC0gMTsKLSAgfSBlbHNlIHsKLSAgICBkZWMtPm51bV9jYWNoZXNfID0gU1RfQ0FDSEVfTElORVM7Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLSN1bmRlZiBNVF9DQUNIRV9MSU5FUwotI3VuZGVmIFNUX0NBQ0hFX0xJTkVTCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBNZW1vcnkgc2V0dXAKLQotc3RhdGljIGludCBBbGxvY2F0ZU1lbW9yeShWUDhEZWNvZGVyKiBjb25zdCBkZWMpIHsKLSAgY29uc3QgaW50IG51bV9jYWNoZXMgPSBkZWMtPm51bV9jYWNoZXNfOwotICBjb25zdCBpbnQgbWJfdyA9IGRlYy0+bWJfd187Ci0gIC8vIE5vdGU6IHdlIHVzZSAnc2l6ZV90JyB3aGVuIHRoZXJlJ3Mgbm8gb3ZlcmZsb3cgcmlzaywgdWludDY0X3Qgb3RoZXJ3aXNlLgotICBjb25zdCBzaXplX3QgaW50cmFfcHJlZF9tb2RlX3NpemUgPSA0ICogbWJfdyAqIHNpemVvZih1aW50OF90KTsKLSAgY29uc3Qgc2l6ZV90IHRvcF9zaXplID0gKDE2ICsgOCArIDgpICogbWJfdzsKLSAgY29uc3Qgc2l6ZV90IG1iX2luZm9fc2l6ZSA9IChtYl93ICsgMSkgKiBzaXplb2YoVlA4TUIpOwotICBjb25zdCBzaXplX3QgZl9pbmZvX3NpemUgPQotICAgICAgKGRlYy0+ZmlsdGVyX3R5cGVfID4gMCkgPwotICAgICAgICAgIG1iX3cgKiAoZGVjLT51c2VfdGhyZWFkc18gPyAyIDogMSkgKiBzaXplb2YoVlA4RkluZm8pCi0gICAgICAgIDogMDsKLSAgY29uc3Qgc2l6ZV90IHl1dl9zaXplID0gWVVWX1NJWkUgKiBzaXplb2YoKmRlYy0+eXV2X2JfKTsKLSAgY29uc3Qgc2l6ZV90IGNvZWZmc19zaXplID0gMzg0ICogc2l6ZW9mKCpkZWMtPmNvZWZmc18pOwotICBjb25zdCBzaXplX3QgY2FjaGVfaGVpZ2h0ID0gKDE2ICogbnVtX2NhY2hlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsga0ZpbHRlckV4dHJhUm93c1tkZWMtPmZpbHRlcl90eXBlX10pICogMyAvIDI7Ci0gIGNvbnN0IHNpemVfdCBjYWNoZV9zaXplID0gdG9wX3NpemUgKiBjYWNoZV9oZWlnaHQ7Ci0gIC8vIGFscGhhX3NpemUgaXMgdGhlIG9ubHkgb25lIHRoYXQgc2NhbGVzIGFzIHdpZHRoIHggaGVpZ2h0LgotICBjb25zdCB1aW50NjRfdCBhbHBoYV9zaXplID0gKGRlYy0+YWxwaGFfZGF0YV8gIT0gTlVMTCkgPwotICAgICAgKHVpbnQ2NF90KWRlYy0+cGljX2hkcl8ud2lkdGhfICogZGVjLT5waWNfaGRyXy5oZWlnaHRfIDogMFVMTDsKLSAgY29uc3QgdWludDY0X3QgbmVlZGVkID0gKHVpbnQ2NF90KWludHJhX3ByZWRfbW9kZV9zaXplCi0gICAgICAgICAgICAgICAgICAgICAgICArIHRvcF9zaXplICsgbWJfaW5mb19zaXplICsgZl9pbmZvX3NpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICsgeXV2X3NpemUgKyBjb2VmZnNfc2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgKyBjYWNoZV9zaXplICsgYWxwaGFfc2l6ZSArIEFMSUdOX01BU0s7Ci0gIHVpbnQ4X3QqIG1lbTsKLQotICBpZiAobmVlZGVkICE9IChzaXplX3QpbmVlZGVkKSByZXR1cm4gMDsgIC8vIGNoZWNrIGZvciBvdmVyZmxvdwotICBpZiAobmVlZGVkID4gZGVjLT5tZW1fc2l6ZV8pIHsKLSAgICBTYk1lbW9yeURlYWxsb2NhdGUoZGVjLT5tZW1fKTsKLSAgICBkZWMtPm1lbV9zaXplXyA9IDA7Ci0gICAgZGVjLT5tZW1fID0gV2ViUFNhZmVNYWxsb2MobmVlZGVkLCBzaXplb2YodWludDhfdCkpOwotICAgIGlmIChkZWMtPm1lbV8gPT0gTlVMTCkgewotICAgICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19PVVRfT0ZfTUVNT1JZLAotICAgICAgICAgICAgICAgICAgICAgICAgICJubyBtZW1vcnkgZHVyaW5nIGZyYW1lIGluaXRpYWxpemF0aW9uLiIpOwotICAgIH0KLSAgICAvLyBkb3duLWNhc3QgaXMgb2ssIHRoYW5rcyB0byBXZWJQU2FmZUFsbG9jKCkgYWJvdmUuCi0gICAgZGVjLT5tZW1fc2l6ZV8gPSAoc2l6ZV90KW5lZWRlZDsKLSAgfQotCi0gIG1lbSA9ICh1aW50OF90KilkZWMtPm1lbV87Ci0gIGRlYy0+aW50cmFfdF8gPSAodWludDhfdCopbWVtOwotICBtZW0gKz0gaW50cmFfcHJlZF9tb2RlX3NpemU7Ci0KLSAgZGVjLT55X3RfID0gKHVpbnQ4X3QqKW1lbTsKLSAgbWVtICs9IDE2ICogbWJfdzsKLSAgZGVjLT51X3RfID0gKHVpbnQ4X3QqKW1lbTsKLSAgbWVtICs9IDggKiBtYl93OwotICBkZWMtPnZfdF8gPSAodWludDhfdCopbWVtOwotICBtZW0gKz0gOCAqIG1iX3c7Ci0KLSAgZGVjLT5tYl9pbmZvXyA9ICgoVlA4TUIqKW1lbSkgKyAxOwotICBtZW0gKz0gbWJfaW5mb19zaXplOwotCi0gIGRlYy0+Zl9pbmZvXyA9IGZfaW5mb19zaXplID8gKFZQOEZJbmZvKiltZW0gOiBOVUxMOwotICBtZW0gKz0gZl9pbmZvX3NpemU7Ci0gIGRlYy0+dGhyZWFkX2N0eF8uaWRfID0gMDsKLSAgZGVjLT50aHJlYWRfY3R4Xy5mX2luZm9fID0gZGVjLT5mX2luZm9fOwotICBpZiAoZGVjLT51c2VfdGhyZWFkc18pIHsKLSAgICAvLyBzZWNvbmRhcnkgY2FjaGUgbGluZS4gVGhlIGRlYmxvY2tpbmcgcHJvY2VzcyBuZWVkIHRvIG1ha2UgdXNlIG9mIHRoZQotICAgIC8vIGZpbHRlcmluZyBzdHJlbmd0aCBmcm9tIHByZXZpb3VzIG1hY3JvYmxvY2sgcm93LCB3aGlsZSB0aGUgbmV3IG9uZXMKLSAgICAvLyBhcmUgYmVpbmcgZGVjb2RlZCBpbiBwYXJhbGxlbC4gV2UnbGwganVzdCBzd2FwIHRoZSBwb2ludGVycy4KLSAgICBkZWMtPnRocmVhZF9jdHhfLmZfaW5mb18gKz0gbWJfdzsKLSAgfQotCi0gIG1lbSA9ICh1aW50OF90KikoKHVpbnRwdHJfdCkobWVtICsgQUxJR05fTUFTSykgJiB+QUxJR05fTUFTSyk7Ci0gIFNCX0RDSEVDSygoeXV2X3NpemUgJiBBTElHTl9NQVNLKSA9PSAwKTsKLSAgZGVjLT55dXZfYl8gPSAodWludDhfdCopbWVtOwotICBtZW0gKz0geXV2X3NpemU7Ci0KLSAgZGVjLT5jb2VmZnNfID0gKGludDE2X3QqKW1lbTsKLSAgbWVtICs9IGNvZWZmc19zaXplOwotCi0gIGRlYy0+Y2FjaGVfeV9zdHJpZGVfID0gMTYgKiBtYl93OwotICBkZWMtPmNhY2hlX3V2X3N0cmlkZV8gPSA4ICogbWJfdzsKLSAgewotICAgIGNvbnN0IGludCBleHRyYV9yb3dzID0ga0ZpbHRlckV4dHJhUm93c1tkZWMtPmZpbHRlcl90eXBlX107Ci0gICAgY29uc3QgaW50IGV4dHJhX3kgPSBleHRyYV9yb3dzICogZGVjLT5jYWNoZV95X3N0cmlkZV87Ci0gICAgY29uc3QgaW50IGV4dHJhX3V2ID0gKGV4dHJhX3Jvd3MgLyAyKSAqIGRlYy0+Y2FjaGVfdXZfc3RyaWRlXzsKLSAgICBkZWMtPmNhY2hlX3lfID0gKCh1aW50OF90KiltZW0pICsgZXh0cmFfeTsKLSAgICBkZWMtPmNhY2hlX3VfID0gZGVjLT5jYWNoZV95XwotICAgICAgICAgICAgICAgICAgKyAxNiAqIG51bV9jYWNoZXMgKiBkZWMtPmNhY2hlX3lfc3RyaWRlXyArIGV4dHJhX3V2OwotICAgIGRlYy0+Y2FjaGVfdl8gPSBkZWMtPmNhY2hlX3VfCi0gICAgICAgICAgICAgICAgICArIDggKiBudW1fY2FjaGVzICogZGVjLT5jYWNoZV91dl9zdHJpZGVfICsgZXh0cmFfdXY7Ci0gICAgZGVjLT5jYWNoZV9pZF8gPSAwOwotICB9Ci0gIG1lbSArPSBjYWNoZV9zaXplOwotCi0gIC8vIGFscGhhIHBsYW5lCi0gIGRlYy0+YWxwaGFfcGxhbmVfID0gYWxwaGFfc2l6ZSA/ICh1aW50OF90KiltZW0gOiBOVUxMOwotICBtZW0gKz0gYWxwaGFfc2l6ZTsKLSAgU0JfRENIRUNLKG1lbSA8PSAodWludDhfdCopZGVjLT5tZW1fICsgZGVjLT5tZW1fc2l6ZV8pOwotCi0gIC8vIG5vdGU6IGxlZnQtaW5mbyBpcyBpbml0aWFsaXplZCBvbmNlIGZvciBhbGwuCi0gIFNiTWVtb3J5U2V0KGRlYy0+bWJfaW5mb18gLSAxLCAwLCBtYl9pbmZvX3NpemUpOwotCi0gIC8vIGluaXRpYWxpemUgdG9wCi0gIFNiTWVtb3J5U2V0KGRlYy0+aW50cmFfdF8sIEJfRENfUFJFRCwgaW50cmFfcHJlZF9tb2RlX3NpemUpOwotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCBJbml0SW8oVlA4RGVjb2RlciogY29uc3QgZGVjLCBWUDhJbyogaW8pIHsKLSAgLy8gcHJlcGFyZSAnaW8nCi0gIGlvLT5tYl95ID0gMDsKLSAgaW8tPnkgPSBkZWMtPmNhY2hlX3lfOwotICBpby0+dSA9IGRlYy0+Y2FjaGVfdV87Ci0gIGlvLT52ID0gZGVjLT5jYWNoZV92XzsKLSAgaW8tPnlfc3RyaWRlID0gZGVjLT5jYWNoZV95X3N0cmlkZV87Ci0gIGlvLT51dl9zdHJpZGUgPSBkZWMtPmNhY2hlX3V2X3N0cmlkZV87Ci0gIGlvLT5hID0gTlVMTDsKLX0KLQotaW50IFZQOEluaXRGcmFtZShWUDhEZWNvZGVyKiBjb25zdCBkZWMsIFZQOElvKiBpbykgewotICBpZiAoIUluaXRUaHJlYWRDb250ZXh0KGRlYykpIHJldHVybiAwOyAgLy8gY2FsbCBmaXJzdC4gU2V0cyBkZWMtPm51bV9jYWNoZXNfLgotICBpZiAoIUFsbG9jYXRlTWVtb3J5KGRlYykpIHJldHVybiAwOwotICBJbml0SW8oZGVjLCBpbyk7Ci0gIFZQOERzcEluaXQoKTsgIC8vIEluaXQgY3JpdGljYWwgZnVuY3Rpb24gcG9pbnRlcnMgYW5kIGxvb2stdXAgdGFibGVzLgotICByZXR1cm4gMTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE1haW4gcmVjb25zdHJ1Y3Rpb24gZnVuY3Rpb24uCi0KLXN0YXRpYyBjb25zdCBpbnQga1NjYW5bMTZdID0gewotICAwICsgIDAgKiBCUFMsICA0ICsgIDAgKiBCUFMsIDggKyAgMCAqIEJQUywgMTIgKyAgMCAqIEJQUywKLSAgMCArICA0ICogQlBTLCAgNCArICA0ICogQlBTLCA4ICsgIDQgKiBCUFMsIDEyICsgIDQgKiBCUFMsCi0gIDAgKyAgOCAqIEJQUywgIDQgKyAgOCAqIEJQUywgOCArICA4ICogQlBTLCAxMiArICA4ICogQlBTLAotICAwICsgMTIgKiBCUFMsICA0ICsgMTIgKiBCUFMsIDggKyAxMiAqIEJQUywgMTIgKyAxMiAqIEJQUwotfTsKLQotc3RhdGljIFdFQlBfSU5MSU5FIGludCBDaGVja01vZGUoVlA4RGVjb2RlciogY29uc3QgZGVjLCBpbnQgbW9kZSkgewotICBpZiAobW9kZSA9PSBCX0RDX1BSRUQpIHsKLSAgICBpZiAoZGVjLT5tYl94XyA9PSAwKSB7Ci0gICAgICByZXR1cm4gKGRlYy0+bWJfeV8gPT0gMCkgPyBCX0RDX1BSRURfTk9UT1BMRUZUIDogQl9EQ19QUkVEX05PTEVGVDsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIChkZWMtPm1iX3lfID09IDApID8gQl9EQ19QUkVEX05PVE9QIDogQl9EQ19QUkVEOwotICAgIH0KLSAgfQotICByZXR1cm4gbW9kZTsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgQ29weTMyYih1aW50OF90KiBkc3QsIHVpbnQ4X3QqIHNyYykgewotICAqKHVpbnQzMl90Kilkc3QgPSAqKHVpbnQzMl90KilzcmM7Ci19Ci0KLXZvaWQgVlA4UmVjb25zdHJ1Y3RCbG9jayhWUDhEZWNvZGVyKiBjb25zdCBkZWMpIHsKLSAgaW50IGo7Ci0gIHVpbnQ4X3QqIGNvbnN0IHlfZHN0ID0gZGVjLT55dXZfYl8gKyBZX09GRjsKLSAgdWludDhfdCogY29uc3QgdV9kc3QgPSBkZWMtPnl1dl9iXyArIFVfT0ZGOwotICB1aW50OF90KiBjb25zdCB2X2RzdCA9IGRlYy0+eXV2X2JfICsgVl9PRkY7Ci0KLSAgLy8gUm90YXRlIGluIHRoZSBsZWZ0IHNhbXBsZXMgZnJvbSBwcmV2aW91c2x5IGRlY29kZWQgYmxvY2suIFdlIG1vdmUgZm91cgotICAvLyBwaXhlbHMgYXQgYSB0aW1lIGZvciBhbGlnbm1lbnQgcmVhc29uLCBhbmQgYmVjYXVzZSBvZiBpbi1sb29wIGZpbHRlci4KLSAgaWYgKGRlYy0+bWJfeF8gPiAwKSB7Ci0gICAgZm9yIChqID0gLTE7IGogPCAxNjsgKytqKSB7Ci0gICAgICBDb3B5MzJiKCZ5X2RzdFtqICogQlBTIC0gNF0sICZ5X2RzdFtqICogQlBTICsgMTJdKTsKLSAgICB9Ci0gICAgZm9yIChqID0gLTE7IGogPCA4OyArK2opIHsKLSAgICAgIENvcHkzMmIoJnVfZHN0W2ogKiBCUFMgLSA0XSwgJnVfZHN0W2ogKiBCUFMgKyA0XSk7Ci0gICAgICBDb3B5MzJiKCZ2X2RzdFtqICogQlBTIC0gNF0sICZ2X2RzdFtqICogQlBTICsgNF0pOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBmb3IgKGogPSAwOyBqIDwgMTY7ICsraikgewotICAgICAgeV9kc3RbaiAqIEJQUyAtIDFdID0gMTI5OwotICAgIH0KLSAgICBmb3IgKGogPSAwOyBqIDwgODsgKytqKSB7Ci0gICAgICB1X2RzdFtqICogQlBTIC0gMV0gPSAxMjk7Ci0gICAgICB2X2RzdFtqICogQlBTIC0gMV0gPSAxMjk7Ci0gICAgfQotICAgIC8vIEluaXQgdG9wLWxlZnQgc2FtcGxlIG9uIGxlZnQgY29sdW1uIHRvbwotICAgIGlmIChkZWMtPm1iX3lfID4gMCkgewotICAgICAgeV9kc3RbLTEgLSBCUFNdID0gdV9kc3RbLTEgLSBCUFNdID0gdl9kc3RbLTEgLSBCUFNdID0gMTI5OwotICAgIH0KLSAgfQotICB7Ci0gICAgLy8gYnJpbmcgdG9wIHNhbXBsZXMgaW50byB0aGUgY2FjaGUKLSAgICB1aW50OF90KiBjb25zdCB0b3BfeSA9IGRlYy0+eV90XyArIGRlYy0+bWJfeF8gKiAxNjsKLSAgICB1aW50OF90KiBjb25zdCB0b3BfdSA9IGRlYy0+dV90XyArIGRlYy0+bWJfeF8gKiA4OwotICAgIHVpbnQ4X3QqIGNvbnN0IHRvcF92ID0gZGVjLT52X3RfICsgZGVjLT5tYl94XyAqIDg7Ci0gICAgY29uc3QgaW50MTZfdCogY29lZmZzID0gZGVjLT5jb2VmZnNfOwotICAgIGludCBuOwotCi0gICAgaWYgKGRlYy0+bWJfeV8gPiAwKSB7Ci0gICAgICBTYk1lbW9yeUNvcHkoeV9kc3QgLSBCUFMsIHRvcF95LCAxNik7Ci0gICAgICBTYk1lbW9yeUNvcHkodV9kc3QgLSBCUFMsIHRvcF91LCA4KTsKLSAgICAgIFNiTWVtb3J5Q29weSh2X2RzdCAtIEJQUywgdG9wX3YsIDgpOwotICAgIH0gZWxzZSBpZiAoZGVjLT5tYl94XyA9PSAwKSB7Ci0gICAgICAvLyB3ZSBvbmx5IG5lZWQgdG8gZG8gdGhpcyBpbml0IG9uY2UgYXQgYmxvY2sgKDAsMCkuCi0gICAgICAvLyBBZnRlcndhcmQsIGl0IHJlbWFpbnMgdmFsaWQgZm9yIHRoZSB3aG9sZSB0b3Btb3N0IHJvdy4KLSAgICAgIFNiTWVtb3J5U2V0KHlfZHN0IC0gQlBTIC0gMSwgMTI3LCAxNiArIDQgKyAxKTsKLSAgICAgIFNiTWVtb3J5U2V0KHVfZHN0IC0gQlBTIC0gMSwgMTI3LCA4ICsgMSk7Ci0gICAgICBTYk1lbW9yeVNldCh2X2RzdCAtIEJQUyAtIDEsIDEyNywgOCArIDEpOwotICAgIH0KLQotICAgIC8vIHByZWRpY3QgYW5kIGFkZCByZXNpZHVhbHMKLQotICAgIGlmIChkZWMtPmlzX2k0eDRfKSB7ICAgLy8gNHg0Ci0gICAgICB1aW50MzJfdCogY29uc3QgdG9wX3JpZ2h0ID0gKHVpbnQzMl90KikoeV9kc3QgLSBCUFMgKyAxNik7Ci0KLSAgICAgIGlmIChkZWMtPm1iX3lfID4gMCkgewotICAgICAgICBpZiAoZGVjLT5tYl94XyA+PSBkZWMtPm1iX3dfIC0gMSkgeyAgICAvLyBvbiByaWdodG1vc3QgYm9yZGVyCi0gICAgICAgICAgdG9wX3JpZ2h0WzBdID0gdG9wX3lbMTVdICogMHgwMTAxMDEwMXU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgU2JNZW1vcnlDb3B5KHRvcF9yaWdodCwgdG9wX3kgKyAxNiwgc2l6ZW9mKCp0b3BfcmlnaHQpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgLy8gcmVwbGljYXRlIHRoZSB0b3AtcmlnaHQgcGl4ZWxzIGJlbG93Ci0gICAgICB0b3BfcmlnaHRbQlBTXSA9IHRvcF9yaWdodFsyICogQlBTXSA9IHRvcF9yaWdodFszICogQlBTXSA9IHRvcF9yaWdodFswXTsKLQotICAgICAgLy8gcHJlZGljdCBhbmQgYWRkIHJlc2lkdWVzIGZvciBhbGwgNHg0IGJsb2NrcyBpbiB0dXJuLgotICAgICAgZm9yIChuID0gMDsgbiA8IDE2OyBuKyspIHsKLSAgICAgICAgdWludDhfdCogY29uc3QgZHN0ID0geV9kc3QgKyBrU2NhbltuXTsKLSAgICAgICAgVlA4UHJlZEx1bWE0W2RlYy0+aW1vZGVzX1tuXV0oZHN0KTsKLSAgICAgICAgaWYgKGRlYy0+bm9uX3plcm9fYWNfICYgKDEgPDwgbikpIHsKLSAgICAgICAgICBWUDhUcmFuc2Zvcm0oY29lZmZzICsgbiAqIDE2LCBkc3QsIDApOwotICAgICAgICB9IGVsc2UgaWYgKGRlYy0+bm9uX3plcm9fICYgKDEgPDwgbikpIHsgIC8vIG9ubHkgREMgaXMgcHJlc2VudAotICAgICAgICAgIFZQOFRyYW5zZm9ybURDKGNvZWZmcyArIG4gKiAxNiwgZHN0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSB7ICAgIC8vIDE2eDE2Ci0gICAgICBjb25zdCBpbnQgcHJlZF9mdW5jID0gQ2hlY2tNb2RlKGRlYywgZGVjLT5pbW9kZXNfWzBdKTsKLSAgICAgIFZQOFByZWRMdW1hMTZbcHJlZF9mdW5jXSh5X2RzdCk7Ci0gICAgICBpZiAoZGVjLT5ub25femVyb18pIHsKLSAgICAgICAgZm9yIChuID0gMDsgbiA8IDE2OyBuKyspIHsKLSAgICAgICAgICB1aW50OF90KiBjb25zdCBkc3QgPSB5X2RzdCArIGtTY2FuW25dOwotICAgICAgICAgIGlmIChkZWMtPm5vbl96ZXJvX2FjXyAmICgxIDw8IG4pKSB7Ci0gICAgICAgICAgICBWUDhUcmFuc2Zvcm0oY29lZmZzICsgbiAqIDE2LCBkc3QsIDApOwotICAgICAgICAgIH0gZWxzZSBpZiAoZGVjLT5ub25femVyb18gJiAoMSA8PCBuKSkgeyAgLy8gb25seSBEQyBpcyBwcmVzZW50Ci0gICAgICAgICAgICBWUDhUcmFuc2Zvcm1EQyhjb2VmZnMgKyBuICogMTYsIGRzdCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHsKLSAgICAgIC8vIENocm9tYQotICAgICAgY29uc3QgaW50IHByZWRfZnVuYyA9IENoZWNrTW9kZShkZWMsIGRlYy0+dXZtb2RlXyk7Ci0gICAgICBWUDhQcmVkQ2hyb21hOFtwcmVkX2Z1bmNdKHVfZHN0KTsKLSAgICAgIFZQOFByZWRDaHJvbWE4W3ByZWRfZnVuY10odl9kc3QpOwotCi0gICAgICBpZiAoZGVjLT5ub25femVyb18gJiAweDBmMDAwMCkgeyAgIC8vIGNocm9tYS1VCi0gICAgICAgIGNvbnN0IGludDE2X3QqIGNvbnN0IHVfY29lZmZzID0gZGVjLT5jb2VmZnNfICsgMTYgKiAxNjsKLSAgICAgICAgaWYgKGRlYy0+bm9uX3plcm9fYWNfICYgMHgwZjAwMDApIHsKLSAgICAgICAgICBWUDhUcmFuc2Zvcm1VVih1X2NvZWZmcywgdV9kc3QpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIFZQOFRyYW5zZm9ybURDVVYodV9jb2VmZnMsIHVfZHN0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGRlYy0+bm9uX3plcm9fICYgMHhmMDAwMDApIHsgICAvLyBjaHJvbWEtVgotICAgICAgICBjb25zdCBpbnQxNl90KiBjb25zdCB2X2NvZWZmcyA9IGRlYy0+Y29lZmZzXyArIDIwICogMTY7Ci0gICAgICAgIGlmIChkZWMtPm5vbl96ZXJvX2FjXyAmIDB4ZjAwMDAwKSB7Ci0gICAgICAgICAgVlA4VHJhbnNmb3JtVVYodl9jb2VmZnMsIHZfZHN0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBWUDhUcmFuc2Zvcm1EQ1VWKHZfY29lZmZzLCB2X2RzdCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gc3Rhc2ggYXdheSB0b3Agc2FtcGxlcyBmb3IgbmV4dCBibG9jawotICAgICAgaWYgKGRlYy0+bWJfeV8gPCBkZWMtPm1iX2hfIC0gMSkgewotICAgICAgICBTYk1lbW9yeUNvcHkodG9wX3ksIHlfZHN0ICsgMTUgKiBCUFMsIDE2KTsKLSAgICAgICAgU2JNZW1vcnlDb3B5KHRvcF91LCB1X2RzdCArICA3ICogQlBTLCAgOCk7Ci0gICAgICAgIFNiTWVtb3J5Q29weSh0b3Bfdiwgdl9kc3QgKyAgNyAqIEJQUywgIDgpOwotICAgICAgfQotICAgIH0KLSAgfQotICAvLyBUcmFuc2ZlciByZWNvbnN0cnVjdGVkIHNhbXBsZXMgZnJvbSB5dXZfYl8gY2FjaGUgdG8gZmluYWwgZGVzdGluYXRpb24uCi0gIHsKLSAgICBjb25zdCBpbnQgeV9vZmZzZXQgPSBkZWMtPmNhY2hlX2lkXyAqIDE2ICogZGVjLT5jYWNoZV95X3N0cmlkZV87Ci0gICAgY29uc3QgaW50IHV2X29mZnNldCA9IGRlYy0+Y2FjaGVfaWRfICogOCAqIGRlYy0+Y2FjaGVfdXZfc3RyaWRlXzsKLSAgICB1aW50OF90KiBjb25zdCB5X291dCA9IGRlYy0+Y2FjaGVfeV8gKyBkZWMtPm1iX3hfICogMTYgKyB5X29mZnNldDsKLSAgICB1aW50OF90KiBjb25zdCB1X291dCA9IGRlYy0+Y2FjaGVfdV8gKyBkZWMtPm1iX3hfICogOCArIHV2X29mZnNldDsKLSAgICB1aW50OF90KiBjb25zdCB2X291dCA9IGRlYy0+Y2FjaGVfdl8gKyBkZWMtPm1iX3hfICogOCArIHV2X29mZnNldDsKLSAgICBmb3IgKGogPSAwOyBqIDwgMTY7ICsraikgewotICAgICAgU2JNZW1vcnlDb3B5KHlfb3V0ICsgaiAqIGRlYy0+Y2FjaGVfeV9zdHJpZGVfLCB5X2RzdCArIGogKiBCUFMsIDE2KTsKLSAgICB9Ci0gICAgZm9yIChqID0gMDsgaiA8IDg7ICsraikgewotICAgICAgU2JNZW1vcnlDb3B5KHVfb3V0ICsgaiAqIGRlYy0+Y2FjaGVfdXZfc3RyaWRlXywgdV9kc3QgKyBqICogQlBTLCA4KTsKLSAgICAgIFNiTWVtb3J5Q29weSh2X291dCArIGogKiBkZWMtPmNhY2hlX3V2X3N0cmlkZV8sIHZfZHN0ICsgaiAqIEJQUywgOCk7Ci0gICAgfQotICB9Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL2lkZWMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RlYy9pZGVjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MmFjNjAuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL2lkZWMuYworKysgL2Rldi9udWxsCkBAIC0xLDg0OSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gSW5jcmVtZW50YWwgZGVjb2RpbmcKLS8vCi0vLyBBdXRob3I6IHNvbW5hdGhAZ29vZ2xlLmNvbSAoU29tbmF0aCBCYW5lcmplZSkKLQotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCi0jZWxzZQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICIuL3dlYnBpLmgiCi0jaW5jbHVkZSAiLi92cDhpLmgiCi0jaW5jbHVkZSAiLi4vdXRpbHMvdXRpbHMuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8vIEluIGFwcGVuZCBtb2RlLCBidWZmZXIgYWxsb2NhdGlvbnMgaW5jcmVhc2UgYXMgbXVsdGlwbGVzIG9mIHRoaXMgdmFsdWUuCi0vLyBOZWVkcyB0byBiZSBhIHBvd2VyIG9mIDIuCi0jZGVmaW5lIENIVU5LX1NJWkUgNDA5NgotI2RlZmluZSBNQVhfTUJfU0laRSA0MDk2Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBEYXRhIHN0cnVjdHVyZXMgZm9yIG1lbW9yeSBhbmQgc3RhdGVzCi0KLS8vIERlY29kaW5nIHN0YXRlcy4gU3RhdGUgbm9ybWFsbHkgZmxvd3MgbGlrZSBIRUFERVItPlBBUlRTMC0+REFUQS0+RE9ORS4KLS8vIElmIHRoZXJlIGlzIGFueSBlcnJvciB0aGUgZGVjb2RlciBnb2VzIGludG8gc3RhdGUgRVJST1IuCi10eXBlZGVmIGVudW0gewotICBTVEFURV9QUkVfVlA4LCAgLy8gQWxsIGRhdGEgYmVmb3JlIHRoYXQgb2YgdGhlIGZpcnN0IFZQOCBjaHVuay4KLSAgU1RBVEVfVlA4X0ZSQU1FX0hFQURFUiwgIC8vIEZvciBWUDggRnJhbWUgaGVhZGVyICh3aXRoaW4gVlA4IGNodW5rKS4KLSAgU1RBVEVfVlA4X1BBUlRTMCwKLSAgU1RBVEVfVlA4X0RBVEEsCi0gIFNUQVRFX1ZQOExfSEVBREVSLAotICBTVEFURV9WUDhMX0RBVEEsCi0gIFNUQVRFX0RPTkUsCi0gIFNUQVRFX0VSUk9SCi19IERlY1N0YXRlOwotCi0vLyBPcGVyYXRpbmcgc3RhdGUgZm9yIHRoZSBNZW1CdWZmZXIKLXR5cGVkZWYgZW51bSB7Ci0gIE1FTV9NT0RFX05PTkUgPSAwLAotICBNRU1fTU9ERV9BUFBFTkQsCi0gIE1FTV9NT0RFX01BUAotfSBNZW1CdWZmZXJNb2RlOwotCi0vLyBzdG9yYWdlIGZvciBwYXJ0aXRpb24gIzAgYW5kIHBhcnRpYWwgZGF0YSAoaW4gYSByb2xsaW5nIGZhc2hpb24pCi10eXBlZGVmIHN0cnVjdCB7Ci0gIE1lbUJ1ZmZlck1vZGUgbW9kZV87ICAvLyBPcGVyYXRpb24gbW9kZQotICBzaXplX3Qgc3RhcnRfOyAgICAgICAgLy8gc3RhcnQgbG9jYXRpb24gb2YgdGhlIGRhdGEgdG8gYmUgZGVjb2RlZAotICBzaXplX3QgZW5kXzsgICAgICAgICAgLy8gZW5kIGxvY2F0aW9uCi0gIHNpemVfdCBidWZfc2l6ZV87ICAgICAvLyBzaXplIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyCi0gIHVpbnQ4X3QqIGJ1Zl87ICAgICAgICAvLyBXZSBkb24ndCBvd24gdGhpcyBidWZmZXIgaW4gY2FzZSBXZWJQSVVwZGF0ZSgpCi0KLSAgc2l6ZV90IHBhcnQwX3NpemVfOyAgICAgICAgIC8vIHNpemUgb2YgcGFydGl0aW9uICMwCi0gIGNvbnN0IHVpbnQ4X3QqIHBhcnQwX2J1Zl87ICAvLyBidWZmZXIgdG8gc3RvcmUgcGFydGl0aW9uICMwCi19IE1lbUJ1ZmZlcjsKLQotc3RydWN0IFdlYlBJRGVjb2RlciB7Ci0gIERlY1N0YXRlIHN0YXRlXzsgICAgICAgICAvLyBjdXJyZW50IGRlY29kaW5nIHN0YXRlCi0gIFdlYlBEZWNQYXJhbXMgcGFyYW1zXzsgICAvLyBQYXJhbXMgdG8gc3RvcmUgb3V0cHV0IGluZm8KLSAgaW50IGlzX2xvc3NsZXNzXzsgICAgICAgIC8vIGZvciBkb3duLWNhc3RpbmcgJ2RlY18nLgotICB2b2lkKiBkZWNfOyAgICAgICAgICAgICAgLy8gZWl0aGVyIGEgVlA4RGVjb2RlciBvciBhIFZQOExEZWNvZGVyIGluc3RhbmNlCi0gIFZQOElvIGlvXzsKLQotICBNZW1CdWZmZXIgbWVtXzsgICAgICAgICAgLy8gaW5wdXQgbWVtb3J5IGJ1ZmZlci4KLSAgV2ViUERlY0J1ZmZlciBvdXRwdXRfOyAgIC8vIG91dHB1dCBidWZmZXIgKHdoZW4gbm8gZXh0ZXJuYWwgb25lIGlzIHN1cHBsaWVkKQotICBzaXplX3QgY2h1bmtfc2l6ZV87ICAgICAgLy8gQ29tcHJlc3NlZCBWUDgvVlA4TCBzaXplIGV4dHJhY3RlZCBmcm9tIEhlYWRlci4KLX07Ci0KLS8vIE1CIGNvbnRleHQgdG8gcmVzdG9yZSBpbiBjYXNlIFZQOERlY29kZU1CKCkgZmFpbHMKLXR5cGVkZWYgc3RydWN0IHsKLSAgVlA4TUIgbGVmdF87Ci0gIFZQOE1CIGluZm9fOwotICB1aW50OF90IGludHJhX3RfWzRdOwotICB1aW50OF90IGludHJhX2xfWzRdOwotICBWUDhCaXRSZWFkZXIgYnJfOwotICBWUDhCaXRSZWFkZXIgdG9rZW5fYnJfOwotfSBNQkNvbnRleHQ7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBNZW1CdWZmZXI6IGluY29taW5nIGRhdGEgaGFuZGxpbmcKLQotc3RhdGljIHZvaWQgUmVtYXBCaXRSZWFkZXIoVlA4Qml0UmVhZGVyKiBjb25zdCBiciwgcHRyZGlmZl90IG9mZnNldCkgewotICBpZiAoYnItPmJ1Zl8gIT0gTlVMTCkgewotICAgIGJyLT5idWZfICs9IG9mZnNldDsKLSAgICBici0+YnVmX2VuZF8gKz0gb2Zmc2V0OwotICB9Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSBzaXplX3QgTWVtRGF0YVNpemUoY29uc3QgTWVtQnVmZmVyKiBtZW0pIHsKLSAgcmV0dXJuIChtZW0tPmVuZF8gLSBtZW0tPnN0YXJ0Xyk7Ci19Ci0KLS8vIENoZWNrIGlmIHdlIG5lZWQgdG8gcHJlc2VydmUgdGhlIGNvbXByZXNzZWQgYWxwaGEgZGF0YSwgYXMgaXQgbWF5IG5vdCBoYXZlCi0vLyBiZWVuIGRlY29kZWQgeWV0Lgotc3RhdGljIGludCBOZWVkQ29tcHJlc3NlZEFscGhhKGNvbnN0IFdlYlBJRGVjb2RlciogY29uc3QgaWRlYykgewotICBpZiAoaWRlYy0+c3RhdGVfID09IFNUQVRFX1BSRV9WUDgpIHsKLSAgICAvLyBXZSBoYXZlbid0IHBhcnNlZCB0aGUgaGVhZGVycyB5ZXQsIHNvIHdlIGRvbid0IGtub3cgd2hldGhlciB0aGUgaW1hZ2UgaXMKLSAgICAvLyBsb3NzeSBvciBsb3NzbGVzcy4gVGhpcyBhbHNvIG1lYW5zIHRoYXQgd2UgaGF2ZW4ndCBwYXJzZWQgdGhlIEFMUEggY2h1bmsuCi0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgaWYgKGlkZWMtPmlzX2xvc3NsZXNzXykgewotICAgIHJldHVybiAwOyAgLy8gQUxQSCBjaHVuayBpcyBub3QgcHJlc2VudCBmb3IgbG9zc2xlc3MgaW1hZ2VzLgotICB9IGVsc2UgewotICAgIGNvbnN0IFZQOERlY29kZXIqIGNvbnN0IGRlYyA9IChWUDhEZWNvZGVyKilpZGVjLT5kZWNfOwotICAgIFNCX0RDSEVDSyhkZWMgIT0gTlVMTCk7ICAvLyBNdXN0IGJlIHRydWUgYXMgaWRlYy0+c3RhdGVfICE9IFNUQVRFX1BSRV9WUDguCi0gICAgcmV0dXJuIChkZWMtPmFscGhhX2RhdGFfICE9IE5VTEwpICYmICFkZWMtPmlzX2FscGhhX2RlY29kZWRfOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIERvUmVtYXAoV2ViUElEZWNvZGVyKiBjb25zdCBpZGVjLCBwdHJkaWZmX3Qgb2Zmc2V0KSB7Ci0gIE1lbUJ1ZmZlciogY29uc3QgbWVtID0gJmlkZWMtPm1lbV87Ci0gIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IG5ld19iYXNlID0gbWVtLT5idWZfICsgbWVtLT5zdGFydF87Ci0gIC8vIG5vdGU6IGZvciBWUDgsIHNldHRpbmcgdXAgaWRlYy0+aW9fIGlzIG9ubHkgcmVhbGx5IG5lZWRlZCBhdCB0aGUgYmVnaW5uaW5nCi0gIC8vIG9mIHRoZSBkZWNvZGluZywgdGlsbCBwYXJ0aXRpb24gIzAgaXMgY29tcGxldGUuCi0gIGlkZWMtPmlvXy5kYXRhID0gbmV3X2Jhc2U7Ci0gIGlkZWMtPmlvXy5kYXRhX3NpemUgPSBNZW1EYXRhU2l6ZShtZW0pOwotCi0gIGlmIChpZGVjLT5kZWNfICE9IE5VTEwpIHsKLSAgICBpZiAoIWlkZWMtPmlzX2xvc3NsZXNzXykgewotICAgICAgVlA4RGVjb2RlciogY29uc3QgZGVjID0gKFZQOERlY29kZXIqKWlkZWMtPmRlY187Ci0gICAgICBjb25zdCBpbnQgbGFzdF9wYXJ0ID0gZGVjLT5udW1fcGFydHNfIC0gMTsKLSAgICAgIGlmIChvZmZzZXQgIT0gMCkgewotICAgICAgICBpbnQgcDsKLSAgICAgICAgZm9yIChwID0gMDsgcCA8PSBsYXN0X3BhcnQ7ICsrcCkgewotICAgICAgICAgIFJlbWFwQml0UmVhZGVyKGRlYy0+cGFydHNfICsgcCwgb2Zmc2V0KTsKLSAgICAgICAgfQotICAgICAgICAvLyBSZW1hcCBwYXJ0aXRpb24gIzAgZGF0YSBwb2ludGVyIHRvIG5ldyBvZmZzZXQsIGJ1dCBvbmx5IGluIE1BUAotICAgICAgICAvLyBtb2RlIChpbiBBUFBFTkQgbW9kZSwgcGFydGl0aW9uICMwIGlzIGNvcGllZCBpbnRvIGEgZml4ZWQgbWVtb3J5KS4KLSAgICAgICAgaWYgKG1lbS0+bW9kZV8gPT0gTUVNX01PREVfTUFQKSB7Ci0gICAgICAgICAgUmVtYXBCaXRSZWFkZXIoJmRlYy0+YnJfLCBvZmZzZXQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBTQl9EQ0hFQ0sobGFzdF9wYXJ0ID49IDApOwotICAgICAgZGVjLT5wYXJ0c19bbGFzdF9wYXJ0XS5idWZfZW5kXyA9IG1lbS0+YnVmXyArIG1lbS0+ZW5kXzsKLSAgICAgIGlmIChOZWVkQ29tcHJlc3NlZEFscGhhKGlkZWMpKSBkZWMtPmFscGhhX2RhdGFfICs9IG9mZnNldDsKLSAgICB9IGVsc2UgeyAgICAvLyBSZXNpemUgbG9zc2xlc3MgYml0cmVhZGVyCi0gICAgICBWUDhMRGVjb2RlciogY29uc3QgZGVjID0gKFZQOExEZWNvZGVyKilpZGVjLT5kZWNfOwotICAgICAgVlA4TEJpdFJlYWRlclNldEJ1ZmZlcigmZGVjLT5icl8sIG5ld19iYXNlLCBNZW1EYXRhU2l6ZShtZW0pKTsKLSAgICB9Ci0gIH0KLX0KLQotLy8gQXBwZW5kcyBkYXRhIHRvIHRoZSBlbmQgb2YgTWVtQnVmZmVyLT5idWZfLiBJdCBleHBhbmRzIHRoZSBhbGxvY2F0ZWQgbWVtb3J5Ci0vLyBzaXplIGlmIHJlcXVpcmVkIGFuZCBhbHNvIHVwZGF0ZXMgVlA4Qml0UmVhZGVyJ3MgaWYgbmV3IG1lbW9yeSBpcyBhbGxvY2F0ZWQuCi1zdGF0aWMgaW50IEFwcGVuZFRvTWVtQnVmZmVyKFdlYlBJRGVjb2RlciogY29uc3QgaWRlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSkgewotICBWUDhEZWNvZGVyKiBjb25zdCBkZWMgPSAoVlA4RGVjb2RlciopaWRlYy0+ZGVjXzsKLSAgTWVtQnVmZmVyKiBjb25zdCBtZW0gPSAmaWRlYy0+bWVtXzsKLSAgY29uc3QgaW50IG5lZWRfY29tcHJlc3NlZF9hbHBoYSA9IE5lZWRDb21wcmVzc2VkQWxwaGEoaWRlYyk7Ci0gIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IG9sZF9zdGFydCA9IG1lbS0+YnVmXyArIG1lbS0+c3RhcnRfOwotICBjb25zdCB1aW50OF90KiBjb25zdCBvbGRfYmFzZSA9Ci0gICAgICBuZWVkX2NvbXByZXNzZWRfYWxwaGEgPyBkZWMtPmFscGhhX2RhdGFfIDogb2xkX3N0YXJ0OwotICBTQl9EQ0hFQ0sobWVtLT5tb2RlXyA9PSBNRU1fTU9ERV9BUFBFTkQpOwotICBpZiAoZGF0YV9zaXplID4gTUFYX0NIVU5LX1BBWUxPQUQpIHsKLSAgICAvLyBzZWN1cml0eSBzYWZlZ3VhcmQ6IHRyeWluZyB0byBhbGxvY2F0ZSBtb3JlIHRoYW4gd2hhdCB0aGUgZm9ybWF0Ci0gICAgLy8gYWxsb3dzIGZvciBhIGNodW5rIHNob3VsZCBiZSBjb25zaWRlcmVkIGEgc21va2Ugc21lbGwuCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBpZiAobWVtLT5lbmRfICsgZGF0YV9zaXplID4gbWVtLT5idWZfc2l6ZV8pIHsgIC8vIE5lZWQgc29tZSBmcmVlIG1lbW9yeQotICAgIGNvbnN0IHNpemVfdCBuZXdfbWVtX3N0YXJ0ID0gb2xkX3N0YXJ0IC0gb2xkX2Jhc2U7Ci0gICAgY29uc3Qgc2l6ZV90IGN1cnJlbnRfc2l6ZSA9IE1lbURhdGFTaXplKG1lbSkgKyBuZXdfbWVtX3N0YXJ0OwotICAgIGNvbnN0IHVpbnQ2NF90IG5ld19zaXplID0gKHVpbnQ2NF90KWN1cnJlbnRfc2l6ZSArIGRhdGFfc2l6ZTsKLSAgICBjb25zdCB1aW50NjRfdCBleHRyYV9zaXplID0gKG5ld19zaXplICsgQ0hVTktfU0laRSAtIDEpICYgfihDSFVOS19TSVpFIC0gMSk7Ci0gICAgdWludDhfdCogY29uc3QgbmV3X2J1ZiA9Ci0gICAgICAgICh1aW50OF90KilXZWJQU2FmZU1hbGxvYyhleHRyYV9zaXplLCBzaXplb2YoKm5ld19idWYpKTsKLSAgICBpZiAobmV3X2J1ZiA9PSBOVUxMKSByZXR1cm4gMDsKLSAgICBTYk1lbW9yeUNvcHkobmV3X2J1Ziwgb2xkX2Jhc2UsIGN1cnJlbnRfc2l6ZSk7Ci0gICAgU2JNZW1vcnlEZWFsbG9jYXRlKG1lbS0+YnVmXyk7Ci0gICAgbWVtLT5idWZfID0gbmV3X2J1ZjsKLSAgICBtZW0tPmJ1Zl9zaXplXyA9IChzaXplX3QpZXh0cmFfc2l6ZTsKLSAgICBtZW0tPnN0YXJ0XyA9IG5ld19tZW1fc3RhcnQ7Ci0gICAgbWVtLT5lbmRfID0gY3VycmVudF9zaXplOwotICB9Ci0KLSAgU2JNZW1vcnlDb3B5KG1lbS0+YnVmXyArIG1lbS0+ZW5kXywgZGF0YSwgZGF0YV9zaXplKTsKLSAgbWVtLT5lbmRfICs9IGRhdGFfc2l6ZTsKLSAgU0JfRENIRUNLKG1lbS0+ZW5kXyA8PSBtZW0tPmJ1Zl9zaXplXyk7Ci0KLSAgRG9SZW1hcChpZGVjLCBtZW0tPmJ1Zl8gKyBtZW0tPnN0YXJ0XyAtIG9sZF9zdGFydCk7Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IFJlbWFwTWVtQnVmZmVyKFdlYlBJRGVjb2RlciogY29uc3QgaWRlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSkgewotICBNZW1CdWZmZXIqIGNvbnN0IG1lbSA9ICZpZGVjLT5tZW1fOwotICBjb25zdCB1aW50OF90KiBjb25zdCBvbGRfYnVmID0gbWVtLT5idWZfOwotICBjb25zdCB1aW50OF90KiBjb25zdCBvbGRfc3RhcnQgPSBvbGRfYnVmICsgbWVtLT5zdGFydF87Ci0gIFNCX0RDSEVDSyhtZW0tPm1vZGVfID09IE1FTV9NT0RFX01BUCk7Ci0KLSAgaWYgKGRhdGFfc2l6ZSA8IG1lbS0+YnVmX3NpemVfKSByZXR1cm4gMDsgIC8vIGNhbid0IHJlbWFwIHRvIGEgc2hvcnRlciBidWZmZXIhCi0KLSAgbWVtLT5idWZfID0gKHVpbnQ4X3QqKWRhdGE7Ci0gIG1lbS0+ZW5kXyA9IG1lbS0+YnVmX3NpemVfID0gZGF0YV9zaXplOwotCi0gIERvUmVtYXAoaWRlYywgbWVtLT5idWZfICsgbWVtLT5zdGFydF8gLSBvbGRfc3RhcnQpOwotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQgSW5pdE1lbUJ1ZmZlcihNZW1CdWZmZXIqIGNvbnN0IG1lbSkgewotICBtZW0tPm1vZGVfICAgICAgID0gTUVNX01PREVfTk9ORTsKLSAgbWVtLT5idWZfICAgICAgICA9IE5VTEw7Ci0gIG1lbS0+YnVmX3NpemVfICAgPSAwOwotICBtZW0tPnBhcnQwX2J1Zl8gID0gTlVMTDsKLSAgbWVtLT5wYXJ0MF9zaXplXyA9IDA7Ci19Ci0KLXN0YXRpYyB2b2lkIENsZWFyTWVtQnVmZmVyKE1lbUJ1ZmZlciogY29uc3QgbWVtKSB7Ci0gIFNCX0RDSEVDSyhtZW0pOwotICBpZiAobWVtLT5tb2RlXyA9PSBNRU1fTU9ERV9BUFBFTkQpIHsKLSAgICBTYk1lbW9yeURlYWxsb2NhdGUobWVtLT5idWZfKTsKLSAgICBTYk1lbW9yeURlYWxsb2NhdGUoKHZvaWQqKW1lbS0+cGFydDBfYnVmXyk7Ci0gIH0KLX0KLQotc3RhdGljIGludCBDaGVja01lbUJ1ZmZlck1vZGUoTWVtQnVmZmVyKiBjb25zdCBtZW0sIE1lbUJ1ZmZlck1vZGUgZXhwZWN0ZWQpIHsKLSAgaWYgKG1lbS0+bW9kZV8gPT0gTUVNX01PREVfTk9ORSkgewotICAgIG1lbS0+bW9kZV8gPSBleHBlY3RlZDsgICAgLy8gc3dpdGNoIHRvIHRoZSBleHBlY3RlZCBtb2RlCi0gIH0gZWxzZSBpZiAobWVtLT5tb2RlXyAhPSBleHBlY3RlZCkgewotICAgIHJldHVybiAwOyAgICAgICAgIC8vIHdlIG1peGVkIHRoZSBtb2RlcyA9PiBlcnJvcgotICB9Ci0gIFNCX0RDSEVDSyhtZW0tPm1vZGVfID09IGV4cGVjdGVkKTsgICAvLyBtb2RlIGlzIG9rCi0gIHJldHVybiAxOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTWFjcm9ibG9jay1kZWNvZGluZyBjb250ZXh0cwotCi1zdGF0aWMgdm9pZCBTYXZlQ29udGV4dChjb25zdCBWUDhEZWNvZGVyKiBkZWMsIGNvbnN0IFZQOEJpdFJlYWRlciogdG9rZW5fYnIsCi0gICAgICAgICAgICAgICAgICAgICAgICBNQkNvbnRleHQqIGNvbnN0IGNvbnRleHQpIHsKLSAgY29uc3QgVlA4Qml0UmVhZGVyKiBjb25zdCBiciA9ICZkZWMtPmJyXzsKLSAgY29uc3QgVlA4TUIqIGNvbnN0IGxlZnQgPSBkZWMtPm1iX2luZm9fIC0gMTsKLSAgY29uc3QgVlA4TUIqIGNvbnN0IGluZm8gPSBkZWMtPm1iX2luZm9fICsgZGVjLT5tYl94XzsKLQotICBjb250ZXh0LT5sZWZ0XyA9ICpsZWZ0OwotICBjb250ZXh0LT5pbmZvXyA9ICppbmZvOwotICBjb250ZXh0LT5icl8gPSAqYnI7Ci0gIGNvbnRleHQtPnRva2VuX2JyXyA9ICp0b2tlbl9icjsKLSAgU2JNZW1vcnlDb3B5KGNvbnRleHQtPmludHJhX3RfLCBkZWMtPmludHJhX3RfICsgNCAqIGRlYy0+bWJfeF8sIDQpOwotICBTYk1lbW9yeUNvcHkoY29udGV4dC0+aW50cmFfbF8sIGRlYy0+aW50cmFfbF8sIDQpOwotfQotCi1zdGF0aWMgdm9pZCBSZXN0b3JlQ29udGV4dChjb25zdCBNQkNvbnRleHQqIGNvbnRleHQsIFZQOERlY29kZXIqIGNvbnN0IGRlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEJpdFJlYWRlciogY29uc3QgdG9rZW5fYnIpIHsKLSAgVlA4Qml0UmVhZGVyKiBjb25zdCBiciA9ICZkZWMtPmJyXzsKLSAgVlA4TUIqIGNvbnN0IGxlZnQgPSBkZWMtPm1iX2luZm9fIC0gMTsKLSAgVlA4TUIqIGNvbnN0IGluZm8gPSBkZWMtPm1iX2luZm9fICsgZGVjLT5tYl94XzsKLQotICAqbGVmdCA9IGNvbnRleHQtPmxlZnRfOwotICAqaW5mbyA9IGNvbnRleHQtPmluZm9fOwotICAqYnIgPSBjb250ZXh0LT5icl87Ci0gICp0b2tlbl9iciA9IGNvbnRleHQtPnRva2VuX2JyXzsKLSAgU2JNZW1vcnlDb3B5KGRlYy0+aW50cmFfdF8gKyA0ICogZGVjLT5tYl94XywgY29udGV4dC0+aW50cmFfdF8sIDQpOwotICBTYk1lbW9yeUNvcHkoZGVjLT5pbnRyYV9sXywgY29udGV4dC0+aW50cmFfbF8sIDQpOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgVlA4U3RhdHVzQ29kZSBJRGVjRXJyb3IoV2ViUElEZWNvZGVyKiBjb25zdCBpZGVjLCBWUDhTdGF0dXNDb2RlIGVycm9yKSB7Ci0gIGlmIChpZGVjLT5zdGF0ZV8gPT0gU1RBVEVfVlA4X0RBVEEpIHsKLSAgICBWUDhJbyogY29uc3QgaW8gPSAmaWRlYy0+aW9fOwotICAgIGlmIChpby0+dGVhcmRvd24pIHsKLSAgICAgIGlvLT50ZWFyZG93bihpbyk7Ci0gICAgfQotICB9Ci0gIGlkZWMtPnN0YXRlXyA9IFNUQVRFX0VSUk9SOwotICByZXR1cm4gZXJyb3I7Ci19Ci0KLXN0YXRpYyB2b2lkIENoYW5nZVN0YXRlKFdlYlBJRGVjb2RlciogY29uc3QgaWRlYywgRGVjU3RhdGUgbmV3X3N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGNvbnN1bWVkX2J5dGVzKSB7Ci0gIE1lbUJ1ZmZlciogY29uc3QgbWVtID0gJmlkZWMtPm1lbV87Ci0gIGlkZWMtPnN0YXRlXyA9IG5ld19zdGF0ZTsKLSAgbWVtLT5zdGFydF8gKz0gY29uc3VtZWRfYnl0ZXM7Ci0gIFNCX0RDSEVDSyhtZW0tPnN0YXJ0XyA8PSBtZW0tPmVuZF8pOwotICBpZGVjLT5pb18uZGF0YSA9IG1lbS0+YnVmXyArIG1lbS0+c3RhcnRfOwotICBpZGVjLT5pb18uZGF0YV9zaXplID0gTWVtRGF0YVNpemUobWVtKTsKLX0KLQotLy8gSGVhZGVycwotc3RhdGljIFZQOFN0YXR1c0NvZGUgRGVjb2RlV2ViUEhlYWRlcnMoV2ViUElEZWNvZGVyKiBjb25zdCBpZGVjKSB7Ci0gIE1lbUJ1ZmZlciogY29uc3QgbWVtID0gJmlkZWMtPm1lbV87Ci0gIGNvbnN0IHVpbnQ4X3QqIGRhdGEgPSBtZW0tPmJ1Zl8gKyBtZW0tPnN0YXJ0XzsKLSAgc2l6ZV90IGN1cnJfc2l6ZSA9IE1lbURhdGFTaXplKG1lbSk7Ci0gIFZQOFN0YXR1c0NvZGUgc3RhdHVzOwotICBXZWJQSGVhZGVyU3RydWN0dXJlIGhlYWRlcnM7Ci0KLSAgaGVhZGVycy5kYXRhID0gZGF0YTsKLSAgaGVhZGVycy5kYXRhX3NpemUgPSBjdXJyX3NpemU7Ci0gIHN0YXR1cyA9IFdlYlBQYXJzZUhlYWRlcnMoJmhlYWRlcnMpOwotICBpZiAoc3RhdHVzID09IFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBKSB7Ci0gICAgcmV0dXJuIFZQOF9TVEFUVVNfU1VTUEVOREVEOyAgLy8gV2UgaGF2ZW4ndCBmb3VuZCBhIFZQOCBjaHVuayB5ZXQuCi0gIH0gZWxzZSBpZiAoc3RhdHVzICE9IFZQOF9TVEFUVVNfT0spIHsKLSAgICByZXR1cm4gSURlY0Vycm9yKGlkZWMsIHN0YXR1cyk7Ci0gIH0KLQotICBpZGVjLT5jaHVua19zaXplXyA9IGhlYWRlcnMuY29tcHJlc3NlZF9zaXplOwotICBpZGVjLT5pc19sb3NzbGVzc18gPSBoZWFkZXJzLmlzX2xvc3NsZXNzOwotICBpZiAoIWlkZWMtPmlzX2xvc3NsZXNzXykgewotICAgIFZQOERlY29kZXIqIGNvbnN0IGRlYyA9IFZQOE5ldygpOwotICAgIGlmIChkZWMgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfT1VUX09GX01FTU9SWTsKLSAgICB9Ci0gICAgaWRlYy0+ZGVjXyA9IGRlYzsKLSNpZmRlZiBXRUJQX1VTRV9USFJFQUQKLSAgICBkZWMtPnVzZV90aHJlYWRzXyA9IChpZGVjLT5wYXJhbXNfLm9wdGlvbnMgIT0gTlVMTCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIChpZGVjLT5wYXJhbXNfLm9wdGlvbnMtPnVzZV90aHJlYWRzID4gMCk7Ci0jZWxzZQotICAgIGRlYy0+dXNlX3RocmVhZHNfID0gMDsKLSNlbmRpZgotICAgIGRlYy0+YWxwaGFfZGF0YV8gPSBoZWFkZXJzLmFscGhhX2RhdGE7Ci0gICAgZGVjLT5hbHBoYV9kYXRhX3NpemVfID0gaGVhZGVycy5hbHBoYV9kYXRhX3NpemU7Ci0gICAgQ2hhbmdlU3RhdGUoaWRlYywgU1RBVEVfVlA4X0ZSQU1FX0hFQURFUiwgaGVhZGVycy5vZmZzZXQpOwotICB9IGVsc2UgewotICAgIFZQOExEZWNvZGVyKiBjb25zdCBkZWMgPSBWUDhMTmV3KCk7Ci0gICAgaWYgKGRlYyA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gVlA4X1NUQVRVU19PVVRfT0ZfTUVNT1JZOwotICAgIH0KLSAgICBpZGVjLT5kZWNfID0gZGVjOwotICAgIENoYW5nZVN0YXRlKGlkZWMsIFNUQVRFX1ZQOExfSEVBREVSLCBoZWFkZXJzLm9mZnNldCk7Ci0gIH0KLSAgcmV0dXJuIFZQOF9TVEFUVVNfT0s7Ci19Ci0KLXN0YXRpYyBWUDhTdGF0dXNDb2RlIERlY29kZVZQOEZyYW1lSGVhZGVyKFdlYlBJRGVjb2RlciogY29uc3QgaWRlYykgewotICBjb25zdCB1aW50OF90KiBkYXRhID0gaWRlYy0+bWVtXy5idWZfICsgaWRlYy0+bWVtXy5zdGFydF87Ci0gIGNvbnN0IHNpemVfdCBjdXJyX3NpemUgPSBNZW1EYXRhU2l6ZSgmaWRlYy0+bWVtXyk7Ci0gIHVpbnQzMl90IGJpdHM7Ci0KLSAgaWYgKGN1cnJfc2l6ZSA8IFZQOF9GUkFNRV9IRUFERVJfU0laRSkgewotICAgIC8vIE5vdCBlbm91Z2ggZGF0YSBieXRlcyB0byBleHRyYWN0IFZQOCBGcmFtZSBIZWFkZXIuCi0gICAgcmV0dXJuIFZQOF9TVEFUVVNfU1VTUEVOREVEOwotICB9Ci0gIGlmICghVlA4R2V0SW5mbyhkYXRhLCBjdXJyX3NpemUsIGlkZWMtPmNodW5rX3NpemVfLCBOVUxMLCBOVUxMKSkgewotICAgIHJldHVybiBJRGVjRXJyb3IoaWRlYywgVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1IpOwotICB9Ci0KLSAgYml0cyA9IGRhdGFbMF0gfCAoZGF0YVsxXSA8PCA4KSB8IChkYXRhWzJdIDw8IDE2KTsKLSAgaWRlYy0+bWVtXy5wYXJ0MF9zaXplXyA9IChiaXRzID4+IDUpICsgVlA4X0ZSQU1FX0hFQURFUl9TSVpFOwotCi0gIGlkZWMtPmlvXy5kYXRhID0gZGF0YTsKLSAgaWRlYy0+aW9fLmRhdGFfc2l6ZSA9IGN1cnJfc2l6ZTsKLSAgaWRlYy0+c3RhdGVfID0gU1RBVEVfVlA4X1BBUlRTMDsKLSAgcmV0dXJuIFZQOF9TVEFUVVNfT0s7Ci19Ci0KLS8vIFBhcnRpdGlvbiAjMAotc3RhdGljIFZQOFN0YXR1c0NvZGUgQ29weVBhcnRzMERhdGEoV2ViUElEZWNvZGVyKiBjb25zdCBpZGVjKSB7Ci0gIFZQOERlY29kZXIqIGNvbnN0IGRlYyA9IChWUDhEZWNvZGVyKilpZGVjLT5kZWNfOwotICBWUDhCaXRSZWFkZXIqIGNvbnN0IGJyID0gJmRlYy0+YnJfOwotICBjb25zdCBzaXplX3QgcGFydF9zaXplID0gYnItPmJ1Zl9lbmRfIC0gYnItPmJ1Zl87Ci0gIE1lbUJ1ZmZlciogY29uc3QgbWVtID0gJmlkZWMtPm1lbV87Ci0gIFNCX0RDSEVDSyghaWRlYy0+aXNfbG9zc2xlc3NfKTsKLSAgU0JfRENIRUNLKG1lbS0+cGFydDBfYnVmXyA9PSBOVUxMKTsKLSAgLy8gdGhlIGZvbGxvd2luZyBpcyBhIGZvcm1hdCBsaW1pdGF0aW9uLCBubyBuZWVkIGZvciBydW50aW1lIGNoZWNrOgotICBTQl9EQ0hFQ0socGFydF9zaXplIDw9IG1lbS0+cGFydDBfc2l6ZV8pOwotICBpZiAocGFydF9zaXplID09IDApIHsgICAvLyBjYW4ndCBoYXZlIHplcm8tc2l6ZSBwYXJ0aXRpb24gIzAKLSAgICByZXR1cm4gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7Ci0gIH0KLSAgaWYgKG1lbS0+bW9kZV8gPT0gTUVNX01PREVfQVBQRU5EKSB7Ci0gICAgLy8gV2UgY29weSBhbmQgZ3JhYiBvd25lcnNoaXAgb2YgdGhlIHBhcnRpdGlvbiAjMCBkYXRhLgotICAgIHVpbnQ4X3QqIGNvbnN0IHBhcnQwX2J1ZiA9ICh1aW50OF90KilTYk1lbW9yeUFsbG9jYXRlKHBhcnRfc2l6ZSk7Ci0gICAgaWYgKHBhcnQwX2J1ZiA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gVlA4X1NUQVRVU19PVVRfT0ZfTUVNT1JZOwotICAgIH0KLSAgICBTYk1lbW9yeUNvcHkocGFydDBfYnVmLCBici0+YnVmXywgcGFydF9zaXplKTsKLSAgICBtZW0tPnBhcnQwX2J1Zl8gPSBwYXJ0MF9idWY7Ci0gICAgYnItPmJ1Zl8gPSBwYXJ0MF9idWY7Ci0gICAgYnItPmJ1Zl9lbmRfID0gcGFydDBfYnVmICsgcGFydF9zaXplOwotICB9IGVsc2UgewotICAgIC8vIEVsc2U6IGp1c3Qga2VlcCBwb2ludGVycyB0byB0aGUgcGFydGl0aW9uICMwJ3MgZGF0YSBpbiBkZWNfLT5icl8uCi0gIH0KLSAgbWVtLT5zdGFydF8gKz0gcGFydF9zaXplOwotICByZXR1cm4gVlA4X1NUQVRVU19PSzsKLX0KLQotc3RhdGljIFZQOFN0YXR1c0NvZGUgRGVjb2RlUGFydGl0aW9uMChXZWJQSURlY29kZXIqIGNvbnN0IGlkZWMpIHsKLSAgVlA4RGVjb2RlciogY29uc3QgZGVjID0gKFZQOERlY29kZXIqKWlkZWMtPmRlY187Ci0gIFZQOElvKiBjb25zdCBpbyA9ICZpZGVjLT5pb187Ci0gIGNvbnN0IFdlYlBEZWNQYXJhbXMqIGNvbnN0IHBhcmFtcyA9ICZpZGVjLT5wYXJhbXNfOwotICBXZWJQRGVjQnVmZmVyKiBjb25zdCBvdXRwdXQgPSBwYXJhbXMtPm91dHB1dDsKLQotICAvLyBXYWl0IHRpbGwgd2UgaGF2ZSBlbm91Z2ggZGF0YSBmb3IgdGhlIHdob2xlIHBhcnRpdGlvbiAjMAotICBpZiAoTWVtRGF0YVNpemUoJmlkZWMtPm1lbV8pIDwgaWRlYy0+bWVtXy5wYXJ0MF9zaXplXykgewotICAgIHJldHVybiBWUDhfU1RBVFVTX1NVU1BFTkRFRDsKLSAgfQotCi0gIGlmICghVlA4R2V0SGVhZGVycyhkZWMsIGlvKSkgewotICAgIGNvbnN0IFZQOFN0YXR1c0NvZGUgc3RhdHVzID0gZGVjLT5zdGF0dXNfOwotICAgIGlmIChzdGF0dXMgPT0gVlA4X1NUQVRVU19TVVNQRU5ERUQgfHwKLSAgICAgICAgc3RhdHVzID09IFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBKSB7Ci0gICAgICAvLyB0cmVhdGluZyBOT1RfRU5PVUdIX0RBVEEgYXMgU1VTUEVOREVEIHN0YXRlCi0gICAgICByZXR1cm4gVlA4X1NUQVRVU19TVVNQRU5ERUQ7Ci0gICAgfQotICAgIHJldHVybiBJRGVjRXJyb3IoaWRlYywgc3RhdHVzKTsKLSAgfQotCi0gIC8vIEFsbG9jYXRlL1ZlcmlmeSBvdXRwdXQgYnVmZmVyIG5vdwotICBkZWMtPnN0YXR1c18gPSBXZWJQQWxsb2NhdGVEZWNCdWZmZXIoaW8tPndpZHRoLCBpby0+aGVpZ2h0LCBwYXJhbXMtPm9wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQpOwotICBpZiAoZGVjLT5zdGF0dXNfICE9IFZQOF9TVEFUVVNfT0spIHsKLSAgICByZXR1cm4gSURlY0Vycm9yKGlkZWMsIGRlYy0+c3RhdHVzXyk7Ci0gIH0KLQotICBkZWMtPnN0YXR1c18gPSBDb3B5UGFydHMwRGF0YShpZGVjKTsKLSAgaWYgKGRlYy0+c3RhdHVzXyAhPSBWUDhfU1RBVFVTX09LKSB7Ci0gICAgcmV0dXJuIElEZWNFcnJvcihpZGVjLCBkZWMtPnN0YXR1c18pOwotICB9Ci0KLSAgLy8gRmluaXNoIHNldHRpbmcgdXAgdGhlIGRlY29kaW5nIHBhcmFtZXRlcnMuIFdpbGwgY2FsbCBpby0+c2V0dXAoKS4KLSAgaWYgKFZQOEVudGVyQ3JpdGljYWwoZGVjLCBpbykgIT0gVlA4X1NUQVRVU19PSykgewotICAgIHJldHVybiBJRGVjRXJyb3IoaWRlYywgZGVjLT5zdGF0dXNfKTsKLSAgfQotCi0gIC8vIE5vdGU6IHBhc3QgdGhpcyBwb2ludCwgdGVhcmRvd24oKSBtdXN0IGFsd2F5cyBiZSBjYWxsZWQKLSAgLy8gaW4gY2FzZSBvZiBlcnJvci4KLSAgaWRlYy0+c3RhdGVfID0gU1RBVEVfVlA4X0RBVEE7Ci0gIC8vIEFsbG9jYXRlIG1lbW9yeSBhbmQgcHJlcGFyZSBldmVyeXRoaW5nLgotICBpZiAoIVZQOEluaXRGcmFtZShkZWMsIGlvKSkgewotICAgIHJldHVybiBJRGVjRXJyb3IoaWRlYywgZGVjLT5zdGF0dXNfKTsKLSAgfQotICByZXR1cm4gVlA4X1NUQVRVU19PSzsKLX0KLQotLy8gUmVtYWluaW5nIHBhcnRpdGlvbnMKLXN0YXRpYyBWUDhTdGF0dXNDb2RlIERlY29kZVJlbWFpbmluZyhXZWJQSURlY29kZXIqIGNvbnN0IGlkZWMpIHsKLSAgVlA4RGVjb2RlciogY29uc3QgZGVjID0gKFZQOERlY29kZXIqKWlkZWMtPmRlY187Ci0gIFZQOElvKiBjb25zdCBpbyA9ICZpZGVjLT5pb187Ci0KLSAgU0JfRENIRUNLKGRlYy0+cmVhZHlfKTsKLQotICBmb3IgKDsgZGVjLT5tYl95XyA8IGRlYy0+bWJfaF87ICsrZGVjLT5tYl95XykgewotICAgIFZQOEJpdFJlYWRlciogdG9rZW5fYnIgPSAmZGVjLT5wYXJ0c19bZGVjLT5tYl95XyAmIChkZWMtPm51bV9wYXJ0c18gLSAxKV07Ci0gICAgaWYgKGRlYy0+bWJfeF8gPT0gMCkgewotICAgICAgVlA4SW5pdFNjYW5saW5lKGRlYyk7Ci0gICAgfQotICAgIGZvciAoOyBkZWMtPm1iX3hfIDwgZGVjLT5tYl93XzsgIGRlYy0+bWJfeF8rKykgewotICAgICAgTUJDb250ZXh0IGNvbnRleHQ7Ci0gICAgICBTYXZlQ29udGV4dChkZWMsIHRva2VuX2JyLCAmY29udGV4dCk7Ci0KLSAgICAgIGlmICghVlA4RGVjb2RlTUIoZGVjLCB0b2tlbl9icikpIHsKLSAgICAgICAgUmVzdG9yZUNvbnRleHQoJmNvbnRleHQsIGRlYywgdG9rZW5fYnIpOwotICAgICAgICAvLyBXZSBzaG91bGRuJ3QgZmFpbCB3aGVuIE1BWF9NQiBkYXRhIHdhcyBhdmFpbGFibGUKLSAgICAgICAgaWYgKGRlYy0+bnVtX3BhcnRzXyA9PSAxICYmIE1lbURhdGFTaXplKCZpZGVjLT5tZW1fKSA+IE1BWF9NQl9TSVpFKSB7Ci0gICAgICAgICAgcmV0dXJuIElEZWNFcnJvcihpZGVjLCBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfU1VTUEVOREVEOwotICAgICAgfQotICAgICAgLy8gUmVjb25zdHJ1Y3QgYW5kIGVtaXQgc2FtcGxlcy4KLSAgICAgIFZQOFJlY29uc3RydWN0QmxvY2soZGVjKTsKLQotICAgICAgLy8gUmVsZWFzZSBidWZmZXIgb25seSBpZiB0aGVyZSBpcyBvbmx5IG9uZSBwYXJ0aXRpb24KLSAgICAgIGlmIChkZWMtPm51bV9wYXJ0c18gPT0gMSkgewotICAgICAgICBpZGVjLT5tZW1fLnN0YXJ0XyA9IHRva2VuX2JyLT5idWZfIC0gaWRlYy0+bWVtXy5idWZfOwotICAgICAgICBTQl9EQ0hFQ0soaWRlYy0+bWVtXy5zdGFydF8gPD0gaWRlYy0+bWVtXy5lbmRfKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCFWUDhQcm9jZXNzUm93KGRlYywgaW8pKSB7Ci0gICAgICByZXR1cm4gSURlY0Vycm9yKGlkZWMsIFZQOF9TVEFUVVNfVVNFUl9BQk9SVCk7Ci0gICAgfQotICAgIGRlYy0+bWJfeF8gPSAwOwotICB9Ci0gIC8vIFN5bmNocm9uaXplIHRoZSB0aHJlYWQgYW5kIGNoZWNrIGZvciBlcnJvcnMuCi0gIGlmICghVlA4RXhpdENyaXRpY2FsKGRlYywgaW8pKSB7Ci0gICAgcmV0dXJuIElEZWNFcnJvcihpZGVjLCBWUDhfU1RBVFVTX1VTRVJfQUJPUlQpOwotICB9Ci0gIGRlYy0+cmVhZHlfID0gMDsKLSAgaWRlYy0+c3RhdGVfID0gU1RBVEVfRE9ORTsKLQotICByZXR1cm4gVlA4X1NUQVRVU19PSzsKLX0KLQotc3RhdGljIGludCBFcnJvclN0YXR1c0xvc3NsZXNzKFdlYlBJRGVjb2RlciogY29uc3QgaWRlYywgVlA4U3RhdHVzQ29kZSBzdGF0dXMpIHsKLSAgaWYgKHN0YXR1cyA9PSBWUDhfU1RBVFVTX1NVU1BFTkRFRCB8fCBzdGF0dXMgPT0gVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEEpIHsKLSAgICByZXR1cm4gVlA4X1NUQVRVU19TVVNQRU5ERUQ7Ci0gIH0KLSAgcmV0dXJuIElEZWNFcnJvcihpZGVjLCBzdGF0dXMpOwotfQotCi1zdGF0aWMgVlA4U3RhdHVzQ29kZSBEZWNvZGVWUDhMSGVhZGVyKFdlYlBJRGVjb2RlciogY29uc3QgaWRlYykgewotICBWUDhJbyogY29uc3QgaW8gPSAmaWRlYy0+aW9fOwotICBWUDhMRGVjb2RlciogY29uc3QgZGVjID0gKFZQOExEZWNvZGVyKilpZGVjLT5kZWNfOwotICBjb25zdCBXZWJQRGVjUGFyYW1zKiBjb25zdCBwYXJhbXMgPSAmaWRlYy0+cGFyYW1zXzsKLSAgV2ViUERlY0J1ZmZlciogY29uc3Qgb3V0cHV0ID0gcGFyYW1zLT5vdXRwdXQ7Ci0gIHNpemVfdCBjdXJyX3NpemUgPSBNZW1EYXRhU2l6ZSgmaWRlYy0+bWVtXyk7Ci0gIFNCX0RDSEVDSyhpZGVjLT5pc19sb3NzbGVzc18pOwotCi0gIC8vIFdhaXQgdW50aWwgdGhlcmUncyBlbm91Z2ggZGF0YSBmb3IgZGVjb2RpbmcgaGVhZGVyLgotICBpZiAoY3Vycl9zaXplIDwgKGlkZWMtPmNodW5rX3NpemVfID4+IDMpKSB7Ci0gICAgcmV0dXJuIFZQOF9TVEFUVVNfU1VTUEVOREVEOwotICB9Ci0gIGlmICghVlA4TERlY29kZUhlYWRlcihkZWMsIGlvKSkgewotICAgIHJldHVybiBFcnJvclN0YXR1c0xvc3NsZXNzKGlkZWMsIGRlYy0+c3RhdHVzXyk7Ci0gIH0KLSAgLy8gQWxsb2NhdGUvdmVyaWZ5IG91dHB1dCBidWZmZXIgbm93LgotICBkZWMtPnN0YXR1c18gPSBXZWJQQWxsb2NhdGVEZWNCdWZmZXIoaW8tPndpZHRoLCBpby0+aGVpZ2h0LCBwYXJhbXMtPm9wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQpOwotICBpZiAoZGVjLT5zdGF0dXNfICE9IFZQOF9TVEFUVVNfT0spIHsKLSAgICByZXR1cm4gSURlY0Vycm9yKGlkZWMsIGRlYy0+c3RhdHVzXyk7Ci0gIH0KLQotICBpZGVjLT5zdGF0ZV8gPSBTVEFURV9WUDhMX0RBVEE7Ci0gIHJldHVybiBWUDhfU1RBVFVTX09LOwotfQotCi1zdGF0aWMgVlA4U3RhdHVzQ29kZSBEZWNvZGVWUDhMRGF0YShXZWJQSURlY29kZXIqIGNvbnN0IGlkZWMpIHsKLSAgVlA4TERlY29kZXIqIGNvbnN0IGRlYyA9IChWUDhMRGVjb2RlciopaWRlYy0+ZGVjXzsKLSAgY29uc3Qgc2l6ZV90IGN1cnJfc2l6ZSA9IE1lbURhdGFTaXplKCZpZGVjLT5tZW1fKTsKLSAgU0JfRENIRUNLKGlkZWMtPmlzX2xvc3NsZXNzXyk7Ci0KLSAgLy8gQXQgcHJlc2VudCBMb3NzbGVzcyBkZWNvZGVyIGNhbid0IGRlY29kZSBpbWFnZSBpbmNyZW1lbnRhbGx5LiBTbyB3YWl0IHRpbGwKLSAgLy8gYWxsIHRoZSBpbWFnZSBkYXRhIGlzIGFnZ3JlZ2F0ZWQgYmVmb3JlIGltYWdlIGNhbiBiZSBkZWNvZGVkLgotICBpZiAoY3Vycl9zaXplIDwgaWRlYy0+Y2h1bmtfc2l6ZV8pIHsKLSAgICByZXR1cm4gVlA4X1NUQVRVU19TVVNQRU5ERUQ7Ci0gIH0KLQotICBpZiAoIVZQOExEZWNvZGVJbWFnZShkZWMpKSB7Ci0gICAgcmV0dXJuIEVycm9yU3RhdHVzTG9zc2xlc3MoaWRlYywgZGVjLT5zdGF0dXNfKTsKLSAgfQotCi0gIGlkZWMtPnN0YXRlXyA9IFNUQVRFX0RPTkU7Ci0KLSAgcmV0dXJuIFZQOF9TVEFUVVNfT0s7Ci19Ci0KLSAgLy8gTWFpbiBkZWNvZGluZyBsb29wCi1zdGF0aWMgVlA4U3RhdHVzQ29kZSBJRGVjb2RlKFdlYlBJRGVjb2RlciogaWRlYykgewotICBWUDhTdGF0dXNDb2RlIHN0YXR1cyA9IFZQOF9TVEFUVVNfU1VTUEVOREVEOwotCi0gIGlmIChpZGVjLT5zdGF0ZV8gPT0gU1RBVEVfUFJFX1ZQOCkgewotICAgIHN0YXR1cyA9IERlY29kZVdlYlBIZWFkZXJzKGlkZWMpOwotICB9IGVsc2UgewotICAgIGlmIChpZGVjLT5kZWNfID09IE5VTEwpIHsKLSAgICAgIHJldHVybiBWUDhfU1RBVFVTX1NVU1BFTkRFRDsgICAgLy8gY2FuJ3QgY29udGludWUgaWYgd2UgaGF2ZSBubyBkZWNvZGVyLgotICAgIH0KLSAgfQotICBpZiAoaWRlYy0+c3RhdGVfID09IFNUQVRFX1ZQOF9GUkFNRV9IRUFERVIpIHsKLSAgICBzdGF0dXMgPSBEZWNvZGVWUDhGcmFtZUhlYWRlcihpZGVjKTsKLSAgfQotICBpZiAoaWRlYy0+c3RhdGVfID09IFNUQVRFX1ZQOF9QQVJUUzApIHsKLSAgICBzdGF0dXMgPSBEZWNvZGVQYXJ0aXRpb24wKGlkZWMpOwotICB9Ci0gIGlmIChpZGVjLT5zdGF0ZV8gPT0gU1RBVEVfVlA4X0RBVEEpIHsKLSAgICBzdGF0dXMgPSBEZWNvZGVSZW1haW5pbmcoaWRlYyk7Ci0gIH0KLSAgaWYgKGlkZWMtPnN0YXRlXyA9PSBTVEFURV9WUDhMX0hFQURFUikgewotICAgIHN0YXR1cyA9IERlY29kZVZQOExIZWFkZXIoaWRlYyk7Ci0gIH0KLSAgaWYgKGlkZWMtPnN0YXRlXyA9PSBTVEFURV9WUDhMX0RBVEEpIHsKLSAgICBzdGF0dXMgPSBEZWNvZGVWUDhMRGF0YShpZGVjKTsKLSAgfQotICByZXR1cm4gc3RhdHVzOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gUHVibGljIGZ1bmN0aW9ucwotCi1XZWJQSURlY29kZXIqIFdlYlBJTmV3RGVjb2RlcihXZWJQRGVjQnVmZmVyKiBvdXRwdXRfYnVmZmVyKSB7Ci0gIFdlYlBJRGVjb2RlciogaWRlYyA9IChXZWJQSURlY29kZXIqKVNiTWVtb3J5Q2FsbG9jKDEsIHNpemVvZigqaWRlYykpOwotICBpZiAoaWRlYyA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBpZGVjLT5zdGF0ZV8gPSBTVEFURV9QUkVfVlA4OwotICBpZGVjLT5jaHVua19zaXplXyA9IDA7Ci0KLSAgSW5pdE1lbUJ1ZmZlcigmaWRlYy0+bWVtXyk7Ci0gIFdlYlBJbml0RGVjQnVmZmVyKCZpZGVjLT5vdXRwdXRfKTsKLSAgVlA4SW5pdElvKCZpZGVjLT5pb18pOwotCi0gIFdlYlBSZXNldERlY1BhcmFtcygmaWRlYy0+cGFyYW1zXyk7Ci0gIGlkZWMtPnBhcmFtc18ub3V0cHV0ID0gb3V0cHV0X2J1ZmZlciA/IG91dHB1dF9idWZmZXIgOiAmaWRlYy0+b3V0cHV0XzsKLSAgV2ViUEluaXRDdXN0b21JbygmaWRlYy0+cGFyYW1zXywgJmlkZWMtPmlvXyk7ICAvLyBQbHVnIHRoZSBJL08gZnVuY3Rpb25zLgotCi0gIHJldHVybiBpZGVjOwotfQotCi1XZWJQSURlY29kZXIqIFdlYlBJRGVjb2RlKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBEZWNvZGVyQ29uZmlnKiBjb25maWcpIHsKLSAgV2ViUElEZWNvZGVyKiBpZGVjOwotCi0gIC8vIFBhcnNlIHRoZSBiaXRzdHJlYW0ncyBmZWF0dXJlcywgaWYgcmVxdWVzdGVkOgotICBpZiAoZGF0YSAhPSBOVUxMICYmIGRhdGFfc2l6ZSA+IDAgJiYgY29uZmlnICE9IE5VTEwpIHsKLSAgICBpZiAoV2ViUEdldEZlYXR1cmVzKGRhdGEsIGRhdGFfc2l6ZSwgJmNvbmZpZy0+aW5wdXQpICE9IFZQOF9TVEFUVVNfT0spIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgfQotICAvLyBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIGluY3JlbWVudGFsIGRlY29kZXIKLSAgaWRlYyA9IFdlYlBJTmV3RGVjb2Rlcihjb25maWcgPyAmY29uZmlnLT5vdXRwdXQgOiBOVUxMKTsKLSAgaWYgKGlkZWMgPT0gTlVMTCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIC8vIEZpbmlzaCBpbml0aWFsaXphdGlvbgotICBpZiAoY29uZmlnICE9IE5VTEwpIHsKLSAgICBpZGVjLT5wYXJhbXNfLm9wdGlvbnMgPSAmY29uZmlnLT5vcHRpb25zOwotICB9Ci0gIHJldHVybiBpZGVjOwotfQotCi12b2lkIFdlYlBJRGVsZXRlKFdlYlBJRGVjb2RlciogaWRlYykgewotICBpZiAoaWRlYyA9PSBOVUxMKSByZXR1cm47Ci0gIGlmIChpZGVjLT5kZWNfICE9IE5VTEwpIHsKLSAgICBpZiAoIWlkZWMtPmlzX2xvc3NsZXNzXykgewotICAgICAgVlA4RGVsZXRlKGlkZWMtPmRlY18pOwotICAgIH0gZWxzZSB7Ci0gICAgICBWUDhMRGVsZXRlKGlkZWMtPmRlY18pOwotICAgIH0KLSAgfQotICBDbGVhck1lbUJ1ZmZlcigmaWRlYy0+bWVtXyk7Ci0gIFdlYlBGcmVlRGVjQnVmZmVyKCZpZGVjLT5vdXRwdXRfKTsKLSAgU2JNZW1vcnlEZWFsbG9jYXRlKGlkZWMpOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gV3JhcHBlciB0b3dhcmQgV2ViUElOZXdEZWNvZGVyCi0KLVdlYlBJRGVjb2RlciogV2ViUElOZXdSR0IoV0VCUF9DU1BfTU9ERSBtb2RlLCB1aW50OF90KiBvdXRwdXRfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb3V0cHV0X2J1ZmZlcl9zaXplLCBpbnQgb3V0cHV0X3N0cmlkZSkgewotICBjb25zdCBpbnQgaXNfZXh0ZXJuYWxfbWVtb3J5ID0gKG91dHB1dF9idWZmZXIgIT0gTlVMTCk7Ci0gIFdlYlBJRGVjb2RlciogaWRlYzsKLQotICBpZiAobW9kZSA+PSBNT0RFX1lVVikgcmV0dXJuIE5VTEw7Ci0gIGlmICghaXNfZXh0ZXJuYWxfbWVtb3J5KSB7ICAgIC8vIE92ZXJ3cml0ZSBwYXJhbWV0ZXJzIHRvIHNhbmUgdmFsdWVzLgotICAgIG91dHB1dF9idWZmZXJfc2l6ZSA9IDA7Ci0gICAgb3V0cHV0X3N0cmlkZSA9IDA7Ci0gIH0gZWxzZSB7ICAvLyBBIGJ1ZmZlciB3YXMgcGFzc2VkLiBWYWxpZGF0ZSB0aGUgb3RoZXIgcGFyYW1zLgotICAgIGlmIChvdXRwdXRfc3RyaWRlID09IDAgfHwgb3V0cHV0X2J1ZmZlcl9zaXplID09IDApIHsKLSAgICAgIHJldHVybiBOVUxMOyAgIC8vIGludmFsaWQgcGFyYW1ldGVyLgotICAgIH0KLSAgfQotICBpZGVjID0gV2ViUElOZXdEZWNvZGVyKE5VTEwpOwotICBpZiAoaWRlYyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLSAgaWRlYy0+b3V0cHV0Xy5jb2xvcnNwYWNlID0gbW9kZTsKLSAgaWRlYy0+b3V0cHV0Xy5pc19leHRlcm5hbF9tZW1vcnkgPSBpc19leHRlcm5hbF9tZW1vcnk7Ci0gIGlkZWMtPm91dHB1dF8udS5SR0JBLnJnYmEgPSBvdXRwdXRfYnVmZmVyOwotICBpZGVjLT5vdXRwdXRfLnUuUkdCQS5zdHJpZGUgPSBvdXRwdXRfc3RyaWRlOwotICBpZGVjLT5vdXRwdXRfLnUuUkdCQS5zaXplID0gb3V0cHV0X2J1ZmZlcl9zaXplOwotICByZXR1cm4gaWRlYzsKLX0KLQotV2ViUElEZWNvZGVyKiBXZWJQSU5ld1lVVkEodWludDhfdCogbHVtYSwgc2l6ZV90IGx1bWFfc2l6ZSwgaW50IGx1bWFfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdSwgc2l6ZV90IHVfc2l6ZSwgaW50IHVfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdiwgc2l6ZV90IHZfc2l6ZSwgaW50IHZfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogYSwgc2l6ZV90IGFfc2l6ZSwgaW50IGFfc3RyaWRlKSB7Ci0gIGNvbnN0IGludCBpc19leHRlcm5hbF9tZW1vcnkgPSAobHVtYSAhPSBOVUxMKTsKLSAgV2ViUElEZWNvZGVyKiBpZGVjOwotICBXRUJQX0NTUF9NT0RFIGNvbG9yc3BhY2U7Ci0KLSAgaWYgKCFpc19leHRlcm5hbF9tZW1vcnkpIHsgICAgLy8gT3ZlcndyaXRlIHBhcmFtZXRlcnMgdG8gc2FuZSB2YWx1ZXMuCi0gICAgbHVtYV9zaXplID0gdV9zaXplID0gdl9zaXplID0gYV9zaXplID0gMDsKLSAgICBsdW1hX3N0cmlkZSA9IHVfc3RyaWRlID0gdl9zdHJpZGUgPSBhX3N0cmlkZSA9IDA7Ci0gICAgdSA9IHYgPSBhID0gTlVMTDsKLSAgICBjb2xvcnNwYWNlID0gTU9ERV9ZVVZBOwotICB9IGVsc2UgeyAgLy8gQSBsdW1hIGJ1ZmZlciB3YXMgcGFzc2VkLiBWYWxpZGF0ZSB0aGUgb3RoZXIgcGFyYW1ldGVycy4KLSAgICBpZiAodSA9PSBOVUxMIHx8IHYgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKGx1bWFfc2l6ZSA9PSAwIHx8IHVfc2l6ZSA9PSAwIHx8IHZfc2l6ZSA9PSAwKSByZXR1cm4gTlVMTDsKLSAgICBpZiAobHVtYV9zdHJpZGUgPT0gMCB8fCB1X3N0cmlkZSA9PSAwIHx8IHZfc3RyaWRlID09IDApIHJldHVybiBOVUxMOwotICAgIGlmIChhICE9IE5VTEwpIHsKLSAgICAgIGlmIChhX3NpemUgPT0gMCB8fCBhX3N0cmlkZSA9PSAwKSByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgY29sb3JzcGFjZSA9IChhID09IE5VTEwpID8gTU9ERV9ZVVYgOiBNT0RFX1lVVkE7Ci0gIH0KLQotICBpZGVjID0gV2ViUElOZXdEZWNvZGVyKE5VTEwpOwotICBpZiAoaWRlYyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotICBpZGVjLT5vdXRwdXRfLmNvbG9yc3BhY2UgPSBjb2xvcnNwYWNlOwotICBpZGVjLT5vdXRwdXRfLmlzX2V4dGVybmFsX21lbW9yeSA9IGlzX2V4dGVybmFsX21lbW9yeTsKLSAgaWRlYy0+b3V0cHV0Xy51LllVVkEueSA9IGx1bWE7Ci0gIGlkZWMtPm91dHB1dF8udS5ZVVZBLnlfc3RyaWRlID0gbHVtYV9zdHJpZGU7Ci0gIGlkZWMtPm91dHB1dF8udS5ZVVZBLnlfc2l6ZSA9IGx1bWFfc2l6ZTsKLSAgaWRlYy0+b3V0cHV0Xy51LllVVkEudSA9IHU7Ci0gIGlkZWMtPm91dHB1dF8udS5ZVVZBLnVfc3RyaWRlID0gdV9zdHJpZGU7Ci0gIGlkZWMtPm91dHB1dF8udS5ZVVZBLnVfc2l6ZSA9IHVfc2l6ZTsKLSAgaWRlYy0+b3V0cHV0Xy51LllVVkEudiA9IHY7Ci0gIGlkZWMtPm91dHB1dF8udS5ZVVZBLnZfc3RyaWRlID0gdl9zdHJpZGU7Ci0gIGlkZWMtPm91dHB1dF8udS5ZVVZBLnZfc2l6ZSA9IHZfc2l6ZTsKLSAgaWRlYy0+b3V0cHV0Xy51LllVVkEuYSA9IGE7Ci0gIGlkZWMtPm91dHB1dF8udS5ZVVZBLmFfc3RyaWRlID0gYV9zdHJpZGU7Ci0gIGlkZWMtPm91dHB1dF8udS5ZVVZBLmFfc2l6ZSA9IGFfc2l6ZTsKLSAgcmV0dXJuIGlkZWM7Ci19Ci0KLVdlYlBJRGVjb2RlciogV2ViUElOZXdZVVYodWludDhfdCogbHVtYSwgc2l6ZV90IGx1bWFfc2l6ZSwgaW50IGx1bWFfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB1LCBzaXplX3QgdV9zaXplLCBpbnQgdV9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHYsIHNpemVfdCB2X3NpemUsIGludCB2X3N0cmlkZSkgewotICByZXR1cm4gV2ViUElOZXdZVVZBKGx1bWEsIGx1bWFfc2l6ZSwgbHVtYV9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgdSwgdV9zaXplLCB1X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICB2LCB2X3NpemUsIHZfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIDApOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgVlA4U3RhdHVzQ29kZSBJRGVjQ2hlY2tTdGF0dXMoY29uc3QgV2ViUElEZWNvZGVyKiBjb25zdCBpZGVjKSB7Ci0gIFNCX0RDSEVDSyhpZGVjKTsKLSAgaWYgKGlkZWMtPnN0YXRlXyA9PSBTVEFURV9FUlJPUikgewotICAgIHJldHVybiBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUjsKLSAgfQotICBpZiAoaWRlYy0+c3RhdGVfID09IFNUQVRFX0RPTkUpIHsKLSAgICByZXR1cm4gVlA4X1NUQVRVU19PSzsKLSAgfQotICByZXR1cm4gVlA4X1NUQVRVU19TVVNQRU5ERUQ7Ci19Ci0KLVZQOFN0YXR1c0NvZGUgV2ViUElBcHBlbmQoV2ViUElEZWNvZGVyKiBpZGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplKSB7Ci0gIFZQOFN0YXR1c0NvZGUgc3RhdHVzOwotICBpZiAoaWRlYyA9PSBOVUxMIHx8IGRhdGEgPT0gTlVMTCkgewotICAgIHJldHVybiBWUDhfU1RBVFVTX0lOVkFMSURfUEFSQU07Ci0gIH0KLSAgc3RhdHVzID0gSURlY0NoZWNrU3RhdHVzKGlkZWMpOwotICBpZiAoc3RhdHVzICE9IFZQOF9TVEFUVVNfU1VTUEVOREVEKSB7Ci0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotICAvLyBDaGVjayBtaXhlZCBjYWxscyBiZXR3ZWVuIFJlbWFwTWVtQnVmZmVyIGFuZCBBcHBlbmRUb01lbUJ1ZmZlci4KLSAgaWYgKCFDaGVja01lbUJ1ZmZlck1vZGUoJmlkZWMtPm1lbV8sIE1FTV9NT0RFX0FQUEVORCkpIHsKLSAgICByZXR1cm4gVlA4X1NUQVRVU19JTlZBTElEX1BBUkFNOwotICB9Ci0gIC8vIEFwcGVuZCBkYXRhIHRvIG1lbW9yeSBidWZmZXIKLSAgaWYgKCFBcHBlbmRUb01lbUJ1ZmZlcihpZGVjLCBkYXRhLCBkYXRhX3NpemUpKSB7Ci0gICAgcmV0dXJuIFZQOF9TVEFUVVNfT1VUX09GX01FTU9SWTsKLSAgfQotICByZXR1cm4gSURlY29kZShpZGVjKTsKLX0KLQotVlA4U3RhdHVzQ29kZSBXZWJQSVVwZGF0ZShXZWJQSURlY29kZXIqIGlkZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUpIHsKLSAgVlA4U3RhdHVzQ29kZSBzdGF0dXM7Ci0gIGlmIChpZGVjID09IE5VTEwgfHwgZGF0YSA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIFZQOF9TVEFUVVNfSU5WQUxJRF9QQVJBTTsKLSAgfQotICBzdGF0dXMgPSBJRGVjQ2hlY2tTdGF0dXMoaWRlYyk7Ci0gIGlmIChzdGF0dXMgIT0gVlA4X1NUQVRVU19TVVNQRU5ERUQpIHsKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0gIC8vIENoZWNrIG1peGVkIGNhbGxzIGJldHdlZW4gUmVtYXBNZW1CdWZmZXIgYW5kIEFwcGVuZFRvTWVtQnVmZmVyLgotICBpZiAoIUNoZWNrTWVtQnVmZmVyTW9kZSgmaWRlYy0+bWVtXywgTUVNX01PREVfTUFQKSkgewotICAgIHJldHVybiBWUDhfU1RBVFVTX0lOVkFMSURfUEFSQU07Ci0gIH0KLSAgLy8gTWFrZSB0aGUgbWVtb3J5IGJ1ZmZlciBwb2ludCB0byB0aGUgbmV3IGJ1ZmZlcgotICBpZiAoIVJlbWFwTWVtQnVmZmVyKGlkZWMsIGRhdGEsIGRhdGFfc2l6ZSkpIHsKLSAgICByZXR1cm4gVlA4X1NUQVRVU19JTlZBTElEX1BBUkFNOwotICB9Ci0gIHJldHVybiBJRGVjb2RlKGlkZWMpOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgY29uc3QgV2ViUERlY0J1ZmZlciogR2V0T3V0cHV0QnVmZmVyKGNvbnN0IFdlYlBJRGVjb2RlciogY29uc3QgaWRlYykgewotICBpZiAoaWRlYyA9PSBOVUxMIHx8IGlkZWMtPmRlY18gPT0gTlVMTCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIGlmIChpZGVjLT5zdGF0ZV8gPD0gU1RBVEVfVlA4X1BBUlRTMCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIHJldHVybiBpZGVjLT5wYXJhbXNfLm91dHB1dDsKLX0KLQotY29uc3QgV2ViUERlY0J1ZmZlciogV2ViUElEZWNvZGVkQXJlYShjb25zdCBXZWJQSURlY29kZXIqIGlkZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogbGVmdCwgaW50KiB0b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsIGludCogaGVpZ2h0KSB7Ci0gIGNvbnN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IHNyYyA9IEdldE91dHB1dEJ1ZmZlcihpZGVjKTsKLSAgaWYgKGxlZnQgIT0gTlVMTCkgKmxlZnQgPSAwOwotICBpZiAodG9wICE9IE5VTEwpICp0b3AgPSAwOwotICAvLyBUT0RPKHNrYWwpOiBsYXRlciBpbmNsdWRlIGhhbmRsaW5nIG9mIHJvdGF0aW9ucy4KLSAgaWYgKHNyYykgewotICAgIGlmICh3aWR0aCAhPSBOVUxMKSAqd2lkdGggPSBzcmMtPndpZHRoOwotICAgIGlmIChoZWlnaHQgIT0gTlVMTCkgKmhlaWdodCA9IGlkZWMtPnBhcmFtc18ubGFzdF95OwotICB9IGVsc2UgewotICAgIGlmICh3aWR0aCAhPSBOVUxMKSAqd2lkdGggPSAwOwotICAgIGlmIChoZWlnaHQgIT0gTlVMTCkgKmhlaWdodCA9IDA7Ci0gIH0KLSAgcmV0dXJuIHNyYzsKLX0KLQotdWludDhfdCogV2ViUElEZWNHZXRSR0IoY29uc3QgV2ViUElEZWNvZGVyKiBpZGVjLCBpbnQqIGxhc3RfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsIGludCogaGVpZ2h0LCBpbnQqIHN0cmlkZSkgewotICBjb25zdCBXZWJQRGVjQnVmZmVyKiBjb25zdCBzcmMgPSBHZXRPdXRwdXRCdWZmZXIoaWRlYyk7Ci0gIGlmIChzcmMgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0gIGlmIChzcmMtPmNvbG9yc3BhY2UgPj0gTU9ERV9ZVVYpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGlmIChsYXN0X3kgIT0gTlVMTCkgKmxhc3RfeSA9IGlkZWMtPnBhcmFtc18ubGFzdF95OwotICBpZiAod2lkdGggIT0gTlVMTCkgKndpZHRoID0gc3JjLT53aWR0aDsKLSAgaWYgKGhlaWdodCAhPSBOVUxMKSAqaGVpZ2h0ID0gc3JjLT5oZWlnaHQ7Ci0gIGlmIChzdHJpZGUgIT0gTlVMTCkgKnN0cmlkZSA9IHNyYy0+dS5SR0JBLnN0cmlkZTsKLQotICByZXR1cm4gc3JjLT51LlJHQkEucmdiYTsKLX0KLQotdWludDhfdCogV2ViUElEZWNHZXRZVVZBKGNvbnN0IFdlYlBJRGVjb2RlciogaWRlYywgaW50KiBsYXN0X3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIHUsIHVpbnQ4X3QqKiB2LCB1aW50OF90KiogYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHN0cmlkZSwgaW50KiB1dl9zdHJpZGUsIGludCogYV9zdHJpZGUpIHsKLSAgY29uc3QgV2ViUERlY0J1ZmZlciogY29uc3Qgc3JjID0gR2V0T3V0cHV0QnVmZmVyKGlkZWMpOwotICBpZiAoc3JjID09IE5VTEwpIHJldHVybiBOVUxMOwotICBpZiAoc3JjLT5jb2xvcnNwYWNlIDwgTU9ERV9ZVVYpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGlmIChsYXN0X3kgIT0gTlVMTCkgKmxhc3RfeSA9IGlkZWMtPnBhcmFtc18ubGFzdF95OwotICBpZiAodSAhPSBOVUxMKSAqdSA9IHNyYy0+dS5ZVVZBLnU7Ci0gIGlmICh2ICE9IE5VTEwpICp2ID0gc3JjLT51LllVVkEudjsKLSAgaWYgKGEgIT0gTlVMTCkgKmEgPSBzcmMtPnUuWVVWQS5hOwotICBpZiAod2lkdGggIT0gTlVMTCkgKndpZHRoID0gc3JjLT53aWR0aDsKLSAgaWYgKGhlaWdodCAhPSBOVUxMKSAqaGVpZ2h0ID0gc3JjLT5oZWlnaHQ7Ci0gIGlmIChzdHJpZGUgIT0gTlVMTCkgKnN0cmlkZSA9IHNyYy0+dS5ZVVZBLnlfc3RyaWRlOwotICBpZiAodXZfc3RyaWRlICE9IE5VTEwpICp1dl9zdHJpZGUgPSBzcmMtPnUuWVVWQS51X3N0cmlkZTsKLSAgaWYgKGFfc3RyaWRlICE9IE5VTEwpICphX3N0cmlkZSA9IHNyYy0+dS5ZVVZBLmFfc3RyaWRlOwotCi0gIHJldHVybiBzcmMtPnUuWVVWQS55OwotfQotCi1pbnQgV2ViUElTZXRJT0hvb2tzKFdlYlBJRGVjb2RlciogY29uc3QgaWRlYywKLSAgICAgICAgICAgICAgICAgICAgVlA4SW9QdXRIb29rIHB1dCwKLSAgICAgICAgICAgICAgICAgICAgVlA4SW9TZXR1cEhvb2sgc2V0dXAsCi0gICAgICAgICAgICAgICAgICAgIFZQOElvVGVhcmRvd25Ib29rIHRlYXJkb3duLAotICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyX2RhdGEpIHsKLSAgaWYgKGlkZWMgPT0gTlVMTCB8fCBpZGVjLT5zdGF0ZV8gPiBTVEFURV9QUkVfVlA4KSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBpZGVjLT5pb18ucHV0ID0gcHV0OwotICBpZGVjLT5pb18uc2V0dXAgPSBzZXR1cDsKLSAgaWRlYy0+aW9fLnRlYXJkb3duID0gdGVhcmRvd247Ci0gIGlkZWMtPmlvXy5vcGFxdWUgPSB1c2VyX2RhdGE7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL2lvLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kZWMvaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBhNjg2NS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kZWMvaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDY0MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gZnVuY3Rpb25zIGZvciBzYW1wbGUgb3V0cHV0LgotLy8KLS8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCi0KLSNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgotI2Vsc2UKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiLi4vZGVjL3ZwOGkuaCIKLSNpbmNsdWRlICIuL3dlYnBpLmgiCi0jaW5jbHVkZSAiLi4vZHNwL2RzcC5oIgotI2luY2x1ZGUgIi4uL2RzcC95dXYuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBNYWluIFlVVjwtPlJHQiBjb252ZXJzaW9uIGZ1bmN0aW9ucwotCi1zdGF0aWMgaW50IEVtaXRZVVYoY29uc3QgVlA4SW8qIGNvbnN0IGlvLCBXZWJQRGVjUGFyYW1zKiBjb25zdCBwKSB7Ci0gIFdlYlBEZWNCdWZmZXIqIG91dHB1dCA9IHAtPm91dHB1dDsKLSAgY29uc3QgV2ViUFlVVkFCdWZmZXIqIGNvbnN0IGJ1ZiA9ICZvdXRwdXQtPnUuWVVWQTsKLSAgdWludDhfdCogY29uc3QgeV9kc3QgPSBidWYtPnkgKyBpby0+bWJfeSAqIGJ1Zi0+eV9zdHJpZGU7Ci0gIHVpbnQ4X3QqIGNvbnN0IHVfZHN0ID0gYnVmLT51ICsgKGlvLT5tYl95ID4+IDEpICogYnVmLT51X3N0cmlkZTsKLSAgdWludDhfdCogY29uc3Qgdl9kc3QgPSBidWYtPnYgKyAoaW8tPm1iX3kgPj4gMSkgKiBidWYtPnZfc3RyaWRlOwotICBjb25zdCBpbnQgbWJfdyA9IGlvLT5tYl93OwotICBjb25zdCBpbnQgbWJfaCA9IGlvLT5tYl9oOwotICBjb25zdCBpbnQgdXZfdyA9IChtYl93ICsgMSkgLyAyOwotICBjb25zdCBpbnQgdXZfaCA9IChtYl9oICsgMSkgLyAyOwotICBpbnQgajsKLSAgZm9yIChqID0gMDsgaiA8IG1iX2g7ICsraikgewotICAgIFNiTWVtb3J5Q29weSh5X2RzdCArIGogKiBidWYtPnlfc3RyaWRlLCBpby0+eSArIGogKiBpby0+eV9zdHJpZGUsIG1iX3cpOwotICB9Ci0gIGZvciAoaiA9IDA7IGogPCB1dl9oOyArK2opIHsKLSAgICBTYk1lbW9yeUNvcHkodV9kc3QgKyBqICogYnVmLT51X3N0cmlkZSwgaW8tPnUgKyBqICogaW8tPnV2X3N0cmlkZSwgdXZfdyk7Ci0gICAgU2JNZW1vcnlDb3B5KHZfZHN0ICsgaiAqIGJ1Zi0+dl9zdHJpZGUsIGlvLT52ICsgaiAqIGlvLT51dl9zdHJpZGUsIHV2X3cpOwotICB9Ci0gIHJldHVybiBpby0+bWJfaDsKLX0KLQotLy8gUG9pbnQtc2FtcGxpbmcgVS9WIHNhbXBsZXIuCi1zdGF0aWMgaW50IEVtaXRTYW1wbGVkUkdCKGNvbnN0IFZQOElvKiBjb25zdCBpbywgV2ViUERlY1BhcmFtcyogY29uc3QgcCkgewotICBXZWJQRGVjQnVmZmVyKiBvdXRwdXQgPSBwLT5vdXRwdXQ7Ci0gIGNvbnN0IFdlYlBSR0JBQnVmZmVyKiBjb25zdCBidWYgPSAmb3V0cHV0LT51LlJHQkE7Ci0gIHVpbnQ4X3QqIGRzdCA9IGJ1Zi0+cmdiYSArIGlvLT5tYl95ICogYnVmLT5zdHJpZGU7Ci0gIGNvbnN0IHVpbnQ4X3QqIHlfc3JjID0gaW8tPnk7Ci0gIGNvbnN0IHVpbnQ4X3QqIHVfc3JjID0gaW8tPnU7Ci0gIGNvbnN0IHVpbnQ4X3QqIHZfc3JjID0gaW8tPnY7Ci0gIGNvbnN0IFdlYlBTYW1wbGVMaW5lUGFpckZ1bmMgc2FtcGxlID0gV2ViUFNhbXBsZXJzW291dHB1dC0+Y29sb3JzcGFjZV07Ci0gIGNvbnN0IGludCBtYl93ID0gaW8tPm1iX3c7Ci0gIGNvbnN0IGludCBsYXN0ID0gaW8tPm1iX2ggLSAxOwotICBpbnQgajsKLSAgZm9yIChqID0gMDsgaiA8IGxhc3Q7IGogKz0gMikgewotICAgIHNhbXBsZSh5X3NyYywgeV9zcmMgKyBpby0+eV9zdHJpZGUsIHVfc3JjLCB2X3NyYywKLSAgICAgICAgICAgZHN0LCBkc3QgKyBidWYtPnN0cmlkZSwgbWJfdyk7Ci0gICAgeV9zcmMgKz0gMiAqIGlvLT55X3N0cmlkZTsKLSAgICB1X3NyYyArPSBpby0+dXZfc3RyaWRlOwotICAgIHZfc3JjICs9IGlvLT51dl9zdHJpZGU7Ci0gICAgZHN0ICs9IDIgKiBidWYtPnN0cmlkZTsKLSAgfQotICBpZiAoaiA9PSBsYXN0KSB7ICAvLyBKdXN0IGRvIHRoZSBsYXN0IGxpbmUgdHdpY2UKLSAgICBzYW1wbGUoeV9zcmMsIHlfc3JjLCB1X3NyYywgdl9zcmMsIGRzdCwgZHN0LCBtYl93KTsKLSAgfQotICByZXR1cm4gaW8tPm1iX2g7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBZVVY0NDQgLT4gUkdCIGNvbnZlcnNpb24KLQotI2lmIDAgICAvLyBUT0RPKHNrYWwpOiB0aGlzIGlzIGZvciBmdXR1cmUgcmVzY2FsaW5nLgotc3RhdGljIGludCBFbWl0UkdCKGNvbnN0IFZQOElvKiBjb25zdCBpbywgV2ViUERlY1BhcmFtcyogY29uc3QgcCkgewotICBXZWJQRGVjQnVmZmVyKiBvdXRwdXQgPSBwLT5vdXRwdXQ7Ci0gIGNvbnN0IFdlYlBSR0JBQnVmZmVyKiBjb25zdCBidWYgPSAmb3V0cHV0LT51LlJHQkE7Ci0gIHVpbnQ4X3QqIGRzdCA9IGJ1Zi0+cmdiYSArIGlvLT5tYl95ICogYnVmLT5zdHJpZGU7Ci0gIGNvbnN0IHVpbnQ4X3QqIHlfc3JjID0gaW8tPnk7Ci0gIGNvbnN0IHVpbnQ4X3QqIHVfc3JjID0gaW8tPnU7Ci0gIGNvbnN0IHVpbnQ4X3QqIHZfc3JjID0gaW8tPnY7Ci0gIGNvbnN0IFdlYlBZVVY0NDRDb252ZXJ0ZXIgY29udmVydCA9IFdlYlBZVVY0NDRDb252ZXJ0ZXJzW291dHB1dC0+Y29sb3JzcGFjZV07Ci0gIGNvbnN0IGludCBtYl93ID0gaW8tPm1iX3c7Ci0gIGNvbnN0IGludCBsYXN0ID0gaW8tPm1iX2g7Ci0gIGludCBqOwotICBmb3IgKGogPSAwOyBqIDwgbGFzdDsgKytqKSB7Ci0gICAgY29udmVydCh5X3NyYywgdV9zcmMsIHZfc3JjLCBkc3QsIG1iX3cpOwotICAgIHlfc3JjICs9IGlvLT55X3N0cmlkZTsKLSAgICB1X3NyYyArPSBpby0+dXZfc3RyaWRlOwotICAgIHZfc3JjICs9IGlvLT51dl9zdHJpZGU7Ci0gICAgZHN0ICs9IGJ1Zi0+c3RyaWRlOwotICB9Ci0gIHJldHVybiBpby0+bWJfaDsKLX0KLSNlbmRpZgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRmFuY3kgdXBzYW1wbGluZwotCi0jaWZkZWYgRkFOQ1lfVVBTQU1QTElORwotc3RhdGljIGludCBFbWl0RmFuY3lSR0IoY29uc3QgVlA4SW8qIGNvbnN0IGlvLCBXZWJQRGVjUGFyYW1zKiBjb25zdCBwKSB7Ci0gIGludCBudW1fbGluZXNfb3V0ID0gaW8tPm1iX2g7ICAgLy8gYSBwcmlvcmkgZ3Vlc3MKLSAgY29uc3QgV2ViUFJHQkFCdWZmZXIqIGNvbnN0IGJ1ZiA9ICZwLT5vdXRwdXQtPnUuUkdCQTsKLSAgdWludDhfdCogZHN0ID0gYnVmLT5yZ2JhICsgaW8tPm1iX3kgKiBidWYtPnN0cmlkZTsKLSAgV2ViUFVwc2FtcGxlTGluZVBhaXJGdW5jIHVwc2FtcGxlID0gV2ViUFVwc2FtcGxlcnNbcC0+b3V0cHV0LT5jb2xvcnNwYWNlXTsKLSAgY29uc3QgdWludDhfdCogY3VyX3kgPSBpby0+eTsKLSAgY29uc3QgdWludDhfdCogY3VyX3UgPSBpby0+dTsKLSAgY29uc3QgdWludDhfdCogY3VyX3YgPSBpby0+djsKLSAgY29uc3QgdWludDhfdCogdG9wX3UgPSBwLT50bXBfdTsKLSAgY29uc3QgdWludDhfdCogdG9wX3YgPSBwLT50bXBfdjsKLSAgaW50IHkgPSBpby0+bWJfeTsKLSAgY29uc3QgaW50IHlfZW5kID0gaW8tPm1iX3kgKyBpby0+bWJfaDsKLSAgY29uc3QgaW50IG1iX3cgPSBpby0+bWJfdzsKLSAgY29uc3QgaW50IHV2X3cgPSAobWJfdyArIDEpIC8gMjsKLQotICBpZiAoeSA9PSAwKSB7Ci0gICAgLy8gRmlyc3QgbGluZSBpcyBzcGVjaWFsIGNhc2VkLiBXZSBtaXJyb3IgdGhlIHUvdiBzYW1wbGVzIGF0IGJvdW5kYXJ5LgotICAgIHVwc2FtcGxlKE5VTEwsIGN1cl95LCBjdXJfdSwgY3VyX3YsIGN1cl91LCBjdXJfdiwgTlVMTCwgZHN0LCBtYl93KTsKLSAgfSBlbHNlIHsKLSAgICAvLyBXZSBjYW4gZmluaXNoIHRoZSBsZWZ0LW92ZXIgbGluZSBmcm9tIHByZXZpb3VzIGNhbGwuCi0gICAgdXBzYW1wbGUocC0+dG1wX3ksIGN1cl95LCB0b3BfdSwgdG9wX3YsIGN1cl91LCBjdXJfdiwKLSAgICAgICAgICAgICBkc3QgLSBidWYtPnN0cmlkZSwgZHN0LCBtYl93KTsKLSAgICArK251bV9saW5lc19vdXQ7Ci0gIH0KLSAgLy8gTG9vcCBvdmVyIGVhY2ggb3V0cHV0IHBhaXJzIG9mIHJvdy4KLSAgZm9yICg7IHkgKyAyIDwgeV9lbmQ7IHkgKz0gMikgewotICAgIHRvcF91ID0gY3VyX3U7Ci0gICAgdG9wX3YgPSBjdXJfdjsKLSAgICBjdXJfdSArPSBpby0+dXZfc3RyaWRlOwotICAgIGN1cl92ICs9IGlvLT51dl9zdHJpZGU7Ci0gICAgZHN0ICs9IDIgKiBidWYtPnN0cmlkZTsKLSAgICBjdXJfeSArPSAyICogaW8tPnlfc3RyaWRlOwotICAgIHVwc2FtcGxlKGN1cl95IC0gaW8tPnlfc3RyaWRlLCBjdXJfeSwKLSAgICAgICAgICAgICB0b3BfdSwgdG9wX3YsIGN1cl91LCBjdXJfdiwKLSAgICAgICAgICAgICBkc3QgLSBidWYtPnN0cmlkZSwgZHN0LCBtYl93KTsKLSAgfQotICAvLyBtb3ZlIHRvIGxhc3Qgcm93Ci0gIGN1cl95ICs9IGlvLT55X3N0cmlkZTsKLSAgaWYgKGlvLT5jcm9wX3RvcCArIHlfZW5kIDwgaW8tPmNyb3BfYm90dG9tKSB7Ci0gICAgLy8gU2F2ZSB0aGUgdW5maW5pc2hlZCBzYW1wbGVzIGZvciBuZXh0IGNhbGwgKGFzIHdlJ3JlIG5vdCBkb25lIHlldCkuCi0gICAgU2JNZW1vcnlDb3B5KHAtPnRtcF95LCBjdXJfeSwgbWJfdyAqIHNpemVvZigqcC0+dG1wX3kpKTsKLSAgICBTYk1lbW9yeUNvcHkocC0+dG1wX3UsIGN1cl91LCB1dl93ICogc2l6ZW9mKCpwLT50bXBfdSkpOwotICAgIFNiTWVtb3J5Q29weShwLT50bXBfdiwgY3VyX3YsIHV2X3cgKiBzaXplb2YoKnAtPnRtcF92KSk7Ci0gICAgLy8gVGhlIGZhbmN5IHVwc2FtcGxlciBsZWF2ZXMgYSByb3cgdW5maW5pc2hlZCBiZWhpbmQKLSAgICAvLyAoZXhjZXB0IGZvciB0aGUgdmVyeSBsYXN0IHJvdykKLSAgICBudW1fbGluZXNfb3V0LS07Ci0gIH0gZWxzZSB7Ci0gICAgLy8gUHJvY2VzcyB0aGUgdmVyeSBsYXN0IHJvdyBvZiBldmVuLXNpemVkIHBpY3R1cmUKLSAgICBpZiAoISh5X2VuZCAmIDEpKSB7Ci0gICAgICB1cHNhbXBsZShjdXJfeSwgTlVMTCwgY3VyX3UsIGN1cl92LCBjdXJfdSwgY3VyX3YsCi0gICAgICAgICAgICAgICBkc3QgKyBidWYtPnN0cmlkZSwgTlVMTCwgbWJfdyk7Ci0gICAgfQotICB9Ci0gIHJldHVybiBudW1fbGluZXNfb3V0OwotfQotCi0jZW5kaWYgICAgLyogRkFOQ1lfVVBTQU1QTElORyAqLwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgaW50IEVtaXRBbHBoYVlVVihjb25zdCBWUDhJbyogY29uc3QgaW8sIFdlYlBEZWNQYXJhbXMqIGNvbnN0IHApIHsKLSAgY29uc3QgdWludDhfdCogYWxwaGEgPSBpby0+YTsKLSAgY29uc3QgV2ViUFlVVkFCdWZmZXIqIGNvbnN0IGJ1ZiA9ICZwLT5vdXRwdXQtPnUuWVVWQTsKLSAgY29uc3QgaW50IG1iX3cgPSBpby0+bWJfdzsKLSAgY29uc3QgaW50IG1iX2ggPSBpby0+bWJfaDsKLSAgdWludDhfdCogZHN0ID0gYnVmLT5hICsgaW8tPm1iX3kgKiBidWYtPmFfc3RyaWRlOwotICBpbnQgajsKLQotICBpZiAoYWxwaGEgIT0gTlVMTCkgewotICAgIGZvciAoaiA9IDA7IGogPCBtYl9oOyArK2opIHsKLSAgICAgIFNiTWVtb3J5Q29weShkc3QsIGFscGhhLCBtYl93ICogc2l6ZW9mKCpkc3QpKTsKLSAgICAgIGFscGhhICs9IGlvLT53aWR0aDsKLSAgICAgIGRzdCArPSBidWYtPmFfc3RyaWRlOwotICAgIH0KLSAgfSBlbHNlIGlmIChidWYtPmEgIT0gTlVMTCkgewotICAgIC8vIHRoZSB1c2VyIHJlcXVlc3RlZCBhbHBoYSwgYnV0IHRoZXJlIGlzIG5vbmUsIHNldCBpdCB0byBvcGFxdWUuCi0gICAgZm9yIChqID0gMDsgaiA8IG1iX2g7ICsraikgewotICAgICAgU2JNZW1vcnlTZXQoZHN0LCAweGZmLCBtYl93ICogc2l6ZW9mKCpkc3QpKTsKLSAgICAgIGRzdCArPSBidWYtPmFfc3RyaWRlOwotICAgIH0KLSAgfQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBHZXRBbHBoYVNvdXJjZVJvdyhjb25zdCBWUDhJbyogY29uc3QgaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqKiBhbHBoYSwgaW50KiBjb25zdCBudW1fcm93cykgewotICBpbnQgc3RhcnRfeSA9IGlvLT5tYl95OwotICAqbnVtX3Jvd3MgPSBpby0+bWJfaDsKLQotICAvLyBDb21wZW5zYXRlIGZvciB0aGUgMS1saW5lIGRlbGF5IG9mIHRoZSBmYW5jeSB1cHNjYWxlci4KLSAgLy8gVGhpcyBpcyBzaW1pbGFyIHRvIEVtaXRGYW5jeVJHQigpLgotICBpZiAoaW8tPmZhbmN5X3Vwc2FtcGxpbmcpIHsKLSAgICBpZiAoc3RhcnRfeSA9PSAwKSB7Ci0gICAgICAvLyBXZSBkb24ndCBwcm9jZXNzIHRoZSBsYXN0IHJvdyB5ZXQuIEl0J2xsIGJlIGRvbmUgZHVyaW5nIHRoZSBuZXh0IGNhbGwuCi0gICAgICAtLSpudW1fcm93czsKLSAgICB9IGVsc2UgewotICAgICAgLS1zdGFydF95OwotICAgICAgLy8gRm9ydHVuYXRlbHksICphbHBoYSBkYXRhIGlzIHBlcnNpc3RlbnQsIHNvIHdlIGNhbiBnbyBiYWNrCi0gICAgICAvLyBvbmUgcm93IGFuZCBmaW5pc2ggYWxwaGEgYmxlbmRpbmcsIG5vdyB0aGF0IHRoZSBmYW5jeSB1cHNjYWxlcgotICAgICAgLy8gY29tcGxldGVkIHRoZSBZVVYtPlJHQiBpbnRlcnBvbGF0aW9uLgotICAgICAgKmFscGhhIC09IGlvLT53aWR0aDsKLSAgICB9Ci0gICAgaWYgKGlvLT5jcm9wX3RvcCArIGlvLT5tYl95ICsgaW8tPm1iX2ggPT0gaW8tPmNyb3BfYm90dG9tKSB7Ci0gICAgICAvLyBJZiBpdCdzIHRoZSB2ZXJ5IGxhc3QgY2FsbCwgd2UgcHJvY2VzcyBhbGwgdGhlIHJlbWFpbmluZyByb3dzIQotICAgICAgKm51bV9yb3dzID0gaW8tPmNyb3BfYm90dG9tIC0gaW8tPmNyb3BfdG9wIC0gc3RhcnRfeTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHN0YXJ0X3k7Ci19Ci0KLXN0YXRpYyBpbnQgRW1pdEFscGhhUkdCKGNvbnN0IFZQOElvKiBjb25zdCBpbywgV2ViUERlY1BhcmFtcyogY29uc3QgcCkgewotICBjb25zdCB1aW50OF90KiBhbHBoYSA9IGlvLT5hOwotICBpZiAoYWxwaGEgIT0gTlVMTCkgewotICAgIGNvbnN0IGludCBtYl93ID0gaW8tPm1iX3c7Ci0gICAgY29uc3QgV0VCUF9DU1BfTU9ERSBjb2xvcnNwYWNlID0gcC0+b3V0cHV0LT5jb2xvcnNwYWNlOwotICAgIGNvbnN0IGludCBhbHBoYV9maXJzdCA9Ci0gICAgICAgIChjb2xvcnNwYWNlID09IE1PREVfQVJHQiB8fCBjb2xvcnNwYWNlID09IE1PREVfQXJnYik7Ci0gICAgY29uc3QgV2ViUFJHQkFCdWZmZXIqIGNvbnN0IGJ1ZiA9ICZwLT5vdXRwdXQtPnUuUkdCQTsKLSAgICBpbnQgbnVtX3Jvd3M7Ci0gICAgY29uc3QgaW50IHN0YXJ0X3kgPSBHZXRBbHBoYVNvdXJjZVJvdyhpbywgJmFscGhhLCAmbnVtX3Jvd3MpOwotICAgIHVpbnQ4X3QqIGNvbnN0IGJhc2VfcmdiYSA9IGJ1Zi0+cmdiYSArIHN0YXJ0X3kgKiBidWYtPnN0cmlkZTsKLSAgICB1aW50OF90KiBkc3QgPSBiYXNlX3JnYmEgKyAoYWxwaGFfZmlyc3QgPyAwIDogMyk7Ci0gICAgdWludDMyX3QgYWxwaGFfbWFzayA9IDB4ZmY7Ci0gICAgaW50IGksIGo7Ci0KLSAgICBmb3IgKGogPSAwOyBqIDwgbnVtX3Jvd3M7ICsraikgewotICAgICAgZm9yIChpID0gMDsgaSA8IG1iX3c7ICsraSkgewotICAgICAgICBjb25zdCB1aW50MzJfdCBhbHBoYV92YWx1ZSA9IGFscGhhW2ldOwotICAgICAgICBkc3RbNCAqIGldID0gYWxwaGFfdmFsdWU7Ci0gICAgICAgIGFscGhhX21hc2sgJj0gYWxwaGFfdmFsdWU7Ci0gICAgICB9Ci0gICAgICBhbHBoYSArPSBpby0+d2lkdGg7Ci0gICAgICBkc3QgKz0gYnVmLT5zdHJpZGU7Ci0gICAgfQotICAgIC8vIGFscGhhX21hc2sgaXMgPCAweGZmIGlmIHRoZXJlJ3Mgbm9uLXRyaXZpYWwgYWxwaGEgdG8gcHJlbXVsdGlwbHkgd2l0aC4KLSAgICBpZiAoYWxwaGFfbWFzayAhPSAweGZmICYmIFdlYlBJc1ByZW11bHRpcGxpZWRNb2RlKGNvbG9yc3BhY2UpKSB7Ci0gICAgICBXZWJQQXBwbHlBbHBoYU11bHRpcGx5KGJhc2VfcmdiYSwgYWxwaGFfZmlyc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1iX3csIG51bV9yb3dzLCBidWYtPnN0cmlkZSk7Ci0gICAgfQotICB9Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IEVtaXRBbHBoYVJHQkE0NDQ0KGNvbnN0IFZQOElvKiBjb25zdCBpbywgV2ViUERlY1BhcmFtcyogY29uc3QgcCkgewotICBjb25zdCB1aW50OF90KiBhbHBoYSA9IGlvLT5hOwotICBpZiAoYWxwaGEgIT0gTlVMTCkgewotICAgIGNvbnN0IGludCBtYl93ID0gaW8tPm1iX3c7Ci0gICAgY29uc3QgV0VCUF9DU1BfTU9ERSBjb2xvcnNwYWNlID0gcC0+b3V0cHV0LT5jb2xvcnNwYWNlOwotICAgIGNvbnN0IFdlYlBSR0JBQnVmZmVyKiBjb25zdCBidWYgPSAmcC0+b3V0cHV0LT51LlJHQkE7Ci0gICAgaW50IG51bV9yb3dzOwotICAgIGNvbnN0IGludCBzdGFydF95ID0gR2V0QWxwaGFTb3VyY2VSb3coaW8sICZhbHBoYSwgJm51bV9yb3dzKTsKLSAgICB1aW50OF90KiBjb25zdCBiYXNlX3JnYmEgPSBidWYtPnJnYmEgKyBzdGFydF95ICogYnVmLT5zdHJpZGU7Ci0gICAgdWludDhfdCogYWxwaGFfZHN0ID0gYmFzZV9yZ2JhICsgMTsKLSAgICB1aW50MzJfdCBhbHBoYV9tYXNrID0gMHgwZjsKLSAgICBpbnQgaSwgajsKLQotICAgIGZvciAoaiA9IDA7IGogPCBudW1fcm93czsgKytqKSB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgbWJfdzsgKytpKSB7Ci0gICAgICAgIC8vIEZpbGwgaW4gdGhlIGFscGhhIHZhbHVlIChjb252ZXJ0ZWQgdG8gNCBiaXRzKS4KLSAgICAgICAgY29uc3QgdWludDMyX3QgYWxwaGFfdmFsdWUgPSBhbHBoYVtpXSA+PiA0OwotICAgICAgICBhbHBoYV9kc3RbMiAqIGldID0gKGFscGhhX2RzdFsyICogaV0gJiAweGYwKSB8IGFscGhhX3ZhbHVlOwotICAgICAgICBhbHBoYV9tYXNrICY9IGFscGhhX3ZhbHVlOwotICAgICAgfQotICAgICAgYWxwaGEgKz0gaW8tPndpZHRoOwotICAgICAgYWxwaGFfZHN0ICs9IGJ1Zi0+c3RyaWRlOwotICAgIH0KLSAgICBpZiAoYWxwaGFfbWFzayAhPSAweDBmICYmIFdlYlBJc1ByZW11bHRpcGxpZWRNb2RlKGNvbG9yc3BhY2UpKSB7Ci0gICAgICBXZWJQQXBwbHlBbHBoYU11bHRpcGx5NDQ0NChiYXNlX3JnYmEsIG1iX3csIG51bV9yb3dzLCBidWYtPnN0cmlkZSk7Ci0gICAgfQotICB9Ci0gIHJldHVybiAwOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gWVVWIHJlc2NhbGluZyAobm8gZmluYWwgUkdCIGNvbnZlcnNpb24gbmVlZGVkKQotCi1zdGF0aWMgaW50IFJlc2NhbGUoY29uc3QgdWludDhfdCogc3JjLCBpbnQgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICBpbnQgbmV3X2xpbmVzLCBXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaykgewotICBpbnQgbnVtX2xpbmVzX291dCA9IDA7Ci0gIHdoaWxlIChuZXdfbGluZXMgPiAwKSB7ICAgIC8vIGltcG9ydCBuZXcgY29udHJpYnV0aW9ucyBvZiBzb3VyY2Ugcm93cy4KLSAgICBjb25zdCBpbnQgbGluZXNfaW4gPSBXZWJQUmVzY2FsZXJJbXBvcnQod3JrLCBuZXdfbGluZXMsIHNyYywgc3JjX3N0cmlkZSk7Ci0gICAgc3JjICs9IGxpbmVzX2luICogc3JjX3N0cmlkZTsKLSAgICBuZXdfbGluZXMgLT0gbGluZXNfaW47Ci0gICAgbnVtX2xpbmVzX291dCArPSBXZWJQUmVzY2FsZXJFeHBvcnQod3JrKTsgICAgLy8gZW1pdCBvdXRwdXQgcm93KHMpCi0gIH0KLSAgcmV0dXJuIG51bV9saW5lc19vdXQ7Ci19Ci0KLXN0YXRpYyBpbnQgRW1pdFJlc2NhbGVkWVVWKGNvbnN0IFZQOElvKiBjb25zdCBpbywgV2ViUERlY1BhcmFtcyogY29uc3QgcCkgewotICBjb25zdCBpbnQgbWJfaCA9IGlvLT5tYl9oOwotICBjb25zdCBpbnQgdXZfbWJfaCA9IChtYl9oICsgMSkgPj4gMTsKLSAgY29uc3QgaW50IG51bV9saW5lc19vdXQgPSBSZXNjYWxlKGlvLT55LCBpby0+eV9zdHJpZGUsIG1iX2gsICZwLT5zY2FsZXJfeSk7Ci0gIFJlc2NhbGUoaW8tPnUsIGlvLT51dl9zdHJpZGUsIHV2X21iX2gsICZwLT5zY2FsZXJfdSk7Ci0gIFJlc2NhbGUoaW8tPnYsIGlvLT51dl9zdHJpZGUsIHV2X21iX2gsICZwLT5zY2FsZXJfdik7Ci0gIHJldHVybiBudW1fbGluZXNfb3V0OwotfQotCi1zdGF0aWMgaW50IEVtaXRSZXNjYWxlZEFscGhhWVVWKGNvbnN0IFZQOElvKiBjb25zdCBpbywgV2ViUERlY1BhcmFtcyogY29uc3QgcCkgewotICBpZiAoaW8tPmEgIT0gTlVMTCkgewotICAgIFJlc2NhbGUoaW8tPmEsIGlvLT53aWR0aCwgaW8tPm1iX2gsICZwLT5zY2FsZXJfYSk7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgSW5pdFlVVlJlc2NhbGVyKGNvbnN0IFZQOElvKiBjb25zdCBpbywgV2ViUERlY1BhcmFtcyogY29uc3QgcCkgewotICBjb25zdCBpbnQgaGFzX2FscGhhID0gV2ViUElzQWxwaGFNb2RlKHAtPm91dHB1dC0+Y29sb3JzcGFjZSk7Ci0gIGNvbnN0IFdlYlBZVVZBQnVmZmVyKiBjb25zdCBidWYgPSAmcC0+b3V0cHV0LT51LllVVkE7Ci0gIGNvbnN0IGludCBvdXRfd2lkdGggID0gaW8tPnNjYWxlZF93aWR0aDsKLSAgY29uc3QgaW50IG91dF9oZWlnaHQgPSBpby0+c2NhbGVkX2hlaWdodDsKLSAgY29uc3QgaW50IHV2X291dF93aWR0aCAgPSAob3V0X3dpZHRoICsgMSkgPj4gMTsKLSAgY29uc3QgaW50IHV2X291dF9oZWlnaHQgPSAob3V0X2hlaWdodCArIDEpID4+IDE7Ci0gIGNvbnN0IGludCB1dl9pbl93aWR0aCAgPSAoaW8tPm1iX3cgKyAxKSA+PiAxOwotICBjb25zdCBpbnQgdXZfaW5faGVpZ2h0ID0gKGlvLT5tYl9oICsgMSkgPj4gMTsKLSAgY29uc3Qgc2l6ZV90IHdvcmtfc2l6ZSA9IDIgKiBvdXRfd2lkdGg7ICAgLy8gc2NyYXRjaCBtZW1vcnkgZm9yIGx1bWEgcmVzY2FsZXIKLSAgY29uc3Qgc2l6ZV90IHV2X3dvcmtfc2l6ZSA9IDIgKiB1dl9vdXRfd2lkdGg7ICAvLyBhbmQgZm9yIGVhY2ggdS92IG9uZXMKLSAgc2l6ZV90IHRtcF9zaXplOwotICBpbnQzMl90KiB3b3JrOwotCi0gIHRtcF9zaXplID0gd29ya19zaXplICsgMiAqIHV2X3dvcmtfc2l6ZTsKLSAgaWYgKGhhc19hbHBoYSkgewotICAgIHRtcF9zaXplICs9IHdvcmtfc2l6ZTsKLSAgfQotICBwLT5tZW1vcnkgPSBTYk1lbW9yeUNhbGxvYygxLCB0bXBfc2l6ZSAqIHNpemVvZigqd29yaykpOwotICBpZiAocC0+bWVtb3J5ID09IE5VTEwpIHsKLSAgICByZXR1cm4gMDsgICAvLyBtZW1vcnkgZXJyb3IKLSAgfQotICB3b3JrID0gKGludDMyX3QqKXAtPm1lbW9yeTsKLSAgV2ViUFJlc2NhbGVySW5pdCgmcC0+c2NhbGVyX3ksIGlvLT5tYl93LCBpby0+bWJfaCwKLSAgICAgICAgICAgICAgICAgICBidWYtPnksIG91dF93aWR0aCwgb3V0X2hlaWdodCwgYnVmLT55X3N0cmlkZSwgMSwKLSAgICAgICAgICAgICAgICAgICBpby0+bWJfdywgb3V0X3dpZHRoLCBpby0+bWJfaCwgb3V0X2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICB3b3JrKTsKLSAgV2ViUFJlc2NhbGVySW5pdCgmcC0+c2NhbGVyX3UsIHV2X2luX3dpZHRoLCB1dl9pbl9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgYnVmLT51LCB1dl9vdXRfd2lkdGgsIHV2X291dF9oZWlnaHQsIGJ1Zi0+dV9zdHJpZGUsIDEsCi0gICAgICAgICAgICAgICAgICAgdXZfaW5fd2lkdGgsIHV2X291dF93aWR0aCwKLSAgICAgICAgICAgICAgICAgICB1dl9pbl9oZWlnaHQsIHV2X291dF9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgd29yayArIHdvcmtfc2l6ZSk7Ci0gIFdlYlBSZXNjYWxlckluaXQoJnAtPnNjYWxlcl92LCB1dl9pbl93aWR0aCwgdXZfaW5faGVpZ2h0LAotICAgICAgICAgICAgICAgICAgIGJ1Zi0+diwgdXZfb3V0X3dpZHRoLCB1dl9vdXRfaGVpZ2h0LCBidWYtPnZfc3RyaWRlLCAxLAotICAgICAgICAgICAgICAgICAgIHV2X2luX3dpZHRoLCB1dl9vdXRfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgdXZfaW5faGVpZ2h0LCB1dl9vdXRfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgIHdvcmsgKyB3b3JrX3NpemUgKyB1dl93b3JrX3NpemUpOwotICBwLT5lbWl0ID0gRW1pdFJlc2NhbGVkWVVWOwotCi0gIGlmIChoYXNfYWxwaGEpIHsKLSAgICBXZWJQUmVzY2FsZXJJbml0KCZwLT5zY2FsZXJfYSwgaW8tPm1iX3csIGlvLT5tYl9oLAotICAgICAgICAgICAgICAgICAgICAgYnVmLT5hLCBvdXRfd2lkdGgsIG91dF9oZWlnaHQsIGJ1Zi0+YV9zdHJpZGUsIDEsCi0gICAgICAgICAgICAgICAgICAgICBpby0+bWJfdywgb3V0X3dpZHRoLCBpby0+bWJfaCwgb3V0X2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgIHdvcmsgKyB3b3JrX3NpemUgKyAyICogdXZfd29ya19zaXplKTsKLSAgICBwLT5lbWl0X2FscGhhID0gRW1pdFJlc2NhbGVkQWxwaGFZVVY7Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBSR0JBIHJlc2NhbGluZwotCi1zdGF0aWMgaW50IEV4cG9ydFJHQihXZWJQRGVjUGFyYW1zKiBjb25zdCBwLCBpbnQgeV9wb3MpIHsKLSAgY29uc3QgV2ViUFlVVjQ0NENvbnZlcnRlciBjb252ZXJ0ID0KLSAgICAgIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW3AtPm91dHB1dC0+Y29sb3JzcGFjZV07Ci0gIGNvbnN0IFdlYlBSR0JBQnVmZmVyKiBjb25zdCBidWYgPSAmcC0+b3V0cHV0LT51LlJHQkE7Ci0gIHVpbnQ4X3QqIGRzdCA9IGJ1Zi0+cmdiYSArIChwLT5sYXN0X3kgKyB5X3BvcykgKiBidWYtPnN0cmlkZTsKLSAgaW50IG51bV9saW5lc19vdXQgPSAwOwotICAvLyBGb3IgUkdCIHJlc2NhbGluZywgYmVjYXVzZSBvZiB0aGUgWVVWNDIwLCBjdXJyZW50IHNjYW4gcG9zaXRpb24KLSAgLy8gVS9WIGNhbiBiZSArMS8tMSBsaW5lIGZyb20gdGhlIFkgb25lLiAgSGVuY2UgdGhlIGRvdWJsZSB0ZXN0LgotICB3aGlsZSAoV2ViUFJlc2NhbGVySGFzUGVuZGluZ091dHB1dCgmcC0+c2NhbGVyX3kpICYmCi0gICAgICAgICBXZWJQUmVzY2FsZXJIYXNQZW5kaW5nT3V0cHV0KCZwLT5zY2FsZXJfdSkpIHsKLSAgICBTQl9EQ0hFQ0socC0+bGFzdF95ICsgeV9wb3MgKyBudW1fbGluZXNfb3V0IDwgcC0+b3V0cHV0LT5oZWlnaHQpOwotICAgIFNCX0RDSEVDSyhwLT5zY2FsZXJfdS55X2FjY3VtID09IHAtPnNjYWxlcl92LnlfYWNjdW0pOwotICAgIFdlYlBSZXNjYWxlckV4cG9ydFJvdygmcC0+c2NhbGVyX3kpOwotICAgIFdlYlBSZXNjYWxlckV4cG9ydFJvdygmcC0+c2NhbGVyX3UpOwotICAgIFdlYlBSZXNjYWxlckV4cG9ydFJvdygmcC0+c2NhbGVyX3YpOwotICAgIGNvbnZlcnQocC0+c2NhbGVyX3kuZHN0LCBwLT5zY2FsZXJfdS5kc3QsIHAtPnNjYWxlcl92LmRzdCwKLSAgICAgICAgICAgIGRzdCwgcC0+c2NhbGVyX3kuZHN0X3dpZHRoKTsKLSAgICBkc3QgKz0gYnVmLT5zdHJpZGU7Ci0gICAgKytudW1fbGluZXNfb3V0OwotICB9Ci0gIHJldHVybiBudW1fbGluZXNfb3V0OwotfQotCi1zdGF0aWMgaW50IEVtaXRSZXNjYWxlZFJHQihjb25zdCBWUDhJbyogY29uc3QgaW8sIFdlYlBEZWNQYXJhbXMqIGNvbnN0IHApIHsKLSAgY29uc3QgaW50IG1iX2ggPSBpby0+bWJfaDsKLSAgY29uc3QgaW50IHV2X21iX2ggPSAobWJfaCArIDEpID4+IDE7Ci0gIGludCBqID0gMCwgdXZfaiA9IDA7Ci0gIGludCBudW1fbGluZXNfb3V0ID0gMDsKLSAgd2hpbGUgKGogPCBtYl9oKSB7Ci0gICAgY29uc3QgaW50IHlfbGluZXNfaW4gPQotICAgICAgICBXZWJQUmVzY2FsZXJJbXBvcnQoJnAtPnNjYWxlcl95LCBtYl9oIC0gaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvLT55ICsgaiAqIGlvLT55X3N0cmlkZSwgaW8tPnlfc3RyaWRlKTsKLSAgICBjb25zdCBpbnQgdV9saW5lc19pbiA9Ci0gICAgICAgIFdlYlBSZXNjYWxlckltcG9ydCgmcC0+c2NhbGVyX3UsIHV2X21iX2ggLSB1dl9qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW8tPnUgKyB1dl9qICogaW8tPnV2X3N0cmlkZSwgaW8tPnV2X3N0cmlkZSk7Ci0gICAgY29uc3QgaW50IHZfbGluZXNfaW4gPQotICAgICAgICBXZWJQUmVzY2FsZXJJbXBvcnQoJnAtPnNjYWxlcl92LCB1dl9tYl9oIC0gdXZfaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvLT52ICsgdXZfaiAqIGlvLT51dl9zdHJpZGUsIGlvLT51dl9zdHJpZGUpOwotICAgICh2b2lkKXZfbGluZXNfaW47ICAgLy8gcmVtb3ZlIGEgZ2NjIHdhcm5pbmcKLSAgICBTQl9EQ0hFQ0sodV9saW5lc19pbiA9PSB2X2xpbmVzX2luKTsKLSAgICBqICs9IHlfbGluZXNfaW47Ci0gICAgdXZfaiArPSB1X2xpbmVzX2luOwotICAgIG51bV9saW5lc19vdXQgKz0gRXhwb3J0UkdCKHAsIG51bV9saW5lc19vdXQpOwotICB9Ci0gIHJldHVybiBudW1fbGluZXNfb3V0OwotfQotCi1zdGF0aWMgaW50IEV4cG9ydEFscGhhKFdlYlBEZWNQYXJhbXMqIGNvbnN0IHAsIGludCB5X3BvcykgewotICBjb25zdCBXZWJQUkdCQUJ1ZmZlciogY29uc3QgYnVmID0gJnAtPm91dHB1dC0+dS5SR0JBOwotICB1aW50OF90KiBjb25zdCBiYXNlX3JnYmEgPSBidWYtPnJnYmEgKyAocC0+bGFzdF95ICsgeV9wb3MpICogYnVmLT5zdHJpZGU7Ci0gIGNvbnN0IFdFQlBfQ1NQX01PREUgY29sb3JzcGFjZSA9IHAtPm91dHB1dC0+Y29sb3JzcGFjZTsKLSAgY29uc3QgaW50IGFscGhhX2ZpcnN0ID0KLSAgICAgIChjb2xvcnNwYWNlID09IE1PREVfQVJHQiB8fCBjb2xvcnNwYWNlID09IE1PREVfQXJnYik7Ci0gIHVpbnQ4X3QqIGRzdCA9IGJhc2VfcmdiYSArIChhbHBoYV9maXJzdCA/IDAgOiAzKTsKLSAgaW50IG51bV9saW5lc19vdXQgPSAwOwotICBjb25zdCBpbnQgaXNfcHJlbXVsdF9hbHBoYSA9IFdlYlBJc1ByZW11bHRpcGxpZWRNb2RlKGNvbG9yc3BhY2UpOwotICB1aW50MzJfdCBhbHBoYV9tYXNrID0gMHhmZjsKLSAgY29uc3QgaW50IHdpZHRoID0gcC0+c2NhbGVyX2EuZHN0X3dpZHRoOwotCi0gIHdoaWxlIChXZWJQUmVzY2FsZXJIYXNQZW5kaW5nT3V0cHV0KCZwLT5zY2FsZXJfYSkpIHsKLSAgICBpbnQgaTsKLSAgICBTQl9EQ0hFQ0socC0+bGFzdF95ICsgeV9wb3MgKyBudW1fbGluZXNfb3V0IDwgcC0+b3V0cHV0LT5oZWlnaHQpOwotICAgIFdlYlBSZXNjYWxlckV4cG9ydFJvdygmcC0+c2NhbGVyX2EpOwotICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgKytpKSB7Ci0gICAgICBjb25zdCB1aW50MzJfdCBhbHBoYV92YWx1ZSA9IHAtPnNjYWxlcl9hLmRzdFtpXTsKLSAgICAgIGRzdFs0ICogaV0gPSBhbHBoYV92YWx1ZTsKLSAgICAgIGFscGhhX21hc2sgJj0gYWxwaGFfdmFsdWU7Ci0gICAgfQotICAgIGRzdCArPSBidWYtPnN0cmlkZTsKLSAgICArK251bV9saW5lc19vdXQ7Ci0gIH0KLSAgaWYgKGlzX3ByZW11bHRfYWxwaGEgJiYgYWxwaGFfbWFzayAhPSAweGZmKSB7Ci0gICAgV2ViUEFwcGx5QWxwaGFNdWx0aXBseShiYXNlX3JnYmEsIGFscGhhX2ZpcnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIG51bV9saW5lc19vdXQsIGJ1Zi0+c3RyaWRlKTsKLSAgfQotICByZXR1cm4gbnVtX2xpbmVzX291dDsKLX0KLQotc3RhdGljIGludCBFeHBvcnRBbHBoYVJHQkE0NDQ0KFdlYlBEZWNQYXJhbXMqIGNvbnN0IHAsIGludCB5X3BvcykgewotICBjb25zdCBXZWJQUkdCQUJ1ZmZlciogY29uc3QgYnVmID0gJnAtPm91dHB1dC0+dS5SR0JBOwotICB1aW50OF90KiBjb25zdCBiYXNlX3JnYmEgPSBidWYtPnJnYmEgKyAocC0+bGFzdF95ICsgeV9wb3MpICogYnVmLT5zdHJpZGU7Ci0gIHVpbnQ4X3QqIGFscGhhX2RzdCA9IGJhc2VfcmdiYSArIDE7Ci0gIGludCBudW1fbGluZXNfb3V0ID0gMDsKLSAgY29uc3QgV0VCUF9DU1BfTU9ERSBjb2xvcnNwYWNlID0gcC0+b3V0cHV0LT5jb2xvcnNwYWNlOwotICBjb25zdCBpbnQgd2lkdGggPSBwLT5zY2FsZXJfYS5kc3Rfd2lkdGg7Ci0gIGNvbnN0IGludCBpc19wcmVtdWx0X2FscGhhID0gV2ViUElzUHJlbXVsdGlwbGllZE1vZGUoY29sb3JzcGFjZSk7Ci0gIHVpbnQzMl90IGFscGhhX21hc2sgPSAweDBmOwotCi0gIHdoaWxlIChXZWJQUmVzY2FsZXJIYXNQZW5kaW5nT3V0cHV0KCZwLT5zY2FsZXJfYSkpIHsKLSAgICBpbnQgaTsKLSAgICBTQl9EQ0hFQ0socC0+bGFzdF95ICsgeV9wb3MgKyBudW1fbGluZXNfb3V0IDwgcC0+b3V0cHV0LT5oZWlnaHQpOwotICAgIFdlYlBSZXNjYWxlckV4cG9ydFJvdygmcC0+c2NhbGVyX2EpOwotICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgKytpKSB7Ci0gICAgICAvLyBGaWxsIGluIHRoZSBhbHBoYSB2YWx1ZSAoY29udmVydGVkIHRvIDQgYml0cykuCi0gICAgICBjb25zdCB1aW50MzJfdCBhbHBoYV92YWx1ZSA9IHAtPnNjYWxlcl9hLmRzdFtpXSA+PiA0OwotICAgICAgYWxwaGFfZHN0WzIgKiBpXSA9IChhbHBoYV9kc3RbMiAqIGldICYgMHhmMCkgfCBhbHBoYV92YWx1ZTsKLSAgICAgIGFscGhhX21hc2sgJj0gYWxwaGFfdmFsdWU7Ci0gICAgfQotICAgIGFscGhhX2RzdCArPSBidWYtPnN0cmlkZTsKLSAgICArK251bV9saW5lc19vdXQ7Ci0gIH0KLSAgaWYgKGlzX3ByZW11bHRfYWxwaGEgJiYgYWxwaGFfbWFzayAhPSAweDBmKSB7Ci0gICAgV2ViUEFwcGx5QWxwaGFNdWx0aXBseTQ0NDQoYmFzZV9yZ2JhLCB3aWR0aCwgbnVtX2xpbmVzX291dCwgYnVmLT5zdHJpZGUpOwotICB9Ci0gIHJldHVybiBudW1fbGluZXNfb3V0OwotfQotCi1zdGF0aWMgaW50IEVtaXRSZXNjYWxlZEFscGhhUkdCKGNvbnN0IFZQOElvKiBjb25zdCBpbywgV2ViUERlY1BhcmFtcyogY29uc3QgcCkgewotICBpZiAoaW8tPmEgIT0gTlVMTCkgewotICAgIFdlYlBSZXNjYWxlciogY29uc3Qgc2NhbGVyID0gJnAtPnNjYWxlcl9hOwotICAgIGludCBqID0gMDsKLSAgICBpbnQgcG9zID0gMDsKLSAgICB3aGlsZSAoaiA8IGlvLT5tYl9oKSB7Ci0gICAgICBqICs9IFdlYlBSZXNjYWxlckltcG9ydChzY2FsZXIsIGlvLT5tYl9oIC0gaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvLT5hICsgaiAqIGlvLT53aWR0aCwgaW8tPndpZHRoKTsKLSAgICAgIHBvcyArPSBwLT5lbWl0X2FscGhhX3JvdyhwLCBwb3MpOwotICAgIH0KLSAgfQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBJbml0UkdCUmVzY2FsZXIoY29uc3QgVlA4SW8qIGNvbnN0IGlvLCBXZWJQRGVjUGFyYW1zKiBjb25zdCBwKSB7Ci0gIGNvbnN0IGludCBoYXNfYWxwaGEgPSBXZWJQSXNBbHBoYU1vZGUocC0+b3V0cHV0LT5jb2xvcnNwYWNlKTsKLSAgY29uc3QgaW50IG91dF93aWR0aCAgPSBpby0+c2NhbGVkX3dpZHRoOwotICBjb25zdCBpbnQgb3V0X2hlaWdodCA9IGlvLT5zY2FsZWRfaGVpZ2h0OwotICBjb25zdCBpbnQgdXZfaW5fd2lkdGggID0gKGlvLT5tYl93ICsgMSkgPj4gMTsKLSAgY29uc3QgaW50IHV2X2luX2hlaWdodCA9IChpby0+bWJfaCArIDEpID4+IDE7Ci0gIGNvbnN0IHNpemVfdCB3b3JrX3NpemUgPSAyICogb3V0X3dpZHRoOyAgIC8vIHNjcmF0Y2ggbWVtb3J5IGZvciBvbmUgcmVzY2FsZXIKLSAgaW50MzJfdCogd29yazsgIC8vIHJlc2NhbGVycyB3b3JrIGFyZWEKLSAgdWludDhfdCogdG1wOyAgIC8vIHRtcCBzdG9yYWdlIGZvciBzY2FsZWQgWVVWNDQ0IHNhbXBsZXMgYmVmb3JlIFJHQiBjb252ZXJzaW9uCi0gIHNpemVfdCB0bXBfc2l6ZTEsIHRtcF9zaXplMjsKLQotICB0bXBfc2l6ZTEgPSAzICogd29ya19zaXplOwotICB0bXBfc2l6ZTIgPSAzICogb3V0X3dpZHRoOwotICBpZiAoaGFzX2FscGhhKSB7Ci0gICAgdG1wX3NpemUxICs9IHdvcmtfc2l6ZTsKLSAgICB0bXBfc2l6ZTIgKz0gb3V0X3dpZHRoOwotICB9Ci0gIHAtPm1lbW9yeSA9IFNiTWVtb3J5Q2FsbG9jKDEsIHRtcF9zaXplMSAqIHNpemVvZigqd29yaykgKyB0bXBfc2l6ZTIgKiBzaXplb2YoKnRtcCkpOwotICBpZiAocC0+bWVtb3J5ID09IE5VTEwpIHsKLSAgICByZXR1cm4gMDsgICAvLyBtZW1vcnkgZXJyb3IKLSAgfQotICB3b3JrID0gKGludDMyX3QqKXAtPm1lbW9yeTsKLSAgdG1wID0gKHVpbnQ4X3QqKSh3b3JrICsgdG1wX3NpemUxKTsKLSAgV2ViUFJlc2NhbGVySW5pdCgmcC0+c2NhbGVyX3ksIGlvLT5tYl93LCBpby0+bWJfaCwKLSAgICAgICAgICAgICAgICAgICB0bXAgKyAwICogb3V0X3dpZHRoLCBvdXRfd2lkdGgsIG91dF9oZWlnaHQsIDAsIDEsCi0gICAgICAgICAgICAgICAgICAgaW8tPm1iX3csIG91dF93aWR0aCwgaW8tPm1iX2gsIG91dF9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgd29yayArIDAgKiB3b3JrX3NpemUpOwotICBXZWJQUmVzY2FsZXJJbml0KCZwLT5zY2FsZXJfdSwgdXZfaW5fd2lkdGgsIHV2X2luX2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICB0bXAgKyAxICogb3V0X3dpZHRoLCBvdXRfd2lkdGgsIG91dF9oZWlnaHQsIDAsIDEsCi0gICAgICAgICAgICAgICAgICAgaW8tPm1iX3csIDIgKiBvdXRfd2lkdGgsIGlvLT5tYl9oLCAyICogb3V0X2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICB3b3JrICsgMSAqIHdvcmtfc2l6ZSk7Ci0gIFdlYlBSZXNjYWxlckluaXQoJnAtPnNjYWxlcl92LCB1dl9pbl93aWR0aCwgdXZfaW5faGVpZ2h0LAotICAgICAgICAgICAgICAgICAgIHRtcCArIDIgKiBvdXRfd2lkdGgsIG91dF93aWR0aCwgb3V0X2hlaWdodCwgMCwgMSwKLSAgICAgICAgICAgICAgICAgICBpby0+bWJfdywgMiAqIG91dF93aWR0aCwgaW8tPm1iX2gsIDIgKiBvdXRfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgIHdvcmsgKyAyICogd29ya19zaXplKTsKLSAgcC0+ZW1pdCA9IEVtaXRSZXNjYWxlZFJHQjsKLQotICBpZiAoaGFzX2FscGhhKSB7Ci0gICAgV2ViUFJlc2NhbGVySW5pdCgmcC0+c2NhbGVyX2EsIGlvLT5tYl93LCBpby0+bWJfaCwKLSAgICAgICAgICAgICAgICAgICAgIHRtcCArIDMgKiBvdXRfd2lkdGgsIG91dF93aWR0aCwgb3V0X2hlaWdodCwgMCwgMSwKLSAgICAgICAgICAgICAgICAgICAgIGlvLT5tYl93LCBvdXRfd2lkdGgsIGlvLT5tYl9oLCBvdXRfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgd29yayArIDMgKiB3b3JrX3NpemUpOwotICAgIHAtPmVtaXRfYWxwaGEgPSBFbWl0UmVzY2FsZWRBbHBoYVJHQjsKLSAgICBpZiAocC0+b3V0cHV0LT5jb2xvcnNwYWNlID09IE1PREVfUkdCQV80NDQ0IHx8Ci0gICAgICAgIHAtPm91dHB1dC0+Y29sb3JzcGFjZSA9PSBNT0RFX3JnYkFfNDQ0NCkgewotICAgICAgcC0+ZW1pdF9hbHBoYV9yb3cgPSBFeHBvcnRBbHBoYVJHQkE0NDQ0OwotICAgIH0gZWxzZSB7Ci0gICAgICBwLT5lbWl0X2FscGhhX3JvdyA9IEV4cG9ydEFscGhhOwotICAgIH0KLSAgfQotICByZXR1cm4gMTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIERlZmF1bHQgY3VzdG9tIGZ1bmN0aW9ucwotCi1zdGF0aWMgaW50IEN1c3RvbVNldHVwKFZQOElvKiBpbykgewotICBXZWJQRGVjUGFyYW1zKiBjb25zdCBwID0gKFdlYlBEZWNQYXJhbXMqKWlvLT5vcGFxdWU7Ci0gIGNvbnN0IFdFQlBfQ1NQX01PREUgY29sb3JzcGFjZSA9IHAtPm91dHB1dC0+Y29sb3JzcGFjZTsKLSAgY29uc3QgaW50IGlzX3JnYiA9IFdlYlBJc1JHQk1vZGUoY29sb3JzcGFjZSk7Ci0gIGNvbnN0IGludCBpc19hbHBoYSA9IFdlYlBJc0FscGhhTW9kZShjb2xvcnNwYWNlKTsKLQotICBwLT5tZW1vcnkgPSBOVUxMOwotICBwLT5lbWl0ID0gTlVMTDsKLSAgcC0+ZW1pdF9hbHBoYSA9IE5VTEw7Ci0gIHAtPmVtaXRfYWxwaGFfcm93ID0gTlVMTDsKLSAgaWYgKCFXZWJQSW9Jbml0RnJvbU9wdGlvbnMocC0+b3B0aW9ucywgaW8sIGlzX2FscGhhID8gTU9ERV9ZVVYgOiBNT0RFX1lVVkEpKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBpZiAoaW8tPnVzZV9zY2FsaW5nKSB7Ci0gICAgY29uc3QgaW50IG9rID0gaXNfcmdiID8gSW5pdFJHQlJlc2NhbGVyKGlvLCBwKSA6IEluaXRZVVZSZXNjYWxlcihpbywgcCk7Ci0gICAgaWYgKCFvaykgewotICAgICAgcmV0dXJuIDA7ICAgIC8vIG1lbW9yeSBlcnJvcgotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpZiAoaXNfcmdiKSB7Ci0gICAgICBwLT5lbWl0ID0gRW1pdFNhbXBsZWRSR0I7ICAgLy8gZGVmYXVsdAotI2lmZGVmIEZBTkNZX1VQU0FNUExJTkcKLSAgICAgIGlmIChpby0+ZmFuY3lfdXBzYW1wbGluZykgewotICAgICAgICBjb25zdCBpbnQgdXZfd2lkdGggPSAoaW8tPm1iX3cgKyAxKSA+PiAxOwotICAgICAgICBwLT5tZW1vcnkgPSBTYk1lbW9yeUFsbG9jYXRlKGlvLT5tYl93ICsgMiAqIHV2X3dpZHRoKTsKLSAgICAgICAgaWYgKHAtPm1lbW9yeSA9PSBOVUxMKSB7Ci0gICAgICAgICAgcmV0dXJuIDA7ICAgLy8gbWVtb3J5IGVycm9yLgotICAgICAgICB9Ci0gICAgICAgIHAtPnRtcF95ID0gKHVpbnQ4X3QqKXAtPm1lbW9yeTsKLSAgICAgICAgcC0+dG1wX3UgPSBwLT50bXBfeSArIGlvLT5tYl93OwotICAgICAgICBwLT50bXBfdiA9IHAtPnRtcF91ICsgdXZfd2lkdGg7Ci0gICAgICAgIHAtPmVtaXQgPSBFbWl0RmFuY3lSR0I7Ci0gICAgICAgIFdlYlBJbml0VXBzYW1wbGVycygpOwotICAgICAgfQotI2VuZGlmCi0gICAgfSBlbHNlIHsKLSAgICAgIHAtPmVtaXQgPSBFbWl0WVVWOwotICAgIH0KLSAgICBpZiAoaXNfYWxwaGEpIHsgIC8vIG5lZWQgdHJhbnNwYXJlbmN5IG91dHB1dAotICAgICAgaWYgKFdlYlBJc1ByZW11bHRpcGxpZWRNb2RlKGNvbG9yc3BhY2UpKSBXZWJQSW5pdFByZW11bHRpcGx5KCk7Ci0gICAgICBwLT5lbWl0X2FscGhhID0KLSAgICAgICAgICAoY29sb3JzcGFjZSA9PSBNT0RFX1JHQkFfNDQ0NCB8fCBjb2xvcnNwYWNlID09IE1PREVfcmdiQV80NDQ0KSA/Ci0gICAgICAgICAgICAgIEVtaXRBbHBoYVJHQkE0NDQ0Ci0gICAgICAgICAgOiBpc19yZ2IgPyBFbWl0QWxwaGFSR0IKLSAgICAgICAgICA6IEVtaXRBbHBoYVlVVjsKLSAgICB9Ci0gIH0KLQotICBpZiAoaXNfcmdiKSB7Ci0gICAgVlA4WVVWSW5pdCgpOwotICB9Ci0gIHJldHVybiAxOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgaW50IEN1c3RvbVB1dChjb25zdCBWUDhJbyogaW8pIHsKLSAgV2ViUERlY1BhcmFtcyogY29uc3QgcCA9IChXZWJQRGVjUGFyYW1zKilpby0+b3BhcXVlOwotICBjb25zdCBpbnQgbWJfdyA9IGlvLT5tYl93OwotICBjb25zdCBpbnQgbWJfaCA9IGlvLT5tYl9oOwotICBpbnQgbnVtX2xpbmVzX291dDsKLSAgU0JfRENIRUNLKCEoaW8tPm1iX3kgJiAxKSk7Ci0KLSAgaWYgKG1iX3cgPD0gMCB8fCBtYl9oIDw9IDApIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICBudW1fbGluZXNfb3V0ID0gcC0+ZW1pdChpbywgcCk7Ci0gIGlmIChwLT5lbWl0X2FscGhhKSB7Ci0gICAgcC0+ZW1pdF9hbHBoYShpbywgcCk7Ci0gIH0KLSAgcC0+bGFzdF95ICs9IG51bV9saW5lc19vdXQ7Ci0gIHJldHVybiAxOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCBDdXN0b21UZWFyZG93bihjb25zdCBWUDhJbyogaW8pIHsKLSAgV2ViUERlY1BhcmFtcyogY29uc3QgcCA9IChXZWJQRGVjUGFyYW1zKilpby0+b3BhcXVlOwotICBTYk1lbW9yeURlYWxsb2NhdGUocC0+bWVtb3J5KTsKLSAgcC0+bWVtb3J5ID0gTlVMTDsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE1haW4gZW50cnkgcG9pbnQKLQotdm9pZCBXZWJQSW5pdEN1c3RvbUlvKFdlYlBEZWNQYXJhbXMqIGNvbnN0IHBhcmFtcywgVlA4SW8qIGNvbnN0IGlvKSB7Ci0gIGlvLT5wdXQgICAgICA9IEN1c3RvbVB1dDsKLSAgaW8tPnNldHVwICAgID0gQ3VzdG9tU2V0dXA7Ci0gIGlvLT50ZWFyZG93biA9IEN1c3RvbVRlYXJkb3duOwotICBpby0+b3BhcXVlICAgPSBwYXJhbXM7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL2xheWVyLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kZWMvbGF5ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E3MDQyZi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kZWMvbGF5ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBFbmhhbmNlbWVudCBsYXllciAoZm9yIFlVVjQ0NC80MjIpCi0vLwotLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKLQotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNlbHNlCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgIi4vdnA4aS5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotaW50IFZQOERlY29kZUxheWVyKFZQOERlY29kZXIqIGNvbnN0IGRlYykgewotICBTQl9EQ0hFQ0soZGVjKTsKLSAgU0JfRENIRUNLKGRlYy0+bGF5ZXJfZGF0YV9zaXplXyA+IDApOwotICAodm9pZClkZWM7Ci0KLSAgLy8gVE9ETzogaGFuZGxlIGVuaGFuY2VtZW50IGxheWVyIGhlcmUuCi0KLSAgcmV0dXJuIDE7Ci19Ci0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL3F1YW50LmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kZWMvcXVhbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRjYzY5My4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kZWMvcXVhbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gUXVhbnRpemVyIGluaXRpYWxpemF0aW9uCi0vLwotLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKLQotI2luY2x1ZGUgIi4vdnA4aS5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotc3RhdGljIFdFQlBfSU5MSU5FIGludCBjbGlwKGludCB2LCBpbnQgTSkgewotICByZXR1cm4gdiA8IDAgPyAwIDogdiA+IE0gPyBNIDogdjsKLX0KLQotLy8gUGFyYWdyYXBoIDE0LjEKLXN0YXRpYyBjb25zdCB1aW50OF90IGtEY1RhYmxlWzEyOF0gPSB7Ci0gIDQsICAgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAxMCwgIDEwLAotICAxMSwgICAxMiwgIDEzLCAgMTQsICAxNSwgIDE2LCAgMTcsICAxNywKLSAgMTgsICAgMTksICAyMCwgIDIwLCAgMjEsICAyMSwgIDIyLCAgMjIsCi0gIDIzLCAgIDIzLCAgMjQsICAyNSwgIDI1LCAgMjYsICAyNywgIDI4LAotICAyOSwgICAzMCwgIDMxLCAgMzIsICAzMywgIDM0LCAgMzUsICAzNiwKLSAgMzcsICAgMzcsICAzOCwgIDM5LCAgNDAsICA0MSwgIDQyLCAgNDMsCi0gIDQ0LCAgIDQ1LCAgNDYsICA0NiwgIDQ3LCAgNDgsICA0OSwgIDUwLAotICA1MSwgICA1MiwgIDUzLCAgNTQsICA1NSwgIDU2LCAgNTcsICA1OCwKLSAgNTksICAgNjAsICA2MSwgIDYyLCAgNjMsICA2NCwgIDY1LCAgNjYsCi0gIDY3LCAgIDY4LCAgNjksICA3MCwgIDcxLCAgNzIsICA3MywgIDc0LAotICA3NSwgICA3NiwgIDc2LCAgNzcsICA3OCwgIDc5LCAgODAsICA4MSwKLSAgODIsICAgODMsICA4NCwgIDg1LCAgODYsICA4NywgIDg4LCAgODksCi0gIDkxLCAgIDkzLCAgOTUsICA5NiwgIDk4LCAxMDAsIDEwMSwgMTAyLAotICAxMDQsIDEwNiwgMTA4LCAxMTAsIDExMiwgMTE0LCAxMTYsIDExOCwKLSAgMTIyLCAxMjQsIDEyNiwgMTI4LCAxMzAsIDEzMiwgMTM0LCAxMzYsCi0gIDEzOCwgMTQwLCAxNDMsIDE0NSwgMTQ4LCAxNTEsIDE1NCwgMTU3Ci19OwotCi1zdGF0aWMgY29uc3QgdWludDE2X3Qga0FjVGFibGVbMTI4XSA9IHsKLSAgNCwgICAgIDUsICAgNiwgICA3LCAgIDgsICAgOSwgIDEwLCAgMTEsCi0gIDEyLCAgIDEzLCAgMTQsICAxNSwgIDE2LCAgMTcsICAxOCwgIDE5LAotICAyMCwgICAyMSwgIDIyLCAgMjMsICAyNCwgIDI1LCAgMjYsICAyNywKLSAgMjgsICAgMjksICAzMCwgIDMxLCAgMzIsICAzMywgIDM0LCAgMzUsCi0gIDM2LCAgIDM3LCAgMzgsICAzOSwgIDQwLCAgNDEsICA0MiwgIDQzLAotICA0NCwgICA0NSwgIDQ2LCAgNDcsICA0OCwgIDQ5LCAgNTAsICA1MSwKLSAgNTIsICAgNTMsICA1NCwgIDU1LCAgNTYsICA1NywgIDU4LCAgNjAsCi0gIDYyLCAgIDY0LCAgNjYsICA2OCwgIDcwLCAgNzIsICA3NCwgIDc2LAotICA3OCwgICA4MCwgIDgyLCAgODQsICA4NiwgIDg4LCAgOTAsICA5MiwKLSAgOTQsICAgOTYsICA5OCwgMTAwLCAxMDIsIDEwNCwgMTA2LCAxMDgsCi0gIDExMCwgMTEyLCAxMTQsIDExNiwgMTE5LCAxMjIsIDEyNSwgMTI4LAotICAxMzEsIDEzNCwgMTM3LCAxNDAsIDE0MywgMTQ2LCAxNDksIDE1MiwKLSAgMTU1LCAxNTgsIDE2MSwgMTY0LCAxNjcsIDE3MCwgMTczLCAxNzcsCi0gIDE4MSwgMTg1LCAxODksIDE5MywgMTk3LCAyMDEsIDIwNSwgMjA5LAotICAyMTMsIDIxNywgMjIxLCAyMjUsIDIyOSwgMjM0LCAyMzksIDI0NSwKLSAgMjQ5LCAyNTQsIDI1OSwgMjY0LCAyNjksIDI3NCwgMjc5LCAyODQKLX07Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBQYXJhZ3JhcGggOS42Ci0KLXZvaWQgVlA4UGFyc2VRdWFudChWUDhEZWNvZGVyKiBjb25zdCBkZWMpIHsKLSAgVlA4Qml0UmVhZGVyKiBjb25zdCBiciA9ICZkZWMtPmJyXzsKLSAgY29uc3QgaW50IGJhc2VfcTAgPSBWUDhHZXRWYWx1ZShiciwgNyk7Ci0gIGNvbnN0IGludCBkcXkxX2RjID0gVlA4R2V0KGJyKSA/IFZQOEdldFNpZ25lZFZhbHVlKGJyLCA0KSA6IDA7Ci0gIGNvbnN0IGludCBkcXkyX2RjID0gVlA4R2V0KGJyKSA/IFZQOEdldFNpZ25lZFZhbHVlKGJyLCA0KSA6IDA7Ci0gIGNvbnN0IGludCBkcXkyX2FjID0gVlA4R2V0KGJyKSA/IFZQOEdldFNpZ25lZFZhbHVlKGJyLCA0KSA6IDA7Ci0gIGNvbnN0IGludCBkcXV2X2RjID0gVlA4R2V0KGJyKSA/IFZQOEdldFNpZ25lZFZhbHVlKGJyLCA0KSA6IDA7Ci0gIGNvbnN0IGludCBkcXV2X2FjID0gVlA4R2V0KGJyKSA/IFZQOEdldFNpZ25lZFZhbHVlKGJyLCA0KSA6IDA7Ci0KLSAgY29uc3QgVlA4U2VnbWVudEhlYWRlciogY29uc3QgaGRyID0gJmRlYy0+c2VnbWVudF9oZHJfOwotICBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgTlVNX01CX1NFR01FTlRTOyArK2kpIHsKLSAgICBpbnQgcTsKLSAgICBpZiAoaGRyLT51c2Vfc2VnbWVudF8pIHsKLSAgICAgIHEgPSBoZHItPnF1YW50aXplcl9baV07Ci0gICAgICBpZiAoIWhkci0+YWJzb2x1dGVfZGVsdGFfKSB7Ci0gICAgICAgIHEgKz0gYmFzZV9xMDsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgIGRlYy0+ZHFtX1tpXSA9IGRlYy0+ZHFtX1swXTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBxID0gYmFzZV9xMDsKLSAgICAgIH0KLSAgICB9Ci0gICAgewotICAgICAgVlA4UXVhbnRNYXRyaXgqIGNvbnN0IG0gPSAmZGVjLT5kcW1fW2ldOwotICAgICAgbS0+eTFfbWF0X1swXSA9IGtEY1RhYmxlW2NsaXAocSArIGRxeTFfZGMsIDEyNyldOwotICAgICAgbS0+eTFfbWF0X1sxXSA9IGtBY1RhYmxlW2NsaXAocSArIDAsICAgICAgIDEyNyldOwotCi0gICAgICBtLT55Ml9tYXRfWzBdID0ga0RjVGFibGVbY2xpcChxICsgZHF5Ml9kYywgMTI3KV0gKiAyOwotICAgICAgLy8gRm9yIGFsbCB4IGluIFswLi4yODRdLCB4KjE1NS8xMDAgaXMgYml0d2lzZSBlcXVhbCB0byAoeCoxMDE1ODEpID4+IDE2LgotICAgICAgLy8gVGhlIHNtYWxsZXN0IHByZWNpc2lvbiBmb3IgdGhhdCBpcyAnKHgqNjM0OSkgPj4gMTInIGJ1dCAxNiBpcyBhIGdvb2QKLSAgICAgIC8vIHdvcmQgc2l6ZS4KLSAgICAgIG0tPnkyX21hdF9bMV0gPSAoa0FjVGFibGVbY2xpcChxICsgZHF5Ml9hYywgMTI3KV0gKiAxMDE1ODEpID4+IDE2OwotICAgICAgaWYgKG0tPnkyX21hdF9bMV0gPCA4KSBtLT55Ml9tYXRfWzFdID0gODsKLQotICAgICAgbS0+dXZfbWF0X1swXSA9IGtEY1RhYmxlW2NsaXAocSArIGRxdXZfZGMsIDExNyldOwotICAgICAgbS0+dXZfbWF0X1sxXSA9IGtBY1RhYmxlW2NsaXAocSArIGRxdXZfYWMsIDEyNyldOwotICAgIH0KLSAgfQotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RlYy90cmVlLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kZWMvdHJlZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2IzMmZjLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RlYy90cmVlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1OTUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIENvZGluZyB0cmVlcyBhbmQgcHJvYmFzCi0vLwotLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKLQotI2luY2x1ZGUgInZwOGkuaCIKLQotI2RlZmluZSBVU0VfR0VORVJJQ19UUkVFCi0KLSNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpZmRlZiBVU0VfR0VORVJJQ19UUkVFCi1zdGF0aWMgY29uc3QgaW50OF90IGtZTW9kZXNJbnRyYTRbMThdID0gewotICAtQl9EQ19QUkVELCAxLAotICAgIC1CX1RNX1BSRUQsIDIsCi0gICAgICAtQl9WRV9QUkVELCAzLAotICAgICAgICA0LCA2LAotICAgICAgICAgIC1CX0hFX1BSRUQsIDUsCi0gICAgICAgICAgICAtQl9SRF9QUkVELCAtQl9WUl9QUkVELAotICAgICAgICAtQl9MRF9QUkVELCA3LAotICAgICAgICAgIC1CX1ZMX1BSRUQsIDgsCi0gICAgICAgICAgICAtQl9IRF9QUkVELCAtQl9IVV9QUkVECi19OwotI2VuZGlmCi0KLSNpZm5kZWYgT05MWV9LRVlGUkFNRV9DT0RFCi0KLS8vIGludGVyIHByZWRpY3Rpb24gbW9kZXMKLWVudW0gewotICBMRUZUNCA9IDAsIEFCT1ZFNCA9IDEsIFpFUk80ID0gMiwgTkVXNCA9IDMsCi0gIE5FQVJFU1RNViwgTkVBUk1WLCBaRVJPTVYsIE5FV01WLCBTUExJVE1WIH07Ci0KLXN0YXRpYyBjb25zdCBpbnQ4X3Qga1lNb2Rlc0ludGVyWzhdID0gewotICAtRENfUFJFRCwgMSwKLSAgICAyLCAzLAotICAgICAgLVZfUFJFRCwgLUhfUFJFRCwKLSAgICAgIC1UTV9QUkVELCAtQl9QUkVECi19OwotCi1zdGF0aWMgY29uc3QgaW50OF90IGtNQlNwbGl0WzZdID0gewotICAtMywgMSwKLSAgICAtMiwgMiwKLSAgICAgIC0wLCAtMQotfTsKLQotc3RhdGljIGNvbnN0IGludDhfdCBrTVZSZWZbOF0gPSB7Ci0gIC1aRVJPTVYsIDEsCi0gICAgLU5FQVJFU1RNViwgMiwKLSAgICAgIC1ORUFSTVYsIDMsCi0gICAgICAgIC1ORVdNViwgLVNQTElUTVYKLX07Ci0KLXN0YXRpYyBjb25zdCBpbnQ4X3Qga01WUmVmNFs2XSA9IHsKLSAgLUxFRlQ0LCAxLAotICAgIC1BQk9WRTQsIDIsCi0gICAgICAtWkVSTzQsIC1ORVc0Ci19OwotI2VuZGlmCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBEZWZhdWx0IHByb2JhYmlsaXRpZXMKLQotLy8gSW50ZXIKLSNpZm5kZWYgT05MWV9LRVlGUkFNRV9DT0RFCi1zdGF0aWMgY29uc3QgdWludDhfdCBrWU1vZGVQcm9iYUludGVyMFs0XSA9IHsgMTEyLCA4NiwgMTQwLCAzNyB9Owotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga1VWTW9kZVByb2JhSW50ZXIwWzNdID0geyAxNjIsIDEwMSwgMjA0IH07Ci1zdGF0aWMgY29uc3QgdWludDhfdCBrTVZQcm9iYTBbMl1bTlVNX01WX1BST0JBU10gPSB7Ci0gIHsgMTYyLCAxMjgsIDIyNSwgMTQ2LCAxNzIsIDE0NywgMjE0LCAgMzksCi0gICAgMTU2LCAxMjgsIDEyOSwgMTMyLCAgNzUsIDE0NSwgMTc4LCAyMDYsCi0gICAgMjM5LCAyNTQsIDI1NCB9LAotICB7IDE2NCwgMTI4LCAyMDQsIDE3MCwgMTE5LCAyMzUsIDE0MCwgMjMwLAotICAgIDIyOCwgMTI4LCAxMzAsIDEzMCwgIDc0LCAxNDgsIDE4MCwgMjAzLAotICAgIDIzNiwgMjU0LCAyNTQgfQotfTsKLSNlbmRpZgotCi0vLyBQYXJhZ3JhcGggMTMuNQotc3RhdGljIGNvbnN0IHVpbnQ4X3QKLSAgQ29lZmZzUHJvYmEwW05VTV9UWVBFU11bTlVNX0JBTkRTXVtOVU1fQ1RYXVtOVU1fUFJPQkFTXSA9IHsKLSAgLy8gZ2VuZXJlYXRlZCB1c2luZyB2cDhfZGVmYXVsdF9jb2VmX3Byb2JzKCkgaW4gZW50cm9weS5jOjEyOQotICB7IHsgeyAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAotICAgICAgeyAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAotICAgICAgeyAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9Ci0gICAgfSwKLSAgICB7IHsgMjUzLCAxMzYsIDI1NCwgMjU1LCAyMjgsIDIxOSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKLSAgICAgIHsgMTg5LCAxMjksIDI0MiwgMjU1LCAyMjcsIDIxMywgMjU1LCAyMTksIDEyOCwgMTI4LCAxMjggfSwKLSAgICAgIHsgMTA2LCAxMjYsIDIyNywgMjUyLCAyMTQsIDIwOSwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfQotICAgIH0sCi0gICAgeyB7IDEsIDk4LCAyNDgsIDI1NSwgMjM2LCAyMjYsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4IH0sCi0gICAgICB7IDE4MSwgMTMzLCAyMzgsIDI1NCwgMjIxLCAyMzQsIDI1NSwgMTU0LCAxMjgsIDEyOCwgMTI4IH0sCi0gICAgICB7IDc4LCAxMzQsIDIwMiwgMjQ3LCAxOTgsIDE4MCwgMjU1LCAyMTksIDEyOCwgMTI4LCAxMjggfSwKLSAgICB9LAotICAgIHsgeyAxLCAxODUsIDI0OSwgMjU1LCAyNDMsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKLSAgICAgIHsgMTg0LCAxNTAsIDI0NywgMjU1LCAyMzYsIDIyNCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKLSAgICAgIHsgNzcsIDExMCwgMjE2LCAyNTUsIDIzNiwgMjMwLCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAotICAgIH0sCi0gICAgeyB7IDEsIDEwMSwgMjUxLCAyNTUsIDI0MSwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAotICAgICAgeyAxNzAsIDEzOSwgMjQxLCAyNTIsIDIzNiwgMjA5LCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCB9LAotICAgICAgeyAzNywgMTE2LCAxOTYsIDI0MywgMjI4LCAyNTUsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4IH0KLSAgICB9LAotICAgIHsgeyAxLCAyMDQsIDI1NCwgMjU1LCAyNDUsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKLSAgICAgIHsgMjA3LCAxNjAsIDI1MCwgMjU1LCAyMzgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKLSAgICAgIHsgMTAyLCAxMDMsIDIzMSwgMjU1LCAyMTEsIDE3MSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfQotICAgIH0sCi0gICAgeyB7IDEsIDE1MiwgMjUyLCAyNTUsIDI0MCwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAotICAgICAgeyAxNzcsIDEzNSwgMjQzLCAyNTUsIDIzNCwgMjI1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAotICAgICAgeyA4MCwgMTI5LCAyMTEsIDI1NSwgMTk0LCAyMjQsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0KLSAgICB9LAotICAgIHsgeyAxLCAxLCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCi0gICAgICB7IDI0NiwgMSwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAotICAgICAgeyAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9Ci0gICAgfQotICB9LAotICB7IHsgeyAxOTgsIDM1LCAyMzcsIDIyMywgMTkzLCAxODcsIDE2MiwgMTYwLCAxNDUsIDE1NSwgNjIgfSwKLSAgICAgIHsgMTMxLCA0NSwgMTk4LCAyMjEsIDE3MiwgMTc2LCAyMjAsIDE1NywgMjUyLCAyMjEsIDEgfSwKLSAgICAgIHsgNjgsIDQ3LCAxNDYsIDIwOCwgMTQ5LCAxNjcsIDIyMSwgMTYyLCAyNTUsIDIyMywgMTI4IH0KLSAgICB9LAotICAgIHsgeyAxLCAxNDksIDI0MSwgMjU1LCAyMjEsIDIyNCwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfSwKLSAgICAgIHsgMTg0LCAxNDEsIDIzNCwgMjUzLCAyMjIsIDIyMCwgMjU1LCAxOTksIDEyOCwgMTI4LCAxMjggfSwKLSAgICAgIHsgODEsIDk5LCAxODEsIDI0MiwgMTc2LCAxOTAsIDI0OSwgMjAyLCAyNTUsIDI1NSwgMTI4IH0KLSAgICB9LAotICAgIHsgeyAxLCAxMjksIDIzMiwgMjUzLCAyMTQsIDE5NywgMjQyLCAxOTYsIDI1NSwgMjU1LCAxMjggfSwKLSAgICAgIHsgOTksIDEyMSwgMjEwLCAyNTAsIDIwMSwgMTk4LCAyNTUsIDIwMiwgMTI4LCAxMjgsIDEyOCB9LAotICAgICAgeyAyMywgOTEsIDE2MywgMjQyLCAxNzAsIDE4NywgMjQ3LCAyMTAsIDI1NSwgMjU1LCAxMjggfQotICAgIH0sCi0gICAgeyB7IDEsIDIwMCwgMjQ2LCAyNTUsIDIzNCwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAotICAgICAgeyAxMDksIDE3OCwgMjQxLCAyNTUsIDIzMSwgMjQ1LCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCB9LAotICAgICAgeyA0NCwgMTMwLCAyMDEsIDI1MywgMjA1LCAxOTIsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4IH0KLSAgICB9LAotICAgIHsgeyAxLCAxMzIsIDIzOSwgMjUxLCAyMTksIDIwOSwgMjU1LCAxNjUsIDEyOCwgMTI4LCAxMjggfSwKLSAgICAgIHsgOTQsIDEzNiwgMjI1LCAyNTEsIDIxOCwgMTkwLCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCB9LAotICAgICAgeyAyMiwgMTAwLCAxNzQsIDI0NSwgMTg2LCAxNjEsIDI1NSwgMTk5LCAxMjgsIDEyOCwgMTI4IH0KLSAgICB9LAotICAgIHsgeyAxLCAxODIsIDI0OSwgMjU1LCAyMzIsIDIzNSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKLSAgICAgIHsgMTI0LCAxNDMsIDI0MSwgMjU1LCAyMjcsIDIzNCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKLSAgICAgIHsgMzUsIDc3LCAxODEsIDI1MSwgMTkzLCAyMTEsIDI1NSwgMjA1LCAxMjgsIDEyOCwgMTI4IH0KLSAgICB9LAotICAgIHsgeyAxLCAxNTcsIDI0NywgMjU1LCAyMzYsIDIzMSwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfSwKLSAgICAgIHsgMTIxLCAxNDEsIDIzNSwgMjU1LCAyMjUsIDIyNywgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfSwKLSAgICAgIHsgNDUsIDk5LCAxODgsIDI1MSwgMTk1LCAyMTcsIDI1NSwgMjI0LCAxMjgsIDEyOCwgMTI4IH0KLSAgICB9LAotICAgIHsgeyAxLCAxLCAyNTEsIDI1NSwgMjEzLCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCi0gICAgICB7IDIwMywgMSwgMjQ4LCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAotICAgICAgeyAxMzcsIDEsIDE3NywgMjU1LCAyMjQsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfQotICAgIH0KLSAgfSwKLSAgeyB7IHsgMjUzLCA5LCAyNDgsIDI1MSwgMjA3LCAyMDgsIDI1NSwgMTkyLCAxMjgsIDEyOCwgMTI4IH0sCi0gICAgICB7IDE3NSwgMTMsIDIyNCwgMjQzLCAxOTMsIDE4NSwgMjQ5LCAxOTgsIDI1NSwgMjU1LCAxMjggfSwKLSAgICAgIHsgNzMsIDE3LCAxNzEsIDIyMSwgMTYxLCAxNzksIDIzNiwgMTY3LCAyNTUsIDIzNCwgMTI4IH0KLSAgICB9LAotICAgIHsgeyAxLCA5NSwgMjQ3LCAyNTMsIDIxMiwgMTgzLCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCB9LAotICAgICAgeyAyMzksIDkwLCAyNDQsIDI1MCwgMjExLCAyMDksIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4IH0sCi0gICAgICB7IDE1NSwgNzcsIDE5NSwgMjQ4LCAxODgsIDE5NSwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfQotICAgIH0sCi0gICAgeyB7IDEsIDI0LCAyMzksIDI1MSwgMjE4LCAyMTksIDI1NSwgMjA1LCAxMjgsIDEyOCwgMTI4IH0sCi0gICAgICB7IDIwMSwgNTEsIDIxOSwgMjU1LCAxOTYsIDE4NiwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKLSAgICAgIHsgNjksIDQ2LCAxOTAsIDIzOSwgMjAxLCAyMTgsIDI1NSwgMjI4LCAxMjgsIDEyOCwgMTI4IH0KLSAgICB9LAotICAgIHsgeyAxLCAxOTEsIDI1MSwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKLSAgICAgIHsgMjIzLCAxNjUsIDI0OSwgMjU1LCAyMTMsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKLSAgICAgIHsgMTQxLCAxMjQsIDI0OCwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfQotICAgIH0sCi0gICAgeyB7IDEsIDE2LCAyNDgsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCi0gICAgICB7IDE5MCwgMzYsIDIzMCwgMjU1LCAyMzYsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKLSAgICAgIHsgMTQ5LCAxLCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0KLSAgICB9LAotICAgIHsgeyAxLCAyMjYsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKLSAgICAgIHsgMjQ3LCAxOTIsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKLSAgICAgIHsgMjQwLCAxMjgsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfQotICAgIH0sCi0gICAgeyB7IDEsIDEzNCwgMjUyLCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAotICAgICAgeyAyMTMsIDYyLCAyNTAsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCi0gICAgICB7IDU1LCA5MywgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9Ci0gICAgfSwKLSAgICB7IHsgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKLSAgICAgIHsgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKLSAgICAgIHsgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfQotICAgIH0KLSAgfSwKLSAgeyB7IHsgMjAyLCAyNCwgMjEzLCAyMzUsIDE4NiwgMTkxLCAyMjAsIDE2MCwgMjQwLCAxNzUsIDI1NSB9LAotICAgICAgeyAxMjYsIDM4LCAxODIsIDIzMiwgMTY5LCAxODQsIDIyOCwgMTc0LCAyNTUsIDE4NywgMTI4IH0sCi0gICAgICB7IDYxLCA0NiwgMTM4LCAyMTksIDE1MSwgMTc4LCAyNDAsIDE3MCwgMjU1LCAyMTYsIDEyOCB9Ci0gICAgfSwKLSAgICB7IHsgMSwgMTEyLCAyMzAsIDI1MCwgMTk5LCAxOTEsIDI0NywgMTU5LCAyNTUsIDI1NSwgMTI4IH0sCi0gICAgICB7IDE2NiwgMTA5LCAyMjgsIDI1MiwgMjExLCAyMTUsIDI1NSwgMTc0LCAxMjgsIDEyOCwgMTI4IH0sCi0gICAgICB7IDM5LCA3NywgMTYyLCAyMzIsIDE3MiwgMTgwLCAyNDUsIDE3OCwgMjU1LCAyNTUsIDEyOCB9Ci0gICAgfSwKLSAgICB7IHsgMSwgNTIsIDIyMCwgMjQ2LCAxOTgsIDE5OSwgMjQ5LCAyMjAsIDI1NSwgMjU1LCAxMjggfSwKLSAgICAgIHsgMTI0LCA3NCwgMTkxLCAyNDMsIDE4MywgMTkzLCAyNTAsIDIyMSwgMjU1LCAyNTUsIDEyOCB9LAotICAgICAgeyAyNCwgNzEsIDEzMCwgMjE5LCAxNTQsIDE3MCwgMjQzLCAxODIsIDI1NSwgMjU1LCAxMjggfQotICAgIH0sCi0gICAgeyB7IDEsIDE4MiwgMjI1LCAyNDksIDIxOSwgMjQwLCAyNTUsIDIyNCwgMTI4LCAxMjgsIDEyOCB9LAotICAgICAgeyAxNDksIDE1MCwgMjI2LCAyNTIsIDIxNiwgMjA1LCAyNTUsIDE3MSwgMTI4LCAxMjgsIDEyOCB9LAotICAgICAgeyAyOCwgMTA4LCAxNzAsIDI0MiwgMTgzLCAxOTQsIDI1NCwgMjIzLCAyNTUsIDI1NSwgMTI4IH0KLSAgICB9LAotICAgIHsgeyAxLCA4MSwgMjMwLCAyNTIsIDIwNCwgMjAzLCAyNTUsIDE5MiwgMTI4LCAxMjgsIDEyOCB9LAotICAgICAgeyAxMjMsIDEwMiwgMjA5LCAyNDcsIDE4OCwgMTk2LCAyNTUsIDIzMywgMTI4LCAxMjgsIDEyOCB9LAotICAgICAgeyAyMCwgOTUsIDE1MywgMjQzLCAxNjQsIDE3MywgMjU1LCAyMDMsIDEyOCwgMTI4LCAxMjggfQotICAgIH0sCi0gICAgeyB7IDEsIDIyMiwgMjQ4LCAyNTUsIDIxNiwgMjEzLCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAotICAgICAgeyAxNjgsIDE3NSwgMjQ2LCAyNTIsIDIzNSwgMjA1LCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCB9LAotICAgICAgeyA0NywgMTE2LCAyMTUsIDI1NSwgMjExLCAyMTIsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4IH0KLSAgICB9LAotICAgIHsgeyAxLCAxMjEsIDIzNiwgMjUzLCAyMTIsIDIxNCwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfSwKLSAgICAgIHsgMTQxLCA4NCwgMjEzLCAyNTIsIDIwMSwgMjAyLCAyNTUsIDIxOSwgMTI4LCAxMjgsIDEyOCB9LAotICAgICAgeyA0MiwgODAsIDE2MCwgMjQwLCAxNjIsIDE4NSwgMjU1LCAyMDUsIDEyOCwgMTI4LCAxMjggfQotICAgIH0sCi0gICAgeyB7IDEsIDEsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKLSAgICAgIHsgMjQ0LCAxLCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCi0gICAgICB7IDIzOCwgMSwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9Ci0gICAgfQotICB9Ci19OwotCi0vLyBQYXJhZ3JhcGggMTEuNQotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0JNb2Rlc1Byb2JhW05VTV9CTU9ERVNdW05VTV9CTU9ERVNdW05VTV9CTU9ERVMgLSAxXSA9IHsKLSAgeyB7IDIzMSwgMTIwLCA0OCwgODksIDExNSwgMTEzLCAxMjAsIDE1MiwgMTEyIH0sCi0gICAgeyAxNTIsIDE3OSwgNjQsIDEyNiwgMTcwLCAxMTgsIDQ2LCA3MCwgOTUgfSwKLSAgICB7IDE3NSwgNjksIDE0MywgODAsIDg1LCA4MiwgNzIsIDE1NSwgMTAzIH0sCi0gICAgeyA1NiwgNTgsIDEwLCAxNzEsIDIxOCwgMTg5LCAxNywgMTMsIDE1MiB9LAotICAgIHsgMTE0LCAyNiwgMTcsIDE2MywgNDQsIDE5NSwgMjEsIDEwLCAxNzMgfSwKLSAgICB7IDEyMSwgMjQsIDgwLCAxOTUsIDI2LCA2MiwgNDQsIDY0LCA4NSB9LAotICAgIHsgMTQ0LCA3MSwgMTAsIDM4LCAxNzEsIDIxMywgMTQ0LCAzNCwgMjYgfSwKLSAgICB7IDE3MCwgNDYsIDU1LCAxOSwgMTM2LCAxNjAsIDMzLCAyMDYsIDcxIH0sCi0gICAgeyA2MywgMjAsIDgsIDExNCwgMTE0LCAyMDgsIDEyLCA5LCAyMjYgfSwKLSAgICB7IDgxLCA0MCwgMTEsIDk2LCAxODIsIDg0LCAyOSwgMTYsIDM2IH0gfSwKLSAgeyB7IDEzNCwgMTgzLCA4OSwgMTM3LCA5OCwgMTAxLCAxMDYsIDE2NSwgMTQ4IH0sCi0gICAgeyA3MiwgMTg3LCAxMDAsIDEzMCwgMTU3LCAxMTEsIDMyLCA3NSwgODAgfSwKLSAgICB7IDY2LCAxMDIsIDE2NywgOTksIDc0LCA2MiwgNDAsIDIzNCwgMTI4IH0sCi0gICAgeyA0MSwgNTMsIDksIDE3OCwgMjQxLCAxNDEsIDI2LCA4LCAxMDcgfSwKLSAgICB7IDc0LCA0MywgMjYsIDE0NiwgNzMsIDE2NiwgNDksIDIzLCAxNTcgfSwKLSAgICB7IDY1LCAzOCwgMTA1LCAxNjAsIDUxLCA1MiwgMzEsIDExNSwgMTI4IH0sCi0gICAgeyAxMDQsIDc5LCAxMiwgMjcsIDIxNywgMjU1LCA4NywgMTcsIDcgfSwKLSAgICB7IDg3LCA2OCwgNzEsIDQ0LCAxMTQsIDUxLCAxNSwgMTg2LCAyMyB9LAotICAgIHsgNDcsIDQxLCAxNCwgMTEwLCAxODIsIDE4MywgMjEsIDE3LCAxOTQgfSwKLSAgICB7IDY2LCA0NSwgMjUsIDEwMiwgMTk3LCAxODksIDIzLCAxOCwgMjIgfSB9LAotICB7IHsgODgsIDg4LCAxNDcsIDE1MCwgNDIsIDQ2LCA0NSwgMTk2LCAyMDUgfSwKLSAgICB7IDQzLCA5NywgMTgzLCAxMTcsIDg1LCAzOCwgMzUsIDE3OSwgNjEgfSwKLSAgICB7IDM5LCA1MywgMjAwLCA4NywgMjYsIDIxLCA0MywgMjMyLCAxNzEgfSwKLSAgICB7IDU2LCAzNCwgNTEsIDEwNCwgMTE0LCAxMDIsIDI5LCA5MywgNzcgfSwKLSAgICB7IDM5LCAyOCwgODUsIDE3MSwgNTgsIDE2NSwgOTAsIDk4LCA2NCB9LAotICAgIHsgMzQsIDIyLCAxMTYsIDIwNiwgMjMsIDM0LCA0MywgMTY2LCA3MyB9LAotICAgIHsgMTA3LCA1NCwgMzIsIDI2LCA1MSwgMSwgODEsIDQzLCAzMSB9LAotICAgIHsgNjgsIDI1LCAxMDYsIDIyLCA2NCwgMTcxLCAzNiwgMjI1LCAxMTQgfSwKLSAgICB7IDM0LCAxOSwgMjEsIDEwMiwgMTMyLCAxODgsIDE2LCA3NiwgMTI0IH0sCi0gICAgeyA2MiwgMTgsIDc4LCA5NSwgODUsIDU3LCA1MCwgNDgsIDUxIH0gfSwKLSAgeyB7IDE5MywgMTAxLCAzNSwgMTU5LCAyMTUsIDExMSwgODksIDQ2LCAxMTEgfSwKLSAgICB7IDYwLCAxNDgsIDMxLCAxNzIsIDIxOSwgMjI4LCAyMSwgMTgsIDExMSB9LAotICAgIHsgMTEyLCAxMTMsIDc3LCA4NSwgMTc5LCAyNTUsIDM4LCAxMjAsIDExNCB9LAotICAgIHsgNDAsIDQyLCAxLCAxOTYsIDI0NSwgMjA5LCAxMCwgMjUsIDEwOSB9LAotICAgIHsgODgsIDQzLCAyOSwgMTQwLCAxNjYsIDIxMywgMzcsIDQzLCAxNTQgfSwKLSAgICB7IDYxLCA2MywgMzAsIDE1NSwgNjcsIDQ1LCA2OCwgMSwgMjA5IH0sCi0gICAgeyAxMDAsIDgwLCA4LCA0MywgMTU0LCAxLCA1MSwgMjYsIDcxIH0sCi0gICAgeyAxNDIsIDc4LCA3OCwgMTYsIDI1NSwgMTI4LCAzNCwgMTk3LCAxNzEgfSwKLSAgICB7IDQxLCA0MCwgNSwgMTAyLCAyMTEsIDE4MywgNCwgMSwgMjIxIH0sCi0gICAgeyA1MSwgNTAsIDE3LCAxNjgsIDIwOSwgMTkyLCAyMywgMjUsIDgyIH0gfSwKLSAgeyB7IDEzOCwgMzEsIDM2LCAxNzEsIDI3LCAxNjYsIDM4LCA0NCwgMjI5IH0sCi0gICAgeyA2NywgODcsIDU4LCAxNjksIDgyLCAxMTUsIDI2LCA1OSwgMTc5IH0sCi0gICAgeyA2MywgNTksIDkwLCAxODAsIDU5LCAxNjYsIDkzLCA3MywgMTU0IH0sCi0gICAgeyA0MCwgNDAsIDIxLCAxMTYsIDE0MywgMjA5LCAzNCwgMzksIDE3NSB9LAotICAgIHsgNDcsIDE1LCAxNiwgMTgzLCAzNCwgMjIzLCA0OSwgNDUsIDE4MyB9LAotICAgIHsgNDYsIDE3LCAzMywgMTgzLCA2LCA5OCwgMTUsIDMyLCAxODMgfSwKLSAgICB7IDU3LCA0NiwgMjIsIDI0LCAxMjgsIDEsIDU0LCAxNywgMzcgfSwKLSAgICB7IDY1LCAzMiwgNzMsIDExNSwgMjgsIDEyOCwgMjMsIDEyOCwgMjA1IH0sCi0gICAgeyA0MCwgMywgOSwgMTE1LCA1MSwgMTkyLCAxOCwgNiwgMjIzIH0sCi0gICAgeyA4NywgMzcsIDksIDExNSwgNTksIDc3LCA2NCwgMjEsIDQ3IH0gfSwKLSAgeyB7IDEwNCwgNTUsIDQ0LCAyMTgsIDksIDU0LCA1MywgMTMwLCAyMjYgfSwKLSAgICB7IDY0LCA5MCwgNzAsIDIwNSwgNDAsIDQxLCAyMywgMjYsIDU3IH0sCi0gICAgeyA1NCwgNTcsIDExMiwgMTg0LCA1LCA0MSwgMzgsIDE2NiwgMjEzIH0sCi0gICAgeyAzMCwgMzQsIDI2LCAxMzMsIDE1MiwgMTE2LCAxMCwgMzIsIDEzNCB9LAotICAgIHsgMzksIDE5LCA1MywgMjIxLCAyNiwgMTE0LCAzMiwgNzMsIDI1NSB9LAotICAgIHsgMzEsIDksIDY1LCAyMzQsIDIsIDE1LCAxLCAxMTgsIDczIH0sCi0gICAgeyA3NSwgMzIsIDEyLCA1MSwgMTkyLCAyNTUsIDE2MCwgNDMsIDUxIH0sCi0gICAgeyA4OCwgMzEsIDM1LCA2NywgMTAyLCA4NSwgNTUsIDE4NiwgODUgfSwKLSAgICB7IDU2LCAyMSwgMjMsIDExMSwgNTksIDIwNSwgNDUsIDM3LCAxOTIgfSwKLSAgICB7IDU1LCAzOCwgNzAsIDEyNCwgNzMsIDEwMiwgMSwgMzQsIDk4IH0gfSwKLSAgeyB7IDEyNSwgOTgsIDQyLCA4OCwgMTA0LCA4NSwgMTE3LCAxNzUsIDgyIH0sCi0gICAgeyA5NSwgODQsIDUzLCA4OSwgMTI4LCAxMDAsIDExMywgMTAxLCA0NSB9LAotICAgIHsgNzUsIDc5LCAxMjMsIDQ3LCA1MSwgMTI4LCA4MSwgMTcxLCAxIH0sCi0gICAgeyA1NywgMTcsIDUsIDcxLCAxMDIsIDU3LCA1MywgNDEsIDQ5IH0sCi0gICAgeyAzOCwgMzMsIDEzLCAxMjEsIDU3LCA3MywgMjYsIDEsIDg1IH0sCi0gICAgeyA0MSwgMTAsIDY3LCAxMzgsIDc3LCAxMTAsIDkwLCA0NywgMTE0IH0sCi0gICAgeyAxMTUsIDIxLCAyLCAxMCwgMTAyLCAyNTUsIDE2NiwgMjMsIDYgfSwKLSAgICB7IDEwMSwgMjksIDE2LCAxMCwgODUsIDEyOCwgMTAxLCAxOTYsIDI2IH0sCi0gICAgeyA1NywgMTgsIDEwLCAxMDIsIDEwMiwgMjEzLCAzNCwgMjAsIDQzIH0sCi0gICAgeyAxMTcsIDIwLCAxNSwgMzYsIDE2MywgMTI4LCA2OCwgMSwgMjYgfSB9LAotICB7IHsgMTAyLCA2MSwgNzEsIDM3LCAzNCwgNTMsIDMxLCAyNDMsIDE5MiB9LAotICAgIHsgNjksIDYwLCA3MSwgMzgsIDczLCAxMTksIDI4LCAyMjIsIDM3IH0sCi0gICAgeyA2OCwgNDUsIDEyOCwgMzQsIDEsIDQ3LCAxMSwgMjQ1LCAxNzEgfSwKLSAgICB7IDYyLCAxNywgMTksIDcwLCAxNDYsIDg1LCA1NSwgNjIsIDcwIH0sCi0gICAgeyAzNywgNDMsIDM3LCAxNTQsIDEwMCwgMTYzLCA4NSwgMTYwLCAxIH0sCi0gICAgeyA2MywgOSwgOTIsIDEzNiwgMjgsIDY0LCAzMiwgMjAxLCA4NSB9LAotICAgIHsgNzUsIDE1LCA5LCA5LCA2NCwgMjU1LCAxODQsIDExOSwgMTYgfSwKLSAgICB7IDg2LCA2LCAyOCwgNSwgNjQsIDI1NSwgMjUsIDI0OCwgMSB9LAotICAgIHsgNTYsIDgsIDE3LCAxMzIsIDEzNywgMjU1LCA1NSwgMTE2LCAxMjggfSwKLSAgICB7IDU4LCAxNSwgMjAsIDgyLCAxMzUsIDU3LCAyNiwgMTIxLCA0MCB9IH0sCi0gIHsgeyAxNjQsIDUwLCAzMSwgMTM3LCAxNTQsIDEzMywgMjUsIDM1LCAyMTggfSwKLSAgICB7IDUxLCAxMDMsIDQ0LCAxMzEsIDEzMSwgMTIzLCAzMSwgNiwgMTU4IH0sCi0gICAgeyA4NiwgNDAsIDY0LCAxMzUsIDE0OCwgMjI0LCA0NSwgMTgzLCAxMjggfSwKLSAgICB7IDIyLCAyNiwgMTcsIDEzMSwgMjQwLCAxNTQsIDE0LCAxLCAyMDkgfSwKLSAgICB7IDQ1LCAxNiwgMjEsIDkxLCA2NCwgMjIyLCA3LCAxLCAxOTcgfSwKLSAgICB7IDU2LCAyMSwgMzksIDE1NSwgNjAsIDEzOCwgMjMsIDEwMiwgMjEzIH0sCi0gICAgeyA4MywgMTIsIDEzLCA1NCwgMTkyLCAyNTUsIDY4LCA0NywgMjggfSwKLSAgICB7IDg1LCAyNiwgODUsIDg1LCAxMjgsIDEyOCwgMzIsIDE0NiwgMTcxIH0sCi0gICAgeyAxOCwgMTEsIDcsIDYzLCAxNDQsIDE3MSwgNCwgNCwgMjQ2IH0sCi0gICAgeyAzNSwgMjcsIDEwLCAxNDYsIDE3NCwgMTcxLCAxMiwgMjYsIDEyOCB9IH0sCi0gIHsgeyAxOTAsIDgwLCAzNSwgOTksIDE4MCwgODAsIDEyNiwgNTQsIDQ1IH0sCi0gICAgeyA4NSwgMTI2LCA0NywgODcsIDE3NiwgNTEsIDQxLCAyMCwgMzIgfSwKLSAgICB7IDEwMSwgNzUsIDEyOCwgMTM5LCAxMTgsIDE0NiwgMTE2LCAxMjgsIDg1IH0sCi0gICAgeyA1NiwgNDEsIDE1LCAxNzYsIDIzNiwgODUsIDM3LCA5LCA2MiB9LAotICAgIHsgNzEsIDMwLCAxNywgMTE5LCAxMTgsIDI1NSwgMTcsIDE4LCAxMzggfSwKLSAgICB7IDEwMSwgMzgsIDYwLCAxMzgsIDU1LCA3MCwgNDMsIDI2LCAxNDIgfSwKLSAgICB7IDE0NiwgMzYsIDE5LCAzMCwgMTcxLCAyNTUsIDk3LCAyNywgMjAgfSwKLSAgICB7IDEzOCwgNDUsIDYxLCA2MiwgMjE5LCAxLCA4MSwgMTg4LCA2NCB9LAotICAgIHsgMzIsIDQxLCAyMCwgMTE3LCAxNTEsIDE0MiwgMjAsIDIxLCAxNjMgfSwKLSAgICB7IDExMiwgMTksIDEyLCA2MSwgMTk1LCAxMjgsIDQ4LCA0LCAyNCB9IH0KLX07Ci0KLXZvaWQgVlA4UmVzZXRQcm9iYShWUDhQcm9iYSogY29uc3QgcHJvYmEpIHsKLSAgU2JNZW1vcnlTZXQocHJvYmEtPnNlZ21lbnRzXywgMjU1dSwgc2l6ZW9mKHByb2JhLT5zZWdtZW50c18pKTsKLSAgU2JNZW1vcnlDb3B5KHByb2JhLT5jb2VmZnNfLCBDb2VmZnNQcm9iYTAsIHNpemVvZihDb2VmZnNQcm9iYTApKTsKLSNpZm5kZWYgT05MWV9LRVlGUkFNRV9DT0RFCi0gIFNiTWVtb3J5Q29weShwcm9iYS0+bXZfLCBrTVZQcm9iYTAsIHNpemVvZihrTVZQcm9iYTApKTsKLSAgU2JNZW1vcnlDb3B5KHByb2JhLT55bW9kZV8sIGtZTW9kZVByb2JhSW50ZXIwLCBzaXplb2Yoa1lNb2RlUHJvYmFJbnRlcjApKTsKLSAgU2JNZW1vcnlDb3B5KHByb2JhLT51dm1vZGVfLCBrVVZNb2RlUHJvYmFJbnRlcjAsIHNpemVvZihrVVZNb2RlUHJvYmFJbnRlcjApKTsKLSNlbmRpZgotfQotCi12b2lkIFZQOFBhcnNlSW50cmFNb2RlKFZQOEJpdFJlYWRlciogY29uc3QgYnIsICBWUDhEZWNvZGVyKiBjb25zdCBkZWMpIHsKLSAgdWludDhfdCogY29uc3QgdG9wID0gZGVjLT5pbnRyYV90XyArIDQgKiBkZWMtPm1iX3hfOwotICB1aW50OF90KiBjb25zdCBsZWZ0ID0gZGVjLT5pbnRyYV9sXzsKLSAgLy8gSGFyZGNvZGVkIDE2eDE2IGludHJhLW1vZGUgZGVjaXNpb24gdHJlZS4KLSAgZGVjLT5pc19pNHg0XyA9ICFWUDhHZXRCaXQoYnIsIDE0NSk7ICAgLy8gZGVjaWRlIGZvciBCX1BSRUQgZmlyc3QKLSAgaWYgKCFkZWMtPmlzX2k0eDRfKSB7Ci0gICAgY29uc3QgaW50IHltb2RlID0KLSAgICAgICAgVlA4R2V0Qml0KGJyLCAxNTYpID8gKFZQOEdldEJpdChiciwgMTI4KSA/IFRNX1BSRUQgOiBIX1BSRUQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA6IChWUDhHZXRCaXQoYnIsIDE2MykgPyBWX1BSRUQgOiBEQ19QUkVEKTsKLSAgICBkZWMtPmltb2Rlc19bMF0gPSB5bW9kZTsKLSAgICBTYk1lbW9yeVNldCh0b3AsIHltb2RlLCA0ICogc2l6ZW9mKHRvcFswXSkpOwotICAgIFNiTWVtb3J5U2V0KGxlZnQsIHltb2RlLCA0ICogc2l6ZW9mKGxlZnRbMF0pKTsKLSAgfSBlbHNlIHsKLSAgICB1aW50OF90KiBtb2RlcyA9IGRlYy0+aW1vZGVzXzsKLSAgICBpbnQgeTsKLSAgICBmb3IgKHkgPSAwOyB5IDwgNDsgKyt5KSB7Ci0gICAgICBpbnQgeW1vZGUgPSBsZWZ0W3ldOwotICAgICAgaW50IHg7Ci0gICAgICBmb3IgKHggPSAwOyB4IDwgNDsgKyt4KSB7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHByb2IgPSBrQk1vZGVzUHJvYmFbdG9wW3hdXVt5bW9kZV07Ci0jaWZkZWYgVVNFX0dFTkVSSUNfVFJFRQotICAgICAgICAvLyBHZW5lcmljIHRyZWUtcGFyc2luZwotICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICBpID0ga1lNb2Rlc0ludHJhNFsyICogaSArIFZQOEdldEJpdChiciwgcHJvYltpXSldOwotICAgICAgICB9IHdoaWxlIChpID4gMCk7Ci0gICAgICAgIHltb2RlID0gLWk7Ci0jZWxzZQotICAgICAgICAvLyBIYXJkY29kZWQgdHJlZSBwYXJzaW5nCi0gICAgICAgIHltb2RlID0gIVZQOEdldEJpdChiciwgcHJvYlswXSkgPyBCX0RDX1BSRUQgOgotICAgICAgICAgICAgICAgICAgIVZQOEdldEJpdChiciwgcHJvYlsxXSkgPyBCX1RNX1BSRUQgOgotICAgICAgICAgICAgICAgICAgICAhVlA4R2V0Qml0KGJyLCBwcm9iWzJdKSA/IEJfVkVfUFJFRCA6Ci0gICAgICAgICAgICAgICAgICAgICAgIVZQOEdldEJpdChiciwgcHJvYlszXSkgPwotICAgICAgICAgICAgICAgICAgICAgICAgKCFWUDhHZXRCaXQoYnIsIHByb2JbNF0pID8gQl9IRV9QUkVEIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKCFWUDhHZXRCaXQoYnIsIHByb2JbNV0pID8gQl9SRF9QUkVEIDogQl9WUl9QUkVEKSkgOgotICAgICAgICAgICAgICAgICAgICAgICAgKCFWUDhHZXRCaXQoYnIsIHByb2JbNl0pID8gQl9MRF9QUkVEIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKCFWUDhHZXRCaXQoYnIsIHByb2JbN10pID8gQl9WTF9QUkVEIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIVZQOEdldEJpdChiciwgcHJvYls4XSkgPyBCX0hEX1BSRUQgOiBCX0hVX1BSRUQpKSk7Ci0jZW5kaWYgICAgLy8gVVNFX0dFTkVSSUNfVFJFRQotICAgICAgICB0b3BbeF0gPSB5bW9kZTsKLSAgICAgICAgKm1vZGVzKysgPSB5bW9kZTsKLSAgICAgIH0KLSAgICAgIGxlZnRbeV0gPSB5bW9kZTsKLSAgICB9Ci0gIH0KLSAgLy8gSGFyZGNvZGVkIFVWTW9kZSBkZWNpc2lvbiB0cmVlCi0gIGRlYy0+dXZtb2RlXyA9ICFWUDhHZXRCaXQoYnIsIDE0MikgPyBEQ19QUkVECi0gICAgICAgICAgICAgICA6ICFWUDhHZXRCaXQoYnIsIDExNCkgPyBWX1BSRUQKLSAgICAgICAgICAgICAgIDogVlA4R2V0Qml0KGJyLCAxODMpID8gVE1fUFJFRCA6IEhfUFJFRDsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFBhcmFncmFwaCAxMwotCi1zdGF0aWMgY29uc3QgdWludDhfdAotICAgIENvZWZmc1VwZGF0ZVByb2JhW05VTV9UWVBFU11bTlVNX0JBTkRTXVtOVU1fQ1RYXVtOVU1fUFJPQkFTXSA9IHsKLSAgeyB7IHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKLSAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKLSAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQotICAgIH0sCi0gICAgeyB7IDE3NiwgMjQ2LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCi0gICAgICB7IDIyMywgMjQxLCAyNTIsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCi0gICAgICB7IDI0OSwgMjUzLCAyNTMsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KLSAgICB9LAotICAgIHsgeyAyNTUsIDI0NCwgMjUyLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAotICAgICAgeyAyMzQsIDI1NCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAotICAgICAgeyAyNTMsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9Ci0gICAgfSwKLSAgICB7IHsgMjU1LCAyNDYsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKLSAgICAgIHsgMjM5LCAyNTMsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKLSAgICAgIHsgMjU0LCAyNTUsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQotICAgIH0sCi0gICAgeyB7IDI1NSwgMjQ4LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCi0gICAgICB7IDI1MSwgMjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCi0gICAgICB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KLSAgICB9LAotICAgIHsgeyAyNTUsIDI1MywgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAotICAgICAgeyAyNTEsIDI1NCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAotICAgICAgeyAyNTQsIDI1NSwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9Ci0gICAgfSwKLSAgICB7IHsgMjU1LCAyNTQsIDI1MywgMjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKLSAgICAgIHsgMjUwLCAyNTUsIDI1NCwgMjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKLSAgICAgIHsgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQotICAgIH0sCi0gICAgeyB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCi0gICAgICB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCi0gICAgICB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KLSAgICB9Ci0gIH0sCi0gIHsgeyB7IDIxNywgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCi0gICAgICB7IDIyNSwgMjUyLCAyNDEsIDI1MywgMjU1LCAyNTUsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCi0gICAgICB7IDIzNCwgMjUwLCAyNDEsIDI1MCwgMjUzLCAyNTUsIDI1MywgMjU0LCAyNTUsIDI1NSwgMjU1IH0KLSAgICB9LAotICAgIHsgeyAyNTUsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAotICAgICAgeyAyMjMsIDI1NCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAotICAgICAgeyAyMzgsIDI1MywgMjU0LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9Ci0gICAgfSwKLSAgICB7IHsgMjU1LCAyNDgsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKLSAgICAgIHsgMjQ5LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKLSAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQotICAgIH0sCi0gICAgeyB7IDI1NSwgMjUzLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCi0gICAgICB7IDI0NywgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCi0gICAgICB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KLSAgICB9LAotICAgIHsgeyAyNTUsIDI1MywgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAotICAgICAgeyAyNTIsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAotICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9Ci0gICAgfSwKLSAgICB7IHsgMjU1LCAyNTQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKLSAgICAgIHsgMjUzLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKLSAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQotICAgIH0sCi0gICAgeyB7IDI1NSwgMjU0LCAyNTMsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCi0gICAgICB7IDI1MCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCi0gICAgICB7IDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KLSAgICB9LAotICAgIHsgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAotICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAotICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9Ci0gICAgfQotICB9LAotICB7IHsgeyAxODYsIDI1MSwgMjUwLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAotICAgICAgeyAyMzQsIDI1MSwgMjQ0LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAotICAgICAgeyAyNTEsIDI1MSwgMjQzLCAyNTMsIDI1NCwgMjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSB9Ci0gICAgfSwKLSAgICB7IHsgMjU1LCAyNTMsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKLSAgICAgIHsgMjM2LCAyNTMsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKLSAgICAgIHsgMjUxLCAyNTMsIDI1MywgMjU0LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQotICAgIH0sCi0gICAgeyB7IDI1NSwgMjU0LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCi0gICAgICB7IDI1NCwgMjU0LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCi0gICAgICB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KLSAgICB9LAotICAgIHsgeyAyNTUsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAotICAgICAgeyAyNTQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAotICAgICAgeyAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9Ci0gICAgfSwKLSAgICB7IHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKLSAgICAgIHsgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKLSAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQotICAgIH0sCi0gICAgeyB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCi0gICAgICB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCi0gICAgICB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KLSAgICB9LAotICAgIHsgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAotICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAotICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9Ci0gICAgfSwKLSAgICB7IHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKLSAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKLSAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQotICAgIH0KLSAgfSwKLSAgeyB7IHsgMjQ4LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKLSAgICAgIHsgMjUwLCAyNTQsIDI1MiwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKLSAgICAgIHsgMjQ4LCAyNTQsIDI0OSwgMjUzLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQotICAgIH0sCi0gICAgeyB7IDI1NSwgMjUzLCAyNTMsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCi0gICAgICB7IDI0NiwgMjUzLCAyNTMsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCi0gICAgICB7IDI1MiwgMjU0LCAyNTEsIDI1NCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KLSAgICB9LAotICAgIHsgeyAyNTUsIDI1NCwgMjUyLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAotICAgICAgeyAyNDgsIDI1NCwgMjUzLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAotICAgICAgeyAyNTMsIDI1NSwgMjU0LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9Ci0gICAgfSwKLSAgICB7IHsgMjU1LCAyNTEsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKLSAgICAgIHsgMjQ1LCAyNTEsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKLSAgICAgIHsgMjUzLCAyNTMsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQotICAgIH0sCi0gICAgeyB7IDI1NSwgMjUxLCAyNTMsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCi0gICAgICB7IDI1MiwgMjUzLCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCi0gICAgICB7IDI1NSwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KLSAgICB9LAotICAgIHsgeyAyNTUsIDI1MiwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAotICAgICAgeyAyNDksIDI1NSwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAotICAgICAgeyAyNTUsIDI1NSwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9Ci0gICAgfSwKLSAgICB7IHsgMjU1LCAyNTUsIDI1MywgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKLSAgICAgIHsgMjUwLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKLSAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQotICAgIH0sCi0gICAgeyB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCi0gICAgICB7IDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCi0gICAgICB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KLSAgICB9Ci0gIH0KLX07Ci0KLSNpZm5kZWYgT05MWV9LRVlGUkFNRV9DT0RFCi1zdGF0aWMgY29uc3QgdWludDhfdCBNVlVwZGF0ZVByb2JhWzJdW05VTV9NVl9QUk9CQVNdID0gewotICB7IDIzNywgMjQ2LCAyNTMsIDI1MywgMjU0LCAyNTQsIDI1NCwgMjU0LAotICAgIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1MCwgMjUwLAotICAgIDI1MiwgMjU0LCAyNTQgfSwKLSAgeyAyMzEsIDI0MywgMjQ1LCAyNTMsIDI1NCwgMjU0LCAyNTQsIDI1NCwKLSAgICAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTEsIDI1MSwKLSAgICAyNTQsIDI1NCwgMjU0IH0KLX07Ci0jZW5kaWYKLQotLy8gUGFyYWdyYXBoIDkuOQotdm9pZCBWUDhQYXJzZVByb2JhKFZQOEJpdFJlYWRlciogY29uc3QgYnIsIFZQOERlY29kZXIqIGNvbnN0IGRlYykgewotICBWUDhQcm9iYSogY29uc3QgcHJvYmEgPSAmZGVjLT5wcm9iYV87Ci0gIGludCB0LCBiLCBjLCBwOwotICBmb3IgKHQgPSAwOyB0IDwgTlVNX1RZUEVTOyArK3QpIHsKLSAgICBmb3IgKGIgPSAwOyBiIDwgTlVNX0JBTkRTOyArK2IpIHsKLSAgICAgIGZvciAoYyA9IDA7IGMgPCBOVU1fQ1RYOyArK2MpIHsKLSAgICAgICAgZm9yIChwID0gMDsgcCA8IE5VTV9QUk9CQVM7ICsrcCkgewotICAgICAgICAgIGlmIChWUDhHZXRCaXQoYnIsIENvZWZmc1VwZGF0ZVByb2JhW3RdW2JdW2NdW3BdKSkgewotICAgICAgICAgICAgcHJvYmEtPmNvZWZmc19bdF1bYl1bY11bcF0gPSBWUDhHZXRWYWx1ZShiciwgOCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGRlYy0+dXNlX3NraXBfcHJvYmFfID0gVlA4R2V0KGJyKTsKLSAgaWYgKGRlYy0+dXNlX3NraXBfcHJvYmFfKSB7Ci0gICAgZGVjLT5za2lwX3BfID0gVlA4R2V0VmFsdWUoYnIsIDgpOwotICB9Ci0jaWZuZGVmIE9OTFlfS0VZRlJBTUVfQ09ERQotICBpZiAoIWRlYy0+ZnJtX2hkcl8ua2V5X2ZyYW1lXykgewotICAgIGludCBpOwotICAgIGRlYy0+aW50cmFfcF8gPSBWUDhHZXRWYWx1ZShiciwgOCk7Ci0gICAgZGVjLT5sYXN0X3BfID0gVlA4R2V0VmFsdWUoYnIsIDgpOwotICAgIGRlYy0+Z29sZGVuX3BfID0gVlA4R2V0VmFsdWUoYnIsIDgpOwotICAgIGlmIChWUDhHZXQoYnIpKSB7ICAgLy8gdXBkYXRlIHktbW9kZQotICAgICAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgewotICAgICAgICBwcm9iYS0+eW1vZGVfW2ldID0gVlA4R2V0VmFsdWUoYnIsIDgpOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoVlA4R2V0KGJyKSkgeyAgIC8vIHVwZGF0ZSB1di1tb2RlCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgKytpKSB7Ci0gICAgICAgIHByb2JhLT51dm1vZGVfW2ldID0gVlA4R2V0VmFsdWUoYnIsIDgpOwotICAgICAgfQotICAgIH0KLSAgICAvLyB1cGRhdGUgTVYKLSAgICBmb3IgKGkgPSAwOyBpIDwgMjsgKytpKSB7Ci0gICAgICBpbnQgazsKLSAgICAgIGZvciAoayA9IDA7IGsgPCBOVU1fTVZfUFJPQkFTOyArK2spIHsKLSAgICAgICAgaWYgKFZQOEdldEJpdChiciwgTVZVcGRhdGVQcm9iYVtpXVtrXSkpIHsKLSAgICAgICAgICBjb25zdCBpbnQgdiA9IFZQOEdldFZhbHVlKGJyLCA3KTsKLSAgICAgICAgICBwcm9iYS0+bXZfW2ldW2tdID0gdiA/IHYgPDwgMSA6IDE7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSNlbmRpZgotfQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RlYy92cDguYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RlYy92cDguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQzYWUyOS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kZWMvdnA4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw3ODkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIG1haW4gZW50cnkgZm9yIHRoZSBkZWNvZGVyCi0vLwotLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKLQotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCi0jZWxzZQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICIuL3ZwOGkuaCIKLSNpbmNsdWRlICIuL3ZwOGxpLmgiCi0jaW5jbHVkZSAiLi93ZWJwaS5oIgotI2luY2x1ZGUgIi4uL3V0aWxzL2JpdF9yZWFkZXIuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWludCBXZWJQR2V0RGVjb2RlclZlcnNpb24odm9pZCkgewotICByZXR1cm4gKERFQ19NQUpfVkVSU0lPTiA8PCAxNikgfCAoREVDX01JTl9WRVJTSU9OIDw8IDgpIHwgREVDX1JFVl9WRVJTSU9OOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVlA4RGVjb2RlcgotCi1zdGF0aWMgdm9pZCBTZXRPayhWUDhEZWNvZGVyKiBjb25zdCBkZWMpIHsKLSAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19PSzsKLSAgZGVjLT5lcnJvcl9tc2dfID0gIk9LIjsKLX0KLQotaW50IFZQOEluaXRJb0ludGVybmFsKFZQOElvKiBjb25zdCBpbywgaW50IHZlcnNpb24pIHsKLSAgaWYgKFdFQlBfQUJJX0lTX0lOQ09NUEFUSUJMRSh2ZXJzaW9uLCBXRUJQX0RFQ09ERVJfQUJJX1ZFUlNJT04pKSB7Ci0gICAgcmV0dXJuIDA7ICAvLyBtaXNtYXRjaCBlcnJvcgotICB9Ci0gIGlmIChpbyAhPSBOVUxMKSB7Ci0gICAgU2JNZW1vcnlTZXQoaW8sIDAsIHNpemVvZigqaW8pKTsKLSAgfQotICByZXR1cm4gMTsKLX0KLQotVlA4RGVjb2RlciogVlA4TmV3KHZvaWQpIHsKLSAgVlA4RGVjb2RlciogY29uc3QgZGVjID0gKFZQOERlY29kZXIqKVNiTWVtb3J5Q2FsbG9jKDEsIHNpemVvZigqZGVjKSk7Ci0gIGlmIChkZWMgIT0gTlVMTCkgewotICAgIFNldE9rKGRlYyk7Ci0gICAgV2ViUFdvcmtlckluaXQoJmRlYy0+d29ya2VyXyk7Ci0gICAgZGVjLT5yZWFkeV8gPSAwOwotICAgIGRlYy0+bnVtX3BhcnRzXyA9IDE7Ci0gIH0KLSAgcmV0dXJuIGRlYzsKLX0KLQotVlA4U3RhdHVzQ29kZSBWUDhTdGF0dXMoVlA4RGVjb2RlciogY29uc3QgZGVjKSB7Ci0gIGlmICghZGVjKSByZXR1cm4gVlA4X1NUQVRVU19JTlZBTElEX1BBUkFNOwotICByZXR1cm4gZGVjLT5zdGF0dXNfOwotfQotCi1jb25zdCBjaGFyKiBWUDhTdGF0dXNNZXNzYWdlKFZQOERlY29kZXIqIGNvbnN0IGRlYykgewotICBpZiAoZGVjID09IE5VTEwpIHJldHVybiAibm8gb2JqZWN0IjsKLSAgaWYgKCFkZWMtPmVycm9yX21zZ18pIHJldHVybiAiT0siOwotICByZXR1cm4gZGVjLT5lcnJvcl9tc2dfOwotfQotCi12b2lkIFZQOERlbGV0ZShWUDhEZWNvZGVyKiBjb25zdCBkZWMpIHsKLSAgaWYgKGRlYyAhPSBOVUxMKSB7Ci0gICAgVlA4Q2xlYXIoZGVjKTsKLSAgICBTYk1lbW9yeURlYWxsb2NhdGUoZGVjKTsKLSAgfQotfQotCi1pbnQgVlA4U2V0RXJyb3IoVlA4RGVjb2RlciogY29uc3QgZGVjLAotICAgICAgICAgICAgICAgIFZQOFN0YXR1c0NvZGUgZXJyb3IsIGNvbnN0IGNoYXIqIGNvbnN0IG1zZykgewotICAvLyBUT0RPIFRoaXMgY2hlY2sgd291bGQgYmUgdW5uZWNlc3NhcnkgaWYgYWxwaGEgZGVjb21wcmVzc2lvbiB3YXMgc2VwYXJhdGVkCi0gIC8vIGZyb20gVlA4UHJvY2Vzc1Jvdy9GaW5pc2hSb3cuIFRoaXMgYXZvaWRzIHNldHRpbmcgJ2RlYy0+c3RhdHVzXycgdG8KLSAgLy8gc29tZXRoaW5nIG90aGVyIHRoYW4gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1Igb24gYWxwaGEgZGVjb21wcmVzc2lvbgotICAvLyBmYWlsdXJlLgotICBpZiAoZGVjLT5zdGF0dXNfID09IFZQOF9TVEFUVVNfT0spIHsKLSAgICBkZWMtPnN0YXR1c18gPSBlcnJvcjsKLSAgICBkZWMtPmVycm9yX21zZ18gPSBtc2c7Ci0gICAgZGVjLT5yZWFkeV8gPSAwOwotICB9Ci0gIHJldHVybiAwOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1pbnQgVlA4Q2hlY2tTaWduYXR1cmUoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSkgewotICByZXR1cm4gKGRhdGFfc2l6ZSA+PSAzICYmCi0gICAgICAgICAgZGF0YVswXSA9PSAweDlkICYmIGRhdGFbMV0gPT0gMHgwMSAmJiBkYXRhWzJdID09IDB4MmEpOwotfQotCi1pbnQgVlA4R2V0SW5mbyhjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLCBzaXplX3QgY2h1bmtfc2l6ZSwKLSAgICAgICAgICAgICAgIGludCogY29uc3Qgd2lkdGgsIGludCogY29uc3QgaGVpZ2h0KSB7Ci0gIGlmIChkYXRhID09IE5VTEwgfHwgZGF0YV9zaXplIDwgVlA4X0ZSQU1FX0hFQURFUl9TSVpFKSB7Ci0gICAgcmV0dXJuIDA7ICAgICAgICAgLy8gbm90IGVub3VnaCBkYXRhCi0gIH0KLSAgLy8gY2hlY2sgc2lnbmF0dXJlCi0gIGlmICghVlA4Q2hlY2tTaWduYXR1cmUoZGF0YSArIDMsIGRhdGFfc2l6ZSAtIDMpKSB7Ci0gICAgcmV0dXJuIDA7ICAgICAgICAgLy8gV3Jvbmcgc2lnbmF0dXJlLgotICB9IGVsc2UgewotICAgIGNvbnN0IHVpbnQzMl90IGJpdHMgPSBkYXRhWzBdIHwgKGRhdGFbMV0gPDwgOCkgfCAoZGF0YVsyXSA8PCAxNik7Ci0gICAgY29uc3QgaW50IGtleV9mcmFtZSA9ICEoYml0cyAmIDEpOwotICAgIGNvbnN0IGludCB3ID0gKChkYXRhWzddIDw8IDgpIHwgZGF0YVs2XSkgJiAweDNmZmY7Ci0gICAgY29uc3QgaW50IGggPSAoKGRhdGFbOV0gPDwgOCkgfCBkYXRhWzhdKSAmIDB4M2ZmZjsKLQotICAgIGlmICgha2V5X2ZyYW1lKSB7ICAgLy8gTm90IGEga2V5ZnJhbWUuCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpZiAoKChiaXRzID4+IDEpICYgNykgPiAzKSB7Ci0gICAgICByZXR1cm4gMDsgICAgICAgICAvLyB1bmtub3duIHByb2ZpbGUKLSAgICB9Ci0gICAgaWYgKCEoKGJpdHMgPj4gNCkgJiAxKSkgewotICAgICAgcmV0dXJuIDA7ICAgICAgICAgLy8gZmlyc3QgZnJhbWUgaXMgaW52aXNpYmxlIQotICAgIH0KLSAgICBpZiAoKChiaXRzID4+IDUpKSA+PSBjaHVua19zaXplKSB7ICAvLyBwYXJ0aXRpb25fbGVuZ3RoCi0gICAgICByZXR1cm4gMDsgICAgICAgICAvLyBpbmNvbnNpc3RlbnQgc2l6ZSBpbmZvcm1hdGlvbi4KLSAgICB9Ci0KLSAgICBpZiAod2lkdGgpIHsKLSAgICAgICp3aWR0aCA9IHc7Ci0gICAgfQotICAgIGlmIChoZWlnaHQpIHsKLSAgICAgICpoZWlnaHQgPSBoOwotICAgIH0KLQotICAgIHJldHVybiAxOwotICB9Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBIZWFkZXIgcGFyc2luZwotCi1zdGF0aWMgdm9pZCBSZXNldFNlZ21lbnRIZWFkZXIoVlA4U2VnbWVudEhlYWRlciogY29uc3QgaGRyKSB7Ci0gIFNCX0RDSEVDSyhoZHIgIT0gTlVMTCk7Ci0gIGhkci0+dXNlX3NlZ21lbnRfID0gMDsKLSAgaGRyLT51cGRhdGVfbWFwXyA9IDA7Ci0gIGhkci0+YWJzb2x1dGVfZGVsdGFfID0gMTsKLSAgU2JNZW1vcnlTZXQoaGRyLT5xdWFudGl6ZXJfLCAwLCBzaXplb2YoaGRyLT5xdWFudGl6ZXJfKSk7Ci0gIFNiTWVtb3J5U2V0KGhkci0+ZmlsdGVyX3N0cmVuZ3RoXywgMCwgc2l6ZW9mKGhkci0+ZmlsdGVyX3N0cmVuZ3RoXykpOwotfQotCi0vLyBQYXJhZ3JhcGggOS4zCi1zdGF0aWMgaW50IFBhcnNlU2VnbWVudEhlYWRlcihWUDhCaXRSZWFkZXIqIGJyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4U2VnbWVudEhlYWRlciogaGRyLCBWUDhQcm9iYSogcHJvYmEpIHsKLSAgU0JfRENIRUNLKGJyICE9IE5VTEwpOwotICBTQl9EQ0hFQ0soaGRyICE9IE5VTEwpOwotICBoZHItPnVzZV9zZWdtZW50XyA9IFZQOEdldChicik7Ci0gIGlmIChoZHItPnVzZV9zZWdtZW50XykgewotICAgIGhkci0+dXBkYXRlX21hcF8gPSBWUDhHZXQoYnIpOwotICAgIGlmIChWUDhHZXQoYnIpKSB7ICAgLy8gdXBkYXRlIGRhdGEKLSAgICAgIGludCBzOwotICAgICAgaGRyLT5hYnNvbHV0ZV9kZWx0YV8gPSBWUDhHZXQoYnIpOwotICAgICAgZm9yIChzID0gMDsgcyA8IE5VTV9NQl9TRUdNRU5UUzsgKytzKSB7Ci0gICAgICAgIGhkci0+cXVhbnRpemVyX1tzXSA9IFZQOEdldChicikgPyBWUDhHZXRTaWduZWRWYWx1ZShiciwgNykgOiAwOwotICAgICAgfQotICAgICAgZm9yIChzID0gMDsgcyA8IE5VTV9NQl9TRUdNRU5UUzsgKytzKSB7Ci0gICAgICAgIGhkci0+ZmlsdGVyX3N0cmVuZ3RoX1tzXSA9IFZQOEdldChicikgPyBWUDhHZXRTaWduZWRWYWx1ZShiciwgNikgOiAwOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoaGRyLT51cGRhdGVfbWFwXykgewotICAgICAgaW50IHM7Ci0gICAgICBmb3IgKHMgPSAwOyBzIDwgTUJfRkVBVFVSRV9UUkVFX1BST0JTOyArK3MpIHsKLSAgICAgICAgcHJvYmEtPnNlZ21lbnRzX1tzXSA9IFZQOEdldChicikgPyBWUDhHZXRWYWx1ZShiciwgOCkgOiAyNTV1OwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBoZHItPnVwZGF0ZV9tYXBfID0gMDsKLSAgfQotICByZXR1cm4gIWJyLT5lb2ZfOwotfQotCi0vLyBQYXJhZ3JhcGggOS41Ci0vLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgVlA4X1NUQVRVU19TVVNQRU5ERUQgaWYgd2UgZG9uJ3QgaGF2ZSBhbGwgdGhlCi0vLyBuZWNlc3NhcnkgZGF0YSBpbiAnYnVmJy4KLS8vIFRoaXMgY2FzZSBpcyBub3QgbmVjZXNzYXJpbHkgYW4gZXJyb3IgKGZvciBpbmNyZW1lbnRhbCBkZWNvZGluZykuCi0vLyBTdGlsbCwgbm8gYml0cmVhZGVyIGlzIGV2ZXIgaW5pdGlhbGl6ZWQgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byByZWFkCi0vLyB1bmF2YWlsYWJsZSBtZW1vcnkuCi0vLyBJZiB3ZSBkb24ndCBldmVuIGhhdmUgdGhlIHBhcnRpdGlvbnMnIHNpemVzLCB0aGFuIFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBCi0vLyBpcyByZXR1cm5lZCwgYW5kIHRoaXMgaXMgYW4gdW5yZWNvdmVyYWJsZSBlcnJvci4KLS8vIElmIHRoZSBwYXJ0aXRpb25zIHdlcmUgcG9zaXRpb25lZCBvaywgVlA4X1NUQVRVU19PSyBpcyByZXR1cm5lZC4KLXN0YXRpYyBWUDhTdGF0dXNDb2RlIFBhcnNlUGFydGl0aW9ucyhWUDhEZWNvZGVyKiBjb25zdCBkZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogYnVmLCBzaXplX3Qgc2l6ZSkgewotICBWUDhCaXRSZWFkZXIqIGNvbnN0IGJyID0gJmRlYy0+YnJfOwotICBjb25zdCB1aW50OF90KiBzeiA9IGJ1ZjsKLSAgY29uc3QgdWludDhfdCogYnVmX2VuZCA9IGJ1ZiArIHNpemU7Ci0gIGNvbnN0IHVpbnQ4X3QqIHBhcnRfc3RhcnQ7Ci0gIGludCBsYXN0X3BhcnQ7Ci0gIGludCBwOwotCi0gIGRlYy0+bnVtX3BhcnRzXyA9IDEgPDwgVlA4R2V0VmFsdWUoYnIsIDIpOwotICBsYXN0X3BhcnQgPSBkZWMtPm51bV9wYXJ0c18gLSAxOwotICBwYXJ0X3N0YXJ0ID0gYnVmICsgbGFzdF9wYXJ0ICogMzsKLSAgaWYgKGJ1Zl9lbmQgPCBwYXJ0X3N0YXJ0KSB7Ci0gICAgLy8gd2UgY2FuJ3QgZXZlbiByZWFkIHRoZSBzaXplcyB3aXRoIHN6W10hIFRoYXQncyBhIGZhaWx1cmUuCi0gICAgcmV0dXJuIFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBOwotICB9Ci0gIGZvciAocCA9IDA7IHAgPCBsYXN0X3BhcnQ7ICsrcCkgewotICAgIGNvbnN0IHVpbnQzMl90IHBzaXplID0gc3pbMF0gfCAoc3pbMV0gPDwgOCkgfCAoc3pbMl0gPDwgMTYpOwotICAgIGNvbnN0IHVpbnQ4X3QqIHBhcnRfZW5kID0gcGFydF9zdGFydCArIHBzaXplOwotICAgIGlmIChwYXJ0X2VuZCA+IGJ1Zl9lbmQpIHBhcnRfZW5kID0gYnVmX2VuZDsKLSAgICBWUDhJbml0Qml0UmVhZGVyKGRlYy0+cGFydHNfICsgcCwgcGFydF9zdGFydCwgcGFydF9lbmQpOwotICAgIHBhcnRfc3RhcnQgPSBwYXJ0X2VuZDsKLSAgICBzeiArPSAzOwotICB9Ci0gIFZQOEluaXRCaXRSZWFkZXIoZGVjLT5wYXJ0c18gKyBsYXN0X3BhcnQsIHBhcnRfc3RhcnQsIGJ1Zl9lbmQpOwotICByZXR1cm4gKHBhcnRfc3RhcnQgPCBidWZfZW5kKSA/IFZQOF9TVEFUVVNfT0sgOgotICAgICAgICAgICBWUDhfU1RBVFVTX1NVU1BFTkRFRDsgICAvLyBJbml0IGlzIG9rLCBidXQgdGhlcmUncyBub3QgZW5vdWdoIGRhdGEKLX0KLQotLy8gUGFyYWdyYXBoIDkuNAotc3RhdGljIGludCBQYXJzZUZpbHRlckhlYWRlcihWUDhCaXRSZWFkZXIqIGJyLCBWUDhEZWNvZGVyKiBjb25zdCBkZWMpIHsKLSAgVlA4RmlsdGVySGVhZGVyKiBjb25zdCBoZHIgPSAmZGVjLT5maWx0ZXJfaGRyXzsKLSAgaGRyLT5zaW1wbGVfICAgID0gVlA4R2V0KGJyKTsKLSAgaGRyLT5sZXZlbF8gICAgID0gVlA4R2V0VmFsdWUoYnIsIDYpOwotICBoZHItPnNoYXJwbmVzc18gPSBWUDhHZXRWYWx1ZShiciwgMyk7Ci0gIGhkci0+dXNlX2xmX2RlbHRhXyA9IFZQOEdldChicik7Ci0gIGlmIChoZHItPnVzZV9sZl9kZWx0YV8pIHsKLSAgICBpZiAoVlA4R2V0KGJyKSkgeyAgIC8vIHVwZGF0ZSBsZi1kZWx0YT8KLSAgICAgIGludCBpOwotICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9SRUZfTEZfREVMVEFTOyArK2kpIHsKLSAgICAgICAgaWYgKFZQOEdldChicikpIHsKLSAgICAgICAgICBoZHItPnJlZl9sZl9kZWx0YV9baV0gPSBWUDhHZXRTaWduZWRWYWx1ZShiciwgNik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fTU9ERV9MRl9ERUxUQVM7ICsraSkgewotICAgICAgICBpZiAoVlA4R2V0KGJyKSkgewotICAgICAgICAgIGhkci0+bW9kZV9sZl9kZWx0YV9baV0gPSBWUDhHZXRTaWduZWRWYWx1ZShiciwgNik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgZGVjLT5maWx0ZXJfdHlwZV8gPSAoaGRyLT5sZXZlbF8gPT0gMCkgPyAwIDogaGRyLT5zaW1wbGVfID8gMSA6IDI7Ci0gIHJldHVybiAhYnItPmVvZl87Ci19Ci0KLS8vIFRvcG1vc3QgY2FsbAotaW50IFZQOEdldEhlYWRlcnMoVlA4RGVjb2RlciogY29uc3QgZGVjLCBWUDhJbyogY29uc3QgaW8pIHsKLSAgY29uc3QgdWludDhfdCogYnVmOwotICBzaXplX3QgYnVmX3NpemU7Ci0gIFZQOEZyYW1lSGVhZGVyKiBmcm1faGRyOwotICBWUDhQaWN0dXJlSGVhZGVyKiBwaWNfaGRyOwotICBWUDhCaXRSZWFkZXIqIGJyOwotICBWUDhTdGF0dXNDb2RlIHN0YXR1czsKLSAgV2ViUEhlYWRlclN0cnVjdHVyZSBoZWFkZXJzOwotCi0gIGlmIChkZWMgPT0gTlVMTCkgewotICAgIHJldHVybiAwOwotICB9Ci0gIFNldE9rKGRlYyk7Ci0gIGlmIChpbyA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19JTlZBTElEX1BBUkFNLAotICAgICAgICAgICAgICAgICAgICAgICAibnVsbCBWUDhJbyBwYXNzZWQgdG8gVlA4R2V0SGVhZGVycygpIik7Ci0gIH0KLQotICAvLyBQcm9jZXNzIFByZS1WUDggY2h1bmtzLgotICBoZWFkZXJzLmRhdGEgPSBpby0+ZGF0YTsKLSAgaGVhZGVycy5kYXRhX3NpemUgPSBpby0+ZGF0YV9zaXplOwotICBzdGF0dXMgPSBXZWJQUGFyc2VIZWFkZXJzKCZoZWFkZXJzKTsKLSAgaWYgKHN0YXR1cyAhPSBWUDhfU1RBVFVTX09LKSB7Ci0gICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgc3RhdHVzLCAiSW5jb3JyZWN0L2luY29tcGxldGUgaGVhZGVyLiIpOwotICB9Ci0gIGlmIChoZWFkZXJzLmlzX2xvc3NsZXNzKSB7Ci0gICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICJVbmV4cGVjdGVkIGxvc3NsZXNzIGZvcm1hdCBlbmNvdW50ZXJlZC4iKTsKLSAgfQotCi0gIGlmIChkZWMtPmFscGhhX2RhdGFfID09IE5VTEwpIHsKLSAgICBTQl9EQ0hFQ0soZGVjLT5hbHBoYV9kYXRhX3NpemVfID09IDApOwotICAgIC8vIFdlIGhhdmUgTk9UIHNldCBhbHBoYSBkYXRhIHlldC4gU2V0IGl0IG5vdy4KLSAgICAvLyAoVGhpcyBpcyB0byBlbnN1cmUgdGhhdCBkZWMtPmFscGhhX2RhdGFfIGlzIE5PVCByZXNldCB0byBOVUxMIGlmCi0gICAgLy8gV2ViUFBhcnNlSGVhZGVycygpIGlzIGNhbGxlZCBtb3JlIHRoYW4gb25jZSwgYXMgaW4gaW5jcmVtZW50YWwgZGVjb2RpbmcKLSAgICAvLyBjYXNlLikKLSAgICBkZWMtPmFscGhhX2RhdGFfID0gaGVhZGVycy5hbHBoYV9kYXRhOwotICAgIGRlYy0+YWxwaGFfZGF0YV9zaXplXyA9IGhlYWRlcnMuYWxwaGFfZGF0YV9zaXplOwotICB9Ci0KLSAgLy8gUHJvY2VzcyB0aGUgVlA4IGZyYW1lIGhlYWRlci4KLSAgYnVmID0gaGVhZGVycy5kYXRhICsgaGVhZGVycy5vZmZzZXQ7Ci0gIGJ1Zl9zaXplID0gaGVhZGVycy5kYXRhX3NpemUgLSBoZWFkZXJzLm9mZnNldDsKLSAgU0JfRENIRUNLKGhlYWRlcnMuZGF0YV9zaXplID49IGhlYWRlcnMub2Zmc2V0KTsgIC8vIFdlYlBQYXJzZUhlYWRlcnMnIGd1YXJhbnRlZQotICBpZiAoYnVmX3NpemUgPCA0KSB7Ci0gICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEEsCi0gICAgICAgICAgICAgICAgICAgICAgICJUcnVuY2F0ZWQgaGVhZGVyLiIpOwotICB9Ci0KLSAgLy8gUGFyYWdyYXBoIDkuMQotICB7Ci0gICAgY29uc3QgdWludDMyX3QgYml0cyA9IGJ1ZlswXSB8IChidWZbMV0gPDwgOCkgfCAoYnVmWzJdIDw8IDE2KTsKLSAgICBmcm1faGRyID0gJmRlYy0+ZnJtX2hkcl87Ci0gICAgZnJtX2hkci0+a2V5X2ZyYW1lXyA9ICEoYml0cyAmIDEpOwotICAgIGZybV9oZHItPnByb2ZpbGVfID0gKGJpdHMgPj4gMSkgJiA3OwotICAgIGZybV9oZHItPnNob3dfID0gKGJpdHMgPj4gNCkgJiAxOwotICAgIGZybV9oZHItPnBhcnRpdGlvbl9sZW5ndGhfID0gKGJpdHMgPj4gNSk7Ci0gICAgaWYgKGZybV9oZHItPnByb2ZpbGVfID4gMykKLSAgICAgIHJldHVybiBWUDhTZXRFcnJvcihkZWMsIFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICJJbmNvcnJlY3Qga2V5ZnJhbWUgcGFyYW1ldGVycy4iKTsKLSAgICBpZiAoIWZybV9oZHItPnNob3dfKQotICAgICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19VTlNVUFBPUlRFRF9GRUFUVVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgICJGcmFtZSBub3QgZGlzcGxheWFibGUuIik7Ci0gICAgYnVmICs9IDM7Ci0gICAgYnVmX3NpemUgLT0gMzsKLSAgfQotCi0gIHBpY19oZHIgPSAmZGVjLT5waWNfaGRyXzsKLSAgaWYgKGZybV9oZHItPmtleV9mcmFtZV8pIHsKLSAgICAvLyBQYXJhZ3JhcGggOS4yCi0gICAgaWYgKGJ1Zl9zaXplIDwgNykgewotICAgICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBwYXJzZSBwaWN0dXJlIGhlYWRlciIpOwotICAgIH0KLSAgICBpZiAoIVZQOENoZWNrU2lnbmF0dXJlKGJ1ZiwgYnVmX3NpemUpKSB7Ci0gICAgICByZXR1cm4gVlA4U2V0RXJyb3IoZGVjLCBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIGNvZGUgd29yZCIpOwotICAgIH0KLSAgICBwaWNfaGRyLT53aWR0aF8gPSAoKGJ1Zls0XSA8PCA4KSB8IGJ1ZlszXSkgJiAweDNmZmY7Ci0gICAgcGljX2hkci0+eHNjYWxlXyA9IGJ1Zls0XSA+PiA2OyAgIC8vIHJhdGlvOiAxLCA1LzQgNS8zIG9yIDIKLSAgICBwaWNfaGRyLT5oZWlnaHRfID0gKChidWZbNl0gPDwgOCkgfCBidWZbNV0pICYgMHgzZmZmOwotICAgIHBpY19oZHItPnlzY2FsZV8gPSBidWZbNl0gPj4gNjsKLSAgICBidWYgKz0gNzsKLSAgICBidWZfc2l6ZSAtPSA3OwotCi0gICAgZGVjLT5tYl93XyA9IChwaWNfaGRyLT53aWR0aF8gKyAxNSkgPj4gNDsKLSAgICBkZWMtPm1iX2hfID0gKHBpY19oZHItPmhlaWdodF8gKyAxNSkgPj4gNDsKLSAgICAvLyBTZXR1cCBkZWZhdWx0IG91dHB1dCBhcmVhIChjYW4gYmUgbGF0ZXIgbW9kaWZpZWQgZHVyaW5nIGlvLT5zZXR1cCgpKQotICAgIGlvLT53aWR0aCA9IHBpY19oZHItPndpZHRoXzsKLSAgICBpby0+aGVpZ2h0ID0gcGljX2hkci0+aGVpZ2h0XzsKLSAgICBpby0+dXNlX3NjYWxpbmcgID0gMDsKLSAgICBpby0+dXNlX2Nyb3BwaW5nID0gMDsKLSAgICBpby0+Y3JvcF90b3AgID0gMDsKLSAgICBpby0+Y3JvcF9sZWZ0ID0gMDsKLSAgICBpby0+Y3JvcF9yaWdodCAgPSBpby0+d2lkdGg7Ci0gICAgaW8tPmNyb3BfYm90dG9tID0gaW8tPmhlaWdodDsKLSAgICBpby0+bWJfdyA9IGlvLT53aWR0aDsgICAvLyBzYW5pdHkgY2hlY2sKLSAgICBpby0+bWJfaCA9IGlvLT5oZWlnaHQ7ICAvLyBkaXR0bwotCi0gICAgVlA4UmVzZXRQcm9iYSgmZGVjLT5wcm9iYV8pOwotICAgIFJlc2V0U2VnbWVudEhlYWRlcigmZGVjLT5zZWdtZW50X2hkcl8pOwotICAgIGRlYy0+c2VnbWVudF8gPSAwOyAgICAvLyBkZWZhdWx0IGZvciBpbnRyYQotICB9Ci0KLSAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhbGwgdGhlIHBhcnRpdGlvbiAjMCBhdmFpbGFibGUsIGFuZCBpbml0aWFsaXplIGRlYy0+YnJfCi0gIC8vIHRvIHJlYWQgdGhpcyBwYXJ0aXRpb24gKGFuZCB0aGlzIHBhcnRpdGlvbiBvbmx5KS4KLSAgaWYgKGZybV9oZHItPnBhcnRpdGlvbl9sZW5ndGhfID4gYnVmX3NpemUpIHsKLSAgICByZXR1cm4gVlA4U2V0RXJyb3IoZGVjLCBWUDhfU1RBVFVTX05PVF9FTk9VR0hfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgImJhZCBwYXJ0aXRpb24gbGVuZ3RoIik7Ci0gIH0KLQotICBiciA9ICZkZWMtPmJyXzsKLSAgVlA4SW5pdEJpdFJlYWRlcihiciwgYnVmLCBidWYgKyBmcm1faGRyLT5wYXJ0aXRpb25fbGVuZ3RoXyk7Ci0gIGJ1ZiArPSBmcm1faGRyLT5wYXJ0aXRpb25fbGVuZ3RoXzsKLSAgYnVmX3NpemUgLT0gZnJtX2hkci0+cGFydGl0aW9uX2xlbmd0aF87Ci0KLSAgaWYgKGZybV9oZHItPmtleV9mcmFtZV8pIHsKLSAgICBwaWNfaGRyLT5jb2xvcnNwYWNlXyA9IFZQOEdldChicik7Ci0gICAgcGljX2hkci0+Y2xhbXBfdHlwZV8gPSBWUDhHZXQoYnIpOwotICB9Ci0gIGlmICghUGFyc2VTZWdtZW50SGVhZGVyKGJyLCAmZGVjLT5zZWdtZW50X2hkcl8sICZkZWMtPnByb2JhXykpIHsKLSAgICByZXR1cm4gVlA4U2V0RXJyb3IoZGVjLCBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBwYXJzZSBzZWdtZW50IGhlYWRlciIpOwotICB9Ci0gIC8vIEZpbHRlciBzcGVjcwotICBpZiAoIVBhcnNlRmlsdGVySGVhZGVyKGJyLCBkZWMpKSB7Ci0gICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgcGFyc2UgZmlsdGVyIGhlYWRlciIpOwotICB9Ci0gIHN0YXR1cyA9IFBhcnNlUGFydGl0aW9ucyhkZWMsIGJ1ZiwgYnVmX3NpemUpOwotICBpZiAoc3RhdHVzICE9IFZQOF9TVEFUVVNfT0spIHsKLSAgICByZXR1cm4gVlA4U2V0RXJyb3IoZGVjLCBzdGF0dXMsICJjYW5ub3QgcGFyc2UgcGFydGl0aW9ucyIpOwotICB9Ci0KLSAgLy8gcXVhbnRpemVyIGNoYW5nZQotICBWUDhQYXJzZVF1YW50KGRlYyk7Ci0KLSAgLy8gRnJhbWUgYnVmZmVyIG1hcmtpbmcKLSAgaWYgKCFmcm1faGRyLT5rZXlfZnJhbWVfKSB7Ci0gICAgLy8gUGFyYWdyYXBoIDkuNwotI2lmbmRlZiBPTkxZX0tFWUZSQU1FX0NPREUKLSAgICBkZWMtPmJ1ZmZlcl9mbGFnc18gPSBWUDhHZXQoYnIpIDw8IDA7ICAgLy8gdXBkYXRlIGdvbGRlbgotICAgIGRlYy0+YnVmZmVyX2ZsYWdzXyB8PSBWUDhHZXQoYnIpIDw8IDE7ICAvLyB1cGRhdGUgYWx0IHJlZgotICAgIGlmICghKGRlYy0+YnVmZmVyX2ZsYWdzXyAmIDEpKSB7Ci0gICAgICBkZWMtPmJ1ZmZlcl9mbGFnc18gfD0gVlA4R2V0VmFsdWUoYnIsIDIpIDw8IDI7Ci0gICAgfQotICAgIGlmICghKGRlYy0+YnVmZmVyX2ZsYWdzXyAmIDIpKSB7Ci0gICAgICBkZWMtPmJ1ZmZlcl9mbGFnc18gfD0gVlA4R2V0VmFsdWUoYnIsIDIpIDw8IDQ7Ci0gICAgfQotICAgIGRlYy0+YnVmZmVyX2ZsYWdzXyB8PSBWUDhHZXQoYnIpIDw8IDY7ICAgIC8vIHNpZ24gYmlhcyBnb2xkZW4KLSAgICBkZWMtPmJ1ZmZlcl9mbGFnc18gfD0gVlA4R2V0KGJyKSA8PCA3OyAgICAvLyBzaWduIGJpYXMgYWx0IHJlZgotI2Vsc2UKLSAgICByZXR1cm4gVlA4U2V0RXJyb3IoZGVjLCBWUDhfU1RBVFVTX1VOU1VQUE9SVEVEX0ZFQVRVUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICJOb3QgYSBrZXkgZnJhbWUuIik7Ci0jZW5kaWYKLSAgfSBlbHNlIHsKLSAgICBkZWMtPmJ1ZmZlcl9mbGFnc18gPSAweDAwMyB8IDB4MTAwOwotICB9Ci0KLSAgLy8gUGFyYWdyYXBoIDkuOAotI2lmbmRlZiBPTkxZX0tFWUZSQU1FX0NPREUKLSAgZGVjLT51cGRhdGVfcHJvYmFfID0gVlA4R2V0KGJyKTsKLSAgaWYgKCFkZWMtPnVwZGF0ZV9wcm9iYV8pIHsgICAgLy8gc2F2ZSBmb3IgbGF0ZXIgcmVzdG9yZQotICAgIGRlYy0+cHJvYmFfc2F2ZWRfID0gZGVjLT5wcm9iYV87Ci0gIH0KLSAgZGVjLT5idWZmZXJfZmxhZ3NfICY9IDEgPDwgODsKLSAgZGVjLT5idWZmZXJfZmxhZ3NfIHw9Ci0gICAgICAoZnJtX2hkci0+a2V5X2ZyYW1lXyB8fCBWUDhHZXQoYnIpKSA8PCA4OyAgICAvLyByZWZyZXNoIGxhc3QgZnJhbWUKLSNlbHNlCi0gIFZQOEdldChicik7ICAgLy8ganVzdCBpZ25vcmUgdGhlIHZhbHVlIG9mIHVwZGF0ZV9wcm9iYV8KLSNlbmRpZgotCi0gIFZQOFBhcnNlUHJvYmEoYnIsIGRlYyk7Ci0KLSNpZmRlZiBXRUJQX0VYUEVSSU1FTlRBTF9GRUFUVVJFUwotICAvLyBFeHRlbnNpb25zCi0gIGlmIChkZWMtPnBpY19oZHJfLmNvbG9yc3BhY2VfKSB7Ci0gICAgY29uc3Qgc2l6ZV90IGtUcmFpbGVyU2l6ZSA9IDg7Ci0gICAgY29uc3QgdWludDhfdCBrVHJhaWxlck1hcmtlciA9IDB4MDE7Ci0gICAgY29uc3QgdWludDhfdCogZXh0X2J1ZiA9IGJ1ZiAtIGtUcmFpbGVyU2l6ZTsKLSAgICBzaXplX3Qgc2l6ZTsKLQotICAgIGlmIChmcm1faGRyLT5wYXJ0aXRpb25fbGVuZ3RoXyA8IGtUcmFpbGVyU2l6ZSB8fAotICAgICAgICBleHRfYnVmW2tUcmFpbGVyU2l6ZSAtIDFdICE9IGtUcmFpbGVyTWFya2VyKSB7Ci0gICAgICByZXR1cm4gVlA4U2V0RXJyb3IoZGVjLCBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiUklGRjogSW5jb25zaXN0ZW50IGV4dHJhIGluZm9ybWF0aW9uLiIpOwotICAgIH0KLQotICAgIC8vIExheWVyCi0gICAgc2l6ZSA9IChleHRfYnVmWzBdIDw8IDApIHwgKGV4dF9idWZbMV0gPDwgOCkgfCAoZXh0X2J1ZlsyXSA8PCAxNik7Ci0gICAgZGVjLT5sYXllcl9kYXRhX3NpemVfID0gc2l6ZTsKLSAgICBkZWMtPmxheWVyX2RhdGFfID0gTlVMTDsgIC8vIHdpbGwgYmUgc2V0IGxhdGVyCi0gICAgZGVjLT5sYXllcl9jb2xvcnNwYWNlXyA9IGV4dF9idWZbM107Ci0gIH0KLSNlbmRpZgotCi0gIC8vIHNhbml0aXplZCBzdGF0ZQotICBkZWMtPnJlYWR5XyA9IDE7Ci0gIHJldHVybiAxOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gUmVzaWR1YWwgZGVjb2RpbmcgKFBhcmFncmFwaCAxMy4yIC8gMTMuMykKLQotc3RhdGljIGNvbnN0IGludCBrQmFuZHNbMTYgKyAxXSA9IHsKLSAgMCwgMSwgMiwgMywgNiwgNCwgNSwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNywKLSAgMCAgLy8gZXh0cmEgZW50cnkgYXMgc2VudGluZWwKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IGtDYXQzW10gPSB7IDE3MywgMTQ4LCAxNDAsIDAgfTsKLXN0YXRpYyBjb25zdCB1aW50OF90IGtDYXQ0W10gPSB7IDE3NiwgMTU1LCAxNDAsIDEzNSwgMCB9Owotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0NhdDVbXSA9IHsgMTgwLCAxNTcsIDE0MSwgMTM0LCAxMzAsIDAgfTsKLXN0YXRpYyBjb25zdCB1aW50OF90IGtDYXQ2W10gPQotICB7IDI1NCwgMjU0LCAyNDMsIDIzMCwgMTk2LCAxNzcsIDE1MywgMTQwLCAxMzMsIDEzMCwgMTI5LCAwIH07Ci1zdGF0aWMgY29uc3QgdWludDhfdCogY29uc3Qga0NhdDM0NTZbXSA9IHsga0NhdDMsIGtDYXQ0LCBrQ2F0NSwga0NhdDYgfTsKLXN0YXRpYyBjb25zdCB1aW50OF90IGtaaWd6YWdbMTZdID0gewotICAwLCAxLCA0LCA4LCAgNSwgMiwgMywgNiwgIDksIDEyLCAxMywgMTAsICA3LCAxMSwgMTQsIDE1Ci19OwotCi10eXBlZGVmIGNvbnN0IHVpbnQ4X3QgKCpQcm9iYUFycmF5KVtOVU1fQ1RYXVtOVU1fUFJPQkFTXTsgIC8vIGZvciBjb25zdC1jYXN0aW5nCi10eXBlZGVmIGNvbnN0IHVpbnQ4X3QgKCpQcm9iYUN0eEFycmF5KVtOVU1fUFJPQkFTXTsKLQotLy8gU2VlIHNlY3Rpb24gMTMtMjogaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjM4NiNzZWN0aW9uLTEzLjIKLXN0YXRpYyBpbnQgR2V0TGFyZ2VWYWx1ZShWUDhCaXRSZWFkZXIqIGNvbnN0IGJyLCBjb25zdCB1aW50OF90KiBjb25zdCBwKSB7Ci0gIGludCB2OwotICBpZiAoIVZQOEdldEJpdChiciwgcFszXSkpIHsKLSAgICBpZiAoIVZQOEdldEJpdChiciwgcFs0XSkpIHsKLSAgICAgIHYgPSAyOwotICAgIH0gZWxzZSB7Ci0gICAgICB2ID0gMyArIFZQOEdldEJpdChiciwgcFs1XSk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmICghVlA4R2V0Qml0KGJyLCBwWzZdKSkgewotICAgICAgaWYgKCFWUDhHZXRCaXQoYnIsIHBbN10pKSB7Ci0gICAgICAgIHYgPSA1ICsgVlA4R2V0Qml0KGJyLCAxNTkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdiA9IDcgKyAyICogVlA4R2V0Qml0KGJyLCAxNjUpOwotICAgICAgICB2ICs9IFZQOEdldEJpdChiciwgMTQ1KTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgY29uc3QgdWludDhfdCogdGFiOwotICAgICAgY29uc3QgaW50IGJpdDEgPSBWUDhHZXRCaXQoYnIsIHBbOF0pOwotICAgICAgY29uc3QgaW50IGJpdDAgPSBWUDhHZXRCaXQoYnIsIHBbOSArIGJpdDFdKTsKLSAgICAgIGNvbnN0IGludCBjYXQgPSAyICogYml0MSArIGJpdDA7Ci0gICAgICB2ID0gMDsKLSAgICAgIGZvciAodGFiID0ga0NhdDM0NTZbY2F0XTsgKnRhYjsgKyt0YWIpIHsKLSAgICAgICAgdiArPSB2ICsgVlA4R2V0Qml0KGJyLCAqdGFiKTsKLSAgICAgIH0KLSAgICAgIHYgKz0gMyArICg4IDw8IGNhdCk7Ci0gICAgfQotICB9Ci0gIHJldHVybiB2OwotfQotCi0vLyBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiB0aGUgbGFzdCBub24temVybyBjb2VmZiBwbHVzIG9uZQotLy8gKGFuZCAwIGlmIHRoZXJlJ3Mgbm8gY29lZmYgYXQgYWxsKQotc3RhdGljIGludCBHZXRDb2VmZnMoVlA4Qml0UmVhZGVyKiBjb25zdCBiciwgUHJvYmFBcnJheSBwcm9iLAotICAgICAgICAgICAgICAgICAgICAgaW50IGN0eCwgY29uc3QgcXVhbnRfdCBkcSwgaW50IG4sIGludDE2X3QqIG91dCkgewotICAvLyBuIGlzIGVpdGhlciAwIG9yIDEgaGVyZS4ga0JhbmRzW25dIGlzIG5vdCBuZWNlc3NhcnkgZm9yIGV4dHJhY3RpbmcgJypwJy4KLSAgY29uc3QgdWludDhfdCogcCA9IHByb2Jbbl1bY3R4XTsKLSAgaWYgKCFWUDhHZXRCaXQoYnIsIHBbMF0pKSB7ICAgLy8gZmlyc3QgRU9CIGlzIG1vcmUgYSAnQ0JQJyBiaXQuCi0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgZm9yICg7IG4gPCAxNjsgKytuKSB7Ci0gICAgY29uc3QgUHJvYmFDdHhBcnJheSBwX2N0eCA9IHByb2Jba0JhbmRzW24gKyAxXV07Ci0gICAgaWYgKCFWUDhHZXRCaXQoYnIsIHBbMV0pKSB7Ci0gICAgICBwID0gcF9jdHhbMF07Ci0gICAgfSBlbHNlIHsgIC8vIG5vbiB6ZXJvIGNvZWZmCi0gICAgICBpbnQgdjsKLSAgICAgIGlmICghVlA4R2V0Qml0KGJyLCBwWzJdKSkgewotICAgICAgICB2ID0gMTsKLSAgICAgICAgcCA9IHBfY3R4WzFdOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdiA9IEdldExhcmdlVmFsdWUoYnIsIHApOwotICAgICAgICBwID0gcF9jdHhbMl07Ci0gICAgICB9Ci0gICAgICBvdXRba1ppZ3phZ1tuXV0gPSBWUDhHZXRTaWduZWQoYnIsIHYpICogZHFbbiA+IDBdOwotICAgICAgaWYgKG4gPCAxNSAmJiAhVlA4R2V0Qml0KGJyLCBwWzBdKSkgeyAgIC8vIEVPQgotICAgICAgICByZXR1cm4gbiArIDE7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiAxNjsKLX0KLQotLy8gQWxpYXMtc2FmZSB3YXkgb2YgY29udmVydGluZyA0Ynl0ZXMgdG8gMzJiaXRzLgotdHlwZWRlZiB1bmlvbiB7Ci0gIHVpbnQ4X3QgIGk4WzRdOwotICB1aW50MzJfdCBpMzI7Ci19IFBhY2tlZE56OwotCi0vLyBUYWJsZSB0byB1bnBhY2sgZm91ciBiaXRzIGludG8gZm91ciBieXRlcwotc3RhdGljIGNvbnN0IFBhY2tlZE56IGtVbnBhY2tUYWJbMTZdID0gewotICB7ezAsIDAsIDAsIDB9fSwgIHt7MSwgMCwgMCwgMH19LCAge3swLCAxLCAwLCAwfX0sICB7ezEsIDEsIDAsIDB9fSwKLSAge3swLCAwLCAxLCAwfX0sICB7ezEsIDAsIDEsIDB9fSwgIHt7MCwgMSwgMSwgMH19LCAge3sxLCAxLCAxLCAwfX0sCi0gIHt7MCwgMCwgMCwgMX19LCAge3sxLCAwLCAwLCAxfX0sICB7ezAsIDEsIDAsIDF9fSwgIHt7MSwgMSwgMCwgMX19LAotICB7ezAsIDAsIDEsIDF9fSwgIHt7MSwgMCwgMSwgMX19LCAge3swLCAxLCAxLCAxfX0sICB7ezEsIDEsIDEsIDF9fSB9OwotCi0vLyBNYWNybyB0byBwYWNrIGZvdXIgTFNCIG9mIGZvdXIgYnl0ZXMgaW50byBmb3VyIGJpdHMuCi0jaWYgZGVmaW5lZChfX1BQQ19fKSB8fCBkZWZpbmVkKF9NX1BQQykgfHwgZGVmaW5lZChfQVJDSF9QUEMpIHx8IFwKLSAgICBkZWZpbmVkKF9fQklHX0VORElBTl9fKQotI2RlZmluZSBQQUNLX0NTVCAweDA4MDQwMjAxVQotI2Vsc2UKLSNkZWZpbmUgUEFDS19DU1QgMHgwMTAyMDQwOFUKLSNlbmRpZgotI2RlZmluZSBQQUNLKFgsIFMpICgoKChYKS5pMzIgKiBQQUNLX0NTVCkgJiAweGZmMDAwMDAwKSA+PiAoUykpCi0KLXN0YXRpYyB2b2lkIFBhcnNlUmVzaWR1YWxzKFZQOERlY29kZXIqIGNvbnN0IGRlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOE1CKiBjb25zdCBtYiwgVlA4Qml0UmVhZGVyKiBjb25zdCB0b2tlbl9icikgewotICBpbnQgb3V0X3RfbnosIG91dF9sX256LCBmaXJzdDsKLSAgUHJvYmFBcnJheSBhY19wcm9iOwotICBjb25zdCBWUDhRdWFudE1hdHJpeCogcSA9ICZkZWMtPmRxbV9bZGVjLT5zZWdtZW50X107Ci0gIGludDE2X3QqIGRzdCA9IGRlYy0+Y29lZmZzXzsKLSAgVlA4TUIqIGNvbnN0IGxlZnRfbWIgPSBkZWMtPm1iX2luZm9fIC0gMTsKLSAgUGFja2VkTnogbnpfYWMsIG56X2RjOwotICBQYWNrZWROeiB0bnosIGxuejsKLSAgdWludDMyX3Qgbm9uX3plcm9fYWMgPSAwOwotICB1aW50MzJfdCBub25femVyb19kYyA9IDA7Ci0gIGludCB4LCB5LCBjaDsKLQotICBuel9kYy5pMzIgPSBuel9hYy5pMzIgPSAwOwotICBTYk1lbW9yeVNldChkc3QsIDAsIDM4NCAqIHNpemVvZigqZHN0KSk7Ci0gIGlmICghZGVjLT5pc19pNHg0XykgeyAgICAvLyBwYXJzZSBEQwotICAgIGludDE2X3QgZGNbMTZdID0geyAwIH07Ci0gICAgY29uc3QgaW50IGN0eCA9IG1iLT5kY19uel8gKyBsZWZ0X21iLT5kY19uel87Ci0gICAgbWItPmRjX256XyA9IGxlZnRfbWItPmRjX256XyA9Ci0gICAgICAgIChHZXRDb2VmZnModG9rZW5fYnIsIChQcm9iYUFycmF5KWRlYy0+cHJvYmFfLmNvZWZmc19bMV0sCi0gICAgICAgICAgICAgICAgICAgY3R4LCBxLT55Ml9tYXRfLCAwLCBkYykgPiAwKTsKLSAgICBmaXJzdCA9IDE7Ci0gICAgYWNfcHJvYiA9IChQcm9iYUFycmF5KWRlYy0+cHJvYmFfLmNvZWZmc19bMF07Ci0gICAgVlA4VHJhbnNmb3JtV0hUKGRjLCBkc3QpOwotICB9IGVsc2UgewotICAgIGZpcnN0ID0gMDsKLSAgICBhY19wcm9iID0gKFByb2JhQXJyYXkpZGVjLT5wcm9iYV8uY29lZmZzX1szXTsKLSAgfQotCi0gIHRueiA9IGtVbnBhY2tUYWJbbWItPm56XyAmIDB4Zl07Ci0gIGxueiA9IGtVbnBhY2tUYWJbbGVmdF9tYi0+bnpfICYgMHhmXTsKLSAgZm9yICh5ID0gMDsgeSA8IDQ7ICsreSkgewotICAgIGludCBsID0gbG56Lmk4W3ldOwotICAgIGZvciAoeCA9IDA7IHggPCA0OyArK3gpIHsKLSAgICAgIGNvbnN0IGludCBjdHggPSBsICsgdG56Lmk4W3hdOwotICAgICAgY29uc3QgaW50IG56ID0gR2V0Q29lZmZzKHRva2VuX2JyLCBhY19wcm9iLCBjdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcS0+eTFfbWF0XywgZmlyc3QsIGRzdCk7Ci0gICAgICB0bnouaThbeF0gPSBsID0gKG56ID4gMCk7Ci0gICAgICBuel9kYy5pOFt4XSA9IChkc3RbMF0gIT0gMCk7Ci0gICAgICBuel9hYy5pOFt4XSA9IChueiA+IDEpOwotICAgICAgZHN0ICs9IDE2OwotICAgIH0KLSAgICBsbnouaThbeV0gPSBsOwotICAgIG5vbl96ZXJvX2RjIHw9IFBBQ0sobnpfZGMsIDI0IC0geSAqIDQpOwotICAgIG5vbl96ZXJvX2FjIHw9IFBBQ0sobnpfYWMsIDI0IC0geSAqIDQpOwotICB9Ci0gIG91dF90X256ID0gUEFDSyh0bnosIDI0KTsKLSAgb3V0X2xfbnogPSBQQUNLKGxueiwgMjQpOwotCi0gIHRueiA9IGtVbnBhY2tUYWJbbWItPm56XyA+PiA0XTsKLSAgbG56ID0ga1VucGFja1RhYltsZWZ0X21iLT5uel8gPj4gNF07Ci0gIGZvciAoY2ggPSAwOyBjaCA8IDQ7IGNoICs9IDIpIHsKLSAgICBmb3IgKHkgPSAwOyB5IDwgMjsgKyt5KSB7Ci0gICAgICBpbnQgbCA9IGxuei5pOFtjaCArIHldOwotICAgICAgZm9yICh4ID0gMDsgeCA8IDI7ICsreCkgewotICAgICAgICBjb25zdCBpbnQgY3R4ID0gbCArIHRuei5pOFtjaCArIHhdOwotICAgICAgICBjb25zdCBpbnQgbnogPQotICAgICAgICAgICAgR2V0Q29lZmZzKHRva2VuX2JyLCAoUHJvYmFBcnJheSlkZWMtPnByb2JhXy5jb2VmZnNfWzJdLAotICAgICAgICAgICAgICAgICAgICAgIGN0eCwgcS0+dXZfbWF0XywgMCwgZHN0KTsKLSAgICAgICAgdG56Lmk4W2NoICsgeF0gPSBsID0gKG56ID4gMCk7Ci0gICAgICAgIG56X2RjLmk4W3kgKiAyICsgeF0gPSAoZHN0WzBdICE9IDApOwotICAgICAgICBuel9hYy5pOFt5ICogMiArIHhdID0gKG56ID4gMSk7Ci0gICAgICAgIGRzdCArPSAxNjsKLSAgICAgIH0KLSAgICAgIGxuei5pOFtjaCArIHldID0gbDsKLSAgICB9Ci0gICAgbm9uX3plcm9fZGMgfD0gUEFDSyhuel9kYywgOCAtIGNoICogMik7Ci0gICAgbm9uX3plcm9fYWMgfD0gUEFDSyhuel9hYywgOCAtIGNoICogMik7Ci0gIH0KLSAgb3V0X3RfbnogfD0gUEFDSyh0bnosIDIwKTsKLSAgb3V0X2xfbnogfD0gUEFDSyhsbnosIDIwKTsKLSAgbWItPm56XyA9IG91dF90X256OwotICBsZWZ0X21iLT5uel8gPSBvdXRfbF9uejsKLQotICBkZWMtPm5vbl96ZXJvX2FjXyA9IG5vbl96ZXJvX2FjOwotICBkZWMtPm5vbl96ZXJvXyA9IG5vbl96ZXJvX2FjIHwgbm9uX3plcm9fZGM7Ci0gIG1iLT5za2lwXyA9ICFkZWMtPm5vbl96ZXJvXzsKLX0KLSN1bmRlZiBQQUNLCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBNYWluIGxvb3AKLQotaW50IFZQOERlY29kZU1CKFZQOERlY29kZXIqIGNvbnN0IGRlYywgVlA4Qml0UmVhZGVyKiBjb25zdCB0b2tlbl9icikgewotICBWUDhCaXRSZWFkZXIqIGNvbnN0IGJyID0gJmRlYy0+YnJfOwotICBWUDhNQiogY29uc3QgbGVmdCA9IGRlYy0+bWJfaW5mb18gLSAxOwotICBWUDhNQiogY29uc3QgaW5mbyA9IGRlYy0+bWJfaW5mb18gKyBkZWMtPm1iX3hfOwotCi0gIC8vIE5vdGU6IHdlIGRvbid0IHNhdmUgc2VnbWVudCBtYXAgKHlldCksIGFzIHdlIGRvbid0IGV4cGVjdAotICAvLyB0byBkZWNvZGUgbW9yZSB0aGFuIDEga2V5ZnJhbWUuCi0gIGlmIChkZWMtPnNlZ21lbnRfaGRyXy51cGRhdGVfbWFwXykgewotICAgIC8vIEhhcmRjb2RlZCB0cmVlIHBhcnNpbmcKLSAgICBkZWMtPnNlZ21lbnRfID0gIVZQOEdldEJpdChiciwgZGVjLT5wcm9iYV8uc2VnbWVudHNfWzBdKSA/Ci0gICAgICAgIFZQOEdldEJpdChiciwgZGVjLT5wcm9iYV8uc2VnbWVudHNfWzFdKSA6Ci0gICAgICAgIDIgKyBWUDhHZXRCaXQoYnIsIGRlYy0+cHJvYmFfLnNlZ21lbnRzX1syXSk7Ci0gIH0KLSAgaW5mby0+c2tpcF8gPSBkZWMtPnVzZV9za2lwX3Byb2JhXyA/IFZQOEdldEJpdChiciwgZGVjLT5za2lwX3BfKSA6IDA7Ci0KLSAgVlA4UGFyc2VJbnRyYU1vZGUoYnIsIGRlYyk7Ci0gIGlmIChici0+ZW9mXykgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgaWYgKCFpbmZvLT5za2lwXykgewotICAgIFBhcnNlUmVzaWR1YWxzKGRlYywgaW5mbywgdG9rZW5fYnIpOwotICB9IGVsc2UgewotICAgIGxlZnQtPm56XyA9IGluZm8tPm56XyA9IDA7Ci0gICAgaWYgKCFkZWMtPmlzX2k0eDRfKSB7Ci0gICAgICBsZWZ0LT5kY19uel8gPSBpbmZvLT5kY19uel8gPSAwOwotICAgIH0KLSAgICBkZWMtPm5vbl96ZXJvXyA9IDA7Ci0gICAgZGVjLT5ub25femVyb19hY18gPSAwOwotICB9Ci0KLSAgaWYgKGRlYy0+ZmlsdGVyX3R5cGVfID4gMCkgeyAgLy8gc3RvcmUgZmlsdGVyIGluZm8KLSAgICBWUDhGSW5mbyogY29uc3QgZmluZm8gPSBkZWMtPmZfaW5mb18gKyBkZWMtPm1iX3hfOwotICAgICpmaW5mbyA9IGRlYy0+ZnN0cmVuZ3Roc19bZGVjLT5zZWdtZW50X11bZGVjLT5pc19pNHg0X107Ci0gICAgZmluZm8tPmZfaW5uZXJfID0gKCFpbmZvLT5za2lwXyB8fCBkZWMtPmlzX2k0eDRfKTsKLSAgfQotCi0gIHJldHVybiAoIXRva2VuX2JyLT5lb2ZfKTsKLX0KLQotdm9pZCBWUDhJbml0U2NhbmxpbmUoVlA4RGVjb2RlciogY29uc3QgZGVjKSB7Ci0gIFZQOE1CKiBjb25zdCBsZWZ0ID0gZGVjLT5tYl9pbmZvXyAtIDE7Ci0gIGxlZnQtPm56XyA9IDA7Ci0gIGxlZnQtPmRjX256XyA9IDA7Ci0gIFNiTWVtb3J5U2V0KGRlYy0+aW50cmFfbF8sIEJfRENfUFJFRCwgc2l6ZW9mKGRlYy0+aW50cmFfbF8pKTsKLSAgZGVjLT5maWx0ZXJfcm93XyA9Ci0gICAgKGRlYy0+ZmlsdGVyX3R5cGVfID4gMCkgJiYKLSAgICAoZGVjLT5tYl95XyA+PSBkZWMtPnRsX21iX3lfKSAmJiAoZGVjLT5tYl95XyA8PSBkZWMtPmJyX21iX3lfKTsKLX0KLQotc3RhdGljIGludCBQYXJzZUZyYW1lKFZQOERlY29kZXIqIGNvbnN0IGRlYywgVlA4SW8qIGlvKSB7Ci0gIGZvciAoZGVjLT5tYl95XyA9IDA7IGRlYy0+bWJfeV8gPCBkZWMtPmJyX21iX3lfOyArK2RlYy0+bWJfeV8pIHsKLSAgICBWUDhCaXRSZWFkZXIqIGNvbnN0IHRva2VuX2JyID0KLSAgICAgICAgJmRlYy0+cGFydHNfW2RlYy0+bWJfeV8gJiAoZGVjLT5udW1fcGFydHNfIC0gMSldOwotICAgIFZQOEluaXRTY2FubGluZShkZWMpOwotICAgIGZvciAoZGVjLT5tYl94XyA9IDA7IGRlYy0+bWJfeF8gPCBkZWMtPm1iX3dfOyAgZGVjLT5tYl94XysrKSB7Ci0gICAgICBpZiAoIVZQOERlY29kZU1CKGRlYywgdG9rZW5fYnIpKSB7Ci0gICAgICAgIHJldHVybiBWUDhTZXRFcnJvcihkZWMsIFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByZW1hdHVyZSBlbmQtb2YtZmlsZSBlbmNvdW50ZXJlZC4iKTsKLSAgICAgIH0KLSAgICAgIC8vIFJlY29uc3RydWN0IGFuZCBlbWl0IHNhbXBsZXMuCi0gICAgICBWUDhSZWNvbnN0cnVjdEJsb2NrKGRlYyk7Ci0gICAgfQotICAgIGlmICghVlA4UHJvY2Vzc1JvdyhkZWMsIGlvKSkgewotICAgICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19VU0VSX0FCT1JULCAiT3V0cHV0IGFib3J0ZWQuIik7Ci0gICAgfQotICB9Ci0gIGlmIChkZWMtPnVzZV90aHJlYWRzXyAmJiAhV2ViUFdvcmtlclN5bmMoJmRlYy0+d29ya2VyXykpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8vIEZpbmlzaAotI2lmbmRlZiBPTkxZX0tFWUZSQU1FX0NPREUKLSAgaWYgKCFkZWMtPnVwZGF0ZV9wcm9iYV8pIHsKLSAgICBkZWMtPnByb2JhXyA9IGRlYy0+cHJvYmFfc2F2ZWRfOwotICB9Ci0jZW5kaWYKLQotI2lmZGVmIFdFQlBfRVhQRVJJTUVOVEFMX0ZFQVRVUkVTCi0gIGlmIChkZWMtPmxheWVyX2RhdGFfc2l6ZV8gPiAwKSB7Ci0gICAgaWYgKCFWUDhEZWNvZGVMYXllcihkZWMpKSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIH0KLSNlbmRpZgotCi0gIHJldHVybiAxOwotfQotCi0vLyBNYWluIGVudHJ5IHBvaW50Ci1pbnQgVlA4RGVjb2RlKFZQOERlY29kZXIqIGNvbnN0IGRlYywgVlA4SW8qIGNvbnN0IGlvKSB7Ci0gIGludCBvayA9IDA7Ci0gIGlmIChkZWMgPT0gTlVMTCkgewotICAgIHJldHVybiAwOwotICB9Ci0gIGlmIChpbyA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19JTlZBTElEX1BBUkFNLAotICAgICAgICAgICAgICAgICAgICAgICAiTlVMTCBWUDhJbyBwYXJhbWV0ZXIgaW4gVlA4RGVjb2RlKCkuIik7Ci0gIH0KLQotICBpZiAoIWRlYy0+cmVhZHlfKSB7Ci0gICAgaWYgKCFWUDhHZXRIZWFkZXJzKGRlYywgaW8pKSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIH0KLSAgU0JfRENIRUNLKGRlYy0+cmVhZHlfKTsKLQotICAvLyBGaW5pc2ggc2V0dGluZyB1cCB0aGUgZGVjb2RpbmcgcGFyYW1ldGVyLiBXaWxsIGNhbGwgaW8tPnNldHVwKCkuCi0gIG9rID0gKFZQOEVudGVyQ3JpdGljYWwoZGVjLCBpbykgPT0gVlA4X1NUQVRVU19PSyk7Ci0gIGlmIChvaykgeyAgIC8vIGdvb2QgdG8gZ28uCi0gICAgLy8gV2lsbCBhbGxvY2F0ZSBtZW1vcnkgYW5kIHByZXBhcmUgZXZlcnl0aGluZy4KLSAgICBpZiAob2spIG9rID0gVlA4SW5pdEZyYW1lKGRlYywgaW8pOwotCi0gICAgLy8gTWFpbiBkZWNvZGluZyBsb29wCi0gICAgaWYgKG9rKSBvayA9IFBhcnNlRnJhbWUoZGVjLCBpbyk7Ci0KLSAgICAvLyBFeGl0LgotICAgIG9rICY9IFZQOEV4aXRDcml0aWNhbChkZWMsIGlvKTsKLSAgfQotCi0gIGlmICghb2spIHsKLSAgICBWUDhDbGVhcihkZWMpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgZGVjLT5yZWFkeV8gPSAwOwotICByZXR1cm4gb2s7Ci19Ci0KLXZvaWQgVlA4Q2xlYXIoVlA4RGVjb2RlciogY29uc3QgZGVjKSB7Ci0gIGlmIChkZWMgPT0gTlVMTCkgewotICAgIHJldHVybjsKLSAgfQotICBpZiAoZGVjLT51c2VfdGhyZWFkc18pIHsKLSAgICBXZWJQV29ya2VyRW5kKCZkZWMtPndvcmtlcl8pOwotICB9Ci0gIGlmIChkZWMtPm1lbV8pIHsKLSAgICBTYk1lbW9yeURlYWxsb2NhdGUoZGVjLT5tZW1fKTsKLSAgfQotICBkZWMtPm1lbV8gPSBOVUxMOwotICBkZWMtPm1lbV9zaXplXyA9IDA7Ci0gIFNiTWVtb3J5U2V0KCZkZWMtPmJyXywgMCwgc2l6ZW9mKGRlYy0+YnJfKSk7Ci0gIGRlYy0+cmVhZHlfID0gMDsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kZWMvdnA4aS5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL3ZwOGkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFkMjdmMS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kZWMvdnA4aS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDEwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBWUDggZGVjb2RlcjogaW50ZXJuYWwgaGVhZGVyLgotLy8KLS8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCi0KLSNpZm5kZWYgV0VCUF9ERUNfVlA4SV9IXwotI2RlZmluZSBXRUJQX0RFQ19WUDhJX0hfCi0KLSNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCi0jZWxzZQotI2luY2x1ZGUgPHN0cmluZy5oPiAgICAgLy8gZm9yIG1lbWNweSgpCi0jZW5kaWYKLQotI2luY2x1ZGUgIi4vdnA4bGkuaCIKLSNpbmNsdWRlICIuLi91dGlscy9iaXRfcmVhZGVyLmgiCi0jaW5jbHVkZSAiLi4vdXRpbHMvdGhyZWFkLmgiCi0jaW5jbHVkZSAiLi4vZHNwL2RzcC5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFZhcmlvdXMgZGVmaW5lcyBhbmQgZW51bXMKLQotLy8gdmVyc2lvbiBudW1iZXJzCi0jZGVmaW5lIERFQ19NQUpfVkVSU0lPTiAwCi0jZGVmaW5lIERFQ19NSU5fVkVSU0lPTiAzCi0jZGVmaW5lIERFQ19SRVZfVkVSU0lPTiAxCi0KLSNkZWZpbmUgT05MWV9LRVlGUkFNRV9DT0RFICAgICAgLy8gdG8gcmVtb3ZlIGFueSBjb2RlIHJlbGF0ZWQgdG8gUC1GcmFtZXMKLQotLy8gaW50cmEgcHJlZGljdGlvbiBtb2RlcwotZW51bSB7IEJfRENfUFJFRCA9IDAsICAgLy8gNHg0IG1vZGVzCi0gICAgICAgQl9UTV9QUkVELAotICAgICAgIEJfVkVfUFJFRCwKLSAgICAgICBCX0hFX1BSRUQsCi0gICAgICAgQl9SRF9QUkVELAotICAgICAgIEJfVlJfUFJFRCwKLSAgICAgICBCX0xEX1BSRUQsCi0gICAgICAgQl9WTF9QUkVELAotICAgICAgIEJfSERfUFJFRCwKLSAgICAgICBCX0hVX1BSRUQsCi0gICAgICAgTlVNX0JNT0RFUyA9IEJfSFVfUFJFRCArIDEgLSBCX0RDX1BSRUQsICAvLyA9IDEwCi0KLSAgICAgICAvLyBMdW1hMTYgb3IgVVYgbW9kZXMKLSAgICAgICBEQ19QUkVEID0gQl9EQ19QUkVELCBWX1BSRUQgPSBCX1ZFX1BSRUQsCi0gICAgICAgSF9QUkVEID0gQl9IRV9QUkVELCBUTV9QUkVEID0gQl9UTV9QUkVELAotICAgICAgIEJfUFJFRCA9IE5VTV9CTU9ERVMsICAgLy8gcmVmaW5lZCBJNHg0IG1vZGUKLQotICAgICAgIC8vIHNwZWNpYWwgbW9kZXMKLSAgICAgICBCX0RDX1BSRURfTk9UT1AgPSA0LAotICAgICAgIEJfRENfUFJFRF9OT0xFRlQgPSA1LAotICAgICAgIEJfRENfUFJFRF9OT1RPUExFRlQgPSA2LAotICAgICAgIE5VTV9CX0RDX01PREVTID0gNyB9OwotCi1lbnVtIHsgTUJfRkVBVFVSRV9UUkVFX1BST0JTID0gMywKLSAgICAgICBOVU1fTUJfU0VHTUVOVFMgPSA0LAotICAgICAgIE5VTV9SRUZfTEZfREVMVEFTID0gNCwKLSAgICAgICBOVU1fTU9ERV9MRl9ERUxUQVMgPSA0LCAgICAvLyBJNHg0LCBaRVJPLCAqLCBTUExJVAotICAgICAgIE1BWF9OVU1fUEFSVElUSU9OUyA9IDgsCi0gICAgICAgLy8gUHJvYmFiaWxpdGllcwotICAgICAgIE5VTV9UWVBFUyA9IDQsCi0gICAgICAgTlVNX0JBTkRTID0gOCwKLSAgICAgICBOVU1fQ1RYID0gMywKLSAgICAgICBOVU1fUFJPQkFTID0gMTEsCi0gICAgICAgTlVNX01WX1BST0JBUyA9IDE5IH07Ci0KLS8vIFlVVi1jYWNoZSBwYXJhbWV0ZXJzLgotLy8gQ29uc3RyYWludHMgYXJlOiBXZSBuZWVkIHRvIHN0b3JlIG9uZSAxNngxNiBibG9jayBvZiBsdW1hIHNhbXBsZXMgKHkpLAotLy8gYW5kIHR3byA4eDggY2hyb21hIGJsb2NrcyAodS92KS4gVGhlc2UgYXJlIGJldHRlciBiZSAxNi1ieXRlcyBhbGlnbmVkLAotLy8gaW4gb3JkZXIgdG8gYmUgU0lNRC1mcmllbmRseS4gV2UgYWxzbyBuZWVkIHRvIHN0b3JlIHRoZSB0b3AsIGxlZnQgYW5kCi0vLyB0b3AtbGVmdCBzYW1wbGVzIChmcm9tIHByZXZpb3VzbHkgZGVjb2RlZCBibG9ja3MpLCBhbG9uZyB3aXRoIGZvdXIKLS8vIGV4dHJhIHRvcC1yaWdodCBzYW1wbGVzIGZvciBsdW1hIChpbnRyYTR4NCBwcmVkaWN0aW9uIG9ubHkpLgotLy8gT25lIHBvc3NpYmxlIGxheW91dCBpcywgdXNpbmcgMzIgKiAoMTcgKyA5KSBieXRlczoKLS8vCi0vLyAgIC4rLS0tLS0tICAgPC0gb25seSAxIHBpeGVsIGhpZ2gKLS8vICAgLnx5eXl5dC4KLS8vICAgLnx5eXl5dC4KLS8vICAgLnx5eXl5dC4KLS8vICAgLnx5eXl5Li4KLS8vICAgListLS4rLS0gICA8LSBvbmx5IDEgcGl4ZWwgaGlnaAotLy8gICAufHV1Lnx2dgotLy8gICAufHV1Lnx2dgotLy8KLS8vIEV2ZXJ5IGNoYXJhY3RlciBpcyBhIDR4NCBibG9jaywgd2l0aCBsZWdlbmQ6Ci0vLyAgJy4nID0gdW51c2VkCi0vLyAgJ3knID0geS1zYW1wbGVzICAgJ3UnID0gdS1zYW1wbGVzICAgICAndicgPSB1LXNhbXBsZXMKLS8vICAnfCcgPSBsZWZ0IHNhbXBsZSwgICAnLScgPSB0b3Agc2FtcGxlLCAgICAnKycgPSB0b3AtbGVmdCBzYW1wbGUKLS8vICAndCcgPSBleHRyYSB0b3AtcmlnaHQgc2FtcGxlIGZvciA0eDQgbW9kZXMKLS8vIFdpdGggdGhpcyBsYXlvdXQsIEJQUyAoPUJ5dGVzIFBlciBTY2FuLWxpbmUpIGlzIG9uZSBjYWNoZWxpbmUgc2l6ZS4KLSNkZWZpbmUgQlBTICAgICAgIDMyICAgIC8vIHRoaXMgaXMgdGhlIGNvbW1vbiBzdHJpZGUgdXNlZCBieSB5dXZbXQotI2RlZmluZSBZVVZfU0laRSAoQlBTICogMTcgKyBCUFMgKiA5KQotI2RlZmluZSBZX1NJWkUgICAoQlBTICogMTcpCi0jZGVmaW5lIFlfT0ZGICAgIChCUFMgKiAxICsgOCkKLSNkZWZpbmUgVV9PRkYgICAgKFlfT0ZGICsgQlBTICogMTYgKyBCUFMpCi0jZGVmaW5lIFZfT0ZGICAgIChVX09GRiArIDE2KQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gSGVhZGVycwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3Qga2V5X2ZyYW1lXzsKLSAgdWludDhfdCBwcm9maWxlXzsKLSAgdWludDhfdCBzaG93XzsKLSAgdWludDMyX3QgcGFydGl0aW9uX2xlbmd0aF87Ci19IFZQOEZyYW1lSGVhZGVyOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQxNl90IHdpZHRoXzsKLSAgdWludDE2X3QgaGVpZ2h0XzsKLSAgdWludDhfdCB4c2NhbGVfOwotICB1aW50OF90IHlzY2FsZV87Ci0gIHVpbnQ4X3QgY29sb3JzcGFjZV87ICAgLy8gMCA9IFlDYkNyCi0gIHVpbnQ4X3QgY2xhbXBfdHlwZV87Ci19IFZQOFBpY3R1cmVIZWFkZXI7Ci0KLS8vIHNlZ21lbnQgZmVhdHVyZXMKLXR5cGVkZWYgc3RydWN0IHsKLSAgaW50IHVzZV9zZWdtZW50XzsKLSAgaW50IHVwZGF0ZV9tYXBfOyAgICAgICAgLy8gd2hldGhlciB0byB1cGRhdGUgdGhlIHNlZ21lbnQgbWFwIG9yIG5vdAotICBpbnQgYWJzb2x1dGVfZGVsdGFfOyAgICAvLyBhYnNvbHV0ZSBvciBkZWx0YSB2YWx1ZXMgZm9yIHF1YW50aXplciBhbmQgZmlsdGVyCi0gIGludDhfdCBxdWFudGl6ZXJfW05VTV9NQl9TRUdNRU5UU107ICAgICAgICAvLyBxdWFudGl6YXRpb24gY2hhbmdlcwotICBpbnQ4X3QgZmlsdGVyX3N0cmVuZ3RoX1tOVU1fTUJfU0VHTUVOVFNdOyAgLy8gZmlsdGVyIHN0cmVuZ3RoIGZvciBzZWdtZW50cwotfSBWUDhTZWdtZW50SGVhZGVyOwotCi0vLyBTdHJ1Y3QgY29sbGVjdGluZyBhbGwgZnJhbWUtcGVyc2lzdGVudCBwcm9iYWJpbGl0aWVzLgotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IHNlZ21lbnRzX1tNQl9GRUFUVVJFX1RSRUVfUFJPQlNdOwotICAvLyBUeXBlOiAwOkludHJhMTYtQUMgIDE6SW50cmExNi1EQyAgIDI6Q2hyb21hICAgMzpJbnRyYTQKLSAgdWludDhfdCBjb2VmZnNfW05VTV9UWVBFU11bTlVNX0JBTkRTXVtOVU1fQ1RYXVtOVU1fUFJPQkFTXTsKLSNpZm5kZWYgT05MWV9LRVlGUkFNRV9DT0RFCi0gIHVpbnQ4X3QgeW1vZGVfWzRdLCB1dm1vZGVfWzNdOwotICB1aW50OF90IG12X1syXVtOVU1fTVZfUFJPQkFTXTsKLSNlbmRpZgotfSBWUDhQcm9iYTsKLQotLy8gRmlsdGVyIHBhcmFtZXRlcnMKLXR5cGVkZWYgc3RydWN0IHsKLSAgaW50IHNpbXBsZV87ICAgICAgICAgICAgICAgICAgLy8gMD1jb21wbGV4LCAxPXNpbXBsZQotICBpbnQgbGV2ZWxfOyAgICAgICAgICAgICAgICAgICAvLyBbMC4uNjNdCi0gIGludCBzaGFycG5lc3NfOyAgICAgICAgICAgICAgIC8vIFswLi43XQotICBpbnQgdXNlX2xmX2RlbHRhXzsKLSAgaW50IHJlZl9sZl9kZWx0YV9bTlVNX1JFRl9MRl9ERUxUQVNdOwotICBpbnQgbW9kZV9sZl9kZWx0YV9bTlVNX01PREVfTEZfREVMVEFTXTsKLX0gVlA4RmlsdGVySGVhZGVyOwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gSW5mb3JtYXRpb25zIGFib3V0IHRoZSBtYWNyb2Jsb2Nrcy4KLQotdHlwZWRlZiBzdHJ1Y3QgeyAgLy8gZmlsdGVyIHNwZWNzCi0gIHVuc2lnbmVkIGludCBmX2xldmVsXzo2OyAgICAgIC8vIGZpbHRlciBzdHJlbmd0aDogMC4uNjMKLSAgdW5zaWduZWQgaW50IGZfaWxldmVsXzo2OyAgICAgLy8gaW5uZXIgbGltaXQ6IDEuLjYzCi0gIHVuc2lnbmVkIGludCBmX2lubmVyXzoxOyAgICAgIC8vIGRvIGlubmVyIGZpbHRlcmluZz8KLX0gVlA4RkluZm87Ci0KLXR5cGVkZWYgc3RydWN0IHsgIC8vIHVzZWQgZm9yIHN5bnRheC1wYXJzaW5nCi0gIHVuc2lnbmVkIGludCBuel86MjQ7ICAgICAgIC8vIG5vbi16ZXJvIEFDL0RDIGNvZWZmcyAoMjRiaXQpCi0gIHVuc2lnbmVkIGludCBkY19uel86MTsgICAgIC8vIG5vbi16ZXJvIERDIGNvZWZmcwotICB1bnNpZ25lZCBpbnQgc2tpcF86MTsgICAgICAvLyBibG9jayB0eXBlCi19IFZQOE1COwotCi0vLyBEZXF1YW50aXphdGlvbiBtYXRyaWNlcwotdHlwZWRlZiBpbnQgcXVhbnRfdFsyXTsgICAgICAvLyBbREMgLyBBQ10uICBDYW4gYmUgJ3VpbnQxNl90WzJdJyB0b28gKH5zbG93ZXIpLgotdHlwZWRlZiBzdHJ1Y3QgewotICBxdWFudF90IHkxX21hdF8sIHkyX21hdF8sIHV2X21hdF87Ci19IFZQOFF1YW50TWF0cml4OwotCi0vLyBQZXJzaXN0ZW50IGluZm9ybWF0aW9uIG5lZWRlZCBieSB0aGUgcGFyYWxsZWwgcHJvY2Vzc2luZwotdHlwZWRlZiBzdHJ1Y3QgewotICBpbnQgaWRfOyAgICAgICAgICAgIC8vIGNhY2hlIHJvdyB0byBwcm9jZXNzIChpbiBbMC4uMl0pCi0gIGludCBtYl95XzsgICAgICAgICAgLy8gbWFjcm9ibG9jayBwb3NpdGlvbiBvZiB0aGUgcm93Ci0gIGludCBmaWx0ZXJfcm93XzsgICAgLy8gdHJ1ZSBpZiByb3ctZmlsdGVyaW5nIGlzIG5lZWRlZAotICBWUDhGSW5mbyogZl9pbmZvXzsgIC8vIGZpbHRlciBzdHJlbmd0aHMKLSAgVlA4SW8gaW9fOyAgICAgICAgICAvLyBjb3B5IG9mIHRoZSBWUDhJbyB0byBwYXNzIHRvIHB1dCgpCi19IFZQOFRocmVhZENvbnRleHQ7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBWUDhEZWNvZGVyOiB0aGUgbWFpbiBvcGFxdWUgc3RydWN0dXJlIGhhbmRlZCBvdmVyIHRvIHVzZXIKLQotc3RydWN0IFZQOERlY29kZXIgewotICBWUDhTdGF0dXNDb2RlIHN0YXR1c187Ci0gIGludCByZWFkeV87ICAgICAvLyB0cnVlIGlmIHJlYWR5IHRvIGRlY29kZSBhIHBpY3R1cmUgd2l0aCBWUDhEZWNvZGUoKQotICBjb25zdCBjaGFyKiBlcnJvcl9tc2dfOyAgLy8gc2V0IHdoZW4gc3RhdHVzXyBpcyBub3QgT0suCi0KLSAgLy8gTWFpbiBkYXRhIHNvdXJjZQotICBWUDhCaXRSZWFkZXIgYnJfOwotCi0gIC8vIGhlYWRlcnMKLSAgVlA4RnJhbWVIZWFkZXIgICBmcm1faGRyXzsKLSAgVlA4UGljdHVyZUhlYWRlciBwaWNfaGRyXzsKLSAgVlA4RmlsdGVySGVhZGVyICBmaWx0ZXJfaGRyXzsKLSAgVlA4U2VnbWVudEhlYWRlciBzZWdtZW50X2hkcl87Ci0KLSAgLy8gV29ya2VyCi0gIFdlYlBXb3JrZXIgd29ya2VyXzsKLSAgaW50IHVzZV90aHJlYWRzXzsgICAgLy8gdXNlIG11bHRpLXRocmVhZAotICBpbnQgY2FjaGVfaWRfOyAgICAgICAvLyBjdXJyZW50IGNhY2hlIHJvdwotICBpbnQgbnVtX2NhY2hlc187ICAgICAvLyBudW1iZXIgb2YgY2FjaGVkIHJvd3Mgb2YgMTYgcGl4ZWxzICgxLCAyIG9yIDMpCi0gIFZQOFRocmVhZENvbnRleHQgdGhyZWFkX2N0eF87ICAvLyBUaHJlYWQgY29udGV4dAotCi0gIC8vIGRpbWVuc2lvbiwgaW4gbWFjcm9ibG9jayB1bml0cy4KLSAgaW50IG1iX3dfLCBtYl9oXzsKLQotICAvLyBNYWNyb2Jsb2NrIHRvIHByb2Nlc3MvZmlsdGVyLCBkZXBlbmRpbmcgb24gY3JvcHBpbmcgYW5kIGZpbHRlcl90eXBlLgotICBpbnQgdGxfbWJfeF8sIHRsX21iX3lfOyAgLy8gdG9wLWxlZnQgTUIgdGhhdCBtdXN0IGJlIGluLWxvb3AgZmlsdGVyZWQKLSAgaW50IGJyX21iX3hfLCBicl9tYl95XzsgIC8vIGxhc3QgYm90dG9tLXJpZ2h0IE1CIHRoYXQgbXVzdCBiZSBkZWNvZGVkCi0KLSAgLy8gbnVtYmVyIG9mIHBhcnRpdGlvbnMuCi0gIGludCBudW1fcGFydHNfOwotICAvLyBwZXItcGFydGl0aW9uIGJvb2xlYW4gZGVjb2RlcnMuCi0gIFZQOEJpdFJlYWRlciBwYXJ0c19bTUFYX05VTV9QQVJUSVRJT05TXTsKLQotICAvLyBidWZmZXIgcmVmcmVzaCBmbGFncwotICAvLyAgIGJpdCAwOiByZWZyZXNoIEdvbGQsIGJpdCAxOiByZWZyZXNoIEFsdAotICAvLyAgIGJpdCAyLTM6IGNvcHkgdG8gR29sZCwgYml0IDQtNTogY29weSB0byBBbHQKLSAgLy8gICBiaXQgNjogR29sZCBzaWduIGJpYXMsIGJpdCA3OiBBbHQgc2lnbiBiaWFzCi0gIC8vICAgYml0IDg6IHJlZnJlc2ggbGFzdCBmcmFtZQotICB1aW50MzJfdCBidWZmZXJfZmxhZ3NfOwotCi0gIC8vIGRlcXVhbnRpemF0aW9uIChvbmUgc2V0IG9mIERDL0FDIGRlcXVhbnQgZmFjdG9yIHBlciBzZWdtZW50KQotICBWUDhRdWFudE1hdHJpeCBkcW1fW05VTV9NQl9TRUdNRU5UU107Ci0KLSAgLy8gcHJvYmFiaWxpdGllcwotICBWUDhQcm9iYSBwcm9iYV87Ci0gIGludCB1c2Vfc2tpcF9wcm9iYV87Ci0gIHVpbnQ4X3Qgc2tpcF9wXzsKLSNpZm5kZWYgT05MWV9LRVlGUkFNRV9DT0RFCi0gIHVpbnQ4X3QgaW50cmFfcF8sIGxhc3RfcF8sIGdvbGRlbl9wXzsKLSAgVlA4UHJvYmEgcHJvYmFfc2F2ZWRfOwotICBpbnQgdXBkYXRlX3Byb2JhXzsKLSNlbmRpZgotCi0gIC8vIEJvdW5kYXJ5IGRhdGEgY2FjaGUgYW5kIHBlcnNpc3RlbnQgYnVmZmVycy4KLSAgdWludDhfdCogaW50cmFfdF87ICAgICAvLyB0b3AgaW50cmEgbW9kZXMgdmFsdWVzOiA0ICogbWJfd18KLSAgdWludDhfdCAgaW50cmFfbF9bNF07ICAvLyBsZWZ0IGludHJhIG1vZGVzIHZhbHVlcwotICB1aW50OF90KiB5X3RfOyAgICAgICAgIC8vIHRvcCBsdW1hIHNhbXBsZXM6IDE2ICogbWJfd18KLSAgdWludDhfdCogdV90XywgKnZfdF87ICAvLyB0b3AgdS92IHNhbXBsZXM6IDggKiBtYl93XyBlYWNoCi0KLSAgVlA4TUIqIG1iX2luZm9fOyAgICAgICAvLyBjb250ZXh0dWFsIG1hY3JvYmxvY2sgaW5mbyAobWJfd18gKyAxKQotICBWUDhGSW5mbyogZl9pbmZvXzsgICAgIC8vIGZpbHRlciBzdHJlbmd0aCBpbmZvCi0gIHVpbnQ4X3QqIHl1dl9iXzsgICAgICAgLy8gbWFpbiBibG9jayBmb3IgWS9VL1YgKHNpemUgPSBZVVZfU0laRSkKLSAgaW50MTZfdCogY29lZmZzXzsgICAgICAvLyAzODQgY29lZmZzID0gKDE2KzgrOCkgKiA0KjQKLQotICB1aW50OF90KiBjYWNoZV95XzsgICAgIC8vIG1hY3JvYmxvY2sgcm93IGZvciBzdG9yaW5nIHVuZmlsdGVyZWQgc2FtcGxlcwotICB1aW50OF90KiBjYWNoZV91XzsKLSAgdWludDhfdCogY2FjaGVfdl87Ci0gIGludCBjYWNoZV95X3N0cmlkZV87Ci0gIGludCBjYWNoZV91dl9zdHJpZGVfOwotCi0gIC8vIG1haW4gbWVtb3J5IGNodW5rIGZvciB0aGUgYWJvdmUgZGF0YS4gUGVyc2lzdGVudC4KLSAgdm9pZCogbWVtXzsKLSAgc2l6ZV90IG1lbV9zaXplXzsKLQotICAvLyBQZXIgbWFjcm9ibG9jayBub24tcGVyc2lzdGVudCBpbmZvcy4KLSAgaW50IG1iX3hfLCBtYl95XzsgICAgICAgLy8gY3VycmVudCBwb3NpdGlvbiwgaW4gbWFjcm9ibG9jayB1bml0cwotICB1aW50OF90IGlzX2k0eDRfOyAgICAgICAvLyB0cnVlIGlmIGludHJhNHg0Ci0gIHVpbnQ4X3QgaW1vZGVzX1sxNl07ICAgIC8vIG9uZSAxNngxNiBtb2RlICgjMCkgb3Igc2l4dGVlbiA0eDQgbW9kZXMKLSAgdWludDhfdCB1dm1vZGVfOyAgICAgICAgLy8gY2hyb21hIHByZWRpY3Rpb24gbW9kZQotICB1aW50OF90IHNlZ21lbnRfOyAgICAgICAvLyBibG9jaydzIHNlZ21lbnQKLQotICAvLyBiaXQtd2lzZSBpbmZvIGFib3V0IHRoZSBjb250ZW50IG9mIGVhY2ggc3ViLTR4NCBibG9ja3M6IHRoZXJlIGFyZSAxNiBiaXRzCi0gIC8vIGZvciBsdW1hIChiaXRzICMwLT4jMTUpLCB0aGVuIDQgYml0cyBmb3IgY2hyb21hLXUgKCMxNi0+IzE5KSBhbmQgNCBiaXRzIGZvcgotICAvLyBjaHJvbWEtdiAoIzIwLT4jMjMpLCBlYWNoIGNvcnJlc3BvbmRpbmcgdG8gb25lIDR4NCBibG9jayBpbiBkZWNvZGluZyBvcmRlci4KLSAgLy8gSWYgdGhlIGJpdCBpcyBzZXQsIHRoZSA0eDQgYmxvY2sgY29udGFpbnMgc29tZSBub24temVybyBjb2VmZmljaWVudHMuCi0gIHVpbnQzMl90IG5vbl96ZXJvXzsKLSAgdWludDMyX3Qgbm9uX3plcm9fYWNfOwotCi0gIC8vIEZpbHRlcmluZyBzaWRlLWluZm8KLSAgaW50IGZpbHRlcl90eXBlXzsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDA9b2ZmLCAxPXNpbXBsZSwgMj1jb21wbGV4Ci0gIGludCBmaWx0ZXJfcm93XzsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwZXItcm93IGZsYWcKLSAgVlA4RkluZm8gZnN0cmVuZ3Roc19bTlVNX01CX1NFR01FTlRTXVsyXTsgIC8vIHByZWNhbGN1bGF0ZWQgcGVyLXNlZ21lbnQvdHlwZQotCi0gIC8vIGV4dGVuc2lvbnMKLSAgY29uc3QgdWludDhfdCogYWxwaGFfZGF0YV87ICAgLy8gY29tcHJlc3NlZCBhbHBoYSBkYXRhIChpZiBwcmVzZW50KQotICBzaXplX3QgYWxwaGFfZGF0YV9zaXplXzsKLSAgaW50IGlzX2FscGhhX2RlY29kZWRfOyAgLy8gdHJ1ZSBpZiBhbHBoYV9kYXRhXyBpcyBkZWNvZGVkIGluIGFscGhhX3BsYW5lXwotICB1aW50OF90KiBhbHBoYV9wbGFuZV87ICAgICAgICAvLyBvdXRwdXQuIFBlcnNpc3RlbnQsIGNvbnRhaW5zIHRoZSB3aG9sZSBkYXRhLgotCi0gIGludCBsYXllcl9jb2xvcnNwYWNlXzsKLSAgY29uc3QgdWludDhfdCogbGF5ZXJfZGF0YV87ICAgLy8gY29tcHJlc3NlZCBsYXllciBkYXRhIChpZiBwcmVzZW50KQotICBzaXplX3QgbGF5ZXJfZGF0YV9zaXplXzsKLX07Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBpbnRlcm5hbCBmdW5jdGlvbnMuIE5vdCBwdWJsaWMuCi0KLS8vIGluIHZwOC5jCi1pbnQgVlA4U2V0RXJyb3IoVlA4RGVjb2RlciogY29uc3QgZGVjLAotICAgICAgICAgICAgICAgIFZQOFN0YXR1c0NvZGUgZXJyb3IsIGNvbnN0IGNoYXIqIGNvbnN0IG1zZyk7Ci0KLS8vIGluIHRyZWUuYwotdm9pZCBWUDhSZXNldFByb2JhKFZQOFByb2JhKiBjb25zdCBwcm9iYSk7Ci12b2lkIFZQOFBhcnNlUHJvYmEoVlA4Qml0UmVhZGVyKiBjb25zdCBiciwgVlA4RGVjb2RlciogY29uc3QgZGVjKTsKLXZvaWQgVlA4UGFyc2VJbnRyYU1vZGUoVlA4Qml0UmVhZGVyKiBjb25zdCBiciwgIFZQOERlY29kZXIqIGNvbnN0IGRlYyk7Ci0KLS8vIGluIHF1YW50LmMKLXZvaWQgVlA4UGFyc2VRdWFudChWUDhEZWNvZGVyKiBjb25zdCBkZWMpOwotCi0vLyBpbiBmcmFtZS5jCi1pbnQgVlA4SW5pdEZyYW1lKFZQOERlY29kZXIqIGNvbnN0IGRlYywgVlA4SW8qIGlvKTsKLS8vIFByZWRpY3QgYSBibG9jayBhbmQgYWRkIHJlc2lkdWFsCi12b2lkIFZQOFJlY29uc3RydWN0QmxvY2soVlA4RGVjb2RlciogY29uc3QgZGVjKTsKLS8vIENhbGwgaW8tPnNldHVwKCkgYW5kIGZpbmlzaCBzZXR0aW5nIHVwIHNjYW4gcGFyYW1ldGVycy4KLS8vIEFmdGVyIHRoaXMgY2FsbCByZXR1cm5zLCBvbmUgbXVzdCBhbHdheXMgY2FsbCBWUDhFeGl0Q3JpdGljYWwoKSB3aXRoIHRoZQotLy8gc2FtZSBwYXJhbWV0ZXJzLiBCb3RoIGZ1bmN0aW9ucyBzaG91bGQgYmUgdXNlZCBpbiBwYWlyLiBSZXR1cm5zIFZQOF9TVEFUVVNfT0sKLS8vIGlmIG9rLCBvdGhlcndpc2Ugc2V0cyBhbmQgcmV0dXJucyB0aGUgZXJyb3Igc3RhdHVzIG9uICpkZWMuCi1WUDhTdGF0dXNDb2RlIFZQOEVudGVyQ3JpdGljYWwoVlA4RGVjb2RlciogY29uc3QgZGVjLCBWUDhJbyogY29uc3QgaW8pOwotLy8gTXVzdCBhbHdheXMgYmUgY2FsbGVkIGluIHBhaXIgd2l0aCBWUDhFbnRlckNyaXRpY2FsKCkuCi0vLyBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgZXJyb3IuCi1pbnQgVlA4RXhpdENyaXRpY2FsKFZQOERlY29kZXIqIGNvbnN0IGRlYywgVlA4SW8qIGNvbnN0IGlvKTsKLS8vIFByb2Nlc3MgdGhlIGxhc3QgZGVjb2RlZCByb3cgKGZpbHRlcmluZyArIG91dHB1dCkKLWludCBWUDhQcm9jZXNzUm93KFZQOERlY29kZXIqIGNvbnN0IGRlYywgVlA4SW8qIGNvbnN0IGlvKTsKLS8vIFRvIGJlIGNhbGxlZCBhdCB0aGUgc3RhcnQgb2YgYSBuZXcgc2NhbmxpbmUsIHRvIGluaXRpYWxpemUgcHJlZGljdG9ycy4KLXZvaWQgVlA4SW5pdFNjYW5saW5lKFZQOERlY29kZXIqIGNvbnN0IGRlYyk7Ci0vLyBEZWNvZGUgb25lIG1hY3JvYmxvY2suIFJldHVybnMgZmFsc2UgaWYgdGhlcmUgaXMgbm90IGVub3VnaCBkYXRhLgotaW50IFZQOERlY29kZU1CKFZQOERlY29kZXIqIGNvbnN0IGRlYywgVlA4Qml0UmVhZGVyKiBjb25zdCB0b2tlbl9icik7Ci0KLS8vIGluIGFscGhhLmMKLWNvbnN0IHVpbnQ4X3QqIFZQOERlY29tcHJlc3NBbHBoYVJvd3MoVlA4RGVjb2RlciogY29uc3QgZGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93LCBpbnQgbnVtX3Jvd3MpOwotCi0vLyBpbiBsYXllci5jCi1pbnQgVlA4RGVjb2RlTGF5ZXIoVlA4RGVjb2RlciogY29uc3QgZGVjKTsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCi0KLSNlbmRpZiAgLyogV0VCUF9ERUNfVlA4SV9IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL3ZwOGwuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RlYy92cDhsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZWE5ZTIuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL3ZwOGwuYworKysgL2Rldi9udWxsCkBAIC0xLDEyNTUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIG1haW4gZW50cnkgZm9yIHRoZSBkZWNvZGVyCi0vLwotLy8gQXV0aG9yczogVmlrYXMgQXJvcmEgKHZpa2Fhcy5hcm9yYUBnbWFpbC5jb20pCi0vLyAgICAgICAgICBKeXJraSBBbGFrdWlqYWxhIChqeXJraUBnb29nbGUuY29tKQotCi0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNlbHNlCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiLi92cDhsaS5oIgotI2luY2x1ZGUgIi4uL2RzcC9sb3NzbGVzcy5oIgotI2luY2x1ZGUgIi4uL2RzcC95dXYuaCIKLSNpbmNsdWRlICIuLi91dGlscy9odWZmbWFuLmgiCi0jaW5jbHVkZSAiLi4vdXRpbHMvdXRpbHMuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNkZWZpbmUgTlVNX0FSR0JfQ0FDSEVfUk9XUyAgICAgICAgICAxNgotCi1zdGF0aWMgY29uc3QgaW50IGtDb2RlTGVuZ3RoTGl0ZXJhbHMgPSAxNjsKLXN0YXRpYyBjb25zdCBpbnQga0NvZGVMZW5ndGhSZXBlYXRDb2RlID0gMTY7Ci1zdGF0aWMgY29uc3QgaW50IGtDb2RlTGVuZ3RoRXh0cmFCaXRzWzNdID0geyAyLCAzLCA3IH07Ci1zdGF0aWMgY29uc3QgaW50IGtDb2RlTGVuZ3RoUmVwZWF0T2Zmc2V0c1szXSA9IHsgMywgMywgMTEgfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vICBGaXZlIEh1ZmZtYW4gY29kZXMgYXJlIHVzZWQgYXQgZWFjaCBtZXRhIGNvZGU6Ci0vLyAgMS4gZ3JlZW4gKyBsZW5ndGggcHJlZml4IGNvZGVzICsgY29sb3IgY2FjaGUgY29kZXMsCi0vLyAgMi4gYWxwaGEsCi0vLyAgMy4gcmVkLAotLy8gIDQuIGJsdWUsIGFuZCwKLS8vICA1LiBkaXN0YW5jZSBwcmVmaXggY29kZXMuCi10eXBlZGVmIGVudW0gewotICBHUkVFTiA9IDAsCi0gIFJFRCAgID0gMSwKLSAgQkxVRSAgPSAyLAotICBBTFBIQSA9IDMsCi0gIERJU1QgID0gNAotfSBIdWZmSW5kZXg7Ci0KLXN0YXRpYyBjb25zdCB1aW50MTZfdCBrQWxwaGFiZXRTaXplW0hVRkZNQU5fQ09ERVNfUEVSX01FVEFfQ09ERV0gPSB7Ci0gIE5VTV9MSVRFUkFMX0NPREVTICsgTlVNX0xFTkdUSF9DT0RFUywKLSAgTlVNX0xJVEVSQUxfQ09ERVMsIE5VTV9MSVRFUkFMX0NPREVTLCBOVU1fTElURVJBTF9DT0RFUywKLSAgTlVNX0RJU1RBTkNFX0NPREVTCi19OwotCi0KLSNkZWZpbmUgTlVNX0NPREVfTEVOR1RIX0NPREVTICAgICAgIDE5Ci1zdGF0aWMgY29uc3QgdWludDhfdCBrQ29kZUxlbmd0aENvZGVPcmRlcltOVU1fQ09ERV9MRU5HVEhfQ09ERVNdID0gewotICAxNywgMTgsIDAsIDEsIDIsIDMsIDQsIDUsIDE2LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1Ci19OwotCi0jZGVmaW5lIENPREVfVE9fUExBTkVfQ09ERVMgICAgICAgIDEyMAotc3RhdGljIGNvbnN0IHVpbnQ4X3QgY29kZV90b19wbGFuZV9sdXRbQ09ERV9UT19QTEFORV9DT0RFU10gPSB7Ci0gIDB4MTgsIDB4MDcsIDB4MTcsIDB4MTksIDB4MjgsIDB4MDYsIDB4MjcsIDB4MjksIDB4MTYsIDB4MWEsCi0gIDB4MjYsIDB4MmEsIDB4MzgsIDB4MDUsIDB4MzcsIDB4MzksIDB4MTUsIDB4MWIsIDB4MzYsIDB4M2EsCi0gIDB4MjUsIDB4MmIsIDB4NDgsIDB4MDQsIDB4NDcsIDB4NDksIDB4MTQsIDB4MWMsIDB4MzUsIDB4M2IsCi0gIDB4NDYsIDB4NGEsIDB4MjQsIDB4MmMsIDB4NTgsIDB4NDUsIDB4NGIsIDB4MzQsIDB4M2MsIDB4MDMsCi0gIDB4NTcsIDB4NTksIDB4MTMsIDB4MWQsIDB4NTYsIDB4NWEsIDB4MjMsIDB4MmQsIDB4NDQsIDB4NGMsCi0gIDB4NTUsIDB4NWIsIDB4MzMsIDB4M2QsIDB4NjgsIDB4MDIsIDB4NjcsIDB4NjksIDB4MTIsIDB4MWUsCi0gIDB4NjYsIDB4NmEsIDB4MjIsIDB4MmUsIDB4NTQsIDB4NWMsIDB4NDMsIDB4NGQsIDB4NjUsIDB4NmIsCi0gIDB4MzIsIDB4M2UsIDB4NzgsIDB4MDEsIDB4NzcsIDB4NzksIDB4NTMsIDB4NWQsIDB4MTEsIDB4MWYsCi0gIDB4NjQsIDB4NmMsIDB4NDIsIDB4NGUsIDB4NzYsIDB4N2EsIDB4MjEsIDB4MmYsIDB4NzUsIDB4N2IsCi0gIDB4MzEsIDB4M2YsIDB4NjMsIDB4NmQsIDB4NTIsIDB4NWUsIDB4MDAsIDB4NzQsIDB4N2MsIDB4NDEsCi0gIDB4NGYsIDB4MTAsIDB4MjAsIDB4NjIsIDB4NmUsIDB4MzAsIDB4NzMsIDB4N2QsIDB4NTEsIDB4NWYsCi0gIDB4NDAsIDB4NzIsIDB4N2UsIDB4NjEsIDB4NmYsIDB4NTAsIDB4NzEsIDB4N2YsIDB4NjAsIDB4NzAKLX07Ci0KLXN0YXRpYyBpbnQgRGVjb2RlSW1hZ2VTdHJlYW0oaW50IHhzaXplLCBpbnQgeXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpc19sZXZlbDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExEZWNvZGVyKiBjb25zdCBkZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiogY29uc3QgZGVjb2RlZF9kYXRhKTsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotaW50IFZQOExDaGVja1NpZ25hdHVyZShjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBzaXplX3Qgc2l6ZSkgewotICByZXR1cm4gKHNpemUgPj0gMSkgJiYgKGRhdGFbMF0gPT0gVlA4TF9NQUdJQ19CWVRFKTsKLX0KLQotc3RhdGljIGludCBSZWFkSW1hZ2VJbmZvKFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3Qgd2lkdGgsIGludCogY29uc3QgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgaGFzX2FscGhhKSB7Ci0gIGNvbnN0IHVpbnQ4X3Qgc2lnbmF0dXJlID0gVlA4TFJlYWRCaXRzKGJyLCA4KTsKLSAgaWYgKCFWUDhMQ2hlY2tTaWduYXR1cmUoJnNpZ25hdHVyZSwgMSkpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICAqd2lkdGggPSBWUDhMUmVhZEJpdHMoYnIsIFZQOExfSU1BR0VfU0laRV9CSVRTKSArIDE7Ci0gICpoZWlnaHQgPSBWUDhMUmVhZEJpdHMoYnIsIFZQOExfSU1BR0VfU0laRV9CSVRTKSArIDE7Ci0gICpoYXNfYWxwaGEgPSBWUDhMUmVhZEJpdHMoYnIsIDEpOwotICBWUDhMUmVhZEJpdHMoYnIsIFZQOExfVkVSU0lPTl9CSVRTKTsgIC8vIFJlYWQvaWdub3JlIHRoZSB2ZXJzaW9uIG51bWJlci4KLSAgcmV0dXJuIDE7Ci19Ci0KLWludCBWUDhMR2V0SW5mbyhjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAotICAgICAgICAgICAgICAgIGludCogY29uc3Qgd2lkdGgsIGludCogY29uc3QgaGVpZ2h0LCBpbnQqIGNvbnN0IGhhc19hbHBoYSkgewotICBpZiAoZGF0YSA9PSBOVUxMIHx8IGRhdGFfc2l6ZSA8IFZQOExfRlJBTUVfSEVBREVSX1NJWkUpIHsKLSAgICByZXR1cm4gMDsgICAgICAgICAvLyBub3QgZW5vdWdoIGRhdGEKLSAgfSBlbHNlIHsKLSAgICBpbnQgdywgaCwgYTsKLSAgICBWUDhMQml0UmVhZGVyIGJyOwotICAgIFZQOExJbml0Qml0UmVhZGVyKCZiciwgZGF0YSwgZGF0YV9zaXplKTsKLSAgICBpZiAoIVJlYWRJbWFnZUluZm8oJmJyLCAmdywgJmgsICZhKSkgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmICh3aWR0aCAhPSBOVUxMKSAqd2lkdGggPSB3OwotICAgIGlmIChoZWlnaHQgIT0gTlVMTCkgKmhlaWdodCA9IGg7Ci0gICAgaWYgKGhhc19hbHBoYSAhPSBOVUxMKSAqaGFzX2FscGhhID0gYTsKLSAgICByZXR1cm4gMTsKLSAgfQotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IEdldENvcHlEaXN0YW5jZShpbnQgZGlzdGFuY2Vfc3ltYm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEJpdFJlYWRlciogY29uc3QgYnIpIHsKLSAgaW50IGV4dHJhX2JpdHMsIG9mZnNldDsKLSAgaWYgKGRpc3RhbmNlX3N5bWJvbCA8IDQpIHsKLSAgICByZXR1cm4gZGlzdGFuY2Vfc3ltYm9sICsgMTsKLSAgfQotICBleHRyYV9iaXRzID0gKGRpc3RhbmNlX3N5bWJvbCAtIDIpID4+IDE7Ci0gIG9mZnNldCA9ICgyICsgKGRpc3RhbmNlX3N5bWJvbCAmIDEpKSA8PCBleHRyYV9iaXRzOwotICByZXR1cm4gb2Zmc2V0ICsgVlA4TFJlYWRCaXRzKGJyLCBleHRyYV9iaXRzKSArIDE7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgR2V0Q29weUxlbmd0aChpbnQgbGVuZ3RoX3N5bWJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQml0UmVhZGVyKiBjb25zdCBicikgewotICAvLyBMZW5ndGggYW5kIGRpc3RhbmNlIHByZWZpeGVzIGFyZSBlbmNvZGVkIHRoZSBzYW1lIHdheS4KLSAgcmV0dXJuIEdldENvcHlEaXN0YW5jZShsZW5ndGhfc3ltYm9sLCBicik7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgUGxhbmVDb2RlVG9EaXN0YW5jZShpbnQgeHNpemUsIGludCBwbGFuZV9jb2RlKSB7Ci0gIGlmIChwbGFuZV9jb2RlID4gQ09ERV9UT19QTEFORV9DT0RFUykgewotICAgIHJldHVybiBwbGFuZV9jb2RlIC0gQ09ERV9UT19QTEFORV9DT0RFUzsKLSAgfSBlbHNlIHsKLSAgICBjb25zdCBpbnQgZGlzdF9jb2RlID0gY29kZV90b19wbGFuZV9sdXRbcGxhbmVfY29kZSAtIDFdOwotICAgIGNvbnN0IGludCB5b2Zmc2V0ID0gZGlzdF9jb2RlID4+IDQ7Ci0gICAgY29uc3QgaW50IHhvZmZzZXQgPSA4IC0gKGRpc3RfY29kZSAmIDB4Zik7Ci0gICAgY29uc3QgaW50IGRpc3QgPSB5b2Zmc2V0ICogeHNpemUgKyB4b2Zmc2V0OwotICAgIHJldHVybiAoZGlzdCA+PSAxKSA/IGRpc3QgOiAxOwotICB9Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBEZWNvZGVzIHRoZSBuZXh0IEh1ZmZtYW4gY29kZSBmcm9tIGJpdC1zdHJlYW0uCi0vLyBGaWxsQml0V2luZG93KGJyKSBuZWVkcyB0byBiZSBjYWxsZWQgYXQgbWluaW11bSBldmVyeSBzZWNvbmQgY2FsbAotLy8gdG8gUmVhZFN5bWJvbCwgaW4gb3JkZXIgdG8gcHJlLWZldGNoIGVub3VnaCBiaXRzLgotc3RhdGljIFdFQlBfSU5MSU5FIGludCBSZWFkU3ltYm9sKGNvbnN0IEh1ZmZtYW5UcmVlKiB0cmVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyKSB7Ci0gIGNvbnN0IEh1ZmZtYW5UcmVlTm9kZSogbm9kZSA9IHRyZWUtPnJvb3RfOwotICBpbnQgbnVtX2JpdHMgPSAwOwotICB1aW50MzJfdCBiaXRzID0gVlA4TFByZWZldGNoQml0cyhicik7Ci0gIFNCX0RDSEVDSyhub2RlICE9IE5VTEwpOwotICB3aGlsZSAoIUh1ZmZtYW5UcmVlTm9kZUlzTGVhZihub2RlKSkgewotICAgIG5vZGUgPSBIdWZmbWFuVHJlZU5leHROb2RlKG5vZGUsIGJpdHMgJiAxKTsKLSAgICBiaXRzID4+PSAxOwotICAgICsrbnVtX2JpdHM7Ci0gIH0KLSAgVlA4TERpc2NhcmRCaXRzKGJyLCBudW1fYml0cyk7Ci0gIHJldHVybiBub2RlLT5zeW1ib2xfOwotfQotCi1zdGF0aWMgaW50IFJlYWRIdWZmbWFuQ29kZUxlbmd0aHMoCi0gICAgVlA4TERlY29kZXIqIGNvbnN0IGRlYywgY29uc3QgaW50KiBjb25zdCBjb2RlX2xlbmd0aF9jb2RlX2xlbmd0aHMsCi0gICAgaW50IG51bV9zeW1ib2xzLCBpbnQqIGNvbnN0IGNvZGVfbGVuZ3RocykgewotICBpbnQgb2sgPSAwOwotICBWUDhMQml0UmVhZGVyKiBjb25zdCBiciA9ICZkZWMtPmJyXzsKLSAgaW50IHN5bWJvbDsKLSAgaW50IG1heF9zeW1ib2w7Ci0gIGludCBwcmV2X2NvZGVfbGVuID0gREVGQVVMVF9DT0RFX0xFTkdUSDsKLSAgSHVmZm1hblRyZWUgdHJlZTsKLQotICBpZiAoIUh1ZmZtYW5UcmVlQnVpbGRJbXBsaWNpdCgmdHJlZSwgY29kZV9sZW5ndGhfY29kZV9sZW5ndGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVU1fQ09ERV9MRU5HVEhfQ09ERVMpKSB7Ci0gICAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBpZiAoVlA4TFJlYWRCaXRzKGJyLCAxKSkgeyAgICAvLyB1c2UgbGVuZ3RoCi0gICAgY29uc3QgaW50IGxlbmd0aF9uYml0cyA9IDIgKyAyICogVlA4TFJlYWRCaXRzKGJyLCAzKTsKLSAgICBtYXhfc3ltYm9sID0gMiArIFZQOExSZWFkQml0cyhiciwgbGVuZ3RoX25iaXRzKTsKLSAgICBpZiAobWF4X3N5bWJvbCA+IG51bV9zeW1ib2xzKSB7Ci0gICAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUjsKLSAgICAgIGdvdG8gRW5kOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBtYXhfc3ltYm9sID0gbnVtX3N5bWJvbHM7Ci0gIH0KLQotICBzeW1ib2wgPSAwOwotICB3aGlsZSAoc3ltYm9sIDwgbnVtX3N5bWJvbHMpIHsKLSAgICBpbnQgY29kZV9sZW47Ci0gICAgaWYgKG1heF9zeW1ib2wtLSA9PSAwKSBicmVhazsKLSAgICBWUDhMRmlsbEJpdFdpbmRvdyhicik7Ci0gICAgY29kZV9sZW4gPSBSZWFkU3ltYm9sKCZ0cmVlLCBicik7Ci0gICAgaWYgKGNvZGVfbGVuIDwga0NvZGVMZW5ndGhMaXRlcmFscykgewotICAgICAgY29kZV9sZW5ndGhzW3N5bWJvbCsrXSA9IGNvZGVfbGVuOwotICAgICAgaWYgKGNvZGVfbGVuICE9IDApIHByZXZfY29kZV9sZW4gPSBjb2RlX2xlbjsKLSAgICB9IGVsc2UgewotICAgICAgY29uc3QgaW50IHVzZV9wcmV2ID0gKGNvZGVfbGVuID09IGtDb2RlTGVuZ3RoUmVwZWF0Q29kZSk7Ci0gICAgICBjb25zdCBpbnQgc2xvdCA9IGNvZGVfbGVuIC0ga0NvZGVMZW5ndGhMaXRlcmFsczsKLSAgICAgIGNvbnN0IGludCBleHRyYV9iaXRzID0ga0NvZGVMZW5ndGhFeHRyYUJpdHNbc2xvdF07Ci0gICAgICBjb25zdCBpbnQgcmVwZWF0X29mZnNldCA9IGtDb2RlTGVuZ3RoUmVwZWF0T2Zmc2V0c1tzbG90XTsKLSAgICAgIGludCByZXBlYXQgPSBWUDhMUmVhZEJpdHMoYnIsIGV4dHJhX2JpdHMpICsgcmVwZWF0X29mZnNldDsKLSAgICAgIGlmIChzeW1ib2wgKyByZXBlYXQgPiBudW1fc3ltYm9scykgewotICAgICAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUjsKLSAgICAgICAgZ290byBFbmQ7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjb25zdCBpbnQgbGVuZ3RoID0gdXNlX3ByZXYgPyBwcmV2X2NvZGVfbGVuIDogMDsKLSAgICAgICAgd2hpbGUgKHJlcGVhdC0tID4gMCkgY29kZV9sZW5ndGhzW3N5bWJvbCsrXSA9IGxlbmd0aDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgb2sgPSAxOwotCi0gRW5kOgotICBIdWZmbWFuVHJlZVJlbGVhc2UoJnRyZWUpOwotICByZXR1cm4gb2s7Ci19Ci0KLXN0YXRpYyBpbnQgUmVhZEh1ZmZtYW5Db2RlKGludCBhbHBoYWJldF9zaXplLCBWUDhMRGVjb2RlciogY29uc3QgZGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRyZWUqIGNvbnN0IHRyZWUpIHsKLSAgaW50IG9rID0gMDsKLSAgVlA4TEJpdFJlYWRlciogY29uc3QgYnIgPSAmZGVjLT5icl87Ci0gIGNvbnN0IGludCBzaW1wbGVfY29kZSA9IFZQOExSZWFkQml0cyhiciwgMSk7Ci0KLSAgaWYgKHNpbXBsZV9jb2RlKSB7ICAvLyBSZWFkIHN5bWJvbHMsIGNvZGVzICYgY29kZSBsZW5ndGhzIGRpcmVjdGx5LgotICAgIGludCBzeW1ib2xzWzJdOwotICAgIGludCBjb2Rlc1syXTsKLSAgICBpbnQgY29kZV9sZW5ndGhzWzJdOwotICAgIGNvbnN0IGludCBudW1fc3ltYm9scyA9IFZQOExSZWFkQml0cyhiciwgMSkgKyAxOwotICAgIGNvbnN0IGludCBmaXJzdF9zeW1ib2xfbGVuX2NvZGUgPSBWUDhMUmVhZEJpdHMoYnIsIDEpOwotICAgIC8vIFRoZSBmaXJzdCBjb2RlIGlzIGVpdGhlciAxIGJpdCBvciA4IGJpdCBjb2RlLgotICAgIHN5bWJvbHNbMF0gPSBWUDhMUmVhZEJpdHMoYnIsIChmaXJzdF9zeW1ib2xfbGVuX2NvZGUgPT0gMCkgPyAxIDogOCk7Ci0gICAgY29kZXNbMF0gPSAwOwotICAgIGNvZGVfbGVuZ3Roc1swXSA9IG51bV9zeW1ib2xzIC0gMTsKLSAgICAvLyBUaGUgc2Vjb25kIGNvZGUgKGlmIHByZXNlbnQpLCBpcyBhbHdheXMgOCBiaXQgbG9uZy4KLSAgICBpZiAobnVtX3N5bWJvbHMgPT0gMikgewotICAgICAgc3ltYm9sc1sxXSA9IFZQOExSZWFkQml0cyhiciwgOCk7Ci0gICAgICBjb2Rlc1sxXSA9IDE7Ci0gICAgICBjb2RlX2xlbmd0aHNbMV0gPSBudW1fc3ltYm9scyAtIDE7Ci0gICAgfQotICAgIG9rID0gSHVmZm1hblRyZWVCdWlsZEV4cGxpY2l0KHRyZWUsIGNvZGVfbGVuZ3RocywgY29kZXMsIHN5bWJvbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFiZXRfc2l6ZSwgbnVtX3N5bWJvbHMpOwotICB9IGVsc2UgeyAgLy8gRGVjb2RlIEh1ZmZtYW4tY29kZWQgY29kZSBsZW5ndGhzLgotICAgIGludCogY29kZV9sZW5ndGhzID0gTlVMTDsKLSAgICBpbnQgaTsKLSAgICBpbnQgY29kZV9sZW5ndGhfY29kZV9sZW5ndGhzW05VTV9DT0RFX0xFTkdUSF9DT0RFU10gPSB7IDAgfTsKLSAgICBjb25zdCBpbnQgbnVtX2NvZGVzID0gVlA4TFJlYWRCaXRzKGJyLCA0KSArIDQ7Ci0gICAgaWYgKG51bV9jb2RlcyA+IE5VTV9DT0RFX0xFTkdUSF9DT0RFUykgewotICAgICAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBjb2RlX2xlbmd0aHMgPQotICAgICAgICAoaW50KilXZWJQU2FmZUNhbGxvYygodWludDY0X3QpYWxwaGFiZXRfc2l6ZSwgc2l6ZW9mKCpjb2RlX2xlbmd0aHMpKTsKLSAgICBpZiAoY29kZV9sZW5ndGhzID09IE5VTEwpIHsKLSAgICAgIGRlYy0+c3RhdHVzXyA9IFZQOF9TVEFUVVNfT1VUX09GX01FTU9SWTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCBudW1fY29kZXM7ICsraSkgewotICAgICAgY29kZV9sZW5ndGhfY29kZV9sZW5ndGhzW2tDb2RlTGVuZ3RoQ29kZU9yZGVyW2ldXSA9IFZQOExSZWFkQml0cyhiciwgMyk7Ci0gICAgfQotICAgIG9rID0gUmVhZEh1ZmZtYW5Db2RlTGVuZ3RocyhkZWMsIGNvZGVfbGVuZ3RoX2NvZGVfbGVuZ3RocywgYWxwaGFiZXRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZV9sZW5ndGhzKTsKLSAgICBpZiAob2spIHsKLSAgICAgIG9rID0gSHVmZm1hblRyZWVCdWlsZEltcGxpY2l0KHRyZWUsIGNvZGVfbGVuZ3RocywgYWxwaGFiZXRfc2l6ZSk7Ci0gICAgfQotICAgIFNiTWVtb3J5RGVhbGxvY2F0ZShjb2RlX2xlbmd0aHMpOwotICB9Ci0gIG9rID0gb2sgJiYgIWJyLT5lcnJvcl87Ci0gIGlmICghb2spIHsKLSAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUjsKLSAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQgRGVsZXRlSHRyZWVHcm91cHMoSFRyZWVHcm91cCogaHRyZWVfZ3JvdXBzLCBpbnQgbnVtX2h0cmVlX2dyb3VwcykgewotICBpZiAoaHRyZWVfZ3JvdXBzICE9IE5VTEwpIHsKLSAgICBpbnQgaSwgajsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2h0cmVlX2dyb3VwczsgKytpKSB7Ci0gICAgICBIdWZmbWFuVHJlZSogY29uc3QgaHRyZWVzID0gaHRyZWVfZ3JvdXBzW2ldLmh0cmVlc187Ci0gICAgICBmb3IgKGogPSAwOyBqIDwgSFVGRk1BTl9DT0RFU19QRVJfTUVUQV9DT0RFOyArK2opIHsKLSAgICAgICAgSHVmZm1hblRyZWVSZWxlYXNlKCZodHJlZXNbal0pOwotICAgICAgfQotICAgIH0KLSAgICBTYk1lbW9yeURlYWxsb2NhdGUoaHRyZWVfZ3JvdXBzKTsKLSAgfQotfQotCi1zdGF0aWMgaW50IFJlYWRIdWZmbWFuQ29kZXMoVlA4TERlY29kZXIqIGNvbnN0IGRlYywgaW50IHhzaXplLCBpbnQgeXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbG9yX2NhY2hlX2JpdHMsIGludCBhbGxvd19yZWN1cnNpb24pIHsKLSAgaW50IGksIGo7Ci0gIFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyID0gJmRlYy0+YnJfOwotICBWUDhMTWV0YWRhdGEqIGNvbnN0IGhkciA9ICZkZWMtPmhkcl87Ci0gIHVpbnQzMl90KiBodWZmbWFuX2ltYWdlID0gTlVMTDsKLSAgSFRyZWVHcm91cCogaHRyZWVfZ3JvdXBzID0gTlVMTDsKLSAgaW50IG51bV9odHJlZV9ncm91cHMgPSAxOwotCi0gIGlmIChhbGxvd19yZWN1cnNpb24gJiYgVlA4TFJlYWRCaXRzKGJyLCAxKSkgewotICAgIC8vIHVzZSBtZXRhIEh1ZmZtYW4gY29kZXMuCi0gICAgY29uc3QgaW50IGh1ZmZtYW5fcHJlY2lzaW9uID0gVlA4TFJlYWRCaXRzKGJyLCAzKSArIDI7Ci0gICAgY29uc3QgaW50IGh1ZmZtYW5feHNpemUgPSBWUDhMU3ViU2FtcGxlU2l6ZSh4c2l6ZSwgaHVmZm1hbl9wcmVjaXNpb24pOwotICAgIGNvbnN0IGludCBodWZmbWFuX3lzaXplID0gVlA4TFN1YlNhbXBsZVNpemUoeXNpemUsIGh1ZmZtYW5fcHJlY2lzaW9uKTsKLSAgICBjb25zdCBpbnQgaHVmZm1hbl9waXhzID0gaHVmZm1hbl94c2l6ZSAqIGh1ZmZtYW5feXNpemU7Ci0gICAgaWYgKCFEZWNvZGVJbWFnZVN0cmVhbShodWZmbWFuX3hzaXplLCBodWZmbWFuX3lzaXplLCAwLCBkZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmaHVmZm1hbl9pbWFnZSkpIHsKLSAgICAgIGRlYy0+c3RhdHVzXyA9IFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SOwotICAgICAgZ290byBFcnJvcjsKLSAgICB9Ci0gICAgaGRyLT5odWZmbWFuX3N1YnNhbXBsZV9iaXRzXyA9IGh1ZmZtYW5fcHJlY2lzaW9uOwotICAgIGZvciAoaSA9IDA7IGkgPCBodWZmbWFuX3BpeHM7ICsraSkgewotICAgICAgLy8gVGhlIGh1ZmZtYW4gZGF0YSBpcyBzdG9yZWQgaW4gcmVkIGFuZCBncmVlbiBieXRlcy4KLSAgICAgIGNvbnN0IGludCBncm91cCA9IChodWZmbWFuX2ltYWdlW2ldID4+IDgpICYgMHhmZmZmOwotICAgICAgaHVmZm1hbl9pbWFnZVtpXSA9IGdyb3VwOwotICAgICAgaWYgKGdyb3VwID49IG51bV9odHJlZV9ncm91cHMpIHsKLSAgICAgICAgbnVtX2h0cmVlX2dyb3VwcyA9IGdyb3VwICsgMTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpZiAoYnItPmVycm9yXykgZ290byBFcnJvcjsKLQotICBTQl9EQ0hFQ0sobnVtX2h0cmVlX2dyb3VwcyA8PSAweDEwMDAwKTsKLSAgaHRyZWVfZ3JvdXBzID0KLSAgICAgIChIVHJlZUdyb3VwKilXZWJQU2FmZUNhbGxvYygodWludDY0X3QpbnVtX2h0cmVlX2dyb3VwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKmh0cmVlX2dyb3VwcykpOwotICBpZiAoaHRyZWVfZ3JvdXBzID09IE5VTEwpIHsKLSAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX09VVF9PRl9NRU1PUlk7Ci0gICAgZ290byBFcnJvcjsKLSAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCBudW1faHRyZWVfZ3JvdXBzOyArK2kpIHsKLSAgICBIdWZmbWFuVHJlZSogY29uc3QgaHRyZWVzID0gaHRyZWVfZ3JvdXBzW2ldLmh0cmVlc187Ci0gICAgZm9yIChqID0gMDsgaiA8IEhVRkZNQU5fQ09ERVNfUEVSX01FVEFfQ09ERTsgKytqKSB7Ci0gICAgICBpbnQgYWxwaGFiZXRfc2l6ZSA9IGtBbHBoYWJldFNpemVbal07Ci0gICAgICBpZiAoaiA9PSAwICYmIGNvbG9yX2NhY2hlX2JpdHMgPiAwKSB7Ci0gICAgICAgIGFscGhhYmV0X3NpemUgKz0gMSA8PCBjb2xvcl9jYWNoZV9iaXRzOwotICAgICAgfQotICAgICAgaWYgKCFSZWFkSHVmZm1hbkNvZGUoYWxwaGFiZXRfc2l6ZSwgZGVjLCBodHJlZXMgKyBqKSkgZ290byBFcnJvcjsKLSAgICB9Ci0gIH0KLQotICAvLyBBbGwgT0suIEZpbmFsaXplIHBvaW50ZXJzIGFuZCByZXR1cm4uCi0gIGhkci0+aHVmZm1hbl9pbWFnZV8gPSBodWZmbWFuX2ltYWdlOwotICBoZHItPm51bV9odHJlZV9ncm91cHNfID0gbnVtX2h0cmVlX2dyb3VwczsKLSAgaGRyLT5odHJlZV9ncm91cHNfID0gaHRyZWVfZ3JvdXBzOwotICByZXR1cm4gMTsKLQotIEVycm9yOgotICBTYk1lbW9yeURlYWxsb2NhdGUoaHVmZm1hbl9pbWFnZSk7Ci0gIERlbGV0ZUh0cmVlR3JvdXBzKGh0cmVlX2dyb3VwcywgbnVtX2h0cmVlX2dyb3Vwcyk7Ci0gIHJldHVybiAwOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gU2NhbGluZy4KLQotc3RhdGljIGludCBBbGxvY2F0ZUFuZEluaXRSZXNjYWxlcihWUDhMRGVjb2RlciogY29uc3QgZGVjLCBWUDhJbyogY29uc3QgaW8pIHsKLSAgY29uc3QgaW50IG51bV9jaGFubmVscyA9IDQ7Ci0gIGNvbnN0IGludCBpbl93aWR0aCA9IGlvLT5tYl93OwotICBjb25zdCBpbnQgb3V0X3dpZHRoID0gaW8tPnNjYWxlZF93aWR0aDsKLSAgY29uc3QgaW50IGluX2hlaWdodCA9IGlvLT5tYl9oOwotICBjb25zdCBpbnQgb3V0X2hlaWdodCA9IGlvLT5zY2FsZWRfaGVpZ2h0OwotICBjb25zdCB1aW50NjRfdCB3b3JrX3NpemUgPSAyICogbnVtX2NoYW5uZWxzICogKHVpbnQ2NF90KW91dF93aWR0aDsKLSAgaW50MzJfdCogd29yazsgICAgICAgIC8vIFJlc2NhbGVyIHdvcmsgYXJlYS4KLSAgY29uc3QgdWludDY0X3Qgc2NhbGVkX2RhdGFfc2l6ZSA9IG51bV9jaGFubmVscyAqICh1aW50NjRfdClvdXRfd2lkdGg7Ci0gIHVpbnQzMl90KiBzY2FsZWRfZGF0YTsgIC8vIFRlbXBvcmFyeSBzdG9yYWdlIGZvciBzY2FsZWQgQkdSQSBkYXRhLgotICBjb25zdCB1aW50NjRfdCBtZW1vcnlfc2l6ZSA9IHNpemVvZigqZGVjLT5yZXNjYWxlcikgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtfc2l6ZSAqIHNpemVvZigqd29yaykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlZF9kYXRhX3NpemUgKiBzaXplb2YoKnNjYWxlZF9kYXRhKTsKLSAgdWludDhfdCogbWVtb3J5ID0gKHVpbnQ4X3QqKVdlYlBTYWZlQ2FsbG9jKG1lbW9yeV9zaXplLCBzaXplb2YoKm1lbW9yeSkpOwotICBpZiAobWVtb3J5ID09IE5VTEwpIHsKLSAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX09VVF9PRl9NRU1PUlk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgU0JfRENIRUNLKGRlYy0+cmVzY2FsZXJfbWVtb3J5ID09IE5VTEwpOwotICBkZWMtPnJlc2NhbGVyX21lbW9yeSA9IG1lbW9yeTsKLQotICBkZWMtPnJlc2NhbGVyID0gKFdlYlBSZXNjYWxlciopbWVtb3J5OwotICBtZW1vcnkgKz0gc2l6ZW9mKCpkZWMtPnJlc2NhbGVyKTsKLSAgd29yayA9IChpbnQzMl90KiltZW1vcnk7Ci0gIG1lbW9yeSArPSB3b3JrX3NpemUgKiBzaXplb2YoKndvcmspOwotICBzY2FsZWRfZGF0YSA9ICh1aW50MzJfdCopbWVtb3J5OwotCi0gIFdlYlBSZXNjYWxlckluaXQoZGVjLT5yZXNjYWxlciwgaW5fd2lkdGgsIGluX2hlaWdodCwgKHVpbnQ4X3QqKXNjYWxlZF9kYXRhLAotICAgICAgICAgICAgICAgICAgIG91dF93aWR0aCwgb3V0X2hlaWdodCwgMCwgbnVtX2NoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgIGluX3dpZHRoLCBvdXRfd2lkdGgsIGluX2hlaWdodCwgb3V0X2hlaWdodCwgd29yayk7Ci0gIHJldHVybiAxOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRXhwb3J0IHRvIEFSR0IKLQotLy8gV2UgaGF2ZSBzcGVjaWFsICJleHBvcnQiIGZ1bmN0aW9uIHNpbmNlIHdlIG5lZWQgdG8gY29udmVydCBmcm9tIEJHUkEKLXN0YXRpYyBpbnQgRXhwb3J0KFdlYlBSZXNjYWxlciogY29uc3QgcmVzY2FsZXIsIFdFQlBfQ1NQX01PREUgY29sb3JzcGFjZSwKLSAgICAgICAgICAgICAgICAgIGludCByZ2JhX3N0cmlkZSwgdWludDhfdCogY29uc3QgcmdiYSkgewotICBjb25zdCB1aW50MzJfdCogY29uc3Qgc3JjID0gKGNvbnN0IHVpbnQzMl90KilyZXNjYWxlci0+ZHN0OwotICBjb25zdCBpbnQgZHN0X3dpZHRoID0gcmVzY2FsZXItPmRzdF93aWR0aDsKLSAgaW50IG51bV9saW5lc19vdXQgPSAwOwotICB3aGlsZSAoV2ViUFJlc2NhbGVySGFzUGVuZGluZ091dHB1dChyZXNjYWxlcikpIHsKLSAgICB1aW50OF90KiBjb25zdCBkc3QgPSByZ2JhICsgbnVtX2xpbmVzX291dCAqIHJnYmFfc3RyaWRlOwotICAgIFdlYlBSZXNjYWxlckV4cG9ydFJvdyhyZXNjYWxlcik7Ci0gICAgVlA4TENvbnZlcnRGcm9tQkdSQShzcmMsIGRzdF93aWR0aCwgY29sb3JzcGFjZSwgZHN0KTsKLSAgICArK251bV9saW5lc19vdXQ7Ci0gIH0KLSAgcmV0dXJuIG51bV9saW5lc19vdXQ7Ci19Ci0KLS8vIEVtaXQgc2NhbGVkIHJvd3MuCi1zdGF0aWMgaW50IEVtaXRSZXNjYWxlZFJvd3MoY29uc3QgVlA4TERlY29kZXIqIGNvbnN0IGRlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgZGF0YSwgaW50IGluX3N0cmlkZSwgaW50IG1iX2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3Qgb3V0LCBpbnQgb3V0X3N0cmlkZSkgewotICBjb25zdCBXRUJQX0NTUF9NT0RFIGNvbG9yc3BhY2UgPSBkZWMtPm91dHB1dF8tPmNvbG9yc3BhY2U7Ci0gIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGluID0gKGNvbnN0IHVpbnQ4X3QqKWRhdGE7Ci0gIGludCBudW1fbGluZXNfaW4gPSAwOwotICBpbnQgbnVtX2xpbmVzX291dCA9IDA7Ci0gIHdoaWxlIChudW1fbGluZXNfaW4gPCBtYl9oKSB7Ci0gICAgY29uc3QgdWludDhfdCogY29uc3Qgcm93X2luID0gaW4gKyBudW1fbGluZXNfaW4gKiBpbl9zdHJpZGU7Ci0gICAgdWludDhfdCogY29uc3Qgcm93X291dCA9IG91dCArIG51bV9saW5lc19vdXQgKiBvdXRfc3RyaWRlOwotICAgIG51bV9saW5lc19pbiArPSBXZWJQUmVzY2FsZXJJbXBvcnQoZGVjLT5yZXNjYWxlciwgbWJfaCAtIG51bV9saW5lc19pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd19pbiwgaW5fc3RyaWRlKTsKLSAgICBudW1fbGluZXNfb3V0ICs9IEV4cG9ydChkZWMtPnJlc2NhbGVyLCBjb2xvcnNwYWNlLCBvdXRfc3RyaWRlLCByb3dfb3V0KTsKLSAgfQotICByZXR1cm4gbnVtX2xpbmVzX291dDsKLX0KLQotLy8gRW1pdCByb3dzIHdpdGhvdXQgYW55IHNjYWxpbmcuCi1zdGF0aWMgaW50IEVtaXRSb3dzKFdFQlBfQ1NQX01PREUgY29sb3JzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGRhdGEsIGludCBpbl9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgIGludCBtYl93LCBpbnQgbWJfaCwKLSAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3Qgb3V0LCBpbnQgb3V0X3N0cmlkZSkgewotICBpbnQgbGluZXMgPSBtYl9oOwotICBjb25zdCB1aW50OF90KiByb3dfaW4gPSAoY29uc3QgdWludDhfdCopZGF0YTsKLSAgdWludDhfdCogcm93X291dCA9IG91dDsKLSAgd2hpbGUgKGxpbmVzLS0gPiAwKSB7Ci0gICAgVlA4TENvbnZlcnRGcm9tQkdSQSgoY29uc3QgdWludDMyX3QqKXJvd19pbiwgbWJfdywgY29sb3JzcGFjZSwgcm93X291dCk7Ci0gICAgcm93X2luICs9IGluX3N0cmlkZTsKLSAgICByb3dfb3V0ICs9IG91dF9zdHJpZGU7Ci0gIH0KLSAgcmV0dXJuIG1iX2g7ICAvLyBOdW0gcm93cyBvdXQgPT0gbnVtIHJvd3MgaW4uCi19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBFeHBvcnQgdG8gWVVWQQotCi1zdGF0aWMgdm9pZCBDb252ZXJ0VG9ZVVZBKGNvbnN0IHVpbnQzMl90KiBjb25zdCBzcmMsIGludCB3aWR0aCwgaW50IHlfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQRGVjQnVmZmVyKiBjb25zdCBvdXRwdXQpIHsKLSAgY29uc3QgV2ViUFlVVkFCdWZmZXIqIGNvbnN0IGJ1ZiA9ICZvdXRwdXQtPnUuWVVWQTsKLSAgLy8gZmlyc3QsIHRoZSBsdW1hIHBsYW5lCi0gIHsKLSAgICBpbnQgaTsKLSAgICB1aW50OF90KiBjb25zdCB5ID0gYnVmLT55ICsgeV9wb3MgKiBidWYtPnlfc3RyaWRlOwotICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgKytpKSB7Ci0gICAgICBjb25zdCB1aW50MzJfdCBwID0gc3JjW2ldOwotICAgICAgeVtpXSA9IFZQOFJHQlRvWSgocCA+PiAxNikgJiAweGZmLCAocCA+PiA4KSAmIDB4ZmYsIChwID4+IDApICYgMHhmZik7Ci0gICAgfQotICB9Ci0KLSAgLy8gdGhlbiBVL1YgcGxhbmVzCi0gIHsKLSAgICB1aW50OF90KiBjb25zdCB1ID0gYnVmLT51ICsgKHlfcG9zID4+IDEpICogYnVmLT51X3N0cmlkZTsKLSAgICB1aW50OF90KiBjb25zdCB2ID0gYnVmLT52ICsgKHlfcG9zID4+IDEpICogYnVmLT52X3N0cmlkZTsKLSAgICBjb25zdCBpbnQgdXZfd2lkdGggPSB3aWR0aCA+PiAxOwotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCB1dl93aWR0aDsgKytpKSB7Ci0gICAgICBjb25zdCB1aW50MzJfdCB2MCA9IHNyY1syICogaSArIDBdOwotICAgICAgY29uc3QgdWludDMyX3QgdjEgPSBzcmNbMiAqIGkgKyAxXTsKLSAgICAgIC8vIFZQOFJHQlRvVS9WIGV4cGVjdHMgZm91ciBhY2N1bXVsYXRlZCBwaXhlbHMuIEhlbmNlIHdlIG5lZWQgdG8KLSAgICAgIC8vIHNjYWxlIHIvZy9iIHZhbHVlIGJ5IGEgZmFjdG9yIDIuIFdlIGp1c3Qgc2hpZnQgdjAvdjEgb25lIGJpdCBsZXNzLgotICAgICAgY29uc3QgaW50IHIgPSAoKHYwID4+IDE1KSAmIDB4MWZlKSArICgodjEgPj4gMTUpICYgMHgxZmUpOwotICAgICAgY29uc3QgaW50IGcgPSAoKHYwID4+ICA3KSAmIDB4MWZlKSArICgodjEgPj4gIDcpICYgMHgxZmUpOwotICAgICAgY29uc3QgaW50IGIgPSAoKHYwIDw8ICAxKSAmIDB4MWZlKSArICgodjEgPDwgIDEpICYgMHgxZmUpOwotICAgICAgaWYgKCEoeV9wb3MgJiAxKSkgeyAgLy8gZXZlbiBsaW5lczogc3RvcmUgdmFsdWVzCi0gICAgICAgIHVbaV0gPSBWUDhSR0JUb1UociwgZywgYik7Ci0gICAgICAgIHZbaV0gPSBWUDhSR0JUb1YociwgZywgYik7Ci0gICAgICB9IGVsc2UgeyAgICAgICAgICAgICAvLyBvZGQgbGluZXM6IGF2ZXJhZ2Ugd2l0aCBwcmV2aW91cyB2YWx1ZXMKLSAgICAgICAgY29uc3QgaW50IHRtcF91ID0gVlA4UkdCVG9VKHIsIGcsIGIpOwotICAgICAgICBjb25zdCBpbnQgdG1wX3YgPSBWUDhSR0JUb1YociwgZywgYik7Ci0gICAgICAgIC8vIEFwcHJveGltYXRlZCBhdmVyYWdlLW9mLWZvdXIuIEJ1dCBpdCdzIGFuIGFjY2VwdGFibGUgZGlmZi4KLSAgICAgICAgdVtpXSA9ICh1W2ldICsgdG1wX3UgKyAxKSA+PiAxOwotICAgICAgICB2W2ldID0gKHZbaV0gKyB0bXBfdiArIDEpID4+IDE7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICh3aWR0aCAmIDEpIHsgICAgICAgLy8gbGFzdCBwaXhlbAotICAgICAgY29uc3QgdWludDMyX3QgdjAgPSBzcmNbMiAqIGkgKyAwXTsKLSAgICAgIGNvbnN0IGludCByID0gKHYwID4+IDE0KSAmIDB4M2ZjOwotICAgICAgY29uc3QgaW50IGcgPSAodjAgPj4gIDYpICYgMHgzZmM7Ci0gICAgICBjb25zdCBpbnQgYiA9ICh2MCA8PCAgMikgJiAweDNmYzsKLSAgICAgIGlmICghKHlfcG9zICYgMSkpIHsgIC8vIGV2ZW4gbGluZXMKLSAgICAgICAgdVtpXSA9IFZQOFJHQlRvVShyLCBnLCBiKTsKLSAgICAgICAgdltpXSA9IFZQOFJHQlRvVihyLCBnLCBiKTsKLSAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgIC8vIG9kZCBsaW5lcyAobm90ZTogd2UgY291bGQganVzdCBza2lwIHRoaXMpCi0gICAgICAgIGNvbnN0IGludCB0bXBfdSA9IFZQOFJHQlRvVShyLCBnLCBiKTsKLSAgICAgICAgY29uc3QgaW50IHRtcF92ID0gVlA4UkdCVG9WKHIsIGcsIGIpOwotICAgICAgICB1W2ldID0gKHVbaV0gKyB0bXBfdSArIDEpID4+IDE7Ci0gICAgICAgIHZbaV0gPSAodltpXSArIHRtcF92ICsgMSkgPj4gMTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgLy8gTGFzdGx5LCBzdG9yZSBhbHBoYSBpZiBuZWVkZWQuCi0gIGlmIChidWYtPmEgIT0gTlVMTCkgewotICAgIGludCBpOwotICAgIHVpbnQ4X3QqIGNvbnN0IGEgPSBidWYtPmEgKyB5X3BvcyAqIGJ1Zi0+YV9zdHJpZGU7Ci0gICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyArK2kpIGFbaV0gPSAoc3JjW2ldID4+IDI0KTsKLSAgfQotfQotCi1zdGF0aWMgaW50IEV4cG9ydFlVVkEoY29uc3QgVlA4TERlY29kZXIqIGNvbnN0IGRlYywgaW50IHlfcG9zKSB7Ci0gIFdlYlBSZXNjYWxlciogY29uc3QgcmVzY2FsZXIgPSBkZWMtPnJlc2NhbGVyOwotICBjb25zdCB1aW50MzJfdCogY29uc3Qgc3JjID0gKGNvbnN0IHVpbnQzMl90KilyZXNjYWxlci0+ZHN0OwotICBjb25zdCBpbnQgZHN0X3dpZHRoID0gcmVzY2FsZXItPmRzdF93aWR0aDsKLSAgaW50IG51bV9saW5lc19vdXQgPSAwOwotICB3aGlsZSAoV2ViUFJlc2NhbGVySGFzUGVuZGluZ091dHB1dChyZXNjYWxlcikpIHsKLSAgICBXZWJQUmVzY2FsZXJFeHBvcnRSb3cocmVzY2FsZXIpOwotICAgIENvbnZlcnRUb1lVVkEoc3JjLCBkc3Rfd2lkdGgsIHlfcG9zLCBkZWMtPm91dHB1dF8pOwotICAgICsreV9wb3M7Ci0gICAgKytudW1fbGluZXNfb3V0OwotICB9Ci0gIHJldHVybiBudW1fbGluZXNfb3V0OwotfQotCi1zdGF0aWMgaW50IEVtaXRSZXNjYWxlZFJvd3NZVVZBKGNvbnN0IFZQOExEZWNvZGVyKiBjb25zdCBkZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5fc3RyaWRlLCBpbnQgbWJfaCkgewotICBjb25zdCB1aW50OF90KiBjb25zdCBpbiA9IChjb25zdCB1aW50OF90KilkYXRhOwotICBpbnQgbnVtX2xpbmVzX2luID0gMDsKLSAgaW50IHlfcG9zID0gZGVjLT5sYXN0X291dF9yb3dfOwotICB3aGlsZSAobnVtX2xpbmVzX2luIDwgbWJfaCkgewotICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHJvd19pbiA9IGluICsgbnVtX2xpbmVzX2luICogaW5fc3RyaWRlOwotICAgIG51bV9saW5lc19pbiArPSBXZWJQUmVzY2FsZXJJbXBvcnQoZGVjLT5yZXNjYWxlciwgbWJfaCAtIG51bV9saW5lc19pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd19pbiwgaW5fc3RyaWRlKTsKLSAgICB5X3BvcyArPSBFeHBvcnRZVVZBKGRlYywgeV9wb3MpOwotICB9Ci0gIHJldHVybiB5X3BvczsKLX0KLQotc3RhdGljIGludCBFbWl0Um93c1lVVkEoY29uc3QgVlA4TERlY29kZXIqIGNvbnN0IGRlYywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBkYXRhLCBpbnQgaW5fc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1iX3csIGludCBudW1fcm93cykgewotICBpbnQgeV9wb3MgPSBkZWMtPmxhc3Rfb3V0X3Jvd187Ci0gIGNvbnN0IHVpbnQ4X3QqIHJvd19pbiA9IChjb25zdCB1aW50OF90KilkYXRhOwotICB3aGlsZSAobnVtX3Jvd3MtLSA+IDApIHsKLSAgICBDb252ZXJ0VG9ZVVZBKChjb25zdCB1aW50MzJfdCopcm93X2luLCBtYl93LCB5X3BvcywgZGVjLT5vdXRwdXRfKTsKLSAgICByb3dfaW4gKz0gaW5fc3RyaWRlOwotICAgICsreV9wb3M7Ci0gIH0KLSAgcmV0dXJuIHlfcG9zOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ3JvcHBpbmcuCi0KLS8vIFNldHMgaW8tPm1iX3ksIGlvLT5tYl9oICYgaW8tPm1iX3cgYWNjb3JkaW5nIHRvIHN0YXJ0IHJvdywgZW5kIHJvdyBhbmQKLS8vIGNyb3Agb3B0aW9ucy4gQWxzbyB1cGRhdGVzIHRoZSBpbnB1dCBkYXRhIHBvaW50ZXIsIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotLy8gc3RhcnQgb2YgdGhlIGNyb3BwZWQgd2luZG93LgotLy8gTm90ZSB0aGF0ICdwaXhlbF9zdHJpZGUnIGlzIGluIHVuaXRzIG9mICd1aW50MzJfdCcgKGFuZCBub3QgJ2J5dGVzKS4KLS8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3JvcCB3aW5kb3cgaXMgbm90IGVtcHR5Lgotc3RhdGljIGludCBTZXRDcm9wV2luZG93KFZQOElvKiBjb25zdCBpbywgaW50IHlfc3RhcnQsIGludCB5X2VuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCoqIGNvbnN0IGluX2RhdGEsIGludCBwaXhlbF9zdHJpZGUpIHsKLSAgU0JfRENIRUNLKHlfc3RhcnQgPCB5X2VuZCk7Ci0gIFNCX0RDSEVDSyhpby0+Y3JvcF9sZWZ0IDwgaW8tPmNyb3BfcmlnaHQpOwotICBpZiAoeV9lbmQgPiBpby0+Y3JvcF9ib3R0b20pIHsKLSAgICB5X2VuZCA9IGlvLT5jcm9wX2JvdHRvbTsgIC8vIG1ha2Ugc3VyZSB3ZSBkb24ndCBvdmVyZmxvdyBvbiBsYXN0IHJvdy4KLSAgfQotICBpZiAoeV9zdGFydCA8IGlvLT5jcm9wX3RvcCkgewotICAgIGNvbnN0IGludCBkZWx0YSA9IGlvLT5jcm9wX3RvcCAtIHlfc3RhcnQ7Ci0gICAgeV9zdGFydCA9IGlvLT5jcm9wX3RvcDsKLSAgICAqaW5fZGF0YSArPSBwaXhlbF9zdHJpZGUgKiBkZWx0YTsKLSAgfQotICBpZiAoeV9zdGFydCA+PSB5X2VuZCkgcmV0dXJuIDA7ICAvLyBDcm9wIHdpbmRvdyBpcyBlbXB0eS4KLQotICAqaW5fZGF0YSArPSBpby0+Y3JvcF9sZWZ0OwotCi0gIGlvLT5tYl95ID0geV9zdGFydCAtIGlvLT5jcm9wX3RvcDsKLSAgaW8tPm1iX3cgPSBpby0+Y3JvcF9yaWdodCAtIGlvLT5jcm9wX2xlZnQ7Ci0gIGlvLT5tYl9oID0geV9lbmQgLSB5X3N0YXJ0OwotICByZXR1cm4gMTsgIC8vIE5vbi1lbXB0eSBjcm9wIHdpbmRvdy4KLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIFdFQlBfSU5MSU5FIGludCBHZXRNZXRhSW5kZXgoCi0gICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGltYWdlLCBpbnQgeHNpemUsIGludCBiaXRzLCBpbnQgeCwgaW50IHkpIHsKLSAgaWYgKGJpdHMgPT0gMCkgcmV0dXJuIDA7Ci0gIHJldHVybiBpbWFnZVt4c2l6ZSAqICh5ID4+IGJpdHMpICsgKHggPj4gYml0cyldOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgSFRyZWVHcm91cCogR2V0SHRyZWVHcm91cEZvclBvcyhWUDhMTWV0YWRhdGEqIGNvbnN0IGhkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4LCBpbnQgeSkgewotICBjb25zdCBpbnQgbWV0YV9pbmRleCA9IEdldE1ldGFJbmRleChoZHItPmh1ZmZtYW5faW1hZ2VfLCBoZHItPmh1ZmZtYW5feHNpemVfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZHItPmh1ZmZtYW5fc3Vic2FtcGxlX2JpdHNfLCB4LCB5KTsKLSAgU0JfRENIRUNLKG1ldGFfaW5kZXggPCBoZHItPm51bV9odHJlZV9ncm91cHNfKTsKLSAgcmV0dXJuIGhkci0+aHRyZWVfZ3JvdXBzXyArIG1ldGFfaW5kZXg7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBNYWluIGxvb3AsIHdpdGggY3VzdG9tIHJvdy1wcm9jZXNzaW5nIGZ1bmN0aW9uCi0KLXR5cGVkZWYgdm9pZCAoKlByb2Nlc3NSb3dzRnVuYykoVlA4TERlY29kZXIqIGNvbnN0IGRlYywgaW50IHJvdyk7Ci0KLXN0YXRpYyB2b2lkIEFwcGx5SW52ZXJzZVRyYW5zZm9ybXMoVlA4TERlY29kZXIqIGNvbnN0IGRlYywgaW50IG51bV9yb3dzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3Qgcm93cykgewotICBpbnQgbiA9IGRlYy0+bmV4dF90cmFuc2Zvcm1fOwotICBjb25zdCBpbnQgY2FjaGVfcGl4cyA9IGRlYy0+d2lkdGhfICogbnVtX3Jvd3M7Ci0gIGNvbnN0IGludCBzdGFydF9yb3cgPSBkZWMtPmxhc3Rfcm93XzsKLSAgY29uc3QgaW50IGVuZF9yb3cgPSBzdGFydF9yb3cgKyBudW1fcm93czsKLSAgY29uc3QgdWludDMyX3QqIHJvd3NfaW4gPSByb3dzOwotICB1aW50MzJfdCogY29uc3Qgcm93c19vdXQgPSBkZWMtPmFyZ2JfY2FjaGVfOwotCi0gIC8vIEludmVyc2UgdHJhbnNmb3Jtcy4KLSAgLy8gVE9ETzogbW9zdCB0cmFuc2Zvcm1zIG9ubHkgbmVlZCB0byBvcGVyYXRlIG9uIHRoZSBjcm9wcGVkIHJlZ2lvbiBvbmx5LgotICBTYk1lbW9yeUNvcHkocm93c19vdXQsIHJvd3NfaW4sIGNhY2hlX3BpeHMgKiBzaXplb2YoKnJvd3Nfb3V0KSk7Ci0gIHdoaWxlIChuLS0gPiAwKSB7Ci0gICAgVlA4TFRyYW5zZm9ybSogY29uc3QgdHJhbnNmb3JtID0gJmRlYy0+dHJhbnNmb3Jtc19bbl07Ci0gICAgVlA4TEludmVyc2VUcmFuc2Zvcm0odHJhbnNmb3JtLCBzdGFydF9yb3csIGVuZF9yb3csIHJvd3NfaW4sIHJvd3Nfb3V0KTsKLSAgICByb3dzX2luID0gcm93c19vdXQ7Ci0gIH0KLX0KLQotLy8gU3BlY2lhbCBtZXRob2QgZm9yIHBhbGV0dGVkIGFscGhhIGRhdGEuCi1zdGF0aWMgdm9pZCBBcHBseUludmVyc2VUcmFuc2Zvcm1zQWxwaGEoVlA4TERlY29kZXIqIGNvbnN0IGRlYywgaW50IG51bV9yb3dzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHJvd3MpIHsKLSAgY29uc3QgaW50IHN0YXJ0X3JvdyA9IGRlYy0+bGFzdF9yb3dfOwotICBjb25zdCBpbnQgZW5kX3JvdyA9IHN0YXJ0X3JvdyArIG51bV9yb3dzOwotICBjb25zdCB1aW50OF90KiByb3dzX2luID0gcm93czsKLSAgdWludDhfdCogcm93c19vdXQgPSAodWludDhfdCopZGVjLT5pb18tPm9wYXF1ZSArIGRlYy0+aW9fLT53aWR0aCAqIHN0YXJ0X3JvdzsKLSAgVlA4TFRyYW5zZm9ybSogY29uc3QgdHJhbnNmb3JtID0gJmRlYy0+dHJhbnNmb3Jtc19bMF07Ci0gIFNCX0RDSEVDSyhkZWMtPm5leHRfdHJhbnNmb3JtXyA9PSAxKTsKLSAgU0JfRENIRUNLKHRyYW5zZm9ybS0+dHlwZV8gPT0gQ09MT1JfSU5ERVhJTkdfVFJBTlNGT1JNKTsKLSAgVlA4TENvbG9ySW5kZXhJbnZlcnNlVHJhbnNmb3JtQWxwaGEodHJhbnNmb3JtLCBzdGFydF9yb3csIGVuZF9yb3csIHJvd3NfaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd3Nfb3V0KTsKLX0KLQotLy8gUHJvY2Vzc2VzICh0cmFuc2Zvcm1zLCBzY2FsZXMgJiBjb2xvci1jb252ZXJ0cykgdGhlIHJvd3MgZGVjb2RlZCBhZnRlciB0aGUKLS8vIGxhc3QgY2FsbC4KLXN0YXRpYyB2b2lkIFByb2Nlc3NSb3dzKFZQOExEZWNvZGVyKiBjb25zdCBkZWMsIGludCByb3cpIHsKLSAgY29uc3QgdWludDMyX3QqIGNvbnN0IHJvd3MgPSBkZWMtPnBpeGVsc18gKyBkZWMtPndpZHRoXyAqIGRlYy0+bGFzdF9yb3dfOwotICBjb25zdCBpbnQgbnVtX3Jvd3MgPSByb3cgLSBkZWMtPmxhc3Rfcm93XzsKLQotICBpZiAobnVtX3Jvd3MgPD0gMCkgcmV0dXJuOyAgLy8gTm90aGluZyB0byBiZSBkb25lLgotICBBcHBseUludmVyc2VUcmFuc2Zvcm1zKGRlYywgbnVtX3Jvd3MsIHJvd3MpOwotCi0gIC8vIEVtaXQgb3V0cHV0LgotICB7Ci0gICAgVlA4SW8qIGNvbnN0IGlvID0gZGVjLT5pb187Ci0gICAgY29uc3QgdWludDMyX3QqIHJvd3NfZGF0YSA9IGRlYy0+YXJnYl9jYWNoZV87Ci0gICAgaWYgKCFTZXRDcm9wV2luZG93KGlvLCBkZWMtPmxhc3Rfcm93Xywgcm93LCAmcm93c19kYXRhLCBpby0+d2lkdGgpKSB7Ci0gICAgICAvLyBOb3RoaW5nIHRvIG91dHB1dCAodGhpcyB0aW1lKS4KLSAgICB9IGVsc2UgewotICAgICAgY29uc3QgV2ViUERlY0J1ZmZlciogY29uc3Qgb3V0cHV0ID0gZGVjLT5vdXRwdXRfOwotICAgICAgY29uc3QgaW50IGluX3N0cmlkZSA9IGlvLT53aWR0aCAqIHNpemVvZigqcm93c19kYXRhKTsKLSAgICAgIGlmIChvdXRwdXQtPmNvbG9yc3BhY2UgPCBNT0RFX1lVVikgeyAgLy8gY29udmVydCB0byBSR0JBCi0gICAgICAgIGNvbnN0IFdlYlBSR0JBQnVmZmVyKiBjb25zdCBidWYgPSAmb3V0cHV0LT51LlJHQkE7Ci0gICAgICAgIHVpbnQ4X3QqIGNvbnN0IHJnYmEgPSBidWYtPnJnYmEgKyBkZWMtPmxhc3Rfb3V0X3Jvd18gKiBidWYtPnN0cmlkZTsKLSAgICAgICAgY29uc3QgaW50IG51bV9yb3dzX291dCA9IGlvLT51c2Vfc2NhbGluZyA/Ci0gICAgICAgICAgICBFbWl0UmVzY2FsZWRSb3dzKGRlYywgcm93c19kYXRhLCBpbl9zdHJpZGUsIGlvLT5tYl9oLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ2JhLCBidWYtPnN0cmlkZSkgOgotICAgICAgICAgICAgRW1pdFJvd3Mob3V0cHV0LT5jb2xvcnNwYWNlLCByb3dzX2RhdGEsIGluX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgIGlvLT5tYl93LCBpby0+bWJfaCwgcmdiYSwgYnVmLT5zdHJpZGUpOwotICAgICAgICAvLyBVcGRhdGUgJ2xhc3Rfb3V0X3Jvd18nLgotICAgICAgICBkZWMtPmxhc3Rfb3V0X3Jvd18gKz0gbnVtX3Jvd3Nfb3V0OwotICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHRvIFlVVkEKLSAgICAgICAgZGVjLT5sYXN0X291dF9yb3dfID0gaW8tPnVzZV9zY2FsaW5nID8KLSAgICAgICAgICAgIEVtaXRSZXNjYWxlZFJvd3NZVVZBKGRlYywgcm93c19kYXRhLCBpbl9zdHJpZGUsIGlvLT5tYl9oKSA6Ci0gICAgICAgICAgICBFbWl0Um93c1lVVkEoZGVjLCByb3dzX2RhdGEsIGluX3N0cmlkZSwgaW8tPm1iX3csIGlvLT5tYl9oKTsKLSAgICAgIH0KLSAgICAgIFNCX0RDSEVDSyhkZWMtPmxhc3Rfb3V0X3Jvd18gPD0gb3V0cHV0LT5oZWlnaHQpOwotICAgIH0KLSAgfQotCi0gIC8vIFVwZGF0ZSAnbGFzdF9yb3dfJy4KLSAgZGVjLT5sYXN0X3Jvd18gPSByb3c7Ci0gIFNCX0RDSEVDSyhkZWMtPmxhc3Rfcm93XyA8PSBkZWMtPmhlaWdodF8pOwotfQotCi0jZGVmaW5lIERFQ09ERV9EQVRBX0ZVTkMoRlVOQ19OQU1FLCBUWVBFLCBTVE9SRV9QSVhFTCkgICAgICAgICAgICAgICAgICAgICAgICAgXAotc3RhdGljIGludCBGVU5DX05BTUUoVlA4TERlY29kZXIqIGNvbnN0IGRlYywgVFlQRSogY29uc3QgZGF0YSwgaW50IHdpZHRoLCAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsIFByb2Nlc3NSb3dzRnVuYyBwcm9jZXNzX2Z1bmMpIHsgICAgICAgICAgICAgICBcCi0gIGludCBvayA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpbnQgY29sID0gMCwgcm93ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgVlA4TEJpdFJlYWRlciogY29uc3QgYnIgPSAmZGVjLT5icl87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIFZQOExNZXRhZGF0YSogY29uc3QgaGRyID0gJmRlYy0+aGRyXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBIVHJlZUdyb3VwKiBodHJlZV9ncm91cCA9IGhkci0+aHRyZWVfZ3JvdXBzXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgVFlQRSogc3JjID0gZGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIFRZUEUqIGxhc3RfY2FjaGVkID0gZGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBUWVBFKiBjb25zdCBzcmNfZW5kID0gZGF0YSArIHdpZHRoICogaGVpZ2h0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgaW50IGxlbl9jb2RlX2xpbWl0ID0gTlVNX0xJVEVSQUxfQ09ERVMgKyBOVU1fTEVOR1RIX0NPREVTOyAgICAgICAgICAgICBcCi0gIGNvbnN0IGludCBjb2xvcl9jYWNoZV9saW1pdCA9IGxlbl9jb2RlX2xpbWl0ICsgaGRyLT5jb2xvcl9jYWNoZV9zaXplXzsgICAgICAgXAotICBWUDhMQ29sb3JDYWNoZSogY29uc3QgY29sb3JfY2FjaGUgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIChoZHItPmNvbG9yX2NhY2hlX3NpemVfID4gMCkgPyAmaGRyLT5jb2xvcl9jYWNoZV8gOiBOVUxMOyAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IGludCBtYXNrID0gaGRyLT5odWZmbWFuX21hc2tfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBTQl9EQ0hFQ0soaHRyZWVfZ3JvdXAgIT0gTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgd2hpbGUgKCFici0+ZW9zXyAmJiBzcmMgPCBzcmNfZW5kKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50IGNvZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIC8qIE9ubHkgdXBkYXRlIHdoZW4gY2hhbmdpbmcgdGlsZS4gTm90ZSB3ZSBjb3VsZCB1c2UgdGhpcyB0ZXN0OiAgICAgICAgKi8gIFwKLSAgICAvKiBpZiAiKCgoKHByZXZfY29sIF4gY29sKSB8IHByZXZfcm93IF4gcm93KSkgPiBtYXNrKSIgLT4gdGlsZSBjaGFuZ2VkICovICBcCi0gICAgLyogYnV0IHRoYXQncyBhY3R1YWxseSBzbG93ZXIgYW5kIG5lZWRzIHN0b3JpbmcgdGhlIHByZXZpb3VzIGNvbC9yb3cuICAqLyAgXAotICAgIGlmICgoY29sICYgbWFzaykgPT0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGh0cmVlX2dyb3VwID0gR2V0SHRyZWVHcm91cEZvclBvcyhoZHIsIGNvbCwgcm93KTsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFZQOExGaWxsQml0V2luZG93KGJyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjb2RlID0gUmVhZFN5bWJvbCgmaHRyZWVfZ3JvdXAtPmh0cmVlc19bR1JFRU5dLCBicik7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGNvZGUgPCBOVU1fTElURVJBTF9DT0RFUykgeyAgLyogTGl0ZXJhbCovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgaW50IHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHJlZCA9IFJlYWRTeW1ib2woJmh0cmVlX2dyb3VwLT5odHJlZXNfW1JFRF0sIGJyKTsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBncmVlbiA9IGNvZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgVlA4TEZpbGxCaXRXaW5kb3coYnIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGJsdWUgPSBSZWFkU3ltYm9sKCZodHJlZV9ncm91cC0+aHRyZWVzX1tCTFVFXSwgYnIpOyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBhbHBoYSA9IFJlYWRTeW1ib2woJmh0cmVlX2dyb3VwLT5odHJlZXNfW0FMUEhBXSwgYnIpOyAgICAgICAgICAgICAgICAgICAgXAotICAgICAgKnNyYyA9IFNUT1JFX1BJWEVMKGFscGhhLCByZWQsIGdyZWVuLCBibHVlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBBZHZhbmNlQnlPbmU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICArK3NyYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgKytjb2w7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGlmIChjb2wgPj0gd2lkdGgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGNvbCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICArK3JvdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKChwcm9jZXNzX2Z1bmMgIT0gTlVMTCkgJiYgKHJvdyAlIE5VTV9BUkdCX0NBQ0hFX1JPV1MgPT0gMCkpIHsgICAgICBcCi0gICAgICAgICAgcHJvY2Vzc19mdW5jKGRlYywgcm93KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKGNvbG9yX2NhY2hlICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgd2hpbGUgKGxhc3RfY2FjaGVkIDwgc3JjKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgVlA4TENvbG9yQ2FjaGVJbnNlcnQoY29sb3JfY2FjaGUsICpsYXN0X2NhY2hlZCsrKTsgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9IGVsc2UgaWYgKGNvZGUgPCBsZW5fY29kZV9saW1pdCkgeyAgLyogQmFja3dhcmQgcmVmZXJlbmNlICovICAgICAgICAgICAgICBcCi0gICAgICBpbnQgZGlzdF9jb2RlLCBkaXN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY29uc3QgaW50IGxlbmd0aF9zeW0gPSBjb2RlIC0gTlVNX0xJVEVSQUxfQ09ERVM7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNvbnN0IGludCBsZW5ndGggPSBHZXRDb3B5TGVuZ3RoKGxlbmd0aF9zeW0sIGJyKTsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBjb25zdCBpbnQgZGlzdF9zeW1ib2wgPSBSZWFkU3ltYm9sKCZodHJlZV9ncm91cC0+aHRyZWVzX1tESVNUXSwgYnIpOyAgICAgXAotICAgICAgVlA4TEZpbGxCaXRXaW5kb3coYnIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGRpc3RfY29kZSA9IEdldENvcHlEaXN0YW5jZShkaXN0X3N5bWJvbCwgYnIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBkaXN0ID0gUGxhbmVDb2RlVG9EaXN0YW5jZSh3aWR0aCwgZGlzdF9jb2RlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgaWYgKHNyYyAtIGRhdGEgPCBkaXN0IHx8IHNyY19lbmQgLSBzcmMgPCBsZW5ndGgpIHsgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgb2sgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGdvdG8gRW5kOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHNyY1tpXSA9IHNyY1tpIC0gZGlzdF07ICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgc3JjICs9IGxlbmd0aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY29sICs9IGxlbmd0aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHdoaWxlIChjb2wgPj0gd2lkdGgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGNvbCAtPSB3aWR0aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICArK3JvdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKChwcm9jZXNzX2Z1bmMgIT0gTlVMTCkgJiYgKHJvdyAlIE5VTV9BUkdCX0NBQ0hFX1JPV1MgPT0gMCkpIHsgICAgICBcCi0gICAgICAgICAgcHJvY2Vzc19mdW5jKGRlYywgcm93KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBpZiAoc3JjIDwgc3JjX2VuZCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBodHJlZV9ncm91cCA9IEdldEh0cmVlR3JvdXBGb3JQb3MoaGRyLCBjb2wsIHJvdyk7ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKGNvbG9yX2NhY2hlICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgd2hpbGUgKGxhc3RfY2FjaGVkIDwgc3JjKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgVlA4TENvbG9yQ2FjaGVJbnNlcnQoY29sb3JfY2FjaGUsICpsYXN0X2NhY2hlZCsrKTsgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9IGVsc2UgaWYgKGNvZGUgPCBjb2xvcl9jYWNoZV9saW1pdCkgeyAgLyogQ29sb3IgY2FjaGUgKi8gICAgICAgICAgICAgICAgICBcCi0gICAgICBjb25zdCBpbnQga2V5ID0gY29kZSAtIGxlbl9jb2RlX2xpbWl0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgU0JfRENIRUNLKGNvbG9yX2NhY2hlICE9IE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHdoaWxlIChsYXN0X2NhY2hlZCA8IHNyYykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIFZQOExDb2xvckNhY2hlSW5zZXJ0KGNvbG9yX2NhY2hlLCAqbGFzdF9jYWNoZWQrKyk7ICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICpzcmMgPSBWUDhMQ29sb3JDYWNoZUxvb2t1cChjb2xvcl9jYWNoZSwga2V5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBnb3RvIEFkdmFuY2VCeU9uZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gZWxzZSB7ICAvKiBOb3QgcmVhY2hlZCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIG9rID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBnb3RvIEVuZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBvayA9ICFici0+ZXJyb3JfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCFvaykgZ290byBFbmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgLyogUHJvY2VzcyB0aGUgcmVtYWluaW5nIHJvd3MgY29ycmVzcG9uZGluZyB0byBsYXN0IHJvdy1ibG9jay4gKi8gICAgICAgICAgICBcCi0gIGlmIChwcm9jZXNzX2Z1bmMgIT0gTlVMTCkgcHJvY2Vzc19mdW5jKGRlYywgcm93KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotRW5kOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaWYgKGJyLT5lcnJvcl8gfHwgIW9rIHx8IChici0+ZW9zXyAmJiBzcmMgPCBzcmNfZW5kKSkgeyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgb2sgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGRlYy0+c3RhdHVzXyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKCFici0+ZW9zXykgPyBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUiA6IFZQOF9TVEFUVVNfU1VTUEVOREVEOyAgICAgICBcCi0gIH0gZWxzZSBpZiAoc3JjID09IHNyY19lbmQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGRlYy0+c3RhdGVfID0gUkVBRF9EQVRBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHJldHVybiBvazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgR2V0QVJHQlBpeGVsKGludCBhbHBoYSwgaW50IHJlZCwgaW50IGdyZWVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmx1ZSkgewotICByZXR1cm4gKGFscGhhIDw8IDI0KSB8IChyZWQgPDwgMTYpIHwgKGdyZWVuIDw8IDgpIHwgYmx1ZTsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ4X3QgR2V0QWxwaGFQaXhlbChpbnQgYWxwaGEsIGludCByZWQsIGludCBncmVlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsdWUpIHsKLSAgKHZvaWQpYWxwaGE7Ci0gICh2b2lkKXJlZDsKLSAgKHZvaWQpYmx1ZTsKLSAgcmV0dXJuIGdyZWVuOyAgLy8gQWxwaGEgdmFsdWUgaXMgc3RvcmVkIGluIGdyZWVuIGNoYW5uZWwuCi19Ci0KLURFQ09ERV9EQVRBX0ZVTkMoRGVjb2RlSW1hZ2VEYXRhLCB1aW50MzJfdCwgR2V0QVJHQlBpeGVsKQotREVDT0RFX0RBVEFfRlVOQyhEZWNvZGVBbHBoYURhdGEsIHVpbnQ4X3QsIEdldEFscGhhUGl4ZWwpCi0KLSN1bmRlZiBERUNPREVfREFUQV9GVU5DCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBWUDhMVHJhbnNmb3JtCi0KLXN0YXRpYyB2b2lkIENsZWFyVHJhbnNmb3JtKFZQOExUcmFuc2Zvcm0qIGNvbnN0IHRyYW5zZm9ybSkgewotICBTYk1lbW9yeURlYWxsb2NhdGUodHJhbnNmb3JtLT5kYXRhXyk7Ci0gIHRyYW5zZm9ybS0+ZGF0YV8gPSBOVUxMOwotfQotCi0vLyBGb3Igc2VjdXJpdHkgcmVhc29uLCB3ZSBuZWVkIHRvIHJlbWFwIHRoZSBjb2xvciBtYXAgdG8gc3BhbgotLy8gdGhlIHRvdGFsIHBvc3NpYmxlIGJ1bmRsZWQgdmFsdWVzLCBhbmQgbm90IGp1c3QgdGhlIG51bV9jb2xvcnMuCi1zdGF0aWMgaW50IEV4cGFuZENvbG9yTWFwKGludCBudW1fY29sb3JzLCBWUDhMVHJhbnNmb3JtKiBjb25zdCB0cmFuc2Zvcm0pIHsKLSAgaW50IGk7Ci0gIGNvbnN0IGludCBmaW5hbF9udW1fY29sb3JzID0gMSA8PCAoOCA+PiB0cmFuc2Zvcm0tPmJpdHNfKTsKLSAgdWludDMyX3QqIGNvbnN0IG5ld19jb2xvcl9tYXAgPQotICAgICAgKHVpbnQzMl90KilXZWJQU2FmZU1hbGxvYygodWludDY0X3QpZmluYWxfbnVtX2NvbG9ycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpuZXdfY29sb3JfbWFwKSk7Ci0gIGlmIChuZXdfY29sb3JfbWFwID09IE5VTEwpIHsKLSAgICByZXR1cm4gMDsKLSAgfSBlbHNlIHsKLSAgICB1aW50OF90KiBjb25zdCBkYXRhID0gKHVpbnQ4X3QqKXRyYW5zZm9ybS0+ZGF0YV87Ci0gICAgdWludDhfdCogY29uc3QgbmV3X2RhdGEgPSAodWludDhfdCopbmV3X2NvbG9yX21hcDsKLSAgICBuZXdfY29sb3JfbWFwWzBdID0gdHJhbnNmb3JtLT5kYXRhX1swXTsKLSAgICBmb3IgKGkgPSA0OyBpIDwgNCAqIG51bV9jb2xvcnM7ICsraSkgewotICAgICAgLy8gRXF1aXZhbGVudCB0byBBZGRQaXhlbEVxKCksIG9uIGEgYnl0ZS1iYXNpcy4KLSAgICAgIG5ld19kYXRhW2ldID0gKGRhdGFbaV0gKyBuZXdfZGF0YVtpIC0gNF0pICYgMHhmZjsKLSAgICB9Ci0gICAgZm9yICg7IGkgPCA0ICogZmluYWxfbnVtX2NvbG9yczsgKytpKQotICAgICAgbmV3X2RhdGFbaV0gPSAwOyAgLy8gYmxhY2sgdGFpbC4KLSAgICBTYk1lbW9yeURlYWxsb2NhdGUodHJhbnNmb3JtLT5kYXRhXyk7Ci0gICAgdHJhbnNmb3JtLT5kYXRhXyA9IG5ld19jb2xvcl9tYXA7Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgUmVhZFRyYW5zZm9ybShpbnQqIGNvbnN0IHhzaXplLCBpbnQgY29uc3QqIHlzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExEZWNvZGVyKiBjb25zdCBkZWMpIHsKLSAgaW50IG9rID0gMTsKLSAgVlA4TEJpdFJlYWRlciogY29uc3QgYnIgPSAmZGVjLT5icl87Ci0gIFZQOExUcmFuc2Zvcm0qIHRyYW5zZm9ybSA9ICZkZWMtPnRyYW5zZm9ybXNfW2RlYy0+bmV4dF90cmFuc2Zvcm1fXTsKLSAgY29uc3QgVlA4TEltYWdlVHJhbnNmb3JtVHlwZSB0eXBlID0KLSAgICAgIChWUDhMSW1hZ2VUcmFuc2Zvcm1UeXBlKVZQOExSZWFkQml0cyhiciwgMik7Ci0KLSAgLy8gRWFjaCB0cmFuc2Zvcm0gdHlwZSBjYW4gb25seSBiZSBwcmVzZW50IG9uY2UgaW4gdGhlIHN0cmVhbS4KLSAgaWYgKGRlYy0+dHJhbnNmb3Jtc19zZWVuXyAmICgxVSA8PCB0eXBlKSkgewotICAgIHJldHVybiAwOyAgLy8gQWxyZWFkeSB0aGVyZSwgbGV0J3Mgbm90IGFjY2VwdCB0aGUgc2Vjb25kIHNhbWUgdHJhbnNmb3JtLgotICB9Ci0gIGRlYy0+dHJhbnNmb3Jtc19zZWVuXyB8PSAoMVUgPDwgdHlwZSk7Ci0KLSAgdHJhbnNmb3JtLT50eXBlXyA9IHR5cGU7Ci0gIHRyYW5zZm9ybS0+eHNpemVfID0gKnhzaXplOwotICB0cmFuc2Zvcm0tPnlzaXplXyA9ICp5c2l6ZTsKLSAgdHJhbnNmb3JtLT5kYXRhXyA9IE5VTEw7Ci0gICsrZGVjLT5uZXh0X3RyYW5zZm9ybV87Ci0gIFNCX0RDSEVDSyhkZWMtPm5leHRfdHJhbnNmb3JtXyA8PSBOVU1fVFJBTlNGT1JNUyk7Ci0KLSAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBQUkVESUNUT1JfVFJBTlNGT1JNOgotICAgIGNhc2UgQ1JPU1NfQ09MT1JfVFJBTlNGT1JNOgotICAgICAgdHJhbnNmb3JtLT5iaXRzXyA9IFZQOExSZWFkQml0cyhiciwgMykgKyAyOwotICAgICAgb2sgPSBEZWNvZGVJbWFnZVN0cmVhbShWUDhMU3ViU2FtcGxlU2l6ZSh0cmFuc2Zvcm0tPnhzaXplXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtLT5iaXRzXyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExTdWJTYW1wbGVTaXplKHRyYW5zZm9ybS0+eXNpemVfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0tPmJpdHNfKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgZGVjLCAmdHJhbnNmb3JtLT5kYXRhXyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENPTE9SX0lOREVYSU5HX1RSQU5TRk9STTogewotICAgICAgIGNvbnN0IGludCBudW1fY29sb3JzID0gVlA4TFJlYWRCaXRzKGJyLCA4KSArIDE7Ci0gICAgICAgY29uc3QgaW50IGJpdHMgPSAobnVtX2NvbG9ycyA+IDE2KSA/IDAKLSAgICAgICAgICAgICAgICAgICAgICA6IChudW1fY29sb3JzID4gNCkgPyAxCi0gICAgICAgICAgICAgICAgICAgICAgOiAobnVtX2NvbG9ycyA+IDIpID8gMgotICAgICAgICAgICAgICAgICAgICAgIDogMzsKLSAgICAgICAqeHNpemUgPSBWUDhMU3ViU2FtcGxlU2l6ZSh0cmFuc2Zvcm0tPnhzaXplXywgYml0cyk7Ci0gICAgICAgdHJhbnNmb3JtLT5iaXRzXyA9IGJpdHM7Ci0gICAgICAgb2sgPSBEZWNvZGVJbWFnZVN0cmVhbShudW1fY29sb3JzLCAxLCAwLCBkZWMsICZ0cmFuc2Zvcm0tPmRhdGFfKTsKLSAgICAgICBvayA9IG9rICYmIEV4cGFuZENvbG9yTWFwKG51bV9jb2xvcnMsIHRyYW5zZm9ybSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBTVUJUUkFDVF9HUkVFTjoKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBTQl9EQ0hFQ0soMCk7ICAgIC8vIGNhbid0IGhhcHBlbgotICAgICAgYnJlYWs7Ci0gIH0KLQotICByZXR1cm4gb2s7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBWUDhMTWV0YWRhdGEKLQotc3RhdGljIHZvaWQgSW5pdE1ldGFkYXRhKFZQOExNZXRhZGF0YSogY29uc3QgaGRyKSB7Ci0gIFNCX0RDSEVDSyhoZHIpOwotICBTYk1lbW9yeVNldChoZHIsIDAsIHNpemVvZigqaGRyKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIENsZWFyTWV0YWRhdGEoVlA4TE1ldGFkYXRhKiBjb25zdCBoZHIpIHsKLSAgU0JfRENIRUNLKGhkcik7Ci0KLSAgU2JNZW1vcnlEZWFsbG9jYXRlKGhkci0+aHVmZm1hbl9pbWFnZV8pOwotICBEZWxldGVIdHJlZUdyb3VwcyhoZHItPmh0cmVlX2dyb3Vwc18sIGhkci0+bnVtX2h0cmVlX2dyb3Vwc18pOwotICBWUDhMQ29sb3JDYWNoZUNsZWFyKCZoZHItPmNvbG9yX2NhY2hlXyk7Ci0gIEluaXRNZXRhZGF0YShoZHIpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVlA4TERlY29kZXIKLQotVlA4TERlY29kZXIqIFZQOExOZXcodm9pZCkgewotICBWUDhMRGVjb2RlciogY29uc3QgZGVjID0gKFZQOExEZWNvZGVyKilTYk1lbW9yeUNhbGxvYygxLCBzaXplb2YoKmRlYykpOwotICBpZiAoZGVjID09IE5VTEwpIHJldHVybiBOVUxMOwotICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX09LOwotICBkZWMtPmFjdGlvbl8gPSBSRUFEX0RJTTsKLSAgZGVjLT5zdGF0ZV8gPSBSRUFEX0RJTTsKLSAgcmV0dXJuIGRlYzsKLX0KLQotdm9pZCBWUDhMQ2xlYXIoVlA4TERlY29kZXIqIGNvbnN0IGRlYykgewotICBpbnQgaTsKLSAgaWYgKGRlYyA9PSBOVUxMKSByZXR1cm47Ci0gIENsZWFyTWV0YWRhdGEoJmRlYy0+aGRyXyk7Ci0KLSAgU2JNZW1vcnlEZWFsbG9jYXRlKGRlYy0+cGl4ZWxzXyk7Ci0gIGRlYy0+cGl4ZWxzXyA9IE5VTEw7Ci0gIGZvciAoaSA9IDA7IGkgPCBkZWMtPm5leHRfdHJhbnNmb3JtXzsgKytpKSB7Ci0gICAgQ2xlYXJUcmFuc2Zvcm0oJmRlYy0+dHJhbnNmb3Jtc19baV0pOwotICB9Ci0gIGRlYy0+bmV4dF90cmFuc2Zvcm1fID0gMDsKLSAgZGVjLT50cmFuc2Zvcm1zX3NlZW5fID0gMDsKLQotICBTYk1lbW9yeURlYWxsb2NhdGUoZGVjLT5yZXNjYWxlcl9tZW1vcnkpOwotICBkZWMtPnJlc2NhbGVyX21lbW9yeSA9IE5VTEw7Ci0KLSAgZGVjLT5vdXRwdXRfID0gTlVMTDsgICAvLyBsZWF2ZSBubyB0cmFjZSBiZWhpbmQKLX0KLQotdm9pZCBWUDhMRGVsZXRlKFZQOExEZWNvZGVyKiBjb25zdCBkZWMpIHsKLSAgaWYgKGRlYyAhPSBOVUxMKSB7Ci0gICAgVlA4TENsZWFyKGRlYyk7Ci0gICAgU2JNZW1vcnlEZWFsbG9jYXRlKGRlYyk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgVXBkYXRlRGVjb2RlcihWUDhMRGVjb2RlciogY29uc3QgZGVjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgVlA4TE1ldGFkYXRhKiBjb25zdCBoZHIgPSAmZGVjLT5oZHJfOwotICBjb25zdCBpbnQgbnVtX2JpdHMgPSBoZHItPmh1ZmZtYW5fc3Vic2FtcGxlX2JpdHNfOwotICBkZWMtPndpZHRoXyA9IHdpZHRoOwotICBkZWMtPmhlaWdodF8gPSBoZWlnaHQ7Ci0KLSAgaGRyLT5odWZmbWFuX3hzaXplXyA9IFZQOExTdWJTYW1wbGVTaXplKHdpZHRoLCBudW1fYml0cyk7Ci0gIGhkci0+aHVmZm1hbl9tYXNrXyA9IChudW1fYml0cyA9PSAwKSA/IH4wIDogKDEgPDwgbnVtX2JpdHMpIC0gMTsKLX0KLQotc3RhdGljIGludCBEZWNvZGVJbWFnZVN0cmVhbShpbnQgeHNpemUsIGludCB5c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX2xldmVsMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TERlY29kZXIqIGNvbnN0IGRlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqKiBjb25zdCBkZWNvZGVkX2RhdGEpIHsKLSAgaW50IG9rID0gMTsKLSAgaW50IHRyYW5zZm9ybV94c2l6ZSA9IHhzaXplOwotICBpbnQgdHJhbnNmb3JtX3lzaXplID0geXNpemU7Ci0gIFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyID0gJmRlYy0+YnJfOwotICBWUDhMTWV0YWRhdGEqIGNvbnN0IGhkciA9ICZkZWMtPmhkcl87Ci0gIHVpbnQzMl90KiBkYXRhID0gTlVMTDsKLSAgaW50IGNvbG9yX2NhY2hlX2JpdHMgPSAwOwotCi0gIC8vIFJlYWQgdGhlIHRyYW5zZm9ybXMgKG1heSByZWN1cnNlKS4KLSAgaWYgKGlzX2xldmVsMCkgewotICAgIHdoaWxlIChvayAmJiBWUDhMUmVhZEJpdHMoYnIsIDEpKSB7Ci0gICAgICBvayA9IFJlYWRUcmFuc2Zvcm0oJnRyYW5zZm9ybV94c2l6ZSwgJnRyYW5zZm9ybV95c2l6ZSwgZGVjKTsKLSAgICB9Ci0gIH0KLQotICAvLyBDb2xvciBjYWNoZQotICBpZiAob2sgJiYgVlA4TFJlYWRCaXRzKGJyLCAxKSkgewotICAgIGNvbG9yX2NhY2hlX2JpdHMgPSBWUDhMUmVhZEJpdHMoYnIsIDQpOwotICAgIG9rID0gKGNvbG9yX2NhY2hlX2JpdHMgPj0gMSAmJiBjb2xvcl9jYWNoZV9iaXRzIDw9IE1BWF9DQUNIRV9CSVRTKTsKLSAgICBpZiAoIW9rKSB7Ci0gICAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUjsKLSAgICAgIGdvdG8gRW5kOwotICAgIH0KLSAgfQotCi0gIC8vIFJlYWQgdGhlIEh1ZmZtYW4gY29kZXMgKG1heSByZWN1cnNlKS4KLSAgb2sgPSBvayAmJiBSZWFkSHVmZm1hbkNvZGVzKGRlYywgdHJhbnNmb3JtX3hzaXplLCB0cmFuc2Zvcm1feXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcl9jYWNoZV9iaXRzLCBpc19sZXZlbDApOwotICBpZiAoIW9rKSB7Ci0gICAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7Ci0gICAgZ290byBFbmQ7Ci0gIH0KLQotICAvLyBGaW5pc2ggc2V0dGluZyB1cCB0aGUgY29sb3ItY2FjaGUKLSAgaWYgKGNvbG9yX2NhY2hlX2JpdHMgPiAwKSB7Ci0gICAgaGRyLT5jb2xvcl9jYWNoZV9zaXplXyA9IDEgPDwgY29sb3JfY2FjaGVfYml0czsKLSAgICBpZiAoIVZQOExDb2xvckNhY2hlSW5pdCgmaGRyLT5jb2xvcl9jYWNoZV8sIGNvbG9yX2NhY2hlX2JpdHMpKSB7Ci0gICAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX09VVF9PRl9NRU1PUlk7Ci0gICAgICBvayA9IDA7Ci0gICAgICBnb3RvIEVuZDsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaGRyLT5jb2xvcl9jYWNoZV9zaXplXyA9IDA7Ci0gIH0KLSAgVXBkYXRlRGVjb2RlcihkZWMsIHRyYW5zZm9ybV94c2l6ZSwgdHJhbnNmb3JtX3lzaXplKTsKLQotICBpZiAoaXNfbGV2ZWwwKSB7ICAgLy8gbGV2ZWwgMCBjb21wbGV0ZQotICAgIGRlYy0+c3RhdGVfID0gUkVBRF9IRFI7Ci0gICAgZ290byBFbmQ7Ci0gIH0KLQotICB7Ci0gICAgY29uc3QgdWludDY0X3QgdG90YWxfc2l6ZSA9ICh1aW50NjRfdCl0cmFuc2Zvcm1feHNpemUgKiB0cmFuc2Zvcm1feXNpemU7Ci0gICAgZGF0YSA9ICh1aW50MzJfdCopV2ViUFNhZmVNYWxsb2ModG90YWxfc2l6ZSwgc2l6ZW9mKCpkYXRhKSk7Ci0gICAgaWYgKGRhdGEgPT0gTlVMTCkgewotICAgICAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19PVVRfT0ZfTUVNT1JZOwotICAgICAgb2sgPSAwOwotICAgICAgZ290byBFbmQ7Ci0gICAgfQotICB9Ci0KLSAgLy8gVXNlIHRoZSBIdWZmbWFuIHRyZWVzIHRvIGRlY29kZSB0aGUgTFo3NyBlbmNvZGVkIGRhdGEuCi0gIG9rID0gRGVjb2RlSW1hZ2VEYXRhKGRlYywgZGF0YSwgdHJhbnNmb3JtX3hzaXplLCB0cmFuc2Zvcm1feXNpemUsIE5VTEwpOwotICBvayA9IG9rICYmICFici0+ZXJyb3JfOwotCi0gRW5kOgotCi0gIGlmICghb2spIHsKLSAgICBTYk1lbW9yeURlYWxsb2NhdGUoZGF0YSk7Ci0gICAgQ2xlYXJNZXRhZGF0YShoZHIpOwotICAgIC8vIElmIG5vdCBlbm91Z2ggZGF0YSAoYnIuZW9zXykgcmVzdWx0ZWQgaW4gQklUX1NUUkVBTV9FUlJPUiwgdXBkYXRlIHRoZQotICAgIC8vIHN0YXR1cyBhcHByb3ByaWF0ZWx5LgotICAgIGlmIChkZWMtPnN0YXR1c18gPT0gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1IgJiYgZGVjLT5icl8uZW9zXykgewotICAgICAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19TVVNQRU5ERUQ7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmIChkZWNvZGVkX2RhdGEgIT0gTlVMTCkgewotICAgICAgKmRlY29kZWRfZGF0YSA9IGRhdGE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIFdlIGFsbG9jYXRlIGltYWdlIGRhdGEgaW4gdGhpcyBmdW5jdGlvbiBvbmx5IGZvciB0cmFuc2Zvcm1zLiBBdCBsZXZlbCAwCi0gICAgICAvLyAodGhhdCBpczogbm90IHRoZSB0cmFuc2Zvcm1zKSwgd2Ugc2hvdWxkbid0IGhhdmUgYWxsb2NhdGVkIGFueXRoaW5nLgotICAgICAgU0JfRENIRUNLKGRhdGEgPT0gTlVMTCk7Ci0gICAgICBTQl9EQ0hFQ0soaXNfbGV2ZWwwKTsKLSAgICB9Ci0gICAgaWYgKCFpc19sZXZlbDApIENsZWFyTWV0YWRhdGEoaGRyKTsgIC8vIENsZWFuIHVwIHRlbXBvcmFyeSBkYXRhIGJlaGluZC4KLSAgfQotICByZXR1cm4gb2s7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBBbGxvY2F0ZSBpbnRlcm5hbCBidWZmZXJzIGRlYy0+cGl4ZWxzXyBhbmQgZGVjLT5hcmdiX2NhY2hlXy4KLXN0YXRpYyBpbnQgQWxsb2NhdGVJbnRlcm5hbEJ1ZmZlcnMoVlA4TERlY29kZXIqIGNvbnN0IGRlYywgaW50IGZpbmFsX3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnl0ZXNfcGVyX3BpeGVsKSB7Ci0gIGNvbnN0IGludCBhcmdiX2NhY2hlX25lZWRlZCA9IChieXRlc19wZXJfcGl4ZWwgPT0gc2l6ZW9mKHVpbnQzMl90KSk7Ci0gIGNvbnN0IHVpbnQ2NF90IG51bV9waXhlbHMgPSAodWludDY0X3QpZGVjLT53aWR0aF8gKiBkZWMtPmhlaWdodF87Ci0gIC8vIFNjcmF0Y2ggYnVmZmVyIGNvcnJlc3BvbmRpbmcgdG8gdG9wLXByZWRpY3Rpb24gcm93IGZvciB0cmFuc2Zvcm1pbmcgdGhlCi0gIC8vIGZpcnN0IHJvdyBpbiB0aGUgcm93LWJsb2Nrcy4gTm90IG5lZWRlZCBmb3IgcGFsZXR0ZWQgYWxwaGEuCi0gIGNvbnN0IHVpbnQ2NF90IGNhY2hlX3RvcF9waXhlbHMgPQotICAgICAgYXJnYl9jYWNoZV9uZWVkZWQgPyAodWludDE2X3QpZmluYWxfd2lkdGggOiAwVUxMOwotICAvLyBTY3JhdGNoIGJ1ZmZlciBmb3IgdGVtcG9yYXJ5IEJHUkEgc3RvcmFnZS4gTm90IG5lZWRlZCBmb3IgcGFsZXR0ZWQgYWxwaGEuCi0gIGNvbnN0IHVpbnQ2NF90IGNhY2hlX3BpeGVscyA9Ci0gICAgICBhcmdiX2NhY2hlX25lZWRlZCA/ICh1aW50NjRfdClmaW5hbF93aWR0aCAqIE5VTV9BUkdCX0NBQ0hFX1JPV1MgOiAwVUxMOwotICBjb25zdCB1aW50NjRfdCB0b3RhbF9udW1fcGl4ZWxzID0KLSAgICAgIG51bV9waXhlbHMgKyBjYWNoZV90b3BfcGl4ZWxzICsgY2FjaGVfcGl4ZWxzOwotCi0gIFNCX0RDSEVDSyhkZWMtPndpZHRoXyA8PSBmaW5hbF93aWR0aCk7Ci0gIGRlYy0+cGl4ZWxzXyA9ICh1aW50MzJfdCopV2ViUFNhZmVNYWxsb2ModG90YWxfbnVtX3BpeGVscywgYnl0ZXNfcGVyX3BpeGVsKTsKLSAgaWYgKGRlYy0+cGl4ZWxzXyA9PSBOVUxMKSB7Ci0gICAgZGVjLT5hcmdiX2NhY2hlXyA9IE5VTEw7ICAgIC8vIGZvciBzYW5pdHkgY2hlY2sKLSAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX09VVF9PRl9NRU1PUlk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgZGVjLT5hcmdiX2NhY2hlXyA9Ci0gICAgICBhcmdiX2NhY2hlX25lZWRlZCA/IGRlYy0+cGl4ZWxzXyArIG51bV9waXhlbHMgKyBjYWNoZV90b3BfcGl4ZWxzIDogTlVMTDsKLSAgcmV0dXJuIDE7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIFNwZWNpYWwgcm93LXByb2Nlc3NpbmcgdGhhdCBvbmx5IHN0b3JlcyB0aGUgYWxwaGEgZGF0YS4KLXN0YXRpYyB2b2lkIEV4dHJhY3RBbHBoYVJvd3MoVlA4TERlY29kZXIqIGNvbnN0IGRlYywgaW50IHJvdykgewotICBjb25zdCBpbnQgbnVtX3Jvd3MgPSByb3cgLSBkZWMtPmxhc3Rfcm93XzsKLSAgY29uc3QgdWludDMyX3QqIGNvbnN0IGluID0gZGVjLT5waXhlbHNfICsgZGVjLT53aWR0aF8gKiBkZWMtPmxhc3Rfcm93XzsKLQotICBpZiAobnVtX3Jvd3MgPD0gMCkgcmV0dXJuOyAgLy8gTm90aGluZyB0byBiZSBkb25lLgotICBBcHBseUludmVyc2VUcmFuc2Zvcm1zKGRlYywgbnVtX3Jvd3MsIGluKTsKLQotICAvLyBFeHRyYWN0IGFscGhhICh3aGljaCBpcyBzdG9yZWQgaW4gdGhlIGdyZWVuIHBsYW5lKS4KLSAgewotICAgIGNvbnN0IGludCB3aWR0aCA9IGRlYy0+aW9fLT53aWR0aDsgICAgICAvLyB0aGUgZmluYWwgd2lkdGggKCE9IGRlYy0+d2lkdGhfKQotICAgIGNvbnN0IGludCBjYWNoZV9waXhzID0gd2lkdGggKiBudW1fcm93czsKLSAgICB1aW50OF90KiBjb25zdCBkc3QgPSAodWludDhfdCopZGVjLT5pb18tPm9wYXF1ZSArIHdpZHRoICogZGVjLT5sYXN0X3Jvd187Ci0gICAgY29uc3QgdWludDMyX3QqIGNvbnN0IHNyYyA9IGRlYy0+YXJnYl9jYWNoZV87Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGNhY2hlX3BpeHM7ICsraSkgZHN0W2ldID0gKHNyY1tpXSA+PiA4KSAmIDB4ZmY7Ci0gIH0KLSAgZGVjLT5sYXN0X3Jvd18gPSBkZWMtPmxhc3Rfb3V0X3Jvd18gPSByb3c7Ci19Ci0KLS8vIFJvdy1wcm9jZXNzaW5nIGZvciB0aGUgc3BlY2lhbCBjYXNlIHdoZW4gYWxwaGEgZGF0YSBjb250YWlucyBvbmx5IG9uZQotLy8gdHJhbnNmb3JtOiBjb2xvciBpbmRleGluZy4KLXN0YXRpYyB2b2lkIEV4dHJhY3RQYWxldHRlZEFscGhhUm93cyhWUDhMRGVjb2RlciogY29uc3QgZGVjLCBpbnQgcm93KSB7Ci0gIGNvbnN0IGludCBudW1fcm93cyA9IHJvdyAtIGRlYy0+bGFzdF9yb3dfOwotICBjb25zdCB1aW50OF90KiBjb25zdCBpbiA9Ci0gICAgICAodWludDhfdCopZGVjLT5waXhlbHNfICsgZGVjLT53aWR0aF8gKiBkZWMtPmxhc3Rfcm93XzsKLSAgaWYgKG51bV9yb3dzIDw9IDApIHJldHVybjsgIC8vIE5vdGhpbmcgdG8gYmUgZG9uZS4KLSAgQXBwbHlJbnZlcnNlVHJhbnNmb3Jtc0FscGhhKGRlYywgbnVtX3Jvd3MsIGluKTsKLSAgZGVjLT5sYXN0X3Jvd18gPSBkZWMtPmxhc3Rfb3V0X3Jvd18gPSByb3c7Ci19Ci0KLWludCBWUDhMRGVjb2RlQWxwaGFJbWFnZVN0cmVhbShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRhdGFfc2l6ZSwgdWludDhfdCogY29uc3Qgb3V0cHV0KSB7Ci0gIFZQOElvIGlvOwotICBpbnQgb2sgPSAwOwotICBWUDhMRGVjb2RlciogY29uc3QgZGVjID0gVlA4TE5ldygpOwotICBzaXplX3QgYnl0ZXNfcGVyX3BpeGVsID0gc2l6ZW9mKHVpbnQzMl90KTsgIC8vIERlZmF1bHQ6IEJHUkEgbW9kZS4KLSAgaWYgKGRlYyA9PSBOVUxMKSByZXR1cm4gMDsKLQotICBkZWMtPndpZHRoXyA9IHdpZHRoOwotICBkZWMtPmhlaWdodF8gPSBoZWlnaHQ7Ci0gIGRlYy0+aW9fID0gJmlvOwotCi0gIFZQOEluaXRJbygmaW8pOwotICBXZWJQSW5pdEN1c3RvbUlvKE5VTEwsICZpbyk7ICAgIC8vIEp1c3QgYSBzYW5pdHkgSW5pdC4gaW8gd29uJ3QgYmUgdXNlZC4KLSAgaW8ub3BhcXVlID0gb3V0cHV0OwotICBpby53aWR0aCA9IHdpZHRoOwotICBpby5oZWlnaHQgPSBoZWlnaHQ7Ci0KLSAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19PSzsKLSAgVlA4TEluaXRCaXRSZWFkZXIoJmRlYy0+YnJfLCBkYXRhLCBkYXRhX3NpemUpOwotCi0gIGRlYy0+YWN0aW9uXyA9IFJFQURfSERSOwotICBpZiAoIURlY29kZUltYWdlU3RyZWFtKHdpZHRoLCBoZWlnaHQsIDEsIGRlYywgTlVMTCkpIGdvdG8gRXJyOwotCi0gIC8vIFNwZWNpYWwgY2FzZTogaWYgYWxwaGEgZGF0YSB1c2VzIG9ubHkgdGhlIGNvbG9yIGluZGV4aW5nIHRyYW5zZm9ybSBhbmQKLSAgLy8gZG9lc24ndCB1c2UgY29sb3IgY2FjaGUgKGEgZnJlcXVlbnQgY2FzZSksIHdlIHdpbGwgdXNlIERlY29kZUFscGhhRGF0YSgpCi0gIC8vIG1ldGhvZCB0aGF0IG9ubHkgbmVlZHMgYWxsb2NhdGlvbiBvZiAxIGJ5dGUgcGVyIHBpeGVsIChhbHBoYSBjaGFubmVsKS4KLSAgaWYgKGRlYy0+bmV4dF90cmFuc2Zvcm1fID09IDEgJiYKLSAgICAgIGRlYy0+dHJhbnNmb3Jtc19bMF0udHlwZV8gPT0gQ09MT1JfSU5ERVhJTkdfVFJBTlNGT1JNICYmCi0gICAgICBkZWMtPmhkcl8uY29sb3JfY2FjaGVfc2l6ZV8gPT0gMCkgewotICAgIGJ5dGVzX3Blcl9waXhlbCA9IHNpemVvZih1aW50OF90KTsKLSAgfQotCi0gIC8vIEFsbG9jYXRlIGludGVybmFsIGJ1ZmZlcnMgKG5vdGUgdGhhdCBkZWMtPndpZHRoXyBtYXkgaGF2ZSBjaGFuZ2VkIGhlcmUpLgotICBpZiAoIUFsbG9jYXRlSW50ZXJuYWxCdWZmZXJzKGRlYywgd2lkdGgsIGJ5dGVzX3Blcl9waXhlbCkpIGdvdG8gRXJyOwotCi0gIC8vIERlY29kZSAod2l0aCBzcGVjaWFsIHJvdyBwcm9jZXNzaW5nKS4KLSAgZGVjLT5hY3Rpb25fID0gUkVBRF9EQVRBOwotICBvayA9IChieXRlc19wZXJfcGl4ZWwgPT0gc2l6ZW9mKHVpbnQ4X3QpKSA/Ci0gICAgICBEZWNvZGVBbHBoYURhdGEoZGVjLCAodWludDhfdCopZGVjLT5waXhlbHNfLCBkZWMtPndpZHRoXywgZGVjLT5oZWlnaHRfLAotICAgICAgICAgICAgICAgICAgICAgIEV4dHJhY3RQYWxldHRlZEFscGhhUm93cykgOgotICAgICAgRGVjb2RlSW1hZ2VEYXRhKGRlYywgZGVjLT5waXhlbHNfLCBkZWMtPndpZHRoXywgZGVjLT5oZWlnaHRfLAotICAgICAgICAgICAgICAgICAgICAgIEV4dHJhY3RBbHBoYVJvd3MpOwotCi0gRXJyOgotICBWUDhMRGVsZXRlKGRlYyk7Ci0gIHJldHVybiBvazsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotaW50IFZQOExEZWNvZGVIZWFkZXIoVlA4TERlY29kZXIqIGNvbnN0IGRlYywgVlA4SW8qIGNvbnN0IGlvKSB7Ci0gIGludCB3aWR0aCwgaGVpZ2h0LCBoYXNfYWxwaGE7Ci0KLSAgaWYgKGRlYyA9PSBOVUxMKSByZXR1cm4gMDsKLSAgaWYgKGlvID09IE5VTEwpIHsKLSAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX0lOVkFMSURfUEFSQU07Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBkZWMtPmlvXyA9IGlvOwotICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX09LOwotICBWUDhMSW5pdEJpdFJlYWRlcigmZGVjLT5icl8sIGlvLT5kYXRhLCBpby0+ZGF0YV9zaXplKTsKLSAgaWYgKCFSZWFkSW1hZ2VJbmZvKCZkZWMtPmJyXywgJndpZHRoLCAmaGVpZ2h0LCAmaGFzX2FscGhhKSkgewotICAgIGRlYy0+c3RhdHVzXyA9IFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SOwotICAgIGdvdG8gRXJyb3I7Ci0gIH0KLSAgZGVjLT5zdGF0ZV8gPSBSRUFEX0RJTTsKLSAgaW8tPndpZHRoID0gd2lkdGg7Ci0gIGlvLT5oZWlnaHQgPSBoZWlnaHQ7Ci0KLSAgZGVjLT5hY3Rpb25fID0gUkVBRF9IRFI7Ci0gIGlmICghRGVjb2RlSW1hZ2VTdHJlYW0od2lkdGgsIGhlaWdodCwgMSwgZGVjLCBOVUxMKSkgZ290byBFcnJvcjsKLSAgcmV0dXJuIDE7Ci0KLSBFcnJvcjoKLSAgVlA4TENsZWFyKGRlYyk7Ci0gIFNCX0RDSEVDSyhkZWMtPnN0YXR1c18gIT0gVlA4X1NUQVRVU19PSyk7Ci0gIHJldHVybiAwOwotfQotCi1pbnQgVlA4TERlY29kZUltYWdlKFZQOExEZWNvZGVyKiBjb25zdCBkZWMpIHsKLSAgY29uc3Qgc2l6ZV90IGJ5dGVzX3Blcl9waXhlbCA9IHNpemVvZih1aW50MzJfdCk7Ci0gIFZQOElvKiBpbyA9IE5VTEw7Ci0gIFdlYlBEZWNQYXJhbXMqIHBhcmFtcyA9IE5VTEw7Ci0KLSAgLy8gU2FuaXR5IGNoZWNrcy4KLSAgaWYgKGRlYyA9PSBOVUxMKSByZXR1cm4gMDsKLQotICBpbyA9IGRlYy0+aW9fOwotICBTQl9EQ0hFQ0soaW8gIT0gTlVMTCk7Ci0gIHBhcmFtcyA9IChXZWJQRGVjUGFyYW1zKilpby0+b3BhcXVlOwotICBTQl9EQ0hFQ0socGFyYW1zICE9IE5VTEwpOwotICBkZWMtPm91dHB1dF8gPSBwYXJhbXMtPm91dHB1dDsKLSAgU0JfRENIRUNLKGRlYy0+b3V0cHV0XyAhPSBOVUxMKTsKLQotICAvLyBJbml0aWFsaXphdGlvbi4KLSAgaWYgKCFXZWJQSW9Jbml0RnJvbU9wdGlvbnMocGFyYW1zLT5vcHRpb25zLCBpbywgTU9ERV9CR1JBKSkgewotICAgIGRlYy0+c3RhdHVzXyA9IFZQOF9TVEFUVVNfSU5WQUxJRF9QQVJBTTsKLSAgICBnb3RvIEVycjsKLSAgfQotCi0gIGlmICghQWxsb2NhdGVJbnRlcm5hbEJ1ZmZlcnMoZGVjLCBpby0+d2lkdGgsIGJ5dGVzX3Blcl9waXhlbCkpIGdvdG8gRXJyOwotCi0gIGlmIChpby0+dXNlX3NjYWxpbmcgJiYgIUFsbG9jYXRlQW5kSW5pdFJlc2NhbGVyKGRlYywgaW8pKSBnb3RvIEVycjsKLQotICAvLyBEZWNvZGUuCi0gIGRlYy0+YWN0aW9uXyA9IFJFQURfREFUQTsKLSAgaWYgKCFEZWNvZGVJbWFnZURhdGEoZGVjLCBkZWMtPnBpeGVsc18sIGRlYy0+d2lkdGhfLCBkZWMtPmhlaWdodF8sCi0gICAgICAgICAgICAgICAgICAgICAgIFByb2Nlc3NSb3dzKSkgewotICAgIGdvdG8gRXJyOwotICB9Ci0KLSAgLy8gQ2xlYW51cC4KLSAgcGFyYW1zLT5sYXN0X3kgPSBkZWMtPmxhc3Rfb3V0X3Jvd187Ci0gIFZQOExDbGVhcihkZWMpOwotICByZXR1cm4gMTsKLQotIEVycjoKLSAgVlA4TENsZWFyKGRlYyk7Ci0gIFNCX0RDSEVDSyhkZWMtPnN0YXR1c18gIT0gVlA4X1NUQVRVU19PSyk7Ci0gIHJldHVybiAwOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RlYy92cDhsaS5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL3ZwOGxpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZGQ5YzEuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL3ZwOGxpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIExvc3NsZXNzIGRlY29kZXI6IGludGVybmFsIGhlYWRlci4KLS8vCi0vLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQotLy8gICAgICAgICBWaWthcyBBcm9yYSh2aWthYXMuYXJvcmFAZ21haWwuY29tKQotCi0jaWZuZGVmIFdFQlBfREVDX1ZQOExJX0hfCi0jZGVmaW5lIFdFQlBfREVDX1ZQOExJX0hfCi0KLSNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCi0jZWxzZQotI2luY2x1ZGUgPHN0cmluZy5oPiAgICAgLy8gZm9yIG1lbWNweSgpCi0jZW5kaWYKLQotI2luY2x1ZGUgIi4vd2VicGkuaCIKLSNpbmNsdWRlICIuLi91dGlscy9iaXRfcmVhZGVyLmgiCi0jaW5jbHVkZSAiLi4vdXRpbHMvY29sb3JfY2FjaGUuaCIKLSNpbmNsdWRlICIuLi91dGlscy9odWZmbWFuLmgiCi0jaW5jbHVkZSAiLi4vd2VicC9mb3JtYXRfY29uc3RhbnRzLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi10eXBlZGVmIGVudW0gewotICBSRUFEX0RBVEEgPSAwLAotICBSRUFEX0hEUiA9IDEsCi0gIFJFQURfRElNID0gMgotfSBWUDhMRGVjb2RlU3RhdGU7Ci0KLXR5cGVkZWYgc3RydWN0IFZQOExUcmFuc2Zvcm0gVlA4TFRyYW5zZm9ybTsKLXN0cnVjdCBWUDhMVHJhbnNmb3JtIHsKLSAgVlA4TEltYWdlVHJhbnNmb3JtVHlwZSB0eXBlXzsgICAvLyB0cmFuc2Zvcm0gdHlwZS4KLSAgaW50ICAgICAgICAgICAgICAgICAgICBiaXRzXzsgICAvLyBzdWJzYW1wbGluZyBiaXRzIGRlZmluaW5nIHRyYW5zZm9ybSB3aW5kb3cuCi0gIGludCAgICAgICAgICAgICAgICAgICAgeHNpemVfOyAgLy8gdHJhbnNmb3JtIHdpbmRvdyBYIGluZGV4LgotICBpbnQgICAgICAgICAgICAgICAgICAgIHlzaXplXzsgIC8vIHRyYW5zZm9ybSB3aW5kb3cgWSBpbmRleC4KLSAgdWludDMyX3QgICAgICAgICAgICAgICpkYXRhXzsgICAvLyB0cmFuc2Zvcm0gZGF0YS4KLX07Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgSHVmZm1hblRyZWUgaHRyZWVzX1tIVUZGTUFOX0NPREVTX1BFUl9NRVRBX0NPREVdOwotfSBIVHJlZUdyb3VwOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGludCAgICAgICAgICAgICBjb2xvcl9jYWNoZV9zaXplXzsKLSAgVlA4TENvbG9yQ2FjaGUgIGNvbG9yX2NhY2hlXzsKLQotICBpbnQgICAgICAgICAgICAgaHVmZm1hbl9tYXNrXzsKLSAgaW50ICAgICAgICAgICAgIGh1ZmZtYW5fc3Vic2FtcGxlX2JpdHNfOwotICBpbnQgICAgICAgICAgICAgaHVmZm1hbl94c2l6ZV87Ci0gIHVpbnQzMl90ICAgICAgICpodWZmbWFuX2ltYWdlXzsKLSAgaW50ICAgICAgICAgICAgIG51bV9odHJlZV9ncm91cHNfOwotICBIVHJlZUdyb3VwICAgICAqaHRyZWVfZ3JvdXBzXzsKLX0gVlA4TE1ldGFkYXRhOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIFZQOFN0YXR1c0NvZGUgICAgc3RhdHVzXzsKLSAgVlA4TERlY29kZVN0YXRlICBhY3Rpb25fOwotICBWUDhMRGVjb2RlU3RhdGUgIHN0YXRlXzsKLSAgVlA4SW8gICAgICAgICAgICppb187Ci0KLSAgY29uc3QgV2ViUERlY0J1ZmZlciAqb3V0cHV0XzsgICAgLy8gc2hvcnRjdXQgdG8gaW8tPm9wYXF1ZS0+b3V0cHV0Ci0KLSAgdWludDMyX3QgICAgICAgICpwaXhlbHNfOyAgICAgICAgLy8gSW50ZXJuYWwgZGF0YTogZWl0aGVyIHVpbnQ4X3QqIGZvciBhbHBoYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciB1aW50MzJfdCogZm9yIEJHUkEuCi0gIHVpbnQzMl90ICAgICAgICAqYXJnYl9jYWNoZV87ICAgIC8vIFNjcmF0Y2ggYnVmZmVyIGZvciB0ZW1wb3JhcnkgQkdSQSBzdG9yYWdlLgotCi0gIFZQOExCaXRSZWFkZXIgICAgYnJfOwotCi0gIGludCAgICAgICAgICAgICAgd2lkdGhfOwotICBpbnQgICAgICAgICAgICAgIGhlaWdodF87Ci0gIGludCAgICAgICAgICAgICAgbGFzdF9yb3dfOyAgICAgIC8vIGxhc3QgaW5wdXQgcm93IGRlY29kZWQgc28gZmFyLgotICBpbnQgICAgICAgICAgICAgIGxhc3Rfb3V0X3Jvd187ICAvLyBsYXN0IHJvdyBvdXRwdXQgc28gZmFyLgotCi0gIFZQOExNZXRhZGF0YSAgICAgaGRyXzsKLQotICBpbnQgICAgICAgICAgICAgIG5leHRfdHJhbnNmb3JtXzsKLSAgVlA4TFRyYW5zZm9ybSAgICB0cmFuc2Zvcm1zX1tOVU1fVFJBTlNGT1JNU107Ci0gIC8vIG9yJ2QgYml0c2V0IHN0b3JpbmcgdGhlIHRyYW5zZm9ybXMgdHlwZXMuCi0gIHVpbnQzMl90ICAgICAgICAgdHJhbnNmb3Jtc19zZWVuXzsKLQotICB1aW50OF90ICAgICAgICAgKnJlc2NhbGVyX21lbW9yeTsgIC8vIFdvcmtpbmcgbWVtb3J5IGZvciByZXNjYWxpbmcgd29yay4KLSAgV2ViUFJlc2NhbGVyICAgICpyZXNjYWxlcjsgICAgICAgICAvLyBDb21tb24gcmVzY2FsZXIgZm9yIGFsbCBjaGFubmVscy4KLX0gVlA4TERlY29kZXI7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBpbnRlcm5hbCBmdW5jdGlvbnMuIE5vdCBwdWJsaWMuCi0KLS8vIGluIHZwOGwuYwotCi0vLyBEZWNvZGVzIGEgcmF3IGltYWdlIHN0cmVhbSAod2l0aG91dCBoZWFkZXIpIGFuZCBzdG9yZSB0aGUgYWxwaGEgZGF0YQotLy8gaW50byAqb3V0cHV0LCB3aGljaCBtdXN0IGJlIG9mIHNpemUgd2lkdGggeCBoZWlnaHQuIFJldHVybnMgZmFsc2UgaW4gY2FzZQotLy8gb2YgZXJyb3IuCi1pbnQgVlA4TERlY29kZUFscGhhSW1hZ2VTdHJlYW0oaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkYXRhX3NpemUsIHVpbnQ4X3QqIGNvbnN0IG91dHB1dCk7Ci0KLS8vIEFsbG9jYXRlcyBhbmQgaW5pdGlhbGl6ZSBhIG5ldyBsb3NzbGVzcyBkZWNvZGVyIGluc3RhbmNlLgotVlA4TERlY29kZXIqIFZQOExOZXcodm9pZCk7Ci0KLS8vIERlY29kZXMgdGhlIGltYWdlIGhlYWRlci4gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIGVycm9yLgotaW50IFZQOExEZWNvZGVIZWFkZXIoVlA4TERlY29kZXIqIGNvbnN0IGRlYywgVlA4SW8qIGNvbnN0IGlvKTsKLQotLy8gRGVjb2RlcyBhbiBpbWFnZS4gSXQncyByZXF1aXJlZCB0byBkZWNvZGUgdGhlIGxvc3NsZXNzIGhlYWRlciBiZWZvcmUgY2FsbGluZwotLy8gdGhpcyBmdW5jdGlvbi4gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIGVycm9yLCB3aXRoIHVwZGF0ZWQgZGVjLT5zdGF0dXNfLgotaW50IFZQOExEZWNvZGVJbWFnZShWUDhMRGVjb2RlciogY29uc3QgZGVjKTsKLQotLy8gUmVzZXRzIHRoZSBkZWNvZGVyIGluIGl0cyBpbml0aWFsIHN0YXRlLCByZWNsYWltaW5nIG1lbW9yeS4KLS8vIFByZXNlcnZlcyB0aGUgZGVjLT5zdGF0dXNfIHZhbHVlLgotdm9pZCBWUDhMQ2xlYXIoVlA4TERlY29kZXIqIGNvbnN0IGRlYyk7Ci0KLS8vIENsZWFycyBhbmQgZGVhbGxvY2F0ZSBhIGxvc3NsZXNzIGRlY29kZXIgaW5zdGFuY2UuCi12b2lkIFZQOExEZWxldGUoVlA4TERlY29kZXIqIGNvbnN0IGRlYyk7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgotCi0jZW5kaWYgIC8qIFdFQlBfREVDX1ZQOExJX0hfICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kZWMvd2VicC5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL3dlYnAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM2NGFiOC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kZWMvd2VicC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzk2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDEwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBNYWluIGRlY29kaW5nIGZ1bmN0aW9ucyBmb3IgV0VCUCBpbWFnZXMuCi0vLwotLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKLQotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCi0jZWxzZQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICIuL3ZwOGkuaCIKLSNpbmNsdWRlICIuL3ZwOGxpLmgiCi0jaW5jbHVkZSAiLi93ZWJwaS5oIgotI2luY2x1ZGUgIi4uL3dlYnAvbXV4X3R5cGVzLmgiICAvLyBBTFBIQV9GTEFHCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gUklGRiBsYXlvdXQgaXM6Ci0vLyAgIE9mZnNldCAgdGFnCi0vLyAgIDAuLi4zICAgIlJJRkYiIDQtYnl0ZSB0YWcKLS8vICAgNC4uLjcgICBzaXplIG9mIGltYWdlIGRhdGEgKGluY2x1ZGluZyBtZXRhZGF0YSkgc3RhcnRpbmcgYXQgb2Zmc2V0IDgKLS8vICAgOC4uLjExICAiV0VCUCIgICBvdXIgZm9ybS10eXBlIHNpZ25hdHVyZQotLy8gVGhlIFJJRkYgY29udGFpbmVyICgxMiBieXRlcykgaXMgZm9sbG93ZWQgYnkgYXBwcm9wcmlhdGUgY2h1bmtzOgotLy8gICAxMi4uMTUgICJWUDggIjogNC1ieXRlcyB0YWdzLCBzaWduYWxpbmcgdGhlIHVzZSBvZiBWUDggdmlkZW8gZm9ybWF0Ci0vLyAgIDE2Li4xOSAgc2l6ZSBvZiB0aGUgcmF3IFZQOCBpbWFnZSBkYXRhLCBzdGFydGluZyBhdCBvZmZzZXQgMjAKLS8vICAgMjAuLi4uICB0aGUgVlA4IGJ5dGVzCi0vLyBPciwKLS8vICAgMTIuLjE1ICAiVlA4TCI6IDQtYnl0ZXMgdGFncywgc2lnbmFsaW5nIHRoZSB1c2Ugb2YgVlA4TCBsb3NzbGVzcyBmb3JtYXQKLS8vICAgMTYuLjE5ICBzaXplIG9mIHRoZSByYXcgVlA4TCBpbWFnZSBkYXRhLCBzdGFydGluZyBhdCBvZmZzZXQgMjAKLS8vICAgMjAuLi4uICB0aGUgVlA4TCBieXRlcwotLy8gT3IsCi0vLyAgIDEyLi4xNSAgIlZQOFgiOiA0LWJ5dGVzIHRhZ3MsIGRlc2NyaWJpbmcgdGhlIGV4dGVuZGVkLVZQOCBjaHVuay4KLS8vICAgMTYuLjE5ICBzaXplIG9mIHRoZSBWUDhYIGNodW5rIHN0YXJ0aW5nIGF0IG9mZnNldCAyMC4KLS8vICAgMjAuLjIzICBWUDhYIGZsYWdzIGJpdC1tYXAgY29ycmVzcG9uZGluZyB0byB0aGUgY2h1bmstdHlwZXMgcHJlc2VudC4KLS8vICAgMjQuLjI2ICBXaWR0aCBvZiB0aGUgQ2FudmFzIEltYWdlLgotLy8gICAyNy4uMjkgIEhlaWdodCBvZiB0aGUgQ2FudmFzIEltYWdlLgotLy8gVGhlcmUgY2FuIGJlIGV4dHJhIGNodW5rcyBhZnRlciB0aGUgIlZQOFgiIGNodW5rIChJQ0NQLCBGUkdNLCBBTk1GLCBWUDgsCi0vLyBWUDhMLCBYTVAsIEVYSUYgIC4uLikKLS8vIEFsbCBzaXplcyBhcmUgaW4gbGl0dGxlLWVuZGlhbiBvcmRlci4KLS8vIE5vdGU6IGNodW5rIGRhdGEgc2l6ZSBtdXN0IGJlIHBhZGRlZCB0byBtdWx0aXBsZSBvZiAyIHdoZW4gd3JpdHRlbi4KLQotc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IGdldF9sZTI0KGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEpIHsKLSAgcmV0dXJuIGRhdGFbMF0gfCAoZGF0YVsxXSA8PCA4KSB8IChkYXRhWzJdIDw8IDE2KTsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IGdldF9sZTMyKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEpIHsKLSAgcmV0dXJuICh1aW50MzJfdClnZXRfbGUyNChkYXRhKSB8IChkYXRhWzNdIDw8IDI0KTsKLX0KLQotLy8gVmFsaWRhdGVzIHRoZSBSSUZGIGNvbnRhaW5lciAoaWYgZGV0ZWN0ZWQpIGFuZCBza2lwcyBvdmVyIGl0LgotLy8gSWYgYSBSSUZGIGNvbnRhaW5lciBpcyBkZXRlY3RlZCwKLS8vIFJldHVybnMgVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1IgZm9yIGludmFsaWQgaGVhZGVyLCBhbmQKLS8vICAgICAgICAgVlA4X1NUQVRVU19PSyBvdGhlcndpc2UuCi0vLyBJbiBjYXNlIHRoZXJlIGFyZSBub3QgZW5vdWdoIGJ5dGVzIChwYXJ0aWFsIFJJRkYgY29udGFpbmVyKSwgcmV0dXJuIDAgZm9yCi0vLyAqcmlmZl9zaXplLiBFbHNlIHJldHVybiB0aGUgUklGRiBzaXplIGV4dHJhY3RlZCBmcm9tIHRoZSBoZWFkZXIuCi1zdGF0aWMgVlA4U3RhdHVzQ29kZSBQYXJzZVJJRkYoY29uc3QgdWludDhfdCoqIGNvbnN0IGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBjb25zdCBkYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBjb25zdCByaWZmX3NpemUpIHsKLSAgU0JfRENIRUNLKGRhdGEgIT0gTlVMTCk7Ci0gIFNCX0RDSEVDSyhkYXRhX3NpemUgIT0gTlVMTCk7Ci0gIFNCX0RDSEVDSyhyaWZmX3NpemUgIT0gTlVMTCk7Ci0KLSAgKnJpZmZfc2l6ZSA9IDA7ICAvLyBEZWZhdWx0OiBubyBSSUZGIHByZXNlbnQuCi0gIGlmICgqZGF0YV9zaXplID49IFJJRkZfSEVBREVSX1NJWkUgJiYgIVNiTWVtb3J5Q29tcGFyZSgqZGF0YSwgIlJJRkYiLCBUQUdfU0laRSkpIHsKLSAgICBpZiAoU2JNZW1vcnlDb21wYXJlKCpkYXRhICsgOCwgIldFQlAiLCBUQUdfU0laRSkpIHsKLSAgICAgIHJldHVybiBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUjsgIC8vIFdyb25nIGltYWdlIGZpbGUgc2lnbmF0dXJlLgotICAgIH0gZWxzZSB7Ci0gICAgICBjb25zdCB1aW50MzJfdCBzaXplID0gZ2V0X2xlMzIoKmRhdGEgKyBUQUdfU0laRSk7Ci0gICAgICAvLyBDaGVjayB0aGF0IHdlIGhhdmUgYXQgbGVhc3Qgb25lIGNodW5rIChpLmUgIldFQlAiICsgIlZQOD9ubm5uIikuCi0gICAgICBpZiAoc2l6ZSA8IFRBR19TSVpFICsgQ0hVTktfSEVBREVSX1NJWkUpIHsKLSAgICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SOwotICAgICAgfQotICAgICAgaWYgKHNpemUgPiBNQVhfQ0hVTktfUEFZTE9BRCkgewotICAgICAgICByZXR1cm4gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7Ci0gICAgICB9Ci0gICAgICAvLyBXZSBoYXZlIGEgUklGRiBjb250YWluZXIuIFNraXAgaXQuCi0gICAgICAqcmlmZl9zaXplID0gc2l6ZTsKLSAgICAgICpkYXRhICs9IFJJRkZfSEVBREVSX1NJWkU7Ci0gICAgICAqZGF0YV9zaXplIC09IFJJRkZfSEVBREVSX1NJWkU7Ci0gICAgfQotICB9Ci0gIHJldHVybiBWUDhfU1RBVFVTX09LOwotfQotCi0vLyBWYWxpZGF0ZXMgdGhlIFZQOFggaGVhZGVyIGFuZCBza2lwcyBvdmVyIGl0LgotLy8gUmV0dXJucyBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUiBmb3IgaW52YWxpZCBWUDhYIGhlYWRlciwKLS8vICAgICAgICAgVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEEgaW4gY2FzZSBvZiBpbnN1ZmZpY2llbnQgZGF0YSwgYW5kCi0vLyAgICAgICAgIFZQOF9TVEFUVVNfT0sgb3RoZXJ3aXNlLgotLy8gSWYgYSBWUDhYIGNodW5rIGlzIGZvdW5kLCBmb3VuZF92cDh4IGlzIHNldCB0byB0cnVlIGFuZCAqd2lkdGhfcHRyLAotLy8gKmhlaWdodF9wdHIgYW5kICpmbGFnc19wdHIgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZXMgZXh0cmFjdGVkCi0vLyBmcm9tIHRoZSBWUDhYIGNodW5rLgotc3RhdGljIFZQOFN0YXR1c0NvZGUgUGFyc2VWUDhYKGNvbnN0IHVpbnQ4X3QqKiBjb25zdCBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogY29uc3QgZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgZm91bmRfdnA4eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IHdpZHRoX3B0ciwgaW50KiBjb25zdCBoZWlnaHRfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBjb25zdCBmbGFnc19wdHIpIHsKLSAgY29uc3QgdWludDMyX3QgdnA4eF9zaXplID0gQ0hVTktfSEVBREVSX1NJWkUgKyBWUDhYX0NIVU5LX1NJWkU7Ci0gIFNCX0RDSEVDSyhkYXRhICE9IE5VTEwpOwotICBTQl9EQ0hFQ0soZGF0YV9zaXplICE9IE5VTEwpOwotICBTQl9EQ0hFQ0soZm91bmRfdnA4eCAhPSBOVUxMKTsKLQotICAqZm91bmRfdnA4eCA9IDA7Ci0KLSAgaWYgKCpkYXRhX3NpemUgPCBDSFVOS19IRUFERVJfU0laRSkgewotICAgIHJldHVybiBWUDhfU1RBVFVTX05PVF9FTk9VR0hfREFUQTsgIC8vIEluc3VmZmljaWVudCBkYXRhLgotICB9Ci0KLSAgaWYgKCFTYk1lbW9yeUNvbXBhcmUoKmRhdGEsICJWUDhYIiwgVEFHX1NJWkUpKSB7Ci0gICAgaW50IHdpZHRoLCBoZWlnaHQ7Ci0gICAgdWludDMyX3QgZmxhZ3M7Ci0gICAgY29uc3QgdWludDMyX3QgY2h1bmtfc2l6ZSA9IGdldF9sZTMyKCpkYXRhICsgVEFHX1NJWkUpOwotICAgIGlmIChjaHVua19zaXplICE9IFZQOFhfQ0hVTktfU0laRSkgewotICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SOyAgLy8gV3JvbmcgY2h1bmsgc2l6ZS4KLSAgICB9Ci0KLSAgICAvLyBWZXJpZnkgaWYgZW5vdWdoIGRhdGEgaXMgYXZhaWxhYmxlIHRvIHZhbGlkYXRlIHRoZSBWUDhYIGNodW5rLgotICAgIGlmICgqZGF0YV9zaXplIDwgdnA4eF9zaXplKSB7Ci0gICAgICByZXR1cm4gVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEE7ICAvLyBJbnN1ZmZpY2llbnQgZGF0YS4KLSAgICB9Ci0gICAgZmxhZ3MgPSBnZXRfbGUzMigqZGF0YSArIDgpOwotICAgIHdpZHRoID0gMSArIGdldF9sZTI0KCpkYXRhICsgMTIpOwotICAgIGhlaWdodCA9IDEgKyBnZXRfbGUyNCgqZGF0YSArIDE1KTsKLSAgICBpZiAod2lkdGggKiAodWludDY0X3QpaGVpZ2h0ID49IE1BWF9JTUFHRV9BUkVBKSB7Ci0gICAgICByZXR1cm4gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7ICAvLyBpbWFnZSBpcyB0b28gbGFyZ2UKLSAgICB9Ci0KLSAgICBpZiAoZmxhZ3NfcHRyICE9IE5VTEwpICpmbGFnc19wdHIgPSBmbGFnczsKLSAgICBpZiAod2lkdGhfcHRyICE9IE5VTEwpICp3aWR0aF9wdHIgPSB3aWR0aDsKLSAgICBpZiAoaGVpZ2h0X3B0ciAhPSBOVUxMKSAqaGVpZ2h0X3B0ciA9IGhlaWdodDsKLSAgICAvLyBTa2lwIG92ZXIgVlA4WCBoZWFkZXIgYnl0ZXMuCi0gICAgKmRhdGEgKz0gdnA4eF9zaXplOwotICAgICpkYXRhX3NpemUgLT0gdnA4eF9zaXplOwotICAgICpmb3VuZF92cDh4ID0gMTsKLSAgfQotICByZXR1cm4gVlA4X1NUQVRVU19PSzsKLX0KLQotLy8gU2tpcHMgdG8gdGhlIG5leHQgVlA4L1ZQOEwgY2h1bmsgaGVhZGVyIGluIHRoZSBkYXRhIGdpdmVuIHRoZSBzaXplIG9mIHRoZQotLy8gUklGRiBjaHVuayAncmlmZl9zaXplJy4KLS8vIFJldHVybnMgVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1IgaWYgYW55IGludmFsaWQgY2h1bmsgc2l6ZSBpcyBlbmNvdW50ZXJlZCwKLS8vICAgICAgICAgVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEEgaW4gY2FzZSBvZiBpbnN1ZmZpY2llbnQgZGF0YSwgYW5kCi0vLyAgICAgICAgIFZQOF9TVEFUVVNfT0sgb3RoZXJ3aXNlLgotLy8gSWYgYW4gYWxwaGEgY2h1bmsgaXMgZm91bmQsICphbHBoYV9kYXRhIGFuZCAqYWxwaGFfc2l6ZSBhcmUgc2V0Ci0vLyBhcHByb3ByaWF0ZWx5Lgotc3RhdGljIFZQOFN0YXR1c0NvZGUgUGFyc2VPcHRpb25hbENodW5rcyhjb25zdCB1aW50OF90KiogY29uc3QgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBjb25zdCBkYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjb25zdCByaWZmX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqKiBjb25zdCBhbHBoYV9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIGNvbnN0IGFscGhhX3NpemUpIHsKLSAgY29uc3QgdWludDhfdCogYnVmOwotICBzaXplX3QgYnVmX3NpemU7Ci0gIHVpbnQzMl90IHRvdGFsX3NpemUgPSBUQUdfU0laRSArICAgICAgICAgICAvLyAiV0VCUCIuCi0gICAgICAgICAgICAgICAgICAgICAgICBDSFVOS19IRUFERVJfU0laRSArICAvLyAiVlA4WG5ubm4iLgotICAgICAgICAgICAgICAgICAgICAgICAgVlA4WF9DSFVOS19TSVpFOyAgICAgLy8gZGF0YS4KLSAgU0JfRENIRUNLKGRhdGEgIT0gTlVMTCk7Ci0gIFNCX0RDSEVDSyhkYXRhX3NpemUgIT0gTlVMTCk7Ci0gIGJ1ZiA9ICpkYXRhOwotICBidWZfc2l6ZSA9ICpkYXRhX3NpemU7Ci0KLSAgU0JfRENIRUNLKGFscGhhX2RhdGEgIT0gTlVMTCk7Ci0gIFNCX0RDSEVDSyhhbHBoYV9zaXplICE9IE5VTEwpOwotICAqYWxwaGFfZGF0YSA9IE5VTEw7Ci0gICphbHBoYV9zaXplID0gMDsKLQotICB3aGlsZSAoMSkgewotICAgIHVpbnQzMl90IGNodW5rX3NpemU7Ci0gICAgdWludDMyX3QgZGlza19jaHVua19zaXplOyAgIC8vIGNodW5rX3NpemUgd2l0aCBwYWRkaW5nCi0KLSAgICAqZGF0YSA9IGJ1ZjsKLSAgICAqZGF0YV9zaXplID0gYnVmX3NpemU7Ci0KLSAgICBpZiAoYnVmX3NpemUgPCBDSFVOS19IRUFERVJfU0laRSkgeyAgLy8gSW5zdWZmaWNpZW50IGRhdGEuCi0gICAgICByZXR1cm4gVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEE7Ci0gICAgfQotCi0gICAgY2h1bmtfc2l6ZSA9IGdldF9sZTMyKGJ1ZiArIFRBR19TSVpFKTsKLSAgICBpZiAoY2h1bmtfc2l6ZSA+IE1BWF9DSFVOS19QQVlMT0FEKSB7Ci0gICAgICByZXR1cm4gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7ICAgICAgICAgIC8vIE5vdCBhIHZhbGlkIGNodW5rIHNpemUuCi0gICAgfQotICAgIC8vIEZvciBvZGQtc2l6ZWQgY2h1bmstcGF5bG9hZCwgdGhlcmUncyBvbmUgYnl0ZSBwYWRkaW5nIGF0IHRoZSBlbmQuCi0gICAgZGlza19jaHVua19zaXplID0gKENIVU5LX0hFQURFUl9TSVpFICsgY2h1bmtfc2l6ZSArIDEpICYgfjE7Ci0gICAgdG90YWxfc2l6ZSArPSBkaXNrX2NodW5rX3NpemU7Ci0KLSAgICAvLyBDaGVjayB0aGF0IHRvdGFsIGJ5dGVzIHNraXBwZWQgc28gZmFyIGRvZXMgbm90IGV4Y2VlZCByaWZmX3NpemUuCi0gICAgaWYgKHJpZmZfc2l6ZSA+IDAgJiYgKHRvdGFsX3NpemUgPiByaWZmX3NpemUpKSB7Ci0gICAgICByZXR1cm4gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7ICAgICAgICAgIC8vIE5vdCBhIHZhbGlkIGNodW5rIHNpemUuCi0gICAgfQotCi0gICAgLy8gU3RhcnQgb2YgYSAocG9zc2libHkgaW5jb21wbGV0ZSkgVlA4L1ZQOEwgY2h1bmsgaW1wbGllcyB0aGF0IHdlIGhhdmUKLSAgICAvLyBwYXJzZWQgYWxsIHRoZSBvcHRpb25hbCBjaHVua3MuCi0gICAgLy8gTm90ZTogVGhpcyBjaGVjayBtdXN0IG9jY3VyIGJlZm9yZSB0aGUgY2hlY2sgJ2J1Zl9zaXplIDwgZGlza19jaHVua19zaXplJwotICAgIC8vIGJlbG93IHRvIGFsbG93IGluY29tcGxldGUgVlA4L1ZQOEwgY2h1bmtzLgotICAgIGlmICghU2JNZW1vcnlDb21wYXJlKGJ1ZiwgIlZQOCAiLCBUQUdfU0laRSkgfHwKLSAgICAgICAgIVNiTWVtb3J5Q29tcGFyZShidWYsICJWUDhMIiwgVEFHX1NJWkUpKSB7Ci0gICAgICByZXR1cm4gVlA4X1NUQVRVU19PSzsKLSAgICB9Ci0KLSAgICBpZiAoYnVmX3NpemUgPCBkaXNrX2NodW5rX3NpemUpIHsgICAgICAgICAgICAgLy8gSW5zdWZmaWNpZW50IGRhdGEuCi0gICAgICByZXR1cm4gVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEE7Ci0gICAgfQotCi0gICAgaWYgKCFTYk1lbW9yeUNvbXBhcmUoYnVmLCAiQUxQSCIsIFRBR19TSVpFKSkgeyAgICAgICAgIC8vIEEgdmFsaWQgQUxQSCBoZWFkZXIuCi0gICAgICAqYWxwaGFfZGF0YSA9IGJ1ZiArIENIVU5LX0hFQURFUl9TSVpFOwotICAgICAgKmFscGhhX3NpemUgPSBjaHVua19zaXplOwotICAgIH0KLQotICAgIC8vIFdlIGhhdmUgYSBmdWxsIGFuZCB2YWxpZCBjaHVuazsgc2tpcCBpdC4KLSAgICBidWYgKz0gZGlza19jaHVua19zaXplOwotICAgIGJ1Zl9zaXplIC09IGRpc2tfY2h1bmtfc2l6ZTsKLSAgfQotfQotCi0vLyBWYWxpZGF0ZXMgdGhlIFZQOC9WUDhMIEhlYWRlciAoIlZQOCBubm5uIiBvciAiVlA4TCBubm5uIikgYW5kIHNraXBzIG92ZXIgaXQuCi0vLyBSZXR1cm5zIFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SIGZvciBpbnZhbGlkIChjaHVuayBsYXJnZXIgdGhhbgotLy8gICAgICAgICByaWZmX3NpemUpIFZQOC9WUDhMIGhlYWRlciwKLS8vICAgICAgICAgVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEEgaW4gY2FzZSBvZiBpbnN1ZmZpY2llbnQgZGF0YSwgYW5kCi0vLyAgICAgICAgIFZQOF9TVEFUVVNfT0sgb3RoZXJ3aXNlLgotLy8gSWYgYSBWUDgvVlA4TCBjaHVuayBpcyBmb3VuZCwgKmNodW5rX3NpemUgaXMgc2V0IHRvIHRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMKLS8vIGV4dHJhY3RlZCBmcm9tIHRoZSBWUDgvVlA4TCBjaHVuayBoZWFkZXIuCi0vLyBUaGUgZmxhZyAnKmlzX2xvc3NsZXNzJyBpcyBzZXQgdG8gMSBpbiBjYXNlIG9mIFZQOEwgY2h1bmsgLyByYXcgVlA4TCBkYXRhLgotc3RhdGljIFZQOFN0YXR1c0NvZGUgUGFyc2VWUDhIZWFkZXIoY29uc3QgdWludDhfdCoqIGNvbnN0IGRhdGFfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBjb25zdCBkYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcmlmZl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBjb25zdCBjaHVua19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBpc19sb3NzbGVzcykgewotICBjb25zdCB1aW50OF90KiBjb25zdCBkYXRhID0gKmRhdGFfcHRyOwotICBjb25zdCBpbnQgaXNfdnA4ID0gIVNiTWVtb3J5Q29tcGFyZShkYXRhLCAiVlA4ICIsIFRBR19TSVpFKTsKLSAgY29uc3QgaW50IGlzX3ZwOGwgPSAhU2JNZW1vcnlDb21wYXJlKGRhdGEsICJWUDhMIiwgVEFHX1NJWkUpOwotICBjb25zdCB1aW50MzJfdCBtaW5pbWFsX3NpemUgPQotICAgICAgVEFHX1NJWkUgKyBDSFVOS19IRUFERVJfU0laRTsgIC8vICJXRUJQIiArICJWUDggbm5ubiIgT1IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAiV0VCUCIgKyAiVlA4TG5ubm4iCi0gIFNCX0RDSEVDSyhkYXRhICE9IE5VTEwpOwotICBTQl9EQ0hFQ0soZGF0YV9zaXplICE9IE5VTEwpOwotICBTQl9EQ0hFQ0soY2h1bmtfc2l6ZSAhPSBOVUxMKTsKLSAgU0JfRENIRUNLKGlzX2xvc3NsZXNzICE9IE5VTEwpOwotCi0gIGlmICgqZGF0YV9zaXplIDwgQ0hVTktfSEVBREVSX1NJWkUpIHsKLSAgICByZXR1cm4gVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEE7ICAvLyBJbnN1ZmZpY2llbnQgZGF0YS4KLSAgfQotCi0gIGlmIChpc192cDggfHwgaXNfdnA4bCkgewotICAgIC8vIEJpdHN0cmVhbSBjb250YWlucyBWUDgvVlA4TCBoZWFkZXIuCi0gICAgY29uc3QgdWludDMyX3Qgc2l6ZSA9IGdldF9sZTMyKGRhdGEgKyBUQUdfU0laRSk7Ci0gICAgaWYgKChyaWZmX3NpemUgPj0gbWluaW1hbF9zaXplKSAmJiAoc2l6ZSA+IHJpZmZfc2l6ZSAtIG1pbmltYWxfc2l6ZSkpIHsKLSAgICAgIHJldHVybiBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUjsgIC8vIEluY29uc2lzdGVudCBzaXplIGluZm9ybWF0aW9uLgotICAgIH0KLSAgICAvLyBTa2lwIG92ZXIgQ0hVTktfSEVBREVSX1NJWkUgYnl0ZXMgZnJvbSBWUDgvVlA4TCBIZWFkZXIuCi0gICAgKmNodW5rX3NpemUgPSBzaXplOwotICAgICpkYXRhX3B0ciArPSBDSFVOS19IRUFERVJfU0laRTsKLSAgICAqZGF0YV9zaXplIC09IENIVU5LX0hFQURFUl9TSVpFOwotICAgICppc19sb3NzbGVzcyA9IGlzX3ZwOGw7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gUmF3IFZQOC9WUDhMIGJpdHN0cmVhbSAobm8gaGVhZGVyKS4KLSAgICAqaXNfbG9zc2xlc3MgPSBWUDhMQ2hlY2tTaWduYXR1cmUoZGF0YSwgKmRhdGFfc2l6ZSk7Ci0gICAgKmNodW5rX3NpemUgPSAqZGF0YV9zaXplOwotICB9Ci0KLSAgcmV0dXJuIFZQOF9TVEFUVVNfT0s7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIEZldGNoICcqd2lkdGgnLCAnKmhlaWdodCcsICcqaGFzX2FscGhhJyBhbmQgZmlsbCBvdXQgJ2hlYWRlcnMnIGJhc2VkIG9uCi0vLyAnZGF0YScuIEFsbCB0aGUgb3V0cHV0IHBhcmFtZXRlcnMgbWF5IGJlIE5VTEwuIElmICdoZWFkZXJzJyBpcyBOVUxMIG9ubHkgdGhlCi0vLyBtaW5pbWFsIGFtb3VudCB3aWxsIGJlIHJlYWQgdG8gZmV0Y2ggdGhlIHJlbWFpbmluZyBwYXJhbWV0ZXJzLgotLy8gSWYgJ2hlYWRlcnMnIGlzIG5vbi1OVUxMIHRoaXMgZnVuY3Rpb24gd2lsbCBhdHRlbXB0IHRvIGxvY2F0ZSBib3RoIGFscGhhCi0vLyBkYXRhICh3aXRoIG9yIHdpdGhvdXQgYSBWUDhYIGNodW5rKSBhbmQgdGhlIGJpdHN0cmVhbSBjaHVuayAoVlA4L1ZQOEwpLgotLy8gTm90ZTogVGhlIGZvbGxvd2luZyBjaHVuayBzZXF1ZW5jZXMgKGJlZm9yZSB0aGUgcmF3IFZQOC9WUDhMIGRhdGEpIGFyZQotLy8gY29uc2lkZXJlZCB2YWxpZCBieSB0aGlzIGZ1bmN0aW9uOgotLy8gUklGRiArIFZQOChMKQotLy8gUklGRiArIFZQOFggKyAob3B0aW9uYWwgY2h1bmtzKSArIFZQOChMKQotLy8gQUxQSCArIFZQOCA8LS0gTm90IGEgdmFsaWQgV2ViUCBmb3JtYXQ6IG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJuYWwgcHVycG9zZS4KLS8vIFZQOChMKSAgICAgPC0tIE5vdCBhIHZhbGlkIFdlYlAgZm9ybWF0OiBvbmx5IGFsbG93ZWQgZm9yIGludGVybmFsIHB1cnBvc2UuCi1zdGF0aWMgVlA4U3RhdHVzQ29kZSBQYXJzZUhlYWRlcnNJbnRlcm5hbChjb25zdCB1aW50OF90KiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3Qgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgaGFzX2FscGhhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBoYXNfYW5pbWF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUEhlYWRlclN0cnVjdHVyZSogY29uc3QgaGVhZGVycykgewotICBpbnQgZm91bmRfcmlmZiA9IDA7Ci0gIGludCBmb3VuZF92cDh4ID0gMDsKLSAgVlA4U3RhdHVzQ29kZSBzdGF0dXM7Ci0gIFdlYlBIZWFkZXJTdHJ1Y3R1cmUgaGRyczsKLQotICBpZiAoZGF0YSA9PSBOVUxMIHx8IGRhdGFfc2l6ZSA8IFJJRkZfSEVBREVSX1NJWkUpIHsKLSAgICByZXR1cm4gVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEE7Ci0gIH0KLSAgU2JNZW1vcnlTZXQoJmhkcnMsIDAsIHNpemVvZihoZHJzKSk7Ci0gIGhkcnMuZGF0YSA9IGRhdGE7Ci0gIGhkcnMuZGF0YV9zaXplID0gZGF0YV9zaXplOwotCi0gIC8vIFNraXAgb3ZlciBSSUZGIGhlYWRlci4KLSAgc3RhdHVzID0gUGFyc2VSSUZGKCZkYXRhLCAmZGF0YV9zaXplLCAmaGRycy5yaWZmX3NpemUpOwotICBpZiAoc3RhdHVzICE9IFZQOF9TVEFUVVNfT0spIHsKLSAgICByZXR1cm4gc3RhdHVzOyAgIC8vIFdyb25nIFJJRkYgaGVhZGVyIC8gaW5zdWZmaWNpZW50IGRhdGEuCi0gIH0KLSAgZm91bmRfcmlmZiA9IChoZHJzLnJpZmZfc2l6ZSA+IDApOwotCi0gIC8vIFNraXAgb3ZlciBWUDhYLgotICB7Ci0gICAgdWludDMyX3QgZmxhZ3MgPSAwOwotICAgIHN0YXR1cyA9IFBhcnNlVlA4WCgmZGF0YSwgJmRhdGFfc2l6ZSwgJmZvdW5kX3ZwOHgsIHdpZHRoLCBoZWlnaHQsICZmbGFncyk7Ci0gICAgaWYgKHN0YXR1cyAhPSBWUDhfU1RBVFVTX09LKSB7Ci0gICAgICByZXR1cm4gc3RhdHVzOyAgLy8gV3JvbmcgVlA4WCAvIGluc3VmZmljaWVudCBkYXRhLgotICAgIH0KLSAgICBpZiAoIWZvdW5kX3JpZmYgJiYgZm91bmRfdnA4eCkgewotICAgICAgLy8gTm90ZTogVGhpcyByZXN0cmljdGlvbiBtYXkgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLCBpZiBpdCBiZWNvbWVzCi0gICAgICAvLyBuZWNlc3NhcnkgdG8gc2VuZCBWUDhYIGNodW5rIHRvIHRoZSBkZWNvZGVyLgotICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SOwotICAgIH0KLSAgICBpZiAoaGFzX2FscGhhICE9IE5VTEwpICpoYXNfYWxwaGEgPSAhIShmbGFncyAmIEFMUEhBX0ZMQUcpOwotICAgIGlmIChoYXNfYW5pbWF0aW9uICE9IE5VTEwpICpoYXNfYW5pbWF0aW9uID0gISEoZmxhZ3MgJiBBTklNQVRJT05fRkxBRyk7Ci0gICAgaWYgKGZvdW5kX3ZwOHggJiYgaGVhZGVycyA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gVlA4X1NUQVRVU19PSzsgIC8vIFJldHVybiBmZWF0dXJlcyBmcm9tIFZQOFggaGVhZGVyLgotICAgIH0KLSAgfQotCi0gIGlmIChkYXRhX3NpemUgPCBUQUdfU0laRSkgcmV0dXJuIFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBOwotCi0gIC8vIFNraXAgb3ZlciBvcHRpb25hbCBjaHVua3MgaWYgZGF0YSBzdGFydGVkIHdpdGggIlJJRkYgKyBWUDhYIiBvciAiQUxQSCIuCi0gIGlmICgoZm91bmRfcmlmZiAmJiBmb3VuZF92cDh4KSB8fAotICAgICAgKCFmb3VuZF9yaWZmICYmICFmb3VuZF92cDh4ICYmICFTYk1lbW9yeUNvbXBhcmUoZGF0YSwgIkFMUEgiLCBUQUdfU0laRSkpKSB7Ci0gICAgc3RhdHVzID0gUGFyc2VPcHRpb25hbENodW5rcygmZGF0YSwgJmRhdGFfc2l6ZSwgaGRycy5yaWZmX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGRycy5hbHBoYV9kYXRhLCAmaGRycy5hbHBoYV9kYXRhX3NpemUpOwotICAgIGlmIChzdGF0dXMgIT0gVlA4X1NUQVRVU19PSykgewotICAgICAgcmV0dXJuIHN0YXR1czsgIC8vIEZvdW5kIGFuIGludmFsaWQgY2h1bmsgc2l6ZSAvIGluc3VmZmljaWVudCBkYXRhLgotICAgIH0KLSAgfQotCi0gIC8vIFNraXAgb3ZlciBWUDgvVlA4TCBoZWFkZXIuCi0gIHN0YXR1cyA9IFBhcnNlVlA4SGVhZGVyKCZkYXRhLCAmZGF0YV9zaXplLCBoZHJzLnJpZmZfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmhkcnMuY29tcHJlc3NlZF9zaXplLCAmaGRycy5pc19sb3NzbGVzcyk7Ci0gIGlmIChzdGF0dXMgIT0gVlA4X1NUQVRVU19PSykgewotICAgIHJldHVybiBzdGF0dXM7ICAvLyBXcm9uZyBWUDgvVlA4TCBjaHVuay1oZWFkZXIgLyBpbnN1ZmZpY2llbnQgZGF0YS4KLSAgfQotICBpZiAoaGRycy5jb21wcmVzc2VkX3NpemUgPiBNQVhfQ0hVTktfUEFZTE9BRCkgewotICAgIHJldHVybiBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUjsKLSAgfQotCi0gIGlmICghaGRycy5pc19sb3NzbGVzcykgewotICAgIGlmIChkYXRhX3NpemUgPCBWUDhfRlJBTUVfSEVBREVSX1NJWkUpIHsKLSAgICAgIHJldHVybiBWUDhfU1RBVFVTX05PVF9FTk9VR0hfREFUQTsKLSAgICB9Ci0gICAgLy8gVmFsaWRhdGVzIHJhdyBWUDggZGF0YS4KLSAgICBpZiAoIVZQOEdldEluZm8oZGF0YSwgZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpaGRycy5jb21wcmVzc2VkX3NpemUsIHdpZHRoLCBoZWlnaHQpKSB7Ci0gICAgICByZXR1cm4gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmIChkYXRhX3NpemUgPCBWUDhMX0ZSQU1FX0hFQURFUl9TSVpFKSB7Ci0gICAgICByZXR1cm4gVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEE7Ci0gICAgfQotICAgIC8vIFZhbGlkYXRlcyByYXcgVlA4TCBkYXRhLgotICAgIGlmICghVlA4TEdldEluZm8oZGF0YSwgZGF0YV9zaXplLCB3aWR0aCwgaGVpZ2h0LCBoYXNfYWxwaGEpKSB7Ci0gICAgICByZXR1cm4gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7Ci0gICAgfQotICB9Ci0KLSAgaWYgKGhhc19hbHBoYSAhPSBOVUxMKSB7Ci0gICAgLy8gSWYgdGhlIGRhdGEgZGlkIG5vdCBjb250YWluIGEgVlA4WC9WUDhMIGNodW5rIHRoZSBvbmx5IGRlZmluaXRpdmUgd2F5Ci0gICAgLy8gdG8gc2V0IHRoaXMgaXMgYnkgbG9va2luZyBmb3IgYWxwaGEgZGF0YSAoZnJvbSBhbiBBTFBIIGNodW5rKS4KLSAgICAqaGFzX2FscGhhIHw9IChoZHJzLmFscGhhX2RhdGEgIT0gTlVMTCk7Ci0gIH0KLSAgaWYgKGhlYWRlcnMgIT0gTlVMTCkgewotICAgICpoZWFkZXJzID0gaGRyczsKLSAgICBoZWFkZXJzLT5vZmZzZXQgPSBkYXRhIC0gaGVhZGVycy0+ZGF0YTsKLSAgICBTQl9EQ0hFQ0soKHVpbnQ2NF90KShkYXRhIC0gaGVhZGVycy0+ZGF0YSkgPCBNQVhfQ0hVTktfUEFZTE9BRCk7Ci0gICAgU0JfRENIRUNLKGhlYWRlcnMtPm9mZnNldCA9PSBoZWFkZXJzLT5kYXRhX3NpemUgLSBkYXRhX3NpemUpOwotICB9Ci0gIHJldHVybiBWUDhfU1RBVFVTX09LOyAgLy8gUmV0dXJuIGZlYXR1cmVzIGZyb20gVlA4IGhlYWRlci4KLX0KLQotVlA4U3RhdHVzQ29kZSBXZWJQUGFyc2VIZWFkZXJzKFdlYlBIZWFkZXJTdHJ1Y3R1cmUqIGNvbnN0IGhlYWRlcnMpIHsKLSAgVlA4U3RhdHVzQ29kZSBzdGF0dXM7Ci0gIGludCBoYXNfYW5pbWF0aW9uID0gMDsKLSAgU0JfRENIRUNLKGhlYWRlcnMgIT0gTlVMTCk7Ci0gIC8vIGZpbGwgb3V0IGhlYWRlcnMsIGlnbm9yZSB3aWR0aC9oZWlnaHQvaGFzX2FscGhhLgotICBzdGF0dXMgPSBQYXJzZUhlYWRlcnNJbnRlcm5hbChoZWFkZXJzLT5kYXRhLCBoZWFkZXJzLT5kYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsICZoYXNfYW5pbWF0aW9uLCBoZWFkZXJzKTsKLSAgaWYgKHN0YXR1cyA9PSBWUDhfU1RBVFVTX09LIHx8IHN0YXR1cyA9PSBWUDhfU1RBVFVTX05PVF9FTk9VR0hfREFUQSkgewotICAgIC8vIFRPRE8oanplcm4pOiBmdWxsIHN1cHBvcnQgb2YgYW5pbWF0aW9uIGZyYW1lcyB3aWxsIHJlcXVpcmUgQVBJIGFkZGl0aW9ucy4KLSAgICBpZiAoaGFzX2FuaW1hdGlvbikgewotICAgICAgc3RhdHVzID0gVlA4X1NUQVRVU19VTlNVUFBPUlRFRF9GRUFUVVJFOwotICAgIH0KLSAgfQotICByZXR1cm4gc3RhdHVzOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gV2ViUERlY1BhcmFtcwotCi12b2lkIFdlYlBSZXNldERlY1BhcmFtcyhXZWJQRGVjUGFyYW1zKiBjb25zdCBwYXJhbXMpIHsKLSAgaWYgKHBhcmFtcykgewotICAgIFNiTWVtb3J5U2V0KHBhcmFtcywgMCwgc2l6ZW9mKCpwYXJhbXMpKTsKLSAgfQotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gIkludG8iIGRlY29kaW5nIHZhcmlhbnRzCi0KLS8vIE1haW4gZmxvdwotc3RhdGljIFZQOFN0YXR1c0NvZGUgRGVjb2RlSW50byhjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQRGVjUGFyYW1zKiBjb25zdCBwYXJhbXMpIHsKLSAgVlA4U3RhdHVzQ29kZSBzdGF0dXM7Ci0gIFZQOElvIGlvOwotICBXZWJQSGVhZGVyU3RydWN0dXJlIGhlYWRlcnM7Ci0KLSAgaGVhZGVycy5kYXRhID0gZGF0YTsKLSAgaGVhZGVycy5kYXRhX3NpemUgPSBkYXRhX3NpemU7Ci0gIHN0YXR1cyA9IFdlYlBQYXJzZUhlYWRlcnMoJmhlYWRlcnMpOyAgIC8vIFByb2Nlc3MgUHJlLVZQOCBjaHVua3MuCi0gIGlmIChzdGF0dXMgIT0gVlA4X1NUQVRVU19PSykgewotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLQotICBTQl9EQ0hFQ0socGFyYW1zICE9IE5VTEwpOwotICBWUDhJbml0SW8oJmlvKTsKLSAgaW8uZGF0YSA9IGhlYWRlcnMuZGF0YSArIGhlYWRlcnMub2Zmc2V0OwotICBpby5kYXRhX3NpemUgPSBoZWFkZXJzLmRhdGFfc2l6ZSAtIGhlYWRlcnMub2Zmc2V0OwotICBXZWJQSW5pdEN1c3RvbUlvKHBhcmFtcywgJmlvKTsgIC8vIFBsdWcgdGhlIEkvTyBmdW5jdGlvbnMuCi0KLSAgaWYgKCFoZWFkZXJzLmlzX2xvc3NsZXNzKSB7Ci0gICAgVlA4RGVjb2RlciogY29uc3QgZGVjID0gVlA4TmV3KCk7Ci0gICAgaWYgKGRlYyA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gVlA4X1NUQVRVU19PVVRfT0ZfTUVNT1JZOwotICAgIH0KLSNpZmRlZiBXRUJQX1VTRV9USFJFQUQKLSAgICBkZWMtPnVzZV90aHJlYWRzXyA9IHBhcmFtcy0+b3B0aW9ucyAmJiAocGFyYW1zLT5vcHRpb25zLT51c2VfdGhyZWFkcyA+IDApOwotI2Vsc2UKLSAgICBkZWMtPnVzZV90aHJlYWRzXyA9IDA7Ci0jZW5kaWYKLSAgICBkZWMtPmFscGhhX2RhdGFfID0gaGVhZGVycy5hbHBoYV9kYXRhOwotICAgIGRlYy0+YWxwaGFfZGF0YV9zaXplXyA9IGhlYWRlcnMuYWxwaGFfZGF0YV9zaXplOwotCi0gICAgLy8gRGVjb2RlIGJpdHN0cmVhbSBoZWFkZXIsIHVwZGF0ZSBpby0+d2lkdGgvaW8tPmhlaWdodC4KLSAgICBpZiAoIVZQOEdldEhlYWRlcnMoZGVjLCAmaW8pKSB7Ci0gICAgICBzdGF0dXMgPSBkZWMtPnN0YXR1c187ICAgLy8gQW4gZXJyb3Igb2NjdXJyZWQuIEdyYWIgZXJyb3Igc3RhdHVzLgotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBBbGxvY2F0ZS9jaGVjayBvdXRwdXQgYnVmZmVycy4KLSAgICAgIHN0YXR1cyA9IFdlYlBBbGxvY2F0ZURlY0J1ZmZlcihpby53aWR0aCwgaW8uaGVpZ2h0LCBwYXJhbXMtPm9wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5vdXRwdXQpOwotICAgICAgaWYgKHN0YXR1cyA9PSBWUDhfU1RBVFVTX09LKSB7ICAvLyBEZWNvZGUKLSAgICAgICAgaWYgKCFWUDhEZWNvZGUoZGVjLCAmaW8pKSB7Ci0gICAgICAgICAgc3RhdHVzID0gZGVjLT5zdGF0dXNfOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIFZQOERlbGV0ZShkZWMpOwotICB9IGVsc2UgewotICAgIFZQOExEZWNvZGVyKiBjb25zdCBkZWMgPSBWUDhMTmV3KCk7Ci0gICAgaWYgKGRlYyA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gVlA4X1NUQVRVU19PVVRfT0ZfTUVNT1JZOwotICAgIH0KLSAgICBpZiAoIVZQOExEZWNvZGVIZWFkZXIoZGVjLCAmaW8pKSB7Ci0gICAgICBzdGF0dXMgPSBkZWMtPnN0YXR1c187ICAgLy8gQW4gZXJyb3Igb2NjdXJyZWQuIEdyYWIgZXJyb3Igc3RhdHVzLgotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBBbGxvY2F0ZS9jaGVjayBvdXRwdXQgYnVmZmVycy4KLSAgICAgIHN0YXR1cyA9IFdlYlBBbGxvY2F0ZURlY0J1ZmZlcihpby53aWR0aCwgaW8uaGVpZ2h0LCBwYXJhbXMtPm9wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5vdXRwdXQpOwotICAgICAgaWYgKHN0YXR1cyA9PSBWUDhfU1RBVFVTX09LKSB7ICAvLyBEZWNvZGUKLSAgICAgICAgaWYgKCFWUDhMRGVjb2RlSW1hZ2UoZGVjKSkgewotICAgICAgICAgIHN0YXR1cyA9IGRlYy0+c3RhdHVzXzsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBWUDhMRGVsZXRlKGRlYyk7Ci0gIH0KLQotICBpZiAoc3RhdHVzICE9IFZQOF9TVEFUVVNfT0spIHsKLSAgICBXZWJQRnJlZURlY0J1ZmZlcihwYXJhbXMtPm91dHB1dCk7Ci0gIH0KLSAgcmV0dXJuIHN0YXR1czsKLX0KLQotLy8gSGVscGVycwotc3RhdGljIHVpbnQ4X3QqIERlY29kZUludG9SR0JBQnVmZmVyKFdFQlBfQ1NQX01PREUgY29sb3JzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgcmdiYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBzaXplX3Qgc2l6ZSkgewotICBXZWJQRGVjUGFyYW1zIHBhcmFtczsKLSAgV2ViUERlY0J1ZmZlciBidWY7Ci0gIGlmIChyZ2JhID09IE5VTEwpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBXZWJQSW5pdERlY0J1ZmZlcigmYnVmKTsKLSAgV2ViUFJlc2V0RGVjUGFyYW1zKCZwYXJhbXMpOwotICBwYXJhbXMub3V0cHV0ID0gJmJ1ZjsKLSAgYnVmLmNvbG9yc3BhY2UgICAgPSBjb2xvcnNwYWNlOwotICBidWYudS5SR0JBLnJnYmEgICA9IHJnYmE7Ci0gIGJ1Zi51LlJHQkEuc3RyaWRlID0gc3RyaWRlOwotICBidWYudS5SR0JBLnNpemUgICA9IHNpemU7Ci0gIGJ1Zi5pc19leHRlcm5hbF9tZW1vcnkgPSAxOwotICBpZiAoRGVjb2RlSW50byhkYXRhLCBkYXRhX3NpemUsICZwYXJhbXMpICE9IFZQOF9TVEFUVVNfT0spIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICByZXR1cm4gcmdiYTsKLX0KLQotdWludDhfdCogV2ViUERlY29kZVJHQkludG8oY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG91dHB1dCwgc2l6ZV90IHNpemUsIGludCBzdHJpZGUpIHsKLSAgcmV0dXJuIERlY29kZUludG9SR0JBQnVmZmVyKE1PREVfUkdCLCBkYXRhLCBkYXRhX3NpemUsIG91dHB1dCwgc3RyaWRlLCBzaXplKTsKLX0KLQotdWludDhfdCogV2ViUERlY29kZVJHQkFJbnRvKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3V0cHV0LCBzaXplX3Qgc2l6ZSwgaW50IHN0cmlkZSkgewotICByZXR1cm4gRGVjb2RlSW50b1JHQkFCdWZmZXIoTU9ERV9SR0JBLCBkYXRhLCBkYXRhX3NpemUsIG91dHB1dCwgc3RyaWRlLCBzaXplKTsKLX0KLQotdWludDhfdCogV2ViUERlY29kZUFSR0JJbnRvKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3V0cHV0LCBzaXplX3Qgc2l6ZSwgaW50IHN0cmlkZSkgewotICByZXR1cm4gRGVjb2RlSW50b1JHQkFCdWZmZXIoTU9ERV9BUkdCLCBkYXRhLCBkYXRhX3NpemUsIG91dHB1dCwgc3RyaWRlLCBzaXplKTsKLX0KLQotdWludDhfdCogV2ViUERlY29kZUJHUkludG8oY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG91dHB1dCwgc2l6ZV90IHNpemUsIGludCBzdHJpZGUpIHsKLSAgcmV0dXJuIERlY29kZUludG9SR0JBQnVmZmVyKE1PREVfQkdSLCBkYXRhLCBkYXRhX3NpemUsIG91dHB1dCwgc3RyaWRlLCBzaXplKTsKLX0KLQotdWludDhfdCogV2ViUERlY29kZUJHUkFJbnRvKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3V0cHV0LCBzaXplX3Qgc2l6ZSwgaW50IHN0cmlkZSkgewotICByZXR1cm4gRGVjb2RlSW50b1JHQkFCdWZmZXIoTU9ERV9CR1JBLCBkYXRhLCBkYXRhX3NpemUsIG91dHB1dCwgc3RyaWRlLCBzaXplKTsKLX0KLQotdWludDhfdCogV2ViUERlY29kZVlVVkludG8oY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGx1bWEsIHNpemVfdCBsdW1hX3NpemUsIGludCBsdW1hX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHUsIHNpemVfdCB1X3NpemUsIGludCB1X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHYsIHNpemVfdCB2X3NpemUsIGludCB2X3N0cmlkZSkgewotICBXZWJQRGVjUGFyYW1zIHBhcmFtczsKLSAgV2ViUERlY0J1ZmZlciBvdXRwdXQ7Ci0gIGlmIChsdW1hID09IE5VTEwpIHJldHVybiBOVUxMOwotICBXZWJQSW5pdERlY0J1ZmZlcigmb3V0cHV0KTsKLSAgV2ViUFJlc2V0RGVjUGFyYW1zKCZwYXJhbXMpOwotICBwYXJhbXMub3V0cHV0ID0gJm91dHB1dDsKLSAgb3V0cHV0LmNvbG9yc3BhY2UgICAgICA9IE1PREVfWVVWOwotICBvdXRwdXQudS5ZVVZBLnkgICAgICAgID0gbHVtYTsKLSAgb3V0cHV0LnUuWVVWQS55X3N0cmlkZSA9IGx1bWFfc3RyaWRlOwotICBvdXRwdXQudS5ZVVZBLnlfc2l6ZSAgID0gbHVtYV9zaXplOwotICBvdXRwdXQudS5ZVVZBLnUgICAgICAgID0gdTsKLSAgb3V0cHV0LnUuWVVWQS51X3N0cmlkZSA9IHVfc3RyaWRlOwotICBvdXRwdXQudS5ZVVZBLnVfc2l6ZSAgID0gdV9zaXplOwotICBvdXRwdXQudS5ZVVZBLnYgICAgICAgID0gdjsKLSAgb3V0cHV0LnUuWVVWQS52X3N0cmlkZSA9IHZfc3RyaWRlOwotICBvdXRwdXQudS5ZVVZBLnZfc2l6ZSAgID0gdl9zaXplOwotICBvdXRwdXQuaXNfZXh0ZXJuYWxfbWVtb3J5ID0gMTsKLSAgaWYgKERlY29kZUludG8oZGF0YSwgZGF0YV9zaXplLCAmcGFyYW1zKSAhPSBWUDhfU1RBVFVTX09LKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgcmV0dXJuIGx1bWE7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB1aW50OF90KiBEZWNvZGUoV0VCUF9DU1BfTU9ERSBtb2RlLCBjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZGF0YV9zaXplLCBpbnQqIGNvbnN0IHdpZHRoLCBpbnQqIGNvbnN0IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgV2ViUERlY0J1ZmZlciogY29uc3Qga2VlcF9pbmZvKSB7Ci0gIFdlYlBEZWNQYXJhbXMgcGFyYW1zOwotICBXZWJQRGVjQnVmZmVyIG91dHB1dDsKLQotICBXZWJQSW5pdERlY0J1ZmZlcigmb3V0cHV0KTsKLSAgV2ViUFJlc2V0RGVjUGFyYW1zKCZwYXJhbXMpOwotICBwYXJhbXMub3V0cHV0ID0gJm91dHB1dDsKLSAgb3V0cHV0LmNvbG9yc3BhY2UgPSBtb2RlOwotCi0gIC8vIFJldHJpZXZlIChhbmQgcmVwb3J0IGJhY2spIHRoZSByZXF1aXJlZCBkaW1lbnNpb25zIGZyb20gYml0c3RyZWFtLgotICBpZiAoIVdlYlBHZXRJbmZvKGRhdGEsIGRhdGFfc2l6ZSwgJm91dHB1dC53aWR0aCwgJm91dHB1dC5oZWlnaHQpKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgaWYgKHdpZHRoICE9IE5VTEwpICp3aWR0aCA9IG91dHB1dC53aWR0aDsKLSAgaWYgKGhlaWdodCAhPSBOVUxMKSAqaGVpZ2h0ID0gb3V0cHV0LmhlaWdodDsKLQotICAvLyBEZWNvZGUKLSAgaWYgKERlY29kZUludG8oZGF0YSwgZGF0YV9zaXplLCAmcGFyYW1zKSAhPSBWUDhfU1RBVFVTX09LKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgaWYgKGtlZXBfaW5mbyAhPSBOVUxMKSB7ICAgIC8vIGtlZXAgdHJhY2sgb2YgdGhlIHNpZGUtaW5mbwotICAgIFdlYlBDb3B5RGVjQnVmZmVyKCZvdXRwdXQsIGtlZXBfaW5mbyk7Ci0gIH0KLSAgLy8gcmV0dXJuIGRlY29kZWQgc2FtcGxlcyAoZG9uJ3QgY2xlYXIgJ291dHB1dCchKQotICByZXR1cm4gV2ViUElzUkdCTW9kZShtb2RlKSA/IG91dHB1dC51LlJHQkEucmdiYSA6IG91dHB1dC51LllVVkEueTsKLX0KLQotdWludDhfdCogV2ViUERlY29kZVJHQihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCkgewotICByZXR1cm4gRGVjb2RlKE1PREVfUkdCLCBkYXRhLCBkYXRhX3NpemUsIHdpZHRoLCBoZWlnaHQsIE5VTEwpOwotfQotCi11aW50OF90KiBXZWJQRGVjb2RlUkdCQShjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQpIHsKLSAgcmV0dXJuIERlY29kZShNT0RFX1JHQkEsIGRhdGEsIGRhdGFfc2l6ZSwgd2lkdGgsIGhlaWdodCwgTlVMTCk7Ci19Ci0KLXVpbnQ4X3QqIFdlYlBEZWNvZGVBUkdCKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCkgewotICByZXR1cm4gRGVjb2RlKE1PREVfQVJHQiwgZGF0YSwgZGF0YV9zaXplLCB3aWR0aCwgaGVpZ2h0LCBOVUxMKTsKLX0KLQotdWludDhfdCogV2ViUERlY29kZUJHUihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCkgewotICByZXR1cm4gRGVjb2RlKE1PREVfQkdSLCBkYXRhLCBkYXRhX3NpemUsIHdpZHRoLCBoZWlnaHQsIE5VTEwpOwotfQotCi11aW50OF90KiBXZWJQRGVjb2RlQkdSQShjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQpIHsKLSAgcmV0dXJuIERlY29kZShNT0RFX0JHUkEsIGRhdGEsIGRhdGFfc2l6ZSwgd2lkdGgsIGhlaWdodCwgTlVMTCk7Ci19Ci0KLXVpbnQ4X3QqIFdlYlBEZWNvZGVZVVYoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQsIHVpbnQ4X3QqKiB1LCB1aW50OF90KiogdiwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50KiBzdHJpZGUsIGludCogdXZfc3RyaWRlKSB7Ci0gIFdlYlBEZWNCdWZmZXIgb3V0cHV0OyAgIC8vIG9ubHkgdG8gcHJlc2VydmUgdGhlIHNpZGUtaW5mb3MKLSAgdWludDhfdCogY29uc3Qgb3V0ID0gRGVjb2RlKE1PREVfWVVWLCBkYXRhLCBkYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCAmb3V0cHV0KTsKLQotICBpZiAob3V0ICE9IE5VTEwpIHsKLSAgICBjb25zdCBXZWJQWVVWQUJ1ZmZlciogY29uc3QgYnVmID0gJm91dHB1dC51LllVVkE7Ci0gICAgKnUgPSBidWYtPnU7Ci0gICAgKnYgPSBidWYtPnY7Ci0gICAgKnN0cmlkZSA9IGJ1Zi0+eV9zdHJpZGU7Ci0gICAgKnV2X3N0cmlkZSA9IGJ1Zi0+dV9zdHJpZGU7Ci0gICAgU0JfRENIRUNLKGJ1Zi0+dV9zdHJpZGUgPT0gYnVmLT52X3N0cmlkZSk7Ci0gIH0KLSAgcmV0dXJuIG91dDsKLX0KLQotc3RhdGljIHZvaWQgRGVmYXVsdEZlYXR1cmVzKFdlYlBCaXRzdHJlYW1GZWF0dXJlcyogY29uc3QgZmVhdHVyZXMpIHsKLSAgU0JfRENIRUNLKGZlYXR1cmVzICE9IE5VTEwpOwotICBTYk1lbW9yeVNldChmZWF0dXJlcywgMCwgc2l6ZW9mKCpmZWF0dXJlcykpOwotICBmZWF0dXJlcy0+Yml0c3RyZWFtX3ZlcnNpb24gPSAwOwotfQotCi1zdGF0aWMgVlA4U3RhdHVzQ29kZSBHZXRGZWF0dXJlcyhjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUEJpdHN0cmVhbUZlYXR1cmVzKiBjb25zdCBmZWF0dXJlcykgewotICBpZiAoZmVhdHVyZXMgPT0gTlVMTCB8fCBkYXRhID09IE5VTEwpIHsKLSAgICByZXR1cm4gVlA4X1NUQVRVU19JTlZBTElEX1BBUkFNOwotICB9Ci0gIERlZmF1bHRGZWF0dXJlcyhmZWF0dXJlcyk7Ci0KLSAgLy8gT25seSBwYXJzZSBlbm91Z2ggb2YgdGhlIGRhdGEgdG8gcmV0cmlldmUgdGhlIGZlYXR1cmVzLgotICByZXR1cm4gUGFyc2VIZWFkZXJzSW50ZXJuYWwoZGF0YSwgZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZlYXR1cmVzLT53aWR0aCwgJmZlYXR1cmVzLT5oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmVhdHVyZXMtPmhhc19hbHBoYSwgJmZlYXR1cmVzLT5oYXNfYW5pbWF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBXZWJQR2V0SW5mbygpCi0KLWludCBXZWJQR2V0SW5mbyhjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAotICAgICAgICAgICAgICAgIGludCogd2lkdGgsIGludCogaGVpZ2h0KSB7Ci0gIFdlYlBCaXRzdHJlYW1GZWF0dXJlcyBmZWF0dXJlczsKLQotICBpZiAoR2V0RmVhdHVyZXMoZGF0YSwgZGF0YV9zaXplLCAmZmVhdHVyZXMpICE9IFZQOF9TVEFUVVNfT0spIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGlmICh3aWR0aCAhPSBOVUxMKSB7Ci0gICAgKndpZHRoICA9IGZlYXR1cmVzLndpZHRoOwotICB9Ci0gIGlmIChoZWlnaHQgIT0gTlVMTCkgewotICAgICpoZWlnaHQgPSBmZWF0dXJlcy5oZWlnaHQ7Ci0gIH0KLQotICByZXR1cm4gMTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEFkdmFuY2UgZGVjb2RpbmcgQVBJCi0KLWludCBXZWJQSW5pdERlY29kZXJDb25maWdJbnRlcm5hbChXZWJQRGVjb2RlckNvbmZpZyogY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2ZXJzaW9uKSB7Ci0gIGlmIChXRUJQX0FCSV9JU19JTkNPTVBBVElCTEUodmVyc2lvbiwgV0VCUF9ERUNPREVSX0FCSV9WRVJTSU9OKSkgewotICAgIHJldHVybiAwOyAgIC8vIHZlcnNpb24gbWlzbWF0Y2gKLSAgfQotICBpZiAoY29uZmlnID09IE5VTEwpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICBTYk1lbW9yeVNldChjb25maWcsIDAsIHNpemVvZigqY29uZmlnKSk7Ci0gIERlZmF1bHRGZWF0dXJlcygmY29uZmlnLT5pbnB1dCk7Ci0gIFdlYlBJbml0RGVjQnVmZmVyKCZjb25maWctPm91dHB1dCk7Ci0gIHJldHVybiAxOwotfQotCi1WUDhTdGF0dXNDb2RlIFdlYlBHZXRGZWF0dXJlc0ludGVybmFsKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBCaXRzdHJlYW1GZWF0dXJlcyogZmVhdHVyZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2ZXJzaW9uKSB7Ci0gIGlmIChXRUJQX0FCSV9JU19JTkNPTVBBVElCTEUodmVyc2lvbiwgV0VCUF9ERUNPREVSX0FCSV9WRVJTSU9OKSkgewotICAgIHJldHVybiBWUDhfU1RBVFVTX0lOVkFMSURfUEFSQU07ICAgLy8gdmVyc2lvbiBtaXNtYXRjaAotICB9Ci0gIGlmIChmZWF0dXJlcyA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIFZQOF9TVEFUVVNfSU5WQUxJRF9QQVJBTTsKLSAgfQotICByZXR1cm4gR2V0RmVhdHVyZXMoZGF0YSwgZGF0YV9zaXplLCBmZWF0dXJlcyk7Ci19Ci0KLVZQOFN0YXR1c0NvZGUgV2ViUERlY29kZShjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBEZWNvZGVyQ29uZmlnKiBjb25maWcpIHsKLSAgV2ViUERlY1BhcmFtcyBwYXJhbXM7Ci0gIFZQOFN0YXR1c0NvZGUgc3RhdHVzOwotCi0gIGlmIChjb25maWcgPT0gTlVMTCkgewotICAgIHJldHVybiBWUDhfU1RBVFVTX0lOVkFMSURfUEFSQU07Ci0gIH0KLQotICBzdGF0dXMgPSBHZXRGZWF0dXJlcyhkYXRhLCBkYXRhX3NpemUsICZjb25maWctPmlucHV0KTsKLSAgaWYgKHN0YXR1cyAhPSBWUDhfU1RBVFVTX09LKSB7Ci0gICAgaWYgKHN0YXR1cyA9PSBWUDhfU1RBVFVTX05PVF9FTk9VR0hfREFUQSkgewotICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SOyAgLy8gTm90LWVub3VnaC1kYXRhIHRyZWF0ZWQgYXMgZXJyb3IuCi0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLQotICBXZWJQUmVzZXREZWNQYXJhbXMoJnBhcmFtcyk7Ci0gIHBhcmFtcy5vdXRwdXQgPSAmY29uZmlnLT5vdXRwdXQ7Ci0gIHBhcmFtcy5vcHRpb25zID0gJmNvbmZpZy0+b3B0aW9uczsKLSAgc3RhdHVzID0gRGVjb2RlSW50byhkYXRhLCBkYXRhX3NpemUsICZwYXJhbXMpOwotCi0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDcm9wcGluZyBhbmQgcmVzY2FsaW5nLgotCi1pbnQgV2ViUElvSW5pdEZyb21PcHRpb25zKGNvbnN0IFdlYlBEZWNvZGVyT3B0aW9ucyogY29uc3Qgb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4SW8qIGNvbnN0IGlvLCBXRUJQX0NTUF9NT0RFIHNyY19jb2xvcnNwYWNlKSB7Ci0gIGNvbnN0IGludCBXID0gaW8tPndpZHRoOwotICBjb25zdCBpbnQgSCA9IGlvLT5oZWlnaHQ7Ci0gIGludCB4ID0gMCwgeSA9IDAsIHcgPSBXLCBoID0gSDsKLQotICAvLyBDcm9wcGluZwotICBpby0+dXNlX2Nyb3BwaW5nID0gKG9wdGlvbnMgIT0gTlVMTCkgJiYgKG9wdGlvbnMtPnVzZV9jcm9wcGluZyA+IDApOwotICBpZiAoaW8tPnVzZV9jcm9wcGluZykgewotICAgIHcgPSBvcHRpb25zLT5jcm9wX3dpZHRoOwotICAgIGggPSBvcHRpb25zLT5jcm9wX2hlaWdodDsKLSAgICB4ID0gb3B0aW9ucy0+Y3JvcF9sZWZ0OwotICAgIHkgPSBvcHRpb25zLT5jcm9wX3RvcDsKLSAgICBpZiAoIVdlYlBJc1JHQk1vZGUoc3JjX2NvbG9yc3BhY2UpKSB7ICAgLy8gb25seSBzbmFwIGZvciBZVVY0MjAgb3IgWVVWNDIyCi0gICAgICB4ICY9IH4xOwotICAgICAgeSAmPSB+MTsgICAgLy8gVE9ETyhsYXRlcik6IG9ubHkgZm9yIFlVVjQyMCwgbm90IFlVVjQyMi4KLSAgICB9Ci0gICAgaWYgKHggPCAwIHx8IHkgPCAwIHx8IHcgPD0gMCB8fCBoIDw9IDAgfHwgeCArIHcgPiBXIHx8IHkgKyBoID4gSCkgewotICAgICAgcmV0dXJuIDA7ICAvLyBvdXQgb2YgZnJhbWUgYm91bmRhcnkgZXJyb3IKLSAgICB9Ci0gIH0KLSAgaW8tPmNyb3BfbGVmdCAgID0geDsKLSAgaW8tPmNyb3BfdG9wICAgID0geTsKLSAgaW8tPmNyb3BfcmlnaHQgID0geCArIHc7Ci0gIGlvLT5jcm9wX2JvdHRvbSA9IHkgKyBoOwotICBpby0+bWJfdyA9IHc7Ci0gIGlvLT5tYl9oID0gaDsKLQotICAvLyBTY2FsaW5nCi0gIGlvLT51c2Vfc2NhbGluZyA9IChvcHRpb25zICE9IE5VTEwpICYmIChvcHRpb25zLT51c2Vfc2NhbGluZyA+IDApOwotICBpZiAoaW8tPnVzZV9zY2FsaW5nKSB7Ci0gICAgaWYgKG9wdGlvbnMtPnNjYWxlZF93aWR0aCA8PSAwIHx8IG9wdGlvbnMtPnNjYWxlZF9oZWlnaHQgPD0gMCkgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlvLT5zY2FsZWRfd2lkdGggPSBvcHRpb25zLT5zY2FsZWRfd2lkdGg7Ci0gICAgaW8tPnNjYWxlZF9oZWlnaHQgPSBvcHRpb25zLT5zY2FsZWRfaGVpZ2h0OwotICB9Ci0KLSAgLy8gRmlsdGVyCi0gIGlvLT5ieXBhc3NfZmlsdGVyaW5nID0gb3B0aW9ucyAmJiBvcHRpb25zLT5ieXBhc3NfZmlsdGVyaW5nOwotCi0gIC8vIEZhbmN5IHVwc2FtcGxlcgotI2lmZGVmIEZBTkNZX1VQU0FNUExJTkcKLSAgaW8tPmZhbmN5X3Vwc2FtcGxpbmcgPSAob3B0aW9ucyA9PSBOVUxMKSB8fCAoIW9wdGlvbnMtPm5vX2ZhbmN5X3Vwc2FtcGxpbmcpOwotI2VuZGlmCi0KLSAgaWYgKGlvLT51c2Vfc2NhbGluZykgewotICAgIC8vIGRpc2FibGUgZmlsdGVyIChvbmx5IGZvciBsYXJnZSBkb3duc2NhbGluZyByYXRpbykuCi0gICAgaW8tPmJ5cGFzc19maWx0ZXJpbmcgPSAoaW8tPnNjYWxlZF93aWR0aCA8IFcgKiAzIC8gNCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChpby0+c2NhbGVkX2hlaWdodCA8IEggKiAzIC8gNCk7Ci0gICAgaW8tPmZhbmN5X3Vwc2FtcGxpbmcgPSAwOwotICB9Ci0gIHJldHVybiAxOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RlYy93ZWJwaS5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL3dlYnBpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhZTBiZmMuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL3dlYnBpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIEludGVybmFsIGhlYWRlcjogV2ViUCBkZWNvZGluZyBwYXJhbWV0ZXJzIGFuZCBjdXN0b20gSU8gb24gYnVmZmVyCi0vLwotLy8gQXV0aG9yOiBzb21uYXRoQGdvb2dsZS5jb20gKFNvbW5hdGggQmFuZXJqZWUpCi0KLSNpZm5kZWYgV0VCUF9ERUNfV0VCUElfSF8KLSNkZWZpbmUgV0VCUF9ERUNfV0VCUElfSF8KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpbmNsdWRlICIuLi91dGlscy9yZXNjYWxlci5oIgotI2luY2x1ZGUgIi4vZGVjb2RlX3ZwOC5oIgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gV2ViUERlY1BhcmFtczogRGVjb2Rpbmcgb3V0cHV0IHBhcmFtZXRlcnMuIFRyYW5zaWVudCBpbnRlcm5hbCBvYmplY3QuCi0KLXR5cGVkZWYgc3RydWN0IFdlYlBEZWNQYXJhbXMgV2ViUERlY1BhcmFtczsKLXR5cGVkZWYgaW50ICgqT3V0cHV0RnVuYykoY29uc3QgVlA4SW8qIGNvbnN0IGlvLCBXZWJQRGVjUGFyYW1zKiBjb25zdCBwKTsKLXR5cGVkZWYgaW50ICgqT3V0cHV0Um93RnVuYykoV2ViUERlY1BhcmFtcyogY29uc3QgcCwgaW50IHlfcG9zKTsKLQotc3RydWN0IFdlYlBEZWNQYXJhbXMgewotICBXZWJQRGVjQnVmZmVyKiBvdXRwdXQ7ICAgICAgICAgICAgIC8vIG91dHB1dCBidWZmZXIuCi0gIHVpbnQ4X3QqIHRtcF95LCAqdG1wX3UsICp0bXBfdjsgICAgLy8gY2FjaGUgZm9yIHRoZSBmYW5jeSB1cHNhbXBsZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciB1c2VkIGZvciB0bXAgcmVzY2FsaW5nCi0KLSAgaW50IGxhc3RfeTsgICAgICAgICAgICAgICAgIC8vIGNvb3JkaW5hdGUgb2YgdGhlIGxpbmUgdGhhdCB3YXMgbGFzdCBvdXRwdXQKLSAgY29uc3QgV2ViUERlY29kZXJPcHRpb25zKiBvcHRpb25zOyAgLy8gaWYgbm90IE5VTEwsIHVzZSBhbHQgZGVjb2RpbmcgZmVhdHVyZXMKLSAgLy8gcmVzY2FsZXJzCi0gIFdlYlBSZXNjYWxlciBzY2FsZXJfeSwgc2NhbGVyX3UsIHNjYWxlcl92LCBzY2FsZXJfYTsKLSAgdm9pZCogbWVtb3J5OyAgICAgICAgICAgICAgICAgIC8vIG92ZXJhbGwgc2NyYXRjaCBtZW1vcnkgZm9yIHRoZSBvdXRwdXQgd29yay4KLQotICBPdXRwdXRGdW5jIGVtaXQ7ICAgICAgICAgICAgICAgLy8gb3V0cHV0IFJHQiBvciBZVVYgc2FtcGxlcwotICBPdXRwdXRGdW5jIGVtaXRfYWxwaGE7ICAgICAgICAgLy8gb3V0cHV0IGFscGhhIGNoYW5uZWwKLSAgT3V0cHV0Um93RnVuYyBlbWl0X2FscGhhX3JvdzsgIC8vIG91dHB1dCBvbmUgbGluZSBvZiByZXNjYWxlZCBhbHBoYSB2YWx1ZXMKLX07Ci0KLS8vIFNob3VsZCBiZSBjYWxsZWQgZmlyc3QsIGJlZm9yZSBhbnkgdXNlIG9mIHRoZSBXZWJQRGVjUGFyYW1zIG9iamVjdC4KLXZvaWQgV2ViUFJlc2V0RGVjUGFyYW1zKFdlYlBEZWNQYXJhbXMqIGNvbnN0IHBhcmFtcyk7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBIZWFkZXIgcGFyc2luZyBoZWxwZXJzCi0KLS8vIFN0cnVjdHVyZSBzdG9yaW5nIGEgZGVzY3JpcHRpb24gb2YgdGhlIFJJRkYgaGVhZGVycy4KLXR5cGVkZWYgc3RydWN0IHsKLSAgY29uc3QgdWludDhfdCogZGF0YTsgICAgICAgICAvLyBpbnB1dCBidWZmZXIKLSAgc2l6ZV90IGRhdGFfc2l6ZTsgICAgICAgICAgICAvLyBpbnB1dCBidWZmZXIgc2l6ZQotICBzaXplX3Qgb2Zmc2V0OyAgICAgICAgICAgICAgIC8vIG9mZnNldCB0byBtYWluIGRhdGEgY2h1bmsgKFZQOCBvciBWUDhMKQotICBjb25zdCB1aW50OF90KiBhbHBoYV9kYXRhOyAgIC8vIHBvaW50cyB0byBhbHBoYSBjaHVuayAoaWYgcHJlc2VudCkKLSAgc2l6ZV90IGFscGhhX2RhdGFfc2l6ZTsgICAgICAvLyBhbHBoYSBjaHVuayBzaXplCi0gIHNpemVfdCBjb21wcmVzc2VkX3NpemU7ICAgICAgLy8gVlA4L1ZQOEwgY29tcHJlc3NlZCBkYXRhIHNpemUKLSAgc2l6ZV90IHJpZmZfc2l6ZTsgICAgICAgICAgICAvLyBzaXplIG9mIHRoZSByaWZmIHBheWxvYWQgKG9yIDAgaWYgYWJzZW50KQotICBpbnQgaXNfbG9zc2xlc3M7ICAgICAgICAgICAgIC8vIHRydWUgaWYgYSBWUDhMIGNodW5rIGlzIHByZXNlbnQKLX0gV2ViUEhlYWRlclN0cnVjdHVyZTsKLQotLy8gU2tpcHMgb3ZlciBhbGwgdmFsaWQgY2h1bmtzIHByaW9yIHRvIHRoZSBmaXJzdCBWUDgvVlA4TCBmcmFtZSBoZWFkZXIuCi0vLyBSZXR1cm5zOiBWUDhfU1RBVFVTX09LLCBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUiAoaW52YWxpZCBoZWFkZXIvY2h1bmspLAotLy8gVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEEgKHBhcnRpYWwgaW5wdXQpIG9yIFZQOF9TVEFUVVNfVU5TVVBQT1JURURfRkVBVFVSRQotLy8gaW4gdGhlIGNhc2Ugb2Ygbm9uLWRlY29kYWJsZSBmZWF0dXJlcyAoYW5pbWF0aW9uIGZvciBpbnN0YW5jZSkuCi0vLyBJbiAnaGVhZGVycycsIGNvbXByZXNzZWRfc2l6ZSwgb2Zmc2V0LCBhbHBoYV9kYXRhLCBhbHBoYV9zaXplLCBhbmQgbG9zc2xlc3MKLS8vIGZpZWxkcyBhcmUgdXBkYXRlZCBhcHByb3ByaWF0ZWx5IHVwb24gc3VjY2Vzcy4KLVZQOFN0YXR1c0NvZGUgV2ViUFBhcnNlSGVhZGVycyhXZWJQSGVhZGVyU3RydWN0dXJlKiBjb25zdCBoZWFkZXJzKTsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE1pc2MgdXRpbHMKLQotLy8gSW5pdGlhbGl6ZXMgVlA4SW8gd2l0aCBjdXN0b20gc2V0dXAsIGlvIGFuZCB0ZWFyZG93biBmdW5jdGlvbnMuIFRoZSBkZWZhdWx0Ci0vLyBob29rcyB3aWxsIHVzZSB0aGUgc3VwcGxpZWQgJ3BhcmFtcycgYXMgaW8tPm9wYXF1ZSBoYW5kbGUuCi12b2lkIFdlYlBJbml0Q3VzdG9tSW8oV2ViUERlY1BhcmFtcyogY29uc3QgcGFyYW1zLCBWUDhJbyogY29uc3QgaW8pOwotCi0vLyBTZXR1cCBjcm9wX3h4eCBmaWVsZHMsIG1iX3cgYW5kIG1iX2ggaW4gaW8uICdzcmNfY29sb3JzcGFjZScgcmVmZXJzCi0vLyB0byB0aGUgKmNvbXByZXNzZWQqIGZvcm1hdCwgbm90IHRoZSBvdXRwdXQgb25lLgotaW50IFdlYlBJb0luaXRGcm9tT3B0aW9ucyhjb25zdCBXZWJQRGVjb2Rlck9wdGlvbnMqIGNvbnN0IG9wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFZQOElvKiBjb25zdCBpbywgV0VCUF9DU1BfTU9ERSBzcmNfY29sb3JzcGFjZSk7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBJbnRlcm5hbCBmdW5jdGlvbnMgcmVnYXJkaW5nIFdlYlBEZWNCdWZmZXIgbWVtb3J5IChpbiBidWZmZXIuYykuCi0vLyBEb24ndCByZWFsbHkgbmVlZCB0byBiZSBleHRlcm5hbGx5IHZpc2libGUgZm9yIG5vdy4KLQotLy8gUHJlcGFyZSAnYnVmZmVyJyB3aXRoIHRoZSByZXF1ZXN0ZWQgaW5pdGlhbCBkaW1lbnNpb25zIHdpZHRoL2hlaWdodC4KLS8vIElmIG5vIGV4dGVybmFsIHN0b3JhZ2UgaXMgc3VwcGxpZWQsIGluaXRpYWxpemVzIGJ1ZmZlciBieSBhbGxvY2F0aW5nIG91dHB1dAotLy8gbWVtb3J5IGFuZCBzZXR0aW5nIHVwIHRoZSBzdHJpZGUgaW5mb3JtYXRpb24uIFZhbGlkYXRlIHRoZSBwYXJhbWV0ZXJzLiBSZXR1cm4KLS8vIGFuIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBwcm9ibGVtIChubyBtZW1vcnksIG9yIGludmFsaWQgc3RyaWRlIC8gc2l6ZSAvCi0vLyBkaW1lbnNpb24gLyBldGMuKS4gSWYgKm9wdGlvbnMgaXMgbm90IE5VTEwsIGFsc28gdmVyaWZ5IHRoYXQgdGhlIG9wdGlvbnMnCi0vLyBwYXJhbWV0ZXJzIGFyZSB2YWxpZCBhbmQgYXBwbHkgdGhlbSB0byB0aGUgd2lkdGgvaGVpZ2h0IGRpbWVuc2lvbnMgb2YgdGhlCi0vLyBvdXRwdXQgYnVmZmVyLiBUaGlzIHRha2VzIGNyb3BwaW5nIC8gc2NhbGluZyAvIHJvdGF0aW9uIGludG8gYWNjb3VudC4KLVZQOFN0YXR1c0NvZGUgV2ViUEFsbG9jYXRlRGVjQnVmZmVyKGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBEZWNvZGVyT3B0aW9ucyogY29uc3Qgb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBEZWNCdWZmZXIqIGNvbnN0IGJ1ZmZlcik7Ci0KLS8vIENvcHkgJ3NyYycgaW50byAnZHN0JyBidWZmZXIsIG1ha2luZyBzdXJlICdkc3QnIGlzIG5vdCBtYXJrZWQgYXMgb3duZXIgb2YgdGhlCi0vLyBtZW1vcnkgKHN0aWxsIGhlbGQgYnkgJ3NyYycpLgotdm9pZCBXZWJQQ29weURlY0J1ZmZlcihjb25zdCBXZWJQRGVjQnVmZmVyKiBjb25zdCBzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgIFdlYlBEZWNCdWZmZXIqIGNvbnN0IGRzdCk7Ci0KLS8vIENvcHkgYW5kIHRyYW5zZmVyIG93bmVyc2hpcCBmcm9tIHNyYyB0byBkc3QgKGJld2FyZSBvZiBwYXJhbWV0ZXIgb3JkZXIhKQotdm9pZCBXZWJQR3JhYkRlY0J1ZmZlcihXZWJQRGVjQnVmZmVyKiBjb25zdCBzcmMsIFdlYlBEZWNCdWZmZXIqIGNvbnN0IGRzdCk7Ci0KLQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKLQotI2VuZGlmICAvKiBXRUJQX0RFQ19XRUJQSV9IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVtdXgvZGVtdXguYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RlbXV4L2RlbXV4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiY2E2YzYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVtdXgvZGVtdXguYworKysgL2Rldi9udWxsCkBAIC0xLDk1OSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gIFdlYlAgY29udGFpbmVyIGRlbXV4LgotLy8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNlbHNlCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgIi4uL3V0aWxzL3V0aWxzLmgiCi0jaW5jbHVkZSAiLi4vd2VicC9kZWNvZGUuaCIgICAgIC8vIFdlYlBHZXRGZWF0dXJlcwotI2luY2x1ZGUgIi4uL3dlYnAvZGVtdXguaCIKLSNpbmNsdWRlICIuLi93ZWJwL2Zvcm1hdF9jb25zdGFudHMuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNkZWZpbmUgRE1VWF9NQUpfVkVSU0lPTiAwCi0jZGVmaW5lIERNVVhfTUlOX1ZFUlNJT04gMQotI2RlZmluZSBETVVYX1JFVl9WRVJTSU9OIDEKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzaXplX3Qgc3RhcnRfOyAgICAgICAgLy8gc3RhcnQgbG9jYXRpb24gb2YgdGhlIGRhdGEKLSAgc2l6ZV90IGVuZF87ICAgICAgICAgIC8vIGVuZCBsb2NhdGlvbgotICBzaXplX3QgcmlmZl9lbmRfOyAgICAgLy8gcmlmZiBjaHVuayBlbmQgbG9jYXRpb24sIGNhbiBiZSA+IGVuZF8uCi0gIHNpemVfdCBidWZfc2l6ZV87ICAgICAvLyBzaXplIG9mIHRoZSBidWZmZXIKLSAgY29uc3QgdWludDhfdCogYnVmXzsKLX0gTWVtQnVmZmVyOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHNpemVfdCBvZmZzZXRfOwotICBzaXplX3Qgc2l6ZV87Ci19IENodW5rRGF0YTsKLQotdHlwZWRlZiBzdHJ1Y3QgRnJhbWUgewotICBpbnQgeF9vZmZzZXRfLCB5X29mZnNldF87Ci0gIGludCB3aWR0aF8sIGhlaWdodF87Ci0gIGludCBkdXJhdGlvbl87Ci0gIFdlYlBNdXhBbmltRGlzcG9zZSBkaXNwb3NlX21ldGhvZF87Ci0gIGludCBpc19mcmFnbWVudF87ICAvLyB0aGlzIGlzIGEgZnJhbWUgZnJhZ21lbnQgKGFuZCBub3QgYSBmdWxsIGZyYW1lKS4KLSAgaW50IGZyYW1lX251bV87ICAvLyB0aGUgcmVmZXJlbnQgZnJhbWUgbnVtYmVyIGZvciB1c2UgaW4gYXNzZW1ibGluZyBmcmFnbWVudHMuCi0gIGludCBjb21wbGV0ZV87ICAgLy8gaW1nX2NvbXBvbmVudHNfIGNvbnRhaW5zIGEgZnVsbCBpbWFnZS4KLSAgQ2h1bmtEYXRhIGltZ19jb21wb25lbnRzX1syXTsgIC8vIDA9VlA4eyxMfSAxPUFMUEgKLSAgc3RydWN0IEZyYW1lKiBuZXh0XzsKLX0gRnJhbWU7Ci0KLXR5cGVkZWYgc3RydWN0IENodW5rIHsKLSAgQ2h1bmtEYXRhIGRhdGFfOwotICBzdHJ1Y3QgQ2h1bmsqIG5leHRfOwotfSBDaHVuazsKLQotc3RydWN0IFdlYlBEZW11eGVyIHsKLSAgTWVtQnVmZmVyIG1lbV87Ci0gIFdlYlBEZW11eFN0YXRlIHN0YXRlXzsKLSAgaW50IGlzX2V4dF9mb3JtYXRfOwotICB1aW50MzJfdCBmZWF0dXJlX2ZsYWdzXzsKLSAgaW50IGNhbnZhc193aWR0aF8sIGNhbnZhc19oZWlnaHRfOwotICBpbnQgbG9vcF9jb3VudF87Ci0gIHVpbnQzMl90IGJnY29sb3JfOwotICBpbnQgbnVtX2ZyYW1lc187Ci0gIEZyYW1lKiBmcmFtZXNfOwotICBGcmFtZSoqIGZyYW1lc190YWlsXzsKLSAgQ2h1bmsqIGNodW5rc187ICAvLyBub24taW1hZ2UgY2h1bmtzCi19OwotCi10eXBlZGVmIGVudW0gewotICBQQVJTRV9PSywKLSAgUEFSU0VfTkVFRF9NT1JFX0RBVEEsCi0gIFBBUlNFX0VSUk9SCi19IFBhcnNlU3RhdHVzOwotCi10eXBlZGVmIHN0cnVjdCBDaHVua1BhcnNlciB7Ci0gIHVpbnQ4X3QgaWRbNF07Ci0gIFBhcnNlU3RhdHVzICgqcGFyc2UpKFdlYlBEZW11eGVyKiBjb25zdCBkbXV4KTsKLSAgaW50ICgqdmFsaWQpKGNvbnN0IFdlYlBEZW11eGVyKiBjb25zdCBkbXV4KTsKLX0gQ2h1bmtQYXJzZXI7Ci0KLXN0YXRpYyBQYXJzZVN0YXR1cyBQYXJzZVNpbmdsZUltYWdlKFdlYlBEZW11eGVyKiBjb25zdCBkbXV4KTsKLXN0YXRpYyBQYXJzZVN0YXR1cyBQYXJzZVZQOFgoV2ViUERlbXV4ZXIqIGNvbnN0IGRtdXgpOwotc3RhdGljIGludCBJc1ZhbGlkU2ltcGxlRm9ybWF0KGNvbnN0IFdlYlBEZW11eGVyKiBjb25zdCBkbXV4KTsKLXN0YXRpYyBpbnQgSXNWYWxpZEV4dGVuZGVkRm9ybWF0KGNvbnN0IFdlYlBEZW11eGVyKiBjb25zdCBkbXV4KTsKLQotc3RhdGljIGNvbnN0IENodW5rUGFyc2VyIGtNYXN0ZXJDaHVua3NbXSA9IHsKLSAgeyB7ICdWJywgJ1AnLCAnOCcsICcgJyB9LCBQYXJzZVNpbmdsZUltYWdlLCBJc1ZhbGlkU2ltcGxlRm9ybWF0IH0sCi0gIHsgeyAnVicsICdQJywgJzgnLCAnTCcgfSwgUGFyc2VTaW5nbGVJbWFnZSwgSXNWYWxpZFNpbXBsZUZvcm1hdCB9LAotICB7IHsgJ1YnLCAnUCcsICc4JywgJ1gnIH0sIFBhcnNlVlA4WCwgICAgICAgIElzVmFsaWRFeHRlbmRlZEZvcm1hdCB9LAotICB7IHsgJzAnLCAnMCcsICcwJywgJzAnIH0sIE5VTEwsICAgICAgICAgICAgIE5VTEwgfSwKLX07Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWludCBXZWJQR2V0RGVtdXhWZXJzaW9uKHZvaWQpIHsKLSAgcmV0dXJuIChETVVYX01BSl9WRVJTSU9OIDw8IDE2KSB8IChETVVYX01JTl9WRVJTSU9OIDw8IDgpIHwgRE1VWF9SRVZfVkVSU0lPTjsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE1lbUJ1ZmZlcgotCi1zdGF0aWMgaW50IFJlbWFwTWVtQnVmZmVyKE1lbUJ1ZmZlciogY29uc3QgbWVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgewotICBpZiAoc2l6ZSA8IG1lbS0+YnVmX3NpemVfKSByZXR1cm4gMDsgIC8vIGNhbid0IHJlbWFwIHRvIGEgc2hvcnRlciBidWZmZXIhCi0KLSAgbWVtLT5idWZfID0gZGF0YTsKLSAgbWVtLT5lbmRfID0gbWVtLT5idWZfc2l6ZV8gPSBzaXplOwotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBJbml0TWVtQnVmZmVyKE1lbUJ1ZmZlciogY29uc3QgbWVtLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7Ci0gIFNiTWVtb3J5U2V0KG1lbSwgMCwgc2l6ZW9mKCptZW0pKTsKLSAgcmV0dXJuIFJlbWFwTWVtQnVmZmVyKG1lbSwgZGF0YSwgc2l6ZSk7Ci19Ci0KLS8vIFJldHVybiB0aGUgcmVtYWluaW5nIGRhdGEgc2l6ZSBhdmFpbGFibGUgaW4gJ21lbScuCi1zdGF0aWMgV0VCUF9JTkxJTkUgc2l6ZV90IE1lbURhdGFTaXplKGNvbnN0IE1lbUJ1ZmZlciogY29uc3QgbWVtKSB7Ci0gIHJldHVybiAobWVtLT5lbmRfIC0gbWVtLT5zdGFydF8pOwotfQotCi0vLyBSZXR1cm4gdHJ1ZSBpZiAnc2l6ZScgZXhjZWVkcyB0aGUgZW5kIG9mIHRoZSBSSUZGIGNodW5rLgotc3RhdGljIFdFQlBfSU5MSU5FIGludCBTaXplSXNJbnZhbGlkKGNvbnN0IE1lbUJ1ZmZlciogY29uc3QgbWVtLCBzaXplX3Qgc2l6ZSkgewotICByZXR1cm4gKHNpemUgPiBtZW0tPnJpZmZfZW5kXyAtIG1lbS0+c3RhcnRfKTsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgU2tpcChNZW1CdWZmZXIqIGNvbnN0IG1lbSwgc2l6ZV90IHNpemUpIHsKLSAgbWVtLT5zdGFydF8gKz0gc2l6ZTsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUmV3aW5kKE1lbUJ1ZmZlciogY29uc3QgbWVtLCBzaXplX3Qgc2l6ZSkgewotICBtZW0tPnN0YXJ0XyAtPSBzaXplOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgY29uc3QgdWludDhfdCogR2V0QnVmZmVyKE1lbUJ1ZmZlciogY29uc3QgbWVtKSB7Ci0gIHJldHVybiBtZW0tPmJ1Zl8gKyBtZW0tPnN0YXJ0XzsKLX0KLQotLy8gUmVhZCBmcm9tICdtZW0nIGFuZCBza2lwIHRoZSByZWFkIGJ5dGVzLgotc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ4X3QgUmVhZEJ5dGUoTWVtQnVmZmVyKiBjb25zdCBtZW0pIHsKLSAgY29uc3QgdWludDhfdCBieXRlID0gbWVtLT5idWZfW21lbS0+c3RhcnRfXTsKLSAgU2tpcChtZW0sIDEpOwotICByZXR1cm4gYnl0ZTsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIGludCBSZWFkTEUxNnMoTWVtQnVmZmVyKiBjb25zdCBtZW0pIHsKLSAgY29uc3QgdWludDhfdCogY29uc3QgZGF0YSA9IG1lbS0+YnVmXyArIG1lbS0+c3RhcnRfOwotICBjb25zdCBpbnQgdmFsID0gR2V0TEUxNihkYXRhKTsKLSAgU2tpcChtZW0sIDIpOwotICByZXR1cm4gdmFsOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IFJlYWRMRTI0cyhNZW1CdWZmZXIqIGNvbnN0IG1lbSkgewotICBjb25zdCB1aW50OF90KiBjb25zdCBkYXRhID0gbWVtLT5idWZfICsgbWVtLT5zdGFydF87Ci0gIGNvbnN0IGludCB2YWwgPSBHZXRMRTI0KGRhdGEpOwotICBTa2lwKG1lbSwgMyk7Ci0gIHJldHVybiB2YWw7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBSZWFkTEUzMihNZW1CdWZmZXIqIGNvbnN0IG1lbSkgewotICBjb25zdCB1aW50OF90KiBjb25zdCBkYXRhID0gbWVtLT5idWZfICsgbWVtLT5zdGFydF87Ci0gIGNvbnN0IHVpbnQzMl90IHZhbCA9IEdldExFMzIoZGF0YSk7Ci0gIFNraXAobWVtLCA0KTsKLSAgcmV0dXJuIHZhbDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFNlY29uZGFyeSBjaHVuayBwYXJzaW5nCi0KLXN0YXRpYyB2b2lkIEFkZENodW5rKFdlYlBEZW11eGVyKiBjb25zdCBkbXV4LCBDaHVuayogY29uc3QgY2h1bmspIHsKLSAgQ2h1bmsqKiBjID0gJmRtdXgtPmNodW5rc187Ci0gIHdoaWxlICgqYyAhPSBOVUxMKSBjID0gJigqYyktPm5leHRfOwotICAqYyA9IGNodW5rOwotICBjaHVuay0+bmV4dF8gPSBOVUxMOwotfQotCi0vLyBBZGQgYSBmcmFtZSB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LCBlbnN1cmluZyB0aGUgbGFzdCBmcmFtZSBpcyBjb21wbGV0ZS4KLS8vIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UuCi1zdGF0aWMgaW50IEFkZEZyYW1lKFdlYlBEZW11eGVyKiBjb25zdCBkbXV4LCBGcmFtZSogY29uc3QgZnJhbWUpIHsKLSAgY29uc3QgRnJhbWUqIGNvbnN0IGxhc3RfZnJhbWUgPSAqZG11eC0+ZnJhbWVzX3RhaWxfOwotICBpZiAobGFzdF9mcmFtZSAhPSBOVUxMICYmICFsYXN0X2ZyYW1lLT5jb21wbGV0ZV8pIHJldHVybiAwOwotCi0gICpkbXV4LT5mcmFtZXNfdGFpbF8gPSBmcmFtZTsKLSAgZnJhbWUtPm5leHRfID0gTlVMTDsKLSAgZG11eC0+ZnJhbWVzX3RhaWxfID0gJmZyYW1lLT5uZXh0XzsKLSAgcmV0dXJuIDE7Ci19Ci0KLS8vIFN0b3JlIGltYWdlIGJlYXJpbmcgY2h1bmtzIHRvICdmcmFtZScuCi0vLyBJZiAnaGFzX3ZwOGxfYWxwaGEnIGlzIG5vdCBOVUxMLCBpdCB3aWxsIGJlIHNldCB0byB0cnVlIGlmIHRoZSBmcmFtZSBpcyBhCi0vLyBsb3NzbGVzcyBpbWFnZSB3aXRoIGFscGhhLgotc3RhdGljIFBhcnNlU3RhdHVzIFN0b3JlRnJhbWUoaW50IGZyYW1lX251bSwgdWludDMyX3QgbWluX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1CdWZmZXIqIGNvbnN0IG1lbSwgRnJhbWUqIGNvbnN0IGZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBoYXNfdnA4bF9hbHBoYSkgewotICBpbnQgYWxwaGFfY2h1bmtzID0gMDsKLSAgaW50IGltYWdlX2NodW5rcyA9IDA7Ci0gIGludCBkb25lID0gKE1lbURhdGFTaXplKG1lbSkgPCBtaW5fc2l6ZSk7Ci0gIFBhcnNlU3RhdHVzIHN0YXR1cyA9IFBBUlNFX09LOwotCi0gIGlmIChoYXNfdnA4bF9hbHBoYSAhPSBOVUxMKSAqaGFzX3ZwOGxfYWxwaGEgPSAwOyAgLy8gRGVmYXVsdC4KLQotICBpZiAoZG9uZSkgcmV0dXJuIFBBUlNFX05FRURfTU9SRV9EQVRBOwotCi0gIGRvIHsKLSAgICBjb25zdCBzaXplX3QgY2h1bmtfc3RhcnRfb2Zmc2V0ID0gbWVtLT5zdGFydF87Ci0gICAgY29uc3QgdWludDMyX3QgZm91cmNjID0gUmVhZExFMzIobWVtKTsKLSAgICBjb25zdCB1aW50MzJfdCBwYXlsb2FkX3NpemUgPSBSZWFkTEUzMihtZW0pOwotICAgIGNvbnN0IHVpbnQzMl90IHBheWxvYWRfc2l6ZV9wYWRkZWQgPSBwYXlsb2FkX3NpemUgKyAocGF5bG9hZF9zaXplICYgMSk7Ci0gICAgY29uc3Qgc2l6ZV90IHBheWxvYWRfYXZhaWxhYmxlID0gKHBheWxvYWRfc2l6ZV9wYWRkZWQgPiBNZW1EYXRhU2l6ZShtZW0pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IE1lbURhdGFTaXplKG1lbSkgOiBwYXlsb2FkX3NpemVfcGFkZGVkOwotICAgIGNvbnN0IHNpemVfdCBjaHVua19zaXplID0gQ0hVTktfSEVBREVSX1NJWkUgKyBwYXlsb2FkX2F2YWlsYWJsZTsKLQotICAgIGlmIChwYXlsb2FkX3NpemUgPiBNQVhfQ0hVTktfUEFZTE9BRCkgcmV0dXJuIFBBUlNFX0VSUk9SOwotICAgIGlmIChTaXplSXNJbnZhbGlkKG1lbSwgcGF5bG9hZF9zaXplX3BhZGRlZCkpIHJldHVybiBQQVJTRV9FUlJPUjsKLSAgICBpZiAocGF5bG9hZF9zaXplX3BhZGRlZCA+IE1lbURhdGFTaXplKG1lbSkpIHN0YXR1cyA9IFBBUlNFX05FRURfTU9SRV9EQVRBOwotCi0gICAgc3dpdGNoIChmb3VyY2MpIHsKLSAgICAgIGNhc2UgTUtGT1VSQ0MoJ0EnLCAnTCcsICdQJywgJ0gnKToKLSAgICAgICAgaWYgKGFscGhhX2NodW5rcyA9PSAwKSB7Ci0gICAgICAgICAgKythbHBoYV9jaHVua3M7Ci0gICAgICAgICAgZnJhbWUtPmltZ19jb21wb25lbnRzX1sxXS5vZmZzZXRfID0gY2h1bmtfc3RhcnRfb2Zmc2V0OwotICAgICAgICAgIGZyYW1lLT5pbWdfY29tcG9uZW50c19bMV0uc2l6ZV8gPSBjaHVua19zaXplOwotICAgICAgICAgIGZyYW1lLT5mcmFtZV9udW1fID0gZnJhbWVfbnVtOwotICAgICAgICAgIFNraXAobWVtLCBwYXlsb2FkX2F2YWlsYWJsZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBEb25lOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBNS0ZPVVJDQygnVicsICdQJywgJzgnLCAnTCcpOgotICAgICAgICBpZiAoYWxwaGFfY2h1bmtzID4gMCkgcmV0dXJuIFBBUlNFX0VSUk9SOyAgLy8gVlA4TCBoYXMgaXRzIG93biBhbHBoYQotICAgICAgICAvLyBmYWxsIHRocm91Z2gKLSAgICAgIGNhc2UgTUtGT1VSQ0MoJ1YnLCAnUCcsICc4JywgJyAnKToKLSAgICAgICAgaWYgKGltYWdlX2NodW5rcyA9PSAwKSB7Ci0gICAgICAgICAgLy8gRXh0cmFjdCB0aGUgYml0c3RyZWFtIGZlYXR1cmVzLCB0b2xlcmF0aW5nIGZhaWx1cmVzIHdoZW4gdGhlIGRhdGEKLSAgICAgICAgICAvLyBpcyBpbmNvbXBsZXRlLgotICAgICAgICAgIFdlYlBCaXRzdHJlYW1GZWF0dXJlcyBmZWF0dXJlczsKLSAgICAgICAgICBjb25zdCBWUDhTdGF0dXNDb2RlIHZwOF9zdGF0dXMgPQotICAgICAgICAgICAgICBXZWJQR2V0RmVhdHVyZXMobWVtLT5idWZfICsgY2h1bmtfc3RhcnRfb2Zmc2V0LCBjaHVua19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZlYXR1cmVzKTsKLSAgICAgICAgICBpZiAoc3RhdHVzID09IFBBUlNFX05FRURfTU9SRV9EQVRBICYmCi0gICAgICAgICAgICAgIHZwOF9zdGF0dXMgPT0gVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEEpIHsKLSAgICAgICAgICAgIHJldHVybiBQQVJTRV9ORUVEX01PUkVfREFUQTsKLSAgICAgICAgICB9IGVsc2UgaWYgKHZwOF9zdGF0dXMgIT0gVlA4X1NUQVRVU19PSykgewotICAgICAgICAgICAgLy8gV2UgaGF2ZSBlbm91Z2ggZGF0YSwgYW5kIHlldCBXZWJQR2V0RmVhdHVyZXMoKSBmYWlsZWQuCi0gICAgICAgICAgICByZXR1cm4gUEFSU0VfRVJST1I7Ci0gICAgICAgICAgfQotICAgICAgICAgICsraW1hZ2VfY2h1bmtzOwotICAgICAgICAgIGZyYW1lLT5pbWdfY29tcG9uZW50c19bMF0ub2Zmc2V0XyA9IGNodW5rX3N0YXJ0X29mZnNldDsKLSAgICAgICAgICBmcmFtZS0+aW1nX2NvbXBvbmVudHNfWzBdLnNpemVfID0gY2h1bmtfc2l6ZTsKLSAgICAgICAgICBmcmFtZS0+d2lkdGhfID0gZmVhdHVyZXMud2lkdGg7Ci0gICAgICAgICAgZnJhbWUtPmhlaWdodF8gPSBmZWF0dXJlcy5oZWlnaHQ7Ci0gICAgICAgICAgaWYgKGhhc192cDhsX2FscGhhICE9IE5VTEwpICpoYXNfdnA4bF9hbHBoYSA9IGZlYXR1cmVzLmhhc19hbHBoYTsKLSAgICAgICAgICBmcmFtZS0+ZnJhbWVfbnVtXyA9IGZyYW1lX251bTsKLSAgICAgICAgICBmcmFtZS0+Y29tcGxldGVfID0gKHN0YXR1cyA9PSBQQVJTRV9PSyk7Ci0gICAgICAgICAgU2tpcChtZW0sIHBheWxvYWRfYXZhaWxhYmxlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIERvbmU7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gRG9uZToKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIC8vIFJlc3RvcmUgZm91cmNjL3NpemUgd2hlbiBtb3ZpbmcgdXAgb25lIGxldmVsIGluIHBhcnNpbmcuCi0gICAgICAgIFJld2luZChtZW0sIENIVU5LX0hFQURFUl9TSVpFKTsKLSAgICAgICAgZG9uZSA9IDE7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmIChtZW0tPnN0YXJ0XyA9PSBtZW0tPnJpZmZfZW5kXykgewotICAgICAgZG9uZSA9IDE7Ci0gICAgfSBlbHNlIGlmIChNZW1EYXRhU2l6ZShtZW0pIDwgQ0hVTktfSEVBREVSX1NJWkUpIHsKLSAgICAgIHN0YXR1cyA9IFBBUlNFX05FRURfTU9SRV9EQVRBOwotICAgIH0KLSAgfSB3aGlsZSAoIWRvbmUgJiYgc3RhdHVzID09IFBBUlNFX09LKTsKLQotICByZXR1cm4gc3RhdHVzOwotfQotCi0vLyBDcmVhdGVzIGEgbmV3IEZyYW1lIGlmICdhY3R1YWxfc2l6ZScgaXMgd2l0aGluIGJvdW5kcyBhbmQgJ21lbScgY29udGFpbnMKLS8vIGVub3VnaCBkYXRhICgnbWluX3NpemUnKSB0byBwYXJzZSB0aGUgcGF5bG9hZC4KLS8vIFJldHVybnMgUEFSU0VfT0sgb24gc3VjY2VzcyB3aXRoICpmcmFtZSBwb2ludGluZyB0byB0aGUgbmV3IEZyYW1lLgotLy8gUmV0dXJucyBQQVJTRV9ORUVEX01PUkVfREFUQSB3aXRoIGluc3VmZmljaWVudCBkYXRhLCBQQVJTRV9FUlJPUiBvdGhlcndpc2UuCi1zdGF0aWMgUGFyc2VTdGF0dXMgTmV3RnJhbWUoY29uc3QgTWVtQnVmZmVyKiBjb25zdCBtZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWluX3NpemUsIHVpbnQzMl90IGFjdHVhbF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lKiogZnJhbWUpIHsKLSAgaWYgKFNpemVJc0ludmFsaWQobWVtLCBtaW5fc2l6ZSkpIHJldHVybiBQQVJTRV9FUlJPUjsKLSAgaWYgKGFjdHVhbF9zaXplIDwgbWluX3NpemUpIHJldHVybiBQQVJTRV9FUlJPUjsKLSAgaWYgKE1lbURhdGFTaXplKG1lbSkgPCBtaW5fc2l6ZSkgIHJldHVybiBQQVJTRV9ORUVEX01PUkVfREFUQTsKLQotICAqZnJhbWUgPSAoRnJhbWUqKVNiTWVtb3J5Q2FsbG9jKDEsIHNpemVvZigqKmZyYW1lKSk7Ci0gIHJldHVybiAoKmZyYW1lID09IE5VTEwpID8gUEFSU0VfRVJST1IgOiBQQVJTRV9PSzsKLX0KLQotLy8gUGFyc2UgYSAnQU5NRicgY2h1bmsgYW5kIGFueSBpbWFnZSBiZWFyaW5nIGNodW5rcyB0aGF0IGltbWVkaWF0ZWx5IGZvbGxvdy4KLS8vICdmcmFtZV9jaHVua19zaXplJyBpcyB0aGUgcHJldmlvdXNseSB2YWxpZGF0ZWQsIHBhZGRlZCBjaHVuayBzaXplLgotc3RhdGljIFBhcnNlU3RhdHVzIFBhcnNlQW5pbWF0aW9uRnJhbWUoCi0gICAgV2ViUERlbXV4ZXIqIGNvbnN0IGRtdXgsIHVpbnQzMl90IGZyYW1lX2NodW5rX3NpemUpIHsKLSAgY29uc3QgaW50IGhhc19mcmFtZXMgPSAhIShkbXV4LT5mZWF0dXJlX2ZsYWdzXyAmIEFOSU1BVElPTl9GTEFHKTsKLSAgY29uc3QgdWludDMyX3QgYW5tZl9wYXlsb2FkX3NpemUgPSBmcmFtZV9jaHVua19zaXplIC0gQU5NRl9DSFVOS19TSVpFOwotICBpbnQgYWRkZWRfZnJhbWUgPSAwOwotICBNZW1CdWZmZXIqIGNvbnN0IG1lbSA9ICZkbXV4LT5tZW1fOwotICBGcmFtZSogZnJhbWU7Ci0gIFBhcnNlU3RhdHVzIHN0YXR1cyA9Ci0gICAgICBOZXdGcmFtZShtZW0sIEFOTUZfQ0hVTktfU0laRSwgZnJhbWVfY2h1bmtfc2l6ZSwgJmZyYW1lKTsKLSAgaWYgKHN0YXR1cyAhPSBQQVJTRV9PSykgcmV0dXJuIHN0YXR1czsKLQotICBmcmFtZS0+eF9vZmZzZXRfICAgICAgID0gMiAqIFJlYWRMRTI0cyhtZW0pOwotICBmcmFtZS0+eV9vZmZzZXRfICAgICAgID0gMiAqIFJlYWRMRTI0cyhtZW0pOwotICBmcmFtZS0+d2lkdGhfICAgICAgICAgID0gMSArIFJlYWRMRTI0cyhtZW0pOwotICBmcmFtZS0+aGVpZ2h0XyAgICAgICAgID0gMSArIFJlYWRMRTI0cyhtZW0pOwotICBmcmFtZS0+ZHVyYXRpb25fICAgICAgID0gUmVhZExFMjRzKG1lbSk7Ci0gIGZyYW1lLT5kaXNwb3NlX21ldGhvZF8gPSAoV2ViUE11eEFuaW1EaXNwb3NlKShSZWFkQnl0ZShtZW0pICYgMSk7Ci0gIGlmIChmcmFtZS0+d2lkdGhfICogKHVpbnQ2NF90KWZyYW1lLT5oZWlnaHRfID49IE1BWF9JTUFHRV9BUkVBKSB7Ci0gICAgU2JNZW1vcnlEZWFsbG9jYXRlKGZyYW1lKTsKLSAgICByZXR1cm4gUEFSU0VfRVJST1I7Ci0gIH0KLQotICAvLyBTdG9yZSBhIGZyYW1lIG9ubHkgaWYgdGhlIGFuaW1hdGlvbiBmbGFnIGlzIHNldCB0aGVyZSBpcyBzb21lIGRhdGEgZm9yCi0gIC8vIHRoaXMgZnJhbWUgaXMgYXZhaWxhYmxlLgotICBzdGF0dXMgPSBTdG9yZUZyYW1lKGRtdXgtPm51bV9mcmFtZXNfICsgMSwgYW5tZl9wYXlsb2FkX3NpemUsIG1lbSwgZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gIGlmIChzdGF0dXMgIT0gUEFSU0VfRVJST1IgJiYgaGFzX2ZyYW1lcyAmJiBmcmFtZS0+ZnJhbWVfbnVtXyA+IDApIHsKLSAgICBhZGRlZF9mcmFtZSA9IEFkZEZyYW1lKGRtdXgsIGZyYW1lKTsKLSAgICBpZiAoYWRkZWRfZnJhbWUpIHsKLSAgICAgICsrZG11eC0+bnVtX2ZyYW1lc187Ci0gICAgfSBlbHNlIHsKLSAgICAgIHN0YXR1cyA9IFBBUlNFX0VSUk9SOwotICAgIH0KLSAgfQotCi0gIGlmICghYWRkZWRfZnJhbWUpIFNiTWVtb3J5RGVhbGxvY2F0ZShmcmFtZSk7Ci0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLSNpZmRlZiBXRUJQX0VYUEVSSU1FTlRBTF9GRUFUVVJFUwotLy8gUGFyc2UgYSAnRlJHTScgY2h1bmsgYW5kIGFueSBpbWFnZSBiZWFyaW5nIGNodW5rcyB0aGF0IGltbWVkaWF0ZWx5IGZvbGxvdy4KLS8vICdmcmFnbWVudF9jaHVua19zaXplJyBpcyB0aGUgcHJldmlvdXNseSB2YWxpZGF0ZWQsIHBhZGRlZCBjaHVuayBzaXplLgotc3RhdGljIFBhcnNlU3RhdHVzIFBhcnNlRnJhZ21lbnQoV2ViUERlbXV4ZXIqIGNvbnN0IGRtdXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmcmFnbWVudF9jaHVua19zaXplKSB7Ci0gIGNvbnN0IGludCBmcmFtZV9udW0gPSAxOyAgLy8gQWxsIGZyYWdtZW50cyBiZWxvbmcgdG8gdGhlIDFzdCAoYW5kIG9ubHkpIGZyYW1lLgotICBjb25zdCBpbnQgaGFzX2ZyYWdtZW50cyA9ICEhKGRtdXgtPmZlYXR1cmVfZmxhZ3NfICYgRlJBR01FTlRTX0ZMQUcpOwotICBjb25zdCB1aW50MzJfdCBmcmdtX3BheWxvYWRfc2l6ZSA9IGZyYWdtZW50X2NodW5rX3NpemUgLSBGUkdNX0NIVU5LX1NJWkU7Ci0gIGludCBhZGRlZF9mcmFnbWVudCA9IDA7Ci0gIE1lbUJ1ZmZlciogY29uc3QgbWVtID0gJmRtdXgtPm1lbV87Ci0gIEZyYW1lKiBmcmFtZTsKLSAgUGFyc2VTdGF0dXMgc3RhdHVzID0KLSAgICAgIE5ld0ZyYW1lKG1lbSwgRlJHTV9DSFVOS19TSVpFLCBmcmFnbWVudF9jaHVua19zaXplLCAmZnJhbWUpOwotICBpZiAoc3RhdHVzICE9IFBBUlNFX09LKSByZXR1cm4gc3RhdHVzOwotCi0gIGZyYW1lLT5pc19mcmFnbWVudF8gPSAxOwotICBmcmFtZS0+eF9vZmZzZXRfID0gMiAqIFJlYWRMRTI0cyhtZW0pOwotICBmcmFtZS0+eV9vZmZzZXRfID0gMiAqIFJlYWRMRTI0cyhtZW0pOwotCi0gIC8vIFN0b3JlIGEgZnJhZ21lbnQgb25seSBpZiB0aGUgZnJhZ21lbnRzIGZsYWcgaXMgc2V0IHRoZXJlIGlzIHNvbWUgZGF0YSBmb3IKLSAgLy8gdGhpcyBmcmFnbWVudCBpcyBhdmFpbGFibGUuCi0gIHN0YXR1cyA9IFN0b3JlRnJhbWUoZnJhbWVfbnVtLCBmcmdtX3BheWxvYWRfc2l6ZSwgbWVtLCBmcmFtZSwgTlVMTCk7Ci0gIGlmIChzdGF0dXMgIT0gUEFSU0VfRVJST1IgJiYgaGFzX2ZyYWdtZW50cyAmJiBmcmFtZS0+ZnJhbWVfbnVtXyA+IDApIHsKLSAgICBhZGRlZF9mcmFnbWVudCA9IEFkZEZyYW1lKGRtdXgsIGZyYW1lKTsKLSAgICBpZiAoIWFkZGVkX2ZyYWdtZW50KSB7Ci0gICAgICBzdGF0dXMgPSBQQVJTRV9FUlJPUjsKLSAgICB9IGVsc2UgewotICAgICAgZG11eC0+bnVtX2ZyYW1lc18gPSAxOwotICAgIH0KLSAgfQotCi0gIGlmICghYWRkZWRfZnJhZ21lbnQpIFNiTWVtb3J5RGVhbGxvY2F0ZShmcmFtZSk7Ci0gIHJldHVybiBzdGF0dXM7Ci19Ci0jZW5kaWYgIC8vIFdFQlBfRVhQRVJJTUVOVEFMX0ZFQVRVUkVTCi0KLS8vIEdlbmVyYWwgY2h1bmsgc3RvcmFnZSwgc3RhcnRpbmcgd2l0aCB0aGUgaGVhZGVyIGF0ICdzdGFydF9vZmZzZXQnLCBhbGxvd2luZwotLy8gdGhlIHVzZXIgdG8gcmVxdWVzdCB0aGUgcGF5bG9hZCB2aWEgYSBmb3VyY2Mgc3RyaW5nLiAnc2l6ZScgaW5jbHVkZXMgdGhlCi0vLyBoZWFkZXIgYW5kIHRoZSB1bnBhZGRlZCBwYXlsb2FkIHNpemUuCi0vLyBSZXR1cm5zIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlLgotc3RhdGljIGludCBTdG9yZUNodW5rKFdlYlBEZW11eGVyKiBjb25zdCBkbXV4LAotICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzdGFydF9vZmZzZXQsIHVpbnQzMl90IHNpemUpIHsKLSAgQ2h1bmsqIGNvbnN0IGNodW5rID0gKENodW5rKilTYk1lbW9yeUNhbGxvYygxLCBzaXplb2YoKmNodW5rKSk7Ci0gIGlmIChjaHVuayA9PSBOVUxMKSByZXR1cm4gMDsKLQotICBjaHVuay0+ZGF0YV8ub2Zmc2V0XyA9IHN0YXJ0X29mZnNldDsKLSAgY2h1bmstPmRhdGFfLnNpemVfID0gc2l6ZTsKLSAgQWRkQ2h1bmsoZG11eCwgY2h1bmspOwotICByZXR1cm4gMTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFByaW1hcnkgY2h1bmsgcGFyc2luZwotCi1zdGF0aWMgaW50IFJlYWRIZWFkZXIoTWVtQnVmZmVyKiBjb25zdCBtZW0pIHsKLSAgY29uc3Qgc2l6ZV90IG1pbl9zaXplID0gUklGRl9IRUFERVJfU0laRSArIENIVU5LX0hFQURFUl9TSVpFOwotICB1aW50MzJfdCByaWZmX3NpemU7Ci0KLSAgLy8gQmFzaWMgZmlsZSBsZXZlbCB2YWxpZGF0aW9uLgotICBpZiAoTWVtRGF0YVNpemUobWVtKSA8IG1pbl9zaXplKSByZXR1cm4gMDsKLSAgaWYgKFNiTWVtb3J5Q29tcGFyZShHZXRCdWZmZXIobWVtKSwgIlJJRkYiLCBDSFVOS19TSVpFX0JZVEVTKSB8fAotICAgICAgU2JNZW1vcnlDb21wYXJlKEdldEJ1ZmZlcihtZW0pICsgQ0hVTktfSEVBREVSX1NJWkUsICJXRUJQIiwgQ0hVTktfU0laRV9CWVRFUykpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHJpZmZfc2l6ZSA9IEdldExFMzIoR2V0QnVmZmVyKG1lbSkgKyBUQUdfU0laRSk7Ci0gIGlmIChyaWZmX3NpemUgPCBDSFVOS19IRUFERVJfU0laRSkgcmV0dXJuIDA7Ci0gIGlmIChyaWZmX3NpemUgPiBNQVhfQ0hVTktfUEFZTE9BRCkgcmV0dXJuIDA7Ci0KLSAgLy8gVGhlcmUncyBubyBwb2ludCBpbiByZWFkaW5nIHBhc3QgdGhlIGVuZCBvZiB0aGUgUklGRiBjaHVuawotICBtZW0tPnJpZmZfZW5kXyA9IHJpZmZfc2l6ZSArIENIVU5LX0hFQURFUl9TSVpFOwotICBpZiAobWVtLT5idWZfc2l6ZV8gPiBtZW0tPnJpZmZfZW5kXykgewotICAgIG1lbS0+YnVmX3NpemVfID0gbWVtLT5lbmRfID0gbWVtLT5yaWZmX2VuZF87Ci0gIH0KLQotICBTa2lwKG1lbSwgUklGRl9IRUFERVJfU0laRSk7Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgUGFyc2VTdGF0dXMgUGFyc2VTaW5nbGVJbWFnZShXZWJQRGVtdXhlciogY29uc3QgZG11eCkgewotICBjb25zdCBzaXplX3QgbWluX3NpemUgPSBDSFVOS19IRUFERVJfU0laRTsKLSAgTWVtQnVmZmVyKiBjb25zdCBtZW0gPSAmZG11eC0+bWVtXzsKLSAgRnJhbWUqIGZyYW1lOwotICBQYXJzZVN0YXR1cyBzdGF0dXM7Ci0gIGludCBoYXNfdnA4bF9hbHBoYSA9IDA7ICAvLyBGcmFtZSBjb250YWlucyBhIGxvc3NsZXNzIGltYWdlIHdpdGggYWxwaGEuCi0KLSAgaWYgKGRtdXgtPmZyYW1lc18gIT0gTlVMTCkgcmV0dXJuIFBBUlNFX0VSUk9SOwotICBpZiAoU2l6ZUlzSW52YWxpZChtZW0sIG1pbl9zaXplKSkgcmV0dXJuIFBBUlNFX0VSUk9SOwotICBpZiAoTWVtRGF0YVNpemUobWVtKSA8IG1pbl9zaXplKSByZXR1cm4gUEFSU0VfTkVFRF9NT1JFX0RBVEE7Ci0KLSAgZnJhbWUgPSAoRnJhbWUqKVNiTWVtb3J5Q2FsbG9jKDEsIHNpemVvZigqZnJhbWUpKTsKLSAgaWYgKGZyYW1lID09IE5VTEwpIHJldHVybiBQQVJTRV9FUlJPUjsKLQotICAvLyBGb3IgdGhlIHNpbmdsZSBpbWFnZSBjYXNlIHdlIGFsbG93IHBhcnNpbmcgb2YgYSBwYXJ0aWFsIGZyYW1lLCBidXQgd2UgbmVlZAotICAvLyBhdCBsZWFzdCBDSFVOS19IRUFERVJfU0laRSBmb3IgcGFyc2luZy4KLSAgc3RhdHVzID0gU3RvcmVGcmFtZSgxLCBDSFVOS19IRUFERVJfU0laRSwgJmRtdXgtPm1lbV8sIGZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICZoYXNfdnA4bF9hbHBoYSk7Ci0gIGlmIChzdGF0dXMgIT0gUEFSU0VfRVJST1IpIHsKLSAgICBjb25zdCBpbnQgaGFzX2FscGhhID0gISEoZG11eC0+ZmVhdHVyZV9mbGFnc18gJiBBTFBIQV9GTEFHKTsKLSAgICAvLyBDbGVhciBhbnkgYWxwaGEgd2hlbiB0aGUgYWxwaGEgZmxhZyBpcyBtaXNzaW5nLgotICAgIGlmICghaGFzX2FscGhhICYmIGZyYW1lLT5pbWdfY29tcG9uZW50c19bMV0uc2l6ZV8gPiAwKSB7Ci0gICAgICBmcmFtZS0+aW1nX2NvbXBvbmVudHNfWzFdLm9mZnNldF8gPSAwOwotICAgICAgZnJhbWUtPmltZ19jb21wb25lbnRzX1sxXS5zaXplXyA9IDA7Ci0gICAgfQotCi0gICAgLy8gVXNlIHRoZSBmcmFtZSB3aWR0aC9oZWlnaHQgYXMgdGhlIGNhbnZhcyB2YWx1ZXMgZm9yIG5vbi12cDh4IGZpbGVzLgotICAgIC8vIEFsc28sIHNldCBBTFBIQV9GTEFHIGlmIHRoaXMgaXMgYSBsb3NzbGVzcyBpbWFnZSB3aXRoIGFscGhhLgotICAgIGlmICghZG11eC0+aXNfZXh0X2Zvcm1hdF8gJiYgZnJhbWUtPndpZHRoXyA+IDAgJiYgZnJhbWUtPmhlaWdodF8gPiAwKSB7Ci0gICAgICBkbXV4LT5zdGF0ZV8gPSBXRUJQX0RFTVVYX1BBUlNFRF9IRUFERVI7Ci0gICAgICBkbXV4LT5jYW52YXNfd2lkdGhfID0gZnJhbWUtPndpZHRoXzsKLSAgICAgIGRtdXgtPmNhbnZhc19oZWlnaHRfID0gZnJhbWUtPmhlaWdodF87Ci0gICAgICBkbXV4LT5mZWF0dXJlX2ZsYWdzXyB8PSBoYXNfdnA4bF9hbHBoYSA/IEFMUEhBX0ZMQUcgOiAwOwotICAgIH0KLSAgICBBZGRGcmFtZShkbXV4LCBmcmFtZSk7Ci0gICAgZG11eC0+bnVtX2ZyYW1lc18gPSAxOwotICB9IGVsc2UgewotICAgIFNiTWVtb3J5RGVhbGxvY2F0ZShmcmFtZSk7Ci0gIH0KLQotICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgUGFyc2VTdGF0dXMgUGFyc2VWUDhYKFdlYlBEZW11eGVyKiBjb25zdCBkbXV4KSB7Ci0gIE1lbUJ1ZmZlciogY29uc3QgbWVtID0gJmRtdXgtPm1lbV87Ci0gIGludCBhbmltX2NodW5rcyA9IDA7Ci0gIHVpbnQzMl90IHZwOHhfc2l6ZTsKLSAgUGFyc2VTdGF0dXMgc3RhdHVzID0gUEFSU0VfT0s7Ci0KLSAgaWYgKE1lbURhdGFTaXplKG1lbSkgPCBDSFVOS19IRUFERVJfU0laRSkgcmV0dXJuIFBBUlNFX05FRURfTU9SRV9EQVRBOwotCi0gIGRtdXgtPmlzX2V4dF9mb3JtYXRfID0gMTsKLSAgU2tpcChtZW0sIFRBR19TSVpFKTsgIC8vIFZQOFgKLSAgdnA4eF9zaXplID0gUmVhZExFMzIobWVtKTsKLSAgaWYgKHZwOHhfc2l6ZSA+IE1BWF9DSFVOS19QQVlMT0FEKSByZXR1cm4gUEFSU0VfRVJST1I7Ci0gIGlmICh2cDh4X3NpemUgPCBWUDhYX0NIVU5LX1NJWkUpIHJldHVybiBQQVJTRV9FUlJPUjsKLSAgdnA4eF9zaXplICs9IHZwOHhfc2l6ZSAmIDE7Ci0gIGlmIChTaXplSXNJbnZhbGlkKG1lbSwgdnA4eF9zaXplKSkgcmV0dXJuIFBBUlNFX0VSUk9SOwotICBpZiAoTWVtRGF0YVNpemUobWVtKSA8IHZwOHhfc2l6ZSkgcmV0dXJuIFBBUlNFX05FRURfTU9SRV9EQVRBOwotCi0gIGRtdXgtPmZlYXR1cmVfZmxhZ3NfID0gUmVhZEJ5dGUobWVtKTsKLSAgU2tpcChtZW0sIDMpOyAgLy8gUmVzZXJ2ZWQuCi0gIGRtdXgtPmNhbnZhc193aWR0aF8gID0gMSArIFJlYWRMRTI0cyhtZW0pOwotICBkbXV4LT5jYW52YXNfaGVpZ2h0XyA9IDEgKyBSZWFkTEUyNHMobWVtKTsKLSAgaWYgKGRtdXgtPmNhbnZhc193aWR0aF8gKiAodWludDY0X3QpZG11eC0+Y2FudmFzX2hlaWdodF8gPj0gTUFYX0lNQUdFX0FSRUEpIHsKLSAgICByZXR1cm4gUEFSU0VfRVJST1I7ICAvLyBpbWFnZSBmaW5hbCBkaW1lbnNpb24gaXMgdG9vIGxhcmdlCi0gIH0KLSAgU2tpcChtZW0sIHZwOHhfc2l6ZSAtIFZQOFhfQ0hVTktfU0laRSk7ICAvLyBza2lwIGFueSB0cmFpbGluZyBkYXRhLgotICBkbXV4LT5zdGF0ZV8gPSBXRUJQX0RFTVVYX1BBUlNFRF9IRUFERVI7Ci0KLSAgaWYgKFNpemVJc0ludmFsaWQobWVtLCBDSFVOS19IRUFERVJfU0laRSkpIHJldHVybiBQQVJTRV9FUlJPUjsKLSAgaWYgKE1lbURhdGFTaXplKG1lbSkgPCBDSFVOS19IRUFERVJfU0laRSkgcmV0dXJuIFBBUlNFX05FRURfTU9SRV9EQVRBOwotCi0gIGRvIHsKLSAgICBpbnQgc3RvcmVfY2h1bmsgPSAxOwotICAgIGNvbnN0IHNpemVfdCBjaHVua19zdGFydF9vZmZzZXQgPSBtZW0tPnN0YXJ0XzsKLSAgICBjb25zdCB1aW50MzJfdCBmb3VyY2MgPSBSZWFkTEUzMihtZW0pOwotICAgIGNvbnN0IHVpbnQzMl90IGNodW5rX3NpemUgPSBSZWFkTEUzMihtZW0pOwotICAgIGNvbnN0IHVpbnQzMl90IGNodW5rX3NpemVfcGFkZGVkID0gY2h1bmtfc2l6ZSArIChjaHVua19zaXplICYgMSk7Ci0KLSAgICBpZiAoY2h1bmtfc2l6ZSA+IE1BWF9DSFVOS19QQVlMT0FEKSByZXR1cm4gUEFSU0VfRVJST1I7Ci0gICAgaWYgKFNpemVJc0ludmFsaWQobWVtLCBjaHVua19zaXplX3BhZGRlZCkpIHJldHVybiBQQVJTRV9FUlJPUjsKLQotICAgIHN3aXRjaCAoZm91cmNjKSB7Ci0gICAgICBjYXNlIE1LRk9VUkNDKCdWJywgJ1AnLCAnOCcsICdYJyk6IHsKLSAgICAgICAgcmV0dXJuIFBBUlNFX0VSUk9SOwotICAgICAgfQotICAgICAgY2FzZSBNS0ZPVVJDQygnQScsICdMJywgJ1AnLCAnSCcpOgotICAgICAgY2FzZSBNS0ZPVVJDQygnVicsICdQJywgJzgnLCAnICcpOgotICAgICAgY2FzZSBNS0ZPVVJDQygnVicsICdQJywgJzgnLCAnTCcpOiB7Ci0gICAgICAgIC8vIGNoZWNrIHRoYXQgdGhpcyBpc24ndCBhbiBhbmltYXRpb24gKGFsbCBmcmFtZXMgc2hvdWxkIGJlIGluIGFuIEFOTUYpLgotICAgICAgICBpZiAoYW5pbV9jaHVua3MgPiAwKSByZXR1cm4gUEFSU0VfRVJST1I7Ci0KLSAgICAgICAgUmV3aW5kKG1lbSwgQ0hVTktfSEVBREVSX1NJWkUpOwotICAgICAgICBzdGF0dXMgPSBQYXJzZVNpbmdsZUltYWdlKGRtdXgpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgTUtGT1VSQ0MoJ0EnLCAnTicsICdJJywgJ00nKTogewotICAgICAgICBpZiAoY2h1bmtfc2l6ZV9wYWRkZWQgPCBBTklNX0NIVU5LX1NJWkUpIHJldHVybiBQQVJTRV9FUlJPUjsKLQotICAgICAgICBpZiAoTWVtRGF0YVNpemUobWVtKSA8IGNodW5rX3NpemVfcGFkZGVkKSB7Ci0gICAgICAgICAgc3RhdHVzID0gUEFSU0VfTkVFRF9NT1JFX0RBVEE7Ci0gICAgICAgIH0gZWxzZSBpZiAoYW5pbV9jaHVua3MgPT0gMCkgewotICAgICAgICAgICsrYW5pbV9jaHVua3M7Ci0gICAgICAgICAgZG11eC0+Ymdjb2xvcl8gPSBSZWFkTEUzMihtZW0pOwotICAgICAgICAgIGRtdXgtPmxvb3BfY291bnRfID0gUmVhZExFMTZzKG1lbSk7Ci0gICAgICAgICAgU2tpcChtZW0sIGNodW5rX3NpemVfcGFkZGVkIC0gQU5JTV9DSFVOS19TSVpFKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzdG9yZV9jaHVuayA9IDA7Ci0gICAgICAgICAgZ290byBTa2lwOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBNS0ZPVVJDQygnQScsICdOJywgJ00nLCAnRicpOiB7Ci0gICAgICAgIGlmIChhbmltX2NodW5rcyA9PSAwKSByZXR1cm4gUEFSU0VfRVJST1I7ICAvLyAnQU5JTScgcHJlY2VkZXMgZnJhbWVzLgotICAgICAgICBzdGF0dXMgPSBQYXJzZUFuaW1hdGlvbkZyYW1lKGRtdXgsIGNodW5rX3NpemVfcGFkZGVkKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0jaWZkZWYgV0VCUF9FWFBFUklNRU5UQUxfRkVBVFVSRVMKLSAgICAgIGNhc2UgTUtGT1VSQ0MoJ0YnLCAnUicsICdHJywgJ00nKTogewotICAgICAgICBzdGF0dXMgPSBQYXJzZUZyYWdtZW50KGRtdXgsIGNodW5rX3NpemVfcGFkZGVkKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0jZW5kaWYKLSAgICAgIGNhc2UgTUtGT1VSQ0MoJ0knLCAnQycsICdDJywgJ1AnKTogewotICAgICAgICBzdG9yZV9jaHVuayA9ICEhKGRtdXgtPmZlYXR1cmVfZmxhZ3NfICYgSUNDUF9GTEFHKTsKLSAgICAgICAgZ290byBTa2lwOwotICAgICAgfQotICAgICAgY2FzZSBNS0ZPVVJDQygnWCcsICdNJywgJ1AnLCAnICcpOiB7Ci0gICAgICAgIHN0b3JlX2NodW5rID0gISEoZG11eC0+ZmVhdHVyZV9mbGFnc18gJiBYTVBfRkxBRyk7Ci0gICAgICAgIGdvdG8gU2tpcDsKLSAgICAgIH0KLSAgICAgIGNhc2UgTUtGT1VSQ0MoJ0UnLCAnWCcsICdJJywgJ0YnKTogewotICAgICAgICBzdG9yZV9jaHVuayA9ICEhKGRtdXgtPmZlYXR1cmVfZmxhZ3NfICYgRVhJRl9GTEFHKTsKLSAgICAgICAgZ290byBTa2lwOwotICAgICAgfQotIFNraXA6Ci0gICAgICBkZWZhdWx0OiB7Ci0gICAgICAgIGlmIChjaHVua19zaXplX3BhZGRlZCA8PSBNZW1EYXRhU2l6ZShtZW0pKSB7Ci0gICAgICAgICAgaWYgKHN0b3JlX2NodW5rKSB7Ci0gICAgICAgICAgICAvLyBTdG9yZSBvbmx5IHRoZSBjaHVuayBoZWFkZXIgYW5kIHVucGFkZGVkIHNpemUgYXMgb25seSB0aGUgcGF5bG9hZAotICAgICAgICAgICAgLy8gd2lsbCBiZSByZXR1cm5lZCB0byB0aGUgdXNlci4KLSAgICAgICAgICAgIGlmICghU3RvcmVDaHVuayhkbXV4LCBjaHVua19zdGFydF9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hVTktfSEVBREVSX1NJWkUgKyBjaHVua19zaXplKSkgewotICAgICAgICAgICAgICByZXR1cm4gUEFSU0VfRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIFNraXAobWVtLCBjaHVua19zaXplX3BhZGRlZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgc3RhdHVzID0gUEFSU0VfTkVFRF9NT1JFX0RBVEE7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobWVtLT5zdGFydF8gPT0gbWVtLT5yaWZmX2VuZF8pIHsKLSAgICAgIGJyZWFrOwotICAgIH0gZWxzZSBpZiAoTWVtRGF0YVNpemUobWVtKSA8IENIVU5LX0hFQURFUl9TSVpFKSB7Ci0gICAgICBzdGF0dXMgPSBQQVJTRV9ORUVEX01PUkVfREFUQTsKLSAgICB9Ci0gIH0gd2hpbGUgKHN0YXR1cyA9PSBQQVJTRV9PSyk7Ci0KLSAgcmV0dXJuIHN0YXR1czsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEZvcm1hdCB2YWxpZGF0aW9uCi0KLXN0YXRpYyBpbnQgSXNWYWxpZFNpbXBsZUZvcm1hdChjb25zdCBXZWJQRGVtdXhlciogY29uc3QgZG11eCkgewotICBjb25zdCBGcmFtZSogY29uc3QgZnJhbWUgPSBkbXV4LT5mcmFtZXNfOwotICBpZiAoZG11eC0+c3RhdGVfID09IFdFQlBfREVNVVhfUEFSU0lOR19IRUFERVIpIHJldHVybiAxOwotCi0gIGlmIChkbXV4LT5jYW52YXNfd2lkdGhfIDw9IDAgfHwgZG11eC0+Y2FudmFzX2hlaWdodF8gPD0gMCkgcmV0dXJuIDA7Ci0gIGlmIChkbXV4LT5zdGF0ZV8gPT0gV0VCUF9ERU1VWF9ET05FICYmIGZyYW1lID09IE5VTEwpIHJldHVybiAwOwotCi0gIGlmIChmcmFtZS0+d2lkdGhfIDw9IDAgfHwgZnJhbWUtPmhlaWdodF8gPD0gMCkgcmV0dXJuIDA7Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IElzVmFsaWRFeHRlbmRlZEZvcm1hdChjb25zdCBXZWJQRGVtdXhlciogY29uc3QgZG11eCkgewotICBjb25zdCBpbnQgaGFzX2ZyYWdtZW50cyA9ICEhKGRtdXgtPmZlYXR1cmVfZmxhZ3NfICYgRlJBR01FTlRTX0ZMQUcpOwotICBjb25zdCBpbnQgaGFzX2ZyYW1lcyA9ICEhKGRtdXgtPmZlYXR1cmVfZmxhZ3NfICYgQU5JTUFUSU9OX0ZMQUcpOwotICBjb25zdCBGcmFtZSogZjsKLQotICBpZiAoZG11eC0+c3RhdGVfID09IFdFQlBfREVNVVhfUEFSU0lOR19IRUFERVIpIHJldHVybiAxOwotCi0gIGlmIChkbXV4LT5jYW52YXNfd2lkdGhfIDw9IDAgfHwgZG11eC0+Y2FudmFzX2hlaWdodF8gPD0gMCkgcmV0dXJuIDA7Ci0gIGlmIChkbXV4LT5sb29wX2NvdW50XyA8IDApIHJldHVybiAwOwotICBpZiAoZG11eC0+c3RhdGVfID09IFdFQlBfREVNVVhfRE9ORSAmJiBkbXV4LT5mcmFtZXNfID09IE5VTEwpIHJldHVybiAwOwotCi0gIGZvciAoZiA9IGRtdXgtPmZyYW1lc187IGYgIT0gTlVMTDsgZiA9IGYtPm5leHRfKSB7Ci0gICAgY29uc3QgaW50IGN1cl9mcmFtZV9zZXQgPSBmLT5mcmFtZV9udW1fOwotICAgIGludCBmcmFtZV9jb3VudCA9IDAsIGZyYWdtZW50X2NvdW50ID0gMDsKLQotICAgIC8vIENoZWNrIGZyYW1lIHByb3BlcnRpZXMgYW5kIGlmIHRoZSBpbWFnZSBpcyBjb21wb3NlZCBvZiBmcmFnbWVudHMgdGhhdAotICAgIC8vIGVhY2ggZnJhZ21lbnQgY2FtZSBmcm9tIGEgZnJhZ21lbnQuCi0gICAgZm9yICg7IGYgIT0gTlVMTCAmJiBmLT5mcmFtZV9udW1fID09IGN1cl9mcmFtZV9zZXQ7IGYgPSBmLT5uZXh0XykgewotICAgICAgY29uc3QgQ2h1bmtEYXRhKiBjb25zdCBpbWFnZSA9IGYtPmltZ19jb21wb25lbnRzXzsKLSAgICAgIGNvbnN0IENodW5rRGF0YSogY29uc3QgYWxwaGEgPSBmLT5pbWdfY29tcG9uZW50c18gKyAxOwotCi0gICAgICBpZiAoIWhhc19mcmFnbWVudHMgJiYgZi0+aXNfZnJhZ21lbnRfKSByZXR1cm4gMDsKLSAgICAgIGlmICghaGFzX2ZyYW1lcyAmJiBmLT5mcmFtZV9udW1fID4gMSkgcmV0dXJuIDA7Ci0gICAgICBpZiAoZi0+eF9vZmZzZXRfIDwgMCB8fCBmLT55X29mZnNldF8gPCAwKSByZXR1cm4gMDsKLSAgICAgIGlmIChmLT5jb21wbGV0ZV8pIHsKLSAgICAgICAgaWYgKGFscGhhLT5zaXplXyA9PSAwICYmIGltYWdlLT5zaXplXyA9PSAwKSByZXR1cm4gMDsKLSAgICAgICAgLy8gRW5zdXJlIGFscGhhIHByZWNlZGVzIGltYWdlIGJpdHN0cmVhbS4KLSAgICAgICAgaWYgKGFscGhhLT5zaXplXyA+IDAgJiYgYWxwaGEtPm9mZnNldF8gPiBpbWFnZS0+b2Zmc2V0XykgewotICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGYtPndpZHRoXyA8PSAwIHx8IGYtPmhlaWdodF8gPD0gMCkgcmV0dXJuIDA7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBUaGVyZSBzaG91bGRuJ3QgYmUgYSBwYXJ0aWFsIGZyYW1lIGluIGEgY29tcGxldGUgZmlsZS4KLSAgICAgICAgaWYgKGRtdXgtPnN0YXRlXyA9PSBXRUJQX0RFTVVYX0RPTkUpIHJldHVybiAwOwotCi0gICAgICAgIC8vIEVuc3VyZSBhbHBoYSBwcmVjZWRlcyBpbWFnZSBiaXRzdHJlYW0uCi0gICAgICAgIGlmIChhbHBoYS0+c2l6ZV8gPiAwICYmIGltYWdlLT5zaXplXyA+IDAgJiYKLSAgICAgICAgICAgIGFscGhhLT5vZmZzZXRfID4gaW1hZ2UtPm9mZnNldF8pIHsKLSAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICAvLyBUaGVyZSBzaG91bGRuJ3QgYmUgYW55IGZyYW1lcyBhZnRlciBhbiBpbmNvbXBsZXRlIG9uZS4KLSAgICAgICAgaWYgKGYtPm5leHRfICE9IE5VTEwpIHJldHVybiAwOwotICAgICAgfQotCi0gICAgICBmcmFnbWVudF9jb3VudCArPSBmLT5pc19mcmFnbWVudF87Ci0gICAgICArK2ZyYW1lX2NvdW50OwotICAgIH0KLSAgICBpZiAoIWhhc19mcmFnbWVudHMgJiYgZnJhbWVfY291bnQgPiAxKSByZXR1cm4gMDsKLSAgICBpZiAoZnJhZ21lbnRfY291bnQgPiAwICYmIGZyYW1lX2NvdW50ICE9IGZyYWdtZW50X2NvdW50KSByZXR1cm4gMDsKLSAgICBpZiAoZiA9PSBOVUxMKSBicmVhazsKLSAgfQotICByZXR1cm4gMTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFdlYlBEZW11eGVyIG9iamVjdAotCi1zdGF0aWMgdm9pZCBJbml0RGVtdXgoV2ViUERlbXV4ZXIqIGNvbnN0IGRtdXgsIGNvbnN0IE1lbUJ1ZmZlciogY29uc3QgbWVtKSB7Ci0gIGRtdXgtPnN0YXRlXyA9IFdFQlBfREVNVVhfUEFSU0lOR19IRUFERVI7Ci0gIGRtdXgtPmxvb3BfY291bnRfID0gMTsKLSAgZG11eC0+Ymdjb2xvcl8gPSAweEZGRkZGRkZGOyAgLy8gV2hpdGUgYmFja2dyb3VuZCBieSBkZWZhdWx0LgotICBkbXV4LT5jYW52YXNfd2lkdGhfID0gLTE7Ci0gIGRtdXgtPmNhbnZhc19oZWlnaHRfID0gLTE7Ci0gIGRtdXgtPmZyYW1lc190YWlsXyA9ICZkbXV4LT5mcmFtZXNfOwotICBkbXV4LT5tZW1fID0gKm1lbTsKLX0KLQotV2ViUERlbXV4ZXIqIFdlYlBEZW11eEludGVybmFsKGNvbnN0IFdlYlBEYXRhKiBkYXRhLCBpbnQgYWxsb3dfcGFydGlhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQRGVtdXhTdGF0ZSogc3RhdGUsIGludCB2ZXJzaW9uKSB7Ci0gIGNvbnN0IENodW5rUGFyc2VyKiBwYXJzZXI7Ci0gIGludCBwYXJ0aWFsOwotICBQYXJzZVN0YXR1cyBzdGF0dXMgPSBQQVJTRV9FUlJPUjsKLSAgTWVtQnVmZmVyIG1lbTsKLSAgV2ViUERlbXV4ZXIqIGRtdXg7Ci0KLSAgaWYgKFdFQlBfQUJJX0lTX0lOQ09NUEFUSUJMRSh2ZXJzaW9uLCBXRUJQX0RFTVVYX0FCSV9WRVJTSU9OKSkgcmV0dXJuIE5VTEw7Ci0gIGlmIChkYXRhID09IE5VTEwgfHwgZGF0YS0+Ynl0ZXMgPT0gTlVMTCB8fCBkYXRhLT5zaXplID09IDApIHJldHVybiBOVUxMOwotCi0gIGlmICghSW5pdE1lbUJ1ZmZlcigmbWVtLCBkYXRhLT5ieXRlcywgZGF0YS0+c2l6ZSkpIHJldHVybiBOVUxMOwotICBpZiAoIVJlYWRIZWFkZXIoJm1lbSkpIHJldHVybiBOVUxMOwotCi0gIHBhcnRpYWwgPSAobWVtLmJ1Zl9zaXplXyA8IG1lbS5yaWZmX2VuZF8pOwotICBpZiAoIWFsbG93X3BhcnRpYWwgJiYgcGFydGlhbCkgcmV0dXJuIE5VTEw7Ci0KLSAgZG11eCA9IChXZWJQRGVtdXhlciopU2JNZW1vcnlDYWxsb2MoMSwgc2l6ZW9mKCpkbXV4KSk7Ci0gIGlmIChkbXV4ID09IE5VTEwpIHJldHVybiBOVUxMOwotICBJbml0RGVtdXgoZG11eCwgJm1lbSk7Ci0KLSAgZm9yIChwYXJzZXIgPSBrTWFzdGVyQ2h1bmtzOyBwYXJzZXItPnBhcnNlICE9IE5VTEw7ICsrcGFyc2VyKSB7Ci0gICAgaWYgKCFTYk1lbW9yeUNvbXBhcmUocGFyc2VyLT5pZCwgR2V0QnVmZmVyKCZkbXV4LT5tZW1fKSwgVEFHX1NJWkUpKSB7Ci0gICAgICBzdGF0dXMgPSBwYXJzZXItPnBhcnNlKGRtdXgpOwotICAgICAgaWYgKHN0YXR1cyA9PSBQQVJTRV9PSykgZG11eC0+c3RhdGVfID0gV0VCUF9ERU1VWF9ET05FOwotICAgICAgaWYgKHN0YXR1cyA9PSBQQVJTRV9ORUVEX01PUkVfREFUQSAmJiAhcGFydGlhbCkgc3RhdHVzID0gUEFSU0VfRVJST1I7Ci0gICAgICBpZiAoc3RhdHVzICE9IFBBUlNFX0VSUk9SICYmICFwYXJzZXItPnZhbGlkKGRtdXgpKSBzdGF0dXMgPSBQQVJTRV9FUlJPUjsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICBpZiAoc3RhdGUpICpzdGF0ZSA9IGRtdXgtPnN0YXRlXzsKLQotICBpZiAoc3RhdHVzID09IFBBUlNFX0VSUk9SKSB7Ci0gICAgV2ViUERlbXV4RGVsZXRlKGRtdXgpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIHJldHVybiBkbXV4OwotfQotCi12b2lkIFdlYlBEZW11eERlbGV0ZShXZWJQRGVtdXhlciogZG11eCkgewotICBDaHVuayogYzsKLSAgRnJhbWUqIGY7Ci0gIGlmIChkbXV4ID09IE5VTEwpIHJldHVybjsKLQotICBmb3IgKGYgPSBkbXV4LT5mcmFtZXNfOyBmICE9IE5VTEw7KSB7Ci0gICAgRnJhbWUqIGNvbnN0IGN1cl9mcmFtZSA9IGY7Ci0gICAgZiA9IGYtPm5leHRfOwotICAgIFNiTWVtb3J5RGVhbGxvY2F0ZShjdXJfZnJhbWUpOwotICB9Ci0gIGZvciAoYyA9IGRtdXgtPmNodW5rc187IGMgIT0gTlVMTDspIHsKLSAgICBDaHVuayogY29uc3QgY3VyX2NodW5rID0gYzsKLSAgICBjID0gYy0+bmV4dF87Ci0gICAgU2JNZW1vcnlEZWFsbG9jYXRlKGN1cl9jaHVuayk7Ci0gIH0KLSAgU2JNZW1vcnlEZWFsbG9jYXRlKGRtdXgpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi11aW50MzJfdCBXZWJQRGVtdXhHZXRJKGNvbnN0IFdlYlBEZW11eGVyKiBkbXV4LCBXZWJQRm9ybWF0RmVhdHVyZSBmZWF0dXJlKSB7Ci0gIGlmIChkbXV4ID09IE5VTEwpIHJldHVybiAwOwotCi0gIHN3aXRjaCAoZmVhdHVyZSkgewotICAgIGNhc2UgV0VCUF9GRl9GT1JNQVRfRkxBR1M6ICAgICByZXR1cm4gZG11eC0+ZmVhdHVyZV9mbGFnc187Ci0gICAgY2FzZSBXRUJQX0ZGX0NBTlZBU19XSURUSDogICAgIHJldHVybiAodWludDMyX3QpZG11eC0+Y2FudmFzX3dpZHRoXzsKLSAgICBjYXNlIFdFQlBfRkZfQ0FOVkFTX0hFSUdIVDogICAgcmV0dXJuICh1aW50MzJfdClkbXV4LT5jYW52YXNfaGVpZ2h0XzsKLSAgICBjYXNlIFdFQlBfRkZfTE9PUF9DT1VOVDogICAgICAgcmV0dXJuICh1aW50MzJfdClkbXV4LT5sb29wX2NvdW50XzsKLSAgICBjYXNlIFdFQlBfRkZfQkFDS0dST1VORF9DT0xPUjogcmV0dXJuIGRtdXgtPmJnY29sb3JfOwotICAgIGNhc2UgV0VCUF9GRl9GUkFNRV9DT1VOVDogICAgICByZXR1cm4gKHVpbnQzMl90KWRtdXgtPm51bV9mcmFtZXNfOwotICB9Ci0gIHJldHVybiAwOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRnJhbWUgaXRlcmF0aW9uCi0KLS8vIEZpbmQgdGhlIGZpcnN0ICdmcmFtZV9udW0nIGZyYW1lLiBUaGVyZSBtYXkgYmUgbXVsdGlwbGUgc3VjaCBmcmFtZXMgaW4gYQotLy8gZnJhZ21lbnRlZCBmcmFtZS4KLXN0YXRpYyBjb25zdCBGcmFtZSogR2V0RnJhbWUoY29uc3QgV2ViUERlbXV4ZXIqIGNvbnN0IGRtdXgsIGludCBmcmFtZV9udW0pIHsKLSAgY29uc3QgRnJhbWUqIGY7Ci0gIGZvciAoZiA9IGRtdXgtPmZyYW1lc187IGYgIT0gTlVMTDsgZiA9IGYtPm5leHRfKSB7Ci0gICAgaWYgKGZyYW1lX251bSA9PSBmLT5mcmFtZV9udW1fKSBicmVhazsKLSAgfQotICByZXR1cm4gZjsKLX0KLQotLy8gUmV0dXJucyBmcmFnbWVudCAnZnJhZ21lbnRfbnVtJyBhbmQgdGhlIHRvdGFsIGNvdW50Lgotc3RhdGljIGNvbnN0IEZyYW1lKiBHZXRGcmFnbWVudCgKLSAgICBjb25zdCBGcmFtZSogY29uc3QgZnJhbWVfc2V0LCBpbnQgZnJhZ21lbnRfbnVtLCBpbnQqIGNvbnN0IGNvdW50KSB7Ci0gIGNvbnN0IGludCB0aGlzX2ZyYW1lID0gZnJhbWVfc2V0LT5mcmFtZV9udW1fOwotICBjb25zdCBGcmFtZSogZiA9IGZyYW1lX3NldDsKLSAgY29uc3QgRnJhbWUqIGZyYWdtZW50ID0gTlVMTDsKLSAgaW50IHRvdGFsOwotCi0gIGZvciAodG90YWwgPSAwOyBmICE9IE5VTEwgJiYgZi0+ZnJhbWVfbnVtXyA9PSB0aGlzX2ZyYW1lOyBmID0gZi0+bmV4dF8pIHsKLSAgICBpZiAoKyt0b3RhbCA9PSBmcmFnbWVudF9udW0pIGZyYWdtZW50ID0gZjsKLSAgfQotICAqY291bnQgPSB0b3RhbDsKLSAgcmV0dXJuIGZyYWdtZW50OwotfQotCi1zdGF0aWMgY29uc3QgdWludDhfdCogR2V0RnJhbWVQYXlsb2FkKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IG1lbV9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZyYW1lKiBjb25zdCBmcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBjb25zdCBkYXRhX3NpemUpIHsKLSAgKmRhdGFfc2l6ZSA9IDA7Ci0gIGlmIChmcmFtZSAhPSBOVUxMKSB7Ci0gICAgY29uc3QgQ2h1bmtEYXRhKiBjb25zdCBpbWFnZSA9IGZyYW1lLT5pbWdfY29tcG9uZW50c187Ci0gICAgY29uc3QgQ2h1bmtEYXRhKiBjb25zdCBhbHBoYSA9IGZyYW1lLT5pbWdfY29tcG9uZW50c18gKyAxOwotICAgIHNpemVfdCBzdGFydF9vZmZzZXQgPSBpbWFnZS0+b2Zmc2V0XzsKLSAgICAqZGF0YV9zaXplID0gaW1hZ2UtPnNpemVfOwotCi0gICAgLy8gaWYgYWxwaGEgZXhpc3RzIGl0IHByZWNlZGVzIGltYWdlLCB1cGRhdGUgdGhlIHNpemUgYWxsb3dpbmcgZm9yCi0gICAgLy8gaW50ZXJ2ZW5pbmcgY2h1bmtzLgotICAgIGlmIChhbHBoYS0+c2l6ZV8gPiAwKSB7Ci0gICAgICBjb25zdCBzaXplX3QgaW50ZXJfc2l6ZSA9IChpbWFnZS0+b2Zmc2V0XyA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGltYWdlLT5vZmZzZXRfIC0gKGFscGhhLT5vZmZzZXRfICsgYWxwaGEtPnNpemVfKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwOwotICAgICAgc3RhcnRfb2Zmc2V0ID0gYWxwaGEtPm9mZnNldF87Ci0gICAgICAqZGF0YV9zaXplICArPSBhbHBoYS0+c2l6ZV8gKyBpbnRlcl9zaXplOwotICAgIH0KLSAgICByZXR1cm4gbWVtX2J1ZiArIHN0YXJ0X29mZnNldDsKLSAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotLy8gQ3JlYXRlIGEgd2hvbGUgJ2ZyYW1lJyBmcm9tIFZQOCAoKyBhbHBoYSkgb3IgbG9zc2xlc3MuCi1zdGF0aWMgaW50IFN5bnRoZXNpemVGcmFtZShjb25zdCBXZWJQRGVtdXhlciogY29uc3QgZG11eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZyYW1lKiBjb25zdCBmaXJzdF9mcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFnbWVudF9udW0sIFdlYlBJdGVyYXRvciogY29uc3QgaXRlcikgewotICBjb25zdCB1aW50OF90KiBjb25zdCBtZW1fYnVmID0gZG11eC0+bWVtXy5idWZfOwotICBpbnQgbnVtX2ZyYWdtZW50czsKLSAgc2l6ZV90IHBheWxvYWRfc2l6ZSA9IDA7Ci0gIGNvbnN0IEZyYW1lKiBjb25zdCBmcmFnbWVudCA9Ci0gICAgICBHZXRGcmFnbWVudChmaXJzdF9mcmFtZSwgZnJhZ21lbnRfbnVtLCAmbnVtX2ZyYWdtZW50cyk7Ci0gIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHBheWxvYWQgPQotICAgICAgR2V0RnJhbWVQYXlsb2FkKG1lbV9idWYsIGZyYWdtZW50LCAmcGF5bG9hZF9zaXplKTsKLSAgaWYgKHBheWxvYWQgPT0gTlVMTCkgcmV0dXJuIDA7Ci0gIFNCX0RDSEVDSyhmaXJzdF9mcmFtZSAhPSBOVUxMKTsKLQotICBpdGVyLT5mcmFtZV9udW0gICAgICA9IGZpcnN0X2ZyYW1lLT5mcmFtZV9udW1fOwotICBpdGVyLT5udW1fZnJhbWVzICAgICA9IGRtdXgtPm51bV9mcmFtZXNfOwotICBpdGVyLT5mcmFnbWVudF9udW0gICA9IGZyYWdtZW50X251bTsKLSAgaXRlci0+bnVtX2ZyYWdtZW50cyAgPSBudW1fZnJhZ21lbnRzOwotICBpdGVyLT54X29mZnNldCAgICAgICA9IGZyYWdtZW50LT54X29mZnNldF87Ci0gIGl0ZXItPnlfb2Zmc2V0ICAgICAgID0gZnJhZ21lbnQtPnlfb2Zmc2V0XzsKLSAgaXRlci0+d2lkdGggICAgICAgICAgPSBmcmFnbWVudC0+d2lkdGhfOwotICBpdGVyLT5oZWlnaHQgICAgICAgICA9IGZyYWdtZW50LT5oZWlnaHRfOwotICBpdGVyLT5kdXJhdGlvbiAgICAgICA9IGZyYWdtZW50LT5kdXJhdGlvbl87Ci0gIGl0ZXItPmRpc3Bvc2VfbWV0aG9kID0gZnJhZ21lbnQtPmRpc3Bvc2VfbWV0aG9kXzsKLSAgaXRlci0+Y29tcGxldGUgICAgICAgPSBmcmFnbWVudC0+Y29tcGxldGVfOwotICBpdGVyLT5mcmFnbWVudC5ieXRlcyA9IHBheWxvYWQ7Ci0gIGl0ZXItPmZyYWdtZW50LnNpemUgID0gcGF5bG9hZF9zaXplOwotICAvLyBUT0RPKGp6ZXJuKTogYWRqdXN0IG9mZnNldHMgZm9yICdGUkdNJ3MgZW1iZWRkZWQgaW4gJ0FOTUYncwotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBTZXRGcmFtZShpbnQgZnJhbWVfbnVtLCBXZWJQSXRlcmF0b3IqIGNvbnN0IGl0ZXIpIHsKLSAgY29uc3QgRnJhbWUqIGZyYW1lOwotICBjb25zdCBXZWJQRGVtdXhlciogY29uc3QgZG11eCA9IChXZWJQRGVtdXhlciopaXRlci0+cHJpdmF0ZV87Ci0gIGlmIChkbXV4ID09IE5VTEwgfHwgZnJhbWVfbnVtIDwgMCkgcmV0dXJuIDA7Ci0gIGlmIChmcmFtZV9udW0gPiBkbXV4LT5udW1fZnJhbWVzXykgcmV0dXJuIDA7Ci0gIGlmIChmcmFtZV9udW0gPT0gMCkgZnJhbWVfbnVtID0gZG11eC0+bnVtX2ZyYW1lc187Ci0KLSAgZnJhbWUgPSBHZXRGcmFtZShkbXV4LCBmcmFtZV9udW0pOwotICBpZiAoZnJhbWUgPT0gTlVMTCkgcmV0dXJuIDA7Ci0KLSAgcmV0dXJuIFN5bnRoZXNpemVGcmFtZShkbXV4LCBmcmFtZSwgMSwgaXRlcik7Ci19Ci0KLWludCBXZWJQRGVtdXhHZXRGcmFtZShjb25zdCBXZWJQRGVtdXhlciogZG11eCwgaW50IGZyYW1lLCBXZWJQSXRlcmF0b3IqIGl0ZXIpIHsKLSAgaWYgKGl0ZXIgPT0gTlVMTCkgcmV0dXJuIDA7Ci0KLSAgU2JNZW1vcnlTZXQoaXRlciwgMCwgc2l6ZW9mKCppdGVyKSk7Ci0gIGl0ZXItPnByaXZhdGVfID0gKHZvaWQqKWRtdXg7Ci0gIHJldHVybiBTZXRGcmFtZShmcmFtZSwgaXRlcik7Ci19Ci0KLWludCBXZWJQRGVtdXhOZXh0RnJhbWUoV2ViUEl0ZXJhdG9yKiBpdGVyKSB7Ci0gIGlmIChpdGVyID09IE5VTEwpIHJldHVybiAwOwotICByZXR1cm4gU2V0RnJhbWUoaXRlci0+ZnJhbWVfbnVtICsgMSwgaXRlcik7Ci19Ci0KLWludCBXZWJQRGVtdXhQcmV2RnJhbWUoV2ViUEl0ZXJhdG9yKiBpdGVyKSB7Ci0gIGlmIChpdGVyID09IE5VTEwpIHJldHVybiAwOwotICBpZiAoaXRlci0+ZnJhbWVfbnVtIDw9IDEpIHJldHVybiAwOwotICByZXR1cm4gU2V0RnJhbWUoaXRlci0+ZnJhbWVfbnVtIC0gMSwgaXRlcik7Ci19Ci0KLWludCBXZWJQRGVtdXhTZWxlY3RGcmFnbWVudChXZWJQSXRlcmF0b3IqIGl0ZXIsIGludCBmcmFnbWVudF9udW0pIHsKLSAgaWYgKGl0ZXIgIT0gTlVMTCAmJiBpdGVyLT5wcml2YXRlXyAhPSBOVUxMICYmIGZyYWdtZW50X251bSA+IDApIHsKLSAgICBjb25zdCBXZWJQRGVtdXhlciogY29uc3QgZG11eCA9IChXZWJQRGVtdXhlciopaXRlci0+cHJpdmF0ZV87Ci0gICAgY29uc3QgRnJhbWUqIGNvbnN0IGZyYW1lID0gR2V0RnJhbWUoZG11eCwgaXRlci0+ZnJhbWVfbnVtKTsKLSAgICBpZiAoZnJhbWUgPT0gTlVMTCkgcmV0dXJuIDA7Ci0KLSAgICByZXR1cm4gU3ludGhlc2l6ZUZyYW1lKGRtdXgsIGZyYW1lLCBmcmFnbWVudF9udW0sIGl0ZXIpOwotICB9Ci0gIHJldHVybiAwOwotfQotCi12b2lkIFdlYlBEZW11eFJlbGVhc2VJdGVyYXRvcihXZWJQSXRlcmF0b3IqIGl0ZXIpIHsKLSAgKHZvaWQpaXRlcjsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENodW5rIGl0ZXJhdGlvbgotCi1zdGF0aWMgaW50IENodW5rQ291bnQoY29uc3QgV2ViUERlbXV4ZXIqIGNvbnN0IGRtdXgsIGNvbnN0IGNoYXIgZm91cmNjWzRdKSB7Ci0gIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IG1lbV9idWYgPSBkbXV4LT5tZW1fLmJ1Zl87Ci0gIGNvbnN0IENodW5rKiBjOwotICBpbnQgY291bnQgPSAwOwotICBmb3IgKGMgPSBkbXV4LT5jaHVua3NfOyBjICE9IE5VTEw7IGMgPSBjLT5uZXh0XykgewotICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGhlYWRlciA9IG1lbV9idWYgKyBjLT5kYXRhXy5vZmZzZXRfOwotICAgIGlmICghU2JNZW1vcnlDb21wYXJlKGhlYWRlciwgZm91cmNjLCBUQUdfU0laRSkpICsrY291bnQ7Ci0gIH0KLSAgcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgY29uc3QgQ2h1bmsqIEdldENodW5rKGNvbnN0IFdlYlBEZW11eGVyKiBjb25zdCBkbXV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyIGZvdXJjY1s0XSwgaW50IGNodW5rX251bSkgewotICBjb25zdCB1aW50OF90KiBjb25zdCBtZW1fYnVmID0gZG11eC0+bWVtXy5idWZfOwotICBjb25zdCBDaHVuayogYzsKLSAgaW50IGNvdW50ID0gMDsKLSAgZm9yIChjID0gZG11eC0+Y2h1bmtzXzsgYyAhPSBOVUxMOyBjID0gYy0+bmV4dF8pIHsKLSAgICBjb25zdCB1aW50OF90KiBjb25zdCBoZWFkZXIgPSBtZW1fYnVmICsgYy0+ZGF0YV8ub2Zmc2V0XzsKLSAgICBpZiAoIVNiTWVtb3J5Q29tcGFyZShoZWFkZXIsIGZvdXJjYywgVEFHX1NJWkUpKSArK2NvdW50OwotICAgIGlmIChjb3VudCA9PSBjaHVua19udW0pIGJyZWFrOwotICB9Ci0gIHJldHVybiBjOwotfQotCi1zdGF0aWMgaW50IFNldENodW5rKGNvbnN0IGNoYXIgZm91cmNjWzRdLCBpbnQgY2h1bmtfbnVtLAotICAgICAgICAgICAgICAgICAgICBXZWJQQ2h1bmtJdGVyYXRvciogY29uc3QgaXRlcikgewotICBjb25zdCBXZWJQRGVtdXhlciogY29uc3QgZG11eCA9IChXZWJQRGVtdXhlciopaXRlci0+cHJpdmF0ZV87Ci0gIGludCBjb3VudDsKLQotICBpZiAoZG11eCA9PSBOVUxMIHx8IGZvdXJjYyA9PSBOVUxMIHx8IGNodW5rX251bSA8IDApIHJldHVybiAwOwotICBjb3VudCA9IENodW5rQ291bnQoZG11eCwgZm91cmNjKTsKLSAgaWYgKGNvdW50ID09IDApIHJldHVybiAwOwotICBpZiAoY2h1bmtfbnVtID09IDApIGNodW5rX251bSA9IGNvdW50OwotCi0gIGlmIChjaHVua19udW0gPD0gY291bnQpIHsKLSAgICBjb25zdCB1aW50OF90KiBjb25zdCBtZW1fYnVmID0gZG11eC0+bWVtXy5idWZfOwotICAgIGNvbnN0IENodW5rKiBjb25zdCBjaHVuayA9IEdldENodW5rKGRtdXgsIGZvdXJjYywgY2h1bmtfbnVtKTsKLSAgICBpdGVyLT5jaHVuay5ieXRlcyA9IG1lbV9idWYgKyBjaHVuay0+ZGF0YV8ub2Zmc2V0XyArIENIVU5LX0hFQURFUl9TSVpFOwotICAgIGl0ZXItPmNodW5rLnNpemUgID0gY2h1bmstPmRhdGFfLnNpemVfIC0gQ0hVTktfSEVBREVSX1NJWkU7Ci0gICAgaXRlci0+bnVtX2NodW5rcyAgPSBjb3VudDsKLSAgICBpdGVyLT5jaHVua19udW0gICA9IGNodW5rX251bTsKLSAgICByZXR1cm4gMTsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotaW50IFdlYlBEZW11eEdldENodW5rKGNvbnN0IFdlYlBEZW11eGVyKiBkbXV4LAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgZm91cmNjWzRdLCBpbnQgY2h1bmtfbnVtLAotICAgICAgICAgICAgICAgICAgICAgIFdlYlBDaHVua0l0ZXJhdG9yKiBpdGVyKSB7Ci0gIGlmIChpdGVyID09IE5VTEwpIHJldHVybiAwOwotCi0gIFNiTWVtb3J5U2V0KGl0ZXIsIDAsIHNpemVvZigqaXRlcikpOwotICBpdGVyLT5wcml2YXRlXyA9ICh2b2lkKilkbXV4OwotICByZXR1cm4gU2V0Q2h1bmsoZm91cmNjLCBjaHVua19udW0sIGl0ZXIpOwotfQotCi1pbnQgV2ViUERlbXV4TmV4dENodW5rKFdlYlBDaHVua0l0ZXJhdG9yKiBpdGVyKSB7Ci0gIGlmIChpdGVyICE9IE5VTEwpIHsKLSAgICBjb25zdCBjaGFyKiBjb25zdCBmb3VyY2MgPQotICAgICAgICAoY29uc3QgY2hhciopaXRlci0+Y2h1bmsuYnl0ZXMgLSBDSFVOS19IRUFERVJfU0laRTsKLSAgICByZXR1cm4gU2V0Q2h1bmsoZm91cmNjLCBpdGVyLT5jaHVua19udW0gKyAxLCBpdGVyKTsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotaW50IFdlYlBEZW11eFByZXZDaHVuayhXZWJQQ2h1bmtJdGVyYXRvciogaXRlcikgewotICBpZiAoaXRlciAhPSBOVUxMICYmIGl0ZXItPmNodW5rX251bSA+IDEpIHsKLSAgICBjb25zdCBjaGFyKiBjb25zdCBmb3VyY2MgPQotICAgICAgICAoY29uc3QgY2hhciopaXRlci0+Y2h1bmsuYnl0ZXMgLSBDSFVOS19IRUFERVJfU0laRTsKLSAgICByZXR1cm4gU2V0Q2h1bmsoZm91cmNjLCBpdGVyLT5jaHVua19udW0gLSAxLCBpdGVyKTsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotdm9pZCBXZWJQRGVtdXhSZWxlYXNlQ2h1bmtJdGVyYXRvcihXZWJQQ2h1bmtJdGVyYXRvciogaXRlcikgewotICAodm9pZClpdGVyOwotfQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kb2MvUkVBRE1FIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZG9jL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjIzZTBjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZG9jL1JFQURNRQpAQCAtMCwwICsxLDI5IEBACisKK0dlbmVyYXRlIGxpYndlYnAgQ29udGFpbmVyIFNwZWMgRG9jcyBmcm9tIFRleHQgU291cmNlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitIVE1MIGdlbmVyYXRpb24gcmVxdWlyZXMga3JhbWRvd24gWzFdLCBlYXNpbHkgaW5zdGFsbGVkIGFzIGEKK3J1YnlnZW0gWzJdLiAgUnVieWdlbXMgaW5zdGFsbGF0aW9uIHNob3VsZCBzYXRpc2Z5IGRlcGVuZGVuY2llcworYXV0b21hdGljYWxseS4KKworWzFdOiBodHRwOi8va3JhbWRvd24ucnVieWZvcmdlLm9yZy8KK1syXTogaHR0cDovL3J1YnlnZW1zLm9yZy8KKworSFRNTCBnZW5lcmF0aW9uIGNhbiB0aGVuIGJlIGRvbmUgZnJvbSB0aGUgcHJvamVjdCByb290OgorCiskIGtyYW1kb3duIGRvYy93ZWJwLWNvbnRhaW5lci1zcGVjLnR4dCAtLXRlbXBsYXRlIGRvYy90ZW1wbGF0ZS5odG1sID4gXAorICBkb2Mvb3V0cHV0L3dlYnAtY29udGFpbmVyLXNwZWMuaHRtbAorCitrcmFtZG93biBjYW4gb3B0aW9uYWxseSBzeW50YXggaGlnaGxpZ2h0IGNvZGUgYmxvY2tzLCB1c2luZyBDb2RlUmF5IFszXSwKK2EgZGVwZW5kZW5jeSBvZiBrcmFtZG93biB0aGF0IHJ1YnlnZW1zIHdpbGwgaW5zdGFsbCBhdXRvbWF0aWNhbGx5LiAgVGhlCitmb2xsb3dpbmcgd2lsbCBhcHBseSBpbmxpbmUgQ1NTIHN0eWxpbmc7IGFuIGV4dGVybmFsIHN0eWxlc2hlZXQgaXMgbm90CituZWVkZWQuCisKKyQga3JhbWRvd24gZG9jL3dlYnAtbG9zc2xlc3MtYml0c3RyZWFtLXNwZWMudHh0IC0tdGVtcGxhdGUgXAorICBkb2MvdGVtcGxhdGUuaHRtbCAtLWNvZGVyYXktY3NzIHN0eWxlIC0tY29kZXJheS1saW5lLW51bWJlcnMgJyAnIFwKKyAgLS1jb2RlcmF5LWRlZmF1bHQtbGFuZyBjID4gXAorICBkb2Mvb3V0cHV0L3dlYnAtbG9zc2xlc3MtYml0c3RyZWFtLXNwZWMuaHRtbAorCitPcHRpbWFsbHksIHVzZSBrcmFtZG93biAwLjEzLjcgb3IgbmV3ZXIgaWYgc3ludGF4IGhpZ2hsaWdodGluZyBkZXNpcmVkLgorCitbM106IGh0dHA6Ly9jb2RlcmF5LnJ1YnljaGFuLmRlLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZG9jL1RPRE8gYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kb2MvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGE5MzgyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZG9jL1RPRE8KQEAgLTAsMCArMSwxMyBAQAorPGxvdXF1aWxsaW9AZ29vZ2xlLmNvbT4sIDIwMTExMDA0CisKKyogRGV0ZXJtaW5lIHRoYXQgbm9ybWF0aXZlIFJGQyAyMTE5IHRlcm1zIChNVVNULCBTSE9VTEQsIE1BWSwgZXRjLikgYXJlCisgIHRydWx5IGludGVuZGVkIGluIGFsbCBjYXNlcyB3aGVyZSBjYXBpdGFsaXplZC4KKworKiBTZXZlcmFsIHBhc3NhZ2VzIGNvdWxkIGJlIG1hZGUgY2xlYXJlci4KKworICAqIE92ZXJhbGwgZWRpdCBmb3Igc2NvcGUuICBQb3J0aW9ucyBhcmUgcGhyYXNlZCBhcyBhbiBpbnRyb2R1Y3Rpb24gdG8KKyAgICB0aGUgMC4xLjMgUklGRiBjb250YWluZXIgYWRkaXRpb25zLCByYXRoZXIgdGhhbiBhIGhvbGlzdGljIGd1aWRlIHRvCisgICAgV2ViUC4KKworICAqIFRvIHdpdCwgc3VnZ2VzdCBzL1tzcGVjfHNwZWNpZmljYXRpb25dL2d1aWRlL2cgLiAgIlNwZWMiIGNhbiBpbXBseSBhCisgICAgc3RhbmRhcmRzIHRyYWNrOyBpbiBhbnkgY2FzZSBpdCdzIHRvbyBmb3JtYWwgZm9yIGEgd29yayBpbiBwcm9ncmVzcy4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RvYy90ZW1wbGF0ZS5odG1sIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZG9jL3RlbXBsYXRlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRiYzI4OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RvYy90ZW1wbGF0ZS5odG1sCkBAIC0wLDAgKzEsOTQgQEAKKzwhRE9DVFlQRSBodG1sPgorPGh0bWwgbGFuZz0iZW4iPgorPGhlYWQ+CisgIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KKyAgPHRpdGxlPldlYlAgQ29udGFpbmVyIFNwZWNpZmljYXRpb248L3RpdGxlPgorICA8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9ImtyYW1kb3duIDwlPSA6OktyYW1kb3duOjpWRVJTSU9OICU+IiAvPgorICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorICBib2R5IHsKKyAgICBjb2xvcjogIzAwMDsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOworICAgIG1hcmdpbjogMTAlOworICAgIGZvbnQtZmFtaWx5OiAiTGliZXJhdGlvbiBTYW5zIiwgIkRlamFWdSBTYW5zIiwgIkJpdHN0cmVhbSBWZXJhIFNhbnMiLCBBcmlhbCwgc2Fucy1zZXJpZjsKKyAgICBsaW5lLWhlaWdodDogMS40OworICB9CisgIGgyIHsKKyAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2NjYzsKKyAgICBwYWRkaW5nLWJvdHRvbTogMDsKKyAgfQorICB0YWJsZSB7CisgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKKyAgfQorICB0aCwgdGQgeworICAgIGJvcmRlcjogMXB4IHNvbGlkICM5OTk7CisgICAgcGFkZGluZzogLjVlbSAuN2VtOzsKKyAgfQorICB0aCB7CisgICAgY29sb3I6ICNmZmY7CisgICAgYmFja2dyb3VuZC1jb2xvcjogIzAwMDsKKyAgfQorICB0ZCB7CisgIH0KKyAgaHIgeworICB9CisgIGNvZGUgeworICAgIGNvbG9yOiAjMDAwOworICAgIGJhY2tncm91bmQtY29sb3I6ICNmN2Y3Zjc7CisgICAgcGFkZGluZzogMCAzcHg7CisgICAgZm9udC1mYW1pbHk6ICJMaWJlcmF0aW9uIE1vbm8iLCAiRGVqYVZ1IFNhbnMgTW9ubyIsICJCaXRzdHJlYW0gVmVyYSBTYW5zIE1vbm8iLCBDb25zb2xhdGEsIG1vbm9zcGFjZTsKKyAgfQorICBwcmUgeworICAgIGJhY2tncm91bmQtY29sb3I6ICNmN2Y3Zjc7CisgICAgcGFkZGluZzogMWVtOworICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7CisgICAgd2lkdGg6IDQyZW07CisgICAgb3ZlcmZsb3c6IGF1dG87CisgICAgZm9udC1mYW1pbHk6ICJMaWJlcmF0aW9uIE1vbm8iLCAiRGVqYVZ1IFNhbnMgTW9ubyIsICJCaXRzdHJlYW0gVmVyYSBTYW5zIE1vbm8iLCBDb25zb2xhdGEsIG1vbm9zcGFjZTsKKyAgfQorICBwcmUgY29kZSB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogI2Y3ZjdmNzsKKyAgICBwYWRkaW5nOiAwOyAvKiBPbmx5IHdhbnQgcGFkZGluZyBvbiBpbmxpbmUgY29kZSwgbm90IGJsb2NrcyAqLworICB9CisgIHByZS50ZXJtaW5hbCB7CisgICAgY29sb3I6ICNmZmY7CisgICAgYmFja2dyb3VuZC1jb2xvcjogIzAwMDsKKyAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOworICAgIG1heC1oZWlnaHQ6IDMwZW07CisgIH0KKyAgcHJlLnRlcm1pbmFsIGNvZGUgeworICAgIGNvbG9yOiAjZmZmOworICAgIGJhY2tncm91bmQtY29sb3I6ICMwMDA7CisgICAgZm9udC1zaXplOiBzbWFsbGVyOworICB9CisgICNtYXJrZG93bi10b2MgdWwgeworICAgIGxpc3Qtc3R5bGUtdHlwZTogZGlzYzsKKyAgfQorICB1bCNtYXJrZG93bi10b2MgeworICAgIG1hcmdpbi10b3A6IC0xZW07CisgICAgdmlzaWJpbGl0eTogaGlkZGVuOworICAgIC13ZWJraXQtcGFkZGluZy1zdGFydDogMDsKKyAgfQorICB1bCNtYXJrZG93bi10b2MgdWwgeworICAgIHZpc2liaWxpdHk6IHZpc2libGU7CisgIH0KKyAgdWwjbWFya2Rvd24tdG9jIHVsIHVseworICAgIHZpc2liaWxpdHk6IHZpc2libGU7CisgIH0KKyAgdWwjbWFya2Rvd24tdG9jICsgaHIgeworICAgIG1hcmdpbi1ib3R0b206IDRlbTsKKyAgfQorICBvbCBvbCB7IC8qIEZvcm1hdCBuZXN0ZWQgb3JkZXJlZCBsaXN0cyAqLworICAgIGxpc3Qtc3R5bGUtdHlwZTogbG93ZXItYWxwaGE7CisgIH0KKyAgZHQgeworICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKKyAgICBmb250LXdlaWdodDogYm9sZDsKKyAgfQorICAuY2FwdGlvbiB7CisgIH0KKyAgPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorPCU9IEBib2R5ICU+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kb2Mvd2VicC1jb250YWluZXItc3BlYy50eHQgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kb2Mvd2VicC1jb250YWluZXItc3BlYy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRhN2NhMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RvYy93ZWJwLWNvbnRhaW5lci1zcGVjLnR4dApAQCAtMCwwICsxLDgyMyBAQAorPCEtLQorCitBbHRob3VnaCB5b3UgbWF5IGJlIHZpZXdpbmcgYW4gYWx0ZXJuYXRlIHJlcHJlc2VudGF0aW9uLCB0aGlzIGRvY3VtZW50CitpcyBzb3VyY2VkIGluIE1hcmtkb3duLCBhIGxpZ2h0LWR1dHkgbWFya3VwIHNjaGVtZSwgYW5kIGlzIG9wdGltaXplZCBmb3IKK3RoZSBba3JhbWRvd25dKGh0dHA6Ly9rcmFtZG93bi5ydWJ5Zm9yZ2Uub3JnLykgdHJhbnNmb3JtZXIuCisKK1NlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRS4gRXh0ZXJuYWwgbGluayB0YXJnZXRzIGFyZSByZWZlcmVuY2VkIGF0IHRoZQorZW5kIG9mIHRoaXMgZmlsZS4KKworLS0+CisKKworV2ViUCBDb250YWluZXIgU3BlY2lmaWNhdGlvbgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisqIFRPQyBwbGFjZWhvbGRlcgorezp0b2N9CisKKworSW50cm9kdWN0aW9uCistLS0tLS0tLS0tLS0KKworV2ViUCBpcyBhbiBpbWFnZSBmb3JtYXQgdGhhdCB1c2VzIGVpdGhlciAoaSkgdGhlIFZQOCBrZXkgZnJhbWUgZW5jb2RpbmcKK3RvIGNvbXByZXNzIGltYWdlIGRhdGEgaW4gYSBsb3NzeSB3YXksIG9yIChpaSkgdGhlIFdlYlAgbG9zc2xlc3MgZW5jb2RpbmcKKyhhbmQgcG9zc2libHkgb3RoZXIgZW5jb2RpbmdzIGluIHRoZSBmdXR1cmUpLiBUaGVzZSBlbmNvZGluZyBzY2hlbWVzIHNob3VsZAorbWFrZSBpdCBtb3JlIGVmZmljaWVudCB0aGFuIGN1cnJlbnRseSB1c2VkIGZvcm1hdHMuIEl0IGlzIG9wdGltaXplZCBmb3IgZmFzdAoraW1hZ2UgdHJhbnNmZXIgb3ZlciB0aGUgbmV0d29yayAoZS5nLiwgZm9yIHdlYnNpdGVzKS4gVGhlIFdlYlAgZm9ybWF0IGhhcworZmVhdHVyZSBwYXJpdHkgKGNvbG9yIHByb2ZpbGUsIG1ldGFkYXRhLCBhbmltYXRpb24gZXRjKSB3aXRoIG90aGVyIGZvcm1hdHMgYXMKK3dlbGwuIFRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBzdHJ1Y3R1cmUgb2YgYSBXZWJQIGZpbGUuCisKK1RoZSBXZWJQIGNvbnRhaW5lciAoaS5lLiwgUklGRiBjb250YWluZXIgZm9yIFdlYlApIGFsbG93cyBmZWF0dXJlIHN1cHBvcnQgb3ZlcgorYW5kIGFib3ZlIHRoZSBiYXNpYyB1c2UgY2FzZSBvZiBXZWJQIChpLmUuLCBhIGZpbGUgY29udGFpbmluZyBhIHNpbmdsZSBpbWFnZQorZW5jb2RlZCBhcyBhIFZQOCBrZXkgZnJhbWUpLiBUaGUgV2ViUCBjb250YWluZXIgcHJvdmlkZXMgYWRkaXRpb25hbCBzdXBwb3J0Citmb3I6CisKKyAgKiAqKkxvc3NsZXNzIGNvbXByZXNzaW9uLioqIEFuIGltYWdlIGNhbiBiZSBsb3NzbGVzc2x5IGNvbXByZXNzZWQsIHVzaW5nIHRoZQorICAgIFdlYlAgTG9zc2xlc3MgRm9ybWF0LgorCisgICogKipNZXRhZGF0YS4qKiBBbiBpbWFnZSBtYXkgaGF2ZSBtZXRhZGF0YSBzdG9yZWQgaW4gRVhJRiBvciBYTVAgZm9ybWF0cy4KKworICAqICoqVHJhbnNwYXJlbmN5LioqIEFuIGltYWdlIG1heSBoYXZlIHRyYW5zcGFyZW5jeSwgaS5lLiwgYW4gYWxwaGEgY2hhbm5lbC4KKworICAqICoqQ29sb3IgUHJvZmlsZS4qKiBBbiBpbWFnZSBtYXkgaGF2ZSBhbiBlbWJlZGRlZCBJQ0MgcHJvZmlsZSBhcyBkZXNjcmliZWQKKyAgICBieSB0aGUgW0ludGVybmF0aW9uYWwgQ29sb3IgQ29uc29ydGl1bV1baWNjc3BlY10uCisKKyAgKiAqKkFuaW1hdGlvbi4qKiBBbiBpbWFnZSBtYXkgaGF2ZSBtdWx0aXBsZSBmcmFtZXMgd2l0aCBwYXVzZXMgYmV0d2VlbiB0aGVtLAorICAgIG1ha2luZyBpdCBhbiBhbmltYXRpb24uCisKK1RoZSBrZXkgd29yZHMgIk1VU1QiLCAiTVVTVCBOT1QiLCAiUkVRVUlSRUQiLCAiU0hBTEwiLCAiU0hBTEwgTk9UIiwKKyJTSE9VTEQiLCAiU0hPVUxEIE5PVCIsICJSRUNPTU1FTkRFRCIsICJNQVkiLCBhbmQgIk9QVElPTkFMIiBpbiB0aGlzCitkb2N1bWVudCBhcmUgdG8gYmUgaW50ZXJwcmV0ZWQgYXMgZGVzY3JpYmVkIGluIFtSRkMgMjExOV1bXS4KKworQml0IG51bWJlcmluZyBpbiBjaHVuayBkaWFncmFtcyBzdGFydHMgYXQgYDBgIGZvciB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQKKygnTVNCIDAnKSBhcyBkZXNjcmliZWQgaW4gW1JGQyAxMTY2XVtdLgorCisqKk5vdGU6KiogT3V0IG9mIHRoZSBmZWF0dXJlcyBtZW50aW9uZWQgYWJvdmUsIGxvc3N5IGNvbXByZXNzaW9uLCBsb3NzbGVzcworY29tcHJlc3Npb24sIHRyYW5zcGFyZW5jeSwgbWV0YWRhdGEsIGNvbG9yIHByb2ZpbGUgYW5kIGFuaW1hdGlvbiBhcmUgZmluYWxpemVkCithbmQgYXJlIHRvIGJlIGNvbnNpZGVyZWQgc3RhYmxlLgorCitUZXJtaW5vbG9neSAmYW1wOyBCYXNpY3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBIFdlYlAgZmlsZSBjb250YWlucyBlaXRoZXIgYSBzdGlsbCBpbWFnZSAoaS5lLiwgYW4gZW5jb2RlZCBtYXRyaXggb2YgcGl4ZWxzKQorb3IgYW4gW2FuaW1hdGlvbl0oI2FuaW1hdGlvbikuIE9wdGlvbmFsbHksIGl0IGNhbiBhbHNvIGNvbnRhaW4gdHJhbnNwYXJlbmN5CitpbmZvcm1hdGlvbiwgY29sb3IgcHJvZmlsZSBhbmQgbWV0YWRhdGEuIEluIGNhc2Ugd2UgbmVlZCB0byByZWZlciBvbmx5IHRvIHRoZQorbWF0cml4IG9mIHBpeGVscywgd2Ugd2lsbCBjYWxsIGl0IHRoZSBfY2FudmFzXyBvZiB0aGUgaW1hZ2UuCisKK0JlbG93IGFyZSBhZGRpdGlvbmFsIHRlcm1zIHVzZWQgdGhyb3VnaG91dCB0aGlzIGRvY3VtZW50OgorCitfUmVhZGVyL1dyaXRlcl8KKworOiBDb2RlIHRoYXQgcmVhZHMgV2ViUCBmaWxlcyBpcyByZWZlcnJlZCB0byBhcyBhIF9yZWFkZXJfLCB3aGlsZSBjb2RlIHRoYXQKKyAgd3JpdGVzIHRoZW0gaXMgcmVmZXJyZWQgdG8gYXMgYSBfd3JpdGVyXy4KKworX3VpbnQxNl8KKworOiBBIDE2LWJpdCwgbGl0dGxlLWVuZGlhbiwgdW5zaWduZWQgaW50ZWdlci4KKworX3VpbnQyNF8KKworOiBBIDI0LWJpdCwgbGl0dGxlLWVuZGlhbiwgdW5zaWduZWQgaW50ZWdlci4KKworX3VpbnQzMl8KKworOiBBIDMyLWJpdCwgbGl0dGxlLWVuZGlhbiwgdW5zaWduZWQgaW50ZWdlci4KKworX0ZvdXJDQ18KKworOiBBIF9Gb3VyQ0NfIChmb3VyLWNoYXJhY3RlciBjb2RlKSBpcyBhIF91aW50MzJfIGNyZWF0ZWQgYnkgY29uY2F0ZW5hdGluZyBmb3VyCisgIEFTQ0lJIGNoYXJhY3RlcnMgaW4gbGl0dGxlLWVuZGlhbiBvcmRlci4KKworXzEtYmFzZWRfCisKKzogQW4gdW5zaWduZWQgaW50ZWdlciBmaWVsZCBzdG9yaW5nIHZhbHVlcyBvZmZzZXQgYnkgYC0xYC4gZS5nLiwgU3VjaCBhIGZpZWxkCisgIHdvdWxkIHN0b3JlIHZhbHVlIF8yNV8gYXMgXzI0Xy4KKworCitSSUZGIEZpbGUgRm9ybWF0CistLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBXZWJQIGZpbGUgZm9ybWF0IGlzIGJhc2VkIG9uIHRoZSBSSUZGIChyZXNvdXJjZSBpbnRlcmNoYW5nZSBmaWxlIGZvcm1hdCkKK2RvY3VtZW50IGZvcm1hdC4KKworVGhlIGJhc2ljIGVsZW1lbnQgb2YgYSBSSUZGIGZpbGUgaXMgYSBfY2h1bmtfLiBJdCBjb25zaXN0cyBvZjoKKworICAgICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBDaHVuayBGb3VyQ0MgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgIENodW5rIFNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIENodW5rIFBheWxvYWQgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisKK0NodW5rIEZvdXJDQzogMzIgYml0cworCis6IEFTQ0lJIGZvdXItY2hhcmFjdGVyIGNvZGUgdXNlZCBmb3IgY2h1bmsgaWRlbnRpZmljYXRpb24uCisKK0NodW5rIFNpemU6IDMyIGJpdHMgKF91aW50MzJfKQorCis6IFRoZSBzaXplIG9mIHRoZSBjaHVuayBub3QgaW5jbHVkaW5nIHRoaXMgZmllbGQsIHRoZSBjaHVuayBpZGVudGlmaWVyIG9yCisgIHBhZGRpbmcuCisKK0NodW5rIFBheWxvYWQ6IF9DaHVuayBTaXplXyBieXRlcworCis6IFRoZSBkYXRhIHBheWxvYWQuIElmIF9DaHVuayBTaXplXyBpcyBvZGQsIGEgc2luZ2xlIHBhZGRpbmcgYnl0ZSAtLSB0aGF0CisgIFNIT1VMRCBiZSBgMGAgLS0gaXMgYWRkZWQuCisKK19DaHVua0hlYWRlcignQUJDRCcpXworCis6IFRoaXMgaXMgdXNlZCB0byBkZXNjcmliZSB0aGUgX0ZvdXJDQ18gYW5kIF9DaHVuayBTaXplXyBoZWFkZXIgb2YgaW5kaXZpZHVhbAorICBjaHVua3MsIHdoZXJlICdBQkNEJyBpcyB0aGUgRm91ckNDIGZvciB0aGUgY2h1bmsuIFRoaXMgZWxlbWVudCdzCisgIHNpemUgaXMgOCBieXRlcy4KKworKipOb3RlOioqIFJJRkYgaGFzIGEgY29udmVudGlvbiB0aGF0IGFsbC11cHBlcmNhc2UgY2h1bmsgRm91ckNDcyBhcmUgc3RhbmRhcmQKK2NodW5rcyB0aGF0IGFwcGx5IHRvIGFueSBSSUZGIGZpbGUgZm9ybWF0LCB3aGlsZSBGb3VyQ0NzIHNwZWNpZmljIHRvIGEgZmlsZQorZm9ybWF0IGFyZSBhbGwgbG93ZXJjYXNlLiBXZWJQIGRvZXMgbm90IGZvbGxvdyB0aGlzIGNvbnZlbnRpb24uCisKKworV2ViUCBGaWxlIEhlYWRlcgorLS0tLS0tLS0tLS0tLS0tLQorCisgICAgIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKKyAgICAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICB8ICAgICAgJ1InICAgICAgfCAgICAgICdJJyAgICAgIHwgICAgICAnRicgICAgICB8ICAgICAgJ0YnICAgICAgfAorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgIHwgICAgICAnVycgICAgICB8ICAgICAgJ0UnICAgICAgfCAgICAgICdCJyAgICAgIHwgICAgICAnUCcgICAgICB8CisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKworJ1JJRkYnOiAzMiBiaXRzCisKKzogVGhlIEFTQ0lJIGNoYXJhY3RlcnMgJ1InICdJJyAnRicgJ0YnLgorCitGaWxlIFNpemU6IDMyIGJpdHMgKF91aW50MzJfKQorCis6IFRoZSBzaXplIG9mIHRoZSBmaWxlIGluIGJ5dGVzIHN0YXJ0aW5nIGF0IG9mZnNldCA4LiBUaGUgbWF4aW11bSB2YWx1ZSBvZgorICB0aGlzIGZpZWxkIGlzIDJeMzIgbWludXMgMTAgYnl0ZXMgYW5kIHRodXMgdGhlIHNpemUgb2YgdGhlIHdob2xlIGZpbGUgaXMgYXQKKyAgbW9zdCA0R2lCIG1pbnVzIDIgYnl0ZXMuCisKKydXRUJQJzogMzIgYml0cworCis6IFRoZSBBU0NJSSBjaGFyYWN0ZXJzICdXJyAnRScgJ0InICdQJy4KKworQSBXZWJQIGZpbGUgTVVTVCBiZWdpbiB3aXRoIGEgUklGRiBoZWFkZXIgd2l0aCB0aGUgRm91ckNDICdXRUJQJy4gVGhlIGZpbGUgc2l6ZQoraW4gdGhlIGhlYWRlciBpcyB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgY2h1bmtzIHRoYXQgZm9sbG93IHBsdXMgYDRgIGJ5dGVzIGZvcgordGhlICdXRUJQJyBGb3VyQ0MuIFRoZSBmaWxlIFNIT1VMRCBOT1QgY29udGFpbiBhbnl0aGluZyBhZnRlciBpdC4gQXMgdGhlIHNpemUKK29mIGFueSBjaHVuayBpcyBldmVuLCB0aGUgc2l6ZSBnaXZlbiBieSB0aGUgUklGRiBoZWFkZXIgaXMgYWxzbyBldmVuLiBUaGUKK2NvbnRlbnRzIG9mIGluZGl2aWR1YWwgY2h1bmtzIHdpbGwgYmUgZGVzY3JpYmVkIGluIHRoZSBmb2xsb3dpbmcgc2VjdGlvbnMuCisKKworU2ltcGxlIEZpbGUgRm9ybWF0IChMb3NzeSkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgbGF5b3V0IFNIT1VMRCBiZSB1c2VkIGlmIHRoZSBpbWFnZSByZXF1aXJlcyBfbG9zc3lfIGVuY29kaW5nIGFuZCBkb2VzIG5vdAorcmVxdWlyZSB0cmFuc3BhcmVuY3kgb3Igb3RoZXIgYWR2YW5jZWQgZmVhdHVyZXMgcHJvdmlkZWQgYnkgdGhlIGV4dGVuZGVkIGZvcm1hdC4KK0ZpbGVzIHdpdGggdGhpcyBsYXlvdXQgYXJlIHNtYWxsZXIgYW5kIHN1cHBvcnRlZCBieSBvbGRlciBzb2Z0d2FyZS4KKworU2ltcGxlIFdlYlAgKGxvc3N5KSBmaWxlIGZvcm1hdDoKKworICAgICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgfCAgICAgICAgICAgICAgICAgICAgV2ViUCBmaWxlIGhlYWRlciAoMTIgYnl0ZXMpICAgICAgICAgICAgICAgIHwKKyAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOCBjaHVuayAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKworVlA4IGNodW5rOgorCisgICAgIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKKyAgICAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICB8ICAgICAgICAgICAgICAgICAgICAgIENodW5rSGVhZGVyKCdWUDggJykgICAgICAgICAgICAgICAgICAgICAgfAorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworCitWUDggZGF0YTogX0NodW5rIFNpemVfIGJ5dGVzCisKKzogVlA4IGJpdHN0cmVhbSBkYXRhLgorCitUaGUgVlA4IGJpdHN0cmVhbSBmb3JtYXQgc3BlY2lmaWNhdGlvbiBjYW4gYmUgZm91bmQgYXQgW1ZQOCBEYXRhIEZvcm1hdCBhbmQKK0RlY29kaW5nIEd1aWRlXVt2cDhzcGVjXS4gTm90ZSB0aGF0IHRoZSBWUDggZnJhbWUgaGVhZGVyIGNvbnRhaW5zIHRoZSBWUDggZnJhbWUKK3dpZHRoIGFuZCBoZWlnaHQuIFRoYXQgaXMgYXNzdW1lZCB0byBiZSB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgY2FudmFzLgorCitUaGUgVlA4IHNwZWNpZmljYXRpb24gZGVzY3JpYmVzIGhvdyB0byBkZWNvZGUgdGhlIGltYWdlIGludG8gWSdDYkNyCitmb3JtYXQuIFRvIGNvbnZlcnQgdG8gUkdCLCBSZWMuIDYwMSBTSE9VTEQgYmUgdXNlZC4KKworCitTaW1wbGUgRmlsZSBGb3JtYXQgKExvc3NsZXNzKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKipOb3RlOioqIE9sZGVyIHJlYWRlcnMgbWF5IG5vdCBzdXBwb3J0IGZpbGVzIHVzaW5nIHRoZSBsb3NzbGVzcyBmb3JtYXQuCisKK1RoaXMgbGF5b3V0IFNIT1VMRCBiZSB1c2VkIGlmIHRoZSBpbWFnZSByZXF1aXJlcyBfbG9zc2xlc3NfIGVuY29kaW5nICh3aXRoIGFuCitvcHRpb25hbCB0cmFuc3BhcmVuY3kgY2hhbm5lbCkgYW5kIGRvZXMgbm90IHJlcXVpcmUgYWR2YW5jZWQgZmVhdHVyZXMgcHJvdmlkZWQKK2J5IHRoZSBleHRlbmRlZCBmb3JtYXQuCisKK1NpbXBsZSBXZWJQIChsb3NzbGVzcykgZmlsZSBmb3JtYXQ6CisKKyAgICAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgIHwgICAgICAgICAgICAgICAgICAgIFdlYlAgZmlsZSBoZWFkZXIgKDEyIGJ5dGVzKSAgICAgICAgICAgICAgICB8CisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMIGNodW5rICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisKK1ZQOEwgY2h1bms6CisKKyAgICAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgIHwgICAgICAgICAgICAgICAgICAgICAgQ2h1bmtIZWFkZXIoJ1ZQOEwnKSAgICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisKK1ZQOEwgZGF0YTogX0NodW5rIFNpemVfIGJ5dGVzCisKKzogVlA4TCBiaXRzdHJlYW0gZGF0YS4KKworVGhlIGN1cnJlbnQgc3BlY2lmaWNhdGlvbiBvZiB0aGUgVlA4TCBiaXRzdHJlYW0gY2FuIGJlIGZvdW5kIGF0CitbV2ViUCBMb3NzbGVzcyBCaXRzdHJlYW0gRm9ybWF0XVt3ZWJwbGxzcGVjXS4gTm90ZSB0aGF0IHRoZSBWUDhMIGhlYWRlcgorY29udGFpbnMgdGhlIFZQOEwgaW1hZ2Ugd2lkdGggYW5kIGhlaWdodC4gVGhhdCBpcyBhc3N1bWVkIHRvIGJlIHRoZSB3aWR0aAorYW5kIGhlaWdodCBvZiB0aGUgY2FudmFzLgorCisKK0V4dGVuZGVkIEZpbGUgRm9ybWF0CistLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqKk5vdGU6KiogT2xkZXIgcmVhZGVycyBtYXkgbm90IHN1cHBvcnQgZmlsZXMgdXNpbmcgdGhlIGV4dGVuZGVkIGZvcm1hdC4KKworQW4gZXh0ZW5kZWQgZm9ybWF0IGZpbGUgY29uc2lzdHMgb2Y6CisKKyAgKiBBICdWUDhYJyBjaHVuayB3aXRoIGluZm9ybWF0aW9uIGFib3V0IGZlYXR1cmVzIHVzZWQgaW4gdGhlIGZpbGUuCisKKyAgKiBBbiBvcHRpb25hbCAnSUNDUCcgY2h1bmsgd2l0aCBjb2xvciBwcm9maWxlLgorCisgICogQW4gb3B0aW9uYWwgJ0FOSU0nIGNodW5rIHdpdGggYW5pbWF0aW9uIGNvbnRyb2wgZGF0YS4KKworICAqIEltYWdlIGRhdGEuCisKKyAgKiBBbiBvcHRpb25hbCAnRVhJRicgY2h1bmsgd2l0aCBFWElGIG1ldGFkYXRhLgorCisgICogQW4gb3B0aW9uYWwgJ1hNUCAnIGNodW5rIHdpdGggWE1QIG1ldGFkYXRhLgorCisgICogQW4gb3B0aW9uYWwgbGlzdCBvZiBbdW5rbm93biBjaHVua3NdKCN1bmtub3duLWNodW5rcykuIF9cW3N0YXR1czogZXhwZXJpbWVudGFsXF1fCisKK0ZvciBhIF9zdGlsbCBpbWFnZV8sIHRoZSBfaW1hZ2UgZGF0YV8gY29uc2lzdHMgb2YgYSBzaW5nbGUgZnJhbWUsIHdoaWNoIGlzIG1hZGUKK3VwIG9mOgorCisgICogQW4gb3B0aW9uYWwgW2FscGhhIHN1YmNodW5rXSgjYWxwaGEpLgorCisgICogQSBbYml0c3RyZWFtIHN1YmNodW5rXSgjYml0c3RyZWFtLXZwOHZwOGwpLgorCitGb3IgYW4gX2FuaW1hdGVkIGltYWdlXywgdGhlIF9pbWFnZSBkYXRhXyBjb25zaXN0cyBvZiBtdWx0aXBsZSBmcmFtZXMuIE1vcmUKK2RldGFpbHMgYWJvdXQgZnJhbWVzIGNhbiBiZSBmb3VuZCBpbiB0aGUgW0FuaW1hdGlvbl0oI2FuaW1hdGlvbikgc2VjdGlvbi4KKworQWxsIGNodW5rcyBTSE9VTEQgYmUgcGxhY2VkIGluIHRoZSBzYW1lIG9yZGVyIGFzIGxpc3RlZCBhYm92ZS4gSWYgYSBjaHVuaworYXBwZWFycyBpbiB0aGUgd3JvbmcgcGxhY2UsIHRoZSBmaWxlIGlzIGludmFsaWQsIGJ1dCByZWFkZXJzIE1BWSBwYXJzZSB0aGUKK2ZpbGUsIGlnbm9yaW5nIHRoZSBjaHVua3MgdGhhdCBjb21lIHRvbyBsYXRlLgorCisqKlJhdGlvbmFsZToqKiBTZXR0aW5nIHRoZSBvcmRlciBvZiBjaHVua3Mgc2hvdWxkIGFsbG93IHF1aWNrZXIgZmlsZQorcGFyc2luZy4gRm9yIGV4YW1wbGUsIGlmIGFuICdBTFBIJyBjaHVuayBkb2VzIG5vdCBhcHBlYXIgaW4gaXRzIHJlcXVpcmVkCitwb3NpdGlvbiwgYSBkZWNvZGVyIGNhbiBjaG9vc2UgdG8gc3RvcCBzZWFyY2hpbmcgZm9yIGl0LiBUaGUgcnVsZSBvZgoraWdub3JpbmcgbGF0ZSBjaHVua3Mgc2hvdWxkIG1ha2UgcHJvZ3JhbXMgdGhhdCBuZWVkIHRvIGRvIGEgZnVsbCBzZWFyY2gKK2dpdmUgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgb25lcyBzdG9wcGluZyBlYXJseS4KKworRXh0ZW5kZWQgV2ViUCBmaWxlIGhlYWRlcjoKK3s6I2V4dGVuZGVkX2hlYWRlcn0KKworICAgICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgfCAgICAgICAgICAgICAgICAgICBXZWJQIGZpbGUgaGVhZGVyICgxMiBieXRlcykgICAgICAgICAgICAgICAgIHwKKyAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgIHwgICAgICAgICAgICAgICAgICAgICAgQ2h1bmtIZWFkZXIoJ1ZQOFgnKSAgICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICB8UnN2fEl8THxFfFh8QXxSfCAgICAgICAgICAgICAgICAgICBSZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgfAorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgfCAgICAgICAgICBDYW52YXMgV2lkdGggTWludXMgT25lICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAuLi4KKyAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgIC4uLiAgQ2FudmFzIEhlaWdodCBNaW51cyBPbmUgICAgfAorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworCitSZXNlcnZlZCAoUnN2KTogMiBiaXRzCisKKzogU0hPVUxEIGJlIGAwYC4KKworSUNDIHByb2ZpbGUgKEkpOiAxIGJpdAorCis6IFNldCBpZiB0aGUgZmlsZSBjb250YWlucyBhbiBJQ0MgcHJvZmlsZS4KKworQWxwaGEgKEwpOiAxIGJpdAorCis6IFNldCBpZiBhbnkgb2YgdGhlIGZyYW1lcyBvZiB0aGUgaW1hZ2UgY29udGFpbiB0cmFuc3BhcmVuY3kgaW5mb3JtYXRpb24KKyAgKCJhbHBoYSIpLgorCitFWElGIG1ldGFkYXRhIChFKTogMSBiaXQKKworOiBTZXQgaWYgdGhlIGZpbGUgY29udGFpbnMgRVhJRiBtZXRhZGF0YS4KKworWE1QIG1ldGFkYXRhIChYKTogMSBiaXQKKworOiBTZXQgaWYgdGhlIGZpbGUgY29udGFpbnMgWE1QIG1ldGFkYXRhLgorCitBbmltYXRpb24gKEEpOiAxIGJpdAorCis6IFNldCBpZiB0aGlzIGlzIGFuIGFuaW1hdGVkIGltYWdlLiBEYXRhIGluICdBTklNJyBhbmQgJ0FOTUYnIGNodW5rcyBzaG91bGQgYmUKKyAgdXNlZCB0byBjb250cm9sIHRoZSBhbmltYXRpb24uCisKK1Jlc2VydmVkIChSKTogMSBiaXQKKworOiBTSE9VTEQgYmUgYDBgLgorCitSZXNlcnZlZDogMjQgYml0cworCis6IFNIT1VMRCBiZSBgMGAuCisKK0NhbnZhcyBXaWR0aCBNaW51cyBPbmU6IDI0IGJpdHMKKworOiBfMS1iYXNlZF8gd2lkdGggb2YgdGhlIGNhbnZhcyBpbiBwaXhlbHMuCisgIFRoZSBhY3R1YWwgY2FudmFzIHdpZHRoIGlzICcxICsgQ2FudmFzIFdpZHRoIE1pbnVzIE9uZScKKworQ2FudmFzIEhlaWdodCBNaW51cyBPbmU6IDI0IGJpdHMKKworOiBfMS1iYXNlZF8gaGVpZ2h0IG9mIHRoZSBjYW52YXMgaW4gcGl4ZWxzLgorICBUaGUgYWN0dWFsIGNhbnZhcyBoZWlnaHQgaXMgJzEgKyBDYW52YXMgSGVpZ2h0IE1pbnVzIE9uZScKKworVGhlIHByb2R1Y3Qgb2YgX0NhbnZhcyBXaWR0aF8gYW5kIF9DYW52YXMgSGVpZ2h0XyBNVVNUIGJlIGF0IG1vc3QgYDJeMzIgLSAxYC4KKworRnV0dXJlIHNwZWNpZmljYXRpb25zIE1BWSBhZGQgbW9yZSBmaWVsZHMuCisKKyMjIyBDaHVua3MKKworIyMjIyBBbmltYXRpb24KKworQW4gYW5pbWF0aW9uIGlzIGNvbnRyb2xsZWQgYnkgQU5JTSBhbmQgQU5NRiBjaHVua3MuCisKK0FOSU0gQ2h1bms6Cit7OiNhbmltX2NodW5rfQorCitGb3IgYW4gYW5pbWF0ZWQgaW1hZ2UsIHRoaXMgY2h1bmsgY29udGFpbnMgdGhlIF9nbG9iYWwgcGFyYW1ldGVyc18gb2YgdGhlCithbmltYXRpb24uCisKKyAgICAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgIHwgICAgICAgICAgICAgICAgICAgICAgQ2h1bmtIZWFkZXIoJ0FOSU0nKSAgICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICB8ICAgICAgICAgICAgICAgICAgICAgICBCYWNrZ3JvdW5kIENvbG9yICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgfCAgICAgICAgICBMb29wIENvdW50ICAgICAgICAgICB8CisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisKK0JhY2tncm91bmQgQ29sb3I6IDMyIGJpdHMgKF91aW50MzJfKQorCis6IFRoZSBkZWZhdWx0IGJhY2tncm91bmQgY29sb3Igb2YgdGhlIGNhbnZhcyBpbiBcW0JsdWUsIEdyZWVuLCBSZWQsIEFscGhhXF0KKyAgYnl0ZSBvcmRlci4gVGhpcyBjb2xvciBNQVkgYmUgdXNlZCB0byBmaWxsIHRoZSB1bnVzZWQgc3BhY2Ugb24gdGhlIGNhbnZhcworICBhcm91bmQgdGhlIGZyYW1lcywgYXMgd2VsbCBhcyB0aGUgdHJhbnNwYXJlbnQgcGl4ZWxzIG9mIHRoZSBmaXJzdCBmcmFtZS4KKyAgQmFja2dyb3VuZCBjb2xvciBpcyBhbHNvIHVzZWQgd2hlbiBkaXNwb3NhbCBtZXRob2QgaXMgYDFgLgorCisqKk5vdGUqKjoKKworICAqIEJhY2tncm91bmQgY29sb3IgTUFZIGNvbnRhaW4gYSB0cmFuc3BhcmVuY3kgdmFsdWUgKGFscGhhKSwgZXZlbiBpZiB0aGUKKyAgICBfQWxwaGFfIGZsYWcgaW4gW1ZQOFggY2h1bmtdKCNleHRlbmRlZF9oZWFkZXIpIGlzIHVuc2V0LgorCisgICogVmlld2VyIGFwcGxpY2F0aW9ucyBTSE9VTEQgdHJlYXQgdGhlIGJhY2tncm91bmQgY29sb3IgdmFsdWUgYXMgYSBoaW50LCBhbmQKKyAgICBhcmUgbm90IHJlcXVpcmVkIHRvIHVzZSBpdC4KKworICAqIFRoZSBjYW52YXMgaXMgY2xlYXJlZCBhdCB0aGUgc3RhcnQgb2YgZWFjaCBsb29wLiBUaGUgYmFja2dyb3VuZCBjb2xvciBNQVkgYmUKKyAgICB1c2VkIHRvIGFjaGlldmUgdGhpcy4KKworTG9vcCBDb3VudDogMTYgYml0cyAoX3VpbnQxNl8pCisKKzogVGhlIG51bWJlciBvZiB0aW1lcyB0byBsb29wIHRoZSBhbmltYXRpb24uIGAwYCBtZWFucyBpbmZpbml0ZWx5LgorCitUaGlzIGNodW5rIE1VU1QgYXBwZWFyIGlmIHRoZSBfQW5pbWF0aW9uXyBmbGFnIGluIHRoZSBWUDhYIGNodW5rIGlzIHNldC4KK0lmIHRoZSBfQW5pbWF0aW9uXyBmbGFnIGlzIG5vdCBzZXQgYW5kIHRoaXMgY2h1bmsgaXMgcHJlc2VudCwgaXQKK1NIT1VMRCBiZSBpZ25vcmVkLgorCitBTk1GIGNodW5rOgorCitGb3IgYW5pbWF0ZWQgaW1hZ2VzLCB0aGlzIGNodW5rIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgX3NpbmdsZV8gZnJhbWUuCitJZiB0aGUgX0FuaW1hdGlvbiBmbGFnXyBpcyBub3Qgc2V0LCB0aGVuIHRoaXMgY2h1bmsgU0hPVUxEIE5PVCBiZSBwcmVzZW50LgorCisgICAgIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKKyAgICAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICB8ICAgICAgICAgICAgICAgICAgICAgIENodW5rSGVhZGVyKCdBTk1GJykgICAgICAgICAgICAgICAgICAgICAgfAorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgfCAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lIFggICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAuLi4KKyAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgIC4uLiAgICAgICAgICBGcmFtZSBZICAgICAgICAgICAgfCAgIEZyYW1lIFdpZHRoIE1pbnVzIE9uZSAgICAgLi4uCisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAuLi4gICAgICAgICAgICAgfCAgICAgICAgICAgRnJhbWUgSGVpZ2h0IE1pbnVzIE9uZSAgICAgICAgICAgICAgfAorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgfCAgICAgICAgICAgICAgICAgRnJhbWUgRHVyYXRpb24gICAgICAgICAgICAgICAgfCAgUmVzZXJ2ZWQgfEJ8RHwKKyAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWUgRGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKworRnJhbWUgWDogMjQgYml0cyAoX3VpbnQyNF8pCisKKzogVGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIGZyYW1lIGlzIGBGcmFtZSBYICogMmAKKworRnJhbWUgWTogMjQgYml0cyAoX3VpbnQyNF8pCisKKzogVGhlIFkgY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIGZyYW1lIGlzIGBGcmFtZSBZICogMmAKKworRnJhbWUgV2lkdGggTWludXMgT25lOiAyNCBiaXRzIChfdWludDI0XykKKworOiBUaGUgXzEtYmFzZWRfIHdpZHRoIG9mIHRoZSBmcmFtZS4KKyAgVGhlIGZyYW1lIHdpZHRoIGlzIGAxICsgRnJhbWUgV2lkdGggTWludXMgT25lYAorCitGcmFtZSBIZWlnaHQgTWludXMgT25lOiAyNCBiaXRzIChfdWludDI0XykKKworOiBUaGUgXzEtYmFzZWRfIGhlaWdodCBvZiB0aGUgZnJhbWUuCisgIFRoZSBmcmFtZSBoZWlnaHQgaXMgYDEgKyBGcmFtZSBIZWlnaHQgTWludXMgT25lYAorCitGcmFtZSBEdXJhdGlvbjogMjQgYml0cyAoX3VpbnQyNF8pCisKKzogVGhlIHRpbWUgdG8gd2FpdCBiZWZvcmUgZGlzcGxheWluZyB0aGUgbmV4dCBmcmFtZSwgaW4gMSBtaWxsaXNlY29uZCB1bml0cy4KKyAgTm90ZSB0aGUgaW50ZXJwcmV0YXRpb24gb2YgZnJhbWUgZHVyYXRpb24gb2YgMCAoYW5kIG9mdGVuIDw9IDEwKSBpcworICBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkLiBNYW55IHRvb2xzIGFuZCBicm93c2VycyBhc3NpZ24gYSBtaW5pbXVtIGR1cmF0aW9uCisgIHNpbWlsYXIgdG8gR0lGLgorCitSZXNlcnZlZDogNiBiaXRzCisKKzogU0hPVUxEIGJlIDAuCisKK0JsZW5kaW5nIG1ldGhvZCAoQik6IDEgYml0CisKKzogSW5kaWNhdGVzIGhvdyB0cmFuc3BhcmVudCBwaXhlbHMgb2YgX3RoZSBjdXJyZW50IGZyYW1lXyBhcmUgdG8gYmUgYmxlbmRlZAorICB3aXRoIGNvcnJlc3BvbmRpbmcgcGl4ZWxzIG9mIHRoZSBwcmV2aW91cyBjYW52YXM6CisKKyAgICAqIGAwYDogVXNlIGFscGhhIGJsZW5kaW5nLiBBZnRlciBkaXNwb3Npbmcgb2YgdGhlIHByZXZpb3VzIGZyYW1lLCByZW5kZXIgdGhlCisgICAgICBjdXJyZW50IGZyYW1lIG9uIHRoZSBjYW52YXMgdXNpbmcgW2FscGhhLWJsZW5kaW5nXSgjYWxwaGEtYmxlbmRpbmcpLiBJZgorICAgICAgdGhlIGN1cnJlbnQgZnJhbWUgZG9lcyBub3QgaGF2ZSBhbiBhbHBoYSBjaGFubmVsLCBhc3N1bWUgYWxwaGEgdmFsdWUgb2YKKyAgICAgIDI1NSwgZWZmZWN0aXZlbHkgcmVwbGFjaW5nIHRoZSByZWN0YW5nbGUuCisKKyAgICAqIGAxYDogRG8gbm90IGJsZW5kLiBBZnRlciBkaXNwb3Npbmcgb2YgdGhlIHByZXZpb3VzIGZyYW1lLCByZW5kZXIgdGhlCisgICAgICBjdXJyZW50IGZyYW1lIG9uIHRoZSBjYW52YXMgYnkgb3ZlcndyaXRpbmcgdGhlIHJlY3RhbmdsZSBjb3ZlcmVkIGJ5IHRoZQorICAgICAgY3VycmVudCBmcmFtZS4KKworRGlzcG9zYWwgbWV0aG9kIChEKTogMSBiaXQKKworOiBJbmRpY2F0ZXMgaG93IF90aGUgY3VycmVudCBmcmFtZV8gaXMgdG8gYmUgdHJlYXRlZCBhZnRlciBpdCBoYXMgYmVlbgorICBkaXNwbGF5ZWQgKGJlZm9yZSByZW5kZXJpbmcgdGhlIG5leHQgZnJhbWUpIG9uIHRoZSBjYW52YXM6CisKKyAgICAqIGAwYDogRG8gbm90IGRpc3Bvc2UuIExlYXZlIHRoZSBjYW52YXMgYXMgaXMuCisKKyAgICAqIGAxYDogRGlzcG9zZSB0byBiYWNrZ3JvdW5kIGNvbG9yLiBGaWxsIHRoZSBfcmVjdGFuZ2xlXyBvbiB0aGUgY2FudmFzCisgICAgICBjb3ZlcmVkIGJ5IHRoZSBfY3VycmVudCBmcmFtZV8gd2l0aCBiYWNrZ3JvdW5kIGNvbG9yIHNwZWNpZmllZCBpbiB0aGUKKyAgICAgIFtBTklNIGNodW5rXSgjYW5pbV9jaHVuaykuCisKKyoqTm90ZXMqKjoKKworICAqIFRoZSBmcmFtZSBkaXNwb3NhbCBvbmx5IGFwcGxpZXMgdG8gdGhlIF9mcmFtZSByZWN0YW5nbGVfLCB0aGF0IGlzLCB0aGUKKyAgICByZWN0YW5nbGUgZGVmaW5lZCBieSBfRnJhbWUgWF8sIF9GcmFtZSBZXywgX2ZyYW1lIHdpZHRoXyBhbmQgX2ZyYW1lIGhlaWdodF8uCisgICAgSXQgbWF5IG9yIG1heSBub3QgY292ZXIgdGhlIHdob2xlIGNhbnZhcy4KKworezojYWxwaGEtYmxlbmRpbmd9CisgICogKipBbHBoYS1ibGVuZGluZyoqOgorCisgICAgR2l2ZW4gdGhhdCBlYWNoIG9mIHRoZSBSLCBHLCBCIGFuZCBBIGNoYW5uZWxzIGlzIDgtYml0LCBhbmQgdGhlIFJHQgorICAgIGNoYW5uZWxzIGFyZSBfbm90IHByZW11bHRpcGxpZWRfIGJ5IGFscGhhLCB0aGUgZm9ybXVsYSBmb3IgYmxlbmRpbmcKKyAgICAnZHN0JyBvbnRvICdzcmMnIGlzOgorCit+fn5+fgorICAgIGJsZW5kLkEgPSBzcmMuQSArIGRzdC5BICogKDEgLSBzcmMuQSAvIDI1NSkKKyAgICBpZiBibGVuZC5BID0gMCB0aGVuCisgICAgICBibGVuZC5SR0IgPSAwCisgICAgZWxzZQorICAgICAgYmxlbmQuUkdCID0gKHNyYy5SR0IgKiBzcmMuQSArCisgICAgICAgICAgICAgICAgICAgZHN0LlJHQiAqIGRzdC5BICogKDEgLSBzcmMuQSAvIDI1NSkpIC8gYmxlbmQuQQorfn5+fn4KKworICAqIEFscGhhLWJsZW5kaW5nIFNIT1VMRCBiZSBkb25lIGluIGxpbmVhciBjb2xvciBzcGFjZSwgYnkgdGFraW5nIGludG8gYWNjb3VudAorICAgIHRoZSBbY29sb3IgcHJvZmlsZV0oI2NvbG9yLXByb2ZpbGUpIG9mIHRoZSBpbWFnZS4gSWYgdGhlIGNvbG9yIHByb2ZpbGUgaXMKKyAgICBub3QgcHJlc2VudCwgc1JHQiBpcyB0byBiZSBhc3N1bWVkLiAoTm90ZSB0aGF0IHNSR0IgYWxzbyBuZWVkcyB0byBiZQorICAgIGxpbmVhcml6ZWQgZHVlIHRvIGEgZ2FtbWEgb2YgfjIuMikuCisKK0ZyYW1lIERhdGE6IF9DaHVuayBTaXplXyAtIGAxNmAgYnl0ZXMKKworOiBDb25zaXN0cyBvZjoKKworICAqIEFuIG9wdGlvbmFsIFthbHBoYSBzdWJjaHVua10oI2FscGhhKSBmb3IgdGhlIGZyYW1lLgorCisgICogQSBbYml0c3RyZWFtIHN1YmNodW5rXSgjYml0c3RyZWFtLXZwOHZwOGwpIGZvciB0aGUgZnJhbWUuCisKKyAgKiBBbiBvcHRpb25hbCBsaXN0IG9mIFt1bmtub3duIGNodW5rc10oI3Vua25vd24tY2h1bmtzKS4KKworKipOb3RlKio6IFRoZSAnQU5NRicgcGF5bG9hZCwgX0ZyYW1lIERhdGFfIGFib3ZlLCBjb25zaXN0cyBvZiBpbmRpdmlkdWFsCitfcGFkZGVkXyBjaHVua3MgYXMgZGVzY3JpYmVkIGJ5IHRoZSBbUklGRiBmaWxlIGZvcm1hdF0oI3JpZmYtZmlsZS1mb3JtYXQpLgorCisjIyMjIEFscGhhCisKKyAgICAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgIHwgICAgICAgICAgICAgICAgICAgICAgQ2h1bmtIZWFkZXIoJ0FMUEgnKSAgICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICB8UnN2fCBQIHwgRiB8IEMgfCAgICAgQWxwaGEgQml0c3RyZWFtLi4uICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisKK1Jlc2VydmVkIChSc3YpOiAyIGJpdHMKKworOiBTSE9VTEQgYmUgYDBgLgorCitQcmUtcHJvY2Vzc2luZyAoUCk6IDIgYml0cworCis6IFRoZXNlIElORk9STUFUSVZFIGJpdHMgYXJlIHVzZWQgdG8gc2lnbmFsIHRoZSBwcmUtcHJvY2Vzc2luZyB0aGF0IGhhcworICBiZWVuIHBlcmZvcm1lZCBkdXJpbmcgY29tcHJlc3Npb24uIFRoZSBkZWNvZGVyIGNhbiB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0bworICBlLmcuIGRpdGhlciB0aGUgdmFsdWVzIG9yIHNtb290aCB0aGUgZ3JhZGllbnRzIHByaW9yIHRvIGRpc3BsYXkuCisKKyAgICAqIGAwYDogbm8gcHJlLXByb2Nlc3NpbmcKKyAgICAqIGAxYDogbGV2ZWwgcmVkdWN0aW9uCisKK0ZpbHRlcmluZyBtZXRob2QgKEYpOiAyIGJpdHMKKworOiBUaGUgZmlsdGVyaW5nIG1ldGhvZCB1c2VkOgorCisgICAgKiBgMGA6IE5vbmUuCisgICAgKiBgMWA6IEhvcml6b250YWwgZmlsdGVyLgorICAgICogYDJgOiBWZXJ0aWNhbCBmaWx0ZXIuCisgICAgKiBgM2A6IEdyYWRpZW50IGZpbHRlci4KKworRm9yIGVhY2ggcGl4ZWwsIGZpbHRlcmluZyBpcyBwZXJmb3JtZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBjYWxjdWxhdGlvbnMuCitBc3N1bWUgdGhlIGFscGhhIHZhbHVlcyBzdXJyb3VuZGluZyB0aGUgY3VycmVudCBgWGAgcG9zaXRpb24gYXJlIGxhYmVsZWQgYXM6CisKKyAgICAgQyB8IEIgfAorICAgIC0tLSstLS0rCisgICAgIEEgfCBYIHwKKworV2Ugc2VlayB0byBjb21wdXRlIHRoZSBhbHBoYSB2YWx1ZSBhdCBwb3NpdGlvbiBgWGAuIEZpcnN0LCBhIHByZWRpY3Rpb24gaXMKK21hZGUgZGVwZW5kaW5nIG9uIHRoZSBmaWx0ZXJpbmcgbWV0aG9kOgorCisgICogTWV0aG9kIGAwYDogcHJlZGljdG9yID0gMAorICAqIE1ldGhvZCBgMWA6IHByZWRpY3RvciA9IEEKKyAgKiBNZXRob2QgYDJgOiBwcmVkaWN0b3IgPSBCCisgICogTWV0aG9kIGAzYDogcHJlZGljdG9yID0gY2xpcChBICsgQiAtIEMpCisKK3doZXJlIGBjbGlwKHYpYCBpcyBlcXVhbCB0bzoKKworICAqIDAgICAgaWYgdiA8IDAKKyAgKiAyNTUgIGlmIHYgPiAyNTUKKyAgKiB2ICAgIG90aGVyd2lzZQorCitUaGUgZmluYWwgdmFsdWUgaXMgZGVyaXZlZCBieSBhZGRpbmcgdGhlIGRlY29tcHJlc3NlZCB2YWx1ZSBgWGAgdG8gdGhlCitwcmVkaWN0b3IgYW5kIHVzaW5nIG1vZHVsby0yNTYgYXJpdGhtZXRpYyB0byB3cmFwIHRoZSBcWzI1Ni01MTFcXSByYW5nZQoraW50byB0aGUgXFswLTI1NVxdIG9uZToKKworYGFscGhhID0gKHByZWRpY3RvciArIFgpICUgMjU2YAorCitUaGVyZSBhcmUgc3BlY2lhbCBjYXNlcyBmb3IgbGVmdC1tb3N0IGFuZCB0b3AtbW9zdCBwaXhlbCBwb3NpdGlvbnM6CisKKyAgKiBUb3AtbGVmdCB2YWx1ZSBhdCBsb2NhdGlvbiAoMCwwKSB1c2VzIDAgYXMgcHJlZGljdG9yIHZhbHVlLiBPdGhlcndpc2UsCisgICogRm9yIGhvcml6b250YWwgb3IgZ3JhZGllbnQgZmlsdGVyaW5nIG1ldGhvZHMsIHRoZSBsZWZ0LW1vc3QgcGl4ZWxzIGF0CisgICAgbG9jYXRpb24gKDAsIHkpIGFyZSBwcmVkaWN0ZWQgdXNpbmcgdGhlIGxvY2F0aW9uICgwLCB5LTEpIGp1c3QgYWJvdmUuCisgICogRm9yIHZlcnRpY2FsIG9yIGdyYWRpZW50IGZpbHRlcmluZyBtZXRob2RzLCB0aGUgdG9wLW1vc3QgcGl4ZWxzIGF0CisgICAgbG9jYXRpb24gKHgsIDApIGFyZSBwcmVkaWN0ZWQgdXNpbmcgdGhlIGxvY2F0aW9uICh4LTEsIDApIG9uIHRoZSBsZWZ0LgorCisKK0RlY29kZXJzIGFyZSBub3QgcmVxdWlyZWQgdG8gdXNlIHRoaXMgaW5mb3JtYXRpb24gaW4gYW55IHNwZWNpZmllZCB3YXkuCisKK0NvbXByZXNzaW9uIG1ldGhvZCAoQyk6IDIgYml0cworCis6IFRoZSBjb21wcmVzc2lvbiBtZXRob2QgdXNlZDoKKworICAgICogYDBgOiBObyBjb21wcmVzc2lvbi4KKyAgICAqIGAxYDogQ29tcHJlc3NlZCB1c2luZyB0aGUgV2ViUCBsb3NzbGVzcyBmb3JtYXQuCisKK0FscGhhIGJpdHN0cmVhbTogX0NodW5rIFNpemVfIC0gYDFgIGJ5dGVzCisKKzogRW5jb2RlZCBhbHBoYSBiaXRzdHJlYW0uCisKK1RoaXMgb3B0aW9uYWwgY2h1bmsgY29udGFpbnMgZW5jb2RlZCBhbHBoYSBkYXRhIGZvciB0aGlzIGZyYW1lLiBBIGZyYW1lCitjb250YWluaW5nIGEgJ1ZQOEwnIGNodW5rIFNIT1VMRCBOT1QgY29udGFpbiB0aGlzIGNodW5rLgorCisqKlJhdGlvbmFsZSoqOiBUaGUgdHJhbnNwYXJlbmN5IGluZm9ybWF0aW9uIGlzIGFscmVhZHkgcGFydCBvZiB0aGUgJ1ZQOEwnCitjaHVuay4KKworVGhlIGFscGhhIGNoYW5uZWwgZGF0YSBpcyBzdG9yZWQgYXMgdW5jb21wcmVzc2VkIHJhdyBkYXRhICh3aGVuCitjb21wcmVzc2lvbiBtZXRob2QgaXMgJzAnKSBvciBjb21wcmVzc2VkIHVzaW5nIHRoZSBsb3NzbGVzcyBmb3JtYXQKKyh3aGVuIHRoZSBjb21wcmVzc2lvbiBtZXRob2QgaXMgJzEnKS4KKworICAqIFJhdyBkYXRhOiBjb25zaXN0cyBvZiBhIGJ5dGUgc2VxdWVuY2Ugb2YgbGVuZ3RoIHdpZHRoICogaGVpZ2h0LAorICAgIGNvbnRhaW5pbmcgYWxsIHRoZSA4LWJpdCB0cmFuc3BhcmVuY3kgdmFsdWVzIGluIHNjYW4gb3JkZXIuCisKKyAgKiBMb3NzbGVzcyBmb3JtYXQgY29tcHJlc3Npb246IHRoZSBieXRlIHNlcXVlbmNlIGlzIGEgY29tcHJlc3NlZAorICAgIGltYWdlLXN0cmVhbSAoYXMgZGVzY3JpYmVkIGluIHRoZSBbV2ViUCBMb3NzbGVzcyBCaXRzdHJlYW0gRm9ybWF0XQorICAgIFt3ZWJwbGxzcGVjXSkgb2YgaW1wbGljaXQgZGltZW5zaW9uIHdpZHRoIHggaGVpZ2h0LiBUaGF0IGlzLCB0aGlzCisgICAgaW1hZ2Utc3RyZWFtIGRvZXMgTk9UIGNvbnRhaW4gYW55IGhlYWRlcnMgZGVzY3JpYmluZyB0aGUgaW1hZ2UgZGltZW5zaW9uLgorCisgICAgKipSYXRpb25hbGUqKjogdGhlIGRpbWVuc2lvbiBpcyBhbHJlYWR5IGtub3duIGZyb20gb3RoZXIgc291cmNlcywKKyAgICBzbyBzdG9yaW5nIGl0IGFnYWluIHdvdWxkIGJlIHJlZHVuZGFudCBhbmQgZXJyb3ItcHJvbmUuCisKKyAgICBPbmNlIHRoZSBpbWFnZS1zdHJlYW0gaXMgZGVjb2RlZCBpbnRvIEFSR0IgY29sb3IgdmFsdWVzLCBmb2xsb3dpbmcKKyAgICB0aGUgcHJvY2VzcyBkZXNjcmliZWQgaW4gdGhlIGxvc3NsZXNzIGZvcm1hdCBzcGVjaWZpY2F0aW9uLCB0aGUKKyAgICB0cmFuc3BhcmVuY3kgaW5mb3JtYXRpb24gbXVzdCBiZSBleHRyYWN0ZWQgZnJvbSB0aGUgKmdyZWVuKiBjaGFubmVsCisgICAgb2YgdGhlIEFSR0IgcXVhZHJ1cGxldC4KKworICAgICoqUmF0aW9uYWxlKio6IHRoZSBncmVlbiBjaGFubmVsIGlzIGFsbG93ZWQgZXh0cmEgdHJhbnNmb3JtYXRpb24KKyAgICBzdGVwcyBpbiB0aGUgc3BlY2lmaWNhdGlvbiAtLSB1bmxpa2UgdGhlIG90aGVyIGNoYW5uZWxzIC0tIHRoYXQgY2FuCisgICAgaW1wcm92ZSBjb21wcmVzc2lvbi4KKworIyMjIyBCaXRzdHJlYW0gKFZQOC9WUDhMKQorCitUaGlzIGNodW5rIGNvbnRhaW5zIGNvbXByZXNzZWQgYml0c3RyZWFtIGRhdGEgZm9yIGEgc2luZ2xlIGZyYW1lLgorCitBIGJpdHN0cmVhbSBjaHVuayBtYXkgYmUgZWl0aGVyIChpKSBhIFZQOCBjaHVuaywgdXNpbmcgIlZQOCAiIChub3RlIHRoZQorc2lnbmlmaWNhbnQgZm91cnRoLWNoYXJhY3RlciBzcGFjZSkgYXMgaXRzIHRhZyBfb3JfIChpaSkgYSBWUDhMIGNodW5rLCB1c2luZworIlZQOEwiIGFzIGl0cyB0YWcuCisKK1RoZSBmb3JtYXRzIG9mIFZQOCBhbmQgVlA4TCBjaHVua3MgYXJlIGFzIGRlc2NyaWJlZCBpbiBzZWN0aW9ucworW1NpbXBsZSBGaWxlIEZvcm1hdCAoTG9zc3kpXSgjc2ltcGxlLWZpbGUtZm9ybWF0LWxvc3N5KQorYW5kIFtTaW1wbGUgRmlsZSBGb3JtYXQgKExvc3NsZXNzKV0oI3NpbXBsZS1maWxlLWZvcm1hdC1sb3NzbGVzcykgcmVzcGVjdGl2ZWx5LgorCisjIyMjIENvbG9yIHByb2ZpbGUKKworICAgICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgfCAgICAgICAgICAgICAgICAgICAgICBDaHVua0hlYWRlcignSUNDUCcpICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgIHwgICAgICAgICAgICAgICAgICAgICAgIENvbG9yIFByb2ZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKworQ29sb3IgUHJvZmlsZTogX0NodW5rIFNpemVfIGJ5dGVzCisKKzogSUNDIHByb2ZpbGUuCisKK1RoaXMgY2h1bmsgTVVTVCBhcHBlYXIgYmVmb3JlIHRoZSBpbWFnZSBkYXRhLgorCitUaGVyZSBTSE9VTEQgYmUgYXQgbW9zdCBvbmUgc3VjaCBjaHVuay4gSWYgdGhlcmUgYXJlIG1vcmUgc3VjaCBjaHVua3MsIHJlYWRlcnMKK01BWSBpZ25vcmUgYWxsIGV4Y2VwdCB0aGUgZmlyc3Qgb25lLgorU2VlIHRoZSBbSUNDIFNwZWNpZmljYXRpb25dW2ljY3NwZWNdIGZvciBkZXRhaWxzLgorCitJZiB0aGlzIGNodW5rIGlzIG5vdCBwcmVzZW50LCBzUkdCIFNIT1VMRCBiZSBhc3N1bWVkLgorCisjIyMjIE1ldGFkYXRhCisKK01ldGFkYXRhIGNhbiBiZSBzdG9yZWQgaW4gJ0VYSUYnIG9yICdYTVAgJyBjaHVua3MuCisKK1RoZXJlIFNIT1VMRCBiZSBhdCBtb3N0IG9uZSBjaHVuayBvZiBlYWNoIHR5cGUgKCdFWElGJyBhbmQgJ1hNUCAnKS4gSWYgdGhlcmUKK2FyZSBtb3JlIHN1Y2ggY2h1bmtzLCByZWFkZXJzIE1BWSBpZ25vcmUgYWxsIGV4Y2VwdCB0aGUgZmlyc3Qgb25lLiBBbHNvLCBhIGZpbGUKK21heSBwb3NzaWJseSBjb250YWluIGJvdGggJ0VYSUYnIGFuZCAnWE1QICcgY2h1bmtzLgorCitUaGUgY2h1bmtzIGFyZSBkZWZpbmVkIGFzIGZvbGxvd3M6CisKK0VYSUYgY2h1bms6CisKKyAgICAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgIHwgICAgICAgICAgICAgICAgICAgICAgQ2h1bmtIZWFkZXIoJ0VYSUYnKSAgICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgRVhJRiBNZXRhZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisKK0VYSUYgTWV0YWRhdGE6IF9DaHVuayBTaXplXyBieXRlcworCis6IGltYWdlIG1ldGFkYXRhIGluIEVYSUYgZm9ybWF0LgorCitYTVAgY2h1bms6CisKKyAgICAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgIHwgICAgICAgICAgICAgICAgICAgICAgQ2h1bmtIZWFkZXIoJ1hNUCAnKSAgICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgWE1QIE1ldGFkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisKK1hNUCBNZXRhZGF0YTogX0NodW5rIFNpemVfIGJ5dGVzCisKKzogaW1hZ2UgbWV0YWRhdGEgaW4gWE1QIGZvcm1hdC4KKworQWRkaXRpb25hbCBndWlkYW5jZSBhYm91dCBoYW5kbGluZyBtZXRhZGF0YSBjYW4gYmUgZm91bmQgaW4gdGhlCitNZXRhZGF0YSBXb3JraW5nIEdyb3VwJ3MgW0d1aWRlbGluZXMgZm9yIEhhbmRsaW5nIE1ldGFkYXRhXVttZXRhZGF0YV0uCisKKyMjIyMgVW5rbm93biBDaHVua3MgX1xbc3RhdHVzOiBleHBlcmltZW50YWxcXV8KKworQSBSSUZGIGNodW5rIChkZXNjcmliZWQgaW4gW3RoaXNdKCN0ZXJtaW5vbG9neS1hbXAtYmFzaWNzKSBzZWN0aW9uKSB3aG9zZSBfY2h1bmsKK3RhZ18gaXMgZGlmZmVyZW50IGZyb20gYW55IG9mIHRoZSBjaHVua3MgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQsIGlzCitjb25zaWRlcmVkIGFuIF91bmtub3duIGNodW5rXy4KKworKipSYXRpb25hbGUqKjogQWxsb3dpbmcgdW5rbm93biBjaHVua3MgZ2l2ZXMgYSBwcm92aXNpb24gZm9yIGZ1dHVyZSBleHRlbnNpb24KK29mIHRoZSBmb3JtYXQsIGFuZCBhbHNvIGFsbG93cyBzdG9yYWdlIG9mIGFueSBhcHBsaWNhdGlvbi1zcGVjaWZpYyBkYXRhLgorCitBIGZpbGUgTUFZIGNvbnRhaW4gdW5rbm93biBjaHVua3M6CisKKyAgKiBBdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGFzIGRlc2NyaWJlZCBpbiBbRXh0ZW5kZWQgV2ViUCBmaWxlCisgICAgaGVhZGVyXSgjZXh0ZW5kZWRfaGVhZGVyKSBzZWN0aW9uLgorICAqIEF0IHRoZSBlbmQgb2YgQU5NRiBjaHVua3MgYXMgZGVzY3JpYmVkIGluIHRoZQorICAgIFtBbmltYXRpb25dKCNhbmltYXRpb24pIHNlY3Rpb24uCisKK1JlYWRlcnMgU0hPVUxEIGlnbm9yZSB0aGVzZSBjaHVua3MuIFdyaXRlcnMgU0hPVUxEIHByZXNlcnZlIHRoZW0gaW4gdGhlaXIKK29yaWdpbmFsIG9yZGVyICh1bmxlc3MgdGhleSBzcGVjaWZpY2FsbHkgaW50ZW5kIHRvIG1vZGlmeSB0aGVzZSBjaHVua3MpLgorCisjIyMgQXNzZW1ibGluZyB0aGUgQ2FudmFzIGZyb20gZnJhbWVzCisKK0hlcmUgd2UgcHJvdmlkZSBhbiBvdmVydmlldyBvZiBob3cgYSByZWFkZXIgc2hvdWxkIGFzc2VtYmxlIGEgY2FudmFzIGluIHRoZQorY2FzZSBvZiBhbiBhbmltYXRlZCBpbWFnZS4gVGhlIG5vdGF0aW9uIF9WUDhYLmZpZWxkXyBtZWFucyB0aGUgZmllbGQgaW4gdGhlCisnVlA4WCcgY2h1bmsgd2l0aCB0aGUgc2FtZSBkZXNjcmlwdGlvbi4KKworRGlzcGxheWluZyBhbiBfYW5pbWF0ZWQgaW1hZ2VfIGNhbnZhcyBNVVNUIGJlIGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZworcHNldWRvY29kZToKKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK2Fzc2VydCBWUDhYLmZsYWdzLmhhc0FuaW1hdGlvbgorY2FudmFzIOKGkCBuZXcgaW1hZ2Ugb2Ygc2l6ZSBWUDhYLmNhbnZhc1dpZHRoIHggVlA4WC5jYW52YXNIZWlnaHQgd2l0aAorICAgICAgICAgYmFja2dyb3VuZCBjb2xvciBBTklNLmJhY2tncm91bmRfY29sb3IuCitsb29wX2NvdW50IOKGkCBBTklNLmxvb3BDb3VudAorZGlzcG9zZV9tZXRob2Qg4oaQIEFOSU0uZGlzcG9zZU1ldGhvZAoraWYgbG9vcF9jb3VudCA9PSAwOgorICAgIGxvb3BfY291bnQgPSDiiJ4KK2ZyYW1lX3BhcmFtcyDihpAgbmlsCithc3NlcnQgbmV4dCBjaHVuayBpbiBpbWFnZV9kYXRhIGlzIEFOTUYKK2ZvciBsb29wID0gMC4ubG9vcF9jb3VudCAtIDEKKyAgICBjbGVhciBjYW52YXMgdG8gQU5JTS5iYWNrZ3JvdW5kX2NvbG9yIG9yIGFwcGxpY2F0aW9uIGRlZmluZWQgY29sb3IKKyAgICB1bnRpbCBlb2Ygb3Igbm9uLUFOTUYgY2h1bmsKKyAgICAgICAgZnJhbWVfcGFyYW1zLmZyYW1lWCA9IEZyYW1lIFgKKyAgICAgICAgZnJhbWVfcGFyYW1zLmZyYW1lWSA9IEZyYW1lIFkKKyAgICAgICAgZnJhbWVfcGFyYW1zLmZyYW1lV2lkdGggPSBGcmFtZSBXaWR0aCBNaW51cyBPbmUgKyAxCisgICAgICAgIGZyYW1lX3BhcmFtcy5mcmFtZUhlaWdodCA9IEZyYW1lIEhlaWdodCBNaW51cyBPbmUgKyAxCisgICAgICAgIGZyYW1lX3BhcmFtcy5mcmFtZUR1cmF0aW9uID0gRnJhbWUgRHVyYXRpb24KKyAgICAgICAgZnJhbWVfcmlnaHQgPSBmcmFtZV9wYXJhbXMuZnJhbWVYICsgZnJhbWVfcGFyYW1zLmZyYW1lV2lkdGgKKyAgICAgICAgZnJhbWVfYm90dG9tID0gZnJhbWVfcGFyYW1zLmZyYW1lWSArIGZyYW1lX3BhcmFtcy5mcmFtZUhlaWdodAorICAgICAgICBhc3NlcnQgVlA4WC5jYW52YXNXaWR0aCA+PSBmcmFtZV9yaWdodAorICAgICAgICBhc3NlcnQgVlA4WC5jYW52YXNIZWlnaHQgPj0gZnJhbWVfYm90dG9tCisgICAgICAgIGZvciBzdWJjaHVuayBpbiAnRnJhbWUgRGF0YSc6CisgICAgICAgICAgICBpZiBzdWJjaHVuay50YWcgPT0gIkFMUEgiOgorICAgICAgICAgICAgICAgIGFzc2VydCBhbHBoYSBzdWJjaHVua3Mgbm90IGZvdW5kIGluICdGcmFtZSBEYXRhJyBlYXJsaWVyCisgICAgICAgICAgICAgICAgZnJhbWVfcGFyYW1zLmFscGhhID0gYWxwaGFfZGF0YQorICAgICAgICAgICAgZWxzZSBpZiBzdWJjaHVuay50YWcgPT0gIlZQOCAiIE9SIHN1YmNodW5rLnRhZyA9PSAiVlA4TCI6CisgICAgICAgICAgICAgICAgYXNzZXJ0IGJpdHN0cmVhbSBzdWJjaHVua3Mgbm90IGZvdW5kIGluICdGcmFtZSBEYXRhJyBlYXJsaWVyCisgICAgICAgICAgICAgICAgZnJhbWVfcGFyYW1zLmJpdHN0cmVhbSA9IGJpdHN0cmVhbV9kYXRhCisgICAgICAgIHJlbmRlciBmcmFtZSB3aXRoIGZyYW1lX3BhcmFtcy5hbHBoYSBhbmQgZnJhbWVfcGFyYW1zLmJpdHN0cmVhbSBvbgorICAgICAgICAgICAgY2FudmFzIHdpdGggdG9wLWxlZnQgY29ybmVyIGF0IChmcmFtZV9wYXJhbXMuZnJhbWVYLAorICAgICAgICAgICAgZnJhbWVfcGFyYW1zLmZyYW1lWSksIHVzaW5nIGRpc3Bvc2UgbWV0aG9kIGRpc3Bvc2VfbWV0aG9kLgorICAgICAgICBjYW52YXMgY29udGFpbnMgdGhlIGRlY29kZWQgaW1hZ2UuCisgICAgICAgIFNob3cgdGhlIGNvbnRlbnRzIG9mIHRoZSBjYW52YXMgZm9yIGZyYW1lX3BhcmFtcy5mcmFtZUR1cmF0aW9uICogMW1zLgorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworCitFeGFtcGxlIEZpbGUgTGF5b3V0cworLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQSBsb3NzeSBlbmNvZGVkIGltYWdlIHdpdGggYWxwaGEgbWF5IGxvb2sgYXMgZm9sbG93czoKKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK1JJRkYvV0VCUAorKy0gVlA4WCAoZGVzY3JpcHRpb25zIG9mIGZlYXR1cmVzIHVzZWQpCisrLSBBTFBIIChhbHBoYSBiaXRzdHJlYW0pCisrLSBWUDggKGJpdHN0cmVhbSkKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK0EgbG9zc2xlc3NseSBlbmNvZGVkIGltYWdlIG1heSBsb29rIGFzIGZvbGxvd3M6CisKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitSSUZGL1dFQlAKKystIFZQOFggKGRlc2NyaXB0aW9ucyBvZiBmZWF0dXJlcyB1c2VkKQorKy0gWFlaVyAodW5rbm93biBjaHVuaykKKystIFZQOEwgKGxvc3NsZXNzIGJpdHN0cmVhbSkKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK0EgbG9zc2xlc3MgaW1hZ2Ugd2l0aCBJQ0MgcHJvZmlsZSBhbmQgWE1QIG1ldGFkYXRhIG1heQorbG9vayBhcyBmb2xsb3dzOgorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorUklGRi9XRUJQCisrLSBWUDhYIChkZXNjcmlwdGlvbnMgb2YgZmVhdHVyZXMgdXNlZCkKKystIElDQ1AgKGNvbG9yIHByb2ZpbGUpCisrLSBWUDhMIChsb3NzbGVzcyBiaXRzdHJlYW0pCisrLSBYTVAgIChtZXRhZGF0YSkKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK0FuIGFuaW1hdGVkIGltYWdlIHdpdGggRVhJRiBtZXRhZGF0YSBtYXkgbG9vayBhcyBmb2xsb3dzOgorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorUklGRi9XRUJQCisrLSBWUDhYIChkZXNjcmlwdGlvbnMgb2YgZmVhdHVyZXMgdXNlZCkKKystIEFOSU0gKGdsb2JhbCBhbmltYXRpb24gcGFyYW1ldGVycykKKystIEFOTUYgKGZyYW1lMSBwYXJhbWV0ZXJzICsgZGF0YSkKKystIEFOTUYgKGZyYW1lMiBwYXJhbWV0ZXJzICsgZGF0YSkKKystIEFOTUYgKGZyYW1lMyBwYXJhbWV0ZXJzICsgZGF0YSkKKystIEFOTUYgKGZyYW1lNCBwYXJhbWV0ZXJzICsgZGF0YSkKKystIEVYSUYgKG1ldGFkYXRhKQorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworW3ZwOHNwZWNdOiAgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjM4NgorW3dlYnBsbHNwZWNdOiBodHRwczovL2Nocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vd2VibS9saWJ3ZWJwLysvbWFzdGVyL2RvYy93ZWJwLWxvc3NsZXNzLWJpdHN0cmVhbS1zcGVjLnR4dAorW2ljY3NwZWNdOiBodHRwOi8vd3d3LmNvbG9yLm9yZy9pY2Nfc3BlY3MyLnhhbHRlcgorW21ldGFkYXRhXTogaHR0cDovL3d3dy5tZXRhZGF0YXdvcmtpbmdncm91cC5vcmcvcGRmL213Z19ndWlkYW5jZS5wZGYKK1tyZmMgMTE2Nl06IGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzExNjYKK1tyZmMgMjExOV06IGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzIxMTkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RvYy93ZWJwLWxvc3NsZXNzLWJpdHN0cmVhbS1zcGVjLnR4dCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RvYy93ZWJwLWxvc3NsZXNzLWJpdHN0cmVhbS1zcGVjLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDJkZGUxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZG9jL3dlYnAtbG9zc2xlc3MtYml0c3RyZWFtLXNwZWMudHh0CkBAIC0wLDAgKzEsMTA5MCBAQAorPCEtLQorCitBbHRob3VnaCB5b3UgbWF5IGJlIHZpZXdpbmcgYW4gYWx0ZXJuYXRlIHJlcHJlc2VudGF0aW9uLCB0aGlzIGRvY3VtZW50CitpcyBzb3VyY2VkIGluIE1hcmtkb3duLCBhIGxpZ2h0LWR1dHkgbWFya3VwIHNjaGVtZSwgYW5kIGlzIG9wdGltaXplZCBmb3IKK3RoZSBba3JhbWRvd25dKGh0dHA6Ly9rcmFtZG93bi5ydWJ5Zm9yZ2Uub3JnLykgdHJhbnNmb3JtZXIuCisKK1NlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRS4gRXh0ZXJuYWwgbGluayB0YXJnZXRzIGFyZSByZWZlcmVuY2VkIGF0IHRoZQorZW5kIG9mIHRoaXMgZmlsZS4KKworLS0+CisKK1NwZWNpZmljYXRpb24gZm9yIFdlYlAgTG9zc2xlc3MgQml0c3RyZWFtCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitfSnlya2kgQWxha3VpamFsYSwgUGguRC4sIEdvb2dsZSwgSW5jLiwgMjAxMi0wNi0xOV8KKworUGFyYWdyYXBocyBtYXJrZWQgYXMgXFtBTUVOREVEXF0gd2VyZSBhbWVuZGVkIG9uIDIwMTQtMDktMTYuCisKK0Fic3RyYWN0CistLS0tLS0tLQorCitXZWJQIGxvc3NsZXNzIGlzIGFuIGltYWdlIGZvcm1hdCBmb3IgbG9zc2xlc3MgY29tcHJlc3Npb24gb2YgQVJHQgoraW1hZ2VzLiBUaGUgbG9zc2xlc3MgZm9ybWF0IHN0b3JlcyBhbmQgcmVzdG9yZXMgdGhlIHBpeGVsIHZhbHVlcworZXhhY3RseSwgaW5jbHVkaW5nIHRoZSBjb2xvciB2YWx1ZXMgZm9yIHplcm8gYWxwaGEgcGl4ZWxzLiBUaGUKK2Zvcm1hdCB1c2VzIHN1YnJlc29sdXRpb24gaW1hZ2VzLCByZWN1cnNpdmVseSBlbWJlZGRlZCBpbnRvIHRoZSBmb3JtYXQKK2l0c2VsZiwgZm9yIHN0b3Jpbmcgc3RhdGlzdGljYWwgZGF0YSBhYm91dCB0aGUgaW1hZ2VzLCBzdWNoIGFzIHRoZSB1c2VkCitlbnRyb3B5IGNvZGVzLCBzcGF0aWFsIHByZWRpY3RvcnMsIGNvbG9yIHNwYWNlIGNvbnZlcnNpb24sIGFuZCBjb2xvcgordGFibGUuIExaNzcsIEh1ZmZtYW4gY29kaW5nLCBhbmQgYSBjb2xvciBjYWNoZSBhcmUgdXNlZCBmb3IgY29tcHJlc3Npb24KK29mIHRoZSBidWxrIGRhdGEuIERlY29kaW5nIHNwZWVkcyBmYXN0ZXIgdGhhbiBQTkcgaGF2ZSBiZWVuCitkZW1vbnN0cmF0ZWQsIGFzIHdlbGwgYXMgMjUlIGRlbnNlciBjb21wcmVzc2lvbiB0aGFuIGNhbiBiZSBhY2hpZXZlZAordXNpbmcgdG9kYXkncyBQTkcgZm9ybWF0LgorCisKKyogVE9DIHBsYWNlaG9sZGVyCit7OnRvY30KKworCitOb21lbmNsYXR1cmUKKy0tLS0tLS0tLS0tLQorCitBUkdCCis6IEEgcGl4ZWwgdmFsdWUgY29uc2lzdGluZyBvZiBhbHBoYSwgcmVkLCBncmVlbiwgYW5kIGJsdWUgdmFsdWVzLgorCitBUkdCIGltYWdlCis6IEEgdHdvLWRpbWVuc2lvbmFsIGFycmF5IGNvbnRhaW5pbmcgQVJHQiBwaXhlbHMuCisKK2NvbG9yIGNhY2hlCis6IEEgc21hbGwgaGFzaC1hZGRyZXNzZWQgYXJyYXkgdG8gc3RvcmUgcmVjZW50bHkgdXNlZCBjb2xvcnMsIHRvIGJlIGFibGUKKyAgdG8gcmVjYWxsIHRoZW0gd2l0aCBzaG9ydGVyIGNvZGVzLgorCitjb2xvciBpbmRleGluZyBpbWFnZQorOiBBIG9uZS1kaW1lbnNpb25hbCBpbWFnZSBvZiBjb2xvcnMgdGhhdCBjYW4gYmUgaW5kZXhlZCB1c2luZyBhIHNtYWxsCisgIGludGVnZXIgKHVwIHRvIDI1NiB3aXRoaW4gV2ViUCBsb3NzbGVzcykuCisKK2NvbG9yIHRyYW5zZm9ybSBpbWFnZQorOiBBIHR3by1kaW1lbnNpb25hbCBzdWJyZXNvbHV0aW9uIGltYWdlIGNvbnRhaW5pbmcgZGF0YSBhYm91dAorICBjb3JyZWxhdGlvbnMgb2YgY29sb3IgY29tcG9uZW50cy4KKworZGlzdGFuY2UgbWFwcGluZworOiBDaGFuZ2VzIExaNzcgZGlzdGFuY2VzIHRvIGhhdmUgdGhlIHNtYWxsZXN0IHZhbHVlcyBmb3IgcGl4ZWxzIGluIDJECisgIHByb3hpbWl0eS4KKworZW50cm9weSBpbWFnZQorOiBBIHR3by1kaW1lbnNpb25hbCBzdWJyZXNvbHV0aW9uIGltYWdlIGluZGljYXRpbmcgd2hpY2ggZW50cm9weSBjb2RpbmcKKyAgc2hvdWxkIGJlIHVzZWQgaW4gYSByZXNwZWN0aXZlIHNxdWFyZSBpbiB0aGUgaW1hZ2UsIGkuZS4sIGVhY2ggcGl4ZWwKKyAgaXMgYSBtZXRhIEh1ZmZtYW4gY29kZS4KKworSHVmZm1hbiBjb2RlCis6IEEgY2xhc3NpYyB3YXkgdG8gZG8gZW50cm9weSBjb2Rpbmcgd2hlcmUgYSBzbWFsbGVyIG51bWJlciBvZiBiaXRzIGFyZQorICB1c2VkIGZvciBtb3JlIGZyZXF1ZW50IGNvZGVzLgorCitMWjc3Cis6IERpY3Rpb25hcnktYmFzZWQgc2xpZGluZyB3aW5kb3cgY29tcHJlc3Npb24gYWxnb3JpdGhtIHRoYXQgZWl0aGVyCisgIGVtaXRzIHN5bWJvbHMgb3IgZGVzY3JpYmVzIHRoZW0gYXMgc2VxdWVuY2VzIG9mIHBhc3Qgc3ltYm9scy4KKworbWV0YSBIdWZmbWFuIGNvZGUKKzogQSBzbWFsbCBpbnRlZ2VyICh1cCB0byAxNiBiaXRzKSB0aGF0IGluZGV4ZXMgYW4gZWxlbWVudCBpbiB0aGUgbWV0YQorICBIdWZmbWFuIHRhYmxlLgorCitwcmVkaWN0b3IgaW1hZ2UKKzogQSB0d28tZGltZW5zaW9uYWwgc3VicmVzb2x1dGlvbiBpbWFnZSBpbmRpY2F0aW5nIHdoaWNoIHNwYXRpYWwKKyAgcHJlZGljdG9yIGlzIHVzZWQgZm9yIGEgcGFydGljdWxhciBzcXVhcmUgaW4gdGhlIGltYWdlLgorCitwcmVmaXggY29kaW5nCis6IEEgd2F5IHRvIGVudHJvcHkgY29kZSBsYXJnZXIgaW50ZWdlcnMgdGhhdCBjb2RlcyBhIGZldyBiaXRzIG9mIHRoZQorICBpbnRlZ2VyIHVzaW5nIGFuIGVudHJvcHkgY29kZSBhbmQgY29kaWZpZXMgdGhlIHJlbWFpbmluZyBiaXRzIHJhdy4KKyAgVGhpcyBhbGxvd3MgZm9yIHRoZSBkZXNjcmlwdGlvbnMgb2YgdGhlIGVudHJvcHkgY29kZXMgdG8gcmVtYWluCisgIHJlbGF0aXZlbHkgc21hbGwgZXZlbiB3aGVuIHRoZSByYW5nZSBvZiBzeW1ib2xzIGlzIGxhcmdlLgorCitzY2FuLWxpbmUgb3JkZXIKKzogQSBwcm9jZXNzaW5nIG9yZGVyIG9mIHBpeGVscywgbGVmdC10by1yaWdodCwgdG9wLXRvLWJvdHRvbSwgc3RhcnRpbmcKKyAgZnJvbSB0aGUgbGVmdC1oYW5kLXRvcCBwaXhlbCwgcHJvY2VlZGluZyB0byB0aGUgcmlnaHQuIE9uY2UgYSByb3cgaXMKKyAgY29tcGxldGVkLCBjb250aW51ZSBmcm9tIHRoZSBsZWZ0LWhhbmQgY29sdW1uIG9mIHRoZSBuZXh0IHJvdy4KKworCisxIEludHJvZHVjdGlvbgorLS0tLS0tLS0tLS0tLS0KKworVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIGNvbXByZXNzZWQgZGF0YSByZXByZXNlbnRhdGlvbiBvZiBhIFdlYlAKK2xvc3NsZXNzIGltYWdlLiBJdCBpcyBpbnRlbmRlZCBhcyBhIGRldGFpbGVkIHJlZmVyZW5jZSBmb3IgV2ViUCBsb3NzbGVzcworZW5jb2RlciBhbmQgZGVjb2RlciBpbXBsZW1lbnRhdGlvbi4KKworSW4gdGhpcyBkb2N1bWVudCwgd2UgZXh0ZW5zaXZlbHkgdXNlIEMgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2Ugc3ludGF4IHRvCitkZXNjcmliZSB0aGUgYml0c3RyZWFtLCBhbmQgYXNzdW1lIHRoZSBleGlzdGVuY2Ugb2YgYSBmdW5jdGlvbiBmb3IKK3JlYWRpbmcgYml0cywgYFJlYWRCaXRzKG4pYC4gVGhlIGJ5dGVzIGFyZSByZWFkIGluIHRoZSBuYXR1cmFsIG9yZGVyIG9mCit0aGUgc3RyZWFtIGNvbnRhaW5pbmcgdGhlbSwgYW5kIGJpdHMgb2YgZWFjaCBieXRlIGFyZSByZWFkIGluCitsZWFzdC1zaWduaWZpY2FudC1iaXQtZmlyc3Qgb3JkZXIuIFdoZW4gbXVsdGlwbGUgYml0cyBhcmUgcmVhZCBhdCB0aGUKK3NhbWUgdGltZSwgdGhlIGludGVnZXIgaXMgY29uc3RydWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgZGF0YSBpbiB0aGUKK29yaWdpbmFsIG9yZGVyLiBUaGUgbW9zdCBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSByZXR1cm5lZCBpbnRlZ2VyIGFyZQorYWxzbyB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSBvcmlnaW5hbCBkYXRhLiBUaHVzIHRoZSBzdGF0ZW1lbnQKKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitiID0gUmVhZEJpdHMoMik7Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworaXMgZXF1aXZhbGVudCB3aXRoIHRoZSB0d28gc3RhdGVtZW50cyBiZWxvdzoKKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitiID0gUmVhZEJpdHMoMSk7CitiIHw9IFJlYWRCaXRzKDEpIDw8IDE7Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworV2UgYXNzdW1lIHRoYXQgZWFjaCBjb2xvciBjb21wb25lbnQgKGUuZy4gYWxwaGEsIHJlZCwgYmx1ZSBhbmQgZ3JlZW4pIGlzCityZXByZXNlbnRlZCB1c2luZyBhbiA4LWJpdCBieXRlLiBXZSBkZWZpbmUgdGhlIGNvcnJlc3BvbmRpbmcgdHlwZSBhcwordWludDguIEEgd2hvbGUgQVJHQiBwaXhlbCBpcyByZXByZXNlbnRlZCBieSBhIHR5cGUgY2FsbGVkIHVpbnQzMiwgYW4KK3Vuc2lnbmVkIGludGVnZXIgY29uc2lzdGluZyBvZiAzMiBiaXRzLiBJbiB0aGUgY29kZSBzaG93aW5nIHRoZSBiZWhhdmlvcgorb2YgdGhlIHRyYW5zZm9ybWF0aW9ucywgYWxwaGEgdmFsdWUgaXMgY29kaWZpZWQgaW4gYml0cyAzMS4uMjQsIHJlZCBpbgorYml0cyAyMy4uMTYsIGdyZWVuIGluIGJpdHMgMTUuLjggYW5kIGJsdWUgaW4gYml0cyA3Li4wLCBidXQKK2ltcGxlbWVudGF0aW9ucyBvZiB0aGUgZm9ybWF0IGFyZSBmcmVlIHRvIHVzZSBhbm90aGVyIHJlcHJlc2VudGF0aW9uCitpbnRlcm5hbGx5LgorCitCcm9hZGx5LCBhIFdlYlAgbG9zc2xlc3MgaW1hZ2UgY29udGFpbnMgaGVhZGVyIGRhdGEsIHRyYW5zZm9ybQoraW5mb3JtYXRpb24gYW5kIGFjdHVhbCBpbWFnZSBkYXRhLiBIZWFkZXJzIGNvbnRhaW4gd2lkdGggYW5kIGhlaWdodCBvZgordGhlIGltYWdlLiBBIFdlYlAgbG9zc2xlc3MgaW1hZ2UgY2FuIGdvIHRocm91Z2ggZm91ciBkaWZmZXJlbnQgdHlwZXMgb2YKK3RyYW5zZm9ybWF0aW9uIGJlZm9yZSBiZWluZyBlbnRyb3B5IGVuY29kZWQuIFRoZSB0cmFuc2Zvcm0gaW5mb3JtYXRpb24KK2luIHRoZSBiaXRzdHJlYW0gY29udGFpbnMgdGhlIGRhdGEgcmVxdWlyZWQgdG8gYXBwbHkgdGhlIHJlc3BlY3RpdmUKK2ludmVyc2UgdHJhbnNmb3Jtcy4KKworCisyIFJJRkYgSGVhZGVyCistLS0tLS0tLS0tLS0tCisKK1RoZSBiZWdpbm5pbmcgb2YgdGhlIGhlYWRlciBoYXMgdGhlIFJJRkYgY29udGFpbmVyLiBUaGlzIGNvbnNpc3RzIG9mIHRoZQorZm9sbG93aW5nIDIxIGJ5dGVzOgorCisgICAxLiBTdHJpbmcgIlJJRkYiCisgICAyLiBBIGxpdHRsZS1lbmRpYW4gMzIgYml0IHZhbHVlIG9mIHRoZSBibG9jayBsZW5ndGgsIHRoZSB3aG9sZSBzaXplCisgICAgICBvZiB0aGUgYmxvY2sgY29udHJvbGxlZCBieSB0aGUgUklGRiBoZWFkZXIuIE5vcm1hbGx5IHRoaXMgZXF1YWxzCisgICAgICB0aGUgcGF5bG9hZCBzaXplIChmaWxlIHNpemUgbWludXMgOCBieXRlczogNCBieXRlcyBmb3IgdGhlICdSSUZGJworICAgICAgaWRlbnRpZmllciBhbmQgNCBieXRlcyBmb3Igc3RvcmluZyB0aGUgdmFsdWUgaXRzZWxmKS4KKyAgIDMuIFN0cmluZyAiV0VCUCIgKFJJRkYgY29udGFpbmVyIG5hbWUpLgorICAgNC4gU3RyaW5nICJWUDhMIiAoY2h1bmsgdGFnIGZvciBsb3NzbGVzcyBlbmNvZGVkIGltYWdlIGRhdGEpLgorICAgNS4gQSBsaXR0bGUtZW5kaWFuIDMyLWJpdCB2YWx1ZSBvZiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZQorICAgICAgbG9zc2xlc3Mgc3RyZWFtLgorICAgNi4gT25lIGJ5dGUgc2lnbmF0dXJlIDB4MmYuCisKK1RoZSBmaXJzdCAyOCBiaXRzIG9mIHRoZSBiaXRzdHJlYW0gc3BlY2lmeSB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUKK2ltYWdlLiBXaWR0aCBhbmQgaGVpZ2h0IGFyZSBkZWNvZGVkIGFzIDE0LWJpdCBpbnRlZ2VycyBhcyBmb2xsb3dzOgorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK2ludCBpbWFnZV93aWR0aCA9IFJlYWRCaXRzKDE0KSArIDE7CitpbnQgaW1hZ2VfaGVpZ2h0ID0gUmVhZEJpdHMoMTQpICsgMTsKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitUaGUgMTQtYml0IGR5bmFtaWNzIGZvciBpbWFnZSBzaXplIGxpbWl0IHRoZSBtYXhpbXVtIHNpemUgb2YgYSBXZWJQCitsb3NzbGVzcyBpbWFnZSB0byAxNjM4NOKclTE2Mzg0IHBpeGVscy4KKworVGhlIGFscGhhX2lzX3VzZWQgYml0IGlzIGEgaGludCBvbmx5LCBhbmQgc2hvdWxkIG5vdCBpbXBhY3QgZGVjb2RpbmcuCitJdCBzaG91bGQgYmUgc2V0IHRvIDAgd2hlbiBhbGwgYWxwaGEgdmFsdWVzIGFyZSAyNTUgaW4gdGhlIHBpY3R1cmUsIGFuZAorMSBvdGhlcndpc2UuCisKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgoraW50IGFscGhhX2lzX3VzZWQgPSBSZWFkQml0cygxKTsKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitUaGUgdmVyc2lvbl9udW1iZXIgaXMgYSAzIGJpdCBjb2RlIHRoYXQgbXVzdCBiZSBzZXQgdG8gMC4gQW55IG90aGVyIHZhbHVlCitzaG91bGQgYmUgdHJlYXRlZCBhcyBhbiBlcnJvci4gXFtBTUVOREVEXF0KKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitpbnQgdmVyc2lvbl9udW1iZXIgPSBSZWFkQml0cygzKTsKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCisKKzMgVHJhbnNmb3JtYXRpb25zCistLS0tLS0tLS0tLS0tLS0tLQorCitUcmFuc2Zvcm1hdGlvbnMgYXJlIHJldmVyc2libGUgbWFuaXB1bGF0aW9ucyBvZiB0aGUgaW1hZ2UgZGF0YSB0aGF0IGNhbgorcmVkdWNlIHRoZSByZW1haW5pbmcgc3ltYm9saWMgZW50cm9weSBieSBtb2RlbGluZyBzcGF0aWFsIGFuZCBjb2xvcgorY29ycmVsYXRpb25zLiBUcmFuc2Zvcm1hdGlvbnMgY2FuIG1ha2UgdGhlIGZpbmFsIGNvbXByZXNzaW9uIG1vcmUgZGVuc2UuCisKK0FuIGltYWdlIGNhbiBnbyB0aHJvdWdoIGZvdXIgdHlwZXMgb2YgdHJhbnNmb3JtYXRpb24uIEEgMSBiaXQgaW5kaWNhdGVzCit0aGUgcHJlc2VuY2Ugb2YgYSB0cmFuc2Zvcm0uIEVhY2ggdHJhbnNmb3JtIGlzIGFsbG93ZWQgdG8gYmUgdXNlZCBvbmx5CitvbmNlLiBUaGUgdHJhbnNmb3JtYXRpb25zIGFyZSB1c2VkIG9ubHkgZm9yIHRoZSBtYWluIGxldmVsIEFSR0IgaW1hZ2U6Cit0aGUgc3VicmVzb2x1dGlvbiBpbWFnZXMgaGF2ZSBubyB0cmFuc2Zvcm1zLCBub3QgZXZlbiB0aGUgMCBiaXQKK2luZGljYXRpbmcgdGhlIGVuZC1vZi10cmFuc2Zvcm1zLgorCitUeXBpY2FsbHkgYW4gZW5jb2RlciB3b3VsZCB1c2UgdGhlc2UgdHJhbnNmb3JtcyB0byByZWR1Y2UgdGhlIFNoYW5ub24KK2VudHJvcHkgaW4gdGhlIHJlc2lkdWFsIGltYWdlLiBBbHNvLCB0aGUgdHJhbnNmb3JtIGRhdGEgY2FuIGJlIGRlY2lkZWQKK2Jhc2VkIG9uIGVudHJvcHkgbWluaW1pemF0aW9uLgorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK3doaWxlIChSZWFkQml0cygxKSkgeyAgLy8gVHJhbnNmb3JtIHByZXNlbnQuCisgIC8vIERlY29kZSB0cmFuc2Zvcm0gdHlwZS4KKyAgZW51bSBUcmFuc2Zvcm1UeXBlIHRyYW5zZm9ybV90eXBlID0gUmVhZEJpdHMoMik7CisgIC8vIERlY29kZSB0cmFuc2Zvcm0gZGF0YS4KKyAgLi4uCit9CisKKy8vIERlY29kZSBhY3R1YWwgaW1hZ2UgZGF0YSAoU2VjdGlvbiA0KS4KK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitJZiBhIHRyYW5zZm9ybSBpcyBwcmVzZW50IHRoZW4gdGhlIG5leHQgdHdvIGJpdHMgc3BlY2lmeSB0aGUgdHJhbnNmb3JtCit0eXBlLiBUaGVyZSBhcmUgZm91ciB0eXBlcyBvZiB0cmFuc2Zvcm1zLgorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK2VudW0gVHJhbnNmb3JtVHlwZSB7CisgIFBSRURJQ1RPUl9UUkFOU0ZPUk0gICAgICAgICAgICAgPSAwLAorICBDT0xPUl9UUkFOU0ZPUk0gICAgICAgICAgICAgICAgID0gMSwKKyAgU1VCVFJBQ1RfR1JFRU4gICAgICAgICAgICAgICAgICA9IDIsCisgIENPTE9SX0lOREVYSU5HX1RSQU5TRk9STSAgICAgICAgPSAzLAorfTsKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitUaGUgdHJhbnNmb3JtIHR5cGUgaXMgZm9sbG93ZWQgYnkgdGhlIHRyYW5zZm9ybSBkYXRhLiBUcmFuc2Zvcm0gZGF0YQorY29udGFpbnMgdGhlIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIGFwcGx5IHRoZSBpbnZlcnNlIHRyYW5zZm9ybSBhbmQKK2RlcGVuZHMgb24gdGhlIHRyYW5zZm9ybSB0eXBlLiBOZXh0IHdlIGRlc2NyaWJlIHRoZSB0cmFuc2Zvcm0gZGF0YSBmb3IKK2RpZmZlcmVudCB0eXBlcy4KKworCisjIyMgUHJlZGljdG9yIFRyYW5zZm9ybQorCitUaGUgcHJlZGljdG9yIHRyYW5zZm9ybSBjYW4gYmUgdXNlZCB0byByZWR1Y2UgZW50cm9weSBieSBleHBsb2l0aW5nIHRoZQorZmFjdCB0aGF0IG5laWdoYm9yaW5nIHBpeGVscyBhcmUgb2Z0ZW4gY29ycmVsYXRlZC4gSW4gdGhlIHByZWRpY3RvcgordHJhbnNmb3JtLCB0aGUgY3VycmVudCBwaXhlbCB2YWx1ZSBpcyBwcmVkaWN0ZWQgZnJvbSB0aGUgcGl4ZWxzIGFscmVhZHkKK2RlY29kZWQgKGluIHNjYW4tbGluZSBvcmRlcikgYW5kIG9ubHkgdGhlIHJlc2lkdWFsIHZhbHVlIChhY3R1YWwgLQorcHJlZGljdGVkKSBpcyBlbmNvZGVkLiBUaGUgX3ByZWRpY3Rpb24gbW9kZV8gZGV0ZXJtaW5lcyB0aGUgdHlwZSBvZgorcHJlZGljdGlvbiB0byB1c2UuIFdlIGRpdmlkZSB0aGUgaW1hZ2UgaW50byBzcXVhcmVzIGFuZCBhbGwgdGhlIHBpeGVscworaW4gYSBzcXVhcmUgdXNlIHNhbWUgcHJlZGljdGlvbiBtb2RlLgorCitUaGUgZmlyc3QgMyBiaXRzIG9mIHByZWRpY3Rpb24gZGF0YSBkZWZpbmUgdGhlIGJsb2NrIHdpZHRoIGFuZCBoZWlnaHQgaW4KK251bWJlciBvZiBiaXRzLiBUaGUgbnVtYmVyIG9mIGJsb2NrIGNvbHVtbnMsIGBibG9ja194c2l6ZWAsIGlzIHVzZWQgaW4KK2luZGV4aW5nIHR3by1kaW1lbnNpb25hbGx5LgorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK2ludCBzaXplX2JpdHMgPSBSZWFkQml0cygzKSArIDI7CitpbnQgYmxvY2tfd2lkdGggPSAoMSA8PCBzaXplX2JpdHMpOworaW50IGJsb2NrX2hlaWdodCA9ICgxIDw8IHNpemVfYml0cyk7CisjZGVmaW5lIERJVl9ST1VORF9VUChudW0sIGRlbikgKChudW0pICsgKGRlbikgLSAxKSAvIChkZW4pKQoraW50IGJsb2NrX3hzaXplID0gRElWX1JPVU5EX1VQKGltYWdlX3dpZHRoLCAxIDw8IHNpemVfYml0cyk7Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworVGhlIHRyYW5zZm9ybSBkYXRhIGNvbnRhaW5zIHRoZSBwcmVkaWN0aW9uIG1vZGUgZm9yIGVhY2ggYmxvY2sgb2YgdGhlCitpbWFnZS4gQWxsIHRoZSBgYmxvY2tfd2lkdGggKiBibG9ja19oZWlnaHRgIHBpeGVscyBvZiBhIGJsb2NrIHVzZSBzYW1lCitwcmVkaWN0aW9uIG1vZGUuIFRoZSBwcmVkaWN0aW9uIG1vZGVzIGFyZSB0cmVhdGVkIGFzIHBpeGVscyBvZiBhbiBpbWFnZQorYW5kIGVuY29kZWQgdXNpbmcgdGhlIHNhbWUgdGVjaG5pcXVlcyBkZXNjcmliZWQgaW4KK1tDaGFwdGVyIDRdKCNpbWFnZS1kYXRhKS4KKworRm9yIGEgcGl4ZWwgX3gsIHlfLCBvbmUgY2FuIGNvbXB1dGUgdGhlIHJlc3BlY3RpdmUgZmlsdGVyIGJsb2NrIGFkZHJlc3MKK2J5OgorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK2ludCBibG9ja19pbmRleCA9ICh5ID4+IHNpemVfYml0cykgKiBibG9ja194c2l6ZSArCisgICAgICAgICAgICAgICAgICAoeCA+PiBzaXplX2JpdHMpOworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1RoZXJlIGFyZSAxNCBkaWZmZXJlbnQgcHJlZGljdGlvbiBtb2Rlcy4gSW4gZWFjaCBwcmVkaWN0aW9uIG1vZGUsIHRoZQorY3VycmVudCBwaXhlbCB2YWx1ZSBpcyBwcmVkaWN0ZWQgZnJvbSBvbmUgb3IgbW9yZSBuZWlnaGJvcmluZyBwaXhlbHMKK3dob3NlIHZhbHVlcyBhcmUgYWxyZWFkeSBrbm93bi4KKworV2UgY2hvb3NlIHRoZSBuZWlnaGJvcmluZyBwaXhlbHMgKFRMLCBULCBUUiwgYW5kIEwpIG9mIHRoZSBjdXJyZW50IHBpeGVsCisoUCkgYXMgZm9sbG93czoKKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitPICAgIE8gICAgTyAgICBPICAgIE8gICAgTyAgICBPICAgIE8gICAgTyAgICBPICAgIE8KK08gICAgTyAgICBPICAgIE8gICAgTyAgICBPICAgIE8gICAgTyAgICBPICAgIE8gICAgTworTyAgICBPICAgIE8gICAgTyAgICBUTCAgIFQgICAgVFIgICBPICAgIE8gICAgTyAgICBPCitPICAgIE8gICAgTyAgICBPICAgIEwgICAgUCAgICBYICAgIFggICAgWCAgICBYICAgIFgKK1ggICAgWCAgICBYICAgIFggICAgWCAgICBYICAgIFggICAgWCAgICBYICAgIFggICAgWAorWCAgICBYICAgIFggICAgWCAgICBYICAgIFggICAgWCAgICBYICAgIFggICAgWCAgICBYCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKword2hlcmUgVEwgbWVhbnMgdG9wLWxlZnQsIFQgdG9wLCBUUiB0b3AtcmlnaHQsIEwgbGVmdCBwaXhlbC4KK0F0IHRoZSB0aW1lIG9mIHByZWRpY3RpbmcgYSB2YWx1ZSBmb3IgUCwgYWxsIHBpeGVscyBPLCBUTCwgVCwgVFIgYW5kIEwKK2hhdmUgYmVlbiBhbHJlYWR5IHByb2Nlc3NlZCwgYW5kIHBpeGVsIFAgYW5kIGFsbCBwaXhlbHMgWCBhcmUgdW5rbm93bi4KKworR2l2ZW4gdGhlIGFib3ZlIG5laWdoYm9yaW5nIHBpeGVscywgdGhlIGRpZmZlcmVudCBwcmVkaWN0aW9uIG1vZGVzIGFyZQorZGVmaW5lZCBhcyBmb2xsb3dzLgorCit8IE1vZGUgICB8IFByZWRpY3RlZCB2YWx1ZSBvZiBlYWNoIGNoYW5uZWwgb2YgdGhlIGN1cnJlbnQgcGl4ZWwgICAgfAorfCAtLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKK3wgIDAgICAgIHwgMHhmZjAwMDAwMCAocmVwcmVzZW50cyBzb2xpZCBibGFjayBjb2xvciBpbiBBUkdCKSAgICAgICB8Cit8ICAxICAgICB8IEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCAgMiAgICAgfCBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgIDMgICAgIHwgVFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8ICA0ICAgICB8IFRMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCAgNSAgICAgfCBBdmVyYWdlMihBdmVyYWdlMihMLCBUUiksIFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgIDYgICAgIHwgQXZlcmFnZTIoTCwgVEwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8ICA3ICAgICB8IEF2ZXJhZ2UyKEwsIFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCAgOCAgICAgfCBBdmVyYWdlMihUTCwgVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgIDkgICAgIHwgQXZlcmFnZTIoVCwgVFIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8IDEwICAgICB8IEF2ZXJhZ2UyKEF2ZXJhZ2UyKEwsIFRMKSwgQXZlcmFnZTIoVCwgVFIpKSAgICAgICAgICAgICAgfAorfCAxMSAgICAgfCBTZWxlY3QoTCwgVCwgVEwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgMTIgICAgIHwgQ2xhbXBBZGRTdWJ0cmFjdEZ1bGwoTCwgVCwgVEwpICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8IDEzICAgICB8IENsYW1wQWRkU3VidHJhY3RIYWxmKEF2ZXJhZ2UyKEwsIFQpLCBUTCkgICAgICAgICAgICAgICAgfAorCisKK2BBdmVyYWdlMmAgaXMgZGVmaW5lZCBhcyBmb2xsb3dzIGZvciBlYWNoIEFSR0IgY29tcG9uZW50OgorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK3VpbnQ4IEF2ZXJhZ2UyKHVpbnQ4IGEsIHVpbnQ4IGIpIHsKKyAgcmV0dXJuIChhICsgYikgLyAyOworfQorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1RoZSBTZWxlY3QgcHJlZGljdG9yIGlzIGRlZmluZWQgYXMgZm9sbG93czoKKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Cit1aW50MzIgU2VsZWN0KHVpbnQzMiBMLCB1aW50MzIgVCwgdWludDMyIFRMKSB7CisgIC8vIEwgPSBsZWZ0IHBpeGVsLCBUID0gdG9wIHBpeGVsLCBUTCA9IHRvcCBsZWZ0IHBpeGVsLgorCisgIC8vIEFSR0IgY29tcG9uZW50IGVzdGltYXRlcyBmb3IgcHJlZGljdGlvbi4KKyAgaW50IHBBbHBoYSA9IEFMUEhBKEwpICsgQUxQSEEoVCkgLSBBTFBIQShUTCk7CisgIGludCBwUmVkID0gUkVEKEwpICsgUkVEKFQpIC0gUkVEKFRMKTsKKyAgaW50IHBHcmVlbiA9IEdSRUVOKEwpICsgR1JFRU4oVCkgLSBHUkVFTihUTCk7CisgIGludCBwQmx1ZSA9IEJMVUUoTCkgKyBCTFVFKFQpIC0gQkxVRShUTCk7CisKKyAgLy8gTWFuaGF0dGFuIGRpc3RhbmNlcyB0byBlc3RpbWF0ZXMgZm9yIGxlZnQgYW5kIHRvcCBwaXhlbHMuCisgIGludCBwTCA9IGFicyhwQWxwaGEgLSBBTFBIQShMKSkgKyBhYnMocFJlZCAtIFJFRChMKSkgKworICAgICAgICAgICBhYnMocEdyZWVuIC0gR1JFRU4oTCkpICsgYWJzKHBCbHVlIC0gQkxVRShMKSk7CisgIGludCBwVCA9IGFicyhwQWxwaGEgLSBBTFBIQShUKSkgKyBhYnMocFJlZCAtIFJFRChUKSkgKworICAgICAgICAgICBhYnMocEdyZWVuIC0gR1JFRU4oVCkpICsgYWJzKHBCbHVlIC0gQkxVRShUKSk7CisKKyAgLy8gUmV0dXJuIGVpdGhlciBsZWZ0IG9yIHRvcCwgdGhlIG9uZSBjbG9zZXIgdG8gdGhlIHByZWRpY3Rpb24uCisgIGlmIChwTCA8IHBUKSB7ICAgICAvLyBcW0FNRU5ERURcXQorICAgIHJldHVybiBMOworICB9IGVsc2UgeworICAgIHJldHVybiBUOworICB9Cit9Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworVGhlIGZ1bmN0aW9ucyBgQ2xhbXBBZGRTdWJ0cmFjdEZ1bGxgIGFuZCBgQ2xhbXBBZGRTdWJ0cmFjdEhhbGZgIGFyZQorcGVyZm9ybWVkIGZvciBlYWNoIEFSR0IgY29tcG9uZW50IGFzIGZvbGxvd3M6CisKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorLy8gQ2xhbXAgdGhlIGlucHV0IHZhbHVlIGJldHdlZW4gMCBhbmQgMjU1LgoraW50IENsYW1wKGludCBhKSB7CisgIHJldHVybiAoYSA8IDApID8gMCA6IChhID4gMjU1KSA/ICAyNTUgOiBhOworfQorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgoraW50IENsYW1wQWRkU3VidHJhY3RGdWxsKGludCBhLCBpbnQgYiwgaW50IGMpIHsKKyAgcmV0dXJuIENsYW1wKGEgKyBiIC0gYyk7Cit9Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitpbnQgQ2xhbXBBZGRTdWJ0cmFjdEhhbGYoaW50IGEsIGludCBiKSB7CisgIHJldHVybiBDbGFtcChhICsgKGEgLSBiKSAvIDIpOworfQorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1RoZXJlIGFyZSBzcGVjaWFsIGhhbmRsaW5nIHJ1bGVzIGZvciBzb21lIGJvcmRlciBwaXhlbHMuIElmIHRoZXJlIGlzIGEKK3ByZWRpY3Rpb24gdHJhbnNmb3JtLCByZWdhcmRsZXNzIG9mIHRoZSBtb2RlIFxbMC4uMTNcXSBmb3IgdGhlc2UgcGl4ZWxzLAordGhlIHByZWRpY3RlZCB2YWx1ZSBmb3IgdGhlIGxlZnQtdG9wbW9zdCBwaXhlbCBvZiB0aGUgaW1hZ2UgaXMKKzB4ZmYwMDAwMDAsIEwtcGl4ZWwgZm9yIGFsbCBwaXhlbHMgb24gdGhlIHRvcCByb3csIGFuZCBULXBpeGVsIGZvciBhbGwKK3BpeGVscyBvbiB0aGUgbGVmdG1vc3QgY29sdW1uLgorCitBZGRyZXNzaW5nIHRoZSBUUi1waXhlbCBmb3IgcGl4ZWxzIG9uIHRoZSByaWdodG1vc3QgY29sdW1uIGlzCitleGNlcHRpb25hbC4gVGhlIHBpeGVscyBvbiB0aGUgcmlnaHRtb3N0IGNvbHVtbiBhcmUgcHJlZGljdGVkIGJ5IHVzaW5nCit0aGUgbW9kZXMgXFswLi4xM1xdIGp1c3QgbGlrZSBwaXhlbHMgbm90IG9uIGJvcmRlciwgYnV0IGJ5IHVzaW5nIHRoZQorbGVmdG1vc3QgcGl4ZWwgb24gdGhlIHNhbWUgcm93IGFzIHRoZSBjdXJyZW50IFRSLXBpeGVsLiBUaGUgVFItcGl4ZWwKK29mZnNldCBpbiBtZW1vcnkgaXMgdGhlIHNhbWUgZm9yIGJvcmRlciBhbmQgbm9uLWJvcmRlciBwaXhlbHMuCisKKworIyMjIENvbG9yIFRyYW5zZm9ybQorCitUaGUgZ29hbCBvZiB0aGUgY29sb3IgdHJhbnNmb3JtIGlzIHRvIGRlY29ycmVsYXRlIHRoZSBSLCBHIGFuZCBCIHZhbHVlcworb2YgZWFjaCBwaXhlbC4gQ29sb3IgdHJhbnNmb3JtIGtlZXBzIHRoZSBncmVlbiAoRykgdmFsdWUgYXMgaXQgaXMsCit0cmFuc2Zvcm1zIHJlZCAoUikgYmFzZWQgb24gZ3JlZW4gYW5kIHRyYW5zZm9ybXMgYmx1ZSAoQikgYmFzZWQgb24gZ3JlZW4KK2FuZCB0aGVuIGJhc2VkIG9uIHJlZC4KKworQXMgaXMgdGhlIGNhc2UgZm9yIHRoZSBwcmVkaWN0b3IgdHJhbnNmb3JtLCBmaXJzdCB0aGUgaW1hZ2UgaXMgZGl2aWRlZAoraW50byBibG9ja3MgYW5kIHRoZSBzYW1lIHRyYW5zZm9ybSBtb2RlIGlzIHVzZWQgZm9yIGFsbCB0aGUgcGl4ZWxzIGluIGEKK2Jsb2NrLiBGb3IgZWFjaCBibG9jayB0aGVyZSBhcmUgdGhyZWUgdHlwZXMgb2YgY29sb3IgdHJhbnNmb3JtIGVsZW1lbnRzLgorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDggZ3JlZW5fdG9fcmVkOworICB1aW50OCBncmVlbl90b19ibHVlOworICB1aW50OCByZWRfdG9fYmx1ZTsKK30gQ29sb3JUcmFuc2Zvcm1FbGVtZW50Oworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1RoZSBhY3R1YWwgY29sb3IgdHJhbnNmb3JtYXRpb24gaXMgZG9uZSBieSBkZWZpbmluZyBhIGNvbG9yIHRyYW5zZm9ybQorZGVsdGEuIFRoZSBjb2xvciB0cmFuc2Zvcm0gZGVsdGEgZGVwZW5kcyBvbiB0aGUgYENvbG9yVHJhbnNmb3JtRWxlbWVudGAsCit3aGljaCBpcyB0aGUgc2FtZSBmb3IgYWxsIHRoZSBwaXhlbHMgaW4gYSBwYXJ0aWN1bGFyIGJsb2NrLiBUaGUgZGVsdGEgaXMKK2FkZGVkIGR1cmluZyBjb2xvciB0cmFuc2Zvcm0uIFRoZSBpbnZlcnNlIGNvbG9yIHRyYW5zZm9ybSB0aGVuIGlzIGp1c3QKK3N1YnRyYWN0aW5nIHRob3NlIGRlbHRhcy4KKworVGhlIGNvbG9yIHRyYW5zZm9ybSBmdW5jdGlvbiBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6CisKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgordm9pZCBDb2xvclRyYW5zZm9ybSh1aW50OCByZWQsIHVpbnQ4IGJsdWUsIHVpbnQ4IGdyZWVuLAorICAgICAgICAgICAgICAgICAgICBDb2xvclRyYW5zZm9ybUVsZW1lbnQgKnRyYW5zLAorICAgICAgICAgICAgICAgICAgICB1aW50OCAqbmV3X3JlZCwgdWludDggKm5ld19ibHVlKSB7CisgIC8vIFRyYW5zZm9ybWVkIHZhbHVlcyBvZiByZWQgYW5kIGJsdWUgY29tcG9uZW50cworICB1aW50MzIgdG1wX3JlZCA9IHJlZDsKKyAgdWludDMyIHRtcF9ibHVlID0gYmx1ZTsKKworICAvLyBBcHBseWluZyB0cmFuc2Zvcm0gaXMganVzdCBhZGRpbmcgdGhlIHRyYW5zZm9ybSBkZWx0YXMKKyAgdG1wX3JlZCAgKz0gQ29sb3JUcmFuc2Zvcm1EZWx0YSh0cmFucy0+Z3JlZW5fdG9fcmVkLCBncmVlbik7CisgIHRtcF9ibHVlICs9IENvbG9yVHJhbnNmb3JtRGVsdGEodHJhbnMtPmdyZWVuX3RvX2JsdWUsIGdyZWVuKTsKKyAgdG1wX2JsdWUgKz0gQ29sb3JUcmFuc2Zvcm1EZWx0YSh0cmFucy0+cmVkX3RvX2JsdWUsIHJlZCk7CisKKyAgKm5ld19yZWQgPSB0bXBfcmVkICYgMHhmZjsKKyAgKm5ld19ibHVlID0gdG1wX2JsdWUgJiAweGZmOworfQorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK2BDb2xvclRyYW5zZm9ybURlbHRhYCBpcyBjb21wdXRlZCB1c2luZyBhIHNpZ25lZCA4LWJpdCBpbnRlZ2VyCityZXByZXNlbnRpbmcgYSAzLjUtZml4ZWQtcG9pbnQgbnVtYmVyLCBhbmQgYSBzaWduZWQgOC1iaXQgUkdCIGNvbG9yCitjaGFubmVsIChjKSBcWy0xMjguLjEyN1xdIGFuZCBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6CisKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgoraW50OCBDb2xvclRyYW5zZm9ybURlbHRhKGludDggdCwgaW50OCBjKSB7CisgIHJldHVybiAodCAqIGMpID4+IDU7Cit9Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworQSBjb252ZXJzaW9uIGZyb20gdGhlIDgtYml0IHVuc2lnbmVkIHJlcHJlc2VudGF0aW9uICh1aW50OCkgdG8gdGhlIDgtYml0CitzaWduZWQgb25lIChpbnQ4KSBpcyByZXF1aXJlZCBiZWZvcmUgY2FsbGluZyBDb2xvclRyYW5zZm9ybURlbHRhKCkuCitJdCBzaG91bGQgYmUgcGVyZm9ybWVkIHVzaW5nIDgtYml0IHR3bydzIGNvbXBsZW1lbnQgKHRoYXQgaXM6IHVpbnQ4IHJhbmdlCitcWzEyOC0yNTVcXSBpcyBtYXBwZWQgdG8gdGhlIFxbLTEyOCwgLTFcXSByYW5nZSBvZiBpdHMgY29udmVydGVkIGludDggdmFsdWUpLgorCitUaGUgbXVsdGlwbGljYXRpb24gaXMgdG8gYmUgZG9uZSB1c2luZyBtb3JlIHByZWNpc2lvbiAod2l0aCBhdCBsZWFzdAorMTYtYml0IGR5bmFtaWNzKS4gVGhlIHNpZ24gZXh0ZW5zaW9uIHByb3BlcnR5IG9mIHRoZSBzaGlmdCBvcGVyYXRpb24KK2RvZXMgbm90IG1hdHRlciBoZXJlOiBvbmx5IHRoZSBsb3dlc3QgOCBiaXRzIGFyZSB1c2VkIGZyb20gdGhlIHJlc3VsdCwKK2FuZCB0aGVyZSB0aGUgc2lnbiBleHRlbnNpb24gc2hpZnRpbmcgYW5kIHVuc2lnbmVkIHNoaWZ0aW5nIGFyZQorY29uc2lzdGVudCB3aXRoIGVhY2ggb3RoZXIuCisKK05vdyB3ZSBkZXNjcmliZSB0aGUgY29udGVudHMgb2YgY29sb3IgdHJhbnNmb3JtIGRhdGEgc28gdGhhdCBkZWNvZGluZworY2FuIGFwcGx5IHRoZSBpbnZlcnNlIGNvbG9yIHRyYW5zZm9ybSBhbmQgcmVjb3ZlciB0aGUgb3JpZ2luYWwgcmVkIGFuZAorYmx1ZSB2YWx1ZXMuIFRoZSBmaXJzdCAzIGJpdHMgb2YgdGhlIGNvbG9yIHRyYW5zZm9ybSBkYXRhIGNvbnRhaW4gdGhlCit3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBpbWFnZSBibG9jayBpbiBudW1iZXIgb2YgYml0cywganVzdCBsaWtlIHRoZQorcHJlZGljdG9yIHRyYW5zZm9ybToKKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitpbnQgc2l6ZV9iaXRzID0gUmVhZEJpdHMoMykgKyAyOworaW50IGJsb2NrX3dpZHRoID0gMSA8PCBzaXplX2JpdHM7CitpbnQgYmxvY2tfaGVpZ2h0ID0gMSA8PCBzaXplX2JpdHM7Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworVGhlIHJlbWFpbmluZyBwYXJ0IG9mIHRoZSBjb2xvciB0cmFuc2Zvcm0gZGF0YSBjb250YWlucworYENvbG9yVHJhbnNmb3JtRWxlbWVudGAgaW5zdGFuY2VzIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBibG9jayBvZiB0aGUKK2ltYWdlLiBgQ29sb3JUcmFuc2Zvcm1FbGVtZW50YCBpbnN0YW5jZXMgYXJlIHRyZWF0ZWQgYXMgcGl4ZWxzIG9mIGFuCitpbWFnZSBhbmQgZW5jb2RlZCB1c2luZyB0aGUgbWV0aG9kcyBkZXNjcmliZWQgaW4KK1tDaGFwdGVyIDRdKCNpbWFnZS1kYXRhKS4KKworRHVyaW5nIGRlY29kaW5nLCBgQ29sb3JUcmFuc2Zvcm1FbGVtZW50YCBpbnN0YW5jZXMgb2YgdGhlIGJsb2NrcyBhcmUKK2RlY29kZWQgYW5kIHRoZSBpbnZlcnNlIGNvbG9yIHRyYW5zZm9ybSBpcyBhcHBsaWVkIG9uIHRoZSBBUkdCIHZhbHVlcyBvZgordGhlIHBpeGVscy4gQXMgbWVudGlvbmVkIGVhcmxpZXIsIHRoYXQgaW52ZXJzZSBjb2xvciB0cmFuc2Zvcm0gaXMganVzdAorc3VidHJhY3RpbmcgYENvbG9yVHJhbnNmb3JtRWxlbWVudGAgdmFsdWVzIGZyb20gdGhlIHJlZCBhbmQgYmx1ZQorY2hhbm5lbHMuCisKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgordm9pZCBJbnZlcnNlVHJhbnNmb3JtKHVpbnQ4IHJlZCwgdWludDggZ3JlZW4sIHVpbnQ4IGJsdWUsCisgICAgICAgICAgICAgICAgICAgICAgQ29sb3JUcmFuc2Zvcm1FbGVtZW50ICpwLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4ICpuZXdfcmVkLCB1aW50OCAqbmV3X2JsdWUpIHsKKyAgLy8gQXBwbHlpbmcgaW52ZXJzZSB0cmFuc2Zvcm0gaXMganVzdCBzdWJ0cmFjdGluZyB0aGUKKyAgLy8gY29sb3IgdHJhbnNmb3JtIGRlbHRhcworICByZWQgIC09IENvbG9yVHJhbnNmb3JtRGVsdGEocC0+Z3JlZW5fdG9fcmVkXywgIGdyZWVuKTsKKyAgYmx1ZSAtPSBDb2xvclRyYW5zZm9ybURlbHRhKHAtPmdyZWVuX3RvX2JsdWVfLCBncmVlbik7CisgIGJsdWUgLT0gQ29sb3JUcmFuc2Zvcm1EZWx0YShwLT5yZWRfdG9fYmx1ZV8sIHJlZCAmIDB4ZmYpOworCisgICpuZXdfcmVkID0gcmVkICYgMHhmZjsKKyAgKm5ld19ibHVlID0gYmx1ZSAmIDB4ZmY7Cit9Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworCisjIyMgU3VidHJhY3QgR3JlZW4gVHJhbnNmb3JtCisKK1RoZSBzdWJ0cmFjdCBncmVlbiB0cmFuc2Zvcm0gc3VidHJhY3RzIGdyZWVuIHZhbHVlcyBmcm9tIHJlZCBhbmQgYmx1ZQordmFsdWVzIG9mIGVhY2ggcGl4ZWwuIFdoZW4gdGhpcyB0cmFuc2Zvcm0gaXMgcHJlc2VudCwgdGhlIGRlY29kZXIgbmVlZHMKK3RvIGFkZCB0aGUgZ3JlZW4gdmFsdWUgdG8gYm90aCByZWQgYW5kIGJsdWUuIFRoZXJlIGlzIG5vIGRhdGEgYXNzb2NpYXRlZAord2l0aCB0aGlzIHRyYW5zZm9ybS4gVGhlIGRlY29kZXIgYXBwbGllcyB0aGUgaW52ZXJzZSB0cmFuc2Zvcm0gYXMKK2ZvbGxvd3M6CisKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgordm9pZCBBZGRHcmVlblRvQmx1ZUFuZFJlZCh1aW50OCBncmVlbiwgdWludDggKnJlZCwgdWludDggKmJsdWUpIHsKKyAgKnJlZCAgPSAoKnJlZCAgKyBncmVlbikgJiAweGZmOworICAqYmx1ZSA9ICgqYmx1ZSArIGdyZWVuKSAmIDB4ZmY7Cit9Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworVGhpcyB0cmFuc2Zvcm0gaXMgcmVkdW5kYW50IGFzIGl0IGNhbiBiZSBtb2RlbGVkIHVzaW5nIHRoZSBjb2xvcgordHJhbnNmb3JtLCBidXQgaXQgaXMgc3RpbGwgb2Z0ZW4gdXNlZnVsLiBTaW5jZSBpdCBjYW4gZXh0ZW5kIHRoZQorZHluYW1pY3Mgb2YgdGhlIGNvbG9yIHRyYW5zZm9ybSBhbmQgdGhlcmUgaXMgbm8gYWRkaXRpb25hbCBkYXRhIGhlcmUsCit0aGUgc3VidHJhY3QgZ3JlZW4gdHJhbnNmb3JtIGNhbiBiZSBjb2RlZCB1c2luZyBmZXdlciBiaXRzIHRoYW4gYQorZnVsbC1ibG93biBjb2xvciB0cmFuc2Zvcm0uCisKKworIyMjIENvbG9yIEluZGV4aW5nIFRyYW5zZm9ybQorCitJZiB0aGVyZSBhcmUgbm90IG1hbnkgdW5pcXVlIHBpeGVsIHZhbHVlcywgaXQgbWF5IGJlIG1vcmUgZWZmaWNpZW50IHRvCitjcmVhdGUgYSBjb2xvciBpbmRleCBhcnJheSBhbmQgcmVwbGFjZSB0aGUgcGl4ZWwgdmFsdWVzIGJ5IHRoZSBhcnJheSdzCitpbmRpY2VzLiBUaGUgY29sb3IgaW5kZXhpbmcgdHJhbnNmb3JtIGFjaGlldmVzIHRoaXMuIChJbiB0aGUgY29udGV4dCBvZgorV2ViUCBsb3NzbGVzcywgd2Ugc3BlY2lmaWNhbGx5IGRvIG5vdCBjYWxsIHRoaXMgYSBwYWxldHRlIHRyYW5zZm9ybQorYmVjYXVzZSBhIHNpbWlsYXIgYnV0IG1vcmUgZHluYW1pYyBjb25jZXB0IGV4aXN0cyBpbiBXZWJQIGxvc3NsZXNzCitlbmNvZGluZzogY29sb3IgY2FjaGUuKQorCitUaGUgY29sb3IgaW5kZXhpbmcgdHJhbnNmb3JtIGNoZWNrcyBmb3IgdGhlIG51bWJlciBvZiB1bmlxdWUgQVJHQiB2YWx1ZXMKK2luIHRoZSBpbWFnZS4gSWYgdGhhdCBudW1iZXIgaXMgYmVsb3cgYSB0aHJlc2hvbGQgKDI1NiksIGl0IGNyZWF0ZXMgYW4KK2FycmF5IG9mIHRob3NlIEFSR0IgdmFsdWVzLCB3aGljaCBpcyB0aGVuIHVzZWQgdG8gcmVwbGFjZSB0aGUgcGl4ZWwKK3ZhbHVlcyB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGluZGV4OiB0aGUgZ3JlZW4gY2hhbm5lbCBvZiB0aGUgcGl4ZWxzIGFyZQorcmVwbGFjZWQgd2l0aCB0aGUgaW5kZXg7IGFsbCBhbHBoYSB2YWx1ZXMgYXJlIHNldCB0byAyNTU7IGFsbCByZWQgYW5kCitibHVlIHZhbHVlcyB0byAwLgorCitUaGUgdHJhbnNmb3JtIGRhdGEgY29udGFpbnMgY29sb3IgdGFibGUgc2l6ZSBhbmQgdGhlIGVudHJpZXMgaW4gdGhlCitjb2xvciB0YWJsZS4gVGhlIGRlY29kZXIgcmVhZHMgdGhlIGNvbG9yIGluZGV4aW5nIHRyYW5zZm9ybSBkYXRhIGFzCitmb2xsb3dzOgorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKy8vIDggYml0IHZhbHVlIGZvciBjb2xvciB0YWJsZSBzaXplCitpbnQgY29sb3JfdGFibGVfc2l6ZSA9IFJlYWRCaXRzKDgpICsgMTsKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitUaGUgY29sb3IgdGFibGUgaXMgc3RvcmVkIHVzaW5nIHRoZSBpbWFnZSBzdG9yYWdlIGZvcm1hdCBpdHNlbGYuIFRoZQorY29sb3IgdGFibGUgY2FuIGJlIG9idGFpbmVkIGJ5IHJlYWRpbmcgYW4gaW1hZ2UsIHdpdGhvdXQgdGhlIFJJRkYKK2hlYWRlciwgaW1hZ2Ugc2l6ZSwgYW5kIHRyYW5zZm9ybXMsIGFzc3VtaW5nIGEgaGVpZ2h0IG9mIG9uZSBwaXhlbCBhbmQKK2Egd2lkdGggb2YgYGNvbG9yX3RhYmxlX3NpemVgLiBUaGUgY29sb3IgdGFibGUgaXMgYWx3YXlzCitzdWJ0cmFjdGlvbi1jb2RlZCB0byByZWR1Y2UgaW1hZ2UgZW50cm9weS4gVGhlIGRlbHRhcyBvZiBwYWxldHRlIGNvbG9ycworY29udGFpbiB0eXBpY2FsbHkgbXVjaCBsZXNzIGVudHJvcHkgdGhhbiB0aGUgY29sb3JzIHRoZW1zZWx2ZXMsIGxlYWRpbmcKK3RvIHNpZ25pZmljYW50IHNhdmluZ3MgZm9yIHNtYWxsZXIgaW1hZ2VzLiBJbiBkZWNvZGluZywgZXZlcnkgZmluYWwKK2NvbG9yIGluIHRoZSBjb2xvciB0YWJsZSBjYW4gYmUgb2J0YWluZWQgYnkgYWRkaW5nIHRoZSBwcmV2aW91cyBjb2xvcgorY29tcG9uZW50IHZhbHVlcyBieSBlYWNoIEFSR0IgY29tcG9uZW50IHNlcGFyYXRlbHksIGFuZCBzdG9yaW5nIHRoZQorbGVhc3Qgc2lnbmlmaWNhbnQgOCBiaXRzIG9mIHRoZSByZXN1bHQuCisKK1RoZSBpbnZlcnNlIHRyYW5zZm9ybSBmb3IgdGhlIGltYWdlIGlzIHNpbXBseSByZXBsYWNpbmcgdGhlIHBpeGVsIHZhbHVlcworKHdoaWNoIGFyZSBpbmRpY2VzIHRvIHRoZSBjb2xvciB0YWJsZSkgd2l0aCB0aGUgYWN0dWFsIGNvbG9yIHRhYmxlCit2YWx1ZXMuIFRoZSBpbmRleGluZyBpcyBkb25lIGJhc2VkIG9uIHRoZSBncmVlbiBjb21wb25lbnQgb2YgdGhlIEFSR0IKK2NvbG9yLgorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKy8vIEludmVyc2UgdHJhbnNmb3JtCithcmdiID0gY29sb3JfdGFibGVbR1JFRU4oYXJnYildOworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK0lmIHRoZSBpbmRleCBpcyBlcXVhbCBvciBsYXJnZXIgdGhhbiBjb2xvcl90YWJsZV9zaXplLCB0aGUgYXJnYiBjb2xvciB2YWx1ZQorc2hvdWxkIGJlIHNldCB0byAweDAwMDAwMDAwICh0cmFuc3BhcmVudCBibGFjaykuICBcW0FNRU5ERURcXQorCitXaGVuIHRoZSBjb2xvciB0YWJsZSBpcyBzbWFsbCAoZXF1YWwgdG8gb3IgbGVzcyB0aGFuIDE2IGNvbG9ycyksIHNldmVyYWwKK3BpeGVscyBhcmUgYnVuZGxlZCBpbnRvIGEgc2luZ2xlIHBpeGVsLiBUaGUgcGl4ZWwgYnVuZGxpbmcgcGFja3Mgc2V2ZXJhbAorKDIsIDQsIG9yIDgpIHBpeGVscyBpbnRvIGEgc2luZ2xlIHBpeGVsLCByZWR1Y2luZyB0aGUgaW1hZ2Ugd2lkdGgKK3Jlc3BlY3RpdmVseS4gUGl4ZWwgYnVuZGxpbmcgYWxsb3dzIGZvciBhIG1vcmUgZWZmaWNpZW50IGpvaW50CitkaXN0cmlidXRpb24gZW50cm9weSBjb2Rpbmcgb2YgbmVpZ2hib3JpbmcgcGl4ZWxzLCBhbmQgZ2l2ZXMgc29tZQorYXJpdGhtZXRpYyBjb2RpbmctbGlrZSBiZW5lZml0cyB0byB0aGUgZW50cm9weSBjb2RlLCBidXQgaXQgY2FuIG9ubHkgYmUKK3VzZWQgd2hlbiB0aGVyZSBhcmUgYSBzbWFsbCBudW1iZXIgb2YgdW5pcXVlIHZhbHVlcy4KKworYGNvbG9yX3RhYmxlX3NpemVgIHNwZWNpZmllcyBob3cgbWFueSBwaXhlbHMgYXJlIGNvbWJpbmVkIHRvZ2V0aGVyOgorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK2ludCB3aWR0aF9iaXRzOworaWYgKGNvbG9yX3RhYmxlX3NpemUgPD0gMikgeworICB3aWR0aF9iaXRzID0gMzsKK30gZWxzZSBpZiAoY29sb3JfdGFibGVfc2l6ZSA8PSA0KSB7CisgIHdpZHRoX2JpdHMgPSAyOworfSBlbHNlIGlmIChjb2xvcl90YWJsZV9zaXplIDw9IDE2KSB7CisgIHdpZHRoX2JpdHMgPSAxOworfSBlbHNlIHsKKyAgd2lkdGhfYml0cyA9IDA7Cit9Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworYHdpZHRoX2JpdHNgIGhhcyBhIHZhbHVlIG9mIDAsIDEsIDIgb3IgMy4gQSB2YWx1ZSBvZiAwIGluZGljYXRlcyBubworcGl4ZWwgYnVuZGxpbmcgdG8gYmUgZG9uZSBmb3IgdGhlIGltYWdlLiBBIHZhbHVlIG9mIDEgaW5kaWNhdGVzIHRoYXQgdHdvCitwaXhlbHMgYXJlIGNvbWJpbmVkIHRvZ2V0aGVyLCBhbmQgZWFjaCBwaXhlbCBoYXMgYSByYW5nZSBvZiBcWzAuLjE1XF0uIEEKK3ZhbHVlIG9mIDIgaW5kaWNhdGVzIHRoYXQgZm91ciBwaXhlbHMgYXJlIGNvbWJpbmVkIHRvZ2V0aGVyLCBhbmQgZWFjaAorcGl4ZWwgaGFzIGEgcmFuZ2Ugb2YgXFswLi4zXF0uIEEgdmFsdWUgb2YgMyBpbmRpY2F0ZXMgdGhhdCBlaWdodCBwaXhlbHMKK2FyZSBjb21iaW5lZCB0b2dldGhlciBhbmQgZWFjaCBwaXhlbCBoYXMgYSByYW5nZSBvZiBcWzAuLjFcXSwgaS5lLiwgYQorYmluYXJ5IHZhbHVlLgorCitUaGUgdmFsdWVzIGFyZSBwYWNrZWQgaW50byB0aGUgZ3JlZW4gY29tcG9uZW50IGFzIGZvbGxvd3M6CisKKyAgKiBgd2lkdGhfYml0c2AgPSAxOiBmb3IgZXZlcnkgeCB2YWx1ZSB3aGVyZSB4IOKJoSAwIChtb2QgMiksIGEgZ3JlZW4KKyAgICB2YWx1ZSBhdCB4IGlzIHBvc2l0aW9uZWQgaW50byB0aGUgNCBsZWFzdC1zaWduaWZpY2FudCBiaXRzIG9mIHRoZQorICAgIGdyZWVuIHZhbHVlIGF0IHggLyAyLCBhIGdyZWVuIHZhbHVlIGF0IHggKyAxIGlzIHBvc2l0aW9uZWQgaW50byB0aGUKKyAgICA0IG1vc3Qtc2lnbmlmaWNhbnQgYml0cyBvZiB0aGUgZ3JlZW4gdmFsdWUgYXQgeCAvIDIuCisgICogYHdpZHRoX2JpdHNgID0gMjogZm9yIGV2ZXJ5IHggdmFsdWUgd2hlcmUgeCDiiaEgMCAobW9kIDQpLCBhIGdyZWVuCisgICAgdmFsdWUgYXQgeCBpcyBwb3NpdGlvbmVkIGludG8gdGhlIDIgbGVhc3Qtc2lnbmlmaWNhbnQgYml0cyBvZiB0aGUKKyAgICBncmVlbiB2YWx1ZSBhdCB4IC8gNCwgZ3JlZW4gdmFsdWVzIGF0IHggKyAxIHRvIHggKyAzIGluIG9yZGVyIHRvIHRoZQorICAgIG1vcmUgc2lnbmlmaWNhbnQgYml0cyBvZiB0aGUgZ3JlZW4gdmFsdWUgYXQgeCAvIDQuCisgICogYHdpZHRoX2JpdHNgID0gMzogZm9yIGV2ZXJ5IHggdmFsdWUgd2hlcmUgeCDiiaEgMCAobW9kIDgpLCBhIGdyZWVuCisgICAgdmFsdWUgYXQgeCBpcyBwb3NpdGlvbmVkIGludG8gdGhlIGxlYXN0LXNpZ25pZmljYW50IGJpdCBvZiB0aGUgZ3JlZW4KKyAgICB2YWx1ZSBhdCB4IC8gOCwgZ3JlZW4gdmFsdWVzIGF0IHggKyAxIHRvIHggKyA3IGluIG9yZGVyIHRvIHRoZSBtb3JlCisgICAgc2lnbmlmaWNhbnQgYml0cyBvZiB0aGUgZ3JlZW4gdmFsdWUgYXQgeCAvIDguCisKKworNCBJbWFnZSBEYXRhCistLS0tLS0tLS0tLS0KKworSW1hZ2UgZGF0YSBpcyBhbiBhcnJheSBvZiBwaXhlbCB2YWx1ZXMgaW4gc2Nhbi1saW5lIG9yZGVyLgorCisjIyMgNC4xIFJvbGVzIG9mIEltYWdlIERhdGEKKworV2UgdXNlIGltYWdlIGRhdGEgaW4gZml2ZSBkaWZmZXJlbnQgcm9sZXM6CisKKyAgMS4gQVJHQiBpbWFnZTogU3RvcmVzIHRoZSBhY3R1YWwgcGl4ZWxzIG9mIHRoZSBpbWFnZS4KKyAgMS4gRW50cm9weSBpbWFnZTogU3RvcmVzIHRoZQorICAgICBbbWV0YSBIdWZmbWFuIGNvZGVzXSgjZGVjb2Rpbmctb2YtbWV0YS1odWZmbWFuLWNvZGVzKS4gVGhlIHJlZCBhbmQgZ3JlZW4KKyAgICAgY29tcG9uZW50cyBvZiBhIHBpeGVsIGRlZmluZSB0aGUgbWV0YSBIdWZmbWFuIGNvZGUgdXNlZCBpbiBhIHBhcnRpY3VsYXIKKyAgICAgYmxvY2sgb2YgdGhlIEFSR0IgaW1hZ2UuCisgIDEuIFByZWRpY3RvciBpbWFnZTogU3RvcmVzIHRoZSBtZXRhZGF0YSBmb3IgW1ByZWRpY3RvcgorICAgICBUcmFuc2Zvcm1dKCNwcmVkaWN0b3ItdHJhbnNmb3JtKS4gVGhlIGdyZWVuIGNvbXBvbmVudCBvZiBhIHBpeGVsIGRlZmluZXMKKyAgICAgd2hpY2ggb2YgdGhlIDE0IHByZWRpY3RvcnMgaXMgdXNlZCB3aXRoaW4gYSBwYXJ0aWN1bGFyIGJsb2NrIG9mIHRoZQorICAgICBBUkdCIGltYWdlLgorICAxLiBDb2xvciB0cmFuc2Zvcm0gaW1hZ2UuIEl0IGlzIGNyZWF0ZWQgYnkgYENvbG9yVHJhbnNmb3JtRWxlbWVudGAgdmFsdWVzCisgICAgIChkZWZpbmVkIGluIFtDb2xvciBUcmFuc2Zvcm1dKCNjb2xvci10cmFuc2Zvcm0pKSBmb3IgZGlmZmVyZW50IGJsb2NrcyBvZgorICAgICB0aGUgaW1hZ2UuIEVhY2ggYENvbG9yVHJhbnNmb3JtRWxlbWVudGAgYCdjdGUnYCBpcyB0cmVhdGVkIGFzIGEgcGl4ZWwgd2hvc2UKKyAgICAgYWxwaGEgY29tcG9uZW50IGlzIGAyNTVgLCByZWQgY29tcG9uZW50IGlzIGBjdGUucmVkX3RvX2JsdWVgLCBncmVlbgorICAgICBjb21wb25lbnQgaXMgYGN0ZS5ncmVlbl90b19ibHVlYCBhbmQgYmx1ZSBjb21wb25lbnQgaXMgYGN0ZS5ncmVlbl90b19yZWRgLgorICAxLiBDb2xvciBpbmRleGluZyBpbWFnZTogQW4gYXJyYXkgb2Ygb2Ygc2l6ZSBgY29sb3JfdGFibGVfc2l6ZWAgKHVwIHRvIDI1NgorICAgICBBUkdCIHZhbHVlcykgc3RvcmluZyB0aGUgbWV0YWRhdGEgZm9yIHRoZQorICAgICBbQ29sb3IgSW5kZXhpbmcgVHJhbnNmb3JtXSgjY29sb3ItaW5kZXhpbmctdHJhbnNmb3JtKS4gVGhpcyBpcyBzdG9yZWQgYXMgYW4KKyAgICAgaW1hZ2Ugb2Ygd2lkdGggYGNvbG9yX3RhYmxlX3NpemVgIGFuZCBoZWlnaHQgYDFgLgorCisjIyMgNC4yIEVuY29kaW5nIG9mIEltYWdlIGRhdGEKKworVGhlIGVuY29kaW5nIG9mIGltYWdlIGRhdGEgaXMgaW5kZXBlbmRlbnQgb2YgaXRzIHJvbGUuCisKK1RoZSBpbWFnZSBpcyBmaXJzdCBkaXZpZGVkIGludG8gYSBzZXQgb2YgZml4ZWQtc2l6ZSBibG9ja3MgKHR5cGljYWxseSAxNngxNgorYmxvY2tzKS4gRWFjaCBvZiB0aGVzZSBibG9ja3MgYXJlIG1vZGVsZWQgdXNpbmcgdGhlaXIgb3duIGVudHJvcHkgY29kZXMuIEFsc28sCitzZXZlcmFsIGJsb2NrcyBtYXkgc2hhcmUgdGhlIHNhbWUgZW50cm9weSBjb2Rlcy4KKworKipSYXRpb25hbGU6KiogU3RvcmluZyBhbiBlbnRyb3B5IGNvZGUgaW5jdXJzIGEgY29zdC4gVGhpcyBjb3N0IGNhbiBiZSBtaW5pbWl6ZWQKK2lmIHN0YXRpc3RpY2FsbHkgc2ltaWxhciBibG9ja3Mgc2hhcmUgYW4gZW50cm9weSBjb2RlLCB0aGVyZWJ5IHN0b3JpbmcgdGhhdCBjb2RlCitvbmx5IG9uY2UuIEZvciBleGFtcGxlLCBhbiBlbmNvZGVyIGNhbiBmaW5kIHNpbWlsYXIgYmxvY2tzIGJ5IGNsdXN0ZXJpbmcgdGhlbQordXNpbmcgdGhlaXIgc3RhdGlzdGljYWwgcHJvcGVydGllcywgb3IgYnkgcmVwZWF0ZWRseSBqb2luaW5nIGEgcGFpciBvZiByYW5kb21seQorc2VsZWN0ZWQgY2x1c3RlcnMgd2hlbiBpdCByZWR1Y2VzIHRoZSBvdmVyYWxsIGFtb3VudCBvZiBiaXRzIG5lZWRlZCB0byBlbmNvZGUKK3RoZSBpbWFnZS4KKworRWFjaCBwaXhlbCBpcyBlbmNvZGVkIHVzaW5nIG9uZSBvZiB0aGUgdGhyZWUgcG9zc2libGUgbWV0aG9kczoKKworICAxLiBIdWZmbWFuIGNvZGVkIGxpdGVyYWw6IGVhY2ggY2hhbm5lbCAoZ3JlZW4sIHJlZCwgYmx1ZSBhbmQgYWxwaGEpIGlzCisgICAgIGVudHJvcHktY29kZWQgaW5kZXBlbmRlbnRseTsKKyAgMi4gTFo3NyBiYWNrd2FyZCByZWZlcmVuY2U6IGEgc2VxdWVuY2Ugb2YgcGl4ZWxzIGFyZSBjb3BpZWQgZnJvbSBlbHNld2hlcmUKKyAgICAgaW4gdGhlIGltYWdlOyBvcgorICAzLiBDb2xvciBjYWNoZSBjb2RlOiB1c2luZyBhIHNob3J0IG11bHRpcGxpY2F0aXZlIGhhc2ggY29kZSAoY29sb3IgY2FjaGUKKyAgICAgaW5kZXgpIG9mIGEgcmVjZW50bHkgc2VlbiBjb2xvci4KKworVGhlIGZvbGxvd2luZyBzdWItc2VjdGlvbnMgZGVzY3JpYmUgZWFjaCBvZiB0aGVzZSBpbiBkZXRhaWwuCisKKyMjIyMgNC4yLjEgSHVmZm1hbiBDb2RlZCBMaXRlcmFscworCitUaGUgcGl4ZWwgaXMgc3RvcmVkIGFzIEh1ZmZtYW4gY29kZWQgdmFsdWVzIG9mIGdyZWVuLCByZWQsIGJsdWUgYW5kIGFscGhhIChpbgordGhhdCBvcmRlcikuIFNlZSBbdGhpcyBzZWN0aW9uXSgjZGVjb2RpbmctZW50cm9weS1jb2RlZC1pbWFnZS1kYXRhKSBmb3IgZGV0YWlscy4KKworIyMjIyA0LjIuMiBMWjc3IEJhY2t3YXJkIFJlZmVyZW5jZQorCitCYWNrd2FyZCByZWZlcmVuY2VzIGFyZSB0dXBsZXMgb2YgX2xlbmd0aF8gYW5kIF9kaXN0YW5jZSBjb2RlXzoKKworICAqIExlbmd0aCBpbmRpY2F0ZXMgaG93IG1hbnkgcGl4ZWxzIGluIHNjYW4tbGluZSBvcmRlciBhcmUgdG8gYmUgY29waWVkLgorICAqIERpc3RhbmNlIGNvZGUgaXMgYSBudW1iZXIgaW5kaWNhdGluZyB0aGUgcG9zaXRpb24gb2YgYSBwcmV2aW91c2x5IHNlZW4KKyAgICBwaXhlbCwgZnJvbSB3aGljaCB0aGUgcGl4ZWxzIGFyZSB0byBiZSBjb3BpZWQuIFRoZSBleGFjdCBtYXBwaW5nIGlzCisgICAgZGVzY3JpYmVkIFtiZWxvd10oI2Rpc3RhbmNlLW1hcHBpbmcpLgorCitUaGUgbGVuZ3RoIGFuZCBkaXN0YW5jZSB2YWx1ZXMgYXJlIHN0b3JlZCB1c2luZyAqKkxaNzcgcHJlZml4IGNvZGluZyoqLgorCitMWjc3IHByZWZpeCBjb2RpbmcgZGl2aWRlcyBsYXJnZSBpbnRlZ2VyIHZhbHVlcyBpbnRvIHR3byBwYXJ0czogdGhlIF9wcmVmaXgKK2NvZGVfIGFuZCB0aGUgX2V4dHJhIGJpdHNfOiB0aGUgcHJlZml4IGNvZGUgaXMgc3RvcmVkIHVzaW5nIGFuIGVudHJvcHkgY29kZSwKK3doaWxlIHRoZSBleHRyYSBiaXRzIGFyZSBzdG9yZWQgYXMgdGhleSBhcmUgKHdpdGhvdXQgYW4gZW50cm9weSBjb2RlKS4KKworKipSYXRpb25hbGUqKjogVGhpcyBhcHByb2FjaCByZWR1Y2VzIHRoZSBzdG9yYWdlIHJlcXVpcmVtZW50IGZvciB0aGUgZW50cm9weQorY29kZS4gQWxzbywgbGFyZ2UgdmFsdWVzIGFyZSB1c3VhbGx5IHJhcmUsIGFuZCBzbyBleHRyYSBiaXRzIHdvdWxkIGJlIHVzZWQgZm9yCit2ZXJ5IGZldyB2YWx1ZXMgaW4gdGhlIGltYWdlLiBUaHVzLCB0aGlzIGFwcHJvYWNoIHJlc3VsdHMgaW4gYSBiZXR0ZXIKK2NvbXByZXNzaW9uIG92ZXJhbGwuCisKK1RoZSBmb2xsb3dpbmcgdGFibGUgZGVub3RlcyB0aGUgcHJlZml4IGNvZGVzIGFuZCBleHRyYSBiaXRzIHVzZWQgZm9yIHN0b3JpbmcKK2RpZmZlcmVudCByYW5nZSBvZiB2YWx1ZXMuCisKK05vdGU6IFRoZSBtYXhpbXVtIGJhY2t3YXJkIHJlZmVyZW5jZSBsZW5ndGggaXMgbGltaXRlZCB0byA0MDk2LiBIZW5jZSwgb25seSB0aGUKK2ZpcnN0IDI0IHByZWZpeCBjb2RlcyAod2l0aCB0aGUgcmVzcGVjdGl2ZSBleHRyYSBiaXRzKSBhcmUgbWVhbmluZ2Z1bCBmb3IgbGVuZ3RoCit2YWx1ZXMuIEZvciBkaXN0YW5jZSB2YWx1ZXMsIGhvd2V2ZXIsIGFsbCB0aGUgNDAgcHJlZml4IGNvZGVzIGFyZSB2YWxpZC4KKworfCBWYWx1ZSByYW5nZSAgICAgfCBQcmVmaXggY29kZSB8IEV4dHJhIGJpdHMgfAorfCAtLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0gfAorfCAxICAgICAgICAgICAgICAgfCAwICAgICAgICAgICB8IDAgICAgICAgICAgfAorfCAyICAgICAgICAgICAgICAgfCAxICAgICAgICAgICB8IDAgICAgICAgICAgfAorfCAzICAgICAgICAgICAgICAgfCAyICAgICAgICAgICB8IDAgICAgICAgICAgfAorfCA0ICAgICAgICAgICAgICAgfCAzICAgICAgICAgICB8IDAgICAgICAgICAgfAorfCA1Li42ICAgICAgICAgICAgfCA0ICAgICAgICAgICB8IDEgICAgICAgICAgfAorfCA3Li44ICAgICAgICAgICAgfCA1ICAgICAgICAgICB8IDEgICAgICAgICAgfAorfCA5Li4xMiAgICAgICAgICAgfCA2ICAgICAgICAgICB8IDIgICAgICAgICAgfAorfCAxMy4uMTYgICAgICAgICAgfCA3ICAgICAgICAgICB8IDIgICAgICAgICAgfAorfCAuLi4gICAgICAgICAgICAgfCAuLi4gICAgICAgICB8IC4uLiAgICAgICAgfAorfCAzMDcyLi40MDk2ICAgICAgfCAyMyAgICAgICAgICB8IDEwICAgICAgICAgfAorfCAuLi4gICAgICAgICAgICAgfCAuLi4gICAgICAgICB8IC4uLiAgICAgICAgfAorfCA1MjQyODkuLjc4NjQzMiAgfCAzOCAgICAgICAgICB8IDE4ICAgICAgICAgfAorfCA3ODY0MzMuLjEwNDg1NzYgfCAzOSAgICAgICAgICB8IDE4ICAgICAgICAgfAorCitUaGUgcHNldWRvY29kZSB0byBvYnRhaW4gYSAobGVuZ3RoIG9yIGRpc3RhbmNlKSB2YWx1ZSBmcm9tIHRoZSBwcmVmaXggY29kZSBpcworYXMgZm9sbG93czoKKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitpZiAocHJlZml4X2NvZGUgPCA0KSB7CisgIHJldHVybiBwcmVmaXhfY29kZSArIDE7Cit9CitpbnQgZXh0cmFfYml0cyA9IChwcmVmaXhfY29kZSAtIDIpID4+IDE7CitpbnQgb2Zmc2V0ID0gKDIgKyAocHJlZml4X2NvZGUgJiAxKSkgPDwgZXh0cmFfYml0czsKK3JldHVybiBvZmZzZXQgKyBSZWFkQml0cyhleHRyYV9iaXRzKSArIDE7Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworKipEaXN0YW5jZSBNYXBwaW5nOioqCit7OiNkaXN0YW5jZS1tYXBwaW5nfQorCitBcyBub3RlZCBwcmV2aW91c2x5LCBkaXN0YW5jZSBjb2RlIGlzIGEgbnVtYmVyIGluZGljYXRpbmcgdGhlIHBvc2l0aW9uIG9mIGEKK3ByZXZpb3VzbHkgc2VlbiBwaXhlbCwgZnJvbSB3aGljaCB0aGUgcGl4ZWxzIGFyZSB0byBiZSBjb3BpZWQuIFRoaXMgc3ViLXNlY3Rpb24KK2RlZmluZXMgdGhlIG1hcHBpbmcgYmV0d2VlbiBhIGRpc3RhbmNlIGNvZGUgYW5kIHRoZSBwb3NpdGlvbiBvZiBhIHByZXZpb3VzCitwaXhlbC4KKworVGhlIGRpc3RhbmNlIGNvZGVzIGxhcmdlciB0aGFuIDEyMCBkZW5vdGUgdGhlIHBpeGVsLWRpc3RhbmNlIGluIHNjYW4tbGluZQorb3JkZXIsIG9mZnNldCBieSAxMjAuCisKK1RoZSBzbWFsbGVzdCBkaXN0YW5jZSBjb2RlcyBcWzEuLjEyMFxdIGFyZSBzcGVjaWFsLCBhbmQgYXJlIHJlc2VydmVkIGZvciBhIGNsb3NlCituZWlnaGJvcmhvb2Qgb2YgdGhlIGN1cnJlbnQgcGl4ZWwuIFRoaXMgbmVpZ2hib3Job29kIGNvbnNpc3RzIG9mIDEyMCBwaXhlbHM6CisKKyAgKiBQaXhlbHMgdGhhdCBhcmUgMSB0byA3IHJvd3MgYWJvdmUgdGhlIGN1cnJlbnQgcGl4ZWwsIGFuZCBhcmUgdXAgdG8gOCBjb2x1bW5zCisgICAgdG8gdGhlIGxlZnQgb3IgdXAgdG8gNyBjb2x1bW5zIHRvIHRoZSByaWdodCBvZiB0aGUgY3VycmVudCBwaXhlbC4gXFtUb3RhbAorICAgIHN1Y2ggcGl4ZWxzID0gYDcgKiAoOCArIDEgKyA3KSA9IDExMmBcXS4KKyAgKiBQaXhlbHMgdGhhdCBhcmUgaW4gc2FtZSByb3cgYXMgdGhlIGN1cnJlbnQgcGl4ZWwsIGFuZCBhcmUgdXAgdG8gOCBjb2x1bW5zIHRvCisgICAgdGhlIGxlZnQgb2YgdGhlIGN1cnJlbnQgcGl4ZWwuIFxbYDhgIHN1Y2ggcGl4ZWxzXF0uCisKK1RoZSBtYXBwaW5nIGJldHdlZW4gZGlzdGFuY2UgY29kZSBgaWAgYW5kIHRoZSBuZWlnaGJvcmluZyBwaXhlbCBvZmZzZXQKK2AoeGksIHlpKWAgaXMgYXMgZm9sbG93czoKKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisoMCwgMSksICAoMSwgMCksICAoMSwgMSksICAoLTEsIDEpLCAoMCwgMiksICAoMiwgMCksICAoMSwgMiksICAoLTEsIDIpLAorKDIsIDEpLCAgKC0yLCAxKSwgKDIsIDIpLCAgKC0yLCAyKSwgKDAsIDMpLCAgKDMsIDApLCAgKDEsIDMpLCAgKC0xLCAzKSwKKygzLCAxKSwgICgtMywgMSksICgyLCAzKSwgICgtMiwgMyksICgzLCAyKSwgICgtMywgMiksICgwLCA0KSwgICg0LCAwKSwKKygxLCA0KSwgICgtMSwgNCksICg0LCAxKSwgICgtNCwgMSksICgzLCAzKSwgICgtMywgMyksICgyLCA0KSwgICgtMiwgNCksCisoNCwgMiksICAoLTQsIDIpLCAoMCwgNSksICAoMywgNCksICAoLTMsIDQpLCAoNCwgMyksICAoLTQsIDMpLCAoNSwgMCksCisoMSwgNSksICAoLTEsIDUpLCAoNSwgMSksICAoLTUsIDEpLCAoMiwgNSksICAoLTIsIDUpLCAoNSwgMiksICAoLTUsIDIpLAorKDQsIDQpLCAgKC00LCA0KSwgKDMsIDUpLCAgKC0zLCA1KSwgKDUsIDMpLCAgKC01LCAzKSwgKDAsIDYpLCAgKDYsIDApLAorKDEsIDYpLCAgKC0xLCA2KSwgKDYsIDEpLCAgKC02LCAxKSwgKDIsIDYpLCAgKC0yLCA2KSwgKDYsIDIpLCAgKC02LCAyKSwKKyg0LCA1KSwgICgtNCwgNSksICg1LCA0KSwgICgtNSwgNCksICgzLCA2KSwgICgtMywgNiksICg2LCAzKSwgICgtNiwgMyksCisoMCwgNyksICAoNywgMCksICAoMSwgNyksICAoLTEsIDcpLCAoNSwgNSksICAoLTUsIDUpLCAoNywgMSksICAoLTcsIDEpLAorKDQsIDYpLCAgKC00LCA2KSwgKDYsIDQpLCAgKC02LCA0KSwgKDIsIDcpLCAgKC0yLCA3KSwgKDcsIDIpLCAgKC03LCAyKSwKKygzLCA3KSwgICgtMywgNyksICg3LCAzKSwgICgtNywgMyksICg1LCA2KSwgICgtNSwgNiksICg2LCA1KSwgICgtNiwgNSksCisoOCwgMCksICAoNCwgNyksICAoLTQsIDcpLCAoNywgNCksICAoLTcsIDQpLCAoOCwgMSksICAoOCwgMiksICAoNiwgNiksCisoLTYsIDYpLCAoOCwgMyksICAoNSwgNyksICAoLTUsIDcpLCAoNywgNSksICAoLTcsIDUpLCAoOCwgNCksICAoNiwgNyksCisoLTYsIDcpLCAoNywgNiksICAoLTcsIDYpLCAoOCwgNSksICAoNywgNyksICAoLTcsIDcpLCAoOCwgNiksICAoOCwgNykKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitGb3IgZXhhbXBsZSwgZGlzdGFuY2UgY29kZSBgMWAgaW5kaWNhdGVzIG9mZnNldCBvZiBgKDAsIDEpYCBmb3IgdGhlIG5laWdoYm9yaW5nCitwaXhlbCwgdGhhdCBpcywgdGhlIHBpeGVsIGFib3ZlIHRoZSBjdXJyZW50IHBpeGVsICgwLXBpeGVsIGRpZmZlcmVuY2UgaW4KK1gtZGlyZWN0aW9uIGFuZCAxIHBpeGVsIGRpZmZlcmVuY2UgaW4gWS1kaXJlY3Rpb24pLiBTaW1pbGFybHksIGRpc3RhbmNlIGNvZGUKK2AzYCBpbmRpY2F0ZXMgbGVmdC10b3AgcGl4ZWwuCisKK1RoZSBkZWNvZGVyIGNhbiBjb252ZXJ0IGEgZGlzdGFuY2VzIGNvZGUgJ2knIHRvIGEgc2Nhbi1saW5lIG9yZGVyIGRpc3RhbmNlCisnZGlzdCcgYXMgZm9sbG93czoKKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorKHhpLCB5aSkgPSBkaXN0YW5jZV9tYXBbaV0KK2Rpc3QgPSB4ICsgeSAqIHhzaXplCitpZiAoZGlzdCA8IDEpIHsKKyAgZGlzdCA9IDEKK30KK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKword2hlcmUgJ2Rpc3RhbmNlX21hcCcgaXMgdGhlIG1hcHBpbmcgbm90ZWQgYWJvdmUgYW5kIGB4c2l6ZWAgaXMgdGhlIHdpZHRoIG9mIHRoZQoraW1hZ2UgaW4gcGl4ZWxzLgorCisKKyMjIyMgNC4yLjMgQ29sb3IgQ2FjaGUgQ29kaW5nCisKK0NvbG9yIGNhY2hlIHN0b3JlcyBhIHNldCBvZiBjb2xvcnMgdGhhdCBoYXZlIGJlZW4gcmVjZW50bHkgdXNlZCBpbiB0aGUgaW1hZ2UuCisKKyoqUmF0aW9uYWxlOioqIFRoaXMgd2F5LCB0aGUgcmVjZW50bHkgdXNlZCBjb2xvcnMgY2FuIHNvbWV0aW1lcyBiZSByZWZlcnJlZCB0bworbW9yZSBlZmZpY2llbnRseSB0aGFuIGVtaXR0aW5nIHRoZW0gdXNpbmcgb3RoZXIgdHdvIG1ldGhvZHMgKGRlc2NyaWJlZCBpbgorWzQuMi4xXSgjaHVmZm1hbi1jb2RlZC1saXRlcmFscykgYW5kIFs0LjIuMl0oI2x6NzctYmFja3dhcmQtcmVmZXJlbmNlKSkuCisKK0NvbG9yIGNhY2hlIGNvZGVzIGFyZSBzdG9yZWQgYXMgZm9sbG93cy4gRmlyc3QsIHRoZXJlIGlzIGEgMS1iaXQgdmFsdWUgdGhhdAoraW5kaWNhdGVzIGlmIHRoZSBjb2xvciBjYWNoZSBpcyB1c2VkLiBJZiB0aGlzIGJpdCBpcyAwLCBubyBjb2xvciBjYWNoZSBjb2RlcworZXhpc3QsIGFuZCB0aGV5IGFyZSBub3QgdHJhbnNtaXR0ZWQgaW4gdGhlIEh1ZmZtYW4gY29kZSB0aGF0IGRlY29kZXMgdGhlIGdyZWVuCitzeW1ib2xzIGFuZCB0aGUgbGVuZ3RoIHByZWZpeCBjb2Rlcy4gSG93ZXZlciwgaWYgdGhpcyBiaXQgaXMgMSwgdGhlIGNvbG9yIGNhY2hlCitzaXplIGlzIHJlYWQgbmV4dDoKKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitpbnQgY29sb3JfY2FjaGVfY29kZV9iaXRzID0gUmVhZEJpdHMoNCk7CitpbnQgY29sb3JfY2FjaGVfc2l6ZSA9IDEgPDwgY29sb3JfY2FjaGVfY29kZV9iaXRzOworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK2Bjb2xvcl9jYWNoZV9jb2RlX2JpdHNgIGRlZmluZXMgdGhlIHNpemUgb2YgdGhlIGNvbG9yX2NhY2hlIGJ5ICgxIDw8CitgY29sb3JfY2FjaGVfY29kZV9iaXRzYCkuIFRoZSByYW5nZSBvZiBhbGxvd2VkIHZhbHVlcyBmb3IKK2Bjb2xvcl9jYWNoZV9jb2RlX2JpdHNgIGlzIFxbMS4uMTFcXS4gQ29tcGxpYW50IGRlY29kZXJzIG11c3QgaW5kaWNhdGUgYQorY29ycnVwdGVkIGJpdHN0cmVhbSBmb3Igb3RoZXIgdmFsdWVzLgorCitBIGNvbG9yIGNhY2hlIGlzIGFuIGFycmF5IG9mIHNpemUgYGNvbG9yX2NhY2hlX3NpemVgLiBFYWNoIGVudHJ5CitzdG9yZXMgb25lIEFSR0IgY29sb3IuIENvbG9ycyBhcmUgbG9va2VkIHVwIGJ5IGluZGV4aW5nIHRoZW0gYnkKKygweDFlMzVhN2JkICogYGNvbG9yYCkgPj4gKDMyIC0gYGNvbG9yX2NhY2hlX2NvZGVfYml0c2ApLiBPbmx5IG9uZQorbG9va3VwIGlzIGRvbmUgaW4gYSBjb2xvciBjYWNoZTsgdGhlcmUgaXMgbm8gY29uZmxpY3QgcmVzb2x1dGlvbi4KKworSW4gdGhlIGJlZ2lubmluZyBvZiBkZWNvZGluZyBvciBlbmNvZGluZyBvZiBhbiBpbWFnZSwgYWxsIGVudHJpZXMgaW4gYWxsCitjb2xvciBjYWNoZSB2YWx1ZXMgYXJlIHNldCB0byB6ZXJvLiBUaGUgY29sb3IgY2FjaGUgY29kZSBpcyBjb252ZXJ0ZWQgdG8KK3RoaXMgY29sb3IgYXQgZGVjb2RpbmcgdGltZS4gVGhlIHN0YXRlIG9mIHRoZSBjb2xvciBjYWNoZSBpcyBtYWludGFpbmVkCitieSBpbnNlcnRpbmcgZXZlcnkgcGl4ZWwsIGJlIGl0IHByb2R1Y2VkIGJ5IGJhY2t3YXJkIHJlZmVyZW5jaW5nIG9yIGFzCitsaXRlcmFscywgaW50byB0aGUgY2FjaGUgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyIGluIHRoZSBzdHJlYW0uCisKKworNSBFbnRyb3B5IENvZGUKKy0tLS0tLS0tLS0tLS0tCisKKyMjIyA1LjEgT3ZlcnZpZXcKKworTW9zdCBvZiB0aGUgZGF0YSBpcyBjb2RlZCB1c2luZyBbY2Fub25pY2FsIEh1ZmZtYW4gY29kZV1bY2Fub25pY2FsX2h1ZmZdLiBIZW5jZSwKK3RoZSBjb2RlcyBhcmUgdHJhbnNtaXR0ZWQgYnkgc2VuZGluZyB0aGUgX0h1ZmZtYW4gY29kZSBsZW5ndGhzXywgYXMgb3Bwb3NlZCB0bwordGhlIGFjdHVhbCBfSHVmZm1hbiBjb2Rlc18uCisKK0luIHBhcnRpY3VsYXIsIHRoZSBmb3JtYXQgdXNlcyAqKnNwYXRpYWxseS12YXJpYW50IEh1ZmZtYW4gY29kaW5nKiouIEluIG90aGVyCit3b3JkcywgZGlmZmVyZW50IGJsb2NrcyBvZiB0aGUgaW1hZ2UgY2FuIHBvdGVudGlhbGx5IHVzZSBkaWZmZXJlbnQgZW50cm9weQorY29kZXMuCisKKyoqUmF0aW9uYWxlKio6IERpZmZlcmVudCBhcmVhcyBvZiB0aGUgaW1hZ2UgbWF5IGhhdmUgZGlmZmVyZW50IGNoYXJhY3RlcmlzdGljcy4gU28sIGFsbG93aW5nIHRoZW0gdG8gdXNlIGRpZmZlcmVudCBlbnRyb3B5IGNvZGVzIHByb3ZpZGVzIG1vcmUgZmxleGliaWxpdHkgYW5kCitwb3RlbnRpYWxseSBhIGJldHRlciBjb21wcmVzc2lvbi4KKworIyMjIDUuMiBEZXRhaWxzCisKK1RoZSBlbmNvZGVkIGltYWdlIGRhdGEgY29uc2lzdHMgb2YgdHdvIHBhcnRzOgorCisgIDEuIE1ldGEgSHVmZm1hbiBjb2RlcworICAxLiBFbnRyb3B5LWNvZGVkIGltYWdlIGRhdGEKKworIyMjIyA1LjIuMSBEZWNvZGluZyBvZiBNZXRhIEh1ZmZtYW4gQ29kZXMKKworQXMgbm90ZWQgZWFybGllciwgdGhlIGZvcm1hdCBhbGxvd3MgdGhlIHVzZSBvZiBkaWZmZXJlbnQgSHVmZm1hbiBjb2RlcyBmb3IKK2RpZmZlcmVudCBibG9ja3Mgb2YgdGhlIGltYWdlLiBfTWV0YSBIdWZmbWFuIGNvZGVzXyBhcmUgaW5kZXhlcyBpZGVudGlmeWluZword2hpY2ggSHVmZm1hbiBjb2RlcyB0byB1c2UgaW4gZGlmZmVyZW50IHBhcnRzIG9mIHRoZSBpbWFnZS4KKworTWV0YSBIdWZmbWFuIGNvZGVzIG1heSBiZSB1c2VkIF9vbmx5XyB3aGVuIHRoZSBpbWFnZSBpcyBiZWluZyB1c2VkIGluIHRoZQorW3JvbGVdKCNyb2xlcy1vZi1pbWFnZS1kYXRhKSBvZiBhbiBfQVJHQiBpbWFnZV8uCisKK1RoZXJlIGFyZSB0d28gcG9zc2liaWxpdGllcyBmb3IgdGhlIG1ldGEgSHVmZm1hbiBjb2RlcywgaW5kaWNhdGVkIGJ5IGEgMS1iaXQKK3ZhbHVlOgorCisgICogSWYgdGhpcyBiaXQgaXMgemVybywgdGhlcmUgaXMgb25seSBvbmUgbWV0YSBIdWZmbWFuIGNvZGUgdXNlZCBldmVyeXdoZXJlIGluCisgICAgdGhlIGltYWdlLiBObyBtb3JlIGRhdGEgaXMgc3RvcmVkLgorICAqIElmIHRoaXMgYml0IGlzIG9uZSwgdGhlIGltYWdlIHVzZXMgbXVsdGlwbGUgbWV0YSBIdWZmbWFuIGNvZGVzLiBUaGVzZSBtZXRhCisgICAgSHVmZm1hbiBjb2RlcyBhcmUgc3RvcmVkIGFzIGFuIF9lbnRyb3B5IGltYWdlXyAoZGVzY3JpYmVkIGJlbG93KS4KKworKipFbnRyb3B5IGltYWdlOioqCisKK1RoZSBlbnRyb3B5IGltYWdlIGRlZmluZXMgd2hpY2ggSHVmZm1hbiBjb2RlcyBhcmUgdXNlZCBpbiBkaWZmZXJlbnQgcGFydHMgb2YgdGhlCitpbWFnZSwgYXMgZGVzY3JpYmVkIGJlbG93LgorCitUaGUgZmlyc3QgMy1iaXRzIGNvbnRhaW4gdGhlIGBodWZmbWFuX2JpdHNgIHZhbHVlLiBUaGUgZGltZW5zaW9ucyBvZiB0aGUgZW50cm9weQoraW1hZ2UgYXJlIGRlcml2ZWQgZnJvbSAnaHVmZm1hbl9iaXRzJy4KKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitpbnQgaHVmZm1hbl9iaXRzID0gUmVhZEJpdHMoMykgKyAyOworaW50IGh1ZmZtYW5feHNpemUgPSBESVZfUk9VTkRfVVAoeHNpemUsIDEgPDwgaHVmZm1hbl9iaXRzKTsKK2ludCBodWZmbWFuX3lzaXplID0gRElWX1JPVU5EX1VQKHlzaXplLCAxIDw8IGh1ZmZtYW5fYml0cyk7Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKword2hlcmUgYERJVl9ST1VORF9VUGAgaXMgYXMgZGVmaW5lZCBbZWFybGllcl0oI3ByZWRpY3Rvci10cmFuc2Zvcm0pLgorCitOZXh0IGJpdHMgY29udGFpbiBhbiBlbnRyb3B5IGltYWdlIG9mIHdpZHRoIGBodWZmbWFuX3hzaXplYCBhbmQgaGVpZ2h0CitgaHVmZm1hbl95c2l6ZWAuCisKKyoqSW50ZXJwcmV0YXRpb24gb2YgTWV0YSBIdWZmbWFuIENvZGVzOioqCisKK0ZvciBhbnkgZ2l2ZW4gcGl4ZWwgKHgsIHkpLCB0aGVyZSBpcyBhIHNldCBvZiBmaXZlIEh1ZmZtYW4gY29kZXMgYXNzb2NpYXRlZCB3aXRoCitpdC4gVGhlc2UgY29kZXMgYXJlIChpbiBiaXRzdHJlYW0gb3JkZXIpOgorCisgICogKipIdWZmbWFuIGNvZGUgIzEqKjogdXNlZCBmb3IgZ3JlZW4gY2hhbm5lbCwgYmFja3dhcmQtcmVmZXJlbmNlIGxlbmd0aCBhbmQKKyAgICBjb2xvciBjYWNoZQorICAqICoqSHVmZm1hbiBjb2RlICMyLCAjMyBhbmQgIzQqKjogdXNlZCBmb3IgcmVkLCBibHVlIGFuZCBhbHBoYSBjaGFubmVscworICAgIHJlc3BlY3RpdmVseS4KKyAgKiAqKkh1ZmZtYW4gY29kZSAjNSoqOiB1c2VkIGZvciBiYWNrd2FyZC1yZWZlcmVuY2UgZGlzdGFuY2UuCisKK0Zyb20gaGVyZSBvbiwgd2UgcmVmZXIgdG8gdGhpcyBzZXQgYXMgYSAqKkh1ZmZtYW4gY29kZSBncm91cCoqLgorCitUaGUgbnVtYmVyIG9mIEh1ZmZtYW4gY29kZSBncm91cHMgaW4gdGhlIEFSR0IgaW1hZ2UgY2FuIGJlIG9idGFpbmVkIGJ5IGZpbmRpbmcKK3RoZSBfbGFyZ2VzdCBtZXRhIEh1ZmZtYW4gY29kZV8gZnJvbSB0aGUgZW50cm9weSBpbWFnZToKKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitpbnQgbnVtX2h1ZmZfZ3JvdXBzID0gbWF4KGVudHJvcHkgaW1hZ2UpICsgMTsKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgord2hlcmUgYG1heChlbnRyb3B5IGltYWdlKWAgaW5kaWNhdGVzIHRoZSBsYXJnZXN0IEh1ZmZtYW4gY29kZSBzdG9yZWQgaW4gdGhlCitlbnRyb3B5IGltYWdlLgorCitBcyBlYWNoIEh1ZmZtYW4gY29kZSBncm91cHMgY29udGFpbnMgZml2ZSBIdWZmbWFuIGNvZGVzLCB0aGUgdG90YWwgbnVtYmVyIG9mCitIdWZmbWFuIGNvZGVzIGlzOgorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK2ludCBudW1faHVmZl9jb2RlcyA9IDUgKiBudW1faHVmZl9ncm91cHM7Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworR2l2ZW4gYSBwaXhlbCAoeCwgeSkgaW4gdGhlIEFSR0IgaW1hZ2UsIHdlIGNhbiBvYnRhaW4gdGhlIGNvcnJlc3BvbmRpbmcgSHVmZm1hbgorY29kZXMgdG8gYmUgdXNlZCBhcyBmb2xsb3dzOgorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK2ludCBwb3NpdGlvbiA9ICh5ID4+IGh1ZmZtYW5fYml0cykgKiBodWZmbWFuX3hzaXplICsgKHggPj4gaHVmZm1hbl9iaXRzKTsKK2ludCBtZXRhX2h1ZmZfY29kZSA9IChlbnRyb3B5X2ltYWdlW3Bvc10gPj4gOCkgJiAweGZmZmY7CitIdWZmbWFuQ29kZUdyb3VwIGh1ZmZfZ3JvdXAgPSBodWZmbWFuX2NvZGVfZ3JvdXBzW21ldGFfaHVmZl9jb2RlXTsKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCit3aGVyZSwgd2UgaGF2ZSBhc3N1bWVkIHRoZSBleGlzdGVuY2Ugb2YgYEh1ZmZtYW5Db2RlR3JvdXBgIHN0cnVjdHVyZSwgd2hpY2gKK3JlcHJlc2VudHMgYSBzZXQgb2YgZml2ZSBIdWZmbWFuIGNvZGVzLiBBbHNvLCBgaHVmZm1hbl9jb2RlX2dyb3Vwc2AgaXMgYW4gYXJyYXkKK29mIGBIdWZmbWFuQ29kZUdyb3VwYCAob2Ygc2l6ZSBgbnVtX2h1ZmZfZ3JvdXBzYCkuCisKK1RoZSBkZWNvZGVyIHRoZW4gdXNlcyBIdWZmbWFuIGNvZGUgZ3JvdXAgYGh1ZmZfZ3JvdXBgIHRvIGRlY29kZSB0aGUgcGl4ZWwKKyh4LCB5KSBhcyBleHBsYWluZWQgaW4gdGhlIFtuZXh0IHNlY3Rpb25dKCNkZWNvZGluZy1lbnRyb3B5LWNvZGVkLWltYWdlLWRhdGEpLgorCisjIyMjIDUuMi4yIERlY29kaW5nIEVudHJvcHktY29kZWQgSW1hZ2UgRGF0YQorCitGb3IgdGhlIGN1cnJlbnQgcG9zaXRpb24gKHgsIHkpIGluIHRoZSBpbWFnZSwgdGhlIGRlY29kZXIgZmlyc3QgaWRlbnRpZmllcyB0aGUKK2NvcnJlc3BvbmRpbmcgSHVmZm1hbiBjb2RlIGdyb3VwIChhcyBleHBsYWluZWQgaW4gdGhlIGxhc3Qgc2VjdGlvbikuIEdpdmVuIHRoZQorSHVmZm1hbiBjb2RlIGdyb3VwLCB0aGUgcGl4ZWwgaXMgcmVhZCBhbmQgZGVjb2RlZCBhcyBmb2xsb3dzOgorCitSZWFkIG5leHQgc3ltYm9sIFMgZnJvbSB0aGUgYml0c3RyZWFtIHVzaW5nIEh1ZmZtYW4gY29kZSAjMS4gXFtTZWUKK1tuZXh0IHNlY3Rpb25dKCNkZWNvZGluZy10aGUtY29kZS1sZW5ndGhzKSBmb3IgZGV0YWlscyBvbiBkZWNvZGluZyB0aGUgSHVmZm1hbgorY29kZSBsZW5ndGhzXF0uIE5vdGUgdGhhdCBTIGlzIGFueSBpbnRlZ2VyIGluIHRoZSByYW5nZSBgMGAgdG8KK2AoMjU2ICsgMjQgKyBgIFtgY29sb3JfY2FjaGVfc2l6ZWBdKCNjb2xvci1jYWNoZS1jb2RlKWAtIDEpYC4KKworVGhlIGludGVycHJldGF0aW9uIG9mIFMgZGVwZW5kcyBvbiBpdHMgdmFsdWU6CisKKyAgMS4gaWYgUyA8IDI1NgorICAgICAxLiBVc2UgUyBhcyB0aGUgZ3JlZW4gY29tcG9uZW50CisgICAgIDEuIFJlYWQgcmVkIGZyb20gdGhlIGJpdHN0cmVhbSB1c2luZyBIdWZmbWFuIGNvZGUgIzIKKyAgICAgMS4gUmVhZCBibHVlIGZyb20gdGhlIGJpdHN0cmVhbSB1c2luZyBIdWZmbWFuIGNvZGUgIzMKKyAgICAgMS4gUmVhZCBhbHBoYSBmcm9tIHRoZSBiaXRzdHJlYW0gdXNpbmcgSHVmZm1hbiBjb2RlICM0CisgIDEuIGlmIFMgPCAyNTYgKyAyNAorICAgICAxLiBVc2UgUyAtIDI1NiBhcyBhIGxlbmd0aCBwcmVmaXggY29kZQorICAgICAxLiBSZWFkIGV4dHJhIGJpdHMgZm9yIGxlbmd0aCBmcm9tIHRoZSBiaXRzdHJlYW0KKyAgICAgMS4gRGV0ZXJtaW5lIGJhY2t3YXJkLXJlZmVyZW5jZSBsZW5ndGggTCBmcm9tIGxlbmd0aCBwcmVmaXggY29kZSBhbmQgdGhlCisgICAgICAgIGV4dHJhIGJpdHMgcmVhZC4KKyAgICAgMS4gUmVhZCBkaXN0YW5jZSBwcmVmaXggY29kZSBmcm9tIHRoZSBiaXRzdHJlYW0gdXNpbmcgSHVmZm1hbiBjb2RlICM1CisgICAgIDEuIFJlYWQgZXh0cmEgYml0cyBmb3IgZGlzdGFuY2UgZnJvbSB0aGUgYml0c3RyZWFtCisgICAgIDEuIERldGVybWluZSBiYWNrd2FyZC1yZWZlcmVuY2UgZGlzdGFuY2UgRCBmcm9tIGRpc3RhbmNlIHByZWZpeCBjb2RlIGFuZAorICAgICAgICB0aGUgZXh0cmEgYml0cyByZWFkLgorICAgICAxLiBDb3B5IHRoZSBMIHBpeGVscyAoaW4gc2Nhbi1saW5lIG9yZGVyKSBmcm9tIHRoZSBzZXF1ZW5jZSBvZiBwaXhlbHMKKyAgICAgICAgcHJpb3IgdG8gdGhlbSBieSBEIHBpeGVscy4KKyAgMS4gaWYgUyA+PSAyNTYgKyAyNAorICAgICAxLiBVc2UgUyAtICgyNTYgKyAyNCkgYXMgdGhlIGluZGV4IGludG8gdGhlIGNvbG9yIGNhY2hlLgorICAgICAxLiBHZXQgQVJHQiBjb2xvciBmcm9tIHRoZSBjb2xvciBjYWNoZSBhdCB0aGF0IGluZGV4LgorCisKKyoqRGVjb2RpbmcgdGhlIENvZGUgTGVuZ3RoczoqKgorezojZGVjb2RpbmctdGhlLWNvZGUtbGVuZ3Roc30KKworVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgZGV0YWlscyBhYm91dCByZWFkaW5nIGEgc3ltYm9sIGZyb20gdGhlIGJpdHN0cmVhbSBieQorZGVjb2RpbmcgdGhlIEh1ZmZtYW4gY29kZSBsZW5ndGguCisKK1RoZSBIdWZmbWFuIGNvZGUgbGVuZ3RocyBjYW4gYmUgY29kZWQgaW4gdHdvIHdheXMuIFRoZSBtZXRob2QgdXNlZCBpcyBzcGVjaWZpZWQKK2J5IGEgMS1iaXQgdmFsdWUuCisKKyAgKiBJZiB0aGlzIGJpdCBpcyAxLCBpdCBpcyBhIF9zaW1wbGUgY29kZSBsZW5ndGggY29kZV8sIGFuZAorICAqIElmIHRoaXMgYml0IGlzIDAsIGl0IGlzIGEgX25vcm1hbCBjb2RlIGxlbmd0aCBjb2RlXy4KKworKiooaSkgU2ltcGxlIENvZGUgTGVuZ3RoIENvZGU6KioKKworVGhpcyB2YXJpYW50IGlzIHVzZWQgaW4gdGhlIHNwZWNpYWwgY2FzZSB3aGVuIG9ubHkgMSBvciAyIEh1ZmZtYW4gY29kZSBsZW5ndGhzCithcmUgbm9uLXplcm8sIGFuZCBhcmUgaW4gdGhlIHJhbmdlIG9mIFxbMCwgMjU1XF0uIEFsbCBvdGhlciBIdWZmbWFuIGNvZGUgbGVuZ3RocworYXJlIGltcGxpY2l0bHkgemVyb3MuCisKK1RoZSBmaXJzdCBiaXQgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2Ygbm9uLXplcm8gY29kZSBsZW5ndGhzOgorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK2ludCBudW1fY29kZV9sZW5ndGhzID0gUmVhZEJpdHMoMSkgKyAxOworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1RoZSBmaXJzdCBjb2RlIGxlbmd0aCBpcyBzdG9yZWQgZWl0aGVyIHVzaW5nIGEgMS1iaXQgY29kZSBmb3IgdmFsdWVzIG9mIDAgYW5kIDEsCitvciB1c2luZyBhbiA4LWJpdCBjb2RlIGZvciB2YWx1ZXMgaW4gcmFuZ2UgXFswLCAyNTVcXS4gVGhlIHNlY29uZCBjb2RlIGxlbmd0aCwKK3doZW4gcHJlc2VudCwgaXMgY29kZWQgYXMgYW4gOC1iaXQgY29kZS4KKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitpbnQgaXNfZmlyc3RfOGJpdHMgPSBSZWFkQml0cygxKTsKK2NvZGVfbGVuZ3Roc1swXSA9IFJlYWRCaXRzKDEgKyA3ICogaXNfZmlyc3RfOGJpdHMpOworaWYgKG51bV9jb2RlX2xlbmd0aHMgPT0gMikgeworICBjb2RlX2xlbmd0aHNbMV0gPSBSZWFkQml0cyg4KTsKK30KK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCisqKk5vdGU6KiogQW5vdGhlciBzcGVjaWFsIGNhc2UgaXMgd2hlbiBfYWxsXyBIdWZmbWFuIGNvZGUgbGVuZ3RocyBhcmUgX3plcm9zXworKGFuIGVtcHR5IEh1ZmZtYW4gY29kZSkuIEZvciBleGFtcGxlLCBhIEh1ZmZtYW4gY29kZSBmb3IgZGlzdGFuY2UgY2FuIGJlIGVtcHR5CitpZiB0aGVyZSBhcmUgbm8gYmFja3dhcmQgcmVmZXJlbmNlcy4gU2ltaWxhcmx5LCBIdWZmbWFuIGNvZGVzIGZvciBhbHBoYSwgcmVkLAorYW5kIGJsdWUgY2FuIGJlIGVtcHR5IGlmIGFsbCBwaXhlbHMgd2l0aGluIHRoZSBzYW1lIG1ldGEgSHVmZm1hbiBjb2RlIGFyZQorcHJvZHVjZWQgdXNpbmcgdGhlIGNvbG9yIGNhY2hlLiBIb3dldmVyLCB0aGlzIGNhc2UgZG9lc24ndCBuZWVkIGEgc3BlY2lhbAoraGFuZGxpbmcsIGFzIGVtcHR5IEh1ZmZtYW4gY29kZXMgY2FuIGJlIGNvZGVkIGFzIHRob3NlIGNvbnRhaW5pbmcgYSBzaW5nbGUKK3N5bWJvbCBgMGAuCisKKyoqKGlpKSBOb3JtYWwgQ29kZSBMZW5ndGggQ29kZToqKgorCitUaGUgY29kZSBsZW5ndGhzIG9mIGEgSHVmZm1hbiBjb2RlIGFyZSByZWFkIGFzIGZvbGxvd3M6IGBudW1fY29kZV9sZW5ndGhzYAorc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgY29kZSBsZW5ndGhzOyB0aGUgcmVzdCBvZiB0aGUgY29kZSBsZW5ndGhzCisoYWNjb3JkaW5nIHRvIHRoZSBvcmRlciBpbiBga0NvZGVMZW5ndGhDb2RlT3JkZXJgKSBhcmUgemVyb3MuCisKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgoraW50IGtDb2RlTGVuZ3RoQ29kZXMgPSAxOTsKK2ludCBrQ29kZUxlbmd0aENvZGVPcmRlcltrQ29kZUxlbmd0aENvZGVzXSA9IHsKKyAgMTcsIDE4LCAwLCAxLCAyLCAzLCA0LCA1LCAxNiwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNQorfTsKK2ludCBjb2RlX2xlbmd0aHNba0NvZGVMZW5ndGhDb2Rlc10gPSB7IDAgfTsgIC8vIEFsbCB6ZXJvcy4KK2ludCBudW1fY29kZV9sZW5ndGhzID0gNCArIFJlYWRCaXRzKDQpOworZm9yIChpID0gMDsgaSA8IG51bV9jb2RlX2xlbmd0aHM7ICsraSkgeworICBjb2RlX2xlbmd0aHNba0NvZGVMZW5ndGhDb2RlT3JkZXJbaV1dID0gUmVhZEJpdHMoMyk7Cit9Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworICAqIENvZGUgbGVuZ3RoIGNvZGUgXFswLi4xNVxdIGluZGljYXRlcyBsaXRlcmFsIGNvZGUgbGVuZ3Rocy4KKyAgICAqIFZhbHVlIDAgbWVhbnMgbm8gc3ltYm9scyBoYXZlIGJlZW4gY29kZWQuCisgICAgKiBWYWx1ZXMgXFsxLi4xNVxdIGluZGljYXRlIHRoZSBiaXQgbGVuZ3RoIG9mIHRoZSByZXNwZWN0aXZlIGNvZGUuCisgICogQ29kZSAxNiByZXBlYXRzIHRoZSBwcmV2aW91cyBub24temVybyB2YWx1ZSBcWzMuLjZcXSB0aW1lcywgaS5lLiwKKyAgICAzICsgYFJlYWRCaXRzKDIpYCB0aW1lcy4gIElmIGNvZGUgMTYgaXMgdXNlZCBiZWZvcmUgYSBub24temVybworICAgIHZhbHVlIGhhcyBiZWVuIGVtaXR0ZWQsIGEgdmFsdWUgb2YgOCBpcyByZXBlYXRlZC4KKyAgKiBDb2RlIDE3IGVtaXRzIGEgc3RyZWFrIG9mIHplcm9zIFxbMy4uMTBcXSwgaS5lLiwgMyArIGBSZWFkQml0cygzKWAKKyAgICB0aW1lcy4KKyAgKiBDb2RlIDE4IGVtaXRzIGEgc3RyZWFrIG9mIHplcm9zIG9mIGxlbmd0aCBcWzExLi4xMzhcXSwgaS5lLiwKKyAgICAxMSArIGBSZWFkQml0cyg3KWAgdGltZXMuCisKKworNiBPdmVyYWxsIFN0cnVjdHVyZSBvZiB0aGUgRm9ybWF0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQmVsb3cgaXMgYSB2aWV3IGludG8gdGhlIGZvcm1hdCBpbiBCYWNrdXMtTmF1ciBmb3JtLiBJdCBkb2VzIG5vdCBjb3ZlcgorYWxsIGRldGFpbHMuIEVuZC1vZi1pbWFnZSAoRU9JKSBpcyBvbmx5IGltcGxpY2l0bHkgY29kZWQgaW50byB0aGUgbnVtYmVyCitvZiBwaXhlbHMgKHhzaXplICogeXNpemUpLgorCisKKyMjIyMgQmFzaWMgU3RydWN0dXJlCisKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorPGZvcm1hdD4gOjo9IDxSSUZGIGhlYWRlcj48aW1hZ2Ugc2l6ZT48aW1hZ2Ugc3RyZWFtPgorPGltYWdlIHN0cmVhbT4gOjo9IDxvcHRpb25hbC10cmFuc2Zvcm0+PHNwYXRpYWxseS1jb2RlZCBpbWFnZT4KK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCisKKyMjIyMgU3RydWN0dXJlIG9mIFRyYW5zZm9ybXMKKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Cis8b3B0aW9uYWwtdHJhbnNmb3JtPiA6Oj0gKDEtYml0IHZhbHVlIDE7IDx0cmFuc2Zvcm0+IDxvcHRpb25hbC10cmFuc2Zvcm0+KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgMS1iaXQgdmFsdWUgMAorPHRyYW5zZm9ybT4gOjo9IDxwcmVkaWN0b3ItdHg+IHwgPGNvbG9yLXR4PiB8IDxzdWJ0cmFjdC1ncmVlbi10eD4gfAorICAgICAgICAgICAgICAgIDxjb2xvci1pbmRleGluZy10eD4KKzxwcmVkaWN0b3ItdHg+IDo6PSAyLWJpdCB2YWx1ZSAwOyA8cHJlZGljdG9yIGltYWdlPgorPHByZWRpY3RvciBpbWFnZT4gOjo9IDMtYml0IHN1Yi1waXhlbCBjb2RlIDsgPGVudHJvcHktY29kZWQgaW1hZ2U+Cis8Y29sb3ItdHg+IDo6PSAyLWJpdCB2YWx1ZSAxOyA8Y29sb3IgaW1hZ2U+Cis8Y29sb3IgaW1hZ2U+IDo6PSAzLWJpdCBzdWItcGl4ZWwgY29kZSA7IDxlbnRyb3B5LWNvZGVkIGltYWdlPgorPHN1YnRyYWN0LWdyZWVuLXR4PiA6Oj0gMi1iaXQgdmFsdWUgMgorPGNvbG9yLWluZGV4aW5nLXR4PiA6Oj0gMi1iaXQgdmFsdWUgMzsgPGNvbG9yLWluZGV4aW5nIGltYWdlPgorPGNvbG9yLWluZGV4aW5nIGltYWdlPiA6Oj0gOC1iaXQgY29sb3IgY291bnQ7IDxlbnRyb3B5LWNvZGVkIGltYWdlPgorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKKworIyMjIyBTdHJ1Y3R1cmUgb2YgdGhlIEltYWdlIERhdGEKKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Cis8c3BhdGlhbGx5LWNvZGVkIGltYWdlPiA6Oj0gPG1ldGEgaHVmZm1hbj48ZW50cm9weS1jb2RlZCBpbWFnZT4KKzxlbnRyb3B5LWNvZGVkIGltYWdlPiA6Oj0gPGNvbG9yIGNhY2hlIGluZm8+PGh1ZmZtYW4gY29kZXM+PGx6NzctY29kZWQgaW1hZ2U+Cis8bWV0YSBodWZmbWFuPiA6Oj0gMS1iaXQgdmFsdWUgMCB8CisgICAgICAgICAgICAgICAgICAgKDEtYml0IHZhbHVlIDE7IDxlbnRyb3B5IGltYWdlPikKKzxlbnRyb3B5IGltYWdlPiA6Oj0gMy1iaXQgc3Vic2FtcGxlIHZhbHVlOyA8ZW50cm9weS1jb2RlZCBpbWFnZT4KKzxjb2xvciBjYWNoZSBpbmZvPiA6Oj0gMSBiaXQgdmFsdWUgMCB8CisgICAgICAgICAgICAgICAgICAgICAgICgxLWJpdCB2YWx1ZSAxOyA0LWJpdCB2YWx1ZSBmb3IgY29sb3IgY2FjaGUgc2l6ZSkKKzxodWZmbWFuIGNvZGVzPiA6Oj0gPGh1ZmZtYW4gY29kZSBncm91cD4gfCA8aHVmZm1hbiBjb2RlIGdyb3VwPjxodWZmbWFuIGNvZGVzPgorPGh1ZmZtYW4gY29kZSBncm91cD4gOjo9IDxodWZmbWFuIGNvZGU+PGh1ZmZtYW4gY29kZT48aHVmZm1hbiBjb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgIDxodWZmbWFuIGNvZGU+PGh1ZmZtYW4gY29kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICBTZWUgIkludGVycHJldGF0aW9uIG9mIE1ldGEgSHVmZm1hbiBjb2RlcyIgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlcnN0YW5kIHdoYXQgZWFjaCBvZiB0aGVzZSBmaXZlIEh1ZmZtYW4gY29kZXMgYXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgZm9yLgorPGh1ZmZtYW4gY29kZT4gOjo9IDxzaW1wbGUgaHVmZm1hbiBjb2RlPiB8IDxub3JtYWwgaHVmZm1hbiBjb2RlPgorPHNpbXBsZSBodWZmbWFuIGNvZGU+IDo6PSBzZWUgIlNpbXBsZSBjb2RlIGxlbmd0aCBjb2RlIiBmb3IgZGV0YWlscworPG5vcm1hbCBodWZmbWFuIGNvZGU+IDo6PSA8Y29kZSBsZW5ndGggY29kZT47IGVuY29kZWQgY29kZSBsZW5ndGhzCis8Y29kZSBsZW5ndGggY29kZT4gOjo9IHNlZSBzZWN0aW9uICJOb3JtYWwgY29kZSBsZW5ndGggY29kZSIKKzxsejc3LWNvZGVkIGltYWdlPiA6Oj0gKCg8YXJnYi1waXhlbD4gfCA8bHo3Ny1jb3B5PiB8IDxjb2xvci1jYWNoZS1jb2RlPikKKyAgICAgICAgICAgICAgICAgICAgICAgPGx6NzctY29kZWQgaW1hZ2U+KSB8ICIiCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworQSBwb3NzaWJsZSBleGFtcGxlIHNlcXVlbmNlOgorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKzxSSUZGIGhlYWRlcj48aW1hZ2Ugc2l6ZT4xLWJpdCB2YWx1ZSAxPHN1YnRyYWN0LWdyZWVuLXR4PgorMS1iaXQgdmFsdWUgMTxwcmVkaWN0b3ItdHg+MS1iaXQgdmFsdWUgMDxtZXRhIGh1ZmZtYW4+Cis8Y29sb3IgY2FjaGUgaW5mbz48aHVmZm1hbiBjb2Rlcz4KKzxsejc3LWNvZGVkIGltYWdlPgorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1tjYW5vbmljYWxfaHVmZl06IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ2Fub25pY2FsX0h1ZmZtYW5fY29kZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL2NwdS5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL2NwdS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzk5MDFlLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RzcC9jcHUuYworKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBDUFUgZGV0ZWN0aW9uCi0vLwotLy8gQXV0aG9yOiBDaHJpc3RpYW4gRHV2aXZpZXIgKGNkdXZpdmllckBnb29nbGUuY29tKQotCi0jaW5jbHVkZSAiLi9kc3AuaCIKLQotI2lmIGRlZmluZWQoX19BTkRST0lEX18pCi0jaW5jbHVkZSA8Y3B1LWZlYXR1cmVzLmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBTU0UyIGRldGVjdGlvbi4KLS8vCi0KLS8vIGFwcGxlL2RhcndpbiBnY2MtNC4wLjEgZGVmaW5lcyBfX1BJQ19fLCBidXQgbm90IF9fcGljX18gd2l0aCAtZlBJQy4KLSNpZiAoZGVmaW5lZChfX3BpY19fKSB8fCBkZWZpbmVkKF9fUElDX18pKSAmJiBkZWZpbmVkKF9faTM4Nl9fKQotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgR2V0Q1BVSW5mbyhpbnQgY3B1X2luZm9bNF0sIGludCBpbmZvX3R5cGUpIHsKLSAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgIm1vdiAlJWVieCwgJSVlZGlcbiIKLSAgICAiY3B1aWRcbiIKLSAgICAieGNoZyAlJWVkaSwgJSVlYnhcbiIKLSAgICA6ICI9YSIoY3B1X2luZm9bMF0pLCAiPUQiKGNwdV9pbmZvWzFdKSwgIj1jIihjcHVfaW5mb1syXSksICI9ZCIoY3B1X2luZm9bM10pCi0gICAgOiAiYSIoaW5mb190eXBlKSk7Ci19Ci0jZWxpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCi1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBHZXRDUFVJbmZvKGludCBjcHVfaW5mb1s0XSwgaW50IGluZm9fdHlwZSkgewotICBfX2FzbV9fIHZvbGF0aWxlICgKLSAgICAiY3B1aWRcbiIKLSAgICA6ICI9YSIoY3B1X2luZm9bMF0pLCAiPWIiKGNwdV9pbmZvWzFdKSwgIj1jIihjcHVfaW5mb1syXSksICI9ZCIoY3B1X2luZm9bM10pCi0gICAgOiAiYSIoaW5mb190eXBlKSk7Ci19Ci0jZWxpZiBkZWZpbmVkKFdFQlBfTVNDX1NTRTIpCi0jZGVmaW5lIEdldENQVUluZm8gX19jcHVpZAotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pIHx8IGRlZmluZWQoV0VCUF9NU0NfU1NFMikKLXN0YXRpYyBpbnQgeDg2Q1BVSW5mbyhDUFVGZWF0dXJlIGZlYXR1cmUpIHsKLSAgaW50IGNwdV9pbmZvWzRdOwotICBHZXRDUFVJbmZvKGNwdV9pbmZvLCAxKTsKLSAgaWYgKGZlYXR1cmUgPT0ga1NTRTIpIHsKLSAgICByZXR1cm4gMCAhPSAoY3B1X2luZm9bM10gJiAweDA0MDAwMDAwKTsKLSAgfQotICBpZiAoZmVhdHVyZSA9PSBrU1NFMykgewotICAgIHJldHVybiAwICE9IChjcHVfaW5mb1syXSAmIDB4MDAwMDAwMDEpOwotICB9Ci0gIHJldHVybiAwOwotfQotVlA4Q1BVSW5mbyBWUDhHZXRDUFVJbmZvID0geDg2Q1BVSW5mbzsKLSNlbGlmIGRlZmluZWQoV0VCUF9BTkRST0lEX05FT04pCi1zdGF0aWMgaW50IEFuZHJvaWRDUFVJbmZvKENQVUZlYXR1cmUgZmVhdHVyZSkgewotICBjb25zdCBBbmRyb2lkQ3B1RmFtaWx5IGNwdV9mYW1pbHkgPSBhbmRyb2lkX2dldENwdUZhbWlseSgpOwotICBjb25zdCB1aW50NjRfdCBjcHVfZmVhdHVyZXMgPSBhbmRyb2lkX2dldENwdUZlYXR1cmVzKCk7Ci0gIGlmIChmZWF0dXJlID09IGtORU9OKSB7Ci0gICAgcmV0dXJuIChjcHVfZmFtaWx5ID09IEFORFJPSURfQ1BVX0ZBTUlMWV9BUk0gJiYKLSAgICAgICAgICAgIDAgIT0gKGNwdV9mZWF0dXJlcyAmIEFORFJPSURfQ1BVX0FSTV9GRUFUVVJFX05FT04pKTsKLSAgfQotICByZXR1cm4gMDsKLX0KLVZQOENQVUluZm8gVlA4R2V0Q1BVSW5mbyA9IEFuZHJvaWRDUFVJbmZvOwotI2VsaWYgZGVmaW5lZChfX0FSTV9ORU9OX18pCi0vLyBkZWZpbmUgYSBkdW1teSBmdW5jdGlvbiB0byBlbmFibGUgdHVybmluZyBvZmYgTkVPTiBhdCBydW50aW1lIGJ5IHNldHRpbmcKLS8vIFZQOERlY0dldENQVUluZm8gPSBOVUxMCi1zdGF0aWMgaW50IGFybUNQVUluZm8oQ1BVRmVhdHVyZSBmZWF0dXJlKSB7Ci0gICh2b2lkKWZlYXR1cmU7Ci0gIHJldHVybiAxOwotfQotVlA4Q1BVSW5mbyBWUDhHZXRDUFVJbmZvID0gYXJtQ1BVSW5mbzsKLSNlbHNlCi1WUDhDUFVJbmZvIFZQOEdldENQVUluZm8gPSBOVUxMOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL2RlYy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL2RlYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTMyZWUzLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RzcC9kZWMuYworKysgL2Rldi9udWxsCkBAIC0xLDc0MyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gU3BlZWQtY3JpdGljYWwgZGVjb2RpbmcgZnVuY3Rpb25zLgotLy8KLS8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCi0KLSNpbmNsdWRlICIuL2RzcC5oIgotI2luY2x1ZGUgIi4uL2RlYy92cDhpLmgiCi0KLSNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBydW4tdGltZSB0YWJsZXMgKH40aykKLQotc3RhdGljIHVpbnQ4X3QgYWJzMFsyNTUgKyAyNTUgKyAxXTsgICAgIC8vIGFicyhpKQotc3RhdGljIHVpbnQ4X3QgYWJzMVsyNTUgKyAyNTUgKyAxXTsgICAgIC8vIGFicyhpKT4+MQotc3RhdGljIGludDhfdCBzY2xpcDFbMTAyMCArIDEwMjAgKyAxXTsgIC8vIGNsaXBzIFstMTAyMCwgMTAyMF0gdG8gWy0xMjgsIDEyN10KLXN0YXRpYyBpbnQ4X3Qgc2NsaXAyWzExMiArIDExMiArIDFdOyAgICAvLyBjbGlwcyBbLTExMiwgMTEyXSB0byBbLTE2LCAxNV0KLXN0YXRpYyB1aW50OF90IGNsaXAxWzI1NSArIDUxMCArIDFdOyAgICAvLyBjbGlwcyBbLTI1NSw1MTBdIHRvIFswLDI1NV0KLQotLy8gV2UgZGVjbGFyZSB0aGlzIHZhcmlhYmxlICd2b2xhdGlsZScgdG8gcHJldmVudCBpbnN0cnVjdGlvbiByZW9yZGVyaW5nCi0vLyBhbmQgbWFrZSBzdXJlIGl0J3Mgc2V0IHRvIHRydWUgX2xhc3RfIChzbyBhcyB0byBiZSB0aHJlYWQtc2FmZSkKLXN0YXRpYyB2b2xhdGlsZSBpbnQgdGFibGVzX29rID0gMDsKLQotc3RhdGljIHZvaWQgRHNwSW5pdFRhYmxlcyh2b2lkKSB7Ci0gIGlmICghdGFibGVzX29rKSB7Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gLTI1NTsgaSA8PSAyNTU7ICsraSkgewotICAgICAgYWJzMFsyNTUgKyBpXSA9IChpIDwgMCkgPyAtaSA6IGk7Ci0gICAgICBhYnMxWzI1NSArIGldID0gYWJzMFsyNTUgKyBpXSA+PiAxOwotICAgIH0KLSAgICBmb3IgKGkgPSAtMTAyMDsgaSA8PSAxMDIwOyArK2kpIHsKLSAgICAgIHNjbGlwMVsxMDIwICsgaV0gPSAoaSA8IC0xMjgpID8gLTEyOCA6IChpID4gMTI3KSA/IDEyNyA6IGk7Ci0gICAgfQotICAgIGZvciAoaSA9IC0xMTI7IGkgPD0gMTEyOyArK2kpIHsKLSAgICAgIHNjbGlwMlsxMTIgKyBpXSA9IChpIDwgLTE2KSA/IC0xNiA6IChpID4gMTUpID8gMTUgOiBpOwotICAgIH0KLSAgICBmb3IgKGkgPSAtMjU1OyBpIDw9IDI1NSArIDI1NTsgKytpKSB7Ci0gICAgICBjbGlwMVsyNTUgKyBpXSA9IChpIDwgMCkgPyAwIDogKGkgPiAyNTUpID8gMjU1IDogaTsKLSAgICB9Ci0gICAgdGFibGVzX29rID0gMTsKLSAgfQotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDhfdCBjbGlwXzhiKGludCB2KSB7Ci0gIHJldHVybiAoISh2ICYgfjB4ZmYpKSA/IHYgOiAodiA8IDApID8gMCA6IDI1NTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFRyYW5zZm9ybXMgKFBhcmFncmFwaCAxNC40KQotCi0jZGVmaW5lIFNUT1JFKHgsIHksIHYpIFwKLSAgZHN0W3ggKyB5ICogQlBTXSA9IGNsaXBfOGIoZHN0W3ggKyB5ICogQlBTXSArICgodikgPj4gMykpCi0KLXN0YXRpYyBjb25zdCBpbnQga0MxID0gMjAwOTEgKyAoMSA8PCAxNik7Ci1zdGF0aWMgY29uc3QgaW50IGtDMiA9IDM1NDY4OwotI2RlZmluZSBNVUwoYSwgYikgKCgoYSkgKiAoYikpID4+IDE2KQotCi1zdGF0aWMgdm9pZCBUcmFuc2Zvcm1PbmUoY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCkgewotICBpbnQgQ1s0ICogNF0sICp0bXA7Ci0gIGludCBpOwotICB0bXAgPSBDOwotICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7ICAgIC8vIHZlcnRpY2FsIHBhc3MKLSAgICBjb25zdCBpbnQgYSA9IGluWzBdICsgaW5bOF07ICAgIC8vIFstNDA5NiwgNDA5NF0KLSAgICBjb25zdCBpbnQgYiA9IGluWzBdIC0gaW5bOF07ICAgIC8vIFstNDA5NSwgNDA5NV0KLSAgICBjb25zdCBpbnQgYyA9IE1VTChpbls0XSwga0MyKSAtIE1VTChpblsxMl0sIGtDMSk7ICAgLy8gWy0zNzgzLCAzNzgzXQotICAgIGNvbnN0IGludCBkID0gTVVMKGluWzRdLCBrQzEpICsgTVVMKGluWzEyXSwga0MyKTsgICAvLyBbLTM3ODUsIDM3ODFdCi0gICAgdG1wWzBdID0gYSArIGQ7ICAgLy8gWy03ODgxLCA3ODc1XQotICAgIHRtcFsxXSA9IGIgKyBjOyAgIC8vIFstNzg3OCwgNzg3OF0KLSAgICB0bXBbMl0gPSBiIC0gYzsgICAvLyBbLTc4NzgsIDc4NzhdCi0gICAgdG1wWzNdID0gYSAtIGQ7ICAgLy8gWy03ODc3LCA3ODc5XQotICAgIHRtcCArPSA0OwotICAgIGluKys7Ci0gIH0KLSAgLy8gRWFjaCBwYXNzIGlzIGV4cGFuZGluZyB0aGUgZHluYW1pYyByYW5nZSBieSB+My44NSAodXBwZXIgYm91bmQpLgotICAvLyBUaGUgZXhhY3QgdmFsdWUgaXMgKDIuICsgKGtDMSArIGtDMikgLyA2NTUzNikuCi0gIC8vIEFmdGVyIHRoZSBzZWNvbmQgcGFzcywgbWF4aW11bSBpbnRlcnZhbCBpcyBbLTM3OTQsIDM3OTRdLCBhc3N1bWluZwotICAvLyBhbiBpbnB1dCBpbiBbLTIwNDgsIDIwNDddIGludGVydmFsLiBXZSB0aGVuIG5lZWQgdG8gYWRkIGEgZHN0IHZhbHVlCi0gIC8vIGluIHRoZSBbMCwgMjU1XSByYW5nZS4KLSAgLy8gSW4gdGhlIHdvcnN0IGNhc2Ugc2NlbmFyaW8sIHRoZSBpbnB1dCB0byBjbGlwXzhiKCkgY2FuIGJlIGFzIGxhcmdlIGFzCi0gIC8vIFstNjA3MTMsIDYwOTY4XS4KLSAgdG1wID0gQzsKLSAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeyAgICAvLyBob3Jpem9udGFsIHBhc3MKLSAgICBjb25zdCBpbnQgZGMgPSB0bXBbMF0gKyA0OwotICAgIGNvbnN0IGludCBhID0gIGRjICsgIHRtcFs4XTsKLSAgICBjb25zdCBpbnQgYiA9ICBkYyAtICB0bXBbOF07Ci0gICAgY29uc3QgaW50IGMgPSBNVUwodG1wWzRdLCBrQzIpIC0gTVVMKHRtcFsxMl0sIGtDMSk7Ci0gICAgY29uc3QgaW50IGQgPSBNVUwodG1wWzRdLCBrQzEpICsgTVVMKHRtcFsxMl0sIGtDMik7Ci0gICAgU1RPUkUoMCwgMCwgYSArIGQpOwotICAgIFNUT1JFKDEsIDAsIGIgKyBjKTsKLSAgICBTVE9SRSgyLCAwLCBiIC0gYyk7Ci0gICAgU1RPUkUoMywgMCwgYSAtIGQpOwotICAgIHRtcCsrOwotICAgIGRzdCArPSBCUFM7Ci0gIH0KLX0KLSN1bmRlZiBNVUwKLQotc3RhdGljIHZvaWQgVHJhbnNmb3JtVHdvKGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QsIGludCBkb190d28pIHsKLSAgVHJhbnNmb3JtT25lKGluLCBkc3QpOwotICBpZiAoZG9fdHdvKSB7Ci0gICAgVHJhbnNmb3JtT25lKGluICsgMTYsIGRzdCArIDQpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIFRyYW5zZm9ybVVWKGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QpIHsKLSAgVlA4VHJhbnNmb3JtKGluICsgMCAqIDE2LCBkc3QsIDEpOwotICBWUDhUcmFuc2Zvcm0oaW4gKyAyICogMTYsIGRzdCArIDQgKiBCUFMsIDEpOwotfQotCi1zdGF0aWMgdm9pZCBUcmFuc2Zvcm1EQyhjb25zdCBpbnQxNl90ICppbiwgdWludDhfdCogZHN0KSB7Ci0gIGNvbnN0IGludCBEQyA9IGluWzBdICsgNDsKLSAgaW50IGksIGo7Ci0gIGZvciAoaiA9IDA7IGogPCA0OyArK2opIHsKLSAgICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7Ci0gICAgICBTVE9SRShpLCBqLCBEQyk7Ci0gICAgfQotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIFRyYW5zZm9ybURDVVYoY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCkgewotICBpZiAoaW5bMCAqIDE2XSkgVHJhbnNmb3JtREMoaW4gKyAwICogMTYsIGRzdCk7Ci0gIGlmIChpblsxICogMTZdKSBUcmFuc2Zvcm1EQyhpbiArIDEgKiAxNiwgZHN0ICsgNCk7Ci0gIGlmIChpblsyICogMTZdKSBUcmFuc2Zvcm1EQyhpbiArIDIgKiAxNiwgZHN0ICsgNCAqIEJQUyk7Ci0gIGlmIChpblszICogMTZdKSBUcmFuc2Zvcm1EQyhpbiArIDMgKiAxNiwgZHN0ICsgNCAqIEJQUyArIDQpOwotfQotCi0jdW5kZWYgU1RPUkUKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFBhcmFncmFwaCAxNC4zCi0KLXN0YXRpYyB2b2lkIFRyYW5zZm9ybVdIVChjb25zdCBpbnQxNl90KiBpbiwgaW50MTZfdCogb3V0KSB7Ci0gIGludCB0bXBbMTZdOwotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgewotICAgIGNvbnN0IGludCBhMCA9IGluWzAgKyBpXSArIGluWzEyICsgaV07Ci0gICAgY29uc3QgaW50IGExID0gaW5bNCArIGldICsgaW5bIDggKyBpXTsKLSAgICBjb25zdCBpbnQgYTIgPSBpbls0ICsgaV0gLSBpblsgOCArIGldOwotICAgIGNvbnN0IGludCBhMyA9IGluWzAgKyBpXSAtIGluWzEyICsgaV07Ci0gICAgdG1wWzAgICsgaV0gPSBhMCArIGExOwotICAgIHRtcFs4ICArIGldID0gYTAgLSBhMTsKLSAgICB0bXBbNCAgKyBpXSA9IGEzICsgYTI7Ci0gICAgdG1wWzEyICsgaV0gPSBhMyAtIGEyOwotICB9Ci0gIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKLSAgICBjb25zdCBpbnQgZGMgPSB0bXBbMCArIGkgKiA0XSArIDM7ICAgIC8vIHcvIHJvdW5kZXIKLSAgICBjb25zdCBpbnQgYTAgPSBkYyAgICAgICAgICAgICArIHRtcFszICsgaSAqIDRdOwotICAgIGNvbnN0IGludCBhMSA9IHRtcFsxICsgaSAqIDRdICsgdG1wWzIgKyBpICogNF07Ci0gICAgY29uc3QgaW50IGEyID0gdG1wWzEgKyBpICogNF0gLSB0bXBbMiArIGkgKiA0XTsKLSAgICBjb25zdCBpbnQgYTMgPSBkYyAgICAgICAgICAgICAtIHRtcFszICsgaSAqIDRdOwotICAgIG91dFsgMF0gPSAoYTAgKyBhMSkgPj4gMzsKLSAgICBvdXRbMTZdID0gKGEzICsgYTIpID4+IDM7Ci0gICAgb3V0WzMyXSA9IChhMCAtIGExKSA+PiAzOwotICAgIG91dFs0OF0gPSAoYTMgLSBhMikgPj4gMzsKLSAgICBvdXQgKz0gNjQ7Ci0gIH0KLX0KLQotdm9pZCAoKlZQOFRyYW5zZm9ybVdIVCkoY29uc3QgaW50MTZfdCogaW4sIGludDE2X3QqIG91dCkgPSBUcmFuc2Zvcm1XSFQ7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBJbnRyYSBwcmVkaWN0aW9ucwotCi0jZGVmaW5lIERTVCh4LCB5KSBkc3RbKHgpICsgKHkpICogQlBTXQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBUcnVlTW90aW9uKHVpbnQ4X3QgKmRzdCwgaW50IHNpemUpIHsKLSAgY29uc3QgdWludDhfdCogdG9wID0gZHN0IC0gQlBTOwotICBjb25zdCB1aW50OF90KiBjb25zdCBjbGlwMCA9IGNsaXAxICsgMjU1IC0gdG9wWy0xXTsKLSAgaW50IHk7Ci0gIGZvciAoeSA9IDA7IHkgPCBzaXplOyArK3kpIHsKLSAgICBjb25zdCB1aW50OF90KiBjb25zdCBjbGlwID0gY2xpcDAgKyBkc3RbLTFdOwotICAgIGludCB4OwotICAgIGZvciAoeCA9IDA7IHggPCBzaXplOyArK3gpIHsKLSAgICAgIGRzdFt4XSA9IGNsaXBbdG9wW3hdXTsKLSAgICB9Ci0gICAgZHN0ICs9IEJQUzsKLSAgfQotfQotc3RhdGljIHZvaWQgVE00KHVpbnQ4X3QgKmRzdCkgICB7IFRydWVNb3Rpb24oZHN0LCA0KTsgfQotc3RhdGljIHZvaWQgVE04dXYodWludDhfdCAqZHN0KSB7IFRydWVNb3Rpb24oZHN0LCA4KTsgfQotc3RhdGljIHZvaWQgVE0xNih1aW50OF90ICpkc3QpICB7IFRydWVNb3Rpb24oZHN0LCAxNik7IH0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIDE2eDE2Ci0KLXN0YXRpYyB2b2lkIFZFMTYodWludDhfdCAqZHN0KSB7ICAgICAvLyB2ZXJ0aWNhbAotICBpbnQgajsKLSAgZm9yIChqID0gMDsgaiA8IDE2OyArK2opIHsKLSAgICBTYk1lbW9yeUNvcHkoZHN0ICsgaiAqIEJQUywgZHN0IC0gQlBTLCAxNik7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgSEUxNih1aW50OF90ICpkc3QpIHsgICAgIC8vIGhvcml6b250YWwKLSAgaW50IGo7Ci0gIGZvciAoaiA9IDE2OyBqID4gMDsgLS1qKSB7Ci0gICAgU2JNZW1vcnlTZXQoZHN0LCBkc3RbLTFdLCAxNik7Ci0gICAgZHN0ICs9IEJQUzsKLSAgfQotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBQdXQxNihpbnQgdiwgdWludDhfdCogZHN0KSB7Ci0gIGludCBqOwotICBmb3IgKGogPSAwOyBqIDwgMTY7ICsraikgewotICAgIFNiTWVtb3J5U2V0KGRzdCArIGogKiBCUFMsIHYsIDE2KTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBEQzE2KHVpbnQ4X3QgKmRzdCkgeyAgICAvLyBEQwotICBpbnQgREMgPSAxNjsKLSAgaW50IGo7Ci0gIGZvciAoaiA9IDA7IGogPCAxNjsgKytqKSB7Ci0gICAgREMgKz0gZHN0Wy0xICsgaiAqIEJQU10gKyBkc3RbaiAtIEJQU107Ci0gIH0KLSAgUHV0MTYoREMgPj4gNSwgZHN0KTsKLX0KLQotc3RhdGljIHZvaWQgREMxNk5vVG9wKHVpbnQ4X3QgKmRzdCkgeyAgIC8vIERDIHdpdGggdG9wIHNhbXBsZXMgbm90IGF2YWlsYWJsZQotICBpbnQgREMgPSA4OwotICBpbnQgajsKLSAgZm9yIChqID0gMDsgaiA8IDE2OyArK2opIHsKLSAgICBEQyArPSBkc3RbLTEgKyBqICogQlBTXTsKLSAgfQotICBQdXQxNihEQyA+PiA0LCBkc3QpOwotfQotCi1zdGF0aWMgdm9pZCBEQzE2Tm9MZWZ0KHVpbnQ4X3QgKmRzdCkgeyAgLy8gREMgd2l0aCBsZWZ0IHNhbXBsZXMgbm90IGF2YWlsYWJsZQotICBpbnQgREMgPSA4OwotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIHsKLSAgICBEQyArPSBkc3RbaSAtIEJQU107Ci0gIH0KLSAgUHV0MTYoREMgPj4gNCwgZHN0KTsKLX0KLQotc3RhdGljIHZvaWQgREMxNk5vVG9wTGVmdCh1aW50OF90ICpkc3QpIHsgIC8vIERDIHdpdGggbm8gdG9wIGFuZCBsZWZ0IHNhbXBsZXMKLSAgUHV0MTYoMHg4MCwgZHN0KTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIDR4NAotCi0jZGVmaW5lIEFWRzMoYSwgYiwgYykgKCgoYSkgKyAyICogKGIpICsgKGMpICsgMikgPj4gMikKLSNkZWZpbmUgQVZHMihhLCBiKSAoKChhKSArIChiKSArIDEpID4+IDEpCi0KLXN0YXRpYyB2b2lkIFZFNCh1aW50OF90ICpkc3QpIHsgICAgLy8gdmVydGljYWwKLSAgY29uc3QgdWludDhfdCogdG9wID0gZHN0IC0gQlBTOwotICBjb25zdCB1aW50OF90IHZhbHNbNF0gPSB7Ci0gICAgQVZHMyh0b3BbLTFdLCB0b3BbMF0sIHRvcFsxXSksCi0gICAgQVZHMyh0b3BbIDBdLCB0b3BbMV0sIHRvcFsyXSksCi0gICAgQVZHMyh0b3BbIDFdLCB0b3BbMl0sIHRvcFszXSksCi0gICAgQVZHMyh0b3BbIDJdLCB0b3BbM10sIHRvcFs0XSkKLSAgfTsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKLSAgICBTYk1lbW9yeUNvcHkoZHN0ICsgaSAqIEJQUywgdmFscywgc2l6ZW9mKHZhbHMpKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBIRTQodWludDhfdCAqZHN0KSB7ICAgIC8vIGhvcml6b250YWwKLSAgY29uc3QgaW50IEEgPSBkc3RbLTEgLSBCUFNdOwotICBjb25zdCBpbnQgQiA9IGRzdFstMV07Ci0gIGNvbnN0IGludCBDID0gZHN0Wy0xICsgQlBTXTsKLSAgY29uc3QgaW50IEQgPSBkc3RbLTEgKyAyICogQlBTXTsKLSAgY29uc3QgaW50IEUgPSBkc3RbLTEgKyAzICogQlBTXTsKLSAgKih1aW50MzJfdCopKGRzdCArIDAgKiBCUFMpID0gMHgwMTAxMDEwMVUgKiBBVkczKEEsIEIsIEMpOwotICAqKHVpbnQzMl90KikoZHN0ICsgMSAqIEJQUykgPSAweDAxMDEwMTAxVSAqIEFWRzMoQiwgQywgRCk7Ci0gICoodWludDMyX3QqKShkc3QgKyAyICogQlBTKSA9IDB4MDEwMTAxMDFVICogQVZHMyhDLCBELCBFKTsKLSAgKih1aW50MzJfdCopKGRzdCArIDMgKiBCUFMpID0gMHgwMTAxMDEwMVUgKiBBVkczKEQsIEUsIEUpOwotfQotCi1zdGF0aWMgdm9pZCBEQzQodWludDhfdCAqZHN0KSB7ICAgLy8gREMKLSAgdWludDMyX3QgZGMgPSA0OwotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgZGMgKz0gZHN0W2kgLSBCUFNdICsgZHN0Wy0xICsgaSAqIEJQU107Ci0gIGRjID4+PSAzOwotICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSBTYk1lbW9yeVNldChkc3QgKyBpICogQlBTLCBkYywgNCk7Ci19Ci0KLXN0YXRpYyB2b2lkIFJENCh1aW50OF90ICpkc3QpIHsgICAvLyBEb3duLXJpZ2h0Ci0gIGNvbnN0IGludCBJID0gZHN0Wy0xICsgMCAqIEJQU107Ci0gIGNvbnN0IGludCBKID0gZHN0Wy0xICsgMSAqIEJQU107Ci0gIGNvbnN0IGludCBLID0gZHN0Wy0xICsgMiAqIEJQU107Ci0gIGNvbnN0IGludCBMID0gZHN0Wy0xICsgMyAqIEJQU107Ci0gIGNvbnN0IGludCBYID0gZHN0Wy0xIC0gQlBTXTsKLSAgY29uc3QgaW50IEEgPSBkc3RbMCAtIEJQU107Ci0gIGNvbnN0IGludCBCID0gZHN0WzEgLSBCUFNdOwotICBjb25zdCBpbnQgQyA9IGRzdFsyIC0gQlBTXTsKLSAgY29uc3QgaW50IEQgPSBkc3RbMyAtIEJQU107Ci0gIERTVCgwLCAzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEFWRzMoSiwgSywgTCk7Ci0gIERTVCgwLCAyKSA9IERTVCgxLCAzKSAgICAgICAgICAgICAgICAgICAgICAgICA9IEFWRzMoSSwgSiwgSyk7Ci0gIERTVCgwLCAxKSA9IERTVCgxLCAyKSA9IERTVCgyLCAzKSAgICAgICAgICAgICA9IEFWRzMoWCwgSSwgSik7Ci0gIERTVCgwLCAwKSA9IERTVCgxLCAxKSA9IERTVCgyLCAyKSA9IERTVCgzLCAzKSA9IEFWRzMoQSwgWCwgSSk7Ci0gIERTVCgxLCAwKSA9IERTVCgyLCAxKSA9IERTVCgzLCAyKSAgICAgICAgICAgICA9IEFWRzMoQiwgQSwgWCk7Ci0gIERTVCgyLCAwKSA9IERTVCgzLCAxKSAgICAgICAgICAgICAgICAgICAgICAgICA9IEFWRzMoQywgQiwgQSk7Ci0gIERTVCgzLCAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEFWRzMoRCwgQywgQik7Ci19Ci0KLXN0YXRpYyB2b2lkIExENCh1aW50OF90ICpkc3QpIHsgICAvLyBEb3duLUxlZnQKLSAgY29uc3QgaW50IEEgPSBkc3RbMCAtIEJQU107Ci0gIGNvbnN0IGludCBCID0gZHN0WzEgLSBCUFNdOwotICBjb25zdCBpbnQgQyA9IGRzdFsyIC0gQlBTXTsKLSAgY29uc3QgaW50IEQgPSBkc3RbMyAtIEJQU107Ci0gIGNvbnN0IGludCBFID0gZHN0WzQgLSBCUFNdOwotICBjb25zdCBpbnQgRiA9IGRzdFs1IC0gQlBTXTsKLSAgY29uc3QgaW50IEcgPSBkc3RbNiAtIEJQU107Ci0gIGNvbnN0IGludCBIID0gZHN0WzcgLSBCUFNdOwotICBEU1QoMCwgMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBBVkczKEEsIEIsIEMpOwotICBEU1QoMSwgMCkgPSBEU1QoMCwgMSkgICAgICAgICAgICAgICAgICAgICAgICAgPSBBVkczKEIsIEMsIEQpOwotICBEU1QoMiwgMCkgPSBEU1QoMSwgMSkgPSBEU1QoMCwgMikgICAgICAgICAgICAgPSBBVkczKEMsIEQsIEUpOwotICBEU1QoMywgMCkgPSBEU1QoMiwgMSkgPSBEU1QoMSwgMikgPSBEU1QoMCwgMykgPSBBVkczKEQsIEUsIEYpOwotICBEU1QoMywgMSkgPSBEU1QoMiwgMikgPSBEU1QoMSwgMykgICAgICAgICAgICAgPSBBVkczKEUsIEYsIEcpOwotICBEU1QoMywgMikgPSBEU1QoMiwgMykgICAgICAgICAgICAgICAgICAgICAgICAgPSBBVkczKEYsIEcsIEgpOwotICBEU1QoMywgMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBBVkczKEcsIEgsIEgpOwotfQotCi1zdGF0aWMgdm9pZCBWUjQodWludDhfdCAqZHN0KSB7ICAgLy8gVmVydGljYWwtUmlnaHQKLSAgY29uc3QgaW50IEkgPSBkc3RbLTEgKyAwICogQlBTXTsKLSAgY29uc3QgaW50IEogPSBkc3RbLTEgKyAxICogQlBTXTsKLSAgY29uc3QgaW50IEsgPSBkc3RbLTEgKyAyICogQlBTXTsKLSAgY29uc3QgaW50IFggPSBkc3RbLTEgLSBCUFNdOwotICBjb25zdCBpbnQgQSA9IGRzdFswIC0gQlBTXTsKLSAgY29uc3QgaW50IEIgPSBkc3RbMSAtIEJQU107Ci0gIGNvbnN0IGludCBDID0gZHN0WzIgLSBCUFNdOwotICBjb25zdCBpbnQgRCA9IGRzdFszIC0gQlBTXTsKLSAgRFNUKDAsIDApID0gRFNUKDEsIDIpID0gQVZHMihYLCBBKTsKLSAgRFNUKDEsIDApID0gRFNUKDIsIDIpID0gQVZHMihBLCBCKTsKLSAgRFNUKDIsIDApID0gRFNUKDMsIDIpID0gQVZHMihCLCBDKTsKLSAgRFNUKDMsIDApICAgICAgICAgICAgID0gQVZHMihDLCBEKTsKLQotICBEU1QoMCwgMykgPSAgICAgICAgICAgICBBVkczKEssIEosIEkpOwotICBEU1QoMCwgMikgPSAgICAgICAgICAgICBBVkczKEosIEksIFgpOwotICBEU1QoMCwgMSkgPSBEU1QoMSwgMykgPSBBVkczKEksIFgsIEEpOwotICBEU1QoMSwgMSkgPSBEU1QoMiwgMykgPSBBVkczKFgsIEEsIEIpOwotICBEU1QoMiwgMSkgPSBEU1QoMywgMykgPSBBVkczKEEsIEIsIEMpOwotICBEU1QoMywgMSkgPSAgICAgICAgICAgICBBVkczKEIsIEMsIEQpOwotfQotCi1zdGF0aWMgdm9pZCBWTDQodWludDhfdCAqZHN0KSB7ICAgLy8gVmVydGljYWwtTGVmdAotICBjb25zdCBpbnQgQSA9IGRzdFswIC0gQlBTXTsKLSAgY29uc3QgaW50IEIgPSBkc3RbMSAtIEJQU107Ci0gIGNvbnN0IGludCBDID0gZHN0WzIgLSBCUFNdOwotICBjb25zdCBpbnQgRCA9IGRzdFszIC0gQlBTXTsKLSAgY29uc3QgaW50IEUgPSBkc3RbNCAtIEJQU107Ci0gIGNvbnN0IGludCBGID0gZHN0WzUgLSBCUFNdOwotICBjb25zdCBpbnQgRyA9IGRzdFs2IC0gQlBTXTsKLSAgY29uc3QgaW50IEggPSBkc3RbNyAtIEJQU107Ci0gIERTVCgwLCAwKSA9ICAgICAgICAgICAgIEFWRzIoQSwgQik7Ci0gIERTVCgxLCAwKSA9IERTVCgwLCAyKSA9IEFWRzIoQiwgQyk7Ci0gIERTVCgyLCAwKSA9IERTVCgxLCAyKSA9IEFWRzIoQywgRCk7Ci0gIERTVCgzLCAwKSA9IERTVCgyLCAyKSA9IEFWRzIoRCwgRSk7Ci0KLSAgRFNUKDAsIDEpID0gICAgICAgICAgICAgQVZHMyhBLCBCLCBDKTsKLSAgRFNUKDEsIDEpID0gRFNUKDAsIDMpID0gQVZHMyhCLCBDLCBEKTsKLSAgRFNUKDIsIDEpID0gRFNUKDEsIDMpID0gQVZHMyhDLCBELCBFKTsKLSAgRFNUKDMsIDEpID0gRFNUKDIsIDMpID0gQVZHMyhELCBFLCBGKTsKLSAgICAgICAgICAgICAgRFNUKDMsIDIpID0gQVZHMyhFLCBGLCBHKTsKLSAgICAgICAgICAgICAgRFNUKDMsIDMpID0gQVZHMyhGLCBHLCBIKTsKLX0KLQotc3RhdGljIHZvaWQgSFU0KHVpbnQ4X3QgKmRzdCkgeyAgIC8vIEhvcml6b250YWwtVXAKLSAgY29uc3QgaW50IEkgPSBkc3RbLTEgKyAwICogQlBTXTsKLSAgY29uc3QgaW50IEogPSBkc3RbLTEgKyAxICogQlBTXTsKLSAgY29uc3QgaW50IEsgPSBkc3RbLTEgKyAyICogQlBTXTsKLSAgY29uc3QgaW50IEwgPSBkc3RbLTEgKyAzICogQlBTXTsKLSAgRFNUKDAsIDApID0gICAgICAgICAgICAgQVZHMihJLCBKKTsKLSAgRFNUKDIsIDApID0gRFNUKDAsIDEpID0gQVZHMihKLCBLKTsKLSAgRFNUKDIsIDEpID0gRFNUKDAsIDIpID0gQVZHMihLLCBMKTsKLSAgRFNUKDEsIDApID0gICAgICAgICAgICAgQVZHMyhJLCBKLCBLKTsKLSAgRFNUKDMsIDApID0gRFNUKDEsIDEpID0gQVZHMyhKLCBLLCBMKTsKLSAgRFNUKDMsIDEpID0gRFNUKDEsIDIpID0gQVZHMyhLLCBMLCBMKTsKLSAgRFNUKDMsIDIpID0gRFNUKDIsIDIpID0KLSAgICBEU1QoMCwgMykgPSBEU1QoMSwgMykgPSBEU1QoMiwgMykgPSBEU1QoMywgMykgPSBMOwotfQotCi1zdGF0aWMgdm9pZCBIRDQodWludDhfdCAqZHN0KSB7ICAvLyBIb3Jpem9udGFsLURvd24KLSAgY29uc3QgaW50IEkgPSBkc3RbLTEgKyAwICogQlBTXTsKLSAgY29uc3QgaW50IEogPSBkc3RbLTEgKyAxICogQlBTXTsKLSAgY29uc3QgaW50IEsgPSBkc3RbLTEgKyAyICogQlBTXTsKLSAgY29uc3QgaW50IEwgPSBkc3RbLTEgKyAzICogQlBTXTsKLSAgY29uc3QgaW50IFggPSBkc3RbLTEgLSBCUFNdOwotICBjb25zdCBpbnQgQSA9IGRzdFswIC0gQlBTXTsKLSAgY29uc3QgaW50IEIgPSBkc3RbMSAtIEJQU107Ci0gIGNvbnN0IGludCBDID0gZHN0WzIgLSBCUFNdOwotCi0gIERTVCgwLCAwKSA9IERTVCgyLCAxKSA9IEFWRzIoSSwgWCk7Ci0gIERTVCgwLCAxKSA9IERTVCgyLCAyKSA9IEFWRzIoSiwgSSk7Ci0gIERTVCgwLCAyKSA9IERTVCgyLCAzKSA9IEFWRzIoSywgSik7Ci0gIERTVCgwLCAzKSAgICAgICAgICAgICA9IEFWRzIoTCwgSyk7Ci0KLSAgRFNUKDMsIDApICAgICAgICAgICAgID0gQVZHMyhBLCBCLCBDKTsKLSAgRFNUKDIsIDApICAgICAgICAgICAgID0gQVZHMyhYLCBBLCBCKTsKLSAgRFNUKDEsIDApID0gRFNUKDMsIDEpID0gQVZHMyhJLCBYLCBBKTsKLSAgRFNUKDEsIDEpID0gRFNUKDMsIDIpID0gQVZHMyhKLCBJLCBYKTsKLSAgRFNUKDEsIDIpID0gRFNUKDMsIDMpID0gQVZHMyhLLCBKLCBJKTsKLSAgRFNUKDEsIDMpICAgICAgICAgICAgID0gQVZHMyhMLCBLLCBKKTsKLX0KLQotI3VuZGVmIERTVAotI3VuZGVmIEFWRzMKLSN1bmRlZiBBVkcyCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDaHJvbWEKLQotc3RhdGljIHZvaWQgVkU4dXYodWludDhfdCAqZHN0KSB7ICAgIC8vIHZlcnRpY2FsCi0gIGludCBqOwotICBmb3IgKGogPSAwOyBqIDwgODsgKytqKSB7Ci0gICAgU2JNZW1vcnlDb3B5KGRzdCArIGogKiBCUFMsIGRzdCAtIEJQUywgOCk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgSEU4dXYodWludDhfdCAqZHN0KSB7ICAgIC8vIGhvcml6b250YWwKLSAgaW50IGo7Ci0gIGZvciAoaiA9IDA7IGogPCA4OyArK2opIHsKLSAgICBTYk1lbW9yeVNldChkc3QsIGRzdFstMV0sIDgpOwotICAgIGRzdCArPSBCUFM7Ci0gIH0KLX0KLQotLy8gaGVscGVyIGZvciBjaHJvbWEtREMgcHJlZGljdGlvbnMKLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIFB1dDh4OHV2KHVpbnQ4X3QgdmFsdWUsIHVpbnQ4X3QqIGRzdCkgewotICBpbnQgajsKLSNpZm5kZWYgV0VCUF9SRUZFUkVOQ0VfSU1QTEVNRU5UQVRJT04KLSAgY29uc3QgdWludDY0X3QgdiA9ICh1aW50NjRfdCl2YWx1ZSAqIDB4MDEwMTAxMDEwMTAxMDEwMVVMTDsKLSAgZm9yIChqID0gMDsgaiA8IDg7ICsraikgewotICAgICoodWludDY0X3QqKShkc3QgKyBqICogQlBTKSA9IHY7Ci0gIH0KLSNlbHNlCi0gIGZvciAoaiA9IDA7IGogPCA4OyArK2opIFNiTWVtb3J5U2V0KGRzdCArIGogKiBCUFMsIHZhbHVlLCA4KTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZCBEQzh1dih1aW50OF90ICpkc3QpIHsgICAgIC8vIERDCi0gIGludCBkYzAgPSA4OwotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IDg7ICsraSkgewotICAgIGRjMCArPSBkc3RbaSAtIEJQU10gKyBkc3RbLTEgKyBpICogQlBTXTsKLSAgfQotICBQdXQ4eDh1dihkYzAgPj4gNCwgZHN0KTsKLX0KLQotc3RhdGljIHZvaWQgREM4dXZOb0xlZnQodWludDhfdCAqZHN0KSB7ICAgLy8gREMgd2l0aCBubyBsZWZ0IHNhbXBsZXMKLSAgaW50IGRjMCA9IDQ7Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgODsgKytpKSB7Ci0gICAgZGMwICs9IGRzdFtpIC0gQlBTXTsKLSAgfQotICBQdXQ4eDh1dihkYzAgPj4gMywgZHN0KTsKLX0KLQotc3RhdGljIHZvaWQgREM4dXZOb1RvcCh1aW50OF90ICpkc3QpIHsgIC8vIERDIHdpdGggbm8gdG9wIHNhbXBsZXMKLSAgaW50IGRjMCA9IDQ7Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgODsgKytpKSB7Ci0gICAgZGMwICs9IGRzdFstMSArIGkgKiBCUFNdOwotICB9Ci0gIFB1dDh4OHV2KGRjMCA+PiAzLCBkc3QpOwotfQotCi1zdGF0aWMgdm9pZCBEQzh1dk5vVG9wTGVmdCh1aW50OF90ICpkc3QpIHsgICAgLy8gREMgd2l0aCBub3RoaW5nCi0gIFB1dDh4OHV2KDB4ODAsIGRzdCk7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBkZWZhdWx0IEMgaW1wbGVtZW50YXRpb25zCi0KLWNvbnN0IFZQOFByZWRGdW5jIFZQOFByZWRMdW1hNFtOVU1fQk1PREVTXSA9IHsKLSAgREM0LCBUTTQsIFZFNCwgSEU0LCBSRDQsIFZSNCwgTEQ0LCBWTDQsIEhENCwgSFU0Ci19OwotCi1jb25zdCBWUDhQcmVkRnVuYyBWUDhQcmVkTHVtYTE2W05VTV9CX0RDX01PREVTXSA9IHsKLSAgREMxNiwgVE0xNiwgVkUxNiwgSEUxNiwKLSAgREMxNk5vVG9wLCBEQzE2Tm9MZWZ0LCBEQzE2Tm9Ub3BMZWZ0Ci19OwotCi1jb25zdCBWUDhQcmVkRnVuYyBWUDhQcmVkQ2hyb21hOFtOVU1fQl9EQ19NT0RFU10gPSB7Ci0gIERDOHV2LCBUTTh1diwgVkU4dXYsIEhFOHV2LAotICBEQzh1dk5vVG9wLCBEQzh1dk5vTGVmdCwgREM4dXZOb1RvcExlZnQKLX07Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBFZGdlIGZpbHRlcmluZyBmdW5jdGlvbnMKLQotLy8gNCBwaXhlbHMgaW4sIDIgcGl4ZWxzIG91dAotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgZG9fZmlsdGVyMih1aW50OF90KiBwLCBpbnQgc3RlcCkgewotICBjb25zdCBpbnQgcDEgPSBwWy0yKnN0ZXBdLCBwMCA9IHBbLXN0ZXBdLCBxMCA9IHBbMF0sIHExID0gcFtzdGVwXTsKLSAgY29uc3QgaW50IGEgPSAzICogKHEwIC0gcDApICsgc2NsaXAxWzEwMjAgKyBwMSAtIHExXTsKLSAgY29uc3QgaW50IGExID0gc2NsaXAyWzExMiArICgoYSArIDQpID4+IDMpXTsKLSAgY29uc3QgaW50IGEyID0gc2NsaXAyWzExMiArICgoYSArIDMpID4+IDMpXTsKLSAgcFstc3RlcF0gPSBjbGlwMVsyNTUgKyBwMCArIGEyXTsKLSAgcFsgICAgMF0gPSBjbGlwMVsyNTUgKyBxMCAtIGExXTsKLX0KLQotLy8gNCBwaXhlbHMgaW4sIDQgcGl4ZWxzIG91dAotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgZG9fZmlsdGVyNCh1aW50OF90KiBwLCBpbnQgc3RlcCkgewotICBjb25zdCBpbnQgcDEgPSBwWy0yKnN0ZXBdLCBwMCA9IHBbLXN0ZXBdLCBxMCA9IHBbMF0sIHExID0gcFtzdGVwXTsKLSAgY29uc3QgaW50IGEgPSAzICogKHEwIC0gcDApOwotICBjb25zdCBpbnQgYTEgPSBzY2xpcDJbMTEyICsgKChhICsgNCkgPj4gMyldOwotICBjb25zdCBpbnQgYTIgPSBzY2xpcDJbMTEyICsgKChhICsgMykgPj4gMyldOwotICBjb25zdCBpbnQgYTMgPSAoYTEgKyAxKSA+PiAxOwotICBwWy0yKnN0ZXBdID0gY2xpcDFbMjU1ICsgcDEgKyBhM107Ci0gIHBbLSAgc3RlcF0gPSBjbGlwMVsyNTUgKyBwMCArIGEyXTsKLSAgcFsgICAgICAwXSA9IGNsaXAxWzI1NSArIHEwIC0gYTFdOwotICBwWyAgIHN0ZXBdID0gY2xpcDFbMjU1ICsgcTEgLSBhM107Ci19Ci0KLS8vIDYgcGl4ZWxzIGluLCA2IHBpeGVscyBvdXQKLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIGRvX2ZpbHRlcjYodWludDhfdCogcCwgaW50IHN0ZXApIHsKLSAgY29uc3QgaW50IHAyID0gcFstMypzdGVwXSwgcDEgPSBwWy0yKnN0ZXBdLCBwMCA9IHBbLXN0ZXBdOwotICBjb25zdCBpbnQgcTAgPSBwWzBdLCBxMSA9IHBbc3RlcF0sIHEyID0gcFsyKnN0ZXBdOwotICBjb25zdCBpbnQgYSA9IHNjbGlwMVsxMDIwICsgMyAqIChxMCAtIHAwKSArIHNjbGlwMVsxMDIwICsgcDEgLSBxMV1dOwotICBjb25zdCBpbnQgYTEgPSAoMjcgKiBhICsgNjMpID4+IDc7ICAvLyBlcS4gdG8gKCgzICogYSArIDcpICogOSkgPj4gNwotICBjb25zdCBpbnQgYTIgPSAoMTggKiBhICsgNjMpID4+IDc7ICAvLyBlcS4gdG8gKCgyICogYSArIDcpICogOSkgPj4gNwotICBjb25zdCBpbnQgYTMgPSAoOSAgKiBhICsgNjMpID4+IDc7ICAvLyBlcS4gdG8gKCgxICogYSArIDcpICogOSkgPj4gNwotICBwWy0zKnN0ZXBdID0gY2xpcDFbMjU1ICsgcDIgKyBhM107Ci0gIHBbLTIqc3RlcF0gPSBjbGlwMVsyNTUgKyBwMSArIGEyXTsKLSAgcFstICBzdGVwXSA9IGNsaXAxWzI1NSArIHAwICsgYTFdOwotICBwWyAgICAgIDBdID0gY2xpcDFbMjU1ICsgcTAgLSBhMV07Ci0gIHBbICAgc3RlcF0gPSBjbGlwMVsyNTUgKyBxMSAtIGEyXTsKLSAgcFsgMipzdGVwXSA9IGNsaXAxWzI1NSArIHEyIC0gYTNdOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IGhldihjb25zdCB1aW50OF90KiBwLCBpbnQgc3RlcCwgaW50IHRocmVzaCkgewotICBjb25zdCBpbnQgcDEgPSBwWy0yKnN0ZXBdLCBwMCA9IHBbLXN0ZXBdLCBxMCA9IHBbMF0sIHExID0gcFtzdGVwXTsKLSAgcmV0dXJuIChhYnMwWzI1NSArIHAxIC0gcDBdID4gdGhyZXNoKSB8fCAoYWJzMFsyNTUgKyBxMSAtIHEwXSA+IHRocmVzaCk7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgbmVlZHNfZmlsdGVyKGNvbnN0IHVpbnQ4X3QqIHAsIGludCBzdGVwLCBpbnQgdGhyZXNoKSB7Ci0gIGNvbnN0IGludCBwMSA9IHBbLTIqc3RlcF0sIHAwID0gcFstc3RlcF0sIHEwID0gcFswXSwgcTEgPSBwW3N0ZXBdOwotICByZXR1cm4gKDIgKiBhYnMwWzI1NSArIHAwIC0gcTBdICsgYWJzMVsyNTUgKyBwMSAtIHExXSkgPD0gdGhyZXNoOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IG5lZWRzX2ZpbHRlcjIoY29uc3QgdWludDhfdCogcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RlcCwgaW50IHQsIGludCBpdCkgewotICBjb25zdCBpbnQgcDMgPSBwWy00KnN0ZXBdLCBwMiA9IHBbLTMqc3RlcF0sIHAxID0gcFstMipzdGVwXSwgcDAgPSBwWy1zdGVwXTsKLSAgY29uc3QgaW50IHEwID0gcFswXSwgcTEgPSBwW3N0ZXBdLCBxMiA9IHBbMipzdGVwXSwgcTMgPSBwWzMqc3RlcF07Ci0gIGlmICgoMiAqIGFiczBbMjU1ICsgcDAgLSBxMF0gKyBhYnMxWzI1NSArIHAxIC0gcTFdKSA+IHQpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiBhYnMwWzI1NSArIHAzIC0gcDJdIDw9IGl0ICYmIGFiczBbMjU1ICsgcDIgLSBwMV0gPD0gaXQgJiYKLSAgICAgICAgIGFiczBbMjU1ICsgcDEgLSBwMF0gPD0gaXQgJiYgYWJzMFsyNTUgKyBxMyAtIHEyXSA8PSBpdCAmJgotICAgICAgICAgYWJzMFsyNTUgKyBxMiAtIHExXSA8PSBpdCAmJiBhYnMwWzI1NSArIHExIC0gcTBdIDw9IGl0OwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gU2ltcGxlIEluLWxvb3AgZmlsdGVyaW5nIChQYXJhZ3JhcGggMTUuMikKLQotc3RhdGljIHZvaWQgU2ltcGxlVkZpbHRlcjE2KHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsIGludCB0aHJlc2gpIHsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSB7Ci0gICAgaWYgKG5lZWRzX2ZpbHRlcihwICsgaSwgc3RyaWRlLCB0aHJlc2gpKSB7Ci0gICAgICBkb19maWx0ZXIyKHAgKyBpLCBzdHJpZGUpOwotICAgIH0KLSAgfQotfQotCi1zdGF0aWMgdm9pZCBTaW1wbGVIRmlsdGVyMTYodWludDhfdCogcCwgaW50IHN0cmlkZSwgaW50IHRocmVzaCkgewotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIHsKLSAgICBpZiAobmVlZHNfZmlsdGVyKHAgKyBpICogc3RyaWRlLCAxLCB0aHJlc2gpKSB7Ci0gICAgICBkb19maWx0ZXIyKHAgKyBpICogc3RyaWRlLCAxKTsKLSAgICB9Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgU2ltcGxlVkZpbHRlcjE2aSh1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKSB7Ci0gIGludCBrOwotICBmb3IgKGsgPSAzOyBrID4gMDsgLS1rKSB7Ci0gICAgcCArPSA0ICogc3RyaWRlOwotICAgIFNpbXBsZVZGaWx0ZXIxNihwLCBzdHJpZGUsIHRocmVzaCk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgU2ltcGxlSEZpbHRlcjE2aSh1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKSB7Ci0gIGludCBrOwotICBmb3IgKGsgPSAzOyBrID4gMDsgLS1rKSB7Ci0gICAgcCArPSA0OwotICAgIFNpbXBsZUhGaWx0ZXIxNihwLCBzdHJpZGUsIHRocmVzaCk7Ci0gIH0KLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvbXBsZXggSW4tbG9vcCBmaWx0ZXJpbmcgKFBhcmFncmFwaCAxNS4zKQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBGaWx0ZXJMb29wMjYodWludDhfdCogcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaHN0cmlkZSwgaW50IHZzdHJpZGUsIGludCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgewotICB3aGlsZSAoc2l6ZS0tID4gMCkgewotICAgIGlmIChuZWVkc19maWx0ZXIyKHAsIGhzdHJpZGUsIHRocmVzaCwgaXRocmVzaCkpIHsKLSAgICAgIGlmIChoZXYocCwgaHN0cmlkZSwgaGV2X3RocmVzaCkpIHsKLSAgICAgICAgZG9fZmlsdGVyMihwLCBoc3RyaWRlKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGRvX2ZpbHRlcjYocCwgaHN0cmlkZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHAgKz0gdnN0cmlkZTsKLSAgfQotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBGaWx0ZXJMb29wMjQodWludDhfdCogcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaHN0cmlkZSwgaW50IHZzdHJpZGUsIGludCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgewotICB3aGlsZSAoc2l6ZS0tID4gMCkgewotICAgIGlmIChuZWVkc19maWx0ZXIyKHAsIGhzdHJpZGUsIHRocmVzaCwgaXRocmVzaCkpIHsKLSAgICAgIGlmIChoZXYocCwgaHN0cmlkZSwgaGV2X3RocmVzaCkpIHsKLSAgICAgICAgZG9fZmlsdGVyMihwLCBoc3RyaWRlKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGRvX2ZpbHRlcjQocCwgaHN0cmlkZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHAgKz0gdnN0cmlkZTsKLSAgfQotfQotCi0vLyBvbiBtYWNyb2Jsb2NrIGVkZ2VzCi1zdGF0aWMgdm9pZCBWRmlsdGVyMTYodWludDhfdCogcCwgaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKLSAgRmlsdGVyTG9vcDI2KHAsIHN0cmlkZSwgMSwgMTYsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7Ci19Ci0KLXN0YXRpYyB2b2lkIEhGaWx0ZXIxNih1aW50OF90KiBwLCBpbnQgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgewotICBGaWx0ZXJMb29wMjYocCwgMSwgc3RyaWRlLCAxNiwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKLX0KLQotLy8gb24gdGhyZWUgaW5uZXIgZWRnZXMKLXN0YXRpYyB2b2lkIFZGaWx0ZXIxNmkodWludDhfdCogcCwgaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7Ci0gIGludCBrOwotICBmb3IgKGsgPSAzOyBrID4gMDsgLS1rKSB7Ci0gICAgcCArPSA0ICogc3RyaWRlOwotICAgIEZpbHRlckxvb3AyNChwLCBzdHJpZGUsIDEsIDE2LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIEhGaWx0ZXIxNmkodWludDhfdCogcCwgaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7Ci0gIGludCBrOwotICBmb3IgKGsgPSAzOyBrID4gMDsgLS1rKSB7Ci0gICAgcCArPSA0OwotICAgIEZpbHRlckxvb3AyNChwLCAxLCBzdHJpZGUsIDE2LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOwotICB9Ci19Ci0KLS8vIDgtcGl4ZWxzIHdpZGUgdmFyaWFudCwgZm9yIGNocm9tYSBmaWx0ZXJpbmcKLXN0YXRpYyB2b2lkIFZGaWx0ZXI4KHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKLSAgRmlsdGVyTG9vcDI2KHUsIHN0cmlkZSwgMSwgOCwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKLSAgRmlsdGVyTG9vcDI2KHYsIHN0cmlkZSwgMSwgOCwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKLX0KLQotc3RhdGljIHZvaWQgSEZpbHRlcjgodWludDhfdCogdSwgdWludDhfdCogdiwgaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgewotICBGaWx0ZXJMb29wMjYodSwgMSwgc3RyaWRlLCA4LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOwotICBGaWx0ZXJMb29wMjYodiwgMSwgc3RyaWRlLCA4LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOwotfQotCi1zdGF0aWMgdm9pZCBWRmlsdGVyOGkodWludDhfdCogdSwgdWludDhfdCogdiwgaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKLSAgRmlsdGVyTG9vcDI0KHUgKyA0ICogc3RyaWRlLCBzdHJpZGUsIDEsIDgsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7Ci0gIEZpbHRlckxvb3AyNCh2ICsgNCAqIHN0cmlkZSwgc3RyaWRlLCAxLCA4LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOwotfQotCi1zdGF0aWMgdm9pZCBIRmlsdGVyOGkodWludDhfdCogdSwgdWludDhfdCogdiwgaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKLSAgRmlsdGVyTG9vcDI0KHUgKyA0LCAxLCBzdHJpZGUsIDgsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7Ci0gIEZpbHRlckxvb3AyNCh2ICsgNCwgMSwgc3RyaWRlLCA4LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1WUDhEZWNJZGN0MiBWUDhUcmFuc2Zvcm07Ci1WUDhEZWNJZGN0IFZQOFRyYW5zZm9ybVVWOwotVlA4RGVjSWRjdCBWUDhUcmFuc2Zvcm1EQzsKLVZQOERlY0lkY3QgVlA4VHJhbnNmb3JtRENVVjsKLQotVlA4THVtYUZpbHRlckZ1bmMgVlA4VkZpbHRlcjE2OwotVlA4THVtYUZpbHRlckZ1bmMgVlA4SEZpbHRlcjE2OwotVlA4Q2hyb21hRmlsdGVyRnVuYyBWUDhWRmlsdGVyODsKLVZQOENocm9tYUZpbHRlckZ1bmMgVlA4SEZpbHRlcjg7Ci1WUDhMdW1hRmlsdGVyRnVuYyBWUDhWRmlsdGVyMTZpOwotVlA4THVtYUZpbHRlckZ1bmMgVlA4SEZpbHRlcjE2aTsKLVZQOENocm9tYUZpbHRlckZ1bmMgVlA4VkZpbHRlcjhpOwotVlA4Q2hyb21hRmlsdGVyRnVuYyBWUDhIRmlsdGVyOGk7Ci1WUDhTaW1wbGVGaWx0ZXJGdW5jIFZQOFNpbXBsZVZGaWx0ZXIxNjsKLVZQOFNpbXBsZUZpbHRlckZ1bmMgVlA4U2ltcGxlSEZpbHRlcjE2OwotVlA4U2ltcGxlRmlsdGVyRnVuYyBWUDhTaW1wbGVWRmlsdGVyMTZpOwotVlA4U2ltcGxlRmlsdGVyRnVuYyBWUDhTaW1wbGVIRmlsdGVyMTZpOwotCi1leHRlcm4gdm9pZCBWUDhEc3BJbml0U1NFMih2b2lkKTsKLWV4dGVybiB2b2lkIFZQOERzcEluaXRORU9OKHZvaWQpOwotCi12b2lkIFZQOERzcEluaXQodm9pZCkgewotICBEc3BJbml0VGFibGVzKCk7Ci0KLSAgVlA4VHJhbnNmb3JtID0gVHJhbnNmb3JtVHdvOwotICBWUDhUcmFuc2Zvcm1VViA9IFRyYW5zZm9ybVVWOwotICBWUDhUcmFuc2Zvcm1EQyA9IFRyYW5zZm9ybURDOwotICBWUDhUcmFuc2Zvcm1EQ1VWID0gVHJhbnNmb3JtRENVVjsKLQotICBWUDhWRmlsdGVyMTYgPSBWRmlsdGVyMTY7Ci0gIFZQOEhGaWx0ZXIxNiA9IEhGaWx0ZXIxNjsKLSAgVlA4VkZpbHRlcjggPSBWRmlsdGVyODsKLSAgVlA4SEZpbHRlcjggPSBIRmlsdGVyODsKLSAgVlA4VkZpbHRlcjE2aSA9IFZGaWx0ZXIxNmk7Ci0gIFZQOEhGaWx0ZXIxNmkgPSBIRmlsdGVyMTZpOwotICBWUDhWRmlsdGVyOGkgPSBWRmlsdGVyOGk7Ci0gIFZQOEhGaWx0ZXI4aSA9IEhGaWx0ZXI4aTsKLSAgVlA4U2ltcGxlVkZpbHRlcjE2ID0gU2ltcGxlVkZpbHRlcjE2OwotICBWUDhTaW1wbGVIRmlsdGVyMTYgPSBTaW1wbGVIRmlsdGVyMTY7Ci0gIFZQOFNpbXBsZVZGaWx0ZXIxNmkgPSBTaW1wbGVWRmlsdGVyMTZpOwotICBWUDhTaW1wbGVIRmlsdGVyMTZpID0gU2ltcGxlSEZpbHRlcjE2aTsKLQotICAvLyBJZiBkZWZpbmVkLCB1c2UgQ1BVSW5mbygpIHRvIG92ZXJ3cml0ZSBzb21lIHBvaW50ZXJzIHdpdGggZmFzdGVyIHZlcnNpb25zLgotICBpZiAoVlA4R2V0Q1BVSW5mbykgewotI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFMikKLSAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrU1NFMikpIHsKLSAgICAgIFZQOERzcEluaXRTU0UyKCk7Ci0gICAgfQotI2VsaWYgZGVmaW5lZChXRUJQX1VTRV9ORU9OKQotICAgIGlmIChWUDhHZXRDUFVJbmZvKGtORU9OKSkgewotICAgICAgVlA4RHNwSW5pdE5FT04oKTsKLSAgICB9Ci0jZW5kaWYKLSAgfQotfQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RzcC9kZWNfbmVvbi5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL2RlY19uZW9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkY2QzYjcuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL2RlY19uZW9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MDcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIEFSTSBORU9OIHZlcnNpb24gb2YgZHNwIGZ1bmN0aW9ucyBhbmQgbG9vcCBmaWx0ZXJpbmcuCi0vLwotLy8gQXV0aG9yczogU29tbmF0aCBCYW5lcmplZSAoc29tbmF0aEBnb29nbGUuY29tKQotLy8gICAgICAgICAgSm9oYW5uIEtvZW5pZyAoam9oYW5ua29lbmlnQGdvb2dsZS5jb20pCi0KLSNpbmNsdWRlICIuL2RzcC5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoV0VCUF9VU0VfTkVPTikKLQotI2luY2x1ZGUgIi4uL2RlYy92cDhpLmgiCi0KLSNkZWZpbmUgUVJlZ3MgInEwIiwgInExIiwgInEyIiwgInEzIiwgInE0IiwgInE1IiwgInE2IiwgInE3IiwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICJxOCIsICJxOSIsICJxMTAiLCAicTExIiwgInExMiIsICJxMTMiLCAicTE0IiwgInExNSIKLQotI2RlZmluZSBGTElQX1NJR05fQklUMihhLCBiLCBzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgInZlb3IgICAgICIgI2EgIiwiICNhICIsIiAjcyAiICAgICAgICAgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICJ2ZW9yICAgICAiICNiICIsIiAjYiAiLCIgI3MgIiAgICAgICAgICAgICAgIFxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCi0jZGVmaW5lIEZMSVBfU0lHTl9CSVQ0KGEsIGIsIGMsIGQsIHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGTElQX1NJR05fQklUMihhLCBiLCBzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRkxJUF9TSUdOX0JJVDIoYywgZCwgcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0KLSNkZWZpbmUgTkVFRFNfRklMVEVSKHAxLCBwMCwgcTAsIHExLCB0aHJlc2gsIG1hc2spICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICJ2YWJkLnU4ICAgIHExNSwiICNwMCAiLCIgI3EwICIgICAgICAgICBcbiIgIC8qIGFicyhwMCAtIHEwKSAqLyAgICAgICAgICAgICAgXAotICAidmFiZC51OCAgICBxMTQsIiAjcDEgIiwiICNxMSAiICAgICAgICAgXG4iICAvKiBhYnMocDEgLSBxMSkgKi8gICAgICAgICAgICAgIFwKLSAgInZxYWRkLnU4ICAgcTE1LCBxMTUsIHExNSAgICAgICAgICAgICAgIFxuIiAgLyogYWJzKHAwIC0gcTApICogMiAqLyAgICAgICAgICBcCi0gICJ2c2hyLnU4ICAgIHExNCwgcTE0LCAjMSAgICAgICAgICAgICAgICBcbiIgIC8qIGFicyhwMSAtIHExKSAvIDIgKi8gICAgICAgICAgXAotICAidnFhZGQudTggICBxMTUsIHExNSwgcTE0ICAgICBcbiIgIC8qIGFicyhwMCAtIHEwKSAqIDIgKyBhYnMocDEgLSBxMSkgLyAyICovIFwKLSAgInZkdXAuOCAgICAgcTE0LCAiICN0aHJlc2ggIiAgICAgICAgICAgIFxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICJ2Y2dlLnU4ICAgIiAjbWFzayAiLCBxMTQsIHExNSAgICAgICAgICBcbiIgIC8qIG1hc2sgPD0gdGhyZXNoICovCi0KLSNkZWZpbmUgR0VUX0JBU0VfREVMVEEocDEsIHAwLCBxMCwgcTEsIG8pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICJ2cXN1Yi5zOCAgIHExNSwiICNxMCAiLCIgI3AwICIgICAgICAgICBcbiIgIC8qIChxMCAtIHAwKSAqLyAgICAgICAgICAgICAgICAgXAotICAidnFzdWIuczggICIgI28gIiwiICNwMSAiLCIgI3ExICIgICAgICAgXG4iICAvKiAocDEgLSBxMSkgKi8gICAgICAgICAgICAgICAgIFwKLSAgInZxYWRkLnM4ICAiICNvICIsIiAjbyAiLCBxMTUgICAgICAgICAgIFxuIiAgLyogKHAxIC0gcTEpICsgMSAqIChwMCAtIHEwKSAqLyBcCi0gICJ2cWFkZC5zOCAgIiAjbyAiLCIgI28gIiwgcTE1ICAgICAgICAgICBcbiIgIC8qIChwMSAtIHExKSArIDIgKiAocDAgLSBxMCkgKi8gXAotICAidnFhZGQuczggICIgI28gIiwiICNvICIsIHExNSAgICAgICAgICAgXG4iICAvKiAocDEgLSBxMSkgKyAzICogKHAwIC0gcTApICovCi0KLSNkZWZpbmUgRE9fU0lNUExFX0ZJTFRFUihwMCwgcTAsIGZsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICJ2bW92Lmk4ICAgIHExNSwgIzB4MDMgICAgICAgICAgICAgICAgICBcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAidnFhZGQuczggICBxMTUsIHExNSwgIiAjZmwgIiAgICAgICAgICAgXG4iICAvKiBmaWx0ZXIxID0gZmlsdGVyICsgMyAqLyAgICAgIFwKLSAgInZzaHIuczggICAgcTE1LCBxMTUsICMzICAgICAgICAgICAgICAgIFxuIiAgLyogZmlsdGVyMSA+PiAzICovICAgICAgICAgICAgICBcCi0gICJ2cWFkZC5zOCAgIiAjcDAgIiwiICNwMCAiLCBxMTUgICAgICAgICBcbiIgIC8qIHAwICs9IGZpbHRlcjEgKi8gICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgInZtb3YuaTggICAgcTE1LCAjMHgwNCAgICAgICAgICAgICAgICAgIFxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICJ2cWFkZC5zOCAgIHExNSwgcTE1LCAiICNmbCAiICAgICAgICAgICBcbiIgIC8qIGZpbHRlcjEgPSBmaWx0ZXIgKyA0ICovICAgICAgXAotICAidnNoci5zOCAgICBxMTUsIHExNSwgIzMgICAgICAgICAgICAgICAgXG4iICAvKiBmaWx0ZXIyID4+IDMgKi8gICAgICAgICAgICAgIFwKLSAgInZxc3ViLnM4ICAiICNxMCAiLCIgI3EwICIsIHExNSAgICAgICAgIFxuIiAgLyogcTAgLT0gZmlsdGVyMiAqLwotCi0vLyBBcHBsaWVzIGZpbHRlciBvbiAyIHBpeGVscyAocDAgYW5kIHEwKQotI2RlZmluZSBET19GSUxURVIyKHAxLCBwMCwgcTAsIHExLCB0aHJlc2gpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgTkVFRFNfRklMVEVSKHAxLCBwMCwgcTAsIHExLCB0aHJlc2gsIHE5KSAgICAgLyogZmlsdGVyIG1hc2sgaW4gcTkgKi8gICAgICAgICBcCi0gICJ2bW92Lmk4ICAgIHExMCwgIzB4ODAgICAgICAgICAgICAgICAgICBcbiIgIC8qIHNpZ24gYml0ICovICAgICAgICAgICAgICAgICAgXAotICBGTElQX1NJR05fQklUNChwMSwgcDAsIHEwLCBxMSwgcTEwKSAgICAgICAgICAvKiBjb252ZXJ0IHRvIHNpZ25lZCB2YWx1ZSAqLyAgIFwKLSAgR0VUX0JBU0VfREVMVEEocDEsIHAwLCBxMCwgcTEsIHExMSkgICAgICAgICAgLyogZ2V0IGZpbHRlciBsZXZlbCAgKi8gICAgICAgICBcCi0gICJ2YW5kICAgICAgIHE5LCBxOSwgcTExICAgICAgICAgICAgICAgICBcbiIgIC8qIGFwcGx5IGZpbHRlciBtYXNrICovICAgICAgICAgXAotICBET19TSU1QTEVfRklMVEVSKHAwLCBxMCwgcTkpICAgICAgICAgICAgICAgICAvKiBhcHBseSBmaWx0ZXIgKi8gICAgICAgICAgICAgIFwKLSAgRkxJUF9TSUdOX0JJVDIocDAsIHEwLCBxMTApCi0KLS8vIExvYWQvU3RvcmUgdmVydGljYWwgZWRnZQotI2RlZmluZSBMT0FEOHg0KGMxLCBjMiwgYzMsIGM0LCBiMSwgYjIsIHN0cmlkZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgInZsZDQuOCAgIHsiICNjMSJbMF0sICIgI2MyIlswXSwgIiAjYzMiWzBdLCAiICNjNCJbMF19LCIgI2IxICIsIiAjc3RyaWRlIlxuIiBcCi0gICJ2bGQ0LjggICB7IiAjYzEiWzFdLCAiICNjMiJbMV0sICIgI2MzIlsxXSwgIiAjYzQiWzFdfSwiICNiMiAiLCIgI3N0cmlkZSJcbiIgXAotICAidmxkNC44ICAgeyIgI2MxIlsyXSwgIiAjYzIiWzJdLCAiICNjMyJbMl0sICIgI2M0IlsyXX0sIiAjYjEgIiwiICNzdHJpZGUiXG4iIFwKLSAgInZsZDQuOCAgIHsiICNjMSJbM10sICIgI2MyIlszXSwgIiAjYzMiWzNdLCAiICNjNCJbM119LCIgI2IyICIsIiAjc3RyaWRlIlxuIiBcCi0gICJ2bGQ0LjggICB7IiAjYzEiWzRdLCAiICNjMiJbNF0sICIgI2MzIls0XSwgIiAjYzQiWzRdfSwiICNiMSAiLCIgI3N0cmlkZSJcbiIgXAotICAidmxkNC44ICAgeyIgI2MxIls1XSwgIiAjYzIiWzVdLCAiICNjMyJbNV0sICIgI2M0Ils1XX0sIiAjYjIgIiwiICNzdHJpZGUiXG4iIFwKLSAgInZsZDQuOCAgIHsiICNjMSJbNl0sICIgI2MyIls2XSwgIiAjYzMiWzZdLCAiICNjNCJbNl19LCIgI2IxICIsIiAjc3RyaWRlIlxuIiBcCi0gICJ2bGQ0LjggICB7IiAjYzEiWzddLCAiICNjMiJbN10sICIgI2MzIls3XSwgIiAjYzQiWzddfSwiICNiMiAiLCIgI3N0cmlkZSJcbiIKLQotI2RlZmluZSBTVE9SRTh4MihjMSwgYzIsIHAsIHN0cmlkZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgInZzdDIuOCAgIHsiICNjMSJbMF0sICIgI2MyIlswXX0sIiAjcCAiLCIgI3N0cmlkZSAiIFxuIiAgICAgICAgICAgICAgICAgICAgICBcCi0gICJ2c3QyLjggICB7IiAjYzEiWzFdLCAiICNjMiJbMV19LCIgI3AgIiwiICNzdHJpZGUgIiBcbiIgICAgICAgICAgICAgICAgICAgICAgXAotICAidnN0Mi44ICAgeyIgI2MxIlsyXSwgIiAjYzIiWzJdfSwiICNwICIsIiAjc3RyaWRlICIgXG4iICAgICAgICAgICAgICAgICAgICAgIFwKLSAgInZzdDIuOCAgIHsiICNjMSJbM10sICIgI2MyIlszXX0sIiAjcCAiLCIgI3N0cmlkZSAiIFxuIiAgICAgICAgICAgICAgICAgICAgICBcCi0gICJ2c3QyLjggICB7IiAjYzEiWzRdLCAiICNjMiJbNF19LCIgI3AgIiwiICNzdHJpZGUgIiBcbiIgICAgICAgICAgICAgICAgICAgICAgXAotICAidnN0Mi44ICAgeyIgI2MxIls1XSwgIiAjYzIiWzVdfSwiICNwICIsIiAjc3RyaWRlICIgXG4iICAgICAgICAgICAgICAgICAgICAgIFwKLSAgInZzdDIuOCAgIHsiICNjMSJbNl0sICIgI2MyIls2XX0sIiAjcCAiLCIgI3N0cmlkZSAiIFxuIiAgICAgICAgICAgICAgICAgICAgICBcCi0gICJ2c3QyLjggICB7IiAjYzEiWzddLCAiICNjMiJbN119LCIgI3AgIiwiICNzdHJpZGUgIiBcbiIKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gU2ltcGxlIEluLWxvb3AgZmlsdGVyaW5nIChQYXJhZ3JhcGggMTUuMikKLQotc3RhdGljIHZvaWQgU2ltcGxlVkZpbHRlcjE2TkVPTih1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKSB7Ci0gIF9fYXNtX18gdm9sYXRpbGUgKAotICAgICJzdWIgICAgICAgICVbcF0sICVbcF0sICVbc3RyaWRlXSwgbHNsICMxICBcbiIgIC8vIHAgLT0gMiAqIHN0cmlkZQotCi0gICAgInZsZDEudTggICAge3ExfSwgWyVbcF1dLCAlW3N0cmlkZV0gICAgICAgIFxuIiAgLy8gcDEKLSAgICAidmxkMS51OCAgICB7cTJ9LCBbJVtwXV0sICVbc3RyaWRlXSAgICAgICAgXG4iICAvLyBwMAotICAgICJ2bGQxLnU4ICAgIHtxM30sIFslW3BdXSwgJVtzdHJpZGVdICAgICAgICBcbiIgIC8vIHEwCi0gICAgInZsZDEudTggICAge3E0fSwgWyVbcF1dICAgICAgICAgICAgICAgICAgIFxuIiAgLy8gcTEKLQotICAgIERPX0ZJTFRFUjIocTEsIHEyLCBxMywgcTQsICVbdGhyZXNoXSkKLQotICAgICJzdWIgICAgICAgICVbcF0sICVbcF0sICVbc3RyaWRlXSwgbHNsICMxICBcbiIgIC8vIHAgLT0gMiAqIHN0cmlkZQotCi0gICAgInZzdDEudTggICAge3EyfSwgWyVbcF1dLCAlW3N0cmlkZV0gICAgICAgIFxuIiAgLy8gc3RvcmUgb3AwCi0gICAgInZzdDEudTggICAge3EzfSwgWyVbcF1dICAgICAgICAgICAgICAgICAgIFxuIiAgLy8gc3RvcmUgb3EwCi0gICAgOiBbcF0gIityIihwKQotICAgIDogW3N0cmlkZV0gInIiKHN0cmlkZSksIFt0aHJlc2hdICJyIih0aHJlc2gpCi0gICAgOiAibWVtb3J5IiwgUVJlZ3MKLSAgKTsKLX0KLQotc3RhdGljIHZvaWQgU2ltcGxlSEZpbHRlcjE2TkVPTih1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKSB7Ci0gIF9fYXNtX18gdm9sYXRpbGUgKAotICAgICJzdWIgICAgICAgIHI0LCAlW3BdLCAjMiAgICAgICAgICAgICAgICAgICBcbiIgIC8vIGJhc2UxID0gcCAtIDIKLSAgICAibHNsICAgICAgICByNiwgJVtzdHJpZGVdLCAjMSAgICAgICAgICAgICAgXG4iICAvLyByNiA9IDIgKiBzdHJpZGUKLSAgICAiYWRkICAgICAgICByNSwgcjQsICVbc3RyaWRlXSAgICAgICAgICAgICAgXG4iICAvLyBiYXNlMiA9IGJhc2UxICsgc3RyaWRlCi0KLSAgICBMT0FEOHg0KGQyLCBkMywgZDQsIGQ1LCBbcjRdLCBbcjVdLCByNikKLSAgICBMT0FEOHg0KGQ2LCBkNywgZDgsIGQ5LCBbcjRdLCBbcjVdLCByNikKLSAgICAidnN3cCAgICAgICBkMywgZDYgICAgICAgICAgICAgICAgICAgICAgICAgXG4iICAvLyBwMTpxMSBwMDpxMwotICAgICJ2c3dwICAgICAgIGQ1LCBkOCAgICAgICAgICAgICAgICAgICAgICAgICBcbiIgIC8vIHEwOnEyIHExOnE0Ci0gICAgInZzd3AgICAgICAgcTIsIHEzICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiAgLy8gcDE6cTEgcDA6cTIgcTA6cTMgcTE6cTQKLQotICAgIERPX0ZJTFRFUjIocTEsIHEyLCBxMywgcTQsICVbdGhyZXNoXSkKLQotICAgICJzdWIgICAgICAgICVbcF0sICVbcF0sICMxICAgICAgICAgICAgICAgICBcbiIgIC8vIHAgLSAxCi0KLSAgICAidnN3cCAgICAgICAgZDUsIGQ2ICAgICAgICAgICAgICAgICAgICAgICAgXG4iCi0gICAgU1RPUkU4eDIoZDQsIGQ1LCBbJVtwXV0sICVbc3RyaWRlXSkKLSAgICBTVE9SRTh4MihkNiwgZDcsIFslW3BdXSwgJVtzdHJpZGVdKQotCi0gICAgOiBbcF0gIityIihwKQotICAgIDogW3N0cmlkZV0gInIiKHN0cmlkZSksIFt0aHJlc2hdICJyIih0aHJlc2gpCi0gICAgOiAibWVtb3J5IiwgInI0IiwgInI1IiwgInI2IiwgUVJlZ3MKLSAgKTsKLX0KLQotc3RhdGljIHZvaWQgU2ltcGxlVkZpbHRlcjE2aU5FT04odWludDhfdCogcCwgaW50IHN0cmlkZSwgaW50IHRocmVzaCkgewotICBpbnQgazsKLSAgZm9yIChrID0gMzsgayA+IDA7IC0taykgewotICAgIHAgKz0gNCAqIHN0cmlkZTsKLSAgICBTaW1wbGVWRmlsdGVyMTZORU9OKHAsIHN0cmlkZSwgdGhyZXNoKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBTaW1wbGVIRmlsdGVyMTZpTkVPTih1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKSB7Ci0gIGludCBrOwotICBmb3IgKGsgPSAzOyBrID4gMDsgLS1rKSB7Ci0gICAgcCArPSA0OwotICAgIFNpbXBsZUhGaWx0ZXIxNk5FT04ocCwgc3RyaWRlLCB0aHJlc2gpOwotICB9Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEludmVyc2UgdHJhbnNmb3JtcyAoUGFyYWdyYXBoIDE0LjQpCi0KLXN0YXRpYyB2b2lkIFRyYW5zZm9ybU9uZU5FT04oY29uc3QgaW50MTZfdCAqaW4sIHVpbnQ4X3QgKmRzdCkgewotICBjb25zdCBpbnQga0JQUyA9IEJQUzsKLSAgY29uc3QgaW50MTZfdCBjb25zdGFudHNbXSA9IHsyMDA5MSwgMTc3MzQsIDAsIDB9OwotICAvKiBrQzEsIGtDMi4gUGFkZGVkIGJlY2F1c2UgdmxkMS4xNiBsb2FkcyA4IGJ5dGVzCi0gICAqIFRlY2huaWNhbGx5IHRoZXNlIGFyZSB1bnNpZ25lZCBidXQgdnFkbXVsaCBpcyBvbmx5IGF2YWlsYWJsZSBpbiBzaWduZWQuCi0gICAqIHZxZG11bGggcmV0dXJucyBoaWdoIGhhbGYgKGVmZmVjdGl2ZWx5ID4+IDE2KSBidXQgYWxzbyBkb3VibGVzIHRoZSB2YWx1ZSwKLSAgICogY2hhbmdpbmcgdGhlID4+IDE2IHRvID4+IDE1IGFuZCByZXF1aXJpbmcgYW4gYWRkaXRpb25hbCA+PiAxLgotICAgKiBXZSB1c2UgdGhpcyB0byBvdXIgYWR2YW50YWdlIHdpdGgga0MyLiBUaGUgY2Fub25pY2FsIHZhbHVlIGlzIDM1NDY4LgotICAgKiBIb3dldmVyLCB0aGUgaGlnaCBiaXQgaXMgc2V0IHNvIHRyZWF0aW5nIGl0IGFzIHNpZ25lZCB3aWxsIGdpdmUgaW5jb3JyZWN0Ci0gICAqIHJlc3VsdHMuIFdlIGF2b2lkIHRoaXMgYnkgZG93biBzaGlmdGluZyBieSAxIGhlcmUgdG8gY2xlYXIgdGhlIGhpZ2hlc3QgYml0LgotICAgKiBDb21iaW5lZCB3aXRoIHRoZSBkb3VibGluZyBlZmZlY3Qgb2YgdnFkbXVsaCB3ZSBnZXQgPj4gMTYuCi0gICAqIFRoaXMgY2FuIG5vdCBiZSBhcHBsaWVkIHRvIGtDMSBiZWNhdXNlIHRoZSBsb3dlc3QgYml0IGlzIHNldC4gRG93biBzaGlmdGluZwotICAgKiB0aGUgY29uc3RhbnQgd291bGQgcmVkdWNlIHByZWNpc2lvbi4KLSAgICovCi0KLSAgLyogbGlid2VicCB1c2VzIGEgdHJpY2sgdG8gYXZvaWQgc29tZSBleHRyYSBhZGRpdGlvbiB0aGF0IGxpYnZweCBkb2VzLgotICAgKiBJbnN0ZWFkIG9mOgotICAgKiB0ZW1wMiA9IGlwWzEyXSArICgoaXBbMTJdICogY29zcGk4c3FydDJtaW51czEpID4+IDE2KTsKLSAgICogbGlid2VicCBhZGRzIDEgPDwgMTYgdG8gY29zcGk4c3FydDJtaW51czEgKGtDMSkuIEhvd2V2ZXIsIHRoaXMgY2F1c2VzIHRoZQotICAgKiBzYW1lIGlzc3VlIHdpdGgga0MxIGFuZCB2cWRtdWxoIHRoYXQgd2Ugd29yayBhcm91bmQgYnkgZG93biBzaGlmdGluZyBrQzIKLSAgICovCi0KLSAgLyogQWRhcHRlZCBmcm9tIGxpYnZweDogdnA4L2NvbW1vbi9hcm0vbmVvbi9zaG9ydGlkY3Q0eDRsbG1fbmVvbi5hc20gKi8KLSAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgInZsZDEuMTYgICAgICAgICB7cTEsIHEyfSwgWyVbaW5dXSAgICAgICAgICAgXG4iCi0gICAgInZsZDEuMTYgICAgICAgICB7ZDB9LCBbJVtjb25zdGFudHNdXSAgICAgICAgXG4iCi0KLSAgICAvKiBkMjogaW5bMF0KLSAgICAgKiBkMzogaW5bOF0KLSAgICAgKiBkNDogaW5bNF0KLSAgICAgKiBkNTogaW5bMTJdCi0gICAgICovCi0gICAgInZzd3AgICAgICAgICAgICBkMywgZDQgICAgICAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAvKiBxOCA9IHtpbls0XSwgaW5bMTJdfSAqIGtDMSAqIDIgPj4gMTYKLSAgICAgKiBxOSA9IHtpbls0XSwgaW5bMTJdfSAqIGtDMiA+PiAxNgotICAgICAqLwotICAgICJ2cWRtdWxoLnMxNiAgICAgcTgsIHEyLCBkMFswXSAgICAgICAgICAgICAgIFxuIgotICAgICJ2cWRtdWxoLnMxNiAgICAgcTksIHEyLCBkMFsxXSAgICAgICAgICAgICAgIFxuIgotCi0gICAgLyogZDIyID0gYSA9IGluWzBdICsgaW5bOF0KLSAgICAgKiBkMjMgPSBiID0gaW5bMF0gLSBpbls4XQotICAgICAqLwotICAgICJ2cWFkZC5zMTYgICAgICAgZDIyLCBkMiwgZDMgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2cXN1Yi5zMTYgICAgICAgZDIzLCBkMiwgZDMgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgLyogVGhlIG11bHRpcGxpY2F0aW9uIHNob3VsZCBiZSB4ICoga0MxID4+IDE2Ci0gICAgICogSG93ZXZlciwgd2l0aCB2cWRtdWxoIHdlIGdldCB4ICoga0MxICogMiA+PiAxNgotICAgICAqIChtdWx0aXBseSwgZG91YmxlLCByZXR1cm4gaGlnaCBoYWxmKQotICAgICAqIFdlIGF2b2lkZWQgdGhpcyBpbiBrQzIgYnkgcHJlLXNoaWZ0aW5nIHRoZSBjb25zdGFudC4KLSAgICAgKiBxOCA9IGluWzRdL1sxMl0gKiBrQzEgPj4gMTYKLSAgICAgKi8KLSAgICAidnNoci5zMTYgICAgICAgIHE4LCBxOCwgIzEgICAgICAgICAgICAgICAgICBcbiIKLQotICAgIC8qIEFkZCB7aW5bNF0sIGluWzEyXX0gYmFjayBhZnRlciB0aGUgbXVsdGlwbGljYXRpb24uIFRoaXMgaXMgaGFuZGxlZCBieQotICAgICAqIGFkZGluZyAxIDw8IDE2IHRvIGtDMSBpbiB0aGUgbGlid2VicCBDIGNvZGUuCi0gICAgICovCi0gICAgInZxYWRkLnMxNiAgICAgICBxOCwgcTIsIHE4ICAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAvKiBkMjAgPSBjID0gaW5bNF0qa0MyIC0gaW5bMTJdKmtDMQotICAgICAqIGQyMSA9IGQgPSBpbls0XSprQzEgKyBpblsxMl0qa0MyCi0gICAgICovCi0gICAgInZxc3ViLnMxNiAgICAgICBkMjAsIGQxOCwgZDE3ICAgICAgICAgICAgICAgXG4iCi0gICAgInZxYWRkLnMxNiAgICAgICBkMjEsIGQxOSwgZDE2ICAgICAgICAgICAgICAgXG4iCi0KLSAgICAvKiBkMiA9IHRtcFswXSA9IGEgKyBkCi0gICAgICogZDMgPSB0bXBbMV0gPSBiICsgYwotICAgICAqIGQ0ID0gdG1wWzJdID0gYiAtIGMKLSAgICAgKiBkNSA9IHRtcFszXSA9IGEgLSBkCi0gICAgICovCi0gICAgInZxYWRkLnMxNiAgICAgICBkMiwgZDIyLCBkMjEgICAgICAgICAgICAgICAgXG4iCi0gICAgInZxYWRkLnMxNiAgICAgICBkMywgZDIzLCBkMjAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZxc3ViLnMxNiAgICAgICBkNCwgZDIzLCBkMjAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZxc3ViLnMxNiAgICAgICBkNSwgZDIyLCBkMjEgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAidnppcC4xNiAgICAgICAgIHExLCBxMiAgICAgICAgICAgICAgICAgICAgICBcbiIKLSAgICAidnppcC4xNiAgICAgICAgIHExLCBxMiAgICAgICAgICAgICAgICAgICAgICBcbiIKLQotICAgICJ2c3dwICAgICAgICAgICAgZDMsIGQ0ICAgICAgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgLyogcTggPSB7dG1wWzRdLCB0bXBbMTJdfSAqIGtDMSAqIDIgPj4gMTYKLSAgICAgKiBxOSA9IHt0bXBbNF0sIHRtcFsxMl19ICoga0MyID4+IDE2Ci0gICAgICovCi0gICAgInZxZG11bGguczE2ICAgICBxOCwgcTIsIGQwWzBdICAgICAgICAgICAgICAgXG4iCi0gICAgInZxZG11bGguczE2ICAgICBxOSwgcTIsIGQwWzFdICAgICAgICAgICAgICAgXG4iCi0KLSAgICAvKiBkMjIgPSBhID0gdG1wWzBdICsgdG1wWzhdCi0gICAgICogZDIzID0gYiA9IHRtcFswXSAtIHRtcFs4XQotICAgICAqLwotICAgICJ2cWFkZC5zMTYgICAgICAgZDIyLCBkMiwgZDMgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2cXN1Yi5zMTYgICAgICAgZDIzLCBkMiwgZDMgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgLyogU2VlIGxvbmcgd2luZGVkIGV4cGxhbmF0aW9ucyBwcmlvciAqLwotICAgICJ2c2hyLnMxNiAgICAgICAgcTgsIHE4LCAjMSAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2cWFkZC5zMTYgICAgICAgcTgsIHEyLCBxOCAgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgLyogZDIwID0gYyA9IGluWzRdKmtDMiAtIGluWzEyXSprQzEKLSAgICAgKiBkMjEgPSBkID0gaW5bNF0qa0MxICsgaW5bMTJdKmtDMgotICAgICAqLwotICAgICJ2cXN1Yi5zMTYgICAgICAgZDIwLCBkMTgsIGQxNyAgICAgICAgICAgICAgIFxuIgotICAgICJ2cWFkZC5zMTYgICAgICAgZDIxLCBkMTksIGQxNiAgICAgICAgICAgICAgIFxuIgotCi0gICAgLyogZDIgPSB0bXBbMF0gPSBhICsgZAotICAgICAqIGQzID0gdG1wWzFdID0gYiArIGMKLSAgICAgKiBkNCA9IHRtcFsyXSA9IGIgLSBjCi0gICAgICogZDUgPSB0bXBbM10gPSBhIC0gZAotICAgICAqLwotICAgICJ2cWFkZC5zMTYgICAgICAgZDIsIGQyMiwgZDIxICAgICAgICAgICAgICAgIFxuIgotICAgICJ2cWFkZC5zMTYgICAgICAgZDMsIGQyMywgZDIwICAgICAgICAgICAgICAgIFxuIgotICAgICJ2cXN1Yi5zMTYgICAgICAgZDQsIGQyMywgZDIwICAgICAgICAgICAgICAgIFxuIgotICAgICJ2cXN1Yi5zMTYgICAgICAgZDUsIGQyMiwgZDIxICAgICAgICAgICAgICAgIFxuIgotCi0gICAgInZsZDEuMzIgICAgICAgICBkNlswXSwgWyVbZHN0XV0sICVba0JQU10gICAgXG4iCi0gICAgInZsZDEuMzIgICAgICAgICBkNlsxXSwgWyVbZHN0XV0sICVba0JQU10gICAgXG4iCi0gICAgInZsZDEuMzIgICAgICAgICBkN1swXSwgWyVbZHN0XV0sICVba0JQU10gICAgXG4iCi0gICAgInZsZDEuMzIgICAgICAgICBkN1sxXSwgWyVbZHN0XV0sICVba0JQU10gICAgXG4iCi0KLSAgICAic3ViICAgICAgICAgJVtkc3RdLCAlW2RzdF0sICVba0JQU10sIGxzbCAjMiBcbiIKLQotICAgIC8qICh2YWwpICsgNCA+PiAzICovCi0gICAgInZyc2hyLnMxNiAgICAgICBkMiwgZDIsICMzICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZyc2hyLnMxNiAgICAgICBkMywgZDMsICMzICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZyc2hyLnMxNiAgICAgICBkNCwgZDQsICMzICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZyc2hyLnMxNiAgICAgICBkNSwgZDUsICMzICAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAidnppcC4xNiAgICAgICAgIHExLCBxMiAgICAgICAgICAgICAgICAgICAgICBcbiIKLSAgICAidnppcC4xNiAgICAgICAgIHExLCBxMiAgICAgICAgICAgICAgICAgICAgICBcbiIKLQotICAgIC8qIE11c3QgYWNjdW11bGF0ZSBiZWZvcmUgc2F0dXJhdGluZyAqLwotICAgICJ2bW92bC51OCAgICAgICAgcTgsIGQ2ICAgICAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2bW92bC51OCAgICAgICAgcTksIGQ3ICAgICAgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgInZxYWRkLnMxNiAgICAgICBxMSwgcTEsIHE4ICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZxYWRkLnMxNiAgICAgICBxMiwgcTIsIHE5ICAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAidnFtb3Z1bi5zMTYgICAgIGQwLCBxMSAgICAgICAgICAgICAgICAgICAgICBcbiIKLSAgICAidnFtb3Z1bi5zMTYgICAgIGQxLCBxMiAgICAgICAgICAgICAgICAgICAgICBcbiIKLQotICAgICJ2c3QxLjMyICAgICAgICAgZDBbMF0sIFslW2RzdF1dLCAlW2tCUFNdICAgIFxuIgotICAgICJ2c3QxLjMyICAgICAgICAgZDBbMV0sIFslW2RzdF1dLCAlW2tCUFNdICAgIFxuIgotICAgICJ2c3QxLjMyICAgICAgICAgZDFbMF0sIFslW2RzdF1dLCAlW2tCUFNdICAgIFxuIgotICAgICJ2c3QxLjMyICAgICAgICAgZDFbMV0sIFslW2RzdF1dICAgICAgICAgICAgIFxuIgotCi0gICAgOiBbaW5dICIrciIoaW4pLCBbZHN0XSAiK3IiKGRzdCkgIC8qIG1vZGlmaWVkIHJlZ2lzdGVycyAqLwotICAgIDogW2tCUFNdICJyIihrQlBTKSwgW2NvbnN0YW50c10gInIiKGNvbnN0YW50cykgIC8qIGNvbnN0YW50cyAqLwotICAgIDogIm1lbW9yeSIsICJxMCIsICJxMSIsICJxMiIsICJxOCIsICJxOSIsICJxMTAiLCAicTExIiAgLyogY2xvYmJlcmVkICovCi0gICk7Ci19Ci0KLXN0YXRpYyB2b2lkIFRyYW5zZm9ybVR3b05FT04oY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCwgaW50IGRvX3R3bykgewotICBUcmFuc2Zvcm1PbmVORU9OKGluLCBkc3QpOwotICBpZiAoZG9fdHdvKSB7Ci0gICAgVHJhbnNmb3JtT25lTkVPTihpbiArIDE2LCBkc3QgKyA0KTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBUcmFuc2Zvcm1XSFQoY29uc3QgaW50MTZfdCogaW4sIGludDE2X3QqIG91dCkgewotICBjb25zdCBpbnQga1N0ZXAgPSAzMjsgIC8vIFRoZSBzdG9yZSBpcyBvbmx5IGluY3JlbWVudGluZyB0aGUgcG9pbnRlciBhcyBpZiB3ZQotICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhZCBzdG9yZWQgYSBzaW5nbGUgYnl0ZS4KLSAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgLy8gcGFydCAxCi0gICAgLy8gbG9hZCBkYXRhIGludG8gcTAsIHExCi0gICAgInZsZDEuMTYgICAgICAgICB7cTAsIHExfSwgWyVbaW5dXSAgICAgICAgICAgXG4iCi0KLSAgICAidmFkZGwuczE2ICAgICAgIHEyLCBkMCwgZDMgICAgICAgICAgICAgICAgICBcbiIgLy8gYTAgPSBpblswXSArIGluWzEyXQotICAgICJ2YWRkbC5zMTYgICAgICAgcTMsIGQxLCBkMiAgICAgICAgICAgICAgICAgIFxuIiAvLyBhMSA9IGluWzRdICsgaW5bOF0KLSAgICAidnN1YmwuczE2ICAgICAgIHE0LCBkMSwgZDIgICAgICAgICAgICAgICAgICBcbiIgLy8gYTIgPSBpbls0XSAtIGluWzhdCi0gICAgInZzdWJsLnMxNiAgICAgICBxNSwgZDAsIGQzICAgICAgICAgICAgICAgICAgXG4iIC8vIGEzID0gaW5bMF0gLSBpblsxMl0KLQotICAgICJ2YWRkLnMzMiAgICAgICAgcTAsIHEyLCBxMyAgICAgICAgICAgICAgICAgIFxuIiAvLyB0bXBbMF0gPSBhMCArIGExCi0gICAgInZzdWIuczMyICAgICAgICBxMiwgcTIsIHEzICAgICAgICAgICAgICAgICAgXG4iIC8vIHRtcFs4XSA9IGEwIC0gYTEKLSAgICAidmFkZC5zMzIgICAgICAgIHExLCBxNSwgcTQgICAgICAgICAgICAgICAgICBcbiIgLy8gdG1wWzRdID0gYTMgKyBhMgotICAgICJ2c3ViLnMzMiAgICAgICAgcTMsIHE1LCBxNCAgICAgICAgICAgICAgICAgIFxuIiAvLyB0bXBbMTJdID0gYTMgLSBhMgotCi0gICAgLy8gVHJhbnNwb3NlCi0gICAgLy8gcTAgPSB0bXBbMCwgNCwgOCwgMTJdLCBxMSA9IHRtcFsyLCA2LCAxMCwgMTRdCi0gICAgLy8gcTIgPSB0bXBbMSwgNSwgOSwgMTNdLCBxMyA9IHRtcFszLCA3LCAxMSwgMTVdCi0gICAgInZzd3AgICAgICAgICAgICBkMSwgZDQgICAgICAgICAgICAgICAgICAgICAgXG4iIC8vIHZ0cm4uNjQgcTAsIHEyCi0gICAgInZzd3AgICAgICAgICAgICBkMywgZDYgICAgICAgICAgICAgICAgICAgICAgXG4iIC8vIHZ0cm4uNjQgcTEsIHEzCi0gICAgInZ0cm4uMzIgICAgICAgICBxMCwgcTEgICAgICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZ0cm4uMzIgICAgICAgICBxMiwgcTMgICAgICAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAidm1vdi5zMzIgICAgICAgIHE0LCAjMyAgICAgICAgICAgICAgICAgICAgICBcbiIgLy8gZGMgPSAzCi0gICAgInZhZGQuczMyICAgICAgICBxMCwgcTAsIHE0ICAgICAgICAgICAgICAgICAgXG4iIC8vIGRjID0gdG1wWzBdICsgMwotICAgICJ2YWRkLnMzMiAgICAgICAgcTYsIHEwLCBxMyAgICAgICAgICAgICAgICAgIFxuIiAvLyBhMCA9IGRjICsgdG1wWzNdCi0gICAgInZhZGQuczMyICAgICAgICBxNywgcTEsIHEyICAgICAgICAgICAgICAgICAgXG4iIC8vIGExID0gdG1wWzFdICsgdG1wWzJdCi0gICAgInZzdWIuczMyICAgICAgICBxOCwgcTEsIHEyICAgICAgICAgICAgICAgICAgXG4iIC8vIGEyID0gdG1wWzFdIC0gdG1wWzJdCi0gICAgInZzdWIuczMyICAgICAgICBxOSwgcTAsIHEzICAgICAgICAgICAgICAgICAgXG4iIC8vIGEzID0gZGMgLSB0bXBbM10KLQotICAgICJ2YWRkLnMzMiAgICAgICAgcTAsIHE2LCBxNyAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2c2hybi5zMzIgICAgICAgZDAsIHEwLCAjMyAgICAgICAgICAgICAgICAgIFxuIiAvLyAoYTAgKyBhMSkgPj4gMwotICAgICJ2YWRkLnMzMiAgICAgICAgcTEsIHE5LCBxOCAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2c2hybi5zMzIgICAgICAgZDEsIHExLCAjMyAgICAgICAgICAgICAgICAgIFxuIiAvLyAoYTMgKyBhMikgPj4gMwotICAgICJ2c3ViLnMzMiAgICAgICAgcTIsIHE2LCBxNyAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2c2hybi5zMzIgICAgICAgZDIsIHEyLCAjMyAgICAgICAgICAgICAgICAgIFxuIiAvLyAoYTAgLSBhMSkgPj4gMwotICAgICJ2c3ViLnMzMiAgICAgICAgcTMsIHE5LCBxOCAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2c2hybi5zMzIgICAgICAgZDMsIHEzLCAjMyAgICAgICAgICAgICAgICAgIFxuIiAvLyAoYTMgLSBhMikgPj4gMwotCi0gICAgLy8gc2V0IHRoZSByZXN1bHRzIHRvIG91dHB1dAotICAgICJ2c3QxLjE2ICAgICAgICAgZDBbMF0sIFslW291dF1dLCAlW2tTdGVwXSAgIFxuIgotICAgICJ2c3QxLjE2ICAgICAgICAgZDFbMF0sIFslW291dF1dLCAlW2tTdGVwXSAgIFxuIgotICAgICJ2c3QxLjE2ICAgICAgICAgZDJbMF0sIFslW291dF1dLCAlW2tTdGVwXSAgIFxuIgotICAgICJ2c3QxLjE2ICAgICAgICAgZDNbMF0sIFslW291dF1dLCAlW2tTdGVwXSAgIFxuIgotICAgICJ2c3QxLjE2ICAgICAgICAgZDBbMV0sIFslW291dF1dLCAlW2tTdGVwXSAgIFxuIgotICAgICJ2c3QxLjE2ICAgICAgICAgZDFbMV0sIFslW291dF1dLCAlW2tTdGVwXSAgIFxuIgotICAgICJ2c3QxLjE2ICAgICAgICAgZDJbMV0sIFslW291dF1dLCAlW2tTdGVwXSAgIFxuIgotICAgICJ2c3QxLjE2ICAgICAgICAgZDNbMV0sIFslW291dF1dLCAlW2tTdGVwXSAgIFxuIgotICAgICJ2c3QxLjE2ICAgICAgICAgZDBbMl0sIFslW291dF1dLCAlW2tTdGVwXSAgIFxuIgotICAgICJ2c3QxLjE2ICAgICAgICAgZDFbMl0sIFslW291dF1dLCAlW2tTdGVwXSAgIFxuIgotICAgICJ2c3QxLjE2ICAgICAgICAgZDJbMl0sIFslW291dF1dLCAlW2tTdGVwXSAgIFxuIgotICAgICJ2c3QxLjE2ICAgICAgICAgZDNbMl0sIFslW291dF1dLCAlW2tTdGVwXSAgIFxuIgotICAgICJ2c3QxLjE2ICAgICAgICAgZDBbM10sIFslW291dF1dLCAlW2tTdGVwXSAgIFxuIgotICAgICJ2c3QxLjE2ICAgICAgICAgZDFbM10sIFslW291dF1dLCAlW2tTdGVwXSAgIFxuIgotICAgICJ2c3QxLjE2ICAgICAgICAgZDJbM10sIFslW291dF1dLCAlW2tTdGVwXSAgIFxuIgotICAgICJ2c3QxLjE2ICAgICAgICAgZDNbM10sIFslW291dF1dLCAlW2tTdGVwXSAgIFxuIgotCi0gICAgOiBbb3V0XSAiK3IiKG91dCkgIC8vIG1vZGlmaWVkIHJlZ2lzdGVycwotICAgIDogW2luXSAiciIoaW4pLCBba1N0ZXBdICJyIihrU3RlcCkgIC8vIGNvbnN0YW50cwotICAgIDogIm1lbW9yeSIsICJxMCIsICJxMSIsICJxMiIsICJxMyIsICJxNCIsCi0gICAgICAicTUiLCAicTYiLCAicTciLCAicTgiLCAicTkiICAvLyBjbG9iYmVyZWQKLSAgKTsKLX0KLQotI2VuZGlmICAgLy8gV0VCUF9VU0VfTkVPTgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRW50cnkgcG9pbnQKLQotZXh0ZXJuIHZvaWQgVlA4RHNwSW5pdE5FT04odm9pZCk7Ci0KLXZvaWQgVlA4RHNwSW5pdE5FT04odm9pZCkgewotI2lmIGRlZmluZWQoV0VCUF9VU0VfTkVPTikKLSAgVlA4VHJhbnNmb3JtID0gVHJhbnNmb3JtVHdvTkVPTjsKLSAgVlA4VHJhbnNmb3JtV0hUID0gVHJhbnNmb3JtV0hUOwotCi0gIFZQOFNpbXBsZVZGaWx0ZXIxNiA9IFNpbXBsZVZGaWx0ZXIxNk5FT047Ci0gIFZQOFNpbXBsZUhGaWx0ZXIxNiA9IFNpbXBsZUhGaWx0ZXIxNk5FT047Ci0gIFZQOFNpbXBsZVZGaWx0ZXIxNmkgPSBTaW1wbGVWRmlsdGVyMTZpTkVPTjsKLSAgVlA4U2ltcGxlSEZpbHRlcjE2aSA9IFNpbXBsZUhGaWx0ZXIxNmlORU9OOwotI2VuZGlmICAgLy8gV0VCUF9VU0VfTkVPTgotfQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RzcC9kZWNfc3NlMi5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL2RlY19zc2UyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiZTk0NjcuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL2RlY19zc2UyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MTAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIFNTRTIgdmVyc2lvbiBvZiBzb21lIGRlY29kaW5nIGZ1bmN0aW9ucyAoaWRjdCwgbG9vcCBmaWx0ZXJpbmcpLgotLy8KLS8vIEF1dGhvcjogc29tbmF0aEBnb29nbGUuY29tIChTb21uYXRoIEJhbmVyamVlKQotLy8gICAgICAgICBjZHV2aXZpZXJAZ29vZ2xlLmNvbSAoQ2hyaXN0aWFuIER1dml2aWVyKQotCi0jaW5jbHVkZSAiLi9kc3AuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTIpCi0KLSNpbmNsdWRlIDxlbW1pbnRyaW4uaD4KLSNpbmNsdWRlICIuLi9kZWMvdnA4aS5oIgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVHJhbnNmb3JtcyAoUGFyYWdyYXBoIDE0LjQpCi0KLXN0YXRpYyB2b2lkIFRyYW5zZm9ybVNTRTIoY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCwgaW50IGRvX3R3bykgewotICAvLyBUaGlzIGltcGxlbWVudGF0aW9uIG1ha2VzIHVzZSBvZiAxNi1iaXQgZml4ZWQgcG9pbnQgdmVyc2lvbnMgb2YgdHdvCi0gIC8vIG11bHRpcGx5IGNvbnN0YW50czoKLSAgLy8gICAgSzEgPSBzcXJ0KDIpICogY29zIChwaS84KSB+PSA4NTYyNyAvIDJeMTYKLSAgLy8gICAgSzIgPSBzcXJ0KDIpICogc2luIChwaS84KSB+PSAzNTQ2OCAvIDJeMTYKLSAgLy8KLSAgLy8gVG8gYmUgYWJsZSB0byB1c2Ugc2lnbmVkIDE2LWJpdCBpbnRlZ2Vycywgd2UgdXNlIHRoZSBmb2xsb3dpbmcgdHJpY2sgdG8KLSAgLy8gaGF2ZSBjb25zdGFudHMgd2l0aGluIHJhbmdlOgotICAvLyAtIEFzc29jaWF0ZWQgY29uc3RhbnRzIGFyZSBvYnRhaW5lZCBieSBzdWJ0cmFjdGluZyB0aGUgMTYtYml0IGZpeGVkIHBvaW50Ci0gIC8vICAgdmVyc2lvbiBvZiBvbmU6Ci0gIC8vICAgICAgayA9IEsgLSAoMSA8PCAxNikgID0+ICBLID0gayArICgxIDw8IDE2KQotICAvLyAgICAgIEsxID0gODUyNjcgID0+ICBrMSA9ICAyMDA5MQotICAvLyAgICAgIEsyID0gMzU0NjggID0+ICBrMiA9IC0zMDA2OAotICAvLyAtIFRoZSBtdWx0aXBsaWNhdGlvbiBvZiBhIHZhcmlhYmxlIGJ5IGEgY29uc3RhbnQgYmVjb21lIHRoZSBzdW0gb2YgdGhlCi0gIC8vICAgdmFyaWFibGUgYW5kIHRoZSBtdWx0aXBsaWNhdGlvbiBvZiB0aGF0IHZhcmlhYmxlIGJ5IHRoZSBhc3NvY2lhdGVkCi0gIC8vICAgY29uc3RhbnQ6Ci0gIC8vICAgICAgKHggKiBLKSA+PiAxNiA9ICh4ICogKGsgKyAoMSA8PCAxNikpKSA+PiAxNiA9ICgoeCAqIGsgKSA+PiAxNikgKyB4Ci0gIGNvbnN0IF9fbTEyOGkgazEgPSBfbW1fc2V0MV9lcGkxNigyMDA5MSk7Ci0gIGNvbnN0IF9fbTEyOGkgazIgPSBfbW1fc2V0MV9lcGkxNigtMzAwNjgpOwotICBfX20xMjhpIFQwLCBUMSwgVDIsIFQzOwotCi0gIC8vIExvYWQgYW5kIGNvbmNhdGVuYXRlIHRoZSB0cmFuc2Zvcm0gY29lZmZpY2llbnRzICh3ZSdsbCBkbyB0d28gdHJhbnNmb3JtcwotICAvLyBpbiBwYXJhbGxlbCkuIEluIHRoZSBjYXNlIG9mIG9ubHkgb25lIHRyYW5zZm9ybSwgdGhlIHNlY29uZCBoYWxmIG9mIHRoZQotICAvLyB2ZWN0b3JzIHdpbGwganVzdCBjb250YWluIHJhbmRvbSB2YWx1ZSB3ZSdsbCBuZXZlciB1c2Ugbm9yIHN0b3JlLgotICBfX20xMjhpIGluMCwgaW4xLCBpbjIsIGluMzsKLSAgewotICAgIGluMCA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJmluWzBdKTsKLSAgICBpbjEgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSZpbls0XSk7Ci0gICAgaW4yID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmaW5bOF0pOwotICAgIGluMyA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJmluWzEyXSk7Ci0gICAgLy8gYTAwIGExMCBhMjAgYTMwICAgeCB4IHggeAotICAgIC8vIGEwMSBhMTEgYTIxIGEzMSAgIHggeCB4IHgKLSAgICAvLyBhMDIgYTEyIGEyMiBhMzIgICB4IHggeCB4Ci0gICAgLy8gYTAzIGExMyBhMjMgYTMzICAgeCB4IHggeAotICAgIGlmIChkb190d28pIHsKLSAgICAgIGNvbnN0IF9fbTEyOGkgaW5CMCA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJmluWzE2XSk7Ci0gICAgICBjb25zdCBfX20xMjhpIGluQjEgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSZpblsyMF0pOwotICAgICAgY29uc3QgX19tMTI4aSBpbkIyID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmaW5bMjRdKTsKLSAgICAgIGNvbnN0IF9fbTEyOGkgaW5CMyA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJmluWzI4XSk7Ci0gICAgICBpbjAgPSBfbW1fdW5wYWNrbG9fZXBpNjQoaW4wLCBpbkIwKTsKLSAgICAgIGluMSA9IF9tbV91bnBhY2tsb19lcGk2NChpbjEsIGluQjEpOwotICAgICAgaW4yID0gX21tX3VucGFja2xvX2VwaTY0KGluMiwgaW5CMik7Ci0gICAgICBpbjMgPSBfbW1fdW5wYWNrbG9fZXBpNjQoaW4zLCBpbkIzKTsKLSAgICAgIC8vIGEwMCBhMTAgYTIwIGEzMCAgIGIwMCBiMTAgYjIwIGIzMAotICAgICAgLy8gYTAxIGExMSBhMjEgYTMxICAgYjAxIGIxMSBiMjEgYjMxCi0gICAgICAvLyBhMDIgYTEyIGEyMiBhMzIgICBiMDIgYjEyIGIyMiBiMzIKLSAgICAgIC8vIGEwMyBhMTMgYTIzIGEzMyAgIGIwMyBiMTMgYjIzIGIzMwotICAgIH0KLSAgfQotCi0gIC8vIFZlcnRpY2FsIHBhc3MgYW5kIHN1YnNlcXVlbnQgdHJhbnNwb3NlLgotICB7Ci0gICAgLy8gRmlyc3QgcGFzcywgYyBhbmQgZCBjYWxjdWxhdGlvbnMgYXJlIGxvbmdlciBiZWNhdXNlIG9mIHRoZSAidHJpY2siCi0gICAgLy8gbXVsdGlwbGljYXRpb25zLgotICAgIGNvbnN0IF9fbTEyOGkgYSA9IF9tbV9hZGRfZXBpMTYoaW4wLCBpbjIpOwotICAgIGNvbnN0IF9fbTEyOGkgYiA9IF9tbV9zdWJfZXBpMTYoaW4wLCBpbjIpOwotICAgIC8vIGMgPSBNVUwoaW4xLCBLMikgLSBNVUwoaW4zLCBLMSkgPSBNVUwoaW4xLCBrMikgLSBNVUwoaW4zLCBrMSkgKyBpbjEgLSBpbjMKLSAgICBjb25zdCBfX20xMjhpIGMxID0gX21tX211bGhpX2VwaTE2KGluMSwgazIpOwotICAgIGNvbnN0IF9fbTEyOGkgYzIgPSBfbW1fbXVsaGlfZXBpMTYoaW4zLCBrMSk7Ci0gICAgY29uc3QgX19tMTI4aSBjMyA9IF9tbV9zdWJfZXBpMTYoaW4xLCBpbjMpOwotICAgIGNvbnN0IF9fbTEyOGkgYzQgPSBfbW1fc3ViX2VwaTE2KGMxLCBjMik7Ci0gICAgY29uc3QgX19tMTI4aSBjID0gX21tX2FkZF9lcGkxNihjMywgYzQpOwotICAgIC8vIGQgPSBNVUwoaW4xLCBLMSkgKyBNVUwoaW4zLCBLMikgPSBNVUwoaW4xLCBrMSkgKyBNVUwoaW4zLCBrMikgKyBpbjEgKyBpbjMKLSAgICBjb25zdCBfX20xMjhpIGQxID0gX21tX211bGhpX2VwaTE2KGluMSwgazEpOwotICAgIGNvbnN0IF9fbTEyOGkgZDIgPSBfbW1fbXVsaGlfZXBpMTYoaW4zLCBrMik7Ci0gICAgY29uc3QgX19tMTI4aSBkMyA9IF9tbV9hZGRfZXBpMTYoaW4xLCBpbjMpOwotICAgIGNvbnN0IF9fbTEyOGkgZDQgPSBfbW1fYWRkX2VwaTE2KGQxLCBkMik7Ci0gICAgY29uc3QgX19tMTI4aSBkID0gX21tX2FkZF9lcGkxNihkMywgZDQpOwotCi0gICAgLy8gU2Vjb25kIHBhc3MuCi0gICAgY29uc3QgX19tMTI4aSB0bXAwID0gX21tX2FkZF9lcGkxNihhLCBkKTsKLSAgICBjb25zdCBfX20xMjhpIHRtcDEgPSBfbW1fYWRkX2VwaTE2KGIsIGMpOwotICAgIGNvbnN0IF9fbTEyOGkgdG1wMiA9IF9tbV9zdWJfZXBpMTYoYiwgYyk7Ci0gICAgY29uc3QgX19tMTI4aSB0bXAzID0gX21tX3N1Yl9lcGkxNihhLCBkKTsKLQotICAgIC8vIFRyYW5zcG9zZSB0aGUgdHdvIDR4NC4KLSAgICAvLyBhMDAgYTAxIGEwMiBhMDMgICBiMDAgYjAxIGIwMiBiMDMKLSAgICAvLyBhMTAgYTExIGExMiBhMTMgICBiMTAgYjExIGIxMiBiMTMKLSAgICAvLyBhMjAgYTIxIGEyMiBhMjMgICBiMjAgYjIxIGIyMiBiMjMKLSAgICAvLyBhMzAgYTMxIGEzMiBhMzMgICBiMzAgYjMxIGIzMiBiMzMKLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTBfMCA9IF9tbV91bnBhY2tsb19lcGkxNih0bXAwLCB0bXAxKTsKLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTBfMSA9IF9tbV91bnBhY2tsb19lcGkxNih0bXAyLCB0bXAzKTsKLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTBfMiA9IF9tbV91bnBhY2toaV9lcGkxNih0bXAwLCB0bXAxKTsKLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTBfMyA9IF9tbV91bnBhY2toaV9lcGkxNih0bXAyLCB0bXAzKTsKLSAgICAvLyBhMDAgYTEwIGEwMSBhMTEgICBhMDIgYTEyIGEwMyBhMTMKLSAgICAvLyBhMjAgYTMwIGEyMSBhMzEgICBhMjIgYTMyIGEyMyBhMzMKLSAgICAvLyBiMDAgYjEwIGIwMSBiMTEgICBiMDIgYjEyIGIwMyBiMTMKLSAgICAvLyBiMjAgYjMwIGIyMSBiMzEgICBiMjIgYjMyIGIyMyBiMzMKLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTFfMCA9IF9tbV91bnBhY2tsb19lcGkzMih0cmFuc3Bvc2UwXzAsIHRyYW5zcG9zZTBfMSk7Ci0gICAgY29uc3QgX19tMTI4aSB0cmFuc3Bvc2UxXzEgPSBfbW1fdW5wYWNrbG9fZXBpMzIodHJhbnNwb3NlMF8yLCB0cmFuc3Bvc2UwXzMpOwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMV8yID0gX21tX3VucGFja2hpX2VwaTMyKHRyYW5zcG9zZTBfMCwgdHJhbnNwb3NlMF8xKTsKLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTFfMyA9IF9tbV91bnBhY2toaV9lcGkzMih0cmFuc3Bvc2UwXzIsIHRyYW5zcG9zZTBfMyk7Ci0gICAgLy8gYTAwIGExMCBhMjAgYTMwIGEwMSBhMTEgYTIxIGEzMQotICAgIC8vIGIwMCBiMTAgYjIwIGIzMCBiMDEgYjExIGIyMSBiMzEKLSAgICAvLyBhMDIgYTEyIGEyMiBhMzIgYTAzIGExMyBhMjMgYTMzCi0gICAgLy8gYjAyIGIxMiBhMjIgYjMyIGIwMyBiMTMgYjIzIGIzMwotICAgIFQwID0gX21tX3VucGFja2xvX2VwaTY0KHRyYW5zcG9zZTFfMCwgdHJhbnNwb3NlMV8xKTsKLSAgICBUMSA9IF9tbV91bnBhY2toaV9lcGk2NCh0cmFuc3Bvc2UxXzAsIHRyYW5zcG9zZTFfMSk7Ci0gICAgVDIgPSBfbW1fdW5wYWNrbG9fZXBpNjQodHJhbnNwb3NlMV8yLCB0cmFuc3Bvc2UxXzMpOwotICAgIFQzID0gX21tX3VucGFja2hpX2VwaTY0KHRyYW5zcG9zZTFfMiwgdHJhbnNwb3NlMV8zKTsKLSAgICAvLyBhMDAgYTEwIGEyMCBhMzAgICBiMDAgYjEwIGIyMCBiMzAKLSAgICAvLyBhMDEgYTExIGEyMSBhMzEgICBiMDEgYjExIGIyMSBiMzEKLSAgICAvLyBhMDIgYTEyIGEyMiBhMzIgICBiMDIgYjEyIGIyMiBiMzIKLSAgICAvLyBhMDMgYTEzIGEyMyBhMzMgICBiMDMgYjEzIGIyMyBiMzMKLSAgfQotCi0gIC8vIEhvcml6b250YWwgcGFzcyBhbmQgc3Vic2VxdWVudCB0cmFuc3Bvc2UuCi0gIHsKLSAgICAvLyBGaXJzdCBwYXNzLCBjIGFuZCBkIGNhbGN1bGF0aW9ucyBhcmUgbG9uZ2VyIGJlY2F1c2Ugb2YgdGhlICJ0cmljayIKLSAgICAvLyBtdWx0aXBsaWNhdGlvbnMuCi0gICAgY29uc3QgX19tMTI4aSBmb3VyID0gX21tX3NldDFfZXBpMTYoNCk7Ci0gICAgY29uc3QgX19tMTI4aSBkYyA9IF9tbV9hZGRfZXBpMTYoVDAsIGZvdXIpOwotICAgIGNvbnN0IF9fbTEyOGkgYSA9ICBfbW1fYWRkX2VwaTE2KGRjLCBUMik7Ci0gICAgY29uc3QgX19tMTI4aSBiID0gIF9tbV9zdWJfZXBpMTYoZGMsIFQyKTsKLSAgICAvLyBjID0gTVVMKFQxLCBLMikgLSBNVUwoVDMsIEsxKSA9IE1VTChUMSwgazIpIC0gTVVMKFQzLCBrMSkgKyBUMSAtIFQzCi0gICAgY29uc3QgX19tMTI4aSBjMSA9IF9tbV9tdWxoaV9lcGkxNihUMSwgazIpOwotICAgIGNvbnN0IF9fbTEyOGkgYzIgPSBfbW1fbXVsaGlfZXBpMTYoVDMsIGsxKTsKLSAgICBjb25zdCBfX20xMjhpIGMzID0gX21tX3N1Yl9lcGkxNihUMSwgVDMpOwotICAgIGNvbnN0IF9fbTEyOGkgYzQgPSBfbW1fc3ViX2VwaTE2KGMxLCBjMik7Ci0gICAgY29uc3QgX19tMTI4aSBjID0gX21tX2FkZF9lcGkxNihjMywgYzQpOwotICAgIC8vIGQgPSBNVUwoVDEsIEsxKSArIE1VTChUMywgSzIpID0gTVVMKFQxLCBrMSkgKyBNVUwoVDMsIGsyKSArIFQxICsgVDMKLSAgICBjb25zdCBfX20xMjhpIGQxID0gX21tX211bGhpX2VwaTE2KFQxLCBrMSk7Ci0gICAgY29uc3QgX19tMTI4aSBkMiA9IF9tbV9tdWxoaV9lcGkxNihUMywgazIpOwotICAgIGNvbnN0IF9fbTEyOGkgZDMgPSBfbW1fYWRkX2VwaTE2KFQxLCBUMyk7Ci0gICAgY29uc3QgX19tMTI4aSBkNCA9IF9tbV9hZGRfZXBpMTYoZDEsIGQyKTsKLSAgICBjb25zdCBfX20xMjhpIGQgPSBfbW1fYWRkX2VwaTE2KGQzLCBkNCk7Ci0KLSAgICAvLyBTZWNvbmQgcGFzcy4KLSAgICBjb25zdCBfX20xMjhpIHRtcDAgPSBfbW1fYWRkX2VwaTE2KGEsIGQpOwotICAgIGNvbnN0IF9fbTEyOGkgdG1wMSA9IF9tbV9hZGRfZXBpMTYoYiwgYyk7Ci0gICAgY29uc3QgX19tMTI4aSB0bXAyID0gX21tX3N1Yl9lcGkxNihiLCBjKTsKLSAgICBjb25zdCBfX20xMjhpIHRtcDMgPSBfbW1fc3ViX2VwaTE2KGEsIGQpOwotICAgIGNvbnN0IF9fbTEyOGkgc2hpZnRlZDAgPSBfbW1fc3JhaV9lcGkxNih0bXAwLCAzKTsKLSAgICBjb25zdCBfX20xMjhpIHNoaWZ0ZWQxID0gX21tX3NyYWlfZXBpMTYodG1wMSwgMyk7Ci0gICAgY29uc3QgX19tMTI4aSBzaGlmdGVkMiA9IF9tbV9zcmFpX2VwaTE2KHRtcDIsIDMpOwotICAgIGNvbnN0IF9fbTEyOGkgc2hpZnRlZDMgPSBfbW1fc3JhaV9lcGkxNih0bXAzLCAzKTsKLQotICAgIC8vIFRyYW5zcG9zZSB0aGUgdHdvIDR4NC4KLSAgICAvLyBhMDAgYTAxIGEwMiBhMDMgICBiMDAgYjAxIGIwMiBiMDMKLSAgICAvLyBhMTAgYTExIGExMiBhMTMgICBiMTAgYjExIGIxMiBiMTMKLSAgICAvLyBhMjAgYTIxIGEyMiBhMjMgICBiMjAgYjIxIGIyMiBiMjMKLSAgICAvLyBhMzAgYTMxIGEzMiBhMzMgICBiMzAgYjMxIGIzMiBiMzMKLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTBfMCA9IF9tbV91bnBhY2tsb19lcGkxNihzaGlmdGVkMCwgc2hpZnRlZDEpOwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMF8xID0gX21tX3VucGFja2xvX2VwaTE2KHNoaWZ0ZWQyLCBzaGlmdGVkMyk7Ci0gICAgY29uc3QgX19tMTI4aSB0cmFuc3Bvc2UwXzIgPSBfbW1fdW5wYWNraGlfZXBpMTYoc2hpZnRlZDAsIHNoaWZ0ZWQxKTsKLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTBfMyA9IF9tbV91bnBhY2toaV9lcGkxNihzaGlmdGVkMiwgc2hpZnRlZDMpOwotICAgIC8vIGEwMCBhMTAgYTAxIGExMSAgIGEwMiBhMTIgYTAzIGExMwotICAgIC8vIGEyMCBhMzAgYTIxIGEzMSAgIGEyMiBhMzIgYTIzIGEzMwotICAgIC8vIGIwMCBiMTAgYjAxIGIxMSAgIGIwMiBiMTIgYjAzIGIxMwotICAgIC8vIGIyMCBiMzAgYjIxIGIzMSAgIGIyMiBiMzIgYjIzIGIzMwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMV8wID0gX21tX3VucGFja2xvX2VwaTMyKHRyYW5zcG9zZTBfMCwgdHJhbnNwb3NlMF8xKTsKLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTFfMSA9IF9tbV91bnBhY2tsb19lcGkzMih0cmFuc3Bvc2UwXzIsIHRyYW5zcG9zZTBfMyk7Ci0gICAgY29uc3QgX19tMTI4aSB0cmFuc3Bvc2UxXzIgPSBfbW1fdW5wYWNraGlfZXBpMzIodHJhbnNwb3NlMF8wLCB0cmFuc3Bvc2UwXzEpOwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMV8zID0gX21tX3VucGFja2hpX2VwaTMyKHRyYW5zcG9zZTBfMiwgdHJhbnNwb3NlMF8zKTsKLSAgICAvLyBhMDAgYTEwIGEyMCBhMzAgYTAxIGExMSBhMjEgYTMxCi0gICAgLy8gYjAwIGIxMCBiMjAgYjMwIGIwMSBiMTEgYjIxIGIzMQotICAgIC8vIGEwMiBhMTIgYTIyIGEzMiBhMDMgYTEzIGEyMyBhMzMKLSAgICAvLyBiMDIgYjEyIGEyMiBiMzIgYjAzIGIxMyBiMjMgYjMzCi0gICAgVDAgPSBfbW1fdW5wYWNrbG9fZXBpNjQodHJhbnNwb3NlMV8wLCB0cmFuc3Bvc2UxXzEpOwotICAgIFQxID0gX21tX3VucGFja2hpX2VwaTY0KHRyYW5zcG9zZTFfMCwgdHJhbnNwb3NlMV8xKTsKLSAgICBUMiA9IF9tbV91bnBhY2tsb19lcGk2NCh0cmFuc3Bvc2UxXzIsIHRyYW5zcG9zZTFfMyk7Ci0gICAgVDMgPSBfbW1fdW5wYWNraGlfZXBpNjQodHJhbnNwb3NlMV8yLCB0cmFuc3Bvc2UxXzMpOwotICAgIC8vIGEwMCBhMTAgYTIwIGEzMCAgIGIwMCBiMTAgYjIwIGIzMAotICAgIC8vIGEwMSBhMTEgYTIxIGEzMSAgIGIwMSBiMTEgYjIxIGIzMQotICAgIC8vIGEwMiBhMTIgYTIyIGEzMiAgIGIwMiBiMTIgYjIyIGIzMgotICAgIC8vIGEwMyBhMTMgYTIzIGEzMyAgIGIwMyBiMTMgYjIzIGIzMwotICB9Ci0KLSAgLy8gQWRkIGludmVyc2UgdHJhbnNmb3JtIHRvICdkc3QnIGFuZCBzdG9yZS4KLSAgewotICAgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7Ci0gICAgLy8gTG9hZCB0aGUgcmVmZXJlbmNlKHMpLgotICAgIF9fbTEyOGkgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MzsKLSAgICBpZiAoZG9fdHdvKSB7Ci0gICAgICAvLyBMb2FkIGVpZ2h0IGJ5dGVzL3BpeGVscyBwZXIgbGluZS4KLSAgICAgIGRzdDAgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSZkc3RbMCAqIEJQU10pOwotICAgICAgZHN0MSA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJmRzdFsxICogQlBTXSk7Ci0gICAgICBkc3QyID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmZHN0WzIgKiBCUFNdKTsKLSAgICAgIGRzdDMgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSZkc3RbMyAqIEJQU10pOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBMb2FkIGZvdXIgYnl0ZXMvcGl4ZWxzIHBlciBsaW5lLgotICAgICAgZHN0MCA9IF9tbV9jdnRzaTMyX3NpMTI4KCooaW50KikmZHN0WzAgKiBCUFNdKTsKLSAgICAgIGRzdDEgPSBfbW1fY3Z0c2kzMl9zaTEyOCgqKGludCopJmRzdFsxICogQlBTXSk7Ci0gICAgICBkc3QyID0gX21tX2N2dHNpMzJfc2kxMjgoKihpbnQqKSZkc3RbMiAqIEJQU10pOwotICAgICAgZHN0MyA9IF9tbV9jdnRzaTMyX3NpMTI4KCooaW50KikmZHN0WzMgKiBCUFNdKTsKLSAgICB9Ci0gICAgLy8gQ29udmVydCB0byAxNmIuCi0gICAgZHN0MCA9IF9tbV91bnBhY2tsb19lcGk4KGRzdDAsIHplcm8pOwotICAgIGRzdDEgPSBfbW1fdW5wYWNrbG9fZXBpOChkc3QxLCB6ZXJvKTsKLSAgICBkc3QyID0gX21tX3VucGFja2xvX2VwaTgoZHN0MiwgemVybyk7Ci0gICAgZHN0MyA9IF9tbV91bnBhY2tsb19lcGk4KGRzdDMsIHplcm8pOwotICAgIC8vIEFkZCB0aGUgaW52ZXJzZSB0cmFuc2Zvcm0ocykuCi0gICAgZHN0MCA9IF9tbV9hZGRfZXBpMTYoZHN0MCwgVDApOwotICAgIGRzdDEgPSBfbW1fYWRkX2VwaTE2KGRzdDEsIFQxKTsKLSAgICBkc3QyID0gX21tX2FkZF9lcGkxNihkc3QyLCBUMik7Ci0gICAgZHN0MyA9IF9tbV9hZGRfZXBpMTYoZHN0MywgVDMpOwotICAgIC8vIFVuc2lnbmVkIHNhdHVyYXRlIHRvIDhiLgotICAgIGRzdDAgPSBfbW1fcGFja3VzX2VwaTE2KGRzdDAsIGRzdDApOwotICAgIGRzdDEgPSBfbW1fcGFja3VzX2VwaTE2KGRzdDEsIGRzdDEpOwotICAgIGRzdDIgPSBfbW1fcGFja3VzX2VwaTE2KGRzdDIsIGRzdDIpOwotICAgIGRzdDMgPSBfbW1fcGFja3VzX2VwaTE2KGRzdDMsIGRzdDMpOwotICAgIC8vIFN0b3JlIHRoZSByZXN1bHRzLgotICAgIGlmIChkb190d28pIHsKLSAgICAgIC8vIFN0b3JlIGVpZ2h0IGJ5dGVzL3BpeGVscyBwZXIgbGluZS4KLSAgICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKSZkc3RbMCAqIEJQU10sIGRzdDApOwotICAgICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopJmRzdFsxICogQlBTXSwgZHN0MSk7Ci0gICAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikmZHN0WzIgKiBCUFNdLCBkc3QyKTsKLSAgICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKSZkc3RbMyAqIEJQU10sIGRzdDMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBTdG9yZSBmb3VyIGJ5dGVzL3BpeGVscyBwZXIgbGluZS4KLSAgICAgICooKGludDMyX3QgKikmZHN0WzAgKiBCUFNdKSA9IF9tbV9jdnRzaTEyOF9zaTMyKGRzdDApOwotICAgICAgKigoaW50MzJfdCAqKSZkc3RbMSAqIEJQU10pID0gX21tX2N2dHNpMTI4X3NpMzIoZHN0MSk7Ci0gICAgICAqKChpbnQzMl90ICopJmRzdFsyICogQlBTXSkgPSBfbW1fY3Z0c2kxMjhfc2kzMihkc3QyKTsKLSAgICAgICooKGludDMyX3QgKikmZHN0WzMgKiBCUFNdKSA9IF9tbV9jdnRzaTEyOF9zaTMyKGRzdDMpOwotICAgIH0KLSAgfQotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTG9vcCBGaWx0ZXIgKFBhcmFncmFwaCAxNSkKLQotLy8gQ29tcHV0ZSBhYnMocCAtIHEpID0gc3VicyhwIC0gcSkgT1Igc3VicyhxIC0gcCkKLSNkZWZpbmUgTU1fQUJTKHAsIHEpICBfbW1fb3Jfc2kxMjgoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgX21tX3N1YnNfZXB1OCgocSksIChwKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIF9tbV9zdWJzX2VwdTgoKHApLCAocSkpKQotCi0vLyBTaGlmdCBlYWNoIGJ5dGUgb2YgImEiIGJ5IE4gYml0cyB3aGlsZSBwcmVzZXJ2aW5nIGJ5IHRoZSBzaWduIGJpdC4KLS8vCi0vLyBJdCBmaXJzdCBzaGlmdHMgdGhlIGxvd2VyIGJ5dGVzIG9mIHRoZSB3b3JkcyBhbmQgdGhlbiB0aGUgdXBwZXIgYnl0ZXMgYW5kCi0vLyB0aGVuIG1lcmdlcyB0aGUgcmVzdWx0cyB0b2dldGhlci4KLSNkZWZpbmUgU0lHTkVEX1NISUZUX04oYSwgTikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIF9fbTEyOGkgdCA9IGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB0ID0gX21tX3NsbGlfZXBpMTYodCwgOCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdCA9IF9tbV9zcmFpX2VwaTE2KHQsIE4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHQgPSBfbW1fc3JsaV9lcGkxNih0LCA4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgYSA9IF9tbV9zcmFpX2VwaTE2KGEsIE4gKyA4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGEgPSBfbW1fc2xsaV9lcGkxNihhLCA4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgYSA9IF9tbV9vcl9zaTEyOCh0LCBhKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgRkxJUF9TSUdOX0JJVDIoYSwgYikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGEgPSBfbW1feG9yX3NpMTI4KGEsIHNpZ25fYml0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBiID0gX21tX3hvcl9zaTEyOChiLCBzaWduX2JpdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotI2RlZmluZSBGTElQX1NJR05fQklUNChhLCBiLCBjLCBkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRkxJUF9TSUdOX0JJVDIoYSwgYik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZMSVBfU0lHTl9CSVQyKGMsIGQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0jZGVmaW5lIEdFVF9OT1RIRVYocDEsIHAwLCBxMCwgcTEsIGhldl90aHJlc2gsIG5vdF9oZXYpIHsgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgX19tMTI4aSB0XzEgPSBNTV9BQlMocDEsIHAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IF9fbTEyOGkgdF8yID0gTU1fQUJTKHExLCBxMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgX19tMTI4aSBoID0gX21tX3NldDFfZXBpOChoZXZfdGhyZXNoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IF9fbTEyOGkgdF8zID0gX21tX3N1YnNfZXB1OCh0XzEsIGgpOyAgLyogYWJzKHAxIC0gcDApIC0gaGV2X3RyZXNoICovICAgXAotICBjb25zdCBfX20xMjhpIHRfNCA9IF9tbV9zdWJzX2VwdTgodF8yLCBoKTsgIC8qIGFicyhxMSAtIHEwKSAtIGhldl90cmVzaCAqLyAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIG5vdF9oZXYgPSBfbW1fb3Jfc2kxMjgodF8zLCB0XzQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBub3RfaGV2ID0gX21tX2NtcGVxX2VwaTgobm90X2hldiwgemVybyk7IC8qIG5vdF9oZXYgPD0gdDEgJiYgbm90X2hldiA8PSB0MiAqL1wKLX0KLQotI2RlZmluZSBHRVRfQkFTRV9ERUxUQShwMSwgcDAsIHEwLCBxMSwgbykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgX19tMTI4aSBxcDAgPSBfbW1fc3Vic19lcGk4KHEwLCBwMCk7ICAvKiBxMCAtIHAwICovICAgICAgICAgICAgICAgICAgICBcCi0gIG8gPSBfbW1fc3Vic19lcGk4KHAxLCBxMSk7ICAgICAgICAgICAgLyogcDEgLSBxMSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBvID0gX21tX2FkZHNfZXBpOChvLCBxcDApOyAgICAgICAgICAgIC8qIHAxIC0gcTEgKyAxICogKHEwIC0gcDApICovICAgICAgICAgIFwKLSAgbyA9IF9tbV9hZGRzX2VwaTgobywgcXAwKTsgICAgICAgICAgICAvKiBwMSAtIHExICsgMiAqIChxMCAtIHAwKSAqLyAgICAgICAgICBcCi0gIG8gPSBfbW1fYWRkc19lcGk4KG8sIHFwMCk7ICAgICAgICAgICAgLyogcDEgLSBxMSArIDMgKiAocTAgLSBwMCkgKi8gICAgICAgICAgXAotfQotCi0jZGVmaW5lIERPX1NJTVBMRV9GSUxURVIocDAsIHEwLCBmbCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCBfX20xMjhpIHRocmVlID0gX21tX3NldDFfZXBpOCgzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgX19tMTI4aSBmb3VyID0gX21tX3NldDFfZXBpOCg0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIF9fbTEyOGkgdjMgPSBfbW1fYWRkc19lcGk4KGZsLCB0aHJlZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBfX20xMjhpIHY0ID0gX21tX2FkZHNfZXBpOChmbCwgZm91cik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIC8qIERvICs0IHNpZGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBTSUdORURfU0hJRlRfTih2NCwgMyk7ICAgICAgICAgICAgICAgIC8qIHY0ID4+IDMgICovICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgcTAgPSBfbW1fc3Vic19lcGk4KHEwLCB2NCk7ICAgICAgICAgICAvKiBxMCAtPSB2NCAqLyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAvKiBOb3cgZG8gKzMgc2lkZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgU0lHTkVEX1NISUZUX04odjMsIDMpOyAgICAgICAgICAgICAgICAvKiB2MyA+PiAzICAqLyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHAwID0gX21tX2FkZHNfZXBpOChwMCwgdjMpOyAgICAgICAgICAgLyogcDAgKz0gdjMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0vLyBVcGRhdGVzIHZhbHVlcyBvZiAyIHBpeGVscyBhdCBNQiBlZGdlIGR1cmluZyBjb21wbGV4IGZpbHRlcmluZy4KLS8vIFVwZGF0ZSBvcGVyYXRpb25zOgotLy8gcSA9IHEgLSBkZWx0YSBhbmQgcCA9IHAgKyBkZWx0YTsgd2hlcmUgZGVsdGEgPSBbKGFfaGkgPj4gNyksIChhX2xvID4+IDcpXQotI2RlZmluZSBVUERBVEVfMlBJWEVMUyhwaSwgcWksIGFfbG8sIGFfaGkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgX19tMTI4aSBhX2xvNyA9IF9tbV9zcmFpX2VwaTE2KGFfbG8sIDcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IF9fbTEyOGkgYV9oaTcgPSBfbW1fc3JhaV9lcGkxNihhX2hpLCA3KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCBfX20xMjhpIGRlbHRhID0gX21tX3BhY2tzX2VwaTE2KGFfbG83LCBhX2hpNyk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgcGkgPSBfbW1fYWRkc19lcGk4KHBpLCBkZWx0YSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHFpID0gX21tX3N1YnNfZXBpOChxaSwgZGVsdGEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi1zdGF0aWMgdm9pZCBOZWVkc0ZpbHRlcihjb25zdCBfX20xMjhpKiBwMSwgY29uc3QgX19tMTI4aSogcDAsIGNvbnN0IF9fbTEyOGkqIHEwLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogcTEsIGludCB0aHJlc2gsIF9fbTEyOGkgKm1hc2spIHsKLSAgX19tMTI4aSB0MSA9IE1NX0FCUygqcDEsICpxMSk7ICAgICAgICAvLyBhYnMocDEgLSBxMSkKLSAgKm1hc2sgPSBfbW1fc2V0MV9lcGk4KDB4RkUpOwotICB0MSA9IF9tbV9hbmRfc2kxMjgodDEsICptYXNrKTsgICAgICAgIC8vIHNldCBsc2Igb2YgZWFjaCBieXRlIHRvIHplcm8KLSAgdDEgPSBfbW1fc3JsaV9lcGkxNih0MSwgMSk7ICAgICAgICAgICAvLyBhYnMocDEgLSBxMSkgLyAyCi0KLSAgKm1hc2sgPSBNTV9BQlMoKnAwLCAqcTApOyAgICAgICAgICAgICAvLyBhYnMocDAgLSBxMCkKLSAgKm1hc2sgPSBfbW1fYWRkc19lcHU4KCptYXNrLCAqbWFzayk7ICAvLyBhYnMocDAgLSBxMCkgKiAyCi0gICptYXNrID0gX21tX2FkZHNfZXB1OCgqbWFzaywgdDEpOyAgICAgLy8gYWJzKHAwIC0gcTApICogMiArIGFicyhwMSAtIHExKSAvIDIKLQotICB0MSA9IF9tbV9zZXQxX2VwaTgodGhyZXNoKTsKLSAgKm1hc2sgPSBfbW1fc3Vic19lcHU4KCptYXNrLCB0MSk7ICAgICAvLyBtYXNrIDw9IHRocmVzaAotICAqbWFzayA9IF9tbV9jbXBlcV9lcGk4KCptYXNrLCBfbW1fc2V0emVyb19zaTEyOCgpKTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEVkZ2UgZmlsdGVyaW5nIGZ1bmN0aW9ucwotCi0vLyBBcHBsaWVzIGZpbHRlciBvbiAyIHBpeGVscyAocDAgYW5kIHEwKQotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRG9GaWx0ZXIyKGNvbnN0IF9fbTEyOGkqIHAxLCBfX20xMjhpKiBwMCwgX19tMTI4aSogcTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogcTEsIGludCB0aHJlc2gpIHsKLSAgX19tMTI4aSBhLCBtYXNrOwotICBjb25zdCBfX20xMjhpIHNpZ25fYml0ID0gX21tX3NldDFfZXBpOCgweDgwKTsKLSAgY29uc3QgX19tMTI4aSBwMXMgPSBfbW1feG9yX3NpMTI4KCpwMSwgc2lnbl9iaXQpOwotICBjb25zdCBfX20xMjhpIHExcyA9IF9tbV94b3Jfc2kxMjgoKnExLCBzaWduX2JpdCk7Ci0KLSAgTmVlZHNGaWx0ZXIocDEsIHAwLCBxMCwgcTEsIHRocmVzaCwgJm1hc2spOwotCi0gIC8vIGNvbnZlcnQgdG8gc2lnbmVkIHZhbHVlcwotICBGTElQX1NJR05fQklUMigqcDAsICpxMCk7Ci0KLSAgR0VUX0JBU0VfREVMVEEocDFzLCAqcDAsICpxMCwgcTFzLCBhKTsKLSAgYSA9IF9tbV9hbmRfc2kxMjgoYSwgbWFzayk7ICAgICAvLyBtYXNrIGZpbHRlciB2YWx1ZXMgd2UgZG9uJ3QgY2FyZSBhYm91dAotICBET19TSU1QTEVfRklMVEVSKCpwMCwgKnEwLCBhKTsKLQotICAvLyB1bm9mZnNldAotICBGTElQX1NJR05fQklUMigqcDAsICpxMCk7Ci19Ci0KLS8vIEFwcGxpZXMgZmlsdGVyIG9uIDQgcGl4ZWxzIChwMSwgcDAsIHEwIGFuZCBxMSkKLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIERvRmlsdGVyNChfX20xMjhpKiBwMSwgX19tMTI4aSAqcDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogcTAsIF9fbTEyOGkqIHExLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIG1hc2ssIGludCBoZXZfdGhyZXNoKSB7Ci0gIF9fbTEyOGkgbm90X2hldjsKLSAgX19tMTI4aSB0MSwgdDIsIHQzOwotICBjb25zdCBfX20xMjhpIHNpZ25fYml0ID0gX21tX3NldDFfZXBpOCgweDgwKTsKLQotICAvLyBjb21wdXRlIGhldiBtYXNrCi0gIEdFVF9OT1RIRVYoKnAxLCAqcDAsICpxMCwgKnExLCBoZXZfdGhyZXNoLCBub3RfaGV2KTsKLQotICAvLyBjb252ZXJ0IHRvIHNpZ25lZCB2YWx1ZXMKLSAgRkxJUF9TSUdOX0JJVDQoKnAxLCAqcDAsICpxMCwgKnExKTsKLQotICB0MSA9IF9tbV9zdWJzX2VwaTgoKnAxLCAqcTEpOyAgICAgICAgLy8gcDEgLSBxMQotICB0MSA9IF9tbV9hbmRub3Rfc2kxMjgobm90X2hldiwgdDEpOyAgLy8gaGV2KHAxIC0gcTEpCi0gIHQyID0gX21tX3N1YnNfZXBpOCgqcTAsICpwMCk7ICAgICAgICAvLyBxMCAtIHAwCi0gIHQxID0gX21tX2FkZHNfZXBpOCh0MSwgdDIpOyAgICAgICAgICAvLyBoZXYocDEgLSBxMSkgKyAxICogKHEwIC0gcDApCi0gIHQxID0gX21tX2FkZHNfZXBpOCh0MSwgdDIpOyAgICAgICAgICAvLyBoZXYocDEgLSBxMSkgKyAyICogKHEwIC0gcDApCi0gIHQxID0gX21tX2FkZHNfZXBpOCh0MSwgdDIpOyAgICAgICAgICAvLyBoZXYocDEgLSBxMSkgKyAzICogKHEwIC0gcDApCi0gIHQxID0gX21tX2FuZF9zaTEyOCh0MSwgKm1hc2spOyAgICAgICAvLyBtYXNrIGZpbHRlciB2YWx1ZXMgd2UgZG9uJ3QgY2FyZSBhYm91dAotCi0gIC8vIERvICs0IHNpZGUKLSAgdDIgPSBfbW1fc2V0MV9lcGk4KDQpOwotICB0MiA9IF9tbV9hZGRzX2VwaTgodDEsIHQyKTsgICAgICAgIC8vIDMgKiAocTAgLSBwMCkgKyAocDEgLSBxMSkgKyA0Ci0gIFNJR05FRF9TSElGVF9OKHQyLCAzKTsgICAgICAgICAgICAgLy8gKDMgKiAocTAgLSBwMCkgKyBoZXYocDEgLSBxMSkgKyA0KSA+PiAzCi0gIHQzID0gdDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSB0MgotICAqcTAgPSBfbW1fc3Vic19lcGk4KCpxMCwgdDIpOyAgICAgIC8vIHEwIC09IHQyCi0KLSAgLy8gTm93IGRvICszIHNpZGUKLSAgdDIgPSBfbW1fc2V0MV9lcGk4KDMpOwotICB0MiA9IF9tbV9hZGRzX2VwaTgodDEsIHQyKTsgICAgICAgIC8vICszIGluc3RlYWQgb2YgKzQKLSAgU0lHTkVEX1NISUZUX04odDIsIDMpOyAgICAgICAgICAgICAvLyAoMyAqIChxMCAtIHAwKSArIGhldihwMSAtIHExKSArIDMpID4+IDMKLSAgKnAwID0gX21tX2FkZHNfZXBpOCgqcDAsIHQyKTsgICAgICAvLyBwMCArPSB0MgotCi0gIHQyID0gX21tX3NldDFfZXBpOCgxKTsKLSAgdDMgPSBfbW1fYWRkc19lcGk4KHQzLCB0Mik7Ci0gIFNJR05FRF9TSElGVF9OKHQzLCAxKTsgICAgICAgICAgICAgLy8gKDMgKiAocTAgLSBwMCkgKyBoZXYocDEgLSBxMSkgKyA0KSA+PiA0Ci0KLSAgdDMgPSBfbW1fYW5kX3NpMTI4KG5vdF9oZXYsIHQzKTsgICAvLyBpZiAhaGV2Ci0gICpxMSA9IF9tbV9zdWJzX2VwaTgoKnExLCB0Myk7ICAgICAgLy8gcTEgLT0gdDMKLSAgKnAxID0gX21tX2FkZHNfZXBpOCgqcDEsIHQzKTsgICAgICAvLyBwMSArPSB0MwotCi0gIC8vIHVub2Zmc2V0Ci0gIEZMSVBfU0lHTl9CSVQ0KCpwMSwgKnAwLCAqcTAsICpxMSk7Ci19Ci0KLS8vIEFwcGxpZXMgZmlsdGVyIG9uIDYgcGl4ZWxzIChwMiwgcDEsIHAwLCBxMCwgcTEgYW5kIHEyKQotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRG9GaWx0ZXI2KF9fbTEyOGkgKnAyLCBfX20xMjhpKiBwMSwgX19tMTI4aSAqcDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogcTAsIF9fbTEyOGkqIHExLCBfX20xMjhpICpxMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBtYXNrLCBpbnQgaGV2X3RocmVzaCkgewotICBfX20xMjhpIGEsIG5vdF9oZXY7Ci0gIGNvbnN0IF9fbTEyOGkgc2lnbl9iaXQgPSBfbW1fc2V0MV9lcGk4KDB4ODApOwotCi0gIC8vIGNvbXB1dGUgaGV2IG1hc2sKLSAgR0VUX05PVEhFVigqcDEsICpwMCwgKnEwLCAqcTEsIGhldl90aHJlc2gsIG5vdF9oZXYpOwotCi0gIC8vIGNvbnZlcnQgdG8gc2lnbmVkIHZhbHVlcwotICBGTElQX1NJR05fQklUNCgqcDEsICpwMCwgKnEwLCAqcTEpOwotICBGTElQX1NJR05fQklUMigqcDIsICpxMik7Ci0KLSAgR0VUX0JBU0VfREVMVEEoKnAxLCAqcDAsICpxMCwgKnExLCBhKTsKLQotICB7IC8vIGRvIHNpbXBsZSBmaWx0ZXIgb24gcGl4ZWxzIHdpdGggaGV2Ci0gICAgY29uc3QgX19tMTI4aSBtID0gX21tX2FuZG5vdF9zaTEyOChub3RfaGV2LCAqbWFzayk7Ci0gICAgY29uc3QgX19tMTI4aSBmID0gX21tX2FuZF9zaTEyOChhLCBtKTsKLSAgICBET19TSU1QTEVfRklMVEVSKCpwMCwgKnEwLCBmKTsKLSAgfQotICB7IC8vIGRvIHN0cm9uZyBmaWx0ZXIgb24gcGl4ZWxzIHdpdGggbm90IGhldgotICAgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7Ci0gICAgY29uc3QgX19tMTI4aSBuaW5lID0gX21tX3NldDFfZXBpMTYoMHgwOTAwKTsKLSAgICBjb25zdCBfX20xMjhpIHNpeHR5X3RocmVlID0gX21tX3NldDFfZXBpMTYoNjMpOwotCi0gICAgY29uc3QgX19tMTI4aSBtID0gX21tX2FuZF9zaTEyOChub3RfaGV2LCAqbWFzayk7Ci0gICAgY29uc3QgX19tMTI4aSBmID0gX21tX2FuZF9zaTEyOChhLCBtKTsKLSAgICBjb25zdCBfX20xMjhpIGZfbG8gPSBfbW1fdW5wYWNrbG9fZXBpOCh6ZXJvLCBmKTsKLSAgICBjb25zdCBfX20xMjhpIGZfaGkgPSBfbW1fdW5wYWNraGlfZXBpOCh6ZXJvLCBmKTsKLQotICAgIGNvbnN0IF9fbTEyOGkgZjlfbG8gPSBfbW1fbXVsaGlfZXBpMTYoZl9sbywgbmluZSk7ICAgLy8gRmlsdGVyIChsbykgKiA5Ci0gICAgY29uc3QgX19tMTI4aSBmOV9oaSA9IF9tbV9tdWxoaV9lcGkxNihmX2hpLCBuaW5lKTsgICAvLyBGaWx0ZXIgKGhpKSAqIDkKLSAgICBjb25zdCBfX20xMjhpIGYxOF9sbyA9IF9tbV9hZGRfZXBpMTYoZjlfbG8sIGY5X2xvKTsgIC8vIEZpbHRlciAobG8pICogMTgKLSAgICBjb25zdCBfX20xMjhpIGYxOF9oaSA9IF9tbV9hZGRfZXBpMTYoZjlfaGksIGY5X2hpKTsgIC8vIEZpbHRlciAoaGkpICogMTgKLQotICAgIGNvbnN0IF9fbTEyOGkgYTJfbG8gPSBfbW1fYWRkX2VwaTE2KGY5X2xvLCBzaXh0eV90aHJlZSk7ICAvLyBGaWx0ZXIgKiA5ICsgNjMKLSAgICBjb25zdCBfX20xMjhpIGEyX2hpID0gX21tX2FkZF9lcGkxNihmOV9oaSwgc2l4dHlfdGhyZWUpOyAgLy8gRmlsdGVyICogOSArIDYzCi0KLSAgICBjb25zdCBfX20xMjhpIGExX2xvID0gX21tX2FkZF9lcGkxNihmMThfbG8sIHNpeHR5X3RocmVlKTsgIC8vIEYuLi4gKiAxOCArIDYzCi0gICAgY29uc3QgX19tMTI4aSBhMV9oaSA9IF9tbV9hZGRfZXBpMTYoZjE4X2hpLCBzaXh0eV90aHJlZSk7ICAvLyBGLi4uICogMTggKyA2MwotCi0gICAgY29uc3QgX19tMTI4aSBhMF9sbyA9IF9tbV9hZGRfZXBpMTYoZjE4X2xvLCBhMl9sbyk7ICAvLyBGaWx0ZXIgKiAyNyArIDYzCi0gICAgY29uc3QgX19tMTI4aSBhMF9oaSA9IF9tbV9hZGRfZXBpMTYoZjE4X2hpLCBhMl9oaSk7ICAvLyBGaWx0ZXIgKiAyNyArIDYzCi0KLSAgICBVUERBVEVfMlBJWEVMUygqcDIsICpxMiwgYTJfbG8sIGEyX2hpKTsKLSAgICBVUERBVEVfMlBJWEVMUygqcDEsICpxMSwgYTFfbG8sIGExX2hpKTsKLSAgICBVUERBVEVfMlBJWEVMUygqcDAsICpxMCwgYTBfbG8sIGEwX2hpKTsKLSAgfQotCi0gIC8vIHVub2Zmc2V0Ci0gIEZMSVBfU0lHTl9CSVQ0KCpwMSwgKnAwLCAqcTAsICpxMSk7Ci0gIEZMSVBfU0lHTl9CSVQyKCpwMiwgKnEyKTsKLX0KLQotLy8gcmVhZHMgOCByb3dzIGFjcm9zcyBhIHZlcnRpY2FsIGVkZ2UuCi0vLwotLy8gVE9ETyhzb21uYXRoKTogSW52ZXN0aWdhdGUgX21tX3NodWZmbGUqIGFsc28gc2VlIGlmIGl0IGNhbiBiZSBicm9rZW4gaW50bwotLy8gdHdvIExvYWQ0eDQoKSB0byBhdm9pZCBjb2RlIGR1cGxpY2F0aW9uLgotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgTG9hZDh4NChjb25zdCB1aW50OF90KiBiLCBpbnQgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBwLCBfX20xMjhpKiBxKSB7Ci0gIF9fbTEyOGkgdDEsIHQyOwotCi0gIC8vIExvYWQgMHRoLCAxc3QsIDR0aCBhbmQgNXRoIHJvd3MKLSAgX19tMTI4aSByMCA9ICBfbW1fY3Z0c2kzMl9zaTEyOCgqKChpbnQqKSZiWzAgKiBzdHJpZGVdKSk7ICAvLyAwMyAwMiAwMSAwMAotICBfX20xMjhpIHIxID0gIF9tbV9jdnRzaTMyX3NpMTI4KCooKGludCopJmJbMSAqIHN0cmlkZV0pKTsgIC8vIDEzIDEyIDExIDEwCi0gIF9fbTEyOGkgcjQgPSAgX21tX2N2dHNpMzJfc2kxMjgoKigoaW50KikmYls0ICogc3RyaWRlXSkpOyAgLy8gNDMgNDIgNDEgNDAKLSAgX19tMTI4aSByNSA9ICBfbW1fY3Z0c2kzMl9zaTEyOCgqKChpbnQqKSZiWzUgKiBzdHJpZGVdKSk7ICAvLyA1MyA1MiA1MSA1MAotCi0gIHIwID0gX21tX3VucGFja2xvX2VwaTMyKHIwLCByNCk7ICAgICAgICAgICAgICAgLy8gNDMgNDIgNDEgNDAgMDMgMDIgMDEgMDAKLSAgcjEgPSBfbW1fdW5wYWNrbG9fZXBpMzIocjEsIHI1KTsgICAgICAgICAgICAgICAvLyA1MyA1MiA1MSA1MCAxMyAxMiAxMSAxMAotCi0gIC8vIHQxID0gNTMgNDMgNTIgNDIgNTEgNDEgNTAgNDAgMTMgMDMgMTIgMDIgMTEgMDEgMTAgMDAKLSAgdDEgPSBfbW1fdW5wYWNrbG9fZXBpOChyMCwgcjEpOwotCi0gIC8vIExvYWQgMm5kLCAzcmQsIDZ0aCBhbmQgN3RoIHJvd3MKLSAgcjAgPSAgX21tX2N2dHNpMzJfc2kxMjgoKigoaW50KikmYlsyICogc3RyaWRlXSkpOyAgICAgICAgICAvLyAyMyAyMiAyMSAyMgotICByMSA9ICBfbW1fY3Z0c2kzMl9zaTEyOCgqKChpbnQqKSZiWzMgKiBzdHJpZGVdKSk7ICAgICAgICAgIC8vIDMzIDMyIDMxIDMwCi0gIHI0ID0gIF9tbV9jdnRzaTMyX3NpMTI4KCooKGludCopJmJbNiAqIHN0cmlkZV0pKTsgICAgICAgICAgLy8gNjMgNjIgNjEgNjAKLSAgcjUgPSAgX21tX2N2dHNpMzJfc2kxMjgoKigoaW50KikmYls3ICogc3RyaWRlXSkpOyAgICAgICAgICAvLyA3MyA3MiA3MSA3MAotCi0gIHIwID0gX21tX3VucGFja2xvX2VwaTMyKHIwLCByNCk7ICAgICAgICAgICAgICAgLy8gNjMgNjIgNjEgNjAgMjMgMjIgMjEgMjAKLSAgcjEgPSBfbW1fdW5wYWNrbG9fZXBpMzIocjEsIHI1KTsgICAgICAgICAgICAgICAvLyA3MyA3MiA3MSA3MCAzMyAzMiAzMSAzMAotCi0gIC8vIHQyID0gNzMgNjMgNzIgNjIgNzEgNjEgNzAgNjAgMzMgMjMgMzIgMjIgMzEgMjEgMzAgMjAKLSAgdDIgPSBfbW1fdW5wYWNrbG9fZXBpOChyMCwgcjEpOwotCi0gIC8vIHQxID0gMzMgMjMgMTMgMDMgMzIgMjIgMTIgMDIgMzEgMjEgMTEgMDEgMzAgMjAgMTAgMDAKLSAgLy8gdDIgPSA3MyA2MyA1MyA0MyA3MiA2MiA1MiA0MiA3MSA2MSA1MSA0MSA3MCA2MCA1MCA0MAotICByMCA9IHQxOwotICB0MSA9IF9tbV91bnBhY2tsb19lcGkxNih0MSwgdDIpOwotICB0MiA9IF9tbV91bnBhY2toaV9lcGkxNihyMCwgdDIpOwotCi0gIC8vICpwID0gNzEgNjEgNTEgNDEgMzEgMjEgMTEgMDEgNzAgNjAgNTAgNDAgMzAgMjAgMTAgMDAKLSAgLy8gKnEgPSA3MyA2MyA1MyA0MyAzMyAyMyAxMyAwMyA3MiA2MiA1MiA0MiAzMiAyMiAxMiAwMgotICAqcCA9IF9tbV91bnBhY2tsb19lcGkzMih0MSwgdDIpOwotICAqcSA9IF9tbV91bnBhY2toaV9lcGkzMih0MSwgdDIpOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBMb2FkMTZ4NChjb25zdCB1aW50OF90KiByMCwgY29uc3QgdWludDhfdCogcjgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogcDEsIF9fbTEyOGkqIHAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogcTAsIF9fbTEyOGkqIHExKSB7Ci0gIF9fbTEyOGkgdDEsIHQyOwotICAvLyBBc3N1bWUgdGhlIHBpeGVscyBhcm91bmQgdGhlIGVkZ2UgKHwpIGFyZSBudW1iZXJlZCBhcyBmb2xsb3dzCi0gIC8vICAgICAgICAgICAgICAgIDAwIDAxIHwgMDIgMDMKLSAgLy8gICAgICAgICAgICAgICAgMTAgMTEgfCAxMiAxMwotICAvLyAgICAgICAgICAgICAgICAgLi4uICB8ICAuLi4KLSAgLy8gICAgICAgICAgICAgICAgZTAgZTEgfCBlMiBlMwotICAvLyAgICAgICAgICAgICAgICBmMCBmMSB8IGYyIGYzCi0gIC8vCi0gIC8vIHIwIGlzIHBvaW50aW5nIHRvIHRoZSAwdGggcm93ICgwMCkKLSAgLy8gcjggaXMgcG9pbnRpbmcgdG8gdGhlIDh0aCByb3cgKDgwKQotCi0gIC8vIExvYWQKLSAgLy8gcDEgPSA3MSA2MSA1MSA0MSAzMSAyMSAxMSAwMSA3MCA2MCA1MCA0MCAzMCAyMCAxMCAwMAotICAvLyBxMCA9IDczIDYzIDUzIDQzIDMzIDIzIDEzIDAzIDcyIDYyIDUyIDQyIDMyIDIyIDEyIDAyCi0gIC8vIHAwID0gZjEgZTEgZDEgYzEgYjEgYTEgOTEgODEgZjAgZTAgZDAgYzAgYjAgYTAgOTAgODAKLSAgLy8gcTEgPSBmMyBlMyBkMyBjMyBiMyBhMyA5MyA4MyBmMiBlMiBkMiBjMiBiMiBhMiA5MiA4MgotICBMb2FkOHg0KHIwLCBzdHJpZGUsIHAxLCBxMCk7Ci0gIExvYWQ4eDQocjgsIHN0cmlkZSwgcDAsIHExKTsKLQotICB0MSA9ICpwMTsKLSAgdDIgPSAqcTA7Ci0gIC8vIHAxID0gZjAgZTAgZDAgYzAgYjAgYTAgOTAgODAgNzAgNjAgNTAgNDAgMzAgMjAgMTAgMDAKLSAgLy8gcDAgPSBmMSBlMSBkMSBjMSBiMSBhMSA5MSA4MSA3MSA2MSA1MSA0MSAzMSAyMSAxMSAwMQotICAvLyBxMCA9IGYyIGUyIGQyIGMyIGIyIGEyIDkyIDgyIDcyIDYyIDUyIDQyIDMyIDIyIDEyIDAyCi0gIC8vIHExID0gZjMgZTMgZDMgYzMgYjMgYTMgOTMgODMgNzMgNjMgNTMgNDMgMzMgMjMgMTMgMDMKLSAgKnAxID0gX21tX3VucGFja2xvX2VwaTY0KHQxLCAqcDApOwotICAqcDAgPSBfbW1fdW5wYWNraGlfZXBpNjQodDEsICpwMCk7Ci0gICpxMCA9IF9tbV91bnBhY2tsb19lcGk2NCh0MiwgKnExKTsKLSAgKnExID0gX21tX3VucGFja2hpX2VwaTY0KHQyLCAqcTEpOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBTdG9yZTR4NChfX20xMjhpKiB4LCB1aW50OF90KiBkc3QsIGludCBzdHJpZGUpIHsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCA0OyArK2ksIGRzdCArPSBzdHJpZGUpIHsKLSAgICAqKChpbnQzMl90Kilkc3QpID0gX21tX2N2dHNpMTI4X3NpMzIoKngpOwotICAgICp4ID0gX21tX3NybGlfc2kxMjgoKngsIDQpOwotICB9Ci19Ci0KLS8vIFRyYW5zcG9zZSBiYWNrIGFuZCBzdG9yZQotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgU3RvcmUxNng0KHVpbnQ4X3QqIHIwLCB1aW50OF90KiByOCwgaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBwMSwgX19tMTI4aSogcDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogcTAsIF9fbTEyOGkqIHExKSB7Ci0gIF9fbTEyOGkgdDE7Ci0KLSAgLy8gcDAgPSA3MSA3MCA2MSA2MCA1MSA1MCA0MSA0MCAzMSAzMCAyMSAyMCAxMSAxMCAwMSAwMAotICAvLyBwMSA9IGYxIGYwIGUxIGUwIGQxIGQwIGMxIGMwIGIxIGIwIGExIGEwIDkxIDkwIDgxIDgwCi0gIHQxID0gKnAwOwotICAqcDAgPSBfbW1fdW5wYWNrbG9fZXBpOCgqcDEsIHQxKTsKLSAgKnAxID0gX21tX3VucGFja2hpX2VwaTgoKnAxLCB0MSk7Ci0KLSAgLy8gcTAgPSA3MyA3MiA2MyA2MiA1MyA1MiA0MyA0MiAzMyAzMiAyMyAyMiAxMyAxMiAwMyAwMgotICAvLyBxMSA9IGYzIGYyIGUzIGUyIGQzIGQyIGMzIGMyIGIzIGIyIGEzIGEyIDkzIDkyIDgzIDgyCi0gIHQxID0gKnEwOwotICAqcTAgPSBfbW1fdW5wYWNrbG9fZXBpOCh0MSwgKnExKTsKLSAgKnExID0gX21tX3VucGFja2hpX2VwaTgodDEsICpxMSk7Ci0KLSAgLy8gcDAgPSAzMyAzMiAzMSAzMCAyMyAyMiAyMSAyMCAxMyAxMiAxMSAxMCAwMyAwMiAwMSAwMAotICAvLyBxMCA9IDczIDcyIDcxIDcwIDYzIDYyIDYxIDYwIDUzIDUyIDUxIDUwIDQzIDQyIDQxIDQwCi0gIHQxID0gKnAwOwotICAqcDAgPSBfbW1fdW5wYWNrbG9fZXBpMTYodDEsICpxMCk7Ci0gICpxMCA9IF9tbV91bnBhY2toaV9lcGkxNih0MSwgKnEwKTsKLQotICAvLyBwMSA9IGIzIGIyIGIxIGIwIGEzIGEyIGExIGEwIDkzIDkyIDkxIDkwIDgzIDgyIDgxIDgwCi0gIC8vIHExID0gZjMgZjIgZjEgZjAgZTMgZTIgZTEgZTAgZDMgZDIgZDEgZDAgYzMgYzIgYzEgYzAKLSAgdDEgPSAqcDE7Ci0gICpwMSA9IF9tbV91bnBhY2tsb19lcGkxNih0MSwgKnExKTsKLSAgKnExID0gX21tX3VucGFja2hpX2VwaTE2KHQxLCAqcTEpOwotCi0gIFN0b3JlNHg0KHAwLCByMCwgc3RyaWRlKTsKLSAgcjAgKz0gNCAqIHN0cmlkZTsKLSAgU3RvcmU0eDQocTAsIHIwLCBzdHJpZGUpOwotCi0gIFN0b3JlNHg0KHAxLCByOCwgc3RyaWRlKTsKLSAgcjggKz0gNCAqIHN0cmlkZTsKLSAgU3RvcmU0eDQocTEsIHI4LCBzdHJpZGUpOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gU2ltcGxlIEluLWxvb3AgZmlsdGVyaW5nIChQYXJhZ3JhcGggMTUuMikKLQotc3RhdGljIHZvaWQgU2ltcGxlVkZpbHRlcjE2U1NFMih1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKSB7Ci0gIC8vIExvYWQKLSAgX19tMTI4aSBwMSA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJnBbLTIgKiBzdHJpZGVdKTsKLSAgX19tMTI4aSBwMCA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJnBbLXN0cmlkZV0pOwotICBfX20xMjhpIHEwID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmcFswXSk7Ci0gIF9fbTEyOGkgcTEgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZwW3N0cmlkZV0pOwotCi0gIERvRmlsdGVyMigmcDEsICZwMCwgJnEwLCAmcTEsIHRocmVzaCk7Ci0KLSAgLy8gU3RvcmUKLSAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJnBbLXN0cmlkZV0sIHAwKTsKLSAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopcCwgcTApOwotfQotCi1zdGF0aWMgdm9pZCBTaW1wbGVIRmlsdGVyMTZTU0UyKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsIGludCB0aHJlc2gpIHsKLSAgX19tMTI4aSBwMSwgcDAsIHEwLCBxMTsKLQotICBwIC09IDI7ICAvLyBiZWdpbm5pbmcgb2YgcDEKLQotICBMb2FkMTZ4NChwLCBwICsgOCAqIHN0cmlkZSwgIHN0cmlkZSwgJnAxLCAmcDAsICZxMCwgJnExKTsKLSAgRG9GaWx0ZXIyKCZwMSwgJnAwLCAmcTAsICZxMSwgdGhyZXNoKTsKLSAgU3RvcmUxNng0KHAsIHAgKyA4ICogc3RyaWRlLCBzdHJpZGUsICZwMSwgJnAwLCAmcTAsICZxMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNpbXBsZVZGaWx0ZXIxNmlTU0UyKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsIGludCB0aHJlc2gpIHsKLSAgaW50IGs7Ci0gIGZvciAoayA9IDM7IGsgPiAwOyAtLWspIHsKLSAgICBwICs9IDQgKiBzdHJpZGU7Ci0gICAgU2ltcGxlVkZpbHRlcjE2U1NFMihwLCBzdHJpZGUsIHRocmVzaCk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgU2ltcGxlSEZpbHRlcjE2aVNTRTIodWludDhfdCogcCwgaW50IHN0cmlkZSwgaW50IHRocmVzaCkgewotICBpbnQgazsKLSAgZm9yIChrID0gMzsgayA+IDA7IC0taykgewotICAgIHAgKz0gNDsKLSAgICBTaW1wbGVIRmlsdGVyMTZTU0UyKHAsIHN0cmlkZSwgdGhyZXNoKTsKLSAgfQotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29tcGxleCBJbi1sb29wIGZpbHRlcmluZyAoUGFyYWdyYXBoIDE1LjMpCi0KLSNkZWZpbmUgTUFYX0RJRkYxKHAzLCBwMiwgcDEsIHAwLCBtKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIG0gPSBNTV9BQlMocDMsIHAyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBtID0gX21tX21heF9lcHU4KG0sIE1NX0FCUyhwMiwgcDEpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgbSA9IF9tbV9tYXhfZXB1OChtLCBNTV9BQlMocDEsIHAwKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgTUFYX0RJRkYyKHAzLCBwMiwgcDEsIHAwLCBtKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIG0gPSBfbW1fbWF4X2VwdTgobSwgTU1fQUJTKHAzLCBwMikpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBtID0gX21tX21heF9lcHU4KG0sIE1NX0FCUyhwMiwgcDEpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgbSA9IF9tbV9tYXhfZXB1OChtLCBNTV9BQlMocDEsIHAwKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgTE9BRF9IX0VER0VTNChwLCBzdHJpZGUsIGUxLCBlMiwgZTMsIGU0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGUxID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmKHApWzAgKiBzdHJpZGVdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBlMiA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJihwKVsxICogc3RyaWRlXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZTMgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSYocClbMiAqIHN0cmlkZV0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGU0ID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmKHApWzMgKiBzdHJpZGVdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0jZGVmaW5lIExPQURVVl9IX0VER0UocCwgdSwgdiwgc3RyaWRlKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBwID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmKHUpWyhzdHJpZGUpXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgcCA9IF9tbV91bnBhY2tsb19lcGk2NChwLCBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSYodilbKHN0cmlkZSldKSk7ICAgICAgICBcCi19Ci0KLSNkZWZpbmUgTE9BRFVWX0hfRURHRVM0KHUsIHYsIHN0cmlkZSwgZTEsIGUyLCBlMywgZTQpIHsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIExPQURVVl9IX0VER0UoZTEsIHUsIHYsIDAgKiBzdHJpZGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBMT0FEVVZfSF9FREdFKGUyLCB1LCB2LCAxICogc3RyaWRlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgTE9BRFVWX0hfRURHRShlMywgdSwgdiwgMiAqIHN0cmlkZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIExPQURVVl9IX0VER0UoZTQsIHUsIHYsIDMgKiBzdHJpZGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0jZGVmaW5lIFNUT1JFVVYocCwgdSwgdiwgc3RyaWRlKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikmdVsoc3RyaWRlKV0sIHApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgcCA9IF9tbV9zcmxpX3NpMTI4KHAsIDgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKSZ2WyhzdHJpZGUpXSwgcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0jZGVmaW5lIENPTVBMRVhfRkxfTUFTSyhwMSwgcDAsIHEwLCBxMSwgdGhyZXNoLCBpdGhyZXNoLCBtYXNrKSB7ICAgICAgICAgICAgICAgXAotICBfX20xMjhpIGZsX3llczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgX19tMTI4aSBpdCA9IF9tbV9zZXQxX2VwaTgoaXRocmVzaCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIG1hc2sgPSBfbW1fc3Vic19lcHU4KG1hc2ssIGl0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBtYXNrID0gX21tX2NtcGVxX2VwaTgobWFzaywgX21tX3NldHplcm9fc2kxMjgoKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgTmVlZHNGaWx0ZXIoJnAxLCAmcDAsICZxMCwgJnExLCB0aHJlc2gsICZmbF95ZXMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIG1hc2sgPSBfbW1fYW5kX3NpMTI4KG1hc2ssIGZsX3llcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0vLyBvbiBtYWNyb2Jsb2NrIGVkZ2VzCi1zdGF0aWMgdm9pZCBWRmlsdGVyMTZTU0UyKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgewotICBfX20xMjhpIHQxOwotICBfX20xMjhpIG1hc2s7Ci0gIF9fbTEyOGkgcDIsIHAxLCBwMCwgcTAsIHExLCBxMjsKLQotICAvLyBMb2FkIHAzLCBwMiwgcDEsIHAwCi0gIExPQURfSF9FREdFUzQocCAtIDQgKiBzdHJpZGUsIHN0cmlkZSwgdDEsIHAyLCBwMSwgcDApOwotICBNQVhfRElGRjEodDEsIHAyLCBwMSwgcDAsIG1hc2spOwotCi0gIC8vIExvYWQgcTAsIHExLCBxMiwgcTMKLSAgTE9BRF9IX0VER0VTNChwLCBzdHJpZGUsIHEwLCBxMSwgcTIsIHQxKTsKLSAgTUFYX0RJRkYyKHQxLCBxMiwgcTEsIHEwLCBtYXNrKTsKLQotICBDT01QTEVYX0ZMX01BU0socDEsIHAwLCBxMCwgcTEsIHRocmVzaCwgaXRocmVzaCwgbWFzayk7Ci0gIERvRmlsdGVyNigmcDIsICZwMSwgJnAwLCAmcTAsICZxMSwgJnEyLCAmbWFzaywgaGV2X3RocmVzaCk7Ci0KLSAgLy8gU3RvcmUKLSAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJnBbLTMgKiBzdHJpZGVdLCBwMik7Ci0gIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZwWy0yICogc3RyaWRlXSwgcDEpOwotICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmcFstMSAqIHN0cmlkZV0sIHAwKTsKLSAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJnBbMCAqIHN0cmlkZV0sIHEwKTsKLSAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJnBbMSAqIHN0cmlkZV0sIHExKTsKLSAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJnBbMiAqIHN0cmlkZV0sIHEyKTsKLX0KLQotc3RhdGljIHZvaWQgSEZpbHRlcjE2U1NFMih1aW50OF90KiBwLCBpbnQgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKLSAgX19tMTI4aSBtYXNrOwotICBfX20xMjhpIHAzLCBwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBxMzsKLQotICB1aW50OF90KiBjb25zdCBiID0gcCAtIDQ7Ci0gIExvYWQxNng0KGIsIGIgKyA4ICogc3RyaWRlLCBzdHJpZGUsICZwMywgJnAyLCAmcDEsICZwMCk7ICAvLyBwMywgcDIsIHAxLCBwMAotICBNQVhfRElGRjEocDMsIHAyLCBwMSwgcDAsIG1hc2spOwotCi0gIExvYWQxNng0KHAsIHAgKyA4ICogc3RyaWRlLCBzdHJpZGUsICZxMCwgJnExLCAmcTIsICZxMyk7ICAvLyBxMCwgcTEsIHEyLCBxMwotICBNQVhfRElGRjIocTMsIHEyLCBxMSwgcTAsIG1hc2spOwotCi0gIENPTVBMRVhfRkxfTUFTSyhwMSwgcDAsIHEwLCBxMSwgdGhyZXNoLCBpdGhyZXNoLCBtYXNrKTsKLSAgRG9GaWx0ZXI2KCZwMiwgJnAxLCAmcDAsICZxMCwgJnExLCAmcTIsICZtYXNrLCBoZXZfdGhyZXNoKTsKLQotICBTdG9yZTE2eDQoYiwgYiArIDggKiBzdHJpZGUsIHN0cmlkZSwgJnAzLCAmcDIsICZwMSwgJnAwKTsKLSAgU3RvcmUxNng0KHAsIHAgKyA4ICogc3RyaWRlLCBzdHJpZGUsICZxMCwgJnExLCAmcTIsICZxMyk7Ci19Ci0KLS8vIG9uIHRocmVlIGlubmVyIGVkZ2VzCi1zdGF0aWMgdm9pZCBWRmlsdGVyMTZpU1NFMih1aW50OF90KiBwLCBpbnQgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7Ci0gIGludCBrOwotICBfX20xMjhpIG1hc2s7Ci0gIF9fbTEyOGkgdDEsIHQyLCBwMSwgcDAsIHEwLCBxMTsKLQotICBmb3IgKGsgPSAzOyBrID4gMDsgLS1rKSB7Ci0gICAgLy8gTG9hZCBwMywgcDIsIHAxLCBwMAotICAgIExPQURfSF9FREdFUzQocCwgc3RyaWRlLCB0MiwgdDEsIHAxLCBwMCk7Ci0gICAgTUFYX0RJRkYxKHQyLCB0MSwgcDEsIHAwLCBtYXNrKTsKLQotICAgIHAgKz0gNCAqIHN0cmlkZTsKLQotICAgIC8vIExvYWQgcTAsIHExLCBxMiwgcTMKLSAgICBMT0FEX0hfRURHRVM0KHAsIHN0cmlkZSwgcTAsIHExLCB0MSwgdDIpOwotICAgIE1BWF9ESUZGMih0MiwgdDEsIHExLCBxMCwgbWFzayk7Ci0KLSAgICBDT01QTEVYX0ZMX01BU0socDEsIHAwLCBxMCwgcTEsIHRocmVzaCwgaXRocmVzaCwgbWFzayk7Ci0gICAgRG9GaWx0ZXI0KCZwMSwgJnAwLCAmcTAsICZxMSwgJm1hc2ssIGhldl90aHJlc2gpOwotCi0gICAgLy8gU3RvcmUKLSAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmcFstMiAqIHN0cmlkZV0sIHAxKTsKLSAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmcFstMSAqIHN0cmlkZV0sIHAwKTsKLSAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmcFswICogc3RyaWRlXSwgcTApOwotICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZwWzEgKiBzdHJpZGVdLCBxMSk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgSEZpbHRlcjE2aVNTRTIodWludDhfdCogcCwgaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgewotICBpbnQgazsKLSAgdWludDhfdCogYjsKLSAgX19tMTI4aSBtYXNrOwotICBfX20xMjhpIHQxLCB0MiwgcDEsIHAwLCBxMCwgcTE7Ci0KLSAgZm9yIChrID0gMzsgayA+IDA7IC0taykgewotICAgIGIgPSBwOwotICAgIExvYWQxNng0KGIsIGIgKyA4ICogc3RyaWRlLCBzdHJpZGUsICZ0MiwgJnQxLCAmcDEsICZwMCk7ICAvLyBwMywgcDIsIHAxLCBwMAotICAgIE1BWF9ESUZGMSh0MiwgdDEsIHAxLCBwMCwgbWFzayk7Ci0KLSAgICBiICs9IDQ7ICAvLyBiZWdpbm5pbmcgb2YgcTAKLSAgICBMb2FkMTZ4NChiLCBiICsgOCAqIHN0cmlkZSwgc3RyaWRlLCAmcTAsICZxMSwgJnQxLCAmdDIpOyAgLy8gcTAsIHExLCBxMiwgcTMKLSAgICBNQVhfRElGRjIodDIsIHQxLCBxMSwgcTAsIG1hc2spOwotCi0gICAgQ09NUExFWF9GTF9NQVNLKHAxLCBwMCwgcTAsIHExLCB0aHJlc2gsIGl0aHJlc2gsIG1hc2spOwotICAgIERvRmlsdGVyNCgmcDEsICZwMCwgJnEwLCAmcTEsICZtYXNrLCBoZXZfdGhyZXNoKTsKLQotICAgIGIgLT0gMjsgIC8vIGJlZ2lubmluZyBvZiBwMQotICAgIFN0b3JlMTZ4NChiLCBiICsgOCAqIHN0cmlkZSwgc3RyaWRlLCAmcDEsICZwMCwgJnEwLCAmcTEpOwotCi0gICAgcCArPSA0OwotICB9Ci19Ci0KLS8vIDgtcGl4ZWxzIHdpZGUgdmFyaWFudCwgZm9yIGNocm9tYSBmaWx0ZXJpbmcKLXN0YXRpYyB2b2lkIFZGaWx0ZXI4U1NFMih1aW50OF90KiB1LCB1aW50OF90KiB2LCBpbnQgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgewotICBfX20xMjhpIG1hc2s7Ci0gIF9fbTEyOGkgdDEsIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTI7Ci0KLSAgLy8gTG9hZCBwMywgcDIsIHAxLCBwMAotICBMT0FEVVZfSF9FREdFUzQodSAtIDQgKiBzdHJpZGUsIHYgLSA0ICogc3RyaWRlLCBzdHJpZGUsIHQxLCBwMiwgcDEsIHAwKTsKLSAgTUFYX0RJRkYxKHQxLCBwMiwgcDEsIHAwLCBtYXNrKTsKLQotICAvLyBMb2FkIHEwLCBxMSwgcTIsIHEzCi0gIExPQURVVl9IX0VER0VTNCh1LCB2LCBzdHJpZGUsIHEwLCBxMSwgcTIsIHQxKTsKLSAgTUFYX0RJRkYyKHQxLCBxMiwgcTEsIHEwLCBtYXNrKTsKLQotICBDT01QTEVYX0ZMX01BU0socDEsIHAwLCBxMCwgcTEsIHRocmVzaCwgaXRocmVzaCwgbWFzayk7Ci0gIERvRmlsdGVyNigmcDIsICZwMSwgJnAwLCAmcTAsICZxMSwgJnEyLCAmbWFzaywgaGV2X3RocmVzaCk7Ci0KLSAgLy8gU3RvcmUKLSAgU1RPUkVVVihwMiwgdSwgdiwgLTMgKiBzdHJpZGUpOwotICBTVE9SRVVWKHAxLCB1LCB2LCAtMiAqIHN0cmlkZSk7Ci0gIFNUT1JFVVYocDAsIHUsIHYsIC0xICogc3RyaWRlKTsKLSAgU1RPUkVVVihxMCwgdSwgdiwgMCAqIHN0cmlkZSk7Ci0gIFNUT1JFVVYocTEsIHUsIHYsIDEgKiBzdHJpZGUpOwotICBTVE9SRVVWKHEyLCB1LCB2LCAyICogc3RyaWRlKTsKLX0KLQotc3RhdGljIHZvaWQgSEZpbHRlcjhTU0UyKHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7Ci0gIF9fbTEyOGkgbWFzazsKLSAgX19tMTI4aSBwMywgcDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgcTM7Ci0KLSAgdWludDhfdCogY29uc3QgdHUgPSB1IC0gNDsKLSAgdWludDhfdCogY29uc3QgdHYgPSB2IC0gNDsKLSAgTG9hZDE2eDQodHUsIHR2LCBzdHJpZGUsICZwMywgJnAyLCAmcDEsICZwMCk7ICAvLyBwMywgcDIsIHAxLCBwMAotICBNQVhfRElGRjEocDMsIHAyLCBwMSwgcDAsIG1hc2spOwotCi0gIExvYWQxNng0KHUsIHYsIHN0cmlkZSwgJnEwLCAmcTEsICZxMiwgJnEzKTsgICAgLy8gcTAsIHExLCBxMiwgcTMKLSAgTUFYX0RJRkYyKHEzLCBxMiwgcTEsIHEwLCBtYXNrKTsKLQotICBDT01QTEVYX0ZMX01BU0socDEsIHAwLCBxMCwgcTEsIHRocmVzaCwgaXRocmVzaCwgbWFzayk7Ci0gIERvRmlsdGVyNigmcDIsICZwMSwgJnAwLCAmcTAsICZxMSwgJnEyLCAmbWFzaywgaGV2X3RocmVzaCk7Ci0KLSAgU3RvcmUxNng0KHR1LCB0diwgc3RyaWRlLCAmcDMsICZwMiwgJnAxLCAmcDApOwotICBTdG9yZTE2eDQodSwgdiwgc3RyaWRlLCAmcTAsICZxMSwgJnEyLCAmcTMpOwotfQotCi1zdGF0aWMgdm9pZCBWRmlsdGVyOGlTU0UyKHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgewotICBfX20xMjhpIG1hc2s7Ci0gIF9fbTEyOGkgdDEsIHQyLCBwMSwgcDAsIHEwLCBxMTsKLQotICAvLyBMb2FkIHAzLCBwMiwgcDEsIHAwCi0gIExPQURVVl9IX0VER0VTNCh1LCB2LCBzdHJpZGUsIHQyLCB0MSwgcDEsIHAwKTsKLSAgTUFYX0RJRkYxKHQyLCB0MSwgcDEsIHAwLCBtYXNrKTsKLQotICB1ICs9IDQgKiBzdHJpZGU7Ci0gIHYgKz0gNCAqIHN0cmlkZTsKLQotICAvLyBMb2FkIHEwLCBxMSwgcTIsIHEzCi0gIExPQURVVl9IX0VER0VTNCh1LCB2LCBzdHJpZGUsIHEwLCBxMSwgdDEsIHQyKTsKLSAgTUFYX0RJRkYyKHQyLCB0MSwgcTEsIHEwLCBtYXNrKTsKLQotICBDT01QTEVYX0ZMX01BU0socDEsIHAwLCBxMCwgcTEsIHRocmVzaCwgaXRocmVzaCwgbWFzayk7Ci0gIERvRmlsdGVyNCgmcDEsICZwMCwgJnEwLCAmcTEsICZtYXNrLCBoZXZfdGhyZXNoKTsKLQotICAvLyBTdG9yZQotICBTVE9SRVVWKHAxLCB1LCB2LCAtMiAqIHN0cmlkZSk7Ci0gIFNUT1JFVVYocDAsIHUsIHYsIC0xICogc3RyaWRlKTsKLSAgU1RPUkVVVihxMCwgdSwgdiwgMCAqIHN0cmlkZSk7Ci0gIFNUT1JFVVYocTEsIHUsIHYsIDEgKiBzdHJpZGUpOwotfQotCi1zdGF0aWMgdm9pZCBIRmlsdGVyOGlTU0UyKHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgewotICBfX20xMjhpIG1hc2s7Ci0gIF9fbTEyOGkgdDEsIHQyLCBwMSwgcDAsIHEwLCBxMTsKLSAgTG9hZDE2eDQodSwgdiwgc3RyaWRlLCAmdDIsICZ0MSwgJnAxLCAmcDApOyAgIC8vIHAzLCBwMiwgcDEsIHAwCi0gIE1BWF9ESUZGMSh0MiwgdDEsIHAxLCBwMCwgbWFzayk7Ci0KLSAgdSArPSA0OyAgLy8gYmVnaW5uaW5nIG9mIHEwCi0gIHYgKz0gNDsKLSAgTG9hZDE2eDQodSwgdiwgc3RyaWRlLCAmcTAsICZxMSwgJnQxLCAmdDIpOyAgLy8gcTAsIHExLCBxMiwgcTMKLSAgTUFYX0RJRkYyKHQyLCB0MSwgcTEsIHEwLCBtYXNrKTsKLQotICBDT01QTEVYX0ZMX01BU0socDEsIHAwLCBxMCwgcTEsIHRocmVzaCwgaXRocmVzaCwgbWFzayk7Ci0gIERvRmlsdGVyNCgmcDEsICZwMCwgJnEwLCAmcTEsICZtYXNrLCBoZXZfdGhyZXNoKTsKLQotICB1IC09IDI7ICAvLyBiZWdpbm5pbmcgb2YgcDEKLSAgdiAtPSAyOwotICBTdG9yZTE2eDQodSwgdiwgc3RyaWRlLCAmcDEsICZwMCwgJnEwLCAmcTEpOwotfQotCi0jZW5kaWYgICAvLyBXRUJQX1VTRV9TU0UyCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBFbnRyeSBwb2ludAotCi1leHRlcm4gdm9pZCBWUDhEc3BJbml0U1NFMih2b2lkKTsKLQotdm9pZCBWUDhEc3BJbml0U1NFMih2b2lkKSB7Ci0jaWYgZGVmaW5lZChXRUJQX1VTRV9TU0UyKQotICBWUDhUcmFuc2Zvcm0gPSBUcmFuc2Zvcm1TU0UyOwotCi0gIFZQOFZGaWx0ZXIxNiA9IFZGaWx0ZXIxNlNTRTI7Ci0gIFZQOEhGaWx0ZXIxNiA9IEhGaWx0ZXIxNlNTRTI7Ci0gIFZQOFZGaWx0ZXI4ID0gVkZpbHRlcjhTU0UyOwotICBWUDhIRmlsdGVyOCA9IEhGaWx0ZXI4U1NFMjsKLSAgVlA4VkZpbHRlcjE2aSA9IFZGaWx0ZXIxNmlTU0UyOwotICBWUDhIRmlsdGVyMTZpID0gSEZpbHRlcjE2aVNTRTI7Ci0gIFZQOFZGaWx0ZXI4aSA9IFZGaWx0ZXI4aVNTRTI7Ci0gIFZQOEhGaWx0ZXI4aSA9IEhGaWx0ZXI4aVNTRTI7Ci0KLSAgVlA4U2ltcGxlVkZpbHRlcjE2ID0gU2ltcGxlVkZpbHRlcjE2U1NFMjsKLSAgVlA4U2ltcGxlSEZpbHRlcjE2ID0gU2ltcGxlSEZpbHRlcjE2U1NFMjsKLSAgVlA4U2ltcGxlVkZpbHRlcjE2aSA9IFNpbXBsZVZGaWx0ZXIxNmlTU0UyOwotICBWUDhTaW1wbGVIRmlsdGVyMTZpID0gU2ltcGxlSEZpbHRlcjE2aVNTRTI7Ci0jZW5kaWYgICAvLyBXRUJQX1VTRV9TU0UyCi19Ci0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL2RzcC5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL2RzcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2JlZTU0Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RzcC9kc3AuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gICBTcGVlZC1jcml0aWNhbCBmdW5jdGlvbnMuCi0vLwotLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKLQotI2lmbmRlZiBXRUJQX0RTUF9EU1BfSF8KLSNkZWZpbmUgV0VCUF9EU1BfRFNQX0hfCi0KLSNpbmNsdWRlICIuLi93ZWJwL3R5cGVzLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ1BVIGRldGVjdGlvbgotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKGRlZmluZWQoX01fWDY0KSB8fCBkZWZpbmVkKF9NX0lYODYpKQotI2RlZmluZSBXRUJQX01TQ19TU0UyICAvLyBWaXN1YWwgQysrIFNTRTIgdGFyZ2V0cwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9fU1NFMl9fKSB8fCBkZWZpbmVkKFdFQlBfTVNDX1NTRTIpCi0jZGVmaW5lIFdFQlBfVVNFX1NTRTIKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX0FORFJPSURfXykgJiYgZGVmaW5lZChfX0FSTV9BUkNIXzdBX18pCi0jZGVmaW5lIFdFQlBfQU5EUk9JRF9ORU9OICAvLyBBbmRyb2lkIHRhcmdldHMgdGhhdCBtaWdodCBzdXBwb3J0IE5FT04KLSNlbmRpZgotCi0jaWYgKGRlZmluZWQoX19BUk1fTkVPTl9fKSB8fCBkZWZpbmVkKFdFQlBfQU5EUk9JRF9ORU9OKSkgJiYgIWRlZmluZWQoX19hYXJjaDY0X18pCi0jZGVmaW5lIFdFQlBfVVNFX05FT04KLSNlbmRpZgotCi10eXBlZGVmIGVudW0gewotICBrU1NFMiwKLSAga1NTRTMsCi0gIGtORU9OCi19IENQVUZlYXR1cmU7Ci0vLyByZXR1cm5zIHRydWUgaWYgdGhlIENQVSBzdXBwb3J0cyB0aGUgZmVhdHVyZS4KLXR5cGVkZWYgaW50ICgqVlA4Q1BVSW5mbykoQ1BVRmVhdHVyZSBmZWF0dXJlKTsKLWV4dGVybiBWUDhDUFVJbmZvIFZQOEdldENQVUluZm87Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBFbmNvZGluZwotCi0vLyBUcmFuc2Zvcm1zCi0vLyBWUDhJZGN0OiBEb2VzIG9uZSBvZiB0d28gaW52ZXJzZSB0cmFuc2Zvcm1zLiBJZiBkb190d28gaXMgc2V0LCB0aGUgdHJhbnNmb3JtcwotLy8gICAgICAgICAgd2lsbCBiZSBkb25lIGZvciAocmVmLCBpbiwgZHN0KSBhbmQgKHJlZiArIDQsIGluICsgMTYsIGRzdCArIDQpLgotdHlwZWRlZiB2b2lkICgqVlA4SWRjdCkoY29uc3QgdWludDhfdCogcmVmLCBjb25zdCBpbnQxNl90KiBpbiwgdWludDhfdCogZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRvX3R3byk7Ci10eXBlZGVmIHZvaWQgKCpWUDhGZGN0KShjb25zdCB1aW50OF90KiBzcmMsIGNvbnN0IHVpbnQ4X3QqIHJlZiwgaW50MTZfdCogb3V0KTsKLXR5cGVkZWYgdm9pZCAoKlZQOFdIVCkoY29uc3QgaW50MTZfdCogaW4sIGludDE2X3QqIG91dCk7Ci1leHRlcm4gVlA4SWRjdCBWUDhJVHJhbnNmb3JtOwotZXh0ZXJuIFZQOEZkY3QgVlA4RlRyYW5zZm9ybTsKLWV4dGVybiBWUDhXSFQgVlA4SVRyYW5zZm9ybVdIVDsKLWV4dGVybiBWUDhXSFQgVlA4RlRyYW5zZm9ybVdIVDsKLS8vIFByZWRpY3Rpb25zCi0vLyAqZHN0IGlzIHRoZSBkZXN0aW5hdGlvbiBibG9jay4gKnRvcCBhbmQgKmxlZnQgY2FuIGJlIE5VTEwuCi10eXBlZGVmIHZvaWQgKCpWUDhJbnRyYVByZWRzKSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QqIGxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3ApOwotdHlwZWRlZiB2b2lkICgqVlA4SW50cmE0UHJlZHMpKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCogdG9wKTsKLWV4dGVybiBWUDhJbnRyYTRQcmVkcyBWUDhFbmNQcmVkTHVtYTQ7Ci1leHRlcm4gVlA4SW50cmFQcmVkcyBWUDhFbmNQcmVkTHVtYTE2OwotZXh0ZXJuIFZQOEludHJhUHJlZHMgVlA4RW5jUHJlZENocm9tYTg7Ci0KLXR5cGVkZWYgaW50ICgqVlA4TWV0cmljKShjb25zdCB1aW50OF90KiBwaXgsIGNvbnN0IHVpbnQ4X3QqIHJlZik7Ci1leHRlcm4gVlA4TWV0cmljIFZQOFNTRTE2eDE2LCBWUDhTU0UxNng4LCBWUDhTU0U4eDgsIFZQOFNTRTR4NDsKLXR5cGVkZWYgaW50ICgqVlA4V01ldHJpYykoY29uc3QgdWludDhfdCogcGl4LCBjb25zdCB1aW50OF90KiByZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90KiBjb25zdCB3ZWlnaHRzKTsKLWV4dGVybiBWUDhXTWV0cmljIFZQOFREaXN0bzR4NCwgVlA4VERpc3RvMTZ4MTY7Ci0KLXR5cGVkZWYgdm9pZCAoKlZQOEJsb2NrQ29weSkoY29uc3QgdWludDhfdCogc3JjLCB1aW50OF90KiBkc3QpOwotZXh0ZXJuIFZQOEJsb2NrQ29weSBWUDhDb3B5NHg0OwotLy8gUXVhbnRpemF0aW9uCi1zdHJ1Y3QgVlA4TWF0cml4OyAgIC8vIGZvcndhcmQgZGVjbGFyYXRpb24KLXR5cGVkZWYgaW50ICgqVlA4UXVhbnRpemVCbG9jaykoaW50MTZfdCBpblsxNl0sIGludDE2X3Qgb3V0WzE2XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG4sIGNvbnN0IHN0cnVjdCBWUDhNYXRyaXgqIGNvbnN0IG10eCk7Ci1leHRlcm4gVlA4UXVhbnRpemVCbG9jayBWUDhFbmNRdWFudGl6ZUJsb2NrOwotCi0vLyBDb2xsZWN0IGhpc3RvZ3JhbSBmb3Igc3VzY2VwdGliaWxpdHkgY2FsY3VsYXRpb24gYW5kIGFjY3VtdWxhdGUgaW4gaGlzdG9bXS4KLXN0cnVjdCBWUDhIaXN0b2dyYW07Ci10eXBlZGVmIHZvaWQgKCpWUDhDSGlzdG8pKGNvbnN0IHVpbnQ4X3QqIHJlZiwgY29uc3QgdWludDhfdCogcHJlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X2Jsb2NrLCBpbnQgZW5kX2Jsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgVlA4SGlzdG9ncmFtKiBjb25zdCBoaXN0byk7Ci1leHRlcm4gY29uc3QgaW50IFZQOERzcFNjYW5bMTYgKyA0ICsgNF07Ci1leHRlcm4gVlA4Q0hpc3RvIFZQOENvbGxlY3RIaXN0b2dyYW07Ci0KLXZvaWQgVlA4RW5jRHNwSW5pdCh2b2lkKTsgICAvLyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgdXNpbmcgYW55IG9mIHRoZSBhYm92ZQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRGVjb2RpbmcKLQotdHlwZWRlZiB2b2lkICgqVlA4RGVjSWRjdCkoY29uc3QgaW50MTZfdCogY29lZmZzLCB1aW50OF90KiBkc3QpOwotLy8gd2hlbiBkb2luZyB0d28gdHJhbnNmb3JtcywgY29lZmZzIGlzIGFjdHVhbGx5IGludDE2X3RbMl1bMTZdLgotdHlwZWRlZiB2b2lkICgqVlA4RGVjSWRjdDIpKGNvbnN0IGludDE2X3QqIGNvZWZmcywgdWludDhfdCogZHN0LCBpbnQgZG9fdHdvKTsKLWV4dGVybiBWUDhEZWNJZGN0MiBWUDhUcmFuc2Zvcm07Ci1leHRlcm4gVlA4RGVjSWRjdCBWUDhUcmFuc2Zvcm1VVjsKLWV4dGVybiBWUDhEZWNJZGN0IFZQOFRyYW5zZm9ybURDOwotZXh0ZXJuIFZQOERlY0lkY3QgVlA4VHJhbnNmb3JtRENVVjsKLWV4dGVybiBWUDhXSFQgVlA4VHJhbnNmb3JtV0hUOwotCi0vLyAqZHN0IGlzIHRoZSBkZXN0aW5hdGlvbiBibG9jaywgd2l0aCBzdHJpZGUgQlBTLiBCb3VuZGFyeSBzYW1wbGVzIGFyZQotLy8gYXNzdW1lZCBhY2Nlc3NpYmxlIHdoZW4gbmVlZGVkLgotdHlwZWRlZiB2b2lkICgqVlA4UHJlZEZ1bmMpKHVpbnQ4X3QqIGRzdCk7Ci1leHRlcm4gY29uc3QgVlA4UHJlZEZ1bmMgVlA4UHJlZEx1bWExNlsvKiBOVU1fQl9EQ19NT0RFUyAqL107Ci1leHRlcm4gY29uc3QgVlA4UHJlZEZ1bmMgVlA4UHJlZENocm9tYThbLyogTlVNX0JfRENfTU9ERVMgKi9dOwotZXh0ZXJuIGNvbnN0IFZQOFByZWRGdW5jIFZQOFByZWRMdW1hNFsvKiBOVU1fQk1PREVTICovXTsKLQotLy8gc2ltcGxlIGZpbHRlciAob25seSBmb3IgbHVtYSkKLXR5cGVkZWYgdm9pZCAoKlZQOFNpbXBsZUZpbHRlckZ1bmMpKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsIGludCB0aHJlc2gpOwotZXh0ZXJuIFZQOFNpbXBsZUZpbHRlckZ1bmMgVlA4U2ltcGxlVkZpbHRlcjE2OwotZXh0ZXJuIFZQOFNpbXBsZUZpbHRlckZ1bmMgVlA4U2ltcGxlSEZpbHRlcjE2OwotZXh0ZXJuIFZQOFNpbXBsZUZpbHRlckZ1bmMgVlA4U2ltcGxlVkZpbHRlcjE2aTsgIC8vIGZpbHRlciAzIGlubmVyIGVkZ2VzCi1leHRlcm4gVlA4U2ltcGxlRmlsdGVyRnVuYyBWUDhTaW1wbGVIRmlsdGVyMTZpOwotCi0vLyByZWd1bGFyIGZpbHRlciAob24gYm90aCBtYWNyb2Jsb2NrIGVkZ2VzIGFuZCBpbm5lciBlZGdlcykKLXR5cGVkZWYgdm9pZCAoKlZQOEx1bWFGaWx0ZXJGdW5jKSh1aW50OF90KiBsdW1hLCBpbnQgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3QpOwotdHlwZWRlZiB2b2lkICgqVlA4Q2hyb21hRmlsdGVyRnVuYykodWludDhfdCogdSwgdWludDhfdCogdiwgaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3QpOwotLy8gb24gb3V0ZXIgZWRnZQotZXh0ZXJuIFZQOEx1bWFGaWx0ZXJGdW5jIFZQOFZGaWx0ZXIxNjsKLWV4dGVybiBWUDhMdW1hRmlsdGVyRnVuYyBWUDhIRmlsdGVyMTY7Ci1leHRlcm4gVlA4Q2hyb21hRmlsdGVyRnVuYyBWUDhWRmlsdGVyODsKLWV4dGVybiBWUDhDaHJvbWFGaWx0ZXJGdW5jIFZQOEhGaWx0ZXI4OwotCi0vLyBvbiBpbm5lciBlZGdlCi1leHRlcm4gVlA4THVtYUZpbHRlckZ1bmMgVlA4VkZpbHRlcjE2aTsgICAvLyBmaWx0ZXJpbmcgMyBpbm5lciBlZGdlcyBhbHRvZ2V0aGVyCi1leHRlcm4gVlA4THVtYUZpbHRlckZ1bmMgVlA4SEZpbHRlcjE2aTsKLWV4dGVybiBWUDhDaHJvbWFGaWx0ZXJGdW5jIFZQOFZGaWx0ZXI4aTsgIC8vIGZpbHRlcmluZyB1IGFuZCB2IGFsdG9nZXRoZXIKLWV4dGVybiBWUDhDaHJvbWFGaWx0ZXJGdW5jIFZQOEhGaWx0ZXI4aTsKLQotLy8gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueXRoaW5nIHVzaW5nIHRoZSBhYm92ZQotdm9pZCBWUDhEc3BJbml0KHZvaWQpOwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gV2ViUCBJL08KLQotI2RlZmluZSBGQU5DWV9VUFNBTVBMSU5HICAgLy8gdW5kZWZpbmVkIHRvIHJlbW92ZSBmYW5jeSB1cHNhbXBsaW5nIHN1cHBvcnQKLQotdHlwZWRlZiB2b2lkICgqV2ViUFVwc2FtcGxlTGluZVBhaXJGdW5jKSgKLSAgICBjb25zdCB1aW50OF90KiB0b3BfeSwgY29uc3QgdWludDhfdCogYm90dG9tX3ksCi0gICAgY29uc3QgdWludDhfdCogdG9wX3UsIGNvbnN0IHVpbnQ4X3QqIHRvcF92LAotICAgIGNvbnN0IHVpbnQ4X3QqIGN1cl91LCBjb25zdCB1aW50OF90KiBjdXJfdiwKLSAgICB1aW50OF90KiB0b3BfZHN0LCB1aW50OF90KiBib3R0b21fZHN0LCBpbnQgbGVuKTsKLQotI2lmZGVmIEZBTkNZX1VQU0FNUExJTkcKLQotLy8gRmFuY3kgdXBzYW1wbGluZyBmdW5jdGlvbnMgdG8gY29udmVydCBZVVYgdG8gUkdCKEEpIG1vZGVzCi1leHRlcm4gV2ViUFVwc2FtcGxlTGluZVBhaXJGdW5jIFdlYlBVcHNhbXBsZXJzWy8qIE1PREVfTEFTVCAqL107Ci0KLS8vIEluaXRpYWxpemVzIFNTRTIgdmVyc2lvbiBvZiB0aGUgZmFuY3kgdXBzYW1wbGVycy4KLXZvaWQgV2ViUEluaXRVcHNhbXBsZXJzU1NFMih2b2lkKTsKLQotLy8gTkVPTiB2ZXJzaW9uCi12b2lkIFdlYlBJbml0VXBzYW1wbGVyc05FT04odm9pZCk7Ci0KLSNlbmRpZiAgICAvLyBGQU5DWV9VUFNBTVBMSU5HCi0KLS8vIFBvaW50LXNhbXBsaW5nIG1ldGhvZHMuCi10eXBlZGVmIHZvaWQgKCpXZWJQU2FtcGxlTGluZVBhaXJGdW5jKSgKLSAgICBjb25zdCB1aW50OF90KiB0b3BfeSwgY29uc3QgdWludDhfdCogYm90dG9tX3ksCi0gICAgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwKLSAgICB1aW50OF90KiB0b3BfZHN0LCB1aW50OF90KiBib3R0b21fZHN0LCBpbnQgbGVuKTsKLQotZXh0ZXJuIGNvbnN0IFdlYlBTYW1wbGVMaW5lUGFpckZ1bmMgV2ViUFNhbXBsZXJzWy8qIE1PREVfTEFTVCAqL107Ci0KLS8vIEdlbmVyYWwgZnVuY3Rpb24gZm9yIGNvbnZlcnRpbmcgdHdvIGxpbmVzIG9mIEFSR0Igb3IgUkdCQS4KLS8vICdhbHBoYV9pc19sYXN0JyBzaG91bGQgYmUgdHJ1ZSBpZiAweGZmMDAwMDAwIGlzIHN0b3JlZCBpbiBtZW1vcnkgYXMKLS8vIGFzIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYgKGxpdHRsZSBlbmRpYW4pLgotV2ViUFVwc2FtcGxlTGluZVBhaXJGdW5jIFdlYlBHZXRMaW5lUGFpckNvbnZlcnRlcihpbnQgYWxwaGFfaXNfbGFzdCk7Ci0KLS8vIFlVVjQ0NC0+UkdCIGNvbnZlcnRlcnMKLXR5cGVkZWYgdm9pZCAoKldlYlBZVVY0NDRDb252ZXJ0ZXIpKGNvbnN0IHVpbnQ4X3QqIHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgbGVuKTsKLQotZXh0ZXJuIGNvbnN0IFdlYlBZVVY0NDRDb252ZXJ0ZXIgV2ViUFlVVjQ0NENvbnZlcnRlcnNbLyogTU9ERV9MQVNUICovXTsKLQotLy8gTWFpbiBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLXZvaWQgV2ViUEluaXRVcHNhbXBsZXJzKHZvaWQpOwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gUHJlLW11bHRpcGx5IHBsYW5lcyB3aXRoIGFscGhhIHZhbHVlcwotCi0vLyBBcHBseSBhbHBoYSBwcmUtbXVsdGlwbHkgb24gYW4gcmdiYSwgYmdyYSBvciBhcmdiIHBsYW5lIG9mIHNpemUgdyAqIGguCi0vLyBhbHBoYV9maXJzdCBzaG91bGQgYmUgMCBmb3IgYXJnYiwgMSBmb3IgcmdiYSBvciBiZ3JhICh3aGVyZSBhbHBoYSBpcyBsYXN0KS4KLWV4dGVybiB2b2lkICgqV2ViUEFwcGx5QWxwaGFNdWx0aXBseSkoCi0gICAgdWludDhfdCogcmdiYSwgaW50IGFscGhhX2ZpcnN0LCBpbnQgdywgaW50IGgsIGludCBzdHJpZGUpOwotCi0vLyBTYW1lLCBidWYgc3BlY2lmaWNhbGx5IGZvciBSR0JBNDQ0NCBmb3JtYXQKLWV4dGVybiB2b2lkICgqV2ViUEFwcGx5QWxwaGFNdWx0aXBseTQ0NDQpKAotICAgIHVpbnQ4X3QqIHJnYmE0NDQ0LCBpbnQgdywgaW50IGgsIGludCBzdHJpZGUpOwotCi0vLyBUbyBiZSBjYWxsZWQgZmlyc3QgYmVmb3JlIHVzaW5nIHRoZSBhYm92ZS4KLXZvaWQgV2ViUEluaXRQcmVtdWx0aXBseSh2b2lkKTsKLQotdm9pZCBXZWJQSW5pdFByZW11bHRpcGx5U1NFMih2b2lkKTsgICAvLyBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseS4KLXZvaWQgV2ViUEluaXRQcmVtdWx0aXBseU5FT04odm9pZCk7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgotCi0jZW5kaWYgIC8qIFdFQlBfRFNQX0RTUF9IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL2VuYy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL2VuYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWU4ZDkzLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RzcC9lbmMuYworKysgL2Rldi9udWxsCkBAIC0xLDczNyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gU3BlZWQtY3JpdGljYWwgZW5jb2RpbmcgZnVuY3Rpb25zLgotLy8KLS8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCi0KLSNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdGRsaWJfcG9lbS5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNlbHNlCi0jaW5jbHVkZSA8c3RkbGliLmg+ICAvLyBmb3IgYWJzKCkKLSNlbmRpZgotCi0jaW5jbHVkZSAiLi9kc3AuaCIKLSNpbmNsdWRlICIuLi9lbmMvdnA4ZW5jaS5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ4X3QgY2xpcF84YihpbnQgdikgewotICByZXR1cm4gKCEodiAmIH4weGZmKSkgPyB2IDogKHYgPCAwKSA/IDAgOiAyNTU7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgY2xpcF9tYXgoaW50IHYsIGludCBtYXgpIHsKLSAgcmV0dXJuICh2ID4gbWF4KSA/IG1heCA6IHY7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb21wdXRlIHN1c2NlcHRpYmlsaXR5IGJhc2VkIG9uIERDVC1jb2VmZiBoaXN0b2dyYW1zOgotLy8gdGhlIGhpZ2hlciwgdGhlICJlYXNpZXIiIHRoZSBtYWNyb2Jsb2NrIGlzIHRvIGNvbXByZXNzLgotCi1jb25zdCBpbnQgVlA4RHNwU2NhblsxNiArIDQgKyA0XSA9IHsKLSAgLy8gTHVtYQotICAwICsgIDAgKiBCUFMsICA0ICsgIDAgKiBCUFMsIDggKyAgMCAqIEJQUywgMTIgKyAgMCAqIEJQUywKLSAgMCArICA0ICogQlBTLCAgNCArICA0ICogQlBTLCA4ICsgIDQgKiBCUFMsIDEyICsgIDQgKiBCUFMsCi0gIDAgKyAgOCAqIEJQUywgIDQgKyAgOCAqIEJQUywgOCArICA4ICogQlBTLCAxMiArICA4ICogQlBTLAotICAwICsgMTIgKiBCUFMsICA0ICsgMTIgKiBCUFMsIDggKyAxMiAqIEJQUywgMTIgKyAxMiAqIEJQUywKLQotICAwICsgMCAqIEJQUywgICA0ICsgMCAqIEJQUywgMCArIDQgKiBCUFMsICA0ICsgNCAqIEJQUywgICAgLy8gVQotICA4ICsgMCAqIEJQUywgIDEyICsgMCAqIEJQUywgOCArIDQgKiBCUFMsIDEyICsgNCAqIEJQUyAgICAgLy8gVgotfTsKLQotc3RhdGljIHZvaWQgQ29sbGVjdEhpc3RvZ3JhbShjb25zdCB1aW50OF90KiByZWYsIGNvbnN0IHVpbnQ4X3QqIHByZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF9ibG9jaywgaW50IGVuZF9ibG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4SGlzdG9ncmFtKiBjb25zdCBoaXN0bykgewotICBpbnQgajsKLSAgZm9yIChqID0gc3RhcnRfYmxvY2s7IGogPCBlbmRfYmxvY2s7ICsraikgewotICAgIGludCBrOwotICAgIGludDE2X3Qgb3V0WzE2XTsKLQotICAgIFZQOEZUcmFuc2Zvcm0ocmVmICsgVlA4RHNwU2NhbltqXSwgcHJlZCArIFZQOERzcFNjYW5bal0sIG91dCk7Ci0KLSAgICAvLyBDb252ZXJ0IGNvZWZmaWNpZW50cyB0byBiaW4uCi0gICAgZm9yIChrID0gMDsgayA8IDE2OyArK2spIHsKLSAgICAgIGNvbnN0IGludCB2ID0gYWJzKG91dFtrXSkgPj4gMzsgIC8vIFRPRE8oc2thbCk6IGFkZCByb3VuZGluZz8KLSAgICAgIGNvbnN0IGludCBjbGlwcGVkX3ZhbHVlID0gY2xpcF9tYXgodiwgTUFYX0NPRUZGX1RIUkVTSCk7Ci0gICAgICBoaXN0by0+ZGlzdHJpYnV0aW9uW2NsaXBwZWRfdmFsdWVdKys7Ci0gICAgfQotICB9Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBydW4tdGltZSB0YWJsZXMgKH40aykKLQotc3RhdGljIHVpbnQ4X3QgY2xpcDFbMjU1ICsgNTEwICsgMV07ICAgIC8vIGNsaXBzIFstMjU1LDUxMF0gdG8gWzAsMjU1XQotCi0vLyBXZSBkZWNsYXJlIHRoaXMgdmFyaWFibGUgJ3ZvbGF0aWxlJyB0byBwcmV2ZW50IGluc3RydWN0aW9uIHJlb3JkZXJpbmcKLS8vIGFuZCBtYWtlIHN1cmUgaXQncyBzZXQgdG8gdHJ1ZSBfbGFzdF8gKHNvIGFzIHRvIGJlIHRocmVhZC1zYWZlKQotc3RhdGljIHZvbGF0aWxlIGludCB0YWJsZXNfb2sgPSAwOwotCi1zdGF0aWMgdm9pZCBJbml0VGFibGVzKHZvaWQpIHsKLSAgaWYgKCF0YWJsZXNfb2spIHsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAtMjU1OyBpIDw9IDI1NSArIDI1NTsgKytpKSB7Ci0gICAgICBjbGlwMVsyNTUgKyBpXSA9IGNsaXBfOGIoaSk7Ci0gICAgfQotICAgIHRhYmxlc19vayA9IDE7Ci0gIH0KLX0KLQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVHJhbnNmb3JtcyAoUGFyYWdyYXBoIDE0LjQpCi0KLSNkZWZpbmUgU1RPUkUoeCwgeSwgdikgXAotICBkc3RbKHgpICsgKHkpICogQlBTXSA9IGNsaXBfOGIocmVmWyh4KSArICh5KSAqIEJQU10gKyAoKHYpID4+IDMpKQotCi1zdGF0aWMgY29uc3QgaW50IGtDMSA9IDIwMDkxICsgKDEgPDwgMTYpOwotc3RhdGljIGNvbnN0IGludCBrQzIgPSAzNTQ2ODsKLSNkZWZpbmUgTVVMKGEsIGIpICgoKGEpICogKGIpKSA+PiAxNikKLQotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgSVRyYW5zZm9ybU9uZShjb25zdCB1aW50OF90KiByZWYsIGNvbnN0IGludDE2X3QqIGluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QpIHsKLSAgaW50IENbNCAqIDRdLCAqdG1wOwotICBpbnQgaTsKLSAgdG1wID0gQzsKLSAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeyAgICAvLyB2ZXJ0aWNhbCBwYXNzCi0gICAgY29uc3QgaW50IGEgPSBpblswXSArIGluWzhdOwotICAgIGNvbnN0IGludCBiID0gaW5bMF0gLSBpbls4XTsKLSAgICBjb25zdCBpbnQgYyA9IE1VTChpbls0XSwga0MyKSAtIE1VTChpblsxMl0sIGtDMSk7Ci0gICAgY29uc3QgaW50IGQgPSBNVUwoaW5bNF0sIGtDMSkgKyBNVUwoaW5bMTJdLCBrQzIpOwotICAgIHRtcFswXSA9IGEgKyBkOwotICAgIHRtcFsxXSA9IGIgKyBjOwotICAgIHRtcFsyXSA9IGIgLSBjOwotICAgIHRtcFszXSA9IGEgLSBkOwotICAgIHRtcCArPSA0OwotICAgIGluKys7Ci0gIH0KLQotICB0bXAgPSBDOwotICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7ICAgIC8vIGhvcml6b250YWwgcGFzcwotICAgIGNvbnN0IGludCBkYyA9IHRtcFswXSArIDQ7Ci0gICAgY29uc3QgaW50IGEgPSAgZGMgKyAgdG1wWzhdOwotICAgIGNvbnN0IGludCBiID0gIGRjIC0gIHRtcFs4XTsKLSAgICBjb25zdCBpbnQgYyA9IE1VTCh0bXBbNF0sIGtDMikgLSBNVUwodG1wWzEyXSwga0MxKTsKLSAgICBjb25zdCBpbnQgZCA9IE1VTCh0bXBbNF0sIGtDMSkgKyBNVUwodG1wWzEyXSwga0MyKTsKLSAgICBTVE9SRSgwLCBpLCBhICsgZCk7Ci0gICAgU1RPUkUoMSwgaSwgYiArIGMpOwotICAgIFNUT1JFKDIsIGksIGIgLSBjKTsKLSAgICBTVE9SRSgzLCBpLCBhIC0gZCk7Ci0gICAgdG1wKys7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgSVRyYW5zZm9ybShjb25zdCB1aW50OF90KiByZWYsIGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBkb190d28pIHsKLSAgSVRyYW5zZm9ybU9uZShyZWYsIGluLCBkc3QpOwotICBpZiAoZG9fdHdvKSB7Ci0gICAgSVRyYW5zZm9ybU9uZShyZWYgKyA0LCBpbiArIDE2LCBkc3QgKyA0KTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBGVHJhbnNmb3JtKGNvbnN0IHVpbnQ4X3QqIHNyYywgY29uc3QgdWludDhfdCogcmVmLCBpbnQxNl90KiBvdXQpIHsKLSAgaW50IGk7Ci0gIGludCB0bXBbMTZdOwotICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpLCBzcmMgKz0gQlBTLCByZWYgKz0gQlBTKSB7Ci0gICAgY29uc3QgaW50IGQwID0gc3JjWzBdIC0gcmVmWzBdOyAgIC8vIDliaXQgZHluYW1pYyByYW5nZSAoWy0yNTUsMjU1XSkKLSAgICBjb25zdCBpbnQgZDEgPSBzcmNbMV0gLSByZWZbMV07Ci0gICAgY29uc3QgaW50IGQyID0gc3JjWzJdIC0gcmVmWzJdOwotICAgIGNvbnN0IGludCBkMyA9IHNyY1szXSAtIHJlZlszXTsKLSAgICBjb25zdCBpbnQgYTAgPSAoZDAgKyBkMyk7ICAgICAgICAgLy8gMTBiICAgICAgICAgICAgICAgICAgICAgIFstNTEwLDUxMF0KLSAgICBjb25zdCBpbnQgYTEgPSAoZDEgKyBkMik7Ci0gICAgY29uc3QgaW50IGEyID0gKGQxIC0gZDIpOwotICAgIGNvbnN0IGludCBhMyA9IChkMCAtIGQzKTsKLSAgICB0bXBbMCArIGkgKiA0XSA9IChhMCArIGExKSAqIDg7ICAgLy8gMTRiICAgICAgICAgICAgICAgICAgICAgIFstODE2MCw4MTYwXQotICAgIHRtcFsxICsgaSAqIDRdID0gKGEyICogMjIxNyArIGEzICogNTM1MiArIDE4MTIpID4+IDk7ICAgICAgLy8gWy03NTM2LDc1NDJdCi0gICAgdG1wWzIgKyBpICogNF0gPSAoYTAgLSBhMSkgKiA4OwotICAgIHRtcFszICsgaSAqIDRdID0gKGEzICogMjIxNyAtIGEyICogNTM1MiArICA5MzcpID4+IDk7Ci0gIH0KLSAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgewotICAgIGNvbnN0IGludCBhMCA9ICh0bXBbMCArIGldICsgdG1wWzEyICsgaV0pOyAgLy8gMTViCi0gICAgY29uc3QgaW50IGExID0gKHRtcFs0ICsgaV0gKyB0bXBbIDggKyBpXSk7Ci0gICAgY29uc3QgaW50IGEyID0gKHRtcFs0ICsgaV0gLSB0bXBbIDggKyBpXSk7Ci0gICAgY29uc3QgaW50IGEzID0gKHRtcFswICsgaV0gLSB0bXBbMTIgKyBpXSk7Ci0gICAgb3V0WzAgKyBpXSA9IChhMCArIGExICsgNykgPj4gNDsgICAgICAgICAgICAvLyAxMmIKLSAgICBvdXRbNCArIGldID0gKChhMiAqIDIyMTcgKyBhMyAqIDUzNTIgKyAxMjAwMCkgPj4gMTYpICsgKGEzICE9IDApOwotICAgIG91dFs4ICsgaV0gPSAoYTAgLSBhMSArIDcpID4+IDQ7Ci0gICAgb3V0WzEyKyBpXSA9ICgoYTMgKiAyMjE3IC0gYTIgKiA1MzUyICsgNTEwMDApID4+IDE2KTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBJVHJhbnNmb3JtV0hUKGNvbnN0IGludDE2X3QqIGluLCBpbnQxNl90KiBvdXQpIHsKLSAgaW50IHRtcFsxNl07Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7Ci0gICAgY29uc3QgaW50IGEwID0gaW5bMCArIGldICsgaW5bMTIgKyBpXTsKLSAgICBjb25zdCBpbnQgYTEgPSBpbls0ICsgaV0gKyBpblsgOCArIGldOwotICAgIGNvbnN0IGludCBhMiA9IGluWzQgKyBpXSAtIGluWyA4ICsgaV07Ci0gICAgY29uc3QgaW50IGEzID0gaW5bMCArIGldIC0gaW5bMTIgKyBpXTsKLSAgICB0bXBbMCAgKyBpXSA9IGEwICsgYTE7Ci0gICAgdG1wWzggICsgaV0gPSBhMCAtIGExOwotICAgIHRtcFs0ICArIGldID0gYTMgKyBhMjsKLSAgICB0bXBbMTIgKyBpXSA9IGEzIC0gYTI7Ci0gIH0KLSAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgewotICAgIGNvbnN0IGludCBkYyA9IHRtcFswICsgaSAqIDRdICsgMzsgICAgLy8gdy8gcm91bmRlcgotICAgIGNvbnN0IGludCBhMCA9IGRjICAgICAgICAgICAgICsgdG1wWzMgKyBpICogNF07Ci0gICAgY29uc3QgaW50IGExID0gdG1wWzEgKyBpICogNF0gKyB0bXBbMiArIGkgKiA0XTsKLSAgICBjb25zdCBpbnQgYTIgPSB0bXBbMSArIGkgKiA0XSAtIHRtcFsyICsgaSAqIDRdOwotICAgIGNvbnN0IGludCBhMyA9IGRjICAgICAgICAgICAgIC0gdG1wWzMgKyBpICogNF07Ci0gICAgb3V0WyAwXSA9IChhMCArIGExKSA+PiAzOwotICAgIG91dFsxNl0gPSAoYTMgKyBhMikgPj4gMzsKLSAgICBvdXRbMzJdID0gKGEwIC0gYTEpID4+IDM7Ci0gICAgb3V0WzQ4XSA9IChhMyAtIGEyKSA+PiAzOwotICAgIG91dCArPSA2NDsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBGVHJhbnNmb3JtV0hUKGNvbnN0IGludDE2X3QqIGluLCBpbnQxNl90KiBvdXQpIHsKLSAgLy8gaW5wdXQgaXMgMTJiIHNpZ25lZAotICBpbnQxNl90IHRtcFsxNl07Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpLCBpbiArPSA2NCkgewotICAgIGNvbnN0IGludCBhMCA9IChpblswICogMTZdICsgaW5bMiAqIDE2XSk7ICAvLyAxM2IKLSAgICBjb25zdCBpbnQgYTEgPSAoaW5bMSAqIDE2XSArIGluWzMgKiAxNl0pOwotICAgIGNvbnN0IGludCBhMiA9IChpblsxICogMTZdIC0gaW5bMyAqIDE2XSk7Ci0gICAgY29uc3QgaW50IGEzID0gKGluWzAgKiAxNl0gLSBpblsyICogMTZdKTsKLSAgICB0bXBbMCArIGkgKiA0XSA9IGEwICsgYTE7ICAgLy8gMTRiCi0gICAgdG1wWzEgKyBpICogNF0gPSBhMyArIGEyOwotICAgIHRtcFsyICsgaSAqIDRdID0gYTMgLSBhMjsKLSAgICB0bXBbMyArIGkgKiA0XSA9IGEwIC0gYTE7Ci0gIH0KLSAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgewotICAgIGNvbnN0IGludCBhMCA9ICh0bXBbMCArIGldICsgdG1wWzggKyBpXSk7ICAvLyAxNWIKLSAgICBjb25zdCBpbnQgYTEgPSAodG1wWzQgKyBpXSArIHRtcFsxMisgaV0pOwotICAgIGNvbnN0IGludCBhMiA9ICh0bXBbNCArIGldIC0gdG1wWzEyKyBpXSk7Ci0gICAgY29uc3QgaW50IGEzID0gKHRtcFswICsgaV0gLSB0bXBbOCArIGldKTsKLSAgICBjb25zdCBpbnQgYjAgPSBhMCArIGExOyAgICAvLyAxNmIKLSAgICBjb25zdCBpbnQgYjEgPSBhMyArIGEyOwotICAgIGNvbnN0IGludCBiMiA9IGEzIC0gYTI7Ci0gICAgY29uc3QgaW50IGIzID0gYTAgLSBhMTsKLSAgICBvdXRbIDAgKyBpXSA9IGIwID4+IDE7ICAgICAvLyAxNWIKLSAgICBvdXRbIDQgKyBpXSA9IGIxID4+IDE7Ci0gICAgb3V0WyA4ICsgaV0gPSBiMiA+PiAxOwotICAgIG91dFsxMiArIGldID0gYjMgPj4gMTsKLSAgfQotfQotCi0jdW5kZWYgTVVMCi0jdW5kZWYgU1RPUkUKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEludHJhIHByZWRpY3Rpb25zCi0KLSNkZWZpbmUgRFNUKHgsIHkpIGRzdFsoeCkgKyAoeSkgKiBCUFNdCi0KLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIEZpbGwodWludDhfdCogZHN0LCBpbnQgdmFsdWUsIGludCBzaXplKSB7Ci0gIGludCBqOwotICBmb3IgKGogPSAwOyBqIDwgc2l6ZTsgKytqKSB7Ci0gICAgU2JNZW1vcnlTZXQoZHN0ICsgaiAqIEJQUywgdmFsdWUsIHNpemUpOwotICB9Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZlcnRpY2FsUHJlZCh1aW50OF90KiBkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdG9wLCBpbnQgc2l6ZSkgewotICBpbnQgajsKLSAgaWYgKHRvcCkgewotICAgIGZvciAoaiA9IDA7IGogPCBzaXplOyArK2opIFNiTWVtb3J5Q29weShkc3QgKyBqICogQlBTLCB0b3AsIHNpemUpOwotICB9IGVsc2UgewotICAgIEZpbGwoZHN0LCAxMjcsIHNpemUpOwotICB9Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIEhvcml6b250YWxQcmVkKHVpbnQ4X3QqIGRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGxlZnQsIGludCBzaXplKSB7Ci0gIGlmIChsZWZ0KSB7Ci0gICAgaW50IGo7Ci0gICAgZm9yIChqID0gMDsgaiA8IHNpemU7ICsraikgewotICAgICAgU2JNZW1vcnlTZXQoZHN0ICsgaiAqIEJQUywgbGVmdFtqXSwgc2l6ZSk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIEZpbGwoZHN0LCAxMjksIHNpemUpOwotICB9Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIFRydWVNb3Rpb24odWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiBsZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3AsIGludCBzaXplKSB7Ci0gIGludCB5OwotICBpZiAobGVmdCkgewotICAgIGlmICh0b3ApIHsKLSAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGNsaXAgPSBjbGlwMSArIDI1NSAtIGxlZnRbLTFdOwotICAgICAgZm9yICh5ID0gMDsgeSA8IHNpemU7ICsreSkgewotICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBjbGlwX3RhYmxlID0gY2xpcCArIGxlZnRbeV07Ci0gICAgICAgIGludCB4OwotICAgICAgICBmb3IgKHggPSAwOyB4IDwgc2l6ZTsgKyt4KSB7Ci0gICAgICAgICAgZHN0W3hdID0gY2xpcF90YWJsZVt0b3BbeF1dOwotICAgICAgICB9Ci0gICAgICAgIGRzdCArPSBCUFM7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIEhvcml6b250YWxQcmVkKGRzdCwgbGVmdCwgc2l6ZSk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIC8vIHRydWUgbW90aW9uIHdpdGhvdXQgbGVmdCBzYW1wbGVzIChoZW5jZTogd2l0aCBkZWZhdWx0IDEyOSB2YWx1ZSkKLSAgICAvLyBpcyBlcXVpdmFsZW50IHRvIFZFIHByZWRpY3Rpb24gd2hlcmUgeW91IGp1c3QgY29weSB0aGUgdG9wIHNhbXBsZXMuCi0gICAgLy8gTm90ZSB0aGF0IGlmIHRvcCBzYW1wbGVzIGFyZSBub3QgYXZhaWxhYmxlLCB0aGUgZGVmYXVsdCB2YWx1ZSBpcwotICAgIC8vIHRoZW4gMTI5LCBhbmQgbm90IDEyNyBhcyBpbiB0aGUgVmVydGljYWxQcmVkIGNhc2UuCi0gICAgaWYgKHRvcCkgewotICAgICAgVmVydGljYWxQcmVkKGRzdCwgdG9wLCBzaXplKTsKLSAgICB9IGVsc2UgewotICAgICAgRmlsbChkc3QsIDEyOSwgc2l6ZSk7Ci0gICAgfQotICB9Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIERDTW9kZSh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIGxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplLCBpbnQgcm91bmQsIGludCBzaGlmdCkgewotICBpbnQgREMgPSAwOwotICBpbnQgajsKLSAgaWYgKHRvcCkgewotICAgIGZvciAoaiA9IDA7IGogPCBzaXplOyArK2opIERDICs9IHRvcFtqXTsKLSAgICBpZiAobGVmdCkgeyAgIC8vIHRvcCBhbmQgbGVmdCBwcmVzZW50Ci0gICAgICBmb3IgKGogPSAwOyBqIDwgc2l6ZTsgKytqKSBEQyArPSBsZWZ0W2pdOwotICAgIH0gZWxzZSB7ICAgICAgLy8gdG9wLCBidXQgbm8gbGVmdAotICAgICAgREMgKz0gREM7Ci0gICAgfQotICAgIERDID0gKERDICsgcm91bmQpID4+IHNoaWZ0OwotICB9IGVsc2UgaWYgKGxlZnQpIHsgICAvLyBsZWZ0IGJ1dCBubyB0b3AKLSAgICBmb3IgKGogPSAwOyBqIDwgc2l6ZTsgKytqKSBEQyArPSBsZWZ0W2pdOwotICAgIERDICs9IERDOwotICAgIERDID0gKERDICsgcm91bmQpID4+IHNoaWZ0OwotICB9IGVsc2UgeyAgIC8vIG5vIHRvcCwgbm8gbGVmdCwgbm90aGluZy4KLSAgICBEQyA9IDB4ODA7Ci0gIH0KLSAgRmlsbChkc3QsIERDLCBzaXplKTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENocm9tYSA4eDggcHJlZGljdGlvbiAocGFyYWdyYXBoIDEyLjIpCi0KLXN0YXRpYyB2b2lkIEludHJhQ2hyb21hUHJlZHModWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiBsZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3ApIHsKLSAgLy8gVSBibG9jawotICBEQ01vZGUoQzhEQzggKyBkc3QsIGxlZnQsIHRvcCwgOCwgOCwgNCk7Ci0gIFZlcnRpY2FsUHJlZChDOFZFOCArIGRzdCwgdG9wLCA4KTsKLSAgSG9yaXpvbnRhbFByZWQoQzhIRTggKyBkc3QsIGxlZnQsIDgpOwotICBUcnVlTW90aW9uKEM4VE04ICsgZHN0LCBsZWZ0LCB0b3AsIDgpOwotICAvLyBWIGJsb2NrCi0gIGRzdCArPSA4OwotICBpZiAodG9wKSB0b3AgKz0gODsKLSAgaWYgKGxlZnQpIGxlZnQgKz0gMTY7Ci0gIERDTW9kZShDOERDOCArIGRzdCwgbGVmdCwgdG9wLCA4LCA4LCA0KTsKLSAgVmVydGljYWxQcmVkKEM4VkU4ICsgZHN0LCB0b3AsIDgpOwotICBIb3Jpem9udGFsUHJlZChDOEhFOCArIGRzdCwgbGVmdCwgOCk7Ci0gIFRydWVNb3Rpb24oQzhUTTggKyBkc3QsIGxlZnQsIHRvcCwgOCk7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBsdW1hIDE2eDE2IHByZWRpY3Rpb24gKHBhcmFncmFwaCAxMi4zKQotCi1zdGF0aWMgdm9pZCBJbnRyYTE2UHJlZHModWludDhfdCogZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGxlZnQsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgewotICBEQ01vZGUoSTE2REMxNiArIGRzdCwgbGVmdCwgdG9wLCAxNiwgMTYsIDUpOwotICBWZXJ0aWNhbFByZWQoSTE2VkUxNiArIGRzdCwgdG9wLCAxNik7Ci0gIEhvcml6b250YWxQcmVkKEkxNkhFMTYgKyBkc3QsIGxlZnQsIDE2KTsKLSAgVHJ1ZU1vdGlvbihJMTZUTTE2ICsgZHN0LCBsZWZ0LCB0b3AsIDE2KTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGx1bWEgNHg0IHByZWRpY3Rpb24KLQotI2RlZmluZSBBVkczKGEsIGIsIGMpICgoKGEpICsgMiAqIChiKSArIChjKSArIDIpID4+IDIpCi0jZGVmaW5lIEFWRzIoYSwgYikgKCgoYSkgKyAoYikgKyAxKSA+PiAxKQotCi1zdGF0aWMgdm9pZCBWRTQodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsgICAgLy8gdmVydGljYWwKLSAgY29uc3QgdWludDhfdCB2YWxzWzRdID0gewotICAgIEFWRzModG9wWy0xXSwgdG9wWzBdLCB0b3BbMV0pLAotICAgIEFWRzModG9wWyAwXSwgdG9wWzFdLCB0b3BbMl0pLAotICAgIEFWRzModG9wWyAxXSwgdG9wWzJdLCB0b3BbM10pLAotICAgIEFWRzModG9wWyAyXSwgdG9wWzNdLCB0b3BbNF0pCi0gIH07Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7Ci0gICAgU2JNZW1vcnlDb3B5KGRzdCArIGkgKiBCUFMsIHZhbHMsIDQpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIEhFNCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeyAgICAvLyBob3Jpem9udGFsCi0gIGNvbnN0IGludCBYID0gdG9wWy0xXTsKLSAgY29uc3QgaW50IEkgPSB0b3BbLTJdOwotICBjb25zdCBpbnQgSiA9IHRvcFstM107Ci0gIGNvbnN0IGludCBLID0gdG9wWy00XTsKLSAgY29uc3QgaW50IEwgPSB0b3BbLTVdOwotICAqKHVpbnQzMl90KikoZHN0ICsgMCAqIEJQUykgPSAweDAxMDEwMTAxVSAqIEFWRzMoWCwgSSwgSik7Ci0gICoodWludDMyX3QqKShkc3QgKyAxICogQlBTKSA9IDB4MDEwMTAxMDFVICogQVZHMyhJLCBKLCBLKTsKLSAgKih1aW50MzJfdCopKGRzdCArIDIgKiBCUFMpID0gMHgwMTAxMDEwMVUgKiBBVkczKEosIEssIEwpOwotICAqKHVpbnQzMl90KikoZHN0ICsgMyAqIEJQUykgPSAweDAxMDEwMTAxVSAqIEFWRzMoSywgTCwgTCk7Ci19Ci0KLXN0YXRpYyB2b2lkIERDNCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgewotICB1aW50MzJfdCBkYyA9IDQ7Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSBkYyArPSB0b3BbaV0gKyB0b3BbLTUgKyBpXTsKLSAgRmlsbChkc3QsIGRjID4+IDMsIDQpOwotfQotCi1zdGF0aWMgdm9pZCBSRDQodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKLSAgY29uc3QgaW50IFggPSB0b3BbLTFdOwotICBjb25zdCBpbnQgSSA9IHRvcFstMl07Ci0gIGNvbnN0IGludCBKID0gdG9wWy0zXTsKLSAgY29uc3QgaW50IEsgPSB0b3BbLTRdOwotICBjb25zdCBpbnQgTCA9IHRvcFstNV07Ci0gIGNvbnN0IGludCBBID0gdG9wWzBdOwotICBjb25zdCBpbnQgQiA9IHRvcFsxXTsKLSAgY29uc3QgaW50IEMgPSB0b3BbMl07Ci0gIGNvbnN0IGludCBEID0gdG9wWzNdOwotICBEU1QoMCwgMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBBVkczKEosIEssIEwpOwotICBEU1QoMCwgMikgPSBEU1QoMSwgMykgICAgICAgICAgICAgICAgICAgICAgICAgPSBBVkczKEksIEosIEspOwotICBEU1QoMCwgMSkgPSBEU1QoMSwgMikgPSBEU1QoMiwgMykgICAgICAgICAgICAgPSBBVkczKFgsIEksIEopOwotICBEU1QoMCwgMCkgPSBEU1QoMSwgMSkgPSBEU1QoMiwgMikgPSBEU1QoMywgMykgPSBBVkczKEEsIFgsIEkpOwotICBEU1QoMSwgMCkgPSBEU1QoMiwgMSkgPSBEU1QoMywgMikgICAgICAgICAgICAgPSBBVkczKEIsIEEsIFgpOwotICBEU1QoMiwgMCkgPSBEU1QoMywgMSkgICAgICAgICAgICAgICAgICAgICAgICAgPSBBVkczKEMsIEIsIEEpOwotICBEU1QoMywgMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBBVkczKEQsIEMsIEIpOwotfQotCi1zdGF0aWMgdm9pZCBMRDQodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKLSAgY29uc3QgaW50IEEgPSB0b3BbMF07Ci0gIGNvbnN0IGludCBCID0gdG9wWzFdOwotICBjb25zdCBpbnQgQyA9IHRvcFsyXTsKLSAgY29uc3QgaW50IEQgPSB0b3BbM107Ci0gIGNvbnN0IGludCBFID0gdG9wWzRdOwotICBjb25zdCBpbnQgRiA9IHRvcFs1XTsKLSAgY29uc3QgaW50IEcgPSB0b3BbNl07Ci0gIGNvbnN0IGludCBIID0gdG9wWzddOwotICBEU1QoMCwgMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBBVkczKEEsIEIsIEMpOwotICBEU1QoMSwgMCkgPSBEU1QoMCwgMSkgICAgICAgICAgICAgICAgICAgICAgICAgPSBBVkczKEIsIEMsIEQpOwotICBEU1QoMiwgMCkgPSBEU1QoMSwgMSkgPSBEU1QoMCwgMikgICAgICAgICAgICAgPSBBVkczKEMsIEQsIEUpOwotICBEU1QoMywgMCkgPSBEU1QoMiwgMSkgPSBEU1QoMSwgMikgPSBEU1QoMCwgMykgPSBBVkczKEQsIEUsIEYpOwotICBEU1QoMywgMSkgPSBEU1QoMiwgMikgPSBEU1QoMSwgMykgICAgICAgICAgICAgPSBBVkczKEUsIEYsIEcpOwotICBEU1QoMywgMikgPSBEU1QoMiwgMykgICAgICAgICAgICAgICAgICAgICAgICAgPSBBVkczKEYsIEcsIEgpOwotICBEU1QoMywgMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBBVkczKEcsIEgsIEgpOwotfQotCi1zdGF0aWMgdm9pZCBWUjQodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKLSAgY29uc3QgaW50IFggPSB0b3BbLTFdOwotICBjb25zdCBpbnQgSSA9IHRvcFstMl07Ci0gIGNvbnN0IGludCBKID0gdG9wWy0zXTsKLSAgY29uc3QgaW50IEsgPSB0b3BbLTRdOwotICBjb25zdCBpbnQgQSA9IHRvcFswXTsKLSAgY29uc3QgaW50IEIgPSB0b3BbMV07Ci0gIGNvbnN0IGludCBDID0gdG9wWzJdOwotICBjb25zdCBpbnQgRCA9IHRvcFszXTsKLSAgRFNUKDAsIDApID0gRFNUKDEsIDIpID0gQVZHMihYLCBBKTsKLSAgRFNUKDEsIDApID0gRFNUKDIsIDIpID0gQVZHMihBLCBCKTsKLSAgRFNUKDIsIDApID0gRFNUKDMsIDIpID0gQVZHMihCLCBDKTsKLSAgRFNUKDMsIDApICAgICAgICAgICAgID0gQVZHMihDLCBEKTsKLQotICBEU1QoMCwgMykgPSAgICAgICAgICAgICBBVkczKEssIEosIEkpOwotICBEU1QoMCwgMikgPSAgICAgICAgICAgICBBVkczKEosIEksIFgpOwotICBEU1QoMCwgMSkgPSBEU1QoMSwgMykgPSBBVkczKEksIFgsIEEpOwotICBEU1QoMSwgMSkgPSBEU1QoMiwgMykgPSBBVkczKFgsIEEsIEIpOwotICBEU1QoMiwgMSkgPSBEU1QoMywgMykgPSBBVkczKEEsIEIsIEMpOwotICBEU1QoMywgMSkgPSAgICAgICAgICAgICBBVkczKEIsIEMsIEQpOwotfQotCi1zdGF0aWMgdm9pZCBWTDQodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKLSAgY29uc3QgaW50IEEgPSB0b3BbMF07Ci0gIGNvbnN0IGludCBCID0gdG9wWzFdOwotICBjb25zdCBpbnQgQyA9IHRvcFsyXTsKLSAgY29uc3QgaW50IEQgPSB0b3BbM107Ci0gIGNvbnN0IGludCBFID0gdG9wWzRdOwotICBjb25zdCBpbnQgRiA9IHRvcFs1XTsKLSAgY29uc3QgaW50IEcgPSB0b3BbNl07Ci0gIGNvbnN0IGludCBIID0gdG9wWzddOwotICBEU1QoMCwgMCkgPSAgICAgICAgICAgICBBVkcyKEEsIEIpOwotICBEU1QoMSwgMCkgPSBEU1QoMCwgMikgPSBBVkcyKEIsIEMpOwotICBEU1QoMiwgMCkgPSBEU1QoMSwgMikgPSBBVkcyKEMsIEQpOwotICBEU1QoMywgMCkgPSBEU1QoMiwgMikgPSBBVkcyKEQsIEUpOwotCi0gIERTVCgwLCAxKSA9ICAgICAgICAgICAgIEFWRzMoQSwgQiwgQyk7Ci0gIERTVCgxLCAxKSA9IERTVCgwLCAzKSA9IEFWRzMoQiwgQywgRCk7Ci0gIERTVCgyLCAxKSA9IERTVCgxLCAzKSA9IEFWRzMoQywgRCwgRSk7Ci0gIERTVCgzLCAxKSA9IERTVCgyLCAzKSA9IEFWRzMoRCwgRSwgRik7Ci0gICAgICAgICAgICAgIERTVCgzLCAyKSA9IEFWRzMoRSwgRiwgRyk7Ci0gICAgICAgICAgICAgIERTVCgzLCAzKSA9IEFWRzMoRiwgRywgSCk7Ci19Ci0KLXN0YXRpYyB2b2lkIEhVNCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgewotICBjb25zdCBpbnQgSSA9IHRvcFstMl07Ci0gIGNvbnN0IGludCBKID0gdG9wWy0zXTsKLSAgY29uc3QgaW50IEsgPSB0b3BbLTRdOwotICBjb25zdCBpbnQgTCA9IHRvcFstNV07Ci0gIERTVCgwLCAwKSA9ICAgICAgICAgICAgIEFWRzIoSSwgSik7Ci0gIERTVCgyLCAwKSA9IERTVCgwLCAxKSA9IEFWRzIoSiwgSyk7Ci0gIERTVCgyLCAxKSA9IERTVCgwLCAyKSA9IEFWRzIoSywgTCk7Ci0gIERTVCgxLCAwKSA9ICAgICAgICAgICAgIEFWRzMoSSwgSiwgSyk7Ci0gIERTVCgzLCAwKSA9IERTVCgxLCAxKSA9IEFWRzMoSiwgSywgTCk7Ci0gIERTVCgzLCAxKSA9IERTVCgxLCAyKSA9IEFWRzMoSywgTCwgTCk7Ci0gIERTVCgzLCAyKSA9IERTVCgyLCAyKSA9Ci0gIERTVCgwLCAzKSA9IERTVCgxLCAzKSA9IERTVCgyLCAzKSA9IERTVCgzLCAzKSA9IEw7Ci19Ci0KLXN0YXRpYyB2b2lkIEhENCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgewotICBjb25zdCBpbnQgWCA9IHRvcFstMV07Ci0gIGNvbnN0IGludCBJID0gdG9wWy0yXTsKLSAgY29uc3QgaW50IEogPSB0b3BbLTNdOwotICBjb25zdCBpbnQgSyA9IHRvcFstNF07Ci0gIGNvbnN0IGludCBMID0gdG9wWy01XTsKLSAgY29uc3QgaW50IEEgPSB0b3BbMF07Ci0gIGNvbnN0IGludCBCID0gdG9wWzFdOwotICBjb25zdCBpbnQgQyA9IHRvcFsyXTsKLQotICBEU1QoMCwgMCkgPSBEU1QoMiwgMSkgPSBBVkcyKEksIFgpOwotICBEU1QoMCwgMSkgPSBEU1QoMiwgMikgPSBBVkcyKEosIEkpOwotICBEU1QoMCwgMikgPSBEU1QoMiwgMykgPSBBVkcyKEssIEopOwotICBEU1QoMCwgMykgICAgICAgICAgICAgPSBBVkcyKEwsIEspOwotCi0gIERTVCgzLCAwKSAgICAgICAgICAgICA9IEFWRzMoQSwgQiwgQyk7Ci0gIERTVCgyLCAwKSAgICAgICAgICAgICA9IEFWRzMoWCwgQSwgQik7Ci0gIERTVCgxLCAwKSA9IERTVCgzLCAxKSA9IEFWRzMoSSwgWCwgQSk7Ci0gIERTVCgxLCAxKSA9IERTVCgzLCAyKSA9IEFWRzMoSiwgSSwgWCk7Ci0gIERTVCgxLCAyKSA9IERTVCgzLCAzKSA9IEFWRzMoSywgSiwgSSk7Ci0gIERTVCgxLCAzKSAgICAgICAgICAgICA9IEFWRzMoTCwgSywgSik7Ci19Ci0KLXN0YXRpYyB2b2lkIFRNNCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgewotICBpbnQgeCwgeTsKLSAgY29uc3QgdWludDhfdCogY29uc3QgY2xpcCA9IGNsaXAxICsgMjU1IC0gdG9wWy0xXTsKLSAgZm9yICh5ID0gMDsgeSA8IDQ7ICsreSkgewotICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGNsaXBfdGFibGUgPSBjbGlwICsgdG9wWy0yIC0geV07Ci0gICAgZm9yICh4ID0gMDsgeCA8IDQ7ICsreCkgewotICAgICAgZHN0W3hdID0gY2xpcF90YWJsZVt0b3BbeF1dOwotICAgIH0KLSAgICBkc3QgKz0gQlBTOwotICB9Ci19Ci0KLSN1bmRlZiBEU1QKLSN1bmRlZiBBVkczCi0jdW5kZWYgQVZHMgotCi0vLyBMZWZ0IHNhbXBsZXMgYXJlIHRvcFstNSAuLiAtMl0sIHRvcF9sZWZ0IGlzIHRvcFstMV0sIHRvcCBhcmUKLS8vIGxvY2F0ZWQgYXQgdG9wWzAuLjNdLCBhbmQgdG9wIHJpZ2h0IGlzIHRvcFs0Li43XQotc3RhdGljIHZvaWQgSW50cmE0UHJlZHModWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKLSAgREM0KEk0REM0ICsgZHN0LCB0b3ApOwotICBUTTQoSTRUTTQgKyBkc3QsIHRvcCk7Ci0gIFZFNChJNFZFNCArIGRzdCwgdG9wKTsKLSAgSEU0KEk0SEU0ICsgZHN0LCB0b3ApOwotICBSRDQoSTRSRDQgKyBkc3QsIHRvcCk7Ci0gIFZSNChJNFZSNCArIGRzdCwgdG9wKTsKLSAgTEQ0KEk0TEQ0ICsgZHN0LCB0b3ApOwotICBWTDQoSTRWTDQgKyBkc3QsIHRvcCk7Ci0gIEhENChJNEhENCArIGRzdCwgdG9wKTsKLSAgSFU0KEk0SFU0ICsgZHN0LCB0b3ApOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTWV0cmljCi0KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgR2V0U1NFKGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpIHsKLSAgaW50IGNvdW50ID0gMDsKLSAgaW50IHksIHg7Ci0gIGZvciAoeSA9IDA7IHkgPCBoOyArK3kpIHsKLSAgICBmb3IgKHggPSAwOyB4IDwgdzsgKyt4KSB7Ci0gICAgICBjb25zdCBpbnQgZGlmZiA9IChpbnQpYVt4XSAtIGJbeF07Ci0gICAgICBjb3VudCArPSBkaWZmICogZGlmZjsKLSAgICB9Ci0gICAgYSArPSBCUFM7Ci0gICAgYiArPSBCUFM7Ci0gIH0KLSAgcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgaW50IFNTRTE2eDE2KGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIpIHsKLSAgcmV0dXJuIEdldFNTRShhLCBiLCAxNiwgMTYpOwotfQotc3RhdGljIGludCBTU0UxNng4KGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIpIHsKLSAgcmV0dXJuIEdldFNTRShhLCBiLCAxNiwgOCk7Ci19Ci1zdGF0aWMgaW50IFNTRTh4OChjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiBiKSB7Ci0gIHJldHVybiBHZXRTU0UoYSwgYiwgOCwgOCk7Ci19Ci1zdGF0aWMgaW50IFNTRTR4NChjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiBiKSB7Ci0gIHJldHVybiBHZXRTU0UoYSwgYiwgNCwgNCk7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBUZXh0dXJlIGRpc3RvcnRpb24KLS8vCi0vLyBXZSB0cnkgdG8gbWF0Y2ggdGhlIHNwZWN0cmFsIGNvbnRlbnQgKHdlaWdodGVkKSBiZXR3ZWVuIHNvdXJjZSBhbmQKLS8vIHJlY29uc3RydWN0ZWQgc2FtcGxlcy4KLQotLy8gSGFkYW1hcmQgdHJhbnNmb3JtCi0vLyBSZXR1cm5zIHRoZSB3ZWlnaHRlZCBzdW0gb2YgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cy4KLXN0YXRpYyBpbnQgVFRyYW5zZm9ybShjb25zdCB1aW50OF90KiBpbiwgY29uc3QgdWludDE2X3QqIHcpIHsKLSAgaW50IHN1bSA9IDA7Ci0gIGludCB0bXBbMTZdOwotICBpbnQgaTsKLSAgLy8gaG9yaXpvbnRhbCBwYXNzCi0gIGZvciAoaSA9IDA7IGkgPCA0OyArK2ksIGluICs9IEJQUykgewotICAgIGNvbnN0IGludCBhMCA9IGluWzBdICsgaW5bMl07Ci0gICAgY29uc3QgaW50IGExID0gaW5bMV0gKyBpblszXTsKLSAgICBjb25zdCBpbnQgYTIgPSBpblsxXSAtIGluWzNdOwotICAgIGNvbnN0IGludCBhMyA9IGluWzBdIC0gaW5bMl07Ci0gICAgdG1wWzAgKyBpICogNF0gPSBhMCArIGExOwotICAgIHRtcFsxICsgaSAqIDRdID0gYTMgKyBhMjsKLSAgICB0bXBbMiArIGkgKiA0XSA9IGEzIC0gYTI7Ci0gICAgdG1wWzMgKyBpICogNF0gPSBhMCAtIGExOwotICB9Ci0gIC8vIHZlcnRpY2FsIHBhc3MKLSAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSwgKyt3KSB7Ci0gICAgY29uc3QgaW50IGEwID0gdG1wWzAgKyBpXSArIHRtcFs4ICsgaV07Ci0gICAgY29uc3QgaW50IGExID0gdG1wWzQgKyBpXSArIHRtcFsxMisgaV07Ci0gICAgY29uc3QgaW50IGEyID0gdG1wWzQgKyBpXSAtIHRtcFsxMisgaV07Ci0gICAgY29uc3QgaW50IGEzID0gdG1wWzAgKyBpXSAtIHRtcFs4ICsgaV07Ci0gICAgY29uc3QgaW50IGIwID0gYTAgKyBhMTsKLSAgICBjb25zdCBpbnQgYjEgPSBhMyArIGEyOwotICAgIGNvbnN0IGludCBiMiA9IGEzIC0gYTI7Ci0gICAgY29uc3QgaW50IGIzID0gYTAgLSBhMTsKLQotICAgIHN1bSArPSB3WyAwXSAqIGFicyhiMCk7Ci0gICAgc3VtICs9IHdbIDRdICogYWJzKGIxKTsKLSAgICBzdW0gKz0gd1sgOF0gKiBhYnMoYjIpOwotICAgIHN1bSArPSB3WzEyXSAqIGFicyhiMyk7Ci0gIH0KLSAgcmV0dXJuIHN1bTsKLX0KLQotc3RhdGljIGludCBEaXN0bzR4NChjb25zdCB1aW50OF90KiBjb25zdCBhLCBjb25zdCB1aW50OF90KiBjb25zdCBiLAotICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCogY29uc3QgdykgewotICBjb25zdCBpbnQgc3VtMSA9IFRUcmFuc2Zvcm0oYSwgdyk7Ci0gIGNvbnN0IGludCBzdW0yID0gVFRyYW5zZm9ybShiLCB3KTsKLSAgcmV0dXJuIGFicyhzdW0yIC0gc3VtMSkgPj4gNTsKLX0KLQotc3RhdGljIGludCBEaXN0bzE2eDE2KGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGEsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGIsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QqIGNvbnN0IHcpIHsKLSAgaW50IEQgPSAwOwotICBpbnQgeCwgeTsKLSAgZm9yICh5ID0gMDsgeSA8IDE2ICogQlBTOyB5ICs9IDQgKiBCUFMpIHsKLSAgICBmb3IgKHggPSAwOyB4IDwgMTY7IHggKz0gNCkgewotICAgICAgRCArPSBEaXN0bzR4NChhICsgeCArIHksIGIgKyB4ICsgeSwgdyk7Ci0gICAgfQotICB9Ci0gIHJldHVybiBEOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gUXVhbnRpemF0aW9uCi0vLwotCi1zdGF0aWMgY29uc3QgdWludDhfdCBrWmlnemFnWzE2XSA9IHsKLSAgMCwgMSwgNCwgOCwgNSwgMiwgMywgNiwgOSwgMTIsIDEzLCAxMCwgNywgMTEsIDE0LCAxNQotfTsKLQotLy8gU2ltcGxlIHF1YW50aXphdGlvbgotc3RhdGljIGludCBRdWFudGl6ZUJsb2NrKGludDE2X3QgaW5bMTZdLCBpbnQxNl90IG91dFsxNl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IG4sIGNvbnN0IFZQOE1hdHJpeCogY29uc3QgbXR4KSB7Ci0gIGludCBsYXN0ID0gLTE7Ci0gIGZvciAoOyBuIDwgMTY7ICsrbikgewotICAgIGNvbnN0IGludCBqID0ga1ppZ3phZ1tuXTsKLSAgICBjb25zdCBpbnQgc2lnbiA9IChpbltqXSA8IDApOwotICAgIGNvbnN0IGludCBjb2VmZiA9IChzaWduID8gLWluW2pdIDogaW5bal0pICsgbXR4LT5zaGFycGVuX1tqXTsKLSAgICBpZiAoY29lZmYgPiBtdHgtPnp0aHJlc2hfW2pdKSB7Ci0gICAgICBjb25zdCBpbnQgUSA9IG10eC0+cV9bal07Ci0gICAgICBjb25zdCBpbnQgaVEgPSBtdHgtPmlxX1tqXTsKLSAgICAgIGNvbnN0IGludCBCID0gbXR4LT5iaWFzX1tqXTsKLSAgICAgIG91dFtuXSA9IFFVQU5URElWKGNvZWZmLCBpUSwgQik7Ci0gICAgICBpZiAob3V0W25dID4gTUFYX0xFVkVMKSBvdXRbbl0gPSBNQVhfTEVWRUw7Ci0gICAgICBpZiAoc2lnbikgb3V0W25dID0gLW91dFtuXTsKLSAgICAgIGluW2pdID0gb3V0W25dICogUTsKLSAgICAgIGlmIChvdXRbbl0pIGxhc3QgPSBuOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXRbbl0gPSAwOwotICAgICAgaW5bal0gPSAwOwotICAgIH0KLSAgfQotICByZXR1cm4gKGxhc3QgPj0gMCk7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBCbG9jayBjb3B5Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIENvcHkoY29uc3QgdWludDhfdCogc3JjLCB1aW50OF90KiBkc3QsIGludCBzaXplKSB7Ci0gIGludCB5OwotICBmb3IgKHkgPSAwOyB5IDwgc2l6ZTsgKyt5KSB7Ci0gICAgU2JNZW1vcnlDb3B5KGRzdCwgc3JjLCBzaXplKTsKLSAgICBzcmMgKz0gQlBTOwotICAgIGRzdCArPSBCUFM7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgQ29weTR4NChjb25zdCB1aW50OF90KiBzcmMsIHVpbnQ4X3QqIGRzdCkgeyBDb3B5KHNyYywgZHN0LCA0KTsgfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gSW5pdGlhbGl6YXRpb24KLQotLy8gU3BlZWQtY3JpdGljYWwgZnVuY3Rpb24gcG9pbnRlcnMuIFdlIGhhdmUgdG8gaW5pdGlhbGl6ZSB0aGVtIHRvIHRoZSBkZWZhdWx0Ci0vLyBpbXBsZW1lbnRhdGlvbnMgd2l0aGluIFZQOEVuY0RzcEluaXQoKS4KLVZQOENIaXN0byBWUDhDb2xsZWN0SGlzdG9ncmFtOwotVlA4SWRjdCBWUDhJVHJhbnNmb3JtOwotVlA4RmRjdCBWUDhGVHJhbnNmb3JtOwotVlA4V0hUIFZQOElUcmFuc2Zvcm1XSFQ7Ci1WUDhXSFQgVlA4RlRyYW5zZm9ybVdIVDsKLVZQOEludHJhNFByZWRzIFZQOEVuY1ByZWRMdW1hNDsKLVZQOEludHJhUHJlZHMgVlA4RW5jUHJlZEx1bWExNjsKLVZQOEludHJhUHJlZHMgVlA4RW5jUHJlZENocm9tYTg7Ci1WUDhNZXRyaWMgVlA4U1NFMTZ4MTY7Ci1WUDhNZXRyaWMgVlA4U1NFOHg4OwotVlA4TWV0cmljIFZQOFNTRTE2eDg7Ci1WUDhNZXRyaWMgVlA4U1NFNHg0OwotVlA4V01ldHJpYyBWUDhURGlzdG80eDQ7Ci1WUDhXTWV0cmljIFZQOFREaXN0bzE2eDE2OwotVlA4UXVhbnRpemVCbG9jayBWUDhFbmNRdWFudGl6ZUJsb2NrOwotVlA4QmxvY2tDb3B5IFZQOENvcHk0eDQ7Ci0KLWV4dGVybiB2b2lkIFZQOEVuY0RzcEluaXRTU0UyKHZvaWQpOwotZXh0ZXJuIHZvaWQgVlA4RW5jRHNwSW5pdE5FT04odm9pZCk7Ci0KLXZvaWQgVlA4RW5jRHNwSW5pdCh2b2lkKSB7Ci0gIEluaXRUYWJsZXMoKTsKLQotICAvLyBkZWZhdWx0IEMgaW1wbGVtZW50YXRpb25zCi0gIFZQOENvbGxlY3RIaXN0b2dyYW0gPSBDb2xsZWN0SGlzdG9ncmFtOwotICBWUDhJVHJhbnNmb3JtID0gSVRyYW5zZm9ybTsKLSAgVlA4RlRyYW5zZm9ybSA9IEZUcmFuc2Zvcm07Ci0gIFZQOElUcmFuc2Zvcm1XSFQgPSBJVHJhbnNmb3JtV0hUOwotICBWUDhGVHJhbnNmb3JtV0hUID0gRlRyYW5zZm9ybVdIVDsKLSAgVlA4RW5jUHJlZEx1bWE0ID0gSW50cmE0UHJlZHM7Ci0gIFZQOEVuY1ByZWRMdW1hMTYgPSBJbnRyYTE2UHJlZHM7Ci0gIFZQOEVuY1ByZWRDaHJvbWE4ID0gSW50cmFDaHJvbWFQcmVkczsKLSAgVlA4U1NFMTZ4MTYgPSBTU0UxNngxNjsKLSAgVlA4U1NFOHg4ID0gU1NFOHg4OwotICBWUDhTU0UxNng4ID0gU1NFMTZ4ODsKLSAgVlA4U1NFNHg0ID0gU1NFNHg0OwotICBWUDhURGlzdG80eDQgPSBEaXN0bzR4NDsKLSAgVlA4VERpc3RvMTZ4MTYgPSBEaXN0bzE2eDE2OwotICBWUDhFbmNRdWFudGl6ZUJsb2NrID0gUXVhbnRpemVCbG9jazsKLSAgVlA4Q29weTR4NCA9IENvcHk0eDQ7Ci0KLSAgLy8gSWYgZGVmaW5lZCwgdXNlIENQVUluZm8oKSB0byBvdmVyd3JpdGUgc29tZSBwb2ludGVycyB3aXRoIGZhc3RlciB2ZXJzaW9ucy4KLSAgaWYgKFZQOEdldENQVUluZm8pIHsKLSNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTIpCi0gICAgaWYgKFZQOEdldENQVUluZm8oa1NTRTIpKSB7Ci0gICAgICBWUDhFbmNEc3BJbml0U1NFMigpOwotICAgIH0KLSNlbGlmIGRlZmluZWQoV0VCUF9VU0VfTkVPTikKLSAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrTkVPTikpIHsKLSAgICAgIFZQOEVuY0RzcEluaXRORU9OKCk7Ci0gICAgfQotI2VuZGlmCi0gIH0KLX0KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kc3AvZW5jX25lb24uYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RzcC9lbmNfbmVvbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjI1NmU2Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RzcC9lbmNfbmVvbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNjM5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBBUk0gTkVPTiB2ZXJzaW9uIG9mIHNwZWVkLWNyaXRpY2FsIGVuY29kaW5nIGZ1bmN0aW9ucy4KLS8vCi0vLyBhZGFwdGVkIGZyb20gbGlidnB4IChodHRwOi8vd3d3LndlYm1wcm9qZWN0Lm9yZy9jb2RlLykKLQotI2luY2x1ZGUgIi4vZHNwLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChXRUJQX1VTRV9ORU9OKQotCi0jaW5jbHVkZSAiLi4vZW5jL3ZwOGVuY2kuaCIKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFRyYW5zZm9ybXMgKFBhcmFncmFwaCAxNC40KQotCi0vLyBJbnZlcnNlIHRyYW5zZm9ybS4KLS8vIFRoaXMgY29kZSBpcyBwcmV0dHkgbXVjaCB0aGUgc2FtZSBhcyBUcmFuc2Zvcm1PbmVORU9OIGluIHRoZSBkZWNvZGVyLCBleGNlcHQKLS8vIGZvciBzdWJ0cmFjdGlvbiB0byAqcmVmLiBTZWUgdGhlIGNvbW1lbnRzIHRoZXJlIGZvciBhbGdvcml0aG1pYyBleHBsYW5hdGlvbnMuCi1zdGF0aWMgdm9pZCBJVHJhbnNmb3JtT25lKGNvbnN0IHVpbnQ4X3QqIHJlZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCkgewotICBjb25zdCBpbnQga0JQUyA9IEJQUzsKLSAgY29uc3QgaW50MTZfdCBrQzFDMltdID0geyAyMDA5MSwgMTc3MzQsIDAsIDAgfTsgIC8vIGtDMSAvIChrQzIgPj4gMSkgLyAwIC8gMAotCi0gIF9fYXNtX18gdm9sYXRpbGUgKAotICAgICJ2bGQxLjE2ICAgICAgICAge3ExLCBxMn0sIFslW2luXV0gICAgICAgICAgIFxuIgotICAgICJ2bGQxLjE2ICAgICAgICAge2QwfSwgWyVba0MxQzJdXSAgICAgICAgICAgIFxuIgotCi0gICAgLy8gZDI6IGluWzBdCi0gICAgLy8gZDM6IGluWzhdCi0gICAgLy8gZDQ6IGluWzRdCi0gICAgLy8gZDU6IGluWzEyXQotICAgICJ2c3dwICAgICAgICAgICAgZDMsIGQ0ICAgICAgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgLy8gcTggPSB7aW5bNF0sIGluWzEyXX0gKiBrQzEgKiAyID4+IDE2Ci0gICAgLy8gcTkgPSB7aW5bNF0sIGluWzEyXX0gKiBrQzIgPj4gMTYKLSAgICAidnFkbXVsaC5zMTYgICAgIHE4LCBxMiwgZDBbMF0gICAgICAgICAgICAgICBcbiIKLSAgICAidnFkbXVsaC5zMTYgICAgIHE5LCBxMiwgZDBbMV0gICAgICAgICAgICAgICBcbiIKLQotICAgIC8vIGQyMiA9IGEgPSBpblswXSArIGluWzhdCi0gICAgLy8gZDIzID0gYiA9IGluWzBdIC0gaW5bOF0KLSAgICAidnFhZGQuczE2ICAgICAgIGQyMiwgZDIsIGQzICAgICAgICAgICAgICAgICBcbiIKLSAgICAidnFzdWIuczE2ICAgICAgIGQyMywgZDIsIGQzICAgICAgICAgICAgICAgICBcbiIKLQotICAgIC8vICBxOCA9IGluWzRdL1sxMl0gKiBrQzEgPj4gMTYKLSAgICAidnNoci5zMTYgICAgICAgIHE4LCBxOCwgIzEgICAgICAgICAgICAgICAgICBcbiIKLQotICAgIC8vIEFkZCB7aW5bNF0sIGluWzEyXX0gYmFjayBhZnRlciB0aGUgbXVsdGlwbGljYXRpb24uCi0gICAgInZxYWRkLnMxNiAgICAgICBxOCwgcTIsIHE4ICAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAvLyBkMjAgPSBjID0gaW5bNF0qa0MyIC0gaW5bMTJdKmtDMQotICAgIC8vIGQyMSA9IGQgPSBpbls0XSprQzEgKyBpblsxMl0qa0MyCi0gICAgInZxc3ViLnMxNiAgICAgICBkMjAsIGQxOCwgZDE3ICAgICAgICAgICAgICAgXG4iCi0gICAgInZxYWRkLnMxNiAgICAgICBkMjEsIGQxOSwgZDE2ICAgICAgICAgICAgICAgXG4iCi0KLSAgICAvLyBkMiA9IHRtcFswXSA9IGEgKyBkCi0gICAgLy8gZDMgPSB0bXBbMV0gPSBiICsgYwotICAgIC8vIGQ0ID0gdG1wWzJdID0gYiAtIGMKLSAgICAvLyBkNSA9IHRtcFszXSA9IGEgLSBkCi0gICAgInZxYWRkLnMxNiAgICAgICBkMiwgZDIyLCBkMjEgICAgICAgICAgICAgICAgXG4iCi0gICAgInZxYWRkLnMxNiAgICAgICBkMywgZDIzLCBkMjAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZxc3ViLnMxNiAgICAgICBkNCwgZDIzLCBkMjAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZxc3ViLnMxNiAgICAgICBkNSwgZDIyLCBkMjEgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAidnppcC4xNiAgICAgICAgIHExLCBxMiAgICAgICAgICAgICAgICAgICAgICBcbiIKLSAgICAidnppcC4xNiAgICAgICAgIHExLCBxMiAgICAgICAgICAgICAgICAgICAgICBcbiIKLQotICAgICJ2c3dwICAgICAgICAgICAgZDMsIGQ0ICAgICAgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgLy8gcTggPSB7dG1wWzRdLCB0bXBbMTJdfSAqIGtDMSAqIDIgPj4gMTYKLSAgICAvLyBxOSA9IHt0bXBbNF0sIHRtcFsxMl19ICoga0MyID4+IDE2Ci0gICAgInZxZG11bGguczE2ICAgICBxOCwgcTIsIGQwWzBdICAgICAgICAgICAgICAgXG4iCi0gICAgInZxZG11bGguczE2ICAgICBxOSwgcTIsIGQwWzFdICAgICAgICAgICAgICAgXG4iCi0KLSAgICAvLyBkMjIgPSBhID0gdG1wWzBdICsgdG1wWzhdCi0gICAgLy8gZDIzID0gYiA9IHRtcFswXSAtIHRtcFs4XQotICAgICJ2cWFkZC5zMTYgICAgICAgZDIyLCBkMiwgZDMgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2cXN1Yi5zMTYgICAgICAgZDIzLCBkMiwgZDMgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgInZzaHIuczE2ICAgICAgICBxOCwgcTgsICMxICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZxYWRkLnMxNiAgICAgICBxOCwgcTIsIHE4ICAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAvLyBkMjAgPSBjID0gaW5bNF0qa0MyIC0gaW5bMTJdKmtDMQotICAgIC8vIGQyMSA9IGQgPSBpbls0XSprQzEgKyBpblsxMl0qa0MyCi0gICAgInZxc3ViLnMxNiAgICAgICBkMjAsIGQxOCwgZDE3ICAgICAgICAgICAgICAgXG4iCi0gICAgInZxYWRkLnMxNiAgICAgICBkMjEsIGQxOSwgZDE2ICAgICAgICAgICAgICAgXG4iCi0KLSAgICAvLyBkMiA9IHRtcFswXSA9IGEgKyBkCi0gICAgLy8gZDMgPSB0bXBbMV0gPSBiICsgYwotICAgIC8vIGQ0ID0gdG1wWzJdID0gYiAtIGMKLSAgICAvLyBkNSA9IHRtcFszXSA9IGEgLSBkCi0gICAgInZxYWRkLnMxNiAgICAgICBkMiwgZDIyLCBkMjEgICAgICAgICAgICAgICAgXG4iCi0gICAgInZxYWRkLnMxNiAgICAgICBkMywgZDIzLCBkMjAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZxc3ViLnMxNiAgICAgICBkNCwgZDIzLCBkMjAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZxc3ViLnMxNiAgICAgICBkNSwgZDIyLCBkMjEgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAidmxkMS4zMiAgICAgICAgIGQ2WzBdLCBbJVtyZWZdXSwgJVtrQlBTXSAgICBcbiIKLSAgICAidmxkMS4zMiAgICAgICAgIGQ2WzFdLCBbJVtyZWZdXSwgJVtrQlBTXSAgICBcbiIKLSAgICAidmxkMS4zMiAgICAgICAgIGQ3WzBdLCBbJVtyZWZdXSwgJVtrQlBTXSAgICBcbiIKLSAgICAidmxkMS4zMiAgICAgICAgIGQ3WzFdLCBbJVtyZWZdXSwgJVtrQlBTXSAgICBcbiIKLQotICAgICJzdWIgICAgICAgICAlW3JlZl0sICVbcmVmXSwgJVtrQlBTXSwgbHNsICMyIFxuIgotCi0gICAgLy8gKHZhbCkgKyA0ID4+IDMKLSAgICAidnJzaHIuczE2ICAgICAgIGQyLCBkMiwgIzMgICAgICAgICAgICAgICAgICBcbiIKLSAgICAidnJzaHIuczE2ICAgICAgIGQzLCBkMywgIzMgICAgICAgICAgICAgICAgICBcbiIKLSAgICAidnJzaHIuczE2ICAgICAgIGQ0LCBkNCwgIzMgICAgICAgICAgICAgICAgICBcbiIKLSAgICAidnJzaHIuczE2ICAgICAgIGQ1LCBkNSwgIzMgICAgICAgICAgICAgICAgICBcbiIKLQotICAgICJ2emlwLjE2ICAgICAgICAgcTEsIHEyICAgICAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2emlwLjE2ICAgICAgICAgcTEsIHEyICAgICAgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgLy8gTXVzdCBhY2N1bXVsYXRlIGJlZm9yZSBzYXR1cmF0aW5nCi0gICAgInZtb3ZsLnU4ICAgICAgICBxOCwgZDYgICAgICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZtb3ZsLnU4ICAgICAgICBxOSwgZDcgICAgICAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAidnFhZGQuczE2ICAgICAgIHExLCBxMSwgcTggICAgICAgICAgICAgICAgICBcbiIKLSAgICAidnFhZGQuczE2ICAgICAgIHEyLCBxMiwgcTkgICAgICAgICAgICAgICAgICBcbiIKLQotICAgICJ2cW1vdnVuLnMxNiAgICAgZDAsIHExICAgICAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2cW1vdnVuLnMxNiAgICAgZDEsIHEyICAgICAgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgInZzdDEuMzIgICAgICAgICBkMFswXSwgWyVbZHN0XV0sICVba0JQU10gICAgXG4iCi0gICAgInZzdDEuMzIgICAgICAgICBkMFsxXSwgWyVbZHN0XV0sICVba0JQU10gICAgXG4iCi0gICAgInZzdDEuMzIgICAgICAgICBkMVswXSwgWyVbZHN0XV0sICVba0JQU10gICAgXG4iCi0gICAgInZzdDEuMzIgICAgICAgICBkMVsxXSwgWyVbZHN0XV0gICAgICAgICAgICAgXG4iCi0KLSAgICA6IFtpbl0gIityIihpbiksIFtkc3RdICIrciIoZHN0KSAgICAgICAgICAgICAgIC8vIG1vZGlmaWVkIHJlZ2lzdGVycwotICAgIDogW2tCUFNdICJyIihrQlBTKSwgW2tDMUMyXSAiciIoa0MxQzIpLCBbcmVmXSAiciIocmVmKSAgLy8gY29uc3RhbnRzCi0gICAgOiAibWVtb3J5IiwgInEwIiwgInExIiwgInEyIiwgInE4IiwgInE5IiwgInExMCIsICJxMTEiICAvLyBjbG9iYmVyZWQKLSAgKTsKLX0KLQotc3RhdGljIHZvaWQgSVRyYW5zZm9ybShjb25zdCB1aW50OF90KiByZWYsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QsIGludCBkb190d28pIHsKLSAgSVRyYW5zZm9ybU9uZShyZWYsIGluLCBkc3QpOwotICBpZiAoZG9fdHdvKSB7Ci0gICAgSVRyYW5zZm9ybU9uZShyZWYgKyA0LCBpbiArIDE2LCBkc3QgKyA0KTsKLSAgfQotfQotCi0vLyBTYW1lIGNvZGUgYXMgZGVjX25lb24uYwotc3RhdGljIHZvaWQgSVRyYW5zZm9ybVdIVChjb25zdCBpbnQxNl90KiBpbiwgaW50MTZfdCogb3V0KSB7Ci0gIGNvbnN0IGludCBrU3RlcCA9IDMyOyAgLy8gVGhlIHN0b3JlIGlzIG9ubHkgaW5jcmVtZW50aW5nIHRoZSBwb2ludGVyIGFzIGlmIHdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFkIHN0b3JlZCBhIHNpbmdsZSBieXRlLgotICBfX2FzbV9fIHZvbGF0aWxlICgKLSAgICAvLyBwYXJ0IDEKLSAgICAvLyBsb2FkIGRhdGEgaW50byBxMCwgcTEKLSAgICAidmxkMS4xNiAgICAgICAgIHtxMCwgcTF9LCBbJVtpbl1dICAgICAgICAgICBcbiIKLQotICAgICJ2YWRkbC5zMTYgICAgICAgcTIsIGQwLCBkMyAgICAgICAgICAgICAgICAgIFxuIiAvLyBhMCA9IGluWzBdICsgaW5bMTJdCi0gICAgInZhZGRsLnMxNiAgICAgICBxMywgZDEsIGQyICAgICAgICAgICAgICAgICAgXG4iIC8vIGExID0gaW5bNF0gKyBpbls4XQotICAgICJ2c3VibC5zMTYgICAgICAgcTQsIGQxLCBkMiAgICAgICAgICAgICAgICAgIFxuIiAvLyBhMiA9IGluWzRdIC0gaW5bOF0KLSAgICAidnN1YmwuczE2ICAgICAgIHE1LCBkMCwgZDMgICAgICAgICAgICAgICAgICBcbiIgLy8gYTMgPSBpblswXSAtIGluWzEyXQotCi0gICAgInZhZGQuczMyICAgICAgICBxMCwgcTIsIHEzICAgICAgICAgICAgICAgICAgXG4iIC8vIHRtcFswXSA9IGEwICsgYTEKLSAgICAidnN1Yi5zMzIgICAgICAgIHEyLCBxMiwgcTMgICAgICAgICAgICAgICAgICBcbiIgLy8gdG1wWzhdID0gYTAgLSBhMQotICAgICJ2YWRkLnMzMiAgICAgICAgcTEsIHE1LCBxNCAgICAgICAgICAgICAgICAgIFxuIiAvLyB0bXBbNF0gPSBhMyArIGEyCi0gICAgInZzdWIuczMyICAgICAgICBxMywgcTUsIHE0ICAgICAgICAgICAgICAgICAgXG4iIC8vIHRtcFsxMl0gPSBhMyAtIGEyCi0KLSAgICAvLyBUcmFuc3Bvc2UKLSAgICAvLyBxMCA9IHRtcFswLCA0LCA4LCAxMl0sIHExID0gdG1wWzIsIDYsIDEwLCAxNF0KLSAgICAvLyBxMiA9IHRtcFsxLCA1LCA5LCAxM10sIHEzID0gdG1wWzMsIDcsIDExLCAxNV0KLSAgICAidnN3cCAgICAgICAgICAgIGQxLCBkNCAgICAgICAgICAgICAgICAgICAgICBcbiIgLy8gdnRybi42NCBxMCwgcTIKLSAgICAidnN3cCAgICAgICAgICAgIGQzLCBkNiAgICAgICAgICAgICAgICAgICAgICBcbiIgLy8gdnRybi42NCBxMSwgcTMKLSAgICAidnRybi4zMiAgICAgICAgIHEwLCBxMSAgICAgICAgICAgICAgICAgICAgICBcbiIKLSAgICAidnRybi4zMiAgICAgICAgIHEyLCBxMyAgICAgICAgICAgICAgICAgICAgICBcbiIKLQotICAgICJ2bW92LnMzMiAgICAgICAgcTQsICMzICAgICAgICAgICAgICAgICAgICAgIFxuIiAvLyBkYyA9IDMKLSAgICAidmFkZC5zMzIgICAgICAgIHEwLCBxMCwgcTQgICAgICAgICAgICAgICAgICBcbiIgLy8gZGMgPSB0bXBbMF0gKyAzCi0gICAgInZhZGQuczMyICAgICAgICBxNiwgcTAsIHEzICAgICAgICAgICAgICAgICAgXG4iIC8vIGEwID0gZGMgKyB0bXBbM10KLSAgICAidmFkZC5zMzIgICAgICAgIHE3LCBxMSwgcTIgICAgICAgICAgICAgICAgICBcbiIgLy8gYTEgPSB0bXBbMV0gKyB0bXBbMl0KLSAgICAidnN1Yi5zMzIgICAgICAgIHE4LCBxMSwgcTIgICAgICAgICAgICAgICAgICBcbiIgLy8gYTIgPSB0bXBbMV0gLSB0bXBbMl0KLSAgICAidnN1Yi5zMzIgICAgICAgIHE5LCBxMCwgcTMgICAgICAgICAgICAgICAgICBcbiIgLy8gYTMgPSBkYyAtIHRtcFszXQotCi0gICAgInZhZGQuczMyICAgICAgICBxMCwgcTYsIHE3ICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZzaHJuLnMzMiAgICAgICBkMCwgcTAsICMzICAgICAgICAgICAgICAgICAgXG4iIC8vIChhMCArIGExKSA+PiAzCi0gICAgInZhZGQuczMyICAgICAgICBxMSwgcTksIHE4ICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZzaHJuLnMzMiAgICAgICBkMSwgcTEsICMzICAgICAgICAgICAgICAgICAgXG4iIC8vIChhMyArIGEyKSA+PiAzCi0gICAgInZzdWIuczMyICAgICAgICBxMiwgcTYsIHE3ICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZzaHJuLnMzMiAgICAgICBkMiwgcTIsICMzICAgICAgICAgICAgICAgICAgXG4iIC8vIChhMCAtIGExKSA+PiAzCi0gICAgInZzdWIuczMyICAgICAgICBxMywgcTksIHE4ICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZzaHJuLnMzMiAgICAgICBkMywgcTMsICMzICAgICAgICAgICAgICAgICAgXG4iIC8vIChhMyAtIGEyKSA+PiAzCi0KLSAgICAvLyBzZXQgdGhlIHJlc3VsdHMgdG8gb3V0cHV0Ci0gICAgInZzdDEuMTYgICAgICAgICBkMFswXSwgWyVbb3V0XV0sICVba1N0ZXBdICAgICAgXG4iCi0gICAgInZzdDEuMTYgICAgICAgICBkMVswXSwgWyVbb3V0XV0sICVba1N0ZXBdICAgICAgXG4iCi0gICAgInZzdDEuMTYgICAgICAgICBkMlswXSwgWyVbb3V0XV0sICVba1N0ZXBdICAgICAgXG4iCi0gICAgInZzdDEuMTYgICAgICAgICBkM1swXSwgWyVbb3V0XV0sICVba1N0ZXBdICAgICAgXG4iCi0gICAgInZzdDEuMTYgICAgICAgICBkMFsxXSwgWyVbb3V0XV0sICVba1N0ZXBdICAgICAgXG4iCi0gICAgInZzdDEuMTYgICAgICAgICBkMVsxXSwgWyVbb3V0XV0sICVba1N0ZXBdICAgICAgXG4iCi0gICAgInZzdDEuMTYgICAgICAgICBkMlsxXSwgWyVbb3V0XV0sICVba1N0ZXBdICAgICAgXG4iCi0gICAgInZzdDEuMTYgICAgICAgICBkM1sxXSwgWyVbb3V0XV0sICVba1N0ZXBdICAgICAgXG4iCi0gICAgInZzdDEuMTYgICAgICAgICBkMFsyXSwgWyVbb3V0XV0sICVba1N0ZXBdICAgICAgXG4iCi0gICAgInZzdDEuMTYgICAgICAgICBkMVsyXSwgWyVbb3V0XV0sICVba1N0ZXBdICAgICAgXG4iCi0gICAgInZzdDEuMTYgICAgICAgICBkMlsyXSwgWyVbb3V0XV0sICVba1N0ZXBdICAgICAgXG4iCi0gICAgInZzdDEuMTYgICAgICAgICBkM1syXSwgWyVbb3V0XV0sICVba1N0ZXBdICAgICAgXG4iCi0gICAgInZzdDEuMTYgICAgICAgICBkMFszXSwgWyVbb3V0XV0sICVba1N0ZXBdICAgICAgXG4iCi0gICAgInZzdDEuMTYgICAgICAgICBkMVszXSwgWyVbb3V0XV0sICVba1N0ZXBdICAgICAgXG4iCi0gICAgInZzdDEuMTYgICAgICAgICBkMlszXSwgWyVbb3V0XV0sICVba1N0ZXBdICAgICAgXG4iCi0gICAgInZzdDEuMTYgICAgICAgICBkM1szXSwgWyVbb3V0XV0sICVba1N0ZXBdICAgICAgXG4iCi0KLSAgICA6IFtvdXRdICIrciIob3V0KSAgLy8gbW9kaWZpZWQgcmVnaXN0ZXJzCi0gICAgOiBbaW5dICJyIihpbiksIFtrU3RlcF0gInIiKGtTdGVwKSAgLy8gY29uc3RhbnRzCi0gICAgOiAibWVtb3J5IiwgInEwIiwgInExIiwgInEyIiwgInEzIiwgInE0IiwKLSAgICAgICJxNSIsICJxNiIsICJxNyIsICJxOCIsICJxOSIgLy8gY2xvYmJlcmVkCi0gICk7Ci19Ci0KLS8vIEZvcndhcmQgdHJhbnNmb3JtLgotCi0vLyBhZGFwdGVkIGZyb20gdnA4L2VuY29kZXIvYXJtL25lb24vc2hvcnRmZGN0X25lb24uYXNtCi1zdGF0aWMgY29uc3QgaW50MTZfdCBrQ29lZmYxNltdID0gewotICA1MzUyLCAgNTM1MiwgIDUzNTIsIDUzNTIsIDIyMTcsICAyMjE3LCAgMjIxNywgMjIxNwotfTsKLXN0YXRpYyBjb25zdCBpbnQzMl90IGtDb2VmZjMyW10gPSB7Ci0gICAxODEyLCAgMTgxMiwgIDE4MTIsICAxODEyLAotICAgIDkzNywgICA5MzcsICAgOTM3LCAgIDkzNywKLSAgMTIwMDAsIDEyMDAwLCAxMjAwMCwgMTIwMDAsCi0gIDUxMDAwLCA1MTAwMCwgNTEwMDAsIDUxMDAwCi19OwotCi1zdGF0aWMgdm9pZCBGVHJhbnNmb3JtKGNvbnN0IHVpbnQ4X3QqIHNyYywgY29uc3QgdWludDhfdCogcmVmLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90KiBvdXQpIHsKLSAgY29uc3QgaW50IGtCUFMgPSBCUFM7Ci0gIGNvbnN0IHVpbnQ4X3QqIHNyY19wdHIgPSBzcmM7Ci0gIGNvbnN0IHVpbnQ4X3QqIHJlZl9wdHIgPSByZWY7Ci0gIGNvbnN0IGludDE2X3QqIGNvZWZmMTYgPSBrQ29lZmYxNjsKLSAgY29uc3QgaW50MzJfdCogY29lZmYzMiA9IGtDb2VmZjMyOwotCi0gIF9fYXNtX18gdm9sYXRpbGUgKAotICAgIC8vIGxvYWQgc3JjIGludG8gcTQsIHE1IGluIGhpZ2ggaGFsZgotICAgICJ2bGQxLjgge2Q4fSwgIFslW3NyY19wdHJdXSwgJVtrQlBTXSAgICAgIFxuIgotICAgICJ2bGQxLjgge2QxMH0sIFslW3NyY19wdHJdXSwgJVtrQlBTXSAgICAgIFxuIgotICAgICJ2bGQxLjgge2Q5fSwgIFslW3NyY19wdHJdXSwgJVtrQlBTXSAgICAgIFxuIgotICAgICJ2bGQxLjgge2QxMX0sIFslW3NyY19wdHJdXSAgICAgICAgICAgICAgIFxuIgotCi0gICAgLy8gbG9hZCByZWYgaW50byBxNiwgcTcgaW4gaGlnaCBoYWxmCi0gICAgInZsZDEuOCB7ZDEyfSwgWyVbcmVmX3B0cl1dLCAlW2tCUFNdICAgICAgXG4iCi0gICAgInZsZDEuOCB7ZDE0fSwgWyVbcmVmX3B0cl1dLCAlW2tCUFNdICAgICAgXG4iCi0gICAgInZsZDEuOCB7ZDEzfSwgWyVbcmVmX3B0cl1dLCAlW2tCUFNdICAgICAgXG4iCi0gICAgInZsZDEuOCB7ZDE1fSwgWyVbcmVmX3B0cl1dICAgICAgICAgICAgICAgXG4iCi0KLSAgICAvLyBQYWNrIHRoZSBoaWdoIHZhbHVlcyBpbiB0byBxNCBhbmQgcTYKLSAgICAidnRybi4zMiAgICAgcTQsIHE1ICAgICAgICAgICAgICAgICAgICAgICBcbiIKLSAgICAidnRybi4zMiAgICAgcTYsIHE3ICAgICAgICAgICAgICAgICAgICAgICBcbiIKLQotICAgIC8vIGRbMC0zXSA9IHNyYyAtIHJlZgotICAgICJ2c3VibC51OCAgICBxMCwgZDgsIGQxMiAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2c3VibC51OCAgICBxMSwgZDksIGQxMyAgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgLy8gbG9hZCBjb2VmZjE2IGludG8gcTgoZDE2PTUzNTIsIGQxNz0yMjE3KQotICAgICJ2bGQxLjE2ICAgICB7cTh9LCBbJVtjb2VmZjE2XV0gICAgICAgICAgIFxuIgotCi0gICAgLy8gbG9hZCBjb2VmZjMyIGhpZ2ggaGFsZiBpbnRvIHE5ID0gMTgxMiwgcTEwID0gOTM3Ci0gICAgInZsZDEuMzIgICAgIHtxOSwgcTEwfSwgWyVbY29lZmYzMl1dISAgICAgXG4iCi0KLSAgICAvLyBsb2FkIGNvZWZmMzIgbG93IGhhbGYgaW50byBxMTE9MTIwMDAsIHExMj01MTAwMAotICAgICJ2bGQxLjMyICAgICB7cTExLHExMn0sIFslW2NvZWZmMzJdXSAgICAgIFxuIgotCi0gICAgLy8gcGFydCAxCi0gICAgLy8gVHJhbnNwb3NlLiBSZWdpc3RlciBkTiBpcyB0aGUgc2FtZSBhcyBkTiBpbiBDCi0gICAgInZ0cm4uMzIgICAgICAgICBkMCwgZDIgICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZ0cm4uMzIgICAgICAgICBkMSwgZDMgICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZ0cm4uMTYgICAgICAgICBkMCwgZDEgICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZ0cm4uMTYgICAgICAgICBkMiwgZDMgICAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAidmFkZC5zMTYgICAgICAgIGQ0LCBkMCwgZDMgICAgICAgICAgICAgICBcbiIgLy8gYTAgPSBkMCArIGQzCi0gICAgInZhZGQuczE2ICAgICAgICBkNSwgZDEsIGQyICAgICAgICAgICAgICAgXG4iIC8vIGExID0gZDEgKyBkMgotICAgICJ2c3ViLnMxNiAgICAgICAgZDYsIGQxLCBkMiAgICAgICAgICAgICAgIFxuIiAvLyBhMiA9IGQxIC0gZDIKLSAgICAidnN1Yi5zMTYgICAgICAgIGQ3LCBkMCwgZDMgICAgICAgICAgICAgICBcbiIgLy8gYTMgPSBkMCAtIGQzCi0KLSAgICAidmFkZC5zMTYgICAgICAgIGQwLCBkNCwgZDUgICAgICAgICAgICAgICBcbiIgLy8gYTAgKyBhMQotICAgICJ2c2hsLnMxNiAgICAgICAgZDAsIGQwLCAjMyAgICAgICAgICAgICAgIFxuIiAvLyB0ZW1wWzAraSo0XSA9IChhMCthMSkgPDwgMwotICAgICJ2c3ViLnMxNiAgICAgICAgZDIsIGQ0LCBkNSAgICAgICAgICAgICAgIFxuIiAvLyBhMCAtIGExCi0gICAgInZzaGwuczE2ICAgICAgICBkMiwgZDIsICMzICAgICAgICAgICAgICAgXG4iIC8vICh0ZW1wWzIraSo0XSA9IChhMC1hMSkgPDwgMwotCi0gICAgInZtbGFsLnMxNiAgICAgICBxOSwgZDcsIGQxNiAgICAgICAgICAgICAgXG4iIC8vIGEzKjUzNTIgKyAxODEyCi0gICAgInZtbGFsLnMxNiAgICAgICBxMTAsIGQ3LCBkMTcgICAgICAgICAgICAgXG4iIC8vIGEzKjIyMTcgKyA5MzcKLSAgICAidm1sYWwuczE2ICAgICAgIHE5LCBkNiwgZDE3ICAgICAgICAgICAgICBcbiIgLy8gYTIqMjIxNyArIGEzKjUzNTIgKyAxODEyCi0gICAgInZtbHNsLnMxNiAgICAgICBxMTAsIGQ2LCBkMTYgICAgICAgICAgICAgXG4iIC8vIGEzKjIyMTcgKyA5MzcgLSBhMio1MzUyCi0KLSAgICAvLyB0ZW1wWzEraSo0XSA9IChkMioyMjE3ICsgZDMqNTM1MiArIDE4MTIpID4+IDkKLSAgICAvLyB0ZW1wWzMraSo0XSA9IChkMyoyMjE3ICsgOTM3IC0gZDIqNTM1MikgPj4gOQotICAgICJ2c2hybi5zMzIgICAgICAgZDEsIHE5LCAjOSAgICAgICAgICAgICAgIFxuIgotICAgICJ2c2hybi5zMzIgICAgICAgZDMsIHExMCwgIzkgICAgICAgICAgICAgIFxuIgotCi0gICAgLy8gcGFydCAyCi0gICAgLy8gdHJhbnNwb3NlIGQwPWlwWzBdLCBkMT1pcFs0XSwgZDI9aXBbOF0sIGQzPWlwWzEyXQotICAgICJ2dHJuLjMyICAgICAgICAgZDAsIGQyICAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2dHJuLjMyICAgICAgICAgZDEsIGQzICAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2dHJuLjE2ICAgICAgICAgZDAsIGQxICAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2dHJuLjE2ICAgICAgICAgZDIsIGQzICAgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgInZtb3YuczE2ICAgICAgICBkMjYsICM3ICAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAidmFkZC5zMTYgICAgICAgIGQ0LCBkMCwgZDMgICAgICAgICAgICAgICBcbiIgLy8gYTEgPSBpcFswXSArIGlwWzEyXQotICAgICJ2YWRkLnMxNiAgICAgICAgZDUsIGQxLCBkMiAgICAgICAgICAgICAgIFxuIiAvLyBiMSA9IGlwWzRdICsgaXBbOF0KLSAgICAidnN1Yi5zMTYgICAgICAgIGQ2LCBkMSwgZDIgICAgICAgICAgICAgICBcbiIgLy8gYzEgPSBpcFs0XSAtIGlwWzhdCi0gICAgInZhZGQuczE2ICAgICAgICBkNCwgZDQsIGQyNiAgICAgICAgICAgICAgXG4iIC8vIGExICsgNwotICAgICJ2c3ViLnMxNiAgICAgICAgZDcsIGQwLCBkMyAgICAgICAgICAgICAgIFxuIiAvLyBkMSA9IGlwWzBdIC0gaXBbMTJdCi0KLSAgICAidmFkZC5zMTYgICAgICAgIGQwLCBkNCwgZDUgICAgICAgICAgICAgICBcbiIgLy8gb3BbMF0gPSBhMSArIGIxICsgNwotICAgICJ2c3ViLnMxNiAgICAgICAgZDIsIGQ0LCBkNSAgICAgICAgICAgICAgIFxuIiAvLyBvcFs4XSA9IGExIC0gYjEgKyA3Ci0KLSAgICAidm1sYWwuczE2ICAgICAgIHExMSwgZDcsIGQxNiAgICAgICAgICAgICBcbiIgLy8gZDEqNTM1MiArIDEyMDAwCi0gICAgInZtbGFsLnMxNiAgICAgICBxMTIsIGQ3LCBkMTcgICAgICAgICAgICAgXG4iIC8vIGQxKjIyMTcgKyA1MTAwMAotCi0gICAgInZjZXEuczE2ICAgICAgICBkNCwgZDcsICMwICAgICAgICAgICAgICAgXG4iCi0KLSAgICAidnNoci5zMTYgICAgICAgIGQwLCBkMCwgIzQgICAgICAgICAgICAgICBcbiIKLSAgICAidnNoci5zMTYgICAgICAgIGQyLCBkMiwgIzQgICAgICAgICAgICAgICBcbiIKLQotICAgICJ2bWxhbC5zMTYgICAgICAgcTExLCBkNiwgZDE3ICAgICAgICAgICAgIFxuIiAvLyBjMSoyMjE3ICsgZDEqNTM1MiArIDEyMDAwCi0gICAgInZtbHNsLnMxNiAgICAgICBxMTIsIGQ2LCBkMTYgICAgICAgICAgICAgXG4iIC8vIGQxKjIyMTcgLSBjMSo1MzUyICsgNTEwMDAKLQotICAgICJ2bXZuICAgICAgICAgICAgZDQsIGQ0ICAgICAgICAgICAgICAgICAgIFxuIiAvLyAhKGQxID09IDApCi0gICAgLy8gb3BbNF0gPSAoYzEqMjIxNyArIGQxKjUzNTIgKyAxMjAwMCk+PjE2Ci0gICAgInZzaHJuLnMzMiAgICAgICBkMSwgcTExLCAjMTYgICAgICAgICAgICAgXG4iCi0gICAgLy8gb3BbNF0gKz0gKGQxIT0wKQotICAgICJ2c3ViLnMxNiAgICAgICAgZDEsIGQxLCBkNCAgICAgICAgICAgICAgIFxuIgotICAgIC8vIG9wWzEyXT0gKGQxKjIyMTcgLSBjMSo1MzUyICsgNTEwMDApPj4xNgotICAgICJ2c2hybi5zMzIgICAgICAgZDMsIHExMiwgIzE2ICAgICAgICAgICAgIFxuIgotCi0gICAgLy8gc2V0IHJlc3VsdCB0byBvdXQgYXJyYXkKLSAgICAidnN0MS4xNiAgICAgICAgIHtxMCwgcTF9LCBbJVtvdXRdXSAgIFxuIgotICAgIDogW3NyY19wdHJdICIrciIoc3JjX3B0ciksIFtyZWZfcHRyXSAiK3IiKHJlZl9wdHIpLAotICAgICAgW2NvZWZmMzJdICIrciIoY29lZmYzMikgICAgICAgICAgLy8gbW9kaWZpZWQgcmVnaXN0ZXJzCi0gICAgOiBba0JQU10gInIiKGtCUFMpLCBbY29lZmYxNl0gInIiKGNvZWZmMTYpLAotICAgICAgW291dF0gInIiKG91dCkgICAgICAgICAgICAgICAgICAgLy8gY29uc3RhbnRzCi0gICAgOiAibWVtb3J5IiwgInEwIiwgInExIiwgInEyIiwgInEzIiwgInE0IiwgInE1IiwgInE2IiwgInE3IiwgInE4IiwgInE5IiwKLSAgICAgICJxMTAiLCAicTExIiwgInExMiIsICJxMTMiICAgICAgIC8vIGNsb2JiZXJlZAotICApOwotfQotCi1zdGF0aWMgdm9pZCBGVHJhbnNmb3JtV0hUKGNvbnN0IGludDE2X3QqIGluLCBpbnQxNl90KiBvdXQpIHsKLSAgY29uc3QgaW50IGtTdGVwID0gMzI7Ci0gIF9fYXNtX18gdm9sYXRpbGUgKAotICAgIC8vIGQwID0gaW5bMCAqIDE2XSAsIGQxID0gaW5bMSAqIDE2XQotICAgIC8vIGQyID0gaW5bMiAqIDE2XSAsIGQzID0gaW5bMyAqIDE2XQotICAgICJ2bGQxLjE2ICAgICAgICAgZDBbMF0sIFslW2luXV0sICVba1N0ZXBdICAgXG4iCi0gICAgInZsZDEuMTYgICAgICAgICBkMVswXSwgWyVbaW5dXSwgJVtrU3RlcF0gICBcbiIKLSAgICAidmxkMS4xNiAgICAgICAgIGQyWzBdLCBbJVtpbl1dLCAlW2tTdGVwXSAgIFxuIgotICAgICJ2bGQxLjE2ICAgICAgICAgZDNbMF0sIFslW2luXV0sICVba1N0ZXBdICAgXG4iCi0gICAgInZsZDEuMTYgICAgICAgICBkMFsxXSwgWyVbaW5dXSwgJVtrU3RlcF0gICBcbiIKLSAgICAidmxkMS4xNiAgICAgICAgIGQxWzFdLCBbJVtpbl1dLCAlW2tTdGVwXSAgIFxuIgotICAgICJ2bGQxLjE2ICAgICAgICAgZDJbMV0sIFslW2luXV0sICVba1N0ZXBdICAgXG4iCi0gICAgInZsZDEuMTYgICAgICAgICBkM1sxXSwgWyVbaW5dXSwgJVtrU3RlcF0gICBcbiIKLSAgICAidmxkMS4xNiAgICAgICAgIGQwWzJdLCBbJVtpbl1dLCAlW2tTdGVwXSAgIFxuIgotICAgICJ2bGQxLjE2ICAgICAgICAgZDFbMl0sIFslW2luXV0sICVba1N0ZXBdICAgXG4iCi0gICAgInZsZDEuMTYgICAgICAgICBkMlsyXSwgWyVbaW5dXSwgJVtrU3RlcF0gICBcbiIKLSAgICAidmxkMS4xNiAgICAgICAgIGQzWzJdLCBbJVtpbl1dLCAlW2tTdGVwXSAgIFxuIgotICAgICJ2bGQxLjE2ICAgICAgICAgZDBbM10sIFslW2luXV0sICVba1N0ZXBdICAgXG4iCi0gICAgInZsZDEuMTYgICAgICAgICBkMVszXSwgWyVbaW5dXSwgJVtrU3RlcF0gICBcbiIKLSAgICAidmxkMS4xNiAgICAgICAgIGQyWzNdLCBbJVtpbl1dLCAlW2tTdGVwXSAgIFxuIgotICAgICJ2bGQxLjE2ICAgICAgICAgZDNbM10sIFslW2luXV0sICVba1N0ZXBdICAgXG4iCi0KLSAgICAidmFkZGwuczE2ICAgICAgIHEyLCBkMCwgZDIgICAgICAgICAgICAgICAgIFxuIiAvLyBhMD0oaW5bMCoxNl0raW5bMioxNl0pCi0gICAgInZhZGRsLnMxNiAgICAgICBxMywgZDEsIGQzICAgICAgICAgICAgICAgICBcbiIgLy8gYTE9KGluWzEqMTZdK2luWzMqMTZdKQotICAgICJ2c3VibC5zMTYgICAgICAgcTQsIGQxLCBkMyAgICAgICAgICAgICAgICAgXG4iIC8vIGEyPShpblsxKjE2XS1pblszKjE2XSkKLSAgICAidnN1YmwuczE2ICAgICAgIHE1LCBkMCwgZDIgICAgICAgICAgICAgICAgIFxuIiAvLyBhMz0oaW5bMCoxNl0taW5bMioxNl0pCi0KLSAgICAidnFhZGQuczMyICAgICAgIHE2LCBxMiwgcTMgICAgICAgICAgICAgICAgIFxuIiAvLyBhMCArIGExCi0gICAgInZxYWRkLnMzMiAgICAgICBxNywgcTUsIHE0ICAgICAgICAgICAgICAgICBcbiIgLy8gYTMgKyBhMgotICAgICJ2cXN1Yi5zMzIgICAgICAgcTgsIHE1LCBxNCAgICAgICAgICAgICAgICAgXG4iIC8vIGEzIC0gYTIKLSAgICAidnFzdWIuczMyICAgICAgIHE5LCBxMiwgcTMgICAgICAgICAgICAgICAgIFxuIiAvLyBhMCAtIGExCi0KLSAgICAvLyBUcmFuc3Bvc2UKLSAgICAvLyBxNiA9IHRtcFswLCAxLCAgMiwgIDNdIDsgcTcgPSB0bXBbIDQsICA1LCAgNiwgIDddCi0gICAgLy8gcTggPSB0bXBbOCwgOSwgMTAsIDExXSA7IHE5ID0gdG1wWzEyLCAxMywgMTQsIDE1XQotICAgICJ2c3dwICAgICAgICAgICAgZDEzLCBkMTYgICAgICAgICAgICAgICAgICAgXG4iIC8vIHZ0cm4uNjQgcTAsIHEyCi0gICAgInZzd3AgICAgICAgICAgICBkMTUsIGQxOCAgICAgICAgICAgICAgICAgICBcbiIgLy8gdnRybi42NCBxMSwgcTMKLSAgICAidnRybi4zMiAgICAgICAgIHE2LCBxNyAgICAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2dHJuLjMyICAgICAgICAgcTgsIHE5ICAgICAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAidnFhZGQuczMyICAgICAgIHEwLCBxNiwgcTggICAgICAgICAgICAgICAgIFxuIiAvLyBhMCA9IHRtcFswXSArIHRtcFs4XQotICAgICJ2cWFkZC5zMzIgICAgICAgcTEsIHE3LCBxOSAgICAgICAgICAgICAgICAgXG4iIC8vIGExID0gdG1wWzRdICsgdG1wWzEyXQotICAgICJ2cXN1Yi5zMzIgICAgICAgcTIsIHE3LCBxOSAgICAgICAgICAgICAgICAgXG4iIC8vIGEyID0gdG1wWzRdIC0gdG1wWzEyXQotICAgICJ2cXN1Yi5zMzIgICAgICAgcTMsIHE2LCBxOCAgICAgICAgICAgICAgICAgXG4iIC8vIGEzID0gdG1wWzBdIC0gdG1wWzhdCi0KLSAgICAidnFhZGQuczMyICAgICAgIHE0LCBxMCwgcTEgICAgICAgICAgICAgICAgIFxuIiAvLyBiMCA9IGEwICsgYTEKLSAgICAidnFhZGQuczMyICAgICAgIHE1LCBxMywgcTIgICAgICAgICAgICAgICAgIFxuIiAvLyBiMSA9IGEzICsgYTIKLSAgICAidnFzdWIuczMyICAgICAgIHE2LCBxMywgcTIgICAgICAgICAgICAgICAgIFxuIiAvLyBiMiA9IGEzIC0gYTIKLSAgICAidnFzdWIuczMyICAgICAgIHE3LCBxMCwgcTEgICAgICAgICAgICAgICAgIFxuIiAvLyBiMyA9IGEwIC0gYTEKLQotICAgICJ2c2hybi5zMzIgICAgICAgZDE4LCBxNCwgIzEgICAgICAgICAgICAgICAgXG4iIC8vIGIwID4+IDEKLSAgICAidnNocm4uczMyICAgICAgIGQxOSwgcTUsICMxICAgICAgICAgICAgICAgIFxuIiAvLyBiMSA+PiAxCi0gICAgInZzaHJuLnMzMiAgICAgICBkMjAsIHE2LCAjMSAgICAgICAgICAgICAgICBcbiIgLy8gYjIgPj4gMQotICAgICJ2c2hybi5zMzIgICAgICAgZDIxLCBxNywgIzEgICAgICAgICAgICAgICAgXG4iIC8vIGIzID4+IDEKLQotICAgICJ2c3QxLjE2ICAgICAgICAge3E5LCBxMTB9LCBbJVtvdXRdXSAgICAgICAgXG4iCi0KLSAgICA6IFtpbl0gIityIihpbikKLSAgICA6IFtrU3RlcF0gInIiKGtTdGVwKSwgW291dF0gInIiKG91dCkKLSAgICA6ICJtZW1vcnkiLCAicTAiLCAicTEiLCAicTIiLCAicTMiLCAicTQiLCAicTUiLAotICAgICAgInE2IiwgInE3IiwgInE4IiwgInE5IiwgInExMCIgICAgICAgLy8gY2xvYmJlcmVkCi0gICkgOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVGV4dHVyZSBkaXN0b3J0aW9uCi0vLwotLy8gV2UgdHJ5IHRvIG1hdGNoIHRoZSBzcGVjdHJhbCBjb250ZW50ICh3ZWlnaHRlZCkgYmV0d2VlbiBzb3VyY2UgYW5kCi0vLyByZWNvbnN0cnVjdGVkIHNhbXBsZXMuCi0KLS8vIEhhZGFtYXJkIHRyYW5zZm9ybQotLy8gUmV0dXJucyB0aGUgd2VpZ2h0ZWQgc3VtIG9mIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMuCi0vLyBUaGlzIHVzZXMgYSBUVHJhbnNmb3JtIGhlbHBlciBmdW5jdGlvbiBpbiBDCi1zdGF0aWMgaW50IERpc3RvNHg0KGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGEsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGIsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90KiBjb25zdCB3KSB7Ci0gIGNvbnN0IGludCBrQlBTID0gQlBTOwotICBjb25zdCB1aW50OF90KiBBID0gYTsKLSAgY29uc3QgdWludDhfdCogQiA9IGI7Ci0gIGNvbnN0IHVpbnQxNl90KiBXID0gdzsKLSAgaW50IHN1bTsKLSAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgInZsZDEuMzIgICAgICAgICBkMFswXSwgWyVbYV1dLCAlW2tCUFNdICAgXG4iCi0gICAgInZsZDEuMzIgICAgICAgICBkMFsxXSwgWyVbYV1dLCAlW2tCUFNdICAgXG4iCi0gICAgInZsZDEuMzIgICAgICAgICBkMlswXSwgWyVbYV1dLCAlW2tCUFNdICAgXG4iCi0gICAgInZsZDEuMzIgICAgICAgICBkMlsxXSwgWyVbYV1dICAgICAgICAgICAgXG4iCi0KLSAgICAidmxkMS4zMiAgICAgICAgIGQxWzBdLCBbJVtiXV0sICVba0JQU10gICBcbiIKLSAgICAidmxkMS4zMiAgICAgICAgIGQxWzFdLCBbJVtiXV0sICVba0JQU10gICBcbiIKLSAgICAidmxkMS4zMiAgICAgICAgIGQzWzBdLCBbJVtiXV0sICVba0JQU10gICBcbiIKLSAgICAidmxkMS4zMiAgICAgICAgIGQzWzFdLCBbJVtiXV0gICAgICAgICAgICBcbiIKLQotICAgIC8vIGEgZDAvZDIsIGIgZDEvZDMKLSAgICAvLyBkMC9kMTogMDEgMDEgMDEgMDEKLSAgICAvLyBkMi9kMzogMjMgMjMgMjMgMjMKLSAgICAvLyBCdXQ6IGl0IGdvZXMgMDEgNDUgMjMgNjcKLSAgICAvLyBOb3RpY2UgdGhlIG1pZGRsZSB2YWx1ZXMgYXJlIHRyYW5zcG9zZWQKLSAgICAidnRybi4xNiAgICAgICAgIHEwLCBxMSAgICAgICAgICAgICAgICAgICBcbiIKLQotICAgIC8vIHthMCwgYTF9ID0ge2luWzBdICsgaW5bMl0sIGluWzFdICsgaW5bM119Ci0gICAgInZhZGRsLnU4ICAgICAgICBxMiwgZDAsIGQyICAgICAgICAgICAgICAgXG4iCi0gICAgInZhZGRsLnU4ICAgICAgICBxMTAsIGQxLCBkMyAgICAgICAgICAgICAgXG4iCi0gICAgLy8ge2EzLCBhMn0gPSB7aW5bMF0gLSBpblsyXSwgaW5bMV0gLSBpblszXX0KLSAgICAidnN1YmwudTggICAgICAgIHEzLCBkMCwgZDIgICAgICAgICAgICAgICBcbiIKLSAgICAidnN1YmwudTggICAgICAgIHExMSwgZDEsIGQzICAgICAgICAgICAgICBcbiIKLQotICAgIC8vIHRtcFswXSA9IGEwICsgYTEKLSAgICAidnBhZGRsLnMxNiAgICAgIHEwLCBxMiAgICAgICAgICAgICAgICAgICBcbiIKLSAgICAidnBhZGRsLnMxNiAgICAgIHE4LCBxMTAgICAgICAgICAgICAgICAgICBcbiIKLQotICAgIC8vIHRtcFsxXSA9IGEzICsgYTIKLSAgICAidnBhZGRsLnMxNiAgICAgIHExLCBxMyAgICAgICAgICAgICAgICAgICBcbiIKLSAgICAidnBhZGRsLnMxNiAgICAgIHE5LCBxMTEgICAgICAgICAgICAgICAgICBcbiIKLQotICAgIC8vIE5vIHBhaXIgc3VidHJhY3QKLSAgICAvLyBxMiA9IHthMCwgYTN9Ci0gICAgLy8gcTMgPSB7YTEsIGEyfQotICAgICJ2dHJuLjE2ICAgICAgICAgcTIsIHEzICAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2dHJuLjE2ICAgICAgICAgcTEwLCBxMTEgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgLy8ge3RtcFszXSwgdG1wWzJdfSA9IHthMCAtIGExLCBhMyAtIGEyfQotICAgICJ2c3VibC5zMTYgICAgICAgcTEyLCBkNCwgZDYgICAgICAgICAgICAgIFxuIgotICAgICJ2c3VibC5zMTYgICAgICAgcTEzLCBkNSwgZDcgICAgICAgICAgICAgIFxuIgotICAgICJ2c3VibC5zMTYgICAgICAgcTE0LCBkMjAsIGQyMiAgICAgICAgICAgIFxuIgotICAgICJ2c3VibC5zMTYgICAgICAgcTE1LCBkMjEsIGQyMyAgICAgICAgICAgIFxuIgotCi0gICAgLy8gc2VwYXJhdGUgdG1wWzNdIGFuZCB0bXBbMl0KLSAgICAvLyBxMTIgPSB0bXBbM10KLSAgICAvLyBxMTMgPSB0bXBbMl0KLSAgICAidnRybi4zMiAgICAgICAgIHExMiwgcTEzICAgICAgICAgICAgICAgICBcbiIKLSAgICAidnRybi4zMiAgICAgICAgIHExNCwgcTE1ICAgICAgICAgICAgICAgICBcbiIKLQotICAgIC8vIFRyYW5zcG9zZSB0bXAgZm9yIGEKLSAgICAidnN3cCAgICAgICAgICAgIGQxLCBkMjYgICAgICAgICAgICAgICAgICBcbiIgLy8gdnRybi42NAotICAgICJ2c3dwICAgICAgICAgICAgZDMsIGQyNCAgICAgICAgICAgICAgICAgIFxuIiAvLyB2dHJuLjY0Ci0gICAgInZ0cm4uMzIgICAgICAgICBxMCwgcTEgICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZ0cm4uMzIgICAgICAgICBxMTMsIHExMiAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAvLyBUcmFuc3Bvc2UgdG1wIGZvciBiCi0gICAgInZzd3AgICAgICAgICAgICBkMTcsIGQzMCAgICAgICAgICAgICAgICAgXG4iIC8vIHZ0cm4uNjQKLSAgICAidnN3cCAgICAgICAgICAgIGQxOSwgZDI4ICAgICAgICAgICAgICAgICBcbiIgLy8gdnRybi42NAotICAgICJ2dHJuLjMyICAgICAgICAgcTgsIHE5ICAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2dHJuLjMyICAgICAgICAgcTE1LCBxMTQgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgLy8gVGhlIGZpcnN0IFEgcmVnaXN0ZXIgaXMgYSwgdGhlIHNlY29uZCBiLgotICAgIC8vIHEwLzggdG1wWzAtM10KLSAgICAvLyBxMTMvMTUgdG1wWzQtN10KLSAgICAvLyBxMS85IHRtcFs4LTExXQotICAgIC8vIHExMi8xNCB0bXBbMTItMTVdCi0KLSAgICAvLyBUaGVzZSBhcmUgc3RpbGwgaW4gMDEgNDUgMjMgNjcgb3JkZXIuIFdlIGZpeCBpdCBlYXNpbHkgaW4gdGhlIGFkZGl0aW9uCi0gICAgLy8gY2FzZSBidXQgdGhlIHN1YnRyYWN0aW9uIHByb3BlZ2F0ZXMgdGhlbS4KLSAgICAidnN3cCAgICAgICAgICAgIGQzLCBkMjcgICAgICAgICAgICAgICAgICBcbiIKLSAgICAidnN3cCAgICAgICAgICAgIGQxOSwgZDMxICAgICAgICAgICAgICAgICBcbiIKLQotICAgIC8vIGEwID0gdG1wWzBdICsgdG1wWzhdCi0gICAgInZhZGQuczMyICAgICAgICBxMiwgcTAsIHExICAgICAgICAgICAgICAgXG4iCi0gICAgInZhZGQuczMyICAgICAgICBxMywgcTgsIHE5ICAgICAgICAgICAgICAgXG4iCi0KLSAgICAvLyBhMSA9IHRtcFs0XSArIHRtcFsxMl0KLSAgICAidmFkZC5zMzIgICAgICAgIHExMCwgcTEzLCBxMTIgICAgICAgICAgICBcbiIKLSAgICAidmFkZC5zMzIgICAgICAgIHExMSwgcTE1LCBxMTQgICAgICAgICAgICBcbiIKLQotICAgIC8vIGEyID0gdG1wWzRdIC0gdG1wWzEyXQotICAgICJ2c3ViLnMzMiAgICAgICAgcTEzLCBxMTMsIHExMiAgICAgICAgICAgIFxuIgotICAgICJ2c3ViLnMzMiAgICAgICAgcTE1LCBxMTUsIHExNCAgICAgICAgICAgIFxuIgotCi0gICAgLy8gYTMgPSB0bXBbMF0gLSB0bXBbOF0KLSAgICAidnN1Yi5zMzIgICAgICAgIHEwLCBxMCwgcTEgICAgICAgICAgICAgICBcbiIKLSAgICAidnN1Yi5zMzIgICAgICAgIHE4LCBxOCwgcTkgICAgICAgICAgICAgICBcbiIKLQotICAgIC8vIGIwID0gYTAgKyBhMQotICAgICJ2YWRkLnMzMiAgICAgICAgcTEsIHEyLCBxMTAgICAgICAgICAgICAgIFxuIgotICAgICJ2YWRkLnMzMiAgICAgICAgcTksIHEzLCBxMTEgICAgICAgICAgICAgIFxuIgotCi0gICAgLy8gYjEgPSBhMyArIGEyCi0gICAgInZhZGQuczMyICAgICAgICBxMTIsIHEwLCBxMTMgICAgICAgICAgICAgXG4iCi0gICAgInZhZGQuczMyICAgICAgICBxMTQsIHE4LCBxMTUgICAgICAgICAgICAgXG4iCi0KLSAgICAvLyBiMiA9IGEzIC0gYTIKLSAgICAidnN1Yi5zMzIgICAgICAgIHEwLCBxMCwgcTEzICAgICAgICAgICAgICBcbiIKLSAgICAidnN1Yi5zMzIgICAgICAgIHE4LCBxOCwgcTE1ICAgICAgICAgICAgICBcbiIKLQotICAgIC8vIGIzID0gYTAgLSBhMQotICAgICJ2c3ViLnMzMiAgICAgICAgcTIsIHEyLCBxMTAgICAgICAgICAgICAgIFxuIgotICAgICJ2c3ViLnMzMiAgICAgICAgcTMsIHEzLCBxMTEgICAgICAgICAgICAgIFxuIgotCi0gICAgInZsZDEuNjQgICAgICAgICB7cTEwLCBxMTF9LCBbJVt3XV0gICAgICAgXG4iCi0KLSAgICAvLyBhYnMoYjApCi0gICAgInZhYnMuczMyICAgICAgICBxMSwgcTEgICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZhYnMuczMyICAgICAgICBxOSwgcTkgICAgICAgICAgICAgICAgICAgXG4iCi0gICAgLy8gYWJzKGIxKQotICAgICJ2YWJzLnMzMiAgICAgICAgcTEyLCBxMTIgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2YWJzLnMzMiAgICAgICAgcTE0LCBxMTQgICAgICAgICAgICAgICAgIFxuIgotICAgIC8vIGFicyhiMikKLSAgICAidmFicy5zMzIgICAgICAgIHEwLCBxMCAgICAgICAgICAgICAgICAgICBcbiIKLSAgICAidmFicy5zMzIgICAgICAgIHE4LCBxOCAgICAgICAgICAgICAgICAgICBcbiIKLSAgICAvLyBhYnMoYjMpCi0gICAgInZhYnMuczMyICAgICAgICBxMiwgcTIgICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZhYnMuczMyICAgICAgICBxMywgcTMgICAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAvLyBleHBhbmQgdyBiZWZvcmUgdXNpbmcuCi0gICAgInZtb3ZsLnUxNiAgICAgICBxMTMsIGQyMCAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZtb3ZsLnUxNiAgICAgICBxMTUsIGQyMSAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAvLyB3WzBdICogYWJzKGIwKQotICAgICJ2bXVsLnUzMiAgICAgICAgcTEsIHExLCBxMTMgICAgICAgICAgICAgIFxuIgotICAgICJ2bXVsLnUzMiAgICAgICAgcTksIHE5LCBxMTMgICAgICAgICAgICAgIFxuIgotCi0gICAgLy8gd1s0XSAqIGFicyhiMSkKLSAgICAidm1sYS51MzIgICAgICAgIHExLCBxMTIsIHExNSAgICAgICAgICAgICBcbiIKLSAgICAidm1sYS51MzIgICAgICAgIHE5LCBxMTQsIHExNSAgICAgICAgICAgICBcbiIKLQotICAgIC8vIGV4cGFuZCB3IGJlZm9yZSB1c2luZy4KLSAgICAidm1vdmwudTE2ICAgICAgIHExMywgZDIyICAgICAgICAgICAgICAgICBcbiIKLSAgICAidm1vdmwudTE2ICAgICAgIHExNSwgZDIzICAgICAgICAgICAgICAgICBcbiIKLQotICAgIC8vIHdbOF0gKiBhYnMoYjEpCi0gICAgInZtbGEudTMyICAgICAgICBxMSwgcTAsIHExMyAgICAgICAgICAgICAgXG4iCi0gICAgInZtbGEudTMyICAgICAgICBxOSwgcTgsIHExMyAgICAgICAgICAgICAgXG4iCi0KLSAgICAvLyB3WzEyXSAqIGFicyhiMSkKLSAgICAidm1sYS51MzIgICAgICAgIHExLCBxMiwgcTE1ICAgICAgICAgICAgICBcbiIKLSAgICAidm1sYS51MzIgICAgICAgIHE5LCBxMywgcTE1ICAgICAgICAgICAgICBcbiIKLQotICAgIC8vIFN1bSB0aGUgYXJyYXlzCi0gICAgInZwYWRkbC51MzIgICAgICBxMSwgcTEgICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZwYWRkbC51MzIgICAgICBxOSwgcTkgICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZhZGQudTY0ICAgICAgICBkMiwgZDMgICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZhZGQudTY0ICAgICAgICBkMTgsIGQxOSAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAvLyBIYWRhbWFyZCB0cmFuc2Zvcm0gbmVlZHMgNCBiaXRzIG9mIGV4dHJhIHByZWNpc2lvbiAoMiBiaXRzIGluIGVhY2gKLSAgICAvLyBkaXJlY3Rpb24pIGZvciBkeW5hbWljIHJhdy4gV2VpZ2h0cyB3W10gYXJlIDE2Yml0cyBhdCBtYXgsIHNvIHRoZSBtYXhpbXVtCi0gICAgLy8gcHJlY2lzaW9uIGZvciBjb2VmZiBpcyA4Yml0IG9mIGlucHV0ICsgNGJpdHMgb2YgSGFkYW1hcmQgdHJhbnNmb3JtICsKLSAgICAvLyAxNmJpdHMgZm9yIHdbXSArIDIgYml0cyBvZiBhYnMoKSBzdW1tYXRpb24uCi0gICAgLy8KLSAgICAvLyBUaGlzIHVzZXMgYSBtYXhpbXVtIG9mIDMxIGJpdHMgKHNpZ25lZCkuIERpc2NhcmRpbmcgdGhlIHRvcCAzMiBiaXRzIGlzCi0gICAgLy8gQS1PSy4KLQotICAgIC8vIHN1bTIgLSBzdW0xCi0gICAgInZzdWIudTMyICAgICAgICBkMCwgZDIsIGQxOCAgICAgICAgICAgICAgXG4iCi0gICAgLy8gYWJzKHN1bTIgLSBzdW0xKQotICAgICJ2YWJzLnMzMiAgICAgICAgZDAsIGQwICAgICAgICAgICAgICAgICAgIFxuIgotICAgIC8vIGFicyhzdW0yIC0gc3VtMSkgPj4gNQotICAgICJ2c2hyLnUzMiAgICAgICAgZDAsICM1ICAgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgLy8gSXQgd291bGQgYmUgYmV0dGVyIHRvIG1vdmUgdGhlIHZhbHVlIHN0cmFpZ2h0IGludG8gcjAgYnV0IEknbSBub3QKLSAgICAvLyBlbnRpcmVseSBzdXJlIGhvdyB0aGlzIHdvcmtzIHdpdGggaW5saW5lIGFzc2VtYmx5LgotICAgICJ2bW92LjMyICAgICAgICAgJVtzdW1dLCBkMFswXSAgICAgICAgICAgIFxuIgotCi0gICAgOiBbc3VtXSAiPXIiKHN1bSksIFthXSAiK3IiKEEpLCBbYl0gIityIihCKSwgW3ddICIrciIoVykKLSAgICA6IFtrQlBTXSAiciIoa0JQUykKLSAgICA6ICJtZW1vcnkiLCAicTAiLCAicTEiLCAicTIiLCAicTMiLCAicTQiLCAicTUiLCAicTYiLCAicTciLCAicTgiLCAicTkiLAotICAgICAgInExMCIsICJxMTEiLCAicTEyIiwgInExMyIsICJxMTQiLCAicTE1IiAgLy8gY2xvYmJlcmVkCi0gICkgOwotCi0gIHJldHVybiBzdW07Ci19Ci0KLXN0YXRpYyBpbnQgRGlzdG8xNngxNihjb25zdCB1aW50OF90KiBjb25zdCBhLCBjb25zdCB1aW50OF90KiBjb25zdCBiLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90KiBjb25zdCB3KSB7Ci0gIGludCBEID0gMDsKLSAgaW50IHgsIHk7Ci0gIGZvciAoeSA9IDA7IHkgPCAxNiAqIEJQUzsgeSArPSA0ICogQlBTKSB7Ci0gICAgZm9yICh4ID0gMDsgeCA8IDE2OyB4ICs9IDQpIHsKLSAgICAgIEQgKz0gRGlzdG80eDQoYSArIHggKyB5LCBiICsgeCArIHksIHcpOwotICAgIH0KLSAgfQotICByZXR1cm4gRDsKLX0KLQotI2VuZGlmICAgLy8gV0VCUF9VU0VfTkVPTgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRW50cnkgcG9pbnQKLQotZXh0ZXJuIHZvaWQgVlA4RW5jRHNwSW5pdE5FT04odm9pZCk7Ci0KLXZvaWQgVlA4RW5jRHNwSW5pdE5FT04odm9pZCkgewotI2lmIGRlZmluZWQoV0VCUF9VU0VfTkVPTikKLSAgVlA4SVRyYW5zZm9ybSA9IElUcmFuc2Zvcm07Ci0gIFZQOEZUcmFuc2Zvcm0gPSBGVHJhbnNmb3JtOwotCi0gIFZQOElUcmFuc2Zvcm1XSFQgPSBJVHJhbnNmb3JtV0hUOwotICBWUDhGVHJhbnNmb3JtV0hUID0gRlRyYW5zZm9ybVdIVDsKLQotICBWUDhURGlzdG80eDQgPSBEaXN0bzR4NDsKLSAgVlA4VERpc3RvMTZ4MTYgPSBEaXN0bzE2eDE2OwotI2VuZGlmICAgLy8gV0VCUF9VU0VfTkVPTgotfQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RzcC9lbmNfc3NlMi5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL2VuY19zc2UyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMmU5OTAuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL2VuY19zc2UyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NjkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIFNTRTIgdmVyc2lvbiBvZiBzcGVlZC1jcml0aWNhbCBlbmNvZGluZyBmdW5jdGlvbnMuCi0vLwotLy8gQXV0aG9yOiBDaHJpc3RpYW4gRHV2aXZpZXIgKGNkdXZpdmllckBnb29nbGUuY29tKQotCi0jaW5jbHVkZSAiLi9kc3AuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTIpCi0jaW5jbHVkZSA8c3RkbGliLmg+ICAvLyBmb3IgYWJzKCkKLSNpbmNsdWRlIDxlbW1pbnRyaW4uaD4KLQotI2luY2x1ZGUgIi4uL2VuYy92cDhlbmNpLmgiCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBRdWl0ZSB1c2VmdWwgbWFjcm8gZm9yIGRlYnVnZ2luZy4gTGVmdCBoZXJlIGZvciBjb252ZW5pZW5jZS4KLQotI2lmIDAKLSNpbmNsdWRlIDxzdGRpby5oPgotc3RhdGljIHZvaWQgUHJpbnRSZWcoY29uc3QgX19tMTI4aSByLCBjb25zdCBjaGFyKiBjb25zdCBuYW1lLCBpbnQgc2l6ZSkgewotICBpbnQgbjsKLSAgdW5pb24gewotICAgIF9fbTEyOGkgcjsKLSAgICB1aW50OF90IGk4WzE2XTsKLSAgICB1aW50MTZfdCBpMTZbOF07Ci0gICAgdWludDMyX3QgaTMyWzRdOwotICAgIHVpbnQ2NF90IGk2NFsyXTsKLSAgfSB0bXA7Ci0gIHRtcC5yID0gcjsKLSAgcHJpbnRmKCIlc1x0OiAiLCBuYW1lKTsKLSAgaWYgKHNpemUgPT0gOCkgewotICAgIGZvciAobiA9IDA7IG4gPCAxNjsgKytuKSBwcmludGYoIiUuMnggIiwgdG1wLmk4W25dKTsKLSAgfSBlbHNlIGlmIChzaXplID09IDE2KSB7Ci0gICAgZm9yIChuID0gMDsgbiA8IDg7ICsrbikgcHJpbnRmKCIlLjR4ICIsIHRtcC5pMTZbbl0pOwotICB9IGVsc2UgaWYgKHNpemUgPT0gMzIpIHsKLSAgICBmb3IgKG4gPSAwOyBuIDwgNDsgKytuKSBwcmludGYoIiUuOHggIiwgdG1wLmkzMltuXSk7Ci0gIH0gZWxzZSB7Ci0gICAgZm9yIChuID0gMDsgbiA8IDI7ICsrbikgcHJpbnRmKCIlLjE2bHggIiwgdG1wLmk2NFtuXSk7Ci0gIH0KLSAgcHJpbnRmKCJcbiIpOwotfQotI2VuZGlmCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb21wdXRlIHN1c2NlcHRpYmlsaXR5IGJhc2VkIG9uIERDVC1jb2VmZiBoaXN0b2dyYW1zOgotLy8gdGhlIGhpZ2hlciwgdGhlICJlYXNpZXIiIHRoZSBtYWNyb2Jsb2NrIGlzIHRvIGNvbXByZXNzLgotCi1zdGF0aWMgdm9pZCBDb2xsZWN0SGlzdG9ncmFtU1NFMihjb25zdCB1aW50OF90KiByZWYsIGNvbnN0IHVpbnQ4X3QqIHByZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfYmxvY2ssIGludCBlbmRfYmxvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhIaXN0b2dyYW0qIGNvbnN0IGhpc3RvKSB7Ci0gIGNvbnN0IF9fbTEyOGkgbWF4X2NvZWZmX3RocmVzaCA9IF9tbV9zZXQxX2VwaTE2KE1BWF9DT0VGRl9USFJFU0gpOwotICBpbnQgajsKLSAgZm9yIChqID0gc3RhcnRfYmxvY2s7IGogPCBlbmRfYmxvY2s7ICsraikgewotICAgIGludDE2X3Qgb3V0WzE2XTsKLSAgICBpbnQgazsKLQotICAgIFZQOEZUcmFuc2Zvcm0ocmVmICsgVlA4RHNwU2NhbltqXSwgcHJlZCArIFZQOERzcFNjYW5bal0sIG91dCk7Ci0KLSAgICAvLyBDb252ZXJ0IGNvZWZmaWNpZW50cyB0byBiaW4gKHdpdGhpbiBvdXRbXSkuCi0gICAgewotICAgICAgLy8gTG9hZC4KLSAgICAgIGNvbnN0IF9fbTEyOGkgb3V0MCA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJm91dFswXSk7Ci0gICAgICBjb25zdCBfX20xMjhpIG91dDEgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbOF0pOwotICAgICAgLy8gc2lnbihvdXQpID0gb3V0ID4+IDE1ICAoMHgwMDAwIGlmIHBvc2l0aXZlLCAweGZmZmYgaWYgbmVnYXRpdmUpCi0gICAgICBjb25zdCBfX20xMjhpIHNpZ24wID0gX21tX3NyYWlfZXBpMTYob3V0MCwgMTUpOwotICAgICAgY29uc3QgX19tMTI4aSBzaWduMSA9IF9tbV9zcmFpX2VwaTE2KG91dDEsIDE1KTsKLSAgICAgIC8vIGFicyhvdXQpID0gKG91dCBeIHNpZ24pIC0gc2lnbgotICAgICAgY29uc3QgX19tMTI4aSB4b3IwID0gX21tX3hvcl9zaTEyOChvdXQwLCBzaWduMCk7Ci0gICAgICBjb25zdCBfX20xMjhpIHhvcjEgPSBfbW1feG9yX3NpMTI4KG91dDEsIHNpZ24xKTsKLSAgICAgIGNvbnN0IF9fbTEyOGkgYWJzMCA9IF9tbV9zdWJfZXBpMTYoeG9yMCwgc2lnbjApOwotICAgICAgY29uc3QgX19tMTI4aSBhYnMxID0gX21tX3N1Yl9lcGkxNih4b3IxLCBzaWduMSk7Ci0gICAgICAvLyB2ID0gYWJzKG91dCkgPj4gMwotICAgICAgY29uc3QgX19tMTI4aSB2MCA9IF9tbV9zcmFpX2VwaTE2KGFiczAsIDMpOwotICAgICAgY29uc3QgX19tMTI4aSB2MSA9IF9tbV9zcmFpX2VwaTE2KGFiczEsIDMpOwotICAgICAgLy8gYmluID0gbWluKHYsIE1BWF9DT0VGRl9USFJFU0gpCi0gICAgICBjb25zdCBfX20xMjhpIGJpbjAgPSBfbW1fbWluX2VwaTE2KHYwLCBtYXhfY29lZmZfdGhyZXNoKTsKLSAgICAgIGNvbnN0IF9fbTEyOGkgYmluMSA9IF9tbV9taW5fZXBpMTYodjEsIG1heF9jb2VmZl90aHJlc2gpOwotICAgICAgLy8gU3RvcmUuCi0gICAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmb3V0WzBdLCBiaW4wKTsKLSAgICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbOF0sIGJpbjEpOwotICAgIH0KLQotICAgIC8vIENvbnZlcnQgY29lZmZpY2llbnRzIHRvIGJpbi4KLSAgICBmb3IgKGsgPSAwOyBrIDwgMTY7ICsraykgewotICAgICAgaGlzdG8tPmRpc3RyaWJ1dGlvbltvdXRba11dKys7Ci0gICAgfQotICB9Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBUcmFuc2Zvcm1zIChQYXJhZ3JhcGggMTQuNCkKLQotLy8gRG9lcyBvbmUgb3IgdHdvIGludmVyc2UgdHJhbnNmb3Jtcy4KLXN0YXRpYyB2b2lkIElUcmFuc2Zvcm1TU0UyKGNvbnN0IHVpbnQ4X3QqIHJlZiwgY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkb190d28pIHsKLSAgLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBtYWtlcyB1c2Ugb2YgMTYtYml0IGZpeGVkIHBvaW50IHZlcnNpb25zIG9mIHR3bwotICAvLyBtdWx0aXBseSBjb25zdGFudHM6Ci0gIC8vICAgIEsxID0gc3FydCgyKSAqIGNvcyAocGkvOCkgfj0gODU2MjcgLyAyXjE2Ci0gIC8vICAgIEsyID0gc3FydCgyKSAqIHNpbiAocGkvOCkgfj0gMzU0NjggLyAyXjE2Ci0gIC8vCi0gIC8vIFRvIGJlIGFibGUgdG8gdXNlIHNpZ25lZCAxNi1iaXQgaW50ZWdlcnMsIHdlIHVzZSB0aGUgZm9sbG93aW5nIHRyaWNrIHRvCi0gIC8vIGhhdmUgY29uc3RhbnRzIHdpdGhpbiByYW5nZToKLSAgLy8gLSBBc3NvY2lhdGVkIGNvbnN0YW50cyBhcmUgb2J0YWluZWQgYnkgc3VidHJhY3RpbmcgdGhlIDE2LWJpdCBmaXhlZCBwb2ludAotICAvLyAgIHZlcnNpb24gb2Ygb25lOgotICAvLyAgICAgIGsgPSBLIC0gKDEgPDwgMTYpICA9PiAgSyA9IGsgKyAoMSA8PCAxNikKLSAgLy8gICAgICBLMSA9IDg1MjY3ICA9PiAgazEgPSAgMjAwOTEKLSAgLy8gICAgICBLMiA9IDM1NDY4ICA9PiAgazIgPSAtMzAwNjgKLSAgLy8gLSBUaGUgbXVsdGlwbGljYXRpb24gb2YgYSB2YXJpYWJsZSBieSBhIGNvbnN0YW50IGJlY29tZSB0aGUgc3VtIG9mIHRoZQotICAvLyAgIHZhcmlhYmxlIGFuZCB0aGUgbXVsdGlwbGljYXRpb24gb2YgdGhhdCB2YXJpYWJsZSBieSB0aGUgYXNzb2NpYXRlZAotICAvLyAgIGNvbnN0YW50OgotICAvLyAgICAgICh4ICogSykgPj4gMTYgPSAoeCAqIChrICsgKDEgPDwgMTYpKSkgPj4gMTYgPSAoKHggKiBrICkgPj4gMTYpICsgeAotICBjb25zdCBfX20xMjhpIGsxID0gX21tX3NldDFfZXBpMTYoMjAwOTEpOwotICBjb25zdCBfX20xMjhpIGsyID0gX21tX3NldDFfZXBpMTYoLTMwMDY4KTsKLSAgX19tMTI4aSBUMCwgVDEsIFQyLCBUMzsKLQotICAvLyBMb2FkIGFuZCBjb25jYXRlbmF0ZSB0aGUgdHJhbnNmb3JtIGNvZWZmaWNpZW50cyAod2UnbGwgZG8gdHdvIGludmVyc2UKLSAgLy8gdHJhbnNmb3JtcyBpbiBwYXJhbGxlbCkuIEluIHRoZSBjYXNlIG9mIG9ubHkgb25lIGludmVyc2UgdHJhbnNmb3JtLCB0aGUKLSAgLy8gc2Vjb25kIGhhbGYgb2YgdGhlIHZlY3RvcnMgd2lsbCBqdXN0IGNvbnRhaW4gcmFuZG9tIHZhbHVlIHdlJ2xsIG5ldmVyCi0gIC8vIHVzZSBub3Igc3RvcmUuCi0gIF9fbTEyOGkgaW4wLCBpbjEsIGluMiwgaW4zOwotICB7Ci0gICAgaW4wID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmaW5bMF0pOwotICAgIGluMSA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJmluWzRdKTsKLSAgICBpbjIgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSZpbls4XSk7Ci0gICAgaW4zID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmaW5bMTJdKTsKLSAgICAvLyBhMDAgYTEwIGEyMCBhMzAgICB4IHggeCB4Ci0gICAgLy8gYTAxIGExMSBhMjEgYTMxICAgeCB4IHggeAotICAgIC8vIGEwMiBhMTIgYTIyIGEzMiAgIHggeCB4IHgKLSAgICAvLyBhMDMgYTEzIGEyMyBhMzMgICB4IHggeCB4Ci0gICAgaWYgKGRvX3R3bykgewotICAgICAgY29uc3QgX19tMTI4aSBpbkIwID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmaW5bMTZdKTsKLSAgICAgIGNvbnN0IF9fbTEyOGkgaW5CMSA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJmluWzIwXSk7Ci0gICAgICBjb25zdCBfX20xMjhpIGluQjIgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSZpblsyNF0pOwotICAgICAgY29uc3QgX19tMTI4aSBpbkIzID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmaW5bMjhdKTsKLSAgICAgIGluMCA9IF9tbV91bnBhY2tsb19lcGk2NChpbjAsIGluQjApOwotICAgICAgaW4xID0gX21tX3VucGFja2xvX2VwaTY0KGluMSwgaW5CMSk7Ci0gICAgICBpbjIgPSBfbW1fdW5wYWNrbG9fZXBpNjQoaW4yLCBpbkIyKTsKLSAgICAgIGluMyA9IF9tbV91bnBhY2tsb19lcGk2NChpbjMsIGluQjMpOwotICAgICAgLy8gYTAwIGExMCBhMjAgYTMwICAgYjAwIGIxMCBiMjAgYjMwCi0gICAgICAvLyBhMDEgYTExIGEyMSBhMzEgICBiMDEgYjExIGIyMSBiMzEKLSAgICAgIC8vIGEwMiBhMTIgYTIyIGEzMiAgIGIwMiBiMTIgYjIyIGIzMgotICAgICAgLy8gYTAzIGExMyBhMjMgYTMzICAgYjAzIGIxMyBiMjMgYjMzCi0gICAgfQotICB9Ci0KLSAgLy8gVmVydGljYWwgcGFzcyBhbmQgc3Vic2VxdWVudCB0cmFuc3Bvc2UuCi0gIHsKLSAgICAvLyBGaXJzdCBwYXNzLCBjIGFuZCBkIGNhbGN1bGF0aW9ucyBhcmUgbG9uZ2VyIGJlY2F1c2Ugb2YgdGhlICJ0cmljayIKLSAgICAvLyBtdWx0aXBsaWNhdGlvbnMuCi0gICAgY29uc3QgX19tMTI4aSBhID0gX21tX2FkZF9lcGkxNihpbjAsIGluMik7Ci0gICAgY29uc3QgX19tMTI4aSBiID0gX21tX3N1Yl9lcGkxNihpbjAsIGluMik7Ci0gICAgLy8gYyA9IE1VTChpbjEsIEsyKSAtIE1VTChpbjMsIEsxKSA9IE1VTChpbjEsIGsyKSAtIE1VTChpbjMsIGsxKSArIGluMSAtIGluMwotICAgIGNvbnN0IF9fbTEyOGkgYzEgPSBfbW1fbXVsaGlfZXBpMTYoaW4xLCBrMik7Ci0gICAgY29uc3QgX19tMTI4aSBjMiA9IF9tbV9tdWxoaV9lcGkxNihpbjMsIGsxKTsKLSAgICBjb25zdCBfX20xMjhpIGMzID0gX21tX3N1Yl9lcGkxNihpbjEsIGluMyk7Ci0gICAgY29uc3QgX19tMTI4aSBjNCA9IF9tbV9zdWJfZXBpMTYoYzEsIGMyKTsKLSAgICBjb25zdCBfX20xMjhpIGMgPSBfbW1fYWRkX2VwaTE2KGMzLCBjNCk7Ci0gICAgLy8gZCA9IE1VTChpbjEsIEsxKSArIE1VTChpbjMsIEsyKSA9IE1VTChpbjEsIGsxKSArIE1VTChpbjMsIGsyKSArIGluMSArIGluMwotICAgIGNvbnN0IF9fbTEyOGkgZDEgPSBfbW1fbXVsaGlfZXBpMTYoaW4xLCBrMSk7Ci0gICAgY29uc3QgX19tMTI4aSBkMiA9IF9tbV9tdWxoaV9lcGkxNihpbjMsIGsyKTsKLSAgICBjb25zdCBfX20xMjhpIGQzID0gX21tX2FkZF9lcGkxNihpbjEsIGluMyk7Ci0gICAgY29uc3QgX19tMTI4aSBkNCA9IF9tbV9hZGRfZXBpMTYoZDEsIGQyKTsKLSAgICBjb25zdCBfX20xMjhpIGQgPSBfbW1fYWRkX2VwaTE2KGQzLCBkNCk7Ci0KLSAgICAvLyBTZWNvbmQgcGFzcy4KLSAgICBjb25zdCBfX20xMjhpIHRtcDAgPSBfbW1fYWRkX2VwaTE2KGEsIGQpOwotICAgIGNvbnN0IF9fbTEyOGkgdG1wMSA9IF9tbV9hZGRfZXBpMTYoYiwgYyk7Ci0gICAgY29uc3QgX19tMTI4aSB0bXAyID0gX21tX3N1Yl9lcGkxNihiLCBjKTsKLSAgICBjb25zdCBfX20xMjhpIHRtcDMgPSBfbW1fc3ViX2VwaTE2KGEsIGQpOwotCi0gICAgLy8gVHJhbnNwb3NlIHRoZSB0d28gNHg0LgotICAgIC8vIGEwMCBhMDEgYTAyIGEwMyAgIGIwMCBiMDEgYjAyIGIwMwotICAgIC8vIGExMCBhMTEgYTEyIGExMyAgIGIxMCBiMTEgYjEyIGIxMwotICAgIC8vIGEyMCBhMjEgYTIyIGEyMyAgIGIyMCBiMjEgYjIyIGIyMwotICAgIC8vIGEzMCBhMzEgYTMyIGEzMyAgIGIzMCBiMzEgYjMyIGIzMwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMF8wID0gX21tX3VucGFja2xvX2VwaTE2KHRtcDAsIHRtcDEpOwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMF8xID0gX21tX3VucGFja2xvX2VwaTE2KHRtcDIsIHRtcDMpOwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMF8yID0gX21tX3VucGFja2hpX2VwaTE2KHRtcDAsIHRtcDEpOwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMF8zID0gX21tX3VucGFja2hpX2VwaTE2KHRtcDIsIHRtcDMpOwotICAgIC8vIGEwMCBhMTAgYTAxIGExMSAgIGEwMiBhMTIgYTAzIGExMwotICAgIC8vIGEyMCBhMzAgYTIxIGEzMSAgIGEyMiBhMzIgYTIzIGEzMwotICAgIC8vIGIwMCBiMTAgYjAxIGIxMSAgIGIwMiBiMTIgYjAzIGIxMwotICAgIC8vIGIyMCBiMzAgYjIxIGIzMSAgIGIyMiBiMzIgYjIzIGIzMwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMV8wID0gX21tX3VucGFja2xvX2VwaTMyKHRyYW5zcG9zZTBfMCwgdHJhbnNwb3NlMF8xKTsKLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTFfMSA9IF9tbV91bnBhY2tsb19lcGkzMih0cmFuc3Bvc2UwXzIsIHRyYW5zcG9zZTBfMyk7Ci0gICAgY29uc3QgX19tMTI4aSB0cmFuc3Bvc2UxXzIgPSBfbW1fdW5wYWNraGlfZXBpMzIodHJhbnNwb3NlMF8wLCB0cmFuc3Bvc2UwXzEpOwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMV8zID0gX21tX3VucGFja2hpX2VwaTMyKHRyYW5zcG9zZTBfMiwgdHJhbnNwb3NlMF8zKTsKLSAgICAvLyBhMDAgYTEwIGEyMCBhMzAgYTAxIGExMSBhMjEgYTMxCi0gICAgLy8gYjAwIGIxMCBiMjAgYjMwIGIwMSBiMTEgYjIxIGIzMQotICAgIC8vIGEwMiBhMTIgYTIyIGEzMiBhMDMgYTEzIGEyMyBhMzMKLSAgICAvLyBiMDIgYjEyIGEyMiBiMzIgYjAzIGIxMyBiMjMgYjMzCi0gICAgVDAgPSBfbW1fdW5wYWNrbG9fZXBpNjQodHJhbnNwb3NlMV8wLCB0cmFuc3Bvc2UxXzEpOwotICAgIFQxID0gX21tX3VucGFja2hpX2VwaTY0KHRyYW5zcG9zZTFfMCwgdHJhbnNwb3NlMV8xKTsKLSAgICBUMiA9IF9tbV91bnBhY2tsb19lcGk2NCh0cmFuc3Bvc2UxXzIsIHRyYW5zcG9zZTFfMyk7Ci0gICAgVDMgPSBfbW1fdW5wYWNraGlfZXBpNjQodHJhbnNwb3NlMV8yLCB0cmFuc3Bvc2UxXzMpOwotICAgIC8vIGEwMCBhMTAgYTIwIGEzMCAgIGIwMCBiMTAgYjIwIGIzMAotICAgIC8vIGEwMSBhMTEgYTIxIGEzMSAgIGIwMSBiMTEgYjIxIGIzMQotICAgIC8vIGEwMiBhMTIgYTIyIGEzMiAgIGIwMiBiMTIgYjIyIGIzMgotICAgIC8vIGEwMyBhMTMgYTIzIGEzMyAgIGIwMyBiMTMgYjIzIGIzMwotICB9Ci0KLSAgLy8gSG9yaXpvbnRhbCBwYXNzIGFuZCBzdWJzZXF1ZW50IHRyYW5zcG9zZS4KLSAgewotICAgIC8vIEZpcnN0IHBhc3MsIGMgYW5kIGQgY2FsY3VsYXRpb25zIGFyZSBsb25nZXIgYmVjYXVzZSBvZiB0aGUgInRyaWNrIgotICAgIC8vIG11bHRpcGxpY2F0aW9ucy4KLSAgICBjb25zdCBfX20xMjhpIGZvdXIgPSBfbW1fc2V0MV9lcGkxNig0KTsKLSAgICBjb25zdCBfX20xMjhpIGRjID0gX21tX2FkZF9lcGkxNihUMCwgZm91cik7Ci0gICAgY29uc3QgX19tMTI4aSBhID0gIF9tbV9hZGRfZXBpMTYoZGMsIFQyKTsKLSAgICBjb25zdCBfX20xMjhpIGIgPSAgX21tX3N1Yl9lcGkxNihkYywgVDIpOwotICAgIC8vIGMgPSBNVUwoVDEsIEsyKSAtIE1VTChUMywgSzEpID0gTVVMKFQxLCBrMikgLSBNVUwoVDMsIGsxKSArIFQxIC0gVDMKLSAgICBjb25zdCBfX20xMjhpIGMxID0gX21tX211bGhpX2VwaTE2KFQxLCBrMik7Ci0gICAgY29uc3QgX19tMTI4aSBjMiA9IF9tbV9tdWxoaV9lcGkxNihUMywgazEpOwotICAgIGNvbnN0IF9fbTEyOGkgYzMgPSBfbW1fc3ViX2VwaTE2KFQxLCBUMyk7Ci0gICAgY29uc3QgX19tMTI4aSBjNCA9IF9tbV9zdWJfZXBpMTYoYzEsIGMyKTsKLSAgICBjb25zdCBfX20xMjhpIGMgPSBfbW1fYWRkX2VwaTE2KGMzLCBjNCk7Ci0gICAgLy8gZCA9IE1VTChUMSwgSzEpICsgTVVMKFQzLCBLMikgPSBNVUwoVDEsIGsxKSArIE1VTChUMywgazIpICsgVDEgKyBUMwotICAgIGNvbnN0IF9fbTEyOGkgZDEgPSBfbW1fbXVsaGlfZXBpMTYoVDEsIGsxKTsKLSAgICBjb25zdCBfX20xMjhpIGQyID0gX21tX211bGhpX2VwaTE2KFQzLCBrMik7Ci0gICAgY29uc3QgX19tMTI4aSBkMyA9IF9tbV9hZGRfZXBpMTYoVDEsIFQzKTsKLSAgICBjb25zdCBfX20xMjhpIGQ0ID0gX21tX2FkZF9lcGkxNihkMSwgZDIpOwotICAgIGNvbnN0IF9fbTEyOGkgZCA9IF9tbV9hZGRfZXBpMTYoZDMsIGQ0KTsKLQotICAgIC8vIFNlY29uZCBwYXNzLgotICAgIGNvbnN0IF9fbTEyOGkgdG1wMCA9IF9tbV9hZGRfZXBpMTYoYSwgZCk7Ci0gICAgY29uc3QgX19tMTI4aSB0bXAxID0gX21tX2FkZF9lcGkxNihiLCBjKTsKLSAgICBjb25zdCBfX20xMjhpIHRtcDIgPSBfbW1fc3ViX2VwaTE2KGIsIGMpOwotICAgIGNvbnN0IF9fbTEyOGkgdG1wMyA9IF9tbV9zdWJfZXBpMTYoYSwgZCk7Ci0gICAgY29uc3QgX19tMTI4aSBzaGlmdGVkMCA9IF9tbV9zcmFpX2VwaTE2KHRtcDAsIDMpOwotICAgIGNvbnN0IF9fbTEyOGkgc2hpZnRlZDEgPSBfbW1fc3JhaV9lcGkxNih0bXAxLCAzKTsKLSAgICBjb25zdCBfX20xMjhpIHNoaWZ0ZWQyID0gX21tX3NyYWlfZXBpMTYodG1wMiwgMyk7Ci0gICAgY29uc3QgX19tMTI4aSBzaGlmdGVkMyA9IF9tbV9zcmFpX2VwaTE2KHRtcDMsIDMpOwotCi0gICAgLy8gVHJhbnNwb3NlIHRoZSB0d28gNHg0LgotICAgIC8vIGEwMCBhMDEgYTAyIGEwMyAgIGIwMCBiMDEgYjAyIGIwMwotICAgIC8vIGExMCBhMTEgYTEyIGExMyAgIGIxMCBiMTEgYjEyIGIxMwotICAgIC8vIGEyMCBhMjEgYTIyIGEyMyAgIGIyMCBiMjEgYjIyIGIyMwotICAgIC8vIGEzMCBhMzEgYTMyIGEzMyAgIGIzMCBiMzEgYjMyIGIzMwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMF8wID0gX21tX3VucGFja2xvX2VwaTE2KHNoaWZ0ZWQwLCBzaGlmdGVkMSk7Ci0gICAgY29uc3QgX19tMTI4aSB0cmFuc3Bvc2UwXzEgPSBfbW1fdW5wYWNrbG9fZXBpMTYoc2hpZnRlZDIsIHNoaWZ0ZWQzKTsKLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTBfMiA9IF9tbV91bnBhY2toaV9lcGkxNihzaGlmdGVkMCwgc2hpZnRlZDEpOwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMF8zID0gX21tX3VucGFja2hpX2VwaTE2KHNoaWZ0ZWQyLCBzaGlmdGVkMyk7Ci0gICAgLy8gYTAwIGExMCBhMDEgYTExICAgYTAyIGExMiBhMDMgYTEzCi0gICAgLy8gYTIwIGEzMCBhMjEgYTMxICAgYTIyIGEzMiBhMjMgYTMzCi0gICAgLy8gYjAwIGIxMCBiMDEgYjExICAgYjAyIGIxMiBiMDMgYjEzCi0gICAgLy8gYjIwIGIzMCBiMjEgYjMxICAgYjIyIGIzMiBiMjMgYjMzCi0gICAgY29uc3QgX19tMTI4aSB0cmFuc3Bvc2UxXzAgPSBfbW1fdW5wYWNrbG9fZXBpMzIodHJhbnNwb3NlMF8wLCB0cmFuc3Bvc2UwXzEpOwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMV8xID0gX21tX3VucGFja2xvX2VwaTMyKHRyYW5zcG9zZTBfMiwgdHJhbnNwb3NlMF8zKTsKLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTFfMiA9IF9tbV91bnBhY2toaV9lcGkzMih0cmFuc3Bvc2UwXzAsIHRyYW5zcG9zZTBfMSk7Ci0gICAgY29uc3QgX19tMTI4aSB0cmFuc3Bvc2UxXzMgPSBfbW1fdW5wYWNraGlfZXBpMzIodHJhbnNwb3NlMF8yLCB0cmFuc3Bvc2UwXzMpOwotICAgIC8vIGEwMCBhMTAgYTIwIGEzMCBhMDEgYTExIGEyMSBhMzEKLSAgICAvLyBiMDAgYjEwIGIyMCBiMzAgYjAxIGIxMSBiMjEgYjMxCi0gICAgLy8gYTAyIGExMiBhMjIgYTMyIGEwMyBhMTMgYTIzIGEzMwotICAgIC8vIGIwMiBiMTIgYTIyIGIzMiBiMDMgYjEzIGIyMyBiMzMKLSAgICBUMCA9IF9tbV91bnBhY2tsb19lcGk2NCh0cmFuc3Bvc2UxXzAsIHRyYW5zcG9zZTFfMSk7Ci0gICAgVDEgPSBfbW1fdW5wYWNraGlfZXBpNjQodHJhbnNwb3NlMV8wLCB0cmFuc3Bvc2UxXzEpOwotICAgIFQyID0gX21tX3VucGFja2xvX2VwaTY0KHRyYW5zcG9zZTFfMiwgdHJhbnNwb3NlMV8zKTsKLSAgICBUMyA9IF9tbV91bnBhY2toaV9lcGk2NCh0cmFuc3Bvc2UxXzIsIHRyYW5zcG9zZTFfMyk7Ci0gICAgLy8gYTAwIGExMCBhMjAgYTMwICAgYjAwIGIxMCBiMjAgYjMwCi0gICAgLy8gYTAxIGExMSBhMjEgYTMxICAgYjAxIGIxMSBiMjEgYjMxCi0gICAgLy8gYTAyIGExMiBhMjIgYTMyICAgYjAyIGIxMiBiMjIgYjMyCi0gICAgLy8gYTAzIGExMyBhMjMgYTMzICAgYjAzIGIxMyBiMjMgYjMzCi0gIH0KLQotICAvLyBBZGQgaW52ZXJzZSB0cmFuc2Zvcm0gdG8gJ3JlZicgYW5kIHN0b3JlLgotICB7Ci0gICAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKLSAgICAvLyBMb2FkIHRoZSByZWZlcmVuY2UocykuCi0gICAgX19tMTI4aSByZWYwLCByZWYxLCByZWYyLCByZWYzOwotICAgIGlmIChkb190d28pIHsKLSAgICAgIC8vIExvYWQgZWlnaHQgYnl0ZXMvcGl4ZWxzIHBlciBsaW5lLgotICAgICAgcmVmMCA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJnJlZlswICogQlBTXSk7Ci0gICAgICByZWYxID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmcmVmWzEgKiBCUFNdKTsKLSAgICAgIHJlZjIgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSZyZWZbMiAqIEJQU10pOwotICAgICAgcmVmMyA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJnJlZlszICogQlBTXSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIExvYWQgZm91ciBieXRlcy9waXhlbHMgcGVyIGxpbmUuCi0gICAgICByZWYwID0gX21tX2N2dHNpMzJfc2kxMjgoKihpbnQqKSZyZWZbMCAqIEJQU10pOwotICAgICAgcmVmMSA9IF9tbV9jdnRzaTMyX3NpMTI4KCooaW50KikmcmVmWzEgKiBCUFNdKTsKLSAgICAgIHJlZjIgPSBfbW1fY3Z0c2kzMl9zaTEyOCgqKGludCopJnJlZlsyICogQlBTXSk7Ci0gICAgICByZWYzID0gX21tX2N2dHNpMzJfc2kxMjgoKihpbnQqKSZyZWZbMyAqIEJQU10pOwotICAgIH0KLSAgICAvLyBDb252ZXJ0IHRvIDE2Yi4KLSAgICByZWYwID0gX21tX3VucGFja2xvX2VwaTgocmVmMCwgemVybyk7Ci0gICAgcmVmMSA9IF9tbV91bnBhY2tsb19lcGk4KHJlZjEsIHplcm8pOwotICAgIHJlZjIgPSBfbW1fdW5wYWNrbG9fZXBpOChyZWYyLCB6ZXJvKTsKLSAgICByZWYzID0gX21tX3VucGFja2xvX2VwaTgocmVmMywgemVybyk7Ci0gICAgLy8gQWRkIHRoZSBpbnZlcnNlIHRyYW5zZm9ybShzKS4KLSAgICByZWYwID0gX21tX2FkZF9lcGkxNihyZWYwLCBUMCk7Ci0gICAgcmVmMSA9IF9tbV9hZGRfZXBpMTYocmVmMSwgVDEpOwotICAgIHJlZjIgPSBfbW1fYWRkX2VwaTE2KHJlZjIsIFQyKTsKLSAgICByZWYzID0gX21tX2FkZF9lcGkxNihyZWYzLCBUMyk7Ci0gICAgLy8gVW5zaWduZWQgc2F0dXJhdGUgdG8gOGIuCi0gICAgcmVmMCA9IF9tbV9wYWNrdXNfZXBpMTYocmVmMCwgcmVmMCk7Ci0gICAgcmVmMSA9IF9tbV9wYWNrdXNfZXBpMTYocmVmMSwgcmVmMSk7Ci0gICAgcmVmMiA9IF9tbV9wYWNrdXNfZXBpMTYocmVmMiwgcmVmMik7Ci0gICAgcmVmMyA9IF9tbV9wYWNrdXNfZXBpMTYocmVmMywgcmVmMyk7Ci0gICAgLy8gU3RvcmUgdGhlIHJlc3VsdHMuCi0gICAgaWYgKGRvX3R3bykgewotICAgICAgLy8gU3RvcmUgZWlnaHQgYnl0ZXMvcGl4ZWxzIHBlciBsaW5lLgotICAgICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopJmRzdFswICogQlBTXSwgcmVmMCk7Ci0gICAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikmZHN0WzEgKiBCUFNdLCByZWYxKTsKLSAgICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKSZkc3RbMiAqIEJQU10sIHJlZjIpOwotICAgICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopJmRzdFszICogQlBTXSwgcmVmMyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIFN0b3JlIGZvdXIgYnl0ZXMvcGl4ZWxzIHBlciBsaW5lLgotICAgICAgKigoaW50MzJfdCAqKSZkc3RbMCAqIEJQU10pID0gX21tX2N2dHNpMTI4X3NpMzIocmVmMCk7Ci0gICAgICAqKChpbnQzMl90ICopJmRzdFsxICogQlBTXSkgPSBfbW1fY3Z0c2kxMjhfc2kzMihyZWYxKTsKLSAgICAgICooKGludDMyX3QgKikmZHN0WzIgKiBCUFNdKSA9IF9tbV9jdnRzaTEyOF9zaTMyKHJlZjIpOwotICAgICAgKigoaW50MzJfdCAqKSZkc3RbMyAqIEJQU10pID0gX21tX2N2dHNpMTI4X3NpMzIocmVmMyk7Ci0gICAgfQotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIEZUcmFuc2Zvcm1TU0UyKGNvbnN0IHVpbnQ4X3QqIHNyYywgY29uc3QgdWludDhfdCogcmVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCogb3V0KSB7Ci0gIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7Ci0gIGNvbnN0IF9fbTEyOGkgc2V2ZW4gPSBfbW1fc2V0MV9lcGkxNig3KTsKLSAgY29uc3QgX19tMTI4aSBrOTM3ID0gX21tX3NldDFfZXBpMzIoOTM3KTsKLSAgY29uc3QgX19tMTI4aSBrMTgxMiA9IF9tbV9zZXQxX2VwaTMyKDE4MTIpOwotICBjb25zdCBfX20xMjhpIGs1MTAwMCA9IF9tbV9zZXQxX2VwaTMyKDUxMDAwKTsKLSAgY29uc3QgX19tMTI4aSBrMTIwMDBfcGx1c19vbmUgPSBfbW1fc2V0MV9lcGkzMigxMjAwMCArICgxIDw8IDE2KSk7Ci0gIGNvbnN0IF9fbTEyOGkgazUzNTJfMjIxNyA9IF9tbV9zZXRfZXBpMTYoNTM1MiwgIDIyMTcsIDUzNTIsICAyMjE3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUzNTIsICAyMjE3LCA1MzUyLCAgMjIxNyk7Ci0gIGNvbnN0IF9fbTEyOGkgazIyMTdfNTM1MiA9IF9tbV9zZXRfZXBpMTYoMjIxNywgLTUzNTIsIDIyMTcsIC01MzUyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyMTcsIC01MzUyLCAyMjE3LCAtNTM1Mik7Ci0gIGNvbnN0IF9fbTEyOGkgazg4cCA9IF9tbV9zZXRfZXBpMTYoOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCk7Ci0gIGNvbnN0IF9fbTEyOGkgazg4bSA9IF9tbV9zZXRfZXBpMTYoLTgsIDgsIC04LCA4LCAtOCwgOCwgLTgsIDgpOwotICBjb25zdCBfX20xMjhpIGs1MzUyXzIyMTdwID0gX21tX3NldF9lcGkxNigyMjE3LCA1MzUyLCAyMjE3LCA1MzUyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjE3LCA1MzUyLCAyMjE3LCA1MzUyKTsKLSAgY29uc3QgX19tMTI4aSBrNTM1Ml8yMjE3bSA9IF9tbV9zZXRfZXBpMTYoLTUzNTIsIDIyMTcsIC01MzUyLCAyMjE3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNTM1MiwgMjIxNywgLTUzNTIsIDIyMTcpOwotICBfX20xMjhpIHYwMSwgdjMyOwotCi0KLSAgLy8gRGlmZmVyZW5jZSBiZXR3ZWVuIHNyYyBhbmQgcmVmIGFuZCBpbml0aWFsIHRyYW5zcG9zZS4KLSAgewotICAgIC8vIExvYWQgc3JjIGFuZCBjb252ZXJ0IHRvIDE2Yi4KLSAgICBjb25zdCBfX20xMjhpIHNyYzAgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSZzcmNbMCAqIEJQU10pOwotICAgIGNvbnN0IF9fbTEyOGkgc3JjMSA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJnNyY1sxICogQlBTXSk7Ci0gICAgY29uc3QgX19tMTI4aSBzcmMyID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmc3JjWzIgKiBCUFNdKTsKLSAgICBjb25zdCBfX20xMjhpIHNyYzMgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSZzcmNbMyAqIEJQU10pOwotICAgIGNvbnN0IF9fbTEyOGkgc3JjXzAgPSBfbW1fdW5wYWNrbG9fZXBpOChzcmMwLCB6ZXJvKTsKLSAgICBjb25zdCBfX20xMjhpIHNyY18xID0gX21tX3VucGFja2xvX2VwaTgoc3JjMSwgemVybyk7Ci0gICAgY29uc3QgX19tMTI4aSBzcmNfMiA9IF9tbV91bnBhY2tsb19lcGk4KHNyYzIsIHplcm8pOwotICAgIGNvbnN0IF9fbTEyOGkgc3JjXzMgPSBfbW1fdW5wYWNrbG9fZXBpOChzcmMzLCB6ZXJvKTsKLSAgICAvLyBMb2FkIHJlZiBhbmQgY29udmVydCB0byAxNmIuCi0gICAgY29uc3QgX19tMTI4aSByZWYwID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmcmVmWzAgKiBCUFNdKTsKLSAgICBjb25zdCBfX20xMjhpIHJlZjEgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSZyZWZbMSAqIEJQU10pOwotICAgIGNvbnN0IF9fbTEyOGkgcmVmMiA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJnJlZlsyICogQlBTXSk7Ci0gICAgY29uc3QgX19tMTI4aSByZWYzID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmcmVmWzMgKiBCUFNdKTsKLSAgICBjb25zdCBfX20xMjhpIHJlZl8wID0gX21tX3VucGFja2xvX2VwaTgocmVmMCwgemVybyk7Ci0gICAgY29uc3QgX19tMTI4aSByZWZfMSA9IF9tbV91bnBhY2tsb19lcGk4KHJlZjEsIHplcm8pOwotICAgIGNvbnN0IF9fbTEyOGkgcmVmXzIgPSBfbW1fdW5wYWNrbG9fZXBpOChyZWYyLCB6ZXJvKTsKLSAgICBjb25zdCBfX20xMjhpIHJlZl8zID0gX21tX3VucGFja2xvX2VwaTgocmVmMywgemVybyk7Ci0gICAgLy8gQ29tcHV0ZSBkaWZmZXJlbmNlLiAtPiAwMCAwMSAwMiAwMyAwMCAwMCAwMCAwMAotICAgIGNvbnN0IF9fbTEyOGkgZGlmZjAgPSBfbW1fc3ViX2VwaTE2KHNyY18wLCByZWZfMCk7Ci0gICAgY29uc3QgX19tMTI4aSBkaWZmMSA9IF9tbV9zdWJfZXBpMTYoc3JjXzEsIHJlZl8xKTsKLSAgICBjb25zdCBfX20xMjhpIGRpZmYyID0gX21tX3N1Yl9lcGkxNihzcmNfMiwgcmVmXzIpOwotICAgIGNvbnN0IF9fbTEyOGkgZGlmZjMgPSBfbW1fc3ViX2VwaTE2KHNyY18zLCByZWZfMyk7Ci0KLQotICAgIC8vIFVucGFjayBhbmQgc2h1ZmZsZQotICAgIC8vIDAwIDAxIDAyIDAzICAgMCAwIDAgMAotICAgIC8vIDEwIDExIDEyIDEzICAgMCAwIDAgMAotICAgIC8vIDIwIDIxIDIyIDIzICAgMCAwIDAgMAotICAgIC8vIDMwIDMxIDMyIDMzICAgMCAwIDAgMAotICAgIGNvbnN0IF9fbTEyOGkgc2h1ZjAxID0gX21tX3VucGFja2xvX2VwaTMyKGRpZmYwLCBkaWZmMSk7Ci0gICAgY29uc3QgX19tMTI4aSBzaHVmMjMgPSBfbW1fdW5wYWNrbG9fZXBpMzIoZGlmZjIsIGRpZmYzKTsKLSAgICAvLyAwMCAwMSAxMCAxMSAwMiAwMyAxMiAxMwotICAgIC8vIDIwIDIxIDMwIDMxIDIyIDIzIDMyIDMzCi0gICAgY29uc3QgX19tMTI4aSBzaHVmMDFfcCA9Ci0gICAgICAgIF9tbV9zaHVmZmxlaGlfZXBpMTYoc2h1ZjAxLCBfTU1fU0hVRkZMRSgyLCAzLCAwLCAxKSk7Ci0gICAgY29uc3QgX19tMTI4aSBzaHVmMjNfcCA9Ci0gICAgICAgIF9tbV9zaHVmZmxlaGlfZXBpMTYoc2h1ZjIzLCBfTU1fU0hVRkZMRSgyLCAzLCAwLCAxKSk7Ci0gICAgLy8gMDAgMDEgMTAgMTEgMDMgMDIgMTMgMTIKLSAgICAvLyAyMCAyMSAzMCAzMSAyMyAyMiAzMyAzMgotICAgIGNvbnN0IF9fbTEyOGkgczAxID0gX21tX3VucGFja2xvX2VwaTY0KHNodWYwMV9wLCBzaHVmMjNfcCk7Ci0gICAgY29uc3QgX19tMTI4aSBzMzIgPSBfbW1fdW5wYWNraGlfZXBpNjQoc2h1ZjAxX3AsIHNodWYyM19wKTsKLSAgICAvLyAwMCAwMSAxMCAxMSAyMCAyMSAzMCAzMQotICAgIC8vIDAzIDAyIDEzIDEyIDIzIDIyIDMzIDMyCi0gICAgY29uc3QgX19tMTI4aSBhMDEgPSBfbW1fYWRkX2VwaTE2KHMwMSwgczMyKTsKLSAgICBjb25zdCBfX20xMjhpIGEzMiA9IF9tbV9zdWJfZXBpMTYoczAxLCBzMzIpOwotICAgIC8vIFtkMCArIGQzIHwgZDEgKyBkMiB8IC4uLl0gPSBbYTAgYTEgfCBhMCcgYTEnIHwgLi4uIF0KLSAgICAvLyBbZDAgLSBkMyB8IGQxIC0gZDIgfCAuLi5dID0gW2EzIGEyIHwgYTMnIGEyJyB8IC4uLiBdCi0KLSAgICBjb25zdCBfX20xMjhpIHRtcDAgPSBfbW1fbWFkZF9lcGkxNihhMDEsIGs4OHApOyAgLy8gWyAoYTAgKyBhMSkgPDwgMywgLi4uIF0KLSAgICBjb25zdCBfX20xMjhpIHRtcDIgPSBfbW1fbWFkZF9lcGkxNihhMDEsIGs4OG0pOyAgLy8gWyAoYTAgLSBhMSkgPDwgMywgLi4uIF0KLSAgICBjb25zdCBfX20xMjhpIHRtcDFfMSA9IF9tbV9tYWRkX2VwaTE2KGEzMiwgazUzNTJfMjIxN3ApOwotICAgIGNvbnN0IF9fbTEyOGkgdG1wM18xID0gX21tX21hZGRfZXBpMTYoYTMyLCBrNTM1Ml8yMjE3bSk7Ci0gICAgY29uc3QgX19tMTI4aSB0bXAxXzIgPSBfbW1fYWRkX2VwaTMyKHRtcDFfMSwgazE4MTIpOwotICAgIGNvbnN0IF9fbTEyOGkgdG1wM18yID0gX21tX2FkZF9lcGkzMih0bXAzXzEsIGs5MzcpOwotICAgIGNvbnN0IF9fbTEyOGkgdG1wMSAgID0gX21tX3NyYWlfZXBpMzIodG1wMV8yLCA5KTsKLSAgICBjb25zdCBfX20xMjhpIHRtcDMgICA9IF9tbV9zcmFpX2VwaTMyKHRtcDNfMiwgOSk7Ci0gICAgY29uc3QgX19tMTI4aSBzMDMgPSBfbW1fcGFja3NfZXBpMzIodG1wMCwgdG1wMik7Ci0gICAgY29uc3QgX19tMTI4aSBzMTIgPSBfbW1fcGFja3NfZXBpMzIodG1wMSwgdG1wMyk7Ci0gICAgY29uc3QgX19tMTI4aSBzX2xvID0gX21tX3VucGFja2xvX2VwaTE2KHMwMywgczEyKTsgICAvLyAwIDEgMCAxIDAgMS4uLgotICAgIGNvbnN0IF9fbTEyOGkgc19oaSA9IF9tbV91bnBhY2toaV9lcGkxNihzMDMsIHMxMik7ICAgLy8gMiAzIDIgMyAyIDMKLSAgICBjb25zdCBfX20xMjhpIHYyMyA9IF9tbV91bnBhY2toaV9lcGkzMihzX2xvLCBzX2hpKTsKLSAgICB2MDEgPSBfbW1fdW5wYWNrbG9fZXBpMzIoc19sbywgc19oaSk7Ci0gICAgdjMyID0gX21tX3NodWZmbGVfZXBpMzIodjIzLCBfTU1fU0hVRkZMRSgxLCAwLCAzLCAyKSk7ICAvLyAzIDIgMyAyIDMgMi4uCi0gIH0KLQotICAvLyBTZWNvbmQgcGFzcwotICB7Ci0gICAgLy8gU2FtZSBvcGVyYXRpb25zIGFyZSBkb25lIG9uIHRoZSAoMCwzKSBhbmQgKDEsMikgcGFpcnMuCi0gICAgLy8gYTAgPSB2MCArIHYzCi0gICAgLy8gYTEgPSB2MSArIHYyCi0gICAgLy8gYTMgPSB2MCAtIHYzCi0gICAgLy8gYTIgPSB2MSAtIHYyCi0gICAgY29uc3QgX19tMTI4aSBhMDEgPSBfbW1fYWRkX2VwaTE2KHYwMSwgdjMyKTsKLSAgICBjb25zdCBfX20xMjhpIGEzMiA9IF9tbV9zdWJfZXBpMTYodjAxLCB2MzIpOwotICAgIGNvbnN0IF9fbTEyOGkgYTExID0gX21tX3VucGFja2hpX2VwaTY0KGEwMSwgYTAxKTsKLSAgICBjb25zdCBfX20xMjhpIGEyMiA9IF9tbV91bnBhY2toaV9lcGk2NChhMzIsIGEzMik7Ci0gICAgY29uc3QgX19tMTI4aSBhMDFfcGx1c183ID0gX21tX2FkZF9lcGkxNihhMDEsIHNldmVuKTsKLQotICAgIC8vIGQwID0gKGEwICsgYTEgKyA3KSA+PiA0OwotICAgIC8vIGQyID0gKGEwIC0gYTEgKyA3KSA+PiA0OwotICAgIGNvbnN0IF9fbTEyOGkgYzAgPSBfbW1fYWRkX2VwaTE2KGEwMV9wbHVzXzcsIGExMSk7Ci0gICAgY29uc3QgX19tMTI4aSBjMiA9IF9tbV9zdWJfZXBpMTYoYTAxX3BsdXNfNywgYTExKTsKLSAgICBjb25zdCBfX20xMjhpIGQwID0gX21tX3NyYWlfZXBpMTYoYzAsIDQpOwotICAgIGNvbnN0IF9fbTEyOGkgZDIgPSBfbW1fc3JhaV9lcGkxNihjMiwgNCk7Ci0KLSAgICAvLyBmMSA9ICgoYjMgKiA1MzUyICsgYjIgKiAyMjE3ICsgMTIwMDApID4+IDE2KQotICAgIC8vIGYzID0gKChiMyAqIDIyMTcgLSBiMiAqIDUzNTIgKyA1MTAwMCkgPj4gMTYpCi0gICAgY29uc3QgX19tMTI4aSBiMjMgPSBfbW1fdW5wYWNrbG9fZXBpMTYoYTIyLCBhMzIpOwotICAgIGNvbnN0IF9fbTEyOGkgYzEgPSBfbW1fbWFkZF9lcGkxNihiMjMsIGs1MzUyXzIyMTcpOwotICAgIGNvbnN0IF9fbTEyOGkgYzMgPSBfbW1fbWFkZF9lcGkxNihiMjMsIGsyMjE3XzUzNTIpOwotICAgIGNvbnN0IF9fbTEyOGkgZDEgPSBfbW1fYWRkX2VwaTMyKGMxLCBrMTIwMDBfcGx1c19vbmUpOwotICAgIGNvbnN0IF9fbTEyOGkgZDMgPSBfbW1fYWRkX2VwaTMyKGMzLCBrNTEwMDApOwotICAgIGNvbnN0IF9fbTEyOGkgZTEgPSBfbW1fc3JhaV9lcGkzMihkMSwgMTYpOwotICAgIGNvbnN0IF9fbTEyOGkgZTMgPSBfbW1fc3JhaV9lcGkzMihkMywgMTYpOwotICAgIGNvbnN0IF9fbTEyOGkgZjEgPSBfbW1fcGFja3NfZXBpMzIoZTEsIGUxKTsKLSAgICBjb25zdCBfX20xMjhpIGYzID0gX21tX3BhY2tzX2VwaTMyKGUzLCBlMyk7Ci0gICAgLy8gZjEgPSBmMSArIChhMyAhPSAwKTsKLSAgICAvLyBUaGUgY29tcGFyZSB3aWxsIHJldHVybiAoMHhmZmZmLCAwKSBmb3IgKD09MCwgIT0wKS4gVG8gdHVybiB0aGF0IGludG8gdGhlCi0gICAgLy8gZGVzaXJlZCAoMCwgMSksIHdlIGFkZCBvbmUgZWFybGllciB0aHJvdWdoIGsxMjAwMF9wbHVzX29uZS4KLSAgICAvLyAtPiBmMSA9IGYxICsgMSAtIChhMyA9PSAwKQotICAgIGNvbnN0IF9fbTEyOGkgZzEgPSBfbW1fYWRkX2VwaTE2KGYxLCBfbW1fY21wZXFfZXBpMTYoYTMyLCB6ZXJvKSk7Ci0KLSAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikmb3V0WyAwXSwgZDApOwotICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKSZvdXRbIDRdLCBnMSk7Ci0gICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopJm91dFsgOF0sIGQyKTsKLSAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikmb3V0WzEyXSwgZjMpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIEZUcmFuc2Zvcm1XSFRTU0UyKGNvbnN0IGludDE2X3QqIGluLCBpbnQxNl90KiBvdXQpIHsKLSAgaW50MTZfdCB0bXBbMTZdOwotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSwgaW4gKz0gNjQpIHsKLSAgICBjb25zdCBpbnQgYTAgPSAoaW5bMCAqIDE2XSArIGluWzIgKiAxNl0pOwotICAgIGNvbnN0IGludCBhMSA9IChpblsxICogMTZdICsgaW5bMyAqIDE2XSk7Ci0gICAgY29uc3QgaW50IGEyID0gKGluWzEgKiAxNl0gLSBpblszICogMTZdKTsKLSAgICBjb25zdCBpbnQgYTMgPSAoaW5bMCAqIDE2XSAtIGluWzIgKiAxNl0pOwotICAgIHRtcFswICsgaSAqIDRdID0gYTAgKyBhMTsKLSAgICB0bXBbMSArIGkgKiA0XSA9IGEzICsgYTI7Ci0gICAgdG1wWzIgKyBpICogNF0gPSBhMyAtIGEyOwotICAgIHRtcFszICsgaSAqIDRdID0gYTAgLSBhMTsKLSAgfQotICB7Ci0gICAgY29uc3QgX19tMTI4aSBzcmMwID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmdG1wWzBdKTsKLSAgICBjb25zdCBfX20xMjhpIHNyYzEgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSZ0bXBbNF0pOwotICAgIGNvbnN0IF9fbTEyOGkgc3JjMiA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJnRtcFs4XSk7Ci0gICAgY29uc3QgX19tMTI4aSBzcmMzID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmdG1wWzEyXSk7Ci0gICAgY29uc3QgX19tMTI4aSBhMCA9IF9tbV9hZGRfZXBpMTYoc3JjMCwgc3JjMik7Ci0gICAgY29uc3QgX19tMTI4aSBhMSA9IF9tbV9hZGRfZXBpMTYoc3JjMSwgc3JjMyk7Ci0gICAgY29uc3QgX19tMTI4aSBhMiA9IF9tbV9zdWJfZXBpMTYoc3JjMSwgc3JjMyk7Ci0gICAgY29uc3QgX19tMTI4aSBhMyA9IF9tbV9zdWJfZXBpMTYoc3JjMCwgc3JjMik7Ci0gICAgY29uc3QgX19tMTI4aSBiMCA9IF9tbV9zcmFpX2VwaTE2KF9tbV9hZGRzX2VwaTE2KGEwLCBhMSksIDEpOwotICAgIGNvbnN0IF9fbTEyOGkgYjEgPSBfbW1fc3JhaV9lcGkxNihfbW1fYWRkc19lcGkxNihhMywgYTIpLCAxKTsKLSAgICBjb25zdCBfX20xMjhpIGIyID0gX21tX3NyYWlfZXBpMTYoX21tX3N1YnNfZXBpMTYoYTMsIGEyKSwgMSk7Ci0gICAgY29uc3QgX19tMTI4aSBiMyA9IF9tbV9zcmFpX2VwaTE2KF9tbV9zdWJzX2VwaTE2KGEwLCBhMSksIDEpOwotICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKSZvdXRbIDBdLCBiMCk7Ci0gICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopJm91dFsgNF0sIGIxKTsKLSAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikmb3V0WyA4XSwgYjIpOwotICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKSZvdXRbMTJdLCBiMyk7Ci0gIH0KLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE1ldHJpYwotCi1zdGF0aWMgaW50IFNTRV9OeDRTU0UyKGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcXVhZHMsIGludCBkb18xNikgewotICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOwotICBfX20xMjhpIHN1bTEgPSB6ZXJvOwotICBfX20xMjhpIHN1bTIgPSB6ZXJvOwotCi0gIHdoaWxlIChudW1fcXVhZHMtLSA+IDApIHsKLSAgICAvLyBOb3RlOiBmb3IgdGhlICFkb18xNiBjYXNlLCB3ZSByZWFkIDE2IHBpeGVscyBpbnN0ZWFkIG9mIDggYnV0IHRoYXQncyBvaywKLSAgICAvLyB0aGFua3MgdG8gYnVmZmVyIG92ZXItYWxsb2NhdGlvbiB0byB0aGF0IGVmZmVjdC4KLSAgICBjb25zdCBfX20xMjhpIGEwID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmYVtCUFMgKiAwXSk7Ci0gICAgY29uc3QgX19tMTI4aSBhMSA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJmFbQlBTICogMV0pOwotICAgIGNvbnN0IF9fbTEyOGkgYTIgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZhW0JQUyAqIDJdKTsKLSAgICBjb25zdCBfX20xMjhpIGEzID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmYVtCUFMgKiAzXSk7Ci0gICAgY29uc3QgX19tMTI4aSBiMCA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJmJbQlBTICogMF0pOwotICAgIGNvbnN0IF9fbTEyOGkgYjEgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZiW0JQUyAqIDFdKTsKLSAgICBjb25zdCBfX20xMjhpIGIyID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmYltCUFMgKiAyXSk7Ci0gICAgY29uc3QgX19tMTI4aSBiMyA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJmJbQlBTICogM10pOwotCi0gICAgLy8gY29tcHV0ZSBjbGlwMChhLWIpIGFuZCBjbGlwMChiLWEpCi0gICAgY29uc3QgX19tMTI4aSBhMHAgPSBfbW1fc3Vic19lcHU4KGEwLCBiMCk7Ci0gICAgY29uc3QgX19tMTI4aSBhMG0gPSBfbW1fc3Vic19lcHU4KGIwLCBhMCk7Ci0gICAgY29uc3QgX19tMTI4aSBhMXAgPSBfbW1fc3Vic19lcHU4KGExLCBiMSk7Ci0gICAgY29uc3QgX19tMTI4aSBhMW0gPSBfbW1fc3Vic19lcHU4KGIxLCBhMSk7Ci0gICAgY29uc3QgX19tMTI4aSBhMnAgPSBfbW1fc3Vic19lcHU4KGEyLCBiMik7Ci0gICAgY29uc3QgX19tMTI4aSBhMm0gPSBfbW1fc3Vic19lcHU4KGIyLCBhMik7Ci0gICAgY29uc3QgX19tMTI4aSBhM3AgPSBfbW1fc3Vic19lcHU4KGEzLCBiMyk7Ci0gICAgY29uc3QgX19tMTI4aSBhM20gPSBfbW1fc3Vic19lcHU4KGIzLCBhMyk7Ci0KLSAgICAvLyBjb21wdXRlIHxhLWJ8IHdpdGggOGIgYXJpdGhtZXRpYyBhcyBjbGlwMChhLWIpIHwgY2xpcDAoYi1hKQotICAgIGNvbnN0IF9fbTEyOGkgZGlmZjAgPSBfbW1fb3Jfc2kxMjgoYTBwLCBhMG0pOwotICAgIGNvbnN0IF9fbTEyOGkgZGlmZjEgPSBfbW1fb3Jfc2kxMjgoYTFwLCBhMW0pOwotICAgIGNvbnN0IF9fbTEyOGkgZGlmZjIgPSBfbW1fb3Jfc2kxMjgoYTJwLCBhMm0pOwotICAgIGNvbnN0IF9fbTEyOGkgZGlmZjMgPSBfbW1fb3Jfc2kxMjgoYTNwLCBhM20pOwotCi0gICAgLy8gdW5wYWNrIChvbmx5IGZvdXIgb3BlcmF0aW9ucywgaW5zdGVhZCBvZiBlaWdodCkKLSAgICBjb25zdCBfX20xMjhpIGxvdzAgPSBfbW1fdW5wYWNrbG9fZXBpOChkaWZmMCwgemVybyk7Ci0gICAgY29uc3QgX19tMTI4aSBsb3cxID0gX21tX3VucGFja2xvX2VwaTgoZGlmZjEsIHplcm8pOwotICAgIGNvbnN0IF9fbTEyOGkgbG93MiA9IF9tbV91bnBhY2tsb19lcGk4KGRpZmYyLCB6ZXJvKTsKLSAgICBjb25zdCBfX20xMjhpIGxvdzMgPSBfbW1fdW5wYWNrbG9fZXBpOChkaWZmMywgemVybyk7Ci0KLSAgICAvLyBtdWx0aXBseSB3aXRoIHNlbGYKLSAgICBjb25zdCBfX20xMjhpIGxvd19tYWRkMCA9IF9tbV9tYWRkX2VwaTE2KGxvdzAsIGxvdzApOwotICAgIGNvbnN0IF9fbTEyOGkgbG93X21hZGQxID0gX21tX21hZGRfZXBpMTYobG93MSwgbG93MSk7Ci0gICAgY29uc3QgX19tMTI4aSBsb3dfbWFkZDIgPSBfbW1fbWFkZF9lcGkxNihsb3cyLCBsb3cyKTsKLSAgICBjb25zdCBfX20xMjhpIGxvd19tYWRkMyA9IF9tbV9tYWRkX2VwaTE2KGxvdzMsIGxvdzMpOwotCi0gICAgLy8gY29sbGVjdCBpbiBhIGNhc2NhZGluZyB3YXkKLSAgICBjb25zdCBfX20xMjhpIGxvd19zdW0wID0gX21tX2FkZF9lcGkzMihsb3dfbWFkZDAsIGxvd19tYWRkMSk7Ci0gICAgY29uc3QgX19tMTI4aSBsb3dfc3VtMSA9IF9tbV9hZGRfZXBpMzIobG93X21hZGQyLCBsb3dfbWFkZDMpOwotICAgIHN1bTEgPSBfbW1fYWRkX2VwaTMyKHN1bTEsIGxvd19zdW0wKTsKLSAgICBzdW0yID0gX21tX2FkZF9lcGkzMihzdW0yLCBsb3dfc3VtMSk7Ci0KLSAgICBpZiAoZG9fMTYpIHsgIC8vIGlmIG5lY2Vzc2FyeSwgcHJvY2VzcyB0aGUgaGlnaGVyIDggYnl0ZXMgc2ltaWxhcmx5Ci0gICAgICBjb25zdCBfX20xMjhpIGhpMCA9IF9tbV91bnBhY2toaV9lcGk4KGRpZmYwLCB6ZXJvKTsKLSAgICAgIGNvbnN0IF9fbTEyOGkgaGkxID0gX21tX3VucGFja2hpX2VwaTgoZGlmZjEsIHplcm8pOwotICAgICAgY29uc3QgX19tMTI4aSBoaTIgPSBfbW1fdW5wYWNraGlfZXBpOChkaWZmMiwgemVybyk7Ci0gICAgICBjb25zdCBfX20xMjhpIGhpMyA9IF9tbV91bnBhY2toaV9lcGk4KGRpZmYzLCB6ZXJvKTsKLQotICAgICAgY29uc3QgX19tMTI4aSBoaV9tYWRkMCA9IF9tbV9tYWRkX2VwaTE2KGhpMCwgaGkwKTsKLSAgICAgIGNvbnN0IF9fbTEyOGkgaGlfbWFkZDEgPSBfbW1fbWFkZF9lcGkxNihoaTEsIGhpMSk7Ci0gICAgICBjb25zdCBfX20xMjhpIGhpX21hZGQyID0gX21tX21hZGRfZXBpMTYoaGkyLCBoaTIpOwotICAgICAgY29uc3QgX19tMTI4aSBoaV9tYWRkMyA9IF9tbV9tYWRkX2VwaTE2KGhpMywgaGkzKTsKLSAgICAgIGNvbnN0IF9fbTEyOGkgaGlfc3VtMCA9IF9tbV9hZGRfZXBpMzIoaGlfbWFkZDAsIGhpX21hZGQxKTsKLSAgICAgIGNvbnN0IF9fbTEyOGkgaGlfc3VtMSA9IF9tbV9hZGRfZXBpMzIoaGlfbWFkZDIsIGhpX21hZGQzKTsKLSAgICAgIHN1bTEgPSBfbW1fYWRkX2VwaTMyKHN1bTEsIGhpX3N1bTApOwotICAgICAgc3VtMiA9IF9tbV9hZGRfZXBpMzIoc3VtMiwgaGlfc3VtMSk7Ci0gICAgfQotICAgIGEgKz0gNCAqIEJQUzsKLSAgICBiICs9IDQgKiBCUFM7Ci0gIH0KLSAgewotICAgIGludDMyX3QgdG1wWzRdOwotICAgIGNvbnN0IF9fbTEyOGkgc3VtID0gX21tX2FkZF9lcGkzMihzdW0xLCBzdW0yKTsKLSAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKil0bXAsIHN1bSk7Ci0gICAgcmV0dXJuICh0bXBbM10gKyB0bXBbMl0gKyB0bXBbMV0gKyB0bXBbMF0pOwotICB9Ci19Ci0KLXN0YXRpYyBpbnQgU1NFMTZ4MTZTU0UyKGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIpIHsKLSAgcmV0dXJuIFNTRV9OeDRTU0UyKGEsIGIsIDQsIDEpOwotfQotCi1zdGF0aWMgaW50IFNTRTE2eDhTU0UyKGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIpIHsKLSAgcmV0dXJuIFNTRV9OeDRTU0UyKGEsIGIsIDIsIDEpOwotfQotCi1zdGF0aWMgaW50IFNTRTh4OFNTRTIoY29uc3QgdWludDhfdCogYSwgY29uc3QgdWludDhfdCogYikgewotICByZXR1cm4gU1NFX054NFNTRTIoYSwgYiwgMiwgMCk7Ci19Ci0KLXN0YXRpYyBpbnQgU1NFNHg0U1NFMihjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiBiKSB7Ci0gIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7Ci0KLSAgLy8gTG9hZCB2YWx1ZXMuIE5vdGUgdGhhdCB3ZSByZWFkIDggcGl4ZWxzIGluc3RlYWQgb2YgNCwKLSAgLy8gYnV0IHRoZSBhL2IgYnVmZmVycyBhcmUgb3Zlci1hbGxvY2F0ZWQgdG8gdGhhdCBlZmZlY3QuCi0gIGNvbnN0IF9fbTEyOGkgYTAgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSZhW0JQUyAqIDBdKTsKLSAgY29uc3QgX19tMTI4aSBhMSA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJmFbQlBTICogMV0pOwotICBjb25zdCBfX20xMjhpIGEyID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmYVtCUFMgKiAyXSk7Ci0gIGNvbnN0IF9fbTEyOGkgYTMgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSZhW0JQUyAqIDNdKTsKLSAgY29uc3QgX19tMTI4aSBiMCA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJmJbQlBTICogMF0pOwotICBjb25zdCBfX20xMjhpIGIxID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmYltCUFMgKiAxXSk7Ci0gIGNvbnN0IF9fbTEyOGkgYjIgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSZiW0JQUyAqIDJdKTsKLSAgY29uc3QgX19tMTI4aSBiMyA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJmJbQlBTICogM10pOwotCi0gIC8vIENvbWJpbmUgcGFpciBvZiBsaW5lcyBhbmQgY29udmVydCB0byAxNmIuCi0gIGNvbnN0IF9fbTEyOGkgYTAxID0gX21tX3VucGFja2xvX2VwaTMyKGEwLCBhMSk7Ci0gIGNvbnN0IF9fbTEyOGkgYTIzID0gX21tX3VucGFja2xvX2VwaTMyKGEyLCBhMyk7Ci0gIGNvbnN0IF9fbTEyOGkgYjAxID0gX21tX3VucGFja2xvX2VwaTMyKGIwLCBiMSk7Ci0gIGNvbnN0IF9fbTEyOGkgYjIzID0gX21tX3VucGFja2xvX2VwaTMyKGIyLCBiMyk7Ci0gIGNvbnN0IF9fbTEyOGkgYTAxcyA9IF9tbV91bnBhY2tsb19lcGk4KGEwMSwgemVybyk7Ci0gIGNvbnN0IF9fbTEyOGkgYTIzcyA9IF9tbV91bnBhY2tsb19lcGk4KGEyMywgemVybyk7Ci0gIGNvbnN0IF9fbTEyOGkgYjAxcyA9IF9tbV91bnBhY2tsb19lcGk4KGIwMSwgemVybyk7Ci0gIGNvbnN0IF9fbTEyOGkgYjIzcyA9IF9tbV91bnBhY2tsb19lcGk4KGIyMywgemVybyk7Ci0KLSAgLy8gQ29tcHV0ZSBkaWZmZXJlbmNlczsgKGEtYileMiA9IChhYnMoYS1iKSleMiA9IChzYXQ4KGEtYikgKyBzYXQ4KGItYSkpXjIKLSAgLy8gVE9ETyhjZHV2aXZpZXIpOiBEaXNzYXNzZW1ibGUgYW5kIGZpZ3VyZSBvdXQgd2h5IHRoaXMgaXMgZmFzdGVzdC4gV2UgZG9uJ3QKLSAgLy8gICAgICAgICAgICAgICAgICBuZWVkIGFic29sdXRlIHZhbHVlcywgdGhlcmUgaXMgbm8gbmVlZCB0byBkbyBjYWxjdWxhdGlvbgotICAvLyAgICAgICAgICAgICAgICAgIGluIDhiaXQgYXMgd2UgYXJlIGFscmVhZHkgaW4gMTZiaXQsIC4uLiBZZXQgdGhpcyBpcyB3aGF0Ci0gIC8vICAgICAgICAgICAgICAgICAgYmVuY2htYXJrcyB0aGUgZmFzdGVzdCEKLSAgY29uc3QgX19tMTI4aSBkMCA9IF9tbV9zdWJzX2VwdTgoYTAxcywgYjAxcyk7Ci0gIGNvbnN0IF9fbTEyOGkgZDEgPSBfbW1fc3Vic19lcHU4KGIwMXMsIGEwMXMpOwotICBjb25zdCBfX20xMjhpIGQyID0gX21tX3N1YnNfZXB1OChhMjNzLCBiMjNzKTsKLSAgY29uc3QgX19tMTI4aSBkMyA9IF9tbV9zdWJzX2VwdTgoYjIzcywgYTIzcyk7Ci0KLSAgLy8gU3F1YXJlIGFuZCBhZGQgdGhlbSBhbGwgdG9nZXRoZXIuCi0gIGNvbnN0IF9fbTEyOGkgbWFkZDAgPSBfbW1fbWFkZF9lcGkxNihkMCwgZDApOwotICBjb25zdCBfX20xMjhpIG1hZGQxID0gX21tX21hZGRfZXBpMTYoZDEsIGQxKTsKLSAgY29uc3QgX19tMTI4aSBtYWRkMiA9IF9tbV9tYWRkX2VwaTE2KGQyLCBkMik7Ci0gIGNvbnN0IF9fbTEyOGkgbWFkZDMgPSBfbW1fbWFkZF9lcGkxNihkMywgZDMpOwotICBjb25zdCBfX20xMjhpIHN1bTAgPSBfbW1fYWRkX2VwaTMyKG1hZGQwLCBtYWRkMSk7Ci0gIGNvbnN0IF9fbTEyOGkgc3VtMSA9IF9tbV9hZGRfZXBpMzIobWFkZDIsIG1hZGQzKTsKLSAgY29uc3QgX19tMTI4aSBzdW0yID0gX21tX2FkZF9lcGkzMihzdW0wLCBzdW0xKTsKLQotICBpbnQzMl90IHRtcFs0XTsKLSAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopdG1wLCBzdW0yKTsKLSAgcmV0dXJuICh0bXBbM10gKyB0bXBbMl0gKyB0bXBbMV0gKyB0bXBbMF0pOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVGV4dHVyZSBkaXN0b3J0aW9uCi0vLwotLy8gV2UgdHJ5IHRvIG1hdGNoIHRoZSBzcGVjdHJhbCBjb250ZW50ICh3ZWlnaHRlZCkgYmV0d2VlbiBzb3VyY2UgYW5kCi0vLyByZWNvbnN0cnVjdGVkIHNhbXBsZXMuCi0KLS8vIEhhZGFtYXJkIHRyYW5zZm9ybQotLy8gUmV0dXJucyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB3ZWlnaHRlZCBzdW0gb2YgdGhlIGFic29sdXRlIHZhbHVlIG9mCi0vLyB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMuCi1zdGF0aWMgaW50IFRUcmFuc2Zvcm1TU0UyKGNvbnN0IHVpbnQ4X3QqIGluQSwgY29uc3QgdWludDhfdCogaW5CLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCogY29uc3QgdykgewotICBpbnQzMl90IHN1bVs0XTsKLSAgX19tMTI4aSB0bXBfMCwgdG1wXzEsIHRtcF8yLCB0bXBfMzsKLSAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKLQotICAvLyBMb2FkLCBjb21iaW5lIGFuZCB0cmFucG9zZSBpbnB1dHMuCi0gIHsKLSAgICBjb25zdCBfX20xMjhpIGluQV8wID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmaW5BW0JQUyAqIDBdKTsKLSAgICBjb25zdCBfX20xMjhpIGluQV8xID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmaW5BW0JQUyAqIDFdKTsKLSAgICBjb25zdCBfX20xMjhpIGluQV8yID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmaW5BW0JQUyAqIDJdKTsKLSAgICBjb25zdCBfX20xMjhpIGluQV8zID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmaW5BW0JQUyAqIDNdKTsKLSAgICBjb25zdCBfX20xMjhpIGluQl8wID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmaW5CW0JQUyAqIDBdKTsKLSAgICBjb25zdCBfX20xMjhpIGluQl8xID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmaW5CW0JQUyAqIDFdKTsKLSAgICBjb25zdCBfX20xMjhpIGluQl8yID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmaW5CW0JQUyAqIDJdKTsKLSAgICBjb25zdCBfX20xMjhpIGluQl8zID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmaW5CW0JQUyAqIDNdKTsKLQotICAgIC8vIENvbWJpbmUgaW5BIGFuZCBpbkIgKHdlJ2xsIGRvIHR3byB0cmFuc2Zvcm1zIGluIHBhcmFsbGVsKS4KLSAgICBjb25zdCBfX20xMjhpIGluQUJfMCA9IF9tbV91bnBhY2tsb19lcGk4KGluQV8wLCBpbkJfMCk7Ci0gICAgY29uc3QgX19tMTI4aSBpbkFCXzEgPSBfbW1fdW5wYWNrbG9fZXBpOChpbkFfMSwgaW5CXzEpOwotICAgIGNvbnN0IF9fbTEyOGkgaW5BQl8yID0gX21tX3VucGFja2xvX2VwaTgoaW5BXzIsIGluQl8yKTsKLSAgICBjb25zdCBfX20xMjhpIGluQUJfMyA9IF9tbV91bnBhY2tsb19lcGk4KGluQV8zLCBpbkJfMyk7Ci0gICAgLy8gYTAwIGIwMCBhMDEgYjAxIGEwMiBiMDMgYTAzIGIwMyAgIDAgMCAwIDAgMCAwIDAgMAotICAgIC8vIGExMCBiMTAgYTExIGIxMSBhMTIgYjEyIGExMyBiMTMgICAwIDAgMCAwIDAgMCAwIDAKLSAgICAvLyBhMjAgYjIwIGEyMSBiMjEgYTIyIGIyMiBhMjMgYjIzICAgMCAwIDAgMCAwIDAgMCAwCi0gICAgLy8gYTMwIGIzMCBhMzEgYjMxIGEzMiBiMzIgYTMzIGIzMyAgIDAgMCAwIDAgMCAwIDAgMAotCi0gICAgLy8gVHJhbnNwb3NlIHRoZSB0d28gNHg0LCBkaXNjYXJkaW5nIHRoZSBmaWxsaW5nIHplcm9lcy4KLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTBfMCA9IF9tbV91bnBhY2tsb19lcGk4KGluQUJfMCwgaW5BQl8yKTsKLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTBfMSA9IF9tbV91bnBhY2tsb19lcGk4KGluQUJfMSwgaW5BQl8zKTsKLSAgICAvLyBhMDAgYTIwICBiMDAgYjIwICBhMDEgYTIxICBiMDEgYjIxICBhMDIgYTIyICBiMDIgYjIyICBhMDMgYTIzICBiMDMgYjIzCi0gICAgLy8gYTEwIGEzMCAgYjEwIGIzMCAgYTExIGEzMSAgYjExIGIzMSAgYTEyIGEzMiAgYjEyIGIzMiAgYTEzIGEzMyAgYjEzIGIzMwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMV8wID0gX21tX3VucGFja2xvX2VwaTgodHJhbnNwb3NlMF8wLCB0cmFuc3Bvc2UwXzEpOwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMV8xID0gX21tX3VucGFja2hpX2VwaTgodHJhbnNwb3NlMF8wLCB0cmFuc3Bvc2UwXzEpOwotICAgIC8vIGEwMCBhMTAgYTIwIGEzMCAgYjAwIGIxMCBiMjAgYjMwICBhMDEgYTExIGEyMSBhMzEgIGIwMSBiMTEgYjIxIGIzMQotICAgIC8vIGEwMiBhMTIgYTIyIGEzMiAgYjAyIGIxMiBiMjIgYjMyICBhMDMgYTEzIGEyMyBhMzMgIGIwMyBiMTMgYjIzIGIzMwotCi0gICAgLy8gQ29udmVydCB0byAxNmIuCi0gICAgdG1wXzAgPSBfbW1fdW5wYWNrbG9fZXBpOCh0cmFuc3Bvc2UxXzAsIHplcm8pOwotICAgIHRtcF8xID0gX21tX3VucGFja2hpX2VwaTgodHJhbnNwb3NlMV8wLCB6ZXJvKTsKLSAgICB0bXBfMiA9IF9tbV91bnBhY2tsb19lcGk4KHRyYW5zcG9zZTFfMSwgemVybyk7Ci0gICAgdG1wXzMgPSBfbW1fdW5wYWNraGlfZXBpOCh0cmFuc3Bvc2UxXzEsIHplcm8pOwotICAgIC8vIGEwMCBhMTAgYTIwIGEzMCAgIGIwMCBiMTAgYjIwIGIzMAotICAgIC8vIGEwMSBhMTEgYTIxIGEzMSAgIGIwMSBiMTEgYjIxIGIzMQotICAgIC8vIGEwMiBhMTIgYTIyIGEzMiAgIGIwMiBiMTIgYjIyIGIzMgotICAgIC8vIGEwMyBhMTMgYTIzIGEzMyAgIGIwMyBiMTMgYjIzIGIzMwotICB9Ci0KLSAgLy8gSG9yaXpvbnRhbCBwYXNzIGFuZCBzdWJzZXF1ZW50IHRyYW5zcG9zZS4KLSAgewotICAgIC8vIENhbGN1bGF0ZSBhIGFuZCBiICh0d28gNHg0IGF0IG9uY2UpLgotICAgIGNvbnN0IF9fbTEyOGkgYTAgPSBfbW1fYWRkX2VwaTE2KHRtcF8wLCB0bXBfMik7Ci0gICAgY29uc3QgX19tMTI4aSBhMSA9IF9tbV9hZGRfZXBpMTYodG1wXzEsIHRtcF8zKTsKLSAgICBjb25zdCBfX20xMjhpIGEyID0gX21tX3N1Yl9lcGkxNih0bXBfMSwgdG1wXzMpOwotICAgIGNvbnN0IF9fbTEyOGkgYTMgPSBfbW1fc3ViX2VwaTE2KHRtcF8wLCB0bXBfMik7Ci0gICAgY29uc3QgX19tMTI4aSBiMCA9IF9tbV9hZGRfZXBpMTYoYTAsIGExKTsKLSAgICBjb25zdCBfX20xMjhpIGIxID0gX21tX2FkZF9lcGkxNihhMywgYTIpOwotICAgIGNvbnN0IF9fbTEyOGkgYjIgPSBfbW1fc3ViX2VwaTE2KGEzLCBhMik7Ci0gICAgY29uc3QgX19tMTI4aSBiMyA9IF9tbV9zdWJfZXBpMTYoYTAsIGExKTsKLSAgICAvLyBhMDAgYTAxIGEwMiBhMDMgICBiMDAgYjAxIGIwMiBiMDMKLSAgICAvLyBhMTAgYTExIGExMiBhMTMgICBiMTAgYjExIGIxMiBiMTMKLSAgICAvLyBhMjAgYTIxIGEyMiBhMjMgICBiMjAgYjIxIGIyMiBiMjMKLSAgICAvLyBhMzAgYTMxIGEzMiBhMzMgICBiMzAgYjMxIGIzMiBiMzMKLQotICAgIC8vIFRyYW5zcG9zZSB0aGUgdHdvIDR4NC4KLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTBfMCA9IF9tbV91bnBhY2tsb19lcGkxNihiMCwgYjEpOwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMF8xID0gX21tX3VucGFja2xvX2VwaTE2KGIyLCBiMyk7Ci0gICAgY29uc3QgX19tMTI4aSB0cmFuc3Bvc2UwXzIgPSBfbW1fdW5wYWNraGlfZXBpMTYoYjAsIGIxKTsKLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTBfMyA9IF9tbV91bnBhY2toaV9lcGkxNihiMiwgYjMpOwotICAgIC8vIGEwMCBhMTAgYTAxIGExMSAgIGEwMiBhMTIgYTAzIGExMwotICAgIC8vIGEyMCBhMzAgYTIxIGEzMSAgIGEyMiBhMzIgYTIzIGEzMwotICAgIC8vIGIwMCBiMTAgYjAxIGIxMSAgIGIwMiBiMTIgYjAzIGIxMwotICAgIC8vIGIyMCBiMzAgYjIxIGIzMSAgIGIyMiBiMzIgYjIzIGIzMwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMV8wID0gX21tX3VucGFja2xvX2VwaTMyKHRyYW5zcG9zZTBfMCwgdHJhbnNwb3NlMF8xKTsKLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTFfMSA9IF9tbV91bnBhY2tsb19lcGkzMih0cmFuc3Bvc2UwXzIsIHRyYW5zcG9zZTBfMyk7Ci0gICAgY29uc3QgX19tMTI4aSB0cmFuc3Bvc2UxXzIgPSBfbW1fdW5wYWNraGlfZXBpMzIodHJhbnNwb3NlMF8wLCB0cmFuc3Bvc2UwXzEpOwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMV8zID0gX21tX3VucGFja2hpX2VwaTMyKHRyYW5zcG9zZTBfMiwgdHJhbnNwb3NlMF8zKTsKLSAgICAvLyBhMDAgYTEwIGEyMCBhMzAgYTAxIGExMSBhMjEgYTMxCi0gICAgLy8gYjAwIGIxMCBiMjAgYjMwIGIwMSBiMTEgYjIxIGIzMQotICAgIC8vIGEwMiBhMTIgYTIyIGEzMiBhMDMgYTEzIGEyMyBhMzMKLSAgICAvLyBiMDIgYjEyIGEyMiBiMzIgYjAzIGIxMyBiMjMgYjMzCi0gICAgdG1wXzAgPSBfbW1fdW5wYWNrbG9fZXBpNjQodHJhbnNwb3NlMV8wLCB0cmFuc3Bvc2UxXzEpOwotICAgIHRtcF8xID0gX21tX3VucGFja2hpX2VwaTY0KHRyYW5zcG9zZTFfMCwgdHJhbnNwb3NlMV8xKTsKLSAgICB0bXBfMiA9IF9tbV91bnBhY2tsb19lcGk2NCh0cmFuc3Bvc2UxXzIsIHRyYW5zcG9zZTFfMyk7Ci0gICAgdG1wXzMgPSBfbW1fdW5wYWNraGlfZXBpNjQodHJhbnNwb3NlMV8yLCB0cmFuc3Bvc2UxXzMpOwotICAgIC8vIGEwMCBhMTAgYTIwIGEzMCAgIGIwMCBiMTAgYjIwIGIzMAotICAgIC8vIGEwMSBhMTEgYTIxIGEzMSAgIGIwMSBiMTEgYjIxIGIzMQotICAgIC8vIGEwMiBhMTIgYTIyIGEzMiAgIGIwMiBiMTIgYjIyIGIzMgotICAgIC8vIGEwMyBhMTMgYTIzIGEzMyAgIGIwMyBiMTMgYjIzIGIzMwotICB9Ci0KLSAgLy8gVmVydGljYWwgcGFzcyBhbmQgZGlmZmVyZW5jZSBvZiB3ZWlnaHRlZCBzdW1zLgotICB7Ci0gICAgLy8gTG9hZCBhbGwgaW5wdXRzLgotICAgIC8vIFRPRE8oY2R1dml2aWVyKTogTWFrZSB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgYW5kIGFsbG9jYXRpb25zIGFsaWduZWQgc28KLSAgICAvLyAgICAgICAgICAgICAgICAgIHdlIGNhbiB1c2UgX21tX2xvYWRfc2kxMjggaW5zdGVhZCBvZiBfbW1fbG9hZHVfc2kxMjguCi0gICAgY29uc3QgX19tMTI4aSB3XzAgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZ3WzBdKTsKLSAgICBjb25zdCBfX20xMjhpIHdfOCA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJndbOF0pOwotCi0gICAgLy8gQ2FsY3VsYXRlIGEgYW5kIGIgKHR3byA0eDQgYXQgb25jZSkuCi0gICAgY29uc3QgX19tMTI4aSBhMCA9IF9tbV9hZGRfZXBpMTYodG1wXzAsIHRtcF8yKTsKLSAgICBjb25zdCBfX20xMjhpIGExID0gX21tX2FkZF9lcGkxNih0bXBfMSwgdG1wXzMpOwotICAgIGNvbnN0IF9fbTEyOGkgYTIgPSBfbW1fc3ViX2VwaTE2KHRtcF8xLCB0bXBfMyk7Ci0gICAgY29uc3QgX19tMTI4aSBhMyA9IF9tbV9zdWJfZXBpMTYodG1wXzAsIHRtcF8yKTsKLSAgICBjb25zdCBfX20xMjhpIGIwID0gX21tX2FkZF9lcGkxNihhMCwgYTEpOwotICAgIGNvbnN0IF9fbTEyOGkgYjEgPSBfbW1fYWRkX2VwaTE2KGEzLCBhMik7Ci0gICAgY29uc3QgX19tMTI4aSBiMiA9IF9tbV9zdWJfZXBpMTYoYTMsIGEyKTsKLSAgICBjb25zdCBfX20xMjhpIGIzID0gX21tX3N1Yl9lcGkxNihhMCwgYTEpOwotCi0gICAgLy8gU2VwYXJhdGUgdGhlIHRyYW5zZm9ybXMgb2YgaW5BIGFuZCBpbkIuCi0gICAgX19tMTI4aSBBX2IwID0gX21tX3VucGFja2xvX2VwaTY0KGIwLCBiMSk7Ci0gICAgX19tMTI4aSBBX2IyID0gX21tX3VucGFja2xvX2VwaTY0KGIyLCBiMyk7Ci0gICAgX19tMTI4aSBCX2IwID0gX21tX3VucGFja2hpX2VwaTY0KGIwLCBiMSk7Ci0gICAgX19tMTI4aSBCX2IyID0gX21tX3VucGFja2hpX2VwaTY0KGIyLCBiMyk7Ci0KLSAgICB7Ci0gICAgICAvLyBzaWduKGIpID0gYiA+PiAxNSAgKDB4MDAwMCBpZiBwb3NpdGl2ZSwgMHhmZmZmIGlmIG5lZ2F0aXZlKQotICAgICAgY29uc3QgX19tMTI4aSBzaWduX0FfYjAgPSBfbW1fc3JhaV9lcGkxNihBX2IwLCAxNSk7Ci0gICAgICBjb25zdCBfX20xMjhpIHNpZ25fQV9iMiA9IF9tbV9zcmFpX2VwaTE2KEFfYjIsIDE1KTsKLSAgICAgIGNvbnN0IF9fbTEyOGkgc2lnbl9CX2IwID0gX21tX3NyYWlfZXBpMTYoQl9iMCwgMTUpOwotICAgICAgY29uc3QgX19tMTI4aSBzaWduX0JfYjIgPSBfbW1fc3JhaV9lcGkxNihCX2IyLCAxNSk7Ci0KLSAgICAgIC8vIGIgPSBhYnMoYikgPSAoYiBeIHNpZ24pIC0gc2lnbgotICAgICAgQV9iMCA9IF9tbV94b3Jfc2kxMjgoQV9iMCwgc2lnbl9BX2IwKTsKLSAgICAgIEFfYjIgPSBfbW1feG9yX3NpMTI4KEFfYjIsIHNpZ25fQV9iMik7Ci0gICAgICBCX2IwID0gX21tX3hvcl9zaTEyOChCX2IwLCBzaWduX0JfYjApOwotICAgICAgQl9iMiA9IF9tbV94b3Jfc2kxMjgoQl9iMiwgc2lnbl9CX2IyKTsKLSAgICAgIEFfYjAgPSBfbW1fc3ViX2VwaTE2KEFfYjAsIHNpZ25fQV9iMCk7Ci0gICAgICBBX2IyID0gX21tX3N1Yl9lcGkxNihBX2IyLCBzaWduX0FfYjIpOwotICAgICAgQl9iMCA9IF9tbV9zdWJfZXBpMTYoQl9iMCwgc2lnbl9CX2IwKTsKLSAgICAgIEJfYjIgPSBfbW1fc3ViX2VwaTE2KEJfYjIsIHNpZ25fQl9iMik7Ci0gICAgfQotCi0gICAgLy8gd2VpZ2h0ZWQgc3VtcwotICAgIEFfYjAgPSBfbW1fbWFkZF9lcGkxNihBX2IwLCB3XzApOwotICAgIEFfYjIgPSBfbW1fbWFkZF9lcGkxNihBX2IyLCB3XzgpOwotICAgIEJfYjAgPSBfbW1fbWFkZF9lcGkxNihCX2IwLCB3XzApOwotICAgIEJfYjIgPSBfbW1fbWFkZF9lcGkxNihCX2IyLCB3XzgpOwotICAgIEFfYjAgPSBfbW1fYWRkX2VwaTMyKEFfYjAsIEFfYjIpOwotICAgIEJfYjAgPSBfbW1fYWRkX2VwaTMyKEJfYjAsIEJfYjIpOwotCi0gICAgLy8gZGlmZmVyZW5jZSBvZiB3ZWlnaHRlZCBzdW1zCi0gICAgQV9iMCA9IF9tbV9zdWJfZXBpMzIoQV9iMCwgQl9iMCk7Ci0gICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJnN1bVswXSwgQV9iMCk7Ci0gIH0KLSAgcmV0dXJuIHN1bVswXSArIHN1bVsxXSArIHN1bVsyXSArIHN1bVszXTsKLX0KLQotc3RhdGljIGludCBEaXN0bzR4NFNTRTIoY29uc3QgdWludDhfdCogY29uc3QgYSwgY29uc3QgdWludDhfdCogY29uc3QgYiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90KiBjb25zdCB3KSB7Ci0gIGNvbnN0IGludCBkaWZmX3N1bSA9IFRUcmFuc2Zvcm1TU0UyKGEsIGIsIHcpOwotICByZXR1cm4gYWJzKGRpZmZfc3VtKSA+PiA1OwotfQotCi1zdGF0aWMgaW50IERpc3RvMTZ4MTZTU0UyKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGEsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90KiBjb25zdCB3KSB7Ci0gIGludCBEID0gMDsKLSAgaW50IHgsIHk7Ci0gIGZvciAoeSA9IDA7IHkgPCAxNiAqIEJQUzsgeSArPSA0ICogQlBTKSB7Ci0gICAgZm9yICh4ID0gMDsgeCA8IDE2OyB4ICs9IDQpIHsKLSAgICAgIEQgKz0gRGlzdG80eDRTU0UyKGEgKyB4ICsgeSwgYiArIHggKyB5LCB3KTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIEQ7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBRdWFudGl6YXRpb24KLS8vCi0KLS8vIFNpbXBsZSBxdWFudGl6YXRpb24KLXN0YXRpYyBpbnQgUXVhbnRpemVCbG9ja1NTRTIoaW50MTZfdCBpblsxNl0sIGludDE2X3Qgb3V0WzE2XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG4sIGNvbnN0IFZQOE1hdHJpeCogY29uc3QgbXR4KSB7Ci0gIGNvbnN0IF9fbTEyOGkgbWF4X2NvZWZmXzIwNDcgPSBfbW1fc2V0MV9lcGkxNihNQVhfTEVWRUwpOwotICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOwotICBfX20xMjhpIGNvZWZmMCwgY29lZmY4OwotICBfX20xMjhpIG91dDAsIG91dDg7Ci0gIF9fbTEyOGkgcGFja2VkX291dDsKLQotICAvLyBMb2FkIGFsbCBpbnB1dHMuCi0gIC8vIFRPRE8oY2R1dml2aWVyKTogTWFrZSB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgYW5kIGFsbG9jYXRpb25zIGFsaWduZWQgc28gdGhhdAotICAvLyAgICAgICAgICAgICAgICAgIHdlIGNhbiB1c2UgX21tX2xvYWRfc2kxMjggaW5zdGVhZCBvZiBfbW1fbG9hZHVfc2kxMjguCi0gIF9fbTEyOGkgaW4wID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmaW5bMF0pOwotICBfX20xMjhpIGluOCA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJmluWzhdKTsKLSAgY29uc3QgX19tMTI4aSBzaGFycGVuMCA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJm10eC0+c2hhcnBlbl9bMF0pOwotICBjb25zdCBfX20xMjhpIHNoYXJwZW44ID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmbXR4LT5zaGFycGVuX1s4XSk7Ci0gIGNvbnN0IF9fbTEyOGkgaXEwID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmbXR4LT5pcV9bMF0pOwotICBjb25zdCBfX20xMjhpIGlxOCA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJm10eC0+aXFfWzhdKTsKLSAgY29uc3QgX19tMTI4aSBiaWFzMCA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJm10eC0+Ymlhc19bMF0pOwotICBjb25zdCBfX20xMjhpIGJpYXM4ID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmbXR4LT5iaWFzX1s4XSk7Ci0gIGNvbnN0IF9fbTEyOGkgcTAgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZtdHgtPnFfWzBdKTsKLSAgY29uc3QgX19tMTI4aSBxOCA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJm10eC0+cV9bOF0pOwotICBjb25zdCBfX20xMjhpIHp0aHJlc2gwID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmbXR4LT56dGhyZXNoX1swXSk7Ci0gIGNvbnN0IF9fbTEyOGkgenRocmVzaDggPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZtdHgtPnp0aHJlc2hfWzhdKTsKLQotICAvLyBzaWduKGluKSA9IGluID4+IDE1ICAoMHgwMDAwIGlmIHBvc2l0aXZlLCAweGZmZmYgaWYgbmVnYXRpdmUpCi0gIGNvbnN0IF9fbTEyOGkgc2lnbjAgPSBfbW1fc3JhaV9lcGkxNihpbjAsIDE1KTsKLSAgY29uc3QgX19tMTI4aSBzaWduOCA9IF9tbV9zcmFpX2VwaTE2KGluOCwgMTUpOwotCi0gIC8vIGNvZWZmID0gYWJzKGluKSA9IChpbiBeIHNpZ24pIC0gc2lnbgotICBjb2VmZjAgPSBfbW1feG9yX3NpMTI4KGluMCwgc2lnbjApOwotICBjb2VmZjggPSBfbW1feG9yX3NpMTI4KGluOCwgc2lnbjgpOwotICBjb2VmZjAgPSBfbW1fc3ViX2VwaTE2KGNvZWZmMCwgc2lnbjApOwotICBjb2VmZjggPSBfbW1fc3ViX2VwaTE2KGNvZWZmOCwgc2lnbjgpOwotCi0gIC8vIGNvZWZmID0gYWJzKGluKSArIHNoYXJwZW4KLSAgY29lZmYwID0gX21tX2FkZF9lcGkxNihjb2VmZjAsIHNoYXJwZW4wKTsKLSAgY29lZmY4ID0gX21tX2FkZF9lcGkxNihjb2VmZjgsIHNoYXJwZW44KTsKLQotICAvLyBvdXQgPSAoY29lZmYgKiBpUSArIEIpID4+IFFGSVg7Ci0gIHsKLSAgICAvLyBkb2luZyBjYWxjdWxhdGlvbnMgd2l0aCAzMmIgcHJlY2lzaW9uIChRRklYPTE3KQotICAgIC8vIG91dCA9IChjb2VmZiAqIGlRKQotICAgIF9fbTEyOGkgY29lZmZfaVEwSCA9IF9tbV9tdWxoaV9lcHUxNihjb2VmZjAsIGlxMCk7Ci0gICAgX19tMTI4aSBjb2VmZl9pUTBMID0gX21tX211bGxvX2VwaTE2KGNvZWZmMCwgaXEwKTsKLSAgICBfX20xMjhpIGNvZWZmX2lROEggPSBfbW1fbXVsaGlfZXB1MTYoY29lZmY4LCBpcTgpOwotICAgIF9fbTEyOGkgY29lZmZfaVE4TCA9IF9tbV9tdWxsb19lcGkxNihjb2VmZjgsIGlxOCk7Ci0gICAgX19tMTI4aSBvdXRfMDAgPSBfbW1fdW5wYWNrbG9fZXBpMTYoY29lZmZfaVEwTCwgY29lZmZfaVEwSCk7Ci0gICAgX19tMTI4aSBvdXRfMDQgPSBfbW1fdW5wYWNraGlfZXBpMTYoY29lZmZfaVEwTCwgY29lZmZfaVEwSCk7Ci0gICAgX19tMTI4aSBvdXRfMDggPSBfbW1fdW5wYWNrbG9fZXBpMTYoY29lZmZfaVE4TCwgY29lZmZfaVE4SCk7Ci0gICAgX19tMTI4aSBvdXRfMTIgPSBfbW1fdW5wYWNraGlfZXBpMTYoY29lZmZfaVE4TCwgY29lZmZfaVE4SCk7Ci0gICAgLy8gZXhwYW5kIGJpYXMgZnJvbSAxNmIgdG8gMzJiCi0gICAgX19tMTI4aSBiaWFzXzAwID0gX21tX3VucGFja2xvX2VwaTE2KGJpYXMwLCB6ZXJvKTsKLSAgICBfX20xMjhpIGJpYXNfMDQgPSBfbW1fdW5wYWNraGlfZXBpMTYoYmlhczAsIHplcm8pOwotICAgIF9fbTEyOGkgYmlhc18wOCA9IF9tbV91bnBhY2tsb19lcGkxNihiaWFzOCwgemVybyk7Ci0gICAgX19tMTI4aSBiaWFzXzEyID0gX21tX3VucGFja2hpX2VwaTE2KGJpYXM4LCB6ZXJvKTsKLSAgICAvLyBvdXQgPSAoY29lZmYgKiBpUSArIEIpCi0gICAgb3V0XzAwID0gX21tX2FkZF9lcGkzMihvdXRfMDAsIGJpYXNfMDApOwotICAgIG91dF8wNCA9IF9tbV9hZGRfZXBpMzIob3V0XzA0LCBiaWFzXzA0KTsKLSAgICBvdXRfMDggPSBfbW1fYWRkX2VwaTMyKG91dF8wOCwgYmlhc18wOCk7Ci0gICAgb3V0XzEyID0gX21tX2FkZF9lcGkzMihvdXRfMTIsIGJpYXNfMTIpOwotICAgIC8vIG91dCA9IChjb2VmZiAqIGlRICsgQikgPj4gUUZJWDsKLSAgICBvdXRfMDAgPSBfbW1fc3JhaV9lcGkzMihvdXRfMDAsIFFGSVgpOwotICAgIG91dF8wNCA9IF9tbV9zcmFpX2VwaTMyKG91dF8wNCwgUUZJWCk7Ci0gICAgb3V0XzA4ID0gX21tX3NyYWlfZXBpMzIob3V0XzA4LCBRRklYKTsKLSAgICBvdXRfMTIgPSBfbW1fc3JhaV9lcGkzMihvdXRfMTIsIFFGSVgpOwotCi0gICAgLy8gcGFjayByZXN1bHQgYXMgMTZiCi0gICAgb3V0MCA9IF9tbV9wYWNrc19lcGkzMihvdXRfMDAsIG91dF8wNCk7Ci0gICAgb3V0OCA9IF9tbV9wYWNrc19lcGkzMihvdXRfMDgsIG91dF8xMik7Ci0KLSAgICAvLyBpZiAoY29lZmYgPiAyMDQ3KSBjb2VmZiA9IDIwNDcKLSAgICBvdXQwID0gX21tX21pbl9lcGkxNihvdXQwLCBtYXhfY29lZmZfMjA0Nyk7Ci0gICAgb3V0OCA9IF9tbV9taW5fZXBpMTYob3V0OCwgbWF4X2NvZWZmXzIwNDcpOwotICB9Ci0KLSAgLy8gZ2V0IHNpZ24gYmFjayAoaWYgKHNpZ25bal0pIG91dF9uID0gLW91dF9uKQotICBvdXQwID0gX21tX3hvcl9zaTEyOChvdXQwLCBzaWduMCk7Ci0gIG91dDggPSBfbW1feG9yX3NpMTI4KG91dDgsIHNpZ244KTsKLSAgb3V0MCA9IF9tbV9zdWJfZXBpMTYob3V0MCwgc2lnbjApOwotICBvdXQ4ID0gX21tX3N1Yl9lcGkxNihvdXQ4LCBzaWduOCk7Ci0KLSAgLy8gaW4gPSBvdXQgKiBRCi0gIGluMCA9IF9tbV9tdWxsb19lcGkxNihvdXQwLCBxMCk7Ci0gIGluOCA9IF9tbV9tdWxsb19lcGkxNihvdXQ4LCBxOCk7Ci0KLSAgLy8gaWYgKGNvZWZmIDw9IG10eC0+enRocmVzaF8pIHtpbj0wOyBvdXQ9MDt9Ci0gIHsKLSAgICBfX20xMjhpIGNtcDAgPSBfbW1fY21wZ3RfZXBpMTYoY29lZmYwLCB6dGhyZXNoMCk7Ci0gICAgX19tMTI4aSBjbXA4ID0gX21tX2NtcGd0X2VwaTE2KGNvZWZmOCwgenRocmVzaDgpOwotICAgIGluMCA9IF9tbV9hbmRfc2kxMjgoaW4wLCBjbXAwKTsKLSAgICBpbjggPSBfbW1fYW5kX3NpMTI4KGluOCwgY21wOCk7Ci0gICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJmluWzBdLCBpbjApOwotICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZpbls4XSwgaW44KTsKLSAgICBvdXQwID0gX21tX2FuZF9zaTEyOChvdXQwLCBjbXAwKTsKLSAgICBvdXQ4ID0gX21tX2FuZF9zaTEyOChvdXQ4LCBjbXA4KTsKLSAgfQotCi0gIC8vIHppZ3phZyB0aGUgb3V0cHV0IGJlZm9yZSBzdG9yaW5nIGl0LgotICAvLwotICAvLyBUaGUgemlnemFnIHBhdHRlcm4gY2FuIGFsbW9zdCBiZSByZXByb2R1Y2VkIHdpdGggYSBzbWFsbCBzZXF1ZW5jZSBvZgotICAvLyBzaHVmZmxlcy4gQWZ0ZXIgaXQsIHdlIG9ubHkgbmVlZCB0byBzd2FwIHRoZSA3dGggKGVuZGluZyB1cCBpbiB0aGlyZAotICAvLyBwb3NpdGlvbiBpbnN0ZWFkIG9mIHR3ZWxmdGgpIGFuZCA4dGggdmFsdWVzLgotICB7Ci0gICAgX19tMTI4aSBvdXRaMCwgb3V0Wjg7Ci0gICAgb3V0WjAgPSBfbW1fc2h1ZmZsZWhpX2VwaTE2KG91dDAsICBfTU1fU0hVRkZMRSgyLCAxLCAzLCAwKSk7Ci0gICAgb3V0WjAgPSBfbW1fc2h1ZmZsZV9lcGkzMiAgKG91dFowLCBfTU1fU0hVRkZMRSgzLCAxLCAyLCAwKSk7Ci0gICAgb3V0WjAgPSBfbW1fc2h1ZmZsZWhpX2VwaTE2KG91dFowLCBfTU1fU0hVRkZMRSgzLCAxLCAwLCAyKSk7Ci0gICAgb3V0WjggPSBfbW1fc2h1ZmZsZWxvX2VwaTE2KG91dDgsICBfTU1fU0hVRkZMRSgzLCAwLCAyLCAxKSk7Ci0gICAgb3V0WjggPSBfbW1fc2h1ZmZsZV9lcGkzMiAgKG91dFo4LCBfTU1fU0hVRkZMRSgzLCAxLCAyLCAwKSk7Ci0gICAgb3V0WjggPSBfbW1fc2h1ZmZsZWxvX2VwaTE2KG91dFo4LCBfTU1fU0hVRkZMRSgxLCAzLCAyLCAwKSk7Ci0gICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJm91dFswXSwgb3V0WjApOwotICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbOF0sIG91dFo4KTsKLSAgICBwYWNrZWRfb3V0ID0gX21tX3BhY2tzX2VwaTE2KG91dFowLCBvdXRaOCk7Ci0gIH0KLSAgewotICAgIGNvbnN0IGludDE2X3Qgb3V0Wl8xMiA9IG91dFsxMl07Ci0gICAgY29uc3QgaW50MTZfdCBvdXRaXzMgPSBvdXRbM107Ci0gICAgb3V0WzNdID0gb3V0Wl8xMjsKLSAgICBvdXRbMTJdID0gb3V0Wl8zOwotICB9Ci0KLSAgLy8gZGV0ZWN0IGlmIGFsbCAnb3V0JyB2YWx1ZXMgYXJlIHplcm9lcyBvciBub3QKLSAgewotICAgIGludDMyX3QgdG1wWzRdOwotICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKXRtcCwgcGFja2VkX291dCk7Ci0gICAgaWYgKG4pIHsKLSAgICAgIHRtcFswXSAmPSB+MHhmZjsKLSAgICB9Ci0gICAgcmV0dXJuICh0bXBbM10gfHwgdG1wWzJdIHx8IHRtcFsxXSB8fCB0bXBbMF0pOwotICB9Ci19Ci0KLSNlbmRpZiAgIC8vIFdFQlBfVVNFX1NTRTIKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEVudHJ5IHBvaW50Ci0KLWV4dGVybiB2b2lkIFZQOEVuY0RzcEluaXRTU0UyKHZvaWQpOwotCi12b2lkIFZQOEVuY0RzcEluaXRTU0UyKHZvaWQpIHsKLSNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTIpCi0gIFZQOENvbGxlY3RIaXN0b2dyYW0gPSBDb2xsZWN0SGlzdG9ncmFtU1NFMjsKLSAgVlA4RW5jUXVhbnRpemVCbG9jayA9IFF1YW50aXplQmxvY2tTU0UyOwotICBWUDhJVHJhbnNmb3JtID0gSVRyYW5zZm9ybVNTRTI7Ci0gIFZQOEZUcmFuc2Zvcm0gPSBGVHJhbnNmb3JtU1NFMjsKLSAgVlA4RlRyYW5zZm9ybVdIVCA9IEZUcmFuc2Zvcm1XSFRTU0UyOwotICBWUDhTU0UxNngxNiA9IFNTRTE2eDE2U1NFMjsKLSAgVlA4U1NFMTZ4OCA9IFNTRTE2eDhTU0UyOwotICBWUDhTU0U4eDggPSBTU0U4eDhTU0UyOwotICBWUDhTU0U0eDQgPSBTU0U0eDRTU0UyOwotICBWUDhURGlzdG80eDQgPSBEaXN0bzR4NFNTRTI7Ci0gIFZQOFREaXN0bzE2eDE2ID0gRGlzdG8xNngxNlNTRTI7Ci0jZW5kaWYgICAvLyBXRUJQX1VTRV9TU0UyCi19Ci0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL2xvc3NsZXNzLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kc3AvbG9zc2xlc3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdmNmEyNi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kc3AvbG9zc2xlc3MuYworKysgL2Rldi9udWxsCkBAIC0xLDEzOTMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIEltYWdlIHRyYW5zZm9ybXMgYW5kIGNvbG9yIHNwYWNlIGNvbnZlcnNpb24gbWV0aG9kcyBmb3IgbG9zc2xlc3MgZGVjb2Rlci4KLS8vCi0vLyBBdXRob3JzOiBWaWthcyBBcm9yYSAodmlrYWFzLmFyb3JhQGdtYWlsLmNvbSkKLS8vICAgICAgICAgIEp5cmtpIEFsYWt1aWphbGEgKGp5cmtpQGdvb2dsZS5jb20pCi0vLyAgICAgICAgICBVcnZhbmcgSm9zaGkgKHVydmFuZ0Bnb29nbGUuY29tKQotCi0jaW5jbHVkZSAiLi9kc3AuaCIKLQotLy8gRGVmaW5lIHRoZSBmb2xsb3dpbmcgaWYgdGFyZ2V0IGFyY2ggaXMgc3VyZSB0byBoYXZlIFNTRTIKLS8vICNkZWZpbmUgV0VCUF9UQVJHRVRfSEFTX1NTRTIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFdFQlBfVEFSR0VUX0hBU19TU0UyKQotI2luY2x1ZGUgPGVtbWludHJpbi5oPgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdGRsaWJfcG9lbS5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jZWxzZQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgIi4vbG9zc2xlc3MuaCIKLSNpbmNsdWRlICIuLi9kZWMvdnA4bGkuaCIKLSNpbmNsdWRlICIuL3l1di5oIgotCi0jZGVmaW5lIE1BWF9ESUZGX0NPU1QgKDFlMzBmKQotCi0vLyBsb29rdXAgdGFibGUgZm9yIHNtYWxsIHZhbHVlcyBvZiBsb2cyKGludCkKLSNkZWZpbmUgQVBQUk9YX0xPR19NQVggIDQwOTYKLSNkZWZpbmUgTE9HXzJfUkVDSVBST0NBTCAxLjQ0MjY5NTA0MDg4ODk2MzM4NzAwNDY1MDk0MDA3MDg2Ci1jb25zdCBmbG9hdCBrTG9nMlRhYmxlW0xPR19MT09LVVBfSURYX01BWF0gPSB7Ci0gIDAuMDAwMDAwMDAwMDAwMDAwMGYsIDAuMDAwMDAwMDAwMDAwMDAwMGYsCi0gIDEuMDAwMDAwMDAwMDAwMDAwMGYsIDEuNTg0OTYyNTAwNzIxMTU2MGYsCi0gIDIuMDAwMDAwMDAwMDAwMDAwMGYsIDIuMzIxOTI4MDk0ODg3MzYyMWYsCi0gIDIuNTg0OTYyNTAwNzIxMTU2MGYsIDIuODA3MzU0OTIyMDU3NjA0MWYsCi0gIDMuMDAwMDAwMDAwMDAwMDAwMGYsIDMuMTY5OTI1MDAxNDQyMzEyMWYsCi0gIDMuMzIxOTI4MDk0ODg3MzYyMWYsIDMuNDU5NDMxNjE4NjM3Mjk3M2YsCi0gIDMuNTg0OTYyNTAwNzIxMTU2MGYsIDMuNzAwNDM5NzE4MTQxMDkyMWYsCi0gIDMuODA3MzU0OTIyMDU3NjA0MWYsIDMuOTA2ODkwNTk1NjA4NTE4N2YsCi0gIDQuMDAwMDAwMDAwMDAwMDAwMGYsIDQuMDg3NDYyODQxMjUwMzM5MGYsCi0gIDQuMTY5OTI1MDAxNDQyMzEyMWYsIDQuMjQ3OTI3NTEzNDQzNTg1MmYsCi0gIDQuMzIxOTI4MDk0ODg3MzYyNmYsIDQuMzkyMzE3NDIyNzc4NzYwNmYsCi0gIDQuNDU5NDMxNjE4NjM3Mjk3M2YsIDQuNTIzNTYxOTU2MDU3MDEzMGYsCi0gIDQuNTg0OTYyNTAwNzIxMTU2MGYsIDQuNjQzODU2MTg5Nzc0NzI0M2YsCi0gIDQuNzAwNDM5NzE4MTQxMDkxN2YsIDQuNzU0ODg3NTAyMTYzNDY4MmYsCi0gIDQuODA3MzU0OTIyMDU3NjAzN2YsIDQuODU3OTgwOTk1MTI3NTcxOGYsCi0gIDQuOTA2ODkwNTk1NjA4NTE4N2YsIDQuOTU0MTk2MzEwMzg2ODc0OWYsCi0gIDUuMDAwMDAwMDAwMDAwMDAwMGYsIDUuMDQ0Mzk0MTE5MzU4NDUzM2YsCi0gIDUuMDg3NDYyODQxMjUwMzM5MGYsIDUuMTI5MjgzMDE2OTQ0OTY2M2YsCi0gIDUuMTY5OTI1MDAxNDQyMzEyMWYsIDUuMjA5NDUzMzY1NjI4OTUwMWYsCi0gIDUuMjQ3OTI3NTEzNDQzNTg1MmYsIDUuMjg1NDAyMjE4ODYyMjQ4N2YsCi0gIDUuMzIxOTI4MDk0ODg3MzYyNmYsIDUuMzU3NTUyMDA0NjE4MDgzN2YsCi0gIDUuMzkyMzE3NDIyNzc4NzYwNmYsIDUuNDI2MjY0NzU0NzAyMDk3OWYsCi0gIDUuNDU5NDMxNjE4NjM3Mjk3M2YsIDUuNDkxODUzMDk2MzI5Njc0N2YsCi0gIDUuNTIzNTYxOTU2MDU3MDEzMGYsIDUuNTU0NTg4ODUxNjc3NjM3NmYsCi0gIDUuNTg0OTYyNTAwNzIxMTU2MGYsIDUuNjE0NzA5ODQ0MTE1MjA4M2YsCi0gIDUuNjQzODU2MTg5Nzc0NzI0M2YsIDUuNjcyNDI1MzQxOTcxNDk1MWYsCi0gIDUuNzAwNDM5NzE4MTQxMDkxN2YsIDUuNzI3OTIwNDU0NTYzMTk4N2YsCi0gIDUuNzU0ODg3NTAyMTYzNDY4MmYsIDUuNzgxMzU5NzEzNTI0NjU5OWYsCi0gIDUuODA3MzU0OTIyMDU3NjAzN2YsIDUuODMyODkwMDE0MTY0NzQxMmYsCi0gIDUuODU3OTgwOTk1MTI3NTcxOGYsIDUuODgyNjQzMDQ5MzYxODQxNWYsCi0gIDUuOTA2ODkwNTk1NjA4NTE4N2YsIDUuOTMwNzM3MzM3NTYyODg2NmYsCi0gIDUuOTU0MTk2MzEwMzg2ODc0OWYsIDUuOTc3Mjc5OTIzNDk5OTE2N2YsCi0gIDYuMDAwMDAwMDAwMDAwMDAwMGYsIDYuMDIyMzY3ODEzMDI4NDU0M2YsCi0gIDYuMDQ0Mzk0MTE5MzU4NDUzM2YsIDYuMDY2MDg5MTkwNDU3NzcyMGYsCi0gIDYuMDg3NDYyODQxMjUwMzM5MGYsIDYuMTA4NTI0NDU2Nzc4MTY5MWYsCi0gIDYuMTI5MjgzMDE2OTQ0OTY2M2YsIDYuMTQ5NzQ3MTE5NTA0NjgyMmYsCi0gIDYuMTY5OTI1MDAxNDQyMzEyMWYsIDYuMTg5ODI0NTU4ODgwMDE3NWYsCi0gIDYuMjA5NDUzMzY1NjI4OTUwMWYsIDYuMjI4ODE4NjkwNDk1ODgwNGYsCi0gIDYuMjQ3OTI3NTEzNDQzNTg1MmYsIDYuMjY2Nzg2NTQwNjk0OTAxMGYsCi0gIDYuMjg1NDAyMjE4ODYyMjQ4N2YsIDYuMzAzNzgwNzQ4MTc3MTAzMGYsCi0gIDYuMzIxOTI4MDk0ODg3MzYyNmYsIDYuMzM5ODUwMDAyODg0NjI0M2YsCi0gIDYuMzU3NTUyMDA0NjE4MDgzN2YsIDYuMzc1MDM5NDMxMzQ2OTI0NWYsCi0gIDYuMzkyMzE3NDIyNzc4NzYwNmYsIDYuNDA5MzkwOTM2MTM3NzAxN2YsCi0gIDYuNDI2MjY0NzU0NzAyMDk3OWYsIDYuNDQyOTQzNDk1ODQ4NzI3OWYsCi0gIDYuNDU5NDMxNjE4NjM3Mjk3M2YsIDYuNDc1NzMzNDMwOTY2Mzk3NmYsCi0gIDYuNDkxODUzMDk2MzI5Njc0N2YsIDYuNTA3Nzk0NjQwMTk4Njk2M2YsCi0gIDYuNTIzNTYxOTU2MDU3MDEzMGYsIDYuNTM5MTU4ODExMTA4MDMwOWYsCi0gIDYuNTU0NTg4ODUxNjc3NjM3NmYsIDYuNTY5ODU1NjA4MzMwOTQ3OGYsCi0gIDYuNTg0OTYyNTAwNzIxMTU2MGYsIDYuNTk5OTEyODQyMTg3MTI3OGYsCi0gIDYuNjE0NzA5ODQ0MTE1MjA4M2YsIDYuNjI5MzU2NjIwMDc5NjA5NGYsCi0gIDYuNjQzODU2MTg5Nzc0NzI0M2YsIDYuNjU4MjExNDgyNzUxNzk0NmYsCi0gIDYuNjcyNDI1MzQxOTcxNDk1MWYsIDYuNjg2NTAwNTI3MTgzMjE4NWYsCi0gIDYuNzAwNDM5NzE4MTQxMDkxN2YsIDYuNzE0MjQ1NTE3NjY2MTIyNGYsCi0gIDYuNzI3OTIwNDU0NTYzMTk4N2YsIDYuNzQxNDY2OTg2NDAxMTQ2NGYsCi0gIDYuNzU0ODg3NTAyMTYzNDY4MmYsIDYuNzY4MTg0MzI0Nzc2OTI1OWYsCi0gIDYuNzgxMzU5NzEzNTI0NjU5OWYsIDYuNzk0NDE1ODY2MzUwMTA2MWYsCi0gIDYuODA3MzU0OTIyMDU3NjAzN2YsIDYuODIwMTc4OTYyNDE1MTg3OGYsCi0gIDYuODMyODkwMDE0MTY0NzQxMmYsIDYuODQ1NDkwMDUwOTQ0Mzc0N2YsCi0gIDYuODU3OTgwOTk1MTI3NTcxOGYsIDYuODcwMzY0NzE5NTgzNDA0N2YsCi0gIDYuODgyNjQzMDQ5MzYxODQxNWYsIDYuODk0ODE3NzYzMzA3OTQzN2YsCi0gIDYuOTA2ODkwNTk1NjA4NTE4N2YsIDYuOTE4ODYzMjM3Mjc0NTk0NmYsCi0gIDYuOTMwNzM3MzM3NTYyODg2NmYsIDYuOTQyNTE0NTA1MzM5MjM5OGYsCi0gIDYuOTU0MTk2MzEwMzg2ODc0OWYsIDYuOTY1Nzg0Mjg0NjYyMDg2OWYsCi0gIDYuOTc3Mjc5OTIzNDk5OTE2N2YsIDYuOTg4Njg0Njg2NzcyMTY1NGYsCi0gIDcuMDAwMDAwMDAwMDAwMDAwMGYsIDcuMDExMjI3MjU1NDIzMjUzOWYsCi0gIDcuMDIyMzY3ODEzMDI4NDU0M2YsIDcuMDMzNDIzMDAxNTM3NDUwMWYsCi0gIDcuMDQ0Mzk0MTE5MzU4NDUzM2YsIDcuMDU1MjgyNDM1NTAxMTg5OGYsCi0gIDcuMDY2MDg5MTkwNDU3NzcyMGYsIDcuMDc2ODE1NTk3MDUwODMwOGYsCi0gIDcuMDg3NDYyODQxMjUwMzM5MGYsIDcuMDk4MDMyMDgyOTYwNTI2M2YsCi0gIDcuMTA4NTI0NDU2Nzc4MTY5MWYsIDcuMTE4OTQxMDcyNzIzNTA3NmYsCi0gIDcuMTI5MjgzMDE2OTQ0OTY2M2YsIDcuMTM5NTUxMzUyMzk4NzkzNmYsCi0gIDcuMTQ5NzQ3MTE5NTA0NjgyMmYsIDcuMTU5ODcxMzM2Nzc4Mzg5MGYsCi0gIDcuMTY5OTI1MDAxNDQyMzEyMWYsIDcuMTc5OTA5MDkwMDE0OTM0NGYsCi0gIDcuMTg5ODI0NTU4ODgwMDE3NWYsIDcuMTk5NjcyMzQ0ODM2MzY0NGYsCi0gIDcuMjA5NDUzMzY1NjI4OTUwMWYsIDcuMjE5MTY4NTIwNDYyMTYxMWYsCi0gIDcuMjI4ODE4NjkwNDk1ODgwNGYsIDcuMjM4NDA0NzM5MzI1MDc4NWYsCi0gIDcuMjQ3OTI3NTEzNDQzNTg1MmYsIDcuMjU3Mzg3ODQyNjkyNjUyMWYsCi0gIDcuMjY2Nzg2NTQwNjk0OTAxMGYsIDcuMjc2MTI0NDA1Mjc0MjM3NWYsCi0gIDcuMjg1NDAyMjE4ODYyMjQ4N2YsIDcuMjk0NjIwNzQ4ODkxNjI3MGYsCi0gIDcuMzAzNzgwNzQ4MTc3MTAzMGYsIDcuMzEyODgyOTU1Mjg0MzU1N2YsCi0gIDcuMzIxOTI4MDk0ODg3MzYyNmYsIDcuMzMwOTE2ODc4MTE0NjE2N2YsCi0gIDcuMzM5ODUwMDAyODg0NjI0M2YsIDcuMzQ4NzI4MTU0MjMxMDc3MWYsCi0gIDcuMzU3NTUyMDA0NjE4MDgzN2YsIDcuMzY2MzIyMjE0MjQ1ODE2MGYsCi0gIDcuMzc1MDM5NDMxMzQ2OTI0NWYsIDcuMzgzNzA0MjkyNDc0MDUxOWYsCi0gIDcuMzkyMzE3NDIyNzc4NzYwNmYsIDcuNDAwODc5NDM2MjgyMTg0M2YsCi0gIDcuNDA5MzkwOTM2MTM3NzAxN2YsIDcuNDE3ODUyNTE0ODg1ODk4MmYsCi0gIDcuNDI2MjY0NzU0NzAyMDk3OWYsIDcuNDM0NjI4MjI3NjM2NzI0NWYsCi0gIDcuNDQyOTQzNDk1ODQ4NzI3OWYsIDcuNDUxMjExMTExODMyMzI4OWYsCi0gIDcuNDU5NDMxNjE4NjM3Mjk3M2YsIDcuNDY3NjA1NTUwMDgyOTk3NmYsCi0gIDcuNDc1NzMzNDMwOTY2Mzk3NmYsIDcuNDgzODE1Nzc3MjY0MjU2M2YsCi0gIDcuNDkxODUzMDk2MzI5Njc0N2YsIDcuNDk5ODQ1ODg3MDgzMjA1NmYsCi0gIDcuNTA3Nzk0NjQwMTk4Njk2M2YsIDcuNTE1Njk5ODM4Mjg0MDQyN2YsCi0gIDcuNTIzNTYxOTU2MDU3MDEzMGYsIDcuNTMxMzgxNDYwNTE2MzExOGYsCi0gIDcuNTM5MTU4ODExMTA4MDMwOWYsIDcuNTQ2ODk0NDU5ODg3NjM2NGYsCi0gIDcuNTU0NTg4ODUxNjc3NjM3NmYsIDcuNTYyMjQyNDI0MjIxMDcyOGYsCi0gIDcuNTY5ODU1NjA4MzMwOTQ3OGYsIDcuNTc3NDI4ODI4MDM1NzQ4NmYsCi0gIDcuNTg0OTYyNTAwNzIxMTU2MGYsIDcuNTkyNDU3MDM3MjY4MDgwNmYsCi0gIDcuNTk5OTEyODQyMTg3MTI3OGYsIDcuNjA3MzMwMzEzNzQ5NjEwNGYsCi0gIDcuNjE0NzA5ODQ0MTE1MjA4M2YsIDcuNjIyMDUxODE5NDU2Mzc2NGYsCi0gIDcuNjI5MzU2NjIwMDc5NjA5NGYsIDcuNjM2NjI0NjIwNTQzNjQ4N2YsCi0gIDcuNjQzODU2MTg5Nzc0NzI0M2YsIDcuNjUxMDUxNjkxMTc4OTI4MWYsCi0gIDcuNjU4MjExNDgyNzUxNzk0NmYsIDcuNjY1MzM1OTE3MTg1MTc2NGYsCi0gIDcuNjcyNDI1MzQxOTcxNDk1MWYsIDcuNjc5NDgwMDk5NTA1NDQ2NGYsCi0gIDcuNjg2NTAwNTI3MTgzMjE4NWYsIDcuNjkzNDg2OTU3NDk5MzI1MmYsCi0gIDcuNzAwNDM5NzE4MTQxMDkxN2YsIDcuNzA3MzU5MTMyMDgwODgyNWYsCi0gIDcuNzE0MjQ1NTE3NjY2MTIyNGYsIDcuNzIxMDk5MTg4NzA3MTg1NWYsCi0gIDcuNzI3OTIwNDU0NTYzMTk4N2YsIDcuNzM0NzA5NjIwMjI1ODM4M2YsCi0gIDcuNzQxNDY2OTg2NDAxMTQ2NGYsIDcuNzQ4MTkyODQ5NTg5NDYwNWYsCi0gIDcuNzU0ODg3NTAyMTYzNDY4MmYsIDcuNzYxNTUxMjMyNDQ0NDc5NWYsCi0gIDcuNzY4MTg0MzI0Nzc2OTI1OWYsIDcuNzc0Nzg3MDU5NjAxMTczNmYsCi0gIDcuNzgxMzU5NzEzNTI0NjU5OWYsIDcuNzg3OTAyNTU5MzkxNDMxN2YsCi0gIDcuNzk0NDE1ODY2MzUwMTA2MWYsIDcuODAwODk5ODk5OTIwMzA0N2YsCi0gIDcuODA3MzU0OTIyMDU3NjAzN2YsIDcuODEzNzgxMTkxMjE3MDM3NGYsCi0gIDcuODIwMTc4OTYyNDE1MTg3OGYsIDcuODI2NTQ4NDg3MjkwOTE1MGYsCi0gIDcuODMyODkwMDE0MTY0NzQxMmYsIDcuODM5MjAzNzg4MDk2OTQzNmYsCi0gIDcuODQ1NDkwMDUwOTQ0Mzc0N2YsIDcuODUxNzQ5MDQxNDE2MDU3MWYsCi0gIDcuODU3OTgwOTk1MTI3NTcxOGYsIDcuODY0MTg2MTQ0NjU0Mjc5N2YsCi0gIDcuODcwMzY0NzE5NTgzNDA0N2YsIDcuODc2NTE2OTQ2NTY0OTk5M2YsCi0gIDcuODgyNjQzMDQ5MzYxODQxNWYsIDcuODg4NzQzMjQ4ODk4MjU5MWYsCi0gIDcuODk0ODE3NzYzMzA3OTQzN2YsIDcuOTAwODY2ODA3OTgwNzQ4NmYsCi0gIDcuOTA2ODkwNTk1NjA4NTE4N2YsIDcuOTEyODg5MzM2MjI5OTYxOWYsCi0gIDcuOTE4ODYzMjM3Mjc0NTk0NmYsIDcuOTI0ODEyNTAzNjA1NzgxMmYsCi0gIDcuOTMwNzM3MzM3NTYyODg2NmYsIDcuOTM2NjM3OTM5MDAyNTcwOWYsCi0gIDcuOTQyNTE0NTA1MzM5MjM5OGYsIDcuOTQ4MzY3MjMxNTg0Njc3OGYsCi0gIDcuOTU0MTk2MzEwMzg2ODc0OWYsIDcuOTYwMDAxOTMyMDY4MDgwNWYsCi0gIDcuOTY1Nzg0Mjg0NjYyMDg2OWYsIDcuOTcxNTQzNTUzOTUwNzcxOWYsCi0gIDcuOTc3Mjc5OTIzNDk5OTE2N2YsIDcuOTgyOTkzNTc0Njk0MzEwM2YsCi0gIDcuOTg4Njg0Njg2NzcyMTY1NGYsIDcuOTk0MzUzNDM2ODU4ODU3N2YKLX07Ci0KLWNvbnN0IGZsb2F0IGtTTG9nMlRhYmxlW0xPR19MT09LVVBfSURYX01BWF0gPSB7Ci0gIDAuMDAwMDAwMDBmLCAgICAwLjAwMDAwMDAwZiwgIDIuMDAwMDAwMDBmLCAgIDQuNzU0ODg3NTBmLAotICA4LjAwMDAwMDAwZiwgICAxMS42MDk2NDA0N2YsICAxNS41MDk3NzUwMGYsICAxOS42NTE0ODQ0NWYsCi0gIDI0LjAwMDAwMDAwZiwgIDI4LjUyOTMyNTAxZiwgIDMzLjIxOTI4MDk1ZiwgIDM4LjA1Mzc0NzgxZiwKLSAgNDMuMDE5NTUwMDFmLCAgNDguMTA1NzE2MzRmLCAgNTMuMzAyOTY4OTFmLCAgNTguNjAzMzU4OTNmLAotICA2NC4wMDAwMDAwMGYsICA2OS40ODY4NjgzMGYsICA3NS4wNTg2NTAwM2YsICA4MC43MTA2MjI3NmYsCi0gIDg2LjQzODU2MTkwZiwgIDkyLjIzODY2NTg4ZiwgIDk4LjEwNzQ5NTYxZiwgIDEwNC4wNDE5MjQ5OWYsCi0gIDExMC4wMzkxMDAwMmYsIDExNi4wOTY0MDQ3NGYsIDEyMi4yMTE0MzI2N2YsIDEyOC4zODE5NjI1NmYsCi0gIDEzNC42MDU5Mzc4MmYsIDE0MC44ODE0NDg4NmYsIDE0Ny4yMDY3MTc4N2YsIDE1My41ODAwODU2MmYsCi0gIDE2MC4wMDAwMDAwMGYsIDE2Ni40NjUwMDU5NGYsIDE3Mi45NzM3MzY2MGYsIDE3OS41MjQ5MDU1OWYsCi0gIDE4Ni4xMTczMDAwNWYsIDE5Mi43NDk3NzQ1M2YsIDE5OS40MjEyNDU1MWYsIDIwNi4xMzA2ODY1NGYsCi0gIDIxMi44NzcxMjM4MGYsIDIxOS42NTk2MzIxOWYsIDIyNi40NzczMzE3NmYsIDIzMy4zMjkzODQ0NWYsCi0gIDI0MC4yMTQ5OTEyMmYsIDI0Ny4xMzMzODkzM2YsIDI1NC4wODM4NDk5OGYsIDI2MS4wNjU2NzYwM2YsCi0gIDI2OC4wNzgyMDAwM2YsIDI3NS4xMjA3ODIzNmYsIDI4Mi4xOTI4MDk0OWYsIDI4OS4yOTM2OTI0NGYsCi0gIDI5Ni40MjI4NjUzNGYsIDMwMy41Nzk3ODQwOWYsIDMxMC43NjM5MjUxMmYsIDMxNy45NzQ3ODQyNGYsCi0gIDMyNS4yMTE4NzU2NGYsIDMzMi40NzQ3MzA4MWYsIDMzOS43NjI4OTc3MmYsIDM0Ny4wNzU5Mzk5MWYsCi0gIDM1NC40MTM0MzU3NGYsIDM2MS43NzQ5Nzc1OWYsIDM2OS4xNjAxNzEyNGYsIDM3Ni41Njg2MzUxOGYsCi0gIDM4NC4wMDAwMDAwMGYsIDM5MS40NTM5MDc4NWYsIDM5OC45MzAwMTE4OGYsIDQwNi40Mjc5NzU3NmYsCi0gIDQxMy45NDc0NzMyMWYsIDQyMS40ODgxODc1MmYsIDQyOS4wNDk4MTExOWYsIDQzNi42MzIwNDU0OGYsCi0gIDQ0NC4yMzQ2MDAxMGYsIDQ1MS44NTcxOTI4MGYsIDQ1OS40OTk1NDkwNmYsIDQ2Ny4xNjE0MDE3OWYsCi0gIDQ3NC44NDI0OTEwMmYsIDQ4Mi41NDI1NjM2M2YsIDQ5MC4yNjEzNzMwN2YsIDQ5Ny45OTg2NzkxMWYsCi0gIDUwNS43NTQyNDc1OWYsIDUxMy41Mjc4NTAyM2YsIDUyMS4zMTkyNjQzOGYsIDUyOS4xMjgyNzI4MGYsCi0gIDUzNi45NTQ2NjM1MWYsIDU0NC43OTgyMjk1N2YsIDU1Mi42NTg3Njg5MGYsIDU2MC41MzYwODQxNGYsCi0gIDU2OC40Mjk5ODI0NGYsIDU3Ni4zNDAyNzUzNmYsIDU4NC4yNjY3Nzg2N2YsIDU5Mi4yMDkzMTIyNmYsCi0gIDYwMC4xNjc2OTk5NmYsIDYwOC4xNDE3Njk0M2YsIDYxNi4xMzEzNTIwNmYsIDYyNC4xMzYyODI3OWYsCi0gIDYzMi4xNTY0MDAwN2YsIDY0MC4xOTE1NDU2OWYsIDY0OC4yNDE1NjQ3MmYsIDY1Ni4zMDYzMDUzOWYsCi0gIDY2NC4zODU2MTg5OGYsIDY3Mi40NzkzNTk3NmYsIDY4MC41ODczODQ4OGYsIDY4OC43MDk1NTQzMGYsCi0gIDY5Ni44NDU3MzA2OWYsIDcwNC45OTU3NzkzNWYsIDcxMy4xNTk1NjgxOGYsIDcyMS4zMzY5Njc1NGYsCi0gIDcyOS41Mjc4NTAyM2YsIDczNy43MzIwOTE0MGYsIDc0NS45NDk1Njg0OWYsIDc1NC4xODAxNjExNmYsCi0gIDc2Mi40MjM3NTEyN2YsIDc3MC42ODAyMjI3NWYsIDc3OC45NDk0NjE2MWYsIDc4Ny4yMzEzNTU4NmYsCi0gIDc5NS41MjU3OTU0M2YsIDgwMy44MzI2NzIxOWYsIDgxMi4xNTE4Nzk4MmYsIDgyMC40ODMzMTM4M2YsCi0gIDgyOC44MjY4NzE0N2YsIDgzNy4xODI0NTE3MWYsIDg0NS41NDk5NTUxOGYsIDg1My45MjkyODQxNmYsCi0gIDg2Mi4zMjAzNDI0OWYsIDg3MC43MjMwMzU1OGYsIDg3OS4xMzcyNzAzNmYsIDg4Ny41NjI5NTUyMmYsCi0gIDg5Ni4wMDAwMDAwMGYsIDkwNC40NDgzMTU5NWYsIDkxMi45MDc4MTU2OWYsIDkyMS4zNzg0MTMyMGYsCi0gIDkyOS44NjAwMjM3NmYsIDkzOC4zNTI1NjM5MmYsIDk0Ni44NTU5NTE1MmYsIDk1NS4zNzAxMDU2MGYsCi0gIDk2My44OTQ5NDY0MWYsIDk3Mi40MzAzOTUzN2YsIDk4MC45NzYzNzUwNGYsIDk4OS41MzI4MDkxMWYsCi0gIDk5OC4wOTk2MjIzN2YsIDEwMDYuNjc2NzQwNjlmLCAxMDE1LjI2NDA5MDk3ZiwgMTAyMy44NjE2MDExNmYsCi0gIDEwMzIuNDY5MjAwMjFmLCAxMDQxLjA4NjgxODA1ZiwgMTA0OS43MTQzODU2MGYsIDEwNTguMzUxODM0NjlmLAotICAxMDY2Ljk5OTA5ODExZiwgMTA3NS42NTYxMDk1NWYsIDEwODQuMzIyODAzNTdmLCAxMDkyLjk5OTExNTY0ZiwKLSAgMTEwMS42ODQ5ODIwNGYsIDExMTAuMzgwMzM5OTNmLCAxMTE5LjA4NTEyNzI3ZiwgMTEyNy43OTkyODI4MmYsCi0gIDExMzYuNTIyNzQ2MTRmLCAxMTQ1LjI1NTQ1NzU4ZiwgMTE1My45OTczNTgyMWYsIDExNjIuNzQ4Mzg5ODlmLAotICAxMTcxLjUwODQ5NTE4ZiwgMTE4MC4yNzc2MTczOGYsIDExODkuMDU1NzAwNDdmLCAxMTk3Ljg0MjY4OTE0ZiwKLSAgMTIwNi42Mzg1Mjg3NmYsIDEyMTUuNDQzMTY1MzVmLCAxMjI0LjI1NjU0NTYwZiwgMTIzMy4wNzg2MTY4NGYsCi0gIDEyNDEuOTA5MzI3MDNmLCAxMjUwLjc0ODYyNDczZiwgMTI1OS41OTY0NTkxNGYsIDEyNjguNDUyNzgwMDVmLAotICAxMjc3LjMxNzUzNzgxZiwgMTI4Ni4xOTA2ODMzOGYsIDEyOTUuMDcyMTY4MjhmLCAxMzAzLjk2MTk0NDU3ZiwKLSAgMTMxMi44NTk5NjQ4OGYsIDEzMjEuNzY2MTgyMzZmLCAxMzMwLjY4MDU1MDcxZiwgMTMzOS42MDMwMjQxM2YsCi0gIDEzNDguNTMzNTU3MzRmLCAxMzU3LjQ3MjEwNTU2ZiwgMTM2Ni40MTg2MjQ1MmYsIDEzNzUuMzczMDcwNDFmLAotICAxMzg0LjMzNTM5OTkxZiwgMTM5My4zMDU1NzAyMGYsIDE0MDIuMjgzNTM4ODdmLCAxNDExLjI2OTI2NDAwZiwKLSAgMTQyMC4yNjI3MDQxMmYsIDE0MjkuMjYzODE4MThmLCAxNDM4LjI3MjU2NTU4ZiwgMTQ0Ny4yODg5MDYxNWYsCi0gIDE0NTYuMzEyODAwMTRmLCAxNDY1LjM0NDIwODE5ZiwgMTQ3NC4zODMwOTEzOGYsIDE0ODMuNDI5NDExMThmLAotICAxNDkyLjQ4MzEyOTQ1ZiwgMTUwMS41NDQyMDg0M2YsIDE1MTAuNjEyNjEwNzhmLCAxNTE5LjY4ODI5OTQ5ZiwKLSAgMTUyOC43NzEyMzc5NWYsIDE1MzcuODYxMzg5OTNmLCAxNTQ2Ljk1ODcxOTUyZiwgMTU1Ni4wNjMxOTExOWYsCi0gIDE1NjUuMTc0NzY5NzZmLCAxNTc0LjI5MzQyMDQwZiwgMTU4My40MTkxMDg2MGYsIDE1OTIuNTUxODAwMjBmLAotICAxNjAxLjY5MTQ2MTM3ZiwgMTYxMC44MzgwNTg2MGYsIDE2MTkuOTkxNTU4NzFmLCAxNjI5LjE1MTkyODgyZiwKLSAgMTYzOC4zMTkxMzYzN2YsIDE2NDcuNDkzMTQ5MTFmLCAxNjU2LjY3MzkzNTA5ZiwgMTY2NS44NjE0NjI2NmYsCi0gIDE2NzUuMDU1NzAwNDdmLCAxNjg0LjI1NjYxNzQ0ZiwgMTY5My40NjQxODI4MGYsIDE3MDIuNjc4MzY2MDVmLAotICAxNzExLjg5OTEzNjk4ZiwgMTcyMS4xMjY0NjU2M2YsIDE3MzAuMzYwMzIyMzNmLCAxNzM5LjYwMDY3NzY4ZiwKLSAgMTc0OC44NDc1MDI1NGYsIDE3NTguMTAwNzY4MDJmLCAxNzY3LjM2MDQ0NTUxZiwgMTc3Ni42MjY1MDY2MmYsCi0gIDE3ODUuODk4OTIzMjNmLCAxNzk1LjE3NzY2NzQ3ZiwgMTgwNC40NjI3MTE3MmYsIDE4MTMuNzU0MDI4NTdmLAotICAxODIzLjA1MTU5MDg3ZiwgMTgzMi4zNTUzNzE3MGYsIDE4NDEuNjY1MzQ0MzhmLCAxODUwLjk4MTQ4MjQ0ZiwKLSAgMTg2MC4zMDM3NTk2NWYsIDE4NjkuNjMyMTQ5OTlmLCAxODc4Ljk2NjYyNzY3ZiwgMTg4OC4zMDcxNjcxMWYsCi0gIDE4OTcuNjUzNzQyOTVmLCAxOTA3LjAwNjMzMDAzZiwgMTkxNi4zNjQ5MDM0MmYsIDE5MjUuNzI5NDM4MzhmLAotICAxOTM1LjA5OTkxMDM3ZiwgMTk0NC40NzYyOTUwNmYsIDE5NTMuODU4NTY4MzFmLCAxOTYzLjI0NjcwNjIwZiwKLSAgMTk3Mi42NDA2ODQ5OGYsIDE5ODIuMDQwNDgxMDhmLCAxOTkxLjQ0NjA3MTE3ZiwgMjAwMC44NTc0MzIwNGYsCi0gIDIwMTAuMjc0NTQwNzJmLCAyMDE5LjY5NzM3NDQwZiwgMjAyOS4xMjU5MTA0NGYsIDIwMzguNTYwMTI2NDBmCi19OwotCi1mbG9hdCBWUDhMRmFzdFNMb2cyU2xvdyhpbnQgdikgewotICBTQl9EQ0hFQ0sodiA+PSBMT0dfTE9PS1VQX0lEWF9NQVgpOwotICBpZiAodiA8IEFQUFJPWF9MT0dfTUFYKSB7Ci0gICAgaW50IGxvZ19jbnQgPSAwOwotICAgIGNvbnN0IGZsb2F0IHZfZiA9IChmbG9hdCl2OwotICAgIHdoaWxlICh2ID49IExPR19MT09LVVBfSURYX01BWCkgewotICAgICAgKytsb2dfY250OwotICAgICAgdiA9IHYgPj4gMTsKLSAgICB9Ci0gICAgcmV0dXJuIHZfZiAqIChrTG9nMlRhYmxlW3ZdICsgbG9nX2NudCk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIChmbG9hdCkoTE9HXzJfUkVDSVBST0NBTCAqIHYgKiBsb2coKGRvdWJsZSl2KSk7Ci0gIH0KLX0KLQotZmxvYXQgVlA4TEZhc3RMb2cyU2xvdyhpbnQgdikgewotICBTQl9EQ0hFQ0sodiA+PSBMT0dfTE9PS1VQX0lEWF9NQVgpOwotICBpZiAodiA8IEFQUFJPWF9MT0dfTUFYKSB7Ci0gICAgaW50IGxvZ19jbnQgPSAwOwotICAgIHdoaWxlICh2ID49IExPR19MT09LVVBfSURYX01BWCkgewotICAgICAgKytsb2dfY250OwotICAgICAgdiA9IHYgPj4gMTsKLSAgICB9Ci0gICAgcmV0dXJuIGtMb2cyVGFibGVbdl0gKyBsb2dfY250OwotICB9IGVsc2UgewotICAgIHJldHVybiAoZmxvYXQpKExPR18yX1JFQ0lQUk9DQUwgKiBsb2coKGRvdWJsZSl2KSk7Ci0gIH0KLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEltYWdlIHRyYW5zZm9ybXMuCi0KLS8vIEluLXBsYWNlIHN1bSBvZiBlYWNoIGNvbXBvbmVudCB3aXRoIG1vZCAyNTYuCi1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBBZGRQaXhlbHNFcSh1aW50MzJfdCogYSwgdWludDMyX3QgYikgewotICBjb25zdCB1aW50MzJfdCBhbHBoYV9hbmRfZ3JlZW4gPSAoKmEgJiAweGZmMDBmZjAwdSkgKyAoYiAmIDB4ZmYwMGZmMDB1KTsKLSAgY29uc3QgdWludDMyX3QgcmVkX2FuZF9ibHVlID0gKCphICYgMHgwMGZmMDBmZnUpICsgKGIgJiAweDAwZmYwMGZmdSk7Ci0gICphID0gKGFscGhhX2FuZF9ncmVlbiAmIDB4ZmYwMGZmMDB1KSB8IChyZWRfYW5kX2JsdWUgJiAweDAwZmYwMGZmdSk7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBBdmVyYWdlMih1aW50MzJfdCBhMCwgdWludDMyX3QgYTEpIHsKLSAgcmV0dXJuICgoKGEwIF4gYTEpICYgMHhmZWZlZmVmZUwpID4+IDEpICsgKGEwICYgYTEpOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQXZlcmFnZTModWludDMyX3QgYTAsIHVpbnQzMl90IGExLCB1aW50MzJfdCBhMikgewotICByZXR1cm4gQXZlcmFnZTIoQXZlcmFnZTIoYTAsIGEyKSwgYTEpOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQXZlcmFnZTQodWludDMyX3QgYTAsIHVpbnQzMl90IGExLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGEyLCB1aW50MzJfdCBhMykgewotICByZXR1cm4gQXZlcmFnZTIoQXZlcmFnZTIoYTAsIGExKSwgQXZlcmFnZTIoYTIsIGEzKSk7Ci19Ci0KLSNpZiBkZWZpbmVkKFdFQlBfVEFSR0VUX0hBU19TU0UyKQotc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IENsYW1wZWRBZGRTdWJ0cmFjdEZ1bGwodWludDMyX3QgYzAsIHVpbnQzMl90IGMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYzIpIHsKLSAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKLSAgY29uc3QgX19tMTI4aSBDMCA9IF9tbV91bnBhY2tsb19lcGk4KF9tbV9jdnRzaTMyX3NpMTI4KGMwKSwgemVybyk7Ci0gIGNvbnN0IF9fbTEyOGkgQzEgPSBfbW1fdW5wYWNrbG9fZXBpOChfbW1fY3Z0c2kzMl9zaTEyOChjMSksIHplcm8pOwotICBjb25zdCBfX20xMjhpIEMyID0gX21tX3VucGFja2xvX2VwaTgoX21tX2N2dHNpMzJfc2kxMjgoYzIpLCB6ZXJvKTsKLSAgY29uc3QgX19tMTI4aSBWMSA9IF9tbV9hZGRfZXBpMTYoQzAsIEMxKTsKLSAgY29uc3QgX19tMTI4aSBWMiA9IF9tbV9zdWJfZXBpMTYoVjEsIEMyKTsKLSAgY29uc3QgX19tMTI4aSBiID0gX21tX3BhY2t1c19lcGkxNihWMiwgVjIpOwotICBjb25zdCB1aW50MzJfdCBvdXRwdXQgPSBfbW1fY3Z0c2kxMjhfc2kzMihiKTsKLSAgcmV0dXJuIG91dHB1dDsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IENsYW1wZWRBZGRTdWJ0cmFjdEhhbGYodWludDMyX3QgYzAsIHVpbnQzMl90IGMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYzIpIHsKLSAgY29uc3QgdWludDMyX3QgYXZlID0gQXZlcmFnZTIoYzAsIGMxKTsKLSAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKLSAgY29uc3QgX19tMTI4aSBBMCA9IF9tbV91bnBhY2tsb19lcGk4KF9tbV9jdnRzaTMyX3NpMTI4KGF2ZSksIHplcm8pOwotICBjb25zdCBfX20xMjhpIEIwID0gX21tX3VucGFja2xvX2VwaTgoX21tX2N2dHNpMzJfc2kxMjgoYzIpLCB6ZXJvKTsKLSAgY29uc3QgX19tMTI4aSBBMSA9IF9tbV9zdWJfZXBpMTYoQTAsIEIwKTsKLSAgY29uc3QgX19tMTI4aSBCZ3RBID0gX21tX2NtcGd0X2VwaTE2KEIwLCBBMCk7Ci0gIGNvbnN0IF9fbTEyOGkgQTIgPSBfbW1fc3ViX2VwaTE2KEExLCBCZ3RBKTsKLSAgY29uc3QgX19tMTI4aSBBMyA9IF9tbV9zcmFpX2VwaTE2KEEyLCAxKTsKLSAgY29uc3QgX19tMTI4aSBBNCA9IF9tbV9hZGRfZXBpMTYoQTAsIEEzKTsKLSAgY29uc3QgX19tMTI4aSBBNSA9IF9tbV9wYWNrdXNfZXBpMTYoQTQsIEE0KTsKLSAgY29uc3QgdWludDMyX3Qgb3V0cHV0ID0gX21tX2N2dHNpMTI4X3NpMzIoQTUpOwotICByZXR1cm4gb3V0cHV0OwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgU2VsZWN0KHVpbnQzMl90IGEsIHVpbnQzMl90IGIsIHVpbnQzMl90IGMpIHsKLSAgaW50IHBhX21pbnVzX3BiOwotICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOwotICBjb25zdCBfX20xMjhpIEEwID0gX21tX2N2dHNpMzJfc2kxMjgoYSk7Ci0gIGNvbnN0IF9fbTEyOGkgQjAgPSBfbW1fY3Z0c2kzMl9zaTEyOChiKTsKLSAgY29uc3QgX19tMTI4aSBDMCA9IF9tbV9jdnRzaTMyX3NpMTI4KGMpOwotICBjb25zdCBfX20xMjhpIEFDMCA9IF9tbV9zdWJzX2VwdTgoQTAsIEMwKTsKLSAgY29uc3QgX19tMTI4aSBDQTAgPSBfbW1fc3Vic19lcHU4KEMwLCBBMCk7Ci0gIGNvbnN0IF9fbTEyOGkgQkMwID0gX21tX3N1YnNfZXB1OChCMCwgQzApOwotICBjb25zdCBfX20xMjhpIENCMCA9IF9tbV9zdWJzX2VwdTgoQzAsIEIwKTsKLSAgY29uc3QgX19tMTI4aSBBQyA9IF9tbV9vcl9zaTEyOChBQzAsIENBMCk7Ci0gIGNvbnN0IF9fbTEyOGkgQkMgPSBfbW1fb3Jfc2kxMjgoQkMwLCBDQjApOwotICBjb25zdCBfX20xMjhpIHBhID0gX21tX3VucGFja2xvX2VwaTgoQUMsIHplcm8pOyAgLy8gfGEgLSBjfAotICBjb25zdCBfX20xMjhpIHBiID0gX21tX3VucGFja2xvX2VwaTgoQkMsIHplcm8pOyAgLy8gfGIgLSBjfAotICBjb25zdCBfX20xMjhpIGRpZmYgPSBfbW1fc3ViX2VwaTE2KHBiLCBwYSk7Ci0gIHsKLSAgICBpbnQxNl90IG91dFs4XTsKLSAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKilvdXQsIGRpZmYpOwotICAgIHBhX21pbnVzX3BiID0gb3V0WzBdICsgb3V0WzFdICsgb3V0WzJdICsgb3V0WzNdOwotICB9Ci0gIHJldHVybiAocGFfbWludXNfcGIgPD0gMCkgPyBhIDogYjsKLX0KLQotI2Vsc2UKLQotc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IENsaXAyNTUodWludDMyX3QgYSkgewotICBpZiAoYSA8IDI1NikgewotICAgIHJldHVybiBhOwotICB9Ci0gIC8vIHJldHVybiAwLCB3aGVuIGEgaXMgYSBuZWdhdGl2ZSBpbnRlZ2VyLgotICAvLyByZXR1cm4gMjU1LCB3aGVuIGEgaXMgcG9zaXRpdmUuCi0gIHJldHVybiB+YSA+PiAyNDsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIGludCBBZGRTdWJ0cmFjdENvbXBvbmVudEZ1bGwoaW50IGEsIGludCBiLCBpbnQgYykgewotICByZXR1cm4gQ2xpcDI1NShhICsgYiAtIGMpOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQ2xhbXBlZEFkZFN1YnRyYWN0RnVsbCh1aW50MzJfdCBjMCwgdWludDMyX3QgYzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjMikgewotICBjb25zdCBpbnQgYSA9IEFkZFN1YnRyYWN0Q29tcG9uZW50RnVsbChjMCA+PiAyNCwgYzEgPj4gMjQsIGMyID4+IDI0KTsKLSAgY29uc3QgaW50IHIgPSBBZGRTdWJ0cmFjdENvbXBvbmVudEZ1bGwoKGMwID4+IDE2KSAmIDB4ZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjMSA+PiAxNikgJiAweGZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYzIgPj4gMTYpICYgMHhmZik7Ci0gIGNvbnN0IGludCBnID0gQWRkU3VidHJhY3RDb21wb25lbnRGdWxsKChjMCA+PiA4KSAmIDB4ZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjMSA+PiA4KSAmIDB4ZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjMiA+PiA4KSAmIDB4ZmYpOwotICBjb25zdCBpbnQgYiA9IEFkZFN1YnRyYWN0Q29tcG9uZW50RnVsbChjMCAmIDB4ZmYsIGMxICYgMHhmZiwgYzIgJiAweGZmKTsKLSAgcmV0dXJuIChhIDw8IDI0KSB8IChyIDw8IDE2KSB8IChnIDw8IDgpIHwgYjsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIGludCBBZGRTdWJ0cmFjdENvbXBvbmVudEhhbGYoaW50IGEsIGludCBiKSB7Ci0gIHJldHVybiBDbGlwMjU1KGEgKyAoYSAtIGIpIC8gMik7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBDbGFtcGVkQWRkU3VidHJhY3RIYWxmKHVpbnQzMl90IGMwLCB1aW50MzJfdCBjMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGMyKSB7Ci0gIGNvbnN0IHVpbnQzMl90IGF2ZSA9IEF2ZXJhZ2UyKGMwLCBjMSk7Ci0gIGNvbnN0IGludCBhID0gQWRkU3VidHJhY3RDb21wb25lbnRIYWxmKGF2ZSA+PiAyNCwgYzIgPj4gMjQpOwotICBjb25zdCBpbnQgciA9IEFkZFN1YnRyYWN0Q29tcG9uZW50SGFsZigoYXZlID4+IDE2KSAmIDB4ZmYsIChjMiA+PiAxNikgJiAweGZmKTsKLSAgY29uc3QgaW50IGcgPSBBZGRTdWJ0cmFjdENvbXBvbmVudEhhbGYoKGF2ZSA+PiA4KSAmIDB4ZmYsIChjMiA+PiA4KSAmIDB4ZmYpOwotICBjb25zdCBpbnQgYiA9IEFkZFN1YnRyYWN0Q29tcG9uZW50SGFsZigoYXZlID4+IDApICYgMHhmZiwgKGMyID4+IDApICYgMHhmZik7Ci0gIHJldHVybiAoYSA8PCAyNCkgfCAociA8PCAxNikgfCAoZyA8PCA4KSB8IGI7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgU3ViMyhpbnQgYSwgaW50IGIsIGludCBjKSB7Ci0gIGNvbnN0IGludCBwYiA9IGIgLSBjOwotICBjb25zdCBpbnQgcGEgPSBhIC0gYzsKLSAgcmV0dXJuIGFicyhwYikgLSBhYnMocGEpOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgU2VsZWN0KHVpbnQzMl90IGEsIHVpbnQzMl90IGIsIHVpbnQzMl90IGMpIHsKLSAgY29uc3QgaW50IHBhX21pbnVzX3BiID0KLSAgICAgIFN1YjMoKGEgPj4gMjQpICAgICAgICwgKGIgPj4gMjQpICAgICAgICwgKGMgPj4gMjQpICAgICAgICkgKwotICAgICAgU3ViMygoYSA+PiAxNikgJiAweGZmLCAoYiA+PiAxNikgJiAweGZmLCAoYyA+PiAxNikgJiAweGZmKSArCi0gICAgICBTdWIzKChhID4+ICA4KSAmIDB4ZmYsIChiID4+ICA4KSAmIDB4ZmYsIChjID4+ICA4KSAmIDB4ZmYpICsKLSAgICAgIFN1YjMoKGEgICAgICApICYgMHhmZiwgKGIgICAgICApICYgMHhmZiwgKGMgICAgICApICYgMHhmZik7Ci0gIHJldHVybiAocGFfbWludXNfcGIgPD0gMCkgPyBhIDogYjsKLX0KLSNlbmRpZgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gUHJlZGljdG9ycwotCi1zdGF0aWMgdWludDMyX3QgUHJlZGljdG9yMCh1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7Ci0gICh2b2lkKXRvcDsKLSAgKHZvaWQpbGVmdDsKLSAgcmV0dXJuIEFSR0JfQkxBQ0s7Ci19Ci1zdGF0aWMgdWludDMyX3QgUHJlZGljdG9yMSh1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7Ci0gICh2b2lkKXRvcDsKLSAgcmV0dXJuIGxlZnQ7Ci19Ci1zdGF0aWMgdWludDMyX3QgUHJlZGljdG9yMih1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7Ci0gICh2b2lkKWxlZnQ7Ci0gIHJldHVybiB0b3BbMF07Ci19Ci1zdGF0aWMgdWludDMyX3QgUHJlZGljdG9yMyh1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7Ci0gICh2b2lkKWxlZnQ7Ci0gIHJldHVybiB0b3BbMV07Ci19Ci1zdGF0aWMgdWludDMyX3QgUHJlZGljdG9yNCh1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7Ci0gICh2b2lkKWxlZnQ7Ci0gIHJldHVybiB0b3BbLTFdOwotfQotc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjUodWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgewotICBjb25zdCB1aW50MzJfdCBwcmVkID0gQXZlcmFnZTMobGVmdCwgdG9wWzBdLCB0b3BbMV0pOwotICByZXR1cm4gcHJlZDsKLX0KLXN0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3I2KHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKLSAgY29uc3QgdWludDMyX3QgcHJlZCA9IEF2ZXJhZ2UyKGxlZnQsIHRvcFstMV0pOwotICByZXR1cm4gcHJlZDsKLX0KLXN0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3I3KHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKLSAgY29uc3QgdWludDMyX3QgcHJlZCA9IEF2ZXJhZ2UyKGxlZnQsIHRvcFswXSk7Ci0gIHJldHVybiBwcmVkOwotfQotc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjgodWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgewotICBjb25zdCB1aW50MzJfdCBwcmVkID0gQXZlcmFnZTIodG9wWy0xXSwgdG9wWzBdKTsKLSAgKHZvaWQpbGVmdDsKLSAgcmV0dXJuIHByZWQ7Ci19Ci1zdGF0aWMgdWludDMyX3QgUHJlZGljdG9yOSh1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7Ci0gIGNvbnN0IHVpbnQzMl90IHByZWQgPSBBdmVyYWdlMih0b3BbMF0sIHRvcFsxXSk7Ci0gICh2b2lkKWxlZnQ7Ci0gIHJldHVybiBwcmVkOwotfQotc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjEwKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKLSAgY29uc3QgdWludDMyX3QgcHJlZCA9IEF2ZXJhZ2U0KGxlZnQsIHRvcFstMV0sIHRvcFswXSwgdG9wWzFdKTsKLSAgcmV0dXJuIHByZWQ7Ci19Ci1zdGF0aWMgdWludDMyX3QgUHJlZGljdG9yMTEodWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgewotICBjb25zdCB1aW50MzJfdCBwcmVkID0gU2VsZWN0KHRvcFswXSwgbGVmdCwgdG9wWy0xXSk7Ci0gIHJldHVybiBwcmVkOwotfQotc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjEyKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKLSAgY29uc3QgdWludDMyX3QgcHJlZCA9IENsYW1wZWRBZGRTdWJ0cmFjdEZ1bGwobGVmdCwgdG9wWzBdLCB0b3BbLTFdKTsKLSAgcmV0dXJuIHByZWQ7Ci19Ci1zdGF0aWMgdWludDMyX3QgUHJlZGljdG9yMTModWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgewotICBjb25zdCB1aW50MzJfdCBwcmVkID0gQ2xhbXBlZEFkZFN1YnRyYWN0SGFsZihsZWZ0LCB0b3BbMF0sIHRvcFstMV0pOwotICByZXR1cm4gcHJlZDsKLX0KLQotdHlwZWRlZiB1aW50MzJfdCAoKlByZWRpY3RvckZ1bmMpKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApOwotc3RhdGljIGNvbnN0IFByZWRpY3RvckZ1bmMga1ByZWRpY3RvcnNbMTZdID0gewotICBQcmVkaWN0b3IwLCBQcmVkaWN0b3IxLCBQcmVkaWN0b3IyLCBQcmVkaWN0b3IzLAotICBQcmVkaWN0b3I0LCBQcmVkaWN0b3I1LCBQcmVkaWN0b3I2LCBQcmVkaWN0b3I3LAotICBQcmVkaWN0b3I4LCBQcmVkaWN0b3I5LCBQcmVkaWN0b3IxMCwgUHJlZGljdG9yMTEsCi0gIFByZWRpY3RvcjEyLCBQcmVkaWN0b3IxMywKLSAgUHJlZGljdG9yMCwgUHJlZGljdG9yMCAgICAvLyA8LSBwYWRkaW5nIHNlY3VyaXR5IHNlbnRpbmVscwotfTsKLQotLy8gVE9ETyh2aWthc2EpOiBSZXBsYWNlIDI1NiBldGMgd2l0aCBkZWZpbmVzLgotc3RhdGljIGZsb2F0IFByZWRpY3Rpb25Db3N0U3BhdGlhbChjb25zdCBpbnQqIGNvdW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodF8wLCBkb3VibGUgZXhwX3ZhbCkgewotICBjb25zdCBpbnQgc2lnbmlmaWNhbnRfc3ltYm9scyA9IDE2OwotICBjb25zdCBkb3VibGUgZXhwX2RlY2F5X2ZhY3RvciA9IDAuNjsKLSAgZG91YmxlIGJpdHMgPSB3ZWlnaHRfMCAqIGNvdW50c1swXTsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDE7IGkgPCBzaWduaWZpY2FudF9zeW1ib2xzOyArK2kpIHsKLSAgICBiaXRzICs9IGV4cF92YWwgKiAoY291bnRzW2ldICsgY291bnRzWzI1NiAtIGldKTsKLSAgICBleHBfdmFsICo9IGV4cF9kZWNheV9mYWN0b3I7Ci0gIH0KLSAgcmV0dXJuIChmbG9hdCkoLTAuMSAqIGJpdHMpOwotfQotCi0vLyBDb21wdXRlIHRoZSBjb21iaW5lZCBTaGFub24ncyBlbnRyb3B5IGZvciBkaXN0cmlidXRpb24ge1h9IGFuZCB7WCtZfQotc3RhdGljIGZsb2F0IENvbWJpbmVkU2hhbm5vbkVudHJvcHkoY29uc3QgaW50KiBjb25zdCBYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50KiBjb25zdCBZLCBpbnQgbikgewotICBpbnQgaTsKLSAgZG91YmxlIHJldHZhbCA9IDAuOwotICBpbnQgc3VtWCA9IDAsIHN1bVhZID0gMDsKLSAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewotICAgIGNvbnN0IGludCB4ID0gWFtpXTsKLSAgICBjb25zdCBpbnQgeHkgPSBYW2ldICsgWVtpXTsKLSAgICBpZiAoeCAhPSAwKSB7Ci0gICAgICBzdW1YICs9IHg7Ci0gICAgICByZXR2YWwgLT0gVlA4TEZhc3RTTG9nMih4KTsKLSAgICB9Ci0gICAgaWYgKHh5ICE9IDApIHsKLSAgICAgIHN1bVhZICs9IHh5OwotICAgICAgcmV0dmFsIC09IFZQOExGYXN0U0xvZzIoeHkpOwotICAgIH0KLSAgfQotICByZXR2YWwgKz0gVlA4TEZhc3RTTG9nMihzdW1YKSArIFZQOExGYXN0U0xvZzIoc3VtWFkpOwotICByZXR1cm4gKGZsb2F0KXJldHZhbDsKLX0KLQotc3RhdGljIGZsb2F0IFByZWRpY3Rpb25Db3N0U3BhdGlhbEhpc3RvZ3JhbShpbnQgYWNjdW11bGF0ZWRbNF1bMjU2XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbGVbNF1bMjU2XSkgewotICBpbnQgaTsKLSAgZG91YmxlIHJldHZhbCA9IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKLSAgICBjb25zdCBkb3VibGUga0V4cFZhbHVlID0gMC45NDsKLSAgICByZXR2YWwgKz0gUHJlZGljdGlvbkNvc3RTcGF0aWFsKHRpbGVbaV0sIDEsIGtFeHBWYWx1ZSk7Ci0gICAgcmV0dmFsICs9IENvbWJpbmVkU2hhbm5vbkVudHJvcHkodGlsZVtpXSwgYWNjdW11bGF0ZWRbaV0sIDI1Nik7Ci0gIH0KLSAgcmV0dXJuIChmbG9hdClyZXR2YWw7Ci19Ci0KLXN0YXRpYyBpbnQgR2V0QmVzdFByZWRpY3RvckZvclRpbGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGlsZV94LCBpbnQgdGlsZV95LCBpbnQgYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFjY3VtdWxhdGVkWzRdWzI1Nl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiX3NjcmF0Y2gpIHsKLSAgY29uc3QgaW50IGtOdW1QcmVkTW9kZXMgPSAxNDsKLSAgY29uc3QgaW50IGNvbF9zdGFydCA9IHRpbGVfeCA8PCBiaXRzOwotICBjb25zdCBpbnQgcm93X3N0YXJ0ID0gdGlsZV95IDw8IGJpdHM7Ci0gIGNvbnN0IGludCB0aWxlX3NpemUgPSAxIDw8IGJpdHM7Ci0gIGNvbnN0IGludCB5bWF4ID0gKHRpbGVfc2l6ZSA8PSBoZWlnaHQgLSByb3dfc3RhcnQpID8KLSAgICAgIHRpbGVfc2l6ZSA6IGhlaWdodCAtIHJvd19zdGFydDsKLSAgY29uc3QgaW50IHhtYXggPSAodGlsZV9zaXplIDw9IHdpZHRoIC0gY29sX3N0YXJ0KSA/Ci0gICAgICB0aWxlX3NpemUgOiB3aWR0aCAtIGNvbF9zdGFydDsKLSAgaW50IGhpc3RvWzRdWzI1Nl07Ci0gIGZsb2F0IGJlc3RfZGlmZiA9IE1BWF9ESUZGX0NPU1Q7Ci0gIGludCBiZXN0X21vZGUgPSAwOwotCi0gIGludCBtb2RlOwotICBmb3IgKG1vZGUgPSAwOyBtb2RlIDwga051bVByZWRNb2RlczsgKyttb2RlKSB7Ci0gICAgY29uc3QgdWludDMyX3QqIGN1cnJlbnRfcm93ID0gYXJnYl9zY3JhdGNoOwotICAgIGNvbnN0IFByZWRpY3RvckZ1bmMgcHJlZF9mdW5jID0ga1ByZWRpY3RvcnNbbW9kZV07Ci0gICAgZmxvYXQgY3VyX2RpZmY7Ci0gICAgaW50IHk7Ci0gICAgU2JNZW1vcnlTZXQoJmhpc3RvWzBdWzBdLCAwLCBzaXplb2YoaGlzdG8pKTsKLSAgICBmb3IgKHkgPSAwOyB5IDwgeW1heDsgKyt5KSB7Ci0gICAgICBpbnQgeDsKLSAgICAgIGNvbnN0IGludCByb3cgPSByb3dfc3RhcnQgKyB5OwotICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IHVwcGVyX3JvdyA9IGN1cnJlbnRfcm93OwotICAgICAgY3VycmVudF9yb3cgPSB1cHBlcl9yb3cgKyB3aWR0aDsKLSAgICAgIGZvciAoeCA9IDA7IHggPCB4bWF4OyArK3gpIHsKLSAgICAgICAgY29uc3QgaW50IGNvbCA9IGNvbF9zdGFydCArIHg7Ci0gICAgICAgIHVpbnQzMl90IHByZWRpY3Q7Ci0gICAgICAgIHVpbnQzMl90IHByZWRpY3RfZGlmZjsKLSAgICAgICAgaWYgKHJvdyA9PSAwKSB7Ci0gICAgICAgICAgcHJlZGljdCA9IChjb2wgPT0gMCkgPyBBUkdCX0JMQUNLIDogY3VycmVudF9yb3dbY29sIC0gMV07ICAvLyBMZWZ0LgotICAgICAgICB9IGVsc2UgaWYgKGNvbCA9PSAwKSB7Ci0gICAgICAgICAgcHJlZGljdCA9IHVwcGVyX3Jvd1tjb2xdOyAgLy8gVG9wLgotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHByZWRpY3QgPSBwcmVkX2Z1bmMoY3VycmVudF9yb3dbY29sIC0gMV0sIHVwcGVyX3JvdyArIGNvbCk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJlZGljdF9kaWZmID0gVlA4TFN1YlBpeGVscyhjdXJyZW50X3Jvd1tjb2xdLCBwcmVkaWN0KTsKLSAgICAgICAgKytoaXN0b1swXVtwcmVkaWN0X2RpZmYgPj4gMjRdOwotICAgICAgICArK2hpc3RvWzFdWygocHJlZGljdF9kaWZmID4+IDE2KSAmIDB4ZmYpXTsKLSAgICAgICAgKytoaXN0b1syXVsoKHByZWRpY3RfZGlmZiA+PiA4KSAmIDB4ZmYpXTsKLSAgICAgICAgKytoaXN0b1szXVsocHJlZGljdF9kaWZmICYgMHhmZildOwotICAgICAgfQotICAgIH0KLSAgICBjdXJfZGlmZiA9IFByZWRpY3Rpb25Db3N0U3BhdGlhbEhpc3RvZ3JhbShhY2N1bXVsYXRlZCwgaGlzdG8pOwotICAgIGlmIChjdXJfZGlmZiA8IGJlc3RfZGlmZikgewotICAgICAgYmVzdF9kaWZmID0gY3VyX2RpZmY7Ci0gICAgICBiZXN0X21vZGUgPSBtb2RlOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBiZXN0X21vZGU7Ci19Ci0KLXN0YXRpYyB2b2lkIENvcHlUaWxlV2l0aFByZWRpY3Rpb24oaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGlsZV94LCBpbnQgdGlsZV95LCBpbnQgYml0cywgaW50IG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiX3NjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBjb25zdCBhcmdiKSB7Ci0gIGNvbnN0IGludCBjb2xfc3RhcnQgPSB0aWxlX3ggPDwgYml0czsKLSAgY29uc3QgaW50IHJvd19zdGFydCA9IHRpbGVfeSA8PCBiaXRzOwotICBjb25zdCBpbnQgdGlsZV9zaXplID0gMSA8PCBiaXRzOwotICBjb25zdCBpbnQgeW1heCA9ICh0aWxlX3NpemUgPD0gaGVpZ2h0IC0gcm93X3N0YXJ0KSA/Ci0gICAgICB0aWxlX3NpemUgOiBoZWlnaHQgLSByb3dfc3RhcnQ7Ci0gIGNvbnN0IGludCB4bWF4ID0gKHRpbGVfc2l6ZSA8PSB3aWR0aCAtIGNvbF9zdGFydCkgPwotICAgICAgdGlsZV9zaXplIDogd2lkdGggLSBjb2xfc3RhcnQ7Ci0gIGNvbnN0IFByZWRpY3RvckZ1bmMgcHJlZF9mdW5jID0ga1ByZWRpY3RvcnNbbW9kZV07Ci0gIGNvbnN0IHVpbnQzMl90KiBjdXJyZW50X3JvdyA9IGFyZ2Jfc2NyYXRjaDsKLQotICBpbnQgeTsKLSAgZm9yICh5ID0gMDsgeSA8IHltYXg7ICsreSkgewotICAgIGludCB4OwotICAgIGNvbnN0IGludCByb3cgPSByb3dfc3RhcnQgKyB5OwotICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCB1cHBlcl9yb3cgPSBjdXJyZW50X3JvdzsKLSAgICBjdXJyZW50X3JvdyA9IHVwcGVyX3JvdyArIHdpZHRoOwotICAgIGZvciAoeCA9IDA7IHggPCB4bWF4OyArK3gpIHsKLSAgICAgIGNvbnN0IGludCBjb2wgPSBjb2xfc3RhcnQgKyB4OwotICAgICAgY29uc3QgaW50IHBpeCA9IHJvdyAqIHdpZHRoICsgY29sOwotICAgICAgdWludDMyX3QgcHJlZGljdDsKLSAgICAgIGlmIChyb3cgPT0gMCkgewotICAgICAgICBwcmVkaWN0ID0gKGNvbCA9PSAwKSA/IEFSR0JfQkxBQ0sgOiBjdXJyZW50X3Jvd1tjb2wgLSAxXTsgIC8vIExlZnQuCi0gICAgICB9IGVsc2UgaWYgKGNvbCA9PSAwKSB7Ci0gICAgICAgIHByZWRpY3QgPSB1cHBlcl9yb3dbY29sXTsgIC8vIFRvcC4KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHByZWRpY3QgPSBwcmVkX2Z1bmMoY3VycmVudF9yb3dbY29sIC0gMV0sIHVwcGVyX3JvdyArIGNvbCk7Ci0gICAgICB9Ci0gICAgICBhcmdiW3BpeF0gPSBWUDhMU3ViUGl4ZWxzKGN1cnJlbnRfcm93W2NvbF0sIHByZWRpY3QpOwotICAgIH0KLSAgfQotfQotCi12b2lkIFZQOExSZXNpZHVhbEltYWdlKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBjb25zdCBhcmdiLCB1aW50MzJfdCogY29uc3QgYXJnYl9zY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogY29uc3QgaW1hZ2UpIHsKLSAgY29uc3QgaW50IG1heF90aWxlX3NpemUgPSAxIDw8IGJpdHM7Ci0gIGNvbnN0IGludCB0aWxlc19wZXJfcm93ID0gVlA4TFN1YlNhbXBsZVNpemUod2lkdGgsIGJpdHMpOwotICBjb25zdCBpbnQgdGlsZXNfcGVyX2NvbCA9IFZQOExTdWJTYW1wbGVTaXplKGhlaWdodCwgYml0cyk7Ci0gIHVpbnQzMl90KiBjb25zdCB1cHBlcl9yb3cgPSBhcmdiX3NjcmF0Y2g7Ci0gIHVpbnQzMl90KiBjb25zdCBjdXJyZW50X3RpbGVfcm93cyA9IGFyZ2Jfc2NyYXRjaCArIHdpZHRoOwotICBpbnQgdGlsZV95OwotICBpbnQgaGlzdG9bNF1bMjU2XTsKLSAgU2JNZW1vcnlTZXQoaGlzdG8sIDAsIHNpemVvZihoaXN0bykpOwotICBmb3IgKHRpbGVfeSA9IDA7IHRpbGVfeSA8IHRpbGVzX3Blcl9jb2w7ICsrdGlsZV95KSB7Ci0gICAgY29uc3QgaW50IHRpbGVfeV9vZmZzZXQgPSB0aWxlX3kgKiBtYXhfdGlsZV9zaXplOwotICAgIGNvbnN0IGludCB0aGlzX3RpbGVfaGVpZ2h0ID0KLSAgICAgICAgKHRpbGVfeSA8IHRpbGVzX3Blcl9jb2wgLSAxKSA/IG1heF90aWxlX3NpemUgOiBoZWlnaHQgLSB0aWxlX3lfb2Zmc2V0OwotICAgIGludCB0aWxlX3g7Ci0gICAgaWYgKHRpbGVfeSA+IDApIHsKLSAgICAgIFNiTWVtb3J5Q29weSh1cHBlcl9yb3csIGN1cnJlbnRfdGlsZV9yb3dzICsgKG1heF90aWxlX3NpemUgLSAxKSAqIHdpZHRoLAotICAgICAgICAgICAgIHdpZHRoICogc2l6ZW9mKCp1cHBlcl9yb3cpKTsKLSAgICB9Ci0gICAgU2JNZW1vcnlDb3B5KGN1cnJlbnRfdGlsZV9yb3dzLCAmYXJnYlt0aWxlX3lfb2Zmc2V0ICogd2lkdGhdLAotICAgICAgICAgICB0aGlzX3RpbGVfaGVpZ2h0ICogd2lkdGggKiBzaXplb2YoKmN1cnJlbnRfdGlsZV9yb3dzKSk7Ci0gICAgZm9yICh0aWxlX3ggPSAwOyB0aWxlX3ggPCB0aWxlc19wZXJfcm93OyArK3RpbGVfeCkgewotICAgICAgaW50IHByZWQ7Ci0gICAgICBpbnQgeTsKLSAgICAgIGNvbnN0IGludCB0aWxlX3hfb2Zmc2V0ID0gdGlsZV94ICogbWF4X3RpbGVfc2l6ZTsKLSAgICAgIGludCBhbGxfeF9tYXggPSB0aWxlX3hfb2Zmc2V0ICsgbWF4X3RpbGVfc2l6ZTsKLSAgICAgIGlmIChhbGxfeF9tYXggPiB3aWR0aCkgewotICAgICAgICBhbGxfeF9tYXggPSB3aWR0aDsKLSAgICAgIH0KLSAgICAgIHByZWQgPSBHZXRCZXN0UHJlZGljdG9yRm9yVGlsZSh3aWR0aCwgaGVpZ2h0LCB0aWxlX3gsIHRpbGVfeSwgYml0cywgaGlzdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnYl9zY3JhdGNoKTsKLSAgICAgIGltYWdlW3RpbGVfeSAqIHRpbGVzX3Blcl9yb3cgKyB0aWxlX3hdID0gMHhmZjAwMDAwMHUgfCAocHJlZCA8PCA4KTsKLSAgICAgIENvcHlUaWxlV2l0aFByZWRpY3Rpb24od2lkdGgsIGhlaWdodCwgdGlsZV94LCB0aWxlX3ksIGJpdHMsIHByZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ2Jfc2NyYXRjaCwgYXJnYik7Ci0gICAgICBmb3IgKHkgPSAwOyB5IDwgbWF4X3RpbGVfc2l6ZTsgKyt5KSB7Ci0gICAgICAgIGludCBpeDsKLSAgICAgICAgaW50IGFsbF94OwotICAgICAgICBpbnQgYWxsX3kgPSB0aWxlX3lfb2Zmc2V0ICsgeTsKLSAgICAgICAgaWYgKGFsbF95ID49IGhlaWdodCkgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGl4ID0gYWxsX3kgKiB3aWR0aCArIHRpbGVfeF9vZmZzZXQ7Ci0gICAgICAgIGZvciAoYWxsX3ggPSB0aWxlX3hfb2Zmc2V0OyBhbGxfeCA8IGFsbF94X21heDsgKythbGxfeCwgKytpeCkgewotICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGEgPSBhcmdiW2l4XTsKLSAgICAgICAgICArK2hpc3RvWzBdW2EgPj4gMjRdOwotICAgICAgICAgICsraGlzdG9bMV1bKChhID4+IDE2KSAmIDB4ZmYpXTsKLSAgICAgICAgICArK2hpc3RvWzJdWygoYSA+PiA4KSAmIDB4ZmYpXTsKLSAgICAgICAgICArK2hpc3RvWzNdWyhhICYgMHhmZildOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLS8vIEludmVyc2UgcHJlZGljdGlvbi4KLXN0YXRpYyB2b2lkIFByZWRpY3RvckludmVyc2VUcmFuc2Zvcm0oY29uc3QgVlA4TFRyYW5zZm9ybSogY29uc3QgdHJhbnNmb3JtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9zdGFydCwgaW50IHlfZW5kLCB1aW50MzJfdCogZGF0YSkgewotICBjb25zdCBpbnQgd2lkdGggPSB0cmFuc2Zvcm0tPnhzaXplXzsKLSAgaWYgKHlfc3RhcnQgPT0gMCkgeyAgLy8gRmlyc3QgUm93IGZvbGxvd3MgdGhlIEwgKG1vZGU9MSkgbW9kZS4KLSAgICBpbnQgeDsKLSAgICBjb25zdCB1aW50MzJfdCBwcmVkMCA9IFByZWRpY3RvcjAoZGF0YVstMV0sIE5VTEwpOwotICAgIEFkZFBpeGVsc0VxKGRhdGEsIHByZWQwKTsKLSAgICBmb3IgKHggPSAxOyB4IDwgd2lkdGg7ICsreCkgewotICAgICAgY29uc3QgdWludDMyX3QgcHJlZDEgPSBQcmVkaWN0b3IxKGRhdGFbeCAtIDFdLCBOVUxMKTsKLSAgICAgIEFkZFBpeGVsc0VxKGRhdGEgKyB4LCBwcmVkMSk7Ci0gICAgfQotICAgIGRhdGEgKz0gd2lkdGg7Ci0gICAgKyt5X3N0YXJ0OwotICB9Ci0KLSAgewotICAgIGludCB5ID0geV9zdGFydDsKLSAgICBjb25zdCBpbnQgbWFzayA9ICgxIDw8IHRyYW5zZm9ybS0+Yml0c18pIC0gMTsKLSAgICBjb25zdCBpbnQgdGlsZXNfcGVyX3JvdyA9IFZQOExTdWJTYW1wbGVTaXplKHdpZHRoLCB0cmFuc2Zvcm0tPmJpdHNfKTsKLSAgICBjb25zdCB1aW50MzJfdCogcHJlZF9tb2RlX2Jhc2UgPQotICAgICAgICB0cmFuc2Zvcm0tPmRhdGFfICsgKHkgPj4gdHJhbnNmb3JtLT5iaXRzXykgKiB0aWxlc19wZXJfcm93OwotCi0gICAgd2hpbGUgKHkgPCB5X2VuZCkgewotICAgICAgaW50IHg7Ci0gICAgICBjb25zdCB1aW50MzJfdCBwcmVkMiA9IFByZWRpY3RvcjIoZGF0YVstMV0sIGRhdGEgLSB3aWR0aCk7Ci0gICAgICBjb25zdCB1aW50MzJfdCogcHJlZF9tb2RlX3NyYyA9IHByZWRfbW9kZV9iYXNlOwotICAgICAgUHJlZGljdG9yRnVuYyBwcmVkX2Z1bmM7Ci0KLSAgICAgIC8vIEZpcnN0IHBpeGVsIGZvbGxvd3MgdGhlIFQgKG1vZGU9MikgbW9kZS4KLSAgICAgIEFkZFBpeGVsc0VxKGRhdGEsIHByZWQyKTsKLQotICAgICAgLy8gLi4gdGhlIHJlc3Q6Ci0gICAgICBwcmVkX2Z1bmMgPSBrUHJlZGljdG9yc1soKCpwcmVkX21vZGVfc3JjKyspID4+IDgpICYgMHhmXTsKLSAgICAgIGZvciAoeCA9IDE7IHggPCB3aWR0aDsgKyt4KSB7Ci0gICAgICAgIHVpbnQzMl90IHByZWQ7Ci0gICAgICAgIGlmICgoeCAmIG1hc2spID09IDApIHsgICAgLy8gc3RhcnQgb2YgdGlsZS4gUmVhZCBwcmVkaWN0b3IgZnVuY3Rpb24uCi0gICAgICAgICAgcHJlZF9mdW5jID0ga1ByZWRpY3RvcnNbKCgqcHJlZF9tb2RlX3NyYysrKSA+PiA4KSAmIDB4Zl07Ci0gICAgICAgIH0KLSAgICAgICAgcHJlZCA9IHByZWRfZnVuYyhkYXRhW3ggLSAxXSwgZGF0YSArIHggLSB3aWR0aCk7Ci0gICAgICAgIEFkZFBpeGVsc0VxKGRhdGEgKyB4LCBwcmVkKTsKLSAgICAgIH0KLSAgICAgIGRhdGEgKz0gd2lkdGg7Ci0gICAgICArK3k7Ci0gICAgICBpZiAoKHkgJiBtYXNrKSA9PSAwKSB7ICAgLy8gVXNlIHRoZSBzYW1lIG1hc2ssIHNpbmNlIHRpbGVzIGFyZSBzcXVhcmVzLgotICAgICAgICBwcmVkX21vZGVfYmFzZSArPSB0aWxlc19wZXJfcm93OwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi12b2lkIFZQOExTdWJ0cmFjdEdyZWVuRnJvbUJsdWVBbmRSZWQodWludDMyX3QqIGFyZ2JfZGF0YSwgaW50IG51bV9waXhzKSB7Ci0gIGludCBpID0gMDsKLSNpZiBkZWZpbmVkKFdFQlBfVEFSR0VUX0hBU19TU0UyKQotICBjb25zdCBfX20xMjhpIG1hc2sgPSBfbW1fc2V0MV9lcGkzMigweDAwMDBmZjAwKTsKLSAgZm9yICg7IGkgKyA0IDwgbnVtX3BpeHM7IGkgKz0gNCkgewotICAgIGNvbnN0IF9fbTEyOGkgaW4gPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZhcmdiX2RhdGFbaV0pOwotICAgIGNvbnN0IF9fbTEyOGkgaW5fMDBnMCA9IF9tbV9hbmRfc2kxMjgoaW4sIG1hc2spOyAgICAgLy8gMDBnMHwwMGcwfC4uLgotICAgIGNvbnN0IF9fbTEyOGkgaW5fMGcwMCA9IF9tbV9zbGxpX2VwaTMyKGluXzAwZzAsIDgpOyAgLy8gMGcwMHwwZzAwfC4uLgotICAgIGNvbnN0IF9fbTEyOGkgaW5fMDAwZyA9IF9tbV9zcmxpX2VwaTMyKGluXzAwZzAsIDgpOyAgLy8gMDAwZ3wwMDBnfC4uLgotICAgIGNvbnN0IF9fbTEyOGkgaW5fMGcwZyA9IF9tbV9vcl9zaTEyOChpbl8wZzAwLCBpbl8wMDBnKTsKLSAgICBjb25zdCBfX20xMjhpIG91dCA9IF9tbV9zdWJfZXBpOChpbiwgaW5fMGcwZyk7Ci0gICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJmFyZ2JfZGF0YVtpXSwgb3V0KTsKLSAgfQotICAvLyBmYWxsdGhyb3VnaCBhbmQgZmluaXNoIG9mZiB3aXRoIHBsYWluLUMKLSNlbmRpZgotICBmb3IgKDsgaSA8IG51bV9waXhzOyArK2kpIHsKLSAgICBjb25zdCB1aW50MzJfdCBhcmdiID0gYXJnYl9kYXRhW2ldOwotICAgIGNvbnN0IHVpbnQzMl90IGdyZWVuID0gKGFyZ2IgPj4gOCkgJiAweGZmOwotICAgIGNvbnN0IHVpbnQzMl90IG5ld19yID0gKCgoYXJnYiA+PiAxNikgJiAweGZmKSAtIGdyZWVuKSAmIDB4ZmY7Ci0gICAgY29uc3QgdWludDMyX3QgbmV3X2IgPSAoKGFyZ2IgJiAweGZmKSAtIGdyZWVuKSAmIDB4ZmY7Ci0gICAgYXJnYl9kYXRhW2ldID0gKGFyZ2IgJiAweGZmMDBmZjAwKSB8IChuZXdfciA8PCAxNikgfCBuZXdfYjsKLSAgfQotfQotCi0vLyBBZGQgZ3JlZW4gdG8gYmx1ZSBhbmQgcmVkIGNoYW5uZWxzIChpLmUuIHBlcmZvcm0gdGhlIGludmVyc2UgdHJhbnNmb3JtIG9mCi0vLyAnc3VidHJhY3QgZ3JlZW4nKS4KLXN0YXRpYyB2b2lkIEFkZEdyZWVuVG9CbHVlQW5kUmVkKGNvbnN0IFZQOExUcmFuc2Zvcm0qIGNvbnN0IHRyYW5zZm9ybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5X3N0YXJ0LCBpbnQgeV9lbmQsIHVpbnQzMl90KiBkYXRhKSB7Ci0gIGNvbnN0IGludCB3aWR0aCA9IHRyYW5zZm9ybS0+eHNpemVfOwotICBjb25zdCB1aW50MzJfdCogY29uc3QgZGF0YV9lbmQgPSBkYXRhICsgKHlfZW5kIC0geV9zdGFydCkgKiB3aWR0aDsKLSNpZiBkZWZpbmVkKFdFQlBfVEFSR0VUX0hBU19TU0UyKQotICBjb25zdCBfX20xMjhpIG1hc2sgPSBfbW1fc2V0MV9lcGkzMigweDAwMDBmZjAwKTsKLSAgZm9yICg7IGRhdGEgKyA0IDwgZGF0YV9lbmQ7IGRhdGEgKz0gNCkgewotICAgIGNvbnN0IF9fbTEyOGkgaW4gPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKWRhdGEpOwotICAgIGNvbnN0IF9fbTEyOGkgaW5fMDBnMCA9IF9tbV9hbmRfc2kxMjgoaW4sIG1hc2spOyAgICAgLy8gMDBnMHwwMGcwfC4uLgotICAgIGNvbnN0IF9fbTEyOGkgaW5fMGcwMCA9IF9tbV9zbGxpX2VwaTMyKGluXzAwZzAsIDgpOyAgLy8gMGcwMHwwZzAwfC4uLgotICAgIGNvbnN0IF9fbTEyOGkgaW5fMDAwZyA9IF9tbV9zcmxpX2VwaTMyKGluXzAwZzAsIDgpOyAgLy8gMDAwZ3wwMDBnfC4uLgotICAgIGNvbnN0IF9fbTEyOGkgaW5fMGcwZyA9IF9tbV9vcl9zaTEyOChpbl8wZzAwLCBpbl8wMDBnKTsKLSAgICBjb25zdCBfX20xMjhpIG91dCA9IF9tbV9hZGRfZXBpOChpbiwgaW5fMGcwZyk7Ci0gICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopZGF0YSwgb3V0KTsKLSAgfQotICAvLyBmYWxsdGhyb3VnaCBhbmQgZmluaXNoIG9mZiB3aXRoIHBsYWluLUMKLSNlbmRpZgotICB3aGlsZSAoZGF0YSA8IGRhdGFfZW5kKSB7Ci0gICAgY29uc3QgdWludDMyX3QgYXJnYiA9ICpkYXRhOwotICAgIGNvbnN0IHVpbnQzMl90IGdyZWVuID0gKChhcmdiID4+IDgpICYgMHhmZik7Ci0gICAgdWludDMyX3QgcmVkX2JsdWUgPSAoYXJnYiAmIDB4MDBmZjAwZmZ1KTsKLSAgICByZWRfYmx1ZSArPSAoZ3JlZW4gPDwgMTYpIHwgZ3JlZW47Ci0gICAgcmVkX2JsdWUgJj0gMHgwMGZmMDBmZnU7Ci0gICAgKmRhdGErKyA9IChhcmdiICYgMHhmZjAwZmYwMHUpIHwgcmVkX2JsdWU7Ci0gIH0KLX0KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAvLyBOb3RlOiB0aGUgbWVtYmVycyBhcmUgdWludDhfdCwgc28gdGhhdCBhbnkgbmVnYXRpdmUgdmFsdWVzIGFyZQotICAvLyBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0byAibW9kIDI1NiIgdmFsdWVzLgotICB1aW50OF90IGdyZWVuX3RvX3JlZF87Ci0gIHVpbnQ4X3QgZ3JlZW5fdG9fYmx1ZV87Ci0gIHVpbnQ4X3QgcmVkX3RvX2JsdWVfOwotfSBNdWx0aXBsaWVyczsKLQotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgTXVsdGlwbGllcnNDbGVhcihNdWx0aXBsaWVycyogbSkgewotICBtLT5ncmVlbl90b19yZWRfID0gMDsKLSAgbS0+Z3JlZW5fdG9fYmx1ZV8gPSAwOwotICBtLT5yZWRfdG9fYmx1ZV8gPSAwOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQ29sb3JUcmFuc2Zvcm1EZWx0YShpbnQ4X3QgY29sb3JfcHJlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDhfdCBjb2xvcikgewotICByZXR1cm4gKHVpbnQzMl90KSgoaW50KShjb2xvcl9wcmVkKSAqIGNvbG9yKSA+PiA1OwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBDb2xvckNvZGVUb011bHRpcGxpZXJzKHVpbnQzMl90IGNvbG9yX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpcGxpZXJzKiBjb25zdCBtKSB7Ci0gIG0tPmdyZWVuX3RvX3JlZF8gID0gKGNvbG9yX2NvZGUgPj4gIDApICYgMHhmZjsKLSAgbS0+Z3JlZW5fdG9fYmx1ZV8gPSAoY29sb3JfY29kZSA+PiAgOCkgJiAweGZmOwotICBtLT5yZWRfdG9fYmx1ZV8gICA9IChjb2xvcl9jb2RlID4+IDE2KSAmIDB4ZmY7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBNdWx0aXBsaWVyc1RvQ29sb3JDb2RlKE11bHRpcGxpZXJzKiBjb25zdCBtKSB7Ci0gIHJldHVybiAweGZmMDAwMDAwdSB8Ci0gICAgICAgICAoKHVpbnQzMl90KShtLT5yZWRfdG9fYmx1ZV8pIDw8IDE2KSB8Ci0gICAgICAgICAoKHVpbnQzMl90KShtLT5ncmVlbl90b19ibHVlXykgPDwgOCkgfAotICAgICAgICAgbS0+Z3JlZW5fdG9fcmVkXzsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IFRyYW5zZm9ybUNvbG9yKGNvbnN0IE11bHRpcGxpZXJzKiBjb25zdCBtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFyZ2IsIGludCBpbnZlcnNlKSB7Ci0gIGNvbnN0IHVpbnQzMl90IGdyZWVuID0gYXJnYiA+PiA4OwotICBjb25zdCB1aW50MzJfdCByZWQgPSBhcmdiID4+IDE2OwotICB1aW50MzJfdCBuZXdfcmVkID0gcmVkOwotICB1aW50MzJfdCBuZXdfYmx1ZSA9IGFyZ2I7Ci0KLSAgaWYgKGludmVyc2UpIHsKLSAgICBuZXdfcmVkICs9IENvbG9yVHJhbnNmb3JtRGVsdGEobS0+Z3JlZW5fdG9fcmVkXywgZ3JlZW4pOwotICAgIG5ld19yZWQgJj0gMHhmZjsKLSAgICBuZXdfYmx1ZSArPSBDb2xvclRyYW5zZm9ybURlbHRhKG0tPmdyZWVuX3RvX2JsdWVfLCBncmVlbik7Ci0gICAgbmV3X2JsdWUgKz0gQ29sb3JUcmFuc2Zvcm1EZWx0YShtLT5yZWRfdG9fYmx1ZV8sIG5ld19yZWQpOwotICAgIG5ld19ibHVlICY9IDB4ZmY7Ci0gIH0gZWxzZSB7Ci0gICAgbmV3X3JlZCAtPSBDb2xvclRyYW5zZm9ybURlbHRhKG0tPmdyZWVuX3RvX3JlZF8sIGdyZWVuKTsKLSAgICBuZXdfcmVkICY9IDB4ZmY7Ci0gICAgbmV3X2JsdWUgLT0gQ29sb3JUcmFuc2Zvcm1EZWx0YShtLT5ncmVlbl90b19ibHVlXywgZ3JlZW4pOwotICAgIG5ld19ibHVlIC09IENvbG9yVHJhbnNmb3JtRGVsdGEobS0+cmVkX3RvX2JsdWVfLCByZWQpOwotICAgIG5ld19ibHVlICY9IDB4ZmY7Ci0gIH0KLSAgcmV0dXJuIChhcmdiICYgMHhmZjAwZmYwMHUpIHwgKG5ld19yZWQgPDwgMTYpIHwgKG5ld19ibHVlKTsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ4X3QgVHJhbnNmb3JtQ29sb3JSZWQodWludDhfdCBncmVlbl90b19yZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhcmdiKSB7Ci0gIGNvbnN0IHVpbnQzMl90IGdyZWVuID0gYXJnYiA+PiA4OwotICB1aW50MzJfdCBuZXdfcmVkID0gYXJnYiA+PiAxNjsKLSAgbmV3X3JlZCAtPSBDb2xvclRyYW5zZm9ybURlbHRhKGdyZWVuX3RvX3JlZCwgZ3JlZW4pOwotICByZXR1cm4gKG5ld19yZWQgJiAweGZmKTsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ4X3QgVHJhbnNmb3JtQ29sb3JCbHVlKHVpbnQ4X3QgZ3JlZW5fdG9fYmx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJlZF90b19ibHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFyZ2IpIHsKLSAgY29uc3QgdWludDMyX3QgZ3JlZW4gPSBhcmdiID4+IDg7Ci0gIGNvbnN0IHVpbnQzMl90IHJlZCA9IGFyZ2IgPj4gMTY7Ci0gIHVpbnQ4X3QgbmV3X2JsdWUgPSBhcmdiOwotICBuZXdfYmx1ZSAtPSBDb2xvclRyYW5zZm9ybURlbHRhKGdyZWVuX3RvX2JsdWUsIGdyZWVuKTsKLSAgbmV3X2JsdWUgLT0gQ29sb3JUcmFuc2Zvcm1EZWx0YShyZWRfdG9fYmx1ZSwgcmVkKTsKLSAgcmV0dXJuIChuZXdfYmx1ZSAmIDB4ZmYpOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IFNraXBSZXBlYXRlZFBpeGVscyhjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpeCwgaW50IHhzaXplKSB7Ci0gIGNvbnN0IHVpbnQzMl90IHYgPSBhcmdiW2l4XTsKLSAgaWYgKGl4ID49IHhzaXplICsgMykgewotICAgIGlmICh2ID09IGFyZ2JbaXggLSB4c2l6ZV0gJiYKLSAgICAgICAgYXJnYltpeCAtIDFdID09IGFyZ2JbaXggLSB4c2l6ZSAtIDFdICYmCi0gICAgICAgIGFyZ2JbaXggLSAyXSA9PSBhcmdiW2l4IC0geHNpemUgLSAyXSAmJgotICAgICAgICBhcmdiW2l4IC0gM10gPT0gYXJnYltpeCAtIHhzaXplIC0gM10pIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICByZXR1cm4gdiA9PSBhcmdiW2l4IC0gM10gJiYgdiA9PSBhcmdiW2l4IC0gMl0gJiYgdiA9PSBhcmdiW2l4IC0gMV07Ci0gIH0gZWxzZSBpZiAoaXggPj0gMykgewotICAgIHJldHVybiB2ID09IGFyZ2JbaXggLSAzXSAmJiB2ID09IGFyZ2JbaXggLSAyXSAmJiB2ID09IGFyZ2JbaXggLSAxXTsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGZsb2F0IFByZWRpY3Rpb25Db3N0Q3Jvc3NDb2xvcihjb25zdCBpbnQgYWNjdW11bGF0ZWRbMjU2XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGNvdW50c1syNTZdKSB7Ci0gIC8vIEZhdm9yIGxvdyBlbnRyb3B5LCBsb2NhbGx5IGFuZCBnbG9iYWxseS4KLSAgLy8gRmF2b3Igc21hbGwgYWJzb2x1dGUgdmFsdWVzIGZvciBQcmVkaWN0aW9uQ29zdFNwYXRpYWwKLSAgc3RhdGljIGNvbnN0IGRvdWJsZSBrRXhwVmFsdWUgPSAyLjQ7Ci0gIHJldHVybiBDb21iaW5lZFNoYW5ub25FbnRyb3B5KGNvdW50cywgYWNjdW11bGF0ZWQsIDI1NikgKwotICAgICAgICAgUHJlZGljdGlvbkNvc3RTcGF0aWFsKGNvdW50cywgMywga0V4cFZhbHVlKTsKLX0KLQotc3RhdGljIE11bHRpcGxpZXJzIEdldEJlc3RDb2xvclRyYW5zZm9ybUZvclRpbGUoCi0gICAgaW50IHRpbGVfeCwgaW50IHRpbGVfeSwgaW50IGJpdHMsCi0gICAgTXVsdGlwbGllcnMgcHJldlgsCi0gICAgTXVsdGlwbGllcnMgcHJldlksCi0gICAgaW50IHN0ZXAsIGludCB4c2l6ZSwgaW50IHlzaXplLAotICAgIGludCogYWNjdW11bGF0ZWRfcmVkX2hpc3RvLAotICAgIGludCogYWNjdW11bGF0ZWRfYmx1ZV9oaXN0bywKLSAgICBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYikgewotICBmbG9hdCBiZXN0X2RpZmYgPSBNQVhfRElGRl9DT1NUOwotICBmbG9hdCBjdXJfZGlmZjsKLSAgY29uc3QgaW50IGhhbGZzdGVwID0gc3RlcCAvIDI7Ci0gIGNvbnN0IGludCBtYXhfdGlsZV9zaXplID0gMSA8PCBiaXRzOwotICBjb25zdCBpbnQgdGlsZV95X29mZnNldCA9IHRpbGVfeSAqIG1heF90aWxlX3NpemU7Ci0gIGNvbnN0IGludCB0aWxlX3hfb2Zmc2V0ID0gdGlsZV94ICogbWF4X3RpbGVfc2l6ZTsKLSAgaW50IGdyZWVuX3RvX3JlZDsKLSAgaW50IGdyZWVuX3RvX2JsdWU7Ci0gIGludCByZWRfdG9fYmx1ZTsKLSAgaW50IGFsbF94X21heCA9IHRpbGVfeF9vZmZzZXQgKyBtYXhfdGlsZV9zaXplOwotICBpbnQgYWxsX3lfbWF4ID0gdGlsZV95X29mZnNldCArIG1heF90aWxlX3NpemU7Ci0gIE11bHRpcGxpZXJzIGJlc3RfdHg7Ci0gIE11bHRpcGxpZXJzQ2xlYXIoJmJlc3RfdHgpOwotICBpZiAoYWxsX3hfbWF4ID4geHNpemUpIHsKLSAgICBhbGxfeF9tYXggPSB4c2l6ZTsKLSAgfQotICBpZiAoYWxsX3lfbWF4ID4geXNpemUpIHsKLSAgICBhbGxfeV9tYXggPSB5c2l6ZTsKLSAgfQotCi0gIGZvciAoZ3JlZW5fdG9fcmVkID0gLTY0OyBncmVlbl90b19yZWQgPD0gNjQ7IGdyZWVuX3RvX3JlZCArPSBoYWxmc3RlcCkgewotICAgIGludCBoaXN0b1syNTZdID0geyAwIH07Ci0gICAgaW50IGFsbF95OwotCi0gICAgZm9yIChhbGxfeSA9IHRpbGVfeV9vZmZzZXQ7IGFsbF95IDwgYWxsX3lfbWF4OyArK2FsbF95KSB7Ci0gICAgICBpbnQgaXggPSBhbGxfeSAqIHhzaXplICsgdGlsZV94X29mZnNldDsKLSAgICAgIGludCBhbGxfeDsKLSAgICAgIGZvciAoYWxsX3ggPSB0aWxlX3hfb2Zmc2V0OyBhbGxfeCA8IGFsbF94X21heDsgKythbGxfeCwgKytpeCkgewotICAgICAgICBpZiAoU2tpcFJlcGVhdGVkUGl4ZWxzKGFyZ2IsIGl4LCB4c2l6ZSkpIHsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICArK2hpc3RvW1RyYW5zZm9ybUNvbG9yUmVkKGdyZWVuX3RvX3JlZCwgYXJnYltpeF0pXTsgIC8vIHJlZC4KLSAgICAgIH0KLSAgICB9Ci0gICAgY3VyX2RpZmYgPSBQcmVkaWN0aW9uQ29zdENyb3NzQ29sb3IoJmFjY3VtdWxhdGVkX3JlZF9oaXN0b1swXSwgJmhpc3RvWzBdKTsKLSAgICBpZiAoKHVpbnQ4X3QpZ3JlZW5fdG9fcmVkID09IHByZXZYLmdyZWVuX3RvX3JlZF8pIHsKLSAgICAgIGN1cl9kaWZmIC09IDM7ICAvLyBmYXZvciBrZWVwaW5nIHRoZSBhcmVhcyBsb2NhbGx5IHNpbWlsYXIKLSAgICB9Ci0gICAgaWYgKCh1aW50OF90KWdyZWVuX3RvX3JlZCA9PSBwcmV2WS5ncmVlbl90b19yZWRfKSB7Ci0gICAgICBjdXJfZGlmZiAtPSAzOyAgLy8gZmF2b3Iga2VlcGluZyB0aGUgYXJlYXMgbG9jYWxseSBzaW1pbGFyCi0gICAgfQotICAgIGlmIChncmVlbl90b19yZWQgPT0gMCkgewotICAgICAgY3VyX2RpZmYgLT0gMzsKLSAgICB9Ci0gICAgaWYgKGN1cl9kaWZmIDwgYmVzdF9kaWZmKSB7Ci0gICAgICBiZXN0X2RpZmYgPSBjdXJfZGlmZjsKLSAgICAgIGJlc3RfdHguZ3JlZW5fdG9fcmVkXyA9IGdyZWVuX3RvX3JlZDsKLSAgICB9Ci0gIH0KLSAgYmVzdF9kaWZmID0gTUFYX0RJRkZfQ09TVDsKLSAgZm9yIChncmVlbl90b19ibHVlID0gLTMyOyBncmVlbl90b19ibHVlIDw9IDMyOyBncmVlbl90b19ibHVlICs9IHN0ZXApIHsKLSAgICBmb3IgKHJlZF90b19ibHVlID0gLTMyOyByZWRfdG9fYmx1ZSA8PSAzMjsgcmVkX3RvX2JsdWUgKz0gc3RlcCkgewotICAgICAgaW50IGFsbF95OwotICAgICAgaW50IGhpc3RvWzI1Nl0gPSB7IDAgfTsKLSAgICAgIGZvciAoYWxsX3kgPSB0aWxlX3lfb2Zmc2V0OyBhbGxfeSA8IGFsbF95X21heDsgKythbGxfeSkgewotICAgICAgICBpbnQgYWxsX3g7Ci0gICAgICAgIGludCBpeCA9IGFsbF95ICogeHNpemUgKyB0aWxlX3hfb2Zmc2V0OwotICAgICAgICBmb3IgKGFsbF94ID0gdGlsZV94X29mZnNldDsgYWxsX3ggPCBhbGxfeF9tYXg7ICsrYWxsX3gsICsraXgpIHsKLSAgICAgICAgICBpZiAoU2tpcFJlcGVhdGVkUGl4ZWxzKGFyZ2IsIGl4LCB4c2l6ZSkpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICArK2hpc3RvW1RyYW5zZm9ybUNvbG9yQmx1ZShncmVlbl90b19ibHVlLCByZWRfdG9fYmx1ZSwgYXJnYltpeF0pXTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY3VyX2RpZmYgPQotICAgICAgICAgIFByZWRpY3Rpb25Db3N0Q3Jvc3NDb2xvcigmYWNjdW11bGF0ZWRfYmx1ZV9oaXN0b1swXSwgJmhpc3RvWzBdKTsKLSAgICAgIGlmICgodWludDhfdClncmVlbl90b19ibHVlID09IHByZXZYLmdyZWVuX3RvX2JsdWVfKSB7Ci0gICAgICAgIGN1cl9kaWZmIC09IDM7ICAvLyBmYXZvciBrZWVwaW5nIHRoZSBhcmVhcyBsb2NhbGx5IHNpbWlsYXIKLSAgICAgIH0KLSAgICAgIGlmICgodWludDhfdClncmVlbl90b19ibHVlID09IHByZXZZLmdyZWVuX3RvX2JsdWVfKSB7Ci0gICAgICAgIGN1cl9kaWZmIC09IDM7ICAvLyBmYXZvciBrZWVwaW5nIHRoZSBhcmVhcyBsb2NhbGx5IHNpbWlsYXIKLSAgICAgIH0KLSAgICAgIGlmICgodWludDhfdClyZWRfdG9fYmx1ZSA9PSBwcmV2WC5yZWRfdG9fYmx1ZV8pIHsKLSAgICAgICAgY3VyX2RpZmYgLT0gMzsgIC8vIGZhdm9yIGtlZXBpbmcgdGhlIGFyZWFzIGxvY2FsbHkgc2ltaWxhcgotICAgICAgfQotICAgICAgaWYgKCh1aW50OF90KXJlZF90b19ibHVlID09IHByZXZZLnJlZF90b19ibHVlXykgewotICAgICAgICBjdXJfZGlmZiAtPSAzOyAgLy8gZmF2b3Iga2VlcGluZyB0aGUgYXJlYXMgbG9jYWxseSBzaW1pbGFyCi0gICAgICB9Ci0gICAgICBpZiAoZ3JlZW5fdG9fYmx1ZSA9PSAwKSB7Ci0gICAgICAgIGN1cl9kaWZmIC09IDM7Ci0gICAgICB9Ci0gICAgICBpZiAocmVkX3RvX2JsdWUgPT0gMCkgewotICAgICAgICBjdXJfZGlmZiAtPSAzOwotICAgICAgfQotICAgICAgaWYgKGN1cl9kaWZmIDwgYmVzdF9kaWZmKSB7Ci0gICAgICAgIGJlc3RfZGlmZiA9IGN1cl9kaWZmOwotICAgICAgICBiZXN0X3R4LmdyZWVuX3RvX2JsdWVfID0gZ3JlZW5fdG9fYmx1ZTsKLSAgICAgICAgYmVzdF90eC5yZWRfdG9fYmx1ZV8gPSByZWRfdG9fYmx1ZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGJlc3RfdHg7Ci19Ci0KLXN0YXRpYyB2b2lkIENvcHlUaWxlV2l0aENvbG9yVHJhbnNmb3JtKGludCB4c2l6ZSwgaW50IHlzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbGVfeCwgaW50IHRpbGVfeSwgaW50IGJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXBsaWVycyBjb2xvcl90cmFuc2Zvcm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogY29uc3QgYXJnYikgewotICBpbnQgeTsKLSAgaW50IHhzY2FuID0gMSA8PCBiaXRzOwotICBpbnQgeXNjYW4gPSAxIDw8IGJpdHM7Ci0gIHRpbGVfeCA8PD0gYml0czsKLSAgdGlsZV95IDw8PSBiaXRzOwotICBpZiAoeHNjYW4gPiB4c2l6ZSAtIHRpbGVfeCkgewotICAgIHhzY2FuID0geHNpemUgLSB0aWxlX3g7Ci0gIH0KLSAgaWYgKHlzY2FuID4geXNpemUgLSB0aWxlX3kpIHsKLSAgICB5c2NhbiA9IHlzaXplIC0gdGlsZV95OwotICB9Ci0gIHlzY2FuICs9IHRpbGVfeTsKLSAgZm9yICh5ID0gdGlsZV95OyB5IDwgeXNjYW47ICsreSkgewotICAgIGludCBpeCA9IHkgKiB4c2l6ZSArIHRpbGVfeDsKLSAgICBjb25zdCBpbnQgZW5kX2l4ID0gaXggKyB4c2NhbjsKLSAgICBmb3IgKDsgaXggPCBlbmRfaXg7ICsraXgpIHsKLSAgICAgIGFyZ2JbaXhdID0gVHJhbnNmb3JtQ29sb3IoJmNvbG9yX3RyYW5zZm9ybSwgYXJnYltpeF0sIDApOwotICAgIH0KLSAgfQotfQotCi12b2lkIFZQOExDb2xvclNwYWNlVHJhbnNmb3JtKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJpdHMsIGludCBzdGVwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogY29uc3QgYXJnYiwgdWludDMyX3QqIGltYWdlKSB7Ci0gIGNvbnN0IGludCBtYXhfdGlsZV9zaXplID0gMSA8PCBiaXRzOwotICBpbnQgdGlsZV94c2l6ZSA9IFZQOExTdWJTYW1wbGVTaXplKHdpZHRoLCBiaXRzKTsKLSAgaW50IHRpbGVfeXNpemUgPSBWUDhMU3ViU2FtcGxlU2l6ZShoZWlnaHQsIGJpdHMpOwotICBpbnQgYWNjdW11bGF0ZWRfcmVkX2hpc3RvWzI1Nl0gPSB7IDAgfTsKLSAgaW50IGFjY3VtdWxhdGVkX2JsdWVfaGlzdG9bMjU2XSA9IHsgMCB9OwotICBpbnQgdGlsZV95OwotICBpbnQgdGlsZV94OwotICBNdWx0aXBsaWVycyBwcmV2WDsKLSAgTXVsdGlwbGllcnMgcHJldlk7Ci0gIE11bHRpcGxpZXJzQ2xlYXIoJnByZXZZKTsKLSAgTXVsdGlwbGllcnNDbGVhcigmcHJldlgpOwotICBmb3IgKHRpbGVfeSA9IDA7IHRpbGVfeSA8IHRpbGVfeXNpemU7ICsrdGlsZV95KSB7Ci0gICAgZm9yICh0aWxlX3ggPSAwOyB0aWxlX3ggPCB0aWxlX3hzaXplOyArK3RpbGVfeCkgewotICAgICAgTXVsdGlwbGllcnMgY29sb3JfdHJhbnNmb3JtOwotICAgICAgaW50IGFsbF94X21heDsKLSAgICAgIGludCB5OwotICAgICAgY29uc3QgaW50IHRpbGVfeV9vZmZzZXQgPSB0aWxlX3kgKiBtYXhfdGlsZV9zaXplOwotICAgICAgY29uc3QgaW50IHRpbGVfeF9vZmZzZXQgPSB0aWxlX3ggKiBtYXhfdGlsZV9zaXplOwotICAgICAgaWYgKHRpbGVfeSAhPSAwKSB7Ci0gICAgICAgIENvbG9yQ29kZVRvTXVsdGlwbGllcnMoaW1hZ2VbdGlsZV95ICogdGlsZV94c2l6ZSArIHRpbGVfeCAtIDFdLCAmcHJldlgpOwotICAgICAgICBDb2xvckNvZGVUb011bHRpcGxpZXJzKGltYWdlWyh0aWxlX3kgLSAxKSAqIHRpbGVfeHNpemUgKyB0aWxlX3hdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmV2WSk7Ci0gICAgICB9IGVsc2UgaWYgKHRpbGVfeCAhPSAwKSB7Ci0gICAgICAgIENvbG9yQ29kZVRvTXVsdGlwbGllcnMoaW1hZ2VbdGlsZV95ICogdGlsZV94c2l6ZSArIHRpbGVfeCAtIDFdLCAmcHJldlgpOwotICAgICAgfQotICAgICAgY29sb3JfdHJhbnNmb3JtID0KLSAgICAgICAgICBHZXRCZXN0Q29sb3JUcmFuc2Zvcm1Gb3JUaWxlKHRpbGVfeCwgdGlsZV95LCBiaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldlgsIHByZXZZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcCwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhY2N1bXVsYXRlZF9yZWRfaGlzdG9bMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWNjdW11bGF0ZWRfYmx1ZV9oaXN0b1swXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ2IpOwotICAgICAgaW1hZ2VbdGlsZV95ICogdGlsZV94c2l6ZSArIHRpbGVfeF0gPQotICAgICAgICAgIE11bHRpcGxpZXJzVG9Db2xvckNvZGUoJmNvbG9yX3RyYW5zZm9ybSk7Ci0gICAgICBDb3B5VGlsZVdpdGhDb2xvclRyYW5zZm9ybSh3aWR0aCwgaGVpZ2h0LCB0aWxlX3gsIHRpbGVfeSwgYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yX3RyYW5zZm9ybSwgYXJnYik7Ci0KLSAgICAgIC8vIEdhdGhlciBhY2N1bXVsYXRlZCBoaXN0b2dyYW0gZGF0YS4KLSAgICAgIGFsbF94X21heCA9IHRpbGVfeF9vZmZzZXQgKyBtYXhfdGlsZV9zaXplOwotICAgICAgaWYgKGFsbF94X21heCA+IHdpZHRoKSB7Ci0gICAgICAgIGFsbF94X21heCA9IHdpZHRoOwotICAgICAgfQotICAgICAgZm9yICh5ID0gMDsgeSA8IG1heF90aWxlX3NpemU7ICsreSkgewotICAgICAgICBpbnQgaXg7Ci0gICAgICAgIGludCBhbGxfeDsKLSAgICAgICAgaW50IGFsbF95ID0gdGlsZV95X29mZnNldCArIHk7Ci0gICAgICAgIGlmIChhbGxfeSA+PSBoZWlnaHQpIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpeCA9IGFsbF95ICogd2lkdGggKyB0aWxlX3hfb2Zmc2V0OwotICAgICAgICBmb3IgKGFsbF94ID0gdGlsZV94X29mZnNldDsgYWxsX3ggPCBhbGxfeF9tYXg7ICsrYWxsX3gsICsraXgpIHsKLSAgICAgICAgICBpZiAoaXggPj0gMiAmJgotICAgICAgICAgICAgICBhcmdiW2l4XSA9PSBhcmdiW2l4IC0gMl0gJiYKLSAgICAgICAgICAgICAgYXJnYltpeF0gPT0gYXJnYltpeCAtIDFdKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsgIC8vIHJlcGVhdGVkIHBpeGVscyBhcmUgaGFuZGxlZCBieSBiYWNrd2FyZCByZWZlcmVuY2VzCi0gICAgICAgICAgfQotICAgICAgICAgIGlmIChpeCA+PSB3aWR0aCArIDIgJiYKLSAgICAgICAgICAgICAgYXJnYltpeCAtIDJdID09IGFyZ2JbaXggLSB3aWR0aCAtIDJdICYmCi0gICAgICAgICAgICAgIGFyZ2JbaXggLSAxXSA9PSBhcmdiW2l4IC0gd2lkdGggLSAxXSAmJgotICAgICAgICAgICAgICBhcmdiW2l4XSA9PSBhcmdiW2l4IC0gd2lkdGhdKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsgIC8vIHJlcGVhdGVkIHBpeGVscyBhcmUgaGFuZGxlZCBieSBiYWNrd2FyZCByZWZlcmVuY2VzCi0gICAgICAgICAgfQotICAgICAgICAgICsrYWNjdW11bGF0ZWRfcmVkX2hpc3RvWyhhcmdiW2l4XSA+PiAxNikgJiAweGZmXTsKLSAgICAgICAgICArK2FjY3VtdWxhdGVkX2JsdWVfaGlzdG9bYXJnYltpeF0gJiAweGZmXTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0vLyBDb2xvciBzcGFjZSBpbnZlcnNlIHRyYW5zZm9ybS4KLXN0YXRpYyB2b2lkIENvbG9yU3BhY2VJbnZlcnNlVHJhbnNmb3JtKGNvbnN0IFZQOExUcmFuc2Zvcm0qIGNvbnN0IHRyYW5zZm9ybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5X3N0YXJ0LCBpbnQgeV9lbmQsIHVpbnQzMl90KiBkYXRhKSB7Ci0gIGNvbnN0IGludCB3aWR0aCA9IHRyYW5zZm9ybS0+eHNpemVfOwotICBjb25zdCBpbnQgbWFzayA9ICgxIDw8IHRyYW5zZm9ybS0+Yml0c18pIC0gMTsKLSAgY29uc3QgaW50IHRpbGVzX3Blcl9yb3cgPSBWUDhMU3ViU2FtcGxlU2l6ZSh3aWR0aCwgdHJhbnNmb3JtLT5iaXRzXyk7Ci0gIGludCB5ID0geV9zdGFydDsKLSAgY29uc3QgdWludDMyX3QqIHByZWRfcm93ID0KLSAgICAgIHRyYW5zZm9ybS0+ZGF0YV8gKyAoeSA+PiB0cmFuc2Zvcm0tPmJpdHNfKSAqIHRpbGVzX3Blcl9yb3c7Ci0KLSAgd2hpbGUgKHkgPCB5X2VuZCkgewotICAgIGNvbnN0IHVpbnQzMl90KiBwcmVkID0gcHJlZF9yb3c7Ci0gICAgTXVsdGlwbGllcnMgbSA9IHsgMCwgMCwgMCB9OwotICAgIGludCB4OwotCi0gICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKLSAgICAgIGlmICgoeCAmIG1hc2spID09IDApIENvbG9yQ29kZVRvTXVsdGlwbGllcnMoKnByZWQrKywgJm0pOwotICAgICAgZGF0YVt4XSA9IFRyYW5zZm9ybUNvbG9yKCZtLCBkYXRhW3hdLCAxKTsKLSAgICB9Ci0gICAgZGF0YSArPSB3aWR0aDsKLSAgICArK3k7Ci0gICAgaWYgKCh5ICYgbWFzaykgPT0gMCkgcHJlZF9yb3cgKz0gdGlsZXNfcGVyX3Jvdzs7Ci0gIH0KLX0KLQotLy8gU2VwYXJhdGUgb3V0IHBpeGVscyBwYWNrZWQgdG9nZXRoZXIgdXNpbmcgcGl4ZWwtYnVuZGxpbmcuCi0vLyBXZSBkZWZpbmUgdHdvIG1ldGhvZHMgZm9yIEFSR0IgZGF0YSAodWludDMyX3QpIGFuZCBhbHBoYS1vbmx5IGRhdGEgKHVpbnQ4X3QpLgotI2RlZmluZSBDT0xPUl9JTkRFWF9JTlZFUlNFKEZVTkNfTkFNRSwgVFlQRSwgR0VUX0lOREVYLCBHRVRfVkFMVUUpICAgICAgICAgICAgIFwKLXZvaWQgRlVOQ19OQU1FKGNvbnN0IFZQOExUcmFuc2Zvcm0qIGNvbnN0IHRyYW5zZm9ybSwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICBpbnQgeV9zdGFydCwgaW50IHlfZW5kLCBjb25zdCBUWVBFKiBzcmMsIFRZUEUqIGRzdCkgeyAgICAgICAgICAgXAotICBpbnQgeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgaW50IGJpdHNfcGVyX3BpeGVsID0gOCA+PiB0cmFuc2Zvcm0tPmJpdHNfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IGludCB3aWR0aCA9IHRyYW5zZm9ybS0+eHNpemVfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCB1aW50MzJfdCogY29uc3QgY29sb3JfbWFwID0gdHJhbnNmb3JtLT5kYXRhXzsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaWYgKGJpdHNfcGVyX3BpeGVsIDwgOCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY29uc3QgaW50IHBpeGVsc19wZXJfYnl0ZSA9IDEgPDwgdHJhbnNmb3JtLT5iaXRzXzsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNvbnN0IGludCBjb3VudF9tYXNrID0gcGl4ZWxzX3Blcl9ieXRlIC0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjb25zdCB1aW50MzJfdCBiaXRfbWFzayA9ICgxIDw8IGJpdHNfcGVyX3BpeGVsKSAtIDE7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZm9yICh5ID0geV9zdGFydDsgeSA8IHlfZW5kOyArK3kpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgdWludDMyX3QgcGFja2VkX3BpeGVscyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGludCB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7ICsreCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAvKiBXZSBuZWVkIHRvIGxvYWQgZnJlc2ggJ3BhY2tlZF9waXhlbHMnIG9uY2UgZXZlcnkgICAgICAgICAgICAgICAgKi8gIFwKLSAgICAgICAgLyogJ3BpeGVsc19wZXJfYnl0ZScgaW5jcmVtZW50cyBvZiB4LiBGb3J0dW5hdGVseSwgcGl4ZWxzX3Blcl9ieXRlICovICBcCi0gICAgICAgIC8qIGlzIGEgcG93ZXIgb2YgMiwgc28gY2FuIGp1c3QgdXNlIGEgbWFzayBmb3IgdGhhdCwgaW5zdGVhZCBvZiAgICAqLyAgXAotICAgICAgICAvKiBkZWNyZW1lbnRpbmcgYSBjb3VudGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gIFwKLSAgICAgICAgaWYgKCh4ICYgY291bnRfbWFzaykgPT0gMCkgcGFja2VkX3BpeGVscyA9IEdFVF9JTkRFWCgqc3JjKyspOyAgICAgICAgICBcCi0gICAgICAgICpkc3QrKyA9IEdFVF9WQUxVRShjb2xvcl9tYXBbcGFja2VkX3BpeGVscyAmIGJpdF9tYXNrXSk7ICAgICAgICAgICAgICAgXAotICAgICAgICBwYWNrZWRfcGl4ZWxzID4+PSBiaXRzX3Blcl9waXhlbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmb3IgKHkgPSB5X3N0YXJ0OyB5IDwgeV9lbmQ7ICsreSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBpbnQgeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKmRzdCsrID0gR0VUX1ZBTFVFKGNvbG9yX21hcFtHRVRfSU5ERVgoKnNyYysrKV0pOyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBHZXRBUkdCSW5kZXgodWludDMyX3QgaWR4KSB7Ci0gIHJldHVybiAoaWR4ID4+IDgpICYgMHhmZjsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ4X3QgR2V0QWxwaGFJbmRleCh1aW50OF90IGlkeCkgewotICByZXR1cm4gaWR4OwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgR2V0QVJHQlZhbHVlKHVpbnQzMl90IHZhbCkgewotICByZXR1cm4gdmFsOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDhfdCBHZXRBbHBoYVZhbHVlKHVpbnQzMl90IHZhbCkgewotICByZXR1cm4gKHZhbCA+PiA4KSAmIDB4ZmY7Ci19Ci0KLXN0YXRpYyBDT0xPUl9JTkRFWF9JTlZFUlNFKENvbG9ySW5kZXhJbnZlcnNlVHJhbnNmb3JtLCB1aW50MzJfdCwgR2V0QVJHQkluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0QVJHQlZhbHVlKQotQ09MT1JfSU5ERVhfSU5WRVJTRShWUDhMQ29sb3JJbmRleEludmVyc2VUcmFuc2Zvcm1BbHBoYSwgdWludDhfdCwgR2V0QWxwaGFJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgR2V0QWxwaGFWYWx1ZSkKLQotI3VuZGVmIENPTE9SX0lOREVYX0lOVkVSU0UKLQotdm9pZCBWUDhMSW52ZXJzZVRyYW5zZm9ybShjb25zdCBWUDhMVHJhbnNmb3JtKiBjb25zdCB0cmFuc2Zvcm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3dfc3RhcnQsIGludCByb3dfZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgaW4sIHVpbnQzMl90KiBjb25zdCBvdXQpIHsKLSAgU0JfRENIRUNLKHJvd19zdGFydCA8IHJvd19lbmQpOwotICBTQl9EQ0hFQ0socm93X2VuZCA8PSB0cmFuc2Zvcm0tPnlzaXplXyk7Ci0gIHN3aXRjaCAodHJhbnNmb3JtLT50eXBlXykgewotICAgIGNhc2UgU1VCVFJBQ1RfR1JFRU46Ci0gICAgICBBZGRHcmVlblRvQmx1ZUFuZFJlZCh0cmFuc2Zvcm0sIHJvd19zdGFydCwgcm93X2VuZCwgb3V0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUFJFRElDVE9SX1RSQU5TRk9STToKLSAgICAgIFByZWRpY3RvckludmVyc2VUcmFuc2Zvcm0odHJhbnNmb3JtLCByb3dfc3RhcnQsIHJvd19lbmQsIG91dCk7Ci0gICAgICBpZiAocm93X2VuZCAhPSB0cmFuc2Zvcm0tPnlzaXplXykgewotICAgICAgICAvLyBUaGUgbGFzdCBwcmVkaWN0ZWQgcm93IGluIHRoaXMgaXRlcmF0aW9uIHdpbGwgYmUgdGhlIHRvcC1wcmVkIHJvdwotICAgICAgICAvLyBmb3IgdGhlIGZpcnN0IHJvdyBpbiBuZXh0IGl0ZXJhdGlvbi4KLSAgICAgICAgY29uc3QgaW50IHdpZHRoID0gdHJhbnNmb3JtLT54c2l6ZV87Ci0gICAgICAgIFNiTWVtb3J5Q29weShvdXQgLSB3aWR0aCwgb3V0ICsgKHJvd19lbmQgLSByb3dfc3RhcnQgLSAxKSAqIHdpZHRoLAotICAgICAgICAgICAgICAgd2lkdGggKiBzaXplb2YoKm91dCkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDUk9TU19DT0xPUl9UUkFOU0ZPUk06Ci0gICAgICBDb2xvclNwYWNlSW52ZXJzZVRyYW5zZm9ybSh0cmFuc2Zvcm0sIHJvd19zdGFydCwgcm93X2VuZCwgb3V0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ09MT1JfSU5ERVhJTkdfVFJBTlNGT1JNOgotICAgICAgaWYgKGluID09IG91dCAmJiB0cmFuc2Zvcm0tPmJpdHNfID4gMCkgewotICAgICAgICAvLyBNb3ZlIHBhY2tlZCBwaXhlbHMgdG8gdGhlIGVuZCBvZiB1bnBhY2tlZCByZWdpb24sIHNvIHRoYXQgdW5wYWNraW5nCi0gICAgICAgIC8vIGNhbiBvY2N1ciBzZWFtbGVzc2x5LgotICAgICAgICAvLyBBbHNvLCBub3RlIHRoYXQgdGhpcyBpcyB0aGUgb25seSB0cmFuc2Zvcm0gdGhhdCBhcHBsaWVzIG9uCi0gICAgICAgIC8vIHRoZSBlZmZlY3RpdmUgd2lkdGggb2YgVlA4TFN1YlNhbXBsZVNpemUoeHNpemVfLCBiaXRzXykuIEFsbCBvdGhlcgotICAgICAgICAvLyB0cmFuc2Zvcm1zIHdvcmsgb24gZWZmZWN0aXZlIHdpZHRoIG9mIHhzaXplXy4KLSAgICAgICAgY29uc3QgaW50IG91dF9zdHJpZGUgPSAocm93X2VuZCAtIHJvd19zdGFydCkgKiB0cmFuc2Zvcm0tPnhzaXplXzsKLSAgICAgICAgY29uc3QgaW50IGluX3N0cmlkZSA9IChyb3dfZW5kIC0gcm93X3N0YXJ0KSAqCi0gICAgICAgICAgICBWUDhMU3ViU2FtcGxlU2l6ZSh0cmFuc2Zvcm0tPnhzaXplXywgdHJhbnNmb3JtLT5iaXRzXyk7Ci0gICAgICAgIHVpbnQzMl90KiBjb25zdCBzcmMgPSBvdXQgKyBvdXRfc3RyaWRlIC0gaW5fc3RyaWRlOwotICAgICAgICBTYk1lbW9yeU1vdmUoc3JjLCBvdXQsIGluX3N0cmlkZSAqIHNpemVvZigqc3JjKSk7Ci0gICAgICAgIENvbG9ySW5kZXhJbnZlcnNlVHJhbnNmb3JtKHRyYW5zZm9ybSwgcm93X3N0YXJ0LCByb3dfZW5kLCBzcmMsIG91dCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBDb2xvckluZGV4SW52ZXJzZVRyYW5zZm9ybSh0cmFuc2Zvcm0sIHJvd19zdGFydCwgcm93X2VuZCwgaW4sIG91dCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgfQotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29sb3Igc3BhY2UgY29udmVyc2lvbi4KLQotc3RhdGljIGludCBpc19iaWdfZW5kaWFuKHZvaWQpIHsKLSAgc3RhdGljIGNvbnN0IHVuaW9uIHsKLSAgICB1aW50MTZfdCB3OwotICAgIHVpbnQ4X3QgYlsyXTsKLSAgfSB0bXAgPSB7IDEgfTsKLSAgcmV0dXJuICh0bXAuYlswXSAhPSAxKTsKLX0KLQotc3RhdGljIHZvaWQgQ29udmVydEJHUkFUb1JHQihjb25zdCB1aW50MzJfdCogc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDhfdCogZHN0KSB7Ci0gIGNvbnN0IHVpbnQzMl90KiBjb25zdCBzcmNfZW5kID0gc3JjICsgbnVtX3BpeGVsczsKLSAgd2hpbGUgKHNyYyA8IHNyY19lbmQpIHsKLSAgICBjb25zdCB1aW50MzJfdCBhcmdiID0gKnNyYysrOwotICAgICpkc3QrKyA9IChhcmdiID4+IDE2KSAmIDB4ZmY7Ci0gICAgKmRzdCsrID0gKGFyZ2IgPj4gIDgpICYgMHhmZjsKLSAgICAqZHN0KysgPSAoYXJnYiA+PiAgMCkgJiAweGZmOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIENvbnZlcnRCR1JBVG9SR0JBKGNvbnN0IHVpbnQzMl90KiBzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDhfdCogZHN0KSB7Ci0gIGNvbnN0IHVpbnQzMl90KiBjb25zdCBzcmNfZW5kID0gc3JjICsgbnVtX3BpeGVsczsKLSAgd2hpbGUgKHNyYyA8IHNyY19lbmQpIHsKLSAgICBjb25zdCB1aW50MzJfdCBhcmdiID0gKnNyYysrOwotICAgICpkc3QrKyA9IChhcmdiID4+IDE2KSAmIDB4ZmY7Ci0gICAgKmRzdCsrID0gKGFyZ2IgPj4gIDgpICYgMHhmZjsKLSAgICAqZHN0KysgPSAoYXJnYiA+PiAgMCkgJiAweGZmOwotICAgICpkc3QrKyA9IChhcmdiID4+IDI0KSAmIDB4ZmY7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgQ29udmVydEJHUkFUb1JHQkE0NDQ0KGNvbnN0IHVpbnQzMl90KiBzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQ4X3QqIGRzdCkgewotICBjb25zdCB1aW50MzJfdCogY29uc3Qgc3JjX2VuZCA9IHNyYyArIG51bV9waXhlbHM7Ci0gIHdoaWxlIChzcmMgPCBzcmNfZW5kKSB7Ci0gICAgY29uc3QgdWludDMyX3QgYXJnYiA9ICpzcmMrKzsKLSAgICBjb25zdCB1aW50OF90IHJnID0gKChhcmdiID4+IDE2KSAmIDB4ZjApIHwgKChhcmdiID4+IDEyKSAmIDB4Zik7Ci0gICAgY29uc3QgdWludDhfdCBiYSA9ICgoYXJnYiA+PiAgMCkgJiAweGYwKSB8ICgoYXJnYiA+PiAyOCkgJiAweGYpOwotI2lmZGVmIFdFQlBfU1dBUF8xNkJJVF9DU1AKLSAgICAqZHN0KysgPSBiYTsKLSAgICAqZHN0KysgPSByZzsKLSNlbHNlCi0gICAgKmRzdCsrID0gcmc7Ci0gICAgKmRzdCsrID0gYmE7Ci0jZW5kaWYKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBDb252ZXJ0QkdSQVRvUkdCNTY1KGNvbnN0IHVpbnQzMl90KiBzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50OF90KiBkc3QpIHsKLSAgY29uc3QgdWludDMyX3QqIGNvbnN0IHNyY19lbmQgPSBzcmMgKyBudW1fcGl4ZWxzOwotICB3aGlsZSAoc3JjIDwgc3JjX2VuZCkgewotICAgIGNvbnN0IHVpbnQzMl90IGFyZ2IgPSAqc3JjKys7Ci0gICAgY29uc3QgdWludDhfdCByZyA9ICgoYXJnYiA+PiAxNikgJiAweGY4KSB8ICgoYXJnYiA+PiAxMykgJiAweDcpOwotICAgIGNvbnN0IHVpbnQ4X3QgZ2IgPSAoKGFyZ2IgPj4gIDUpICYgMHhlMCkgfCAoKGFyZ2IgPj4gIDMpICYgMHgxZik7Ci0jaWZkZWYgV0VCUF9TV0FQXzE2QklUX0NTUAotICAgICpkc3QrKyA9IGdiOwotICAgICpkc3QrKyA9IHJnOwotI2Vsc2UKLSAgICAqZHN0KysgPSByZzsKLSAgICAqZHN0KysgPSBnYjsKLSNlbmRpZgotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIENvbnZlcnRCR1JBVG9CR1IoY29uc3QgdWludDMyX3QqIHNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQ4X3QqIGRzdCkgewotICBjb25zdCB1aW50MzJfdCogY29uc3Qgc3JjX2VuZCA9IHNyYyArIG51bV9waXhlbHM7Ci0gIHdoaWxlIChzcmMgPCBzcmNfZW5kKSB7Ci0gICAgY29uc3QgdWludDMyX3QgYXJnYiA9ICpzcmMrKzsKLSAgICAqZHN0KysgPSAoYXJnYiA+PiAgMCkgJiAweGZmOwotICAgICpkc3QrKyA9IChhcmdiID4+ICA4KSAmIDB4ZmY7Ci0gICAgKmRzdCsrID0gKGFyZ2IgPj4gMTYpICYgMHhmZjsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBDb3B5T3JTd2FwKGNvbnN0IHVpbnQzMl90KiBzcmMsIGludCBudW1fcGl4ZWxzLCB1aW50OF90KiBkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBzd2FwX29uX2JpZ19lbmRpYW4pIHsKLSAgaWYgKGlzX2JpZ19lbmRpYW4oKSA9PSBzd2FwX29uX2JpZ19lbmRpYW4pIHsKLSAgICBjb25zdCB1aW50MzJfdCogY29uc3Qgc3JjX2VuZCA9IHNyYyArIG51bV9waXhlbHM7Ci0gICAgd2hpbGUgKHNyYyA8IHNyY19lbmQpIHsKLSAgICAgIHVpbnQzMl90IGFyZ2IgPSAqc3JjKys7Ci0KLSNpZiAhZGVmaW5lZChfX0JJR19FTkRJQU5fXykKLSNpZiAhZGVmaW5lZChXRUJQX1JFRkVSRU5DRV9JTVBMRU1FTlRBVElPTikKLSNpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCi0gICAgICBfX2FzbV9fIHZvbGF0aWxlKCJic3dhcCAlMCIgOiAiPXIiKGFyZ2IpIDogIjAiKGFyZ2IpKTsKLSAgICAgICoodWludDMyX3QqKWRzdCA9IGFyZ2I7Ci0jZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQotICAgICAgYXJnYiA9IF9ieXRlc3dhcF91bG9uZyhhcmdiKTsKLSAgICAgICoodWludDMyX3QqKWRzdCA9IGFyZ2I7Ci0jZWxzZQotICAgICAgZHN0WzBdID0gKGFyZ2IgPj4gMjQpICYgMHhmZjsKLSAgICAgIGRzdFsxXSA9IChhcmdiID4+IDE2KSAmIDB4ZmY7Ci0gICAgICBkc3RbMl0gPSAoYXJnYiA+PiAgOCkgJiAweGZmOwotICAgICAgZHN0WzNdID0gKGFyZ2IgPj4gIDApICYgMHhmZjsKLSNlbmRpZgotI2Vsc2UgIC8vIFdFQlBfUkVGRVJFTkNFX0lNUExFTUVOVEFUSU9OCi0gICAgICBkc3RbMF0gPSAoYXJnYiA+PiAyNCkgJiAweGZmOwotICAgICAgZHN0WzFdID0gKGFyZ2IgPj4gMTYpICYgMHhmZjsKLSAgICAgIGRzdFsyXSA9IChhcmdiID4+ICA4KSAmIDB4ZmY7Ci0gICAgICBkc3RbM10gPSAoYXJnYiA+PiAgMCkgJiAweGZmOwotI2VuZGlmCi0jZWxzZSAgLy8gX19CSUdfRU5ESUFOX18KLSAgICAgIGRzdFswXSA9IChhcmdiID4+ICAwKSAmIDB4ZmY7Ci0gICAgICBkc3RbMV0gPSAoYXJnYiA+PiAgOCkgJiAweGZmOwotICAgICAgZHN0WzJdID0gKGFyZ2IgPj4gMTYpICYgMHhmZjsKLSAgICAgIGRzdFszXSA9IChhcmdiID4+IDI0KSAmIDB4ZmY7Ci0jZW5kaWYKLSAgICAgIGRzdCArPSBzaXplb2YoYXJnYik7Ci0gICAgfQotICB9IGVsc2UgewotICAgIFNiTWVtb3J5Q29weShkc3QsIHNyYywgbnVtX3BpeGVscyAqIHNpemVvZigqc3JjKSk7Ci0gIH0KLX0KLQotdm9pZCBWUDhMQ29udmVydEZyb21CR1JBKGNvbnN0IHVpbnQzMl90KiBjb25zdCBpbl9kYXRhLCBpbnQgbnVtX3BpeGVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICBXRUJQX0NTUF9NT0RFIG91dF9jb2xvcnNwYWNlLCB1aW50OF90KiBjb25zdCByZ2JhKSB7Ci0gIHN3aXRjaCAob3V0X2NvbG9yc3BhY2UpIHsKLSAgICBjYXNlIE1PREVfUkdCOgotICAgICAgQ29udmVydEJHUkFUb1JHQihpbl9kYXRhLCBudW1fcGl4ZWxzLCByZ2JhKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTU9ERV9SR0JBOgotICAgICAgQ29udmVydEJHUkFUb1JHQkEoaW5fZGF0YSwgbnVtX3BpeGVscywgcmdiYSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE1PREVfcmdiQToKLSAgICAgIENvbnZlcnRCR1JBVG9SR0JBKGluX2RhdGEsIG51bV9waXhlbHMsIHJnYmEpOwotICAgICAgV2ViUEFwcGx5QWxwaGFNdWx0aXBseShyZ2JhLCAwLCBudW1fcGl4ZWxzLCAxLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTU9ERV9CR1I6Ci0gICAgICBDb252ZXJ0QkdSQVRvQkdSKGluX2RhdGEsIG51bV9waXhlbHMsIHJnYmEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNT0RFX0JHUkE6Ci0gICAgICBDb3B5T3JTd2FwKGluX2RhdGEsIG51bV9waXhlbHMsIHJnYmEsIDEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNT0RFX2JnckE6Ci0gICAgICBDb3B5T3JTd2FwKGluX2RhdGEsIG51bV9waXhlbHMsIHJnYmEsIDEpOwotICAgICAgV2ViUEFwcGx5QWxwaGFNdWx0aXBseShyZ2JhLCAwLCBudW1fcGl4ZWxzLCAxLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTU9ERV9BUkdCOgotICAgICAgQ29weU9yU3dhcChpbl9kYXRhLCBudW1fcGl4ZWxzLCByZ2JhLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTU9ERV9BcmdiOgotICAgICAgQ29weU9yU3dhcChpbl9kYXRhLCBudW1fcGl4ZWxzLCByZ2JhLCAwKTsKLSAgICAgIFdlYlBBcHBseUFscGhhTXVsdGlwbHkocmdiYSwgMSwgbnVtX3BpeGVscywgMSwgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE1PREVfUkdCQV80NDQ0OgotICAgICAgQ29udmVydEJHUkFUb1JHQkE0NDQ0KGluX2RhdGEsIG51bV9waXhlbHMsIHJnYmEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNT0RFX3JnYkFfNDQ0NDoKLSAgICAgIENvbnZlcnRCR1JBVG9SR0JBNDQ0NChpbl9kYXRhLCBudW1fcGl4ZWxzLCByZ2JhKTsKLSAgICAgIFdlYlBBcHBseUFscGhhTXVsdGlwbHk0NDQ0KHJnYmEsIG51bV9waXhlbHMsIDEsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNT0RFX1JHQl81NjU6Ci0gICAgICBDb252ZXJ0QkdSQVRvUkdCNTY1KGluX2RhdGEsIG51bV9waXhlbHMsIHJnYmEpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIFNCX0RDSEVDSygwKTsgICAgICAgICAgLy8gQ29kZSBmbG93IHNob3VsZCBub3QgcmVhY2ggaGVyZS4KLSAgfQotfQotCi0vLyBCdW5kbGVzIG11bHRpcGxlICgxLCAyLCA0IG9yIDgpIHBpeGVscyBpbnRvIGEgc2luZ2xlIHBpeGVsLgotdm9pZCBWUDhMQnVuZGxlQ29sb3JNYXAoY29uc3QgdWludDhfdCogY29uc3Qgcm93LCBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgeGJpdHMsIHVpbnQzMl90KiBjb25zdCBkc3QpIHsKLSAgaW50IHg7Ci0gIGlmICh4Yml0cyA+IDApIHsKLSAgICBjb25zdCBpbnQgYml0X2RlcHRoID0gMSA8PCAoMyAtIHhiaXRzKTsKLSAgICBjb25zdCBpbnQgbWFzayA9ICgxIDw8IHhiaXRzKSAtIDE7Ci0gICAgdWludDMyX3QgY29kZSA9IDB4ZmYwMDAwMDA7Ci0gICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKLSAgICAgIGNvbnN0IGludCB4c3ViID0geCAmIG1hc2s7Ci0gICAgICBpZiAoeHN1YiA9PSAwKSB7Ci0gICAgICAgIGNvZGUgPSAweGZmMDAwMDAwOwotICAgICAgfQotICAgICAgY29kZSB8PSByb3dbeF0gPDwgKDggKyBiaXRfZGVwdGggKiB4c3ViKTsKLSAgICAgIGRzdFt4ID4+IHhiaXRzXSA9IGNvZGU7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgKyt4KSBkc3RbeF0gPSAweGZmMDAwMDAwIHwgKHJvd1t4XSA8PCA4KTsKLSAgfQotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RzcC9sb3NzbGVzcy5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL2xvc3NsZXNzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0OTBlYzguLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL2xvc3NsZXNzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIEltYWdlIHRyYW5zZm9ybXMgYW5kIGNvbG9yIHNwYWNlIGNvbnZlcnNpb24gbWV0aG9kcyBmb3IgbG9zc2xlc3MgZGVjb2Rlci4KLS8vCi0vLyBBdXRob3JzOiBWaWthcyBBcm9yYSAodmlrYWFzLmFyb3JhQGdtYWlsLmNvbSkKLS8vICAgICAgICAgIEp5cmtpIEFsYWt1aWphbGEgKGp5cmtpQGdvb2dsZS5jb20pCi0KLSNpZm5kZWYgV0VCUF9EU1BfTE9TU0xFU1NfSF8KLSNkZWZpbmUgV0VCUF9EU1BfTE9TU0xFU1NfSF8KLQotI2luY2x1ZGUgIi4uL3dlYnAvdHlwZXMuaCIKLSNpbmNsdWRlICIuLi93ZWJwL2RlY29kZS5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEltYWdlIHRyYW5zZm9ybXMuCi0KLXN0cnVjdCBWUDhMVHJhbnNmb3JtOyAgLy8gRGVmaW5lZCBpbiBkZWMvdnA4bGkuaC4KLQotLy8gUGVyZm9ybXMgaW52ZXJzZSB0cmFuc2Zvcm0gb2YgZGF0YSBnaXZlbiB0cmFuc2Zvcm0gaW5mb3JtYXRpb24sIHN0YXJ0IGFuZCBlbmQKLS8vIHJvd3MuIFRyYW5zZm9ybSB3aWxsIGJlIGFwcGxpZWQgdG8gcm93cyBbcm93X3N0YXJ0LCByb3dfZW5kWy4KLS8vIFRoZSAqaW4gYW5kICpvdXQgcG9pbnRlcnMgcmVmZXIgdG8gc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkYXRhIHJlc3BlY3RpdmVseQotLy8gY29ycmVzcG9uZGluZyB0byB0aGUgaW50ZXJtZWRpYXRlIHJvdyAocm93X3N0YXJ0KS4KLXZvaWQgVlA4TEludmVyc2VUcmFuc2Zvcm0oY29uc3Qgc3RydWN0IFZQOExUcmFuc2Zvcm0qIGNvbnN0IHRyYW5zZm9ybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvd19zdGFydCwgaW50IHJvd19lbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBpbiwgdWludDMyX3QqIGNvbnN0IG91dCk7Ci0KLS8vIFNpbWlsYXIgdG8gdGhlIHN0YXRpYyBtZXRob2QgQ29sb3JJbmRleEludmVyc2VUcmFuc2Zvcm0oKSB0aGF0IGlzIHBhcnQgb2YKLS8vIGxvc3NsZXNzLmMsIGJ1dCB1c2VkIG9ubHkgZm9yIGFscGhhIGRlY29kaW5nLiBJdCB0YWtlcyB1aW50OF90IChyYXRoZXIgdGhhbgotLy8gdWludDMyX3QpIGFyZ3VtZW50cyBmb3IgJ3NyYycgYW5kICdkc3QnLgotdm9pZCBWUDhMQ29sb3JJbmRleEludmVyc2VUcmFuc2Zvcm1BbHBoYSgKLSAgICBjb25zdCBzdHJ1Y3QgVlA4TFRyYW5zZm9ybSogY29uc3QgdHJhbnNmb3JtLCBpbnQgeV9zdGFydCwgaW50IHlfZW5kLAotICAgIGNvbnN0IHVpbnQ4X3QqIHNyYywgdWludDhfdCogZHN0KTsKLQotLy8gU3VidHJhY3RzIGdyZWVuIGZyb20gYmx1ZSBhbmQgcmVkIGNoYW5uZWxzLgotdm9pZCBWUDhMU3VidHJhY3RHcmVlbkZyb21CbHVlQW5kUmVkKHVpbnQzMl90KiBhcmdiX2RhdGEsIGludCBudW1fcGl4cyk7Ci0KLXZvaWQgVlA4TFJlc2lkdWFsSW1hZ2UoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGNvbnN0IGFyZ2IsIHVpbnQzMl90KiBjb25zdCBhcmdiX3NjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBjb25zdCBpbWFnZSk7Ci0KLXZvaWQgVlA4TENvbG9yU3BhY2VUcmFuc2Zvcm0oaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYml0cywgaW50IHN0ZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBjb25zdCBhcmdiLCB1aW50MzJfdCogaW1hZ2UpOwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29sb3Igc3BhY2UgY29udmVyc2lvbi4KLQotLy8gQ29udmVydHMgZnJvbSBCR1JBIHRvIG90aGVyIGNvbG9yIHNwYWNlcy4KLXZvaWQgVlA4TENvbnZlcnRGcm9tQkdSQShjb25zdCB1aW50MzJfdCogY29uc3QgaW5fZGF0YSwgaW50IG51bV9waXhlbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgV0VCUF9DU1BfTU9ERSBvdXRfY29sb3JzcGFjZSwgdWludDhfdCogY29uc3QgcmdiYSk7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBNaXNjIG1ldGhvZHMuCi0KLS8vIENvbXB1dGVzIHNhbXBsZWQgc2l6ZSBvZiAnc2l6ZScgd2hlbiBzYW1wbGluZyB1c2luZyAnc2FtcGxpbmcgYml0cycuCi1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgVlA4TFN1YlNhbXBsZVNpemUodWludDMyX3Qgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ19iaXRzKSB7Ci0gIHJldHVybiAoc2l6ZSArICgxIDw8IHNhbXBsaW5nX2JpdHMpIC0gMSkgPj4gc2FtcGxpbmdfYml0czsKLX0KLQotLy8gRmFzdGVyIGxvZ2FyaXRobSBmb3IgaW50ZWdlcnMuIFNtYWxsIHZhbHVlcyB1c2UgYSBsb29rLXVwIHRhYmxlLgotI2RlZmluZSBMT0dfTE9PS1VQX0lEWF9NQVggMjU2Ci1leHRlcm4gY29uc3QgZmxvYXQga0xvZzJUYWJsZVtMT0dfTE9PS1VQX0lEWF9NQVhdOwotZXh0ZXJuIGNvbnN0IGZsb2F0IGtTTG9nMlRhYmxlW0xPR19MT09LVVBfSURYX01BWF07Ci1leHRlcm4gZmxvYXQgVlA4TEZhc3RMb2cyU2xvdyhpbnQgdik7Ci1leHRlcm4gZmxvYXQgVlA4TEZhc3RTTG9nMlNsb3coaW50IHYpOwotc3RhdGljIFdFQlBfSU5MSU5FIGZsb2F0IFZQOExGYXN0TG9nMihpbnQgdikgewotICByZXR1cm4gKHYgPCBMT0dfTE9PS1VQX0lEWF9NQVgpID8ga0xvZzJUYWJsZVt2XSA6IFZQOExGYXN0TG9nMlNsb3codik7Ci19Ci0vLyBGYXN0IGNhbGN1bGF0aW9uIG9mIHYgKiBsb2cyKHYpIGZvciBpbnRlZ2VyIGlucHV0Lgotc3RhdGljIFdFQlBfSU5MSU5FIGZsb2F0IFZQOExGYXN0U0xvZzIoaW50IHYpIHsKLSAgcmV0dXJuICh2IDwgTE9HX0xPT0tVUF9JRFhfTUFYKSA/IGtTTG9nMlRhYmxlW3ZdIDogVlA4TEZhc3RTTG9nMlNsb3codik7Ci19Ci0KLQotLy8gSW4tcGxhY2UgZGlmZmVyZW5jZSBvZiBlYWNoIGNvbXBvbmVudCB3aXRoIG1vZCAyNTYuCi1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgVlA4TFN1YlBpeGVscyh1aW50MzJfdCBhLCB1aW50MzJfdCBiKSB7Ci0gIGNvbnN0IHVpbnQzMl90IGFscGhhX2FuZF9ncmVlbiA9Ci0gICAgICAweDAwZmYwMGZmdSArIChhICYgMHhmZjAwZmYwMHUpIC0gKGIgJiAweGZmMDBmZjAwdSk7Ci0gIGNvbnN0IHVpbnQzMl90IHJlZF9hbmRfYmx1ZSA9Ci0gICAgICAweGZmMDBmZjAwdSArIChhICYgMHgwMGZmMDBmZnUpIC0gKGIgJiAweDAwZmYwMGZmdSk7Ci0gIHJldHVybiAoYWxwaGFfYW5kX2dyZWVuICYgMHhmZjAwZmYwMHUpIHwgKHJlZF9hbmRfYmx1ZSAmIDB4MDBmZjAwZmZ1KTsKLX0KLQotdm9pZCBWUDhMQnVuZGxlQ29sb3JNYXAoY29uc3QgdWludDhfdCogY29uc3Qgcm93LCBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgeGJpdHMsIHVpbnQzMl90KiBjb25zdCBkc3QpOwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKLQotI2VuZGlmICAvLyBXRUJQX0RTUF9MT1NTTEVTU19IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL3Vwc2FtcGxpbmcuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RzcC91cHNhbXBsaW5nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwYmE0ZjguLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL3Vwc2FtcGxpbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDM2OSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gWVVWIHRvIFJHQiB1cHNhbXBsaW5nIGZ1bmN0aW9ucy4KLS8vCi0vLyBBdXRob3I6IHNvbW5hdGhAZ29vZ2xlLmNvbSAoU29tbmF0aCBCYW5lcmplZSkKLQotI2luY2x1ZGUgIi4vZHNwLmgiCi0jaW5jbHVkZSAiLi95dXYuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBGYW5jeSB1cHNhbXBsZXIKLQotI2lmZGVmIEZBTkNZX1VQU0FNUExJTkcKLQotLy8gRmFuY3kgdXBzYW1wbGluZyBmdW5jdGlvbnMgdG8gY29udmVydCBZVVYgdG8gUkdCCi1XZWJQVXBzYW1wbGVMaW5lUGFpckZ1bmMgV2ViUFVwc2FtcGxlcnNbTU9ERV9MQVNUXTsKLQotLy8gR2l2ZW4gc2FtcGxlcyBsYWlkIG91dCBpbiBhIHNxdWFyZSBhczoKLS8vICBbYSBiXQotLy8gIFtjIGRdCi0vLyB3ZSBpbnRlcnBvbGF0ZSB1L3YgYXM6Ci0vLyAgKFs5KmEgKyAzKmIgKyAzKmMgKyAgIGQgICAgMyphICsgOSpiICsgMypjICsgICBkXSArIFs4IDhdKSAvIDE2Ci0vLyAgKFszKmEgKyAgIGIgKyA5KmMgKyAzKmQgICAgICBhICsgMypiICsgMypjICsgOSpkXSAgIFs4IDhdKSAvIDE2Ci0KLS8vIFdlIHByb2Nlc3MgdSBhbmQgdiB0b2dldGhlciBzdGFzaGVkIGludG8gMzJiaXQgKDE2Yml0IGVhY2gpLgotI2RlZmluZSBMT0FEX1VWKHUsIHYpICgodSkgfCAoKHYpIDw8IDE2KSkKLQotI2RlZmluZSBVUFNBTVBMRV9GVU5DKEZVTkNfTkFNRSwgRlVOQywgWFNURVApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXN0YXRpYyB2b2lkIEZVTkNfTkFNRShjb25zdCB1aW50OF90KiB0b3BfeSwgY29uc3QgdWludDhfdCogYm90dG9tX3ksICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdG9wX3UsIGNvbnN0IHVpbnQ4X3QqIHRvcF92LCAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGN1cl91LCBjb25zdCB1aW50OF90KiBjdXJfdiwgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB0b3BfZHN0LCB1aW50OF90KiBib3R0b21fZHN0LCBpbnQgbGVuKSB7ICAgICAgICBcCi0gIGludCB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCBpbnQgbGFzdF9waXhlbF9wYWlyID0gKGxlbiAtIDEpID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdWludDMyX3QgdGxfdXYgPSBMT0FEX1VWKHRvcF91WzBdLCB0b3BfdlswXSk7ICAgLyogdG9wLWxlZnQgc2FtcGxlICovICAgICAgICBcCi0gIHVpbnQzMl90IGxfdXYgID0gTE9BRF9VVihjdXJfdVswXSwgY3VyX3ZbMF0pOyAgIC8qIGxlZnQtc2FtcGxlICovICAgICAgICAgICAgXAotICBpZiAodG9wX3kpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjb25zdCB1aW50MzJfdCB1djAgPSAoMyAqIHRsX3V2ICsgbF91diArIDB4MDAwMjAwMDJ1KSA+PiAyOyAgICAgICAgICAgICAgICBcCi0gICAgRlVOQyh0b3BfeVswXSwgdXYwICYgMHhmZiwgKHV2MCA+PiAxNiksIHRvcF9kc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaWYgKGJvdHRvbV95KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY29uc3QgdWludDMyX3QgdXYwID0gKDMgKiBsX3V2ICsgdGxfdXYgKyAweDAwMDIwMDAydSkgPj4gMjsgICAgICAgICAgICAgICAgXAotICAgIEZVTkMoYm90dG9tX3lbMF0sIHV2MCAmIDB4ZmYsICh1djAgPj4gMTYpLCBib3R0b21fZHN0KTsgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGZvciAoeCA9IDE7IHggPD0gbGFzdF9waXhlbF9wYWlyOyArK3gpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNvbnN0IHVpbnQzMl90IHRfdXYgPSBMT0FEX1VWKHRvcF91W3hdLCB0b3Bfdlt4XSk7ICAvKiB0b3Agc2FtcGxlICovICAgICAgIFwKLSAgICBjb25zdCB1aW50MzJfdCB1diAgID0gTE9BRF9VVihjdXJfdVt4XSwgY3VyX3ZbeF0pOyAgLyogc2FtcGxlICovICAgICAgICAgICBcCi0gICAgLyogcHJlY29tcHV0ZSBpbnZhcmlhbnQgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCBmaXJzdCBhbmQgc2Vjb25kIGRpYWdvbmFscyovXAotICAgIGNvbnN0IHVpbnQzMl90IGF2ZyA9IHRsX3V2ICsgdF91diArIGxfdXYgKyB1diArIDB4MDAwODAwMDh1OyAgICAgICAgICAgICAgIFwKLSAgICBjb25zdCB1aW50MzJfdCBkaWFnXzEyID0gKGF2ZyArIDIgKiAodF91diArIGxfdXYpKSA+PiAzOyAgICAgICAgICAgICAgICAgICBcCi0gICAgY29uc3QgdWludDMyX3QgZGlhZ18wMyA9IChhdmcgKyAyICogKHRsX3V2ICsgdXYpKSA+PiAzOyAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICh0b3BfeSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNvbnN0IHVpbnQzMl90IHV2MCA9IChkaWFnXzEyICsgdGxfdXYpID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBjb25zdCB1aW50MzJfdCB1djEgPSAoZGlhZ18wMyArIHRfdXYpID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgRlVOQyh0b3BfeVsyICogeCAtIDFdLCB1djAgJiAweGZmLCAodXYwID4+IDE2KSwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgdG9wX2RzdCArICgyICogeCAtIDEpICogWFNURVApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBGVU5DKHRvcF95WzIgKiB4IC0gMF0sIHV2MSAmIDB4ZmYsICh1djEgPj4gMTYpLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICB0b3BfZHN0ICsgKDIgKiB4IC0gMCkgKiBYU1RFUCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGJvdHRvbV95KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY29uc3QgdWludDMyX3QgdXYwID0gKGRpYWdfMDMgKyBsX3V2KSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNvbnN0IHVpbnQzMl90IHV2MSA9IChkaWFnXzEyICsgdXYpID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBGVU5DKGJvdHRvbV95WzIgKiB4IC0gMV0sIHV2MCAmIDB4ZmYsICh1djAgPj4gMTYpLCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICBib3R0b21fZHN0ICsgKDIgKiB4IC0gMSkgKiBYU1RFUCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIEZVTkMoYm90dG9tX3lbMiAqIHggKyAwXSwgdXYxICYgMHhmZiwgKHV2MSA+PiAxNiksICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIGJvdHRvbV9kc3QgKyAoMiAqIHggKyAwKSAqIFhTVEVQKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0bF91diA9IHRfdXY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbF91diA9IHV2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaWYgKCEobGVuICYgMSkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKHRvcF95KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY29uc3QgdWludDMyX3QgdXYwID0gKDMgKiB0bF91diArIGxfdXYgKyAweDAwMDIwMDAydSkgPj4gMjsgICAgICAgICAgICAgIFwKLSAgICAgIEZVTkModG9wX3lbbGVuIC0gMV0sIHV2MCAmIDB4ZmYsICh1djAgPj4gMTYpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIHRvcF9kc3QgKyAobGVuIC0gMSkgKiBYU1RFUCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoYm90dG9tX3kpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBjb25zdCB1aW50MzJfdCB1djAgPSAoMyAqIGxfdXYgKyB0bF91diArIDB4MDAwMjAwMDJ1KSA+PiAyOyAgICAgICAgICAgICAgXAotICAgICAgRlVOQyhib3R0b21feVtsZW4gLSAxXSwgdXYwICYgMHhmZiwgKHV2MCA+PiAxNiksICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgYm90dG9tX2RzdCArIChsZW4gLSAxKSAqIFhTVEVQKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotLy8gQWxsIHZhcmlhbnRzIGltcGxlbWVudGVkLgotVVBTQU1QTEVfRlVOQyhVcHNhbXBsZVJnYkxpbmVQYWlyLCAgVlA4WXV2VG9SZ2IsICAzKQotVVBTQU1QTEVfRlVOQyhVcHNhbXBsZUJnckxpbmVQYWlyLCAgVlA4WXV2VG9CZ3IsICAzKQotVVBTQU1QTEVfRlVOQyhVcHNhbXBsZVJnYmFMaW5lUGFpciwgVlA4WXV2VG9SZ2JhLCA0KQotVVBTQU1QTEVfRlVOQyhVcHNhbXBsZUJncmFMaW5lUGFpciwgVlA4WXV2VG9CZ3JhLCA0KQotVVBTQU1QTEVfRlVOQyhVcHNhbXBsZUFyZ2JMaW5lUGFpciwgVlA4WXV2VG9BcmdiLCA0KQotVVBTQU1QTEVfRlVOQyhVcHNhbXBsZVJnYmE0NDQ0TGluZVBhaXIsIFZQOFl1dlRvUmdiYTQ0NDQsIDIpCi1VUFNBTVBMRV9GVU5DKFVwc2FtcGxlUmdiNTY1TGluZVBhaXIsICBWUDhZdXZUb1JnYjU2NSwgIDIpCi0KLSN1bmRlZiBMT0FEX1VWCi0jdW5kZWYgVVBTQU1QTEVfRlVOQwotCi0jZW5kaWYgIC8vIEZBTkNZX1VQU0FNUExJTkcKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHNpbXBsZSBwb2ludC1zYW1wbGluZwotCi0jZGVmaW5lIFNBTVBMRV9GVU5DKEZVTkNfTkFNRSwgRlVOQywgWFNURVApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotc3RhdGljIHZvaWQgRlVOQ19OQU1FKGNvbnN0IHVpbnQ4X3QqIHRvcF95LCBjb25zdCB1aW50OF90KiBib3R0b21feSwgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LCAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdG9wX2RzdCwgdWludDhfdCogYm90dG9tX2RzdCwgaW50IGxlbikgeyAgICAgICAgXAotICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZm9yIChpID0gMDsgaSA8IGxlbiAtIDE7IGkgKz0gMikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlVOQyh0b3BfeVswXSwgdVswXSwgdlswXSwgdG9wX2RzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZVTkModG9wX3lbMV0sIHVbMF0sIHZbMF0sIHRvcF9kc3QgKyBYU1RFUCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVU5DKGJvdHRvbV95WzBdLCB1WzBdLCB2WzBdLCBib3R0b21fZHN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlVOQyhib3R0b21feVsxXSwgdVswXSwgdlswXSwgYm90dG9tX2RzdCArIFhTVEVQKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHRvcF95ICs9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBib3R0b21feSArPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdSsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHYrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0b3BfZHN0ICs9IDIgKiBYU1RFUDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYm90dG9tX2RzdCArPSAyICogWFNURVA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaWYgKGkgPT0gbGVuIC0gMSkgeyAgICAvKiBsYXN0IG9uZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlVOQyh0b3BfeVswXSwgdVswXSwgdlswXSwgdG9wX2RzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZVTkMoYm90dG9tX3lbMF0sIHVbMF0sIHZbMF0sIGJvdHRvbV9kc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLS8vIEFsbCB2YXJpYW50cyBpbXBsZW1lbnRlZC4KLVNBTVBMRV9GVU5DKFNhbXBsZVJnYkxpbmVQYWlyLCAgICAgIFZQOFl1dlRvUmdiLCAgMykKLVNBTVBMRV9GVU5DKFNhbXBsZUJnckxpbmVQYWlyLCAgICAgIFZQOFl1dlRvQmdyLCAgMykKLVNBTVBMRV9GVU5DKFNhbXBsZVJnYmFMaW5lUGFpciwgICAgIFZQOFl1dlRvUmdiYSwgNCkKLVNBTVBMRV9GVU5DKFNhbXBsZUJncmFMaW5lUGFpciwgICAgIFZQOFl1dlRvQmdyYSwgNCkKLVNBTVBMRV9GVU5DKFNhbXBsZUFyZ2JMaW5lUGFpciwgICAgIFZQOFl1dlRvQXJnYiwgNCkKLVNBTVBMRV9GVU5DKFNhbXBsZVJnYmE0NDQ0TGluZVBhaXIsIFZQOFl1dlRvUmdiYTQ0NDQsIDIpCi1TQU1QTEVfRlVOQyhTYW1wbGVSZ2I1NjVMaW5lUGFpciwgICBWUDhZdXZUb1JnYjU2NSwgMikKLQotI3VuZGVmIFNBTVBMRV9GVU5DCi0KLWNvbnN0IFdlYlBTYW1wbGVMaW5lUGFpckZ1bmMgV2ViUFNhbXBsZXJzW01PREVfTEFTVF0gPSB7Ci0gIFNhbXBsZVJnYkxpbmVQYWlyLCAgICAgICAvLyBNT0RFX1JHQgotICBTYW1wbGVSZ2JhTGluZVBhaXIsICAgICAgLy8gTU9ERV9SR0JBCi0gIFNhbXBsZUJnckxpbmVQYWlyLCAgICAgICAvLyBNT0RFX0JHUgotICBTYW1wbGVCZ3JhTGluZVBhaXIsICAgICAgLy8gTU9ERV9CR1JBCi0gIFNhbXBsZUFyZ2JMaW5lUGFpciwgICAgICAvLyBNT0RFX0FSR0IKLSAgU2FtcGxlUmdiYTQ0NDRMaW5lUGFpciwgIC8vIE1PREVfUkdCQV80NDQ0Ci0gIFNhbXBsZVJnYjU2NUxpbmVQYWlyLCAgICAvLyBNT0RFX1JHQl81NjUKLSAgU2FtcGxlUmdiYUxpbmVQYWlyLCAgICAgIC8vIE1PREVfcmdiQQotICBTYW1wbGVCZ3JhTGluZVBhaXIsICAgICAgLy8gTU9ERV9iZ3JBCi0gIFNhbXBsZUFyZ2JMaW5lUGFpciwgICAgICAvLyBNT0RFX0FyZ2IKLSAgU2FtcGxlUmdiYTQ0NDRMaW5lUGFpciAgIC8vIE1PREVfcmdiQV80NDQ0Ci19OwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWYgIWRlZmluZWQoRkFOQ1lfVVBTQU1QTElORykKLSNkZWZpbmUgRFVBTF9TQU1QTEVfRlVOQyhGVU5DX05BTUUsIEZVTkMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1zdGF0aWMgdm9pZCBGVU5DX05BTUUoY29uc3QgdWludDhfdCogdG9wX3ksIGNvbnN0IHVpbnQ4X3QqIGJvdF95LCAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcF91LCBjb25zdCB1aW50OF90KiB0b3BfdiwgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBib3RfdSwgY29uc3QgdWludDhfdCogYm90X3YsICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdG9wX2RzdCwgdWludDhfdCogYm90X2RzdCwgaW50IGxlbikgeyAgICAgICAgICAgXAotICBjb25zdCBpbnQgaGFsZl9sZW4gPSBsZW4gPj4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaW50IHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGlmICh0b3BfZHN0ICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZvciAoeCA9IDA7IHggPCBoYWxmX2xlbjsgKyt4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIEZVTkModG9wX3lbMiAqIHggKyAwXSwgdG9wX3VbeF0sIHRvcF92W3hdLCB0b3BfZHN0ICsgOCAqIHggKyAwKTsgICAgICAgICBcCi0gICAgICBGVU5DKHRvcF95WzIgKiB4ICsgMV0sIHRvcF91W3hdLCB0b3Bfdlt4XSwgdG9wX2RzdCArIDggKiB4ICsgNCk7ICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAobGVuICYgMSkgRlVOQyh0b3BfeVsyICogeCArIDBdLCB0b3BfdVt4XSwgdG9wX3ZbeF0sIHRvcF9kc3QgKyA4ICogeCk7ICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpZiAoYm90X2RzdCAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmb3IgKHggPSAwOyB4IDwgaGFsZl9sZW47ICsreCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBGVU5DKGJvdF95WzIgKiB4ICsgMF0sIGJvdF91W3hdLCBib3Rfdlt4XSwgYm90X2RzdCArIDggKiB4ICsgMCk7ICAgICAgICAgXAotICAgICAgRlVOQyhib3RfeVsyICogeCArIDFdLCBib3RfdVt4XSwgYm90X3ZbeF0sIGJvdF9kc3QgKyA4ICogeCArIDQpOyAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGxlbiAmIDEpIEZVTkMoYm90X3lbMiAqIHggKyAwXSwgYm90X3VbeF0sIGJvdF92W3hdLCBib3RfZHN0ICsgOCAqIHgpOyAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotRFVBTF9TQU1QTEVfRlVOQyhEdWFsTGluZVNhbXBsZXJCR1JBLCBWUDhZdXZUb0JncmEpCi1EVUFMX1NBTVBMRV9GVU5DKER1YWxMaW5lU2FtcGxlckFSR0IsIFZQOFl1dlRvQXJnYikKLSN1bmRlZiBEVUFMX1NBTVBMRV9GVU5DCi0KLSNlbmRpZiAgLy8gIUZBTkNZX1VQU0FNUExJTkcKLQotV2ViUFVwc2FtcGxlTGluZVBhaXJGdW5jIFdlYlBHZXRMaW5lUGFpckNvbnZlcnRlcihpbnQgYWxwaGFfaXNfbGFzdCkgewotICBXZWJQSW5pdFVwc2FtcGxlcnMoKTsKLSAgVlA4WVVWSW5pdCgpOwotI2lmZGVmIEZBTkNZX1VQU0FNUExJTkcKLSAgcmV0dXJuIFdlYlBVcHNhbXBsZXJzW2FscGhhX2lzX2xhc3QgPyBNT0RFX0JHUkEgOiBNT0RFX0FSR0JdOwotI2Vsc2UKLSAgcmV0dXJuIChhbHBoYV9pc19sYXN0ID8gRHVhbExpbmVTYW1wbGVyQkdSQSA6IER1YWxMaW5lU2FtcGxlckFSR0IpOwotI2VuZGlmCi19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBZVVY0NDQgY29udmVydGVyCi0KLSNkZWZpbmUgWVVWNDQ0X0ZVTkMoRlVOQ19OQU1FLCBGVU5DLCBYU1RFUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1zdGF0aWMgdm9pZCBGVU5DX05BTUUoY29uc3QgdWludDhfdCogeSwgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwgICAgXAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGxlbikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkgRlVOQyh5W2ldLCB1W2ldLCB2W2ldLCAmZHN0W2kgKiBYU1RFUF0pOyAgICAgICAgICAgXAotfQotCi1ZVVY0NDRfRlVOQyhZdXY0NDRUb1JnYiwgICAgICBWUDhZdXZUb1JnYiwgIDMpCi1ZVVY0NDRfRlVOQyhZdXY0NDRUb0JnciwgICAgICBWUDhZdXZUb0JnciwgIDMpCi1ZVVY0NDRfRlVOQyhZdXY0NDRUb1JnYmEsICAgICBWUDhZdXZUb1JnYmEsIDQpCi1ZVVY0NDRfRlVOQyhZdXY0NDRUb0JncmEsICAgICBWUDhZdXZUb0JncmEsIDQpCi1ZVVY0NDRfRlVOQyhZdXY0NDRUb0FyZ2IsICAgICBWUDhZdXZUb0FyZ2IsIDQpCi1ZVVY0NDRfRlVOQyhZdXY0NDRUb1JnYmE0NDQ0LCBWUDhZdXZUb1JnYmE0NDQ0LCAyKQotWVVWNDQ0X0ZVTkMoWXV2NDQ0VG9SZ2I1NjUsICAgVlA4WXV2VG9SZ2I1NjUsIDIpCi0KLSN1bmRlZiBZVVY0NDRfRlVOQwotCi1jb25zdCBXZWJQWVVWNDQ0Q29udmVydGVyIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW01PREVfTEFTVF0gPSB7Ci0gIFl1djQ0NFRvUmdiLCAgICAgICAvLyBNT0RFX1JHQgotICBZdXY0NDRUb1JnYmEsICAgICAgLy8gTU9ERV9SR0JBCi0gIFl1djQ0NFRvQmdyLCAgICAgICAvLyBNT0RFX0JHUgotICBZdXY0NDRUb0JncmEsICAgICAgLy8gTU9ERV9CR1JBCi0gIFl1djQ0NFRvQXJnYiwgICAgICAvLyBNT0RFX0FSR0IKLSAgWXV2NDQ0VG9SZ2JhNDQ0NCwgIC8vIE1PREVfUkdCQV80NDQ0Ci0gIFl1djQ0NFRvUmdiNTY1LCAgICAvLyBNT0RFX1JHQl81NjUKLSAgWXV2NDQ0VG9SZ2JhLCAgICAgIC8vIE1PREVfcmdiQQotICBZdXY0NDRUb0JncmEsICAgICAgLy8gTU9ERV9iZ3JBCi0gIFl1djQ0NFRvQXJnYiwgICAgICAvLyBNT0RFX0FyZ2IKLSAgWXV2NDQ0VG9SZ2JhNDQ0NCAgIC8vIE1PREVfcmdiQV80NDQ0Ci19OwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gUHJlbXVsdGlwbGllZCBtb2RlcwotCi0vLyBub24gZGl0aGVyZWQtbW9kZXMKLQotLy8gKHggKiBhICogMzI4OTcpID4+IDIzIGlzIGJpdC13aXNlIGVxdWl2YWxlbnQgdG8gKGludCkoeCAqIGEgLyAyNTUuKQotLy8gZm9yIGFsbCA4Yml0IHggb3IgYS4gRm9yIGJpdC13aXNlIGVxdWl2YWxlbmNlIHRvIChpbnQpKHggKiBhIC8gMjU1LiArIC41KSwKLS8vIG9uZSBjYW4gdXNlIGluc3RlYWQ6ICh4ICogYSAqIDY1NzkzICsgKDEgPDwgMjMpKSA+PiAyNAotI2lmIDEgICAgIC8vIChpbnQpKHggKiBhIC8gMjU1LikKLSNkZWZpbmUgTVVMVElQTElFUihhKSAgICgoYSkgKiAzMjg5N1VMKQotI2RlZmluZSBQUkVNVUxUSVBMWSh4LCBtKSAoKCh4KSAqIChtKSkgPj4gMjMpCi0jZWxzZSAgICAgLy8gKGludCkoeCAqIGEgLyAyNTUuICsgLjUpCi0jZGVmaW5lIE1VTFRJUExJRVIoYSkgKChhKSAqIDY1NzkzVUwpCi0jZGVmaW5lIFBSRU1VTFRJUExZKHgsIG0pICgoKHgpICogKG0pICsgKDFVTCA8PCAyMykpID4+IDI0KQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIEFwcGx5QWxwaGFNdWx0aXBseSh1aW50OF90KiByZ2JhLCBpbnQgYWxwaGFfZmlyc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLCBpbnQgc3RyaWRlKSB7Ci0gIHdoaWxlIChoLS0gPiAwKSB7Ci0gICAgdWludDhfdCogY29uc3QgcmdiID0gcmdiYSArIChhbHBoYV9maXJzdCA/IDEgOiAwKTsKLSAgICBjb25zdCB1aW50OF90KiBjb25zdCBhbHBoYSA9IHJnYmEgKyAoYWxwaGFfZmlyc3QgPyAwIDogMyk7Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IHc7ICsraSkgewotICAgICAgY29uc3QgdWludDMyX3QgYSA9IGFscGhhWzQgKiBpXTsKLSAgICAgIGlmIChhICE9IDB4ZmYpIHsKLSAgICAgICAgY29uc3QgdWludDMyX3QgbXVsdCA9IE1VTFRJUExJRVIoYSk7Ci0gICAgICAgIHJnYls0ICogaSArIDBdID0gUFJFTVVMVElQTFkocmdiWzQgKiBpICsgMF0sIG11bHQpOwotICAgICAgICByZ2JbNCAqIGkgKyAxXSA9IFBSRU1VTFRJUExZKHJnYls0ICogaSArIDFdLCBtdWx0KTsKLSAgICAgICAgcmdiWzQgKiBpICsgMl0gPSBQUkVNVUxUSVBMWShyZ2JbNCAqIGkgKyAyXSwgbXVsdCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJnYmEgKz0gc3RyaWRlOwotICB9Ci19Ci0jdW5kZWYgTVVMVElQTElFUgotI3VuZGVmIFBSRU1VTFRJUExZCi0KLS8vIHJnYkE0NDQ0Ci0KLSNkZWZpbmUgTVVMVElQTElFUihhKSAgKChhKSAqIDB4MTExMSkgICAgLy8gMHgxMTExIH49ICgxIDw8IDE2KSAvIDE1Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB1aW50OF90IGRpdGhlcl9oaSh1aW50OF90IHgpIHsKLSAgcmV0dXJuICh4ICYgMHhmMCkgfCAoeCA+PiA0KTsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ4X3QgZGl0aGVyX2xvKHVpbnQ4X3QgeCkgewotICByZXR1cm4gKHggJiAweDBmKSB8ICh4IDw8IDQpOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDhfdCBtdWx0aXBseSh1aW50OF90IHgsIHVpbnQzMl90IG0pIHsKLSAgcmV0dXJuICh4ICogbSkgPj4gMTY7Ci19Ci0KLXN0YXRpYyB2b2lkIEFwcGx5QWxwaGFNdWx0aXBseTQ0NDQodWludDhfdCogcmdiYTQ0NDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgaW50IHN0cmlkZSkgewotICB3aGlsZSAoaC0tID4gMCkgewotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCB3OyArK2kpIHsKLSAgICAgIGNvbnN0IHVpbnQ4X3QgYSA9IChyZ2JhNDQ0NFsyICogaSArIDFdICYgMHgwZik7Ci0gICAgICBjb25zdCB1aW50MzJfdCBtdWx0ID0gTVVMVElQTElFUihhKTsKLSAgICAgIGNvbnN0IHVpbnQ4X3QgciA9IG11bHRpcGx5KGRpdGhlcl9oaShyZ2JhNDQ0NFsyICogaSArIDBdKSwgbXVsdCk7Ci0gICAgICBjb25zdCB1aW50OF90IGcgPSBtdWx0aXBseShkaXRoZXJfbG8ocmdiYTQ0NDRbMiAqIGkgKyAwXSksIG11bHQpOwotICAgICAgY29uc3QgdWludDhfdCBiID0gbXVsdGlwbHkoZGl0aGVyX2hpKHJnYmE0NDQ0WzIgKiBpICsgMV0pLCBtdWx0KTsKLSAgICAgIHJnYmE0NDQ0WzIgKiBpICsgMF0gPSAociAmIDB4ZjApIHwgKChnID4+IDQpICYgMHgwZik7Ci0gICAgICByZ2JhNDQ0NFsyICogaSArIDFdID0gKGIgJiAweGYwKSB8IGE7Ci0gICAgfQotICAgIHJnYmE0NDQ0ICs9IHN0cmlkZTsKLSAgfQotfQotI3VuZGVmIE1VTFRJUExJRVIKLQotdm9pZCAoKldlYlBBcHBseUFscGhhTXVsdGlwbHkpKHVpbnQ4X3QqLCBpbnQsIGludCwgaW50LCBpbnQpCi0gICAgPSBBcHBseUFscGhhTXVsdGlwbHk7Ci12b2lkICgqV2ViUEFwcGx5QWxwaGFNdWx0aXBseTQ0NDQpKHVpbnQ4X3QqLCBpbnQsIGludCwgaW50KQotICAgID0gQXBwbHlBbHBoYU11bHRpcGx5NDQ0NDsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE1haW4gY2FsbAotCi12b2lkIFdlYlBJbml0VXBzYW1wbGVycyh2b2lkKSB7Ci0jaWZkZWYgRkFOQ1lfVVBTQU1QTElORwotICBXZWJQVXBzYW1wbGVyc1tNT0RFX1JHQl0gICAgICAgPSBVcHNhbXBsZVJnYkxpbmVQYWlyOwotICBXZWJQVXBzYW1wbGVyc1tNT0RFX1JHQkFdICAgICAgPSBVcHNhbXBsZVJnYmFMaW5lUGFpcjsKLSAgV2ViUFVwc2FtcGxlcnNbTU9ERV9CR1JdICAgICAgID0gVXBzYW1wbGVCZ3JMaW5lUGFpcjsKLSAgV2ViUFVwc2FtcGxlcnNbTU9ERV9CR1JBXSAgICAgID0gVXBzYW1wbGVCZ3JhTGluZVBhaXI7Ci0gIFdlYlBVcHNhbXBsZXJzW01PREVfQVJHQl0gICAgICA9IFVwc2FtcGxlQXJnYkxpbmVQYWlyOwotICBXZWJQVXBzYW1wbGVyc1tNT0RFX1JHQkFfNDQ0NF0gPSBVcHNhbXBsZVJnYmE0NDQ0TGluZVBhaXI7Ci0gIFdlYlBVcHNhbXBsZXJzW01PREVfUkdCXzU2NV0gICA9IFVwc2FtcGxlUmdiNTY1TGluZVBhaXI7Ci0KLSAgLy8gSWYgZGVmaW5lZCwgdXNlIENQVUluZm8oKSB0byBvdmVyd3JpdGUgc29tZSBwb2ludGVycyB3aXRoIGZhc3RlciB2ZXJzaW9ucy4KLSAgaWYgKFZQOEdldENQVUluZm8gIT0gTlVMTCkgewotI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFMikKLSAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrU1NFMikpIHsKLSAgICAgIFdlYlBJbml0VXBzYW1wbGVyc1NTRTIoKTsKLSAgICB9Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFdFQlBfVVNFX05FT04pCi0gICAgaWYgKFZQOEdldENQVUluZm8oa05FT04pKSB7Ci0gICAgICBXZWJQSW5pdFVwc2FtcGxlcnNORU9OKCk7Ci0gICAgfQotI2VuZGlmCi0gIH0KLSNlbmRpZiAgLy8gRkFOQ1lfVVBTQU1QTElORwotfQotCi12b2lkIFdlYlBJbml0UHJlbXVsdGlwbHkodm9pZCkgewotICBXZWJQQXBwbHlBbHBoYU11bHRpcGx5ID0gQXBwbHlBbHBoYU11bHRpcGx5OwotICBXZWJQQXBwbHlBbHBoYU11bHRpcGx5NDQ0NCA9IEFwcGx5QWxwaGFNdWx0aXBseTQ0NDQ7Ci0KLSNpZmRlZiBGQU5DWV9VUFNBTVBMSU5HCi0gIFdlYlBVcHNhbXBsZXJzW01PREVfcmdiQV0gICAgICA9IFVwc2FtcGxlUmdiYUxpbmVQYWlyOwotICBXZWJQVXBzYW1wbGVyc1tNT0RFX2JnckFdICAgICAgPSBVcHNhbXBsZUJncmFMaW5lUGFpcjsKLSAgV2ViUFVwc2FtcGxlcnNbTU9ERV9BcmdiXSAgICAgID0gVXBzYW1wbGVBcmdiTGluZVBhaXI7Ci0gIFdlYlBVcHNhbXBsZXJzW01PREVfcmdiQV80NDQ0XSA9IFVwc2FtcGxlUmdiYTQ0NDRMaW5lUGFpcjsKLQotICBpZiAoVlA4R2V0Q1BVSW5mbyAhPSBOVUxMKSB7Ci0jaWYgZGVmaW5lZChXRUJQX1VTRV9TU0UyKQotICAgIGlmIChWUDhHZXRDUFVJbmZvKGtTU0UyKSkgewotICAgICAgV2ViUEluaXRQcmVtdWx0aXBseVNTRTIoKTsKLSAgICB9Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFdFQlBfVVNFX05FT04pCi0gICAgaWYgKFZQOEdldENQVUluZm8oa05FT04pKSB7Ci0gICAgICBXZWJQSW5pdFByZW11bHRpcGx5TkVPTigpOwotICAgIH0KLSNlbmRpZgotICB9Ci0jZW5kaWYgIC8vIEZBTkNZX1VQU0FNUExJTkcKLX0KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kc3AvdXBzYW1wbGluZ19uZW9uLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kc3AvdXBzYW1wbGluZ19uZW9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNmE4ZTUuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL3Vwc2FtcGxpbmdfbmVvbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjk5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBORU9OIHZlcnNpb24gb2YgWVVWIHRvIFJHQiB1cHNhbXBsaW5nIGZ1bmN0aW9ucy4KLS8vCi0vLyBBdXRob3I6IG1hbnNAbWFuc3IuY29tIChNYW5zIFJ1bGxnYXJkKQotLy8gQmFzZWQgb24gU1NFIGNvZGUgYnk6IHNvbW5hdGhAZ29vZ2xlLmNvbSAoU29tbmF0aCBCYW5lcmplZSkKLQotI2luY2x1ZGUgIi4vZHNwLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChXRUJQX1VTRV9ORU9OKQotCi0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNlbHNlCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxhcm1fbmVvbi5oPgotI2luY2x1ZGUgIi4veXV2LmgiCi0KLSNpZmRlZiBGQU5DWV9VUFNBTVBMSU5HCi0KLS8vIExvYWRzIDkgcGl4ZWxzIGVhY2ggZnJvbSByb3dzIHIxIGFuZCByMiBhbmQgZ2VuZXJhdGVzIDE2IHBpeGVscy4KLSNkZWZpbmUgVVBTQU1QTEVfMTZQSVhFTFMocjEsIHIyLCBvdXQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdWludDh4OF90IGEgPSB2bGQxX3U4KHIxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdWludDh4OF90IGIgPSB2bGQxX3U4KHIxICsgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdWludDh4OF90IGMgPSB2bGQxX3U4KHIyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdWludDh4OF90IGQgPSB2bGQxX3U4KHIyICsgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdWludDE2eDhfdCBhbCA9IHZzaGxsX25fdTgoYSwgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdWludDE2eDhfdCBibCA9IHZzaGxsX25fdTgoYiwgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdWludDE2eDhfdCBjbCA9IHZzaGxsX25fdTgoYywgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdWludDE2eDhfdCBkbCA9IHZzaGxsX25fdTgoZCwgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdWludDh4OF90IGRpYWcxLCBkaWFnMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdWludDE2eDhfdCBzbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgLyogYSArIGIgKyBjICsgZCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgc2wgPSB2YWRkbF91OChhLCAgYik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgc2wgPSB2YWRkd191OChzbCwgYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgc2wgPSB2YWRkd191OChzbCwgZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgYWwgPSB2YWRkcV91MTYoc2wsIGFsKTsgLyogM2EgKyAgYiArICBjICsgIGQgKi8gICAgICAgICAgICAgICAgICAgICAgIFwKLSAgYmwgPSB2YWRkcV91MTYoc2wsIGJsKTsgLyogIGEgKyAzYiArICBjICsgIGQgKi8gICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgYWwgPSB2YWRkcV91MTYoYWwsIGRsKTsgLyogM2EgKyAgYiArICBjICsgM2QgKi8gICAgICAgICAgICAgICAgICAgICAgIFwKLSAgYmwgPSB2YWRkcV91MTYoYmwsIGNsKTsgLyogIGEgKyAzYiArIDNjICsgIGQgKi8gICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZGlhZzIgPSB2c2hybl9uX3UxNihhbCwgMyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZGlhZzEgPSB2c2hybl9uX3UxNihibCwgMyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgYSA9IHZyaGFkZF91OChhLCBkaWFnMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgYiA9IHZyaGFkZF91OChiLCBkaWFnMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgYyA9IHZyaGFkZF91OChjLCBkaWFnMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZCA9IHZyaGFkZF91OChkLCBkaWFnMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjb25zdCB1aW50OHg4eDJfdCBhX2IgPSB7eyBhLCBiIH19OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjb25zdCB1aW50OHg4eDJfdCBjX2QgPSB7eyBjLCBkIH19OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB2c3QyX3U4KG91dCwgICAgICBhX2IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB2c3QyX3U4KG91dCArIDMyLCBjX2QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotLy8gVHVybiB0aGUgbWFjcm8gaW50byBhIGZ1bmN0aW9uIGZvciByZWR1Y2luZyBjb2RlLXNpemUgd2hlbiBub24tY3JpdGljYWwKLXN0YXRpYyB2b2lkIFVwc2FtcGxlMTZQaXhlbHMoY29uc3QgdWludDhfdCAqcjEsIGNvbnN0IHVpbnQ4X3QgKnIyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpvdXQpIHsKLSAgVVBTQU1QTEVfMTZQSVhFTFMocjEsIHIyLCBvdXQpOwotfQotCi0jZGVmaW5lIFVQU0FNUExFX0xBU1RfQkxPQ0sodGIsIGJiLCBudW1fcGl4ZWxzLCBvdXQpIHsgICAgICAgICAgICAgICAgICBcCi0gIHVpbnQ4X3QgcjFbOV0sIHIyWzldOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIFNiTWVtb3J5Q29weShyMSwgKHRiKSwgKG51bV9waXhlbHMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIFNiTWVtb3J5Q29weShyMiwgKGJiKSwgKG51bV9waXhlbHMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIC8qIHJlcGxpY2F0ZSBsYXN0IGJ5dGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIFNiTWVtb3J5U2V0KHIxICsgKG51bV9waXhlbHMpLCByMVsobnVtX3BpeGVscykgLSAxXSwgOSAtIChudW1fcGl4ZWxzKSk7ICAgIFwKLSAgU2JNZW1vcnlTZXQocjIgKyAobnVtX3BpeGVscyksIHIyWyhudW1fcGl4ZWxzKSAtIDFdLCA5IC0gKG51bV9waXhlbHMpKTsgICAgXAotICBVcHNhbXBsZTE2UGl4ZWxzKHIxLCByMiwgb3V0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0jZGVmaW5lIENZICA3NjI4MwotI2RlZmluZSBDVlIgODk4NTgKLSNkZWZpbmUgQ1VHIDIyMDE0Ci0jZGVmaW5lIENWRyA0NTc3MwotI2RlZmluZSBDVUIgMTEzNjE4Ci0KLXN0YXRpYyBjb25zdCBpbnQxNl90IGNvZWZbNF0gPSB7IENWUiAvIDQsIENVRywgQ1ZHIC8gMiwgQ1VCIC8gNCB9OwotCi0jZGVmaW5lIENPTlZFUlQ4KEZNVCwgWFNURVAsIE4sIHNyY195LCBzcmNfdXYsIG91dCwgY3VyX3gpIHsgICAgICAgICAgICBcCi0gIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGZvciAoaSA9IDA7IGkgPCBOOyBpICs9IDgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50IG9mZiA9ICgoY3VyX3gpICsgaSkgKiBYU1RFUDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdWludDh4OF90IHkgID0gdmxkMV91OChzcmNfeSArIChjdXJfeCkgICsgaSk7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdWludDh4OF90IHUgID0gdmxkMV91OCgoc3JjX3V2KSArIGkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdWludDh4OF90IHYgID0gdmxkMV91OCgoc3JjX3V2KSArIGkgKyAxNik7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50MTZ4OF90IHl5ID0gdnJlaW50ZXJwcmV0cV9zMTZfdTE2KHZzdWJsX3U4KHksIHUxNikpOyAgICAgICAgICAgICBcCi0gICAgaW50MTZ4OF90IHV1ID0gdnJlaW50ZXJwcmV0cV9zMTZfdTE2KHZzdWJsX3U4KHUsIHUxMjgpKTsgICAgICAgICAgICBcCi0gICAgaW50MTZ4OF90IHZ2ID0gdnJlaW50ZXJwcmV0cV9zMTZfdTE2KHZzdWJsX3U4KHYsIHUxMjgpKTsgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50MTZ4OF90IHVkID0gdnNobHFfbl9zMTYodXUsIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50MTZ4OF90IHZkID0gdnNobHFfbl9zMTYodnYsIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50MzJ4NF90IHZybCA9IHZxZG1sYWxfbGFuZV9zMTYodnNobGxfbl9zMTYodmdldF9sb3dfczE2KHZ2KSwgMSksICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmdldF9sb3dfczE2KHZkKSwgIGNmMTYsIDApOyAgICAgICBcCi0gICAgaW50MzJ4NF90IHZyaCA9IHZxZG1sYWxfbGFuZV9zMTYodnNobGxfbl9zMTYodmdldF9oaWdoX3MxNih2diksIDEpLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmdldF9oaWdoX3MxNih2ZCksIGNmMTYsIDApOyAgICAgICBcCi0gICAgaW50MTZ4OF90IHZyID0gdmNvbWJpbmVfczE2KHZyc2hybl9uX3MzMih2cmwsIDE2KSwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZyc2hybl9uX3MzMih2cmgsIDE2KSk7ICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50MzJ4NF90IHZsID0gdm1vdmxfczE2KHZnZXRfbG93X3MxNih2dikpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50MzJ4NF90IHZoID0gdm1vdmxfczE2KHZnZXRfaGlnaF9zMTYodnYpKTsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50MzJ4NF90IHVnbCA9IHZtbGFsX2xhbmVfczE2KHZsLCB2Z2V0X2xvd19zMTYodXUpLCAgY2YxNiwgMSk7ICAgICBcCi0gICAgaW50MzJ4NF90IHVnaCA9IHZtbGFsX2xhbmVfczE2KHZoLCB2Z2V0X2hpZ2hfczE2KHV1KSwgY2YxNiwgMSk7ICAgICBcCi0gICAgaW50MzJ4NF90IGdjbCA9IHZxZG1sYWxfbGFuZV9zMTYodWdsLCB2Z2V0X2xvd19zMTYodnYpLCAgY2YxNiwgMik7ICBcCi0gICAgaW50MzJ4NF90IGdjaCA9IHZxZG1sYWxfbGFuZV9zMTYodWdoLCB2Z2V0X2hpZ2hfczE2KHZ2KSwgY2YxNiwgMik7ICBcCi0gICAgaW50MTZ4OF90IGdjID0gdmNvbWJpbmVfczE2KHZyc2hybl9uX3MzMihnY2wsIDE2KSwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZyc2hybl9uX3MzMihnY2gsIDE2KSk7ICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50MzJ4NF90IHVibCA9IHZxZG1sYWxfbGFuZV9zMTYodnNobGxfbl9zMTYodmdldF9sb3dfczE2KHV1KSwgMSksICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmdldF9sb3dfczE2KHVkKSwgIGNmMTYsIDMpOyAgICAgICBcCi0gICAgaW50MzJ4NF90IHViaCA9IHZxZG1sYWxfbGFuZV9zMTYodnNobGxfbl9zMTYodmdldF9oaWdoX3MxNih1dSksIDEpLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmdldF9oaWdoX3MxNih1ZCksIGNmMTYsIDMpOyAgICAgICBcCi0gICAgaW50MTZ4OF90IHViID0gdmNvbWJpbmVfczE2KHZyc2hybl9uX3MzMih1YmwsIDE2KSwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZyc2hybl9uX3MzMih1YmgsIDE2KSk7ICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50MzJ4NF90IHJsID0gdmFkZGxfczE2KHZnZXRfbG93X3MxNih5eSksICB2Z2V0X2xvd19zMTYodnIpKTsgICAgICBcCi0gICAgaW50MzJ4NF90IHJoID0gdmFkZGxfczE2KHZnZXRfaGlnaF9zMTYoeXkpLCB2Z2V0X2hpZ2hfczE2KHZyKSk7ICAgICBcCi0gICAgaW50MzJ4NF90IGdsID0gdnN1YmxfczE2KHZnZXRfbG93X3MxNih5eSksICB2Z2V0X2xvd19zMTYoZ2MpKTsgICAgICBcCi0gICAgaW50MzJ4NF90IGdoID0gdnN1YmxfczE2KHZnZXRfaGlnaF9zMTYoeXkpLCB2Z2V0X2hpZ2hfczE2KGdjKSk7ICAgICBcCi0gICAgaW50MzJ4NF90IGJsID0gdmFkZGxfczE2KHZnZXRfbG93X3MxNih5eSksICB2Z2V0X2xvd19zMTYodWIpKTsgICAgICBcCi0gICAgaW50MzJ4NF90IGJoID0gdmFkZGxfczE2KHZnZXRfaGlnaF9zMTYoeXkpLCB2Z2V0X2hpZ2hfczE2KHViKSk7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmwgPSB2bXVscV9sYW5lX3MzMihybCwgY2YzMiwgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmggPSB2bXVscV9sYW5lX3MzMihyaCwgY2YzMiwgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZ2wgPSB2bXVscV9sYW5lX3MzMihnbCwgY2YzMiwgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZ2ggPSB2bXVscV9sYW5lX3MzMihnaCwgY2YzMiwgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYmwgPSB2bXVscV9sYW5lX3MzMihibCwgY2YzMiwgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYmggPSB2bXVscV9sYW5lX3MzMihiaCwgY2YzMiwgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeSA9IHZxbW92dW5fczE2KHZjb21iaW5lX3MxNih2cnNocm5fbl9zMzIocmwsIDE2KSwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cnNocm5fbl9zMzIocmgsIDE2KSkpOyAgICAgICAgICAgICAgICBcCi0gICAgdSA9IHZxbW92dW5fczE2KHZjb21iaW5lX3MxNih2cnNocm5fbl9zMzIoZ2wsIDE2KSwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cnNocm5fbl9zMzIoZ2gsIDE2KSkpOyAgICAgICAgICAgICAgICBcCi0gICAgdiA9IHZxbW92dW5fczE2KHZjb21iaW5lX3MxNih2cnNocm5fbl9zMzIoYmwsIDE2KSwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cnNocm5fbl9zMzIoYmgsIDE2KSkpOyAgICAgICAgICAgICAgICBcCi0gICAgU1RSXyAjIyBGTVQob3V0ICsgb2ZmLCB5LCB1LCB2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgdjI1NSB2bW92X25fdTgoMjU1KQotCi0jZGVmaW5lIFNUUl9SZ2Iob3V0LCByLCBnLCBiKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IHVpbnQ4eDh4M190IHJfZ19iID0ge3sgciwgZywgYiB9fTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHZzdDNfdTgob3V0LCByX2dfYik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIFNUUl9CZ3Iob3V0LCByLCBnLCBiKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IHVpbnQ4eDh4M190IGJfZ19yID0ge3sgYiwgZywgciB9fTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHZzdDNfdTgob3V0LCBiX2dfcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIFNUUl9SZ2JhKG91dCwgciwgZywgYikgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IHVpbnQ4eDh4NF90IHJfZ19iX3YyNTUgPSB7eyByLCBnLCBiLCB2MjU1IH19OyAgICAgICAgICAgICAgICAgICBcCi0gIHZzdDRfdTgob3V0LCByX2dfYl92MjU1KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIFNUUl9CZ3JhKG91dCwgciwgZywgYikgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IHVpbnQ4eDh4NF90IGJfZ19yX3YyNTUgPSB7eyBiLCBnLCByLCB2MjU1IH19OyAgICAgICAgICAgICAgICAgICBcCi0gIHZzdDRfdTgob3V0LCBiX2dfcl92MjU1KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIENPTlZFUlQxKEZNVCwgWFNURVAsIE4sIHNyY195LCBzcmNfdXYsIHJnYiwgY3VyX3gpIHsgICAgICAgICAgICBcCi0gIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGZvciAoaSA9IDA7IGkgPCBOOyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50IG9mZiA9ICgoY3VyX3gpICsgaSkgKiBYU1RFUDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50IHkgPSBzcmNfeVsoY3VyX3gpICsgaV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50IHUgPSAoc3JjX3V2KVtpXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50IHYgPSAoc3JjX3V2KVtpICsgMTZdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVlA4WXV2VG8gIyMgRk1UKHksIHUsIHYsIHJnYiArIG9mZik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgQ09OVkVSVDJSR0JfOChGTVQsIFhTVEVQLCB0b3BfeSwgYm90dG9tX3ksIHV2LCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICB0b3BfZHN0LCBib3R0b21fZHN0LCBjdXJfeCwgbGVuKSB7ICAgICAgICAgICAgICAgIFwKLSAgaWYgKHRvcF95KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBDT05WRVJUOChGTVQsIFhTVEVQLCBsZW4sIHRvcF95LCB1diwgdG9wX2RzdCwgY3VyX3gpICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaWYgKGJvdHRvbV95KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBDT05WRVJUOChGTVQsIFhTVEVQLCBsZW4sIGJvdHRvbV95LCAodXYpICsgMzIsIGJvdHRvbV9kc3QsIGN1cl94KSAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotI2RlZmluZSBDT05WRVJUMlJHQl8xKEZNVCwgWFNURVAsIHRvcF95LCBib3R0b21feSwgdXYsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgIHRvcF9kc3QsIGJvdHRvbV9kc3QsIGN1cl94LCBsZW4pIHsgICAgICAgICAgICAgICAgXAotICBpZiAodG9wX3kpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIENPTlZFUlQxKEZNVCwgWFNURVAsIGxlbiwgdG9wX3ksIHV2LCB0b3BfZHN0LCBjdXJfeCk7ICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpZiAoYm90dG9tX3kpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIENPTlZFUlQxKEZNVCwgWFNURVAsIGxlbiwgYm90dG9tX3ksICh1dikgKyAzMiwgYm90dG9tX2RzdCwgY3VyX3gpOyAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0jZGVmaW5lIE5FT05fVVBTQU1QTEVfRlVOQyhGVU5DX05BTUUsIEZNVCwgWFNURVApICAgICAgICAgICAgICAgICAgICAgICBcCi1zdGF0aWMgdm9pZCBGVU5DX05BTUUoY29uc3QgdWludDhfdCAqdG9wX3ksIGNvbnN0IHVpbnQ4X3QgKmJvdHRvbV95LCAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqdG9wX3UsIGNvbnN0IHVpbnQ4X3QgKnRvcF92LCAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqY3VyX3UsIGNvbnN0IHVpbnQ4X3QgKmN1cl92LCAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqdG9wX2RzdCwgdWludDhfdCAqYm90dG9tX2RzdCwgaW50IGxlbikgeyBcCi0gIGludCBibG9jazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIC8qIDE2IGJ5dGUgYWxpZ25lZCBhcnJheSB0byBjYWNoZSByZWNvbnN0cnVjdGVkIHUgYW5kIHYgKi8gICAgICAgICAgICBcCi0gIHVpbnQ4X3QgdXZfYnVmWzIgKiAzMiArIDE1XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHVpbnQ4X3QgKmNvbnN0IHJfdXYgPSAodWludDhfdCopKCh1aW50cHRyX3QpKHV2X2J1ZiArIDE1KSAmIH4xNSk7ICAgICBcCi0gIGNvbnN0IGludCB1dl9sZW4gPSAobGVuICsgMSkgPj4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIC8qIDkgcGl4ZWxzIG11c3QgYmUgcmVhZC1hYmxlIGZvciBlYWNoIGJsb2NrICovICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IGludCBudW1fYmxvY2tzID0gKHV2X2xlbiAtIDEpID4+IDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IGludCBsZWZ0b3ZlciA9IHV2X2xlbiAtIG51bV9ibG9ja3MgKiA4OyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IGludCBsYXN0X3BvcyA9IDEgKyAxNiAqIG51bV9ibG9ja3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IGludCB1X2RpYWcgPSAoKHRvcF91WzBdICsgY3VyX3VbMF0pID4+IDEpICsgMTsgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IGludCB2X2RpYWcgPSAoKHRvcF92WzBdICsgY3VyX3ZbMF0pID4+IDEpICsgMTsgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IGludDE2eDRfdCBjZjE2ID0gdmxkMV9zMTYoY29lZik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IGludDMyeDJfdCBjZjMyID0gdm1vdl9uX3MzMihDWSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IHVpbnQ4eDhfdCB1MTYgID0gdm1vdl9uX3U4KDE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IHVpbnQ4eDhfdCB1MTI4ID0gdm1vdl9uX3U4KDEyOCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIC8qIFRyZWF0IHRoZSBmaXJzdCBwaXhlbCBpbiByZWd1bGFyIHdheSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGlmICh0b3BfeSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY29uc3QgaW50IHUwID0gKHRvcF91WzBdICsgdV9kaWFnKSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY29uc3QgaW50IHYwID0gKHRvcF92WzBdICsgdl9kaWFnKSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVlA4WXV2VG8gIyMgRk1UKHRvcF95WzBdLCB1MCwgdjAsIHRvcF9kc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGlmIChib3R0b21feSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY29uc3QgaW50IHUwID0gKGN1cl91WzBdICsgdV9kaWFnKSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY29uc3QgaW50IHYwID0gKGN1cl92WzBdICsgdl9kaWFnKSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVlA4WXV2VG8gIyMgRk1UKGJvdHRvbV95WzBdLCB1MCwgdjAsIGJvdHRvbV9kc3QpOyAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGZvciAoYmxvY2sgPSAwOyBibG9jayA8IG51bV9ibG9ja3M7ICsrYmxvY2spIHsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVVBTQU1QTEVfMTZQSVhFTFModG9wX3UsIGN1cl91LCByX3V2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVVBTQU1QTEVfMTZQSVhFTFModG9wX3YsIGN1cl92LCByX3V2ICsgMTYpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQ09OVkVSVDJSR0JfOChGTVQsIFhTVEVQLCB0b3BfeSwgYm90dG9tX3ksIHJfdXYsICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICB0b3BfZHN0LCBib3R0b21fZHN0LCAxNiAqIGJsb2NrICsgMSwgMTYpOyAgICAgICAgICAgICBcCi0gICAgdG9wX3UgKz0gODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY3VyX3UgKz0gODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdG9wX3YgKz0gODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY3VyX3YgKz0gODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIFVQU0FNUExFX0xBU1RfQkxPQ0sodG9wX3UsIGN1cl91LCBsZWZ0b3Zlciwgcl91dik7ICAgICAgICAgICAgICAgICAgICBcCi0gIFVQU0FNUExFX0xBU1RfQkxPQ0sodG9wX3YsIGN1cl92LCBsZWZ0b3Zlciwgcl91diArIDE2KTsgICAgICAgICAgICAgICBcCi0gIENPTlZFUlQyUkdCXzEoRk1ULCBYU1RFUCwgdG9wX3ksIGJvdHRvbV95LCByX3V2LCAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgdG9wX2RzdCwgYm90dG9tX2RzdCwgbGFzdF9wb3MsIGxlbiAtIGxhc3RfcG9zKTsgICAgICAgICBcCi19Ci0KLS8vIE5FT04gdmFyaWFudHMgb2YgdGhlIGZhbmN5IHVwc2FtcGxlci4KLU5FT05fVVBTQU1QTEVfRlVOQyhVcHNhbXBsZVJnYkxpbmVQYWlyTkVPTiwgIFJnYiwgIDMpCi1ORU9OX1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVCZ3JMaW5lUGFpck5FT04sICBCZ3IsICAzKQotTkVPTl9VUFNBTVBMRV9GVU5DKFVwc2FtcGxlUmdiYUxpbmVQYWlyTkVPTiwgUmdiYSwgNCkKLU5FT05fVVBTQU1QTEVfRlVOQyhVcHNhbXBsZUJncmFMaW5lUGFpck5FT04sIEJncmEsIDQpCi0KLSNlbmRpZiAgLy8gRkFOQ1lfVVBTQU1QTElORwotCi0jZW5kaWYgICAvLyBXRUJQX1VTRV9ORU9OCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWV4dGVybiBXZWJQVXBzYW1wbGVMaW5lUGFpckZ1bmMgV2ViUFVwc2FtcGxlcnNbLyogTU9ERV9MQVNUICovXTsKLQotdm9pZCBXZWJQSW5pdFVwc2FtcGxlcnNORU9OKHZvaWQpIHsKLSNpZiBkZWZpbmVkKFdFQlBfVVNFX05FT04pCi0gIFdlYlBVcHNhbXBsZXJzW01PREVfUkdCXSAgPSBVcHNhbXBsZVJnYkxpbmVQYWlyTkVPTjsKLSAgV2ViUFVwc2FtcGxlcnNbTU9ERV9SR0JBXSA9IFVwc2FtcGxlUmdiYUxpbmVQYWlyTkVPTjsKLSAgV2ViUFVwc2FtcGxlcnNbTU9ERV9CR1JdICA9IFVwc2FtcGxlQmdyTGluZVBhaXJORU9OOwotICBXZWJQVXBzYW1wbGVyc1tNT0RFX0JHUkFdID0gVXBzYW1wbGVCZ3JhTGluZVBhaXJORU9OOwotI2VuZGlmICAgLy8gV0VCUF9VU0VfTkVPTgotfQotCi12b2lkIFdlYlBJbml0UHJlbXVsdGlwbHlORU9OKHZvaWQpIHsKLSNpZiBkZWZpbmVkKFdFQlBfVVNFX05FT04pCi0gIFdlYlBVcHNhbXBsZXJzW01PREVfcmdiQV0gPSBVcHNhbXBsZVJnYmFMaW5lUGFpck5FT047Ci0gIFdlYlBVcHNhbXBsZXJzW01PREVfYmdyQV0gPSBVcHNhbXBsZUJncmFMaW5lUGFpck5FT047Ci0jZW5kaWYgICAvLyBXRUJQX1VTRV9ORU9OCi19Ci0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL3Vwc2FtcGxpbmdfc3NlMi5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL3Vwc2FtcGxpbmdfc3NlMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTExNjBjLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RzcC91cHNhbXBsaW5nX3NzZTIuYworKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gU1NFMiB2ZXJzaW9uIG9mIFlVViB0byBSR0IgdXBzYW1wbGluZyBmdW5jdGlvbnMuCi0vLwotLy8gQXV0aG9yOiBzb21uYXRoQGdvb2dsZS5jb20gKFNvbW5hdGggQmFuZXJqZWUpCi0KLSNpbmNsdWRlICIuL2RzcC5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFMikKLQotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCi0jZWxzZQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2VuZGlmCi0jaW5jbHVkZSA8ZW1taW50cmluLmg+Ci0jaW5jbHVkZSAiLi95dXYuaCIKLQotI2lmZGVmIEZBTkNZX1VQU0FNUExJTkcKLQotLy8gV2UgY29tcHV0ZSAoOSphICsgMypiICsgMypjICsgZCArIDgpIC8gMTYgYXMgZm9sbG93cwotLy8gdSA9ICg5KmEgKyAzKmIgKyAzKmMgKyBkICsgOCkgLyAxNgotLy8gICA9IChhICsgKGEgKyAzKmIgKyAzKmMgKyBkKSAvIDggKyAxKSAvIDIKLS8vICAgPSAoYSArIG0gKyAxKSAvIDIKLS8vIHdoZXJlIG0gPSAoYSArIDMqYiArIDMqYyArIGQpIC8gOAotLy8gICAgICAgICA9ICgoYSArIGIgKyBjICsgZCkgLyAyICsgYiArIGMpIC8gNAotLy8KLS8vIExldCdzIHNheSAgayA9IChhICsgYiArIGMgKyBkKSAvIDQuCi0vLyBXZSBjYW4gY29tcHV0ZSBrIGFzCi0vLyBrID0gKHMgKyB0ICsgMSkgLyAyIC0gKChhXmQpIHwgKGJeYykgfCAoc150KSkgJiAxCi0vLyB3aGVyZSBzID0gKGEgKyBkICsgMSkgLyAyIGFuZCB0ID0gKGIgKyBjICsgMSkgLyAyCi0vLwotLy8gVGhlbiBtIGNhbiBiZSB3cml0dGVuIGFzCi0vLyBtID0gKGsgKyB0ICsgMSkgLyAyIC0gKCgoYl5jKSAmIChzXnQpKSB8IChrXnQpKSAmIDEKLQotLy8gQ29tcHV0ZXMgb3V0ID0gKGsgKyBpbiArIDEpIC8gMiAtICgoaWogJiAoc150KSkgfCAoa15pbikpICYgMQotI2RlZmluZSBHRVRfTShpaiwgaW4sIG91dCkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgX19tMTI4aSB0bXAwID0gX21tX2F2Z19lcHU4KGssIChpbikpOyAgICAgLyogKGsgKyBpbiArIDEpIC8gMiAqLyAgICAgICBcCi0gIGNvbnN0IF9fbTEyOGkgdG1wMSA9IF9tbV9hbmRfc2kxMjgoKGlqKSwgc3QpOyAgIC8qIChpaikgJiAoc150KSAqLyAgICAgICAgICAgXAotICBjb25zdCBfX20xMjhpIHRtcDIgPSBfbW1feG9yX3NpMTI4KGssIChpbikpOyAgICAvKiAoa15pbikgKi8gICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgX19tMTI4aSB0bXAzID0gX21tX29yX3NpMTI4KHRtcDEsIHRtcDIpOyAgLyogKChpaikgJiAoc150KSkgfCAoa15pbikgKi9cCi0gIGNvbnN0IF9fbTEyOGkgdG1wNCA9IF9tbV9hbmRfc2kxMjgodG1wMywgb25lKTsgIC8qICYgMSAtPiBsc2JfY29ycmVjdGlvbiAqLyAgXAotICAob3V0KSA9IF9tbV9zdWJfZXBpOCh0bXAwLCB0bXA0KTsgICAgLyogKGsgKyBpbiArIDEpIC8gMiAtIGxzYl9jb3JyZWN0aW9uICovIFwKLX0gd2hpbGUgKDApCi0KLS8vIHBhY2sgYW5kIHN0b3JlIHR3byBhbHRlcm5pbmcgcGl4ZWwgcm93cwotI2RlZmluZSBQQUNLX0FORF9TVE9SRShhLCBiLCBkYSwgZGIsIG91dCkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgX19tMTI4aSB0X2EgPSBfbW1fYXZnX2VwdTgoYSwgZGEpOyAgLyogKDlhICsgM2IgKyAzYyArICBkICsgOCkgLyAxNiAqLyBcCi0gIGNvbnN0IF9fbTEyOGkgdF9iID0gX21tX2F2Z19lcHU4KGIsIGRiKTsgIC8qICgzYSArIDliICsgIGMgKyAzZCArIDgpIC8gMTYgKi8gXAotICBjb25zdCBfX20xMjhpIHRfMSA9IF9tbV91bnBhY2tsb19lcGk4KHRfYSwgdF9iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgX19tMTI4aSB0XzIgPSBfbW1fdW5wYWNraGlfZXBpOCh0X2EsIHRfYik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIF9tbV9zdG9yZV9zaTEyOCgoKF9fbTEyOGkqKShvdXQpKSArIDAsIHRfMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBfbW1fc3RvcmVfc2kxMjgoKChfX20xMjhpKikob3V0KSkgKyAxLCB0XzIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0gd2hpbGUgKDApCi0KLS8vIExvYWRzIDE3IHBpeGVscyBlYWNoIGZyb20gcm93cyByMSBhbmQgcjIgYW5kIGdlbmVyYXRlcyAzMiBwaXhlbHMuCi0jZGVmaW5lIFVQU0FNUExFXzMyUElYRUxTKHIxLCByMiwgb3V0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCBfX20xMjhpIG9uZSA9IF9tbV9zZXQxX2VwaTgoMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgX19tMTI4aSBhID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmKHIxKVswXSk7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IF9fbTEyOGkgYiA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJihyMSlbMV0pOyAgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCBfX20xMjhpIGMgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSYocjIpWzBdKTsgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgX19tMTI4aSBkID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmKHIyKVsxXSk7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCBfX20xMjhpIHMgPSBfbW1fYXZnX2VwdTgoYSwgZCk7ICAgICAgICAvKiBzID0gKGEgKyBkICsgMSkgLyAyICovICAgICAgIFwKLSAgY29uc3QgX19tMTI4aSB0ID0gX21tX2F2Z19lcHU4KGIsIGMpOyAgICAgICAgLyogdCA9IChiICsgYyArIDEpIC8gMiAqLyAgICAgICBcCi0gIGNvbnN0IF9fbTEyOGkgc3QgPSBfbW1feG9yX3NpMTI4KHMsIHQpOyAgICAgIC8qIHN0ID0gc150ICovICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgX19tMTI4aSBhZCA9IF9tbV94b3Jfc2kxMjgoYSwgZCk7ICAgICAgLyogYWQgPSBhXmQgKi8gICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IF9fbTEyOGkgYmMgPSBfbW1feG9yX3NpMTI4KGIsIGMpOyAgICAgIC8qIGJjID0gYl5jICovICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgX19tMTI4aSB0MSA9IF9tbV9vcl9zaTEyOChhZCwgYmMpOyAgICAgLyogKGFeZCkgfCAoYl5jKSAqLyAgICAgICAgICAgICBcCi0gIGNvbnN0IF9fbTEyOGkgdDIgPSBfbW1fb3Jfc2kxMjgodDEsIHN0KTsgICAgIC8qIChhXmQpIHwgKGJeYykgfCAoc150KSAqLyAgICAgXAotICBjb25zdCBfX20xMjhpIHQzID0gX21tX2FuZF9zaTEyOCh0Miwgb25lKTsgICAvKiAoYV5kKSB8IChiXmMpIHwgKHNedCkgJiAxICovIFwKLSAgY29uc3QgX19tMTI4aSB0NCA9IF9tbV9hdmdfZXB1OChzLCB0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IF9fbTEyOGkgayA9IF9tbV9zdWJfZXBpOCh0NCwgdDMpOyAgICAgIC8qIGsgPSAoYSArIGIgKyBjICsgZCkgLyA0ICovICAgXAotICBfX20xMjhpIGRpYWcxLCBkaWFnMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEdFVF9NKGJjLCB0LCBkaWFnMSk7ICAgICAgICAgICAgICAgICAgLyogZGlhZzEgPSAoYSArIDNiICsgM2MgKyBkKSAvIDggKi8gICAgXAotICBHRVRfTShhZCwgcywgZGlhZzIpOyAgICAgICAgICAgICAgICAgIC8qIGRpYWcyID0gKDNhICsgYiArIGMgKyAzZCkgLyA4ICovICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIC8qIHBhY2sgdGhlIGFsdGVybmF0ZSBwaXhlbHMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBQQUNLX0FORF9TVE9SRShhLCBiLCBkaWFnMSwgZGlhZzIsICYob3V0KVswICogMzJdKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgUEFDS19BTkRfU1RPUkUoYywgZCwgZGlhZzIsIGRpYWcxLCAmKG91dClbMiAqIDMyXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLS8vIFR1cm4gdGhlIG1hY3JvIGludG8gYSBmdW5jdGlvbiBmb3IgcmVkdWNpbmcgY29kZS1zaXplIHdoZW4gbm9uLWNyaXRpY2FsCi1zdGF0aWMgdm9pZCBVcHNhbXBsZTMyUGl4ZWxzKGNvbnN0IHVpbnQ4X3QgcjFbXSwgY29uc3QgdWludDhfdCByMltdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBvdXQpIHsKLSAgVVBTQU1QTEVfMzJQSVhFTFMocjEsIHIyLCBvdXQpOwotfQotCi0jZGVmaW5lIFVQU0FNUExFX0xBU1RfQkxPQ0sodGIsIGJiLCBudW1fcGl4ZWxzLCBvdXQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB1aW50OF90IHIxWzE3XSwgcjJbMTddOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgU2JNZW1vcnlDb3B5KHIxLCAodGIpLCAobnVtX3BpeGVscykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIFNiTWVtb3J5Q29weShyMiwgKGJiKSwgKG51bV9waXhlbHMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAvKiByZXBsaWNhdGUgbGFzdCBieXRlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgU2JNZW1vcnlTZXQocjEgKyAobnVtX3BpeGVscyksIHIxWyhudW1fcGl4ZWxzKSAtIDFdLCAxNyAtIChudW1fcGl4ZWxzKSk7ICAgICAgICAgIFwKLSAgU2JNZW1vcnlTZXQocjIgKyAobnVtX3BpeGVscyksIHIyWyhudW1fcGl4ZWxzKSAtIDFdLCAxNyAtIChudW1fcGl4ZWxzKSk7ICAgICAgICAgIFwKLSAgLyogdXNpbmcgdGhlIHNoYXJlZCBmdW5jdGlvbiBpbnN0ZWFkIG9mIHRoZSBtYWNybyBzYXZlcyB+M2sgY29kZSBzaXplICovICAgICBcCi0gIFVwc2FtcGxlMzJQaXhlbHMocjEsIHIyLCBvdXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0jZGVmaW5lIENPTlZFUlQyUkdCKEZVTkMsIFhTVEVQLCB0b3BfeSwgYm90dG9tX3ksIHV2LCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICB0b3BfZHN0LCBib3R0b21fZHN0LCBjdXJfeCwgbnVtX3BpeGVscykgeyAgICAgICAgICAgICAgICAgIFwKLSAgaW50IG47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGlmICh0b3BfeSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZvciAobiA9IDA7IG4gPCAobnVtX3BpeGVscyk7ICsrbikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIEZVTkModG9wX3lbKGN1cl94KSArIG5dLCAodXYpW25dLCAodXYpWzMyICsgbl0sICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIHRvcF9kc3QgKyAoKGN1cl94KSArIG4pICogWFNURVApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGlmIChib3R0b21feSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZvciAobiA9IDA7IG4gPCAobnVtX3BpeGVscyk7ICsrbikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIEZVTkMoYm90dG9tX3lbKGN1cl94KSArIG5dLCAodXYpWzY0ICsgbl0sICh1dilbNjQgKyAzMiArIG5dLCAgICAgICAgICAgICBcCi0gICAgICAgICAgIGJvdHRvbV9kc3QgKyAoKGN1cl94KSArIG4pICogWFNURVApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgU1NFMl9VUFNBTVBMRV9GVU5DKEZVTkNfTkFNRSwgRlVOQywgWFNURVApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1zdGF0aWMgdm9pZCBGVU5DX05BTUUoY29uc3QgdWludDhfdCogdG9wX3ksIGNvbnN0IHVpbnQ4X3QqIGJvdHRvbV95LCAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcF91LCBjb25zdCB1aW50OF90KiB0b3BfdiwgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjdXJfdSwgY29uc3QgdWludDhfdCogY3VyX3YsICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdG9wX2RzdCwgdWludDhfdCogYm90dG9tX2RzdCwgaW50IGxlbikgeyAgICAgICAgXAotICBpbnQgYmxvY2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgLyogMTYgYnl0ZSBhbGlnbmVkIGFycmF5IHRvIGNhY2hlIHJlY29uc3RydWN0ZWQgdSBhbmQgdiAqLyAgICAgICAgICAgICAgICAgICBcCi0gIHVpbnQ4X3QgdXZfYnVmWzQgKiAzMiArIDE1XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB1aW50OF90KiBjb25zdCByX3V2ID0gKHVpbnQ4X3QqKSgodWludHB0cl90KSh1dl9idWYgKyAxNSkgJiB+MTUpOyAgICAgICAgICAgIFwKLSAgY29uc3QgaW50IHV2X2xlbiA9IChsZW4gKyAxKSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIC8qIDE3IHBpeGVscyBtdXN0IGJlIHJlYWQtYWJsZSBmb3IgZWFjaCBibG9jayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCBpbnQgbnVtX2Jsb2NrcyA9ICh1dl9sZW4gLSAxKSA+PiA0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgaW50IGxlZnRvdmVyID0gdXZfbGVuIC0gbnVtX2Jsb2NrcyAqIDE2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IGludCBsYXN0X3BvcyA9IDEgKyAzMiAqIG51bV9ibG9ja3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgaW50IHVfZGlhZyA9ICgodG9wX3VbMF0gKyBjdXJfdVswXSkgPj4gMSkgKyAxOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IGludCB2X2RpYWcgPSAoKHRvcF92WzBdICsgY3VyX3ZbMF0pID4+IDEpICsgMTsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgU0JfRENIRUNLKGxlbiA+IDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIC8qIFRyZWF0IHRoZSBmaXJzdCBwaXhlbCBpbiByZWd1bGFyIHdheSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpZiAodG9wX3kpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjb25zdCBpbnQgdTAgPSAodG9wX3VbMF0gKyB1X2RpYWcpID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY29uc3QgaW50IHYwID0gKHRvcF92WzBdICsgdl9kaWFnKSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZVTkModG9wX3lbMF0sIHUwLCB2MCwgdG9wX2RzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGlmIChib3R0b21feSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNvbnN0IGludCB1MCA9IChjdXJfdVswXSArIHVfZGlhZykgPj4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjb25zdCBpbnQgdjAgPSAoY3VyX3ZbMF0gKyB2X2RpYWcpID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlVOQyhib3R0b21feVswXSwgdTAsIHYwLCBib3R0b21fZHN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGZvciAoYmxvY2sgPSAwOyBibG9jayA8IG51bV9ibG9ja3M7ICsrYmxvY2spIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFVQU0FNUExFXzMyUElYRUxTKHRvcF91LCBjdXJfdSwgcl91diArIDAgKiAzMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBVUFNBTVBMRV8zMlBJWEVMUyh0b3BfdiwgY3VyX3YsIHJfdXYgKyAxICogMzIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQ09OVkVSVDJSR0IoRlVOQywgWFNURVAsIHRvcF95LCBib3R0b21feSwgcl91diwgdG9wX2RzdCwgYm90dG9tX2RzdCwgICAgICAgXAotICAgICAgICAgICAgICAgIDMyICogYmxvY2sgKyAxLCAzMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0b3BfdSArPSAxNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY3VyX3UgKz0gMTY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHRvcF92ICs9IDE2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjdXJfdiArPSAxNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgVVBTQU1QTEVfTEFTVF9CTE9DSyh0b3BfdSwgY3VyX3UsIGxlZnRvdmVyLCByX3V2ICsgMCAqIDMyKTsgICAgICAgICAgICAgICAgICBcCi0gIFVQU0FNUExFX0xBU1RfQkxPQ0sodG9wX3YsIGN1cl92LCBsZWZ0b3Zlciwgcl91diArIDEgKiAzMik7ICAgICAgICAgICAgICAgICAgXAotICBDT05WRVJUMlJHQihGVU5DLCBYU1RFUCwgdG9wX3ksIGJvdHRvbV95LCByX3V2LCB0b3BfZHN0LCBib3R0b21fZHN0LCAgICAgICAgIFwKLSAgICAgICAgICAgICAgbGFzdF9wb3MsIGxlbiAtIGxhc3RfcG9zKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLS8vIFNTRTIgdmFyaWFudHMgb2YgdGhlIGZhbmN5IHVwc2FtcGxlci4KLVNTRTJfVVBTQU1QTEVfRlVOQyhVcHNhbXBsZVJnYkxpbmVQYWlyU1NFMiwgIFZQOFl1dlRvUmdiLCAgMykKLVNTRTJfVVBTQU1QTEVfRlVOQyhVcHNhbXBsZUJnckxpbmVQYWlyU1NFMiwgIFZQOFl1dlRvQmdyLCAgMykKLVNTRTJfVVBTQU1QTEVfRlVOQyhVcHNhbXBsZVJnYmFMaW5lUGFpclNTRTIsIFZQOFl1dlRvUmdiYSwgNCkKLVNTRTJfVVBTQU1QTEVfRlVOQyhVcHNhbXBsZUJncmFMaW5lUGFpclNTRTIsIFZQOFl1dlRvQmdyYSwgNCkKLQotI3VuZGVmIEdFVF9NCi0jdW5kZWYgUEFDS19BTkRfU1RPUkUKLSN1bmRlZiBVUFNBTVBMRV8zMlBJWEVMUwotI3VuZGVmIFVQU0FNUExFX0xBU1RfQkxPQ0sKLSN1bmRlZiBDT05WRVJUMlJHQgotI3VuZGVmIFNTRTJfVVBTQU1QTEVfRlVOQwotCi0jZW5kaWYgIC8vIEZBTkNZX1VQU0FNUExJTkcKLQotI2VuZGlmICAgLy8gV0VCUF9VU0VfU1NFMgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1leHRlcm4gV2ViUFVwc2FtcGxlTGluZVBhaXJGdW5jIFdlYlBVcHNhbXBsZXJzWy8qIE1PREVfTEFTVCAqL107Ci0KLXZvaWQgV2ViUEluaXRVcHNhbXBsZXJzU1NFMih2b2lkKSB7Ci0jaWYgZGVmaW5lZChXRUJQX1VTRV9TU0UyKQotICBXZWJQVXBzYW1wbGVyc1tNT0RFX1JHQl0gID0gVXBzYW1wbGVSZ2JMaW5lUGFpclNTRTI7Ci0gIFdlYlBVcHNhbXBsZXJzW01PREVfUkdCQV0gPSBVcHNhbXBsZVJnYmFMaW5lUGFpclNTRTI7Ci0gIFdlYlBVcHNhbXBsZXJzW01PREVfQkdSXSAgPSBVcHNhbXBsZUJnckxpbmVQYWlyU1NFMjsKLSAgV2ViUFVwc2FtcGxlcnNbTU9ERV9CR1JBXSA9IFVwc2FtcGxlQmdyYUxpbmVQYWlyU1NFMjsKLSNlbmRpZiAgIC8vIFdFQlBfVVNFX1NTRTIKLX0KLQotdm9pZCBXZWJQSW5pdFByZW11bHRpcGx5U1NFMih2b2lkKSB7Ci0jaWYgZGVmaW5lZChXRUJQX1VTRV9TU0UyKQotICBXZWJQVXBzYW1wbGVyc1tNT0RFX3JnYkFdID0gVXBzYW1wbGVSZ2JhTGluZVBhaXJTU0UyOwotICBXZWJQVXBzYW1wbGVyc1tNT0RFX2JnckFdID0gVXBzYW1wbGVCZ3JhTGluZVBhaXJTU0UyOwotI2VuZGlmICAgLy8gV0VCUF9VU0VfU1NFMgotfQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKLQotCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kc3AveXV2LmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kc3AveXV2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNTlmNzQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL3l1di5jCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIFlVVi0+UkdCIGNvbnZlcnNpb24gZnVuY3Rpb24KLS8vCi0vLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQotCi0jaW5jbHVkZSAiLi95dXYuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpZmRlZiBXRUJQX1lVVl9VU0VfVEFCTEUKLQotaW50MTZfdCBWUDhrVlRvUlsyNTZdLCBWUDhrVVRvQlsyNTZdOwotaW50MzJfdCBWUDhrVlRvR1syNTZdLCBWUDhrVVRvR1syNTZdOwotdWludDhfdCBWUDhrQ2xpcFtZVVZfUkFOR0VfTUFYIC0gWVVWX1JBTkdFX01JTl07Ci11aW50OF90IFZQOGtDbGlwNEJpdHNbWVVWX1JBTkdFX01BWCAtIFlVVl9SQU5HRV9NSU5dOwotCi1zdGF0aWMgaW50IGRvbmUgPSAwOwotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDhfdCBjbGlwKGludCB2LCBpbnQgbWF4X3ZhbHVlKSB7Ci0gIHJldHVybiB2IDwgMCA/IDAgOiB2ID4gbWF4X3ZhbHVlID8gbWF4X3ZhbHVlIDogdjsKLX0KLQotdm9pZCBWUDhZVVZJbml0KHZvaWQpIHsKLSAgaW50IGk7Ci0gIGlmIChkb25lKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0jaWZuZGVmIFVTRV9ZVVZqCi0gIGZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkgewotICAgIFZQOGtWVG9SW2ldID0gKDg5ODU4ICogKGkgLSAxMjgpICsgWVVWX0hBTEYpID4+IFlVVl9GSVg7Ci0gICAgVlA4a1VUb0dbaV0gPSAtMjIwMTQgKiAoaSAtIDEyOCkgKyBZVVZfSEFMRjsKLSAgICBWUDhrVlRvR1tpXSA9IC00NTc3MyAqIChpIC0gMTI4KTsKLSAgICBWUDhrVVRvQltpXSA9ICgxMTM2MTggKiAoaSAtIDEyOCkgKyBZVVZfSEFMRikgPj4gWVVWX0ZJWDsKLSAgfQotICBmb3IgKGkgPSBZVVZfUkFOR0VfTUlOOyBpIDwgWVVWX1JBTkdFX01BWDsgKytpKSB7Ci0gICAgY29uc3QgaW50IGsgPSAoKGkgLSAxNikgKiA3NjI4MyArIFlVVl9IQUxGKSA+PiBZVVZfRklYOwotICAgIFZQOGtDbGlwW2kgLSBZVVZfUkFOR0VfTUlOXSA9IGNsaXAoaywgMjU1KTsKLSAgICBWUDhrQ2xpcDRCaXRzW2kgLSBZVVZfUkFOR0VfTUlOXSA9IGNsaXAoKGsgKyA4KSA+PiA0LCAxNSk7Ci0gIH0KLSNlbHNlCi0gIGZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkgewotICAgIFZQOGtWVG9SW2ldID0gKDkxODgxICogKGkgLSAxMjgpICsgWVVWX0hBTEYpID4+IFlVVl9GSVg7Ci0gICAgVlA4a1VUb0dbaV0gPSAtMjI1NTQgKiAoaSAtIDEyOCkgKyBZVVZfSEFMRjsKLSAgICBWUDhrVlRvR1tpXSA9IC00NjgwMiAqIChpIC0gMTI4KTsKLSAgICBWUDhrVVRvQltpXSA9ICgxMTYxMzAgKiAoaSAtIDEyOCkgKyBZVVZfSEFMRikgPj4gWVVWX0ZJWDsKLSAgfQotICBmb3IgKGkgPSBZVVZfUkFOR0VfTUlOOyBpIDwgWVVWX1JBTkdFX01BWDsgKytpKSB7Ci0gICAgY29uc3QgaW50IGsgPSBpOwotICAgIFZQOGtDbGlwW2kgLSBZVVZfUkFOR0VfTUlOXSA9IGNsaXAoaywgMjU1KTsKLSAgICBWUDhrQ2xpcDRCaXRzW2kgLSBZVVZfUkFOR0VfTUlOXSA9IGNsaXAoKGsgKyA4KSA+PiA0LCAxNSk7Ci0gIH0KLSNlbmRpZgotCi0gIGRvbmUgPSAxOwotfQotCi0jZWxzZQotCi12b2lkIFZQOFlVVkluaXQodm9pZCkge30KLQotI2VuZGlmICAvLyBXRUJQX1lVVl9VU0VfVEFCTEUKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kc3AveXV2LmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kc3AveXV2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NDRkOGMuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL3l1di5oCisrKyAvZGV2L251bGwKQEAgLTEsMjg0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDEwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBpbmxpbmUgWVVWPC0+UkdCIGNvbnZlcnNpb24gZnVuY3Rpb24KLS8vCi0vLyBUaGUgZXhhY3QgbmFtaW5nIGlzIFknQ2JDciwgZm9sbG93aW5nIHRoZSBJVFUtUiBCVC42MDEgc3RhbmRhcmQuCi0vLyBNb3JlIGluZm9ybWF0aW9uIGF0OiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1lDYkNyCi0vLyBZID0gMC4yNTY5ICogUiArIDAuNTA0NCAqIEcgKyAwLjA5NzkgKiBCICsgMTYKLS8vIFUgPSAtMC4xNDgzICogUiAtIDAuMjkxMSAqIEcgKyAwLjQzOTQgKiBCICsgMTI4Ci0vLyBWID0gMC40Mzk0ICogUiAtIDAuMzY3OSAqIEcgLSAwLjA3MTUgKiBCICsgMTI4Ci0vLyBXZSB1c2UgMTZiaXQgZml4ZWQgcG9pbnQgb3BlcmF0aW9ucyBmb3IgUkdCLT5ZVVYgY29udmVyc2lvbi4KLS8vCi0vLyBGb3IgdGhlIFknQ2JDciB0byBSR0IgY29udmVyc2lvbiwgdGhlIEJULjYwMSBzcGVjaWZpY2F0aW9uIHJlYWRzOgotLy8gICBSID0gMS4xNjQgKiAoWS0xNikgKyAxLjU5NiAqIChWLTEyOCkKLS8vICAgRyA9IDEuMTY0ICogKFktMTYpIC0gMC44MTMgKiAoVi0xMjgpIC0gMC4zOTEgKiAoVS0xMjgpCi0vLyAgIEIgPSAxLjE2NCAqIChZLTE2KSAgICAgICAgICAgICAgICAgICArIDIuMDE4ICogKFUtMTI4KQotLy8gd2hlcmUgWSBpcyBpbiB0aGUgWzE2LDIzNV0gcmFuZ2UsIGFuZCBVL1YgaW4gdGhlIFsxNiwyNDBdIHJhbmdlLgotLy8gSW4gdGhlIHRhYmxlLWxvb2t1cCB2ZXJzaW9uIChXRUJQX1lVVl9VU0VfVEFCTEUpLCB0aGUgY29tbW9uIGZhY3RvcgotLy8gIjEuMTY0ICogKFktMTYpIiBjYW4gYmUgaGFuZGxlZCBhcyBhbiBvZmZzZXQgaW4gdGhlIFZQOGtDbGlwW10gdGFibGUuCi0vLyBTbyBpbiB0aGlzIGNhc2UgdGhlIGZvcm11bGFlIHNob3VsZCBiZSByZWFkIGFzOgotLy8gICBSID0gMS4xNjQgKiBbWSArIDEuMzcxICogKFYtMTI4KSAgICAgICAgICAgICAgICAgIF0gLSAxOC42MjQKLS8vICAgRyA9IDEuMTY0ICogW1kgLSAwLjY5OCAqIChWLTEyOCkgLSAwLjMzNiAqIChVLTEyOCldIC0gMTguNjI0Ci0vLyAgIEIgPSAxLjE2NCAqIFtZICAgICAgICAgICAgICAgICAgICsgMS43MzMgKiAoVS0xMjgpXSAtIDE4LjYyNAotLy8gb25jZSBmYWN0b3JpemVkLiBIZXJlIHRvbywgMTZiaXQgZml4ZWQgcHJlY2lzaW9uIGlzIHVzZWQuCi0vLwotLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKLQotI2lmbmRlZiBXRUJQX0RTUF9ZVVZfSF8KLSNkZWZpbmUgV0VCUF9EU1BfWVVWX0hfCi0KLSNpbmNsdWRlICIuLi9kZWMvZGVjb2RlX3ZwOC5oIgotCi0vLyBEZWZpbmUgdGhlIGZvbGxvd2luZyB0byB1c2UgdGhlIExVVC1iYXNlZCBjb2RlOgotI2RlZmluZSBXRUJQX1lVVl9VU0VfVEFCTEUKLQotI2lmIGRlZmluZWQoV0VCUF9FWFBFUklNRU5UQUxfRkVBVFVSRVMpCi0vLyBEbyBOT1QgYWN0aXZhdGUgdGhpcyBmZWF0dXJlIGZvciByZWFsIGNvbXByZXNzaW9uLiBUaGlzIGlzIG9ubHkgZXhwZXJpbWVudGFsIQotLy8gVGhpcyBmbGFnIGlzIGZvciBjb21wYXJpc29uIHB1cnBvc2UgYWdhaW5zdCBKUEVHJ3MgIllVVmoiIG5hdHVyYWwgY29sb3JzcGFjZS4KLS8vIFRoaXMgY29sb3JzcGFjZSBpcyBjbG9zZSB0byBSZWMuNjAxJ3MgWSdDYkNyIG1vZGVsIHdpdGggdGhlIG5vdGFibGUKLS8vIGRpZmZlcmVuY2Ugb2YgYWxsb3dpbmcgbGFyZ2VyIHJhbmdlIGZvciBsdW1hL2Nocm9tYS4KLS8vIFNlZSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1lDYkNyI0pQRUdfY29udmVyc2lvbiBwYXJhZ3JhcGgsIGFuZCBpdHMKLS8vIGRpZmZlcmVuY2Ugd2l0aCBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1lDYkNyI0lUVS1SX0JULjYwMV9jb252ZXJzaW9uCi0vLyAjZGVmaW5lIFVTRV9ZVVZqCi0jZW5kaWYKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFlVViAtPiBSR0IgY29udmVyc2lvbgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotZW51bSB7IFlVVl9GSVggPSAxNiwgICAgICAgICAgICAgICAgLy8gZml4ZWQtcG9pbnQgcHJlY2lzaW9uCi0gICAgICAgWVVWX0hBTEYgPSAxIDw8IChZVVZfRklYIC0gMSksCi0gICAgICAgWVVWX01BU0sgPSAoMjU2IDw8IFlVVl9GSVgpIC0gMSwKLSAgICAgICBZVVZfUkFOR0VfTUlOID0gLTIyNywgICAgICAgIC8vIG1pbiB2YWx1ZSBvZiByL2cvYiBvdXRwdXQKLSAgICAgICBZVVZfUkFOR0VfTUFYID0gMjU2ICsgMjI2ICAgIC8vIG1heCB2YWx1ZSBvZiByL2cvYiBvdXRwdXQKLX07Ci0KLSNpZmRlZiBXRUJQX1lVVl9VU0VfVEFCTEUKLQotZXh0ZXJuIGludDE2X3QgVlA4a1ZUb1JbMjU2XSwgVlA4a1VUb0JbMjU2XTsKLWV4dGVybiBpbnQzMl90IFZQOGtWVG9HWzI1Nl0sIFZQOGtVVG9HWzI1Nl07Ci1leHRlcm4gdWludDhfdCBWUDhrQ2xpcFtZVVZfUkFOR0VfTUFYIC0gWVVWX1JBTkdFX01JTl07Ci1leHRlcm4gdWludDhfdCBWUDhrQ2xpcDRCaXRzW1lVVl9SQU5HRV9NQVggLSBZVVZfUkFOR0VfTUlOXTsKLQotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVlA4WXV2VG9SZ2IodWludDhfdCB5LCB1aW50OF90IHUsIHVpbnQ4X3QgdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IHJnYikgewotICBjb25zdCBpbnQgcl9vZmYgPSBWUDhrVlRvUlt2XTsKLSAgY29uc3QgaW50IGdfb2ZmID0gKFZQOGtWVG9HW3ZdICsgVlA4a1VUb0dbdV0pID4+IFlVVl9GSVg7Ci0gIGNvbnN0IGludCBiX29mZiA9IFZQOGtVVG9CW3VdOwotICByZ2JbMF0gPSBWUDhrQ2xpcFt5ICsgcl9vZmYgLSBZVVZfUkFOR0VfTUlOXTsKLSAgcmdiWzFdID0gVlA4a0NsaXBbeSArIGdfb2ZmIC0gWVVWX1JBTkdFX01JTl07Ci0gIHJnYlsyXSA9IFZQOGtDbGlwW3kgKyBiX29mZiAtIFlVVl9SQU5HRV9NSU5dOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWUDhZdXZUb0Jncih1aW50OF90IHksIHVpbnQ4X3QgdSwgdWludDhfdCB2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgYmdyKSB7Ci0gIGNvbnN0IGludCByX29mZiA9IFZQOGtWVG9SW3ZdOwotICBjb25zdCBpbnQgZ19vZmYgPSAoVlA4a1ZUb0dbdl0gKyBWUDhrVVRvR1t1XSkgPj4gWVVWX0ZJWDsKLSAgY29uc3QgaW50IGJfb2ZmID0gVlA4a1VUb0JbdV07Ci0gIGJnclswXSA9IFZQOGtDbGlwW3kgKyBiX29mZiAtIFlVVl9SQU5HRV9NSU5dOwotICBiZ3JbMV0gPSBWUDhrQ2xpcFt5ICsgZ19vZmYgLSBZVVZfUkFOR0VfTUlOXTsKLSAgYmdyWzJdID0gVlA4a0NsaXBbeSArIHJfb2ZmIC0gWVVWX1JBTkdFX01JTl07Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZQOFl1dlRvUmdiNTY1KHVpbnQ4X3QgeSwgdWludDhfdCB1LCB1aW50OF90IHYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCByZ2IpIHsKLSAgY29uc3QgaW50IHJfb2ZmID0gVlA4a1ZUb1Jbdl07Ci0gIGNvbnN0IGludCBnX29mZiA9IChWUDhrVlRvR1t2XSArIFZQOGtVVG9HW3VdKSA+PiBZVVZfRklYOwotICBjb25zdCBpbnQgYl9vZmYgPSBWUDhrVVRvQlt1XTsKLSAgY29uc3QgdWludDhfdCByZyA9ICgoVlA4a0NsaXBbeSArIHJfb2ZmIC0gWVVWX1JBTkdFX01JTl0gJiAweGY4KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgKFZQOGtDbGlwW3kgKyBnX29mZiAtIFlVVl9SQU5HRV9NSU5dID4+IDUpKTsKLSAgY29uc3QgdWludDhfdCBnYiA9ICgoKFZQOGtDbGlwW3kgKyBnX29mZiAtIFlVVl9SQU5HRV9NSU5dIDw8IDMpICYgMHhlMCkgfAotICAgICAgICAgICAgICAgICAgICAgIChWUDhrQ2xpcFt5ICsgYl9vZmYgLSBZVVZfUkFOR0VfTUlOXSA+PiAzKSk7Ci0jaWZkZWYgV0VCUF9TV0FQXzE2QklUX0NTUAotICByZ2JbMF0gPSBnYjsKLSAgcmdiWzFdID0gcmc7Ci0jZWxzZQotICByZ2JbMF0gPSByZzsKLSAgcmdiWzFdID0gZ2I7Ci0jZW5kaWYKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVlA4WXV2VG9SZ2JhNDQ0NCh1aW50OF90IHksIHVpbnQ4X3QgdSwgdWludDhfdCB2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBhcmdiKSB7Ci0gIGNvbnN0IGludCByX29mZiA9IFZQOGtWVG9SW3ZdOwotICBjb25zdCBpbnQgZ19vZmYgPSAoVlA4a1ZUb0dbdl0gKyBWUDhrVVRvR1t1XSkgPj4gWVVWX0ZJWDsKLSAgY29uc3QgaW50IGJfb2ZmID0gVlA4a1VUb0JbdV07Ci0gIGNvbnN0IHVpbnQ4X3QgcmcgPSAoKFZQOGtDbGlwNEJpdHNbeSArIHJfb2ZmIC0gWVVWX1JBTkdFX01JTl0gPDwgNCkgfAotICAgICAgICAgICAgICAgICAgICAgIFZQOGtDbGlwNEJpdHNbeSArIGdfb2ZmIC0gWVVWX1JBTkdFX01JTl0pOwotICBjb25zdCB1aW50OF90IGJhID0gKFZQOGtDbGlwNEJpdHNbeSArIGJfb2ZmIC0gWVVWX1JBTkdFX01JTl0gPDwgNCkgfCAweDBmOwotI2lmZGVmIFdFQlBfU1dBUF8xNkJJVF9DU1AKLSAgYXJnYlswXSA9IGJhOwotICBhcmdiWzFdID0gcmc7Ci0jZWxzZQotICBhcmdiWzBdID0gcmc7Ci0gIGFyZ2JbMV0gPSBiYTsKLSNlbmRpZgotfQotCi0jZWxzZSAgIC8vIFRhYmxlLWZyZWUgdmVyc2lvbiAoc2xvd2VyIG9uIHg4NikKLQotLy8gVGhlc2UgY29uc3RhbnRzIGFyZSAxNmIgZml4ZWQtcG9pbnQgdmVyc2lvbiBvZiBJVFUtUiBCVC42MDEgY29uc3RhbnRzCi0jZGVmaW5lIGtZU2NhbGUgNzYzMDkgICAgICAvLyAxLjE2NCA9IDI1NSAvIDIxOQotI2RlZmluZSBrVlRvUiAgIDEwNDU5NyAgICAgLy8gMS41OTYgPSAyNTUgLyAxMTIgKiAwLjcwMQotI2RlZmluZSBrVVRvRyAgIDI1Njc0ICAgICAgLy8gMC4zOTEgPSAyNTUgLyAxMTIgKiAwLjg4NiAqIDAuMTE0IC8gMC41ODcKLSNkZWZpbmUga1ZUb0cgICA1MzI3OCAgICAgIC8vIDAuODEzID0gMjU1IC8gMTEyICogMC43MDEgKiAwLjI5OSAvIDAuNTg3Ci0jZGVmaW5lIGtVVG9CICAgMTMyMjAxICAgICAvLyAyLjAxOCA9IDI1NSAvIDExMiAqIDAuODg2Ci0jZGVmaW5lIGtSQ3N0ICgta1lTY2FsZSAqIDE2IC0ga1ZUb1IgKiAxMjggKyBZVVZfSEFMRikKLSNkZWZpbmUga0dDc3QgKC1rWVNjYWxlICogMTYgKyBrVVRvRyAqIDEyOCArIGtWVG9HICogMTI4ICsgWVVWX0hBTEYpCi0jZGVmaW5lIGtCQ3N0ICgta1lTY2FsZSAqIDE2IC0ga1VUb0IgKiAxMjggKyBZVVZfSEFMRikKLQotc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ4X3QgVlA4Q2xpcDgoaW50IHYpIHsKLSAgcmV0dXJuICgodiAmIH5ZVVZfTUFTSykgPT0gMCkgPyAodWludDhfdCkodiA+PiBZVVZfRklYKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICh2IDwgMCkgPyAwdSA6IDI1NXU7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB1aW50OF90IFZQOENsaXBOKGludCB2LCBpbnQgTikgeyAgLy8gY2xpcCB0byBOIGJpdHMKLSAgcmV0dXJuICgodiAmIH5ZVVZfTUFTSykgPT0gMCkgPyAodWludDhfdCkodiA+PiAoWVVWX0ZJWCArICg4IC0gTikpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICh2IDwgMCkgPyAwdSA6ICgyNTV1ID4+ICg4IC0gTikpOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOFlVVlRvUihpbnQgeSwgaW50IHYpIHsKLSAgcmV0dXJuIGtZU2NhbGUgKiB5ICsga1ZUb1IgKiB2ICsga1JDc3Q7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4WVVWVG9HKGludCB5LCBpbnQgdSwgaW50IHYpIHsKLSAgcmV0dXJuIGtZU2NhbGUgKiB5IC0ga1VUb0cgKiB1IC0ga1ZUb0cgKiB2ICsga0dDc3Q7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4WVVWVG9CKGludCB5LCBpbnQgdSkgewotICByZXR1cm4ga1lTY2FsZSAqIHkgICsga1VUb0IgKiB1ICsga0JDc3Q7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZQOFl1dlRvUmdiKHVpbnQ4X3QgeSwgdWludDhfdCB1LCB1aW50OF90IHYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCByZ2IpIHsKLSAgcmdiWzBdID0gVlA4Q2xpcDgoVlA4WVVWVG9SKHksIHYpKTsKLSAgcmdiWzFdID0gVlA4Q2xpcDgoVlA4WVVWVG9HKHksIHUsIHYpKTsKLSAgcmdiWzJdID0gVlA4Q2xpcDgoVlA4WVVWVG9CKHksIHUpKTsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVlA4WXV2VG9CZ3IodWludDhfdCB5LCB1aW50OF90IHUsIHVpbnQ4X3QgdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IGJncikgewotICBiZ3JbMF0gPSBWUDhDbGlwOChWUDhZVVZUb0IoeSwgdSkpOwotICBiZ3JbMV0gPSBWUDhDbGlwOChWUDhZVVZUb0coeSwgdSwgdikpOwotICBiZ3JbMl0gPSBWUDhDbGlwOChWUDhZVVZUb1IoeSwgdikpOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWUDhZdXZUb1JnYjU2NSh1aW50OF90IHksIHVpbnQ4X3QgdSwgdWludDhfdCB2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgcmdiKSB7Ci0gIGNvbnN0IGludCByID0gVlA4Q2xpcDgoVlA4WVVWVG9SKHksIHUpKTsKLSAgY29uc3QgaW50IGcgPSBWUDhDbGlwTihWUDhZVVZUb0coeSwgdSwgdiksIDYpOwotICBjb25zdCBpbnQgYiA9IFZQOENsaXBOKFZQOFlVVlRvQih5LCB2KSwgNSk7Ci0gIGNvbnN0IHVpbnQ4X3QgcmcgPSAociAmIDB4ZjgpIHwgKGcgPj4gMyk7Ci0gIGNvbnN0IHVpbnQ4X3QgZ2IgPSAoZyA8PCA1KSB8IGI7Ci0jaWZkZWYgV0VCUF9TV0FQXzE2QklUX0NTUAotICByZ2JbMF0gPSBnYjsKLSAgcmdiWzFdID0gcmc7Ci0jZWxzZQotICByZ2JbMF0gPSByZzsKLSAgcmdiWzFdID0gZ2I7Ci0jZW5kaWYKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVlA4WXV2VG9SZ2JhNDQ0NCh1aW50OF90IHksIHVpbnQ4X3QgdSwgdWludDhfdCB2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBhcmdiKSB7Ci0gIGNvbnN0IGludCByID0gVlA4Q2xpcDgoVlA4WVVWVG9SKHksIHUpKTsKLSAgY29uc3QgaW50IGcgPSBWUDhDbGlwTihWUDhZVVZUb0coeSwgdSwgdiksIDQpOwotICBjb25zdCBpbnQgYiA9IFZQOENsaXA4KFZQOFlVVlRvQih5LCB2KSk7Ci0gIGNvbnN0IHVpbnQ4X3QgcmcgPSAociAmIDB4ZjApIHwgZzsKLSAgY29uc3QgdWludDhfdCBiYSA9IGIgfCAweDBmOyAgIC8vIG92ZXJ3cml0ZSB0aGUgbG93ZXIgNCBiaXRzCi0jaWZkZWYgV0VCUF9TV0FQXzE2QklUX0NTUAotICBhcmdiWzBdID0gYmE7Ci0gIGFyZ2JbMV0gPSByZzsKLSNlbHNlCi0gIGFyZ2JbMF0gPSByZzsKLSAgYXJnYlsxXSA9IGJhOwotI2VuZGlmCi19Ci0KLSNlbmRpZiAgLy8gV0VCUF9ZVVZfVVNFX1RBQkxFCi0KLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZQOFl1dlRvQXJnYih1aW50OF90IHksIHVpbnQ4X3QgdSwgdWludDhfdCB2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IGFyZ2IpIHsKLSAgYXJnYlswXSA9IDB4ZmY7Ci0gIFZQOFl1dlRvUmdiKHksIHUsIHYsIGFyZ2IgKyAxKTsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVlA4WXV2VG9CZ3JhKHVpbnQ4X3QgeSwgdWludDhfdCB1LCB1aW50OF90IHYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgYmdyYSkgewotICBWUDhZdXZUb0Jncih5LCB1LCB2LCBiZ3JhKTsKLSAgYmdyYVszXSA9IDB4ZmY7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZQOFl1dlRvUmdiYSh1aW50OF90IHksIHVpbnQ4X3QgdSwgdWludDhfdCB2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IHJnYmEpIHsKLSAgVlA4WXV2VG9SZ2IoeSwgdSwgdiwgcmdiYSk7Ci0gIHJnYmFbM10gPSAweGZmOwotfQotCi0vLyBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgZXZlcnl0aGluZywgdG8gaW5pdGlhbGl6ZSB0aGUgdGFibGVzLgotdm9pZCBWUDhZVVZJbml0KHZvaWQpOwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gUkdCIC0+IFlVViBjb252ZXJzaW9uCi0KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4Q2xpcFVWKGludCB2KSB7Ci0gIHYgPSAodiArICgyNTcgPDwgKFlVVl9GSVggKyAyIC0gMSkpKSA+PiAoWVVWX0ZJWCArIDIpOwotICByZXR1cm4gKCh2ICYgfjB4ZmYpID09IDApID8gdiA6ICh2IDwgMCkgPyAwIDogMjU1OwotfQotCi0jaWZuZGVmIFVTRV9ZVVZqCi0KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4UkdCVG9ZKGludCByLCBpbnQgZywgaW50IGIpIHsKLSAgY29uc3QgaW50IGtSb3VuZCA9ICgxIDw8IChZVVZfRklYIC0gMSkpICsgKDE2IDw8IFlVVl9GSVgpOwotICBjb25zdCBpbnQgbHVtYSA9IDE2ODM5ICogciArIDMzMDU5ICogZyArIDY0MjAgKiBiOwotICByZXR1cm4gKGx1bWEgKyBrUm91bmQpID4+IFlVVl9GSVg7ICAvLyBubyBuZWVkIHRvIGNsaXAKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhSR0JUb1UoaW50IHIsIGludCBnLCBpbnQgYikgewotICBjb25zdCBpbnQgdSA9IC05NzE5ICogciAtIDE5MDgxICogZyArIDI4ODAwICogYjsKLSAgcmV0dXJuIFZQOENsaXBVVih1KTsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhSR0JUb1YoaW50IHIsIGludCBnLCBpbnQgYikgewotICBjb25zdCBpbnQgdiA9ICsyODgwMCAqIHIgLSAyNDExNiAqIGcgLSA0Njg0ICogYjsKLSAgcmV0dXJuIFZQOENsaXBVVih2KTsKLX0KLQotI2Vsc2UKLQotLy8gVGhpcyBKUEVHLVlVViBjb2xvcnNwYWNlLCBvbmx5IGZvciBjb21wYXJpc29uIQotLy8gVGhlc2UgYXJlIGFsc28gMTYtYml0IHByZWNpc2lvbiBjb2VmZmljaWVudHMgZnJvbSBSZWMuNjAxLCBidXQgd2l0aCBmdWxsCi0vLyBbMC4uMjU1XSBvdXRwdXQgcmFuZ2UuCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOFJHQlRvWShpbnQgciwgaW50IGcsIGludCBiKSB7Ci0gIGNvbnN0IGludCBrUm91bmQgPSAoMSA8PCAoWVVWX0ZJWCAtIDEpKTsKLSAgY29uc3QgaW50IGx1bWEgPSAxOTU5NSAqIHIgKyAzODQ3MCAqIGcgKyA3NDcxICogYjsKLSAgcmV0dXJuIChsdW1hICsga1JvdW5kKSA+PiBZVVZfRklYOyAgLy8gbm8gbmVlZCB0byBjbGlwCi19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4UkdCVG9VKGludCByLCBpbnQgZywgaW50IGIpIHsKLSAgY29uc3QgaW50IHUgPSAtMTEwNTggKiByIC0gMjE3MTAgKiBnICsgMzI3NjggKiBiOwotICByZXR1cm4gVlA4Q2xpcFVWKHUpOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOFJHQlRvVihpbnQgciwgaW50IGcsIGludCBiKSB7Ci0gIGNvbnN0IGludCB2ID0gMzI3NjggKiByIC0gMjc0MzkgKiBnIC0gNTMyOSAqIGI7Ci0gIHJldHVybiBWUDhDbGlwVVYodik7Ci19Ci0KLSNlbmRpZiAgICAvLyBVU0VfWVVWagotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKLQotI2VuZGlmICAvKiBXRUJQX0RTUF9ZVVZfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy9hbHBoYS5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL2FscGhhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNmM3ZTguLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL2FscGhhLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MTMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIEFscGhhLXBsYW5lIGNvbXByZXNzaW9uLgotLy8KLS8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCi0KLSNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgotI2Vsc2UKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiLi92cDhlbmNpLmgiCi0jaW5jbHVkZSAiLi4vdXRpbHMvZmlsdGVycy5oIgotI2luY2x1ZGUgIi4uL3V0aWxzL3F1YW50X2xldmVscy5oIgotI2luY2x1ZGUgIi4uL3dlYnAvZm9ybWF0X2NvbnN0YW50cy5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEVuY29kZXMgdGhlIGdpdmVuIGFscGhhIGRhdGEgdmlhIHNwZWNpZmllZCBjb21wcmVzc2lvbiBtZXRob2QgJ21ldGhvZCcuCi0vLyBUaGUgcHJlLXByb2Nlc3NpbmcgKHF1YW50aXphdGlvbikgaXMgcGVyZm9ybWVkIGlmICdxdWFsaXR5JyBpcyBsZXNzIHRoYW4gMTAwLgotLy8gRm9yIHN1Y2ggY2FzZXMsIHRoZSBlbmNvZGluZyBpcyBsb3NzeS4gVGhlIHZhbGlkIHJhbmdlIGlzIFswLCAxMDBdIGZvcgotLy8gJ3F1YWxpdHknIGFuZCBbMCwgMV0gZm9yICdtZXRob2QnOgotLy8gICAnbWV0aG9kID0gMCcgLSBObyBjb21wcmVzc2lvbjsKLS8vICAgJ21ldGhvZCA9IDEnIC0gVXNlIGxvc3NsZXNzIGNvZGVyIG9uIHRoZSBhbHBoYSBwbGFuZSBvbmx5Ci0vLyAnZmlsdGVyJyB2YWx1ZXMgWzAsIDRdIGNvcnJlc3BvbmQgdG8gcHJlZGljdGlvbiBtb2RlcyBub25lLCBob3Jpem9udGFsLAotLy8gdmVydGljYWwgJiBncmFkaWVudCBmaWx0ZXJzLiBUaGUgcHJlZGljdGlvbiBtb2RlIDQgd2lsbCB0cnkgYWxsIHRoZQotLy8gcHJlZGljdGlvbiBtb2RlcyAwIHRvIDMgYW5kIHBpY2sgdGhlIGJlc3Qgb25lLgotLy8gJ2VmZm9ydF9sZXZlbCc6IHNwZWNpZmllcyBob3cgbXVjaCBlZmZvcnQgbXVzdCBiZSBzcGVudCB0byB0cnkgYW5kIHJlZHVjZQotLy8gIHRoZSBjb21wcmVzc2VkIG91dHB1dCBzaXplLiBJbiByYW5nZSAwIChxdWljaykgdG8gNiAoc2xvdykuCi0vLwotLy8gJ291dHB1dCcgY29ycmVzcG9uZHMgdG8gdGhlIGJ1ZmZlciBjb250YWluaW5nIGNvbXByZXNzZWQgYWxwaGEgZGF0YS4KLS8vICAgICAgICAgIFRoaXMgYnVmZmVyIGlzIGFsbG9jYXRlZCBieSB0aGlzIG1ldGhvZCBhbmQgY2FsbGVyIHNob3VsZCBjYWxsCi0vLyAgICAgICAgICBTYk1lbW9yeURlYWxsb2NhdGUoKm91dHB1dCkgd2hlbiBkb25lLgotLy8gJ291dHB1dF9zaXplJyBjb3JyZXNwb25kcyB0byBzaXplIG9mIHRoaXMgY29tcHJlc3NlZCBhbHBoYSBidWZmZXIuCi0vLwotLy8gUmV0dXJucyAxIG9uIHN1Y2Nlc3NmdWxseSBlbmNvZGluZyB0aGUgYWxwaGEgYW5kCi0vLyAgICAgICAgIDAgaWYgZWl0aGVyOgotLy8gICAgICAgICAgIGludmFsaWQgcXVhbGl0eSBvciBtZXRob2QsIG9yCi0vLyAgICAgICAgICAgbWVtb3J5IGFsbG9jYXRpb24gZm9yIHRoZSBjb21wcmVzc2VkIGRhdGEgZmFpbHMuCi0KLSNpbmNsdWRlICIuLi9lbmMvdnA4bGkuaCIKLQotc3RhdGljIGludCBFbmNvZGVMb3NzbGVzcyhjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlZmZvcnRfbGV2ZWwsICAvLyBpbiBbMC4uNl0gcmFuZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4Qml0V3JpdGVyKiBjb25zdCBidywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUEF1eFN0YXRzKiBjb25zdCBzdGF0cykgewotICBpbnQgb2sgPSAwOwotICBXZWJQQ29uZmlnIGNvbmZpZzsKLSAgV2ViUFBpY3R1cmUgcGljdHVyZTsKLSAgVlA4TEJpdFdyaXRlciB0bXBfYnc7Ci0KLSAgV2ViUFBpY3R1cmVJbml0KCZwaWN0dXJlKTsKLSAgcGljdHVyZS53aWR0aCA9IHdpZHRoOwotICBwaWN0dXJlLmhlaWdodCA9IGhlaWdodDsKLSAgcGljdHVyZS51c2VfYXJnYiA9IDE7Ci0gIHBpY3R1cmUuc3RhdHMgPSBzdGF0czsKLSAgaWYgKCFXZWJQUGljdHVyZUFsbG9jKCZwaWN0dXJlKSkgcmV0dXJuIDA7Ci0KLSAgLy8gVHJhbnNmZXIgdGhlIGFscGhhIHZhbHVlcyB0byB0aGUgZ3JlZW4gY2hhbm5lbC4KLSAgewotICAgIGludCBpLCBqOwotICAgIHVpbnQzMl90KiBkc3QgPSBwaWN0dXJlLmFyZ2I7Ci0gICAgY29uc3QgdWludDhfdCogc3JjID0gZGF0YTsKLSAgICBmb3IgKGogPSAwOyBqIDwgcGljdHVyZS5oZWlnaHQ7ICsraikgewotICAgICAgZm9yIChpID0gMDsgaSA8IHBpY3R1cmUud2lkdGg7ICsraSkgewotICAgICAgICBkc3RbaV0gPSAoc3JjW2ldIDw8IDgpIHwgMHhmZjAwMDAwMHU7Ci0gICAgICB9Ci0gICAgICBzcmMgKz0gd2lkdGg7Ci0gICAgICBkc3QgKz0gcGljdHVyZS5hcmdiX3N0cmlkZTsKLSAgICB9Ci0gIH0KLQotICBXZWJQQ29uZmlnSW5pdCgmY29uZmlnKTsKLSAgY29uZmlnLmxvc3NsZXNzID0gMTsKLSAgY29uZmlnLm1ldGhvZCA9IGVmZm9ydF9sZXZlbDsgIC8vIGltcGFjdCBpcyB2ZXJ5IHNtYWxsCi0gIC8vIFNldCBhIG1vZGVyYXRlIGRlZmF1bHQgcXVhbGl0eSBzZXR0aW5nIGZvciBhbHBoYS4KLSAgY29uZmlnLnF1YWxpdHkgPSAxMC5mICogZWZmb3J0X2xldmVsOwotICBTQl9EQ0hFQ0soY29uZmlnLnF1YWxpdHkgPj0gMCAmJiBjb25maWcucXVhbGl0eSA8PSAxMDAuZik7Ci0KLSAgb2sgPSBWUDhMQml0V3JpdGVySW5pdCgmdG1wX2J3LCAod2lkdGggKiBoZWlnaHQpID4+IDMpOwotICBvayA9IG9rICYmIChWUDhMRW5jb2RlU3RyZWFtKCZjb25maWcsICZwaWN0dXJlLCAmdG1wX2J3KSA9PSBWUDhfRU5DX09LKTsKLSAgV2ViUFBpY3R1cmVGcmVlKCZwaWN0dXJlKTsKLSAgaWYgKG9rKSB7Ci0gICAgY29uc3QgdWludDhfdCogY29uc3QgYnVmZmVyID0gVlA4TEJpdFdyaXRlckZpbmlzaCgmdG1wX2J3KTsKLSAgICBjb25zdCBzaXplX3QgYnVmZmVyX3NpemUgPSBWUDhMQml0V3JpdGVyTnVtQnl0ZXMoJnRtcF9idyk7Ci0gICAgVlA4Qml0V3JpdGVyQXBwZW5kKGJ3LCBidWZmZXIsIGJ1ZmZlcl9zaXplKTsKLSAgfQotICBWUDhMQml0V3JpdGVyRGVzdHJveSgmdG1wX2J3KTsKLSAgcmV0dXJuIG9rICYmICFidy0+ZXJyb3JfOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgaW50IEVuY29kZUFscGhhSW50ZXJuYWwoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXRob2QsIGludCBmaWx0ZXIsIGludCByZWR1Y2VfbGV2ZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlZmZvcnRfbGV2ZWwsICAvLyBpbiBbMC4uNl0gcmFuZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCB0bXBfYWxwaGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4Qml0V3JpdGVyKiBjb25zdCBidywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQQXV4U3RhdHMqIGNvbnN0IHN0YXRzKSB7Ci0gIGludCBvayA9IDA7Ci0gIGNvbnN0IHVpbnQ4X3QqIGFscGhhX3NyYzsKLSAgV2ViUEZpbHRlckZ1bmMgZmlsdGVyX2Z1bmM7Ci0gIHVpbnQ4X3QgaGVhZGVyOwotICBzaXplX3QgZXhwZWN0ZWRfc2l6ZTsKLSAgY29uc3Qgc2l6ZV90IGRhdGFfc2l6ZSA9IHdpZHRoICogaGVpZ2h0OwotCi0gIFNCX0RDSEVDSygodWludDY0X3QpZGF0YV9zaXplID09ICh1aW50NjRfdCl3aWR0aCAqIGhlaWdodCk7ICAvLyBhcyBwZXIgc3BlYwotICBTQl9EQ0hFQ0soZmlsdGVyID49IDAgJiYgZmlsdGVyIDwgV0VCUF9GSUxURVJfTEFTVCk7Ci0gIFNCX0RDSEVDSyhtZXRob2QgPj0gQUxQSEFfTk9fQ09NUFJFU1NJT04pOwotICBTQl9EQ0hFQ0sobWV0aG9kIDw9IEFMUEhBX0xPU1NMRVNTX0NPTVBSRVNTSU9OKTsKLSAgU0JfRENIRUNLKHNpemVvZihoZWFkZXIpID09IEFMUEhBX0hFQURFUl9MRU4pOwotICAvLyBUT0RPKHNrYWwpOiBoYXZlIGEgY29tbW9uIGZ1bmN0aW9uIGFuZCAjZGVmaW5lJ3MgdG8gdmFsaWRhdGUgYWxwaGEgcGFyYW1zLgotCi0gIGV4cGVjdGVkX3NpemUgPQotICAgICAgKG1ldGhvZCA9PSBBTFBIQV9OT19DT01QUkVTU0lPTikgPyAoQUxQSEFfSEVBREVSX0xFTiArIGRhdGFfc2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGRhdGFfc2l6ZSA+PiA1KTsKLSAgaGVhZGVyID0gbWV0aG9kIHwgKGZpbHRlciA8PCAyKTsKLSAgaWYgKHJlZHVjZV9sZXZlbHMpIGhlYWRlciB8PSBBTFBIQV9QUkVQUk9DRVNTRURfTEVWRUxTIDw8IDQ7Ci0KLSAgVlA4Qml0V3JpdGVySW5pdChidywgZXhwZWN0ZWRfc2l6ZSk7Ci0gIFZQOEJpdFdyaXRlckFwcGVuZChidywgJmhlYWRlciwgQUxQSEFfSEVBREVSX0xFTik7Ci0KLSAgZmlsdGVyX2Z1bmMgPSBXZWJQRmlsdGVyc1tmaWx0ZXJdOwotICBpZiAoZmlsdGVyX2Z1bmMgIT0gTlVMTCkgewotICAgIGZpbHRlcl9mdW5jKGRhdGEsIHdpZHRoLCBoZWlnaHQsIHdpZHRoLCB0bXBfYWxwaGEpOwotICAgIGFscGhhX3NyYyA9IHRtcF9hbHBoYTsKLSAgfSAgZWxzZSB7Ci0gICAgYWxwaGFfc3JjID0gZGF0YTsKLSAgfQotCi0gIGlmIChtZXRob2QgPT0gQUxQSEFfTk9fQ09NUFJFU1NJT04pIHsKLSAgICBvayA9IFZQOEJpdFdyaXRlckFwcGVuZChidywgYWxwaGFfc3JjLCB3aWR0aCAqIGhlaWdodCk7Ci0gICAgb2sgPSBvayAmJiAhYnctPmVycm9yXzsKLSAgfSBlbHNlIHsKLSAgICBvayA9IEVuY29kZUxvc3NsZXNzKGFscGhhX3NyYywgd2lkdGgsIGhlaWdodCwgZWZmb3J0X2xldmVsLCBidywgc3RhdHMpOwotICAgIFZQOEJpdFdyaXRlckZpbmlzaChidyk7Ci0gIH0KLSAgcmV0dXJuIG9rOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBUT0RPKHNrYWwpOiBtb3ZlIHRvIGRzcC8gPwotc3RhdGljIHZvaWQgQ29weVBsYW5lKGNvbnN0IHVpbnQ4X3QqIHNyYywgaW50IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgZHN0X3N0cmlkZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gIHdoaWxlIChoZWlnaHQtLSA+IDApIHsKLSAgICBTYk1lbW9yeUNvcHkoZHN0LCBzcmMsIHdpZHRoKTsKLSAgICBzcmMgKz0gc3JjX3N0cmlkZTsKLSAgICBkc3QgKz0gZHN0X3N0cmlkZTsKLSAgfQotfQotCi1zdGF0aWMgaW50IEdldE51bUNvbG9ycyhjb25zdCB1aW50OF90KiBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlKSB7Ci0gIGludCBqOwotICBpbnQgY29sb3JzID0gMDsKLSAgdWludDhfdCBjb2xvclsyNTZdID0geyAwIH07Ci0KLSAgZm9yIChqID0gMDsgaiA8IGhlaWdodDsgKytqKSB7Ci0gICAgaW50IGk7Ci0gICAgY29uc3QgdWludDhfdCogY29uc3QgcCA9IGRhdGEgKyBqICogc3RyaWRlOwotICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgKytpKSB7Ci0gICAgICBjb2xvcltwW2ldXSA9IDE7Ci0gICAgfQotICB9Ci0gIGZvciAoaiA9IDA7IGogPCAyNTY7ICsraikgewotICAgIGlmIChjb2xvcltqXSA+IDApICsrY29sb3JzOwotICB9Ci0gIHJldHVybiBjb2xvcnM7Ci19Ci0KLXN0YXRpYyBpbnQgRW5jb2RlQWxwaGEoVlA4RW5jb2RlciogY29uc3QgZW5jLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgcXVhbGl0eSwgaW50IG1ldGhvZCwgaW50IGZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IGVmZm9ydF9sZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIGNvbnN0IG91dHB1dCwgc2l6ZV90KiBjb25zdCBvdXRwdXRfc2l6ZSkgewotICBjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljID0gZW5jLT5waWNfOwotICBjb25zdCBpbnQgd2lkdGggPSBwaWMtPndpZHRoOwotICBjb25zdCBpbnQgaGVpZ2h0ID0gcGljLT5oZWlnaHQ7Ci0KLSAgdWludDhfdCogcXVhbnRfYWxwaGEgPSBOVUxMOwotICBjb25zdCBzaXplX3QgZGF0YV9zaXplID0gd2lkdGggKiBoZWlnaHQ7Ci0gIHVpbnQ2NF90IHNzZSA9IDA7Ci0gIGludCBvayA9IDE7Ci0gIGNvbnN0IGludCByZWR1Y2VfbGV2ZWxzID0gKHF1YWxpdHkgPCAxMDApOwotCi0gIC8vIHF1aWNrIHNhbml0eSBjaGVja3MKLSAgU0JfRENIRUNLKCh1aW50NjRfdClkYXRhX3NpemUgPT0gKHVpbnQ2NF90KXdpZHRoICogaGVpZ2h0KTsgIC8vIGFzIHBlciBzcGVjCi0gIFNCX0RDSEVDSyhlbmMgIT0gTlVMTCAmJiBwaWMgIT0gTlVMTCAmJiBwaWMtPmEgIT0gTlVMTCk7Ci0gIFNCX0RDSEVDSyhvdXRwdXQgIT0gTlVMTCAmJiBvdXRwdXRfc2l6ZSAhPSBOVUxMKTsKLSAgU0JfRENIRUNLKHdpZHRoID4gMCAmJiBoZWlnaHQgPiAwKTsKLSAgU0JfRENIRUNLKHBpYy0+YV9zdHJpZGUgPj0gd2lkdGgpOwotICBTQl9EQ0hFQ0soZmlsdGVyID49IFdFQlBfRklMVEVSX05PTkUgJiYgZmlsdGVyIDw9IFdFQlBfRklMVEVSX0ZBU1QpOwotCi0gIGlmIChxdWFsaXR5IDwgMCB8fCBxdWFsaXR5ID4gMTAwKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBpZiAobWV0aG9kIDwgQUxQSEFfTk9fQ09NUFJFU1NJT04gfHwgbWV0aG9kID4gQUxQSEFfTE9TU0xFU1NfQ09NUFJFU1NJT04pIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHF1YW50X2FscGhhID0gKHVpbnQ4X3QqKVNiTWVtb3J5QWxsb2NhdGUoZGF0YV9zaXplKTsKLSAgaWYgKHF1YW50X2FscGhhID09IE5VTEwpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8vIEV4dHJhY3QgYWxwaGEgZGF0YSAod2lkdGggeCBoZWlnaHQpIGZyb20gcmF3X2RhdGEgKHN0cmlkZSB4IGhlaWdodCkuCi0gIENvcHlQbGFuZShwaWMtPmEsIHBpYy0+YV9zdHJpZGUsIHF1YW50X2FscGhhLCB3aWR0aCwgd2lkdGgsIGhlaWdodCk7Ci0KLSAgaWYgKHJlZHVjZV9sZXZlbHMpIHsgIC8vIE5vIFF1YW50aXphdGlvbiByZXF1aXJlZCBmb3IgJ3F1YWxpdHkgPSAxMDAnLgotICAgIC8vIDE2IGFscGhhIGxldmVscyBnaXZlcyBxdWl0ZSBhIGxvdyBNU0Ugdy5yLnQgb3JpZ2luYWwgYWxwaGEgcGxhbmUgaGVuY2UKLSAgICAvLyBtYXBwZWQgdG8gbW9kZXJhdGUgcXVhbGl0eSA3MC4gSGVuY2UgUXVhbGl0eTpbMCwgNzBdIC0+IExldmVsczpbMiwgMTZdCi0gICAgLy8gYW5kIFF1YWxpdHk6XTcwLCAxMDBdIC0+IExldmVsczpdMTYsIDI1Nl0uCi0gICAgY29uc3QgaW50IGFscGhhX2xldmVscyA9IChxdWFsaXR5IDw9IDcwKSA/ICgyICsgcXVhbGl0eSAvIDUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICgxNiArIChxdWFsaXR5IC0gNzApICogOCk7Ci0gICAgb2sgPSBRdWFudGl6ZUxldmVscyhxdWFudF9hbHBoYSwgd2lkdGgsIGhlaWdodCwgYWxwaGFfbGV2ZWxzLCAmc3NlKTsKLSAgfQotCi0gIGlmIChvaykgewotICAgIFZQOEJpdFdyaXRlciBidzsKLSAgICBpbnQgdGVzdF9maWx0ZXI7Ci0gICAgdWludDhfdCogZmlsdGVyZWRfYWxwaGEgPSBOVUxMOwotICAgIGludCB0cnlfZmlsdGVyX25vbmUgPSAoZWZmb3J0X2xldmVsID4gMyk7Ci0KLSAgICBpZiAoZmlsdGVyID09IFdFQlBfRklMVEVSX0ZBU1QpIHsgIC8vIFF1aWNrIGVzdGltYXRlIG9mIHRoZSBiZXN0IGNhbmRpZGF0ZS4KLSAgICAgIGNvbnN0IGludCBrTWluQ29sb3JzRm9yRmlsdGVyTm9uZSA9IDE2OwotICAgICAgY29uc3QgaW50IGtNYXhDb2xvcnNGb3JGaWx0ZXJOb25lID0gMTkyOwotICAgICAgY29uc3QgaW50IG51bV9jb2xvcnMgPSBHZXROdW1Db2xvcnMocXVhbnRfYWxwaGEsIHdpZHRoLCBoZWlnaHQsIHdpZHRoKTsKLSAgICAgIC8vIEZvciBsb3cgbnVtYmVyIG9mIGNvbG9ycywgTk9ORSB5ZWlsZHMgYmV0dGVyIGNvbXByZXNzaW9uLgotICAgICAgZmlsdGVyID0gKG51bV9jb2xvcnMgPD0ga01pbkNvbG9yc0ZvckZpbHRlck5vbmUpID8gV0VCUF9GSUxURVJfTk9ORSA6Ci0gICAgICAgICAgICAgICBFc3RpbWF0ZUJlc3RGaWx0ZXIocXVhbnRfYWxwaGEsIHdpZHRoLCBoZWlnaHQsIHdpZHRoKTsKLSAgICAgIC8vIEZvciBsYXJnZSBudW1iZXIgb2YgY29sb3JzLCB0cnkgRklMVEVSX05PTkUgaW4gYWRkaXRpb24gdG8gdGhlIGJlc3QKLSAgICAgIC8vIGZpbHRlciBhcyB3ZWxsLgotICAgICAgaWYgKG51bV9jb2xvcnMgPiBrTWF4Q29sb3JzRm9yRmlsdGVyTm9uZSkgewotICAgICAgICB0cnlfZmlsdGVyX25vbmUgPSAxOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIFRlc3QgZm9yIFdFQlBfRklMVEVSX05PTkUgZm9yIGhpZ2hlciBlZmZvcnQgbGV2ZWxzLgotICAgIGlmICh0cnlfZmlsdGVyX25vbmUgfHwgZmlsdGVyID09IFdFQlBfRklMVEVSX05PTkUpIHsKLSAgICAgIG9rID0gRW5jb2RlQWxwaGFJbnRlcm5hbChxdWFudF9hbHBoYSwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QsIFdFQlBfRklMVEVSX05PTkUsIHJlZHVjZV9sZXZlbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmb3J0X2xldmVsLCBOVUxMLCAmYncsIHBpYy0+c3RhdHMpOwotCi0gICAgICBpZiAoIW9rKSB7Ci0gICAgICAgIFZQOEJpdFdyaXRlcldpcGVPdXQoJmJ3KTsKLSAgICAgICAgZ290byBFbmQ7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIFN0b3A/Ci0gICAgaWYgKGZpbHRlciA9PSBXRUJQX0ZJTFRFUl9OT05FKSB7Ci0gICAgICBnb3RvIE9rOwotICAgIH0KLQotICAgIGZpbHRlcmVkX2FscGhhID0gKHVpbnQ4X3QqKVNiTWVtb3J5QWxsb2NhdGUoZGF0YV9zaXplKTsKLSAgICBvayA9IChmaWx0ZXJlZF9hbHBoYSAhPSBOVUxMKTsKLSAgICBpZiAoIW9rKSB7Ci0gICAgICBnb3RvIEVuZDsKLSAgICB9Ci0KLSAgICAvLyBUcnkgdGhlIG90aGVyIG1vZGUocykuCi0gICAgewotICAgICAgV2ViUEF1eFN0YXRzIGJlc3Rfc3RhdHM7Ci0gICAgICBzaXplX3QgYmVzdF9zY29yZSA9IHRyeV9maWx0ZXJfbm9uZSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEJpdFdyaXRlclNpemUoJmJ3KSA6IChzaXplX3QpfjBVOwotICAgICAgaW50IHdpcGVfdG1wX2J3ID0gdHJ5X2ZpbHRlcl9ub25lOwotCi0gICAgICBTYk1lbW9yeVNldCgmYmVzdF9zdGF0cywgMCwgc2l6ZW9mKGJlc3Rfc3RhdHMpKTsgIC8vIHByZXZlbnQgc3B1cmlvdXMgd2FybmluZwotICAgICAgaWYgKHBpYy0+c3RhdHMgIT0gTlVMTCkgYmVzdF9zdGF0cyA9ICpwaWMtPnN0YXRzOwotICAgICAgZm9yICh0ZXN0X2ZpbHRlciA9Ci0gICAgICAgICAgIHRyeV9maWx0ZXJfbm9uZSA/IFdFQlBfRklMVEVSX0hPUklaT05UQUwgOiBXRUJQX0ZJTFRFUl9OT05FOwotICAgICAgICAgICBvayAmJiAodGVzdF9maWx0ZXIgPD0gV0VCUF9GSUxURVJfR1JBRElFTlQpOwotICAgICAgICAgICArK3Rlc3RfZmlsdGVyKSB7Ci0gICAgICAgIFZQOEJpdFdyaXRlciB0bXBfYnc7Ci0gICAgICAgIGlmIChmaWx0ZXIgIT0gV0VCUF9GSUxURVJfQkVTVCAmJiB0ZXN0X2ZpbHRlciAhPSBmaWx0ZXIpIHsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBvayA9IEVuY29kZUFscGhhSW50ZXJuYWwocXVhbnRfYWxwaGEsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QsIHRlc3RfZmlsdGVyLCByZWR1Y2VfbGV2ZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmb3J0X2xldmVsLCBmaWx0ZXJlZF9hbHBoYSwgJnRtcF9idywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpYy0+c3RhdHMpOwotICAgICAgICBpZiAob2spIHsKLSAgICAgICAgICBjb25zdCBzaXplX3Qgc2NvcmUgPSBWUDhCaXRXcml0ZXJTaXplKCZ0bXBfYncpOwotICAgICAgICAgIGlmIChzY29yZSA8IGJlc3Rfc2NvcmUpIHsKLSAgICAgICAgICAgIC8vIHN3YXAgYml0d3JpdGVyIG9iamVjdHMuCi0gICAgICAgICAgICBWUDhCaXRXcml0ZXIgdG1wID0gdG1wX2J3OwotICAgICAgICAgICAgdG1wX2J3ID0gYnc7Ci0gICAgICAgICAgICBidyA9IHRtcDsKLSAgICAgICAgICAgIGJlc3Rfc2NvcmUgPSBzY29yZTsKLSAgICAgICAgICAgIGlmIChwaWMtPnN0YXRzICE9IE5VTEwpIGJlc3Rfc3RhdHMgPSAqcGljLT5zdGF0czsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgVlA4Qml0V3JpdGVyV2lwZU91dCgmYncpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3aXBlX3RtcF9idykgewotICAgICAgICAgIFZQOEJpdFdyaXRlcldpcGVPdXQoJnRtcF9idyk7Ci0gICAgICAgIH0KLSAgICAgICAgd2lwZV90bXBfYncgPSAxOyAgLy8gRm9yIG5leHQgZmlsdGVyIHRyaWFsIGZvciBXRUJQX0ZJTFRFUl9CRVNULgotICAgICAgfQotICAgICAgaWYgKHBpYy0+c3RhdHMgIT0gTlVMTCkgKnBpYy0+c3RhdHMgPSBiZXN0X3N0YXRzOwotICAgIH0KLSBPazoKLSAgICBpZiAob2spIHsKLSAgICAgICpvdXRwdXRfc2l6ZSA9IFZQOEJpdFdyaXRlclNpemUoJmJ3KTsKLSAgICAgICpvdXRwdXQgPSBWUDhCaXRXcml0ZXJCdWYoJmJ3KTsKLSAgICAgIGlmIChwaWMtPnN0YXRzICE9IE5VTEwpIHsgICAgICAgICAvLyBuZWVkIHN0YXRzPwotICAgICAgICBwaWMtPnN0YXRzLT5jb2RlZF9zaXplICs9IChpbnQpKCpvdXRwdXRfc2l6ZSk7Ci0gICAgICAgIGVuYy0+c3NlX1szXSA9IHNzZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgU2JNZW1vcnlEZWFsbG9jYXRlKGZpbHRlcmVkX2FscGhhKTsKLSAgfQotIEVuZDoKLSAgU2JNZW1vcnlEZWFsbG9jYXRlKHF1YW50X2FscGhhKTsKLSAgcmV0dXJuIG9rOwotfQotCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBNYWluIGNhbGxzCi0KLXN0YXRpYyBpbnQgQ29tcHJlc3NBbHBoYUpvYihWUDhFbmNvZGVyKiBjb25zdCBlbmMsIHZvaWQqIGR1bW15KSB7Ci0gIGNvbnN0IFdlYlBDb25maWcqIGNvbmZpZyA9IGVuYy0+Y29uZmlnXzsKLSAgdWludDhfdCogYWxwaGFfZGF0YSA9IE5VTEw7Ci0gIHNpemVfdCBhbHBoYV9zaXplID0gMDsKLSAgY29uc3QgaW50IGVmZm9ydF9sZXZlbCA9IGNvbmZpZy0+bWV0aG9kOyAgLy8gbWFwcyB0byBbMC4uNl0KLSAgY29uc3QgV0VCUF9GSUxURVJfVFlQRSBmaWx0ZXIgPQotICAgICAgKGNvbmZpZy0+YWxwaGFfZmlsdGVyaW5nID09IDApID8gV0VCUF9GSUxURVJfTk9ORSA6Ci0gICAgICAoY29uZmlnLT5hbHBoYV9maWx0ZXJpbmcgPT0gMSkgPyBXRUJQX0ZJTFRFUl9GQVNUIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdFQlBfRklMVEVSX0JFU1Q7Ci0gIGlmICghRW5jb2RlQWxwaGEoZW5jLCBjb25maWctPmFscGhhX3F1YWxpdHksIGNvbmZpZy0+YWxwaGFfY29tcHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgZmlsdGVyLCBlZmZvcnRfbGV2ZWwsICZhbHBoYV9kYXRhLCAmYWxwaGFfc2l6ZSkpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICBpZiAoYWxwaGFfc2l6ZSAhPSAodWludDMyX3QpYWxwaGFfc2l6ZSkgeyAgLy8gU2FuaXR5IGNoZWNrLgotICAgIFNiTWVtb3J5RGVhbGxvY2F0ZShhbHBoYV9kYXRhKTsKLSAgICByZXR1cm4gMDsKLSAgfQotICBlbmMtPmFscGhhX2RhdGFfc2l6ZV8gPSAodWludDMyX3QpYWxwaGFfc2l6ZTsKLSAgZW5jLT5hbHBoYV9kYXRhXyA9IGFscGhhX2RhdGE7Ci0gICh2b2lkKWR1bW15OwotICByZXR1cm4gMTsKLX0KLQotdm9pZCBWUDhFbmNJbml0QWxwaGEoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7Ci0gIGVuYy0+aGFzX2FscGhhXyA9IFdlYlBQaWN0dXJlSGFzVHJhbnNwYXJlbmN5KGVuYy0+cGljXyk7Ci0gIGVuYy0+YWxwaGFfZGF0YV8gPSBOVUxMOwotICBlbmMtPmFscGhhX2RhdGFfc2l6ZV8gPSAwOwotICBpZiAoZW5jLT50aHJlYWRfbGV2ZWxfID4gMCkgewotICAgIFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlciA9ICZlbmMtPmFscGhhX3dvcmtlcl87Ci0gICAgV2ViUFdvcmtlckluaXQod29ya2VyKTsKLSAgICB3b3JrZXItPmRhdGExID0gZW5jOwotICAgIHdvcmtlci0+ZGF0YTIgPSBOVUxMOwotICAgIHdvcmtlci0+aG9vayA9IChXZWJQV29ya2VySG9vaylDb21wcmVzc0FscGhhSm9iOwotICB9Ci19Ci0KLWludCBWUDhFbmNTdGFydEFscGhhKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgewotICBpZiAoZW5jLT5oYXNfYWxwaGFfKSB7Ci0gICAgaWYgKGVuYy0+dGhyZWFkX2xldmVsXyA+IDApIHsKLSAgICAgIFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlciA9ICZlbmMtPmFscGhhX3dvcmtlcl87Ci0gICAgICBpZiAoIVdlYlBXb3JrZXJSZXNldCh3b3JrZXIpKSB7ICAgIC8vIE1ha2VzIHN1cmUgd29ya2VyIGlzIGdvb2QgdG8gZ28uCi0gICAgICAgIHJldHVybiAwOwotICAgICAgfQotICAgICAgV2ViUFdvcmtlckxhdW5jaCh3b3JrZXIpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBDb21wcmVzc0FscGhhSm9iKGVuYywgTlVMTCk7ICAgLy8ganVzdCBkbyB0aGUgam9iIHJpZ2h0IGF3YXkKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLWludCBWUDhFbmNGaW5pc2hBbHBoYShWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKLSAgaWYgKGVuYy0+aGFzX2FscGhhXykgewotICAgIGlmIChlbmMtPnRocmVhZF9sZXZlbF8gPiAwKSB7Ci0gICAgICBXZWJQV29ya2VyKiBjb25zdCB3b3JrZXIgPSAmZW5jLT5hbHBoYV93b3JrZXJfOwotICAgICAgaWYgKCFXZWJQV29ya2VyU3luYyh3b3JrZXIpKSByZXR1cm4gMDsgIC8vIGVycm9yCi0gICAgfQotICB9Ci0gIHJldHVybiBXZWJQUmVwb3J0UHJvZ3Jlc3MoZW5jLT5waWNfLCBlbmMtPnBlcmNlbnRfICsgMjAsICZlbmMtPnBlcmNlbnRfKTsKLX0KLQotaW50IFZQOEVuY0RlbGV0ZUFscGhhKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgewotICBpbnQgb2sgPSAxOwotICBpZiAoZW5jLT50aHJlYWRfbGV2ZWxfID4gMCkgewotICAgIFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlciA9ICZlbmMtPmFscGhhX3dvcmtlcl87Ci0gICAgb2sgPSBXZWJQV29ya2VyU3luYyh3b3JrZXIpOyAgLy8gZmluaXNoIGFueXRoaW5nIGxlZnQgaW4gZmxpZ2h0Ci0gICAgV2ViUFdvcmtlckVuZCh3b3JrZXIpOyAgLy8gc3RpbGwgbmVlZCB0byBlbmQgdGhlIHdvcmtlciwgZXZlbiBpZiAhb2sKLSAgfQotICBTYk1lbW9yeURlYWxsb2NhdGUoZW5jLT5hbHBoYV9kYXRhXyk7Ci0gIGVuYy0+YWxwaGFfZGF0YV8gPSBOVUxMOwotICBlbmMtPmFscGhhX2RhdGFfc2l6ZV8gPSAwOwotICBlbmMtPmhhc19hbHBoYV8gPSAwOwotICByZXR1cm4gb2s7Ci19Ci0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL2FuYWx5c2lzLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvYW5hbHlzaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQzNTgwNy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvYW5hbHlzaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDQyNiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gTWFjcm9ibG9jayBhbmFseXNpcwotLy8KLS8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCi0KLSNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgotI2Vsc2UKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiLi92cDhlbmNpLmgiCi0jaW5jbHVkZSAiLi9jb3N0LmgiCi0jaW5jbHVkZSAiLi4vdXRpbHMvdXRpbHMuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNkZWZpbmUgTUFYX0lURVJTX0tfTUVBTlMgIDYKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFNtb290aCB0aGUgc2VnbWVudCBtYXAgYnkgcmVwbGFjaW5nIGlzb2xhdGVkIGJsb2NrIGJ5IHRoZSBtYWpvcml0eSBvZiBpdHMKLS8vIG5laWdoYm91cnMuCi0KLXN0YXRpYyB2b2lkIFNtb290aFNlZ21lbnRNYXAoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7Ci0gIGludCBuLCB4LCB5OwotICBjb25zdCBpbnQgdyA9IGVuYy0+bWJfd187Ci0gIGNvbnN0IGludCBoID0gZW5jLT5tYl9oXzsKLSAgY29uc3QgaW50IG1ham9yaXR5X2NudF8zX3hfM19ncmlkID0gNTsKLSAgdWludDhfdCogY29uc3QgdG1wID0gKHVpbnQ4X3QqKVdlYlBTYWZlTWFsbG9jKCh1aW50NjRfdCl3ICogaCwgc2l6ZW9mKCp0bXApKTsKLSAgU0JfRENIRUNLKCh1aW50NjRfdCkodyAqIGgpID09ICh1aW50NjRfdCl3ICogaCk7ICAgLy8gbm8gb3ZlcmZsb3csIGFzIHBlciBzcGVjCi0KLSAgaWYgKHRtcCA9PSBOVUxMKSByZXR1cm47Ci0gIGZvciAoeSA9IDE7IHkgPCBoIC0gMTsgKyt5KSB7Ci0gICAgZm9yICh4ID0gMTsgeCA8IHcgLSAxOyArK3gpIHsKLSAgICAgIGludCBjbnRbTlVNX01CX1NFR01FTlRTXSA9IHsgMCB9OwotICAgICAgY29uc3QgVlA4TUJJbmZvKiBjb25zdCBtYiA9ICZlbmMtPm1iX2luZm9fW3ggKyB3ICogeV07Ci0gICAgICBpbnQgbWFqb3JpdHlfc2VnID0gbWItPnNlZ21lbnRfOwotICAgICAgLy8gQ2hlY2sgdGhlIDggbmVpZ2hib3VyaW5nIHNlZ21lbnQgdmFsdWVzLgotICAgICAgY250W21iWy13IC0gMV0uc2VnbWVudF9dKys7ICAvLyB0b3AtbGVmdAotICAgICAgY250W21iWy13ICsgMF0uc2VnbWVudF9dKys7ICAvLyB0b3AKLSAgICAgIGNudFttYlstdyArIDFdLnNlZ21lbnRfXSsrOyAgLy8gdG9wLXJpZ2h0Ci0gICAgICBjbnRbbWJbICAgLSAxXS5zZWdtZW50X10rKzsgIC8vIGxlZnQKLSAgICAgIGNudFttYlsgICArIDFdLnNlZ21lbnRfXSsrOyAgLy8gcmlnaHQKLSAgICAgIGNudFttYlsgdyAtIDFdLnNlZ21lbnRfXSsrOyAgLy8gYm90dG9tLWxlZnQKLSAgICAgIGNudFttYlsgdyArIDBdLnNlZ21lbnRfXSsrOyAgLy8gYm90dG9tCi0gICAgICBjbnRbbWJbIHcgKyAxXS5zZWdtZW50X10rKzsgIC8vIGJvdHRvbS1yaWdodAotICAgICAgZm9yIChuID0gMDsgbiA8IE5VTV9NQl9TRUdNRU5UUzsgKytuKSB7Ci0gICAgICAgIGlmIChjbnRbbl0gPj0gbWFqb3JpdHlfY250XzNfeF8zX2dyaWQpIHsKLSAgICAgICAgICBtYWpvcml0eV9zZWcgPSBuOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICB0bXBbeCArIHkgKiB3XSA9IG1ham9yaXR5X3NlZzsKLSAgICB9Ci0gIH0KLSAgZm9yICh5ID0gMTsgeSA8IGggLSAxOyArK3kpIHsKLSAgICBmb3IgKHggPSAxOyB4IDwgdyAtIDE7ICsreCkgewotICAgICAgVlA4TUJJbmZvKiBjb25zdCBtYiA9ICZlbmMtPm1iX2luZm9fW3ggKyB3ICogeV07Ci0gICAgICBtYi0+c2VnbWVudF8gPSB0bXBbeCArIHkgKiB3XTsKLSAgICB9Ci0gIH0KLSAgU2JNZW1vcnlEZWFsbG9jYXRlKHRtcCk7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBzZXQgc2VnbWVudCBzdXNjZXB0aWJpbGl0eSBhbHBoYV8gLyBiZXRhXwotCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IGNsaXAoaW50IHYsIGludCBtLCBpbnQgTSkgewotICByZXR1cm4gKHYgPCBtKSA/IG0gOiAodiA+IE0pID8gTSA6IHY7Ci19Ci0KLXN0YXRpYyB2b2lkIFNldFNlZ21lbnRBbHBoYXMoVlA4RW5jb2RlciogY29uc3QgZW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgY2VudGVyc1tOVU1fTUJfU0VHTUVOVFNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWlkKSB7Ci0gIGNvbnN0IGludCBuYiA9IGVuYy0+c2VnbWVudF9oZHJfLm51bV9zZWdtZW50c187Ci0gIGludCBtaW4gPSBjZW50ZXJzWzBdLCBtYXggPSBjZW50ZXJzWzBdOwotICBpbnQgbjsKLQotICBpZiAobmIgPiAxKSB7Ci0gICAgZm9yIChuID0gMDsgbiA8IG5iOyArK24pIHsKLSAgICAgIGlmIChtaW4gPiBjZW50ZXJzW25dKSBtaW4gPSBjZW50ZXJzW25dOwotICAgICAgaWYgKG1heCA8IGNlbnRlcnNbbl0pIG1heCA9IGNlbnRlcnNbbl07Ci0gICAgfQotICB9Ci0gIGlmIChtYXggPT0gbWluKSBtYXggPSBtaW4gKyAxOwotICBTQl9EQ0hFQ0sobWlkIDw9IG1heCAmJiBtaWQgPj0gbWluKTsKLSAgZm9yIChuID0gMDsgbiA8IG5iOyArK24pIHsKLSAgICBjb25zdCBpbnQgYWxwaGEgPSAyNTUgKiAoY2VudGVyc1tuXSAtIG1pZCkgLyAobWF4IC0gbWluKTsKLSAgICBjb25zdCBpbnQgYmV0YSA9IDI1NSAqIChjZW50ZXJzW25dIC0gbWluKSAvIChtYXggLSBtaW4pOwotICAgIGVuYy0+ZHFtX1tuXS5hbHBoYV8gPSBjbGlwKGFscGhhLCAtMTI3LCAxMjcpOwotICAgIGVuYy0+ZHFtX1tuXS5iZXRhXyA9IGNsaXAoYmV0YSwgMCwgMjU1KTsKLSAgfQotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29tcHV0ZSBzdXNjZXB0aWJpbGl0eSBiYXNlZCBvbiBEQ1QtY29lZmYgaGlzdG9ncmFtczoKLS8vIHRoZSBoaWdoZXIsIHRoZSAiZWFzaWVyIiB0aGUgbWFjcm9ibG9jayBpcyB0byBjb21wcmVzcy4KLQotI2RlZmluZSBNQVhfQUxQSEEgMjU1ICAgICAgICAgICAgICAgIC8vIDhiIG9mIHByZWNpc2lvbiBmb3Igc3VzY2VwdGliaWxpdGllcy4KLSNkZWZpbmUgQUxQSEFfU0NBTEUgKDIgKiBNQVhfQUxQSEEpICAvLyBzY2FsaW5nIGZhY3RvciBmb3IgYWxwaGEuCi0jZGVmaW5lIERFRkFVTFRfQUxQSEEgKC0xKQotI2RlZmluZSBJU19CRVRURVJfQUxQSEEoYWxwaGEsIGJlc3RfYWxwaGEpICgoYWxwaGEpID4gKGJlc3RfYWxwaGEpKQotCi1zdGF0aWMgaW50IEZpbmFsQWxwaGFWYWx1ZShpbnQgYWxwaGEpIHsKLSAgYWxwaGEgPSBNQVhfQUxQSEEgLSBhbHBoYTsKLSAgcmV0dXJuIGNsaXAoYWxwaGEsIDAsIE1BWF9BTFBIQSk7Ci19Ci0KLXN0YXRpYyBpbnQgR2V0QWxwaGEoY29uc3QgVlA4SGlzdG9ncmFtKiBjb25zdCBoaXN0bykgewotICBpbnQgbWF4X3ZhbHVlID0gMCwgbGFzdF9ub25femVybyA9IDE7Ci0gIGludCBrOwotICBpbnQgYWxwaGE7Ci0gIGZvciAoayA9IDA7IGsgPD0gTUFYX0NPRUZGX1RIUkVTSDsgKytrKSB7Ci0gICAgY29uc3QgaW50IHZhbHVlID0gaGlzdG8tPmRpc3RyaWJ1dGlvbltrXTsKLSAgICBpZiAodmFsdWUgPiAwKSB7Ci0gICAgICBpZiAodmFsdWUgPiBtYXhfdmFsdWUpIG1heF92YWx1ZSA9IHZhbHVlOwotICAgICAgbGFzdF9ub25femVybyA9IGs7Ci0gICAgfQotICB9Ci0gIC8vICdhbHBoYScgd2lsbCBsYXRlciBiZSBjbGlwcGVkIHRvIFswLi5NQVhfQUxQSEFdIHJhbmdlLCBjbGFtcGluZyBvdXRlcgotICAvLyB2YWx1ZXMgd2hpY2ggaGFwcGVuIHRvIGJlIG1vc3RseSBub2lzZS4gVGhpcyBsZWF2ZXMgdGhlIG1heGltdW0gcHJlY2lzaW9uCi0gIC8vIGZvciBoYW5kbGluZyB0aGUgdXNlZnVsIHNtYWxsIHZhbHVlcyB3aGljaCBjb250cmlidXRlIG1vc3QuCi0gIGFscGhhID0gKG1heF92YWx1ZSA+IDEpID8gQUxQSEFfU0NBTEUgKiBsYXN0X25vbl96ZXJvIC8gbWF4X3ZhbHVlIDogMDsKLSAgcmV0dXJuIGFscGhhOwotfQotCi1zdGF0aWMgdm9pZCBNZXJnZUhpc3RvZ3JhbXMoY29uc3QgVlA4SGlzdG9ncmFtKiBjb25zdCBpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhIaXN0b2dyYW0qIGNvbnN0IG91dCkgewotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8PSBNQVhfQ09FRkZfVEhSRVNIOyArK2kpIHsKLSAgICBvdXQtPmRpc3RyaWJ1dGlvbltpXSArPSBpbi0+ZGlzdHJpYnV0aW9uW2ldOwotICB9Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBTaW1wbGlmaWVkIGstTWVhbnMsIHRvIGFzc2lnbiBOYiBzZWdtZW50cyBiYXNlZCBvbiBhbHBoYS1oaXN0b2dyYW0KLQotc3RhdGljIHZvaWQgQXNzaWduU2VnbWVudHMoVlA4RW5jb2RlciogY29uc3QgZW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGFscGhhc1tNQVhfQUxQSEEgKyAxXSkgewotICBjb25zdCBpbnQgbmIgPSBlbmMtPnNlZ21lbnRfaGRyXy5udW1fc2VnbWVudHNfOwotICBpbnQgY2VudGVyc1tOVU1fTUJfU0VHTUVOVFNdOwotICBpbnQgd2VpZ2h0ZWRfYXZlcmFnZSA9IDA7Ci0gIGludCBtYXBbTUFYX0FMUEhBICsgMV07Ci0gIGludCBhLCBuLCBrOwotICBpbnQgbWluX2EgPSAwLCBtYXhfYSA9IE1BWF9BTFBIQSwgcmFuZ2VfYTsKLSAgLy8gJ2ludCcgdHlwZSBpcyBvayBmb3IgaGlzdG8sIGFuZCB3b24ndCBvdmVyZmxvdwotICBpbnQgYWNjdW1bTlVNX01CX1NFR01FTlRTXSwgZGlzdF9hY2N1bVtOVU1fTUJfU0VHTUVOVFNdOwotCi0gIC8vIGJyYWNrZXQgdGhlIGlucHV0Ci0gIGZvciAobiA9IDA7IG4gPD0gTUFYX0FMUEhBICYmIGFscGhhc1tuXSA9PSAwOyArK24pIHt9Ci0gIG1pbl9hID0gbjsKLSAgZm9yIChuID0gTUFYX0FMUEhBOyBuID4gbWluX2EgJiYgYWxwaGFzW25dID09IDA7IC0tbikge30KLSAgbWF4X2EgPSBuOwotICByYW5nZV9hID0gbWF4X2EgLSBtaW5fYTsKLQotICAvLyBTcHJlYWQgaW5pdGlhbCBjZW50ZXJzIGV2ZW5seQotICBmb3IgKG4gPSAxLCBrID0gMDsgbiA8IDIgKiBuYjsgbiArPSAyKSB7Ci0gICAgY2VudGVyc1trKytdID0gbWluX2EgKyAobiAqIHJhbmdlX2EpIC8gKDIgKiBuYik7Ci0gIH0KLQotICBmb3IgKGsgPSAwOyBrIDwgTUFYX0lURVJTX0tfTUVBTlM7ICsraykgeyAgICAgLy8gZmV3IGl0ZXJzIGFyZSBlbm91Z2gKLSAgICBpbnQgdG90YWxfd2VpZ2h0OwotICAgIGludCBkaXNwbGFjZWQ7Ci0gICAgLy8gUmVzZXQgc3RhdHMKLSAgICBmb3IgKG4gPSAwOyBuIDwgbmI7ICsrbikgewotICAgICAgYWNjdW1bbl0gPSAwOwotICAgICAgZGlzdF9hY2N1bVtuXSA9IDA7Ci0gICAgfQotICAgIC8vIEFzc2lnbiBuZWFyZXN0IGNlbnRlciBmb3IgZWFjaCAnYScKLSAgICBuID0gMDsgICAgLy8gdHJhY2sgdGhlIG5lYXJlc3QgY2VudGVyIGZvciBjdXJyZW50ICdhJwotICAgIGZvciAoYSA9IG1pbl9hOyBhIDw9IG1heF9hOyArK2EpIHsKLSAgICAgIGlmIChhbHBoYXNbYV0pIHsKLSAgICAgICAgd2hpbGUgKG4gPCBuYiAtIDEgJiYgYWJzKGEgLSBjZW50ZXJzW24gKyAxXSkgPCBhYnMoYSAtIGNlbnRlcnNbbl0pKSB7Ci0gICAgICAgICAgbisrOwotICAgICAgICB9Ci0gICAgICAgIG1hcFthXSA9IG47Ci0gICAgICAgIC8vIGFjY3VtdWxhdGUgY29udHJpYnV0aW9uIGludG8gYmVzdCBjZW50cm9pZAotICAgICAgICBkaXN0X2FjY3VtW25dICs9IGEgKiBhbHBoYXNbYV07Ci0gICAgICAgIGFjY3VtW25dICs9IGFscGhhc1thXTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gQWxsIHBvaW50IGFyZSBjbGFzc2lmaWVkLiBNb3ZlIHRoZSBjZW50cm9pZHMgdG8gdGhlCi0gICAgLy8gY2VudGVyIG9mIHRoZWlyIHJlc3BlY3RpdmUgY2xvdWQuCi0gICAgZGlzcGxhY2VkID0gMDsKLSAgICB3ZWlnaHRlZF9hdmVyYWdlID0gMDsKLSAgICB0b3RhbF93ZWlnaHQgPSAwOwotICAgIGZvciAobiA9IDA7IG4gPCBuYjsgKytuKSB7Ci0gICAgICBpZiAoYWNjdW1bbl0pIHsKLSAgICAgICAgY29uc3QgaW50IG5ld19jZW50ZXIgPSAoZGlzdF9hY2N1bVtuXSArIGFjY3VtW25dIC8gMikgLyBhY2N1bVtuXTsKLSAgICAgICAgZGlzcGxhY2VkICs9IGFicyhjZW50ZXJzW25dIC0gbmV3X2NlbnRlcik7Ci0gICAgICAgIGNlbnRlcnNbbl0gPSBuZXdfY2VudGVyOwotICAgICAgICB3ZWlnaHRlZF9hdmVyYWdlICs9IG5ld19jZW50ZXIgKiBhY2N1bVtuXTsKLSAgICAgICAgdG90YWxfd2VpZ2h0ICs9IGFjY3VtW25dOwotICAgICAgfQotICAgIH0KLSAgICB3ZWlnaHRlZF9hdmVyYWdlID0gKHdlaWdodGVkX2F2ZXJhZ2UgKyB0b3RhbF93ZWlnaHQgLyAyKSAvIHRvdGFsX3dlaWdodDsKLSAgICBpZiAoZGlzcGxhY2VkIDwgNSkgYnJlYWs7ICAgLy8gbm8gbmVlZCB0byBrZWVwIG9uIGxvb3BpbmcuLi4KLSAgfQotCi0gIC8vIE1hcCBlYWNoIG9yaWdpbmFsIHZhbHVlIHRvIHRoZSBjbG9zZXN0IGNlbnRyb2lkCi0gIGZvciAobiA9IDA7IG4gPCBlbmMtPm1iX3dfICogZW5jLT5tYl9oXzsgKytuKSB7Ci0gICAgVlA4TUJJbmZvKiBjb25zdCBtYiA9ICZlbmMtPm1iX2luZm9fW25dOwotICAgIGNvbnN0IGludCBhbHBoYSA9IG1iLT5hbHBoYV87Ci0gICAgbWItPnNlZ21lbnRfID0gbWFwW2FscGhhXTsKLSAgICBtYi0+YWxwaGFfID0gY2VudGVyc1ttYXBbYWxwaGFdXTsgIC8vIGZvciB0aGUgcmVjb3JkLgotICB9Ci0KLSAgaWYgKG5iID4gMSkgewotICAgIGNvbnN0IGludCBzbW9vdGggPSAoZW5jLT5jb25maWdfLT5wcmVwcm9jZXNzaW5nICYgMSk7Ci0gICAgaWYgKHNtb290aCkgU21vb3RoU2VnbWVudE1hcChlbmMpOwotICB9Ci0KLSAgU2V0U2VnbWVudEFscGhhcyhlbmMsIGNlbnRlcnMsIHdlaWdodGVkX2F2ZXJhZ2UpOyAgLy8gcGljayBzb21lIGFscGhhcy4KLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE1hY3JvYmxvY2sgYW5hbHlzaXM6IGNvbGxlY3QgaGlzdG9ncmFtIGZvciBlYWNoIG1vZGUsIGRlZHVjZSB0aGUgbWF4aW1hbAotLy8gc3VzY2VwdGliaWxpdHkgYW5kIHNldCBiZXN0IG1vZGVzIGZvciB0aGlzIG1hY3JvYmxvY2suCi0vLyBTZWdtZW50IGFzc2lnbm1lbnQgaXMgZG9uZSBsYXRlci4KLQotLy8gTnVtYmVyIG9mIG1vZGVzIHRvIGluc3BlY3QgZm9yIGFscGhhXyBldmFsdWF0aW9uLiBGb3IgaGlnaC1xdWFsaXR5IHNldHRpbmdzCi0vLyAobWV0aG9kID49IEZBU1RfQU5BTFlTSVNfTUVUSE9EKSB3ZSBkb24ndCBuZWVkIHRvIHRlc3QgYWxsIHRoZSBwb3NzaWJsZSBtb2RlcwotLy8gZHVyaW5nIHRoZSBhbmFseXNpcyBwaGFzZS4KLSNkZWZpbmUgRkFTVF9BTkFMWVNJU19NRVRIT0QgNCAgLy8gbWV0aG9kIGFib3ZlIHdoaWNoIHdlIGRvIHBhcnRpYWwgYW5hbHlzaXMKLSNkZWZpbmUgTUFYX0lOVFJBMTZfTU9ERSAyCi0jZGVmaW5lIE1BWF9JTlRSQTRfTU9ERSAgMgotI2RlZmluZSBNQVhfVVZfTU9ERSAgICAgIDIKLQotc3RhdGljIGludCBNQkFuYWx5emVCZXN0SW50cmExNk1vZGUoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KSB7Ci0gIGNvbnN0IGludCBtYXhfbW9kZSA9Ci0gICAgICAoaXQtPmVuY18tPm1ldGhvZF8gPj0gRkFTVF9BTkFMWVNJU19NRVRIT0QpID8gTUFYX0lOVFJBMTZfTU9ERQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE5VTV9QUkVEX01PREVTOwotICBpbnQgbW9kZTsKLSAgaW50IGJlc3RfYWxwaGEgPSBERUZBVUxUX0FMUEhBOwotICBpbnQgYmVzdF9tb2RlID0gMDsKLQotICBWUDhNYWtlTHVtYTE2UHJlZHMoaXQpOwotICBmb3IgKG1vZGUgPSAwOyBtb2RlIDwgbWF4X21vZGU7ICsrbW9kZSkgewotICAgIFZQOEhpc3RvZ3JhbSBoaXN0byA9IHsgeyAwIH0gfTsKLSAgICBpbnQgYWxwaGE7Ci0KLSAgICBWUDhDb2xsZWN0SGlzdG9ncmFtKGl0LT55dXZfaW5fICsgWV9PRkYsCi0gICAgICAgICAgICAgICAgICAgICAgICBpdC0+eXV2X3BfICsgVlA4STE2TW9kZU9mZnNldHNbbW9kZV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAwLCAxNiwgJmhpc3RvKTsKLSAgICBhbHBoYSA9IEdldEFscGhhKCZoaXN0byk7Ci0gICAgaWYgKElTX0JFVFRFUl9BTFBIQShhbHBoYSwgYmVzdF9hbHBoYSkpIHsKLSAgICAgIGJlc3RfYWxwaGEgPSBhbHBoYTsKLSAgICAgIGJlc3RfbW9kZSA9IG1vZGU7Ci0gICAgfQotICB9Ci0gIFZQOFNldEludHJhMTZNb2RlKGl0LCBiZXN0X21vZGUpOwotICByZXR1cm4gYmVzdF9hbHBoYTsKLX0KLQotc3RhdGljIGludCBNQkFuYWx5emVCZXN0SW50cmE0TW9kZShWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiZXN0X2FscGhhKSB7Ci0gIHVpbnQ4X3QgbW9kZXNbMTZdOwotICBjb25zdCBpbnQgbWF4X21vZGUgPQotICAgICAgKGl0LT5lbmNfLT5tZXRob2RfID49IEZBU1RfQU5BTFlTSVNfTUVUSE9EKSA/IE1BWF9JTlRSQTRfTU9ERQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE5VTV9CTU9ERVM7Ci0gIGludCBpNF9hbHBoYTsKLSAgVlA4SGlzdG9ncmFtIHRvdGFsX2hpc3RvID0geyB7IDAgfSB9OwotICBpbnQgY3VyX2hpc3RvID0gMDsKLQotICBWUDhJdGVyYXRvclN0YXJ0STQoaXQpOwotICBkbyB7Ci0gICAgaW50IG1vZGU7Ci0gICAgaW50IGJlc3RfbW9kZV9hbHBoYSA9IERFRkFVTFRfQUxQSEE7Ci0gICAgVlA4SGlzdG9ncmFtIGhpc3Rvc1syXTsKLSAgICBjb25zdCB1aW50OF90KiBjb25zdCBzcmMgPSBpdC0+eXV2X2luXyArIFlfT0ZGICsgVlA4U2NhbltpdC0+aTRfXTsKLQotICAgIFZQOE1ha2VJbnRyYTRQcmVkcyhpdCk7Ci0gICAgZm9yIChtb2RlID0gMDsgbW9kZSA8IG1heF9tb2RlOyArK21vZGUpIHsKLSAgICAgIGludCBhbHBoYTsKLQotICAgICAgU2JNZW1vcnlTZXQoJmhpc3Rvc1tjdXJfaGlzdG9dLCAwLCBzaXplb2YoaGlzdG9zW2N1cl9oaXN0b10pKTsKLSAgICAgIFZQOENvbGxlY3RIaXN0b2dyYW0oc3JjLCBpdC0+eXV2X3BfICsgVlA4STRNb2RlT2Zmc2V0c1ttb2RlXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgJmhpc3Rvc1tjdXJfaGlzdG9dKTsKLSAgICAgIGFscGhhID0gR2V0QWxwaGEoJmhpc3Rvc1tjdXJfaGlzdG9dKTsKLSAgICAgIGlmIChJU19CRVRURVJfQUxQSEEoYWxwaGEsIGJlc3RfbW9kZV9hbHBoYSkpIHsKLSAgICAgICAgYmVzdF9tb2RlX2FscGhhID0gYWxwaGE7Ci0gICAgICAgIG1vZGVzW2l0LT5pNF9dID0gbW9kZTsKLSAgICAgICAgY3VyX2hpc3RvIF49IDE7ICAgLy8ga2VlcCB0cmFjayBvZiBiZXN0IGhpc3RvIHNvIGZhci4KLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gYWNjdW11bGF0ZSBiZXN0IGhpc3RvZ3JhbQotICAgIE1lcmdlSGlzdG9ncmFtcygmaGlzdG9zW2N1cl9oaXN0byBeIDFdLCAmdG90YWxfaGlzdG8pOwotICAgIC8vIE5vdGU6IHdlIHJldXNlIHRoZSBvcmlnaW5hbCBzYW1wbGVzIGZvciBwcmVkaWN0b3JzCi0gIH0gd2hpbGUgKFZQOEl0ZXJhdG9yUm90YXRlSTQoaXQsIGl0LT55dXZfaW5fICsgWV9PRkYpKTsKLQotICBpNF9hbHBoYSA9IEdldEFscGhhKCZ0b3RhbF9oaXN0byk7Ci0gIGlmIChJU19CRVRURVJfQUxQSEEoaTRfYWxwaGEsIGJlc3RfYWxwaGEpKSB7Ci0gICAgVlA4U2V0SW50cmE0TW9kZShpdCwgbW9kZXMpOwotICAgIGJlc3RfYWxwaGEgPSBpNF9hbHBoYTsKLSAgfQotICByZXR1cm4gYmVzdF9hbHBoYTsKLX0KLQotc3RhdGljIGludCBNQkFuYWx5emVCZXN0VVZNb2RlKFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCkgewotICBpbnQgYmVzdF9hbHBoYSA9IERFRkFVTFRfQUxQSEE7Ci0gIGludCBiZXN0X21vZGUgPSAwOwotICBjb25zdCBpbnQgbWF4X21vZGUgPQotICAgICAgKGl0LT5lbmNfLT5tZXRob2RfID49IEZBU1RfQU5BTFlTSVNfTUVUSE9EKSA/IE1BWF9VVl9NT0RFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTlVNX1BSRURfTU9ERVM7Ci0gIGludCBtb2RlOwotICBWUDhNYWtlQ2hyb21hOFByZWRzKGl0KTsKLSAgZm9yIChtb2RlID0gMDsgbW9kZSA8IG1heF9tb2RlOyArK21vZGUpIHsKLSAgICBWUDhIaXN0b2dyYW0gaGlzdG8gPSB7IHsgMCB9IH07Ci0gICAgaW50IGFscGhhOwotICAgIFZQOENvbGxlY3RIaXN0b2dyYW0oaXQtPnl1dl9pbl8gKyBVX09GRiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0LT55dXZfcF8gKyBWUDhVVk1vZGVPZmZzZXRzW21vZGVdLAotICAgICAgICAgICAgICAgICAgICAgICAgMTYsIDE2ICsgNCArIDQsICZoaXN0byk7Ci0gICAgYWxwaGEgPSBHZXRBbHBoYSgmaGlzdG8pOwotICAgIGlmIChJU19CRVRURVJfQUxQSEEoYWxwaGEsIGJlc3RfYWxwaGEpKSB7Ci0gICAgICBiZXN0X2FscGhhID0gYWxwaGE7Ci0gICAgICBiZXN0X21vZGUgPSBtb2RlOwotICAgIH0KLSAgfQotICBWUDhTZXRJbnRyYVVWTW9kZShpdCwgYmVzdF9tb2RlKTsKLSAgcmV0dXJuIGJlc3RfYWxwaGE7Ci19Ci0KLXN0YXRpYyB2b2lkIE1CQW5hbHl6ZShWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsCi0gICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhc1tNQVhfQUxQSEEgKyAxXSwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGFscGhhLCBpbnQqIGNvbnN0IHV2X2FscGhhKSB7Ci0gIGNvbnN0IFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOwotICBpbnQgYmVzdF9hbHBoYSwgYmVzdF91dl9hbHBoYTsKLQotICBWUDhTZXRJbnRyYTE2TW9kZShpdCwgMCk7ICAvLyBkZWZhdWx0OiBJbnRyYTE2LCBEQ19QUkVECi0gIFZQOFNldFNraXAoaXQsIDApOyAgICAgICAgIC8vIG5vdCBza2lwcGVkCi0gIFZQOFNldFNlZ21lbnQoaXQsIDApOyAgICAgIC8vIGRlZmF1bHQgc2VnbWVudCwgc3BlYy13aXNlLgotCi0gIGJlc3RfYWxwaGEgPSBNQkFuYWx5emVCZXN0SW50cmExNk1vZGUoaXQpOwotICBpZiAoZW5jLT5tZXRob2RfID49IDUpIHsKLSAgICAvLyBXZSBnbyBhbmQgbWFrZSBhIGZhc3QgZGVjaXNpb24gZm9yIGludHJhNC9pbnRyYTE2LgotICAgIC8vIEl0J3MgdXN1YWxseSBub3QgYSBnb29kIGFuZCBkZWZpbml0aXZlIHBpY2ssIGJ1dCBoZWxwcyBzZWVkaW5nIHRoZSBzdGF0cwotICAgIC8vIGFib3V0IGxldmVsIGJpdC1jb3N0LgotICAgIC8vIFRPRE8oc2thbCk6IGltcHJvdmUgY3JpdGVyaW9uLgotICAgIGJlc3RfYWxwaGEgPSBNQkFuYWx5emVCZXN0SW50cmE0TW9kZShpdCwgYmVzdF9hbHBoYSk7Ci0gIH0KLSAgYmVzdF91dl9hbHBoYSA9IE1CQW5hbHl6ZUJlc3RVVk1vZGUoaXQpOwotCi0gIC8vIEZpbmFsIHN1c2NlcHRpYmlsaXR5IG1peAotICBiZXN0X2FscGhhID0gKDMgKiBiZXN0X2FscGhhICsgYmVzdF91dl9hbHBoYSArIDIpID4+IDI7Ci0gIGJlc3RfYWxwaGEgPSBGaW5hbEFscGhhVmFsdWUoYmVzdF9hbHBoYSk7Ci0gIGFscGhhc1tiZXN0X2FscGhhXSsrOwotICBpdC0+bWJfLT5hbHBoYV8gPSBiZXN0X2FscGhhOyAgIC8vIGZvciBsYXRlciByZW1hcHBpbmcuCi0KLSAgLy8gQWNjdW11bGF0ZSBmb3IgbGF0ZXIgY29tcGxleGl0eSBhbmFseXNpcy4KLSAgKmFscGhhICs9IGJlc3RfYWxwaGE7ICAgLy8gbWl4ZWQgc3VzY2VwdGliaWxpdHkgKG5vdCBqdXN0IGx1bWEpCi0gICp1dl9hbHBoYSArPSBiZXN0X3V2X2FscGhhOwotfQotCi1zdGF0aWMgdm9pZCBEZWZhdWx0TUJJbmZvKFZQOE1CSW5mbyogY29uc3QgbWIpIHsKLSAgbWItPnR5cGVfID0gMTsgICAgIC8vIEkxNngxNgotICBtYi0+dXZfbW9kZV8gPSAwOwotICBtYi0+c2tpcF8gPSAwOyAgICAgLy8gbm90IHNraXBwZWQKLSAgbWItPnNlZ21lbnRfID0gMDsgIC8vIGRlZmF1bHQgc2VnbWVudAotICBtYi0+YWxwaGFfID0gMDsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE1haW4gYW5hbHlzaXMgbG9vcDoKLS8vIENvbGxlY3QgYWxsIHN1c2NlcHRpYmlsaXRpZXMgZm9yIGVhY2ggbWFjcm9ibG9jayBhbmQgcmVjb3JkIHRoZWlyCi0vLyBkaXN0cmlidXRpb24gaW4gYWxwaGFzW10uIFNlZ21lbnRzIGlzIGFzc2lnbmVkIGEtcG9zdGVyaW9yaSwgYmFzZWQgb24KLS8vIHRoaXMgaGlzdG9ncmFtLgotLy8gV2UgYWxzbyBwaWNrIGFuIGludHJhMTYgcHJlZGljdGlvbiBtb2RlLCB3aGljaCBzaG91bGRuJ3QgYmUgY29uc2lkZXJlZAotLy8gZmluYWwgZXhjZXB0IGZvciBmYXN0LWVuY29kZSBzZXR0aW5ncy4gV2UgY2FuIGFsc28gcGljayBzb21lIGludHJhNCBtb2RlcwotLy8gYW5kIGRlY2lkZSBpbnRyYTQvaW50cmExNiwgYnV0IHRoYXQncyB1c3VhbGx5IGFsbW9zdCBhbHdheXMgYSBiYWQgY2hvaWNlIGF0Ci0vLyB0aGlzIHN0YWdlLgotCi1zdGF0aWMgdm9pZCBSZXNldEFsbE1CSW5mbyhWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKLSAgaW50IG47Ci0gIGZvciAobiA9IDA7IG4gPCBlbmMtPm1iX3dfICogZW5jLT5tYl9oXzsgKytuKSB7Ci0gICAgRGVmYXVsdE1CSW5mbygmZW5jLT5tYl9pbmZvX1tuXSk7Ci0gIH0KLSAgLy8gRGVmYXVsdCBzdXNjZXB0aWJpbGl0aWVzLgotICBlbmMtPmRxbV9bMF0uYWxwaGFfID0gMDsKLSAgZW5jLT5kcW1fWzBdLmJldGFfID0gMDsKLSAgLy8gTm90ZTogd2UgY2FuJ3QgY29tcHV0ZSB0aGlzIGFscGhhXyAvIHV2X2FscGhhXy4KLSAgV2ViUFJlcG9ydFByb2dyZXNzKGVuYy0+cGljXywgZW5jLT5wZXJjZW50XyArIDIwLCAmZW5jLT5wZXJjZW50Xyk7Ci19Ci0KLWludCBWUDhFbmNBbmFseXplKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgewotICBpbnQgb2sgPSAxOwotICBjb25zdCBpbnQgZG9fc2VnbWVudHMgPQotICAgICAgZW5jLT5jb25maWdfLT5lbXVsYXRlX2pwZWdfc2l6ZSB8fCAgIC8vIFdlIG5lZWQgdGhlIGNvbXBsZXhpdHkgZXZhbHVhdGlvbi4KLSAgICAgIChlbmMtPnNlZ21lbnRfaGRyXy5udW1fc2VnbWVudHNfID4gMSkgfHwKLSAgICAgIChlbmMtPm1ldGhvZF8gPT0gMCk7ICAvLyBmb3IgbWV0aG9kIDAsIHdlIG5lZWQgcHJlZHNfW10gdG8gYmUgZmlsbGVkLgotICBlbmMtPmFscGhhXyA9IDA7Ci0gIGVuYy0+dXZfYWxwaGFfID0gMDsKLSAgaWYgKGRvX3NlZ21lbnRzKSB7Ci0gICAgaW50IGFscGhhc1tNQVhfQUxQSEEgKyAxXSA9IHsgMCB9OwotICAgIFZQOEVuY0l0ZXJhdG9yIGl0OwotCi0gICAgVlA4SXRlcmF0b3JJbml0KGVuYywgJml0KTsKLSAgICBkbyB7Ci0gICAgICBWUDhJdGVyYXRvckltcG9ydCgmaXQpOwotICAgICAgTUJBbmFseXplKCZpdCwgYWxwaGFzLCAmZW5jLT5hbHBoYV8sICZlbmMtPnV2X2FscGhhXyk7Ci0gICAgICBvayA9IFZQOEl0ZXJhdG9yUHJvZ3Jlc3MoJml0LCAyMCk7Ci0gICAgICAvLyBMZXQncyBwcmV0ZW5kIHdlIGhhdmUgcGVyZmVjdCBsb3NzbGVzcyByZWNvbnN0cnVjdGlvbi4KLSAgICB9IHdoaWxlIChvayAmJiBWUDhJdGVyYXRvck5leHQoJml0LCBpdC55dXZfaW5fKSk7Ci0gICAgZW5jLT5hbHBoYV8gLz0gZW5jLT5tYl93XyAqIGVuYy0+bWJfaF87Ci0gICAgZW5jLT51dl9hbHBoYV8gLz0gZW5jLT5tYl93XyAqIGVuYy0+bWJfaF87Ci0gICAgaWYgKG9rKSBBc3NpZ25TZWdtZW50cyhlbmMsIGFscGhhcyk7Ci0gIH0gZWxzZSB7ICAgLy8gVXNlIG9ubHkgb25lIGRlZmF1bHQgc2VnbWVudC4KLSAgICBSZXNldEFsbE1CSW5mbyhlbmMpOwotICB9Ci0gIHJldHVybiBvazsKLX0KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvYmFja3dhcmRfcmVmZXJlbmNlcy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL2JhY2t3YXJkX3JlZmVyZW5jZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAwNGY5ZC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvYmFja3dhcmRfcmVmZXJlbmNlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsODk5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBBdXRob3I6IEp5cmtpIEFsYWt1aWphbGEgKGp5cmtpQGdvb2dsZS5jb20pCi0vLwotCi0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNlbHNlCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgIi4vYmFja3dhcmRfcmVmZXJlbmNlcy5oIgotI2luY2x1ZGUgIi4vaGlzdG9ncmFtLmgiCi0jaW5jbHVkZSAiLi4vZHNwL2xvc3NsZXNzLmgiCi0jaW5jbHVkZSAiLi4vdXRpbHMvY29sb3JfY2FjaGUuaCIKLSNpbmNsdWRlICIuLi91dGlscy91dGlscy5oIgotCi0jZGVmaW5lIFZBTFVFU19JTl9CWVRFIDI1NgotCi0jZGVmaW5lIEhBU0hfQklUUyAxOAotI2RlZmluZSBIQVNIX1NJWkUgKDEgPDwgSEFTSF9CSVRTKQotI2RlZmluZSBIQVNIX01VTFRJUExJRVIgKDB4YzZhNGE3OTM1YmQxZTk5NVVMTCkKLQotLy8gMU0gd2luZG93ICg0TSBieXRlcykgbWludXMgMTIwIHNwZWNpYWwgY29kZXMgZm9yIHNob3J0IGRpc3RhbmNlcy4KLSNkZWZpbmUgV0lORE9XX1NJWkUgKCgxIDw8IDIwKSAtIDEyMCkKLQotLy8gQm91bmRzIGZvciB0aGUgbWF0Y2ggbGVuZ3RoLgotI2RlZmluZSBNSU5fTEVOR1RIIDIKLSNkZWZpbmUgTUFYX0xFTkdUSCA0MDk2Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgLy8gU3RvcmVzIHRoZSBtb3N0IHJlY2VudGx5IGFkZGVkIHBvc2l0aW9uIHdpdGggdGhlIGdpdmVuIGhhc2ggdmFsdWUuCi0gIGludDMyX3QgaGFzaF90b19maXJzdF9pbmRleF9bSEFTSF9TSVpFXTsKLSAgLy8gY2hhaW5fW3Bvc10gc3RvcmVzIHRoZSBwcmV2aW91cyBwb3NpdGlvbiB3aXRoIHRoZSBzYW1lIGhhc2ggdmFsdWUKLSAgLy8gZm9yIGV2ZXJ5IHBpeGVsIGluIHRoZSBpbWFnZS4KLSAgaW50MzJfdCogY2hhaW5fOwotfSBIYXNoQ2hhaW47Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBjb25zdCB1aW50OF90IHBsYW5lX3RvX2NvZGVfbHV0WzEyOF0gPSB7Ci0gOTYsICAgNzMsICA1NSwgIDM5LCAgMjMsICAxMywgICA1LCAgMSwgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAotIDEwMSwgIDc4LCAgNTgsICA0MiwgIDI2LCAgMTYsICAgOCwgIDIsICAgIDAsICAgMywgIDksICAgMTcsICAyNywgIDQzLCAgNTksICA3OSwKLSAxMDIsICA4NiwgIDYyLCAgNDYsICAzMiwgIDIwLCAgMTAsICA2LCAgICA0LCAgIDcsICAxMSwgIDIxLCAgMzMsICA0NywgIDYzLCAgODcsCi0gMTA1LCAgOTAsICA3MCwgIDUyLCAgMzcsICAyOCwgIDE4LCAgMTQsICAxMiwgIDE1LCAgMTksICAyOSwgIDM4LCAgNTMsICA3MSwgIDkxLAotIDExMCwgIDk5LCAgODIsICA2NiwgIDQ4LCAgMzUsICAzMCwgIDI0LCAgMjIsICAyNSwgIDMxLCAgMzYsICA0OSwgIDY3LCAgODMsIDEwMCwKLSAxMTUsIDEwOCwgIDk0LCAgNzYsICA2NCwgIDUwLCAgNDQsICA0MCwgIDM0LCAgNDEsICA0NSwgIDUxLCAgNjUsICA3NywgIDk1LCAxMDksCi0gMTE4LCAxMTMsIDEwMywgIDkyLCAgODAsICA2OCwgIDYwLCAgNTYsICA1NCwgIDU3LCAgNjEsICA2OSwgIDgxLCAgOTMsIDEwNCwgMTE0LAotIDExOSwgMTE2LCAxMTEsIDEwNiwgIDk3LCAgODgsICA4NCwgIDc0LCAgNzIsICA3NSwgIDg1LCAgODksICA5OCwgMTA3LCAxMTIsIDExNwotfTsKLQotc3RhdGljIGludCBEaXN0YW5jZVRvUGxhbmVDb2RlKGludCB4c2l6ZSwgaW50IGRpc3QpIHsKLSAgY29uc3QgaW50IHlvZmZzZXQgPSBkaXN0IC8geHNpemU7Ci0gIGNvbnN0IGludCB4b2Zmc2V0ID0gZGlzdCAtIHlvZmZzZXQgKiB4c2l6ZTsKLSAgaWYgKHhvZmZzZXQgPD0gOCAmJiB5b2Zmc2V0IDwgOCkgewotICAgIHJldHVybiBwbGFuZV90b19jb2RlX2x1dFt5b2Zmc2V0ICogMTYgKyA4IC0geG9mZnNldF0gKyAxOwotICB9IGVsc2UgaWYgKHhvZmZzZXQgPiB4c2l6ZSAtIDggJiYgeW9mZnNldCA8IDcpIHsKLSAgICByZXR1cm4gcGxhbmVfdG9fY29kZV9sdXRbKHlvZmZzZXQgKyAxKSAqIDE2ICsgOCArICh4c2l6ZSAtIHhvZmZzZXQpXSArIDE7Ci0gIH0KLSAgcmV0dXJuIGRpc3QgKyAxMjA7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgRmluZE1hdGNoTGVuZ3RoKGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcnJheTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgYXJyYXkyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG1heF9saW1pdCkgewotICBpbnQgbWF0Y2hfbGVuID0gMDsKLSAgd2hpbGUgKG1hdGNoX2xlbiA8IG1heF9saW1pdCAmJiBhcnJheTFbbWF0Y2hfbGVuXSA9PSBhcnJheTJbbWF0Y2hfbGVuXSkgewotICAgICsrbWF0Y2hfbGVuOwotICB9Ci0gIHJldHVybiBtYXRjaF9sZW47Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgVlA4TEJhY2t3YXJkUmVmcwotCi12b2lkIFZQOExJbml0QmFja3dhcmRSZWZzKFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMpIHsKLSAgaWYgKHJlZnMgIT0gTlVMTCkgewotICAgIHJlZnMtPnJlZnMgPSBOVUxMOwotICAgIHJlZnMtPnNpemUgPSAwOwotICAgIHJlZnMtPm1heF9zaXplID0gMDsKLSAgfQotfQotCi12b2lkIFZQOExDbGVhckJhY2t3YXJkUmVmcyhWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzKSB7Ci0gIGlmIChyZWZzICE9IE5VTEwpIHsKLSAgICBTYk1lbW9yeURlYWxsb2NhdGUocmVmcy0+cmVmcyk7Ci0gICAgVlA4TEluaXRCYWNrd2FyZFJlZnMocmVmcyk7Ci0gIH0KLX0KLQotaW50IFZQOExCYWNrd2FyZFJlZnNBbGxvYyhWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzLCBpbnQgbWF4X3NpemUpIHsKLSAgU0JfRENIRUNLKHJlZnMgIT0gTlVMTCk7Ci0gIHJlZnMtPnNpemUgPSAwOwotICByZWZzLT5tYXhfc2l6ZSA9IDA7Ci0gIHJlZnMtPnJlZnMgPSAoUGl4T3JDb3B5KilXZWJQU2FmZU1hbGxvYygodWludDY0X3QpbWF4X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKnJlZnMtPnJlZnMpKTsKLSAgaWYgKHJlZnMtPnJlZnMgPT0gTlVMTCkgcmV0dXJuIDA7Ci0gIHJlZnMtPm1heF9zaXplID0gbWF4X3NpemU7Ci0gIHJldHVybiAxOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gSGFzaCBjaGFpbnMKLQotc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ2NF90IEdldFBpeFBhaXJIYXNoNjQoY29uc3QgdWludDMyX3QqIGNvbnN0IGFyZ2IpIHsKLSAgdWludDY0X3Qga2V5ID0gKCh1aW50NjRfdCkoYXJnYlsxXSkgPDwgMzIpIHwgYXJnYlswXTsKLSAga2V5ID0gKGtleSAqIEhBU0hfTVVMVElQTElFUikgPj4gKDY0IC0gSEFTSF9CSVRTKTsKLSAgcmV0dXJuIGtleTsKLX0KLQotc3RhdGljIGludCBIYXNoQ2hhaW5Jbml0KEhhc2hDaGFpbiogY29uc3QgcCwgaW50IHNpemUpIHsKLSAgaW50IGk7Ci0gIHAtPmNoYWluXyA9IChpbnQqKVdlYlBTYWZlTWFsbG9jKCh1aW50NjRfdClzaXplLCBzaXplb2YoKnAtPmNoYWluXykpOwotICBpZiAocC0+Y2hhaW5fID09IE5VTEwpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0gICAgcC0+Y2hhaW5fW2ldID0gLTE7Ci0gIH0KLSAgZm9yIChpID0gMDsgaSA8IEhBU0hfU0laRTsgKytpKSB7Ci0gICAgcC0+aGFzaF90b19maXJzdF9pbmRleF9baV0gPSAtMTsKLSAgfQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQgSGFzaENoYWluRGVsZXRlKEhhc2hDaGFpbiogY29uc3QgcCkgewotICBpZiAocCAhPSBOVUxMKSB7Ci0gICAgU2JNZW1vcnlEZWFsbG9jYXRlKHAtPmNoYWluXyk7Ci0gICAgU2JNZW1vcnlEZWFsbG9jYXRlKHApOwotICB9Ci19Ci0KLS8vIEluc2VydGlvbiBvZiB0d28gcGl4ZWxzIGF0IGEgdGltZS4KLXN0YXRpYyB2b2lkIEhhc2hDaGFpbkluc2VydChIYXNoQ2hhaW4qIGNvbnN0IHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGFyZ2IsIGludCBwb3MpIHsKLSAgY29uc3QgdWludDY0X3QgaGFzaF9jb2RlID0gR2V0UGl4UGFpckhhc2g2NChhcmdiKTsKLSAgcC0+Y2hhaW5fW3Bvc10gPSBwLT5oYXNoX3RvX2ZpcnN0X2luZGV4X1toYXNoX2NvZGVdOwotICBwLT5oYXNoX3RvX2ZpcnN0X2luZGV4X1toYXNoX2NvZGVdID0gcG9zOwotfQotCi1zdGF0aWMgdm9pZCBHZXRQYXJhbXNGb3JIYXNoQ2hhaW5GaW5kQ29weShpbnQgcXVhbGl0eSwgaW50IHhzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhY2hlX2JpdHMsIGludCogd2luZG93X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGl0ZXJfcG9zLCBpbnQqIGl0ZXJfbGltaXQpIHsKLSAgY29uc3QgaW50IGl0ZXJfbXVsdCA9IChxdWFsaXR5IDwgMjcpID8gMSA6IDEgKyAoKHF1YWxpdHkgLSAyNykgPj4gNCk7Ci0gIGNvbnN0IGludCBpdGVyX25lZyA9IC1pdGVyX211bHQgKiAocXVhbGl0eSA+PiAxKTsKLSAgLy8gTGltaXQgdGhlIGJhY2t3YXJkLXJlZiB3aW5kb3cgc2l6ZSBmb3IgbG93ZXIgcXVhbGl0aWVzLgotICBjb25zdCBpbnQgbWF4X3dpbmRvd19zaXplID0gKHF1YWxpdHkgPiA1MCkgPyBXSU5ET1dfU0laRQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKHF1YWxpdHkgPiAyNSkgPyAoeHNpemUgPDwgOCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICh4c2l6ZSA8PCA0KTsKLSAgU0JfRENIRUNLKHhzaXplID4gMCk7Ci0gICp3aW5kb3dfc2l6ZSA9IChtYXhfd2luZG93X3NpemUgPiBXSU5ET1dfU0laRSkgPyBXSU5ET1dfU0laRQotICAgICAgICAgICAgICAgOiBtYXhfd2luZG93X3NpemU7Ci0gICppdGVyX3BvcyA9IDggKyAocXVhbGl0eSA+PiAzKTsKLSAgLy8gRm9yIGxvd2VyIGVudHJvcHkgaW1hZ2VzLCB0aGUgcmlnb3Vyb3VzIHNlYXJjaCBsb29wIGluIEhhc2hDaGFpbkZpbmRDb3B5Ci0gIC8vIGNhbiBiZSByZWxheGVkLgotICAqaXRlcl9saW1pdCA9IChjYWNoZV9iaXRzID4gMCkgPyBpdGVyX25lZyA6IGl0ZXJfbmVnIC8gMjsKLX0KLQotc3RhdGljIGludCBIYXNoQ2hhaW5GaW5kQ29weShjb25zdCBIYXNoQ2hhaW4qIGNvbnN0IHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiYXNlX3Bvc2l0aW9uLCBpbnQgeHNpemVfc2lnbmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwgaW50IG1heGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpbmRvd19zaXplLCBpbnQgaXRlcl9wb3MsIGludCBpdGVyX2xpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGRpc3RhbmNlX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBsZW5ndGhfcHRyKSB7Ci0gIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiX3N0YXJ0ID0gYXJnYiArIGJhc2VfcG9zaXRpb247Ci0gIHVpbnQ2NF90IGJlc3RfdmFsID0gMDsKLSAgdWludDMyX3QgYmVzdF9sZW5ndGggPSAxOwotICB1aW50MzJfdCBiZXN0X2Rpc3RhbmNlID0gMDsKLSAgY29uc3QgdWludDMyX3QgeHNpemUgPSAodWludDMyX3QpeHNpemVfc2lnbmVkOwotICBjb25zdCBpbnQgbWluX3BvcyA9Ci0gICAgICAoYmFzZV9wb3NpdGlvbiA+IHdpbmRvd19zaXplKSA/IGJhc2VfcG9zaXRpb24gLSB3aW5kb3dfc2l6ZSA6IDA7Ci0gIGludCBwb3M7Ci0gIFNCX0RDSEVDSyh4c2l6ZSA+IDApOwotICBmb3IgKHBvcyA9IHAtPmhhc2hfdG9fZmlyc3RfaW5kZXhfW0dldFBpeFBhaXJIYXNoNjQoYXJnYl9zdGFydCldOwotICAgICAgIHBvcyA+PSBtaW5fcG9zOwotICAgICAgIHBvcyA9IHAtPmNoYWluX1twb3NdKSB7Ci0gICAgdWludDY0X3QgdmFsOwotICAgIHVpbnQzMl90IGN1cnJfbGVuZ3RoOwotICAgIHVpbnQzMl90IGRpc3RhbmNlOwotICAgIGlmIChpdGVyX3BvcyA8IDApIHsKLSAgICAgIGlmIChpdGVyX3BvcyA8IGl0ZXJfbGltaXQgfHwgYmVzdF92YWwgPj0gMHhmZjAwMDApIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIC0taXRlcl9wb3M7Ci0gICAgaWYgKGFyZ2JbcG9zICsgYmVzdF9sZW5ndGggLSAxXSAhPSBhcmdiX3N0YXJ0W2Jlc3RfbGVuZ3RoIC0gMV0pIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBjdXJyX2xlbmd0aCA9IEZpbmRNYXRjaExlbmd0aChhcmdiICsgcG9zLCBhcmdiX3N0YXJ0LCBtYXhsZW4pOwotICAgIGlmIChjdXJyX2xlbmd0aCA8IGJlc3RfbGVuZ3RoKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgZGlzdGFuY2UgPSAodWludDMyX3QpKGJhc2VfcG9zaXRpb24gLSBwb3MpOwotICAgIHZhbCA9IGN1cnJfbGVuZ3RoIDw8IDE2OwotICAgIC8vIEZhdm9yaW5nIDJkIGxvY2FsaXR5IGhlcmUgZ2l2ZXMgc2F2aW5ncyBmb3IgY2VydGFpbiBpbWFnZXMuCi0gICAgaWYgKGRpc3RhbmNlIDwgOSAqIHhzaXplKSB7Ci0gICAgICBjb25zdCB1aW50MzJfdCB5ID0gZGlzdGFuY2UgLyB4c2l6ZTsKLSAgICAgIHVpbnQzMl90IHggPSBkaXN0YW5jZSAlIHhzaXplOwotICAgICAgaWYgKHggPiAoeHNpemUgPj4gMSkpIHsKLSAgICAgICAgeCA9IHhzaXplIC0geDsKLSAgICAgIH0KLSAgICAgIGlmICh4IDw9IDcpIHsKLSAgICAgICAgdmFsICs9IDkgKiA5ICsgOSAqIDk7Ci0gICAgICAgIHZhbCAtPSB5ICogeSArIHggKiB4OwotICAgICAgfQotICAgIH0KLSAgICBpZiAoYmVzdF92YWwgPCB2YWwpIHsKLSAgICAgIGJlc3RfdmFsID0gdmFsOwotICAgICAgYmVzdF9sZW5ndGggPSBjdXJyX2xlbmd0aDsKLSAgICAgIGJlc3RfZGlzdGFuY2UgPSBkaXN0YW5jZTsKLSAgICAgIGlmIChjdXJyX2xlbmd0aCA+PSBNQVhfTEVOR1RIKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaWYgKChiZXN0X2Rpc3RhbmNlID09IDEgfHwgZGlzdGFuY2UgPT0geHNpemUpICYmCi0gICAgICAgICAgYmVzdF9sZW5ndGggPj0gMTI4KSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotICAqZGlzdGFuY2VfcHRyID0gKGludCliZXN0X2Rpc3RhbmNlOwotICAqbGVuZ3RoX3B0ciA9IGJlc3RfbGVuZ3RoOwotICByZXR1cm4gKGJlc3RfbGVuZ3RoID49IE1JTl9MRU5HVEgpOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBQdXNoQmFja0NvcHkoVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcywgaW50IGxlbmd0aCkgewotICBpbnQgc2l6ZSA9IHJlZnMtPnNpemU7Ci0gIHdoaWxlIChsZW5ndGggPj0gTUFYX0xFTkdUSCkgewotICAgIHJlZnMtPnJlZnNbc2l6ZSsrXSA9IFBpeE9yQ29weUNyZWF0ZUNvcHkoMSwgTUFYX0xFTkdUSCk7Ci0gICAgbGVuZ3RoIC09IE1BWF9MRU5HVEg7Ci0gIH0KLSAgaWYgKGxlbmd0aCA+IDApIHsKLSAgICByZWZzLT5yZWZzW3NpemUrK10gPSBQaXhPckNvcHlDcmVhdGVDb3B5KDEsIGxlbmd0aCk7Ci0gIH0KLSAgcmVmcy0+c2l6ZSA9IHNpemU7Ci19Ci0KLXN0YXRpYyB2b2lkIEJhY2t3YXJkUmVmZXJlbmNlc1JsZShpbnQgeHNpemUsIGludCB5c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzKSB7Ci0gIGNvbnN0IGludCBwaXhfY291bnQgPSB4c2l6ZSAqIHlzaXplOwotICBpbnQgbWF0Y2hfbGVuID0gMDsKLSAgaW50IGk7Ci0gIHJlZnMtPnNpemUgPSAwOwotICBQdXNoQmFja0NvcHkocmVmcywgbWF0Y2hfbGVuKTsgICAgLy8gaT0wIGNhc2UKLSAgcmVmcy0+cmVmc1tyZWZzLT5zaXplKytdID0gUGl4T3JDb3B5Q3JlYXRlTGl0ZXJhbChhcmdiWzBdKTsKLSAgZm9yIChpID0gMTsgaSA8IHBpeF9jb3VudDsgKytpKSB7Ci0gICAgaWYgKGFyZ2JbaV0gPT0gYXJnYltpIC0gMV0pIHsKLSAgICAgICsrbWF0Y2hfbGVuOwotICAgIH0gZWxzZSB7Ci0gICAgICBQdXNoQmFja0NvcHkocmVmcywgbWF0Y2hfbGVuKTsKLSAgICAgIG1hdGNoX2xlbiA9IDA7Ci0gICAgICByZWZzLT5yZWZzW3JlZnMtPnNpemUrK10gPSBQaXhPckNvcHlDcmVhdGVMaXRlcmFsKGFyZ2JbaV0pOwotICAgIH0KLSAgfQotICBQdXNoQmFja0NvcHkocmVmcywgbWF0Y2hfbGVuKTsKLX0KLQotc3RhdGljIGludCBCYWNrd2FyZFJlZmVyZW5jZXNIYXNoQ2hhaW4oaW50IHhzaXplLCBpbnQgeXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYWNoZV9iaXRzLCBpbnQgcXVhbGl0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMpIHsKLSAgaW50IGk7Ci0gIGludCBvayA9IDA7Ci0gIGludCBjY19pbml0ID0gMDsKLSAgY29uc3QgaW50IHVzZV9jb2xvcl9jYWNoZSA9IChjYWNoZV9iaXRzID4gMCk7Ci0gIGNvbnN0IGludCBwaXhfY291bnQgPSB4c2l6ZSAqIHlzaXplOwotICBIYXNoQ2hhaW4qIGNvbnN0IGhhc2hfY2hhaW4gPSAoSGFzaENoYWluKilTYk1lbW9yeUFsbG9jYXRlKHNpemVvZigqaGFzaF9jaGFpbikpOwotICBWUDhMQ29sb3JDYWNoZSBoYXNoZXJzOwotICBpbnQgd2luZG93X3NpemUgPSBXSU5ET1dfU0laRTsKLSAgaW50IGl0ZXJfcG9zID0gMTsKLSAgaW50IGl0ZXJfbGltaXQgPSAtMTsKLQotICBpZiAoaGFzaF9jaGFpbiA9PSBOVUxMKSByZXR1cm4gMDsKLSAgaWYgKHVzZV9jb2xvcl9jYWNoZSkgewotICAgIGNjX2luaXQgPSBWUDhMQ29sb3JDYWNoZUluaXQoJmhhc2hlcnMsIGNhY2hlX2JpdHMpOwotICAgIGlmICghY2NfaW5pdCkgZ290byBFcnJvcjsKLSAgfQotCi0gIGlmICghSGFzaENoYWluSW5pdChoYXNoX2NoYWluLCBwaXhfY291bnQpKSBnb3RvIEVycm9yOwotCi0gIHJlZnMtPnNpemUgPSAwOwotICBHZXRQYXJhbXNGb3JIYXNoQ2hhaW5GaW5kQ29weShxdWFsaXR5LCB4c2l6ZSwgY2FjaGVfYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndpbmRvd19zaXplLCAmaXRlcl9wb3MsICZpdGVyX2xpbWl0KTsKLSAgZm9yIChpID0gMDsgaSA8IHBpeF9jb3VudDsgKSB7Ci0gICAgLy8gQWx0ZXJuYXRpdmUjMTogQ29kZSB0aGUgcGl4ZWxzIHN0YXJ0aW5nIGF0ICdpJyB1c2luZyBiYWNrd2FyZCByZWZlcmVuY2UuCi0gICAgaW50IG9mZnNldCA9IDA7Ci0gICAgaW50IGxlbiA9IDA7Ci0gICAgaWYgKGkgPCBwaXhfY291bnQgLSAxKSB7ICAvLyBGaW5kQ29weShpLC4uKSByZWFkcyBwaXhlbHMgYXQgW2ldIGFuZCBbaSArIDFdLgotICAgICAgaW50IG1heGxlbiA9IHBpeF9jb3VudCAtIGk7Ci0gICAgICBpZiAobWF4bGVuID4gTUFYX0xFTkdUSCkgewotICAgICAgICBtYXhsZW4gPSBNQVhfTEVOR1RIOwotICAgICAgfQotICAgICAgSGFzaENoYWluRmluZENvcHkoaGFzaF9jaGFpbiwgaSwgeHNpemUsIGFyZ2IsIG1heGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvd19zaXplLCBpdGVyX3BvcywgaXRlcl9saW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsICZsZW4pOwotICAgIH0KLSAgICBpZiAobGVuID49IE1JTl9MRU5HVEgpIHsKLSAgICAgIC8vIEFsdGVybmF0aXZlIzI6IEluc2VydCB0aGUgcGl4ZWwgYXQgJ2knIGFzIGxpdGVyYWwsIGFuZCBjb2RlIHRoZQotICAgICAgLy8gcGl4ZWxzIHN0YXJ0aW5nIGF0ICdpICsgMScgdXNpbmcgYmFja3dhcmQgcmVmZXJlbmNlLgotICAgICAgaW50IG9mZnNldDIgPSAwOwotICAgICAgaW50IGxlbjIgPSAwOwotICAgICAgaW50IGs7Ci0gICAgICBIYXNoQ2hhaW5JbnNlcnQoaGFzaF9jaGFpbiwgJmFyZ2JbaV0sIGkpOwotICAgICAgaWYgKGkgPCBwaXhfY291bnQgLSAyKSB7ICAvLyBGaW5kQ29weShpKzEsLi4pIHJlYWRzIFtpICsgMV0gYW5kIFtpICsgMl0uCi0gICAgICAgIGludCBtYXhsZW4gPSBwaXhfY291bnQgLSAoaSArIDEpOwotICAgICAgICBpZiAobWF4bGVuID4gTUFYX0xFTkdUSCkgewotICAgICAgICAgIG1heGxlbiA9IE1BWF9MRU5HVEg7Ci0gICAgICAgIH0KLSAgICAgICAgSGFzaENoYWluRmluZENvcHkoaGFzaF9jaGFpbiwgaSArIDEsIHhzaXplLCBhcmdiLCBtYXhsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvd19zaXplLCBpdGVyX3BvcywgaXRlcl9saW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldDIsICZsZW4yKTsKLSAgICAgICAgaWYgKGxlbjIgPiBsZW4gKyAxKSB7Ci0gICAgICAgICAgY29uc3QgdWludDMyX3QgcGl4ZWwgPSBhcmdiW2ldOwotICAgICAgICAgIC8vIEFsdGVybmF0aXZlIzIgaXMgYSBiZXR0ZXIgbWF0Y2guIFNvIHB1c2ggcGl4ZWwgYXQgJ2knIGFzIGxpdGVyYWwuCi0gICAgICAgICAgaWYgKHVzZV9jb2xvcl9jYWNoZSAmJiBWUDhMQ29sb3JDYWNoZUNvbnRhaW5zKCZoYXNoZXJzLCBwaXhlbCkpIHsKLSAgICAgICAgICAgIGNvbnN0IGludCBpeCA9IFZQOExDb2xvckNhY2hlR2V0SW5kZXgoJmhhc2hlcnMsIHBpeGVsKTsKLSAgICAgICAgICAgIHJlZnMtPnJlZnNbcmVmcy0+c2l6ZV0gPSBQaXhPckNvcHlDcmVhdGVDYWNoZUlkeChpeCk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlZnMtPnJlZnNbcmVmcy0+c2l6ZV0gPSBQaXhPckNvcHlDcmVhdGVMaXRlcmFsKHBpeGVsKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgKytyZWZzLT5zaXplOwotICAgICAgICAgIGlmICh1c2VfY29sb3JfY2FjaGUpIFZQOExDb2xvckNhY2hlSW5zZXJ0KCZoYXNoZXJzLCBwaXhlbCk7Ci0gICAgICAgICAgaSsrOyAgLy8gQmFja3dhcmQgcmVmZXJlbmNlIHRvIGJlIGRvbmUgZm9yIG5leHQgcGl4ZWwuCi0gICAgICAgICAgbGVuID0gbGVuMjsKLSAgICAgICAgICBvZmZzZXQgPSBvZmZzZXQyOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAobGVuID49IE1BWF9MRU5HVEgpIHsKLSAgICAgICAgbGVuID0gTUFYX0xFTkdUSCAtIDE7Ci0gICAgICB9Ci0gICAgICByZWZzLT5yZWZzW3JlZnMtPnNpemUrK10gPSBQaXhPckNvcHlDcmVhdGVDb3B5KG9mZnNldCwgbGVuKTsKLSAgICAgIGlmICh1c2VfY29sb3JfY2FjaGUpIHsKLSAgICAgICAgZm9yIChrID0gMDsgayA8IGxlbjsgKytrKSB7Ci0gICAgICAgICAgVlA4TENvbG9yQ2FjaGVJbnNlcnQoJmhhc2hlcnMsIGFyZ2JbaSArIGtdKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgLy8gQWRkIHRvIHRoZSBoYXNoX2NoYWluIChidXQgY2Fubm90IGFkZCB0aGUgbGFzdCBwaXhlbCkuCi0gICAgICB7Ci0gICAgICAgIGNvbnN0IGludCBsYXN0ID0gKGxlbiA8IHBpeF9jb3VudCAtIDEgLSBpKSA/IGxlbiA6IHBpeF9jb3VudCAtIDEgLSBpOwotICAgICAgICBmb3IgKGsgPSAxOyBrIDwgbGFzdDsgKytrKSB7Ci0gICAgICAgICAgSGFzaENoYWluSW5zZXJ0KGhhc2hfY2hhaW4sICZhcmdiW2kgKyBrXSwgaSArIGspOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpICs9IGxlbjsKLSAgICB9IGVsc2UgewotICAgICAgY29uc3QgdWludDMyX3QgcGl4ZWwgPSBhcmdiW2ldOwotICAgICAgaWYgKHVzZV9jb2xvcl9jYWNoZSAmJiBWUDhMQ29sb3JDYWNoZUNvbnRhaW5zKCZoYXNoZXJzLCBwaXhlbCkpIHsKLSAgICAgICAgLy8gcHVzaCBwaXhlbCBhcyBhIFBpeE9yQ29weUNyZWF0ZUNhY2hlSWR4IHBpeGVsCi0gICAgICAgIGNvbnN0IGludCBpeCA9IFZQOExDb2xvckNhY2hlR2V0SW5kZXgoJmhhc2hlcnMsIHBpeGVsKTsKLSAgICAgICAgcmVmcy0+cmVmc1tyZWZzLT5zaXplXSA9IFBpeE9yQ29weUNyZWF0ZUNhY2hlSWR4KGl4KTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlZnMtPnJlZnNbcmVmcy0+c2l6ZV0gPSBQaXhPckNvcHlDcmVhdGVMaXRlcmFsKHBpeGVsKTsKLSAgICAgIH0KLSAgICAgICsrcmVmcy0+c2l6ZTsKLSAgICAgIGlmICh1c2VfY29sb3JfY2FjaGUpIFZQOExDb2xvckNhY2hlSW5zZXJ0KCZoYXNoZXJzLCBwaXhlbCk7Ci0gICAgICBpZiAoaSArIDEgPCBwaXhfY291bnQpIHsKLSAgICAgICAgSGFzaENoYWluSW5zZXJ0KGhhc2hfY2hhaW4sICZhcmdiW2ldLCBpKTsKLSAgICAgIH0KLSAgICAgICsraTsKLSAgICB9Ci0gIH0KLSAgb2sgPSAxOwotRXJyb3I6Ci0gIGlmIChjY19pbml0KSBWUDhMQ29sb3JDYWNoZUNsZWFyKCZoYXNoZXJzKTsKLSAgSGFzaENoYWluRGVsZXRlKGhhc2hfY2hhaW4pOwotICByZXR1cm4gb2s7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgZG91YmxlIGFscGhhX1tWQUxVRVNfSU5fQllURV07Ci0gIGRvdWJsZSByZWRfW1ZBTFVFU19JTl9CWVRFXTsKLSAgZG91YmxlIGxpdGVyYWxfW1BJWF9PUl9DT1BZX0NPREVTX01BWF07Ci0gIGRvdWJsZSBibHVlX1tWQUxVRVNfSU5fQllURV07Ci0gIGRvdWJsZSBkaXN0YW5jZV9bTlVNX0RJU1RBTkNFX0NPREVTXTsKLX0gQ29zdE1vZGVsOwotCi1zdGF0aWMgaW50IEJhY2t3YXJkUmVmZXJlbmNlc1RyYWNlQmFja3dhcmRzKAotICAgIGludCB4c2l6ZSwgaW50IHlzaXplLCBpbnQgcmVjdXJzaXZlX2Nvc3RfbW9kZWwsCi0gICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGFyZ2IsIGludCBxdWFsaXR5LCBpbnQgY2FjaGVfYml0cywKLSAgICBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzKTsKLQotc3RhdGljIHZvaWQgQ29udmVydFBvcHVsYXRpb25Db3VudFRhYmxlVG9CaXRFc3RpbWF0ZXMoCi0gICAgaW50IG51bV9zeW1ib2xzLCBjb25zdCBpbnQgcG9wdWxhdGlvbl9jb3VudHNbXSwgZG91YmxlIG91dHB1dFtdKSB7Ci0gIGludCBzdW0gPSAwOwotICBpbnQgbm9uemVyb3MgPSAwOwotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IG51bV9zeW1ib2xzOyArK2kpIHsKLSAgICBzdW0gKz0gcG9wdWxhdGlvbl9jb3VudHNbaV07Ci0gICAgaWYgKHBvcHVsYXRpb25fY291bnRzW2ldID4gMCkgewotICAgICAgKytub256ZXJvczsKLSAgICB9Ci0gIH0KLSAgaWYgKG5vbnplcm9zIDw9IDEpIHsKLSAgICBTYk1lbW9yeVNldChvdXRwdXQsIDAsIG51bV9zeW1ib2xzICogc2l6ZW9mKCpvdXRwdXQpKTsKLSAgfSBlbHNlIHsKLSAgICBjb25zdCBkb3VibGUgbG9nc3VtID0gVlA4TEZhc3RMb2cyKHN1bSk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bV9zeW1ib2xzOyArK2kpIHsKLSAgICAgIG91dHB1dFtpXSA9IGxvZ3N1bSAtIFZQOExGYXN0TG9nMihwb3B1bGF0aW9uX2NvdW50c1tpXSk7Ci0gICAgfQotICB9Ci19Ci0KLXN0YXRpYyBpbnQgQ29zdE1vZGVsQnVpbGQoQ29zdE1vZGVsKiBjb25zdCBtLCBpbnQgeHNpemUsIGludCB5c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlY3Vyc2lvbl9sZXZlbCwgY29uc3QgdWludDMyX3QqIGNvbnN0IGFyZ2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBxdWFsaXR5LCBpbnQgY2FjaGVfYml0cykgewotICBpbnQgb2sgPSAwOwotICBWUDhMSGlzdG9ncmFtIGhpc3RvOwotICBWUDhMQmFja3dhcmRSZWZzIHJlZnM7Ci0KLSAgaWYgKCFWUDhMQmFja3dhcmRSZWZzQWxsb2MoJnJlZnMsIHhzaXplICogeXNpemUpKSBnb3RvIEVycm9yOwotCi0gIGlmIChyZWN1cnNpb25fbGV2ZWwgPiAwKSB7Ci0gICAgaWYgKCFCYWNrd2FyZFJlZmVyZW5jZXNUcmFjZUJhY2t3YXJkcyh4c2l6ZSwgeXNpemUsIHJlY3Vyc2lvbl9sZXZlbCAtIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdiLCBxdWFsaXR5LCBjYWNoZV9iaXRzLCAmcmVmcykpIHsKLSAgICAgIGdvdG8gRXJyb3I7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmICghQmFja3dhcmRSZWZlcmVuY2VzSGFzaENoYWluKHhzaXplLCB5c2l6ZSwgYXJnYiwgY2FjaGVfYml0cywgcXVhbGl0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmcykpIHsKLSAgICAgIGdvdG8gRXJyb3I7Ci0gICAgfQotICB9Ci0gIFZQOExIaXN0b2dyYW1DcmVhdGUoJmhpc3RvLCAmcmVmcywgY2FjaGVfYml0cyk7Ci0gIENvbnZlcnRQb3B1bGF0aW9uQ291bnRUYWJsZVRvQml0RXN0aW1hdGVzKAotICAgICAgVlA4TEhpc3RvZ3JhbU51bUNvZGVzKCZoaXN0byksIGhpc3RvLmxpdGVyYWxfLCBtLT5saXRlcmFsXyk7Ci0gIENvbnZlcnRQb3B1bGF0aW9uQ291bnRUYWJsZVRvQml0RXN0aW1hdGVzKAotICAgICAgVkFMVUVTX0lOX0JZVEUsIGhpc3RvLnJlZF8sIG0tPnJlZF8pOwotICBDb252ZXJ0UG9wdWxhdGlvbkNvdW50VGFibGVUb0JpdEVzdGltYXRlcygKLSAgICAgIFZBTFVFU19JTl9CWVRFLCBoaXN0by5ibHVlXywgbS0+Ymx1ZV8pOwotICBDb252ZXJ0UG9wdWxhdGlvbkNvdW50VGFibGVUb0JpdEVzdGltYXRlcygKLSAgICAgIFZBTFVFU19JTl9CWVRFLCBoaXN0by5hbHBoYV8sIG0tPmFscGhhXyk7Ci0gIENvbnZlcnRQb3B1bGF0aW9uQ291bnRUYWJsZVRvQml0RXN0aW1hdGVzKAotICAgICAgTlVNX0RJU1RBTkNFX0NPREVTLCBoaXN0by5kaXN0YW5jZV8sIG0tPmRpc3RhbmNlXyk7Ci0gIG9rID0gMTsKLQotIEVycm9yOgotICBWUDhMQ2xlYXJCYWNrd2FyZFJlZnMoJnJlZnMpOwotICByZXR1cm4gb2s7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSBkb3VibGUgR2V0TGl0ZXJhbENvc3QoY29uc3QgQ29zdE1vZGVsKiBjb25zdCBtLCB1aW50MzJfdCB2KSB7Ci0gIHJldHVybiBtLT5hbHBoYV9bdiA+PiAyNF0gKwotICAgICAgICAgbS0+cmVkX1sodiA+PiAxNikgJiAweGZmXSArCi0gICAgICAgICBtLT5saXRlcmFsX1sodiA+PiA4KSAmIDB4ZmZdICsKLSAgICAgICAgIG0tPmJsdWVfW3YgJiAweGZmXTsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIGRvdWJsZSBHZXRDYWNoZUNvc3QoY29uc3QgQ29zdE1vZGVsKiBjb25zdCBtLCB1aW50MzJfdCBpZHgpIHsKLSAgY29uc3QgaW50IGxpdGVyYWxfaWR4ID0gVkFMVUVTX0lOX0JZVEUgKyBOVU1fTEVOR1RIX0NPREVTICsgaWR4OwotICByZXR1cm4gbS0+bGl0ZXJhbF9bbGl0ZXJhbF9pZHhdOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgZG91YmxlIEdldExlbmd0aENvc3QoY29uc3QgQ29zdE1vZGVsKiBjb25zdCBtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxlbmd0aCkgewotICBpbnQgY29kZSwgZXh0cmFfYml0c19jb3VudCwgZXh0cmFfYml0c192YWx1ZTsKLSAgUHJlZml4RW5jb2RlKGxlbmd0aCwgJmNvZGUsICZleHRyYV9iaXRzX2NvdW50LCAmZXh0cmFfYml0c192YWx1ZSk7Ci0gIHJldHVybiBtLT5saXRlcmFsX1tWQUxVRVNfSU5fQllURSArIGNvZGVdICsgZXh0cmFfYml0c19jb3VudDsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIGRvdWJsZSBHZXREaXN0YW5jZUNvc3QoY29uc3QgQ29zdE1vZGVsKiBjb25zdCBtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGlzdGFuY2UpIHsKLSAgaW50IGNvZGUsIGV4dHJhX2JpdHNfY291bnQsIGV4dHJhX2JpdHNfdmFsdWU7Ci0gIFByZWZpeEVuY29kZShkaXN0YW5jZSwgJmNvZGUsICZleHRyYV9iaXRzX2NvdW50LCAmZXh0cmFfYml0c192YWx1ZSk7Ci0gIHJldHVybiBtLT5kaXN0YW5jZV9bY29kZV0gKyBleHRyYV9iaXRzX2NvdW50OwotfQotCi1zdGF0aWMgaW50IEJhY2t3YXJkUmVmZXJlbmNlc0hhc2hDaGFpbkRpc3RhbmNlT25seSgKLSAgICBpbnQgeHNpemUsIGludCB5c2l6ZSwgaW50IHJlY3Vyc2l2ZV9jb3N0X21vZGVsLCBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwKLSAgICBpbnQgcXVhbGl0eSwgaW50IGNhY2hlX2JpdHMsIHVpbnQzMl90KiBjb25zdCBkaXN0X2FycmF5KSB7Ci0gIGludCBpOwotICBpbnQgb2sgPSAwOwotICBpbnQgY2NfaW5pdCA9IDA7Ci0gIGNvbnN0IGludCBwaXhfY291bnQgPSB4c2l6ZSAqIHlzaXplOwotICBjb25zdCBpbnQgdXNlX2NvbG9yX2NhY2hlID0gKGNhY2hlX2JpdHMgPiAwKTsKLSAgZmxvYXQqIGNvbnN0IGNvc3QgPQotICAgICAgKGZsb2F0KilXZWJQU2FmZU1hbGxvYygodWludDY0X3QpcGl4X2NvdW50LCBzaXplb2YoKmNvc3QpKTsKLSAgQ29zdE1vZGVsKiBjb3N0X21vZGVsID0gKENvc3RNb2RlbCopU2JNZW1vcnlBbGxvY2F0ZShzaXplb2YoKmNvc3RfbW9kZWwpKTsKLSAgSGFzaENoYWluKiBoYXNoX2NoYWluID0gKEhhc2hDaGFpbiopU2JNZW1vcnlBbGxvY2F0ZShzaXplb2YoKmhhc2hfY2hhaW4pKTsKLSAgVlA4TENvbG9yQ2FjaGUgaGFzaGVyczsKLSAgY29uc3QgZG91YmxlIG11bDAgPSAocmVjdXJzaXZlX2Nvc3RfbW9kZWwgIT0gMCkgPyAxLjAgOiAwLjY4OwotICBjb25zdCBkb3VibGUgbXVsMSA9IChyZWN1cnNpdmVfY29zdF9tb2RlbCAhPSAwKSA/IDEuMCA6IDAuODI7Ci0gIGNvbnN0IGludCBtaW5fZGlzdGFuY2VfY29kZSA9IDI7ICAvLyBUT0RPKHZpa2FzYSk6IHR1bmUgYXMgZnVuY3Rpb24gb2YgcXVhbGl0eQotICBpbnQgd2luZG93X3NpemUgPSBXSU5ET1dfU0laRTsKLSAgaW50IGl0ZXJfcG9zID0gMTsKLSAgaW50IGl0ZXJfbGltaXQgPSAtMTsKLQotICBpZiAoY29zdCA9PSBOVUxMIHx8IGNvc3RfbW9kZWwgPT0gTlVMTCB8fCBoYXNoX2NoYWluID09IE5VTEwpIGdvdG8gRXJyb3I7Ci0KLSAgaWYgKCFIYXNoQ2hhaW5Jbml0KGhhc2hfY2hhaW4sIHBpeF9jb3VudCkpIGdvdG8gRXJyb3I7Ci0KLSAgaWYgKHVzZV9jb2xvcl9jYWNoZSkgewotICAgIGNjX2luaXQgPSBWUDhMQ29sb3JDYWNoZUluaXQoJmhhc2hlcnMsIGNhY2hlX2JpdHMpOwotICAgIGlmICghY2NfaW5pdCkgZ290byBFcnJvcjsKLSAgfQotCi0gIGlmICghQ29zdE1vZGVsQnVpbGQoY29zdF9tb2RlbCwgeHNpemUsIHlzaXplLCByZWN1cnNpdmVfY29zdF9tb2RlbCwgYXJnYiwKLSAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5LCBjYWNoZV9iaXRzKSkgewotICAgIGdvdG8gRXJyb3I7Ci0gIH0KLQotICBmb3IgKGkgPSAwOyBpIDwgcGl4X2NvdW50OyArK2kpIGNvc3RbaV0gPSAxZTM4ZjsKLQotICAvLyBXZSBsb29wIG9uZSBwaXhlbCBhdCBhIHRpbWUsIGJ1dCBzdG9yZSBhbGwgY3VycmVudGx5IGJlc3QgcG9pbnRzIHRvCi0gIC8vIG5vbi1wcm9jZXNzZWQgbG9jYXRpb25zIGZyb20gdGhpcyBwb2ludC4KLSAgZGlzdF9hcnJheVswXSA9IDA7Ci0gIEdldFBhcmFtc0Zvckhhc2hDaGFpbkZpbmRDb3B5KHF1YWxpdHksIHhzaXplLCBjYWNoZV9iaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2luZG93X3NpemUsICZpdGVyX3BvcywgJml0ZXJfbGltaXQpOwotICBmb3IgKGkgPSAwOyBpIDwgcGl4X2NvdW50OyArK2kpIHsKLSAgICBkb3VibGUgcHJldl9jb3N0ID0gMC4wOwotICAgIGludCBzaG9ydG1heDsKLSAgICBpZiAoaSA+IDApIHsKLSAgICAgIHByZXZfY29zdCA9IGNvc3RbaSAtIDFdOwotICAgIH0KLSAgICBmb3IgKHNob3J0bWF4ID0gMDsgc2hvcnRtYXggPCAyOyArK3Nob3J0bWF4KSB7Ci0gICAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgICAgIGludCBsZW4gPSAwOwotICAgICAgaWYgKGkgPCBwaXhfY291bnQgLSAxKSB7ICAvLyBGaW5kQ29weSByZWFkcyBwaXhlbHMgYXQgW2ldIGFuZCBbaSArIDFdLgotICAgICAgICBpbnQgbWF4bGVuID0gc2hvcnRtYXggPyAyIDogTUFYX0xFTkdUSDsKLSAgICAgICAgaWYgKG1heGxlbiA+IHBpeF9jb3VudCAtIGkpIHsKLSAgICAgICAgICBtYXhsZW4gPSBwaXhfY291bnQgLSBpOwotICAgICAgICB9Ci0gICAgICAgIEhhc2hDaGFpbkZpbmRDb3B5KGhhc2hfY2hhaW4sIGksIHhzaXplLCBhcmdiLCBtYXhsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvd19zaXplLCBpdGVyX3BvcywgaXRlcl9saW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwgJmxlbik7Ci0gICAgICB9Ci0gICAgICBpZiAobGVuID49IE1JTl9MRU5HVEgpIHsKLSAgICAgICAgY29uc3QgaW50IGNvZGUgPSBEaXN0YW5jZVRvUGxhbmVDb2RlKHhzaXplLCBvZmZzZXQpOwotICAgICAgICBjb25zdCBkb3VibGUgZGlzdGFuY2VfY29zdCA9Ci0gICAgICAgICAgICBwcmV2X2Nvc3QgKyBHZXREaXN0YW5jZUNvc3QoY29zdF9tb2RlbCwgY29kZSk7Ci0gICAgICAgIGludCBrOwotICAgICAgICBmb3IgKGsgPSAxOyBrIDwgbGVuOyArK2spIHsKLSAgICAgICAgICBjb25zdCBkb3VibGUgY29zdF92YWwgPSBkaXN0YW5jZV9jb3N0ICsgR2V0TGVuZ3RoQ29zdChjb3N0X21vZGVsLCBrKTsKLSAgICAgICAgICBpZiAoY29zdFtpICsga10gPiBjb3N0X3ZhbCkgewotICAgICAgICAgICAgY29zdFtpICsga10gPSAoZmxvYXQpY29zdF92YWw7Ci0gICAgICAgICAgICBkaXN0X2FycmF5W2kgKyBrXSA9IGsgKyAxOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBUaGlzIGlmIGlzIGZvciBzcGVlZHVwIG9ubHkuIEl0IHJvdWdobHkgZG91YmxlcyB0aGUgc3BlZWQsIGFuZAotICAgICAgICAvLyBtYWtlcyBjb21wcmVzc2lvbiB3b3JzZSBieSAuMSAlLgotICAgICAgICBpZiAobGVuID49IDEyOCAmJiBjb2RlIDw9IG1pbl9kaXN0YW5jZV9jb2RlKSB7Ci0gICAgICAgICAgLy8gTG9uZyBjb3B5IGZvciBzaG9ydCBkaXN0YW5jZXMsIGxldCdzIHNraXAgdGhlIG1pZGRsZQotICAgICAgICAgIC8vIGxvb2t1cHMgZm9yIGJldHRlciBjb3BpZXMuCi0gICAgICAgICAgLy8gMSkgaW5zZXJ0IHRoZSBoYXNoZXMuCi0gICAgICAgICAgaWYgKHVzZV9jb2xvcl9jYWNoZSkgewotICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IGxlbjsgKytrKSB7Ci0gICAgICAgICAgICAgIFZQOExDb2xvckNhY2hlSW5zZXJ0KCZoYXNoZXJzLCBhcmdiW2kgKyBrXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIDIpIEFkZCB0byB0aGUgaGFzaF9jaGFpbiAoYnV0IGNhbm5vdCBhZGQgdGhlIGxhc3QgcGl4ZWwpCi0gICAgICAgICAgewotICAgICAgICAgICAgY29uc3QgaW50IGxhc3QgPSAobGVuICsgaSA8IHBpeF9jb3VudCAtIDEpID8gbGVuICsgaQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcGl4X2NvdW50IC0gMTsKLSAgICAgICAgICAgIGZvciAoayA9IGk7IGsgPCBsYXN0OyArK2spIHsKLSAgICAgICAgICAgICAgSGFzaENoYWluSW5zZXJ0KGhhc2hfY2hhaW4sICZhcmdiW2tdLCBrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gMykganVtcC4KLSAgICAgICAgICBpICs9IGxlbiAtIDE7ICAvLyBmb3IgbG9vcCBkb2VzICsraSwgdGh1cyAtMSBoZXJlLgotICAgICAgICAgIGdvdG8gbmV4dF9zeW1ib2w7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGkgPCBwaXhfY291bnQgLSAxKSB7Ci0gICAgICBIYXNoQ2hhaW5JbnNlcnQoaGFzaF9jaGFpbiwgJmFyZ2JbaV0sIGkpOwotICAgIH0KLSAgICB7Ci0gICAgICAvLyBpbnNlcnRpbmcgYSBsaXRlcmFsIHBpeGVsCi0gICAgICBkb3VibGUgY29zdF92YWwgPSBwcmV2X2Nvc3Q7Ci0gICAgICBpZiAodXNlX2NvbG9yX2NhY2hlICYmIFZQOExDb2xvckNhY2hlQ29udGFpbnMoJmhhc2hlcnMsIGFyZ2JbaV0pKSB7Ci0gICAgICAgIGNvbnN0IGludCBpeCA9IFZQOExDb2xvckNhY2hlR2V0SW5kZXgoJmhhc2hlcnMsIGFyZ2JbaV0pOwotICAgICAgICBjb3N0X3ZhbCArPSBHZXRDYWNoZUNvc3QoY29zdF9tb2RlbCwgaXgpICogbXVsMDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvc3RfdmFsICs9IEdldExpdGVyYWxDb3N0KGNvc3RfbW9kZWwsIGFyZ2JbaV0pICogbXVsMTsKLSAgICAgIH0KLSAgICAgIGlmIChjb3N0W2ldID4gY29zdF92YWwpIHsKLSAgICAgICAgY29zdFtpXSA9IChmbG9hdCljb3N0X3ZhbDsKLSAgICAgICAgZGlzdF9hcnJheVtpXSA9IDE7ICAvLyBvbmx5IG9uZSBpcyBpbnNlcnRlZC4KLSAgICAgIH0KLSAgICAgIGlmICh1c2VfY29sb3JfY2FjaGUpIFZQOExDb2xvckNhY2hlSW5zZXJ0KCZoYXNoZXJzLCBhcmdiW2ldKTsKLSAgICB9Ci0gbmV4dF9zeW1ib2w6IDsKLSAgfQotICAvLyBMYXN0IHBpeGVsIHN0aWxsIHRvIGRvLCBpdCBjYW4gb25seSBiZSBhIHNpbmdsZSBzdGVwIGlmIG5vdCByZWFjaGVkCi0gIC8vIHRocm91Z2ggY2hlYXBlciBtZWFucyBhbHJlYWR5LgotICBvayA9IDE7Ci1FcnJvcjoKLSAgaWYgKGNjX2luaXQpIFZQOExDb2xvckNhY2hlQ2xlYXIoJmhhc2hlcnMpOwotICBIYXNoQ2hhaW5EZWxldGUoaGFzaF9jaGFpbik7Ci0gIFNiTWVtb3J5RGVhbGxvY2F0ZShjb3N0X21vZGVsKTsKLSAgU2JNZW1vcnlEZWFsbG9jYXRlKGNvc3QpOwotICByZXR1cm4gb2s7Ci19Ci0KLS8vIFdlIHBhY2sgdGhlIHBhdGggYXQgdGhlIGVuZCBvZiAqZGlzdF9hcnJheSBhbmQgcmV0dXJuCi0vLyBhIHBvaW50ZXIgdG8gdGhpcyBwYXJ0IG9mIHRoZSBhcnJheS4gRXhhbXBsZToKLS8vIGRpc3RfYXJyYXkgPSBbMXgyeHgzeDJdID0+IHBhY2tlZCBbMXgyeDEyMzJdLCBjaG9zZW5fcGF0aCA9IFsxMjMyXQotc3RhdGljIHZvaWQgVHJhY2VCYWNrd2FyZHModWludDMyX3QqIGNvbnN0IGRpc3RfYXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlzdF9hcnJheV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqKiBjb25zdCBjaG9zZW5fcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgY2hvc2VuX3BhdGhfc2l6ZSkgewotICB1aW50MzJfdCogcGF0aCA9IGRpc3RfYXJyYXkgKyBkaXN0X2FycmF5X3NpemU7Ci0gIHVpbnQzMl90KiBjdXIgPSBkaXN0X2FycmF5ICsgZGlzdF9hcnJheV9zaXplIC0gMTsKLSAgd2hpbGUgKGN1ciA+PSBkaXN0X2FycmF5KSB7Ci0gICAgY29uc3QgaW50IGsgPSAqY3VyOwotICAgIC0tcGF0aDsKLSAgICAqcGF0aCA9IGs7Ci0gICAgY3VyIC09IGs7Ci0gIH0KLSAgKmNob3Nlbl9wYXRoID0gcGF0aDsKLSAgKmNob3Nlbl9wYXRoX3NpemUgPSAoaW50KShkaXN0X2FycmF5ICsgZGlzdF9hcnJheV9zaXplIC0gcGF0aCk7Ci19Ci0KLXN0YXRpYyBpbnQgQmFja3dhcmRSZWZlcmVuY2VzSGFzaENoYWluRm9sbG93Q2hvc2VuUGF0aCgKLSAgICBpbnQgeHNpemUsIGludCB5c2l6ZSwgY29uc3QgdWludDMyX3QqIGNvbnN0IGFyZ2IsCi0gICAgaW50IHF1YWxpdHksIGludCBjYWNoZV9iaXRzLAotICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBjaG9zZW5fcGF0aCwgaW50IGNob3Nlbl9wYXRoX3NpemUsCi0gICAgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcykgewotICBjb25zdCBpbnQgcGl4X2NvdW50ID0geHNpemUgKiB5c2l6ZTsKLSAgY29uc3QgaW50IHVzZV9jb2xvcl9jYWNoZSA9IChjYWNoZV9iaXRzID4gMCk7Ci0gIGludCBzaXplID0gMDsKLSAgaW50IGkgPSAwOwotICBpbnQgazsKLSAgaW50IGl4OwotICBpbnQgb2sgPSAwOwotICBpbnQgY2NfaW5pdCA9IDA7Ci0gIGludCB3aW5kb3dfc2l6ZSA9IFdJTkRPV19TSVpFOwotICBpbnQgaXRlcl9wb3MgPSAxOwotICBpbnQgaXRlcl9saW1pdCA9IC0xOwotICBIYXNoQ2hhaW4qIGhhc2hfY2hhaW4gPSAoSGFzaENoYWluKilTYk1lbW9yeUFsbG9jYXRlKHNpemVvZigqaGFzaF9jaGFpbikpOwotICBWUDhMQ29sb3JDYWNoZSBoYXNoZXJzOwotCi0gIGlmIChoYXNoX2NoYWluID09IE5VTEwgfHwgIUhhc2hDaGFpbkluaXQoaGFzaF9jaGFpbiwgcGl4X2NvdW50KSkgewotICAgIGdvdG8gRXJyb3I7Ci0gIH0KLSAgaWYgKHVzZV9jb2xvcl9jYWNoZSkgewotICAgIGNjX2luaXQgPSBWUDhMQ29sb3JDYWNoZUluaXQoJmhhc2hlcnMsIGNhY2hlX2JpdHMpOwotICAgIGlmICghY2NfaW5pdCkgZ290byBFcnJvcjsKLSAgfQotCi0gIHJlZnMtPnNpemUgPSAwOwotICBHZXRQYXJhbXNGb3JIYXNoQ2hhaW5GaW5kQ29weShxdWFsaXR5LCB4c2l6ZSwgY2FjaGVfYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndpbmRvd19zaXplLCAmaXRlcl9wb3MsICZpdGVyX2xpbWl0KTsKLSAgZm9yIChpeCA9IDA7IGl4IDwgY2hvc2VuX3BhdGhfc2l6ZTsgKytpeCwgKytzaXplKSB7Ci0gICAgaW50IG9mZnNldCA9IDA7Ci0gICAgaW50IGxlbiA9IDA7Ci0gICAgaW50IG1heGxlbiA9IGNob3Nlbl9wYXRoW2l4XTsKLSAgICBpZiAobWF4bGVuICE9IDEpIHsKLSAgICAgIEhhc2hDaGFpbkZpbmRDb3B5KGhhc2hfY2hhaW4sIGksIHhzaXplLCBhcmdiLCBtYXhsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dfc2l6ZSwgaXRlcl9wb3MsIGl0ZXJfbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LCAmbGVuKTsKLSAgICAgIFNCX0RDSEVDSyhsZW4gPT0gbWF4bGVuKTsKLSAgICAgIHJlZnMtPnJlZnNbc2l6ZV0gPSBQaXhPckNvcHlDcmVhdGVDb3B5KG9mZnNldCwgbGVuKTsKLSAgICAgIGlmICh1c2VfY29sb3JfY2FjaGUpIHsKLSAgICAgICAgZm9yIChrID0gMDsgayA8IGxlbjsgKytrKSB7Ci0gICAgICAgICAgVlA4TENvbG9yQ2FjaGVJbnNlcnQoJmhhc2hlcnMsIGFyZ2JbaSArIGtdKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgewotICAgICAgICBjb25zdCBpbnQgbGFzdCA9IChsZW4gPCBwaXhfY291bnQgLSAxIC0gaSkgPyBsZW4gOiBwaXhfY291bnQgLSAxIC0gaTsKLSAgICAgICAgZm9yIChrID0gMDsgayA8IGxhc3Q7ICsraykgewotICAgICAgICAgIEhhc2hDaGFpbkluc2VydChoYXNoX2NoYWluLCAmYXJnYltpICsga10sIGkgKyBrKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaSArPSBsZW47Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmICh1c2VfY29sb3JfY2FjaGUgJiYgVlA4TENvbG9yQ2FjaGVDb250YWlucygmaGFzaGVycywgYXJnYltpXSkpIHsKLSAgICAgICAgLy8gcHVzaCBwaXhlbCBhcyBhIGNvbG9yIGNhY2hlIGluZGV4Ci0gICAgICAgIGNvbnN0IGludCBpZHggPSBWUDhMQ29sb3JDYWNoZUdldEluZGV4KCZoYXNoZXJzLCBhcmdiW2ldKTsKLSAgICAgICAgcmVmcy0+cmVmc1tzaXplXSA9IFBpeE9yQ29weUNyZWF0ZUNhY2hlSWR4KGlkeCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZWZzLT5yZWZzW3NpemVdID0gUGl4T3JDb3B5Q3JlYXRlTGl0ZXJhbChhcmdiW2ldKTsKLSAgICAgIH0KLSAgICAgIGlmICh1c2VfY29sb3JfY2FjaGUpIFZQOExDb2xvckNhY2hlSW5zZXJ0KCZoYXNoZXJzLCBhcmdiW2ldKTsKLSAgICAgIGlmIChpICsgMSA8IHBpeF9jb3VudCkgewotICAgICAgICBIYXNoQ2hhaW5JbnNlcnQoaGFzaF9jaGFpbiwgJmFyZ2JbaV0sIGkpOwotICAgICAgfQotICAgICAgKytpOwotICAgIH0KLSAgfQotICBTQl9EQ0hFQ0soc2l6ZSA8PSByZWZzLT5tYXhfc2l6ZSk7Ci0gIHJlZnMtPnNpemUgPSBzaXplOwotICBvayA9IDE7Ci1FcnJvcjoKLSAgaWYgKGNjX2luaXQpIFZQOExDb2xvckNhY2hlQ2xlYXIoJmhhc2hlcnMpOwotICBIYXNoQ2hhaW5EZWxldGUoaGFzaF9jaGFpbik7Ci0gIHJldHVybiBvazsKLX0KLQotLy8gUmV0dXJucyAxIG9uIHN1Y2Nlc3MuCi1zdGF0aWMgaW50IEJhY2t3YXJkUmVmZXJlbmNlc1RyYWNlQmFja3dhcmRzKGludCB4c2l6ZSwgaW50IHlzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVjdXJzaXZlX2Nvc3RfbW9kZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcXVhbGl0eSwgaW50IGNhY2hlX2JpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMpIHsKLSAgaW50IG9rID0gMDsKLSAgY29uc3QgaW50IGRpc3RfYXJyYXlfc2l6ZSA9IHhzaXplICogeXNpemU7Ci0gIHVpbnQzMl90KiBjaG9zZW5fcGF0aCA9IE5VTEw7Ci0gIGludCBjaG9zZW5fcGF0aF9zaXplID0gMDsKLSAgdWludDMyX3QqIGRpc3RfYXJyYXkgPQotICAgICAgKHVpbnQzMl90KilXZWJQU2FmZU1hbGxvYygodWludDY0X3QpZGlzdF9hcnJheV9zaXplLCBzaXplb2YoKmRpc3RfYXJyYXkpKTsKLQotICBpZiAoZGlzdF9hcnJheSA9PSBOVUxMKSBnb3RvIEVycm9yOwotCi0gIGlmICghQmFja3dhcmRSZWZlcmVuY2VzSGFzaENoYWluRGlzdGFuY2VPbmx5KAotICAgICAgeHNpemUsIHlzaXplLCByZWN1cnNpdmVfY29zdF9tb2RlbCwgYXJnYiwgcXVhbGl0eSwgY2FjaGVfYml0cywKLSAgICAgIGRpc3RfYXJyYXkpKSB7Ci0gICAgZ290byBFcnJvcjsKLSAgfQotICBUcmFjZUJhY2t3YXJkcyhkaXN0X2FycmF5LCBkaXN0X2FycmF5X3NpemUsICZjaG9zZW5fcGF0aCwgJmNob3Nlbl9wYXRoX3NpemUpOwotICBpZiAoIUJhY2t3YXJkUmVmZXJlbmNlc0hhc2hDaGFpbkZvbGxvd0Nob3NlblBhdGgoCi0gICAgICB4c2l6ZSwgeXNpemUsIGFyZ2IsIHF1YWxpdHksIGNhY2hlX2JpdHMsIGNob3Nlbl9wYXRoLCBjaG9zZW5fcGF0aF9zaXplLAotICAgICAgcmVmcykpIHsKLSAgICBnb3RvIEVycm9yOwotICB9Ci0gIG9rID0gMTsKLSBFcnJvcjoKLSAgU2JNZW1vcnlEZWFsbG9jYXRlKGRpc3RfYXJyYXkpOwotICByZXR1cm4gb2s7Ci19Ci0KLXN0YXRpYyB2b2lkIEJhY2t3YXJkUmVmZXJlbmNlczJETG9jYWxpdHkoaW50IHhzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzKSB7Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgcmVmcy0+c2l6ZTsgKytpKSB7Ci0gICAgaWYgKFBpeE9yQ29weUlzQ29weSgmcmVmcy0+cmVmc1tpXSkpIHsKLSAgICAgIGNvbnN0IGludCBkaXN0ID0gcmVmcy0+cmVmc1tpXS5hcmdiX29yX2Rpc3RhbmNlOwotICAgICAgY29uc3QgaW50IHRyYW5zZm9ybWVkX2Rpc3QgPSBEaXN0YW5jZVRvUGxhbmVDb2RlKHhzaXplLCBkaXN0KTsKLSAgICAgIHJlZnMtPnJlZnNbaV0uYXJnYl9vcl9kaXN0YW5jZSA9IHRyYW5zZm9ybWVkX2Rpc3Q7Ci0gICAgfQotICB9Ci19Ci0KLWludCBWUDhMR2V0QmFja3dhcmRSZWZlcmVuY2VzKGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHF1YWxpdHksIGludCBjYWNoZV9iaXRzLCBpbnQgdXNlXzJkX2xvY2FsaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgYmVzdCkgewotICBpbnQgb2sgPSAwOwotICBpbnQgbHo3N19pc191c2VmdWw7Ci0gIFZQOExCYWNrd2FyZFJlZnMgcmVmc19ybGUsIHJlZnNfbHo3NzsKLSAgY29uc3QgaW50IG51bV9waXggPSB3aWR0aCAqIGhlaWdodDsKLQotICBWUDhMQmFja3dhcmRSZWZzQWxsb2MoJnJlZnNfcmxlLCBudW1fcGl4KTsKLSAgVlA4TEJhY2t3YXJkUmVmc0FsbG9jKCZyZWZzX2x6NzcsIG51bV9waXgpOwotICBWUDhMSW5pdEJhY2t3YXJkUmVmcyhiZXN0KTsKLSAgaWYgKHJlZnNfcmxlLnJlZnMgPT0gTlVMTCB8fCByZWZzX2x6NzcucmVmcyA9PSBOVUxMKSB7Ci0gRXJyb3IxOgotICAgIFZQOExDbGVhckJhY2t3YXJkUmVmcygmcmVmc19ybGUpOwotICAgIFZQOExDbGVhckJhY2t3YXJkUmVmcygmcmVmc19sejc3KTsKLSAgICBnb3RvIEVuZDsKLSAgfQotCi0gIGlmICghQmFja3dhcmRSZWZlcmVuY2VzSGFzaENoYWluKHdpZHRoLCBoZWlnaHQsIGFyZ2IsIGNhY2hlX2JpdHMsIHF1YWxpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZzX2x6NzcpKSB7Ci0gICAgZ290byBFbmQ7Ci0gIH0KLSAgLy8gQmFja3dhcmQgUmVmZXJlbmNlIHVzaW5nIFJMRSBvbmx5LgotICBCYWNrd2FyZFJlZmVyZW5jZXNSbGUod2lkdGgsIGhlaWdodCwgYXJnYiwgJnJlZnNfcmxlKTsKLQotICB7Ci0gICAgZG91YmxlIGJpdF9jb3N0X2x6NzcsIGJpdF9jb3N0X3JsZTsKLSAgICBWUDhMSGlzdG9ncmFtKiBjb25zdCBoaXN0byA9IChWUDhMSGlzdG9ncmFtKilTYk1lbW9yeUFsbG9jYXRlKHNpemVvZigqaGlzdG8pKTsKLSAgICBpZiAoaGlzdG8gPT0gTlVMTCkgZ290byBFcnJvcjE7Ci0gICAgLy8gRXZhbHVhdGUgbHo3NyBjb2RpbmcKLSAgICBWUDhMSGlzdG9ncmFtQ3JlYXRlKGhpc3RvLCAmcmVmc19sejc3LCBjYWNoZV9iaXRzKTsKLSAgICBiaXRfY29zdF9sejc3ID0gVlA4TEhpc3RvZ3JhbUVzdGltYXRlQml0cyhoaXN0byk7Ci0gICAgLy8gRXZhbHVhdGUgUkxFIGNvZGluZwotICAgIFZQOExIaXN0b2dyYW1DcmVhdGUoaGlzdG8sICZyZWZzX3JsZSwgY2FjaGVfYml0cyk7Ci0gICAgYml0X2Nvc3RfcmxlID0gVlA4TEhpc3RvZ3JhbUVzdGltYXRlQml0cyhoaXN0byk7Ci0gICAgLy8gRGVjaWRlIGlmIExaNzcgaXMgdXNlZnVsLgotICAgIGx6NzdfaXNfdXNlZnVsID0gKGJpdF9jb3N0X2x6NzcgPCBiaXRfY29zdF9ybGUpOwotICAgIFNiTWVtb3J5RGVhbGxvY2F0ZShoaXN0byk7Ci0gIH0KLQotICAvLyBDaG9vc2UgYXBwcm9wcmlhdGUgYmFja3dhcmQgcmVmZXJlbmNlLgotICBpZiAobHo3N19pc191c2VmdWwpIHsKLSAgICAvLyBUcmFjZUJhY2t3YXJkcyBpcyBjb3N0bHkuIERvbid0IGV4ZWN1dGUgaXQgYXQgbG93ZXIgcXVhbGl0eSAocSA8PSAxMCkuCi0gICAgY29uc3QgaW50IHRyeV9sejc3X3RyYWNlX2JhY2t3YXJkcyA9IChxdWFsaXR5ID4gMTApOwotICAgICpiZXN0ID0gcmVmc19sejc3OyAgIC8vIGRlZmF1bHQgZ3Vlc3M6IGx6NzcgaXMgYmV0dGVyCi0gICAgVlA4TENsZWFyQmFja3dhcmRSZWZzKCZyZWZzX3JsZSk7Ci0gICAgaWYgKHRyeV9sejc3X3RyYWNlX2JhY2t3YXJkcykgewotICAgICAgLy8gU2V0IHJlY3Vyc2lvbiBsZXZlbCBmb3IgbGFyZ2UgaW1hZ2VzIHVzaW5nIGEgY29sb3IgY2FjaGUuCi0gICAgICBjb25zdCBpbnQgcmVjdXJzaW9uX2xldmVsID0KLSAgICAgICAgICAobnVtX3BpeCA8IDMyMCAqIDIwMCkgJiYgKGNhY2hlX2JpdHMgPiAwKSA/IDEgOiAwOwotICAgICAgVlA4TEJhY2t3YXJkUmVmcyByZWZzX3RyYWNlOwotICAgICAgaWYgKCFWUDhMQmFja3dhcmRSZWZzQWxsb2MoJnJlZnNfdHJhY2UsIG51bV9waXgpKSB7Ci0gICAgICAgIGdvdG8gRW5kOwotICAgICAgfQotICAgICAgaWYgKEJhY2t3YXJkUmVmZXJlbmNlc1RyYWNlQmFja3dhcmRzKHdpZHRoLCBoZWlnaHQsIHJlY3Vyc2lvbl9sZXZlbCwgYXJnYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5LCBjYWNoZV9iaXRzLCAmcmVmc190cmFjZSkpIHsKLSAgICAgICAgVlA4TENsZWFyQmFja3dhcmRSZWZzKCZyZWZzX2x6NzcpOwotICAgICAgICAqYmVzdCA9IHJlZnNfdHJhY2U7Ci0gICAgICB9Ci0gICAgfQotICB9IGVsc2UgewotICAgIFZQOExDbGVhckJhY2t3YXJkUmVmcygmcmVmc19sejc3KTsKLSAgICAqYmVzdCA9IHJlZnNfcmxlOwotICB9Ci0KLSAgaWYgKHVzZV8yZF9sb2NhbGl0eSkgQmFja3dhcmRSZWZlcmVuY2VzMkRMb2NhbGl0eSh3aWR0aCwgYmVzdCk7Ci0KLSAgb2sgPSAxOwotCi0gRW5kOgotICBpZiAoIW9rKSB7Ci0gICAgVlA4TENsZWFyQmFja3dhcmRSZWZzKGJlc3QpOwotICB9Ci0gIHJldHVybiBvazsKLX0KLQotLy8gUmV0dXJucyAxIG9uIHN1Y2Nlc3MuCi1zdGF0aWMgaW50IENvbXB1dGVDYWNoZUhpc3RvZ3JhbShjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4c2l6ZSwgaW50IHlzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYWNoZV9iaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEhpc3RvZ3JhbSogY29uc3QgaGlzdG8pIHsKLSAgaW50IHBpeGVsX2luZGV4ID0gMDsKLSAgaW50IGk7Ci0gIHVpbnQzMl90IGs7Ci0gIFZQOExDb2xvckNhY2hlIGhhc2hlcnM7Ci0gIGNvbnN0IGludCB1c2VfY29sb3JfY2FjaGUgPSAoY2FjaGVfYml0cyA+IDApOwotICBpbnQgY2NfaW5pdCA9IDA7Ci0KLSAgaWYgKHVzZV9jb2xvcl9jYWNoZSkgewotICAgIGNjX2luaXQgPSBWUDhMQ29sb3JDYWNoZUluaXQoJmhhc2hlcnMsIGNhY2hlX2JpdHMpOwotICAgIGlmICghY2NfaW5pdCkgcmV0dXJuIDA7Ci0gIH0KLQotICBmb3IgKGkgPSAwOyBpIDwgcmVmcy0+c2l6ZTsgKytpKSB7Ci0gICAgY29uc3QgUGl4T3JDb3B5KiBjb25zdCB2ID0gJnJlZnMtPnJlZnNbaV07Ci0gICAgaWYgKFBpeE9yQ29weUlzTGl0ZXJhbCh2KSkgewotICAgICAgaWYgKHVzZV9jb2xvcl9jYWNoZSAmJgotICAgICAgICAgIFZQOExDb2xvckNhY2hlQ29udGFpbnMoJmhhc2hlcnMsIGFyZ2JbcGl4ZWxfaW5kZXhdKSkgewotICAgICAgICAvLyBwdXNoIHBpeGVsIGFzIGEgY2FjaGUgaW5kZXgKLSAgICAgICAgY29uc3QgaW50IGl4ID0gVlA4TENvbG9yQ2FjaGVHZXRJbmRleCgmaGFzaGVycywgYXJnYltwaXhlbF9pbmRleF0pOwotICAgICAgICBjb25zdCBQaXhPckNvcHkgdG9rZW4gPSBQaXhPckNvcHlDcmVhdGVDYWNoZUlkeChpeCk7Ci0gICAgICAgIFZQOExIaXN0b2dyYW1BZGRTaW5nbGVQaXhPckNvcHkoaGlzdG8sICZ0b2tlbik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBWUDhMSGlzdG9ncmFtQWRkU2luZ2xlUGl4T3JDb3B5KGhpc3RvLCB2KTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgVlA4TEhpc3RvZ3JhbUFkZFNpbmdsZVBpeE9yQ29weShoaXN0bywgdik7Ci0gICAgfQotICAgIGlmICh1c2VfY29sb3JfY2FjaGUpIHsKLSAgICAgIGZvciAoayA9IDA7IGsgPCBQaXhPckNvcHlMZW5ndGgodik7ICsraykgewotICAgICAgICBWUDhMQ29sb3JDYWNoZUluc2VydCgmaGFzaGVycywgYXJnYltwaXhlbF9pbmRleCArIGtdKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcGl4ZWxfaW5kZXggKz0gUGl4T3JDb3B5TGVuZ3RoKHYpOwotICB9Ci0gIFNCX0RDSEVDSyhwaXhlbF9pbmRleCA9PSB4c2l6ZSAqIHlzaXplKTsKLSAgKHZvaWQpeHNpemU7ICAvLyB4c2l6ZSBpcyBub3QgdXNlZCBpbiBub24tZGVidWcgY29tcGlsYXRpb25zIG90aGVyd2lzZS4KLSAgKHZvaWQpeXNpemU7ICAvLyB5c2l6ZSBpcyBub3QgdXNlZCBpbiBub24tZGVidWcgY29tcGlsYXRpb25zIG90aGVyd2lzZS4KLSAgaWYgKGNjX2luaXQpIFZQOExDb2xvckNhY2hlQ2xlYXIoJmhhc2hlcnMpOwotICByZXR1cm4gMTsKLX0KLQotLy8gUmV0dXJucyBob3cgbWFueSBiaXRzIGFyZSB0byBiZSB1c2VkIGZvciBhIGNvbG9yIGNhY2hlLgotaW50IFZQOExDYWxjdWxhdGVFc3RpbWF0ZUZvckNhY2hlU2l6ZShjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhzaXplLCBpbnQgeXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgYmVzdF9jYWNoZV9iaXRzKSB7Ci0gIGludCBvayA9IDA7Ci0gIGludCBjYWNoZV9iaXRzOwotICBkb3VibGUgbG93ZXN0X2VudHJvcHkgPSAxZTk5OwotICBWUDhMQmFja3dhcmRSZWZzIHJlZnM7Ci0gIHN0YXRpYyBjb25zdCBkb3VibGUga1NtYWxsUGVuYWx0eUZvckxhcmdlQ2FjaGUgPSA0LjA7Ci0gIHN0YXRpYyBjb25zdCBpbnQgcXVhbGl0eSA9IDMwOwotICBpZiAoIVZQOExCYWNrd2FyZFJlZnNBbGxvYygmcmVmcywgeHNpemUgKiB5c2l6ZSkgfHwKLSAgICAgICFCYWNrd2FyZFJlZmVyZW5jZXNIYXNoQ2hhaW4oeHNpemUsIHlzaXplLCBhcmdiLCAwLCBxdWFsaXR5LCAmcmVmcykpIHsKLSAgICBnb3RvIEVycm9yOwotICB9Ci0gIGZvciAoY2FjaGVfYml0cyA9IDA7IGNhY2hlX2JpdHMgPD0gTUFYX0NPTE9SX0NBQ0hFX0JJVFM7ICsrY2FjaGVfYml0cykgewotICAgIGRvdWJsZSBjdXJfZW50cm9weTsKLSAgICBWUDhMSGlzdG9ncmFtIGhpc3RvOwotICAgIFZQOExIaXN0b2dyYW1Jbml0KCZoaXN0bywgY2FjaGVfYml0cyk7Ci0gICAgQ29tcHV0ZUNhY2hlSGlzdG9ncmFtKGFyZ2IsIHhzaXplLCB5c2l6ZSwgJnJlZnMsIGNhY2hlX2JpdHMsICZoaXN0byk7Ci0gICAgY3VyX2VudHJvcHkgPSBWUDhMSGlzdG9ncmFtRXN0aW1hdGVCaXRzKCZoaXN0bykgKwotICAgICAgICBrU21hbGxQZW5hbHR5Rm9yTGFyZ2VDYWNoZSAqIGNhY2hlX2JpdHM7Ci0gICAgaWYgKGNhY2hlX2JpdHMgPT0gMCB8fCBjdXJfZW50cm9weSA8IGxvd2VzdF9lbnRyb3B5KSB7Ci0gICAgICAqYmVzdF9jYWNoZV9iaXRzID0gY2FjaGVfYml0czsKLSAgICAgIGxvd2VzdF9lbnRyb3B5ID0gY3VyX2VudHJvcHk7Ci0gICAgfQotICB9Ci0gIG9rID0gMTsKLSBFcnJvcjoKLSAgVlA4TENsZWFyQmFja3dhcmRSZWZzKCZyZWZzKTsKLSAgcmV0dXJuIG9rOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL2JhY2t3YXJkX3JlZmVyZW5jZXMuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy9iYWNrd2FyZF9yZWZlcmVuY2VzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMzQ0MWMuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL2JhY2t3YXJkX3JlZmVyZW5jZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gQXV0aG9yOiBKeXJraSBBbGFrdWlqYWxhIChqeXJraUBnb29nbGUuY29tKQotLy8KLQotI2lmbmRlZiBXRUJQX0VOQ19CQUNLV0FSRF9SRUZFUkVOQ0VTX0hfCi0jZGVmaW5lIFdFQlBfRU5DX0JBQ0tXQVJEX1JFRkVSRU5DRVNfSF8KLQotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNlbHNlCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpbmNsdWRlICIuLi93ZWJwL3R5cGVzLmgiCi0jaW5jbHVkZSAiLi4vd2VicC9mb3JtYXRfY29uc3RhbnRzLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vLyBUaGUgc3BlYyBhbGxvd3MgMTEsIHdlIHVzZSA5IGJpdHMgdG8gcmVkdWNlIG1lbW9yeSBjb25zdW1wdGlvbiBpbiBlbmNvZGluZy4KLS8vIEhhdmluZyA5IGluc3RlYWQgb2YgMTEgb25seSByZW1vdmVzIGFib3V0IDAuMjUgJSBvZiBjb21wcmVzc2lvbiBkZW5zaXR5LgotI2RlZmluZSBNQVhfQ09MT1JfQ0FDSEVfQklUUyA5Ci0KLS8vIE1heCBldmVyIG51bWJlciBvZiBjb2RlcyB3ZSdsbCB1c2U6Ci0jZGVmaW5lIFBJWF9PUl9DT1BZX0NPREVTX01BWCBcCi0gICAgKE5VTV9MSVRFUkFMX0NPREVTICsgTlVNX0xFTkdUSF9DT0RFUyArICgxIDw8IE1BWF9DT0xPUl9DQUNIRV9CSVRTKSkKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFByZWZpeEVuY29kZSgpCi0KLS8vIHVzZSBHTlUgYnVpbHRpbnMgd2hlcmUgYXZhaWxhYmxlLgotI2lmIGRlZmluZWQoX19HTlVDX18pICYmIFwKLSAgICAoKF9fR05VQ19fID09IDMgJiYgX19HTlVDX01JTk9SX18gPj0gNCkgfHwgX19HTlVDX18gPj0gNCkKLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgQml0c0xvZzJGbG9vcih1aW50MzJfdCBuKSB7Ci0gIFNCX0RDSEVDSyhuICE9IDApOwotICByZXR1cm4gMzEgXiBfX2J1aWx0aW5fY2x6KG4pOwotfQotI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKGRlZmluZWQoX01fWDY0KSB8fCBkZWZpbmVkKF9NX0lYODYpKQotI2luY2x1ZGUgPGludHJpbi5oPgotI3ByYWdtYSBpbnRyaW5zaWMoX0JpdFNjYW5SZXZlcnNlKQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IEJpdHNMb2cyRmxvb3IodWludDMyX3QgbikgewotICB1bnNpZ25lZCBsb25nIGZpcnN0X3NldF9iaXQ7Ci0gIFNCX0RDSEVDSyhuICE9IDApOwotICBfQml0U2NhblJldmVyc2UoJmZpcnN0X3NldF9iaXQsIG4pOwotICByZXR1cm4gZmlyc3Rfc2V0X2JpdDsKLX0KLSNlbHNlCi0vLyBSZXR1cm5zIChpbnQpZmxvb3IobG9nMihuKSkuIG4gbXVzdCBiZSA+IDAuCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IEJpdHNMb2cyRmxvb3IodWludDMyX3QgbikgewotICBpbnQgbG9nID0gMDsKLSAgdWludDMyX3QgdmFsdWUgPSBuOwotICBpbnQgaTsKLQotICBTQl9EQ0hFQ0sobiAhPSAwKTsKLSAgZm9yIChpID0gNDsgaSA+PSAwOyAtLWkpIHsKLSAgICBjb25zdCBpbnQgc2hpZnQgPSAoMSA8PCBpKTsKLSAgICBjb25zdCB1aW50MzJfdCB4ID0gdmFsdWUgPj4gc2hpZnQ7Ci0gICAgaWYgKHggIT0gMCkgewotICAgICAgdmFsdWUgPSB4OwotICAgICAgbG9nICs9IHNoaWZ0OwotICAgIH0KLSAgfQotICByZXR1cm4gbG9nOwotfQotI2VuZGlmCi0KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4TEJpdHNMb2cyQ2VpbGluZyh1aW50MzJfdCBuKSB7Ci0gIGNvbnN0IGludCBsb2dfZmxvb3IgPSBCaXRzTG9nMkZsb29yKG4pOwotICBpZiAobiA9PSAobiAmIH4obiAtIDEpKSkgIC8vIHplcm8gb3IgYSBwb3dlciBvZiB0d28uCi0gICAgcmV0dXJuIGxvZ19mbG9vcjsKLSAgZWxzZQotICAgIHJldHVybiBsb2dfZmxvb3IgKyAxOwotfQotCi0vLyBTcGxpdHRpbmcgb2YgZGlzdGFuY2UgYW5kIGxlbmd0aCBjb2RlcyBpbnRvIHByZWZpeGVzIGFuZAotLy8gZXh0cmEgYml0cy4gVGhlIHByZWZpeGVzIGFyZSBlbmNvZGVkIHdpdGggYW4gZW50cm9weSBjb2RlCi0vLyB3aGlsZSB0aGUgZXh0cmEgYml0cyBhcmUgc3RvcmVkIGp1c3QgYXMgbm9ybWFsIGJpdHMuCi1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBQcmVmaXhFbmNvZGUoaW50IGRpc3RhbmNlLCBpbnQqIGNvbnN0IGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBleHRyYV9iaXRzX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgZXh0cmFfYml0c192YWx1ZSkgewotICBpZiAoZGlzdGFuY2UgPiAyKSB7ICAvLyBDb2xsZWN0IHRoZSB0d28gbW9zdCBzaWduaWZpY2FudCBiaXRzLgotICAgIGNvbnN0IGludCBoaWdoZXN0X2JpdCA9IEJpdHNMb2cyRmxvb3IoLS1kaXN0YW5jZSk7Ci0gICAgY29uc3QgaW50IHNlY29uZF9oaWdoZXN0X2JpdCA9IChkaXN0YW5jZSA+PiAoaGlnaGVzdF9iaXQgLSAxKSkgJiAxOwotICAgICpleHRyYV9iaXRzX2NvdW50ID0gaGlnaGVzdF9iaXQgLSAxOwotICAgICpleHRyYV9iaXRzX3ZhbHVlID0gZGlzdGFuY2UgJiAoKDEgPDwgKmV4dHJhX2JpdHNfY291bnQpIC0gMSk7Ci0gICAgKmNvZGUgPSAyICogaGlnaGVzdF9iaXQgKyBzZWNvbmRfaGlnaGVzdF9iaXQ7Ci0gIH0gZWxzZSB7Ci0gICAgKmV4dHJhX2JpdHNfY291bnQgPSAwOwotICAgICpleHRyYV9iaXRzX3ZhbHVlID0gMDsKLSAgICAqY29kZSA9IChkaXN0YW5jZSA9PSAyKSA/IDEgOiAwOwotICB9Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBQaXhPckNvcHkKLQotZW51bSBNb2RlIHsKLSAga0xpdGVyYWwsCi0gIGtDYWNoZUlkeCwKLSAga0NvcHksCi0gIGtOb25lCi19OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIC8vIG1vZGUgYXMgdWludDhfdCB0byBtYWtlIHRoZSBtZW1vcnkgbGF5b3V0IHRvIGJlIGV4YWN0bHkgOCBieXRlcy4KLSAgdWludDhfdCBtb2RlOwotICB1aW50MTZfdCBsZW47Ci0gIHVpbnQzMl90IGFyZ2Jfb3JfZGlzdGFuY2U7Ci19IFBpeE9yQ29weTsKLQotc3RhdGljIFdFQlBfSU5MSU5FIFBpeE9yQ29weSBQaXhPckNvcHlDcmVhdGVDb3B5KHVpbnQzMl90IGRpc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxlbikgewotICBQaXhPckNvcHkgcmV0dmFsOwotICByZXR2YWwubW9kZSA9IGtDb3B5OwotICByZXR2YWwuYXJnYl9vcl9kaXN0YW5jZSA9IGRpc3RhbmNlOwotICByZXR2YWwubGVuID0gbGVuOwotICByZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgUGl4T3JDb3B5IFBpeE9yQ29weUNyZWF0ZUNhY2hlSWR4KGludCBpZHgpIHsKLSAgUGl4T3JDb3B5IHJldHZhbDsKLSAgU0JfRENIRUNLKGlkeCA+PSAwKTsKLSAgU0JfRENIRUNLKGlkeCA8ICgxIDw8IE1BWF9DT0xPUl9DQUNIRV9CSVRTKSk7Ci0gIHJldHZhbC5tb2RlID0ga0NhY2hlSWR4OwotICByZXR2YWwuYXJnYl9vcl9kaXN0YW5jZSA9IGlkeDsKLSAgcmV0dmFsLmxlbiA9IDE7Ci0gIHJldHVybiByZXR2YWw7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSBQaXhPckNvcHkgUGl4T3JDb3B5Q3JlYXRlTGl0ZXJhbCh1aW50MzJfdCBhcmdiKSB7Ci0gIFBpeE9yQ29weSByZXR2YWw7Ci0gIHJldHZhbC5tb2RlID0ga0xpdGVyYWw7Ci0gIHJldHZhbC5hcmdiX29yX2Rpc3RhbmNlID0gYXJnYjsKLSAgcmV0dmFsLmxlbiA9IDE7Ci0gIHJldHVybiByZXR2YWw7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgUGl4T3JDb3B5SXNMaXRlcmFsKGNvbnN0IFBpeE9yQ29weSogY29uc3QgcCkgewotICByZXR1cm4gKHAtPm1vZGUgPT0ga0xpdGVyYWwpOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IFBpeE9yQ29weUlzQ2FjaGVJZHgoY29uc3QgUGl4T3JDb3B5KiBjb25zdCBwKSB7Ci0gIHJldHVybiAocC0+bW9kZSA9PSBrQ2FjaGVJZHgpOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IFBpeE9yQ29weUlzQ29weShjb25zdCBQaXhPckNvcHkqIGNvbnN0IHApIHsKLSAgcmV0dXJuIChwLT5tb2RlID09IGtDb3B5KTsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IFBpeE9yQ29weUxpdGVyYWwoY29uc3QgUGl4T3JDb3B5KiBjb25zdCBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbXBvbmVudCkgewotICBTQl9EQ0hFQ0socC0+bW9kZSA9PSBrTGl0ZXJhbCk7Ci0gIHJldHVybiAocC0+YXJnYl9vcl9kaXN0YW5jZSA+PiAoY29tcG9uZW50ICogOCkpICYgMHhmZjsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IFBpeE9yQ29weUxlbmd0aChjb25zdCBQaXhPckNvcHkqIGNvbnN0IHApIHsKLSAgcmV0dXJuIHAtPmxlbjsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IFBpeE9yQ29weUFyZ2IoY29uc3QgUGl4T3JDb3B5KiBjb25zdCBwKSB7Ci0gIFNCX0RDSEVDSyhwLT5tb2RlID09IGtMaXRlcmFsKTsKLSAgcmV0dXJuIHAtPmFyZ2Jfb3JfZGlzdGFuY2U7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBQaXhPckNvcHlDYWNoZUlkeChjb25zdCBQaXhPckNvcHkqIGNvbnN0IHApIHsKLSAgU0JfRENIRUNLKHAtPm1vZGUgPT0ga0NhY2hlSWR4KTsKLSAgU0JfRENIRUNLKHAtPmFyZ2Jfb3JfZGlzdGFuY2UgPCAoMVUgPDwgTUFYX0NPTE9SX0NBQ0hFX0JJVFMpKTsKLSAgcmV0dXJuIHAtPmFyZ2Jfb3JfZGlzdGFuY2U7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBQaXhPckNvcHlEaXN0YW5jZShjb25zdCBQaXhPckNvcHkqIGNvbnN0IHApIHsKLSAgU0JfRENIRUNLKHAtPm1vZGUgPT0ga0NvcHkpOwotICByZXR1cm4gcC0+YXJnYl9vcl9kaXN0YW5jZTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFZQOExCYWNrd2FyZFJlZnMKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBQaXhPckNvcHkqIHJlZnM7Ci0gIGludCBzaXplOyAgICAgIC8vIGN1cnJlbnRseSB1c2VkCi0gIGludCBtYXhfc2l6ZTsgIC8vIG1heGltdW0gY2FwYWNpdHkKLX0gVlA4TEJhY2t3YXJkUmVmczsKLQotLy8gSW5pdGlhbGl6ZSB0aGUgb2JqZWN0LiBNdXN0IGJlIGNhbGxlZCBmaXJzdC4gJ3JlZnMnIGNhbiBiZSBOVUxMLgotdm9pZCBWUDhMSW5pdEJhY2t3YXJkUmVmcyhWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzKTsKLQotLy8gUmVsZWFzZSBtZW1vcnkgYW5kIHJlLWluaXRpYWxpemUgdGhlIG9iamVjdC4gJ3JlZnMnIGNhbiBiZSBOVUxMLgotdm9pZCBWUDhMQ2xlYXJCYWNrd2FyZFJlZnMoVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcyk7Ci0KLS8vIEFsbG9jYXRlICdtYXhfc2l6ZScgcmVmZXJlbmNlcy4gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIG1lbW9yeSBlcnJvci4KLWludCBWUDhMQmFja3dhcmRSZWZzQWxsb2MoVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcywgaW50IG1heF9zaXplKTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE1haW4gZW50cnkgcG9pbnRzCi0KLS8vIEV2YWx1YXRlcyBiZXN0IHBvc3NpYmxlIGJhY2t3YXJkIHJlZmVyZW5jZXMgZm9yIHNwZWNpZmllZCBxdWFsaXR5LgotLy8gRnVydGhlciBvcHRpbWl6ZSBmb3IgMkQgbG9jYWxpdHkgaWYgdXNlXzJkX2xvY2FsaXR5IGZsYWcgaXMgc2V0LgotaW50IFZQOExHZXRCYWNrd2FyZFJlZmVyZW5jZXMoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGFyZ2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcXVhbGl0eSwgaW50IGNhY2hlX2JpdHMsIGludCB1c2VfMmRfbG9jYWxpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCBiZXN0KTsKLQotLy8gUHJvZHVjZSBhbiBlc3RpbWF0ZSBmb3IgYSBnb29kIGNvbG9yIGNhY2hlIHNpemUgZm9yIHRoZSBpbWFnZS4KLWludCBWUDhMQ2FsY3VsYXRlRXN0aW1hdGVGb3JDYWNoZVNpemUoY29uc3QgdWludDMyX3QqIGNvbnN0IGFyZ2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4c2l6ZSwgaW50IHlzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGJlc3RfY2FjaGVfYml0cyk7Ci0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19Ci0jZW5kaWYKLQotI2VuZGlmICAvLyBXRUJQX0VOQ19CQUNLV0FSRF9SRUZFUkVOQ0VTX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvY29uZmlnLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvY29uZmlnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZjk2YjAuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL2NvbmZpZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBDb2RpbmcgdG9vbHMgY29uZmlndXJhdGlvbgotLy8KLS8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCi0KLSNpbmNsdWRlICIuLi93ZWJwL2VuY29kZS5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFdlYlBDb25maWcKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWludCBXZWJQQ29uZmlnSW5pdEludGVybmFsKFdlYlBDb25maWcqIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBQcmVzZXQgcHJlc2V0LCBmbG9hdCBxdWFsaXR5LCBpbnQgdmVyc2lvbikgewotICBpZiAoV0VCUF9BQklfSVNfSU5DT01QQVRJQkxFKHZlcnNpb24sIFdFQlBfRU5DT0RFUl9BQklfVkVSU0lPTikpIHsKLSAgICByZXR1cm4gMDsgICAvLyBjYWxsZXIvc3lzdGVtIHZlcnNpb24gbWlzbWF0Y2ghCi0gIH0KLSAgaWYgKGNvbmZpZyA9PSBOVUxMKSByZXR1cm4gMDsKLQotICBjb25maWctPnF1YWxpdHkgPSBxdWFsaXR5OwotICBjb25maWctPnRhcmdldF9zaXplID0gMDsKLSAgY29uZmlnLT50YXJnZXRfUFNOUiA9IDAuOwotICBjb25maWctPm1ldGhvZCA9IDQ7Ci0gIGNvbmZpZy0+c25zX3N0cmVuZ3RoID0gNTA7Ci0gIGNvbmZpZy0+ZmlsdGVyX3N0cmVuZ3RoID0gNjA7ICAgLy8gcmF0aGVyIGhpZ2ggZmlsdGVyaW5nLCBoZWxwcyB3LyBncmFkaWVudHMuCi0gIGNvbmZpZy0+ZmlsdGVyX3NoYXJwbmVzcyA9IDA7Ci0gIGNvbmZpZy0+ZmlsdGVyX3R5cGUgPSAxOyAgICAgICAgLy8gZGVmYXVsdDogc3Ryb25nIChzbyBVL1YgaXMgZmlsdGVyZWQgdG9vKQotICBjb25maWctPnBhcnRpdGlvbnMgPSAwOwotICBjb25maWctPnNlZ21lbnRzID0gNDsKLSAgY29uZmlnLT5wYXNzID0gMTsKLSAgY29uZmlnLT5zaG93X2NvbXByZXNzZWQgPSAwOwotICBjb25maWctPnByZXByb2Nlc3NpbmcgPSAwOwotICBjb25maWctPmF1dG9maWx0ZXIgPSAwOwotICBjb25maWctPnBhcnRpdGlvbl9saW1pdCA9IDA7Ci0gIGNvbmZpZy0+YWxwaGFfY29tcHJlc3Npb24gPSAxOwotICBjb25maWctPmFscGhhX2ZpbHRlcmluZyA9IDE7Ci0gIGNvbmZpZy0+YWxwaGFfcXVhbGl0eSA9IDEwMDsKLSAgY29uZmlnLT5sb3NzbGVzcyA9IDA7Ci0gIGNvbmZpZy0+aW1hZ2VfaGludCA9IFdFQlBfSElOVF9ERUZBVUxUOwotICBjb25maWctPmVtdWxhdGVfanBlZ19zaXplID0gMDsKLSAgY29uZmlnLT50aHJlYWRfbGV2ZWwgPSAwOwotICBjb25maWctPmxvd19tZW1vcnkgPSAwOwotCi0gIC8vIFRPRE8oc2thbCk6IHR1bmUuCi0gIHN3aXRjaCAocHJlc2V0KSB7Ci0gICAgY2FzZSBXRUJQX1BSRVNFVF9QSUNUVVJFOgotICAgICAgY29uZmlnLT5zbnNfc3RyZW5ndGggPSA4MDsKLSAgICAgIGNvbmZpZy0+ZmlsdGVyX3NoYXJwbmVzcyA9IDQ7Ci0gICAgICBjb25maWctPmZpbHRlcl9zdHJlbmd0aCA9IDM1OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBXRUJQX1BSRVNFVF9QSE9UTzoKLSAgICAgIGNvbmZpZy0+c25zX3N0cmVuZ3RoID0gODA7Ci0gICAgICBjb25maWctPmZpbHRlcl9zaGFycG5lc3MgPSAzOwotICAgICAgY29uZmlnLT5maWx0ZXJfc3RyZW5ndGggPSAzMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgV0VCUF9QUkVTRVRfRFJBV0lORzoKLSAgICAgIGNvbmZpZy0+c25zX3N0cmVuZ3RoID0gMjU7Ci0gICAgICBjb25maWctPmZpbHRlcl9zaGFycG5lc3MgPSA2OwotICAgICAgY29uZmlnLT5maWx0ZXJfc3RyZW5ndGggPSAxMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgV0VCUF9QUkVTRVRfSUNPTjoKLSAgICAgIGNvbmZpZy0+c25zX3N0cmVuZ3RoID0gMDsKLSAgICAgIGNvbmZpZy0+ZmlsdGVyX3N0cmVuZ3RoID0gMDsgICAvLyBkaXNhYmxlIGZpbHRlcmluZyB0byByZXRhaW4gc2hhcnBuZXNzCi0gICAgICBicmVhazsKLSAgICBjYXNlIFdFQlBfUFJFU0VUX1RFWFQ6Ci0gICAgICBjb25maWctPnNuc19zdHJlbmd0aCA9IDA7Ci0gICAgICBjb25maWctPmZpbHRlcl9zdHJlbmd0aCA9IDA7ICAgLy8gZGlzYWJsZSBmaWx0ZXJpbmcgdG8gcmV0YWluIHNoYXJwbmVzcwotICAgICAgY29uZmlnLT5zZWdtZW50cyA9IDI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFdFQlBfUFJFU0VUX0RFRkFVTFQ6Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiBXZWJQVmFsaWRhdGVDb25maWcoY29uZmlnKTsKLX0KLQotaW50IFdlYlBWYWxpZGF0ZUNvbmZpZyhjb25zdCBXZWJQQ29uZmlnKiBjb25maWcpIHsKLSAgaWYgKGNvbmZpZyA9PSBOVUxMKSByZXR1cm4gMDsKLSAgaWYgKGNvbmZpZy0+cXVhbGl0eSA8IDAgfHwgY29uZmlnLT5xdWFsaXR5ID4gMTAwKQotICAgIHJldHVybiAwOwotICBpZiAoY29uZmlnLT50YXJnZXRfc2l6ZSA8IDApCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChjb25maWctPnRhcmdldF9QU05SIDwgMCkKLSAgICByZXR1cm4gMDsKLSAgaWYgKGNvbmZpZy0+bWV0aG9kIDwgMCB8fCBjb25maWctPm1ldGhvZCA+IDYpCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChjb25maWctPnNlZ21lbnRzIDwgMSB8fCBjb25maWctPnNlZ21lbnRzID4gNCkKLSAgICByZXR1cm4gMDsKLSAgaWYgKGNvbmZpZy0+c25zX3N0cmVuZ3RoIDwgMCB8fCBjb25maWctPnNuc19zdHJlbmd0aCA+IDEwMCkKLSAgICByZXR1cm4gMDsKLSAgaWYgKGNvbmZpZy0+ZmlsdGVyX3N0cmVuZ3RoIDwgMCB8fCBjb25maWctPmZpbHRlcl9zdHJlbmd0aCA+IDEwMCkKLSAgICByZXR1cm4gMDsKLSAgaWYgKGNvbmZpZy0+ZmlsdGVyX3NoYXJwbmVzcyA8IDAgfHwgY29uZmlnLT5maWx0ZXJfc2hhcnBuZXNzID4gNykKLSAgICByZXR1cm4gMDsKLSAgaWYgKGNvbmZpZy0+ZmlsdGVyX3R5cGUgPCAwIHx8IGNvbmZpZy0+ZmlsdGVyX3R5cGUgPiAxKQotICAgIHJldHVybiAwOwotICBpZiAoY29uZmlnLT5hdXRvZmlsdGVyIDwgMCB8fCBjb25maWctPmF1dG9maWx0ZXIgPiAxKQotICAgIHJldHVybiAwOwotICBpZiAoY29uZmlnLT5wYXNzIDwgMSB8fCBjb25maWctPnBhc3MgPiAxMCkKLSAgICByZXR1cm4gMDsKLSAgaWYgKGNvbmZpZy0+c2hvd19jb21wcmVzc2VkIDwgMCB8fCBjb25maWctPnNob3dfY29tcHJlc3NlZCA+IDEpCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChjb25maWctPnByZXByb2Nlc3NpbmcgPCAwIHx8IGNvbmZpZy0+cHJlcHJvY2Vzc2luZyA+IDEpCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChjb25maWctPnBhcnRpdGlvbnMgPCAwIHx8IGNvbmZpZy0+cGFydGl0aW9ucyA+IDMpCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChjb25maWctPnBhcnRpdGlvbl9saW1pdCA8IDAgfHwgY29uZmlnLT5wYXJ0aXRpb25fbGltaXQgPiAxMDApCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChjb25maWctPmFscGhhX2NvbXByZXNzaW9uIDwgMCkKLSAgICByZXR1cm4gMDsKLSAgaWYgKGNvbmZpZy0+YWxwaGFfZmlsdGVyaW5nIDwgMCkKLSAgICByZXR1cm4gMDsKLSAgaWYgKGNvbmZpZy0+YWxwaGFfcXVhbGl0eSA8IDAgfHwgY29uZmlnLT5hbHBoYV9xdWFsaXR5ID4gMTAwKQotICAgIHJldHVybiAwOwotICBpZiAoY29uZmlnLT5sb3NzbGVzcyA8IDAgfHwgY29uZmlnLT5sb3NzbGVzcyA+IDEpCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChjb25maWctPmltYWdlX2hpbnQgPj0gV0VCUF9ISU5UX0xBU1QpCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChjb25maWctPmVtdWxhdGVfanBlZ19zaXplIDwgMCB8fCBjb25maWctPmVtdWxhdGVfanBlZ19zaXplID4gMSkKLSAgICByZXR1cm4gMDsKLSAgaWYgKGNvbmZpZy0+dGhyZWFkX2xldmVsIDwgMCB8fCBjb25maWctPnRocmVhZF9sZXZlbCA+IDEpCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChjb25maWctPmxvd19tZW1vcnkgPCAwIHx8IGNvbmZpZy0+bG93X21lbW9yeSA+IDEpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiAxOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy9jb3N0LmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvY29zdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDkxNmQ3Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy9jb3N0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0OTYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIENvc3QgdGFibGVzIGZvciBsZXZlbCBhbmQgbW9kZXMKLS8vCi0vLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQotCi0jaW5jbHVkZSAiLi9jb3N0LmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQm9vbGVhbi1jb3N0IGNvc3QgdGFibGUKLQotY29uc3QgdWludDE2X3QgVlA4RW50cm9weUNvc3RbMjU2XSA9IHsKLSAgMTc5MiwgMTc5MiwgMTc5MiwgMTUzNiwgMTUzNiwgMTQwOCwgMTM2NiwgMTI4MCwgMTI4MCwgMTIxNiwKLSAgMTE3OCwgMTE1MiwgMTExMCwgMTA3NiwgMTA2MSwgMTAyNCwgMTAyNCwgIDk5MiwgIDk2OCwgIDk1MSwKLSAgIDkzOSwgIDkxMSwgIDg5NiwgIDg3OCwgIDg3MSwgIDg1NCwgIDgzOCwgIDgyMCwgIDgxMSwgIDc5NCwKLSAgIDc4NiwgIDc2OCwgIDc2OCwgIDc1MiwgIDc0MCwgIDczMiwgIDcyMCwgIDcwOSwgIDcwNCwgIDY5MCwKLSAgIDY4MywgIDY3MiwgIDY2NiwgIDY1NSwgIDY0NywgIDY0MCwgIDYzMSwgIDYyMiwgIDYxNSwgIDYwNywKLSAgIDU5OCwgIDU5MiwgIDU4NiwgIDU3NiwgIDU3MiwgIDU2NCwgIDU1OSwgIDU1NSwgIDU0NywgIDU0MSwKLSAgIDUzNCwgIDUyOCwgIDUyMiwgIDUxMiwgIDUxMiwgIDUwNCwgIDUwMCwgIDQ5NCwgIDQ4OCwgIDQ4MywKLSAgIDQ3NywgIDQ3MywgIDQ2NywgIDQ2MSwgIDQ1OCwgIDQ1MiwgIDQ0OCwgIDQ0MywgIDQzOCwgIDQzNCwKLSAgIDQyNywgIDQyNCwgIDQxOSwgIDQxNSwgIDQxMCwgIDQwNiwgIDQwMywgIDM5OSwgIDM5NCwgIDM5MCwKLSAgIDM4NCwgIDM4NCwgIDM3NywgIDM3NCwgIDM3MCwgIDM2NiwgIDM2MiwgIDM1OSwgIDM1NSwgIDM1MSwKLSAgIDM0NywgIDM0MiwgIDM0MiwgIDMzNiwgIDMzMywgIDMzMCwgIDMyNiwgIDMyMywgIDMyMCwgIDMxNiwKLSAgIDMxMiwgIDMwOCwgIDMwNSwgIDMwMiwgIDI5OSwgIDI5NiwgIDI5MywgIDI4OCwgIDI4NywgIDI4MywKLSAgIDI4MCwgIDI3NywgIDI3NCwgIDI3MiwgIDI2OCwgIDI2NiwgIDI2MiwgIDI1NiwgIDI1NiwgIDI1NiwKLSAgIDI1MSwgIDI0OCwgIDI0NSwgIDI0MiwgIDI0MCwgIDIzNywgIDIzNCwgIDIzMiwgIDIyOCwgIDIyNiwKLSAgIDIyMywgIDIyMSwgIDIxOCwgIDIxNiwgIDIxNCwgIDIxMSwgIDIwOCwgIDIwNSwgIDIwMywgIDIwMSwKLSAgIDE5OCwgIDE5NiwgIDE5MiwgIDE5MSwgIDE4OCwgIDE4NywgIDE4MywgIDE4MSwgIDE3OSwgIDE3NiwKLSAgIDE3NSwgIDE3MSwgIDE3MSwgIDE2OCwgIDE2NSwgIDE2MywgIDE2MCwgIDE1OSwgIDE1NiwgIDE1NCwKLSAgIDE1MiwgIDE1MCwgIDE0OCwgIDE0NiwgIDE0NCwgIDE0MiwgIDEzOSwgIDEzOCwgIDEzNSwgIDEzMywKLSAgIDEzMSwgIDEyOCwgIDEyOCwgIDEyNSwgIDEyMywgIDEyMSwgIDExOSwgIDExNywgIDExNSwgIDExMywKLSAgIDExMSwgIDExMCwgIDEwNywgIDEwNSwgIDEwMywgIDEwMiwgIDEwMCwgICA5OCwgICA5NiwgICA5NCwKLSAgICA5MiwgICA5MSwgICA4OSwgICA4NiwgICA4NiwgICA4MywgICA4MiwgICA4MCwgICA3NywgICA3NiwKLSAgICA3NCwgICA3MywgICA3MSwgICA2OSwgICA2NywgICA2NiwgICA2NCwgICA2MywgICA2MSwgICA1OSwKLSAgICA1NywgICA1NSwgICA1NCwgICA1MiwgICA1MSwgICA0OSwgICA0NywgICA0NiwgICA0NCwgICA0MywKLSAgICA0MSwgICA0MCwgICAzOCwgICAzNiwgICAzNSwgICAzMywgICAzMiwgICAzMCwgICAyOSwgICAyNywKLSAgICAyNSwgICAyNCwgICAyMiwgICAyMSwgICAxOSwgICAxOCwgICAxNiwgICAxNSwgICAxMywgICAxMiwKLSAgICAxMCwgICAgOSwgICAgNywgICAgNiwgICAgNCwgICAgMwotfTsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIExldmVsIGNvc3QgdGFibGVzCi0KLS8vIEZvciBlYWNoIGdpdmVuIGxldmVsLCB0aGUgZm9sbG93aW5nIHRhYmxlIGdpdmVzIHRoZSBwYXR0ZXJuIG9mIGNvbnRleHRzIHRvCi0vLyB1c2UgZm9yIGNvZGluZyBpdCAoaW4gW11bMF0pIGFzIHdlbGwgYXMgdGhlIGJpdCB2YWx1ZSB0byB1c2UgZm9yIGVhY2gKLS8vIGNvbnRleHQgKGluIFtdWzFdKS4KLWNvbnN0IHVpbnQxNl90IFZQOExldmVsQ29kZXNbTUFYX1ZBUklBQkxFX0xFVkVMXVsyXSA9IHsKLSAgICAgICAgICAgICAgICAgIHsweDAwMSwgMHgwMDB9LCB7MHgwMDcsIDB4MDAxfSwgezB4MDBmLCAweDAwNX0sCi0gIHsweDAwZiwgMHgwMGR9LCB7MHgwMzMsIDB4MDAzfSwgezB4MDMzLCAweDAwM30sIHsweDAzMywgMHgwMjN9LAotICB7MHgwMzMsIDB4MDIzfSwgezB4MDMzLCAweDAyM30sIHsweDAzMywgMHgwMjN9LCB7MHgwZDMsIDB4MDEzfSwKLSAgezB4MGQzLCAweDAxM30sIHsweDBkMywgMHgwMTN9LCB7MHgwZDMsIDB4MDEzfSwgezB4MGQzLCAweDAxM30sCi0gIHsweDBkMywgMHgwMTN9LCB7MHgwZDMsIDB4MDEzfSwgezB4MGQzLCAweDAxM30sIHsweDBkMywgMHgwOTN9LAotICB7MHgwZDMsIDB4MDkzfSwgezB4MGQzLCAweDA5M30sIHsweDBkMywgMHgwOTN9LCB7MHgwZDMsIDB4MDkzfSwKLSAgezB4MGQzLCAweDA5M30sIHsweDBkMywgMHgwOTN9LCB7MHgwZDMsIDB4MDkzfSwgezB4MGQzLCAweDA5M30sCi0gIHsweDBkMywgMHgwOTN9LCB7MHgwZDMsIDB4MDkzfSwgezB4MGQzLCAweDA5M30sIHsweDBkMywgMHgwOTN9LAotICB7MHgwZDMsIDB4MDkzfSwgezB4MGQzLCAweDA5M30sIHsweDBkMywgMHgwOTN9LCB7MHgxNTMsIDB4MDUzfSwKLSAgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sCi0gIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LAotICB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwKLSAgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sCi0gIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LAotICB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwKLSAgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sCi0gIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgxNTN9Ci19OwotCi0vLyBmaXhlZCBjb3N0cyBmb3IgY29kaW5nIGxldmVscywgZGVkdWNlIGZyb20gdGhlIGNvZGluZyB0cmVlLgotLy8gVGhpcyBpcyBvbmx5IHRoZSBwYXJ0IHRoYXQgZG9lc24ndCBkZXBlbmQgb24gdGhlIHByb2JhYmlsaXR5IHN0YXRlLgotY29uc3QgdWludDE2X3QgVlA4TGV2ZWxGaXhlZENvc3RzW01BWF9MRVZFTCArIDFdID0gewotICAgICAwLCAgMjU2LCAgMjU2LCAgMjU2LCAgMjU2LCAgNDMyLCAgNjE4LCAgNjMwLAotICAgNzMxLCAgNjQwLCAgNjQwLCAgODI4LCAgOTAxLCAgOTQ4LCAxMDIxLCAxMTAxLAotICAxMTc0LCAxMjIxLCAxMjk0LCAxMDQyLCAxMDg1LCAxMTE1LCAxMTU4LCAxMjAyLAotICAxMjQ1LCAxMjc1LCAxMzE4LCAxMzM3LCAxMzgwLCAxNDEwLCAxNDUzLCAxNDk3LAotICAxNTQwLCAxNTcwLCAxNjEzLCAxMjgwLCAxMjk1LCAxMzE3LCAxMzMyLCAxMzU4LAotICAxMzczLCAxMzk1LCAxNDEwLCAxNDU0LCAxNDY5LCAxNDkxLCAxNTA2LCAxNTMyLAotICAxNTQ3LCAxNTY5LCAxNTg0LCAxNjAxLCAxNjE2LCAxNjM4LCAxNjUzLCAxNjc5LAotICAxNjk0LCAxNzE2LCAxNzMxLCAxNzc1LCAxNzkwLCAxODEyLCAxODI3LCAxODUzLAotICAxODY4LCAxODkwLCAxOTA1LCAxNzI3LCAxNzMzLCAxNzQyLCAxNzQ4LCAxNzU5LAotICAxNzY1LCAxNzc0LCAxNzgwLCAxODAwLCAxODA2LCAxODE1LCAxODIxLCAxODMyLAotICAxODM4LCAxODQ3LCAxODUzLCAxODc4LCAxODg0LCAxODkzLCAxODk5LCAxOTEwLAotICAxOTE2LCAxOTI1LCAxOTMxLCAxOTUxLCAxOTU3LCAxOTY2LCAxOTcyLCAxOTgzLAotICAxOTg5LCAxOTk4LCAyMDA0LCAyMDI3LCAyMDMzLCAyMDQyLCAyMDQ4LCAyMDU5LAotICAyMDY1LCAyMDc0LCAyMDgwLCAyMTAwLCAyMTA2LCAyMTE1LCAyMTIxLCAyMTMyLAotICAyMTM4LCAyMTQ3LCAyMTUzLCAyMTc4LCAyMTg0LCAyMTkzLCAyMTk5LCAyMjEwLAotICAyMjE2LCAyMjI1LCAyMjMxLCAyMjUxLCAyMjU3LCAyMjY2LCAyMjcyLCAyMjgzLAotICAyMjg5LCAyMjk4LCAyMzA0LCAyMTY4LCAyMTc0LCAyMTgzLCAyMTg5LCAyMjAwLAotICAyMjA2LCAyMjE1LCAyMjIxLCAyMjQxLCAyMjQ3LCAyMjU2LCAyMjYyLCAyMjczLAotICAyMjc5LCAyMjg4LCAyMjk0LCAyMzE5LCAyMzI1LCAyMzM0LCAyMzQwLCAyMzUxLAotICAyMzU3LCAyMzY2LCAyMzcyLCAyMzkyLCAyMzk4LCAyNDA3LCAyNDEzLCAyNDI0LAotICAyNDMwLCAyNDM5LCAyNDQ1LCAyNDY4LCAyNDc0LCAyNDgzLCAyNDg5LCAyNTAwLAotICAyNTA2LCAyNTE1LCAyNTIxLCAyNTQxLCAyNTQ3LCAyNTU2LCAyNTYyLCAyNTczLAotICAyNTc5LCAyNTg4LCAyNTk0LCAyNjE5LCAyNjI1LCAyNjM0LCAyNjQwLCAyNjUxLAotICAyNjU3LCAyNjY2LCAyNjcyLCAyNjkyLCAyNjk4LCAyNzA3LCAyNzEzLCAyNzI0LAotICAyNzMwLCAyNzM5LCAyNzQ1LCAyNTQwLCAyNTQ2LCAyNTU1LCAyNTYxLCAyNTcyLAotICAyNTc4LCAyNTg3LCAyNTkzLCAyNjEzLCAyNjE5LCAyNjI4LCAyNjM0LCAyNjQ1LAotICAyNjUxLCAyNjYwLCAyNjY2LCAyNjkxLCAyNjk3LCAyNzA2LCAyNzEyLCAyNzIzLAotICAyNzI5LCAyNzM4LCAyNzQ0LCAyNzY0LCAyNzcwLCAyNzc5LCAyNzg1LCAyNzk2LAotICAyODAyLCAyODExLCAyODE3LCAyODQwLCAyODQ2LCAyODU1LCAyODYxLCAyODcyLAotICAyODc4LCAyODg3LCAyODkzLCAyOTEzLCAyOTE5LCAyOTI4LCAyOTM0LCAyOTQ1LAotICAyOTUxLCAyOTYwLCAyOTY2LCAyOTkxLCAyOTk3LCAzMDA2LCAzMDEyLCAzMDIzLAotICAzMDI5LCAzMDM4LCAzMDQ0LCAzMDY0LCAzMDcwLCAzMDc5LCAzMDg1LCAzMDk2LAotICAzMTAyLCAzMTExLCAzMTE3LCAyOTgxLCAyOTg3LCAyOTk2LCAzMDAyLCAzMDEzLAotICAzMDE5LCAzMDI4LCAzMDM0LCAzMDU0LCAzMDYwLCAzMDY5LCAzMDc1LCAzMDg2LAotICAzMDkyLCAzMTAxLCAzMTA3LCAzMTMyLCAzMTM4LCAzMTQ3LCAzMTUzLCAzMTY0LAotICAzMTcwLCAzMTc5LCAzMTg1LCAzMjA1LCAzMjExLCAzMjIwLCAzMjI2LCAzMjM3LAotICAzMjQzLCAzMjUyLCAzMjU4LCAzMjgxLCAzMjg3LCAzMjk2LCAzMzAyLCAzMzEzLAotICAzMzE5LCAzMzI4LCAzMzM0LCAzMzU0LCAzMzYwLCAzMzY5LCAzMzc1LCAzMzg2LAotICAzMzkyLCAzNDAxLCAzNDA3LCAzNDMyLCAzNDM4LCAzNDQ3LCAzNDUzLCAzNDY0LAotICAzNDcwLCAzNDc5LCAzNDg1LCAzNTA1LCAzNTExLCAzNTIwLCAzNTI2LCAzNTM3LAotICAzNTQzLCAzNTUyLCAzNTU4LCAyODE2LCAyODIyLCAyODMxLCAyODM3LCAyODQ4LAotICAyODU0LCAyODYzLCAyODY5LCAyODg5LCAyODk1LCAyOTA0LCAyOTEwLCAyOTIxLAotICAyOTI3LCAyOTM2LCAyOTQyLCAyOTY3LCAyOTczLCAyOTgyLCAyOTg4LCAyOTk5LAotICAzMDA1LCAzMDE0LCAzMDIwLCAzMDQwLCAzMDQ2LCAzMDU1LCAzMDYxLCAzMDcyLAotICAzMDc4LCAzMDg3LCAzMDkzLCAzMTE2LCAzMTIyLCAzMTMxLCAzMTM3LCAzMTQ4LAotICAzMTU0LCAzMTYzLCAzMTY5LCAzMTg5LCAzMTk1LCAzMjA0LCAzMjEwLCAzMjIxLAotICAzMjI3LCAzMjM2LCAzMjQyLCAzMjY3LCAzMjczLCAzMjgyLCAzMjg4LCAzMjk5LAotICAzMzA1LCAzMzE0LCAzMzIwLCAzMzQwLCAzMzQ2LCAzMzU1LCAzMzYxLCAzMzcyLAotICAzMzc4LCAzMzg3LCAzMzkzLCAzMjU3LCAzMjYzLCAzMjcyLCAzMjc4LCAzMjg5LAotICAzMjk1LCAzMzA0LCAzMzEwLCAzMzMwLCAzMzM2LCAzMzQ1LCAzMzUxLCAzMzYyLAotICAzMzY4LCAzMzc3LCAzMzgzLCAzNDA4LCAzNDE0LCAzNDIzLCAzNDI5LCAzNDQwLAotICAzNDQ2LCAzNDU1LCAzNDYxLCAzNDgxLCAzNDg3LCAzNDk2LCAzNTAyLCAzNTEzLAotICAzNTE5LCAzNTI4LCAzNTM0LCAzNTU3LCAzNTYzLCAzNTcyLCAzNTc4LCAzNTg5LAotICAzNTk1LCAzNjA0LCAzNjEwLCAzNjMwLCAzNjM2LCAzNjQ1LCAzNjUxLCAzNjYyLAotICAzNjY4LCAzNjc3LCAzNjgzLCAzNzA4LCAzNzE0LCAzNzIzLCAzNzI5LCAzNzQwLAotICAzNzQ2LCAzNzU1LCAzNzYxLCAzNzgxLCAzNzg3LCAzNzk2LCAzODAyLCAzODEzLAotICAzODE5LCAzODI4LCAzODM0LCAzNjI5LCAzNjM1LCAzNjQ0LCAzNjUwLCAzNjYxLAotICAzNjY3LCAzNjc2LCAzNjgyLCAzNzAyLCAzNzA4LCAzNzE3LCAzNzIzLCAzNzM0LAotICAzNzQwLCAzNzQ5LCAzNzU1LCAzNzgwLCAzNzg2LCAzNzk1LCAzODAxLCAzODEyLAotICAzODE4LCAzODI3LCAzODMzLCAzODUzLCAzODU5LCAzODY4LCAzODc0LCAzODg1LAotICAzODkxLCAzOTAwLCAzOTA2LCAzOTI5LCAzOTM1LCAzOTQ0LCAzOTUwLCAzOTYxLAotICAzOTY3LCAzOTc2LCAzOTgyLCA0MDAyLCA0MDA4LCA0MDE3LCA0MDIzLCA0MDM0LAotICA0MDQwLCA0MDQ5LCA0MDU1LCA0MDgwLCA0MDg2LCA0MDk1LCA0MTAxLCA0MTEyLAotICA0MTE4LCA0MTI3LCA0MTMzLCA0MTUzLCA0MTU5LCA0MTY4LCA0MTc0LCA0MTg1LAotICA0MTkxLCA0MjAwLCA0MjA2LCA0MDcwLCA0MDc2LCA0MDg1LCA0MDkxLCA0MTAyLAotICA0MTA4LCA0MTE3LCA0MTIzLCA0MTQzLCA0MTQ5LCA0MTU4LCA0MTY0LCA0MTc1LAotICA0MTgxLCA0MTkwLCA0MTk2LCA0MjIxLCA0MjI3LCA0MjM2LCA0MjQyLCA0MjUzLAotICA0MjU5LCA0MjY4LCA0Mjc0LCA0Mjk0LCA0MzAwLCA0MzA5LCA0MzE1LCA0MzI2LAotICA0MzMyLCA0MzQxLCA0MzQ3LCA0MzcwLCA0Mzc2LCA0Mzg1LCA0MzkxLCA0NDAyLAotICA0NDA4LCA0NDE3LCA0NDIzLCA0NDQzLCA0NDQ5LCA0NDU4LCA0NDY0LCA0NDc1LAotICA0NDgxLCA0NDkwLCA0NDk2LCA0NTIxLCA0NTI3LCA0NTM2LCA0NTQyLCA0NTUzLAotICA0NTU5LCA0NTY4LCA0NTc0LCA0NTk0LCA0NjAwLCA0NjA5LCA0NjE1LCA0NjI2LAotICA0NjMyLCA0NjQxLCA0NjQ3LCAzNTE1LCAzNTIxLCAzNTMwLCAzNTM2LCAzNTQ3LAotICAzNTUzLCAzNTYyLCAzNTY4LCAzNTg4LCAzNTk0LCAzNjAzLCAzNjA5LCAzNjIwLAotICAzNjI2LCAzNjM1LCAzNjQxLCAzNjY2LCAzNjcyLCAzNjgxLCAzNjg3LCAzNjk4LAotICAzNzA0LCAzNzEzLCAzNzE5LCAzNzM5LCAzNzQ1LCAzNzU0LCAzNzYwLCAzNzcxLAotICAzNzc3LCAzNzg2LCAzNzkyLCAzODE1LCAzODIxLCAzODMwLCAzODM2LCAzODQ3LAotICAzODUzLCAzODYyLCAzODY4LCAzODg4LCAzODk0LCAzOTAzLCAzOTA5LCAzOTIwLAotICAzOTI2LCAzOTM1LCAzOTQxLCAzOTY2LCAzOTcyLCAzOTgxLCAzOTg3LCAzOTk4LAotICA0MDA0LCA0MDEzLCA0MDE5LCA0MDM5LCA0MDQ1LCA0MDU0LCA0MDYwLCA0MDcxLAotICA0MDc3LCA0MDg2LCA0MDkyLCAzOTU2LCAzOTYyLCAzOTcxLCAzOTc3LCAzOTg4LAotICAzOTk0LCA0MDAzLCA0MDA5LCA0MDI5LCA0MDM1LCA0MDQ0LCA0MDUwLCA0MDYxLAotICA0MDY3LCA0MDc2LCA0MDgyLCA0MTA3LCA0MTEzLCA0MTIyLCA0MTI4LCA0MTM5LAotICA0MTQ1LCA0MTU0LCA0MTYwLCA0MTgwLCA0MTg2LCA0MTk1LCA0MjAxLCA0MjEyLAotICA0MjE4LCA0MjI3LCA0MjMzLCA0MjU2LCA0MjYyLCA0MjcxLCA0Mjc3LCA0Mjg4LAotICA0Mjk0LCA0MzAzLCA0MzA5LCA0MzI5LCA0MzM1LCA0MzQ0LCA0MzUwLCA0MzYxLAotICA0MzY3LCA0Mzc2LCA0MzgyLCA0NDA3LCA0NDEzLCA0NDIyLCA0NDI4LCA0NDM5LAotICA0NDQ1LCA0NDU0LCA0NDYwLCA0NDgwLCA0NDg2LCA0NDk1LCA0NTAxLCA0NTEyLAotICA0NTE4LCA0NTI3LCA0NTMzLCA0MzI4LCA0MzM0LCA0MzQzLCA0MzQ5LCA0MzYwLAotICA0MzY2LCA0Mzc1LCA0MzgxLCA0NDAxLCA0NDA3LCA0NDE2LCA0NDIyLCA0NDMzLAotICA0NDM5LCA0NDQ4LCA0NDU0LCA0NDc5LCA0NDg1LCA0NDk0LCA0NTAwLCA0NTExLAotICA0NTE3LCA0NTI2LCA0NTMyLCA0NTUyLCA0NTU4LCA0NTY3LCA0NTczLCA0NTg0LAotICA0NTkwLCA0NTk5LCA0NjA1LCA0NjI4LCA0NjM0LCA0NjQzLCA0NjQ5LCA0NjYwLAotICA0NjY2LCA0Njc1LCA0NjgxLCA0NzAxLCA0NzA3LCA0NzE2LCA0NzIyLCA0NzMzLAotICA0NzM5LCA0NzQ4LCA0NzU0LCA0Nzc5LCA0Nzg1LCA0Nzk0LCA0ODAwLCA0ODExLAotICA0ODE3LCA0ODI2LCA0ODMyLCA0ODUyLCA0ODU4LCA0ODY3LCA0ODczLCA0ODg0LAotICA0ODkwLCA0ODk5LCA0OTA1LCA0NzY5LCA0Nzc1LCA0Nzg0LCA0NzkwLCA0ODAxLAotICA0ODA3LCA0ODE2LCA0ODIyLCA0ODQyLCA0ODQ4LCA0ODU3LCA0ODYzLCA0ODc0LAotICA0ODgwLCA0ODg5LCA0ODk1LCA0OTIwLCA0OTI2LCA0OTM1LCA0OTQxLCA0OTUyLAotICA0OTU4LCA0OTY3LCA0OTczLCA0OTkzLCA0OTk5LCA1MDA4LCA1MDE0LCA1MDI1LAotICA1MDMxLCA1MDQwLCA1MDQ2LCA1MDY5LCA1MDc1LCA1MDg0LCA1MDkwLCA1MTAxLAotICA1MTA3LCA1MTE2LCA1MTIyLCA1MTQyLCA1MTQ4LCA1MTU3LCA1MTYzLCA1MTc0LAotICA1MTgwLCA1MTg5LCA1MTk1LCA1MjIwLCA1MjI2LCA1MjM1LCA1MjQxLCA1MjUyLAotICA1MjU4LCA1MjY3LCA1MjczLCA1MjkzLCA1Mjk5LCA1MzA4LCA1MzE0LCA1MzI1LAotICA1MzMxLCA1MzQwLCA1MzQ2LCA0NjA0LCA0NjEwLCA0NjE5LCA0NjI1LCA0NjM2LAotICA0NjQyLCA0NjUxLCA0NjU3LCA0Njc3LCA0NjgzLCA0NjkyLCA0Njk4LCA0NzA5LAotICA0NzE1LCA0NzI0LCA0NzMwLCA0NzU1LCA0NzYxLCA0NzcwLCA0Nzc2LCA0Nzg3LAotICA0NzkzLCA0ODAyLCA0ODA4LCA0ODI4LCA0ODM0LCA0ODQzLCA0ODQ5LCA0ODYwLAotICA0ODY2LCA0ODc1LCA0ODgxLCA0OTA0LCA0OTEwLCA0OTE5LCA0OTI1LCA0OTM2LAotICA0OTQyLCA0OTUxLCA0OTU3LCA0OTc3LCA0OTgzLCA0OTkyLCA0OTk4LCA1MDA5LAotICA1MDE1LCA1MDI0LCA1MDMwLCA1MDU1LCA1MDYxLCA1MDcwLCA1MDc2LCA1MDg3LAotICA1MDkzLCA1MTAyLCA1MTA4LCA1MTI4LCA1MTM0LCA1MTQzLCA1MTQ5LCA1MTYwLAotICA1MTY2LCA1MTc1LCA1MTgxLCA1MDQ1LCA1MDUxLCA1MDYwLCA1MDY2LCA1MDc3LAotICA1MDgzLCA1MDkyLCA1MDk4LCA1MTE4LCA1MTI0LCA1MTMzLCA1MTM5LCA1MTUwLAotICA1MTU2LCA1MTY1LCA1MTcxLCA1MTk2LCA1MjAyLCA1MjExLCA1MjE3LCA1MjI4LAotICA1MjM0LCA1MjQzLCA1MjQ5LCA1MjY5LCA1Mjc1LCA1Mjg0LCA1MjkwLCA1MzAxLAotICA1MzA3LCA1MzE2LCA1MzIyLCA1MzQ1LCA1MzUxLCA1MzYwLCA1MzY2LCA1Mzc3LAotICA1MzgzLCA1MzkyLCA1Mzk4LCA1NDE4LCA1NDI0LCA1NDMzLCA1NDM5LCA1NDUwLAotICA1NDU2LCA1NDY1LCA1NDcxLCA1NDk2LCA1NTAyLCA1NTExLCA1NTE3LCA1NTI4LAotICA1NTM0LCA1NTQzLCA1NTQ5LCA1NTY5LCA1NTc1LCA1NTg0LCA1NTkwLCA1NjAxLAotICA1NjA3LCA1NjE2LCA1NjIyLCA1NDE3LCA1NDIzLCA1NDMyLCA1NDM4LCA1NDQ5LAotICA1NDU1LCA1NDY0LCA1NDcwLCA1NDkwLCA1NDk2LCA1NTA1LCA1NTExLCA1NTIyLAotICA1NTI4LCA1NTM3LCA1NTQzLCA1NTY4LCA1NTc0LCA1NTgzLCA1NTg5LCA1NjAwLAotICA1NjA2LCA1NjE1LCA1NjIxLCA1NjQxLCA1NjQ3LCA1NjU2LCA1NjYyLCA1NjczLAotICA1Njc5LCA1Njg4LCA1Njk0LCA1NzE3LCA1NzIzLCA1NzMyLCA1NzM4LCA1NzQ5LAotICA1NzU1LCA1NzY0LCA1NzcwLCA1NzkwLCA1Nzk2LCA1ODA1LCA1ODExLCA1ODIyLAotICA1ODI4LCA1ODM3LCA1ODQzLCA1ODY4LCA1ODc0LCA1ODgzLCA1ODg5LCA1OTAwLAotICA1OTA2LCA1OTE1LCA1OTIxLCA1OTQxLCA1OTQ3LCA1OTU2LCA1OTYyLCA1OTczLAotICA1OTc5LCA1OTg4LCA1OTk0LCA1ODU4LCA1ODY0LCA1ODczLCA1ODc5LCA1ODkwLAotICA1ODk2LCA1OTA1LCA1OTExLCA1OTMxLCA1OTM3LCA1OTQ2LCA1OTUyLCA1OTYzLAotICA1OTY5LCA1OTc4LCA1OTg0LCA2MDA5LCA2MDE1LCA2MDI0LCA2MDMwLCA2MDQxLAotICA2MDQ3LCA2MDU2LCA2MDYyLCA2MDgyLCA2MDg4LCA2MDk3LCA2MTAzLCA2MTE0LAotICA2MTIwLCA2MTI5LCA2MTM1LCA2MTU4LCA2MTY0LCA2MTczLCA2MTc5LCA2MTkwLAotICA2MTk2LCA2MjA1LCA2MjExLCA2MjMxLCA2MjM3LCA2MjQ2LCA2MjUyLCA2MjYzLAotICA2MjY5LCA2Mjc4LCA2Mjg0LCA2MzA5LCA2MzE1LCA2MzI0LCA2MzMwLCA2MzQxLAotICA2MzQ3LCA2MzU2LCA2MzYyLCA2MzgyLCA2Mzg4LCA2Mzk3LCA2NDAzLCA2NDE0LAotICA2NDIwLCA2NDI5LCA2NDM1LCAzNTE1LCAzNTIxLCAzNTMwLCAzNTM2LCAzNTQ3LAotICAzNTUzLCAzNTYyLCAzNTY4LCAzNTg4LCAzNTk0LCAzNjAzLCAzNjA5LCAzNjIwLAotICAzNjI2LCAzNjM1LCAzNjQxLCAzNjY2LCAzNjcyLCAzNjgxLCAzNjg3LCAzNjk4LAotICAzNzA0LCAzNzEzLCAzNzE5LCAzNzM5LCAzNzQ1LCAzNzU0LCAzNzYwLCAzNzcxLAotICAzNzc3LCAzNzg2LCAzNzkyLCAzODE1LCAzODIxLCAzODMwLCAzODM2LCAzODQ3LAotICAzODUzLCAzODYyLCAzODY4LCAzODg4LCAzODk0LCAzOTAzLCAzOTA5LCAzOTIwLAotICAzOTI2LCAzOTM1LCAzOTQxLCAzOTY2LCAzOTcyLCAzOTgxLCAzOTg3LCAzOTk4LAotICA0MDA0LCA0MDEzLCA0MDE5LCA0MDM5LCA0MDQ1LCA0MDU0LCA0MDYwLCA0MDcxLAotICA0MDc3LCA0MDg2LCA0MDkyLCAzOTU2LCAzOTYyLCAzOTcxLCAzOTc3LCAzOTg4LAotICAzOTk0LCA0MDAzLCA0MDA5LCA0MDI5LCA0MDM1LCA0MDQ0LCA0MDUwLCA0MDYxLAotICA0MDY3LCA0MDc2LCA0MDgyLCA0MTA3LCA0MTEzLCA0MTIyLCA0MTI4LCA0MTM5LAotICA0MTQ1LCA0MTU0LCA0MTYwLCA0MTgwLCA0MTg2LCA0MTk1LCA0MjAxLCA0MjEyLAotICA0MjE4LCA0MjI3LCA0MjMzLCA0MjU2LCA0MjYyLCA0MjcxLCA0Mjc3LCA0Mjg4LAotICA0Mjk0LCA0MzAzLCA0MzA5LCA0MzI5LCA0MzM1LCA0MzQ0LCA0MzUwLCA0MzYxLAotICA0MzY3LCA0Mzc2LCA0MzgyLCA0NDA3LCA0NDEzLCA0NDIyLCA0NDI4LCA0NDM5LAotICA0NDQ1LCA0NDU0LCA0NDYwLCA0NDgwLCA0NDg2LCA0NDk1LCA0NTAxLCA0NTEyLAotICA0NTE4LCA0NTI3LCA0NTMzLCA0MzI4LCA0MzM0LCA0MzQzLCA0MzQ5LCA0MzYwLAotICA0MzY2LCA0Mzc1LCA0MzgxLCA0NDAxLCA0NDA3LCA0NDE2LCA0NDIyLCA0NDMzLAotICA0NDM5LCA0NDQ4LCA0NDU0LCA0NDc5LCA0NDg1LCA0NDk0LCA0NTAwLCA0NTExLAotICA0NTE3LCA0NTI2LCA0NTMyLCA0NTUyLCA0NTU4LCA0NTY3LCA0NTczLCA0NTg0LAotICA0NTkwLCA0NTk5LCA0NjA1LCA0NjI4LCA0NjM0LCA0NjQzLCA0NjQ5LCA0NjYwLAotICA0NjY2LCA0Njc1LCA0NjgxLCA0NzAxLCA0NzA3LCA0NzE2LCA0NzIyLCA0NzMzLAotICA0NzM5LCA0NzQ4LCA0NzU0LCA0Nzc5LCA0Nzg1LCA0Nzk0LCA0ODAwLCA0ODExLAotICA0ODE3LCA0ODI2LCA0ODMyLCA0ODUyLCA0ODU4LCA0ODY3LCA0ODczLCA0ODg0LAotICA0ODkwLCA0ODk5LCA0OTA1LCA0NzY5LCA0Nzc1LCA0Nzg0LCA0NzkwLCA0ODAxLAotICA0ODA3LCA0ODE2LCA0ODIyLCA0ODQyLCA0ODQ4LCA0ODU3LCA0ODYzLCA0ODc0LAotICA0ODgwLCA0ODg5LCA0ODk1LCA0OTIwLCA0OTI2LCA0OTM1LCA0OTQxLCA0OTUyLAotICA0OTU4LCA0OTY3LCA0OTczLCA0OTkzLCA0OTk5LCA1MDA4LCA1MDE0LCA1MDI1LAotICA1MDMxLCA1MDQwLCA1MDQ2LCA1MDY5LCA1MDc1LCA1MDg0LCA1MDkwLCA1MTAxLAotICA1MTA3LCA1MTE2LCA1MTIyLCA1MTQyLCA1MTQ4LCA1MTU3LCA1MTYzLCA1MTc0LAotICA1MTgwLCA1MTg5LCA1MTk1LCA1MjIwLCA1MjI2LCA1MjM1LCA1MjQxLCA1MjUyLAotICA1MjU4LCA1MjY3LCA1MjczLCA1MjkzLCA1Mjk5LCA1MzA4LCA1MzE0LCA1MzI1LAotICA1MzMxLCA1MzQwLCA1MzQ2LCA0NjA0LCA0NjEwLCA0NjE5LCA0NjI1LCA0NjM2LAotICA0NjQyLCA0NjUxLCA0NjU3LCA0Njc3LCA0NjgzLCA0NjkyLCA0Njk4LCA0NzA5LAotICA0NzE1LCA0NzI0LCA0NzMwLCA0NzU1LCA0NzYxLCA0NzcwLCA0Nzc2LCA0Nzg3LAotICA0NzkzLCA0ODAyLCA0ODA4LCA0ODI4LCA0ODM0LCA0ODQzLCA0ODQ5LCA0ODYwLAotICA0ODY2LCA0ODc1LCA0ODgxLCA0OTA0LCA0OTEwLCA0OTE5LCA0OTI1LCA0OTM2LAotICA0OTQyLCA0OTUxLCA0OTU3LCA0OTc3LCA0OTgzLCA0OTkyLCA0OTk4LCA1MDA5LAotICA1MDE1LCA1MDI0LCA1MDMwLCA1MDU1LCA1MDYxLCA1MDcwLCA1MDc2LCA1MDg3LAotICA1MDkzLCA1MTAyLCA1MTA4LCA1MTI4LCA1MTM0LCA1MTQzLCA1MTQ5LCA1MTYwLAotICA1MTY2LCA1MTc1LCA1MTgxLCA1MDQ1LCA1MDUxLCA1MDYwLCA1MDY2LCA1MDc3LAotICA1MDgzLCA1MDkyLCA1MDk4LCA1MTE4LCA1MTI0LCA1MTMzLCA1MTM5LCA1MTUwLAotICA1MTU2LCA1MTY1LCA1MTcxLCA1MTk2LCA1MjAyLCA1MjExLCA1MjE3LCA1MjI4LAotICA1MjM0LCA1MjQzLCA1MjQ5LCA1MjY5LCA1Mjc1LCA1Mjg0LCA1MjkwLCA1MzAxLAotICA1MzA3LCA1MzE2LCA1MzIyLCA1MzQ1LCA1MzUxLCA1MzYwLCA1MzY2LCA1Mzc3LAotICA1MzgzLCA1MzkyLCA1Mzk4LCA1NDE4LCA1NDI0LCA1NDMzLCA1NDM5LCA1NDUwLAotICA1NDU2LCA1NDY1LCA1NDcxLCA1NDk2LCA1NTAyLCA1NTExLCA1NTE3LCA1NTI4LAotICA1NTM0LCA1NTQzLCA1NTQ5LCA1NTY5LCA1NTc1LCA1NTg0LCA1NTkwLCA1NjAxLAotICA1NjA3LCA1NjE2LCA1NjIyLCA1NDE3LCA1NDIzLCA1NDMyLCA1NDM4LCA1NDQ5LAotICA1NDU1LCA1NDY0LCA1NDcwLCA1NDkwLCA1NDk2LCA1NTA1LCA1NTExLCA1NTIyLAotICA1NTI4LCA1NTM3LCA1NTQzLCA1NTY4LCA1NTc0LCA1NTgzLCA1NTg5LCA1NjAwLAotICA1NjA2LCA1NjE1LCA1NjIxLCA1NjQxLCA1NjQ3LCA1NjU2LCA1NjYyLCA1NjczLAotICA1Njc5LCA1Njg4LCA1Njk0LCA1NzE3LCA1NzIzLCA1NzMyLCA1NzM4LCA1NzQ5LAotICA1NzU1LCA1NzY0LCA1NzcwLCA1NzkwLCA1Nzk2LCA1ODA1LCA1ODExLCA1ODIyLAotICA1ODI4LCA1ODM3LCA1ODQzLCA1ODY4LCA1ODc0LCA1ODgzLCA1ODg5LCA1OTAwLAotICA1OTA2LCA1OTE1LCA1OTIxLCA1OTQxLCA1OTQ3LCA1OTU2LCA1OTYyLCA1OTczLAotICA1OTc5LCA1OTg4LCA1OTk0LCA1ODU4LCA1ODY0LCA1ODczLCA1ODc5LCA1ODkwLAotICA1ODk2LCA1OTA1LCA1OTExLCA1OTMxLCA1OTM3LCA1OTQ2LCA1OTUyLCA1OTYzLAotICA1OTY5LCA1OTc4LCA1OTg0LCA2MDA5LCA2MDE1LCA2MDI0LCA2MDMwLCA2MDQxLAotICA2MDQ3LCA2MDU2LCA2MDYyLCA2MDgyLCA2MDg4LCA2MDk3LCA2MTAzLCA2MTE0LAotICA2MTIwLCA2MTI5LCA2MTM1LCA2MTU4LCA2MTY0LCA2MTczLCA2MTc5LCA2MTkwLAotICA2MTk2LCA2MjA1LCA2MjExLCA2MjMxLCA2MjM3LCA2MjQ2LCA2MjUyLCA2MjYzLAotICA2MjY5LCA2Mjc4LCA2Mjg0LCA2MzA5LCA2MzE1LCA2MzI0LCA2MzMwLCA2MzQxLAotICA2MzQ3LCA2MzU2LCA2MzYyLCA2MzgyLCA2Mzg4LCA2Mzk3LCA2NDAzLCA2NDE0LAotICA2NDIwLCA2NDI5LCA2NDM1LCA1MzAzLCA1MzA5LCA1MzE4LCA1MzI0LCA1MzM1LAotICA1MzQxLCA1MzUwLCA1MzU2LCA1Mzc2LCA1MzgyLCA1MzkxLCA1Mzk3LCA1NDA4LAotICA1NDE0LCA1NDIzLCA1NDI5LCA1NDU0LCA1NDYwLCA1NDY5LCA1NDc1LCA1NDg2LAotICA1NDkyLCA1NTAxLCA1NTA3LCA1NTI3LCA1NTMzLCA1NTQyLCA1NTQ4LCA1NTU5LAotICA1NTY1LCA1NTc0LCA1NTgwLCA1NjAzLCA1NjA5LCA1NjE4LCA1NjI0LCA1NjM1LAotICA1NjQxLCA1NjUwLCA1NjU2LCA1Njc2LCA1NjgyLCA1NjkxLCA1Njk3LCA1NzA4LAotICA1NzE0LCA1NzIzLCA1NzI5LCA1NzU0LCA1NzYwLCA1NzY5LCA1Nzc1LCA1Nzg2LAotICA1NzkyLCA1ODAxLCA1ODA3LCA1ODI3LCA1ODMzLCA1ODQyLCA1ODQ4LCA1ODU5LAotICA1ODY1LCA1ODc0LCA1ODgwLCA1NzQ0LCA1NzUwLCA1NzU5LCA1NzY1LCA1Nzc2LAotICA1NzgyLCA1NzkxLCA1Nzk3LCA1ODE3LCA1ODIzLCA1ODMyLCA1ODM4LCA1ODQ5LAotICA1ODU1LCA1ODY0LCA1ODcwLCA1ODk1LCA1OTAxLCA1OTEwLCA1OTE2LCA1OTI3LAotICA1OTMzLCA1OTQyLCA1OTQ4LCA1OTY4LCA1OTc0LCA1OTgzLCA1OTg5LCA2MDAwLAotICA2MDA2LCA2MDE1LCA2MDIxLCA2MDQ0LCA2MDUwLCA2MDU5LCA2MDY1LCA2MDc2LAotICA2MDgyLCA2MDkxLCA2MDk3LCA2MTE3LCA2MTIzLCA2MTMyLCA2MTM4LCA2MTQ5LAotICA2MTU1LCA2MTY0LCA2MTcwLCA2MTk1LCA2MjAxLCA2MjEwLCA2MjE2LCA2MjI3LAotICA2MjMzLCA2MjQyLCA2MjQ4LCA2MjY4LCA2Mjc0LCA2MjgzLCA2Mjg5LCA2MzAwLAotICA2MzA2LCA2MzE1LCA2MzIxLCA2MTE2LCA2MTIyLCA2MTMxLCA2MTM3LCA2MTQ4LAotICA2MTU0LCA2MTYzLCA2MTY5LCA2MTg5LCA2MTk1LCA2MjA0LCA2MjEwLCA2MjIxLAotICA2MjI3LCA2MjM2LCA2MjQyLCA2MjY3LCA2MjczLCA2MjgyLCA2Mjg4LCA2Mjk5LAotICA2MzA1LCA2MzE0LCA2MzIwLCA2MzQwLCA2MzQ2LCA2MzU1LCA2MzYxLCA2MzcyLAotICA2Mzc4LCA2Mzg3LCA2MzkzLCA2NDE2LCA2NDIyLCA2NDMxLCA2NDM3LCA2NDQ4LAotICA2NDU0LCA2NDYzLCA2NDY5LCA2NDg5LCA2NDk1LCA2NTA0LCA2NTEwLCA2NTIxLAotICA2NTI3LCA2NTM2LCA2NTQyLCA2NTY3LCA2NTczLCA2NTgyLCA2NTg4LCA2NTk5LAotICA2NjA1LCA2NjE0LCA2NjIwLCA2NjQwLCA2NjQ2LCA2NjU1LCA2NjYxLCA2NjcyLAotICA2Njc4LCA2Njg3LCA2NjkzLCA2NTU3LCA2NTYzLCA2NTcyLCA2NTc4LCA2NTg5LAotICA2NTk1LCA2NjA0LCA2NjEwLCA2NjMwLCA2NjM2LCA2NjQ1LCA2NjUxLCA2NjYyLAotICA2NjY4LCA2Njc3LCA2NjgzLCA2NzA4LCA2NzE0LCA2NzIzLCA2NzI5LCA2NzQwLAotICA2NzQ2LCA2NzU1LCA2NzYxLCA2NzgxLCA2Nzg3LCA2Nzk2LCA2ODAyLCA2ODEzLAotICA2ODE5LCA2ODI4LCA2ODM0LCA2ODU3LCA2ODYzLCA2ODcyLCA2ODc4LCA2ODg5LAotICA2ODk1LCA2OTA0LCA2OTEwLCA2OTMwLCA2OTM2LCA2OTQ1LCA2OTUxLCA2OTYyLAotICA2OTY4LCA2OTc3LCA2OTgzLCA3MDA4LCA3MDE0LCA3MDIzLCA3MDI5LCA3MDQwLAotICA3MDQ2LCA3MDU1LCA3MDYxLCA3MDgxLCA3MDg3LCA3MDk2LCA3MTAyLCA3MTEzLAotICA3MTE5LCA3MTI4LCA3MTM0LCA2MzkyLCA2Mzk4LCA2NDA3LCA2NDEzLCA2NDI0LAotICA2NDMwLCA2NDM5LCA2NDQ1LCA2NDY1LCA2NDcxLCA2NDgwLCA2NDg2LCA2NDk3LAotICA2NTAzLCA2NTEyLCA2NTE4LCA2NTQzLCA2NTQ5LCA2NTU4LCA2NTY0LCA2NTc1LAotICA2NTgxLCA2NTkwLCA2NTk2LCA2NjE2LCA2NjIyLCA2NjMxLCA2NjM3LCA2NjQ4LAotICA2NjU0LCA2NjYzLCA2NjY5LCA2NjkyLCA2Njk4LCA2NzA3LCA2NzEzLCA2NzI0LAotICA2NzMwLCA2NzM5LCA2NzQ1LCA2NzY1LCA2NzcxLCA2NzgwLCA2Nzg2LCA2Nzk3LAotICA2ODAzLCA2ODEyLCA2ODE4LCA2ODQzLCA2ODQ5LCA2ODU4LCA2ODY0LCA2ODc1LAotICA2ODgxLCA2ODkwLCA2ODk2LCA2OTE2LCA2OTIyLCA2OTMxLCA2OTM3LCA2OTQ4LAotICA2OTU0LCA2OTYzLCA2OTY5LCA2ODMzLCA2ODM5LCA2ODQ4LCA2ODU0LCA2ODY1LAotICA2ODcxLCA2ODgwLCA2ODg2LCA2OTA2LCA2OTEyLCA2OTIxLCA2OTI3LCA2OTM4LAotICA2OTQ0LCA2OTUzLCA2OTU5LCA2OTg0LCA2OTkwLCA2OTk5LCA3MDA1LCA3MDE2LAotICA3MDIyLCA3MDMxLCA3MDM3LCA3MDU3LCA3MDYzLCA3MDcyLCA3MDc4LCA3MDg5LAotICA3MDk1LCA3MTA0LCA3MTEwLCA3MTMzLCA3MTM5LCA3MTQ4LCA3MTU0LCA3MTY1LAotICA3MTcxLCA3MTgwLCA3MTg2LCA3MjA2LCA3MjEyLCA3MjIxLCA3MjI3LCA3MjM4LAotICA3MjQ0LCA3MjUzLCA3MjU5LCA3Mjg0LCA3MjkwLCA3Mjk5LCA3MzA1LCA3MzE2LAotICA3MzIyLCA3MzMxLCA3MzM3LCA3MzU3LCA3MzYzLCA3MzcyLCA3Mzc4LCA3Mzg5LAotICA3Mzk1LCA3NDA0LCA3NDEwLCA3MjA1LCA3MjExLCA3MjIwLCA3MjI2LCA3MjM3LAotICA3MjQzLCA3MjUyLCA3MjU4LCA3Mjc4LCA3Mjg0LCA3MjkzLCA3Mjk5LCA3MzEwLAotICA3MzE2LCA3MzI1LCA3MzMxLCA3MzU2LCA3MzYyLCA3MzcxLCA3Mzc3LCA3Mzg4LAotICA3Mzk0LCA3NDAzLCA3NDA5LCA3NDI5LCA3NDM1LCA3NDQ0LCA3NDUwLCA3NDYxLAotICA3NDY3LCA3NDc2LCA3NDgyLCA3NTA1LCA3NTExLCA3NTIwLCA3NTI2LCA3NTM3LAotICA3NTQzLCA3NTUyLCA3NTU4LCA3NTc4LCA3NTg0LCA3NTkzLCA3NTk5LCA3NjEwLAotICA3NjE2LCA3NjI1LCA3NjMxLCA3NjU2LCA3NjYyLCA3NjcxLCA3Njc3LCA3Njg4LAotICA3Njk0LCA3NzAzLCA3NzA5LCA3NzI5LCA3NzM1LCA3NzQ0LCA3NzUwLCA3NzYxCi19OwotCi1zdGF0aWMgaW50IFZhcmlhYmxlTGV2ZWxDb3N0KGludCBsZXZlbCwgY29uc3QgdWludDhfdCBwcm9iYXNbTlVNX1BST0JBU10pIHsKLSAgaW50IHBhdHRlcm4gPSBWUDhMZXZlbENvZGVzW2xldmVsIC0gMV1bMF07Ci0gIGludCBiaXRzID0gVlA4TGV2ZWxDb2Rlc1tsZXZlbCAtIDFdWzFdOwotICBpbnQgY29zdCA9IDA7Ci0gIGludCBpOwotICBmb3IgKGkgPSAyOyBwYXR0ZXJuOyArK2kpIHsKLSAgICBpZiAocGF0dGVybiAmIDEpIHsKLSAgICAgIGNvc3QgKz0gVlA4Qml0Q29zdChiaXRzICYgMSwgcHJvYmFzW2ldKTsKLSAgICB9Ci0gICAgYml0cyA+Pj0gMTsKLSAgICBwYXR0ZXJuID4+PSAxOwotICB9Ci0gIHJldHVybiBjb3N0OwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gUHJlLWNhbGMgbGV2ZWwgY29zdHMgb25jZSBmb3IgYWxsCi0KLXZvaWQgVlA4Q2FsY3VsYXRlTGV2ZWxDb3N0cyhWUDhQcm9iYSogY29uc3QgcHJvYmEpIHsKLSAgaW50IGN0eXBlLCBiYW5kLCBjdHg7Ci0KLSAgaWYgKCFwcm9iYS0+ZGlydHlfKSByZXR1cm47ICAvLyBub3RoaW5nIHRvIGRvLgotCi0gIGZvciAoY3R5cGUgPSAwOyBjdHlwZSA8IE5VTV9UWVBFUzsgKytjdHlwZSkgewotICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBOVU1fQkFORFM7ICsrYmFuZCkgewotICAgICAgZm9yIChjdHggPSAwOyBjdHggPCBOVU1fQ1RYOyArK2N0eCkgewotICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBwID0gcHJvYmEtPmNvZWZmc19bY3R5cGVdW2JhbmRdW2N0eF07Ci0gICAgICAgIHVpbnQxNl90KiBjb25zdCB0YWJsZSA9IHByb2JhLT5sZXZlbF9jb3N0X1tjdHlwZV1bYmFuZF1bY3R4XTsKLSAgICAgICAgY29uc3QgaW50IGNvc3RfYmFzZSA9IFZQOEJpdENvc3QoMSwgcFsxXSk7Ci0gICAgICAgIGludCB2OwotICAgICAgICB0YWJsZVswXSA9IFZQOEJpdENvc3QoMCwgcFsxXSk7Ci0gICAgICAgIGZvciAodiA9IDE7IHYgPD0gTUFYX1ZBUklBQkxFX0xFVkVMOyArK3YpIHsKLSAgICAgICAgICB0YWJsZVt2XSA9IGNvc3RfYmFzZSArIFZhcmlhYmxlTGV2ZWxDb3N0KHYsIHApOwotICAgICAgICB9Ci0gICAgICAgIC8vIFN0YXJ0aW5nIGF0IGxldmVsIDY3IGFuZCB1cCwgdGhlIHZhcmlhYmxlIHBhcnQgb2YgdGhlIGNvc3QgaXMKLSAgICAgICAgLy8gYWN0dWFsbHkgY29uc3RhbnQuCi0gICAgICB9Ci0gICAgfQotICB9Ci0gIHByb2JhLT5kaXJ0eV8gPSAwOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTW9kZSBjb3N0IHRhYmxlcy4KLQotLy8gVGhlc2UgYXJlIHRoZSBmaXhlZCBwcm9iYWJpbGl0aWVzIChpbiB0aGUgY29kaW5nIHRyZWVzKSB0dXJuZWQgaW50byBiaXQtY29zdAotLy8gYnkgY2FsbGluZyBWUDhCaXRDb3N0KCkuCi1jb25zdCB1aW50MTZfdCBWUDhGaXhlZENvc3RzVVZbNF0gPSB7IDMwMiwgOTg0LCA0MzksIDY0MiB9OwotLy8gbm90ZTogdGhlc2UgdmFsdWVzIGluY2x1ZGUgdGhlIGZpeGVkIFZQOEJpdENvc3QoMSwgMTQ1KSBtb2RlIHNlbGVjdGlvbiBjb3N0LgotY29uc3QgdWludDE2X3QgVlA4Rml4ZWRDb3N0c0kxNls0XSA9IHsgNjYzLCA5MTksIDg3MiwgOTE5IH07Ci1jb25zdCB1aW50MTZfdCBWUDhGaXhlZENvc3RzSTRbTlVNX0JNT0RFU11bTlVNX0JNT0RFU11bTlVNX0JNT0RFU10gPSB7Ci0gIHsgeyAgMjUxLCAxMzYyLCAxOTM0LCAyMDg1LCAyMzE0LCAyMjMwLCAxODM5LCAxOTg4LCAyNDM3LCAyMzQ4IH0sCi0gICAgeyAgNDAzLCAgNjgwLCAxNTA3LCAxNTE5LCAyMDYwLCAyMDA1LCAxOTkyLCAxOTE0LCAxOTI0LCAxNzMzIH0sCi0gICAgeyAgMzUzLCAxMTIxLCAgOTczLCAxODk1LCAyMDYwLCAxNzg3LCAxNjcxLCAxNTE2LCAyMDEyLCAxODY4IH0sCi0gICAgeyAgNzcwLCAgODUyLCAxNTgxLCAgNjMyLCAxMzkzLCAxNzgwLCAxODIzLCAxOTM2LCAxMDc0LCAxMjE4IH0sCi0gICAgeyAgNTEwLCAxMjcwLCAxNDY3LCAxMzE5LCAgODQ3LCAxMjc5LCAxNzkyLCAyMDk0LCAxMDgwLCAxMzUzIH0sCi0gICAgeyAgNDg4LCAxMzIyLCAgOTE4LCAxNTczLCAxMzAwLCAgODgzLCAxODE0LCAxNzUyLCAxNzU2LCAxNTAyIH0sCi0gICAgeyAgNDI1LCAgOTkyLCAxODIwLCAxNTE0LCAxODQzLCAyNDQwLCAgOTM3LCAxNzcxLCAxOTI0LCAxMTI5IH0sCi0gICAgeyAgMzYzLCAxMjQ4LCAxMjU3LCAxOTcwLCAyMTk0LCAyMzg1LCAxNTY5LCAgOTUzLCAxOTUxLCAxNjAxIH0sCi0gICAgeyAgNzIzLCAxMjU3LCAxNjMxLCAgOTY0LCAgOTYzLCAxNTA4LCAxNjk3LCAxODI0LCAgNjcxLCAxNDE4IH0sCi0gICAgeyAgNjM1LCAxMDM4LCAxNTczLCAgOTMwLCAxNjczLCAxNDEzLCAxNDEwLCAxNjg3LCAxNDEwLCAgNzQ5IH0gfSwKLSAgeyB7ICA0NTEsICA2MTMsIDEzNDUsIDE3MDIsIDE4NzAsIDE3MTYsIDE3MjgsIDE3NjYsIDIxOTAsIDIzMTAgfSwKLSAgICB7ICA2NzgsICA0NTMsIDExNzEsIDE0NDMsIDE5MjUsIDE4MzEsIDIwNDUsIDE3ODEsIDE4ODcsIDE2MDIgfSwKLSAgICB7ICA3MTEsICA2NjYsICA2NzQsIDE3MTgsIDE5MTAsIDE0OTMsIDE3NzUsIDExOTMsIDIzMjUsIDIzMjUgfSwKLSAgICB7ICA4ODMsICA4NTQsIDE1ODMsICA1NDIsIDE4MDAsIDE4NzgsIDE2NjQsIDIxNDksIDEyMDcsIDEwODcgfSwKLSAgICB7ICA2NjksICA5OTQsIDEyNDgsIDExMjIsICA5NDksIDExNzksIDEzNzYsIDE3MjksIDEwNzAsIDEyNDQgfSwKLSAgICB7ICA3MTUsIDEwMjYsICA3MTUsIDEzNTAsIDE0MzAsICA5MzAsIDE3MTcsIDEyOTYsIDE0NzksIDE0NzkgfSwKLSAgICB7ICA1NDQsICA4NDEsIDE2NTYsIDE0NTAsIDIwOTQsIDM4ODMsIDEwMTAsIDE3NTksIDIwNzYsICA4MDkgfSwKLSAgICB7ICA2MTAsICA4NTUsICA5NTcsIDE1NTMsIDIwNjcsIDE1NjEsIDE3MDQsICA4MjQsIDIwNjYsIDEyMjYgfSwKLSAgICB7ICA4MzMsICA5NjAsIDE0MTYsICA4MTksIDEyNzcsIDE2MTksIDE1MDEsIDE2MTcsICA3NTcsIDExODIgfSwKLSAgICB7ICA3MTEsICA5NjQsIDEyNTIsICA4NzksIDE0NDEsIDE4MjgsIDE1MDgsIDE2MzYsIDE1OTQsICA3MzQgfSB9LAotICB7IHsgIDYwNSwgIDc2NCwgIDczNCwgMTcxMywgMTc0NywgMTE5MiwgMTgxOSwgMTM1MywgMTg3NywgMjM5MiB9LAotICAgIHsgIDg2NiwgIDY0MSwgIDU4NiwgMTYyMiwgMjA3MiwgMTQzMSwgMTg4OCwgMTM0NiwgMjE4OSwgMTc2NCB9LAotICAgIHsgIDkwMSwgIDg1MSwgIDQ1NiwgMjE2NSwgMjI4MSwgMTQwNSwgMTczOSwgMTE5MywgMjE4MywgMjQ0MyB9LAotICAgIHsgIDc3MCwgMTA0NSwgIDk1MiwgMTA3OCwgMTM0MiwgMTE5MSwgMTQzNiwgMTA2MywgMTMwMywgIDk5NSB9LAotICAgIHsgIDkwMSwgMTA4NiwgIDcyNywgMTE3MCwgIDg4NCwgMTEwNSwgMTI2NywgMTQwMSwgMTczOSwgMTMzNyB9LAotICAgIHsgIDk1MSwgMTE2MiwgIDU5NSwgMTQ4OCwgMTM4OCwgIDcwMywgMTc5MCwgMTM2NiwgMjA1NywgMTcyNCB9LAotICAgIHsgIDUzNCwgIDk4NiwgMTI3MywgMTk4NywgMzI3MywgMTQ4NSwgMTAyNCwgMTM5OSwgMTU4MywgIDg2NiB9LAotICAgIHsgIDY5OSwgMTE4MiwgIDY5NSwgMTk3OCwgMTcyNiwgMTk4NiwgMTMyNiwgIDcxNCwgMTc1MCwgMTY3MiB9LAotICAgIHsgIDk1MSwgMTIxNywgMTIwOSwgIDkyMCwgMTA2MiwgMTQ0MSwgMTU0OCwgIDk5OSwgIDk1MiwgIDkzMiB9LAotICAgIHsgIDczMywgMTI4NCwgIDc4NCwgMTI1NiwgMTU1NywgMTA5OCwgMTI1NywgMTM1NywgMTQxNCwgIDkwOCB9IH0sCi0gIHsgeyAgMzE2LCAxMDc1LCAxNjUzLCAxMjIwLCAyMTQ1LCAyMDUxLCAxNzMwLCAyMTMxLCAxODg0LCAxNzkwIH0sCi0gICAgeyAgNzQ1LCAgNTE2LCAxNDA0LCAgODk0LCAxNTk5LCAyMzc1LCAyMDEzLCAyMTA1LCAxNDc1LCAxMzgxIH0sCi0gICAgeyAgNTE2LCAgNzI5LCAxMDg4LCAxMzE5LCAxNjM3LCAzNDI2LCAxNjM2LCAxMjc1LCAxNTMxLCAxNDUzIH0sCi0gICAgeyAgODk0LCAgOTQzLCAyMTM4LCAgNDY4LCAxNzA0LCAyMjU5LCAyMDY5LCAxNzYzLCAxMjY2LCAxMTU4IH0sCi0gICAgeyAgNjA1LCAxMDI1LCAxMjM1LCAgODcxLCAxMTcwLCAxNzY3LCAxNDkzLCAxNTAwLCAxMTA0LCAxMjU4IH0sCi0gICAgeyAgNzM5LCAgODI2LCAxMjA3LCAxMTUxLCAxNDEyLCAgODQ2LCAxMzA1LCAyNzI2LCAxMDE0LCAxNTY5IH0sCi0gICAgeyAgNTU4LCAgODI1LCAxODIwLCAxMzk4LCAzMzQ0LCAxNTU2LCAxMjE4LCAxNTUwLCAxMjI4LCAgODc4IH0sCi0gICAgeyAgNDI5LCAgOTUxLCAxMDg5LCAxODE2LCAzODYxLCAzODYxLCAxNTU2LCAgOTY5LCAxNTY4LCAxODI4IH0sCi0gICAgeyAgODgzLCAgOTYxLCAxNzUyLCAgNzY5LCAxNDY4LCAxODEwLCAyMDgxLCAyMzQ2LCAgNjEzLCAxMjk4IH0sCi0gICAgeyAgODAzLCAgODk1LCAxMzcyLCAgNjQxLCAxMzAzLCAxNzA4LCAxNjg2LCAxNzAwLCAxMzA2LCAxMDMzIH0gfSwKLSAgeyB7ICA0MzksIDEyNjcsIDEyNzAsIDE1NzksICA5NjMsIDExOTMsIDE3MjMsIDE3MjksIDExOTgsIDE5OTMgfSwKLSAgICB7ICA3MDUsICA3MjUsIDEwMjksIDExNTMsIDExNzYsIDExMDMsIDE4MjEsIDE1NjcsIDEyNTksIDE1NzQgfSwKLSAgICB7ICA3MjMsICA4NTksICA4MDIsIDEyNTMsICA5NzIsIDEyMDIsIDE0MDcsIDE2NjUsIDE1MjAsIDE2NzQgfSwKLSAgICB7ICA4OTQsICA5NjAsIDEyNTQsICA4ODcsIDEwNTIsIDE2MDcsIDEzNDQsIDEzNDksICA4NjUsIDExNTAgfSwKLSAgICB7ICA4MzMsIDEzMTIsIDEzMzcsIDEyMDUsICA1NzIsIDEyODgsIDE0MTQsIDE1MjksIDEwODgsIDE0MzAgfSwKLSAgICB7ICA4NDIsIDEyNzksIDEwNjgsIDE4NjEsICA4NjIsICA2ODgsIDE4NjEsIDE2MzAsIDEwMzksIDEzODEgfSwKLSAgICB7ICA3NjYsICA5MzgsIDEyNzksIDE1NDYsIDMzMzgsIDE1NTAsIDEwMzEsIDE1NDIsIDEyODgsICA2NDAgfSwKLSAgICB7ICA3MTUsIDEwOTAsICA4MzUsIDE2MDksIDExMDAsIDExMDAsIDE2MDMsIDEwMTksIDExMDIsIDE2MTcgfSwKLSAgICB7ICA4OTQsIDE4MTMsIDE1MDAsIDExODgsICA3ODksIDExOTQsIDE0OTEsIDE5MTksICA2MTcsIDEzMzMgfSwKLSAgICB7ICA2MTAsIDEwNzYsIDE2NDQsIDEyODEsIDEyODMsICA5NzUsIDExNzksIDE2ODgsIDE0MzQsICA4ODkgfSB9LAotICB7IHsgIDU0NCwgIDk3MSwgMTE0NiwgMTg0OSwgMTIyMSwgIDc0MCwgMTg1NywgMTYyMSwgMTY4MywgMjQzMCB9LAotICAgIHsgIDcyMywgIDcwNSwgIDk2MSwgMTM3MSwgMTQyNiwgIDgyMSwgMjA4MSwgMjA3OSwgMTgzOSwgMTM4MCB9LAotICAgIHsgIDc4MywgIDg1NywgIDcwMywgMjE0NSwgMTQxOSwgIDgxNCwgMTc5MSwgMTMxMCwgMTYwOSwgMjIwNiB9LAotICAgIHsgIDk5NywgMTAwMCwgMTE1MywgIDc5MiwgMTIyOSwgMTE2MiwgMTgxMCwgMTQxOCwgIDk0MiwgIDk3OSB9LAotICAgIHsgIDkwMSwgMTIyNiwgIDg4MywgMTI4OSwgIDc5MywgIDcxNSwgMTkwNCwgMTY0OSwgMTMxOSwgMzEwOCB9LAotICAgIHsgIDk3OSwgMTQ3OCwgIDc4MiwgMjIxNiwgMTQ1NCwgIDQ1NSwgMzA5MiwgMTU5MSwgMTk5NywgMTY2NCB9LAotICAgIHsgIDY2MywgMTExMCwgMTUwNCwgMTExNCwgMTUyMiwgMzMxMSwgIDY3NiwgMTUyMiwgMTUzMCwgMTAyNCB9LAotICAgIHsgIDYwNSwgMTEzOCwgMTE1MywgMTMxNCwgMTU2OSwgMTMxNSwgMTE1NywgIDgwNCwgMTU3NCwgMTMyMCB9LAotICAgIHsgIDc3MCwgMTIxNiwgMTIxOCwgMTIyNywgIDg2OSwgMTM4NCwgMTIzMiwgMTM3NSwgIDgzNCwgMTIzOSB9LAotICAgIHsgIDc3NSwgMTAwNywgIDg0MywgMTIxNiwgMTIyNSwgMTA3NCwgMjUyNywgMTQ3OSwgMTE0OSwgIDk3NSB9IH0sCi0gIHsgeyAgNDc3LCAgODE3LCAxMzA5LCAxNDM5LCAxNzA4LCAxNDU0LCAxMTU5LCAxMjQxLCAxOTQ1LCAxNjcyIH0sCi0gICAgeyAgNTc3LCAgNzk2LCAxMTEyLCAxMjcxLCAxNjE4LCAxNDU4LCAxMDg3LCAxMzQ1LCAxODMxLCAxMjY1IH0sCi0gICAgeyAgNjYzLCAgNzc2LCAgNzUzLCAxOTQwLCAxNjkwLCAxNjkwLCAxMjI3LCAxMDk3LCAzMTQ5LCAxMzYxIH0sCi0gICAgeyAgNzY2LCAxMjk5LCAxNzQ0LCAxMTYxLCAxNTY1LCAxMTA2LCAxMDQ1LCAxMjMwLCAxMjMyLCAgNzA3IH0sCi0gICAgeyAgOTE1LCAxMDI2LCAxNDA0LCAxMTgyLCAxMTg0LCAgODUxLCAxNDI4LCAyNDI1LCAxMDQzLCAgNzg5IH0sCi0gICAgeyAgODgzLCAxNDU2LCAgNzkwLCAxMDgyLCAxMDg2LCAgOTg1LCAxMDgzLCAxNDg0LCAxMjM4LCAxMTYwIH0sCi0gICAgeyAgNTA3LCAxMzQ1LCAyMjYxLCAxOTk1LCAxODQ3LCAzNjM2LCAgNjUzLCAxNzYxLCAyMjg3LCAgOTMzIH0sCi0gICAgeyAgNTUzLCAxMTkzLCAxNDcwLCAyMDU3LCAyMDU5LCAyMDU5LCAgODMzLCAgNzc5LCAyMDU4LCAxMjYzIH0sCi0gICAgeyAgNzY2LCAxMjc1LCAxNTE1LCAxMDM5LCAgOTU3LCAxNTU0LCAxMjg2LCAxNTQwLCAxMjg5LCAgNzA1IH0sCi0gICAgeyAgNDk5LCAxMzc4LCAxNDk2LCAxMzg1LCAxODUwLCAxODUwLCAxMDQ0LCAyNDY1LCAxNTE1LCAgNzIwIH0gfSwKLSAgeyB7ICA1NTMsICA5MzAsICA5NzgsIDIwNzcsIDE5NjgsIDE0ODEsIDE0NTcsICA3NjEsIDE5NTcsIDIzNjIgfSwKLSAgICB7ICA2OTQsICA4NjQsICA5MDUsIDE3MjAsIDE2NzAsIDE2MjEsIDE0MjksICA3MTgsIDIxMjUsIDE0NzcgfSwKLSAgICB7ICA2OTksICA5NjgsICA2NTgsIDMxOTAsIDIwMjQsIDE0NzksIDE4NjUsICA3NTAsIDIwNjAsIDIzMjAgfSwKLSAgICB7ICA3MzMsIDEzMDgsIDEyOTYsIDEwNjIsIDE1NzYsIDEzMjIsIDEwNjIsIDExMTIsIDExNzIsICA4MTYgfSwKLSAgICB7ICA5MjAsICA5MjcsIDEwNTIsICA5MzksICA5NDcsIDExNTYsIDExNTIsIDEwNzMsIDMwNTYsIDEyNjggfSwKLSAgICB7ICA3MjMsIDE1MzQsICA3MTEsIDE1NDcsIDEyOTQsICA4OTIsIDE1NTMsICA5MjgsIDE4MTUsIDE1NjEgfSwKLSAgICB7ICA2NjMsIDEzNjYsIDE1ODMsIDIxMTEsIDE3MTIsIDM1MDEsICA1MjIsIDExNTUsIDIxMzAsIDExMzMgfSwKLSAgICB7ICA2MTQsIDE3MzEsIDExODgsIDIzNDMsIDE5NDQsIDM3MzMsIDEyODcsICA0ODcsIDM1NDYsIDE3NTggfSwKLSAgICB7ICA3NzAsIDE1ODUsIDEzMTIsICA4MjYsICA4ODQsIDI2NzMsIDExODUsIDEwMDYsIDExOTUsIDExOTUgfSwKLSAgICB7ICA3NTgsIDEzMzMsIDEyNzMsIDEwMjMsIDE2MjEsIDExNjIsIDEzNTEsICA4MzMsIDE0NzksICA4NjIgfSB9LAotICB7IHsgIDM3NiwgMTE5MywgMTQ0NiwgMTE0OSwgMTU0NSwgMTU3NywgMTg3MCwgMTc4OSwgMTE3NSwgMTgyMyB9LAotICAgIHsgIDgwMywgIDYzMywgMTEzNiwgMTA1OCwgMTM1MCwgMTMyMywgMTU5OCwgMjI0NywgMTA3MiwgMTI1MiB9LAotICAgIHsgIDYxNCwgMTA0OCwgIDk0MywgIDk4MSwgMTE1MiwgMTg2OSwgMTQ2MSwgMTAyMCwgMTYxOCwgMTYxOCB9LAotICAgIHsgMTEwNywgMTA4NSwgMTI4MiwgIDU5MiwgMTc3OSwgMTkzMywgMTY0OCwgMjQwMywgIDY5MSwgMTI0NiB9LAotICAgIHsgIDg1MSwgMTMwOSwgMTIyMywgMTI0MywgIDg5NSwgMTU5MywgMTc5MiwgMjMxNywgIDYyNywgMTA3NiB9LAotICAgIHsgIDc3MCwgMTIxNiwgMTAzMCwgMTEyNSwgIDkyMSwgIDk4MSwgMTYyOSwgMTEzMSwgMTA0OSwgMTY0NiB9LAotICAgIHsgIDYyNiwgMTQ2OSwgMTQ1NiwgMTA4MSwgMTQ4OSwgMzI3OCwgIDk4MSwgMTIzMiwgMTQ5OCwgIDczMyB9LAotICAgIHsgIDYxNywgMTIwMSwgIDgxMiwgMTIyMCwgMTQ3NiwgMTQ3NiwgMTQ3OCwgIDk3MCwgMTIyOCwgMTQ4OCB9LAotICAgIHsgMTE3OSwgMTM5MywgMTU0MCwgIDk5OSwgMTI0MywgMTUwMywgMTkxNiwgMTkyNSwgIDQxNCwgMTYxNCB9LAotICAgIHsgIDk0MywgMTA4OCwgMTQ5MCwgIDY4MiwgMTExMiwgMTM3MiwgMTc1NiwgMTUwNSwgIDk2NiwgIDk2NiB9IH0sCi0gIHsgeyAgMzIyLCAxMTQyLCAxNTg5LCAxMzk2LCAyMTQ0LCAxODU5LCAxMzU5LCAxOTI1LCAyMDg0LCAxNTE4IH0sCi0gICAgeyAgNjE3LCAgNjI1LCAxMjQxLCAxMjM0LCAyMTIxLCAxNjE1LCAxNTI0LCAxODU4LCAxNzIwLCAxMDA0IH0sCi0gICAgeyAgNTUzLCAgODUxLCAgNzg2LCAxMjk5LCAxNDUyLCAxNTYwLCAxMzcyLCAxNTYxLCAxOTY3LCAxNzEzIH0sCi0gICAgeyAgNzcwLCAgOTc3LCAxMzk2LCAgNTY4LCAxODkzLCAxNjM5LCAxNTQwLCAyMTA4LCAxNDMwLCAxMDEzIH0sCi0gICAgeyAgNjg0LCAxMTIwLCAxMzc1LCAgOTgyLCAgOTMwLCAyNzE5LCAxNjM4LCAxNjQzLCAgOTMzLCAgOTkzIH0sCi0gICAgeyAgNTUzLCAxMTAzLCAgOTk2LCAxMzU2LCAxMzYxLCAxMDA1LCAxNTA3LCAxNzYxLCAxMTg0LCAxMjY4IH0sCi0gICAgeyAgNDE5LCAxMjQ3LCAxNTM3LCAxNTU0LCAxODE3LCAzNjA2LCAxMDI2LCAxNjY2LCAxODI5LCAgOTIzIH0sCi0gICAgeyAgNDM5LCAxMTM5LCAxMTAxLCAxMjU3LCAzNzEwLCAxOTIyLCAxMjA1LCAxMDQwLCAxOTMxLCAxNTI5IH0sCi0gICAgeyAgOTc5LCAgOTM1LCAxMjY5LCAgODQ3LCAxMjAyLCAxMjg2LCAxNTMwLCAxNTM1LCAgODI3LCAxMDM2IH0sCi0gICAgeyAgNTE2LCAxMzc4LCAxNTY5LCAxMTEwLCAxNzk4LCAxNzk4LCAxMTk4LCAyMTk5LCAxNTQzLCAgNzEyIH0gfSwKLX07Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL2Nvc3QuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy9jb3N0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkN2MyYzcuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL2Nvc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBDb3N0IHRhYmxlcyBmb3IgbGV2ZWwgYW5kIG1vZGVzLgotLy8KLS8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCi0KLSNpZm5kZWYgV0VCUF9FTkNfQ09TVF9IXwotI2RlZmluZSBXRUJQX0VOQ19DT1NUX0hfCi0KLSNpbmNsdWRlICIuL3ZwOGVuY2kuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8vIGFwcHJveGltYXRlIGNvc3QgcGVyIGxldmVsOgotZXh0ZXJuIGNvbnN0IHVpbnQxNl90IFZQOExldmVsRml4ZWRDb3N0c1tNQVhfTEVWRUwgKyAxXTsKLWV4dGVybiBjb25zdCB1aW50MTZfdCBWUDhFbnRyb3B5Q29zdFsyNTZdOyAgICAgICAgLy8gOGJpdCBmaXhlZC1wb2ludCBsb2cocCkKLQotLy8gQ29zdCBvZiBjb2Rpbmcgb25lIGV2ZW50IHdpdGggcHJvYmFiaWxpdHkgJ3Byb2JhJy4KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4Qml0Q29zdChpbnQgYml0LCB1aW50OF90IHByb2JhKSB7Ci0gIHJldHVybiAhYml0ID8gVlA4RW50cm9weUNvc3RbcHJvYmFdIDogVlA4RW50cm9weUNvc3RbMjU1IC0gcHJvYmFdOwotfQotCi0vLyBMZXZlbCBjb3N0IGNhbGN1bGF0aW9ucwotZXh0ZXJuIGNvbnN0IHVpbnQxNl90IFZQOExldmVsQ29kZXNbTUFYX1ZBUklBQkxFX0xFVkVMXVsyXTsKLXZvaWQgVlA4Q2FsY3VsYXRlTGV2ZWxDb3N0cyhWUDhQcm9iYSogY29uc3QgcHJvYmEpOwotc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhMZXZlbENvc3QoY29uc3QgdWludDE2X3QqIGNvbnN0IHRhYmxlLCBpbnQgbGV2ZWwpIHsKLSAgcmV0dXJuIFZQOExldmVsRml4ZWRDb3N0c1tsZXZlbF0KLSAgICAgICArIHRhYmxlWyhsZXZlbCA+IE1BWF9WQVJJQUJMRV9MRVZFTCkgPyBNQVhfVkFSSUFCTEVfTEVWRUwgOiBsZXZlbF07Ci19Ci0KLS8vIE1vZGUgY29zdHMKLWV4dGVybiBjb25zdCB1aW50MTZfdCBWUDhGaXhlZENvc3RzVVZbNF07Ci1leHRlcm4gY29uc3QgdWludDE2X3QgVlA4Rml4ZWRDb3N0c0kxNls0XTsKLWV4dGVybiBjb25zdCB1aW50MTZfdCBWUDhGaXhlZENvc3RzSTRbTlVNX0JNT0RFU11bTlVNX0JNT0RFU11bTlVNX0JNT0RFU107Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgotCi0jZW5kaWYgIC8qIFdFQlBfRU5DX0NPU1RfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy9maWx0ZXIuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy9maWx0ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM3NzI3Yy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvZmlsdGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MTUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIFNlbGVjdGluZyBmaWx0ZXIgbGV2ZWwKLS8vCi0vLyBBdXRob3I6IHNvbW5hdGhAZ29vZ2xlLmNvbSAoU29tbmF0aCBCYW5lcmplZSkKLQotI2luY2x1ZGUgIi4vdnA4ZW5jaS5oIgotCi0jaWYgZGVmaW5lbmQoU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLy8gTk9URTogY2xpcDEsIHRhYmxlcyBhbmQgSW5pdFRhYmxlcyBhcmUgcmVwZWF0ZWQgZW50cmllcyBvZiBkc3AuYwotc3RhdGljIHVpbnQ4X3QgYWJzMFsyNTUgKyAyNTUgKyAxXTsgICAgIC8vIGFicyhpKQotc3RhdGljIHVpbnQ4X3QgYWJzMVsyNTUgKyAyNTUgKyAxXTsgICAgIC8vIGFicyhpKT4+MQotc3RhdGljIGludDhfdCBzY2xpcDFbMTAyMCArIDEwMjAgKyAxXTsgIC8vIGNsaXBzIFstMTAyMCwgMTAyMF0gdG8gWy0xMjgsIDEyN10KLXN0YXRpYyBpbnQ4X3Qgc2NsaXAyWzExMiArIDExMiArIDFdOyAgICAvLyBjbGlwcyBbLTExMiwgMTEyXSB0byBbLTE2LCAxNV0KLXN0YXRpYyB1aW50OF90IGNsaXAxWzI1NSArIDUxMCArIDFdOyAgICAvLyBjbGlwcyBbLTI1NSw1MTBdIHRvIFswLDI1NV0KLQotc3RhdGljIGludCB0YWJsZXNfb2sgPSAwOwotCi1zdGF0aWMgdm9pZCBJbml0VGFibGVzKHZvaWQpIHsKLSAgaWYgKCF0YWJsZXNfb2spIHsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAtMjU1OyBpIDw9IDI1NTsgKytpKSB7Ci0gICAgICBhYnMwWzI1NSArIGldID0gKGkgPCAwKSA/IC1pIDogaTsKLSAgICAgIGFiczFbMjU1ICsgaV0gPSBhYnMwWzI1NSArIGldID4+IDE7Ci0gICAgfQotICAgIGZvciAoaSA9IC0xMDIwOyBpIDw9IDEwMjA7ICsraSkgewotICAgICAgc2NsaXAxWzEwMjAgKyBpXSA9IChpIDwgLTEyOCkgPyAtMTI4IDogKGkgPiAxMjcpID8gMTI3IDogaTsKLSAgICB9Ci0gICAgZm9yIChpID0gLTExMjsgaSA8PSAxMTI7ICsraSkgewotICAgICAgc2NsaXAyWzExMiArIGldID0gKGkgPCAtMTYpID8gLTE2IDogKGkgPiAxNSkgPyAxNSA6IGk7Ci0gICAgfQotICAgIGZvciAoaSA9IC0yNTU7IGkgPD0gMjU1ICsgMjU1OyArK2kpIHsKLSAgICAgIGNsaXAxWzI1NSArIGldID0gKGkgPCAwKSA/IDAgOiAoaSA+IDI1NSkgPyAyNTUgOiBpOwotICAgIH0KLSAgICB0YWJsZXNfb2sgPSAxOwotICB9Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBFZGdlIGZpbHRlcmluZyBmdW5jdGlvbnMKLQotLy8gNCBwaXhlbHMgaW4sIDIgcGl4ZWxzIG91dAotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgZG9fZmlsdGVyMih1aW50OF90KiBwLCBpbnQgc3RlcCkgewotICBjb25zdCBpbnQgcDEgPSBwWy0yKnN0ZXBdLCBwMCA9IHBbLXN0ZXBdLCBxMCA9IHBbMF0sIHExID0gcFtzdGVwXTsKLSAgY29uc3QgaW50IGEgPSAzICogKHEwIC0gcDApICsgc2NsaXAxWzEwMjAgKyBwMSAtIHExXTsKLSAgY29uc3QgaW50IGExID0gc2NsaXAyWzExMiArICgoYSArIDQpID4+IDMpXTsKLSAgY29uc3QgaW50IGEyID0gc2NsaXAyWzExMiArICgoYSArIDMpID4+IDMpXTsKLSAgcFstc3RlcF0gPSBjbGlwMVsyNTUgKyBwMCArIGEyXTsKLSAgcFsgICAgMF0gPSBjbGlwMVsyNTUgKyBxMCAtIGExXTsKLX0KLQotLy8gNCBwaXhlbHMgaW4sIDQgcGl4ZWxzIG91dAotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgZG9fZmlsdGVyNCh1aW50OF90KiBwLCBpbnQgc3RlcCkgewotICBjb25zdCBpbnQgcDEgPSBwWy0yKnN0ZXBdLCBwMCA9IHBbLXN0ZXBdLCBxMCA9IHBbMF0sIHExID0gcFtzdGVwXTsKLSAgY29uc3QgaW50IGEgPSAzICogKHEwIC0gcDApOwotICBjb25zdCBpbnQgYTEgPSBzY2xpcDJbMTEyICsgKChhICsgNCkgPj4gMyldOwotICBjb25zdCBpbnQgYTIgPSBzY2xpcDJbMTEyICsgKChhICsgMykgPj4gMyldOwotICBjb25zdCBpbnQgYTMgPSAoYTEgKyAxKSA+PiAxOwotICBwWy0yKnN0ZXBdID0gY2xpcDFbMjU1ICsgcDEgKyBhM107Ci0gIHBbLSAgc3RlcF0gPSBjbGlwMVsyNTUgKyBwMCArIGEyXTsKLSAgcFsgICAgICAwXSA9IGNsaXAxWzI1NSArIHEwIC0gYTFdOwotICBwWyAgIHN0ZXBdID0gY2xpcDFbMjU1ICsgcTEgLSBhM107Ci19Ci0KLS8vIGhpZ2ggZWRnZS12YXJpYW5jZQotc3RhdGljIFdFQlBfSU5MSU5FIGludCBoZXYoY29uc3QgdWludDhfdCogcCwgaW50IHN0ZXAsIGludCB0aHJlc2gpIHsKLSAgY29uc3QgaW50IHAxID0gcFstMipzdGVwXSwgcDAgPSBwWy1zdGVwXSwgcTAgPSBwWzBdLCBxMSA9IHBbc3RlcF07Ci0gIHJldHVybiAoYWJzMFsyNTUgKyBwMSAtIHAwXSA+IHRocmVzaCkgfHwgKGFiczBbMjU1ICsgcTEgLSBxMF0gPiB0aHJlc2gpOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IG5lZWRzX2ZpbHRlcihjb25zdCB1aW50OF90KiBwLCBpbnQgc3RlcCwgaW50IHRocmVzaCkgewotICBjb25zdCBpbnQgcDEgPSBwWy0yKnN0ZXBdLCBwMCA9IHBbLXN0ZXBdLCBxMCA9IHBbMF0sIHExID0gcFtzdGVwXTsKLSAgcmV0dXJuICgyICogYWJzMFsyNTUgKyBwMCAtIHEwXSArIGFiczFbMjU1ICsgcDEgLSBxMV0pIDw9IHRocmVzaDsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIGludCBuZWVkc19maWx0ZXIyKGNvbnN0IHVpbnQ4X3QqIHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0ZXAsIGludCB0LCBpbnQgaXQpIHsKLSAgY29uc3QgaW50IHAzID0gcFstNCpzdGVwXSwgcDIgPSBwWy0zKnN0ZXBdLCBwMSA9IHBbLTIqc3RlcF0sIHAwID0gcFstc3RlcF07Ci0gIGNvbnN0IGludCBxMCA9IHBbMF0sIHExID0gcFtzdGVwXSwgcTIgPSBwWzIqc3RlcF0sIHEzID0gcFszKnN0ZXBdOwotICBpZiAoKDIgKiBhYnMwWzI1NSArIHAwIC0gcTBdICsgYWJzMVsyNTUgKyBwMSAtIHExXSkgPiB0KQotICAgIHJldHVybiAwOwotICByZXR1cm4gYWJzMFsyNTUgKyBwMyAtIHAyXSA8PSBpdCAmJiBhYnMwWzI1NSArIHAyIC0gcDFdIDw9IGl0ICYmCi0gICAgICAgICBhYnMwWzI1NSArIHAxIC0gcDBdIDw9IGl0ICYmIGFiczBbMjU1ICsgcTMgLSBxMl0gPD0gaXQgJiYKLSAgICAgICAgIGFiczBbMjU1ICsgcTIgLSBxMV0gPD0gaXQgJiYgYWJzMFsyNTUgKyBxMSAtIHEwXSA8PSBpdDsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFNpbXBsZSBJbi1sb29wIGZpbHRlcmluZyAoUGFyYWdyYXBoIDE1LjIpCi0KLXN0YXRpYyB2b2lkIFNpbXBsZVZGaWx0ZXIxNih1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKSB7Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgewotICAgIGlmIChuZWVkc19maWx0ZXIocCArIGksIHN0cmlkZSwgdGhyZXNoKSkgewotICAgICAgZG9fZmlsdGVyMihwICsgaSwgc3RyaWRlKTsKLSAgICB9Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgU2ltcGxlSEZpbHRlcjE2KHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsIGludCB0aHJlc2gpIHsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSB7Ci0gICAgaWYgKG5lZWRzX2ZpbHRlcihwICsgaSAqIHN0cmlkZSwgMSwgdGhyZXNoKSkgewotICAgICAgZG9fZmlsdGVyMihwICsgaSAqIHN0cmlkZSwgMSk7Ci0gICAgfQotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIFNpbXBsZVZGaWx0ZXIxNmkodWludDhfdCogcCwgaW50IHN0cmlkZSwgaW50IHRocmVzaCkgewotICBpbnQgazsKLSAgZm9yIChrID0gMzsgayA+IDA7IC0taykgewotICAgIHAgKz0gNCAqIHN0cmlkZTsKLSAgICBTaW1wbGVWRmlsdGVyMTYocCwgc3RyaWRlLCB0aHJlc2gpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIFNpbXBsZUhGaWx0ZXIxNmkodWludDhfdCogcCwgaW50IHN0cmlkZSwgaW50IHRocmVzaCkgewotICBpbnQgazsKLSAgZm9yIChrID0gMzsgayA+IDA7IC0taykgewotICAgIHAgKz0gNDsKLSAgICBTaW1wbGVIRmlsdGVyMTYocCwgc3RyaWRlLCB0aHJlc2gpOwotICB9Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb21wbGV4IEluLWxvb3AgZmlsdGVyaW5nIChQYXJhZ3JhcGggMTUuMykKLQotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRmlsdGVyTG9vcDI0KHVpbnQ4X3QqIHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhzdHJpZGUsIGludCB2c3RyaWRlLCBpbnQgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKLSAgd2hpbGUgKHNpemUtLSA+IDApIHsKLSAgICBpZiAobmVlZHNfZmlsdGVyMihwLCBoc3RyaWRlLCB0aHJlc2gsIGl0aHJlc2gpKSB7Ci0gICAgICBpZiAoaGV2KHAsIGhzdHJpZGUsIGhldl90aHJlc2gpKSB7Ci0gICAgICAgIGRvX2ZpbHRlcjIocCwgaHN0cmlkZSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBkb19maWx0ZXI0KHAsIGhzdHJpZGUpOwotICAgICAgfQotICAgIH0KLSAgICBwICs9IHZzdHJpZGU7Ci0gIH0KLX0KLQotLy8gb24gdGhyZWUgaW5uZXIgZWRnZXMKLXN0YXRpYyB2b2lkIFZGaWx0ZXIxNmkodWludDhfdCogcCwgaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7Ci0gIGludCBrOwotICBmb3IgKGsgPSAzOyBrID4gMDsgLS1rKSB7Ci0gICAgcCArPSA0ICogc3RyaWRlOwotICAgIEZpbHRlckxvb3AyNChwLCBzdHJpZGUsIDEsIDE2LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIEhGaWx0ZXIxNmkodWludDhfdCogcCwgaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7Ci0gIGludCBrOwotICBmb3IgKGsgPSAzOyBrID4gMDsgLS1rKSB7Ci0gICAgcCArPSA0OwotICAgIEZpbHRlckxvb3AyNChwLCAxLCBzdHJpZGUsIDE2LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIFZGaWx0ZXI4aSh1aW50OF90KiB1LCB1aW50OF90KiB2LCBpbnQgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgewotICBGaWx0ZXJMb29wMjQodSArIDQgKiBzdHJpZGUsIHN0cmlkZSwgMSwgOCwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKLSAgRmlsdGVyTG9vcDI0KHYgKyA0ICogc3RyaWRlLCBzdHJpZGUsIDEsIDgsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7Ci19Ci0KLXN0YXRpYyB2b2lkIEhGaWx0ZXI4aSh1aW50OF90KiB1LCB1aW50OF90KiB2LCBpbnQgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgewotICBGaWx0ZXJMb29wMjQodSArIDQsIDEsIHN0cmlkZSwgOCwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKLSAgRmlsdGVyTG9vcDI0KHYgKyA0LCAxLCBzdHJpZGUsIDgsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgKCpWUDhFbmNWRmlsdGVyMTZpKSh1aW50OF90KiwgaW50LCBpbnQsIGludCwgaW50KSA9IFZGaWx0ZXIxNmk7Ci12b2lkICgqVlA4RW5jSEZpbHRlcjE2aSkodWludDhfdCosIGludCwgaW50LCBpbnQsIGludCkgPSBIRmlsdGVyMTZpOwotdm9pZCAoKlZQOEVuY1ZGaWx0ZXI4aSkodWludDhfdCosIHVpbnQ4X3QqLCBpbnQsIGludCwgaW50LCBpbnQpID0gVkZpbHRlcjhpOwotdm9pZCAoKlZQOEVuY0hGaWx0ZXI4aSkodWludDhfdCosIHVpbnQ4X3QqLCBpbnQsIGludCwgaW50LCBpbnQpID0gSEZpbHRlcjhpOwotCi12b2lkICgqVlA4RW5jU2ltcGxlVkZpbHRlcjE2aSkodWludDhfdCosIGludCwgaW50KSA9IFNpbXBsZVZGaWx0ZXIxNmk7Ci12b2lkICgqVlA4RW5jU2ltcGxlSEZpbHRlcjE2aSkodWludDhfdCosIGludCwgaW50KSA9IFNpbXBsZUhGaWx0ZXIxNmk7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBQYXJhZ3JhcGggMTUuNDogY29tcHV0ZSB0aGUgaW5uZXItZWRnZSBmaWx0ZXJpbmcgc3RyZW5ndGgKLQotc3RhdGljIGludCBHZXRJTGV2ZWwoaW50IHNoYXJwbmVzcywgaW50IGxldmVsKSB7Ci0gIGlmIChzaGFycG5lc3MgPiAwKSB7Ci0gICAgaWYgKHNoYXJwbmVzcyA+IDQpIHsKLSAgICAgIGxldmVsID4+PSAyOwotICAgIH0gZWxzZSB7Ci0gICAgICBsZXZlbCA+Pj0gMTsKLSAgICB9Ci0gICAgaWYgKGxldmVsID4gOSAtIHNoYXJwbmVzcykgewotICAgICAgbGV2ZWwgPSA5IC0gc2hhcnBuZXNzOwotICAgIH0KLSAgfQotICBpZiAobGV2ZWwgPCAxKSBsZXZlbCA9IDE7Ci0gIHJldHVybiBsZXZlbDsKLX0KLQotc3RhdGljIHZvaWQgRG9GaWx0ZXIoY29uc3QgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBpbnQgbGV2ZWwpIHsKLSAgY29uc3QgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187Ci0gIGNvbnN0IGludCBpbGV2ZWwgPSBHZXRJTGV2ZWwoZW5jLT5jb25maWdfLT5maWx0ZXJfc2hhcnBuZXNzLCBsZXZlbCk7Ci0gIGNvbnN0IGludCBsaW1pdCA9IDIgKiBsZXZlbCArIGlsZXZlbDsKLQotICB1aW50OF90KiBjb25zdCB5X2RzdCA9IGl0LT55dXZfb3V0Ml8gKyBZX09GRjsKLSAgdWludDhfdCogY29uc3QgdV9kc3QgPSBpdC0+eXV2X291dDJfICsgVV9PRkY7Ci0gIHVpbnQ4X3QqIGNvbnN0IHZfZHN0ID0gaXQtPnl1dl9vdXQyXyArIFZfT0ZGOwotCi0gIC8vIGNvcHkgY3VycmVudCBibG9jayB0byB5dXZfb3V0Ml8KLSAgU2JNZW1vcnlDb3B5KHlfZHN0LCBpdC0+eXV2X291dF8sIFlVVl9TSVpFICogc2l6ZW9mKHVpbnQ4X3QpKTsKLQotICBpZiAoZW5jLT5maWx0ZXJfaGRyXy5zaW1wbGVfID09IDEpIHsgICAvLyBzaW1wbGUKLSAgICBWUDhFbmNTaW1wbGVIRmlsdGVyMTZpKHlfZHN0LCBCUFMsIGxpbWl0KTsKLSAgICBWUDhFbmNTaW1wbGVWRmlsdGVyMTZpKHlfZHN0LCBCUFMsIGxpbWl0KTsKLSAgfSBlbHNlIHsgICAgLy8gY29tcGxleAotICAgIGNvbnN0IGludCBoZXZfdGhyZXNoID0gKGxldmVsID49IDQwKSA/IDIgOiAobGV2ZWwgPj0gMTUpID8gMSA6IDA7Ci0gICAgVlA4RW5jSEZpbHRlcjE2aSh5X2RzdCwgQlBTLCBsaW1pdCwgaWxldmVsLCBoZXZfdGhyZXNoKTsKLSAgICBWUDhFbmNIRmlsdGVyOGkodV9kc3QsIHZfZHN0LCBCUFMsIGxpbWl0LCBpbGV2ZWwsIGhldl90aHJlc2gpOwotICAgIFZQOEVuY1ZGaWx0ZXIxNmkoeV9kc3QsIEJQUywgbGltaXQsIGlsZXZlbCwgaGV2X3RocmVzaCk7Ci0gICAgVlA4RW5jVkZpbHRlcjhpKHVfZHN0LCB2X2RzdCwgQlBTLCBsaW1pdCwgaWxldmVsLCBoZXZfdGhyZXNoKTsKLSAgfQotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gU1NJTSBtZXRyaWMKLQotZW51bSB7IEtFUk5FTCA9IDMgfTsKLXN0YXRpYyBjb25zdCBkb3VibGUga01pblZhbHVlID0gMS5lLTEwOyAgLy8gbWluaW1hbCB0aHJlc2hvbGQKLQotdm9pZCBWUDhTU0lNQWRkU3RhdHMoY29uc3QgRGlzdG9TdGF0cyogY29uc3Qgc3JjLCBEaXN0b1N0YXRzKiBjb25zdCBkc3QpIHsKLSAgZHN0LT53ICAgKz0gc3JjLT53OwotICBkc3QtPnhtICArPSBzcmMtPnhtOwotICBkc3QtPnltICArPSBzcmMtPnltOwotICBkc3QtPnh4bSArPSBzcmMtPnh4bTsKLSAgZHN0LT54eW0gKz0gc3JjLT54eW07Ci0gIGRzdC0+eXltICs9IHNyYy0+eXltOwotfQotCi1zdGF0aWMgdm9pZCBWUDhTU0lNQWNjdW11bGF0ZShjb25zdCB1aW50OF90KiBzcmMxLCBpbnQgc3RyaWRlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyYzIsIGludCBzdHJpZGUyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhvLCBpbnQgeW8sIGludCBXLCBpbnQgSCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc3RvU3RhdHMqIGNvbnN0IHN0YXRzKSB7Ci0gIGNvbnN0IGludCB5bWluID0gKHlvIC0gS0VSTkVMIDwgMCkgPyAwIDogeW8gLSBLRVJORUw7Ci0gIGNvbnN0IGludCB5bWF4ID0gKHlvICsgS0VSTkVMID4gSCAtIDEpID8gSCAtIDEgOiB5byArIEtFUk5FTDsKLSAgY29uc3QgaW50IHhtaW4gPSAoeG8gLSBLRVJORUwgPCAwKSA/IDAgOiB4byAtIEtFUk5FTDsKLSAgY29uc3QgaW50IHhtYXggPSAoeG8gKyBLRVJORUwgPiBXIC0gMSkgPyBXIC0gMSA6IHhvICsgS0VSTkVMOwotICBpbnQgeCwgeTsKLSAgc3JjMSArPSB5bWluICogc3RyaWRlMTsKLSAgc3JjMiArPSB5bWluICogc3RyaWRlMjsKLSAgZm9yICh5ID0geW1pbjsgeSA8PSB5bWF4OyArK3ksIHNyYzEgKz0gc3RyaWRlMSwgc3JjMiArPSBzdHJpZGUyKSB7Ci0gICAgZm9yICh4ID0geG1pbjsgeCA8PSB4bWF4OyArK3gpIHsKLSAgICAgIGNvbnN0IGludCBzMSA9IHNyYzFbeF07Ci0gICAgICBjb25zdCBpbnQgczIgPSBzcmMyW3hdOwotICAgICAgc3RhdHMtPncgICArPSAxOwotICAgICAgc3RhdHMtPnhtICArPSBzMTsKLSAgICAgIHN0YXRzLT55bSAgKz0gczI7Ci0gICAgICBzdGF0cy0+eHhtICs9IHMxICogczE7Ci0gICAgICBzdGF0cy0+eHltICs9IHMxICogczI7Ci0gICAgICBzdGF0cy0+eXltICs9IHMyICogczI7Ci0gICAgfQotICB9Ci19Ci0KLWRvdWJsZSBWUDhTU0lNR2V0KGNvbnN0IERpc3RvU3RhdHMqIGNvbnN0IHN0YXRzKSB7Ci0gIGNvbnN0IGRvdWJsZSB4bXhtID0gc3RhdHMtPnhtICogc3RhdHMtPnhtOwotICBjb25zdCBkb3VibGUgeW15bSA9IHN0YXRzLT55bSAqIHN0YXRzLT55bTsKLSAgY29uc3QgZG91YmxlIHhteW0gPSBzdGF0cy0+eG0gKiBzdGF0cy0+eW07Ci0gIGNvbnN0IGRvdWJsZSB3MiA9IHN0YXRzLT53ICogc3RhdHMtPnc7Ci0gIGRvdWJsZSBzeHggPSBzdGF0cy0+eHhtICogc3RhdHMtPncgLSB4bXhtOwotICBkb3VibGUgc3l5ID0gc3RhdHMtPnl5bSAqIHN0YXRzLT53IC0geW15bTsKLSAgZG91YmxlIHN4eSA9IHN0YXRzLT54eW0gKiBzdGF0cy0+dyAtIHhteW07Ci0gIGRvdWJsZSBDMSwgQzI7Ci0gIGRvdWJsZSBmbnVtOwotICBkb3VibGUgZmRlbjsKLSAgLy8gc21hbGwgZXJyb3JzIGFyZSBwb3NzaWJsZSwgZHVlIHRvIHJvdW5kaW5nLiBDbGFtcCB0byB6ZXJvLgotICBpZiAoc3h4IDwgMC4pIHN4eCA9IDAuOwotICBpZiAoc3l5IDwgMC4pIHN5eSA9IDAuOwotICBDMSA9IDYuNTAyNSAqIHcyOwotICBDMiA9IDU4LjUyMjUgKiB3MjsKLSAgZm51bSA9ICgyICogeG15bSArIEMxKSAqICgyICogc3h5ICsgQzIpOwotICBmZGVuID0gKHhteG0gKyB5bXltICsgQzEpICogKHN4eCArIHN5eSArIEMyKTsKLSAgcmV0dXJuIChmZGVuICE9IDAuKSA/IGZudW0gLyBmZGVuIDoga01pblZhbHVlOwotfQotCi1kb3VibGUgVlA4U1NJTUdldFNxdWFyZWRFcnJvcihjb25zdCBEaXN0b1N0YXRzKiBjb25zdCBzKSB7Ci0gIGlmIChzLT53ID4gMC4pIHsKLSAgICBjb25zdCBkb3VibGUgaXcyID0gMS4gLyAocy0+dyAqIHMtPncpOwotICAgIGNvbnN0IGRvdWJsZSBzeHggPSBzLT54eG0gKiBzLT53IC0gcy0+eG0gKiBzLT54bTsKLSAgICBjb25zdCBkb3VibGUgc3l5ID0gcy0+eXltICogcy0+dyAtIHMtPnltICogcy0+eW07Ci0gICAgY29uc3QgZG91YmxlIHN4eSA9IHMtPnh5bSAqIHMtPncgLSBzLT54bSAqIHMtPnltOwotICAgIGNvbnN0IGRvdWJsZSBTU0UgPSBpdzIgKiAoc3h4ICsgc3l5IC0gMi4gKiBzeHkpOwotICAgIGlmIChTU0UgPiBrTWluVmFsdWUpIHJldHVybiBTU0U7Ci0gIH0KLSAgcmV0dXJuIGtNaW5WYWx1ZTsKLX0KLQotdm9pZCBWUDhTU0lNQWNjdW11bGF0ZVBsYW5lKGNvbnN0IHVpbnQ4X3QqIHNyYzEsIGludCBzdHJpZGUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyYzIsIGludCBzdHJpZGUyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBXLCBpbnQgSCwgRGlzdG9TdGF0cyogY29uc3Qgc3RhdHMpIHsKLSAgaW50IHgsIHk7Ci0gIGZvciAoeSA9IDA7IHkgPCBIOyArK3kpIHsKLSAgICBmb3IgKHggPSAwOyB4IDwgVzsgKyt4KSB7Ci0gICAgICBWUDhTU0lNQWNjdW11bGF0ZShzcmMxLCBzdHJpZGUxLCBzcmMyLCBzdHJpZGUyLCB4LCB5LCBXLCBILCBzdGF0cyk7Ci0gICAgfQotICB9Ci19Ci0KLXN0YXRpYyBkb3VibGUgR2V0TUJTU0lNKGNvbnN0IHVpbnQ4X3QqIHl1djEsIGNvbnN0IHVpbnQ4X3QqIHl1djIpIHsKLSAgaW50IHgsIHk7Ci0gIERpc3RvU3RhdHMgcyA9IHsgLjAsIC4wLCAuMCwgLjAsIC4wLCAuMCB9OwotCi0gIC8vIGNvbXB1dGUgU1NJTSBpbiBhIDEwIHggMTAgd2luZG93Ci0gIGZvciAoeCA9IDM7IHggPCAxMzsgeCsrKSB7Ci0gICAgZm9yICh5ID0gMzsgeSA8IDEzOyB5KyspIHsKLSAgICAgIFZQOFNTSU1BY2N1bXVsYXRlKHl1djEgKyBZX09GRiwgQlBTLCB5dXYyICsgWV9PRkYsIEJQUywgeCwgeSwgMTYsIDE2LCAmcyk7Ci0gICAgfQotICB9Ci0gIGZvciAoeCA9IDE7IHggPCA3OyB4KyspIHsKLSAgICBmb3IgKHkgPSAxOyB5IDwgNzsgeSsrKSB7Ci0gICAgICBWUDhTU0lNQWNjdW11bGF0ZSh5dXYxICsgVV9PRkYsIEJQUywgeXV2MiArIFVfT0ZGLCBCUFMsIHgsIHksIDgsIDgsICZzKTsKLSAgICAgIFZQOFNTSU1BY2N1bXVsYXRlKHl1djEgKyBWX09GRiwgQlBTLCB5dXYyICsgVl9PRkYsIEJQUywgeCwgeSwgOCwgOCwgJnMpOwotICAgIH0KLSAgfQotICByZXR1cm4gVlA4U1NJTUdldCgmcyk7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBFeHBvc2VkIEFQSXM6IEVuY29kZXIgc2hvdWxkIGNhbGwgdGhlIGZvbGxvd2luZyAzIGZ1bmN0aW9ucyB0byBhZGp1c3QKLS8vIGxvb3AgZmlsdGVyIHN0cmVuZ3RoCi0KLXZvaWQgVlA4SW5pdEZpbHRlcihWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKLSAgaW50IHMsIGk7Ci0gIGlmICghaXQtPmxmX3N0YXRzXykgcmV0dXJuOwotCi0gIEluaXRUYWJsZXMoKTsKLSAgZm9yIChzID0gMDsgcyA8IE5VTV9NQl9TRUdNRU5UUzsgcysrKSB7Ci0gICAgZm9yIChpID0gMDsgaSA8IE1BWF9MRl9MRVZFTFM7IGkrKykgewotICAgICAgKCppdC0+bGZfc3RhdHNfKVtzXVtpXSA9IDA7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgVlA4U3RvcmVGaWx0ZXJTdGF0cyhWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKLSAgaW50IGQ7Ci0gIGNvbnN0IGludCBzID0gaXQtPm1iXy0+c2VnbWVudF87Ci0gIGNvbnN0IGludCBsZXZlbDAgPSBpdC0+ZW5jXy0+ZHFtX1tzXS5mc3RyZW5ndGhfOyAgLy8gVE9ETzogcmVmX2xmX2RlbHRhW10KLQotICAvLyBleHBsb3JlICsvLXF1YW50IHJhbmdlIG9mIHZhbHVlcyBhcm91bmQgbGV2ZWwwCi0gIGNvbnN0IGludCBkZWx0YV9taW4gPSAtaXQtPmVuY18tPmRxbV9bc10ucXVhbnRfOwotICBjb25zdCBpbnQgZGVsdGFfbWF4ID0gaXQtPmVuY18tPmRxbV9bc10ucXVhbnRfOwotICBjb25zdCBpbnQgc3RlcF9zaXplID0gKGRlbHRhX21heCAtIGRlbHRhX21pbiA+PSA0KSA/IDQgOiAxOwotCi0gIGlmICghaXQtPmxmX3N0YXRzXykgcmV0dXJuOwotCi0gIC8vIE5PVEU6IEN1cnJlbnRseSB3ZSBhcmUgYXBwbHlpbmcgZmlsdGVyIG9ubHkgYWNyb3NzIHRoZSBzdWJsb2NrIGVkZ2VzCi0gIC8vIFRoZXJlIGFyZSB0d28gcmVhc29ucyBmb3IgdGhhdC4KLSAgLy8gMS4gQXBwbHlpbmcgZmlsdGVyIG9uIG1hY3JvIGJsb2NrIGVkZ2VzIHdpbGwgY2hhbmdlIHRoZSBwaXhlbHMgaW4KLSAgLy8gdGhlIGxlZnQgYW5kIHRvcCBtYWNybyBibG9ja3MuIFRoYXQgd2lsbCBiZSBoYXJkIHRvIHJlc3RvcmUKLSAgLy8gMi4gTWFjcm8gQmxvY2tzIG9uIHRoZSBib3R0b20gYW5kIHJpZ2h0IGFyZSBub3QgeWV0IGNvbXByZXNzZWQuIFNvIHdlCi0gIC8vIGNhbm5vdCBhcHBseSBmaWx0ZXIgb24gdGhlIHJpZ2h0IGFuZCBib3R0b20gbWFjcm8gYmxvY2sgZWRnZXMuCi0gIGlmIChpdC0+bWJfLT50eXBlXyA9PSAxICYmIGl0LT5tYl8tPnNraXBfKSByZXR1cm47Ci0KLSAgLy8gQWx3YXlzIHRyeSBmaWx0ZXIgbGV2ZWwgIHplcm8KLSAgKCppdC0+bGZfc3RhdHNfKVtzXVswXSArPSBHZXRNQlNTSU0oaXQtPnl1dl9pbl8sIGl0LT55dXZfb3V0Xyk7Ci0KLSAgZm9yIChkID0gZGVsdGFfbWluOyBkIDw9IGRlbHRhX21heDsgZCArPSBzdGVwX3NpemUpIHsKLSAgICBjb25zdCBpbnQgbGV2ZWwgPSBsZXZlbDAgKyBkOwotICAgIGlmIChsZXZlbCA8PSAwIHx8IGxldmVsID49IE1BWF9MRl9MRVZFTFMpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBEb0ZpbHRlcihpdCwgbGV2ZWwpOwotICAgICgqaXQtPmxmX3N0YXRzXylbc11bbGV2ZWxdICs9IEdldE1CU1NJTShpdC0+eXV2X2luXywgaXQtPnl1dl9vdXQyXyk7Ci0gIH0KLX0KLQotdm9pZCBWUDhBZGp1c3RGaWx0ZXJTdHJlbmd0aChWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKLSAgaW50IHM7Ci0gIFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOwotCi0gIGlmICghaXQtPmxmX3N0YXRzXykgewotICAgIHJldHVybjsKLSAgfQotICBmb3IgKHMgPSAwOyBzIDwgTlVNX01CX1NFR01FTlRTOyBzKyspIHsKLSAgICBpbnQgaSwgYmVzdF9sZXZlbCA9IDA7Ci0gICAgLy8gSW1wcm92ZW1lbnQgb3ZlciBmaWx0ZXIgbGV2ZWwgMCBzaG91bGQgYmUgYXQgbGVhc3QgMWUtNSAocmVsYXRpdmVseSkKLSAgICBkb3VibGUgYmVzdF92ID0gMS4wMDAwMSAqICgqaXQtPmxmX3N0YXRzXylbc11bMF07Ci0gICAgZm9yIChpID0gMTsgaSA8IE1BWF9MRl9MRVZFTFM7IGkrKykgewotICAgICAgY29uc3QgZG91YmxlIHYgPSAoKml0LT5sZl9zdGF0c18pW3NdW2ldOwotICAgICAgaWYgKHYgPiBiZXN0X3YpIHsKLSAgICAgICAgYmVzdF92ID0gdjsKLSAgICAgICAgYmVzdF9sZXZlbCA9IGk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVuYy0+ZHFtX1tzXS5mc3RyZW5ndGhfID0gYmVzdF9sZXZlbDsKLSAgfQotfQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy9mcmFtZS5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL2ZyYW1lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjYmQxNGYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL2ZyYW1lLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5ODQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vICAgZnJhbWUgY29kaW5nIGFuZCBhbmFseXNpcwotLy8KLS8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCi0KLSNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmguIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNlbHNlCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8bWF0aC5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICIuL3ZwOGVuY2kuaCIKLSNpbmNsdWRlICIuL2Nvc3QuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNkZWZpbmUgU0VHTUVOVF9WSVNVIDAKLSNkZWZpbmUgREVCVUdfU0VBUkNIIDAgICAgLy8gdXNlZnVsIHRvIHRyYWNrIHNlYXJjaCBjb252ZXJnZW5jZQotCi0vLyBPbi10aGUtZmx5IGluZm8gYWJvdXQgdGhlIGN1cnJlbnQgc2V0IG9mIHJlc2lkdWFscy4gSGFuZHkgdG8gYXZvaWQKLS8vIHBhc3NpbmcgemlsbGlvbnMgb2YgcGFyYW1zLgotdHlwZWRlZiBzdHJ1Y3QgewotICBpbnQgZmlyc3Q7Ci0gIGludCBsYXN0OwotICBjb25zdCBpbnQxNl90KiBjb2VmZnM7Ci0KLSAgaW50IGNvZWZmX3R5cGU7Ci0gIFByb2JhQXJyYXkqIHByb2I7Ci0gIFN0YXRzQXJyYXkqIHN0YXRzOwotICBDb3N0QXJyYXkqICBjb3N0OwotfSBWUDhSZXNpZHVhbDsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFRhYmxlcyBmb3IgbGV2ZWwgY29kaW5nCi0KLWNvbnN0IHVpbnQ4X3QgVlA4RW5jQmFuZHNbMTYgKyAxXSA9IHsKLSAgMCwgMSwgMiwgMywgNiwgNCwgNSwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNywKLSAgMCAgLy8gc2VudGluZWwKLX07Ci0KLWNvbnN0IHVpbnQ4X3QgVlA4Q2F0M1tdID0geyAxNzMsIDE0OCwgMTQwIH07Ci1jb25zdCB1aW50OF90IFZQOENhdDRbXSA9IHsgMTc2LCAxNTUsIDE0MCwgMTM1IH07Ci1jb25zdCB1aW50OF90IFZQOENhdDVbXSA9IHsgMTgwLCAxNTcsIDE0MSwgMTM0LCAxMzAgfTsKLWNvbnN0IHVpbnQ4X3QgVlA4Q2F0NltdID0KLSAgICB7IDI1NCwgMjU0LCAyNDMsIDIzMCwgMTk2LCAxNzcsIDE1MywgMTQwLCAxMzMsIDEzMCwgMTI5IH07Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBSZXNldCB0aGUgc3RhdGlzdGljcyBhYm91dDogbnVtYmVyIG9mIHNraXBzLCB0b2tlbiBwcm9iYSwgbGV2ZWwgY29zdCwuLi4KLQotc3RhdGljIHZvaWQgUmVzZXRTdGF0cyhWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKLSAgVlA4UHJvYmEqIGNvbnN0IHByb2JhID0gJmVuYy0+cHJvYmFfOwotICBWUDhDYWxjdWxhdGVMZXZlbENvc3RzKHByb2JhKTsKLSAgcHJvYmEtPm5iX3NraXBfID0gMDsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFNraXAgZGVjaXNpb24gcHJvYmFiaWxpdHkKLQotI2RlZmluZSBTS0lQX1BST0JBX1RIUkVTSE9MRCAyNTAgIC8vIHZhbHVlIGJlbG93IHdoaWNoIHVzaW5nIHNraXBfcHJvYmEgaXMgT0suCi0KLXN0YXRpYyBpbnQgQ2FsY1NraXBQcm9iYSh1aW50NjRfdCBuYiwgdWludDY0X3QgdG90YWwpIHsKLSAgcmV0dXJuIChpbnQpKHRvdGFsID8gKHRvdGFsIC0gbmIpICogMjU1IC8gdG90YWwgOiAyNTUpOwotfQotCi0vLyBSZXR1cm5zIHRoZSBiaXQtY29zdCBmb3IgY29kaW5nIHRoZSBza2lwIHByb2JhYmlsaXR5Lgotc3RhdGljIGludCBGaW5hbGl6ZVNraXBQcm9iYShWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKLSAgVlA4UHJvYmEqIGNvbnN0IHByb2JhID0gJmVuYy0+cHJvYmFfOwotICBjb25zdCBpbnQgbmJfbWJzID0gZW5jLT5tYl93XyAqIGVuYy0+bWJfaF87Ci0gIGNvbnN0IGludCBuYl9ldmVudHMgPSBwcm9iYS0+bmJfc2tpcF87Ci0gIGludCBzaXplOwotICBwcm9iYS0+c2tpcF9wcm9iYV8gPSBDYWxjU2tpcFByb2JhKG5iX2V2ZW50cywgbmJfbWJzKTsKLSAgcHJvYmEtPnVzZV9za2lwX3Byb2JhXyA9IChwcm9iYS0+c2tpcF9wcm9iYV8gPCBTS0lQX1BST0JBX1RIUkVTSE9MRCk7Ci0gIHNpemUgPSAyNTY7ICAgLy8gJ3VzZV9za2lwX3Byb2JhJyBiaXQKLSAgaWYgKHByb2JhLT51c2Vfc2tpcF9wcm9iYV8pIHsKLSAgICBzaXplICs9ICBuYl9ldmVudHMgKiBWUDhCaXRDb3N0KDEsIHByb2JhLT5za2lwX3Byb2JhXykKLSAgICAgICAgICsgKG5iX21icyAtIG5iX2V2ZW50cykgKiBWUDhCaXRDb3N0KDAsIHByb2JhLT5za2lwX3Byb2JhXyk7Ci0gICAgc2l6ZSArPSA4ICogMjU2OyAgIC8vIGNvc3Qgb2Ygc2lnbmFsaW5nIHRoZSBza2lwX3Byb2JhXyBpdHNlbGYuCi0gIH0KLSAgcmV0dXJuIHNpemU7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBSZWNvcmRpbmcgb2YgdG9rZW4gcHJvYmFiaWxpdGllcy4KLQotc3RhdGljIHZvaWQgUmVzZXRUb2tlblN0YXRzKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgewotICBWUDhQcm9iYSogY29uc3QgcHJvYmEgPSAmZW5jLT5wcm9iYV87Ci0gIFNiTWVtb3J5U2V0KHByb2JhLT5zdGF0c18sIDAsIHNpemVvZihwcm9iYS0+c3RhdHNfKSk7Ci19Ci0KLS8vIFJlY29yZCBwcm9iYSBjb250ZXh0IHVzZWQKLXN0YXRpYyBpbnQgUmVjb3JkKGludCBiaXQsIHByb2JhX3QqIGNvbnN0IHN0YXRzKSB7Ci0gIHByb2JhX3QgcCA9ICpzdGF0czsKLSAgaWYgKHAgPj0gMHhmZmZmMDAwMHUpIHsgICAgICAgICAgICAgICAvLyBhbiBvdmVyZmxvdyBpcyBpbmJvdW5kLgotICAgIHAgPSAoKHAgKyAxdSkgPj4gMSkgJiAweDdmZmY3ZmZmdTsgIC8vIC0+IGRpdmlkZSB0aGUgc3RhdHMgYnkgMi4KLSAgfQotICAvLyByZWNvcmQgYml0IGNvdW50IChsb3dlciAxNiBiaXRzKSBhbmQgaW5jcmVtZW50IHRvdGFsIGNvdW50ICh1cHBlciAxNiBiaXRzKS4KLSAgcCArPSAweDAwMDEwMDAwdSArIGJpdDsKLSAgKnN0YXRzID0gcDsKLSAgcmV0dXJuIGJpdDsKLX0KLQotLy8gV2Uga2VlcCB0aGUgdGFibGUgZnJlZSB2YXJpYW50IGFyb3VuZCBmb3IgcmVmZXJlbmNlLCBpbiBjYXNlLgotI2RlZmluZSBVU0VfTEVWRUxfQ09ERV9UQUJMRQotCi0vLyBTaW11bGF0ZSBibG9jayBjb2RpbmcsIGJ1dCBvbmx5IHJlY29yZCBzdGF0aXN0aWNzLgotLy8gTm90ZTogbm8gbmVlZCB0byByZWNvcmQgdGhlIGZpeGVkIHByb2Jhcy4KLXN0YXRpYyBpbnQgUmVjb3JkQ29lZmZzKGludCBjdHgsIGNvbnN0IFZQOFJlc2lkdWFsKiBjb25zdCByZXMpIHsKLSAgaW50IG4gPSByZXMtPmZpcnN0OwotICAvLyBzaG91bGQgYmUgc3RhdHNbVlA4RW5jQmFuZHNbbl1dLCBidXQgaXQncyBlcXVpdmFsZW50IGZvciBuPTAgb3IgMQotICBwcm9iYV90KiBzID0gcmVzLT5zdGF0c1tuXVtjdHhdOwotICBpZiAocmVzLT5sYXN0ICA8IDApIHsKLSAgICBSZWNvcmQoMCwgcyArIDApOwotICAgIHJldHVybiAwOwotICB9Ci0gIHdoaWxlIChuIDw9IHJlcy0+bGFzdCkgewotICAgIGludCB2OwotICAgIFJlY29yZCgxLCBzICsgMCk7ICAvLyBvcmRlciBvZiByZWNvcmQgZG9lc24ndCBtYXR0ZXIKLSAgICB3aGlsZSAoKHYgPSByZXMtPmNvZWZmc1tuKytdKSA9PSAwKSB7Ci0gICAgICBSZWNvcmQoMCwgcyArIDEpOwotICAgICAgcyA9IHJlcy0+c3RhdHNbVlA4RW5jQmFuZHNbbl1dWzBdOwotICAgIH0KLSAgICBSZWNvcmQoMSwgcyArIDEpOwotICAgIGlmICghUmVjb3JkKDJ1IDwgKHVuc2lnbmVkIGludCkodiArIDEpLCBzICsgMikpIHsgIC8vIHYgPSAtMSBvciAxCi0gICAgICBzID0gcmVzLT5zdGF0c1tWUDhFbmNCYW5kc1tuXV1bMV07Ci0gICAgfSBlbHNlIHsKLSAgICAgIHYgPSBhYnModik7Ci0jaWYgIWRlZmluZWQoVVNFX0xFVkVMX0NPREVfVEFCTEUpCi0gICAgICBpZiAoIVJlY29yZCh2ID4gNCwgcyArIDMpKSB7Ci0gICAgICAgIGlmIChSZWNvcmQodiAhPSAyLCBzICsgNCkpCi0gICAgICAgICAgUmVjb3JkKHYgPT0gNCwgcyArIDUpOwotICAgICAgfSBlbHNlIGlmICghUmVjb3JkKHYgPiAxMCwgcyArIDYpKSB7Ci0gICAgICAgIFJlY29yZCh2ID4gNiwgcyArIDcpOwotICAgICAgfSBlbHNlIGlmICghUmVjb3JkKCh2ID49IDMgKyAoOCA8PCAyKSksIHMgKyA4KSkgewotICAgICAgICBSZWNvcmQoKHYgPj0gMyArICg4IDw8IDEpKSwgcyArIDkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgUmVjb3JkKCh2ID49IDMgKyAoOCA8PCAzKSksIHMgKyAxMCk7Ci0gICAgICB9Ci0jZWxzZQotICAgICAgaWYgKHYgPiBNQVhfVkFSSUFCTEVfTEVWRUwpCi0gICAgICAgIHYgPSBNQVhfVkFSSUFCTEVfTEVWRUw7Ci0KLSAgICAgIHsKLSAgICAgICAgY29uc3QgaW50IGJpdHMgPSBWUDhMZXZlbENvZGVzW3YgLSAxXVsxXTsKLSAgICAgICAgaW50IHBhdHRlcm4gPSBWUDhMZXZlbENvZGVzW3YgLSAxXVswXTsKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIGZvciAoaSA9IDA7IChwYXR0ZXJuID4+PSAxKSAhPSAwOyArK2kpIHsKLSAgICAgICAgICBjb25zdCBpbnQgbWFzayA9IDIgPDwgaTsKLSAgICAgICAgICBpZiAocGF0dGVybiAmIDEpIFJlY29yZCghIShiaXRzICYgbWFzayksIHMgKyAzICsgaSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSNlbmRpZgotICAgICAgcyA9IHJlcy0+c3RhdHNbVlA4RW5jQmFuZHNbbl1dWzJdOwotICAgIH0KLSAgfQotICBpZiAobiA8IDE2KSBSZWNvcmQoMCwgcyArIDApOwotICByZXR1cm4gMTsKLX0KLQotLy8gQ29sbGVjdCBzdGF0aXN0aWNzIGFuZCBkZWR1Y2UgcHJvYmFiaWxpdGllcyBmb3IgbmV4dCBjb2RpbmcgcGFzcy4KLS8vIFJldHVybiB0aGUgdG90YWwgYml0LWNvc3QgZm9yIGNvZGluZyB0aGUgcHJvYmFiaWxpdHkgdXBkYXRlcy4KLXN0YXRpYyBpbnQgQ2FsY1Rva2VuUHJvYmEoaW50IG5iLCBpbnQgdG90YWwpIHsKLSAgU0JfRENIRUNLKG5iIDw9IHRvdGFsKTsKLSAgcmV0dXJuIG5iID8gKDI1NSAtIG5iICogMjU1IC8gdG90YWwpIDogMjU1OwotfQotCi0vLyBDb3N0IG9mIGNvZGluZyAnbmInIDEncyBhbmQgJ3RvdGFsLW5iJyAwJ3MgdXNpbmcgJ3Byb2JhJyBwcm9iYWJpbGl0eS4KLXN0YXRpYyBpbnQgQnJhbmNoQ29zdChpbnQgbmIsIGludCB0b3RhbCwgaW50IHByb2JhKSB7Ci0gIHJldHVybiBuYiAqIFZQOEJpdENvc3QoMSwgcHJvYmEpICsgKHRvdGFsIC0gbmIpICogVlA4Qml0Q29zdCgwLCBwcm9iYSk7Ci19Ci0KLXN0YXRpYyBpbnQgRmluYWxpemVUb2tlblByb2JhcyhWUDhQcm9iYSogY29uc3QgcHJvYmEpIHsKLSAgaW50IGhhc19jaGFuZ2VkID0gMDsKLSAgaW50IHNpemUgPSAwOwotICBpbnQgdCwgYiwgYywgcDsKLSAgZm9yICh0ID0gMDsgdCA8IE5VTV9UWVBFUzsgKyt0KSB7Ci0gICAgZm9yIChiID0gMDsgYiA8IE5VTV9CQU5EUzsgKytiKSB7Ci0gICAgICBmb3IgKGMgPSAwOyBjIDwgTlVNX0NUWDsgKytjKSB7Ci0gICAgICAgIGZvciAocCA9IDA7IHAgPCBOVU1fUFJPQkFTOyArK3ApIHsKLSAgICAgICAgICBjb25zdCBwcm9iYV90IHN0YXRzID0gcHJvYmEtPnN0YXRzX1t0XVtiXVtjXVtwXTsKLSAgICAgICAgICBjb25zdCBpbnQgbmIgPSAoc3RhdHMgPj4gMCkgJiAweGZmZmY7Ci0gICAgICAgICAgY29uc3QgaW50IHRvdGFsID0gKHN0YXRzID4+IDE2KSAmIDB4ZmZmZjsKLSAgICAgICAgICBjb25zdCBpbnQgdXBkYXRlX3Byb2JhID0gVlA4Q29lZmZzVXBkYXRlUHJvYmFbdF1bYl1bY11bcF07Ci0gICAgICAgICAgY29uc3QgaW50IG9sZF9wID0gVlA4Q29lZmZzUHJvYmEwW3RdW2JdW2NdW3BdOwotICAgICAgICAgIGNvbnN0IGludCBuZXdfcCA9IENhbGNUb2tlblByb2JhKG5iLCB0b3RhbCk7Ci0gICAgICAgICAgY29uc3QgaW50IG9sZF9jb3N0ID0gQnJhbmNoQ29zdChuYiwgdG90YWwsIG9sZF9wKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFZQOEJpdENvc3QoMCwgdXBkYXRlX3Byb2JhKTsKLSAgICAgICAgICBjb25zdCBpbnQgbmV3X2Nvc3QgPSBCcmFuY2hDb3N0KG5iLCB0b3RhbCwgbmV3X3ApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgVlA4Qml0Q29zdCgxLCB1cGRhdGVfcHJvYmEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgOCAqIDI1NjsKLSAgICAgICAgICBjb25zdCBpbnQgdXNlX25ld19wID0gKG9sZF9jb3N0ID4gbmV3X2Nvc3QpOwotICAgICAgICAgIHNpemUgKz0gVlA4Qml0Q29zdCh1c2VfbmV3X3AsIHVwZGF0ZV9wcm9iYSk7Ci0gICAgICAgICAgaWYgKHVzZV9uZXdfcCkgeyAgLy8gb25seSB1c2UgcHJvYmEgdGhhdCBzZWVtIG1lYW5pbmdmdWwgZW5vdWdoLgotICAgICAgICAgICAgcHJvYmEtPmNvZWZmc19bdF1bYl1bY11bcF0gPSBuZXdfcDsKLSAgICAgICAgICAgIGhhc19jaGFuZ2VkIHw9IChuZXdfcCAhPSBvbGRfcCk7Ci0gICAgICAgICAgICBzaXplICs9IDggKiAyNTY7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHByb2JhLT5jb2VmZnNfW3RdW2JdW2NdW3BdID0gb2xkX3A7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHByb2JhLT5kaXJ0eV8gPSBoYXNfY2hhbmdlZDsKLSAgcmV0dXJuIHNpemU7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBGaW5hbGl6ZSBTZWdtZW50IHByb2JhYmlsaXR5IGJhc2VkIG9uIHRoZSBjb2RpbmcgdHJlZQotCi1zdGF0aWMgaW50IEdldFByb2JhKGludCBhLCBpbnQgYikgewotICBjb25zdCBpbnQgdG90YWwgPSBhICsgYjsKLSAgcmV0dXJuICh0b3RhbCA9PSAwKSA/IDI1NSAgICAgLy8gdGhhdCdzIHRoZSBkZWZhdWx0IHByb2JhYmlsaXR5LgotICAgICAgICAgICAgICAgICAgICAgIDogKDI1NSAqIGEgKyB0b3RhbCAvIDIpIC8gdG90YWw7ICAvLyByb3VuZGVkIHByb2JhCi19Ci0KLXN0YXRpYyB2b2lkIFNldFNlZ21lbnRQcm9iYXMoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7Ci0gIGludCBwW05VTV9NQl9TRUdNRU5UU10gPSB7IDAgfTsKLSAgaW50IG47Ci0KLSAgZm9yIChuID0gMDsgbiA8IGVuYy0+bWJfd18gKiBlbmMtPm1iX2hfOyArK24pIHsKLSAgICBjb25zdCBWUDhNQkluZm8qIGNvbnN0IG1iID0gJmVuYy0+bWJfaW5mb19bbl07Ci0gICAgcFttYi0+c2VnbWVudF9dKys7Ci0gIH0KLSAgaWYgKGVuYy0+cGljXy0+c3RhdHMgIT0gTlVMTCkgewotICAgIGZvciAobiA9IDA7IG4gPCBOVU1fTUJfU0VHTUVOVFM7ICsrbikgewotICAgICAgZW5jLT5waWNfLT5zdGF0cy0+c2VnbWVudF9zaXplW25dID0gcFtuXTsKLSAgICB9Ci0gIH0KLSAgaWYgKGVuYy0+c2VnbWVudF9oZHJfLm51bV9zZWdtZW50c18gPiAxKSB7Ci0gICAgdWludDhfdCogY29uc3QgcHJvYmFzID0gZW5jLT5wcm9iYV8uc2VnbWVudHNfOwotICAgIHByb2Jhc1swXSA9IEdldFByb2JhKHBbMF0gKyBwWzFdLCBwWzJdICsgcFszXSk7Ci0gICAgcHJvYmFzWzFdID0gR2V0UHJvYmEocFswXSwgcFsxXSk7Ci0gICAgcHJvYmFzWzJdID0gR2V0UHJvYmEocFsyXSwgcFszXSk7Ci0KLSAgICBlbmMtPnNlZ21lbnRfaGRyXy51cGRhdGVfbWFwXyA9Ci0gICAgICAgIChwcm9iYXNbMF0gIT0gMjU1KSB8fCAocHJvYmFzWzFdICE9IDI1NSkgfHwgKHByb2Jhc1syXSAhPSAyNTUpOwotICAgIGVuYy0+c2VnbWVudF9oZHJfLnNpemVfID0KLSAgICAgICAgcFswXSAqIChWUDhCaXRDb3N0KDAsIHByb2Jhc1swXSkgKyBWUDhCaXRDb3N0KDAsIHByb2Jhc1sxXSkpICsKLSAgICAgICAgcFsxXSAqIChWUDhCaXRDb3N0KDAsIHByb2Jhc1swXSkgKyBWUDhCaXRDb3N0KDEsIHByb2Jhc1sxXSkpICsKLSAgICAgICAgcFsyXSAqIChWUDhCaXRDb3N0KDEsIHByb2Jhc1swXSkgKyBWUDhCaXRDb3N0KDAsIHByb2Jhc1syXSkpICsKLSAgICAgICAgcFszXSAqIChWUDhCaXRDb3N0KDEsIHByb2Jhc1swXSkgKyBWUDhCaXRDb3N0KDEsIHByb2Jhc1syXSkpOwotICB9IGVsc2UgewotICAgIGVuYy0+c2VnbWVudF9oZHJfLnVwZGF0ZV9tYXBfID0gMDsKLSAgICBlbmMtPnNlZ21lbnRfaGRyXy5zaXplXyA9IDA7Ci0gIH0KLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGhlbHBlciBmdW5jdGlvbnMgZm9yIHJlc2lkdWFscyBzdHJ1Y3QgVlA4UmVzaWR1YWwuCi0KLXN0YXRpYyB2b2lkIEluaXRSZXNpZHVhbChpbnQgZmlyc3QsIGludCBjb2VmZl90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEVuY29kZXIqIGNvbnN0IGVuYywgVlA4UmVzaWR1YWwqIGNvbnN0IHJlcykgewotICByZXMtPmNvZWZmX3R5cGUgPSBjb2VmZl90eXBlOwotICByZXMtPnByb2IgID0gZW5jLT5wcm9iYV8uY29lZmZzX1tjb2VmZl90eXBlXTsKLSAgcmVzLT5zdGF0cyA9IGVuYy0+cHJvYmFfLnN0YXRzX1tjb2VmZl90eXBlXTsKLSAgcmVzLT5jb3N0ICA9IGVuYy0+cHJvYmFfLmxldmVsX2Nvc3RfW2NvZWZmX3R5cGVdOwotICByZXMtPmZpcnN0ID0gZmlyc3Q7Ci19Ci0KLXN0YXRpYyB2b2lkIFNldFJlc2lkdWFsQ29lZmZzKGNvbnN0IGludDE2X3QqIGNvbnN0IGNvZWZmcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOFJlc2lkdWFsKiBjb25zdCByZXMpIHsKLSAgaW50IG47Ci0gIHJlcy0+bGFzdCA9IC0xOwotICBmb3IgKG4gPSAxNTsgbiA+PSByZXMtPmZpcnN0OyAtLW4pIHsKLSAgICBpZiAoY29lZmZzW25dKSB7Ci0gICAgICByZXMtPmxhc3QgPSBuOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIHJlcy0+Y29lZmZzID0gY29lZmZzOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTW9kZSBjb3N0cwotCi1zdGF0aWMgaW50IEdldFJlc2lkdWFsQ29zdChpbnQgY3R4MCwgY29uc3QgVlA4UmVzaWR1YWwqIGNvbnN0IHJlcykgewotICBpbnQgbiA9IHJlcy0+Zmlyc3Q7Ci0gIC8vIHNob3VsZCBiZSBwcm9iW1ZQOEVuY0JhbmRzW25dXSwgYnV0IGl0J3MgZXF1aXZhbGVudCBmb3Igbj0wIG9yIDEKLSAgaW50IHAwID0gcmVzLT5wcm9iW25dW2N0eDBdWzBdOwotICBjb25zdCB1aW50MTZfdCogdCA9IHJlcy0+Y29zdFtuXVtjdHgwXTsKLSAgaW50IGNvc3Q7Ci0KLSAgaWYgKHJlcy0+bGFzdCA8IDApIHsKLSAgICByZXR1cm4gVlA4Qml0Q29zdCgwLCBwMCk7Ci0gIH0KLSAgY29zdCA9IDA7Ci0gIHdoaWxlIChuIDwgcmVzLT5sYXN0KSB7Ci0gICAgaW50IHYgPSByZXMtPmNvZWZmc1tuXTsKLSAgICBjb25zdCBpbnQgYiA9IFZQOEVuY0JhbmRzW24gKyAxXTsKLSAgICArK247Ci0gICAgaWYgKHYgPT0gMCkgewotICAgICAgLy8gc2hvcnQtY2FzZSBmb3IgVlA4TGV2ZWxDb3N0KHQsIDApIChub3RlOiBWUDhMZXZlbEZpeGVkQ29zdHNbMF0gPT0gMCk6Ci0gICAgICBjb3N0ICs9IHRbMF07Ci0gICAgICB0ID0gcmVzLT5jb3N0W2JdWzBdOwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIHYgPSBhYnModik7Ci0gICAgY29zdCArPSBWUDhCaXRDb3N0KDEsIHAwKTsKLSAgICBjb3N0ICs9IFZQOExldmVsQ29zdCh0LCB2KTsKLSAgICB7Ci0gICAgICBjb25zdCBpbnQgY3R4ID0gKHYgPT0gMSkgPyAxIDogMjsKLSAgICAgIHAwID0gcmVzLT5wcm9iW2JdW2N0eF1bMF07Ci0gICAgICB0ID0gcmVzLT5jb3N0W2JdW2N0eF07Ci0gICAgfQotICB9Ci0gIC8vIExhc3QgY29lZmZpY2llbnQgaXMgYWx3YXlzIG5vbi16ZXJvCi0gIHsKLSAgICBjb25zdCBpbnQgdiA9IGFicyhyZXMtPmNvZWZmc1tuXSk7Ci0gICAgU0JfRENIRUNLKHYgIT0gMCk7Ci0gICAgY29zdCArPSBWUDhCaXRDb3N0KDEsIHAwKTsKLSAgICBjb3N0ICs9IFZQOExldmVsQ29zdCh0LCB2KTsKLSAgICBpZiAobiA8IDE1KSB7Ci0gICAgICBjb25zdCBpbnQgYiA9IFZQOEVuY0JhbmRzW24gKyAxXTsKLSAgICAgIGNvbnN0IGludCBjdHggPSAodiA9PSAxKSA/IDEgOiAyOwotICAgICAgY29uc3QgaW50IGxhc3RfcDAgPSByZXMtPnByb2JbYl1bY3R4XVswXTsKLSAgICAgIGNvc3QgKz0gVlA4Qml0Q29zdCgwLCBsYXN0X3AwKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGNvc3Q7Ci19Ci0KLWludCBWUDhHZXRDb3N0THVtYTQoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBjb25zdCBpbnQxNl90IGxldmVsc1sxNl0pIHsKLSAgY29uc3QgaW50IHggPSAoaXQtPmk0XyAmIDMpLCB5ID0gKGl0LT5pNF8gPj4gMik7Ci0gIFZQOFJlc2lkdWFsIHJlczsKLSAgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187Ci0gIGludCBSID0gMDsKLSAgaW50IGN0eDsKLQotICBJbml0UmVzaWR1YWwoMCwgMywgZW5jLCAmcmVzKTsKLSAgY3R4ID0gaXQtPnRvcF9uel9beF0gKyBpdC0+bGVmdF9uel9beV07Ci0gIFNldFJlc2lkdWFsQ29lZmZzKGxldmVscywgJnJlcyk7Ci0gIFIgKz0gR2V0UmVzaWR1YWxDb3N0KGN0eCwgJnJlcyk7Ci0gIHJldHVybiBSOwotfQotCi1pbnQgVlA4R2V0Q29zdEx1bWExNihWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsIGNvbnN0IFZQOE1vZGVTY29yZSogY29uc3QgcmQpIHsKLSAgVlA4UmVzaWR1YWwgcmVzOwotICBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKLSAgaW50IHgsIHk7Ci0gIGludCBSID0gMDsKLQotICBWUDhJdGVyYXRvck56VG9CeXRlcyhpdCk7ICAgLy8gcmUtaW1wb3J0IHRoZSBub24temVybyBjb250ZXh0Ci0KLSAgLy8gREMKLSAgSW5pdFJlc2lkdWFsKDAsIDEsIGVuYywgJnJlcyk7Ci0gIFNldFJlc2lkdWFsQ29lZmZzKHJkLT55X2RjX2xldmVscywgJnJlcyk7Ci0gIFIgKz0gR2V0UmVzaWR1YWxDb3N0KGl0LT50b3BfbnpfWzhdICsgaXQtPmxlZnRfbnpfWzhdLCAmcmVzKTsKLQotICAvLyBBQwotICBJbml0UmVzaWR1YWwoMSwgMCwgZW5jLCAmcmVzKTsKLSAgZm9yICh5ID0gMDsgeSA8IDQ7ICsreSkgewotICAgIGZvciAoeCA9IDA7IHggPCA0OyArK3gpIHsKLSAgICAgIGNvbnN0IGludCBjdHggPSBpdC0+dG9wX256X1t4XSArIGl0LT5sZWZ0X256X1t5XTsKLSAgICAgIFNldFJlc2lkdWFsQ29lZmZzKHJkLT55X2FjX2xldmVsc1t4ICsgeSAqIDRdLCAmcmVzKTsKLSAgICAgIFIgKz0gR2V0UmVzaWR1YWxDb3N0KGN0eCwgJnJlcyk7Ci0gICAgICBpdC0+dG9wX256X1t4XSA9IGl0LT5sZWZ0X256X1t5XSA9IChyZXMubGFzdCA+PSAwKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIFI7Ci19Ci0KLWludCBWUDhHZXRDb3N0VVYoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBjb25zdCBWUDhNb2RlU2NvcmUqIGNvbnN0IHJkKSB7Ci0gIFZQOFJlc2lkdWFsIHJlczsKLSAgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187Ci0gIGludCBjaCwgeCwgeTsKLSAgaW50IFIgPSAwOwotCi0gIFZQOEl0ZXJhdG9yTnpUb0J5dGVzKGl0KTsgIC8vIHJlLWltcG9ydCB0aGUgbm9uLXplcm8gY29udGV4dAotCi0gIEluaXRSZXNpZHVhbCgwLCAyLCBlbmMsICZyZXMpOwotICBmb3IgKGNoID0gMDsgY2ggPD0gMjsgY2ggKz0gMikgewotICAgIGZvciAoeSA9IDA7IHkgPCAyOyArK3kpIHsKLSAgICAgIGZvciAoeCA9IDA7IHggPCAyOyArK3gpIHsKLSAgICAgICAgY29uc3QgaW50IGN0eCA9IGl0LT50b3BfbnpfWzQgKyBjaCArIHhdICsgaXQtPmxlZnRfbnpfWzQgKyBjaCArIHldOwotICAgICAgICBTZXRSZXNpZHVhbENvZWZmcyhyZC0+dXZfbGV2ZWxzW2NoICogMiArIHggKyB5ICogMl0sICZyZXMpOwotICAgICAgICBSICs9IEdldFJlc2lkdWFsQ29zdChjdHgsICZyZXMpOwotICAgICAgICBpdC0+dG9wX256X1s0ICsgY2ggKyB4XSA9IGl0LT5sZWZ0X256X1s0ICsgY2ggKyB5XSA9IChyZXMubGFzdCA+PSAwKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIFI7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb2VmZmljaWVudCBjb2RpbmcKLQotc3RhdGljIGludCBQdXRDb2VmZnMoVlA4Qml0V3JpdGVyKiBjb25zdCBidywgaW50IGN0eCwgY29uc3QgVlA4UmVzaWR1YWwqIHJlcykgewotICBpbnQgbiA9IHJlcy0+Zmlyc3Q7Ci0gIC8vIHNob3VsZCBiZSBwcm9iW1ZQOEVuY0JhbmRzW25dXSwgYnV0IGl0J3MgZXF1aXZhbGVudCBmb3Igbj0wIG9yIDEKLSAgY29uc3QgdWludDhfdCogcCA9IHJlcy0+cHJvYltuXVtjdHhdOwotICBpZiAoIVZQOFB1dEJpdChidywgcmVzLT5sYXN0ID49IDAsIHBbMF0pKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICB3aGlsZSAobiA8IDE2KSB7Ci0gICAgY29uc3QgaW50IGMgPSByZXMtPmNvZWZmc1tuKytdOwotICAgIGNvbnN0IGludCBzaWduID0gYyA8IDA7Ci0gICAgaW50IHYgPSBzaWduID8gLWMgOiBjOwotICAgIGlmICghVlA4UHV0Qml0KGJ3LCB2ICE9IDAsIHBbMV0pKSB7Ci0gICAgICBwID0gcmVzLT5wcm9iW1ZQOEVuY0JhbmRzW25dXVswXTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBpZiAoIVZQOFB1dEJpdChidywgdiA+IDEsIHBbMl0pKSB7Ci0gICAgICBwID0gcmVzLT5wcm9iW1ZQOEVuY0JhbmRzW25dXVsxXTsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKCFWUDhQdXRCaXQoYncsIHYgPiA0LCBwWzNdKSkgewotICAgICAgICBpZiAoVlA4UHV0Qml0KGJ3LCB2ICE9IDIsIHBbNF0pKQotICAgICAgICAgIFZQOFB1dEJpdChidywgdiA9PSA0LCBwWzVdKTsKLSAgICAgIH0gZWxzZSBpZiAoIVZQOFB1dEJpdChidywgdiA+IDEwLCBwWzZdKSkgewotICAgICAgICBpZiAoIVZQOFB1dEJpdChidywgdiA+IDYsIHBbN10pKSB7Ci0gICAgICAgICAgVlA4UHV0Qml0KGJ3LCB2ID09IDYsIDE1OSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgVlA4UHV0Qml0KGJ3LCB2ID49IDksIDE2NSk7Ci0gICAgICAgICAgVlA4UHV0Qml0KGJ3LCAhKHYgJiAxKSwgMTQ1KTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW50IG1hc2s7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRhYjsKLSAgICAgICAgaWYgKHYgPCAzICsgKDggPDwgMSkpIHsgICAgICAgICAgLy8gVlA4Q2F0MyAgKDNiKQotICAgICAgICAgIFZQOFB1dEJpdChidywgMCwgcFs4XSk7Ci0gICAgICAgICAgVlA4UHV0Qml0KGJ3LCAwLCBwWzldKTsKLSAgICAgICAgICB2IC09IDMgKyAoOCA8PCAwKTsKLSAgICAgICAgICBtYXNrID0gMSA8PCAyOwotICAgICAgICAgIHRhYiA9IFZQOENhdDM7Ci0gICAgICAgIH0gZWxzZSBpZiAodiA8IDMgKyAoOCA8PCAyKSkgeyAgIC8vIFZQOENhdDQgICg0YikKLSAgICAgICAgICBWUDhQdXRCaXQoYncsIDAsIHBbOF0pOwotICAgICAgICAgIFZQOFB1dEJpdChidywgMSwgcFs5XSk7Ci0gICAgICAgICAgdiAtPSAzICsgKDggPDwgMSk7Ci0gICAgICAgICAgbWFzayA9IDEgPDwgMzsKLSAgICAgICAgICB0YWIgPSBWUDhDYXQ0OwotICAgICAgICB9IGVsc2UgaWYgKHYgPCAzICsgKDggPDwgMykpIHsgICAvLyBWUDhDYXQ1ICAoNWIpCi0gICAgICAgICAgVlA4UHV0Qml0KGJ3LCAxLCBwWzhdKTsKLSAgICAgICAgICBWUDhQdXRCaXQoYncsIDAsIHBbMTBdKTsKLSAgICAgICAgICB2IC09IDMgKyAoOCA8PCAyKTsKLSAgICAgICAgICBtYXNrID0gMSA8PCA0OwotICAgICAgICAgIHRhYiA9IFZQOENhdDU7Ci0gICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFZQOENhdDYgKDExYikKLSAgICAgICAgICBWUDhQdXRCaXQoYncsIDEsIHBbOF0pOwotICAgICAgICAgIFZQOFB1dEJpdChidywgMSwgcFsxMF0pOwotICAgICAgICAgIHYgLT0gMyArICg4IDw8IDMpOwotICAgICAgICAgIG1hc2sgPSAxIDw8IDEwOwotICAgICAgICAgIHRhYiA9IFZQOENhdDY7Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKG1hc2spIHsKLSAgICAgICAgICBWUDhQdXRCaXQoYncsICEhKHYgJiBtYXNrKSwgKnRhYisrKTsKLSAgICAgICAgICBtYXNrID4+PSAxOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBwID0gcmVzLT5wcm9iW1ZQOEVuY0JhbmRzW25dXVsyXTsKLSAgICB9Ci0gICAgVlA4UHV0Qml0VW5pZm9ybShidywgc2lnbik7Ci0gICAgaWYgKG4gPT0gMTYgfHwgIVZQOFB1dEJpdChidywgbiA8PSByZXMtPmxhc3QsIHBbMF0pKSB7Ci0gICAgICByZXR1cm4gMTsgICAvLyBFT0IKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIENvZGVSZXNpZHVhbHMoVlA4Qml0V3JpdGVyKiBjb25zdCBidywgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhNb2RlU2NvcmUqIGNvbnN0IHJkKSB7Ci0gIGludCB4LCB5LCBjaDsKLSAgVlA4UmVzaWR1YWwgcmVzOwotICB1aW50NjRfdCBwb3MxLCBwb3MyLCBwb3MzOwotICBjb25zdCBpbnQgaTE2ID0gKGl0LT5tYl8tPnR5cGVfID09IDEpOwotICBjb25zdCBpbnQgc2VnbWVudCA9IGl0LT5tYl8tPnNlZ21lbnRfOwotICBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKLQotICBWUDhJdGVyYXRvck56VG9CeXRlcyhpdCk7Ci0KLSAgcG9zMSA9IFZQOEJpdFdyaXRlclBvcyhidyk7Ci0gIGlmIChpMTYpIHsKLSAgICBJbml0UmVzaWR1YWwoMCwgMSwgZW5jLCAmcmVzKTsKLSAgICBTZXRSZXNpZHVhbENvZWZmcyhyZC0+eV9kY19sZXZlbHMsICZyZXMpOwotICAgIGl0LT50b3BfbnpfWzhdID0gaXQtPmxlZnRfbnpfWzhdID0KLSAgICAgIFB1dENvZWZmcyhidywgaXQtPnRvcF9uel9bOF0gKyBpdC0+bGVmdF9uel9bOF0sICZyZXMpOwotICAgIEluaXRSZXNpZHVhbCgxLCAwLCBlbmMsICZyZXMpOwotICB9IGVsc2UgewotICAgIEluaXRSZXNpZHVhbCgwLCAzLCBlbmMsICZyZXMpOwotICB9Ci0KLSAgLy8gbHVtYS1BQwotICBmb3IgKHkgPSAwOyB5IDwgNDsgKyt5KSB7Ci0gICAgZm9yICh4ID0gMDsgeCA8IDQ7ICsreCkgewotICAgICAgY29uc3QgaW50IGN0eCA9IGl0LT50b3BfbnpfW3hdICsgaXQtPmxlZnRfbnpfW3ldOwotICAgICAgU2V0UmVzaWR1YWxDb2VmZnMocmQtPnlfYWNfbGV2ZWxzW3ggKyB5ICogNF0sICZyZXMpOwotICAgICAgaXQtPnRvcF9uel9beF0gPSBpdC0+bGVmdF9uel9beV0gPSBQdXRDb2VmZnMoYncsIGN0eCwgJnJlcyk7Ci0gICAgfQotICB9Ci0gIHBvczIgPSBWUDhCaXRXcml0ZXJQb3MoYncpOwotCi0gIC8vIFUvVgotICBJbml0UmVzaWR1YWwoMCwgMiwgZW5jLCAmcmVzKTsKLSAgZm9yIChjaCA9IDA7IGNoIDw9IDI7IGNoICs9IDIpIHsKLSAgICBmb3IgKHkgPSAwOyB5IDwgMjsgKyt5KSB7Ci0gICAgICBmb3IgKHggPSAwOyB4IDwgMjsgKyt4KSB7Ci0gICAgICAgIGNvbnN0IGludCBjdHggPSBpdC0+dG9wX256X1s0ICsgY2ggKyB4XSArIGl0LT5sZWZ0X256X1s0ICsgY2ggKyB5XTsKLSAgICAgICAgU2V0UmVzaWR1YWxDb2VmZnMocmQtPnV2X2xldmVsc1tjaCAqIDIgKyB4ICsgeSAqIDJdLCAmcmVzKTsKLSAgICAgICAgaXQtPnRvcF9uel9bNCArIGNoICsgeF0gPSBpdC0+bGVmdF9uel9bNCArIGNoICsgeV0gPQotICAgICAgICAgICAgUHV0Q29lZmZzKGJ3LCBjdHgsICZyZXMpOwotICAgICAgfQotICAgIH0KLSAgfQotICBwb3MzID0gVlA4Qml0V3JpdGVyUG9zKGJ3KTsKLSAgaXQtPmx1bWFfYml0c18gPSBwb3MyIC0gcG9zMTsKLSAgaXQtPnV2X2JpdHNfID0gcG9zMyAtIHBvczI7Ci0gIGl0LT5iaXRfY291bnRfW3NlZ21lbnRdW2kxNl0gKz0gaXQtPmx1bWFfYml0c187Ci0gIGl0LT5iaXRfY291bnRfW3NlZ21lbnRdWzJdICs9IGl0LT51dl9iaXRzXzsKLSAgVlA4SXRlcmF0b3JCeXRlc1RvTnooaXQpOwotfQotCi0vLyBTYW1lIGFzIENvZGVSZXNpZHVhbHMsIGJ1dCBkb2Vzbid0IGFjdHVhbGx5IHdyaXRlIGFueXRoaW5nLgotLy8gSW5zdGVhZCwgaXQganVzdCByZWNvcmRzIHRoZSBldmVudCBkaXN0cmlidXRpb24uCi1zdGF0aWMgdm9pZCBSZWNvcmRSZXNpZHVhbHMoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOE1vZGVTY29yZSogY29uc3QgcmQpIHsKLSAgaW50IHgsIHksIGNoOwotICBWUDhSZXNpZHVhbCByZXM7Ci0gIFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOwotCi0gIFZQOEl0ZXJhdG9yTnpUb0J5dGVzKGl0KTsKLQotICBpZiAoaXQtPm1iXy0+dHlwZV8gPT0gMSkgeyAgIC8vIGkxNngxNgotICAgIEluaXRSZXNpZHVhbCgwLCAxLCBlbmMsICZyZXMpOwotICAgIFNldFJlc2lkdWFsQ29lZmZzKHJkLT55X2RjX2xldmVscywgJnJlcyk7Ci0gICAgaXQtPnRvcF9uel9bOF0gPSBpdC0+bGVmdF9uel9bOF0gPQotICAgICAgUmVjb3JkQ29lZmZzKGl0LT50b3BfbnpfWzhdICsgaXQtPmxlZnRfbnpfWzhdLCAmcmVzKTsKLSAgICBJbml0UmVzaWR1YWwoMSwgMCwgZW5jLCAmcmVzKTsKLSAgfSBlbHNlIHsKLSAgICBJbml0UmVzaWR1YWwoMCwgMywgZW5jLCAmcmVzKTsKLSAgfQotCi0gIC8vIGx1bWEtQUMKLSAgZm9yICh5ID0gMDsgeSA8IDQ7ICsreSkgewotICAgIGZvciAoeCA9IDA7IHggPCA0OyArK3gpIHsKLSAgICAgIGNvbnN0IGludCBjdHggPSBpdC0+dG9wX256X1t4XSArIGl0LT5sZWZ0X256X1t5XTsKLSAgICAgIFNldFJlc2lkdWFsQ29lZmZzKHJkLT55X2FjX2xldmVsc1t4ICsgeSAqIDRdLCAmcmVzKTsKLSAgICAgIGl0LT50b3BfbnpfW3hdID0gaXQtPmxlZnRfbnpfW3ldID0gUmVjb3JkQ29lZmZzKGN0eCwgJnJlcyk7Ci0gICAgfQotICB9Ci0KLSAgLy8gVS9WCi0gIEluaXRSZXNpZHVhbCgwLCAyLCBlbmMsICZyZXMpOwotICBmb3IgKGNoID0gMDsgY2ggPD0gMjsgY2ggKz0gMikgewotICAgIGZvciAoeSA9IDA7IHkgPCAyOyArK3kpIHsKLSAgICAgIGZvciAoeCA9IDA7IHggPCAyOyArK3gpIHsKLSAgICAgICAgY29uc3QgaW50IGN0eCA9IGl0LT50b3BfbnpfWzQgKyBjaCArIHhdICsgaXQtPmxlZnRfbnpfWzQgKyBjaCArIHldOwotICAgICAgICBTZXRSZXNpZHVhbENvZWZmcyhyZC0+dXZfbGV2ZWxzW2NoICogMiArIHggKyB5ICogMl0sICZyZXMpOwotICAgICAgICBpdC0+dG9wX256X1s0ICsgY2ggKyB4XSA9IGl0LT5sZWZ0X256X1s0ICsgY2ggKyB5XSA9Ci0gICAgICAgICAgICBSZWNvcmRDb2VmZnMoY3R4LCAmcmVzKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBWUDhJdGVyYXRvckJ5dGVzVG9OeihpdCk7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBUb2tlbiBidWZmZXIKLQotI2lmICFkZWZpbmVkKERJU0FCTEVfVE9LRU5fQlVGRkVSKQotCi1zdGF0aWMgdm9pZCBSZWNvcmRUb2tlbnMoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBjb25zdCBWUDhNb2RlU2NvcmUqIGNvbnN0IHJkLAotICAgICAgICAgICAgICAgICAgICAgICAgIFZQOFRCdWZmZXIqIGNvbnN0IHRva2VucykgewotICBpbnQgeCwgeSwgY2g7Ci0gIFZQOFJlc2lkdWFsIHJlczsKLSAgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187Ci0KLSAgVlA4SXRlcmF0b3JOelRvQnl0ZXMoaXQpOwotICBpZiAoaXQtPm1iXy0+dHlwZV8gPT0gMSkgeyAgIC8vIGkxNngxNgotICAgIGNvbnN0IGludCBjdHggPSBpdC0+dG9wX256X1s4XSArIGl0LT5sZWZ0X256X1s4XTsKLSAgICBJbml0UmVzaWR1YWwoMCwgMSwgZW5jLCAmcmVzKTsKLSAgICBTZXRSZXNpZHVhbENvZWZmcyhyZC0+eV9kY19sZXZlbHMsICZyZXMpOwotICAgIGl0LT50b3BfbnpfWzhdID0gaXQtPmxlZnRfbnpfWzhdID0KLSAgICAgICAgVlA4UmVjb3JkQ29lZmZUb2tlbnMoY3R4LCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuZmlyc3QsIHJlcy5sYXN0LCByZXMuY29lZmZzLCB0b2tlbnMpOwotICAgIFJlY29yZENvZWZmcyhjdHgsICZyZXMpOwotICAgIEluaXRSZXNpZHVhbCgxLCAwLCBlbmMsICZyZXMpOwotICB9IGVsc2UgewotICAgIEluaXRSZXNpZHVhbCgwLCAzLCBlbmMsICZyZXMpOwotICB9Ci0KLSAgLy8gbHVtYS1BQwotICBmb3IgKHkgPSAwOyB5IDwgNDsgKyt5KSB7Ci0gICAgZm9yICh4ID0gMDsgeCA8IDQ7ICsreCkgewotICAgICAgY29uc3QgaW50IGN0eCA9IGl0LT50b3BfbnpfW3hdICsgaXQtPmxlZnRfbnpfW3ldOwotICAgICAgU2V0UmVzaWR1YWxDb2VmZnMocmQtPnlfYWNfbGV2ZWxzW3ggKyB5ICogNF0sICZyZXMpOwotICAgICAgaXQtPnRvcF9uel9beF0gPSBpdC0+bGVmdF9uel9beV0gPQotICAgICAgICAgIFZQOFJlY29yZENvZWZmVG9rZW5zKGN0eCwgcmVzLmNvZWZmX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmZpcnN0LCByZXMubGFzdCwgcmVzLmNvZWZmcywgdG9rZW5zKTsKLSAgICAgIFJlY29yZENvZWZmcyhjdHgsICZyZXMpOwotICAgIH0KLSAgfQotCi0gIC8vIFUvVgotICBJbml0UmVzaWR1YWwoMCwgMiwgZW5jLCAmcmVzKTsKLSAgZm9yIChjaCA9IDA7IGNoIDw9IDI7IGNoICs9IDIpIHsKLSAgICBmb3IgKHkgPSAwOyB5IDwgMjsgKyt5KSB7Ci0gICAgICBmb3IgKHggPSAwOyB4IDwgMjsgKyt4KSB7Ci0gICAgICAgIGNvbnN0IGludCBjdHggPSBpdC0+dG9wX256X1s0ICsgY2ggKyB4XSArIGl0LT5sZWZ0X256X1s0ICsgY2ggKyB5XTsKLSAgICAgICAgU2V0UmVzaWR1YWxDb2VmZnMocmQtPnV2X2xldmVsc1tjaCAqIDIgKyB4ICsgeSAqIDJdLCAmcmVzKTsKLSAgICAgICAgaXQtPnRvcF9uel9bNCArIGNoICsgeF0gPSBpdC0+bGVmdF9uel9bNCArIGNoICsgeV0gPQotICAgICAgICAgICAgVlA4UmVjb3JkQ29lZmZUb2tlbnMoY3R4LCAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmZpcnN0LCByZXMubGFzdCwgcmVzLmNvZWZmcywgdG9rZW5zKTsKLSAgICAgICAgUmVjb3JkQ29lZmZzKGN0eCwgJnJlcyk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIFZQOEl0ZXJhdG9yQnl0ZXNUb056KGl0KTsKLX0KLQotI2VuZGlmICAgIC8vICFESVNBQkxFX1RPS0VOX0JVRkZFUgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRXh0cmFJbmZvIG1hcCAvIERlYnVnIGZ1bmN0aW9uCi0KLSNpZiBTRUdNRU5UX1ZJU1UKLXN0YXRpYyB2b2lkIFNldEJsb2NrKHVpbnQ4X3QqIHAsIGludCB2YWx1ZSwgaW50IHNpemUpIHsKLSAgaW50IHk7Ci0gIGZvciAoeSA9IDA7IHkgPCBzaXplOyArK3kpIHsKLSAgICBTYk1lbW9yeVNldChwLCB2YWx1ZSwgc2l6ZSk7Ci0gICAgcCArPSBCUFM7Ci0gIH0KLX0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBSZXNldFNTRShWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKLSAgZW5jLT5zc2VfWzBdID0gMDsKLSAgZW5jLT5zc2VfWzFdID0gMDsKLSAgZW5jLT5zc2VfWzJdID0gMDsKLSAgLy8gTm90ZTogZW5jLT5zc2VfWzNdIGlzIG1hbmFnZWQgYnkgYWxwaGEuYwotICBlbmMtPnNzZV9jb3VudF8gPSAwOwotfQotCi1zdGF0aWMgdm9pZCBTdG9yZVNTRShjb25zdCBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKLSAgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187Ci0gIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGluID0gaXQtPnl1dl9pbl87Ci0gIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IG91dCA9IGl0LT55dXZfb3V0XzsKLSAgLy8gTm90ZTogbm90IHRvdGFsbHkgYWNjdXJhdGUgYXQgYm91bmRhcnkuIEFuZCBkb2Vzbid0IGluY2x1ZGUgaW4tbG9vcCBmaWx0ZXIuCi0gIGVuYy0+c3NlX1swXSArPSBWUDhTU0UxNngxNihpbiArIFlfT0ZGLCBvdXQgKyBZX09GRik7Ci0gIGVuYy0+c3NlX1sxXSArPSBWUDhTU0U4eDgoaW4gKyBVX09GRiwgb3V0ICsgVV9PRkYpOwotICBlbmMtPnNzZV9bMl0gKz0gVlA4U1NFOHg4KGluICsgVl9PRkYsIG91dCArIFZfT0ZGKTsKLSAgZW5jLT5zc2VfY291bnRfICs9IDE2ICogMTY7Ci19Ci0KLXN0YXRpYyB2b2lkIFN0b3JlU2lkZUluZm8oY29uc3QgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KSB7Ci0gIFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOwotICBjb25zdCBWUDhNQkluZm8qIGNvbnN0IG1iID0gaXQtPm1iXzsKLSAgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYyA9IGVuYy0+cGljXzsKLQotICBpZiAocGljLT5zdGF0cyAhPSBOVUxMKSB7Ci0gICAgU3RvcmVTU0UoaXQpOwotICAgIGVuYy0+YmxvY2tfY291bnRfWzBdICs9IChtYi0+dHlwZV8gPT0gMCk7Ci0gICAgZW5jLT5ibG9ja19jb3VudF9bMV0gKz0gKG1iLT50eXBlXyA9PSAxKTsKLSAgICBlbmMtPmJsb2NrX2NvdW50X1syXSArPSAobWItPnNraXBfICE9IDApOwotICB9Ci0KLSAgaWYgKHBpYy0+ZXh0cmFfaW5mbyAhPSBOVUxMKSB7Ci0gICAgdWludDhfdCogY29uc3QgaW5mbyA9ICZwaWMtPmV4dHJhX2luZm9baXQtPnhfICsgaXQtPnlfICogZW5jLT5tYl93X107Ci0gICAgc3dpdGNoIChwaWMtPmV4dHJhX2luZm9fdHlwZSkgewotICAgICAgY2FzZSAxOiAqaW5mbyA9IG1iLT50eXBlXzsgYnJlYWs7Ci0gICAgICBjYXNlIDI6ICppbmZvID0gbWItPnNlZ21lbnRfOyBicmVhazsKLSAgICAgIGNhc2UgMzogKmluZm8gPSBlbmMtPmRxbV9bbWItPnNlZ21lbnRfXS5xdWFudF87IGJyZWFrOwotICAgICAgY2FzZSA0OiAqaW5mbyA9IChtYi0+dHlwZV8gPT0gMSkgPyBpdC0+cHJlZHNfWzBdIDogMHhmZjsgYnJlYWs7Ci0gICAgICBjYXNlIDU6ICppbmZvID0gbWItPnV2X21vZGVfOyBicmVhazsKLSAgICAgIGNhc2UgNjogewotICAgICAgICBjb25zdCBpbnQgYiA9IChpbnQpKChpdC0+bHVtYV9iaXRzXyArIGl0LT51dl9iaXRzXyArIDcpID4+IDMpOwotICAgICAgICAqaW5mbyA9IChiID4gMjU1KSA/IDI1NSA6IGI7IGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSA3OiAqaW5mbyA9IG1iLT5hbHBoYV87IGJyZWFrOwotICAgICAgZGVmYXVsdDogKmluZm8gPSAwOyBicmVhazsKLSAgICB9OwotICB9Ci0jaWYgU0VHTUVOVF9WSVNVICAvLyB2aXN1YWxpemUgc2VnbWVudHMgYW5kIHByZWRpY3Rpb24gbW9kZXMKLSAgU2V0QmxvY2soaXQtPnl1dl9vdXRfICsgWV9PRkYsIG1iLT5zZWdtZW50XyAqIDY0LCAxNik7Ci0gIFNldEJsb2NrKGl0LT55dXZfb3V0XyArIFVfT0ZGLCBpdC0+cHJlZHNfWzBdICogNjQsIDgpOwotICBTZXRCbG9jayhpdC0+eXV2X291dF8gKyBWX09GRiwgbWItPnV2X21vZGVfICogNjQsIDgpOwotI2VuZGlmCi19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgU3RhdExvb3AoKTogb25seSBjb2xsZWN0IHN0YXRpc3RpY3MgKG51bWJlciBvZiBza2lwcywgdG9rZW4gdXNhZ2UsIC4uLikuCi0vLyAgVGhpcyBpcyB1c2VkIGZvciBkZWNpZGluZyBvcHRpbWFsIHByb2JhYmlsaXRpZXMuIEl0IGFsc28gbW9kaWZpZXMgdGhlCi0vLyAgcXVhbnRpemVyIHZhbHVlIGlmIHNvbWUgdGFyZ2V0IChzaXplLCBQTlNSKSB3YXMgc3BlY2lmaWVkLgotCi0jZGVmaW5lIGtIZWFkZXJTaXplRXN0aW1hdGUgKDE1ICsgMjAgKyAxMCkgICAgICAvLyBUT0RPOiBmaXggYmV0dGVyCi0KLXN0YXRpYyB2b2lkIFNldExvb3BQYXJhbXMoVlA4RW5jb2RlciogY29uc3QgZW5jLCBmbG9hdCBxKSB7Ci0gIC8vIE1ha2Ugc3VyZSB0aGUgcXVhbGl0eSBwYXJhbWV0ZXIgaXMgaW5zaWRlIHZhbGlkIGJvdW5kcwotICBpZiAocSA8IDAuKSB7Ci0gICAgcSA9IDA7Ci0gIH0gZWxzZSBpZiAocSA+IDEwMC4pIHsKLSAgICBxID0gMTAwOwotICB9Ci0KLSAgVlA4U2V0U2VnbWVudFBhcmFtcyhlbmMsIHEpOyAgICAgIC8vIHNldHVwIHNlZ21lbnQgcXVhbnRpemF0aW9ucyBhbmQgZmlsdGVycwotICBTZXRTZWdtZW50UHJvYmFzKGVuYyk7ICAgICAgICAgICAgLy8gY29tcHV0ZSBzZWdtZW50IHByb2JhYmlsaXRpZXMKLQotICBSZXNldFN0YXRzKGVuYyk7Ci0gIFJlc2V0VG9rZW5TdGF0cyhlbmMpOwotCi0gIFJlc2V0U1NFKGVuYyk7Ci19Ci0KLXN0YXRpYyBpbnQgT25lU3RhdFBhc3MoVlA4RW5jb2RlciogY29uc3QgZW5jLCBmbG9hdCBxLCBWUDhSRExldmVsIHJkX29wdCwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IG5iX21icywgZmxvYXQqIGNvbnN0IFBTTlIsIGludCBwZXJjZW50X2RlbHRhKSB7Ci0gIFZQOEVuY0l0ZXJhdG9yIGl0OwotICB1aW50NjRfdCBzaXplID0gMDsKLSAgdWludDY0X3QgZGlzdG9ydGlvbiA9IDA7Ci0gIGNvbnN0IHVpbnQ2NF90IHBpeGVsX2NvdW50ID0gbmJfbWJzICogMzg0OwotCi0gIFNldExvb3BQYXJhbXMoZW5jLCBxKTsKLQotICBWUDhJdGVyYXRvckluaXQoZW5jLCAmaXQpOwotICBkbyB7Ci0gICAgVlA4TW9kZVNjb3JlIGluZm87Ci0gICAgVlA4SXRlcmF0b3JJbXBvcnQoJml0KTsKLSAgICBpZiAoVlA4RGVjaW1hdGUoJml0LCAmaW5mbywgcmRfb3B0KSkgewotICAgICAgLy8gSnVzdCByZWNvcmQgdGhlIG51bWJlciBvZiBza2lwcyBhbmQgYWN0IGxpa2Ugc2tpcF9wcm9iYSBpcyBub3QgdXNlZC4KLSAgICAgIGVuYy0+cHJvYmFfLm5iX3NraXBfKys7Ci0gICAgfQotICAgIFJlY29yZFJlc2lkdWFscygmaXQsICZpbmZvKTsKLSAgICBzaXplICs9IGluZm8uUjsKLSAgICBkaXN0b3J0aW9uICs9IGluZm8uRDsKLSAgICBpZiAocGVyY2VudF9kZWx0YSAmJiAhVlA4SXRlcmF0b3JQcm9ncmVzcygmaXQsIHBlcmNlbnRfZGVsdGEpKQotICAgICAgcmV0dXJuIDA7Ci0gIH0gd2hpbGUgKFZQOEl0ZXJhdG9yTmV4dCgmaXQsIGl0Lnl1dl9vdXRfKSAmJiAtLW5iX21icyA+IDApOwotICBzaXplICs9IEZpbmFsaXplU2tpcFByb2JhKGVuYyk7Ci0gIHNpemUgKz0gRmluYWxpemVUb2tlblByb2JhcygmZW5jLT5wcm9iYV8pOwotICBzaXplICs9IGVuYy0+c2VnbWVudF9oZHJfLnNpemVfOwotICBzaXplID0gKChzaXplICsgMTAyNCkgPj4gMTEpICsga0hlYWRlclNpemVFc3RpbWF0ZTsKLQotICBpZiAoUFNOUikgewotICAgICpQU05SID0gKGZsb2F0KSgxMC4qIGxvZzEwKDI1NS4gKiAyNTUuICogcGl4ZWxfY291bnQgLyBkaXN0b3J0aW9uKSk7Ci0gIH0KLSAgcmV0dXJuIChpbnQpc2l6ZTsKLX0KLQotLy8gc3VjY2Vzc2l2ZSByZWZpbmVtZW50IGluY3JlbWVudHMuCi1zdGF0aWMgY29uc3QgaW50IGRxc1tdID0geyAyMCwgMTUsIDEwLCA4LCA2LCA0LCAyLCAxLCAwIH07Ci0KLXN0YXRpYyBpbnQgU3RhdExvb3AoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7Ci0gIGNvbnN0IGludCBtZXRob2QgPSBlbmMtPm1ldGhvZF87Ci0gIGNvbnN0IGludCBkb19zZWFyY2ggPSBlbmMtPmRvX3NlYXJjaF87Ci0gIGNvbnN0IGludCBmYXN0X3Byb2JlID0gKChtZXRob2QgPT0gMCB8fCBtZXRob2QgPT0gMykgJiYgIWRvX3NlYXJjaCk7Ci0gIGZsb2F0IHEgPSBlbmMtPmNvbmZpZ18tPnF1YWxpdHk7Ci0gIGNvbnN0IGludCBtYXhfcGFzc2VzID0gZW5jLT5jb25maWdfLT5wYXNzOwotICBjb25zdCBpbnQgdGFza19wZXJjZW50ID0gMjA7Ci0gIGNvbnN0IGludCBwZXJjZW50X3Blcl9wYXNzID0gKHRhc2tfcGVyY2VudCArIG1heF9wYXNzZXMgLyAyKSAvIG1heF9wYXNzZXM7Ci0gIGNvbnN0IGludCBmaW5hbF9wZXJjZW50ID0gZW5jLT5wZXJjZW50XyArIHRhc2tfcGVyY2VudDsKLSAgaW50IHBhc3M7Ci0gIGludCBuYl9tYnM7Ci0KLSAgLy8gRmFzdCBtb2RlOiBxdWljayBhbmFseXNpcyBwYXNzIG92ZXIgZmV3IG1icy4gQmV0dGVyIHRoYW4gbm90aGluZy4KLSAgbmJfbWJzID0gZW5jLT5tYl93XyAqIGVuYy0+bWJfaF87Ci0gIGlmIChmYXN0X3Byb2JlKSB7Ci0gICAgaWYgKG1ldGhvZCA9PSAzKSB7ICAvLyB3ZSBuZWVkIG1vcmUgc3RhdHMgZm9yIG1ldGhvZCAzIHRvIGJlIHJlbGlhYmxlLgotICAgICAgbmJfbWJzID0gKG5iX21icyA+IDIwMCkgPyBuYl9tYnMgPj4gMSA6IDEwMDsKLSAgICB9IGVsc2UgewotICAgICAgbmJfbWJzID0gKG5iX21icyA+IDIwMCkgPyBuYl9tYnMgPj4gMiA6IDUwOwotICAgIH0KLSAgfQotCi0gIC8vIE5vIHRhcmdldCBzaXplOiBqdXN0IGRvIHNldmVyYWwgcGFzcyB3aXRob3V0IGNoYW5naW5nICdxJwotICBpZiAoIWRvX3NlYXJjaCkgewotICAgIGZvciAocGFzcyA9IDA7IHBhc3MgPCBtYXhfcGFzc2VzOyArK3Bhc3MpIHsKLSAgICAgIGNvbnN0IFZQOFJETGV2ZWwgcmRfb3B0ID0gKG1ldGhvZCA+PSAzKSA/IFJEX09QVF9CQVNJQyA6IFJEX09QVF9OT05FOwotICAgICAgaWYgKCFPbmVTdGF0UGFzcyhlbmMsIHEsIHJkX29wdCwgbmJfbWJzLCBOVUxMLCBwZXJjZW50X3Blcl9wYXNzKSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgLy8gYmluYXJ5IHNlYXJjaCBmb3IgYSBzaXplIGNsb3NlIHRvIHRhcmdldAotICAgIGZvciAocGFzcyA9IDA7IHBhc3MgPCBtYXhfcGFzc2VzICYmIChkcXNbcGFzc10gPiAwKTsgKytwYXNzKSB7Ci0gICAgICBmbG9hdCBQU05SOwotICAgICAgaW50IGNyaXRlcmlvbjsKLSAgICAgIGNvbnN0IGludCBzaXplID0gT25lU3RhdFBhc3MoZW5jLCBxLCBSRF9PUFRfQkFTSUMsIG5iX21icywgJlBTTlIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnRfcGVyX3Bhc3MpOwotI2lmIERFQlVHX1NFQVJDSAotICAgICAgcHJpbnRmKCIjJWQgc2l6ZT0lZCBQU05SPSUuMmYgcT0lLjJmXG4iLCBwYXNzLCBzaXplLCBQU05SLCBxKTsKLSNlbmRpZgotICAgICAgaWYgKHNpemUgPT0gMCkgcmV0dXJuIDA7Ci0gICAgICBpZiAoZW5jLT5jb25maWdfLT50YXJnZXRfUFNOUiA+IDApIHsKLSAgICAgICAgY3JpdGVyaW9uID0gKFBTTlIgPCBlbmMtPmNvbmZpZ18tPnRhcmdldF9QU05SKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNyaXRlcmlvbiA9IChzaXplIDwgZW5jLT5jb25maWdfLT50YXJnZXRfc2l6ZSk7Ci0gICAgICB9Ci0gICAgICAvLyBkaWNob3RvbWl6ZQotICAgICAgaWYgKGNyaXRlcmlvbikgewotICAgICAgICBxICs9IGRxc1twYXNzXTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHEgLT0gZHFzW3Bhc3NdOwotICAgICAgfQotICAgIH0KLSAgfQotICBWUDhDYWxjdWxhdGVMZXZlbENvc3RzKCZlbmMtPnByb2JhXyk7ICAvLyBmaW5hbGl6ZSBjb3N0cwotICByZXR1cm4gV2ViUFJlcG9ydFByb2dyZXNzKGVuYy0+cGljXywgZmluYWxfcGVyY2VudCwgJmVuYy0+cGVyY2VudF8pOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTWFpbiBsb29wcwotLy8KLQotc3RhdGljIGNvbnN0IGludCBrQXZlcmFnZUJ5dGVzUGVyTUJbOF0gPSB7IDUwLCAyNCwgMTYsIDksIDcsIDUsIDMsIDIgfTsKLQotc3RhdGljIGludCBQcmVMb29wSW5pdGlhbGl6ZShWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKLSAgaW50IHA7Ci0gIGludCBvayA9IDE7Ci0gIGNvbnN0IGludCBhdmVyYWdlX2J5dGVzX3Blcl9NQiA9IGtBdmVyYWdlQnl0ZXNQZXJNQltlbmMtPmJhc2VfcXVhbnRfID4+IDRdOwotICBjb25zdCBpbnQgYnl0ZXNfcGVyX3BhcnRzID0KLSAgICAgIGVuYy0+bWJfd18gKiBlbmMtPm1iX2hfICogYXZlcmFnZV9ieXRlc19wZXJfTUIgLyBlbmMtPm51bV9wYXJ0c187Ci0gIC8vIEluaXRpYWxpemUgdGhlIGJpdC13cml0ZXJzCi0gIGZvciAocCA9IDA7IG9rICYmIHAgPCBlbmMtPm51bV9wYXJ0c187ICsrcCkgewotICAgIG9rID0gVlA4Qml0V3JpdGVySW5pdChlbmMtPnBhcnRzXyArIHAsIGJ5dGVzX3Blcl9wYXJ0cyk7Ci0gIH0KLSAgaWYgKCFvaykgVlA4RW5jRnJlZUJpdFdyaXRlcnMoZW5jKTsgIC8vIG1hbGxvYyBlcnJvciBvY2N1cnJlZAotICByZXR1cm4gb2s7Ci19Ci0KLXN0YXRpYyBpbnQgUG9zdExvb3BGaW5hbGl6ZShWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsIGludCBvaykgewotICBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKLSAgaWYgKG9rKSB7ICAgICAgLy8gRmluYWxpemUgdGhlIHBhcnRpdGlvbnMsIGNoZWNrIGZvciBleHRyYSBlcnJvcnMuCi0gICAgaW50IHA7Ci0gICAgZm9yIChwID0gMDsgcCA8IGVuYy0+bnVtX3BhcnRzXzsgKytwKSB7Ci0gICAgICBWUDhCaXRXcml0ZXJGaW5pc2goZW5jLT5wYXJ0c18gKyBwKTsKLSAgICAgIG9rICY9ICFlbmMtPnBhcnRzX1twXS5lcnJvcl87Ci0gICAgfQotICB9Ci0KLSAgaWYgKG9rKSB7ICAgICAgLy8gQWxsIGdvb2QuIEZpbmlzaCB1cC4KLSAgICBpZiAoZW5jLT5waWNfLT5zdGF0cykgeyAgICAgICAgICAgLy8gZmluYWxpemUgYnl0ZSBjb3VudGVycy4uLgotICAgICAgaW50IGksIHM7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDw9IDI7ICsraSkgewotICAgICAgICBmb3IgKHMgPSAwOyBzIDwgTlVNX01CX1NFR01FTlRTOyArK3MpIHsKLSAgICAgICAgICBlbmMtPnJlc2lkdWFsX2J5dGVzX1tpXVtzXSA9IChpbnQpKChpdC0+Yml0X2NvdW50X1tzXVtpXSArIDcpID4+IDMpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIFZQOEFkanVzdEZpbHRlclN0cmVuZ3RoKGl0KTsgICAgIC8vIC4uLmFuZCBzdG9yZSBmaWx0ZXIgc3RhdHMuCi0gIH0gZWxzZSB7Ci0gICAgLy8gU29tZXRoaW5nIGJhZCBoYXBwZW5lZCAtPiBuZWVkIHRvIGRvIHNvbWUgbWVtb3J5IGNsZWFudXAuCi0gICAgVlA4RW5jRnJlZUJpdFdyaXRlcnMoZW5jKTsKLSAgfQotICByZXR1cm4gb2s7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgVlA4RW5jTG9vcCgpOiBkb2VzIHRoZSBmaW5hbCBiaXRzdHJlYW0gY29kaW5nLgotCi1zdGF0aWMgdm9pZCBSZXNldEFmdGVyU2tpcChWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKLSAgaWYgKGl0LT5tYl8tPnR5cGVfID09IDEpIHsKLSAgICAqaXQtPm56XyA9IDA7ICAvLyByZXNldCBhbGwgcHJlZGljdG9ycwotICAgIGl0LT5sZWZ0X256X1s4XSA9IDA7Ci0gIH0gZWxzZSB7Ci0gICAgKml0LT5uel8gJj0gKDEgPDwgMjQpOyAgLy8gcHJlc2VydmUgdGhlIGRjX256IGJpdAotICB9Ci19Ci0KLWludCBWUDhFbmNMb29wKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgewotICBWUDhFbmNJdGVyYXRvciBpdDsKLSAgaW50IG9rID0gUHJlTG9vcEluaXRpYWxpemUoZW5jKTsKLSAgaWYgKCFvaykgcmV0dXJuIDA7Ci0KLSAgU3RhdExvb3AoZW5jKTsgIC8vIHN0YXRzLWNvbGxlY3Rpb24gbG9vcAotCi0gIFZQOEl0ZXJhdG9ySW5pdChlbmMsICZpdCk7Ci0gIFZQOEluaXRGaWx0ZXIoJml0KTsKLSAgZG8gewotICAgIFZQOE1vZGVTY29yZSBpbmZvOwotICAgIGNvbnN0IGludCBkb250X3VzZV9za2lwID0gIWVuYy0+cHJvYmFfLnVzZV9za2lwX3Byb2JhXzsKLSAgICBjb25zdCBWUDhSRExldmVsIHJkX29wdCA9IGVuYy0+cmRfb3B0X2xldmVsXzsKLQotICAgIFZQOEl0ZXJhdG9ySW1wb3J0KCZpdCk7Ci0gICAgLy8gV2FybmluZyEgb3JkZXIgaXMgaW1wb3J0YW50OiBmaXJzdCBjYWxsIFZQOERlY2ltYXRlKCkgYW5kCi0gICAgLy8gKnRoZW4qIGRlY2lkZSBob3cgdG8gY29kZSB0aGUgc2tpcCBkZWNpc2lvbiBpZiB0aGVyZSdzIG9uZS4KLSAgICBpZiAoIVZQOERlY2ltYXRlKCZpdCwgJmluZm8sIHJkX29wdCkgfHwgZG9udF91c2Vfc2tpcCkgewotICAgICAgQ29kZVJlc2lkdWFscyhpdC5id18sICZpdCwgJmluZm8pOwotICAgIH0gZWxzZSB7ICAgLy8gcmVzZXQgcHJlZGljdG9ycyBhZnRlciBhIHNraXAKLSAgICAgIFJlc2V0QWZ0ZXJTa2lwKCZpdCk7Ci0gICAgfQotI2lmZGVmIFdFQlBfRVhQRVJJTUVOVEFMX0ZFQVRVUkVTCi0gICAgaWYgKGVuYy0+dXNlX2xheWVyXykgewotICAgICAgVlA4RW5jQ29kZUxheWVyQmxvY2soJml0KTsKLSAgICB9Ci0jZW5kaWYKLSAgICBTdG9yZVNpZGVJbmZvKCZpdCk7Ci0gICAgVlA4U3RvcmVGaWx0ZXJTdGF0cygmaXQpOwotICAgIFZQOEl0ZXJhdG9yRXhwb3J0KCZpdCk7Ci0gICAgb2sgPSBWUDhJdGVyYXRvclByb2dyZXNzKCZpdCwgMjApOwotICB9IHdoaWxlIChvayAmJiBWUDhJdGVyYXRvck5leHQoJml0LCBpdC55dXZfb3V0XykpOwotCi0gIHJldHVybiBQb3N0TG9vcEZpbmFsaXplKCZpdCwgb2spOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gU2luZ2xlIHBhc3MgdXNpbmcgVG9rZW4gQnVmZmVyLgotCi0jaWYgIWRlZmluZWQoRElTQUJMRV9UT0tFTl9CVUZGRVIpCi0KLSNkZWZpbmUgTUlOX0NPVU5UIDk2ICAgLy8gbWluaW11bSBudW1iZXIgb2YgbWFjcm9ibG9ja3MgYmVmb3JlIHVwZGF0aW5nIHN0YXRzCi0KLWludCBWUDhFbmNUb2tlbkxvb3AoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7Ci0gIGludCBvazsKLSAgLy8gUm91Z2hseSByZWZyZXNoIHRoZSBwcm9iYSBoZWlnaHQgdGltZXMgcGVyIHBhc3MKLSAgaW50IG1heF9jb3VudCA9IChlbmMtPm1iX3dfICogZW5jLT5tYl9oXykgPj4gMzsKLSAgaW50IGNudDsKLSAgVlA4RW5jSXRlcmF0b3IgaXQ7Ci0gIFZQOFByb2JhKiBjb25zdCBwcm9iYSA9ICZlbmMtPnByb2JhXzsKLSAgY29uc3QgVlA4UkRMZXZlbCByZF9vcHQgPSBlbmMtPnJkX29wdF9sZXZlbF87Ci0KLSAgaWYgKG1heF9jb3VudCA8IE1JTl9DT1VOVCkgbWF4X2NvdW50ID0gTUlOX0NPVU5UOwotICBjbnQgPSBtYXhfY291bnQ7Ci0KLSAgU0JfRENIRUNLKGVuYy0+bnVtX3BhcnRzXyA9PSAxKTsKLSAgU0JfRENIRUNLKGVuYy0+dXNlX3Rva2Vuc18pOwotICBTQl9EQ0hFQ0socHJvYmEtPnVzZV9za2lwX3Byb2JhXyA9PSAwKTsKLSAgU0JfRENIRUNLKHJkX29wdCA+PSBSRF9PUFRfQkFTSUMpOyAgIC8vIG90aGVyd2lzZSwgdG9rZW4tYnVmZmVyIHdvbid0IGJlIHVzZWZ1bAotICBTQl9EQ0hFQ0soIWVuYy0+ZG9fc2VhcmNoXyk7ICAgICAgICAgLy8gVE9ETyhza2FsKTogaGFuZGxlIHBhc3MgYW5kIGRpY2hvdG9teQotCi0gIFNldExvb3BQYXJhbXMoZW5jLCBlbmMtPmNvbmZpZ18tPnF1YWxpdHkpOwotCi0gIG9rID0gUHJlTG9vcEluaXRpYWxpemUoZW5jKTsKLSAgaWYgKCFvaykgcmV0dXJuIDA7Ci0KLSAgVlA4SXRlcmF0b3JJbml0KGVuYywgJml0KTsKLSAgVlA4SW5pdEZpbHRlcigmaXQpOwotICBkbyB7Ci0gICAgVlA4TW9kZVNjb3JlIGluZm87Ci0gICAgVlA4SXRlcmF0b3JJbXBvcnQoJml0KTsKLSAgICBpZiAoLS1jbnQgPCAwKSB7Ci0gICAgICBGaW5hbGl6ZVRva2VuUHJvYmFzKHByb2JhKTsKLSAgICAgIFZQOENhbGN1bGF0ZUxldmVsQ29zdHMocHJvYmEpOyAgLy8gcmVmcmVzaCBjb3N0IHRhYmxlcyBmb3IgcmQtb3B0Ci0gICAgICBjbnQgPSBtYXhfY291bnQ7Ci0gICAgfQotICAgIFZQOERlY2ltYXRlKCZpdCwgJmluZm8sIHJkX29wdCk7Ci0gICAgUmVjb3JkVG9rZW5zKCZpdCwgJmluZm8sICZlbmMtPnRva2Vuc18pOwotI2lmZGVmIFdFQlBfRVhQRVJJTUVOVEFMX0ZFQVRVUkVTCi0gICAgaWYgKGVuYy0+dXNlX2xheWVyXykgewotICAgICAgVlA4RW5jQ29kZUxheWVyQmxvY2soJml0KTsKLSAgICB9Ci0jZW5kaWYKLSAgICBTdG9yZVNpZGVJbmZvKCZpdCk7Ci0gICAgVlA4U3RvcmVGaWx0ZXJTdGF0cygmaXQpOwotICAgIFZQOEl0ZXJhdG9yRXhwb3J0KCZpdCk7Ci0gICAgb2sgPSBWUDhJdGVyYXRvclByb2dyZXNzKCZpdCwgMjApOwotICB9IHdoaWxlIChvayAmJiBWUDhJdGVyYXRvck5leHQoJml0LCBpdC55dXZfb3V0XykpOwotCi0gIG9rID0gb2sgJiYgV2ViUFJlcG9ydFByb2dyZXNzKGVuYy0+cGljXywgZW5jLT5wZXJjZW50XyArIDIwLCAmZW5jLT5wZXJjZW50Xyk7Ci0KLSAgaWYgKG9rKSB7Ci0gICAgRmluYWxpemVUb2tlblByb2Jhcyhwcm9iYSk7Ci0gICAgb2sgPSBWUDhFbWl0VG9rZW5zKCZlbmMtPnRva2Vuc18sIGVuYy0+cGFydHNfICsgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QqKXByb2JhLT5jb2VmZnNfLCAxKTsKLSAgfQotCi0gIHJldHVybiBQb3N0TG9vcEZpbmFsaXplKCZpdCwgb2spOwotfQotCi0jZWxzZQotCi1pbnQgVlA4RW5jVG9rZW5Mb29wKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgewotICAodm9pZCllbmM7Ci0gIHJldHVybiAwOyAgIC8vIHdlIHNob3VsZG4ndCBiZSBoZXJlLgotfQotCi0jZW5kaWYgICAgLy8gRElTQUJMRV9UT0tFTl9CVUZGRVIKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvaGlzdG9ncmFtLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvaGlzdG9ncmFtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NGMzNzcuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL2hpc3RvZ3JhbS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTE5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBBdXRob3I6IEp5cmtpIEFsYWt1aWphbGEgKGp5cmtpQGdvb2dsZS5jb20pCi0vLwotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNlbHNlCi0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgIi4vYmFja3dhcmRfcmVmZXJlbmNlcy5oIgotI2luY2x1ZGUgIi4vaGlzdG9ncmFtLmgiCi0jaW5jbHVkZSAiLi4vZHNwL2xvc3NsZXNzLmgiCi0jaW5jbHVkZSAiLi4vdXRpbHMvdXRpbHMuaCIKLQotc3RhdGljIHZvaWQgSGlzdG9ncmFtQ2xlYXIoVlA4TEhpc3RvZ3JhbSogY29uc3QgcCkgewotICBTYk1lbW9yeVNldChwLT5saXRlcmFsXywgMCwgc2l6ZW9mKHAtPmxpdGVyYWxfKSk7Ci0gIFNiTWVtb3J5U2V0KHAtPnJlZF8sIDAsIHNpemVvZihwLT5yZWRfKSk7Ci0gIFNiTWVtb3J5U2V0KHAtPmJsdWVfLCAwLCBzaXplb2YocC0+Ymx1ZV8pKTsKLSAgU2JNZW1vcnlTZXQocC0+YWxwaGFfLCAwLCBzaXplb2YocC0+YWxwaGFfKSk7Ci0gIFNiTWVtb3J5U2V0KHAtPmRpc3RhbmNlXywgMCwgc2l6ZW9mKHAtPmRpc3RhbmNlXykpOwotICBwLT5iaXRfY29zdF8gPSAwOwotfQotCi12b2lkIFZQOExIaXN0b2dyYW1TdG9yZVJlZnMoY29uc3QgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMSGlzdG9ncmFtKiBjb25zdCBoaXN0bykgewotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IHJlZnMtPnNpemU7ICsraSkgewotICAgIFZQOExIaXN0b2dyYW1BZGRTaW5nbGVQaXhPckNvcHkoaGlzdG8sICZyZWZzLT5yZWZzW2ldKTsKLSAgfQotfQotCi12b2lkIFZQOExIaXN0b2dyYW1DcmVhdGUoVlA4TEhpc3RvZ3JhbSogY29uc3QgcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYWxldHRlX2NvZGVfYml0cykgewotICBpZiAocGFsZXR0ZV9jb2RlX2JpdHMgPj0gMCkgewotICAgIHAtPnBhbGV0dGVfY29kZV9iaXRzXyA9IHBhbGV0dGVfY29kZV9iaXRzOwotICB9Ci0gIEhpc3RvZ3JhbUNsZWFyKHApOwotICBWUDhMSGlzdG9ncmFtU3RvcmVSZWZzKHJlZnMsIHApOwotfQotCi12b2lkIFZQOExIaXN0b2dyYW1Jbml0KFZQOExIaXN0b2dyYW0qIGNvbnN0IHAsIGludCBwYWxldHRlX2NvZGVfYml0cykgewotICBwLT5wYWxldHRlX2NvZGVfYml0c18gPSBwYWxldHRlX2NvZGVfYml0czsKLSAgSGlzdG9ncmFtQ2xlYXIocCk7Ci19Ci0KLVZQOExIaXN0b2dyYW1TZXQqIFZQOExBbGxvY2F0ZUhpc3RvZ3JhbVNldChpbnQgc2l6ZSwgaW50IGNhY2hlX2JpdHMpIHsKLSAgaW50IGk7Ci0gIFZQOExIaXN0b2dyYW1TZXQqIHNldDsKLSAgVlA4TEhpc3RvZ3JhbSogYnVsazsKLSAgY29uc3QgdWludDY0X3QgdG90YWxfc2l6ZSA9IHNpemVvZigqc2V0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKHVpbnQ2NF90KXNpemUgKiBzaXplb2YoKnNldC0+aGlzdG9ncmFtcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICh1aW50NjRfdClzaXplICogc2l6ZW9mKCoqc2V0LT5oaXN0b2dyYW1zKTsKLSAgdWludDhfdCogbWVtb3J5ID0gKHVpbnQ4X3QqKVdlYlBTYWZlTWFsbG9jKHRvdGFsX3NpemUsIHNpemVvZigqbWVtb3J5KSk7Ci0gIGlmIChtZW1vcnkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLSAgc2V0ID0gKFZQOExIaXN0b2dyYW1TZXQqKW1lbW9yeTsKLSAgbWVtb3J5ICs9IHNpemVvZigqc2V0KTsKLSAgc2V0LT5oaXN0b2dyYW1zID0gKFZQOExIaXN0b2dyYW0qKiltZW1vcnk7Ci0gIG1lbW9yeSArPSBzaXplICogc2l6ZW9mKCpzZXQtPmhpc3RvZ3JhbXMpOwotICBidWxrID0gKFZQOExIaXN0b2dyYW0qKW1lbW9yeTsKLSAgc2V0LT5tYXhfc2l6ZSA9IHNpemU7Ci0gIHNldC0+c2l6ZSA9IHNpemU7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKLSAgICBzZXQtPmhpc3RvZ3JhbXNbaV0gPSBidWxrICsgaTsKLSAgICBWUDhMSGlzdG9ncmFtSW5pdChzZXQtPmhpc3RvZ3JhbXNbaV0sIGNhY2hlX2JpdHMpOwotICB9Ci0gIHJldHVybiBzZXQ7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgVlA4TEhpc3RvZ3JhbUFkZFNpbmdsZVBpeE9yQ29weShWUDhMSGlzdG9ncmFtKiBjb25zdCBoaXN0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQaXhPckNvcHkqIGNvbnN0IHYpIHsKLSAgaWYgKFBpeE9yQ29weUlzTGl0ZXJhbCh2KSkgewotICAgICsraGlzdG8tPmFscGhhX1tQaXhPckNvcHlMaXRlcmFsKHYsIDMpXTsKLSAgICArK2hpc3RvLT5yZWRfW1BpeE9yQ29weUxpdGVyYWwodiwgMildOwotICAgICsraGlzdG8tPmxpdGVyYWxfW1BpeE9yQ29weUxpdGVyYWwodiwgMSldOwotICAgICsraGlzdG8tPmJsdWVfW1BpeE9yQ29weUxpdGVyYWwodiwgMCldOwotICB9IGVsc2UgaWYgKFBpeE9yQ29weUlzQ2FjaGVJZHgodikpIHsKLSAgICBpbnQgbGl0ZXJhbF9peCA9IDI1NiArIE5VTV9MRU5HVEhfQ09ERVMgKyBQaXhPckNvcHlDYWNoZUlkeCh2KTsKLSAgICArK2hpc3RvLT5saXRlcmFsX1tsaXRlcmFsX2l4XTsKLSAgfSBlbHNlIHsKLSAgICBpbnQgY29kZSwgZXh0cmFfYml0c19jb3VudCwgZXh0cmFfYml0c192YWx1ZTsKLSAgICBQcmVmaXhFbmNvZGUoUGl4T3JDb3B5TGVuZ3RoKHYpLAotICAgICAgICAgICAgICAgICAmY29kZSwgJmV4dHJhX2JpdHNfY291bnQsICZleHRyYV9iaXRzX3ZhbHVlKTsKLSAgICArK2hpc3RvLT5saXRlcmFsX1syNTYgKyBjb2RlXTsKLSAgICBQcmVmaXhFbmNvZGUoUGl4T3JDb3B5RGlzdGFuY2UodiksCi0gICAgICAgICAgICAgICAgICZjb2RlLCAmZXh0cmFfYml0c19jb3VudCwgJmV4dHJhX2JpdHNfdmFsdWUpOwotICAgICsraGlzdG8tPmRpc3RhbmNlX1tjb2RlXTsKLSAgfQotfQotCi1zdGF0aWMgZG91YmxlIEJpdHNFbnRyb3B5KGNvbnN0IGludCogY29uc3QgYXJyYXksIGludCBuKSB7Ci0gIGRvdWJsZSByZXR2YWwgPSAwLjsKLSAgaW50IHN1bSA9IDA7Ci0gIGludCBub256ZXJvcyA9IDA7Ci0gIGludCBtYXhfdmFsID0gMDsKLSAgaW50IGk7Ci0gIGRvdWJsZSBtaXg7Ci0gIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKLSAgICBpZiAoYXJyYXlbaV0gIT0gMCkgewotICAgICAgc3VtICs9IGFycmF5W2ldOwotICAgICAgKytub256ZXJvczsKLSAgICAgIHJldHZhbCAtPSBWUDhMRmFzdFNMb2cyKGFycmF5W2ldKTsKLSAgICAgIGlmIChtYXhfdmFsIDwgYXJyYXlbaV0pIHsKLSAgICAgICAgbWF4X3ZhbCA9IGFycmF5W2ldOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR2YWwgKz0gVlA4TEZhc3RTTG9nMihzdW0pOwotCi0gIGlmIChub256ZXJvcyA8IDUpIHsKLSAgICBpZiAobm9uemVyb3MgPD0gMSkgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIC8vIFR3byBzeW1ib2xzLCB0aGV5IHdpbGwgYmUgMCBhbmQgMSBpbiBhIEh1ZmZtYW4gY29kZS4KLSAgICAvLyBMZXQncyBtaXggaW4gYSBiaXQgb2YgZW50cm9weSB0byBmYXZvciBnb29kIGNsdXN0ZXJpbmcgd2hlbgotICAgIC8vIGRpc3RyaWJ1dGlvbnMgb2YgdGhlc2UgYXJlIGNvbWJpbmVkLgotICAgIGlmIChub256ZXJvcyA9PSAyKSB7Ci0gICAgICByZXR1cm4gMC45OSAqIHN1bSArIDAuMDEgKiByZXR2YWw7Ci0gICAgfQotICAgIC8vIE5vIG1hdHRlciB3aGF0IHRoZSBlbnRyb3B5IHNheXMsIHdlIGNhbm5vdCBiZSBiZXR0ZXIgdGhhbiBtaW5fbGltaXQKLSAgICAvLyB3aXRoIEh1ZmZtYW4gY29kaW5nLiBJIGFtIG1peGluZyBhIGJpdCBvZiBlbnRyb3B5IGludG8gdGhlCi0gICAgLy8gbWluX2xpbWl0IHNpbmNlIGl0IHByb2R1Y2VzIG11Y2ggYmV0dGVyICh+MC41ICUpIGNvbXByZXNzaW9uIHJlc3VsdHMKLSAgICAvLyBwZXJoYXBzIGJlY2F1c2Ugb2YgYmV0dGVyIGVudHJvcHkgY2x1c3RlcmluZy4KLSAgICBpZiAobm9uemVyb3MgPT0gMykgewotICAgICAgbWl4ID0gMC45NTsKLSAgICB9IGVsc2UgewotICAgICAgbWl4ID0gMC43OyAgLy8gbm9uemVyb3MgPT0gNC4KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgbWl4ID0gMC42Mjc7Ci0gIH0KLQotICB7Ci0gICAgZG91YmxlIG1pbl9saW1pdCA9IDIgKiBzdW0gLSBtYXhfdmFsOwotICAgIG1pbl9saW1pdCA9IG1peCAqIG1pbl9saW1pdCArICgxLjAgLSBtaXgpICogcmV0dmFsOwotICAgIHJldHVybiAocmV0dmFsIDwgbWluX2xpbWl0KSA/IG1pbl9saW1pdCA6IHJldHZhbDsKLSAgfQotfQotCi0vLyBSZXR1cm5zIHRoZSBjb3N0IGVuY29kZSB0aGUgcmxlLWVuY29kZWQgZW50cm9weSBjb2RlLgotLy8gVGhlIGNvbnN0YW50cyBpbiB0aGlzIGZ1bmN0aW9uIGFyZSBleHBlcmltZW50YWwuCi1zdGF0aWMgZG91YmxlIEh1ZmZtYW5Db3N0KGNvbnN0IGludCogY29uc3QgcG9wdWxhdGlvbiwgaW50IGxlbmd0aCkgewotICAvLyBTbWFsbCBiaWFzIGJlY2F1c2UgSHVmZm1hbiBjb2RlIGxlbmd0aCBpcyB0eXBpY2FsbHkgbm90IHN0b3JlZCBpbgotICAvLyBmdWxsIGxlbmd0aC4KLSAgc3RhdGljIGNvbnN0IGludCBrSHVmZm1hbkNvZGVPZkh1ZmZtYW5Db2RlU2l6ZSA9IENPREVfTEVOR1RIX0NPREVTICogMzsKLSAgc3RhdGljIGNvbnN0IGRvdWJsZSBrU21hbGxCaWFzID0gOS4xOwotICBkb3VibGUgcmV0dmFsID0ga0h1ZmZtYW5Db2RlT2ZIdWZmbWFuQ29kZVNpemUgLSBrU21hbGxCaWFzOwotICBpbnQgc3RyZWFrID0gMDsKLSAgaW50IGkgPSAwOwotICBmb3IgKDsgaSA8IGxlbmd0aCAtIDE7ICsraSkgewotICAgICsrc3RyZWFrOwotICAgIGlmIChwb3B1bGF0aW9uW2ldID09IHBvcHVsYXRpb25baSArIDFdKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gbGFzdF9zdHJlYWtfaGFjazoKLSAgICAvLyBwb3B1bGF0aW9uW2ldIHBvaW50cyBub3cgdG8gdGhlIHN5bWJvbCBpbiB0aGUgc3RyZWFrIG9mIHNhbWUgdmFsdWVzLgotICAgIGlmIChzdHJlYWsgPiAzKSB7Ci0gICAgICBpZiAocG9wdWxhdGlvbltpXSA9PSAwKSB7Ci0gICAgICAgIHJldHZhbCArPSAxLjU2MjUgKyAwLjIzNDM3NSAqIHN0cmVhazsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHZhbCArPSAyLjU3ODEyNSArIDAuNzAzMTI1ICogc3RyZWFrOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAocG9wdWxhdGlvbltpXSA9PSAwKSB7Ci0gICAgICAgIHJldHZhbCArPSAxLjc5Njg3NSAqIHN0cmVhazsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHZhbCArPSAzLjI4MTI1ICogc3RyZWFrOwotICAgICAgfQotICAgIH0KLSAgICBzdHJlYWsgPSAwOwotICB9Ci0gIGlmIChpID09IGxlbmd0aCAtIDEpIHsKLSAgICArK3N0cmVhazsKLSAgICBnb3RvIGxhc3Rfc3RyZWFrX2hhY2s7Ci0gIH0KLSAgcmV0dXJuIHJldHZhbDsKLX0KLQotc3RhdGljIGRvdWJsZSBQb3B1bGF0aW9uQ29zdChjb25zdCBpbnQqIGNvbnN0IHBvcHVsYXRpb24sIGludCBsZW5ndGgpIHsKLSAgcmV0dXJuIEJpdHNFbnRyb3B5KHBvcHVsYXRpb24sIGxlbmd0aCkgKyBIdWZmbWFuQ29zdChwb3B1bGF0aW9uLCBsZW5ndGgpOwotfQotCi1zdGF0aWMgZG91YmxlIEV4dHJhQ29zdChjb25zdCBpbnQqIGNvbnN0IHBvcHVsYXRpb24sIGludCBsZW5ndGgpIHsKLSAgaW50IGk7Ci0gIGRvdWJsZSBjb3N0ID0gMC47Ci0gIGZvciAoaSA9IDI7IGkgPCBsZW5ndGggLSAyOyArK2kpIGNvc3QgKz0gKGkgPj4gMSkgKiBwb3B1bGF0aW9uW2kgKyAyXTsKLSAgcmV0dXJuIGNvc3Q7Ci19Ci0KLS8vIEVzdGltYXRlcyB0aGUgRW50cm9weSArIEh1ZmZtYW4gKyBvdGhlciBibG9jayBvdmVyaGVhZCBzaXplIGNvc3QuCi1kb3VibGUgVlA4TEhpc3RvZ3JhbUVzdGltYXRlQml0cyhjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBwKSB7Ci0gIHJldHVybiBQb3B1bGF0aW9uQ29zdChwLT5saXRlcmFsXywgVlA4TEhpc3RvZ3JhbU51bUNvZGVzKHApKQotICAgICAgICsgUG9wdWxhdGlvbkNvc3QocC0+cmVkXywgMjU2KQotICAgICAgICsgUG9wdWxhdGlvbkNvc3QocC0+Ymx1ZV8sIDI1NikKLSAgICAgICArIFBvcHVsYXRpb25Db3N0KHAtPmFscGhhXywgMjU2KQotICAgICAgICsgUG9wdWxhdGlvbkNvc3QocC0+ZGlzdGFuY2VfLCBOVU1fRElTVEFOQ0VfQ09ERVMpCi0gICAgICAgKyBFeHRyYUNvc3QocC0+bGl0ZXJhbF8gKyAyNTYsIE5VTV9MRU5HVEhfQ09ERVMpCi0gICAgICAgKyBFeHRyYUNvc3QocC0+ZGlzdGFuY2VfLCBOVU1fRElTVEFOQ0VfQ09ERVMpOwotfQotCi1kb3VibGUgVlA4TEhpc3RvZ3JhbUVzdGltYXRlQml0c0J1bGsoY29uc3QgVlA4TEhpc3RvZ3JhbSogY29uc3QgcCkgewotICByZXR1cm4gQml0c0VudHJvcHkocC0+bGl0ZXJhbF8sIFZQOExIaXN0b2dyYW1OdW1Db2RlcyhwKSkKLSAgICAgICArIEJpdHNFbnRyb3B5KHAtPnJlZF8sIDI1NikKLSAgICAgICArIEJpdHNFbnRyb3B5KHAtPmJsdWVfLCAyNTYpCi0gICAgICAgKyBCaXRzRW50cm9weShwLT5hbHBoYV8sIDI1NikKLSAgICAgICArIEJpdHNFbnRyb3B5KHAtPmRpc3RhbmNlXywgTlVNX0RJU1RBTkNFX0NPREVTKQotICAgICAgICsgRXh0cmFDb3N0KHAtPmxpdGVyYWxfICsgMjU2LCBOVU1fTEVOR1RIX0NPREVTKQotICAgICAgICsgRXh0cmFDb3N0KHAtPmRpc3RhbmNlXywgTlVNX0RJU1RBTkNFX0NPREVTKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFZhcmlvdXMgaGlzdG9ncmFtIGNvbWJpbmUvY29zdC1ldmFsIGZ1bmN0aW9ucwotCi0vLyBBZGRzICdpbicgaGlzdG9ncmFtIHRvICdvdXQnCi1zdGF0aWMgdm9pZCBIaXN0b2dyYW1BZGQoY29uc3QgVlA4TEhpc3RvZ3JhbSogY29uc3QgaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEhpc3RvZ3JhbSogY29uc3Qgb3V0KSB7Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgUElYX09SX0NPUFlfQ09ERVNfTUFYOyArK2kpIHsKLSAgICBvdXQtPmxpdGVyYWxfW2ldICs9IGluLT5saXRlcmFsX1tpXTsKLSAgfQotICBmb3IgKGkgPSAwOyBpIDwgTlVNX0RJU1RBTkNFX0NPREVTOyArK2kpIHsKLSAgICBvdXQtPmRpc3RhbmNlX1tpXSArPSBpbi0+ZGlzdGFuY2VfW2ldOwotICB9Ci0gIGZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkgewotICAgIG91dC0+cmVkX1tpXSArPSBpbi0+cmVkX1tpXTsKLSAgICBvdXQtPmJsdWVfW2ldICs9IGluLT5ibHVlX1tpXTsKLSAgICBvdXQtPmFscGhhX1tpXSArPSBpbi0+YWxwaGFfW2ldOwotICB9Ci19Ci0KLS8vIFBlcmZvcm1zIG91dCA9IGEgKyBiLCBjb21wdXRpbmcgdGhlIGNvc3QgQyhhK2IpIC0gQyhhKSAtIEMoYikgd2hpbGUgY29tcGFyaW5nCi0vLyB0byB0aGUgdGhyZXNob2xkIHZhbHVlICdjb3N0X3RocmVzaG9sZCcuIFRoZSBzY29yZSByZXR1cm5lZCBpcwotLy8gIFNjb3JlID0gQyhhK2IpIC0gQyhhKSAtIEMoYiksIHdoZXJlIEMoYSkgKyBDKGIpIGlzIGtub3duIGFuZCBmaXhlZC4KLS8vIFNpbmNlIHRoZSBwcmV2aW91cyBzY29yZSBwYXNzZWQgaXMgJ2Nvc3RfdGhyZXNob2xkJywgd2Ugb25seSBuZWVkIHRvIGNvbXBhcmUKLS8vIHRoZSBwYXJ0aWFsIGNvc3QgYWdhaW5zdCAnY29zdF90aHJlc2hvbGQgKyBDKGEpICsgQyhiKScgdG8gcG9zc2libHkgYmFpbC1vdXQKLS8vIGVhcmx5Lgotc3RhdGljIGRvdWJsZSBIaXN0b2dyYW1BZGRFdmFsKGNvbnN0IFZQOExIaXN0b2dyYW0qIGNvbnN0IGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TEhpc3RvZ3JhbSogY29uc3QgYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMSGlzdG9ncmFtKiBjb25zdCBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGNvc3RfdGhyZXNob2xkKSB7Ci0gIGRvdWJsZSBjb3N0ID0gMDsKLSAgY29uc3QgZG91YmxlIHN1bV9jb3N0ID0gYS0+Yml0X2Nvc3RfICsgYi0+Yml0X2Nvc3RfOwotICBpbnQgaTsKLQotICBjb3N0X3RocmVzaG9sZCArPSBzdW1fY29zdDsKLQotICAvLyBwYWxldHRlX2NvZGVfYml0c18gaXMgcGFydCBvZiB0aGUgY29zdCBldmFsdWF0aW9uIGZvciBsaXRlcmFsXy4KLSAgLy8gVE9ETyhza2FsKTogcmVtb3ZlL3NpbXBsaWZ5IHRoaXMgcGFsZXR0ZV9jb2RlX2JpdHNfPwotICBvdXQtPnBhbGV0dGVfY29kZV9iaXRzXyA9Ci0gICAgICAoYS0+cGFsZXR0ZV9jb2RlX2JpdHNfID4gYi0+cGFsZXR0ZV9jb2RlX2JpdHNfKSA/IGEtPnBhbGV0dGVfY29kZV9iaXRzXyA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGItPnBhbGV0dGVfY29kZV9iaXRzXzsKLSAgZm9yIChpID0gMDsgaSA8IFBJWF9PUl9DT1BZX0NPREVTX01BWDsgKytpKSB7Ci0gICAgb3V0LT5saXRlcmFsX1tpXSA9IGEtPmxpdGVyYWxfW2ldICsgYi0+bGl0ZXJhbF9baV07Ci0gIH0KLSAgY29zdCArPSBQb3B1bGF0aW9uQ29zdChvdXQtPmxpdGVyYWxfLCBWUDhMSGlzdG9ncmFtTnVtQ29kZXMob3V0KSk7Ci0gIGNvc3QgKz0gRXh0cmFDb3N0KG91dC0+bGl0ZXJhbF8gKyAyNTYsIE5VTV9MRU5HVEhfQ09ERVMpOwotICBpZiAoY29zdCA+IGNvc3RfdGhyZXNob2xkKSByZXR1cm4gY29zdDsKLQotICBmb3IgKGkgPSAwOyBpIDwgMjU2OyArK2kpIG91dC0+cmVkX1tpXSA9IGEtPnJlZF9baV0gKyBiLT5yZWRfW2ldOwotICBjb3N0ICs9IFBvcHVsYXRpb25Db3N0KG91dC0+cmVkXywgMjU2KTsKLSAgaWYgKGNvc3QgPiBjb3N0X3RocmVzaG9sZCkgcmV0dXJuIGNvc3Q7Ci0KLSAgZm9yIChpID0gMDsgaSA8IDI1NjsgKytpKSBvdXQtPmJsdWVfW2ldID0gYS0+Ymx1ZV9baV0gKyBiLT5ibHVlX1tpXTsKLSAgY29zdCArPSBQb3B1bGF0aW9uQ29zdChvdXQtPmJsdWVfLCAyNTYpOwotICBpZiAoY29zdCA+IGNvc3RfdGhyZXNob2xkKSByZXR1cm4gY29zdDsKLQotICBmb3IgKGkgPSAwOyBpIDwgTlVNX0RJU1RBTkNFX0NPREVTOyArK2kpIHsKLSAgICBvdXQtPmRpc3RhbmNlX1tpXSA9IGEtPmRpc3RhbmNlX1tpXSArIGItPmRpc3RhbmNlX1tpXTsKLSAgfQotICBjb3N0ICs9IFBvcHVsYXRpb25Db3N0KG91dC0+ZGlzdGFuY2VfLCBOVU1fRElTVEFOQ0VfQ09ERVMpOwotICBjb3N0ICs9IEV4dHJhQ29zdChvdXQtPmRpc3RhbmNlXywgTlVNX0RJU1RBTkNFX0NPREVTKTsKLSAgaWYgKGNvc3QgPiBjb3N0X3RocmVzaG9sZCkgcmV0dXJuIGNvc3Q7Ci0KLSAgZm9yIChpID0gMDsgaSA8IDI1NjsgKytpKSBvdXQtPmFscGhhX1tpXSA9IGEtPmFscGhhX1tpXSArIGItPmFscGhhX1tpXTsKLSAgY29zdCArPSBQb3B1bGF0aW9uQ29zdChvdXQtPmFscGhhXywgMjU2KTsKLQotICBvdXQtPmJpdF9jb3N0XyA9IGNvc3Q7Ci0gIHJldHVybiBjb3N0IC0gc3VtX2Nvc3Q7Ci19Ci0KLS8vIFNhbWUgYXMgSGlzdG9ncmFtQWRkRXZhbCgpLCBleGNlcHQgdGhhdCB0aGUgcmVzdWx0aW5nIGhpc3RvZ3JhbQotLy8gaXMgbm90IHN0b3JlZC4gT25seSB0aGUgY29zdCBDKGErYikgLSBDKGEpIGlzIGV2YWx1YXRlZC4gV2Ugb21pdAotLy8gdGhlIHRlcm0gQyhiKSB3aGljaCBpcyBjb25zdGFudCBvdmVyIGFsbCB0aGUgZXZhbHVhdGlvbnMuCi1zdGF0aWMgZG91YmxlIEhpc3RvZ3JhbUFkZFRocmVzaChjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TEhpc3RvZ3JhbSogY29uc3QgYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBjb3N0X3RocmVzaG9sZCkgewotICBpbnQgdG1wW1BJWF9PUl9DT1BZX0NPREVTX01BWF07ICAvLyA8PSBtYXggc3RvcmFnZSB3ZSdsbCBuZWVkCi0gIGludCBpOwotICBkb3VibGUgY29zdCA9IC1hLT5iaXRfY29zdF87Ci0KLSAgZm9yIChpID0gMDsgaSA8IFBJWF9PUl9DT1BZX0NPREVTX01BWDsgKytpKSB7Ci0gICAgdG1wW2ldID0gYS0+bGl0ZXJhbF9baV0gKyBiLT5saXRlcmFsX1tpXTsKLSAgfQotICAvLyBub3RlIHRoYXQgdGhlIHRlc3RzIGFyZSBvcmRlcmVkIHNvIHRoYXQgdGhlIHVzdWFsbHkgbGFyZ2VzdAotICAvLyBjb3N0IHNoYXJlcyBjb21lIGZpcnN0LgotICBjb3N0ICs9IFBvcHVsYXRpb25Db3N0KHRtcCwgVlA4TEhpc3RvZ3JhbU51bUNvZGVzKGEpKTsKLSAgY29zdCArPSBFeHRyYUNvc3QodG1wICsgMjU2LCBOVU1fTEVOR1RIX0NPREVTKTsKLSAgaWYgKGNvc3QgPiBjb3N0X3RocmVzaG9sZCkgcmV0dXJuIGNvc3Q7Ci0KLSAgZm9yIChpID0gMDsgaSA8IDI1NjsgKytpKSB0bXBbaV0gPSBhLT5yZWRfW2ldICsgYi0+cmVkX1tpXTsKLSAgY29zdCArPSBQb3B1bGF0aW9uQ29zdCh0bXAsIDI1Nik7Ci0gIGlmIChjb3N0ID4gY29zdF90aHJlc2hvbGQpIHJldHVybiBjb3N0OwotCi0gIGZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkgdG1wW2ldID0gYS0+Ymx1ZV9baV0gKyBiLT5ibHVlX1tpXTsKLSAgY29zdCArPSBQb3B1bGF0aW9uQ29zdCh0bXAsIDI1Nik7Ci0gIGlmIChjb3N0ID4gY29zdF90aHJlc2hvbGQpIHJldHVybiBjb3N0OwotCi0gIGZvciAoaSA9IDA7IGkgPCBOVU1fRElTVEFOQ0VfQ09ERVM7ICsraSkgewotICAgIHRtcFtpXSA9IGEtPmRpc3RhbmNlX1tpXSArIGItPmRpc3RhbmNlX1tpXTsKLSAgfQotICBjb3N0ICs9IFBvcHVsYXRpb25Db3N0KHRtcCwgTlVNX0RJU1RBTkNFX0NPREVTKTsKLSAgY29zdCArPSBFeHRyYUNvc3QodG1wLCBOVU1fRElTVEFOQ0VfQ09ERVMpOwotICBpZiAoY29zdCA+IGNvc3RfdGhyZXNob2xkKSByZXR1cm4gY29zdDsKLQotICBmb3IgKGkgPSAwOyBpIDwgMjU2OyArK2kpIHRtcFtpXSA9IGEtPmFscGhhX1tpXSArIGItPmFscGhhX1tpXTsKLSAgY29zdCArPSBQb3B1bGF0aW9uQ29zdCh0bXAsIDI1Nik7Ci0KLSAgcmV0dXJuIGNvc3Q7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIEhpc3RvZ3JhbUJ1aWxkSW1hZ2UoaW50IHhzaXplLCBpbnQgaGlzdG9fYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgYmFja3dhcmRfcmVmcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEhpc3RvZ3JhbVNldCogY29uc3QgaW1hZ2UpIHsKLSAgaW50IGk7Ci0gIGludCB4ID0gMCwgeSA9IDA7Ci0gIGNvbnN0IGludCBoaXN0b194c2l6ZSA9IFZQOExTdWJTYW1wbGVTaXplKHhzaXplLCBoaXN0b19iaXRzKTsKLSAgVlA4TEhpc3RvZ3JhbSoqIGNvbnN0IGhpc3RvZ3JhbXMgPSBpbWFnZS0+aGlzdG9ncmFtczsKLSAgU0JfRENIRUNLKGhpc3RvX2JpdHMgPiAwKTsKLSAgZm9yIChpID0gMDsgaSA8IGJhY2t3YXJkX3JlZnMtPnNpemU7ICsraSkgewotICAgIGNvbnN0IFBpeE9yQ29weSogY29uc3QgdiA9ICZiYWNrd2FyZF9yZWZzLT5yZWZzW2ldOwotICAgIGNvbnN0IGludCBpeCA9ICh5ID4+IGhpc3RvX2JpdHMpICogaGlzdG9feHNpemUgKyAoeCA+PiBoaXN0b19iaXRzKTsKLSAgICBWUDhMSGlzdG9ncmFtQWRkU2luZ2xlUGl4T3JDb3B5KGhpc3RvZ3JhbXNbaXhdLCB2KTsKLSAgICB4ICs9IFBpeE9yQ29weUxlbmd0aCh2KTsKLSAgICB3aGlsZSAoeCA+PSB4c2l6ZSkgewotICAgICAgeCAtPSB4c2l6ZTsKLSAgICAgICsreTsKLSAgICB9Ci0gIH0KLX0KLQotc3RhdGljIHVpbnQzMl90IE15UmFuZCh1aW50MzJfdCAqc2VlZCkgewotICAqc2VlZCAqPSAxNjgwN1U7Ci0gIGlmICgqc2VlZCA9PSAwKSB7Ci0gICAgKnNlZWQgPSAxOwotICB9Ci0gIHJldHVybiAqc2VlZDsKLX0KLQotc3RhdGljIGludCBIaXN0b2dyYW1Db21iaW5lKGNvbnN0IFZQOExIaXN0b2dyYW1TZXQqIGNvbnN0IGluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExIaXN0b2dyYW1TZXQqIGNvbnN0IG91dCwgaW50IGl0ZXJfbXVsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BhaXJzLCBpbnQgbnVtX3RyaWVzX25vX3N1Y2Nlc3MpIHsKLSAgaW50IG9rID0gMDsKLSAgaW50IGksIGl0ZXI7Ci0gIHVpbnQzMl90IHNlZWQgPSAwOwotICBpbnQgdHJpZXNfd2l0aF9ub19zdWNjZXNzID0gMDsKLSAgaW50IG91dF9zaXplID0gaW4tPnNpemU7Ci0gIGNvbnN0IGludCBvdXRlcl9pdGVycyA9IGluLT5zaXplICogaXRlcl9tdWx0OwotICBjb25zdCBpbnQgbWluX2NsdXN0ZXJfc2l6ZSA9IDI7Ci0gIFZQOExIaXN0b2dyYW0qIGNvbnN0IGhpc3RvcyA9IChWUDhMSGlzdG9ncmFtKilTYk1lbW9yeUFsbG9jYXRlKDIgKiBzaXplb2YoKmhpc3RvcykpOwotICBWUDhMSGlzdG9ncmFtKiBjdXJfY29tYm8gPSBoaXN0b3MgKyAwOyAgICAvLyB0cmlhbCBtZXJnZWQgaGlzdG9ncmFtCi0gIFZQOExIaXN0b2dyYW0qIGJlc3RfY29tYm8gPSBoaXN0b3MgKyAxOyAgIC8vIGJlc3QgbWVyZ2VkIGhpc3RvZ3JhbSBzbyBmYXIKLSAgaWYgKGhpc3RvcyA9PSBOVUxMKSBnb3RvIEVuZDsKLQotICAvLyBDb3B5IGhpc3RvZ3JhbXMgZnJvbSBpbltdIHRvIG91dFtdLgotICBTQl9EQ0hFQ0soaW4tPnNpemUgPD0gb3V0LT5zaXplKTsKLSAgZm9yIChpID0gMDsgaSA8IGluLT5zaXplOyArK2kpIHsKLSAgICBpbi0+aGlzdG9ncmFtc1tpXS0+Yml0X2Nvc3RfID0gVlA4TEhpc3RvZ3JhbUVzdGltYXRlQml0cyhpbi0+aGlzdG9ncmFtc1tpXSk7Ci0gICAgKm91dC0+aGlzdG9ncmFtc1tpXSA9ICppbi0+aGlzdG9ncmFtc1tpXTsKLSAgfQotCi0gIC8vIENvbGxhcHNlIHNpbWlsYXIgaGlzdG9ncmFtcyBpbiAnb3V0Jy4KLSAgZm9yIChpdGVyID0gMDsgaXRlciA8IG91dGVyX2l0ZXJzICYmIG91dF9zaXplID49IG1pbl9jbHVzdGVyX3NpemU7ICsraXRlcikgewotICAgIGRvdWJsZSBiZXN0X2Nvc3RfZGlmZiA9IDAuOwotICAgIGludCBiZXN0X2lkeDEgPSAtMSwgYmVzdF9pZHgyID0gMTsKLSAgICBpbnQgajsKLSAgICBjb25zdCBpbnQgbnVtX3RyaWVzID0gKG51bV9wYWlycyA8IG91dF9zaXplKSA/IG51bV9wYWlycyA6IG91dF9zaXplOwotICAgIHNlZWQgKz0gaXRlcjsKLSAgICBmb3IgKGogPSAwOyBqIDwgbnVtX3RyaWVzOyArK2opIHsKLSAgICAgIGRvdWJsZSBjdXJyX2Nvc3RfZGlmZjsKLSAgICAgIC8vIENob29zZSB0d28gaGlzdG9ncmFtcyBhdCByYW5kb20gYW5kIHRyeSB0byBjb21iaW5lIHRoZW0uCi0gICAgICBjb25zdCB1aW50MzJfdCBpZHgxID0gTXlSYW5kKCZzZWVkKSAlIG91dF9zaXplOwotICAgICAgY29uc3QgdWludDMyX3QgdG1wID0gKGogJiA3KSArIDE7Ci0gICAgICBjb25zdCB1aW50MzJfdCBkaWZmID0gKHRtcCA8IDMpID8gdG1wIDogTXlSYW5kKCZzZWVkKSAlIChvdXRfc2l6ZSAtIDEpOwotICAgICAgY29uc3QgdWludDMyX3QgaWR4MiA9IChpZHgxICsgZGlmZiArIDEpICUgb3V0X3NpemU7Ci0gICAgICBpZiAoaWR4MSA9PSBpZHgyKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgLy8gQ2FsY3VsYXRlIGNvc3QgcmVkdWN0aW9uIG9uIGNvbWJpbmluZy4KLSAgICAgIGN1cnJfY29zdF9kaWZmID0gSGlzdG9ncmFtQWRkRXZhbChvdXQtPmhpc3RvZ3JhbXNbaWR4MV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LT5oaXN0b2dyYW1zW2lkeDJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9jb21ibywgYmVzdF9jb3N0X2RpZmYpOwotICAgICAgaWYgKGN1cnJfY29zdF9kaWZmIDwgYmVzdF9jb3N0X2RpZmYpIHsgICAgLy8gZm91bmQgYSBiZXR0ZXIgcGFpcj8KLSAgICAgICAgeyAgICAgLy8gc3dhcCBjdXIvYmVzdCBjb21ibyBoaXN0b2dyYW1zCi0gICAgICAgICAgVlA4TEhpc3RvZ3JhbSogY29uc3QgdG1wX2hpc3RvID0gY3VyX2NvbWJvOwotICAgICAgICAgIGN1cl9jb21ibyA9IGJlc3RfY29tYm87Ci0gICAgICAgICAgYmVzdF9jb21ibyA9IHRtcF9oaXN0bzsKLSAgICAgICAgfQotICAgICAgICBiZXN0X2Nvc3RfZGlmZiA9IGN1cnJfY29zdF9kaWZmOwotICAgICAgICBiZXN0X2lkeDEgPSBpZHgxOwotICAgICAgICBiZXN0X2lkeDIgPSBpZHgyOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChiZXN0X2lkeDEgPj0gMCkgewotICAgICAgKm91dC0+aGlzdG9ncmFtc1tiZXN0X2lkeDFdID0gKmJlc3RfY29tYm87Ci0gICAgICAvLyBzd2FwIGJlc3RfaWR4MiBzbG90IHdpdGggbGFzdCBvbmUgKHdoaWNoIGlzIG5vdyB1bnVzZWQpCi0gICAgICAtLW91dF9zaXplOwotICAgICAgaWYgKGJlc3RfaWR4MiAhPSBvdXRfc2l6ZSkgewotICAgICAgICBvdXQtPmhpc3RvZ3JhbXNbYmVzdF9pZHgyXSA9IG91dC0+aGlzdG9ncmFtc1tvdXRfc2l6ZV07Ci0gICAgICAgIG91dC0+aGlzdG9ncmFtc1tvdXRfc2l6ZV0gPSBOVUxMOyAgIC8vIGp1c3QgZm9yIHNhbml0eSBjaGVjay4KLSAgICAgIH0KLSAgICAgIHRyaWVzX3dpdGhfbm9fc3VjY2VzcyA9IDA7Ci0gICAgfQotICAgIGlmICgrK3RyaWVzX3dpdGhfbm9fc3VjY2VzcyA+PSBudW1fdHJpZXNfbm9fc3VjY2VzcykgewotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIG91dC0+c2l6ZSA9IG91dF9zaXplOwotICBvayA9IDE7Ci0KLSBFbmQ6Ci0gIFNiTWVtb3J5RGVhbGxvY2F0ZShoaXN0b3MpOwotICByZXR1cm4gb2s7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBIaXN0b2dyYW0gcmVmaW5lbWVudAotCi0vLyBXaGF0IGlzIHRoZSBiaXQgY29zdCBvZiBtb3Zpbmcgc3F1YXJlX2hpc3RvZ3JhbSBmcm9tIGN1cl9zeW1ib2wgdG8gY2FuZGlkYXRlLgotc3RhdGljIGRvdWJsZSBIaXN0b2dyYW1EaXN0YW5jZShjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBzcXVhcmVfaGlzdG9ncmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBjYW5kaWRhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBjb3N0X3RocmVzaG9sZCkgewotICByZXR1cm4gSGlzdG9ncmFtQWRkVGhyZXNoKGNhbmRpZGF0ZSwgc3F1YXJlX2hpc3RvZ3JhbSwgY29zdF90aHJlc2hvbGQpOwotfQotCi0vLyBGaW5kIHRoZSBiZXN0ICdvdXQnIGhpc3RvZ3JhbSBmb3IgZWFjaCBvZiB0aGUgJ2luJyBoaXN0b2dyYW1zLgotLy8gTm90ZTogd2UgYXNzdW1lIHRoYXQgb3V0W10tPmJpdF9jb3N0XyBpcyBhbHJlYWR5IHVwLXRvLWRhdGUuCi1zdGF0aWMgdm9pZCBIaXN0b2dyYW1SZW1hcChjb25zdCBWUDhMSGlzdG9ncmFtU2V0KiBjb25zdCBpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOExIaXN0b2dyYW1TZXQqIGNvbnN0IG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBjb25zdCBzeW1ib2xzKSB7Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgaW4tPnNpemU7ICsraSkgewotICAgIGludCBiZXN0X291dCA9IDA7Ci0gICAgZG91YmxlIGJlc3RfYml0cyA9Ci0gICAgICAgIEhpc3RvZ3JhbURpc3RhbmNlKGluLT5oaXN0b2dyYW1zW2ldLCBvdXQtPmhpc3RvZ3JhbXNbMF0sIDEuZTM4KTsKLSAgICBpbnQgazsKLSAgICBmb3IgKGsgPSAxOyBrIDwgb3V0LT5zaXplOyArK2spIHsKLSAgICAgIGNvbnN0IGRvdWJsZSBjdXJfYml0cyA9Ci0gICAgICAgICAgSGlzdG9ncmFtRGlzdGFuY2UoaW4tPmhpc3RvZ3JhbXNbaV0sIG91dC0+aGlzdG9ncmFtc1trXSwgYmVzdF9iaXRzKTsKLSAgICAgIGlmIChjdXJfYml0cyA8IGJlc3RfYml0cykgewotICAgICAgICBiZXN0X2JpdHMgPSBjdXJfYml0czsKLSAgICAgICAgYmVzdF9vdXQgPSBrOwotICAgICAgfQotICAgIH0KLSAgICBzeW1ib2xzW2ldID0gYmVzdF9vdXQ7Ci0gIH0KLQotICAvLyBSZWNvbXB1dGUgZWFjaCBvdXQgYmFzZWQgb24gcmF3IGFuZCBzeW1ib2xzLgotICBmb3IgKGkgPSAwOyBpIDwgb3V0LT5zaXplOyArK2kpIHsKLSAgICBIaXN0b2dyYW1DbGVhcihvdXQtPmhpc3RvZ3JhbXNbaV0pOwotICB9Ci0gIGZvciAoaSA9IDA7IGkgPCBpbi0+c2l6ZTsgKytpKSB7Ci0gICAgSGlzdG9ncmFtQWRkKGluLT5oaXN0b2dyYW1zW2ldLCBvdXQtPmhpc3RvZ3JhbXNbc3ltYm9sc1tpXV0pOwotICB9Ci19Ci0KLWludCBWUDhMR2V0SGlzdG9JbWFnZVN5bWJvbHMoaW50IHhzaXplLCBpbnQgeXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBxdWFsaXR5LCBpbnQgaGlzdG9fYml0cywgaW50IGNhY2hlX2JpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExIaXN0b2dyYW1TZXQqIGNvbnN0IGltYWdlX2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogY29uc3QgaGlzdG9ncmFtX3N5bWJvbHMpIHsKLSAgaW50IG9rID0gMDsKLSAgY29uc3QgaW50IGhpc3RvX3hzaXplID0gaGlzdG9fYml0cyA/IFZQOExTdWJTYW1wbGVTaXplKHhzaXplLCBoaXN0b19iaXRzKSA6IDE7Ci0gIGNvbnN0IGludCBoaXN0b195c2l6ZSA9IGhpc3RvX2JpdHMgPyBWUDhMU3ViU2FtcGxlU2l6ZSh5c2l6ZSwgaGlzdG9fYml0cykgOiAxOwotICBjb25zdCBpbnQgaGlzdG9faW1hZ2VfcmF3X3NpemUgPSBoaXN0b194c2l6ZSAqIGhpc3RvX3lzaXplOwotCi0gIC8vIEhldXJpc3RpYyBwYXJhbXMgZm9yIEhpc3RvZ3JhbUNvbWJpbmUoKS4KLSAgY29uc3QgaW50IG51bV90cmllc19ub19zdWNjZXNzID0gOCArIChxdWFsaXR5ID4+IDEpOwotICBjb25zdCBpbnQgaXRlcl9tdWx0ID0gKHF1YWxpdHkgPCAyNykgPyAxIDogMSArICgocXVhbGl0eSAtIDI3KSA+PiA0KTsKLSAgY29uc3QgaW50IG51bV9wYWlycyA9IChxdWFsaXR5IDwgMjUpID8gMTAgOiAoNSAqIHF1YWxpdHkpID4+IDM7Ci0KLSAgVlA4TEhpc3RvZ3JhbVNldCogY29uc3QgaW1hZ2Vfb3V0ID0KLSAgICAgIFZQOExBbGxvY2F0ZUhpc3RvZ3JhbVNldChoaXN0b19pbWFnZV9yYXdfc2l6ZSwgY2FjaGVfYml0cyk7Ci0gIGlmIChpbWFnZV9vdXQgPT0gTlVMTCkgcmV0dXJuIDA7Ci0KLSAgLy8gQnVpbGQgaGlzdG9ncmFtIGltYWdlLgotICBIaXN0b2dyYW1CdWlsZEltYWdlKHhzaXplLCBoaXN0b19iaXRzLCByZWZzLCBpbWFnZV9vdXQpOwotICAvLyBDb2xsYXBzZSBzaW1pbGFyIGhpc3RvZ3JhbXMuCi0gIGlmICghSGlzdG9ncmFtQ29tYmluZShpbWFnZV9vdXQsIGltYWdlX2luLCBpdGVyX211bHQsIG51bV9wYWlycywKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bV90cmllc19ub19zdWNjZXNzKSkgewotICAgIGdvdG8gRXJyb3I7Ci0gIH0KLSAgLy8gRmluZCB0aGUgb3B0aW1hbCBtYXAgZnJvbSBvcmlnaW5hbCBoaXN0b2dyYW1zIHRvIHRoZSBmaW5hbCBvbmVzLgotICBIaXN0b2dyYW1SZW1hcChpbWFnZV9vdXQsIGltYWdlX2luLCBoaXN0b2dyYW1fc3ltYm9scyk7Ci0gIG9rID0gMTsKLQotRXJyb3I6Ci0gIFNiTWVtb3J5RGVhbGxvY2F0ZShpbWFnZV9vdXQpOwotICByZXR1cm4gb2s7Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvaGlzdG9ncmFtLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvaGlzdG9ncmFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwODMxYTQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL2hpc3RvZ3JhbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBBdXRob3I6IEp5cmtpIEFsYWt1aWphbGEgKGp5cmtpQGdvb2dsZS5jb20pCi0vLwotLy8gTW9kZWxzIHRoZSBoaXN0b2dyYW1zIG9mIGxpdGVyYWwgYW5kIGRpc3RhbmNlIGNvZGVzLgotCi0jaWZuZGVmIFdFQlBfRU5DX0hJU1RPR1JBTV9IXwotI2RlZmluZSBXRUJQX0VOQ19ISVNUT0dSQU1fSF8KLQotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCi0jZWxzZQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgIi4vYmFja3dhcmRfcmVmZXJlbmNlcy5oIgotI2luY2x1ZGUgIi4uL3dlYnAvZm9ybWF0X2NvbnN0YW50cy5oIgotI2luY2x1ZGUgIi4uL3dlYnAvdHlwZXMuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8vIEEgc2ltcGxlIGNvbnRhaW5lciBmb3IgaGlzdG9ncmFtcyBvZiBkYXRhLgotdHlwZWRlZiBzdHJ1Y3QgewotICAvLyBsaXRlcmFsXyBjb250YWlucyBncmVlbiBsaXRlcmFsLCBwYWxldHRlLWNvZGUgYW5kCi0gIC8vIGNvcHktbGVuZ3RoLXByZWZpeCBoaXN0b2dyYW0KLSAgaW50IGxpdGVyYWxfW1BJWF9PUl9DT1BZX0NPREVTX01BWF07Ci0gIGludCByZWRfWzI1Nl07Ci0gIGludCBibHVlX1syNTZdOwotICBpbnQgYWxwaGFfWzI1Nl07Ci0gIC8vIEJhY2t3YXJkIHJlZmVyZW5jZSBwcmVmaXgtY29kZSBoaXN0b2dyYW0uCi0gIGludCBkaXN0YW5jZV9bTlVNX0RJU1RBTkNFX0NPREVTXTsKLSAgaW50IHBhbGV0dGVfY29kZV9iaXRzXzsKLSAgZG91YmxlIGJpdF9jb3N0XzsgICAvLyBjYWNoZWQgdmFsdWUgb2YgVlA4TEhpc3RvZ3JhbUVzdGltYXRlQml0cyh0aGlzKQotfSBWUDhMSGlzdG9ncmFtOwotCi0vLyBDb2xsZWN0aW9uIG9mIGhpc3RvZ3JhbXMgd2l0aCBmaXhlZCBjYXBhY2l0eSwgYWxsb2NhdGVkIGFzIG9uZQotLy8gYmlnIG1lbW9yeSBjaHVuay4gQ2FuIGJlIGRlc3Ryb3llZCBieSBzaW1wbHkgY2FsbGluZyAnU2JNZW1vcnlEZWFsbG9jYXRlKCknLgotdHlwZWRlZiBzdHJ1Y3QgewotICBpbnQgc2l6ZTsgICAgICAgICAvLyBudW1iZXIgb2Ygc2xvdHMgY3VycmVudGx5IGluIHVzZQotICBpbnQgbWF4X3NpemU7ICAgICAvLyBtYXhpbXVtIGNhcGFjaXR5Ci0gIFZQOExIaXN0b2dyYW0qKiBoaXN0b2dyYW1zOwotfSBWUDhMSGlzdG9ncmFtU2V0OwotCi0vLyBDcmVhdGUgdGhlIGhpc3RvZ3JhbS4KLS8vCi0vLyBUaGUgaW5wdXQgZGF0YSBpcyB0aGUgUGl4T3JDb3B5IGRhdGEsIHdoaWNoIG1vZGVscyB0aGUgbGl0ZXJhbHMsIHN0b3AKLS8vIGNvZGVzIGFuZCBiYWNrd2FyZCByZWZlcmVuY2VzIChib3RoIGRpc3RhbmNlcyBhbmQgbGVuZ3RocykuICBBbHNvOiBpZgotLy8gcGFsZXR0ZV9jb2RlX2JpdHMgaXMgPj0gMCwgaW5pdGlhbGl6ZSB0aGUgaGlzdG9ncmFtIHdpdGggdGhpcyB2YWx1ZS4KLXZvaWQgVlA4TEhpc3RvZ3JhbUNyZWF0ZShWUDhMSGlzdG9ncmFtKiBjb25zdCBwLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhbGV0dGVfY29kZV9iaXRzKTsKLQotLy8gU2V0IHRoZSBwYWxldHRlX2NvZGVfYml0cyBhbmQgcmVzZXQgdGhlIHN0YXRzLgotdm9pZCBWUDhMSGlzdG9ncmFtSW5pdChWUDhMSGlzdG9ncmFtKiBjb25zdCBwLCBpbnQgcGFsZXR0ZV9jb2RlX2JpdHMpOwotCi0vLyBDb2xsZWN0IGFsbCB0aGUgcmVmZXJlbmNlcyBpbnRvIGEgaGlzdG9ncmFtICh3aXRob3V0IHJlc2V0KQotdm9pZCBWUDhMSGlzdG9ncmFtU3RvcmVSZWZzKGNvbnN0IFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEhpc3RvZ3JhbSogY29uc3QgaGlzdG8pOwotCi0vLyBBbGxvY2F0ZSBhbiBhcnJheSBvZiBwb2ludGVyIHRvIGhpc3RvZ3JhbXMsIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQKLS8vIHVzaW5nICdjYWNoZV9iaXRzJy4gUmV0dXJuIE5VTEwgaW4gY2FzZSBvZiBtZW1vcnkgZXJyb3IuCi1WUDhMSGlzdG9ncmFtU2V0KiBWUDhMQWxsb2NhdGVIaXN0b2dyYW1TZXQoaW50IHNpemUsIGludCBjYWNoZV9iaXRzKTsKLQotLy8gQWNjdW11bGF0ZSBhIHRva2VuICd2JyBpbnRvIGEgaGlzdG9ncmFtLgotdm9pZCBWUDhMSGlzdG9ncmFtQWRkU2luZ2xlUGl4T3JDb3B5KFZQOExIaXN0b2dyYW0qIGNvbnN0IGhpc3RvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBpeE9yQ29weSogY29uc3Qgdik7Ci0KLS8vIEVzdGltYXRlIGhvdyBtYW55IGJpdHMgdGhlIGNvbWJpbmVkIGVudHJvcHkgb2YgbGl0ZXJhbHMgYW5kIGRpc3RhbmNlCi0vLyBhcHByb3hpbWF0ZWx5IG1hcHMgdG8uCi1kb3VibGUgVlA4TEhpc3RvZ3JhbUVzdGltYXRlQml0cyhjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBwKTsKLQotLy8gVGhpcyBmdW5jdGlvbiBlc3RpbWF0ZXMgdGhlIGNvc3QgaW4gYml0cyBleGNsdWRpbmcgdGhlIGJpdHMgbmVlZGVkIHRvCi0vLyByZXByZXNlbnQgdGhlIGVudHJvcHkgY29kZSBpdHNlbGYuCi1kb3VibGUgVlA4TEhpc3RvZ3JhbUVzdGltYXRlQml0c0J1bGsoY29uc3QgVlA4TEhpc3RvZ3JhbSogY29uc3QgcCk7Ci0KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4TEhpc3RvZ3JhbU51bUNvZGVzKGNvbnN0IFZQOExIaXN0b2dyYW0qIGNvbnN0IHApIHsKLSAgcmV0dXJuIDI1NiArIE5VTV9MRU5HVEhfQ09ERVMgKwotICAgICAgKChwLT5wYWxldHRlX2NvZGVfYml0c18gPiAwKSA/ICgxIDw8IHAtPnBhbGV0dGVfY29kZV9iaXRzXykgOiAwKTsKLX0KLQotLy8gQnVpbGRzIHRoZSBoaXN0b2dyYW0gaW1hZ2UuCi1pbnQgVlA4TEdldEhpc3RvSW1hZ2VTeW1ib2xzKGludCB4c2l6ZSwgaW50IHlzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcXVhbGl0eSwgaW50IGhpc3RvZ3JhbV9iaXRzLCBpbnQgY2FjaGVfYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEhpc3RvZ3JhbVNldCogY29uc3QgaW1hZ2VfaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBjb25zdCBoaXN0b2dyYW1fc3ltYm9scyk7Ci0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19Ci0jZW5kaWYKLQotI2VuZGlmICAvLyBXRUJQX0VOQ19ISVNUT0dSQU1fSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy9pdGVyYXRvci5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL2l0ZXJhdG9yLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZDFiYzAuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL2l0ZXJhdG9yLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MjggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIFZQOEl0ZXJhdG9yOiBibG9jayBpdGVyYXRvcgotLy8KLS8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgIi4vdnA4ZW5jaS5oIgotCi0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVlA4SXRlcmF0b3IKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIEluaXRMZWZ0KFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCkgewotICBjb25zdCBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKLSAgZW5jLT55X2xlZnRfWy0xXSA9IGVuYy0+dV9sZWZ0X1stMV0gPSBlbmMtPnZfbGVmdF9bLTFdID0KLSAgICAgIChpdC0+eV8gPiAwKSA/IDEyOSA6IDEyNzsKLSAgU2JNZW1vcnlTZXQoZW5jLT55X2xlZnRfLCAxMjksIDE2KTsKLSAgU2JNZW1vcnlTZXQoZW5jLT51X2xlZnRfLCAxMjksIDgpOwotICBTYk1lbW9yeVNldChlbmMtPnZfbGVmdF8sIDEyOSwgOCk7Ci0gIGl0LT5sZWZ0X256X1s4XSA9IDA7Ci19Ci0KLXN0YXRpYyB2b2lkIEluaXRUb3AoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KSB7Ci0gIGNvbnN0IFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOwotICBjb25zdCBzaXplX3QgdG9wX3NpemUgPSBlbmMtPm1iX3dfICogMTY7Ci0gIFNiTWVtb3J5U2V0KGVuYy0+eV90b3BfLCAxMjcsIDIgKiB0b3Bfc2l6ZSk7Ci0gIFNiTWVtb3J5U2V0KGVuYy0+bnpfLCAwLCBlbmMtPm1iX3dfICogc2l6ZW9mKCplbmMtPm56XykpOwotfQotCi12b2lkIFZQOEl0ZXJhdG9yUmVzZXQoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KSB7Ci0gIFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOwotICBpdC0+eF8gPSAwOwotICBpdC0+eV8gPSAwOwotICBpdC0+eV9vZmZzZXRfID0gMDsKLSAgaXQtPnV2X29mZnNldF8gPSAwOwotICBpdC0+bWJfID0gZW5jLT5tYl9pbmZvXzsKLSAgaXQtPnByZWRzXyA9IGVuYy0+cHJlZHNfOwotICBpdC0+bnpfID0gZW5jLT5uel87Ci0gIGl0LT5id18gPSAmZW5jLT5wYXJ0c19bMF07Ci0gIGl0LT5kb25lXyA9IGVuYy0+bWJfd18qIGVuYy0+bWJfaF87Ci0gIEluaXRUb3AoaXQpOwotICBJbml0TGVmdChpdCk7Ci0gIFNiTWVtb3J5U2V0KGl0LT5iaXRfY291bnRfLCAwLCBzaXplb2YoaXQtPmJpdF9jb3VudF8pKTsKLSAgaXQtPmRvX3RyZWxsaXNfID0gMDsKLX0KLQotdm9pZCBWUDhJdGVyYXRvckluaXQoVlA4RW5jb2RlciogY29uc3QgZW5jLCBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKLSAgaXQtPmVuY18gPSBlbmM7Ci0gIGl0LT55X3N0cmlkZV8gID0gZW5jLT5waWNfLT55X3N0cmlkZTsKLSAgaXQtPnV2X3N0cmlkZV8gPSBlbmMtPnBpY18tPnV2X3N0cmlkZTsKLSAgLy8gVE9ETyhsYXRlcik6IGZvciBtdWx0aXRocmVhZGluZywgdGhlc2Ugc2hvdWxkIGJlIG93bmVkIGJ5ICdpdCcuCi0gIGl0LT55dXZfaW5fICAgPSBlbmMtPnl1dl9pbl87Ci0gIGl0LT55dXZfb3V0XyAgPSBlbmMtPnl1dl9vdXRfOwotICBpdC0+eXV2X291dDJfID0gZW5jLT55dXZfb3V0Ml87Ci0gIGl0LT55dXZfcF8gICAgPSBlbmMtPnl1dl9wXzsKLSAgaXQtPmxmX3N0YXRzXyA9IGVuYy0+bGZfc3RhdHNfOwotICBpdC0+cGVyY2VudDBfID0gZW5jLT5wZXJjZW50XzsKLSAgVlA4SXRlcmF0b3JSZXNldChpdCk7Ci19Ci0KLWludCBWUDhJdGVyYXRvclByb2dyZXNzKGNvbnN0IFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgaW50IGRlbHRhKSB7Ci0gIFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOwotICBpZiAoZGVsdGEgJiYgZW5jLT5waWNfLT5wcm9ncmVzc19ob29rKSB7Ci0gICAgY29uc3QgaW50IHBlcmNlbnQgPSAoZW5jLT5tYl9oXyA8PSAxKQotICAgICAgICAgICAgICAgICAgICAgID8gaXQtPnBlcmNlbnQwXwotICAgICAgICAgICAgICAgICAgICAgIDogaXQtPnBlcmNlbnQwXyArIGRlbHRhICogaXQtPnlfIC8gKGVuYy0+bWJfaF8gLSAxKTsKLSAgICByZXR1cm4gV2ViUFJlcG9ydFByb2dyZXNzKGVuYy0+cGljXywgcGVyY2VudCwgJmVuYy0+cGVyY2VudF8pOwotICB9Ci0gIHJldHVybiAxOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gSW1wb3J0IHRoZSBzb3VyY2Ugc2FtcGxlcyBpbnRvIHRoZSBjYWNoZS4gVGFrZXMgY2FyZSBvZiByZXBsaWNhdGluZwotLy8gYm91bmRhcnkgcGl4ZWxzIGlmIG5lY2Vzc2FyeS4KLQotc3RhdGljIHZvaWQgSW1wb3J0QmxvY2soY29uc3QgdWludDhfdCogc3JjLCBpbnQgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IHcsIGludCBoLCBpbnQgc2l6ZSkgewotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IGg7ICsraSkgewotICAgIFNiTWVtb3J5Q29weShkc3QsIHNyYywgdyk7Ci0gICAgaWYgKHcgPCBzaXplKSB7Ci0gICAgICBTYk1lbW9yeVNldChkc3QgKyB3LCBkc3RbdyAtIDFdLCBzaXplIC0gdyk7Ci0gICAgfQotICAgIGRzdCArPSBCUFM7Ci0gICAgc3JjICs9IHNyY19zdHJpZGU7Ci0gIH0KLSAgZm9yIChpID0gaDsgaSA8IHNpemU7ICsraSkgewotICAgIFNiTWVtb3J5Q29weShkc3QsIGRzdCAtIEJQUywgc2l6ZSk7Ci0gICAgZHN0ICs9IEJQUzsKLSAgfQotfQotCi12b2lkIFZQOEl0ZXJhdG9ySW1wb3J0KGNvbnN0IFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCkgewotICBjb25zdCBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKLSAgY29uc3QgaW50IHggPSBpdC0+eF8sIHkgPSBpdC0+eV87Ci0gIGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMgPSBlbmMtPnBpY187Ci0gIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHlzcmMgPSBwaWMtPnkgKyAoeSAqIHBpYy0+eV9zdHJpZGUgKyB4KSAqIDE2OwotICBjb25zdCB1aW50OF90KiBjb25zdCB1c3JjID0gcGljLT51ICsgKHkgKiBwaWMtPnV2X3N0cmlkZSArIHgpICogODsKLSAgY29uc3QgdWludDhfdCogY29uc3QgdnNyYyA9IHBpYy0+diArICh5ICogcGljLT51dl9zdHJpZGUgKyB4KSAqIDg7Ci0gIHVpbnQ4X3QqIGNvbnN0IHlkc3QgPSBpdC0+eXV2X2luXyArIFlfT0ZGOwotICB1aW50OF90KiBjb25zdCB1ZHN0ID0gaXQtPnl1dl9pbl8gKyBVX09GRjsKLSAgdWludDhfdCogY29uc3QgdmRzdCA9IGl0LT55dXZfaW5fICsgVl9PRkY7Ci0gIGludCB3ID0gKHBpYy0+d2lkdGggLSB4ICogMTYpOwotICBpbnQgaCA9IChwaWMtPmhlaWdodCAtIHkgKiAxNik7Ci0KLSAgaWYgKHcgPiAxNikgdyA9IDE2OwotICBpZiAoaCA+IDE2KSBoID0gMTY7Ci0KLSAgLy8gTHVtYSBwbGFuZQotICBJbXBvcnRCbG9jayh5c3JjLCBwaWMtPnlfc3RyaWRlLCB5ZHN0LCB3LCBoLCAxNik7Ci0KLSAgeyAgIC8vIFUvViBwbGFuZXMKLSAgICBjb25zdCBpbnQgdXZfdyA9ICh3ICsgMSkgPj4gMTsKLSAgICBjb25zdCBpbnQgdXZfaCA9IChoICsgMSkgPj4gMTsKLSAgICBJbXBvcnRCbG9jayh1c3JjLCBwaWMtPnV2X3N0cmlkZSwgdWRzdCwgdXZfdywgdXZfaCwgOCk7Ci0gICAgSW1wb3J0QmxvY2sodnNyYywgcGljLT51dl9zdHJpZGUsIHZkc3QsIHV2X3csIHV2X2gsIDgpOwotICB9Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5IGJhY2sgdGhlIGNvbXByZXNzZWQgc2FtcGxlcyBpbnRvIHVzZXIgc3BhY2UgaWYgcmVxdWVzdGVkLgotCi1zdGF0aWMgdm9pZCBFeHBvcnRCbG9jayhjb25zdCB1aW50OF90KiBzcmMsIHVpbnQ4X3QqIGRzdCwgaW50IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpIHsKLSAgd2hpbGUgKGgtLSA+IDApIHsKLSAgICBTYk1lbW9yeUNvcHkoZHN0LCBzcmMsIHcpOwotICAgIGRzdCArPSBkc3Rfc3RyaWRlOwotICAgIHNyYyArPSBCUFM7Ci0gIH0KLX0KLQotdm9pZCBWUDhJdGVyYXRvckV4cG9ydChjb25zdCBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKLSAgY29uc3QgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187Ci0gIGlmIChlbmMtPmNvbmZpZ18tPnNob3dfY29tcHJlc3NlZCkgewotICAgIGNvbnN0IGludCB4ID0gaXQtPnhfLCB5ID0gaXQtPnlfOwotICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHlzcmMgPSBpdC0+eXV2X291dF8gKyBZX09GRjsKLSAgICBjb25zdCB1aW50OF90KiBjb25zdCB1c3JjID0gaXQtPnl1dl9vdXRfICsgVV9PRkY7Ci0gICAgY29uc3QgdWludDhfdCogY29uc3QgdnNyYyA9IGl0LT55dXZfb3V0XyArIFZfT0ZGOwotICAgIGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMgPSBlbmMtPnBpY187Ci0gICAgdWludDhfdCogY29uc3QgeWRzdCA9IHBpYy0+eSArICh5ICogcGljLT55X3N0cmlkZSArIHgpICogMTY7Ci0gICAgdWludDhfdCogY29uc3QgdWRzdCA9IHBpYy0+dSArICh5ICogcGljLT51dl9zdHJpZGUgKyB4KSAqIDg7Ci0gICAgdWludDhfdCogY29uc3QgdmRzdCA9IHBpYy0+diArICh5ICogcGljLT51dl9zdHJpZGUgKyB4KSAqIDg7Ci0gICAgaW50IHcgPSAocGljLT53aWR0aCAtIHggKiAxNik7Ci0gICAgaW50IGggPSAocGljLT5oZWlnaHQgLSB5ICogMTYpOwotCi0gICAgaWYgKHcgPiAxNikgdyA9IDE2OwotICAgIGlmIChoID4gMTYpIGggPSAxNjsKLQotICAgIC8vIEx1bWEgcGxhbmUKLSAgICBFeHBvcnRCbG9jayh5c3JjLCB5ZHN0LCBwaWMtPnlfc3RyaWRlLCB3LCBoKTsKLQotICAgIHsgICAvLyBVL1YgcGxhbmVzCi0gICAgICBjb25zdCBpbnQgdXZfdyA9ICh3ICsgMSkgPj4gMTsKLSAgICAgIGNvbnN0IGludCB1dl9oID0gKGggKyAxKSA+PiAxOwotICAgICAgRXhwb3J0QmxvY2sodXNyYywgdWRzdCwgcGljLT51dl9zdHJpZGUsIHV2X3csIHV2X2gpOwotICAgICAgRXhwb3J0QmxvY2sodnNyYywgdmRzdCwgcGljLT51dl9zdHJpZGUsIHV2X3csIHV2X2gpOwotICAgIH0KLSAgfQotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTm9uLXplcm8gY29udGV4dHMgc2V0dXAvdGVhcmRvd24KLQotLy8gTnogYml0czoKLS8vICAwICAxICAyICAzICBZCi0vLyAgNCAgNSAgNiAgNwotLy8gIDggIDkgMTAgMTEKLS8vIDEyIDEzIDE0IDE1Ci0vLyAxNiAxNyAgICAgICAgVQotLy8gMTggMTkKLS8vIDIwIDIxICAgICAgICBWCi0vLyAyMiAyMwotLy8gMjQgICAgICAgICAgIERDLWludHJhMTYKLQotLy8gQ29udmVydCBwYWNrZWQgY29udGV4dCB0byBieXRlIGFycmF5Ci0jZGVmaW5lIEJJVChueiwgbikgKCEhKChueikgJiAoMSA8PCAobikpKSkKLQotdm9pZCBWUDhJdGVyYXRvck56VG9CeXRlcyhWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKLSAgY29uc3QgaW50IHRueiA9IGl0LT5uel9bMF0sIGxueiA9IGl0LT5uel9bLTFdOwotICBpbnQqIGNvbnN0IHRvcF9ueiA9IGl0LT50b3BfbnpfOwotICBpbnQqIGNvbnN0IGxlZnRfbnogPSBpdC0+bGVmdF9uel87Ci0KLSAgLy8gVG9wLVkKLSAgdG9wX256WzBdID0gQklUKHRueiwgMTIpOwotICB0b3BfbnpbMV0gPSBCSVQodG56LCAxMyk7Ci0gIHRvcF9uelsyXSA9IEJJVCh0bnosIDE0KTsKLSAgdG9wX256WzNdID0gQklUKHRueiwgMTUpOwotICAvLyBUb3AtVQotICB0b3BfbnpbNF0gPSBCSVQodG56LCAxOCk7Ci0gIHRvcF9uels1XSA9IEJJVCh0bnosIDE5KTsKLSAgLy8gVG9wLVYKLSAgdG9wX256WzZdID0gQklUKHRueiwgMjIpOwotICB0b3BfbnpbN10gPSBCSVQodG56LCAyMyk7Ci0gIC8vIERDCi0gIHRvcF9uels4XSA9IEJJVCh0bnosIDI0KTsKLQotICAvLyBsZWZ0LVkKLSAgbGVmdF9uelswXSA9IEJJVChsbnosICAzKTsKLSAgbGVmdF9uelsxXSA9IEJJVChsbnosICA3KTsKLSAgbGVmdF9uelsyXSA9IEJJVChsbnosIDExKTsKLSAgbGVmdF9uelszXSA9IEJJVChsbnosIDE1KTsKLSAgLy8gbGVmdC1VCi0gIGxlZnRfbnpbNF0gPSBCSVQobG56LCAxNyk7Ci0gIGxlZnRfbnpbNV0gPSBCSVQobG56LCAxOSk7Ci0gIC8vIGxlZnQtVgotICBsZWZ0X256WzZdID0gQklUKGxueiwgMjEpOwotICBsZWZ0X256WzddID0gQklUKGxueiwgMjMpOwotICAvLyBsZWZ0LURDIGlzIHNwZWNpYWwsIGl0ZXJhdGVkIHNlcGFyYXRlbHkKLX0KLQotdm9pZCBWUDhJdGVyYXRvckJ5dGVzVG9OeihWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKLSAgdWludDMyX3QgbnogPSAwOwotICBjb25zdCBpbnQqIGNvbnN0IHRvcF9ueiA9IGl0LT50b3BfbnpfOwotICBjb25zdCBpbnQqIGNvbnN0IGxlZnRfbnogPSBpdC0+bGVmdF9uel87Ci0gIC8vIHRvcAotICBueiB8PSAodG9wX256WzBdIDw8IDEyKSB8ICh0b3BfbnpbMV0gPDwgMTMpOwotICBueiB8PSAodG9wX256WzJdIDw8IDE0KSB8ICh0b3BfbnpbM10gPDwgMTUpOwotICBueiB8PSAodG9wX256WzRdIDw8IDE4KSB8ICh0b3BfbnpbNV0gPDwgMTkpOwotICBueiB8PSAodG9wX256WzZdIDw8IDIyKSB8ICh0b3BfbnpbN10gPDwgMjMpOwotICBueiB8PSAodG9wX256WzhdIDw8IDI0KTsgIC8vIHdlIHByb3BhZ2F0ZSB0aGUgX3RvcF8gYml0LCBlc3AuIGZvciBpbnRyYTQKLSAgLy8gbGVmdAotICBueiB8PSAobGVmdF9uelswXSA8PCAzKSB8IChsZWZ0X256WzFdIDw8IDcpOwotICBueiB8PSAobGVmdF9uelsyXSA8PCAxMSk7Ci0gIG56IHw9IChsZWZ0X256WzRdIDw8IDE3KSB8IChsZWZ0X256WzZdIDw8IDIxKTsKLQotICAqaXQtPm56XyA9IG56OwotfQotCi0jdW5kZWYgQklUCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBBZHZhbmNlIHRvIHRoZSBuZXh0IHBvc2l0aW9uLCBkb2luZyB0aGUgYm9va2VlcGluZy4KLQotaW50IFZQOEl0ZXJhdG9yTmV4dChWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGJsb2NrX3RvX3NhdmUpIHsKLSAgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187Ci0gIGlmIChibG9ja190b19zYXZlKSB7Ci0gICAgY29uc3QgaW50IHggPSBpdC0+eF8sIHkgPSBpdC0+eV87Ci0gICAgY29uc3QgdWludDhfdCogY29uc3QgeXNyYyA9IGJsb2NrX3RvX3NhdmUgKyBZX09GRjsKLSAgICBjb25zdCB1aW50OF90KiBjb25zdCB1c3JjID0gYmxvY2tfdG9fc2F2ZSArIFVfT0ZGOwotICAgIGlmICh4IDwgZW5jLT5tYl93XyAtIDEpIHsgICAvLyBsZWZ0Ci0gICAgICBpbnQgaTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSB7Ci0gICAgICAgIGVuYy0+eV9sZWZ0X1tpXSA9IHlzcmNbMTUgKyBpICogQlBTXTsKLSAgICAgIH0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyArK2kpIHsKLSAgICAgICAgZW5jLT51X2xlZnRfW2ldID0gdXNyY1s3ICsgaSAqIEJQU107Ci0gICAgICAgIGVuYy0+dl9sZWZ0X1tpXSA9IHVzcmNbMTUgKyBpICogQlBTXTsKLSAgICAgIH0KLSAgICAgIC8vIHRvcC1sZWZ0IChiZWZvcmUgJ3RvcCchKQotICAgICAgZW5jLT55X2xlZnRfWy0xXSA9IGVuYy0+eV90b3BfW3ggKiAxNiArIDE1XTsKLSAgICAgIGVuYy0+dV9sZWZ0X1stMV0gPSBlbmMtPnV2X3RvcF9beCAqIDE2ICsgMCArIDddOwotICAgICAgZW5jLT52X2xlZnRfWy0xXSA9IGVuYy0+dXZfdG9wX1t4ICogMTYgKyA4ICsgN107Ci0gICAgfQotICAgIGlmICh5IDwgZW5jLT5tYl9oXyAtIDEpIHsgIC8vIHRvcAotICAgICAgU2JNZW1vcnlDb3B5KGVuYy0+eV90b3BfICsgeCAqIDE2LCB5c3JjICsgMTUgKiBCUFMsIDE2KTsKLSAgICAgIFNiTWVtb3J5Q29weShlbmMtPnV2X3RvcF8gKyB4ICogMTYsIHVzcmMgKyA3ICogQlBTLCA4ICsgOCk7Ci0gICAgfQotICB9Ci0KLSAgaXQtPm1iXysrOwotICBpdC0+cHJlZHNfICs9IDQ7Ci0gIGl0LT5uel8rKzsKLSAgaXQtPnhfKys7Ci0gIGlmIChpdC0+eF8gPT0gZW5jLT5tYl93XykgewotICAgIGl0LT54XyA9IDA7Ci0gICAgaXQtPnlfKys7Ci0gICAgaXQtPmJ3XyA9ICZlbmMtPnBhcnRzX1tpdC0+eV8gJiAoZW5jLT5udW1fcGFydHNfIC0gMSldOwotICAgIGl0LT5wcmVkc18gPSBlbmMtPnByZWRzXyArIGl0LT55XyAqIDQgKiBlbmMtPnByZWRzX3dfOwotICAgIGl0LT5uel8gPSBlbmMtPm56XzsKLSAgICBJbml0TGVmdChpdCk7Ci0gIH0KLSAgcmV0dXJuICgwIDwgLS1pdC0+ZG9uZV8pOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gSGVscGVyIGZ1bmN0aW9uIHRvIHNldCBtb2RlIHByb3BlcnRpZXMKLQotdm9pZCBWUDhTZXRJbnRyYTE2TW9kZShjb25zdCBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsIGludCBtb2RlKSB7Ci0gIHVpbnQ4X3QqIHByZWRzID0gaXQtPnByZWRzXzsKLSAgaW50IHk7Ci0gIGZvciAoeSA9IDA7IHkgPCA0OyArK3kpIHsKLSAgICBTYk1lbW9yeVNldChwcmVkcywgbW9kZSwgNCk7Ci0gICAgcHJlZHMgKz0gaXQtPmVuY18tPnByZWRzX3dfOwotICB9Ci0gIGl0LT5tYl8tPnR5cGVfID0gMTsKLX0KLQotdm9pZCBWUDhTZXRJbnRyYTRNb2RlKGNvbnN0IFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgY29uc3QgdWludDhfdCogbW9kZXMpIHsKLSAgdWludDhfdCogcHJlZHMgPSBpdC0+cHJlZHNfOwotICBpbnQgeTsKLSAgZm9yICh5ID0gNDsgeSA+IDA7IC0teSkgewotICAgIFNiTWVtb3J5Q29weShwcmVkcywgbW9kZXMsIDQgKiBzaXplb2YoKm1vZGVzKSk7Ci0gICAgcHJlZHMgKz0gaXQtPmVuY18tPnByZWRzX3dfOwotICAgIG1vZGVzICs9IDQ7Ci0gIH0KLSAgaXQtPm1iXy0+dHlwZV8gPSAwOwotfQotCi12b2lkIFZQOFNldEludHJhVVZNb2RlKGNvbnN0IFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgaW50IG1vZGUpIHsKLSAgaXQtPm1iXy0+dXZfbW9kZV8gPSBtb2RlOwotfQotCi12b2lkIFZQOFNldFNraXAoY29uc3QgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBpbnQgc2tpcCkgewotICBpdC0+bWJfLT5za2lwXyA9IHNraXA7Ci19Ci0KLXZvaWQgVlA4U2V0U2VnbWVudChjb25zdCBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsIGludCBzZWdtZW50KSB7Ci0gIGl0LT5tYl8tPnNlZ21lbnRfID0gc2VnbWVudDsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEludHJhNHg0IHN1Yi1ibG9ja3MgaXRlcmF0aW9uCi0vLwotLy8gIFdlIHN0b3JlIGFuZCB1cGRhdGUgdGhlIGJvdW5kYXJ5IHNhbXBsZXMgaW50byBhbiBhcnJheSBvZiAzNyBwaXhlbHMuIFRoZXkKLS8vICBhcmUgdXBkYXRlZCBhcyB3ZSBpdGVyYXRlIGFuZCByZWNvbnN0cnVjdHMgZWFjaCBpbnRyYTR4NCBibG9ja3MgaW4gdHVybi4KLS8vICBUaGUgcG9zaXRpb24gb2YgdGhlIHNhbXBsZXMgaGFzIHRoZSBmb2xsb3dpbmcgc25ha2UgcGF0dGVybjoKLS8vCi0vLyAxNnwxNyAxOCAxOSAyMHwyMSAyMiAyMyAyNHwyNSAyNiAyNyAyOHwyOSAzMCAzMSAzMnwzMyAzNCAzNSAzNiAgPC0gVG9wLXJpZ2h0Ci0vLyAtLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsKLS8vIDE1fCAgICAgICAgIDE5fCAgICAgICAgIDIzfCAgICAgICAgIDI3fCAgICAgICAgIDMxfAotLy8gMTR8ICAgICAgICAgMTh8ICAgICAgICAgMjJ8ICAgICAgICAgMjZ8ICAgICAgICAgMzB8Ci0vLyAxM3wgICAgICAgICAxN3wgICAgICAgICAyMXwgICAgICAgICAyNXwgICAgICAgICAyOXwKLS8vIDEyfDEzIDE0IDE1IDE2fDE3IDE4IDE5IDIwfDIxIDIyIDIzIDI0fDI1IDI2IDI3IDI4fAotLy8gLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rCi0vLyAxMXwgICAgICAgICAxNXwgICAgICAgICAxOXwgICAgICAgICAyM3wgICAgICAgICAyN3wKLS8vIDEwfCAgICAgICAgIDE0fCAgICAgICAgIDE4fCAgICAgICAgIDIyfCAgICAgICAgIDI2fAotLy8gIDl8ICAgICAgICAgMTN8ICAgICAgICAgMTd8ICAgICAgICAgMjF8ICAgICAgICAgMjV8Ci0vLyAgOHwgOSAxMCAxMSAxMnwxMyAxNCAxNSAxNnwxNyAxOCAxOSAyMHwyMSAyMiAyMyAyNHwKLS8vIC0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKwotLy8gIDd8ICAgICAgICAgMTF8ICAgICAgICAgMTV8ICAgICAgICAgMTl8ICAgICAgICAgMjN8Ci0vLyAgNnwgICAgICAgICAxMHwgICAgICAgICAxNHwgICAgICAgICAxOHwgICAgICAgICAyMnwKLS8vICA1fCAgICAgICAgICA5fCAgICAgICAgIDEzfCAgICAgICAgIDE3fCAgICAgICAgIDIxfAotLy8gIDR8IDUgIDYgIDcgIDh8IDkgMTAgMTEgMTJ8MTMgMTQgMTUgMTZ8MTcgMTggMTkgMjB8Ci0vLyAtLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsKLS8vICAzfCAgICAgICAgICA3fCAgICAgICAgIDExfCAgICAgICAgIDE1fCAgICAgICAgIDE5fAotLy8gIDJ8ICAgICAgICAgIDZ8ICAgICAgICAgMTB8ICAgICAgICAgMTR8ICAgICAgICAgMTh8Ci0vLyAgMXwgICAgICAgICAgNXwgICAgICAgICAgOXwgICAgICAgICAxM3wgICAgICAgICAxN3wKLS8vICAwfCAxICAyICAzICA0fCA1ICA2ICA3ICA4fCA5IDEwIDExIDEyfDEzIDE0IDE1IDE2fAotLy8gLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rCi0KLS8vIEFycmF5IHRvIHJlY29yZCB0aGUgcG9zaXRpb24gb2YgdGhlIHRvcCBzYW1wbGUgdG8gcGFzcyB0byB0aGUgcHJlZGljdGlvbgotLy8gZnVuY3Rpb25zIGluIGRzcC5jLgotc3RhdGljIGNvbnN0IHVpbnQ4X3QgVlA4VG9wTGVmdEk0WzE2XSA9IHsKLSAgMTcsIDIxLCAyNSwgMjksCi0gIDEzLCAxNywgMjEsIDI1LAotICA5LCAgMTMsIDE3LCAyMSwKLSAgNSwgICA5LCAxMywgMTcKLX07Ci0KLXZvaWQgVlA4SXRlcmF0b3JTdGFydEk0KFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCkgewotICBjb25zdCBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKLSAgaW50IGk7Ci0KLSAgaXQtPmk0XyA9IDA7ICAgIC8vIGZpcnN0IDR4NCBzdWItYmxvY2sKLSAgaXQtPmk0X3RvcF8gPSBpdC0+aTRfYm91bmRhcnlfICsgVlA4VG9wTGVmdEk0WzBdOwotCi0gIC8vIEltcG9ydCB0aGUgYm91bmRhcnkgc2FtcGxlcwotICBmb3IgKGkgPSAwOyBpIDwgMTc7ICsraSkgeyAgICAvLyBsZWZ0Ci0gICAgaXQtPmk0X2JvdW5kYXJ5X1tpXSA9IGVuYy0+eV9sZWZ0X1sxNSAtIGldOwotICB9Ci0gIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSB7ICAgIC8vIHRvcAotICAgIGl0LT5pNF9ib3VuZGFyeV9bMTcgKyBpXSA9IGVuYy0+eV90b3BfW2l0LT54XyAqIDE2ICsgaV07Ci0gIH0KLSAgLy8gdG9wLXJpZ2h0IHNhbXBsZXMgaGF2ZSBhIHNwZWNpYWwgY2FzZSBvbiB0aGUgZmFyIHJpZ2h0IG9mIHRoZSBwaWN0dXJlCi0gIGlmIChpdC0+eF8gPCBlbmMtPm1iX3dfIC0gMSkgewotICAgIGZvciAoaSA9IDE2OyBpIDwgMTYgKyA0OyArK2kpIHsKLSAgICAgIGl0LT5pNF9ib3VuZGFyeV9bMTcgKyBpXSA9IGVuYy0+eV90b3BfW2l0LT54XyAqIDE2ICsgaV07Ci0gICAgfQotICB9IGVsc2UgeyAgICAvLyBlbHNlLCByZXBsaWNhdGUgdGhlIGxhc3QgdmFsaWQgcGl4ZWwgZm91ciB0aW1lcwotICAgIGZvciAoaSA9IDE2OyBpIDwgMTYgKyA0OyArK2kpIHsKLSAgICAgIGl0LT5pNF9ib3VuZGFyeV9bMTcgKyBpXSA9IGl0LT5pNF9ib3VuZGFyeV9bMTcgKyAxNV07Ci0gICAgfQotICB9Ci0gIFZQOEl0ZXJhdG9yTnpUb0J5dGVzKGl0KTsgIC8vIGltcG9ydCB0aGUgbm9uLXplcm8gY29udGV4dAotfQotCi1pbnQgVlA4SXRlcmF0b3JSb3RhdGVJNChWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCB5dXZfb3V0KSB7Ci0gIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGJsayA9IHl1dl9vdXQgKyBWUDhTY2FuW2l0LT5pNF9dOwotICB1aW50OF90KiBjb25zdCB0b3AgPSBpdC0+aTRfdG9wXzsKLSAgaW50IGk7Ci0KLSAgLy8gVXBkYXRlIHRoZSBjYWNoZSB3aXRoIDcgZnJlc2ggc2FtcGxlcwotICBmb3IgKGkgPSAwOyBpIDw9IDM7ICsraSkgewotICAgIHRvcFstNCArIGldID0gYmxrW2kgKyAzICogQlBTXTsgICAvLyBzdG9yZSBmdXR1cmUgdG9wIHNhbXBsZXMKLSAgfQotICBpZiAoKGl0LT5pNF8gJiAzKSAhPSAzKSB7ICAvLyBpZiBub3Qgb24gdGhlIHJpZ2h0IHN1Yi1ibG9ja3MgIzMsICM3LCAjMTEsICMxNQotICAgIGZvciAoaSA9IDA7IGkgPD0gMjsgKytpKSB7ICAgICAgICAvLyBzdG9yZSBmdXR1cmUgbGVmdCBzYW1wbGVzCi0gICAgICB0b3BbaV0gPSBibGtbMyArICgyIC0gaSkgKiBCUFNdOwotICAgIH0KLSAgfSBlbHNlIHsgIC8vIGVsc2UgcmVwbGljYXRlIHRvcC1yaWdodCBzYW1wbGVzLCBhcyBzYXlzIHRoZSBzcGVjcy4KLSAgICBmb3IgKGkgPSAwOyBpIDw9IDM7ICsraSkgewotICAgICAgdG9wW2ldID0gdG9wW2kgKyA0XTsKLSAgICB9Ci0gIH0KLSAgLy8gbW92ZSBwb2ludGVycyB0byBuZXh0IHN1Yi1ibG9jawotICArK2l0LT5pNF87Ci0gIGlmIChpdC0+aTRfID09IDE2KSB7ICAgIC8vIHdlJ3JlIGRvbmUKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGl0LT5pNF90b3BfID0gaXQtPmk0X2JvdW5kYXJ5XyArIFZQOFRvcExlZnRJNFtpdC0+aTRfXTsKLSAgcmV0dXJuIDE7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL2xheWVyLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvbGF5ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYxOTRjOC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvbGF5ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBFbmhhbmNlbWVudCBsYXllciAoZm9yIFlVVjQ0NC80MjIpCi0vLwotLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKLQotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNlbHNlCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgIi4vdnA4ZW5jaS5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBWUDhFbmNJbml0TGF5ZXIoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7Ci0gIGVuYy0+dXNlX2xheWVyXyA9IChlbmMtPnBpY18tPnUwICE9IE5VTEwpOwotICBlbmMtPmxheWVyX2RhdGFfc2l6ZV8gPSAwOwotICBlbmMtPmxheWVyX2RhdGFfID0gTlVMTDsKLSAgaWYgKGVuYy0+dXNlX2xheWVyXykgewotICAgIFZQOEJpdFdyaXRlckluaXQoJmVuYy0+bGF5ZXJfYndfLCBlbmMtPm1iX3dfICogZW5jLT5tYl9oXyAqIDMpOwotICB9Ci19Ci0KLXZvaWQgVlA4RW5jQ29kZUxheWVyQmxvY2soVlA4RW5jSXRlcmF0b3IqIGl0KSB7Ci0gICh2b2lkKWl0OyAgIC8vIHJlbW92ZSBhIHdhcm5pbmcKLX0KLQotaW50IFZQOEVuY0ZpbmlzaExheWVyKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgewotICBpZiAoZW5jLT51c2VfbGF5ZXJfKSB7Ci0gICAgZW5jLT5sYXllcl9kYXRhXyA9IFZQOEJpdFdyaXRlckZpbmlzaCgmZW5jLT5sYXllcl9id18pOwotICAgIGVuYy0+bGF5ZXJfZGF0YV9zaXplXyA9IFZQOEJpdFdyaXRlclNpemUoJmVuYy0+bGF5ZXJfYndfKTsKLSAgfQotICByZXR1cm4gMTsKLX0KLQotdm9pZCBWUDhFbmNEZWxldGVMYXllcihWUDhFbmNvZGVyKiBlbmMpIHsKLSAgU2JNZW1vcnlEZWFsbG9jYXRlKGVuYy0+bGF5ZXJfZGF0YV8pOwotfQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy9waWN0dXJlLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvcGljdHVyZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTRiZjdjLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy9waWN0dXJlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBXZWJQUGljdHVyZSB1dGlsczogY29sb3JzcGFjZSBjb252ZXJzaW9uLCBjcm9wLCAuLi4KLS8vCi0vLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQotCi0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNlbHNlCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8bWF0aC5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICIuL3ZwOGVuY2kuaCIKLSNpbmNsdWRlICIuLi91dGlscy9yZXNjYWxlci5oIgotI2luY2x1ZGUgIi4uL3V0aWxzL3V0aWxzLmgiCi0jaW5jbHVkZSAiLi4vZHNwL2RzcC5oIgotI2luY2x1ZGUgIi4uL2RzcC95dXYuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNkZWZpbmUgSEFMVkUoeCkgKCgoeCkgKyAxKSA+PiAxKQotI2RlZmluZSBJU19ZVVZfQ1NQKGNzcCwgWVVWX0NTUCkgKCgoY3NwKSAmIFdFQlBfQ1NQX1VWX01BU0spID09IChZVVZfQ1NQKSkKLQotc3RhdGljIGNvbnN0IHVuaW9uIHsKLSAgdWludDMyX3QgYXJnYjsKLSAgdWludDhfdCAgYnl0ZXNbNF07Ci19IHRlc3RfZW5kaWFuID0geyAweGZmMDAwMDAwdSB9OwotI2RlZmluZSBBTFBIQV9JU19MQVNUICh0ZXN0X2VuZGlhbi5ieXRlc1szXSA9PSAweGZmKQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gV2ViUFBpY3R1cmUKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWludCBXZWJQUGljdHVyZUFsbG9jKFdlYlBQaWN0dXJlKiBwaWN0dXJlKSB7Ci0gIGlmIChwaWN0dXJlICE9IE5VTEwpIHsKLSAgICBjb25zdCBXZWJQRW5jQ1NQIHV2X2NzcCA9IHBpY3R1cmUtPmNvbG9yc3BhY2UgJiBXRUJQX0NTUF9VVl9NQVNLOwotICAgIGNvbnN0IGludCBoYXNfYWxwaGEgPSBwaWN0dXJlLT5jb2xvcnNwYWNlICYgV0VCUF9DU1BfQUxQSEFfQklUOwotICAgIGNvbnN0IGludCB3aWR0aCA9IHBpY3R1cmUtPndpZHRoOwotICAgIGNvbnN0IGludCBoZWlnaHQgPSBwaWN0dXJlLT5oZWlnaHQ7Ci0KLSAgICBpZiAoIXBpY3R1cmUtPnVzZV9hcmdiKSB7Ci0gICAgICBjb25zdCBpbnQgeV9zdHJpZGUgPSB3aWR0aDsKLSAgICAgIGNvbnN0IGludCB1dl93aWR0aCA9IEhBTFZFKHdpZHRoKTsKLSAgICAgIGNvbnN0IGludCB1dl9oZWlnaHQgPSBIQUxWRShoZWlnaHQpOwotICAgICAgY29uc3QgaW50IHV2X3N0cmlkZSA9IHV2X3dpZHRoOwotICAgICAgaW50IHV2MF9zdHJpZGUgPSAwOwotICAgICAgaW50IGFfd2lkdGgsIGFfc3RyaWRlOwotICAgICAgdWludDY0X3QgeV9zaXplLCB1dl9zaXplLCB1djBfc2l6ZSwgYV9zaXplLCB0b3RhbF9zaXplOwotICAgICAgdWludDhfdCogbWVtOwotCi0gICAgICAvLyBVL1YKLSAgICAgIHN3aXRjaCAodXZfY3NwKSB7Ci0gICAgICAgIGNhc2UgV0VCUF9ZVVY0MjA6Ci0gICAgICAgICAgYnJlYWs7Ci0jaWZkZWYgV0VCUF9FWFBFUklNRU5UQUxfRkVBVFVSRVMKLSAgICAgICAgY2FzZSBXRUJQX1lVVjQwMDogICAgLy8gZm9yIG5vdywgd2UnbGwganVzdCByZXNldCB0aGUgVS9WIHNhbXBsZXMKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBXRUJQX1lVVjQyMjoKLSAgICAgICAgICB1djBfc3RyaWRlID0gdXZfd2lkdGg7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgV0VCUF9ZVVY0NDQ6Ci0gICAgICAgICAgdXYwX3N0cmlkZSA9IHdpZHRoOwotICAgICAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9Ci0gICAgICB1djBfc2l6ZSA9IGhlaWdodCAqIHV2MF9zdHJpZGU7Ci0KLSAgICAgIC8vIGFscGhhCi0gICAgICBhX3dpZHRoID0gaGFzX2FscGhhID8gd2lkdGggOiAwOwotICAgICAgYV9zdHJpZGUgPSBhX3dpZHRoOwotICAgICAgeV9zaXplID0gKHVpbnQ2NF90KXlfc3RyaWRlICogaGVpZ2h0OwotICAgICAgdXZfc2l6ZSA9ICh1aW50NjRfdCl1dl9zdHJpZGUgKiB1dl9oZWlnaHQ7Ci0gICAgICBhX3NpemUgPSAgKHVpbnQ2NF90KWFfc3RyaWRlICogaGVpZ2h0OwotCi0gICAgICB0b3RhbF9zaXplID0geV9zaXplICsgYV9zaXplICsgMiAqIHV2X3NpemUgKyAyICogdXYwX3NpemU7Ci0KLSAgICAgIC8vIFNlY3VyaXR5IGFuZCB2YWxpZGF0aW9uIGNoZWNrcwotICAgICAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDAgfHwgICAgICAgICAvLyBsdW1hL2FscGhhIHBhcmFtIGVycm9yCi0gICAgICAgICAgdXZfd2lkdGggPCAwIHx8IHV2X2hlaWdodCA8IDApIHsgICAgIC8vIHUvdiBwYXJhbSBlcnJvcgotICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KLSAgICAgIC8vIENsZWFyIHByZXZpb3VzIGJ1ZmZlciBhbmQgYWxsb2NhdGUgYSBuZXcgb25lLgotICAgICAgV2ViUFBpY3R1cmVGcmVlKHBpY3R1cmUpOyAgIC8vIGVyYXNlIHByZXZpb3VzIGJ1ZmZlcgotICAgICAgbWVtID0gKHVpbnQ4X3QqKVdlYlBTYWZlTWFsbG9jKHRvdGFsX3NpemUsIHNpemVvZigqbWVtKSk7Ci0gICAgICBpZiAobWVtID09IE5VTEwpIHJldHVybiAwOwotCi0gICAgICAvLyBGcm9tIG5vdyBvbiwgd2UncmUgaW4gdGhlIGNsZWFyLCB3ZSBjYW4gbm8gbG9uZ2VyIGZhaWwuLi4KLSAgICAgIHBpY3R1cmUtPm1lbW9yeV8gPSAodm9pZCopbWVtOwotICAgICAgcGljdHVyZS0+eV9zdHJpZGUgID0geV9zdHJpZGU7Ci0gICAgICBwaWN0dXJlLT51dl9zdHJpZGUgPSB1dl9zdHJpZGU7Ci0gICAgICBwaWN0dXJlLT5hX3N0cmlkZSAgPSBhX3N0cmlkZTsKLSAgICAgIHBpY3R1cmUtPnV2MF9zdHJpZGUgPSB1djBfc3RyaWRlOwotICAgICAgLy8gVE9ETyhza2FsKTogd2UgY291bGQgYWxpZ24gdGhlIHkvdS92IHBsYW5lcyBhbmQgYWRqdXN0IHN0cmlkZS4KLSAgICAgIHBpY3R1cmUtPnkgPSBtZW07Ci0gICAgICBtZW0gKz0geV9zaXplOwotCi0gICAgICBwaWN0dXJlLT51ID0gbWVtOwotICAgICAgbWVtICs9IHV2X3NpemU7Ci0gICAgICBwaWN0dXJlLT52ID0gbWVtOwotICAgICAgbWVtICs9IHV2X3NpemU7Ci0KLSAgICAgIGlmIChhX3NpemUpIHsKLSAgICAgICAgcGljdHVyZS0+YSA9IG1lbTsKLSAgICAgICAgbWVtICs9IGFfc2l6ZTsKLSAgICAgIH0KLSAgICAgIGlmICh1djBfc2l6ZSkgewotICAgICAgICBwaWN0dXJlLT51MCA9IG1lbTsKLSAgICAgICAgbWVtICs9IHV2MF9zaXplOwotICAgICAgICBwaWN0dXJlLT52MCA9IG1lbTsKLSAgICAgICAgbWVtICs9IHV2MF9zaXplOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICB2b2lkKiBtZW1vcnk7Ci0gICAgICBjb25zdCB1aW50NjRfdCBhcmdiX3NpemUgPSAodWludDY0X3Qpd2lkdGggKiBoZWlnaHQ7Ci0gICAgICBpZiAod2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KLSAgICAgIC8vIENsZWFyIHByZXZpb3VzIGJ1ZmZlciBhbmQgYWxsb2NhdGUgYSBuZXcgb25lLgotICAgICAgV2ViUFBpY3R1cmVGcmVlKHBpY3R1cmUpOyAgIC8vIGVyYXNlIHByZXZpb3VzIGJ1ZmZlcgotICAgICAgbWVtb3J5ID0gV2ViUFNhZmVNYWxsb2MoYXJnYl9zaXplLCBzaXplb2YoKnBpY3R1cmUtPmFyZ2IpKTsKLSAgICAgIGlmIChtZW1vcnkgPT0gTlVMTCkgcmV0dXJuIDA7Ci0KLSAgICAgIC8vIFRPRE8oc2thbCk6IGFsaWduIHBsYW5lIHRvIGNhY2hlIGxpbmU/Ci0gICAgICBwaWN0dXJlLT5tZW1vcnlfYXJnYl8gPSBtZW1vcnk7Ci0gICAgICBwaWN0dXJlLT5hcmdiID0gKHVpbnQzMl90KiltZW1vcnk7Ci0gICAgICBwaWN0dXJlLT5hcmdiX3N0cmlkZSA9IHdpZHRoOwotICAgIH0KLSAgfQotICByZXR1cm4gMTsKLX0KLQotLy8gUmVtb3ZlIHJlZmVyZW5jZSB0byB0aGUgQVJHQiBidWZmZXIgKGRvZXNuJ3QgZnJlZSBhbnl0aGluZykuCi1zdGF0aWMgdm9pZCBQaWN0dXJlUmVzZXRBUkdCKFdlYlBQaWN0dXJlKiBjb25zdCBwaWN0dXJlKSB7Ci0gIHBpY3R1cmUtPm1lbW9yeV9hcmdiXyA9IE5VTEw7Ci0gIHBpY3R1cmUtPmFyZ2IgPSBOVUxMOwotICBwaWN0dXJlLT5hcmdiX3N0cmlkZSA9IDA7Ci19Ci0KLS8vIFJlbW92ZSByZWZlcmVuY2UgdG8gdGhlIFlVVkEgYnVmZmVyIChkb2Vzbid0IGZyZWUgYW55dGhpbmcpLgotc3RhdGljIHZvaWQgUGljdHVyZVJlc2V0WVVWQShXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSkgewotICBwaWN0dXJlLT5tZW1vcnlfID0gTlVMTDsKLSAgcGljdHVyZS0+eSA9IHBpY3R1cmUtPnUgPSBwaWN0dXJlLT52ID0gcGljdHVyZS0+YSA9IE5VTEw7Ci0gIHBpY3R1cmUtPnUwID0gcGljdHVyZS0+djAgPSBOVUxMOwotICBwaWN0dXJlLT55X3N0cmlkZSA9IHBpY3R1cmUtPnV2X3N0cmlkZSA9IDA7Ci0gIHBpY3R1cmUtPmFfc3RyaWRlID0gMDsKLSAgcGljdHVyZS0+dXYwX3N0cmlkZSA9IDA7Ci19Ci0KLS8vIEdyYWIgdGhlICdzcGVjcycgKHdyaXRlciwgKm9wYXF1ZSwgd2lkdGgsIGhlaWdodC4uLikgZnJvbSAnc3JjJyBhbmQgY29weSB0aGVtCi0vLyBpbnRvICdkc3QnLiBNYXJrICdkc3QnIGFzIG5vdCBvd25pbmcgYW55IG1lbW9yeS4KLXN0YXRpYyB2b2lkIFdlYlBQaWN0dXJlR3JhYlNwZWNzKGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQUGljdHVyZSogY29uc3QgZHN0KSB7Ci0gIFNCX0RDSEVDSyhzcmMgIT0gTlVMTCAmJiBkc3QgIT0gTlVMTCk7Ci0gICpkc3QgPSAqc3JjOwotICBQaWN0dXJlUmVzZXRZVVZBKGRzdCk7Ci0gIFBpY3R1cmVSZXNldEFSR0IoZHN0KTsKLX0KLQotLy8gQWxsb2NhdGUgYSBuZXcgYXJnYiBidWZmZXIsIGRpc2NhcmRpbmcgYW55IGV4aXN0aW5nIG9uZSBhbmQgcHJlc2VydmluZwotLy8gdGhlIG90aGVyIFlVVihBKSBidWZmZXIuCi1zdGF0aWMgaW50IFBpY3R1cmVBbGxvY0FSR0IoV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUpIHsKLSAgV2ViUFBpY3R1cmUgdG1wOwotICBTYk1lbW9yeURlYWxsb2NhdGUocGljdHVyZS0+bWVtb3J5X2FyZ2JfKTsKLSAgUGljdHVyZVJlc2V0QVJHQihwaWN0dXJlKTsKLSAgcGljdHVyZS0+dXNlX2FyZ2IgPSAxOwotICBXZWJQUGljdHVyZUdyYWJTcGVjcyhwaWN0dXJlLCAmdG1wKTsKLSAgaWYgKCFXZWJQUGljdHVyZUFsbG9jKCZ0bXApKSB7Ci0gICAgcmV0dXJuIFdlYlBFbmNvZGluZ1NldEVycm9yKHBpY3R1cmUsIFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWSk7Ci0gIH0KLSAgcGljdHVyZS0+bWVtb3J5X2FyZ2JfID0gdG1wLm1lbW9yeV9hcmdiXzsKLSAgcGljdHVyZS0+YXJnYiA9IHRtcC5hcmdiOwotICBwaWN0dXJlLT5hcmdiX3N0cmlkZSA9IHRtcC5hcmdiX3N0cmlkZTsKLSAgcmV0dXJuIDE7Ci19Ci0KLS8vIFJlbGVhc2UgbWVtb3J5IG93bmVkIGJ5ICdwaWN0dXJlJyAoYm90aCBZVVYgYW5kIEFSR0IgYnVmZmVycykuCi12b2lkIFdlYlBQaWN0dXJlRnJlZShXZWJQUGljdHVyZSogcGljdHVyZSkgewotICBpZiAocGljdHVyZSAhPSBOVUxMKSB7Ci0gICAgU2JNZW1vcnlEZWFsbG9jYXRlKHBpY3R1cmUtPm1lbW9yeV8pOwotICAgIFNiTWVtb3J5RGVhbGxvY2F0ZShwaWN0dXJlLT5tZW1vcnlfYXJnYl8pOwotICAgIFBpY3R1cmVSZXNldFlVVkEocGljdHVyZSk7Ci0gICAgUGljdHVyZVJlc2V0QVJHQihwaWN0dXJlKTsKLSAgfQotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gUGljdHVyZSBjb3B5aW5nCi0KLS8vIE5vdCB3b3J0aCBtb3ZpbmcgdG8gZHNwL2VuYy5jIChvbmx5IHVzZWQgaGVyZSkuCi1zdGF0aWMgdm9pZCBDb3B5UGxhbmUoY29uc3QgdWludDhfdCogc3JjLCBpbnQgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBkc3Rfc3RyaWRlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgd2hpbGUgKGhlaWdodC0tID4gMCkgewotICAgIFNiTWVtb3J5Q29weShkc3QsIHNyYywgd2lkdGgpOwotICAgIHNyYyArPSBzcmNfc3RyaWRlOwotICAgIGRzdCArPSBkc3Rfc3RyaWRlOwotICB9Ci19Ci0KLS8vIEFkanVzdCB0b3AtbGVmdCBjb3JuZXIgdG8gY2hyb21hIHNhbXBsZSBwb3NpdGlvbi4KLXN0YXRpYyB2b2lkIFNuYXBUb3BMZWZ0UG9zaXRpb24oY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBsZWZ0LCBpbnQqIGNvbnN0IHRvcCkgewotICBpZiAoIXBpYy0+dXNlX2FyZ2IpIHsKLSAgICBjb25zdCBpbnQgaXNfeXV2NDIyID0gSVNfWVVWX0NTUChwaWMtPmNvbG9yc3BhY2UsIFdFQlBfWVVWNDIyKTsKLSAgICBpZiAoSVNfWVVWX0NTUChwaWMtPmNvbG9yc3BhY2UsIFdFQlBfWVVWNDIwKSB8fCBpc195dXY0MjIpIHsKLSAgICAgICpsZWZ0ICY9IH4xOwotICAgICAgaWYgKCFpc195dXY0MjIpICp0b3AgJj0gfjE7Ci0gICAgfQotICB9Ci19Ci0KLS8vIEFkanVzdCB0b3AtbGVmdCBjb3JuZXIgYW5kIHZlcmlmeSB0aGF0IHRoZSBzdWItcmVjdGFuZ2xlIGlzIHZhbGlkLgotc3RhdGljIGludCBBZGp1c3RBbmRDaGVja1JlY3RhbmdsZShjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGxlZnQsIGludCogY29uc3QgdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgU25hcFRvcExlZnRQb3NpdGlvbihwaWMsIGxlZnQsIHRvcCk7Ci0gIGlmICgoKmxlZnQpIDwgMCB8fCAoKnRvcCkgPCAwKSByZXR1cm4gMDsKLSAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDApIHJldHVybiAwOwotICBpZiAoKCpsZWZ0KSArIHdpZHRoID4gcGljLT53aWR0aCkgcmV0dXJuIDA7Ci0gIGlmICgoKnRvcCkgKyBoZWlnaHQgPiBwaWMtPmhlaWdodCkgcmV0dXJuIDA7Ci0gIHJldHVybiAxOwotfQotCi1pbnQgV2ViUFBpY3R1cmVDb3B5KGNvbnN0IFdlYlBQaWN0dXJlKiBzcmMsIFdlYlBQaWN0dXJlKiBkc3QpIHsKLSAgaWYgKHNyYyA9PSBOVUxMIHx8IGRzdCA9PSBOVUxMKSByZXR1cm4gMDsKLSAgaWYgKHNyYyA9PSBkc3QpIHJldHVybiAxOwotCi0gIFdlYlBQaWN0dXJlR3JhYlNwZWNzKHNyYywgZHN0KTsKLSAgaWYgKCFXZWJQUGljdHVyZUFsbG9jKGRzdCkpIHJldHVybiAwOwotCi0gIGlmICghc3JjLT51c2VfYXJnYikgewotICAgIENvcHlQbGFuZShzcmMtPnksIHNyYy0+eV9zdHJpZGUsCi0gICAgICAgICAgICAgIGRzdC0+eSwgZHN0LT55X3N0cmlkZSwgZHN0LT53aWR0aCwgZHN0LT5oZWlnaHQpOwotICAgIENvcHlQbGFuZShzcmMtPnUsIHNyYy0+dXZfc3RyaWRlLAotICAgICAgICAgICAgICBkc3QtPnUsIGRzdC0+dXZfc3RyaWRlLCBIQUxWRShkc3QtPndpZHRoKSwgSEFMVkUoZHN0LT5oZWlnaHQpKTsKLSAgICBDb3B5UGxhbmUoc3JjLT52LCBzcmMtPnV2X3N0cmlkZSwKLSAgICAgICAgICAgICAgZHN0LT52LCBkc3QtPnV2X3N0cmlkZSwgSEFMVkUoZHN0LT53aWR0aCksIEhBTFZFKGRzdC0+aGVpZ2h0KSk7Ci0gICAgaWYgKGRzdC0+YSAhPSBOVUxMKSAgewotICAgICAgQ29weVBsYW5lKHNyYy0+YSwgc3JjLT5hX3N0cmlkZSwKLSAgICAgICAgICAgICAgICBkc3QtPmEsIGRzdC0+YV9zdHJpZGUsIGRzdC0+d2lkdGgsIGRzdC0+aGVpZ2h0KTsKLSAgICB9Ci0jaWZkZWYgV0VCUF9FWFBFUklNRU5UQUxfRkVBVFVSRVMKLSAgICBpZiAoZHN0LT51MCAhPSBOVUxMKSAgewotICAgICAgaW50IHV2MF93aWR0aCA9IHNyYy0+d2lkdGg7Ci0gICAgICBpZiAoSVNfWVVWX0NTUChkc3QtPmNvbG9yc3BhY2UsIFdFQlBfWVVWNDIyKSkgewotICAgICAgICB1djBfd2lkdGggPSBIQUxWRSh1djBfd2lkdGgpOwotICAgICAgfQotICAgICAgQ29weVBsYW5lKHNyYy0+dTAsIHNyYy0+dXYwX3N0cmlkZSwKLSAgICAgICAgICAgICAgICBkc3QtPnUwLCBkc3QtPnV2MF9zdHJpZGUsIHV2MF93aWR0aCwgZHN0LT5oZWlnaHQpOwotICAgICAgQ29weVBsYW5lKHNyYy0+djAsIHNyYy0+dXYwX3N0cmlkZSwKLSAgICAgICAgICAgICAgICBkc3QtPnYwLCBkc3QtPnV2MF9zdHJpZGUsIHV2MF93aWR0aCwgZHN0LT5oZWlnaHQpOwotICAgIH0KLSNlbmRpZgotICB9IGVsc2UgewotICAgIENvcHlQbGFuZSgoY29uc3QgdWludDhfdCopc3JjLT5hcmdiLCA0ICogc3JjLT5hcmdiX3N0cmlkZSwKLSAgICAgICAgICAgICAgKHVpbnQ4X3QqKWRzdC0+YXJnYiwgNCAqIGRzdC0+YXJnYl9zdHJpZGUsCi0gICAgICAgICAgICAgIDQgKiBkc3QtPndpZHRoLCBkc3QtPmhlaWdodCk7Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLWludCBXZWJQUGljdHVyZUlzVmlldyhjb25zdCBXZWJQUGljdHVyZSogcGljdHVyZSkgewotICBpZiAocGljdHVyZSA9PSBOVUxMKSByZXR1cm4gMDsKLSAgaWYgKHBpY3R1cmUtPnVzZV9hcmdiKSB7Ci0gICAgcmV0dXJuIChwaWN0dXJlLT5tZW1vcnlfYXJnYl8gPT0gTlVMTCk7Ci0gIH0KLSAgcmV0dXJuIChwaWN0dXJlLT5tZW1vcnlfID09IE5VTEwpOwotfQotCi1pbnQgV2ViUFBpY3R1cmVWaWV3KGNvbnN0IFdlYlBQaWN0dXJlKiBzcmMsCi0gICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgIFdlYlBQaWN0dXJlKiBkc3QpIHsKLSAgaWYgKHNyYyA9PSBOVUxMIHx8IGRzdCA9PSBOVUxMKSByZXR1cm4gMDsKLQotICAvLyB2ZXJpZnkgcmVjdGFuZ2xlIHBvc2l0aW9uLgotICBpZiAoIUFkanVzdEFuZENoZWNrUmVjdGFuZ2xlKHNyYywgJmxlZnQsICZ0b3AsIHdpZHRoLCBoZWlnaHQpKSByZXR1cm4gMDsKLQotICBpZiAoc3JjICE9IGRzdCkgeyAgLy8gYmV3YXJlIG9mIGFsaWFzaW5nISBXZSBkb24ndCB3YW50IHRvIGxlYWsgJ21lbW9yeV8nLgotICAgIFdlYlBQaWN0dXJlR3JhYlNwZWNzKHNyYywgZHN0KTsKLSAgfQotICBkc3QtPndpZHRoID0gd2lkdGg7Ci0gIGRzdC0+aGVpZ2h0ID0gaGVpZ2h0OwotICBpZiAoIXNyYy0+dXNlX2FyZ2IpIHsKLSAgICBkc3QtPnkgPSBzcmMtPnkgKyB0b3AgKiBzcmMtPnlfc3RyaWRlICsgbGVmdDsKLSAgICBkc3QtPnUgPSBzcmMtPnUgKyAodG9wID4+IDEpICogc3JjLT51dl9zdHJpZGUgKyAobGVmdCA+PiAxKTsKLSAgICBkc3QtPnYgPSBzcmMtPnYgKyAodG9wID4+IDEpICogc3JjLT51dl9zdHJpZGUgKyAobGVmdCA+PiAxKTsKLSAgICBkc3QtPnlfc3RyaWRlID0gc3JjLT55X3N0cmlkZTsKLSAgICBkc3QtPnV2X3N0cmlkZSA9IHNyYy0+dXZfc3RyaWRlOwotICAgIGlmIChzcmMtPmEgIT0gTlVMTCkgewotICAgICAgZHN0LT5hID0gc3JjLT5hICsgdG9wICogc3JjLT5hX3N0cmlkZSArIGxlZnQ7Ci0gICAgICBkc3QtPmFfc3RyaWRlID0gc3JjLT5hX3N0cmlkZTsKLSAgICB9Ci0jaWZkZWYgV0VCUF9FWFBFUklNRU5UQUxfRkVBVFVSRVMKLSAgICBpZiAoc3JjLT51MCAhPSBOVUxMKSB7Ci0gICAgICBjb25zdCBpbnQgbGVmdF9wb3MgPQotICAgICAgICAgIElTX1lVVl9DU1AoZHN0LT5jb2xvcnNwYWNlLCBXRUJQX1lVVjQyMikgPyAobGVmdCA+PiAxKSA6IGxlZnQ7Ci0gICAgICBkc3QtPnUwID0gc3JjLT51MCArIHRvcCAqIHNyYy0+dXYwX3N0cmlkZSArIGxlZnRfcG9zOwotICAgICAgZHN0LT52MCA9IHNyYy0+djAgKyB0b3AgKiBzcmMtPnV2MF9zdHJpZGUgKyBsZWZ0X3BvczsKLSAgICAgIGRzdC0+dXYwX3N0cmlkZSA9IHNyYy0+dXYwX3N0cmlkZTsKLSAgICB9Ci0jZW5kaWYKLSAgfSBlbHNlIHsKLSAgICBkc3QtPmFyZ2IgPSBzcmMtPmFyZ2IgKyB0b3AgKiBzcmMtPmFyZ2Jfc3RyaWRlICsgbGVmdDsKLSAgICBkc3QtPmFyZ2Jfc3RyaWRlID0gc3JjLT5hcmdiX3N0cmlkZTsKLSAgfQotICByZXR1cm4gMTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFBpY3R1cmUgY3JvcHBpbmcKLQotaW50IFdlYlBQaWN0dXJlQ3JvcChXZWJQUGljdHVyZSogcGljLAotICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gIFdlYlBQaWN0dXJlIHRtcDsKLQotICBpZiAocGljID09IE5VTEwpIHJldHVybiAwOwotICBpZiAoIUFkanVzdEFuZENoZWNrUmVjdGFuZ2xlKHBpYywgJmxlZnQsICZ0b3AsIHdpZHRoLCBoZWlnaHQpKSByZXR1cm4gMDsKLQotICBXZWJQUGljdHVyZUdyYWJTcGVjcyhwaWMsICZ0bXApOwotICB0bXAud2lkdGggPSB3aWR0aDsKLSAgdG1wLmhlaWdodCA9IGhlaWdodDsKLSAgaWYgKCFXZWJQUGljdHVyZUFsbG9jKCZ0bXApKSByZXR1cm4gMDsKLQotICBpZiAoIXBpYy0+dXNlX2FyZ2IpIHsKLSAgICBjb25zdCBpbnQgeV9vZmZzZXQgPSB0b3AgKiBwaWMtPnlfc3RyaWRlICsgbGVmdDsKLSAgICBjb25zdCBpbnQgdXZfb2Zmc2V0ID0gKHRvcCAvIDIpICogcGljLT51dl9zdHJpZGUgKyBsZWZ0IC8gMjsKLSAgICBDb3B5UGxhbmUocGljLT55ICsgeV9vZmZzZXQsIHBpYy0+eV9zdHJpZGUsCi0gICAgICAgICAgICAgIHRtcC55LCB0bXAueV9zdHJpZGUsIHdpZHRoLCBoZWlnaHQpOwotICAgIENvcHlQbGFuZShwaWMtPnUgKyB1dl9vZmZzZXQsIHBpYy0+dXZfc3RyaWRlLAotICAgICAgICAgICAgICB0bXAudSwgdG1wLnV2X3N0cmlkZSwgSEFMVkUod2lkdGgpLCBIQUxWRShoZWlnaHQpKTsKLSAgICBDb3B5UGxhbmUocGljLT52ICsgdXZfb2Zmc2V0LCBwaWMtPnV2X3N0cmlkZSwKLSAgICAgICAgICAgICAgdG1wLnYsIHRtcC51dl9zdHJpZGUsIEhBTFZFKHdpZHRoKSwgSEFMVkUoaGVpZ2h0KSk7Ci0KLSAgICBpZiAodG1wLmEgIT0gTlVMTCkgewotICAgICAgY29uc3QgaW50IGFfb2Zmc2V0ID0gdG9wICogcGljLT5hX3N0cmlkZSArIGxlZnQ7Ci0gICAgICBDb3B5UGxhbmUocGljLT5hICsgYV9vZmZzZXQsIHBpYy0+YV9zdHJpZGUsCi0gICAgICAgICAgICAgICAgdG1wLmEsIHRtcC5hX3N0cmlkZSwgd2lkdGgsIGhlaWdodCk7Ci0gICAgfQotI2lmZGVmIFdFQlBfRVhQRVJJTUVOVEFMX0ZFQVRVUkVTCi0gICAgaWYgKHRtcC51MCAhPSBOVUxMKSB7Ci0gICAgICBpbnQgdyA9IHdpZHRoOwotICAgICAgaW50IGxlZnRfcG9zID0gbGVmdDsKLSAgICAgIGlmIChJU19ZVVZfQ1NQKHRtcC5jb2xvcnNwYWNlLCBXRUJQX1lVVjQyMikpIHsKLSAgICAgICAgdyA9IEhBTFZFKHcpOwotICAgICAgICBsZWZ0X3BvcyA9IEhBTFZFKGxlZnRfcG9zKTsKLSAgICAgIH0KLSAgICAgIENvcHlQbGFuZShwaWMtPnUwICsgdG9wICogcGljLT51djBfc3RyaWRlICsgbGVmdF9wb3MsIHBpYy0+dXYwX3N0cmlkZSwKLSAgICAgICAgICAgICAgICB0bXAudTAsIHRtcC51djBfc3RyaWRlLCB3LCBoZWlnaHQpOwotICAgICAgQ29weVBsYW5lKHBpYy0+djAgKyB0b3AgKiBwaWMtPnV2MF9zdHJpZGUgKyBsZWZ0X3BvcywgcGljLT51djBfc3RyaWRlLAotICAgICAgICAgICAgICAgIHRtcC52MCwgdG1wLnV2MF9zdHJpZGUsIHcsIGhlaWdodCk7Ci0gICAgfQotI2VuZGlmCi0gIH0gZWxzZSB7Ci0gICAgY29uc3QgdWludDhfdCogY29uc3Qgc3JjID0KLSAgICAgICAgKGNvbnN0IHVpbnQ4X3QqKShwaWMtPmFyZ2IgKyB0b3AgKiBwaWMtPmFyZ2Jfc3RyaWRlICsgbGVmdCk7Ci0gICAgQ29weVBsYW5lKHNyYywgcGljLT5hcmdiX3N0cmlkZSAqIDQsCi0gICAgICAgICAgICAgICh1aW50OF90Kil0bXAuYXJnYiwgdG1wLmFyZ2Jfc3RyaWRlICogNCwKLSAgICAgICAgICAgICAgd2lkdGggKiA0LCBoZWlnaHQpOwotICB9Ci0gIFdlYlBQaWN0dXJlRnJlZShwaWMpOwotICAqcGljID0gdG1wOwotICByZXR1cm4gMTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFNpbXBsZSBwaWN0dXJlIHJlc2NhbGVyCi0KLXN0YXRpYyB2b2lkIFJlc2NhbGVQbGFuZShjb25zdCB1aW50OF90KiBzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY193aWR0aCwgaW50IHNyY19oZWlnaHQsIGludCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X3dpZHRoLCBpbnQgZHN0X2hlaWdodCwgaW50IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogY29uc3Qgd29yaywKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX2NoYW5uZWxzKSB7Ci0gIFdlYlBSZXNjYWxlciByZXNjYWxlcjsKLSAgaW50IHkgPSAwOwotICBXZWJQUmVzY2FsZXJJbml0KCZyZXNjYWxlciwgc3JjX3dpZHRoLCBzcmNfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgIGRzdCwgZHN0X3dpZHRoLCBkc3RfaGVpZ2h0LCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgIG51bV9jaGFubmVscywKLSAgICAgICAgICAgICAgICAgICBzcmNfd2lkdGgsIGRzdF93aWR0aCwKLSAgICAgICAgICAgICAgICAgICBzcmNfaGVpZ2h0LCBkc3RfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgIHdvcmspOwotICBTYk1lbW9yeVNldCh3b3JrLCAwLCAyICogZHN0X3dpZHRoICogbnVtX2NoYW5uZWxzICogc2l6ZW9mKCp3b3JrKSk7Ci0gIHdoaWxlICh5IDwgc3JjX2hlaWdodCkgewotICAgIHkgKz0gV2ViUFJlc2NhbGVySW1wb3J0KCZyZXNjYWxlciwgc3JjX2hlaWdodCAtIHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjICsgeSAqIHNyY19zdHJpZGUsIHNyY19zdHJpZGUpOwotICAgIFdlYlBSZXNjYWxlckV4cG9ydCgmcmVzY2FsZXIpOwotICB9Ci19Ci0KLWludCBXZWJQUGljdHVyZVJlc2NhbGUoV2ViUFBpY3R1cmUqIHBpYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gIFdlYlBQaWN0dXJlIHRtcDsKLSAgaW50IHByZXZfd2lkdGgsIHByZXZfaGVpZ2h0OwotICBpbnQzMl90KiB3b3JrOwotCi0gIGlmIChwaWMgPT0gTlVMTCkgcmV0dXJuIDA7Ci0gIHByZXZfd2lkdGggPSBwaWMtPndpZHRoOwotICBwcmV2X2hlaWdodCA9IHBpYy0+aGVpZ2h0OwotICAvLyBpZiB3aWR0aCBpcyB1bnNwZWNpZmllZCwgc2NhbGUgb3JpZ2luYWwgcHJvcG9ydGlvbmFsbHkgdG8gaGVpZ2h0IHJhdGlvLgotICBpZiAod2lkdGggPT0gMCkgewotICAgIHdpZHRoID0gKHByZXZfd2lkdGggKiBoZWlnaHQgKyBwcmV2X2hlaWdodCAvIDIpIC8gcHJldl9oZWlnaHQ7Ci0gIH0KLSAgLy8gaWYgaGVpZ2h0IGlzIHVuc3BlY2lmaWVkLCBzY2FsZSBvcmlnaW5hbCBwcm9wb3J0aW9uYWxseSB0byB3aWR0aCByYXRpby4KLSAgaWYgKGhlaWdodCA9PSAwKSB7Ci0gICAgaGVpZ2h0ID0gKHByZXZfaGVpZ2h0ICogd2lkdGggKyBwcmV2X3dpZHRoIC8gMikgLyBwcmV2X3dpZHRoOwotICB9Ci0gIC8vIENoZWNrIGlmIHRoZSBvdmVyYWxsIGRpbWVuc2lvbnMgc3RpbGwgbWFrZSBzZW5zZS4KLSAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDApIHJldHVybiAwOwotCi0gIFdlYlBQaWN0dXJlR3JhYlNwZWNzKHBpYywgJnRtcCk7Ci0gIHRtcC53aWR0aCA9IHdpZHRoOwotICB0bXAuaGVpZ2h0ID0gaGVpZ2h0OwotICBpZiAoIVdlYlBQaWN0dXJlQWxsb2MoJnRtcCkpIHJldHVybiAwOwotCi0gIGlmICghcGljLT51c2VfYXJnYikgewotICAgIHdvcmsgPSAoaW50MzJfdCopV2ViUFNhZmVNYWxsb2MoMlVMTCAqIHdpZHRoLCBzaXplb2YoKndvcmspKTsKLSAgICBpZiAod29yayA9PSBOVUxMKSB7Ci0gICAgICBXZWJQUGljdHVyZUZyZWUoJnRtcCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBSZXNjYWxlUGxhbmUocGljLT55LCBwcmV2X3dpZHRoLCBwcmV2X2hlaWdodCwgcGljLT55X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgdG1wLnksIHdpZHRoLCBoZWlnaHQsIHRtcC55X3N0cmlkZSwgd29yaywgMSk7Ci0gICAgUmVzY2FsZVBsYW5lKHBpYy0+dSwKLSAgICAgICAgICAgICAgICAgSEFMVkUocHJldl93aWR0aCksIEhBTFZFKHByZXZfaGVpZ2h0KSwgcGljLT51dl9zdHJpZGUsCi0gICAgICAgICAgICAgICAgIHRtcC51LAotICAgICAgICAgICAgICAgICBIQUxWRSh3aWR0aCksIEhBTFZFKGhlaWdodCksIHRtcC51dl9zdHJpZGUsIHdvcmssIDEpOwotICAgIFJlc2NhbGVQbGFuZShwaWMtPnYsCi0gICAgICAgICAgICAgICAgIEhBTFZFKHByZXZfd2lkdGgpLCBIQUxWRShwcmV2X2hlaWdodCksIHBpYy0+dXZfc3RyaWRlLAotICAgICAgICAgICAgICAgICB0bXAudiwKLSAgICAgICAgICAgICAgICAgSEFMVkUod2lkdGgpLCBIQUxWRShoZWlnaHQpLCB0bXAudXZfc3RyaWRlLCB3b3JrLCAxKTsKLQotICAgIGlmICh0bXAuYSAhPSBOVUxMKSB7Ci0gICAgICBSZXNjYWxlUGxhbmUocGljLT5hLCBwcmV2X3dpZHRoLCBwcmV2X2hlaWdodCwgcGljLT5hX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICB0bXAuYSwgd2lkdGgsIGhlaWdodCwgdG1wLmFfc3RyaWRlLCB3b3JrLCAxKTsKLSAgICB9Ci0jaWZkZWYgV0VCUF9FWFBFUklNRU5UQUxfRkVBVFVSRVMKLSAgICBpZiAodG1wLnUwICE9IE5VTEwpIHsKLSAgICAgIGNvbnN0IGludCBzID0gSVNfWVVWX0NTUCh0bXAuY29sb3JzcGFjZSwgV0VCUF9ZVVY0MjIpID8gMiA6IDE7Ci0gICAgICBSZXNjYWxlUGxhbmUoCi0gICAgICAgICAgcGljLT51MCwgKHByZXZfd2lkdGggKyBzIC8gMikgLyBzLCBwcmV2X2hlaWdodCwgcGljLT51djBfc3RyaWRlLAotICAgICAgICAgIHRtcC51MCwgKHdpZHRoICsgcyAvIDIpIC8gcywgaGVpZ2h0LCB0bXAudXYwX3N0cmlkZSwgd29yaywgMSk7Ci0gICAgICBSZXNjYWxlUGxhbmUoCi0gICAgICAgICAgcGljLT52MCwgKHByZXZfd2lkdGggKyBzIC8gMikgLyBzLCBwcmV2X2hlaWdodCwgcGljLT51djBfc3RyaWRlLAotICAgICAgICAgIHRtcC52MCwgKHdpZHRoICsgcyAvIDIpIC8gcywgaGVpZ2h0LCB0bXAudXYwX3N0cmlkZSwgd29yaywgMSk7Ci0gICAgfQotI2VuZGlmCi0gIH0gZWxzZSB7Ci0gICAgd29yayA9IChpbnQzMl90KilXZWJQU2FmZU1hbGxvYygyVUxMICogd2lkdGggKiA0LCBzaXplb2YoKndvcmspKTsKLSAgICBpZiAod29yayA9PSBOVUxMKSB7Ci0gICAgICBXZWJQUGljdHVyZUZyZWUoJnRtcCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBSZXNjYWxlUGxhbmUoKGNvbnN0IHVpbnQ4X3QqKXBpYy0+YXJnYiwgcHJldl93aWR0aCwgcHJldl9oZWlnaHQsCi0gICAgICAgICAgICAgICAgIHBpYy0+YXJnYl9zdHJpZGUgKiA0LAotICAgICAgICAgICAgICAgICAodWludDhfdCopdG1wLmFyZ2IsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgIHRtcC5hcmdiX3N0cmlkZSAqIDQsCi0gICAgICAgICAgICAgICAgIHdvcmssIDQpOwotICB9Ci0gIFdlYlBQaWN0dXJlRnJlZShwaWMpOwotICBTYk1lbW9yeURlYWxsb2NhdGUod29yayk7Ci0gICpwaWMgPSB0bXA7Ci0gIHJldHVybiAxOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gV2ViUE1lbW9yeVdyaXRlcjogV3JpdGUtdG8tbWVtb3J5Ci0KLXZvaWQgV2ViUE1lbW9yeVdyaXRlckluaXQoV2ViUE1lbW9yeVdyaXRlciogd3JpdGVyKSB7Ci0gIHdyaXRlci0+bWVtID0gTlVMTDsKLSAgd3JpdGVyLT5zaXplID0gMDsKLSAgd3JpdGVyLT5tYXhfc2l6ZSA9IDA7Ci19Ci0KLWludCBXZWJQTWVtb3J5V3JpdGUoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUFBpY3R1cmUqIHBpY3R1cmUpIHsKLSAgV2ViUE1lbW9yeVdyaXRlciogY29uc3QgdyA9IChXZWJQTWVtb3J5V3JpdGVyKilwaWN0dXJlLT5jdXN0b21fcHRyOwotICB1aW50NjRfdCBuZXh0X3NpemU7Ci0gIGlmICh3ID09IE5VTEwpIHsKLSAgICByZXR1cm4gMTsKLSAgfQotICBuZXh0X3NpemUgPSAodWludDY0X3Qpdy0+c2l6ZSArIGRhdGFfc2l6ZTsKLSAgaWYgKG5leHRfc2l6ZSA+IHctPm1heF9zaXplKSB7Ci0gICAgdWludDhfdCogbmV3X21lbTsKLSAgICB1aW50NjRfdCBuZXh0X21heF9zaXplID0gMlVMTCAqIHctPm1heF9zaXplOwotICAgIGlmIChuZXh0X21heF9zaXplIDwgbmV4dF9zaXplKSBuZXh0X21heF9zaXplID0gbmV4dF9zaXplOwotICAgIGlmIChuZXh0X21heF9zaXplIDwgODE5MlVMTCkgbmV4dF9tYXhfc2l6ZSA9IDgxOTJVTEw7Ci0gICAgbmV3X21lbSA9ICh1aW50OF90KilXZWJQU2FmZU1hbGxvYyhuZXh0X21heF9zaXplLCAxKTsKLSAgICBpZiAobmV3X21lbSA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKHctPnNpemUgPiAwKSB7Ci0gICAgICBTYk1lbW9yeUNvcHkobmV3X21lbSwgdy0+bWVtLCB3LT5zaXplKTsKLSAgICB9Ci0gICAgU2JNZW1vcnlEZWFsbG9jYXRlKHctPm1lbSk7Ci0gICAgdy0+bWVtID0gbmV3X21lbTsKLSAgICAvLyBkb3duLWNhc3QgaXMgb2ssIHRoYW5rcyB0byBXZWJQU2FmZU1hbGxvYwotICAgIHctPm1heF9zaXplID0gKHNpemVfdCluZXh0X21heF9zaXplOwotICB9Ci0gIGlmIChkYXRhX3NpemUgPiAwKSB7Ci0gICAgU2JNZW1vcnlDb3B5KHctPm1lbSArIHctPnNpemUsIGRhdGEsIGRhdGFfc2l6ZSk7Ci0gICAgdy0+c2l6ZSArPSBkYXRhX3NpemU7Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBEZXRlY3Rpb24gb2Ygbm9uLXRyaXZpYWwgdHJhbnNwYXJlbmN5Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZiBhbHBoYVtdIGhhcyBub24tMHhmZiB2YWx1ZXMuCi1zdGF0aWMgaW50IENoZWNrTm9uT3BhcXVlKGNvbnN0IHVpbnQ4X3QqIGFscGhhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4X3N0ZXAsIGludCB5X3N0ZXApIHsKLSAgaWYgKGFscGhhID09IE5VTEwpIHJldHVybiAwOwotICB3aGlsZSAoaGVpZ2h0LS0gPiAwKSB7Ci0gICAgaW50IHg7Ci0gICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoICogeF9zdGVwOyB4ICs9IHhfc3RlcCkgewotICAgICAgaWYgKGFscGhhW3hdICE9IDB4ZmYpIHJldHVybiAxOyAgLy8gVE9ETyhza2FsKTogY2hlY2sgNC84IGJ5dGVzIGF0IGEgdGltZS4KLSAgICB9Ci0gICAgYWxwaGEgKz0geV9zdGVwOwotICB9Ci0gIHJldHVybiAwOwotfQotCi0vLyBDaGVja2luZyBmb3IgdGhlIHByZXNlbmNlIG9mIG5vbi1vcGFxdWUgYWxwaGEuCi1pbnQgV2ViUFBpY3R1cmVIYXNUcmFuc3BhcmVuY3koY29uc3QgV2ViUFBpY3R1cmUqIHBpY3R1cmUpIHsKLSAgaWYgKHBpY3R1cmUgPT0gTlVMTCkgcmV0dXJuIDA7Ci0gIGlmICghcGljdHVyZS0+dXNlX2FyZ2IpIHsKLSAgICByZXR1cm4gQ2hlY2tOb25PcGFxdWUocGljdHVyZS0+YSwgcGljdHVyZS0+d2lkdGgsIHBpY3R1cmUtPmhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgcGljdHVyZS0+YV9zdHJpZGUpOwotICB9IGVsc2UgewotICAgIGludCB4LCB5OwotICAgIGNvbnN0IHVpbnQzMl90KiBhcmdiID0gcGljdHVyZS0+YXJnYjsKLSAgICBpZiAoYXJnYiA9PSBOVUxMKSByZXR1cm4gMDsKLSAgICBmb3IgKHkgPSAwOyB5IDwgcGljdHVyZS0+aGVpZ2h0OyArK3kpIHsKLSAgICAgIGZvciAoeCA9IDA7IHggPCBwaWN0dXJlLT53aWR0aDsgKyt4KSB7Ci0gICAgICAgIGlmIChhcmdiW3hdIDwgMHhmZjAwMDAwMHUpIHJldHVybiAxOyAgIC8vIHRlc3QgYW55IGFscGhhIHZhbHVlcyAhPSAweGZmCi0gICAgICB9Ci0gICAgICBhcmdiICs9IHBpY3R1cmUtPmFyZ2Jfc3RyaWRlOwotICAgIH0KLSAgfQotICByZXR1cm4gMDsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFJHQiAtPiBZVVYgY29udmVyc2lvbgotCi0vLyBUT0RPOiB3ZSBjYW4gZG8gYmV0dGVyIHRoYW4gc2ltcGx5IDJ4MiBhdmVyYWdpbmcgb24gVS9WIHNhbXBsZXMuCi0jZGVmaW5lIFNVTTQocHRyKSAoKHB0cilbMF0gKyAocHRyKVtzdGVwXSArIFwKLSAgICAgICAgICAgICAgICAgICAocHRyKVtyZ2Jfc3RyaWRlXSArIChwdHIpW3JnYl9zdHJpZGUgKyBzdGVwXSkKLSNkZWZpbmUgU1VNMkgocHRyKSAoMiAqIChwdHIpWzBdICsgMiAqIChwdHIpW3N0ZXBdKQotI2RlZmluZSBTVU0yVihwdHIpICgyICogKHB0cilbMF0gKyAyICogKHB0cilbcmdiX3N0cmlkZV0pCi0jZGVmaW5lIFNVTTEocHRyKSAgKDQgKiAocHRyKVswXSkKLSNkZWZpbmUgUkdCX1RPX1VWKHgsIHksIFNVTSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgaW50IHNyYyA9ICgyICogKHN0ZXAgKiAoeCkgKyAoeSkgKiByZ2Jfc3RyaWRlKSk7IFwKLSAgY29uc3QgaW50IGRzdCA9ICh4KSArICh5KSAqIHBpY3R1cmUtPnV2X3N0cmlkZTsgICAgICAgIFwKLSAgY29uc3QgaW50IHIgPSBTVU0ocl9wdHIgKyBzcmMpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgaW50IGcgPSBTVU0oZ19wdHIgKyBzcmMpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgaW50IGIgPSBTVU0oYl9wdHIgKyBzcmMpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgcGljdHVyZS0+dVtkc3RdID0gVlA4UkdCVG9VKHIsIGcsIGIpOyAgICAgICAgICAgICAgICAgIFwKLSAgcGljdHVyZS0+dltkc3RdID0gVlA4UkdCVG9WKHIsIGcsIGIpOyAgICAgICAgICAgICAgICAgIFwKLX0KLQotI2RlZmluZSBSR0JfVE9fVVYwKHhfaW4sIHhfb3V0LCB5LCBTVU0pIHsgICAgICAgICAgICAgICAgXAotICBjb25zdCBpbnQgc3JjID0gKHN0ZXAgKiAoeF9pbikgKyAoeSkgKiByZ2Jfc3RyaWRlKTsgICAgXAotICBjb25zdCBpbnQgZHN0ID0gKHhfb3V0KSArICh5KSAqIHBpY3R1cmUtPnV2MF9zdHJpZGU7ICAgXAotICBjb25zdCBpbnQgciA9IFNVTShyX3B0ciArIHNyYyk7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCBpbnQgZyA9IFNVTShnX3B0ciArIHNyYyk7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCBpbnQgYiA9IFNVTShiX3B0ciArIHNyYyk7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICBwaWN0dXJlLT51MFtkc3RdID0gVlA4UkdCVG9VKHIsIGcsIGIpOyAgICAgICAgICAgICAgICAgXAotICBwaWN0dXJlLT52MFtkc3RdID0gVlA4UkdCVG9WKHIsIGcsIGIpOyAgICAgICAgICAgICAgICAgXAotfQotCi1zdGF0aWMgdm9pZCBNYWtlR3JheShXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSkgewotICBpbnQgeTsKLSAgY29uc3QgaW50IHV2X3dpZHRoID0gSEFMVkUocGljdHVyZS0+d2lkdGgpOwotICBjb25zdCBpbnQgdXZfaGVpZ2h0ID0gSEFMVkUocGljdHVyZS0+aGVpZ2h0KTsKLSAgZm9yICh5ID0gMDsgeSA8IHV2X2hlaWdodDsgKyt5KSB7Ci0gICAgU2JNZW1vcnlTZXQocGljdHVyZS0+dSArIHkgKiBwaWN0dXJlLT51dl9zdHJpZGUsIDEyOCwgdXZfd2lkdGgpOwotICAgIFNiTWVtb3J5U2V0KHBpY3R1cmUtPnYgKyB5ICogcGljdHVyZS0+dXZfc3RyaWRlLCAxMjgsIHV2X3dpZHRoKTsKLSAgfQotfQotCi1zdGF0aWMgaW50IEltcG9ydFlVVkFGcm9tUkdCQShjb25zdCB1aW50OF90KiBjb25zdCByX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGdfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgYl9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBhX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGVwLCAgICAgICAgIC8vIGJ5dGVzIHBlciBwaXhlbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJnYl9zdHJpZGUsICAgLy8gYnl0ZXMgcGVyIHNjYW5saW5lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSkgewotICBjb25zdCBXZWJQRW5jQ1NQIHV2X2NzcCA9IHBpY3R1cmUtPmNvbG9yc3BhY2UgJiBXRUJQX0NTUF9VVl9NQVNLOwotICBpbnQgeCwgeTsKLSAgY29uc3QgaW50IHdpZHRoID0gcGljdHVyZS0+d2lkdGg7Ci0gIGNvbnN0IGludCBoZWlnaHQgPSBwaWN0dXJlLT5oZWlnaHQ7Ci0gIGNvbnN0IGludCBoYXNfYWxwaGEgPSBDaGVja05vbk9wYXF1ZShhX3B0ciwgd2lkdGgsIGhlaWdodCwgc3RlcCwgcmdiX3N0cmlkZSk7Ci0KLSAgcGljdHVyZS0+Y29sb3JzcGFjZSA9IHV2X2NzcDsKLSAgcGljdHVyZS0+dXNlX2FyZ2IgPSAwOwotICBpZiAoaGFzX2FscGhhKSB7Ci0gICAgcGljdHVyZS0+Y29sb3JzcGFjZSB8PSBXRUJQX0NTUF9BTFBIQV9CSVQ7Ci0gIH0KLSAgaWYgKCFXZWJQUGljdHVyZUFsbG9jKHBpY3R1cmUpKSByZXR1cm4gMDsKLQotICAvLyBJbXBvcnQgbHVtYSBwbGFuZQotICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKLSAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7ICsreCkgewotICAgICAgY29uc3QgaW50IG9mZnNldCA9IHN0ZXAgKiB4ICsgeSAqIHJnYl9zdHJpZGU7Ci0gICAgICBwaWN0dXJlLT55W3ggKyB5ICogcGljdHVyZS0+eV9zdHJpZGVdID0KLSAgICAgICAgICBWUDhSR0JUb1kocl9wdHJbb2Zmc2V0XSwgZ19wdHJbb2Zmc2V0XSwgYl9wdHJbb2Zmc2V0XSk7Ci0gICAgfQotICB9Ci0KLSAgLy8gRG93bnNhbXBsZSBVL1YgcGxhbmUKLSAgaWYgKHV2X2NzcCAhPSBXRUJQX1lVVjQwMCkgewotICAgIGZvciAoeSA9IDA7IHkgPCAoaGVpZ2h0ID4+IDEpOyArK3kpIHsKLSAgICAgIGZvciAoeCA9IDA7IHggPCAod2lkdGggPj4gMSk7ICsreCkgewotICAgICAgICBSR0JfVE9fVVYoeCwgeSwgU1VNNCk7Ci0gICAgICB9Ci0gICAgICBpZiAod2lkdGggJiAxKSB7Ci0gICAgICAgIFJHQl9UT19VVih4LCB5LCBTVU0yVik7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChoZWlnaHQgJiAxKSB7Ci0gICAgICBmb3IgKHggPSAwOyB4IDwgKHdpZHRoID4+IDEpOyArK3gpIHsKLSAgICAgICAgUkdCX1RPX1VWKHgsIHksIFNVTTJIKTsKLSAgICAgIH0KLSAgICAgIGlmICh3aWR0aCAmIDEpIHsKLSAgICAgICAgUkdCX1RPX1VWKHgsIHksIFNVTTEpOwotICAgICAgfQotICAgIH0KLQotI2lmZGVmIFdFQlBfRVhQRVJJTUVOVEFMX0ZFQVRVUkVTCi0gICAgLy8gU3RvcmUgb3JpZ2luYWwgVS9WIHNhbXBsZXMgdG9vCi0gICAgaWYgKHV2X2NzcCA9PSBXRUJQX1lVVjQyMikgewotICAgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7Ci0gICAgICAgIGZvciAoeCA9IDA7IHggPCAod2lkdGggPj4gMSk7ICsreCkgewotICAgICAgICAgIFJHQl9UT19VVjAoMiAqIHgsIHgsIHksIFNVTTJIKTsKLSAgICAgICAgfQotICAgICAgICBpZiAod2lkdGggJiAxKSB7Ci0gICAgICAgICAgUkdCX1RPX1VWMCgyICogeCwgeCwgeSwgU1VNMSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHV2X2NzcCA9PSBXRUJQX1lVVjQ0NCkgewotICAgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7Ci0gICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7Ci0gICAgICAgICAgUkdCX1RPX1VWMCh4LCB4LCB5LCBTVU0xKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSNlbmRpZgotICB9IGVsc2UgewotICAgIE1ha2VHcmF5KHBpY3R1cmUpOwotICB9Ci0KLSAgaWYgKGhhc19hbHBoYSkgewotICAgIFNCX0RDSEVDSyhzdGVwID49IDQpOwotICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgewotICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKLSAgICAgICAgcGljdHVyZS0+YVt4ICsgeSAqIHBpY3R1cmUtPmFfc3RyaWRlXSA9Ci0gICAgICAgICAgICBhX3B0cltzdGVwICogeCArIHkgKiByZ2Jfc3RyaWRlXTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgSW1wb3J0KFdlYlBQaWN0dXJlKiBjb25zdCBwaWN0dXJlLAotICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgcmdiLCBpbnQgcmdiX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgIGludCBzdGVwLCBpbnQgc3dhcF9yYiwgaW50IGltcG9ydF9hbHBoYSkgewotICBjb25zdCB1aW50OF90KiBjb25zdCByX3B0ciA9IHJnYiArIChzd2FwX3JiID8gMiA6IDApOwotICBjb25zdCB1aW50OF90KiBjb25zdCBnX3B0ciA9IHJnYiArIDE7Ci0gIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGJfcHRyID0gcmdiICsgKHN3YXBfcmIgPyAwIDogMik7Ci0gIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGFfcHRyID0gaW1wb3J0X2FscGhhID8gcmdiICsgMyA6IE5VTEw7Ci0gIGNvbnN0IGludCB3aWR0aCA9IHBpY3R1cmUtPndpZHRoOwotICBjb25zdCBpbnQgaGVpZ2h0ID0gcGljdHVyZS0+aGVpZ2h0OwotCi0gIGlmICghcGljdHVyZS0+dXNlX2FyZ2IpIHsKLSAgICByZXR1cm4gSW1wb3J0WVVWQUZyb21SR0JBKHJfcHRyLCBnX3B0ciwgYl9wdHIsIGFfcHRyLCBzdGVwLCByZ2Jfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZSk7Ci0gIH0KLSAgaWYgKGltcG9ydF9hbHBoYSkgewotICAgIHBpY3R1cmUtPmNvbG9yc3BhY2UgfD0gV0VCUF9DU1BfQUxQSEFfQklUOwotICB9IGVsc2UgewotICAgIHBpY3R1cmUtPmNvbG9yc3BhY2UgJj0gfldFQlBfQ1NQX0FMUEhBX0JJVDsKLSAgfQotICBpZiAoIVdlYlBQaWN0dXJlQWxsb2MocGljdHVyZSkpIHJldHVybiAwOwotCi0gIGlmICghaW1wb3J0X2FscGhhKSB7Ci0gICAgaW50IHgsIHk7Ci0gICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7Ci0gICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7ICsreCkgewotICAgICAgICBjb25zdCBpbnQgb2Zmc2V0ID0gc3RlcCAqIHggKyB5ICogcmdiX3N0cmlkZTsKLSAgICAgICAgY29uc3QgdWludDMyX3QgYXJnYiA9Ci0gICAgICAgICAgICAweGZmMDAwMDAwdSB8Ci0gICAgICAgICAgICAocl9wdHJbb2Zmc2V0XSA8PCAxNikgfAotICAgICAgICAgICAgKGdfcHRyW29mZnNldF0gPDwgIDgpIHwKLSAgICAgICAgICAgIChiX3B0cltvZmZzZXRdKTsKLSAgICAgICAgcGljdHVyZS0+YXJnYlt4ICsgeSAqIHBpY3R1cmUtPmFyZ2Jfc3RyaWRlXSA9IGFyZ2I7Ci0gICAgICB9Ci0gICAgfQotICB9IGVsc2UgewotICAgIGludCB4LCB5OwotICAgIFNCX0RDSEVDSyhzdGVwID49IDQpOwotICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgewotICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKLSAgICAgICAgY29uc3QgaW50IG9mZnNldCA9IHN0ZXAgKiB4ICsgeSAqIHJnYl9zdHJpZGU7Ci0gICAgICAgIGNvbnN0IHVpbnQzMl90IGFyZ2IgPSAoKHVpbnQzMl90KWFfcHRyW29mZnNldF0gPDwgMjQpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyX3B0cltvZmZzZXRdIDw8IDE2KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ19wdHJbb2Zmc2V0XSA8PCAgOCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJfcHRyW29mZnNldF0pOwotICAgICAgICBwaWN0dXJlLT5hcmdiW3ggKyB5ICogcGljdHVyZS0+YXJnYl9zdHJpZGVdID0gYXJnYjsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0jdW5kZWYgU1VNNAotI3VuZGVmIFNVTTJWCi0jdW5kZWYgU1VNMkgKLSN1bmRlZiBTVU0xCi0jdW5kZWYgUkdCX1RPX1VWCi0KLWludCBXZWJQUGljdHVyZUltcG9ydFJHQihXZWJQUGljdHVyZSogcGljdHVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiByZ2IsIGludCByZ2Jfc3RyaWRlKSB7Ci0gIHJldHVybiBJbXBvcnQocGljdHVyZSwgcmdiLCByZ2Jfc3RyaWRlLCAzLCAwLCAwKTsKLX0KLQotaW50IFdlYlBQaWN0dXJlSW1wb3J0QkdSKFdlYlBQaWN0dXJlKiBwaWN0dXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHJnYiwgaW50IHJnYl9zdHJpZGUpIHsKLSAgcmV0dXJuIEltcG9ydChwaWN0dXJlLCByZ2IsIHJnYl9zdHJpZGUsIDMsIDEsIDApOwotfQotCi1pbnQgV2ViUFBpY3R1cmVJbXBvcnRSR0JBKFdlYlBQaWN0dXJlKiBwaWN0dXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiByZ2JhLCBpbnQgcmdiYV9zdHJpZGUpIHsKLSAgcmV0dXJuIEltcG9ydChwaWN0dXJlLCByZ2JhLCByZ2JhX3N0cmlkZSwgNCwgMCwgMSk7Ci19Ci0KLWludCBXZWJQUGljdHVyZUltcG9ydEJHUkEoV2ViUFBpY3R1cmUqIHBpY3R1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHJnYmEsIGludCByZ2JhX3N0cmlkZSkgewotICByZXR1cm4gSW1wb3J0KHBpY3R1cmUsIHJnYmEsIHJnYmFfc3RyaWRlLCA0LCAxLCAxKTsKLX0KLQotaW50IFdlYlBQaWN0dXJlSW1wb3J0UkdCWChXZWJQUGljdHVyZSogcGljdHVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcmdiYSwgaW50IHJnYmFfc3RyaWRlKSB7Ci0gIHJldHVybiBJbXBvcnQocGljdHVyZSwgcmdiYSwgcmdiYV9zdHJpZGUsIDQsIDAsIDApOwotfQotCi1pbnQgV2ViUFBpY3R1cmVJbXBvcnRCR1JYKFdlYlBQaWN0dXJlKiBwaWN0dXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiByZ2JhLCBpbnQgcmdiYV9zdHJpZGUpIHsKLSAgcmV0dXJuIEltcG9ydChwaWN0dXJlLCByZ2JhLCByZ2JhX3N0cmlkZSwgNCwgMSwgMCk7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBBdXRvbWF0aWMgWVVWIDwtPiBBUkdCIGNvbnZlcnNpb25zLgotCi1pbnQgV2ViUFBpY3R1cmVZVVZBVG9BUkdCKFdlYlBQaWN0dXJlKiBwaWN0dXJlKSB7Ci0gIGlmIChwaWN0dXJlID09IE5VTEwpIHJldHVybiAwOwotICBpZiAocGljdHVyZS0+bWVtb3J5XyA9PSBOVUxMIHx8IHBpY3R1cmUtPnkgPT0gTlVMTCB8fAotICAgICAgcGljdHVyZS0+dSA9PSBOVUxMIHx8IHBpY3R1cmUtPnYgPT0gTlVMTCkgewotICAgIHJldHVybiBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWN0dXJlLCBWUDhfRU5DX0VSUk9SX05VTExfUEFSQU1FVEVSKTsKLSAgfQotICBpZiAoKHBpY3R1cmUtPmNvbG9yc3BhY2UgJiBXRUJQX0NTUF9BTFBIQV9CSVQpICYmIHBpY3R1cmUtPmEgPT0gTlVMTCkgewotICAgIHJldHVybiBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWN0dXJlLCBWUDhfRU5DX0VSUk9SX05VTExfUEFSQU1FVEVSKTsKLSAgfQotICBpZiAoKHBpY3R1cmUtPmNvbG9yc3BhY2UgJiBXRUJQX0NTUF9VVl9NQVNLKSAhPSBXRUJQX1lVVjQyMCkgewotICAgIHJldHVybiBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWN0dXJlLCBWUDhfRU5DX0VSUk9SX0lOVkFMSURfQ09ORklHVVJBVElPTik7Ci0gIH0KLSAgLy8gQWxsb2NhdGUgYSBuZXcgYXJnYiBidWZmZXIgKGRpc2NhcmRpbmcgdGhlIHByZXZpb3VzIG9uZSkuCi0gIGlmICghUGljdHVyZUFsbG9jQVJHQihwaWN0dXJlKSkgcmV0dXJuIDA7Ci0KLSAgLy8gQ29udmVydAotICB7Ci0gICAgaW50IHk7Ci0gICAgY29uc3QgaW50IHdpZHRoID0gcGljdHVyZS0+d2lkdGg7Ci0gICAgY29uc3QgaW50IGhlaWdodCA9IHBpY3R1cmUtPmhlaWdodDsKLSAgICBjb25zdCBpbnQgYXJnYl9zdHJpZGUgPSA0ICogcGljdHVyZS0+YXJnYl9zdHJpZGU7Ci0gICAgdWludDhfdCogZHN0ID0gKHVpbnQ4X3QqKXBpY3R1cmUtPmFyZ2I7Ci0gICAgY29uc3QgdWludDhfdCAqY3VyX3UgPSBwaWN0dXJlLT51LCAqY3VyX3YgPSBwaWN0dXJlLT52LCAqY3VyX3kgPSBwaWN0dXJlLT55OwotICAgIFdlYlBVcHNhbXBsZUxpbmVQYWlyRnVuYyB1cHNhbXBsZSA9IFdlYlBHZXRMaW5lUGFpckNvbnZlcnRlcihBTFBIQV9JU19MQVNUKTsKLQotICAgIC8vIEZpcnN0IHJvdywgd2l0aCByZXBsaWNhdGVkIHRvcCBzYW1wbGVzLgotICAgIHVwc2FtcGxlKE5VTEwsIGN1cl95LCBjdXJfdSwgY3VyX3YsIGN1cl91LCBjdXJfdiwgTlVMTCwgZHN0LCB3aWR0aCk7Ci0gICAgY3VyX3kgKz0gcGljdHVyZS0+eV9zdHJpZGU7Ci0gICAgZHN0ICs9IGFyZ2Jfc3RyaWRlOwotICAgIC8vIENlbnRlciByb3dzLgotICAgIGZvciAoeSA9IDE7IHkgKyAxIDwgaGVpZ2h0OyB5ICs9IDIpIHsKLSAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHRvcF91ID0gY3VyX3U7Ci0gICAgICBjb25zdCB1aW50OF90KiBjb25zdCB0b3BfdiA9IGN1cl92OwotICAgICAgY3VyX3UgKz0gcGljdHVyZS0+dXZfc3RyaWRlOwotICAgICAgY3VyX3YgKz0gcGljdHVyZS0+dXZfc3RyaWRlOwotICAgICAgdXBzYW1wbGUoY3VyX3ksIGN1cl95ICsgcGljdHVyZS0+eV9zdHJpZGUsIHRvcF91LCB0b3BfdiwgY3VyX3UsIGN1cl92LAotICAgICAgICAgICAgICAgZHN0LCBkc3QgKyBhcmdiX3N0cmlkZSwgd2lkdGgpOwotICAgICAgY3VyX3kgKz0gMiAqIHBpY3R1cmUtPnlfc3RyaWRlOwotICAgICAgZHN0ICs9IDIgKiBhcmdiX3N0cmlkZTsKLSAgICB9Ci0gICAgLy8gTGFzdCByb3cgKGlmIG5lZWRlZCksIHdpdGggcmVwbGljYXRlZCBib3R0b20gc2FtcGxlcy4KLSAgICBpZiAoaGVpZ2h0ID4gMSAmJiAhKGhlaWdodCAmIDEpKSB7Ci0gICAgICB1cHNhbXBsZShjdXJfeSwgTlVMTCwgY3VyX3UsIGN1cl92LCBjdXJfdSwgY3VyX3YsIGRzdCwgTlVMTCwgd2lkdGgpOwotICAgIH0KLSAgICAvLyBJbnNlcnQgYWxwaGEgdmFsdWVzIGlmIG5lZWRlZCwgaW4gcmVwbGFjZW1lbnQgZm9yIHRoZSBkZWZhdWx0IDB4ZmYgb25lcy4KLSAgICBpZiAocGljdHVyZS0+Y29sb3JzcGFjZSAmIFdFQlBfQ1NQX0FMUEhBX0JJVCkgewotICAgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7Ci0gICAgICAgIHVpbnQzMl90KiBjb25zdCBhcmdiX2RzdCA9IHBpY3R1cmUtPmFyZ2IgKyB5ICogcGljdHVyZS0+YXJnYl9zdHJpZGU7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHNyYyA9IHBpY3R1cmUtPmEgKyB5ICogcGljdHVyZS0+YV9zdHJpZGU7Ci0gICAgICAgIGludCB4OwotICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7ICsreCkgewotICAgICAgICAgIGFyZ2JfZHN0W3hdID0gKGFyZ2JfZHN0W3hdICYgMHgwMGZmZmZmZnUpIHwgKCh1aW50MzJfdClzcmNbeF0gPDwgMjQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiAxOwotfQotCi1pbnQgV2ViUFBpY3R1cmVBUkdCVG9ZVVZBKFdlYlBQaWN0dXJlKiBwaWN0dXJlLCBXZWJQRW5jQ1NQIGNvbG9yc3BhY2UpIHsKLSAgaWYgKHBpY3R1cmUgPT0gTlVMTCkgcmV0dXJuIDA7Ci0gIGlmIChwaWN0dXJlLT5hcmdiID09IE5VTEwpIHsKLSAgICByZXR1cm4gV2ViUEVuY29kaW5nU2V0RXJyb3IocGljdHVyZSwgVlA4X0VOQ19FUlJPUl9OVUxMX1BBUkFNRVRFUik7Ci0gIH0gZWxzZSB7Ci0gICAgY29uc3QgdWludDhfdCogY29uc3QgYXJnYiA9IChjb25zdCB1aW50OF90KilwaWN0dXJlLT5hcmdiOwotICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHIgPSBBTFBIQV9JU19MQVNUID8gYXJnYiArIDIgOiBhcmdiICsgMTsKLSAgICBjb25zdCB1aW50OF90KiBjb25zdCBnID0gQUxQSEFfSVNfTEFTVCA/IGFyZ2IgKyAxIDogYXJnYiArIDI7Ci0gICAgY29uc3QgdWludDhfdCogY29uc3QgYiA9IEFMUEhBX0lTX0xBU1QgPyBhcmdiICsgMCA6IGFyZ2IgKyAzOwotICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGEgPSBBTFBIQV9JU19MQVNUID8gYXJnYiArIDMgOiBhcmdiICsgMDsKLSAgICAvLyBXZSB3b3JrIG9uIGEgdG1wIGNvcHkgb2YgJ3BpY3R1cmUnLCBiZWNhdXNlIEltcG9ydFlVVkFGcm9tUkdCQSgpCi0gICAgLy8gd291bGQgYmUgY2FsbGluZyBXZWJQUGljdHVyZUZyZWUocGljdHVyZSkgb3RoZXJ3aXNlLgotICAgIFdlYlBQaWN0dXJlIHRtcCA9ICpwaWN0dXJlOwotICAgIFBpY3R1cmVSZXNldEFSR0IoJnRtcCk7ICAvLyByZXNldCBBUkdCIGJ1ZmZlciBzbyB0aGF0IGl0J3Mgbm90IFNiTWVtb3J5RGVhbGxvY2F0ZSgpJ2QuCi0gICAgdG1wLnVzZV9hcmdiID0gMDsKLSAgICB0bXAuY29sb3JzcGFjZSA9IGNvbG9yc3BhY2UgJiBXRUJQX0NTUF9VVl9NQVNLOwotICAgIGlmICghSW1wb3J0WVVWQUZyb21SR0JBKHIsIGcsIGIsIGEsIDQsIDQgKiBwaWN0dXJlLT5hcmdiX3N0cmlkZSwgJnRtcCkpIHsKLSAgICAgIHJldHVybiBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWN0dXJlLCBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlkpOwotICAgIH0KLSAgICAvLyBDb3B5IGJhY2sgdGhlIFlVViBzcGVjcyBpbnRvICdwaWN0dXJlJy4KLSAgICB0bXAuYXJnYiA9IHBpY3R1cmUtPmFyZ2I7Ci0gICAgdG1wLmFyZ2Jfc3RyaWRlID0gcGljdHVyZS0+YXJnYl9zdHJpZGU7Ci0gICAgdG1wLm1lbW9yeV9hcmdiXyA9IHBpY3R1cmUtPm1lbW9yeV9hcmdiXzsKLSAgICAqcGljdHVyZSA9IHRtcDsKLSAgfQotICByZXR1cm4gMTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEhlbHBlcjogY2xlYW4gdXAgZnVsbHkgdHJhbnNwYXJlbnQgYXJlYSB0byBoZWxwIGNvbXByZXNzaWJpbGl0eS4KLQotI2RlZmluZSBTSVpFIDgKLSNkZWZpbmUgU0laRTIgKFNJWkUgLyAyKQotc3RhdGljIGludCBpc190cmFuc3BhcmVudF9hcmVhKGNvbnN0IHVpbnQ4X3QqIHB0ciwgaW50IHN0cmlkZSwgaW50IHNpemUpIHsKLSAgaW50IHksIHg7Ci0gIGZvciAoeSA9IDA7IHkgPCBzaXplOyArK3kpIHsKLSAgICBmb3IgKHggPSAwOyB4IDwgc2l6ZTsgKyt4KSB7Ci0gICAgICBpZiAocHRyW3hdKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgICAgfQotICAgIH0KLSAgICBwdHIgKz0gc3RyaWRlOwotICB9Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBmbGF0dGVuKHVpbnQ4X3QqIHB0ciwgaW50IHYsIGludCBzdHJpZGUsIGludCBzaXplKSB7Ci0gIGludCB5OwotICBmb3IgKHkgPSAwOyB5IDwgc2l6ZTsgKyt5KSB7Ci0gICAgU2JNZW1vcnlTZXQocHRyLCB2LCBzaXplKTsKLSAgICBwdHIgKz0gc3RyaWRlOwotICB9Ci19Ci0KLXZvaWQgV2ViUENsZWFudXBUcmFuc3BhcmVudEFyZWEoV2ViUFBpY3R1cmUqIHBpYykgewotICBpbnQgeCwgeSwgdywgaDsKLSAgY29uc3QgdWludDhfdCogYV9wdHI7Ci0gIGludCB2YWx1ZXNbM10gPSB7IDAgfTsKLQotICBpZiAocGljID09IE5VTEwpIHJldHVybjsKLQotICBhX3B0ciA9IHBpYy0+YTsKLSAgaWYgKGFfcHRyID09IE5VTEwpIHJldHVybjsgICAgLy8gbm90aGluZyB0byBkbwotCi0gIHcgPSBwaWMtPndpZHRoIC8gU0laRTsKLSAgaCA9IHBpYy0+aGVpZ2h0IC8gU0laRTsKLSAgZm9yICh5ID0gMDsgeSA8IGg7ICsreSkgewotICAgIGludCBuZWVkX3Jlc2V0ID0gMTsKLSAgICBmb3IgKHggPSAwOyB4IDwgdzsgKyt4KSB7Ci0gICAgICBjb25zdCBpbnQgb2ZmX2EgPSAoeSAqIHBpYy0+YV9zdHJpZGUgKyB4KSAqIFNJWkU7Ci0gICAgICBjb25zdCBpbnQgb2ZmX3kgPSAoeSAqIHBpYy0+eV9zdHJpZGUgKyB4KSAqIFNJWkU7Ci0gICAgICBjb25zdCBpbnQgb2ZmX3V2ID0gKHkgKiBwaWMtPnV2X3N0cmlkZSArIHgpICogU0laRTI7Ci0gICAgICBpZiAoaXNfdHJhbnNwYXJlbnRfYXJlYShhX3B0ciArIG9mZl9hLCBwaWMtPmFfc3RyaWRlLCBTSVpFKSkgewotICAgICAgICBpZiAobmVlZF9yZXNldCkgewotICAgICAgICAgIHZhbHVlc1swXSA9IHBpYy0+eVtvZmZfeV07Ci0gICAgICAgICAgdmFsdWVzWzFdID0gcGljLT51W29mZl91dl07Ci0gICAgICAgICAgdmFsdWVzWzJdID0gcGljLT52W29mZl91dl07Ci0gICAgICAgICAgbmVlZF9yZXNldCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZmxhdHRlbihwaWMtPnkgKyBvZmZfeSwgdmFsdWVzWzBdLCBwaWMtPnlfc3RyaWRlLCBTSVpFKTsKLSAgICAgICAgZmxhdHRlbihwaWMtPnUgKyBvZmZfdXYsIHZhbHVlc1sxXSwgcGljLT51dl9zdHJpZGUsIFNJWkUyKTsKLSAgICAgICAgZmxhdHRlbihwaWMtPnYgKyBvZmZfdXYsIHZhbHVlc1syXSwgcGljLT51dl9zdHJpZGUsIFNJWkUyKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG5lZWRfcmVzZXQgPSAxOwotICAgICAgfQotICAgIH0KLSAgICAvLyBpZ25vcmUgdGhlIGxlZnQtb3ZlcnMgb24gcmlnaHQvYm90dG9tCi0gIH0KLX0KLQotI3VuZGVmIFNJWkUKLSN1bmRlZiBTSVpFMgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gbG9jYWwtbWluIGRpc3RvcnRpb24KLS8vCi0vLyBGb3IgZXZlcnkgcGl4ZWwgaW4gdGhlICpyZWZlcmVuY2UqIHBpY3R1cmUsIHdlIHNlYXJjaCBmb3IgdGhlIGxvY2FsIGJlc3QKLS8vIG1hdGNoIGluIHRoZSBjb21wcmVzc2VkIGltYWdlLiBUaGlzIGlzIG5vdCBhIHN5bW1ldHJpY2FsIG1lYXN1cmUuCi0KLS8vIHNlYXJjaCByYWRpdXMuIFNob3VsZG4ndCBiZSB0b28gbGFyZ2UuCi0jZGVmaW5lIFJBRElVUyAyCi0KLXN0YXRpYyBmbG9hdCBBY2N1bXVsYXRlTFNJTShjb25zdCB1aW50OF90KiBzcmMsIGludCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHJlZiwgaW50IHJlZl9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKSB7Ci0gIGludCB4LCB5OwotICBkb3VibGUgdG90YWxfc3NlID0gMC47Ci0gIGZvciAoeSA9IDA7IHkgPCBoOyArK3kpIHsKLSAgICBjb25zdCBpbnQgeV8wID0gKHkgLSBSQURJVVMgPCAwKSA/IDAgOiB5IC0gUkFESVVTOwotICAgIGNvbnN0IGludCB5XzEgPSAoeSArIFJBRElVUyArIDEgPj0gaCkgPyBoIDogeSArIFJBRElVUyArIDE7Ci0gICAgZm9yICh4ID0gMDsgeCA8IHc7ICsreCkgewotICAgICAgY29uc3QgaW50IHhfMCA9ICh4IC0gUkFESVVTIDwgMCkgPyAwIDogeCAtIFJBRElVUzsKLSAgICAgIGNvbnN0IGludCB4XzEgPSAoeCArIFJBRElVUyArIDEgPj0gdykgPyB3IDogeCArIFJBRElVUyArIDE7Ci0gICAgICBkb3VibGUgYmVzdF9zc2UgPSAyNTUuICogMjU1LjsKLSAgICAgIGNvbnN0IGRvdWJsZSB2YWx1ZSA9IChkb3VibGUpcmVmW3kgKiByZWZfc3RyaWRlICsgeF07Ci0gICAgICBpbnQgaSwgajsKLSAgICAgIGZvciAoaiA9IHlfMDsgaiA8IHlfMTsgKytqKSB7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QqIHMgPSBzcmMgKyBqICogc3JjX3N0cmlkZTsKLSAgICAgICAgZm9yIChpID0geF8wOyBpIDwgeF8xOyArK2kpIHsKLSAgICAgICAgICBjb25zdCBkb3VibGUgc3NlID0gKGRvdWJsZSkoc1tpXSAtIHZhbHVlKSAqIChzW2ldIC0gdmFsdWUpOwotICAgICAgICAgIGlmIChzc2UgPCBiZXN0X3NzZSkgYmVzdF9zc2UgPSBzc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHRvdGFsX3NzZSArPSBiZXN0X3NzZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIChmbG9hdCl0b3RhbF9zc2U7Ci19Ci0jdW5kZWYgUkFESVVTCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBEaXN0b3J0aW9uCi0KLS8vIE1heCB2YWx1ZSByZXR1cm5lZCBpbiBjYXNlIG9mIGV4YWN0IHNpbWlsYXJpdHkuCi1zdGF0aWMgY29uc3QgZG91YmxlIGtNaW5EaXN0b3J0aW9uX2RCID0gOTkuOwotc3RhdGljIGZsb2F0IEdldFBTTlIoY29uc3QgZG91YmxlIHYpIHsKLSAgcmV0dXJuIChmbG9hdCkoKHYgPiAwLikgPyAtNC4zNDI5NDQ4ICogbG9nKHYgLyAoMjU1ICogMjU1LikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDoga01pbkRpc3RvcnRpb25fZEIpOwotfQotCi1pbnQgV2ViUFBpY3R1cmVEaXN0b3J0aW9uKGNvbnN0IFdlYlBQaWN0dXJlKiBzcmMsIGNvbnN0IFdlYlBQaWN0dXJlKiByZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlLCBmbG9hdCByZXN1bHRbNV0pIHsKLSAgRGlzdG9TdGF0cyBzdGF0c1s1XTsKLSAgaW50IGhhc19hbHBoYTsKLSAgaW50IHV2X3csIHV2X2g7Ci0KLSAgaWYgKHNyYyA9PSBOVUxMIHx8IHJlZiA9PSBOVUxMIHx8Ci0gICAgICBzcmMtPndpZHRoICE9IHJlZi0+d2lkdGggfHwgc3JjLT5oZWlnaHQgIT0gcmVmLT5oZWlnaHQgfHwKLSAgICAgIHNyYy0+eSA9PSBOVUxMIHx8IHJlZi0+eSA9PSBOVUxMIHx8Ci0gICAgICBzcmMtPnUgPT0gTlVMTCB8fCByZWYtPnUgPT0gTlVMTCB8fAotICAgICAgc3JjLT52ID09IE5VTEwgfHwgcmVmLT52ID09IE5VTEwgfHwKLSAgICAgIHJlc3VsdCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgLy8gVE9ETyhza2FsKTogcHJvdmlkZSBkaXN0b3J0aW9uIGZvciBBUkdCIHRvby4KLSAgaWYgKHNyYy0+dXNlX2FyZ2IgPT0gMSB8fCBzcmMtPnVzZV9hcmdiICE9IHJlZi0+dXNlX2FyZ2IpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGhhc19hbHBoYSA9ICEhKHNyYy0+Y29sb3JzcGFjZSAmIFdFQlBfQ1NQX0FMUEhBX0JJVCk7Ci0gIGlmIChoYXNfYWxwaGEgIT0gISEocmVmLT5jb2xvcnNwYWNlICYgV0VCUF9DU1BfQUxQSEFfQklUKSB8fAotICAgICAgKGhhc19hbHBoYSAmJiAoc3JjLT5hID09IE5VTEwgfHwgcmVmLT5hID09IE5VTEwpKSkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgU2JNZW1vcnlTZXQoc3RhdHMsIDAsIHNpemVvZihzdGF0cykpOwotCi0gIHV2X3cgPSBIQUxWRShzcmMtPndpZHRoKTsKLSAgdXZfaCA9IEhBTFZFKHNyYy0+aGVpZ2h0KTsKLSAgaWYgKHR5cGUgPj0gMikgewotICAgIGZsb2F0IHNzZVs0XTsKLSAgICBzc2VbMF0gPSBBY2N1bXVsYXRlTFNJTShzcmMtPnksIHNyYy0+eV9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmLT55LCByZWYtPnlfc3RyaWRlLCBzcmMtPndpZHRoLCBzcmMtPmhlaWdodCk7Ci0gICAgc3NlWzFdID0gQWNjdW11bGF0ZUxTSU0oc3JjLT51LCBzcmMtPnV2X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWYtPnUsIHJlZi0+dXZfc3RyaWRlLCB1dl93LCB1dl9oKTsKLSAgICBzc2VbMl0gPSBBY2N1bXVsYXRlTFNJTShzcmMtPnYsIHNyYy0+dXZfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZi0+diwgcmVmLT51dl9zdHJpZGUsIHV2X3csIHV2X2gpOwotICAgIHNzZVszXSA9IGhhc19hbHBoYSA/IEFjY3VtdWxhdGVMU0lNKHNyYy0+YSwgc3JjLT5hX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWYtPmEsIHJlZi0+YV9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLT53aWR0aCwgc3JjLT5oZWlnaHQpCi0gICAgICAgICAgICAgICAgICAgICAgIDogMC5mOwotICAgIHJlc3VsdFswXSA9IEdldFBTTlIoc3NlWzBdIC8gKHNyYy0+d2lkdGggKiBzcmMtPmhlaWdodCkpOwotICAgIHJlc3VsdFsxXSA9IEdldFBTTlIoc3NlWzFdIC8gKHV2X3cgKiB1dl9oKSk7Ci0gICAgcmVzdWx0WzJdID0gR2V0UFNOUihzc2VbMl0gLyAodXZfdyAqIHV2X2gpKTsKLSAgICByZXN1bHRbM10gPSBHZXRQU05SKHNzZVszXSAvIChzcmMtPndpZHRoICogc3JjLT5oZWlnaHQpKTsKLSAgICB7Ci0gICAgICBkb3VibGUgdG90YWxfc3NlID0gc3NlWzBdICsgc3NlWzFdICsgc3NlWzJdOwotICAgICAgaW50IHRvdGFsX3BpeGVscyA9IHNyYy0+d2lkdGggKiBzcmMtPmhlaWdodCArIDIgKiB1dl93ICogdXZfaDsKLSAgICAgIGlmIChoYXNfYWxwaGEpIHsKLSAgICAgICAgdG90YWxfcGl4ZWxzICs9IHNyYy0+d2lkdGggKiBzcmMtPmhlaWdodDsKLSAgICAgICAgdG90YWxfc3NlICs9IHNzZVszXTsKLSAgICAgIH0KLSAgICAgIHJlc3VsdFs0XSA9IEdldFBTTlIodG90YWxfc3NlIC8gdG90YWxfcGl4ZWxzKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaW50IGM7Ci0gICAgVlA4U1NJTUFjY3VtdWxhdGVQbGFuZShzcmMtPnksIHNyYy0+eV9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZWYtPnksIHJlZi0+eV9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMtPndpZHRoLCBzcmMtPmhlaWdodCwgJnN0YXRzWzBdKTsKLSAgICBWUDhTU0lNQWNjdW11bGF0ZVBsYW5lKHNyYy0+dSwgc3JjLT51dl9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZWYtPnUsIHJlZi0+dXZfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdXZfdywgdXZfaCwgJnN0YXRzWzFdKTsKLSAgICBWUDhTU0lNQWNjdW11bGF0ZVBsYW5lKHNyYy0+diwgc3JjLT51dl9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZWYtPnYsIHJlZi0+dXZfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdXZfdywgdXZfaCwgJnN0YXRzWzJdKTsKLSAgICBpZiAoaGFzX2FscGhhKSB7Ci0gICAgICBWUDhTU0lNQWNjdW11bGF0ZVBsYW5lKHNyYy0+YSwgc3JjLT5hX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmLT5hLCByZWYtPmFfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMtPndpZHRoLCBzcmMtPmhlaWdodCwgJnN0YXRzWzNdKTsKLSAgICB9Ci0gICAgZm9yIChjID0gMDsgYyA8PSA0OyArK2MpIHsKLSAgICAgIGlmICh0eXBlID09IDEpIHsKLSAgICAgICAgY29uc3QgZG91YmxlIHYgPSBWUDhTU0lNR2V0KCZzdGF0c1tjXSk7Ci0gICAgICAgIHJlc3VsdFtjXSA9IChmbG9hdCkoKHYgPCAxLikgPyAtMTAuMCAqIGxvZzEwKDEuIC0gdikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGtNaW5EaXN0b3J0aW9uX2RCKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvbnN0IGRvdWJsZSB2ID0gVlA4U1NJTUdldFNxdWFyZWRFcnJvcigmc3RhdHNbY10pOwotICAgICAgICByZXN1bHRbY10gPSBHZXRQU05SKHYpOwotICAgICAgfQotICAgICAgLy8gQWNjdW11bGF0ZSBmb3J3YXJkCi0gICAgICBpZiAoYyA8IDQpIFZQOFNTSU1BZGRTdGF0cygmc3RhdHNbY10sICZzdGF0c1s0XSk7Ci0gICAgfQotICB9Ci0gIHJldHVybiAxOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gU2ltcGxlc3QgaGlnaC1sZXZlbCBjYWxsczoKLQotdHlwZWRlZiBpbnQgKCpJbXBvcnRlcikoV2ViUFBpY3R1cmUqIGNvbnN0LCBjb25zdCB1aW50OF90KiBjb25zdCwgaW50KTsKLQotc3RhdGljIHNpemVfdCBFbmNvZGUoY29uc3QgdWludDhfdCogcmdiYSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgSW1wb3J0ZXIgaW1wb3J0LCBmbG9hdCBxdWFsaXR5X2ZhY3RvciwgaW50IGxvc3NsZXNzLAotICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIG91dHB1dCkgewotICBXZWJQUGljdHVyZSBwaWM7Ci0gIFdlYlBDb25maWcgY29uZmlnOwotICBXZWJQTWVtb3J5V3JpdGVyIHdydDsKLSAgaW50IG9rOwotCi0gIGlmICghV2ViUENvbmZpZ1ByZXNldCgmY29uZmlnLCBXRUJQX1BSRVNFVF9ERUZBVUxULCBxdWFsaXR5X2ZhY3RvcikgfHwKLSAgICAgICFXZWJQUGljdHVyZUluaXQoJnBpYykpIHsKLSAgICByZXR1cm4gMDsgIC8vIHNob3VsZG4ndCBoYXBwZW4sIGV4Y2VwdCBpZiBzeXN0ZW0gaW5zdGFsbGF0aW9uIGlzIGJyb2tlbgotICB9Ci0KLSAgY29uZmlnLmxvc3NsZXNzID0gISFsb3NzbGVzczsKLSAgcGljLnVzZV9hcmdiID0gISFsb3NzbGVzczsKLSAgcGljLndpZHRoID0gd2lkdGg7Ci0gIHBpYy5oZWlnaHQgPSBoZWlnaHQ7Ci0gIHBpYy53cml0ZXIgPSBXZWJQTWVtb3J5V3JpdGU7Ci0gIHBpYy5jdXN0b21fcHRyID0gJndydDsKLSAgV2ViUE1lbW9yeVdyaXRlckluaXQoJndydCk7Ci0KLSAgb2sgPSBpbXBvcnQoJnBpYywgcmdiYSwgc3RyaWRlKSAmJiBXZWJQRW5jb2RlKCZjb25maWcsICZwaWMpOwotICBXZWJQUGljdHVyZUZyZWUoJnBpYyk7Ci0gIGlmICghb2spIHsKLSAgICBTYk1lbW9yeURlYWxsb2NhdGUod3J0Lm1lbSk7Ci0gICAgKm91dHB1dCA9IE5VTEw7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgKm91dHB1dCA9IHdydC5tZW07Ci0gIHJldHVybiB3cnQuc2l6ZTsKLX0KLQotI2RlZmluZSBFTkNPREVfRlVOQyhOQU1FLCBJTVBPUlRFUikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotc2l6ZV90IE5BTUUoY29uc3QgdWludDhfdCogaW4sIGludCB3LCBpbnQgaCwgaW50IGJwcywgZmxvYXQgcSwgICAgICAgICAgXAotICAgICAgICAgICAgdWludDhfdCoqIG91dCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICByZXR1cm4gRW5jb2RlKGluLCB3LCBoLCBicHMsIElNUE9SVEVSLCBxLCAwLCBvdXQpOyAgICAgICAgICAgICAgICAgICAgXAotfQotCi1FTkNPREVfRlVOQyhXZWJQRW5jb2RlUkdCLCBXZWJQUGljdHVyZUltcG9ydFJHQik7Ci1FTkNPREVfRlVOQyhXZWJQRW5jb2RlQkdSLCBXZWJQUGljdHVyZUltcG9ydEJHUik7Ci1FTkNPREVfRlVOQyhXZWJQRW5jb2RlUkdCQSwgV2ViUFBpY3R1cmVJbXBvcnRSR0JBKTsKLUVOQ09ERV9GVU5DKFdlYlBFbmNvZGVCR1JBLCBXZWJQUGljdHVyZUltcG9ydEJHUkEpOwotCi0jdW5kZWYgRU5DT0RFX0ZVTkMKLQotI2RlZmluZSBMT1NTTEVTU19ERUZBVUxUX1FVQUxJVFkgNzAuCi0jZGVmaW5lIExPU1NMRVNTX0VOQ09ERV9GVU5DKE5BTUUsIElNUE9SVEVSKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXNpemVfdCBOQU1FKGNvbnN0IHVpbnQ4X3QqIGluLCBpbnQgdywgaW50IGgsIGludCBicHMsIHVpbnQ4X3QqKiBvdXQpIHsgICAgICAgXAotICByZXR1cm4gRW5jb2RlKGluLCB3LCBoLCBicHMsIElNUE9SVEVSLCBMT1NTTEVTU19ERUZBVUxUX1FVQUxJVFksIDEsIG91dCk7ICBcCi19Ci0KLUxPU1NMRVNTX0VOQ09ERV9GVU5DKFdlYlBFbmNvZGVMb3NzbGVzc1JHQiwgV2ViUFBpY3R1cmVJbXBvcnRSR0IpOwotTE9TU0xFU1NfRU5DT0RFX0ZVTkMoV2ViUEVuY29kZUxvc3NsZXNzQkdSLCBXZWJQUGljdHVyZUltcG9ydEJHUik7Ci1MT1NTTEVTU19FTkNPREVfRlVOQyhXZWJQRW5jb2RlTG9zc2xlc3NSR0JBLCBXZWJQUGljdHVyZUltcG9ydFJHQkEpOwotTE9TU0xFU1NfRU5DT0RFX0ZVTkMoV2ViUEVuY29kZUxvc3NsZXNzQkdSQSwgV2ViUFBpY3R1cmVJbXBvcnRCR1JBKTsKLQotI3VuZGVmIExPU1NMRVNTX0VOQ09ERV9GVU5DCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL3F1YW50LmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvcXVhbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZhYjBiNi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvcXVhbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNTcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vICAgUXVhbnRpemF0aW9uCi0vLwotLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKLQotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCi0jZWxzZQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPG1hdGguaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiLi92cDhlbmNpLmgiCi0jaW5jbHVkZSAiLi9jb3N0LmgiCi0KLSNkZWZpbmUgRE9fVFJFTExJU19JNCAgMQotI2RlZmluZSBET19UUkVMTElTX0kxNiAxICAgLy8gbm90IGEgaHVnZSBnYWluLCBidXQgb2sgYXQgbG93IGJpdHJhdGUuCi0jZGVmaW5lIERPX1RSRUxMSVNfVVYgIDAgICAvLyBkaXNhYmxlIHRyZWxsaXMgZm9yIFVWLiBSaXNreS4gTm90IHdvcnRoLgotI2RlZmluZSBVU0VfVERJU1RPIDEKLQotI2RlZmluZSBNSURfQUxQSEEgNjQgICAgICAvLyBuZXV0cmFsIHZhbHVlIGZvciBzdXNjZXB0aWJpbGl0eQotI2RlZmluZSBNSU5fQUxQSEEgMzAgICAgICAvLyBsb3dlc3QgdXNhYmxlIHZhbHVlIGZvciBzdXNjZXB0aWJpbGl0eQotI2RlZmluZSBNQVhfQUxQSEEgMTAwICAgICAvLyBoaWdoZXIgbWVhbmluZnVsIHZhbHVlIGZvciBzdXNjZXB0aWJpbGl0eQotCi0jZGVmaW5lIFNOU19UT19EUSAwLjkgICAgIC8vIFNjYWxpbmcgY29uc3RhbnQgYmV0d2VlbiB0aGUgc25zIHZhbHVlIGFuZCB0aGUgUVAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG93ZXItbGF3IG1vZHVsYXRpb24uIE11c3QgYmUgc3RyaWN0bHkgbGVzcyB0aGFuIDEuCi0KLSNkZWZpbmUgSTRfUEVOQUxUWSA0MDAwICAgLy8gUmF0ZS1wZW5hbHR5IGZvciBxdWljayBpNC9pMTYgZGVjaXNpb24KLQotI2RlZmluZSBNVUxUXzhCKGEsIGIpICgoKGEpICogKGIpICsgMTI4KSA+PiA4KQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIFdFQlBfSU5MSU5FIGludCBjbGlwKGludCB2LCBpbnQgbSwgaW50IE0pIHsKLSAgcmV0dXJuIHYgPCBtID8gbSA6IHYgPiBNID8gTSA6IHY7Ci19Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IGtaaWd6YWdbMTZdID0gewotICAwLCAxLCA0LCA4LCA1LCAyLCAzLCA2LCA5LCAxMiwgMTMsIDEwLCA3LCAxMSwgMTQsIDE1Ci19OwotCi1zdGF0aWMgY29uc3QgdWludDhfdCBrRGNUYWJsZVsxMjhdID0gewotICA0LCAgICAgNSwgICA2LCAgIDcsICAgOCwgICA5LCAgMTAsICAxMCwKLSAgMTEsICAgMTIsICAxMywgIDE0LCAgMTUsICAxNiwgIDE3LCAgMTcsCi0gIDE4LCAgIDE5LCAgMjAsICAyMCwgIDIxLCAgMjEsICAyMiwgIDIyLAotICAyMywgICAyMywgIDI0LCAgMjUsICAyNSwgIDI2LCAgMjcsICAyOCwKLSAgMjksICAgMzAsICAzMSwgIDMyLCAgMzMsICAzNCwgIDM1LCAgMzYsCi0gIDM3LCAgIDM3LCAgMzgsICAzOSwgIDQwLCAgNDEsICA0MiwgIDQzLAotICA0NCwgICA0NSwgIDQ2LCAgNDYsICA0NywgIDQ4LCAgNDksICA1MCwKLSAgNTEsICAgNTIsICA1MywgIDU0LCAgNTUsICA1NiwgIDU3LCAgNTgsCi0gIDU5LCAgIDYwLCAgNjEsICA2MiwgIDYzLCAgNjQsICA2NSwgIDY2LAotICA2NywgICA2OCwgIDY5LCAgNzAsICA3MSwgIDcyLCAgNzMsICA3NCwKLSAgNzUsICAgNzYsICA3NiwgIDc3LCAgNzgsICA3OSwgIDgwLCAgODEsCi0gIDgyLCAgIDgzLCAgODQsICA4NSwgIDg2LCAgODcsICA4OCwgIDg5LAotICA5MSwgICA5MywgIDk1LCAgOTYsICA5OCwgMTAwLCAxMDEsIDEwMiwKLSAgMTA0LCAxMDYsIDEwOCwgMTEwLCAxMTIsIDExNCwgMTE2LCAxMTgsCi0gIDEyMiwgMTI0LCAxMjYsIDEyOCwgMTMwLCAxMzIsIDEzNCwgMTM2LAotICAxMzgsIDE0MCwgMTQzLCAxNDUsIDE0OCwgMTUxLCAxNTQsIDE1NwotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQxNl90IGtBY1RhYmxlWzEyOF0gPSB7Ci0gIDQsICAgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAxMCwgIDExLAotICAxMiwgICAxMywgIDE0LCAgMTUsICAxNiwgIDE3LCAgMTgsICAxOSwKLSAgMjAsICAgMjEsICAyMiwgIDIzLCAgMjQsICAyNSwgIDI2LCAgMjcsCi0gIDI4LCAgIDI5LCAgMzAsICAzMSwgIDMyLCAgMzMsICAzNCwgIDM1LAotICAzNiwgICAzNywgIDM4LCAgMzksICA0MCwgIDQxLCAgNDIsICA0MywKLSAgNDQsICAgNDUsICA0NiwgIDQ3LCAgNDgsICA0OSwgIDUwLCAgNTEsCi0gIDUyLCAgIDUzLCAgNTQsICA1NSwgIDU2LCAgNTcsICA1OCwgIDYwLAotICA2MiwgICA2NCwgIDY2LCAgNjgsICA3MCwgIDcyLCAgNzQsICA3NiwKLSAgNzgsICAgODAsICA4MiwgIDg0LCAgODYsICA4OCwgIDkwLCAgOTIsCi0gIDk0LCAgIDk2LCAgOTgsIDEwMCwgMTAyLCAxMDQsIDEwNiwgMTA4LAotICAxMTAsIDExMiwgMTE0LCAxMTYsIDExOSwgMTIyLCAxMjUsIDEyOCwKLSAgMTMxLCAxMzQsIDEzNywgMTQwLCAxNDMsIDE0NiwgMTQ5LCAxNTIsCi0gIDE1NSwgMTU4LCAxNjEsIDE2NCwgMTY3LCAxNzAsIDE3MywgMTc3LAotICAxODEsIDE4NSwgMTg5LCAxOTMsIDE5NywgMjAxLCAyMDUsIDIwOSwKLSAgMjEzLCAyMTcsIDIyMSwgMjI1LCAyMjksIDIzNCwgMjM5LCAyNDUsCi0gIDI0OSwgMjU0LCAyNTksIDI2NCwgMjY5LCAyNzQsIDI3OSwgMjg0Ci19OwotCi1zdGF0aWMgY29uc3QgdWludDE2X3Qga0FjVGFibGUyWzEyOF0gPSB7Ci0gIDgsICAgICA4LCAgIDksICAxMCwgIDEyLCAgMTMsICAxNSwgIDE3LAotICAxOCwgICAyMCwgIDIxLCAgMjMsICAyNCwgIDI2LCAgMjcsICAyOSwKLSAgMzEsICAgMzIsICAzNCwgIDM1LCAgMzcsICAzOCwgIDQwLCAgNDEsCi0gIDQzLCAgIDQ0LCAgNDYsICA0OCwgIDQ5LCAgNTEsICA1MiwgIDU0LAotICA1NSwgICA1NywgIDU4LCAgNjAsICA2MiwgIDYzLCAgNjUsICA2NiwKLSAgNjgsICAgNjksICA3MSwgIDcyLCAgNzQsICA3NSwgIDc3LCAgNzksCi0gIDgwLCAgIDgyLCAgODMsICA4NSwgIDg2LCAgODgsICA4OSwgIDkzLAotICA5NiwgICA5OSwgMTAyLCAxMDUsIDEwOCwgMTExLCAxMTQsIDExNywKLSAgMTIwLCAxMjQsIDEyNywgMTMwLCAxMzMsIDEzNiwgMTM5LCAxNDIsCi0gIDE0NSwgMTQ4LCAxNTEsIDE1NSwgMTU4LCAxNjEsIDE2NCwgMTY3LAotICAxNzAsIDE3MywgMTc2LCAxNzksIDE4NCwgMTg5LCAxOTMsIDE5OCwKLSAgMjAzLCAyMDcsIDIxMiwgMjE3LCAyMjEsIDIyNiwgMjMwLCAyMzUsCi0gIDI0MCwgMjQ0LCAyNDksIDI1NCwgMjU4LCAyNjMsIDI2OCwgMjc0LAotICAyODAsIDI4NiwgMjkyLCAyOTksIDMwNSwgMzExLCAzMTcsIDMyMywKLSAgMzMwLCAzMzYsIDM0MiwgMzQ4LCAzNTQsIDM2MiwgMzcwLCAzNzksCi0gIDM4NSwgMzkzLCA0MDEsIDQwOSwgNDE2LCA0MjQsIDQzMiwgNDQwCi19OwotCi1zdGF0aWMgY29uc3QgdWludDE2X3Qga0NvZWZmVGhyZXNoWzE2XSA9IHsKLSAgMCwgIDEwLCAyMCwgMzAsCi0gIDEwLCAyMCwgMzAsIDMwLAotICAyMCwgMzAsIDMwLCAzMCwKLSAgMzAsIDMwLCAzMCwgMzAKLX07Ci0KLS8vIFRPRE8oc2thbCk6IHR1bmUgbW9yZS4gQ29lZmYgdGhyZXNob2xkaW5nPwotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0JpYXNNYXRyaWNlc1szXVsxNl0gPSB7ICAvLyBbM10gPSBbbHVtYS1hYyxsdW1hLWRjLGNocm9tYV0KLSAgeyA5NiwgOTYsIDk2LCA5NiwKLSAgICA5NiwgOTYsIDk2LCA5NiwKLSAgICA5NiwgOTYsIDk2LCA5NiwKLSAgICA5NiwgOTYsIDk2LCA5NiB9LAotICB7IDk2LCA5NiwgOTYsIDk2LAotICAgIDk2LCA5NiwgOTYsIDk2LAotICAgIDk2LCA5NiwgOTYsIDk2LAotICAgIDk2LCA5NiwgOTYsIDk2IH0sCi0gIHsgOTYsIDk2LCA5NiwgOTYsCi0gICAgOTYsIDk2LCA5NiwgOTYsCi0gICAgOTYsIDk2LCA5NiwgOTYsCi0gICAgOTYsIDk2LCA5NiwgOTYgfQotfTsKLQotLy8gU2hhcnBlbmluZyBieSAoc2xpZ2h0bHkpIHJhaXNpbmcgdGhlIGhpLWZyZXF1ZW5jeSBjb2VmZnMgKG9ubHkgZm9yIHRyZWxsaXMpLgotLy8gSGFjay1pc2ggYnV0IGhlbHBmdWwgZm9yIG1pZC1iaXRyYXRlIHJhbmdlLiBVc2Ugd2l0aCBjYXJlLgotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0ZyZXFTaGFycGVuaW5nWzE2XSA9IHsKLSAgMCwgIDMwLCA2MCwgOTAsCi0gIDMwLCA2MCwgOTAsIDkwLAotICA2MCwgOTAsIDkwLCA5MCwKLSAgOTAsIDkwLCA5MCwgOTAKLX07Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBJbml0aWFsaXplIHF1YW50aXphdGlvbiBwYXJhbWV0ZXJzIGluIFZQOE1hdHJpeAotCi0vLyBSZXR1cm5zIHRoZSBhdmVyYWdlIHF1YW50aXplcgotc3RhdGljIGludCBFeHBhbmRNYXRyaXgoVlA4TWF0cml4KiBjb25zdCBtLCBpbnQgdHlwZSkgewotICBpbnQgaTsKLSAgaW50IHN1bSA9IDA7Ci0gIGZvciAoaSA9IDI7IGkgPCAxNjsgKytpKSB7Ci0gICAgbS0+cV9baV0gPSBtLT5xX1sxXTsKLSAgfQotICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgewotICAgIGNvbnN0IGludCBqID0ga1ppZ3phZ1tpXTsKLSAgICBjb25zdCBpbnQgYmlhcyA9IGtCaWFzTWF0cmljZXNbdHlwZV1bal07Ci0gICAgbS0+aXFfW2pdID0gKDEgPDwgUUZJWCkgLyBtLT5xX1tqXTsKLSAgICBtLT5iaWFzX1tqXSA9IEJJQVMoYmlhcyk7Ci0gICAgLy8gVE9ETyhza2FsKTogdHVuZSBrQ29lZmZUaHJlc2hbXQotICAgIG0tPnp0aHJlc2hfW2pdID0gKCgyNTYgLyorIGtDb2VmZlRocmVzaFtqXSovIC0gYmlhcykgKiBtLT5xX1tqXSArIDEyNykgPj4gODsKLSAgICBtLT5zaGFycGVuX1tqXSA9IChrRnJlcVNoYXJwZW5pbmdbal0gKiBtLT5xX1tqXSkgPj4gMTE7Ci0gICAgc3VtICs9IG0tPnFfW2pdOwotICB9Ci0gIHJldHVybiAoc3VtICsgOCkgPj4gNDsKLX0KLQotc3RhdGljIHZvaWQgU2V0dXBNYXRyaWNlcyhWUDhFbmNvZGVyKiBlbmMpIHsKLSAgaW50IGk7Ci0gIGNvbnN0IGludCB0bGFtYmRhX3NjYWxlID0KLSAgICAoZW5jLT5tZXRob2RfID49IDQpID8gZW5jLT5jb25maWdfLT5zbnNfc3RyZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgICAgIDogMDsKLSAgY29uc3QgaW50IG51bV9zZWdtZW50cyA9IGVuYy0+c2VnbWVudF9oZHJfLm51bV9zZWdtZW50c187Ci0gIGZvciAoaSA9IDA7IGkgPCBudW1fc2VnbWVudHM7ICsraSkgewotICAgIFZQOFNlZ21lbnRJbmZvKiBjb25zdCBtID0gJmVuYy0+ZHFtX1tpXTsKLSAgICBjb25zdCBpbnQgcSA9IG0tPnF1YW50XzsKLSAgICBpbnQgcTQsIHExNiwgcXV2OwotICAgIG0tPnkxXy5xX1swXSA9IGtEY1RhYmxlW2NsaXAocSArIGVuYy0+ZHFfeTFfZGNfLCAwLCAxMjcpXTsKLSAgICBtLT55MV8ucV9bMV0gPSBrQWNUYWJsZVtjbGlwKHEsICAgICAgICAgICAgICAgICAgMCwgMTI3KV07Ci0KLSAgICBtLT55Ml8ucV9bMF0gPSBrRGNUYWJsZVsgY2xpcChxICsgZW5jLT5kcV95Ml9kY18sIDAsIDEyNyldICogMjsKLSAgICBtLT55Ml8ucV9bMV0gPSBrQWNUYWJsZTJbY2xpcChxICsgZW5jLT5kcV95Ml9hY18sIDAsIDEyNyldOwotCi0gICAgbS0+dXZfLnFfWzBdID0ga0RjVGFibGVbY2xpcChxICsgZW5jLT5kcV91dl9kY18sIDAsIDExNyldOwotICAgIG0tPnV2Xy5xX1sxXSA9IGtBY1RhYmxlW2NsaXAocSArIGVuYy0+ZHFfdXZfYWNfLCAwLCAxMjcpXTsKLQotICAgIHE0ICA9IEV4cGFuZE1hdHJpeCgmbS0+eTFfLCAwKTsKLSAgICBxMTYgPSBFeHBhbmRNYXRyaXgoJm0tPnkyXywgMSk7Ci0gICAgcXV2ID0gRXhwYW5kTWF0cml4KCZtLT51dl8sIDIpOwotCi0gICAgLy8gVE9ETzogU3dpdGNoIHRvIGtMYW1iZGEqW10gdGFibGVzPwotICAgIHsKLSAgICAgIG0tPmxhbWJkYV9pNF8gID0gKDMgKiBxNCAqIHE0KSA+PiA3OwotICAgICAgbS0+bGFtYmRhX2kxNl8gPSAoMyAqIHExNiAqIHExNik7Ci0gICAgICBtLT5sYW1iZGFfdXZfICA9ICgzICogcXV2ICogcXV2KSA+PiA2OwotICAgICAgbS0+bGFtYmRhX21vZGVfICAgID0gKDEgKiBxNCAqIHE0KSA+PiA3OwotICAgICAgbS0+bGFtYmRhX3RyZWxsaXNfaTRfICA9ICg3ICogcTQgKiBxNCkgPj4gMzsKLSAgICAgIG0tPmxhbWJkYV90cmVsbGlzX2kxNl8gPSAocTE2ICogcTE2KSA+PiAyOwotICAgICAgbS0+bGFtYmRhX3RyZWxsaXNfdXZfICA9IChxdXYgKnF1dikgPDwgMTsKLSAgICAgIG0tPnRsYW1iZGFfICAgICAgICAgICAgPSAodGxhbWJkYV9zY2FsZSAqIHE0KSA+PiA1OwotICAgIH0KLSAgfQotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gSW5pdGlhbGl6ZSBmaWx0ZXJpbmcgcGFyYW1ldGVycwotCi0vLyBWZXJ5IHNtYWxsIGZpbHRlci1zdHJlbmd0aCB2YWx1ZXMgaGF2ZSBjbG9zZSB0byBubyB2aXN1YWwgZWZmZWN0LiBTbyB3ZSBjYW4KLS8vIHNhdmUgYSBsaXR0bGUgZGVjb2RpbmctQ1BVIGJ5IHR1cm5pbmcgZmlsdGVyaW5nIG9mZiBmb3IgdGhlc2UuCi0jZGVmaW5lIEZTVFJFTkdUSF9DVVRPRkYgMwotCi1zdGF0aWMgdm9pZCBTZXR1cEZpbHRlclN0cmVuZ3RoKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgewotICBpbnQgaTsKLSAgY29uc3QgaW50IGxldmVsMCA9IGVuYy0+Y29uZmlnXy0+ZmlsdGVyX3N0cmVuZ3RoOwotICBmb3IgKGkgPSAwOyBpIDwgTlVNX01CX1NFR01FTlRTOyArK2kpIHsKLSAgICAvLyBTZWdtZW50cyB3aXRoIGxvd2VyIHF1YW50aXplciB3aWxsIGJlIGxlc3MgZmlsdGVyZWQuIFRPRE86IHR1bmUgKHdydCBTTlMpCi0gICAgY29uc3QgaW50IGxldmVsID0gbGV2ZWwwICogMjU2ICogZW5jLT5kcW1fW2ldLnF1YW50XyAvIDEyODsKLSAgICBjb25zdCBpbnQgZiA9IGxldmVsIC8gKDI1NiArIGVuYy0+ZHFtX1tpXS5iZXRhXyk7Ci0gICAgZW5jLT5kcW1fW2ldLmZzdHJlbmd0aF8gPSAoZiA8IEZTVFJFTkdUSF9DVVRPRkYpID8gMCA6IChmID4gNjMpID8gNjMgOiBmOwotICB9Ci0gIC8vIFdlIHJlY29yZCB0aGUgaW5pdGlhbCBzdHJlbmd0aCAobWFpbmx5IGZvciB0aGUgY2FzZSBvZiAxLXNlZ21lbnQgb25seSkuCi0gIGVuYy0+ZmlsdGVyX2hkcl8ubGV2ZWxfID0gZW5jLT5kcW1fWzBdLmZzdHJlbmd0aF87Ci0gIGVuYy0+ZmlsdGVyX2hkcl8uc2ltcGxlXyA9IChlbmMtPmNvbmZpZ18tPmZpbHRlcl90eXBlID09IDApOwotICBlbmMtPmZpbHRlcl9oZHJfLnNoYXJwbmVzc18gPSBlbmMtPmNvbmZpZ18tPmZpbHRlcl9zaGFycG5lc3M7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIE5vdGU6IGlmIHlvdSBjaGFuZ2UgdGhlIHZhbHVlcyBiZWxvdywgcmVtZW1iZXIgdGhhdCB0aGUgbWF4IHJhbmdlCi0vLyBhbGxvd2VkIGJ5IHRoZSBzeW50YXggZm9yIERRX1VWIGlzIFstMTYsMTZdLgotI2RlZmluZSBNQVhfRFFfVVYgKDYpCi0jZGVmaW5lIE1JTl9EUV9VViAoLTQpCi0KLS8vIFdlIHdhbnQgdG8gZW11bGF0ZSBqcGVnLWxpa2UgYmVoYXZpb3VyIHdoZXJlIHRoZSBleHBlY3RlZCAiZ29vZCIgcXVhbGl0eQotLy8gaXMgYXJvdW5kIHE9NzUuIEludGVybmFsbHksIG91ciAiZ29vZCIgbWlkZGxlIGlzIGFyb3VuZCBjPTUwLiBTbyB3ZQotLy8gbWFwIGFjY29yZGluZ2x5IHVzaW5nIGxpbmVhciBwaWVjZS13aXNlIGZ1bmN0aW9uCi1zdGF0aWMgZG91YmxlIFF1YWxpdHlUb0NvbXByZXNzaW9uKGRvdWJsZSBjKSB7Ci0gIGNvbnN0IGRvdWJsZSBsaW5lYXJfYyA9IChjIDwgMC43NSkgPyBjICogKDIuIC8gMy4pIDogMi4gKiBjIC0gMS47Ci0gIC8vIFRoZSBmaWxlIHNpemUgcm91Z2hseSBzY2FsZXMgYXMgcG93KHF1YW50aXplciwgMy4pLiBBY3R1YWxseSwgdGhlCi0gIC8vIGV4cG9uZW50IGlzIHNvbWV3aGVyZSBiZXR3ZWVuIDIuOCBhbmQgMy4yLCBidXQgd2UncmUgbW9zdGx5IGludGVyZXN0ZWQKLSAgLy8gaW4gdGhlIG1pZC1xdWFudCByYW5nZS4gU28gd2Ugc2NhbGUgdGhlIGNvbXByZXNzaWJpbGl0eSBpbnZlcnNlbHkgdG8KLSAgLy8gdGhpcyBwb3dlci1sYXc6IHF1YW50IH49IGNvbXByZXNzaW9uIF4gMS8zLiBUaGlzIGxhdyBob2xkcyB3ZWxsIGZvcgotICAvLyBsb3cgcXVhbnQuIEZpbmVyIG1vZGVsbGluZyBmb3IgaGlnaC1xdWFudCB3b3VsZCBtYWtlIHVzZSBvZiBrQWNUYWJsZVtdCi0gIC8vIG1vcmUgZXhwbGljaXRseS4KLSAgY29uc3QgZG91YmxlIHYgPSBwb3cobGluZWFyX2MsIDEgLyAzLik7Ci0gIHJldHVybiB2OwotfQotCi1zdGF0aWMgZG91YmxlIFF1YWxpdHlUb0pQRUdDb21wcmVzc2lvbihkb3VibGUgYywgZG91YmxlIGFscGhhKSB7Ci0gIC8vIFdlIG1hcCB0aGUgY29tcGxleGl0eSAnYWxwaGEnIGFuZCBxdWFsaXR5IHNldHRpbmcgJ2MnIHRvIGEgY29tcHJlc3Npb24KLSAgLy8gZXhwb25lbnQgZW1waXJpY2FsbHkgbWF0Y2hlZCB0byB0aGUgY29tcHJlc3Npb24gY3VydmUgb2YgbGlianBlZzZiLgotICAvLyBPbiBhdmVyYWdlLCB0aGUgV2ViUCBvdXRwdXQgc2l6ZSB3aWxsIGJlIHJvdWdobHkgc2ltaWxhciB0byB0aGF0IG9mIGEKLSAgLy8gSlBFRyBmaWxlIGNvbXByZXNzZWQgd2l0aCBzYW1lIHF1YWxpdHkgZmFjdG9yLgotICBjb25zdCBkb3VibGUgYW1pbiA9IDAuMzA7Ci0gIGNvbnN0IGRvdWJsZSBhbWF4ID0gMC44NTsKLSAgY29uc3QgZG91YmxlIGV4cF9taW4gPSAwLjQ7Ci0gIGNvbnN0IGRvdWJsZSBleHBfbWF4ID0gMC45OwotICBjb25zdCBkb3VibGUgc2xvcGUgPSAoZXhwX21pbiAtIGV4cF9tYXgpIC8gKGFtYXggLSBhbWluKTsKLSAgLy8gTGluZWFybHkgaW50ZXJwb2xhdGUgJ2V4cG4nIGZyb20gZXhwX21pbiB0byBleHBfbWF4Ci0gIC8vIGluIHRoZSBbYW1pbiwgYW1heF0gcmFuZ2UuCi0gIGNvbnN0IGRvdWJsZSBleHBuID0gKGFscGhhID4gYW1heCkgPyBleHBfbWluCi0gICAgICAgICAgICAgICAgICAgIDogKGFscGhhIDwgYW1pbikgPyBleHBfbWF4Ci0gICAgICAgICAgICAgICAgICAgIDogZXhwX21heCArIHNsb3BlICogKGFscGhhIC0gYW1pbik7Ci0gIGNvbnN0IGRvdWJsZSB2ID0gcG93KGMsIGV4cG4pOwotICByZXR1cm4gdjsKLX0KLQotc3RhdGljIGludCBTZWdtZW50c0FyZUVxdWl2YWxlbnQoY29uc3QgVlA4U2VnbWVudEluZm8qIGNvbnN0IFMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4U2VnbWVudEluZm8qIGNvbnN0IFMyKSB7Ci0gIHJldHVybiAoUzEtPnF1YW50XyA9PSBTMi0+cXVhbnRfKSAmJiAoUzEtPmZzdHJlbmd0aF8gPT0gUzItPmZzdHJlbmd0aF8pOwotfQotCi1zdGF0aWMgdm9pZCBTaW1wbGlmeVNlZ21lbnRzKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgewotICBpbnQgbWFwW05VTV9NQl9TRUdNRU5UU10gPSB7IDAsIDEsIDIsIDMgfTsKLSAgY29uc3QgaW50IG51bV9zZWdtZW50cyA9IGVuYy0+c2VnbWVudF9oZHJfLm51bV9zZWdtZW50c187Ci0gIGludCBudW1fZmluYWxfc2VnbWVudHMgPSAxOwotICBpbnQgczEsIHMyOwotICBmb3IgKHMxID0gMTsgczEgPCBudW1fc2VnbWVudHM7ICsrczEpIHsgICAgLy8gZmluZCBzaW1pbGFyIHNlZ21lbnRzCi0gICAgY29uc3QgVlA4U2VnbWVudEluZm8qIGNvbnN0IFMxID0gJmVuYy0+ZHFtX1tzMV07Ci0gICAgaW50IGZvdW5kID0gMDsKLSAgICAvLyBjaGVjayBpZiB3ZSBhbHJlYWR5IGhhdmUgc2ltaWxhciBzZWdtZW50Ci0gICAgZm9yIChzMiA9IDA7IHMyIDwgbnVtX2ZpbmFsX3NlZ21lbnRzOyArK3MyKSB7Ci0gICAgICBjb25zdCBWUDhTZWdtZW50SW5mbyogY29uc3QgUzIgPSAmZW5jLT5kcW1fW3MyXTsKLSAgICAgIGlmIChTZWdtZW50c0FyZUVxdWl2YWxlbnQoUzEsIFMyKSkgewotICAgICAgICBmb3VuZCA9IDE7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICBtYXBbczFdID0gczI7Ci0gICAgaWYgKCFmb3VuZCkgewotICAgICAgaWYgKG51bV9maW5hbF9zZWdtZW50cyAhPSBzMSkgewotICAgICAgICBlbmMtPmRxbV9bbnVtX2ZpbmFsX3NlZ21lbnRzXSA9IGVuYy0+ZHFtX1tzMV07Ci0gICAgICB9Ci0gICAgICArK251bV9maW5hbF9zZWdtZW50czsKLSAgICB9Ci0gIH0KLSAgaWYgKG51bV9maW5hbF9zZWdtZW50cyA8IG51bV9zZWdtZW50cykgeyAgLy8gUmVtYXAKLSAgICBpbnQgaSA9IGVuYy0+bWJfd18gKiBlbmMtPm1iX2hfOwotICAgIHdoaWxlIChpLS0gPiAwKSBlbmMtPm1iX2luZm9fW2ldLnNlZ21lbnRfID0gbWFwW2VuYy0+bWJfaW5mb19baV0uc2VnbWVudF9dOwotICAgIGVuYy0+c2VnbWVudF9oZHJfLm51bV9zZWdtZW50c18gPSBudW1fZmluYWxfc2VnbWVudHM7Ci0gICAgLy8gUmVwbGljYXRlIHRoZSB0cmFpbGluZyBzZWdtZW50IGluZm9zIChpdCdzIG1vc3RseSBjb3NtZXRpY3MpCi0gICAgZm9yIChpID0gbnVtX2ZpbmFsX3NlZ21lbnRzOyBpIDwgbnVtX3NlZ21lbnRzOyArK2kpIHsKLSAgICAgIGVuYy0+ZHFtX1tpXSA9IGVuYy0+ZHFtX1tudW1fZmluYWxfc2VnbWVudHMgLSAxXTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBWUDhTZXRTZWdtZW50UGFyYW1zKFZQOEVuY29kZXIqIGNvbnN0IGVuYywgZmxvYXQgcXVhbGl0eSkgewotICBpbnQgaTsKLSAgaW50IGRxX3V2X2FjLCBkcV91dl9kYzsKLSAgY29uc3QgaW50IG51bV9zZWdtZW50cyA9IGVuYy0+c2VnbWVudF9oZHJfLm51bV9zZWdtZW50c187Ci0gIGNvbnN0IGRvdWJsZSBhbXAgPSBTTlNfVE9fRFEgKiBlbmMtPmNvbmZpZ18tPnNuc19zdHJlbmd0aCAvIDEwMC4gLyAxMjguOwotICBjb25zdCBkb3VibGUgUSA9IHF1YWxpdHkgLyAxMDAuOwotICBjb25zdCBkb3VibGUgY19iYXNlID0gZW5jLT5jb25maWdfLT5lbXVsYXRlX2pwZWdfc2l6ZSA/Ci0gICAgICBRdWFsaXR5VG9KUEVHQ29tcHJlc3Npb24oUSwgZW5jLT5hbHBoYV8gLyAyNTUuKSA6Ci0gICAgICBRdWFsaXR5VG9Db21wcmVzc2lvbihRKTsKLSAgZm9yIChpID0gMDsgaSA8IG51bV9zZWdtZW50czsgKytpKSB7Ci0gICAgLy8gV2UgbW9kdWxhdGUgdGhlIGJhc2UgY29lZmZpY2llbnQgdG8gYWNjb21tb2RhdGUgZm9yIHRoZSBxdWFudGl6YXRpb24KLSAgICAvLyBzdXNjZXB0aWJpbGl0eSBhbmQgYWxsb3cgZGVuc2VyIHNlZ21lbnRzIHRvIGJlIHF1YW50aXplZCBtb3JlLgotICAgIGNvbnN0IGRvdWJsZSBleHBuID0gMS4gLSBhbXAgKiBlbmMtPmRxbV9baV0uYWxwaGFfOwotICAgIGNvbnN0IGRvdWJsZSBjID0gcG93KGNfYmFzZSwgZXhwbik7Ci0gICAgY29uc3QgaW50IHEgPSAoaW50KSgxMjcuICogKDEuIC0gYykpOwotICAgIFNCX0RDSEVDSyhleHBuID4gMC4pOwotICAgIGVuYy0+ZHFtX1tpXS5xdWFudF8gPSBjbGlwKHEsIDAsIDEyNyk7Ci0gIH0KLQotICAvLyBwdXJlbHkgaW5kaWNhdGl2ZSBpbiB0aGUgYml0c3RyZWFtIChleGNlcHQgZm9yIHRoZSAxLXNlZ21lbnQgY2FzZSkKLSAgZW5jLT5iYXNlX3F1YW50XyA9IGVuYy0+ZHFtX1swXS5xdWFudF87Ci0KLSAgLy8gZmlsbC1pbiB2YWx1ZXMgZm9yIHRoZSB1bnVzZWQgc2VnbWVudHMgKHJlcXVpcmVkIGJ5IHRoZSBzeW50YXgpCi0gIGZvciAoaSA9IG51bV9zZWdtZW50czsgaSA8IE5VTV9NQl9TRUdNRU5UUzsgKytpKSB7Ci0gICAgZW5jLT5kcW1fW2ldLnF1YW50XyA9IGVuYy0+YmFzZV9xdWFudF87Ci0gIH0KLQotICAvLyB1dl9hbHBoYV8gaXMgbm9ybWFsbHkgc3ByZWFkIGFyb3VuZCB+NjAuIFRoZSB1c2VmdWwgcmFuZ2UgaXMKLSAgLy8gdHlwaWNhbGx5IH4zMCAocXVpdGUgYmFkKSB0byB+MTAwIChvayB0byBkZWNpbWF0ZSBVViBtb3JlKS4KLSAgLy8gV2UgbWFwIGl0IHRvIHRoZSBzYWZlIG1heGltYWwgcmFuZ2Ugb2YgTUFYL01JTl9EUV9VViBmb3IgZHFfdXYuCi0gIGRxX3V2X2FjID0gKGVuYy0+dXZfYWxwaGFfIC0gTUlEX0FMUEhBKSAqIChNQVhfRFFfVVYgLSBNSU5fRFFfVVYpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChNQVhfQUxQSEEgLSBNSU5fQUxQSEEpOwotICAvLyB3ZSByZXNjYWxlIGJ5IHRoZSB1c2VyLWRlZmluZWQgc3RyZW5ndGggb2YgYWRhcHRhdGlvbgotICBkcV91dl9hYyA9IGRxX3V2X2FjICogZW5jLT5jb25maWdfLT5zbnNfc3RyZW5ndGggLyAxMDA7Ci0gIC8vIGFuZCBtYWtlIGl0IHNhZmUuCi0gIGRxX3V2X2FjID0gY2xpcChkcV91dl9hYywgTUlOX0RRX1VWLCBNQVhfRFFfVVYpOwotICAvLyBXZSBhbHNvIGJvb3N0IHRoZSBkYy11di1xdWFudCBhIGxpdHRsZSwgYmFzZWQgb24gc25zLXN0cmVuZ3RoLCBzaW5jZQotICAvLyBVL1YgY2hhbm5lbHMgYXJlIHF1aXRlIG1vcmUgcmVhY3RpdmUgdG8gaGlnaCBxdWFudHMgKGZsYXQgREMtYmxvY2tzCi0gIC8vIHRlbmQgdG8gYXBwZWFyLCBhbmQgYXJlIGRpc3BsZWFzYW50KS4KLSAgZHFfdXZfZGMgPSAtNCAqIGVuYy0+Y29uZmlnXy0+c25zX3N0cmVuZ3RoIC8gMTAwOwotICBkcV91dl9kYyA9IGNsaXAoZHFfdXZfZGMsIC0xNSwgMTUpOyAgIC8vIDRiaXQtc2lnbmVkIG1heCBhbGxvd2VkCi0KLSAgZW5jLT5kcV95MV9kY18gPSAwOyAgICAgICAvLyBUT0RPKHNrYWwpOiBkcS1sdW0KLSAgZW5jLT5kcV95Ml9kY18gPSAwOwotICBlbmMtPmRxX3kyX2FjXyA9IDA7Ci0gIGVuYy0+ZHFfdXZfZGNfID0gZHFfdXZfZGM7Ci0gIGVuYy0+ZHFfdXZfYWNfID0gZHFfdXZfYWM7Ci0KLSAgU2V0dXBGaWx0ZXJTdHJlbmd0aChlbmMpOyAgIC8vIGluaXRpYWxpemUgc2VnbWVudHMnIGZpbHRlcmluZywgZXZlbnR1YWxseQotCi0gIGlmIChudW1fc2VnbWVudHMgPiAxKSBTaW1wbGlmeVNlZ21lbnRzKGVuYyk7Ci0KLSAgU2V0dXBNYXRyaWNlcyhlbmMpOyAgICAgICAgIC8vIGZpbmFsaXplIHF1YW50aXphdGlvbiBtYXRyaWNlcwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRm9ybSB0aGUgcHJlZGljdGlvbnMgaW4gY2FjaGUKLQotLy8gTXVzdCBiZSBvcmRlcmVkIHVzaW5nIHtEQ19QUkVELCBUTV9QUkVELCBWX1BSRUQsIEhfUFJFRH0gYXMgaW5kZXgKLWNvbnN0IGludCBWUDhJMTZNb2RlT2Zmc2V0c1s0XSA9IHsgSTE2REMxNiwgSTE2VE0xNiwgSTE2VkUxNiwgSTE2SEUxNiB9OwotY29uc3QgaW50IFZQOFVWTW9kZU9mZnNldHNbNF0gPSB7IEM4REM4LCBDOFRNOCwgQzhWRTgsIEM4SEU4IH07Ci0KLS8vIE11c3QgYmUgaW5kZXhlZCB1c2luZyB7Ql9EQ19QUkVEIC0+IEJfSFVfUFJFRH0gYXMgaW5kZXgKLWNvbnN0IGludCBWUDhJNE1vZGVPZmZzZXRzW05VTV9CTU9ERVNdID0gewotICBJNERDNCwgSTRUTTQsIEk0VkU0LCBJNEhFNCwgSTRSRDQsIEk0VlI0LCBJNExENCwgSTRWTDQsIEk0SEQ0LCBJNEhVNAotfTsKLQotdm9pZCBWUDhNYWtlTHVtYTE2UHJlZHMoY29uc3QgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KSB7Ci0gIGNvbnN0IFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOwotICBjb25zdCB1aW50OF90KiBjb25zdCBsZWZ0ID0gaXQtPnhfID8gZW5jLT55X2xlZnRfIDogTlVMTDsKLSAgY29uc3QgdWludDhfdCogY29uc3QgdG9wID0gaXQtPnlfID8gZW5jLT55X3RvcF8gKyBpdC0+eF8gKiAxNiA6IE5VTEw7Ci0gIFZQOEVuY1ByZWRMdW1hMTYoaXQtPnl1dl9wXywgbGVmdCwgdG9wKTsKLX0KLQotdm9pZCBWUDhNYWtlQ2hyb21hOFByZWRzKGNvbnN0IFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCkgewotICBjb25zdCBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKLSAgY29uc3QgdWludDhfdCogY29uc3QgbGVmdCA9IGl0LT54XyA/IGVuYy0+dV9sZWZ0XyA6IE5VTEw7Ci0gIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHRvcCA9IGl0LT55XyA/IGVuYy0+dXZfdG9wXyArIGl0LT54XyAqIDE2IDogTlVMTDsKLSAgVlA4RW5jUHJlZENocm9tYTgoaXQtPnl1dl9wXywgbGVmdCwgdG9wKTsKLX0KLQotdm9pZCBWUDhNYWtlSW50cmE0UHJlZHMoY29uc3QgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KSB7Ci0gIFZQOEVuY1ByZWRMdW1hNChpdC0+eXV2X3BfLCBpdC0+aTRfdG9wXyk7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBRdWFudGl6ZQotCi0vLyBMYXlvdXQ6Ci0vLyArLS0tLSsKLS8vIHxZWVlZfCAwCi0vLyB8WVlZWXwgNAotLy8gfFlZWVl8IDgKLS8vIHxZWVlZfCAxMgotLy8gKy0tLS0rCi0vLyB8VVVWVnwgMTYKLS8vIHxVVVZWfCAyMAotLy8gKy0tLS0rCi0KLWNvbnN0IGludCBWUDhTY2FuWzE2ICsgNCArIDRdID0gewotICAvLyBMdW1hCi0gIDAgKyAgMCAqIEJQUywgIDQgKyAgMCAqIEJQUywgOCArICAwICogQlBTLCAxMiArICAwICogQlBTLAotICAwICsgIDQgKiBCUFMsICA0ICsgIDQgKiBCUFMsIDggKyAgNCAqIEJQUywgMTIgKyAgNCAqIEJQUywKLSAgMCArICA4ICogQlBTLCAgNCArICA4ICogQlBTLCA4ICsgIDggKiBCUFMsIDEyICsgIDggKiBCUFMsCi0gIDAgKyAxMiAqIEJQUywgIDQgKyAxMiAqIEJQUywgOCArIDEyICogQlBTLCAxMiArIDEyICogQlBTLAotCi0gIDAgKyAwICogQlBTLCAgIDQgKyAwICogQlBTLCAwICsgNCAqIEJQUywgIDQgKyA0ICogQlBTLCAgICAvLyBVCi0gIDggKyAwICogQlBTLCAgMTIgKyAwICogQlBTLCA4ICsgNCAqIEJQUywgMTIgKyA0ICogQlBTICAgICAvLyBWCi19OwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRGlzdG9ydGlvbiBtZWFzdXJlbWVudAotCi1zdGF0aWMgY29uc3QgdWludDE2X3Qga1dlaWdodFlbMTZdID0gewotICAzOCwgMzIsIDIwLCA5LCAzMiwgMjgsIDE3LCA3LCAyMCwgMTcsIDEwLCA0LCA5LCA3LCA0LCAyCi19OwotCi1zdGF0aWMgY29uc3QgdWludDE2X3Qga1dlaWdodFRyZWxsaXNbMTZdID0gewotI2lmIFVTRV9URElTVE8gPT0gMAotICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNgotI2Vsc2UKLSAgMzAsIDI3LCAxOSwgMTEsCi0gIDI3LCAyNCwgMTcsIDEwLAotICAxOSwgMTcsIDEyLCAgOCwKLSAgMTEsIDEwLCAgOCwgIDYKLSNlbmRpZgotfTsKLQotLy8gSW5pdC9Db3B5IHRoZSBjb21tb24gZmllbGRzIGluIHNjb3JlLgotc3RhdGljIHZvaWQgSW5pdFNjb3JlKFZQOE1vZGVTY29yZSogY29uc3QgcmQpIHsKLSAgcmQtPkQgID0gMDsKLSAgcmQtPlNEID0gMDsKLSAgcmQtPlIgID0gMDsKLSAgcmQtPm56ID0gMDsKLSAgcmQtPnNjb3JlID0gTUFYX0NPU1Q7Ci19Ci0KLXN0YXRpYyB2b2lkIENvcHlTY29yZShWUDhNb2RlU2NvcmUqIGNvbnN0IGRzdCwgY29uc3QgVlA4TW9kZVNjb3JlKiBjb25zdCBzcmMpIHsKLSAgZHN0LT5EICA9IHNyYy0+RDsKLSAgZHN0LT5TRCA9IHNyYy0+U0Q7Ci0gIGRzdC0+UiAgPSBzcmMtPlI7Ci0gIGRzdC0+bnogPSBzcmMtPm56OyAgICAgIC8vIG5vdGUgdGhhdCBueiBpcyBub3QgYWNjdW11bGF0ZWQsIGJ1dCBqdXN0IGNvcGllZC4KLSAgZHN0LT5zY29yZSA9IHNyYy0+c2NvcmU7Ci19Ci0KLXN0YXRpYyB2b2lkIEFkZFNjb3JlKFZQOE1vZGVTY29yZSogY29uc3QgZHN0LCBjb25zdCBWUDhNb2RlU2NvcmUqIGNvbnN0IHNyYykgewotICBkc3QtPkQgICs9IHNyYy0+RDsKLSAgZHN0LT5TRCArPSBzcmMtPlNEOwotICBkc3QtPlIgICs9IHNyYy0+UjsKLSAgZHN0LT5ueiB8PSBzcmMtPm56OyAgICAgLy8gaGVyZSwgbmV3IG56IGJpdHMgYXJlIGFjY3VtdWxhdGVkLgotICBkc3QtPnNjb3JlICs9IHNyYy0+c2NvcmU7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBQZXJmb3JtcyB0cmVsbGlzLW9wdGltaXplZCBxdWFudGl6YXRpb24uCi0KLS8vIFRyZWxsaXMKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBpbnQgcHJldjsgICAgICAgIC8vIGJlc3QgcHJldmlvdXMKLSAgaW50IGxldmVsOyAgICAgICAvLyBsZXZlbAotICBpbnQgc2lnbjsgICAgICAgIC8vIHNpZ24gb2YgY29lZmZfaQotICBzY29yZV90IGNvc3Q7ICAgIC8vIGJpdCBjb3N0Ci0gIHNjb3JlX3QgZXJyb3I7ICAgLy8gZGlzdG9ydGlvbiA9IHN1bSBvZiAofGNvZWZmX2l8IC0gbGV2ZWxfaSAqIFFfaSleMgotICBpbnQgY3R4OyAgICAgICAgIC8vIGNvbnRleHQgKG9ubHkgZGVwZW5kcyBvbiAnbGV2ZWwnLiBDb3VsZCBiZSBzcGFyZWQuKQotfSBOb2RlOwotCi0vLyBJZiBhIGNvZWZmaWNpZW50IHdhcyBxdWFudGl6ZWQgdG8gYSB2YWx1ZSBRICh1c2luZyBhIG5ldXRyYWwgYmlhcyksCi0vLyB3ZSB0ZXN0IGFsbCBhbHRlcm5hdGUgcG9zc2liaWxpdGllcyBiZXR3ZWVuIFtRLU1JTl9ERUxUQSwgUStNQVhfREVMVEFdCi0vLyBXZSBkb24ndCB0ZXN0IG5lZ2F0aXZlIHZhbHVlcyB0aG91Z2guCi0jZGVmaW5lIE1JTl9ERUxUQSAwICAgLy8gaG93IG11Y2ggbG93ZXIgbGV2ZWwgdG8gdHJ5Ci0jZGVmaW5lIE1BWF9ERUxUQSAxICAgLy8gaG93IG11Y2ggaGlnaGVyCi0jZGVmaW5lIE5VTV9OT0RFUyAoTUlOX0RFTFRBICsgMSArIE1BWF9ERUxUQSkKLSNkZWZpbmUgTk9ERShuLCBsKSAobm9kZXNbKG4pICsgMV1bKGwpICsgTUlOX0RFTFRBXSkKLQotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgU2V0UkRTY29yZShpbnQgbGFtYmRhLCBWUDhNb2RlU2NvcmUqIGNvbnN0IHJkKSB7Ci0gIC8vIFRPRE86IGluY29ycG9yYXRlIHRoZSAiKiAyNTYiIGluIHRoZSB0YWJsZXM/Ci0gIHJkLT5zY29yZSA9IHJkLT5SICogbGFtYmRhICsgMjU2ICogKHJkLT5EICsgcmQtPlNEKTsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHNjb3JlX3QgUkRTY29yZVRyZWxsaXMoaW50IGxhbWJkYSwgc2NvcmVfdCByYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcmVfdCBkaXN0b3J0aW9uKSB7Ci0gIHJldHVybiByYXRlICogbGFtYmRhICsgMjU2ICogZGlzdG9ydGlvbjsKLX0KLQotc3RhdGljIGludCBUcmVsbGlzUXVhbnRpemVCbG9jayhjb25zdCBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgaW5bMTZdLCBpbnQxNl90IG91dFsxNl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjdHgwLCBpbnQgY29lZmZfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TWF0cml4KiBjb25zdCBtdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsYW1iZGEpIHsKLSAgUHJvYmFBcnJheSogY29uc3QgbGFzdF9jb3N0cyA9IGl0LT5lbmNfLT5wcm9iYV8uY29lZmZzX1tjb2VmZl90eXBlXTsKLSAgQ29zdEFycmF5KiBjb25zdCBjb3N0cyA9IGl0LT5lbmNfLT5wcm9iYV8ubGV2ZWxfY29zdF9bY29lZmZfdHlwZV07Ci0gIGNvbnN0IGludCBmaXJzdCA9IChjb2VmZl90eXBlID09IDApID8gMSA6IDA7Ci0gIE5vZGUgbm9kZXNbMTddW05VTV9OT0RFU107Ci0gIGludCBiZXN0X3BhdGhbM10gPSB7LTEsIC0xLCAtMX07ICAgLy8gc3RvcmUgYmVzdC1sYXN0L2Jlc3QtbGV2ZWwvYmVzdC1wcmV2aW91cwotICBzY29yZV90IGJlc3Rfc2NvcmU7Ci0gIGludCBiZXN0X25vZGU7Ci0gIGludCBsYXN0ID0gZmlyc3QgLSAxOwotICBpbnQgbiwgbSwgcCwgbno7Ci0KLSAgewotICAgIHNjb3JlX3QgY29zdDsKLSAgICBzY29yZV90IG1heF9lcnJvcjsKLSAgICBjb25zdCBpbnQgdGhyZXNoID0gbXR4LT5xX1sxXSAqIG10eC0+cV9bMV0gLyA0OwotICAgIGNvbnN0IGludCBsYXN0X3Byb2JhID0gbGFzdF9jb3N0c1tWUDhFbmNCYW5kc1tmaXJzdF1dW2N0eDBdWzBdOwotCi0gICAgLy8gY29tcHV0ZSBtYXhpbWFsIGRpc3RvcnRpb24uCi0gICAgbWF4X2Vycm9yID0gMDsKLSAgICBmb3IgKG4gPSBmaXJzdDsgbiA8IDE2OyArK24pIHsKLSAgICAgIGNvbnN0IGludCBqICA9IGtaaWd6YWdbbl07Ci0gICAgICBjb25zdCBpbnQgZXJyID0gaW5bal0gKiBpbltqXTsKLSAgICAgIG1heF9lcnJvciArPSBrV2VpZ2h0VHJlbGxpc1tqXSAqIGVycjsKLSAgICAgIGlmIChlcnIgPiB0aHJlc2gpIGxhc3QgPSBuOwotICAgIH0KLSAgICAvLyB3ZSBkb24ndCBuZWVkIHRvIGdvIGluc3BlY3QgdXAgdG8gbiA9IDE2IGNvZWZmcy4gV2UgY2FuIGp1c3QgZ28gdXAKLSAgICAvLyB0byBsYXN0ICsgMSAoaW5jbHVzaXZlKSB3aXRob3V0IGxvc2luZyBtdWNoLgotICAgIGlmIChsYXN0IDwgMTUpICsrbGFzdDsKLQotICAgIC8vIGNvbXB1dGUgJ3NraXAnIHNjb3JlLiBUaGlzIGlzIHRoZSBtYXggc2NvcmUgb25lIGNhbiBkby4KLSAgICBjb3N0ID0gVlA4Qml0Q29zdCgwLCBsYXN0X3Byb2JhKTsKLSAgICBiZXN0X3Njb3JlID0gUkRTY29yZVRyZWxsaXMobGFtYmRhLCBjb3N0LCBtYXhfZXJyb3IpOwotCi0gICAgLy8gaW5pdGlhbGl6ZSBzb3VyY2Ugbm9kZS4KLSAgICBuID0gZmlyc3QgLSAxOwotICAgIGZvciAobSA9IC1NSU5fREVMVEE7IG0gPD0gTUFYX0RFTFRBOyArK20pIHsKLSAgICAgIE5PREUobiwgbSkuY29zdCA9IDA7Ci0gICAgICBOT0RFKG4sIG0pLmVycm9yID0gbWF4X2Vycm9yOwotICAgICAgTk9ERShuLCBtKS5jdHggPSBjdHgwOwotICAgIH0KLSAgfQotCi0gIC8vIHRyYXZlcnNlIHRyZWxsaXMuCi0gIGZvciAobiA9IGZpcnN0OyBuIDw9IGxhc3Q7ICsrbikgewotICAgIGNvbnN0IGludCBqICA9IGtaaWd6YWdbbl07Ci0gICAgY29uc3QgaW50IFEgID0gbXR4LT5xX1tqXTsKLSAgICBjb25zdCBpbnQgaVEgPSBtdHgtPmlxX1tqXTsKLSAgICBjb25zdCBpbnQgQiA9IEJJQVMoMHgwMCk7ICAgICAvLyBuZXV0cmFsIGJpYXMKLSAgICAvLyBub3RlOiBpdCdzIGltcG9ydGFudCB0byB0YWtlIHNpZ24gb2YgdGhlIF9vcmlnaW5hbF8gY29lZmYsCi0gICAgLy8gc28gd2UgZG9uJ3QgaGF2ZSB0byBjb25zaWRlciBsZXZlbCA8IDAgYWZ0ZXJ3YXJkLgotICAgIGNvbnN0IGludCBzaWduID0gKGluW2pdIDwgMCk7Ci0gICAgaW50IGNvZWZmMCA9IChzaWduID8gLWluW2pdIDogaW5bal0pICsgbXR4LT5zaGFycGVuX1tqXTsKLSAgICBpbnQgbGV2ZWwwOwotICAgIGlmIChjb2VmZjAgPiAyMDQ3KSBjb2VmZjAgPSAyMDQ3OwotCi0gICAgbGV2ZWwwID0gUVVBTlRESVYoY29lZmYwLCBpUSwgQik7Ci0gICAgLy8gdGVzdCBhbGwgYWx0ZXJuYXRlIGxldmVsIHZhbHVlcyBhcm91bmQgbGV2ZWwwLgotICAgIGZvciAobSA9IC1NSU5fREVMVEE7IG0gPD0gTUFYX0RFTFRBOyArK20pIHsKLSAgICAgIE5vZGUqIGNvbnN0IGN1ciA9ICZOT0RFKG4sIG0pOwotICAgICAgaW50IGRlbHRhX2Vycm9yLCBuZXdfZXJyb3I7Ci0gICAgICBzY29yZV90IGN1cl9zY29yZSA9IE1BWF9DT1NUOwotICAgICAgaW50IGxldmVsID0gbGV2ZWwwICsgbTsKLSAgICAgIGludCBsYXN0X3Byb2JhOwotCi0gICAgICBjdXItPnNpZ24gPSBzaWduOwotICAgICAgY3VyLT5sZXZlbCA9IGxldmVsOwotICAgICAgY3VyLT5jdHggPSAobGV2ZWwgPT0gMCkgPyAwIDogKGxldmVsID09IDEpID8gMSA6IDI7Ci0gICAgICBpZiAobGV2ZWwgPj0gMjA0OCB8fCBsZXZlbCA8IDApIHsgICAvLyBub2RlIGlzIGRlYWQ/Ci0gICAgICAgIGN1ci0+Y29zdCA9IE1BWF9DT1NUOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGxhc3RfcHJvYmEgPSBsYXN0X2Nvc3RzW1ZQOEVuY0JhbmRzW24gKyAxXV1bY3VyLT5jdHhdWzBdOwotCi0gICAgICAvLyBDb21wdXRlIGRlbHRhX2Vycm9yID0gaG93IG11Y2ggY29kaW5nIHRoaXMgbGV2ZWwgd2lsbAotICAgICAgLy8gc3VidHJhY3QgYXMgZGlzdG9ydGlvbiB0byBtYXhfZXJyb3IKLSAgICAgIG5ld19lcnJvciA9IGNvZWZmMCAtIGxldmVsICogUTsKLSAgICAgIGRlbHRhX2Vycm9yID0KLSAgICAgICAga1dlaWdodFRyZWxsaXNbal0gKiAoY29lZmYwICogY29lZmYwIC0gbmV3X2Vycm9yICogbmV3X2Vycm9yKTsKLQotICAgICAgLy8gSW5zcGVjdCBhbGwgcG9zc2libGUgbm9uLWRlYWQgcHJlZGVjZXNzb3JzLiBSZXRhaW4gb25seSB0aGUgYmVzdCBvbmUuCi0gICAgICBmb3IgKHAgPSAtTUlOX0RFTFRBOyBwIDw9IE1BWF9ERUxUQTsgKytwKSB7Ci0gICAgICAgIGNvbnN0IE5vZGUqIGNvbnN0IHByZXYgPSAmTk9ERShuIC0gMSwgcCk7Ci0gICAgICAgIGNvbnN0IGludCBwcmV2X2N0eCA9IHByZXYtPmN0eDsKLSAgICAgICAgY29uc3QgdWludDE2X3QqIGNvbnN0IHRjb3N0ID0gY29zdHNbVlA4RW5jQmFuZHNbbl1dW3ByZXZfY3R4XTsKLSAgICAgICAgY29uc3Qgc2NvcmVfdCB0b3RhbF9lcnJvciA9IHByZXYtPmVycm9yIC0gZGVsdGFfZXJyb3I7Ci0gICAgICAgIHNjb3JlX3QgY29zdCwgYmFzZV9jb3N0LCBzY29yZTsKLQotICAgICAgICBpZiAocHJldi0+Y29zdCA+PSBNQVhfQ09TVCkgeyAgIC8vIGRlYWQgbm9kZT8KLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEJhc2UgY29zdCBvZiBib3RoIHRlcm1pbmFsL25vbi10ZXJtaW5hbAotICAgICAgICBiYXNlX2Nvc3QgPSBwcmV2LT5jb3N0ICsgVlA4TGV2ZWxDb3N0KHRjb3N0LCBsZXZlbCk7Ci0KLSAgICAgICAgLy8gRXhhbWluZSBub2RlIGFzc3VtaW5nIGl0J3MgYSBub24tdGVybWluYWwgb25lLgotICAgICAgICBjb3N0ID0gYmFzZV9jb3N0OwotICAgICAgICBpZiAobGV2ZWwgJiYgbiA8IDE1KSB7Ci0gICAgICAgICAgY29zdCArPSBWUDhCaXRDb3N0KDEsIGxhc3RfcHJvYmEpOwotICAgICAgICB9Ci0gICAgICAgIHNjb3JlID0gUkRTY29yZVRyZWxsaXMobGFtYmRhLCBjb3N0LCB0b3RhbF9lcnJvcik7Ci0gICAgICAgIGlmIChzY29yZSA8IGN1cl9zY29yZSkgewotICAgICAgICAgIGN1cl9zY29yZSA9IHNjb3JlOwotICAgICAgICAgIGN1ci0+Y29zdCAgPSBjb3N0OwotICAgICAgICAgIGN1ci0+ZXJyb3IgPSB0b3RhbF9lcnJvcjsKLSAgICAgICAgICBjdXItPnByZXYgID0gcDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5vdywgcmVjb3JkIGJlc3QgdGVybWluYWwgbm9kZSAoYW5kIHRodXMgYmVzdCBlbnRyeSBpbiB0aGUgZ3JhcGgpLgotICAgICAgICBpZiAobGV2ZWwpIHsKLSAgICAgICAgICBjb3N0ID0gYmFzZV9jb3N0OwotICAgICAgICAgIGlmIChuIDwgMTUpIGNvc3QgKz0gVlA4Qml0Q29zdCgwLCBsYXN0X3Byb2JhKTsKLSAgICAgICAgICBzY29yZSA9IFJEU2NvcmVUcmVsbGlzKGxhbWJkYSwgY29zdCwgdG90YWxfZXJyb3IpOwotICAgICAgICAgIGlmIChzY29yZSA8IGJlc3Rfc2NvcmUpIHsKLSAgICAgICAgICAgIGJlc3Rfc2NvcmUgPSBzY29yZTsKLSAgICAgICAgICAgIGJlc3RfcGF0aFswXSA9IG47ICAgLy8gYmVzdCBlb2IgcG9zaXRpb24KLSAgICAgICAgICAgIGJlc3RfcGF0aFsxXSA9IG07ICAgLy8gYmVzdCBsZXZlbAotICAgICAgICAgICAgYmVzdF9wYXRoWzJdID0gcDsgICAvLyBiZXN0IHByZWRlY2Vzc29yCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLy8gRnJlc2ggc3RhcnQKLSAgU2JNZW1vcnlTZXQoaW4gKyBmaXJzdCwgMCwgKDE2IC0gZmlyc3QpICogc2l6ZW9mKCppbikpOwotICBTYk1lbW9yeVNldChvdXQgKyBmaXJzdCwgMCwgKDE2IC0gZmlyc3QpICogc2l6ZW9mKCpvdXQpKTsKLSAgaWYgKGJlc3RfcGF0aFswXSA9PSAtMSkgewotICAgIHJldHVybiAwOyAgIC8vIHNraXAhCi0gIH0KLQotICAvLyBVbndpbmQgdGhlIGJlc3QgcGF0aC4KLSAgLy8gTm90ZTogYmVzdC1wcmV2IG9uIHRlcm1pbmFsIG5vZGUgaXMgbm90IG5lY2Vzc2FyaWx5IGVxdWFsIHRvIHRoZQotICAvLyBiZXN0X3ByZXYgZm9yIG5vbi10ZXJtaW5hbC4gU28gd2UgcGF0Y2ggYmVzdF9wYXRoWzJdIGluLgotICBuID0gYmVzdF9wYXRoWzBdOwotICBiZXN0X25vZGUgPSBiZXN0X3BhdGhbMV07Ci0gIE5PREUobiwgYmVzdF9ub2RlKS5wcmV2ID0gYmVzdF9wYXRoWzJdOyAgIC8vIGZvcmNlIGJlc3QtcHJldiBmb3IgdGVybWluYWwKLSAgbnogPSAwOwotCi0gIGZvciAoOyBuID49IGZpcnN0OyAtLW4pIHsKLSAgICBjb25zdCBOb2RlKiBjb25zdCBub2RlID0gJk5PREUobiwgYmVzdF9ub2RlKTsKLSAgICBjb25zdCBpbnQgaiA9IGtaaWd6YWdbbl07Ci0gICAgb3V0W25dID0gbm9kZS0+c2lnbiA/IC1ub2RlLT5sZXZlbCA6IG5vZGUtPmxldmVsOwotICAgIG56IHw9IChub2RlLT5sZXZlbCAhPSAwKTsKLSAgICBpbltqXSA9IG91dFtuXSAqIG10eC0+cV9bal07Ci0gICAgYmVzdF9ub2RlID0gbm9kZS0+cHJldjsKLSAgfQotICByZXR1cm4gbno7Ci19Ci0KLSN1bmRlZiBOT0RFCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBQZXJmb3JtczogZGlmZmVyZW5jZSwgdHJhbnNmb3JtLCBxdWFudGl6ZSwgYmFjay10cmFuc2Zvcm0sIGFkZAotLy8gYWxsIGF0IG9uY2UuIE91dHB1dCBpcyB0aGUgcmVjb25zdHJ1Y3RlZCBibG9jayBpbiAqeXV2X291dCwgYW5kIHRoZQotLy8gcXVhbnRpemVkIGxldmVscyBpbiAqbGV2ZWxzLgotCi1zdGF0aWMgaW50IFJlY29uc3RydWN0SW50cmExNihWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhNb2RlU2NvcmUqIGNvbnN0IHJkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgeXV2X291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RlKSB7Ci0gIGNvbnN0IFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOwotICBjb25zdCB1aW50OF90KiBjb25zdCByZWYgPSBpdC0+eXV2X3BfICsgVlA4STE2TW9kZU9mZnNldHNbbW9kZV07Ci0gIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHNyYyA9IGl0LT55dXZfaW5fICsgWV9PRkY7Ci0gIGNvbnN0IFZQOFNlZ21lbnRJbmZvKiBjb25zdCBkcW0gPSAmZW5jLT5kcW1fW2l0LT5tYl8tPnNlZ21lbnRfXTsKLSAgaW50IG56ID0gMDsKLSAgaW50IG47Ci0gIGludDE2X3QgdG1wWzE2XVsxNl0sIGRjX3RtcFsxNl07Ci0KLSAgZm9yIChuID0gMDsgbiA8IDE2OyArK24pIHsKLSAgICBWUDhGVHJhbnNmb3JtKHNyYyArIFZQOFNjYW5bbl0sIHJlZiArIFZQOFNjYW5bbl0sIHRtcFtuXSk7Ci0gIH0KLSAgVlA4RlRyYW5zZm9ybVdIVCh0bXBbMF0sIGRjX3RtcCk7Ci0gIG56IHw9IFZQOEVuY1F1YW50aXplQmxvY2soZGNfdG1wLCByZC0+eV9kY19sZXZlbHMsIDAsICZkcW0tPnkyXykgPDwgMjQ7Ci0KLSAgaWYgKERPX1RSRUxMSVNfSTE2ICYmIGl0LT5kb190cmVsbGlzXykgewotICAgIGludCB4LCB5OwotICAgIFZQOEl0ZXJhdG9yTnpUb0J5dGVzKGl0KTsKLSAgICBmb3IgKHkgPSAwLCBuID0gMDsgeSA8IDQ7ICsreSkgewotICAgICAgZm9yICh4ID0gMDsgeCA8IDQ7ICsreCwgKytuKSB7Ci0gICAgICAgIGNvbnN0IGludCBjdHggPSBpdC0+dG9wX256X1t4XSArIGl0LT5sZWZ0X256X1t5XTsKLSAgICAgICAgY29uc3QgaW50IG5vbl96ZXJvID0KLSAgICAgICAgICAgVHJlbGxpc1F1YW50aXplQmxvY2soaXQsIHRtcFtuXSwgcmQtPnlfYWNfbGV2ZWxzW25dLCBjdHgsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkcW0tPnkxXywgZHFtLT5sYW1iZGFfdHJlbGxpc19pMTZfKTsKLSAgICAgICAgaXQtPnRvcF9uel9beF0gPSBpdC0+bGVmdF9uel9beV0gPSBub25femVybzsKLSAgICAgICAgbnogfD0gbm9uX3plcm8gPDwgbjsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgZm9yIChuID0gMDsgbiA8IDE2OyArK24pIHsKLSAgICAgIG56IHw9IFZQOEVuY1F1YW50aXplQmxvY2sodG1wW25dLCByZC0+eV9hY19sZXZlbHNbbl0sIDEsICZkcW0tPnkxXykgPDwgbjsKLSAgICB9Ci0gIH0KLQotICAvLyBUcmFuc2Zvcm0gYmFjawotICBWUDhJVHJhbnNmb3JtV0hUKGRjX3RtcCwgdG1wWzBdKTsKLSAgZm9yIChuID0gMDsgbiA8IDE2OyBuICs9IDIpIHsKLSAgICBWUDhJVHJhbnNmb3JtKHJlZiArIFZQOFNjYW5bbl0sIHRtcFtuXSwgeXV2X291dCArIFZQOFNjYW5bbl0sIDEpOwotICB9Ci0KLSAgcmV0dXJuIG56OwotfQotCi1zdGF0aWMgaW50IFJlY29uc3RydWN0SW50cmE0KFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCBsZXZlbHNbMTZdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IHl1dl9vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RlKSB7Ci0gIGNvbnN0IFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOwotICBjb25zdCB1aW50OF90KiBjb25zdCByZWYgPSBpdC0+eXV2X3BfICsgVlA4STRNb2RlT2Zmc2V0c1ttb2RlXTsKLSAgY29uc3QgVlA4U2VnbWVudEluZm8qIGNvbnN0IGRxbSA9ICZlbmMtPmRxbV9baXQtPm1iXy0+c2VnbWVudF9dOwotICBpbnQgbnogPSAwOwotICBpbnQxNl90IHRtcFsxNl07Ci0KLSAgVlA4RlRyYW5zZm9ybShzcmMsIHJlZiwgdG1wKTsKLSAgaWYgKERPX1RSRUxMSVNfSTQgJiYgaXQtPmRvX3RyZWxsaXNfKSB7Ci0gICAgY29uc3QgaW50IHggPSBpdC0+aTRfICYgMywgeSA9IGl0LT5pNF8gPj4gMjsKLSAgICBjb25zdCBpbnQgY3R4ID0gaXQtPnRvcF9uel9beF0gKyBpdC0+bGVmdF9uel9beV07Ci0gICAgbnogPSBUcmVsbGlzUXVhbnRpemVCbG9jayhpdCwgdG1wLCBsZXZlbHMsIGN0eCwgMywgJmRxbS0+eTFfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHFtLT5sYW1iZGFfdHJlbGxpc19pNF8pOwotICB9IGVsc2UgewotICAgIG56ID0gVlA4RW5jUXVhbnRpemVCbG9jayh0bXAsIGxldmVscywgMCwgJmRxbS0+eTFfKTsKLSAgfQotICBWUDhJVHJhbnNmb3JtKHJlZiwgdG1wLCB5dXZfb3V0LCAwKTsKLSAgcmV0dXJuIG56OwotfQotCi1zdGF0aWMgaW50IFJlY29uc3RydWN0VVYoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBWUDhNb2RlU2NvcmUqIGNvbnN0IHJkLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IHl1dl9vdXQsIGludCBtb2RlKSB7Ci0gIGNvbnN0IFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOwotICBjb25zdCB1aW50OF90KiBjb25zdCByZWYgPSBpdC0+eXV2X3BfICsgVlA4VVZNb2RlT2Zmc2V0c1ttb2RlXTsKLSAgY29uc3QgdWludDhfdCogY29uc3Qgc3JjID0gaXQtPnl1dl9pbl8gKyBVX09GRjsKLSAgY29uc3QgVlA4U2VnbWVudEluZm8qIGNvbnN0IGRxbSA9ICZlbmMtPmRxbV9baXQtPm1iXy0+c2VnbWVudF9dOwotICBpbnQgbnogPSAwOwotICBpbnQgbjsKLSAgaW50MTZfdCB0bXBbOF1bMTZdOwotCi0gIGZvciAobiA9IDA7IG4gPCA4OyArK24pIHsKLSAgICBWUDhGVHJhbnNmb3JtKHNyYyArIFZQOFNjYW5bMTYgKyBuXSwgcmVmICsgVlA4U2NhblsxNiArIG5dLCB0bXBbbl0pOwotICB9Ci0gIGlmIChET19UUkVMTElTX1VWICYmIGl0LT5kb190cmVsbGlzXykgewotICAgIGludCBjaCwgeCwgeTsKLSAgICBmb3IgKGNoID0gMCwgbiA9IDA7IGNoIDw9IDI7IGNoICs9IDIpIHsKLSAgICAgIGZvciAoeSA9IDA7IHkgPCAyOyArK3kpIHsKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IDI7ICsreCwgKytuKSB7Ci0gICAgICAgICAgY29uc3QgaW50IGN0eCA9IGl0LT50b3BfbnpfWzQgKyBjaCArIHhdICsgaXQtPmxlZnRfbnpfWzQgKyBjaCArIHldOwotICAgICAgICAgIGNvbnN0IGludCBub25femVybyA9Ci0gICAgICAgICAgICBUcmVsbGlzUXVhbnRpemVCbG9jayhpdCwgdG1wW25dLCByZC0+dXZfbGV2ZWxzW25dLCBjdHgsIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHFtLT51dl8sIGRxbS0+bGFtYmRhX3RyZWxsaXNfdXZfKTsKLSAgICAgICAgICBpdC0+dG9wX256X1s0ICsgY2ggKyB4XSA9IGl0LT5sZWZ0X256X1s0ICsgY2ggKyB5XSA9IG5vbl96ZXJvOwotICAgICAgICAgIG56IHw9IG5vbl96ZXJvIDw8IG47Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgZm9yIChuID0gMDsgbiA8IDg7ICsrbikgewotICAgICAgbnogfD0gVlA4RW5jUXVhbnRpemVCbG9jayh0bXBbbl0sIHJkLT51dl9sZXZlbHNbbl0sIDAsICZkcW0tPnV2XykgPDwgbjsKLSAgICB9Ci0gIH0KLQotICBmb3IgKG4gPSAwOyBuIDwgODsgbiArPSAyKSB7Ci0gICAgVlA4SVRyYW5zZm9ybShyZWYgKyBWUDhTY2FuWzE2ICsgbl0sIHRtcFtuXSwgeXV2X291dCArIFZQOFNjYW5bMTYgKyBuXSwgMSk7Ci0gIH0KLSAgcmV0dXJuIChueiA8PCAxNik7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBSRC1vcHQgZGVjaXNpb24uIFJlY29uc3RydWN0IGVhY2ggbW9kZXMsIGV2YWx1ZSBkaXN0b3J0aW9uIGFuZCBiaXQtY29zdC4KLS8vIFBpY2sgdGhlIG1vZGUgaXMgbG93ZXIgUkQtY29zdCA9IFJhdGUgKyBsYW1iYSAqIERpc3RvcnRpb24uCi0KLXN0YXRpYyB2b2lkIFN3YXBQdHIodWludDhfdCoqIGEsIHVpbnQ4X3QqKiBiKSB7Ci0gIHVpbnQ4X3QqIGNvbnN0IHRtcCA9ICphOwotICAqYSA9ICpiOwotICAqYiA9IHRtcDsKLX0KLQotc3RhdGljIHZvaWQgU3dhcE91dChWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKLSAgU3dhcFB0cigmaXQtPnl1dl9vdXRfLCAmaXQtPnl1dl9vdXQyXyk7Ci19Ci0KLXN0YXRpYyB2b2lkIFBpY2tCZXN0SW50cmExNihWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsIFZQOE1vZGVTY29yZSogY29uc3QgcmQpIHsKLSAgY29uc3QgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187Ci0gIGNvbnN0IFZQOFNlZ21lbnRJbmZvKiBjb25zdCBkcW0gPSAmZW5jLT5kcW1fW2l0LT5tYl8tPnNlZ21lbnRfXTsKLSAgY29uc3QgaW50IGxhbWJkYSA9IGRxbS0+bGFtYmRhX2kxNl87Ci0gIGNvbnN0IGludCB0bGFtYmRhID0gZHFtLT50bGFtYmRhXzsKLSAgY29uc3QgdWludDhfdCogY29uc3Qgc3JjID0gaXQtPnl1dl9pbl8gKyBZX09GRjsKLSAgVlA4TW9kZVNjb3JlIHJkMTY7Ci0gIGludCBtb2RlOwotCi0gIHJkLT5tb2RlX2kxNiA9IC0xOwotICBmb3IgKG1vZGUgPSAwOyBtb2RlIDwgTlVNX1BSRURfTU9ERVM7ICsrbW9kZSkgewotICAgIHVpbnQ4X3QqIGNvbnN0IHRtcF9kc3QgPSBpdC0+eXV2X291dDJfICsgWV9PRkY7ICAvLyBzY3JhdGNoIGJ1ZmZlcgotICAgIGludCBuejsKLQotICAgIC8vIFJlY29uc3RydWN0Ci0gICAgbnogPSBSZWNvbnN0cnVjdEludHJhMTYoaXQsICZyZDE2LCB0bXBfZHN0LCBtb2RlKTsKLQotICAgIC8vIE1lYXN1cmUgUkQtc2NvcmUKLSAgICByZDE2LkQgPSBWUDhTU0UxNngxNihzcmMsIHRtcF9kc3QpOwotICAgIHJkMTYuU0QgPSB0bGFtYmRhID8gTVVMVF84Qih0bGFtYmRhLCBWUDhURGlzdG8xNngxNihzcmMsIHRtcF9kc3QsIGtXZWlnaHRZKSkKLSAgICAgICAgICAgIDogMDsKLSAgICByZDE2LlIgPSBWUDhHZXRDb3N0THVtYTE2KGl0LCAmcmQxNik7Ci0gICAgcmQxNi5SICs9IFZQOEZpeGVkQ29zdHNJMTZbbW9kZV07Ci0KLSAgICAvLyBTaW5jZSB3ZSBhbHdheXMgZXhhbWluZSBJbnRyYTE2IGZpcnN0LCB3ZSBjYW4gb3ZlcndyaXRlICpyZCBkaXJlY3RseS4KLSAgICBTZXRSRFNjb3JlKGxhbWJkYSwgJnJkMTYpOwotICAgIGlmIChtb2RlID09IDAgfHwgcmQxNi5zY29yZSA8IHJkLT5zY29yZSkgewotICAgICAgQ29weVNjb3JlKHJkLCAmcmQxNik7Ci0gICAgICByZC0+bW9kZV9pMTYgPSBtb2RlOwotICAgICAgcmQtPm56ID0gbno7Ci0gICAgICBTYk1lbW9yeUNvcHkocmQtPnlfYWNfbGV2ZWxzLCByZDE2LnlfYWNfbGV2ZWxzLCBzaXplb2YocmQxNi55X2FjX2xldmVscykpOwotICAgICAgU2JNZW1vcnlDb3B5KHJkLT55X2RjX2xldmVscywgcmQxNi55X2RjX2xldmVscywgc2l6ZW9mKHJkMTYueV9kY19sZXZlbHMpKTsKLSAgICAgIFN3YXBPdXQoaXQpOwotICAgIH0KLSAgfQotICBTZXRSRFNjb3JlKGRxbS0+bGFtYmRhX21vZGVfLCByZCk7ICAgLy8gZmluYWxpemUgc2NvcmUgZm9yIG1vZGUgZGVjaXNpb24uCi0gIFZQOFNldEludHJhMTZNb2RlKGl0LCByZC0+bW9kZV9pMTYpOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyByZXR1cm4gdGhlIGNvc3QgYXJyYXkgY29ycmVzcG9uZGluZyB0byB0aGUgc3Vycm91bmRpbmcgcHJlZGljdGlvbiBtb2Rlcy4KLXN0YXRpYyBjb25zdCB1aW50MTZfdCogR2V0Q29zdE1vZGVJNChWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBtb2Rlc1sxNl0pIHsKLSAgY29uc3QgaW50IHByZWRzX3cgPSBpdC0+ZW5jXy0+cHJlZHNfd187Ci0gIGNvbnN0IGludCB4ID0gKGl0LT5pNF8gJiAzKSwgeSA9IGl0LT5pNF8gPj4gMjsKLSAgY29uc3QgaW50IGxlZnQgPSAoeCA9PSAwKSA/IGl0LT5wcmVkc19beSAqIHByZWRzX3cgLSAxXSA6IG1vZGVzW2l0LT5pNF8gLSAxXTsKLSAgY29uc3QgaW50IHRvcCA9ICh5ID09IDApID8gaXQtPnByZWRzX1stcHJlZHNfdyArIHhdIDogbW9kZXNbaXQtPmk0XyAtIDRdOwotICByZXR1cm4gVlA4Rml4ZWRDb3N0c0k0W3RvcF1bbGVmdF07Ci19Ci0KLXN0YXRpYyBpbnQgUGlja0Jlc3RJbnRyYTQoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBWUDhNb2RlU2NvcmUqIGNvbnN0IHJkKSB7Ci0gIGNvbnN0IFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOwotICBjb25zdCBWUDhTZWdtZW50SW5mbyogY29uc3QgZHFtID0gJmVuYy0+ZHFtX1tpdC0+bWJfLT5zZWdtZW50X107Ci0gIGNvbnN0IGludCBsYW1iZGEgPSBkcW0tPmxhbWJkYV9pNF87Ci0gIGNvbnN0IGludCB0bGFtYmRhID0gZHFtLT50bGFtYmRhXzsKLSAgY29uc3QgdWludDhfdCogY29uc3Qgc3JjMCA9IGl0LT55dXZfaW5fICsgWV9PRkY7Ci0gIHVpbnQ4X3QqIGNvbnN0IGJlc3RfYmxvY2tzID0gaXQtPnl1dl9vdXQyXyArIFlfT0ZGOwotICBpbnQgdG90YWxfaGVhZGVyX2JpdHMgPSAwOwotICBWUDhNb2RlU2NvcmUgcmRfYmVzdDsKLQotICBpZiAoZW5jLT5tYXhfaTRfaGVhZGVyX2JpdHNfID09IDApIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIEluaXRTY29yZSgmcmRfYmVzdCk7Ci0gIHJkX2Jlc3Quc2NvcmUgPSAyMTE7ICAvLyAnMjExJyBpcyB0aGUgdmFsdWUgb2YgVlA4Qml0Q29zdCgwLCAxNDUpCi0gIFZQOEl0ZXJhdG9yU3RhcnRJNChpdCk7Ci0gIGRvIHsKLSAgICBWUDhNb2RlU2NvcmUgcmRfaTQ7Ci0gICAgaW50IG1vZGU7Ci0gICAgaW50IGJlc3RfbW9kZSA9IC0xOwotICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHNyYyA9IHNyYzAgKyBWUDhTY2FuW2l0LT5pNF9dOwotICAgIGNvbnN0IHVpbnQxNl90KiBjb25zdCBtb2RlX2Nvc3RzID0gR2V0Q29zdE1vZGVJNChpdCwgcmQtPm1vZGVzX2k0KTsKLSAgICB1aW50OF90KiBiZXN0X2Jsb2NrID0gYmVzdF9ibG9ja3MgKyBWUDhTY2FuW2l0LT5pNF9dOwotICAgIHVpbnQ4X3QqIHRtcF9kc3QgPSBpdC0+eXV2X3BfICsgSTRUTVA7ICAgIC8vIHNjcmF0Y2ggYnVmZmVyLgotCi0gICAgSW5pdFNjb3JlKCZyZF9pNCk7Ci0gICAgVlA4TWFrZUludHJhNFByZWRzKGl0KTsKLSAgICBmb3IgKG1vZGUgPSAwOyBtb2RlIDwgTlVNX0JNT0RFUzsgKyttb2RlKSB7Ci0gICAgICBWUDhNb2RlU2NvcmUgcmRfdG1wOwotICAgICAgaW50MTZfdCB0bXBfbGV2ZWxzWzE2XTsKLQotICAgICAgLy8gUmVjb25zdHJ1Y3QKLSAgICAgIHJkX3RtcC5ueiA9Ci0gICAgICAgICAgUmVjb25zdHJ1Y3RJbnRyYTQoaXQsIHRtcF9sZXZlbHMsIHNyYywgdG1wX2RzdCwgbW9kZSkgPDwgaXQtPmk0XzsKLQotICAgICAgLy8gQ29tcHV0ZSBSRC1zY29yZQotICAgICAgcmRfdG1wLkQgPSBWUDhTU0U0eDQoc3JjLCB0bXBfZHN0KTsKLSAgICAgIHJkX3RtcC5TRCA9Ci0gICAgICAgICAgdGxhbWJkYSA/IE1VTFRfOEIodGxhbWJkYSwgVlA4VERpc3RvNHg0KHNyYywgdG1wX2RzdCwga1dlaWdodFkpKQotICAgICAgICAgICAgICAgICAgOiAwOwotICAgICAgcmRfdG1wLlIgPSBWUDhHZXRDb3N0THVtYTQoaXQsIHRtcF9sZXZlbHMpOwotICAgICAgcmRfdG1wLlIgKz0gbW9kZV9jb3N0c1ttb2RlXTsKLQotICAgICAgU2V0UkRTY29yZShsYW1iZGEsICZyZF90bXApOwotICAgICAgaWYgKGJlc3RfbW9kZSA8IDAgfHwgcmRfdG1wLnNjb3JlIDwgcmRfaTQuc2NvcmUpIHsKLSAgICAgICAgQ29weVNjb3JlKCZyZF9pNCwgJnJkX3RtcCk7Ci0gICAgICAgIGJlc3RfbW9kZSA9IG1vZGU7Ci0gICAgICAgIFN3YXBQdHIoJnRtcF9kc3QsICZiZXN0X2Jsb2NrKTsKLSAgICAgICAgU2JNZW1vcnlDb3B5KHJkX2Jlc3QueV9hY19sZXZlbHNbaXQtPmk0X10sIHRtcF9sZXZlbHMsIHNpemVvZih0bXBfbGV2ZWxzKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIFNldFJEU2NvcmUoZHFtLT5sYW1iZGFfbW9kZV8sICZyZF9pNCk7Ci0gICAgQWRkU2NvcmUoJnJkX2Jlc3QsICZyZF9pNCk7Ci0gICAgdG90YWxfaGVhZGVyX2JpdHMgKz0gbW9kZV9jb3N0c1tiZXN0X21vZGVdOwotICAgIGlmIChyZF9iZXN0LnNjb3JlID49IHJkLT5zY29yZSB8fAotICAgICAgICB0b3RhbF9oZWFkZXJfYml0cyA+IGVuYy0+bWF4X2k0X2hlYWRlcl9iaXRzXykgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIC8vIENvcHkgc2VsZWN0ZWQgc2FtcGxlcyBpZiBub3QgaW4gdGhlIHJpZ2h0IHBsYWNlIGFscmVhZHkuCi0gICAgaWYgKGJlc3RfYmxvY2sgIT0gYmVzdF9ibG9ja3MgKyBWUDhTY2FuW2l0LT5pNF9dKQotICAgICAgVlA4Q29weTR4NChiZXN0X2Jsb2NrLCBiZXN0X2Jsb2NrcyArIFZQOFNjYW5baXQtPmk0X10pOwotICAgIHJkLT5tb2Rlc19pNFtpdC0+aTRfXSA9IGJlc3RfbW9kZTsKLSAgICBpdC0+dG9wX256X1tpdC0+aTRfICYgM10gPSBpdC0+bGVmdF9uel9baXQtPmk0XyA+PiAyXSA9IChyZF9pNC5ueiA/IDEgOiAwKTsKLSAgfSB3aGlsZSAoVlA4SXRlcmF0b3JSb3RhdGVJNChpdCwgYmVzdF9ibG9ja3MpKTsKLQotICAvLyBmaW5hbGl6ZSBzdGF0ZQotICBDb3B5U2NvcmUocmQsICZyZF9iZXN0KTsKLSAgVlA4U2V0SW50cmE0TW9kZShpdCwgcmQtPm1vZGVzX2k0KTsKLSAgU3dhcE91dChpdCk7Ci0gIFNiTWVtb3J5Q29weShyZC0+eV9hY19sZXZlbHMsIHJkX2Jlc3QueV9hY19sZXZlbHMsIHNpemVvZihyZC0+eV9hY19sZXZlbHMpKTsKLSAgcmV0dXJuIDE7ICAgLy8gc2VsZWN0IGludHJhNHg0IG92ZXIgaW50cmExNngxNgotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCBQaWNrQmVzdFVWKFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgVlA4TW9kZVNjb3JlKiBjb25zdCByZCkgewotICBjb25zdCBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKLSAgY29uc3QgVlA4U2VnbWVudEluZm8qIGNvbnN0IGRxbSA9ICZlbmMtPmRxbV9baXQtPm1iXy0+c2VnbWVudF9dOwotICBjb25zdCBpbnQgbGFtYmRhID0gZHFtLT5sYW1iZGFfdXZfOwotICBjb25zdCB1aW50OF90KiBjb25zdCBzcmMgPSBpdC0+eXV2X2luXyArIFVfT0ZGOwotICB1aW50OF90KiBjb25zdCB0bXBfZHN0ID0gaXQtPnl1dl9vdXQyXyArIFVfT0ZGOyAgLy8gc2NyYXRjaCBidWZmZXIKLSAgdWludDhfdCogY29uc3QgZHN0MCA9IGl0LT55dXZfb3V0XyArIFVfT0ZGOwotICBWUDhNb2RlU2NvcmUgcmRfYmVzdDsKLSAgaW50IG1vZGU7Ci0KLSAgcmQtPm1vZGVfdXYgPSAtMTsKLSAgSW5pdFNjb3JlKCZyZF9iZXN0KTsKLSAgZm9yIChtb2RlID0gMDsgbW9kZSA8IE5VTV9QUkVEX01PREVTOyArK21vZGUpIHsKLSAgICBWUDhNb2RlU2NvcmUgcmRfdXY7Ci0KLSAgICAvLyBSZWNvbnN0cnVjdAotICAgIHJkX3V2Lm56ID0gUmVjb25zdHJ1Y3RVVihpdCwgJnJkX3V2LCB0bXBfZHN0LCBtb2RlKTsKLQotICAgIC8vIENvbXB1dGUgUkQtc2NvcmUKLSAgICByZF91di5EICA9IFZQOFNTRTE2eDgoc3JjLCB0bXBfZHN0KTsKLSAgICByZF91di5TRCA9IDA7ICAgIC8vIFRPRE86IHNob3VsZCB3ZSBjYWxsIFREaXN0bz8gaXQgdGVuZHMgdG8gZmxhdHRlbiBhcmVhcy4KLSAgICByZF91di5SICA9IFZQOEdldENvc3RVVihpdCwgJnJkX3V2KTsKLSAgICByZF91di5SICs9IFZQOEZpeGVkQ29zdHNVVlttb2RlXTsKLQotICAgIFNldFJEU2NvcmUobGFtYmRhLCAmcmRfdXYpOwotICAgIGlmIChtb2RlID09IDAgfHwgcmRfdXYuc2NvcmUgPCByZF9iZXN0LnNjb3JlKSB7Ci0gICAgICBDb3B5U2NvcmUoJnJkX2Jlc3QsICZyZF91dik7Ci0gICAgICByZC0+bW9kZV91diA9IG1vZGU7Ci0gICAgICBTYk1lbW9yeUNvcHkocmQtPnV2X2xldmVscywgcmRfdXYudXZfbGV2ZWxzLCBzaXplb2YocmQtPnV2X2xldmVscykpOwotICAgICAgU2JNZW1vcnlDb3B5KGRzdDAsIHRtcF9kc3QsIFVWX1NJWkUpOyAgIC8vICBUT0RPOiBTd2FwVVZPdXQoKSA/Ci0gICAgfQotICB9Ci0gIFZQOFNldEludHJhVVZNb2RlKGl0LCByZC0+bW9kZV91dik7Ci0gIEFkZFNjb3JlKHJkLCAmcmRfYmVzdCk7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBGaW5hbCByZWNvbnN0cnVjdGlvbiBhbmQgcXVhbnRpemF0aW9uLgotCi1zdGF0aWMgdm9pZCBTaW1wbGVRdWFudGl6ZShWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsIFZQOE1vZGVTY29yZSogY29uc3QgcmQpIHsKLSAgY29uc3QgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187Ci0gIGNvbnN0IGludCBpc19pMTYgPSAoaXQtPm1iXy0+dHlwZV8gPT0gMSk7Ci0gIGludCBueiA9IDA7Ci0KLSAgaWYgKGlzX2kxNikgewotICAgIG56ID0gUmVjb25zdHJ1Y3RJbnRyYTE2KGl0LCByZCwgaXQtPnl1dl9vdXRfICsgWV9PRkYsIGl0LT5wcmVkc19bMF0pOwotICB9IGVsc2UgewotICAgIFZQOEl0ZXJhdG9yU3RhcnRJNChpdCk7Ci0gICAgZG8gewotICAgICAgY29uc3QgaW50IG1vZGUgPQotICAgICAgICAgIGl0LT5wcmVkc19bKGl0LT5pNF8gJiAzKSArIChpdC0+aTRfID4+IDIpICogZW5jLT5wcmVkc193X107Ci0gICAgICBjb25zdCB1aW50OF90KiBjb25zdCBzcmMgPSBpdC0+eXV2X2luXyArIFlfT0ZGICsgVlA4U2NhbltpdC0+aTRfXTsKLSAgICAgIHVpbnQ4X3QqIGNvbnN0IGRzdCA9IGl0LT55dXZfb3V0XyArIFlfT0ZGICsgVlA4U2NhbltpdC0+aTRfXTsKLSAgICAgIFZQOE1ha2VJbnRyYTRQcmVkcyhpdCk7Ci0gICAgICBueiB8PSBSZWNvbnN0cnVjdEludHJhNChpdCwgcmQtPnlfYWNfbGV2ZWxzW2l0LT5pNF9dLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLCBkc3QsIG1vZGUpIDw8IGl0LT5pNF87Ci0gICAgfSB3aGlsZSAoVlA4SXRlcmF0b3JSb3RhdGVJNChpdCwgaXQtPnl1dl9vdXRfICsgWV9PRkYpKTsKLSAgfQotCi0gIG56IHw9IFJlY29uc3RydWN0VVYoaXQsIHJkLCBpdC0+eXV2X291dF8gKyBVX09GRiwgaXQtPm1iXy0+dXZfbW9kZV8pOwotICByZC0+bnogPSBuejsKLX0KLQotLy8gUmVmaW5lIGludHJhMTYvaW50cmE0IHN1Yi1tb2RlcyBiYXNlZCBvbiBkaXN0b3J0aW9uIG9ubHkgKG5vdCByYXRlKS4KLXN0YXRpYyB2b2lkIERpc3RvUmVmaW5lKFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgaW50IHRyeV9ib3RoX2k0X2kxNikgewotICBjb25zdCBpbnQgaXNfaTE2ID0gKGl0LT5tYl8tPnR5cGVfID09IDEpOwotICBzY29yZV90IGJlc3Rfc2NvcmUgPSBNQVhfQ09TVDsKLQotICBpZiAodHJ5X2JvdGhfaTRfaTE2IHx8IGlzX2kxNikgewotICAgIGludCBtb2RlOwotICAgIGludCBiZXN0X21vZGUgPSAtMTsKLSAgICBmb3IgKG1vZGUgPSAwOyBtb2RlIDwgTlVNX1BSRURfTU9ERVM7ICsrbW9kZSkgewotICAgICAgY29uc3QgdWludDhfdCogY29uc3QgcmVmID0gaXQtPnl1dl9wXyArIFZQOEkxNk1vZGVPZmZzZXRzW21vZGVdOwotICAgICAgY29uc3QgdWludDhfdCogY29uc3Qgc3JjID0gaXQtPnl1dl9pbl8gKyBZX09GRjsKLSAgICAgIGNvbnN0IHNjb3JlX3Qgc2NvcmUgPSBWUDhTU0UxNngxNihzcmMsIHJlZik7Ci0gICAgICBpZiAoc2NvcmUgPCBiZXN0X3Njb3JlKSB7Ci0gICAgICAgIGJlc3RfbW9kZSA9IG1vZGU7Ci0gICAgICAgIGJlc3Rfc2NvcmUgPSBzY29yZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgVlA4U2V0SW50cmExNk1vZGUoaXQsIGJlc3RfbW9kZSk7Ci0gIH0KLSAgaWYgKHRyeV9ib3RoX2k0X2kxNiB8fCAhaXNfaTE2KSB7Ci0gICAgdWludDhfdCBtb2Rlc19pNFsxNl07Ci0gICAgLy8gV2UgZG9uJ3QgZXZhbHVhdGUgdGhlIHJhdGUgaGVyZSwgYnV0IGp1c3QgYWNjb3VudCBmb3IgaXQgdGhyb3VnaCBhCi0gICAgLy8gY29uc3RhbnQgcGVuYWx0eSAoaTQgbW9kZSB1c3VhbGx5IG5lZWRzIG1vcmUgYml0cyBjb21wYXJlZCB0byBpMTYpLgotICAgIHNjb3JlX3Qgc2NvcmVfaTQgPSAoc2NvcmVfdClJNF9QRU5BTFRZOwotCi0gICAgVlA4SXRlcmF0b3JTdGFydEk0KGl0KTsKLSAgICBkbyB7Ci0gICAgICBpbnQgbW9kZTsKLSAgICAgIGludCBiZXN0X3N1Yl9tb2RlID0gLTE7Ci0gICAgICBzY29yZV90IGJlc3Rfc3ViX3Njb3JlID0gTUFYX0NPU1Q7Ci0gICAgICBjb25zdCB1aW50OF90KiBjb25zdCBzcmMgPSBpdC0+eXV2X2luXyArIFlfT0ZGICsgVlA4U2NhbltpdC0+aTRfXTsKLQotICAgICAgLy8gVE9ETyhza2FsKTogd2UgZG9uJ3QgcmVhbGx5IG5lZWQgdGhlIHByZWRpY3Rpb24gcGl4ZWxzIGhlcmUsCi0gICAgICAvLyBidXQganVzdCB0aGUgZGlzdG9ydGlvbiBhZ2FpbnN0ICdzcmMnLgotICAgICAgVlA4TWFrZUludHJhNFByZWRzKGl0KTsKLSAgICAgIGZvciAobW9kZSA9IDA7IG1vZGUgPCBOVU1fQk1PREVTOyArK21vZGUpIHsKLSAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgcmVmID0gaXQtPnl1dl9wXyArIFZQOEk0TW9kZU9mZnNldHNbbW9kZV07Ci0gICAgICAgIGNvbnN0IHNjb3JlX3Qgc2NvcmUgPSBWUDhTU0U0eDQoc3JjLCByZWYpOwotICAgICAgICBpZiAoc2NvcmUgPCBiZXN0X3N1Yl9zY29yZSkgewotICAgICAgICAgIGJlc3Rfc3ViX21vZGUgPSBtb2RlOwotICAgICAgICAgIGJlc3Rfc3ViX3Njb3JlID0gc2NvcmU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIG1vZGVzX2k0W2l0LT5pNF9dID0gYmVzdF9zdWJfbW9kZTsKLSAgICAgIHNjb3JlX2k0ICs9IGJlc3Rfc3ViX3Njb3JlOwotICAgICAgaWYgKHNjb3JlX2k0ID49IGJlc3Rfc2NvcmUpIGJyZWFrOwotICAgIH0gd2hpbGUgKFZQOEl0ZXJhdG9yUm90YXRlSTQoaXQsIGl0LT55dXZfaW5fICsgWV9PRkYpKTsKLSAgICBpZiAoc2NvcmVfaTQgPCBiZXN0X3Njb3JlKSB7Ci0gICAgICBWUDhTZXRJbnRyYTRNb2RlKGl0LCBtb2Rlc19pNCk7Ci0gICAgfQotICB9Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBFbnRyeSBwb2ludAotCi1pbnQgVlA4RGVjaW1hdGUoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBWUDhNb2RlU2NvcmUqIGNvbnN0IHJkLAotICAgICAgICAgICAgICAgIFZQOFJETGV2ZWwgcmRfb3B0KSB7Ci0gIGludCBpc19za2lwcGVkOwotICBjb25zdCBpbnQgbWV0aG9kID0gaXQtPmVuY18tPm1ldGhvZF87Ci0KLSAgSW5pdFNjb3JlKHJkKTsKLQotICAvLyBXZSBjYW4gcGVyZm9ybSBwcmVkaWN0aW9ucyBmb3IgTHVtYTE2eDE2IGFuZCBDaHJvbWE4eDggYWxyZWFkeS4KLSAgLy8gTHVtYTR4NCBwcmVkaWN0aW9ucyBuZWVkcyB0byBiZSBkb25lIGFzLXdlLWdvLgotICBWUDhNYWtlTHVtYTE2UHJlZHMoaXQpOwotICBWUDhNYWtlQ2hyb21hOFByZWRzKGl0KTsKLQotICBpZiAocmRfb3B0ID4gUkRfT1BUX05PTkUpIHsKLSAgICBpdC0+ZG9fdHJlbGxpc18gPSAocmRfb3B0ID49IFJEX09QVF9UUkVMTElTX0FMTCk7Ci0gICAgUGlja0Jlc3RJbnRyYTE2KGl0LCByZCk7Ci0gICAgaWYgKG1ldGhvZCA+PSAyKSB7Ci0gICAgICBQaWNrQmVzdEludHJhNChpdCwgcmQpOwotICAgIH0KLSAgICBQaWNrQmVzdFVWKGl0LCByZCk7Ci0gICAgaWYgKHJkX29wdCA9PSBSRF9PUFRfVFJFTExJUykgeyAgIC8vIGZpbmlzaCBvZmYgd2l0aCB0cmVsbGlzLW9wdGltIG5vdwotICAgICAgaXQtPmRvX3RyZWxsaXNfID0gMTsKLSAgICAgIFNpbXBsZVF1YW50aXplKGl0LCByZCk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIC8vIEZvciBtZXRob2QgPT0gMiwgcGljayB0aGUgYmVzdCBpbnRyYTQvaW50cmExNiBiYXNlZCBvbiBTU0UgKH50YWQgc2xvd2VyKS4KLSAgICAvLyBGb3IgbWV0aG9kIDw9IDEsIHdlIHJlZmluZSBpbnRyYTQgb3IgaW50cmExNiAoYnV0IGRvbid0IHJlLWV4YW1pbmUgbW9kZSkuCi0gICAgRGlzdG9SZWZpbmUoaXQsIChtZXRob2QgPj0gMikpOwotICAgIFNpbXBsZVF1YW50aXplKGl0LCByZCk7Ci0gIH0KLSAgaXNfc2tpcHBlZCA9IChyZC0+bnogPT0gMCk7Ci0gIFZQOFNldFNraXAoaXQsIGlzX3NraXBwZWQpOwotICByZXR1cm4gaXNfc2tpcHBlZDsKLX0KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvc3ludGF4LmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvc3ludGF4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZTk0ZTUuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL3N5bnRheC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDM0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBIZWFkZXIgc3ludGF4IHdyaXRpbmcKLS8vCi0vLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQotCi0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2Vsc2UKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiLi4vdXRpbHMvdXRpbHMuaCIKLSNpbmNsdWRlICIuLi93ZWJwL2Zvcm1hdF9jb25zdGFudHMuaCIgIC8vIFJJRkYgY29uc3RhbnRzCi0jaW5jbHVkZSAiLi4vd2VicC9tdXhfdHlwZXMuaCIgICAgICAgICAvLyBBTFBIQV9GTEFHCi0jaW5jbHVkZSAiLi92cDhlbmNpLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gSGVscGVyIGZ1bmN0aW9ucwotCi1zdGF0aWMgaW50IElzVlA4WE5lZWRlZChjb25zdCBWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKLSAgcmV0dXJuICEhZW5jLT5oYXNfYWxwaGFfOyAgLy8gQ3VycmVudGx5IHRoZSBvbmx5IGNhc2Ugd2hlbiBWUDhYIGlzIG5lZWRlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBjb3VsZCBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS4KLX0KLQotc3RhdGljIGludCBQdXRQYWRkaW5nQnl0ZShjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljKSB7Ci0gIGNvbnN0IHVpbnQ4X3QgcGFkX2J5dGVbMV0gPSB7IDAgfTsKLSAgcmV0dXJuICEhcGljLT53cml0ZXIocGFkX2J5dGUsIDEsIHBpYyk7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBXcml0ZXJzIGZvciBoZWFkZXIncyB2YXJpb3VzIHBpZWNlcyAoaW4gb3JkZXIgb2YgYXBwZWFyYW5jZSkKLQotc3RhdGljIFdlYlBFbmNvZGluZ0Vycm9yIFB1dFJJRkZIZWFkZXIoY29uc3QgVlA4RW5jb2RlciogY29uc3QgZW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHJpZmZfc2l6ZSkgewotICBjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljID0gZW5jLT5waWNfOwotICB1aW50OF90IHJpZmZbUklGRl9IRUFERVJfU0laRV0gPSB7Ci0gICAgJ1InLCAnSScsICdGJywgJ0YnLCAwLCAwLCAwLCAwLCAnVycsICdFJywgJ0InLCAnUCcKLSAgfTsKLSAgU0JfRENIRUNLKHJpZmZfc2l6ZSA9PSAodWludDMyX3QpcmlmZl9zaXplKTsKLSAgUHV0TEUzMihyaWZmICsgVEFHX1NJWkUsICh1aW50MzJfdClyaWZmX3NpemUpOwotICBpZiAoIXBpYy0+d3JpdGVyKHJpZmYsIHNpemVvZihyaWZmKSwgcGljKSkgewotICAgIHJldHVybiBWUDhfRU5DX0VSUk9SX0JBRF9XUklURTsKLSAgfQotICByZXR1cm4gVlA4X0VOQ19PSzsKLX0KLQotc3RhdGljIFdlYlBFbmNvZGluZ0Vycm9yIFB1dFZQOFhIZWFkZXIoY29uc3QgVlA4RW5jb2RlciogY29uc3QgZW5jKSB7Ci0gIGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMgPSBlbmMtPnBpY187Ci0gIHVpbnQ4X3QgdnA4eFtDSFVOS19IRUFERVJfU0laRSArIFZQOFhfQ0hVTktfU0laRV0gPSB7Ci0gICAgJ1YnLCAnUCcsICc4JywgJ1gnCi0gIH07Ci0gIHVpbnQzMl90IGZsYWdzID0gMDsKLQotICBTQl9EQ0hFQ0soSXNWUDhYTmVlZGVkKGVuYykpOwotICBTQl9EQ0hFQ0socGljLT53aWR0aCA+PSAxICYmIHBpYy0+aGVpZ2h0ID49IDEpOwotICBTQl9EQ0hFQ0socGljLT53aWR0aCA8PSBNQVhfQ0FOVkFTX1NJWkUgJiYgcGljLT5oZWlnaHQgPD0gTUFYX0NBTlZBU19TSVpFKTsKLQotICBpZiAoZW5jLT5oYXNfYWxwaGFfKSB7Ci0gICAgZmxhZ3MgfD0gQUxQSEFfRkxBRzsKLSAgfQotCi0gIFB1dExFMzIodnA4eCArIFRBR19TSVpFLCAgICAgICAgICAgICAgVlA4WF9DSFVOS19TSVpFKTsKLSAgUHV0TEUzMih2cDh4ICsgQ0hVTktfSEVBREVSX1NJWkUsICAgICBmbGFncyk7Ci0gIFB1dExFMjQodnA4eCArIENIVU5LX0hFQURFUl9TSVpFICsgNCwgcGljLT53aWR0aCAtIDEpOwotICBQdXRMRTI0KHZwOHggKyBDSFVOS19IRUFERVJfU0laRSArIDcsIHBpYy0+aGVpZ2h0IC0gMSk7Ci0gIGlmICghcGljLT53cml0ZXIodnA4eCwgc2l6ZW9mKHZwOHgpLCBwaWMpKSB7Ci0gICAgcmV0dXJuIFZQOF9FTkNfRVJST1JfQkFEX1dSSVRFOwotICB9Ci0gIHJldHVybiBWUDhfRU5DX09LOwotfQotCi1zdGF0aWMgV2ViUEVuY29kaW5nRXJyb3IgUHV0QWxwaGFDaHVuayhjb25zdCBWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKLSAgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYyA9IGVuYy0+cGljXzsKLSAgdWludDhfdCBhbHBoYV9jaHVua19oZHJbQ0hVTktfSEVBREVSX1NJWkVdID0gewotICAgICdBJywgJ0wnLCAnUCcsICdIJwotICB9OwotCi0gIFNCX0RDSEVDSyhlbmMtPmhhc19hbHBoYV8pOwotCi0gIC8vIEFscGhhIGNodW5rIGhlYWRlci4KLSAgUHV0TEUzMihhbHBoYV9jaHVua19oZHIgKyBUQUdfU0laRSwgZW5jLT5hbHBoYV9kYXRhX3NpemVfKTsKLSAgaWYgKCFwaWMtPndyaXRlcihhbHBoYV9jaHVua19oZHIsIHNpemVvZihhbHBoYV9jaHVua19oZHIpLCBwaWMpKSB7Ci0gICAgcmV0dXJuIFZQOF9FTkNfRVJST1JfQkFEX1dSSVRFOwotICB9Ci0KLSAgLy8gQWxwaGEgY2h1bmsgZGF0YS4KLSAgaWYgKCFwaWMtPndyaXRlcihlbmMtPmFscGhhX2RhdGFfLCBlbmMtPmFscGhhX2RhdGFfc2l6ZV8sIHBpYykpIHsKLSAgICByZXR1cm4gVlA4X0VOQ19FUlJPUl9CQURfV1JJVEU7Ci0gIH0KLQotICAvLyBQYWRkaW5nLgotICBpZiAoKGVuYy0+YWxwaGFfZGF0YV9zaXplXyAmIDEpICYmICFQdXRQYWRkaW5nQnl0ZShwaWMpKSB7Ci0gICAgcmV0dXJuIFZQOF9FTkNfRVJST1JfQkFEX1dSSVRFOwotICB9Ci0gIHJldHVybiBWUDhfRU5DX09LOwotfQotCi1zdGF0aWMgV2ViUEVuY29kaW5nRXJyb3IgUHV0VlA4SGVhZGVyKGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2cDhfc2l6ZSkgewotICB1aW50OF90IHZwOF9jaHVua19oZHJbQ0hVTktfSEVBREVSX1NJWkVdID0gewotICAgICdWJywgJ1AnLCAnOCcsICcgJwotICB9OwotICBTQl9EQ0hFQ0sodnA4X3NpemUgPT0gKHVpbnQzMl90KXZwOF9zaXplKTsKLSAgUHV0TEUzMih2cDhfY2h1bmtfaGRyICsgVEFHX1NJWkUsICh1aW50MzJfdCl2cDhfc2l6ZSk7Ci0gIGlmICghcGljLT53cml0ZXIodnA4X2NodW5rX2hkciwgc2l6ZW9mKHZwOF9jaHVua19oZHIpLCBwaWMpKSB7Ci0gICAgcmV0dXJuIFZQOF9FTkNfRVJST1JfQkFEX1dSSVRFOwotICB9Ci0gIHJldHVybiBWUDhfRU5DX09LOwotfQotCi1zdGF0aWMgV2ViUEVuY29kaW5nRXJyb3IgUHV0VlA4RnJhbWVIZWFkZXIoY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJvZmlsZSwgc2l6ZV90IHNpemUwKSB7Ci0gIHVpbnQ4X3QgdnA4X2ZybV9oZHJbVlA4X0ZSQU1FX0hFQURFUl9TSVpFXTsKLSAgdWludDMyX3QgYml0czsKLQotICBpZiAoc2l6ZTAgPj0gVlA4X01BWF9QQVJUSVRJT04wX1NJWkUpIHsgIC8vIHBhcnRpdGlvbiAjMCBpcyB0b28gYmlnIHRvIGZpdAotICAgIHJldHVybiBWUDhfRU5DX0VSUk9SX1BBUlRJVElPTjBfT1ZFUkZMT1c7Ci0gIH0KLQotICAvLyBQYXJhZ3JhcGggOS4xLgotICBiaXRzID0gMCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBrZXlmcmFtZSAoMWIpCi0gICAgICAgfCAocHJvZmlsZSA8PCAxKSAgICAgICAgICAgIC8vIHByb2ZpbGUgKDNiKQotICAgICAgIHwgKDEgPDwgNCkgICAgICAgICAgICAgICAgICAvLyB2aXNpYmxlICgxYikKLSAgICAgICB8ICgodWludDMyX3Qpc2l6ZTAgPDwgNSk7ICAgLy8gcGFydGl0aW9uIGxlbmd0aCAoMTliKQotICB2cDhfZnJtX2hkclswXSA9IChiaXRzID4+ICAwKSAmIDB4ZmY7Ci0gIHZwOF9mcm1faGRyWzFdID0gKGJpdHMgPj4gIDgpICYgMHhmZjsKLSAgdnA4X2ZybV9oZHJbMl0gPSAoYml0cyA+PiAxNikgJiAweGZmOwotICAvLyBzaWduYXR1cmUKLSAgdnA4X2ZybV9oZHJbM10gPSAoVlA4X1NJR05BVFVSRSA+PiAxNikgJiAweGZmOwotICB2cDhfZnJtX2hkcls0XSA9IChWUDhfU0lHTkFUVVJFID4+ICA4KSAmIDB4ZmY7Ci0gIHZwOF9mcm1faGRyWzVdID0gKFZQOF9TSUdOQVRVUkUgPj4gIDApICYgMHhmZjsKLSAgLy8gZGltZW5zaW9ucwotICB2cDhfZnJtX2hkcls2XSA9IHBpYy0+d2lkdGggJiAweGZmOwotICB2cDhfZnJtX2hkcls3XSA9IHBpYy0+d2lkdGggPj4gODsKLSAgdnA4X2ZybV9oZHJbOF0gPSBwaWMtPmhlaWdodCAmIDB4ZmY7Ci0gIHZwOF9mcm1faGRyWzldID0gcGljLT5oZWlnaHQgPj4gODsKLQotICBpZiAoIXBpYy0+d3JpdGVyKHZwOF9mcm1faGRyLCBzaXplb2YodnA4X2ZybV9oZHIpLCBwaWMpKSB7Ci0gICAgcmV0dXJuIFZQOF9FTkNfRVJST1JfQkFEX1dSSVRFOwotICB9Ci0gIHJldHVybiBWUDhfRU5DX09LOwotfQotCi0vLyBXZWJQIEhlYWRlcnMuCi1zdGF0aWMgaW50IFB1dFdlYlBIZWFkZXJzKGNvbnN0IFZQOEVuY29kZXIqIGNvbnN0IGVuYywgc2l6ZV90IHNpemUwLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdnA4X3NpemUsIHNpemVfdCByaWZmX3NpemUpIHsKLSAgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYyA9IGVuYy0+cGljXzsKLSAgV2ViUEVuY29kaW5nRXJyb3IgZXJyID0gVlA4X0VOQ19PSzsKLQotICAvLyBSSUZGIGhlYWRlci4KLSAgZXJyID0gUHV0UklGRkhlYWRlcihlbmMsIHJpZmZfc2l6ZSk7Ci0gIGlmIChlcnIgIT0gVlA4X0VOQ19PSykgZ290byBFcnJvcjsKLQotICAvLyBWUDhYLgotICBpZiAoSXNWUDhYTmVlZGVkKGVuYykpIHsKLSAgICBlcnIgPSBQdXRWUDhYSGVhZGVyKGVuYyk7Ci0gICAgaWYgKGVyciAhPSBWUDhfRU5DX09LKSBnb3RvIEVycm9yOwotICB9Ci0KLSAgLy8gQWxwaGEuCi0gIGlmIChlbmMtPmhhc19hbHBoYV8pIHsKLSAgICBlcnIgPSBQdXRBbHBoYUNodW5rKGVuYyk7Ci0gICAgaWYgKGVyciAhPSBWUDhfRU5DX09LKSBnb3RvIEVycm9yOwotICB9Ci0KLSAgLy8gVlA4IGhlYWRlci4KLSAgZXJyID0gUHV0VlA4SGVhZGVyKHBpYywgdnA4X3NpemUpOwotICBpZiAoZXJyICE9IFZQOF9FTkNfT0spIGdvdG8gRXJyb3I7Ci0KLSAgLy8gVlA4IGZyYW1lIGhlYWRlci4KLSAgZXJyID0gUHV0VlA4RnJhbWVIZWFkZXIocGljLCBlbmMtPnByb2ZpbGVfLCBzaXplMCk7Ci0gIGlmIChlcnIgIT0gVlA4X0VOQ19PSykgZ290byBFcnJvcjsKLQotICAvLyBBbGwgT0suCi0gIHJldHVybiAxOwotCi0gIC8vIEVycm9yLgotIEVycm9yOgotICByZXR1cm4gV2ViUEVuY29kaW5nU2V0RXJyb3IocGljLCBlcnIpOwotfQotCi0vLyBTZWdtZW50YXRpb24gaGVhZGVyCi1zdGF0aWMgdm9pZCBQdXRTZWdtZW50SGVhZGVyKFZQOEJpdFdyaXRlciogY29uc3QgYncsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOEVuY29kZXIqIGNvbnN0IGVuYykgewotICBjb25zdCBWUDhTZWdtZW50SGVhZGVyKiBjb25zdCBoZHIgPSAmZW5jLT5zZWdtZW50X2hkcl87Ci0gIGNvbnN0IFZQOFByb2JhKiBjb25zdCBwcm9iYSA9ICZlbmMtPnByb2JhXzsKLSAgaWYgKFZQOFB1dEJpdFVuaWZvcm0oYncsIChoZHItPm51bV9zZWdtZW50c18gPiAxKSkpIHsKLSAgICAvLyBXZSBhbHdheXMgJ3VwZGF0ZScgdGhlIHF1YW50IGFuZCBmaWx0ZXIgc3RyZW5ndGggdmFsdWVzCi0gICAgY29uc3QgaW50IHVwZGF0ZV9kYXRhID0gMTsKLSAgICBpbnQgczsKLSAgICBWUDhQdXRCaXRVbmlmb3JtKGJ3LCBoZHItPnVwZGF0ZV9tYXBfKTsKLSAgICBpZiAoVlA4UHV0Qml0VW5pZm9ybShidywgdXBkYXRlX2RhdGEpKSB7Ci0gICAgICAvLyB3ZSBhbHdheXMgdXNlIGFic29sdXRlIHZhbHVlcywgbm90IHJlbGF0aXZlIG9uZXMKLSAgICAgIFZQOFB1dEJpdFVuaWZvcm0oYncsIDEpOyAgIC8vIChzZWdtZW50X2ZlYXR1cmVfbW9kZSA9IDEuIFBhcmFncmFwaCA5LjMuKQotICAgICAgZm9yIChzID0gMDsgcyA8IE5VTV9NQl9TRUdNRU5UUzsgKytzKSB7Ci0gICAgICAgIFZQOFB1dFNpZ25lZFZhbHVlKGJ3LCBlbmMtPmRxbV9bc10ucXVhbnRfLCA3KTsKLSAgICAgIH0KLSAgICAgIGZvciAocyA9IDA7IHMgPCBOVU1fTUJfU0VHTUVOVFM7ICsrcykgewotICAgICAgICBWUDhQdXRTaWduZWRWYWx1ZShidywgZW5jLT5kcW1fW3NdLmZzdHJlbmd0aF8sIDYpOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoaGRyLT51cGRhdGVfbWFwXykgewotICAgICAgZm9yIChzID0gMDsgcyA8IDM7ICsrcykgewotICAgICAgICBpZiAoVlA4UHV0Qml0VW5pZm9ybShidywgKHByb2JhLT5zZWdtZW50c19bc10gIT0gMjU1dSkpKSB7Ci0gICAgICAgICAgVlA4UHV0VmFsdWUoYncsIHByb2JhLT5zZWdtZW50c19bc10sIDgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLS8vIEZpbHRlcmluZyBwYXJhbWV0ZXJzIGhlYWRlcgotc3RhdGljIHZvaWQgUHV0RmlsdGVySGVhZGVyKFZQOEJpdFdyaXRlciogY29uc3QgYncsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4RmlsdGVySGVhZGVyKiBjb25zdCBoZHIpIHsKLSAgY29uc3QgaW50IHVzZV9sZl9kZWx0YSA9IChoZHItPmk0eDRfbGZfZGVsdGFfICE9IDApOwotICBWUDhQdXRCaXRVbmlmb3JtKGJ3LCBoZHItPnNpbXBsZV8pOwotICBWUDhQdXRWYWx1ZShidywgaGRyLT5sZXZlbF8sIDYpOwotICBWUDhQdXRWYWx1ZShidywgaGRyLT5zaGFycG5lc3NfLCAzKTsKLSAgaWYgKFZQOFB1dEJpdFVuaWZvcm0oYncsIHVzZV9sZl9kZWx0YSkpIHsKLSAgICAvLyAnMCcgaXMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGk0eDRfbGZfZGVsdGFfIGF0IGZyYW1lICMwLgotICAgIGNvbnN0IGludCBuZWVkX3VwZGF0ZSA9IChoZHItPmk0eDRfbGZfZGVsdGFfICE9IDApOwotICAgIGlmIChWUDhQdXRCaXRVbmlmb3JtKGJ3LCBuZWVkX3VwZGF0ZSkpIHsKLSAgICAgIC8vIHdlIGRvbid0IHVzZSByZWZfbGZfZGVsdGEgPT4gZW1pdCBmb3VyIDAgYml0cwotICAgICAgVlA4UHV0VmFsdWUoYncsIDAsIDQpOwotICAgICAgLy8gd2UgdXNlIG1vZGVfbGZfZGVsdGEgZm9yIGk0eDQKLSAgICAgIFZQOFB1dFNpZ25lZFZhbHVlKGJ3LCBoZHItPmk0eDRfbGZfZGVsdGFfLCA2KTsKLSAgICAgIFZQOFB1dFZhbHVlKGJ3LCAwLCAzKTsgICAgLy8gYWxsIG90aGVycyB1bnVzZWQKLSAgICB9Ci0gIH0KLX0KLQotLy8gTm9taW5hbCBxdWFudGl6YXRpb24gcGFyYW1ldGVycwotc3RhdGljIHZvaWQgUHV0UXVhbnQoVlA4Qml0V3JpdGVyKiBjb25zdCBidywKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOEVuY29kZXIqIGNvbnN0IGVuYykgewotICBWUDhQdXRWYWx1ZShidywgZW5jLT5iYXNlX3F1YW50XywgNyk7Ci0gIFZQOFB1dFNpZ25lZFZhbHVlKGJ3LCBlbmMtPmRxX3kxX2RjXywgNCk7Ci0gIFZQOFB1dFNpZ25lZFZhbHVlKGJ3LCBlbmMtPmRxX3kyX2RjXywgNCk7Ci0gIFZQOFB1dFNpZ25lZFZhbHVlKGJ3LCBlbmMtPmRxX3kyX2FjXywgNCk7Ci0gIFZQOFB1dFNpZ25lZFZhbHVlKGJ3LCBlbmMtPmRxX3V2X2RjXywgNCk7Ci0gIFZQOFB1dFNpZ25lZFZhbHVlKGJ3LCBlbmMtPmRxX3V2X2FjXywgNCk7Ci19Ci0KLS8vIFBhcnRpdGlvbiBzaXplcwotc3RhdGljIGludCBFbWl0UGFydGl0aW9uc1NpemUoY29uc3QgVlA4RW5jb2RlciogY29uc3QgZW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYykgewotICB1aW50OF90IGJ1ZlszICogKE1BWF9OVU1fUEFSVElUSU9OUyAtIDEpXTsKLSAgaW50IHA7Ci0gIGZvciAocCA9IDA7IHAgPCBlbmMtPm51bV9wYXJ0c18gLSAxOyArK3ApIHsKLSAgICBjb25zdCBzaXplX3QgcGFydF9zaXplID0gVlA4Qml0V3JpdGVyU2l6ZShlbmMtPnBhcnRzXyArIHApOwotICAgIGlmIChwYXJ0X3NpemUgPj0gVlA4X01BWF9QQVJUSVRJT05fU0laRSkgewotICAgICAgcmV0dXJuIFdlYlBFbmNvZGluZ1NldEVycm9yKHBpYywgVlA4X0VOQ19FUlJPUl9QQVJUSVRJT05fT1ZFUkZMT1cpOwotICAgIH0KLSAgICBidWZbMyAqIHAgKyAwXSA9IChwYXJ0X3NpemUgPj4gIDApICYgMHhmZjsKLSAgICBidWZbMyAqIHAgKyAxXSA9IChwYXJ0X3NpemUgPj4gIDgpICYgMHhmZjsKLSAgICBidWZbMyAqIHAgKyAyXSA9IChwYXJ0X3NpemUgPj4gMTYpICYgMHhmZjsKLSAgfQotICByZXR1cm4gcCA/IHBpYy0+d3JpdGVyKGJ1ZiwgMyAqIHAsIHBpYykgOiAxOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWZkZWYgV0VCUF9FWFBFUklNRU5UQUxfRkVBVFVSRVMKLQotI2RlZmluZSBLVFJBSUxFUl9TSVpFIDgKLQotc3RhdGljIGludCBXcml0ZUV4dGVuc2lvbnMoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7Ci0gIHVpbnQ4X3QgYnVmZmVyW0tUUkFJTEVSX1NJWkVdOwotICBWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3ID0gJmVuYy0+YndfOwotICBXZWJQUGljdHVyZSogY29uc3QgcGljID0gZW5jLT5waWNfOwotCi0gIC8vIExheWVyIChieXRlcyAwLi4zKQotICBQdXRMRTI0KGJ1ZmZlciArIDAsIGVuYy0+bGF5ZXJfZGF0YV9zaXplXyk7Ci0gIGJ1ZmZlclszXSA9IGVuYy0+cGljXy0+Y29sb3JzcGFjZSAmIFdFQlBfQ1NQX1VWX01BU0s7Ci0gIGlmIChlbmMtPmxheWVyX2RhdGFfc2l6ZV8gPiAwKSB7Ci0gICAgU0JfRENIRUNLKGVuYy0+dXNlX2xheWVyXyk7Ci0gICAgLy8gYXBwZW5kIGxheWVyIGRhdGEgdG8gbGFzdCBwYXJ0aXRpb24KLSAgICBpZiAoIVZQOEJpdFdyaXRlckFwcGVuZCgmZW5jLT5wYXJ0c19bZW5jLT5udW1fcGFydHNfIC0gMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jLT5sYXllcl9kYXRhXywgZW5jLT5sYXllcl9kYXRhX3NpemVfKSkgewotICAgICAgcmV0dXJuIFdlYlBFbmNvZGluZ1NldEVycm9yKHBpYywgVlA4X0VOQ19FUlJPUl9CSVRTVFJFQU1fT1VUX09GX01FTU9SWSk7Ci0gICAgfQotICB9Ci0KLSAgYnVmZmVyW0tUUkFJTEVSX1NJWkUgLSAxXSA9IDB4MDE7ICAvLyBtYXJrZXIKLSAgaWYgKCFWUDhCaXRXcml0ZXJBcHBlbmQoYncsIGJ1ZmZlciwgS1RSQUlMRVJfU0laRSkpIHsKLSAgICByZXR1cm4gV2ViUEVuY29kaW5nU2V0RXJyb3IocGljLCBWUDhfRU5DX0VSUk9SX0JJVFNUUkVBTV9PVVRfT0ZfTUVNT1JZKTsKLSAgfQotICByZXR1cm4gMTsKLX0KLQotI2VuZGlmICAgIC8qIFdFQlBfRVhQRVJJTUVOVEFMX0ZFQVRVUkVTICovCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBzaXplX3QgR2VuZXJhdGVQYXJ0aXRpb24wKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgewotICBWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3ID0gJmVuYy0+YndfOwotICBjb25zdCBpbnQgbWJfc2l6ZSA9IGVuYy0+bWJfd18gKiBlbmMtPm1iX2hfOwotICB1aW50NjRfdCBwb3MxLCBwb3MyLCBwb3MzOwotI2lmZGVmIFdFQlBfRVhQRVJJTUVOVEFMX0ZFQVRVUkVTCi0gIGNvbnN0IGludCBuZWVkX2V4dGVuc2lvbnMgPSBlbmMtPnVzZV9sYXllcl87Ci0jZW5kaWYKLQotICBwb3MxID0gVlA4Qml0V3JpdGVyUG9zKGJ3KTsKLSAgVlA4Qml0V3JpdGVySW5pdChidywgbWJfc2l6ZSAqIDcgLyA4KTsgICAgICAgIC8vIH43IGJpdHMgcGVyIG1hY3JvYmxvY2sKLSNpZmRlZiBXRUJQX0VYUEVSSU1FTlRBTF9GRUFUVVJFUwotICBWUDhQdXRCaXRVbmlmb3JtKGJ3LCBuZWVkX2V4dGVuc2lvbnMpOyAgIC8vIGV4dGVuc2lvbnMKLSNlbHNlCi0gIFZQOFB1dEJpdFVuaWZvcm0oYncsIDApOyAgIC8vIGNvbG9yc3BhY2UKLSNlbmRpZgotICBWUDhQdXRCaXRVbmlmb3JtKGJ3LCAwKTsgICAvLyBjbGFtcCB0eXBlCi0KLSAgUHV0U2VnbWVudEhlYWRlcihidywgZW5jKTsKLSAgUHV0RmlsdGVySGVhZGVyKGJ3LCAmZW5jLT5maWx0ZXJfaGRyXyk7Ci0gIFZQOFB1dFZhbHVlKGJ3LCBlbmMtPm51bV9wYXJ0c18gPT0gOCA/IDMgOgotICAgICAgICAgICAgICAgICAgZW5jLT5udW1fcGFydHNfID09IDQgPyAyIDoKLSAgICAgICAgICAgICAgICAgIGVuYy0+bnVtX3BhcnRzXyA9PSAyID8gMSA6IDAsIDIpOwotICBQdXRRdWFudChidywgZW5jKTsKLSAgVlA4UHV0Qml0VW5pZm9ybShidywgMCk7ICAgLy8gbm8gcHJvYmEgdXBkYXRlCi0gIFZQOFdyaXRlUHJvYmFzKGJ3LCAmZW5jLT5wcm9iYV8pOwotICBwb3MyID0gVlA4Qml0V3JpdGVyUG9zKGJ3KTsKLSAgVlA4Q29kZUludHJhTW9kZXMoZW5jKTsKLSAgVlA4Qml0V3JpdGVyRmluaXNoKGJ3KTsKLQotI2lmZGVmIFdFQlBfRVhQRVJJTUVOVEFMX0ZFQVRVUkVTCi0gIGlmIChuZWVkX2V4dGVuc2lvbnMgJiYgIVdyaXRlRXh0ZW5zaW9ucyhlbmMpKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSNlbmRpZgotCi0gIHBvczMgPSBWUDhCaXRXcml0ZXJQb3MoYncpOwotCi0gIGlmIChlbmMtPnBpY18tPnN0YXRzKSB7Ci0gICAgZW5jLT5waWNfLT5zdGF0cy0+aGVhZGVyX2J5dGVzWzBdID0gKGludCkoKHBvczIgLSBwb3MxICsgNykgPj4gMyk7Ci0gICAgZW5jLT5waWNfLT5zdGF0cy0+aGVhZGVyX2J5dGVzWzFdID0gKGludCkoKHBvczMgLSBwb3MyICsgNykgPj4gMyk7Ci0gICAgZW5jLT5waWNfLT5zdGF0cy0+YWxwaGFfZGF0YV9zaXplID0gKGludCllbmMtPmFscGhhX2RhdGFfc2l6ZV87Ci0gICAgZW5jLT5waWNfLT5zdGF0cy0+bGF5ZXJfZGF0YV9zaXplID0gKGludCllbmMtPmxheWVyX2RhdGFfc2l6ZV87Ci0gIH0KLSAgcmV0dXJuICFidy0+ZXJyb3JfOwotfQotCi12b2lkIFZQOEVuY0ZyZWVCaXRXcml0ZXJzKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgewotICBpbnQgcDsKLSAgVlA4Qml0V3JpdGVyV2lwZU91dCgmZW5jLT5id18pOwotICBmb3IgKHAgPSAwOyBwIDwgZW5jLT5udW1fcGFydHNfOyArK3ApIHsKLSAgICBWUDhCaXRXcml0ZXJXaXBlT3V0KGVuYy0+cGFydHNfICsgcCk7Ci0gIH0KLX0KLQotaW50IFZQOEVuY1dyaXRlKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgewotICBXZWJQUGljdHVyZSogY29uc3QgcGljID0gZW5jLT5waWNfOwotICBWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3ID0gJmVuYy0+YndfOwotICBjb25zdCBpbnQgdGFza19wZXJjZW50ID0gMTk7Ci0gIGNvbnN0IGludCBwZXJjZW50X3Blcl9wYXJ0ID0gdGFza19wZXJjZW50IC8gZW5jLT5udW1fcGFydHNfOwotICBjb25zdCBpbnQgZmluYWxfcGVyY2VudCA9IGVuYy0+cGVyY2VudF8gKyB0YXNrX3BlcmNlbnQ7Ci0gIGludCBvayA9IDA7Ci0gIHNpemVfdCB2cDhfc2l6ZSwgcGFkLCByaWZmX3NpemU7Ci0gIGludCBwOwotCi0gIC8vIFBhcnRpdGlvbiAjMCB3aXRoIGhlYWRlciBhbmQgcGFydGl0aW9uIHNpemVzCi0gIG9rID0gISFHZW5lcmF0ZVBhcnRpdGlvbjAoZW5jKTsKLQotICAvLyBDb21wdXRlIFZQOCBzaXplCi0gIHZwOF9zaXplID0gVlA4X0ZSQU1FX0hFQURFUl9TSVpFICsKLSAgICAgICAgICAgICBWUDhCaXRXcml0ZXJTaXplKGJ3KSArCi0gICAgICAgICAgICAgMyAqIChlbmMtPm51bV9wYXJ0c18gLSAxKTsKLSAgZm9yIChwID0gMDsgcCA8IGVuYy0+bnVtX3BhcnRzXzsgKytwKSB7Ci0gICAgdnA4X3NpemUgKz0gVlA4Qml0V3JpdGVyU2l6ZShlbmMtPnBhcnRzXyArIHApOwotICB9Ci0gIHBhZCA9IHZwOF9zaXplICYgMTsKLSAgdnA4X3NpemUgKz0gcGFkOwotCi0gIC8vIENvbXB1dGUgUklGRiBzaXplCi0gIC8vIEF0IHRoZSBtaW5pbXVtIGl0IGlzOiAiV0VCUFZQOCBubm5uIiArIFZQOCBkYXRhIHNpemUuCi0gIHJpZmZfc2l6ZSA9IFRBR19TSVpFICsgQ0hVTktfSEVBREVSX1NJWkUgKyB2cDhfc2l6ZTsKLSAgaWYgKElzVlA4WE5lZWRlZChlbmMpKSB7ICAvLyBBZGQgc2l6ZSBmb3I6IFZQOFggaGVhZGVyICsgZGF0YS4KLSAgICByaWZmX3NpemUgKz0gQ0hVTktfSEVBREVSX1NJWkUgKyBWUDhYX0NIVU5LX1NJWkU7Ci0gIH0KLSAgaWYgKGVuYy0+aGFzX2FscGhhXykgeyAgLy8gQWRkIHNpemUgZm9yOiBBTFBIIGhlYWRlciArIGRhdGEuCi0gICAgY29uc3QgdWludDMyX3QgcGFkZGVkX2FscGhhX3NpemUgPSBlbmMtPmFscGhhX2RhdGFfc2l6ZV8gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVuYy0+YWxwaGFfZGF0YV9zaXplXyAmIDEpOwotICAgIHJpZmZfc2l6ZSArPSBDSFVOS19IRUFERVJfU0laRSArIHBhZGRlZF9hbHBoYV9zaXplOwotICB9Ci0gIC8vIFNhbml0eSBjaGVjay4KLSAgaWYgKHJpZmZfc2l6ZSA+IDB4ZmZmZmZmZmVVKSB7Ci0gICAgcmV0dXJuIFdlYlBFbmNvZGluZ1NldEVycm9yKHBpYywgVlA4X0VOQ19FUlJPUl9GSUxFX1RPT19CSUcpOwotICB9Ci0KLSAgLy8gRW1pdCBoZWFkZXJzIGFuZCBwYXJ0aXRpb24gIzAKLSAgewotICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHBhcnQwID0gVlA4Qml0V3JpdGVyQnVmKGJ3KTsKLSAgICBjb25zdCBzaXplX3Qgc2l6ZTAgPSBWUDhCaXRXcml0ZXJTaXplKGJ3KTsKLSAgICBvayA9IG9rICYmIFB1dFdlYlBIZWFkZXJzKGVuYywgc2l6ZTAsIHZwOF9zaXplLCByaWZmX3NpemUpCi0gICAgICAgICAgICAmJiBwaWMtPndyaXRlcihwYXJ0MCwgc2l6ZTAsIHBpYykKLSAgICAgICAgICAgICYmIEVtaXRQYXJ0aXRpb25zU2l6ZShlbmMsIHBpYyk7Ci0gICAgVlA4Qml0V3JpdGVyV2lwZU91dChidyk7ICAgIC8vIHdpbGwgZnJlZSB0aGUgaW50ZXJuYWwgYnVmZmVyLgotICB9Ci0KLSAgLy8gVG9rZW4gcGFydGl0aW9ucwotICBmb3IgKHAgPSAwOyBwIDwgZW5jLT5udW1fcGFydHNfOyArK3ApIHsKLSAgICBjb25zdCB1aW50OF90KiBjb25zdCBidWYgPSBWUDhCaXRXcml0ZXJCdWYoZW5jLT5wYXJ0c18gKyBwKTsKLSAgICBjb25zdCBzaXplX3Qgc2l6ZSA9IFZQOEJpdFdyaXRlclNpemUoZW5jLT5wYXJ0c18gKyBwKTsKLSAgICBpZiAoc2l6ZSkKLSAgICAgIG9rID0gb2sgJiYgcGljLT53cml0ZXIoYnVmLCBzaXplLCBwaWMpOwotICAgIFZQOEJpdFdyaXRlcldpcGVPdXQoZW5jLT5wYXJ0c18gKyBwKTsgICAgLy8gd2lsbCBmcmVlIHRoZSBpbnRlcm5hbCBidWZmZXIuCi0gICAgb2sgPSBvayAmJiBXZWJQUmVwb3J0UHJvZ3Jlc3MocGljLCBlbmMtPnBlcmNlbnRfICsgcGVyY2VudF9wZXJfcGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jLT5wZXJjZW50Xyk7Ci0gIH0KLQotICAvLyBQYWRkaW5nIGJ5dGUKLSAgaWYgKG9rICYmIHBhZCkgewotICAgIG9rID0gUHV0UGFkZGluZ0J5dGUocGljKTsKLSAgfQotCi0gIGVuYy0+Y29kZWRfc2l6ZV8gPSAoaW50KShDSFVOS19IRUFERVJfU0laRSArIHJpZmZfc2l6ZSk7Ci0gIG9rID0gb2sgJiYgV2ViUFJlcG9ydFByb2dyZXNzKHBpYywgZmluYWxfcGVyY2VudCwgJmVuYy0+cGVyY2VudF8pOwotICByZXR1cm4gb2s7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL3Rva2VuLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvdG9rZW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI4MGViNS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvdG9rZW4uYworKysgL2Rldi9udWxsCkBAIC0xLDI2MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gUGFnaW5hdGVkIHRva2VuIGJ1ZmZlcgotLy8KLS8vICBBICd0b2tlbicgaXMgYSBiaXQgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgcHJvYmFiaWxpdHksIGVpdGhlciBmaXhlZAotLy8gb3IgYSBsYXRlci10by1iZS1kZXRlcm1pbmVkIGFmdGVyIHN0YXRpc3RpY3MgaGF2ZSBiZWVuIGNvbGxlY3RlZC4KLS8vIEZvciBkeW5hbWljIHByb2JhYmlsaXR5LCB3ZSBqdXN0IHJlY29yZCB0aGUgc2xvdCBpZCAoaWR4KSBmb3IgdGhlIHByb2JhYmlsaXR5Ci0vLyB2YWx1ZSBpbiB0aGUgZmluYWwgcHJvYmFiaWxpdHkgYXJyYXkgKHVpbnQ4X3QqIHByb2JhcyBpbiBWUDhFbWl0VG9rZW5zKS4KLS8vCi0vLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQotCi0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNlbHNlCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgIi4vdnA4ZW5jaS5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2lmICFkZWZpbmVkKERJU0FCTEVfVE9LRU5fQlVGRkVSKQotCi0vLyB3ZSB1c2UgcGFnZXMgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgU2JNZW1vcnlDb3B5KCkKLSNkZWZpbmUgTUFYX05VTV9UT0tFTiA4MTkyICAgICAgICAgIC8vIG1heCBudW1iZXIgb2YgdG9rZW4gcGVyIHBhZ2UKLSNkZWZpbmUgRklYRURfUFJPQkFfQklUICgxdSA8PCAxNCkKLQotc3RydWN0IFZQOFRva2VucyB7Ci0gIHVpbnQxNl90IHRva2Vuc19bTUFYX05VTV9UT0tFTl07ICAvLyBiaXQjMTU6IGJpdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0ICMxNDogY29uc3RhbnQgcHJvYmEgb3IgaWR4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXRzIDAuLjEzOiBzbG90IG9yIGNvbnN0YW50IHByb2JhCi0gIFZQOFRva2VucyogbmV4dF87Ci19OwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIFZQOFRCdWZmZXJJbml0KFZQOFRCdWZmZXIqIGNvbnN0IGIpIHsKLSAgYi0+dG9rZW5zXyA9IE5VTEw7Ci0gIGItPnBhZ2VzXyA9IE5VTEw7Ci0gIGItPmxhc3RfcGFnZV8gPSAmYi0+cGFnZXNfOwotICBiLT5sZWZ0XyA9IDA7Ci0gIGItPmVycm9yXyA9IDA7Ci19Ci0KLXZvaWQgVlA4VEJ1ZmZlckNsZWFyKFZQOFRCdWZmZXIqIGNvbnN0IGIpIHsKLSAgaWYgKGIgIT0gTlVMTCkgewotICAgIGNvbnN0IFZQOFRva2VucyogcCA9IGItPnBhZ2VzXzsKLSAgICB3aGlsZSAocCAhPSBOVUxMKSB7Ci0gICAgICBjb25zdCBWUDhUb2tlbnMqIGNvbnN0IG5leHQgPSBwLT5uZXh0XzsKLSAgICAgIFNiTWVtb3J5RGVhbGxvY2F0ZSgodm9pZCopcCk7Ci0gICAgICBwID0gbmV4dDsKLSAgICB9Ci0gICAgVlA4VEJ1ZmZlckluaXQoYik7Ci0gIH0KLX0KLQotc3RhdGljIGludCBUQnVmZmVyTmV3UGFnZShWUDhUQnVmZmVyKiBjb25zdCBiKSB7Ci0gIFZQOFRva2VucyogY29uc3QgcGFnZSA9IGItPmVycm9yXyA/IE5VTEwgOiAoVlA4VG9rZW5zKilTYk1lbW9yeUFsbG9jYXRlKHNpemVvZigqcGFnZSkpOwotICBpZiAocGFnZSA9PSBOVUxMKSB7Ci0gICAgYi0+ZXJyb3JfID0gMTsKLSAgICByZXR1cm4gMDsKLSAgfQotICAqYi0+bGFzdF9wYWdlXyA9IHBhZ2U7Ci0gIGItPmxhc3RfcGFnZV8gPSAmcGFnZS0+bmV4dF87Ci0gIGItPmxlZnRfID0gTUFYX05VTV9UT0tFTjsKLSAgYi0+dG9rZW5zXyA9IHBhZ2UtPnRva2Vuc187Ci0gIHBhZ2UtPm5leHRfID0gTlVMTDsKLSAgcmV0dXJuIDE7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNkZWZpbmUgVE9LRU5fSUQodCwgYiwgY3R4LCBwKSBcCi0gICAgKChwKSArIE5VTV9QUk9CQVMgKiAoKGN0eCkgKyBOVU1fQ1RYICogKChiKSArIE5VTV9CQU5EUyAqICh0KSkpKQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IEFkZFRva2VuKFZQOFRCdWZmZXIqIGNvbnN0IGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXQsIHVpbnQzMl90IHByb2JhX2lkeCkgewotICBTQl9EQ0hFQ0socHJvYmFfaWR4IDwgRklYRURfUFJPQkFfQklUKTsKLSAgU0JfRENIRUNLKGJpdCA9PSAwIHx8IGJpdCA9PSAxKTsKLSAgaWYgKGItPmxlZnRfID4gMCB8fCBUQnVmZmVyTmV3UGFnZShiKSkgewotICAgIGNvbnN0IGludCBzbG90ID0gLS1iLT5sZWZ0XzsKLSAgICBiLT50b2tlbnNfW3Nsb3RdID0gKGJpdCA8PCAxNSkgfCBwcm9iYV9pZHg7Ci0gIH0KLSAgcmV0dXJuIGJpdDsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgQWRkQ29uc3RhbnRUb2tlbihWUDhUQnVmZmVyKiBjb25zdCBiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0LCBpbnQgcHJvYmEpIHsKLSAgU0JfRENIRUNLKHByb2JhIDwgMjU2KTsKLSAgU0JfRENIRUNLKGJpdCA9PSAwIHx8IGJpdCA9PSAxKTsKLSAgaWYgKGItPmxlZnRfID4gMCB8fCBUQnVmZmVyTmV3UGFnZShiKSkgewotICAgIGNvbnN0IGludCBzbG90ID0gLS1iLT5sZWZ0XzsKLSAgICBiLT50b2tlbnNfW3Nsb3RdID0gKGJpdCA8PCAxNSkgfCBGSVhFRF9QUk9CQV9CSVQgfCBwcm9iYTsKLSAgfQotfQotCi1pbnQgVlA4UmVjb3JkQ29lZmZUb2tlbnMoaW50IGN0eCwgaW50IGNvZWZmX3R5cGUsIGludCBmaXJzdCwgaW50IGxhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCogY29uc3QgY29lZmZzLAotICAgICAgICAgICAgICAgICAgICAgICAgIFZQOFRCdWZmZXIqIGNvbnN0IHRva2VucykgewotICBpbnQgbiA9IGZpcnN0OwotICB1aW50MzJfdCBiYXNlX2lkID0gVE9LRU5fSUQoY29lZmZfdHlwZSwgbiwgY3R4LCAwKTsKLSAgaWYgKCFBZGRUb2tlbih0b2tlbnMsIGxhc3QgPj0gMCwgYmFzZV9pZCArIDApKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICB3aGlsZSAobiA8IDE2KSB7Ci0gICAgY29uc3QgaW50IGMgPSBjb2VmZnNbbisrXTsKLSAgICBjb25zdCBpbnQgc2lnbiA9IGMgPCAwOwotICAgIGludCB2ID0gc2lnbiA/IC1jIDogYzsKLSAgICBpZiAoIUFkZFRva2VuKHRva2VucywgdiAhPSAwLCBiYXNlX2lkICsgMSkpIHsKLSAgICAgIGN0eCA9IDA7Ci0gICAgICBiYXNlX2lkID0gVE9LRU5fSUQoY29lZmZfdHlwZSwgVlA4RW5jQmFuZHNbbl0sIGN0eCwgMCk7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgaWYgKCFBZGRUb2tlbih0b2tlbnMsIHYgPiAxLCBiYXNlX2lkICsgMikpIHsKLSAgICAgIGN0eCA9IDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmICghQWRkVG9rZW4odG9rZW5zLCB2ID4gNCwgYmFzZV9pZCArIDMpKSB7Ci0gICAgICAgIGlmIChBZGRUb2tlbih0b2tlbnMsIHYgIT0gMiwgYmFzZV9pZCArIDQpKQotICAgICAgICAgIEFkZFRva2VuKHRva2VucywgdiA9PSA0LCBiYXNlX2lkICsgNSk7Ci0gICAgICB9IGVsc2UgaWYgKCFBZGRUb2tlbih0b2tlbnMsIHYgPiAxMCwgYmFzZV9pZCArIDYpKSB7Ci0gICAgICAgIGlmICghQWRkVG9rZW4odG9rZW5zLCB2ID4gNiwgYmFzZV9pZCArIDcpKSB7Ci0gICAgICAgICAgQWRkQ29uc3RhbnRUb2tlbih0b2tlbnMsIHYgPT0gNiwgMTU5KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBBZGRDb25zdGFudFRva2VuKHRva2VucywgdiA+PSA5LCAxNjUpOwotICAgICAgICAgIEFkZENvbnN0YW50VG9rZW4odG9rZW5zLCAhKHYgJiAxKSwgMTQ1KTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW50IG1hc2s7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRhYjsKLSAgICAgICAgaWYgKHYgPCAzICsgKDggPDwgMSkpIHsgICAgICAgICAgLy8gVlA4Q2F0MyAgKDNiKQotICAgICAgICAgIEFkZFRva2VuKHRva2VucywgMCwgYmFzZV9pZCArIDgpOwotICAgICAgICAgIEFkZFRva2VuKHRva2VucywgMCwgYmFzZV9pZCArIDkpOwotICAgICAgICAgIHYgLT0gMyArICg4IDw8IDApOwotICAgICAgICAgIG1hc2sgPSAxIDw8IDI7Ci0gICAgICAgICAgdGFiID0gVlA4Q2F0MzsKLSAgICAgICAgfSBlbHNlIGlmICh2IDwgMyArICg4IDw8IDIpKSB7ICAgLy8gVlA4Q2F0NCAgKDRiKQotICAgICAgICAgIEFkZFRva2VuKHRva2VucywgMCwgYmFzZV9pZCArIDgpOwotICAgICAgICAgIEFkZFRva2VuKHRva2VucywgMSwgYmFzZV9pZCArIDkpOwotICAgICAgICAgIHYgLT0gMyArICg4IDw8IDEpOwotICAgICAgICAgIG1hc2sgPSAxIDw8IDM7Ci0gICAgICAgICAgdGFiID0gVlA4Q2F0NDsKLSAgICAgICAgfSBlbHNlIGlmICh2IDwgMyArICg4IDw8IDMpKSB7ICAgLy8gVlA4Q2F0NSAgKDViKQotICAgICAgICAgIEFkZFRva2VuKHRva2VucywgMSwgYmFzZV9pZCArIDgpOwotICAgICAgICAgIEFkZFRva2VuKHRva2VucywgMCwgYmFzZV9pZCArIDEwKTsKLSAgICAgICAgICB2IC09IDMgKyAoOCA8PCAyKTsKLSAgICAgICAgICBtYXNrID0gMSA8PCA0OwotICAgICAgICAgIHRhYiA9IFZQOENhdDU7Ci0gICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFZQOENhdDYgKDExYikKLSAgICAgICAgICBBZGRUb2tlbih0b2tlbnMsIDEsIGJhc2VfaWQgKyA4KTsKLSAgICAgICAgICBBZGRUb2tlbih0b2tlbnMsIDEsIGJhc2VfaWQgKyAxMCk7Ci0gICAgICAgICAgdiAtPSAzICsgKDggPDwgMyk7Ci0gICAgICAgICAgbWFzayA9IDEgPDwgMTA7Ci0gICAgICAgICAgdGFiID0gVlA4Q2F0NjsKLSAgICAgICAgfQotICAgICAgICB3aGlsZSAobWFzaykgewotICAgICAgICAgIEFkZENvbnN0YW50VG9rZW4odG9rZW5zLCAhISh2ICYgbWFzayksICp0YWIrKyk7Ci0gICAgICAgICAgbWFzayA+Pj0gMTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY3R4ID0gMjsKLSAgICB9Ci0gICAgQWRkQ29uc3RhbnRUb2tlbih0b2tlbnMsIHNpZ24sIDEyOCk7Ci0gICAgYmFzZV9pZCA9IFRPS0VOX0lEKGNvZWZmX3R5cGUsIFZQOEVuY0JhbmRzW25dLCBjdHgsIDApOwotICAgIGlmIChuID09IDE2IHx8ICFBZGRUb2tlbih0b2tlbnMsIG4gPD0gbGFzdCwgYmFzZV9pZCArIDApKSB7Ci0gICAgICByZXR1cm4gMTsgICAvLyBFT0IKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLSN1bmRlZiBUT0tFTl9JRAotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVGhpcyBmdW5jdGlvbiB3b3JrcywgYnV0IGlzbid0IGN1cnJlbnRseSB1c2VkLiBTYXZlZCBmb3IgbGF0ZXIuCi0KLSNpZiAwCi0KLXN0YXRpYyB2b2lkIFJlY29yZChpbnQgYml0LCBwcm9iYV90KiBjb25zdCBzdGF0cykgewotICBwcm9iYV90IHAgPSAqc3RhdHM7Ci0gIGlmIChwID49IDB4ZmZmZjAwMDB1KSB7ICAgICAgICAgICAgICAgLy8gYW4gb3ZlcmZsb3cgaXMgaW5ib3VuZC4KLSAgICBwID0gKChwICsgMXUpID4+IDEpICYgMHg3ZmZmN2ZmZnU7ICAvLyAtPiBkaXZpZGUgdGhlIHN0YXRzIGJ5IDIuCi0gIH0KLSAgLy8gcmVjb3JkIGJpdCBjb3VudCAobG93ZXIgMTYgYml0cykgYW5kIGluY3JlbWVudCB0b3RhbCBjb3VudCAodXBwZXIgMTYgYml0cykuCi0gIHAgKz0gMHgwMDAxMDAwMHUgKyBiaXQ7Ci0gICpzdGF0cyA9IHA7Ci19Ci0KLXZvaWQgVlA4VG9rZW5Ub1N0YXRzKGNvbnN0IFZQOFRCdWZmZXIqIGNvbnN0IGIsIHByb2JhX3QqIGNvbnN0IHN0YXRzKSB7Ci0gIGNvbnN0IFZQOFRva2VucyogcCA9IGItPnBhZ2VzXzsKLSAgd2hpbGUgKHAgIT0gTlVMTCkgewotICAgIGNvbnN0IGludCBOID0gKHAtPm5leHRfID09IE5VTEwpID8gYi0+bGVmdF8gOiAwOwotICAgIGludCBuID0gTUFYX05VTV9UT0tFTjsKLSAgICB3aGlsZSAobi0tID4gTikgewotICAgICAgY29uc3QgdWludDE2X3QgdG9rZW4gPSBwLT50b2tlbnNfW25dOwotICAgICAgaWYgKCEodG9rZW4gJiBGSVhFRF9QUk9CQV9CSVQpKSB7Ci0gICAgICAgIFJlY29yZCgodG9rZW4gPj4gMTUpICYgMSwgc3RhdHMgKyAodG9rZW4gJiAweDNmZmZ1KSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHAgPSBwLT5uZXh0XzsKLSAgfQotfQotCi0jZW5kaWYgICAvLyAwCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBGaW5hbCBjb2RpbmcgcGFzcywgd2l0aCBrbm93biBwcm9iYWJpbGl0aWVzCi0KLWludCBWUDhFbWl0VG9rZW5zKFZQOFRCdWZmZXIqIGNvbnN0IGIsIFZQOEJpdFdyaXRlciogY29uc3QgYncsCi0gICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBwcm9iYXMsIGludCBmaW5hbF9wYXNzKSB7Ci0gIGNvbnN0IFZQOFRva2VucyogcCA9IGItPnBhZ2VzXzsKLSAgKHZvaWQpZmluYWxfcGFzczsKLSAgaWYgKGItPmVycm9yXykgcmV0dXJuIDA7Ci0gIHdoaWxlIChwICE9IE5VTEwpIHsKLSAgICBjb25zdCBWUDhUb2tlbnMqIGNvbnN0IG5leHQgPSBwLT5uZXh0XzsKLSAgICBjb25zdCBpbnQgTiA9IChuZXh0ID09IE5VTEwpID8gYi0+bGVmdF8gOiAwOwotICAgIGludCBuID0gTUFYX05VTV9UT0tFTjsKLSAgICB3aGlsZSAobi0tID4gTikgewotICAgICAgY29uc3QgdWludDE2X3QgdG9rZW4gPSBwLT50b2tlbnNfW25dOwotICAgICAgY29uc3QgaW50IGJpdCA9ICh0b2tlbiA+PiAxNSkgJiAxOwotICAgICAgaWYgKHRva2VuICYgRklYRURfUFJPQkFfQklUKSB7Ci0gICAgICAgIFZQOFB1dEJpdChidywgYml0LCB0b2tlbiAmIDB4ZmZ1KTsgIC8vIGNvbnN0YW50IHByb2JhCi0gICAgICB9IGVsc2UgewotICAgICAgICBWUDhQdXRCaXQoYncsIGJpdCwgcHJvYmFzW3Rva2VuICYgMHgzZmZmdV0pOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoZmluYWxfcGFzcykgU2JNZW1vcnlEZWFsbG9jYXRlKCh2b2lkKilwKTsKLSAgICBwID0gbmV4dDsKLSAgfQotICBpZiAoZmluYWxfcGFzcykgYi0+cGFnZXNfID0gTlVMTDsKLSAgcmV0dXJuIDE7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNlbHNlICAgICAvLyBESVNBQkxFX1RPS0VOX0JVRkZFUgotCi12b2lkIFZQOFRCdWZmZXJJbml0KFZQOFRCdWZmZXIqIGNvbnN0IGIpIHsKLSAgKHZvaWQpYjsKLX0KLXZvaWQgVlA4VEJ1ZmZlckNsZWFyKFZQOFRCdWZmZXIqIGNvbnN0IGIpIHsKLSAgKHZvaWQpYjsKLX0KLQotI2VuZGlmICAgIC8vICFESVNBQkxFX1RPS0VOX0JVRkZFUgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy90cmVlLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvdHJlZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWRmNzFmLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy90cmVlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MTcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIFRva2VuIHByb2JhYmlsaXRpZXMKLS8vCi0vLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQotCi0jaW5jbHVkZSAiLi92cDhlbmNpLmgiCi0KLSNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCi0jZW5kaWYKLQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIERlZmF1bHQgcHJvYmFiaWxpdGllcwotCi0vLyBQYXJhZ3JhcGggMTMuNQotY29uc3QgdWludDhfdAotICBWUDhDb2VmZnNQcm9iYTBbTlVNX1RZUEVTXVtOVU1fQkFORFNdW05VTV9DVFhdW05VTV9QUk9CQVNdID0gewotICAvLyBnZW5lcmVhdGVkIHVzaW5nIHZwOF9kZWZhdWx0X2NvZWZfcHJvYnMoKSBpbiBlbnRyb3B5LmM6MTI5Ci0gIHsgeyB7IDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCi0gICAgICB7IDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCi0gICAgICB7IDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0KLSAgICB9LAotICAgIHsgeyAyNTMsIDEzNiwgMjU0LCAyNTUsIDIyOCwgMjE5LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAotICAgICAgeyAxODksIDEyOSwgMjQyLCAyNTUsIDIyNywgMjEzLCAyNTUsIDIxOSwgMTI4LCAxMjgsIDEyOCB9LAotICAgICAgeyAxMDYsIDEyNiwgMjI3LCAyNTIsIDIxNCwgMjA5LCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCB9Ci0gICAgfSwKLSAgICB7IHsgMSwgOTgsIDI0OCwgMjU1LCAyMzYsIDIyNiwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfSwKLSAgICAgIHsgMTgxLCAxMzMsIDIzOCwgMjU0LCAyMjEsIDIzNCwgMjU1LCAxNTQsIDEyOCwgMTI4LCAxMjggfSwKLSAgICAgIHsgNzgsIDEzNCwgMjAyLCAyNDcsIDE5OCwgMTgwLCAyNTUsIDIxOSwgMTI4LCAxMjgsIDEyOCB9LAotICAgIH0sCi0gICAgeyB7IDEsIDE4NSwgMjQ5LCAyNTUsIDI0MywgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAotICAgICAgeyAxODQsIDE1MCwgMjQ3LCAyNTUsIDIzNiwgMjI0LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAotICAgICAgeyA3NywgMTEwLCAyMTYsIDI1NSwgMjM2LCAyMzAsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCi0gICAgfSwKLSAgICB7IHsgMSwgMTAxLCAyNTEsIDI1NSwgMjQxLCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCi0gICAgICB7IDE3MCwgMTM5LCAyNDEsIDI1MiwgMjM2LCAyMDksIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4IH0sCi0gICAgICB7IDM3LCAxMTYsIDE5NiwgMjQzLCAyMjgsIDI1NSwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfQotICAgIH0sCi0gICAgeyB7IDEsIDIwNCwgMjU0LCAyNTUsIDI0NSwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAotICAgICAgeyAyMDcsIDE2MCwgMjUwLCAyNTUsIDIzOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAotICAgICAgeyAxMDIsIDEwMywgMjMxLCAyNTUsIDIxMSwgMTcxLCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9Ci0gICAgfSwKLSAgICB7IHsgMSwgMTUyLCAyNTIsIDI1NSwgMjQwLCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCi0gICAgICB7IDE3NywgMTM1LCAyNDMsIDI1NSwgMjM0LCAyMjUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCi0gICAgICB7IDgwLCAxMjksIDIxMSwgMjU1LCAxOTQsIDIyNCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfQotICAgIH0sCi0gICAgeyB7IDEsIDEsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKLSAgICAgIHsgMjQ2LCAxLCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCi0gICAgICB7IDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0KLSAgICB9Ci0gIH0sCi0gIHsgeyB7IDE5OCwgMzUsIDIzNywgMjIzLCAxOTMsIDE4NywgMTYyLCAxNjAsIDE0NSwgMTU1LCA2MiB9LAotICAgICAgeyAxMzEsIDQ1LCAxOTgsIDIyMSwgMTcyLCAxNzYsIDIyMCwgMTU3LCAyNTIsIDIyMSwgMSB9LAotICAgICAgeyA2OCwgNDcsIDE0NiwgMjA4LCAxNDksIDE2NywgMjIxLCAxNjIsIDI1NSwgMjIzLCAxMjggfQotICAgIH0sCi0gICAgeyB7IDEsIDE0OSwgMjQxLCAyNTUsIDIyMSwgMjI0LCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCB9LAotICAgICAgeyAxODQsIDE0MSwgMjM0LCAyNTMsIDIyMiwgMjIwLCAyNTUsIDE5OSwgMTI4LCAxMjgsIDEyOCB9LAotICAgICAgeyA4MSwgOTksIDE4MSwgMjQyLCAxNzYsIDE5MCwgMjQ5LCAyMDIsIDI1NSwgMjU1LCAxMjggfQotICAgIH0sCi0gICAgeyB7IDEsIDEyOSwgMjMyLCAyNTMsIDIxNCwgMTk3LCAyNDIsIDE5NiwgMjU1LCAyNTUsIDEyOCB9LAotICAgICAgeyA5OSwgMTIxLCAyMTAsIDI1MCwgMjAxLCAxOTgsIDI1NSwgMjAyLCAxMjgsIDEyOCwgMTI4IH0sCi0gICAgICB7IDIzLCA5MSwgMTYzLCAyNDIsIDE3MCwgMTg3LCAyNDcsIDIxMCwgMjU1LCAyNTUsIDEyOCB9Ci0gICAgfSwKLSAgICB7IHsgMSwgMjAwLCAyNDYsIDI1NSwgMjM0LCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCi0gICAgICB7IDEwOSwgMTc4LCAyNDEsIDI1NSwgMjMxLCAyNDUsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4IH0sCi0gICAgICB7IDQ0LCAxMzAsIDIwMSwgMjUzLCAyMDUsIDE5MiwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfQotICAgIH0sCi0gICAgeyB7IDEsIDEzMiwgMjM5LCAyNTEsIDIxOSwgMjA5LCAyNTUsIDE2NSwgMTI4LCAxMjgsIDEyOCB9LAotICAgICAgeyA5NCwgMTM2LCAyMjUsIDI1MSwgMjE4LCAxOTAsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4IH0sCi0gICAgICB7IDIyLCAxMDAsIDE3NCwgMjQ1LCAxODYsIDE2MSwgMjU1LCAxOTksIDEyOCwgMTI4LCAxMjggfQotICAgIH0sCi0gICAgeyB7IDEsIDE4MiwgMjQ5LCAyNTUsIDIzMiwgMjM1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAotICAgICAgeyAxMjQsIDE0MywgMjQxLCAyNTUsIDIyNywgMjM0LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAotICAgICAgeyAzNSwgNzcsIDE4MSwgMjUxLCAxOTMsIDIxMSwgMjU1LCAyMDUsIDEyOCwgMTI4LCAxMjggfQotICAgIH0sCi0gICAgeyB7IDEsIDE1NywgMjQ3LCAyNTUsIDIzNiwgMjMxLCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCB9LAotICAgICAgeyAxMjEsIDE0MSwgMjM1LCAyNTUsIDIyNSwgMjI3LCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCB9LAotICAgICAgeyA0NSwgOTksIDE4OCwgMjUxLCAxOTUsIDIxNywgMjU1LCAyMjQsIDEyOCwgMTI4LCAxMjggfQotICAgIH0sCi0gICAgeyB7IDEsIDEsIDI1MSwgMjU1LCAyMTMsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKLSAgICAgIHsgMjAzLCAxLCAyNDgsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCi0gICAgICB7IDEzNywgMSwgMTc3LCAyNTUsIDIyNCwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9Ci0gICAgfQotICB9LAotICB7IHsgeyAyNTMsIDksIDI0OCwgMjUxLCAyMDcsIDIwOCwgMjU1LCAxOTIsIDEyOCwgMTI4LCAxMjggfSwKLSAgICAgIHsgMTc1LCAxMywgMjI0LCAyNDMsIDE5MywgMTg1LCAyNDksIDE5OCwgMjU1LCAyNTUsIDEyOCB9LAotICAgICAgeyA3MywgMTcsIDE3MSwgMjIxLCAxNjEsIDE3OSwgMjM2LCAxNjcsIDI1NSwgMjM0LCAxMjggfQotICAgIH0sCi0gICAgeyB7IDEsIDk1LCAyNDcsIDI1MywgMjEyLCAxODMsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4IH0sCi0gICAgICB7IDIzOSwgOTAsIDI0NCwgMjUwLCAyMTEsIDIwOSwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfSwKLSAgICAgIHsgMTU1LCA3NywgMTk1LCAyNDgsIDE4OCwgMTk1LCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCB9Ci0gICAgfSwKLSAgICB7IHsgMSwgMjQsIDIzOSwgMjUxLCAyMTgsIDIxOSwgMjU1LCAyMDUsIDEyOCwgMTI4LCAxMjggfSwKLSAgICAgIHsgMjAxLCA1MSwgMjE5LCAyNTUsIDE5NiwgMTg2LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAotICAgICAgeyA2OSwgNDYsIDE5MCwgMjM5LCAyMDEsIDIxOCwgMjU1LCAyMjgsIDEyOCwgMTI4LCAxMjggfQotICAgIH0sCi0gICAgeyB7IDEsIDE5MSwgMjUxLCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAotICAgICAgeyAyMjMsIDE2NSwgMjQ5LCAyNTUsIDIxMywgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAotICAgICAgeyAxNDEsIDEyNCwgMjQ4LCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9Ci0gICAgfSwKLSAgICB7IHsgMSwgMTYsIDI0OCwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKLSAgICAgIHsgMTkwLCAzNiwgMjMwLCAyNTUsIDIzNiwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAotICAgICAgeyAxNDksIDEsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfQotICAgIH0sCi0gICAgeyB7IDEsIDIyNiwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAotICAgICAgeyAyNDcsIDE5MiwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAotICAgICAgeyAyNDAsIDEyOCwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9Ci0gICAgfSwKLSAgICB7IHsgMSwgMTM0LCAyNTIsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCi0gICAgICB7IDIxMywgNjIsIDI1MCwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKLSAgICAgIHsgNTUsIDkzLCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0KLSAgICB9LAotICAgIHsgeyAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAotICAgICAgeyAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAotICAgICAgeyAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9Ci0gICAgfQotICB9LAotICB7IHsgeyAyMDIsIDI0LCAyMTMsIDIzNSwgMTg2LCAxOTEsIDIyMCwgMTYwLCAyNDAsIDE3NSwgMjU1IH0sCi0gICAgICB7IDEyNiwgMzgsIDE4MiwgMjMyLCAxNjksIDE4NCwgMjI4LCAxNzQsIDI1NSwgMTg3LCAxMjggfSwKLSAgICAgIHsgNjEsIDQ2LCAxMzgsIDIxOSwgMTUxLCAxNzgsIDI0MCwgMTcwLCAyNTUsIDIxNiwgMTI4IH0KLSAgICB9LAotICAgIHsgeyAxLCAxMTIsIDIzMCwgMjUwLCAxOTksIDE5MSwgMjQ3LCAxNTksIDI1NSwgMjU1LCAxMjggfSwKLSAgICAgIHsgMTY2LCAxMDksIDIyOCwgMjUyLCAyMTEsIDIxNSwgMjU1LCAxNzQsIDEyOCwgMTI4LCAxMjggfSwKLSAgICAgIHsgMzksIDc3LCAxNjIsIDIzMiwgMTcyLCAxODAsIDI0NSwgMTc4LCAyNTUsIDI1NSwgMTI4IH0KLSAgICB9LAotICAgIHsgeyAxLCA1MiwgMjIwLCAyNDYsIDE5OCwgMTk5LCAyNDksIDIyMCwgMjU1LCAyNTUsIDEyOCB9LAotICAgICAgeyAxMjQsIDc0LCAxOTEsIDI0MywgMTgzLCAxOTMsIDI1MCwgMjIxLCAyNTUsIDI1NSwgMTI4IH0sCi0gICAgICB7IDI0LCA3MSwgMTMwLCAyMTksIDE1NCwgMTcwLCAyNDMsIDE4MiwgMjU1LCAyNTUsIDEyOCB9Ci0gICAgfSwKLSAgICB7IHsgMSwgMTgyLCAyMjUsIDI0OSwgMjE5LCAyNDAsIDI1NSwgMjI0LCAxMjgsIDEyOCwgMTI4IH0sCi0gICAgICB7IDE0OSwgMTUwLCAyMjYsIDI1MiwgMjE2LCAyMDUsIDI1NSwgMTcxLCAxMjgsIDEyOCwgMTI4IH0sCi0gICAgICB7IDI4LCAxMDgsIDE3MCwgMjQyLCAxODMsIDE5NCwgMjU0LCAyMjMsIDI1NSwgMjU1LCAxMjggfQotICAgIH0sCi0gICAgeyB7IDEsIDgxLCAyMzAsIDI1MiwgMjA0LCAyMDMsIDI1NSwgMTkyLCAxMjgsIDEyOCwgMTI4IH0sCi0gICAgICB7IDEyMywgMTAyLCAyMDksIDI0NywgMTg4LCAxOTYsIDI1NSwgMjMzLCAxMjgsIDEyOCwgMTI4IH0sCi0gICAgICB7IDIwLCA5NSwgMTUzLCAyNDMsIDE2NCwgMTczLCAyNTUsIDIwMywgMTI4LCAxMjgsIDEyOCB9Ci0gICAgfSwKLSAgICB7IHsgMSwgMjIyLCAyNDgsIDI1NSwgMjE2LCAyMTMsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCi0gICAgICB7IDE2OCwgMTc1LCAyNDYsIDI1MiwgMjM1LCAyMDUsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4IH0sCi0gICAgICB7IDQ3LCAxMTYsIDIxNSwgMjU1LCAyMTEsIDIxMiwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfQotICAgIH0sCi0gICAgeyB7IDEsIDEyMSwgMjM2LCAyNTMsIDIxMiwgMjE0LCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCB9LAotICAgICAgeyAxNDEsIDg0LCAyMTMsIDI1MiwgMjAxLCAyMDIsIDI1NSwgMjE5LCAxMjgsIDEyOCwgMTI4IH0sCi0gICAgICB7IDQyLCA4MCwgMTYwLCAyNDAsIDE2MiwgMTg1LCAyNTUsIDIwNSwgMTI4LCAxMjgsIDEyOCB9Ci0gICAgfSwKLSAgICB7IHsgMSwgMSwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAotICAgICAgeyAyNDQsIDEsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKLSAgICAgIHsgMjM4LCAxLCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0KLSAgICB9Ci0gIH0KLX07Ci0KLXZvaWQgVlA4RGVmYXVsdFByb2JhcyhWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKLSAgVlA4UHJvYmEqIGNvbnN0IHByb2JhcyA9ICZlbmMtPnByb2JhXzsKLSAgcHJvYmFzLT51c2Vfc2tpcF9wcm9iYV8gPSAwOwotICBTYk1lbW9yeVNldChwcm9iYXMtPnNlZ21lbnRzXywgMjU1dSwgc2l6ZW9mKHByb2Jhcy0+c2VnbWVudHNfKSk7Ci0gIFNiTWVtb3J5Q29weShwcm9iYXMtPmNvZWZmc18sIFZQOENvZWZmc1Byb2JhMCwgc2l6ZW9mKFZQOENvZWZmc1Byb2JhMCkpOwotICAvLyBOb3RlOiB3ZSBjb3VsZCBoYXJkLWNvZGUgdGhlIGxldmVsX2Nvc3RzXyBjb3JyZXNwb25kaW5nIHRvIFZQOENvZWZmc1Byb2JhMCwKLSAgLy8gYnV0IHRoYXQncyB+MTFrIG9mIHN0YXRpYyBkYXRhLiBCZXR0ZXIgY2FsbCBWUDhDYWxjdWxhdGVMZXZlbENvc3RzKCkgbGF0ZXIuCi0gIHByb2Jhcy0+ZGlydHlfID0gMTsKLX0KLQotLy8gUGFyYWdyYXBoIDExLjUuICA5MDBieXRlcy4KLXN0YXRpYyBjb25zdCB1aW50OF90IGtCTW9kZXNQcm9iYVtOVU1fQk1PREVTXVtOVU1fQk1PREVTXVtOVU1fQk1PREVTIC0gMV0gPSB7Ci0gIHsgeyAyMzEsIDEyMCwgNDgsIDg5LCAxMTUsIDExMywgMTIwLCAxNTIsIDExMiB9LAotICAgIHsgMTUyLCAxNzksIDY0LCAxMjYsIDE3MCwgMTE4LCA0NiwgNzAsIDk1IH0sCi0gICAgeyAxNzUsIDY5LCAxNDMsIDgwLCA4NSwgODIsIDcyLCAxNTUsIDEwMyB9LAotICAgIHsgNTYsIDU4LCAxMCwgMTcxLCAyMTgsIDE4OSwgMTcsIDEzLCAxNTIgfSwKLSAgICB7IDExNCwgMjYsIDE3LCAxNjMsIDQ0LCAxOTUsIDIxLCAxMCwgMTczIH0sCi0gICAgeyAxMjEsIDI0LCA4MCwgMTk1LCAyNiwgNjIsIDQ0LCA2NCwgODUgfSwKLSAgICB7IDE0NCwgNzEsIDEwLCAzOCwgMTcxLCAyMTMsIDE0NCwgMzQsIDI2IH0sCi0gICAgeyAxNzAsIDQ2LCA1NSwgMTksIDEzNiwgMTYwLCAzMywgMjA2LCA3MSB9LAotICAgIHsgNjMsIDIwLCA4LCAxMTQsIDExNCwgMjA4LCAxMiwgOSwgMjI2IH0sCi0gICAgeyA4MSwgNDAsIDExLCA5NiwgMTgyLCA4NCwgMjksIDE2LCAzNiB9IH0sCi0gIHsgeyAxMzQsIDE4MywgODksIDEzNywgOTgsIDEwMSwgMTA2LCAxNjUsIDE0OCB9LAotICAgIHsgNzIsIDE4NywgMTAwLCAxMzAsIDE1NywgMTExLCAzMiwgNzUsIDgwIH0sCi0gICAgeyA2NiwgMTAyLCAxNjcsIDk5LCA3NCwgNjIsIDQwLCAyMzQsIDEyOCB9LAotICAgIHsgNDEsIDUzLCA5LCAxNzgsIDI0MSwgMTQxLCAyNiwgOCwgMTA3IH0sCi0gICAgeyA3NCwgNDMsIDI2LCAxNDYsIDczLCAxNjYsIDQ5LCAyMywgMTU3IH0sCi0gICAgeyA2NSwgMzgsIDEwNSwgMTYwLCA1MSwgNTIsIDMxLCAxMTUsIDEyOCB9LAotICAgIHsgMTA0LCA3OSwgMTIsIDI3LCAyMTcsIDI1NSwgODcsIDE3LCA3IH0sCi0gICAgeyA4NywgNjgsIDcxLCA0NCwgMTE0LCA1MSwgMTUsIDE4NiwgMjMgfSwKLSAgICB7IDQ3LCA0MSwgMTQsIDExMCwgMTgyLCAxODMsIDIxLCAxNywgMTk0IH0sCi0gICAgeyA2NiwgNDUsIDI1LCAxMDIsIDE5NywgMTg5LCAyMywgMTgsIDIyIH0gfSwKLSAgeyB7IDg4LCA4OCwgMTQ3LCAxNTAsIDQyLCA0NiwgNDUsIDE5NiwgMjA1IH0sCi0gICAgeyA0MywgOTcsIDE4MywgMTE3LCA4NSwgMzgsIDM1LCAxNzksIDYxIH0sCi0gICAgeyAzOSwgNTMsIDIwMCwgODcsIDI2LCAyMSwgNDMsIDIzMiwgMTcxIH0sCi0gICAgeyA1NiwgMzQsIDUxLCAxMDQsIDExNCwgMTAyLCAyOSwgOTMsIDc3IH0sCi0gICAgeyAzOSwgMjgsIDg1LCAxNzEsIDU4LCAxNjUsIDkwLCA5OCwgNjQgfSwKLSAgICB7IDM0LCAyMiwgMTE2LCAyMDYsIDIzLCAzNCwgNDMsIDE2NiwgNzMgfSwKLSAgICB7IDEwNywgNTQsIDMyLCAyNiwgNTEsIDEsIDgxLCA0MywgMzEgfSwKLSAgICB7IDY4LCAyNSwgMTA2LCAyMiwgNjQsIDE3MSwgMzYsIDIyNSwgMTE0IH0sCi0gICAgeyAzNCwgMTksIDIxLCAxMDIsIDEzMiwgMTg4LCAxNiwgNzYsIDEyNCB9LAotICAgIHsgNjIsIDE4LCA3OCwgOTUsIDg1LCA1NywgNTAsIDQ4LCA1MSB9IH0sCi0gIHsgeyAxOTMsIDEwMSwgMzUsIDE1OSwgMjE1LCAxMTEsIDg5LCA0NiwgMTExIH0sCi0gICAgeyA2MCwgMTQ4LCAzMSwgMTcyLCAyMTksIDIyOCwgMjEsIDE4LCAxMTEgfSwKLSAgICB7IDExMiwgMTEzLCA3NywgODUsIDE3OSwgMjU1LCAzOCwgMTIwLCAxMTQgfSwKLSAgICB7IDQwLCA0MiwgMSwgMTk2LCAyNDUsIDIwOSwgMTAsIDI1LCAxMDkgfSwKLSAgICB7IDg4LCA0MywgMjksIDE0MCwgMTY2LCAyMTMsIDM3LCA0MywgMTU0IH0sCi0gICAgeyA2MSwgNjMsIDMwLCAxNTUsIDY3LCA0NSwgNjgsIDEsIDIwOSB9LAotICAgIHsgMTAwLCA4MCwgOCwgNDMsIDE1NCwgMSwgNTEsIDI2LCA3MSB9LAotICAgIHsgMTQyLCA3OCwgNzgsIDE2LCAyNTUsIDEyOCwgMzQsIDE5NywgMTcxIH0sCi0gICAgeyA0MSwgNDAsIDUsIDEwMiwgMjExLCAxODMsIDQsIDEsIDIyMSB9LAotICAgIHsgNTEsIDUwLCAxNywgMTY4LCAyMDksIDE5MiwgMjMsIDI1LCA4MiB9IH0sCi0gIHsgeyAxMzgsIDMxLCAzNiwgMTcxLCAyNywgMTY2LCAzOCwgNDQsIDIyOSB9LAotICAgIHsgNjcsIDg3LCA1OCwgMTY5LCA4MiwgMTE1LCAyNiwgNTksIDE3OSB9LAotICAgIHsgNjMsIDU5LCA5MCwgMTgwLCA1OSwgMTY2LCA5MywgNzMsIDE1NCB9LAotICAgIHsgNDAsIDQwLCAyMSwgMTE2LCAxNDMsIDIwOSwgMzQsIDM5LCAxNzUgfSwKLSAgICB7IDQ3LCAxNSwgMTYsIDE4MywgMzQsIDIyMywgNDksIDQ1LCAxODMgfSwKLSAgICB7IDQ2LCAxNywgMzMsIDE4MywgNiwgOTgsIDE1LCAzMiwgMTgzIH0sCi0gICAgeyA1NywgNDYsIDIyLCAyNCwgMTI4LCAxLCA1NCwgMTcsIDM3IH0sCi0gICAgeyA2NSwgMzIsIDczLCAxMTUsIDI4LCAxMjgsIDIzLCAxMjgsIDIwNSB9LAotICAgIHsgNDAsIDMsIDksIDExNSwgNTEsIDE5MiwgMTgsIDYsIDIyMyB9LAotICAgIHsgODcsIDM3LCA5LCAxMTUsIDU5LCA3NywgNjQsIDIxLCA0NyB9IH0sCi0gIHsgeyAxMDQsIDU1LCA0NCwgMjE4LCA5LCA1NCwgNTMsIDEzMCwgMjI2IH0sCi0gICAgeyA2NCwgOTAsIDcwLCAyMDUsIDQwLCA0MSwgMjMsIDI2LCA1NyB9LAotICAgIHsgNTQsIDU3LCAxMTIsIDE4NCwgNSwgNDEsIDM4LCAxNjYsIDIxMyB9LAotICAgIHsgMzAsIDM0LCAyNiwgMTMzLCAxNTIsIDExNiwgMTAsIDMyLCAxMzQgfSwKLSAgICB7IDM5LCAxOSwgNTMsIDIyMSwgMjYsIDExNCwgMzIsIDczLCAyNTUgfSwKLSAgICB7IDMxLCA5LCA2NSwgMjM0LCAyLCAxNSwgMSwgMTE4LCA3MyB9LAotICAgIHsgNzUsIDMyLCAxMiwgNTEsIDE5MiwgMjU1LCAxNjAsIDQzLCA1MSB9LAotICAgIHsgODgsIDMxLCAzNSwgNjcsIDEwMiwgODUsIDU1LCAxODYsIDg1IH0sCi0gICAgeyA1NiwgMjEsIDIzLCAxMTEsIDU5LCAyMDUsIDQ1LCAzNywgMTkyIH0sCi0gICAgeyA1NSwgMzgsIDcwLCAxMjQsIDczLCAxMDIsIDEsIDM0LCA5OCB9IH0sCi0gIHsgeyAxMjUsIDk4LCA0MiwgODgsIDEwNCwgODUsIDExNywgMTc1LCA4MiB9LAotICAgIHsgOTUsIDg0LCA1MywgODksIDEyOCwgMTAwLCAxMTMsIDEwMSwgNDUgfSwKLSAgICB7IDc1LCA3OSwgMTIzLCA0NywgNTEsIDEyOCwgODEsIDE3MSwgMSB9LAotICAgIHsgNTcsIDE3LCA1LCA3MSwgMTAyLCA1NywgNTMsIDQxLCA0OSB9LAotICAgIHsgMzgsIDMzLCAxMywgMTIxLCA1NywgNzMsIDI2LCAxLCA4NSB9LAotICAgIHsgNDEsIDEwLCA2NywgMTM4LCA3NywgMTEwLCA5MCwgNDcsIDExNCB9LAotICAgIHsgMTE1LCAyMSwgMiwgMTAsIDEwMiwgMjU1LCAxNjYsIDIzLCA2IH0sCi0gICAgeyAxMDEsIDI5LCAxNiwgMTAsIDg1LCAxMjgsIDEwMSwgMTk2LCAyNiB9LAotICAgIHsgNTcsIDE4LCAxMCwgMTAyLCAxMDIsIDIxMywgMzQsIDIwLCA0MyB9LAotICAgIHsgMTE3LCAyMCwgMTUsIDM2LCAxNjMsIDEyOCwgNjgsIDEsIDI2IH0gfSwKLSAgeyB7IDEwMiwgNjEsIDcxLCAzNywgMzQsIDUzLCAzMSwgMjQzLCAxOTIgfSwKLSAgICB7IDY5LCA2MCwgNzEsIDM4LCA3MywgMTE5LCAyOCwgMjIyLCAzNyB9LAotICAgIHsgNjgsIDQ1LCAxMjgsIDM0LCAxLCA0NywgMTEsIDI0NSwgMTcxIH0sCi0gICAgeyA2MiwgMTcsIDE5LCA3MCwgMTQ2LCA4NSwgNTUsIDYyLCA3MCB9LAotICAgIHsgMzcsIDQzLCAzNywgMTU0LCAxMDAsIDE2MywgODUsIDE2MCwgMSB9LAotICAgIHsgNjMsIDksIDkyLCAxMzYsIDI4LCA2NCwgMzIsIDIwMSwgODUgfSwKLSAgICB7IDc1LCAxNSwgOSwgOSwgNjQsIDI1NSwgMTg0LCAxMTksIDE2IH0sCi0gICAgeyA4NiwgNiwgMjgsIDUsIDY0LCAyNTUsIDI1LCAyNDgsIDEgfSwKLSAgICB7IDU2LCA4LCAxNywgMTMyLCAxMzcsIDI1NSwgNTUsIDExNiwgMTI4IH0sCi0gICAgeyA1OCwgMTUsIDIwLCA4MiwgMTM1LCA1NywgMjYsIDEyMSwgNDAgfSB9LAotICB7IHsgMTY0LCA1MCwgMzEsIDEzNywgMTU0LCAxMzMsIDI1LCAzNSwgMjE4IH0sCi0gICAgeyA1MSwgMTAzLCA0NCwgMTMxLCAxMzEsIDEyMywgMzEsIDYsIDE1OCB9LAotICAgIHsgODYsIDQwLCA2NCwgMTM1LCAxNDgsIDIyNCwgNDUsIDE4MywgMTI4IH0sCi0gICAgeyAyMiwgMjYsIDE3LCAxMzEsIDI0MCwgMTU0LCAxNCwgMSwgMjA5IH0sCi0gICAgeyA0NSwgMTYsIDIxLCA5MSwgNjQsIDIyMiwgNywgMSwgMTk3IH0sCi0gICAgeyA1NiwgMjEsIDM5LCAxNTUsIDYwLCAxMzgsIDIzLCAxMDIsIDIxMyB9LAotICAgIHsgODMsIDEyLCAxMywgNTQsIDE5MiwgMjU1LCA2OCwgNDcsIDI4IH0sCi0gICAgeyA4NSwgMjYsIDg1LCA4NSwgMTI4LCAxMjgsIDMyLCAxNDYsIDE3MSB9LAotICAgIHsgMTgsIDExLCA3LCA2MywgMTQ0LCAxNzEsIDQsIDQsIDI0NiB9LAotICAgIHsgMzUsIDI3LCAxMCwgMTQ2LCAxNzQsIDE3MSwgMTIsIDI2LCAxMjggfSB9LAotICB7IHsgMTkwLCA4MCwgMzUsIDk5LCAxODAsIDgwLCAxMjYsIDU0LCA0NSB9LAotICAgIHsgODUsIDEyNiwgNDcsIDg3LCAxNzYsIDUxLCA0MSwgMjAsIDMyIH0sCi0gICAgeyAxMDEsIDc1LCAxMjgsIDEzOSwgMTE4LCAxNDYsIDExNiwgMTI4LCA4NSB9LAotICAgIHsgNTYsIDQxLCAxNSwgMTc2LCAyMzYsIDg1LCAzNywgOSwgNjIgfSwKLSAgICB7IDcxLCAzMCwgMTcsIDExOSwgMTE4LCAyNTUsIDE3LCAxOCwgMTM4IH0sCi0gICAgeyAxMDEsIDM4LCA2MCwgMTM4LCA1NSwgNzAsIDQzLCAyNiwgMTQyIH0sCi0gICAgeyAxNDYsIDM2LCAxOSwgMzAsIDE3MSwgMjU1LCA5NywgMjcsIDIwIH0sCi0gICAgeyAxMzgsIDQ1LCA2MSwgNjIsIDIxOSwgMSwgODEsIDE4OCwgNjQgfSwKLSAgICB7IDMyLCA0MSwgMjAsIDExNywgMTUxLCAxNDIsIDIwLCAyMSwgMTYzIH0sCi0gICAgeyAxMTIsIDE5LCAxMiwgNjEsIDE5NSwgMTI4LCA0OCwgNCwgMjQgfSB9Ci19OwotCi1zdGF0aWMgaW50IFB1dEk0TW9kZShWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LCBpbnQgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHByb2IpIHsKLSAgaWYgKFZQOFB1dEJpdChidywgbW9kZSAhPSBCX0RDX1BSRUQsIHByb2JbMF0pKSB7Ci0gICAgaWYgKFZQOFB1dEJpdChidywgbW9kZSAhPSBCX1RNX1BSRUQsIHByb2JbMV0pKSB7Ci0gICAgICBpZiAoVlA4UHV0Qml0KGJ3LCBtb2RlICE9IEJfVkVfUFJFRCwgcHJvYlsyXSkpIHsKLSAgICAgICAgaWYgKCFWUDhQdXRCaXQoYncsIG1vZGUgPj0gQl9MRF9QUkVELCBwcm9iWzNdKSkgewotICAgICAgICAgIGlmIChWUDhQdXRCaXQoYncsIG1vZGUgIT0gQl9IRV9QUkVELCBwcm9iWzRdKSkgewotICAgICAgICAgICAgVlA4UHV0Qml0KGJ3LCBtb2RlICE9IEJfUkRfUFJFRCwgcHJvYls1XSk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmIChWUDhQdXRCaXQoYncsIG1vZGUgIT0gQl9MRF9QUkVELCBwcm9iWzZdKSkgewotICAgICAgICAgICAgaWYgKFZQOFB1dEJpdChidywgbW9kZSAhPSBCX1ZMX1BSRUQsIHByb2JbN10pKSB7Ci0gICAgICAgICAgICAgIFZQOFB1dEJpdChidywgbW9kZSAhPSBCX0hEX1BSRUQsIHByb2JbOF0pOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gbW9kZTsKLX0KLQotc3RhdGljIHZvaWQgUHV0STE2TW9kZShWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LCBpbnQgbW9kZSkgewotICBpZiAoVlA4UHV0Qml0KGJ3LCAobW9kZSA9PSBUTV9QUkVEIHx8IG1vZGUgPT0gSF9QUkVEKSwgMTU2KSkgewotICAgIFZQOFB1dEJpdChidywgbW9kZSA9PSBUTV9QUkVELCAxMjgpOyAgICAvLyBUTSBvciBIRQotICB9IGVsc2UgewotICAgIFZQOFB1dEJpdChidywgbW9kZSA9PSBWX1BSRUQsIDE2Myk7ICAgICAvLyBWRSBvciBEQwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIFB1dFVWTW9kZShWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LCBpbnQgdXZfbW9kZSkgewotICBpZiAoVlA4UHV0Qml0KGJ3LCB1dl9tb2RlICE9IERDX1BSRUQsIDE0MikpIHsKLSAgICBpZiAoVlA4UHV0Qml0KGJ3LCB1dl9tb2RlICE9IFZfUFJFRCwgMTE0KSkgewotICAgICAgVlA4UHV0Qml0KGJ3LCB1dl9tb2RlICE9IEhfUFJFRCwgMTgzKTsgICAgLy8gZWxzZTogVE1fUFJFRAotICAgIH0KLSAgfQotfQotCi1zdGF0aWMgdm9pZCBQdXRTZWdtZW50KFZQOEJpdFdyaXRlciogY29uc3QgYncsIGludCBzLCBjb25zdCB1aW50OF90KiBwKSB7Ci0gIGlmIChWUDhQdXRCaXQoYncsIHMgPj0gMiwgcFswXSkpIHAgKz0gMTsKLSAgVlA4UHV0Qml0KGJ3LCBzICYgMSwgcFsxXSk7Ci19Ci0KLXZvaWQgVlA4Q29kZUludHJhTW9kZXMoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7Ci0gIFZQOEJpdFdyaXRlciogY29uc3QgYncgPSAmZW5jLT5id187Ci0gIFZQOEVuY0l0ZXJhdG9yIGl0OwotICBWUDhJdGVyYXRvckluaXQoZW5jLCAmaXQpOwotICBkbyB7Ci0gICAgY29uc3QgVlA4TUJJbmZvKiBtYiA9IGl0Lm1iXzsKLSAgICBjb25zdCB1aW50OF90KiBwcmVkcyA9IGl0LnByZWRzXzsKLSAgICBpZiAoZW5jLT5zZWdtZW50X2hkcl8udXBkYXRlX21hcF8pIHsKLSAgICAgIFB1dFNlZ21lbnQoYncsIG1iLT5zZWdtZW50XywgZW5jLT5wcm9iYV8uc2VnbWVudHNfKTsKLSAgICB9Ci0gICAgaWYgKGVuYy0+cHJvYmFfLnVzZV9za2lwX3Byb2JhXykgewotICAgICAgVlA4UHV0Qml0KGJ3LCBtYi0+c2tpcF8sIGVuYy0+cHJvYmFfLnNraXBfcHJvYmFfKTsKLSAgICB9Ci0gICAgaWYgKFZQOFB1dEJpdChidywgKG1iLT50eXBlXyAhPSAwKSwgMTQ1KSkgeyAgLy8gaTE2eDE2Ci0gICAgICBQdXRJMTZNb2RlKGJ3LCBwcmVkc1swXSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNvbnN0IGludCBwcmVkc193ID0gZW5jLT5wcmVkc193XzsKLSAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcF9wcmVkID0gcHJlZHMgLSBwcmVkc193OwotICAgICAgaW50IHgsIHk7Ci0gICAgICBmb3IgKHkgPSAwOyB5IDwgNDsgKyt5KSB7Ci0gICAgICAgIGludCBsZWZ0ID0gcHJlZHNbLTFdOwotICAgICAgICBmb3IgKHggPSAwOyB4IDwgNDsgKyt4KSB7Ci0gICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgcHJvYmFzID0ga0JNb2Rlc1Byb2JhW3RvcF9wcmVkW3hdXVtsZWZ0XTsKLSAgICAgICAgICBsZWZ0ID0gUHV0STRNb2RlKGJ3LCBwcmVkc1t4XSwgcHJvYmFzKTsKLSAgICAgICAgfQotICAgICAgICB0b3BfcHJlZCA9IHByZWRzOwotICAgICAgICBwcmVkcyArPSBwcmVkc193OwotICAgICAgfQotICAgIH0KLSAgICBQdXRVVk1vZGUoYncsIG1iLT51dl9tb2RlXyk7Ci0gIH0gd2hpbGUgKFZQOEl0ZXJhdG9yTmV4dCgmaXQsIDApKTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFBhcmFncmFwaCAxMwotCi1jb25zdCB1aW50OF90Ci0gICAgVlA4Q29lZmZzVXBkYXRlUHJvYmFbTlVNX1RZUEVTXVtOVU1fQkFORFNdW05VTV9DVFhdW05VTV9QUk9CQVNdID0gewotICB7IHsgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAotICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAotICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9Ci0gICAgfSwKLSAgICB7IHsgMTc2LCAyNDYsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKLSAgICAgIHsgMjIzLCAyNDEsIDI1MiwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKLSAgICAgIHsgMjQ5LCAyNTMsIDI1MywgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQotICAgIH0sCi0gICAgeyB7IDI1NSwgMjQ0LCAyNTIsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCi0gICAgICB7IDIzNCwgMjU0LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCi0gICAgICB7IDI1MywgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KLSAgICB9LAotICAgIHsgeyAyNTUsIDI0NiwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAotICAgICAgeyAyMzksIDI1MywgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAotICAgICAgeyAyNTQsIDI1NSwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9Ci0gICAgfSwKLSAgICB7IHsgMjU1LCAyNDgsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKLSAgICAgIHsgMjUxLCAyNTUsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKLSAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQotICAgIH0sCi0gICAgeyB7IDI1NSwgMjUzLCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCi0gICAgICB7IDI1MSwgMjU0LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCi0gICAgICB7IDI1NCwgMjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KLSAgICB9LAotICAgIHsgeyAyNTUsIDI1NCwgMjUzLCAyNTUsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAotICAgICAgeyAyNTAsIDI1NSwgMjU0LCAyNTUsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAotICAgICAgeyAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9Ci0gICAgfSwKLSAgICB7IHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKLSAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKLSAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQotICAgIH0KLSAgfSwKLSAgeyB7IHsgMjE3LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKLSAgICAgIHsgMjI1LCAyNTIsIDI0MSwgMjUzLCAyNTUsIDI1NSwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKLSAgICAgIHsgMjM0LCAyNTAsIDI0MSwgMjUwLCAyNTMsIDI1NSwgMjUzLCAyNTQsIDI1NSwgMjU1LCAyNTUgfQotICAgIH0sCi0gICAgeyB7IDI1NSwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCi0gICAgICB7IDIyMywgMjU0LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCi0gICAgICB7IDIzOCwgMjUzLCAyNTQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KLSAgICB9LAotICAgIHsgeyAyNTUsIDI0OCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAotICAgICAgeyAyNDksIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAotICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9Ci0gICAgfSwKLSAgICB7IHsgMjU1LCAyNTMsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKLSAgICAgIHsgMjQ3LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKLSAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQotICAgIH0sCi0gICAgeyB7IDI1NSwgMjUzLCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCi0gICAgICB7IDI1MiwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCi0gICAgICB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KLSAgICB9LAotICAgIHsgeyAyNTUsIDI1NCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAotICAgICAgeyAyNTMsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAotICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9Ci0gICAgfSwKLSAgICB7IHsgMjU1LCAyNTQsIDI1MywgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKLSAgICAgIHsgMjUwLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKLSAgICAgIHsgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQotICAgIH0sCi0gICAgeyB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCi0gICAgICB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCi0gICAgICB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KLSAgICB9Ci0gIH0sCi0gIHsgeyB7IDE4NiwgMjUxLCAyNTAsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCi0gICAgICB7IDIzNCwgMjUxLCAyNDQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCi0gICAgICB7IDI1MSwgMjUxLCAyNDMsIDI1MywgMjU0LCAyNTUsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KLSAgICB9LAotICAgIHsgeyAyNTUsIDI1MywgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAotICAgICAgeyAyMzYsIDI1MywgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAotICAgICAgeyAyNTEsIDI1MywgMjUzLCAyNTQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9Ci0gICAgfSwKLSAgICB7IHsgMjU1LCAyNTQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKLSAgICAgIHsgMjU0LCAyNTQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKLSAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQotICAgIH0sCi0gICAgeyB7IDI1NSwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCi0gICAgICB7IDI1NCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCi0gICAgICB7IDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KLSAgICB9LAotICAgIHsgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAotICAgICAgeyAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAotICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9Ci0gICAgfSwKLSAgICB7IHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKLSAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKLSAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQotICAgIH0sCi0gICAgeyB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCi0gICAgICB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCi0gICAgICB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KLSAgICB9LAotICAgIHsgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAotICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAotICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9Ci0gICAgfQotICB9LAotICB7IHsgeyAyNDgsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAotICAgICAgeyAyNTAsIDI1NCwgMjUyLCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAotICAgICAgeyAyNDgsIDI1NCwgMjQ5LCAyNTMsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9Ci0gICAgfSwKLSAgICB7IHsgMjU1LCAyNTMsIDI1MywgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKLSAgICAgIHsgMjQ2LCAyNTMsIDI1MywgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKLSAgICAgIHsgMjUyLCAyNTQsIDI1MSwgMjU0LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQotICAgIH0sCi0gICAgeyB7IDI1NSwgMjU0LCAyNTIsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCi0gICAgICB7IDI0OCwgMjU0LCAyNTMsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCi0gICAgICB7IDI1MywgMjU1LCAyNTQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KLSAgICB9LAotICAgIHsgeyAyNTUsIDI1MSwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAotICAgICAgeyAyNDUsIDI1MSwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAotICAgICAgeyAyNTMsIDI1MywgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9Ci0gICAgfSwKLSAgICB7IHsgMjU1LCAyNTEsIDI1MywgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKLSAgICAgIHsgMjUyLCAyNTMsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKLSAgICAgIHsgMjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQotICAgIH0sCi0gICAgeyB7IDI1NSwgMjUyLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCi0gICAgICB7IDI0OSwgMjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCi0gICAgICB7IDI1NSwgMjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KLSAgICB9LAotICAgIHsgeyAyNTUsIDI1NSwgMjUzLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAotICAgICAgeyAyNTAsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAotICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9Ci0gICAgfSwKLSAgICB7IHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKLSAgICAgIHsgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKLSAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQotICAgIH0KLSAgfQotfTsKLQotdm9pZCBWUDhXcml0ZVByb2JhcyhWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LCBjb25zdCBWUDhQcm9iYSogY29uc3QgcHJvYmFzKSB7Ci0gIGludCB0LCBiLCBjLCBwOwotICBmb3IgKHQgPSAwOyB0IDwgTlVNX1RZUEVTOyArK3QpIHsKLSAgICBmb3IgKGIgPSAwOyBiIDwgTlVNX0JBTkRTOyArK2IpIHsKLSAgICAgIGZvciAoYyA9IDA7IGMgPCBOVU1fQ1RYOyArK2MpIHsKLSAgICAgICAgZm9yIChwID0gMDsgcCA8IE5VTV9QUk9CQVM7ICsrcCkgewotICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgcDAgPSBwcm9iYXMtPmNvZWZmc19bdF1bYl1bY11bcF07Ci0gICAgICAgICAgY29uc3QgaW50IHVwZGF0ZSA9IChwMCAhPSBWUDhDb2VmZnNQcm9iYTBbdF1bYl1bY11bcF0pOwotICAgICAgICAgIGlmIChWUDhQdXRCaXQoYncsIHVwZGF0ZSwgVlA4Q29lZmZzVXBkYXRlUHJvYmFbdF1bYl1bY11bcF0pKSB7Ci0gICAgICAgICAgICBWUDhQdXRWYWx1ZShidywgcDAsIDgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICBpZiAoVlA4UHV0Qml0VW5pZm9ybShidywgcHJvYmFzLT51c2Vfc2tpcF9wcm9iYV8pKSB7Ci0gICAgVlA4UHV0VmFsdWUoYncsIHByb2Jhcy0+c2tpcF9wcm9iYV8sIDgpOwotICB9Ci19Ci0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL3ZwOGVuY2kuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy92cDhlbmNpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMzcxNDAuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL3ZwOGVuY2kuaAorKysgL2Rldi9udWxsCkBAIC0xLDU1NSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gICBXZWJQIGVuY29kZXI6IGludGVybmFsIGhlYWRlci4KLS8vCi0vLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQotCi0jaWZuZGVmIFdFQlBfRU5DX1ZQOEVOQ0lfSF8KLSNkZWZpbmUgV0VCUF9FTkNfVlA4RU5DSV9IXwotCi0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNlbHNlCi0jaW5jbHVkZSA8c3RyaW5nLmg+ICAgICAvLyBmb3IgbWVtY3B5KCkKLSNlbmRpZgotI2luY2x1ZGUgIi4uL3dlYnAvZW5jb2RlLmgiCi0jaW5jbHVkZSAiLi4vZHNwL2RzcC5oIgotI2luY2x1ZGUgIi4uL3V0aWxzL2JpdF93cml0ZXIuaCIKLSNpbmNsdWRlICIuLi91dGlscy90aHJlYWQuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBWYXJpb3VzIGRlZmluZXMgYW5kIGVudW1zCi0KLS8vIHZlcnNpb24gbnVtYmVycwotI2RlZmluZSBFTkNfTUFKX1ZFUlNJT04gMAotI2RlZmluZSBFTkNfTUlOX1ZFUlNJT04gMwotI2RlZmluZSBFTkNfUkVWX1ZFUlNJT04gMQotCi0vLyBpbnRyYSBwcmVkaWN0aW9uIG1vZGVzCi1lbnVtIHsgQl9EQ19QUkVEID0gMCwgICAvLyA0eDQgbW9kZXMKLSAgICAgICBCX1RNX1BSRUQgPSAxLAotICAgICAgIEJfVkVfUFJFRCA9IDIsCi0gICAgICAgQl9IRV9QUkVEID0gMywKLSAgICAgICBCX1JEX1BSRUQgPSA0LAotICAgICAgIEJfVlJfUFJFRCA9IDUsCi0gICAgICAgQl9MRF9QUkVEID0gNiwKLSAgICAgICBCX1ZMX1BSRUQgPSA3LAotICAgICAgIEJfSERfUFJFRCA9IDgsCi0gICAgICAgQl9IVV9QUkVEID0gOSwKLSAgICAgICBOVU1fQk1PREVTID0gQl9IVV9QUkVEICsgMSAtIEJfRENfUFJFRCwgIC8vID0gMTAKLQotICAgICAgIC8vIEx1bWExNiBvciBVViBtb2RlcwotICAgICAgIERDX1BSRUQgPSBCX0RDX1BSRUQsIFZfUFJFRCA9IEJfVkVfUFJFRCwKLSAgICAgICBIX1BSRUQgPSBCX0hFX1BSRUQsIFRNX1BSRUQgPSBCX1RNX1BSRUQsCi0gICAgICAgTlVNX1BSRURfTU9ERVMgPSA0Ci0gICAgIH07Ci0KLWVudW0geyBOVU1fTUJfU0VHTUVOVFMgPSA0LAotICAgICAgIE1BWF9OVU1fUEFSVElUSU9OUyA9IDgsCi0gICAgICAgTlVNX1RZUEVTID0gNCwgICAvLyAwOiBpMTYtQUMsICAxOiBpMTYtREMsICAyOmNocm9tYS1BQywgIDM6aTQtQUMKLSAgICAgICBOVU1fQkFORFMgPSA4LAotICAgICAgIE5VTV9DVFggPSAzLAotICAgICAgIE5VTV9QUk9CQVMgPSAxMSwKLSAgICAgICBNQVhfTEZfTEVWRUxTID0gNjQsICAgICAgIC8vIE1heGltdW0gbG9vcCBmaWx0ZXIgbGV2ZWwKLSAgICAgICBNQVhfVkFSSUFCTEVfTEVWRUwgPSA2NywgIC8vIGxhc3QgKGluY2x1c2l2ZSkgbGV2ZWwgd2l0aCB2YXJpYWJsZSBjb3N0Ci0gICAgICAgTUFYX0xFVkVMID0gMjA0NyAgICAgICAgICAvLyBtYXggbGV2ZWwgKG5vdGU6IG1heCBjb2RhYmxlIGlzIDIwNDcgKyA2NykKLSAgICAgfTsKLQotdHlwZWRlZiBlbnVtIHsgICAvLyBSYXRlLWRpc3RvcnRpb24gb3B0aW1pemF0aW9uIGxldmVscwotICBSRF9PUFRfTk9ORSAgICAgICAgPSAwLCAgLy8gbm8gcmQtb3B0Ci0gIFJEX09QVF9CQVNJQyAgICAgICA9IDEsICAvLyBiYXNpYyBzY29yaW5nIChubyB0cmVsbGlzKQotICBSRF9PUFRfVFJFTExJUyAgICAgPSAyLCAgLy8gcGVyZm9ybSB0cmVsbGlzLXF1YW50IG9uIHRoZSBmaW5hbCBkZWNpc2lvbiBvbmx5Ci0gIFJEX09QVF9UUkVMTElTX0FMTCA9IDMgICAvLyB0cmVsbGlzLXF1YW50IGZvciBldmVyeSBzY29yaW5nIChtdWNoIHNsb3dlcikKLX0gVlA4UkRMZXZlbDsKLQotLy8gWVVWLWNhY2hlIHBhcmFtZXRlcnMuIENhY2hlIGlzIDE2LXBpeGVscyB3aWRlLgotLy8gVGhlIG9yaWdpbmFsIG9yIHJlY29uc3RydWN0ZWQgc2FtcGxlcyBjYW4gYmUgYWNjZXNzZWQgdXNpbmcgVlA4U2NhbltdCi0vLyBUaGUgcHJlZGljdGVkIGJsb2NrcyBjYW4gYmUgYWNjZXNzZWQgdXNpbmcgb2Zmc2V0cyB0byB5dXZfcF8gYW5kCi0vLyB0aGUgYXJyYXlzIFZQOCpNb2RlT2Zmc2V0c1tdOwotLy8gICAgICAgICArLS0tLSsgICAgICBZVVYgU2FtcGxlcyBhcmVhLiBTZWUgVlA4U2NhbltdIGZvciBhY2Nlc3NpbmcgdGhlIGJsb2Nrcy4KLS8vICBZX09GRiAgfFlZWVl8IDwtIG9yaWdpbmFsIHNhbXBsZXMgIChlbmMtPnl1dl9pbl8pCi0vLyAgICAgICAgIHxZWVlZfAotLy8gICAgICAgICB8WVlZWXwKLS8vICAgICAgICAgfFlZWVl8Ci0vLyAgVV9PRkYgIHxVVVZWfCBWX09GRiAgKD1VX09GRiArIDgpCi0vLyAgICAgICAgIHxVVVZWfAotLy8gICAgICAgICArLS0tLSsKLS8vICBZX09GRiAgfFlZWVl8IDwtIGNvbXByZXNzZWQvZGVjb2RlZCBzYW1wbGVzICAoJ3l1dl9vdXRfJykKLS8vICAgICAgICAgfFlZWVl8ICAgIFRoZXJlIGFyZSB0d28gYnVmZmVycyBsaWtlIHRoaXMgKCd5dXZfb3V0XycvJ3l1dl9vdXQyXycpCi0vLyAgICAgICAgIHxZWVlZfAotLy8gICAgICAgICB8WVlZWXwKLS8vICBVX09GRiAgfFVVVlZ8IFZfT0ZGCi0vLyAgICAgICAgIHxVVVZWfAotLy8gICAgICAgICAgeDIgKGZvciB5dXZfb3V0Ml8pCi0vLyAgICAgICAgICstLS0tKyAgICAgUHJlZGljdGlvbiBhcmVhICgneXV2X3BfJywgc2l6ZSA9IFBSRURfU0laRSkKLS8vIEkxNkRDMTYgfFlZWVl8ICBJbnRyYTE2IHByZWRpY3Rpb25zICgxNngxNiBibG9jayBlYWNoKQotLy8gICAgICAgICB8WVlZWXwKLS8vICAgICAgICAgfFlZWVl8Ci0vLyAgICAgICAgIHxZWVlZfAotLy8gSTE2VE0xNiB8WVlZWXwKLS8vICAgICAgICAgfFlZWVl8Ci0vLyAgICAgICAgIHxZWVlZfAotLy8gICAgICAgICB8WVlZWXwKLS8vIEkxNlZFMTYgfFlZWVl8Ci0vLyAgICAgICAgIHxZWVlZfAotLy8gICAgICAgICB8WVlZWXwKLS8vICAgICAgICAgfFlZWVl8Ci0vLyBJMTZIRTE2IHxZWVlZfAotLy8gICAgICAgICB8WVlZWXwKLS8vICAgICAgICAgfFlZWVl8Ci0vLyAgICAgICAgIHxZWVlZfAotLy8gICAgICAgICArLS0tLSsgIENocm9tYSBVL1YgcHJlZGljdGlvbnMgKDE2eDggYmxvY2sgZWFjaCkKLS8vIEM4REM4ICAgfFVVVlZ8Ci0vLyAgICAgICAgIHxVVVZWfAotLy8gQzhUTTggICB8VVVWVnwKLS8vICAgICAgICAgfFVVVlZ8Ci0vLyBDOFZFOCAgIHxVVVZWfAotLy8gICAgICAgICB8VVVWVnwKLS8vIEM4SEU4ICAgfFVVVlZ8Ci0vLyAgICAgICAgIHxVVVZWfAotLy8gICAgICAgICArLS0tLSsgIEludHJhIDR4NCBwcmVkaWN0aW9ucyAoNHg0IGJsb2NrIGVhY2gpCi0vLyAgICAgICAgIHxZWVlZfCBJNERDNCBJNFRNNCBJNFZFNCBJNEhFNAotLy8gICAgICAgICB8WVlZWXwgSTRSRDQgSTRWUjQgSTRMRDQgSTRWTDQKLS8vICAgICAgICAgfFlZLi58IEk0SEQ0IEk0SFU0IEk0VE1QCi0vLyAgICAgICAgICstLS0tKwotI2RlZmluZSBCUFMgICAgICAgMTYgICAvLyB0aGlzIGlzIHRoZSBjb21tb24gc3RyaWRlCi0jZGVmaW5lIFlfU0laRSAgIChCUFMgKiAxNikKLSNkZWZpbmUgVVZfU0laRSAgKEJQUyAqIDgpCi0jZGVmaW5lIFlVVl9TSVpFIChZX1NJWkUgKyBVVl9TSVpFKQotI2RlZmluZSBQUkVEX1NJWkUgKDYgKiAxNiAqIEJQUyArIDEyICogQlBTKQotI2RlZmluZSBZX09GRiAgICAoMCkKLSNkZWZpbmUgVV9PRkYgICAgKFlfU0laRSkKLSNkZWZpbmUgVl9PRkYgICAgKFVfT0ZGICsgOCkKLSNkZWZpbmUgQUxJR05fQ1NUIDE1Ci0jZGVmaW5lIERPX0FMSUdOKFBUUikgKCh1aW50cHRyX3QpKChQVFIpICsgQUxJR05fQ1NUKSAmIH5BTElHTl9DU1QpCi0KLWV4dGVybiBjb25zdCBpbnQgVlA4U2NhblsxNiArIDQgKyA0XTsgICAgICAgICAgIC8vIGluIHF1YW50LmMKLWV4dGVybiBjb25zdCBpbnQgVlA4VVZNb2RlT2Zmc2V0c1s0XTsgICAgICAgICAgIC8vIGluIGFuYWx5emUuYwotZXh0ZXJuIGNvbnN0IGludCBWUDhJMTZNb2RlT2Zmc2V0c1s0XTsKLWV4dGVybiBjb25zdCBpbnQgVlA4STRNb2RlT2Zmc2V0c1tOVU1fQk1PREVTXTsKLQotLy8gTGF5b3V0IG9mIHByZWRpY3Rpb24gYmxvY2tzCi0vLyBpbnRyYSAxNngxNgotI2RlZmluZSBJMTZEQzE2ICgwICogMTYgKiBCUFMpCi0jZGVmaW5lIEkxNlRNMTYgKDEgKiAxNiAqIEJQUykKLSNkZWZpbmUgSTE2VkUxNiAoMiAqIDE2ICogQlBTKQotI2RlZmluZSBJMTZIRTE2ICgzICogMTYgKiBCUFMpCi0vLyBjaHJvbWEgOHg4LCB0d28gVS9WIGJsb2NrcyBzaWRlIGJ5IHNpZGUgKGhlbmNlOiAxNng4IGVhY2gpCi0jZGVmaW5lIEM4REM4ICg0ICogMTYgKiBCUFMpCi0jZGVmaW5lIEM4VE04ICg0ICogMTYgKiBCUFMgKyA4ICogQlBTKQotI2RlZmluZSBDOFZFOCAoNSAqIDE2ICogQlBTKQotI2RlZmluZSBDOEhFOCAoNSAqIDE2ICogQlBTICsgOCAqIEJQUykKLS8vIGludHJhIDR4NAotI2RlZmluZSBJNERDNCAoNiAqIDE2ICogQlBTICsgIDApCi0jZGVmaW5lIEk0VE00ICg2ICogMTYgKiBCUFMgKyAgNCkKLSNkZWZpbmUgSTRWRTQgKDYgKiAxNiAqIEJQUyArICA4KQotI2RlZmluZSBJNEhFNCAoNiAqIDE2ICogQlBTICsgMTIpCi0jZGVmaW5lIEk0UkQ0ICg2ICogMTYgKiBCUFMgKyA0ICogQlBTICsgIDApCi0jZGVmaW5lIEk0VlI0ICg2ICogMTYgKiBCUFMgKyA0ICogQlBTICsgIDQpCi0jZGVmaW5lIEk0TEQ0ICg2ICogMTYgKiBCUFMgKyA0ICogQlBTICsgIDgpCi0jZGVmaW5lIEk0Vkw0ICg2ICogMTYgKiBCUFMgKyA0ICogQlBTICsgMTIpCi0jZGVmaW5lIEk0SEQ0ICg2ICogMTYgKiBCUFMgKyA4ICogQlBTICsgIDApCi0jZGVmaW5lIEk0SFU0ICg2ICogMTYgKiBCUFMgKyA4ICogQlBTICsgIDQpCi0jZGVmaW5lIEk0VE1QICg2ICogMTYgKiBCUFMgKyA4ICogQlBTICsgIDgpCi0KLXR5cGVkZWYgaW50NjRfdCBzY29yZV90OyAgICAgLy8gdHlwZSB1c2VkIGZvciBzY29yZXMsIHJhdGUsIGRpc3RvcnRpb24KLSNkZWZpbmUgTUFYX0NPU1QgKChzY29yZV90KTB4N2ZmZmZmZmZmZmZmZmZMTCkKLQotI2RlZmluZSBRRklYIDE3Ci0jZGVmaW5lIEJJQVMoYikgICgoYikgPDwgKFFGSVggLSA4KSkKLS8vIEZ1biBmYWN0OiB0aGlzIGlzIHRoZSBfb25seV8gbGluZSB3aGVyZSB3ZSdyZSBhY3R1YWxseSBiZWluZyBsb3NzeSBhbmQKLS8vIGRpc2NhcmRpbmcgYml0cy4KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgUVVBTlRESVYoaW50IG4sIGludCBpUSwgaW50IEIpIHsKLSAgcmV0dXJuIChuICogaVEgKyBCKSA+PiBRRklYOwotfQotCi0vLyBzaXplIG9mIGhpc3RvZ3JhbSB1c2VkIGJ5IENvbGxlY3RIaXN0b2dyYW0uCi0jZGVmaW5lIE1BWF9DT0VGRl9USFJFU0ggICAzMQotdHlwZWRlZiBzdHJ1Y3QgVlA4SGlzdG9ncmFtIFZQOEhpc3RvZ3JhbTsKLXN0cnVjdCBWUDhIaXN0b2dyYW0gewotICAvLyBUT0RPKHNrYWwpOiB3ZSBvbmx5IG5lZWQgdG8gc3RvcmUgdGhlIG1heF92YWx1ZSBhbmQgbGFzdF9ub25femVybyBhY3R1YWxseS4KLSAgaW50IGRpc3RyaWJ1dGlvbltNQVhfQ09FRkZfVEhSRVNIICsgMV07Ci19OwotCi0vLyBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZyB0byByZW1vdmUgdG9rZW4tYnVmZmVyIGNvZGU6Ci0vLyAjZGVmaW5lIERJU0FCTEVfVE9LRU5fQlVGRkVSCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBIZWFkZXJzCi0KLXR5cGVkZWYgdWludDMyX3QgcHJvYmFfdDsgICAvLyAxNmIgKyAxNmIKLXR5cGVkZWYgdWludDhfdCBQcm9iYUFycmF5W05VTV9DVFhdW05VTV9QUk9CQVNdOwotdHlwZWRlZiBwcm9iYV90IFN0YXRzQXJyYXlbTlVNX0NUWF1bTlVNX1BST0JBU107Ci10eXBlZGVmIHVpbnQxNl90IENvc3RBcnJheVtOVU1fQ1RYXVtNQVhfVkFSSUFCTEVfTEVWRUwgKyAxXTsKLXR5cGVkZWYgZG91YmxlIExGU3RhdHNbTlVNX01CX1NFR01FTlRTXVtNQVhfTEZfTEVWRUxTXTsgIC8vIGZpbHRlciBzdGF0cwotCi10eXBlZGVmIHN0cnVjdCBWUDhFbmNvZGVyIFZQOEVuY29kZXI7Ci0KLS8vIHNlZ21lbnQgZmVhdHVyZXMKLXR5cGVkZWYgc3RydWN0IHsKLSAgaW50IG51bV9zZWdtZW50c187ICAgICAgLy8gQWN0dWFsIG51bWJlciBvZiBzZWdtZW50cy4gMSBzZWdtZW50IG9ubHkgPSB1bnVzZWQuCi0gIGludCB1cGRhdGVfbWFwXzsgICAgICAgIC8vIHdoZXRoZXIgdG8gdXBkYXRlIHRoZSBzZWdtZW50IG1hcCBvciBub3QuCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11c3QgYmUgMCBpZiB0aGVyZSdzIG9ubHkgMSBzZWdtZW50LgotICBpbnQgc2l6ZV87ICAgICAgICAgICAgICAvLyBiaXQtY29zdCBmb3IgdHJhbnNtaXR0aW5nIHRoZSBzZWdtZW50IG1hcAotfSBWUDhTZWdtZW50SGVhZGVyOwotCi0vLyBTdHJ1Y3QgY29sbGVjdGluZyBhbGwgZnJhbWUtcGVyc2lzdGVudCBwcm9iYWJpbGl0aWVzLgotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IHNlZ21lbnRzX1szXTsgICAgIC8vIHByb2JhYmlsaXRpZXMgZm9yIHNlZ21lbnQgdHJlZQotICB1aW50OF90IHNraXBfcHJvYmFfOyAgICAgIC8vIGZpbmFsIHByb2JhYmlsaXR5IG9mIGJlaW5nIHNraXBwZWQuCi0gIFByb2JhQXJyYXkgY29lZmZzX1tOVU1fVFlQRVNdW05VTV9CQU5EU107ICAgICAgLy8gOTI0IGJ5dGVzCi0gIFN0YXRzQXJyYXkgc3RhdHNfW05VTV9UWVBFU11bTlVNX0JBTkRTXTsgICAgICAgLy8gNDIyNCBieXRlcwotICBDb3N0QXJyYXkgbGV2ZWxfY29zdF9bTlVNX1RZUEVTXVtOVU1fQkFORFNdOyAgIC8vIDExLjRrCi0gIGludCBkaXJ0eV87ICAgICAgICAgICAgICAgLy8gaWYgdHJ1ZSwgbmVlZCB0byBjYWxsIFZQOENhbGN1bGF0ZUxldmVsQ29zdHMoKQotICBpbnQgdXNlX3NraXBfcHJvYmFfOyAgICAgIC8vIE5vdGU6IHdlIGFsd2F5cyB1c2Ugc2tpcF9wcm9iYSBmb3Igbm93LgotICBpbnQgbmJfc2tpcF87ICAgICAgICAgICAgIC8vIG51bWJlciBvZiBza2lwcGVkIGJsb2NrcwotfSBWUDhQcm9iYTsKLQotLy8gRmlsdGVyIHBhcmFtZXRlcnMuIE5vdCBhY3R1YWxseSB1c2VkIGluIHRoZSBjb2RlICh3ZSBkb24ndCBwZXJmb3JtCi0vLyB0aGUgaW4tbG9vcCBmaWx0ZXJpbmcpLCBidXQgZmlsbGVkIGZyb20gdXNlcidzIGNvbmZpZwotdHlwZWRlZiBzdHJ1Y3QgewotICBpbnQgc2ltcGxlXzsgICAgICAgICAgICAgLy8gZmlsdGVyaW5nIHR5cGU6IDA9Y29tcGxleCwgMT1zaW1wbGUKLSAgaW50IGxldmVsXzsgICAgICAgICAgICAgIC8vIGJhc2UgZmlsdGVyIGxldmVsIFswLi42M10KLSAgaW50IHNoYXJwbmVzc187ICAgICAgICAgIC8vIFswLi43XQotICBpbnQgaTR4NF9sZl9kZWx0YV87ICAgICAgLy8gZGVsdGEgZmlsdGVyIGxldmVsIGZvciBpNHg0IHJlbGF0aXZlIHRvIGkxNngxNgotfSBWUDhGaWx0ZXJIZWFkZXI7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBJbmZvcm1hdGlvbnMgYWJvdXQgdGhlIG1hY3JvYmxvY2tzLgotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIC8vIGJsb2NrIHR5cGUKLSAgdW5zaWduZWQgaW50IHR5cGVfOjI7ICAgICAvLyAwPWk0eDQsIDE9aTE2eDE2Ci0gIHVuc2lnbmVkIGludCB1dl9tb2RlXzoyOwotICB1bnNpZ25lZCBpbnQgc2tpcF86MTsKLSAgdW5zaWduZWQgaW50IHNlZ21lbnRfOjI7Ci0gIHVpbnQ4X3QgYWxwaGFfOyAgICAgIC8vIHF1YW50aXphdGlvbi1zdXNjZXB0aWJpbGl0eQotfSBWUDhNQkluZm87Ci0KLXR5cGVkZWYgc3RydWN0IFZQOE1hdHJpeCB7Ci0gIHVpbnQxNl90IHFfWzE2XTsgICAgICAgIC8vIHF1YW50aXplciBzdGVwcwotICB1aW50MTZfdCBpcV9bMTZdOyAgICAgICAvLyByZWNpcHJvY2FscywgZml4ZWQgcG9pbnQuCi0gIHVpbnQxNl90IGJpYXNfWzE2XTsgICAgIC8vIHJvdW5kaW5nIGJpYXMKLSAgdWludDE2X3QgenRocmVzaF9bMTZdOyAgLy8gdmFsdWUgdW5kZXIgd2hpY2ggYSBjb2VmZmljaWVudCBpcyB6ZXJvZWQKLSAgdWludDE2X3Qgc2hhcnBlbl9bMTZdOyAgLy8gZnJlcXVlbmN5IGJvb3N0ZXJzIGZvciBzbGlnaHQgc2hhcnBlbmluZwotfSBWUDhNYXRyaXg7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgVlA4TWF0cml4IHkxXywgeTJfLCB1dl87ICAvLyBxdWFudGl6YXRpb24gbWF0cmljZXMKLSAgaW50IGFscGhhXzsgICAgICAvLyBxdWFudC1zdXNjZXB0aWJpbGl0eSwgcmFuZ2UgWy0xMjcsMTI3XS4gWmVybyBpcyBuZXV0cmFsLgotICAgICAgICAgICAgICAgICAgIC8vIExvd2VyIHZhbHVlcyBpbmRpY2F0ZSBhIGxvd2VyIHJpc2sgb2YgYmx1cnJpbmVzcy4KLSAgaW50IGJldGFfOyAgICAgICAvLyBmaWx0ZXItc3VzY2VwdGliaWxpdHksIHJhbmdlIFswLDI1NV0uCi0gIGludCBxdWFudF87ICAgICAgLy8gZmluYWwgc2VnbWVudCBxdWFudGl6ZXIuCi0gIGludCBmc3RyZW5ndGhfOyAgLy8gZmluYWwgaW4tbG9vcCBmaWx0ZXJpbmcgc3RyZW5ndGgKLSAgLy8gcmVhY3Rpdml0aWVzCi0gIGludCBsYW1iZGFfaTE2XywgbGFtYmRhX2k0XywgbGFtYmRhX3V2XzsKLSAgaW50IGxhbWJkYV9tb2RlXywgbGFtYmRhX3RyZWxsaXNfLCB0bGFtYmRhXzsKLSAgaW50IGxhbWJkYV90cmVsbGlzX2kxNl8sIGxhbWJkYV90cmVsbGlzX2k0XywgbGFtYmRhX3RyZWxsaXNfdXZfOwotfSBWUDhTZWdtZW50SW5mbzsKLQotLy8gSGFuZHkgdHJhbnNjaWVudCBzdHJ1Y3QgdG8gYWNjdW11bGF0ZSBzY29yZSBhbmQgaW5mbyBkdXJpbmcgUkQtb3B0aW1pemF0aW9uCi0vLyBhbmQgbW9kZSBldmFsdWF0aW9uLgotdHlwZWRlZiBzdHJ1Y3QgewotICBzY29yZV90IEQsIFNELCBSLCBzY29yZTsgICAgLy8gRGlzdG9ydGlvbiwgc3BlY3RyYWwgZGlzdG9ydGlvbiwgcmF0ZSwgc2NvcmUuCi0gIGludDE2X3QgeV9kY19sZXZlbHNbMTZdOyAgICAvLyBRdWFudGl6ZWQgbGV2ZWxzIGZvciBsdW1hLURDLCBsdW1hLUFDLCBjaHJvbWEuCi0gIGludDE2X3QgeV9hY19sZXZlbHNbMTZdWzE2XTsKLSAgaW50MTZfdCB1dl9sZXZlbHNbNCArIDRdWzE2XTsKLSAgaW50IG1vZGVfaTE2OyAgICAgICAgICAgICAgIC8vIG1vZGUgbnVtYmVyIGZvciBpbnRyYTE2IHByZWRpY3Rpb24KLSAgdWludDhfdCBtb2Rlc19pNFsxNl07ICAgICAgIC8vIG1vZGUgbnVtYmVycyBmb3IgaW50cmE0IHByZWRpY3Rpb25zCi0gIGludCBtb2RlX3V2OyAgICAgICAgICAgICAgICAvLyBtb2RlIG51bWJlciBvZiBjaHJvbWEgcHJlZGljdGlvbgotICB1aW50MzJfdCBuejsgICAgICAgICAgICAgICAgLy8gbm9uLXplcm8gYmxvY2tzCi19IFZQOE1vZGVTY29yZTsKLQotLy8gSXRlcmF0b3Igc3RydWN0dXJlIHRvIGl0ZXJhdGUgdGhyb3VnaCBtYWNyb2Jsb2NrcywgcG9pbnRpbmcgdG8gdGhlCi0vLyByaWdodCBuZWlnaGJvdXJpbmcgZGF0YSAoc2FtcGxlcywgcHJlZGljdGlvbnMsIGNvbnRleHRzLCAuLi4pCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGludCB4XywgeV87ICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgbWFjcm9ibG9jawotICBpbnQgeV9vZmZzZXRfLCB1dl9vZmZzZXRfOyAgICAgICAvLyBvZmZzZXQgdG8gdGhlIGx1bWEgLyBjaHJvbWEgcGxhbmVzCi0gIGludCB5X3N0cmlkZV8sIHV2X3N0cmlkZV87ICAgICAgIC8vIHJlc3BlY3RpdmUgc3RyaWRlcwotICB1aW50OF90KiAgICAgIHl1dl9pbl87ICAgICAgICAgICAvLyBib3Jyb3dlZCBmcm9tIGVuY18gKGZvciBub3cpCi0gIHVpbnQ4X3QqICAgICAgeXV2X291dF87ICAgICAgICAgIC8vICcnCi0gIHVpbnQ4X3QqICAgICAgeXV2X291dDJfOyAgICAgICAgIC8vICcnCi0gIHVpbnQ4X3QqICAgICAgeXV2X3BfOyAgICAgICAgICAgIC8vICcnCi0gIFZQOEVuY29kZXIqICAgZW5jXzsgICAgICAgICAgICAgIC8vIGJhY2stcG9pbnRlcgotICBWUDhNQkluZm8qICAgIG1iXzsgICAgICAgICAgICAgICAvLyBjdXJyZW50IG1hY3JvYmxvY2sKLSAgVlA4Qml0V3JpdGVyKiBid187ICAgICAgICAgICAgICAgLy8gY3VycmVudCBiaXQtd3JpdGVyCi0gIHVpbnQ4X3QqICAgICAgcHJlZHNfOyAgICAgICAgICAgIC8vIGludHJhIG1vZGUgcHJlZGljdG9ycyAoNHg0IGJsb2NrcykKLSAgdWludDMyX3QqICAgICBuel87ICAgICAgICAgICAgICAgLy8gbm9uLXplcm8gcGF0dGVybgotICB1aW50OF90ICAgICAgIGk0X2JvdW5kYXJ5X1szN107ICAvLyAzMis1IGJvdW5kYXJ5IHNhbXBsZXMgbmVlZGVkIGJ5IGludHJhNHg0Ci0gIHVpbnQ4X3QqICAgICAgaTRfdG9wXzsgICAgICAgICAgIC8vIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgdG9wIGJvdW5kYXJ5IHNhbXBsZQotICBpbnQgICAgICAgICAgIGk0XzsgICAgICAgICAgICAgICAvLyBjdXJyZW50IGludHJhNHg0IG1vZGUgYmVpbmcgdGVzdGVkCi0gIGludCAgICAgICAgICAgdG9wX256X1s5XTsgICAgICAgIC8vIHRvcC1ub24temVybyBjb250ZXh0LgotICBpbnQgICAgICAgICAgIGxlZnRfbnpfWzldOyAgICAgICAvLyBsZWZ0LW5vbi16ZXJvLiBsZWZ0X256WzhdIGlzIGluZGVwZW5kZW50LgotICB1aW50NjRfdCAgICAgIGJpdF9jb3VudF9bNF1bM107ICAvLyBiaXQgY291bnRlcnMgZm9yIGNvZGVkIGxldmVscy4KLSAgdWludDY0X3QgICAgICBsdW1hX2JpdHNfOyAgICAgICAgLy8gbWFjcm9ibG9jayBiaXQtY29zdCBmb3IgbHVtYQotICB1aW50NjRfdCAgICAgIHV2X2JpdHNfOyAgICAgICAgICAvLyBtYWNyb2Jsb2NrIGJpdC1jb3N0IGZvciBjaHJvbWEKLSAgTEZTdGF0cyogICAgICBsZl9zdGF0c187ICAgICAgICAgLy8gZmlsdGVyIHN0YXRzIChib3Jyb3dlZCBmcm9tIGVuY18pCi0gIGludCAgICAgICAgICAgZG9fdHJlbGxpc187ICAgICAgIC8vIGlmIHRydWUsIHBlcmZvcm0gZXh0cmEgbGV2ZWwgb3B0aW1pc2F0aW9uCi0gIGludCAgICAgICAgICAgZG9uZV87ICAgICAgICAgICAgIC8vIHRydWUgd2hlbiBzY2FuIGlzIGZpbmlzaGVkCi0gIGludCAgICAgICAgICAgcGVyY2VudDBfOyAgICAgICAgIC8vIHNhdmVkIGluaXRpYWwgcHJvZ3Jlc3MgcGVyY2VudAotfSBWUDhFbmNJdGVyYXRvcjsKLQotICAvLyBpbiBpdGVyYXRvci5jCi0vLyBtdXN0IGJlIGNhbGxlZCBmaXJzdC4KLXZvaWQgVlA4SXRlcmF0b3JJbml0KFZQOEVuY29kZXIqIGNvbnN0IGVuYywgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KTsKLS8vIHJlc3RhcnQgYSBzY2FuLgotdm9pZCBWUDhJdGVyYXRvclJlc2V0KFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCk7Ci0vLyBpbXBvcnQgc2FtcGxlcyBmcm9tIHNvdXJjZQotdm9pZCBWUDhJdGVyYXRvckltcG9ydChjb25zdCBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpOwotLy8gZXhwb3J0IGRlY2ltYXRlZCBzYW1wbGVzCi12b2lkIFZQOEl0ZXJhdG9yRXhwb3J0KGNvbnN0IFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCk7Ci0vLyBnbyB0byBuZXh0IG1hY3JvYmxvY2suIFJldHVybnMgIWRvbmVfLiBJZiAqYmxvY2tfdG9fc2F2ZSBpcyBub24tbnVsbCwgd2lsbAotLy8gc2F2ZSB0aGUgYm91bmRhcnkgdmFsdWVzIHRvIHRvcF8vbGVmdF8gYXJyYXlzLiBibG9ja190b19zYXZlIGNhbiBiZQotLy8gaXQtPnl1dl9vdXRfIG9yIGl0LT55dXZfaW5fLgotaW50IFZQOEl0ZXJhdG9yTmV4dChWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGJsb2NrX3RvX3NhdmUpOwotLy8gUmVwb3J0IHByb2dyZXNzaW9uIGJhc2VkIG9uIG1hY3JvYmxvY2sgcm93cy4gUmV0dXJuIDAgZm9yIHVzZXItYWJvcnQgcmVxdWVzdC4KLWludCBWUDhJdGVyYXRvclByb2dyZXNzKGNvbnN0IFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaW5hbF9kZWx0YV9wZXJjZW50KTsKLS8vIEludHJhNHg0IGl0ZXJhdGlvbnMKLXZvaWQgVlA4SXRlcmF0b3JTdGFydEk0KFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCk7Ci0vLyByZXR1cm5zIHRydWUgaWYgbm90IGRvbmUuCi1pbnQgVlA4SXRlcmF0b3JSb3RhdGVJNChWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCB5dXZfb3V0KTsKLQotLy8gTm9uLXplcm8gY29udGV4dCBzZXR1cC90ZWFyZG93bgotdm9pZCBWUDhJdGVyYXRvck56VG9CeXRlcyhWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpOwotdm9pZCBWUDhJdGVyYXRvckJ5dGVzVG9OeihWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpOwotCi0vLyBIZWxwZXIgZnVuY3Rpb25zIHRvIHNldCBtb2RlIHByb3BlcnRpZXMKLXZvaWQgVlA4U2V0SW50cmExNk1vZGUoY29uc3QgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBpbnQgbW9kZSk7Ci12b2lkIFZQOFNldEludHJhNE1vZGUoY29uc3QgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBjb25zdCB1aW50OF90KiBtb2Rlcyk7Ci12b2lkIFZQOFNldEludHJhVVZNb2RlKGNvbnN0IFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgaW50IG1vZGUpOwotdm9pZCBWUDhTZXRTa2lwKGNvbnN0IFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgaW50IHNraXApOwotdm9pZCBWUDhTZXRTZWdtZW50KGNvbnN0IFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgaW50IHNlZ21lbnQpOwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gUGFnaW5hdGVkIHRva2VuIGJ1ZmZlcgotCi10eXBlZGVmIHN0cnVjdCBWUDhUb2tlbnMgVlA4VG9rZW5zOyAgLy8gc3RydWN0IGRldGFpbHMgaW4gdG9rZW4uYwotCi10eXBlZGVmIHN0cnVjdCB7Ci0jaWYgIWRlZmluZWQoRElTQUJMRV9UT0tFTl9CVUZGRVIpCi0gIFZQOFRva2VucyogcGFnZXNfOyAgICAgICAgLy8gZmlyc3QgcGFnZQotICBWUDhUb2tlbnMqKiBsYXN0X3BhZ2VfOyAgIC8vIGxhc3QgcGFnZQotICB1aW50MTZfdCogdG9rZW5zXzsgICAgICAgIC8vIHNldCB0byAoKmxhc3RfcGFnZV8pLT50b2tlbnNfCi0gIGludCBsZWZ0XzsgICAgICAgICAgLy8gaG93IG1hbnkgZnJlZSB0b2tlbnMgbGVmdCBiZWZvcmUgdGhlIHBhZ2UgaXMgZnVsbC4KLSNlbmRpZgotICBpbnQgZXJyb3JfOyAgICAgICAgIC8vIHRydWUgaW4gY2FzZSBvZiBtYWxsb2MgZXJyb3IKLX0gVlA4VEJ1ZmZlcjsKLQotdm9pZCBWUDhUQnVmZmVySW5pdChWUDhUQnVmZmVyKiBjb25zdCBiKTsgICAgLy8gaW5pdGlhbGl6ZSBhbiBlbXB0eSBidWZmZXIKLXZvaWQgVlA4VEJ1ZmZlckNsZWFyKFZQOFRCdWZmZXIqIGNvbnN0IGIpOyAgIC8vIGRlLWFsbG9jYXRlIHBhZ2VzIG1lbW9yeQotCi0jaWYgIWRlZmluZWQoRElTQUJMRV9UT0tFTl9CVUZGRVIpCi0KLS8vIEZpbmFsaXplcyBiaXRzdHJlYW0gd2hlbiBwcm9iYWJpbGl0aWVzIGFyZSBrbm93bi4KLS8vIERlbGV0ZXMgdGhlIGFsbG9jYXRlZCB0b2tlbiBtZW1vcnkgaWYgZmluYWxfcGFzcyBpcyB0cnVlLgotaW50IFZQOEVtaXRUb2tlbnMoVlA4VEJ1ZmZlciogY29uc3QgYiwgVlA4Qml0V3JpdGVyKiBjb25zdCBidywKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHByb2JhcywgaW50IGZpbmFsX3Bhc3MpOwotCi0vLyByZWNvcmQgdGhlIGNvZGluZyBvZiBjb2VmZmljaWVudHMgd2l0aG91dCBrbm93aW5nIHRoZSBwcm9iYWJpbGl0aWVzIHlldAotaW50IFZQOFJlY29yZENvZWZmVG9rZW5zKGludCBjdHgsIGludCBjb2VmZl90eXBlLCBpbnQgZmlyc3QsIGludCBsYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QqIGNvbnN0IGNvZWZmcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBWUDhUQnVmZmVyKiBjb25zdCB0b2tlbnMpOwotCi0vLyB1bnVzZWQgZm9yIG5vdwotdm9pZCBWUDhUb2tlblRvU3RhdHMoY29uc3QgVlA4VEJ1ZmZlciogY29uc3QgYiwgcHJvYmFfdCogY29uc3Qgc3RhdHMpOwotCi0jZW5kaWYgIC8vICFESVNBQkxFX1RPS0VOX0JVRkZFUgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVlA4RW5jb2RlcgotCi1zdHJ1Y3QgVlA4RW5jb2RlciB7Ci0gIGNvbnN0IFdlYlBDb25maWcqIGNvbmZpZ187ICAgIC8vIHVzZXIgY29uZmlndXJhdGlvbiBhbmQgcGFyYW1ldGVycwotICBXZWJQUGljdHVyZSogcGljXzsgICAgICAgICAgICAvLyBpbnB1dCAvIG91dHB1dCBwaWN0dXJlCi0KLSAgLy8gaGVhZGVycwotICBWUDhGaWx0ZXJIZWFkZXIgICBmaWx0ZXJfaGRyXzsgICAgIC8vIGZpbHRlcmluZyBpbmZvcm1hdGlvbgotICBWUDhTZWdtZW50SGVhZGVyICBzZWdtZW50X2hkcl87ICAgIC8vIHNlZ21lbnQgaW5mb3JtYXRpb24KLQotICBpbnQgcHJvZmlsZV87ICAgICAgICAgICAgICAgICAgICAgIC8vIFZQOCdzIHByb2ZpbGUsIGRlZHVjZWQgZnJvbSBDb25maWcuCi0KLSAgLy8gZGltZW5zaW9uLCBpbiBtYWNyb2Jsb2NrIHVuaXRzLgotICBpbnQgbWJfd18sIG1iX2hfOwotICBpbnQgcHJlZHNfd187ICAgLy8gc3RyaWRlIG9mIHRoZSAqcHJlZHNfIHByZWRpY3Rpb24gcGxhbmUgKD00Km1iX3cgKyAxKQotCi0gIC8vIG51bWJlciBvZiBwYXJ0aXRpb25zICgxLCAyLCA0IG9yIDggPSBNQVhfTlVNX1BBUlRJVElPTlMpCi0gIGludCBudW1fcGFydHNfOwotCi0gIC8vIHBlci1wYXJ0aXRpb24gYm9vbGVhbiBkZWNvZGVycy4KLSAgVlA4Qml0V3JpdGVyIGJ3XzsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFydDAKLSAgVlA4Qml0V3JpdGVyIHBhcnRzX1tNQVhfTlVNX1BBUlRJVElPTlNdOyAgLy8gdG9rZW4gcGFydGl0aW9ucwotICBWUDhUQnVmZmVyIHRva2Vuc187ICAgICAgICAgICAgICAgICAgICAgICAvLyB0b2tlbiBidWZmZXIKLQotICBpbnQgcGVyY2VudF87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgcHJvZ3Jlc3MKLQotICAvLyB0cmFuc3BhcmVuY3kgYmxvYgotICBpbnQgaGFzX2FscGhhXzsKLSAgdWludDhfdCogYWxwaGFfZGF0YV87ICAgICAgIC8vIG5vbi1OVUxMIGlmIHRyYW5zcGFyZW5jeSBpcyBwcmVzZW50Ci0gIHVpbnQzMl90IGFscGhhX2RhdGFfc2l6ZV87Ci0gIFdlYlBXb3JrZXIgYWxwaGFfd29ya2VyXzsKLQotICAvLyBlbmhhbmNlbWVudCBsYXllcgotICBpbnQgdXNlX2xheWVyXzsKLSAgVlA4Qml0V3JpdGVyIGxheWVyX2J3XzsKLSAgdWludDhfdCogbGF5ZXJfZGF0YV87Ci0gIHNpemVfdCBsYXllcl9kYXRhX3NpemVfOwotCi0gIC8vIHF1YW50aXphdGlvbiBpbmZvIChvbmUgc2V0IG9mIERDL0FDIGRlcXVhbnQgZmFjdG9yIHBlciBzZWdtZW50KQotICBWUDhTZWdtZW50SW5mbyBkcW1fW05VTV9NQl9TRUdNRU5UU107Ci0gIGludCBiYXNlX3F1YW50XzsgICAgICAgICAgICAgICAgIC8vIG5vbWluYWwgcXVhbnRpemVyIHZhbHVlLiBPbmx5IHVzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHJlbGF0aXZlIGNvZGluZyBvZiBzZWdtZW50cycgcXVhbnQuCi0gIGludCBhbHBoYV87ICAgICAgICAgICAgICAgICAgICAgIC8vIGdsb2JhbCBzdXNjZXB0aWJpbGl0eSAoPD0+IGNvbXBsZXhpdHkpCi0gIGludCB1dl9hbHBoYV87ICAgICAgICAgICAgICAgICAgIC8vIFUvViBxdWFudGl6YXRpb24gc3VzY2VwdGliaWxpdHkKLSAgLy8gZ2xvYmFsIG9mZnNldCBvZiBxdWFudGl6ZXJzLCBzaGFyZWQgYnkgYWxsIHNlZ21lbnRzCi0gIGludCBkcV95MV9kY187Ci0gIGludCBkcV95Ml9kY18sIGRxX3kyX2FjXzsKLSAgaW50IGRxX3V2X2RjXywgZHFfdXZfYWNfOwotCi0gIC8vIHByb2JhYmlsaXRpZXMgYW5kIHN0YXRpc3RpY3MKLSAgVlA4UHJvYmEgcHJvYmFfOwotICB1aW50NjRfdCBzc2VfWzRdOyAgICAgICAgLy8gc3VtIG9mIFkvVS9WL0Egc3F1YXJlZCBlcnJvcnMgZm9yIGFsbCBtYWNyb2Jsb2NrcwotICB1aW50NjRfdCBzc2VfY291bnRfOyAgICAgLy8gcGl4ZWwgY291bnQgZm9yIHRoZSBzc2VfW10gc3RhdHMKLSAgaW50ICAgICAgY29kZWRfc2l6ZV87Ci0gIGludCAgICAgIHJlc2lkdWFsX2J5dGVzX1szXVs0XTsKLSAgaW50ICAgICAgYmxvY2tfY291bnRfWzNdOwotCi0gIC8vIHF1YWxpdHkvc3BlZWQgc2V0dGluZ3MKLSAgaW50IG1ldGhvZF87ICAgICAgICAgICAgICAgLy8gMD1mYXN0ZXN0LCA2PWJlc3Qvc2xvd2VzdC4KLSAgVlA4UkRMZXZlbCByZF9vcHRfbGV2ZWxfOyAgLy8gRGVkdWNlZCBmcm9tIG1ldGhvZF8uCi0gIGludCBtYXhfaTRfaGVhZGVyX2JpdHNfOyAgIC8vIHBhcnRpdGlvbiAjMCBzYWZlbmVzcyBmYWN0b3IKLSAgaW50IHRocmVhZF9sZXZlbF87ICAgICAgICAgLy8gZGVyaXZlZCBmcm9tIGNvbmZpZy0+dGhyZWFkX2xldmVsCi0gIGludCBkb19zZWFyY2hfOyAgICAgICAgICAgIC8vIGRlcml2ZWQgZnJvbSBjb25maWctPnRhcmdldF9YWFgKLSAgaW50IHVzZV90b2tlbnNfOyAgICAgICAgICAgLy8gaWYgdHJ1ZSwgdXNlIHRva2VuIGJ1ZmZlcgotCi0gIC8vIE1lbW9yeQotICBWUDhNQkluZm8qIG1iX2luZm9fOyAgIC8vIGNvbnRleHR1YWwgbWFjcm9ibG9jayBpbmZvcyAobWJfd18gKyAxKQotICB1aW50OF90KiAgIHByZWRzXzsgICAgIC8vIHByZWRpY3Rpb25zIG1vZGVzOiAoNCptYl93KzEpICogKDQqbWJfaCsxKQotICB1aW50MzJfdCogIG56XzsgICAgICAgIC8vIG5vbi16ZXJvIGJpdCBjb250ZXh0OiBtYl93KzEKLSAgdWludDhfdCogICB5dXZfaW5fOyAgICAvLyBpbnB1dCBzYW1wbGVzCi0gIHVpbnQ4X3QqICAgeXV2X291dF87ICAgLy8gb3V0cHV0IHNhbXBsZXMKLSAgdWludDhfdCogICB5dXZfb3V0Ml87ICAvLyBzZWNvbmRhcnkgc2NyYXRjaCBvdXQtYnVmZmVyLiBzd2FwcGVkIHdpdGggeXV2X291dF8uCi0gIHVpbnQ4X3QqICAgeXV2X3BfOyAgICAgLy8gc2NyYXRjaCBidWZmZXIgZm9yIHByZWRpY3Rpb24KLSAgdWludDhfdCAgICp5X3RvcF87ICAgICAvLyB0b3AgbHVtYSBzYW1wbGVzLgotICB1aW50OF90ICAgKnV2X3RvcF87ICAgIC8vIHRvcCB1L3Ygc2FtcGxlcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVIGFuZCBWIGFyZSBwYWNrZWQgaW50byAxNiBwaXhlbHMgKDggVSArIDggVikKLSAgdWludDhfdCAgICp5X2xlZnRfOyAgICAvLyBsZWZ0IGx1bWEgc2FtcGxlcyAoYWRyZXNzYWJsZSBmcm9tIGluZGV4IC0xIHRvIDE1KS4KLSAgdWludDhfdCAgICp1X2xlZnRfOyAgICAvLyBsZWZ0IHUgc2FtcGxlcyAoYWRyZXNzYWJsZSBmcm9tIGluZGV4IC0xIHRvIDcpCi0gIHVpbnQ4X3QgICAqdl9sZWZ0XzsgICAgLy8gbGVmdCB2IHNhbXBsZXMgKGFkcmVzc2FibGUgZnJvbSBpbmRleCAtMSB0byA3KQotCi0gIExGU3RhdHMgICAqbGZfc3RhdHNfOyAgLy8gYXV0b2ZpbHRlciBzdGF0cyAoaWYgTlVMTCwgYXV0b2ZpbHRlciBpcyBvZmYpCi19OwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gaW50ZXJuYWwgZnVuY3Rpb25zLiBOb3QgcHVibGljLgotCi0gIC8vIGluIHRyZWUuYwotZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgVlA4Q29lZmZzUHJvYmEwW05VTV9UWVBFU11bTlVNX0JBTkRTXVtOVU1fQ1RYXVtOVU1fUFJPQkFTXTsKLWV4dGVybiBjb25zdCB1aW50OF90Ci0gICAgVlA4Q29lZmZzVXBkYXRlUHJvYmFbTlVNX1RZUEVTXVtOVU1fQkFORFNdW05VTV9DVFhdW05VTV9QUk9CQVNdOwotLy8gUmVzZXQgdGhlIHRva2VuIHByb2JhYmlsaXRpZXMgdG8gdGhlaXIgaW5pdGlhbCAoZGVmYXVsdCkgdmFsdWVzCi12b2lkIFZQOERlZmF1bHRQcm9iYXMoVlA4RW5jb2RlciogY29uc3QgZW5jKTsKLS8vIFdyaXRlIHRoZSB0b2tlbiBwcm9iYWJpbGl0aWVzCi12b2lkIFZQOFdyaXRlUHJvYmFzKFZQOEJpdFdyaXRlciogY29uc3QgYncsIGNvbnN0IFZQOFByb2JhKiBjb25zdCBwcm9iYXMpOwotLy8gV3JpdGVzIHRoZSBwYXJ0aXRpb24gIzAgbW9kZXMgKHRoYXQgaXM6IGFsbCBpbnRyYSBtb2RlcykKLXZvaWQgVlA4Q29kZUludHJhTW9kZXMoVlA4RW5jb2RlciogY29uc3QgZW5jKTsKLQotICAvLyBpbiBzeW50YXguYwotLy8gR2VuZXJhdGVzIHRoZSBmaW5hbCBiaXRzdHJlYW0gYnkgY29kaW5nIHRoZSBwYXJ0aXRpb24wIGFuZCBoZWFkZXJzLAotLy8gYW5kIGFwcGVuZGluZyBhbiBhc3NlbWJseSBvZiBhbGwgdGhlIHByZS1jb2RlZCB0b2tlbiBwYXJ0aXRpb25zLgotLy8gUmV0dXJuIHRydWUgaWYgZXZlcnl0aGluZyBpcyBvay4KLWludCBWUDhFbmNXcml0ZShWUDhFbmNvZGVyKiBjb25zdCBlbmMpOwotLy8gUmVsZWFzZSBtZW1vcnkgYWxsb2NhdGVkIGZvciBiaXQtd3JpdGluZyBpbiBWUDhFbmNMb29wICYgc2VxLgotdm9pZCBWUDhFbmNGcmVlQml0V3JpdGVycyhWUDhFbmNvZGVyKiBjb25zdCBlbmMpOwotCi0gIC8vIGluIGZyYW1lLmMKLWV4dGVybiBjb25zdCB1aW50OF90IFZQOEVuY0JhbmRzWzE2ICsgMV07Ci1leHRlcm4gY29uc3QgdWludDhfdCBWUDhDYXQzW107Ci1leHRlcm4gY29uc3QgdWludDhfdCBWUDhDYXQ0W107Ci1leHRlcm4gY29uc3QgdWludDhfdCBWUDhDYXQ1W107Ci1leHRlcm4gY29uc3QgdWludDhfdCBWUDhDYXQ2W107Ci0KLS8vIEZvcm0gYWxsIHRoZSBmb3VyIEludHJhMTZ4MTYgcHJlZGljdGlvbnMgaW4gdGhlIHl1dl9wXyBjYWNoZQotdm9pZCBWUDhNYWtlTHVtYTE2UHJlZHMoY29uc3QgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KTsKLS8vIEZvcm0gYWxsIHRoZSBmb3VyIENocm9tYTh4OCBwcmVkaWN0aW9ucyBpbiB0aGUgeXV2X3BfIGNhY2hlCi12b2lkIFZQOE1ha2VDaHJvbWE4UHJlZHMoY29uc3QgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KTsKLS8vIEZvcm0gYWxsIHRoZSB0ZW4gSW50cmE0eDQgcHJlZGljdGlvbnMgaW4gdGhlIHl1dl9wXyBjYWNoZQotLy8gZm9yIHRoZSA0eDQgYmxvY2sgaXQtPmk0Xwotdm9pZCBWUDhNYWtlSW50cmE0UHJlZHMoY29uc3QgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KTsKLS8vIFJhdGUgY2FsY3VsYXRpb24KLWludCBWUDhHZXRDb3N0THVtYTE2KFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgY29uc3QgVlA4TW9kZVNjb3JlKiBjb25zdCByZCk7Ci1pbnQgVlA4R2V0Q29zdEx1bWE0KFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgY29uc3QgaW50MTZfdCBsZXZlbHNbMTZdKTsKLWludCBWUDhHZXRDb3N0VVYoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBjb25zdCBWUDhNb2RlU2NvcmUqIGNvbnN0IHJkKTsKLS8vIE1haW4gY29kaW5nIGNhbGxzCi1pbnQgVlA4RW5jTG9vcChWUDhFbmNvZGVyKiBjb25zdCBlbmMpOwotaW50IFZQOEVuY1Rva2VuTG9vcChWUDhFbmNvZGVyKiBjb25zdCBlbmMpOwotCi0gIC8vIGluIHdlYnBlbmMuYwotLy8gQXNzaWduIGFuIGVycm9yIGNvZGUgdG8gYSBwaWN0dXJlLiBSZXR1cm4gZmFsc2UgZm9yIGNvbnZlbmllbmNlLgotaW50IFdlYlBFbmNvZGluZ1NldEVycm9yKGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsIFdlYlBFbmNvZGluZ0Vycm9yIGVycm9yKTsKLWludCBXZWJQUmVwb3J0UHJvZ3Jlc3MoY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IHBlcmNlbnQsIGludCogY29uc3QgcGVyY2VudF9zdG9yZSk7Ci0KLSAgLy8gaW4gYW5hbHlzaXMuYwotLy8gTWFpbiBhbmFseXNpcyBsb29wLiBEZWNpZGVzIHRoZSBzZWdtZW50YXRpb25zIGFuZCBjb21wbGV4aXR5LgotLy8gQXNzaWducyBhIGZpcnN0IGd1ZXNzIGZvciBJbnRyYTE2IGFuZCB1dm1vZGVfIHByZWRpY3Rpb24gbW9kZXMuCi1pbnQgVlA4RW5jQW5hbHl6ZShWUDhFbmNvZGVyKiBjb25zdCBlbmMpOwotCi0gIC8vIGluIHF1YW50LmMKLS8vIFNldHMgdXAgc2VnbWVudCdzIHF1YW50aXphdGlvbiB2YWx1ZXMsIGJhc2VfcXVhbnRfIGFuZCBmaWx0ZXIgc3RyZW5ndGhzLgotdm9pZCBWUDhTZXRTZWdtZW50UGFyYW1zKFZQOEVuY29kZXIqIGNvbnN0IGVuYywgZmxvYXQgcXVhbGl0eSk7Ci0vLyBQaWNrIGJlc3QgbW9kZXMgYW5kIGZpbGxzIHRoZSBsZXZlbHMuIFJldHVybnMgdHJ1ZSBpZiBza2lwcGVkLgotaW50IFZQOERlY2ltYXRlKFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgVlA4TW9kZVNjb3JlKiBjb25zdCByZCwKLSAgICAgICAgICAgICAgICBWUDhSRExldmVsIHJkX29wdCk7Ci0KLSAgLy8gaW4gYWxwaGEuYwotdm9pZCBWUDhFbmNJbml0QWxwaGEoVlA4RW5jb2RlciogY29uc3QgZW5jKTsgICAgLy8gaW5pdGlhbGl6ZSBhbHBoYSBjb21wcmVzc2lvbgotaW50IFZQOEVuY1N0YXJ0QWxwaGEoVlA4RW5jb2RlciogY29uc3QgZW5jKTsgICAgLy8gc3RhcnQgYWxwaGEgY29kaW5nIHByb2Nlc3MKLWludCBWUDhFbmNGaW5pc2hBbHBoYShWUDhFbmNvZGVyKiBjb25zdCBlbmMpOyAgIC8vIGZpbmFsaXplIGNvbXByZXNzZWQgZGF0YQotaW50IFZQOEVuY0RlbGV0ZUFscGhhKFZQOEVuY29kZXIqIGNvbnN0IGVuYyk7ICAgLy8gZGVsZXRlIGNvbXByZXNzZWQgZGF0YQotCi0gIC8vIGluIGxheWVyLmMKLXZvaWQgVlA4RW5jSW5pdExheWVyKFZQOEVuY29kZXIqIGNvbnN0IGVuYyk7ICAgICAvLyBpbml0IGV2ZXJ5dGhpbmcKLXZvaWQgVlA4RW5jQ29kZUxheWVyQmxvY2soVlA4RW5jSXRlcmF0b3IqIGl0KTsgICAvLyBjb2RlIG9uZSBtb3JlIG1hY3JvYmxvY2sKLWludCBWUDhFbmNGaW5pc2hMYXllcihWUDhFbmNvZGVyKiBjb25zdCBlbmMpOyAgICAvLyBmaW5hbGl6ZSBjb2RpbmcKLXZvaWQgVlA4RW5jRGVsZXRlTGF5ZXIoVlA4RW5jb2RlciogZW5jKTsgICAgICAgICAvLyByZWNsYWltIG1lbW9yeQotCi0gIC8vIGluIGZpbHRlci5jCi0KLS8vIFNTSU0gdXRpbHMKLXR5cGVkZWYgc3RydWN0IHsKLSAgZG91YmxlIHcsIHhtLCB5bSwgeHhtLCB4eW0sIHl5bTsKLX0gRGlzdG9TdGF0czsKLXZvaWQgVlA4U1NJTUFkZFN0YXRzKGNvbnN0IERpc3RvU3RhdHMqIGNvbnN0IHNyYywgRGlzdG9TdGF0cyogY29uc3QgZHN0KTsKLXZvaWQgVlA4U1NJTUFjY3VtdWxhdGVQbGFuZShjb25zdCB1aW50OF90KiBzcmMxLCBpbnQgc3RyaWRlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmMyLCBpbnQgc3RyaWRlMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgVywgaW50IEgsIERpc3RvU3RhdHMqIGNvbnN0IHN0YXRzKTsKLWRvdWJsZSBWUDhTU0lNR2V0KGNvbnN0IERpc3RvU3RhdHMqIGNvbnN0IHN0YXRzKTsKLWRvdWJsZSBWUDhTU0lNR2V0U3F1YXJlZEVycm9yKGNvbnN0IERpc3RvU3RhdHMqIGNvbnN0IHN0YXRzKTsKLQotLy8gYXV0b2ZpbHRlcgotdm9pZCBWUDhJbml0RmlsdGVyKFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCk7Ci12b2lkIFZQOFN0b3JlRmlsdGVyU3RhdHMoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KTsKLXZvaWQgVlA4QWRqdXN0RmlsdGVyU3RyZW5ndGgoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KTsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCi0KLSNlbmRpZiAgLyogV0VCUF9FTkNfVlA4RU5DSV9IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL3ZwOGwuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy92cDhsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MDcwYjMuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL3ZwOGwuYworKysgL2Rldi9udWxsCkBAIC0xLDExODAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIG1haW4gZW50cnkgZm9yIHRoZSBsb3NzbGVzcyBlbmNvZGVyLgotLy8KLS8vIEF1dGhvcjogVmlrYXMgQXJvcmEgKHZpa2Fhcy5hcm9yYUBnbWFpbC5jb20pCi0vLwotCi0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNlbHNlCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiLi9iYWNrd2FyZF9yZWZlcmVuY2VzLmgiCi0jaW5jbHVkZSAiLi92cDhlbmNpLmgiCi0jaW5jbHVkZSAiLi92cDhsaS5oIgotI2luY2x1ZGUgIi4uL2RzcC9sb3NzbGVzcy5oIgotI2luY2x1ZGUgIi4uL3V0aWxzL2JpdF93cml0ZXIuaCIKLSNpbmNsdWRlICIuLi91dGlscy9odWZmbWFuX2VuY29kZS5oIgotI2luY2x1ZGUgIi4uL3V0aWxzL3V0aWxzLmgiCi0jaW5jbHVkZSAiLi4vd2VicC9mb3JtYXRfY29uc3RhbnRzLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jZGVmaW5lIFBBTEVUVEVfS0VZX1JJR0hUX1NISUZUICAgMjIgIC8vIEtleSBmb3IgMUsgYnVmZmVyLgotI2RlZmluZSBNQVhfSFVGRl9JTUFHRV9TSVpFICAgICAgICgxNiAqIDEwMjQgKiAxMDI0KQotI2RlZmluZSBNQVhfQ09MT1JTX0ZPUl9HUkFQSCAgICAgIDY0Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBQYWxldHRlCi0KLXN0YXRpYyBpbnQgQ29tcGFyZUNvbG9ycyhjb25zdCB2b2lkKiBwMSwgY29uc3Qgdm9pZCogcDIpIHsKLSAgY29uc3QgdWludDMyX3QgYSA9ICooY29uc3QgdWludDMyX3QqKXAxOwotICBjb25zdCB1aW50MzJfdCBiID0gKihjb25zdCB1aW50MzJfdCopcDI7Ci0gIFNCX0RDSEVDSyhhICE9IGIpOwotICByZXR1cm4gKGEgPCBiKSA/IC0xIDogMTsKLX0KLQotLy8gSWYgbnVtYmVyIG9mIGNvbG9ycyBpbiB0aGUgaW1hZ2UgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIE1BWF9QQUxFVFRFX1NJWkUsCi0vLyBjcmVhdGVzIGEgcGFsZXR0ZSBhbmQgcmV0dXJucyB0cnVlLCBlbHNlIHJldHVybnMgZmFsc2UuCi1zdGF0aWMgaW50IEFuYWx5emVBbmRDcmVhdGVQYWxldHRlKGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBhbGV0dGVbTUFYX1BBTEVUVEVfU0laRV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgcGFsZXR0ZV9zaXplKSB7Ci0gIGludCBpLCB4LCB5LCBrZXk7Ci0gIGludCBudW1fY29sb3JzID0gMDsKLSAgdWludDhfdCBpbl91c2VbTUFYX1BBTEVUVEVfU0laRSAqIDRdID0geyAwIH07Ci0gIHVpbnQzMl90IGNvbG9yc1tNQVhfUEFMRVRURV9TSVpFICogNF07Ci0gIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrSGFzaE11bCA9IDB4MWUzNWE3YmQ7Ci0gIGNvbnN0IHVpbnQzMl90KiBhcmdiID0gcGljLT5hcmdiOwotICBjb25zdCBpbnQgd2lkdGggPSBwaWMtPndpZHRoOwotICBjb25zdCBpbnQgaGVpZ2h0ID0gcGljLT5oZWlnaHQ7Ci0gIHVpbnQzMl90IGxhc3RfcGl4ID0gfmFyZ2JbMF07ICAgLy8gc28gd2UncmUgc3VyZSB0aGF0IGxhc3RfcGl4ICE9IGFyZ2JbMF0KLQotICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKLSAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7ICsreCkgewotICAgICAgaWYgKGFyZ2JbeF0gPT0gbGFzdF9waXgpIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBsYXN0X3BpeCA9IGFyZ2JbeF07Ci0gICAgICBrZXkgPSAoa0hhc2hNdWwgKiBsYXN0X3BpeCkgPj4gUEFMRVRURV9LRVlfUklHSFRfU0hJRlQ7Ci0gICAgICB3aGlsZSAoMSkgewotICAgICAgICBpZiAoIWluX3VzZVtrZXldKSB7Ci0gICAgICAgICAgY29sb3JzW2tleV0gPSBsYXN0X3BpeDsKLSAgICAgICAgICBpbl91c2Vba2V5XSA9IDE7Ci0gICAgICAgICAgKytudW1fY29sb3JzOwotICAgICAgICAgIGlmIChudW1fY29sb3JzID4gTUFYX1BBTEVUVEVfU0laRSkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9IGVsc2UgaWYgKGNvbG9yc1trZXldID09IGxhc3RfcGl4KSB7Ci0gICAgICAgICAgLy8gVGhlIGNvbG9yIGlzIGFscmVhZHkgdGhlcmUuCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgLy8gU29tZSBvdGhlciBjb2xvciBzaXRzIHRoZXJlLgotICAgICAgICAgIC8vIERvIGxpbmVhciBjb25mbGljdCByZXNvbHV0aW9uLgotICAgICAgICAgICsra2V5OwotICAgICAgICAgIGtleSAmPSAoTUFYX1BBTEVUVEVfU0laRSAqIDQgLSAxKTsgIC8vIGtleSBtYXNrIGZvciAxSyBidWZmZXIuCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgYXJnYiArPSBwaWMtPmFyZ2Jfc3RyaWRlOwotICB9Ci0KLSAgLy8gVE9ETyhza2FsKTogY291bGQgd2UgcmV1c2UgaW5fdXNlW10gdG8gc3BlZWQgdXAgRW5jb2RlUGFsZXR0ZSgpPwotICBudW1fY29sb3JzID0gMDsKLSAgZm9yIChpID0gMDsgaSA8IChpbnQpKHNpemVvZihpbl91c2UpIC8gc2l6ZW9mKGluX3VzZVswXSkpOyArK2kpIHsKLSAgICBpZiAoaW5fdXNlW2ldKSB7Ci0gICAgICBwYWxldHRlW251bV9jb2xvcnNdID0gY29sb3JzW2ldOwotICAgICAgKytudW1fY29sb3JzOwotICAgIH0KLSAgfQotCi0gIFNiU3lzdGVtU29ydChwYWxldHRlLCBudW1fY29sb3JzLCBzaXplb2YoKnBhbGV0dGUpLCBDb21wYXJlQ29sb3JzKTsKLSAgKnBhbGV0dGVfc2l6ZSA9IG51bV9jb2xvcnM7Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IEFuYWx5emVFbnRyb3B5KGNvbnN0IHVpbnQzMl90KiBhcmdiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBhcmdiX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBjb25zdCBub25wcmVkaWN0ZWRfYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBjb25zdCBwcmVkaWN0ZWRfYml0cykgewotICBpbnQgeCwgeTsKLSAgY29uc3QgdWludDMyX3QqIGxhc3RfbGluZSA9IE5VTEw7Ci0gIHVpbnQzMl90IGxhc3RfcGl4ID0gYXJnYlswXTsgICAgLy8gc28gd2UncmUgc3VyZSB0aGF0IHBpeF9kaWZmID09IDAKLQotICBWUDhMSGlzdG9ncmFtKiBub25wcmVkaWN0ZWQgPSBOVUxMOwotICBWUDhMSGlzdG9ncmFtKiBwcmVkaWN0ZWQgPQotICAgICAgKFZQOExIaXN0b2dyYW0qKVNiTWVtb3J5QWxsb2NhdGUoMiAqIHNpemVvZigqcHJlZGljdGVkKSk7Ci0gIGlmIChwcmVkaWN0ZWQgPT0gTlVMTCkgcmV0dXJuIDA7Ci0gIG5vbnByZWRpY3RlZCA9IHByZWRpY3RlZCArIDE7Ci0KLSAgVlA4TEhpc3RvZ3JhbUluaXQocHJlZGljdGVkLCAwKTsKLSAgVlA4TEhpc3RvZ3JhbUluaXQobm9ucHJlZGljdGVkLCAwKTsKLSAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7Ci0gICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKLSAgICAgIGNvbnN0IHVpbnQzMl90IHBpeCA9IGFyZ2JbeF07Ci0gICAgICBjb25zdCB1aW50MzJfdCBwaXhfZGlmZiA9IFZQOExTdWJQaXhlbHMocGl4LCBsYXN0X3BpeCk7Ci0gICAgICBpZiAocGl4X2RpZmYgPT0gMCkgY29udGludWU7Ci0gICAgICBpZiAobGFzdF9saW5lICE9IE5VTEwgJiYgcGl4ID09IGxhc3RfbGluZVt4XSkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGxhc3RfcGl4ID0gcGl4OwotICAgICAgewotICAgICAgICBjb25zdCBQaXhPckNvcHkgcGl4X3Rva2VuID0gUGl4T3JDb3B5Q3JlYXRlTGl0ZXJhbChwaXgpOwotICAgICAgICBjb25zdCBQaXhPckNvcHkgcGl4X2RpZmZfdG9rZW4gPSBQaXhPckNvcHlDcmVhdGVMaXRlcmFsKHBpeF9kaWZmKTsKLSAgICAgICAgVlA4TEhpc3RvZ3JhbUFkZFNpbmdsZVBpeE9yQ29weShub25wcmVkaWN0ZWQsICZwaXhfdG9rZW4pOwotICAgICAgICBWUDhMSGlzdG9ncmFtQWRkU2luZ2xlUGl4T3JDb3B5KHByZWRpY3RlZCwgJnBpeF9kaWZmX3Rva2VuKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgbGFzdF9saW5lID0gYXJnYjsKLSAgICBhcmdiICs9IGFyZ2Jfc3RyaWRlOwotICB9Ci0gICpub25wcmVkaWN0ZWRfYml0cyA9IFZQOExIaXN0b2dyYW1Fc3RpbWF0ZUJpdHNCdWxrKG5vbnByZWRpY3RlZCk7Ci0gICpwcmVkaWN0ZWRfYml0cyA9IFZQOExIaXN0b2dyYW1Fc3RpbWF0ZUJpdHNCdWxrKHByZWRpY3RlZCk7Ci0gIFNiTWVtb3J5RGVhbGxvY2F0ZShwcmVkaWN0ZWQpOwotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBWUDhMRW5jQW5hbHl6ZShWUDhMRW5jb2RlciogY29uc3QgZW5jLCBXZWJQSW1hZ2VIaW50IGltYWdlX2hpbnQpIHsKLSAgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYyA9IGVuYy0+cGljXzsKLSAgU0JfRENIRUNLKHBpYyAhPSBOVUxMICYmIHBpYy0+YXJnYiAhPSBOVUxMKTsKLQotICBlbmMtPnVzZV9wYWxldHRlXyA9Ci0gICAgICBBbmFseXplQW5kQ3JlYXRlUGFsZXR0ZShwaWMsIGVuYy0+cGFsZXR0ZV8sICZlbmMtPnBhbGV0dGVfc2l6ZV8pOwotCi0gIGlmIChpbWFnZV9oaW50ID09IFdFQlBfSElOVF9HUkFQSCkgewotICAgIGlmIChlbmMtPnVzZV9wYWxldHRlXyAmJiBlbmMtPnBhbGV0dGVfc2l6ZV8gPCBNQVhfQ09MT1JTX0ZPUl9HUkFQSCkgewotICAgICAgZW5jLT51c2VfcGFsZXR0ZV8gPSAwOwotICAgIH0KLSAgfQotCi0gIGlmICghZW5jLT51c2VfcGFsZXR0ZV8pIHsKLSAgICBpZiAoaW1hZ2VfaGludCA9PSBXRUJQX0hJTlRfUEhPVE8pIHsKLSAgICAgIGVuYy0+dXNlX3ByZWRpY3RfID0gMTsKLSAgICAgIGVuYy0+dXNlX2Nyb3NzX2NvbG9yXyA9IDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGRvdWJsZSBub25fcHJlZF9lbnRyb3B5LCBwcmVkX2VudHJvcHk7Ci0gICAgICBpZiAoIUFuYWx5emVFbnRyb3B5KHBpYy0+YXJnYiwgcGljLT53aWR0aCwgcGljLT5oZWlnaHQsIHBpYy0+YXJnYl9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZub25fcHJlZF9lbnRyb3B5LCAmcHJlZF9lbnRyb3B5KSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KLSAgICAgIGlmIChwcmVkX2VudHJvcHkgPCAwLjk1ICogbm9uX3ByZWRfZW50cm9weSkgewotICAgICAgICBlbmMtPnVzZV9wcmVkaWN0XyA9IDE7Ci0gICAgICAgIC8vIFRPRE8odmlrYXNhKTogT2JzZXJ2ZWQgc29tZSBjb3JyZWxhdGlvbiBvZiBjcm9zc19jb2xvciB0cmFuc2Zvcm0gd2l0aAotICAgICAgICAvLyBwcmVkaWN0LiBOZWVkIHRvIGludmVzdGlnYXRlIHRoaXMgZnVydGhlciBhbmQgYWRkIHNlcGFyYXRlIGhldXJpc3RpYwotICAgICAgICAvLyBmb3Igc2V0dGluZyB1c2VfY3Jvc3NfY29sb3IgZmxhZy4KLSAgICAgICAgZW5jLT51c2VfY3Jvc3NfY29sb3JfID0gMTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBHZXRIdWZmQml0TGVuZ3Roc0FuZENvZGVzKAotICAgIGNvbnN0IFZQOExIaXN0b2dyYW1TZXQqIGNvbnN0IGhpc3RvZ3JhbV9pbWFnZSwKLSAgICBIdWZmbWFuVHJlZUNvZGUqIGNvbnN0IGh1ZmZtYW5fY29kZXMpIHsKLSAgaW50IGksIGs7Ci0gIGludCBvayA9IDE7Ci0gIHVpbnQ2NF90IHRvdGFsX2xlbmd0aF9zaXplID0gMDsKLSAgdWludDhfdCogbWVtX2J1ZiA9IE5VTEw7Ci0gIGNvbnN0IGludCBoaXN0b2dyYW1faW1hZ2Vfc2l6ZSA9IGhpc3RvZ3JhbV9pbWFnZS0+c2l6ZTsKLQotICAvLyBJdGVyYXRlIG92ZXIgYWxsIGhpc3RvZ3JhbXMgYW5kIGdldCB0aGUgYWdncmVnYXRlIG51bWJlciBvZiBjb2RlcyB1c2VkLgotICBmb3IgKGkgPSAwOyBpIDwgaGlzdG9ncmFtX2ltYWdlX3NpemU7ICsraSkgewotICAgIGNvbnN0IFZQOExIaXN0b2dyYW0qIGNvbnN0IGhpc3RvID0gaGlzdG9ncmFtX2ltYWdlLT5oaXN0b2dyYW1zW2ldOwotICAgIEh1ZmZtYW5UcmVlQ29kZSogY29uc3QgY29kZXMgPSAmaHVmZm1hbl9jb2Rlc1s1ICogaV07Ci0gICAgZm9yIChrID0gMDsgayA8IDU7ICsraykgewotICAgICAgY29uc3QgaW50IG51bV9zeW1ib2xzID0gKGsgPT0gMCkgPyBWUDhMSGlzdG9ncmFtTnVtQ29kZXMoaGlzdG8pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoayA9PSA0KSA/IE5VTV9ESVNUQU5DRV9DT0RFUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMjU2OwotICAgICAgY29kZXNba10ubnVtX3N5bWJvbHMgPSBudW1fc3ltYm9sczsKLSAgICAgIHRvdGFsX2xlbmd0aF9zaXplICs9IG51bV9zeW1ib2xzOwotICAgIH0KLSAgfQotCi0gIC8vIEFsbG9jYXRlIGFuZCBTZXQgSHVmZm1hbiBjb2Rlcy4KLSAgewotICAgIHVpbnQxNl90KiBjb2RlczsKLSAgICB1aW50OF90KiBsZW5ndGhzOwotICAgIG1lbV9idWYgPSAodWludDhfdCopV2ViUFNhZmVDYWxsb2ModG90YWxfbGVuZ3RoX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKmxlbmd0aHMpICsgc2l6ZW9mKCpjb2RlcykpOwotICAgIGlmIChtZW1fYnVmID09IE5VTEwpIHsKLSAgICAgIG9rID0gMDsKLSAgICAgIGdvdG8gRW5kOwotICAgIH0KLSAgICBjb2RlcyA9ICh1aW50MTZfdCopbWVtX2J1ZjsKLSAgICBsZW5ndGhzID0gKHVpbnQ4X3QqKSZjb2Rlc1t0b3RhbF9sZW5ndGhfc2l6ZV07Ci0gICAgZm9yIChpID0gMDsgaSA8IDUgKiBoaXN0b2dyYW1faW1hZ2Vfc2l6ZTsgKytpKSB7Ci0gICAgICBjb25zdCBpbnQgYml0X2xlbmd0aCA9IGh1ZmZtYW5fY29kZXNbaV0ubnVtX3N5bWJvbHM7Ci0gICAgICBodWZmbWFuX2NvZGVzW2ldLmNvZGVzID0gY29kZXM7Ci0gICAgICBodWZmbWFuX2NvZGVzW2ldLmNvZGVfbGVuZ3RocyA9IGxlbmd0aHM7Ci0gICAgICBjb2RlcyArPSBiaXRfbGVuZ3RoOwotICAgICAgbGVuZ3RocyArPSBiaXRfbGVuZ3RoOwotICAgIH0KLSAgfQotCi0gIC8vIENyZWF0ZSBIdWZmbWFuIHRyZWVzLgotICBmb3IgKGkgPSAwOyBvayAmJiAoaSA8IGhpc3RvZ3JhbV9pbWFnZV9zaXplKTsgKytpKSB7Ci0gICAgSHVmZm1hblRyZWVDb2RlKiBjb25zdCBjb2RlcyA9ICZodWZmbWFuX2NvZGVzWzUgKiBpXTsKLSAgICBWUDhMSGlzdG9ncmFtKiBjb25zdCBoaXN0byA9IGhpc3RvZ3JhbV9pbWFnZS0+aGlzdG9ncmFtc1tpXTsKLSAgICBvayA9IG9rICYmIFZQOExDcmVhdGVIdWZmbWFuVHJlZShoaXN0by0+bGl0ZXJhbF8sIDE1LCBjb2RlcyArIDApOwotICAgIG9rID0gb2sgJiYgVlA4TENyZWF0ZUh1ZmZtYW5UcmVlKGhpc3RvLT5yZWRfLCAxNSwgY29kZXMgKyAxKTsKLSAgICBvayA9IG9rICYmIFZQOExDcmVhdGVIdWZmbWFuVHJlZShoaXN0by0+Ymx1ZV8sIDE1LCBjb2RlcyArIDIpOwotICAgIG9rID0gb2sgJiYgVlA4TENyZWF0ZUh1ZmZtYW5UcmVlKGhpc3RvLT5hbHBoYV8sIDE1LCBjb2RlcyArIDMpOwotICAgIG9rID0gb2sgJiYgVlA4TENyZWF0ZUh1ZmZtYW5UcmVlKGhpc3RvLT5kaXN0YW5jZV8sIDE1LCBjb2RlcyArIDQpOwotICB9Ci0KLSBFbmQ6Ci0gIGlmICghb2spIHsKLSAgICBTYk1lbW9yeURlYWxsb2NhdGUobWVtX2J1Zik7Ci0gICAgLy8gSWYgb25lIFZQOExDcmVhdGVIdWZmbWFuVHJlZSgpIGFib3ZlIGZhaWxzLCB3ZSBuZWVkIHRvIGNsZWFuIHVwIGJlaGluZC4KLSAgICBTYk1lbW9yeVNldChodWZmbWFuX2NvZGVzLCAwLCA1ICogaGlzdG9ncmFtX2ltYWdlX3NpemUgKiBzaXplb2YoKmh1ZmZtYW5fY29kZXMpKTsKLSAgfQotICByZXR1cm4gb2s7Ci19Ci0KLXN0YXRpYyB2b2lkIFN0b3JlSHVmZm1hblRyZWVPZkh1ZmZtYW5UcmVlVG9CaXRNYXNrKAotICAgIFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LCBjb25zdCB1aW50OF90KiBjb2RlX2xlbmd0aF9iaXRkZXB0aCkgewotICAvLyBSRkMgMTk1MSB3aWxsIGNhbG0geW91IGRvd24gaWYgeW91IGFyZSB3b3JyaWVkIGFib3V0IHRoaXMgZnVubnkgc2VxdWVuY2UuCi0gIC8vIFRoaXMgc2VxdWVuY2UgaXMgdHVuZWQgZnJvbSB0aGF0LCBidXQgbW9yZSB3ZWlnaHRlZCBmb3IgbG93ZXIgc3ltYm9sIGNvdW50LAotICAvLyBhbmQgbW9yZSBzcGlraW5nIGhpc3RvZ3JhbXMuCi0gIHN0YXRpYyBjb25zdCB1aW50OF90IGtTdG9yYWdlT3JkZXJbQ09ERV9MRU5HVEhfQ09ERVNdID0gewotICAgIDE3LCAxOCwgMCwgMSwgMiwgMywgNCwgNSwgMTYsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUKLSAgfTsKLSAgaW50IGk7Ci0gIC8vIFRocm93IGF3YXkgdHJhaWxpbmcgemVyb3M6Ci0gIGludCBjb2Rlc190b19zdG9yZSA9IENPREVfTEVOR1RIX0NPREVTOwotICBmb3IgKDsgY29kZXNfdG9fc3RvcmUgPiA0OyAtLWNvZGVzX3RvX3N0b3JlKSB7Ci0gICAgaWYgKGNvZGVfbGVuZ3RoX2JpdGRlcHRoW2tTdG9yYWdlT3JkZXJbY29kZXNfdG9fc3RvcmUgLSAxXV0gIT0gMCkgewotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIFZQOExXcml0ZUJpdHMoYncsIDQsIGNvZGVzX3RvX3N0b3JlIC0gNCk7Ci0gIGZvciAoaSA9IDA7IGkgPCBjb2Rlc190b19zdG9yZTsgKytpKSB7Ci0gICAgVlA4TFdyaXRlQml0cyhidywgMywgY29kZV9sZW5ndGhfYml0ZGVwdGhba1N0b3JhZ2VPcmRlcltpXV0pOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIENsZWFySHVmZm1hblRyZWVJZk9ubHlPbmVTeW1ib2woCi0gICAgSHVmZm1hblRyZWVDb2RlKiBjb25zdCBodWZmbWFuX2NvZGUpIHsKLSAgaW50IGs7Ci0gIGludCBjb3VudCA9IDA7Ci0gIGZvciAoayA9IDA7IGsgPCBodWZmbWFuX2NvZGUtPm51bV9zeW1ib2xzOyArK2spIHsKLSAgICBpZiAoaHVmZm1hbl9jb2RlLT5jb2RlX2xlbmd0aHNba10gIT0gMCkgewotICAgICAgKytjb3VudDsKLSAgICAgIGlmIChjb3VudCA+IDEpIHJldHVybjsKLSAgICB9Ci0gIH0KLSAgZm9yIChrID0gMDsgayA8IGh1ZmZtYW5fY29kZS0+bnVtX3N5bWJvbHM7ICsraykgewotICAgIGh1ZmZtYW5fY29kZS0+Y29kZV9sZW5ndGhzW2tdID0gMDsKLSAgICBodWZmbWFuX2NvZGUtPmNvZGVzW2tdID0gMDsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBTdG9yZUh1ZmZtYW5UcmVlVG9CaXRNYXNrKAotICAgIFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LAotICAgIGNvbnN0IEh1ZmZtYW5UcmVlVG9rZW4qIGNvbnN0IHRva2VucywgY29uc3QgaW50IG51bV90b2tlbnMsCi0gICAgY29uc3QgSHVmZm1hblRyZWVDb2RlKiBjb25zdCBodWZmbWFuX2NvZGUpIHsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBudW1fdG9rZW5zOyArK2kpIHsKLSAgICBjb25zdCBpbnQgaXggPSB0b2tlbnNbaV0uY29kZTsKLSAgICBjb25zdCBpbnQgZXh0cmFfYml0cyA9IHRva2Vuc1tpXS5leHRyYV9iaXRzOwotICAgIFZQOExXcml0ZUJpdHMoYncsIGh1ZmZtYW5fY29kZS0+Y29kZV9sZW5ndGhzW2l4XSwgaHVmZm1hbl9jb2RlLT5jb2Rlc1tpeF0pOwotICAgIHN3aXRjaCAoaXgpIHsKLSAgICAgIGNhc2UgMTY6Ci0gICAgICAgIFZQOExXcml0ZUJpdHMoYncsIDIsIGV4dHJhX2JpdHMpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMTc6Ci0gICAgICAgIFZQOExXcml0ZUJpdHMoYncsIDMsIGV4dHJhX2JpdHMpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMTg6Ci0gICAgICAgIFZQOExXcml0ZUJpdHMoYncsIDcsIGV4dHJhX2JpdHMpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLX0KLQotc3RhdGljIGludCBTdG9yZUZ1bGxIdWZmbWFuQ29kZShWUDhMQml0V3JpdGVyKiBjb25zdCBidywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSHVmZm1hblRyZWVDb2RlKiBjb25zdCB0cmVlKSB7Ci0gIGludCBvayA9IDA7Ci0gIHVpbnQ4X3QgY29kZV9sZW5ndGhfYml0ZGVwdGhbQ09ERV9MRU5HVEhfQ09ERVNdID0geyAwIH07Ci0gIHVpbnQxNl90IGNvZGVfbGVuZ3RoX2JpdGRlcHRoX3N5bWJvbHNbQ09ERV9MRU5HVEhfQ09ERVNdID0geyAwIH07Ci0gIGNvbnN0IGludCBtYXhfdG9rZW5zID0gdHJlZS0+bnVtX3N5bWJvbHM7Ci0gIGludCBudW1fdG9rZW5zOwotICBIdWZmbWFuVHJlZUNvZGUgaHVmZm1hbl9jb2RlOwotICBIdWZmbWFuVHJlZVRva2VuKiBjb25zdCB0b2tlbnMgPQotICAgICAgKEh1ZmZtYW5UcmVlVG9rZW4qKVdlYlBTYWZlTWFsbG9jKCh1aW50NjRfdCltYXhfdG9rZW5zLCBzaXplb2YoKnRva2VucykpOwotICBpZiAodG9rZW5zID09IE5VTEwpIHJldHVybiAwOwotCi0gIGh1ZmZtYW5fY29kZS5udW1fc3ltYm9scyA9IENPREVfTEVOR1RIX0NPREVTOwotICBodWZmbWFuX2NvZGUuY29kZV9sZW5ndGhzID0gY29kZV9sZW5ndGhfYml0ZGVwdGg7Ci0gIGh1ZmZtYW5fY29kZS5jb2RlcyA9IGNvZGVfbGVuZ3RoX2JpdGRlcHRoX3N5bWJvbHM7Ci0KLSAgVlA4TFdyaXRlQml0cyhidywgMSwgMCk7Ci0gIG51bV90b2tlbnMgPSBWUDhMQ3JlYXRlQ29tcHJlc3NlZEh1ZmZtYW5UcmVlKHRyZWUsIHRva2VucywgbWF4X3Rva2Vucyk7Ci0gIHsKLSAgICBpbnQgaGlzdG9ncmFtW0NPREVfTEVOR1RIX0NPREVTXSA9IHsgMCB9OwotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBudW1fdG9rZW5zOyArK2kpIHsKLSAgICAgICsraGlzdG9ncmFtW3Rva2Vuc1tpXS5jb2RlXTsKLSAgICB9Ci0KLSAgICBpZiAoIVZQOExDcmVhdGVIdWZmbWFuVHJlZShoaXN0b2dyYW0sIDcsICZodWZmbWFuX2NvZGUpKSB7Ci0gICAgICBnb3RvIEVuZDsKLSAgICB9Ci0gIH0KLQotICBTdG9yZUh1ZmZtYW5UcmVlT2ZIdWZmbWFuVHJlZVRvQml0TWFzayhidywgY29kZV9sZW5ndGhfYml0ZGVwdGgpOwotICBDbGVhckh1ZmZtYW5UcmVlSWZPbmx5T25lU3ltYm9sKCZodWZmbWFuX2NvZGUpOwotICB7Ci0gICAgaW50IHRyYWlsaW5nX3plcm9fYml0cyA9IDA7Ci0gICAgaW50IHRyaW1tZWRfbGVuZ3RoID0gbnVtX3Rva2VuczsKLSAgICBpbnQgd3JpdGVfdHJpbW1lZF9sZW5ndGg7Ci0gICAgaW50IGxlbmd0aDsKLSAgICBpbnQgaSA9IG51bV90b2tlbnM7Ci0gICAgd2hpbGUgKGktLSA+IDApIHsKLSAgICAgIGNvbnN0IGludCBpeCA9IHRva2Vuc1tpXS5jb2RlOwotICAgICAgaWYgKGl4ID09IDAgfHwgaXggPT0gMTcgfHwgaXggPT0gMTgpIHsKLSAgICAgICAgLS10cmltbWVkX2xlbmd0aDsgICAvLyBkaXNjb3VudCB0cmFpbGluZyB6ZXJvcwotICAgICAgICB0cmFpbGluZ196ZXJvX2JpdHMgKz0gY29kZV9sZW5ndGhfYml0ZGVwdGhbaXhdOwotICAgICAgICBpZiAoaXggPT0gMTcpIHsKLSAgICAgICAgICB0cmFpbGluZ196ZXJvX2JpdHMgKz0gMzsKLSAgICAgICAgfSBlbHNlIGlmIChpeCA9PSAxOCkgewotICAgICAgICAgIHRyYWlsaW5nX3plcm9fYml0cyArPSA3OwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgd3JpdGVfdHJpbW1lZF9sZW5ndGggPSAodHJpbW1lZF9sZW5ndGggPiAxICYmIHRyYWlsaW5nX3plcm9fYml0cyA+IDEyKTsKLSAgICBsZW5ndGggPSB3cml0ZV90cmltbWVkX2xlbmd0aCA/IHRyaW1tZWRfbGVuZ3RoIDogbnVtX3Rva2VuczsKLSAgICBWUDhMV3JpdGVCaXRzKGJ3LCAxLCB3cml0ZV90cmltbWVkX2xlbmd0aCk7Ci0gICAgaWYgKHdyaXRlX3RyaW1tZWRfbGVuZ3RoKSB7Ci0gICAgICBjb25zdCBpbnQgbmJpdHMgPSBWUDhMQml0c0xvZzJDZWlsaW5nKHRyaW1tZWRfbGVuZ3RoIC0gMSk7Ci0gICAgICBjb25zdCBpbnQgbmJpdHBhaXJzID0gKG5iaXRzID09IDApID8gMSA6IChuYml0cyArIDEpIC8gMjsKLSAgICAgIFZQOExXcml0ZUJpdHMoYncsIDMsIG5iaXRwYWlycyAtIDEpOwotICAgICAgU0JfRENIRUNLKHRyaW1tZWRfbGVuZ3RoID49IDIpOwotICAgICAgVlA4TFdyaXRlQml0cyhidywgbmJpdHBhaXJzICogMiwgdHJpbW1lZF9sZW5ndGggLSAyKTsKLSAgICB9Ci0gICAgU3RvcmVIdWZmbWFuVHJlZVRvQml0TWFzayhidywgdG9rZW5zLCBsZW5ndGgsICZodWZmbWFuX2NvZGUpOwotICB9Ci0gIG9rID0gMTsKLSBFbmQ6Ci0gIFNiTWVtb3J5RGVhbGxvY2F0ZSh0b2tlbnMpOwotICByZXR1cm4gb2s7Ci19Ci0KLXN0YXRpYyBpbnQgU3RvcmVIdWZmbWFuQ29kZShWUDhMQml0V3JpdGVyKiBjb25zdCBidywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBIdWZmbWFuVHJlZUNvZGUqIGNvbnN0IGh1ZmZtYW5fY29kZSkgewotICBpbnQgaTsKLSAgaW50IGNvdW50ID0gMDsKLSAgaW50IHN5bWJvbHNbMl0gPSB7IDAsIDAgfTsKLSAgY29uc3QgaW50IGtNYXhCaXRzID0gODsKLSAgY29uc3QgaW50IGtNYXhTeW1ib2wgPSAxIDw8IGtNYXhCaXRzOwotCi0gIC8vIENoZWNrIHdoZXRoZXIgaXQncyBhIHNtYWxsIHRyZWUuCi0gIGZvciAoaSA9IDA7IGkgPCBodWZmbWFuX2NvZGUtPm51bV9zeW1ib2xzICYmIGNvdW50IDwgMzsgKytpKSB7Ci0gICAgaWYgKGh1ZmZtYW5fY29kZS0+Y29kZV9sZW5ndGhzW2ldICE9IDApIHsKLSAgICAgIGlmIChjb3VudCA8IDIpIHN5bWJvbHNbY291bnRdID0gaTsKLSAgICAgICsrY291bnQ7Ci0gICAgfQotICB9Ci0KLSAgaWYgKGNvdW50ID09IDApIHsgICAvLyBlbWl0IG1pbmltYWwgdHJlZSBmb3IgZW1wdHkgY2FzZXMKLSAgICAvLyBiaXRzOiBzbWFsbCB0cmVlIG1hcmtlcjogMSwgY291bnQtMTogMCwgbGFyZ2UgOC1iaXQgY29kZTogMCwgY29kZTogMAotICAgIFZQOExXcml0ZUJpdHMoYncsIDQsIDB4MDEpOwotICAgIHJldHVybiAxOwotICB9IGVsc2UgaWYgKGNvdW50IDw9IDIgJiYgc3ltYm9sc1swXSA8IGtNYXhTeW1ib2wgJiYgc3ltYm9sc1sxXSA8IGtNYXhTeW1ib2wpIHsKLSAgICBWUDhMV3JpdGVCaXRzKGJ3LCAxLCAxKTsgIC8vIFNtYWxsIHRyZWUgbWFya2VyIHRvIGVuY29kZSAxIG9yIDIgc3ltYm9scy4KLSAgICBWUDhMV3JpdGVCaXRzKGJ3LCAxLCBjb3VudCAtIDEpOwotICAgIGlmIChzeW1ib2xzWzBdIDw9IDEpIHsKLSAgICAgIFZQOExXcml0ZUJpdHMoYncsIDEsIDApOyAgLy8gQ29kZSBiaXQgZm9yIHNtYWxsICgxIGJpdCkgc3ltYm9sIHZhbHVlLgotICAgICAgVlA4TFdyaXRlQml0cyhidywgMSwgc3ltYm9sc1swXSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIFZQOExXcml0ZUJpdHMoYncsIDEsIDEpOwotICAgICAgVlA4TFdyaXRlQml0cyhidywgOCwgc3ltYm9sc1swXSk7Ci0gICAgfQotICAgIGlmIChjb3VudCA9PSAyKSB7Ci0gICAgICBWUDhMV3JpdGVCaXRzKGJ3LCA4LCBzeW1ib2xzWzFdKTsKLSAgICB9Ci0gICAgcmV0dXJuIDE7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIFN0b3JlRnVsbEh1ZmZtYW5Db2RlKGJ3LCBodWZmbWFuX2NvZGUpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIFdyaXRlSHVmZm1hbkNvZGUoVlA4TEJpdFdyaXRlciogY29uc3QgYncsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEh1ZmZtYW5UcmVlQ29kZSogY29uc3QgY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvZGVfaW5kZXgpIHsKLSAgY29uc3QgaW50IGRlcHRoID0gY29kZS0+Y29kZV9sZW5ndGhzW2NvZGVfaW5kZXhdOwotICBjb25zdCBpbnQgc3ltYm9sID0gY29kZS0+Y29kZXNbY29kZV9pbmRleF07Ci0gIFZQOExXcml0ZUJpdHMoYncsIGRlcHRoLCBzeW1ib2wpOwotfQotCi1zdGF0aWMgdm9pZCBTdG9yZUltYWdlVG9CaXRNYXNrKAotICAgIFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LCBpbnQgd2lkdGgsIGludCBoaXN0b19iaXRzLAotICAgIGNvbnN0IFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMsCi0gICAgY29uc3QgdWludDE2X3QqIGhpc3RvZ3JhbV9zeW1ib2xzLAotICAgIGNvbnN0IEh1ZmZtYW5UcmVlQ29kZSogY29uc3QgaHVmZm1hbl9jb2RlcykgewotICAvLyB4IGFuZCB5IHRyYWNlIHRoZSBwb3NpdGlvbiBpbiB0aGUgaW1hZ2UuCi0gIGludCB4ID0gMDsKLSAgaW50IHkgPSAwOwotICBjb25zdCBpbnQgaGlzdG9feHNpemUgPSBoaXN0b19iaXRzID8gVlA4TFN1YlNhbXBsZVNpemUod2lkdGgsIGhpc3RvX2JpdHMpIDogMTsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCByZWZzLT5zaXplOyArK2kpIHsKLSAgICBjb25zdCBQaXhPckNvcHkqIGNvbnN0IHYgPSAmcmVmcy0+cmVmc1tpXTsKLSAgICBjb25zdCBpbnQgaGlzdG9ncmFtX2l4ID0gaGlzdG9ncmFtX3N5bWJvbHNbaGlzdG9fYml0cyA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh5ID4+IGhpc3RvX2JpdHMpICogaGlzdG9feHNpemUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeCA+PiBoaXN0b19iaXRzKSA6IDBdOwotICAgIGNvbnN0IEh1ZmZtYW5UcmVlQ29kZSogY29uc3QgY29kZXMgPSBodWZmbWFuX2NvZGVzICsgNSAqIGhpc3RvZ3JhbV9peDsKLSAgICBpZiAoUGl4T3JDb3B5SXNDYWNoZUlkeCh2KSkgewotICAgICAgY29uc3QgaW50IGNvZGUgPSBQaXhPckNvcHlDYWNoZUlkeCh2KTsKLSAgICAgIGNvbnN0IGludCBsaXRlcmFsX2l4ID0gMjU2ICsgTlVNX0xFTkdUSF9DT0RFUyArIGNvZGU7Ci0gICAgICBXcml0ZUh1ZmZtYW5Db2RlKGJ3LCBjb2RlcywgbGl0ZXJhbF9peCk7Ci0gICAgfSBlbHNlIGlmIChQaXhPckNvcHlJc0xpdGVyYWwodikpIHsKLSAgICAgIHN0YXRpYyBjb25zdCBpbnQgb3JkZXJbXSA9IHsgMSwgMiwgMCwgMyB9OwotICAgICAgaW50IGs7Ci0gICAgICBmb3IgKGsgPSAwOyBrIDwgNDsgKytrKSB7Ci0gICAgICAgIGNvbnN0IGludCBjb2RlID0gUGl4T3JDb3B5TGl0ZXJhbCh2LCBvcmRlcltrXSk7Ci0gICAgICAgIFdyaXRlSHVmZm1hbkNvZGUoYncsIGNvZGVzICsgaywgY29kZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGludCBiaXRzLCBuX2JpdHM7Ci0gICAgICBpbnQgY29kZSwgZGlzdGFuY2U7Ci0KLSAgICAgIFByZWZpeEVuY29kZSh2LT5sZW4sICZjb2RlLCAmbl9iaXRzLCAmYml0cyk7Ci0gICAgICBXcml0ZUh1ZmZtYW5Db2RlKGJ3LCBjb2RlcywgMjU2ICsgY29kZSk7Ci0gICAgICBWUDhMV3JpdGVCaXRzKGJ3LCBuX2JpdHMsIGJpdHMpOwotCi0gICAgICBkaXN0YW5jZSA9IFBpeE9yQ29weURpc3RhbmNlKHYpOwotICAgICAgUHJlZml4RW5jb2RlKGRpc3RhbmNlLCAmY29kZSwgJm5fYml0cywgJmJpdHMpOwotICAgICAgV3JpdGVIdWZmbWFuQ29kZShidywgY29kZXMgKyA0LCBjb2RlKTsKLSAgICAgIFZQOExXcml0ZUJpdHMoYncsIG5fYml0cywgYml0cyk7Ci0gICAgfQotICAgIHggKz0gUGl4T3JDb3B5TGVuZ3RoKHYpOwotICAgIHdoaWxlICh4ID49IHdpZHRoKSB7Ci0gICAgICB4IC09IHdpZHRoOwotICAgICAgKyt5OwotICAgIH0KLSAgfQotfQotCi0vLyBTcGVjaWFsIGNhc2Ugb2YgRW5jb2RlSW1hZ2VJbnRlcm5hbCgpIGZvciBjYWNoZS1iaXRzPTAsIGhpc3RvX2JpdHM9MzEKLXN0YXRpYyBpbnQgRW5jb2RlSW1hZ2VOb0h1ZmZtYW4oVlA4TEJpdFdyaXRlciogY29uc3QgYncsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBxdWFsaXR5KSB7Ci0gIGludCBpOwotICBpbnQgb2sgPSAwOwotICBWUDhMQmFja3dhcmRSZWZzIHJlZnM7Ci0gIEh1ZmZtYW5UcmVlQ29kZSBodWZmbWFuX2NvZGVzWzVdID0geyB7IDAsIE5VTEwsIE5VTEwgfSB9OwotICBjb25zdCB1aW50MTZfdCBoaXN0b2dyYW1fc3ltYm9sc1sxXSA9IHsgMCB9OyAgICAvLyBvbmx5IG9uZSB0cmVlLCBvbmUgc3ltYm9sCi0gIFZQOExIaXN0b2dyYW1TZXQqIGNvbnN0IGhpc3RvZ3JhbV9pbWFnZSA9IFZQOExBbGxvY2F0ZUhpc3RvZ3JhbVNldCgxLCAwKTsKLSAgaWYgKGhpc3RvZ3JhbV9pbWFnZSA9PSBOVUxMKSByZXR1cm4gMDsKLQotICAvLyBDYWxjdWxhdGUgYmFja3dhcmQgcmVmZXJlbmNlcyBmcm9tIEFSR0IgaW1hZ2UuCi0gIGlmICghVlA4TEdldEJhY2t3YXJkUmVmZXJlbmNlcyh3aWR0aCwgaGVpZ2h0LCBhcmdiLCBxdWFsaXR5LCAwLCAxLCAmcmVmcykpIHsKLSAgICBnb3RvIEVycm9yOwotICB9Ci0gIC8vIEJ1aWxkIGhpc3RvZ3JhbSBpbWFnZSBhbmQgc3ltYm9scyBmcm9tIGJhY2t3YXJkIHJlZmVyZW5jZXMuCi0gIFZQOExIaXN0b2dyYW1TdG9yZVJlZnMoJnJlZnMsIGhpc3RvZ3JhbV9pbWFnZS0+aGlzdG9ncmFtc1swXSk7Ci0KLSAgLy8gQ3JlYXRlIEh1ZmZtYW4gYml0IGxlbmd0aHMgYW5kIGNvZGVzIGZvciBlYWNoIGhpc3RvZ3JhbSBpbWFnZS4KLSAgU0JfRENIRUNLKGhpc3RvZ3JhbV9pbWFnZS0+c2l6ZSA9PSAxKTsKLSAgaWYgKCFHZXRIdWZmQml0TGVuZ3Roc0FuZENvZGVzKGhpc3RvZ3JhbV9pbWFnZSwgaHVmZm1hbl9jb2RlcykpIHsKLSAgICBnb3RvIEVycm9yOwotICB9Ci0KLSAgLy8gTm8gY29sb3IgY2FjaGUsIG5vIEh1ZmZtYW4gaW1hZ2UuCi0gIFZQOExXcml0ZUJpdHMoYncsIDEsIDApOwotCi0gIC8vIFN0b3JlIEh1ZmZtYW4gY29kZXMuCi0gIGZvciAoaSA9IDA7IGkgPCA1OyArK2kpIHsKLSAgICBIdWZmbWFuVHJlZUNvZGUqIGNvbnN0IGNvZGVzID0gJmh1ZmZtYW5fY29kZXNbaV07Ci0gICAgaWYgKCFTdG9yZUh1ZmZtYW5Db2RlKGJ3LCBjb2RlcykpIHsKLSAgICAgIGdvdG8gRXJyb3I7Ci0gICAgfQotICAgIENsZWFySHVmZm1hblRyZWVJZk9ubHlPbmVTeW1ib2woY29kZXMpOwotICB9Ci0KLSAgLy8gU3RvcmUgYWN0dWFsIGxpdGVyYWxzLgotICBTdG9yZUltYWdlVG9CaXRNYXNrKGJ3LCB3aWR0aCwgMCwgJnJlZnMsIGhpc3RvZ3JhbV9zeW1ib2xzLCBodWZmbWFuX2NvZGVzKTsKLSAgb2sgPSAxOwotCi0gRXJyb3I6Ci0gIFNiTWVtb3J5RGVhbGxvY2F0ZShoaXN0b2dyYW1faW1hZ2UpOwotICBWUDhMQ2xlYXJCYWNrd2FyZFJlZnMoJnJlZnMpOwotICBTYk1lbW9yeURlYWxsb2NhdGUoaHVmZm1hbl9jb2Rlc1swXS5jb2Rlcyk7Ci0gIHJldHVybiBvazsKLX0KLQotc3RhdGljIGludCBFbmNvZGVJbWFnZUludGVybmFsKFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHF1YWxpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhY2hlX2JpdHMsIGludCBoaXN0b2dyYW1fYml0cykgewotICBpbnQgb2sgPSAwOwotICBjb25zdCBpbnQgdXNlXzJkX2xvY2FsaXR5ID0gMTsKLSAgY29uc3QgaW50IHVzZV9jb2xvcl9jYWNoZSA9IChjYWNoZV9iaXRzID4gMCk7Ci0gIGNvbnN0IHVpbnQzMl90IGhpc3RvZ3JhbV9pbWFnZV94eXNpemUgPQotICAgICAgVlA4TFN1YlNhbXBsZVNpemUod2lkdGgsIGhpc3RvZ3JhbV9iaXRzKSAqCi0gICAgICBWUDhMU3ViU2FtcGxlU2l6ZShoZWlnaHQsIGhpc3RvZ3JhbV9iaXRzKTsKLSAgVlA4TEhpc3RvZ3JhbVNldCogaGlzdG9ncmFtX2ltYWdlID0KLSAgICAgIFZQOExBbGxvY2F0ZUhpc3RvZ3JhbVNldChoaXN0b2dyYW1faW1hZ2VfeHlzaXplLCAwKTsKLSAgaW50IGhpc3RvZ3JhbV9pbWFnZV9zaXplID0gMDsKLSAgc2l6ZV90IGJpdF9hcnJheV9zaXplID0gMDsKLSAgSHVmZm1hblRyZWVDb2RlKiBodWZmbWFuX2NvZGVzID0gTlVMTDsKLSAgVlA4TEJhY2t3YXJkUmVmcyByZWZzOwotICB1aW50MTZfdCogY29uc3QgaGlzdG9ncmFtX3N5bWJvbHMgPQotICAgICAgKHVpbnQxNl90KilXZWJQU2FmZU1hbGxvYygodWludDY0X3QpaGlzdG9ncmFtX2ltYWdlX3h5c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpoaXN0b2dyYW1fc3ltYm9scykpOwotICBTQl9EQ0hFQ0soaGlzdG9ncmFtX2JpdHMgPj0gTUlOX0hVRkZNQU5fQklUUyk7Ci0gIFNCX0RDSEVDSyhoaXN0b2dyYW1fYml0cyA8PSBNQVhfSFVGRk1BTl9CSVRTKTsKLQotICBpZiAoaGlzdG9ncmFtX2ltYWdlID09IE5VTEwgfHwgaGlzdG9ncmFtX3N5bWJvbHMgPT0gTlVMTCkgewotICAgIFNiTWVtb3J5RGVhbGxvY2F0ZShoaXN0b2dyYW1faW1hZ2UpOwotICAgIFNiTWVtb3J5RGVhbGxvY2F0ZShoaXN0b2dyYW1fc3ltYm9scyk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvLyBDYWxjdWxhdGUgYmFja3dhcmQgcmVmZXJlbmNlcyBmcm9tIEFSR0IgaW1hZ2UuCi0gIGlmICghVlA4TEdldEJhY2t3YXJkUmVmZXJlbmNlcyh3aWR0aCwgaGVpZ2h0LCBhcmdiLCBxdWFsaXR5LCBjYWNoZV9iaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlXzJkX2xvY2FsaXR5LCAmcmVmcykpIHsKLSAgICBnb3RvIEVycm9yOwotICB9Ci0gIC8vIEJ1aWxkIGhpc3RvZ3JhbSBpbWFnZSBhbmQgc3ltYm9scyBmcm9tIGJhY2t3YXJkIHJlZmVyZW5jZXMuCi0gIGlmICghVlA4TEdldEhpc3RvSW1hZ2VTeW1ib2xzKHdpZHRoLCBoZWlnaHQsICZyZWZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5LCBoaXN0b2dyYW1fYml0cywgY2FjaGVfYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlzdG9ncmFtX2ltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaXN0b2dyYW1fc3ltYm9scykpIHsKLSAgICBnb3RvIEVycm9yOwotICB9Ci0gIC8vIENyZWF0ZSBIdWZmbWFuIGJpdCBsZW5ndGhzIGFuZCBjb2RlcyBmb3IgZWFjaCBoaXN0b2dyYW0gaW1hZ2UuCi0gIGhpc3RvZ3JhbV9pbWFnZV9zaXplID0gaGlzdG9ncmFtX2ltYWdlLT5zaXplOwotICBiaXRfYXJyYXlfc2l6ZSA9IDUgKiBoaXN0b2dyYW1faW1hZ2Vfc2l6ZTsKLSAgaHVmZm1hbl9jb2RlcyA9IChIdWZmbWFuVHJlZUNvZGUqKVdlYlBTYWZlQ2FsbG9jKGJpdF9hcnJheV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpodWZmbWFuX2NvZGVzKSk7Ci0gIGlmIChodWZmbWFuX2NvZGVzID09IE5VTEwgfHwKLSAgICAgICFHZXRIdWZmQml0TGVuZ3Roc0FuZENvZGVzKGhpc3RvZ3JhbV9pbWFnZSwgaHVmZm1hbl9jb2RlcykpIHsKLSAgICBnb3RvIEVycm9yOwotICB9Ci0gIC8vIEZyZWUgY29tYmluZWQgaGlzdG9ncmFtcy4KLSAgU2JNZW1vcnlEZWFsbG9jYXRlKGhpc3RvZ3JhbV9pbWFnZSk7Ci0gIGhpc3RvZ3JhbV9pbWFnZSA9IE5VTEw7Ci0KLSAgLy8gQ29sb3IgQ2FjaGUgcGFyYW1ldGVycy4KLSAgVlA4TFdyaXRlQml0cyhidywgMSwgdXNlX2NvbG9yX2NhY2hlKTsKLSAgaWYgKHVzZV9jb2xvcl9jYWNoZSkgewotICAgIFZQOExXcml0ZUJpdHMoYncsIDQsIGNhY2hlX2JpdHMpOwotICB9Ci0KLSAgLy8gSHVmZm1hbiBpbWFnZSArIG1ldGEgaHVmZm1hbi4KLSAgewotICAgIGNvbnN0IGludCB3cml0ZV9oaXN0b2dyYW1faW1hZ2UgPSAoaGlzdG9ncmFtX2ltYWdlX3NpemUgPiAxKTsKLSAgICBWUDhMV3JpdGVCaXRzKGJ3LCAxLCB3cml0ZV9oaXN0b2dyYW1faW1hZ2UpOwotICAgIGlmICh3cml0ZV9oaXN0b2dyYW1faW1hZ2UpIHsKLSAgICAgIHVpbnQzMl90KiBjb25zdCBoaXN0b2dyYW1fYXJnYiA9Ci0gICAgICAgICAgKHVpbnQzMl90KilXZWJQU2FmZU1hbGxvYygodWludDY0X3QpaGlzdG9ncmFtX2ltYWdlX3h5c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqaGlzdG9ncmFtX2FyZ2IpKTsKLSAgICAgIGludCBtYXhfaW5kZXggPSAwOwotICAgICAgdWludDMyX3QgaTsKLSAgICAgIGlmIChoaXN0b2dyYW1fYXJnYiA9PSBOVUxMKSBnb3RvIEVycm9yOwotICAgICAgZm9yIChpID0gMDsgaSA8IGhpc3RvZ3JhbV9pbWFnZV94eXNpemU7ICsraSkgewotICAgICAgICBjb25zdCBpbnQgc3ltYm9sX2luZGV4ID0gaGlzdG9ncmFtX3N5bWJvbHNbaV0gJiAweGZmZmY7Ci0gICAgICAgIGhpc3RvZ3JhbV9hcmdiW2ldID0gMHhmZjAwMDAwMCB8IChzeW1ib2xfaW5kZXggPDwgOCk7Ci0gICAgICAgIGlmIChzeW1ib2xfaW5kZXggPj0gbWF4X2luZGV4KSB7Ci0gICAgICAgICAgbWF4X2luZGV4ID0gc3ltYm9sX2luZGV4ICsgMTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaGlzdG9ncmFtX2ltYWdlX3NpemUgPSBtYXhfaW5kZXg7Ci0KLSAgICAgIFZQOExXcml0ZUJpdHMoYncsIDMsIGhpc3RvZ3JhbV9iaXRzIC0gMik7Ci0gICAgICBvayA9IEVuY29kZUltYWdlTm9IdWZmbWFuKGJ3LCBoaXN0b2dyYW1fYXJnYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TFN1YlNhbXBsZVNpemUod2lkdGgsIGhpc3RvZ3JhbV9iaXRzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TFN1YlNhbXBsZVNpemUoaGVpZ2h0LCBoaXN0b2dyYW1fYml0cyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHkpOwotICAgICAgU2JNZW1vcnlEZWFsbG9jYXRlKGhpc3RvZ3JhbV9hcmdiKTsKLSAgICAgIGlmICghb2spIGdvdG8gRXJyb3I7Ci0gICAgfQotICB9Ci0KLSAgLy8gU3RvcmUgSHVmZm1hbiBjb2Rlcy4KLSAgewotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCA1ICogaGlzdG9ncmFtX2ltYWdlX3NpemU7ICsraSkgewotICAgICAgSHVmZm1hblRyZWVDb2RlKiBjb25zdCBjb2RlcyA9ICZodWZmbWFuX2NvZGVzW2ldOwotICAgICAgaWYgKCFTdG9yZUh1ZmZtYW5Db2RlKGJ3LCBjb2RlcykpIGdvdG8gRXJyb3I7Ci0gICAgICBDbGVhckh1ZmZtYW5UcmVlSWZPbmx5T25lU3ltYm9sKGNvZGVzKTsKLSAgICB9Ci0gIH0KLQotICAvLyBTdG9yZSBhY3R1YWwgbGl0ZXJhbHMuCi0gIFN0b3JlSW1hZ2VUb0JpdE1hc2soYncsIHdpZHRoLCBoaXN0b2dyYW1fYml0cywgJnJlZnMsCi0gICAgICAgICAgICAgICAgICAgICAgaGlzdG9ncmFtX3N5bWJvbHMsIGh1ZmZtYW5fY29kZXMpOwotICBvayA9IDE7Ci0KLSBFcnJvcjoKLSAgU2JNZW1vcnlEZWFsbG9jYXRlKGhpc3RvZ3JhbV9pbWFnZSk7Ci0KLSAgVlA4TENsZWFyQmFja3dhcmRSZWZzKCZyZWZzKTsKLSAgaWYgKGh1ZmZtYW5fY29kZXMgIT0gTlVMTCkgewotICAgIFNiTWVtb3J5RGVhbGxvY2F0ZShodWZmbWFuX2NvZGVzLT5jb2Rlcyk7Ci0gICAgU2JNZW1vcnlEZWFsbG9jYXRlKGh1ZmZtYW5fY29kZXMpOwotICB9Ci0gIFNiTWVtb3J5RGVhbGxvY2F0ZShoaXN0b2dyYW1fc3ltYm9scyk7Ci0gIHJldHVybiBvazsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFRyYW5zZm9ybXMKLQotLy8gQ2hlY2sgaWYgaXQgd291bGQgYmUgYSBnb29kIGlkZWEgdG8gc3VidHJhY3QgZ3JlZW4gZnJvbSByZWQgYW5kIGJsdWUuIFdlCi0vLyBvbmx5IGltcGFjdCBlbnRyb3B5IGluIHJlZC9ibHVlIGNvbXBvbmVudHMsIGRvbid0IGJvdGhlciB0byBsb29rIGF0IG90aGVycy4KLXN0YXRpYyBpbnQgRXZhbEFuZEFwcGx5U3VidHJhY3RHcmVlbihWUDhMRW5jb2RlciogY29uc3QgZW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQml0V3JpdGVyKiBjb25zdCBidykgewotICBpZiAoIWVuYy0+dXNlX3BhbGV0dGVfKSB7Ci0gICAgaW50IGk7Ci0gICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGFyZ2IgPSBlbmMtPmFyZ2JfOwotICAgIGRvdWJsZSBiaXRfY29zdF9iZWZvcmUsIGJpdF9jb3N0X2FmdGVyOwotICAgIFZQOExIaXN0b2dyYW0qIGNvbnN0IGhpc3RvID0gKFZQOExIaXN0b2dyYW0qKVNiTWVtb3J5QWxsb2NhdGUoc2l6ZW9mKCpoaXN0bykpOwotICAgIGlmIChoaXN0byA9PSBOVUxMKSByZXR1cm4gMDsKLQotICAgIFZQOExIaXN0b2dyYW1Jbml0KGhpc3RvLCAxKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGggKiBoZWlnaHQ7ICsraSkgewotICAgICAgY29uc3QgdWludDMyX3QgYyA9IGFyZ2JbaV07Ci0gICAgICArK2hpc3RvLT5yZWRfWyhjID4+IDE2KSAmIDB4ZmZdOwotICAgICAgKytoaXN0by0+Ymx1ZV9bKGMgPj4gMCkgJiAweGZmXTsKLSAgICB9Ci0gICAgYml0X2Nvc3RfYmVmb3JlID0gVlA4TEhpc3RvZ3JhbUVzdGltYXRlQml0cyhoaXN0byk7Ci0KLSAgICBWUDhMSGlzdG9ncmFtSW5pdChoaXN0bywgMSk7Ci0gICAgZm9yIChpID0gMDsgaSA8IHdpZHRoICogaGVpZ2h0OyArK2kpIHsKLSAgICAgIGNvbnN0IHVpbnQzMl90IGMgPSBhcmdiW2ldOwotICAgICAgY29uc3QgaW50IGdyZWVuID0gKGMgPj4gOCkgJiAweGZmOwotICAgICAgKytoaXN0by0+cmVkX1soKGMgPj4gMTYpIC0gZ3JlZW4pICYgMHhmZl07Ci0gICAgICArK2hpc3RvLT5ibHVlX1soKGMgPj4gMCkgLSBncmVlbikgJiAweGZmXTsKLSAgICB9Ci0gICAgYml0X2Nvc3RfYWZ0ZXIgPSBWUDhMSGlzdG9ncmFtRXN0aW1hdGVCaXRzKGhpc3RvKTsKLSAgICBTYk1lbW9yeURlYWxsb2NhdGUoaGlzdG8pOwotCi0gICAgLy8gQ2hlY2sgaWYgc3VidHJhY3RpbmcgZ3JlZW4geWllbGRzIGxvdyBlbnRyb3B5LgotICAgIGVuYy0+dXNlX3N1YnRyYWN0X2dyZWVuXyA9IChiaXRfY29zdF9hZnRlciA8IGJpdF9jb3N0X2JlZm9yZSk7Ci0gICAgaWYgKGVuYy0+dXNlX3N1YnRyYWN0X2dyZWVuXykgewotICAgICAgVlA4TFdyaXRlQml0cyhidywgMSwgVFJBTlNGT1JNX1BSRVNFTlQpOwotICAgICAgVlA4TFdyaXRlQml0cyhidywgMiwgU1VCVFJBQ1RfR1JFRU4pOwotICAgICAgVlA4TFN1YnRyYWN0R3JlZW5Gcm9tQmx1ZUFuZFJlZChlbmMtPmFyZ2JfLCB3aWR0aCAqIGhlaWdodCk7Ci0gICAgfQotICB9Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IEFwcGx5UHJlZGljdEZpbHRlcihjb25zdCBWUDhMRW5jb2RlciogY29uc3QgZW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgcXVhbGl0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3KSB7Ci0gIGNvbnN0IGludCBwcmVkX2JpdHMgPSBlbmMtPnRyYW5zZm9ybV9iaXRzXzsKLSAgY29uc3QgaW50IHRyYW5zZm9ybV93aWR0aCA9IFZQOExTdWJTYW1wbGVTaXplKHdpZHRoLCBwcmVkX2JpdHMpOwotICBjb25zdCBpbnQgdHJhbnNmb3JtX2hlaWdodCA9IFZQOExTdWJTYW1wbGVTaXplKGhlaWdodCwgcHJlZF9iaXRzKTsKLQotICBWUDhMUmVzaWR1YWxJbWFnZSh3aWR0aCwgaGVpZ2h0LCBwcmVkX2JpdHMsIGVuYy0+YXJnYl8sIGVuYy0+YXJnYl9zY3JhdGNoXywKLSAgICAgICAgICAgICAgICAgICAgZW5jLT50cmFuc2Zvcm1fZGF0YV8pOwotICBWUDhMV3JpdGVCaXRzKGJ3LCAxLCBUUkFOU0ZPUk1fUFJFU0VOVCk7Ci0gIFZQOExXcml0ZUJpdHMoYncsIDIsIFBSRURJQ1RPUl9UUkFOU0ZPUk0pOwotICBTQl9EQ0hFQ0socHJlZF9iaXRzID49IDIpOwotICBWUDhMV3JpdGVCaXRzKGJ3LCAzLCBwcmVkX2JpdHMgLSAyKTsKLSAgaWYgKCFFbmNvZGVJbWFnZU5vSHVmZm1hbihidywgZW5jLT50cmFuc2Zvcm1fZGF0YV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtX3dpZHRoLCB0cmFuc2Zvcm1faGVpZ2h0LCBxdWFsaXR5KSkgewotICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IEFwcGx5Q3Jvc3NDb2xvckZpbHRlcihjb25zdCBWUDhMRW5jb2RlciogY29uc3QgZW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgcXVhbGl0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3KSB7Ci0gIGNvbnN0IGludCBjY29sb3JfdHJhbnNmb3JtX2JpdHMgPSBlbmMtPnRyYW5zZm9ybV9iaXRzXzsKLSAgY29uc3QgaW50IHRyYW5zZm9ybV93aWR0aCA9IFZQOExTdWJTYW1wbGVTaXplKHdpZHRoLCBjY29sb3JfdHJhbnNmb3JtX2JpdHMpOwotICBjb25zdCBpbnQgdHJhbnNmb3JtX2hlaWdodCA9IFZQOExTdWJTYW1wbGVTaXplKGhlaWdodCwgY2NvbG9yX3RyYW5zZm9ybV9iaXRzKTsKLSAgY29uc3QgaW50IHN0ZXAgPSAocXVhbGl0eSA9PSAwKSA/IDMyIDogODsKLQotICBWUDhMQ29sb3JTcGFjZVRyYW5zZm9ybSh3aWR0aCwgaGVpZ2h0LCBjY29sb3JfdHJhbnNmb3JtX2JpdHMsIHN0ZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGVuYy0+YXJnYl8sIGVuYy0+dHJhbnNmb3JtX2RhdGFfKTsKLSAgVlA4TFdyaXRlQml0cyhidywgMSwgVFJBTlNGT1JNX1BSRVNFTlQpOwotICBWUDhMV3JpdGVCaXRzKGJ3LCAyLCBDUk9TU19DT0xPUl9UUkFOU0ZPUk0pOwotICBTQl9EQ0hFQ0soY2NvbG9yX3RyYW5zZm9ybV9iaXRzID49IDIpOwotICBWUDhMV3JpdGVCaXRzKGJ3LCAzLCBjY29sb3JfdHJhbnNmb3JtX2JpdHMgLSAyKTsKLSAgaWYgKCFFbmNvZGVJbWFnZU5vSHVmZm1hbihidywgZW5jLT50cmFuc2Zvcm1fZGF0YV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtX3dpZHRoLCB0cmFuc2Zvcm1faGVpZ2h0LCBxdWFsaXR5KSkgewotICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiAxOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgV2ViUEVuY29kaW5nRXJyb3IgV3JpdGVSaWZmSGVhZGVyKGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCByaWZmX3NpemUsIHNpemVfdCB2cDhsX3NpemUpIHsKLSAgdWludDhfdCByaWZmW1JJRkZfSEVBREVSX1NJWkUgKyBDSFVOS19IRUFERVJfU0laRSArIFZQOExfU0lHTkFUVVJFX1NJWkVdID0gewotICAgICdSJywgJ0knLCAnRicsICdGJywgMCwgMCwgMCwgMCwgJ1cnLCAnRScsICdCJywgJ1AnLAotICAgICdWJywgJ1AnLCAnOCcsICdMJywgMCwgMCwgMCwgMCwgVlA4TF9NQUdJQ19CWVRFLAotICB9OwotICBQdXRMRTMyKHJpZmYgKyBUQUdfU0laRSwgKHVpbnQzMl90KXJpZmZfc2l6ZSk7Ci0gIFB1dExFMzIocmlmZiArIFJJRkZfSEVBREVSX1NJWkUgKyBUQUdfU0laRSwgKHVpbnQzMl90KXZwOGxfc2l6ZSk7Ci0gIGlmICghcGljLT53cml0ZXIocmlmZiwgc2l6ZW9mKHJpZmYpLCBwaWMpKSB7Ci0gICAgcmV0dXJuIFZQOF9FTkNfRVJST1JfQkFEX1dSSVRFOwotICB9Ci0gIHJldHVybiBWUDhfRU5DX09LOwotfQotCi1zdGF0aWMgaW50IFdyaXRlSW1hZ2VTaXplKGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3KSB7Ci0gIGNvbnN0IGludCB3aWR0aCA9IHBpYy0+d2lkdGggLSAxOwotICBjb25zdCBpbnQgaGVpZ2h0ID0gcGljLT5oZWlnaHQgLSAxOwotICBTQl9EQ0hFQ0sod2lkdGggPCBXRUJQX01BWF9ESU1FTlNJT04gJiYgaGVpZ2h0IDwgV0VCUF9NQVhfRElNRU5TSU9OKTsKLQotICBWUDhMV3JpdGVCaXRzKGJ3LCBWUDhMX0lNQUdFX1NJWkVfQklUUywgd2lkdGgpOwotICBWUDhMV3JpdGVCaXRzKGJ3LCBWUDhMX0lNQUdFX1NJWkVfQklUUywgaGVpZ2h0KTsKLSAgcmV0dXJuICFidy0+ZXJyb3JfOwotfQotCi1zdGF0aWMgaW50IFdyaXRlUmVhbEFscGhhQW5kVmVyc2lvbihWUDhMQml0V3JpdGVyKiBjb25zdCBidywgaW50IGhhc19hbHBoYSkgewotICBWUDhMV3JpdGVCaXRzKGJ3LCAxLCBoYXNfYWxwaGEpOwotICBWUDhMV3JpdGVCaXRzKGJ3LCBWUDhMX1ZFUlNJT05fQklUUywgVlA4TF9WRVJTSU9OKTsKLSAgcmV0dXJuICFidy0+ZXJyb3JfOwotfQotCi1zdGF0aWMgV2ViUEVuY29kaW5nRXJyb3IgV3JpdGVJbWFnZShjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEJpdFdyaXRlciogY29uc3QgYncsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIGNvbnN0IGNvZGVkX3NpemUpIHsKLSAgV2ViUEVuY29kaW5nRXJyb3IgZXJyID0gVlA4X0VOQ19PSzsKLSAgY29uc3QgdWludDhfdCogY29uc3Qgd2VicGxsX2RhdGEgPSBWUDhMQml0V3JpdGVyRmluaXNoKGJ3KTsKLSAgY29uc3Qgc2l6ZV90IHdlYnBsbF9zaXplID0gVlA4TEJpdFdyaXRlck51bUJ5dGVzKGJ3KTsKLSAgY29uc3Qgc2l6ZV90IHZwOGxfc2l6ZSA9IFZQOExfU0lHTkFUVVJFX1NJWkUgKyB3ZWJwbGxfc2l6ZTsKLSAgY29uc3Qgc2l6ZV90IHBhZCA9IHZwOGxfc2l6ZSAmIDE7Ci0gIGNvbnN0IHNpemVfdCByaWZmX3NpemUgPSBUQUdfU0laRSArIENIVU5LX0hFQURFUl9TSVpFICsgdnA4bF9zaXplICsgcGFkOwotCi0gIGVyciA9IFdyaXRlUmlmZkhlYWRlcihwaWMsIHJpZmZfc2l6ZSwgdnA4bF9zaXplKTsKLSAgaWYgKGVyciAhPSBWUDhfRU5DX09LKSBnb3RvIEVycm9yOwotCi0gIGlmICghcGljLT53cml0ZXIod2VicGxsX2RhdGEsIHdlYnBsbF9zaXplLCBwaWMpKSB7Ci0gICAgZXJyID0gVlA4X0VOQ19FUlJPUl9CQURfV1JJVEU7Ci0gICAgZ290byBFcnJvcjsKLSAgfQotCi0gIGlmIChwYWQpIHsKLSAgICBjb25zdCB1aW50OF90IHBhZF9ieXRlWzFdID0geyAwIH07Ci0gICAgaWYgKCFwaWMtPndyaXRlcihwYWRfYnl0ZSwgMSwgcGljKSkgewotICAgICAgZXJyID0gVlA4X0VOQ19FUlJPUl9CQURfV1JJVEU7Ci0gICAgICBnb3RvIEVycm9yOwotICAgIH0KLSAgfQotICAqY29kZWRfc2l6ZSA9IENIVU5LX0hFQURFUl9TSVpFICsgcmlmZl9zaXplOwotICByZXR1cm4gVlA4X0VOQ19PSzsKLQotIEVycm9yOgotICByZXR1cm4gZXJyOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBBbGxvY2F0ZXMgdGhlIG1lbW9yeSBmb3IgYXJnYiAoVyB4IEgpIGJ1ZmZlciwgMiByb3dzIG9mIGNvbnRleHQgZm9yCi0vLyBwcmVkaWN0aW9uIGFuZCB0cmFuc2Zvcm0gZGF0YS4KLXN0YXRpYyBXZWJQRW5jb2RpbmdFcnJvciBBbGxvY2F0ZVRyYW5zZm9ybUJ1ZmZlcihWUDhMRW5jb2RlciogY29uc3QgZW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICBXZWJQRW5jb2RpbmdFcnJvciBlcnIgPSBWUDhfRU5DX09LOwotICBjb25zdCBpbnQgdGlsZV9zaXplID0gMSA8PCBlbmMtPnRyYW5zZm9ybV9iaXRzXzsKLSAgY29uc3QgdWludDY0X3QgaW1hZ2Vfc2l6ZSA9IHdpZHRoICogaGVpZ2h0OwotICBjb25zdCB1aW50NjRfdCBhcmdiX3NjcmF0Y2hfc2l6ZSA9IHRpbGVfc2l6ZSAqIHdpZHRoICsgd2lkdGg7Ci0gIGNvbnN0IHVpbnQ2NF90IHRyYW5zZm9ybV9kYXRhX3NpemUgPQotICAgICAgKHVpbnQ2NF90KVZQOExTdWJTYW1wbGVTaXplKHdpZHRoLCBlbmMtPnRyYW5zZm9ybV9iaXRzXykgKgotICAgICAgKHVpbnQ2NF90KVZQOExTdWJTYW1wbGVTaXplKGhlaWdodCwgZW5jLT50cmFuc2Zvcm1fYml0c18pOwotICBjb25zdCB1aW50NjRfdCB0b3RhbF9zaXplID0KLSAgICAgIGltYWdlX3NpemUgKyBhcmdiX3NjcmF0Y2hfc2l6ZSArIHRyYW5zZm9ybV9kYXRhX3NpemU7Ci0gIHVpbnQzMl90KiBtZW0gPSAodWludDMyX3QqKVdlYlBTYWZlTWFsbG9jKHRvdGFsX3NpemUsIHNpemVvZigqbWVtKSk7Ci0gIGlmIChtZW0gPT0gTlVMTCkgewotICAgIGVyciA9IFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWTsKLSAgICBnb3RvIEVycm9yOwotICB9Ci0gIGVuYy0+YXJnYl8gPSBtZW07Ci0gIG1lbSArPSBpbWFnZV9zaXplOwotICBlbmMtPmFyZ2Jfc2NyYXRjaF8gPSBtZW07Ci0gIG1lbSArPSBhcmdiX3NjcmF0Y2hfc2l6ZTsKLSAgZW5jLT50cmFuc2Zvcm1fZGF0YV8gPSBtZW07Ci0gIGVuYy0+Y3VycmVudF93aWR0aF8gPSB3aWR0aDsKLQotIEVycm9yOgotICByZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgdm9pZCBBcHBseVBhbGV0dGUodWludDMyX3QqIHNyYywgdWludDMyX3QqIGRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzcmNfc3RyaWRlLCB1aW50MzJfdCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBwYWxldHRlLCBpbnQgcGFsZXR0ZV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHhiaXRzLCB1aW50OF90KiByb3cpIHsKLSAgaW50IGksIHgsIHk7Ci0gIGludCB1c2VfTFVUID0gMTsKLSAgZm9yIChpID0gMDsgaSA8IHBhbGV0dGVfc2l6ZTsgKytpKSB7Ci0gICAgaWYgKChwYWxldHRlW2ldICYgMHhmZmZmMDBmZnUpICE9IDApIHsKLSAgICAgIHVzZV9MVVQgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgaWYgKHVzZV9MVVQpIHsKLSAgICBpbnQgaW52X3BhbGV0dGVbTUFYX1BBTEVUVEVfU0laRV0gPSB7IDAgfTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgcGFsZXR0ZV9zaXplOyArK2kpIHsKLSAgICAgIGNvbnN0IGludCBjb2xvciA9IChwYWxldHRlW2ldID4+IDgpICYgMHhmZjsKLSAgICAgIGludl9wYWxldHRlW2NvbG9yXSA9IGk7Ci0gICAgfQotICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgewotICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKLSAgICAgICAgY29uc3QgaW50IGNvbG9yID0gKHNyY1t4XSA+PiA4KSAmIDB4ZmY7Ci0gICAgICAgIHJvd1t4XSA9IGludl9wYWxldHRlW2NvbG9yXTsKLSAgICAgIH0KLSAgICAgIFZQOExCdW5kbGVDb2xvck1hcChyb3csIHdpZHRoLCB4Yml0cywgZHN0KTsKLSAgICAgIHNyYyArPSBzcmNfc3RyaWRlOwotICAgICAgZHN0ICs9IGRzdF9zdHJpZGU7Ci0gICAgfQotICB9IGVsc2UgewotICAgIC8vIFVzZSAxIHBpeGVsIGNhY2hlIGZvciBBUkdCIHBpeGVscy4KLSAgICB1aW50MzJfdCBsYXN0X3BpeCA9IHBhbGV0dGVbMF07Ci0gICAgaW50IGxhc3RfaWR4ID0gMDsKLSAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKLSAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7Ci0gICAgICAgIGNvbnN0IHVpbnQzMl90IHBpeCA9IHNyY1t4XTsKLSAgICAgICAgaWYgKHBpeCAhPSBsYXN0X3BpeCkgewotICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYWxldHRlX3NpemU7ICsraSkgewotICAgICAgICAgICAgaWYgKHBpeCA9PSBwYWxldHRlW2ldKSB7Ci0gICAgICAgICAgICAgIGxhc3RfaWR4ID0gaTsKLSAgICAgICAgICAgICAgbGFzdF9waXggPSBwaXg7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByb3dbeF0gPSBsYXN0X2lkeDsKLSAgICAgIH0KLSAgICAgIFZQOExCdW5kbGVDb2xvck1hcChyb3csIHdpZHRoLCB4Yml0cywgZHN0KTsKLSAgICAgIHNyYyArPSBzcmNfc3RyaWRlOwotICAgICAgZHN0ICs9IGRzdF9zdHJpZGU7Ci0gICAgfQotICB9Ci19Ci0KLS8vIE5vdGU6IEV4cGVjdHMgImVuYy0+cGFsZXR0ZV8iIHRvIGJlIHNldCBwcm9wZXJseS4KLS8vIEFsc28sICJlbmMtPnBhbGV0dGVfIiB3aWxsIGJlIG1vZGlmaWVkIGFmdGVyIHRoaXMgY2FsbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkCi0vLyBsYXRlci4KLXN0YXRpYyBXZWJQRW5jb2RpbmdFcnJvciBFbmNvZGVQYWxldHRlKFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEVuY29kZXIqIGNvbnN0IGVuYywgaW50IHF1YWxpdHkpIHsKLSAgV2ViUEVuY29kaW5nRXJyb3IgZXJyID0gVlA4X0VOQ19PSzsKLSAgaW50IGk7Ci0gIGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMgPSBlbmMtPnBpY187Ci0gIHVpbnQzMl90KiBzcmMgPSBwaWMtPmFyZ2I7Ci0gIHVpbnQzMl90KiBkc3Q7Ci0gIGNvbnN0IGludCB3aWR0aCA9IHBpYy0+d2lkdGg7Ci0gIGNvbnN0IGludCBoZWlnaHQgPSBwaWMtPmhlaWdodDsKLSAgdWludDMyX3QqIGNvbnN0IHBhbGV0dGUgPSBlbmMtPnBhbGV0dGVfOwotICBjb25zdCBpbnQgcGFsZXR0ZV9zaXplID0gZW5jLT5wYWxldHRlX3NpemVfOwotICB1aW50OF90KiByb3cgPSBOVUxMOwotICBpbnQgeGJpdHM7Ci0KLSAgLy8gUmVwbGFjZSBlYWNoIGlucHV0IHBpeGVsIGJ5IGNvcnJlc3BvbmRpbmcgcGFsZXR0ZSBpbmRleC4KLSAgLy8gVGhpcyBpcyBkb25lIGxpbmUgYnkgbGluZS4KLSAgaWYgKHBhbGV0dGVfc2l6ZSA8PSA0KSB7Ci0gICAgeGJpdHMgPSAocGFsZXR0ZV9zaXplIDw9IDIpID8gMyA6IDI7Ci0gIH0gZWxzZSB7Ci0gICAgeGJpdHMgPSAocGFsZXR0ZV9zaXplIDw9IDE2KSA/IDEgOiAwOwotICB9Ci0KLSAgZXJyID0gQWxsb2NhdGVUcmFuc2Zvcm1CdWZmZXIoZW5jLCBWUDhMU3ViU2FtcGxlU2l6ZSh3aWR0aCwgeGJpdHMpLCBoZWlnaHQpOwotICBpZiAoZXJyICE9IFZQOF9FTkNfT0spIGdvdG8gRXJyb3I7Ci0gIGRzdCA9IGVuYy0+YXJnYl87Ci0KLSAgcm93ID0gV2ViUFNhZmVNYWxsb2MoKHVpbnQ2NF90KXdpZHRoLCBzaXplb2YoKnJvdykpOwotICBpZiAocm93ID09IE5VTEwpIHJldHVybiBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlk7Ci0KLSAgQXBwbHlQYWxldHRlKHNyYywgZHN0LCBwaWMtPmFyZ2Jfc3RyaWRlLCBlbmMtPmN1cnJlbnRfd2lkdGhfLAotICAgICAgICAgICAgICAgcGFsZXR0ZSwgcGFsZXR0ZV9zaXplLCB3aWR0aCwgaGVpZ2h0LCB4Yml0cywgcm93KTsKLQotICAvLyBTYXZlIHBhbGV0dGUgdG8gYml0c3RyZWFtLgotICBWUDhMV3JpdGVCaXRzKGJ3LCAxLCBUUkFOU0ZPUk1fUFJFU0VOVCk7Ci0gIFZQOExXcml0ZUJpdHMoYncsIDIsIENPTE9SX0lOREVYSU5HX1RSQU5TRk9STSk7Ci0gIFNCX0RDSEVDSyhwYWxldHRlX3NpemUgPj0gMSk7Ci0gIFZQOExXcml0ZUJpdHMoYncsIDgsIHBhbGV0dGVfc2l6ZSAtIDEpOwotICBmb3IgKGkgPSBwYWxldHRlX3NpemUgLSAxOyBpID49IDE7IC0taSkgewotICAgIHBhbGV0dGVbaV0gPSBWUDhMU3ViUGl4ZWxzKHBhbGV0dGVbaV0sIHBhbGV0dGVbaSAtIDFdKTsKLSAgfQotICBpZiAoIUVuY29kZUltYWdlTm9IdWZmbWFuKGJ3LCBwYWxldHRlLCBwYWxldHRlX3NpemUsIDEsIHF1YWxpdHkpKSB7Ci0gICAgZXJyID0gVlA4X0VOQ19FUlJPUl9JTlZBTElEX0NPTkZJR1VSQVRJT047Ci0gICAgZ290byBFcnJvcjsKLSAgfQotCi0gRXJyb3I6Ci0gIFNiTWVtb3J5RGVhbGxvY2F0ZShyb3cpOwotICByZXR1cm4gZXJyOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgaW50IEdldEhpc3RvQml0cyhpbnQgbWV0aG9kLCBpbnQgdXNlX3BhbGV0dGUsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICBjb25zdCB1aW50NjRfdCBoaXN0X3NpemUgPSBzaXplb2YoVlA4TEhpc3RvZ3JhbSk7Ci0gIC8vIE1ha2UgdGlsZSBzaXplIGEgZnVuY3Rpb24gb2YgZW5jb2RpbmcgbWV0aG9kIChSYW5nZTogMCB0byA2KS4KLSAgaW50IGhpc3RvX2JpdHMgPSAodXNlX3BhbGV0dGUgPyA5IDogNykgLSBtZXRob2Q7Ci0gIHdoaWxlICgxKSB7Ci0gICAgY29uc3QgdWludDY0X3QgaHVmZl9pbWFnZV9zaXplID0gVlA4TFN1YlNhbXBsZVNpemUod2lkdGgsIGhpc3RvX2JpdHMpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMU3ViU2FtcGxlU2l6ZShoZWlnaHQsIGhpc3RvX2JpdHMpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaXN0X3NpemU7Ci0gICAgaWYgKGh1ZmZfaW1hZ2Vfc2l6ZSA8PSBNQVhfSFVGRl9JTUFHRV9TSVpFKSBicmVhazsKLSAgICArK2hpc3RvX2JpdHM7Ci0gIH0KLSAgcmV0dXJuIChoaXN0b19iaXRzIDwgTUlOX0hVRkZNQU5fQklUUykgPyBNSU5fSFVGRk1BTl9CSVRTIDoKLSAgICAgICAgIChoaXN0b19iaXRzID4gTUFYX0hVRkZNQU5fQklUUykgPyBNQVhfSFVGRk1BTl9CSVRTIDogaGlzdG9fYml0czsKLX0KLQotc3RhdGljIHZvaWQgRmluaXNoRW5jUGFyYW1zKFZQOExFbmNvZGVyKiBjb25zdCBlbmMpIHsKLSAgY29uc3QgV2ViUENvbmZpZyogY29uc3QgY29uZmlnID0gZW5jLT5jb25maWdfOwotICBjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljID0gZW5jLT5waWNfOwotICBjb25zdCBpbnQgbWV0aG9kID0gY29uZmlnLT5tZXRob2Q7Ci0gIGNvbnN0IGZsb2F0IHF1YWxpdHkgPSBjb25maWctPnF1YWxpdHk7Ci0gIGNvbnN0IGludCB1c2VfcGFsZXR0ZSA9IGVuYy0+dXNlX3BhbGV0dGVfOwotICBlbmMtPnRyYW5zZm9ybV9iaXRzXyA9IChtZXRob2QgPCA0KSA/IDUgOiAobWV0aG9kID4gNCkgPyAzIDogNDsKLSAgZW5jLT5oaXN0b19iaXRzXyA9IEdldEhpc3RvQml0cyhtZXRob2QsIHVzZV9wYWxldHRlLCBwaWMtPndpZHRoLCBwaWMtPmhlaWdodCk7Ci0gIGVuYy0+Y2FjaGVfYml0c18gPSAocXVhbGl0eSA8PSAyNS5mKSA/IDAgOiA3OwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVlA4TEVuY29kZXIKLQotc3RhdGljIFZQOExFbmNvZGVyKiBWUDhMRW5jb2Rlck5ldyhjb25zdCBXZWJQQ29uZmlnKiBjb25zdCBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWN0dXJlKSB7Ci0gIFZQOExFbmNvZGVyKiBjb25zdCBlbmMgPSAoVlA4TEVuY29kZXIqKVNiTWVtb3J5Q2FsbG9jKDEsIHNpemVvZigqZW5jKSk7Ci0gIGlmIChlbmMgPT0gTlVMTCkgewotICAgIFdlYlBFbmNvZGluZ1NldEVycm9yKHBpY3R1cmUsIFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWSk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgZW5jLT5jb25maWdfID0gY29uZmlnOwotICBlbmMtPnBpY18gPSBwaWN0dXJlOwotICByZXR1cm4gZW5jOwotfQotCi1zdGF0aWMgdm9pZCBWUDhMRW5jb2RlckRlbGV0ZShWUDhMRW5jb2RlciogZW5jKSB7Ci0gIFNiTWVtb3J5RGVhbGxvY2F0ZShlbmMtPmFyZ2JfKTsKLSAgU2JNZW1vcnlEZWFsbG9jYXRlKGVuYyk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBNYWluIGNhbGwKLQotV2ViUEVuY29kaW5nRXJyb3IgVlA4TEVuY29kZVN0cmVhbShjb25zdCBXZWJQQ29uZmlnKiBjb25zdCBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWN0dXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQml0V3JpdGVyKiBjb25zdCBidykgewotICBXZWJQRW5jb2RpbmdFcnJvciBlcnIgPSBWUDhfRU5DX09LOwotICBjb25zdCBpbnQgcXVhbGl0eSA9IChpbnQpY29uZmlnLT5xdWFsaXR5OwotICBjb25zdCBpbnQgd2lkdGggPSBwaWN0dXJlLT53aWR0aDsKLSAgY29uc3QgaW50IGhlaWdodCA9IHBpY3R1cmUtPmhlaWdodDsKLSAgVlA4TEVuY29kZXIqIGNvbnN0IGVuYyA9IFZQOExFbmNvZGVyTmV3KGNvbmZpZywgcGljdHVyZSk7Ci0gIGNvbnN0IHNpemVfdCBieXRlX3Bvc2l0aW9uID0gVlA4TEJpdFdyaXRlck51bUJ5dGVzKGJ3KTsKLQotICBpZiAoZW5jID09IE5VTEwpIHsKLSAgICBlcnIgPSBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlk7Ci0gICAgZ290byBFcnJvcjsKLSAgfQotCi0gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBBbmFseXplIGltYWdlIChlbnRyb3B5LCBudW1fcGFsZXR0ZXMgZXRjKQotCi0gIGlmICghVlA4TEVuY0FuYWx5emUoZW5jLCBjb25maWctPmltYWdlX2hpbnQpKSB7Ci0gICAgZXJyID0gVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZOwotICAgIGdvdG8gRXJyb3I7Ci0gIH0KLQotICBGaW5pc2hFbmNQYXJhbXMoZW5jKTsKLQotICBpZiAoZW5jLT51c2VfcGFsZXR0ZV8pIHsKLSAgICBlcnIgPSBFbmNvZGVQYWxldHRlKGJ3LCBlbmMsIHF1YWxpdHkpOwotICAgIGlmIChlcnIgIT0gVlA4X0VOQ19PSykgZ290byBFcnJvcjsKLSAgICAvLyBDb2xvciBjYWNoZSBpcyBkaXNhYmxlZCBmb3IgcGFsZXR0ZS4KLSAgICBlbmMtPmNhY2hlX2JpdHNfID0gMDsKLSAgfQotCi0gIC8vIEluIGNhc2UgaW1hZ2UgaXMgbm90IHBhY2tlZC4KLSAgaWYgKGVuYy0+YXJnYl8gPT0gTlVMTCkgewotICAgIGludCB5OwotICAgIGVyciA9IEFsbG9jYXRlVHJhbnNmb3JtQnVmZmVyKGVuYywgd2lkdGgsIGhlaWdodCk7Ci0gICAgaWYgKGVyciAhPSBWUDhfRU5DX09LKSBnb3RvIEVycm9yOwotICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgewotICAgICAgU2JNZW1vcnlDb3B5KGVuYy0+YXJnYl8gKyB5ICogd2lkdGgsCi0gICAgICAgICAgICAgcGljdHVyZS0+YXJnYiArIHkgKiBwaWN0dXJlLT5hcmdiX3N0cmlkZSwKLSAgICAgICAgICAgICB3aWR0aCAqIHNpemVvZigqZW5jLT5hcmdiXykpOwotICAgIH0KLSAgICBlbmMtPmN1cnJlbnRfd2lkdGhfID0gd2lkdGg7Ci0gIH0KLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gQXBwbHkgdHJhbnNmb3JtcyBhbmQgd3JpdGUgdHJhbnNmb3JtIGRhdGEuCi0KLSAgaWYgKCFFdmFsQW5kQXBwbHlTdWJ0cmFjdEdyZWVuKGVuYywgZW5jLT5jdXJyZW50X3dpZHRoXywgaGVpZ2h0LCBidykpIHsKLSAgICBlcnIgPSBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlk7Ci0gICAgZ290byBFcnJvcjsKLSAgfQotCi0gIGlmIChlbmMtPnVzZV9wcmVkaWN0XykgewotICAgIGlmICghQXBwbHlQcmVkaWN0RmlsdGVyKGVuYywgZW5jLT5jdXJyZW50X3dpZHRoXywgaGVpZ2h0LCBxdWFsaXR5LCBidykpIHsKLSAgICAgIGVyciA9IFZQOF9FTkNfRVJST1JfSU5WQUxJRF9DT05GSUdVUkFUSU9OOwotICAgICAgZ290byBFcnJvcjsKLSAgICB9Ci0gIH0KLQotICBpZiAoZW5jLT51c2VfY3Jvc3NfY29sb3JfKSB7Ci0gICAgaWYgKCFBcHBseUNyb3NzQ29sb3JGaWx0ZXIoZW5jLCBlbmMtPmN1cnJlbnRfd2lkdGhfLCBoZWlnaHQsIHF1YWxpdHksIGJ3KSkgewotICAgICAgZXJyID0gVlA4X0VOQ19FUlJPUl9JTlZBTElEX0NPTkZJR1VSQVRJT047Ci0gICAgICBnb3RvIEVycm9yOwotICAgIH0KLSAgfQotCi0gIFZQOExXcml0ZUJpdHMoYncsIDEsICFUUkFOU0ZPUk1fUFJFU0VOVCk7ICAvLyBObyBtb3JlIHRyYW5zZm9ybXMuCi0KLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIC8vIEVzdGltYXRlIHRoZSBjb2xvciBjYWNoZSBzaXplLgotCi0gIGlmIChlbmMtPmNhY2hlX2JpdHNfID4gMCkgewotICAgIGlmICghVlA4TENhbGN1bGF0ZUVzdGltYXRlRm9yQ2FjaGVTaXplKGVuYy0+YXJnYl8sIGVuYy0+Y3VycmVudF93aWR0aF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCAmZW5jLT5jYWNoZV9iaXRzXykpIHsKLSAgICAgIGVyciA9IFZQOF9FTkNfRVJST1JfSU5WQUxJRF9DT05GSUdVUkFUSU9OOwotICAgICAgZ290byBFcnJvcjsKLSAgICB9Ci0gIH0KLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gRW5jb2RlIGFuZCB3cml0ZSB0aGUgdHJhbnNmb3JtZWQgaW1hZ2UuCi0KLSAgaWYgKCFFbmNvZGVJbWFnZUludGVybmFsKGJ3LCBlbmMtPmFyZ2JfLCBlbmMtPmN1cnJlbnRfd2lkdGhfLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5LCBlbmMtPmNhY2hlX2JpdHNfLCBlbmMtPmhpc3RvX2JpdHNfKSkgewotICAgIGVyciA9IFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWTsKLSAgICBnb3RvIEVycm9yOwotICB9Ci0KLSAgaWYgKHBpY3R1cmUtPnN0YXRzICE9IE5VTEwpIHsKLSAgICBXZWJQQXV4U3RhdHMqIGNvbnN0IHN0YXRzID0gcGljdHVyZS0+c3RhdHM7Ci0gICAgc3RhdHMtPmxvc3NsZXNzX2ZlYXR1cmVzID0gMDsKLSAgICBpZiAoZW5jLT51c2VfcHJlZGljdF8pIHN0YXRzLT5sb3NzbGVzc19mZWF0dXJlcyB8PSAxOwotICAgIGlmIChlbmMtPnVzZV9jcm9zc19jb2xvcl8pIHN0YXRzLT5sb3NzbGVzc19mZWF0dXJlcyB8PSAyOwotICAgIGlmIChlbmMtPnVzZV9zdWJ0cmFjdF9ncmVlbl8pIHN0YXRzLT5sb3NzbGVzc19mZWF0dXJlcyB8PSA0OwotICAgIGlmIChlbmMtPnVzZV9wYWxldHRlXykgc3RhdHMtPmxvc3NsZXNzX2ZlYXR1cmVzIHw9IDg7Ci0gICAgc3RhdHMtPmhpc3RvZ3JhbV9iaXRzID0gZW5jLT5oaXN0b19iaXRzXzsKLSAgICBzdGF0cy0+dHJhbnNmb3JtX2JpdHMgPSBlbmMtPnRyYW5zZm9ybV9iaXRzXzsKLSAgICBzdGF0cy0+Y2FjaGVfYml0cyA9IGVuYy0+Y2FjaGVfYml0c187Ci0gICAgc3RhdHMtPnBhbGV0dGVfc2l6ZSA9IGVuYy0+cGFsZXR0ZV9zaXplXzsKLSAgICBzdGF0cy0+bG9zc2xlc3Nfc2l6ZSA9IChpbnQpKFZQOExCaXRXcml0ZXJOdW1CeXRlcyhidykgLSBieXRlX3Bvc2l0aW9uKTsKLSAgfQotCi0gRXJyb3I6Ci0gIFZQOExFbmNvZGVyRGVsZXRlKGVuYyk7Ci0gIHJldHVybiBlcnI7Ci19Ci0KLWludCBWUDhMRW5jb2RlSW1hZ2UoY29uc3QgV2ViUENvbmZpZyogY29uc3QgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSkgewotICBpbnQgd2lkdGgsIGhlaWdodDsKLSAgaW50IGhhc19hbHBoYTsKLSAgc2l6ZV90IGNvZGVkX3NpemU7Ci0gIGludCBwZXJjZW50ID0gMDsKLSAgV2ViUEVuY29kaW5nRXJyb3IgZXJyID0gVlA4X0VOQ19PSzsKLSAgVlA4TEJpdFdyaXRlciBidzsKLQotICBpZiAocGljdHVyZSA9PSBOVUxMKSByZXR1cm4gMDsKLQotICBpZiAoY29uZmlnID09IE5VTEwgfHwgcGljdHVyZS0+YXJnYiA9PSBOVUxMKSB7Ci0gICAgZXJyID0gVlA4X0VOQ19FUlJPUl9OVUxMX1BBUkFNRVRFUjsKLSAgICBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWN0dXJlLCBlcnIpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgd2lkdGggPSBwaWN0dXJlLT53aWR0aDsKLSAgaGVpZ2h0ID0gcGljdHVyZS0+aGVpZ2h0OwotICBpZiAoIVZQOExCaXRXcml0ZXJJbml0KCZidywgKHdpZHRoICogaGVpZ2h0KSA+PiAxKSkgewotICAgIGVyciA9IFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWTsKLSAgICBnb3RvIEVycm9yOwotICB9Ci0KLSAgaWYgKCFXZWJQUmVwb3J0UHJvZ3Jlc3MocGljdHVyZSwgMSwgJnBlcmNlbnQpKSB7Ci0gVXNlckFib3J0OgotICAgIGVyciA9IFZQOF9FTkNfRVJST1JfVVNFUl9BQk9SVDsKLSAgICBnb3RvIEVycm9yOwotICB9Ci0gIC8vIFJlc2V0IHN0YXRzIChmb3IgcHVyZSBsb3NzbGVzcyBjb2RpbmcpCi0gIGlmIChwaWN0dXJlLT5zdGF0cyAhPSBOVUxMKSB7Ci0gICAgV2ViUEF1eFN0YXRzKiBjb25zdCBzdGF0cyA9IHBpY3R1cmUtPnN0YXRzOwotICAgIFNiTWVtb3J5U2V0KHN0YXRzLCAwLCBzaXplb2YoKnN0YXRzKSk7Ci0gICAgc3RhdHMtPlBTTlJbMF0gPSA5OS5mOwotICAgIHN0YXRzLT5QU05SWzFdID0gOTkuZjsKLSAgICBzdGF0cy0+UFNOUlsyXSA9IDk5LmY7Ci0gICAgc3RhdHMtPlBTTlJbM10gPSA5OS5mOwotICAgIHN0YXRzLT5QU05SWzRdID0gOTkuZjsKLSAgfQotCi0gIC8vIFdyaXRlIGltYWdlIHNpemUuCi0gIGlmICghV3JpdGVJbWFnZVNpemUocGljdHVyZSwgJmJ3KSkgewotICAgIGVyciA9IFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWTsKLSAgICBnb3RvIEVycm9yOwotICB9Ci0KLSAgaGFzX2FscGhhID0gV2ViUFBpY3R1cmVIYXNUcmFuc3BhcmVuY3kocGljdHVyZSk7Ci0gIC8vIFdyaXRlIHRoZSBub24tdHJpdmlhbCBBbHBoYSBmbGFnIGFuZCBsb3NzbGVzcyB2ZXJzaW9uLgotICBpZiAoIVdyaXRlUmVhbEFscGhhQW5kVmVyc2lvbigmYncsIGhhc19hbHBoYSkpIHsKLSAgICBlcnIgPSBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlk7Ci0gICAgZ290byBFcnJvcjsKLSAgfQotCi0gIGlmICghV2ViUFJlcG9ydFByb2dyZXNzKHBpY3R1cmUsIDUsICZwZXJjZW50KSkgZ290byBVc2VyQWJvcnQ7Ci0KLSAgLy8gRW5jb2RlIG1haW4gaW1hZ2Ugc3RyZWFtLgotICBlcnIgPSBWUDhMRW5jb2RlU3RyZWFtKGNvbmZpZywgcGljdHVyZSwgJmJ3KTsKLSAgaWYgKGVyciAhPSBWUDhfRU5DX09LKSBnb3RvIEVycm9yOwotCi0gIC8vIFRPRE8oc2thbCk6IGhhdmUgYSBmaW5lLWdyYWluZWQgcHJvZ3Jlc3MgcmVwb3J0IGluIFZQOExFbmNvZGVTdHJlYW0oKS4KLSAgaWYgKCFXZWJQUmVwb3J0UHJvZ3Jlc3MocGljdHVyZSwgOTAsICZwZXJjZW50KSkgZ290byBVc2VyQWJvcnQ7Ci0KLSAgLy8gRmluaXNoIHRoZSBSSUZGIGNodW5rLgotICBlcnIgPSBXcml0ZUltYWdlKHBpY3R1cmUsICZidywgJmNvZGVkX3NpemUpOwotICBpZiAoZXJyICE9IFZQOF9FTkNfT0spIGdvdG8gRXJyb3I7Ci0KLSAgaWYgKCFXZWJQUmVwb3J0UHJvZ3Jlc3MocGljdHVyZSwgMTAwLCAmcGVyY2VudCkpIGdvdG8gVXNlckFib3J0OwotCi0gIC8vIFNhdmUgc2l6ZS4KLSAgaWYgKHBpY3R1cmUtPnN0YXRzICE9IE5VTEwpIHsKLSAgICBwaWN0dXJlLT5zdGF0cy0+Y29kZWRfc2l6ZSArPSAoaW50KWNvZGVkX3NpemU7Ci0gICAgcGljdHVyZS0+c3RhdHMtPmxvc3NsZXNzX3NpemUgPSAoaW50KWNvZGVkX3NpemU7Ci0gIH0KLQotICBpZiAocGljdHVyZS0+ZXh0cmFfaW5mbyAhPSBOVUxMKSB7Ci0gICAgY29uc3QgaW50IG1iX3cgPSAod2lkdGggKyAxNSkgPj4gNDsKLSAgICBjb25zdCBpbnQgbWJfaCA9IChoZWlnaHQgKyAxNSkgPj4gNDsKLSAgICBTYk1lbW9yeVNldChwaWN0dXJlLT5leHRyYV9pbmZvLCAwLCBtYl93ICogbWJfaCAqIHNpemVvZigqcGljdHVyZS0+ZXh0cmFfaW5mbykpOwotICB9Ci0KLSBFcnJvcjoKLSAgaWYgKGJ3LmVycm9yXykgZXJyID0gVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZOwotICBWUDhMQml0V3JpdGVyRGVzdHJveSgmYncpOwotICBpZiAoZXJyICE9IFZQOF9FTkNfT0spIHsKLSAgICBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWN0dXJlLCBlcnIpOwotICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiAxOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy92cDhsaS5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL3ZwOGxpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZjAxZjUuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL3ZwOGxpLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gTG9zc2xlc3MgZW5jb2RlcjogaW50ZXJuYWwgaGVhZGVyLgotLy8KLS8vIEF1dGhvcjogVmlrYXMgQXJvcmEgKHZpa2Fhcy5hcm9yYUBnbWFpbC5jb20pCi0KLSNpZm5kZWYgV0VCUF9FTkNfVlA4TElfSF8KLSNkZWZpbmUgV0VCUF9FTkNfVlA4TElfSF8KLQotI2luY2x1ZGUgIi4vaGlzdG9ncmFtLmgiCi0jaW5jbHVkZSAiLi4vdXRpbHMvYml0X3dyaXRlci5oIgotI2luY2x1ZGUgIi4uL3dlYnAvZW5jb2RlLmgiCi0jaW5jbHVkZSAiLi4vd2VicC9mb3JtYXRfY29uc3RhbnRzLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGNvbnN0IFdlYlBDb25maWcqIGNvbmZpZ187ICAgIC8vIHVzZXIgY29uZmlndXJhdGlvbiBhbmQgcGFyYW1ldGVycwotICBjb25zdCBXZWJQUGljdHVyZSogcGljXzsgICAgICAvLyBpbnB1dCBwaWN0dXJlLgotCi0gIHVpbnQzMl90KiBhcmdiXzsgICAgICAgICAgICAgIC8vIFRyYW5zZm9ybWVkIGFyZ2IgaW1hZ2UgZGF0YS4KLSAgdWludDMyX3QqIGFyZ2Jfc2NyYXRjaF87ICAgICAgLy8gU2NyYXRjaCBtZW1vcnkgZm9yIGFyZ2Igcm93cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAodXNlZCBmb3IgcHJlZGljdGlvbikuCi0gIHVpbnQzMl90KiB0cmFuc2Zvcm1fZGF0YV87ICAgIC8vIFNjcmF0Y2ggbWVtb3J5IGZvciB0cmFuc2Zvcm0gZGF0YS4KLSAgaW50ICAgICAgIGN1cnJlbnRfd2lkdGhfOyAgICAgLy8gQ29ycmVzcG9uZHMgdG8gcGFja2VkIGltYWdlIHdpZHRoLgotCi0gIC8vIEVuY29kaW5nIHBhcmFtZXRlcnMgZGVyaXZlZCBmcm9tIHF1YWxpdHkgcGFyYW1ldGVyLgotICBpbnQgaGlzdG9fYml0c187Ci0gIGludCB0cmFuc2Zvcm1fYml0c187Ci0gIGludCBjYWNoZV9iaXRzXzsgICAgICAgIC8vIElmIGVxdWFsIHRvIDAsIGRvbid0IHVzZSBjb2xvciBjYWNoZS4KLQotICAvLyBFbmNvZGluZyBwYXJhbWV0ZXJzIGRlcml2ZWQgZnJvbSBpbWFnZSBjaGFyYWN0ZXJpc3RpY3MuCi0gIGludCB1c2VfY3Jvc3NfY29sb3JfOwotICBpbnQgdXNlX3N1YnRyYWN0X2dyZWVuXzsKLSAgaW50IHVzZV9wcmVkaWN0XzsKLSAgaW50IHVzZV9wYWxldHRlXzsKLSAgaW50IHBhbGV0dGVfc2l6ZV87Ci0gIHVpbnQzMl90IHBhbGV0dGVfW01BWF9QQUxFVFRFX1NJWkVdOwotfSBWUDhMRW5jb2RlcjsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGludGVybmFsIGZ1bmN0aW9ucy4gTm90IHB1YmxpYy4KLQotLy8gRW5jb2RlcyB0aGUgcGljdHVyZS4KLS8vIFJldHVybnMgMCBpZiBjb25maWcgb3IgcGljdHVyZSBpcyBOVUxMIG9yIHBpY3R1cmUgZG9lc24ndCBoYXZlIHZhbGlkIGFyZ2IKLS8vIGlucHV0LgotaW50IFZQOExFbmNvZGVJbWFnZShjb25zdCBXZWJQQ29uZmlnKiBjb25zdCBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWN0dXJlKTsKLQotLy8gRW5jb2RlcyB0aGUgbWFpbiBpbWFnZSBzdHJlYW0gdXNpbmcgdGhlIHN1cHBsaWVkIGJpdCB3cml0ZXIuCi1XZWJQRW5jb2RpbmdFcnJvciBWUDhMRW5jb2RlU3RyZWFtKGNvbnN0IFdlYlBDb25maWcqIGNvbnN0IGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3KTsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCi0KLSNlbmRpZiAgLyogV0VCUF9FTkNfVlA4TElfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy93ZWJwZW5jLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvd2VicGVuYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTRmYjNiLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy93ZWJwZW5jLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MjUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIFdlYlAgZW5jb2RlcjogbWFpbiBlbnRyeSBwb2ludAotLy8KLS8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCi0KLSNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgotI2Vsc2UKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgIi4vdnA4ZW5jaS5oIgotI2luY2x1ZGUgIi4vdnA4bGkuaCIKLSNpbmNsdWRlICIuLi91dGlscy91dGlscy5oIgotCi0vLyAjZGVmaW5lIFBSSU5UX01FTU9SWV9JTkZPCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaWZkZWYgUFJJTlRfTUVNT1JZX0lORk8KLSNpbmNsdWRlIDxzdGRpby5oPgotI2VuZGlmCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWludCBXZWJQR2V0RW5jb2RlclZlcnNpb24odm9pZCkgewotICByZXR1cm4gKEVOQ19NQUpfVkVSU0lPTiA8PCAxNikgfCAoRU5DX01JTl9WRVJTSU9OIDw8IDgpIHwgRU5DX1JFVl9WRVJTSU9OOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gV2ViUFBpY3R1cmUKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBpbnQgRHVtbXlXcml0ZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUpIHsKLSAgLy8gVGhlIGZvbGxvd2luZyBhcmUgdG8gcHJldmVudCAndW51c2VkIHZhcmlhYmxlJyBlcnJvciBtZXNzYWdlLgotICAodm9pZClkYXRhOwotICAodm9pZClkYXRhX3NpemU7Ci0gICh2b2lkKXBpY3R1cmU7Ci0gIHJldHVybiAxOwotfQotCi1pbnQgV2ViUFBpY3R1cmVJbml0SW50ZXJuYWwoV2ViUFBpY3R1cmUqIHBpY3R1cmUsIGludCB2ZXJzaW9uKSB7Ci0gIGlmIChXRUJQX0FCSV9JU19JTkNPTVBBVElCTEUodmVyc2lvbiwgV0VCUF9FTkNPREVSX0FCSV9WRVJTSU9OKSkgewotICAgIHJldHVybiAwOyAgIC8vIGNhbGxlci9zeXN0ZW0gdmVyc2lvbiBtaXNtYXRjaCEKLSAgfQotICBpZiAocGljdHVyZSAhPSBOVUxMKSB7Ci0gICAgU2JNZW1vcnlTZXQocGljdHVyZSwgMCwgc2l6ZW9mKCpwaWN0dXJlKSk7Ci0gICAgcGljdHVyZS0+d3JpdGVyID0gRHVtbXlXcml0ZXI7Ci0gICAgV2ViUEVuY29kaW5nU2V0RXJyb3IocGljdHVyZSwgVlA4X0VOQ19PSyk7Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBWUDhFbmNvZGVyCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCBSZXNldFNlZ21lbnRIZWFkZXIoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7Ci0gIFZQOFNlZ21lbnRIZWFkZXIqIGNvbnN0IGhkciA9ICZlbmMtPnNlZ21lbnRfaGRyXzsKLSAgaGRyLT5udW1fc2VnbWVudHNfID0gZW5jLT5jb25maWdfLT5zZWdtZW50czsKLSAgaGRyLT51cGRhdGVfbWFwXyAgPSAoaGRyLT5udW1fc2VnbWVudHNfID4gMSk7Ci0gIGhkci0+c2l6ZV8gPSAwOwotfQotCi1zdGF0aWMgdm9pZCBSZXNldEZpbHRlckhlYWRlcihWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKLSAgVlA4RmlsdGVySGVhZGVyKiBjb25zdCBoZHIgPSAmZW5jLT5maWx0ZXJfaGRyXzsKLSAgaGRyLT5zaW1wbGVfID0gMTsKLSAgaGRyLT5sZXZlbF8gPSAwOwotICBoZHItPnNoYXJwbmVzc18gPSAwOwotICBoZHItPmk0eDRfbGZfZGVsdGFfID0gMDsKLX0KLQotc3RhdGljIHZvaWQgUmVzZXRCb3VuZGFyeVByZWRpY3Rpb25zKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgewotICAvLyBpbml0IGJvdW5kYXJ5IHZhbHVlcyBvbmNlIGZvciBhbGwKLSAgLy8gTm90ZTogYWN0dWFsbHksIGluaXRpYWxpemluZyB0aGUgcHJlZHNfW10gaXMgb25seSBuZWVkZWQgZm9yIGludHJhNC4KLSAgaW50IGk7Ci0gIHVpbnQ4X3QqIGNvbnN0IHRvcCA9IGVuYy0+cHJlZHNfIC0gZW5jLT5wcmVkc193XzsKLSAgdWludDhfdCogY29uc3QgbGVmdCA9IGVuYy0+cHJlZHNfIC0gMTsKLSAgZm9yIChpID0gLTE7IGkgPCA0ICogZW5jLT5tYl93XzsgKytpKSB7Ci0gICAgdG9wW2ldID0gQl9EQ19QUkVEOwotICB9Ci0gIGZvciAoaSA9IDA7IGkgPCA0ICogZW5jLT5tYl9oXzsgKytpKSB7Ci0gICAgbGVmdFtpICogZW5jLT5wcmVkc193X10gPSBCX0RDX1BSRUQ7Ci0gIH0KLSAgZW5jLT5uel9bLTFdID0gMDsgICAvLyBjb25zdGFudAotfQotCi0vLyBNYXBwaW5nIGZyb20gY29uZmlnLT5tZXRob2RfIHRvIGNvZGluZyB0b29scyB1c2VkLgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSsKLS8vICAgTWV0aG9kICAgICAgICAgIHwgMCB8IDEgfCAyIHwgMyB8KDQpfCA1IHwgNiB8Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKwotLy8gZmFzdCBwcm9iZSAgICAgICAgfCB4IHwgICB8ICAgfCB4IHwgICB8ICAgfCAgIHwKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rCi0vLyBkeW5hbWljIHByb2JhICAgICB8IH4gfCB4IHwgeCB8IHggfCB4IHwgeCB8IHggfAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSsKLS8vIGZhc3QgbW9kZSBhbmFseXNpc3wgICB8ICAgfCAgIHwgICB8IHggfCB4IHwgeCB8Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKwotLy8gYmFzaWMgcmQtb3B0ICAgICAgfCAgIHwgICB8ICAgfCB4IHwgeCB8IHggfCB4IHwKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rCi0vLyBkaXN0by1zY29yZSBpNC8xNiB8ICAgfCAgIHwgeCB8ICAgfCAgIHwgICB8ICAgfAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSsKLS8vIHJkLW9wdCBpNC8xNiAgICAgIHwgICB8ICAgfCB+IHwgeCB8IHggfCB4IHwgeCB8Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKwotLy8gdG9rZW4gYnVmZmVyIChvcHQpfCAgIHwgICB8ICAgfCB4IHwgeCB8IHggfCB4IHwKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rCi0vLyBUcmVsbGlzICAgICAgICAgICB8ICAgfCAgIHwgICB8ICAgfCAgIHwgeCB8RnVsfAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSsKLS8vIGZ1bGwtU05TICAgICAgICAgIHwgICB8ICAgfCAgIHwgICB8IHggfCB4IHwgeCB8Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKwotCi1zdGF0aWMgdm9pZCBNYXBDb25maWdUb1Rvb2xzKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgewotICBjb25zdCBXZWJQQ29uZmlnKiBjb25zdCBjb25maWcgPSBlbmMtPmNvbmZpZ187Ci0gIGNvbnN0IGludCBtZXRob2QgPSBjb25maWctPm1ldGhvZDsKLSAgY29uc3QgaW50IGxpbWl0ID0gMTAwIC0gY29uZmlnLT5wYXJ0aXRpb25fbGltaXQ7Ci0gIGVuYy0+bWV0aG9kXyA9IG1ldGhvZDsKLSAgZW5jLT5yZF9vcHRfbGV2ZWxfID0gKG1ldGhvZCA+PSA2KSA/IFJEX09QVF9UUkVMTElTX0FMTAotICAgICAgICAgICAgICAgICAgICAgOiAobWV0aG9kID49IDUpID8gUkRfT1BUX1RSRUxMSVMKLSAgICAgICAgICAgICAgICAgICAgIDogKG1ldGhvZCA+PSAzKSA/IFJEX09QVF9CQVNJQwotICAgICAgICAgICAgICAgICAgICAgOiBSRF9PUFRfTk9ORTsKLSAgZW5jLT5tYXhfaTRfaGVhZGVyX2JpdHNfID0KLSAgICAgIDI1NiAqIDE2ICogMTYgKiAgICAgICAgICAgICAgICAgLy8gdXBwZXIgYm91bmQ6IHVwIHRvIDE2Yml0IHBlciA0eDQgYmxvY2sKLSAgICAgIChsaW1pdCAqIGxpbWl0KSAvICgxMDAgKiAxMDApOyAgLy8gLi4uIG1vZHVsYXRlZCB3aXRoIGEgcXVhZHJhdGljIGN1cnZlLgotCi0gIGVuYy0+dGhyZWFkX2xldmVsXyA9IGNvbmZpZy0+dGhyZWFkX2xldmVsOwotCi0gIGVuYy0+ZG9fc2VhcmNoXyA9IChjb25maWctPnRhcmdldF9zaXplID4gMCB8fCBjb25maWctPnRhcmdldF9QU05SID4gMCk7Ci0gIGlmICghY29uZmlnLT5sb3dfbWVtb3J5KSB7Ci0jaWYgIWRlZmluZWQoRElTQUJMRV9UT0tFTl9CVUZGRVIpCi0gICAgZW5jLT51c2VfdG9rZW5zXyA9IChtZXRob2QgPj0gMykgJiYgIWVuYy0+ZG9fc2VhcmNoXzsKLSNlbmRpZgotICAgIGlmIChlbmMtPnVzZV90b2tlbnNfKSB7Ci0gICAgICBlbmMtPm51bV9wYXJ0c18gPSAxOyAgIC8vIGRvZXNuJ3Qgd29yayB3aXRoIG11bHRpLXBhcnRpdGlvbgotICAgIH0KLSAgfQotfQotCi0vLyBNZW1vcnkgc2NhbGluZyB3aXRoIGRpbWVuc2lvbnM6Ci0vLyAgbWVtb3J5IChieXRlcykgfj0gMi4yNSAqIHcgKyAwLjA2MjUgKiB3ICogaAotLy8KLS8vIFR5cGljYWwgbWVtb3J5IGZvb3RwcmludCAoNzY4eDUxMCBwaWN0dXJlKQotLy8gTWVtb3J5IHVzZWQ6Ci0vLyAgICAgICAgICAgICAgZW5jb2RlcjogMzM5MTkKLS8vICAgICAgICAgIGJsb2NrIGNhY2hlOiAyODgwCi0vLyAgICAgICAgICAgICAgICAgaW5mbzogMzA3MgotLy8gICAgICAgICAgICAgICAgcHJlZHM6IDI0ODk3Ci0vLyAgICAgICAgICB0b3Agc2FtcGxlczogMTYyMwotLy8gICAgICAgICAgICAgbm9uLXplcm86IDE5NgotLy8gICAgICAgICAgICAgbGYtc3RhdHM6IDIwNDgKLS8vICAgICAgICAgICAgICAgIHRvdGFsOiA2ODYzNQotLy8gVHJhbnNjaWVudCBvYmplY3Qgc2l6ZXM6Ci0vLyAgICAgICBWUDhFbmNJdGVyYXRvcjogMzUyCi0vLyAgICAgICAgIFZQOE1vZGVTY29yZTogOTEyCi0vLyAgICAgICBWUDhTZWdtZW50SW5mbzogNTMyCi0vLyAgICAgICAgICAgICBWUDhQcm9iYTogMzEwMzIKLS8vICAgICAgICAgICAgICBMRlN0YXRzOiAyMDQ4Ci0vLyBQaWN0dXJlIHNpemUgKHl1dik6IDU4OTgyNAotCi1zdGF0aWMgVlA4RW5jb2RlciogSW5pdFZQOEVuY29kZXIoY29uc3QgV2ViUENvbmZpZyogY29uc3QgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBQaWN0dXJlKiBjb25zdCBwaWN0dXJlKSB7Ci0gIGNvbnN0IGludCB1c2VfZmlsdGVyID0KLSAgICAgIChjb25maWctPmZpbHRlcl9zdHJlbmd0aCA+IDApIHx8IChjb25maWctPmF1dG9maWx0ZXIgPiAwKTsKLSAgY29uc3QgaW50IG1iX3cgPSAocGljdHVyZS0+d2lkdGggKyAxNSkgPj4gNDsKLSAgY29uc3QgaW50IG1iX2ggPSAocGljdHVyZS0+aGVpZ2h0ICsgMTUpID4+IDQ7Ci0gIGNvbnN0IGludCBwcmVkc193ID0gNCAqIG1iX3cgKyAxOwotICBjb25zdCBpbnQgcHJlZHNfaCA9IDQgKiBtYl9oICsgMTsKLSAgY29uc3Qgc2l6ZV90IHByZWRzX3NpemUgPSBwcmVkc193ICogcHJlZHNfaCAqIHNpemVvZih1aW50OF90KTsKLSAgY29uc3QgaW50IHRvcF9zdHJpZGUgPSBtYl93ICogMTY7Ci0gIGNvbnN0IHNpemVfdCBuel9zaXplID0gKG1iX3cgKyAxKSAqIHNpemVvZih1aW50MzJfdCk7Ci0gIGNvbnN0IHNpemVfdCBjYWNoZV9zaXplID0gKDMgKiBZVVZfU0laRSArIFBSRURfU0laRSkgKiBzaXplb2YodWludDhfdCk7Ci0gIGNvbnN0IHNpemVfdCBpbmZvX3NpemUgPSBtYl93ICogbWJfaCAqIHNpemVvZihWUDhNQkluZm8pOwotICBjb25zdCBzaXplX3Qgc2FtcGxlc19zaXplID0gKDIgKiB0b3Bfc3RyaWRlICsgICAgICAgICAvLyB0b3AtbHVtYS91L3YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiArIDE2ICsgMTYgKyA4ICsgMSArICAgLy8gbGVmdCB5L3UvdgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgKiBBTElHTl9DU1QpICAgICAgICAgICAvLyBhbGlnbiBhbGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpemVvZih1aW50OF90KTsKLSAgY29uc3Qgc2l6ZV90IGxmX3N0YXRzX3NpemUgPQotICAgICAgY29uZmlnLT5hdXRvZmlsdGVyID8gc2l6ZW9mKExGU3RhdHMpICsgQUxJR05fQ1NUIDogMDsKLSAgVlA4RW5jb2RlciogZW5jOwotICB1aW50OF90KiBtZW07Ci0gIGNvbnN0IHVpbnQ2NF90IHNpemUgPSAodWludDY0X3Qpc2l6ZW9mKFZQOEVuY29kZXIpICAgLy8gbWFpbiBzdHJ1Y3QKLSAgICAgICAgICAgICAgICAgICAgICArIEFMSUdOX0NTVCAgICAgICAgICAgICAgICAgICAgICAvLyBjYWNoZSBhbGlnbm1lbnQKLSAgICAgICAgICAgICAgICAgICAgICArIGNhY2hlX3NpemUgICAgICAgICAgICAgICAgICAgICAvLyB3b3JraW5nIGNhY2hlcwotICAgICAgICAgICAgICAgICAgICAgICsgaW5mb19zaXplICAgICAgICAgICAgICAgICAgICAgIC8vIG1vZGVzIGluZm8KLSAgICAgICAgICAgICAgICAgICAgICArIHByZWRzX3NpemUgICAgICAgICAgICAgICAgICAgICAvLyBwcmVkaWN0aW9uIG1vZGVzCi0gICAgICAgICAgICAgICAgICAgICAgKyBzYW1wbGVzX3NpemUgICAgICAgICAgICAgICAgICAgLy8gdG9wL2xlZnQgc2FtcGxlcwotICAgICAgICAgICAgICAgICAgICAgICsgbnpfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvZWZmIGNvbnRleHQgYml0cwotICAgICAgICAgICAgICAgICAgICAgICsgbGZfc3RhdHNfc2l6ZTsgICAgICAgICAgICAgICAgIC8vIGF1dG9maWx0ZXIgc3RhdHMKLQotI2lmZGVmIFBSSU5UX01FTU9SWV9JTkZPCi0gIHByaW50ZigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOwotICBwcmludGYoIk1lbW9yeSB1c2VkOlxuIgotICAgICAgICAgIiAgICAgICAgICAgICBlbmNvZGVyOiAlbGRcbiIKLSAgICAgICAgICIgICAgICAgICBibG9jayBjYWNoZTogJWxkXG4iCi0gICAgICAgICAiICAgICAgICAgICAgICAgIGluZm86ICVsZFxuIgotICAgICAgICAgIiAgICAgICAgICAgICAgIHByZWRzOiAlbGRcbiIKLSAgICAgICAgICIgICAgICAgICB0b3Agc2FtcGxlczogJWxkXG4iCi0gICAgICAgICAiICAgICAgICAgICAgbm9uLXplcm86ICVsZFxuIgotICAgICAgICAgIiAgICAgICAgICAgIGxmLXN0YXRzOiAlbGRcbiIKLSAgICAgICAgICIgICAgICAgICAgICAgICB0b3RhbDogJWxkXG4iLAotICAgICAgICAgc2l6ZW9mKFZQOEVuY29kZXIpICsgQUxJR05fQ1NULCBjYWNoZV9zaXplLCBpbmZvX3NpemUsCi0gICAgICAgICBwcmVkc19zaXplLCBzYW1wbGVzX3NpemUsIG56X3NpemUsIGxmX3N0YXRzX3NpemUsIHNpemUpOwotICBwcmludGYoIlRyYW5zY2llbnQgb2JqZWN0IHNpemVzOlxuIgotICAgICAgICAgIiAgICAgIFZQOEVuY0l0ZXJhdG9yOiAlbGRcbiIKLSAgICAgICAgICIgICAgICAgIFZQOE1vZGVTY29yZTogJWxkXG4iCi0gICAgICAgICAiICAgICAgVlA4U2VnbWVudEluZm86ICVsZFxuIgotICAgICAgICAgIiAgICAgICAgICAgIFZQOFByb2JhOiAlbGRcbiIKLSAgICAgICAgICIgICAgICAgICAgICAgTEZTdGF0czogJWxkXG4iLAotICAgICAgICAgc2l6ZW9mKFZQOEVuY0l0ZXJhdG9yKSwgc2l6ZW9mKFZQOE1vZGVTY29yZSksCi0gICAgICAgICBzaXplb2YoVlA4U2VnbWVudEluZm8pLCBzaXplb2YoVlA4UHJvYmEpLAotICAgICAgICAgc2l6ZW9mKExGU3RhdHMpKTsKLSAgcHJpbnRmKCJQaWN0dXJlIHNpemUgKHl1dik6ICVsZFxuIiwKLSAgICAgICAgIG1iX3cgKiBtYl9oICogMzg0ICogc2l6ZW9mKHVpbnQ4X3QpKTsKLSAgcHJpbnRmKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7Ci0jZW5kaWYKLSAgbWVtID0gKHVpbnQ4X3QqKVdlYlBTYWZlTWFsbG9jKHNpemUsIHNpemVvZigqbWVtKSk7Ci0gIGlmIChtZW0gPT0gTlVMTCkgewotICAgIFdlYlBFbmNvZGluZ1NldEVycm9yKHBpY3R1cmUsIFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWSk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgZW5jID0gKFZQOEVuY29kZXIqKW1lbTsKLSAgbWVtID0gKHVpbnQ4X3QqKURPX0FMSUdOKG1lbSArIHNpemVvZigqZW5jKSk7Ci0gIFNiTWVtb3J5U2V0KGVuYywgMCwgc2l6ZW9mKCplbmMpKTsKLSAgZW5jLT5udW1fcGFydHNfID0gMSA8PCBjb25maWctPnBhcnRpdGlvbnM7Ci0gIGVuYy0+bWJfd18gPSBtYl93OwotICBlbmMtPm1iX2hfID0gbWJfaDsKLSAgZW5jLT5wcmVkc193XyA9IHByZWRzX3c7Ci0gIGVuYy0+eXV2X2luXyA9ICh1aW50OF90KiltZW07Ci0gIG1lbSArPSBZVVZfU0laRTsKLSAgZW5jLT55dXZfb3V0XyA9ICh1aW50OF90KiltZW07Ci0gIG1lbSArPSBZVVZfU0laRTsKLSAgZW5jLT55dXZfb3V0Ml8gPSAodWludDhfdCopbWVtOwotICBtZW0gKz0gWVVWX1NJWkU7Ci0gIGVuYy0+eXV2X3BfID0gKHVpbnQ4X3QqKW1lbTsKLSAgbWVtICs9IFBSRURfU0laRTsKLSAgZW5jLT5tYl9pbmZvXyA9IChWUDhNQkluZm8qKW1lbTsKLSAgbWVtICs9IGluZm9fc2l6ZTsKLSAgZW5jLT5wcmVkc18gPSAoKHVpbnQ4X3QqKW1lbSkgKyAxICsgZW5jLT5wcmVkc193XzsKLSAgbWVtICs9IHByZWRzX3cgKiBwcmVkc19oICogc2l6ZW9mKHVpbnQ4X3QpOwotICBlbmMtPm56XyA9IDEgKyAodWludDMyX3QqKW1lbTsKLSAgbWVtICs9IG56X3NpemU7Ci0gIGVuYy0+bGZfc3RhdHNfID0gbGZfc3RhdHNfc2l6ZSA/IChMRlN0YXRzKilET19BTElHTihtZW0pIDogTlVMTDsKLSAgbWVtICs9IGxmX3N0YXRzX3NpemU7Ci0KLSAgLy8gdG9wIHNhbXBsZXMgKGFsbCAxNi1hbGlnbmVkKQotICBtZW0gPSAodWludDhfdCopRE9fQUxJR04obWVtKTsKLSAgZW5jLT55X3RvcF8gPSAodWludDhfdCopbWVtOwotICBlbmMtPnV2X3RvcF8gPSBlbmMtPnlfdG9wXyArIHRvcF9zdHJpZGU7Ci0gIG1lbSArPSAyICogdG9wX3N0cmlkZTsKLSAgbWVtID0gKHVpbnQ4X3QqKURPX0FMSUdOKG1lbSArIDEpOwotICBlbmMtPnlfbGVmdF8gPSAodWludDhfdCopbWVtOwotICBtZW0gKz0gMTYgKyAxNjsKLSAgZW5jLT51X2xlZnRfID0gKHVpbnQ4X3QqKW1lbTsKLSAgbWVtICs9IDE2OwotICBlbmMtPnZfbGVmdF8gPSAodWludDhfdCopbWVtOwotICBtZW0gKz0gODsKLQotICBlbmMtPmNvbmZpZ18gPSBjb25maWc7Ci0gIGVuYy0+cHJvZmlsZV8gPSB1c2VfZmlsdGVyID8gKChjb25maWctPmZpbHRlcl90eXBlID09IDEpID8gMCA6IDEpIDogMjsKLSAgZW5jLT5waWNfID0gcGljdHVyZTsKLSAgZW5jLT5wZXJjZW50XyA9IDA7Ci0KLSAgTWFwQ29uZmlnVG9Ub29scyhlbmMpOwotICBWUDhFbmNEc3BJbml0KCk7Ci0gIFZQOERlZmF1bHRQcm9iYXMoZW5jKTsKLSAgUmVzZXRTZWdtZW50SGVhZGVyKGVuYyk7Ci0gIFJlc2V0RmlsdGVySGVhZGVyKGVuYyk7Ci0gIFJlc2V0Qm91bmRhcnlQcmVkaWN0aW9ucyhlbmMpOwotCi0gIFZQOEVuY0luaXRBbHBoYShlbmMpOwotI2lmZGVmIFdFQlBfRVhQRVJJTUVOVEFMX0ZFQVRVUkVTCi0gIFZQOEVuY0luaXRMYXllcihlbmMpOwotI2VuZGlmCi0KLSAgVlA4VEJ1ZmZlckluaXQoJmVuYy0+dG9rZW5zXyk7Ci0gIHJldHVybiBlbmM7Ci19Ci0KLXN0YXRpYyBpbnQgRGVsZXRlVlA4RW5jb2RlcihWUDhFbmNvZGVyKiBlbmMpIHsKLSAgaW50IG9rID0gMTsKLSAgaWYgKGVuYyAhPSBOVUxMKSB7Ci0gICAgb2sgPSBWUDhFbmNEZWxldGVBbHBoYShlbmMpOwotI2lmZGVmIFdFQlBfRVhQRVJJTUVOVEFMX0ZFQVRVUkVTCi0gICAgVlA4RW5jRGVsZXRlTGF5ZXIoZW5jKTsKLSNlbmRpZgotICAgIFZQOFRCdWZmZXJDbGVhcigmZW5jLT50b2tlbnNfKTsKLSAgICBTYk1lbW9yeURlYWxsb2NhdGUoZW5jKTsKLSAgfQotICByZXR1cm4gb2s7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBkb3VibGUgR2V0UFNOUih1aW50NjRfdCBlcnIsIHVpbnQ2NF90IHNpemUpIHsKLSAgcmV0dXJuIGVyciA/IDEwLiAqIGxvZzEwKDI1NS4gKiAyNTUuICogc2l6ZSAvIGVycikgOiA5OS47Ci19Ci0KLXN0YXRpYyB2b2lkIEZpbmFsaXplUFNOUihjb25zdCBWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKLSAgV2ViUEF1eFN0YXRzKiBzdGF0cyA9IGVuYy0+cGljXy0+c3RhdHM7Ci0gIGNvbnN0IHVpbnQ2NF90IHNpemUgPSBlbmMtPnNzZV9jb3VudF87Ci0gIGNvbnN0IHVpbnQ2NF90KiBjb25zdCBzc2UgPSBlbmMtPnNzZV87Ci0gIHN0YXRzLT5QU05SWzBdID0gKGZsb2F0KUdldFBTTlIoc3NlWzBdLCBzaXplKTsKLSAgc3RhdHMtPlBTTlJbMV0gPSAoZmxvYXQpR2V0UFNOUihzc2VbMV0sIHNpemUgLyA0KTsKLSAgc3RhdHMtPlBTTlJbMl0gPSAoZmxvYXQpR2V0UFNOUihzc2VbMl0sIHNpemUgLyA0KTsKLSAgc3RhdHMtPlBTTlJbM10gPSAoZmxvYXQpR2V0UFNOUihzc2VbMF0gKyBzc2VbMV0gKyBzc2VbMl0sIHNpemUgKiAzIC8gMik7Ci0gIHN0YXRzLT5QU05SWzRdID0gKGZsb2F0KUdldFBTTlIoc3NlWzNdLCBzaXplKTsKLX0KLQotc3RhdGljIHZvaWQgU3RvcmVTdGF0cyhWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKLSAgV2ViUEF1eFN0YXRzKiBjb25zdCBzdGF0cyA9IGVuYy0+cGljXy0+c3RhdHM7Ci0gIGlmIChzdGF0cyAhPSBOVUxMKSB7Ci0gICAgaW50IGksIHM7Ci0gICAgZm9yIChpID0gMDsgaSA8IE5VTV9NQl9TRUdNRU5UUzsgKytpKSB7Ci0gICAgICBzdGF0cy0+c2VnbWVudF9sZXZlbFtpXSA9IGVuYy0+ZHFtX1tpXS5mc3RyZW5ndGhfOwotICAgICAgc3RhdHMtPnNlZ21lbnRfcXVhbnRbaV0gPSBlbmMtPmRxbV9baV0ucXVhbnRfOwotICAgICAgZm9yIChzID0gMDsgcyA8PSAyOyArK3MpIHsKLSAgICAgICAgc3RhdHMtPnJlc2lkdWFsX2J5dGVzW3NdW2ldID0gZW5jLT5yZXNpZHVhbF9ieXRlc19bc11baV07Ci0gICAgICB9Ci0gICAgfQotICAgIEZpbmFsaXplUFNOUihlbmMpOwotICAgIHN0YXRzLT5jb2RlZF9zaXplID0gZW5jLT5jb2RlZF9zaXplXzsKLSAgICBmb3IgKGkgPSAwOyBpIDwgMzsgKytpKSB7Ci0gICAgICBzdGF0cy0+YmxvY2tfY291bnRbaV0gPSBlbmMtPmJsb2NrX2NvdW50X1tpXTsKLSAgICB9Ci0gIH0KLSAgV2ViUFJlcG9ydFByb2dyZXNzKGVuYy0+cGljXywgMTAwLCAmZW5jLT5wZXJjZW50Xyk7ICAvLyBkb25lIQotfQotCi1pbnQgV2ViUEVuY29kaW5nU2V0RXJyb3IoY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQRW5jb2RpbmdFcnJvciBlcnJvcikgewotICBTQl9EQ0hFQ0soKGludCllcnJvciA8IFZQOF9FTkNfRVJST1JfTEFTVCk7Ci0gIFNCX0RDSEVDSygoaW50KWVycm9yID49IFZQOF9FTkNfT0spOwotICAoKFdlYlBQaWN0dXJlKilwaWMpLT5lcnJvcl9jb2RlID0gZXJyb3I7Ci0gIHJldHVybiAwOwotfQotCi1pbnQgV2ViUFJlcG9ydFByb2dyZXNzKGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBwZXJjZW50LCBpbnQqIGNvbnN0IHBlcmNlbnRfc3RvcmUpIHsKLSAgaWYgKHBlcmNlbnRfc3RvcmUgIT0gTlVMTCAmJiBwZXJjZW50ICE9ICpwZXJjZW50X3N0b3JlKSB7Ci0gICAgKnBlcmNlbnRfc3RvcmUgPSBwZXJjZW50OwotICAgIGlmIChwaWMtPnByb2dyZXNzX2hvb2sgJiYgIXBpYy0+cHJvZ3Jlc3NfaG9vayhwZXJjZW50LCBwaWMpKSB7Ci0gICAgICAvLyB1c2VyIGFib3J0IHJlcXVlc3RlZAotICAgICAgV2ViUEVuY29kaW5nU2V0RXJyb3IocGljLCBWUDhfRU5DX0VSUk9SX1VTRVJfQUJPUlQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICB9Ci0gIHJldHVybiAxOyAgLy8gb2sKLX0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWludCBXZWJQRW5jb2RlKGNvbnN0IFdlYlBDb25maWcqIGNvbmZpZywgV2ViUFBpY3R1cmUqIHBpYykgewotICBpbnQgb2sgPSAwOwotCi0gIGlmIChwaWMgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLSAgV2ViUEVuY29kaW5nU2V0RXJyb3IocGljLCBWUDhfRU5DX09LKTsgIC8vIGFsbCBvayBzbyBmYXIKLSAgaWYgKGNvbmZpZyA9PSBOVUxMKSAgLy8gYmFkIHBhcmFtcwotICAgIHJldHVybiBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWMsIFZQOF9FTkNfRVJST1JfTlVMTF9QQVJBTUVURVIpOwotICBpZiAoIVdlYlBWYWxpZGF0ZUNvbmZpZyhjb25maWcpKQotICAgIHJldHVybiBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWMsIFZQOF9FTkNfRVJST1JfSU5WQUxJRF9DT05GSUdVUkFUSU9OKTsKLSAgaWYgKHBpYy0+d2lkdGggPD0gMCB8fCBwaWMtPmhlaWdodCA8PSAwKQotICAgIHJldHVybiBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWMsIFZQOF9FTkNfRVJST1JfQkFEX0RJTUVOU0lPTik7Ci0gIGlmIChwaWMtPndpZHRoID4gV0VCUF9NQVhfRElNRU5TSU9OIHx8IHBpYy0+aGVpZ2h0ID4gV0VCUF9NQVhfRElNRU5TSU9OKQotICAgIHJldHVybiBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWMsIFZQOF9FTkNfRVJST1JfQkFEX0RJTUVOU0lPTik7Ci0KLSAgaWYgKHBpYy0+c3RhdHMgIT0gTlVMTCkgU2JNZW1vcnlTZXQocGljLT5zdGF0cywgMCwgc2l6ZW9mKCpwaWMtPnN0YXRzKSk7Ci0KLSAgaWYgKCFjb25maWctPmxvc3NsZXNzKSB7Ci0gICAgVlA4RW5jb2RlciogZW5jID0gTlVMTDsKLSAgICBpZiAocGljLT55ID09IE5VTEwgfHwgcGljLT51ID09IE5VTEwgfHwgcGljLT52ID09IE5VTEwpIHsKLSAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBoYXZlIFlVVkEgc2FtcGxlcy4KLSAgICAgIGlmICghV2ViUFBpY3R1cmVBUkdCVG9ZVVZBKHBpYywgV0VCUF9ZVVY0MjApKSByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBlbmMgPSBJbml0VlA4RW5jb2Rlcihjb25maWcsIHBpYyk7Ci0gICAgaWYgKGVuYyA9PSBOVUxMKSByZXR1cm4gMDsgIC8vIHBpYy0+ZXJyb3IgaXMgYWxyZWFkeSBzZXQuCi0gICAgLy8gTm90ZTogZWFjaCBvZiB0aGUgdGFza3MgYmVsb3cgYWNjb3VudCBmb3IgMjAlIGluIHRoZSBwcm9ncmVzcyByZXBvcnQuCi0gICAgb2sgPSBWUDhFbmNBbmFseXplKGVuYyk7Ci0KLSAgICAvLyBBbmFseXNpcyBpcyBkb25lLCBwcm9jZWVkIHRvIGFjdHVhbCBjb2RpbmcuCi0gICAgb2sgPSBvayAmJiBWUDhFbmNTdGFydEFscGhhKGVuYyk7ICAgLy8gcG9zc2libHkgZG9uZSBpbiBwYXJhbGxlbAotICAgIGlmICghZW5jLT51c2VfdG9rZW5zXykgewotICAgICAgb2sgPSBvayAmJiBWUDhFbmNMb29wKGVuYyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG9rID0gb2sgJiYgVlA4RW5jVG9rZW5Mb29wKGVuYyk7Ci0gICAgfQotICAgIG9rID0gb2sgJiYgVlA4RW5jRmluaXNoQWxwaGEoZW5jKTsKLSNpZmRlZiBXRUJQX0VYUEVSSU1FTlRBTF9GRUFUVVJFUwotICAgIG9rID0gb2sgJiYgVlA4RW5jRmluaXNoTGF5ZXIoZW5jKTsKLSNlbmRpZgotCi0gICAgb2sgPSBvayAmJiBWUDhFbmNXcml0ZShlbmMpOwotICAgIFN0b3JlU3RhdHMoZW5jKTsKLSAgICBpZiAoIW9rKSB7Ci0gICAgICBWUDhFbmNGcmVlQml0V3JpdGVycyhlbmMpOwotICAgIH0KLSAgICBvayAmPSBEZWxldGVWUDhFbmNvZGVyKGVuYyk7ICAvLyBtdXN0IGFsd2F5cyBiZSBjYWxsZWQsIGV2ZW4gaWYgIW9rCi0gIH0gZWxzZSB7Ci0gICAgLy8gTWFrZSBzdXJlIHdlIGhhdmUgQVJHQiBzYW1wbGVzLgotICAgIGlmIChwaWMtPmFyZ2IgPT0gTlVMTCAmJiAhV2ViUFBpY3R1cmVZVVZBVG9BUkdCKHBpYykpIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIG9rID0gVlA4TEVuY29kZUltYWdlKGNvbmZpZywgcGljKTsgIC8vIFNldHMgcGljLT5lcnJvciBpbiBjYXNlIG9mIHByb2JsZW0uCi0gIH0KLQotICByZXR1cm4gb2s7Ci19Ci0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvQW5kcm9pZC5tayBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg2YjhiOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL0FuZHJvaWQubWsKQEAgLTAsMCArMSw5OCBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBsaWJleGFtcGxlX3V0aWwKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgZXhhbXBsZV91dGlsLmMgXAorCitMT0NBTF9DRkxBR1MgOj0gJChXRUJQX0NGTEFHUykKK0xPQ0FMX0NfSU5DTFVERVMgOj0gJChMT0NBTF9QQVRIKS8uLi9zcmMKKworTE9DQUxfTU9EVUxFIDo9IGV4YW1wbGVfdXRpbAorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGN3ZWJwCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCisjIE5vdGU6IHRvIGVuYWJsZSBqcGVnL3BuZyBlbmNvZGluZyB0aGUgc291cmNlcyBmcm9tIEFPU1AgY2FuIGJlIHVzZWQgd2l0aAorIyBtaW5vciBtb2RpZmljYXRpb24gdG8gdGhlaXIgQW5kcm9pZC5tayBmaWxlcy4KK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgY3dlYnAuYyBcCisKK0xPQ0FMX0NGTEFHUyA6PSAkKFdFQlBfQ0ZMQUdTKQorTE9DQUxfQ19JTkNMVURFUyA6PSAkKExPQ0FMX1BBVEgpLy4uL3NyYworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBleGFtcGxlX3V0aWwgaW1hZ2Vpb191dGlsIGltYWdlZGVjIHdlYnBkZW11eCB3ZWJwCisKK0xPQ0FMX01PRFVMRSA6PSBjd2VicAorCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgZHdlYnAKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgZHdlYnAuYyBcCisKK0xPQ0FMX0NGTEFHUyA6PSAkKFdFQlBfQ0ZMQUdTKQorTE9DQUxfQ19JTkNMVURFUyA6PSAkKExPQ0FMX1BBVEgpLy4uL3NyYworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBleGFtcGxlX3V0aWwgaW1hZ2VkZWMgaW1hZ2VlbmMgd2VicGRlbXV4IHdlYnAKK0xPQ0FMX01PRFVMRSA6PSBkd2VicAorCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgd2VicG11eAorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICB3ZWJwbXV4LmMgXAorCitMT0NBTF9DRkxBR1MgOj0gJChXRUJQX0NGTEFHUykKK0xPQ0FMX0NfSU5DTFVERVMgOj0gJChMT0NBTF9QQVRIKS8uLi9zcmMKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gZXhhbXBsZV91dGlsIGltYWdlaW9fdXRpbCB3ZWJwbXV4IHdlYnAKKworTE9DQUxfTU9EVUxFIDo9IHdlYnBtdXhfZXhhbXBsZQorCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgaW1nMndlYnAKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgaW1nMndlYnAuYyBcCisKK0xPQ0FMX0NGTEFHUyA6PSAkKFdFQlBfQ0ZMQUdTKQorTE9DQUxfQ19JTkNMVURFUyA6PSAkKExPQ0FMX1BBVEgpLy4uL3NyYworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBleGFtcGxlX3V0aWwgaW1hZ2Vpb191dGlsIGltYWdlZGVjIHdlYnBtdXggd2VicGRlbXV4IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd2VicAorCitMT0NBTF9NT0RVTEUgOj0gaW1nMndlYnBfZXhhbXBsZQorCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgd2VicGluZm8KKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgd2VicGluZm8uYyBcCisKK0xPQ0FMX0NGTEFHUyA6PSAkKFdFQlBfQ0ZMQUdTKQorTE9DQUxfQ19JTkNMVURFUyA6PSAkKExPQ0FMX1BBVEgpLy4uL3NyYworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBleGFtcGxlX3V0aWwgaW1hZ2Vpb191dGlsIHdlYnAKKworTE9DQUxfTU9EVUxFIDo9IHdlYnBpbmZvX2V4YW1wbGUKKworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy9NYWtlZmlsZS5hbSBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMDg3MmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDExOSBAQAorQU1fQ1BQRkxBR1MgKz0gLUkkKHRvcF9idWlsZGRpcikvc3JjIC1JJCh0b3Bfc3JjZGlyKS9zcmMKKworYmluX1BST0dSQU1TID0KK2lmIFdBTlRfREVNVVgKKyAgYmluX1BST0dSQU1TICs9IGR3ZWJwIGN3ZWJwCitlbmRpZgoraWYgQlVJTERfQU5JTURJRkYKKyAgbm9pbnN0X1BST0dSQU1TID0gYW5pbV9kaWZmIGFuaW1fZHVtcAorZW5kaWYKK2lmIEJVSUxEX0dJRjJXRUJQCisgIGJpbl9QUk9HUkFNUyArPSBnaWYyd2VicAorZW5kaWYKK2lmIEJVSUxEX0lNRzJXRUJQCisgIGJpbl9QUk9HUkFNUyArPSBpbWcyd2VicAorZW5kaWYKK2lmIFdBTlRfTVVYCisgIGJpbl9QUk9HUkFNUyArPSB3ZWJwbXV4CitlbmRpZgoraWYgQlVJTERfVldFQlAKKyAgYmluX1BST0dSQU1TICs9IHZ3ZWJwCitlbmRpZgoraWYgQlVJTERfV0VCUElORk8KKyAgYmluX1BST0dSQU1TICs9IHdlYnBpbmZvCitlbmRpZgorCitub2luc3RfTFRMSUJSQVJJRVMgPSBsaWJleGFtcGxlX3V0aWwubGEKKworbGliZXhhbXBsZV91dGlsX2xhX1NPVVJDRVMgPSBleGFtcGxlX3V0aWwuYyBleGFtcGxlX3V0aWwuaAorbGliZXhhbXBsZV91dGlsX2xhX0xJQkFERCA9IC4uL3NyYy9saWJ3ZWJwLmxhCisKK2FuaW1fZGlmZl9TT1VSQ0VTID0gYW5pbV9kaWZmLmMgYW5pbV91dGlsLmMgYW5pbV91dGlsLmgKK2FuaW1fZGlmZl9DUFBGTEFHUyA9ICQoQU1fQ1BQRkxBR1MpICQoR0lGX0lOQ0xVREVTKQorYW5pbV9kaWZmX0xEQUREICA9CithbmltX2RpZmZfTERBREQgKz0gLi4vc3JjL2RlbXV4L2xpYndlYnBkZW11eC5sYQorYW5pbV9kaWZmX0xEQUREICs9IGxpYmV4YW1wbGVfdXRpbC5sYQorYW5pbV9kaWZmX0xEQUREICs9IC4uL2ltYWdlaW8vbGliaW1hZ2Vpb191dGlsLmxhCithbmltX2RpZmZfTERBREQgKz0gJChHSUZfTElCUykgLWxtCisKK2FuaW1fZHVtcF9TT1VSQ0VTID0gYW5pbV9kdW1wLmMgYW5pbV91dGlsLmMgYW5pbV91dGlsLmgKK2FuaW1fZHVtcF9DUFBGTEFHUyA9ICQoQU1fQ1BQRkxBR1MpICQoUE5HX0lOQ0xVREVTKQorYW5pbV9kdW1wX0NQUEZMQUdTICs9ICQoR0lGX0lOQ0xVREVTKQorYW5pbV9kdW1wX0xEQUREICA9CithbmltX2R1bXBfTERBREQgKz0gLi4vc3JjL2RlbXV4L2xpYndlYnBkZW11eC5sYQorYW5pbV9kdW1wX0xEQUREICs9IGxpYmV4YW1wbGVfdXRpbC5sYQorYW5pbV9kdW1wX0xEQUREICs9IC4uL2ltYWdlaW8vbGliaW1hZ2Vpb191dGlsLmxhCithbmltX2R1bXBfTERBREQgKz0gLi4vaW1hZ2Vpby9saWJpbWFnZWVuYy5sYQorYW5pbV9kdW1wX0xEQUREICs9ICQoUE5HX0xJQlMpICQoR0lGX0xJQlMpICQoVElGRl9MSUJTKSAtbG0KKworY3dlYnBfU09VUkNFUyAgPSBjd2VicC5jIHN0b3B3YXRjaC5oCitjd2VicF9DUFBGTEFHUyAgPSAkKEFNX0NQUEZMQUdTKQorY3dlYnBfTERBREQgID0KK2N3ZWJwX0xEQUREICs9IGxpYmV4YW1wbGVfdXRpbC5sYQorY3dlYnBfTERBREQgKz0gLi4vaW1hZ2Vpby9saWJpbWFnZWlvX3V0aWwubGEKK2N3ZWJwX0xEQUREICs9IC4uL2ltYWdlaW8vbGliaW1hZ2VkZWMubGEKK2N3ZWJwX0xEQUREICs9IC4uL3NyYy9saWJ3ZWJwLmxhCitjd2VicF9MREFERCArPSAkKEpQRUdfTElCUykgJChQTkdfTElCUykgJChUSUZGX0xJQlMpCisKK2R3ZWJwX1NPVVJDRVMgPSBkd2VicC5jIHN0b3B3YXRjaC5oCitkd2VicF9DUFBGTEFHUyAgPSAkKEFNX0NQUEZMQUdTKQorZHdlYnBfQ1BQRkxBR1MgKz0gJChKUEVHX0lOQ0xVREVTKSAkKFBOR19JTkNMVURFUykKK2R3ZWJwX0xEQUREICA9Citkd2VicF9MREFERCArPSBsaWJleGFtcGxlX3V0aWwubGEKK2R3ZWJwX0xEQUREICs9IC4uL2ltYWdlaW8vbGliaW1hZ2VkZWMubGEKK2R3ZWJwX0xEQUREICs9IC4uL2ltYWdlaW8vbGliaW1hZ2VlbmMubGEKK2R3ZWJwX0xEQUREICs9IC4uL2ltYWdlaW8vbGliaW1hZ2Vpb191dGlsLmxhCitkd2VicF9MREFERCArPSAuLi9zcmMvbGlid2VicC5sYQorZHdlYnBfTERBREQgKz0kKFBOR19MSUJTKSAkKEpQRUdfTElCUykKKworZ2lmMndlYnBfU09VUkNFUyA9IGdpZjJ3ZWJwLmMgZ2lmZGVjLmMgZ2lmZGVjLmgKK2dpZjJ3ZWJwX0NQUEZMQUdTID0gJChBTV9DUFBGTEFHUykgJChHSUZfSU5DTFVERVMpCitnaWYyd2VicF9MREFERCAgPQorZ2lmMndlYnBfTERBREQgKz0gbGliZXhhbXBsZV91dGlsLmxhCitnaWYyd2VicF9MREFERCArPSAuLi9pbWFnZWlvL2xpYmltYWdlaW9fdXRpbC5sYQorZ2lmMndlYnBfTERBREQgKz0gLi4vc3JjL211eC9saWJ3ZWJwbXV4LmxhCitnaWYyd2VicF9MREFERCArPSAuLi9zcmMvbGlid2VicC5sYQorZ2lmMndlYnBfTERBREQgKz0gJChHSUZfTElCUykKKwordndlYnBfU09VUkNFUyA9IHZ3ZWJwLmMKK3Z3ZWJwX0NQUEZMQUdTID0gJChBTV9DUFBGTEFHUykgJChHTF9JTkNMVURFUykKK3Z3ZWJwX0xEQUREICA9Cit2d2VicF9MREFERCArPSBsaWJleGFtcGxlX3V0aWwubGEKK3Z3ZWJwX0xEQUREICs9IC4uL2ltYWdlaW8vbGliaW1hZ2Vpb191dGlsLmxhCit2d2VicF9MREFERCArPSAuLi9zcmMvZGVtdXgvbGlid2VicGRlbXV4LmxhCit2d2VicF9MREFERCArPSAkKEdMX0xJQlMpCisKK3dlYnBtdXhfU09VUkNFUyA9IHdlYnBtdXguYword2VicG11eF9DUFBGTEFHUyA9ICQoQU1fQ1BQRkxBR1MpCit3ZWJwbXV4X0xEQUREICA9Cit3ZWJwbXV4X0xEQUREICs9IGxpYmV4YW1wbGVfdXRpbC5sYQord2VicG11eF9MREFERCArPSAuLi9pbWFnZWlvL2xpYmltYWdlaW9fdXRpbC5sYQord2VicG11eF9MREFERCArPSAuLi9zcmMvbXV4L2xpYndlYnBtdXgubGEKK3dlYnBtdXhfTERBREQgKz0gLi4vc3JjL2xpYndlYnAubGEKKworaW1nMndlYnBfU09VUkNFUyA9IGltZzJ3ZWJwLmMKK2ltZzJ3ZWJwX0NQUEZMQUdTID0gJChBTV9DUFBGTEFHUykKK2ltZzJ3ZWJwX0xEQUREICA9CitpbWcyd2VicF9MREFERCArPSBsaWJleGFtcGxlX3V0aWwubGEKK2ltZzJ3ZWJwX0xEQUREICs9IC4uL2ltYWdlaW8vbGliaW1hZ2Vpb191dGlsLmxhCitpbWcyd2VicF9MREFERCArPSAuLi9pbWFnZWlvL2xpYmltYWdlZGVjLmxhCitpbWcyd2VicF9MREFERCArPSAuLi9zcmMvbXV4L2xpYndlYnBtdXgubGEKK2ltZzJ3ZWJwX0xEQUREICs9IC4uL3NyYy9saWJ3ZWJwLmxhCitpbWcyd2VicF9MREFERCArPSAkKFBOR19MSUJTKSAkKEpQRUdfTElCUykgJChUSUZGX0xJQlMpCisKK3dlYnBpbmZvX1NPVVJDRVMgPSB3ZWJwaW5mby5jCit3ZWJwaW5mb19DUFBGTEFHUyA9ICQoQU1fQ1BQRkxBR1MpCit3ZWJwaW5mb19MREFERCAgPQord2VicGluZm9fTERBREQgKz0gbGliZXhhbXBsZV91dGlsLmxhCit3ZWJwaW5mb19MREFERCArPSAuLi9pbWFnZWlvL2xpYmltYWdlaW9fdXRpbC5sYQord2VicGluZm9fTERBREQgKz0gLi4vc3JjL2xpYndlYnAubGEKKworaWYgQlVJTERfTElCV0VCUERFQ09ERVIKKyAgYW5pbV9kaWZmX0xEQUREICs9IC4uL3NyYy9saWJ3ZWJwZGVjb2Rlci5sYQorICBhbmltX2R1bXBfTERBREQgKz0gLi4vc3JjL2xpYndlYnBkZWNvZGVyLmxhCisgIHZ3ZWJwX0xEQUREICs9IC4uL3NyYy9saWJ3ZWJwZGVjb2Rlci5sYQorZWxzZQorICBhbmltX2RpZmZfTERBREQgKz0gLi4vc3JjL2xpYndlYnAubGEKKyAgYW5pbV9kdW1wX0xEQUREICs9IC4uL3NyYy9saWJ3ZWJwLmxhCisgIHZ3ZWJwX0xEQUREICs9IC4uL3NyYy9saWJ3ZWJwLmxhCitlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvYW5pbV9kaWZmLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy9hbmltX2RpZmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzRhOTE1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvYW5pbV9kaWZmLmMKQEAgLTAsMCArMSwzMTQgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBDaGVja3MgaWYgZ2l2ZW4gcGFpciBvZiBhbmltYXRlZCBHSUYvV2ViUCBpbWFnZXMgYXJlIGlkZW50aWNhbDoKKy8vIFRoYXQgaXM6IHRoZWlyIHJlY29uc3RydWN0ZWQgY2FudmFzZXMgbWF0Y2ggcGl4ZWwtYnktcGl4ZWwgYW5kIHRoZWlyIG90aGVyCisvLyBhbmltYXRpb24gcHJvcGVydGllcyAobG9vcCBjb3VudCBldGMpIGFsc28gbWF0Y2guCisvLworLy8gZXhhbXBsZTogYW5pbV9kaWZmIGZvby5naWYgYmFyLndlYnAKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+ICAvLyBmb3IgJ3N0cnRvZCcuCisjaW5jbHVkZSA8c3RyaW5nLmg+ICAvLyBmb3IgJ3N0cmNtcCcuCisKKyNpbmNsdWRlICIuL2FuaW1fdXRpbC5oIgorCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVIgPCAxOTAwCisjZGVmaW5lIHNucHJpbnRmIF9zbnByaW50ZgorI2VuZGlmCisKKy8vIFJldHVybnMgdHJ1ZSBpZiAnYSArIGInIHdpbGwgb3ZlcmZsb3cuCitzdGF0aWMgaW50IEFkZGl0aW9uV2lsbE92ZXJmbG93KGludCBhLCBpbnQgYikgeworICByZXR1cm4gKGIgPiAwKSAmJiAoYSA+IElOVF9NQVggLSBiKTsKK30KKworc3RhdGljIGludCBGcmFtZXNBcmVFcXVhbChjb25zdCB1aW50OF90KiBjb25zdCByZ2JhMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgcmdiYTIsIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICBjb25zdCBpbnQgc3RyaWRlID0gd2lkdGggKiA0OyAgLy8gQWx3YXlzIHRydWUgZm9yICdEZWNvZGVkRnJhbWUucmdiYScuCisgIHJldHVybiAhbWVtY21wKHJnYmExLCByZ2JhMiwgc3RyaWRlICogaGVpZ2h0KTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBQaXhlbHNBcmVTaW1pbGFyKHVpbnQzMl90IHNyYywgdWludDMyX3QgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhfYWxsb3dlZF9kaWZmKSB7CisgIGNvbnN0IGludCBzcmNfYSA9IChzcmMgPj4gMjQpICYgMHhmZjsKKyAgY29uc3QgaW50IHNyY19yID0gKHNyYyA+PiAxNikgJiAweGZmOworICBjb25zdCBpbnQgc3JjX2cgPSAoc3JjID4+IDgpICYgMHhmZjsKKyAgY29uc3QgaW50IHNyY19iID0gKHNyYyA+PiAwKSAmIDB4ZmY7CisgIGNvbnN0IGludCBkc3RfYSA9IChkc3QgPj4gMjQpICYgMHhmZjsKKyAgY29uc3QgaW50IGRzdF9yID0gKGRzdCA+PiAxNikgJiAweGZmOworICBjb25zdCBpbnQgZHN0X2cgPSAoZHN0ID4+IDgpICYgMHhmZjsKKyAgY29uc3QgaW50IGRzdF9iID0gKGRzdCA+PiAwKSAmIDB4ZmY7CisKKyAgcmV0dXJuIChhYnMoc3JjX3IgKiBzcmNfYSAtIGRzdF9yICogZHN0X2EpIDw9IChtYXhfYWxsb3dlZF9kaWZmICogMjU1KSkgJiYKKyAgICAgICAgIChhYnMoc3JjX2cgKiBzcmNfYSAtIGRzdF9nICogZHN0X2EpIDw9IChtYXhfYWxsb3dlZF9kaWZmICogMjU1KSkgJiYKKyAgICAgICAgIChhYnMoc3JjX2IgKiBzcmNfYSAtIGRzdF9iICogZHN0X2EpIDw9IChtYXhfYWxsb3dlZF9kaWZmICogMjU1KSkgJiYKKyAgICAgICAgIChhYnMoc3JjX2EgLSBkc3RfYSkgPD0gbWF4X2FsbG93ZWRfZGlmZik7Cit9CisKK3N0YXRpYyBpbnQgRnJhbWVzQXJlU2ltaWxhcihjb25zdCB1aW50OF90KiBjb25zdCByZ2JhMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCByZ2JhMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBtYXhfYWxsb3dlZF9kaWZmKSB7CisgIGludCBpLCBqOworICBhc3NlcnQobWF4X2FsbG93ZWRfZGlmZiA+IDApOworICBmb3IgKGogPSAwOyBqIDwgaGVpZ2h0OyArK2opIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7ICsraSkgeworICAgICAgY29uc3QgaW50IHN0cmlkZSA9IHdpZHRoICogNDsKKyAgICAgIGNvbnN0IHNpemVfdCBvZmZzZXQgPSBqICogc3RyaWRlICsgaTsKKyAgICAgIGlmICghUGl4ZWxzQXJlU2ltaWxhcihyZ2JhMVtvZmZzZXRdLCByZ2JhMltvZmZzZXRdLCBtYXhfYWxsb3dlZF9kaWZmKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8vIE1pbmltaXplIG51bWJlciBvZiBmcmFtZXMgYnkgY29tYmluaW5nIHN1Y2Nlc3NpdmUgZnJhbWVzIHRoYXQgaGF2ZSBhdCBtYXgKKy8vICdtYXhfZGlmZicgZGlmZmVyZW5jZSBwZXIgY2hhbm5lbCBiZXR3ZWVuIGNvcnJlc3BvbmRpbmcgcGl4ZWxzLgorc3RhdGljIHZvaWQgTWluaW1pemVBbmltYXRpb25GcmFtZXMoQW5pbWF0ZWRJbWFnZSogY29uc3QgaW1nLCBpbnQgbWF4X2RpZmYpIHsKKyAgdWludDMyX3QgaTsKKyAgZm9yIChpID0gMTsgaSA8IGltZy0+bnVtX2ZyYW1lczsgKytpKSB7CisgICAgRGVjb2RlZEZyYW1lKiBjb25zdCBmcmFtZTEgPSAmaW1nLT5mcmFtZXNbaSAtIDFdOworICAgIERlY29kZWRGcmFtZSogY29uc3QgZnJhbWUyID0gJmltZy0+ZnJhbWVzW2ldOworICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHJnYmExID0gZnJhbWUxLT5yZ2JhOworICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHJnYmEyID0gZnJhbWUyLT5yZ2JhOworICAgIGludCBzaG91bGRfbWVyZ2VfZnJhbWVzID0gMDsKKyAgICAvLyBJZiBtZXJnaW5nIGZyYW1lcyB3aWxsIHJlc3VsdCBpbiBpbnRlZ2VyIG92ZXJmbG93IGZvciAnZHVyYXRpb24nLAorICAgIC8vIHNraXAgbWVyZ2luZy4KKyAgICBpZiAoQWRkaXRpb25XaWxsT3ZlcmZsb3coZnJhbWUxLT5kdXJhdGlvbiwgZnJhbWUyLT5kdXJhdGlvbikpIGNvbnRpbnVlOworICAgIGlmIChtYXhfZGlmZiA+IDApIHsKKyAgICAgIHNob3VsZF9tZXJnZV9mcmFtZXMgPSBGcmFtZXNBcmVTaW1pbGFyKHJnYmExLCByZ2JhMiwgaW1nLT5jYW52YXNfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWctPmNhbnZhc19oZWlnaHQsIG1heF9kaWZmKTsKKyAgICB9IGVsc2UgeworICAgICAgc2hvdWxkX21lcmdlX2ZyYW1lcyA9CisgICAgICAgICAgRnJhbWVzQXJlRXF1YWwocmdiYTEsIHJnYmEyLCBpbWctPmNhbnZhc193aWR0aCwgaW1nLT5jYW52YXNfaGVpZ2h0KTsKKyAgICB9CisgICAgaWYgKHNob3VsZF9tZXJnZV9mcmFtZXMpIHsgIC8vIE1lcmdlICdpKzEndGggZnJhbWUgaW50byAnaSd0aCBmcmFtZS4KKyAgICAgIGZyYW1lMS0+ZHVyYXRpb24gKz0gZnJhbWUyLT5kdXJhdGlvbjsKKyAgICAgIGlmIChpICsgMSA8IGltZy0+bnVtX2ZyYW1lcykgeworICAgICAgICBtZW1tb3ZlKCZpbWctPmZyYW1lc1tpXSwgJmltZy0+ZnJhbWVzW2kgKyAxXSwKKyAgICAgICAgICAgICAgICAoaW1nLT5udW1fZnJhbWVzIC0gaSAtIDEpICogc2l6ZW9mKCppbWctPmZyYW1lcykpOworICAgICAgfQorICAgICAgLS1pbWctPm51bV9mcmFtZXM7CisgICAgICAtLWk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyBpbnQgQ29tcGFyZVZhbHVlcyh1aW50MzJfdCBhLCB1aW50MzJfdCBiLCBjb25zdCBjaGFyKiBvdXRwdXRfc3RyKSB7CisgIGlmIChhICE9IGIpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiAlZCB2cyAlZFxuIiwgb3V0cHV0X3N0ciwgYSwgYik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgQ29tcGFyZUJhY2tncm91bmRDb2xvcih1aW50MzJfdCBiZzEsIHVpbnQzMl90IGJnMiwgaW50IHByZW11bHRpcGx5KSB7CisgIGlmIChwcmVtdWx0aXBseSkgeworICAgIGNvbnN0IGludCBhbHBoYTEgPSAoYmcxID4+IDI0KSAmIDB4ZmY7CisgICAgY29uc3QgaW50IGFscGhhMiA9IChiZzIgPj4gMjQpICYgMHhmZjsKKyAgICBpZiAoYWxwaGExID09IDAgJiYgYWxwaGEyID09IDApIHJldHVybiAxOworICB9CisgIGlmIChiZzEgIT0gYmcyKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJCYWNrZ3JvdW5kIGNvbG9yIG1pc21hdGNoOiAweCUwOHggdnMgMHglMDh4XG4iLAorICAgICAgICAgICAgYmcxLCBiZzIpOworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiAxOworfQorCisvLyBOb3RlOiBBcyBsb25nIGFzIGZyYW1lIGR1cmF0aW9ucyBhbmQgcmVjb25zdHJ1Y3RlZCBmcmFtZXMgYXJlIGlkZW50aWNhbCwgaXQKKy8vIGlzIE9LIGZvciBvdGhlciBhc3BlY3RzIGxpa2Ugb2Zmc2V0cywgZGlzcG9zZS9ibGVuZCBtZXRob2QgdG8gdmFyeS4KK3N0YXRpYyBpbnQgQ29tcGFyZUFuaW1hdGVkSW1hZ2VQYWlyKGNvbnN0IEFuaW1hdGVkSW1hZ2UqIGNvbnN0IGltZzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbmltYXRlZEltYWdlKiBjb25zdCBpbWcyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZW11bHRpcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG1pbl9wc25yKSB7CisgIGludCBvayA9IDE7CisgIGNvbnN0IGludCBpc19tdWx0aV9mcmFtZV9pbWFnZSA9IChpbWcxLT5udW1fZnJhbWVzID4gMSk7CisgIHVpbnQzMl90IGk7CisKKyAgb2sgPSBDb21wYXJlVmFsdWVzKGltZzEtPmNhbnZhc193aWR0aCwgaW1nMi0+Y2FudmFzX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgIkNhbnZhcyB3aWR0aCBtaXNtYXRjaCIpICYmIG9rOworICBvayA9IENvbXBhcmVWYWx1ZXMoaW1nMS0+Y2FudmFzX2hlaWdodCwgaW1nMi0+Y2FudmFzX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICJDYW52YXMgaGVpZ2h0IG1pc21hdGNoIikgJiYgb2s7CisgIG9rID0gQ29tcGFyZVZhbHVlcyhpbWcxLT5udW1fZnJhbWVzLCBpbWcyLT5udW1fZnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgIkZyYW1lIGNvdW50IG1pc21hdGNoIikgJiYgb2s7CisgIGlmICghb2spIHJldHVybiAwOyAgLy8gVGhlc2UgYXJlIGZhdGFsIGZhaWx1cmVzLCBjYW4ndCBwcm9jZWVkLgorCisgIGlmIChpc19tdWx0aV9mcmFtZV9pbWFnZSkgeyAgLy8gQ2hlY2tzIHJlbGV2YW50IGZvciBtdWx0aS1mcmFtZSBpbWFnZXMgb25seS4KKyAgICBvayA9IENvbXBhcmVWYWx1ZXMoaW1nMS0+bG9vcF9jb3VudCwgaW1nMi0+bG9vcF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIkxvb3AgY291bnQgbWlzbWF0Y2giKSAmJiBvazsKKyAgICBvayA9IENvbXBhcmVCYWNrZ3JvdW5kQ29sb3IoaW1nMS0+Ymdjb2xvciwgaW1nMi0+Ymdjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlbXVsdGlwbHkpICYmIG9rOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IGltZzEtPm51bV9mcmFtZXM7ICsraSkgeworICAgIC8vIFBpeGVsLWJ5LXBpeGVsIGNvbXBhcmlzb24uCisgICAgY29uc3QgdWludDhfdCogY29uc3QgcmdiYTEgPSBpbWcxLT5mcmFtZXNbaV0ucmdiYTsKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCByZ2JhMiA9IGltZzItPmZyYW1lc1tpXS5yZ2JhOworICAgIGludCBtYXhfZGlmZjsKKyAgICBkb3VibGUgcHNucjsKKyAgICBpZiAoaXNfbXVsdGlfZnJhbWVfaW1hZ2UpIHsgIC8vIENoZWNrIHJlbGV2YW50IGZvciBtdWx0aS1mcmFtZSBpbWFnZXMgb25seS4KKyAgICAgIGNvbnN0IGNoYXIgZm9ybWF0W10gPSAiRnJhbWUgIyVkLCBkdXJhdGlvbiBtaXNtYXRjaCI7CisgICAgICBjaGFyIHRtcFtzaXplb2YoZm9ybWF0KSArIDhdOworICAgICAgb2sgPSBvayAmJiAoc25wcmludGYodG1wLCBzaXplb2YodG1wKSwgZm9ybWF0LCBpKSA+PSAwKTsKKyAgICAgIG9rID0gb2sgJiYgQ29tcGFyZVZhbHVlcyhpbWcxLT5mcmFtZXNbaV0uZHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nMi0+ZnJhbWVzW2ldLmR1cmF0aW9uLCB0bXApOworICAgIH0KKyAgICBHZXREaWZmQW5kUFNOUihyZ2JhMSwgcmdiYTIsIGltZzEtPmNhbnZhc193aWR0aCwgaW1nMS0+Y2FudmFzX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICBwcmVtdWx0aXBseSwgJm1heF9kaWZmLCAmcHNucik7CisgICAgaWYgKG1pbl9wc25yID4gMC4pIHsKKyAgICAgIGlmIChwc25yIDwgbWluX3BzbnIpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJGcmFtZSAjJWQsIHBzbnIgPSAlLjJsZiAobWluX3BzbnIgPSAlZilcbiIsIGksCisgICAgICAgICAgICAgICAgcHNuciwgbWluX3BzbnIpOworICAgICAgICBvayA9IDA7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChtYXhfZGlmZiAhPSAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRnJhbWUgIyVkLCBtYXggcGl4ZWwgZGlmZjogJWRcbiIsIGksIG1heF9kaWZmKTsKKyAgICAgICAgb2sgPSAwOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gb2s7Cit9CisKK3N0YXRpYyB2b2lkIEhlbHAodm9pZCkgeworICBwcmludGYoIlVzYWdlOiBhbmltX2RpZmYgPGltYWdlMT4gPGltYWdlMj4gW29wdGlvbnNdXG4iKTsKKyAgcHJpbnRmKCJcbk9wdGlvbnM6XG4iKTsKKyAgcHJpbnRmKCIgIC1kdW1wX2ZyYW1lcyA8Zm9sZGVyPiBkdW1wIGRlY29kZWQgZnJhbWVzIGluIFBBTSBmb3JtYXRcbiIpOworICBwcmludGYoIiAgLW1pbl9wc25yIDxmbG9hdD4gLi4uIG1pbmltdW0gcGVyLWZyYW1lIFBTTlJcbiIpOworICBwcmludGYoIiAgLXJhd19jb21wYXJpc29uIC4uLi4uIGlmIHRoaXMgZmxhZyBpcyBub3QgdXNlZCwgUkdCIGlzXG4iKTsKKyAgcHJpbnRmKCIgICAgICAgICAgICAgICAgICAgICAgICBwcmVtdWx0aXBsaWVkIGJlZm9yZSBjb21wYXJpc29uXG4iKTsKKyAgcHJpbnRmKCIgIC1tYXhfZGlmZiA8aW50PiAuLi4uLiBtYXhpbXVtIGFsbG93ZWQgZGlmZmVyZW5jZSBwZXIgY2hhbm5lbFxuIgorICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgIGJldHdlZW4gY29ycmVzcG9uZGluZyBwaXhlbHMgaW4gc3Vic2VxdWVudFxuIgorICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc1xuIik7CisgIHByaW50ZigiICAtaCAuLi4uLi4uLi4uLi4uLi4uLi4gdGhpcyBoZWxwXG4iKTsKKyAgcHJpbnRmKCIgIC12ZXJzaW9uIC4uLi4uLi4uLi4uLiBwcmludCB2ZXJzaW9uIG51bWJlciBhbmQgZXhpdFxuIik7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyKiBhcmd2W10pIHsKKyAgaW50IHJldHVybl9jb2RlID0gLTE7CisgIGludCBkdW1wX2ZyYW1lcyA9IDA7CisgIGNvbnN0IGNoYXIqIGR1bXBfZm9sZGVyID0gTlVMTDsKKyAgZG91YmxlIG1pbl9wc25yID0gMC47CisgIGludCBnb3RfaW5wdXQxID0gMDsKKyAgaW50IGdvdF9pbnB1dDIgPSAwOworICBpbnQgcHJlbXVsdGlwbHkgPSAxOworICBpbnQgbWF4X2RpZmYgPSAwOworICBpbnQgaSwgYzsKKyAgY29uc3QgY2hhciogZmlsZXNbMl0gPSB7IE5VTEwsIE5VTEwgfTsKKyAgQW5pbWF0ZWRJbWFnZSBpbWFnZXNbMl07CisKKyAgZm9yIChjID0gMTsgYyA8IGFyZ2M7ICsrYykgeworICAgIGludCBwYXJzZV9lcnJvciA9IDA7CisgICAgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1kdW1wX2ZyYW1lcyIpKSB7CisgICAgICBpZiAoYyA8IGFyZ2MgLSAxKSB7CisgICAgICAgIGR1bXBfZnJhbWVzID0gMTsKKyAgICAgICAgZHVtcF9mb2xkZXIgPSBhcmd2WysrY107CisgICAgICB9IGVsc2UgeworICAgICAgICBwYXJzZV9lcnJvciA9IDE7CisgICAgICB9CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItbWluX3BzbnIiKSkgeworICAgICAgaWYgKGMgPCBhcmdjIC0gMSkgeworICAgICAgICBjb25zdCBjaGFyKiBjb25zdCB2ID0gYXJndlsrK2NdOworICAgICAgICBjaGFyKiBlbmQgPSBOVUxMOworICAgICAgICBjb25zdCBkb3VibGUgZCA9IHN0cnRvZCh2LCAmZW5kKTsKKyAgICAgICAgaWYgKGVuZCA9PSB2KSB7CisgICAgICAgICAgcGFyc2VfZXJyb3IgPSAxOworICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IhICclcycgaXMgbm90IGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLlxuIiwgdik7CisgICAgICAgIH0KKyAgICAgICAgbWluX3BzbnIgPSBkOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcGFyc2VfZXJyb3IgPSAxOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXJhd19jb21wYXJpc29uIikpIHsKKyAgICAgIHByZW11bHRpcGx5ID0gMDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1tYXhfZGlmZiIpKSB7CisgICAgICBpZiAoYyA8IGFyZ2MgLSAxKSB7CisgICAgICAgIGNvbnN0IGNoYXIqIGNvbnN0IHYgPSBhcmd2WysrY107CisgICAgICAgIGNoYXIqIGVuZCA9IE5VTEw7CisgICAgICAgIGNvbnN0IGludCBuID0gKGludClzdHJ0b2wodiwgJmVuZCwgMTApOworICAgICAgICBpZiAoZW5kID09IHYpIHsKKyAgICAgICAgICBwYXJzZV9lcnJvciA9IDE7CisgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciEgJyVzJyBpcyBub3QgYW4gaW50ZWdlci5cbiIsIHYpOworICAgICAgICB9CisgICAgICAgIG1heF9kaWZmID0gbjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBhcnNlX2Vycm9yID0gMTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1oIikgfHwgIXN0cmNtcChhcmd2W2NdLCAiLWhlbHAiKSkgeworICAgICAgSGVscCgpOworICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItdmVyc2lvbiIpKSB7CisgICAgICBpbnQgZGVjX3ZlcnNpb24sIGRlbXV4X3ZlcnNpb247CisgICAgICBHZXRBbmltYXRlZEltYWdlVmVyc2lvbnMoJmRlY192ZXJzaW9uLCAmZGVtdXhfdmVyc2lvbik7CisgICAgICBwcmludGYoIldlYlAgRGVjb2RlciB2ZXJzaW9uOiAlZC4lZC4lZFxuV2ViUCBEZW11eCB2ZXJzaW9uOiAlZC4lZC4lZFxuIiwKKyAgICAgICAgICAgICAoZGVjX3ZlcnNpb24gPj4gMTYpICYgMHhmZiwgKGRlY192ZXJzaW9uID4+IDgpICYgMHhmZiwKKyAgICAgICAgICAgICAoZGVjX3ZlcnNpb24gPj4gMCkgJiAweGZmLAorICAgICAgICAgICAgIChkZW11eF92ZXJzaW9uID4+IDE2KSAmIDB4ZmYsIChkZW11eF92ZXJzaW9uID4+IDgpICYgMHhmZiwKKyAgICAgICAgICAgICAoZGVtdXhfdmVyc2lvbiA+PiAwKSAmIDB4ZmYpOworICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICghZ290X2lucHV0MSkgeworICAgICAgICBmaWxlc1swXSA9IGFyZ3ZbY107CisgICAgICAgIGdvdF9pbnB1dDEgPSAxOworICAgICAgfSBlbHNlIGlmICghZ290X2lucHV0MikgeworICAgICAgICBmaWxlc1sxXSA9IGFyZ3ZbY107CisgICAgICAgIGdvdF9pbnB1dDIgPSAxOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcGFyc2VfZXJyb3IgPSAxOworICAgICAgfQorICAgIH0KKyAgICBpZiAocGFyc2VfZXJyb3IpIHsKKyAgICAgIEhlbHAoKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KKyAgaWYgKGFyZ2MgPCAzKSB7CisgICAgSGVscCgpOworICAgIHJldHVybiAtMTsKKyAgfQorCisKKyAgaWYgKCFnb3RfaW5wdXQyKSB7CisgICAgSGVscCgpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGlmIChkdW1wX2ZyYW1lcykgeworICAgIHByaW50ZigiRHVtcGluZyBkZWNvZGVkIGZyYW1lcyBpbjogJXNcbiIsIGR1bXBfZm9sZGVyKTsKKyAgfQorCisgIG1lbXNldChpbWFnZXMsIDAsIHNpemVvZihpbWFnZXMpKTsKKyAgZm9yIChpID0gMDsgaSA8IDI7ICsraSkgeworICAgIHByaW50ZigiRGVjb2RpbmcgZmlsZTogJXNcbiIsIGZpbGVzW2ldKTsKKyAgICBpZiAoIVJlYWRBbmltYXRlZEltYWdlKGZpbGVzW2ldLCAmaW1hZ2VzW2ldLCBkdW1wX2ZyYW1lcywgZHVtcF9mb2xkZXIpKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGRlY29kaW5nIGZpbGU6ICVzXG4gQWJvcnRpbmcuXG4iLCBmaWxlc1tpXSk7CisgICAgICByZXR1cm5fY29kZSA9IC0yOworICAgICAgZ290byBFbmQ7CisgICAgfSBlbHNlIHsKKyAgICAgIE1pbmltaXplQW5pbWF0aW9uRnJhbWVzKCZpbWFnZXNbaV0sIG1heF9kaWZmKTsKKyAgICB9CisgIH0KKworICBpZiAoIUNvbXBhcmVBbmltYXRlZEltYWdlUGFpcigmaW1hZ2VzWzBdLCAmaW1hZ2VzWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVtdWx0aXBseSwgbWluX3BzbnIpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJcbkZpbGVzICVzIGFuZCAlcyBkaWZmZXIuXG4iLCBmaWxlc1swXSwgZmlsZXNbMV0pOworICAgIHJldHVybl9jb2RlID0gLTM7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJcbkZpbGVzICVzIGFuZCAlcyBhcmUgaWRlbnRpY2FsLlxuIiwgZmlsZXNbMF0sIGZpbGVzWzFdKTsKKyAgICByZXR1cm5fY29kZSA9IDA7CisgIH0KKyBFbmQ6CisgIENsZWFyQW5pbWF0ZWRJbWFnZSgmaW1hZ2VzWzBdKTsKKyAgQ2xlYXJBbmltYXRlZEltYWdlKCZpbWFnZXNbMV0pOworICByZXR1cm4gcmV0dXJuX2NvZGU7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy9hbmltX2R1bXAuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL2FuaW1fZHVtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiOTZjZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy9hbmltX2R1bXAuYwpAQCAtMCwwICsxLDExOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIERlY29kZXMgYW4gYW5pbWF0ZWQgV2ViUCBmaWxlIGFuZCBkdW1wcyB0aGUgZGVjb2RlZCBmcmFtZXMgYXMgUE5HIG9yIFRJRkYuCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+ICAvLyBmb3IgJ3N0cmNtcCcuCisKKyNpbmNsdWRlICIuL2FuaW1fdXRpbC5oIgorI2luY2x1ZGUgIndlYnAvZGVjb2RlLmgiCisjaW5jbHVkZSAiLi4vaW1hZ2Vpby9pbWFnZV9lbmMuaCIKKworI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSIDwgMTkwMAorI2RlZmluZSBzbnByaW50ZiBfc25wcmludGYKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBIZWxwKHZvaWQpIHsKKyAgcHJpbnRmKCJVc2FnZTogYW5pbV9kdW1wIFtvcHRpb25zXSBmaWxlcy4uLlxuIik7CisgIHByaW50ZigiXG5PcHRpb25zOlxuIik7CisgIHByaW50ZigiICAtZm9sZGVyIDxzdHJpbmc+IC4uLi4gZHVtcCBmb2xkZXIgKGRlZmF1bHQ6ICcuJylcbiIpOworICBwcmludGYoIiAgLXByZWZpeCA8c3RyaW5nPiAuLi4uIHByZWZpeCBmb3IgZHVtcGVkIGZyYW1lcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihkZWZhdWx0OiAnZHVtcF8nKVxuIik7CisgIHByaW50ZigiICAtdGlmZiAuLi4uLi4uLi4uLi4uLi4gc2F2ZSBmcmFtZXMgYXMgVElGRlxuIik7CisgIHByaW50ZigiICAtcGFtIC4uLi4uLi4uLi4uLi4uLi4gc2F2ZSBmcmFtZXMgYXMgUEFNXG4iKTsKKyAgcHJpbnRmKCIgIC1oIC4uLi4uLi4uLi4uLi4uLi4uLiB0aGlzIGhlbHBcbiIpOworICBwcmludGYoIiAgLXZlcnNpb24gLi4uLi4uLi4uLi4uIHByaW50IHZlcnNpb24gbnVtYmVyIGFuZCBleGl0XG4iKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIqIGFyZ3ZbXSkgeworICBpbnQgZXJyb3IgPSAwOworICBjb25zdCBjaGFyKiBkdW1wX2ZvbGRlciA9ICIuIjsKKyAgY29uc3QgY2hhciogcHJlZml4ID0gImR1bXBfIjsKKyAgY29uc3QgY2hhciogc3VmZml4ID0gInBuZyI7CisgIFdlYlBPdXRwdXRGaWxlRm9ybWF0IGZvcm1hdCA9IFBORzsKKyAgaW50IGM7CisKKyAgaWYgKGFyZ2MgPCAyKSB7CisgICAgSGVscCgpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGZvciAoYyA9IDE7ICFlcnJvciAmJiBjIDwgYXJnYzsgKytjKSB7CisgICAgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1mb2xkZXIiKSkgeworICAgICAgaWYgKGMgKyAxID09IGFyZ2MpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJtaXNzaW5nIGFyZ3VtZW50IGFmdGVyIG9wdGlvbiAnJXMnXG4iLCBhcmd2W2NdKTsKKyAgICAgICAgZXJyb3IgPSAxOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGR1bXBfZm9sZGVyID0gYXJndlsrK2NdOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXByZWZpeCIpKSB7CisgICAgICBpZiAoYyArIDEgPT0gYXJnYykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm1pc3NpbmcgYXJndW1lbnQgYWZ0ZXIgb3B0aW9uICclcydcbiIsIGFyZ3ZbY10pOworICAgICAgICBlcnJvciA9IDE7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgcHJlZml4ID0gYXJndlsrK2NdOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXRpZmYiKSkgeworICAgICAgZm9ybWF0ID0gVElGRjsKKyAgICAgIHN1ZmZpeCA9ICJ0aWZmIjsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1wYW0iKSkgeworICAgICAgZm9ybWF0ID0gUEFNOworICAgICAgc3VmZml4ID0gInBhbSI7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItaCIpIHx8ICFzdHJjbXAoYXJndltjXSwgIi1oZWxwIikpIHsKKyAgICAgIEhlbHAoKTsKKyAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXZlcnNpb24iKSkgeworICAgICAgaW50IGRlY192ZXJzaW9uLCBkZW11eF92ZXJzaW9uOworICAgICAgR2V0QW5pbWF0ZWRJbWFnZVZlcnNpb25zKCZkZWNfdmVyc2lvbiwgJmRlbXV4X3ZlcnNpb24pOworICAgICAgcHJpbnRmKCJXZWJQIERlY29kZXIgdmVyc2lvbjogJWQuJWQuJWRcbldlYlAgRGVtdXggdmVyc2lvbjogJWQuJWQuJWRcbiIsCisgICAgICAgICAgICAgKGRlY192ZXJzaW9uID4+IDE2KSAmIDB4ZmYsIChkZWNfdmVyc2lvbiA+PiA4KSAmIDB4ZmYsCisgICAgICAgICAgICAgKGRlY192ZXJzaW9uID4+IDApICYgMHhmZiwKKyAgICAgICAgICAgICAoZGVtdXhfdmVyc2lvbiA+PiAxNikgJiAweGZmLCAoZGVtdXhfdmVyc2lvbiA+PiA4KSAmIDB4ZmYsCisgICAgICAgICAgICAgKGRlbXV4X3ZlcnNpb24gPj4gMCkgJiAweGZmKTsKKyAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICB1aW50MzJfdCBpOworICAgICAgQW5pbWF0ZWRJbWFnZSBpbWFnZTsKKyAgICAgIGNvbnN0IGNoYXIqIGNvbnN0IGZpbGUgPSBhcmd2W2NdOworICAgICAgbWVtc2V0KCZpbWFnZSwgMCwgc2l6ZW9mKGltYWdlKSk7CisgICAgICBwcmludGYoIkRlY29kaW5nIGZpbGU6ICVzIGFzICVzLyVzeHh4eC4lc1xuIiwKKyAgICAgICAgICAgICBmaWxlLCBkdW1wX2ZvbGRlciwgcHJlZml4LCBzdWZmaXgpOworICAgICAgaWYgKCFSZWFkQW5pbWF0ZWRJbWFnZShmaWxlLCAmaW1hZ2UsIDAsIE5VTEwpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgZGVjb2RpbmcgZmlsZTogJXNcbiBBYm9ydGluZy5cbiIsIGZpbGUpOworICAgICAgICBlcnJvciA9IDE7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZm9yIChpID0gMDsgIWVycm9yICYmIGkgPCBpbWFnZS5udW1fZnJhbWVzOyArK2kpIHsKKyAgICAgICAgY2hhciBvdXRfZmlsZVsxMDI0XTsKKyAgICAgICAgV2ViUERlY0J1ZmZlciBidWZmZXI7CisgICAgICAgIFdlYlBJbml0RGVjQnVmZmVyKCZidWZmZXIpOworICAgICAgICBidWZmZXIuY29sb3JzcGFjZSA9IE1PREVfUkdCQTsKKyAgICAgICAgYnVmZmVyLmlzX2V4dGVybmFsX21lbW9yeSA9IDE7CisgICAgICAgIGJ1ZmZlci53aWR0aCA9IGltYWdlLmNhbnZhc193aWR0aDsKKyAgICAgICAgYnVmZmVyLmhlaWdodCA9IGltYWdlLmNhbnZhc19oZWlnaHQ7CisgICAgICAgIGJ1ZmZlci51LlJHQkEucmdiYSA9IGltYWdlLmZyYW1lc1tpXS5yZ2JhOworICAgICAgICBidWZmZXIudS5SR0JBLnN0cmlkZSA9IGJ1ZmZlci53aWR0aCAqIHNpemVvZih1aW50MzJfdCk7CisgICAgICAgIGJ1ZmZlci51LlJHQkEuc2l6ZSA9IGJ1ZmZlci51LlJHQkEuc3RyaWRlICogYnVmZmVyLmhlaWdodDsKKyAgICAgICAgc25wcmludGYob3V0X2ZpbGUsIHNpemVvZihvdXRfZmlsZSksICIlcy8lcyUuNGQuJXMiLAorICAgICAgICAgICAgICAgICBkdW1wX2ZvbGRlciwgcHJlZml4LCBpLCBzdWZmaXgpOworICAgICAgICBpZiAoIVdlYlBTYXZlSW1hZ2UoJmJ1ZmZlciwgZm9ybWF0LCBvdXRfZmlsZSkpIHsKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIHdoaWxlIHNhdmluZyBpbWFnZSAnJXMnXG4iLCBvdXRfZmlsZSk7CisgICAgICAgICAgZXJyb3IgPSAxOworICAgICAgICB9CisgICAgICAgIFdlYlBGcmVlRGVjQnVmZmVyKCZidWZmZXIpOworICAgICAgfQorICAgICAgQ2xlYXJBbmltYXRlZEltYWdlKCZpbWFnZSk7CisgICAgfQorICB9CisgIHJldHVybiBlcnJvciA/IDEgOiAwOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvYW5pbV91dGlsLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy9hbmltX3V0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2EwNWM3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvYW5pbV91dGlsLmMKQEAgLTAsMCArMSw3OTQgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBVdGlsaXRpZXMgZm9yIGFuaW1hdGVkIGltYWdlcworCisjaW5jbHVkZSAiLi9hbmltX3V0aWwuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWYgZGVmaW5lZChXRUJQX0hBVkVfR0lGKQorI2luY2x1ZGUgPGdpZl9saWIuaD4KKyNlbmRpZgorI2luY2x1ZGUgIndlYnAvZm9ybWF0X2NvbnN0YW50cy5oIgorI2luY2x1ZGUgIndlYnAvZGVjb2RlLmgiCisjaW5jbHVkZSAid2VicC9kZW11eC5oIgorI2luY2x1ZGUgIi4uL2ltYWdlaW8vaW1hZ2Vpb191dGlsLmgiCisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBfTVNDX1ZFUiA8IDE5MDAKKyNkZWZpbmUgc25wcmludGYgX3NucHJpbnRmCisjZW5kaWYKKworc3RhdGljIGNvbnN0IGludCBrTnVtQ2hhbm5lbHMgPSA0OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29tbW9uIHV0aWxpdGllcy4KKworI2lmIGRlZmluZWQoV0VCUF9IQVZFX0dJRikKKy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZnJhbWUgY292ZXJzIHRoZSBmdWxsIGNhbnZhcy4KK3N0YXRpYyBpbnQgSXNGdWxsRnJhbWUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FudmFzX3dpZHRoLCBpbnQgY2FudmFzX2hlaWdodCkgeworICByZXR1cm4gKHdpZHRoID09IGNhbnZhc193aWR0aCAmJiBoZWlnaHQgPT0gY2FudmFzX2hlaWdodCk7Cit9CisjZW5kaWYgLy8gV0VCUF9IQVZFX0dJRgorCitzdGF0aWMgaW50IENoZWNrU2l6ZUZvck92ZXJmbG93KHVpbnQ2NF90IHNpemUpIHsKKyAgcmV0dXJuIChzaXplID09IChzaXplX3Qpc2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQgQWxsb2NhdGVGcmFtZXMoQW5pbWF0ZWRJbWFnZSogY29uc3QgaW1hZ2UsIHVpbnQzMl90IG51bV9mcmFtZXMpIHsKKyAgdWludDMyX3QgaTsKKyAgdWludDhfdCogbWVtID0gTlVMTDsKKyAgRGVjb2RlZEZyYW1lKiBmcmFtZXMgPSBOVUxMOworICBjb25zdCB1aW50NjRfdCByZ2JhX3NpemUgPQorICAgICAgKHVpbnQ2NF90KWltYWdlLT5jYW52YXNfd2lkdGggKiBrTnVtQ2hhbm5lbHMgKiBpbWFnZS0+Y2FudmFzX2hlaWdodDsKKyAgY29uc3QgdWludDY0X3QgdG90YWxfc2l6ZSA9ICh1aW50NjRfdCludW1fZnJhbWVzICogcmdiYV9zaXplICogc2l6ZW9mKCptZW0pOworICBjb25zdCB1aW50NjRfdCB0b3RhbF9mcmFtZV9zaXplID0gKHVpbnQ2NF90KW51bV9mcmFtZXMgKiBzaXplb2YoKmZyYW1lcyk7CisgIGlmICghQ2hlY2tTaXplRm9yT3ZlcmZsb3codG90YWxfc2l6ZSkgfHwKKyAgICAgICFDaGVja1NpemVGb3JPdmVyZmxvdyh0b3RhbF9mcmFtZV9zaXplKSkgeworICAgIHJldHVybiAwOworICB9CisgIG1lbSA9ICh1aW50OF90KiltYWxsb2MoKHNpemVfdCl0b3RhbF9zaXplKTsKKyAgZnJhbWVzID0gKERlY29kZWRGcmFtZSopbWFsbG9jKChzaXplX3QpdG90YWxfZnJhbWVfc2l6ZSk7CisKKyAgaWYgKG1lbSA9PSBOVUxMIHx8IGZyYW1lcyA9PSBOVUxMKSB7CisgICAgZnJlZShtZW0pOworICAgIGZyZWUoZnJhbWVzKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBmcmVlKGltYWdlLT5yYXdfbWVtKTsKKyAgaW1hZ2UtPm51bV9mcmFtZXMgPSBudW1fZnJhbWVzOworICBpbWFnZS0+ZnJhbWVzID0gZnJhbWVzOworICBmb3IgKGkgPSAwOyBpIDwgbnVtX2ZyYW1lczsgKytpKSB7CisgICAgZnJhbWVzW2ldLnJnYmEgPSBtZW0gKyBpICogcmdiYV9zaXplOworICAgIGZyYW1lc1tpXS5kdXJhdGlvbiA9IDA7CisgICAgZnJhbWVzW2ldLmlzX2tleV9mcmFtZSA9IDA7CisgIH0KKyAgaW1hZ2UtPnJhd19tZW0gPSBtZW07CisgIHJldHVybiAxOworfQorCit2b2lkIENsZWFyQW5pbWF0ZWRJbWFnZShBbmltYXRlZEltYWdlKiBjb25zdCBpbWFnZSkgeworICBpZiAoaW1hZ2UgIT0gTlVMTCkgeworICAgIGZyZWUoaW1hZ2UtPnJhd19tZW0pOworICAgIGZyZWUoaW1hZ2UtPmZyYW1lcyk7CisgICAgaW1hZ2UtPm51bV9mcmFtZXMgPSAwOworICAgIGltYWdlLT5mcmFtZXMgPSBOVUxMOworICAgIGltYWdlLT5yYXdfbWVtID0gTlVMTDsKKyAgfQorfQorCisjaWYgZGVmaW5lZChXRUJQX0hBVkVfR0lGKQorLy8gQ2xlYXIgdGhlIGNhbnZhcyB0byB0cmFuc3BhcmVudC4KK3N0YXRpYyB2b2lkIFplcm9GaWxsQ2FudmFzKHVpbnQ4X3QqIHJnYmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjYW52YXNfd2lkdGgsIHVpbnQzMl90IGNhbnZhc19oZWlnaHQpIHsKKyAgbWVtc2V0KHJnYmEsIDAsIGNhbnZhc193aWR0aCAqIGtOdW1DaGFubmVscyAqIGNhbnZhc19oZWlnaHQpOworfQorCisvLyBDbGVhciBnaXZlbiBmcmFtZSByZWN0YW5nbGUgdG8gdHJhbnNwYXJlbnQuCitzdGF0aWMgdm9pZCBaZXJvRmlsbEZyYW1lUmVjdCh1aW50OF90KiByZ2JhLCBpbnQgcmdiYV9zdHJpZGUsIGludCB4X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5X29mZnNldCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgIGludCBqOworICBhc3NlcnQod2lkdGggKiBrTnVtQ2hhbm5lbHMgPD0gcmdiYV9zdHJpZGUpOworICByZ2JhICs9IHlfb2Zmc2V0ICogcmdiYV9zdHJpZGUgKyB4X29mZnNldCAqIGtOdW1DaGFubmVsczsKKyAgZm9yIChqID0gMDsgaiA8IGhlaWdodDsgKytqKSB7CisgICAgbWVtc2V0KHJnYmEsIDAsIHdpZHRoICoga051bUNoYW5uZWxzKTsKKyAgICByZ2JhICs9IHJnYmFfc3RyaWRlOworICB9Cit9CisKKy8vIENvcHkgd2lkdGggKiBoZWlnaHQgcGl4ZWxzIGZyb20gJ3NyYycgdG8gJ2RzdCcuCitzdGF0aWMgdm9pZCBDb3B5Q2FudmFzKGNvbnN0IHVpbnQ4X3QqIHNyYywgdWludDhfdCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSB7CisgIGFzc2VydChzcmMgIT0gTlVMTCAmJiBkc3QgIT0gTlVMTCk7CisgIG1lbWNweShkc3QsIHNyYywgd2lkdGggKiBrTnVtQ2hhbm5lbHMgKiBoZWlnaHQpOworfQorCisvLyBDb3B5IHBpeGVscyBpbiB0aGUgZ2l2ZW4gcmVjdGFuZ2xlIGZyb20gJ3NyYycgdG8gJ2RzdCcgaG9ub3JpbmcgdGhlICdzdHJpZGUnLgorc3RhdGljIHZvaWQgQ29weUZyYW1lUmVjdGFuZ2xlKGNvbnN0IHVpbnQ4X3QqIHNyYywgdWludDhfdCogZHN0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4X29mZnNldCwgaW50IHlfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICBpbnQgajsKKyAgY29uc3QgaW50IHdpZHRoX2luX2J5dGVzID0gd2lkdGggKiBrTnVtQ2hhbm5lbHM7CisgIGNvbnN0IHNpemVfdCBvZmZzZXQgPSB5X29mZnNldCAqIHN0cmlkZSArIHhfb2Zmc2V0ICoga051bUNoYW5uZWxzOworICBhc3NlcnQod2lkdGhfaW5fYnl0ZXMgPD0gc3RyaWRlKTsKKyAgc3JjICs9IG9mZnNldDsKKyAgZHN0ICs9IG9mZnNldDsKKyAgZm9yIChqID0gMDsgaiA8IGhlaWdodDsgKytqKSB7CisgICAgbWVtY3B5KGRzdCwgc3JjLCB3aWR0aF9pbl9ieXRlcyk7CisgICAgc3JjICs9IHN0cmlkZTsKKyAgICBkc3QgKz0gc3RyaWRlOworICB9Cit9CisjZW5kaWYgLy8gV0VCUF9IQVZFX0dJRgorCisvLyBDYW5vbmljYWxpemUgYWxsIHRyYW5zcGFyZW50IHBpeGVscyB0byB0cmFuc3BhcmVudCBibGFjayB0byBhaWQgY29tcGFyaXNvbi4KK3N0YXRpYyB2b2lkIENsZWFudXBUcmFuc3BhcmVudFBpeGVscyh1aW50MzJfdCogcmdiYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSB7CisgIGNvbnN0IHVpbnQzMl90KiBjb25zdCByZ2JhX2VuZCA9IHJnYmEgKyB3aWR0aCAqIGhlaWdodDsKKyAgd2hpbGUgKHJnYmEgPCByZ2JhX2VuZCkgeworICAgIGNvbnN0IHVpbnQ4X3QgYWxwaGEgPSAoKnJnYmEgPj4gMjQpICYgMHhmZjsKKyAgICBpZiAoYWxwaGEgPT0gMCkgeworICAgICAgKnJnYmEgPSAwOworICAgIH0KKyAgICArK3JnYmE7CisgIH0KK30KKworLy8gRHVtcCBmcmFtZSB0byBhIFBBTSBmaWxlLiBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcy4KK3N0YXRpYyBpbnQgRHVtcEZyYW1lKGNvbnN0IGNoYXIgZmlsZW5hbWVbXSwgY29uc3QgY2hhciBkdW1wX2ZvbGRlcltdLAorICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZnJhbWVfbnVtLCBjb25zdCB1aW50OF90IHJnYmFbXSwKKyAgICAgICAgICAgICAgICAgICAgIGludCBjYW52YXNfd2lkdGgsIGludCBjYW52YXNfaGVpZ2h0KSB7CisgIGludCBvayA9IDA7CisgIHNpemVfdCBtYXhfbGVuOworICBpbnQgeTsKKyAgY29uc3QgY2hhciogYmFzZV9uYW1lID0gTlVMTDsKKyAgY2hhciogZmlsZV9uYW1lID0gTlVMTDsKKyAgRklMRSogZiA9IE5VTEw7CisgIGNvbnN0IGNoYXIqIHJvdzsKKworICBpZiAoZHVtcF9mb2xkZXIgPT0gTlVMTCkgZHVtcF9mb2xkZXIgPSAiLiI7CisKKyAgYmFzZV9uYW1lID0gc3RycmNocihmaWxlbmFtZSwgJy8nKTsKKyAgYmFzZV9uYW1lID0gKGJhc2VfbmFtZSA9PSBOVUxMKSA/IGZpbGVuYW1lIDogYmFzZV9uYW1lICsgMTsKKyAgbWF4X2xlbiA9IHN0cmxlbihkdW1wX2ZvbGRlcikgKyAxICsgc3RybGVuKGJhc2VfbmFtZSkKKyAgICAgICAgICArIHN0cmxlbigiX2ZyYW1lXyIpICsgc3RybGVuKCIucGFtIikgKyA4OworICBmaWxlX25hbWUgPSAoY2hhciopbWFsbG9jKG1heF9sZW4gKiBzaXplb2YoKmZpbGVfbmFtZSkpOworICBpZiAoZmlsZV9uYW1lID09IE5VTEwpIGdvdG8gRW5kOworCisgIGlmIChzbnByaW50ZihmaWxlX25hbWUsIG1heF9sZW4sICIlcy8lc19mcmFtZV8lZC5wYW0iLAorICAgICAgICAgICAgICAgZHVtcF9mb2xkZXIsIGJhc2VfbmFtZSwgZnJhbWVfbnVtKSA8IDApIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIHdoaWxlIGdlbmVyYXRpbmcgZmlsZSBuYW1lXG4iKTsKKyAgICBnb3RvIEVuZDsKKyAgfQorCisgIGYgPSBmb3BlbihmaWxlX25hbWUsICJ3YiIpOworICBpZiAoZiA9PSBOVUxMKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBvcGVuaW5nIGZpbGUgZm9yIHdyaXRpbmc6ICVzXG4iLCBmaWxlX25hbWUpOworICAgIG9rID0gMDsKKyAgICBnb3RvIEVuZDsKKyAgfQorICBpZiAoZnByaW50ZihmLCAiUDdcbldJRFRIICVkXG5IRUlHSFQgJWRcbiIKKyAgICAgICAgICAgICAgIkRFUFRIIDRcbk1BWFZBTCAyNTVcblRVUExUWVBFIFJHQl9BTFBIQVxuRU5ESERSXG4iLAorICAgICAgICAgICAgICBjYW52YXNfd2lkdGgsIGNhbnZhc19oZWlnaHQpIDwgMCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiV3JpdGUgZXJyb3IgZm9yIGZpbGUgJXNcbiIsIGZpbGVfbmFtZSk7CisgICAgZ290byBFbmQ7CisgIH0KKyAgcm93ID0gKGNvbnN0IGNoYXIqKXJnYmE7CisgIGZvciAoeSA9IDA7IHkgPCBjYW52YXNfaGVpZ2h0OyArK3kpIHsKKyAgICBpZiAoZndyaXRlKHJvdywgY2FudmFzX3dpZHRoICoga051bUNoYW5uZWxzLCAxLCBmKSAhPSAxKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIHdyaXRpbmcgdG8gZmlsZTogJXNcbiIsIGZpbGVfbmFtZSk7CisgICAgICBnb3RvIEVuZDsKKyAgICB9CisgICAgcm93ICs9IGNhbnZhc193aWR0aCAqIGtOdW1DaGFubmVsczsKKyAgfQorICBvayA9IDE7CisgRW5kOgorICBpZiAoZiAhPSBOVUxMKSBmY2xvc2UoZik7CisgIGZyZWUoZmlsZV9uYW1lKTsKKyAgcmV0dXJuIG9rOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gV2ViUCBEZWNvZGluZy4KKworLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYSB2YWxpZCBXZWJQIGJpdHN0cmVhbS4KK3N0YXRpYyBpbnQgSXNXZWJQKGNvbnN0IFdlYlBEYXRhKiBjb25zdCB3ZWJwX2RhdGEpIHsKKyAgcmV0dXJuIChXZWJQR2V0SW5mbyh3ZWJwX2RhdGEtPmJ5dGVzLCB3ZWJwX2RhdGEtPnNpemUsIE5VTEwsIE5VTEwpICE9IDApOworfQorCisvLyBSZWFkIGFuaW1hdGVkIFdlYlAgYml0c3RyZWFtICd3ZWJwX2RhdGEnIGludG8gJ0FuaW1hdGVkSW1hZ2UnIHN0cnVjdC4KK3N0YXRpYyBpbnQgUmVhZEFuaW1hdGVkV2ViUChjb25zdCBjaGFyIGZpbGVuYW1lW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUERhdGEqIGNvbnN0IHdlYnBfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmltYXRlZEltYWdlKiBjb25zdCBpbWFnZSwgaW50IGR1bXBfZnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgZHVtcF9mb2xkZXJbXSkgeworICBpbnQgb2sgPSAwOworICBpbnQgZHVtcF9vayA9IDE7CisgIHVpbnQzMl90IGZyYW1lX2luZGV4ID0gMDsKKyAgaW50IHByZXZfZnJhbWVfdGltZXN0YW1wID0gMDsKKyAgV2ViUEFuaW1EZWNvZGVyKiBkZWM7CisgIFdlYlBBbmltSW5mbyBhbmltX2luZm87CisKKyAgbWVtc2V0KGltYWdlLCAwLCBzaXplb2YoKmltYWdlKSk7CisKKyAgZGVjID0gV2ViUEFuaW1EZWNvZGVyTmV3KHdlYnBfZGF0YSwgTlVMTCk7CisgIGlmIChkZWMgPT0gTlVMTCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgcGFyc2luZyBpbWFnZTogJXNcbiIsIGZpbGVuYW1lKTsKKyAgICBnb3RvIEVuZDsKKyAgfQorCisgIGlmICghV2ViUEFuaW1EZWNvZGVyR2V0SW5mbyhkZWMsICZhbmltX2luZm8pKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBnZXR0aW5nIGdsb2JhbCBpbmZvIGFib3V0IHRoZSBhbmltYXRpb25cbiIpOworICAgIGdvdG8gRW5kOworICB9CisKKyAgLy8gQW5pbWF0aW9uIHByb3BlcnRpZXMuCisgIGltYWdlLT5jYW52YXNfd2lkdGggPSBhbmltX2luZm8uY2FudmFzX3dpZHRoOworICBpbWFnZS0+Y2FudmFzX2hlaWdodCA9IGFuaW1faW5mby5jYW52YXNfaGVpZ2h0OworICBpbWFnZS0+bG9vcF9jb3VudCA9IGFuaW1faW5mby5sb29wX2NvdW50OworICBpbWFnZS0+Ymdjb2xvciA9IGFuaW1faW5mby5iZ2NvbG9yOworCisgIC8vIEFsbG9jYXRlIGZyYW1lcy4KKyAgaWYgKCFBbGxvY2F0ZUZyYW1lcyhpbWFnZSwgYW5pbV9pbmZvLmZyYW1lX2NvdW50KSkgcmV0dXJuIDA7CisKKyAgLy8gRGVjb2RlIGZyYW1lcy4KKyAgd2hpbGUgKFdlYlBBbmltRGVjb2Rlckhhc01vcmVGcmFtZXMoZGVjKSkgeworICAgIERlY29kZWRGcmFtZSogY3Vycl9mcmFtZTsKKyAgICB1aW50OF90KiBjdXJyX3JnYmE7CisgICAgdWludDhfdCogZnJhbWVfcmdiYTsKKyAgICBpbnQgdGltZXN0YW1wOworCisgICAgaWYgKCFXZWJQQW5pbURlY29kZXJHZXROZXh0KGRlYywgJmZyYW1lX3JnYmEsICZ0aW1lc3RhbXApKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGRlY29kaW5nIGZyYW1lICMldVxuIiwgZnJhbWVfaW5kZXgpOworICAgICAgZ290byBFbmQ7CisgICAgfQorICAgIGFzc2VydChmcmFtZV9pbmRleCA8IGFuaW1faW5mby5mcmFtZV9jb3VudCk7CisgICAgY3Vycl9mcmFtZSA9ICZpbWFnZS0+ZnJhbWVzW2ZyYW1lX2luZGV4XTsKKyAgICBjdXJyX3JnYmEgPSBjdXJyX2ZyYW1lLT5yZ2JhOworICAgIGN1cnJfZnJhbWUtPmR1cmF0aW9uID0gdGltZXN0YW1wIC0gcHJldl9mcmFtZV90aW1lc3RhbXA7CisgICAgY3Vycl9mcmFtZS0+aXNfa2V5X2ZyYW1lID0gMDsgIC8vIFVudXNlZC4KKyAgICBtZW1jcHkoY3Vycl9yZ2JhLCBmcmFtZV9yZ2JhLAorICAgICAgICAgICBpbWFnZS0+Y2FudmFzX3dpZHRoICoga051bUNoYW5uZWxzICogaW1hZ2UtPmNhbnZhc19oZWlnaHQpOworCisgICAgLy8gTmVlZGVkIG9ubHkgYmVjYXVzZSB3ZSBtYXkgd2FudCB0byBjb21wYXJlIHdpdGggR0lGIGxhdGVyLgorICAgIENsZWFudXBUcmFuc3BhcmVudFBpeGVscygodWludDMyX3QqKWN1cnJfcmdiYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UtPmNhbnZhc193aWR0aCwgaW1hZ2UtPmNhbnZhc19oZWlnaHQpOworCisgICAgaWYgKGR1bXBfZnJhbWVzICYmIGR1bXBfb2spIHsKKyAgICAgIGR1bXBfb2sgPSBEdW1wRnJhbWUoZmlsZW5hbWUsIGR1bXBfZm9sZGVyLCBmcmFtZV9pbmRleCwgY3Vycl9yZ2JhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZS0+Y2FudmFzX3dpZHRoLCBpbWFnZS0+Y2FudmFzX2hlaWdodCk7CisgICAgICBpZiAoIWR1bXBfb2spIHsgIC8vIFByaW50IGVycm9yIG9uY2UsIGJ1dCBjb250aW51ZSBkZWNvZGUgbG9vcC4KKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBkdW1waW5nIGZyYW1lcyB0byAlc1xuIiwgZHVtcF9mb2xkZXIpOworICAgICAgfQorICAgIH0KKworICAgICsrZnJhbWVfaW5kZXg7CisgICAgcHJldl9mcmFtZV90aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgIH0KKyAgb2sgPSBkdW1wX29rOworCisgRW5kOgorICBXZWJQQW5pbURlY29kZXJEZWxldGUoZGVjKTsKKyAgcmV0dXJuIG9rOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gR0lGIERlY29kaW5nLgorCisjaWYgZGVmaW5lZChXRUJQX0hBVkVfR0lGKQorCisvLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBhIHZhbGlkIEdJRiBiaXRzdHJlYW0uCitzdGF0aWMgaW50IElzR0lGKGNvbnN0IFdlYlBEYXRhKiBjb25zdCBkYXRhKSB7CisgIHJldHVybiBkYXRhLT5zaXplID4gR0lGX1NUQU1QX0xFTiAmJgorICAgICAgICAgKCFtZW1jbXAoR0lGX1NUQU1QLCBkYXRhLT5ieXRlcywgR0lGX1NUQU1QX0xFTikgfHwKKyAgICAgICAgICAhbWVtY21wKEdJRjg3X1NUQU1QLCBkYXRhLT5ieXRlcywgR0lGX1NUQU1QX0xFTikgfHwKKyAgICAgICAgICAhbWVtY21wKEdJRjg5X1NUQU1QLCBkYXRhLT5ieXRlcywgR0lGX1NUQU1QX0xFTikpOworfQorCisvLyBHSUZMSUJfTUFKT1IgaXMgb25seSBkZWZpbmVkIGluIGxpYmdpZiA+PSA0LjIuMC4KKyNpZiBkZWZpbmVkKEdJRkxJQl9NQUpPUikgJiYgZGVmaW5lZChHSUZMSUJfTUlOT1IpCisjIGRlZmluZSBMT0NBTF9HSUZfVkVSU0lPTiAoKEdJRkxJQl9NQUpPUiA8PCA4KSB8IEdJRkxJQl9NSU5PUikKKyMgZGVmaW5lIExPQ0FMX0dJRl9QUkVSRVEobWFqLCBtaW4pIFwKKyAgICAoTE9DQUxfR0lGX1ZFUlNJT04gPj0gKCgobWFqKSA8PCA4KSB8IChtaW4pKSkKKyNlbHNlCisjIGRlZmluZSBMT0NBTF9HSUZfVkVSU0lPTiAwCisjIGRlZmluZSBMT0NBTF9HSUZfUFJFUkVRKG1haiwgbWluKSAwCisjZW5kaWYKKworI2lmICFMT0NBTF9HSUZfUFJFUkVRKDUsIDApCisKKy8vIEFkZGVkIGluIHY1LjAKK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50IERpc3Bvc2FsTW9kZTsKKyNkZWZpbmUgRElTUE9TQUxfVU5TUEVDSUZJRUQgICAgICAwICAgICAgIC8vIE5vIGRpc3Bvc2FsIHNwZWNpZmllZAorI2RlZmluZSBESVNQT1NFX0RPX05PVCAgICAgICAgICAgIDEgICAgICAgLy8gTGVhdmUgaW1hZ2UgaW4gcGxhY2UKKyNkZWZpbmUgRElTUE9TRV9CQUNLR1JPVU5EICAgICAgICAyICAgICAgIC8vIFNldCBhcmVhIHRvIGJhY2tncm91bmQgY29sb3IKKyNkZWZpbmUgRElTUE9TRV9QUkVWSU9VUyAgICAgICAgICAzICAgICAgIC8vIFJlc3RvcmUgdG8gcHJldmlvdXMgY29udGVudAorICBpbnQgVXNlcklucHV0RmxhZzsgICAgICAgLy8gVXNlciBjb25maXJtYXRpb24gcmVxdWlyZWQgYmVmb3JlIGRpc3Bvc2FsCisgIGludCBEZWxheVRpbWU7ICAgICAgICAgICAvLyBQcmUtZGlzcGxheSBkZWxheSBpbiAwLjAxc2VjIHVuaXRzCisgIGludCBUcmFuc3BhcmVudENvbG9yOyAgICAvLyBQYWxldHRlIGluZGV4IGZvciB0cmFuc3BhcmVuY3ksIC0xIGlmIG5vbmUKKyNkZWZpbmUgTk9fVFJBTlNQQVJFTlRfQ09MT1IgICAgIC0xCit9IEdyYXBoaWNzQ29udHJvbEJsb2NrOworCitzdGF0aWMgaW50IERHaWZFeHRlbnNpb25Ub0dDQihjb25zdCBzaXplX3QgR2lmRXh0ZW5zaW9uTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR2lmQnl0ZVR5cGUqIEdpZkV4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNzQ29udHJvbEJsb2NrKiBnY2IpIHsKKyAgaWYgKEdpZkV4dGVuc2lvbkxlbmd0aCAhPSA0KSB7CisgICAgcmV0dXJuIEdJRl9FUlJPUjsKKyAgfQorICBnY2ItPkRpc3Bvc2FsTW9kZSA9IChHaWZFeHRlbnNpb25bMF0gPj4gMikgJiAweDA3OworICBnY2ItPlVzZXJJbnB1dEZsYWcgPSAoR2lmRXh0ZW5zaW9uWzBdICYgMHgwMikgIT0gMDsKKyAgZ2NiLT5EZWxheVRpbWUgPSBHaWZFeHRlbnNpb25bMV0gfCAoR2lmRXh0ZW5zaW9uWzJdIDw8IDgpOworICBpZiAoR2lmRXh0ZW5zaW9uWzBdICYgMHgwMSkgeworICAgIGdjYi0+VHJhbnNwYXJlbnRDb2xvciA9IChpbnQpR2lmRXh0ZW5zaW9uWzNdOworICB9IGVsc2UgeworICAgIGdjYi0+VHJhbnNwYXJlbnRDb2xvciA9IE5PX1RSQU5TUEFSRU5UX0NPTE9SOworICB9CisgIHJldHVybiBHSUZfT0s7Cit9CisKK3N0YXRpYyBpbnQgREdpZlNhdmVkRXh0ZW5zaW9uVG9HQ0IoR2lmRmlsZVR5cGUqIEdpZkZpbGUsIGludCBJbWFnZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljc0NvbnRyb2xCbG9jayogZ2NiKSB7CisgIGludCBpOworICBpZiAoSW1hZ2VJbmRleCA8IDAgfHwgSW1hZ2VJbmRleCA+IEdpZkZpbGUtPkltYWdlQ291bnQgLSAxKSB7CisgICAgcmV0dXJuIEdJRl9FUlJPUjsKKyAgfQorICBnY2ItPkRpc3Bvc2FsTW9kZSA9IERJU1BPU0FMX1VOU1BFQ0lGSUVEOworICBnY2ItPlVzZXJJbnB1dEZsYWcgPSAwOworICBnY2ItPkRlbGF5VGltZSA9IDA7CisgIGdjYi0+VHJhbnNwYXJlbnRDb2xvciA9IE5PX1RSQU5TUEFSRU5UX0NPTE9SOworCisgIGZvciAoaSA9IDA7IGkgPCBHaWZGaWxlLT5TYXZlZEltYWdlc1tJbWFnZUluZGV4XS5FeHRlbnNpb25CbG9ja0NvdW50OyBpKyspIHsKKyAgICBFeHRlbnNpb25CbG9jayogZXAgPSAmR2lmRmlsZS0+U2F2ZWRJbWFnZXNbSW1hZ2VJbmRleF0uRXh0ZW5zaW9uQmxvY2tzW2ldOworICAgIGlmIChlcC0+RnVuY3Rpb24gPT0gR1JBUEhJQ1NfRVhUX0ZVTkNfQ09ERSkgeworICAgICAgcmV0dXJuIERHaWZFeHRlbnNpb25Ub0dDQigKKyAgICAgICAgICBlcC0+Qnl0ZUNvdW50LCAoY29uc3QgR2lmQnl0ZVR5cGUqKWVwLT5CeXRlcywgZ2NiKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEdJRl9FUlJPUjsKK30KKworI2RlZmluZSBDT05USU5VRV9FWFRfRlVOQ19DT0RFIDB4MDAKKworLy8gU2lnbmF0dXJlIHdhcyBjaGFuZ2VkIGluIHY1LjAKKyNkZWZpbmUgREdpZk9wZW5GaWxlTmFtZShhLCBiKSBER2lmT3BlbkZpbGVOYW1lKGEpCisKKyNlbmRpZiAgLy8gIUxPQ0FMX0dJRl9QUkVSRVEoNSwgMCkKKworLy8gU2lnbmF0dXJlIGNoYW5nZWQgaW4gdjUuMQorI2lmICFMT0NBTF9HSUZfUFJFUkVRKDUsIDEpCisjZGVmaW5lIERHaWZDbG9zZUZpbGUoYSwgYikgREdpZkNsb3NlRmlsZShhKQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIEdJRkRpc3BsYXlFcnJvcihjb25zdCBHaWZGaWxlVHlwZSogY29uc3QgZ2lmLCBpbnQgZ2lmX2Vycm9yKSB7CisgIC8vIGxpYmdpZiA0LjIuMCBoYXMgcmV0aXJlZCBQcmludEdpZkVycm9yKCkgYW5kIGFkZGVkIEdpZkVycm9yU3RyaW5nKCkuCisjaWYgTE9DQUxfR0lGX1BSRVJFUSg0LCAyKQorI2lmIExPQ0FMX0dJRl9QUkVSRVEoNSwgMCkKKyAgY29uc3QgY2hhciogZXJyb3Jfc3RyID0KKyAgICAgIEdpZkVycm9yU3RyaW5nKChnaWYgPT0gTlVMTCkgPyBnaWZfZXJyb3IgOiBnaWYtPkVycm9yKTsKKyNlbHNlCisgIGNvbnN0IGNoYXIqIGVycm9yX3N0ciA9IEdpZkVycm9yU3RyaW5nKCk7CisgICh2b2lkKWdpZjsKKyNlbmRpZgorICBpZiAoZXJyb3Jfc3RyID09IE5VTEwpIGVycm9yX3N0ciA9ICJVbmtub3duIGVycm9yIjsKKyAgZnByaW50ZihzdGRlcnIsICJHSUZMaWIgRXJyb3IgJWQ6ICVzXG4iLCBnaWZfZXJyb3IsIGVycm9yX3N0cik7CisjZWxzZQorICAodm9pZClnaWY7CisgIGZwcmludGYoc3RkZXJyLCAiR0lGTGliIEVycm9yICVkOiAiLCBnaWZfZXJyb3IpOworICBQcmludEdpZkVycm9yKCk7CisgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50IElzS2V5RnJhbWVHSUYoY29uc3QgR2lmSW1hZ2VEZXNjKiBwcmV2X2Rlc2MsIGludCBwcmV2X2Rpc3Bvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVjb2RlZEZyYW1lKiBjb25zdCBwcmV2X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYW52YXNfd2lkdGgsIGludCBjYW52YXNfaGVpZ2h0KSB7CisgIGlmIChwcmV2X2ZyYW1lID09IE5VTEwpIHJldHVybiAxOworICBpZiAocHJldl9kaXNwb3NlID09IERJU1BPU0VfQkFDS0dST1VORCkgeworICAgIGlmIChJc0Z1bGxGcmFtZShwcmV2X2Rlc2MtPldpZHRoLCBwcmV2X2Rlc2MtPkhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgY2FudmFzX3dpZHRoLCBjYW52YXNfaGVpZ2h0KSkgeworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChwcmV2X2ZyYW1lLT5pc19rZXlfZnJhbWUpIHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IEdldFRyYW5zcGFyZW50SW5kZXhHSUYoR2lmRmlsZVR5cGUqIGdpZikgeworICBHcmFwaGljc0NvbnRyb2xCbG9jayBmaXJzdF9nY2I7CisgIG1lbXNldCgmZmlyc3RfZ2NiLCAwLCBzaXplb2YoZmlyc3RfZ2NiKSk7CisgIERHaWZTYXZlZEV4dGVuc2lvblRvR0NCKGdpZiwgMCwgJmZpcnN0X2djYik7CisgIHJldHVybiBmaXJzdF9nY2IuVHJhbnNwYXJlbnRDb2xvcjsKK30KKworc3RhdGljIHVpbnQzMl90IEdldEJhY2tncm91bmRDb2xvckdJRihHaWZGaWxlVHlwZSogZ2lmKSB7CisgIGNvbnN0IGludCB0cmFuc3BhcmVudF9pbmRleCA9IEdldFRyYW5zcGFyZW50SW5kZXhHSUYoZ2lmKTsKKyAgY29uc3QgQ29sb3JNYXBPYmplY3QqIGNvbnN0IGNvbG9yX21hcCA9IGdpZi0+U0NvbG9yTWFwOworICBpZiAodHJhbnNwYXJlbnRfaW5kZXggIT0gTk9fVFJBTlNQQVJFTlRfQ09MT1IgJiYKKyAgICAgIGdpZi0+U0JhY2tHcm91bmRDb2xvciA9PSB0cmFuc3BhcmVudF9pbmRleCkgeworICAgIHJldHVybiAweDAwMDAwMDAwOyAgLy8gU3BlY2lhbCBjYXNlOiB0cmFuc3BhcmVudCBibGFjay4KKyAgfSBlbHNlIGlmIChjb2xvcl9tYXAgPT0gTlVMTCB8fCBjb2xvcl9tYXAtPkNvbG9ycyA9PSBOVUxMCisgICAgICAgICAgICAgfHwgZ2lmLT5TQmFja0dyb3VuZENvbG9yID49IGNvbG9yX21hcC0+Q29sb3JDb3VudCkgeworICAgIHJldHVybiAweGZmZmZmZmZmOyAgLy8gSW52YWxpZDogYXNzdW1lIHdoaXRlLgorICB9IGVsc2UgeworICAgIGNvbnN0IEdpZkNvbG9yVHlwZSBjb2xvciA9IGNvbG9yX21hcC0+Q29sb3JzW2dpZi0+U0JhY2tHcm91bmRDb2xvcl07CisgICAgcmV0dXJuICgweGZmIDw8IDI0KSB8CisgICAgICAgICAgIChjb2xvci5SZWQgPDwgMTYpIHwKKyAgICAgICAgICAgKGNvbG9yLkdyZWVuIDw8IDgpIHwKKyAgICAgICAgICAgKGNvbG9yLkJsdWUgPDwgMCk7CisgIH0KK30KKworLy8gRmluZCBhcHByb3ByaWF0ZSBhcHAgZXh0ZW5zaW9uIGFuZCBnZXQgbG9vcCBjb3VudCBmcm9tIHRoZSBuZXh0IGV4dGVuc2lvbi4KKy8vIFdlIHVzZSBDaHJvbWUncyBpbnRlcnByZXRhdGlvbiBvZiB0aGUgJ2xvb3BfY291bnQnIHNlbWFudGljczoKKy8vICAgaWYgbm90IHByZXNlbnQgLT4gbG9vcCBvbmNlCisvLyAgIGlmIHByZXNlbnQgYW5kIGxvb3BfY291bnQgPT0gMCwgcmV0dXJuIDAgKCdpbmZpbml0ZScpLgorLy8gICBpZiBwcmVzZW50IGFuZCBsb29wX2NvdW50ICE9IDAsIGl0J3MgdGhlIG51bWJlciBvZiAqZXh0cmEqIGxvb3BzCisvLyAgICAgc28gd2UgbmVlZCB0byByZXR1cm4gbG9vcF9jb3VudCArIDEgYXMgdG90YWwgbG9vcCBudW1iZXIuCitzdGF0aWMgdWludDMyX3QgR2V0TG9vcENvdW50R0lGKGNvbnN0IEdpZkZpbGVUeXBlKiBjb25zdCBnaWYpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBnaWYtPkltYWdlQ291bnQ7ICsraSkgeworICAgIGNvbnN0IFNhdmVkSW1hZ2UqIGNvbnN0IGltYWdlID0gJmdpZi0+U2F2ZWRJbWFnZXNbaV07CisgICAgaW50IGo7CisgICAgZm9yIChqID0gMDsgKGogKyAxKSA8IGltYWdlLT5FeHRlbnNpb25CbG9ja0NvdW50OyArK2opIHsKKyAgICAgIGNvbnN0IEV4dGVuc2lvbkJsb2NrKiBjb25zdCBlYjEgPSBpbWFnZS0+RXh0ZW5zaW9uQmxvY2tzICsgajsKKyAgICAgIGNvbnN0IEV4dGVuc2lvbkJsb2NrKiBjb25zdCBlYjIgPSBpbWFnZS0+RXh0ZW5zaW9uQmxvY2tzICsgaiArIDE7CisgICAgICBjb25zdCBjaGFyKiBjb25zdCBzaWduYXR1cmUgPSAoY29uc3QgY2hhciopZWIxLT5CeXRlczsKKyAgICAgIGNvbnN0IGludCBzaWduYXR1cmVfaXNfb2sgPQorICAgICAgICAgIChlYjEtPkZ1bmN0aW9uID09IEFQUExJQ0FUSU9OX0VYVF9GVU5DX0NPREUpICYmCisgICAgICAgICAgKGViMS0+Qnl0ZUNvdW50ID09IDExKSAmJgorICAgICAgICAgICghbWVtY21wKHNpZ25hdHVyZSwgIk5FVFNDQVBFMi4wIiwgMTEpIHx8CisgICAgICAgICAgICFtZW1jbXAoc2lnbmF0dXJlLCAiQU5JTUVYVFMxLjAiLCAxMSkpOworICAgICAgaWYgKHNpZ25hdHVyZV9pc19vayAmJgorICAgICAgICAgIGViMi0+RnVuY3Rpb24gPT0gQ09OVElOVUVfRVhUX0ZVTkNfQ09ERSAmJiBlYjItPkJ5dGVDb3VudCA+PSAzICYmCisgICAgICAgICAgZWIyLT5CeXRlc1swXSA9PSAxKSB7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IGV4dHJhX2xvb3AgPSAoKHVpbnQzMl90KShlYjItPkJ5dGVzWzJdKSA8PCA4KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KShlYjItPkJ5dGVzWzFdKSA8PCAwKTsKKyAgICAgICAgcmV0dXJuIChleHRyYV9sb29wID4gMCkgPyBleHRyYV9sb29wICsgMSA6IDA7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiAxOyAgLy8gRGVmYXVsdC4KK30KKworLy8gR2V0IGR1cmF0aW9uIG9mICduJ3RoIGZyYW1lIGluIG1pbGxpc2Vjb25kcy4KK3N0YXRpYyBpbnQgR2V0RnJhbWVEdXJhdGlvbkdJRihHaWZGaWxlVHlwZSogZ2lmLCBpbnQgbikgeworICBHcmFwaGljc0NvbnRyb2xCbG9jayBnY2I7CisgIG1lbXNldCgmZ2NiLCAwLCBzaXplb2YoZ2NiKSk7CisgIERHaWZTYXZlZEV4dGVuc2lvblRvR0NCKGdpZiwgbiwgJmdjYik7CisgIHJldHVybiBnY2IuRGVsYXlUaW1lICogMTA7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZiBmcmFtZSAndGFyZ2V0JyBjb21wbGV0ZWx5IGNvdmVycyAnY292ZXJlZCcuCitzdGF0aWMgaW50IENvdmVyc0ZyYW1lR0lGKGNvbnN0IEdpZkltYWdlRGVzYyogY29uc3QgdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHaWZJbWFnZURlc2MqIGNvbnN0IGNvdmVyZWQpIHsKKyAgcmV0dXJuIHRhcmdldC0+TGVmdCA8PSBjb3ZlcmVkLT5MZWZ0ICYmCisgICAgICAgICBjb3ZlcmVkLT5MZWZ0ICsgY292ZXJlZC0+V2lkdGggPD0gdGFyZ2V0LT5MZWZ0ICsgdGFyZ2V0LT5XaWR0aCAmJgorICAgICAgICAgdGFyZ2V0LT5Ub3AgPD0gY292ZXJlZC0+VG9wICYmCisgICAgICAgICBjb3ZlcmVkLT5Ub3AgKyBjb3ZlcmVkLT5IZWlnaHQgPD0gdGFyZ2V0LT5Ub3AgKyB0YXJnZXQtPkhlaWdodDsKK30KKworc3RhdGljIHZvaWQgUmVtYXBQaXhlbHNHSUYoY29uc3QgdWludDhfdCogY29uc3Qgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29sb3JNYXBPYmplY3QqIGNvbnN0IGNtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJhbnNwYXJlbnRfY29sb3IsIGludCBsZW4sIHVpbnQ4X3QqIGRzdCkgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7CisgICAgaWYgKHNyY1tpXSAhPSB0cmFuc3BhcmVudF9jb2xvcikgeworICAgICAgLy8gSWYgYSBwaXhlbCBpbiB0aGUgY3VycmVudCBmcmFtZSBpcyB0cmFuc3BhcmVudCwgd2UgZG9uJ3QgbW9kaWZ5IGl0LCBzbworICAgICAgLy8gdGhhdCB3ZSBjYW4gc2VlLXRocm91Z2ggdGhlIGNvcnJlc3BvbmRpbmcgcGl4ZWwgZnJvbSBhbiBlYXJsaWVyIGZyYW1lLgorICAgICAgY29uc3QgR2lmQ29sb3JUeXBlIGMgPSBjbWFwLT5Db2xvcnNbc3JjW2ldXTsKKyAgICAgIGRzdFs0ICogaSArIDBdID0gYy5SZWQ7CisgICAgICBkc3RbNCAqIGkgKyAxXSA9IGMuR3JlZW47CisgICAgICBkc3RbNCAqIGkgKyAyXSA9IGMuQmx1ZTsKKyAgICAgIGRzdFs0ICogaSArIDNdID0gMHhmZjsKKyAgICB9CisgIH0KK30KKworc3RhdGljIGludCBSZWFkRnJhbWVHSUYoY29uc3QgU2F2ZWRJbWFnZSogY29uc3QgZ2lmX2ltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29sb3JNYXBPYmplY3QqIGNtYXAsIGludCB0cmFuc3BhcmVudF9jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdXRfc3RyaWRlLCB1aW50OF90KiBjb25zdCBkc3QpIHsKKyAgY29uc3QgR2lmSW1hZ2VEZXNjKiBpbWFnZV9kZXNjID0gJmdpZl9pbWFnZS0+SW1hZ2VEZXNjOworICBjb25zdCB1aW50OF90KiBpbjsKKyAgdWludDhfdCogb3V0OworICBpbnQgajsKKworICBpZiAoaW1hZ2VfZGVzYy0+Q29sb3JNYXApIGNtYXAgPSBpbWFnZV9kZXNjLT5Db2xvck1hcDsKKworICBpZiAoY21hcCA9PSBOVUxMIHx8IGNtYXAtPkNvbG9yQ291bnQgIT0gKDEgPDwgY21hcC0+Qml0c1BlclBpeGVsKSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiUG90ZW50aWFsbHkgY29ycnVwdCBjb2xvciBtYXAuXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGluID0gKGNvbnN0IHVpbnQ4X3QqKWdpZl9pbWFnZS0+UmFzdGVyQml0czsKKyAgb3V0ID0gZHN0ICsgaW1hZ2VfZGVzYy0+VG9wICogb3V0X3N0cmlkZSArIGltYWdlX2Rlc2MtPkxlZnQgKiBrTnVtQ2hhbm5lbHM7CisKKyAgZm9yIChqID0gMDsgaiA8IGltYWdlX2Rlc2MtPkhlaWdodDsgKytqKSB7CisgICAgUmVtYXBQaXhlbHNHSUYoaW4sIGNtYXAsIHRyYW5zcGFyZW50X2NvbG9yLCBpbWFnZV9kZXNjLT5XaWR0aCwgb3V0KTsKKyAgICBpbiArPSBpbWFnZV9kZXNjLT5XaWR0aDsKKyAgICBvdXQgKz0gb3V0X3N0cmlkZTsKKyAgfQorICByZXR1cm4gMTsKK30KKworLy8gUmVhZCBhbmltYXRlZCBHSUYgYml0c3RyZWFtIGZyb20gJ2ZpbGVuYW1lJyBpbnRvICdBbmltYXRlZEltYWdlJyBzdHJ1Y3QuCitzdGF0aWMgaW50IFJlYWRBbmltYXRlZEdJRihjb25zdCBjaGFyIGZpbGVuYW1lW10sIEFuaW1hdGVkSW1hZ2UqIGNvbnN0IGltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGR1bXBfZnJhbWVzLCBjb25zdCBjaGFyIGR1bXBfZm9sZGVyW10pIHsKKyAgdWludDMyX3QgZnJhbWVfY291bnQ7CisgIHVpbnQzMl90IGNhbnZhc193aWR0aCwgY2FudmFzX2hlaWdodDsKKyAgdWludDMyX3QgaTsKKyAgaW50IGdpZl9lcnJvcjsKKyAgR2lmRmlsZVR5cGUqIGdpZjsKKworICBnaWYgPSBER2lmT3BlbkZpbGVOYW1lKGZpbGVuYW1lLCBOVUxMKTsKKyAgaWYgKGdpZiA9PSBOVUxMKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgcmVhZCBmaWxlOiAlcy5cbiIsIGZpbGVuYW1lKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGdpZl9lcnJvciA9IERHaWZTbHVycChnaWYpOworICBpZiAoZ2lmX2Vycm9yICE9IEdJRl9PSykgeworICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IHBhcnNlIGltYWdlOiAlcy5cbiIsIGZpbGVuYW1lKTsKKyAgICBHSUZEaXNwbGF5RXJyb3IoZ2lmLCBnaWZfZXJyb3IpOworICAgIERHaWZDbG9zZUZpbGUoZ2lmLCBOVUxMKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vIEFuaW1hdGlvbiBwcm9wZXJ0aWVzLgorICBpbWFnZS0+Y2FudmFzX3dpZHRoID0gKHVpbnQzMl90KWdpZi0+U1dpZHRoOworICBpbWFnZS0+Y2FudmFzX2hlaWdodCA9ICh1aW50MzJfdClnaWYtPlNIZWlnaHQ7CisgIGlmIChpbWFnZS0+Y2FudmFzX3dpZHRoID4gTUFYX0NBTlZBU19TSVpFIHx8CisgICAgICBpbWFnZS0+Y2FudmFzX2hlaWdodCA+IE1BWF9DQU5WQVNfU0laRSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBjYW52YXMgZGltZW5zaW9uOiAlZCB4ICVkXG4iLAorICAgICAgICAgICAgaW1hZ2UtPmNhbnZhc193aWR0aCwgaW1hZ2UtPmNhbnZhc19oZWlnaHQpOworICAgIERHaWZDbG9zZUZpbGUoZ2lmLCBOVUxMKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpbWFnZS0+bG9vcF9jb3VudCA9IEdldExvb3BDb3VudEdJRihnaWYpOworICBpbWFnZS0+Ymdjb2xvciA9IEdldEJhY2tncm91bmRDb2xvckdJRihnaWYpOworCisgIGZyYW1lX2NvdW50ID0gKHVpbnQzMl90KWdpZi0+SW1hZ2VDb3VudDsKKyAgaWYgKGZyYW1lX2NvdW50ID09IDApIHsKKyAgICBER2lmQ2xvc2VGaWxlKGdpZiwgTlVMTCk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoaW1hZ2UtPmNhbnZhc193aWR0aCA9PSAwIHx8IGltYWdlLT5jYW52YXNfaGVpZ2h0ID09IDApIHsKKyAgICBpbWFnZS0+Y2FudmFzX3dpZHRoID0gZ2lmLT5TYXZlZEltYWdlc1swXS5JbWFnZURlc2MuV2lkdGg7CisgICAgaW1hZ2UtPmNhbnZhc19oZWlnaHQgPSBnaWYtPlNhdmVkSW1hZ2VzWzBdLkltYWdlRGVzYy5IZWlnaHQ7CisgICAgZ2lmLT5TYXZlZEltYWdlc1swXS5JbWFnZURlc2MuTGVmdCA9IDA7CisgICAgZ2lmLT5TYXZlZEltYWdlc1swXS5JbWFnZURlc2MuVG9wID0gMDsKKyAgICBpZiAoaW1hZ2UtPmNhbnZhc193aWR0aCA9PSAwIHx8IGltYWdlLT5jYW52YXNfaGVpZ2h0ID09IDApIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBjYW52YXMgc2l6ZSBpbiBHSUYuXG4iKTsKKyAgICAgIERHaWZDbG9zZUZpbGUoZ2lmLCBOVUxMKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorICAvLyBBbGxvY2F0ZSBmcmFtZXMuCisgIEFsbG9jYXRlRnJhbWVzKGltYWdlLCBmcmFtZV9jb3VudCk7CisKKyAgY2FudmFzX3dpZHRoID0gaW1hZ2UtPmNhbnZhc193aWR0aDsKKyAgY2FudmFzX2hlaWdodCA9IGltYWdlLT5jYW52YXNfaGVpZ2h0OworCisgIC8vIERlY29kZSBhbmQgcmVjb25zdHJ1Y3QgZnJhbWVzLgorICBmb3IgKGkgPSAwOyBpIDwgZnJhbWVfY291bnQ7ICsraSkgeworICAgIGNvbnN0IGludCBjYW52YXNfd2lkdGhfaW5fYnl0ZXMgPSBjYW52YXNfd2lkdGggKiBrTnVtQ2hhbm5lbHM7CisgICAgY29uc3QgU2F2ZWRJbWFnZSogY29uc3QgY3Vycl9naWZfaW1hZ2UgPSAmZ2lmLT5TYXZlZEltYWdlc1tpXTsKKyAgICBHcmFwaGljc0NvbnRyb2xCbG9jayBjdXJyX2djYjsKKyAgICBEZWNvZGVkRnJhbWUqIGN1cnJfZnJhbWU7CisgICAgdWludDhfdCogY3Vycl9yZ2JhOworCisgICAgbWVtc2V0KCZjdXJyX2djYiwgMCwgc2l6ZW9mKGN1cnJfZ2NiKSk7CisgICAgREdpZlNhdmVkRXh0ZW5zaW9uVG9HQ0IoZ2lmLCBpLCAmY3Vycl9nY2IpOworCisgICAgY3Vycl9mcmFtZSA9ICZpbWFnZS0+ZnJhbWVzW2ldOworICAgIGN1cnJfcmdiYSA9IGN1cnJfZnJhbWUtPnJnYmE7CisgICAgY3Vycl9mcmFtZS0+ZHVyYXRpb24gPSBHZXRGcmFtZUR1cmF0aW9uR0lGKGdpZiwgaSk7CisgICAgLy8gRm9yY2UgZnJhbWVzIHdpdGggYSBzbWFsbCBvciBubyBkdXJhdGlvbiB0byAxMDBtcyB0byBiZSBjb25zaXN0ZW50CisgICAgLy8gd2l0aCB3ZWIgYnJvd3NlcnMgYW5kIG90aGVyIHRyYW5zY29kaW5nIHRvb2xzIChsaWtlIGdpZjJ3ZWJwIGl0c2VsZikuCisgICAgaWYgKGN1cnJfZnJhbWUtPmR1cmF0aW9uIDw9IDEwKSBjdXJyX2ZyYW1lLT5kdXJhdGlvbiA9IDEwMDsKKworICAgIGlmIChpID09IDApIHsgIC8vIEluaXRpYWxpemUgYXMgdHJhbnNwYXJlbnQuCisgICAgICBjdXJyX2ZyYW1lLT5pc19rZXlfZnJhbWUgPSAxOworICAgICAgWmVyb0ZpbGxDYW52YXMoY3Vycl9yZ2JhLCBjYW52YXNfd2lkdGgsIGNhbnZhc19oZWlnaHQpOworICAgIH0gZWxzZSB7CisgICAgICBEZWNvZGVkRnJhbWUqIGNvbnN0IHByZXZfZnJhbWUgPSAmaW1hZ2UtPmZyYW1lc1tpIC0gMV07CisgICAgICBjb25zdCBHaWZJbWFnZURlc2MqIGNvbnN0IHByZXZfZGVzYyA9ICZnaWYtPlNhdmVkSW1hZ2VzW2kgLSAxXS5JbWFnZURlc2M7CisgICAgICBHcmFwaGljc0NvbnRyb2xCbG9jayBwcmV2X2djYjsKKyAgICAgIG1lbXNldCgmcHJldl9nY2IsIDAsIHNpemVvZihwcmV2X2djYikpOworICAgICAgREdpZlNhdmVkRXh0ZW5zaW9uVG9HQ0IoZ2lmLCBpIC0gMSwgJnByZXZfZ2NiKTsKKworICAgICAgY3Vycl9mcmFtZS0+aXNfa2V5X2ZyYW1lID0KKyAgICAgICAgICBJc0tleUZyYW1lR0lGKHByZXZfZGVzYywgcHJldl9nY2IuRGlzcG9zYWxNb2RlLCBwcmV2X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzX3dpZHRoLCBjYW52YXNfaGVpZ2h0KTsKKworICAgICAgaWYgKGN1cnJfZnJhbWUtPmlzX2tleV9mcmFtZSkgeyAgLy8gSW5pdGlhbGl6ZSBhcyB0cmFuc3BhcmVudC4KKyAgICAgICAgWmVyb0ZpbGxDYW52YXMoY3Vycl9yZ2JhLCBjYW52YXNfd2lkdGgsIGNhbnZhc19oZWlnaHQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IHByZXZfZnJhbWVfZGlzcG9zZWQsIGN1cnJfZnJhbWVfb3BhcXVlOworICAgICAgICBpbnQgcHJldl9mcmFtZV9jb21wbGV0ZWx5X2NvdmVyZWQ7CisgICAgICAgIC8vIEluaXRpYWxpemUgd2l0aCBwcmV2aW91cyBjYW52YXMuCisgICAgICAgIHVpbnQ4X3QqIGNvbnN0IHByZXZfcmdiYSA9IGltYWdlLT5mcmFtZXNbaSAtIDFdLnJnYmE7CisgICAgICAgIENvcHlDYW52YXMocHJldl9yZ2JhLCBjdXJyX3JnYmEsIGNhbnZhc193aWR0aCwgY2FudmFzX2hlaWdodCk7CisKKyAgICAgICAgLy8gRGlzcG9zZSBwcmV2aW91cyBmcmFtZSByZWN0YW5nbGUuCisgICAgICAgIHByZXZfZnJhbWVfZGlzcG9zZWQgPQorICAgICAgICAgICAgKHByZXZfZ2NiLkRpc3Bvc2FsTW9kZSA9PSBESVNQT1NFX0JBQ0tHUk9VTkQgfHwKKyAgICAgICAgICAgICBwcmV2X2djYi5EaXNwb3NhbE1vZGUgPT0gRElTUE9TRV9QUkVWSU9VUyk7CisgICAgICAgIGN1cnJfZnJhbWVfb3BhcXVlID0KKyAgICAgICAgICAgIChjdXJyX2djYi5UcmFuc3BhcmVudENvbG9yID09IE5PX1RSQU5TUEFSRU5UX0NPTE9SKTsKKyAgICAgICAgcHJldl9mcmFtZV9jb21wbGV0ZWx5X2NvdmVyZWQgPQorICAgICAgICAgICAgY3Vycl9mcmFtZV9vcGFxdWUgJiYKKyAgICAgICAgICAgIENvdmVyc0ZyYW1lR0lGKCZjdXJyX2dpZl9pbWFnZS0+SW1hZ2VEZXNjLCBwcmV2X2Rlc2MpOworCisgICAgICAgIGlmIChwcmV2X2ZyYW1lX2Rpc3Bvc2VkICYmICFwcmV2X2ZyYW1lX2NvbXBsZXRlbHlfY292ZXJlZCkgeworICAgICAgICAgIHN3aXRjaCAocHJldl9nY2IuRGlzcG9zYWxNb2RlKSB7CisgICAgICAgICAgICBjYXNlIERJU1BPU0VfQkFDS0dST1VORDogeworICAgICAgICAgICAgICBaZXJvRmlsbEZyYW1lUmVjdChjdXJyX3JnYmEsIGNhbnZhc193aWR0aF9pbl9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldl9kZXNjLT5MZWZ0LCBwcmV2X2Rlc2MtPlRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldl9kZXNjLT5XaWR0aCwgcHJldl9kZXNjLT5IZWlnaHQpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgRElTUE9TRV9QUkVWSU9VUzogeworICAgICAgICAgICAgICBpbnQgc3JjX2ZyYW1lX251bSA9IGkgLSAyOworICAgICAgICAgICAgICB3aGlsZSAoc3JjX2ZyYW1lX251bSA+PSAwKSB7CisgICAgICAgICAgICAgICAgR3JhcGhpY3NDb250cm9sQmxvY2sgc3JjX2ZyYW1lX2djYjsKKyAgICAgICAgICAgICAgICBtZW1zZXQoJnNyY19mcmFtZV9nY2IsIDAsIHNpemVvZihzcmNfZnJhbWVfZ2NiKSk7CisgICAgICAgICAgICAgICAgREdpZlNhdmVkRXh0ZW5zaW9uVG9HQ0IoZ2lmLCBzcmNfZnJhbWVfbnVtLCAmc3JjX2ZyYW1lX2djYik7CisgICAgICAgICAgICAgICAgaWYgKHNyY19mcmFtZV9nY2IuRGlzcG9zYWxNb2RlICE9IERJU1BPU0VfUFJFVklPVVMpIGJyZWFrOworICAgICAgICAgICAgICAgIC0tc3JjX2ZyYW1lX251bTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZiAoc3JjX2ZyYW1lX251bSA+PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gUmVzdG9yZSBwaXhlbHMgaW5zaWRlIHByZXZpb3VzIGZyYW1lIHJlY3RhbmdsZSB0bworICAgICAgICAgICAgICAgIC8vIGNvcnJlc3BvbmRpbmcgcGl4ZWxzIGluIHNvdXJjZSBjYW52YXMuCisgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3Qgc3JjX2ZyYW1lX3JnYmEgPQorICAgICAgICAgICAgICAgICAgICBpbWFnZS0+ZnJhbWVzW3NyY19mcmFtZV9udW1dLnJnYmE7CisgICAgICAgICAgICAgICAgQ29weUZyYW1lUmVjdGFuZ2xlKHNyY19mcmFtZV9yZ2JhLCBjdXJyX3JnYmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhc193aWR0aF9pbl9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldl9kZXNjLT5MZWZ0LCBwcmV2X2Rlc2MtPlRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldl9kZXNjLT5XaWR0aCwgcHJldl9kZXNjLT5IZWlnaHQpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFNvdXJjZSBjYW52YXMgZG9lc24ndCBleGlzdC4gU28gY2xlYXIgcHJldmlvdXMgZnJhbWUKKyAgICAgICAgICAgICAgICAvLyByZWN0YW5nbGUgdG8gYmFja2dyb3VuZC4KKyAgICAgICAgICAgICAgICBaZXJvRmlsbEZyYW1lUmVjdChjdXJyX3JnYmEsIGNhbnZhc193aWR0aF9pbl9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X2Rlc2MtPkxlZnQsIHByZXZfZGVzYy0+VG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZfZGVzYy0+V2lkdGgsIHByZXZfZGVzYy0+SGVpZ2h0KTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIGJyZWFrOyAgLy8gTm90aGluZyB0byBkby4KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBEZWNvZGUgY3VycmVudCBmcmFtZS4KKyAgICBpZiAoIVJlYWRGcmFtZUdJRihjdXJyX2dpZl9pbWFnZSwgZ2lmLT5TQ29sb3JNYXAsIGN1cnJfZ2NiLlRyYW5zcGFyZW50Q29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgY2FudmFzX3dpZHRoX2luX2J5dGVzLCBjdXJyX3JnYmEpKSB7CisgICAgICBER2lmQ2xvc2VGaWxlKGdpZiwgTlVMTCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoZHVtcF9mcmFtZXMpIHsKKyAgICAgIGlmICghRHVtcEZyYW1lKGZpbGVuYW1lLCBkdW1wX2ZvbGRlciwgaSwgY3Vycl9yZ2JhLAorICAgICAgICAgICAgICAgICAgICAgY2FudmFzX3dpZHRoLCBjYW52YXNfaGVpZ2h0KSkgeworICAgICAgICBER2lmQ2xvc2VGaWxlKGdpZiwgTlVMTCk7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgIH0KKyAgfQorICBER2lmQ2xvc2VGaWxlKGdpZiwgTlVMTCk7CisgIHJldHVybiAxOworfQorCisjZWxzZQorCitzdGF0aWMgaW50IElzR0lGKGNvbnN0IFdlYlBEYXRhKiBjb25zdCBkYXRhKSB7CisgICh2b2lkKWRhdGE7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IFJlYWRBbmltYXRlZEdJRihjb25zdCBjaGFyIGZpbGVuYW1lW10sIEFuaW1hdGVkSW1hZ2UqIGNvbnN0IGltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGR1bXBfZnJhbWVzLCBjb25zdCBjaGFyIGR1bXBfZm9sZGVyW10pIHsKKyAgKHZvaWQpZmlsZW5hbWU7CisgICh2b2lkKWltYWdlOworICAodm9pZClkdW1wX2ZyYW1lczsKKyAgKHZvaWQpZHVtcF9mb2xkZXI7CisgIGZwcmludGYoc3RkZXJyLCAiR0lGIHN1cHBvcnQgbm90IGNvbXBpbGVkLiBQbGVhc2UgaW5zdGFsbCB0aGUgbGliZ2lmLWRldiAiCisgICAgICAgICAgInBhY2thZ2UgYmVmb3JlIGJ1aWxkaW5nLlxuIik7CisgIHJldHVybiAwOworfQorCisjZW5kaWYgIC8vIFdFQlBfSEFWRV9HSUYKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IFJlYWRBbmltYXRlZEltYWdlKGNvbnN0IGNoYXIgZmlsZW5hbWVbXSwgQW5pbWF0ZWRJbWFnZSogY29uc3QgaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGR1bXBfZnJhbWVzLCBjb25zdCBjaGFyIGR1bXBfZm9sZGVyW10pIHsKKyAgaW50IG9rID0gMDsKKyAgV2ViUERhdGEgd2VicF9kYXRhOworCisgIFdlYlBEYXRhSW5pdCgmd2VicF9kYXRhKTsKKyAgbWVtc2V0KGltYWdlLCAwLCBzaXplb2YoKmltYWdlKSk7CisKKyAgaWYgKCFJbWdJb1V0aWxSZWFkRmlsZShmaWxlbmFtZSwgJndlYnBfZGF0YS5ieXRlcywgJndlYnBfZGF0YS5zaXplKSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgcmVhZGluZyBmaWxlOiAlc1xuIiwgZmlsZW5hbWUpOworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKElzV2ViUCgmd2VicF9kYXRhKSkgeworICAgIG9rID0gUmVhZEFuaW1hdGVkV2ViUChmaWxlbmFtZSwgJndlYnBfZGF0YSwgaW1hZ2UsIGR1bXBfZnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkdW1wX2ZvbGRlcik7CisgIH0gZWxzZSBpZiAoSXNHSUYoJndlYnBfZGF0YSkpIHsKKyAgICBvayA9IFJlYWRBbmltYXRlZEdJRihmaWxlbmFtZSwgaW1hZ2UsIGR1bXBfZnJhbWVzLCBkdW1wX2ZvbGRlcik7CisgIH0gZWxzZSB7CisgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAiVW5rbm93biBmaWxlIHR5cGU6ICVzLiBTdXBwb3J0ZWQgZmlsZSB0eXBlcyBhcmUgV2ViUCBhbmQgR0lGXG4iLAorICAgICAgICAgICAgZmlsZW5hbWUpOworICAgIG9rID0gMDsKKyAgfQorICBpZiAoIW9rKSBDbGVhckFuaW1hdGVkSW1hZ2UoaW1hZ2UpOworICBXZWJQRGF0YUNsZWFyKCZ3ZWJwX2RhdGEpOworICByZXR1cm4gb2s7Cit9CisKK3N0YXRpYyB2b2lkIEFjY3VtdWxhdGUoZG91YmxlIHYxLCBkb3VibGUgdjIsIGRvdWJsZSogY29uc3QgbWF4X2RpZmYsCisgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogY29uc3Qgc3NlKSB7CisgIGNvbnN0IGRvdWJsZSBkaWZmID0gZmFicyh2MSAtIHYyKTsKKyAgaWYgKGRpZmYgPiAqbWF4X2RpZmYpICptYXhfZGlmZiA9IGRpZmY7CisgICpzc2UgKz0gZGlmZiAqIGRpZmY7Cit9CisKK3ZvaWQgR2V0RGlmZkFuZFBTTlIoY29uc3QgdWludDhfdCByZ2JhMVtdLCBjb25zdCB1aW50OF90IHJnYmEyW10sCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBwcmVtdWx0aXBseSwKKyAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBtYXhfZGlmZiwgZG91YmxlKiBjb25zdCBwc25yKSB7CisgIGNvbnN0IHVpbnQzMl90IHN0cmlkZSA9IHdpZHRoICoga051bUNoYW5uZWxzOworICBjb25zdCBpbnQga0FscGhhQ2hhbm5lbCA9IGtOdW1DaGFubmVscyAtIDE7CisgIGRvdWJsZSBmX21heF9kaWZmID0gMC47CisgIGRvdWJsZSBzc2UgPSAwLjsKKyAgdWludDMyX3QgeCwgeTsKKyAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CisgICAgZm9yICh4ID0gMDsgeCA8IHN0cmlkZTsgeCArPSBrTnVtQ2hhbm5lbHMpIHsKKyAgICAgIGludCBrOworICAgICAgY29uc3Qgc2l6ZV90IG9mZnNldCA9IChzaXplX3QpeSAqIHN0cmlkZSArIHg7CisgICAgICBjb25zdCBpbnQgYWxwaGExID0gcmdiYTFbb2Zmc2V0ICsga0FscGhhQ2hhbm5lbF07CisgICAgICBjb25zdCBpbnQgYWxwaGEyID0gcmdiYTJbb2Zmc2V0ICsga0FscGhhQ2hhbm5lbF07CisgICAgICBBY2N1bXVsYXRlKGFscGhhMSwgYWxwaGEyLCAmZl9tYXhfZGlmZiwgJnNzZSk7CisgICAgICBpZiAoIXByZW11bHRpcGx5KSB7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCBrQWxwaGFDaGFubmVsOyArK2spIHsKKyAgICAgICAgICBBY2N1bXVsYXRlKHJnYmExW29mZnNldCArIGtdLCByZ2JhMltvZmZzZXQgKyBrXSwgJmZfbWF4X2RpZmYsICZzc2UpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBwcmVtdWx0aXBseSBSL0cvQiBjaGFubmVscyB3aXRoIGFscGhhIHZhbHVlCisgICAgICAgIGZvciAoayA9IDA7IGsgPCBrQWxwaGFDaGFubmVsOyArK2spIHsKKyAgICAgICAgICBBY2N1bXVsYXRlKHJnYmExW29mZnNldCArIGtdICogYWxwaGExIC8gMjU1LiwKKyAgICAgICAgICAgICAgICAgICAgIHJnYmEyW29mZnNldCArIGtdICogYWxwaGEyIC8gMjU1LiwKKyAgICAgICAgICAgICAgICAgICAgICZmX21heF9kaWZmLCAmc3NlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICAqbWF4X2RpZmYgPSAoaW50KWZfbWF4X2RpZmY7CisgIGlmICgqbWF4X2RpZmYgPT0gMCkgeworICAgICpwc25yID0gOTkuOyAgLy8gUFNOUiB3aGVuIGltYWdlcyBhcmUgaWRlbnRpY2FsLgorICB9IGVsc2UgeworICAgIHNzZSAvPSBzdHJpZGUgKiBoZWlnaHQ7CisgICAgKnBzbnIgPSA0LjM0Mjk0NDggKiBsb2coMjU1LiAqIDI1NS4gLyBzc2UpOworICB9Cit9CisKK3ZvaWQgR2V0QW5pbWF0ZWRJbWFnZVZlcnNpb25zKGludCogY29uc3QgZGVjb2Rlcl92ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBkZW11eF92ZXJzaW9uKSB7CisgICpkZWNvZGVyX3ZlcnNpb24gPSBXZWJQR2V0RGVjb2RlclZlcnNpb24oKTsKKyAgKmRlbXV4X3ZlcnNpb24gPSBXZWJQR2V0RGVtdXhWZXJzaW9uKCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy9hbmltX3V0aWwuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL2FuaW1fdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNjMxMjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy9hbmltX3V0aWwuaApAQCAtMCwwICsxLDY3IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVXRpbGl0aWVzIGZvciBhbmltYXRlZCBpbWFnZXMKKworI2lmbmRlZiBXRUJQX0VYQU1QTEVTX0FOSU1fVVRJTF9IXworI2RlZmluZSBXRUJQX0VYQU1QTEVTX0FOSU1fVVRJTF9IXworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgIndlYnAvY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgIndlYnAvdHlwZXMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQ4X3QqIHJnYmE7ICAgICAgICAgLy8gRGVjb2RlZCBhbmQgcmVjb25zdHJ1Y3RlZCBmdWxsIGZyYW1lLgorICBpbnQgZHVyYXRpb247ICAgICAgICAgIC8vIEZyYW1lIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcy4KKyAgaW50IGlzX2tleV9mcmFtZTsgICAgICAvLyBUcnVlIGlmIHRoaXMgZnJhbWUgaXMgYSBrZXktZnJhbWUuCit9IERlY29kZWRGcmFtZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MzJfdCBjYW52YXNfd2lkdGg7CisgIHVpbnQzMl90IGNhbnZhc19oZWlnaHQ7CisgIHVpbnQzMl90IGJnY29sb3I7CisgIHVpbnQzMl90IGxvb3BfY291bnQ7CisgIERlY29kZWRGcmFtZSogZnJhbWVzOworICB1aW50MzJfdCBudW1fZnJhbWVzOworICB2b2lkKiByYXdfbWVtOworfSBBbmltYXRlZEltYWdlOworCisvLyBEZWFsbG9jYXRlIGV2ZXJ5dGhpbmcgaW4gJ2ltYWdlJyAoYnV0IG5vdCB0aGUgb2JqZWN0IGl0c2VsZikuCit2b2lkIENsZWFyQW5pbWF0ZWRJbWFnZShBbmltYXRlZEltYWdlKiBjb25zdCBpbWFnZSk7CisKKy8vIFJlYWQgYW5pbWF0ZWQgaW1hZ2UgZmlsZSBpbnRvICdBbmltYXRlZEltYWdlJyBzdHJ1Y3QuCisvLyBJZiAnZHVtcF9mcmFtZXMnIGlzIHRydWUsIGR1bXAgZnJhbWVzIHRvICdkdW1wX2ZvbGRlcicuCisvLyBQcmV2aW91cyBjb250ZW50IG9mICdpbWFnZScgaXMgb2JsaXRlcmF0ZWQuCisvLyBVcG9uIHN1Y2Nlc3NmdWwgcmV0dXJuLCBjb250ZW50IG9mICdpbWFnZScgbXVzdCBiZSBkZWxldGVkIGJ5CisvLyBjYWxsaW5nICdDbGVhckFuaW1hdGVkSW1hZ2UnLgoraW50IFJlYWRBbmltYXRlZEltYWdlKGNvbnN0IGNoYXIgZmlsZW5hbWVbXSwgQW5pbWF0ZWRJbWFnZSogY29uc3QgaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGR1bXBfZnJhbWVzLCBjb25zdCBjaGFyIGR1bXBfZm9sZGVyW10pOworCisvLyBHaXZlbiB0d28gUkdCQSBidWZmZXJzLCBjYWxjdWxhdGUgbWF4IHBpeGVsIGRpZmZlcmVuY2UgYW5kIFBTTlIuCisvLyBJZiAncHJlbXVsdGlwbHknIGlzIHRydWUsIFIvRy9CIHZhbHVlcyB3aWxsIGJlIHByZS1tdWx0aXBsaWVkIGJ5IHRoZQorLy8gdHJhbnNwYXJlbmN5IGJlZm9yZSBjb21wYXJpc29uLgordm9pZCBHZXREaWZmQW5kUFNOUihjb25zdCB1aW50OF90IHJnYmExW10sIGNvbnN0IHVpbnQ4X3QgcmdiYTJbXSwKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IHByZW11bHRpcGx5LAorICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IG1heF9kaWZmLCBkb3VibGUqIGNvbnN0IHBzbnIpOworCisvLyBSZXR1cm4gbGlicmFyeSB2ZXJzaW9ucyB1c2VkIGJ5IGFuaW1fdXRpbC4KK3ZvaWQgR2V0QW5pbWF0ZWRJbWFnZVZlcnNpb25zKGludCogY29uc3QgZGVjb2Rlcl92ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBkZW11eF92ZXJzaW9uKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8vIFdFQlBfRVhBTVBMRVNfQU5JTV9VVElMX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy9jd2VicC5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvY3dlYnAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTcxOTBiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvY3dlYnAuYwpAQCAtMCwwICsxLDExMzEgQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgc2ltcGxlIGNvbW1hbmQgbGluZSBjYWxsaW5nIHRoZSBXZWJQRW5jb2RlIGZ1bmN0aW9uLgorLy8gIEVuY29kZXMgYSByYXcgLllVViBpbnRvIFdlYlAgYml0c3RyZWFtCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAid2VicC9jb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiLi4vZXhhbXBsZXMvZXhhbXBsZV91dGlsLmgiCisjaW5jbHVkZSAiLi4vaW1hZ2Vpby9pbWFnZV9kZWMuaCIKKyNpbmNsdWRlICIuLi9pbWFnZWlvL2ltYWdlaW9fdXRpbC5oIgorI2luY2x1ZGUgIi4vc3RvcHdhdGNoLmgiCisjaW5jbHVkZSAid2VicC9lbmNvZGUuaCIKKworI2lmbmRlZiBXRUJQX0RMTAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitleHRlcm4gdm9pZCogVlA4R2V0Q1BVSW5mbzsgICAvLyBvcGFxdWUgZm9yd2FyZCBkZWNsYXJhdGlvbi4KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorI2VuZGlmICAvLyBXRUJQX0RMTAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50IHZlcmJvc2UgPSAwOworCitzdGF0aWMgaW50IFJlYWRZVVYoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICBXZWJQUGljdHVyZSogY29uc3QgcGljKSB7CisgIGNvbnN0IGludCB1c2VfYXJnYiA9IHBpYy0+dXNlX2FyZ2I7CisgIGNvbnN0IGludCB1dl93aWR0aCA9IChwaWMtPndpZHRoICsgMSkgLyAyOworICBjb25zdCBpbnQgdXZfaGVpZ2h0ID0gKHBpYy0+aGVpZ2h0ICsgMSkgLyAyOworICBjb25zdCBpbnQgeV9wbGFuZV9zaXplID0gcGljLT53aWR0aCAqIHBpYy0+aGVpZ2h0OworICBjb25zdCBpbnQgdXZfcGxhbmVfc2l6ZSA9IHV2X3dpZHRoICogdXZfaGVpZ2h0OworICBjb25zdCBzaXplX3QgZXhwZWN0ZWRfZGF0YV9zaXplID0geV9wbGFuZV9zaXplICsgMiAqIHV2X3BsYW5lX3NpemU7CisKKyAgaWYgKGRhdGFfc2l6ZSAhPSBleHBlY3RlZF9kYXRhX3NpemUpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICJpbnB1dCBkYXRhIGRvZXNuJ3QgaGF2ZSB0aGUgZXhwZWN0ZWQgc2l6ZSAoJWQgaW5zdGVhZCBvZiAlZClcbiIsCisgICAgICAgICAgICAoaW50KWRhdGFfc2l6ZSwgKGludClleHBlY3RlZF9kYXRhX3NpemUpOworICAgIHJldHVybiAwOworICB9CisKKyAgcGljLT51c2VfYXJnYiA9IDA7CisgIGlmICghV2ViUFBpY3R1cmVBbGxvYyhwaWMpKSByZXR1cm4gMDsKKyAgSW1nSW9VdGlsQ29weVBsYW5lKGRhdGEsIHBpYy0+d2lkdGgsIHBpYy0+eSwgcGljLT55X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgIHBpYy0+d2lkdGgsIHBpYy0+aGVpZ2h0KTsKKyAgSW1nSW9VdGlsQ29weVBsYW5lKGRhdGEgKyB5X3BsYW5lX3NpemUsIHV2X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgcGljLT51LCBwaWMtPnV2X3N0cmlkZSwgdXZfd2lkdGgsIHV2X2hlaWdodCk7CisgIEltZ0lvVXRpbENvcHlQbGFuZShkYXRhICsgeV9wbGFuZV9zaXplICsgdXZfcGxhbmVfc2l6ZSwgdXZfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICBwaWMtPnYsIHBpYy0+dXZfc3RyaWRlLCB1dl93aWR0aCwgdXZfaGVpZ2h0KTsKKyAgcmV0dXJuIHVzZV9hcmdiID8gV2ViUFBpY3R1cmVZVVZBVG9BUkdCKHBpYykgOiAxOworfQorCisjaWZkZWYgSEFWRV9XSU5DT0RFQ19ICisKK3N0YXRpYyBpbnQgUmVhZFBpY3R1cmUoY29uc3QgY2hhciogY29uc3QgZmlsZW5hbWUsIFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBrZWVwX2FscGhhLCBNZXRhZGF0YSogY29uc3QgbWV0YWRhdGEpIHsKKyAgaW50IG9rID0gMDsKKyAgY29uc3QgdWludDhfdCogZGF0YSA9IE5VTEw7CisgIHNpemVfdCBkYXRhX3NpemUgPSAwOworICBpZiAocGljLT53aWR0aCAhPSAwICYmIHBpYy0+aGVpZ2h0ICE9IDApIHsKKyAgICBvayA9IEltZ0lvVXRpbFJlYWRGaWxlKGZpbGVuYW1lLCAmZGF0YSwgJmRhdGFfc2l6ZSk7CisgICAgb2sgPSBvayAmJiBSZWFkWVVWKGRhdGEsIGRhdGFfc2l6ZSwgcGljKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBJZiBubyBzaXplIHNwZWNpZmllZCwgdHJ5IHRvIGRlY29kZSBpdCB1c2luZyBXSUMuCisgICAgb2sgPSBSZWFkUGljdHVyZVdpdGhXSUMoZmlsZW5hbWUsIHBpYywga2VlcF9hbHBoYSwgbWV0YWRhdGEpOworICAgIGlmICghb2spIHsKKyAgICAgIG9rID0gSW1nSW9VdGlsUmVhZEZpbGUoZmlsZW5hbWUsICZkYXRhLCAmZGF0YV9zaXplKTsKKyAgICAgIG9rID0gb2sgJiYgUmVhZFdlYlAoZGF0YSwgZGF0YV9zaXplLCBwaWMsIGtlZXBfYWxwaGEsIG1ldGFkYXRhKTsKKyAgICB9CisgIH0KKyAgaWYgKCFvaykgeworICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IhIENvdWxkIG5vdCBwcm9jZXNzIGZpbGUgJXNcbiIsIGZpbGVuYW1lKTsKKyAgfQorICBmcmVlKCh2b2lkKilkYXRhKTsKKyAgcmV0dXJuIG9rOworfQorCisjZWxzZSAgLy8gIUhBVkVfV0lOQ09ERUNfSAorCitzdGF0aWMgaW50IFJlYWRQaWN0dXJlKGNvbnN0IGNoYXIqIGNvbnN0IGZpbGVuYW1lLCBXZWJQUGljdHVyZSogY29uc3QgcGljLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQga2VlcF9hbHBoYSwgTWV0YWRhdGEqIGNvbnN0IG1ldGFkYXRhKSB7CisgIGNvbnN0IHVpbnQ4X3QqIGRhdGEgPSBOVUxMOworICBzaXplX3QgZGF0YV9zaXplID0gMDsKKyAgaW50IG9rID0gMDsKKworICBvayA9IEltZ0lvVXRpbFJlYWRGaWxlKGZpbGVuYW1lLCAmZGF0YSwgJmRhdGFfc2l6ZSk7CisgIGlmICghb2spIGdvdG8gRW5kOworCisgIGlmIChwaWMtPndpZHRoID09IDAgfHwgcGljLT5oZWlnaHQgPT0gMCkgeworICAgIFdlYlBJbWFnZVJlYWRlciByZWFkZXIgPSBXZWJQR3Vlc3NJbWFnZVJlYWRlcihkYXRhLCBkYXRhX3NpemUpOworICAgIG9rID0gcmVhZGVyKGRhdGEsIGRhdGFfc2l6ZSwgcGljLCBrZWVwX2FscGhhLCBtZXRhZGF0YSk7CisgIH0gZWxzZSB7CisgICAgLy8gSWYgaW1hZ2Ugc2l6ZSBpcyBzcGVjaWZpZWQsIGluZmVyIGl0IGFzIFlVViBmb3JtYXQuCisgICAgb2sgPSBSZWFkWVVWKGRhdGEsIGRhdGFfc2l6ZSwgcGljKTsKKyAgfQorIEVuZDoKKyAgaWYgKCFvaykgeworICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IhIENvdWxkIG5vdCBwcm9jZXNzIGZpbGUgJXNcbiIsIGZpbGVuYW1lKTsKKyAgfQorICBmcmVlKCh2b2lkKilkYXRhKTsKKyAgcmV0dXJuIG9rOworfQorCisjZW5kaWYgIC8vICFIQVZFX1dJTkNPREVDX0gKKworc3RhdGljIHZvaWQgQWxsb2NFeHRyYUluZm8oV2ViUFBpY3R1cmUqIGNvbnN0IHBpYykgeworICBjb25zdCBpbnQgbWJfdyA9IChwaWMtPndpZHRoICsgMTUpIC8gMTY7CisgIGNvbnN0IGludCBtYl9oID0gKHBpYy0+aGVpZ2h0ICsgMTUpIC8gMTY7CisgIHBpYy0+ZXh0cmFfaW5mbyA9ICh1aW50OF90KiltYWxsb2MobWJfdyAqIG1iX2ggKiBzaXplb2YoKnBpYy0+ZXh0cmFfaW5mbykpOworfQorCitzdGF0aWMgdm9pZCBQcmludEJ5dGVDb3VudChjb25zdCBpbnQgYnl0ZXNbNF0sIGludCB0b3RhbF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCB0b3RhbHMpIHsKKyAgaW50IHM7CisgIGludCB0b3RhbCA9IDA7CisgIGZvciAocyA9IDA7IHMgPCA0OyArK3MpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgInwgJTdkICIsIGJ5dGVzW3NdKTsKKyAgICB0b3RhbCArPSBieXRlc1tzXTsKKyAgICBpZiAodG90YWxzKSB0b3RhbHNbc10gKz0gYnl0ZXNbc107CisgIH0KKyAgZnByaW50ZihzdGRlcnIsICJ8ICU3ZCAgKCUuMWYlJSlcbiIsIHRvdGFsLCAxMDAuZiAqIHRvdGFsIC8gdG90YWxfc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkIFByaW50UGVyY2VudHMoY29uc3QgaW50IGNvdW50c1s0XSkgeworICBpbnQgczsKKyAgY29uc3QgaW50IHRvdGFsID0gY291bnRzWzBdICsgY291bnRzWzFdICsgY291bnRzWzJdICsgY291bnRzWzNdOworICBmb3IgKHMgPSAwOyBzIDwgNDsgKytzKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJ8ICAgICAgJTJkJSUiLCAoaW50KSgxMDAuICogY291bnRzW3NdIC8gdG90YWwgKyAuNSkpOworICB9CisgIGZwcmludGYoc3RkZXJyLCAifCAlN2RcbiIsIHRvdGFsKTsKK30KKworc3RhdGljIHZvaWQgUHJpbnRWYWx1ZXMoY29uc3QgaW50IHZhbHVlc1s0XSkgeworICBpbnQgczsKKyAgZm9yIChzID0gMDsgcyA8IDQ7ICsrcykgeworICAgIGZwcmludGYoc3RkZXJyLCAifCAlN2QgIiwgdmFsdWVzW3NdKTsKKyAgfQorICBmcHJpbnRmKHN0ZGVyciwgInxcbiIpOworfQorCitzdGF0aWMgdm9pZCBQcmludEZ1bGxMb3NzbGVzc0luZm8oY29uc3QgV2ViUEF1eFN0YXRzKiBjb25zdCBzdGF0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjb25zdCBkZXNjcmlwdGlvbikgeworICBmcHJpbnRmKHN0ZGVyciwgIkxvc3NsZXNzLSVzIGNvbXByZXNzZWQgc2l6ZTogJWQgYnl0ZXNcbiIsCisgICAgICAgICAgZGVzY3JpcHRpb24sIHN0YXRzLT5sb3NzbGVzc19zaXplKTsKKyAgZnByaW50ZihzdGRlcnIsICIgICogSGVhZGVyIHNpemU6ICVkIGJ5dGVzLCBpbWFnZSBkYXRhIHNpemU6ICVkXG4iLAorICAgICAgICAgIHN0YXRzLT5sb3NzbGVzc19oZHJfc2l6ZSwgc3RhdHMtPmxvc3NsZXNzX2RhdGFfc2l6ZSk7CisgIGlmIChzdGF0cy0+bG9zc2xlc3NfZmVhdHVyZXMpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgKiBMb3NzbGVzcyBmZWF0dXJlcyB1c2VkOiIpOworICAgIGlmIChzdGF0cy0+bG9zc2xlc3NfZmVhdHVyZXMgJiAxKSBmcHJpbnRmKHN0ZGVyciwgIiBQUkVESUNUSU9OIik7CisgICAgaWYgKHN0YXRzLT5sb3NzbGVzc19mZWF0dXJlcyAmIDIpIGZwcmludGYoc3RkZXJyLCAiIENST1NTLUNPTE9SLVRSQU5TRk9STSIpOworICAgIGlmIChzdGF0cy0+bG9zc2xlc3NfZmVhdHVyZXMgJiA0KSBmcHJpbnRmKHN0ZGVyciwgIiBTVUJUUkFDVC1HUkVFTiIpOworICAgIGlmIChzdGF0cy0+bG9zc2xlc3NfZmVhdHVyZXMgJiA4KSBmcHJpbnRmKHN0ZGVyciwgIiBQQUxFVFRFIik7CisgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOworICB9CisgIGZwcmludGYoc3RkZXJyLCAiICAqIFByZWNpc2lvbiBCaXRzOiBoaXN0b2dyYW09JWQgdHJhbnNmb3JtPSVkIGNhY2hlPSVkXG4iLAorICAgICAgICAgIHN0YXRzLT5oaXN0b2dyYW1fYml0cywgc3RhdHMtPnRyYW5zZm9ybV9iaXRzLCBzdGF0cy0+Y2FjaGVfYml0cyk7CisgIGlmIChzdGF0cy0+cGFsZXR0ZV9zaXplID4gMCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiICAqIFBhbGV0dGUgc2l6ZTogICAlZFxuIiwgc3RhdHMtPnBhbGV0dGVfc2l6ZSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgUHJpbnRFeHRyYUluZm9Mb3NzbGVzcyhjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2hvcnRfb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjb25zdCBmaWxlX25hbWUpIHsKKyAgY29uc3QgV2ViUEF1eFN0YXRzKiBjb25zdCBzdGF0cyA9IHBpYy0+c3RhdHM7CisgIGlmIChzaG9ydF9vdXRwdXQpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiU3ZCAlMi4yZlxuIiwgc3RhdHMtPmNvZGVkX3NpemUsIHN0YXRzLT5QU05SWzNdKTsKKyAgfSBlbHNlIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkZpbGU6ICAgICAgJXNcbiIsIGZpbGVfbmFtZSk7CisgICAgZnByaW50ZihzdGRlcnIsICJEaW1lbnNpb246ICVkIHggJWRcbiIsIHBpYy0+d2lkdGgsIHBpYy0+aGVpZ2h0KTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIk91dHB1dDogICAgJWQgYnl0ZXMgKCUuMmYgYnBwKVxuIiwgc3RhdHMtPmNvZGVkX3NpemUsCisgICAgICAgICAgICA4LmYgKiBzdGF0cy0+Y29kZWRfc2l6ZSAvIHBpYy0+d2lkdGggLyBwaWMtPmhlaWdodCk7CisgICAgUHJpbnRGdWxsTG9zc2xlc3NJbmZvKHN0YXRzLCAiQVJHQiIpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFByaW50RXh0cmFJbmZvTG9zc3koY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywgaW50IHNob3J0X291dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZ1bGxfZGV0YWlscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY29uc3QgZmlsZV9uYW1lKSB7CisgIGNvbnN0IFdlYlBBdXhTdGF0cyogY29uc3Qgc3RhdHMgPSBwaWMtPnN0YXRzOworICBpZiAoc2hvcnRfb3V0cHV0KSB7CisgICAgZnByaW50ZihzdGRlcnIsICIlN2QgJTIuMmZcbiIsIHN0YXRzLT5jb2RlZF9zaXplLCBzdGF0cy0+UFNOUlszXSk7CisgIH0gZWxzZSB7CisgICAgY29uc3QgaW50IG51bV9pNCA9IHN0YXRzLT5ibG9ja19jb3VudFswXTsKKyAgICBjb25zdCBpbnQgbnVtX2kxNiA9IHN0YXRzLT5ibG9ja19jb3VudFsxXTsKKyAgICBjb25zdCBpbnQgbnVtX3NraXAgPSBzdGF0cy0+YmxvY2tfY291bnRbMl07CisgICAgY29uc3QgaW50IHRvdGFsID0gbnVtX2k0ICsgbnVtX2kxNjsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkZpbGU6ICAgICAgJXNcbiIsIGZpbGVfbmFtZSk7CisgICAgZnByaW50ZihzdGRlcnIsICJEaW1lbnNpb246ICVkIHggJWQlc1xuIiwKKyAgICAgICAgICAgIHBpYy0+d2lkdGgsIHBpYy0+aGVpZ2h0LAorICAgICAgICAgICAgc3RhdHMtPmFscGhhX2RhdGFfc2l6ZSA/ICIgKHdpdGggYWxwaGEpIiA6ICIiKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIk91dHB1dDogICAgIgorICAgICAgICAgICAgIiVkIGJ5dGVzIFktVS1WLUFsbC1QU05SICUyLjJmICUyLjJmICUyLjJmICAgJTIuMmYgZEJcbiIKKyAgICAgICAgICAgICIgICAgICAgICAgICglLjJmIGJwcClcbiIsCisgICAgICAgICAgICBzdGF0cy0+Y29kZWRfc2l6ZSwKKyAgICAgICAgICAgIHN0YXRzLT5QU05SWzBdLCBzdGF0cy0+UFNOUlsxXSwgc3RhdHMtPlBTTlJbMl0sIHN0YXRzLT5QU05SWzNdLAorICAgICAgICAgICAgOC5mICogc3RhdHMtPmNvZGVkX3NpemUgLyBwaWMtPndpZHRoIC8gcGljLT5oZWlnaHQpOworICAgIGlmICh0b3RhbCA+IDApIHsKKyAgICAgIGludCB0b3RhbHNbNF0gPSB7IDAsIDAsIDAsIDAgfTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiYmxvY2sgY291bnQ6ICBpbnRyYTQ6ICAgICAlNmQgICglLjJmJSUpXG4iCisgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgaW50cmExNjogICAgJTZkICAoJS4yZiUlKVxuIgorICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgIHNraXBwZWQ6ICAgICU2ZCAgKCUuMmYlJSlcbiIsCisgICAgICAgICAgICAgIG51bV9pNCwgMTAwLmYgKiBudW1faTQgLyB0b3RhbCwKKyAgICAgICAgICAgICAgbnVtX2kxNiwgMTAwLmYgKiBudW1faTE2IC8gdG90YWwsCisgICAgICAgICAgICAgIG51bV9za2lwLCAxMDAuZiAqIG51bV9za2lwIC8gdG90YWwpOworICAgICAgZnByaW50ZihzdGRlcnIsICJieXRlcyB1c2VkOiAgaGVhZGVyOiAgICAgICAgICU2ZCAgKCUuMWYlJSlcbiIKKyAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgIG1vZGUtcGFydGl0aW9uOiAlNmQgICglLjFmJSUpXG4iLAorICAgICAgICAgICAgICBzdGF0cy0+aGVhZGVyX2J5dGVzWzBdLAorICAgICAgICAgICAgICAxMDAuZiAqIHN0YXRzLT5oZWFkZXJfYnl0ZXNbMF0gLyBzdGF0cy0+Y29kZWRfc2l6ZSwKKyAgICAgICAgICAgICAgc3RhdHMtPmhlYWRlcl9ieXRlc1sxXSwKKyAgICAgICAgICAgICAgMTAwLmYgKiBzdGF0cy0+aGVhZGVyX2J5dGVzWzFdIC8gc3RhdHMtPmNvZGVkX3NpemUpOworICAgICAgaWYgKHN0YXRzLT5hbHBoYV9kYXRhX3NpemUgPiAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgIHRyYW5zcGFyZW5jeTogICAlNmQgKCUuMWYgZEIpXG4iLAorICAgICAgICAgICAgICAgIHN0YXRzLT5hbHBoYV9kYXRhX3NpemUsIHN0YXRzLT5QU05SWzRdKTsKKyAgICAgIH0KKyAgICAgIGZwcmludGYoc3RkZXJyLCAiIFJlc2lkdWFscyBieXRlcyAgIgorICAgICAgICAgICAgICAgICAgICAgICJ8c2VnbWVudCAxfHNlZ21lbnQgMnxzZWdtZW50IDMiCisgICAgICAgICAgICAgICAgICAgICAgInxzZWdtZW50IDR8ICB0b3RhbFxuIik7CisgICAgICBpZiAoZnVsbF9kZXRhaWxzKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICBpbnRyYTQtY29lZmZzOiAgIik7CisgICAgICAgIFByaW50Qnl0ZUNvdW50KHN0YXRzLT5yZXNpZHVhbF9ieXRlc1swXSwgc3RhdHMtPmNvZGVkX3NpemUsIHRvdGFscyk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiIGludHJhMTYtY29lZmZzOiAgIik7CisgICAgICAgIFByaW50Qnl0ZUNvdW50KHN0YXRzLT5yZXNpZHVhbF9ieXRlc1sxXSwgc3RhdHMtPmNvZGVkX3NpemUsIHRvdGFscyk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICBjaHJvbWEgY29lZmZzOiAgIik7CisgICAgICAgIFByaW50Qnl0ZUNvdW50KHN0YXRzLT5yZXNpZHVhbF9ieXRlc1syXSwgc3RhdHMtPmNvZGVkX3NpemUsIHRvdGFscyk7CisgICAgICB9CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICBtYWNyb2Jsb2NrczogICIpOworICAgICAgUHJpbnRQZXJjZW50cyhzdGF0cy0+c2VnbWVudF9zaXplKTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgcXVhbnRpemVyOiAgIik7CisgICAgICBQcmludFZhbHVlcyhzdGF0cy0+c2VnbWVudF9xdWFudCk7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgIGZpbHRlciBsZXZlbDogICIpOworICAgICAgUHJpbnRWYWx1ZXMoc3RhdHMtPnNlZ21lbnRfbGV2ZWwpOworICAgICAgaWYgKGZ1bGxfZGV0YWlscykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIi0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0iKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIrLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiBzZWdtZW50cyB0b3RhbDogICIpOworICAgICAgICBQcmludEJ5dGVDb3VudCh0b3RhbHMsIHN0YXRzLT5jb2RlZF9zaXplLCBOVUxMKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHN0YXRzLT5sb3NzbGVzc19zaXplID4gMCkgeworICAgICAgUHJpbnRGdWxsTG9zc2xlc3NJbmZvKHN0YXRzLCAiYWxwaGEiKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgUHJpbnRNYXBJbmZvKGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMpIHsKKyAgaWYgKHBpYy0+ZXh0cmFfaW5mbyAhPSBOVUxMKSB7CisgICAgY29uc3QgaW50IG1iX3cgPSAocGljLT53aWR0aCArIDE1KSAvIDE2OworICAgIGNvbnN0IGludCBtYl9oID0gKHBpYy0+aGVpZ2h0ICsgMTUpIC8gMTY7CisgICAgY29uc3QgaW50IHR5cGUgPSBwaWMtPmV4dHJhX2luZm9fdHlwZTsKKyAgICBpbnQgeCwgeTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgbWJfaDsgKyt5KSB7CisgICAgICBmb3IgKHggPSAwOyB4IDwgbWJfdzsgKyt4KSB7CisgICAgICAgIGNvbnN0IGludCBjID0gcGljLT5leHRyYV9pbmZvW3ggKyB5ICogbWJfd107CisgICAgICAgIGlmICh0eXBlID09IDEpIHsgICAvLyBpbnRyYTQvaW50cmExNgorICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJWMiLCAiKy4iW2NdKTsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IDIpIHsgICAgLy8gc2VnbWVudHMKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVjIiwgIi4tKlgiW2NdKTsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IDMpIHsgICAgLy8gcXVhbnRpemVycworICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJS4yZCAiLCBjKTsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IDYgfHwgdHlwZSA9PSA3KSB7CisgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlM2QgIiwgYyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIweCUuMnggIiwgYyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyAgICB9CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGludCBNeVdyaXRlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljKSB7CisgIEZJTEUqIGNvbnN0IG91dCA9IChGSUxFKilwaWMtPmN1c3RvbV9wdHI7CisgIHJldHVybiBkYXRhX3NpemUgPyAoZndyaXRlKGRhdGEsIGRhdGFfc2l6ZSwgMSwgb3V0KSA9PSAxKSA6IDE7Cit9CisKKy8vIER1bXBzIGEgcGljdHVyZSBhcyBhIFBHTSBmaWxlIHVzaW5nIHRoZSBJTUM0IGxheW91dC4KK3N0YXRpYyBpbnQgRHVtcFBpY3R1cmUoY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUsIGNvbnN0IGNoYXIqIFBHTV9uYW1lKSB7CisgIGludCB5OworICBjb25zdCBpbnQgdXZfd2lkdGggPSAocGljdHVyZS0+d2lkdGggKyAxKSAvIDI7CisgIGNvbnN0IGludCB1dl9oZWlnaHQgPSAocGljdHVyZS0+aGVpZ2h0ICsgMSkgLyAyOworICBjb25zdCBpbnQgc3RyaWRlID0gKHBpY3R1cmUtPndpZHRoICsgMSkgJiB+MTsKKyAgY29uc3QgdWludDhfdCogc3JjX3kgPSBwaWN0dXJlLT55OworICBjb25zdCB1aW50OF90KiBzcmNfdSA9IHBpY3R1cmUtPnU7CisgIGNvbnN0IHVpbnQ4X3QqIHNyY192ID0gcGljdHVyZS0+djsKKyAgY29uc3QgdWludDhfdCogc3JjX2EgPSBwaWN0dXJlLT5hOworICBjb25zdCBpbnQgYWxwaGFfaGVpZ2h0ID0KKyAgICAgIFdlYlBQaWN0dXJlSGFzVHJhbnNwYXJlbmN5KHBpY3R1cmUpID8gcGljdHVyZS0+aGVpZ2h0IDogMDsKKyAgY29uc3QgaW50IGhlaWdodCA9IHBpY3R1cmUtPmhlaWdodCArIHV2X2hlaWdodCArIGFscGhhX2hlaWdodDsKKyAgRklMRSogY29uc3QgZiA9IGZvcGVuKFBHTV9uYW1lLCAid2IiKTsKKyAgaWYgKGYgPT0gTlVMTCkgcmV0dXJuIDA7CisgIGZwcmludGYoZiwgIlA1XG4lZCAlZFxuMjU1XG4iLCBzdHJpZGUsIGhlaWdodCk7CisgIGZvciAoeSA9IDA7IHkgPCBwaWN0dXJlLT5oZWlnaHQ7ICsreSkgeworICAgIGlmIChmd3JpdGUoc3JjX3ksIHBpY3R1cmUtPndpZHRoLCAxLCBmKSAhPSAxKSByZXR1cm4gMDsKKyAgICBpZiAocGljdHVyZS0+d2lkdGggJiAxKSBmcHV0YygwLCBmKTsgIC8vIHBhZAorICAgIHNyY195ICs9IHBpY3R1cmUtPnlfc3RyaWRlOworICB9CisgIGZvciAoeSA9IDA7IHkgPCB1dl9oZWlnaHQ7ICsreSkgeworICAgIGlmIChmd3JpdGUoc3JjX3UsIHV2X3dpZHRoLCAxLCBmKSAhPSAxKSByZXR1cm4gMDsKKyAgICBpZiAoZndyaXRlKHNyY192LCB1dl93aWR0aCwgMSwgZikgIT0gMSkgcmV0dXJuIDA7CisgICAgc3JjX3UgKz0gcGljdHVyZS0+dXZfc3RyaWRlOworICAgIHNyY192ICs9IHBpY3R1cmUtPnV2X3N0cmlkZTsKKyAgfQorICBmb3IgKHkgPSAwOyB5IDwgYWxwaGFfaGVpZ2h0OyArK3kpIHsKKyAgICBpZiAoZndyaXRlKHNyY19hLCBwaWN0dXJlLT53aWR0aCwgMSwgZikgIT0gMSkgcmV0dXJuIDA7CisgICAgaWYgKHBpY3R1cmUtPndpZHRoICYgMSkgZnB1dGMoMCwgZik7ICAvLyBwYWQKKyAgICBzcmNfYSArPSBwaWN0dXJlLT5hX3N0cmlkZTsKKyAgfQorICBmY2xvc2UoZik7CisgIHJldHVybiAxOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWV0YWRhdGEgd3JpdGluZy4KKworZW51bSB7CisgIE1FVEFEQVRBX0VYSUYgPSAoMSA8PCAwKSwKKyAgTUVUQURBVEFfSUNDICA9ICgxIDw8IDEpLAorICBNRVRBREFUQV9YTVAgID0gKDEgPDwgMiksCisgIE1FVEFEQVRBX0FMTCAgPSBNRVRBREFUQV9FWElGIHwgTUVUQURBVEFfSUNDIHwgTUVUQURBVEFfWE1QCit9OworCitzdGF0aWMgY29uc3QgaW50IGtDaHVua0hlYWRlclNpemUgPSA4Oworc3RhdGljIGNvbnN0IGludCBrVGFnU2l6ZSA9IDQ7CisKK3N0YXRpYyB2b2lkIFByaW50TWV0YWRhdGFJbmZvKGNvbnN0IE1ldGFkYXRhKiBjb25zdCBtZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXRhZGF0YV93cml0dGVuKSB7CisgIGlmIChtZXRhZGF0YSA9PSBOVUxMIHx8IG1ldGFkYXRhX3dyaXR0ZW4gPT0gMCkgcmV0dXJuOworCisgIGZwcmludGYoc3RkZXJyLCAiTWV0YWRhdGE6XG4iKTsKKyAgaWYgKG1ldGFkYXRhX3dyaXR0ZW4gJiBNRVRBREFUQV9JQ0MpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgKiBJQ0MgcHJvZmlsZTogICU2ZCBieXRlc1xuIiwgKGludCltZXRhZGF0YS0+aWNjcC5zaXplKTsKKyAgfQorICBpZiAobWV0YWRhdGFfd3JpdHRlbiAmIE1FVEFEQVRBX0VYSUYpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgKiBFWElGIGRhdGE6ICAgICU2ZCBieXRlc1xuIiwgKGludCltZXRhZGF0YS0+ZXhpZi5zaXplKTsKKyAgfQorICBpZiAobWV0YWRhdGFfd3JpdHRlbiAmIE1FVEFEQVRBX1hNUCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiICAqIFhNUCBkYXRhOiAgICAgJTZkIGJ5dGVzXG4iLCAoaW50KW1ldGFkYXRhLT54bXAuc2l6ZSk7CisgIH0KK30KKworLy8gT3V0cHV0cywgaW4gbGl0dGxlIGVuZGlhbiwgJ251bScgYnl0ZXMgZnJvbSAndmFsJyB0byAnb3V0Jy4KK3N0YXRpYyBpbnQgV3JpdGVMRShGSUxFKiBjb25zdCBvdXQsIHVpbnQzMl90IHZhbCwgaW50IG51bSkgeworICB1aW50OF90IGJ1Zls0XTsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBudW07ICsraSkgeworICAgIGJ1ZltpXSA9ICh1aW50OF90KSh2YWwgJiAweGZmKTsKKyAgICB2YWwgPj49IDg7CisgIH0KKyAgcmV0dXJuIChmd3JpdGUoYnVmLCBudW0sIDEsIG91dCkgPT0gMSk7Cit9CisKK3N0YXRpYyBpbnQgV3JpdGVMRTI0KEZJTEUqIGNvbnN0IG91dCwgdWludDMyX3QgdmFsKSB7CisgIHJldHVybiBXcml0ZUxFKG91dCwgdmFsLCAzKTsKK30KKworc3RhdGljIGludCBXcml0ZUxFMzIoRklMRSogY29uc3Qgb3V0LCB1aW50MzJfdCB2YWwpIHsKKyAgcmV0dXJuIFdyaXRlTEUob3V0LCB2YWwsIDQpOworfQorCitzdGF0aWMgaW50IFdyaXRlTWV0YWRhdGFDaHVuayhGSUxFKiBjb25zdCBvdXQsIGNvbnN0IGNoYXIgZm91cmNjWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWV0YWRhdGFQYXlsb2FkKiBjb25zdCBwYXlsb2FkKSB7CisgIGNvbnN0IHVpbnQ4X3QgemVybyA9IDA7CisgIGNvbnN0IHNpemVfdCBuZWVkX3BhZGRpbmcgPSBwYXlsb2FkLT5zaXplICYgMTsKKyAgaW50IG9rID0gKGZ3cml0ZShmb3VyY2MsIGtUYWdTaXplLCAxLCBvdXQpID09IDEpOworICBvayA9IG9rICYmIFdyaXRlTEUzMihvdXQsICh1aW50MzJfdClwYXlsb2FkLT5zaXplKTsKKyAgb2sgPSBvayAmJiAoZndyaXRlKHBheWxvYWQtPmJ5dGVzLCBwYXlsb2FkLT5zaXplLCAxLCBvdXQpID09IDEpOworICByZXR1cm4gb2sgJiYgKGZ3cml0ZSgmemVybywgbmVlZF9wYWRkaW5nLCBuZWVkX3BhZGRpbmcsIG91dCkgPT0gbmVlZF9wYWRkaW5nKTsKK30KKworLy8gU2V0cyAnZmxhZycgaW4gJ3ZwOHhfZmxhZ3MnIGFuZCB1cGRhdGVzICdtZXRhZGF0YV9zaXplJyB3aXRoIHRoZSBzaXplIG9mIHRoZQorLy8gY2h1bmsgaWYgdGhlcmUgaXMgbWV0YWRhdGEgYW5kICdrZWVwJyBpcyB0cnVlLgorc3RhdGljIGludCBVcGRhdGVGbGFnc0FuZFNpemUoY29uc3QgTWV0YWRhdGFQYXlsb2FkKiBjb25zdCBwYXlsb2FkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGtlZXAsIGludCBmbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHZwOHhfZmxhZ3MsIHVpbnQ2NF90KiBtZXRhZGF0YV9zaXplKSB7CisgIGlmIChrZWVwICYmIHBheWxvYWQtPmJ5dGVzICE9IE5VTEwgJiYgcGF5bG9hZC0+c2l6ZSA+IDApIHsKKyAgICAqdnA4eF9mbGFncyB8PSBmbGFnOworICAgICptZXRhZGF0YV9zaXplICs9IGtDaHVua0hlYWRlclNpemUgKyBwYXlsb2FkLT5zaXplICsgKHBheWxvYWQtPnNpemUgJiAxKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworLy8gV3JpdGVzIGEgV2ViUCBmaWxlIHVzaW5nIHRoZSBpbWFnZSBjb250YWluZWQgaW4gJ21lbW9yeV93cml0ZXInIGFuZCB0aGUKKy8vIG1ldGFkYXRhIGZyb20gJ21ldGFkYXRhJy4gTWV0YWRhdGEgaXMgY29udHJvbGxlZCBieSAna2VlcF9tZXRhZGF0YScgYW5kIHRoZQorLy8gYXZhaWxhYmlsaXR5IGluICdtZXRhZGF0YScuIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLgorLy8gRm9yIGRldGFpbHMgc2VlIGRvYy93ZWJwLWNvbnRhaW5lci1zcGVjLnR4dCNleHRlbmRlZC1maWxlLWZvcm1hdC4KK3N0YXRpYyBpbnQgV3JpdGVXZWJQV2l0aE1ldGFkYXRhKEZJTEUqIGNvbnN0IG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUE1lbW9yeVdyaXRlciogY29uc3QgbWVtb3J5X3dyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1ldGFkYXRhKiBjb25zdCBtZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBrZWVwX21ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBtZXRhZGF0YV93cml0dGVuKSB7CisgIGNvbnN0IGNoYXIga1ZQOFhIZWFkZXJbXSA9ICJWUDhYXHgwYVx4MDBceDAwXHgwMCI7CisgIGNvbnN0IGludCBrQWxwaGFGbGFnID0gMHgxMDsKKyAgY29uc3QgaW50IGtFWElGRmxhZyAgPSAweDA4OworICBjb25zdCBpbnQga0lDQ1BGbGFnICA9IDB4MjA7CisgIGNvbnN0IGludCBrWE1QRmxhZyAgID0gMHgwNDsKKyAgY29uc3Qgc2l6ZV90IGtSaWZmSGVhZGVyU2l6ZSA9IDEyOworICBjb25zdCBzaXplX3Qga01heENodW5rUGF5bG9hZCA9IH4wIC0ga0NodW5rSGVhZGVyU2l6ZSAtIDE7CisgIGNvbnN0IHNpemVfdCBrTWluU2l6ZSA9IGtSaWZmSGVhZGVyU2l6ZSArIGtDaHVua0hlYWRlclNpemU7CisgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgdWludDY0X3QgbWV0YWRhdGFfc2l6ZSA9IDA7CisgIGNvbnN0IGludCB3cml0ZV9leGlmID0gVXBkYXRlRmxhZ3NBbmRTaXplKCZtZXRhZGF0YS0+ZXhpZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISEoa2VlcF9tZXRhZGF0YSAmIE1FVEFEQVRBX0VYSUYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRVhJRkZsYWcsICZmbGFncywgJm1ldGFkYXRhX3NpemUpOworICBjb25zdCBpbnQgd3JpdGVfaWNjcCA9IFVwZGF0ZUZsYWdzQW5kU2l6ZSgmbWV0YWRhdGEtPmljY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEhKGtlZXBfbWV0YWRhdGEgJiBNRVRBREFUQV9JQ0MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrSUNDUEZsYWcsICZmbGFncywgJm1ldGFkYXRhX3NpemUpOworICBjb25zdCBpbnQgd3JpdGVfeG1wICA9IFVwZGF0ZUZsYWdzQW5kU2l6ZSgmbWV0YWRhdGEtPnhtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISEoa2VlcF9tZXRhZGF0YSAmIE1FVEFEQVRBX1hNUCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtYTVBGbGFnLCAmZmxhZ3MsICZtZXRhZGF0YV9zaXplKTsKKyAgdWludDhfdCogd2VicCA9IG1lbW9yeV93cml0ZXItPm1lbTsKKyAgc2l6ZV90IHdlYnBfc2l6ZSA9IG1lbW9yeV93cml0ZXItPnNpemU7CisKKyAgKm1ldGFkYXRhX3dyaXR0ZW4gPSAwOworCisgIGlmICh3ZWJwX3NpemUgPCBrTWluU2l6ZSkgcmV0dXJuIDA7CisgIGlmICh3ZWJwX3NpemUgLSBrQ2h1bmtIZWFkZXJTaXplICsgbWV0YWRhdGFfc2l6ZSA+IGtNYXhDaHVua1BheWxvYWQpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yISBBZGRpdGlvbiBvZiBtZXRhZGF0YSB3b3VsZCBleGNlZWQgIgorICAgICAgICAgICAgICAgICAgICAiY29udGFpbmVyIHNpemUgbGltaXQuXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChtZXRhZGF0YV9zaXplID4gMCkgeworICAgIGNvbnN0IGludCBrVlA4WENodW5rU2l6ZSA9IDE4OworICAgIGNvbnN0IGludCBoYXNfdnA4eCA9ICFtZW1jbXAod2VicCArIGtSaWZmSGVhZGVyU2l6ZSwgIlZQOFgiLCBrVGFnU2l6ZSk7CisgICAgY29uc3QgdWludDMyX3QgcmlmZl9zaXplID0gKHVpbnQzMl90KSh3ZWJwX3NpemUgLSBrQ2h1bmtIZWFkZXJTaXplICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoYXNfdnA4eCA/IDAgOiBrVlA4WENodW5rU2l6ZSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFfc2l6ZSk7CisgICAgLy8gUklGRgorICAgIGludCBvayA9IChmd3JpdGUod2VicCwga1RhZ1NpemUsIDEsIG91dCkgPT0gMSk7CisgICAgLy8gUklGRiBzaXplIChmaWxlIGhlYWRlciBzaXplIGlzIG5vdCByZWNvcmRlZCkKKyAgICBvayA9IG9rICYmIFdyaXRlTEUzMihvdXQsIHJpZmZfc2l6ZSk7CisgICAgd2VicCArPSBrQ2h1bmtIZWFkZXJTaXplOworICAgIHdlYnBfc2l6ZSAtPSBrQ2h1bmtIZWFkZXJTaXplOworICAgIC8vIFdFQlAKKyAgICBvayA9IG9rICYmIChmd3JpdGUod2VicCwga1RhZ1NpemUsIDEsIG91dCkgPT0gMSk7CisgICAgd2VicCArPSBrVGFnU2l6ZTsKKyAgICB3ZWJwX3NpemUgLT0ga1RhZ1NpemU7CisgICAgaWYgKGhhc192cDh4KSB7ICAvLyB1cGRhdGUgdGhlIGV4aXN0aW5nIFZQOFggZmxhZ3MKKyAgICAgIHdlYnBba0NodW5rSGVhZGVyU2l6ZV0gfD0gKHVpbnQ4X3QpKGZsYWdzICYgMHhmZik7CisgICAgICBvayA9IG9rICYmIChmd3JpdGUod2VicCwga1ZQOFhDaHVua1NpemUsIDEsIG91dCkgPT0gMSk7CisgICAgICB3ZWJwICs9IGtWUDhYQ2h1bmtTaXplOworICAgICAgd2VicF9zaXplIC09IGtWUDhYQ2h1bmtTaXplOworICAgIH0gZWxzZSB7CisgICAgICBjb25zdCBpbnQgaXNfbG9zc2xlc3MgPSAhbWVtY21wKHdlYnAsICJWUDhMIiwga1RhZ1NpemUpOworICAgICAgaWYgKGlzX2xvc3NsZXNzKSB7CisgICAgICAgIC8vIFByZXNlbmNlIG9mIGFscGhhIGlzIHN0b3JlZCBpbiB0aGUgMzd0aCBiaXQgKDI5dGggYWZ0ZXIgdGhlCisgICAgICAgIC8vIHNpZ25hdHVyZSkgb2YgVlA4TCBkYXRhLgorICAgICAgICBpZiAod2VicFtrQ2h1bmtIZWFkZXJTaXplICsgNF0gJiAoMSA8PCA0KSkgZmxhZ3MgfD0ga0FscGhhRmxhZzsKKyAgICAgIH0KKyAgICAgIG9rID0gb2sgJiYgKGZ3cml0ZShrVlA4WEhlYWRlciwga0NodW5rSGVhZGVyU2l6ZSwgMSwgb3V0KSA9PSAxKTsKKyAgICAgIG9rID0gb2sgJiYgV3JpdGVMRTMyKG91dCwgZmxhZ3MpOworICAgICAgb2sgPSBvayAmJiBXcml0ZUxFMjQob3V0LCBwaWN0dXJlLT53aWR0aCAtIDEpOworICAgICAgb2sgPSBvayAmJiBXcml0ZUxFMjQob3V0LCBwaWN0dXJlLT5oZWlnaHQgLSAxKTsKKyAgICB9CisgICAgaWYgKHdyaXRlX2ljY3ApIHsKKyAgICAgIG9rID0gb2sgJiYgV3JpdGVNZXRhZGF0YUNodW5rKG91dCwgIklDQ1AiLCAmbWV0YWRhdGEtPmljY3ApOworICAgICAgKm1ldGFkYXRhX3dyaXR0ZW4gfD0gTUVUQURBVEFfSUNDOworICAgIH0KKyAgICAvLyBJbWFnZQorICAgIG9rID0gb2sgJiYgKGZ3cml0ZSh3ZWJwLCB3ZWJwX3NpemUsIDEsIG91dCkgPT0gMSk7CisgICAgaWYgKHdyaXRlX2V4aWYpIHsKKyAgICAgIG9rID0gb2sgJiYgV3JpdGVNZXRhZGF0YUNodW5rKG91dCwgIkVYSUYiLCAmbWV0YWRhdGEtPmV4aWYpOworICAgICAgKm1ldGFkYXRhX3dyaXR0ZW4gfD0gTUVUQURBVEFfRVhJRjsKKyAgICB9CisgICAgaWYgKHdyaXRlX3htcCkgeworICAgICAgb2sgPSBvayAmJiBXcml0ZU1ldGFkYXRhQ2h1bmsob3V0LCAiWE1QICIsICZtZXRhZGF0YS0+eG1wKTsKKyAgICAgICptZXRhZGF0YV93cml0dGVuIHw9IE1FVEFEQVRBX1hNUDsKKyAgICB9CisgICAgcmV0dXJuIG9rOworICB9CisKKyAgLy8gTm8gbWV0YWRhdGEsIGp1c3Qgd3JpdGUgdGhlIG9yaWdpbmFsIGltYWdlIGZpbGUuCisgIHJldHVybiAoZndyaXRlKHdlYnAsIHdlYnBfc2l6ZSwgMSwgb3V0KSA9PSAxKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGludCBQcm9ncmVzc1JlcG9ydChpbnQgcGVyY2VudCwgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUpIHsKKyAgZnByaW50ZihzdGRlcnIsICJbJXNdOiAlM2QgJSUgICAgICBcciIsCisgICAgICAgICAgKGNoYXIqKXBpY3R1cmUtPnVzZXJfZGF0YSwgcGVyY2VudCk7CisgIHJldHVybiAxOyAgLy8gYWxsIG9rCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIEhlbHBTaG9ydCh2b2lkKSB7CisgIHByaW50ZigiVXNhZ2U6XG5cbiIpOworICBwcmludGYoIiAgIGN3ZWJwIFtvcHRpb25zXSAtcSBxdWFsaXR5IGlucHV0LnBuZyAtbyBvdXRwdXQud2VicFxuXG4iKTsKKyAgcHJpbnRmKCJ3aGVyZSBxdWFsaXR5IGlzIGJldHdlZW4gMCAocG9vcikgdG8gMTAwICh2ZXJ5IGdvb2QpLlxuIik7CisgIHByaW50ZigiVHlwaWNhbCB2YWx1ZSBpcyBhcm91bmQgODAuXG5cbiIpOworICBwcmludGYoIlRyeSAtbG9uZ2hlbHAgZm9yIGFuIGV4aGF1c3RpdmUgbGlzdCBvZiBhZHZhbmNlZCBvcHRpb25zLlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIEhlbHBMb25nKHZvaWQpIHsKKyAgcHJpbnRmKCJVc2FnZTpcbiIpOworICBwcmludGYoIiBjd2VicCBbLXByZXNldCA8Li4uPl0gW29wdGlvbnNdIGluX2ZpbGUgWy1vIG91dF9maWxlXVxuXG4iKTsKKyAgcHJpbnRmKCJJZiBpbnB1dCBzaXplICgtcykgZm9yIGFuIGltYWdlIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGlzXG4iCisgICAgICAgICAiYXNzdW1lZCB0byBiZSBhIFBORywgSlBFRywgVElGRiBvciBXZWJQIGZpbGUuXG4iKTsKKyNpZmRlZiBIQVZFX1dJTkNPREVDX0gKKyAgcHJpbnRmKCJXaW5kb3dzIGJ1aWxkcyBjYW4gdGFrZSBhcyBpbnB1dCBhbnkgb2YgdGhlIGZpbGVzIGhhbmRsZWQgYnkgV0lDLlxuIik7CisjZW5kaWYKKyAgcHJpbnRmKCJcbk9wdGlvbnM6XG4iKTsKKyAgcHJpbnRmKCIgIC1oIC8gLWhlbHAgLi4uLi4uLi4uLi4uLiBzaG9ydCBoZWxwXG4iKTsKKyAgcHJpbnRmKCIgIC1IIC8gLWxvbmdoZWxwIC4uLi4uLi4uLiBsb25nIGhlbHBcbiIpOworICBwcmludGYoIiAgLXEgPGZsb2F0PiAuLi4uLi4uLi4uLi4uIHF1YWxpdHkgZmFjdG9yICgwOnNtYWxsLi4xMDA6YmlnKSwgIgorICAgICAgICAgImRlZmF1bHQ9NzVcbiIpOworICBwcmludGYoIiAgLWFscGhhX3EgPGludD4gLi4uLi4uLi4uIHRyYW5zcGFyZW5jeS1jb21wcmVzc2lvbiBxdWFsaXR5ICgwLi4xMDApLCIKKyAgICAgICAgICJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9MTAwXG4iKTsKKyAgcHJpbnRmKCIgIC1wcmVzZXQgPHN0cmluZz4gLi4uLi4uLiBwcmVzZXQgc2V0dGluZywgb25lIG9mOlxuIik7CisgIHByaW50ZigiICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQsIHBob3RvLCBwaWN0dXJlLFxuIik7CisgIHByaW50ZigiICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdpbmcsIGljb24sIHRleHRcbiIpOworICBwcmludGYoIiAgICAgLXByZXNldCBtdXN0IGNvbWUgZmlyc3QsIGFzIGl0IG92ZXJ3cml0ZXMgb3RoZXIgcGFyYW1ldGVyc1xuIik7CisgIHByaW50ZigiICAteiA8aW50PiAuLi4uLi4uLi4uLi4uLi4gYWN0aXZhdGVzIGxvc3NsZXNzIHByZXNldCB3aXRoIGdpdmVuXG4iCisgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgaW4gWzA6ZmFzdCwgLi4uLCA5OnNsb3dlc3RdXG4iKTsKKyAgcHJpbnRmKCJcbiIpOworICBwcmludGYoIiAgLW0gPGludD4gLi4uLi4uLi4uLi4uLi4uIGNvbXByZXNzaW9uIG1ldGhvZCAoMD1mYXN0LCA2PXNsb3dlc3QpLCAiCisgICAgICAgICAiZGVmYXVsdD00XG4iKTsKKyAgcHJpbnRmKCIgIC1zZWdtZW50cyA8aW50PiAuLi4uLi4uLiBudW1iZXIgb2Ygc2VnbWVudHMgdG8gdXNlICgxLi40KSwgIgorICAgICAgICAgImRlZmF1bHQ9NFxuIik7CisgIHByaW50ZigiICAtc2l6ZSA8aW50PiAuLi4uLi4uLi4uLi4gdGFyZ2V0IHNpemUgKGluIGJ5dGVzKVxuIik7CisgIHByaW50ZigiICAtcHNuciA8ZmxvYXQ+IC4uLi4uLi4uLi4gdGFyZ2V0IFBTTlIgKGluIGRCLiB0eXBpY2FsbHk6IDQyKVxuIik7CisgIHByaW50ZigiXG4iKTsKKyAgcHJpbnRmKCIgIC1zIDxpbnQ+IDxpbnQ+IC4uLi4uLi4uLiBpbnB1dCBzaXplICh3aWR0aCB4IGhlaWdodCkgZm9yIFlVVlxuIik7CisgIHByaW50ZigiICAtc25zIDxpbnQ+IC4uLi4uLi4uLi4uLi4gc3BhdGlhbCBub2lzZSBzaGFwaW5nICgwOm9mZiwgMTAwOm1heCksICIKKyAgICAgICAgICJkZWZhdWx0PTUwXG4iKTsKKyAgcHJpbnRmKCIgIC1mIDxpbnQ+IC4uLi4uLi4uLi4uLi4uLiBmaWx0ZXIgc3RyZW5ndGggKDA9b2ZmLi4xMDApLCAiCisgICAgICAgICAiZGVmYXVsdD02MFxuIik7CisgIHByaW50ZigiICAtc2hhcnBuZXNzIDxpbnQ+IC4uLi4uLi4gIgorICAgICAgICAgImZpbHRlciBzaGFycG5lc3MgKDA6bW9zdCAuLiA3OmxlYXN0IHNoYXJwKSwgZGVmYXVsdD0wXG4iKTsKKyAgcHJpbnRmKCIgIC1zdHJvbmcgLi4uLi4uLi4uLi4uLi4uLiB1c2Ugc3Ryb25nIGZpbHRlciBpbnN0ZWFkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib2Ygc2ltcGxlIChkZWZhdWx0KVxuIik7CisgIHByaW50ZigiICAtbm9zdHJvbmcgLi4uLi4uLi4uLi4uLi4gdXNlIHNpbXBsZSBmaWx0ZXIgaW5zdGVhZCBvZiBzdHJvbmdcbiIpOworICBwcmludGYoIiAgLXNoYXJwX3l1diAuLi4uLi4uLi4uLi4uIHVzZSBzaGFycGVyIChhbmQgc2xvd2VyKSBSR0ItPllVViAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnZlcnNpb25cbiIpOworICBwcmludGYoIiAgLXBhcnRpdGlvbl9saW1pdCA8aW50PiAuIGxpbWl0IHF1YWxpdHkgdG8gZml0IHRoZSA1MTJrIGxpbWl0IG9uXG4iKTsKKyAgcHJpbnRmKCIgICAgICAgICAgICAgICAgICAgICAgICAgICAiCisgICAgICAgICAidGhlIGZpcnN0IHBhcnRpdGlvbiAoMD1ubyBkZWdyYWRhdGlvbiAuLi4gMTAwPWZ1bGwpXG4iKTsKKyAgcHJpbnRmKCIgIC1wYXNzIDxpbnQ+IC4uLi4uLi4uLi4uLiBhbmFseXNpcyBwYXNzIG51bWJlciAoMS4uMTApXG4iKTsKKyAgcHJpbnRmKCIgIC1jcm9wIDx4PiA8eT4gPHc+IDxoPiAuLiBjcm9wIHBpY3R1cmUgd2l0aCB0aGUgZ2l2ZW4gcmVjdGFuZ2xlXG4iKTsKKyAgcHJpbnRmKCIgIC1yZXNpemUgPHc+IDxoPiAuLi4uLi4uLiByZXNpemUgcGljdHVyZSAoYWZ0ZXIgYW55IGNyb3BwaW5nKVxuIik7CisgIHByaW50ZigiICAtbXQgLi4uLi4uLi4uLi4uLi4uLi4uLi4gdXNlIG11bHRpLXRocmVhZGluZyBpZiBhdmFpbGFibGVcbiIpOworICBwcmludGYoIiAgLWxvd19tZW1vcnkgLi4uLi4uLi4uLi4uIHJlZHVjZSBtZW1vcnkgdXNhZ2UgKHNsb3dlciBlbmNvZGluZylcbiIpOworICBwcmludGYoIiAgLW1hcCA8aW50PiAuLi4uLi4uLi4uLi4uIHByaW50IG1hcCBvZiBleHRyYSBpbmZvXG4iKTsKKyAgcHJpbnRmKCIgIC1wcmludF9wc25yIC4uLi4uLi4uLi4uLiBwcmludHMgYXZlcmFnZWQgUFNOUiBkaXN0b3J0aW9uXG4iKTsKKyAgcHJpbnRmKCIgIC1wcmludF9zc2ltIC4uLi4uLi4uLi4uLiBwcmludHMgYXZlcmFnZWQgU1NJTSBkaXN0b3J0aW9uXG4iKTsKKyAgcHJpbnRmKCIgIC1wcmludF9sc2ltIC4uLi4uLi4uLi4uLiBwcmludHMgbG9jYWwtc2ltaWxhcml0eSBkaXN0b3J0aW9uXG4iKTsKKyAgcHJpbnRmKCIgIC1kIDxmaWxlLnBnbT4gLi4uLi4uLi4uLiBkdW1wIHRoZSBjb21wcmVzc2VkIG91dHB1dCAoUEdNIGZpbGUpXG4iKTsKKyAgcHJpbnRmKCIgIC1hbHBoYV9tZXRob2QgPGludD4gLi4uLiB0cmFuc3BhcmVuY3ktY29tcHJlc3Npb24gbWV0aG9kICgwLi4xKSwgIgorICAgICAgICAgImRlZmF1bHQ9MVxuIik7CisgIHByaW50ZigiICAtYWxwaGFfZmlsdGVyIDxzdHJpbmc+IC4gcHJlZGljdGl2ZSBmaWx0ZXJpbmcgZm9yIGFscGhhIHBsYW5lLFxuIik7CisgIHByaW50ZigiICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lIG9mOiBub25lLCBmYXN0IChkZWZhdWx0KSBvciBiZXN0XG4iKTsKKyAgcHJpbnRmKCIgIC1leGFjdCAuLi4uLi4uLi4uLi4uLi4uLiBwcmVzZXJ2ZSBSR0IgdmFsdWVzIGluIHRyYW5zcGFyZW50IGFyZWEsICIKKyAgICAgICAgICJkZWZhdWx0PW9mZlxuIik7CisgIHByaW50ZigiICAtYmxlbmRfYWxwaGEgPGhleD4gLi4uLi4gYmxlbmQgY29sb3JzIGFnYWluc3QgYmFja2dyb3VuZCBjb2xvclxuIgorICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3NlZCBhcyBSR0IgdmFsdWVzIHdyaXR0ZW4gaW5cbiIKKyAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXhhZGVjaW1hbCwgZS5nLiAweGMwZTBkMCBmb3IgcmVkPTB4YzBcbiIKKyAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVlbj0weGUwIGFuZCBibHVlPTB4ZDBcbiIpOworICBwcmludGYoIiAgLW5vYWxwaGEgLi4uLi4uLi4uLi4uLi4uIGRpc2NhcmQgYW55IHRyYW5zcGFyZW5jeSBpbmZvcm1hdGlvblxuIik7CisgIHByaW50ZigiICAtbG9zc2xlc3MgLi4uLi4uLi4uLi4uLi4gZW5jb2RlIGltYWdlIGxvc3NsZXNzbHksIGRlZmF1bHQ9b2ZmXG4iKTsKKyAgcHJpbnRmKCIgIC1uZWFyX2xvc3NsZXNzIDxpbnQ+IC4uLiB1c2UgbmVhci1sb3NzbGVzcyBpbWFnZVxuIgorICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXByb2Nlc3NpbmcgKDAuLjEwMD1vZmYpLCAiCisgICAgICAgICAiZGVmYXVsdD0xMDBcbiIpOworICBwcmludGYoIiAgLWhpbnQgPHN0cmluZz4gLi4uLi4uLi4uIHNwZWNpZnkgaW1hZ2UgY2hhcmFjdGVyaXN0aWNzIGhpbnQsXG4iKTsKKyAgcHJpbnRmKCIgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmUgb2Y6IHBob3RvLCBwaWN0dXJlIG9yIGdyYXBoXG4iKTsKKworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiICAtbWV0YWRhdGEgPHN0cmluZz4gLi4uLi4gY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgbWV0YWRhdGEgdG9cbiIpOworICBwcmludGYoIiAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOworICBwcmludGYoImNvcHkgZnJvbSB0aGUgaW5wdXQgdG8gdGhlIG91dHB1dCBpZiBwcmVzZW50LlxuIik7CisgIHByaW50ZigiICAgICAgICAgICAgICAgICAgICAgICAgICAgIgorICAgICAgICAgIlZhbGlkIHZhbHVlczogYWxsLCBub25lIChkZWZhdWx0KSwgZXhpZiwgaWNjLCB4bXBcbiIpOworCisgIHByaW50ZigiXG4iKTsKKyAgcHJpbnRmKCIgIC1zaG9ydCAuLi4uLi4uLi4uLi4uLi4uLiBjb25kZW5zZSBwcmludGVkIG1lc3NhZ2VcbiIpOworICBwcmludGYoIiAgLXF1aWV0IC4uLi4uLi4uLi4uLi4uLi4uIGRvbid0IHByaW50IGFueXRoaW5nXG4iKTsKKyAgcHJpbnRmKCIgIC12ZXJzaW9uIC4uLi4uLi4uLi4uLi4uLiBwcmludCB2ZXJzaW9uIG51bWJlciBhbmQgZXhpdFxuIik7CisjaWZuZGVmIFdFQlBfRExMCisgIHByaW50ZigiICAtbm9hc20gLi4uLi4uLi4uLi4uLi4uLi4gZGlzYWJsZSBhbGwgYXNzZW1ibHkgb3B0aW1pemF0aW9uc1xuIik7CisjZW5kaWYKKyAgcHJpbnRmKCIgIC12IC4uLi4uLi4uLi4uLi4uLi4uLi4uLiB2ZXJib3NlLCBlLmcuIHByaW50IGVuY29kaW5nL2RlY29kaW5nICIKKyAgICAgICAgICJ0aW1lc1xuIik7CisgIHByaW50ZigiICAtcHJvZ3Jlc3MgLi4uLi4uLi4uLi4uLi4gcmVwb3J0IGVuY29kaW5nIHByb2dyZXNzXG4iKTsKKyAgcHJpbnRmKCJcbiIpOworICBwcmludGYoIkV4cGVyaW1lbnRhbCBPcHRpb25zOlxuIik7CisgIHByaW50ZigiICAtanBlZ19saWtlIC4uLi4uLi4uLi4uLi4gcm91Z2hseSBtYXRjaCBleHBlY3RlZCBKUEVHIHNpemVcbiIpOworICBwcmludGYoIiAgLWFmIC4uLi4uLi4uLi4uLi4uLi4uLi4uIGF1dG8tYWRqdXN0IGZpbHRlciBzdHJlbmd0aFxuIik7CisgIHByaW50ZigiICAtcHJlIDxpbnQ+IC4uLi4uLi4uLi4uLi4gcHJlLXByb2Nlc3NpbmcgZmlsdGVyXG4iKTsKKyAgcHJpbnRmKCJcbiIpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRXJyb3IgbWVzc2FnZXMKKworc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtFcnJvck1lc3NhZ2VzW1ZQOF9FTkNfRVJST1JfTEFTVF0gPSB7CisgICJPSyIsCisgICJPVVRfT0ZfTUVNT1JZOiBPdXQgb2YgbWVtb3J5IGFsbG9jYXRpbmcgb2JqZWN0cyIsCisgICJCSVRTVFJFQU1fT1VUX09GX01FTU9SWTogT3V0IG9mIG1lbW9yeSByZS1hbGxvY2F0aW5nIGJ5dGUgYnVmZmVyIiwKKyAgIk5VTExfUEFSQU1FVEVSOiBOVUxMIHBhcmFtZXRlciBwYXNzZWQgdG8gZnVuY3Rpb24iLAorICAiSU5WQUxJRF9DT05GSUdVUkFUSU9OOiBjb25maWd1cmF0aW9uIGlzIGludmFsaWQiLAorICAiQkFEX0RJTUVOU0lPTjogQmFkIHBpY3R1cmUgZGltZW5zaW9uLiBNYXhpbXVtIHdpZHRoIGFuZCBoZWlnaHQgIgorICAiYWxsb3dlZCBpcyAxNjM4MyBwaXhlbHMuIiwKKyAgIlBBUlRJVElPTjBfT1ZFUkZMT1c6IFBhcnRpdGlvbiAjMCBpcyB0b28gYmlnIHRvIGZpdCA1MTJrLlxuIgorICAiVG8gcmVkdWNlIHRoZSBzaXplIG9mIHRoaXMgcGFydGl0aW9uLCB0cnkgdXNpbmcgbGVzcyBzZWdtZW50cyAiCisgICJ3aXRoIHRoZSAtc2VnbWVudHMgb3B0aW9uLCBhbmQgZXZlbnR1YWxseSByZWR1Y2UgdGhlIG51bWJlciBvZiAiCisgICJoZWFkZXIgYml0cyB1c2luZyAtcGFydGl0aW9uX2xpbWl0LiBNb3JlIGRldGFpbHMgYXJlIGF2YWlsYWJsZSAiCisgICJpbiB0aGUgbWFudWFsIChgbWFuIGN3ZWJwYCkiLAorICAiUEFSVElUSU9OX09WRVJGTE9XOiBQYXJ0aXRpb24gaXMgdG9vIGJpZyB0byBmaXQgMTZNIiwKKyAgIkJBRF9XUklURTogUGljdHVyZSB3cml0ZXIgcmV0dXJuZWQgYW4gSS9PIGVycm9yIiwKKyAgIkZJTEVfVE9PX0JJRzogRmlsZSB3b3VsZCBiZSB0b28gYmlnIHRvIGZpdCBpbiA0RyIsCisgICJVU0VSX0FCT1JUOiBlbmNvZGluZyBhYm9ydCByZXF1ZXN0ZWQgYnkgdXNlciIKK307CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10pIHsKKyAgaW50IHJldHVybl92YWx1ZSA9IC0xOworICBjb25zdCBjaGFyICppbl9maWxlID0gTlVMTCwgKm91dF9maWxlID0gTlVMTCwgKmR1bXBfZmlsZSA9IE5VTEw7CisgIEZJTEUgKm91dCA9IE5VTEw7CisgIGludCBjOworICBpbnQgc2hvcnRfb3V0cHV0ID0gMDsKKyAgaW50IHF1aWV0ID0gMDsKKyAgaW50IGtlZXBfYWxwaGEgPSAxOworICBpbnQgYmxlbmRfYWxwaGEgPSAwOworICB1aW50MzJfdCBiYWNrZ3JvdW5kX2NvbG9yID0gMHhmZmZmZmZ1OworICBpbnQgY3JvcCA9IDAsIGNyb3BfeCA9IDAsIGNyb3BfeSA9IDAsIGNyb3BfdyA9IDAsIGNyb3BfaCA9IDA7CisgIGludCByZXNpemVfdyA9IDAsIHJlc2l6ZV9oID0gMDsKKyAgaW50IGxvc3NsZXNzX3ByZXNldCA9IDY7CisgIGludCB1c2VfbG9zc2xlc3NfcHJlc2V0ID0gLTE7ICAvLyAtMT11bnNldCwgMD1kb24ndCB1c2UsIDE9dXNlIGl0CisgIGludCBzaG93X3Byb2dyZXNzID0gMDsKKyAgaW50IGtlZXBfbWV0YWRhdGEgPSAwOworICBpbnQgbWV0YWRhdGFfd3JpdHRlbiA9IDA7CisgIFdlYlBQaWN0dXJlIHBpY3R1cmU7CisgIGludCBwcmludF9kaXN0b3J0aW9uID0gLTE7ICAgICAgICAvLyAtMT1vZmYsIDA9UFNOUiwgMT1TU0lNLCAyPUxTSU0KKyAgV2ViUFBpY3R1cmUgb3JpZ2luYWxfcGljdHVyZTsgICAgLy8gd2hlbiBQU05SIG9yIFNTSU0gaXMgcmVxdWVzdGVkCisgIFdlYlBDb25maWcgY29uZmlnOworICBXZWJQQXV4U3RhdHMgc3RhdHM7CisgIFdlYlBNZW1vcnlXcml0ZXIgbWVtb3J5X3dyaXRlcjsKKyAgTWV0YWRhdGEgbWV0YWRhdGE7CisgIFN0b3B3YXRjaCBzdG9wX3dhdGNoOworCisgIE1ldGFkYXRhSW5pdCgmbWV0YWRhdGEpOworICBXZWJQTWVtb3J5V3JpdGVySW5pdCgmbWVtb3J5X3dyaXRlcik7CisgIGlmICghV2ViUFBpY3R1cmVJbml0KCZwaWN0dXJlKSB8fAorICAgICAgIVdlYlBQaWN0dXJlSW5pdCgmb3JpZ2luYWxfcGljdHVyZSkgfHwKKyAgICAgICFXZWJQQ29uZmlnSW5pdCgmY29uZmlnKSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IhIFZlcnNpb24gbWlzbWF0Y2ghXG4iKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBpZiAoYXJnYyA9PSAxKSB7CisgICAgSGVscFNob3J0KCk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBmb3IgKGMgPSAxOyBjIDwgYXJnYzsgKytjKSB7CisgICAgaW50IHBhcnNlX2Vycm9yID0gMDsKKyAgICBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWgiKSB8fCAhc3RyY21wKGFyZ3ZbY10sICItaGVscCIpKSB7CisgICAgICBIZWxwU2hvcnQoKTsKKyAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLUgiKSB8fCAhc3RyY21wKGFyZ3ZbY10sICItbG9uZ2hlbHAiKSkgeworICAgICAgSGVscExvbmcoKTsKKyAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLW8iKSAmJiBjIDwgYXJnYyAtIDEpIHsKKyAgICAgIG91dF9maWxlID0gYXJndlsrK2NdOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWQiKSAmJiBjIDwgYXJnYyAtIDEpIHsKKyAgICAgIGR1bXBfZmlsZSA9IGFyZ3ZbKytjXTsKKyAgICAgIGNvbmZpZy5zaG93X2NvbXByZXNzZWQgPSAxOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXByaW50X3BzbnIiKSkgeworICAgICAgY29uZmlnLnNob3dfY29tcHJlc3NlZCA9IDE7CisgICAgICBwcmludF9kaXN0b3J0aW9uID0gMDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1wcmludF9zc2ltIikpIHsKKyAgICAgIGNvbmZpZy5zaG93X2NvbXByZXNzZWQgPSAxOworICAgICAgcHJpbnRfZGlzdG9ydGlvbiA9IDE7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItcHJpbnRfbHNpbSIpKSB7CisgICAgICBjb25maWcuc2hvd19jb21wcmVzc2VkID0gMTsKKyAgICAgIHByaW50X2Rpc3RvcnRpb24gPSAyOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXNob3J0IikpIHsKKyAgICAgICsrc2hvcnRfb3V0cHV0OworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXMiKSAmJiBjIDwgYXJnYyAtIDIpIHsKKyAgICAgIHBpY3R1cmUud2lkdGggPSBFeFV0aWxHZXRJbnQoYXJndlsrK2NdLCAwLCAmcGFyc2VfZXJyb3IpOworICAgICAgcGljdHVyZS5oZWlnaHQgPSBFeFV0aWxHZXRJbnQoYXJndlsrK2NdLCAwLCAmcGFyc2VfZXJyb3IpOworICAgICAgaWYgKHBpY3R1cmUud2lkdGggPiBXRUJQX01BWF9ESU1FTlNJT04gfHwgcGljdHVyZS53aWR0aCA8IDAgfHwKKyAgICAgICAgICBwaWN0dXJlLmhlaWdodCA+IFdFQlBfTUFYX0RJTUVOU0lPTiB8fCAgcGljdHVyZS5oZWlnaHQgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICJTcGVjaWZpZWQgZGltZW5zaW9uICglZCB4ICVkKSBpcyBvdXQgb2YgcmFuZ2UuXG4iLAorICAgICAgICAgICAgICAgIHBpY3R1cmUud2lkdGgsIHBpY3R1cmUuaGVpZ2h0KTsKKyAgICAgICAgZ290byBFcnJvcjsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1tIikgJiYgYyA8IGFyZ2MgLSAxKSB7CisgICAgICBjb25maWcubWV0aG9kID0gRXhVdGlsR2V0SW50KGFyZ3ZbKytjXSwgMCwgJnBhcnNlX2Vycm9yKTsKKyAgICAgIHVzZV9sb3NzbGVzc19wcmVzZXQgPSAwOyAgIC8vIGRpc2FibGUgLXogb3B0aW9uCisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItcSIpICYmIGMgPCBhcmdjIC0gMSkgeworICAgICAgY29uZmlnLnF1YWxpdHkgPSBFeFV0aWxHZXRGbG9hdChhcmd2WysrY10sICZwYXJzZV9lcnJvcik7CisgICAgICB1c2VfbG9zc2xlc3NfcHJlc2V0ID0gMDsgICAvLyBkaXNhYmxlIC16IG9wdGlvbgorICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXoiKSAmJiBjIDwgYXJnYyAtIDEpIHsKKyAgICAgIGxvc3NsZXNzX3ByZXNldCA9IEV4VXRpbEdldEludChhcmd2WysrY10sIDAsICZwYXJzZV9lcnJvcik7CisgICAgICBpZiAodXNlX2xvc3NsZXNzX3ByZXNldCAhPSAwKSB1c2VfbG9zc2xlc3NfcHJlc2V0ID0gMTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1hbHBoYV9xIikgJiYgYyA8IGFyZ2MgLSAxKSB7CisgICAgICBjb25maWcuYWxwaGFfcXVhbGl0eSA9IEV4VXRpbEdldEludChhcmd2WysrY10sIDAsICZwYXJzZV9lcnJvcik7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItYWxwaGFfbWV0aG9kIikgJiYgYyA8IGFyZ2MgLSAxKSB7CisgICAgICBjb25maWcuYWxwaGFfY29tcHJlc3Npb24gPSBFeFV0aWxHZXRJbnQoYXJndlsrK2NdLCAwLCAmcGFyc2VfZXJyb3IpOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWFscGhhX2NsZWFudXAiKSkgeworICAgICAgLy8gVGhpcyBmbGFnIGlzIG9ic29sZXRlLCBkb2VzIG9wcG9zaXRlIG9mIC1leGFjdC4KKyAgICAgIGNvbmZpZy5leGFjdCA9IDA7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItZXhhY3QiKSkgeworICAgICAgY29uZmlnLmV4YWN0ID0gMTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1ibGVuZF9hbHBoYSIpICYmIGMgPCBhcmdjIC0gMSkgeworICAgICAgYmxlbmRfYWxwaGEgPSAxOworICAgICAgLy8gYmFja2dyb3VuZCBjb2xvciBpcyBnaXZlbiBpbiBoZXggd2l0aCBhbiBvcHRpb25hbCAnMHgnIHByZWZpeAorICAgICAgYmFja2dyb3VuZF9jb2xvciA9IEV4VXRpbEdldEludChhcmd2WysrY10sIDE2LCAmcGFyc2VfZXJyb3IpOworICAgICAgYmFja2dyb3VuZF9jb2xvciA9IGJhY2tncm91bmRfY29sb3IgJiAweDAwZmZmZmZmdTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1hbHBoYV9maWx0ZXIiKSAmJiBjIDwgYXJnYyAtIDEpIHsKKyAgICAgICsrYzsKKyAgICAgIGlmICghc3RyY21wKGFyZ3ZbY10sICJub25lIikpIHsKKyAgICAgICAgY29uZmlnLmFscGhhX2ZpbHRlcmluZyA9IDA7CisgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgImZhc3QiKSkgeworICAgICAgICBjb25maWcuYWxwaGFfZmlsdGVyaW5nID0gMTsKKyAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiYmVzdCIpKSB7CisgICAgICAgIGNvbmZpZy5hbHBoYV9maWx0ZXJpbmcgPSAyOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciEgVW5yZWNvZ25pemVkIGFscGhhIGZpbHRlcjogJXNcbiIsIGFyZ3ZbY10pOworICAgICAgICBnb3RvIEVycm9yOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLW5vYWxwaGEiKSkgeworICAgICAga2VlcF9hbHBoYSA9IDA7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItbG9zc2xlc3MiKSkgeworICAgICAgY29uZmlnLmxvc3NsZXNzID0gMTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1uZWFyX2xvc3NsZXNzIikgJiYgYyA8IGFyZ2MgLSAxKSB7CisgICAgICBjb25maWcubmVhcl9sb3NzbGVzcyA9IEV4VXRpbEdldEludChhcmd2WysrY10sIDAsICZwYXJzZV9lcnJvcik7CisgICAgICBjb25maWcubG9zc2xlc3MgPSAxOyAgLy8gdXNlIG5lYXItbG9zc2xlc3Mgb25seSB3aXRoIGxvc3NsZXNzCisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItaGludCIpICYmIGMgPCBhcmdjIC0gMSkgeworICAgICAgKytjOworICAgICAgaWYgKCFzdHJjbXAoYXJndltjXSwgInBob3RvIikpIHsKKyAgICAgICAgY29uZmlnLmltYWdlX2hpbnQgPSBXRUJQX0hJTlRfUEhPVE87CisgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgInBpY3R1cmUiKSkgeworICAgICAgICBjb25maWcuaW1hZ2VfaGludCA9IFdFQlBfSElOVF9QSUNUVVJFOworICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICJncmFwaCIpKSB7CisgICAgICAgIGNvbmZpZy5pbWFnZV9oaW50ID0gV0VCUF9ISU5UX0dSQVBIOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciEgVW5yZWNvZ25pemVkIGltYWdlIGhpbnQ6ICVzXG4iLCBhcmd2W2NdKTsKKyAgICAgICAgZ290byBFcnJvcjsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1zaXplIikgJiYgYyA8IGFyZ2MgLSAxKSB7CisgICAgICBjb25maWcudGFyZ2V0X3NpemUgPSBFeFV0aWxHZXRJbnQoYXJndlsrK2NdLCAwLCAmcGFyc2VfZXJyb3IpOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXBzbnIiKSAmJiBjIDwgYXJnYyAtIDEpIHsKKyAgICAgIGNvbmZpZy50YXJnZXRfUFNOUiA9IEV4VXRpbEdldEZsb2F0KGFyZ3ZbKytjXSwgJnBhcnNlX2Vycm9yKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1zbnMiKSAmJiBjIDwgYXJnYyAtIDEpIHsKKyAgICAgIGNvbmZpZy5zbnNfc3RyZW5ndGggPSBFeFV0aWxHZXRJbnQoYXJndlsrK2NdLCAwLCAmcGFyc2VfZXJyb3IpOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWYiKSAmJiBjIDwgYXJnYyAtIDEpIHsKKyAgICAgIGNvbmZpZy5maWx0ZXJfc3RyZW5ndGggPSBFeFV0aWxHZXRJbnQoYXJndlsrK2NdLCAwLCAmcGFyc2VfZXJyb3IpOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWFmIikpIHsKKyAgICAgIGNvbmZpZy5hdXRvZmlsdGVyID0gMTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1qcGVnX2xpa2UiKSkgeworICAgICAgY29uZmlnLmVtdWxhdGVfanBlZ19zaXplID0gMTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1tdCIpKSB7CisgICAgICArK2NvbmZpZy50aHJlYWRfbGV2ZWw7ICAvLyBpbmNyZWFzZSB0aHJlYWQgbGV2ZWwKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1sb3dfbWVtb3J5IikpIHsKKyAgICAgIGNvbmZpZy5sb3dfbWVtb3J5ID0gMTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1zdHJvbmciKSkgeworICAgICAgY29uZmlnLmZpbHRlcl90eXBlID0gMTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1ub3N0cm9uZyIpKSB7CisgICAgICBjb25maWcuZmlsdGVyX3R5cGUgPSAwOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXNoYXJwbmVzcyIpICYmIGMgPCBhcmdjIC0gMSkgeworICAgICAgY29uZmlnLmZpbHRlcl9zaGFycG5lc3MgPSBFeFV0aWxHZXRJbnQoYXJndlsrK2NdLCAwLCAmcGFyc2VfZXJyb3IpOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXNoYXJwX3l1diIpKSB7CisgICAgICBjb25maWcudXNlX3NoYXJwX3l1diA9IDE7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItcGFzcyIpICYmIGMgPCBhcmdjIC0gMSkgeworICAgICAgY29uZmlnLnBhc3MgPSBFeFV0aWxHZXRJbnQoYXJndlsrK2NdLCAwLCAmcGFyc2VfZXJyb3IpOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXByZSIpICYmIGMgPCBhcmdjIC0gMSkgeworICAgICAgY29uZmlnLnByZXByb2Nlc3NpbmcgPSBFeFV0aWxHZXRJbnQoYXJndlsrK2NdLCAwLCAmcGFyc2VfZXJyb3IpOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXNlZ21lbnRzIikgJiYgYyA8IGFyZ2MgLSAxKSB7CisgICAgICBjb25maWcuc2VnbWVudHMgPSBFeFV0aWxHZXRJbnQoYXJndlsrK2NdLCAwLCAmcGFyc2VfZXJyb3IpOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXBhcnRpdGlvbl9saW1pdCIpICYmIGMgPCBhcmdjIC0gMSkgeworICAgICAgY29uZmlnLnBhcnRpdGlvbl9saW1pdCA9IEV4VXRpbEdldEludChhcmd2WysrY10sIDAsICZwYXJzZV9lcnJvcik7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItbWFwIikgJiYgYyA8IGFyZ2MgLSAxKSB7CisgICAgICBwaWN0dXJlLmV4dHJhX2luZm9fdHlwZSA9IEV4VXRpbEdldEludChhcmd2WysrY10sIDAsICZwYXJzZV9lcnJvcik7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItY3JvcCIpICYmIGMgPCBhcmdjIC0gNCkgeworICAgICAgY3JvcCA9IDE7CisgICAgICBjcm9wX3ggPSBFeFV0aWxHZXRJbnQoYXJndlsrK2NdLCAwLCAmcGFyc2VfZXJyb3IpOworICAgICAgY3JvcF95ID0gRXhVdGlsR2V0SW50KGFyZ3ZbKytjXSwgMCwgJnBhcnNlX2Vycm9yKTsKKyAgICAgIGNyb3BfdyA9IEV4VXRpbEdldEludChhcmd2WysrY10sIDAsICZwYXJzZV9lcnJvcik7CisgICAgICBjcm9wX2ggPSBFeFV0aWxHZXRJbnQoYXJndlsrK2NdLCAwLCAmcGFyc2VfZXJyb3IpOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXJlc2l6ZSIpICYmIGMgPCBhcmdjIC0gMikgeworICAgICAgcmVzaXplX3cgPSBFeFV0aWxHZXRJbnQoYXJndlsrK2NdLCAwLCAmcGFyc2VfZXJyb3IpOworICAgICAgcmVzaXplX2ggPSBFeFV0aWxHZXRJbnQoYXJndlsrK2NdLCAwLCAmcGFyc2VfZXJyb3IpOworI2lmbmRlZiBXRUJQX0RMTAorICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLW5vYXNtIikpIHsKKyAgICAgIFZQOEdldENQVUluZm8gPSBOVUxMOworI2VuZGlmCisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItdmVyc2lvbiIpKSB7CisgICAgICBjb25zdCBpbnQgdmVyc2lvbiA9IFdlYlBHZXRFbmNvZGVyVmVyc2lvbigpOworICAgICAgcHJpbnRmKCIlZC4lZC4lZFxuIiwKKyAgICAgICAgICAgICAodmVyc2lvbiA+PiAxNikgJiAweGZmLCAodmVyc2lvbiA+PiA4KSAmIDB4ZmYsIHZlcnNpb24gJiAweGZmKTsKKyAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXByb2dyZXNzIikpIHsKKyAgICAgIHNob3dfcHJvZ3Jlc3MgPSAxOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXF1aWV0IikpIHsKKyAgICAgIHF1aWV0ID0gMTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1wcmVzZXQiKSAmJiBjIDwgYXJnYyAtIDEpIHsKKyAgICAgIFdlYlBQcmVzZXQgcHJlc2V0OworICAgICAgKytjOworICAgICAgaWYgKCFzdHJjbXAoYXJndltjXSwgImRlZmF1bHQiKSkgeworICAgICAgICBwcmVzZXQgPSBXRUJQX1BSRVNFVF9ERUZBVUxUOworICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICJwaG90byIpKSB7CisgICAgICAgIHByZXNldCA9IFdFQlBfUFJFU0VUX1BIT1RPOworICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICJwaWN0dXJlIikpIHsKKyAgICAgICAgcHJlc2V0ID0gV0VCUF9QUkVTRVRfUElDVFVSRTsKKyAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiZHJhd2luZyIpKSB7CisgICAgICAgIHByZXNldCA9IFdFQlBfUFJFU0VUX0RSQVdJTkc7CisgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgImljb24iKSkgeworICAgICAgICBwcmVzZXQgPSBXRUJQX1BSRVNFVF9JQ09OOworICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICJ0ZXh0IikpIHsKKyAgICAgICAgcHJlc2V0ID0gV0VCUF9QUkVTRVRfVEVYVDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IhIFVucmVjb2duaXplZCBwcmVzZXQ6ICVzXG4iLCBhcmd2W2NdKTsKKyAgICAgICAgZ290byBFcnJvcjsKKyAgICAgIH0KKyAgICAgIGlmICghV2ViUENvbmZpZ1ByZXNldCgmY29uZmlnLCBwcmVzZXQsIGNvbmZpZy5xdWFsaXR5KSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yISBDb3VsZCBpbml0aWFsaXplIGNvbmZpZ3VyYXRpb24gd2l0aCBwcmVzZXQuXG4iKTsKKyAgICAgICAgZ290byBFcnJvcjsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1tZXRhZGF0YSIpICYmIGMgPCBhcmdjIC0gMSkgeworICAgICAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgICAgIGNvbnN0IGNoYXIqIG9wdGlvbjsKKyAgICAgICAgaW50IGZsYWc7CisgICAgICB9IGtUb2tlbnNbXSA9IHsKKyAgICAgICAgeyAiYWxsIiwgIE1FVEFEQVRBX0FMTCB9LAorICAgICAgICB7ICJub25lIiwgMCB9LAorICAgICAgICB7ICJleGlmIiwgTUVUQURBVEFfRVhJRiB9LAorICAgICAgICB7ICJpY2MiLCAgTUVUQURBVEFfSUNDIH0sCisgICAgICAgIHsgInhtcCIsICBNRVRBREFUQV9YTVAgfSwKKyAgICAgIH07CisgICAgICBjb25zdCBzaXplX3Qga051bVRva2VucyA9IHNpemVvZihrVG9rZW5zKSAvIHNpemVvZihrVG9rZW5zWzBdKTsKKyAgICAgIGNvbnN0IGNoYXIqIHN0YXJ0ID0gYXJndlsrK2NdOworICAgICAgY29uc3QgY2hhciogY29uc3QgZW5kID0gc3RhcnQgKyBzdHJsZW4oc3RhcnQpOworCisgICAgICB3aGlsZSAoc3RhcnQgPCBlbmQpIHsKKyAgICAgICAgc2l6ZV90IGk7CisgICAgICAgIGNvbnN0IGNoYXIqIHRva2VuID0gc3RyY2hyKHN0YXJ0LCAnLCcpOworICAgICAgICBpZiAodG9rZW4gPT0gTlVMTCkgdG9rZW4gPSBlbmQ7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGtOdW1Ub2tlbnM7ICsraSkgeworICAgICAgICAgIGlmICgoc2l6ZV90KSh0b2tlbiAtIHN0YXJ0KSA9PSBzdHJsZW4oa1Rva2Vuc1tpXS5vcHRpb24pICYmCisgICAgICAgICAgICAgICFzdHJuY21wKHN0YXJ0LCBrVG9rZW5zW2ldLm9wdGlvbiwgc3RybGVuKGtUb2tlbnNbaV0ub3B0aW9uKSkpIHsKKyAgICAgICAgICAgIGlmIChrVG9rZW5zW2ldLmZsYWcgIT0gMCkgeworICAgICAgICAgICAgICBrZWVwX21ldGFkYXRhIHw9IGtUb2tlbnNbaV0uZmxhZzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGtlZXBfbWV0YWRhdGEgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChpID09IGtOdW1Ub2tlbnMpIHsKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yISBVbmtub3duIG1ldGFkYXRhIHR5cGUgJyUuKnMnXG4iLAorICAgICAgICAgICAgICAgICAgKGludCkodG9rZW4gLSBzdGFydCksIHN0YXJ0KTsKKyAgICAgICAgICBIZWxwTG9uZygpOworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBzdGFydCA9IHRva2VuICsgMTsKKyAgICAgIH0KKyNpZmRlZiBIQVZFX1dJTkNPREVDX0gKKyAgICAgIGlmIChrZWVwX21ldGFkYXRhICE9IDAgJiYga2VlcF9tZXRhZGF0YSAhPSBNRVRBREFUQV9JQ0MpIHsKKyAgICAgICAgLy8gVE9ETyhqemVybik6IHJlbW92ZSB3aGVuIC1tZXRhZGF0YSBpcyBzdXBwb3J0ZWQgb24gYWxsIHBsYXRmb3Jtcy4KKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiBvbmx5IElDQyBwcm9maWxlIGV4dHJhY3Rpb24gaXMgY3VycmVudGx5IgorICAgICAgICAgICAgICAgICAgICAgICAgIiBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybSFcbiIpOworICAgICAgfQorI2VuZGlmCisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItdiIpKSB7CisgICAgICB2ZXJib3NlID0gMTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi0tIikpIHsKKyAgICAgIGlmIChjIDwgYXJnYyAtIDEpIGluX2ZpbGUgPSBhcmd2WysrY107CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgaWYgKGFyZ3ZbY11bMF0gPT0gJy0nKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yISBVbmtub3duIG9wdGlvbiAnJXMnXG4iLCBhcmd2W2NdKTsKKyAgICAgIEhlbHBMb25nKCk7CisgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlIHsKKyAgICAgIGluX2ZpbGUgPSBhcmd2W2NdOworICAgIH0KKworICAgIGlmIChwYXJzZV9lcnJvcikgeworICAgICAgSGVscExvbmcoKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KKyAgaWYgKGluX2ZpbGUgPT0gTlVMTCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiTm8gaW5wdXQgZmlsZSBzcGVjaWZpZWQhXG4iKTsKKyAgICBIZWxwU2hvcnQoKTsKKyAgICBnb3RvIEVycm9yOworICB9CisKKyAgaWYgKHVzZV9sb3NzbGVzc19wcmVzZXQgPT0gMSkgeworICAgIGlmICghV2ViUENvbmZpZ0xvc3NsZXNzUHJlc2V0KCZjb25maWcsIGxvc3NsZXNzX3ByZXNldCkpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBsb3NzbGVzcyBwcmVzZXQgKC16ICVkKVxuIiwgbG9zc2xlc3NfcHJlc2V0KTsKKyAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorICB9CisKKyAgLy8gQ2hlY2sgZm9yIHVuc3VwcG9ydGVkIGNvbW1hbmQgbGluZSBvcHRpb25zIGZvciBsb3NzbGVzcyBtb2RlIGFuZCBsb2cKKyAgLy8gd2FybmluZyBmb3Igc3VjaCBvcHRpb25zLgorICBpZiAoIXF1aWV0ICYmIGNvbmZpZy5sb3NzbGVzcyA9PSAxKSB7CisgICAgaWYgKGNvbmZpZy50YXJnZXRfc2l6ZSA+IDAgfHwgY29uZmlnLnRhcmdldF9QU05SID4gMCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJFbmNvZGluZyBmb3Igc3BlY2lmaWVkIHNpemUgb3IgUFNOUiBpcyBub3Qgc3VwcG9ydGVkIgorICAgICAgICAgICAgICAgICAgICAgICIgZm9yIGxvc3NsZXNzIGVuY29kaW5nLiBJZ25vcmluZyBzdWNoIG9wdGlvbihzKSFcbiIpOworICAgIH0KKyAgICBpZiAoY29uZmlnLnBhcnRpdGlvbl9saW1pdCA+IDApIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiUGFydGl0aW9uIGxpbWl0IG9wdGlvbiBpcyBub3QgcmVxdWlyZWQgZm9yIGxvc3NsZXNzIgorICAgICAgICAgICAgICAgICAgICAgICIgZW5jb2RpbmcuIElnbm9yaW5nIHRoaXMgb3B0aW9uIVxuIik7CisgICAgfQorICB9CisgIC8vIElmIGEgdGFyZ2V0IHNpemUgb3IgUFNOUiB3YXMgZ2l2ZW4sIGJ1dCBzb21laG93IHRoZSAtcGFzcyBvcHRpb24gd2FzCisgIC8vIG9taXR0ZWQsIGZvcmNlIGEgcmVhc29uYWJsZSB2YWx1ZS4KKyAgaWYgKGNvbmZpZy50YXJnZXRfc2l6ZSA+IDAgfHwgY29uZmlnLnRhcmdldF9QU05SID4gMCkgeworICAgIGlmIChjb25maWcucGFzcyA9PSAxKSBjb25maWcucGFzcyA9IDY7CisgIH0KKworICBpZiAoIVdlYlBWYWxpZGF0ZUNvbmZpZygmY29uZmlnKSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IhIEludmFsaWQgY29uZmlndXJhdGlvbi5cbiIpOworICAgIGdvdG8gRXJyb3I7CisgIH0KKworICAvLyBSZWFkIHRoZSBpbnB1dC4gV2UgbmVlZCB0byBkZWNpZGUgaWYgd2UgcHJlZmVyIEFSR0Igb3IgWVVWQQorICAvLyBzYW1wbGVzLCBkZXBlbmRpbmcgb24gdGhlIGV4cGVjdGVkIGNvbXByZXNzaW9uIG1vZGUgKHRoaXMgc2F2ZXMKKyAgLy8gc29tZSBjb252ZXJzaW9uIHN0ZXBzKS4KKyAgcGljdHVyZS51c2VfYXJnYiA9IChjb25maWcubG9zc2xlc3MgfHwgY29uZmlnLnVzZV9zaGFycF95dXYgfHwKKyAgICAgICAgICAgICAgICAgICAgICBjb25maWcucHJlcHJvY2Vzc2luZyA+IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICBjcm9wIHx8IChyZXNpemVfdyB8IHJlc2l6ZV9oKSA+IDApOworICBpZiAodmVyYm9zZSkgeworICAgIFN0b3B3YXRjaFJlc2V0KCZzdG9wX3dhdGNoKTsKKyAgfQorICBpZiAoIVJlYWRQaWN0dXJlKGluX2ZpbGUsICZwaWN0dXJlLCBrZWVwX2FscGhhLAorICAgICAgICAgICAgICAgICAgIChrZWVwX21ldGFkYXRhID09IDApID8gTlVMTCA6ICZtZXRhZGF0YSkpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yISBDYW5ub3QgcmVhZCBpbnB1dCBwaWN0dXJlIGZpbGUgJyVzJ1xuIiwgaW5fZmlsZSk7CisgICAgZ290byBFcnJvcjsKKyAgfQorICBwaWN0dXJlLnByb2dyZXNzX2hvb2sgPSAoc2hvd19wcm9ncmVzcyAmJiAhcXVpZXQpID8gUHJvZ3Jlc3NSZXBvcnQgOiBOVUxMOworCisgIGlmIChibGVuZF9hbHBoYSkgeworICAgIFdlYlBCbGVuZEFscGhhKCZwaWN0dXJlLCBiYWNrZ3JvdW5kX2NvbG9yKTsKKyAgfQorCisgIGlmICh2ZXJib3NlKSB7CisgICAgY29uc3QgZG91YmxlIHJlYWRfdGltZSA9IFN0b3B3YXRjaFJlYWRBbmRSZXNldCgmc3RvcF93YXRjaCk7CisgICAgZnByaW50ZihzdGRlcnIsICJUaW1lIHRvIHJlYWQgaW5wdXQ6ICUuM2ZzXG4iLCByZWFkX3RpbWUpOworICB9CisKKyAgLy8gT3BlbiB0aGUgb3V0cHV0CisgIGlmIChvdXRfZmlsZSAhPSBOVUxMKSB7CisgICAgY29uc3QgaW50IHVzZV9zdGRvdXQgPSAhc3RyY21wKG91dF9maWxlLCAiLSIpOworICAgIG91dCA9IHVzZV9zdGRvdXQgPyBJbWdJb1V0aWxTZXRCaW5hcnlNb2RlKHN0ZG91dCkgOiBmb3BlbihvdXRfZmlsZSwgIndiIik7CisgICAgaWYgKG91dCA9PSBOVUxMKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yISBDYW5ub3Qgb3BlbiBvdXRwdXQgZmlsZSAnJXMnXG4iLCBvdXRfZmlsZSk7CisgICAgICBnb3RvIEVycm9yOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoIXNob3J0X291dHB1dCAmJiAhcXVpZXQpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJTYXZpbmcgZmlsZSAnJXMnXG4iLCBvdXRfZmlsZSk7CisgICAgICB9CisgICAgfQorICAgIGlmIChrZWVwX21ldGFkYXRhID09IDApIHsKKyAgICAgIHBpY3R1cmUud3JpdGVyID0gTXlXcml0ZXI7CisgICAgICBwaWN0dXJlLmN1c3RvbV9wdHIgPSAodm9pZCopb3V0OworICAgIH0gZWxzZSB7CisgICAgICBwaWN0dXJlLndyaXRlciA9IFdlYlBNZW1vcnlXcml0ZTsKKyAgICAgIHBpY3R1cmUuY3VzdG9tX3B0ciA9ICh2b2lkKikmbWVtb3J5X3dyaXRlcjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgb3V0ID0gTlVMTDsKKyAgICBpZiAoIXF1aWV0ICYmICFzaG9ydF9vdXRwdXQpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiTm8gb3V0cHV0IGZpbGUgc3BlY2lmaWVkIChubyAtbyBmbGFnKS4gRW5jb2Rpbmcgd2lsbFxuIik7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgImJlIHBlcmZvcm1lZCwgYnV0IGl0cyByZXN1bHRzIGRpc2NhcmRlZC5cblxuIik7CisgICAgfQorICB9CisgIGlmICghcXVpZXQpIHsKKyAgICBwaWN0dXJlLnN0YXRzID0gJnN0YXRzOworICAgIHBpY3R1cmUudXNlcl9kYXRhID0gKHZvaWQqKWluX2ZpbGU7CisgIH0KKworICAvLyBDcm9wICYgcmVzaXplLgorICBpZiAodmVyYm9zZSkgeworICAgIFN0b3B3YXRjaFJlc2V0KCZzdG9wX3dhdGNoKTsKKyAgfQorICBpZiAoY3JvcCAhPSAwKSB7CisgICAgLy8gV2UgdXNlIHNlbGYtY3JvcHBpbmcgdXNpbmcgYSB2aWV3LgorICAgIGlmICghV2ViUFBpY3R1cmVWaWV3KCZwaWN0dXJlLCBjcm9wX3gsIGNyb3BfeSwgY3JvcF93LCBjcm9wX2gsICZwaWN0dXJlKSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciEgQ2Fubm90IGNyb3AgcGljdHVyZVxuIik7CisgICAgICBnb3RvIEVycm9yOworICAgIH0KKyAgfQorICBpZiAoKHJlc2l6ZV93IHwgcmVzaXplX2gpID4gMCkgeworICAgIGlmICghV2ViUFBpY3R1cmVSZXNjYWxlKCZwaWN0dXJlLCByZXNpemVfdywgcmVzaXplX2gpKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yISBDYW5ub3QgcmVzaXplIHBpY3R1cmVcbiIpOworICAgICAgZ290byBFcnJvcjsKKyAgICB9CisgIH0KKyAgaWYgKHZlcmJvc2UgJiYgKGNyb3AgIT0gMCB8fCAocmVzaXplX3cgfCByZXNpemVfaCkgPiAwKSkgeworICAgIGNvbnN0IGRvdWJsZSBwcmVwcm9jX3RpbWUgPSBTdG9wd2F0Y2hSZWFkQW5kUmVzZXQoJnN0b3Bfd2F0Y2gpOworICAgIGZwcmludGYoc3RkZXJyLCAiVGltZSB0byBjcm9wL3Jlc2l6ZSBwaWN0dXJlOiAlLjNmc1xuIiwgcHJlcHJvY190aW1lKTsKKyAgfQorCisgIGlmIChwaWN0dXJlLmV4dHJhX2luZm9fdHlwZSA+IDApIHsKKyAgICBBbGxvY0V4dHJhSW5mbygmcGljdHVyZSk7CisgIH0KKyAgaWYgKHByaW50X2Rpc3RvcnRpb24gPj0gMCkgeyAgLy8gU2F2ZSBvcmlnaW5hbCBwaWN0dXJlIGZvciBsYXRlciBjb21wYXJpc29uCisgICAgV2ViUFBpY3R1cmVDb3B5KCZwaWN0dXJlLCAmb3JpZ2luYWxfcGljdHVyZSk7CisgIH0KKworICAvLyBDb21wcmVzcy4KKyAgaWYgKHZlcmJvc2UpIHsKKyAgICBTdG9wd2F0Y2hSZXNldCgmc3RvcF93YXRjaCk7CisgIH0KKyAgaWYgKCFXZWJQRW5jb2RlKCZjb25maWcsICZwaWN0dXJlKSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IhIENhbm5vdCBlbmNvZGUgcGljdHVyZSBhcyBXZWJQXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGNvZGU6ICVkICglcylcbiIsCisgICAgICAgICAgICBwaWN0dXJlLmVycm9yX2NvZGUsIGtFcnJvck1lc3NhZ2VzW3BpY3R1cmUuZXJyb3JfY29kZV0pOworICAgIGdvdG8gRXJyb3I7CisgIH0KKyAgaWYgKHZlcmJvc2UpIHsKKyAgICBjb25zdCBkb3VibGUgZW5jb2RlX3RpbWUgPSBTdG9wd2F0Y2hSZWFkQW5kUmVzZXQoJnN0b3Bfd2F0Y2gpOworICAgIGZwcmludGYoc3RkZXJyLCAiVGltZSB0byBlbmNvZGUgcGljdHVyZTogJS4zZnNcbiIsIGVuY29kZV90aW1lKTsKKyAgfQorCisgIC8vIFdyaXRlIGluZm8KKyAgaWYgKGR1bXBfZmlsZSkgeworICAgIGlmIChwaWN0dXJlLnVzZV9hcmdiKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6IGNhbid0IGR1bXAgZmlsZSAoLWQgb3B0aW9uKSBpbiBsb3NzbGVzcyBtb2RlLiIpOworICAgIH0gZWxzZSBpZiAoIUR1bXBQaWN0dXJlKCZwaWN0dXJlLCBkdW1wX2ZpbGUpKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmcsIGNvdWxkbid0IGR1bXAgcGljdHVyZSAlc1xuIiwgZHVtcF9maWxlKTsKKyAgICB9CisgIH0KKworICBpZiAoa2VlcF9tZXRhZGF0YSAhPSAwKSB7CisgICAgaWYgKG91dCAhPSBOVUxMKSB7CisgICAgICBpZiAoIVdyaXRlV2ViUFdpdGhNZXRhZGF0YShvdXQsICZwaWN0dXJlLCAmbWVtb3J5X3dyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXRhZGF0YSwga2VlcF9tZXRhZGF0YSwgJm1ldGFkYXRhX3dyaXR0ZW4pKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3Igd3JpdGluZyBXZWJQIGZpbGUgd2l0aCBtZXRhZGF0YSFcbiIpOworICAgICAgICBnb3RvIEVycm9yOworICAgICAgfQorICAgIH0gZWxzZSB7ICAvLyBvdXRwdXQgaXMgZGlzYWJsZWQsIGp1c3QgZGlzcGxheSB0aGUgbWV0YWRhdGEgc3RhdHMuCisgICAgICBjb25zdCBzdHJ1Y3QgeworICAgICAgICBjb25zdCBNZXRhZGF0YVBheWxvYWQqIGNvbnN0IHBheWxvYWQ7CisgICAgICAgIGludCBmbGFnOworICAgICAgfSAqaXRlciwgaW5mb1tdID0geworICAgICAgICB7ICZtZXRhZGF0YS5leGlmLCBNRVRBREFUQV9FWElGIH0sCisgICAgICAgIHsgJm1ldGFkYXRhLmljY3AsIE1FVEFEQVRBX0lDQyB9LAorICAgICAgICB7ICZtZXRhZGF0YS54bXAsIE1FVEFEQVRBX1hNUCB9LAorICAgICAgICB7IE5VTEwsIDAgfQorICAgICAgfTsKKyAgICAgIHVpbnQzMl90IHVudXNlZDEgPSAwOworICAgICAgdWludDY0X3QgdW51c2VkMiA9IDA7CisKKyAgICAgIGZvciAoaXRlciA9IGluZm87IGl0ZXItPnBheWxvYWQgIT0gTlVMTDsgKytpdGVyKSB7CisgICAgICAgIGlmIChVcGRhdGVGbGFnc0FuZFNpemUoaXRlci0+cGF5bG9hZCwgISEoa2VlcF9tZXRhZGF0YSAmIGl0ZXItPmZsYWcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICZ1bnVzZWQxLCAmdW51c2VkMikpIHsKKyAgICAgICAgICBtZXRhZGF0YV93cml0dGVuIHw9IGl0ZXItPmZsYWc7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoIXF1aWV0KSB7CisgICAgaWYgKCFzaG9ydF9vdXRwdXQgfHwgcHJpbnRfZGlzdG9ydGlvbiA8IDApIHsKKyAgICAgIGlmIChjb25maWcubG9zc2xlc3MpIHsKKyAgICAgICAgUHJpbnRFeHRyYUluZm9Mb3NzbGVzcygmcGljdHVyZSwgc2hvcnRfb3V0cHV0LCBpbl9maWxlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFByaW50RXh0cmFJbmZvTG9zc3koJnBpY3R1cmUsIHNob3J0X291dHB1dCwgY29uZmlnLmxvd19tZW1vcnksIGluX2ZpbGUpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIXNob3J0X291dHB1dCAmJiBwaWN0dXJlLmV4dHJhX2luZm9fdHlwZSA+IDApIHsKKyAgICAgIFByaW50TWFwSW5mbygmcGljdHVyZSk7CisgICAgfQorICAgIGlmIChwcmludF9kaXN0b3J0aW9uID49IDApIHsgICAgLy8gcHJpbnQgZGlzdG9ydGlvbgorICAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGRpc3RvcnRpb25fbmFtZXNbXSA9IHsgIlBTTlIiLCAiU1NJTSIsICJMU0lNIiB9OworICAgICAgZmxvYXQgdmFsdWVzWzVdOworICAgICAgaWYgKCFXZWJQUGljdHVyZURpc3RvcnRpb24oJnBpY3R1cmUsICZvcmlnaW5hbF9waWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfZGlzdG9ydGlvbiwgdmFsdWVzKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIHdoaWxlIGNvbXB1dGluZyB0aGUgZGlzdG9ydGlvbi5cbiIpOworICAgICAgICBnb3RvIEVycm9yOworICAgICAgfQorICAgICAgaWYgKCFzaG9ydF9vdXRwdXQpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogIiwgZGlzdG9ydGlvbl9uYW1lc1twcmludF9kaXN0b3J0aW9uXSk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQjolLjJmIEc6JS4yZiBSOiUuMmYgQTolLjJmICBUb3RhbDolLjJmXG4iLAorICAgICAgICAgICAgICAgIHZhbHVlc1swXSwgdmFsdWVzWzFdLCB2YWx1ZXNbMl0sIHZhbHVlc1szXSwgdmFsdWVzWzRdKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJTdkICUuNGZcbiIsIHBpY3R1cmUuc3RhdHMtPmNvZGVkX3NpemUsIHZhbHVlc1s0XSk7CisgICAgICB9CisgICAgfQorICAgIGlmICghc2hvcnRfb3V0cHV0KSB7CisgICAgICBQcmludE1ldGFkYXRhSW5mbygmbWV0YWRhdGEsIG1ldGFkYXRhX3dyaXR0ZW4pOworICAgIH0KKyAgfQorICByZXR1cm5fdmFsdWUgPSAwOworCisgRXJyb3I6CisgIFdlYlBNZW1vcnlXcml0ZXJDbGVhcigmbWVtb3J5X3dyaXRlcik7CisgIGZyZWUocGljdHVyZS5leHRyYV9pbmZvKTsKKyAgTWV0YWRhdGFGcmVlKCZtZXRhZGF0YSk7CisgIFdlYlBQaWN0dXJlRnJlZSgmcGljdHVyZSk7CisgIFdlYlBQaWN0dXJlRnJlZSgmb3JpZ2luYWxfcGljdHVyZSk7CisgIGlmIChvdXQgIT0gTlVMTCAmJiBvdXQgIT0gc3Rkb3V0KSB7CisgICAgZmNsb3NlKG91dCk7CisgIH0KKworICByZXR1cm4gcmV0dXJuX3ZhbHVlOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvZHdlYnAuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL2R3ZWJwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU0MDY5YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL2R3ZWJwLmMKQEAgLTAsMCArMSw0MTcgQEAKKy8vIENvcHlyaWdodCAyMDEwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgQ29tbWFuZC1saW5lIHRvb2wgZm9yIGRlY29kaW5nIGEgV2ViUCBpbWFnZS4KKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJ3ZWJwL2NvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICIuLi9leGFtcGxlcy9leGFtcGxlX3V0aWwuaCIKKyNpbmNsdWRlICIuLi9pbWFnZWlvL2ltYWdlX2VuYy5oIgorI2luY2x1ZGUgIi4uL2ltYWdlaW8vd2VicGRlYy5oIgorI2luY2x1ZGUgIi4vc3RvcHdhdGNoLmgiCisKK3N0YXRpYyBpbnQgdmVyYm9zZSA9IDA7CitzdGF0aWMgaW50IHF1aWV0ID0gMDsKKyNpZm5kZWYgV0VCUF9ETEwKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworZXh0ZXJuIHZvaWQqIFZQOEdldENQVUluZm87ICAgLy8gb3BhcXVlIGZvcndhcmQgZGVjbGFyYXRpb24uCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKyNlbmRpZiAgLy8gV0VCUF9ETEwKKworCitzdGF0aWMgaW50IFNhdmVPdXRwdXQoY29uc3QgV2ViUERlY0J1ZmZlciogY29uc3QgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgIFdlYlBPdXRwdXRGaWxlRm9ybWF0IGZvcm1hdCwgY29uc3QgY2hhciogY29uc3Qgb3V0X2ZpbGUpIHsKKyAgY29uc3QgaW50IHVzZV9zdGRvdXQgPSAob3V0X2ZpbGUgIT0gTlVMTCkgJiYgIXN0cmNtcChvdXRfZmlsZSwgIi0iKTsKKyAgaW50IG9rID0gMTsKKyAgU3RvcHdhdGNoIHN0b3Bfd2F0Y2g7CisKKyAgaWYgKHZlcmJvc2UpIHsKKyAgICBTdG9wd2F0Y2hSZXNldCgmc3RvcF93YXRjaCk7CisgIH0KKyAgb2sgPSBXZWJQU2F2ZUltYWdlKGJ1ZmZlciwgZm9ybWF0LCBvdXRfZmlsZSk7CisKKyAgaWYgKG9rKSB7CisgICAgaWYgKCFxdWlldCkgeworICAgICAgaWYgKHVzZV9zdGRvdXQpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJTYXZlZCB0byBzdGRvdXRcbiIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJTYXZlZCBmaWxlICVzXG4iLCBvdXRfZmlsZSk7CisgICAgICB9CisgICAgfQorICAgIGlmICh2ZXJib3NlKSB7CisgICAgICBjb25zdCBkb3VibGUgd3JpdGVfdGltZSA9IFN0b3B3YXRjaFJlYWRBbmRSZXNldCgmc3RvcF93YXRjaCk7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIlRpbWUgdG8gd3JpdGUgb3V0cHV0OiAlLjNmc1xuIiwgd3JpdGVfdGltZSk7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmICh1c2Vfc3Rkb3V0KSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIHdyaXRpbmcgdG8gc3Rkb3V0ICEhXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciB3cml0aW5nIGZpbGUgJXMgISFcbiIsIG91dF9maWxlKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG9rOworfQorCitzdGF0aWMgdm9pZCBIZWxwKHZvaWQpIHsKKyAgcHJpbnRmKCJVc2FnZTogZHdlYnAgaW5fZmlsZSBbb3B0aW9uc10gWy1vIG91dF9maWxlXVxuXG4iCisgICAgICAgICAiRGVjb2RlcyB0aGUgV2ViUCBpbWFnZSBmaWxlIHRvIFBORyBmb3JtYXQgW0RlZmF1bHRdXG4iCisgICAgICAgICAiVXNlIGZvbGxvd2luZyBvcHRpb25zIHRvIGNvbnZlcnQgaW50byBhbHRlcm5hdGUgaW1hZ2UgZm9ybWF0czpcbiIKKyAgICAgICAgICIgIC1wYW0gLi4uLi4uLi4uIHNhdmUgdGhlIHJhdyBSR0JBIHNhbXBsZXMgYXMgYSBjb2xvciBQQU1cbiIKKyAgICAgICAgICIgIC1wcG0gLi4uLi4uLi4uIHNhdmUgdGhlIHJhdyBSR0Igc2FtcGxlcyBhcyBhIGNvbG9yIFBQTVxuIgorICAgICAgICAgIiAgLWJtcCAuLi4uLi4uLi4gc2F2ZSBhcyB1bmNvbXByZXNzZWQgQk1QIGZvcm1hdFxuIgorICAgICAgICAgIiAgLXRpZmYgLi4uLi4uLi4gc2F2ZSBhcyB1bmNvbXByZXNzZWQgVElGRiBmb3JtYXRcbiIKKyAgICAgICAgICIgIC1wZ20gLi4uLi4uLi4uIHNhdmUgdGhlIHJhdyBZVVYgc2FtcGxlcyBhcyBhIGdyYXlzY2FsZSBQR01cbiIKKyAgICAgICAgICIgICAgICAgICAgICAgICAgIGZpbGUgd2l0aCBJTUM0IGxheW91dFxuIgorICAgICAgICAgIiAgLXl1diAuLi4uLi4uLi4gc2F2ZSB0aGUgcmF3IFlVViBzYW1wbGVzIGluIGZsYXQgbGF5b3V0XG4iCisgICAgICAgICAiXG4iCisgICAgICAgICAiIE90aGVyIG9wdGlvbnMgYXJlOlxuIgorICAgICAgICAgIiAgLXZlcnNpb24gLi4uLi4gcHJpbnQgdmVyc2lvbiBudW1iZXIgYW5kIGV4aXRcbiIKKyAgICAgICAgICIgIC1ub2ZhbmN5IC4uLi4uIGRvbid0IHVzZSB0aGUgZmFuY3kgWVVWNDIwIHVwc2NhbGVyXG4iCisgICAgICAgICAiICAtbm9maWx0ZXIgLi4uLiBkaXNhYmxlIGluLWxvb3AgZmlsdGVyaW5nXG4iCisgICAgICAgICAiICAtbm9kaXRoZXIgLi4uLiBkaXNhYmxlIGRpdGhlcmluZ1xuIgorICAgICAgICAgIiAgLWRpdGhlciA8ZD4gLi4gZGl0aGVyaW5nIHN0cmVuZ3RoIChpbiAwLi4xMDApXG4iCisgICAgICAgICAiICAtYWxwaGFfZGl0aGVyICB1c2UgYWxwaGEtcGxhbmUgZGl0aGVyaW5nIGlmIG5lZWRlZFxuIgorICAgICAgICAgIiAgLW10IC4uLi4uLi4uLi4gdXNlIG11bHRpLXRocmVhZGluZ1xuIgorICAgICAgICAgIiAgLWNyb3AgPHg+IDx5PiA8dz4gPGg+IC4uLiBjcm9wIG91dHB1dCB3aXRoIHRoZSBnaXZlbiByZWN0YW5nbGVcbiIKKyAgICAgICAgICIgIC1yZXNpemUgPHc+IDxoPiAuLi4uLi4uLi4gc2NhbGUgdGhlIG91dHB1dCAoKmFmdGVyKiBhbnkgY3JvcHBpbmcpXG4iCisgICAgICAgICAiICAtZmxpcCAuLi4uLi4uLiBmbGlwIHRoZSBvdXRwdXQgdmVydGljYWxseVxuIgorICAgICAgICAgIiAgLWFscGhhIC4uLi4uLi4gb25seSBzYXZlIHRoZSBhbHBoYSBwbGFuZVxuIgorICAgICAgICAgIiAgLWluY3JlbWVudGFsIC4gdXNlIGluY3JlbWVudGFsIGRlY29kaW5nICh1c2VmdWwgZm9yIHRlc3RzKVxuIgorICAgICAgICAgIiAgLWggLi4uLi4uLi4uLi4gdGhpcyBoZWxwIG1lc3NhZ2VcbiIKKyAgICAgICAgICIgIC12IC4uLi4uLi4uLi4uIHZlcmJvc2UgKGUuZy4gcHJpbnQgZW5jb2RpbmcvZGVjb2RpbmcgdGltZXMpXG4iCisgICAgICAgICAiICAtcXVpZXQgLi4uLi4uLiBxdWlldCBtb2RlLCBkb24ndCBwcmludCBhbnl0aGluZ1xuIgorI2lmbmRlZiBXRUJQX0RMTAorICAgICAgICAgIiAgLW5vYXNtIC4uLi4uLi4gZGlzYWJsZSBhbGwgYXNzZW1ibHkgb3B0aW1pemF0aW9uc1xuIgorI2VuZGlmCisgICAgICAgICk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBrRm9ybWF0VHlwZVtdID0geworICAidW5zcGVjaWZpZWQiLCAibG9zc3kiLCAibG9zc2xlc3MiCit9OworCitzdGF0aWMgdWludDhfdCogQWxsb2NhdGVFeHRlcm5hbEJ1ZmZlcihXZWJQRGVjb2RlckNvbmZpZyogY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUE91dHB1dEZpbGVGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVzZV9leHRlcm5hbF9tZW1vcnkpIHsKKyAgdWludDhfdCogZXh0ZXJuYWxfYnVmZmVyID0gTlVMTDsKKyAgV2ViUERlY0J1ZmZlciogY29uc3Qgb3V0cHV0X2J1ZmZlciA9ICZjb25maWctPm91dHB1dDsKKyAgaW50IHcgPSBjb25maWctPmlucHV0LndpZHRoOworICBpbnQgaCA9IGNvbmZpZy0+aW5wdXQuaGVpZ2h0OworICBpZiAoY29uZmlnLT5vcHRpb25zLnVzZV9zY2FsaW5nKSB7CisgICAgdyA9IGNvbmZpZy0+b3B0aW9ucy5zY2FsZWRfd2lkdGg7CisgICAgaCA9IGNvbmZpZy0+b3B0aW9ucy5zY2FsZWRfaGVpZ2h0OworICB9IGVsc2UgaWYgKGNvbmZpZy0+b3B0aW9ucy51c2VfY3JvcHBpbmcpIHsKKyAgICB3ID0gY29uZmlnLT5vcHRpb25zLmNyb3Bfd2lkdGg7CisgICAgaCA9IGNvbmZpZy0+b3B0aW9ucy5jcm9wX2hlaWdodDsKKyAgfQorICBpZiAoZm9ybWF0ID49IFJHQiAmJiBmb3JtYXQgPD0gcmdiQV80NDQ0KSB7CisgICAgY29uc3QgaW50IGJwcCA9IChmb3JtYXQgPT0gUkdCIHx8IGZvcm1hdCA9PSBCR1IpID8gMworICAgICAgICAgICAgICAgICAgOiAoZm9ybWF0ID09IFJHQkFfNDQ0NCB8fCBmb3JtYXQgPT0gcmdiQV80NDQ0IHx8CisgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPT0gUkdCXzU2NSkgPyAyCisgICAgICAgICAgICAgICAgICA6IDQ7CisgICAgdWludDMyX3Qgc3RyaWRlID0gYnBwICogdyArIDc7ICAgLy8gPC0ganVzdCBmb3IgZXhlcmNpc2luZworICAgIGV4dGVybmFsX2J1ZmZlciA9ICh1aW50OF90KiltYWxsb2Moc3RyaWRlICogaCk7CisgICAgaWYgKGV4dGVybmFsX2J1ZmZlciA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBvdXRwdXRfYnVmZmVyLT51LlJHQkEuc3RyaWRlID0gc3RyaWRlOworICAgIG91dHB1dF9idWZmZXItPnUuUkdCQS5zaXplID0gc3RyaWRlICogaDsKKyAgICBvdXRwdXRfYnVmZmVyLT51LlJHQkEucmdiYSA9IGV4dGVybmFsX2J1ZmZlcjsKKyAgfSBlbHNlIHsgICAgLy8gWVVWIGFuZCBZVVZBCisgICAgY29uc3QgaW50IGhhc19hbHBoYSA9IFdlYlBJc0FscGhhTW9kZShvdXRwdXRfYnVmZmVyLT5jb2xvcnNwYWNlKTsKKyAgICB1aW50OF90KiB0bXA7CisgICAgdWludDMyX3Qgc3RyaWRlID0gdyArIDM7CisgICAgdWludDMyX3QgdXZfc3RyaWRlID0gKHcgKyAxKSAvIDIgKyAxMzsKKyAgICB1aW50MzJfdCB0b3RhbF9zaXplID0gc3RyaWRlICogaCAqIChoYXNfYWxwaGEgPyAyIDogMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgMiAqIHV2X3N0cmlkZSAqIChoICsgMSkgLyAyOworICAgIGFzc2VydChmb3JtYXQgPj0gWVVWICYmIGZvcm1hdCA8PSBZVVZBKTsKKyAgICBleHRlcm5hbF9idWZmZXIgPSAodWludDhfdCopbWFsbG9jKHRvdGFsX3NpemUpOworICAgIGlmIChleHRlcm5hbF9idWZmZXIgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgdG1wID0gZXh0ZXJuYWxfYnVmZmVyOworICAgIG91dHB1dF9idWZmZXItPnUuWVVWQS55ID0gdG1wOworICAgIG91dHB1dF9idWZmZXItPnUuWVVWQS55X3N0cmlkZSA9IHN0cmlkZTsKKyAgICBvdXRwdXRfYnVmZmVyLT51LllVVkEueV9zaXplID0gc3RyaWRlICogaDsKKyAgICB0bXAgKz0gb3V0cHV0X2J1ZmZlci0+dS5ZVVZBLnlfc2l6ZTsKKyAgICBpZiAoaGFzX2FscGhhKSB7CisgICAgICBvdXRwdXRfYnVmZmVyLT51LllVVkEuYSA9IHRtcDsKKyAgICAgIG91dHB1dF9idWZmZXItPnUuWVVWQS5hX3N0cmlkZSA9IHN0cmlkZTsKKyAgICAgIG91dHB1dF9idWZmZXItPnUuWVVWQS5hX3NpemUgPSBzdHJpZGUgKiBoOworICAgICAgdG1wICs9IG91dHB1dF9idWZmZXItPnUuWVVWQS5hX3NpemU7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dHB1dF9idWZmZXItPnUuWVVWQS5hID0gTlVMTDsKKyAgICAgIG91dHB1dF9idWZmZXItPnUuWVVWQS5hX3N0cmlkZSA9IDA7CisgICAgfQorICAgIG91dHB1dF9idWZmZXItPnUuWVVWQS51ID0gdG1wOworICAgIG91dHB1dF9idWZmZXItPnUuWVVWQS51X3N0cmlkZSA9IHV2X3N0cmlkZTsKKyAgICBvdXRwdXRfYnVmZmVyLT51LllVVkEudV9zaXplID0gdXZfc3RyaWRlICogKGggKyAxKSAvIDI7CisgICAgdG1wICs9IG91dHB1dF9idWZmZXItPnUuWVVWQS51X3NpemU7CisKKyAgICBvdXRwdXRfYnVmZmVyLT51LllVVkEudiA9IHRtcDsKKyAgICBvdXRwdXRfYnVmZmVyLT51LllVVkEudl9zdHJpZGUgPSB1dl9zdHJpZGU7CisgICAgb3V0cHV0X2J1ZmZlci0+dS5ZVVZBLnZfc2l6ZSA9IHV2X3N0cmlkZSAqIChoICsgMSkgLyAyOworICAgIHRtcCArPSBvdXRwdXRfYnVmZmVyLT51LllVVkEudl9zaXplOworICAgIGFzc2VydCh0bXAgPD0gZXh0ZXJuYWxfYnVmZmVyICsgdG90YWxfc2l6ZSk7CisgIH0KKyAgb3V0cHV0X2J1ZmZlci0+aXNfZXh0ZXJuYWxfbWVtb3J5ID0gdXNlX2V4dGVybmFsX21lbW9yeTsKKyAgcmV0dXJuIGV4dGVybmFsX2J1ZmZlcjsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSkgeworICBpbnQgb2sgPSAwOworICBjb25zdCBjaGFyICppbl9maWxlID0gTlVMTDsKKyAgY29uc3QgY2hhciAqb3V0X2ZpbGUgPSBOVUxMOworCisgIFdlYlBEZWNvZGVyQ29uZmlnIGNvbmZpZzsKKyAgV2ViUERlY0J1ZmZlciogY29uc3Qgb3V0cHV0X2J1ZmZlciA9ICZjb25maWcub3V0cHV0OworICBXZWJQQml0c3RyZWFtRmVhdHVyZXMqIGNvbnN0IGJpdHN0cmVhbSA9ICZjb25maWcuaW5wdXQ7CisgIFdlYlBPdXRwdXRGaWxlRm9ybWF0IGZvcm1hdCA9IFBORzsKKyAgdWludDhfdCogZXh0ZXJuYWxfYnVmZmVyID0gTlVMTDsKKyAgaW50IHVzZV9leHRlcm5hbF9tZW1vcnkgPSAwOworICBjb25zdCB1aW50OF90KiBkYXRhID0gTlVMTDsKKworICBpbnQgaW5jcmVtZW50YWwgPSAwOworICBpbnQgYzsKKworICBpZiAoIVdlYlBJbml0RGVjb2RlckNvbmZpZygmY29uZmlnKSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiTGlicmFyeSB2ZXJzaW9uIG1pc21hdGNoIVxuIik7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgZm9yIChjID0gMTsgYyA8IGFyZ2M7ICsrYykgeworICAgIGludCBwYXJzZV9lcnJvciA9IDA7CisgICAgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1oIikgfHwgIXN0cmNtcChhcmd2W2NdLCAiLWhlbHAiKSkgeworICAgICAgSGVscCgpOworICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItbyIpICYmIGMgPCBhcmdjIC0gMSkgeworICAgICAgb3V0X2ZpbGUgPSBhcmd2WysrY107CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItYWxwaGEiKSkgeworICAgICAgZm9ybWF0ID0gQUxQSEFfUExBTkVfT05MWTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1ub2ZhbmN5IikpIHsKKyAgICAgIGNvbmZpZy5vcHRpb25zLm5vX2ZhbmN5X3Vwc2FtcGxpbmcgPSAxOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLW5vZmlsdGVyIikpIHsKKyAgICAgIGNvbmZpZy5vcHRpb25zLmJ5cGFzc19maWx0ZXJpbmcgPSAxOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXBhbSIpKSB7CisgICAgICBmb3JtYXQgPSBQQU07CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItcHBtIikpIHsKKyAgICAgIGZvcm1hdCA9IFBQTTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1ibXAiKSkgeworICAgICAgZm9ybWF0ID0gQk1QOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXRpZmYiKSkgeworICAgICAgZm9ybWF0ID0gVElGRjsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1xdWlldCIpKSB7CisgICAgICBxdWlldCA9IDE7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItdmVyc2lvbiIpKSB7CisgICAgICBjb25zdCBpbnQgdmVyc2lvbiA9IFdlYlBHZXREZWNvZGVyVmVyc2lvbigpOworICAgICAgcHJpbnRmKCIlZC4lZC4lZFxuIiwKKyAgICAgICAgICAgICAodmVyc2lvbiA+PiAxNikgJiAweGZmLCAodmVyc2lvbiA+PiA4KSAmIDB4ZmYsIHZlcnNpb24gJiAweGZmKTsKKyAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXBnbSIpKSB7CisgICAgICBmb3JtYXQgPSBQR007CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICIteXV2IikpIHsKKyAgICAgIGZvcm1hdCA9IFJBV19ZVVY7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItcGl4ZWxfZm9ybWF0IikgJiYgYyA8IGFyZ2MgLSAxKSB7CisgICAgICBjb25zdCBjaGFyKiBjb25zdCBmbXQgPSBhcmd2WysrY107CisgICAgICBpZiAgICAgICghc3RyY21wKGZtdCwgIlJHQiIpKSAgZm9ybWF0ID0gUkdCOworICAgICAgZWxzZSBpZiAoIXN0cmNtcChmbXQsICJSR0JBIikpIGZvcm1hdCA9IFJHQkE7CisgICAgICBlbHNlIGlmICghc3RyY21wKGZtdCwgIkJHUiIpKSAgZm9ybWF0ID0gQkdSOworICAgICAgZWxzZSBpZiAoIXN0cmNtcChmbXQsICJCR1JBIikpIGZvcm1hdCA9IEJHUkE7CisgICAgICBlbHNlIGlmICghc3RyY21wKGZtdCwgIkFSR0IiKSkgZm9ybWF0ID0gQVJHQjsKKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAoZm10LCAiUkdCQV80NDQ0IikpIGZvcm1hdCA9IFJHQkFfNDQ0NDsKKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAoZm10LCAiUkdCXzU2NSIpKSBmb3JtYXQgPSBSR0JfNTY1OworICAgICAgZWxzZSBpZiAoIXN0cmNtcChmbXQsICJyZ2JBIikpIGZvcm1hdCA9IHJnYkE7CisgICAgICBlbHNlIGlmICghc3RyY21wKGZtdCwgImJnckEiKSkgZm9ybWF0ID0gYmdyQTsKKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAoZm10LCAiQXJnYiIpKSBmb3JtYXQgPSBBcmdiOworICAgICAgZWxzZSBpZiAoIXN0cmNtcChmbXQsICJyZ2JBXzQ0NDQiKSkgZm9ybWF0ID0gcmdiQV80NDQ0OworICAgICAgZWxzZSBpZiAoIXN0cmNtcChmbXQsICJZVVYiKSkgIGZvcm1hdCA9IFlVVjsKKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAoZm10LCAiWVVWQSIpKSBmb3JtYXQgPSBZVVZBOworICAgICAgZWxzZSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ2FuJ3QgcGFyc2UgcGl4ZWxfZm9ybWF0ICVzXG4iLCBmbXQpOworICAgICAgICBwYXJzZV9lcnJvciA9IDE7CisgICAgICB9CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItZXh0ZXJuYWxfbWVtb3J5IikgJiYgYyA8IGFyZ2MgLSAxKSB7CisgICAgICB1c2VfZXh0ZXJuYWxfbWVtb3J5ID0gRXhVdGlsR2V0SW50KGFyZ3ZbKytjXSwgMCwgJnBhcnNlX2Vycm9yKTsKKyAgICAgIHBhcnNlX2Vycm9yIHw9ICh1c2VfZXh0ZXJuYWxfbWVtb3J5ID4gMiB8fCB1c2VfZXh0ZXJuYWxfbWVtb3J5IDwgMCk7CisgICAgICBpZiAocGFyc2VfZXJyb3IpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDYW4ndCBwYXJzZSAnZXh0ZXJuYWxfbWVtb3J5JyB2YWx1ZSAlc1xuIiwgYXJndltjXSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItbXQiKSkgeworICAgICAgY29uZmlnLm9wdGlvbnMudXNlX3RocmVhZHMgPSAxOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWFscGhhX2RpdGhlciIpKSB7CisgICAgICBjb25maWcub3B0aW9ucy5hbHBoYV9kaXRoZXJpbmdfc3RyZW5ndGggPSAxMDA7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItbm9kaXRoZXIiKSkgeworICAgICAgY29uZmlnLm9wdGlvbnMuZGl0aGVyaW5nX3N0cmVuZ3RoID0gMDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1kaXRoZXIiKSAmJiBjIDwgYXJnYyAtIDEpIHsKKyAgICAgIGNvbmZpZy5vcHRpb25zLmRpdGhlcmluZ19zdHJlbmd0aCA9CisgICAgICAgICAgRXhVdGlsR2V0SW50KGFyZ3ZbKytjXSwgMCwgJnBhcnNlX2Vycm9yKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1jcm9wIikgJiYgYyA8IGFyZ2MgLSA0KSB7CisgICAgICBjb25maWcub3B0aW9ucy51c2VfY3JvcHBpbmcgPSAxOworICAgICAgY29uZmlnLm9wdGlvbnMuY3JvcF9sZWZ0ICAgPSBFeFV0aWxHZXRJbnQoYXJndlsrK2NdLCAwLCAmcGFyc2VfZXJyb3IpOworICAgICAgY29uZmlnLm9wdGlvbnMuY3JvcF90b3AgICAgPSBFeFV0aWxHZXRJbnQoYXJndlsrK2NdLCAwLCAmcGFyc2VfZXJyb3IpOworICAgICAgY29uZmlnLm9wdGlvbnMuY3JvcF93aWR0aCAgPSBFeFV0aWxHZXRJbnQoYXJndlsrK2NdLCAwLCAmcGFyc2VfZXJyb3IpOworICAgICAgY29uZmlnLm9wdGlvbnMuY3JvcF9oZWlnaHQgPSBFeFV0aWxHZXRJbnQoYXJndlsrK2NdLCAwLCAmcGFyc2VfZXJyb3IpOworICAgIH0gZWxzZSBpZiAoKCFzdHJjbXAoYXJndltjXSwgIi1zY2FsZSIpIHx8ICFzdHJjbXAoYXJndltjXSwgIi1yZXNpemUiKSkgJiYKKyAgICAgICAgICAgICAgIGMgPCBhcmdjIC0gMikgeyAgLy8gJy1zY2FsZScgaXMgbGVmdCBmb3IgY29tcGF0aWJpbGl0eQorICAgICAgY29uZmlnLm9wdGlvbnMudXNlX3NjYWxpbmcgPSAxOworICAgICAgY29uZmlnLm9wdGlvbnMuc2NhbGVkX3dpZHRoICA9IEV4VXRpbEdldEludChhcmd2WysrY10sIDAsICZwYXJzZV9lcnJvcik7CisgICAgICBjb25maWcub3B0aW9ucy5zY2FsZWRfaGVpZ2h0ID0gRXhVdGlsR2V0SW50KGFyZ3ZbKytjXSwgMCwgJnBhcnNlX2Vycm9yKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1mbGlwIikpIHsKKyAgICAgIGNvbmZpZy5vcHRpb25zLmZsaXAgPSAxOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXYiKSkgeworICAgICAgdmVyYm9zZSA9IDE7CisjaWZuZGVmIFdFQlBfRExMCisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItbm9hc20iKSkgeworICAgICAgVlA4R2V0Q1BVSW5mbyA9IE5VTEw7CisjZW5kaWYKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1pbmNyZW1lbnRhbCIpKSB7CisgICAgICBpbmNyZW1lbnRhbCA9IDE7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItLSIpKSB7CisgICAgICBpZiAoYyA8IGFyZ2MgLSAxKSBpbl9maWxlID0gYXJndlsrK2NdOworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIGlmIChhcmd2W2NdWzBdID09ICctJykgeworICAgICAgZnByaW50ZihzdGRlcnIsICJVbmtub3duIG9wdGlvbiAnJXMnXG4iLCBhcmd2W2NdKTsKKyAgICAgIEhlbHAoKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgeworICAgICAgaW5fZmlsZSA9IGFyZ3ZbY107CisgICAgfQorCisgICAgaWYgKHBhcnNlX2Vycm9yKSB7CisgICAgICBIZWxwKCk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICB9CisKKyAgaWYgKGluX2ZpbGUgPT0gTlVMTCkgeworICAgIGZwcmludGYoc3RkZXJyLCAibWlzc2luZyBpbnB1dCBmaWxlISFcbiIpOworICAgIEhlbHAoKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBpZiAocXVpZXQpIHZlcmJvc2UgPSAwOworCisgIHsKKyAgICBWUDhTdGF0dXNDb2RlIHN0YXR1cyA9IFZQOF9TVEFUVVNfT0s7CisgICAgc2l6ZV90IGRhdGFfc2l6ZSA9IDA7CisgICAgaWYgKCFMb2FkV2ViUChpbl9maWxlLCAmZGF0YSwgJmRhdGFfc2l6ZSwgYml0c3RyZWFtKSkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgICBjYXNlIFBORzoKKyNpZmRlZiBIQVZFX1dJTkNPREVDX0gKKyAgICAgICAgb3V0cHV0X2J1ZmZlci0+Y29sb3JzcGFjZSA9IGJpdHN0cmVhbS0+aGFzX2FscGhhID8gTU9ERV9CR1JBIDogTU9ERV9CR1I7CisjZWxzZQorICAgICAgICBvdXRwdXRfYnVmZmVyLT5jb2xvcnNwYWNlID0gYml0c3RyZWFtLT5oYXNfYWxwaGEgPyBNT0RFX1JHQkEgOiBNT0RFX1JHQjsKKyNlbmRpZgorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUEFNOgorICAgICAgICBvdXRwdXRfYnVmZmVyLT5jb2xvcnNwYWNlID0gTU9ERV9SR0JBOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUFBNOgorICAgICAgICBvdXRwdXRfYnVmZmVyLT5jb2xvcnNwYWNlID0gTU9ERV9SR0I7ICAvLyBkcm9wcyBhbHBoYSBmb3IgUFBNCisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBCTVA6CisgICAgICAgIG91dHB1dF9idWZmZXItPmNvbG9yc3BhY2UgPSBiaXRzdHJlYW0tPmhhc19hbHBoYSA/IE1PREVfQkdSQSA6IE1PREVfQkdSOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVElGRjoKKyAgICAgICAgb3V0cHV0X2J1ZmZlci0+Y29sb3JzcGFjZSA9IGJpdHN0cmVhbS0+aGFzX2FscGhhID8gTU9ERV9SR0JBIDogTU9ERV9SR0I7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQR006CisgICAgICBjYXNlIFJBV19ZVVY6CisgICAgICAgIG91dHB1dF9idWZmZXItPmNvbG9yc3BhY2UgPSBiaXRzdHJlYW0tPmhhc19hbHBoYSA/IE1PREVfWVVWQSA6IE1PREVfWVVWOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQUxQSEFfUExBTkVfT05MWToKKyAgICAgICAgb3V0cHV0X2J1ZmZlci0+Y29sb3JzcGFjZSA9IE1PREVfWVVWQTsKKyAgICAgICAgYnJlYWs7CisgICAgICAvLyBmb3JjZWQgbW9kZXM6CisgICAgICBjYXNlIFJHQjogb3V0cHV0X2J1ZmZlci0+Y29sb3JzcGFjZSA9IE1PREVfUkdCOyBicmVhazsKKyAgICAgIGNhc2UgUkdCQTogb3V0cHV0X2J1ZmZlci0+Y29sb3JzcGFjZSA9IE1PREVfUkdCQTsgYnJlYWs7CisgICAgICBjYXNlIEJHUjogb3V0cHV0X2J1ZmZlci0+Y29sb3JzcGFjZSA9IE1PREVfQkdSOyBicmVhazsKKyAgICAgIGNhc2UgQkdSQTogb3V0cHV0X2J1ZmZlci0+Y29sb3JzcGFjZSA9IE1PREVfQkdSQTsgYnJlYWs7CisgICAgICBjYXNlIEFSR0I6IG91dHB1dF9idWZmZXItPmNvbG9yc3BhY2UgPSBNT0RFX0FSR0I7IGJyZWFrOworICAgICAgY2FzZSBSR0JBXzQ0NDQ6IG91dHB1dF9idWZmZXItPmNvbG9yc3BhY2UgPSBNT0RFX1JHQkFfNDQ0NDsgYnJlYWs7CisgICAgICBjYXNlIFJHQl81NjU6IG91dHB1dF9idWZmZXItPmNvbG9yc3BhY2UgPSBNT0RFX1JHQl81NjU7IGJyZWFrOworICAgICAgY2FzZSByZ2JBOiBvdXRwdXRfYnVmZmVyLT5jb2xvcnNwYWNlID0gTU9ERV9yZ2JBOyBicmVhazsKKyAgICAgIGNhc2UgYmdyQTogb3V0cHV0X2J1ZmZlci0+Y29sb3JzcGFjZSA9IE1PREVfYmdyQTsgYnJlYWs7CisgICAgICBjYXNlIEFyZ2I6IG91dHB1dF9idWZmZXItPmNvbG9yc3BhY2UgPSBNT0RFX0FyZ2I7IGJyZWFrOworICAgICAgY2FzZSByZ2JBXzQ0NDQ6IG91dHB1dF9idWZmZXItPmNvbG9yc3BhY2UgPSBNT0RFX3JnYkFfNDQ0NDsgYnJlYWs7CisgICAgICBjYXNlIFlVVjogb3V0cHV0X2J1ZmZlci0+Y29sb3JzcGFjZSA9IE1PREVfWVVWOyBicmVhazsKKyAgICAgIGNhc2UgWVVWQTogb3V0cHV0X2J1ZmZlci0+Y29sb3JzcGFjZSA9IE1PREVfWVVWQTsgYnJlYWs7CisgICAgICBkZWZhdWx0OiBnb3RvIEV4aXQ7CisgICAgfQorCisgICAgaWYgKHVzZV9leHRlcm5hbF9tZW1vcnkgPiAwICYmIGZvcm1hdCA+PSBSR0IpIHsKKyAgICAgIGV4dGVybmFsX2J1ZmZlciA9IEFsbG9jYXRlRXh0ZXJuYWxCdWZmZXIoJmNvbmZpZywgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VfZXh0ZXJuYWxfbWVtb3J5KTsKKyAgICAgIGlmIChleHRlcm5hbF9idWZmZXIgPT0gTlVMTCkgZ290byBFeGl0OworICAgIH0KKworICAgIHsKKyAgICAgIFN0b3B3YXRjaCBzdG9wX3dhdGNoOworICAgICAgaWYgKHZlcmJvc2UpIFN0b3B3YXRjaFJlc2V0KCZzdG9wX3dhdGNoKTsKKworICAgICAgaWYgKGluY3JlbWVudGFsKSB7CisgICAgICAgIHN0YXR1cyA9IERlY29kZVdlYlBJbmNyZW1lbnRhbChkYXRhLCBkYXRhX3NpemUsICZjb25maWcpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdHVzID0gRGVjb2RlV2ViUChkYXRhLCBkYXRhX3NpemUsICZjb25maWcpOworICAgICAgfQorICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgY29uc3QgZG91YmxlIGRlY29kZV90aW1lID0gU3RvcHdhdGNoUmVhZEFuZFJlc2V0KCZzdG9wX3dhdGNoKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJUaW1lIHRvIGRlY29kZSBwaWN0dXJlOiAlLjNmc1xuIiwgZGVjb2RlX3RpbWUpOworICAgICAgfQorICAgIH0KKworICAgIG9rID0gKHN0YXR1cyA9PSBWUDhfU1RBVFVTX09LKTsKKyAgICBpZiAoIW9rKSB7CisgICAgICBQcmludFdlYlBFcnJvcihpbl9maWxlLCBzdGF0dXMpOworICAgICAgZ290byBFeGl0OworICAgIH0KKyAgfQorCisgIGlmIChvdXRfZmlsZSAhPSBOVUxMKSB7CisgICAgaWYgKCFxdWlldCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJEZWNvZGVkICVzLiBEaW1lbnNpb25zOiAlZCB4ICVkICVzLiBGb3JtYXQ6ICVzLiAiCisgICAgICAgICAgICAgICAgICAgICAgIk5vdyBzYXZpbmcuLi5cbiIsCisgICAgICAgICAgICAgIGluX2ZpbGUsIG91dHB1dF9idWZmZXItPndpZHRoLCBvdXRwdXRfYnVmZmVyLT5oZWlnaHQsCisgICAgICAgICAgICAgIGJpdHN0cmVhbS0+aGFzX2FscGhhID8gIiAod2l0aCBhbHBoYSkiIDogIiIsCisgICAgICAgICAgICAgIGtGb3JtYXRUeXBlW2JpdHN0cmVhbS0+Zm9ybWF0XSk7CisgICAgfQorICAgIG9rID0gU2F2ZU91dHB1dChvdXRwdXRfYnVmZmVyLCBmb3JtYXQsIG91dF9maWxlKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoIXF1aWV0KSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZpbGUgJXMgY2FuIGJlIGRlY29kZWQgIgorICAgICAgICAgICAgICAgICAgICAgICIoZGltZW5zaW9uczogJWQgeCAlZCAlcy4gRm9ybWF0OiAlcykuXG4iLAorICAgICAgICAgICAgICBpbl9maWxlLCBvdXRwdXRfYnVmZmVyLT53aWR0aCwgb3V0cHV0X2J1ZmZlci0+aGVpZ2h0LAorICAgICAgICAgICAgICBiaXRzdHJlYW0tPmhhc19hbHBoYSA/ICIgKHdpdGggYWxwaGEpIiA6ICIiLAorICAgICAgICAgICAgICBrRm9ybWF0VHlwZVtiaXRzdHJlYW0tPmZvcm1hdF0pOworICAgICAgZnByaW50ZihzdGRlcnIsICJOb3RoaW5nIHdyaXR0ZW47ICIKKyAgICAgICAgICAgICAgICAgICAgICAidXNlIC1vIGZsYWcgdG8gc2F2ZSB0aGUgcmVzdWx0IGFzIGUuZy4gUE5HLlxuIik7CisgICAgfQorICB9CisgRXhpdDoKKyAgV2ViUEZyZWVEZWNCdWZmZXIob3V0cHV0X2J1ZmZlcik7CisgIGZyZWUoKHZvaWQqKWV4dGVybmFsX2J1ZmZlcik7CisgIGZyZWUoKHZvaWQqKWRhdGEpOworICByZXR1cm4gb2sgPyAwIDogLTE7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy9leGFtcGxlX3V0aWwuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL2V4YW1wbGVfdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNWExMjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy9leGFtcGxlX3V0aWwuYwpAQCAtMCwwICsxLDEyNyBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICBVdGlsaXR5IGZ1bmN0aW9ucyB1c2VkIGJ5IHRoZSBleGFtcGxlIHByb2dyYW1zLgorLy8KKworI2luY2x1ZGUgIi4vZXhhbXBsZV91dGlsLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAid2VicC9tdXhfdHlwZXMuaCIKKyNpbmNsdWRlICIuLi9pbWFnZWlvL2ltYWdlaW9fdXRpbC5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU3RyaW5nIHBhcnNpbmcKKwordWludDMyX3QgRXhVdGlsR2V0VUludChjb25zdCBjaGFyKiBjb25zdCB2LCBpbnQgYmFzZSwgaW50KiBjb25zdCBlcnJvcikgeworICBjaGFyKiBlbmQgPSBOVUxMOworICBjb25zdCB1aW50MzJfdCBuID0gKHYgIT0gTlVMTCkgPyAodWludDMyX3Qpc3RydG91bCh2LCAmZW5kLCBiYXNlKSA6IDB1OworICBpZiAoZW5kID09IHYgJiYgZXJyb3IgIT0gTlVMTCAmJiAhKmVycm9yKSB7CisgICAgKmVycm9yID0gMTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yISAnJXMnIGlzIG5vdCBhbiBpbnRlZ2VyLlxuIiwKKyAgICAgICAgICAgICh2ICE9IE5VTEwpID8gdiA6ICIobnVsbCkiKTsKKyAgfQorICByZXR1cm4gbjsKK30KKworaW50IEV4VXRpbEdldEludChjb25zdCBjaGFyKiBjb25zdCB2LCBpbnQgYmFzZSwgaW50KiBjb25zdCBlcnJvcikgeworICByZXR1cm4gKGludClFeFV0aWxHZXRVSW50KHYsIGJhc2UsIGVycm9yKTsKK30KKworaW50IEV4VXRpbEdldEludHMoY29uc3QgY2hhciogdiwgaW50IGJhc2UsIGludCBtYXhfb3V0cHV0LCBpbnQgb3V0cHV0W10pIHsKKyAgaW50IG4sIGVycm9yID0gMDsKKyAgZm9yIChuID0gMDsgdiAhPSBOVUxMICYmIG4gPCBtYXhfb3V0cHV0OyArK24pIHsKKyAgICBjb25zdCBpbnQgdmFsdWUgPSBFeFV0aWxHZXRJbnQodiwgYmFzZSwgJmVycm9yKTsKKyAgICBpZiAoZXJyb3IpIHJldHVybiAtMTsKKyAgICBvdXRwdXRbbl0gPSB2YWx1ZTsKKyAgICB2ID0gc3RyY2hyKHYsICcsJyk7CisgICAgaWYgKHYgIT0gTlVMTCkgKyt2OyAgIC8vIHNraXAgb3ZlciB0aGUgdHJhaWxpbmcgJywnCisgIH0KKyAgcmV0dXJuIG47Cit9CisKK2Zsb2F0IEV4VXRpbEdldEZsb2F0KGNvbnN0IGNoYXIqIGNvbnN0IHYsIGludCogY29uc3QgZXJyb3IpIHsKKyAgY2hhciogZW5kID0gTlVMTDsKKyAgY29uc3QgZmxvYXQgZiA9ICh2ICE9IE5VTEwpID8gKGZsb2F0KXN0cnRvZCh2LCAmZW5kKSA6IDAuZjsKKyAgaWYgKGVuZCA9PSB2ICYmIGVycm9yICE9IE5VTEwgJiYgISplcnJvcikgeworICAgICplcnJvciA9IDE7CisgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciEgJyVzJyBpcyBub3QgYSBmbG9hdGluZyBwb2ludCBudW1iZXIuXG4iLAorICAgICAgICAgICAgKHYgIT0gTlVMTCkgPyB2IDogIihudWxsKSIpOworICB9CisgIHJldHVybiBmOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBSZXNldENvbW1hbmRMaW5lQXJndW1lbnRzKGludCBhcmdjLCBjb25zdCBjaGFyKiBhcmd2W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lQXJndW1lbnRzKiBjb25zdCBhcmdzKSB7CisgIGFzc2VydChhcmdzICE9IE5VTEwpOworICBhcmdzLT5hcmdjXyA9IGFyZ2M7CisgIGFyZ3MtPmFyZ3ZfID0gYXJndjsKKyAgYXJncy0+b3duX2FyZ3ZfID0gMDsKKyAgV2ViUERhdGFJbml0KCZhcmdzLT5hcmd2X2RhdGFfKTsKK30KKwordm9pZCBFeFV0aWxEZWxldGVDb21tYW5kTGluZUFyZ3VtZW50cyhDb21tYW5kTGluZUFyZ3VtZW50cyogY29uc3QgYXJncykgeworICBpZiAoYXJncyAhPSBOVUxMKSB7CisgICAgaWYgKGFyZ3MtPm93bl9hcmd2XykgeworICAgICAgZnJlZSgodm9pZCopYXJncy0+YXJndl8pOworICAgICAgV2ViUERhdGFDbGVhcigmYXJncy0+YXJndl9kYXRhXyk7CisgICAgfQorICAgIFJlc2V0Q29tbWFuZExpbmVBcmd1bWVudHMoMCwgTlVMTCwgYXJncyk7CisgIH0KK30KKworI2RlZmluZSBNQVhfQVJHQyAxNjM4NAoraW50IEV4VXRpbEluaXRDb21tYW5kTGluZUFyZ3VtZW50cyhpbnQgYXJnYywgY29uc3QgY2hhciogYXJndltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZUFyZ3VtZW50cyogY29uc3QgYXJncykgeworICBpZiAoYXJncyA9PSBOVUxMIHx8IGFyZ3YgPT0gTlVMTCkgcmV0dXJuIDA7CisgIFJlc2V0Q29tbWFuZExpbmVBcmd1bWVudHMoYXJnYywgYXJndiwgYXJncyk7CisgIGlmIChhcmdjID09IDEgJiYgYXJndlswXVswXSAhPSAnLScpIHsKKyAgICBjaGFyKiBjdXI7CisgICAgY29uc3QgY2hhciBzZXBbXSA9ICIgXHRcclxuXGZcdiI7CisgICAgaWYgKCFFeFV0aWxSZWFkRmlsZVRvV2ViUERhdGEoYXJndlswXSwgJmFyZ3MtPmFyZ3ZfZGF0YV8pKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYXJncy0+b3duX2FyZ3ZfID0gMTsKKyAgICBhcmdzLT5hcmd2XyA9IChjb25zdCBjaGFyKiopbWFsbG9jKE1BWF9BUkdDICogc2l6ZW9mKCphcmdzLT5hcmd2XykpOworICAgIGlmIChhcmdzLT5hcmd2XyA9PSBOVUxMKSByZXR1cm4gMDsKKworICAgIGFyZ2MgPSAwOworICAgIGZvciAoY3VyID0gc3RydG9rKChjaGFyKilhcmdzLT5hcmd2X2RhdGFfLmJ5dGVzLCBzZXApOworICAgICAgICAgY3VyICE9IE5VTEw7CisgICAgICAgICBjdXIgPSBzdHJ0b2soTlVMTCwgc2VwKSkgeworICAgICAgaWYgKGFyZ2MgPT0gTUFYX0FSR0MpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogQXJndW1lbnRzIGxpbWl0ICVkIHJlYWNoZWRcbiIsIE1BWF9BUkdDKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBhc3NlcnQoc3RybGVuKGN1cikgIT0gMCk7CisgICAgICBhcmdzLT5hcmd2X1thcmdjKytdID0gY3VyOworICAgIH0KKyAgICBhcmdzLT5hcmdjXyA9IGFyZ2M7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBFeFV0aWxSZWFkRmlsZVRvV2ViUERhdGEoY29uc3QgY2hhciogY29uc3QgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBEYXRhKiBjb25zdCB3ZWJwX2RhdGEpIHsKKyAgY29uc3QgdWludDhfdCogZGF0YTsKKyAgc2l6ZV90IHNpemU7CisgIGlmICh3ZWJwX2RhdGEgPT0gTlVMTCkgcmV0dXJuIDA7CisgIGlmICghSW1nSW9VdGlsUmVhZEZpbGUoZmlsZW5hbWUsICZkYXRhLCAmc2l6ZSkpIHJldHVybiAwOworICB3ZWJwX2RhdGEtPmJ5dGVzID0gZGF0YTsKKyAgd2VicF9kYXRhLT5zaXplID0gc2l6ZTsKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy9leGFtcGxlX3V0aWwuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL2V4YW1wbGVfdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNzYyYTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy9leGFtcGxlX3V0aWwuaApAQCAtMCwwICsxLDcwIEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gIFV0aWxpdHkgZnVuY3Rpb25zIHVzZWQgYnkgdGhlIGV4YW1wbGUgcHJvZ3JhbXMuCisvLworCisjaWZuZGVmIFdFQlBfRVhBTVBMRVNfRVhBTVBMRV9VVElMX0hfCisjZGVmaW5lIFdFQlBfRVhBTVBMRVNfRVhBTVBMRV9VVElMX0hfCisKKyNpbmNsdWRlICJ3ZWJwL3R5cGVzLmgiCisjaW5jbHVkZSAid2VicC9tdXhfdHlwZXMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU3RyaW5nIHBhcnNpbmcKKworLy8gUGFyc2VzICd2JyB1c2luZyBzdHJ0byh1bHxsfGQpKCkuIElmIGVycm9yIGlzIG5vbi1OVUxMLCAnKmVycm9yJyBpcyBzZXQgdG8KKy8vIHRydWUgb24gZmFpbHVyZSB3aGlsZSBvbiBzdWNjZXNzIGl0IGlzIGxlZnQgdW5tb2RpZmllZCB0byBhbGxvdyBjaGFpbmluZyBvZgorLy8gY2FsbHMuIEFuIGVycm9yIGlzIG9ubHkgcHJpbnRlZCBvbiB0aGUgZmlyc3Qgb2NjdXJyZW5jZS4KK3VpbnQzMl90IEV4VXRpbEdldFVJbnQoY29uc3QgY2hhciogY29uc3QgdiwgaW50IGJhc2UsIGludCogY29uc3QgZXJyb3IpOworaW50IEV4VXRpbEdldEludChjb25zdCBjaGFyKiBjb25zdCB2LCBpbnQgYmFzZSwgaW50KiBjb25zdCBlcnJvcik7CitmbG9hdCBFeFV0aWxHZXRGbG9hdChjb25zdCBjaGFyKiBjb25zdCB2LCBpbnQqIGNvbnN0IGVycm9yKTsKKworLy8gVGhpcyB2YXJpYW50IG9mIEV4VXRpbEdldEludCgpIHdpbGwgcGFyc2UgbXVsdGlwbGUgaW50ZWdlcnMgZnJvbSBhCisvLyBjb21tYS1zZXBhcmF0ZWQgbGlzdC4gVXAgdG8gJ21heF9vdXRwdXQnIGludGVnZXJzIGFyZSBwYXJzZWQuCisvLyBUaGUgcmVzdWx0IGlzIHBsYWNlZCBpbiB0aGUgb3V0cHV0W10gYXJyYXksIGFuZCB0aGUgbnVtYmVyIG9mIGludGVnZXJzCisvLyBhY3R1YWxseSBwYXJzZWQgaXMgcmV0dXJuZWQsIG9yIC0xIGlmIGFuIGVycm9yIG9jY3VycmVkLgoraW50IEV4VXRpbEdldEludHMoY29uc3QgY2hhciogdiwgaW50IGJhc2UsIGludCBtYXhfb3V0cHV0LCBpbnQgb3V0cHV0W10pOworCisvLyBSZWFkcyBhIGZpbGUgbmFtZWQgJ2ZpbGVuYW1lJyBpbnRvIGEgV2ViUERhdGEgc3RydWN0dXJlLiBUaGUgY29udGVudCBvZgorLy8gd2VicF9kYXRhIGlzIG92ZXJ3cml0dGVuLiBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgZXJyb3IuCitpbnQgRXhVdGlsUmVhZEZpbGVUb1dlYlBEYXRhKGNvbnN0IGNoYXIqIGNvbnN0IGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQRGF0YSogY29uc3Qgd2VicF9kYXRhKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvbW1hbmQtbGluZSBhcmd1bWVudHMKKwordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQgYXJnY187CisgIGNvbnN0IGNoYXIqKiBhcmd2XzsKKyAgV2ViUERhdGEgYXJndl9kYXRhXzsKKyAgaW50IG93bl9hcmd2XzsKK30gQ29tbWFuZExpbmVBcmd1bWVudHM7CisKKy8vIEluaXRpYWxpemVzIHRoZSBzdHJ1Y3R1cmUgZnJvbSB0aGUgY29tbWFuZC1saW5lIHBhcmFtZXRlcnMuIElmIHRoZXJlIGlzCisvLyBvbmx5IG9uZSBwYXJhbWV0ZXIgYW5kIGl0IGRvZXMgbm90IHN0YXJ0IHdpdGggYSAnLScsIHRoZW4gaXQgaXMgYXNzdW1lZCB0bworLy8gYmUgYSBmaWxlIG5hbWUuIFRoaXMgZmlsZSB3aWxsIGJlIHJlYWQgYW5kIHRva2VuaXplZCBpbnRvIGNvbW1hbmQtbGluZQorLy8gYXJndW1lbnRzLiBUaGUgY29udGVudCBvZiAnYXJncycgaXMgb3ZlcndyaXR0ZW4uCisvLyBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgZXJyb3IgKG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUsIG5vbgorLy8gZXhpc3RpbmcgZmlsZSwgdG9vIG1hbnkgYXJndW1lbnRzLCAuLi4pLgoraW50IEV4VXRpbEluaXRDb21tYW5kTGluZUFyZ3VtZW50cyhpbnQgYXJnYywgY29uc3QgY2hhciogYXJndltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZUFyZ3VtZW50cyogY29uc3QgYXJncyk7CisKKy8vIERlYWxsb2NhdGUgYWxsIG1lbW9yeSBhbmQgcmVzZXQgJ2FyZ3MnLgordm9pZCBFeFV0aWxEZWxldGVDb21tYW5kTGluZUFyZ3VtZW50cyhDb21tYW5kTGluZUFyZ3VtZW50cyogY29uc3QgYXJncyk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvLyBXRUJQX0VYQU1QTEVTX0VYQU1QTEVfVVRJTF9IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvZ2lmMndlYnAuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL2dpZjJ3ZWJwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYxZjI3MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL2dpZjJ3ZWJwLmMKQEAgLTAsMCArMSw2MDcgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgc2ltcGxlIHRvb2wgdG8gY29udmVydCBhbmltYXRlZCBHSUZzIHRvIFdlYlAKKy8vCisvLyBBdXRob3JzOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKy8vICAgICAgICAgIFVydmFuZyAodXJ2YW5nQGdvb2dsZS5jb20pCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgIndlYnAvY29uZmlnLmgiCisjZW5kaWYKKworI2lmZGVmIFdFQlBfSEFWRV9HSUYKKworI2lmIGRlZmluZWQoSEFWRV9VTklTVERfSCkgJiYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxnaWZfbGliLmg+CisjaW5jbHVkZSAid2VicC9lbmNvZGUuaCIKKyNpbmNsdWRlICJ3ZWJwL211eC5oIgorI2luY2x1ZGUgIi4uL2V4YW1wbGVzL2V4YW1wbGVfdXRpbC5oIgorI2luY2x1ZGUgIi4uL2ltYWdlaW8vaW1hZ2Vpb191dGlsLmgiCisjaW5jbHVkZSAiLi9naWZkZWMuaCIKKworI2lmICFkZWZpbmVkKFNURElOX0ZJTEVOTykKKyNkZWZpbmUgU1RESU5fRklMRU5PIDAKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50IHRyYW5zcGFyZW50X2luZGV4ID0gR0lGX0lOREVYX0lOVkFMSUQ7ICAvLyBPcGFxdWUgYnkgZGVmYXVsdC4KKworc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtFcnJvck1lc3NhZ2VzWy1XRUJQX01VWF9OT1RfRU5PVUdIX0RBVEEgKyAxXSA9IHsKKyAgIldFQlBfTVVYX05PVF9GT1VORCIsICJXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UIiwgIldFQlBfTVVYX0JBRF9EQVRBIiwKKyAgIldFQlBfTVVYX01FTU9SWV9FUlJPUiIsICJXRUJQX01VWF9OT1RfRU5PVUdIX0RBVEEiCit9OworCitzdGF0aWMgY29uc3QgY2hhciogRXJyb3JTdHJpbmcoV2ViUE11eEVycm9yIGVycikgeworICBhc3NlcnQoZXJyIDw9IFdFQlBfTVVYX05PVF9GT1VORCAmJiBlcnIgPj0gV0VCUF9NVVhfTk9UX0VOT1VHSF9EQVRBKTsKKyAgcmV0dXJuIGtFcnJvck1lc3NhZ2VzWy1lcnJdOworfQorCitlbnVtIHsKKyAgTUVUQURBVEFfSUNDICA9ICgxIDw8IDApLAorICBNRVRBREFUQV9YTVAgID0gKDEgPDwgMSksCisgIE1FVEFEQVRBX0FMTCAgPSBNRVRBREFUQV9JQ0MgfCBNRVRBREFUQV9YTVAKK307CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIEhlbHAodm9pZCkgeworICBwcmludGYoIlVzYWdlOlxuIik7CisgIHByaW50ZigiIGdpZjJ3ZWJwIFtvcHRpb25zXSBnaWZfZmlsZSAtbyB3ZWJwX2ZpbGVcbiIpOworICBwcmludGYoIk9wdGlvbnM6XG4iKTsKKyAgcHJpbnRmKCIgIC1oIC8gLWhlbHAgLi4uLi4uLi4uLi4uLiB0aGlzIGhlbHBcbiIpOworICBwcmludGYoIiAgLWxvc3N5IC4uLi4uLi4uLi4uLi4uLi4uIGVuY29kZSBpbWFnZSB1c2luZyBsb3NzeSBjb21wcmVzc2lvblxuIik7CisgIHByaW50ZigiICAtbWl4ZWQgLi4uLi4uLi4uLi4uLi4uLi4gZm9yIGVhY2ggZnJhbWUgaW4gdGhlIGltYWdlLCBwaWNrIGxvc3N5XG4iCisgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgbG9zc2xlc3MgY29tcHJlc3Npb24gaGV1cmlzdGljYWxseVxuIik7CisgIHByaW50ZigiICAtcSA8ZmxvYXQ+IC4uLi4uLi4uLi4uLi4gcXVhbGl0eSBmYWN0b3IgKDA6c21hbGwuLjEwMDpiaWcpXG4iKTsKKyAgcHJpbnRmKCIgIC1tIDxpbnQ+IC4uLi4uLi4uLi4uLi4uLiBjb21wcmVzc2lvbiBtZXRob2QgKDA9ZmFzdCwgNj1zbG93ZXN0KVxuIik7CisgIHByaW50ZigiICAtbWluX3NpemUgLi4uLi4uLi4uLi4uLi4gbWluaW1pemUgb3V0cHV0IHNpemUgKGRlZmF1bHQ6b2ZmKVxuIgorICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvc3NsZXNzIGNvbXByZXNzaW9uIGJ5IGRlZmF1bHQ7IGNhbiBiZVxuIgorICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbWJpbmVkIHdpdGggLXEsIC1tLCAtbG9zc3kgb3IgLW1peGVkXG4iCisgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1xuIik7CisgIHByaW50ZigiICAta21pbiA8aW50PiAuLi4uLi4uLi4uLi4gbWluIGRpc3RhbmNlIGJldHdlZW4ga2V5IGZyYW1lc1xuIik7CisgIHByaW50ZigiICAta21heCA8aW50PiAuLi4uLi4uLi4uLi4gbWF4IGRpc3RhbmNlIGJldHdlZW4ga2V5IGZyYW1lc1xuIik7CisgIHByaW50ZigiICAtZiA8aW50PiAuLi4uLi4uLi4uLi4uLi4gZmlsdGVyIHN0cmVuZ3RoICgwPW9mZi4uMTAwKVxuIik7CisgIHByaW50ZigiICAtbWV0YWRhdGEgPHN0cmluZz4gLi4uLi4gY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgbWV0YWRhdGEgdG9cbiIpOworICBwcmludGYoIiAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOworICBwcmludGYoImNvcHkgZnJvbSB0aGUgaW5wdXQgdG8gdGhlIG91dHB1dCBpZiBwcmVzZW50XG4iKTsKKyAgcHJpbnRmKCIgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKKyAgcHJpbnRmKCJWYWxpZCB2YWx1ZXM6IGFsbCwgbm9uZSwgaWNjLCB4bXAgKGRlZmF1bHQpXG4iKTsKKyAgcHJpbnRmKCIgIC1sb29wX2NvbXBhdGliaWxpdHkgLi4uLiB1c2UgY29tcGF0aWJpbGl0eSBtb2RlIGZvciBDaHJvbWVcbiIpOworICBwcmludGYoIiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gcHJpb3IgdG8gTTYyIChpbmNsdXNpdmUpXG4iKTsKKyAgcHJpbnRmKCIgIC1tdCAuLi4uLi4uLi4uLi4uLi4uLi4uLiB1c2UgbXVsdGktdGhyZWFkaW5nIGlmIGF2YWlsYWJsZVxuIik7CisgIHByaW50ZigiXG4iKTsKKyAgcHJpbnRmKCIgIC12ZXJzaW9uIC4uLi4uLi4uLi4uLi4uLiBwcmludCB2ZXJzaW9uIG51bWJlciBhbmQgZXhpdFxuIik7CisgIHByaW50ZigiICAtdiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4gdmVyYm9zZVxuIik7CisgIHByaW50ZigiICAtcXVpZXQgLi4uLi4uLi4uLi4uLi4uLi4gZG9uJ3QgcHJpbnQgYW55dGhpbmdcbiIpOworICBwcmludGYoIlxuIik7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10pIHsKKyAgaW50IHZlcmJvc2UgPSAwOworICBpbnQgZ2lmX2Vycm9yID0gR0lGX0VSUk9SOworICBXZWJQTXV4RXJyb3IgZXJyID0gV0VCUF9NVVhfT0s7CisgIGludCBvayA9IDA7CisgIGNvbnN0IGNoYXIgKmluX2ZpbGUgPSBOVUxMLCAqb3V0X2ZpbGUgPSBOVUxMOworICBGSUxFKiBvdXQgPSBOVUxMOworICBHaWZGaWxlVHlwZSogZ2lmID0gTlVMTDsKKyAgaW50IGZyYW1lX2R1cmF0aW9uID0gMDsKKyAgaW50IGZyYW1lX3RpbWVzdGFtcCA9IDA7CisgIEdJRkRpc3Bvc2VNZXRob2Qgb3JpZ19kaXNwb3NlID0gR0lGX0RJU1BPU0VfTk9ORTsKKworICBXZWJQUGljdHVyZSBmcmFtZTsgICAgICAgICAgICAgICAgLy8gRnJhbWUgcmVjdGFuZ2xlIG9ubHkgKG5vdCBkaXNwb3NlZCkuCisgIFdlYlBQaWN0dXJlIGN1cnJfY2FudmFzOyAgICAgICAgICAvLyBOb3QgZGlzcG9zZWQuCisgIFdlYlBQaWN0dXJlIHByZXZfY2FudmFzOyAgICAgICAgICAvLyBEaXNwb3NlZC4KKworICBXZWJQQW5pbUVuY29kZXIqIGVuYyA9IE5VTEw7CisgIFdlYlBBbmltRW5jb2Rlck9wdGlvbnMgZW5jX29wdGlvbnM7CisgIFdlYlBDb25maWcgY29uZmlnOworCisgIGludCBmcmFtZV9udW1iZXIgPSAwOyAgICAgLy8gV2hldGhlciB3ZSBhcmUgcHJvY2Vzc2luZyB0aGUgZmlyc3QgZnJhbWUuCisgIGludCBkb25lOworICBpbnQgYzsKKyAgaW50IHF1aWV0ID0gMDsKKyAgV2ViUERhdGEgd2VicF9kYXRhOworCisgIGludCBrZWVwX21ldGFkYXRhID0gTUVUQURBVEFfWE1QOyAgLy8gSUNDIG5vdCBvdXRwdXQgYnkgZGVmYXVsdC4KKyAgV2ViUERhdGEgaWNjX2RhdGE7CisgIGludCBzdG9yZWRfaWNjID0gMDsgICAgICAgICAvLyBXaGV0aGVyIHdlIGhhdmUgYWxyZWFkeSBzdG9yZWQgYW4gSUNDIHByb2ZpbGUuCisgIFdlYlBEYXRhIHhtcF9kYXRhOworICBpbnQgc3RvcmVkX3htcCA9IDA7ICAgICAgICAgLy8gV2hldGhlciB3ZSBoYXZlIGFscmVhZHkgc3RvcmVkIGFuIFhNUCBwcm9maWxlLgorICBpbnQgbG9vcF9jb3VudCA9IDA7ICAgICAgICAgLy8gZGVmYXVsdDogaW5maW5pdGUKKyAgaW50IHN0b3JlZF9sb29wX2NvdW50ID0gMDsgIC8vIFdoZXRoZXIgd2UgaGF2ZSBmb3VuZCBhbiBleHBsaWNpdCBsb29wIGNvdW50LgorICBpbnQgbG9vcF9jb21wYXRpYmlsaXR5ID0gMDsKKyAgV2ViUE11eCogbXV4ID0gTlVMTDsKKworICBpbnQgZGVmYXVsdF9rbWluID0gMTsgIC8vIFdoZXRoZXIgdG8gdXNlIGRlZmF1bHQga21pbiB2YWx1ZS4KKyAgaW50IGRlZmF1bHRfa21heCA9IDE7CisKKyAgaWYgKCFXZWJQQ29uZmlnSW5pdCgmY29uZmlnKSB8fCAhV2ViUEFuaW1FbmNvZGVyT3B0aW9uc0luaXQoJmVuY19vcHRpb25zKSB8fAorICAgICAgIVdlYlBQaWN0dXJlSW5pdCgmZnJhbWUpIHx8ICFXZWJQUGljdHVyZUluaXQoJmN1cnJfY2FudmFzKSB8fAorICAgICAgIVdlYlBQaWN0dXJlSW5pdCgmcHJldl9jYW52YXMpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciEgVmVyc2lvbiBtaXNtYXRjaCFcbiIpOworICAgIHJldHVybiAtMTsKKyAgfQorICBjb25maWcubG9zc2xlc3MgPSAxOyAgLy8gVXNlIGxvc3NsZXNzIGNvbXByZXNzaW9uIGJ5IGRlZmF1bHQuCisKKyAgV2ViUERhdGFJbml0KCZ3ZWJwX2RhdGEpOworICBXZWJQRGF0YUluaXQoJmljY19kYXRhKTsKKyAgV2ViUERhdGFJbml0KCZ4bXBfZGF0YSk7CisKKyAgaWYgKGFyZ2MgPT0gMSkgeworICAgIEhlbHAoKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGZvciAoYyA9IDE7IGMgPCBhcmdjOyArK2MpIHsKKyAgICBpbnQgcGFyc2VfZXJyb3IgPSAwOworICAgIGlmICghc3RyY21wKGFyZ3ZbY10sICItaCIpIHx8ICFzdHJjbXAoYXJndltjXSwgIi1oZWxwIikpIHsKKyAgICAgIEhlbHAoKTsKKyAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLW8iKSAmJiBjIDwgYXJnYyAtIDEpIHsKKyAgICAgIG91dF9maWxlID0gYXJndlsrK2NdOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWxvc3N5IikpIHsKKyAgICAgIGNvbmZpZy5sb3NzbGVzcyA9IDA7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItbWl4ZWQiKSkgeworICAgICAgZW5jX29wdGlvbnMuYWxsb3dfbWl4ZWQgPSAxOworICAgICAgY29uZmlnLmxvc3NsZXNzID0gMDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1sb29wX2NvbXBhdGliaWxpdHkiKSkgeworICAgICAgbG9vcF9jb21wYXRpYmlsaXR5ID0gMTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1xIikgJiYgYyA8IGFyZ2MgLSAxKSB7CisgICAgICBjb25maWcucXVhbGl0eSA9IEV4VXRpbEdldEZsb2F0KGFyZ3ZbKytjXSwgJnBhcnNlX2Vycm9yKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1tIikgJiYgYyA8IGFyZ2MgLSAxKSB7CisgICAgICBjb25maWcubWV0aG9kID0gRXhVdGlsR2V0SW50KGFyZ3ZbKytjXSwgMCwgJnBhcnNlX2Vycm9yKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1taW5fc2l6ZSIpKSB7CisgICAgICBlbmNfb3B0aW9ucy5taW5pbWl6ZV9zaXplID0gMTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1rbWF4IikgJiYgYyA8IGFyZ2MgLSAxKSB7CisgICAgICBlbmNfb3B0aW9ucy5rbWF4ID0gRXhVdGlsR2V0SW50KGFyZ3ZbKytjXSwgMCwgJnBhcnNlX2Vycm9yKTsKKyAgICAgIGRlZmF1bHRfa21heCA9IDA7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICIta21pbiIpICYmIGMgPCBhcmdjIC0gMSkgeworICAgICAgZW5jX29wdGlvbnMua21pbiA9IEV4VXRpbEdldEludChhcmd2WysrY10sIDAsICZwYXJzZV9lcnJvcik7CisgICAgICBkZWZhdWx0X2ttaW4gPSAwOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWYiKSAmJiBjIDwgYXJnYyAtIDEpIHsKKyAgICAgIGNvbmZpZy5maWx0ZXJfc3RyZW5ndGggPSBFeFV0aWxHZXRJbnQoYXJndlsrK2NdLCAwLCAmcGFyc2VfZXJyb3IpOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLW1ldGFkYXRhIikgJiYgYyA8IGFyZ2MgLSAxKSB7CisgICAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICAgICAgY29uc3QgY2hhciogb3B0aW9uOworICAgICAgICBpbnQgZmxhZzsKKyAgICAgIH0ga1Rva2Vuc1tdID0geworICAgICAgICB7ICJhbGwiLCAgTUVUQURBVEFfQUxMIH0sCisgICAgICAgIHsgIm5vbmUiLCAwIH0sCisgICAgICAgIHsgImljYyIsICBNRVRBREFUQV9JQ0MgfSwKKyAgICAgICAgeyAieG1wIiwgIE1FVEFEQVRBX1hNUCB9LAorICAgICAgfTsKKyAgICAgIGNvbnN0IHNpemVfdCBrTnVtVG9rZW5zID0gc2l6ZW9mKGtUb2tlbnMpIC8gc2l6ZW9mKCprVG9rZW5zKTsKKyAgICAgIGNvbnN0IGNoYXIqIHN0YXJ0ID0gYXJndlsrK2NdOworICAgICAgY29uc3QgY2hhciogY29uc3QgZW5kID0gc3RhcnQgKyBzdHJsZW4oc3RhcnQpOworCisgICAgICBrZWVwX21ldGFkYXRhID0gMDsKKyAgICAgIHdoaWxlIChzdGFydCA8IGVuZCkgeworICAgICAgICBzaXplX3QgaTsKKyAgICAgICAgY29uc3QgY2hhciogdG9rZW4gPSBzdHJjaHIoc3RhcnQsICcsJyk7CisgICAgICAgIGlmICh0b2tlbiA9PSBOVUxMKSB0b2tlbiA9IGVuZDsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwga051bVRva2VuczsgKytpKSB7CisgICAgICAgICAgaWYgKChzaXplX3QpKHRva2VuIC0gc3RhcnQpID09IHN0cmxlbihrVG9rZW5zW2ldLm9wdGlvbikgJiYKKyAgICAgICAgICAgICAgIXN0cm5jbXAoc3RhcnQsIGtUb2tlbnNbaV0ub3B0aW9uLCBzdHJsZW4oa1Rva2Vuc1tpXS5vcHRpb24pKSkgeworICAgICAgICAgICAgaWYgKGtUb2tlbnNbaV0uZmxhZyAhPSAwKSB7CisgICAgICAgICAgICAgIGtlZXBfbWV0YWRhdGEgfD0ga1Rva2Vuc1tpXS5mbGFnOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAga2VlcF9tZXRhZGF0YSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGkgPT0ga051bVRva2VucykgeworICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IhIFVua25vd24gbWV0YWRhdGEgdHlwZSAnJS4qcydcbiIsCisgICAgICAgICAgICAgICAgICAoaW50KSh0b2tlbiAtIHN0YXJ0KSwgc3RhcnQpOworICAgICAgICAgIEhlbHAoKTsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgc3RhcnQgPSB0b2tlbiArIDE7CisgICAgICB9CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItbXQiKSkgeworICAgICAgKytjb25maWcudGhyZWFkX2xldmVsOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXZlcnNpb24iKSkgeworICAgICAgY29uc3QgaW50IGVuY192ZXJzaW9uID0gV2ViUEdldEVuY29kZXJWZXJzaW9uKCk7CisgICAgICBjb25zdCBpbnQgbXV4X3ZlcnNpb24gPSBXZWJQR2V0TXV4VmVyc2lvbigpOworICAgICAgcHJpbnRmKCJXZWJQIEVuY29kZXIgdmVyc2lvbjogJWQuJWQuJWRcbldlYlAgTXV4IHZlcnNpb246ICVkLiVkLiVkXG4iLAorICAgICAgICAgICAgIChlbmNfdmVyc2lvbiA+PiAxNikgJiAweGZmLCAoZW5jX3ZlcnNpb24gPj4gOCkgJiAweGZmLAorICAgICAgICAgICAgIGVuY192ZXJzaW9uICYgMHhmZiwgKG11eF92ZXJzaW9uID4+IDE2KSAmIDB4ZmYsCisgICAgICAgICAgICAgKG11eF92ZXJzaW9uID4+IDgpICYgMHhmZiwgbXV4X3ZlcnNpb24gJiAweGZmKTsKKyAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXF1aWV0IikpIHsKKyAgICAgIHF1aWV0ID0gMTsKKyAgICAgIGVuY19vcHRpb25zLnZlcmJvc2UgPSAwOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXYiKSkgeworICAgICAgdmVyYm9zZSA9IDE7CisgICAgICBlbmNfb3B0aW9ucy52ZXJib3NlID0gMTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi0tIikpIHsKKyAgICAgIGlmIChjIDwgYXJnYyAtIDEpIGluX2ZpbGUgPSBhcmd2WysrY107CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgaWYgKGFyZ3ZbY11bMF0gPT0gJy0nKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yISBVbmtub3duIG9wdGlvbiAnJXMnXG4iLCBhcmd2W2NdKTsKKyAgICAgIEhlbHAoKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgeworICAgICAgaW5fZmlsZSA9IGFyZ3ZbY107CisgICAgfQorCisgICAgaWYgKHBhcnNlX2Vycm9yKSB7CisgICAgICBIZWxwKCk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICB9CisKKyAgLy8gQXBwcm9wcmlhdGUgZGVmYXVsdCBrbWluLCBrbWF4IHZhbHVlcyBmb3IgbG9zc3kgYW5kIGxvc3NsZXNzLgorICBpZiAoZGVmYXVsdF9rbWluKSB7CisgICAgZW5jX29wdGlvbnMua21pbiA9IGNvbmZpZy5sb3NzbGVzcyA/IDkgOiAzOworICB9CisgIGlmIChkZWZhdWx0X2ttYXgpIHsKKyAgICBlbmNfb3B0aW9ucy5rbWF4ID0gY29uZmlnLmxvc3NsZXNzID8gMTcgOiA1OworICB9CisKKyAgaWYgKCFXZWJQVmFsaWRhdGVDb25maWcoJmNvbmZpZykpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yISBJbnZhbGlkIGNvbmZpZ3VyYXRpb24uXG4iKTsKKyAgICBnb3RvIEVuZDsKKyAgfQorCisgIGlmIChpbl9maWxlID09IE5VTEwpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIk5vIGlucHV0IGZpbGUgc3BlY2lmaWVkIVxuIik7CisgICAgSGVscCgpOworICAgIGdvdG8gRW5kOworICB9CisKKyAgLy8gU3RhcnQgdGhlIGRlY29kZXIgb2JqZWN0CisjaWYgTE9DQUxfR0lGX1BSRVJFUSg1LDApCisgIGdpZiA9ICFzdHJjbXAoaW5fZmlsZSwgIi0iKSA/IERHaWZPcGVuRmlsZUhhbmRsZShTVERJTl9GSUxFTk8sICZnaWZfZXJyb3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IERHaWZPcGVuRmlsZU5hbWUoaW5fZmlsZSwgJmdpZl9lcnJvcik7CisjZWxzZQorICBnaWYgPSAhc3RyY21wKGluX2ZpbGUsICItIikgPyBER2lmT3BlbkZpbGVIYW5kbGUoU1RESU5fRklMRU5PKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBER2lmT3BlbkZpbGVOYW1lKGluX2ZpbGUpOworI2VuZGlmCisgIGlmIChnaWYgPT0gTlVMTCkgZ290byBFbmQ7CisKKyAgLy8gTG9vcCBvdmVyIEdJRiBpbWFnZXMKKyAgZG9uZSA9IDA7CisgIGRvIHsKKyAgICBHaWZSZWNvcmRUeXBlIHR5cGU7CisgICAgaWYgKERHaWZHZXRSZWNvcmRUeXBlKGdpZiwgJnR5cGUpID09IEdJRl9FUlJPUikgZ290byBFbmQ7CisKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgIGNhc2UgSU1BR0VfREVTQ19SRUNPUkRfVFlQRTogeworICAgICAgICBHSUZGcmFtZVJlY3QgZ2lmX3JlY3Q7CisgICAgICAgIEdpZkltYWdlRGVzYyogY29uc3QgaW1hZ2VfZGVzYyA9ICZnaWYtPkltYWdlOworCisgICAgICAgIGlmICghREdpZkdldEltYWdlRGVzYyhnaWYpKSBnb3RvIEVuZDsKKworICAgICAgICBpZiAoZnJhbWVfbnVtYmVyID09IDApIHsKKyAgICAgICAgICBpZiAodmVyYm9zZSkgeworICAgICAgICAgICAgcHJpbnRmKCJDYW52YXMgc2NyZWVuOiAlZCB4ICVkXG4iLCBnaWYtPlNXaWR0aCwgZ2lmLT5TSGVpZ2h0KTsKKyAgICAgICAgICB9CisgICAgICAgICAgLy8gRml4IHNvbWUgYnJva2VuIEdJRiBnbG9iYWwgaGVhZGVycyB0aGF0IHJlcG9ydAorICAgICAgICAgIC8vIDAgeCAwIHNjcmVlbiBkaW1lbnNpb24uCisgICAgICAgICAgaWYgKGdpZi0+U1dpZHRoID09IDAgfHwgZ2lmLT5TSGVpZ2h0ID09IDApIHsKKyAgICAgICAgICAgIGltYWdlX2Rlc2MtPkxlZnQgPSAwOworICAgICAgICAgICAgaW1hZ2VfZGVzYy0+VG9wID0gMDsKKyAgICAgICAgICAgIGdpZi0+U1dpZHRoID0gaW1hZ2VfZGVzYy0+V2lkdGg7CisgICAgICAgICAgICBnaWYtPlNIZWlnaHQgPSBpbWFnZV9kZXNjLT5IZWlnaHQ7CisgICAgICAgICAgICBpZiAoZ2lmLT5TV2lkdGggPD0gMCB8fCBnaWYtPlNIZWlnaHQgPD0gMCkgeworICAgICAgICAgICAgICBnb3RvIEVuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh2ZXJib3NlKSB7CisgICAgICAgICAgICAgIHByaW50ZigiRml4ZWQgY2FudmFzIHNjcmVlbiBkaW1lbnNpb24gdG86ICVkIHggJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICBnaWYtPlNXaWR0aCwgZ2lmLT5TSGVpZ2h0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgLy8gQWxsb2NhdGUgY3VycmVudCBidWZmZXIuCisgICAgICAgICAgZnJhbWUud2lkdGggPSBnaWYtPlNXaWR0aDsKKyAgICAgICAgICBmcmFtZS5oZWlnaHQgPSBnaWYtPlNIZWlnaHQ7CisgICAgICAgICAgZnJhbWUudXNlX2FyZ2IgPSAxOworICAgICAgICAgIGlmICghV2ViUFBpY3R1cmVBbGxvYygmZnJhbWUpKSBnb3RvIEVuZDsKKyAgICAgICAgICBHSUZDbGVhclBpYygmZnJhbWUsIE5VTEwpOworICAgICAgICAgIFdlYlBQaWN0dXJlQ29weSgmZnJhbWUsICZjdXJyX2NhbnZhcyk7CisgICAgICAgICAgV2ViUFBpY3R1cmVDb3B5KCZmcmFtZSwgJnByZXZfY2FudmFzKTsKKworICAgICAgICAgIC8vIEJhY2tncm91bmQgY29sb3IuCisgICAgICAgICAgR0lGR2V0QmFja2dyb3VuZENvbG9yKGdpZi0+U0NvbG9yTWFwLCBnaWYtPlNCYWNrR3JvdW5kQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcGFyZW50X2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jX29wdGlvbnMuYW5pbV9wYXJhbXMuYmdjb2xvcik7CisKKyAgICAgICAgICAvLyBJbml0aWFsaXplIGVuY29kZXIuCisgICAgICAgICAgZW5jID0gV2ViUEFuaW1FbmNvZGVyTmV3KGN1cnJfY2FudmFzLndpZHRoLCBjdXJyX2NhbnZhcy5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNfb3B0aW9ucyk7CisgICAgICAgICAgaWYgKGVuYyA9PSBOVUxMKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAgICAgIkVycm9yISBDb3VsZCBub3QgY3JlYXRlIGVuY29kZXIgb2JqZWN0LiBQb3NzaWJseSBkdWUgdG8gIgorICAgICAgICAgICAgICAgICAgICAiYSBtZW1vcnkgZXJyb3IuXG4iKTsKKyAgICAgICAgICAgIGdvdG8gRW5kOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFNvbWUgZXZlbiBtb3JlIGJyb2tlbiBHSUYgY2FuIGhhdmUgc3ViLXJlY3Qgd2l0aCB6ZXJvIHdpZHRoL2hlaWdodC4KKyAgICAgICAgaWYgKGltYWdlX2Rlc2MtPldpZHRoID09IDAgfHwgaW1hZ2VfZGVzYy0+SGVpZ2h0ID09IDApIHsKKyAgICAgICAgICBpbWFnZV9kZXNjLT5XaWR0aCA9IGdpZi0+U1dpZHRoOworICAgICAgICAgIGltYWdlX2Rlc2MtPkhlaWdodCA9IGdpZi0+U0hlaWdodDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghR0lGUmVhZEZyYW1lKGdpZiwgdHJhbnNwYXJlbnRfaW5kZXgsICZnaWZfcmVjdCwgJmZyYW1lKSkgeworICAgICAgICAgIGdvdG8gRW5kOworICAgICAgICB9CisgICAgICAgIC8vIEJsZW5kIGZyYW1lIHJlY3RhbmdsZSB3aXRoIHByZXZpb3VzIGNhbnZhcyB0byBjb21wb3NlIGZ1bGwgY2FudmFzLgorICAgICAgICAvLyBOb3RlIHRoYXQgJ2N1cnJfY2FudmFzJyBpcyBzYW1lIGFzICdwcmV2X2NhbnZhcycgYXQgdGhpcyBwb2ludC4KKyAgICAgICAgR0lGQmxlbmRGcmFtZXMoJmZyYW1lLCAmZ2lmX3JlY3QsICZjdXJyX2NhbnZhcyk7CisKKyAgICAgICAgaWYgKCFXZWJQQW5pbUVuY29kZXJBZGQoZW5jLCAmY3Vycl9jYW52YXMsIGZyYW1lX3RpbWVzdGFtcCwgJmNvbmZpZykpIHsKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIHdoaWxlIGFkZGluZyBmcmFtZSAjJWQ6ICVzXG4iLCBmcmFtZV9udW1iZXIsCisgICAgICAgICAgICAgICAgICBXZWJQQW5pbUVuY29kZXJHZXRFcnJvcihlbmMpKTsKKyAgICAgICAgICBnb3RvIEVuZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICArK2ZyYW1lX251bWJlcjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFVwZGF0ZSBjYW52YXNlcy4KKyAgICAgICAgR0lGRGlzcG9zZUZyYW1lKG9yaWdfZGlzcG9zZSwgJmdpZl9yZWN0LCAmcHJldl9jYW52YXMsICZjdXJyX2NhbnZhcyk7CisgICAgICAgIEdJRkNvcHlQaXhlbHMoJmN1cnJfY2FudmFzLCAmcHJldl9jYW52YXMpOworCisgICAgICAgIC8vIEZvcmNlIGZyYW1lcyB3aXRoIGEgc21hbGwgb3Igbm8gZHVyYXRpb24gdG8gMTAwbXMgdG8gYmUgY29uc2lzdGVudAorICAgICAgICAvLyB3aXRoIHdlYiBicm93c2VycyBhbmQgb3RoZXIgdHJhbnNjb2RpbmcgdG9vbHMuIFRoaXMgYWxzbyBhdm9pZHMKKyAgICAgICAgLy8gaW5jb3JyZWN0IGR1cmF0aW9ucyBiZXR3ZWVuIGZyYW1lcyB3aGVuIHBhZGRpbmcgZnJhbWVzIGFyZQorICAgICAgICAvLyBkaXNjYXJkZWQuCisgICAgICAgIGlmIChmcmFtZV9kdXJhdGlvbiA8PSAxMCkgeworICAgICAgICAgIGZyYW1lX2R1cmF0aW9uID0gMTAwOworICAgICAgICB9CisKKyAgICAgICAgLy8gVXBkYXRlIHRpbWVzdGFtcCAoZm9yIG5leHQgZnJhbWUpLgorICAgICAgICBmcmFtZV90aW1lc3RhbXAgKz0gZnJhbWVfZHVyYXRpb247CisKKyAgICAgICAgLy8gSW4gR0lGLCBncmFwaGljIGNvbnRyb2wgZXh0ZW5zaW9ucyBhcmUgb3B0aW9uYWwgZm9yIGEgZnJhbWUsIHNvIHdlCisgICAgICAgIC8vIG1heSBub3QgZ2V0IG9uZSBiZWZvcmUgcmVhZGluZyB0aGUgbmV4dCBmcmFtZS4gVG8gaGFuZGxlIHRoaXMgY2FzZSwKKyAgICAgICAgLy8gd2UgcmVzZXQgZnJhbWUgcHJvcGVydGllcyB0byByZWFzb25hYmxlIGRlZmF1bHRzIGZvciB0aGUgbmV4dCBmcmFtZS4KKyAgICAgICAgb3JpZ19kaXNwb3NlID0gR0lGX0RJU1BPU0VfTk9ORTsKKyAgICAgICAgZnJhbWVfZHVyYXRpb24gPSAwOworICAgICAgICB0cmFuc3BhcmVudF9pbmRleCA9IEdJRl9JTkRFWF9JTlZBTElEOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgRVhURU5TSU9OX1JFQ09SRF9UWVBFOiB7CisgICAgICAgIGludCBleHRlbnNpb247CisgICAgICAgIEdpZkJ5dGVUeXBlICpkYXRhID0gTlVMTDsKKyAgICAgICAgaWYgKERHaWZHZXRFeHRlbnNpb24oZ2lmLCAmZXh0ZW5zaW9uLCAmZGF0YSkgPT0gR0lGX0VSUk9SKSB7CisgICAgICAgICAgZ290byBFbmQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRhdGEgPT0gTlVMTCkgY29udGludWU7CisKKyAgICAgICAgc3dpdGNoIChleHRlbnNpb24pIHsKKyAgICAgICAgICBjYXNlIENPTU1FTlRfRVhUX0ZVTkNfQ09ERTogeworICAgICAgICAgICAgYnJlYWs7ICAvLyBEbyBub3RoaW5nIGZvciBub3cuCisgICAgICAgICAgfQorICAgICAgICAgIGNhc2UgR1JBUEhJQ1NfRVhUX0ZVTkNfQ09ERTogeworICAgICAgICAgICAgaWYgKCFHSUZSZWFkR3JhcGhpY3NFeHRlbnNpb24oZGF0YSwgJmZyYW1lX2R1cmF0aW9uLCAmb3JpZ19kaXNwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyYW5zcGFyZW50X2luZGV4KSkgeworICAgICAgICAgICAgICBnb3RvIEVuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIFBMQUlOVEVYVF9FWFRfRlVOQ19DT0RFOiB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgY2FzZSBBUFBMSUNBVElPTl9FWFRfRlVOQ19DT0RFOiB7CisgICAgICAgICAgICBpZiAoZGF0YVswXSAhPSAxMSkgYnJlYWs7ICAgIC8vIENodW5rIGlzIHRvbyBzaG9ydAorICAgICAgICAgICAgaWYgKCFtZW1jbXAoZGF0YSArIDEsICJORVRTQ0FQRTIuMCIsIDExKSB8fAorICAgICAgICAgICAgICAgICFtZW1jbXAoZGF0YSArIDEsICJBTklNRVhUUzEuMCIsIDExKSkgeworICAgICAgICAgICAgICBpZiAoIUdJRlJlYWRMb29wQ291bnQoZ2lmLCAmZGF0YSwgJmxvb3BfY291bnQpKSB7CisgICAgICAgICAgICAgICAgZ290byBFbmQ7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkxvb3AgY291bnQ6ICVkXG4iLCBsb29wX2NvdW50KTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBzdG9yZWRfbG9vcF9jb3VudCA9IGxvb3BfY29tcGF0aWJpbGl0eSA/IChsb29wX2NvdW50ICE9IDApIDogMTsKKyAgICAgICAgICAgIH0gZWxzZSB7ICAvLyBBbiBleHRlbnNpb24gY29udGFpbmluZyBtZXRhZGF0YS4KKyAgICAgICAgICAgICAgLy8gV2Ugb25seSBzdG9yZSB0aGUgZmlyc3QgZW5jb3VudGVyZWQgY2h1bmsgb2YgZWFjaCB0eXBlLCBhbmQKKyAgICAgICAgICAgICAgLy8gb25seSBpZiByZXF1ZXN0ZWQgYnkgdGhlIHVzZXIuCisgICAgICAgICAgICAgIGNvbnN0IGludCBpc194bXAgPSAoa2VlcF9tZXRhZGF0YSAmIE1FVEFEQVRBX1hNUCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFzdG9yZWRfeG1wICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhbWVtY21wKGRhdGEgKyAxLCAiWE1QIERhdGFYTVAiLCAxMSk7CisgICAgICAgICAgICAgIGNvbnN0IGludCBpc19pY2MgPSAoa2VlcF9tZXRhZGF0YSAmIE1FVEFEQVRBX0lDQykgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFzdG9yZWRfaWNjICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhbWVtY21wKGRhdGEgKyAxLCAiSUNDUkdCRzEwMTIiLCAxMSk7CisgICAgICAgICAgICAgIGlmIChpc194bXAgfHwgaXNfaWNjKSB7CisgICAgICAgICAgICAgICAgaWYgKCFHSUZSZWFkTWV0YWRhdGEoZ2lmLCAmZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc194bXAgPyAmeG1wX2RhdGEgOiAmaWNjX2RhdGEpKSB7CisgICAgICAgICAgICAgICAgICBnb3RvIEVuZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGlzX2ljYykgeworICAgICAgICAgICAgICAgICAgc3RvcmVkX2ljYyA9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc194bXApIHsKKyAgICAgICAgICAgICAgICAgIHN0b3JlZF94bXAgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgIGJyZWFrOyAgLy8gc2tpcAorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoZGF0YSAhPSBOVUxMKSB7CisgICAgICAgICAgaWYgKERHaWZHZXRFeHRlbnNpb25OZXh0KGdpZiwgJmRhdGEpID09IEdJRl9FUlJPUikgZ290byBFbmQ7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIFRFUk1JTkFURV9SRUNPUkRfVFlQRTogeworICAgICAgICBkb25lID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZWZhdWx0OiB7CisgICAgICAgIGlmICh2ZXJib3NlKSB7CisgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJTa2lwcGluZyBvdmVyIHVua25vd24gcmVjb3JkIHR5cGUgJWRcbiIsIHR5cGUpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfSB3aGlsZSAoIWRvbmUpOworCisgIC8vIExhc3QgTlVMTCBmcmFtZS4KKyAgaWYgKCFXZWJQQW5pbUVuY29kZXJBZGQoZW5jLCBOVUxMLCBmcmFtZV90aW1lc3RhbXAsIE5VTEwpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBmbHVzaGluZyBXZWJQIG11eGVyLlxuIik7CisgICAgZnByaW50ZihzdGRlcnIsICIlc1xuIiwgV2ViUEFuaW1FbmNvZGVyR2V0RXJyb3IoZW5jKSk7CisgIH0KKworICBpZiAoIVdlYlBBbmltRW5jb2RlckFzc2VtYmxlKGVuYywgJndlYnBfZGF0YSkpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBXZWJQQW5pbUVuY29kZXJHZXRFcnJvcihlbmMpKTsKKyAgICBnb3RvIEVuZDsKKyAgfQorCisgIGlmICghbG9vcF9jb21wYXRpYmlsaXR5KSB7CisgICAgaWYgKCFzdG9yZWRfbG9vcF9jb3VudCkgeworICAgICAgLy8gaWYgbm8gbG9vcC1jb3VudCBlbGVtZW50IGlzIHNlZW4sIHRoZSBkZWZhdWx0IGlzICcxJyAobG9vcC1vbmNlKQorICAgICAgLy8gYW5kIHdlIG5lZWQgdG8gc2lnbmFsIGl0IGV4cGxpY2l0bHkgaW4gV2ViUC4gTm90ZSBob3dldmVyIHRoYXQKKyAgICAgIC8vIGluIGNhc2UgdGhlcmUncyBhIHNpbmdsZSBmcmFtZSwgd2Ugc3RpbGwgZG9uJ3QgbmVlZCB0byBzdG9yZSBpdC4KKyAgICAgIGlmIChmcmFtZV9udW1iZXIgPiAxKSB7CisgICAgICAgIHN0b3JlZF9sb29wX2NvdW50ID0gMTsKKyAgICAgICAgbG9vcF9jb3VudCA9IDE7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChsb29wX2NvdW50ID4gMCkgeworICAgICAgLy8gYWRhcHQgR0lGJ3Mgc2VtYW50aWMgdG8gV2ViUCdzIChleGNlcHQgaW4gdGhlIGluZmluaXRlLWxvb3AgY2FzZSkKKyAgICAgIGxvb3BfY291bnQgKz0gMTsKKyAgICB9CisgIH0KKyAgLy8gbG9vcF9jb3VudCBvZiAwIGlzIHRoZSBkZWZhdWx0IChpbmZpbml0ZSksIHNvIG5vIG5lZWQgdG8gc2lnbmFsIGl0CisgIGlmIChsb29wX2NvdW50ID09IDApIHN0b3JlZF9sb29wX2NvdW50ID0gMDsKKworICBpZiAoc3RvcmVkX2xvb3BfY291bnQgfHwgc3RvcmVkX2ljYyB8fCBzdG9yZWRfeG1wKSB7CisgICAgLy8gUmUtbXV4IHRvIGFkZCBsb29wIGNvdW50IGFuZC9vciBtZXRhZGF0YSBhcyBuZWVkZWQuCisgICAgbXV4ID0gV2ViUE11eENyZWF0ZSgmd2VicF9kYXRhLCAxKTsKKyAgICBpZiAobXV4ID09IE5VTEwpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IENvdWxkIG5vdCByZS1tdXggdG8gYWRkIGxvb3AgY291bnQvbWV0YWRhdGEuXG4iKTsKKyAgICAgIGdvdG8gRW5kOworICAgIH0KKyAgICBXZWJQRGF0YUNsZWFyKCZ3ZWJwX2RhdGEpOworCisgICAgaWYgKHN0b3JlZF9sb29wX2NvdW50KSB7ICAvLyBVcGRhdGUgbG9vcCBjb3VudC4KKyAgICAgIFdlYlBNdXhBbmltUGFyYW1zIG5ld19wYXJhbXM7CisgICAgICBlcnIgPSBXZWJQTXV4R2V0QW5pbWF0aW9uUGFyYW1zKG11eCwgJm5ld19wYXJhbXMpOworICAgICAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SICglcyk6IENvdWxkIG5vdCBmZXRjaCBsb29wIGNvdW50LlxuIiwKKyAgICAgICAgICAgICAgICBFcnJvclN0cmluZyhlcnIpKTsKKyAgICAgICAgZ290byBFbmQ7CisgICAgICB9CisgICAgICBuZXdfcGFyYW1zLmxvb3BfY291bnQgPSBsb29wX2NvdW50OworICAgICAgZXJyID0gV2ViUE11eFNldEFuaW1hdGlvblBhcmFtcyhtdXgsICZuZXdfcGFyYW1zKTsKKyAgICAgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUiAoJXMpOiBDb3VsZCBub3QgdXBkYXRlIGxvb3AgY291bnQuXG4iLAorICAgICAgICAgICAgICAgIEVycm9yU3RyaW5nKGVycikpOworICAgICAgICBnb3RvIEVuZDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc3RvcmVkX2ljYykgeyAgIC8vIEFkZCBJQ0NQIGNodW5rLgorICAgICAgZXJyID0gV2ViUE11eFNldENodW5rKG11eCwgIklDQ1AiLCAmaWNjX2RhdGEsIDEpOworICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJJQ0Mgc2l6ZTogJWRcbiIsIChpbnQpaWNjX2RhdGEuc2l6ZSk7CisgICAgICB9CisgICAgICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1IgKCVzKTogQ291bGQgbm90IHNldCBJQ0MgY2h1bmsuXG4iLAorICAgICAgICAgICAgICAgIEVycm9yU3RyaW5nKGVycikpOworICAgICAgICBnb3RvIEVuZDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc3RvcmVkX3htcCkgeyAgIC8vIEFkZCBYTVAgY2h1bmsuCisgICAgICBlcnIgPSBXZWJQTXV4U2V0Q2h1bmsobXV4LCAiWE1QICIsICZ4bXBfZGF0YSwgMSk7CisgICAgICBpZiAodmVyYm9zZSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlhNUCBzaXplOiAlZFxuIiwgKGludCl4bXBfZGF0YS5zaXplKTsKKyAgICAgIH0KKyAgICAgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUiAoJXMpOiBDb3VsZCBub3Qgc2V0IFhNUCBjaHVuay5cbiIsCisgICAgICAgICAgICAgICAgRXJyb3JTdHJpbmcoZXJyKSk7CisgICAgICAgIGdvdG8gRW5kOworICAgICAgfQorICAgIH0KKworICAgIGVyciA9IFdlYlBNdXhBc3NlbWJsZShtdXgsICZ3ZWJwX2RhdGEpOworICAgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1IgKCVzKTogQ291bGQgbm90IGFzc2VtYmxlIHdoZW4gcmUtbXV4aW5nIHRvIGFkZCAiCisgICAgICAgICAgICAgICJsb29wIGNvdW50L21ldGFkYXRhLlxuIiwgRXJyb3JTdHJpbmcoZXJyKSk7CisgICAgICBnb3RvIEVuZDsKKyAgICB9CisgIH0KKworICBpZiAob3V0X2ZpbGUgIT0gTlVMTCkgeworICAgIGlmICghSW1nSW9VdGlsV3JpdGVGaWxlKG91dF9maWxlLCB3ZWJwX2RhdGEuYnl0ZXMsIHdlYnBfZGF0YS5zaXplKSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciB3cml0aW5nIG91dHB1dCBmaWxlOiAlc1xuIiwgb3V0X2ZpbGUpOworICAgICAgZ290byBFbmQ7CisgICAgfQorICAgIGlmICghcXVpZXQpIHsKKyAgICAgIGlmICghc3RyY21wKG91dF9maWxlLCAiLSIpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiU2F2ZWQgJWQgYnl0ZXMgdG8gU1RESU9cbiIsCisgICAgICAgICAgICAgICAgKGludCl3ZWJwX2RhdGEuc2l6ZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlNhdmVkIG91dHB1dCBmaWxlICglZCBieXRlcyk6ICVzXG4iLAorICAgICAgICAgICAgICAgIChpbnQpd2VicF9kYXRhLnNpemUsIG91dF9maWxlKTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKCFxdWlldCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJOb3RoaW5nIHdyaXR0ZW47IHVzZSAtbyBmbGFnIHRvIHNhdmUgdGhlIHJlc3VsdCAiCisgICAgICAgICAgICAgICAgICAgICAgIiglZCBieXRlcykuXG4iLCAoaW50KXdlYnBfZGF0YS5zaXplKTsKKyAgICB9CisgIH0KKworICAvLyBBbGwgT0suCisgIG9rID0gMTsKKyAgZ2lmX2Vycm9yID0gR0lGX09LOworCisgRW5kOgorICBXZWJQRGF0YUNsZWFyKCZpY2NfZGF0YSk7CisgIFdlYlBEYXRhQ2xlYXIoJnhtcF9kYXRhKTsKKyAgV2ViUE11eERlbGV0ZShtdXgpOworICBXZWJQRGF0YUNsZWFyKCZ3ZWJwX2RhdGEpOworICBXZWJQUGljdHVyZUZyZWUoJmZyYW1lKTsKKyAgV2ViUFBpY3R1cmVGcmVlKCZjdXJyX2NhbnZhcyk7CisgIFdlYlBQaWN0dXJlRnJlZSgmcHJldl9jYW52YXMpOworICBXZWJQQW5pbUVuY29kZXJEZWxldGUoZW5jKTsKKyAgaWYgKG91dCAhPSBOVUxMICYmIG91dF9maWxlICE9IE5VTEwpIGZjbG9zZShvdXQpOworCisgIGlmIChnaWZfZXJyb3IgIT0gR0lGX09LKSB7CisgICAgR0lGRGlzcGxheUVycm9yKGdpZiwgZ2lmX2Vycm9yKTsKKyAgfQorICBpZiAoZ2lmICE9IE5VTEwpIHsKKyNpZiBMT0NBTF9HSUZfUFJFUkVRKDUsMSkKKyAgICBER2lmQ2xvc2VGaWxlKGdpZiwgJmdpZl9lcnJvcik7CisjZWxzZQorICAgIERHaWZDbG9zZUZpbGUoZ2lmKTsKKyNlbmRpZgorICB9CisKKyAgcmV0dXJuICFvazsKK30KKworI2Vsc2UgIC8vICFXRUJQX0hBVkVfR0lGCisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10pIHsKKyAgZnByaW50ZihzdGRlcnIsICJHSUYgc3VwcG9ydCBub3QgZW5hYmxlZCBpbiAlcy5cbiIsIGFyZ3ZbMF0pOworICAodm9pZClhcmdjOworICByZXR1cm4gMDsKK30KKworI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy9naWZkZWMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL2dpZmRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMTkzNTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy9naWZkZWMuYwpAQCAtMCwwICsxLDQxNiBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEdJRiBkZWNvZGUuCisKKyNpbmNsdWRlICIuL2dpZmRlYy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmZGVmIFdFQlBfSEFWRV9HSUYKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgIndlYnAvZW5jb2RlLmgiCisjaW5jbHVkZSAid2VicC9tdXhfdHlwZXMuaCIKKworI2RlZmluZSBHSUZfVFJBTlNQQVJFTlRfQ09MT1IgMHgwMDAwMDAwMHUKKyNkZWZpbmUgR0lGX1dISVRFX0NPTE9SICAgICAgIDB4ZmZmZmZmZmZ1CisjZGVmaW5lIEdJRl9UUkFOU1BBUkVOVF9NQVNLICAweDAxCisjZGVmaW5lIEdJRl9ESVNQT1NFX01BU0sgICAgICAweDA3CisjZGVmaW5lIEdJRl9ESVNQT1NFX1NISUZUICAgICAyCisKKy8vIGZyb20gdXRpbHMvdXRpbHMuaAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorZXh0ZXJuIHZvaWQgV2ViUENvcHlQbGFuZShjb25zdCB1aW50OF90KiBzcmMsIGludCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworZXh0ZXJuIHZvaWQgV2ViUENvcHlQaXhlbHMoY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBQaWN0dXJlKiBjb25zdCBkc3QpOworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKwordm9pZCBHSUZHZXRCYWNrZ3JvdW5kQ29sb3IoY29uc3QgQ29sb3JNYXBPYmplY3QqIGNvbnN0IGNvbG9yX21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiZ2NvbG9yX2luZGV4LCBpbnQgdHJhbnNwYXJlbnRfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogY29uc3QgYmdjb2xvcikgeworICBpZiAodHJhbnNwYXJlbnRfaW5kZXggIT0gR0lGX0lOREVYX0lOVkFMSUQgJiYKKyAgICAgIGJnY29sb3JfaW5kZXggPT0gdHJhbnNwYXJlbnRfaW5kZXgpIHsKKyAgICAqYmdjb2xvciA9IEdJRl9UUkFOU1BBUkVOVF9DT0xPUjsgIC8vIFNwZWNpYWwgY2FzZS4KKyAgfSBlbHNlIGlmIChjb2xvcl9tYXAgPT0gTlVMTCB8fCBjb2xvcl9tYXAtPkNvbG9ycyA9PSBOVUxMCisgICAgICAgICAgICAgfHwgYmdjb2xvcl9pbmRleCA+PSBjb2xvcl9tYXAtPkNvbG9yQ291bnQpIHsKKyAgICAqYmdjb2xvciA9IEdJRl9XSElURV9DT0xPUjsKKyAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICJHSUYgZGVjb2RlIHdhcm5pbmc6IGludmFsaWQgYmFja2dyb3VuZCBjb2xvciBpbmRleC4gQXNzdW1pbmcgIgorICAgICAgICAgICAgIndoaXRlIGJhY2tncm91bmQuXG4iKTsKKyAgfSBlbHNlIHsKKyAgICBjb25zdCBHaWZDb2xvclR5cGUgY29sb3IgPSBjb2xvcl9tYXAtPkNvbG9yc1tiZ2NvbG9yX2luZGV4XTsKKyAgICAqYmdjb2xvciA9ICgweGZmdSAgICAgICA8PCAyNCkKKyAgICAgICAgICAgICB8IChjb2xvci5SZWQgICA8PCAxNikKKyAgICAgICAgICAgICB8IChjb2xvci5HcmVlbiA8PCAgOCkKKyAgICAgICAgICAgICB8IChjb2xvci5CbHVlICA8PCAgMCk7CisgIH0KK30KKworaW50IEdJRlJlYWRHcmFwaGljc0V4dGVuc2lvbihjb25zdCBHaWZCeXRlVHlwZSogY29uc3QgYnVmLCBpbnQqIGNvbnN0IGR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHSUZEaXNwb3NlTWV0aG9kKiBjb25zdCBkaXNwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IHRyYW5zcGFyZW50X2luZGV4KSB7CisgIGNvbnN0IGludCBmbGFncyA9IGJ1ZlsxXTsKKyAgY29uc3QgaW50IGRpc3Bvc2VfcmF3ID0gKGZsYWdzID4+IEdJRl9ESVNQT1NFX1NISUZUKSAmIEdJRl9ESVNQT1NFX01BU0s7CisgIGNvbnN0IGludCBkdXJhdGlvbl9yYXcgPSBidWZbMl0gfCAoYnVmWzNdIDw8IDgpOyAgLy8gSW4gMTAgbXMgdW5pdHMuCisgIGlmIChidWZbMF0gIT0gNCkgcmV0dXJuIDA7CisgICpkdXJhdGlvbiA9IGR1cmF0aW9uX3JhdyAqIDEwOyAgLy8gRHVyYXRpb24gaXMgaW4gMSBtcyB1bml0cy4KKyAgc3dpdGNoIChkaXNwb3NlX3JhdykgeworICAgIGNhc2UgMzoKKyAgICAgICpkaXNwb3NlID0gR0lGX0RJU1BPU0VfUkVTVE9SRV9QUkVWSU9VUzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICpkaXNwb3NlID0gR0lGX0RJU1BPU0VfQkFDS0dST1VORDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICBjYXNlIDA6CisgICAgZGVmYXVsdDoKKyAgICAgICpkaXNwb3NlID0gR0lGX0RJU1BPU0VfTk9ORTsKKyAgICAgIGJyZWFrOworICB9CisgICp0cmFuc3BhcmVudF9pbmRleCA9CisgICAgICAoZmxhZ3MgJiBHSUZfVFJBTlNQQVJFTlRfTUFTSykgPyBidWZbNF0gOiBHSUZfSU5ERVhfSU5WQUxJRDsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgUmVtYXAoY29uc3QgR2lmRmlsZVR5cGUqIGNvbnN0IGdpZiwgY29uc3QgdWludDhfdCogY29uc3Qgc3JjLAorICAgICAgICAgICAgICAgICBpbnQgbGVuLCBpbnQgdHJhbnNwYXJlbnRfaW5kZXgsIHVpbnQzMl90KiBkc3QpIHsKKyAgaW50IGk7CisgIGNvbnN0IEdpZkNvbG9yVHlwZSogY29sb3JzOworICBjb25zdCBDb2xvck1hcE9iamVjdCogY29uc3QgY21hcCA9CisgICAgICBnaWYtPkltYWdlLkNvbG9yTWFwID8gZ2lmLT5JbWFnZS5Db2xvck1hcCA6IGdpZi0+U0NvbG9yTWFwOworICBpZiAoY21hcCA9PSBOVUxMKSByZXR1cm4gMTsKKyAgaWYgKGNtYXAtPkNvbG9ycyA9PSBOVUxMIHx8IGNtYXAtPkNvbG9yQ291bnQgPD0gMCkgcmV0dXJuIDA7CisgIGNvbG9ycyA9IGNtYXAtPkNvbG9yczsKKworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKyAgICBpZiAoc3JjW2ldID09IHRyYW5zcGFyZW50X2luZGV4KSB7CisgICAgICBkc3RbaV0gPSBHSUZfVFJBTlNQQVJFTlRfQ09MT1I7CisgICAgfSBlbHNlIGlmIChzcmNbaV0gPCBjbWFwLT5Db2xvckNvdW50KSB7CisgICAgICBjb25zdCBHaWZDb2xvclR5cGUgYyA9IGNvbG9yc1tzcmNbaV1dOworICAgICAgZHN0W2ldID0gYy5CbHVlIHwgKGMuR3JlZW4gPDwgOCkgfCAoYy5SZWQgPDwgMTYpIHwgKDB4ZmZ1IDw8IDI0KTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisgIHJldHVybiAxOworfQorCitpbnQgR0lGUmVhZEZyYW1lKEdpZkZpbGVUeXBlKiBjb25zdCBnaWYsIGludCB0cmFuc3BhcmVudF9pbmRleCwKKyAgICAgICAgICAgICAgICAgR0lGRnJhbWVSZWN0KiBjb25zdCBnaWZfcmVjdCwgV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUpIHsKKyAgV2ViUFBpY3R1cmUgc3ViX2ltYWdlOworICBjb25zdCBHaWZJbWFnZURlc2MqIGNvbnN0IGltYWdlX2Rlc2MgPSAmZ2lmLT5JbWFnZTsKKyAgdWludDMyX3QqIGRzdCA9IE5VTEw7CisgIHVpbnQ4X3QqIHRtcCA9IE5VTEw7CisgIGNvbnN0IEdJRkZyYW1lUmVjdCByZWN0ID0geworICAgICAgaW1hZ2VfZGVzYy0+TGVmdCwgaW1hZ2VfZGVzYy0+VG9wLCBpbWFnZV9kZXNjLT5XaWR0aCwgaW1hZ2VfZGVzYy0+SGVpZ2h0CisgIH07CisgIGNvbnN0IHVpbnQ2NF90IG1lbW9yeV9uZWVkZWQgPSA0ICogcmVjdC53aWR0aCAqICh1aW50NjRfdClyZWN0LmhlaWdodDsKKyAgaW50IG9rID0gMDsKKyAgKmdpZl9yZWN0ID0gcmVjdDsKKworICBpZiAobWVtb3J5X25lZWRlZCAhPSAoc2l6ZV90KW1lbW9yeV9uZWVkZWQgfHwgbWVtb3J5X25lZWRlZCA+ICg0VUxMIDw8IDMyKSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiSW1hZ2UgaXMgdG9vIGxhcmdlICglZCB4ICVkKS4iLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLyBVc2UgYSB2aWV3IGZvciB0aGUgc3ViLXBpY3R1cmU6CisgIGlmICghV2ViUFBpY3R1cmVWaWV3KHBpY3R1cmUsIHJlY3QueF9vZmZzZXQsIHJlY3QueV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0LCAmc3ViX2ltYWdlKSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiU3ViLWltYWdlICVkeCVkIGF0IHBvc2l0aW9uICVkLCVkIGlzIGludmFsaWQhXG4iLAorICAgICAgICAgICAgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQsIHJlY3QueF9vZmZzZXQsIHJlY3QueV9vZmZzZXQpOworICAgIHJldHVybiAwOworICB9CisgIGRzdCA9IHN1Yl9pbWFnZS5hcmdiOworCisgIHRtcCA9ICh1aW50OF90KiltYWxsb2MocmVjdC53aWR0aCAqIHNpemVvZigqdG1wKSk7CisgIGlmICh0bXAgPT0gTlVMTCkgZ290byBFbmQ7CisKKyAgaWYgKGltYWdlX2Rlc2MtPkludGVybGFjZSkgeyAgLy8gSW50ZXJsYWNlZCBpbWFnZS4KKyAgICAvLyBXZSBuZWVkIDQgcGFzc2VzLCB3aXRoIHRoZSBmb2xsb3dpbmcgb2Zmc2V0cyBhbmQganVtcHMuCisgICAgY29uc3QgaW50IGludGVybGFjZV9vZmZzZXRzW10gPSB7IDAsIDQsIDIsIDEgfTsKKyAgICBjb25zdCBpbnQgaW50ZXJsYWNlX2p1bXBzW10gICA9IHsgOCwgOCwgNCwgMiB9OworICAgIGludCBwYXNzOworICAgIGZvciAocGFzcyA9IDA7IHBhc3MgPCA0OyArK3Bhc3MpIHsKKyAgICAgIGNvbnN0IHNpemVfdCBzdHJpZGUgPSAoc2l6ZV90KXN1Yl9pbWFnZS5hcmdiX3N0cmlkZTsKKyAgICAgIGludCB5ID0gaW50ZXJsYWNlX29mZnNldHNbcGFzc107CisgICAgICB1aW50MzJfdCogcm93ID0gZHN0ICsgeSAqIHN0cmlkZTsKKyAgICAgIGNvbnN0IHNpemVfdCBqdW1wID0gaW50ZXJsYWNlX2p1bXBzW3Bhc3NdICogc3RyaWRlOworICAgICAgZm9yICg7IHkgPCByZWN0LmhlaWdodDsgeSArPSBpbnRlcmxhY2VfanVtcHNbcGFzc10sIHJvdyArPSBqdW1wKSB7CisgICAgICAgIGlmIChER2lmR2V0TGluZShnaWYsIHRtcCwgcmVjdC53aWR0aCkgPT0gR0lGX0VSUk9SKSBnb3RvIEVuZDsKKyAgICAgICAgaWYgKCFSZW1hcChnaWYsIHRtcCwgcmVjdC53aWR0aCwgdHJhbnNwYXJlbnRfaW5kZXgsIHJvdykpIGdvdG8gRW5kOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsgIC8vIE5vbi1pbnRlcmxhY2VkIGltYWdlLgorICAgIGludCB5OworICAgIHVpbnQzMl90KiBwdHIgPSBkc3Q7CisgICAgZm9yICh5ID0gMDsgeSA8IHJlY3QuaGVpZ2h0OyArK3ksIHB0ciArPSBzdWJfaW1hZ2UuYXJnYl9zdHJpZGUpIHsKKyAgICAgIGlmIChER2lmR2V0TGluZShnaWYsIHRtcCwgcmVjdC53aWR0aCkgPT0gR0lGX0VSUk9SKSBnb3RvIEVuZDsKKyAgICAgIGlmICghUmVtYXAoZ2lmLCB0bXAsIHJlY3Qud2lkdGgsIHRyYW5zcGFyZW50X2luZGV4LCBwdHIpKSBnb3RvIEVuZDsKKyAgICB9CisgIH0KKyAgb2sgPSAxOworCisgRW5kOgorICBpZiAoIW9rKSBwaWN0dXJlLT5lcnJvcl9jb2RlID0gc3ViX2ltYWdlLmVycm9yX2NvZGU7CisgIFdlYlBQaWN0dXJlRnJlZSgmc3ViX2ltYWdlKTsKKyAgZnJlZSh0bXApOworICByZXR1cm4gb2s7Cit9CisKK2ludCBHSUZSZWFkTG9vcENvdW50KEdpZkZpbGVUeXBlKiBjb25zdCBnaWYsIEdpZkJ5dGVUeXBlKiogY29uc3QgYnVmLAorICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBsb29wX2NvdW50KSB7CisgIGFzc2VydCghbWVtY21wKCpidWYgKyAxLCAiTkVUU0NBUEUyLjAiLCAxMSkgfHwKKyAgICAgICAgICFtZW1jbXAoKmJ1ZiArIDEsICJBTklNRVhUUzEuMCIsIDExKSk7CisgIGlmIChER2lmR2V0RXh0ZW5zaW9uTmV4dChnaWYsIGJ1ZikgPT0gR0lGX0VSUk9SKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKCpidWYgPT0gTlVMTCkgeworICAgIHJldHVybiAwOyAgLy8gTG9vcCBjb3VudCBzdWItYmxvY2sgbWlzc2luZy4KKyAgfQorICBpZiAoKCpidWYpWzBdIDwgMyB8fCAoKmJ1ZilbMV0gIT0gMSkgeworICAgIHJldHVybiAwOyAgIC8vIHdyb25nIHNpemUvbWFya2VyCisgIH0KKyAgKmxvb3BfY291bnQgPSAoKmJ1ZilbMl0gfCAoKCpidWYpWzNdIDw8IDgpOworICByZXR1cm4gMTsKK30KKworaW50IEdJRlJlYWRNZXRhZGF0YShHaWZGaWxlVHlwZSogY29uc3QgZ2lmLCBHaWZCeXRlVHlwZSoqIGNvbnN0IGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgV2ViUERhdGEqIGNvbnN0IG1ldGFkYXRhKSB7CisgIGNvbnN0IGludCBpc194bXAgPSAhbWVtY21wKCpidWYgKyAxLCAiWE1QIERhdGFYTVAiLCAxMSk7CisgIGNvbnN0IGludCBpc19pY2MgPSAhbWVtY21wKCpidWYgKyAxLCAiSUNDUkdCRzEwMTIiLCAxMSk7CisgIGFzc2VydChpc194bXAgfHwgaXNfaWNjKTsKKyAgKHZvaWQpaXNfaWNjOyAgLy8gc2lsZW5jZSB1bnVzZWQgd2FybmluZy4KKyAgLy8gQ29uc3RydWN0IG1ldGFkYXRhIGZyb20gc3ViLWJsb2Nrcy4KKyAgLy8gVXN1YWwgY2FzZSAoaW5jbHVkaW5nIElDQyBwcm9maWxlKTogSW4gZWFjaCBzdWItYmxvY2ssIHRoZQorICAvLyBmaXJzdCBieXRlIHNwZWNpZmllcyBpdHMgc2l6ZSBpbiBieXRlcyAoMCB0byAyNTUpIGFuZCB0aGUKKyAgLy8gcmVzdCBvZiB0aGUgYnl0ZXMgY29udGFpbiB0aGUgZGF0YS4KKyAgLy8gU3BlY2lhbCBjYXNlIGZvciBYTVAgZGF0YTogSW4gZWFjaCBzdWItYmxvY2ssIHRoZSBmaXJzdCBieXRlCisgIC8vIGlzIGFsc28gcGFydCBvZiB0aGUgWE1QIHBheWxvYWQuIFhNUCBpbiBHSUYgYWxzbyBoYXMgYSAyNTcKKyAgLy8gYnl0ZSBwYWRkaW5nIGRhdGEuIFNlZSB0aGUgWE1QIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMuCisgIHdoaWxlICgxKSB7CisgICAgV2ViUERhdGEgc3ViYmxvY2s7CisgICAgY29uc3QgdWludDhfdCogdG1wOworICAgIGlmIChER2lmR2V0RXh0ZW5zaW9uTmV4dChnaWYsIGJ1ZikgPT0gR0lGX0VSUk9SKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKCpidWYgPT0gTlVMTCkgYnJlYWs7ICAvLyBGaW5pc2hlZC4KKyAgICBzdWJibG9jay5zaXplID0gaXNfeG1wID8gKCpidWYpWzBdICsgMSA6ICgqYnVmKVswXTsKKyAgICBhc3NlcnQoc3ViYmxvY2suc2l6ZSA+IDApOworICAgIHN1YmJsb2NrLmJ5dGVzID0gaXNfeG1wID8gKmJ1ZiA6ICpidWYgKyAxOworICAgIC8vIE5vdGU6IFdlIHN0b3JlIHJldHVybmVkIHZhbHVlIGluICd0bXAnIGZpcnN0LCB0byBhdm9pZAorICAgIC8vIGxlYWtpbmcgb2xkIG1lbW9yeSBpbiBtZXRhZGF0YS0+Ynl0ZXMgb24gZXJyb3IuCisgICAgdG1wID0gKHVpbnQ4X3QqKXJlYWxsb2MoKHZvaWQqKW1ldGFkYXRhLT5ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS0+c2l6ZSArIHN1YmJsb2NrLnNpemUpOworICAgIGlmICh0bXAgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIG1lbWNweSgodm9pZCopKHRtcCArIG1ldGFkYXRhLT5zaXplKSwKKyAgICAgICAgICAgc3ViYmxvY2suYnl0ZXMsIHN1YmJsb2NrLnNpemUpOworICAgIG1ldGFkYXRhLT5ieXRlcyA9IHRtcDsKKyAgICBtZXRhZGF0YS0+c2l6ZSArPSBzdWJibG9jay5zaXplOworICB9CisgIGlmIChpc194bXApIHsKKyAgICAvLyBYTVAgcGFkZGluZyBkYXRhIGlzIDB4MDEsIDB4ZmYsIDB4ZmUgLi4uIDB4MDEsIDB4MDAuCisgICAgY29uc3Qgc2l6ZV90IHhtcF9wYWRpbmdfc2l6ZSA9IDI1NzsKKyAgICBpZiAobWV0YWRhdGEtPnNpemUgPiB4bXBfcGFkaW5nX3NpemUpIHsKKyAgICAgIG1ldGFkYXRhLT5zaXplIC09IHhtcF9wYWRpbmdfc2l6ZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIENsZWFyUmVjdGFuZ2xlKFdlYlBQaWN0dXJlKiBjb25zdCBwaWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsIGludCB0b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICBpbnQgaSwgajsKKyAgY29uc3Qgc2l6ZV90IHN0cmlkZSA9IHBpY3R1cmUtPmFyZ2Jfc3RyaWRlOworICB1aW50MzJfdCogZHN0ID0gcGljdHVyZS0+YXJnYiArIHRvcCAqIHN0cmlkZSArIGxlZnQ7CisgIGZvciAoaiA9IDA7IGogPCBoZWlnaHQ7ICsraiwgZHN0ICs9IHN0cmlkZSkgeworICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgKytpKSBkc3RbaV0gPSBHSUZfVFJBTlNQQVJFTlRfQ09MT1I7CisgIH0KK30KKwordm9pZCBHSUZDbGVhclBpYyhXZWJQUGljdHVyZSogY29uc3QgcGljLCBjb25zdCBHSUZGcmFtZVJlY3QqIGNvbnN0IHJlY3QpIHsKKyAgaWYgKHJlY3QgIT0gTlVMTCkgeworICAgIENsZWFyUmVjdGFuZ2xlKHBpYywgcmVjdC0+eF9vZmZzZXQsIHJlY3QtPnlfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgIHJlY3QtPndpZHRoLCByZWN0LT5oZWlnaHQpOworICB9IGVsc2UgeworICAgIENsZWFyUmVjdGFuZ2xlKHBpYywgMCwgMCwgcGljLT53aWR0aCwgcGljLT5oZWlnaHQpOworICB9Cit9CisKK3ZvaWQgR0lGQ29weVBpeGVscyhjb25zdCBXZWJQUGljdHVyZSogY29uc3Qgc3JjLCBXZWJQUGljdHVyZSogY29uc3QgZHN0KSB7CisgIFdlYlBDb3B5UGl4ZWxzKHNyYywgZHN0KTsKK30KKwordm9pZCBHSUZEaXNwb3NlRnJhbWUoR0lGRGlzcG9zZU1ldGhvZCBkaXNwb3NlLCBjb25zdCBHSUZGcmFtZVJlY3QqIGNvbnN0IHJlY3QsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcHJldl9jYW52YXMsCisgICAgICAgICAgICAgICAgICAgICBXZWJQUGljdHVyZSogY29uc3QgY3Vycl9jYW52YXMpIHsKKyAgYXNzZXJ0KHJlY3QgIT0gTlVMTCk7CisgIGlmIChkaXNwb3NlID09IEdJRl9ESVNQT1NFX0JBQ0tHUk9VTkQpIHsKKyAgICBHSUZDbGVhclBpYyhjdXJyX2NhbnZhcywgcmVjdCk7CisgIH0gZWxzZSBpZiAoZGlzcG9zZSA9PSBHSUZfRElTUE9TRV9SRVNUT1JFX1BSRVZJT1VTKSB7CisgICAgY29uc3Qgc2l6ZV90IHNyY19zdHJpZGUgPSBwcmV2X2NhbnZhcy0+YXJnYl9zdHJpZGU7CisgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IHNyYyA9IHByZXZfY2FudmFzLT5hcmdiICsgcmVjdC0+eF9vZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcmVjdC0+eV9vZmZzZXQgKiBzcmNfc3RyaWRlOworICAgIGNvbnN0IHNpemVfdCBkc3Rfc3RyaWRlID0gY3Vycl9jYW52YXMtPmFyZ2Jfc3RyaWRlOworICAgIHVpbnQzMl90KiBjb25zdCBkc3QgPSBjdXJyX2NhbnZhcy0+YXJnYiArIHJlY3QtPnhfb2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICAgICArIHJlY3QtPnlfb2Zmc2V0ICogZHN0X3N0cmlkZTsKKyAgICBhc3NlcnQocHJldl9jYW52YXMgIT0gTlVMTCk7CisgICAgV2ViUENvcHlQbGFuZSgodWludDhfdCopc3JjLCAoaW50KSg0ICogc3JjX3N0cmlkZSksCisgICAgICAgICAgICAgICAgICAodWludDhfdCopZHN0LCAoaW50KSg0ICogZHN0X3N0cmlkZSksCisgICAgICAgICAgICAgICAgICA0ICogcmVjdC0+d2lkdGgsIHJlY3QtPmhlaWdodCk7CisgIH0KK30KKwordm9pZCBHSUZCbGVuZEZyYW1lcyhjb25zdCBXZWJQUGljdHVyZSogY29uc3Qgc3JjLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBHSUZGcmFtZVJlY3QqIGNvbnN0IHJlY3QsIFdlYlBQaWN0dXJlKiBjb25zdCBkc3QpIHsKKyAgaW50IGksIGo7CisgIGNvbnN0IHNpemVfdCBzcmNfc3RyaWRlID0gc3JjLT5hcmdiX3N0cmlkZTsKKyAgY29uc3Qgc2l6ZV90IGRzdF9zdHJpZGUgPSBkc3QtPmFyZ2Jfc3RyaWRlOworICBhc3NlcnQoc3JjLT53aWR0aCA9PSBkc3QtPndpZHRoICYmIHNyYy0+aGVpZ2h0ID09IGRzdC0+aGVpZ2h0KTsKKyAgZm9yIChqID0gcmVjdC0+eV9vZmZzZXQ7IGogPCByZWN0LT55X29mZnNldCArIHJlY3QtPmhlaWdodDsgKytqKSB7CisgICAgZm9yIChpID0gcmVjdC0+eF9vZmZzZXQ7IGkgPCByZWN0LT54X29mZnNldCArIHJlY3QtPndpZHRoOyArK2kpIHsKKyAgICAgIGNvbnN0IHVpbnQzMl90IHNyY19waXhlbCA9IHNyYy0+YXJnYltqICogc3JjX3N0cmlkZSArIGldOworICAgICAgY29uc3QgaW50IHNyY19hbHBoYSA9IHNyY19waXhlbCA+PiAyNDsKKyAgICAgIGlmIChzcmNfYWxwaGEgIT0gMCkgeworICAgICAgICBkc3QtPmFyZ2JbaiAqIGRzdF9zdHJpZGUgKyBpXSA9IHNyY19waXhlbDsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordm9pZCBHSUZEaXNwbGF5RXJyb3IoY29uc3QgR2lmRmlsZVR5cGUqIGNvbnN0IGdpZiwgaW50IGdpZl9lcnJvcikgeworICAvLyBsaWJnaWYgNC4yLjAgaGFzIHJldGlyZWQgUHJpbnRHaWZFcnJvcigpIGFuZCBhZGRlZCBHaWZFcnJvclN0cmluZygpLgorI2lmIExPQ0FMX0dJRl9QUkVSRVEoNCwyKQorI2lmIExPQ0FMX0dJRl9QUkVSRVEoNSwwKQorICAvLyBTdGF0aWMgc3RyaW5nIGFjdHVhbGx5LCBoZW5jZSB0aGUgY29uc3QgY2hhciogY2FzdC4KKyAgY29uc3QgY2hhciogZXJyb3Jfc3RyID0gKGNvbnN0IGNoYXIqKUdpZkVycm9yU3RyaW5nKAorICAgICAgKGdpZiA9PSBOVUxMKSA/IGdpZl9lcnJvciA6IGdpZi0+RXJyb3IpOworI2Vsc2UKKyAgY29uc3QgY2hhciogZXJyb3Jfc3RyID0gKGNvbnN0IGNoYXIqKUdpZkVycm9yU3RyaW5nKCk7CisgICh2b2lkKWdpZjsKKyNlbmRpZgorICBpZiAoZXJyb3Jfc3RyID09IE5VTEwpIGVycm9yX3N0ciA9ICJVbmtub3duIGVycm9yIjsKKyAgZnByaW50ZihzdGRlcnIsICJHSUZMaWIgRXJyb3IgJWQ6ICVzXG4iLCBnaWZfZXJyb3IsIGVycm9yX3N0cik7CisjZWxzZQorICAodm9pZClnaWY7CisgIGZwcmludGYoc3RkZXJyLCAiR0lGTGliIEVycm9yICVkOiAiLCBnaWZfZXJyb3IpOworICBQcmludEdpZkVycm9yKCk7CisgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyNlbmRpZgorfQorCisjZWxzZSAgLy8gIVdFQlBfSEFWRV9HSUYKKworc3RhdGljIHZvaWQgRXJyb3JHSUZOb3RBdmFpbGFibGUoKSB7CisgIGZwcmludGYoc3RkZXJyLCAiR0lGIHN1cHBvcnQgbm90IGNvbXBpbGVkLiBQbGVhc2UgaW5zdGFsbCB0aGUgbGliZ2lmLWRldiAiCisgICAgICAgICAgInBhY2thZ2UgYmVmb3JlIGJ1aWxkaW5nLlxuIik7Cit9CisKK3ZvaWQgR0lGR2V0QmFja2dyb3VuZENvbG9yKGNvbnN0IHN0cnVjdCBDb2xvck1hcE9iamVjdCogY29uc3QgY29sb3JfbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJnY29sb3JfaW5kZXgsIGludCB0cmFuc3BhcmVudF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBjb25zdCBiZ2NvbG9yKSB7CisgICh2b2lkKWNvbG9yX21hcDsKKyAgKHZvaWQpYmdjb2xvcl9pbmRleDsKKyAgKHZvaWQpdHJhbnNwYXJlbnRfaW5kZXg7CisgICh2b2lkKWJnY29sb3I7CisgIEVycm9yR0lGTm90QXZhaWxhYmxlKCk7Cit9CisKK2ludCBHSUZSZWFkR3JhcGhpY3NFeHRlbnNpb24oY29uc3QgR2lmQnl0ZVR5cGUqIGNvbnN0IGRhdGEsIGludCogY29uc3QgZHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdJRkRpc3Bvc2VNZXRob2QqIGNvbnN0IGRpc3Bvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgdHJhbnNwYXJlbnRfaW5kZXgpIHsKKyAgKHZvaWQpZGF0YTsKKyAgKHZvaWQpZHVyYXRpb247CisgICh2b2lkKWRpc3Bvc2U7CisgICh2b2lkKXRyYW5zcGFyZW50X2luZGV4OworICBFcnJvckdJRk5vdEF2YWlsYWJsZSgpOworICByZXR1cm4gMDsKK30KKworaW50IEdJRlJlYWRGcmFtZShzdHJ1Y3QgR2lmRmlsZVR5cGUqIGNvbnN0IGdpZiwgaW50IHRyYW5zcGFyZW50X2luZGV4LAorICAgICAgICAgICAgICAgICBHSUZGcmFtZVJlY3QqIGNvbnN0IGdpZl9yZWN0LAorICAgICAgICAgICAgICAgICBzdHJ1Y3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUpIHsKKyAgKHZvaWQpZ2lmOworICAodm9pZCl0cmFuc3BhcmVudF9pbmRleDsKKyAgKHZvaWQpZ2lmX3JlY3Q7CisgICh2b2lkKXBpY3R1cmU7CisgIEVycm9yR0lGTm90QXZhaWxhYmxlKCk7CisgIHJldHVybiAwOworfQorCitpbnQgR0lGUmVhZExvb3BDb3VudChzdHJ1Y3QgR2lmRmlsZVR5cGUqIGNvbnN0IGdpZiwgR2lmQnl0ZVR5cGUqKiBjb25zdCBidWYsCisgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGxvb3BfY291bnQpIHsKKyAgKHZvaWQpZ2lmOworICAodm9pZClidWY7CisgICh2b2lkKWxvb3BfY291bnQ7CisgIEVycm9yR0lGTm90QXZhaWxhYmxlKCk7CisgIHJldHVybiAwOworfQorCitpbnQgR0lGUmVhZE1ldGFkYXRhKHN0cnVjdCBHaWZGaWxlVHlwZSogY29uc3QgZ2lmLCBHaWZCeXRlVHlwZSoqIGNvbnN0IGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0IFdlYlBEYXRhKiBjb25zdCBtZXRhZGF0YSkgeworICAodm9pZClnaWY7CisgICh2b2lkKWJ1ZjsKKyAgKHZvaWQpbWV0YWRhdGE7CisgIEVycm9yR0lGTm90QXZhaWxhYmxlKCk7CisgIHJldHVybiAwOworfQorCit2b2lkIEdJRkRpc3Bvc2VGcmFtZShHSUZEaXNwb3NlTWV0aG9kIGRpc3Bvc2UsIGNvbnN0IEdJRkZyYW1lUmVjdCogY29uc3QgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBXZWJQUGljdHVyZSogY29uc3QgcHJldl9jYW52YXMsCisgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgV2ViUFBpY3R1cmUqIGNvbnN0IGN1cnJfY2FudmFzKSB7CisgICh2b2lkKWRpc3Bvc2U7CisgICh2b2lkKXJlY3Q7CisgICh2b2lkKXByZXZfY2FudmFzOworICAodm9pZCljdXJyX2NhbnZhczsKKyAgRXJyb3JHSUZOb3RBdmFpbGFibGUoKTsKK30KKwordm9pZCBHSUZCbGVuZEZyYW1lcyhjb25zdCBzdHJ1Y3QgV2ViUFBpY3R1cmUqIGNvbnN0IHNyYywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgR0lGRnJhbWVSZWN0KiBjb25zdCByZWN0LAorICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgV2ViUFBpY3R1cmUqIGNvbnN0IGRzdCkgeworICAodm9pZClzcmM7CisgICh2b2lkKXJlY3Q7CisgICh2b2lkKWRzdDsKKyAgRXJyb3JHSUZOb3RBdmFpbGFibGUoKTsKK30KKwordm9pZCBHSUZEaXNwbGF5RXJyb3IoY29uc3Qgc3RydWN0IEdpZkZpbGVUeXBlKiBjb25zdCBnaWYsIGludCBnaWZfZXJyb3IpIHsKKyAgKHZvaWQpZ2lmOworICAodm9pZClnaWZfZXJyb3I7CisgIEVycm9yR0lGTm90QXZhaWxhYmxlKCk7Cit9CisKK3ZvaWQgR0lGQ2xlYXJQaWMoc3RydWN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsCisgICAgICAgICAgICAgICAgIGNvbnN0IEdJRkZyYW1lUmVjdCogY29uc3QgcmVjdCkgeworICAodm9pZClwaWM7CisgICh2b2lkKXJlY3Q7CisgIEVycm9yR0lGTm90QXZhaWxhYmxlKCk7Cit9CisKK3ZvaWQgR0lGQ29weVBpeGVscyhjb25zdCBzdHJ1Y3QgV2ViUFBpY3R1cmUqIGNvbnN0IHNyYywKKyAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgV2ViUFBpY3R1cmUqIGNvbnN0IGRzdCkgeworICAodm9pZClzcmM7CisgICh2b2lkKWRzdDsKKyAgRXJyb3JHSUZOb3RBdmFpbGFibGUoKTsKK30KKworI2VuZGlmICAvLyBXRUJQX0hBVkVfR0lGCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy9naWZkZWMuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL2dpZmRlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlYmE5ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy9naWZkZWMuaApAQCAtMCwwICsxLDExNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEdJRiBkZWNvZGUuCisKKyNpZm5kZWYgV0VCUF9FWEFNUExFU19HSUZERUNfSF8KKyNkZWZpbmUgV0VCUF9FWEFNUExFU19HSUZERUNfSF8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAid2VicC90eXBlcy5oIgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgIndlYnAvY29uZmlnLmgiCisjZW5kaWYKKworI2lmZGVmIFdFQlBfSEFWRV9HSUYKKyNpbmNsdWRlIDxnaWZfbGliLmg+CisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvLyBHSUZMSUJfTUFKT1IgaXMgb25seSBkZWZpbmVkIGluIGxpYmdpZiA+PSA0LjIuMC4KKyNpZiBkZWZpbmVkKEdJRkxJQl9NQUpPUikgJiYgZGVmaW5lZChHSUZMSUJfTUlOT1IpCisjIGRlZmluZSBMT0NBTF9HSUZfVkVSU0lPTiAoKEdJRkxJQl9NQUpPUiA8PCA4KSB8IEdJRkxJQl9NSU5PUikKKyMgZGVmaW5lIExPQ0FMX0dJRl9QUkVSRVEobWFqLCBtaW4pIFwKKyAgICAoTE9DQUxfR0lGX1ZFUlNJT04gPj0gKCgobWFqKSA8PCA4KSB8IChtaW4pKSkKKyNlbHNlCisjIGRlZmluZSBMT0NBTF9HSUZfVkVSU0lPTiAwCisjIGRlZmluZSBMT0NBTF9HSUZfUFJFUkVRKG1haiwgbWluKSAwCisjZW5kaWYKKworI2RlZmluZSBHSUZfSU5ERVhfSU5WQUxJRCAoLTEpCisKK3R5cGVkZWYgZW51bSBHSUZEaXNwb3NlTWV0aG9kIHsKKyAgR0lGX0RJU1BPU0VfTk9ORSwKKyAgR0lGX0RJU1BPU0VfQkFDS0dST1VORCwKKyAgR0lGX0RJU1BPU0VfUkVTVE9SRV9QUkVWSU9VUworfSBHSUZEaXNwb3NlTWV0aG9kOworCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCB4X29mZnNldCwgeV9vZmZzZXQsIHdpZHRoLCBoZWlnaHQ7Cit9IEdJRkZyYW1lUmVjdDsKKworc3RydWN0IFdlYlBEYXRhOworc3RydWN0IFdlYlBQaWN0dXJlOworCisjaWZuZGVmIFdFQlBfSEFWRV9HSUYKK3N0cnVjdCBDb2xvck1hcE9iamVjdDsKK3N0cnVjdCBHaWZGaWxlVHlwZTsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBHaWZCeXRlVHlwZTsKKyNlbmRpZgorCisvLyBHaXZlbiB0aGUgaW5kZXggb2YgYmFja2dyb3VuZCBjb2xvciBhbmQgdHJhbnNwYXJlbnQgY29sb3IsIHJldHVybnMgdGhlCisvLyBjb3JyZXNwb25kaW5nIGJhY2tncm91bmQgY29sb3IgKGluIEJHUkEgZm9ybWF0KSBpbiAnYmdjb2xvcicuCit2b2lkIEdJRkdldEJhY2tncm91bmRDb2xvcihjb25zdCBzdHJ1Y3QgQ29sb3JNYXBPYmplY3QqIGNvbnN0IGNvbG9yX21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiZ2NvbG9yX2luZGV4LCBpbnQgdHJhbnNwYXJlbnRfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogY29uc3QgYmdjb2xvcik7CisKKy8vIFBhcnNlcyB0aGUgZ2l2ZW4gZ3JhcGhpY3MgZXh0ZW5zaW9uIGRhdGEgdG8gZ2V0IGZyYW1lIGR1cmF0aW9uIChpbiAxbXMKKy8vIHVuaXRzKSwgZGlzcG9zZSBtZXRob2QgYW5kIHRyYW5zcGFyZW50IGNvbG9yIGluZGV4LgorLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MuCitpbnQgR0lGUmVhZEdyYXBoaWNzRXh0ZW5zaW9uKGNvbnN0IEdpZkJ5dGVUeXBlKiBjb25zdCBidWYsIGludCogY29uc3QgZHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdJRkRpc3Bvc2VNZXRob2QqIGNvbnN0IGRpc3Bvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgdHJhbnNwYXJlbnRfaW5kZXgpOworCisvLyBSZWFkcyB0aGUgbmV4dCBHSUYgZnJhbWUgZnJvbSAnZ2lmJyBpbnRvICdwaWN0dXJlJy4gQWxzbywgcmV0dXJucyB0aGUgR0lGCisvLyBmcmFtZSBkaW1lbnNpb25zIGFuZCBvZmZzZXRzIGluICdyZWN0Jy4KKy8vIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLgoraW50IEdJRlJlYWRGcmFtZShzdHJ1Y3QgR2lmRmlsZVR5cGUqIGNvbnN0IGdpZiwgaW50IHRyYW5zcGFyZW50X2luZGV4LAorICAgICAgICAgICAgICAgICBHSUZGcmFtZVJlY3QqIGNvbnN0IGdpZl9yZWN0LAorICAgICAgICAgICAgICAgICBzdHJ1Y3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUpOworCisvLyBQYXJzZXMgbG9vcCBjb3VudCBmcm9tIHRoZSBnaXZlbiBOZXRzY2FwZSBleHRlbnNpb24gZGF0YS4KK2ludCBHSUZSZWFkTG9vcENvdW50KHN0cnVjdCBHaWZGaWxlVHlwZSogY29uc3QgZ2lmLCBHaWZCeXRlVHlwZSoqIGNvbnN0IGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgbG9vcF9jb3VudCk7CisKKy8vIFBhcnNlcyB0aGUgZ2l2ZW4gSUNDIG9yIFhNUCBleHRlbnNpb24gZGF0YSBhbmQgc3RvcmVzIGl0IGludG8gJ21ldGFkYXRhJy4KKy8vIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLgoraW50IEdJRlJlYWRNZXRhZGF0YShzdHJ1Y3QgR2lmRmlsZVR5cGUqIGNvbnN0IGdpZiwgR2lmQnl0ZVR5cGUqKiBjb25zdCBidWYsCisgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBXZWJQRGF0YSogY29uc3QgbWV0YWRhdGEpOworCisvLyBEaXNwb3NlIHRoZSBwaXhlbHMgd2l0aGluICdyZWN0JyBvZiAnY3Vycl9jYW52YXMnIGJhc2VkIG9uICdkaXNwb3NlJyBtZXRob2QKKy8vIGFuZCAncHJldl9jYW52YXMnLgordm9pZCBHSUZEaXNwb3NlRnJhbWUoR0lGRGlzcG9zZU1ldGhvZCBkaXNwb3NlLCBjb25zdCBHSUZGcmFtZVJlY3QqIGNvbnN0IHJlY3QsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgV2ViUFBpY3R1cmUqIGNvbnN0IHByZXZfY2FudmFzLAorICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFdlYlBQaWN0dXJlKiBjb25zdCBjdXJyX2NhbnZhcyk7CisKKy8vIEdpdmVuICdzcmMnIHBpY3R1cmUgYW5kIGl0cyBmcmFtZSByZWN0YW5nbGUgJ3JlY3QnLCBibGVuZCBpdCBpbnRvICdkc3QnLgordm9pZCBHSUZCbGVuZEZyYW1lcyhjb25zdCBzdHJ1Y3QgV2ViUFBpY3R1cmUqIGNvbnN0IHNyYywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgR0lGRnJhbWVSZWN0KiBjb25zdCByZWN0LAorICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgV2ViUFBpY3R1cmUqIGNvbnN0IGRzdCk7CisKKy8vIFByaW50cyBhbiBlcnJvciBzdHJpbmcgYmFzZWQgb24gJ2dpZl9lcnJvcicuCit2b2lkIEdJRkRpc3BsYXlFcnJvcihjb25zdCBzdHJ1Y3QgR2lmRmlsZVR5cGUqIGNvbnN0IGdpZiwgaW50IGdpZl9lcnJvcik7CisKKy8vIEluIHRoZSBnaXZlbiAncGljJywgY2xlYXIgdGhlIHBpeGVscyBpbiAncmVjdCcgdG8gdHJhbnNwYXJlbnQgY29sb3IuCit2b2lkIEdJRkNsZWFyUGljKHN0cnVjdCBXZWJQUGljdHVyZSogY29uc3QgcGljLCBjb25zdCBHSUZGcmFtZVJlY3QqIGNvbnN0IHJlY3QpOworCisvLyBDb3B5IHBpeGVscyBmcm9tICdzcmMnIHRvICdkc3QnIGhvbm9yaW5nIHN0cmlkZXMuICdzcmMnIGFuZCAnZHN0JyBhcmUgYXNzdW1lZAorLy8gdG8gYmUgYWxyZWFkeSBhbGxvY2F0ZWQuCit2b2lkIEdJRkNvcHlQaXhlbHMoY29uc3Qgc3RydWN0IFdlYlBQaWN0dXJlKiBjb25zdCBzcmMsCisgICAgICAgICAgICAgICAgICAgc3RydWN0IFdlYlBQaWN0dXJlKiBjb25zdCBkc3QpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gICAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLy8gV0VCUF9FWEFNUExFU19HSUZERUNfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL2ltZzJ3ZWJwLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy9pbWcyd2VicC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNzUwYzUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy9pbWcyd2VicC5jCkBAIC0wLDAgKzEsMzE0IEBACisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gIGdlbmVyYXRlIGFuIGFuaW1hdGVkIFdlYlAgb3V0IG9mIGEgc2VxdWVuY2Ugb2YgaW1hZ2VzCisvLyAgKFBORywgSlBFRywgLi4uKQorLy8KKy8vICBFeGFtcGxlIHVzYWdlOgorLy8gICAgIGltZzJ3ZWJwIC1vIG91dC53ZWJwIC1xIDQwIC1taXhlZCAtZHVyYXRpb24gNDAgaW5wdXQ/Py5wbmcKKy8vCisvLyBBdXRob3I6IHNrYWxAZ29vZ2xlLmNvbSAoUGFzY2FsIE1hc3NpbWlubykKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAid2VicC9jb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiLi4vZXhhbXBsZXMvZXhhbXBsZV91dGlsLmgiCisjaW5jbHVkZSAiLi4vaW1hZ2Vpby9pbWFnZV9kZWMuaCIKKyNpbmNsdWRlICIuLi9pbWFnZWlvL2ltYWdlaW9fdXRpbC5oIgorI2luY2x1ZGUgIi4vc3RvcHdhdGNoLmgiCisjaW5jbHVkZSAid2VicC9lbmNvZGUuaCIKKyNpbmNsdWRlICJ3ZWJwL211eC5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBIZWxwKHZvaWQpIHsKKyAgcHJpbnRmKCJVc2FnZTpcblxuIik7CisgIHByaW50ZigiICBpbWcyd2VicCBbZmlsZS1sZXZlbCBvcHRpb25zXSBbaW1hZ2UgZmlsZXMuLi5dICIKKyAgICAgICAgICJbcGVyLWZyYW1lIG9wdGlvbnMuLi5dXG4iKTsKKyAgcHJpbnRmKCJcbiIpOworCisgIHByaW50ZigiRmlsZS1sZXZlbCBvcHRpb25zIChvbmx5IHVzZWQgYXQgdGhlIHN0YXJ0IG9mIGNvbXByZXNzaW9uKTpcbiIpOworICBwcmludGYoIiAtbWluX3NpemUgLi4uLi4uLi4uLi4uIG1pbmltaXplIHNpemVcbiIpOworICBwcmludGYoIiAtbG9vcCA8aW50PiAuLi4uLi4uLi4uIGxvb3AgY291bnQgKGRlZmF1bHQ6IDAsID0gaW5maW5pdGUgbG9vcClcbiIpOworICBwcmludGYoIiAta21heCA8aW50PiAuLi4uLi4uLi4uIG1heGltdW0gbnVtYmVyIG9mIGZyYW1lIGJldHdlZW4ga2V5LWZyYW1lc1xuIgorICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICgwPW9ubHkga2V5ZnJhbWVzKVxuIik7CisgIHByaW50ZigiIC1rbWluIDxpbnQ+IC4uLi4uLi4uLi4gbWluaW11bSBudW1iZXIgb2YgZnJhbWUgYmV0d2VlbiBrZXktZnJhbWVzXG4iCisgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgKDA9ZGlzYWJsZSBrZXktZnJhbWVzIGFsdG9nZXRoZXIpXG4iKTsKKyAgcHJpbnRmKCIgLW1peGVkIC4uLi4uLi4uLi4uLi4uLiB1c2UgbWl4ZWQgbG9zc3kvbG9zc2xlc3MgYXV0b21hdGljIG1vZGVcbiIpOworICBwcmludGYoIiAtdiAuLi4uLi4uLi4uLi4uLi4uLi4uIHZlcmJvc2UgbW9kZVxuIik7CisgIHByaW50ZigiIC1oIC4uLi4uLi4uLi4uLi4uLi4uLi4gdGhpcyBoZWxwXG4iKTsKKyAgcHJpbnRmKCIgLXZlcnNpb24gLi4uLi4uLi4uLi4uLiBwcmludCB2ZXJzaW9uIG51bWJlciBhbmQgZXhpdFxuIik7CisgIHByaW50ZigiXG4iKTsKKworICBwcmludGYoIlBlci1mcmFtZSBvcHRpb25zIChvbmx5IHVzZWQgZm9yIHN1YnNlcXVlbnQgaW1hZ2VzIGlucHV0KTpcbiIpOworICBwcmludGYoIiAtZCA8aW50PiAuLi4uLi4uLi4uLi4uIGZyYW1lIGR1cmF0aW9uIGluIG1zIChkZWZhdWx0OiAxMDApXG4iKTsKKyAgcHJpbnRmKCIgLWxvc3NsZXNzICAuLi4uLi4uLi4uLiB1c2UgbG9zc2xlc3MgbW9kZSAoZGVmYXVsdClcbiIpOworICBwcmludGYoIiAtbG9zc3kgLi4uIC4uLi4uLi4uLi4uIHVzZSBsb3NzeSBtb2RlXG4iKTsKKyAgcHJpbnRmKCIgLXEgPGZsb2F0PiAuLi4uLi4uLi4uLiBxdWFsaXR5XG4iKTsKKyAgcHJpbnRmKCIgLW0gPGludD4gLi4uLi4uLi4uLi4uLiBtZXRob2QgdG8gdXNlXG4iKTsKKworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiZXhhbXBsZTogaW1nMndlYnAgLWxvb3AgMiBpbjAucG5nIC1sb3NzeSBpbjEuanBnXG4iCisgICAgICAgICAiICAgICAgICAgICAgICAgICAgLWQgODAgaW4yLnRpZmYgLW8gb3V0LndlYnBcbiIpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50IFJlYWRJbWFnZShjb25zdCBjaGFyIGZpbGVuYW1lW10sIFdlYlBQaWN0dXJlKiBjb25zdCBwaWMpIHsKKyAgY29uc3QgdWludDhfdCogZGF0YSA9IE5VTEw7CisgIHNpemVfdCBkYXRhX3NpemUgPSAwOworICBXZWJQSW1hZ2VSZWFkZXIgcmVhZGVyOworICBpbnQgb2s7CisjaWZkZWYgSEFWRV9XSU5DT0RFQ19ICisgIC8vIFRyeSB0byBkZWNvZGUgdGhlIGZpbGUgdXNpbmcgV0lDIGZhbGxpbmcgYmFjayB0byB0aGUgb3RoZXIgcmVhZGVycyBmb3IKKyAgLy8gZS5nLiwgV2ViUC4KKyAgb2sgPSBSZWFkUGljdHVyZVdpdGhXSUMoZmlsZW5hbWUsIHBpYywgMSwgTlVMTCk7CisgIGlmIChvaykgcmV0dXJuIDE7CisjZW5kaWYKKyAgaWYgKCFJbWdJb1V0aWxSZWFkRmlsZShmaWxlbmFtZSwgJmRhdGEsICZkYXRhX3NpemUpKSByZXR1cm4gMDsKKyAgcmVhZGVyID0gV2ViUEd1ZXNzSW1hZ2VSZWFkZXIoZGF0YSwgZGF0YV9zaXplKTsKKyAgb2sgPSByZWFkZXIoZGF0YSwgZGF0YV9zaXplLCBwaWMsIDEsIE5VTEwpOworICBmcmVlKCh2b2lkKilkYXRhKTsKKyAgcmV0dXJuIG9rOworfQorCitzdGF0aWMgaW50IFNldExvb3BDb3VudChpbnQgbG9vcF9jb3VudCwgV2ViUERhdGEqIGNvbnN0IHdlYnBfZGF0YSkgeworICBpbnQgb2sgPSAxOworICBXZWJQTXV4RXJyb3IgZXJyOworICB1aW50MzJfdCBmZWF0dXJlczsKKyAgV2ViUE11eEFuaW1QYXJhbXMgbmV3X3BhcmFtczsKKyAgV2ViUE11eCogY29uc3QgbXV4ID0gV2ViUE11eENyZWF0ZSh3ZWJwX2RhdGEsIDEpOworICBpZiAobXV4ID09IE5VTEwpIHJldHVybiAwOworCisgIGVyciA9IFdlYlBNdXhHZXRGZWF0dXJlcyhtdXgsICZmZWF0dXJlcyk7CisgIG9rID0gKGVyciA9PSBXRUJQX01VWF9PSyk7CisgIGlmICghb2sgfHwgIShmZWF0dXJlcyAmIEFOSU1BVElPTl9GTEFHKSkgZ290byBFbmQ7CisKKyAgZXJyID0gV2ViUE11eEdldEFuaW1hdGlvblBhcmFtcyhtdXgsICZuZXdfcGFyYW1zKTsKKyAgb2sgPSAoZXJyID09IFdFQlBfTVVYX09LKTsKKyAgaWYgKG9rKSB7CisgICAgbmV3X3BhcmFtcy5sb29wX2NvdW50ID0gbG9vcF9jb3VudDsKKyAgICBlcnIgPSBXZWJQTXV4U2V0QW5pbWF0aW9uUGFyYW1zKG11eCwgJm5ld19wYXJhbXMpOworICAgIG9rID0gKGVyciA9PSBXRUJQX01VWF9PSyk7CisgIH0KKyAgaWYgKG9rKSB7CisgICAgV2ViUERhdGFDbGVhcih3ZWJwX2RhdGEpOworICAgIGVyciA9IFdlYlBNdXhBc3NlbWJsZShtdXgsIHdlYnBfZGF0YSk7CisgICAgb2sgPSAoZXJyID09IFdFQlBfTVVYX09LKTsKKyAgfQorCisgRW5kOgorICBXZWJQTXV4RGVsZXRlKG11eCk7CisgIGlmICghb2spIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGR1cmluZyBsb29wLWNvdW50IHNldHRpbmdcbiIpOworICB9CisgIHJldHVybiBvazsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIqIGFyZ3ZbXSkgeworICBjb25zdCBjaGFyKiBvdXRwdXQgPSBOVUxMOworICBXZWJQQW5pbUVuY29kZXIqIGVuYyA9IE5VTEw7CisgIGludCB2ZXJib3NlID0gMDsKKyAgaW50IHBpY19udW0gPSAwOworICBpbnQgZHVyYXRpb24gPSAxMDA7CisgIGludCB0aW1lc3RhbXBfbXMgPSAwOworICBpbnQgbG9vcF9jb3VudCA9IDA7CisgIGludCB3aWR0aCA9IDAsIGhlaWdodCA9IDA7CisgIFdlYlBBbmltRW5jb2Rlck9wdGlvbnMgYW5pbV9jb25maWc7CisgIFdlYlBDb25maWcgY29uZmlnOworICBXZWJQUGljdHVyZSBwaWM7CisgIFdlYlBEYXRhIHdlYnBfZGF0YTsKKyAgaW50IGM7CisgIGludCBoYXZlX2lucHV0ID0gMDsKKyAgQ29tbWFuZExpbmVBcmd1bWVudHMgY21kX2FyZ3M7CisgIGludCBvayA9IEV4VXRpbEluaXRDb21tYW5kTGluZUFyZ3VtZW50cyhhcmdjIC0gMSwgYXJndiArIDEsICZjbWRfYXJncyk7CisgIGlmICghb2spIHJldHVybiAxOworICBhcmdjID0gY21kX2FyZ3MuYXJnY187CisgIGFyZ3YgPSBjbWRfYXJncy5hcmd2XzsKKworICBXZWJQRGF0YUluaXQoJndlYnBfZGF0YSk7CisgIGlmICghV2ViUEFuaW1FbmNvZGVyT3B0aW9uc0luaXQoJmFuaW1fY29uZmlnKSB8fAorICAgICAgIVdlYlBDb25maWdJbml0KCZjb25maWcpIHx8CisgICAgICAhV2ViUFBpY3R1cmVJbml0KCZwaWMpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJMaWJyYXJ5IHZlcnNpb24gbWlzbWF0Y2ghXG4iKTsKKyAgICBvayA9IDA7CisgICAgZ290byBFbmQ7CisgIH0KKworICAvLyAxc3QgcGFzcyBvZiBvcHRpb24gcGFyc2luZworICBmb3IgKGMgPSAwOyBvayAmJiBjIDwgYXJnYzsgKytjKSB7CisgICAgaWYgKGFyZ3ZbY11bMF0gPT0gJy0nKSB7CisgICAgICBpbnQgcGFyc2VfZXJyb3IgPSAwOworICAgICAgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1vIikgJiYgYyArIDEgPCBhcmdjKSB7CisgICAgICAgIGFyZ3ZbY10gPSBOVUxMOworICAgICAgICBvdXRwdXQgPSBhcmd2WysrY107CisgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1rbWluIikgJiYgYyArIDEgPCBhcmdjKSB7CisgICAgICAgIGFyZ3ZbY10gPSBOVUxMOworICAgICAgICBhbmltX2NvbmZpZy5rbWluID0gRXhVdGlsR2V0SW50KGFyZ3ZbKytjXSwgMCwgJnBhcnNlX2Vycm9yKTsKKyAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWttYXgiKSAmJiBjICsgMSA8IGFyZ2MpIHsKKyAgICAgICAgYXJndltjXSA9IE5VTEw7CisgICAgICAgIGFuaW1fY29uZmlnLmttYXggPSBFeFV0aWxHZXRJbnQoYXJndlsrK2NdLCAwLCAmcGFyc2VfZXJyb3IpOworICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItbG9vcCIpICYmIGMgKyAxIDwgYXJnYykgeworICAgICAgICBhcmd2W2NdID0gTlVMTDsKKyAgICAgICAgbG9vcF9jb3VudCA9IEV4VXRpbEdldEludChhcmd2WysrY10sIDAsICZwYXJzZV9lcnJvcik7CisgICAgICAgIGlmIChsb29wX2NvdW50IDwgMCkgeworICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBub24tcG9zaXRpdmUgbG9vcC1jb3VudCAoJWQpXG4iLCBsb29wX2NvdW50KTsKKyAgICAgICAgICBwYXJzZV9lcnJvciA9IDE7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLW1pbl9zaXplIikpIHsKKyAgICAgICAgYW5pbV9jb25maWcubWluaW1pemVfc2l6ZSA9IDE7CisgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1taXhlZCIpKSB7CisgICAgICAgIGFuaW1fY29uZmlnLmFsbG93X21peGVkID0gMTsKKyAgICAgICAgY29uZmlnLmxvc3NsZXNzID0gMDsKKyAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXYiKSkgeworICAgICAgICB2ZXJib3NlID0gMTsKKyAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWgiKSB8fCAhc3RyY21wKGFyZ3ZbY10sICItaGVscCIpKSB7CisgICAgICAgIEhlbHAoKTsKKyAgICAgICAgZ290byBFbmQ7CisgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi12ZXJzaW9uIikpIHsKKyAgICAgICAgY29uc3QgaW50IGVuY192ZXJzaW9uID0gV2ViUEdldEVuY29kZXJWZXJzaW9uKCk7CisgICAgICAgIGNvbnN0IGludCBtdXhfdmVyc2lvbiA9IFdlYlBHZXRNdXhWZXJzaW9uKCk7CisgICAgICAgIHByaW50ZigiV2ViUCBFbmNvZGVyIHZlcnNpb246ICVkLiVkLiVkXG5XZWJQIE11eCB2ZXJzaW9uOiAlZC4lZC4lZFxuIiwKKyAgICAgICAgICAgICAgIChlbmNfdmVyc2lvbiA+PiAxNikgJiAweGZmLCAoZW5jX3ZlcnNpb24gPj4gOCkgJiAweGZmLAorICAgICAgICAgICAgICAgZW5jX3ZlcnNpb24gJiAweGZmLCAobXV4X3ZlcnNpb24gPj4gMTYpICYgMHhmZiwKKyAgICAgICAgICAgICAgIChtdXhfdmVyc2lvbiA+PiA4KSAmIDB4ZmYsIG11eF92ZXJzaW9uICYgMHhmZik7CisgICAgICAgIGdvdG8gRW5kOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBvayA9ICFwYXJzZV9lcnJvcjsKKyAgICAgIGlmICghb2spIGdvdG8gRW5kOworICAgICAgYXJndltjXSA9IE5VTEw7ICAgLy8gbWFyayBvcHRpb24gYXMgJ3BhcnNlZCcgZHVyaW5nIDFzdCBwYXNzCisgICAgfSBlbHNlIHsKKyAgICAgIGhhdmVfaW5wdXQgfD0gMTsKKyAgICB9CisgIH0KKyAgaWYgKCFoYXZlX2lucHV0KSB7CisgICAgZnByaW50ZihzdGRlcnIsICJObyBpbnB1dCBmaWxlKHMpIGZvciBnZW5lcmF0aW5nIGFuaW1hdGlvbiFcbiIpOworICAgIGdvdG8gRW5kOworICB9CisKKyAgLy8gaW1hZ2UtcmVhZGluZyBwYXNzCisgIHBpY19udW0gPSAwOworICBjb25maWcubG9zc2xlc3MgPSAxOworICBmb3IgKGMgPSAwOyBvayAmJiBjIDwgYXJnYzsgKytjKSB7CisgICAgaWYgKGFyZ3ZbY10gPT0gTlVMTCkgY29udGludWU7CisgICAgaWYgKGFyZ3ZbY11bMF0gPT0gJy0nKSB7ICAgIC8vIHBhcnNlIGxvY2FsIG9wdGlvbnMKKyAgICAgIGludCBwYXJzZV9lcnJvciA9IDA7CisgICAgICBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWxvc3N5IikpIHsKKyAgICAgICAgaWYgKCFhbmltX2NvbmZpZy5hbGxvd19taXhlZCkgY29uZmlnLmxvc3NsZXNzID0gMDsKKyAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWxvc3NsZXNzIikpIHsKKyAgICAgICAgaWYgKCFhbmltX2NvbmZpZy5hbGxvd19taXhlZCkgY29uZmlnLmxvc3NsZXNzID0gMTsKKyAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXEiKSAmJiBjICsgMSA8IGFyZ2MpIHsKKyAgICAgICAgY29uZmlnLnF1YWxpdHkgPSBFeFV0aWxHZXRGbG9hdChhcmd2WysrY10sICZwYXJzZV9lcnJvcik7CisgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1tIikgJiYgYyArIDEgPCBhcmdjKSB7CisgICAgICAgIGNvbmZpZy5tZXRob2QgPSBFeFV0aWxHZXRJbnQoYXJndlsrK2NdLCAwLCAmcGFyc2VfZXJyb3IpOworICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItZCIpICYmIGMgKyAxIDwgYXJnYykgeworICAgICAgICBkdXJhdGlvbiA9IEV4VXRpbEdldEludChhcmd2WysrY10sIDAsICZwYXJzZV9lcnJvcik7CisgICAgICAgIGlmIChkdXJhdGlvbiA8PSAwKSB7CisgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIG5lZ2F0aXZlIGR1cmF0aW9uICglZClcbiIsIGR1cmF0aW9uKTsKKyAgICAgICAgICBwYXJzZV9lcnJvciA9IDE7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBhcnNlX2Vycm9yID0gMTsgICAvLyBzaG91bGRuJ3QgYmUgaGVyZS4KKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbmtub3duIG9wdGlvbiBbJXNdXG4iLCBhcmd2W2NdKTsKKyAgICAgIH0KKyAgICAgIG9rID0gIXBhcnNlX2Vycm9yOworICAgICAgaWYgKCFvaykgZ290byBFbmQ7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBpZiAob2spIHsKKyAgICAgIG9rID0gV2ViUFZhbGlkYXRlQ29uZmlnKCZjb25maWcpOworICAgICAgaWYgKCFvaykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgY29uZmlndXJhdGlvbi5cbiIpOworICAgICAgICBnb3RvIEVuZDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyByZWFkIG5leHQgaW5wdXQgaW1hZ2UKKyAgICBwaWMudXNlX2FyZ2IgPSAxOworICAgIG9rID0gUmVhZEltYWdlKGFyZ3ZbY10sICZwaWMpOworICAgIGlmICghb2spIGdvdG8gRW5kOworCisgICAgaWYgKGVuYyA9PSBOVUxMKSB7CisgICAgICB3aWR0aCAgPSBwaWMud2lkdGg7CisgICAgICBoZWlnaHQgPSBwaWMuaGVpZ2h0OworICAgICAgZW5jID0gV2ViUEFuaW1FbmNvZGVyTmV3KHdpZHRoLCBoZWlnaHQsICZhbmltX2NvbmZpZyk7CisgICAgICBvayA9IChlbmMgIT0gTlVMTCk7CisgICAgICBpZiAoIW9rKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGNyZWF0ZSBXZWJQQW5pbUVuY29kZXIgb2JqZWN0LlxuIik7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKG9rKSB7CisgICAgICBvayA9ICh3aWR0aCA9PSBwaWMud2lkdGggJiYgaGVpZ2h0ID09IHBpYy5oZWlnaHQpOworICAgICAgaWYgKCFvaykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZyYW1lICMlZCBkaW1lbnNpb24gbWlzbWF0Y2hlZCEgIgorICAgICAgICAgICAgICAgICAgICAgICAgIkdvdCAlZCB4ICVkLiBXYXMgZXhwZWN0aW5nICVkIHggJWQuXG4iLAorICAgICAgICAgICAgICAgIHBpY19udW0sIHBpYy53aWR0aCwgcGljLmhlaWdodCwgd2lkdGgsIGhlaWdodCk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKG9rKSB7CisgICAgICBvayA9IFdlYlBBbmltRW5jb2RlckFkZChlbmMsICZwaWMsIHRpbWVzdGFtcF9tcywgJmNvbmZpZyk7CisgICAgICBpZiAoIW9rKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3Igd2hpbGUgYWRkaW5nIGZyYW1lICMlZFxuIiwgcGljX251bSk7CisgICAgICB9CisgICAgfQorICAgIFdlYlBQaWN0dXJlRnJlZSgmcGljKTsKKyAgICBpZiAoIW9rKSBnb3RvIEVuZDsKKworICAgIGlmICh2ZXJib3NlKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkFkZGVkIGZyYW1lICMlM2QgYXQgdGltZSAlNGQgKGZpbGU6ICVzKVxuIiwKKyAgICAgICAgICAgICAgcGljX251bSwgdGltZXN0YW1wX21zLCBhcmd2W2NdKTsKKyAgICB9CisgICAgdGltZXN0YW1wX21zICs9IGR1cmF0aW9uOworICAgICsrcGljX251bTsKKyAgfQorCisgIC8vIGFkZCBhIGxhc3QgZmFrZSBmcmFtZSB0byBzaWduYWwgdGhlIGxhc3QgZHVyYXRpb24KKyAgb2sgPSBvayAmJiBXZWJQQW5pbUVuY29kZXJBZGQoZW5jLCBOVUxMLCB0aW1lc3RhbXBfbXMsIE5VTEwpOworICBvayA9IG9rICYmIFdlYlBBbmltRW5jb2RlckFzc2VtYmxlKGVuYywgJndlYnBfZGF0YSk7CisgIGlmICghb2spIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGR1cmluZyBmaW5hbCBhbmltYXRpb24gYXNzZW1ibHkuXG4iKTsKKyAgfQorCisgRW5kOgorICAvLyBmcmVlIHJlc291cmNlcworICBXZWJQQW5pbUVuY29kZXJEZWxldGUoZW5jKTsKKworICBpZiAob2sgJiYgbG9vcF9jb3VudCA+IDApIHsgIC8vIFJlLW11eCB0byBhZGQgbG9vcCBjb3VudC4KKyAgICBvayA9IFNldExvb3BDb3VudChsb29wX2NvdW50LCAmd2VicF9kYXRhKTsKKyAgfQorCisgIGlmIChvaykgeworICAgIGlmIChvdXRwdXQgIT0gTlVMTCkgeworICAgICAgb2sgPSBJbWdJb1V0aWxXcml0ZUZpbGUob3V0cHV0LCB3ZWJwX2RhdGEuYnl0ZXMsIHdlYnBfZGF0YS5zaXplKTsKKyAgICAgIGlmIChvaykgZnByaW50ZihzdGRlcnIsICJvdXRwdXQgZmlsZTogJXMgICAgICIsIG91dHB1dCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiW25vIG91dHB1dCBmaWxlIHNwZWNpZmllZF0gICAiKTsKKyAgICB9CisgIH0KKworICBpZiAob2spIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlslZCBmcmFtZXMsICV1IGJ5dGVzXS5cbiIsCisgICAgICAgICAgICBwaWNfbnVtLCAodW5zaWduZWQgaW50KXdlYnBfZGF0YS5zaXplKTsKKyAgfQorICBXZWJQRGF0YUNsZWFyKCZ3ZWJwX2RhdGEpOworICBFeFV0aWxEZWxldGVDb21tYW5kTGluZUFyZ3VtZW50cygmY21kX2FyZ3MpOworICByZXR1cm4gb2sgPyAwIDogMTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL3N0b3B3YXRjaC5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvc3RvcHdhdGNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNlMzgyNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL3N0b3B3YXRjaC5oCkBAIC0wLDAgKzEsNjMgQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgSGVscGVyIGZ1bmN0aW9ucyB0byBtZWFzdXJlIGVsYXBzZWQgdGltZS4KKy8vCisvLyBBdXRob3I6IE1pa29sYWogWmFsZXdza2kgKG1pa29sYWp6QGdvb2dsZS5jb20pCisKKyNpZm5kZWYgV0VCUF9FWEFNUExFU19TVE9QV0FUQ0hfSF8KKyNkZWZpbmUgV0VCUF9FWEFNUExFU19TVE9QV0FUQ0hfSF8KKworI2luY2x1ZGUgIndlYnAvdHlwZXMuaCIKKworI2lmIGRlZmluZWQgX1dJTjMyICYmICFkZWZpbmVkIF9fR05VQ19fCisjaW5jbHVkZSA8d2luZG93cy5oPgorCit0eXBlZGVmIExBUkdFX0lOVEVHRVIgU3RvcHdhdGNoOworCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBTdG9wd2F0Y2hSZXNldChTdG9wd2F0Y2gqIHdhdGNoKSB7CisgIFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKHdhdGNoKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGRvdWJsZSBTdG9wd2F0Y2hSZWFkQW5kUmVzZXQoU3RvcHdhdGNoKiB3YXRjaCkgeworICBjb25zdCBMQVJHRV9JTlRFR0VSIG9sZF92YWx1ZSA9ICp3YXRjaDsKKyAgTEFSR0VfSU5URUdFUiBmcmVxOworICBpZiAoIVF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKHdhdGNoKSkKKyAgICByZXR1cm4gMC4wOworICBpZiAoIVF1ZXJ5UGVyZm9ybWFuY2VGcmVxdWVuY3koJmZyZXEpKQorICAgIHJldHVybiAwLjA7CisgIGlmIChmcmVxLlF1YWRQYXJ0ID09IDApCisgICAgcmV0dXJuIDAuMDsKKyAgcmV0dXJuICh3YXRjaC0+UXVhZFBhcnQgLSBvbGRfdmFsdWUuUXVhZFBhcnQpIC8gKGRvdWJsZSlmcmVxLlF1YWRQYXJ0OworfQorCisKKyNlbHNlICAgIC8qICFfV0lOMzIgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4gIC8vIG1lbWNweQorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKK3R5cGVkZWYgc3RydWN0IHRpbWV2YWwgU3RvcHdhdGNoOworCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBTdG9wd2F0Y2hSZXNldChTdG9wd2F0Y2gqIHdhdGNoKSB7CisgIGdldHRpbWVvZmRheSh3YXRjaCwgTlVMTCk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBkb3VibGUgU3RvcHdhdGNoUmVhZEFuZFJlc2V0KFN0b3B3YXRjaCogd2F0Y2gpIHsKKyAgc3RydWN0IHRpbWV2YWwgb2xkX3ZhbHVlOworICBkb3VibGUgZGVsdGFfc2VjLCBkZWx0YV91c2VjOworICBTYk1lbW9yeUNvcHkoJm9sZF92YWx1ZSwgd2F0Y2gsIHNpemVvZihvbGRfdmFsdWUpKTsKKyAgZ2V0dGltZW9mZGF5KHdhdGNoLCBOVUxMKTsKKyAgZGVsdGFfc2VjID0gKGRvdWJsZSl3YXRjaC0+dHZfc2VjIC0gb2xkX3ZhbHVlLnR2X3NlYzsKKyAgZGVsdGFfdXNlYyA9IChkb3VibGUpd2F0Y2gtPnR2X3VzZWMgLSBvbGRfdmFsdWUudHZfdXNlYzsKKyAgcmV0dXJuIGRlbHRhX3NlYyArIGRlbHRhX3VzZWMgLyAxMDAwMDAwLjA7Cit9CisKKyNlbmRpZiAgIC8qIF9XSU4zMiAqLworCisjZW5kaWYgIC8qIFdFQlBfRVhBTVBMRVNfU1RPUFdBVENIX0hfICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy90ZXN0LndlYnAgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy90ZXN0LndlYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U0YmNhMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL3Rlc3Qud2VicApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy90ZXN0X3JlZi5wcG0gYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy90ZXN0X3JlZi5wcG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc3MTlmMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL3Rlc3RfcmVmLnBwbQpAQCAtMCwwICsxLDQgQEAKK1A2CisxMjggMTI4CisyNTUKK8vh+8vh+8vh+8vh+8vh+8vh+8vh+8vh+8zh+8zh+8zh+8zh+8zh+8zh+8zh+8zh+8zh+8zh+8zh+8zh+83i/c3i/c3i/c3i/c7j/s7j/s7j/s7j/s7j/s7j/s7j/s7j/s7j+87j+87j+87j+8/k/c/k/c/k/c/k/dDj/dDj/dDj/dDj/dLk/tLk/tLk/tLk/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tLk/tLk/tLk/tLk/tPl/9Pl/9Pl/9Pl/9To/9To/9To/9To/9To/9To/9To/9To/9To/9To/9To/9To/9To/9To/9To/9To/9To/dTo/dTo/dTo/dXp/tXp/tXp/tXp/tXp/tXp/tXp/tXp/tXp/tXp/tXp/tXp/tTq+9Tq+9Tq+9Tq+9Tq+9Tq+9Tq+9Tq+9Pp+tPp+tPp+tPp+tDm+NDm+NDm+NDm+NDm+NDm+NDm+NDm+M/l98/l98/l98/l98/l98/l98/l98/l98/l98/l98/l98/l98vh+8vh+8vh+8vh+8vh+8vh+8vh+8vh+8zh+8zh+8zh+8zh+8zh+8zh+8zh+8zh+8zh+8zh+8zh+8zh+83i/c3i/c3i/c3i/c7j/s7j/s7j/s7j/s7j/s7j/s7j/s7j/s7j+87j+87j+87j+8/k/c/k/c/k/c/k/c/k/dDj/dDj/dDj/dLk/tLk/tLk/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tLk/tLk/tLk/tLk/tPl/9Pl/9Pl/9Pl/9To/9To/9To/9To/9To/9To/9To/9To/9To/9To/9To/9To/9To/9To/9To/9To/9To/dTo/dTo/dTo/dXp/tXp/tXp/tXp/tXp/tXp/tXp/tXp/tXp/tXp/tXp/tXp/tTq+9Tq+9Tq+9Tq+9Tq+9Tq+9Tq+9Tq+9Pp+tPp+tPp+tPp+tDm+NDm+NDm+NDm+NDm+NDm+NDm+NDm+M/l98/l98/l98/l98/l98/l98/l98/l98/l98/l98/l98/l98vh+8vh+8vh+8vh+8vh+8vh+8vh+8vh+8zh+8zh+8zh+8zh+8zh+8zh+8zh+8zh+8zh+8zh+8zh+8zh+83i/c3i/c3i/c3i/c7j/s7j/s7j/s7j/s7j/s7j/s7j/s7j/s7j+87j+87j+87j+8/k/c/k/c/k/c/k/c/k+8/k+8/k+8/k+9Dl/dDl/dDl/dDl/dDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tLk/tLk/tLk/tLk/tPl/9Pl/9Pl/9Pl/9To/9To/9To/9To/9To/9To/9To/9To/9To/9To/9To/9To/9To/9To/9To/9To/9To/dTo/dTo/dTo/dXp/tXp/tXp/tXp/tXp/tXp/tXp/tXp/tXp/tXp/tXp/tXp/tTq+9Tq+9Tq+9Tq+9Tq+9Tq+9Tq+9Tq+9Pp+tPp+tPp+tPp+tDm+NDm+NDm+NDm+NDm+NDm+NDm+NDm+M/l98/l98/l98/l98/l98/l98/l98/l98/l98/l98/l98/l98vh+8vh+8vh+8vh+8vh+8vh+8vh+8vh+8zh+8zh+8zh+8zh+8zh+8zh+8zh+8zh+8zh+8zh+8zh+8zh+83i/c3i/c3i/c3i/c7j/s7j/s7j/s7j/s7j/s7j/s7j/s7j/s7j+87j+87j+87j+8/k/c/k/c/k/c/k/c7l+87l+87l+87l+8/m/c/m/c/m/c/m/dDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tLk/tLk/tLk/tLk/tPl/9Pl/9Pl/9Pl/9To/9To/9To/9To/9To/9To/9To/9To/9To/9To/9To/9To/9To/9To/9To/9To/9To/dTo/dTo/dTo/dXp/tXp/tXp/tXp/tXp/tXp/tXp/tXp/tXp/tXp/tXp/tXp/tTq+9Tq+9Tq+9Tq+9Tq+9Tq+9Tq+9Tq+9Pp+tPp+tPp+tPp+tDm+NDm+NDm+NDm+NDm+NDm+NDm+NDm+M/l98/l98/l98/l98/l98/l98/l98/l98/l98/l98/l98/l98vh+8vh+8vh+8vh+8zi/czi/czi/czi/c3i/c3i/c3i/c3i/c3i/c3i/c3i/c3i/c7j/s7j/s7j/s7j/s7j/s7j/s7j/s7j/s/k/8/k/8/k/8/k/8/k/8/k/8/k/8/k/8/k/c/k/c/k/c/k/dDl/tDl/tDl/tDl/s7l+87l+c7l+c7l+c/m+s/m+s/m+s/m/dDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tPl/9Pl/9Pl/9Pl/9Tm/9Tm/9Tm/9Tm/9To/9To/9To/9To/9To/9To/9To/9To/9Xp/9Xp/9Xp/9Xp/9Xp/9Xp/9Xp/9Xp/9Xp/tXp/tXp/tXp/tXp/tXp/tXp/tXp/tXp/tXp/tXp/tXp/tbq/9bq/9bq/9bq/9Tq+9Tq+9Tq+9Tq+9Tq+9Tq+9Tq+9Tq+9Pp+tPp+tPp+tPp+tLo+dLo+dLo+dLo+dDm+NDm+NDm+NDm+NDm+NDm+NDm+NDm+NDm+NDm+NDm+NDm+M/l98/l98/l98/l98vh+8vh+8vh+8vh+8zi/czi/czi/czi/c3i/c3i/c3i/c3i/c3i/c3i/c3i/c3i/c7j/s7j/s7j/s7j/s7j/s7j/s7j/s7j/s/k/8/k/8/k/8/k/8/k/8/k/8/k/8/k/8/k/c/k/c/k/c/k/dDl/tDl/tDl/tDl/dLo+9Lo+9Lo+9Lo+9Dm+tDm+tDm+tDm+tDl/dDl/tDl/tDl/tDl/tDl/tDl/tDl/tPl/9Pl/9Pl/9Pl/9Tm/9Tm/9Tm/9Tm/9To/9To/9To/9To/9To/9To/9To/9To/9Xp/9Xp/9Xp/9Xp/9Xp/9Xp/9Xp/9Xp/9Xp/tXp/tXp/tXp/tXp/tXp/tXp/tXp/tXp/tXp/tXp/tXp/tbq/9bq/9bq/9bq/9Tq+9Tq+9Tq+9Tq+9Tq+9Tq+9Tq+9Tq+9Pp+tPp+tPp+tPp+tLo+dLo+dLo+dLo+dDm+NDm+NDm+NDm+NDm+NDm+NDm+NDm+NDm+NDm+NDm+NDm+M/l98/l98/l98/l98vh+8vh+8vh+8vh+8zi/czi/czi/czi/c3i/c3i/c3i/c3i/c3i/c3i/c3i/c3i/c7j/s7j/s7j/s7j/s7j/s7j/s7j/s7j/s/k/8/k/8/k/8/k/8/k/8/k/8/k/8/k/8/k/c/k/c/k/c/k/dDl/tDl/tDl/tDl/dDm+tLl+NLl+NLl+NLl+NLl+NLl+NDm+tDl/dDl/tDl/tDl/tDl/tDl/tDl/tDl/tPl/9Pl/9Pl/9Pl/9Tm/9Tm/9Tm/9Tm/9To/9To/9To/9To/9To/9To/9To/9To/9Xp/9Xp/9Xp/9Xp/9Xp/9Xp/9Xp/9Xp/9Xp/tXp/tXp/tXp/tXp/tXp/tXp/tXp/tXp/tXp/tXp/tXp/tbq/9bq/9bq/9bq/9Tq+9Tq+9Tq+9Tq+9Tq+9Tq+9Tq+9Tq+9Pp+tPp+tPp+tPp+tLo+dLo+dLo+dLo+dDm+NDm+NDm+NDm+NDm+NDm+NDm+NDm+NDm+NDm+NDm+NDm+M/l98/l98/l98/l98vh+8vh+8vh+8vh+8zi/czi/czi/czi/c3i/c3i/c3i/c3i/c3i/c3i/c3i/c3i/c7j/s7j/s7j/s7j/s7j/s7j/s7j/s7j/s/k/8/k/8/k/8/k/8/k/9Dj/9Dj/9Dj/8/k/c/k/c/k/dDj/dLk/tLl/dLl/dLl/c/h88/h88/h88/h8dTl9tTl9tTl9tTl+NLl+tLl/dLl/dDl/dDl/dDl/dDl/dDl/tPl/9Pl/9Pl/9Pl/9Tm/9Tm/9Tm/9To/9To/9To/9To/9To/9To/9To/9To/9To/9Xp/9Xp/9Xp/9Xp/9Xp/9Xp/9Xp/9Xp/9Xp/tXp/tXp/tXp/tXp/tXp/tXp/tXp/tXp/tXp/tXp/tXp/tbq/9bq/9bq/9bq/9Tq+9Tq+9Tq+9Tq+9Tq+9Tq+9Tq+9Tq+9Pp+tPp+tPp+tPp+tLo+dLo+dLo+dLo+dDm+NDm+NDm+NDm+NDm+NDm+NDm+NDm+NDm+NDm+NDm+NDm+M/l98/l98/l98/l983i/c3i/c3i/c3i/c7j/s7j/s7j/s7j/s7j+87j+87j+87j+8/k/c/k/c/k/c/k/dDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tLm/9Dl/tLk/tDj/c7h+tLi+9Dh+tXl/87h/dTm/9Tm/9Pj/c/f+Mna8LfG3IeWqomXqZCbrbG7zp+qu6mzxczW6Nbh8tPh8dbo+NTl9tfp+9Ll+NLl+tbq/9Dm+tLm/tPm/tPm/tPm/tPm/tTo/9To/9To/9To/dXp/tXp/tXp/tXp/tXp/tXp/tXp/tXp/tbq/9bq/9bq/9bq/9bq/9bq/9bq/9bq/9Xr/9Xr/dXr/dXr/dXr/dXr/dXr/dXr/dXr/dXr/dXr/dXr/dXr/dXr/dXr/dXr/dfr/tfr/tfr/tfr/tbq/dbq/dbq/dbq/dXp+9Xp+9Xp+9Xp+9To+tTo+tTo+tTo+tPm+dPm+dPm+dPm+dLl+NLl+NLl+NLl+NDm+NDm+NDm+NDm+M/l98/l98/l98/l983i/c3i/c3i/c3i/c7j/s7j/s7j/s7j/s7j+87j+87j+87j+8/k/c/k/c/k/c/k/dDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tLk/tLk/tPj/dfo/9Xj/tLf+tXk/8zb+MjZ8p2rxW17lWRxiGh0jGx2jHN7j4WLnXl/kYeNn5GXqKSqurC2xr3G1c7c6tPk89Xm99Tl9tbo+tPm+dDk+dTq/tPm+9Pm+9Pm+9Pm+9To/dTo/dTo/dTo/dXp/tXp/tXp/tXp/tXp/tXp/tXp/tXp/tbq/9bq/9bq/9bq/9bq/9bq/9bq/9bq/9Xr/dXr/dXr/dXr/dXr/dXr/dXr/dXr/dXr/dXr/dXr/dXr/dXr/dXr/dXr/dXr/dfr/tfr/tfr/tfr/tbq/dbq/dbq/dbq/dXp+9Xp+9Xp+9Xp+9To+tTo+tTo+tTo+tPm+dPm+dPm+dPm+dLl+NLl+NLl+NLl+NDm+NDm+NDm+NDm+M/l98/l98/l98/l983i/c3i/c3i/c3i/c7j/s7j/s7j/s7j/s7j+87j+87j+87j+8/k/c/k/c/k/c/k/dDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/szh+c7j+9Pl/9Xo/9Li+9Pj/dTi/dnm/9Ph+6m30mx6lVxqhG16lGhxjG13j4KLoYaJno2QpX+CloeLnn+ClLCzxbi9y5Wbqb/L2dPj8tbm9tfm+NTl9tbo+tXp+9Dk99Pm+9Pm+9Pm+9Pm+9To/dTo/dTo/dTo/dXp/tXp/tXp/tXp/tXp/tXp/tXp/tXp/tbq/9bq/9bq/9bq/9bq/9bq/9bq/9bq/9Xr/dXr/dXr/dXr/dXr/dXr/dXr/dXr/dXr/dXr/dXr/dXr/dXr/dXr/dXr/dXr/dfr/tfr/tfr/tfr/tbq/dbq/dbq/dbq/dXp+9Xp+9Xp+9Xp+9To+tTo+tTo+tTo+tPm+dPm+dPm+dPm+dLl+NLl+NLl+NLl+NDm+NDm+NDm+NDm+M/l98/l98/l98/l983i/c3i/c3i/c3i/c7j/s7j/s7j/s7j/s7j+87j+87j+87j+8/k/c/k/c/k/c/k/dDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tPo/9Lm/9Dj/c/i+9Pj/dXl/7G/2oGPqnKAm1dkflxpgn6LpJiivWpxjYeOqnp/mISFnZucsoKEmoWGm4KFlpeaqbK0wa+zv5afrLG9y8bU5NTi8tno+dTj9Nbo+tXm+dPm+9Pm+9Pm+9Pm+9To/dTo/dTo/dTo/dXp/tXp/tXp/tXp/tXp/tXp/tXp/tXp/tbq/9bq/9bq/9bq/9bq/9bq/9bq/9bq/9Xr/dXr/dXr/dXr/dXr/dXr/dXr/dXr/dXr/dXr/dXr/dXr/dXr/dXr/dXr/dXr/dfr/tfr/tfr/tfr/tbq/dbq/dbq/dbq/dXp+9Xp+9Xp+9Xp+9To+tTo+tTo+tTo+tPm+dPm+dPm+dPm+dLl+NLl+NLl+NLl+NDm+NDm+NDm+NDm+M/l98/l98/l98/l987j/s7j/s7j/s7j/s/k/8/k/8/k/8/k/8/k/c/k/c/k/c/k/dDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tPo/8ne99rs/9Tm/8jZ8nmJo01bdlhmgVZjfVtkf2VviWlwjIeOqmZqh4yPrHh6l319mH57lXFvhpGQpZeWqYmImJeXpJ6hrcbM2r3G1Ziisa+5y9bh8tfl99ro+dfm+tbm/dTo/dTo/dTo/dTo/dTo/dTo/dTo/dbq/9bq/9bq/9bq/9bq/9bq/9bq/9bq/9bq/9bq/9bq/9bq/9bq/9bq/9bq/9bq/9bs/tbs/tbs/tbs/tbs/tbs/tbs/tbs/tbs/tbs/tbs/tbs/tft/9ft/9ft/9ft/9fr/tfr/tfr/tfr/tfr/tfr/tfr/tfr/tfr/tbq/dXp+9To+tXp+9Xp+9Xp+9Xp+9Pm+dPm+dPm+dPm+dPm+dPm+dPm+dPm+dDm+NDm+NDm+NDm+NDm+NDm+NDm+NDm+M7j/s7j/s7j/s7j/s/k/8/k/8/k/8/k/8/k/c/k/c/k/c/k/dDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tLm/9Lk/sXX8WZ3kE1dd0xadE1ac09YcV9mgGpxjX6BnnJ2k3Jzk4iJqYWFpHNzkXZzj399lp6dspuarICAjZqapaSosre7x4uQnpGXqIiRoa22yNPd79rk99vp+tbo+tTo/dTo/dTo/dTo/dTo/dTo/dTo/dbq/9bq/9bq/9bq/9bq/9bq/9bq/9bq/9bq/9bq/9bq/9bq/9bq/9bq/9bq/9bq/9bs/tbs/tbs/tbs/tbs/tbs/tbs/tbs/tbs/tbs/tbs/tbs/tft/9ft/9ft/9ft/9fr/tfr/tfr/tfr/tfr/tfr/tfr/tfr/tfr/tbq/dXp+9To+tXp+9Xp+9Xp+9Xp+9Pm+dPm+dPm+dPm+dPm+dPm+dPm+dPm+dDm+NDm+NDm+NDm+NDm+NDm+NDm+NDm+M7j/s7j/s7j/s7j/s/k/8/k/8/k/8/k/8/k/c/k/c/k/c/k/dDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tLm/8/k/b3P6VhrhUlac0xcdlBeeU5bdGJpgnN4kY6TrICCn36AnYKCoqmoy4GBoX19m3FxjX5/l5ydspyerYKFkbG0v6Sosn+Ej6isunuAjomPn5ier7O7ztff8tfl99bo+tTo/dTo/dTo/dTo/dTo/dTo/dTo/dbq/9bq/9bq/9bq/9bq/9bq/9bq/9bq/9bq/9bq/9bq/9bq/9bq/9bq/9bq/9bq/9bs/tbs/tbs/tbs/tbs/tbs/tbs/tbs/tbs/tbs/tbs/tbs/tft/9ft/9ft/9ft/9fr/tfr/tfr/tfr/tfr/tfr/tfr/tfr/tfr/tbq/dXp+9To+tXp+9Xp+9Xp+9Xp+9Pm+dPm+dPm+dPm+dPm+dPm+dPm+dPm+dDm+NDm+NDm+NDm+NDm+NDm+NDm+NDm+M7j/s7j/s7j/s7j/s/k/8/k/8/k/8/k/8/k/c/k/c/k/c/k/dDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/dDl/dDl/tDl/s3f+Vtth0dXcUxadElXckZRbW94k5uftKGkuJGVqnl6kHNzj6Skwr252bKwzImLo2xthHp7kHZ4iZyeq6uvuczP2o+Tm4yPmpueqZibqH+EkZCVo6qwwNTa6tfi89fm+tTo/dTo/dTo/dTo/dTo/dTo/dTo/dbq/9bq/9bq/9bq/9bq/9bq/9bq/9bq/9bq/9bq/9bq/9bq/9bq/9bq/9bq/9bq/9bs/tbs/tbs/tbs/tbs/tbs/tbs/tbs/tbs/tbs/tbs/tbs/tft/9ft/9ft/9ft/9fr/tfr/tfr/tfr/tfr/tfr/tfr/tfr/tfr/tbq/dXp+9To+tXp+9Xp+9Xp+9Xp+9Pm+dPm+dPm+dPm+dPm+dPm+dPm+dPm+dDm+NDm+NDm+NDm+NDm+NDm+NDm+NDm+NDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/s/l/8/l/8/m/s/m/s7j+s/l+dbq/9Ll/brN5mt+mkpYdkxXdkxUcUZOa1FYdGxxiMbI2qOlsuHk77e3xIWElqOit87N4t3c7+zr+7i4xaOisnl5hpeXo7Kyu7q6xoiIkZWWnJ2epK2tt5WYo4KFkaGlsayxv9Xe7dbl99fp+9To+tPm+dTq/tTq/tTp/9Xp/tbq/9nq/dnq/dnq/dnq/dnq/dnq/dnq/dbq/dbq/dbq/dbq/dfr/tfr/tfr/tfr/tft/9ft/dft/dft/dft/dft/dft/dft/dft/dft/dft/dft/dft/dft/dft/dft/dnt/dnt/dnt/dnt/dfs+9fs+9fs+9fs+9ft/dbs+9Xr+tTq+dTq+dTq+dTq+dTq+dPp+NPp+NPp+NPp+NLo99Lo99Lo99Lo99Dm9tDm9tDm9tDm9tDm9tDm9tDm9tDm9tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/s/l/8/l/8/m/tDl/dXq/9Dk+c/j+KzA1VZpgklYdk5ceUhQcExTcEhPbGVpho2PqJOVorKyu9rb4dLS24KBkZSTo7q5yczM2bCwu5eXo4yMmHl5hre3wKOjrJ6eqn9/i5uaoa+ttKqqs7u7xaqtuJyfqpqeqqOpt8za6tLj89rr+9rt/9Xp+9Tq/tTp/9Xp/tnq/dnq/dnq/dnq/dnq/dnq/dnq/dnq/dbq/dbq/dbq/dbq/dfr/tfr/tfr/tfr/tft/dft/dft/dft/dft/dft/dft/dft/dfv+9fv+9fv+9fv+9fv+9fv+9fv+9fv+9nt+9nt+9nt+9nt+9fs+tfs+tfs+tfs+tfv+9bt+tXs+dTr+NTr+NTr+NTr+NTr+NPq99Pq99Pq99Pq99Lp9tLp9tLp9tLp9tDo9NDo9NDo9NDo9NDo9NDo9NDo9NDo9NDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/s/m/s/m/tDl/tDl/dDk+9Dk+73N41Nje0ZWcElXdFNefU1VdExTcEhPbGxwjZOVrYiLmp2hqY6Rl4mNlWpseYWHlnd5hpCTn2lreGpseXN2hYiLmsnN14WIk3h6h4+PnKalr6mosZqao62tt7K2wJWYo6artoeOmKaywMjW5tfo99fp+dnq/dXp/tXp/tXp/tnq/dnq/dnq/dnq/dnq/dnq/dnq/dnq/dbq/dbq/dbq/dbq/dfr/tfr/tfr/tfr/tft/dft/dft/dft/dft/dft/dft/dft/dfv+9fv+9fv+9fv+9fv+9fv+9fv+9fv+9nt+9nt+9nt+9nt+9fs+tfs+tfs+tfs+tfv+9bt+tXs+dTr+NTr+NTr+NTr+NTr+NPq99Pq99Pq99Pq99Lp9tLp9tLp9tLp9tDo9NDo9NDo9NDo9NDo9NDo9NDo9NDo9NDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/s/m/tDl/dDl/dLl/dLl/aOzzFRkfUlXcUlXclFde1Bcek9Xd0xUcUZNamNmhHp/lmlsfnh7hnl9hXp+iF1fb36Aj6WotGttemlreGVod15hcnR3iI6QnX6AjYeJmHN2hWlpdKOiq8LCzJWVnomNl32Ai5GWoYaLlZeeqczV4tbi8N3r+9zr/dfp+9Xp+9Xp/tnq/dnq/dnq/dnq/dnq/dnq/dnq/dnq/dbq/dbq/dbq/dbq/dfr/tfr/tfr/tfr/tft/dft/dft/dft/dft/dft/dft/dft/dfv+9fv+9fv+9fv+9fv+9fv+9fv+9fv+9nt+9nt+9nt+9nt+9fs+tfs+tfs+tfs+tfv+9bt+tXs+dTr+NTr+NTr+NTr+NTr+NPq99Pq99Pq99Pq99Lp9tLp9tLp9tLp9tDo9NDo9NDo9NDo9NDo9NDo9NDo9NDo9NDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tPo/87j+tXp/8jc83GBmklackpYcklXck9beUpWdFBYeFRce0ZOa1ZdenZ9mG9zjVhccHF2hGZrd4KHk2Zqe4iMnYGGkXN4hIaLmHl9jmhrf2VpfVhda3R5h4eLnGNld2Jib4aEkLCwu729yLG0vcfL07e9xKGmrbe7xra6xcDH0tfj79nm99no+dbo+tns/9bq/dbq/dbq/dbq/dfr/tfr/tfr/tfr/tfr/tfr/tfr/tfr/tns/9ns/9ns/9ns/9ft/dft/dft/dft/dft/dft/dft/dft/dfv+9fv+9fv+9fv+9fv+9fv+9fv+9fv+9nt+9nt+9nt+9nt+9fs+tfs+tfs+tfs+tXs+dXs+dXs+dXs+dTr+NTr+NTr+NTr+NTr+NTr+NTr+NTr+NPq99Pq99Pq99Pq99Lp9tLp9tLp9tLp9tDo9NDo9NDo9NDo9NDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/c7k+NPm+8TX715vh0hYcU1bdkRRbFBceE5aeElVc0xUc01VdEhQbV1lgmtyjlNac1NXb1dbcGZqe3F0hnR4jGptgV1hclpebG1xgl5idltec2RofWZqe2RoeWlsgGVoeX5+i5iWo6KiramptKKlrbu/x6qwt7G3vsHFy8zP17a6xcHI09rl89ro+Nvs/dbq/dbq/dbq/dbq/dbq/dfr/tfr/tfr/tfr/tfr/tfr/tfr/tfr/tns/9ns/9ns/9ns/9ft/dft/dft/dft/dft/dft/dft/dft/dfv+9fv+9fv+9fv+9fv+9fv+9fv+9fv+9nt+9nt+9nt+9nt+9fs+tfs+tfs+tfs+tXs+dXs+dXs+dXs+dTr+NTr+NTr+NTr+NTr+NTr+NTr+NTr+NPq99Pq99Pq99Pq99Lp9tLp9tLp9tLp9tDo9NDo9NDo9NDo9NDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/dXp/rLG21RkekVVbU1bdEFPaldjgU1Yd0pTclNbeklRcUpTcltjgF5mhE5XckxTb1BUcUlOaFdcc2ltglhddGFlfVZcb1hecVVbbV1id1dcc11ieWtxhGZsf1ZbcFRXa3FwgJWToaqqtpiYpIiMlIyPl4WLj7K2u7e4u8zLz9rd5b3BzLnCz9Ti8tvq+9Xp+9bq/dXr/dXr/dXr/dbs/tbs/tbs/tbs/tfr/tfr/tfr/tfr/tns/9ns/9ns/9ns/9ft/dft/dft/dft/dft/dft/dft/dft/dfv+9fv+9fv+9fv+9fv+9fv+9fv+9fv+9nt+9nt+9nt+9nt+9fs+tfs+tfs+tfs+tXs+dXs+dXs+dXs+dTr+NTr+NTr+NTr+NTr+NTr+NTr+NTr+NPq99Pq99Pq99Pq99Lp9tLp9tLp9tLp9tDo9NDo9NDo9NDo9NDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tDl/tLl/bPE2k5edElacElXcUhWcVFfekpYdkxXdk5aeEVQb0xXdlFaeVZee1dffVVceU9Wc1FVc1RXdHuAmlxhelNXcVBVb1BVbE9UaVZbcG1yh1RYck9UbW1yh3h9kV9ke1hccXp9jJycqI+Pm5aWonp+iIaJlHt/iXd3gIyLkcbFzMzM1aWqtLC3wcXQ3tfl9tvr+tnq+tbq/dbq/dXr/dbs/tbs/tbs/tbs/tfr/tfr/tfr/tfr/tns/9ns/9ns/9ns/9ft/dft/dft/dft/dft/dft/dft/dft/dfv+9fv+9fv+9fv+9fv+9fv+9fv+9fv+9nt+9nt+9nt+9nt+9fs+tfs+tfs+tfs+tXs+dXs+dXs+dXs+dTr+NTr+NTr+NTr+NTr+NTr+NTr+NTr+NPq99Pq99Pq99Pq99Lp9tLp9tLp9tLp9tDo9NDo9NDo9NDo9NLm/tLm/tLm/tLm/tPo/9Po/9Po/9Po/9Lk/tTm/9Xo/9Dj/dDj/dXo/9Xo/6i40lpogU5bdE5bdE9deFFfek1bdkxadExcdkpad0JRb1Bee1Fde1dff1ddfldbe1VYd1FVc1xffWhshlRYckxPbUlNa0RHZERIX0VJXoKHnGxxi1RYcn6Cmn+Em1RXdGFlf3F2hKaqtIeLlX6AjXFwgIeGlo2MnIKAkImHlKGfqcXF0LO3waGlsKSps8XM1dni7Nzq+t7t/9rr+9br+tbs+9ft/dfw/tnx/9ft/dnt/dnt/dnt/dnt/dnt/dnt/dnt/dft/dfv+9fv+9fv+9nw/dnw/dnw/dnw/dnw/dnw/dnw/dnw/dnw/dnw/dnw/dnw/dnw+tnw+tnw+tnw+tfv+dfv+dfv+dfv+dbt+tbt+tbt+tbt+tXs+dXs+dXs+dXs+dXs+dTr+NTr+NTr+NPq99Pq99Lp9tLp9tPq99Lp9tLp9tLp9tLp9tDo9NDo9NDo9NLm/tLm/tLm/tLm/tPo/9Po/9Po/9Po/9Lk/tbp/9Lk/tPl/9Dj/dDj/X2PqU9feU5adk5Wc0xXc1FdeUxXc05cd05cd0hYcklac0hXdFNhflNefVthgWJlhmhpi1dYeFdbeVZad1peeFRXdFBUck9TcU5Rb0JHYUlOY3uAlV5jfVtfeZabsoCFnFhceVFWcGpvfYiNl6Kksa2wv3d2homIm4mGmpqWqomHlXJwfZeXo7+/y4SHj6KlrbvBxsnQ2t3p99nm+Nzr/d3v/9rv/tnv/tbv/dXt+9ft/dnt/dnt/dnt/dnt/dnt/dnt/dnt/dfv+9fv+9fv+9fv+9nw/dnw/dnw/dnw/dnw/dnw/dnw/dnw/dnw/dnw/dnw/dnw/dnw+tnw+tnw+tnw+tfv+dfv+dfv+dfv+dbt+tbt+tbt+tbt+tXs+dXs+dXs+dXs+dXs+dXs+dXs+dTr+NPq99Pq99Pq99Pq99Pq99Pq99Lp9tLp9tLp9tLp9tDo9NDo9NLm/tLm/tLm/tLm/tPo/9Po/9Po/9Po/9Tm/9Pj/dbm/9Xl/9vr/3eHoU1dd0RRbExXc0xUcVNbeFZee09bd1NeekxXc0JQa0xadE9deFVhfVpif2xzkF9jgW9wj3+Bnl5if1VYdlxheldcdkdKaUhMak1QbUZKYklPYlhecVpednl+lZ+luHd7kFVacVtfdHR5h3R5hYeJlo2PnoWElImImKOhsayquru7yHZ2gn9/i5+fq6aqsqmstKSosLm+yNvm9Nvp+dvr+tnq+dvw/tnw/dbv+9Xt+tft/dnt/dnt/dnt/dnt/dnt/dnt/dnt/dfv+9fv+9fv+9fv+9nw/dnw/dnw/dnw/dnw/dnw/dnw/dnw/dnw/dnw/dnw/dnw/dnw+tnw+tnw+tnw+tfv+dfv+dfv+dfv+dbt+tbt+tbt+tbt+tXs+dXs+dXs+dXs+dXs+dXs+dXs+dXs+dTr+NPq99Pq99Pq99Pq99Pq99Pq99Lp9tLp9tLp9tLp9tDo9NLm/tLm/tLm/tLm/tPo/9Po/9Po/9To/9bm/9Tk/tPj/dfo/36OqEhYckhYcklXcklVcU1VclFad05Wc1Fad1BYdk5Wc0pWclNfeU9cdlVeeV5lgVZad15if3N2k4aIpXl9mlVac11ieVhdd1BUcVBUcU1Ra05TalBWaUxRZFNXb36Cl56kt2pwgl1id1tfdHJ2h1VaaFpca2ttfYGAkJqaprGvvcC+zKmptmZmc3h4hYmJlYyPmpaaopicpJ6jrcbP3t3r+9zq+tvr+tnt+9bt+tnw/drx/tnt/dnt/dnt/dnt/dnt/dnt/dnt/dnt/dfv+9fv+9fv+9fv+9nw/dnw/dnw/dnw/dnw/dnw/dnw/dnw/dnw/dnw/dnw/dnw/dnw+tnw+tnw+tnw+tfv+dfv+dfv+dfv+dbt+tbt+tbt+tbt+tXs+dXs+dXs+dXs+dXs+dXs+dXs+dXs+dTr+NTr+NTr+NPq99Pq99Pq99Pq99Pq99Lp9tLp9tLp9tLp9tLm/tLm/tLm/tLm/tLm/tLm/tLm/tPm/trq/8/d+M7c92h2kEhWcUhWcUhWcUdVcEhUcE9XdFVdekxUcUxUcU9Wc0xTcFNcd09YcVZdd1Vcdl1ie3B0jmpviGttiHp9l2twiVhdd0xQaE5TalRXdE9TcFdcdkxQaE1RZlBValZbcmFlfVVbbVVbbWtwhVhdcl5idl5idmVoeWJkc2Vlcp+fq6mms6KfrIuJmmttfWZpeHR3hH9/jI2NmI2NmKKksZ+ls87a6Nzq+Nnp9t7x/dnt+dnw+tXs+drv/trv/trv/trv/trv/trv/trv/trv/tnw/dnw/dnw/dnw/dnw/dnw/dnw/dnw/drx/trx/trx/trx/trx/trx/trx/trx/trx+9rx+9rx+9rx+9nw+tnw+tnw+tnw+tfv+9fv+9fv+9fv+9bt+tbt+tbt+tbt+tbt+tbt+tbt+tbt+tbt+tXs+dTr+NTr+NTr+NTr+NTr+NTr+NPq99Lp9tLp9tLp9tLm/tLm/tLm/tLm/tLm/tLm/tLm/tPm/tXl/87c92RyjUZUb0lXckVTbUZUb01YdFNeelVdekhQbUxTcEpRb1VceVxjgHN3lFtfd1xheF5jemRpgGNof2Nof2Rmf19ielNXb05TalhdclxheFxhek9UbVBVbGFlfVFWbUhNZExQaklOaE1RZmRqfXl+k2Vqf1Zab2ptgoCBlouNnIGBjoeHk6imsJ6eqHl7i4WHmICCkXp9jH17jI+PnJGRnqiqt5WbqcDJ2dnk8tnm9Nrq99zv+tnt+dvy/drv/drv/trv/trv/trv/trv/trv/trv/tnw/dnw/dnw/dnw/dnw/dnw/dnw/dnw/drx/trx/trx/trx/trx/trx/trx/trx/trx+9rx+9rx+9rx+9nw+tnw+tnw+tnw+tfv+9fv+9fv+9fv+9bt+tbt+tbt+tbt+tbt+tbt+tbt+tbt+tbt+tbt+tbt+tXs+dTr+NTr+NTr+NTr+NTr+NPq99Lp9tLp9tLm/tLm/tLm/tLm/tLm/tLm/tLm/tPm/tXj/neCnkhUcE1YdE9bd0xXc05adlRfe1BceExUcUlRb0xTcE9TcVxffmlsi4GEoW1wiFNWa2RofYWInVdbcFtec1Vab05TaFZbcl9ofl5mend/k3F4kVBXcVBYb2NrgURKZEdOak5VcUZNaVhhd3R9kICInFZbclNVbXR3j5CRppSWqJ2dqpubpLGwt4mLkHh6h3+ClISGl4uNnn17jJSTo5yaqLS0wZGWpKawvcvW4tzr9t3t+N3w+dft9trv+trv/drv/trv/trv/trv/trv/trv/trv/tnw/dnw/dnw/dnw/dnw/dnw/dnw/dnw/drx/trx/trx/trx/trx/trx/trx/trx/trx+9rx+9rx+9rx+9nw+tnw+tnw+tnw+tfv+9fv+9fv+9fv+9bt+tbt+tbt+tbt+tbt+tbt+tbt+tbt+tbt+tbt+tbt+tbt+tTr+NTr+NTr+NTr+NTr+NTr+NPq99Lp9tLm/9Lm/tLm/tLm/tLm/tPm/tPm/tXl/n2LpURPa0lVcU1YdEpWck1YdFBceFNeekxXdkhQcEdOa0VMaU5Rb2RohYyQqqapxJues1tecnt/k2lsgVNWa1FVak1RZkdMYUpTZl9oe2x0iFdfdlRbdF5lf0pTaUdOaE5VcUxTb0ZNakZNaUlQanJ6kFZedExQaE9RbHh6k5iasISFmoeGlo2NmLi3vpWUnYKCj4SGl4SGl3h3iXRzhJCPn5ubqLS0wautupecqKmwus3Z4tvq8trq9N/y+9zy+trv/drv/trv/trv/trv/trv/trv/trv/dnw/dnw/dnw/dnw/dnw/dnw/dnw/dnw/drx/trx/trx/trx/trx/trx/trx/trx+9rx+9rx+9rx+9rx+9nw+tnw+tnw+tnw+tfv+dfv+9fv+9fv+9bt+tbt+tbt+tbt+tbt+tbt+tbt+tbt+tbt+tbt+tbt+tbt+tTr+NTr+NTr+NTr+NTr+NTr+NTr+NPq99Po/9Dl/tPl/9Pl/9Ll/dPj+9Tk+m17lUxXc0pTcEpTcE5Wc1RceVpif1hhfk5WdkdPcUZMb0dNbUlQbFFYcmJqfpqitLS6zYiNomZrgGltglxheE5TakpPZlFWbUxQZVZbcF5jeGNof0ZJZk1UcUhPbEZPak5VcVphfUZJZlFVck1QbVRXdGVqhE1Ra01Ra1dadH1/mnh6k1tccmJhc2ZldpiWpI+Nm42LmI6MnJ+csF1cb2FfcouJmp+frMTE0Lu7x6SkraGkr6att8vX3t3s9N3w993w+dzv+tzt/dzt/dzt/dzx/9zx/9vy/9vy/dvy/dvy/dvy/dvy/dvy/dvy/dvy/dvy/dzz/tzz/tzz/tzz/tzz/tzz/tzz/tzz+9vy+tvy+trx+drx+drx+drx+drx+drx+dnw+Nnw+tnw+tnw+tfv+dfv+dfv+dfv+dfv+dfv+dfv+dfv+dbt+Nbt+Nbt+Nbt+NXs99Xs99Xs99Xs99Tr9tTr9tTr9tPq9NDj/dbp/9Pm/tTk/dTk/dfl/3B+l1Rhek5Wc0xUc0xUc05WdlZeflZefk5WdkVNbEdNcE5Ud0xTcEZNaVtjeXB4jJ2mtqu0xF5jeF9ke1xheFdcc1RYcE5Tak5TalxhdmlvgVpec2RpgkZJZkdOa0lPcEdPbFNadmZrhV5jfX2Bm1tfeVBUcWVphk9UbU5TbGJkf42Pql1feF1edHt6j3p5jJyaqo6MnJWQn5eTpJ6br11abVtabGtqfZudrLOzv7q5wr69xKystqittLG7xNDd5N/x+Nrq9N3t+t3t+tzv+tzv+tzx/dzx/dvy/dvy/dvy/dvy/dvy/dvy/dvy/dvy/dvy/dvy/dzz+9zz+9zz+9zz+9zz+9zz+9zz+9zz+9zz+9zz+9vy+tvy+trx+drx+drx+drx+dnw+Nnw+Nnw+Nnw+Nfv99fv99fv99fv99fv99fv99fv99fv99bt9tbt9tbt9tbt9tXs9NXs9NXs9NXs9NTr89Tr89Tr89Pq8tfp+9Lj9tXl+9fm/dbk/oSQqklWcFdffVBYeE1Vd01Vd1BYelVdf05WeEdPcURMbU5Ud0lPcEJJZkpRbUxUam12ia+3yXB4i1dcc2Nof1pedk1RaVNXb09Ua1BVamFlelxidGlvgWFlfUFFYkxTcExTcEdPbEpRa1dcc3N3jKOlvnR3j1hbdmlrhkpNalFUb3ByjX+Bmk1PaFxdc3l4i4mImKOhsY2LmJ2YqI2ImnNwhHJvgmFfcl5dcImMm6+vurOyu7e2vcDAyZ2jqq+2v7/M09vq8tzs993t+t3t+tzv+tzv+tzx/dzx/dvy/dvy/dvy/dvy/dvy/dvy/dvy/dvy/dvy/dvy/dzz+9zz+9zz+9zz+9zz+9zz+9zz+9zz+9zz+9zz+9zz+9zz+9rx+drx+drx+drx+dnw+Nnw+Nnw+Nnw+Nfv99fv99fv99fv99fv99fv99fv99fv99bt9tbt9tbt9tbt9tXs9NXs9NXs9NXs9NTr89Tr89Tr89Pq8tXl9Nfo99bl99fk+YyYsFBadFNcd0xUcVFaeU5WeE5WeFFae09XeUhQckZOcElRcVFXeFdee0xTb01UbUhPaVNbcXqClltjd1hdd1ZbdEhNZkBFXElOZWJmflBVanJ4i2lvf2RqelBVakhNZk9WckhPbE1VckZNaUhNZFhccWptgmVpfn+BmoCCm1BTa2lrhHd5kWxvh1RXbF9hdnt6jY6NnaKfrZCOnKGcq5OOn4+Mn5CNoXJxhFpYa21wf6GhrJaVnrq5wMvL1Juepp6lr6y3v8vW39vq9N3t+t3t+tzv+tzv+tzx/dzx/dvy/dvy/dvy/dvy/dvy/dvy/dvy/dvy/dvy/dvy/dzz+9zz+9zz+9zz+9zz+9zz+9zz+9zz+9zz+9zz+9zz+9zz+9rx+drx+drx+drx+dnw+Nnw+Nnw+Nnw+Nfv99fv99fv99fv99fv99fv99fv99fv99bt9tbt9tbt9tbt9tXs9NXs9NXs9NXs9NTr89Tr89Tr89Pq8pWkr6++yL3L2XqFllNcclZdd1FYdFZdelNbelRce1BYeExUc0ZObUlRcU9Xd1Rce1deelFYdEpRa0VMZUVMZU5Vb1Vdc0dOaEdMZVBUcU5TbFVacU1RaXB0iVtfdHqAkGpxe32Ejlheb0hNZFRbd09Wc05WdlNad1VXckhJX1RVa3JziH+AlXd4jWhpfnN0iVVYbU1QZVVYbXN0iY2MnJWVoq2ruZWTn6Sfr6qlt6ikuKKesqGfsnFwgm1wf5ubpqGfqayrsrS0vrO3v5+kr6uyu6qxu9nk8OHv/dzs+eHz/+Hz/9zx/dzx/dvy/dvy/dzz/tzz/tzz/tzz/tzz/tzz/tzz/tzz/t30/d30/d30/d30/d30/d30/d30/d30/dzz+9zz+9zz+9zz+9vy+tvy+tvy+tvy+trx+drx+drx+drx+dnw+Nnw+Nnw+Nnw+Nfv99fv99fv99fv99bt9tbt9tbt9tbt9tbt9tbt9tbt9tbt9tXs9NXs9NXs9NTr82Vxeml0fk5aZU9YaFBYbFhddFhdd1tee1FYdlNbeFNbeFBYdk5Wc1Fad1RceVRceU1UbU1UbUJJY0FIYk1UbUVMZUJJY0BHY0lNak9TcE9UbWpviHJ3jmhsgWRqfU1TY1BXYWFock1TY1ZbcFRbdFFYdk9XdFRbd1ZYcVZXbGlqf3FzhWFjdHFzhYyOnXZ4iVNWalRXbFdbb2hqe5GQoaams5yapp2bqLaxwKOesI6LnoyInJCPopqYq5CToo+Pm5qYoo2Mk7m5wsXFzqaqtK+zvqart7a/zOHv/d7v++Hz/+Hz/9zx/dzx/dvy/dvy/dzz/tzz/tzz/tzz/tzz/tzz/tzz/tzz/t30/d30/d30/d30/d30/d30/d30/d30/dzz+9zz+9zz+9zz+9vy+tvy+tvy+tvy+trx+drx+drx+drx+dnw+Nnw+Nnw+Nnw+Nfv99fv99fv99fv99bt9tbt9tbt9tbt9tbt9tbt9tbt9tbt9tXs9NXs9NXs9NTr84CJlHmCjWJreE5UZFZcb1hccVdbcF5heVNac1VeeVVeeVFbdlNcd1VeeVNcd05XcEZOZEFJX0JKYT5FXkdOaEdOajc+WjtCXz9CYT9CX0JHYVhdd0lOZWNofYmPokdNXURJV09VZWFmeV9keUpTaU1UbVdhd2RsgFtdb2ZldnNygmhmd2Zldm1sfZqYq56hsnF0iF9jeGFkeFtdb4B/j6ams52bqJyapq2puJaRo315jXp3i3t6jYaFl5WXppCQnI6NloyLkampssDAybK2wLi7xrS3xJyisMHP3dzs+eHz/97x/dzx/dzx/dvy/dvy/dzz/tzz/tzz/tzz/tzz/tzz/tzz/tzz/t30/d30/d30/d30/d30/d30/d30/d30/dzz+9zz+9zz+9zz+9vy+tvy+tvy+tvy+trx+drx+drx+drx+dnw+Nnw+Nnw+Nnw+Nfv99fv99fv99fv99bt9tbt9tbt9tbt9tbt9tbt9tbt9tbt9tXs9NXs9NXs9NTr84WMlnR7hnB0gGxxf2hsemVoeVRWaF9hdlpec1hhdFVdc1BYb1FYclRbdE5Vb0VMZUFIYkRIX0FGX0BHYUVMaD1EYT1EYUBHZD5BXz5BXkpOa0hNZkFGXVBVak9UaU9VaFhecXN5jGVqf09UaVNbcUZOZExWaVRccFhccFpcbV5hcmloemRjdmppeYuJmqOitHJziHl9kH6Bk3h6iXd5hoSEkJeXo4mHlH57iYeFk4mHl42JnYaFl4uJmpSWo4yMl5qYori3vru7xb6+x7+/y729yLa2waqvuo+bptPj8OHx/tzv+t7x/dzx/dzx/dvy/dzz/tzz/tzz/tzz/tzz/tzz/tzz/tzz/t30/d30/d30/d30/d30/d30/d30/d30/dzz+9zz+9zz+9zz+9vy+tvy+tvy+tvy+trx+drx+drx+drx+dnw+Nnw+Nnw+Nnw+Nfv99fv99fv99fv99bt9tbt9tbt9tbt9tbt9tbt9tbt9tbt9tXs9NXs9NXs9NTr84+TnZWYo4iMlouOmMbJ1LGxvZqapZubqHN2gmhqeXBzhVZabVVacVBVb0xPbEZJaEZJaEdIaEVGZUFFY0BEYkBEZD5EZD5FYj5FYj9GYkhPa0ZNaUFIYkFIYkJJY05WbFhhdFNbbV1leWRsgFVdc0xTbEpRa0xTbFRXdEhKaE9Ral1edGNkeXh6ibGxvoeGlm1wgX1+k5GUo56hrZaYpYKFkX+BjnZ2gn9/jHNzgIuLl4+OnoB/j4WFkZOTn52dqZybpK2strq5wr69xqSjrLm4wb69xrK2wJeeqZyos9/v+eHx+9vt+d/y/t3y/9rv+t7z/970/d70/d70/d70/d70/d70/d70/d72/t72/t72/t72/t72/t72/t72/t72/t32+t32+t32+t32+tz0+dz0+dz0+dz0+dvy+tvy+tvy+tvy+trx+drx+drx+drx+dnw+Nnw+Nnw+Nnw+Nfv99fv99fv99fv99Xv9tXv9tXv9tXv9tTt9NTt9NTt9NPs84+QlomLkJucoqKjqbO0utna38jJz6yts72+xLe3wKiqt1tdb2Jje2JkgU1ObUlNa0pMa0xNbElKakZHaUBEZEBEZD5EZD5FYj9GYj5FYUdOakRKZkJJZUFIZD9GYkZNZkRMYkBIXElRZWNrgVFacElQakZNZk9Wck1Qb0xPbVBTbV1feF1ec3ByhIWFkX59jX+Bk36AkXZ4h4eJlqKlsKOlsnBygXZ4h4GBjoWFkXNzgJCQnY6Om35+i42Nmp2dqpqXpJybpKSjrNPS26SjrK2strOyu7CwubG2wIKMltLd6d/v+eHx/uHz/9/0/93y/t70/d70/d70/d70/d70/d70/d70/d70/d72/t72/t72/t72/t72/t72/t72/t72/t32+t32+t32+t32+tz0+dz0+dz0+dz0+dvy+tvy+tvy+tvy+trx+drx+drx+drx+dnw+Nnw+Nnw+Nnw+Nfv99fv99fv99fv99Xv9tXv9tXv9tXv9tTt9NTt9NTt9NPs88HCxqSlqYyNkJSVmJeYnN7f487P08XGyb/AxLS2u7e3wnt6jWNkfWhohlZXeUxNb0lMaUpNakhKaEVGZUBEYkBEYj5FYj5FYj9GYj5FYUVMaEFIZEFIZEFIZD5FYUBHY0VMaD5FXkVMZV1le0pTaUdPY05WalZeclBVb05TbE9RalhccVFTaGJkdm9tgHt6jXt9kW1wgVFUY1tdaoWIk4uNmoaIl4yOnYaGk2RkcWJib3l5hoiIlYyMmI+PnJOTn52bqJuao56dprKxup6dpqalr6GfqZCQmrS5xJifqqy2wOLt+eHx+97x/dvw+93y/t70/d70/d70/d70/d70/d70/d70/d70/d72/t72/t72/t72/t72/t72/t72/t72/t32+t32+t32+t32+tz0+dz0+dz0+dz0+dvy+tvy+tvy+tvy+trx+drx+drx+drx+dnw+Nnw+Nnw+Nnw+Nfv99fv99fv99fv99Xv9tXv9tXv9tXv9tTt9NTt9NTt9NPs88nLzbS2uKaoqpGTlYuMjre4utzd39rb3bi5u7Kzt8fH0KqpuXp4j2RkgF9ff05Pb0RGYURGYUFEXj9BXkBEYUBEYj5FYj5FYkBHYz5FYURKZj9GYj1EX0BHYz5FYUBHY0ZNaUBHY0pRa1hhd1BYb0pTZlhhc1BYbEdMY1FWbVxfdFFValNUaVxecHRzhHZ0h4GCl2lrfVVXZmlreHh7hoWHlIeJmI+RoZCQnV5ea3p6h4KCj4mJloeHlJGRnpSUoZSRnqOiq6GfqbGwuYaFjqOiq6Khqp+fqbK2wK2yvYuRnNrj7ePy/eHz/d7z/+H2/970/d70/d70/d70/d70/d70/d70/d70/d72/t72/t72/t72/t72/t72/t72/t72/t32+t32+t32+t32+tz0+dz0+dz0+dz0+dvy+tvy+tvy+tvy+trx+drx+drx+drx+dnw+Nnw+Nnw+Nnw+Nfv99fv99fv99fv99Xv9tXv9tXv9tXv9tTt9NTt9NTt9NPs86mrqr7Av5GUk4iLiW1wb3p9e8vNzN/i4dbW1tLS1MHAx8C+y7KxxJaUq2Rlfk9Pa0hMYUdKX0hKY0ZIYUBFXj1AXTpBXT1EXz5FYT9GYj5FYTtCXj5FYT9GYkBHY0FIZE1UbVNac0hQZkZOZFNbcU9XbVFacExUakpPaV9ke0pOY19jd11fcWpse2xseX9/jHl7jVZYaldaaXJ0gWxweoCCj5WXpqKks5SUoXd3hH19iYuLl4aGk5SUoaGhrZOTn5uYpZSTnJuao8bFzqOiq56dpqqpsrCvuN/f6bu7x5SYo7rEzt3s9OHz/d/2/tvy+t70/d70/d70/d70/d/2/t/2/t/2/t/2/t72/t72/t72/t72/t72/t72/t72/t72/t73+973+973+973+932+t32+t32+t32+tzz+9zz+9zz+9zz+9vy+tvy+tvy+tvy+trx+drx+drx+drx+dnw+Nnw+Nnw+Nnw+Nfx+Nfx+Nfx+Nfx+Nbw99bw99bw99Xv9n5/gbGytImLjYGChWRlaJCRlK+wss7Ozri2t9PQ1Nza3tLQ17CtuqqpuXd2iFdYbU9TZE5RZU5RZUxPZEBFXD5CXDpBXT5FYT9GYj5FYTtCXj1EX0BHYz9GYj5FYT1EXT1FW0ZOZERMYk1Va1NbcVFacFRbdFVcdlZbcmVqgVRXbFhccGNld2pseXl5hY6Om3l7jVxecGxvfnl7iIuOmJSWo3Z4h36Aj5WVopGRnoKCj5OTn5WVoomJlpaWo5iYpZ+dqqGfqaalr5+eqLGwuaOiq6mosaqpsrGwubSzvaywuouRm9/r9Nvt9N70/d/3/970/d70/d70/d70/d/2/t/2/t/2/t/2/t72/t72/t72/t72/t72/t72/t72/t72/t73+973+973+973+932+t32+t32+t32+tzz+9zz+9zz+9zz+9vy+tvy+tvy+tvy+trx+drx+drx+drx+dnw+Nnw+Nnw+Nnw+Nfx+Nfx+Nfx+Nfx+Nbw99bw99bw99Xv9qGipZSVmIKEh3t9gGRlaYWGiZianZqanJuYmsXAwdvZ3NPQ1M3M0MbFzLCwuWVpc1ZbZlRYZlFVZk9TZkFGXT5CXDtCXj9GYj5FYTtCXj1EXz1EXz9GYj5FYT1EXztCXEJKYUVNYUBIXk1Va0lRaEpTaU5Vb1ZedGRpfnuBlFdbb2RoeXN2hXp9jKKir3FwgFZYanh6jHJ0hHZ4hYCEjpOVomZpeGRmdo6Om5CQnXd3hIeHlKOjsL6+y5eXpJubqJyappqYoq+tt8HAyaWkrbSzva2strCvuKajq83J1L29xp6jram2vd7w9970+t32+t70/d70/d70/d70/d/2/t/2/t/2/t/2/t72/t72/t72/t72/t72/t72/t72/t72/t73+973+973+973+932+t32+t32+t32+tzz+9zz+9zz+9zz+9vy+tvy+tvy+tvy+trx+drx+drx+drx+dnw+Nnw+Nnw+Nnw+Nfx+Nfx+Nfx+Nfx+Nbw99bw99bw99Xv9rCxtLCxtKWmqo6Pk3t9gGVmam1vcl9eY6+ssNXT1peVmKakqJCPlIyLj5WWnImJk15ibFZbZlNXZVBUZUJGWz9EWz9CXz5FYTtCXj1EXz1EXz5FYTpBXTtCXj1EXz5FYUZOZEFJXztEWkpRa0hPaUJJYztCXEFIYlZbcGFmeV1hcmhsenl7i3+BkJ6drWppeXd5i2Jkdmpse31/jGZpdn6AjW9xfnp6h5iYpI6OmpCQnIeHk35+iZOTn6uruJOTnpybpKGfqZiXoaOiq52cpaqpsp+eqLa0u6WiqtLQ18DBx6+0u6Wwttrp8N/x9+P2/d70+t70/d70/d70/d/2/t/2+9/2+9/2+972/t72/t72/t72/t72/t73+973+973+973+973+973+973+932+t32+t32+t32+tz0+dzz+9zz+9zz+9vy+tvy+tvy+tvy+trx+drx+drx+drx+dnw+Nnw+Nnw+Nnw+Nfx+Nfx+Nfx+Nfx+Nbw99bw99bw99Xv9ra0uaimq5+eo5qYnX59gXp5fouJjnRzeHFwdKuqr8TCyY2Mk1ZVXldWX2xqd3l5hWxwelRXYlNWYVVXZkdKXkdJYkBEYT5FYj9GYz5HYj1GYTtFXTtFXTtFXztFXztFXz9IYT9IYT9IYT9IY0BJZD5HYj5HYkFIZE1RaU5TaF9jdHF2hIeJln+BjnZ0hXNygnp5iWtqenZ0hX9+jnl5hpWVopOTn5aWorGwuamor56dppWUnYGAiZSRnpCOm6Geq6KhqpeWn4uJkKOiqdDP1qqpsKWkq7Cvs7GwtKqrr7O4urK2u7C2vbS7wtbh5t/v9uHz+t32+t73+973+9/4/eH5/eL4/eH3++H3/eH3/eH3/eH3/eL4/uL4/eL4/eL4/eH5/eH5/d/4+973+t73+t73+t73+t73+t32+d32+t32+t32+tz0+dz0+dz0+dz0+dvz+Nvz+Nvz+Nvz+Nry99ry99ry99ry99fx9tfx9tfx9tfx9tbw9Nbw9Nbw9NXv83JxdqWkqZuanpybn3t6f5ORloSCh3d2eoB/hqWkq7q5wpiXoWFea19damJfbWRicHNzf1xfaE5RXFxea05RZUdJYkRHZD5BXz9GYz5GYz1GYTtFXTtFXTtFXztEYTtEYT5HYj5HXz5HYj5HYj1GYT1GYT9HZEVMaFVac09UaV1hcoCFk4KFkXN2gnl4iGtqem9tfmRjc39+jomImH5+i319iZqapZOTnLCvtqyrsKimrZuaoZWUnayrtJSRnpSRnqWkrZaVnpSTmqKhqLSzuMXEyNPS1r27wKytsKqrrbq7v7u/xaSosMDGzZ6kq+Tv9+L0+973+932+tz0+eL6/t73+t/3+OP5/uH3/eH3/eH3/eH3/eL4/eL4/eL5+uL5+uH5/eH5/d/4+973+t73+t73+t73+t73+t32+d32+d32+d32+dz0+Nz0+Nz0+Nz0+Nvz+Nvz+Nvz+Nvz+Nry99ry99ry99ry99fy9Nfy9Nfy9Nfy9Nbx89bx89bx89Xw8n17gHd2enJxdnZ0eYGAhbCvs6GfpJCPlIuJkImIj4mIkZqYooSBjoyJlmFebFpXZV5ealteaVpdaF1fbFBUZUpOY0dMZUBEYj9GYz5GYz1GYTtFXztFXztFXztEYTtEYT1GYT1GXj1GYT1GYT1GYT1GYT9HZEVMaFxhek9UaWNmeICFk2pseVxea3t6i19eb1ZVZWJhcXFwgH9+jn19iXNzgI2NmI2Nlqmor6uqr6+ttJ2co6GfqcbFzqilspCOm62stpGQmp6dpKWkq6GfpMLBxuvq78zLz8bGyLGxs8XGyb6/xa+yur3AyJOYn8HM1N/x+N/2+970+t/2+9/2+uP5/uL6+973+uH3/eH3/eH3/eH3/eL4/eL4/eL5+uL5+uH5/eH5/d/4+973+t73+t73+t73+t73+t32+d32+d32+d32+dz0+Nz0+Nz0+Nz0+Nvz+Nvz+Nvz+Nvz+Nry99ry99ry99ry99fy9Nfy9Nfy9Nfy9Nbx89bx89bx89Xw8r++womIjVxbX2VkaYSCh7GwtLa0uZeWm5STmouJkISCjFtaY4WCj7+9yZOQnmNhb11daVZaZGtveV9ib05RY05RZkdMZUdKaD9GYj5GYz1GYTtFXztFXztFXztEYTtFXz1GXj1GXj1GYT1GYUBJZD5HYj5GY0FIZEdMZVhdcmNmeGRpd11fbGVodH9+jmJhcVxba3Nygnh3h3t6i4KCj3l5homJlZWVnqOiqaqprbOyuZ6dpJSTnKqpsqGeq6Sir7e2v4yLlKSjqqqpsKalqqmorMfGy8HAxb29v7+/wbq5vsbHzbm5wr7Byb7ByY2UndLh6d7x+OT3/uT6/+L4/eH3+9/4+eH5/eH3/eH3/eH3/eH3/eL4/eL4/eL5+uL5+uH5/eH5/d/4+973+t73+t73+t73+t73+t32+d32+d32+d32+dz0+Nz0+Nz0+Nz0+Nvz+Nvz+Nvz+Nvz+Nry99ry99ry99ry99fy9Nfy9Nfy9Nfy9Nbx89bx89bx89Xw8qmorLSzuGVkaX9+gqGfpJeWm62ssayrsJqYn5aVnJ6dpn59hldVYqyqt83L2Whlc2JibXBzflpdZWNmcV9kck1QZElOZUpPaUFIZD1GYT1FYjtEYTtEYTtEYTtFXztFXztFXTtFXTtFXztFXz5HYjtFX0FJZkpRbUpPaVdccVpdb2xxf19ib3p9iYB/j21sfWloeHJxgX59jXZ0hXR0gXR0gZSUn52dpqyrsqyrsKqpsJqYn5ORm56dpqWjsL26x6alr5aVno2Mk5qYn5ybn6alqr++wsbFycC+wcXCxr++wtTT2rKyu7u7xb7ByZ+kr4WQmsnZ4eT2/dzv9uH3++P5/uP7/eT9/+L4/uL4/uL4/uL4/uL4/eL4/eL5+uL5+uH5/eH5/eH5/eH5/d/4+9/4+9/4+9/4+973+t73+t73+t73+t32+d32+d32+d32+dvz99vz99vz99vz99ry9try9try9try9tfy9Nfy9Nfy9Nfy9Nbx89bx89bx89Xw8ru6v8LBxqGfpIyLj6morKOippaVmpSTl6imrZybop6dprCvuIKAjVtYZV5cari2xF1daVhcZl9ja1xfamxxfWZqe0RIXUdMY0RKZD5HYj1FYjtEYTtEYTtEYTtFXztFXztFXTtFXTtFXztFXz1GYTtFXz9HZEdOalBVb1FWa1NWaGxxf3Z4hXl7iGVkdGVkdHh3h3h3h3NygoSCk4mJlnFxfomJlaioscbFzL27wLGwt727wp+eqI+Ol5OQnXt5hoB/iJCPmKSjqpORmJCPlKalqru6v8vJzsjGycvIzMLAxcC/xru6xL+/yMLCzLC0v32GkJCcpd/v9+j5/+H0+eH3++H5+uH5/eL4/uL4/uL4/uL4/uL4/eL4/eL5+uL5+uH5/eH5/eH5/eH5/d/4+9/4+9/4+9/4+973+t73+t73+t73+t32+d32+d32+d32+dvz99vz99vz99vz99ry9try9try9try9tfy9Nfy9Nfy9Nfy9Nbx89bx89bx89Xw8tDP1K+tsqWkqaalqpeWm5uanp2coZGQlZGQl4iHjpaVnri3wMbE0F5caWJfbXFvfVNTXlpdaFteZmFkb2hseH2Bj0ZMXj1BVkZNZkBJZD1FYj1FYjtEYTtEYTtFXztFXTtFXTtFXTtFXztFXzpEXjpEXj1FYkFIZEZKZE5TaE1QYl1icIGEkI+RnoSCk4eGlnh3h4GAkHl4iIB/j42Nmn9/jHR0gI6Ol7Gwt7q5vqalrLm4v62stpaVnqWjsI+NmpiXoZqYopWUm5qYn46NkamorLu6v8vJzuLf49TO08TBxszI0M/O187N1ru7xaaqtKOqtHmCjay4wej3/+X5/t/2+t/4+d/4++L4/uL4/uL4/uL4/uL4/eL4/eL5+uL5+uH5/eH5/eH5/eH5/d/4+9/4+9/4+9/4+973+t73+t73+t73+t32+d32+d32+d32+dvz9Nvz9Nvz9Nvz9Nry89ry89ry89ry89fy9Nfy9Nfy9Nfy9Nbx89bx89bx89Xw8sjHzKqprZaVmq+tsqmorKOiprOyt62ssaOipnt6f4eGjZybpKSir2xqd1ZUYlZWY05QXVpdaGlsd2JlcGNmcWlteXJ2h0ZMXkJKYURKZD9GYj5FYj1EYTtEYTtFXztFXTtFXTtFXztFXztFXzlCXTpEXjtEYT1EX0BHYT9EW0ZJXXBzhYyOnZyeq5eXpIKBkYKBkXh3h39+joCAjYeHlISEkHZ2gYaGj7++xbKxtqqpsJaVnImIkaGfqbi3wKmosbu6xK2ss7i3vqGfppeWm62ssb69wcTCx83Lzs3Lzrm3u726v7CvtrOyu8HBy8HBy77BzKKmsoKJlMvX3uX0++j7/+L4/d/4++H5/eH5/uL4/uL4/eL4/eL4/eH5+uH5+uH5+uH5/eH5/eH5/d/4+9/4+9/4+9/4+973+t73+t73+t73+t32+d32+d32+d32+dvz9Nvz9Nvz9Nvz9Nry89ry89ry89ry89fy9Nfy9Nfy9Nfy9Nbx89bx89bx89Xw8sfHyc/P0sDAwqWlqJOTlaioqre3ua+vsZubm5ycnIGChXJzeZiYomhodE5NXU5QX1NVZGFjcmxseGZmcmxseHJ0gX1/jmZpekFFWkhKY0pOa0RHZD5BXzlAXTtCXkBHYT9GYj9GYz5FYj5FYj1EXztCXjtCXj1EXztCXEFGX0RIYkBCW0xPY21wf46QnZibqIuLl3p6h4GBjnJyfnh4hHR0gH9/i4KCjLa3vbm6wLCxt6WmrJWWnKussrO0urGyuK+ttLKxtre2urq5vp+eo6GfpL27wMfGy8HAxbKxtrSzuLq5vrOyt9DP1sbFzMTCyb69xrS0wI6RnJWcpd3q8ej3/+X4/+H3/eH7/uH7/uL6/uP6++T7/eP7/eL9/eL9/eL6++L6++L6++L6++H5+uH5+uH5+uH5+t/4+d/4+d/4+d/4+d73+N73+N73+N73+Nv29tv29tv29tv29tr09Nr09Nr09Nr09Nnx8tnx8tnx8tnx8tfw8dfw8dfw8dbv8N7e4cjIy729v7OztpWVl5OTlcDAwsfHyaurq6+vr7q7vomLjlteZlRWY1BTYlhbbFZYamJkc29ve7GxvZubpn5+iWhodGtqel5fdEhJX0hKZU1PbEZJZj9CXzlAXDtCXj5FYj5FYj5FYj5FYj5FYT1EXztCXjtCXjtCXEBHYT5BXkBFXlFVak5RY1VXZIGFj5WVoYWFkIeHk2lpdGZmcmxseICAjImJlbCwubS2u7GyuKOkqoWGjK+wtqaorbKzubm4vbKxtri3u8HAxbm4vZuanqKhpbu6v8nIzbm4vayrsLe2urSzuNnX3MTCx8jHzsC9x6WkrbKyu4eMlqWvud/r9Ob3/+T6/+H7/uH7++L6++P6++T7/eP7/eL9/eL9/eL7+eL7+eL7+eL7+eH6+OH6+OH6+OH6+N/4+d/4+d/4+d/4+d73+N73+N73+N73+Nv29tv29tv29tv29tr09Nr09Nr09Nr09Nnx8tnx8tnx8tnx8tfw8dfw8dfw8dbv8N/f4tLS1JqanJ2dn6OjpZOTla2tsLOztq+vr5+fn5eYm6+ws3p+hmpseU5QX1FUZXd5i2hqeXp6h5SUocjI1FxcaGxseXRzhHl7jVBRZkVHX0hKZUdKaEFFYj1EXz5FYT5FYj5FYj1EYT1EYT5FYT5FYT1EXztCXj1EXTlAWkBEYT9EXVBUaV5ic2Rmc3d6hV1daW1teYmJlXt7h2pqdnp6hoaGkZOTnqKiq7O0urm6wLKzuZaXnZGTmLO0uqmqsLi3u7Kxtq2ssa+tsr69wbi3u7GwtKWkqb69wcfGy7q5vpSTl727wLe2usC/xM7N1MfGz7CvuL29xpqeqXh/ibG9xun4/+T3/uL6/uH7++L6++L6++P7/eP7/eL9/eL9/eL7+eL7+eL7+eL7+eH6+OH6+OH6+OH6+N/4+d/4+d/4+d/4+d73+N73+N73+N73+Nv29tv29tv29tv29tr09Nr09Nr09Nr09Nnx8tnx8tnx8tnx8tfw8dfw8dfw8dbv8MzMztfX2rOztqqqrLCwsqysr5qanJSUlqGhoaWlpaOkpqSlqZicpIKFkVdaaVRWaHByhFxebX9+jmZmc5OTn1paZYmJlqGhraSmtnR3iEVIXUZIYUxQakdKaD9GYjtCXj1EYT1EYT1EYT1EYT1EXz5FYT5FYT1EXz5FXjpBWzs/XEBFXk5RZmNmeIWHlKOmsYyMl4CAjHd3goSEj3t7h39/i5CQnI6OmpiYorS2u7O0urO0uqSlq4GCiKSlq6GiqLSzuLOyt7GwtLe2uszLz727wL69wbm4vb++wru6v8bFyZiXnMzLz8LBxuzr8OHf5sTCzMfGz7a2v7CzvnmAi4mTnev3/+P0++P5/uH7++L6++L6++P7/eP7/eL9/eL9/eL7+eL7+eL7+eL7+eH6+OH6+OH6+OH6+N/4+d/4+d/4+d/4+d73+N73+N73+N73+Nv29tv29tv29tv29tr09Nr09Nr09Nr09Nnx8tnx8tnx8tnx8tfw8dfw8dfw8dbv8MTExszMzs/P0ri4urq6vbOztsLCxaysr5iYmJCQkJOUlpeYnJyfqIeJlkxOXUlMXXFzgmxvfmtqek5NXUZGU09PXGVlcX5+i3l7iIWHll9jdz5AWE9UbUZJZkFIZD5FYT5FYj5FYj5FYj5FYjlAXDpBXT5FYT5FYT1EXT1EXTs/XEhNZkhMYVxfcYGEkKywuq+vupOTnoaGkYmJlY6OmoiIlJeXo4iIlJ2dpqWmrK+wtrKzubi5v5qboY2OlLCxt7SzuLm4vbGwtLq5vsXEyMfGy727wLm4vcXEyMjHzMXEyKSjqKimq9bV2uPi5t3c49TT3MvJ08DAyc3Q25abppCXosjO3Ov3/+P5/uP7/eL9/eL9/eL9/eL9/eP7/eP7/eP9+uL7+eH6+OH6+OH6+OH6+OH6+OH6+N/4+d/4+d/4+d/4+d73+N73+N73+N73+Nz399z399z399z399v29tv29tv29tv29tnx8tnx8tnx8tnx8tfw8dfw8dfw8dbv8MDAwre3ucvLzb6+wKioqra2uMjIy8fHybKysqqqqqytsJ+hpJicpJudqkdJWElMXVNVZGVod4SCk1hXaE1MXF5ea11daXBwe46RnK+xwJOWqklMZElOaEhMaUFIZEFIZD9GYz5FYj5FYj5FYjpBXTpBXT1EXz5FYT5FXkBHYT5BXkFGX0FFWl1hcnJ0gXt/iX19iIiIlIGBjYWFkI+Pm5eXo6WlsZ+fq6amsKqrsbi5v7a3va2vtLGyuIaHjaqrsbu6v8zLz8LBxquqr7m4vc3M0MTCx7q5vre2ur27wL69wbGwtL++wt/e48TCx93c4+3s9sLBy8fH0NDQ3MXH1I+Un6qvvev0/+X5/uL6++L9/eL9/eL9/eL9/eP7/eP7/eP9+uL7+eH6+OH6+OH6+OH6+OH6+OH6+N/4+d/4+d/4+d/4+d73+N73+N73+N73+Nz399z399z399z399v29tv29tv29tv29tnx8tnx8tnx8tnx8tfw8dfw8dfw8dbv8MHBxLq6vcXFx76+wJCQk6WlqLu7vsHBxMXFxb6+vrO0t7CxtKywuJSWo0xOXU9RY1xebWFjcoWElGppe1RTY2Jib1paZWpqc6+yurq9yV9jdFZab0BFXj5BXkZNaUJJZUJJZj9GYz5FYj5FYjpBXTtCXj1EXz1EXz9GXz5FXkBEYUBFXkdKX1xfcXt+i3p+iHNzf4aGkYWFkH9/i4uLlpiYpJOTno+Pm6Skrc3O1Lu9wrO0uqSlq5+hpq2vtJ2epLGwtL++ws/O062ssbGwtJ6doq+tssLBxr++wrOyt7i3u6uqr7q5vr++ws3M0Pf2/dnX4cTCzL29xsbG0tfX5JqcqZCTosnQ2+j5/+L6++L9/d/+/d/+/eL9/eP7/eT7/eP9+uL7+eH6+OH6+OH6+OH6+OH6+OH6+N/4+d/4+d/4+d/4+d73+N73+N73+N73+Nz399z399z399z399v29tv29tv29tv29tnx8tnx8tnx8tnx8tfw8dfw8dfw8dbv8MfHycTExr29v729v6amqbm5u7Gxs7Ozs8HBv8fHx7KztrCxtKqqs6GhrU5NX0lMXVVXaWlrfVBPYnFwgmVkdF5ea2FhbGpqc62tt6mst31/jnt9kVNVbUZIY0hMaUdKaERKZkFKZT5HYj5FYTpBXTtCXj5FYT1EXz9GXzlAWkBEYUZKZD0/V0xPY36Cjnd6hW9veoKCjpeXo4GBjYKCjoiIlJaWooWFkJaXnZWWnLO0ur/AxoyNk6GiqL29xqaoraimq8XEyM7N0rSzuKyrsLe2usC/xLKxtru6v8XEyMfGy7a0ucC/xM7N0tzb39TT19fW3ePi6b/AxqystsDAzLS0wX9/jJyhrOHw9+X5++L6++L9/eL9/eL9/eP7/eP9+uP9+uL7+eH6+OH6+OH6+OH6+OH6+OH6+N/4+d/4+d/4+d/4+d73+N73+N73+N73+Nz399z399z399z399v29tv29tv29tv29tnx8tnx8tnx8tnx8tfw8dfw8dfw8dbv8JGRkcDAwKurq8vLy76+vsHBwbm5ub29vcTEwb+/v87O0K2ss6+suZ+drVBNYU5NYkhGXXFvhlxbcHp5jIB/j1xcaYKCjmxsdn1+hIKCjJiYpK2svZ2bsk5MZU5MaEpNakpUbEdUa0FOZT1GXj1EXTpBWzs/XD1AXT9EXT9EXT9CXz9CX0FGXz9EWGZteH6Ei3N3f3Z2f46Ol35+h5CQnXd3hJ6eq4eHk5CPlqWkq4uJk6Oiq5ORmJybpK+suaGfqaKhpbKytM/P0sDAwsbGyLGxs6OjpbGxs729v8jIy8fHycLCxcTExsfHyc3Nz8zMzvHw9Pb0+cjHzK2ss7++xcXEzZGPnJaapLjCy+b2/eT2+ev//+P9+uP++979+eL++OT++eP9+OL79+L79+H69uH69uH69uH6+N/599/599/599/599749t749t749t749t339N339N339N339Nz289z289z289v08trz8drz8drz8drz8dny8Nny8Nny8Nfx73h4eMzMzNLS0ra2tszMzJycnIeHh7CwsKampKKiori4urKxuLCtuqKfrU9MX0xIXlZUa1dVbE1MYWhmeZiYpWRkcJycpXNzfWlob4WEi6WkrbGvvcnG2omGnVhUb1RUcERNZU5bckRQaD5HXzpBWzpBWz5BXj5BXj9EXT9EXT9CXz9CX0JGYz1BWFpfbXl+iHR4gnBweYiIkYmJlZOTn4uLl3p6h5SUn4+Ol5+epZaVno2MlZWUnY+Ol7azwLu6xJqYnbKytMHBxLi4ur+/wcfHyaysr6Gho7u7vsbGyL6+wMHBxMDAwsXFx8zMzsfHyePj5cLCxdLQ1be2usC/xr++xauqs46Ol6KpsuHr8+X2+en6/uX9++H6+OL/+t799+P/+eP9+OL79+L79+H69uH69uH69uH69t/599/599/599/599749t749t749t749t339N339N339N339Nz289z289z289v08trz8drz8drz8drz8dny8Nny8Nny8Nfx72xsapaWlM/Pzb+/vbi4tn5+e4WFgr+/vaGhnp6enKOjpbGwtKmosauptkhGVE9NXVhXalhXalNRYlxcaXR0gXd3gnt7hWZobW9tdJaVnK+tt767yL26y7KvwltXbVZXcEJJY1FbdklTbUJJZT1EXz5BXj9CXz5BXj9EXT9EXT9EXT9EXT9CX0JHXk1TYXN4hHh6h3p6h39/jJaWo3t7h5qao4WFjoKCjnp4hZiWo52cpZeWn5eWn5aVnqqpsMfGzbCvs7OztqurrbGxs7KytKurrb+/wcbGyLOztsHBxMfHycHBxLm5u729v8jIy8jIy729v8fHybi3u8HAxbm4v8nIz7m4wYuLlIyQm8bQ2e36/+j5/eX5+eX//d/79uH/+eP/+eP9+OL79+L79+H69uH69uH69uH69t/599/599/599/599749t749t749t749t339N339N339N339Nz289z289z289v08trz8drz8drz8drz8dny8Nny8Nny8Nfx72FhXnl5d9nZ1svLyMjIxoWFgnd3dKGhnp+hnLS0sp2dnZ+foqalrJybpFZUYUxJVk5OW1VVYlBQXEVFUGFhbE1NVk1OVGhpb2tqb56dor27wqOiq8TBz7u5yXdzh1FQZUZKZE1UcE5VcUhMaUVIZUFFYj5BXj1BWz9EWz9EWz9EXT9EXT9CX0RIYkJIWHF2gXN2gnFxfnd2hpeXpIWFjouMkY+PmJSUn3FvfYyJlqWkraimsJ2bqJuao5CPlru6v7i4uri4uru7vsTExru7vrS0t7KytO3t8Li4usXFx8LCxcXFx729v7S0t7e3ubm5u6ioqsnJzMTCx7q5vrGwt7i3vsjH0J6eqIKHkZOao9zp7eLy9ub6+uP6+eP/+eL++OT++eP9+OL79+L79+H69uH69uH69uH69t/599/599/599/599749t749t749t749t339N339N339N339Nz289z289z289v08trz8drz8drz8drz8dny8Nny8Nny8Nfx71ZXU29wa72+ub2+uY+QjHZ3coCBfZSVkIKEf7Kzr7OzsYSEhKGho4yLj5aVnGtqcWRkbVRUXVRUXU9PWFpbYVRVW05PU2RlaW9tcoiHjKWkqaOiqcLBy6aksXFvfWVkdFNWaz9EXU9UbU9UbUhMaUJGYzs/XD5CXD9EWD9EWD5CWj5CXEFFYj5CXD9FV3p/jXN2gm9ve21sfY2NmpaWn4KEiZ2dppOTno+Nm3JwfY+Ol7GwubCtup6dpoyLkY+Ok7Gxs8HBxMTExrq6vcbGyMbGyMnJzMzMzri4uszMzsfHycXFx8DAwsDAwrq6vbKytLq6vejo6tzb37++wr27wri3vs3M1cjI0oeLlXmAiamzue36/+T39+X9++T++eH99+X/+uT++eP9+OP9+OL79+L79+L79+L799/599/599/599/599749t749t749t749tz289z289z289z289z289z289z289v08trz8drz8drz8drz8dny8Nny8Nny8Nfx71RVUGJjXn1+eausqKKjnmJjXoeIhHN0cGtsaIuMh4uLiICAfoCAgIeHibCwsrCvs2lqbV1eYlhaXWRlaVpbXlxdYVRVWGVmam9vcXd3ebm5u5ybn7m4v4yLlLCvuIaGk2Nld0xPZFBUaVBTa09RbElNaj9CXz5CXD9EWEBFWj9EWz9EXT9CXz9EXUJIW2pvfYCCj3t7iGRkcXh4hZycqIaGj5GRm5iYpKOhrZOQnXh3gI+Ol7CvuLGwuZiXnoaFjKuqr7u7vsTExsnJzL6+wMzMzsjIy+Li5M3Nz7i4usvLzcnJzMfHycLCxcHBxMLCxbu7vsDAwsTCx8jHzMfGzaimrdLQ2sXFzp+jrXuAi4aNlNTh5eX4+OX5+eP9+OP/+eX/+uT++eP9+OP9+OL79+L79+L79+L799/599/599/599/599749t749t749t749tz289z289z289z289z289z289z289v08trz8drz8drz8drz8dny8Nny8Nny8Nfx71VWT2VmX2xtZqmqo4mLhFdYUYSFfm1vaGRlXnN0cGprZmRkYmFhXmVlZZ+fn46OjmlqbGprbV5fYl1eYWVmaYSFh0xNT2lqbHJydGtra56enouLjZeXmmppbWZlbIWEjX19iGZpdlVXaVBRZlBTa09UbURHZDtCXEBFWkFHWkBFXD9EXT9CX0BFXkJIW1NXZXl9h3l5gm1td3d3goWFkYGBjoWFkZqapY2MlZ+epZ+eqIKBi5STnLOyu5qXpIyLlKSjqLu7vsXFx9XV18/P0sbGyNTU1sjIy9/f4ru7vs3Nz8fHycjIy8zMzsvLzcbGyMLCxc7O0MfGy6yrsLa0u6uqsbq5ws7O177BzHuAi4KJkJ+ssePz9Ob6+ub++uX/+uX/+uT++eP9+OP9+OL79+L79+L79+L799/599/599/599/599749t749t749t749tz289z289z289z289z289z289z289v08trz8drz8drz8drz8dny8Nny8Nny8Nfx71VWUVtcV2ZoY2xtZmZoYV5fWGVmX2NkXVtcVV5fW15fW1pbVmlpZmNjYY6OjHR0cmNlZGRmZV1fXlRWVWVoZnt9f2JjZWttbHNzc2lpaWxsbJGRkX19fXZ2eHh4ent6f4mIjYCBh2RkcFZYaFRValRWb0lOaEBFXkFHWkFHWkBFWj9EWz9CX0BFXj5CV0JGV2tteoCAiWxsdnh4hIeHlGppeXR0gYKCjomIj5aVnJ+eqKimsHp5goiGk46MmoWCj5STl6Skpre3ucTExs7O0M7O0NDQ09fX2tTU1tvb3c/P0s7O0M/P0szMzsvLzc3Nz8XFx8jIy8LBxr69xLSzure2vbKxutLQ2tLS3YyPmoSJkH6Ijt7v8Or9/er//uP9+OX/+uT++eP9+OP9+OL79+L79+L79+L799/59+H49+H49+H499/39t/39t/39t/39t3089308930893089308930893089zz8tvy8dvy8dvy8dvy8drx8Nrx8Nrx8Nnw709PTVtbWGlpZoWGgWtsaGVmYmNkXWNkXU5PSlRUUVVVU1FRT3BwbXBwbVhYVmRkYmpqaGJiX1tbWFdXVWZmZGpqampqamZmZGhoZWRkYmFhXl5eXGlpZn9/f3h4eHFxcXR0cm1tbW9tcl9faVBPX0xNYkdJYkFEXEFFVkxPYU5RZj9BWkFEXD9BWj9CV0JGWmFjcoaGkX19iGtreImJloiIlWRkcX9/i46Ol4eHkI+PmJiYoqqqtouLl5iYpY2NmI2MkJ6eobCwssDAwsvLzcDAws/P0tTU1sjIy9vb3cXFx9LS1MbGyMfHycbGyM3Nz8bGxsvLzcnIz769xK2ssaWkqbOyu8bE0NLQ2re2v4eLk5Ganer3+en7+en++uT99+b/+eX++OT99+T99+P79uP79uP79uP69+H49OP49OP49OP49OL38+L38+L38+L38+H28uH28uH28uH28t/08d/08d/08d7z8N7z8N3y793y793y793y79zx7dzx7dzx7VNTU05OTmtraXNzcXFybV1eWmJjXGlqZVFRT0xMSVpaV01NSmJiX46OjF5eXFpaV2lpZmJiX1xcWltbWGJiX2hoZWFhXmRkYmVlY1ZWVGRkYmFhXl9fXWVlY2VlY21ta3Nyb2ppZWlpaYWEiF9fa1RTY1RWaFFVZkxQXFVaZVVYakVIXEFFWj9BWj9CV0JEWElIWGxseYaGk319iYKCjqmptKSksISEj19fa3BweX9/iJSUn5WVopSUoaGhraqqs5CPlJ6eobS0t7e3ucvLzcnJzMXFx87O0MfHydvb3c3Nz9PT1cTExsnJzNPT1d3d39ra2sbGyMbFzMTCycvJzp2coa+tt7+9ycvH0tbV3pydo4+Vmt/t7Ov+++n++eb/+eb/+eX++OT99+T99+P79uP79uP79uP79uP49OP49OP49OP49OL38+L38+L38+L38+H28uH28uH28uH28t/08d/08d/08d7z8N7z8N3y793y793y793y79zx7dzx7dzx7UpKSk1NTV1dW2hoZWZoY2JjXl9hWmZoY1RUUU9PTV9fXVRUUVVVU4KCgH5+e1NTUGJjXl1eWltcV1xdWGJjXmVmYl5fW2VmYmlpZlBQTl1dW2VlY2hoZW1ta2pqaGRkYnBwbWJiX19fX42OkHt9gl5eaFpaZVhcZFVbX1xiaVpeakZJW0BEV0BEWEJGW0hJXlRTZWlpdnp6h3d3go2NlqOkqrKzucXGzImJlWJib1paZoGBjpOTno6Ol5OTnLa2v7a0uZycnri4uri4usLCxdLS1MLCxdDQ09TU1tTU1tPT1dDQ08fHycbGyMjIy6WlqLe3t7u7vsTCx8nIzb++wsfGy5uao7Kxus3J1L69xsDBx46UmNzq6eX49un++eT99+b/+eX++OT99+T99+P79uP79uP79uP79uP49OP49OP49OP49OL38+L38+L38+L38+H28uH28uH28uH28t/08d/08d/08d7z8N7z8N7z8N3y793y793y793y79zx7dzx7UFBQUxMTFVVU2NjYWJjXlpbVl5fWGFiXVdXVVhYVlVVU05OTFhYVmVlY5OTkExMSVtcV1dYVFdYVFpbVl9hXFxdWFxdWF9hXF5eXFpaV11dW2VlY2VlY21ta2pqaFpaV2ZmZFtdXF5hX3Z4d4iJjGtsb11eYlpbXVhdXF1iY1hcZERGU0BCVERFWkxNYlRWaExKW2FhbX5+iYCAiYWGjKGipba3ucbHy8bG0oWFkVhXaGJib4uLlISFi5eXoaSlq56doqWlqKioqsDAwra2uLu7vsvLzczMzsDAwszMzsbGyMbGyM7O0MnJzI6OkHl5e4uLi6ioqsLCxcC/xL++wtXU26uqsZORm7m2wM/O19bX3ZWbn83b2uj6+Or/+uj/+ub/+eX++OT99+T99+P79uP79uP79uP79uP49OP49OP49OP49OL38+L38+L38+L38+H28uH28uH28uH28t/08d/08d/08d7z8N7z8N7z8N3y793y793y793y79zx7dzx7UhISE5OTlZWVGZmZF1eWk5PSlFTTF9hXFdXVVxcWlBQTlBQTl5eXGNjYX19elZWVFhaVV9hWldYUV9hWmFiW1xdVlpbVF9hXGJiX11dW1paV15eXGVlY2VlY2RkYlVVU1hbWlhbWl5hX2NlZGRkZGlpaWhoZVRWU1RWUVtdWl5fY1FRW0lJVkVEVE1MXF5dbV1damFhbGlpcoGCiH1+gYmLja+xsL6/wcnJ087O24eGllFRXnFxepian5iYoo+Qln59gcXFx6ysr7+/wcvLzcDAwsLCxb6+wM3Nz8bGyLi4ur29v87O0M3Nz9PT1c7O0MzMzq+vsb6+wMnIzbi3vr27wtDP1pORmLm2wM3M1dzd483T19Xj4un7+eb79+P79ub/+eX++OT99+T99+P79uP79uP79uP79uT59uT59uT59uT59uP49OP49OP49OP49OL38+L38+L38+L389/08d/08d/08d7z8N/08d/08d7z8N7z8N3y793y793y793y709PT0dHR1FRT11dW1ZXU01OSVVWT2FiXV1dW19fXV9fXVtbWFZWVGFhXmFhXl1dW1RVUGhpYlVWT2JjXGJjXF1eV1dYUV5fW1tbWF1dW1ZWVF1dW2VlY2RkYmRkYlZYV1NXWFhdXltcXmJkY2JiYmNjYWxsaldYVFpbVmJkX2FiZFRVW0pKVEZGUUpKVldXY2FhamlqcFxdY3+AhHp7fn1/fqWoprGytMHBy9DQ3c3N2nNzgF5eapubpJubpKKiq5qYnb+/wbOztsXFx7OztsjIy8LCxcvLzdPT1dLS1KqqrJ+form5u8vLzdPT1dTU1uPj5enp67e3ucTCx8vJ0LKxusLByK+ttK+rtsHAyc7P1dne49vp6Oj6+Ob79+T99+b/+eX++OT99+T99+P79uP79uP79uP79uT59uT59uT59uT59uP49OP49OP49OP49OL38+L38+L38+L389/08d/08d/08d7z8N/08d/08d7z8N7z8N3y793y793y793y71paWlBQUFFRT09PTVBRTU5PSldYUV5fW1tbWF5eXF9fXVxcWlZWVGNjYV5eXFpaV19hXGRlXlhaU2RlXmFiW19hWmJjXFRVUFpaV11dW1xcWl9fXWNjYV9fXWFhXlZYV1VaW1BVV05TVWNkZmlpa11dXWNhYltaV1ZXU2NjYWRkZFxbX1dWXVRTWlNRVlRTV11eYnZ3eWNkZnFydHR3dnd5eJudnJianKmqsMnJ09fX4b6+yVtbaHh4hYiIlZSUnYmIjb29v93d36KipLCwsr6+wMzMzsLCxcvLzdLS1KamqZaWmL29v8bGyNXV19ra3Obm6ebm6dvb27+/wc3M1b++x83M08jHzqOfqre2v8DBx93j6OHv7ej6+Oj9+OX++Ob/+eX++OT99+T99+P79uP79uP79uP79uT59uT59uT59uT59uP49OP49OP49OP49OL38+L38+L38+L389/08d/08d/08d7z8N/08d/08d7z8N7z8N3y793y793y793y71hYWGFhXlhYVlRUUU9QTE9QTFdYUVpbVltcV2VlY19fXWJiX1tbWF9fXVhYVlVWUWJjXGRlXlNUTVhaU2RlXmNkXV1eV1VWT1dYVFNTUF1dW1hYVl1dW1hYVltbWFRWU05TVEdMTUVJSl9hY2FhY11dXWJfYV9eXFZWVGNjYV5eXlZWWFRUVldXWlpaXFdXV1pcW2ZpaF9iYV9iYWZpaHFzco2PjoGChYuMkcXGzNbX3dLT2aWlsXZ2gWVlcYeHk4eGjY+Ok+Lh5ZuanrS0t8XFx83Nz8jIy8jIy9LS1M3Nz+bm6dLS1M3Nz8zMzt/f4uXl6PHx8+Tk5MfHycbFzNDP1sjHzsTCx725wa2ss8XGyc7U1t/r6+n39Or7+Or9+en++eX++OT99+T99+P79uP79uP79uX69uT59uT59uT59uT59uP49OP49OP49OP49OL38+L38+L38+L389/08d/z89/z897y8t/08d/08d7z8N7z8N3y793x8d3x8d3x8VVVU1xdWF9hXFVWUVFTTklKRk9QTFxdWFpbVl1eWl5fW11eWl1eWldYVFpbVlhaVWFiW2RlXltcVU1OR15fWFdYUVpbVFpbVFZXU1dYVF9hXFhaVWFiXVFTTlhaVVxcWk5QTVZYV0dJSFhYWGVlZV5eXGFhXmNjYVVVU2VlY2RkYlpaWlNTU19fX1tbW09PT1tbW2hoaFhYVmRkYmpqaHl5d4eHh4CAgoyLj7++xdLS1MjIy7a0uaOipn59hF5dZnZzgIiGk5+eqJORmJ6dot7e4dLS1MzMzMfHycXFx9/f4snJzNbW2dDQ09LS1NnZ297e3urq6urq6tXV1cXFx8jIy9fX2sDAwsDAwre3ub2+wMnOz8vS0tnf3ez28uz49Or9+en++ej99uX68+n+9+X68+T58uT59OP29uT39+T39OX49uP28uX49OX49OL08eL08eL08eL08uHz8eHz8+Hy9uHy9uHy9uHz8eHz8OHz8eHz8d/y8t/x9N/x9N/x9E9QTFVWUV1eWlpbVkhJRUVGQU1OSVhaVVRVUF1eWl5fW1dYVF5fW1haVVRVUF1eWlxdVl1eV1haU0VGP1dYUVVWT1pbVFpbVFhaVV1eWltcV1pbVl5fW1NUT1FTTl1eWlNTUFxcWlBQTlZWVFpaV1FRT1dXVVxcWlBQTlhYVmlpZl5eXExMSVVVU1dXVVNTUF5eXmNjYV9hXGNkX3Jzb3d4c3R0cnFxc3t6f5eWm6SkpoKCgp+fn7m5u5iXnIGAiWRicH16iIeFkY2MlZaVnKmorMLCxcDAwMfHydDQ09bW2bq6vc/P0tvb3cjIy8nJzN3d3dfX19/f39bW1sTExM3NzczMzMXFxcHBwcfHx7CyscXHxsXJyMLHxuzx8O/49Oz++ur/+un+9+n+9+X69uj9+OX68+L38ub59+X4+OP28+L08ub59uP28uL27+X49OL08eL08uHz8d/y8uHz8+Hy9uHy+OHy9uHz8eHz8eHz8eHz89/y8t/x9N/x99/x90lKRlFTTl5fW15fW0pMR0JEP0dIRFRVUFNUT1xdWF1eWlZXU15fW1haVVRVUF1eWlpbVFtcVV1eV0dIQVZXUFZXUFtcVVhaU1haU15fWFpbVFhaU1xdVk5PSE9QSV5fW11eWlpbVlFTTlNUT15fW1FTTlNUT1haVVFTTldYVGprZlhaVU1OSVFTTlpbVltbWF9fXWVlY19hXGRlXmZoYWRlYXBwbWxsbGlobH59gX9/f3JycICAfqWlpYmIjaOiqWVjcGJfbGxqd7SzvbSzup2cobGxs5aWmLS0t9XV19vb3dzc3s3Nz9bW2cjIy9DQ09PT09DQ0Nzc3NPT083NzdTU1MbGxsjIyMbGxr6+vouNjLm7us7T0sHGxdfc2/T++uz++Oj79OX49OX49On7+eX49uT39Ob59+L08uP28+X49Ob59uP28uX49OX49OL08eT39OP28+L09OL09OHz8+Hy9uHy9uHy9uHz8eHz8eHz8+Hz89/y8t/x9N/x9N/x9EhJRVRVUGJjXl5fW01OST4/OkVGQVtcV1haVVxdWF1eWlxdWF1eWldYVFpbVlhaVV5fWF5fWGJjXFNUTVtcVVtcVV1eV1ZXUFpbVF1eV1pbVFVWT1tcVUhJQlFTTF9hWlVWUVdYVFdYVFFTTlxdWE9QTFNUT11eWlBRTVxdWGlqZVhaVVZXU1VWUWJjXl5fW2NjYWFiXWZoYWNkXWJjXGRlXmVmYl9fX2FhY3Fxc21tbWhoZXFxb39/f3t7fsLBxnt6hFxbZFtaY2RjamppbYiHjKioqpWVl6urrcvLzcfHyd/f4tTU1tXV19XV19PT1dnZ2dnZ2d/f3+Hh4dTU1M3NzdXV1czMzLm5ucnJzJydn7KztrO4udDV1szQ0unw8O37+ev7+uz9++n5+un5/en4/+j3/+X0++X3+uT39+T39+P28+T39OL08uL08eT39OT39OP29uP29uL09OHz8+Hz8+Hz8+Hz8+Hz8+Hz8+Hz8+Hz89/y8t/y8t/y8t/x9ElKRklKRlpbVlxdWExNSDk6NkJEP11eWlZXU1VWUVhaVVxdWFtcV1pbVl5fW1dYVGFiW1xdVl1eV1haU05PSFRVTlhaU1haU1pbUV1eVWJjWlxdVFxdVFRVTFdYT1pbVFNUTVhaU11eV0xNRlpbVFtcVV9hWmJjXE9QSV1eV2RlXmJjXF5fWFdYUWFiW11eWltcV15fW2hpYmRlXGFiWF9hWl1eWmJiX1ZWWGpqbGpqaF9hXGprZmNjYWhoaqalqszLz46NlJWUm3p5fn9+gqqqrKWlqGJiZK2tsL6+wKSkpr6+wMDAws3Nz9PT1dLS1Nzc3OXl5d/f3+Li4tzc3NTU1MjIyMHBwcbGyMXEyJ2eorCxtK2ytMLHydvf4uLo6ur0+On2+tXi6bfCzJejsZeitJqjuaGrvrfF07DAy7rM083e5OLz9+Hz893w7eT39N3w8OHz8+Hz89/y8uHz8+Hz8+Hz8+Hz8+Hz8+Hz8+Hz8+Hz8+Hz8+Hz8+Hz8+Hz80xNSExNSFxdWF5fW1FTTj9AO0VGQVtcV09QTFFTTlpbVlZXU1pbVlpbVlpbVlVWUVxdVltcVV1eV1xdVkpMRVBRSlVWT1VWT1dYT1xdVGFiWFpbUVFTSVRVTFhaUFtcU09QSVdYUWJjXFVWT1RVTldYUVtcVVtcVU5PSGRlXmFiW1tcVVxdVlVWT11eV1haU1xdWGNkXVpbUV1eVWNkW11eVVpbVF9fXVpaWmZmZmJiX1pbVl9hXGJiX19fX4uLjZ6eoba0ubKxtomIjX5+gJycnri4umtrbYKChY+PkZycnqioqrS0t7KytL29v83Nz9DQ0Nra2t/f3+np6ebm5tvb28zMzLi4us7N0r++wqGipamqrauwsrS5u87T1eHm68/W3cfO1620v5+ltqyxxp2iu4SHpISLpoSQpYCQn4ubqJeosqi5wMbX3dzt8d7w8+T2+eLz99/x9N7x8eHz8+Hz8+Hz8eHz8eHy9uHy9uHy9uHz8+Hz8+Hz8+Hz8eHz8VZXU1FTTltcV1pbVltcV0dIREhJRVhaVU5PSlNUT1pbVlhaVVpbVlZXU1haVU9QTFdYUVhaU1dYUVhaU0dIQU1OR1BRSlFTTFNUSltcU19hV1VWTU1ORVFTSVVWTVpbUVxdVlFTTFhaU1haU1ZXUFpbVFhaU1VWT09QSWRlXl5fWFdYUVxdVlRVTltcVVVWT1pbVlpbVF1eVV9iVV5hVGJjWlVWT2FhXlxcXGJiYlxcWlhaVWJjXmlpZl5eXmlpaWtra39/gbS0t6Gho4eHiZycnqWlqGpqbIeHicTExpSUloaGiJWVl7m5u7m5u4GBhJGRkdLS0vDw8NTU1NnZ2eXl5dnZ2cbGyMLBxs7N1Jqboayts7CzuaWpr7u/xd7i6Ovx89bc4cfM1ri9y9/j+LGzzo2OrYSLqH6LonqJm32MnX+On46erZChraKyv77O2dnq8eP0+uHy9t3w8OHz8+Hz8eHz8eHz8eHy9uHy+OHy9uHz8+Hz8+Hz8eHz8eHz8FdYVFRVUF1eWlxdWGFiXU1OSUpMR1dYVElKRlBRTU5PSltcV1tcV1BRTVpbVklKRlVWT1ZXUE9QSVBRTURFQElKRk5PSk5PSlBRSlpbUV5fVlNUSk9QR09QR05PRlhaUFtcVU5PSFVWT1ZXUElKRFNUTVdYUVVWT1BRSlxdVl9hWlpbVF5fWFVWT1tcVVRVUFxdWFpbVl9hV2NkW1dYT1xdVGFiXV5eXF1dW2FhXlxdWF5fW2RlYWxtaWVlY2JiYlRUUWRkYpeXl6Kion19faurq5ubm1NTVXl5e7u7voWFh3BwcoCAgr6+wJiYm4aGhnBwcLa2tuTk5O3t7ebm5uLi4t3d3c/Pz8TCx8TCx8HCxo6Pk7GytpeYnKiprNLW2ejs79PX2ru/x73Bzbi7z5yet4CCn4GFon2GnnuInXuInXmGm3iFmn2JnoiVqpWjtKGvvcvc4+Hy+OHy9uHz8+Hz8eHz8OHz8OHz8+Hy9uHy9uHz8+Hz8+Hz8eHz8eHz8VNUT1ZXU1dYVFVWUVVWUVZXU1BRTVhaVUdIREpMR09QTGFiXUxNSFtcV1BRTUlKRlFTTk1OSVNUT1RUUUlJR05OTExMTE1NSlNUT1NUTVVWT1VWT1FTTFdYUVNUTVZXUFZXUFBRSk9QSVNUTUdIQVFTTFBRSlNUTVVWTVVWTVxdVl5fWFhaVVVWUVVWUU1NSlRUUVpbVl1eV19hWmFiW1tcVVhaVV5eXFtbWFxcWmRlYWRlXmFiW2xtaWZmZF9fXVVWUVpbVGprZn1+eW9vbIKCgGlpZlhYWGxsbKGhoYGBgYyMjJWVlZ6enn5+fmhoaGRkYpOTkLi4ts7OzOXl49XV09bW1K+vrMfHx7q6vdDQ07Gxs6mpq5+fop2dn6Wmqc3O0ubo7a+vuKmruJudr46PpYaHn4SGoYiNpJSYrZ+ku6SpwJOXr4mOqH+EnXR7lYWPoqSywtXl8OHy+N7y8t/08N/07eP48eL08ePz8uPz8uPz9OLy8+Ly9uLy9uLy9kpMR1BRTVZXU1ZXU1tcV1haVU5PSlNUT0dIRElKRlVWUV9hXExNSFdYVE5PSkVGQVFTTkxNSE5OTFVVU0xMTExMTEdHSUpKSk9QTFBRSlRVTlRVTlNUTU1OR1pbVFtcVVZXUFBRSk9QSVNUTU5PSExNRlNUTU9QSVVWTVVWTVhaU11eV1ZXU1RVUE9PTUhIRlBQTlhYVl1eWmFiW2NkXV5fW1hYVl1dW15eXF9fXV5fW15fWFVWT15fW1hYVlRVUFFTTFZXTmNkXW1vaGJjXnh5dGZmZFxcWl9fX39/f3FxcYeHh4aGhnZ2dm1tbVxcXF5eXHFybaaoo4mLhtfZ1KusqMTFwI2Ni8zMzLe3t87OztDQ0Nvb2729vbq6uqqqrN3c49LQ2r6+yayru5SWqIeInYiJoomLo4WHn4aIoZCTq5udtqKkvZaYsY6QqYSIn3mCmIeVpqOxv9Xm7d7w89vw7OH279/07eL08ePz8uPz8uPz9OLy8+Ly9uLx+OLx+EZHQk5PSlRVUFZXU1ZXU1RVUEpMR09QTFBRTUxNSFpbVlRVUEpMR1ZXU1ZXU05PSk9QTE1OSU1NSlNTUFBQUEdHR0BAQkdHR0lKRlFTTE1OR1VWT05PSFdYUV1eV15fWFZXUFBRSk9QSVNUTVVWT0hJQk9QSU5PSFVWTVVWTVZXTltcVVFTTFVWUVFTTlBRTU9PTVZWVFdYVFpbVGVmX2RlYVpaV15eXFtbWGFhXlhaVV5fWFtcVV1eWlBQTkpMR1VWT1xdVGFiW2JjXFRVUGVmYltbWFFRT1xcWl9fXWVlZXFxcXh4eGlpaXFxc1ZWVlxcWmZmZGxsanl5d7a2s3t7eZeXlXJycLS0tLOzs8bGxsHBwcjIyKysrL29vbu7vuLh6MfF0s3M3JaVqJGTqX+AmHt7l4SEooCCn3d5ln6Am4+RqqOmu7K2yZ+jtJCWqYCInHuGmIKQoay7xtrr8eb5+eP49OH28eL08uPz8uPz9OPz9OLy8+Ly9uLy9uLy9kBAPkZGREpKSEpKSFZWVFBQTkJCQERFQFFTTkpMR1tcV1RVUEpMR1RVUFVWUUlKRklKRlBRTU5OTE9PTVNTU0VFRTo6PUVFRUhJRUhJRVFTTlFTTk5PSlFTTlRVUFpbVlZXU1BRTU9QTFNUT1haVUlKRkpMR05PSEpMQlRVTFhaUF1eV05PSFNUT01OSUpMR1BQTlBQTk9QTFBRSl1eV2JjXlhYVlZWVFxcWmNjYVBRTVZXUFdYUVdYVEpKSEdIRFZXUF1eVV5fWFhaU1BRTWNkX2JiX11dW1RUUVxcWl9fX2hoaFtbW1RUVl5eYUxMTk5OTmJiX2RkYmlpZoKCgGVlY21ta11dW5+fn7Ozs7q6ur6+voWFhXt7e56ensLCxdnX3MbFzsbG0rCvv9bX7L/A2ZWVsYaGpHd4l3h5mH1/nICCm4uOo5SXqZ2isJqfrY2VqXR/kXeBk4ybpc/e5tzt89/x9OT39+Pz9OPz9OPz9OPz9OLy8+Ly8+Ly8+Ly9j4+PkFBQU1NTUZGRkhISEpKSkFBQUBAPlBRTVBRTVhaVU1OSUBBPUhJRU5PSkVGQUdIREZHQkZGREdHRU5OTkFBQTk5Oz4+PkREQUBAPkxMSU1NSkxMSUpKSE5OTE9PTVVVU01NSklJR1BQTl1dW1NTUEpKSE1OSVNUSldYT15fWF5fWFBRTUVGQUhIRklJR0xMSVBQTlZXU1NUTV5fWF1eWlNTUFRUUVVVU11dW1VWUVVWT1pbVFVWUUhIRk1OSVdYUV9hV2FiW11eV1VWUVxdWFpaV1BQTlVWUVhYVlFRT1tbW1VVVU1NT09OU0dHSVBQUFpaWlpaWlxcXFRUVFtbW1xcXGlpaYuLi8LCwpaWlrCwsHNzc4CAgIiIiJ6enr29usnJx8DBxZWVnsXH1tDS5piasoeHpXt9nHh5mHh6lX1/l4KGmpicrZqeqqitu6KqvYuTpnJ9jnN/jY6dqLfG0Nzt9Nvs8uPz9+T09uPz9OT09uPz9OLy8+Ly8+Ly8zY2Njs7O0dHRz4+PkREREFBQT4+PkFBQU1NSkpMR1BRTU5PSkJEP0hJRUxNSERFQERFQEVGQUVFQkREQVNTU0ZGRjg4Ojo6PTs7O0BAPj8/PUlJR0dHRUxMSUdHRUZGRE9PTUxMSUZGRFFRT1hYVlNTUE5OTEhJRUxNRlNUSlxdVl5fWFdYVEdIREZGREREQUdHRUpKSFFTTk1OR1tcVV1eWlNTUE9PTVZWVFhYVlVWUVBRSlZXUExNSElJR1NUT15fWGZoXmZoYWJjXFZXU1FTTlNTUFhYVk5PSlRVUFdXVVBQUFFRVEdHSUhHTEFARU5OUFtbW1VVVV9fX1dXV1NTU11dXVpaWmJiYpycnH5+fmpqamxsbG9vb4KCgouLi7GyrcfIxKqsq3h5f6aqtH1/joGCl3h5kXJ0j3l7lnt+lnd6j4GFmI2QopqerKOotqKoupCYrHJ6jWx3iHJ9joyaqrLAzuPz/uLx+OPz9+T0+OLy8+Pz9OPz9OLy8eLy8T4+QDo6PUZGSEZGSEpKTUhISkJCRTk5OU1NSklKRkdIRERFQEJEP0ZHQkxNSEdIREJEP0ZHQkZGREJCQFRUVEpKSjg4Ojk5Ozg4ODc3Nz4+PkJCQkxMTEVFRUdHR0dHR0pKSkZGRkdHR1FRUVFRUVVVVU9PT0REQU1OR1BRSFZXUFZXUFdYVElKRkxMSUxMSU5OTExMSU1OSUhJQl5fWGZoY1xcWlRUUVdXVVtbWFpbVlVWT1dYUU9QTEhIRlRVUGJjXGlqYWhpYmFiW1haVUZHQkpKSFhYVk9QTFhaVVVVU05OTlNTVVBQU1FQVURCR0pKTVVVV1BQU15eYUpKTUhISlBQU2JiZF5eYWNjZVhYW1ZWWFtbXWRkZn5+gIKCha+vr5aWlqOkpm1vdI2QmHp+iG9xfnFzgnBzh3t/lHt/lHJ2i3R4jYSHnIKGm46RppecsY2RpmlxhWZvgnN+kIiTpZelt8TS4tzr8+Lx+OLy9uLy8+Pz9OPz8uPz8uLz8D8/Pz4+PklJSUdHST8/QTs7PkFBREFBQUVFQkhJRUVGQT9AOz9AO0JEP0xNSE1OSURFQElKRklJR0REQVFRUU5OTjo6Ojs7Ozc3NzY2Nj09PUFBQUpKSk5OTk1NTU5OTkdHRz4+PkpKSlBQUE1NTVZWVkxMTEZGREdIRE1OR1VWT1ZXUF1eWk9QTFFRT1FRT0pKSEVFQkhJRUZHQlVWUWJjXlZWVEpKSE9PTVpbVlZXU1haVVFTTlhaVUxMSV1dW15fWGRlXGNkXVxdVmFiXU5PSk5OTFNTUFxdWFhaVVhYVkpKSFFRUVBQU1VUWExKT0ZFSUlITU5NUVpaXFBQU01NT09PUVtbXVtbXV1dX19fYldXWlRUVmlpa46OkG9vcYKChXl5e4iJjWZoa3p+hGtvdGZqcmlsd29xfnZ4h3J0hGZpend4jYSFm35/lYSGnoiLo4WJoXZ6j4mRpHF5jXB5j4iRqpilusXU3tvq8d/w89/w8eLy8+Pz8uPz8uPz8jQ4MDc5NEJFQUxOTT4/QTIzNjY4N0ZIRUBAPkZGREZGRD4+O0dHRUFBP0ZGREhIRkREQUxMSUpKSEpKSFZWVF1dW1RUUUZGRDQ0Mjk5Nzs7OUBAPkREQUxMSUpKSEJCQEJFQUVHRklMSkVGSEZHSU5QT0BCQUdJRkREQUlJR1VWUVtcV09QTExNSDk5Nz8/P0dHRUJCQEZGREVFQl1dW1tbWFFRT05OTExNSFNUT05PSldXVVNTUE1NTUlJSVVVU2VmX2RlXGFiW2VmX2NkX1RVUE1NSk5OTFdXVVxcWltbWFRVUE1NSk5OTFVVVVNTVURFSkVGTEZHTVZXW01OUUlKTklKTVVWWFtbW1FRUVVVVVZWVk9PT11dXWVlZWVlZWVmaV5fYmlqbGFiZGNkaG9wc2hpbGVmamRla3FxenNzf2pqd3JxgYuJnJiXrIeInoSEn29xjGNmend9jXuBlHN7kXR7mH6HopCbrMzZ39/s7+Lw7+T09uHx8uP29uHz80FFOkFFPUVHQkRGRTk6PTAxMzY4N0lMSEVFQkxMSUdHRTg4NjY2M0BAPkdHRUVFQj8/PU1NSlBQTlFRT2FhXmJiX1hYVlRUUT8/PUBAPjs7OUREQUZGRExMSUpKSEFBP0pNSUVHRkdISkZHSURFR0lKTUpNTEZIRUZGRkdHR1ZWVFhaVVFTTlRUUT8/Pzs7O0ZGREBAPkZGRE5OTGlpZl9fXVNTUFNTUE1OSU9QTE9PTUpKSFFRUUZGRkRERkJCQlZXUGFiW2FiW1RVUFxdWFZWVE1NSk1NSlNTU1dXV1BQTlhaVUlKRk5OTE5OTk9PUUZHTURETUdITlRVW05PU0VGSUVGSFZXWlNTU01NTVRUVFhYWFFRUVZWVltbW1dXV15fYlVWWF5fYl1eYV1eYWJjZWJjZV1eYWJjZmRlaXt9gmZmcHZ2go2MnKuqvYyJoYmJpWlqgmFkdnN4hqOmunuAl3R4lnR7l4CIm5CdpNvo6uTy8ePz9OT09tvt7eT390JGOz1AOD5AOz5APzc4Oi0vMTI0M0JFQU1NSk9PTUZGRDIyMDIyMD8/PUVFQkdHRUBAPklJR0pKSExMSVVVU2JiX2NjYWFhXk9PTUVFQjk5N0JCQEREQUxMSUpKSEJCQERGQj5APz9AQj9AQjo7PkBBRE5QT0lMSExMTE5OTlpaV1xdWFVWUU9PTVBQUEBAQExMSU1NSklJR0pKSGJiX19fXVRUUUxMSVVWUU1OSU9PTU5OTE5OTj09PTo6PT8/P1BRTVhaU1tcV0dIRFxcWkxMSUZGRklJSVFRUVdXV0xMSVhaVUpMR09PTU9PT0pKTUdITEBBR0VGTE5PU09QVEZHSUZHSVdaWE1NTUhISE5OTlRUVFZWVlVVVVNTU1dXV1RVV1VWWFxdX1ZXWmJjZV1eYV1eYWJjZWJjZmRlaWJjaV5eaGhoc2xseXp5iYuJnoiJonFyiGlrepqcqaywwZaar3FzkHJ3kHJ7i3aAiMXS1OLw7+Hx9OPz9+X299/w8VRXTU5RST9BPUBCQUBBRDM0NzI0Mz9BPk5OTElJRz8/PTc3ND4+Ozs7OT09OkpKSEdHRUhIRkhIRlFRT0pKSFFRT1NTUFhYVl1dW0hIRjc3NEFBPz8/PUlJR01NSkdHRTo9OTs+PUBBRD0+QDs9Pzs9P0VHRkRGQkdHR09PT09PTVhaVVdYVEpKSEpKSj8/P0xMSUhIRkFBP0dHRVpaV1RUUUpKSEpKSEhJRUhJRUhIRkdHRUBAQDs7Ozg4OkFBQVxdWFhaVVhaVVVVU0xMST8/P0lJSUdHR0pKSlFRUVFRT19hXFFTTlFRT1NTU0ZGSEBBRTs9QkJER0dITFBRVE1OUE1PTlhbWkpKSkVFRUlJSU5OTklJSVRUVFRUVFZWVk9QU05PUVRVV1ZXWlhaXF9hY1haXFtcXl5fY2VmamZobVFTWGVlb2RkcHh4hYaFlZGTqHp9jl9ib21xe42PnpeYrX5/l3R4jXF3hXeBiZ+qrdzp6+Tx+OLx+OPz9+Hx8lteVE9TSjg6Njg6OUBBRDEyNDM2ND5APUxMSUpKSEFBPzo6OEhIRjs7OT8/PVFRT0JCQD8/PVFRT1NTUE5OTE9PTU9PTU5OTFpaV0VFQjo6OEVFQkVFQkZGRExMSVBQTjk7ODAyMTk6PTQ2ODAxMzg5Oz5AP0BCP0ZGRlFRUVNTUE5PSlhaVVNTUD4+PkJCQk9PTUxMSUdHRUZGRE9PTUhIRkJCQEJCQEVGQT9AO0FBP0REQURERD8/Pzo6PUVFRVBQTlBRTVtbWEFBPz4+Pjo6OkZGSFBQU0ZGRk1NTU5OTFhaVVNUT01NSlNTU0lJTD9ARDo7P0dITFNUVklKTU1PTk5QT1VXVE9PT05OTkZGRk1NTUhISFFRUU9PT1FRUUxNT05PUU9QU01OUFhaXF1eYVZXWlBRVFZXWlZXW15fY11eYltcYl9hZmZmcG1teXp9iWFjcFteZmVpcW1wfYmImHt6j29xgmxxe2lwd4ePk8XP1eHr897r8t/s8en2+lRXTUxPR0RGQTs+PUBBRDY3OTEzMkBCP0xMSVFRT0dHRTc3NE1NSkVFQkFBP05OTEVFQkFBP1BQTkxMSVdXVUxMSUZGRElJR1ZWVEFBPzQ0Mj8/PUJCQElJR0pKSFRUUT5APTc5ODg5Oy8wMjEyND4/QT9BQEdJRkdHR0VFRUhIRlFTTltcV15eXExMTExMTExMSUlJR0pKSEVFQklJR0lJR0FBP0dHRUBBPURFQEhIRkBAPkJCQkhISEVFR0JCQkpKSE1NSlpaV0JCQkBAQE5OUEdHSU1NT0REREFBQT4+O05PSlhaVU1NSlBQUElJSUJERkJER05PUVpbXUxOTUxOTUpNSVFUUFZWVlFRUUVFRUxMTEhISE5OTlNTU1ZWVlBRVE9QU1BRVEZHSVRVV1tcXlVWWFRVV1FTVVRVV1xdX15fY09QVFZXW2NkaGtscmRocFNWXldcXmVmanNzfYCAjXZ0hW9ve2VpcWVrcHZ+gba9xNzj7LjBzOLs8uLv801QRk1QSE5QTD0/Pj0+QDc4Ojg6OUxOSkdHRU5OTEhIRj4+O1BQTk5OTD4+O0pKSEJCQEBAPk1NSkZGRFVVU1RUUU5OTEhIRldXVUBAPjMzMTs7OUREQVFRT0lJR1VVU0ZIRTs+PTg5OzM0Nzg5O0BBRDo9Oz5APUhISD4+PkhIRl1eWmFiXVxcWlpaWkxMTExMSU1NSkhIRkBAPkREQUVFQjc3NElJR0BBPTs9OEZGREJCQEREREpKSk5OUEdHR0dHRUxMSVtbW0VFRU5OUFFRVEA/REJCRTs7Oz4+Pj8/PVFTTl5fW0xMSUpKSklJSUdISkhJTE1OUFVXVk5QT0hKR0VHRE1PTFNTU1ZWVkxMTE9PT01NTUpKSldXV1dXV1ZXWk1OUElKTUlKTVBRVFBRVFpbXVdYW0xNT05PUVtcXl9hY1VWWFVWWF5fYmJjZVhdX1RYW2RlaGRlaGRjanZ0fnd0gWppcmJmaWJoampwdKOpsL/G0I2UnszW3Nnj5klNQlNWTlBTTj0/Pj0+QDEyNDk7OkhKR01NSkZGRD8/PUBAPkFBP1VVUz4+O1RUUUZGREdHRVVVU01NSkxMSU9PTU9PTUxMSVxcWkVFQjY2Mz4+O0ZGRFtbWEZGRE5OTEJFQTg6OTIzNjQ2ODIzNjk7OkhKR0lMSEREREZGRElKRkpMR1tcV1BRTUpKSD8/PUdHRVRUUUpKSDg4Nj4+O01NSjs7OUhIRkZHQj9AO05OTElJR0ZGRlNTU1VVVT8/P0dHR01NTV5eXkpKTUlJTEVESERCRzs6Pzg4Oj4+Pj09OkhJRV5fW0dHRUZGRkhISkJERkZHSUdISlNVVE9RUEdJRkBCP0lMSEdHRVhYWFdXV1ZWVlNTU0hISFhYWFVVVVFUU1FTVUdISk1OUE1OUE5PUVhaXFxdX1FTVVBRVFZYV1hbWltdXFVXVl5hX2FiZF5jZFBVVmFjYmJkY2JhZWhmbW1sc2JhaF5jZGVqa2lscnZ7goKHk32EjrvCydnj5kdIP1BRSldYVE1NTUBAQi8vMUJCQkJCQEpNSDo9ODM2Mjc5OD5AP1RWU0ZIRFRWUURFQE1OSVZXU09QTE5PSkpMR01OSUhJRVFRT09PTTk6NkZHQlZXU2FiXUdIRExNSEpKSj4+QDIyNDIyNERERElJST8/PUREQUxMSUhIRk1OSU5PSlZXUF5fWFNUTUhJRUpKSE1NSkREQTQ0Mjo6ODg4Njg4NkVFQk5OTEBAPkVFQlRUUUFBP0xMSVhYVklJSU9PT0VFRVRUVlBQU1ZVWkZFSUJBSDo5Pjg4Oj8/P0BAPkpKSF1dW0FBPz8/P0pKTUFCRkZHSkhJTUZHSVhaXE1PTklMSk1PTElJR1RUUV5eXE1NSlRUUVBQTk5OTFRUUVNVVFFUU05QT0xOTUlMSklMSlFUU1xeXVtcXlVWWFVWWFZXWl5fYltcXltcXl1eYVxdX19hY1xdX15fYmFiZF5fY15fY19hY15fYmlqbGhpb2VpcV9kcF5jb4CHjpWco0BBOE1OR09QTElJSURERjExMzo6Ojs7OVBTTkFEPzM2NDQ3Njg6OU5QT0BCPk9TSk5PSkxNSE9QTExNSFBRTUZHQkxNSEFCPlVVU1tbWEdIRD9AO0hJQlpbVEhJQkpMR0ZGSDMyNzIyNEJCRUxMTFBQUEFBPz8/PT8/PT8/PUhIRk5PSlBRTVxdVlVWT05PSEpMR1BQTk5OTDs7OTQ0MjY2Mzc3NEdHRVBQTkJCQEFBP1FRT0lJR0VFQlBQTlNTUFdXV0lJSUdHST8/QUZFSUA/RD07Qjk4PTc3OT8/QURERFpaV2FhXkxMTEBAQkpKTTk6Pj9ARERFSEZHSk9QU0dISkdJSEpNTEpKSE9QTFpbVlVWUVhaVVZXU1FTTlZWVFBTUVhbWldaWExOTUhKSUZIR0pNTFVXVlxdX1RVV1FTVVRVV1pbXVdYW1NUVlhaXFtcXlhaXFtcXlpbXV5fYlFTVVZXWlxdX2JiYmNjZV9hZmFkbFhcZlhdaHN5gH2Ei0dIP0xNRlRVUEZGRlFRVDExMzExMTs7OU1PSkFEQC8xMC8wMjQ2OEpNTD0/O0pNSE5PSklKRk9QTE1OSUdIRD9AO0lKRkVGQUZGRFVVU1dYVFBRTU5PSFdYUUpMRVFTTkxMTDk5OywsLzs7O1VVVVVVU05OTEBAPkBAPj4+PkVFQkdHRUxNSFZXU05PSEdIQUJEP01NSlBQTkhIRjg4NjIyMDk5N0BAPlNTUEREQT09Ok5OTEpKSEZGRFBQTlRUUVdXVUpKSk5OTkhISkBAQjs6Pz8+QklITUBAQj8/QU1NTVpaV1paV1FRUTs7PkdHSTo7Pzs9QD9AREJER01OUEhJTEdJSEhKSU1NSk5OTFVVU1paV1ZWVFVVU1BQTlRUUVFUU1daWFZYV09RUEhKSUdJSEdJSE9RUFhaXFFTVU5PUVZXWlhaXFpbXVBRVFdYW1haXFZXWlhaXFdYW11eYVBRVFFTVV1eYV9hY1dYW1RVW1teZlNWXkxPV19lal9lakxNRFFTTE5PSkBAQFNTVT4+QDc3Nzs7OUxOSkZIRTIzNjM0NzY3OUxNTz5APU1PTFBQTklJR09PTUVFQkJCQEFBP0ZGREREQU1NSlZWVFZXU0ZHQkZHQFZXUFFTTFZXU0ZGRjQ0Nzs7Ozc3N0xMSVRUUUhJRUVGQUREREFBQUdHR0lJR0ZGRFRVUFFTTk1OSU1NSlVVU01NSlBQTj09OisrKTk5Nz8/PVRUUUREQT4+O0xMSUxMSUlJR05OTFBQTlxcWklJR1VVVUxMTFdXWk1NT0ZFSTg3OzY2OD09P0hISFFRT1xcWkpKSk1NT0hISjg5PTk6PkBBRUhJTUlKTUVGSEFEQj9BQE9PT1FRUVNTU1ZWVk5OTlFRUU5OTlBQUFNVVExOTU1PTlNVVE5QT0lMSkhKSU1PTldYW1RVV0pMTk1OUFRVV1RVV0lKTVRVV1RVV1dYW1RVV1ZXWlVWWFNUVkpMTlhaXFdYW09UVklNU1BUWlFVXU9TWFpeYVdcXlZXTlVWT01OSURERE9PUVRUVkhISDo6OD5APT0/PiorLSYoKzY3OkBBREBCQUVHRkZGRj4+PkZGRkZGRk1NTVBQUFBQUE1NSkFBP1FRT1dYVEhJRUlKRE5PSFRVTlBRTUpKSEdHR1RUVEZGRElJR1ZXU1NUTz4/Ojg4ODY2OD4+PkFBQT4+O0hIRlBQTlNTUFNTUE1NSk5OTFFRT0lJRzc3NDQ0Mj8/PVZWVE9PTUVFQkZGRFVVU01NSklJR01NSlhaVVhYVldXVUxMTFRUVExMTi0tMDMzNjExMz4+QEhISFVVU1xcWk9PT0xMTj8/QTY3Ojo7Pz0+QUdITERFR0ZHST0/PkVHRkxMTFRUVkxMTk9PUUxMTk5OUEdHSVFRUVNVVE9RUFFUU09RUFdaWFBTUU9RUFpcW1ZXWlVWWEdISkxNT1BRVFhaXEZHSUhJTFBRVFFTVVRVV1dYW1NUVlpbXU1OUFBRVE1RU1BVV0pOVEJGTExPVVZaX1RYWlRVV1dYT0xNRkhJRT8/P0RERkdHST4+PjExLzc5ODc4OikqLSorLzIzNzQ2OTQ2ODo9O0RERD09PT09PUFBQUREREBAQEBAQEREREVFQlVVU1ZXUz9AO0BBOkZHQFZXUFtcV1FRT1tbW1NTUEVFQk5PSlFTTk9QSTg5NEFBQT4+QD4+QD09PT09PUpKSFBQTkpKSElJR01NSkhIRk5OTE9PTUBAPkFBP0JCQFVVU1ZWVE5OTEhIRlNTUElJR01NSkpKSFVWUVNUT0xMSVFRT05OTk9PTzs7PklJTDg4Ojs7PlFRUU9PTVtbWFxcXEJCRURERj9ARD9ARDs9QD4/QkRFR0RFRzk7Ojs+PUVFR1BQU0pKTUdHSUdHSUpKTUZGSExMTkpNTE1PTlFUU1BTUVNVVFNVVFVXVlRWVU9QU05PUUVGSElKTUlKTVBRVEJERkZHSUxNT1BRVFNUVlRVV01OUFZXWlRVV09UVUZNTVBWWFBUWkVITklNU1RVWFFUU1FUU1VWTVBRSkVGQUJCQj8/QUVFR0JCQjg4NjI0MzIzNigpLC8wNjM0OjY3Ojc4Oj0/PkZGSDo6PTo6PT8/QUFBRDo6PTo6PUFBQVRUUVZWVFdYVE1OSUpMRUZHQE5PSE9QTFRUUV5eXF1dW0dIRE1OSVFTTEVGPzk6NklJTEdGSj8/QTo6PTk5OUhISE1NSkdHRUdHRUpKSEdHRU5OTFNTUEdHRT8/PTs7OU9PTVdXVVRUUUdHRUlJR0pKSE5OTEZGRFFTTkxNSE1OSUxMSU5OTE5OTkZGRkBAQEdHSU1NT1VVVUdHRVhYVk5OTkFBRDg4Ojc4Ozk6Pj9AREBBRTo7Pj4/QT9BQEBCQUVFR05OUExMTkZGSEVFR0dHSUVFR0VFR0ZIR01PTk9RUFNVVFRWVVFUU1ZYV09RUFRVV05PUUVGSEVGSEJERk1OUEhJTE5PUUhJTEpMTlBRVFFTVUhJTFBRVFdYW01RU0FHSU1TVVFXXElNU01RVFRVV1RUUVZWVEpMRUlKREhJRT8/PUJCQlFRUUlJSTQ0NC0vMTIzNissMC8wMy0vMjk6Pjs9Pz9BQEpKTTQ0N0BAQkBAQj4+QDo6PTo6PT4+QEBAQFVVU1tcV0dIRD9AO0JEP09QTFdYVFBQTlxcWlxcWkxNSEdIRExNSERFQD09OkxMTk1NT0FBRD09Pzc3N0FBQUpKSExMSUhIRkJCQD4+O0BAPkBAPkJCQD4+Pjk5OUhISFBQUE1NSkZGREpKSEZGREZGRExMSU1OSU5PSkpKSElJR01NSltbW1hYWFVVVUxMTlBQU1FRUUREQVVVU1BQUDk5OzQ0Nzc4Oz0+QUlKTklKTTk6PT9AQkRFR0JERkJCRUVFR0ZGSEJCQkJCQkVFR0ZGSEFBREVHRk5QT05QT1NVVFBTUUlMSlZYV1ZYV1VWWE9QU0pMTkpMTkVGSEpMTkZHSUZHSUZHSUhJTExNT1BRVEhJTE1OUFdYW0dMTT1CRUpQU09VV0pPUUxQUVBTUU5QTVRUUU5PSk9QTFBRTUdIRERFQEdHRUJCRTg3Ozo7QTAxNzc4OzAxMzEyNDQ2ODo7Pj4/QUVFRzc3OTc3OUFBRElJTDk5OzMzNjo6PUhISFpaV1VVU0VFQj4+O0ZGRExMSVtbWFBQTlpaWlxcXFBQTkJCQE1NSkJCQEJCQkRGRUlMSjs+PUZIRz0/Pjg6OU1PTkZIR0xOTUBCPzk7OD0/Oz9BPjs+PTc4OjM0OD0+QUdISkhKSUlMSExOSUpNSUhKR0ZIR0hKSU5QT0ZIR0ZIR0ZIR0xNTz9AQjo7PkFCRUlKTUVHRj9BPlRWU09RUEBBRDg5Oy8wMzk6PkZHSVVXVj0/Pjs9Pzo7Pj9ARD0+QUVGSFNVVE9RTkVHRD0/PkBBRD9AQkxOTU5QT1BTUVFUU1FUU0pNTE5QT1hbWlRVV1BRVElKTU5PUUpMTkdISkdISklKTURGRUdJSEdJSE1PTkZIR0xOTVZYV01OUElOT0hNTk1RU0xQUUhNTklOT01RUFFUU1BQTk1NSkxNSERFPjs9OEFBPz4+QDMyOTExOi8wNjs9QDY3OTY4Nzk7Ojk6PTo7Pj4+QDIyNDc3OT8/QT09PzIyNC8vMTY2OD09PUlJR1ZWVE5OTD4+O0VFQlBQTlRUUVpaWlhYWFxcXElJSUFBQUdHR0ZGRkBAQD9BQEJFRERGRUJFRDo9Ozg6OUpNTEVHRklMSj5APzM2MjM2Mjo9Ozg5OzQ2OTIzOTY3PUBBRURGRUVHREdJRUZIRUVHRkRGRUpMTk5PUURFR0FCRUZHSVFTVURFRzk6PUJERkFCRURGRUBCP09RTlRWVUlKTUFCRTIzNzk6PkVGSFZYV0VHRjs9Pzc4Ozo7Pz4/QklKTVRWU1RWUUpNSEJFQURFRz9AREdISkhKSUxOTVFUU01PTkhKSUxOTVRWVVdYW09QU0lKTU1OUFBRVEpMTkVGSEFCRUdJSEhKSU5QT0xOTUpNTFNVVFRWVU1PTkZKTEVJSklOT0hNTkVJSkdMTUlOT0xQUUlJR1FRT1RVUEZHQDk6Nj8/PT09PzMyOSwsNi0vND9ARD9AQjI0Mz0/Pjs9Pz4/QT9ARDEyNjY3Ojc4Oy0vMissMDEyNjs9Pz4+PkhIRlVVU1FRT0FBP0FBP0pKSFVVU1VVVVpaWldXV1BQUEBAQEpKSkVFRUVFRUFEQkBCQUhKSUFEQjk7Ojk7OkhKSUVHRk1PTkRGRTk7ODc5Nj0/Pjk6PTQ2OTEyODg5Pz9ARD0/Pjs+Oj9BPUJFQUZIR0lMSkdISkpMTj9AQj9AQj9AQlFTVU5PUUxNTz4/QUVGSElMSj9BPk5QTVNVVEhJTEBBRDo7P0FCRkdISlZYV1NVVD4/QTc4Ozg5PTQ2OUdISlFUUFdaVU9RTUlMSEVGSD4/QkpMTkhJTEZHSUdISkVGSEJERkZHSUxNT05PUUlKTUdISkVGSEpMTkpMTkhJTEVGSEVHRkZIR0pNTEVHRkJFRE1PTlFUU05QT0hNTkdMTUxQUUpPUEJHSERISUdMTUlOT1FRT1VVU1VWUUdIQT0+OUJCQEFBRDk4Py8vOCssMj4/QkVGSDY4N0FEQjo7Pjo7Pj4/QjEyNjo7Pzo7PzIzNzAxNDM0ODo7Pj8/P01NSkxMSUREQT4+O0ZGREhIRlFRT1dXV1VVVVpaWlBQUEVFRUlJSU5OTkdHR0BCQTg6OT0/Pjo9Ozc5ODk7OkZIR0RGRUhKSURGRT0/Ozk7OERGRT4/QTQ2OS8wNjY3PT4/Qj5APz0/O0ZIREZIRUZIR0ZIRz4/QUZHST9AQkJERjs9P0VGSDs9Pzk6PTc4Oj9AQj0/Pj0/PlBTUUxOTT0+QDY3OjY3OkFCRkRFR0pNTFxeXUdISj4/Qjg5PTo7P01OUFBTT1RWUU9RTUlMSEdISkFCRkhJTEdISkVGSEVGSD9AQj9AQkJERkZHSUhJTE1OUE5PUT9AQklKTUpMTklKTUVGSEZIR05QT0pNTEZIR0lMSk1PTlZYV0xOTUVJSkRISUhNTkdMTT9ERUFGR0RISUZKTFNTUFdXVVdYVFBRSj0+OT8/PURERkFAR0VFTjEyODc4OzM0Nzc5OEBCQUBBRDQ2ODc7PiYqMDM3PTE0Oi0xNyotMyotMy0vMjo6Ok5OTFFRT0lJRz8/PUFBP0dHRUxMSU5OTlVVVVdXV05OTkFBQUhISFFRUUdHR0VHRj9BQDk7OkFEQjg6OTk7OkRGRUBCQUVHRkJFREBCPz0/O0dJSDk6PTEyNi0vNDc4Pjs9QEFEQj5APUJFQD9BPjo9Ozc5OD4/QTs9PzY3OTc4OjY3OTg5Ozc4OjM0Nzk6Pjo7Pzk6PT4/QUdISlBRVEZHSjQ2OTg5PT9AREVGSEVHRlxeXUxNTz0+QTEyNjY3OkZHSVFUUFhbVl5hXEpNSUhJTDs9QD9ARD4/Qj9ARD9ARDs9QDo7P0BBRUhJTUdISj9AQkpMTjk6PUFCRUxNT0RFRz0+QEhKSU9RUEpNTEZIR0ZIR0VHRk5QT0hKSUFGR0BFRkRISUFGRz5CRDtAQUJHSEdMTU9PTVVVU1VWUU9QSTg5NDg4Nj09Pz49RDg4QS8wNjg5PTY3OTk7OkFEQj4/QTEyNjM3PSQoLSwwNigrMSotMygrMSotMzAxNDs7O0xMSU5OTEhIRkBAPj09Oj8/PUhIRkpKSlVVVVRUVFFRUT09PUdHR01NTUlJSUBCQT0/Pjk7OkhKST9BQD5AP0RGRUJFREFEQkJFREVHREdJRklMSjs9PzQ2OTEyODM0Ojc4Oz5APz5APUdJRUVHREJFREFEQj4/QTk6PTEyNDM0NzY3OTg5Ozg5OzY3Ojc4Pjs9Qjg5PTg5O0RFR05PU0RFSjEyODc4Oz0+QUFCRURGRVtdXFBRVEJERzk6PkZHSk1OUFNVUVdaVV1fW1BTT0xNTz9ARDs9QDo7Pz9ARD4/Qjc4Ozk6PkFCRklKTk1OUEdISlBRVEBBREdISklKTUdISkdISlBTUU9RUE5QT0VHRkdJSEVHRk1PTk1PTkZKTERISUZKTERISTtAQTtAQUJHSEVJSlNTUFVVU1BRTUdIQTM0MDk5Nzs7PjIxOCsrNCwtMzc4OzY3OTM2ND5APz4/QTQ2OS0xNyYqMi8yOiwwOCUpMSUpMSotNjIzOVBQUFFRT0JCQDQ0Mj09Oj8/PTs7OT09OklJSU9PT1VVVVNTUzs7O0FBQUlJSUREREBCQT0/Pj5AP0pNTEVHRj9BQD9BQD9BQDk7Oj9BQEdJRkxOSklMSjs9PzQ2OTEyOC8wNjAxNDk7Ojo9OUZIREJFQT0/Pjg6OTk6PTY3OTAxMzM0NzQ2ODc4Ojc4OjQ2OTM0Ojg5PzQ2OTY3OkhJTUlKTj9ARjY3PTM0ODg5PT9AQkRGRVNVVFBRVERFSD4/QkdITElKTU9RTlNVUFpcV1VXVE9QUz9ARDk6QDk6QD4/RTo7QTc4Pjg5Pz0+REBBRUFCRUFCRU5PUUVGSEVGSEZHSUpMTkxNT0dJSEdJSE1PTkpNTEdJSEFEQkZIR0hKSUJHSD9ERUBFRj1BQjk+PztAQUJHSEJHSE5OTFFTTk9QSUZHQDo7Nzo6ODc3OSwrMiUmLCwtMzQ2OTEyNDY4Nz4/QTs9PzAxNCksNCMmLyYqMiIlLSIlLSMmLCotMzM0OERGRUxMSUZGRD8/PTg4NkREQUxMSUdHRUJCQk5OTlBQTlRUUTs7OUlJR0BAQD4+Pjk7OkBCQUdJSFBTUU9RUEVHRkRGRT9BQD0/PkJFRExOSlFUUEdJSDk6PTEyNi0vNDY3PTIzNzo9Oz0/O0BCPz0/Ozk7Ojc4Ojg5PTY3OjAxNDM0ODEyNjM0ODM0ODEyNjIyOzMzPTEyODc4O0lKTk5PU0RFSjc4PjEyODg5PT0+QEFCRVNUVlZXWkpMTkZHSk5PU0hJTElMSEpNSFFUT1RWU01PTjs9Pzk6PjY3PTo7QTk6QDEyODc4Pj4/RUFCSD4/Qj9AQkhJTEFCRTg5Oz9AQkpMTklKTUZIR0pNTExOTVFUU05QT0FEQkZIR0lKTURIST9ERT9ERTtAQTc7PTtAQUJHSEBFRlBRTU1OR09QSVNUTU1OSUJCQj07QDQzOikqMCgpLzc4OzM0NzQ2ODk6PTc4Oy8wNioqNiUlMSQkLSUlLygpLzEyNjIzNjAxMz5AP0JFREBCQTk7Ojs+PUFEQkZIR0xOTVBQUEhIRlFTTlFTTkhJRUxNSEhIRkJCQjc4OkBBREZIRU1PTExOSkpNSUlKTUBBRD4/QURGRU9RTk5QTUFEQjc4OjM0OiwsNjEyODEyNjg5Ozk7Ojo9Ozg5Ozc4Ozc4PjE0OjE0PTAzOy8yPS0xOzY5QTI2PjAzOzAwOTAwOS8wNjc4O0dISkpMT0BBRzM0OjEyODk6QD9ARD0+QUZHSlZXWkVGSEVGSEBAQkxMTkZGRklJR1VVU1VVU05OTEdHR0VGSDg5PTM0OjY3PTExOjg4QTY2Pzg4QT9AREVGSEhJTEJERj0+QD0+QEdISkVGSEVGSEJERklKTU5PUUdISkdISkVGSEhJTDo7Pz0+QT4/Qjo7Pzk6Pjk6Pj0+QTo7P1BRSklKRFpbVE1OSUREQT09PTc2OjIxOCorMSwtMzo7PzIzNi0vMTM0ODEyOCgoMSkpNCUlMiUlMSYmMCYoLS0vMjQ2ODY4Nz9BQDo9Ozc5ODc5OD9BQD9BQEJFREFEQj8/P0dHR0pMR09QSTg5Mj4/Oj8/Pzs7Pjg5PUFCRUZIRU5QTFFUT0dJRkZHSUZHSkJERkFCRUdJSE5QTUpNTD0+QDIzOSwsNjM0OjY3PTk6PjIzNj9AQj9ARDs9QjQ2OzM3PywwOistOjAyPzEzQDc5RjE0PywwOC0tOTIyOzAxNzIzNzo7PlFTVkZHTTY3PTM0Ojc4PkVGTD0+REJER05PU0dISj4/QT8/QUxMTkhISEZGRlNTUFdXVVBRTUVFQk5PUT9ARDM0OjIzOS8vODY2PzExPT4+Rz9ARERFR0dISkBBRDo7Pj0+QERFR0RFRz4/QT0+QEhJTE5PUU1OUEZHSUFCRUdISkRFSEBBRTs9QDc4Oz0+QT0+QT4/Qj0+QVFTTEdIQVdYUU9QTEJCQElJSTY0OTEwNyssMjEyOD4/QjAxMyssLzEyNi8wNiUlLyYmMiQkMSUlMSkpMiUmLCorLzk6PT5APz5APzk7OjM2NDI0Mzo9O0JFRD5APz5AP0dHSUdHR05OTExNSEFCPklJRzs7Oz09Pzk6Pj4/QT5APURGQVNVUEBCPzs9P0BBRUBBRDk6PTo9O0dJRk5QTz9AQjAxNy8vODM0Ojg5Pz0+QTg5Oz4/QTg5PTM0OjM0OjI2PisvOSosOS8xPjEzQDc5RjE0PywwODIyPi8vOCwtMzM0OD9AQk9QVEBBRzIzOTIzOTY3PURFSjs9QkFCRk1OUUhJTDs9P0pKTUlJTEZGRkhISFZWVFRUUU1OSUhIRlhbWldYXDg5PTY3PTM0OjY2PzExOjg4QT0+QUBBRUFCRjo7Pzc4Ozs9QD9AREFCRj9AQj4/QUhJTE5PUU1OUEZHSUFCRUdISj9ARDk6PjY3OjQ2OUJER0VGSUJER0RFSExNRlFTTFRVTk5PSk1NSkBAQDMyNy8tNCgpLzEyOD0+QSkqLCorLS8wMywtMyQkLSUlMSQkMSYmMioqMyMkKiYoKzs9P0JFREVHRjY3OS8wMjY3OTY3OTo7PkFCRUBBRERERkRERk5OTFBQTk9PTU1NSkpKTUFBRD4/QkRFRz5APT5AO05QTDo9OTEyNDAxNEBBRD4/QTo9O0JFQUxOTT0+QC0vNDAwOTY3PTIzOTM0ODEyNDc4Ojc4OzY3PTM0Oi8yOi0xOywvOystOi0wPTY4RTI2QDAzOzExPTExOiwtMzAxNEZHSVNUV0lKUDY3PS0vNDY3PT0+RDk6QEFCRlFTVklKTT0+QD4+QEBAQkVFRUZGRlRUUVZWVE9QTEZGRFpcW2FiZEFCRjIzNy8wNjEyODk5QjY3PUJESUVGSUVGST0+QTQ2OTo7Pzs9QEBBRT9AQj0+QERFR0hJTEdISkdISkVGSEhJTEdITD0+QTQ2OTEyNj4/QkJER0BBRT9ARFNUTUlKRFFTTFZXU0VFQkBAQDk4PS8tNCgpLzEyODs9QCssLyorLSkqLSMkKiQkLSUlMSMjMCQkMCYmMCYoLSkqLUJERklMSjIzNi8wMywtMTM0ODs9QDY3Ojc4OzM0ODk4PT09P0dHR0xMTEFBQT8/PzMzNi0sMSssMDIzNkFEQEhKRlRWUUdJRjEyNC8wMz0+QD4/QUFEQkVHREJFRDg5OywtMysrNDEyODQ2Ozc4OzAxMzc4Ojg5PTg5Pzc4PiwwOCgrNi0wPTAyPystOistOisvOSsvNy0tOSwsNiwtMzQ2OUxNT0xNUE5PVTo7QS8wNjQ2Ozg5Pzk6QEBBRUlKTkBBRDk6PUFBRD09Pzo6OkFBQVRUUVtbWExNSExMSVpcW1RVV01OUD0+QTEyNi8wNiorMTk6QDs9Qjs9Qj4/RTQ2OzY3PT0+RD9ARj4/Qjs9Pzs9P0JERkVGSElKTUlKTUhJTEZHSURFR0VGSDY3OTEyND9AQkhJTEhJTERFRz9AOUBBOlBRSlVWUVRUUUZGRjQzOCgmLSgpLzc4PkJERy8wMikqLCkqLSMkKiUlLyMjLyIiLyQkMCoqMygpLzAxNEdISlRVVzg5PS8wMyssMC0vMi8wMzAxNDo7PzIzNywrMDs6P0JCRUhISEVFRUBAQjc2OjAvMzQ2OTk6PTo9OT9BPU9RTUxOSjo7Pjc4Ozg5Ozs9Pz5APz0/Oz5APzc4Oi0vNCwsNjQ2OzQ2OzQ2OSwtMDg5OzY3OjEyOC0vNCsvNyksNywvOywvOyosOSosOSotOCotNi0tOSwsNiYoLTk6PkpMTkpMT1FTWExNUzAxNzIzOTk6QDQ2O0JER0RFSD4/QTs9P0hISjk5Ozg4OD4+Pk1NSk9PTUlKRk1OSVBTT1RWVVVWWE5PUTo7PzAxNC8wNjQ2Ozg5PzY3PTc4PjM0OjAxNzg5Pzs9Qjo7QTk6PjQ2OD0+QEVGSEdISkdISkVGSEJERkRFR0FCRTk6PTg5Oz0+QERFR0VGSD4/QTo7ND4/OFBRSldYVE1NSkJCQjMyNyUkKyorMT9ARkpMTzM0NywtMCwtMSkqMCsrNCgoMyQkMSoqNjY2PyQlKzEyNkJERlNUVjo7Py0vNCwtMyssMjIzOS0vNDAxNykqMDAvNjk4PUhISkhISEVFRT8/QTk4PS8tNDo7Pzs9Pzg6Nzk7N05QTEpNSTk6PTY3Ojg5O0BBREBCQTk7ODg6OTY3OS8wNi0tNzQ2OzEyODEyNiwtMDc4OjQ2OTk6QEFCSCsvNyksNywvOygqNykrOCkrOCksNyksNCkpNDAwOSssMjc4O0JERkZHSkZHTTo7QTk6QDAxNzIzOTM0Oj4/QkBBRTs9Pzo7Pj4+QDo6PT4+Pj09PUlJR09PTVNUT1FTTkxOSlFUU05QT0lKTTQ2OS0vMjEyNjs9Qjo7QTY2PzMzPTIyOzExOjc3QDs7RTs9QkBBRTk6PTs9P0BBRD9AQkRFR0dISklKTUhKST0/PjY4Nzc5OD0/PkFEQkZIR0FEQj4/ODo7NElKRFRVUElJR0hISDo5PiYlLCssMkRFSlFTVjc4OjEyNDIzNy8wNjIyOyUlMSIiLyoqNjk5QigpLzc4Oz9AQlFTVTk6PissMi8wNiwtMywtMzk6QDg5PzY3PTQzOjo5PkFBREhISEJCQjo6PTc2OisqMTg5PTc4Ojs+Ojo9OFFUT0VHRC0vMSssMDIzNj4/QT5APzI0MTM2NDQ2ODAxNy0tNzAxNywtMzAxNC8wMjIzNjc4Ozc4PjM0OiotNiotOCstOiQmMygqNygqNygrNigrMysrNykpMiwtMzk6PkdISklKTk9QVlFTWEBBRzAxNyorMTQ2Ozs9QD9ARDg5Ozg5Oz8/QT09Pzc3Nzs7O0ZGRE9PTVRVUFBRTUxOSlNVUUxOTUdISi8wMy0vMissMDs9Qj8/SDY2PzIyOzMzPTMzPTIyOzMzPTY3PTc4OzQ2ODk6PTk6PUBBREVGSEhJTElKTURGRTQ3NjM2NDg6OUBCQUBCQUZIR0hKSQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL3Z3ZWJwLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy92d2VicC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3OWM3MmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy92d2VicC5jCkBAIC0wLDAgKzEsNTk3IEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gIFNpbXBsZSBPcGVuR0wtYmFzZWQgV2ViUCBmaWxlIHZpZXdlci4KKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJ3ZWJwL2NvbmZpZy5oIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fdW5peF9fKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCisjZGVmaW5lIF9QT1NJWF9DX1NPVVJDRSAyMDAxMTJMICAvLyBmb3Igc2V0ZW52CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZiBkZWZpbmVkKFdFQlBfSEFWRV9HTCkKKworI2lmIGRlZmluZWQoSEFWRV9HTFVUX0dMVVRfSCkKKyNpbmNsdWRlIDxHTFVUL2dsdXQuaD4KKyNlbHNlCisjaW5jbHVkZSA8R0wvZ2x1dC5oPgorI2lmZGVmIEZSRUVHTFVUCisjaW5jbHVkZSA8R0wvZnJlZWdsdXQuaD4KKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBXRUJQX0hBVkVfUUNNUworI2luY2x1ZGUgPHFjbXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAid2VicC9kZWNvZGUuaCIKKyNpbmNsdWRlICJ3ZWJwL2RlbXV4LmgiCisKKyNpbmNsdWRlICIuLi9leGFtcGxlcy9leGFtcGxlX3V0aWwuaCIKKyNpbmNsdWRlICIuLi9pbWFnZWlvL2ltYWdlaW9fdXRpbC5oIgorCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVIgPCAxOTAwCisjZGVmaW5lIHNucHJpbnRmIF9zbnByaW50ZgorI2VuZGlmCisKKy8vIFVuZm9ydHVuYXRlIGdsb2JhbCB2YXJpYWJsZXMuIEdhdGhlcmVkIGludG8gYSBzdHJ1Y3QgZm9yIGNvbWZvcnQuCitzdGF0aWMgc3RydWN0IHsKKyAgaW50IGhhc19hbmltYXRpb247CisgIGludCBoYXNfY29sb3JfcHJvZmlsZTsKKyAgaW50IGRvbmU7CisgIGludCBkZWNvZGluZ19lcnJvcjsKKyAgaW50IHByaW50X2luZm87CisgIGludCBvbmx5X2RlbHRhczsKKyAgaW50IHVzZV9jb2xvcl9wcm9maWxlOworCisgIGludCBjYW52YXNfd2lkdGgsIGNhbnZhc19oZWlnaHQ7CisgIGludCBsb29wX2NvdW50OworICB1aW50MzJfdCBiZ19jb2xvcjsKKworICBjb25zdCBjaGFyKiBmaWxlX25hbWU7CisgIFdlYlBEYXRhIGRhdGE7CisgIFdlYlBEZWNvZGVyQ29uZmlnIGNvbmZpZzsKKyAgY29uc3QgV2ViUERlY0J1ZmZlciogcGljOworICBXZWJQRGVtdXhlciogZG11eDsKKyAgV2ViUEl0ZXJhdG9yIGN1cnJfZnJhbWU7CisgIFdlYlBJdGVyYXRvciBwcmV2X2ZyYW1lOworICBXZWJQQ2h1bmtJdGVyYXRvciBpY2NwOworICBpbnQgdmlld3BvcnRfd2lkdGgsIHZpZXdwb3J0X2hlaWdodDsKK30ga1BhcmFtczsKKworc3RhdGljIHZvaWQgQ2xlYXJQcmV2aW91c1BpYyh2b2lkKSB7CisgIFdlYlBGcmVlRGVjQnVmZmVyKChXZWJQRGVjQnVmZmVyKilrUGFyYW1zLnBpYyk7CisgIGtQYXJhbXMucGljID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgQ2xlYXJQYXJhbXModm9pZCkgeworICBDbGVhclByZXZpb3VzUGljKCk7CisgIFdlYlBEYXRhQ2xlYXIoJmtQYXJhbXMuZGF0YSk7CisgIFdlYlBEZW11eFJlbGVhc2VJdGVyYXRvcigma1BhcmFtcy5jdXJyX2ZyYW1lKTsKKyAgV2ViUERlbXV4UmVsZWFzZUl0ZXJhdG9yKCZrUGFyYW1zLnByZXZfZnJhbWUpOworICBXZWJQRGVtdXhSZWxlYXNlQ2h1bmtJdGVyYXRvcigma1BhcmFtcy5pY2NwKTsKKyAgV2ViUERlbXV4RGVsZXRlKGtQYXJhbXMuZG11eCk7CisgIGtQYXJhbXMuZG11eCA9IE5VTEw7Cit9CisKKy8vIFNldHMgdGhlIHByZXZpb3VzIGZyYW1lIHRvIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBjYW52YXMgYW5kIGhhcyBpdCBkaXNwb3NlCisvLyB0byBiYWNrZ3JvdW5kIHRvIGNhdXNlIHRoZSBjYW52YXMgdG8gYmUgY2xlYXJlZC4KK3N0YXRpYyB2b2lkIENsZWFyUHJldmlvdXNGcmFtZSh2b2lkKSB7CisgIFdlYlBJdGVyYXRvciogY29uc3QgcHJldiA9ICZrUGFyYW1zLnByZXZfZnJhbWU7CisgIHByZXYtPndpZHRoID0ga1BhcmFtcy5jYW52YXNfd2lkdGg7CisgIHByZXYtPmhlaWdodCA9IGtQYXJhbXMuY2FudmFzX2hlaWdodDsKKyAgcHJldi0+eF9vZmZzZXQgPSBwcmV2LT55X29mZnNldCA9IDA7CisgIHByZXYtPmRpc3Bvc2VfbWV0aG9kID0gV0VCUF9NVVhfRElTUE9TRV9CQUNLR1JPVU5EOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29sb3IgcHJvZmlsZSBoYW5kbGluZworc3RhdGljIGludCBBcHBseUNvbG9yUHJvZmlsZShjb25zdCBXZWJQRGF0YSogY29uc3QgcHJvZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUERlY0J1ZmZlciogY29uc3QgcmdiYSkgeworI2lmZGVmIFdFQlBfSEFWRV9RQ01TCisgIGludCBpLCBvayA9IDA7CisgIHVpbnQ4X3QqIGxpbmU7CisgIHVpbnQ4X3QgbWFqb3JfcmV2aXNpb247CisgIHFjbXNfcHJvZmlsZSogaW5wdXRfcHJvZmlsZSA9IE5VTEw7CisgIHFjbXNfcHJvZmlsZSogb3V0cHV0X3Byb2ZpbGUgPSBOVUxMOworICBxY21zX3RyYW5zZm9ybSogdHJhbnNmb3JtID0gTlVMTDsKKyAgY29uc3QgcWNtc19kYXRhX3R5cGUgaW5wdXRfdHlwZSA9IFFDTVNfREFUQV9SR0JBXzg7CisgIGNvbnN0IHFjbXNfZGF0YV90eXBlIG91dHB1dF90eXBlID0gUUNNU19EQVRBX1JHQkFfODsKKyAgY29uc3QgcWNtc19pbnRlbnQgaW50ZW50ID0gUUNNU19JTlRFTlRfREVGQVVMVDsKKworICBpZiAocHJvZmlsZSA9PSBOVUxMIHx8IHJnYmEgPT0gTlVMTCkgcmV0dXJuIDA7CisgIGlmIChwcm9maWxlLT5ieXRlcyA9PSBOVUxMIHx8IHByb2ZpbGUtPnNpemUgPCAxMCkgcmV0dXJuIDE7CisgIG1ham9yX3JldmlzaW9uID0gcHJvZmlsZS0+Ynl0ZXNbOF07CisKKyAgcWNtc19lbmFibGVfaWNjdjQoKTsKKyAgaW5wdXRfcHJvZmlsZSA9IHFjbXNfcHJvZmlsZV9mcm9tX21lbW9yeShwcm9maWxlLT5ieXRlcywgcHJvZmlsZS0+c2l6ZSk7CisgIC8vIHFjbXNfcHJvZmlsZV9pc19ib2d1cygpIGlzIGJyb2tlbiB3aXRoIElDQ3Y0LgorICBpZiAoaW5wdXRfcHJvZmlsZSA9PSBOVUxMIHx8CisgICAgICAobWFqb3JfcmV2aXNpb24gPCA0ICYmIHFjbXNfcHJvZmlsZV9pc19ib2d1cyhpbnB1dF9wcm9maWxlKSkpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkNvbG9yIHByb2ZpbGUgaXMgYm9ndXMhXG4iKTsKKyAgICBnb3RvIEVycm9yOworICB9CisKKyAgb3V0cHV0X3Byb2ZpbGUgPSBxY21zX3Byb2ZpbGVfc1JHQigpOworICBpZiAob3V0cHV0X3Byb2ZpbGUgPT0gTlVMTCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgY3JlYXRpbmcgb3V0cHV0IGNvbG9yIHByb2ZpbGUhXG4iKTsKKyAgICBnb3RvIEVycm9yOworICB9CisKKyAgcWNtc19wcm9maWxlX3ByZWNhY2hlX291dHB1dF90cmFuc2Zvcm0ob3V0cHV0X3Byb2ZpbGUpOworICB0cmFuc2Zvcm0gPSBxY21zX3RyYW5zZm9ybV9jcmVhdGUoaW5wdXRfcHJvZmlsZSwgaW5wdXRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9wcm9maWxlLCBvdXRwdXRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVudCk7CisgIGlmICh0cmFuc2Zvcm0gPT0gTlVMTCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgY3JlYXRpbmcgY29sb3IgdHJhbnNmb3JtIVxuIik7CisgICAgZ290byBFcnJvcjsKKyAgfQorCisgIGxpbmUgPSByZ2JhLT51LlJHQkEucmdiYTsKKyAgZm9yIChpID0gMDsgaSA8IHJnYmEtPmhlaWdodDsgKytpLCBsaW5lICs9IHJnYmEtPnUuUkdCQS5zdHJpZGUpIHsKKyAgICBxY21zX3RyYW5zZm9ybV9kYXRhKHRyYW5zZm9ybSwgbGluZSwgbGluZSwgcmdiYS0+d2lkdGgpOworICB9CisgIG9rID0gMTsKKworIEVycm9yOgorICBpZiAoaW5wdXRfcHJvZmlsZSAhPSBOVUxMKSBxY21zX3Byb2ZpbGVfcmVsZWFzZShpbnB1dF9wcm9maWxlKTsKKyAgaWYgKG91dHB1dF9wcm9maWxlICE9IE5VTEwpIHFjbXNfcHJvZmlsZV9yZWxlYXNlKG91dHB1dF9wcm9maWxlKTsKKyAgaWYgKHRyYW5zZm9ybSAhPSBOVUxMKSBxY21zX3RyYW5zZm9ybV9yZWxlYXNlKHRyYW5zZm9ybSk7CisgIHJldHVybiBvazsKKyNlbHNlCisgICh2b2lkKXByb2ZpbGU7CisgICh2b2lkKXJnYmE7CisgIHJldHVybiAxOworI2VuZGlmICAvLyBXRUJQX0hBVkVfUUNNUworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRmlsZSBkZWNvZGluZworCitzdGF0aWMgaW50IERlY29kZSh2b2lkKSB7ICAgLy8gRmlsbHMga1BhcmFtcy5jdXJyX2ZyYW1lCisgIGNvbnN0IFdlYlBJdGVyYXRvciogY29uc3QgY3VyciA9ICZrUGFyYW1zLmN1cnJfZnJhbWU7CisgIFdlYlBEZWNvZGVyQ29uZmlnKiBjb25zdCBjb25maWcgPSAma1BhcmFtcy5jb25maWc7CisgIFdlYlBEZWNCdWZmZXIqIGNvbnN0IG91dHB1dF9idWZmZXIgPSAmY29uZmlnLT5vdXRwdXQ7CisgIGludCBvayA9IDA7CisKKyAgQ2xlYXJQcmV2aW91c1BpYygpOworICBvdXRwdXRfYnVmZmVyLT5jb2xvcnNwYWNlID0gTU9ERV9SR0JBOworICBvayA9IChXZWJQRGVjb2RlKGN1cnItPmZyYWdtZW50LmJ5dGVzLCBjdXJyLT5mcmFnbWVudC5zaXplLAorICAgICAgICAgICAgICAgICAgIGNvbmZpZykgPT0gVlA4X1NUQVRVU19PSyk7CisgIGlmICghb2spIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkRlY29kaW5nIG9mIGZyYW1lICMlZCBmYWlsZWQhXG4iLCBjdXJyLT5mcmFtZV9udW0pOworICB9IGVsc2UgeworICAgIGtQYXJhbXMucGljID0gb3V0cHV0X2J1ZmZlcjsKKyAgICBpZiAoa1BhcmFtcy51c2VfY29sb3JfcHJvZmlsZSkgeworICAgICAgb2sgPSBBcHBseUNvbG9yUHJvZmlsZSgma1BhcmFtcy5pY2NwLmNodW5rLCBvdXRwdXRfYnVmZmVyKTsKKyAgICAgIGlmICghb2spIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJBcHBseWluZyBjb2xvciBwcm9maWxlIHRvIGZyYW1lICMlZCBmYWlsZWQhXG4iLAorICAgICAgICAgICAgICAgIGN1cnItPmZyYW1lX251bSk7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBvazsKK30KKworc3RhdGljIHZvaWQgZGVjb2RlX2NhbGxiYWNrKGludCB3aGF0KSB7CisgIGlmICh3aGF0ID09IDAgJiYgIWtQYXJhbXMuZG9uZSkgeworICAgIGludCBkdXJhdGlvbiA9IDA7CisgICAgaWYgKGtQYXJhbXMuZG11eCAhPSBOVUxMKSB7CisgICAgICBXZWJQSXRlcmF0b3IqIGNvbnN0IGN1cnIgPSAma1BhcmFtcy5jdXJyX2ZyYW1lOworICAgICAgaWYgKCFXZWJQRGVtdXhOZXh0RnJhbWUoY3VycikpIHsKKyAgICAgICAgV2ViUERlbXV4UmVsZWFzZUl0ZXJhdG9yKGN1cnIpOworICAgICAgICBpZiAoV2ViUERlbXV4R2V0RnJhbWUoa1BhcmFtcy5kbXV4LCAxLCBjdXJyKSkgeworICAgICAgICAgIC0ta1BhcmFtcy5sb29wX2NvdW50OworICAgICAgICAgIGtQYXJhbXMuZG9uZSA9IChrUGFyYW1zLmxvb3BfY291bnQgPT0gMCk7CisgICAgICAgICAgaWYgKGtQYXJhbXMuZG9uZSkgcmV0dXJuOworICAgICAgICAgIENsZWFyUHJldmlvdXNGcmFtZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGtQYXJhbXMuZGVjb2RpbmdfZXJyb3IgPSAxOworICAgICAgICAgIGtQYXJhbXMuZG9uZSA9IDE7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9CisgICAgICBkdXJhdGlvbiA9IGN1cnItPmR1cmF0aW9uOworICAgICAgLy8gQmVoYXZpb3IgY29waWVkIGZyb20gQ2hyb21lLCBjZjoKKyAgICAgIC8vIGh0dHBzOi8vY3MuY2hyb21pdW0ub3JnL2Nocm9taXVtL3NyYy90aGlyZF9wYXJ0eS9XZWJLaXQvU291cmNlLworICAgICAgLy8gcGxhdGZvcm0vZ3JhcGhpY3MvRGVmZXJyZWRJbWFnZURlY29kZXIuY3BwPworICAgICAgLy8gcmNsPWI0YzMzMDQ5ZjA5NmNkMjgzZjMyYmU5YTU4YjlhOWU3NjgyMjdjMjYmbD0yNDYKKyAgICAgIGlmIChkdXJhdGlvbiA8PSAxMCkgZHVyYXRpb24gPSAxMDA7CisgICAgfQorICAgIGlmICghRGVjb2RlKCkpIHsKKyAgICAgIGtQYXJhbXMuZGVjb2RpbmdfZXJyb3IgPSAxOworICAgICAga1BhcmFtcy5kb25lID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgZ2x1dFBvc3RSZWRpc3BsYXkoKTsKKyAgICAgIGdsdXRUaW1lckZ1bmMoZHVyYXRpb24sIGRlY29kZV9jYWxsYmFjaywgd2hhdCk7CisgICAgfQorICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDYWxsYmFja3MKKworc3RhdGljIHZvaWQgSGFuZGxlS2V5KHVuc2lnbmVkIGNoYXIga2V5LCBpbnQgcG9zX3gsIGludCBwb3NfeSkgeworICAodm9pZClwb3NfeDsKKyAgKHZvaWQpcG9zX3k7CisgIGlmIChrZXkgPT0gJ3EnIHx8IGtleSA9PSAnUScgfHwga2V5ID09IDI3IC8qIEVzYyAqLykgeworI2lmZGVmIEZSRUVHTFVUCisgICAgZ2x1dExlYXZlTWFpbkxvb3AoKTsKKyNlbHNlCisgICAgQ2xlYXJQYXJhbXMoKTsKKyAgICBleGl0KDApOworI2VuZGlmCisgIH0gZWxzZSBpZiAoa2V5ID09ICdjJykgeworICAgIGlmIChrUGFyYW1zLmhhc19jb2xvcl9wcm9maWxlICYmICFrUGFyYW1zLmRlY29kaW5nX2Vycm9yKSB7CisgICAgICBrUGFyYW1zLnVzZV9jb2xvcl9wcm9maWxlID0gMSAtIGtQYXJhbXMudXNlX2NvbG9yX3Byb2ZpbGU7CisKKyAgICAgIGlmIChrUGFyYW1zLmhhc19hbmltYXRpb24pIHsKKyAgICAgICAgLy8gUmVzdGFydCB0aGUgY29tcGxldGVkIGFuaW1hdGlvbiB0byBwaWNrdXAgdGhlIGNvbG9yIHByb2ZpbGUgY2hhbmdlLgorICAgICAgICBpZiAoa1BhcmFtcy5kb25lICYmIGtQYXJhbXMubG9vcF9jb3VudCA9PSAwKSB7CisgICAgICAgICAga1BhcmFtcy5sb29wX2NvdW50ID0KKyAgICAgICAgICAgICAgKGludClXZWJQRGVtdXhHZXRJKGtQYXJhbXMuZG11eCwgV0VCUF9GRl9MT09QX0NPVU5UKSArIDE7CisgICAgICAgICAga1BhcmFtcy5kb25lID0gMDsKKyAgICAgICAgICAvLyBTdGFydCB0aGUgZGVjb2RlIGxvb3AgaW1tZWRpYXRlbHkuCisgICAgICAgICAgZ2x1dFRpbWVyRnVuYygwLCBkZWNvZGVfY2FsbGJhY2ssIDApOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBEZWNvZGUoKTsKKyAgICAgICAgZ2x1dFBvc3RSZWRpc3BsYXkoKTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSBpZiAoa2V5ID09ICdpJykgeworICAgIC8vIE5vdGU6IGRvZXNuJ3QgaGFuZGxlIHJlZnJlc2ggb2YgYW5pbWF0aW9uJ3MgbGFzdC1mcmFtZSAoaXQncyBxdWl0ZQorICAgIC8vIG1vcmUgaW52b2x2ZWQgdG8gZG8sIHNpbmNlIHlvdSBuZWVkIHRvIHNhdmUgdGhlIHByZXZpb3VzIGZyYW1lKS4KKyAgICBrUGFyYW1zLnByaW50X2luZm8gPSAxIC0ga1BhcmFtcy5wcmludF9pbmZvOworICAgIGlmICgha1BhcmFtcy5oYXNfYW5pbWF0aW9uKSBDbGVhclByZXZpb3VzRnJhbWUoKTsKKyAgICBnbHV0UG9zdFJlZGlzcGxheSgpOworICB9IGVsc2UgaWYgKGtleSA9PSAnZCcpIHsKKyAgICBrUGFyYW1zLm9ubHlfZGVsdGFzID0gMSAtIGtQYXJhbXMub25seV9kZWx0YXM7CisgICAgZ2x1dFBvc3RSZWRpc3BsYXkoKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBIYW5kbGVSZXNoYXBlKGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAvLyBOb3RlOiByZXNoYXBlIGRvZXNuJ3QgcHJlc2VydmUgYXNwZWN0IHJhdGlvLCBhbmQgbWlnaHQKKyAgLy8gYmUgaGFuZGxpbmcgbGFyZ2VyLXRoYW4tc2NyZWVuIHBpY3R1cmVzIGluY29ycmVjdGx5LgorICBnbFZpZXdwb3J0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOworICBnbE1hdHJpeE1vZGUoR0xfUFJPSkVDVElPTik7CisgIGdsTG9hZElkZW50aXR5KCk7CisgIGdsTWF0cml4TW9kZShHTF9NT0RFTFZJRVcpOworICBnbExvYWRJZGVudGl0eSgpOworICBrUGFyYW1zLnZpZXdwb3J0X3dpZHRoID0gd2lkdGg7CisgIGtQYXJhbXMudmlld3BvcnRfaGVpZ2h0ID0gaGVpZ2h0OworICBpZiAoIWtQYXJhbXMuaGFzX2FuaW1hdGlvbikgQ2xlYXJQcmV2aW91c0ZyYW1lKCk7Cit9CisKK3N0YXRpYyB2b2lkIFByaW50U3RyaW5nKGNvbnN0IGNoYXIqIGNvbnN0IHRleHQpIHsKKyAgdm9pZCogY29uc3QgZm9udCA9IEdMVVRfQklUTUFQXzlfQllfMTU7CisgIGludCBpOworICBmb3IgKGkgPSAwOyB0ZXh0W2ldOyArK2kpIHsKKyAgICBnbHV0Qml0bWFwQ2hhcmFjdGVyKGZvbnQsIHRleHRbaV0pOworICB9Cit9CisKK3N0YXRpYyBmbG9hdCBHZXRDb2xvcmYodWludDMyX3QgY29sb3IsIGludCBzaGlmdCkgeworICByZXR1cm4gKGNvbG9yID4+IHNoaWZ0KSAvIDI1NS5mOworfQorCitzdGF0aWMgdm9pZCBEcmF3Q2hlY2tlckJvYXJkKHZvaWQpIHsKKyAgY29uc3QgaW50IHNxdWFyZV9zaXplID0gODsgIC8vIG11c3QgYmUgYSBwb3dlciBvZiAyCisgIGludCB4LCB5OworICBHTGludCB2aWV3cG9ydFs0XTsgIC8vIHgsIHksIHdpZHRoLCBoZWlnaHQKKworICBnbFB1c2hNYXRyaXgoKTsKKworICBnbEdldEludGVnZXJ2KEdMX1ZJRVdQT1JULCB2aWV3cG9ydCk7CisgIC8vIHNoaWZ0IHRvIGludGVnZXIgY29vcmRpbmF0ZXMgd2l0aCAoMCwwKSBiZWluZyB0b3AtbGVmdC4KKyAgZ2xPcnRobygwLCB2aWV3cG9ydFsyXSwgdmlld3BvcnRbM10sIDAsIC0xLCAxKTsKKyAgZm9yICh5ID0gMDsgeSA8IHZpZXdwb3J0WzNdOyB5ICs9IHNxdWFyZV9zaXplKSB7CisgICAgZm9yICh4ID0gMDsgeCA8IHZpZXdwb3J0WzJdOyB4ICs9IHNxdWFyZV9zaXplKSB7CisgICAgICBjb25zdCBHTHVieXRlIGNvbG9yID0gMTI4ICsgNjQgKiAoISgoeCArIHkpICYgc3F1YXJlX3NpemUpKTsKKyAgICAgIGdsQ29sb3IzdWIoY29sb3IsIGNvbG9yLCBjb2xvcik7CisgICAgICBnbFJlY3RpKHgsIHksIHggKyBzcXVhcmVfc2l6ZSwgeSArIHNxdWFyZV9zaXplKTsKKyAgICB9CisgIH0KKyAgZ2xQb3BNYXRyaXgoKTsKK30KKworc3RhdGljIHZvaWQgSGFuZGxlRGlzcGxheSh2b2lkKSB7CisgIGNvbnN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IHBpYyA9IGtQYXJhbXMucGljOworICBjb25zdCBXZWJQSXRlcmF0b3IqIGNvbnN0IGN1cnIgPSAma1BhcmFtcy5jdXJyX2ZyYW1lOworICBXZWJQSXRlcmF0b3IqIGNvbnN0IHByZXYgPSAma1BhcmFtcy5wcmV2X2ZyYW1lOworICBHTGZsb2F0IHhvZmYsIHlvZmY7CisgIGlmIChwaWMgPT0gTlVMTCkgcmV0dXJuOworICBnbFB1c2hNYXRyaXgoKTsKKyAgZ2xQaXhlbFpvb20oKEdMZmxvYXQpKCsxLiAvIGtQYXJhbXMuY2FudmFzX3dpZHRoICoga1BhcmFtcy52aWV3cG9ydF93aWR0aCksCisgICAgICAgICAgICAgIChHTGZsb2F0KSgtMS4gLyBrUGFyYW1zLmNhbnZhc19oZWlnaHQgKiBrUGFyYW1zLnZpZXdwb3J0X2hlaWdodCkpOworICB4b2ZmID0gKEdMZmxvYXQpKDIuICogY3Vyci0+eF9vZmZzZXQgLyBrUGFyYW1zLmNhbnZhc193aWR0aCk7CisgIHlvZmYgPSAoR0xmbG9hdCkoMi4gKiBjdXJyLT55X29mZnNldCAvIGtQYXJhbXMuY2FudmFzX2hlaWdodCk7CisgIGdsUmFzdGVyUG9zMmYoLTEuZiArIHhvZmYsIDEuZiAtIHlvZmYpOworICBnbFBpeGVsU3RvcmVpKEdMX1VOUEFDS19BTElHTk1FTlQsIDEpOworICBnbFBpeGVsU3RvcmVpKEdMX1VOUEFDS19ST1dfTEVOR1RILCBwaWMtPnUuUkdCQS5zdHJpZGUgLyA0KTsKKworICBpZiAoa1BhcmFtcy5vbmx5X2RlbHRhcykgeworICAgIERyYXdDaGVja2VyQm9hcmQoKTsKKyAgfSBlbHNlIGlmIChwcmV2LT5kaXNwb3NlX21ldGhvZCA9PSBXRUJQX01VWF9ESVNQT1NFX0JBQ0tHUk9VTkQgfHwKKyAgICAgIGN1cnItPmJsZW5kX21ldGhvZCA9PSBXRUJQX01VWF9OT19CTEVORCkgeworICAgIC8vIGdsU2Npc3NvcigpIHRha2VzIHdpbmRvdyBjb29yZGluYXRlcyAoMCwwIGF0IGJvdHRvbSBsZWZ0KS4KKyAgICBpbnQgd2luZG93X3gsIHdpbmRvd195OworICAgIGludCBmcmFtZV93LCBmcmFtZV9oOworICAgIGlmIChwcmV2LT5kaXNwb3NlX21ldGhvZCA9PSBXRUJQX01VWF9ESVNQT1NFX0JBQ0tHUk9VTkQpIHsKKyAgICAgIC8vIENsZWFyIHRoZSBwcmV2aW91cyBmcmFtZSByZWN0YW5nbGUuCisgICAgICB3aW5kb3dfeCA9IHByZXYtPnhfb2Zmc2V0OworICAgICAgd2luZG93X3kgPSBrUGFyYW1zLmNhbnZhc19oZWlnaHQgLSBwcmV2LT55X29mZnNldCAtIHByZXYtPmhlaWdodDsKKyAgICAgIGZyYW1lX3cgPSBwcmV2LT53aWR0aDsKKyAgICAgIGZyYW1lX2ggPSBwcmV2LT5oZWlnaHQ7CisgICAgfSBlbHNlIHsgIC8vIGN1cnItPmJsZW5kX21ldGhvZCA9PSBXRUJQX01VWF9OT19CTEVORC4KKyAgICAgIC8vIFdlIHNpbXVsYXRlIG5vLWJsZW5kaW5nIGJlaGF2aW9yIGJ5IGZpcnN0IGNsZWFyaW5nIHRoZSBjdXJyZW50IGZyYW1lCisgICAgICAvLyByZWN0YW5nbGUgKHRvIGEgY2hlY2tlci1ib2FyZCkgYW5kIHRoZW4gYWxwaGEtYmxlbmRpbmcgYWdhaW5zdCBpdC4KKyAgICAgIHdpbmRvd194ID0gY3Vyci0+eF9vZmZzZXQ7CisgICAgICB3aW5kb3dfeSA9IGtQYXJhbXMuY2FudmFzX2hlaWdodCAtIGN1cnItPnlfb2Zmc2V0IC0gY3Vyci0+aGVpZ2h0OworICAgICAgZnJhbWVfdyA9IGN1cnItPndpZHRoOworICAgICAgZnJhbWVfaCA9IGN1cnItPmhlaWdodDsKKyAgICB9CisgICAgZ2xFbmFibGUoR0xfU0NJU1NPUl9URVNUKTsKKyAgICAvLyBPbmx5IHVwZGF0ZSB0aGUgcmVxdWVzdGVkIGFyZWEsIG5vdCB0aGUgd2hvbGUgY2FudmFzLgorICAgIHdpbmRvd194ID0gd2luZG93X3ggKiBrUGFyYW1zLnZpZXdwb3J0X3dpZHRoIC8ga1BhcmFtcy5jYW52YXNfd2lkdGg7CisgICAgd2luZG93X3kgPSB3aW5kb3dfeSAqIGtQYXJhbXMudmlld3BvcnRfaGVpZ2h0IC8ga1BhcmFtcy5jYW52YXNfaGVpZ2h0OworICAgIGZyYW1lX3cgPSBmcmFtZV93ICoga1BhcmFtcy52aWV3cG9ydF93aWR0aCAvIGtQYXJhbXMuY2FudmFzX3dpZHRoOworICAgIGZyYW1lX2ggPSBmcmFtZV9oICoga1BhcmFtcy52aWV3cG9ydF9oZWlnaHQgLyBrUGFyYW1zLmNhbnZhc19oZWlnaHQ7CisgICAgZ2xTY2lzc29yKHdpbmRvd194LCB3aW5kb3dfeSwgZnJhbWVfdywgZnJhbWVfaCk7CisKKyAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOyAgLy8gdXNlIGNsZWFyIGNvbG9yCisgICAgRHJhd0NoZWNrZXJCb2FyZCgpOworCisgICAgZ2xEaXNhYmxlKEdMX1NDSVNTT1JfVEVTVCk7CisgIH0KKworICAqcHJldiA9ICpjdXJyOworCisgIGdsRHJhd1BpeGVscyhwaWMtPndpZHRoLCBwaWMtPmhlaWdodCwKKyAgICAgICAgICAgICAgIEdMX1JHQkEsIEdMX1VOU0lHTkVEX0JZVEUsCisgICAgICAgICAgICAgICAoR0x2b2lkKilwaWMtPnUuUkdCQS5yZ2JhKTsKKyAgaWYgKGtQYXJhbXMucHJpbnRfaW5mbykgeworICAgIGNoYXIgdG1wWzMyXTsKKworICAgIGdsQ29sb3I0ZigwLjkwZiwgMC4wZiwgMC45MGYsIDEuMGYpOworICAgIGdsUmFzdGVyUG9zMmYoLTAuOTVmLCAwLjkwZik7CisgICAgUHJpbnRTdHJpbmcoa1BhcmFtcy5maWxlX25hbWUpOworCisgICAgc25wcmludGYodG1wLCBzaXplb2YodG1wKSwgIkRpbWVuc2lvbjolZCB4ICVkIiwgcGljLT53aWR0aCwgcGljLT5oZWlnaHQpOworICAgIGdsQ29sb3I0ZigwLjkwZiwgMC4wZiwgMC45MGYsIDEuMGYpOworICAgIGdsUmFzdGVyUG9zMmYoLTAuOTVmLCAwLjgwZik7CisgICAgUHJpbnRTdHJpbmcodG1wKTsKKyAgICBpZiAoY3Vyci0+eF9vZmZzZXQgIT0gMCB8fCBjdXJyLT55X29mZnNldCAhPSAwKSB7CisgICAgICBzbnByaW50Zih0bXAsIHNpemVvZih0bXApLCAiIChvZmZzZXQ6JWQsJWQpIiwKKyAgICAgICAgICAgICAgIGN1cnItPnhfb2Zmc2V0LCBjdXJyLT55X29mZnNldCk7CisgICAgICBnbFJhc3RlclBvczJmKC0wLjk1ZiwgMC43MGYpOworICAgICAgUHJpbnRTdHJpbmcodG1wKTsKKyAgICB9CisgIH0KKyAgZ2xQb3BNYXRyaXgoKTsKKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykgfHwgZGVmaW5lZChfV0lOMzIpCisgIGdsRmx1c2goKTsKKyNlbHNlCisgIGdsdXRTd2FwQnVmZmVycygpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIFN0YXJ0RGlzcGxheSh2b2lkKSB7CisgIGNvbnN0IGludCB3aWR0aCA9IGtQYXJhbXMuY2FudmFzX3dpZHRoOworICBjb25zdCBpbnQgaGVpZ2h0ID0ga1BhcmFtcy5jYW52YXNfaGVpZ2h0OworICAvLyBUT0RPKHdlYnA6MzY1KSBHTFVUX0RPVUJMRSByZXN1bHRzIGluIGZsaWNrZXJpbmcgLyBvbGQgZnJhbWVzIHRvIGJlCisgIC8vIHBhcnRpYWxseSBkaXNwbGF5ZWQgd2l0aCBhbmltYXRlZCB3ZWJwICsgYWxwaGEuCisjaWYgZGVmaW5lZChfX0FQUExFX18pIHx8IGRlZmluZWQoX1dJTjMyKQorICBnbHV0SW5pdERpc3BsYXlNb2RlKEdMVVRfUkdCQSk7CisjZWxzZQorICBnbHV0SW5pdERpc3BsYXlNb2RlKEdMVVRfRE9VQkxFIHwgR0xVVF9SR0JBKTsKKyNlbmRpZgorICBnbHV0SW5pdFdpbmRvd1NpemUod2lkdGgsIGhlaWdodCk7CisgIGdsdXRDcmVhdGVXaW5kb3coIldlYlAgdmlld2VyIik7CisgIGdsdXREaXNwbGF5RnVuYyhIYW5kbGVEaXNwbGF5KTsKKyAgZ2x1dFJlc2hhcGVGdW5jKEhhbmRsZVJlc2hhcGUpOworICBnbHV0SWRsZUZ1bmMoTlVMTCk7CisgIGdsdXRLZXlib2FyZEZ1bmMoSGFuZGxlS2V5KTsKKyAgZ2xCbGVuZEZ1bmMoR0xfU1JDX0FMUEhBLCBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBKTsKKyAgZ2xFbmFibGUoR0xfQkxFTkQpOworICBnbENsZWFyQ29sb3IoR2V0Q29sb3JmKGtQYXJhbXMuYmdfY29sb3IsIDApLAorICAgICAgICAgICAgICAgR2V0Q29sb3JmKGtQYXJhbXMuYmdfY29sb3IsIDgpLAorICAgICAgICAgICAgICAgR2V0Q29sb3JmKGtQYXJhbXMuYmdfY29sb3IsIDE2KSwKKyAgICAgICAgICAgICAgIEdldENvbG9yZihrUGFyYW1zLmJnX2NvbG9yLCAyNCkpOworICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOworICBEcmF3Q2hlY2tlckJvYXJkKCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNYWluCisKK3N0YXRpYyB2b2lkIEhlbHAodm9pZCkgeworICBwcmludGYoIlVzYWdlOiB2d2VicCBpbl9maWxlIFtvcHRpb25zXVxuXG4iCisgICAgICAgICAiRGVjb2RlcyB0aGUgV2ViUCBpbWFnZSBmaWxlIGFuZCB2aXN1YWxpemUgaXQgdXNpbmcgT3BlbkdMXG4iCisgICAgICAgICAiT3B0aW9ucyBhcmU6XG4iCisgICAgICAgICAiICAtdmVyc2lvbiAuLi4uLiBwcmludCB2ZXJzaW9uIG51bWJlciBhbmQgZXhpdFxuIgorICAgICAgICAgIiAgLW5vaWNjIC4uLi4uLi4gZG9uJ3QgdXNlIHRoZSBpY2MgcHJvZmlsZSBpZiBwcmVzZW50XG4iCisgICAgICAgICAiICAtbm9mYW5jeSAuLi4uLiBkb24ndCB1c2UgdGhlIGZhbmN5IFlVVjQyMCB1cHNjYWxlclxuIgorICAgICAgICAgIiAgLW5vZmlsdGVyIC4uLi4gZGlzYWJsZSBpbi1sb29wIGZpbHRlcmluZ1xuIgorICAgICAgICAgIiAgLWRpdGhlciA8aW50PiAgZGl0aGVyaW5nIHN0cmVuZ3RoICgwLi4xMDApLCBkZWZhdWx0PTUwXG4iCisgICAgICAgICAiICAtbm9hbHBoYWRpdGhlciBkaXNhYmxlIGFscGhhIHBsYW5lIGRpdGhlcmluZ1xuIgorICAgICAgICAgIiAgLW10IC4uLi4uLi4uLi4gdXNlIG11bHRpLXRocmVhZGluZ1xuIgorICAgICAgICAgIiAgLWluZm8gLi4uLi4uLi4gcHJpbnQgaW5mb1xuIgorICAgICAgICAgIiAgLWggLi4uLi4uLi4uLi4gdGhpcyBoZWxwIG1lc3NhZ2VcbiIKKyAgICAgICAgICJcbiIKKyAgICAgICAgICJLZXlib2FyZCBzaG9ydGN1dHM6XG4iCisgICAgICAgICAiICAnYycgLi4uLi4uLi4uLi4uLi4uLiB0b2dnbGUgdXNlIG9mIGNvbG9yIHByb2ZpbGVcbiIKKyAgICAgICAgICIgICdpJyAuLi4uLi4uLi4uLi4uLi4uIG92ZXJsYXkgZmlsZSBpbmZvcm1hdGlvblxuIgorICAgICAgICAgIiAgJ2QnIC4uLi4uLi4uLi4uLi4uLi4gZGlzYWJsZSBibGVuZGluZyAmIGRpc3Bvc2FsIChkZWJ1ZylcbiIKKyAgICAgICAgICIgICdxJyAvICdRJyAvIEVTQyAuLi4uIHF1aXRcbiIKKyAgICAgICAgKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgeworICBpbnQgYzsKKyAgV2ViUERlY29kZXJDb25maWcqIGNvbnN0IGNvbmZpZyA9ICZrUGFyYW1zLmNvbmZpZzsKKyAgV2ViUEl0ZXJhdG9yKiBjb25zdCBjdXJyID0gJmtQYXJhbXMuY3Vycl9mcmFtZTsKKworICBpZiAoIVdlYlBJbml0RGVjb2RlckNvbmZpZyhjb25maWcpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJMaWJyYXJ5IHZlcnNpb24gbWlzbWF0Y2ghXG4iKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgY29uZmlnLT5vcHRpb25zLmRpdGhlcmluZ19zdHJlbmd0aCA9IDUwOworICBjb25maWctPm9wdGlvbnMuYWxwaGFfZGl0aGVyaW5nX3N0cmVuZ3RoID0gMTAwOworICBrUGFyYW1zLnVzZV9jb2xvcl9wcm9maWxlID0gMTsKKworICBmb3IgKGMgPSAxOyBjIDwgYXJnYzsgKytjKSB7CisgICAgaW50IHBhcnNlX2Vycm9yID0gMDsKKyAgICBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWgiKSB8fCAhc3RyY21wKGFyZ3ZbY10sICItaGVscCIpKSB7CisgICAgICBIZWxwKCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1ub2ljYyIpKSB7CisgICAgICBrUGFyYW1zLnVzZV9jb2xvcl9wcm9maWxlID0gMDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1ub2ZhbmN5IikpIHsKKyAgICAgIGNvbmZpZy0+b3B0aW9ucy5ub19mYW5jeV91cHNhbXBsaW5nID0gMTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1ub2ZpbHRlciIpKSB7CisgICAgICBjb25maWctPm9wdGlvbnMuYnlwYXNzX2ZpbHRlcmluZyA9IDE7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItbm9hbHBoYWRpdGhlciIpKSB7CisgICAgICBjb25maWctPm9wdGlvbnMuYWxwaGFfZGl0aGVyaW5nX3N0cmVuZ3RoID0gMDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1kaXRoZXIiKSAmJiBjICsgMSA8IGFyZ2MpIHsKKyAgICAgIGNvbmZpZy0+b3B0aW9ucy5kaXRoZXJpbmdfc3RyZW5ndGggPQorICAgICAgICAgIEV4VXRpbEdldEludChhcmd2WysrY10sIDAsICZwYXJzZV9lcnJvcik7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItaW5mbyIpKSB7CisgICAgICBrUGFyYW1zLnByaW50X2luZm8gPSAxOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXZlcnNpb24iKSkgeworICAgICAgY29uc3QgaW50IGRlY192ZXJzaW9uID0gV2ViUEdldERlY29kZXJWZXJzaW9uKCk7CisgICAgICBjb25zdCBpbnQgZG11eF92ZXJzaW9uID0gV2ViUEdldERlbXV4VmVyc2lvbigpOworICAgICAgcHJpbnRmKCJXZWJQIERlY29kZXIgdmVyc2lvbjogJWQuJWQuJWRcbldlYlAgRGVtdXggdmVyc2lvbjogJWQuJWQuJWRcbiIsCisgICAgICAgICAgICAgKGRlY192ZXJzaW9uID4+IDE2KSAmIDB4ZmYsIChkZWNfdmVyc2lvbiA+PiA4KSAmIDB4ZmYsCisgICAgICAgICAgICAgZGVjX3ZlcnNpb24gJiAweGZmLCAoZG11eF92ZXJzaW9uID4+IDE2KSAmIDB4ZmYsCisgICAgICAgICAgICAgKGRtdXhfdmVyc2lvbiA+PiA4KSAmIDB4ZmYsIGRtdXhfdmVyc2lvbiAmIDB4ZmYpOworICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItbXQiKSkgeworICAgICAgY29uZmlnLT5vcHRpb25zLnVzZV90aHJlYWRzID0gMTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi0tIikpIHsKKyAgICAgIGlmIChjIDwgYXJnYyAtIDEpIGtQYXJhbXMuZmlsZV9uYW1lID0gYXJndlsrK2NdOworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIGlmIChhcmd2W2NdWzBdID09ICctJykgeworICAgICAgcHJpbnRmKCJVbmtub3duIG9wdGlvbiAnJXMnXG4iLCBhcmd2W2NdKTsKKyAgICAgIEhlbHAoKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgeworICAgICAga1BhcmFtcy5maWxlX25hbWUgPSBhcmd2W2NdOworICAgIH0KKworICAgIGlmIChwYXJzZV9lcnJvcikgeworICAgICAgSGVscCgpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfQorCisgIGlmIChrUGFyYW1zLmZpbGVfbmFtZSA9PSBOVUxMKSB7CisgICAgcHJpbnRmKCJtaXNzaW5nIGlucHV0IGZpbGUhIVxuIik7CisgICAgSGVscCgpOworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKCFJbWdJb1V0aWxSZWFkRmlsZShrUGFyYW1zLmZpbGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAma1BhcmFtcy5kYXRhLmJ5dGVzLCAma1BhcmFtcy5kYXRhLnNpemUpKSB7CisgICAgZ290byBFcnJvcjsKKyAgfQorCisgIGlmICghV2ViUEdldEluZm8oa1BhcmFtcy5kYXRhLmJ5dGVzLCBrUGFyYW1zLmRhdGEuc2l6ZSwgTlVMTCwgTlVMTCkpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIklucHV0IGZpbGUgZG9lc24ndCBhcHBlYXIgdG8gYmUgV2ViUCBmb3JtYXQuXG4iKTsKKyAgICBnb3RvIEVycm9yOworICB9CisKKyAga1BhcmFtcy5kbXV4ID0gV2ViUERlbXV4KCZrUGFyYW1zLmRhdGEpOworICBpZiAoa1BhcmFtcy5kbXV4ID09IE5VTEwpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBjcmVhdGUgZGVtdXhpbmcgb2JqZWN0IVxuIik7CisgICAgZ290byBFcnJvcjsKKyAgfQorCisgIGtQYXJhbXMuY2FudmFzX3dpZHRoID0gV2ViUERlbXV4R2V0SShrUGFyYW1zLmRtdXgsIFdFQlBfRkZfQ0FOVkFTX1dJRFRIKTsKKyAga1BhcmFtcy5jYW52YXNfaGVpZ2h0ID0gV2ViUERlbXV4R2V0SShrUGFyYW1zLmRtdXgsIFdFQlBfRkZfQ0FOVkFTX0hFSUdIVCk7CisgIGlmIChrUGFyYW1zLnByaW50X2luZm8pIHsKKyAgICBwcmludGYoIkNhbnZhczogJWQgeCAlZFxuIiwga1BhcmFtcy5jYW52YXNfd2lkdGgsIGtQYXJhbXMuY2FudmFzX2hlaWdodCk7CisgIH0KKworICBDbGVhclByZXZpb3VzRnJhbWUoKTsKKworICBtZW1zZXQoJmtQYXJhbXMuaWNjcCwgMCwgc2l6ZW9mKGtQYXJhbXMuaWNjcCkpOworICBrUGFyYW1zLmhhc19jb2xvcl9wcm9maWxlID0KKyAgICAgICEhKFdlYlBEZW11eEdldEkoa1BhcmFtcy5kbXV4LCBXRUJQX0ZGX0ZPUk1BVF9GTEFHUykgJiBJQ0NQX0ZMQUcpOworICBpZiAoa1BhcmFtcy5oYXNfY29sb3JfcHJvZmlsZSkgeworI2lmZGVmIFdFQlBfSEFWRV9RQ01TCisgICAgaWYgKCFXZWJQRGVtdXhHZXRDaHVuayhrUGFyYW1zLmRtdXgsICJJQ0NQIiwgMSwgJmtQYXJhbXMuaWNjcCkpIGdvdG8gRXJyb3I7CisgICAgcHJpbnRmKCJWUDhYOiBGb3VuZCBjb2xvciBwcm9maWxlXG4iKTsKKyNlbHNlCisgICAgZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiBjb2xvciBwcm9maWxlIHByZXNlbnQsIGJ1dCBxY21zIGlzIHVuYXZhaWxhYmxlIVxuIgorICAgICAgICAgICAgIkJ1aWxkIGxpYnFjbXMgZnJvbSBNb3ppbGxhIG9yIENocm9taXVtIGFuZCBkZWZpbmUgV0VCUF9IQVZFX1FDTVMgIgorICAgICAgICAgICAgImJlZm9yZSBidWlsZGluZy5cbiIpOworI2VuZGlmCisgIH0KKworICBpZiAoIVdlYlBEZW11eEdldEZyYW1lKGtQYXJhbXMuZG11eCwgMSwgY3VycikpIGdvdG8gRXJyb3I7CisKKyAga1BhcmFtcy5oYXNfYW5pbWF0aW9uID0gKGN1cnItPm51bV9mcmFtZXMgPiAxKTsKKyAga1BhcmFtcy5sb29wX2NvdW50ID0gKGludClXZWJQRGVtdXhHZXRJKGtQYXJhbXMuZG11eCwgV0VCUF9GRl9MT09QX0NPVU5UKTsKKyAga1BhcmFtcy5iZ19jb2xvciA9IFdlYlBEZW11eEdldEkoa1BhcmFtcy5kbXV4LCBXRUJQX0ZGX0JBQ0tHUk9VTkRfQ09MT1IpOworICBwcmludGYoIlZQOFg6IEZvdW5kICVkIGltYWdlcyBpbiBmaWxlIChsb29wIGNvdW50ID0gJWQpXG4iLAorICAgICAgICAgY3Vyci0+bnVtX2ZyYW1lcywga1BhcmFtcy5sb29wX2NvdW50KTsKKworICAvLyBEZWNvZGUgZmlyc3QgZnJhbWUKKyAgaWYgKCFEZWNvZGUoKSkgZ290byBFcnJvcjsKKworICAvLyBQb3NpdGlvbiBpdGVyYXRvciB0byBsYXN0IGZyYW1lLiBOZXh0IGNhbGwgdG8gSGFuZGxlRGlzcGxheSB3aWxsIHdyYXAgb3Zlci4KKyAgLy8gV2UgdGFrZSB0aGlzIGludG8gYWNjb3VudCBieSBidW1waW5nIHVwIGxvb3BfY291bnQuCisgIFdlYlBEZW11eEdldEZyYW1lKGtQYXJhbXMuZG11eCwgMCwgY3Vycik7CisgIGlmIChrUGFyYW1zLmxvb3BfY291bnQpICsra1BhcmFtcy5sb29wX2NvdW50OworCisjaWYgZGVmaW5lZChfX3VuaXhfXykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQorICAvLyBXb3JrIGFyb3VuZCBHTFVUIGNvbXBvc2l0b3IgYnVnLgorICAvLyBodHRwczovL2J1Z3MubGF1bmNocGFkLm5ldC91YnVudHUvK3NvdXJjZS9mcmVlZ2x1dC8rYnVnLzM2OTg5MQorICBzZXRlbnYoIlhMSUJfU0tJUF9BUkdCX1ZJU1VBTFMiLCAiMSIsIDEpOworI2VuZGlmCisKKyAgLy8gU3RhcnQgZGlzcGxheSAoYW5kIHRpbWVyKQorICBnbHV0SW5pdCgmYXJnYywgYXJndik7CisjaWZkZWYgRlJFRUdMVVQKKyAgZ2x1dFNldE9wdGlvbihHTFVUX0FDVElPTl9PTl9XSU5ET1dfQ0xPU0UsIEdMVVRfQUNUSU9OX0NPTlRJTlVFX0VYRUNVVElPTik7CisjZW5kaWYKKyAgU3RhcnREaXNwbGF5KCk7CisKKyAgaWYgKGtQYXJhbXMuaGFzX2FuaW1hdGlvbikgZ2x1dFRpbWVyRnVuYygwLCBkZWNvZGVfY2FsbGJhY2ssIDApOworICBnbHV0TWFpbkxvb3AoKTsKKworICAvLyBTaG91bGQgb25seSBiZSByZWFjaGVkIHdoZW4gdXNpbmcgRlJFRUdMVVQ6CisgIENsZWFyUGFyYW1zKCk7CisgIHJldHVybiAwOworCisgRXJyb3I6CisgIENsZWFyUGFyYW1zKCk7CisgIHJldHVybiAtMTsKK30KKworI2Vsc2UgICAvLyAhV0VCUF9IQVZFX0dMCisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10pIHsKKyAgZnByaW50ZihzdGRlcnIsICJPcGVuR0wgc3VwcG9ydCBub3QgZW5hYmxlZCBpbiAlcy5cbiIsIGFyZ3ZbMF0pOworICAodm9pZClhcmdjOworICByZXR1cm4gMDsKK30KKworI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy93ZWJwaW5mby5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvd2VicGluZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGNkMjc3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvd2VicGluZm8uYwpAQCAtMCwwICsxLDExNzggQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgQ29tbWFuZC1saW5lIHRvb2wgdG8gcHJpbnQgb3V0IHRoZSBjaHVuayBsZXZlbCBzdHJ1Y3R1cmUgb2YgV2ViUCBmaWxlcworLy8gIGFsb25nIHdpdGggYmFzaWMgaW50ZWdyaXR5IGNoZWNrcy4KKy8vCisvLyAgQXV0aG9yOiBIdWkgU3UgKGh1aXN1QGdvb2dsZS5jb20pCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgIndlYnAvY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgIi4uL2ltYWdlaW8vaW1hZ2Vpb191dGlsLmgiCisjaW5jbHVkZSAid2VicC9kZWNvZGUuaCIKKyNpbmNsdWRlICJ3ZWJwL2Zvcm1hdF9jb25zdGFudHMuaCIKKyNpbmNsdWRlICJ3ZWJwL211eF90eXBlcy5oIgorCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVIgPCAxOTAwCisjZGVmaW5lIHNucHJpbnRmIF9zbnByaW50ZgorI2VuZGlmCisKKyNkZWZpbmUgTE9HX0VSUk9SKE1FU1NBR0UpICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHdlYnBfaW5mby0+c2hvd19kaWFnbm9zaXNfKSB7ICAgICAgICAgIFwKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3I6ICVzXG4iLCBNRVNTQUdFKTsgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgTE9HX1dBUk4oTUVTU0FHRSkgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICh3ZWJwX2luZm8tPnNob3dfZGlhZ25vc2lzXykgeyAgICAgICAgICAgIFwKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiV2FybmluZzogJXNcbiIsIE1FU1NBR0UpOyBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCitzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga0Zvcm1hdHNbM10gPSB7CisgICJVbmtub3duIiwKKyAgIkxvc3N5IiwKKyAgIkxvc3NsZXNzIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtMb3NzbGVzc1RyYW5zZm9ybXNbNF0gPSB7CisgICJQcmVkaWN0b3IiLAorICAiQ3Jvc3MgQ29sb3IiLAorICAiU3VidHJhY3QgR3JlZW4iLAorICAiQ29sb3IgSW5kZXhpbmciCit9OworCitzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga0FscGhhRmlsdGVyTWV0aG9kc1s0XSA9IHsKKyAgIk5vbmUiLAorICAiSG9yaXpvbnRhbCIsCisgICJWZXJ0aWNhbCIsCisgICJHcmFkaWVudCIKK307CisKK3R5cGVkZWYgZW51bSB7CisgIFdFQlBfSU5GT19PSyA9IDAsCisgIFdFQlBfSU5GT19UUlVOQ0FURURfREFUQSwKKyAgV0VCUF9JTkZPX1BBUlNFX0VSUk9SLAorICBXRUJQX0lORk9fSU5WQUxJRF9QQVJBTSwKKyAgV0VCUF9JTkZPX0JJVFNUUkVBTV9FUlJPUiwKKyAgV0VCUF9JTkZPX01JU1NJTkdfREFUQSwKKyAgV0VCUF9JTkZPX0lOVkFMSURfQ09NTUFORAorfSBXZWJQSW5mb1N0YXR1czsKKwordHlwZWRlZiBlbnVtIENodW5rSUQgeworICBDSFVOS19WUDgsCisgIENIVU5LX1ZQOEwsCisgIENIVU5LX1ZQOFgsCisgIENIVU5LX0FMUEhBLAorICBDSFVOS19BTklNLAorICBDSFVOS19BTk1GLAorICBDSFVOS19JQ0NQLAorICBDSFVOS19FWElGLAorICBDSFVOS19YTVAsCisgIENIVU5LX1VOS05PV04sCisgIENIVU5LX1RZUEVTID0gQ0hVTktfVU5LTk9XTgorfSBDaHVua0lEOworCit0eXBlZGVmIHN0cnVjdCB7CisgIHNpemVfdCBzdGFydF87CisgIHNpemVfdCBlbmRfOworICBjb25zdCB1aW50OF90KiBidWZfOworfSBNZW1CdWZmZXI7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc2l6ZV90IG9mZnNldF87CisgIHNpemVfdCBzaXplXzsKKyAgY29uc3QgdWludDhfdCogcGF5bG9hZF87CisgIENodW5rSUQgaWRfOworfSBDaHVua0RhdGE7CisKK3R5cGVkZWYgc3RydWN0IFdlYlBJbmZvIHsKKyAgaW50IGNhbnZhc193aWR0aF87CisgIGludCBjYW52YXNfaGVpZ2h0XzsKKyAgaW50IGxvb3BfY291bnRfOworICBpbnQgbnVtX2ZyYW1lc187CisgIGludCBjaHVua19jb3VudHNfW0NIVU5LX1RZUEVTXTsKKyAgaW50IGFubWZfc3ViY2h1bmtfY291bnRzX1szXTsgIC8vIDAgVlA4OyAxIFZQOEw7IDIgQUxQSC4KKyAgdWludDMyX3QgYmdjb2xvcl87CisgIGludCBmZWF0dXJlX2ZsYWdzXzsKKyAgaW50IGhhc19hbHBoYV87CisgIC8vIFVzZWQgZm9yIHBhcnNpbmcgQU5NRiBjaHVua3MuCisgIGludCBmcmFtZV93aWR0aF8sIGZyYW1lX2hlaWdodF87CisgIHNpemVfdCBhbmltX2ZyYW1lX2RhdGFfc2l6ZV87CisgIGludCBpc19wcm9jZXNzaW5nX2FuaW1fZnJhbWVfLCBzZWVuX2FscGhhX3N1YmNodW5rXywgc2Vlbl9pbWFnZV9zdWJjaHVua187CisgIC8vIFByaW50IG91dHB1dCBjb250cm9sLgorICBpbnQgcXVpZXRfLCBzaG93X2RpYWdub3Npc18sIHNob3dfc3VtbWFyeV87CisgIGludCBwYXJzZV9iaXRzdHJlYW1fOworfSBXZWJQSW5mbzsKKworc3RhdGljIHZvaWQgV2ViUEluZm9Jbml0KFdlYlBJbmZvKiBjb25zdCB3ZWJwX2luZm8pIHsKKyAgbWVtc2V0KHdlYnBfaW5mbywgMCwgc2l6ZW9mKCp3ZWJwX2luZm8pKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIga1dlYlBDaHVua1RhZ3NbQ0hVTktfVFlQRVNdWzRdID0geworICB7ICdWJywgJ1AnLCAnOCcsICcgJyB9LAorICB7ICdWJywgJ1AnLCAnOCcsICdMJyB9LAorICB7ICdWJywgJ1AnLCAnOCcsICdYJyB9LAorICB7ICdBJywgJ0wnLCAnUCcsICdIJyB9LAorICB7ICdBJywgJ04nLCAnSScsICdNJyB9LAorICB7ICdBJywgJ04nLCAnTScsICdGJyB9LAorICB7ICdJJywgJ0MnLCAnQycsICdQJyB9LAorICB7ICdFJywgJ1gnLCAnSScsICdGJyB9LAorICB7ICdYJywgJ00nLCAnUCcsICcgJyB9LAorfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERhdGEgcmVhZGluZy4KKworc3RhdGljIGludCBHZXRMRTE2KGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEpIHsKKyAgcmV0dXJuIChkYXRhWzBdIDw8IDApIHwgKGRhdGFbMV0gPDwgOCk7Cit9CisKK3N0YXRpYyBpbnQgR2V0TEUyNChjb25zdCB1aW50OF90KiBjb25zdCBkYXRhKSB7CisgIHJldHVybiBHZXRMRTE2KGRhdGEpIHwgKGRhdGFbMl0gPDwgMTYpOworfQorCitzdGF0aWMgdWludDMyX3QgR2V0TEUzMihjb25zdCB1aW50OF90KiBjb25zdCBkYXRhKSB7CisgIHJldHVybiBHZXRMRTE2KGRhdGEpIHwgKCh1aW50MzJfdClHZXRMRTE2KGRhdGEgKyAyKSA8PCAxNik7Cit9CisKK3N0YXRpYyBpbnQgUmVhZExFMTYoY29uc3QgdWludDhfdCoqIGRhdGEpIHsKKyAgY29uc3QgaW50IHZhbCA9IEdldExFMTYoKmRhdGEpOworICAqZGF0YSArPSAyOworICByZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW50IFJlYWRMRTI0KGNvbnN0IHVpbnQ4X3QqKiBkYXRhKSB7CisgIGNvbnN0IGludCB2YWwgPSBHZXRMRTI0KCpkYXRhKTsKKyAgKmRhdGEgKz0gMzsKKyAgcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHVpbnQzMl90IFJlYWRMRTMyKGNvbnN0IHVpbnQ4X3QqKiBkYXRhKSB7CisgIGNvbnN0IHVpbnQzMl90IHZhbCA9IEdldExFMzIoKmRhdGEpOworICAqZGF0YSArPSA0OworICByZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW50IFJlYWRGaWxlVG9XZWJQRGF0YShjb25zdCBjaGFyKiBjb25zdCBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBEYXRhKiBjb25zdCB3ZWJwX2RhdGEpIHsKKyAgY29uc3QgdWludDhfdCogZGF0YTsKKyAgc2l6ZV90IHNpemU7CisgIGlmICghSW1nSW9VdGlsUmVhZEZpbGUoZmlsZW5hbWUsICZkYXRhLCAmc2l6ZSkpIHJldHVybiAwOworICB3ZWJwX2RhdGEtPmJ5dGVzID0gZGF0YTsKKyAgd2VicF9kYXRhLT5zaXplID0gc2l6ZTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNZW1CdWZmZXIgb2JqZWN0LgorCitzdGF0aWMgdm9pZCBJbml0TWVtQnVmZmVyKE1lbUJ1ZmZlciogY29uc3QgbWVtLCBjb25zdCBXZWJQRGF0YSogd2VicF9kYXRhKSB7CisgIG1lbS0+YnVmXyA9IHdlYnBfZGF0YS0+Ynl0ZXM7CisgIG1lbS0+c3RhcnRfID0gMDsKKyAgbWVtLT5lbmRfID0gd2VicF9kYXRhLT5zaXplOworfQorCitzdGF0aWMgc2l6ZV90IE1lbURhdGFTaXplKGNvbnN0IE1lbUJ1ZmZlciogY29uc3QgbWVtKSB7CisgIHJldHVybiAobWVtLT5lbmRfIC0gbWVtLT5zdGFydF8pOworfQorCitzdGF0aWMgY29uc3QgdWludDhfdCogR2V0QnVmZmVyKE1lbUJ1ZmZlciogY29uc3QgbWVtKSB7CisgIHJldHVybiBtZW0tPmJ1Zl8gKyBtZW0tPnN0YXJ0XzsKK30KKworc3RhdGljIHZvaWQgU2tpcChNZW1CdWZmZXIqIGNvbnN0IG1lbSwgc2l6ZV90IHNpemUpIHsKKyAgbWVtLT5zdGFydF8gKz0gc2l6ZTsKK30KKworc3RhdGljIHVpbnQzMl90IFJlYWRNZW1CdWZMRTMyKE1lbUJ1ZmZlciogY29uc3QgbWVtKSB7CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEgPSBtZW0tPmJ1Zl8gKyBtZW0tPnN0YXJ0XzsKKyAgY29uc3QgdWludDMyX3QgdmFsID0gR2V0TEUzMihkYXRhKTsKKyAgYXNzZXJ0KE1lbURhdGFTaXplKG1lbSkgPj0gNCk7CisgIFNraXAobWVtLCA0KTsKKyAgcmV0dXJuIHZhbDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIExvc3N5IGJpdHN0cmVhbSBhbmFseXNpcy4KKworc3RhdGljIGludCBHZXRCaXRzKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsIHNpemVfdCBkYXRhX3NpemUsIHNpemVfdCBuYiwKKyAgICAgICAgICAgICAgICAgICBpbnQqIHZhbCwgdWludDY0X3QqIGNvbnN0IGJpdF9wb3MpIHsKKyAgKnZhbCA9IDA7CisgIHdoaWxlIChuYi0tID4gMCkgeworICAgIGNvbnN0IHVpbnQ2NF90IHAgPSAoKmJpdF9wb3MpKys7CisgICAgaWYgKChwID4+IDMpID49IGRhdGFfc2l6ZSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbnN0IGludCBiaXQgPSAhIShkYXRhW3AgPj4gM10gJiAoMTI4ID4+ICgocCAmIDcpKSkpOworICAgICAgKnZhbCA9ICgqdmFsIDw8IDEpIHwgYml0OworICAgIH0KKyAgfQorICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBHZXRTaWduZWRCaXRzKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsIHNpemVfdCBkYXRhX3NpemUsIHNpemVfdCBuYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHZhbCwgdWludDY0X3QqIGNvbnN0IGJpdF9wb3MpIHsKKyAgaW50IHNpZ247CisgIGlmICghR2V0Qml0cyhkYXRhLCBkYXRhX3NpemUsIG5iLCB2YWwsIGJpdF9wb3MpKSByZXR1cm4gMDsKKyAgaWYgKCFHZXRCaXRzKGRhdGEsIGRhdGFfc2l6ZSwgMSwgJnNpZ24sIGJpdF9wb3MpKSByZXR1cm4gMDsKKyAgaWYgKHNpZ24pICp2YWwgPSAtKCp2YWwpOworICByZXR1cm4gMTsKK30KKworI2RlZmluZSBHRVRfQklUUyh2LCBuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCFHZXRCaXRzKGRhdGEsIGRhdGFfc2l6ZSwgbiwgJih2KSwgYml0X3BvcykpIHsgXAorICAgICAgTE9HX0VSUk9SKCJUcnVuY2F0ZWQgbG9zc3kgYml0c3RyZWFtLiIpOyAgICAgICAgIFwKKyAgICAgIHJldHVybiBXRUJQX0lORk9fVFJVTkNBVEVEX0RBVEE7ICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIEdFVF9TSUdORURfQklUUyh2LCBuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIUdldFNpZ25lZEJpdHMoZGF0YSwgZGF0YV9zaXplLCBuLCAmKHYpLCBiaXRfcG9zKSkgeyBcCisgICAgICBMT0dfRVJST1IoIlRydW5jYXRlZCBsb3NzeSBiaXRzdHJlYW0uIik7ICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIFdFQlBfSU5GT19UUlVOQ0FURURfREFUQTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKK3N0YXRpYyBXZWJQSW5mb1N0YXR1cyBQYXJzZUxvc3N5U2VnbWVudEhlYWRlcihjb25zdCBXZWJQSW5mbyogY29uc3Qgd2VicF9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCogY29uc3QgYml0X3BvcykgeworICBpbnQgdXNlX3NlZ21lbnQ7CisgIEdFVF9CSVRTKHVzZV9zZWdtZW50LCAxKTsKKyAgcHJpbnRmKCIgIFVzZSBzZWdtZW50OiAgICAgICVkXG4iLCB1c2Vfc2VnbWVudCk7CisgIGlmICh1c2Vfc2VnbWVudCkgeworICAgIGludCB1cGRhdGVfbWFwLCB1cGRhdGVfZGF0YTsKKyAgICBHRVRfQklUUyh1cGRhdGVfbWFwLCAxKTsKKyAgICBHRVRfQklUUyh1cGRhdGVfZGF0YSwgMSk7CisgICAgcHJpbnRmKCIgIFVwZGF0ZSBtYXA6ICAgICAgICVkXG4iCisgICAgICAgICAgICIgIFVwZGF0ZSBkYXRhOiAgICAgICVkXG4iLAorICAgICAgICAgICB1cGRhdGVfbWFwLCB1cGRhdGVfZGF0YSk7CisgICAgaWYgKHVwZGF0ZV9kYXRhKSB7CisgICAgICBpbnQgaSwgYV9kZWx0YTsKKyAgICAgIGludCBxdWFudGl6ZXJbNF0gPSB7MCwgMCwgMCwgMH07CisgICAgICBpbnQgZmlsdGVyX3N0cmVuZ3RoWzRdID0gezAsIDAsIDAsIDB9OworICAgICAgR0VUX0JJVFMoYV9kZWx0YSwgMSk7CisgICAgICBwcmludGYoIiAgQWJzb2x1dGUgZGVsdGE6ICAgJWRcbiIsIGFfZGVsdGEpOworICAgICAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeworICAgICAgICBpbnQgYml0OworICAgICAgICBHRVRfQklUUyhiaXQsIDEpOworICAgICAgICBpZiAoYml0KSBHRVRfU0lHTkVEX0JJVFMocXVhbnRpemVyW2ldLCA3KTsKKyAgICAgIH0KKyAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICAgICAgaW50IGJpdDsKKyAgICAgICAgR0VUX0JJVFMoYml0LCAxKTsKKyAgICAgICAgaWYgKGJpdCkgR0VUX1NJR05FRF9CSVRTKGZpbHRlcl9zdHJlbmd0aFtpXSwgNik7CisgICAgICB9CisgICAgICBwcmludGYoIiAgUXVhbnRpemVyOiAgICAgICAgJWQgJWQgJWQgJWRcbiIsIHF1YW50aXplclswXSwgcXVhbnRpemVyWzFdLAorICAgICAgICAgICAgIHF1YW50aXplclsyXSwgcXVhbnRpemVyWzNdKTsKKyAgICAgIHByaW50ZigiICBGaWx0ZXIgc3RyZW5ndGg6ICAlZCAlZCAlZCAlZFxuIiwgZmlsdGVyX3N0cmVuZ3RoWzBdLAorICAgICAgICAgICAgIGZpbHRlcl9zdHJlbmd0aFsxXSwgZmlsdGVyX3N0cmVuZ3RoWzJdLCBmaWx0ZXJfc3RyZW5ndGhbM10pOworICAgIH0KKyAgICBpZiAodXBkYXRlX21hcCkgeworICAgICAgaW50IGk7CisgICAgICBpbnQgcHJvYl9zZWdtZW50WzNdID0gezI1NSwgMjU1LCAyNTV9OworICAgICAgZm9yIChpID0gMDsgaSA8IDM7ICsraSkgeworICAgICAgICBpbnQgYml0OworICAgICAgICBHRVRfQklUUyhiaXQsIDEpOworICAgICAgICBpZiAoYml0KSBHRVRfQklUUyhwcm9iX3NlZ21lbnRbaV0sIDgpOworICAgICAgfQorICAgICAgcHJpbnRmKCIgIFByb2Igc2VnbWVudDogICAgICVkICVkICVkXG4iLAorICAgICAgICAgICAgIHByb2Jfc2VnbWVudFswXSwgcHJvYl9zZWdtZW50WzFdLCBwcm9iX3NlZ21lbnRbMl0pOworICAgIH0KKyAgfQorICByZXR1cm4gV0VCUF9JTkZPX09LOworfQorCitzdGF0aWMgV2ViUEluZm9TdGF0dXMgUGFyc2VMb3NzeUZpbHRlckhlYWRlcihjb25zdCBXZWJQSW5mbyogY29uc3Qgd2VicF9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCogY29uc3QgYml0X3BvcykgeworICBpbnQgc2ltcGxlX2ZpbHRlciwgbGV2ZWwsIHNoYXJwbmVzcywgdXNlX2xmX2RlbHRhOworICBHRVRfQklUUyhzaW1wbGVfZmlsdGVyLCAxKTsKKyAgR0VUX0JJVFMobGV2ZWwsIDYpOworICBHRVRfQklUUyhzaGFycG5lc3MsIDMpOworICBHRVRfQklUUyh1c2VfbGZfZGVsdGEsIDEpOworICBwcmludGYoIiAgU2ltcGxlIGZpbHRlcjogICAgJWRcbiIsIHNpbXBsZV9maWx0ZXIpOworICBwcmludGYoIiAgTGV2ZWw6ICAgICAgICAgICAgJWRcbiIsIGxldmVsKTsKKyAgcHJpbnRmKCIgIFNoYXJwbmVzczogICAgICAgICVkXG4iLCBzaGFycG5lc3MpOworICBwcmludGYoIiAgVXNlIGxmIGRlbHRhOiAgICAgJWRcbiIsIHVzZV9sZl9kZWx0YSk7CisgIGlmICh1c2VfbGZfZGVsdGEpIHsKKyAgICBpbnQgdXBkYXRlOworICAgIEdFVF9CSVRTKHVwZGF0ZSwgMSk7CisgICAgcHJpbnRmKCIgIFVwZGF0ZSBsZiBkZWx0YTogICVkXG4iLCB1cGRhdGUpOworICAgIGlmICh1cGRhdGUpIHsKKyAgICAgIGludCBpOworICAgICAgZm9yIChpID0gMDsgaSA8IDQgKyA0OyArK2kpIHsKKyAgICAgICAgaW50IHRlbXA7CisgICAgICAgIEdFVF9CSVRTKHRlbXAsIDEpOworICAgICAgICBpZiAodGVtcCkgR0VUX0JJVFModGVtcCwgNyk7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBXRUJQX0lORk9fT0s7Cit9CisKK3N0YXRpYyBXZWJQSW5mb1N0YXR1cyBQYXJzZUxvc3N5SGVhZGVyKGNvbnN0IENodW5rRGF0YSogY29uc3QgY2h1bmtfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBJbmZvKiBjb25zdCB3ZWJwX2luZm8pIHsKKyAgY29uc3QgdWludDhfdCogZGF0YSA9IGNodW5rX2RhdGEtPnBheWxvYWRfOworICBzaXplX3QgZGF0YV9zaXplID0gY2h1bmtfZGF0YS0+c2l6ZV8gLSBDSFVOS19IRUFERVJfU0laRTsKKyAgY29uc3QgdWludDMyX3QgYml0cyA9ICh1aW50MzJfdClkYXRhWzBdIHwgKGRhdGFbMV0gPDwgOCkgfCAoZGF0YVsyXSA8PCAxNik7CisgIGNvbnN0IGludCBrZXlfZnJhbWUgPSAhKGJpdHMgJiAxKTsKKyAgY29uc3QgaW50IHByb2ZpbGUgPSAoYml0cyA+PiAxKSAmIDc7CisgIGNvbnN0IGludCBkaXNwbGF5ID0gKGJpdHMgPj4gNCkgJiAxOworICBjb25zdCB1aW50MzJfdCBwYXJ0aXRpb24wX2xlbmd0aCA9IChiaXRzID4+IDUpOworICBXZWJQSW5mb1N0YXR1cyBzdGF0dXMgPSBXRUJQX0lORk9fT0s7CisgIHVpbnQ2NF90IGJpdF9wb3NpdGlvbiA9IDA7CisgIHVpbnQ2NF90KiBjb25zdCBiaXRfcG9zID0gJmJpdF9wb3NpdGlvbjsKKyAgaW50IGNvbG9yc3BhY2UsIGNsYW1wX3R5cGU7CisgIHByaW50ZigiICBQYXJzaW5nIGxvc3N5IGJpdHN0cmVhbS4uLlxuIik7CisgIC8vIENhbGxpbmcgV2ViUEdldEZlYXR1cmVzKCkgaW4gUHJvY2Vzc0ltYWdlQ2h1bmsoKSBzaG91bGQgZW5zdXJlIHRoaXMuCisgIGFzc2VydChjaHVua19kYXRhLT5zaXplXyA+PSBDSFVOS19IRUFERVJfU0laRSArIDEwKTsKKyAgaWYgKHByb2ZpbGUgPiAzKSB7CisgICAgTE9HX0VSUk9SKCJVbmtub3duIHByb2ZpbGUuIik7CisgICAgcmV0dXJuIFdFQlBfSU5GT19CSVRTVFJFQU1fRVJST1I7CisgIH0KKyAgaWYgKCFkaXNwbGF5KSB7CisgICAgTE9HX0VSUk9SKCJGcmFtZSBpcyBub3QgZGlzcGxheWFibGUuIik7CisgICAgcmV0dXJuIFdFQlBfSU5GT19CSVRTVFJFQU1fRVJST1I7CisgIH0KKyAgZGF0YSArPSAzOworICBkYXRhX3NpemUgLT0gMzsKKyAgcHJpbnRmKCIgIEtleSBmcmFtZTogICAgICAgICVzXG4iCisgICAgICAgICAiICBQcm9maWxlOiAgICAgICAgICAlZFxuIgorICAgICAgICAgIiAgRGlzcGxheTogICAgICAgICAgJXNcbiIKKyAgICAgICAgICIgIFBhcnQuIDAgbGVuZ3RoOiAgICVkXG4iLAorICAgICAgICAga2V5X2ZyYW1lID8gIlllcyIgOiAiTm8iLCBwcm9maWxlLAorICAgICAgICAgZGlzcGxheSA/ICJZZXMiIDogIk5vIiwgcGFydGl0aW9uMF9sZW5ndGgpOworICBpZiAoa2V5X2ZyYW1lKSB7CisgICAgaWYgKCEoZGF0YVswXSA9PSAweDlkICYmIGRhdGFbMV0gPT0gMHgwMSAmJiBkYXRhWzJdID09IDB4MmEpKSB7CisgICAgICBMT0dfRVJST1IoIkludmFsaWQgbG9zc3kgYml0c3RyZWFtIHNpZ25hdHVyZS4iKTsKKyAgICAgIHJldHVybiBXRUJQX0lORk9fQklUU1RSRUFNX0VSUk9SOworICAgIH0KKyAgICBwcmludGYoIiAgV2lkdGg6ICAgICAgICAgICAgJWRcbiIKKyAgICAgICAgICAgIiAgWCBzY2FsZTogICAgICAgICAgJWRcbiIKKyAgICAgICAgICAgIiAgSGVpZ2h0OiAgICAgICAgICAgJWRcbiIKKyAgICAgICAgICAgIiAgWSBzY2FsZTogICAgICAgICAgJWRcbiIsCisgICAgICAgICAgICgoZGF0YVs0XSA8PCA4KSB8IGRhdGFbM10pICYgMHgzZmZmLCBkYXRhWzRdID4+IDYsCisgICAgICAgICAgICgoZGF0YVs2XSA8PCA4KSB8IGRhdGFbNV0pICYgMHgzZmZmLCBkYXRhWzZdID4+IDYpOworICAgIGRhdGEgKz0gNzsKKyAgICBkYXRhX3NpemUgLT0gNzsKKyAgfSBlbHNlIHsKKyAgICBMT0dfRVJST1IoIk5vbi1rZXlmcmFtZSBkZXRlY3RlZCBpbiBsb3NzeSBiaXRzdHJlYW0uIik7CisgICAgcmV0dXJuIFdFQlBfSU5GT19CSVRTVFJFQU1fRVJST1I7CisgIH0KKyAgaWYgKHBhcnRpdGlvbjBfbGVuZ3RoID49IGRhdGFfc2l6ZSkgeworICAgIExPR19FUlJPUigiQmFkIHBhcnRpdGlvbiBsZW5ndGguIik7CisgICAgcmV0dXJuIFdFQlBfSU5GT19CSVRTVFJFQU1fRVJST1I7CisgIH0KKyAgR0VUX0JJVFMoY29sb3JzcGFjZSwgMSk7CisgIEdFVF9CSVRTKGNsYW1wX3R5cGUsIDEpOworICBwcmludGYoIiAgQ29sb3Igc3BhY2U6ICAgICAgJWRcbiIsIGNvbG9yc3BhY2UpOworICBwcmludGYoIiAgQ2xhbXAgdHlwZTogICAgICAgJWRcbiIsIGNsYW1wX3R5cGUpOworICBzdGF0dXMgPSBQYXJzZUxvc3N5U2VnbWVudEhlYWRlcih3ZWJwX2luZm8sIGRhdGEsIGRhdGFfc2l6ZSwgYml0X3Bvcyk7CisgIGlmIChzdGF0dXMgIT0gV0VCUF9JTkZPX09LKSByZXR1cm4gc3RhdHVzOworICBzdGF0dXMgPSBQYXJzZUxvc3N5RmlsdGVySGVhZGVyKHdlYnBfaW5mbywgZGF0YSwgZGF0YV9zaXplLCBiaXRfcG9zKTsKKyAgaWYgKHN0YXR1cyAhPSBXRUJQX0lORk9fT0spIHJldHVybiBzdGF0dXM7CisgIHsgIC8vIFBhcnRpdGlvbiBudW1iZXIgYW5kIHNpemUuCisgICAgY29uc3QgdWludDhfdCogcGFydF9zaXplID0gZGF0YSArIHBhcnRpdGlvbjBfbGVuZ3RoOworICAgIGludCBudW1fcGFydHMsIGk7CisgICAgc2l6ZV90IHBhcnRfZGF0YV9zaXplOworICAgIEdFVF9CSVRTKG51bV9wYXJ0cywgMik7CisgICAgbnVtX3BhcnRzID0gMSA8PCBudW1fcGFydHM7CisgICAgaWYgKChpbnQpKGRhdGFfc2l6ZSAtIHBhcnRpdGlvbjBfbGVuZ3RoKSA8IChudW1fcGFydHMgLSAxKSAqIDMpIHsKKyAgICAgIExPR19FUlJPUigiVHJ1bmNhdGVkIGxvc3N5IGJpdHN0cmVhbS4iKTsKKyAgICAgIHJldHVybiBXRUJQX0lORk9fVFJVTkNBVEVEX0RBVEE7CisgICAgfQorICAgIHBhcnRfZGF0YV9zaXplID0gZGF0YV9zaXplIC0gcGFydGl0aW9uMF9sZW5ndGggLSAobnVtX3BhcnRzIC0gMSkgKiAzOworICAgIHByaW50ZigiICBUb3RhbCBwYXJ0aXRpb25zOiAlZFxuIiwgbnVtX3BhcnRzKTsKKyAgICBmb3IgKGkgPSAxOyBpIDwgbnVtX3BhcnRzOyArK2kpIHsKKyAgICAgIGNvbnN0IHNpemVfdCBwc2l6ZSA9CisgICAgICAgICAgcGFydF9zaXplWzBdIHwgKHBhcnRfc2l6ZVsxXSA8PCA4KSB8IChwYXJ0X3NpemVbMl0gPDwgMTYpOworICAgICAgaWYgKHBzaXplID4gcGFydF9kYXRhX3NpemUpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJUcnVuY2F0ZWQgcGFydGl0aW9uLiIpOworICAgICAgICByZXR1cm4gV0VCUF9JTkZPX1RSVU5DQVRFRF9EQVRBOworICAgICAgfQorICAgICAgcHJpbnRmKCIgIFBhcnQuICVkIGxlbmd0aDogICAlZFxuIiwgaSwgKGludClwc2l6ZSk7CisgICAgICBwYXJ0X2RhdGFfc2l6ZSAtPSBwc2l6ZTsKKyAgICAgIHBhcnRfc2l6ZSArPSAzOworICAgIH0KKyAgfQorICAvLyBRdWFudGl6ZXIuCisgIHsKKyAgICBpbnQgYmFzZV9xLCBiaXQ7CisgICAgaW50IGRxX3kxX2RjID0gMCwgZHFfeTJfZGMgPSAwLCBkcV95Ml9hYyA9IDAsIGRxX3V2X2RjID0gMCwgZHFfdXZfYWMgPSAwOworICAgIEdFVF9CSVRTKGJhc2VfcSwgNyk7CisgICAgR0VUX0JJVFMoYml0LCAxKTsKKyAgICBpZiAoYml0KSBHRVRfU0lHTkVEX0JJVFMoZHFfeTFfZGMsIDQpOworICAgIEdFVF9CSVRTKGJpdCwgMSk7CisgICAgaWYgKGJpdCkgR0VUX1NJR05FRF9CSVRTKGRxX3kyX2RjLCA0KTsKKyAgICBHRVRfQklUUyhiaXQsIDEpOworICAgIGlmIChiaXQpIEdFVF9TSUdORURfQklUUyhkcV95Ml9hYywgNCk7CisgICAgR0VUX0JJVFMoYml0LCAxKTsKKyAgICBpZiAoYml0KSBHRVRfU0lHTkVEX0JJVFMoZHFfdXZfZGMsIDQpOworICAgIEdFVF9CSVRTKGJpdCwgMSk7CisgICAgaWYgKGJpdCkgR0VUX1NJR05FRF9CSVRTKGRxX3V2X2FjLCA0KTsKKyAgICBwcmludGYoIiAgQmFzZSBROiAgICAgICAgICAgJWRcbiIsIGJhc2VfcSk7CisgICAgcHJpbnRmKCIgIERRIFkxIERDOiAgICAgICAgICVkXG4iLCBkcV95MV9kYyk7CisgICAgcHJpbnRmKCIgIERRIFkyIERDOiAgICAgICAgICVkXG4iLCBkcV95Ml9kYyk7CisgICAgcHJpbnRmKCIgIERRIFkyIEFDOiAgICAgICAgICVkXG4iLCBkcV95Ml9hYyk7CisgICAgcHJpbnRmKCIgIERRIFVWIERDOiAgICAgICAgICVkXG4iLCBkcV91dl9kYyk7CisgICAgcHJpbnRmKCIgIERRIFVWIEFDOiAgICAgICAgICVkXG4iLCBkcV91dl9hYyk7CisgIH0KKyAgaWYgKCgqYml0X3BvcyA+PiAzKSA+PSBwYXJ0aXRpb24wX2xlbmd0aCkgeworICAgIExPR19FUlJPUigiVHJ1bmNhdGVkIGxvc3N5IGJpdHN0cmVhbS4iKTsKKyAgICByZXR1cm4gV0VCUF9JTkZPX1RSVU5DQVRFRF9EQVRBOworICB9CisgIHJldHVybiBXRUJQX0lORk9fT0s7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBMb3NzbGVzcyBiaXRzdHJlYW0gYW5hbHlzaXMuCisKK3N0YXRpYyBpbnQgTExHZXRCaXRzKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsIHNpemVfdCBkYXRhX3NpemUsIHNpemVfdCBuYiwKKyAgICAgICAgICAgICAgICAgICAgIGludCogdmFsLCB1aW50NjRfdCogY29uc3QgYml0X3BvcykgeworICB1aW50MzJfdCBpID0gMDsKKyAgKnZhbCA9IDA7CisgIHdoaWxlIChpIDwgbmIpIHsKKyAgICBjb25zdCB1aW50NjRfdCBwID0gKCpiaXRfcG9zKSsrOworICAgIGlmICgocCA+PiAzKSA+PSBkYXRhX3NpemUpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICBjb25zdCBpbnQgYml0ID0gISEoZGF0YVtwID4+IDNdICYgKDEgPDwgKChwICYgNykpKSk7CisgICAgICAqdmFsID0gKnZhbCB8IChiaXQgPDwgaSk7CisgICAgICArK2k7CisgICAgfQorICB9CisgIHJldHVybiAxOworfQorCisjZGVmaW5lIExMX0dFVF9CSVRTKHYsIG4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCFMTEdldEJpdHMoZGF0YSwgZGF0YV9zaXplLCBuLCAmKHYpLCBiaXRfcG9zKSkgeyBcCisgICAgICBMT0dfRVJST1IoIlRydW5jYXRlZCBsb3NzbGVzcyBiaXRzdHJlYW0uIik7ICAgICAgICBcCisgICAgICByZXR1cm4gV0VCUF9JTkZPX1RSVU5DQVRFRF9EQVRBOyAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKK3N0YXRpYyBXZWJQSW5mb1N0YXR1cyBQYXJzZUxvc3NsZXNzVHJhbnNmb3JtKFdlYlBJbmZvKiBjb25zdCB3ZWJwX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90KiBjb25zdCAgYml0X3BvcykgeworICBpbnQgdXNlX3RyYW5zZm9ybSwgYmxvY2tfc2l6ZSwgbl9jb2xvcnM7CisgIExMX0dFVF9CSVRTKHVzZV90cmFuc2Zvcm0sIDEpOworICBwcmludGYoIiAgVXNlIHRyYW5zZm9ybTogICAgJXNcbiIsIHVzZV90cmFuc2Zvcm0gPyAiWWVzIiA6ICJObyIpOworICBpZiAodXNlX3RyYW5zZm9ybSkgeworICAgIGludCB0eXBlOworICAgIExMX0dFVF9CSVRTKHR5cGUsIDIpOworICAgIHByaW50ZigiICAxc3QgdHJhbnNmb3JtOiAgICAlcyAoJWQpXG4iLCBrTG9zc2xlc3NUcmFuc2Zvcm1zW3R5cGVdLCB0eXBlKTsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgIGNhc2UgUFJFRElDVE9SX1RSQU5TRk9STToKKyAgICAgIGNhc2UgQ1JPU1NfQ09MT1JfVFJBTlNGT1JNOgorICAgICAgICBMTF9HRVRfQklUUyhibG9ja19zaXplLCAzKTsKKyAgICAgICAgYmxvY2tfc2l6ZSA9IDEgPDwgKGJsb2NrX3NpemUgKyAyKTsKKyAgICAgICAgcHJpbnRmKCIgIFRyYW4uIGJsb2NrIHNpemU6ICVkXG4iLCBibG9ja19zaXplKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIENPTE9SX0lOREVYSU5HX1RSQU5TRk9STToKKyAgICAgICAgTExfR0VUX0JJVFMobl9jb2xvcnMsIDgpOworICAgICAgICBuX2NvbG9ycyArPSAxOworICAgICAgICBwcmludGYoIiAgTm8uIG9mIGNvbG9yczogICAgJWRcbiIsIG5fY29sb3JzKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFdFQlBfSU5GT19PSzsKK30KKworc3RhdGljIFdlYlBJbmZvU3RhdHVzIFBhcnNlTG9zc2xlc3NIZWFkZXIoY29uc3QgQ2h1bmtEYXRhKiBjb25zdCBjaHVua19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUEluZm8qIGNvbnN0IHdlYnBfaW5mbykgeworICBjb25zdCB1aW50OF90KiBkYXRhID0gY2h1bmtfZGF0YS0+cGF5bG9hZF87CisgIHNpemVfdCBkYXRhX3NpemUgPSBjaHVua19kYXRhLT5zaXplXyAtIENIVU5LX0hFQURFUl9TSVpFOworICB1aW50NjRfdCBiaXRfcG9zaXRpb24gPSAwOworICB1aW50NjRfdCogY29uc3QgYml0X3BvcyA9ICZiaXRfcG9zaXRpb247CisgIFdlYlBJbmZvU3RhdHVzIHN0YXR1czsKKyAgcHJpbnRmKCIgIFBhcnNpbmcgbG9zc2xlc3MgYml0c3RyZWFtLi4uXG4iKTsKKyAgaWYgKGRhdGFfc2l6ZSA8IFZQOExfRlJBTUVfSEVBREVSX1NJWkUpIHsKKyAgICBMT0dfRVJST1IoIlRydW5jYXRlZCBsb3NzbGVzcyBiaXRzdHJlYW0uIik7CisgICAgcmV0dXJuIFdFQlBfSU5GT19UUlVOQ0FURURfREFUQTsKKyAgfQorICBpZiAoZGF0YVswXSAhPSBWUDhMX01BR0lDX0JZVEUpIHsKKyAgICBMT0dfRVJST1IoIkludmFsaWQgbG9zc2xlc3MgYml0c3RyZWFtIHNpZ25hdHVyZS4iKTsKKyAgICByZXR1cm4gV0VCUF9JTkZPX0JJVFNUUkVBTV9FUlJPUjsKKyAgfQorICBkYXRhICs9IDE7CisgIGRhdGFfc2l6ZSAtPSAxOworICB7CisgICAgaW50IHdpZHRoLCBoZWlnaHQsIGhhc19hbHBoYSwgdmVyc2lvbjsKKyAgICBMTF9HRVRfQklUUyh3aWR0aCwgMTQpOworICAgIExMX0dFVF9CSVRTKGhlaWdodCwgMTQpOworICAgIExMX0dFVF9CSVRTKGhhc19hbHBoYSwgMSk7CisgICAgTExfR0VUX0JJVFModmVyc2lvbiwgMyk7CisgICAgd2lkdGggKz0gMTsKKyAgICBoZWlnaHQgKz0gMTsKKyAgICBwcmludGYoIiAgV2lkdGg6ICAgICAgICAgICAgJWRcbiIsIHdpZHRoKTsKKyAgICBwcmludGYoIiAgSGVpZ2h0OiAgICAgICAgICAgJWRcbiIsIGhlaWdodCk7CisgICAgcHJpbnRmKCIgIEFscGhhOiAgICAgICAgICAgICVkXG4iLCBoYXNfYWxwaGEpOworICAgIHByaW50ZigiICBWZXJzaW9uOiAgICAgICAgICAlZFxuIiwgdmVyc2lvbik7CisgIH0KKyAgc3RhdHVzID0gUGFyc2VMb3NzbGVzc1RyYW5zZm9ybSh3ZWJwX2luZm8sIGRhdGEsIGRhdGFfc2l6ZSwgYml0X3Bvcyk7CisgIGlmIChzdGF0dXMgIT0gV0VCUF9JTkZPX09LKSByZXR1cm4gc3RhdHVzOworICByZXR1cm4gV0VCUF9JTkZPX09LOworfQorCitzdGF0aWMgV2ViUEluZm9TdGF0dXMgUGFyc2VBbHBoYUhlYWRlcihjb25zdCBDaHVua0RhdGEqIGNvbnN0IGNodW5rX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQSW5mbyogY29uc3Qgd2VicF9pbmZvKSB7CisgIGNvbnN0IHVpbnQ4X3QqIGRhdGEgPSBjaHVua19kYXRhLT5wYXlsb2FkXzsKKyAgc2l6ZV90IGRhdGFfc2l6ZSA9IGNodW5rX2RhdGEtPnNpemVfIC0gQ0hVTktfSEVBREVSX1NJWkU7CisgIGlmIChkYXRhX3NpemUgPD0gQUxQSEFfSEVBREVSX0xFTikgeworICAgIExPR19FUlJPUigiVHJ1bmNhdGVkIEFMUEggY2h1bmsuIik7CisgICAgcmV0dXJuIFdFQlBfSU5GT19UUlVOQ0FURURfREFUQTsKKyAgfQorICBwcmludGYoIiAgUGFyc2luZyBBTFBIIGNodW5rLi4uXG4iKTsKKyAgeworICAgIGNvbnN0IGludCBjb21wcmVzc2lvbl9tZXRob2QgPSAoZGF0YVswXSA+PiAwKSAmIDB4MDM7CisgICAgY29uc3QgaW50IGZpbHRlciA9IChkYXRhWzBdID4+IDIpICYgMHgwMzsKKyAgICBjb25zdCBpbnQgcHJlX3Byb2Nlc3NpbmcgPSAoZGF0YVswXSA+PiA0KSAmIDB4MDM7CisgICAgY29uc3QgaW50IHJlc2VydmVkX2JpdHMgPSAoZGF0YVswXSA+PiA2KSAmIDB4MDM7CisgICAgcHJpbnRmKCIgIENvbXByZXNzaW9uOiAgICAgICVkXG4iLCBjb21wcmVzc2lvbl9tZXRob2QpOworICAgIHByaW50ZigiICBGaWx0ZXI6ICAgICAgICAgICAlcyAoJWQpXG4iLAorICAgICAgICAgICBrQWxwaGFGaWx0ZXJNZXRob2RzW2ZpbHRlcl0sIGZpbHRlcik7CisgICAgcHJpbnRmKCIgIFByZS1wcm9jZXNzaW5nOiAgICVkXG4iLCBwcmVfcHJvY2Vzc2luZyk7CisgICAgaWYgKGNvbXByZXNzaW9uX21ldGhvZCA+IEFMUEhBX0xPU1NMRVNTX0NPTVBSRVNTSU9OKSB7CisgICAgICBMT0dfRVJST1IoIkludmFsaWQgQWxwaGEgY29tcHJlc3Npb24gbWV0aG9kLiIpOworICAgICAgcmV0dXJuIFdFQlBfSU5GT19CSVRTVFJFQU1fRVJST1I7CisgICAgfQorICAgIGlmIChwcmVfcHJvY2Vzc2luZyA+IEFMUEhBX1BSRVBST0NFU1NFRF9MRVZFTFMpIHsKKyAgICAgIExPR19FUlJPUigiSW52YWxpZCBBbHBoYSBwcmUtcHJvY2Vzc2luZyBtZXRob2QuIik7CisgICAgICByZXR1cm4gV0VCUF9JTkZPX0JJVFNUUkVBTV9FUlJPUjsKKyAgICB9CisgICAgaWYgKHJlc2VydmVkX2JpdHMgIT0gMCkgeworICAgICAgTE9HX1dBUk4oIlJlc2VydmVkIGJpdHMgaW4gQUxQSCBjaHVuayBoZWFkZXIgYXJlIG5vdCBhbGwgMC4iKTsKKyAgICB9CisgICAgZGF0YSArPSBBTFBIQV9IRUFERVJfTEVOOworICAgIGRhdGFfc2l6ZSAtPSBBTFBIQV9IRUFERVJfTEVOOworICAgIGlmIChjb21wcmVzc2lvbl9tZXRob2QgPT0gQUxQSEFfTE9TU0xFU1NfQ09NUFJFU1NJT04pIHsKKyAgICAgIHVpbnQ2NF90IGJpdF9wb3MgPSAwOworICAgICAgV2ViUEluZm9TdGF0dXMgc3RhdHVzID0KKyAgICAgICAgICBQYXJzZUxvc3NsZXNzVHJhbnNmb3JtKHdlYnBfaW5mbywgZGF0YSwgZGF0YV9zaXplLCAmYml0X3Bvcyk7CisgICAgICBpZiAoc3RhdHVzICE9IFdFQlBfSU5GT19PSykgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFdFQlBfSU5GT19PSzsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENodW5rIHBhcnNpbmcuCisKK3N0YXRpYyBXZWJQSW5mb1N0YXR1cyBQYXJzZVJJRkZIZWFkZXIoY29uc3QgV2ViUEluZm8qIGNvbnN0IHdlYnBfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtQnVmZmVyKiBjb25zdCBtZW0pIHsKKyAgY29uc3Qgc2l6ZV90IG1pbl9zaXplID0gUklGRl9IRUFERVJfU0laRSArIENIVU5LX0hFQURFUl9TSVpFOworICBzaXplX3QgcmlmZl9zaXplOworCisgIGlmIChNZW1EYXRhU2l6ZShtZW0pIDwgbWluX3NpemUpIHsKKyAgICBMT0dfRVJST1IoIlRydW5jYXRlZCBkYXRhIGRldGVjdGVkIHdoZW4gcGFyc2luZyBSSUZGIGhlYWRlci4iKTsKKyAgICByZXR1cm4gV0VCUF9JTkZPX1RSVU5DQVRFRF9EQVRBOworICB9CisgIGlmIChtZW1jbXAoR2V0QnVmZmVyKG1lbSksICJSSUZGIiwgQ0hVTktfU0laRV9CWVRFUykgfHwKKyAgICAgIG1lbWNtcChHZXRCdWZmZXIobWVtKSArIENIVU5LX0hFQURFUl9TSVpFLCAiV0VCUCIsIENIVU5LX1NJWkVfQllURVMpKSB7CisgICAgTE9HX0VSUk9SKCJDb3JydXB0ZWQgUklGRiBoZWFkZXIuIik7CisgICAgcmV0dXJuIFdFQlBfSU5GT19QQVJTRV9FUlJPUjsKKyAgfQorICByaWZmX3NpemUgPSBHZXRMRTMyKEdldEJ1ZmZlcihtZW0pICsgVEFHX1NJWkUpOworICBpZiAocmlmZl9zaXplIDwgQ0hVTktfSEVBREVSX1NJWkUpIHsKKyAgICBMT0dfRVJST1IoIlJJRkYgc2l6ZSBpcyB0b28gc21hbGwuIik7CisgICAgcmV0dXJuIFdFQlBfSU5GT19QQVJTRV9FUlJPUjsKKyAgfQorICBpZiAocmlmZl9zaXplID4gTUFYX0NIVU5LX1BBWUxPQUQpIHsKKyAgICBMT0dfRVJST1IoIlJJRkYgc2l6ZSBpcyBvdmVyIGxpbWl0LiIpOworICAgIHJldHVybiBXRUJQX0lORk9fUEFSU0VfRVJST1I7CisgIH0KKyAgcmlmZl9zaXplICs9IENIVU5LX0hFQURFUl9TSVpFOworICBpZiAoIXdlYnBfaW5mby0+cXVpZXRfKSB7CisgICAgcHJpbnRmKCJSSUZGIEhFQURFUjpcbiIpOworICAgIHByaW50ZigiICBGaWxlIHNpemU6ICU2ZFxuIiwgKGludClyaWZmX3NpemUpOworICB9CisgIGlmIChyaWZmX3NpemUgPCBtZW0tPmVuZF8pIHsKKyAgICBMT0dfV0FSTigiUklGRiBzaXplIGlzIHNtYWxsZXIgdGhhbiB0aGUgZmlsZSBzaXplLiIpOworICAgIG1lbS0+ZW5kXyA9IHJpZmZfc2l6ZTsKKyAgfSBlbHNlIGlmIChyaWZmX3NpemUgPiBtZW0tPmVuZF8pIHsKKyAgICBMT0dfRVJST1IoIlRydW5jYXRlZCBkYXRhIGRldGVjdGVkIHdoZW4gcGFyc2luZyBSSUZGIHBheWxvYWQuIik7CisgICAgcmV0dXJuIFdFQlBfSU5GT19UUlVOQ0FURURfREFUQTsKKyAgfQorICBTa2lwKG1lbSwgUklGRl9IRUFERVJfU0laRSk7CisgIHJldHVybiBXRUJQX0lORk9fT0s7Cit9CisKK3N0YXRpYyBXZWJQSW5mb1N0YXR1cyBQYXJzZUNodW5rKGNvbnN0IFdlYlBJbmZvKiBjb25zdCB3ZWJwX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1CdWZmZXIqIGNvbnN0IG1lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENodW5rRGF0YSogY29uc3QgY2h1bmtfZGF0YSkgeworICBtZW1zZXQoY2h1bmtfZGF0YSwgMCwgc2l6ZW9mKCpjaHVua19kYXRhKSk7CisgIGlmIChNZW1EYXRhU2l6ZShtZW0pIDwgQ0hVTktfSEVBREVSX1NJWkUpIHsKKyAgICBMT0dfRVJST1IoIlRydW5jYXRlZCBkYXRhIGRldGVjdGVkIHdoZW4gcGFyc2luZyBjaHVuayBoZWFkZXIuIik7CisgICAgcmV0dXJuIFdFQlBfSU5GT19UUlVOQ0FURURfREFUQTsKKyAgfSBlbHNlIHsKKyAgICBjb25zdCBzaXplX3QgY2h1bmtfc3RhcnRfb2Zmc2V0ID0gbWVtLT5zdGFydF87CisgICAgY29uc3QgdWludDMyX3QgZm91cmNjID0gUmVhZE1lbUJ1ZkxFMzIobWVtKTsKKyAgICBjb25zdCB1aW50MzJfdCBwYXlsb2FkX3NpemUgPSBSZWFkTWVtQnVmTEUzMihtZW0pOworICAgIGNvbnN0IHVpbnQzMl90IHBheWxvYWRfc2l6ZV9wYWRkZWQgPSBwYXlsb2FkX3NpemUgKyAocGF5bG9hZF9zaXplICYgMSk7CisgICAgY29uc3Qgc2l6ZV90IGNodW5rX3NpemUgPSBDSFVOS19IRUFERVJfU0laRSArIHBheWxvYWRfc2l6ZV9wYWRkZWQ7CisgICAgaW50IGk7CisgICAgaWYgKHBheWxvYWRfc2l6ZSA+IE1BWF9DSFVOS19QQVlMT0FEKSB7CisgICAgICBMT0dfRVJST1IoIlNpemUgb2YgY2h1bmsgcGF5bG9hZCBpcyBvdmVyIGxpbWl0LiIpOworICAgICAgcmV0dXJuIFdFQlBfSU5GT19JTlZBTElEX1BBUkFNOworICAgIH0KKyAgICBpZiAocGF5bG9hZF9zaXplX3BhZGRlZCA+IE1lbURhdGFTaXplKG1lbSkpeworICAgICAgTE9HX0VSUk9SKCJUcnVuY2F0ZWQgZGF0YSBkZXRlY3RlZCB3aGVuIHBhcnNpbmcgY2h1bmsgcGF5bG9hZC4iKTsKKyAgICAgIHJldHVybiBXRUJQX0lORk9fVFJVTkNBVEVEX0RBVEE7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBDSFVOS19UWVBFUzsgKytpKSB7CisgICAgICBpZiAoIW1lbWNtcChrV2ViUENodW5rVGFnc1tpXSwgJmZvdXJjYywgVEFHX1NJWkUpKSBicmVhazsKKyAgICB9CisgICAgY2h1bmtfZGF0YS0+b2Zmc2V0XyA9IGNodW5rX3N0YXJ0X29mZnNldDsKKyAgICBjaHVua19kYXRhLT5zaXplXyA9IGNodW5rX3NpemU7CisgICAgY2h1bmtfZGF0YS0+aWRfID0gKENodW5rSUQpaTsKKyAgICBjaHVua19kYXRhLT5wYXlsb2FkXyA9IEdldEJ1ZmZlcihtZW0pOworICAgIGlmIChjaHVua19kYXRhLT5pZF8gPT0gQ0hVTktfQU5NRikgeworICAgICAgaWYgKHBheWxvYWRfc2l6ZSAhPSBwYXlsb2FkX3NpemVfcGFkZGVkKSB7CisgICAgICAgIExPR19FUlJPUigiQU5NRiBjaHVuayBzaXplIHNob3VsZCBhbHdheXMgYmUgZXZlbi4iKTsKKyAgICAgICAgcmV0dXJuIFdFQlBfSU5GT19QQVJTRV9FUlJPUjsKKyAgICAgIH0KKyAgICAgIC8vIFRoZXJlIGFyZSBzdWItY2h1bmtzIHRvIGJlIHBhcnNlZCBpbiBhbiBBTk1GIGNodW5rLgorICAgICAgU2tpcChtZW0sIEFOTUZfQ0hVTktfU0laRSk7CisgICAgfSBlbHNlIHsKKyAgICAgIFNraXAobWVtLCBwYXlsb2FkX3NpemVfcGFkZGVkKTsKKyAgICB9CisgICAgcmV0dXJuIFdFQlBfSU5GT19PSzsKKyAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ2h1bmsgYW5hbHlzaXMuCisKK3N0YXRpYyBXZWJQSW5mb1N0YXR1cyBQcm9jZXNzVlA4WENodW5rKGNvbnN0IENodW5rRGF0YSogY29uc3QgY2h1bmtfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBJbmZvKiBjb25zdCB3ZWJwX2luZm8pIHsKKyAgY29uc3QgdWludDhfdCogZGF0YSA9IGNodW5rX2RhdGEtPnBheWxvYWRfOworICBpZiAod2VicF9pbmZvLT5jaHVua19jb3VudHNfW0NIVU5LX1ZQOF0gfHwKKyAgICAgIHdlYnBfaW5mby0+Y2h1bmtfY291bnRzX1tDSFVOS19WUDhMXSB8fAorICAgICAgd2VicF9pbmZvLT5jaHVua19jb3VudHNfW0NIVU5LX1ZQOFhdKSB7CisgICAgTE9HX0VSUk9SKCJBbHJlYWR5IHNlZW4gYSBWUDgvVlA4TC9WUDhYIGNodW5rIHdoZW4gcGFyc2luZyBWUDhYIGNodW5rLiIpOworICAgIHJldHVybiBXRUJQX0lORk9fUEFSU0VfRVJST1I7CisgIH0KKyAgaWYgKGNodW5rX2RhdGEtPnNpemVfICE9IFZQOFhfQ0hVTktfU0laRSArIENIVU5LX0hFQURFUl9TSVpFKSB7CisgICAgTE9HX0VSUk9SKCJDb3JydXB0ZWQgVlA4WCBjaHVuay4iKTsKKyAgICByZXR1cm4gV0VCUF9JTkZPX1BBUlNFX0VSUk9SOworICB9CisgICsrd2VicF9pbmZvLT5jaHVua19jb3VudHNfW0NIVU5LX1ZQOFhdOworICB3ZWJwX2luZm8tPmZlYXR1cmVfZmxhZ3NfID0gKmRhdGE7CisgIGRhdGEgKz0gNDsKKyAgd2VicF9pbmZvLT5jYW52YXNfd2lkdGhfID0gMSArIFJlYWRMRTI0KCZkYXRhKTsKKyAgd2VicF9pbmZvLT5jYW52YXNfaGVpZ2h0XyA9IDEgKyBSZWFkTEUyNCgmZGF0YSk7CisgIGlmICghd2VicF9pbmZvLT5xdWlldF8pIHsKKyAgICBwcmludGYoIiAgSUNDUDogJWRcbiAgQWxwaGE6ICVkXG4gIEVYSUY6ICVkXG4gIFhNUDogJWRcbiAgQW5pbWF0aW9uOiAlZFxuIiwKKyAgICAgICAgICAgKHdlYnBfaW5mby0+ZmVhdHVyZV9mbGFnc18gJiBJQ0NQX0ZMQUcpICE9IDAsCisgICAgICAgICAgICh3ZWJwX2luZm8tPmZlYXR1cmVfZmxhZ3NfICYgQUxQSEFfRkxBRykgIT0gMCwKKyAgICAgICAgICAgKHdlYnBfaW5mby0+ZmVhdHVyZV9mbGFnc18gJiBFWElGX0ZMQUcpICE9IDAsCisgICAgICAgICAgICh3ZWJwX2luZm8tPmZlYXR1cmVfZmxhZ3NfICYgWE1QX0ZMQUcpICE9IDAsCisgICAgICAgICAgICh3ZWJwX2luZm8tPmZlYXR1cmVfZmxhZ3NfICYgQU5JTUFUSU9OX0ZMQUcpICE9IDApOworICAgIHByaW50ZigiICBDYW52YXMgc2l6ZSAlZCB4ICVkXG4iLAorICAgICAgICAgICB3ZWJwX2luZm8tPmNhbnZhc193aWR0aF8sIHdlYnBfaW5mby0+Y2FudmFzX2hlaWdodF8pOworICB9CisgIGlmICh3ZWJwX2luZm8tPmNhbnZhc193aWR0aF8gPiBNQVhfQ0FOVkFTX1NJWkUpIHsKKyAgICBMT0dfV0FSTigiQ2FudmFzIHdpZHRoIGlzIG91dCBvZiByYW5nZSBpbiBWUDhYIGNodW5rLiIpOworICB9CisgIGlmICh3ZWJwX2luZm8tPmNhbnZhc19oZWlnaHRfID4gTUFYX0NBTlZBU19TSVpFKSB7CisgICAgTE9HX1dBUk4oIkNhbnZhcyBoZWlnaHQgaXMgb3V0IG9mIHJhbmdlIGluIFZQOFggY2h1bmsuIik7CisgIH0KKyAgaWYgKCh1aW50NjRfdCl3ZWJwX2luZm8tPmNhbnZhc193aWR0aF8gKiB3ZWJwX2luZm8tPmNhbnZhc19oZWlnaHRfID4KKyAgICAgIE1BWF9JTUFHRV9BUkVBKSB7CisgICAgTE9HX1dBUk4oIkNhbnZhcyBhcmVhIGlzIG91dCBvZiByYW5nZSBpbiBWUDhYIGNodW5rLiIpOworICB9CisgIHJldHVybiBXRUJQX0lORk9fT0s7Cit9CisKK3N0YXRpYyBXZWJQSW5mb1N0YXR1cyBQcm9jZXNzQU5JTUNodW5rKGNvbnN0IENodW5rRGF0YSogY29uc3QgY2h1bmtfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBJbmZvKiBjb25zdCB3ZWJwX2luZm8pIHsKKyAgY29uc3QgdWludDhfdCogZGF0YSA9IGNodW5rX2RhdGEtPnBheWxvYWRfOworICBpZiAoIXdlYnBfaW5mby0+Y2h1bmtfY291bnRzX1tDSFVOS19WUDhYXSkgeworICAgIExPR19FUlJPUigiQU5JTSBjaHVuayBkZXRlY3RlZCBiZWZvcmUgVlA4WCBjaHVuay4iKTsKKyAgICByZXR1cm4gV0VCUF9JTkZPX1BBUlNFX0VSUk9SOworICB9CisgIGlmIChjaHVua19kYXRhLT5zaXplXyAhPSBBTklNX0NIVU5LX1NJWkUgKyBDSFVOS19IRUFERVJfU0laRSkgeworICAgIExPR19FUlJPUigiQ29ycnVwdGVkIEFOSU0gY2h1bmsuIik7CisgICAgcmV0dXJuIFdFQlBfSU5GT19QQVJTRV9FUlJPUjsKKyAgfQorICB3ZWJwX2luZm8tPmJnY29sb3JfID0gUmVhZExFMzIoJmRhdGEpOworICB3ZWJwX2luZm8tPmxvb3BfY291bnRfID0gUmVhZExFMTYoJmRhdGEpOworICArK3dlYnBfaW5mby0+Y2h1bmtfY291bnRzX1tDSFVOS19BTklNXTsKKyAgaWYgKCF3ZWJwX2luZm8tPnF1aWV0XykgeworICAgIHByaW50ZigiICBCYWNrZ3JvdW5kIGNvbG9yOihBUkdCKSAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorICAgICAgICAgICAod2VicF9pbmZvLT5iZ2NvbG9yXyA+PiAyNCkgJiAweGZmLAorICAgICAgICAgICAod2VicF9pbmZvLT5iZ2NvbG9yXyA+PiAxNikgJiAweGZmLAorICAgICAgICAgICAod2VicF9pbmZvLT5iZ2NvbG9yXyA+PiA4KSAmIDB4ZmYsCisgICAgICAgICAgIHdlYnBfaW5mby0+Ymdjb2xvcl8gJiAweGZmKTsKKyAgICBwcmludGYoIiAgTG9vcCBjb3VudCAgICAgIDogJWRcbiIsIHdlYnBfaW5mby0+bG9vcF9jb3VudF8pOworICB9CisgIGlmICh3ZWJwX2luZm8tPmxvb3BfY291bnRfID4gTUFYX0xPT1BfQ09VTlQpIHsKKyAgICBMT0dfV0FSTigiTG9vcCBjb3VudCBpcyBvdXQgb2YgcmFuZ2UgaW4gQU5JTSBjaHVuay4iKTsKKyAgfQorICByZXR1cm4gV0VCUF9JTkZPX09LOworfQorCitzdGF0aWMgV2ViUEluZm9TdGF0dXMgUHJvY2Vzc0FOTUZDaHVuayhjb25zdCBDaHVua0RhdGEqIGNvbnN0IGNodW5rX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQSW5mbyogY29uc3Qgd2VicF9pbmZvKSB7CisgIGNvbnN0IHVpbnQ4X3QqIGRhdGEgPSBjaHVua19kYXRhLT5wYXlsb2FkXzsKKyAgaW50IG9mZnNldF94LCBvZmZzZXRfeSwgd2lkdGgsIGhlaWdodCwgZHVyYXRpb24sIGJsZW5kLCBkaXNwb3NlLCB0ZW1wOworICBpZiAod2VicF9pbmZvLT5pc19wcm9jZXNzaW5nX2FuaW1fZnJhbWVfKSB7CisgICAgTE9HX0VSUk9SKCJBTk1GIGNodW5rIGRldGVjdGVkIHdpdGhpbiBhbm90aGVyIEFOTUYgY2h1bmsuIik7CisgICAgcmV0dXJuIFdFQlBfSU5GT19QQVJTRV9FUlJPUjsKKyAgfQorICBpZiAoIXdlYnBfaW5mby0+Y2h1bmtfY291bnRzX1tDSFVOS19BTklNXSkgeworICAgIExPR19FUlJPUigiQU5NRiBjaHVuayBkZXRlY3RlZCBiZWZvcmUgQU5JTSBjaHVuay4iKTsKKyAgICByZXR1cm4gV0VCUF9JTkZPX1BBUlNFX0VSUk9SOworICB9CisgIGlmIChjaHVua19kYXRhLT5zaXplXyA8PSBDSFVOS19IRUFERVJfU0laRSArIEFOTUZfQ0hVTktfU0laRSkgeworICAgIExPR19FUlJPUigiVHJ1bmNhdGVkIGRhdGEgZGV0ZWN0ZWQgd2hlbiBwYXJzaW5nIEFOTUYgY2h1bmsuIik7CisgICAgcmV0dXJuIFdFQlBfSU5GT19UUlVOQ0FURURfREFUQTsKKyAgfQorICBvZmZzZXRfeCA9IDIgKiBSZWFkTEUyNCgmZGF0YSk7CisgIG9mZnNldF95ID0gMiAqIFJlYWRMRTI0KCZkYXRhKTsKKyAgd2lkdGggPSAxICsgUmVhZExFMjQoJmRhdGEpOworICBoZWlnaHQgPSAxICsgUmVhZExFMjQoJmRhdGEpOworICBkdXJhdGlvbiA9IFJlYWRMRTI0KCZkYXRhKTsKKyAgdGVtcCA9ICpkYXRhOworICBkaXNwb3NlID0gdGVtcCAmIDE7CisgIGJsZW5kID0gKHRlbXAgPj4gMSkgJiAxOworICArK3dlYnBfaW5mby0+Y2h1bmtfY291bnRzX1tDSFVOS19BTk1GXTsKKyAgaWYgKCF3ZWJwX2luZm8tPnF1aWV0XykgeworICAgIHByaW50ZigiICBPZmZzZXRfWDogJWRcbiAgT2Zmc2V0X1k6ICVkXG4gIFdpZHRoOiAlZFxuICBIZWlnaHQ6ICVkXG4iCisgICAgICAgICAgICIgIER1cmF0aW9uOiAlZFxuICBEaXNwb3NlOiAlZFxuICBCbGVuZDogJWRcbiIsCisgICAgICAgICAgIG9mZnNldF94LCBvZmZzZXRfeSwgd2lkdGgsIGhlaWdodCwgZHVyYXRpb24sIGRpc3Bvc2UsIGJsZW5kKTsKKyAgfQorICBpZiAoZHVyYXRpb24gPiBNQVhfRFVSQVRJT04pIHsKKyAgICBMT0dfRVJST1IoIkludmFsaWQgZHVyYXRpb24gcGFyYW1ldGVyIGluIEFOTUYgY2h1bmsuIik7CisgICAgcmV0dXJuIFdFQlBfSU5GT19JTlZBTElEX1BBUkFNOworICB9CisgIGlmIChvZmZzZXRfeCA+IE1BWF9QT1NJVElPTl9PRkZTRVQgfHwgb2Zmc2V0X3kgPiBNQVhfUE9TSVRJT05fT0ZGU0VUKSB7CisgICAgTE9HX0VSUk9SKCJJbnZhbGlkIG9mZnNldCBwYXJhbWV0ZXJzIGluIEFOTUYgY2h1bmsuIik7CisgICAgcmV0dXJuIFdFQlBfSU5GT19JTlZBTElEX1BBUkFNOworICB9CisgIGlmICgodWludDY0X3Qpb2Zmc2V0X3ggKyB3aWR0aCA+ICh1aW50NjRfdCl3ZWJwX2luZm8tPmNhbnZhc193aWR0aF8gfHwKKyAgICAgICh1aW50NjRfdClvZmZzZXRfeSArIGhlaWdodCA+ICh1aW50NjRfdCl3ZWJwX2luZm8tPmNhbnZhc19oZWlnaHRfKSB7CisgICAgTE9HX0VSUk9SKCJGcmFtZSBleGNlZWRzIGNhbnZhcyBpbiBBTk1GIGNodW5rLiIpOworICAgIHJldHVybiBXRUJQX0lORk9fSU5WQUxJRF9QQVJBTTsKKyAgfQorICB3ZWJwX2luZm8tPmlzX3Byb2Nlc3NpbmdfYW5pbV9mcmFtZV8gPSAxOworICB3ZWJwX2luZm8tPnNlZW5fYWxwaGFfc3ViY2h1bmtfID0gMDsKKyAgd2VicF9pbmZvLT5zZWVuX2ltYWdlX3N1YmNodW5rXyA9IDA7CisgIHdlYnBfaW5mby0+ZnJhbWVfd2lkdGhfID0gd2lkdGg7CisgIHdlYnBfaW5mby0+ZnJhbWVfaGVpZ2h0XyA9IGhlaWdodDsKKyAgd2VicF9pbmZvLT5hbmltX2ZyYW1lX2RhdGFfc2l6ZV8gPQorICAgICAgY2h1bmtfZGF0YS0+c2l6ZV8gLSBDSFVOS19IRUFERVJfU0laRSAtIEFOTUZfQ0hVTktfU0laRTsKKyAgcmV0dXJuIFdFQlBfSU5GT19PSzsKK30KKworc3RhdGljIFdlYlBJbmZvU3RhdHVzIFByb2Nlc3NJbWFnZUNodW5rKGNvbnN0IENodW5rRGF0YSogY29uc3QgY2h1bmtfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQSW5mbyogY29uc3Qgd2VicF9pbmZvKSB7CisgIGNvbnN0IHVpbnQ4X3QqIGRhdGEgPSBjaHVua19kYXRhLT5wYXlsb2FkXyAtIENIVU5LX0hFQURFUl9TSVpFOworICBXZWJQQml0c3RyZWFtRmVhdHVyZXMgZmVhdHVyZXM7CisgIGNvbnN0IFZQOFN0YXR1c0NvZGUgdnA4X3N0YXR1cyA9CisgICAgICBXZWJQR2V0RmVhdHVyZXMoZGF0YSwgY2h1bmtfZGF0YS0+c2l6ZV8sICZmZWF0dXJlcyk7CisgIGlmICh2cDhfc3RhdHVzICE9IFZQOF9TVEFUVVNfT0spIHsKKyAgICBMT0dfRVJST1IoIlZQOC9WUDhMIGJpdHN0cmVhbSBlcnJvci4iKTsKKyAgICByZXR1cm4gV0VCUF9JTkZPX0JJVFNUUkVBTV9FUlJPUjsKKyAgfQorICBpZiAoIXdlYnBfaW5mby0+cXVpZXRfKSB7CisgICAgYXNzZXJ0KGZlYXR1cmVzLmZvcm1hdCA+PSAwICYmIGZlYXR1cmVzLmZvcm1hdCA8PSAyKTsKKyAgICBwcmludGYoIiAgV2lkdGg6ICVkXG4gIEhlaWdodDogJWRcbiAgQWxwaGE6ICVkXG4gIEFuaW1hdGlvbjogJWRcbiIKKyAgICAgICAgICAgIiAgRm9ybWF0OiAlcyAoJWQpXG4iLAorICAgICAgICAgICBmZWF0dXJlcy53aWR0aCwgZmVhdHVyZXMuaGVpZ2h0LCBmZWF0dXJlcy5oYXNfYWxwaGEsCisgICAgICAgICAgIGZlYXR1cmVzLmhhc19hbmltYXRpb24sIGtGb3JtYXRzW2ZlYXR1cmVzLmZvcm1hdF0sIGZlYXR1cmVzLmZvcm1hdCk7CisgIH0KKyAgaWYgKHdlYnBfaW5mby0+aXNfcHJvY2Vzc2luZ19hbmltX2ZyYW1lXykgeworICAgICsrd2VicF9pbmZvLT5hbm1mX3N1YmNodW5rX2NvdW50c19bY2h1bmtfZGF0YS0+aWRfID09IENIVU5LX1ZQOCA/IDAgOiAxXTsKKyAgICBpZiAoY2h1bmtfZGF0YS0+aWRfID09IENIVU5LX1ZQOEwgJiYgd2VicF9pbmZvLT5zZWVuX2FscGhhX3N1YmNodW5rXykgeworICAgICAgTE9HX0VSUk9SKCJCb3RoIFZQOEwgYW5kIEFMUEggc3ViLWNodW5rcyBhcmUgcHJlc2VudCBpbiBhbiBBTk1GIGNodW5rLiIpOworICAgICAgcmV0dXJuIFdFQlBfSU5GT19QQVJTRV9FUlJPUjsKKyAgICB9CisgICAgaWYgKHdlYnBfaW5mby0+ZnJhbWVfd2lkdGhfICE9IGZlYXR1cmVzLndpZHRoIHx8CisgICAgICAgIHdlYnBfaW5mby0+ZnJhbWVfaGVpZ2h0XyAhPSBmZWF0dXJlcy5oZWlnaHQpIHsKKyAgICAgIExPR19FUlJPUigiRnJhbWUgc2l6ZSBpbiBWUDgvVlA4TCBzdWItY2h1bmsgZGlmZmVycyBmcm9tIEFOTUYgaGVhZGVyLiIpOworICAgICAgcmV0dXJuIFdFQlBfSU5GT19QQVJTRV9FUlJPUjsKKyAgICB9CisgICAgaWYgKHdlYnBfaW5mby0+c2Vlbl9pbWFnZV9zdWJjaHVua18pIHsKKyAgICAgIExPR19FUlJPUigiQ29uc2VjdXRpdmUgVlA4L1ZQOEwgc3ViLWNodW5rcyBpbiBhbiBBTk1GIGNodW5rLiIpOworICAgICAgcmV0dXJuIFdFQlBfSU5GT19QQVJTRV9FUlJPUjsKKyAgICB9CisgICAgd2VicF9pbmZvLT5zZWVuX2ltYWdlX3N1YmNodW5rXyA9IDE7CisgIH0gZWxzZSB7CisgICAgaWYgKHdlYnBfaW5mby0+Y2h1bmtfY291bnRzX1tDSFVOS19WUDhdIHx8CisgICAgICAgIHdlYnBfaW5mby0+Y2h1bmtfY291bnRzX1tDSFVOS19WUDhMXSkgeworICAgICAgTE9HX0VSUk9SKCJNdWx0aXBsZSBWUDgvVlA4TCBjaHVua3MgZGV0ZWN0ZWQuIik7CisgICAgICByZXR1cm4gV0VCUF9JTkZPX1BBUlNFX0VSUk9SOworICAgIH0KKyAgICBpZiAoY2h1bmtfZGF0YS0+aWRfID09IENIVU5LX1ZQOEwgJiYKKyAgICAgICAgd2VicF9pbmZvLT5jaHVua19jb3VudHNfW0NIVU5LX0FMUEhBXSkgeworICAgICAgTE9HX1dBUk4oIkJvdGggVlA4TCBhbmQgQUxQSCBjaHVua3MgYXJlIGRldGVjdGVkLiIpOworICAgIH0KKyAgICBpZiAod2VicF9pbmZvLT5jaHVua19jb3VudHNfW0NIVU5LX0FOSU1dIHx8CisgICAgICAgIHdlYnBfaW5mby0+Y2h1bmtfY291bnRzX1tDSFVOS19BTk1GXSkgeworICAgICAgTE9HX0VSUk9SKCJWUDgvVlA4TCBjaHVuayBhbmQgQU5JTS9BTk1GIGNodW5rIGFyZSBib3RoIGRldGVjdGVkLiIpOworICAgICAgcmV0dXJuIFdFQlBfSU5GT19QQVJTRV9FUlJPUjsKKyAgICB9CisgICAgaWYgKHdlYnBfaW5mby0+Y2h1bmtfY291bnRzX1tDSFVOS19WUDhYXSkgeworICAgICAgaWYgKHdlYnBfaW5mby0+Y2FudmFzX3dpZHRoXyAhPSBmZWF0dXJlcy53aWR0aCB8fAorICAgICAgICAgIHdlYnBfaW5mby0+Y2FudmFzX2hlaWdodF8gIT0gZmVhdHVyZXMuaGVpZ2h0KSB7CisgICAgICAgIExPR19FUlJPUigiSW1hZ2Ugc2l6ZSBpbiBWUDgvVlA4TCBjaHVuayBkaWZmZXJzIGZyb20gVlA4WCBjaHVuay4iKTsKKyAgICAgICAgcmV0dXJuIFdFQlBfSU5GT19QQVJTRV9FUlJPUjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgd2VicF9pbmZvLT5jYW52YXNfd2lkdGhfID0gZmVhdHVyZXMud2lkdGg7CisgICAgICB3ZWJwX2luZm8tPmNhbnZhc19oZWlnaHRfID0gZmVhdHVyZXMuaGVpZ2h0OworICAgICAgaWYgKHdlYnBfaW5mby0+Y2FudmFzX3dpZHRoXyA8IDEgfHwgd2VicF9pbmZvLT5jYW52YXNfaGVpZ2h0XyA8IDEgfHwKKyAgICAgICAgICB3ZWJwX2luZm8tPmNhbnZhc193aWR0aF8gPiBNQVhfQ0FOVkFTX1NJWkUgfHwKKyAgICAgICAgICB3ZWJwX2luZm8tPmNhbnZhc19oZWlnaHRfID4gTUFYX0NBTlZBU19TSVpFIHx8CisgICAgICAgICAgKHVpbnQ2NF90KXdlYnBfaW5mby0+Y2FudmFzX3dpZHRoXyAqIHdlYnBfaW5mby0+Y2FudmFzX2hlaWdodF8gPgorICAgICAgICAgICAgICBNQVhfSU1BR0VfQVJFQSkgeworICAgICAgICBMT0dfV0FSTigiSW52YWxpZCBwYXJhbWV0ZXJzIGluIFZQOC9WUDhMIGNodW5rLiIpOworICAgICAgfQorICAgIH0KKyAgICArK3dlYnBfaW5mby0+Y2h1bmtfY291bnRzX1tjaHVua19kYXRhLT5pZF9dOworICB9CisgICsrd2VicF9pbmZvLT5udW1fZnJhbWVzXzsKKyAgd2VicF9pbmZvLT5oYXNfYWxwaGFfIHw9IGZlYXR1cmVzLmhhc19hbHBoYTsKKyAgaWYgKHdlYnBfaW5mby0+cGFyc2VfYml0c3RyZWFtXykgeworICAgIGNvbnN0IGludCBpc19sb3NzeSA9IChjaHVua19kYXRhLT5pZF8gPT0gQ0hVTktfVlA4KTsKKyAgICBjb25zdCBXZWJQSW5mb1N0YXR1cyBzdGF0dXMgPQorICAgICAgICBpc19sb3NzeSA/IFBhcnNlTG9zc3lIZWFkZXIoY2h1bmtfZGF0YSwgd2VicF9pbmZvKQorICAgICAgICAgICAgICAgICA6IFBhcnNlTG9zc2xlc3NIZWFkZXIoY2h1bmtfZGF0YSwgd2VicF9pbmZvKTsKKyAgICBpZiAoc3RhdHVzICE9IFdFQlBfSU5GT19PSykgcmV0dXJuIHN0YXR1czsKKyAgfQorICByZXR1cm4gV0VCUF9JTkZPX09LOworfQorCitzdGF0aWMgV2ViUEluZm9TdGF0dXMgUHJvY2Vzc0FMUEhDaHVuayhjb25zdCBDaHVua0RhdGEqIGNvbnN0IGNodW5rX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQSW5mbyogY29uc3Qgd2VicF9pbmZvKSB7CisgIGlmICh3ZWJwX2luZm8tPmlzX3Byb2Nlc3NpbmdfYW5pbV9mcmFtZV8pIHsKKyAgICArK3dlYnBfaW5mby0+YW5tZl9zdWJjaHVua19jb3VudHNfWzJdOworICAgIGlmICh3ZWJwX2luZm8tPnNlZW5fYWxwaGFfc3ViY2h1bmtfKSB7CisgICAgICBMT0dfRVJST1IoIkNvbnNlY3V0aXZlIEFMUEggc3ViLWNodW5rcyBpbiBhbiBBTk1GIGNodW5rLiIpOworICAgICAgcmV0dXJuIFdFQlBfSU5GT19QQVJTRV9FUlJPUjsKKyAgICB9CisgICAgd2VicF9pbmZvLT5zZWVuX2FscGhhX3N1YmNodW5rXyA9IDE7CisKKyAgICBpZiAod2VicF9pbmZvLT5zZWVuX2ltYWdlX3N1YmNodW5rXykgeworICAgICAgTE9HX0VSUk9SKCJBTFBIQSBzdWItY2h1bmsgZGV0ZWN0ZWQgYWZ0ZXIgVlA4IHN1Yi1jaHVuayAiCisgICAgICAgICAgICAgICAgImluIGFuIEFOTUYgY2h1bmsuIik7CisgICAgICByZXR1cm4gV0VCUF9JTkZPX1BBUlNFX0VSUk9SOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAod2VicF9pbmZvLT5jaHVua19jb3VudHNfW0NIVU5LX0FOSU1dIHx8CisgICAgICAgIHdlYnBfaW5mby0+Y2h1bmtfY291bnRzX1tDSFVOS19BTk1GXSkgeworICAgICAgTE9HX0VSUk9SKCJBTFBIQSBjaHVuayBhbmQgQU5JTS9BTk1GIGNodW5rIGFyZSBib3RoIGRldGVjdGVkLiIpOworICAgICAgcmV0dXJuIFdFQlBfSU5GT19QQVJTRV9FUlJPUjsKKyAgICB9CisgICAgaWYgKCF3ZWJwX2luZm8tPmNodW5rX2NvdW50c19bQ0hVTktfVlA4WF0pIHsKKyAgICAgIExPR19FUlJPUigiQUxQSEEgY2h1bmsgZGV0ZWN0ZWQgYmVmb3JlIFZQOFggY2h1bmsuIik7CisgICAgICByZXR1cm4gV0VCUF9JTkZPX1BBUlNFX0VSUk9SOworICAgIH0KKyAgICBpZiAod2VicF9pbmZvLT5jaHVua19jb3VudHNfW0NIVU5LX1ZQOF0pIHsKKyAgICAgIExPR19FUlJPUigiQUxQSEEgY2h1bmsgZGV0ZWN0ZWQgYWZ0ZXIgVlA4IGNodW5rLiIpOworICAgICAgcmV0dXJuIFdFQlBfSU5GT19QQVJTRV9FUlJPUjsKKyAgICB9CisgICAgaWYgKHdlYnBfaW5mby0+Y2h1bmtfY291bnRzX1tDSFVOS19BTFBIQV0pIHsKKyAgICAgIExPR19FUlJPUigiTXVsdGlwbGUgQUxQSEEgY2h1bmtzIGRldGVjdGVkLiIpOworICAgICAgcmV0dXJuIFdFQlBfSU5GT19QQVJTRV9FUlJPUjsKKyAgICB9CisgICAgKyt3ZWJwX2luZm8tPmNodW5rX2NvdW50c19bQ0hVTktfQUxQSEFdOworICB9CisgIHdlYnBfaW5mby0+aGFzX2FscGhhXyA9IDE7CisgIGlmICh3ZWJwX2luZm8tPnBhcnNlX2JpdHN0cmVhbV8pIHsKKyAgICBjb25zdCBXZWJQSW5mb1N0YXR1cyBzdGF0dXMgPSBQYXJzZUFscGhhSGVhZGVyKGNodW5rX2RhdGEsIHdlYnBfaW5mbyk7CisgICAgaWYgKHN0YXR1cyAhPSBXRUJQX0lORk9fT0spIHJldHVybiBzdGF0dXM7CisgIH0KKyAgcmV0dXJuIFdFQlBfSU5GT19PSzsKK30KKworc3RhdGljIFdlYlBJbmZvU3RhdHVzIFByb2Nlc3NJQ0NQQ2h1bmsoY29uc3QgQ2h1bmtEYXRhKiBjb25zdCBjaHVua19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUEluZm8qIGNvbnN0IHdlYnBfaW5mbykgeworICAodm9pZCljaHVua19kYXRhOworICBpZiAoIXdlYnBfaW5mby0+Y2h1bmtfY291bnRzX1tDSFVOS19WUDhYXSkgeworICAgIExPR19FUlJPUigiSUNDUCBjaHVuayBkZXRlY3RlZCBiZWZvcmUgVlA4WCBjaHVuay4iKTsKKyAgICByZXR1cm4gV0VCUF9JTkZPX1BBUlNFX0VSUk9SOworICB9CisgIGlmICh3ZWJwX2luZm8tPmNodW5rX2NvdW50c19bQ0hVTktfVlA4XSB8fAorICAgICAgd2VicF9pbmZvLT5jaHVua19jb3VudHNfW0NIVU5LX1ZQOExdIHx8CisgICAgICB3ZWJwX2luZm8tPmNodW5rX2NvdW50c19bQ0hVTktfQU5JTV0pIHsKKyAgICBMT0dfRVJST1IoIklDQ1AgY2h1bmsgZGV0ZWN0ZWQgYWZ0ZXIgaW1hZ2UgZGF0YS4iKTsKKyAgICByZXR1cm4gV0VCUF9JTkZPX1BBUlNFX0VSUk9SOworICB9CisgICsrd2VicF9pbmZvLT5jaHVua19jb3VudHNfW0NIVU5LX0lDQ1BdOworICByZXR1cm4gV0VCUF9JTkZPX09LOworfQorCitzdGF0aWMgV2ViUEluZm9TdGF0dXMgUHJvY2Vzc0NodW5rKGNvbnN0IENodW5rRGF0YSogY29uc3QgY2h1bmtfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUEluZm8qIGNvbnN0IHdlYnBfaW5mbykgeworICBXZWJQSW5mb1N0YXR1cyBzdGF0dXMgPSBXRUJQX0lORk9fT0s7CisgIENodW5rSUQgaWQgPSBjaHVua19kYXRhLT5pZF87CisgIGlmIChjaHVua19kYXRhLT5pZF8gPT0gQ0hVTktfVU5LTk9XTikgeworICAgIGNoYXIgZXJyb3JfbWVzc2FnZVs1MF07CisgICAgc25wcmludGYoZXJyb3JfbWVzc2FnZSwgNTAsICJVbmtub3duIGNodW5rIGF0IG9mZnNldCAlNmQsIGxlbmd0aCAlNmQiLAorICAgICAgICAgICAgKGludCljaHVua19kYXRhLT5vZmZzZXRfLCAoaW50KWNodW5rX2RhdGEtPnNpemVfKTsKKyAgICBMT0dfV0FSTihlcnJvcl9tZXNzYWdlKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoIXdlYnBfaW5mby0+cXVpZXRfKSB7CisgICAgICBjb25zdCBjaGFyKiB0YWcgPSBrV2ViUENodW5rVGFnc1tjaHVua19kYXRhLT5pZF9dOworICAgICAgcHJpbnRmKCJDaHVuayAlYyVjJWMlYyBhdCBvZmZzZXQgJTZkLCBsZW5ndGggJTZkXG4iLAorICAgICAgICAgICAgIHRhZ1swXSwgdGFnWzFdLCB0YWdbMl0sIHRhZ1szXSwgKGludCljaHVua19kYXRhLT5vZmZzZXRfLAorICAgICAgICAgICAgIChpbnQpY2h1bmtfZGF0YS0+c2l6ZV8pOworICAgIH0KKyAgfQorICBzd2l0Y2ggKGlkKSB7CisgICAgY2FzZSBDSFVOS19WUDg6CisgICAgY2FzZSBDSFVOS19WUDhMOgorICAgICAgc3RhdHVzID0gUHJvY2Vzc0ltYWdlQ2h1bmsoY2h1bmtfZGF0YSwgd2VicF9pbmZvKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0hVTktfVlA4WDoKKyAgICAgIHN0YXR1cyA9IFByb2Nlc3NWUDhYQ2h1bmsoY2h1bmtfZGF0YSwgd2VicF9pbmZvKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0hVTktfQUxQSEE6CisgICAgICBzdGF0dXMgPSBQcm9jZXNzQUxQSENodW5rKGNodW5rX2RhdGEsIHdlYnBfaW5mbyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENIVU5LX0FOSU06CisgICAgICBzdGF0dXMgPSBQcm9jZXNzQU5JTUNodW5rKGNodW5rX2RhdGEsIHdlYnBfaW5mbyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENIVU5LX0FOTUY6CisgICAgICBzdGF0dXMgPSBQcm9jZXNzQU5NRkNodW5rKGNodW5rX2RhdGEsIHdlYnBfaW5mbyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENIVU5LX0lDQ1A6CisgICAgICBzdGF0dXMgPSBQcm9jZXNzSUNDUENodW5rKGNodW5rX2RhdGEsIHdlYnBfaW5mbyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENIVU5LX0VYSUY6CisgICAgY2FzZSBDSFVOS19YTVA6CisgICAgICArK3dlYnBfaW5mby0+Y2h1bmtfY291bnRzX1tpZF07CisgICAgICBicmVhazsKKyAgICBjYXNlIENIVU5LX1VOS05PV046CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIGlmICh3ZWJwX2luZm8tPmlzX3Byb2Nlc3NpbmdfYW5pbV9mcmFtZV8gJiYgaWQgIT0gQ0hVTktfQU5NRikgeworICAgIGlmICh3ZWJwX2luZm8tPmFuaW1fZnJhbWVfZGF0YV9zaXplXyA9PSBjaHVua19kYXRhLT5zaXplXykgeworICAgICAgaWYgKCF3ZWJwX2luZm8tPnNlZW5faW1hZ2Vfc3ViY2h1bmtfKSB7CisgICAgICAgIExPR19FUlJPUigiTm8gVlA4L1ZQOEwgY2h1bmsgZGV0ZWN0ZWQgaW4gYW4gQU5NRiBjaHVuay4iKTsKKyAgICAgICAgcmV0dXJuIFdFQlBfSU5GT19QQVJTRV9FUlJPUjsKKyAgICAgIH0KKyAgICAgIHdlYnBfaW5mby0+aXNfcHJvY2Vzc2luZ19hbmltX2ZyYW1lXyA9IDA7CisgICAgfSBlbHNlIGlmICh3ZWJwX2luZm8tPmFuaW1fZnJhbWVfZGF0YV9zaXplXyA+IGNodW5rX2RhdGEtPnNpemVfKSB7CisgICAgICB3ZWJwX2luZm8tPmFuaW1fZnJhbWVfZGF0YV9zaXplXyAtPSBjaHVua19kYXRhLT5zaXplXzsKKyAgICB9IGVsc2UgeworICAgICAgTE9HX0VSUk9SKCJUcnVuY2F0ZWQgZGF0YSBkZXRlY3RlZCB3aGVuIHBhcnNpbmcgQU5NRiBjaHVuay4iKTsKKyAgICAgIHJldHVybiBXRUJQX0lORk9fVFJVTkNBVEVEX0RBVEE7CisgICAgfQorICB9CisgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBXZWJQSW5mb1N0YXR1cyBWYWxpZGF0ZShjb25zdCBXZWJQSW5mbyogY29uc3Qgd2VicF9pbmZvKSB7CisgIGlmICh3ZWJwX2luZm8tPm51bV9mcmFtZXNfIDwgMSkgeworICAgIExPR19FUlJPUigiTm8gaW1hZ2UvZnJhbWUgZGV0ZWN0ZWQuIik7CisgICAgcmV0dXJuIFdFQlBfSU5GT19NSVNTSU5HX0RBVEE7CisgIH0KKyAgaWYgKHdlYnBfaW5mby0+Y2h1bmtfY291bnRzX1tDSFVOS19WUDhYXSkgeworICAgIGNvbnN0IGludCBpY2NwID0gISEod2VicF9pbmZvLT5mZWF0dXJlX2ZsYWdzXyAmIElDQ1BfRkxBRyk7CisgICAgY29uc3QgaW50IGV4aWYgPSAhISh3ZWJwX2luZm8tPmZlYXR1cmVfZmxhZ3NfICYgRVhJRl9GTEFHKTsKKyAgICBjb25zdCBpbnQgeG1wID0gISEod2VicF9pbmZvLT5mZWF0dXJlX2ZsYWdzXyAmIFhNUF9GTEFHKTsKKyAgICBjb25zdCBpbnQgYW5pbWF0aW9uID0gISEod2VicF9pbmZvLT5mZWF0dXJlX2ZsYWdzXyAmIEFOSU1BVElPTl9GTEFHKTsKKyAgICBjb25zdCBpbnQgYWxwaGEgPSAhISh3ZWJwX2luZm8tPmZlYXR1cmVfZmxhZ3NfICYgQUxQSEFfRkxBRyk7CisgICAgaWYgKCFhbHBoYSAmJiB3ZWJwX2luZm8tPmhhc19hbHBoYV8pIHsKKyAgICAgIExPR19FUlJPUigiVW5leHBlY3RlZCBhbHBoYSBkYXRhIGRldGVjdGVkLiIpOworICAgICAgcmV0dXJuIFdFQlBfSU5GT19QQVJTRV9FUlJPUjsKKyAgICB9CisgICAgaWYgKGFscGhhICYmICF3ZWJwX2luZm8tPmhhc19hbHBoYV8pIHsKKyAgICAgIExPR19XQVJOKCJBbHBoYSBmbGFnIGlzIHNldCB3aXRoIG5vIGFscGhhIGRhdGEgcHJlc2VudC4iKTsKKyAgICB9CisgICAgaWYgKGljY3AgJiYgIXdlYnBfaW5mby0+Y2h1bmtfY291bnRzX1tDSFVOS19JQ0NQXSkgeworICAgICAgTE9HX0VSUk9SKCJNaXNzaW5nIElDQ1AgY2h1bmsuIik7CisgICAgICByZXR1cm4gV0VCUF9JTkZPX01JU1NJTkdfREFUQTsKKyAgICB9CisgICAgaWYgKGV4aWYgJiYgIXdlYnBfaW5mby0+Y2h1bmtfY291bnRzX1tDSFVOS19FWElGXSkgeworICAgICAgTE9HX0VSUk9SKCJNaXNzaW5nIEVYSUYgY2h1bmsuIik7CisgICAgICByZXR1cm4gV0VCUF9JTkZPX01JU1NJTkdfREFUQTsKKyAgICB9CisgICAgaWYgKHhtcCAmJiAhd2VicF9pbmZvLT5jaHVua19jb3VudHNfW0NIVU5LX1hNUF0pIHsKKyAgICAgIExPR19FUlJPUigiTWlzc2luZyBYTVAgY2h1bmsuIik7CisgICAgICByZXR1cm4gV0VCUF9JTkZPX01JU1NJTkdfREFUQTsKKyAgICB9CisgICAgaWYgKCFpY2NwICYmIHdlYnBfaW5mby0+Y2h1bmtfY291bnRzX1tDSFVOS19JQ0NQXSkgeworICAgICAgTE9HX0VSUk9SKCJVbmV4cGVjdGVkIElDQ1AgY2h1bmsgZGV0ZWN0ZWQuIik7CisgICAgICByZXR1cm4gV0VCUF9JTkZPX1BBUlNFX0VSUk9SOworICAgIH0KKyAgICBpZiAoIWV4aWYgJiYgd2VicF9pbmZvLT5jaHVua19jb3VudHNfW0NIVU5LX0VYSUZdKSB7CisgICAgICBMT0dfRVJST1IoIlVuZXhwZWN0ZWQgRVhJRiBjaHVuayBkZXRlY3RlZC4iKTsKKyAgICAgIHJldHVybiBXRUJQX0lORk9fUEFSU0VfRVJST1I7CisgICAgfQorICAgIGlmICgheG1wICYmIHdlYnBfaW5mby0+Y2h1bmtfY291bnRzX1tDSFVOS19YTVBdKSB7CisgICAgICBMT0dfRVJST1IoIlVuZXhwZWN0ZWQgWE1QIGNodW5rIGRldGVjdGVkLiIpOworICAgICAgcmV0dXJuIFdFQlBfSU5GT19QQVJTRV9FUlJPUjsKKyAgICB9CisgICAgLy8gSW5jb21wbGV0ZSBhbmltYXRpb24gZnJhbWUuCisgICAgaWYgKHdlYnBfaW5mby0+aXNfcHJvY2Vzc2luZ19hbmltX2ZyYW1lXykgcmV0dXJuIFdFQlBfSU5GT19NSVNTSU5HX0RBVEE7CisgICAgaWYgKCFhbmltYXRpb24gJiYgd2VicF9pbmZvLT5udW1fZnJhbWVzXyA+IDEpIHsKKyAgICAgIExPR19FUlJPUigiTW9yZSB0aGFuIDEgZnJhbWUgZGV0ZWN0ZWQgaW4gbm9uLWFuaW1hdGlvbiBmaWxlLiIpOworICAgICAgcmV0dXJuIFdFQlBfSU5GT19QQVJTRV9FUlJPUjsKKyAgICB9CisgICAgaWYgKGFuaW1hdGlvbiAmJiAoIXdlYnBfaW5mby0+Y2h1bmtfY291bnRzX1tDSFVOS19BTklNXSB8fAorICAgICAgICAhd2VicF9pbmZvLT5jaHVua19jb3VudHNfW0NIVU5LX0FOTUZdKSkgeworICAgICAgTE9HX0VSUk9SKCJObyBBTklNL0FOTUYgY2h1bmsgZGV0ZWN0ZWQgaW4gYW5pbWF0aW9uIGZpbGUuIik7CisgICAgICByZXR1cm4gV0VCUF9JTkZPX1BBUlNFX0VSUk9SOworICAgIH0KKyAgfQorICByZXR1cm4gV0VCUF9JTkZPX09LOworfQorCitzdGF0aWMgdm9pZCBTaG93U3VtbWFyeShjb25zdCBXZWJQSW5mbyogY29uc3Qgd2VicF9pbmZvKSB7CisgIGludCBpOworICBwcmludGYoIlN1bW1hcnk6XG4iKTsKKyAgcHJpbnRmKCJOdW1iZXIgb2YgZnJhbWVzOiAlZFxuIiwgd2VicF9pbmZvLT5udW1fZnJhbWVzXyk7CisgIHByaW50ZigiQ2h1bmsgdHlwZSAgOiAgVlA4IFZQOEwgVlA4WCBBTFBIIEFOSU0gQU5NRihWUDggL1ZQOEwvQUxQSCkgSUNDUCAiCisgICAgICAiRVhJRiAgWE1QXG4iKTsKKyAgcHJpbnRmKCJDaHVuayBjb3VudHM6ICIpOworICBmb3IgKGkgPSAwOyBpIDwgQ0hVTktfVFlQRVM7ICsraSkgeworICAgIHByaW50ZigiJTRkICIsIHdlYnBfaW5mby0+Y2h1bmtfY291bnRzX1tpXSk7CisgICAgaWYgKGkgPT0gQ0hVTktfQU5NRikgeworICAgICAgcHJpbnRmKCIlNGQgJTRkICU0ZCAgIiwKKyAgICAgICAgICAgICB3ZWJwX2luZm8tPmFubWZfc3ViY2h1bmtfY291bnRzX1swXSwKKyAgICAgICAgICAgICB3ZWJwX2luZm8tPmFubWZfc3ViY2h1bmtfY291bnRzX1sxXSwKKyAgICAgICAgICAgICB3ZWJwX2luZm8tPmFubWZfc3ViY2h1bmtfY291bnRzX1syXSk7CisgICAgfQorICB9CisgIHByaW50ZigiXG4iKTsKK30KKworc3RhdGljIFdlYlBJbmZvU3RhdHVzIEFuYWx5emVXZWJQKFdlYlBJbmZvKiBjb25zdCB3ZWJwX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUERhdGEqIHdlYnBfZGF0YSkgeworICBDaHVua0RhdGEgY2h1bmtfZGF0YTsKKyAgTWVtQnVmZmVyIG1lbV9idWZmZXI7CisgIFdlYlBJbmZvU3RhdHVzIHdlYnBfaW5mb19zdGF0dXMgPSBXRUJQX0lORk9fT0s7CisKKyAgSW5pdE1lbUJ1ZmZlcigmbWVtX2J1ZmZlciwgd2VicF9kYXRhKTsKKyAgd2VicF9pbmZvX3N0YXR1cyA9IFBhcnNlUklGRkhlYWRlcih3ZWJwX2luZm8sICZtZW1fYnVmZmVyKTsKKyAgaWYgKHdlYnBfaW5mb19zdGF0dXMgIT0gV0VCUF9JTkZPX09LKSBnb3RvIEVycm9yOworCisgIC8vICBMb29wIHRocm91Z2ggYWxsIHRoZSBjaHVua3MuIFRlcm1pbmF0ZSBpbW1lZGlhdGVseSBpbiBjYXNlIG9mIGVycm9yLgorICB3aGlsZSAod2VicF9pbmZvX3N0YXR1cyA9PSBXRUJQX0lORk9fT0sgJiYgTWVtRGF0YVNpemUoJm1lbV9idWZmZXIpID4gMCkgeworICAgIHdlYnBfaW5mb19zdGF0dXMgPSBQYXJzZUNodW5rKHdlYnBfaW5mbywgJm1lbV9idWZmZXIsICZjaHVua19kYXRhKTsKKyAgICBpZiAod2VicF9pbmZvX3N0YXR1cyAhPSBXRUJQX0lORk9fT0spIGdvdG8gRXJyb3I7CisgICAgd2VicF9pbmZvX3N0YXR1cyA9IFByb2Nlc3NDaHVuaygmY2h1bmtfZGF0YSwgd2VicF9pbmZvKTsKKyAgfQorICBpZiAod2VicF9pbmZvX3N0YXR1cyAhPSBXRUJQX0lORk9fT0spIGdvdG8gRXJyb3I7CisgIGlmICh3ZWJwX2luZm8tPnNob3dfc3VtbWFyeV8pIFNob3dTdW1tYXJ5KHdlYnBfaW5mbyk7CisKKyAgLy8gIEZpbmFsIGNoZWNrLgorICB3ZWJwX2luZm9fc3RhdHVzID0gVmFsaWRhdGUod2VicF9pbmZvKTsKKworIEVycm9yOgorICBpZiAoIXdlYnBfaW5mby0+cXVpZXRfKSB7CisgICAgaWYgKHdlYnBfaW5mb19zdGF0dXMgPT0gV0VCUF9JTkZPX09LKSB7CisgICAgICBwcmludGYoIk5vIGVycm9yIGRldGVjdGVkLlxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZigiRXJyb3JzIGRldGVjdGVkLlxuIik7CisgICAgfQorICB9CisgIHJldHVybiB3ZWJwX2luZm9fc3RhdHVzOworfQorCitzdGF0aWMgdm9pZCBIZWxwU2hvcnQodm9pZCkgeworICBwcmludGYoIlVzYWdlOiB3ZWJwaW5mbyBbb3B0aW9uc10gaW5fZmlsZXNcbiIKKyAgICAgICAgICJUcnkgLWxvbmdoZWxwIGZvciBhbiBleGhhdXN0aXZlIGxpc3Qgb2Ygb3B0aW9ucy5cbiIpOworfQorCitzdGF0aWMgdm9pZCBIZWxwTG9uZyh2b2lkKSB7CisgIHByaW50ZigiVXNhZ2U6IHdlYnBpbmZvIFtvcHRpb25zXSBpbl9maWxlc1xuIgorICAgICAgICAgIk5vdGU6IHRoZXJlIGNvdWxkIGJlIG11bHRpcGxlIGlucHV0IGZpbGVzO1xuIgorICAgICAgICAgIiAgICAgIG9wdGlvbnMgbXVzdCBjb21lIGJlZm9yZSBpbnB1dCBmaWxlcy5cbiIKKyAgICAgICAgICJPcHRpb25zOlxuIgorICAgICAgICAgIiAgLXZlcnNpb24gLi4uLi4uLi4uLi4gUHJpbnQgdmVyc2lvbiBudW1iZXIgYW5kIGV4aXQuXG4iCisgICAgICAgICAiICAtcXVpZXQgLi4uLi4uLi4uLi4uLiBEbyBub3Qgc2hvdyBjaHVuayBwYXJzaW5nIGluZm9ybWF0aW9uLlxuIgorICAgICAgICAgIiAgLWRpYWcgLi4uLi4uLi4uLi4uLi4gU2hvdyBwYXJzaW5nIGVycm9yIGRpYWdub3Npcy5cbiIKKyAgICAgICAgICIgIC1zdW1tYXJ5IC4uLi4uLi4uLi4uIFNob3cgY2h1bmsgc3RhdHMgc3VtbWFyeS5cbiIKKyAgICAgICAgICIgIC1iaXRzdHJlYW1faW5mbyAuLi4uIFBhcnNlIGJpdHN0cmVhbSBoZWFkZXIuXG4iKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIqIGFyZ3ZbXSkgeworICBpbnQgYywgcXVpZXQgPSAwLCBzaG93X2RpYWcgPSAwLCBzaG93X3N1bW1hcnkgPSAwOworICBpbnQgcGFyc2VfYml0c3RyZWFtID0gMDsKKyAgV2ViUEluZm9TdGF0dXMgd2VicF9pbmZvX3N0YXR1cyA9IFdFQlBfSU5GT19PSzsKKyAgV2ViUEluZm8gd2VicF9pbmZvOworCisgIGlmIChhcmdjID09IDEpIHsKKyAgICBIZWxwU2hvcnQoKTsKKyAgICByZXR1cm4gV0VCUF9JTkZPX09LOworICB9CisKKyAgLy8gUGFyc2UgY29tbWFuZC1saW5lIGlucHV0LgorICBmb3IgKGMgPSAxOyBjIDwgYXJnYzsgKytjKSB7CisgICAgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1oIikgfHwgIXN0cmNtcChhcmd2W2NdLCAiLWhlbHAiKSkgeworICAgICAgSGVscFNob3J0KCk7CisgICAgICByZXR1cm4gV0VCUF9JTkZPX09LOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLUgiKSB8fCAhc3RyY21wKGFyZ3ZbY10sICItbG9uZ2hlbHAiKSkgeworICAgICAgSGVscExvbmcoKTsKKyAgICAgIHJldHVybiBXRUJQX0lORk9fT0s7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItcXVpZXQiKSkgeworICAgICAgcXVpZXQgPSAxOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWRpYWciKSkgeworICAgICAgc2hvd19kaWFnID0gMTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1zdW1tYXJ5IikpIHsKKyAgICAgIHNob3dfc3VtbWFyeSA9IDE7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItYml0c3RyZWFtX2luZm8iKSkgeworICAgICAgcGFyc2VfYml0c3RyZWFtID0gMTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi12ZXJzaW9uIikpIHsKKyAgICAgIGNvbnN0IGludCB2ZXJzaW9uID0gV2ViUEdldERlY29kZXJWZXJzaW9uKCk7CisgICAgICBwcmludGYoIldlYlAgRGVjb2RlciB2ZXJzaW9uOiAlZC4lZC4lZFxuIiwKKyAgICAgICAgICAgICAodmVyc2lvbiA+PiAxNikgJiAweGZmLCAodmVyc2lvbiA+PiA4KSAmIDB4ZmYsIHZlcnNpb24gJiAweGZmKTsKKyAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7ICAvLyBBc3N1bWUgdGhlIHJlbWFpbmluZyBhcmUgYWxsIGlucHV0IGZpbGVzLgorICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKGMgPT0gYXJnYykgeworICAgIEhlbHBTaG9ydCgpOworICAgIHJldHVybiBXRUJQX0lORk9fSU5WQUxJRF9DT01NQU5EOworICB9CisKKyAgLy8gUHJvY2VzcyBpbnB1dCBmaWxlcyBvbmUgYnkgb25lLgorICBmb3IgKDsgYyA8IGFyZ2M7ICsrYykgeworICAgIFdlYlBEYXRhIHdlYnBfZGF0YTsKKyAgICBjb25zdCBjaGFyKiBpbl9maWxlID0gTlVMTDsKKyAgICBXZWJQSW5mb0luaXQoJndlYnBfaW5mbyk7CisgICAgd2VicF9pbmZvLnF1aWV0XyA9IHF1aWV0OworICAgIHdlYnBfaW5mby5zaG93X2RpYWdub3Npc18gPSBzaG93X2RpYWc7CisgICAgd2VicF9pbmZvLnNob3dfc3VtbWFyeV8gPSBzaG93X3N1bW1hcnk7CisgICAgd2VicF9pbmZvLnBhcnNlX2JpdHN0cmVhbV8gPSBwYXJzZV9iaXRzdHJlYW07CisgICAgaW5fZmlsZSA9IGFyZ3ZbY107CisgICAgaWYgKGluX2ZpbGUgPT0gTlVMTCB8fCAhUmVhZEZpbGVUb1dlYlBEYXRhKGluX2ZpbGUsICZ3ZWJwX2RhdGEpKSB7CisgICAgICB3ZWJwX2luZm9fc3RhdHVzID0gV0VCUF9JTkZPX0lOVkFMSURfQ09NTUFORDsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIG9wZW4gaW5wdXQgZmlsZSAlcy5cbiIsIGluX2ZpbGUpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmICghd2VicF9pbmZvLnF1aWV0XykgcHJpbnRmKCJGaWxlOiAlc1xuIiwgaW5fZmlsZSk7CisgICAgd2VicF9pbmZvX3N0YXR1cyA9IEFuYWx5emVXZWJQKCZ3ZWJwX2luZm8sICZ3ZWJwX2RhdGEpOworICAgIFdlYlBEYXRhQ2xlYXIoJndlYnBfZGF0YSk7CisgIH0KKyAgcmV0dXJuIHdlYnBfaW5mb19zdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy93ZWJwbXV4LmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy93ZWJwbXV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVlOGQyMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL3dlYnBtdXguYwpAQCAtMCwwICsxLDExNDggQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgU2ltcGxlIGNvbW1hbmQtbGluZSB0byBjcmVhdGUgYSBXZWJQIGNvbnRhaW5lciBmaWxlIGFuZCB0byBleHRyYWN0IG9yIHN0cmlwCisvLyAgcmVsZXZhbnQgZGF0YSBmcm9tIHRoZSBjb250YWluZXIgZmlsZS4KKy8vCisvLyBBdXRob3JzOiBWaWthcyAodmlrYWFzLmFyb3JhQGdtYWlsLmNvbSksCisvLyAgICAgICAgICBVcnZhbmcgKHVydmFuZ0Bnb29nbGUuY29tKQorCisvKiAgVXNhZ2UgZXhhbXBsZXM6CisKKyAgQ3JlYXRlIGNvbnRhaW5lciBXZWJQIGZpbGU6CisgICAgd2VicG11eCAtZnJhbWUgYW5pbV8xLndlYnAgKzEwMCsxMCsxMCAgIFwKKyAgICAgICAgICAgIC1mcmFtZSBhbmltXzIud2VicCArMTAwKzI1KzI1KzEgXAorICAgICAgICAgICAgLWZyYW1lIGFuaW1fMy53ZWJwICsxMDArNTArNTArMSBcCisgICAgICAgICAgICAtZnJhbWUgYW5pbV80LndlYnAgKzEwMCAgICAgICAgIFwKKyAgICAgICAgICAgIC1sb29wIDEwIC1iZ2NvbG9yIDEyOCwyNTUsMjU1LDI1NSBcCisgICAgICAgICAgICAtbyBvdXRfYW5pbWF0aW9uX2NvbnRhaW5lci53ZWJwCisKKyAgICB3ZWJwbXV4IC1zZXQgaWNjIGltYWdlX3Byb2ZpbGUuaWNjIGluLndlYnAgLW8gb3V0X2ljY19jb250YWluZXIud2VicAorICAgIHdlYnBtdXggLXNldCBleGlmIGltYWdlX21ldGFkYXRhLmV4aWYgaW4ud2VicCAtbyBvdXRfZXhpZl9jb250YWluZXIud2VicAorICAgIHdlYnBtdXggLXNldCB4bXAgaW1hZ2VfbWV0YWRhdGEueG1wIGluLndlYnAgLW8gb3V0X3htcF9jb250YWluZXIud2VicAorCisgIEV4dHJhY3QgcmVsZXZhbnQgZGF0YSBmcm9tIFdlYlAgY29udGFpbmVyIGZpbGU6CisgICAgd2VicG11eCAtZ2V0IGZyYW1lIG4gaW4ud2VicCAtbyBvdXRfZnJhbWUud2VicAorICAgIHdlYnBtdXggLWdldCBpY2MgaW4ud2VicCAtbyBpbWFnZV9wcm9maWxlLmljYworICAgIHdlYnBtdXggLWdldCBleGlmIGluLndlYnAgLW8gaW1hZ2VfbWV0YWRhdGEuZXhpZgorICAgIHdlYnBtdXggLWdldCB4bXAgaW4ud2VicCAtbyBpbWFnZV9tZXRhZGF0YS54bXAKKworICBTdHJpcCBkYXRhIGZyb20gV2ViUCBDb250YWluZXIgZmlsZToKKyAgICB3ZWJwbXV4IC1zdHJpcCBpY2MgaW4ud2VicCAtbyBvdXQud2VicAorICAgIHdlYnBtdXggLXN0cmlwIGV4aWYgaW4ud2VicCAtbyBvdXQud2VicAorICAgIHdlYnBtdXggLXN0cmlwIHhtcCBpbi53ZWJwIC1vIG91dC53ZWJwCisKKyAgQ2hhbmdlIGR1cmF0aW9uIG9mIGZyYW1lIGludGVydmFsczoKKyAgICB3ZWJwbXV4IC1kdXJhdGlvbiAxNTAgaW4ud2VicCAtbyBvdXQud2VicAorICAgIHdlYnBtdXggLWR1cmF0aW9uIDMzLDIgaW4ud2VicCAtbyBvdXQud2VicAorICAgIHdlYnBtdXggLWR1cmF0aW9uIDIwMCwxMCwwIC1kdXJhdGlvbiAxNTAsNiw1MCBpbi53ZWJwIC1vIG91dC53ZWJwCisKKyAgTWlzYzoKKyAgICB3ZWJwbXV4IC1pbmZvIGluLndlYnAKKyAgICB3ZWJwbXV4IFsgLWggfCAtaGVscCBdCisgICAgd2VicG11eCAtdmVyc2lvbgorICAgIHdlYnBtdXggYXJndW1lbnRfZmlsZV9uYW1lCisqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgIndlYnAvY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAid2VicC9kZWNvZGUuaCIKKyNpbmNsdWRlICJ3ZWJwL211eC5oIgorI2luY2x1ZGUgIi4uL2V4YW1wbGVzL2V4YW1wbGVfdXRpbC5oIgorI2luY2x1ZGUgIi4uL2ltYWdlaW8vaW1hZ2Vpb191dGlsLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb25maWcgb2JqZWN0IHRvIHBhcnNlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMuCisKK3R5cGVkZWYgZW51bSB7CisgIE5JTF9BQ1RJT04gPSAwLAorICBBQ1RJT05fR0VULAorICBBQ1RJT05fU0VULAorICBBQ1RJT05fU1RSSVAsCisgIEFDVElPTl9JTkZPLAorICBBQ1RJT05fSEVMUCwKKyAgQUNUSU9OX0RVUkFUSU9OCit9IEFjdGlvblR5cGU7CisKK3R5cGVkZWYgZW51bSB7CisgIE5JTF9TVUJUWVBFID0gMCwKKyAgU1VCVFlQRV9BTk1GLAorICBTVUJUWVBFX0xPT1AsCisgIFNVQlRZUEVfQkdDT0xPUgorfSBGZWF0dXJlU3ViVHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBGZWF0dXJlU3ViVHlwZSBzdWJ0eXBlXzsKKyAgY29uc3QgY2hhciogZmlsZW5hbWVfOworICBjb25zdCBjaGFyKiBwYXJhbXNfOworfSBGZWF0dXJlQXJnOworCit0eXBlZGVmIGVudW0geworICBOSUxfRkVBVFVSRSA9IDAsCisgIEZFQVRVUkVfRVhJRiwKKyAgRkVBVFVSRV9YTVAsCisgIEZFQVRVUkVfSUNDUCwKKyAgRkVBVFVSRV9BTk1GLAorICBGRUFUVVJFX0RVUkFUSU9OLAorICBMQVNUX0ZFQVRVUkUKK30gRmVhdHVyZVR5cGU7CisKK3N0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBrRm91cmNjTGlzdFtMQVNUX0ZFQVRVUkVdID0geworICBOVUxMLCAiRVhJRiIsICJYTVAgIiwgIklDQ1AiLCAiQU5NRiIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBrRGVzY3JpcHRpb25zW0xBU1RfRkVBVFVSRV0gPSB7CisgIE5VTEwsICJFWElGIG1ldGFkYXRhIiwgIlhNUCBtZXRhZGF0YSIsICJJQ0MgcHJvZmlsZSIsCisgICJBbmltYXRpb24gZnJhbWUiCit9OworCit0eXBlZGVmIHN0cnVjdCB7CisgIENvbW1hbmRMaW5lQXJndW1lbnRzIGNtZF9hcmdzXzsKKworICBBY3Rpb25UeXBlIGFjdGlvbl90eXBlXzsKKyAgY29uc3QgY2hhciogaW5wdXRfOworICBjb25zdCBjaGFyKiBvdXRwdXRfOworICBGZWF0dXJlVHlwZSB0eXBlXzsKKyAgRmVhdHVyZUFyZyogYXJnc187CisgIGludCBhcmdfY291bnRfOworfSBDb25maWc7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIZWxwZXIgZnVuY3Rpb25zLgorCitzdGF0aWMgaW50IENvdW50T2NjdXJyZW5jZXMoY29uc3QgQ29tbWFuZExpbmVBcmd1bWVudHMqIGNvbnN0IGFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY29uc3QgYXJnKSB7CisgIGludCBpOworICBpbnQgbnVtX29jY3VyZW5jZXMgPSAwOworCisgIGZvciAoaSA9IDA7IGkgPCBhcmdzLT5hcmdjXzsgKytpKSB7CisgICAgaWYgKCFzdHJjbXAoYXJncy0+YXJndl9baV0sIGFyZykpIHsKKyAgICAgICsrbnVtX29jY3VyZW5jZXM7CisgICAgfQorICB9CisgIHJldHVybiBudW1fb2NjdXJlbmNlczsKK30KKworc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtFcnJvck1lc3NhZ2VzWy1XRUJQX01VWF9OT1RfRU5PVUdIX0RBVEEgKyAxXSA9IHsKKyAgIldFQlBfTVVYX05PVF9GT1VORCIsICJXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UIiwgIldFQlBfTVVYX0JBRF9EQVRBIiwKKyAgIldFQlBfTVVYX01FTU9SWV9FUlJPUiIsICJXRUJQX01VWF9OT1RfRU5PVUdIX0RBVEEiCit9OworCitzdGF0aWMgY29uc3QgY2hhciogRXJyb3JTdHJpbmcoV2ViUE11eEVycm9yIGVycikgeworICBhc3NlcnQoZXJyIDw9IFdFQlBfTVVYX05PVF9GT1VORCAmJiBlcnIgPj0gV0VCUF9NVVhfTk9UX0VOT1VHSF9EQVRBKTsKKyAgcmV0dXJuIGtFcnJvck1lc3NhZ2VzWy1lcnJdOworfQorCisjZGVmaW5lIFJFVFVSTl9JRl9FUlJPUihFUlJfTVNHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZnByaW50ZihzdGRlcnIsIEVSUl9NU0cpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIGVycjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2RlZmluZSBSRVRVUk5fSUZfRVJST1IzKEVSUl9NU0csIEZPUk1BVF9TVFIxLCBGT1JNQVRfU1RSMikgICAgICAgICAgXAorICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZwcmludGYoc3RkZXJyLCBFUlJfTVNHLCBGT1JNQVRfU1RSMSwgRk9STUFUX1NUUjIpOyAgICAgICAgICAgICAgXAorICAgIHJldHVybiBlcnI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgRVJST1JfR09UTzEoRVJSX01TRywgTEFCRUwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmcHJpbnRmKHN0ZGVyciwgRVJSX01TRyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBvayA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnb3RvIExBQkVMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBFUlJPUl9HT1RPMihFUlJfTVNHLCBGT1JNQVRfU1RSLCBMQUJFTCkgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZwcmludGYoc3RkZXJyLCBFUlJfTVNHLCBGT1JNQVRfU1RSKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG9rID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGdvdG8gTEFCRUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIEVSUk9SX0dPVE8zKEVSUl9NU0csIEZPUk1BVF9TVFIxLCBGT1JNQVRfU1RSMiwgTEFCRUwpICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZnByaW50ZihzdGRlcnIsIEVSUl9NU0csIEZPUk1BVF9TVFIxLCBGT1JNQVRfU1RSMik7ICAgICAgICAgICAgICBcCisgICAgb2sgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZ290byBMQUJFTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKK3N0YXRpYyBXZWJQTXV4RXJyb3IgRGlzcGxheUluZm8oY29uc3QgV2ViUE11eCogbXV4KSB7CisgIGludCB3aWR0aCwgaGVpZ2h0OworICB1aW50MzJfdCBmbGFnOworCisgIFdlYlBNdXhFcnJvciBlcnIgPSBXZWJQTXV4R2V0Q2FudmFzU2l6ZShtdXgsICZ3aWR0aCwgJmhlaWdodCk7CisgIGFzc2VydChlcnIgPT0gV0VCUF9NVVhfT0spOyAgLy8gQXMgV2ViUE11eENyZWF0ZSgpIHdhcyBzdWNjZXNzZnVsIGVhcmxpZXIuCisgIHByaW50ZigiQ2FudmFzIHNpemU6ICVkIHggJWRcbiIsIHdpZHRoLCBoZWlnaHQpOworCisgIGVyciA9IFdlYlBNdXhHZXRGZWF0dXJlcyhtdXgsICZmbGFnKTsKKyAgUkVUVVJOX0lGX0VSUk9SKCJGYWlsZWQgdG8gcmV0cmlldmUgZmVhdHVyZXNcbiIpOworCisgIGlmIChmbGFnID09IDApIHsKKyAgICBwcmludGYoIk5vIGZlYXR1cmVzIHByZXNlbnQuXG4iKTsKKyAgICByZXR1cm4gZXJyOworICB9CisKKyAgLy8gUHJpbnQgdGhlIGZlYXR1cmVzIHByZXNlbnQuCisgIHByaW50ZigiRmVhdHVyZXMgcHJlc2VudDoiKTsKKyAgaWYgKGZsYWcgJiBBTklNQVRJT05fRkxBRykgcHJpbnRmKCIgYW5pbWF0aW9uIik7CisgIGlmIChmbGFnICYgSUNDUF9GTEFHKSAgICAgIHByaW50ZigiIElDQyBwcm9maWxlIik7CisgIGlmIChmbGFnICYgRVhJRl9GTEFHKSAgICAgIHByaW50ZigiIEVYSUYgbWV0YWRhdGEiKTsKKyAgaWYgKGZsYWcgJiBYTVBfRkxBRykgICAgICAgcHJpbnRmKCIgWE1QIG1ldGFkYXRhIik7CisgIGlmIChmbGFnICYgQUxQSEFfRkxBRykgICAgIHByaW50ZigiIHRyYW5zcGFyZW5jeSIpOworICBwcmludGYoIlxuIik7CisKKyAgaWYgKGZsYWcgJiBBTklNQVRJT05fRkxBRykgeworICAgIGNvbnN0IFdlYlBDaHVua0lkIGlkID0gV0VCUF9DSFVOS19BTk1GOworICAgIGNvbnN0IGNoYXIqIGNvbnN0IHR5cGVfc3RyID0gImZyYW1lIjsKKyAgICBpbnQgbkZyYW1lczsKKworICAgIFdlYlBNdXhBbmltUGFyYW1zIHBhcmFtczsKKyAgICBlcnIgPSBXZWJQTXV4R2V0QW5pbWF0aW9uUGFyYW1zKG11eCwgJnBhcmFtcyk7CisgICAgYXNzZXJ0KGVyciA9PSBXRUJQX01VWF9PSyk7CisgICAgcHJpbnRmKCJCYWNrZ3JvdW5kIGNvbG9yIDogMHglLjhYICBMb29wIENvdW50IDogJWRcbiIsCisgICAgICAgICAgIHBhcmFtcy5iZ2NvbG9yLCBwYXJhbXMubG9vcF9jb3VudCk7CisKKyAgICBlcnIgPSBXZWJQTXV4TnVtQ2h1bmtzKG11eCwgaWQsICZuRnJhbWVzKTsKKyAgICBhc3NlcnQoZXJyID09IFdFQlBfTVVYX09LKTsKKworICAgIHByaW50ZigiTnVtYmVyIG9mICVzczogJWRcbiIsIHR5cGVfc3RyLCBuRnJhbWVzKTsKKyAgICBpZiAobkZyYW1lcyA+IDApIHsKKyAgICAgIGludCBpOworICAgICAgcHJpbnRmKCJOby46IHdpZHRoIGhlaWdodCBhbHBoYSB4X29mZnNldCB5X29mZnNldCAiKTsKKyAgICAgIHByaW50ZigiZHVyYXRpb24gICBkaXNwb3NlIGJsZW5kICIpOworICAgICAgcHJpbnRmKCJpbWFnZV9zaXplICBjb21wcmVzc2lvblxuIik7CisgICAgICBmb3IgKGkgPSAxOyBpIDw9IG5GcmFtZXM7IGkrKykgeworICAgICAgICBXZWJQTXV4RnJhbWVJbmZvIGZyYW1lOworICAgICAgICBlcnIgPSBXZWJQTXV4R2V0RnJhbWUobXV4LCBpLCAmZnJhbWUpOworICAgICAgICBpZiAoZXJyID09IFdFQlBfTVVYX09LKSB7CisgICAgICAgICAgV2ViUEJpdHN0cmVhbUZlYXR1cmVzIGZlYXR1cmVzOworICAgICAgICAgIGNvbnN0IFZQOFN0YXR1c0NvZGUgc3RhdHVzID0gV2ViUEdldEZlYXR1cmVzKAorICAgICAgICAgICAgICBmcmFtZS5iaXRzdHJlYW0uYnl0ZXMsIGZyYW1lLmJpdHN0cmVhbS5zaXplLCAmZmVhdHVyZXMpOworICAgICAgICAgIGFzc2VydChzdGF0dXMgPT0gVlA4X1NUQVRVU19PSyk7ICAvLyBDaGVja2VkIGJ5IFdlYlBNdXhDcmVhdGUoKS4KKyAgICAgICAgICAodm9pZClzdGF0dXM7CisgICAgICAgICAgcHJpbnRmKCIlM2Q6ICU1ZCAlNWQgJTVzICU4ZCAlOGQgIiwgaSwgZmVhdHVyZXMud2lkdGgsCisgICAgICAgICAgICAgICAgIGZlYXR1cmVzLmhlaWdodCwgZmVhdHVyZXMuaGFzX2FscGhhID8gInllcyIgOiAibm8iLAorICAgICAgICAgICAgICAgICBmcmFtZS54X29mZnNldCwgZnJhbWUueV9vZmZzZXQpOworICAgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbnN0IGRpc3Bvc2UgPQorICAgICAgICAgICAgICAgIChmcmFtZS5kaXNwb3NlX21ldGhvZCA9PSBXRUJQX01VWF9ESVNQT1NFX05PTkUpID8gIm5vbmUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiYmFja2dyb3VuZCI7CisgICAgICAgICAgICBjb25zdCBjaGFyKiBjb25zdCBibGVuZCA9CisgICAgICAgICAgICAgICAgKGZyYW1lLmJsZW5kX21ldGhvZCA9PSBXRUJQX01VWF9CTEVORCkgPyAieWVzIiA6ICJubyI7CisgICAgICAgICAgICBwcmludGYoIiU4ZCAlMTBzICU1cyAiLCBmcmFtZS5kdXJhdGlvbiwgZGlzcG9zZSwgYmxlbmQpOworICAgICAgICAgIH0KKyAgICAgICAgICBwcmludGYoIiUxMGQgJTExc1xuIiwgKGludClmcmFtZS5iaXRzdHJlYW0uc2l6ZSwKKyAgICAgICAgICAgICAgICAgKGZlYXR1cmVzLmZvcm1hdCA9PSAxKSA/ICJsb3NzeSIgOgorICAgICAgICAgICAgICAgICAoZmVhdHVyZXMuZm9ybWF0ID09IDIpID8gImxvc3NsZXNzIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5kZWZpbmVkIik7CisgICAgICAgIH0KKyAgICAgICAgV2ViUERhdGFDbGVhcigmZnJhbWUuYml0c3RyZWFtKTsKKyAgICAgICAgUkVUVVJOX0lGX0VSUk9SMygiRmFpbGVkIHRvIHJldHJpZXZlICVzIyVkXG4iLCB0eXBlX3N0ciwgaSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKGZsYWcgJiBJQ0NQX0ZMQUcpIHsKKyAgICBXZWJQRGF0YSBpY2NfcHJvZmlsZTsKKyAgICBlcnIgPSBXZWJQTXV4R2V0Q2h1bmsobXV4LCAiSUNDUCIsICZpY2NfcHJvZmlsZSk7CisgICAgYXNzZXJ0KGVyciA9PSBXRUJQX01VWF9PSyk7CisgICAgcHJpbnRmKCJTaXplIG9mIHRoZSBJQ0MgcHJvZmlsZSBkYXRhOiAlZFxuIiwgKGludClpY2NfcHJvZmlsZS5zaXplKTsKKyAgfQorCisgIGlmIChmbGFnICYgRVhJRl9GTEFHKSB7CisgICAgV2ViUERhdGEgZXhpZjsKKyAgICBlcnIgPSBXZWJQTXV4R2V0Q2h1bmsobXV4LCAiRVhJRiIsICZleGlmKTsKKyAgICBhc3NlcnQoZXJyID09IFdFQlBfTVVYX09LKTsKKyAgICBwcmludGYoIlNpemUgb2YgdGhlIEVYSUYgbWV0YWRhdGE6ICVkXG4iLCAoaW50KWV4aWYuc2l6ZSk7CisgIH0KKworICBpZiAoZmxhZyAmIFhNUF9GTEFHKSB7CisgICAgV2ViUERhdGEgeG1wOworICAgIGVyciA9IFdlYlBNdXhHZXRDaHVuayhtdXgsICJYTVAgIiwgJnhtcCk7CisgICAgYXNzZXJ0KGVyciA9PSBXRUJQX01VWF9PSyk7CisgICAgcHJpbnRmKCJTaXplIG9mIHRoZSBYTVAgbWV0YWRhdGE6ICVkXG4iLCAoaW50KXhtcC5zaXplKTsKKyAgfQorCisgIGlmICgoZmxhZyAmIEFMUEhBX0ZMQUcpICYmICEoZmxhZyAmIEFOSU1BVElPTl9GTEFHKSkgeworICAgIFdlYlBNdXhGcmFtZUluZm8gaW1hZ2U7CisgICAgZXJyID0gV2ViUE11eEdldEZyYW1lKG11eCwgMSwgJmltYWdlKTsKKyAgICBpZiAoZXJyID09IFdFQlBfTVVYX09LKSB7CisgICAgICBwcmludGYoIlNpemUgb2YgdGhlIGltYWdlICh3aXRoIGFscGhhKTogJWRcbiIsIChpbnQpaW1hZ2UuYml0c3RyZWFtLnNpemUpOworICAgIH0KKyAgICBXZWJQRGF0YUNsZWFyKCZpbWFnZS5iaXRzdHJlYW0pOworICAgIFJFVFVSTl9JRl9FUlJPUigiRmFpbGVkIHRvIHJldHJpZXZlIHRoZSBpbWFnZVxuIik7CisgIH0KKworICByZXR1cm4gV0VCUF9NVVhfT0s7Cit9CisKK3N0YXRpYyB2b2lkIFByaW50SGVscCh2b2lkKSB7CisgIHByaW50ZigiVXNhZ2U6IHdlYnBtdXggLWdldCBHRVRfT1BUSU9OUyBJTlBVVCAtbyBPVVRQVVRcbiIpOworICBwcmludGYoIiAgICAgICB3ZWJwbXV4IC1zZXQgU0VUX09QVElPTlMgSU5QVVQgLW8gT1VUUFVUXG4iKTsKKyAgcHJpbnRmKCIgICAgICAgd2VicG11eCAtZHVyYXRpb24gRFVSQVRJT05fT1BUSU9OUyBbLWR1cmF0aW9uIC4uLl1cbiIpOworICBwcmludGYoIiAgICAgICAgICAgICAgIElOUFVUIC1vIE9VVFBVVFxuIik7CisgIHByaW50ZigiICAgICAgIHdlYnBtdXggLXN0cmlwIFNUUklQX09QVElPTlMgSU5QVVQgLW8gT1VUUFVUXG4iKTsKKyAgcHJpbnRmKCIgICAgICAgd2VicG11eCAtZnJhbWUgRlJBTUVfT1BUSU9OUyBbLWZyYW1lLi4uXSBbLWxvb3AgTE9PUF9DT1VOVF0iCisgICAgICAgICAiXG4iKTsKKyAgcHJpbnRmKCIgICAgICAgICAgICAgICBbLWJnY29sb3IgQkFDS0dST1VORF9DT0xPUl0gLW8gT1VUUFVUXG4iKTsKKyAgcHJpbnRmKCIgICAgICAgd2VicG11eCAtaW5mbyBJTlBVVFxuIik7CisgIHByaW50ZigiICAgICAgIHdlYnBtdXggWy1ofC1oZWxwXVxuIik7CisgIHByaW50ZigiICAgICAgIHdlYnBtdXggLXZlcnNpb25cbiIpOworICBwcmludGYoIiAgICAgICB3ZWJwbXV4IGFyZ3VtZW50X2ZpbGVfbmFtZVxuIik7CisKKyAgcHJpbnRmKCJcbiIpOworICBwcmludGYoIkdFVF9PUFRJT05TOlxuIik7CisgIHByaW50ZigiIEV4dHJhY3QgcmVsZXZhbnQgZGF0YTpcbiIpOworICBwcmludGYoIiAgIGljYyAgICAgICBnZXQgSUNDIHByb2ZpbGVcbiIpOworICBwcmludGYoIiAgIGV4aWYgICAgICBnZXQgRVhJRiBtZXRhZGF0YVxuIik7CisgIHByaW50ZigiICAgeG1wICAgICAgIGdldCBYTVAgbWV0YWRhdGFcbiIpOworICBwcmludGYoIiAgIGZyYW1lIG4gICBnZXQgbnRoIGZyYW1lXG4iKTsKKworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiU0VUX09QVElPTlM6XG4iKTsKKyAgcHJpbnRmKCIgU2V0IGNvbG9yIHByb2ZpbGUvbWV0YWRhdGE6XG4iKTsKKyAgcHJpbnRmKCIgICBpY2MgIGZpbGUuaWNjICAgICBzZXQgSUNDIHByb2ZpbGVcbiIpOworICBwcmludGYoIiAgIGV4aWYgZmlsZS5leGlmICAgIHNldCBFWElGIG1ldGFkYXRhXG4iKTsKKyAgcHJpbnRmKCIgICB4bXAgIGZpbGUueG1wICAgICBzZXQgWE1QIG1ldGFkYXRhXG4iKTsKKyAgcHJpbnRmKCIgICB3aGVyZTogICAgJ2ZpbGUuaWNjJyBjb250YWlucyB0aGUgSUNDIHByb2ZpbGUgdG8gYmUgc2V0LFxuIik7CisgIHByaW50ZigiICAgICAgICAgICAgICdmaWxlLmV4aWYnIGNvbnRhaW5zIHRoZSBFWElGIG1ldGFkYXRhIHRvIGJlIHNldFxuIik7CisgIHByaW50ZigiICAgICAgICAgICAgICdmaWxlLnhtcCcgY29udGFpbnMgdGhlIFhNUCBtZXRhZGF0YSB0byBiZSBzZXRcbiIpOworCisgIHByaW50ZigiXG4iKTsKKyAgcHJpbnRmKCJEVVJBVElPTl9PUFRJT05TOlxuIik7CisgIHByaW50ZigiIFNldCBkdXJhdGlvbiBvZiBzZWxlY3RlZCBmcmFtZXM6XG4iKTsKKyAgcHJpbnRmKCIgICBkdXJhdGlvbiAgICAgICAgICAgIHNldCBkdXJhdGlvbiBmb3IgZWFjaCBmcmFtZXNcbiIpOworICBwcmludGYoIiAgIGR1cmF0aW9uLGZyYW1lICAgICAgc2V0IGR1cmF0aW9uIG9mIGEgcGFydGljdWxhciBmcmFtZVxuIik7CisgIHByaW50ZigiICAgZHVyYXRpb24sc3RhcnQsZW5kICBzZXQgZHVyYXRpb24gb2YgZnJhbWVzIGluIHRoZVxuIik7CisgIHByaW50ZigiICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWwgW3N0YXJ0LGVuZF0pXG4iKTsKKyAgcHJpbnRmKCIgICB3aGVyZTogJ2R1cmF0aW9uJyBpcyB0aGUgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzXG4iKTsKKyAgcHJpbnRmKCIgICAgICAgICAgJ3N0YXJ0JyBpcyB0aGUgc3RhcnQgZnJhbWUgaW5kZXhcbiIpOworICBwcmludGYoIiAgICAgICAgICAnZW5kJyBpcyB0aGUgaW5jbHVzaXZlIGVuZCBmcmFtZSBpbmRleFxuIik7CisgIHByaW50ZigiICAgICAgICAgICBUaGUgc3BlY2lhbCAnZW5kJyB2YWx1ZSAnMCcgbWVhbnM6IGxhc3QgZnJhbWUuXG4iKTsKKworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiU1RSSVBfT1BUSU9OUzpcbiIpOworICBwcmludGYoIiBTdHJpcCBjb2xvciBwcm9maWxlL21ldGFkYXRhOlxuIik7CisgIHByaW50ZigiICAgaWNjICAgICAgIHN0cmlwIElDQyBwcm9maWxlXG4iKTsKKyAgcHJpbnRmKCIgICBleGlmICAgICAgc3RyaXAgRVhJRiBtZXRhZGF0YVxuIik7CisgIHByaW50ZigiICAgeG1wICAgICAgIHN0cmlwIFhNUCBtZXRhZGF0YVxuIik7CisKKyAgcHJpbnRmKCJcbiIpOworICBwcmludGYoIkZSQU1FX09QVElPTlMoaSk6XG4iKTsKKyAgcHJpbnRmKCIgQ3JlYXRlIGFuaW1hdGlvbjpcbiIpOworICBwcmludGYoIiAgIGZpbGVfaSArZGkrW3hpK3lpWyttaVtiaV1dXVxuIik7CisgIHByaW50ZigiICAgd2hlcmU6ICAgICdmaWxlX2knIGlzIHRoZSBpJ3RoIGFuaW1hdGlvbiBmcmFtZSAoV2ViUCBmb3JtYXQpLFxuIik7CisgIHByaW50ZigiICAgICAgICAgICAgICdkaScgaXMgdGhlIHBhdXNlIGR1cmF0aW9uIGJlZm9yZSBuZXh0IGZyYW1lLFxuIik7CisgIHByaW50ZigiICAgICAgICAgICAgICd4aScsJ3lpJyBzcGVjaWZ5IHRoZSBpbWFnZSBvZmZzZXQgZm9yIHRoaXMgZnJhbWUsXG4iKTsKKyAgcHJpbnRmKCIgICAgICAgICAgICAgJ21pJyBpcyB0aGUgZGlzcG9zZSBtZXRob2QgZm9yIHRoaXMgZnJhbWUgKDAgb3IgMSksXG4iKTsKKyAgcHJpbnRmKCIgICAgICAgICAgICAgJ2JpJyBpcyB0aGUgYmxlbmRpbmcgbWV0aG9kIGZvciB0aGlzIGZyYW1lICgrYiBvciAtYikiCisgICAgICAgICAiXG4iKTsKKworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiTE9PUF9DT1VOVDpcbiIpOworICBwcmludGYoIiBOdW1iZXIgb2YgdGltZXMgdG8gcmVwZWF0IHRoZSBhbmltYXRpb24uXG4iKTsKKyAgcHJpbnRmKCIgVmFsaWQgcmFuZ2UgaXMgMCB0byA2NTUzNSBbRGVmYXVsdDogMCAoaW5maW5pdGUpXS5cbiIpOworCisgIHByaW50ZigiXG4iKTsKKyAgcHJpbnRmKCJCQUNLR1JPVU5EX0NPTE9SOlxuIik7CisgIHByaW50ZigiIEJhY2tncm91bmQgY29sb3Igb2YgdGhlIGNhbnZhcy5cbiIpOworICBwcmludGYoIiAgQSxSLEcsQlxuIik7CisgIHByaW50ZigiICB3aGVyZTogICAgJ0EnLCAnUicsICdHJyBhbmQgJ0InIGFyZSBpbnRlZ2VycyBpbiB0aGUgcmFuZ2UgMCB0byAyNTUgIgorICAgICAgICAgInNwZWNpZnlpbmdcbiIpOworICBwcmludGYoIiAgICAgICAgICAgIHRoZSBBbHBoYSwgUmVkLCBHcmVlbiBhbmQgQmx1ZSBjb21wb25lbnQgdmFsdWVzICIKKyAgICAgICAgICJyZXNwZWN0aXZlbHlcbiIpOworICBwcmludGYoIiAgICAgICAgICAgIFtEZWZhdWx0OiAyNTUsMjU1LDI1NSwyNTVdXG4iKTsKKworICBwcmludGYoIlxuSU5QVVQgJiBPVVRQVVQgYXJlIGluIFdlYlAgZm9ybWF0LlxuIik7CisKKyAgcHJpbnRmKCJcbk5vdGU6IFRoZSBuYXR1cmUgb2YgRVhJRiwgWE1QIGFuZCBJQ0MgZGF0YSBpcyBub3QgY2hlY2tlZCIpOworICBwcmludGYoIiBhbmQgaXMgYXNzdW1lZCB0byBiZVxudmFsaWQuXG4iKTsKKyAgcHJpbnRmKCJcbk5vdGU6IGlmIGEgc2luZ2xlIGZpbGUgbmFtZSBpcyBwYXNzZWQgYXMgdGhlIGFyZ3VtZW50LCB0aGUgIgorICAgICAgICAgImFyZ3VtZW50cyB3aWxsIGJlXG4iKTsKKyAgcHJpbnRmKCJ0b2tlbml6ZWQgZnJvbSB0aGlzIGZpbGUuIFRoZSBmaWxlIG5hbWUgbXVzdCBub3Qgc3RhcnQgd2l0aCAiCisgICAgICAgICAidGhlIGNoYXJhY3RlciAnLScuXG4iKTsKK30KKworc3RhdGljIHZvaWQgV2FybkFib3V0T2RkT2Zmc2V0KGNvbnN0IFdlYlBNdXhGcmFtZUluZm8qIGNvbnN0IGluZm8pIHsKKyAgaWYgKChpbmZvLT54X29mZnNldCB8IGluZm8tPnlfb2Zmc2V0KSAmIDEpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6IG9kZCBvZmZzZXRzIHdpbGwgYmUgc25hcHBlZCB0byBldmVuIHZhbHVlcyIKKyAgICAgICAgICAgICIgKCVkLCAlZCkgLT4gKCVkLCAlZClcbiIsIGluZm8tPnhfb2Zmc2V0LCBpbmZvLT55X29mZnNldCwKKyAgICAgICAgICAgIGluZm8tPnhfb2Zmc2V0ICYgfjEsIGluZm8tPnlfb2Zmc2V0ICYgfjEpOworICB9Cit9CisKK3N0YXRpYyBpbnQgQ3JlYXRlTXV4KGNvbnN0IGNoYXIqIGNvbnN0IGZpbGVuYW1lLCBXZWJQTXV4KiogbXV4KSB7CisgIFdlYlBEYXRhIGJpdHN0cmVhbTsKKyAgYXNzZXJ0KG11eCAhPSBOVUxMKTsKKyAgaWYgKCFFeFV0aWxSZWFkRmlsZVRvV2ViUERhdGEoZmlsZW5hbWUsICZiaXRzdHJlYW0pKSByZXR1cm4gMDsKKyAgKm11eCA9IFdlYlBNdXhDcmVhdGUoJmJpdHN0cmVhbSwgMSk7CisgIFdlYlBEYXRhQ2xlYXIoJmJpdHN0cmVhbSk7CisgIGlmICgqbXV4ICE9IE5VTEwpIHJldHVybiAxOworICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBjcmVhdGUgbXV4IG9iamVjdCBmcm9tIGZpbGUgJXMuXG4iLCBmaWxlbmFtZSk7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IFdyaXRlRGF0YShjb25zdCBjaGFyKiBmaWxlbmFtZSwgY29uc3QgV2ViUERhdGEqIGNvbnN0IHdlYnBkYXRhKSB7CisgIGludCBvayA9IDA7CisgIEZJTEUqIGZvdXQgPSBzdHJjbXAoZmlsZW5hbWUsICItIikgPyBmb3BlbihmaWxlbmFtZSwgIndiIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEltZ0lvVXRpbFNldEJpbmFyeU1vZGUoc3Rkb3V0KTsKKyAgaWYgKGZvdXQgPT0gTlVMTCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3Igb3BlbmluZyBvdXRwdXQgV2ViUCBmaWxlICVzIVxuIiwgZmlsZW5hbWUpOworICAgIHJldHVybiAwOworICB9CisgIGlmIChmd3JpdGUod2VicGRhdGEtPmJ5dGVzLCB3ZWJwZGF0YS0+c2l6ZSwgMSwgZm91dCkgIT0gMSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3Igd3JpdGluZyBmaWxlICVzIVxuIiwgZmlsZW5hbWUpOworICB9IGVsc2UgeworICAgIGZwcmludGYoc3RkZXJyLCAiU2F2ZWQgZmlsZSAlcyAoJWQgYnl0ZXMpXG4iLAorICAgICAgICAgICAgZmlsZW5hbWUsIChpbnQpd2VicGRhdGEtPnNpemUpOworICAgIG9rID0gMTsKKyAgfQorICBpZiAoZm91dCAhPSBzdGRvdXQpIGZjbG9zZShmb3V0KTsKKyAgcmV0dXJuIG9rOworfQorCitzdGF0aWMgaW50IFdyaXRlV2ViUChXZWJQTXV4KiBjb25zdCBtdXgsIGNvbnN0IGNoYXIqIGZpbGVuYW1lKSB7CisgIGludCBvazsKKyAgV2ViUERhdGEgd2VicF9kYXRhOworICBjb25zdCBXZWJQTXV4RXJyb3IgZXJyID0gV2ViUE11eEFzc2VtYmxlKG11eCwgJndlYnBfZGF0YSk7CisgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yICglcykgYXNzZW1ibGluZyB0aGUgV2ViUCBmaWxlLlxuIiwgRXJyb3JTdHJpbmcoZXJyKSk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgb2sgPSBXcml0ZURhdGEoZmlsZW5hbWUsICZ3ZWJwX2RhdGEpOworICBXZWJQRGF0YUNsZWFyKCZ3ZWJwX2RhdGEpOworICByZXR1cm4gb2s7Cit9CisKK3N0YXRpYyBXZWJQTXV4KiBEdXBsaWNhdGVNdXhIZWFkZXIoY29uc3QgV2ViUE11eCogY29uc3QgbXV4KSB7CisgIFdlYlBNdXgqIG5ld19tdXggPSBXZWJQTXV4TmV3KCk7CisgIFdlYlBNdXhBbmltUGFyYW1zIHA7CisgIFdlYlBNdXhFcnJvciBlcnI7CisgIGludCBpOworICBpbnQgb2sgPSAxOworCisgIGlmIChuZXdfbXV4ID09IE5VTEwpIHJldHVybiBOVUxMOworCisgIGVyciA9IFdlYlBNdXhHZXRBbmltYXRpb25QYXJhbXMobXV4LCAmcCk7CisgIGlmIChlcnIgPT0gV0VCUF9NVVhfT0spIHsKKyAgICBlcnIgPSBXZWJQTXV4U2V0QW5pbWF0aW9uUGFyYW1zKG5ld19tdXgsICZwKTsKKyAgICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSB7CisgICAgICBFUlJPUl9HT1RPMigiRXJyb3IgKCVzKSBoYW5kbGluZyBhbmltYXRpb24gcGFyYW1zLlxuIiwKKyAgICAgICAgICAgICAgICAgIEVycm9yU3RyaW5nKGVyciksIEVuZCk7CisgICAgfQorICB9IGVsc2UgeworICAgIC8qIGl0IG1pZ2h0IG5vdCBiZSBhbiBhbmltYXRpb24uIEp1c3Qga2VlcCBtb3ZpbmcuICovCisgIH0KKworICBmb3IgKGkgPSAxOyBpIDw9IDM7ICsraSkgeworICAgIFdlYlBEYXRhIG1ldGFkYXRhOworICAgIGVyciA9IFdlYlBNdXhHZXRDaHVuayhtdXgsIGtGb3VyY2NMaXN0W2ldLCAmbWV0YWRhdGEpOworICAgIGlmIChlcnIgPT0gV0VCUF9NVVhfT0sgJiYgbWV0YWRhdGEuc2l6ZSA+IDApIHsKKyAgICAgIGVyciA9IFdlYlBNdXhTZXRDaHVuayhuZXdfbXV4LCBrRm91cmNjTGlzdFtpXSwgJm1ldGFkYXRhLCAxKTsKKyAgICAgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIHsKKyAgICAgICAgRVJST1JfR09UTzEoIkVycm9yIHRyYW5zZmVycmluZyBtZXRhZGF0YSBpbiBEdXBsaWNhdGVNdXgoKS4iLCBFbmQpOworICAgICAgfQorICAgIH0KKyAgfQorCisgRW5kOgorICBpZiAoIW9rKSB7CisgICAgV2ViUE11eERlbGV0ZShuZXdfbXV4KTsKKyAgICBuZXdfbXV4ID0gTlVMTDsKKyAgfQorICByZXR1cm4gbmV3X211eDsKK30KKworc3RhdGljIGludCBQYXJzZUZyYW1lQXJncyhjb25zdCBjaGFyKiBhcmdzLCBXZWJQTXV4RnJhbWVJbmZvKiBjb25zdCBpbmZvKSB7CisgIGludCBkaXNwb3NlX21ldGhvZCwgZHVtbXk7CisgIGNoYXIgcGx1c19taW51cywgYmxlbmRfbWV0aG9kOworICBjb25zdCBpbnQgbnVtX2FyZ3MgPSBzc2NhbmYoYXJncywgIislZCslZCslZCslZCVjJWMrJWQiLCAmaW5mby0+ZHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mby0+eF9vZmZzZXQsICZpbmZvLT55X29mZnNldCwgJmRpc3Bvc2VfbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBsdXNfbWludXMsICZibGVuZF9tZXRob2QsICZkdW1teSk7CisgIHN3aXRjaCAobnVtX2FyZ3MpIHsKKyAgICBjYXNlIDE6CisgICAgICBpbmZvLT54X29mZnNldCA9IGluZm8tPnlfb2Zmc2V0ID0gMDsgIC8vIGZhbGwgdGhyb3VnaAorICAgIGNhc2UgMzoKKyAgICAgIGRpc3Bvc2VfbWV0aG9kID0gMDsgIC8vIGZhbGwgdGhyb3VnaAorICAgIGNhc2UgNDoKKyAgICAgIHBsdXNfbWludXMgPSAnKyc7CisgICAgICBibGVuZF9tZXRob2QgPSAnYic7ICAvLyBmYWxsIHRocm91Z2gKKyAgICBjYXNlIDY6CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgY2FzZSA1OgorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gMDsKKyAgfQorCisgIFdhcm5BYm91dE9kZE9mZnNldChpbmZvKTsKKworICAvLyBOb3RlOiBUaGUgc2FuaXR5IG9mIHRoZSBmb2xsb3dpbmcgY29udmVyc2lvbiBpcyBjaGVja2VkIGJ5CisgIC8vIFdlYlBNdXhQdXNoRnJhbWUoKS4KKyAgaW5mby0+ZGlzcG9zZV9tZXRob2QgPSAoV2ViUE11eEFuaW1EaXNwb3NlKWRpc3Bvc2VfbWV0aG9kOworCisgIGlmIChibGVuZF9tZXRob2QgIT0gJ2InKSByZXR1cm4gMDsKKyAgaWYgKHBsdXNfbWludXMgIT0gJy0nICYmIHBsdXNfbWludXMgIT0gJysnKSByZXR1cm4gMDsKKyAgaW5mby0+YmxlbmRfbWV0aG9kID0KKyAgICAgIChwbHVzX21pbnVzID09ICcrJykgPyBXRUJQX01VWF9CTEVORCA6IFdFQlBfTVVYX05PX0JMRU5EOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBQYXJzZUJnY29sb3JBcmdzKGNvbnN0IGNoYXIqIGFyZ3MsIHVpbnQzMl90KiBjb25zdCBiZ2NvbG9yKSB7CisgIHVpbnQzMl90IGEsIHIsIGcsIGI7CisgIGlmIChzc2NhbmYoYXJncywgIiV1LCV1LCV1LCV1IiwgJmEsICZyLCAmZywgJmIpICE9IDQpIHJldHVybiAwOworICBpZiAoYSA+PSAyNTYgfHwgciA+PSAyNTYgfHwgZyA+PSAyNTYgfHwgYiA+PSAyNTYpIHJldHVybiAwOworICAqYmdjb2xvciA9IChhIDw8IDI0KSB8IChyIDw8IDE2KSB8IChnIDw8IDgpIHwgKGIgPDwgMCk7CisgIHJldHVybiAxOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ2xlYW4tdXAuCisKK3N0YXRpYyB2b2lkIERlbGV0ZUNvbmZpZyhDb25maWcqIGNvbnN0IGNvbmZpZykgeworICBpZiAoY29uZmlnICE9IE5VTEwpIHsKKyAgICBmcmVlKGNvbmZpZy0+YXJnc18pOworICAgIEV4VXRpbERlbGV0ZUNvbW1hbmRMaW5lQXJndW1lbnRzKCZjb25maWctPmNtZF9hcmdzXyk7CisgICAgbWVtc2V0KGNvbmZpZywgMCwgc2l6ZW9mKCpjb25maWcpKTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUGFyc2luZy4KKworLy8gQmFzaWMgc3ludGFjdGljIGNoZWNrcyBvbiB0aGUgY29tbWFuZC1saW5lIGFyZ3VtZW50cy4KKy8vIFJldHVybnMgMSBvbiB2YWxpZCwgMCBvdGhlcndpc2UuCisvLyBBbHNvIGZpbGxzIHVwIG51bV9mZWF0dXJlX2FyZ3MgdG8gYmUgbnVtYmVyIG9mIGZlYXR1cmUgYXJndW1lbnRzIGdpdmVuLgorLy8gKGUuZy4gaWYgdGhlcmUgYXJlIDQgJy1mcmFtZSdzIGFuZCAxICctbG9vcCcsIHRoZW4gbnVtX2ZlYXR1cmVfYXJncyA9IDUpLgorc3RhdGljIGludCBWYWxpZGF0ZUNvbW1hbmRMaW5lKGNvbnN0IENvbW1hbmRMaW5lQXJndW1lbnRzKiBjb25zdCBjbWRfYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIG51bV9mZWF0dXJlX2FyZ3MpIHsKKyAgaW50IG51bV9mcmFtZV9hcmdzOworICBpbnQgbnVtX2xvb3BfYXJnczsKKyAgaW50IG51bV9iZ2NvbG9yX2FyZ3M7CisgIGludCBudW1fZHVyYXRpb25zX2FyZ3M7CisgIGludCBvayA9IDE7CisKKyAgYXNzZXJ0KG51bV9mZWF0dXJlX2FyZ3MgIT0gTlVMTCk7CisgICpudW1fZmVhdHVyZV9hcmdzID0gMDsKKworICAvLyBTaW1wbGUgY2hlY2tzLgorICBpZiAoQ291bnRPY2N1cnJlbmNlcyhjbWRfYXJncywgIi1nZXQiKSA+IDEpIHsKKyAgICBFUlJPUl9HT1RPMSgiRVJST1I6IE11bHRpcGxlICctZ2V0JyBhcmd1bWVudHMgc3BlY2lmaWVkLlxuIiwgRXJyVmFsaWRhdGUpOworICB9CisgIGlmIChDb3VudE9jY3VycmVuY2VzKGNtZF9hcmdzLCAiLXNldCIpID4gMSkgeworICAgIEVSUk9SX0dPVE8xKCJFUlJPUjogTXVsdGlwbGUgJy1zZXQnIGFyZ3VtZW50cyBzcGVjaWZpZWQuXG4iLCBFcnJWYWxpZGF0ZSk7CisgIH0KKyAgaWYgKENvdW50T2NjdXJyZW5jZXMoY21kX2FyZ3MsICItc3RyaXAiKSA+IDEpIHsKKyAgICBFUlJPUl9HT1RPMSgiRVJST1I6IE11bHRpcGxlICctc3RyaXAnIGFyZ3VtZW50cyBzcGVjaWZpZWQuXG4iLCBFcnJWYWxpZGF0ZSk7CisgIH0KKyAgaWYgKENvdW50T2NjdXJyZW5jZXMoY21kX2FyZ3MsICItaW5mbyIpID4gMSkgeworICAgIEVSUk9SX0dPVE8xKCJFUlJPUjogTXVsdGlwbGUgJy1pbmZvJyBhcmd1bWVudHMgc3BlY2lmaWVkLlxuIiwgRXJyVmFsaWRhdGUpOworICB9CisgIGlmIChDb3VudE9jY3VycmVuY2VzKGNtZF9hcmdzLCAiLW8iKSA+IDEpIHsKKyAgICBFUlJPUl9HT1RPMSgiRVJST1I6IE11bHRpcGxlIG91dHB1dCBmaWxlcyBzcGVjaWZpZWQuXG4iLCBFcnJWYWxpZGF0ZSk7CisgIH0KKworICAvLyBDb21wb3VuZCBjaGVja3MuCisgIG51bV9mcmFtZV9hcmdzID0gQ291bnRPY2N1cnJlbmNlcyhjbWRfYXJncywgIi1mcmFtZSIpOworICBudW1fbG9vcF9hcmdzID0gQ291bnRPY2N1cnJlbmNlcyhjbWRfYXJncywgIi1sb29wIik7CisgIG51bV9iZ2NvbG9yX2FyZ3MgPSBDb3VudE9jY3VycmVuY2VzKGNtZF9hcmdzLCAiLWJnY29sb3IiKTsKKyAgbnVtX2R1cmF0aW9uc19hcmdzID0gQ291bnRPY2N1cnJlbmNlcyhjbWRfYXJncywgIi1kdXJhdGlvbiIpOworCisgIGlmIChudW1fbG9vcF9hcmdzID4gMSkgeworICAgIEVSUk9SX0dPVE8xKCJFUlJPUjogTXVsdGlwbGUgbG9vcCBjb3VudHMgc3BlY2lmaWVkLlxuIiwgRXJyVmFsaWRhdGUpOworICB9CisgIGlmIChudW1fYmdjb2xvcl9hcmdzID4gMSkgeworICAgIEVSUk9SX0dPVE8xKCJFUlJPUjogTXVsdGlwbGUgYmFja2dyb3VuZCBjb2xvcnMgc3BlY2lmaWVkLlxuIiwgRXJyVmFsaWRhdGUpOworICB9CisKKyAgaWYgKChudW1fZnJhbWVfYXJncyA9PSAwKSAmJiAobnVtX2xvb3BfYXJncyArIG51bV9iZ2NvbG9yX2FyZ3MgPiAwKSkgeworICAgIEVSUk9SX0dPVE8xKCJFUlJPUjogTG9vcCBjb3VudCBhbmQgYmFja2dyb3VuZCBjb2xvciBhcmUgcmVsZXZhbnQgb25seSBpbiAiCisgICAgICAgICAgICAgICAgImNhc2Ugb2YgYW5pbWF0aW9uLlxuIiwgRXJyVmFsaWRhdGUpOworICB9CisgIGlmIChudW1fZHVyYXRpb25zX2FyZ3MgPiAwICYmIG51bV9mcmFtZV9hcmdzICE9IDApIHsKKyAgICBFUlJPUl9HT1RPMSgiRVJST1I6IENhbiBub3QgY29tYmluZSAtZHVyYXRpb24gYW5kIC1mcmFtZSBjb21tYW5kcy5cbiIsCisgICAgICAgICAgICAgICAgRXJyVmFsaWRhdGUpOworICB9CisKKyAgYXNzZXJ0KG9rID09IDEpOworICBpZiAobnVtX2R1cmF0aW9uc19hcmdzID4gMCkgeworICAgICpudW1fZmVhdHVyZV9hcmdzID0gbnVtX2R1cmF0aW9uc19hcmdzOworICB9IGVsc2UgaWYgKG51bV9mcmFtZV9hcmdzID09IDApIHsKKyAgICAvLyBTaW5nbGUgYXJndW1lbnQgKCdzZXQnIGFjdGlvbiBmb3IgSUNDUC9FWElGL1hNUCwgT1IgYSAnZ2V0JyBhY3Rpb24pLgorICAgICpudW1fZmVhdHVyZV9hcmdzID0gMTsKKyAgfSBlbHNlIHsKKyAgICAvLyBNdWx0aXBsZSBhcmd1bWVudHMgKCdzZXQnIGFjdGlvbiBmb3IgYW5pbWF0aW9uKQorICAgICpudW1fZmVhdHVyZV9hcmdzID0gbnVtX2ZyYW1lX2FyZ3MgKyBudW1fbG9vcF9hcmdzICsgbnVtX2JnY29sb3JfYXJnczsKKyAgfQorCisgRXJyVmFsaWRhdGU6CisgIHJldHVybiBvazsKK30KKworI2RlZmluZSBBQ1RJT05fSVNfTklMIChjb25maWctPmFjdGlvbl90eXBlXyA9PSBOSUxfQUNUSU9OKQorCisjZGVmaW5lIEZFQVRVUkVUWVBFX0lTX05JTCAoY29uZmlnLT50eXBlXyA9PSBOSUxfRkVBVFVSRSkKKworI2RlZmluZSBDSEVDS19OVU1fQVJHU19MRVNTKE5VTSwgTEFCRUwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGFyZ2MgPCBpICsgKE5VTSkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogVG9vIGZldyBhcmd1bWVudHMgZm9yICclcycuXG4iLCBhcmd2W2ldKTsgICAgXAorICAgIGdvdG8gTEFCRUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisjZGVmaW5lIENIRUNLX05VTV9BUkdTX05PVF9FUVVBTChOVU0sIExBQkVMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoYXJnYyAhPSBpICsgKE5VTSkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBUb28gbWFueSBhcmd1bWVudHMgZm9yICclcycuXG4iLCBhcmd2W2ldKTsgICBcCisgICAgZ290byBMQUJFTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKy8vIFBhcnNlcyBjb21tYW5kLWxpbmUgYXJndW1lbnRzIHRvIGZpbGwgdXAgY29uZmlnIG9iamVjdC4gQWxzbyBwZXJmb3JtcyBzb21lCisvLyBzZW1hbnRpYyBjaGVja3MuCitzdGF0aWMgaW50IFBhcnNlQ29tbWFuZExpbmUoQ29uZmlnKiBjb25maWcpIHsKKyAgaW50IGkgPSAwOworICBpbnQgZmVhdHVyZV9hcmdfaW5kZXggPSAwOworICBpbnQgb2sgPSAxOworICBpbnQgYXJnYyA9IGNvbmZpZy0+Y21kX2FyZ3NfLmFyZ2NfOworICBjb25zdCBjaGFyKiBjb25zdCogYXJndiA9IGNvbmZpZy0+Y21kX2FyZ3NfLmFyZ3ZfOworCisgIHdoaWxlIChpIDwgYXJnYykgeworICAgIEZlYXR1cmVBcmcqIGNvbnN0IGFyZyA9ICZjb25maWctPmFyZ3NfW2ZlYXR1cmVfYXJnX2luZGV4XTsKKyAgICBpZiAoYXJndltpXVswXSA9PSAnLScpIHsgIC8vIE9uZSBvZiB0aGUgYWN0aW9uIHR5cGVzIG9yIG91dHB1dC4KKyAgICAgIGlmICghc3RyY21wKGFyZ3ZbaV0sICItc2V0IikpIHsKKyAgICAgICAgaWYgKEFDVElPTl9JU19OSUwpIHsKKyAgICAgICAgICBjb25maWctPmFjdGlvbl90eXBlXyA9IEFDVElPTl9TRVQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgRVJST1JfR09UTzEoIkVSUk9SOiBNdWx0aXBsZSBhY3Rpb25zIHNwZWNpZmllZC5cbiIsIEVyclBhcnNlKTsKKyAgICAgICAgfQorICAgICAgICArK2k7CisgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1kdXJhdGlvbiIpKSB7CisgICAgICAgIENIRUNLX05VTV9BUkdTX0xFU1MoMiwgRXJyUGFyc2UpOworICAgICAgICBpZiAoQUNUSU9OX0lTX05JTCB8fCBjb25maWctPmFjdGlvbl90eXBlXyA9PSBBQ1RJT05fRFVSQVRJT04pIHsKKyAgICAgICAgICBjb25maWctPmFjdGlvbl90eXBlXyA9IEFDVElPTl9EVVJBVElPTjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBFUlJPUl9HT1RPMSgiRVJST1I6IE11bHRpcGxlIGFjdGlvbnMgc3BlY2lmaWVkLlxuIiwgRXJyUGFyc2UpOworICAgICAgICB9CisgICAgICAgIGlmIChGRUFUVVJFVFlQRV9JU19OSUwgfHwgY29uZmlnLT50eXBlXyA9PSBGRUFUVVJFX0RVUkFUSU9OKSB7CisgICAgICAgICAgY29uZmlnLT50eXBlXyA9IEZFQVRVUkVfRFVSQVRJT047CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgRVJST1JfR09UTzEoIkVSUk9SOiBNdWx0aXBsZSBmZWF0dXJlcyBzcGVjaWZpZWQuXG4iLCBFcnJQYXJzZSk7CisgICAgICAgIH0KKyAgICAgICAgYXJnLT5wYXJhbXNfID0gYXJndltpICsgMV07CisgICAgICAgICsrZmVhdHVyZV9hcmdfaW5kZXg7CisgICAgICAgIGkgKz0gMjsKKyAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWdldCIpKSB7CisgICAgICAgIGlmIChBQ1RJT05fSVNfTklMKSB7CisgICAgICAgICAgY29uZmlnLT5hY3Rpb25fdHlwZV8gPSBBQ1RJT05fR0VUOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEVSUk9SX0dPVE8xKCJFUlJPUjogTXVsdGlwbGUgYWN0aW9ucyBzcGVjaWZpZWQuXG4iLCBFcnJQYXJzZSk7CisgICAgICAgIH0KKyAgICAgICAgKytpOworICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItc3RyaXAiKSkgeworICAgICAgICBpZiAoQUNUSU9OX0lTX05JTCkgeworICAgICAgICAgIGNvbmZpZy0+YWN0aW9uX3R5cGVfID0gQUNUSU9OX1NUUklQOworICAgICAgICAgIGNvbmZpZy0+YXJnX2NvdW50XyA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgRVJST1JfR09UTzEoIkVSUk9SOiBNdWx0aXBsZSBhY3Rpb25zIHNwZWNpZmllZC5cbiIsIEVyclBhcnNlKTsKKyAgICAgICAgfQorICAgICAgICArK2k7CisgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1mcmFtZSIpKSB7CisgICAgICAgIENIRUNLX05VTV9BUkdTX0xFU1MoMywgRXJyUGFyc2UpOworICAgICAgICBpZiAoQUNUSU9OX0lTX05JTCB8fCBjb25maWctPmFjdGlvbl90eXBlXyA9PSBBQ1RJT05fU0VUKSB7CisgICAgICAgICAgY29uZmlnLT5hY3Rpb25fdHlwZV8gPSBBQ1RJT05fU0VUOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEVSUk9SX0dPVE8xKCJFUlJPUjogTXVsdGlwbGUgYWN0aW9ucyBzcGVjaWZpZWQuXG4iLCBFcnJQYXJzZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEZFQVRVUkVUWVBFX0lTX05JTCB8fCBjb25maWctPnR5cGVfID09IEZFQVRVUkVfQU5NRikgeworICAgICAgICAgIGNvbmZpZy0+dHlwZV8gPSBGRUFUVVJFX0FOTUY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgRVJST1JfR09UTzEoIkVSUk9SOiBNdWx0aXBsZSBmZWF0dXJlcyBzcGVjaWZpZWQuXG4iLCBFcnJQYXJzZSk7CisgICAgICAgIH0KKyAgICAgICAgYXJnLT5zdWJ0eXBlXyA9IFNVQlRZUEVfQU5NRjsKKyAgICAgICAgYXJnLT5maWxlbmFtZV8gPSBhcmd2W2kgKyAxXTsKKyAgICAgICAgYXJnLT5wYXJhbXNfID0gYXJndltpICsgMl07CisgICAgICAgICsrZmVhdHVyZV9hcmdfaW5kZXg7CisgICAgICAgIGkgKz0gMzsKKyAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWxvb3AiKSB8fCAhc3RyY21wKGFyZ3ZbaV0sICItYmdjb2xvciIpKSB7CisgICAgICAgIENIRUNLX05VTV9BUkdTX0xFU1MoMiwgRXJyUGFyc2UpOworICAgICAgICBpZiAoQUNUSU9OX0lTX05JTCB8fCBjb25maWctPmFjdGlvbl90eXBlXyA9PSBBQ1RJT05fU0VUKSB7CisgICAgICAgICAgY29uZmlnLT5hY3Rpb25fdHlwZV8gPSBBQ1RJT05fU0VUOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEVSUk9SX0dPVE8xKCJFUlJPUjogTXVsdGlwbGUgYWN0aW9ucyBzcGVjaWZpZWQuXG4iLCBFcnJQYXJzZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEZFQVRVUkVUWVBFX0lTX05JTCB8fCBjb25maWctPnR5cGVfID09IEZFQVRVUkVfQU5NRikgeworICAgICAgICAgIGNvbmZpZy0+dHlwZV8gPSBGRUFUVVJFX0FOTUY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgRVJST1JfR09UTzEoIkVSUk9SOiBNdWx0aXBsZSBmZWF0dXJlcyBzcGVjaWZpZWQuXG4iLCBFcnJQYXJzZSk7CisgICAgICAgIH0KKyAgICAgICAgYXJnLT5zdWJ0eXBlXyA9CisgICAgICAgICAgICAhc3RyY21wKGFyZ3ZbaV0sICItbG9vcCIpID8gU1VCVFlQRV9MT09QIDogU1VCVFlQRV9CR0NPTE9SOworICAgICAgICBhcmctPnBhcmFtc18gPSBhcmd2W2kgKyAxXTsKKyAgICAgICAgKytmZWF0dXJlX2FyZ19pbmRleDsKKyAgICAgICAgaSArPSAyOworICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItbyIpKSB7CisgICAgICAgIENIRUNLX05VTV9BUkdTX0xFU1MoMiwgRXJyUGFyc2UpOworICAgICAgICBjb25maWctPm91dHB1dF8gPSBhcmd2W2kgKyAxXTsKKyAgICAgICAgaSArPSAyOworICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItaW5mbyIpKSB7CisgICAgICAgIENIRUNLX05VTV9BUkdTX05PVF9FUVVBTCgyLCBFcnJQYXJzZSk7CisgICAgICAgIGlmIChjb25maWctPmFjdGlvbl90eXBlXyAhPSBOSUxfQUNUSU9OKSB7CisgICAgICAgICAgRVJST1JfR09UTzEoIkVSUk9SOiBNdWx0aXBsZSBhY3Rpb25zIHNwZWNpZmllZC5cbiIsIEVyclBhcnNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjb25maWctPmFjdGlvbl90eXBlXyA9IEFDVElPTl9JTkZPOworICAgICAgICAgIGNvbmZpZy0+YXJnX2NvdW50XyA9IDA7CisgICAgICAgICAgY29uZmlnLT5pbnB1dF8gPSBhcmd2W2kgKyAxXTsKKyAgICAgICAgfQorICAgICAgICBpICs9IDI7CisgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1oIikgfHwgIXN0cmNtcChhcmd2W2ldLCAiLWhlbHAiKSkgeworICAgICAgICBQcmludEhlbHAoKTsKKyAgICAgICAgRGVsZXRlQ29uZmlnKGNvbmZpZyk7CisgICAgICAgIGV4aXQoMCk7CisgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi12ZXJzaW9uIikpIHsKKyAgICAgICAgY29uc3QgaW50IHZlcnNpb24gPSBXZWJQR2V0TXV4VmVyc2lvbigpOworICAgICAgICBwcmludGYoIiVkLiVkLiVkXG4iLAorICAgICAgICAgICAgICAgKHZlcnNpb24gPj4gMTYpICYgMHhmZiwgKHZlcnNpb24gPj4gOCkgJiAweGZmLCB2ZXJzaW9uICYgMHhmZik7CisgICAgICAgIERlbGV0ZUNvbmZpZyhjb25maWcpOworICAgICAgICBleGl0KDApOworICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItLSIpKSB7CisgICAgICAgIGlmIChpIDwgYXJnYyAtIDEpIHsKKyAgICAgICAgICArK2k7CisgICAgICAgICAgaWYgKGNvbmZpZy0+aW5wdXRfID09IE5VTEwpIHsKKyAgICAgICAgICAgIGNvbmZpZy0+aW5wdXRfID0gYXJndltpXTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRVJST1JfR09UTzIoIkVSUk9SIGF0ICclcyc6IE11bHRpcGxlIGlucHV0IGZpbGVzIHNwZWNpZmllZC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBhcmd2W2ldLCBFcnJQYXJzZSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgRVJST1JfR09UTzIoIkVSUk9SOiBVbmtub3duIG9wdGlvbjogJyVzJy5cbiIsIGFyZ3ZbaV0sIEVyclBhcnNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeyAgLy8gT25lIG9mIHRoZSBmZWF0dXJlIHR5cGVzIG9yIGlucHV0LgorICAgICAgaWYgKEFDVElPTl9JU19OSUwpIHsKKyAgICAgICAgRVJST1JfR09UTzEoIkVSUk9SOiBBY3Rpb24gbXVzdCBiZSBzcGVjaWZpZWQgYmVmb3JlIG90aGVyIGFyZ3VtZW50cy5cbiIsCisgICAgICAgICAgICAgICAgICAgIEVyclBhcnNlKTsKKyAgICAgIH0KKyAgICAgIGlmICghc3RyY21wKGFyZ3ZbaV0sICJpY2MiKSB8fCAhc3RyY21wKGFyZ3ZbaV0sICJleGlmIikgfHwKKyAgICAgICAgICAhc3RyY21wKGFyZ3ZbaV0sICJ4bXAiKSkgeworICAgICAgICBpZiAoRkVBVFVSRVRZUEVfSVNfTklMKSB7CisgICAgICAgICAgY29uZmlnLT50eXBlXyA9ICghc3RyY21wKGFyZ3ZbaV0sICJpY2MiKSkgPyBGRUFUVVJFX0lDQ1AgOgorICAgICAgICAgICAgICAoIXN0cmNtcChhcmd2W2ldLCAiZXhpZiIpKSA/IEZFQVRVUkVfRVhJRiA6IEZFQVRVUkVfWE1QOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEVSUk9SX0dPVE8xKCJFUlJPUjogTXVsdGlwbGUgZmVhdHVyZXMgc3BlY2lmaWVkLlxuIiwgRXJyUGFyc2UpOworICAgICAgICB9CisgICAgICAgIGlmIChjb25maWctPmFjdGlvbl90eXBlXyA9PSBBQ1RJT05fU0VUKSB7CisgICAgICAgICAgQ0hFQ0tfTlVNX0FSR1NfTEVTUygyLCBFcnJQYXJzZSk7CisgICAgICAgICAgYXJnLT5maWxlbmFtZV8gPSBhcmd2W2kgKyAxXTsKKyAgICAgICAgICArK2ZlYXR1cmVfYXJnX2luZGV4OworICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICArK2k7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiZnJhbWUiKSAmJgorICAgICAgICAgICAgICAgICAoY29uZmlnLT5hY3Rpb25fdHlwZV8gPT0gQUNUSU9OX0dFVCkpIHsKKyAgICAgICAgQ0hFQ0tfTlVNX0FSR1NfTEVTUygyLCBFcnJQYXJzZSk7CisgICAgICAgIGNvbmZpZy0+dHlwZV8gPSBGRUFUVVJFX0FOTUY7CisgICAgICAgIGFyZy0+cGFyYW1zXyA9IGFyZ3ZbaSArIDFdOworICAgICAgICArK2ZlYXR1cmVfYXJnX2luZGV4OworICAgICAgICBpICs9IDI7CisgICAgICB9IGVsc2UgeyAgLy8gQXNzdW1lIGlucHV0IGZpbGUuCisgICAgICAgIGlmIChjb25maWctPmlucHV0XyA9PSBOVUxMKSB7CisgICAgICAgICAgY29uZmlnLT5pbnB1dF8gPSBhcmd2W2ldOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEVSUk9SX0dPVE8yKCJFUlJPUiBhdCAnJXMnOiBNdWx0aXBsZSBpbnB1dCBmaWxlcyBzcGVjaWZpZWQuXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGFyZ3ZbaV0sIEVyclBhcnNlKTsKKyAgICAgICAgfQorICAgICAgICArK2k7CisgICAgICB9CisgICAgfQorICB9CisgRXJyUGFyc2U6CisgIHJldHVybiBvazsKK30KKworLy8gQWRkaXRpb25hbCBjaGVja3MgYWZ0ZXIgY29uZmlnIGlzIGZpbGxlZC4KK3N0YXRpYyBpbnQgVmFsaWRhdGVDb25maWcoQ29uZmlnKiBjb25zdCBjb25maWcpIHsKKyAgaW50IG9rID0gMTsKKworICAvLyBBY3Rpb24uCisgIGlmIChBQ1RJT05fSVNfTklMKSB7CisgICAgRVJST1JfR09UTzEoIkVSUk9SOiBObyBhY3Rpb24gc3BlY2lmaWVkLlxuIiwgRXJyVmFsaWRhdGUyKTsKKyAgfQorCisgIC8vIEZlYXR1cmUgdHlwZS4KKyAgaWYgKEZFQVRVUkVUWVBFX0lTX05JTCAmJiBjb25maWctPmFjdGlvbl90eXBlXyAhPSBBQ1RJT05fSU5GTykgeworICAgIEVSUk9SX0dPVE8xKCJFUlJPUjogTm8gZmVhdHVyZSBzcGVjaWZpZWQuXG4iLCBFcnJWYWxpZGF0ZTIpOworICB9CisKKyAgLy8gSW5wdXQgZmlsZS4KKyAgaWYgKGNvbmZpZy0+aW5wdXRfID09IE5VTEwpIHsKKyAgICBpZiAoY29uZmlnLT5hY3Rpb25fdHlwZV8gIT0gQUNUSU9OX1NFVCkgeworICAgICAgRVJST1JfR09UTzEoIkVSUk9SOiBObyBpbnB1dCBmaWxlIHNwZWNpZmllZC5cbiIsIEVyclZhbGlkYXRlMik7CisgICAgfSBlbHNlIGlmIChjb25maWctPnR5cGVfICE9IEZFQVRVUkVfQU5NRikgeworICAgICAgRVJST1JfR09UTzEoIkVSUk9SOiBObyBpbnB1dCBmaWxlIHNwZWNpZmllZC5cbiIsIEVyclZhbGlkYXRlMik7CisgICAgfQorICB9CisKKyAgLy8gT3V0cHV0IGZpbGUuCisgIGlmIChjb25maWctPm91dHB1dF8gPT0gTlVMTCAmJiBjb25maWctPmFjdGlvbl90eXBlXyAhPSBBQ1RJT05fSU5GTykgeworICAgIEVSUk9SX0dPVE8xKCJFUlJPUjogTm8gb3V0cHV0IGZpbGUgc3BlY2lmaWVkLlxuIiwgRXJyVmFsaWRhdGUyKTsKKyAgfQorCisgRXJyVmFsaWRhdGUyOgorICByZXR1cm4gb2s7Cit9CisKKy8vIENyZWF0ZSBjb25maWcgb2JqZWN0IGZyb20gY29tbWFuZC1saW5lIGFyZ3VtZW50cy4KK3N0YXRpYyBpbnQgSW5pdGlhbGl6ZUNvbmZpZyhpbnQgYXJnYywgY29uc3QgY2hhciogYXJndltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZyogY29uc3QgY29uZmlnKSB7CisgIGludCBudW1fZmVhdHVyZV9hcmdzID0gMDsKKyAgaW50IG9rOworCisgIG1lbXNldChjb25maWcsIDAsIHNpemVvZigqY29uZmlnKSk7CisKKyAgb2sgPSBFeFV0aWxJbml0Q29tbWFuZExpbmVBcmd1bWVudHMoYXJnYywgYXJndiwgJmNvbmZpZy0+Y21kX2FyZ3NfKTsKKyAgaWYgKCFvaykgcmV0dXJuIDA7CisKKyAgLy8gVmFsaWRhdGUgY29tbWFuZC1saW5lIGFyZ3VtZW50cy4KKyAgaWYgKCFWYWxpZGF0ZUNvbW1hbmRMaW5lKCZjb25maWctPmNtZF9hcmdzXywgJm51bV9mZWF0dXJlX2FyZ3MpKSB7CisgICAgRVJST1JfR09UTzEoIkV4aXRpbmcgZHVlIHRvIGNvbW1hbmQtbGluZSBwYXJzaW5nIGVycm9yLlxuIiwgRXJyMSk7CisgIH0KKworICBjb25maWctPmFyZ19jb3VudF8gPSBudW1fZmVhdHVyZV9hcmdzOworICBjb25maWctPmFyZ3NfID0gKEZlYXR1cmVBcmcqKWNhbGxvYyhudW1fZmVhdHVyZV9hcmdzLCBzaXplb2YoKmNvbmZpZy0+YXJnc18pKTsKKyAgaWYgKGNvbmZpZy0+YXJnc18gPT0gTlVMTCkgeworICAgIEVSUk9SX0dPVE8xKCJFUlJPUjogTWVtb3J5IGFsbG9jYXRpb24gZXJyb3IuXG4iLCBFcnIxKTsKKyAgfQorCisgIC8vIFBhcnNlIGNvbW1hbmQtbGluZS4KKyAgaWYgKCFQYXJzZUNvbW1hbmRMaW5lKGNvbmZpZykgfHwgIVZhbGlkYXRlQ29uZmlnKGNvbmZpZykpIHsKKyAgICBFUlJPUl9HT1RPMSgiRXhpdGluZyBkdWUgdG8gY29tbWFuZC1saW5lIHBhcnNpbmcgZXJyb3IuXG4iLCBFcnIxKTsKKyAgfQorCisgRXJyMToKKyAgcmV0dXJuIG9rOworfQorCisjdW5kZWYgQUNUSU9OX0lTX05JTAorI3VuZGVmIEZFQVRVUkVUWVBFX0lTX05JTAorI3VuZGVmIENIRUNLX05VTV9BUkdTX0xFU1MKKyN1bmRlZiBDSEVDS19OVU1fQVJHU19NT1JFCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQcm9jZXNzaW5nLgorCitzdGF0aWMgaW50IEdldEZyYW1lKGNvbnN0IFdlYlBNdXgqIG11eCwgY29uc3QgQ29uZmlnKiBjb25maWcpIHsKKyAgV2ViUE11eEVycm9yIGVyciA9IFdFQlBfTVVYX09LOworICBXZWJQTXV4KiBtdXhfc2luZ2xlID0gTlVMTDsKKyAgaW50IG51bSA9IDA7CisgIGludCBvayA9IDE7CisgIGludCBwYXJzZV9lcnJvciA9IDA7CisgIGNvbnN0IFdlYlBDaHVua0lkIGlkID0gV0VCUF9DSFVOS19BTk1GOworICBXZWJQTXV4RnJhbWVJbmZvIGluZm87CisgIFdlYlBEYXRhSW5pdCgmaW5mby5iaXRzdHJlYW0pOworCisgIG51bSA9IEV4VXRpbEdldEludChjb25maWctPmFyZ3NfWzBdLnBhcmFtc18sIDEwLCAmcGFyc2VfZXJyb3IpOworICBpZiAobnVtIDwgMCkgeworICAgIEVSUk9SX0dPVE8xKCJFUlJPUjogRnJhbWUvRnJhZ21lbnQgaW5kZXggbXVzdCBiZSBub24tbmVnYXRpdmUuXG4iLCBFcnJHZXQpOworICB9CisgIGlmIChwYXJzZV9lcnJvcikgZ290byBFcnJHZXQ7CisKKyAgZXJyID0gV2ViUE11eEdldEZyYW1lKG11eCwgbnVtLCAmaW5mbyk7CisgIGlmIChlcnIgPT0gV0VCUF9NVVhfT0sgJiYgaW5mby5pZCAhPSBpZCkgZXJyID0gV0VCUF9NVVhfTk9UX0ZPVU5EOworICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSB7CisgICAgRVJST1JfR09UTzMoIkVSUk9SICglcyk6IENvdWxkIG5vdCBnZXQgZnJhbWUgJWQuXG4iLAorICAgICAgICAgICAgICAgIEVycm9yU3RyaW5nKGVyciksIG51bSwgRXJyR2V0KTsKKyAgfQorCisgIG11eF9zaW5nbGUgPSBXZWJQTXV4TmV3KCk7CisgIGlmIChtdXhfc2luZ2xlID09IE5VTEwpIHsKKyAgICBlcnIgPSBXRUJQX01VWF9NRU1PUllfRVJST1I7CisgICAgRVJST1JfR09UTzIoIkVSUk9SICglcyk6IENvdWxkIG5vdCBhbGxvY2F0ZSBhIG11eCBvYmplY3QuXG4iLAorICAgICAgICAgICAgICAgIEVycm9yU3RyaW5nKGVyciksIEVyckdldCk7CisgIH0KKyAgZXJyID0gV2ViUE11eFNldEltYWdlKG11eF9zaW5nbGUsICZpbmZvLmJpdHN0cmVhbSwgMSk7CisgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIHsKKyAgICBFUlJPUl9HT1RPMigiRVJST1IgKCVzKTogQ291bGQgbm90IGNyZWF0ZSBzaW5nbGUgaW1hZ2UgbXV4IG9iamVjdC5cbiIsCisgICAgICAgICAgICAgICAgRXJyb3JTdHJpbmcoZXJyKSwgRXJyR2V0KTsKKyAgfQorCisgIG9rID0gV3JpdGVXZWJQKG11eF9zaW5nbGUsIGNvbmZpZy0+b3V0cHV0Xyk7CisKKyBFcnJHZXQ6CisgIFdlYlBEYXRhQ2xlYXIoJmluZm8uYml0c3RyZWFtKTsKKyAgV2ViUE11eERlbGV0ZShtdXhfc2luZ2xlKTsKKyAgcmV0dXJuIG9rICYmICFwYXJzZV9lcnJvcjsKK30KKworLy8gUmVhZCBhbmQgcHJvY2VzcyBjb25maWcuCitzdGF0aWMgaW50IFByb2Nlc3MoY29uc3QgQ29uZmlnKiBjb25maWcpIHsKKyAgV2ViUE11eCogbXV4ID0gTlVMTDsKKyAgV2ViUERhdGEgY2h1bms7CisgIFdlYlBNdXhFcnJvciBlcnIgPSBXRUJQX01VWF9PSzsKKyAgaW50IG9rID0gMTsKKworICBzd2l0Y2ggKGNvbmZpZy0+YWN0aW9uX3R5cGVfKSB7CisgICAgY2FzZSBBQ1RJT05fR0VUOiB7CisgICAgICBvayA9IENyZWF0ZU11eChjb25maWctPmlucHV0XywgJm11eCk7CisgICAgICBpZiAoIW9rKSBnb3RvIEVycjI7CisgICAgICBzd2l0Y2ggKGNvbmZpZy0+dHlwZV8pIHsKKyAgICAgICAgY2FzZSBGRUFUVVJFX0FOTUY6CisgICAgICAgICAgb2sgPSBHZXRGcmFtZShtdXgsIGNvbmZpZyk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBGRUFUVVJFX0lDQ1A6CisgICAgICAgIGNhc2UgRkVBVFVSRV9FWElGOgorICAgICAgICBjYXNlIEZFQVRVUkVfWE1QOgorICAgICAgICAgIGVyciA9IFdlYlBNdXhHZXRDaHVuayhtdXgsIGtGb3VyY2NMaXN0W2NvbmZpZy0+dHlwZV9dLCAmY2h1bmspOworICAgICAgICAgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIHsKKyAgICAgICAgICAgIEVSUk9SX0dPVE8zKCJFUlJPUiAoJXMpOiBDb3VsZCBub3QgZ2V0IHRoZSAlcy5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBFcnJvclN0cmluZyhlcnIpLCBrRGVzY3JpcHRpb25zW2NvbmZpZy0+dHlwZV9dLCBFcnIyKTsKKyAgICAgICAgICB9CisgICAgICAgICAgb2sgPSBXcml0ZURhdGEoY29uZmlnLT5vdXRwdXRfLCAmY2h1bmspOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgRVJST1JfR09UTzEoIkVSUk9SOiBJbnZhbGlkIGZlYXR1cmUgZm9yIGFjdGlvbiAnZ2V0Jy5cbiIsIEVycjIpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQUNUSU9OX1NFVDogeworICAgICAgc3dpdGNoIChjb25maWctPnR5cGVfKSB7CisgICAgICAgIGNhc2UgRkVBVFVSRV9BTk1GOiB7CisgICAgICAgICAgaW50IGk7CisgICAgICAgICAgV2ViUE11eEFuaW1QYXJhbXMgcGFyYW1zID0geyAweEZGRkZGRkZGLCAwIH07CisgICAgICAgICAgbXV4ID0gV2ViUE11eE5ldygpOworICAgICAgICAgIGlmIChtdXggPT0gTlVMTCkgeworICAgICAgICAgICAgRVJST1JfR09UTzIoIkVSUk9SICglcyk6IENvdWxkIG5vdCBhbGxvY2F0ZSBhIG11eCBvYmplY3QuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JTdHJpbmcoV0VCUF9NVVhfTUVNT1JZX0VSUk9SKSwgRXJyMik7CisgICAgICAgICAgfQorICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb25maWctPmFyZ19jb3VudF87ICsraSkgeworICAgICAgICAgICAgc3dpdGNoIChjb25maWctPmFyZ3NfW2ldLnN1YnR5cGVfKSB7CisgICAgICAgICAgICAgIGNhc2UgU1VCVFlQRV9CR0NPTE9SOiB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYmdjb2xvcjsKKyAgICAgICAgICAgICAgICBvayA9IFBhcnNlQmdjb2xvckFyZ3MoY29uZmlnLT5hcmdzX1tpXS5wYXJhbXNfLCAmYmdjb2xvcik7CisgICAgICAgICAgICAgICAgaWYgKCFvaykgeworICAgICAgICAgICAgICAgICAgRVJST1JfR09UTzEoIkVSUk9SOiBDb3VsZCBub3QgcGFyc2UgdGhlIGJhY2tncm91bmQgY29sb3IgXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBhcmFtcy5iZ2NvbG9yID0gYmdjb2xvcjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBjYXNlIFNVQlRZUEVfTE9PUDogeworICAgICAgICAgICAgICAgIGludCBwYXJzZV9lcnJvciA9IDA7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGxvb3BfY291bnQgPQorICAgICAgICAgICAgICAgICAgICBFeFV0aWxHZXRJbnQoY29uZmlnLT5hcmdzX1tpXS5wYXJhbXNfLCAxMCwgJnBhcnNlX2Vycm9yKTsKKyAgICAgICAgICAgICAgICBpZiAobG9vcF9jb3VudCA8IDAgfHwgbG9vcF9jb3VudCA+IDY1NTM1KSB7CisgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBUaGlzIGlzIG9ubHkgYSAnbmVjZXNzYXJ5JyBjb25kaXRpb24gZm9yIGxvb3BfY291bnQKKyAgICAgICAgICAgICAgICAgIC8vIHRvIGJlIHZhbGlkLiBUaGUgJ3N1ZmZpY2llbnQnIGNvbmRpdGlvbmVkIGluIGNoZWNrZWQgaW4KKyAgICAgICAgICAgICAgICAgIC8vIFdlYlBNdXhTZXRBbmltYXRpb25QYXJhbXMoKSBtZXRob2QgY2FsbGVkIGxhdGVyLgorICAgICAgICAgICAgICAgICAgRVJST1JfR09UTzEoIkVSUk9SOiBMb29wIGNvdW50IG11c3QgYmUgaW4gdGhlIHJhbmdlIDAgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjY1NTM1LlxuIiwgRXJyMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9rID0gIXBhcnNlX2Vycm9yOworICAgICAgICAgICAgICAgIGlmICghb2spIGdvdG8gRXJyMjsKKyAgICAgICAgICAgICAgICBwYXJhbXMubG9vcF9jb3VudCA9IGxvb3BfY291bnQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgY2FzZSBTVUJUWVBFX0FOTUY6IHsKKyAgICAgICAgICAgICAgICBXZWJQTXV4RnJhbWVJbmZvIGZyYW1lOworICAgICAgICAgICAgICAgIGZyYW1lLmlkID0gV0VCUF9DSFVOS19BTk1GOworICAgICAgICAgICAgICAgIG9rID0gRXhVdGlsUmVhZEZpbGVUb1dlYlBEYXRhKGNvbmZpZy0+YXJnc19baV0uZmlsZW5hbWVfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmcmFtZS5iaXRzdHJlYW0pOworICAgICAgICAgICAgICAgIGlmICghb2spIGdvdG8gRXJyMjsKKyAgICAgICAgICAgICAgICBvayA9IFBhcnNlRnJhbWVBcmdzKGNvbmZpZy0+YXJnc19baV0ucGFyYW1zXywgJmZyYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoIW9rKSB7CisgICAgICAgICAgICAgICAgICBXZWJQRGF0YUNsZWFyKCZmcmFtZS5iaXRzdHJlYW0pOworICAgICAgICAgICAgICAgICAgRVJST1JfR09UTzEoIkVSUk9SOiBDb3VsZCBub3QgcGFyc2UgZnJhbWUgcHJvcGVydGllcy5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnIyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZXJyID0gV2ViUE11eFB1c2hGcmFtZShtdXgsICZmcmFtZSwgMSk7CisgICAgICAgICAgICAgICAgV2ViUERhdGFDbGVhcigmZnJhbWUuYml0c3RyZWFtKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSB7CisgICAgICAgICAgICAgICAgICBFUlJPUl9HT1RPMygiRVJST1IgKCVzKTogQ291bGQgbm90IGFkZCBhIGZyYW1lIGF0IGluZGV4ICVkLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiIsIEVycm9yU3RyaW5nKGVyciksIGksIEVycjIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICAgICAgRVJST1JfR09UTzEoIkVSUk9SOiBJbnZhbGlkIHN1YnR5cGUgZm9yICdmcmFtZSciLCBFcnIyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBlcnIgPSBXZWJQTXV4U2V0QW5pbWF0aW9uUGFyYW1zKG11eCwgJnBhcmFtcyk7CisgICAgICAgICAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgeworICAgICAgICAgICAgRVJST1JfR09UTzIoIkVSUk9SICglcyk6IENvdWxkIG5vdCBzZXQgYW5pbWF0aW9uIHBhcmFtZXRlcnMuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JTdHJpbmcoZXJyKSwgRXJyMik7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGRUFUVVJFX0lDQ1A6CisgICAgICAgIGNhc2UgRkVBVFVSRV9FWElGOgorICAgICAgICBjYXNlIEZFQVRVUkVfWE1QOiB7CisgICAgICAgICAgb2sgPSBDcmVhdGVNdXgoY29uZmlnLT5pbnB1dF8sICZtdXgpOworICAgICAgICAgIGlmICghb2spIGdvdG8gRXJyMjsKKyAgICAgICAgICBvayA9IEV4VXRpbFJlYWRGaWxlVG9XZWJQRGF0YShjb25maWctPmFyZ3NfWzBdLmZpbGVuYW1lXywgJmNodW5rKTsKKyAgICAgICAgICBpZiAoIW9rKSBnb3RvIEVycjI7CisgICAgICAgICAgZXJyID0gV2ViUE11eFNldENodW5rKG11eCwga0ZvdXJjY0xpc3RbY29uZmlnLT50eXBlX10sICZjaHVuaywgMSk7CisgICAgICAgICAgZnJlZSgodm9pZCopY2h1bmsuYnl0ZXMpOworICAgICAgICAgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIHsKKyAgICAgICAgICAgIEVSUk9SX0dPVE8zKCJFUlJPUiAoJXMpOiBDb3VsZCBub3Qgc2V0IHRoZSAlcy5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBFcnJvclN0cmluZyhlcnIpLCBrRGVzY3JpcHRpb25zW2NvbmZpZy0+dHlwZV9dLCBFcnIyKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgIEVSUk9SX0dPVE8xKCJFUlJPUjogSW52YWxpZCBmZWF0dXJlIGZvciBhY3Rpb24gJ3NldCcuXG4iLCBFcnIyKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgb2sgPSBXcml0ZVdlYlAobXV4LCBjb25maWctPm91dHB1dF8pOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQUNUSU9OX0RVUkFUSU9OOiB7CisgICAgICBpbnQgbnVtX2ZyYW1lczsKKyAgICAgIG9rID0gQ3JlYXRlTXV4KGNvbmZpZy0+aW5wdXRfLCAmbXV4KTsKKyAgICAgIGlmICghb2spIGdvdG8gRXJyMjsKKyAgICAgIGVyciA9IFdlYlBNdXhOdW1DaHVua3MobXV4LCBXRUJQX0NIVU5LX0FOTUYsICZudW1fZnJhbWVzKTsKKyAgICAgIG9rID0gKGVyciA9PSBXRUJQX01VWF9PSyk7CisgICAgICBpZiAoIW9rKSB7CisgICAgICAgIEVSUk9SX0dPVE8xKCJFUlJPUjogY2FuIG5vdCBwYXJzZSB0aGUgbnVtYmVyIG9mIGZyYW1lcy5cbiIsIEVycjIpOworICAgICAgfQorICAgICAgaWYgKG51bV9mcmFtZXMgPT0gMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkRvZXNuJ3QgbG9vayBsaWtlIHRoZSBzb3VyY2UgaXMgYW5pbWF0ZWQuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJTa2lwcGluZyBkdXJhdGlvbiBzZXR0aW5nLlxuIik7CisgICAgICAgIG9rID0gV3JpdGVXZWJQKG11eCwgY29uZmlnLT5vdXRwdXRfKTsKKyAgICAgICAgaWYgKCFvaykgZ290byBFcnIyOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGludCogZHVyYXRpb25zID0gTlVMTDsKKyAgICAgICAgV2ViUE11eCogbmV3X211eCA9IER1cGxpY2F0ZU11eEhlYWRlcihtdXgpOworICAgICAgICBpZiAobmV3X211eCA9PSBOVUxMKSBnb3RvIEVycjI7CisgICAgICAgIGR1cmF0aW9ucyA9IChpbnQqKW1hbGxvYygoc2l6ZV90KW51bV9mcmFtZXMgKiBzaXplb2YoKmR1cmF0aW9ucykpOworICAgICAgICBpZiAoZHVyYXRpb25zID09IE5VTEwpIGdvdG8gRXJyMjsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9mcmFtZXM7ICsraSkgZHVyYXRpb25zW2ldID0gLTE7CisKKyAgICAgICAgLy8gUGFyc2UgaW50ZXJ2YWxzIHRvIHByb2Nlc3MuCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb25maWctPmFyZ19jb3VudF87ICsraSkgeworICAgICAgICAgIGludCBrOworICAgICAgICAgIGludCBhcmdzWzNdOworICAgICAgICAgIGludCBkdXJhdGlvbiwgc3RhcnQsIGVuZDsKKyAgICAgICAgICBjb25zdCBpbnQgbmJfYXJncyA9IEV4VXRpbEdldEludHMoY29uZmlnLT5hcmdzX1tpXS5wYXJhbXNfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCwgMywgYXJncyk7CisgICAgICAgICAgb2sgPSAobmJfYXJncyA+PSAxKTsKKyAgICAgICAgICBpZiAoIW9rKSBnb3RvIEVycjM7CisgICAgICAgICAgZHVyYXRpb24gPSBhcmdzWzBdOworICAgICAgICAgIGlmIChkdXJhdGlvbiA8IDApIHsKKyAgICAgICAgICAgIEVSUk9SX0dPVE8xKCJFUlJPUjogZHVyYXRpb24gbXVzdCBiZSBzdHJpY3RseSBwb3NpdGl2ZS5cbiIsIEVycjMpOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChuYl9hcmdzID09IDEpIHsgICAvLyBvbmx5IGR1cmF0aW9uIGlzIHByZXNlbnQgLT4gdXNlIGZ1bGwgaW50ZXJ2YWwKKyAgICAgICAgICAgIHN0YXJ0ID0gMTsKKyAgICAgICAgICAgIGVuZCA9IG51bV9mcmFtZXM7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXJ0ID0gYXJnc1sxXTsKKyAgICAgICAgICAgIGlmIChzdGFydCA8PSAwKSB7CisgICAgICAgICAgICAgIHN0YXJ0ID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnQgPiBudW1fZnJhbWVzKSB7CisgICAgICAgICAgICAgIHN0YXJ0ID0gbnVtX2ZyYW1lczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVuZCA9IChuYl9hcmdzID49IDMpID8gYXJnc1syXSA6IHN0YXJ0OworICAgICAgICAgICAgaWYgKGVuZCA9PSAwIHx8IGVuZCA+IG51bV9mcmFtZXMpIGVuZCA9IG51bV9mcmFtZXM7CisgICAgICAgICAgfQorCisgICAgICAgICAgZm9yIChrID0gc3RhcnQ7IGsgPD0gZW5kOyArK2spIHsKKyAgICAgICAgICAgIGFzc2VydChrID49IDEgJiYgayA8PSBudW1fZnJhbWVzKTsKKyAgICAgICAgICAgIGR1cmF0aW9uc1trIC0gMV0gPSBkdXJhdGlvbjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBBcHBseSBub24tbmVnYXRpdmUgZHVyYXRpb25zIHRvIHRoZWlyIGRlc3RpbmF0aW9uIGZyYW1lcy4KKyAgICAgICAgZm9yIChpID0gMTsgaSA8PSBudW1fZnJhbWVzOyArK2kpIHsKKyAgICAgICAgICBXZWJQTXV4RnJhbWVJbmZvIGZyYW1lOworICAgICAgICAgIGVyciA9IFdlYlBNdXhHZXRGcmFtZShtdXgsIGksICZmcmFtZSk7CisgICAgICAgICAgaWYgKGVyciAhPSBXRUJQX01VWF9PSyB8fCBmcmFtZS5pZCAhPSBXRUJQX0NIVU5LX0FOTUYpIHsKKyAgICAgICAgICAgIEVSUk9SX0dPVE8yKCJFUlJPUjogY2FuIG5vdCByZXRyaWV2ZSBmcmFtZSAjJWQuXG4iLCBpLCBFcnIzKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGR1cmF0aW9uc1tpIC0gMV0gPj0gMCkgZnJhbWUuZHVyYXRpb24gPSBkdXJhdGlvbnNbaSAtIDFdOworICAgICAgICAgIGVyciA9IFdlYlBNdXhQdXNoRnJhbWUobmV3X211eCwgJmZyYW1lLCAxKTsKKyAgICAgICAgICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSB7CisgICAgICAgICAgICBFUlJPUl9HT1RPMigiRVJST1I6IGVycm9yIHB1c2ggZnJhbWUgZGF0YSAjJWRcbiIsIGksIEVycjMpOworICAgICAgICAgIH0KKyAgICAgICAgICBXZWJQRGF0YUNsZWFyKCZmcmFtZS5iaXRzdHJlYW0pOworICAgICAgICB9CisgICAgICAgIFdlYlBNdXhEZWxldGUobXV4KTsKKyAgICAgICAgb2sgPSBXcml0ZVdlYlAobmV3X211eCwgY29uZmlnLT5vdXRwdXRfKTsKKyAgICAgICAgbXV4ID0gbmV3X211eDsgIC8vIHRyYW5zZmVyIGZvciB0aGUgV2ViUE11eERlbGV0ZSgpIGNhbGwKKyAgICAgICAgbmV3X211eCA9IE5VTEw7CisKKyBFcnIzOgorICAgICAgICBmcmVlKGR1cmF0aW9ucyk7CisgICAgICAgIFdlYlBNdXhEZWxldGUobmV3X211eCk7CisgICAgICAgIGlmICghb2spIGdvdG8gRXJyMjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEFDVElPTl9TVFJJUDogeworICAgICAgb2sgPSBDcmVhdGVNdXgoY29uZmlnLT5pbnB1dF8sICZtdXgpOworICAgICAgaWYgKCFvaykgZ290byBFcnIyOworICAgICAgaWYgKGNvbmZpZy0+dHlwZV8gPT0gRkVBVFVSRV9JQ0NQIHx8IGNvbmZpZy0+dHlwZV8gPT0gRkVBVFVSRV9FWElGIHx8CisgICAgICAgICAgY29uZmlnLT50eXBlXyA9PSBGRUFUVVJFX1hNUCkgeworICAgICAgICBlcnIgPSBXZWJQTXV4RGVsZXRlQ2h1bmsobXV4LCBrRm91cmNjTGlzdFtjb25maWctPnR5cGVfXSk7CisgICAgICAgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIHsKKyAgICAgICAgICBFUlJPUl9HT1RPMygiRVJST1IgKCVzKTogQ291bGQgbm90IHN0cmlwIHRoZSAlcy5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgRXJyb3JTdHJpbmcoZXJyKSwga0Rlc2NyaXB0aW9uc1tjb25maWctPnR5cGVfXSwgRXJyMik7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEVSUk9SX0dPVE8xKCJFUlJPUjogSW52YWxpZCBmZWF0dXJlIGZvciBhY3Rpb24gJ3N0cmlwJy5cbiIsIEVycjIpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIG9rID0gV3JpdGVXZWJQKG11eCwgY29uZmlnLT5vdXRwdXRfKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEFDVElPTl9JTkZPOiB7CisgICAgICBvayA9IENyZWF0ZU11eChjb25maWctPmlucHV0XywgJm11eCk7CisgICAgICBpZiAoIW9rKSBnb3RvIEVycjI7CisgICAgICBvayA9IChEaXNwbGF5SW5mbyhtdXgpID09IFdFQlBfTVVYX09LKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OiB7CisgICAgICBhc3NlcnQoMCk7ICAvLyBJbnZhbGlkIGFjdGlvbi4KKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgRXJyMjoKKyAgV2ViUE11eERlbGV0ZShtdXgpOworICByZXR1cm4gb2s7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNYWluLgorCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciogYXJndltdKSB7CisgIENvbmZpZyBjb25maWc7CisgIGludCBvayA9IEluaXRpYWxpemVDb25maWcoYXJnYyAtIDEsIGFyZ3YgKyAxLCAmY29uZmlnKTsKKyAgaWYgKG9rKSB7CisgICAgb2sgPSBQcm9jZXNzKCZjb25maWcpOworICB9IGVsc2UgeworICAgIFByaW50SGVscCgpOworICB9CisgIERlbGV0ZUNvbmZpZygmY29uZmlnKTsKKyAgcmV0dXJuICFvazsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4dHJhcy9NYWtlZmlsZS5hbSBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4dHJhcy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGQ1NjdhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXh0cmFzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDQgQEAKK0FNX0NQUEZMQUdTICs9IC1JJCh0b3BfYnVpbGRkaXIpIC1JJCh0b3Bfc3JjZGlyKQorQU1fQ1BQRkxBR1MgKz0gLUkkKHRvcF9idWlsZGRpcikvc3JjIC1JJCh0b3Bfc3JjZGlyKS9zcmMKK25vaW5zdF9MVExJQlJBUklFUyA9IGxpYndlYnBleHRyYXMubGEKKworbm9pbnN0X0hFQURFUlMgPQorbm9pbnN0X0hFQURFUlMgKz0gLi4vc3JjL3dlYnAvdHlwZXMuaAorCitsaWJ3ZWJwZXh0cmFzX2xhX1NPVVJDRVMgPQorbGlid2VicGV4dHJhc19sYV9TT1VSQ0VTICs9IGV4dHJhcy5jIGV4dHJhcy5oIHF1YWxpdHlfZXN0aW1hdGUuYworCitsaWJ3ZWJwZXh0cmFzX2xhX0NQUEZMQUdTID0gJChBTV9DUFBGTEFHUykKK2xpYndlYnBleHRyYXNfbGFfTERGTEFHUyA9IC1sbQorbGlid2VicGV4dHJhc19sYV9MSUJBREQgPSAuLi9zcmMvbGlid2VicC5sYQorCitub2luc3RfUFJPR1JBTVMgPQorbm9pbnN0X1BST0dSQU1TICs9IHdlYnBfcXVhbGl0eQoraWYgV0FOVF9ERU1VWAorICBub2luc3RfUFJPR1JBTVMgKz0gZ2V0X2Rpc3RvCitlbmRpZgoraWYgQlVJTERfVldFQlBfU0RMCisgIG5vaW5zdF9QUk9HUkFNUyArPSB2d2VicF9zZGwKK2VuZGlmCisKK2dldF9kaXN0b19TT1VSQ0VTICA9IGdldF9kaXN0by5jCitnZXRfZGlzdG9fQ1BQRkxBR1MgPSAkKEFNX0NQUEZMQUdTKQorZ2V0X2Rpc3RvX0xEQUREID0KK2dldF9kaXN0b19MREFERCArPSAuLi9pbWFnZWlvL2xpYmltYWdlaW9fdXRpbC5sYQorZ2V0X2Rpc3RvX0xEQUREICs9IC4uL2ltYWdlaW8vbGliaW1hZ2VkZWMubGEKK2dldF9kaXN0b19MREFERCArPSAuLi9zcmMvbGlid2VicC5sYQorZ2V0X2Rpc3RvX0xEQUREICs9ICQoUE5HX0xJQlMpICQoSlBFR19MSUJTKSAkKFRJRkZfTElCUykKKword2VicF9xdWFsaXR5X1NPVVJDRVMgID0gd2VicF9xdWFsaXR5LmMKK3dlYnBfcXVhbGl0eV9DUFBGTEFHUyA9ICQoQU1fQ1BQRkxBR1MpCit3ZWJwX3F1YWxpdHlfTERBREQgPQord2VicF9xdWFsaXR5X0xEQUREICs9IC4uL2ltYWdlaW8vbGliaW1hZ2Vpb191dGlsLmxhCit3ZWJwX3F1YWxpdHlfTERBREQgKz0gbGlid2VicGV4dHJhcy5sYQord2VicF9xdWFsaXR5X0xEQUREICs9IC4uL3NyYy9saWJ3ZWJwLmxhCisKK3Z3ZWJwX3NkbF9TT1VSQ0VTICA9IHZ3ZWJwX3NkbC5jIHdlYnBfdG9fc2RsLmMgd2VicF90b19zZGwuaAordndlYnBfc2RsX0NQUEZMQUdTID0gJChBTV9DUFBGTEFHUykgJChTRExfSU5DTFVERVMpCit2d2VicF9zZGxfTERBREQgPQordndlYnBfc2RsX0xEQUREICs9IC4uL2ltYWdlaW8vbGliaW1hZ2Vpb191dGlsLmxhCit2d2VicF9zZGxfTERBREQgKz0gLi4vc3JjL2xpYndlYnAubGEKK3Z3ZWJwX3NkbF9MREFERCArPSAkKFNETF9MSUJTKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXh0cmFzL2V4dHJhcy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXh0cmFzL2V4dHJhcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZWI1OTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leHRyYXMvZXh0cmFzLmMKQEAgLTAsMCArMSwxNDYgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgQWRkaXRpb25hbCBXZWJQIHV0aWxpdGllcy4KKy8vCisKKyNpbmNsdWRlICJleHRyYXMvZXh0cmFzLmgiCisjaW5jbHVkZSAid2VicC9mb3JtYXRfY29uc3RhbnRzLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBYVFJBX01BSl9WRVJTSU9OIDEKKyNkZWZpbmUgWFRSQV9NSU5fVkVSU0lPTiAwCisjZGVmaW5lIFhUUkFfUkVWX1ZFUlNJT04gMAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgV2ViUEdldEV4dHJhc1ZlcnNpb24odm9pZCkgeworICByZXR1cm4gKFhUUkFfTUFKX1ZFUlNJT04gPDwgMTYpIHwgKFhUUkFfTUlOX1ZFUlNJT04gPDwgOCkgfCBYVFJBX1JFVl9WRVJTSU9OOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgV2ViUEltcG9ydEdyYXkoY29uc3QgdWludDhfdCogZ3JheV9kYXRhLCBXZWJQUGljdHVyZSogcGljKSB7CisgIGludCB5LCB3aWR0aCwgdXZfd2lkdGg7CisgIGlmIChwaWMgPT0gTlVMTCB8fCBncmF5X2RhdGEgPT0gTlVMTCkgcmV0dXJuIDA7CisgIHBpYy0+Y29sb3JzcGFjZSA9IFdFQlBfWVVWNDIwOworICBpZiAoIVdlYlBQaWN0dXJlQWxsb2MocGljKSkgcmV0dXJuIDA7CisgIHdpZHRoID0gcGljLT53aWR0aDsKKyAgdXZfd2lkdGggPSAod2lkdGggKyAxKSA+PiAxOworICBmb3IgKHkgPSAwOyB5IDwgcGljLT5oZWlnaHQ7ICsreSkgeworICAgIG1lbWNweShwaWMtPnkgKyB5ICogcGljLT55X3N0cmlkZSwgZ3JheV9kYXRhLCB3aWR0aCk7CisgICAgZ3JheV9kYXRhICs9IHdpZHRoOyAgICAvLyA8LSB3ZSBjb3VsZCB1c2Ugc29tZSAnZGF0YV9zdHJpZGUnIGhlcmUgaWYgbmVlZGVkCisgICAgaWYgKCh5ICYgMSkgPT0gMCkgeworICAgICAgbWVtc2V0KHBpYy0+dSArICh5ID4+IDEpICogcGljLT51dl9zdHJpZGUsIDEyOCwgdXZfd2lkdGgpOworICAgICAgbWVtc2V0KHBpYy0+diArICh5ID4+IDEpICogcGljLT51dl9zdHJpZGUsIDEyOCwgdXZfd2lkdGgpOworICAgIH0KKyAgfQorICByZXR1cm4gMTsKK30KKworaW50IFdlYlBJbXBvcnRSR0I1NjUoY29uc3QgdWludDhfdCogcmdiNTY1LCBXZWJQUGljdHVyZSogcGljKSB7CisgIGludCB4LCB5OworICB1aW50MzJfdCogZHN0OworICBpZiAocGljID09IE5VTEwgfHwgcmdiNTY1ID09IE5VTEwpIHJldHVybiAwOworICBwaWMtPmNvbG9yc3BhY2UgPSBXRUJQX1lVVjQyMDsKKyAgcGljLT51c2VfYXJnYiA9IDE7CisgIGlmICghV2ViUFBpY3R1cmVBbGxvYyhwaWMpKSByZXR1cm4gMDsKKyAgZHN0ID0gcGljLT5hcmdiOworICBmb3IgKHkgPSAwOyB5IDwgcGljLT5oZWlnaHQ7ICsreSkgeworICAgIGNvbnN0IGludCB3aWR0aCA9IHBpYy0+d2lkdGg7CisgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKKyNpZmRlZiBXRUJQX1NXQVBfMTZCSVRfQ1NQCisgICAgICBjb25zdCB1aW50MzJfdCByZyA9IHJnYjU2NVsyICogeCArIDFdOworICAgICAgY29uc3QgdWludDMyX3QgZ2IgPSByZ2I1NjVbMiAqIHggKyAwXTsKKyNlbHNlCisgICAgICBjb25zdCB1aW50MzJfdCByZyA9IHJnYjU2NVsyICogeCArIDBdOworICAgICAgY29uc3QgdWludDMyX3QgZ2IgPSByZ2I1NjVbMiAqIHggKyAxXTsKKyNlbmRpZgorICAgICAgdWludDMyX3QgciA9IHJnICYgMHhmODsKKyAgICAgIHVpbnQzMl90IGcgPSAoKHJnIDw8IDUpIHwgKGdiID4+IDMpKSAmIDB4ZmM7CisgICAgICB1aW50MzJfdCBiID0gKGdiIDw8IDUpOworICAgICAgLy8gZGl0aGVyaW5nCisgICAgICByID0gciB8IChyID4+IDUpOworICAgICAgZyA9IGcgfCAoZyA+PiA2KTsKKyAgICAgIGIgPSBiIHwgKGIgPj4gNSk7CisgICAgICBkc3RbeF0gPSAoMHhmZnUgPDwgMjQpIHwgKHIgPDwgMTYpIHwgKGcgPDwgOCkgfCBiOworICAgIH0KKyAgICByZ2I1NjUgKz0gMiAqIHdpZHRoOworICAgIGRzdCArPSBwaWMtPmFyZ2Jfc3RyaWRlOworICB9CisgIHJldHVybiAxOworfQorCitpbnQgV2ViUEltcG9ydFJHQjQ0NDQoY29uc3QgdWludDhfdCogcmdiNDQ0NCwgV2ViUFBpY3R1cmUqIHBpYykgeworICBpbnQgeCwgeTsKKyAgdWludDMyX3QqIGRzdDsKKyAgaWYgKHBpYyA9PSBOVUxMIHx8IHJnYjQ0NDQgPT0gTlVMTCkgcmV0dXJuIDA7CisgIHBpYy0+Y29sb3JzcGFjZSA9IFdFQlBfWVVWNDIwOworICBwaWMtPnVzZV9hcmdiID0gMTsKKyAgaWYgKCFXZWJQUGljdHVyZUFsbG9jKHBpYykpIHJldHVybiAwOworICBkc3QgPSBwaWMtPmFyZ2I7CisgIGZvciAoeSA9IDA7IHkgPCBwaWMtPmhlaWdodDsgKyt5KSB7CisgICAgY29uc3QgaW50IHdpZHRoID0gcGljLT53aWR0aDsKKyAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7ICsreCkgeworI2lmZGVmIFdFQlBfU1dBUF8xNkJJVF9DU1AKKyAgICAgIGNvbnN0IHVpbnQzMl90IHJnID0gcmdiNDQ0NFsyICogeCArIDFdOworICAgICAgY29uc3QgdWludDMyX3QgYmEgPSByZ2I0NDQ0WzIgKiB4ICsgMF07CisjZWxzZQorICAgICAgY29uc3QgdWludDMyX3QgcmcgPSByZ2I0NDQ0WzIgKiB4ICsgMF07CisgICAgICBjb25zdCB1aW50MzJfdCBiYSA9IHJnYjQ0NDRbMiAqIHggKyAxXTsKKyNlbmRpZgorICAgICAgdWludDMyX3QgciA9IHJnICYgMHhmMDsKKyAgICAgIHVpbnQzMl90IGcgPSAocmcgPDwgNCk7CisgICAgICB1aW50MzJfdCBiID0gKGJhICYgMHhmMCk7CisgICAgICB1aW50MzJfdCBhID0gKGJhIDw8IDQpOworICAgICAgLy8gZGl0aGVyaW5nCisgICAgICByID0gciB8IChyID4+IDQpOworICAgICAgZyA9IGcgfCAoZyA+PiA0KTsKKyAgICAgIGIgPSBiIHwgKGIgPj4gNCk7CisgICAgICBhID0gYSB8IChhID4+IDQpOworICAgICAgZHN0W3hdID0gKGEgPDwgMjQpIHwgKHIgPDwgMTYpIHwgKGcgPDwgOCkgfCBiOworICAgIH0KKyAgICByZ2I0NDQ0ICs9IDIgKiB3aWR0aDsKKyAgICBkc3QgKz0gcGljLT5hcmdiX3N0cmlkZTsKKyAgfQorICByZXR1cm4gMTsKK30KKworaW50IFdlYlBJbXBvcnRDb2xvck1hcHBlZEFSR0IoY29uc3QgdWludDhfdCogaW5kZXhlZCwgaW50IGluZGV4ZWRfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgcGFsZXR0ZVtdLCBpbnQgcGFsZXR0ZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUFBpY3R1cmUqIHBpYykgeworICBpbnQgeCwgeTsKKyAgdWludDMyX3QqIGRzdDsKKyAgLy8gMjU2IGFzIHRoZSBpbnB1dCBidWZmZXIgaXMgdWludDhfdC4KKyAgYXNzZXJ0KE1BWF9QQUxFVFRFX1NJWkUgPD0gMjU2KTsKKyAgaWYgKHBpYyA9PSBOVUxMIHx8IGluZGV4ZWQgPT0gTlVMTCB8fCBpbmRleGVkX3N0cmlkZSA8IHBpYy0+d2lkdGggfHwKKyAgICAgIHBhbGV0dGUgPT0gTlVMTCB8fCBwYWxldHRlX3NpemUgPiBNQVhfUEFMRVRURV9TSVpFIHx8IHBhbGV0dGVfc2l6ZSA8PSAwKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcGljLT51c2VfYXJnYiA9IDE7CisgIGlmICghV2ViUFBpY3R1cmVBbGxvYyhwaWMpKSByZXR1cm4gMDsKKyAgZHN0ID0gcGljLT5hcmdiOworICBmb3IgKHkgPSAwOyB5IDwgcGljLT5oZWlnaHQ7ICsreSkgeworICAgIGZvciAoeCA9IDA7IHggPCBwaWMtPndpZHRoOyArK3gpIHsKKyAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBhcmUgd2l0aGluIHRoZSBwYWxldHRlLgorICAgICAgaWYgKGluZGV4ZWRbeF0gPj0gcGFsZXR0ZV9zaXplKSB7CisgICAgICAgIFdlYlBQaWN0dXJlRnJlZShwaWMpOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGRzdFt4XSA9IHBhbGV0dGVbaW5kZXhlZFt4XV07CisgICAgfQorICAgIGluZGV4ZWQgKz0gaW5kZXhlZF9zdHJpZGU7CisgICAgZHN0ICs9IHBpYy0+YXJnYl9zdHJpZGU7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leHRyYXMvZXh0cmFzLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leHRyYXMvZXh0cmFzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ0NDM3YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4dHJhcy9leHRyYXMuaApAQCAtMCwwICsxLDcwIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworCisjaWZuZGVmIFdFQlBfRVhUUkFTX0VYVFJBU19IXworI2RlZmluZSBXRUJQX0VYVFJBU19FWFRSQVNfSF8KKworI2luY2x1ZGUgIndlYnAvdHlwZXMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaW5jbHVkZSAid2VicC9lbmNvZGUuaCIKKworI2RlZmluZSBXRUJQX0VYVFJBU19BQklfVkVSU0lPTiAweDAwMDEgICAgLy8gTUFKT1IoOGIpICsgTUlOT1IoOGIpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFJldHVybnMgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBleHRyYXMgbGlicmFyeSwgcGFja2VkIGluIGhleGFkZWNpbWFsIHVzaW5nCisvLyA4Yml0cyBmb3IgZWFjaCBvZiBtYWpvci9taW5vci9yZXZpc2lvbi4gRS5nOiB2Mi41LjcgaXMgMHgwMjA1MDcuCitXRUJQX0VYVEVSTiBpbnQgV2ViUEdldEV4dHJhc1ZlcnNpb24odm9pZCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBZC1ob2MgY29sb3JzcGFjZSBpbXBvcnRlcnMuCisKKy8vIEltcG9ydCBsdW1hIHNhbXBsZSAoZ3JheSBzY2FsZSBpbWFnZSkgaW50byAncGljdHVyZScuIFRoZSAncGljdHVyZScKKy8vIHdpZHRoIGFuZCBoZWlnaHQgbXVzdCBiZSBzZXQgcHJpb3IgdG8gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorV0VCUF9FWFRFUk4gaW50IFdlYlBJbXBvcnRHcmF5KGNvbnN0IHVpbnQ4X3QqIGdyYXksIFdlYlBQaWN0dXJlKiBwaWN0dXJlKTsKKworLy8gSW1wb3J0IHJnYiBzYW1wbGUgaW4gUkdCNTY1IHBhY2tlZCBmb3JtYXQgaW50byAncGljdHVyZScuIFRoZSAncGljdHVyZScKKy8vIHdpZHRoIGFuZCBoZWlnaHQgbXVzdCBiZSBzZXQgcHJpb3IgdG8gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorV0VCUF9FWFRFUk4gaW50IFdlYlBJbXBvcnRSR0I1NjUoY29uc3QgdWludDhfdCogcmdiNTY1LCBXZWJQUGljdHVyZSogcGljKTsKKworLy8gSW1wb3J0IHJnYiBzYW1wbGUgaW4gUkdCNDQ0NCBwYWNrZWQgZm9ybWF0IGludG8gJ3BpY3R1cmUnLiBUaGUgJ3BpY3R1cmUnCisvLyB3aWR0aCBhbmQgaGVpZ2h0IG11c3QgYmUgc2V0IHByaW9yIHRvIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KK1dFQlBfRVhURVJOIGludCBXZWJQSW1wb3J0UkdCNDQ0NChjb25zdCB1aW50OF90KiByZ2I0NDQ0LCBXZWJQUGljdHVyZSogcGljKTsKKworLy8gSW1wb3J0IGEgY29sb3IgbWFwcGVkIGltYWdlLiBUaGUgbnVtYmVyIG9mIGNvbG9ycyBpcyBsZXNzIG9yIGVxdWFsIHRvCisvLyBNQVhfUEFMRVRURV9TSVpFLiAncGljJyBtdXN0IGhhdmUgYmVlbiBpbml0aWFsaXplZC4gSXRzIGNvbnRlbnQsIGlmIGFueSwKKy8vIHdpbGwgYmUgZGlzY2FyZGVkLiBSZXR1cm5zICdmYWxzZScgaW4gY2FzZSBvZiBlcnJvciwgb3IgaWYgaW5kZXhlZFtdIGNvbnRhaW5zCisvLyBpbnZhbGlkIGluZGljZXMuCitXRUJQX0VYVEVSTiBpbnQKK1dlYlBJbXBvcnRDb2xvck1hcHBlZEFSR0IoY29uc3QgdWludDhfdCogaW5kZXhlZCwgaW50IGluZGV4ZWRfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBwYWxldHRlW10sIGludCBwYWxldHRlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBQaWN0dXJlKiBwaWMpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBQYXJzZSBhIGJpdHN0cmVhbSwgc2VhcmNoIGZvciBWUDggKGxvc3N5KSBoZWFkZXIgYW5kIHJlcG9ydCBhCisvLyByb3VnaCBlc3RpbWF0aW9uIG9mIHRoZSBxdWFsaXR5IGZhY3RvciB1c2VkIGZvciBjb21wcmVzc2luZyB0aGUgYml0c3RyZWFtLgorLy8gSWYgdGhlIGJpdHN0cmVhbSBpcyBpbiBsb3NzbGVzcyBmb3JtYXQsIHRoZSBzcGVjaWFsIHZhbHVlICcxMDEnIGlzIHJldHVybmVkLgorLy8gT3RoZXJ3aXNlIChsb3NzeSBiaXRzdHJlYW0pLCB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIFswLi4xMDBdLgorLy8gQW55IGVycm9yIChpbnZhbGlkIGJpdHN0cmVhbSwgYW5pbWF0ZWQgV2ViUCwgaW5jb21wbGV0ZSBoZWFkZXIsIGV0Yy4pCisvLyB3aWxsIHJldHVybiBhIHZhbHVlIG9mIC0xLgorV0VCUF9FWFRFUk4gaW50IFZQOEVzdGltYXRlUXVhbGl0eShjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvKiBXRUJQX0VYVFJBU19FWFRSQVNfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4dHJhcy9nZXRfZGlzdG8uYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4dHJhcy9nZXRfZGlzdG8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDA2MTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXh0cmFzL2dldF9kaXN0by5jCkBAIC0wLDAgKzEsMzUxIEBACisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU2ltcGxlIHRvb2wgdG8gbG9hZCB0d28gd2VicC9wbmcvanBnL3RpZmYgZmlsZXMgYW5kIGNvbXB1dGUgUFNOUi9TU0lNLgorLy8gVGhpcyBpcyBtb3N0bHkgYSB3cmFwcGVyIGFyb3VuZCBXZWJQUGljdHVyZURpc3RvcnRpb24oKS4KKy8vCisvKgorIGdjYyAtbyBnZXRfZGlzdG8gZ2V0X2Rpc3RvLmMgLU8zIC1JLi4vIC1MLi4vZXhhbXBsZXMgLUwuLi9pbWFnZWlvIFwKKyAgICAtbGV4YW1wbGVfdXRpbCAtbGltYWdlaW9fdXRpbCAtbGltYWdlZGVjIC1sd2VicCAtTC9vcHQvbG9jYWwvbGliIFwKKyAgICAtbHBuZyAtbHogLWxqcGVnIC1sdGlmZiAtbG0gLWxwdGhyZWFkCisqLworLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAid2VicC9lbmNvZGUuaCIKKyNpbmNsdWRlICJpbWFnZWlvL2ltYWdlX2RlYy5oIgorI2luY2x1ZGUgImltYWdlaW8vaW1hZ2Vpb191dGlsLmgiCisKK3N0YXRpYyBzaXplX3QgUmVhZFBpY3R1cmUoY29uc3QgY2hhciogY29uc3QgZmlsZW5hbWUsIFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBrZWVwX2FscGhhKSB7CisgIGNvbnN0IHVpbnQ4X3QqIGRhdGEgPSBOVUxMOworICBzaXplX3QgZGF0YV9zaXplID0gMDsKKyAgV2ViUEltYWdlUmVhZGVyIHJlYWRlciA9IE5VTEw7CisgIGludCBvayA9IEltZ0lvVXRpbFJlYWRGaWxlKGZpbGVuYW1lLCAmZGF0YSwgJmRhdGFfc2l6ZSk7CisgIGlmICghb2spIGdvdG8gRW5kOworCisgIHBpYy0+dXNlX2FyZ2IgPSAxOyAgLy8gZm9yY2UgQVJHQgorCisjaWZkZWYgSEFWRV9XSU5DT0RFQ19ICisgIC8vIFRyeSB0byBkZWNvZGUgdGhlIGZpbGUgdXNpbmcgV0lDIGZhbGxpbmcgYmFjayB0byB0aGUgb3RoZXIgcmVhZGVycyBmb3IKKyAgLy8gZS5nLiwgV2ViUC4KKyAgb2sgPSBSZWFkUGljdHVyZVdpdGhXSUMoZmlsZW5hbWUsIHBpYywga2VlcF9hbHBoYSwgTlVMTCk7CisgIGlmIChvaykgZ290byBFbmQ7CisjZW5kaWYKKyAgcmVhZGVyID0gV2ViUEd1ZXNzSW1hZ2VSZWFkZXIoZGF0YSwgZGF0YV9zaXplKTsKKyAgb2sgPSByZWFkZXIoZGF0YSwgZGF0YV9zaXplLCBwaWMsIGtlZXBfYWxwaGEsIE5VTEwpOworCisgRW5kOgorICBpZiAoIW9rKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciEgQ291bGQgbm90IHByb2Nlc3MgZmlsZSAlc1xuIiwgZmlsZW5hbWUpOworICB9CisgIGZyZWUoKHZvaWQqKWRhdGEpOworICByZXR1cm4gb2sgPyBkYXRhX3NpemUgOiAwOworfQorCitzdGF0aWMgdm9pZCBSZXNjYWxlUGxhbmUodWludDhfdCogcGxhbmUsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeF9zdHJpZGUsIGludCB5X3N0cmlkZSwgaW50IG1heCkgeworICBjb25zdCB1aW50MzJfdCBmYWN0b3IgPSAobWF4ID4gMCkgPyAoMjU1dSA8PCAxNikgLyBtYXggOiAwOworICBpbnQgeCwgeTsKKyAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CisgICAgdWludDhfdCogY29uc3QgcHRyID0gcGxhbmUgKyB5ICogeV9zdHJpZGU7CisgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoICogeF9zdHJpZGU7IHggKz0geF9zdHJpZGUpIHsKKyAgICAgIGNvbnN0IHVpbnQzMl90IGRpZmYgPSAocHRyW3hdICogZmFjdG9yICsgKDEgPDwgMTUpKSA+PiAxNjsKKyAgICAgIHB0clt4XSA9IGRpZmY7CisgICAgfQorICB9Cit9CisKKy8vIFJldHVybiB0aGUgbWF4IGFic29sdXRlIGRpZmZlcmVuY2UuCitzdGF0aWMgaW50IERpZmZTY2FsZUNoYW5uZWwodWludDhfdCogc3JjMSwgaW50IHN0cmlkZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjMiwgaW50IHN0cmlkZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhfc3RyaWRlLCBpbnQgdywgaW50IGgsIGludCBkb19zY2FsaW5nKSB7CisgIGludCB4LCB5OworICBpbnQgbWF4ID0gMDsKKyAgZm9yICh5ID0gMDsgeSA8IGg7ICsreSkgeworICAgIHVpbnQ4X3QqIGNvbnN0IHB0cjEgPSBzcmMxICsgeSAqIHN0cmlkZTE7CisgICAgY29uc3QgdWludDhfdCogY29uc3QgcHRyMiA9IHNyYzIgKyB5ICogc3RyaWRlMjsKKyAgICBmb3IgKHggPSAwOyB4IDwgdyAqIHhfc3RyaWRlOyB4ICs9IHhfc3RyaWRlKSB7CisgICAgICBjb25zdCBpbnQgZGlmZiA9IGFicyhwdHIxW3hdIC0gcHRyMlt4XSk7CisgICAgICBpZiAoZGlmZiA+IG1heCkgbWF4ID0gZGlmZjsKKyAgICAgIHB0cjFbeF0gPSBkaWZmOworICAgIH0KKyAgfQorCisgIGlmIChkb19zY2FsaW5nKSBSZXNjYWxlUGxhbmUoc3JjMSwgdywgaCwgeF9zdHJpZGUsIHN0cmlkZTEsIG1heCk7CisgIHJldHVybiBtYXg7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTU0lNIGNhbGN1bGF0aW9uLiBXZSByZS1pbXBsZW1lbnQgdGhlc2UgZnVuY3Rpb25zIGhlcmUsIG91dCBvZiBkc3AvLCB0byBhdm9pZAorLy8gYnJlYWtpbmcgdGhlIGxpYnJhcnkncyBoaWRkZW4gdmlzaWJpbGl0eS4gVGhpcyBjb2RlIGR1cGxpY2F0aW9uIGF2b2lkcyB0aGUKKy8vIGJpZ2dlciBhbm5veWFuY2Ugb2YgaGF2aW5nIHRvIG9wZW4gdXAgaW50ZXJuYWwgZGV0YWlscyBvZiBsaWJkc3AuLi4KKworI2RlZmluZSBTU0lNX0tFUk5FTCAzICAgLy8gdG90YWwgc2l6ZSBvZiB0aGUga2VybmVsOiAyICogU1NJTV9LRVJORUwgKyAxCisKKy8vIHN0cnVjdCBmb3IgYWNjdW11bGF0aW5nIHN0YXRpc3RpY2FsIG1vbWVudHMKK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QgdzsgICAgICAgICAgICAgIC8vIHN1bSh3X2kpIDogc3VtIG9mIHdlaWdodHMKKyAgdWludDMyX3QgeG0sIHltOyAgICAgICAgIC8vIHN1bSh3X2kgKiB4X2kpLCBzdW0od19pICogeV9pKQorICB1aW50MzJfdCB4eG0sIHh5bSwgeXltOyAgLy8gc3VtKHdfaSAqIHhfaSAqIHhfaSksIGV0Yy4KK30gRGlzdG9TdGF0czsKKworLy8gaGF0LXNoYXBlZCBmaWx0ZXIuIFN1bSBvZiBjb2VmZmljaWVudHMgaXMgZXF1YWwgdG8gMTYuCitzdGF0aWMgY29uc3QgdWludDMyX3Qga1dlaWdodFsyICogU1NJTV9LRVJORUwgKyAxXSA9IHsgMSwgMiwgMywgNCwgMywgMiwgMSB9OworCitzdGF0aWMgV0VCUF9JTkxJTkUgZG91YmxlIFNTSU1DYWxjdWxhdGlvbihjb25zdCBEaXN0b1N0YXRzKiBjb25zdCBzdGF0cykgeworICBjb25zdCB1aW50MzJfdCBOID0gc3RhdHMtPnc7CisgIGNvbnN0IHVpbnQzMl90IHcyID0gIE4gKiBOOworICBjb25zdCB1aW50MzJfdCBDMSA9IDIwICogdzI7CisgIGNvbnN0IHVpbnQzMl90IEMyID0gNjAgKiB3MjsKKyAgY29uc3QgdWludDMyX3QgQzMgPSA4ICogOCAqIHcyOyAgIC8vICdkYXJrJyBsaW1pdCB+PSA2CisgIGNvbnN0IHVpbnQ2NF90IHhteG0gPSAodWludDY0X3Qpc3RhdHMtPnhtICogc3RhdHMtPnhtOworICBjb25zdCB1aW50NjRfdCB5bXltID0gKHVpbnQ2NF90KXN0YXRzLT55bSAqIHN0YXRzLT55bTsKKyAgaWYgKHhteG0gKyB5bXltID49IEMzKSB7CisgICAgY29uc3QgaW50NjRfdCB4bXltID0gKGludDY0X3Qpc3RhdHMtPnhtICogc3RhdHMtPnltOworICAgIGNvbnN0IGludDY0X3Qgc3h5ID0gKGludDY0X3Qpc3RhdHMtPnh5bSAqIE4gLSB4bXltOyAgICAvLyBjYW4gYmUgbmVnYXRpdmUKKyAgICBjb25zdCB1aW50NjRfdCBzeHggPSAodWludDY0X3Qpc3RhdHMtPnh4bSAqIE4gLSB4bXhtOworICAgIGNvbnN0IHVpbnQ2NF90IHN5eSA9ICh1aW50NjRfdClzdGF0cy0+eXltICogTiAtIHlteW07CisgICAgLy8gd2UgZGVzY2FsZSBieSA4IHRvIHByZXZlbnQgb3ZlcmZsb3cgZHVyaW5nIHRoZSBmbnVtL2ZkZW4gbXVsdGlwbHkuCisgICAgY29uc3QgdWludDY0X3QgbnVtX1MgPSAoMiAqICh1aW50NjRfdCkoc3h5IDwgMCA/IDAgOiBzeHkpICsgQzIpID4+IDg7CisgICAgY29uc3QgdWludDY0X3QgZGVuX1MgPSAoc3h4ICsgc3l5ICsgQzIpID4+IDg7CisgICAgY29uc3QgdWludDY0X3QgZm51bSA9ICgyICogeG15bSArIEMxKSAqIG51bV9TOworICAgIGNvbnN0IHVpbnQ2NF90IGZkZW4gPSAoeG14bSArIHlteW0gKyBDMSkgKiBkZW5fUzsKKyAgICBjb25zdCBkb3VibGUgciA9IChkb3VibGUpZm51bSAvIGZkZW47CisgICAgYXNzZXJ0KHIgPj0gMC4gJiYgciA8PSAxLjApOworICAgIHJldHVybiByOworICB9CisgIHJldHVybiAxLjsgICAvLyBhcmVhIGlzIHRvbyBkYXJrIHRvIGNvbnRyaWJ1dGUgbWVhbmluZ2Z1bGx5Cit9CisKK3N0YXRpYyBkb3VibGUgU1NJTUdldENsaXBwZWQoY29uc3QgdWludDhfdCogc3JjMSwgaW50IHN0cmlkZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyYzIsIGludCBzdHJpZGUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeG8sIGludCB5bywgaW50IFcsIGludCBIKSB7CisgIERpc3RvU3RhdHMgc3RhdHMgPSB7IDAsIDAsIDAsIDAsIDAsIDAgfTsKKyAgY29uc3QgaW50IHltaW4gPSAoeW8gLSBTU0lNX0tFUk5FTCA8IDApID8gMCA6IHlvIC0gU1NJTV9LRVJORUw7CisgIGNvbnN0IGludCB5bWF4ID0gKHlvICsgU1NJTV9LRVJORUwgPiBIIC0gMSkgPyBIIC0gMSA6IHlvICsgU1NJTV9LRVJORUw7CisgIGNvbnN0IGludCB4bWluID0gKHhvIC0gU1NJTV9LRVJORUwgPCAwKSA/IDAgOiB4byAtIFNTSU1fS0VSTkVMOworICBjb25zdCBpbnQgeG1heCA9ICh4byArIFNTSU1fS0VSTkVMID4gVyAtIDEpID8gVyAtIDEgOiB4byArIFNTSU1fS0VSTkVMOworICBpbnQgeCwgeTsKKyAgc3JjMSArPSB5bWluICogc3RyaWRlMTsKKyAgc3JjMiArPSB5bWluICogc3RyaWRlMjsKKyAgZm9yICh5ID0geW1pbjsgeSA8PSB5bWF4OyArK3ksIHNyYzEgKz0gc3RyaWRlMSwgc3JjMiArPSBzdHJpZGUyKSB7CisgICAgZm9yICh4ID0geG1pbjsgeCA8PSB4bWF4OyArK3gpIHsKKyAgICAgIGNvbnN0IHVpbnQzMl90IHcgPSBrV2VpZ2h0W1NTSU1fS0VSTkVMICsgeCAtIHhvXQorICAgICAgICAgICAgICAgICAgICAgICAqIGtXZWlnaHRbU1NJTV9LRVJORUwgKyB5IC0geW9dOworICAgICAgY29uc3QgdWludDMyX3QgczEgPSBzcmMxW3hdOworICAgICAgY29uc3QgdWludDMyX3QgczIgPSBzcmMyW3hdOworICAgICAgc3RhdHMudyAgICs9IHc7CisgICAgICBzdGF0cy54bSAgKz0gdyAqIHMxOworICAgICAgc3RhdHMueW0gICs9IHcgKiBzMjsKKyAgICAgIHN0YXRzLnh4bSArPSB3ICogczEgKiBzMTsKKyAgICAgIHN0YXRzLnh5bSArPSB3ICogczEgKiBzMjsKKyAgICAgIHN0YXRzLnl5bSArPSB3ICogczIgKiBzMjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFNTSU1DYWxjdWxhdGlvbigmc3RhdHMpOworfQorCisvLyBDb21wdXRlIFNTSU0tc2NvcmUgbWFwLiBSZXR1cm4gLTEgaW4gY2FzZSBvZiBlcnJvciwgbWF4IGRpZmYgb3RoZXJ3aXNlLgorc3RhdGljIGludCBTU0lNU2NhbGVDaGFubmVsKHVpbnQ4X3QqIHNyYzEsIGludCBzdHJpZGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyYzIsIGludCBzdHJpZGUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4X3N0cmlkZSwgaW50IHcsIGludCBoLCBpbnQgZG9fc2NhbGluZykgeworICBpbnQgeCwgeTsKKyAgaW50IG1heCA9IDA7CisgIHVpbnQ4X3QqIGNvbnN0IHBsYW5lMSA9ICh1aW50OF90KiltYWxsb2MoMiAqIHcgKiBoICogc2l6ZW9mKCpwbGFuZTEpKTsKKyAgdWludDhfdCogY29uc3QgcGxhbmUyID0gcGxhbmUxICsgdyAqIGg7CisgIGlmIChwbGFuZTEgPT0gTlVMTCkgcmV0dXJuIC0xOworCisgIC8vIGV4dHJhY3QgcGxhbmUKKyAgZm9yICh5ID0gMDsgeSA8IGg7ICsreSkgeworICAgIGZvciAoeCA9IDA7IHggPCB3OyArK3gpIHsKKyAgICAgIHBsYW5lMVt4ICsgeSAqIHddID0gc3JjMVt4ICogeF9zdHJpZGUgKyB5ICogc3RyaWRlMV07CisgICAgICBwbGFuZTJbeCArIHkgKiB3XSA9IHNyYzJbeCAqIHhfc3RyaWRlICsgeSAqIHN0cmlkZTJdOworICAgIH0KKyAgfQorICBmb3IgKHkgPSAwOyB5IDwgaDsgKyt5KSB7CisgICAgZm9yICh4ID0gMDsgeCA8IHc7ICsreCkgeworICAgICAgY29uc3QgZG91YmxlIHNzaW0gPSBTU0lNR2V0Q2xpcHBlZChwbGFuZTEsIHcsIHBsYW5lMiwgdywgeCwgeSwgdywgaCk7CisgICAgICBpbnQgZGlmZiA9IChpbnQpKDI1NSAqICgxLiAtIHNzaW0pKTsKKyAgICAgIGlmIChkaWZmIDwgMCkgeworICAgICAgICBkaWZmID0gMDsKKyAgICAgIH0gZWxzZSBpZiAoZGlmZiA+IG1heCkgeworICAgICAgICBtYXggPSBkaWZmOworICAgICAgfQorICAgICAgc3JjMVt4ICogeF9zdHJpZGUgKyB5ICogc3RyaWRlMV0gPSAoZGlmZiA+IDI1NSkgPyAyNTV1IDogKHVpbnQ4X3QpZGlmZjsKKyAgICB9CisgIH0KKyAgZnJlZShwbGFuZTEpOworCisgIGlmIChkb19zY2FsaW5nKSBSZXNjYWxlUGxhbmUoc3JjMSwgdywgaCwgeF9zdHJpZGUsIHN0cmlkZTEsIG1heCk7CisgIHJldHVybiBtYXg7Cit9CisKKy8vIENvbnZlcnQgYW4gYXJnYiBwaWN0dXJlIHRvIGx1bWluYW5jZS4KK3N0YXRpYyB2b2lkIENvbnZlcnRUb0dyYXkoV2ViUFBpY3R1cmUqIGNvbnN0IHBpYykgeworICBpbnQgeCwgeTsKKyAgYXNzZXJ0KHBpYyAhPSBOVUxMKTsKKyAgYXNzZXJ0KHBpYy0+dXNlX2FyZ2IpOworICBmb3IgKHkgPSAwOyB5IDwgcGljLT5oZWlnaHQ7ICsreSkgeworICAgIHVpbnQzMl90KiBjb25zdCByb3cgPSAmcGljLT5hcmdiW3kgKiBwaWMtPmFyZ2Jfc3RyaWRlXTsKKyAgICBmb3IgKHggPSAwOyB4IDwgcGljLT53aWR0aDsgKyt4KSB7CisgICAgICBjb25zdCB1aW50MzJfdCBhcmdiID0gcm93W3hdOworICAgICAgY29uc3QgdWludDMyX3QgciA9IChhcmdiID4+IDE2KSAmIDB4ZmY7CisgICAgICBjb25zdCB1aW50MzJfdCBnID0gKGFyZ2IgPj4gIDgpICYgMHhmZjsKKyAgICAgIGNvbnN0IHVpbnQzMl90IGIgPSAoYXJnYiA+PiAgMCkgJiAweGZmOworICAgICAgLy8gV2UgdXNlIEJULjcwOSBmb3IgY29udmVydGluZyB0byBsdW1pbmFuY2UuCisgICAgICBjb25zdCB1aW50MzJfdCBZID0gKHVpbnQzMl90KSgwLjIxMjYgKiByICsgMC43MTUyICogZyArIDAuMDcyMiAqIGIgKyAuNSk7CisgICAgICByb3dbeF0gPSAoYXJnYiAmIDB4ZmYwMDAwMDB1KSB8IChZICogMHgwMTAxMDF1KTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgSGVscCh2b2lkKSB7CisgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICJVc2FnZTogZ2V0X2Rpc3RvIFstc3NpbV1bLXBzbnJdWy1hbHBoYV0gY29tcHJlc3NlZC53ZWJwIG9yaWcud2VicFxuIgorICAgICAgICAgICIgIC1zc2ltIC4uLi4uIHByaW50IFNTSU0gZGlzdG9ydGlvblxuIgorICAgICAgICAgICIgIC1wc25yIC4uLi4uIHByaW50IFBTTlIgZGlzdG9ydGlvbiAoZGVmYXVsdClcbiIKKyAgICAgICAgICAiICAtYWxwaGEgLi4uLiBwcmVzZXJ2ZSBhbHBoYSBwbGFuZVxuIgorICAgICAgICAgICIgIC1oIC4uLi4uLi4uIHRoaXMgbWVzc2FnZVxuIgorICAgICAgICAgICIgIC1vIDxmaWxlPiAuIHNhdmUgdGhlIGRpZmYgbWFwIGFzIGEgV2ViUCBsb3NzbGVzcyBmaWxlXG4iCisgICAgICAgICAgIiAgLXNjYWxlIC4uLi4gc2NhbGUgdGhlIGRpZmZlcmVuY2UgbWFwIHRvIGZpdCBbMC4uMjU1XSByYW5nZVxuIgorICAgICAgICAgICIgIC1ncmF5IC4uLi4uIHVzZSBncmF5c2NhbGUgZm9yIGRpZmZlcmVuY2UgbWFwICgtc2NhbGUpXG4iCisgICAgICAgICAgIiBBbHNvIGhhbmRsZXMgUE5HLCBKUEcgYW5kIFRJRkYgZmlsZXMsIGluIGFkZGl0aW9uIHRvIFdlYlAuXG4iKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSkgeworICBXZWJQUGljdHVyZSBwaWMxLCBwaWMyOworICBzaXplX3Qgc2l6ZTEgPSAwLCBzaXplMiA9IDA7CisgIGludCByZXQgPSAxOworICBmbG9hdCBkaXN0b1s1XTsKKyAgaW50IHR5cGUgPSAwOworICBpbnQgYzsKKyAgaW50IGhlbHAgPSAwOworICBpbnQga2VlcF9hbHBoYSA9IDA7CisgIGludCBzY2FsZSA9IDA7CisgIGludCB1c2VfZ3JheSA9IDA7CisgIGNvbnN0IGNoYXIqIG5hbWUxID0gTlVMTDsKKyAgY29uc3QgY2hhciogbmFtZTIgPSBOVUxMOworICBjb25zdCBjaGFyKiBvdXRwdXQgPSBOVUxMOworCisgIGlmICghV2ViUFBpY3R1cmVJbml0KCZwaWMxKSB8fCAhV2ViUFBpY3R1cmVJbml0KCZwaWMyKSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiQ2FuJ3QgaW5pdCBwaWN0dXJlc1xuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBmb3IgKGMgPSAxOyBjIDwgYXJnYzsgKytjKSB7CisgICAgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1zc2ltIikpIHsKKyAgICAgIHR5cGUgPSAxOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXBzbnIiKSkgeworICAgICAgdHlwZSA9IDA7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItYWxwaGEiKSkgeworICAgICAga2VlcF9hbHBoYSA9IDE7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItc2NhbGUiKSkgeworICAgICAgc2NhbGUgPSAxOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWdyYXkiKSkgeworICAgICAgdXNlX2dyYXkgPSAxOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWgiKSkgeworICAgICAgaGVscCA9IDE7CisgICAgICByZXQgPSAwOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLW8iKSkgeworICAgICAgaWYgKCsrYyA9PSBhcmdjKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAibWlzc2luZyBmaWxlIG5hbWUgYWZ0ZXIgJXMgb3B0aW9uLlxuIiwgYXJndltjIC0gMV0pOworICAgICAgICBnb3RvIEVuZDsKKyAgICAgIH0KKyAgICAgIG91dHB1dCA9IGFyZ3ZbY107CisgICAgfSBlbHNlIGlmIChuYW1lMSA9PSBOVUxMKSB7CisgICAgICBuYW1lMSA9IGFyZ3ZbY107CisgICAgfSBlbHNlIHsKKyAgICAgIG5hbWUyID0gYXJndltjXTsKKyAgICB9CisgIH0KKyAgaWYgKGhlbHAgfHwgbmFtZTEgPT0gTlVMTCB8fCBuYW1lMiA9PSBOVUxMKSB7CisgICAgaWYgKCFoZWxwKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiBtaXNzaW5nIGFyZ3VtZW50cy5cbiIpOworICAgIH0KKyAgICBIZWxwKCk7CisgICAgZ290byBFbmQ7CisgIH0KKyAgc2l6ZTEgPSBSZWFkUGljdHVyZShuYW1lMSwgJnBpYzEsIDEpOworICBzaXplMiA9IFJlYWRQaWN0dXJlKG5hbWUyLCAmcGljMiwgMSk7CisgIGlmIChzaXplMSA9PSAwIHx8IHNpemUyID09IDApIGdvdG8gRW5kOworCisgIGlmICgha2VlcF9hbHBoYSkgeworICAgIFdlYlBCbGVuZEFscGhhKCZwaWMxLCAweDAwMDAwMDAwKTsKKyAgICBXZWJQQmxlbmRBbHBoYSgmcGljMiwgMHgwMDAwMDAwMCk7CisgIH0KKworICBpZiAoIVdlYlBQaWN0dXJlRGlzdG9ydGlvbigmcGljMSwgJnBpYzIsIHR5cGUsIGRpc3RvKSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3Igd2hpbGUgY29tcHV0aW5nIHRoZSBkaXN0b3J0aW9uLlxuIik7CisgICAgZ290byBFbmQ7CisgIH0KKyAgcHJpbnRmKCIldSAlLjJmICAgICUuMmYgJS4yZiAlLjJmICUuMmYgWyAlLjJmIGJwcCBdXG4iLAorICAgICAgICAgKHVuc2lnbmVkIGludClzaXplMSwKKyAgICAgICAgIGRpc3RvWzRdLCBkaXN0b1swXSwgZGlzdG9bMV0sIGRpc3RvWzJdLCBkaXN0b1szXSwKKyAgICAgICAgIDguZiAqIHNpemUxIC8gcGljMS53aWR0aCAvIHBpYzEuaGVpZ2h0KTsKKworICBpZiAob3V0cHV0ICE9IE5VTEwpIHsKKyAgICB1aW50OF90KiBkYXRhID0gTlVMTDsKKyAgICBzaXplX3QgZGF0YV9zaXplID0gMDsKKyAgICBpZiAocGljMS51c2VfYXJnYiAhPSBwaWMyLnVzZV9hcmdiKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIlBpY3R1cmVzIGFyZSBub3QgaW4gdGhlIHNhbWUgYXJnYiBmb3JtYXQuICIKKyAgICAgICAgICAgICAgICAgICAgICAiQ2FuJ3Qgc2F2ZSB0aGUgZGlmZmVyZW5jZSBtYXAuXG4iKTsKKyAgICAgIGdvdG8gRW5kOworICAgIH0KKyAgICBpZiAocGljMS51c2VfYXJnYikgeworICAgICAgaW50IG47CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIm1heCBkaWZmZXJlbmNlcyBwZXIgY2hhbm5lbDogIik7CisgICAgICBmb3IgKG4gPSAwOyBuIDwgMzsgKytuKSB7ICAgIC8vIHNraXAgdGhlIGFscGhhIGNoYW5uZWwKKyAgICAgICAgY29uc3QgaW50IHJhbmdlID0gKHR5cGUgPT0gMSkgPworICAgICAgICAgIFNTSU1TY2FsZUNoYW5uZWwoKHVpbnQ4X3QqKXBpYzEuYXJnYiArIG4sIHBpYzEuYXJnYl9zdHJpZGUgKiA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QqKXBpYzIuYXJnYiArIG4sIHBpYzIuYXJnYl9zdHJpZGUgKiA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwgcGljMS53aWR0aCwgcGljMS5oZWlnaHQsIHNjYWxlKSA6CisgICAgICAgICAgRGlmZlNjYWxlQ2hhbm5lbCgodWludDhfdCopcGljMS5hcmdiICsgbiwgcGljMS5hcmdiX3N0cmlkZSAqIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCopcGljMi5hcmdiICsgbiwgcGljMi5hcmdiX3N0cmlkZSAqIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICA0LCBwaWMxLndpZHRoLCBwaWMxLmhlaWdodCwgc2NhbGUpOworICAgICAgICBpZiAocmFuZ2UgPCAwKSBmcHJpbnRmKHN0ZGVyciwgIlxuRXJyb3IgY29tcHV0aW5nIGRpZmYgbWFwXG4iKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJbJWRdIiwgcmFuZ2UpOworICAgICAgfQorICAgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOworICAgICAgaWYgKHVzZV9ncmF5KSBDb252ZXJ0VG9HcmF5KCZwaWMxKTsKKyAgICB9IGVsc2UgeworICAgICAgZnByaW50ZihzdGRlcnIsICJDYW4gb25seSBjb21wdXRlIHRoZSBkaWZmZXJlbmNlIG1hcCBpbiBBUkdCIGZvcm1hdC5cbiIpOworICAgICAgZ290byBFbmQ7CisgICAgfQorI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX0NTUCkKKyAgICBkYXRhX3NpemUgPSBXZWJQRW5jb2RlTG9zc2xlc3NCR1JBKChjb25zdCB1aW50OF90KilwaWMxLmFyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWMxLndpZHRoLCBwaWMxLmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpYzEuYXJnYl9zdHJpZGUgKiA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEpOworICAgIGlmIChkYXRhX3NpemUgPT0gMCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBkdXJpbmcgbG9zc2xlc3MgZW5jb2RpbmcuXG4iKTsKKyAgICAgIGdvdG8gRW5kOworICAgIH0KKyAgICByZXQgPSBJbWdJb1V0aWxXcml0ZUZpbGUob3V0cHV0LCBkYXRhLCBkYXRhX3NpemUpID8gMCA6IDE7CisgICAgV2ViUEZyZWUoZGF0YSk7CisgICAgaWYgKHJldCkgZ290byBFbmQ7CisjZWxzZQorICAgICh2b2lkKWRhdGE7CisgICAgKHZvaWQpZGF0YV9zaXplOworICAgIGZwcmludGYoc3RkZXJyLCAiQ2Fubm90IHNhdmUgdGhlIGRpZmZlcmVuY2UgbWFwLiBQbGVhc2UgcmVjb21waWxlICIKKyAgICAgICAgICAgICAgICAgICAgIndpdGhvdXQgdGhlIFdFQlBfUkVEVUNFX0NTUCBmbGFnLlxuIik7CisjZW5kaWYgIC8vIFdFQlBfUkVEVUNFX0NTUAorICB9CisgIHJldCA9IDA7CisKKyBFbmQ6CisgIFdlYlBQaWN0dXJlRnJlZSgmcGljMSk7CisgIFdlYlBQaWN0dXJlRnJlZSgmcGljMik7CisgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leHRyYXMvcXVhbGl0eV9lc3RpbWF0ZS5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXh0cmFzL3F1YWxpdHlfZXN0aW1hdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2U5OGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXh0cmFzL3F1YWxpdHlfZXN0aW1hdGUuYwpAQCAtMCwwICsxLDEyOSBAQAorLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICBWUDhFc3RpbWF0ZVF1YWxpdHkoKTogcm91Z2ggZW5jb2RpbmcgcXVhbGl0eSBlc3RpbWF0ZQorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpbmNsdWRlICJleHRyYXMvZXh0cmFzLmgiCisjaW5jbHVkZSAid2VicC9kZWNvZGUuaCIKKworI2luY2x1ZGUgPG1hdGguaD4KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBJTlZBTElEX0JJVF9QT1MgKDF1bGwgPDwgNjMpCisKKy8vIEluIG1vc3QgY2FzZXMsIHdlIGRvbid0IG5lZWQgdG8gdXNlIGEgZnVsbCBhcml0aG1ldGljIGRlY29kZXIsIHNpbmNlCisvLyBhbGwgdGhlIGhlYWRlcidzIGJpdHMgYXJlIHdyaXR0ZW4gdXNpbmcgYSB1bmlmb3JtIHByb2JhYmlsaXR5IG9mIDEyOC4KKy8vIFdlIGNhbiBqdXN0IHBhcnNlIHRoZSBoZWFkZXIgYXMgaWYgaXQgd2FzIGJpdHMgKHdvcmtzIGluIDk5Ljk5OSUgY2FzZXMpLgorc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IEdldEJpdChjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBzaXplX3QgbmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IG1heF9zaXplLCB1aW50NjRfdCogY29uc3QgYml0X3BvcykgeworICB1aW50MzJfdCB2YWwgPSAwOworICBpZiAoKmJpdF9wb3MgKyBuYiA8PSA4ICogbWF4X3NpemUpIHsKKyAgICB3aGlsZSAobmItLSA+IDApIHsKKyAgICAgIGNvbnN0IHVpbnQ2NF90IHAgPSAoKmJpdF9wb3MpKys7CisgICAgICBjb25zdCBpbnQgYml0ID0gISEoZGF0YVtwID4+IDNdICYgKDEyOCA+PiAoKHAgJiA3KSkpKTsKKyAgICAgIHZhbCA9ICh2YWwgPDwgMSkgfCBiaXQ7CisgICAgfQorICB9IGVsc2UgeworICAgICpiaXRfcG9zID0gSU5WQUxJRF9CSVRfUE9TOworICB9CisgIHJldHVybiB2YWw7Cit9CisKKyNkZWZpbmUgR0VUX0JJVChuKSBHZXRCaXQoZGF0YSwgKG4pLCBzaXplLCAmYml0X3BvcykKKyNkZWZpbmUgQ09ORElUSU9OQUxfU0tJUChuKSAoR0VUX0JJVCgxKSA/IEdFVF9CSVQoKG4pKSA6IDApCisKK2ludCBWUDhFc3RpbWF0ZVF1YWxpdHkoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgc2l6ZV90IHBvcyA9IDA7CisgIHVpbnQ2NF90IGJpdF9wb3M7CisgIHVpbnQ2NF90IHNpZyA9IDB4MDA7CisgIGludCBvayA9IDA7CisgIGludCBRID0gLTE7CisgIFdlYlBCaXRzdHJlYW1GZWF0dXJlcyBmZWF0dXJlczsKKworICBpZiAoZGF0YSA9PSBOVUxMKSByZXR1cm4gLTE7CisKKyAgaWYgKFdlYlBHZXRGZWF0dXJlcyhkYXRhLCBzaXplLCAmZmVhdHVyZXMpICE9IFZQOF9TVEFUVVNfT0spIHsKKyAgICByZXR1cm4gLTE7ICAgLy8gaW52YWxpZCBmaWxlCisgIH0KKyAgaWYgKGZlYXR1cmVzLmZvcm1hdCA9PSAyKSByZXR1cm4gMTAxOyAgLy8gbG9zc2xlc3MKKyAgaWYgKGZlYXR1cmVzLmZvcm1hdCA9PSAwIHx8IGZlYXR1cmVzLmhhc19hbmltYXRpb24pIHJldHVybiAtMTsgICAvLyBtaXhlZAorCisgIHdoaWxlIChwb3MgPCBzaXplKSB7CisgICAgc2lnID0gKHNpZyA+PiA4KSB8ICgodWludDY0X3QpZGF0YVtwb3MrK10gPDwgNDApOworICAgIGlmICgoc2lnID4+IDI0KSA9PSAweDJhMDE5ZHVsbCkgeworICAgICAgb2sgPSAxOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmICghb2spIHJldHVybiAtMTsKKyAgaWYgKHBvcyArIDQgPiBzaXplKSByZXR1cm4gLTE7CisKKyAgLy8gU2tpcCBtYWluIEhlYWRlcgorICAvLyB3aWR0aCAgPSAoZGF0YVtwb3MgKyAwXSB8IChkYXRhW3BvcyArIDFdIDw8IDgpKSAmIDB4M2ZmZjsKKyAgLy8gaGVpZ2h0ID0gKGRhdGFbcG9zICsgMl0gfCAoZGF0YVtwb3MgKyAzXSA8PCA4KSkgJiAweDNmZmY7CisgIHBvcyArPSA0OworICBiaXRfcG9zID0gcG9zICogODsKKworICBHRVRfQklUKDIpOyAgLy8gY29sb3JzcGFjZSArIGNsYW1wIHR5cGUKKworICAvLyBTZWdtZW50IGhlYWRlcgorICBpZiAoR0VUX0JJVCgxKSkgeyAgICAgICAvLyB1c2Vfc2VnbWVudF8KKyAgICBpbnQgczsKKyAgICBjb25zdCBpbnQgdXBkYXRlX21hcCA9IEdFVF9CSVQoMSk7CisgICAgaWYgKEdFVF9CSVQoMSkpIHsgICAgIC8vIHVwZGF0ZSBkYXRhCisgICAgICBjb25zdCBpbnQgYWJzb2x1dGVfZGVsdGEgPSBHRVRfQklUKDEpOworICAgICAgaW50IHFbNF0gID0geyAwLCAwLCAwLCAwIH07CisgICAgICBmb3IgKHMgPSAwOyBzIDwgNDsgKytzKSB7CisgICAgICAgIGlmIChHRVRfQklUKDEpKSB7CisgICAgICAgICAgcVtzXSA9IEdFVF9CSVQoNyk7CisgICAgICAgICAgaWYgKEdFVF9CSVQoMSkpIHFbc10gPSAtcVtzXTsgICAvLyBzaWduCisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChhYnNvbHV0ZV9kZWx0YSkgUSA9IHFbMF07ICAvLyBqdXN0IHVzZSB0aGUgZmlyc3Qgc2VnbWVudCdzIHF1YW50aXplcgorICAgICAgZm9yIChzID0gMDsgcyA8IDQ7ICsrcykgQ09ORElUSU9OQUxfU0tJUCg3KTsgICAvLyAgZmlsdGVyIHN0cmVuZ3RoCisgICAgfQorICAgIGlmICh1cGRhdGVfbWFwKSB7CisgICAgICBmb3IgKHMgPSAwOyBzIDwgMzsgKytzKSBDT05ESVRJT05BTF9TS0lQKDgpOworICAgIH0KKyAgfQorICAvLyBGaWx0ZXIgaGVhZGVyCisgIEdFVF9CSVQoMSArIDYgKyAzKTsgICAgIC8vIHNpbXBsZSArIGxldmVsICsgc2hhcnBuZXNzCisgIGlmIChHRVRfQklUKDEpKSB7ICAgICAgIC8vIHVzZV9sZl9kZWx0YQorICAgIGlmIChHRVRfQklUKDEpKSB7ICAgICAvLyB1cGRhdGUgbGZfZGVsdGE/CisgICAgICBpbnQgbjsKKyAgICAgIGZvciAobiA9IDA7IG4gPCA0ICsgNDsgKytuKSBDT05ESVRJT05BTF9TS0lQKDYpOworICAgIH0KKyAgfQorICAvLyBudW0gcGFydGl0aW9ucworICBHRVRfQklUKDIpOworCisgIC8vIFBhcnNlUXVhbnQKKyAgeworICAgIGNvbnN0IGludCBiYXNlX3EgPSBHRVRfQklUKDcpOworICAgIC8qIGRxeTFfZGMgPSAqLyBDT05ESVRJT05BTF9TS0lQKDUpOworICAgIC8qIGRxeTJfZGMgPSAqLyBDT05ESVRJT05BTF9TS0lQKDUpOworICAgIC8qIGRxeTJfYWMgPSAqLyBDT05ESVRJT05BTF9TS0lQKDUpOworICAgIC8qIGRxdXZfZGMgPSAqLyBDT05ESVRJT05BTF9TS0lQKDUpOworICAgIC8qIGRxdXZfYWMgPSAqLyBDT05ESVRJT05BTF9TS0lQKDUpOworCisgICAgaWYgKFEgPCAwKSBRID0gYmFzZV9xOworICB9CisgIGlmIChiaXRfcG9zID09IElOVkFMSURfQklUX1BPUykgcmV0dXJuIC0xOworCisgIC8vIGJhc2UgbWFwcGluZworICBRID0gKDEyNyAtIFEpICogMTAwIC8gMTI3OworICAvLyBjb3JyZWN0aW9uIGZvciBwb3dlci1sYXcgYmVoYXZpb3IgaW4gbG93IHJhbmdlCisgIGlmIChRIDwgODApIHsKKyAgICBRID0gKGludCkocG93KFEgLyA4MC4sIDEuIC8gMC4zOCkgKiA4MCk7CisgIH0KKyAgcmV0dXJuIFE7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leHRyYXMvdndlYnBfc2RsLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leHRyYXMvdndlYnBfc2RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkxNzFiOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4dHJhcy92d2VicF9zZGwuYwpAQCAtMCwwICsxLDk2IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU2ltcGxlIFNETC1iYXNlZCBXZWJQIGZpbGUgdmlld2VyLgorLy8gRG9lcyBub3Qgc3VwcG9ydCBhbmltYXRpb24sIGp1c3Qgc3RhdGljIGltYWdlcy4KKy8vCisvLyBQcmVzcyAncScgdG8gZXhpdC4KKy8vCisvLyBBdXRob3I6IEphbWVzIFplcm4gKGp6ZXJuQGdvb2dsZS5jb20pCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgIndlYnAvY29uZmlnLmgiCisjZW5kaWYKKworI2lmIGRlZmluZWQoV0VCUF9IQVZFX1NETCkKKworI2luY2x1ZGUgIndlYnBfdG9fc2RsLmgiCisjaW5jbHVkZSAid2VicC9kZWNvZGUuaCIKKyNpbmNsdWRlICJpbWFnZWlvL2ltYWdlaW9fdXRpbC5oIgorCisjaWYgZGVmaW5lZChXRUJQX0hBVkVfSlVTVF9TRExfSCkKKyNpbmNsdWRlIDxTREwuaD4KKyNlbHNlCisjaW5jbHVkZSA8U0RML1NETC5oPgorI2VuZGlmCisKK3N0YXRpYyB2b2lkIFByb2Nlc3NFdmVudHModm9pZCkgeworICBpbnQgZG9uZSA9IDA7CisgIFNETF9FdmVudCBldmVudDsKKyAgd2hpbGUgKCFkb25lICYmIFNETF9XYWl0RXZlbnQoJmV2ZW50KSkgeworICAgIHN3aXRjaCAoZXZlbnQudHlwZSkgeworICAgICAgY2FzZSBTRExfS0VZVVA6CisgICAgICAgIHN3aXRjaCAoZXZlbnQua2V5LmtleXN5bS5zeW0pIHsKKyAgICAgICAgICBjYXNlIFNETEtfcTogZG9uZSA9IDE7IGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgfQorICB9Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyAgaW50IGM7CisgIGludCBvayA9IDA7CisgIGZvciAoYyA9IDE7IGMgPCBhcmdjOyArK2MpIHsKKyAgICBjb25zdCBjaGFyKiBmaWxlID0gTlVMTDsKKyAgICBjb25zdCB1aW50OF90KiB3ZWJwID0gTlVMTDsKKyAgICBzaXplX3Qgd2VicF9zaXplID0gMDsKKyAgICBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWgiKSkgeworICAgICAgcHJpbnRmKCJVc2FnZTogJXMgWy1oXSBpbWFnZS53ZWJwIFttb3JlX2ZpbGVzLndlYnAuLi5dXG4iLCBhcmd2WzBdKTsKKyAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICBmaWxlID0gYXJndltjXTsKKyAgICB9CisgICAgaWYgKGZpbGUgPT0gTlVMTCkgY29udGludWU7CisgICAgaWYgKCFJbWdJb1V0aWxSZWFkRmlsZShmaWxlLCAmd2VicCwgJndlYnBfc2l6ZSkpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3Igb3BlbmluZyBmaWxlOiAlc1xuIiwgZmlsZSk7CisgICAgICBnb3RvIEVycm9yOworICAgIH0KKyAgICBpZiAod2VicF9zaXplICE9IChzaXplX3QpKGludCl3ZWJwX3NpemUpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiRmlsZSB0b28gbGFyZ2UuXG4iKTsKKyAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorICAgIG9rID0gV2VicFRvU0RMKChjb25zdCBjaGFyKil3ZWJwLCAoaW50KXdlYnBfc2l6ZSk7CisgICAgZnJlZSgodm9pZCopd2VicCk7CisgICAgaWYgKCFvaykgeworICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBkZWNvZGluZyBmaWxlICVzXG4iLCBmaWxlKTsKKyAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorICAgIFByb2Nlc3NFdmVudHMoKTsKKyAgfQorICBvayA9IDE7CisKKyBFcnJvcjoKKyAgU0RMX1F1aXQoKTsKKyAgcmV0dXJuIG9rID8gMCA6IDE7Cit9CisKKyNlbHNlICAvLyAhV0VCUF9IQVZFX1NETAorCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdKSB7CisgIGZwcmludGYoc3RkZXJyLCAiU0RMIHN1cHBvcnQgbm90IGVuYWJsZWQgaW4gJXMuXG4iLCBhcmd2WzBdKTsKKyAgKHZvaWQpYXJnYzsKKyAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXh0cmFzL3dlYnBfcXVhbGl0eS5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXh0cmFzL3dlYnBfcXVhbGl0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNmJhMjAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leHRyYXMvd2VicF9xdWFsaXR5LmMKQEAgLTAsMCArMSw1MCBAQAorLy8gU2ltcGxlIHRvb2wgdG8gcm91Z2hseSBldmFsdWF0ZSB0aGUgcXVhbGl0eSBlbmNvZGluZyBvZiBhIHdlYnAgYml0c3RyZWFtCisvLworLy8gUmVzdWx0IGlzIGEgKnJvdWdoKiBlc3RpbWF0aW9uIG9mIHRoZSBxdWFsaXR5LiBZb3Ugc2hvdWxkIGp1c3QgY29uc2lkZXIKKy8vIHRoZSBidWNrZXQgaXQncyBpbiAocSA+IDgwPyA+IDUwPyA+IDIwPykgYW5kIG5vdCB0YWtlIGl0IGZvciBmYWNlIHZhbHVlLgorLyoKKyBnY2MgLW8gd2VicF9xdWFsaXR5IHdlYnBfcXVhbGl0eS5jIC1PMyAtSS4uLyAtTC4gLUwuLi9pbWFnZWlvIFwKKyAgICAtbGltYWdlaW9fdXRpbCAtbHdlYnBleHRyYXMgLWx3ZWJwIC1sbSAtbHB0aHJlYWQKKyovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiZXh0cmFzL2V4dHJhcy5oIgorI2luY2x1ZGUgImltYWdlaW8vaW1hZ2Vpb191dGlsLmgiCisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10pIHsKKyAgaW50IGM7CisgIGludCBxdWlldCA9IDA7CisgIGludCBvayA9IDE7CisgIGZvciAoYyA9IDE7IG9rICYmIGMgPCBhcmdjOyArK2MpIHsKKyAgICBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXF1aWV0IikpIHsKKyAgICAgIHF1aWV0ID0gMTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1oZWxwIikgfHwgIXN0cmNtcChhcmd2W2NdLCAiLWgiKSkgeworICAgICAgcHJpbnRmKCJ3ZWJwX3F1YWxpdHkgWy1oXVstcXVpZXRdIHdlYnBfZmlsZXMuLi5cbiIpOworICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbnN0IGNoYXIqIGNvbnN0IGZpbGVuYW1lID0gYXJndltjXTsKKyAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEgPSBOVUxMOworICAgICAgc2l6ZV90IGRhdGFfc2l6ZSA9IDA7CisgICAgICBpbnQgcTsKKyAgICAgIG9rID0gSW1nSW9VdGlsUmVhZEZpbGUoZmlsZW5hbWUsICZkYXRhLCAmZGF0YV9zaXplKTsKKyAgICAgIGlmICghb2spIGJyZWFrOworICAgICAgcSA9IFZQOEVzdGltYXRlUXVhbGl0eShkYXRhLCBkYXRhX3NpemUpOworICAgICAgaWYgKCFxdWlldCkgcHJpbnRmKCJbJXNdICIsIGZpbGVuYW1lKTsKKyAgICAgIGlmIChxIDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk5vdCBhIFdlYlAgZmlsZSwgb3Igbm90IGEgbG9zc3kgV2ViUCBmaWxlLlxuIik7CisgICAgICAgIG9rID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghcXVpZXQpIHsKKyAgICAgICAgICBwcmludGYoIkVzdGltYXRlZCBxdWFsaXR5IGZhY3RvcjogJWRcbiIsIHEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHByaW50ZigiJWRcbiIsIHEpOyAgIC8vIGp1c3QgcHJpbnQgdGhlIG51bWJlcgorICAgICAgICB9CisgICAgICB9CisgICAgICBmcmVlKCh2b2lkKilkYXRhKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG9rID8gMCA6IDE7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leHRyYXMvd2VicF90b19zZGwuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4dHJhcy93ZWJwX3RvX3NkbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNzQ3MTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leHRyYXMvd2VicF90b19zZGwuYwpAQCAtMCwwICsxLDExMCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICBTaW1wbGUgV2ViUC10by1TREwgd3JhcHBlci4gVXNlZnVsIGZvciBlbXNjcmlwdGVuLgorLy8KKy8vIEF1dGhvcjogSmFtZXMgWmVybiAoanplcm5AZ29vZ2xlLmNvbSkKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJzcmMvd2VicC9jb25maWcuaCIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChXRUJQX0hBVkVfU0RMKQorCisjaW5jbHVkZSAid2VicF90b19zZGwuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAic3JjL3dlYnAvZGVjb2RlLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfSEFWRV9KVVNUX1NETF9IKQorI2luY2x1ZGUgPFNETC5oPgorI2Vsc2UKKyNpbmNsdWRlIDxTREwvU0RMLmg+CisjZW5kaWYKKworc3RhdGljIGludCBpbml0X29rID0gMDsKK2ludCBXZWJwVG9TREwoY29uc3QgY2hhciogZGF0YSwgdW5zaWduZWQgaW50IGRhdGFfc2l6ZSkgeworICBpbnQgb2sgPSAwOworICBWUDhTdGF0dXNDb2RlIHN0YXR1czsKKyAgV2ViUERlY29kZXJDb25maWcgY29uZmlnOworICBXZWJQQml0c3RyZWFtRmVhdHVyZXMqIGNvbnN0IGlucHV0ID0gJmNvbmZpZy5pbnB1dDsKKyAgV2ViUERlY0J1ZmZlciogY29uc3Qgb3V0cHV0ID0gJmNvbmZpZy5vdXRwdXQ7CisgIFNETF9TdXJmYWNlKiBzY3JlZW4gPSBOVUxMOworICBTRExfU3VyZmFjZSogc3VyZmFjZSA9IE5VTEw7CisKKyAgaWYgKCFXZWJQSW5pdERlY29kZXJDb25maWcoJmNvbmZpZykpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkxpYnJhcnkgdmVyc2lvbiBtaXNtYXRjaCFcbiIpOworICAgIHJldHVybiAxOworICB9CisKKyAgaWYgKCFpbml0X29rKSB7CisgICAgU0RMX0luaXQoU0RMX0lOSVRfVklERU8pOworICAgIGluaXRfb2sgPSAxOworICB9CisKKyAgc3RhdHVzID0gV2ViUEdldEZlYXR1cmVzKCh1aW50OF90KilkYXRhLCAoc2l6ZV90KWRhdGFfc2l6ZSwgJmNvbmZpZy5pbnB1dCk7CisgIGlmIChzdGF0dXMgIT0gVlA4X1NUQVRVU19PSykgZ290byBFcnJvcjsKKworICBzY3JlZW4gPSBTRExfU2V0VmlkZW9Nb2RlKGlucHV0LT53aWR0aCwgaW5wdXQtPmhlaWdodCwgMzIsIFNETF9TV1NVUkZBQ0UpOworICBpZiAoc2NyZWVuID09IE5VTEwpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBzZXQgdmlkZW8gbW9kZSAoMzJicHAgJWR4JWQpIVxuIiwKKyAgICAgICAgICAgIGlucHV0LT53aWR0aCwgaW5wdXQtPmhlaWdodCk7CisgICAgZ290byBFcnJvcjsKKyAgfQorCisgIHN1cmZhY2UgPSBTRExfQ3JlYXRlUkdCU3VyZmFjZShTRExfU1dTVVJGQUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQtPndpZHRoLCBpbnB1dC0+aGVpZ2h0LCAzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwZmZ1LCAgIC8vIFIgbWFzaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwZmYwMHUsICAgLy8gRyBtYXNrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwZmYwMDAwdSwgICAvLyBCIG1hc2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmYwMDAwMDB1KTsgIC8vIEEgbWFzaworCisgIGlmIChzdXJmYWNlID09IE5VTEwpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBjcmVhdGUgJWR4JWQgUkdCQSBzdXJmYWNlIVxuIiwKKyAgICAgICAgICAgIGlucHV0LT53aWR0aCwgaW5wdXQtPmhlaWdodCk7CisgICAgZ290byBFcnJvcjsKKyAgfQorICBpZiAoU0RMX01VU1RMT0NLKHN1cmZhY2UpKSBTRExfTG9ja1N1cmZhY2Uoc3VyZmFjZSk7CisKKyNpZiBTRExfQllURU9SREVSID09IFNETF9CSUdfRU5ESUFOCisgIG91dHB1dC0+Y29sb3JzcGFjZSA9IE1PREVfQkdSQTsKKyNlbHNlCisgIG91dHB1dC0+Y29sb3JzcGFjZSA9IE1PREVfUkdCQTsKKyNlbmRpZgorICBvdXRwdXQtPndpZHRoICA9IHN1cmZhY2UtPnc7CisgIG91dHB1dC0+aGVpZ2h0ID0gc3VyZmFjZS0+aDsKKyAgb3V0cHV0LT51LlJHQkEucmdiYSAgID0gc3VyZmFjZS0+cGl4ZWxzOworICBvdXRwdXQtPnUuUkdCQS5zdHJpZGUgPSBzdXJmYWNlLT5waXRjaDsKKyAgb3V0cHV0LT51LlJHQkEuc2l6ZSAgID0gc3VyZmFjZS0+cGl0Y2ggKiBzdXJmYWNlLT5oOworICBvdXRwdXQtPmlzX2V4dGVybmFsX21lbW9yeSA9IDE7CisKKyAgc3RhdHVzID0gV2ViUERlY29kZSgoY29uc3QgdWludDhfdCopZGF0YSwgKHNpemVfdClkYXRhX3NpemUsICZjb25maWcpOworICBpZiAoc3RhdHVzICE9IFZQOF9TVEFUVVNfT0spIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGRlY29kaW5nIGltYWdlICglZClcbiIsIHN0YXR1cyk7CisgICAgZ290byBFcnJvcjsKKyAgfQorCisgIGlmIChTRExfTVVTVExPQ0soc3VyZmFjZSkpIFNETF9VbmxvY2tTdXJmYWNlKHN1cmZhY2UpOworICBpZiAoU0RMX0JsaXRTdXJmYWNlKHN1cmZhY2UsIE5VTEwsIHNjcmVlbiwgTlVMTCkgfHwKKyAgICAgIFNETF9GbGlwKHNjcmVlbikpIHsKKyAgICBnb3RvIEVycm9yOworICB9CisKKyAgb2sgPSAxOworCisgRXJyb3I6CisgIFNETF9GcmVlU3VyZmFjZShzdXJmYWNlKTsKKyAgU0RMX0ZyZWVTdXJmYWNlKHNjcmVlbik7CisgIFdlYlBGcmVlRGVjQnVmZmVyKG91dHB1dCk7CisgIHJldHVybiBvazsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2VuZGlmICAvLyBXRUJQX0hBVkVfU0RMCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leHRyYXMvd2VicF90b19zZGwuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4dHJhcy93ZWJwX3RvX3NkbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNWVhOTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leHRyYXMvd2VicF90b19zZGwuaApAQCAtMCwwICsxLDIyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gIFNpbXBsZSBXZWJQLXRvLVNETCB3cmFwcGVyLiBVc2VmdWwgZm9yIGVtc2NyaXB0ZW4uCisvLworLy8gQXV0aG9yOiBKYW1lcyBaZXJuIChqemVybkBnb29nbGUuY29tKQorCisjaWZuZGVmIFdFQlBfRVhUUkFTX1dFQlBfVE9fU0RMX0hfCisjZGVmaW5lIFdFQlBfRVhUUkFTX1dFQlBfVE9fU0RMX0hfCisKKy8vIEV4cG9ydHMgdGhlIG1ldGhvZCBXZWJwVG9TREwoY29uc3QgY2hhciogZGF0YSwgaW50IGRhdGFfc2l6ZSkgd2hpY2ggZGVjb2RlcworLy8gYSBXZWJQIGJpdHN0cmVhbSBpbnRvIGFuIFJHQkEgU0RMIHN1cmZhY2UuCisvLyBSZXR1cm4gZmFsc2Ugb24gZmFpbHVyZS4KK2V4dGVybiBpbnQgV2VicFRvU0RMKGNvbnN0IGNoYXIqIGRhdGEsIHVuc2lnbmVkIGludCBkYXRhX3NpemUpOworCisjZW5kaWYgIC8vIFdFQlBfRVhUUkFTX1dFQlBfVE9fU0RMX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9ncmFkbGUucHJvcGVydGllcyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2dyYWRsZS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4ZDM5ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9ncmFkbGUucHJvcGVydGllcwpAQCAtMCwwICsxLDE0IEBACisjIFByb2plY3Qtd2lkZSBHcmFkbGUgc2V0dGluZ3MuCisKKyMgSURFIChlLmcuIEFuZHJvaWQgU3R1ZGlvKSB1c2VyczoKKyMgR3JhZGxlIHNldHRpbmdzIGNvbmZpZ3VyZWQgdGhyb3VnaCB0aGUgSURFICp3aWxsIG92ZXJyaWRlKgorIyBhbnkgc2V0dGluZ3Mgc3BlY2lmaWVkIGluIHRoaXMgZmlsZS4KKworIyBGb3IgbW9yZSBkZXRhaWxzIG9uIGhvdyB0byBjb25maWd1cmUgeW91ciBidWlsZCBlbnZpcm9ubWVudCB2aXNpdAorIyBodHRwOi8vd3d3LmdyYWRsZS5vcmcvZG9jcy9jdXJyZW50L3VzZXJndWlkZS9idWlsZF9lbnZpcm9ubWVudC5odG1sCisKKyMgVmVyc2lvbnMgZm9yIGdyYWRsZQorQlVJTERfVE9PTFNfVkVSU0lPTj0yMy4wLjMKK0NPTVBJTEVfU0RLX1ZFUlNJT049MjMKK0FORFJPSURfR1JBRExFX1BMVUdJTl9WRVJTSU9OPTEuNS4wCitHUkFETEVfRE9XTkxPQURfVEFTS19WRVJTSU9OPTIuMS4wCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5qYXIgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E3ODAzNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5wcm9wZXJ0aWVzIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTU2MTA0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIucHJvcGVydGllcwpAQCAtMCwwICsxLDYgQEAKKyNUaHUgTWF5IDEyIDE3OjA2OjI1IENFU1QgMjAxNgorZGlzdHJpYnV0aW9uQmFzZT1HUkFETEVfVVNFUl9IT01FCitkaXN0cmlidXRpb25QYXRoPXdyYXBwZXIvZGlzdHMKK3ppcFN0b3JlQmFzZT1HUkFETEVfVVNFUl9IT01FCit6aXBTdG9yZVBhdGg9d3JhcHBlci9kaXN0cworZGlzdHJpYnV0aW9uVXJsPWh0dHBzXDovL3NlcnZpY2VzLmdyYWRsZS5vcmcvZGlzdHJpYnV0aW9ucy9ncmFkbGUtMi4xMy1iaW4uemlwCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9ncmFkbGV3IGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZ3JhZGxldwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNzMwOWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZ3JhZGxldwpAQCAtMCwwICsxLDE2NCBAQAorIyEvdXNyL2Jpbi9lbnYgYmFzaAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjCisjIyAgR3JhZGxlIHN0YXJ0IHVwIHNjcmlwdCBmb3IgVU4qWAorIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIEF0dGVtcHQgdG8gc2V0IEFQUF9IT01FCisjIFJlc29sdmUgbGlua3M6ICQwIG1heSBiZSBhIGxpbmsKK1BSRz0iJDAiCisjIE5lZWQgdGhpcyBmb3IgcmVsYXRpdmUgc3ltbGlua3MuCit3aGlsZSBbIC1oICIkUFJHIiBdIDsgZG8KKyAgICBscz1gbHMgLWxkICIkUFJHImAKKyAgICBsaW5rPWBleHByICIkbHMiIDogJy4qLT4gXCguKlwpJCdgCisgICAgaWYgZXhwciAiJGxpbmsiIDogJy8uKicgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgICAgUFJHPSIkbGluayIKKyAgICBlbHNlCisgICAgICAgIFBSRz1gZGlybmFtZSAiJFBSRyJgIi8kbGluayIKKyAgICBmaQorZG9uZQorU0FWRUQ9ImBwd2RgIgorY2QgImBkaXJuYW1lIFwiJFBSR1wiYC8iID4vZGV2L251bGwKK0FQUF9IT01FPSJgcHdkIC1QYCIKK2NkICIkU0FWRUQiID4vZGV2L251bGwKKworQVBQX05BTUU9IkdyYWRsZSIKK0FQUF9CQVNFX05BTUU9YGJhc2VuYW1lICIkMCJgCisKKyMgQWRkIGRlZmF1bHQgSlZNIG9wdGlvbnMgaGVyZS4gWW91IGNhbiBhbHNvIHVzZSBKQVZBX09QVFMgYW5kIEdSQURMRV9PUFRTIHRvIHBhc3MgSlZNIG9wdGlvbnMgdG8gdGhpcyBzY3JpcHQuCitERUZBVUxUX0pWTV9PUFRTPSIiCisKKyMgVXNlIHRoZSBtYXhpbXVtIGF2YWlsYWJsZSwgb3Igc2V0IE1BWF9GRCAhPSAtMSB0byB1c2UgdGhhdCB2YWx1ZS4KK01BWF9GRD0ibWF4aW11bSIKKword2FybiAoICkgeworICAgIGVjaG8gIiQqIgorfQorCitkaWUgKCApIHsKKyAgICBlY2hvCisgICAgZWNobyAiJCoiCisgICAgZWNobworICAgIGV4aXQgMQorfQorCisjIE9TIHNwZWNpZmljIHN1cHBvcnQgKG11c3QgYmUgJ3RydWUnIG9yICdmYWxzZScpLgorY3lnd2luPWZhbHNlCittc3lzPWZhbHNlCitkYXJ3aW49ZmFsc2UKK25vbnN0b3A9ZmFsc2UKK2Nhc2UgImB1bmFtZWAiIGluCisgIENZR1dJTiogKQorICAgIGN5Z3dpbj10cnVlCisgICAgOzsKKyAgRGFyd2luKiApCisgICAgZGFyd2luPXRydWUKKyAgICA7OworICBNSU5HVyogKQorICAgIG1zeXM9dHJ1ZQorICAgIDs7CisgIE5PTlNUT1AqICkKKyAgICBub25zdG9wPXRydWUKKyAgICA7OworZXNhYworCitDTEFTU1BBVEg9JEFQUF9IT01FL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLmphcgorCisjIERldGVybWluZSB0aGUgSmF2YSBjb21tYW5kIHRvIHVzZSB0byBzdGFydCB0aGUgSlZNLgoraWYgWyAtbiAiJEpBVkFfSE9NRSIgXSA7IHRoZW4KKyAgICBpZiBbIC14ICIkSkFWQV9IT01FL2pyZS9zaC9qYXZhIiBdIDsgdGhlbgorICAgICAgICAjIElCTSdzIEpESyBvbiBBSVggdXNlcyBzdHJhbmdlIGxvY2F0aW9ucyBmb3IgdGhlIGV4ZWN1dGFibGVzCisgICAgICAgIEpBVkFDTUQ9IiRKQVZBX0hPTUUvanJlL3NoL2phdmEiCisgICAgZWxzZQorICAgICAgICBKQVZBQ01EPSIkSkFWQV9IT01FL2Jpbi9qYXZhIgorICAgIGZpCisgICAgaWYgWyAhIC14ICIkSkFWQUNNRCIgXSA7IHRoZW4KKyAgICAgICAgZGllICJFUlJPUjogSkFWQV9IT01FIGlzIHNldCB0byBhbiBpbnZhbGlkIGRpcmVjdG9yeTogJEpBVkFfSE9NRQorCitQbGVhc2Ugc2V0IHRoZSBKQVZBX0hPTUUgdmFyaWFibGUgaW4geW91ciBlbnZpcm9ubWVudCB0byBtYXRjaCB0aGUKK2xvY2F0aW9uIG9mIHlvdXIgSmF2YSBpbnN0YWxsYXRpb24uIgorICAgIGZpCitlbHNlCisgICAgSkFWQUNNRD0iamF2YSIKKyAgICB3aGljaCBqYXZhID4vZGV2L251bGwgMj4mMSB8fCBkaWUgIkVSUk9SOiBKQVZBX0hPTUUgaXMgbm90IHNldCBhbmQgbm8gJ2phdmEnIGNvbW1hbmQgY291bGQgYmUgZm91bmQgaW4geW91ciBQQVRILgorCitQbGVhc2Ugc2V0IHRoZSBKQVZBX0hPTUUgdmFyaWFibGUgaW4geW91ciBlbnZpcm9ubWVudCB0byBtYXRjaCB0aGUKK2xvY2F0aW9uIG9mIHlvdXIgSmF2YSBpbnN0YWxsYXRpb24uIgorZmkKKworIyBJbmNyZWFzZSB0aGUgbWF4aW11bSBmaWxlIGRlc2NyaXB0b3JzIGlmIHdlIGNhbi4KK2lmIFsgIiRjeWd3aW4iID0gImZhbHNlIiAtYSAiJGRhcndpbiIgPSAiZmFsc2UiIC1hICIkbm9uc3RvcCIgPSAiZmFsc2UiIF0gOyB0aGVuCisgICAgTUFYX0ZEX0xJTUlUPWB1bGltaXQgLUggLW5gCisgICAgaWYgWyAkPyAtZXEgMCBdIDsgdGhlbgorICAgICAgICBpZiBbICIkTUFYX0ZEIiA9ICJtYXhpbXVtIiAtbyAiJE1BWF9GRCIgPSAibWF4IiBdIDsgdGhlbgorICAgICAgICAgICAgTUFYX0ZEPSIkTUFYX0ZEX0xJTUlUIgorICAgICAgICBmaQorICAgICAgICB1bGltaXQgLW4gJE1BWF9GRAorICAgICAgICBpZiBbICQ/IC1uZSAwIF0gOyB0aGVuCisgICAgICAgICAgICB3YXJuICJDb3VsZCBub3Qgc2V0IG1heGltdW0gZmlsZSBkZXNjcmlwdG9yIGxpbWl0OiAkTUFYX0ZEIgorICAgICAgICBmaQorICAgIGVsc2UKKyAgICAgICAgd2FybiAiQ291bGQgbm90IHF1ZXJ5IG1heGltdW0gZmlsZSBkZXNjcmlwdG9yIGxpbWl0OiAkTUFYX0ZEX0xJTUlUIgorICAgIGZpCitmaQorCisjIEZvciBEYXJ3aW4sIGFkZCBvcHRpb25zIHRvIHNwZWNpZnkgaG93IHRoZSBhcHBsaWNhdGlvbiBhcHBlYXJzIGluIHRoZSBkb2NrCitpZiAkZGFyd2luOyB0aGVuCisgICAgR1JBRExFX09QVFM9IiRHUkFETEVfT1BUUyBcIi1YZG9jazpuYW1lPSRBUFBfTkFNRVwiIFwiLVhkb2NrOmljb249JEFQUF9IT01FL21lZGlhL2dyYWRsZS5pY25zXCIiCitmaQorCisjIEZvciBDeWd3aW4sIHN3aXRjaCBwYXRocyB0byBXaW5kb3dzIGZvcm1hdCBiZWZvcmUgcnVubmluZyBqYXZhCitpZiAkY3lnd2luIDsgdGhlbgorICAgIEFQUF9IT01FPWBjeWdwYXRoIC0tcGF0aCAtLW1peGVkICIkQVBQX0hPTUUiYAorICAgIENMQVNTUEFUSD1gY3lncGF0aCAtLXBhdGggLS1taXhlZCAiJENMQVNTUEFUSCJgCisgICAgSkFWQUNNRD1gY3lncGF0aCAtLXVuaXggIiRKQVZBQ01EImAKKworICAgICMgV2UgYnVpbGQgdGhlIHBhdHRlcm4gZm9yIGFyZ3VtZW50cyB0byBiZSBjb252ZXJ0ZWQgdmlhIGN5Z3BhdGgKKyAgICBST09URElSU1JBVz1gZmluZCAtTCAvIC1tYXhkZXB0aCAxIC1taW5kZXB0aCAxIC10eXBlIGQgMj4vZGV2L251bGxgCisgICAgU0VQPSIiCisgICAgZm9yIGRpciBpbiAkUk9PVERJUlNSQVcgOyBkbworICAgICAgICBST09URElSUz0iJFJPT1RESVJTJFNFUCRkaXIiCisgICAgICAgIFNFUD0ifCIKKyAgICBkb25lCisgICAgT1VSQ1lHUEFUVEVSTj0iKF4oJFJPT1RESVJTKSkiCisgICAgIyBBZGQgYSB1c2VyLWRlZmluZWQgcGF0dGVybiB0byB0aGUgY3lncGF0aCBhcmd1bWVudHMKKyAgICBpZiBbICIkR1JBRExFX0NZR1BBVFRFUk4iICE9ICIiIF0gOyB0aGVuCisgICAgICAgIE9VUkNZR1BBVFRFUk49IiRPVVJDWUdQQVRURVJOfCgkR1JBRExFX0NZR1BBVFRFUk4pIgorICAgIGZpCisgICAgIyBOb3cgY29udmVydCB0aGUgYXJndW1lbnRzIC0ga2x1ZGdlIHRvIGxpbWl0IG91cnNlbHZlcyB0byAvYmluL3NoCisgICAgaT0wCisgICAgZm9yIGFyZyBpbiAiJEAiIDsgZG8KKyAgICAgICAgQ0hFQ0s9YGVjaG8gIiRhcmcifGVncmVwIC1jICIkT1VSQ1lHUEFUVEVSTiIgLWAKKyAgICAgICAgQ0hFQ0syPWBlY2hvICIkYXJnInxlZ3JlcCAtYyAiXi0iYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyBEZXRlcm1pbmUgaWYgYW4gb3B0aW9uCisKKyAgICAgICAgaWYgWyAkQ0hFQ0sgLW5lIDAgXSAmJiBbICRDSEVDSzIgLWVxIDAgXSA7IHRoZW4gICAgICAgICAgICAgICAgICAgICMjIyBBZGRlZCBhIGNvbmRpdGlvbgorICAgICAgICAgICAgZXZhbCBgZWNobyBhcmdzJGlgPWBjeWdwYXRoIC0tcGF0aCAtLWlnbm9yZSAtLW1peGVkICIkYXJnImAKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXZhbCBgZWNobyBhcmdzJGlgPSJcIiRhcmdcIiIKKyAgICAgICAgZmkKKyAgICAgICAgaT0kKChpKzEpKQorICAgIGRvbmUKKyAgICBjYXNlICRpIGluCisgICAgICAgICgwKSBzZXQgLS0gOzsKKyAgICAgICAgKDEpIHNldCAtLSAiJGFyZ3MwIiA7OworICAgICAgICAoMikgc2V0IC0tICIkYXJnczAiICIkYXJnczEiIDs7CisgICAgICAgICgzKSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgOzsKKyAgICAgICAgKDQpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiA7OworICAgICAgICAoNSkgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiIDs7CisgICAgICAgICg2KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgIiRhcmdzNCIgIiRhcmdzNSIgOzsKKyAgICAgICAgKDcpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiAiJGFyZ3M1IiAiJGFyZ3M2IiA7OworICAgICAgICAoOCkgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiICIkYXJnczUiICIkYXJnczYiICIkYXJnczciIDs7CisgICAgICAgICg5KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgIiRhcmdzNCIgIiRhcmdzNSIgIiRhcmdzNiIgIiRhcmdzNyIgIiRhcmdzOCIgOzsKKyAgICBlc2FjCitmaQorCisjIFNwbGl0IHVwIHRoZSBKVk1fT1BUUyBBbmQgR1JBRExFX09QVFMgdmFsdWVzIGludG8gYW4gYXJyYXksIGZvbGxvd2luZyB0aGUgc2hlbGwgcXVvdGluZyBhbmQgc3Vic3RpdHV0aW9uIHJ1bGVzCitmdW5jdGlvbiBzcGxpdEp2bU9wdHMoKSB7CisgICAgSlZNX09QVFM9KCIkQCIpCit9CitldmFsIHNwbGl0SnZtT3B0cyAkREVGQVVMVF9KVk1fT1BUUyAkSkFWQV9PUFRTICRHUkFETEVfT1BUUworSlZNX09QVFNbJHsjSlZNX09QVFNbKl19XT0iLURvcmcuZ3JhZGxlLmFwcG5hbWU9JEFQUF9CQVNFX05BTUUiCisKK2V4ZWMgIiRKQVZBQ01EIiAiJHtKVk1fT1BUU1tAXX0iIC1jbGFzc3BhdGggIiRDTEFTU1BBVEgiIG9yZy5ncmFkbGUud3JhcHBlci5HcmFkbGVXcmFwcGVyTWFpbiAiJEAiCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9ncmFkbGV3LmJhdCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2dyYWRsZXcuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZDU5NzQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9ncmFkbGV3LmJhdApAQCAtMCwwICsxLDkwIEBACitAaWYgIiVERUJVRyUiID09ICIiIEBlY2hvIG9mZg0KK0ByZW0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCitAcmVtDQorQHJlbSAgR3JhZGxlIHN0YXJ0dXAgc2NyaXB0IGZvciBXaW5kb3dzDQorQHJlbQ0KK0ByZW0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisNCitAcmVtIFNldCBsb2NhbCBzY29wZSBmb3IgdGhlIHZhcmlhYmxlcyB3aXRoIHdpbmRvd3MgTlQgc2hlbGwNCitpZiAiJU9TJSI9PSJXaW5kb3dzX05UIiBzZXRsb2NhbA0KKw0KK3NldCBESVJOQU1FPSV+ZHAwDQoraWYgIiVESVJOQU1FJSIgPT0gIiIgc2V0IERJUk5BTUU9Lg0KK3NldCBBUFBfQkFTRV9OQU1FPSV+bjANCitzZXQgQVBQX0hPTUU9JURJUk5BTUUlDQorDQorQHJlbSBBZGQgZGVmYXVsdCBKVk0gb3B0aW9ucyBoZXJlLiBZb3UgY2FuIGFsc28gdXNlIEpBVkFfT1BUUyBhbmQgR1JBRExFX09QVFMgdG8gcGFzcyBKVk0gb3B0aW9ucyB0byB0aGlzIHNjcmlwdC4NCitzZXQgREVGQVVMVF9KVk1fT1BUUz0NCisNCitAcmVtIEZpbmQgamF2YS5leGUNCitpZiBkZWZpbmVkIEpBVkFfSE9NRSBnb3RvIGZpbmRKYXZhRnJvbUphdmFIb21lDQorDQorc2V0IEpBVkFfRVhFPWphdmEuZXhlDQorJUpBVkFfRVhFJSAtdmVyc2lvbiA+TlVMIDI+JjENCitpZiAiJUVSUk9STEVWRUwlIiA9PSAiMCIgZ290byBpbml0DQorDQorZWNoby4NCitlY2hvIEVSUk9SOiBKQVZBX0hPTUUgaXMgbm90IHNldCBhbmQgbm8gJ2phdmEnIGNvbW1hbmQgY291bGQgYmUgZm91bmQgaW4geW91ciBQQVRILg0KK2VjaG8uDQorZWNobyBQbGVhc2Ugc2V0IHRoZSBKQVZBX0hPTUUgdmFyaWFibGUgaW4geW91ciBlbnZpcm9ubWVudCB0byBtYXRjaCB0aGUNCitlY2hvIGxvY2F0aW9uIG9mIHlvdXIgSmF2YSBpbnN0YWxsYXRpb24uDQorDQorZ290byBmYWlsDQorDQorOmZpbmRKYXZhRnJvbUphdmFIb21lDQorc2V0IEpBVkFfSE9NRT0lSkFWQV9IT01FOiI9JQ0KK3NldCBKQVZBX0VYRT0lSkFWQV9IT01FJS9iaW4vamF2YS5leGUNCisNCitpZiBleGlzdCAiJUpBVkFfRVhFJSIgZ290byBpbml0DQorDQorZWNoby4NCitlY2hvIEVSUk9SOiBKQVZBX0hPTUUgaXMgc2V0IHRvIGFuIGludmFsaWQgZGlyZWN0b3J5OiAlSkFWQV9IT01FJQ0KK2VjaG8uDQorZWNobyBQbGVhc2Ugc2V0IHRoZSBKQVZBX0hPTUUgdmFyaWFibGUgaW4geW91ciBlbnZpcm9ubWVudCB0byBtYXRjaCB0aGUNCitlY2hvIGxvY2F0aW9uIG9mIHlvdXIgSmF2YSBpbnN0YWxsYXRpb24uDQorDQorZ290byBmYWlsDQorDQorOmluaXQNCitAcmVtIEdldCBjb21tYW5kLWxpbmUgYXJndW1lbnRzLCBoYW5kbGluZyBXaW5kb3dzIHZhcmlhbnRzDQorDQoraWYgbm90ICIlT1MlIiA9PSAiV2luZG93c19OVCIgZ290byB3aW45eE1FX2FyZ3MNCitpZiAiJUBldmFsWzIrMl0iID09ICI0IiBnb3RvIDROVF9hcmdzDQorDQorOndpbjl4TUVfYXJncw0KK0ByZW0gU2x1cnAgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuDQorc2V0IENNRF9MSU5FX0FSR1M9DQorc2V0IF9TS0lQPTINCisNCis6d2luOXhNRV9hcmdzX3NsdXJwDQoraWYgInglfjEiID09ICJ4IiBnb3RvIGV4ZWN1dGUNCisNCitzZXQgQ01EX0xJTkVfQVJHUz0lKg0KK2dvdG8gZXhlY3V0ZQ0KKw0KKzo0TlRfYXJncw0KK0ByZW0gR2V0IGFyZ3VtZW50cyBmcm9tIHRoZSA0TlQgU2hlbGwgZnJvbSBKUCBTb2Z0d2FyZQ0KK3NldCBDTURfTElORV9BUkdTPSUkDQorDQorOmV4ZWN1dGUNCitAcmVtIFNldHVwIHRoZSBjb21tYW5kIGxpbmUNCisNCitzZXQgQ0xBU1NQQVRIPSVBUFBfSE9NRSVcZ3JhZGxlXHdyYXBwZXJcZ3JhZGxlLXdyYXBwZXIuamFyDQorDQorQHJlbSBFeGVjdXRlIEdyYWRsZQ0KKyIlSkFWQV9FWEUlIiAlREVGQVVMVF9KVk1fT1BUUyUgJUpBVkFfT1BUUyUgJUdSQURMRV9PUFRTJSAiLURvcmcuZ3JhZGxlLmFwcG5hbWU9JUFQUF9CQVNFX05BTUUlIiAtY2xhc3NwYXRoICIlQ0xBU1NQQVRIJSIgb3JnLmdyYWRsZS53cmFwcGVyLkdyYWRsZVdyYXBwZXJNYWluICVDTURfTElORV9BUkdTJQ0KKw0KKzplbmQNCitAcmVtIEVuZCBsb2NhbCBzY29wZSBmb3IgdGhlIHZhcmlhYmxlcyB3aXRoIHdpbmRvd3MgTlQgc2hlbGwNCitpZiAiJUVSUk9STEVWRUwlIj09IjAiIGdvdG8gbWFpbkVuZA0KKw0KKzpmYWlsDQorcmVtIFNldCB2YXJpYWJsZSBHUkFETEVfRVhJVF9DT05TT0xFIGlmIHlvdSBuZWVkIHRoZSBfc2NyaXB0XyByZXR1cm4gY29kZSBpbnN0ZWFkIG9mDQorcmVtIHRoZSBfY21kLmV4ZSAvY18gcmV0dXJuIGNvZGUhDQoraWYgIG5vdCAiIiA9PSAiJUdSQURMRV9FWElUX0NPTlNPTEUlIiBleGl0IDENCitleGl0IC9iIDENCisNCis6bWFpbkVuZA0KK2lmICIlT1MlIj09IldpbmRvd3NfTlQiIGVuZGxvY2FsDQorDQorOm9tZWdhDQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby9BbmRyb2lkLm1rIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NzlmNzEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL0FuZHJvaWQubWsKQEAgLTAsMCArMSw1NCBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBsaWJpbWFnZWlvX3V0aWwKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgaW1hZ2Vpb191dGlsLmMgXAorCitMT0NBTF9DRkxBR1MgOj0gJChXRUJQX0NGTEFHUykKK0xPQ0FMX0NfSU5DTFVERVMgOj0gJChMT0NBTF9QQVRIKS8uLi9zcmMKKworTE9DQUxfTU9EVUxFIDo9IGltYWdlaW9fdXRpbAorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGxpYmltYWdlZGVjCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgIGltYWdlX2RlYy5jIFwKKyAgICBqcGVnZGVjLmMgXAorICAgIG1ldGFkYXRhLmMgXAorICAgIHBuZ2RlYy5jIFwKKyAgICBwbm1kZWMuYyBcCisgICAgdGlmZmRlYy5jIFwKKyAgICB3ZWJwZGVjLmMgXAorCitMT0NBTF9DRkxBR1MgOj0gJChXRUJQX0NGTEFHUykKK0xPQ0FMX0NfSU5DTFVERVMgOj0gJChMT0NBTF9QQVRIKS8uLi9zcmMKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gaW1hZ2Vpb191dGlsCisKK0xPQ0FMX01PRFVMRSA6PSBpbWFnZWRlYworCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGxpYmltYWdlZW5jCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgIGltYWdlX2VuYy5jIFwKKworTE9DQUxfQ0ZMQUdTIDo9ICQoV0VCUF9DRkxBR1MpCitMT0NBTF9DX0lOQ0xVREVTIDo9ICQoTE9DQUxfUEFUSCkvLi4vc3JjCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGltYWdlaW9fdXRpbAorCitMT0NBTF9NT0RVTEUgOj0gaW1hZ2VlbmMKKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby9NYWtlZmlsZS5hbSBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBlNmQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwzMiBAQAorQU1fQ1BQRkxBR1MgKz0gLUkkKHRvcF9idWlsZGRpcikvc3JjIC1JJCh0b3Bfc3JjZGlyKS9zcmMKK25vaW5zdF9MVExJQlJBUklFUyA9Citub2luc3RfTFRMSUJSQVJJRVMgKz0gbGliaW1hZ2Vpb191dGlsLmxhCitpZiBXQU5UX0RFTVVYCisgIG5vaW5zdF9MVExJQlJBUklFUyArPSBsaWJpbWFnZWRlYy5sYQorZW5kaWYKK25vaW5zdF9MVExJQlJBUklFUyArPSBsaWJpbWFnZWVuYy5sYQorCitub2luc3RfSEVBREVSUyA9Citub2luc3RfSEVBREVSUyArPSAuLi9zcmMvd2VicC9kZWNvZGUuaAorbm9pbnN0X0hFQURFUlMgKz0gLi4vc3JjL3dlYnAvdHlwZXMuaAorCitsaWJpbWFnZWlvX3V0aWxfbGFfU09VUkNFUyA9CitsaWJpbWFnZWlvX3V0aWxfbGFfU09VUkNFUyArPSBpbWFnZWlvX3V0aWwuYyBpbWFnZWlvX3V0aWwuaAorCitsaWJpbWFnZWRlY19sYV9TT1VSQ0VTICA9CitsaWJpbWFnZWRlY19sYV9TT1VSQ0VTICs9IGltYWdlX2RlYy5jIGltYWdlX2RlYy5oCitsaWJpbWFnZWRlY19sYV9TT1VSQ0VTICs9IGpwZWdkZWMuYyBqcGVnZGVjLmgKK2xpYmltYWdlZGVjX2xhX1NPVVJDRVMgKz0gbWV0YWRhdGEuYyBtZXRhZGF0YS5oCitsaWJpbWFnZWRlY19sYV9TT1VSQ0VTICs9IHBuZ2RlYy5jIHBuZ2RlYy5oCitsaWJpbWFnZWRlY19sYV9TT1VSQ0VTICs9IHBubWRlYy5jIHBubWRlYy5oCitsaWJpbWFnZWRlY19sYV9TT1VSQ0VTICs9IHRpZmZkZWMuYyB0aWZmZGVjLmgKK2xpYmltYWdlZGVjX2xhX1NPVVJDRVMgKz0gd2VicGRlYy5jIHdlYnBkZWMuaAorbGliaW1hZ2VkZWNfbGFfU09VUkNFUyArPSB3aWNkZWMuYyB3aWNkZWMuaAorbGliaW1hZ2VkZWNfbGFfQ1BQRkxBR1MgPSAkKEpQRUdfSU5DTFVERVMpICQoUE5HX0lOQ0xVREVTKSAkKFRJRkZfSU5DTFVERVMpCitsaWJpbWFnZWRlY19sYV9DUFBGTEFHUyArPSAkKEFNX0NQUEZMQUdTKQorbGliaW1hZ2VkZWNfbGFfTElCQUREID0gLi4vc3JjL2RlbXV4L2xpYndlYnBkZW11eC5sYQorCitsaWJpbWFnZWVuY19sYV9TT1VSQ0VTICA9CitsaWJpbWFnZWVuY19sYV9TT1VSQ0VTICs9IGltYWdlX2VuYy5jIGltYWdlX2VuYy5oCitsaWJpbWFnZWVuY19sYV9DUFBGTEFHUyA9ICQoSlBFR19JTkNMVURFUykgJChQTkdfSU5DTFVERVMpICQoVElGRl9JTkNMVURFUykKK2xpYmltYWdlZW5jX2xhX0NQUEZMQUdTICs9ICQoQU1fQ1BQRkxBR1MpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL2ltYWdlX2RlYy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby9pbWFnZV9kZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGExYjE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby9pbWFnZV9kZWMuYwpAQCAtMCwwICsxLDY2IEBACisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gR2VuZXJpYyBpbWFnZS10eXBlIGd1ZXNzaW5nLgorCisjaW5jbHVkZSAiLi9pbWFnZV9kZWMuaCIKKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IEdldEJFMzIoY29uc3QgdWludDhfdCBidWZbXSkgeworICByZXR1cm4gKCh1aW50MzJfdClidWZbMF0gPDwgMjQpIHwgKGJ1ZlsxXSA8PCAxNikgfCAoYnVmWzJdIDw8IDgpIHwgYnVmWzNdOworfQorCitXZWJQSW5wdXRGaWxlRm9ybWF0IFdlYlBHdWVzc0ltYWdlVHlwZShjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRhdGFfc2l6ZSkgeworICBXZWJQSW5wdXRGaWxlRm9ybWF0IGZvcm1hdCA9IFdFQlBfVU5TVVBQT1JURURfRk9STUFUOworICBpZiAoZGF0YSAhPSBOVUxMICYmIGRhdGFfc2l6ZSA+PSAxMikgeworICAgIGNvbnN0IHVpbnQzMl90IG1hZ2ljMSA9IEdldEJFMzIoZGF0YSArIDApOworICAgIGNvbnN0IHVpbnQzMl90IG1hZ2ljMiA9IEdldEJFMzIoZGF0YSArIDgpOworICAgIGlmIChtYWdpYzEgPT0gMHg4OTUwNEU0N1UpIHsKKyAgICAgIGZvcm1hdCA9IFdFQlBfUE5HX0ZPUk1BVDsKKyAgICB9IGVsc2UgaWYgKG1hZ2ljMSA+PSAweEZGRDhGRjAwVSAmJiBtYWdpYzEgPD0gMHhGRkQ4RkZGRlUpIHsKKyAgICAgIGZvcm1hdCA9IFdFQlBfSlBFR19GT1JNQVQ7CisgICAgfSBlbHNlIGlmIChtYWdpYzEgPT0gMHg0OTQ5MkEwMCB8fCBtYWdpYzEgPT0gMHg0RDREMDAyQSkgeworICAgICAgZm9ybWF0ID0gV0VCUF9USUZGX0ZPUk1BVDsKKyAgICB9IGVsc2UgaWYgKG1hZ2ljMSA9PSAweDUyNDk0NjQ2ICYmIG1hZ2ljMiA9PSAweDU3NDU0MjUwKSB7CisgICAgICBmb3JtYXQgPSBXRUJQX1dFQlBfRk9STUFUOworICAgIH0gZWxzZSBpZiAoKChtYWdpYzEgPj4gMjQpICYgMHhmZikgPT0gJ1AnKSB7CisgICAgICBjb25zdCBpbnQgdHlwZSA9IChtYWdpYzEgPj4gMTYpICYgMHhmZjsKKyAgICAgIC8vIHdlIG9ubHkgc3VwcG9ydCAnUDUgLT4gUDcnIGZvciBub3cuCisgICAgICBpZiAodHlwZSA+PSAnNScgJiYgdHlwZSA8PSAnNycpIGZvcm1hdCA9IFdFQlBfUE5NX0ZPUk1BVDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZvcm1hdDsKK30KKworc3RhdGljIGludCBGYWlsUmVhZGVyKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGtlZXBfYWxwaGEsIHN0cnVjdCBNZXRhZGF0YSogY29uc3QgbWV0YWRhdGEpIHsKKyAgKHZvaWQpZGF0YTsKKyAgKHZvaWQpZGF0YV9zaXplOworICAodm9pZClwaWM7CisgICh2b2lkKWtlZXBfYWxwaGE7CisgICh2b2lkKW1ldGFkYXRhOworICByZXR1cm4gMDsKK30KKworV2ViUEltYWdlUmVhZGVyIFdlYlBHZXRJbWFnZVJlYWRlcihXZWJQSW5wdXRGaWxlRm9ybWF0IGZvcm1hdCkgeworICBzd2l0Y2ggKGZvcm1hdCkgeworICAgIGNhc2UgV0VCUF9QTkdfRk9STUFUOiByZXR1cm4gUmVhZFBORzsKKyAgICBjYXNlIFdFQlBfSlBFR19GT1JNQVQ6IHJldHVybiBSZWFkSlBFRzsKKyAgICBjYXNlIFdFQlBfVElGRl9GT1JNQVQ6IHJldHVybiBSZWFkVElGRjsKKyAgICBjYXNlIFdFQlBfV0VCUF9GT1JNQVQ6IHJldHVybiBSZWFkV2ViUDsKKyAgICBjYXNlIFdFQlBfUE5NX0ZPUk1BVDogcmV0dXJuIFJlYWRQTk07CisgICAgZGVmYXVsdDogcmV0dXJuIEZhaWxSZWFkZXI7CisgIH0KK30KKworV2ViUEltYWdlUmVhZGVyIFdlYlBHdWVzc0ltYWdlUmVhZGVyKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRhdGFfc2l6ZSkgeworICByZXR1cm4gV2ViUEdldEltYWdlUmVhZGVyKFdlYlBHdWVzc0ltYWdlVHlwZShkYXRhLCBkYXRhX3NpemUpKTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vaW1hZ2VfZGVjLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL2ltYWdlX2RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNDExZTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL2ltYWdlX2RlYy5oCkBAIC0wLDAgKzEsNjcgQEAKKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgQWxsLWluLW9uZSBsaWJyYXJ5IHRvIGRlY29kZSBQTkcvSlBFRy9XZWJQL1RJRkYvV0lDIGlucHV0IGltYWdlcy4KKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaWZuZGVmIFdFQlBfSU1BR0VJT19JTUFHRV9ERUNfSF8KKyNkZWZpbmUgV0VCUF9JTUFHRUlPX0lNQUdFX0RFQ19IXworCisjaW5jbHVkZSAid2VicC90eXBlcy5oIgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgIndlYnAvY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgIi4vbWV0YWRhdGEuaCIKKyNpbmNsdWRlICIuL2pwZWdkZWMuaCIKKyNpbmNsdWRlICIuL3BuZ2RlYy5oIgorI2luY2x1ZGUgIi4vcG5tZGVjLmgiCisjaW5jbHVkZSAiLi90aWZmZGVjLmgiCisjaW5jbHVkZSAiLi93ZWJwZGVjLmgiCisjaW5jbHVkZSAiLi93aWNkZWMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit0eXBlZGVmIGVudW0geworICBXRUJQX1BOR19GT1JNQVQgPSAwLAorICBXRUJQX0pQRUdfRk9STUFULAorICBXRUJQX1RJRkZfRk9STUFULAorICBXRUJQX1dFQlBfRk9STUFULAorICBXRUJQX1BOTV9GT1JNQVQsCisgIFdFQlBfVU5TVVBQT1JURURfRk9STUFUCit9IFdlYlBJbnB1dEZpbGVGb3JtYXQ7CisKKy8vIFRyeSB0byBpbmZlciB0aGUgaW1hZ2UgZm9ybWF0LiAnZGF0YV9zaXplJyBzaG91bGQgYmUgbGFyZ2VyIHRoYW4gMTIuCisvLyBSZXR1cm5zIFdFQlBfVU5TVVBQT1JURURfRk9STUFUIGlmIGZvcm1hdCBjYW4ndCBiZSBndWVzcyBzYWZlbHkuCitXZWJQSW5wdXRGaWxlRm9ybWF0IFdlYlBHdWVzc0ltYWdlVHlwZShjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRhdGFfc2l6ZSk7CisKKy8vIFNpZ25hdHVyZSBmb3IgY29tbW9uIGltYWdlLXJlYWRpbmcgZnVuY3Rpb25zIChSZWFkUE5HLCBSZWFkSlBFRywgLi4uKQordHlwZWRlZiBpbnQgKCpXZWJQSW1hZ2VSZWFkZXIpKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGtlZXBfYWxwaGEsIHN0cnVjdCBNZXRhZGF0YSogY29uc3QgbWV0YWRhdGEpOworCisvLyBSZXR1cm4gdGhlIHJlYWRlciBhc3NvY2lhdGVkIHRvIGEgZ2l2ZW4gZmlsZSBmb3JtYXQuCitXZWJQSW1hZ2VSZWFkZXIgV2ViUEdldEltYWdlUmVhZGVyKFdlYlBJbnB1dEZpbGVGb3JtYXQgZm9ybWF0KTsKKworLy8gVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIFdlYlBHdWVzc0ltYWdlVHlwZSgpLCBidXQgcmV0dXJucyBhCisvLyBzdWl0YWJsZSByZWFkZXIgZnVuY3Rpb24uIFRoZSByZXR1cm5lZCByZWFkZXIgaXMgbmV2ZXIgTlVMTCwgYnV0CisvLyB1bmtub3duIGZvcm1hdHMgd2lsbCByZXR1cm4gYW4gYWx3YXlzLWZhaWxpbmcgdmFsaWQgcmVhZGVyLgorV2ViUEltYWdlUmVhZGVyIFdlYlBHdWVzc0ltYWdlUmVhZGVyKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRhdGFfc2l6ZSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvLyBXRUJQX0lNQUdFSU9fSU1BR0VfREVDX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL2ltYWdlX2VuYy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby9pbWFnZV9lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDEzNDkwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby9pbWFnZV9lbmMuYwpAQCAtMCwwICsxLDU5OSBAQAorLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFNhdmUgaW1hZ2UKKworI2luY2x1ZGUgIi4vaW1hZ2VfZW5jLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmZGVmIFdFQlBfSEFWRV9QTkcKKyNpbmNsdWRlIDxwbmcuaD4KKyNpbmNsdWRlIDxzZXRqbXAuaD4gICAvLyBub3RlOiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgKmFmdGVyKiBwbmcuaAorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1dJTkNPREVDX0gKKyNpZmRlZiBfX01JTkdXMzJfXworI2RlZmluZSBJTklUR1VJRCAgLy8gV2l0aG91dCB0aGlzIEdVSURzIGFyZSBkZWNsYXJlZCBleHRlcm4gYW5kIGZhaWwgdG8gbGluaworI2VuZGlmCisjZGVmaW5lIENJTlRFUkZBQ0UKKyNkZWZpbmUgQ09CSk1BQ1JPUworI2RlZmluZSBfV0lOMzJfSUUgMHg1MDAgIC8vIFdvcmthcm91bmQgYnVnIGluIHNobHdhcGkuaCB3aGVuIGNvbXBpbGluZyBDKysKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2RlIHdpdGggQ09CSk1BQ1JPUy4KKyNpbmNsdWRlIDxvbGUyLmg+ICAvLyBDcmVhdGVTdHJlYW1PbkhHbG9iYWwoKQorI2luY2x1ZGUgPHNobHdhcGkuaD4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8d2luY29kZWMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiLi9pbWFnZWlvX3V0aWwuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFBORworCisjaWZkZWYgSEFWRV9XSU5DT0RFQ19ICisKKyNkZWZpbmUgSUZTKGZuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKFNVQ0NFRURFRChocikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGhyID0gKGZuKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaWYgKEZBSUxFRChocikpIGZwcmludGYoc3RkZXJyLCAjZm4gIiBmYWlsZWQgJTA4bHhcbiIsIGhyKTsgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2lmZGVmIF9fY3BsdXNwbHVzCisjZGVmaW5lIE1BS0VfUkVGR1VJRCh4KSAoeCkKKyNlbHNlCisjZGVmaW5lIE1BS0VfUkVGR1VJRCh4KSAmKHgpCisjZW5kaWYKKworc3RhdGljIEhSRVNVTFQgQ3JlYXRlT3V0cHV0U3RyZWFtKGNvbnN0IGNoYXIqIG91dF9maWxlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdyaXRlX3RvX21lbSwgSVN0cmVhbSoqIHN0cmVhbSkgeworICBIUkVTVUxUIGhyID0gU19PSzsKKyAgaWYgKHdyaXRlX3RvX21lbSkgeworICAgIC8vIE91dHB1dCB0byBhIG1lbW9yeSBidWZmZXIuIFRoaXMgaXMgZnJlZWQgd2hlbiAnc3RyZWFtJyBpcyByZWxlYXNlZC4KKyAgICBJRlMoQ3JlYXRlU3RyZWFtT25IR2xvYmFsKE5VTEwsIFRSVUUsIHN0cmVhbSkpOworICB9IGVsc2UgeworICAgIElGUyhTSENyZWF0ZVN0cmVhbU9uRmlsZUEob3V0X2ZpbGVfbmFtZSwgU1RHTV9XUklURSB8IFNUR01fQ1JFQVRFLCBzdHJlYW0pKTsKKyAgfQorICBpZiAoRkFJTEVEKGhyKSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3Igb3BlbmluZyBvdXRwdXQgZmlsZSAlcyAoJTA4bHgpXG4iLAorICAgICAgICAgICAgb3V0X2ZpbGVfbmFtZSwgaHIpOworICB9CisgIHJldHVybiBocjsKK30KKworc3RhdGljIEhSRVNVTFQgV3JpdGVVc2luZ1dJQyhjb25zdCBjaGFyKiBvdXRfZmlsZV9uYW1lLCBpbnQgdXNlX3N0ZG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGR1VJRCBjb250YWluZXJfZ3VpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcmdiLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgaGFzX2FscGhhKSB7CisgIEhSRVNVTFQgaHIgPSBTX09LOworICBJV0lDSW1hZ2luZ0ZhY3RvcnkqIGZhY3RvcnkgPSBOVUxMOworICBJV0lDQml0bWFwRnJhbWVFbmNvZGUqIGZyYW1lID0gTlVMTDsKKyAgSVdJQ0JpdG1hcEVuY29kZXIqIGVuY29kZXIgPSBOVUxMOworICBJU3RyZWFtKiBzdHJlYW0gPSBOVUxMOworICBXSUNQaXhlbEZvcm1hdEdVSUQgcGl4ZWxfZm9ybWF0ID0gaGFzX2FscGhhID8gR1VJRF9XSUNQaXhlbEZvcm1hdDMyYnBwQkdSQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogR1VJRF9XSUNQaXhlbEZvcm1hdDI0YnBwQkdSOworCisgIGlmIChvdXRfZmlsZV9uYW1lID09IE5VTEwgfHwgcmdiID09IE5VTEwpIHJldHVybiBFX0lOVkFMSURBUkc7CisKKyAgSUZTKENvSW5pdGlhbGl6ZShOVUxMKSk7CisgIElGUyhDb0NyZWF0ZUluc3RhbmNlKE1BS0VfUkVGR1VJRChDTFNJRF9XSUNJbWFnaW5nRmFjdG9yeSksIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgIENMU0NUWF9JTlBST0NfU0VSVkVSLAorICAgICAgICAgICAgICAgICAgICAgICBNQUtFX1JFRkdVSUQoSUlEX0lXSUNJbWFnaW5nRmFjdG9yeSksCisgICAgICAgICAgICAgICAgICAgICAgIChMUFZPSUQqKSZmYWN0b3J5KSk7CisgIGlmIChociA9PSBSRUdEQl9FX0NMQVNTTk9UUkVHKSB7CisgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAiQ291bGRuJ3QgYWNjZXNzIFdpbmRvd3MgSW1hZ2luZyBDb21wb25lbnQgKGFyZSB5b3UgcnVubmluZyAiCisgICAgICAgICAgICAiV2luZG93cyBYUCBTUDMgb3IgbmV3ZXI/KS4gUE5HIHN1cHBvcnQgbm90IGF2YWlsYWJsZS4gIgorICAgICAgICAgICAgIlVzZSAtcHBtIG9yIC1wZ20gZm9yIGF2YWlsYWJsZSBQUE0gYW5kIFBHTSBmb3JtYXRzLlxuIik7CisgIH0KKyAgSUZTKENyZWF0ZU91dHB1dFN0cmVhbShvdXRfZmlsZV9uYW1lLCB1c2Vfc3Rkb3V0LCAmc3RyZWFtKSk7CisgIElGUyhJV0lDSW1hZ2luZ0ZhY3RvcnlfQ3JlYXRlRW5jb2RlcihmYWN0b3J5LCBjb250YWluZXJfZ3VpZCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGVyKSk7CisgIElGUyhJV0lDQml0bWFwRW5jb2Rlcl9Jbml0aWFsaXplKGVuY29kZXIsIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lDQml0bWFwRW5jb2Rlck5vQ2FjaGUpKTsKKyAgSUZTKElXSUNCaXRtYXBFbmNvZGVyX0NyZWF0ZU5ld0ZyYW1lKGVuY29kZXIsICZmcmFtZSwgTlVMTCkpOworICBJRlMoSVdJQ0JpdG1hcEZyYW1lRW5jb2RlX0luaXRpYWxpemUoZnJhbWUsIE5VTEwpKTsKKyAgSUZTKElXSUNCaXRtYXBGcmFtZUVuY29kZV9TZXRTaXplKGZyYW1lLCB3aWR0aCwgaGVpZ2h0KSk7CisgIElGUyhJV0lDQml0bWFwRnJhbWVFbmNvZGVfU2V0UGl4ZWxGb3JtYXQoZnJhbWUsICZwaXhlbF9mb3JtYXQpKTsKKyAgSUZTKElXSUNCaXRtYXBGcmFtZUVuY29kZV9Xcml0ZVBpeGVscyhmcmFtZSwgaGVpZ2h0LCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ICogc3RyaWRlLCByZ2IpKTsKKyAgSUZTKElXSUNCaXRtYXBGcmFtZUVuY29kZV9Db21taXQoZnJhbWUpKTsKKyAgSUZTKElXSUNCaXRtYXBFbmNvZGVyX0NvbW1pdChlbmNvZGVyKSk7CisKKyAgaWYgKFNVQ0NFRURFRChocikgJiYgdXNlX3N0ZG91dCkgeworICAgIEhHTE9CQUwgaW1hZ2U7CisgICAgSUZTKEdldEhHbG9iYWxGcm9tU3RyZWFtKHN0cmVhbSwgJmltYWdlKSk7CisgICAgaWYgKFNVQ0NFRURFRChocikpIHsKKyAgICAgIEhBTkRMRSBzdGRfb3V0cHV0ID0gR2V0U3RkSGFuZGxlKFNURF9PVVRQVVRfSEFORExFKTsKKyAgICAgIERXT1JEIG1vZGU7CisgICAgICBjb25zdCBCT09MIHVwZGF0ZV9tb2RlID0gR2V0Q29uc29sZU1vZGUoc3RkX291dHB1dCwgJm1vZGUpOworICAgICAgY29uc3Qgdm9pZCogY29uc3QgaW1hZ2VfbWVtID0gR2xvYmFsTG9jayhpbWFnZSk7CisgICAgICBEV09SRCBieXRlc193cml0dGVuID0gMDsKKworICAgICAgLy8gQ2xlYXIgb3V0cHV0IHByb2Nlc3NpbmcgaWYgbmVjZXNzYXJ5LCB0aGVuIG91dHB1dCB0aGUgaW1hZ2UuCisgICAgICBpZiAodXBkYXRlX21vZGUpIFNldENvbnNvbGVNb2RlKHN0ZF9vdXRwdXQsIDApOworICAgICAgaWYgKCFXcml0ZUZpbGUoc3RkX291dHB1dCwgaW1hZ2VfbWVtLCAoRFdPUkQpR2xvYmFsU2l6ZShpbWFnZSksCisgICAgICAgICAgICAgICAgICAgICAmYnl0ZXNfd3JpdHRlbiwgTlVMTCkgfHwKKyAgICAgICAgICBieXRlc193cml0dGVuICE9IEdsb2JhbFNpemUoaW1hZ2UpKSB7CisgICAgICAgIGhyID0gRV9GQUlMOworICAgICAgfQorICAgICAgaWYgKHVwZGF0ZV9tb2RlKSBTZXRDb25zb2xlTW9kZShzdGRfb3V0cHV0LCBtb2RlKTsKKyAgICAgIEdsb2JhbFVubG9jayhpbWFnZSk7CisgICAgfQorICB9CisKKyAgaWYgKGZyYW1lICE9IE5VTEwpIElVbmtub3duX1JlbGVhc2UoZnJhbWUpOworICBpZiAoZW5jb2RlciAhPSBOVUxMKSBJVW5rbm93bl9SZWxlYXNlKGVuY29kZXIpOworICBpZiAoZmFjdG9yeSAhPSBOVUxMKSBJVW5rbm93bl9SZWxlYXNlKGZhY3RvcnkpOworICBpZiAoc3RyZWFtICE9IE5VTEwpIElVbmtub3duX1JlbGVhc2Uoc3RyZWFtKTsKKyAgcmV0dXJuIGhyOworfQorCitpbnQgV2ViUFdyaXRlUE5HKGNvbnN0IGNoYXIqIG91dF9maWxlX25hbWUsIGludCB1c2Vfc3Rkb3V0LAorICAgICAgICAgICAgICAgICBjb25zdCBXZWJQRGVjQnVmZmVyKiBjb25zdCBidWZmZXIpIHsKKyAgY29uc3QgdWludDMyX3Qgd2lkdGggPSBidWZmZXItPndpZHRoOworICBjb25zdCB1aW50MzJfdCBoZWlnaHQgPSBidWZmZXItPmhlaWdodDsKKyAgdWludDhfdCogY29uc3QgcmdiID0gYnVmZmVyLT51LlJHQkEucmdiYTsKKyAgY29uc3QgaW50IHN0cmlkZSA9IGJ1ZmZlci0+dS5SR0JBLnN0cmlkZTsKKyAgY29uc3QgaW50IGhhc19hbHBoYSA9IFdlYlBJc0FscGhhTW9kZShidWZmZXItPmNvbG9yc3BhY2UpOworCisgIHJldHVybiBTVUNDRUVERUQoV3JpdGVVc2luZ1dJQyhvdXRfZmlsZV9uYW1lLCB1c2Vfc3Rkb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFLRV9SRUZHVUlEKEdVSURfQ29udGFpbmVyRm9ybWF0UG5nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYiwgc3RyaWRlLCB3aWR0aCwgaGVpZ2h0LCBoYXNfYWxwaGEpKTsKK30KKworI2VsaWYgZGVmaW5lZChXRUJQX0hBVkVfUE5HKSAgICAvLyAhSEFWRV9XSU5DT0RFQ19ICitzdGF0aWMgdm9pZCBQTkdBUEkgUE5HRXJyb3JGdW5jdGlvbihwbmdfc3RydWN0cCBwbmcsIHBuZ19jb25zdF9jaGFycCBkdW1teSkgeworICAodm9pZClkdW1teTsgIC8vIHJlbW92ZSB2YXJpYWJsZS11bnVzZWQgd2FybmluZworICBsb25nam1wKHBuZ19qbXBidWYocG5nKSwgMSk7Cit9CisKK2ludCBXZWJQV3JpdGVQTkcoRklMRSogb3V0X2ZpbGUsIGNvbnN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IGJ1ZmZlcikgeworICB2b2xhdGlsZSBwbmdfc3RydWN0cCBwbmc7CisgIHZvbGF0aWxlIHBuZ19pbmZvcCBpbmZvOworCisgIGlmIChvdXRfZmlsZSA9PSBOVUxMIHx8IGJ1ZmZlciA9PSBOVUxMKSByZXR1cm4gMDsKKworICBwbmcgPSBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIFBOR0Vycm9yRnVuY3Rpb24sIE5VTEwpOworICBpZiAocG5nID09IE5VTEwpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpbmZvID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdChwbmcpOworICBpZiAoaW5mbyA9PSBOVUxMKSB7CisgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KChwbmdfc3RydWN0cHApJnBuZywgTlVMTCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKHNldGptcChwbmdfam1wYnVmKHBuZykpKSB7CisgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KChwbmdfc3RydWN0cHApJnBuZywgKHBuZ19pbmZvcHApJmluZm8pOworICAgIHJldHVybiAwOworICB9CisgIHBuZ19pbml0X2lvKHBuZywgb3V0X2ZpbGUpOworICB7CisgICAgY29uc3QgdWludDMyX3Qgd2lkdGggPSBidWZmZXItPndpZHRoOworICAgIGNvbnN0IHVpbnQzMl90IGhlaWdodCA9IGJ1ZmZlci0+aGVpZ2h0OworICAgIHBuZ19ieXRlcCByb3cgPSBidWZmZXItPnUuUkdCQS5yZ2JhOworICAgIGNvbnN0IGludCBzdHJpZGUgPSBidWZmZXItPnUuUkdCQS5zdHJpZGU7CisgICAgY29uc3QgaW50IGhhc19hbHBoYSA9IFdlYlBJc0FscGhhTW9kZShidWZmZXItPmNvbG9yc3BhY2UpOworICAgIHVpbnQzMl90IHk7CisKKyAgICBwbmdfc2V0X0lIRFIocG5nLCBpbmZvLCB3aWR0aCwgaGVpZ2h0LCA4LAorICAgICAgICAgICAgICAgICBoYXNfYWxwaGEgPyBQTkdfQ09MT1JfVFlQRV9SR0JBIDogUE5HX0NPTE9SX1RZUEVfUkdCLAorICAgICAgICAgICAgICAgICBQTkdfSU5URVJMQUNFX05PTkUsIFBOR19DT01QUkVTU0lPTl9UWVBFX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgIFBOR19GSUxURVJfVFlQRV9ERUZBVUxUKTsKKyAgICBwbmdfd3JpdGVfaW5mbyhwbmcsIGluZm8pOworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgeworICAgICAgcG5nX3dyaXRlX3Jvd3MocG5nLCAmcm93LCAxKTsKKyAgICAgIHJvdyArPSBzdHJpZGU7CisgICAgfQorICB9CisgIHBuZ193cml0ZV9lbmQocG5nLCBpbmZvKTsKKyAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KChwbmdfc3RydWN0cHApJnBuZywgKHBuZ19pbmZvcHApJmluZm8pOworICByZXR1cm4gMTsKK30KKyNlbHNlICAgIC8vICFIQVZFX1dJTkNPREVDX0ggJiYgIVdFQlBfSEFWRV9QTkcKK2ludCBXZWJQV3JpdGVQTkcoRklMRSogZm91dCwgY29uc3QgV2ViUERlY0J1ZmZlciogY29uc3QgYnVmZmVyKSB7CisgIGlmIChmb3V0ID09IE5VTEwgfHwgYnVmZmVyID09IE5VTEwpIHJldHVybiAwOworCisgIGZwcmludGYoc3RkZXJyLCAiUE5HIHN1cHBvcnQgbm90IGNvbXBpbGVkLiBQbGVhc2UgaW5zdGFsbCB0aGUgbGlicG5nICIKKyAgICAgICAgICAiZGV2ZWxvcG1lbnQgcGFja2FnZSBiZWZvcmUgYnVpbGRpbmcuXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICJZb3UgY2FuIHJ1biB3aXRoIC1wcG0gZmxhZyB0byBkZWNvZGUgaW4gUFBNIGZvcm1hdC5cbiIpOworICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUFBNIC8gUEFNCisKK3N0YXRpYyBpbnQgV3JpdGVQUE1QQU0oRklMRSogZm91dCwgY29uc3QgV2ViUERlY0J1ZmZlciogY29uc3QgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGEpIHsKKyAgaWYgKGZvdXQgPT0gTlVMTCB8fCBidWZmZXIgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9IGVsc2UgeworICAgIGNvbnN0IHVpbnQzMl90IHdpZHRoID0gYnVmZmVyLT53aWR0aDsKKyAgICBjb25zdCB1aW50MzJfdCBoZWlnaHQgPSBidWZmZXItPmhlaWdodDsKKyAgICBjb25zdCB1aW50OF90KiByb3cgPSBidWZmZXItPnUuUkdCQS5yZ2JhOworICAgIGNvbnN0IGludCBzdHJpZGUgPSBidWZmZXItPnUuUkdCQS5zdHJpZGU7CisgICAgY29uc3Qgc2l6ZV90IGJ5dGVzX3Blcl9weCA9IGFscGhhID8gNCA6IDM7CisgICAgdWludDMyX3QgeTsKKworICAgIGlmIChyb3cgPT0gTlVMTCkgcmV0dXJuIDA7CisKKyAgICBpZiAoYWxwaGEpIHsKKyAgICAgIGZwcmludGYoZm91dCwgIlA3XG5XSURUSCAldVxuSEVJR0hUICV1XG5ERVBUSCA0XG5NQVhWQUwgMjU1XG4iCisgICAgICAgICAgICAgICAgICAgICJUVVBMVFlQRSBSR0JfQUxQSEFcbkVOREhEUlxuIiwgd2lkdGgsIGhlaWdodCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGZwcmludGYoZm91dCwgIlA2XG4ldSAldVxuMjU1XG4iLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICB9CisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CisgICAgICBpZiAoZndyaXRlKHJvdywgd2lkdGgsIGJ5dGVzX3Blcl9weCwgZm91dCkgIT0gYnl0ZXNfcGVyX3B4KSB7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgcm93ICs9IHN0cmlkZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK2ludCBXZWJQV3JpdGVQUE0oRklMRSogZm91dCwgY29uc3QgV2ViUERlY0J1ZmZlciogY29uc3QgYnVmZmVyKSB7CisgIHJldHVybiBXcml0ZVBQTVBBTShmb3V0LCBidWZmZXIsIDApOworfQorCitpbnQgV2ViUFdyaXRlUEFNKEZJTEUqIGZvdXQsIGNvbnN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IGJ1ZmZlcikgeworICByZXR1cm4gV3JpdGVQUE1QQU0oZm91dCwgYnVmZmVyLCAxKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJhdyBQR00KKworLy8gU2F2ZSAxNmIgbW9kZSAoUkdCQTQ0NDQsIFJHQjU2NSwgLi4uKSBmb3IgZGVidWdnaW5nIHB1cnBvc2UuCitpbnQgV2ViUFdyaXRlMTZiQXNQR00oRklMRSogZm91dCwgY29uc3QgV2ViUERlY0J1ZmZlciogY29uc3QgYnVmZmVyKSB7CisgIGNvbnN0IHVpbnQzMl90IHdpZHRoID0gYnVmZmVyLT53aWR0aDsKKyAgY29uc3QgdWludDMyX3QgaGVpZ2h0ID0gYnVmZmVyLT5oZWlnaHQ7CisgIGNvbnN0IHVpbnQ4X3QqIHJnYmEgPSBidWZmZXItPnUuUkdCQS5yZ2JhOworICBjb25zdCBpbnQgc3RyaWRlID0gYnVmZmVyLT51LlJHQkEuc3RyaWRlOworICBjb25zdCB1aW50MzJfdCBieXRlc19wZXJfcHggPSAyOworICB1aW50MzJfdCB5OworCisgIGlmIChmb3V0ID09IE5VTEwgfHwgYnVmZmVyID09IE5VTEwgfHwgcmdiYSA9PSBOVUxMKSByZXR1cm4gMDsKKworICBmcHJpbnRmKGZvdXQsICJQNVxuJXUgJXVcbjI1NVxuIiwgd2lkdGggKiBieXRlc19wZXJfcHgsIGhlaWdodCk7CisgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgeworICAgIGlmIChmd3JpdGUocmdiYSwgd2lkdGgsIGJ5dGVzX3Blcl9weCwgZm91dCkgIT0gYnl0ZXNfcGVyX3B4KSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmdiYSArPSBzdHJpZGU7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBCTVAKKworc3RhdGljIHZvaWQgUHV0TEUxNih1aW50OF90KiBjb25zdCBkc3QsIHVpbnQzMl90IHZhbHVlKSB7CisgIGRzdFswXSA9ICh2YWx1ZSA+PiAwKSAmIDB4ZmY7CisgIGRzdFsxXSA9ICh2YWx1ZSA+PiA4KSAmIDB4ZmY7Cit9CisKK3N0YXRpYyB2b2lkIFB1dExFMzIodWludDhfdCogY29uc3QgZHN0LCB1aW50MzJfdCB2YWx1ZSkgeworICBQdXRMRTE2KGRzdCArIDAsICh2YWx1ZSA+PiAgMCkgJiAweGZmZmYpOworICBQdXRMRTE2KGRzdCArIDIsICh2YWx1ZSA+PiAxNikgJiAweGZmZmYpOworfQorCisjZGVmaW5lIEJNUF9IRUFERVJfU0laRSA1NAoraW50IFdlYlBXcml0ZUJNUChGSUxFKiBmb3V0LCBjb25zdCBXZWJQRGVjQnVmZmVyKiBjb25zdCBidWZmZXIpIHsKKyAgY29uc3QgaW50IGhhc19hbHBoYSA9IFdlYlBJc0FscGhhTW9kZShidWZmZXItPmNvbG9yc3BhY2UpOworICBjb25zdCB1aW50MzJfdCB3aWR0aCA9IGJ1ZmZlci0+d2lkdGg7CisgIGNvbnN0IHVpbnQzMl90IGhlaWdodCA9IGJ1ZmZlci0+aGVpZ2h0OworICBjb25zdCB1aW50OF90KiByZ2JhID0gYnVmZmVyLT51LlJHQkEucmdiYTsKKyAgY29uc3QgaW50IHN0cmlkZSA9IGJ1ZmZlci0+dS5SR0JBLnN0cmlkZTsKKyAgY29uc3QgdWludDMyX3QgYnl0ZXNfcGVyX3B4ID0gaGFzX2FscGhhID8gNCA6IDM7CisgIHVpbnQzMl90IHk7CisgIGNvbnN0IHVpbnQzMl90IGxpbmVfc2l6ZSA9IGJ5dGVzX3Blcl9weCAqIHdpZHRoOworICBjb25zdCB1aW50MzJfdCBibXBfc3RyaWRlID0gKGxpbmVfc2l6ZSArIDMpICYgfjM7ICAgLy8gcGFkIHRvIDQKKyAgY29uc3QgdWludDMyX3QgdG90YWxfc2l6ZSA9IGJtcF9zdHJpZGUgKiBoZWlnaHQgKyBCTVBfSEVBREVSX1NJWkU7CisgIHVpbnQ4X3QgYm1wX2hlYWRlcltCTVBfSEVBREVSX1NJWkVdID0geyAwIH07CisKKyAgaWYgKGZvdXQgPT0gTlVMTCB8fCBidWZmZXIgPT0gTlVMTCB8fCByZ2JhID09IE5VTEwpIHJldHVybiAwOworCisgIC8vIGJpdG1hcCBmaWxlIGhlYWRlcgorICBQdXRMRTE2KGJtcF9oZWFkZXIgKyAwLCAweDRkNDIpOyAgICAgICAgICAgICAgICAvLyBzaWduYXR1cmUgJ0JNJworICBQdXRMRTMyKGJtcF9oZWFkZXIgKyAyLCB0b3RhbF9zaXplKTsgICAgICAgICAgICAvLyBzaXplIGluY2x1ZGluZyBoZWFkZXIKKyAgUHV0TEUzMihibXBfaGVhZGVyICsgNiwgMCk7ICAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXJ2ZWQKKyAgUHV0TEUzMihibXBfaGVhZGVyICsgMTAsIEJNUF9IRUFERVJfU0laRSk7ICAgICAgLy8gb2Zmc2V0IHRvIHBpeGVsIGFycmF5CisgIC8vIGJpdG1hcCBpbmZvIGhlYWRlcgorICBQdXRMRTMyKGJtcF9oZWFkZXIgKyAxNCwgNDApOyAgICAgICAgICAgICAgICAgICAvLyBESUIgaGVhZGVyIHNpemUKKyAgUHV0TEUzMihibXBfaGVhZGVyICsgMTgsIHdpZHRoKTsgICAgICAgICAgICAgICAgLy8gZGltZW5zaW9ucworICBQdXRMRTMyKGJtcF9oZWFkZXIgKyAyMiwgLShpbnQpaGVpZ2h0KTsgICAgICAgICAvLyB2ZXJ0aWNhbCBmbGlwIQorICBQdXRMRTE2KGJtcF9oZWFkZXIgKyAyNiwgMSk7ICAgICAgICAgICAgICAgICAgICAvLyBudW1iZXIgb2YgcGxhbmVzCisgIFB1dExFMTYoYm1wX2hlYWRlciArIDI4LCBieXRlc19wZXJfcHggKiA4KTsgICAgIC8vIGJpdHMgcGVyIHBpeGVsCisgIFB1dExFMzIoYm1wX2hlYWRlciArIDMwLCAwKTsgICAgICAgICAgICAgICAgICAgIC8vIG5vIGNvbXByZXNzaW9uIChCSV9SR0IpCisgIFB1dExFMzIoYm1wX2hlYWRlciArIDM0LCAwKTsgICAgICAgICAgICAgICAgICAgIC8vIGltYWdlIHNpemUgKGR1bW15KQorICBQdXRMRTMyKGJtcF9oZWFkZXIgKyAzOCwgMjQwMCk7ICAgICAgICAgICAgICAgICAvLyB4IHBpeGVscy9tZXRlcgorICBQdXRMRTMyKGJtcF9oZWFkZXIgKyA0MiwgMjQwMCk7ICAgICAgICAgICAgICAgICAvLyB5IHBpeGVscy9tZXRlcgorICBQdXRMRTMyKGJtcF9oZWFkZXIgKyA0NiwgMCk7ICAgICAgICAgICAgICAgICAgICAvLyBudW1iZXIgb2YgcGFsZXR0ZSBjb2xvcnMKKyAgUHV0TEUzMihibXBfaGVhZGVyICsgNTAsIDApOyAgICAgICAgICAgICAgICAgICAgLy8gaW1wb3J0YW50IGNvbG9yIGNvdW50CisKKyAgLy8gVE9ETyhza2FsKTogY29sb3IgcHJvZmlsZQorCisgIC8vIHdyaXRlIGhlYWRlcgorICBpZiAoZndyaXRlKGJtcF9oZWFkZXIsIHNpemVvZihibXBfaGVhZGVyKSwgMSwgZm91dCkgIT0gMSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgLy8gd3JpdGUgcGl4ZWwgYXJyYXkKKyAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CisgICAgaWYgKGZ3cml0ZShyZ2JhLCBsaW5lX3NpemUsIDEsIGZvdXQpICE9IDEpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAvLyB3cml0ZSBwYWRkaW5nIHplcm9lcworICAgIGlmIChibXBfc3RyaWRlICE9IGxpbmVfc2l6ZSkgeworICAgICAgY29uc3QgdWludDhfdCB6ZXJvZXNbM10gPSB7IDAgfTsKKyAgICAgIGlmIChmd3JpdGUoemVyb2VzLCBibXBfc3RyaWRlIC0gbGluZV9zaXplLCAxLCBmb3V0KSAhPSAxKSB7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgIH0KKyAgICByZ2JhICs9IHN0cmlkZTsKKyAgfQorICByZXR1cm4gMTsKK30KKyN1bmRlZiBCTVBfSEVBREVSX1NJWkUKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRJRkYKKworI2RlZmluZSBOVU1fSUZEX0VOVFJJRVMgMTUKKyNkZWZpbmUgRVhUUkFfREFUQV9TSVpFIDE2CisvLyAxMGIgZm9yIHNpZ25hdHVyZS9oZWFkZXIgKyBuICogMTJiIGVudHJpZXMgKyA0YiBmb3IgSUZEIHRlcm1pbmF0b3I6CisjZGVmaW5lIEVYVFJBX0RBVEFfT0ZGU0VUICgxMCArIDEyICogTlVNX0lGRF9FTlRSSUVTICsgNCkKKyNkZWZpbmUgVElGRl9IRUFERVJfU0laRSAoRVhUUkFfREFUQV9PRkZTRVQgKyBFWFRSQV9EQVRBX1NJWkUpCisKK2ludCBXZWJQV3JpdGVUSUZGKEZJTEUqIGZvdXQsIGNvbnN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IGJ1ZmZlcikgeworICBjb25zdCBpbnQgaGFzX2FscGhhID0gV2ViUElzQWxwaGFNb2RlKGJ1ZmZlci0+Y29sb3JzcGFjZSk7CisgIGNvbnN0IHVpbnQzMl90IHdpZHRoID0gYnVmZmVyLT53aWR0aDsKKyAgY29uc3QgdWludDMyX3QgaGVpZ2h0ID0gYnVmZmVyLT5oZWlnaHQ7CisgIGNvbnN0IHVpbnQ4X3QqIHJnYmEgPSBidWZmZXItPnUuUkdCQS5yZ2JhOworICBjb25zdCBpbnQgc3RyaWRlID0gYnVmZmVyLT51LlJHQkEuc3RyaWRlOworICBjb25zdCB1aW50OF90IGJ5dGVzX3Blcl9weCA9IGhhc19hbHBoYSA/IDQgOiAzOworICBjb25zdCB1aW50OF90IGFzc29jX2FscGhhID0KKyAgICAgIFdlYlBJc1ByZW11bHRpcGxpZWRNb2RlKGJ1ZmZlci0+Y29sb3JzcGFjZSkgPyAxIDogMjsKKyAgLy8gRm9yIG5vbi1hbHBoYSBjYXNlLCB3ZSBvbWl0IHRhZyAweDE1MiAoRXh0cmFTYW1wbGVzKS4KKyAgY29uc3QgdWludDhfdCBudW1faWZkX2VudHJpZXMgPSBoYXNfYWxwaGEgPyBOVU1fSUZEX0VOVFJJRVMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBOVU1fSUZEX0VOVFJJRVMgLSAxOworICB1aW50OF90IHRpZmZfaGVhZGVyW1RJRkZfSEVBREVSX1NJWkVdID0geworICAgIDB4NDksIDB4NDksIDB4MmEsIDB4MDAsICAgLy8gbGl0dGxlIGVuZGlhbiBzaWduYXR1cmUKKyAgICA4LCAwLCAwLCAwLCAgICAgICAgICAgICAgIC8vIG9mZnNldCB0byB0aGUgdW5pcXVlIElGRCB0aGF0IGZvbGxvd3MKKyAgICAvLyBJRkQgKG9mZnNldCA9IDgpLiBFbnRyaWVzIG11c3QgYmUgd3JpdHRlbiBpbiBpbmNyZWFzaW5nIHRhZyBvcmRlci4KKyAgICBudW1faWZkX2VudHJpZXMsIDAsICAgICAgIC8vIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBJRkQgKDEyIGJ5dGVzIGVhY2gpLgorICAgIDB4MDAsIDB4MDEsIDMsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgIC8vICAxMDogV2lkdGggIChUQkQpCisgICAgMHgwMSwgMHgwMSwgMywgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgLy8gIDIyOiBIZWlnaHQgKFRCRCkKKyAgICAweDAyLCAweDAxLCAzLCAwLCBieXRlc19wZXJfcHgsIDAsIDAsIDAsICAgICAvLyAgMzQ6IEJpdHNQZXJTYW1wbGU6IDg4ODgKKyAgICAgICAgRVhUUkFfREFUQV9PRkZTRVQgKyAwLCAwLCAwLCAwLAorICAgIDB4MDMsIDB4MDEsIDMsIDAsIDEsIDAsIDAsIDAsIDEsIDAsIDAsIDAsICAgIC8vICA0NjogQ29tcHJlc3Npb246IG5vbmUKKyAgICAweDA2LCAweDAxLCAzLCAwLCAxLCAwLCAwLCAwLCAyLCAwLCAwLCAwLCAgICAvLyAgNTg6IFBob3RvbWV0cmljOiBSR0IKKyAgICAweDExLCAweDAxLCA0LCAwLCAxLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAvLyAgNzA6IFN0cmlwcyBvZmZzZXQ6CisgICAgICAgIFRJRkZfSEVBREVSX1NJWkUsIDAsIDAsIDAsICAgICAgICAgICAgICAgLy8gICAgICBkYXRhIGZvbGxvd3MgaGVhZGVyCisgICAgMHgxMiwgMHgwMSwgMywgMCwgMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgICAgLy8gIDgyOiBPcmllbnRhdGlvbjogdG9wbGVmdAorICAgIDB4MTUsIDB4MDEsIDMsIDAsIDEsIDAsIDAsIDAsICAgICAgICAgICAgICAgIC8vICA5NDogU2FtcGxlc1BlclBpeGVscworICAgICAgICBieXRlc19wZXJfcHgsIDAsIDAsIDAsCisgICAgMHgxNiwgMHgwMSwgMywgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgLy8gMTA2OiBSb3dzIHBlciBzdHJpcCAoVEJEKQorICAgIDB4MTcsIDB4MDEsIDQsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgIC8vIDExODogU3RyaXBCeXRlQ291bnQgKFRCRCkKKyAgICAweDFhLCAweDAxLCA1LCAwLCAxLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAvLyAxMzA6IFgtcmVzb2x1dGlvbgorICAgICAgICBFWFRSQV9EQVRBX09GRlNFVCArIDgsIDAsIDAsIDAsCisgICAgMHgxYiwgMHgwMSwgNSwgMCwgMSwgMCwgMCwgMCwgICAgICAgICAgICAgICAgLy8gMTQyOiBZLXJlc29sdXRpb24KKyAgICAgICAgRVhUUkFfREFUQV9PRkZTRVQgKyA4LCAwLCAwLCAwLAorICAgIDB4MWMsIDB4MDEsIDMsIDAsIDEsIDAsIDAsIDAsIDEsIDAsIDAsIDAsICAgIC8vIDE1NDogUGxhbmFyQ29uZmlndXJhdGlvbgorICAgIDB4MjgsIDB4MDEsIDMsIDAsIDEsIDAsIDAsIDAsIDIsIDAsIDAsIDAsICAgIC8vIDE2NjogUmVzb2x1dGlvblVuaXQgKGluY2gpCisgICAgMHg1MiwgMHgwMSwgMywgMCwgMSwgMCwgMCwgMCwKKyAgICAgICAgYXNzb2NfYWxwaGEsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAvLyAxNzg6IEV4dHJhU2FtcGxlczogcmdiQS9SR0JBCisgICAgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTkwOiBJRkQgdGVybWluYXRvcgorICAgIC8vIEVYVFJBX0RBVEFfT0ZGU0VUOgorICAgIDgsIDAsIDgsIDAsIDgsIDAsIDgsIDAsICAgICAgLy8gQml0c1BlclNhbXBsZQorICAgIDcyLCAwLCAwLCAwLCAxLCAwLCAwLCAwICAgICAgLy8gNzIgcGl4ZWxzL2luY2gsIGZvciBYL1ktcmVzb2x1dGlvbgorICB9OworICB1aW50MzJfdCB5OworCisgIGlmIChmb3V0ID09IE5VTEwgfHwgYnVmZmVyID09IE5VTEwgfHwgcmdiYSA9PSBOVUxMKSByZXR1cm4gMDsKKworICAvLyBGaWxsIHBsYWNlaG9sZGVycyBpbiBJRkQ6CisgIFB1dExFMzIodGlmZl9oZWFkZXIgKyAxMCArIDgsIHdpZHRoKTsKKyAgUHV0TEUzMih0aWZmX2hlYWRlciArIDIyICsgOCwgaGVpZ2h0KTsKKyAgUHV0TEUzMih0aWZmX2hlYWRlciArIDEwNiArIDgsIGhlaWdodCk7CisgIFB1dExFMzIodGlmZl9oZWFkZXIgKyAxMTggKyA4LCB3aWR0aCAqIGJ5dGVzX3Blcl9weCAqIGhlaWdodCk7CisgIGlmICghaGFzX2FscGhhKSBQdXRMRTMyKHRpZmZfaGVhZGVyICsgMTc4LCAwKTsgIC8vIElGRCB0ZXJtaW5hdG9yCisKKyAgLy8gd3JpdGUgaGVhZGVyCisgIGlmIChmd3JpdGUodGlmZl9oZWFkZXIsIHNpemVvZih0aWZmX2hlYWRlciksIDEsIGZvdXQpICE9IDEpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICAvLyB3cml0ZSBwaXhlbCB2YWx1ZXMKKyAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CisgICAgaWYgKGZ3cml0ZShyZ2JhLCBieXRlc19wZXJfcHgsIHdpZHRoLCBmb3V0KSAhPSB3aWR0aCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJnYmEgKz0gc3RyaWRlOworICB9CisKKyAgcmV0dXJuIDE7Cit9CisKKyN1bmRlZiBUSUZGX0hFQURFUl9TSVpFCisjdW5kZWYgRVhUUkFfREFUQV9PRkZTRVQKKyN1bmRlZiBFWFRSQV9EQVRBX1NJWkUKKyN1bmRlZiBOVU1fSUZEX0VOVFJJRVMKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJhdyBBbHBoYQorCitpbnQgV2ViUFdyaXRlQWxwaGFQbGFuZShGSUxFKiBmb3V0LCBjb25zdCBXZWJQRGVjQnVmZmVyKiBjb25zdCBidWZmZXIpIHsKKyAgaWYgKGZvdXQgPT0gTlVMTCB8fCBidWZmZXIgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9IGVsc2UgeworICAgIGNvbnN0IHVpbnQzMl90IHdpZHRoID0gYnVmZmVyLT53aWR0aDsKKyAgICBjb25zdCB1aW50MzJfdCBoZWlnaHQgPSBidWZmZXItPmhlaWdodDsKKyAgICBjb25zdCB1aW50OF90KiBhID0gYnVmZmVyLT51LllVVkEuYTsKKyAgICBjb25zdCBpbnQgYV9zdHJpZGUgPSBidWZmZXItPnUuWVVWQS5hX3N0cmlkZTsKKyAgICB1aW50MzJfdCB5OworCisgICAgaWYgKGEgPT0gTlVMTCkgcmV0dXJuIDA7CisKKyAgICBmcHJpbnRmKGZvdXQsICJQNVxuJXUgJXVcbjI1NVxuIiwgd2lkdGgsIGhlaWdodCk7CisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CisgICAgICBpZiAoZndyaXRlKGEsIHdpZHRoLCAxLCBmb3V0KSAhPSAxKSByZXR1cm4gMDsKKyAgICAgIGEgKz0gYV9zdHJpZGU7CisgICAgfQorICAgIHJldHVybiAxOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQR00gd2l0aCBJTUM0IGxheW91dAorCitpbnQgV2ViUFdyaXRlUEdNKEZJTEUqIGZvdXQsIGNvbnN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IGJ1ZmZlcikgeworICBpZiAoZm91dCA9PSBOVUxMIHx8IGJ1ZmZlciA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0gZWxzZSB7CisgICAgY29uc3QgaW50IHdpZHRoID0gYnVmZmVyLT53aWR0aDsKKyAgICBjb25zdCBpbnQgaGVpZ2h0ID0gYnVmZmVyLT5oZWlnaHQ7CisgICAgY29uc3QgV2ViUFlVVkFCdWZmZXIqIGNvbnN0IHl1diA9ICZidWZmZXItPnUuWVVWQTsKKyAgICBjb25zdCB1aW50OF90KiBzcmNfeSA9IHl1di0+eTsKKyAgICBjb25zdCB1aW50OF90KiBzcmNfdSA9IHl1di0+dTsKKyAgICBjb25zdCB1aW50OF90KiBzcmNfdiA9IHl1di0+djsKKyAgICBjb25zdCB1aW50OF90KiBzcmNfYSA9IHl1di0+YTsKKyAgICBjb25zdCBpbnQgdXZfd2lkdGggPSAod2lkdGggKyAxKSAvIDI7CisgICAgY29uc3QgaW50IHV2X2hlaWdodCA9IChoZWlnaHQgKyAxKSAvIDI7CisgICAgY29uc3QgaW50IGFfaGVpZ2h0ID0gKHNyY19hICE9IE5VTEwpID8gaGVpZ2h0IDogMDsKKyAgICBpbnQgb2sgPSAxOworICAgIGludCB5OworCisgICAgaWYgKHNyY195ID09IE5VTEwgfHwgc3JjX3UgPT0gTlVMTCB8fCBzcmNfdiA9PSBOVUxMKSByZXR1cm4gMDsKKworICAgIGZwcmludGYoZm91dCwgIlA1XG4lZCAlZFxuMjU1XG4iLAorICAgICAgICAgICAgKHdpZHRoICsgMSkgJiB+MSwgaGVpZ2h0ICsgdXZfaGVpZ2h0ICsgYV9oZWlnaHQpOworICAgIGZvciAoeSA9IDA7IG9rICYmIHkgPCBoZWlnaHQ7ICsreSkgeworICAgICAgb2sgJj0gKGZ3cml0ZShzcmNfeSwgd2lkdGgsIDEsIGZvdXQpID09IDEpOworICAgICAgaWYgKHdpZHRoICYgMSkgZnB1dGMoMCwgZm91dCk7ICAgIC8vIHBhZGRpbmcgYnl0ZQorICAgICAgc3JjX3kgKz0geXV2LT55X3N0cmlkZTsKKyAgICB9CisgICAgZm9yICh5ID0gMDsgb2sgJiYgeSA8IHV2X2hlaWdodDsgKyt5KSB7CisgICAgICBvayAmPSAoZndyaXRlKHNyY191LCB1dl93aWR0aCwgMSwgZm91dCkgPT0gMSk7CisgICAgICBvayAmPSAoZndyaXRlKHNyY192LCB1dl93aWR0aCwgMSwgZm91dCkgPT0gMSk7CisgICAgICBzcmNfdSArPSB5dXYtPnVfc3RyaWRlOworICAgICAgc3JjX3YgKz0geXV2LT52X3N0cmlkZTsKKyAgICB9CisgICAgZm9yICh5ID0gMDsgb2sgJiYgeSA8IGFfaGVpZ2h0OyArK3kpIHsKKyAgICAgIG9rICY9IChmd3JpdGUoc3JjX2EsIHdpZHRoLCAxLCBmb3V0KSA9PSAxKTsKKyAgICAgIGlmICh3aWR0aCAmIDEpIGZwdXRjKDAsIGZvdXQpOyAgICAvLyBwYWRkaW5nIGJ5dGUKKyAgICAgIHNyY19hICs9IHl1di0+YV9zdHJpZGU7CisgICAgfQorICAgIHJldHVybiBvazsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUmF3IFlVVihBKSBwbGFuZXMKKworaW50IFdlYlBXcml0ZVlVVihGSUxFKiBmb3V0LCBjb25zdCBXZWJQRGVjQnVmZmVyKiBjb25zdCBidWZmZXIpIHsKKyAgaWYgKGZvdXQgPT0gTlVMTCB8fCBidWZmZXIgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9IGVsc2UgeworICAgIGNvbnN0IGludCB3aWR0aCA9IGJ1ZmZlci0+d2lkdGg7CisgICAgY29uc3QgaW50IGhlaWdodCA9IGJ1ZmZlci0+aGVpZ2h0OworICAgIGNvbnN0IFdlYlBZVVZBQnVmZmVyKiBjb25zdCB5dXYgPSAmYnVmZmVyLT51LllVVkE7CisgICAgY29uc3QgdWludDhfdCogc3JjX3kgPSB5dXYtPnk7CisgICAgY29uc3QgdWludDhfdCogc3JjX3UgPSB5dXYtPnU7CisgICAgY29uc3QgdWludDhfdCogc3JjX3YgPSB5dXYtPnY7CisgICAgY29uc3QgdWludDhfdCogc3JjX2EgPSB5dXYtPmE7CisgICAgY29uc3QgaW50IHV2X3dpZHRoID0gKHdpZHRoICsgMSkgLyAyOworICAgIGNvbnN0IGludCB1dl9oZWlnaHQgPSAoaGVpZ2h0ICsgMSkgLyAyOworICAgIGNvbnN0IGludCBhX2hlaWdodCA9IChzcmNfYSAhPSBOVUxMKSA/IGhlaWdodCA6IDA7CisgICAgaW50IG9rID0gMTsKKyAgICBpbnQgeTsKKworICAgIGlmIChzcmNfeSA9PSBOVUxMIHx8IHNyY191ID09IE5VTEwgfHwgc3JjX3YgPT0gTlVMTCkgcmV0dXJuIDA7CisKKyAgICBmb3IgKHkgPSAwOyBvayAmJiB5IDwgaGVpZ2h0OyArK3kpIHsKKyAgICAgIG9rICY9IChmd3JpdGUoc3JjX3ksIHdpZHRoLCAxLCBmb3V0KSA9PSAxKTsKKyAgICAgIHNyY195ICs9IHl1di0+eV9zdHJpZGU7CisgICAgfQorICAgIGZvciAoeSA9IDA7IG9rICYmIHkgPCB1dl9oZWlnaHQ7ICsreSkgeworICAgICAgb2sgJj0gKGZ3cml0ZShzcmNfdSwgdXZfd2lkdGgsIDEsIGZvdXQpID09IDEpOworICAgICAgc3JjX3UgKz0geXV2LT51X3N0cmlkZTsKKyAgICB9CisgICAgZm9yICh5ID0gMDsgb2sgJiYgeSA8IHV2X2hlaWdodDsgKyt5KSB7CisgICAgICBvayAmPSAoZndyaXRlKHNyY192LCB1dl93aWR0aCwgMSwgZm91dCkgPT0gMSk7CisgICAgICBzcmNfdiArPSB5dXYtPnZfc3RyaWRlOworICAgIH0KKyAgICBmb3IgKHkgPSAwOyBvayAmJiB5IDwgYV9oZWlnaHQ7ICsreSkgeworICAgICAgb2sgJj0gKGZ3cml0ZShzcmNfYSwgd2lkdGgsIDEsIGZvdXQpID09IDEpOworICAgICAgc3JjX2EgKz0geXV2LT5hX3N0cmlkZTsKKyAgICB9CisgICAgcmV0dXJuIG9rOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBHZW5lcmljIHRvcC1sZXZlbCBjYWxsCisKK2ludCBXZWJQU2F2ZUltYWdlKGNvbnN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgIFdlYlBPdXRwdXRGaWxlRm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbnN0IG91dF9maWxlX25hbWUpIHsKKyAgRklMRSogZm91dCA9IE5VTEw7CisgIGludCBuZWVkc19vcGVuX2ZpbGUgPSAxOworICBjb25zdCBpbnQgdXNlX3N0ZG91dCA9IChvdXRfZmlsZV9uYW1lICE9IE5VTEwpICYmICFzdHJjbXAob3V0X2ZpbGVfbmFtZSwgIi0iKTsKKyAgaW50IG9rID0gMTsKKworICBpZiAoYnVmZmVyID09IE5VTEwgfHwgb3V0X2ZpbGVfbmFtZSA9PSBOVUxMKSByZXR1cm4gMDsKKworI2lmZGVmIEhBVkVfV0lOQ09ERUNfSAorICBuZWVkc19vcGVuX2ZpbGUgPSAoZm9ybWF0ICE9IFBORyk7CisjZW5kaWYKKworICBpZiAobmVlZHNfb3Blbl9maWxlKSB7CisgICAgZm91dCA9IHVzZV9zdGRvdXQgPyBJbWdJb1V0aWxTZXRCaW5hcnlNb2RlKHN0ZG91dCkKKyAgICAgICAgICAgICAgICAgICAgICA6IGZvcGVuKG91dF9maWxlX25hbWUsICJ3YiIpOworICAgIGlmIChmb3V0ID09IE5VTEwpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3Igb3BlbmluZyBvdXRwdXQgZmlsZSAlc1xuIiwgb3V0X2ZpbGVfbmFtZSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKworICBpZiAoZm9ybWF0ID09IFBORyB8fAorICAgICAgZm9ybWF0ID09IFJHQkEgfHwgZm9ybWF0ID09IEJHUkEgfHwgZm9ybWF0ID09IEFSR0IgfHwKKyAgICAgIGZvcm1hdCA9PSByZ2JBIHx8IGZvcm1hdCA9PSBiZ3JBIHx8IGZvcm1hdCA9PSBBcmdiKSB7CisjaWZkZWYgSEFWRV9XSU5DT0RFQ19ICisgICAgb2sgJj0gV2ViUFdyaXRlUE5HKG91dF9maWxlX25hbWUsIHVzZV9zdGRvdXQsIGJ1ZmZlcik7CisjZWxzZQorICAgIG9rICY9IFdlYlBXcml0ZVBORyhmb3V0LCBidWZmZXIpOworI2VuZGlmCisgIH0gZWxzZSBpZiAoZm9ybWF0ID09IFBBTSkgeworICAgIG9rICY9IFdlYlBXcml0ZVBBTShmb3V0LCBidWZmZXIpOworICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBQUE0gfHwgZm9ybWF0ID09IFJHQiB8fCBmb3JtYXQgPT0gQkdSKSB7CisgICAgb2sgJj0gV2ViUFdyaXRlUFBNKGZvdXQsIGJ1ZmZlcik7CisgIH0gZWxzZSBpZiAoZm9ybWF0ID09IFJHQkFfNDQ0NCB8fCBmb3JtYXQgPT0gUkdCXzU2NSB8fCBmb3JtYXQgPT0gcmdiQV80NDQ0KSB7CisgICAgb2sgJj0gV2ViUFdyaXRlMTZiQXNQR00oZm91dCwgYnVmZmVyKTsKKyAgfSBlbHNlIGlmIChmb3JtYXQgPT0gQk1QKSB7CisgICAgb2sgJj0gV2ViUFdyaXRlQk1QKGZvdXQsIGJ1ZmZlcik7CisgIH0gZWxzZSBpZiAoZm9ybWF0ID09IFRJRkYpIHsKKyAgICBvayAmPSBXZWJQV3JpdGVUSUZGKGZvdXQsIGJ1ZmZlcik7CisgIH0gZWxzZSBpZiAoZm9ybWF0ID09IFJBV19ZVVYpIHsKKyAgICBvayAmPSBXZWJQV3JpdGVZVVYoZm91dCwgYnVmZmVyKTsKKyAgfSBlbHNlIGlmIChmb3JtYXQgPT0gUEdNIHx8IGZvcm1hdCA9PSBZVVYgfHwgZm9ybWF0ID09IFlVVkEpIHsKKyAgICBvayAmPSBXZWJQV3JpdGVQR00oZm91dCwgYnVmZmVyKTsKKyAgfSBlbHNlIGlmIChmb3JtYXQgPT0gQUxQSEFfUExBTkVfT05MWSkgeworICAgIG9rICY9IFdlYlBXcml0ZUFscGhhUGxhbmUoZm91dCwgYnVmZmVyKTsKKyAgfQorICBpZiAoZm91dCAhPSBOVUxMICYmIGZvdXQgIT0gc3Rkb3V0KSB7CisgICAgZmNsb3NlKGZvdXQpOworICB9CisgIHJldHVybiBvazsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vaW1hZ2VfZW5jLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL2ltYWdlX2VuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YWJkYWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL2ltYWdlX2VuYy5oCkBAIC0wLDAgKzEsOTYgQEAKKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgQWxsLWluLW9uZSBsaWJyYXJ5IHRvIHNhdmUgUE5HL0pQRUcvV2ViUC9USUZGL1dJQyBpbWFnZXMuCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2lmbmRlZiBXRUJQX0lNQUdFSU9fSU1BR0VfRU5DX0hfCisjZGVmaW5lIFdFQlBfSU1BR0VJT19JTUFHRV9FTkNfSF8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAid2VicC9jb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAid2VicC90eXBlcy5oIgorI2luY2x1ZGUgIndlYnAvZGVjb2RlLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLy8gT3V0cHV0IHR5cGVzCit0eXBlZGVmIGVudW0geworICBQTkcgPSAwLAorICBQQU0sCisgIFBQTSwKKyAgUEdNLAorICBCTVAsCisgIFRJRkYsCisgIFJBV19ZVVYsCisgIEFMUEhBX1BMQU5FX09OTFksICAvLyB0aGlzIGlzIGZvciBleHBlcmltZW50aW5nIG9ubHkKKyAgLy8gZm9yY2VkIGNvbG9yc3BhY2Ugb3V0cHV0IChmb3IgdGVzdGluZywgbW9zdGx5KQorICBSR0IsIFJHQkEsIEJHUiwgQkdSQSwgQVJHQiwKKyAgUkdCQV80NDQ0LCBSR0JfNTY1LAorICByZ2JBLCBiZ3JBLCBBcmdiLCByZ2JBXzQ0NDQsCisgIFlVViwgWVVWQQorfSBXZWJQT3V0cHV0RmlsZUZvcm1hdDsKKworLy8gR2VuZXJhbCBhbGwtcHVycG9zZSBjYWxsLgorLy8gTW9zdCBmb3JtYXRzIGV4cGVjdCBhICdidWZmZXInIGNvbnRhaW5pbmcgUkdCQS1saWtlIHNhbXBsZXMsIGV4Y2VwdAorLy8gUkFXX1lVViwgWVVWIGFuZCBZVVZBIGZvcm1hdHMuCisvLyBJZiAnb3V0X2ZpbGVfbmFtZScgaXMgIi0iLCBkYXRhIGlzIHNhdmVkIHRvIHN0ZG91dC4KKy8vIFJldHVybnMgZmFsc2UgaWYgYW4gZXJyb3Igb2NjdXJyZWQsIHRydWUgb3RoZXJ3aXNlLgoraW50IFdlYlBTYXZlSW1hZ2UoY29uc3QgV2ViUERlY0J1ZmZlciogY29uc3QgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgV2ViUE91dHB1dEZpbGVGb3JtYXQgZm9ybWF0LCBjb25zdCBjaGFyKiBjb25zdCBvdXRfZmlsZV9uYW1lKTsKKworLy8gU2F2ZSB0byBQTkcuCisjaWZkZWYgSEFWRV9XSU5DT0RFQ19ICitpbnQgV2ViUFdyaXRlUE5HKGNvbnN0IGNoYXIqIG91dF9maWxlX25hbWUsIGludCB1c2Vfc3Rkb3V0LAorICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgV2ViUERlY0J1ZmZlciogY29uc3QgYnVmZmVyKTsKKyNlbHNlCitpbnQgV2ViUFdyaXRlUE5HKEZJTEUqIG91dF9maWxlLCBjb25zdCBXZWJQRGVjQnVmZmVyKiBjb25zdCBidWZmZXIpOworI2VuZGlmCisKKy8vIFNhdmUgdG8gUFBNIGZvcm1hdCAoUkdCLCBubyBhbHBoYSkKK2ludCBXZWJQV3JpdGVQUE0oRklMRSogZm91dCwgY29uc3Qgc3RydWN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IGJ1ZmZlcik7CisKKy8vIFNhdmUgdG8gUEFNIGZvcm1hdCAoPSBQUE0gKyBhbHBoYSkKK2ludCBXZWJQV3JpdGVQQU0oRklMRSogZm91dCwgY29uc3Qgc3RydWN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IGJ1ZmZlcik7CisKKy8vIFNhdmUgMTZiIG1vZGUgKFJHQkE0NDQ0LCBSR0I1NjUsIC4uLikgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4KK2ludCBXZWJQV3JpdGUxNmJBc1BHTShGSUxFKiBmb3V0LCBjb25zdCBzdHJ1Y3QgV2ViUERlY0J1ZmZlciogY29uc3QgYnVmZmVyKTsKKworLy8gU2F2ZSBhcyBCTVAKK2ludCBXZWJQV3JpdGVCTVAoRklMRSogZm91dCwgY29uc3Qgc3RydWN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IGJ1ZmZlcik7CisKKy8vIFNhdmUgYXMgVElGRgoraW50IFdlYlBXcml0ZVRJRkYoRklMRSogZm91dCwgY29uc3Qgc3RydWN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IGJ1ZmZlcik7CisKKy8vIFNhdmUgdGhlIEFMUEhBIHBsYW5lIChvbmx5KSBhcyBhIFBHTQoraW50IFdlYlBXcml0ZUFscGhhUGxhbmUoRklMRSogZm91dCwgY29uc3Qgc3RydWN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IGJ1ZmZlcik7CisKKy8vIFNhdmUgYXMgWVVWIHNhbXBsZXMgYXMgUEdNIGZvcm1hdCAodXNpbmcgSU1DNCBsYXlvdXQpLgorLy8gU2VlOiBodHRwOi8vd3d3LmZvdXJjYy5vcmcveXV2LnBocCNJTUM0LgorLy8gKHZlcnkgY29udmVuaWVudCBmb3JtYXQgZm9yIHZpZXdpbmcgdGhlIHNhbXBsZXMsIGVzcC4gZm9yIG9kZCBkaW1lbnNpb25zKS4KK2ludCBXZWJQV3JpdGVQR00oRklMRSogZm91dCwgY29uc3Qgc3RydWN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IGJ1ZmZlcik7CisKKy8vIFNhdmUgWVVWKEEpIHBsYW5lcyBzZXF1ZW50aWFsbHkgKHJhdyBkdW1wKQoraW50IFdlYlBXcml0ZVlVVihGSUxFKiBmb3V0LCBjb25zdCBzdHJ1Y3QgV2ViUERlY0J1ZmZlciogY29uc3QgYnVmZmVyKTsKKworLy8gU2F2ZSAxNmIgbW9kZSAoUkdCQTQ0NDQsIFJHQjU2NSwgLi4uKSBhcyBQR00gZm9ybWF0LCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgoraW50IFdlYlBXcml0ZTE2YkFzUEdNKEZJTEUqIGZvdXQsIGNvbnN0IHN0cnVjdCBXZWJQRGVjQnVmZmVyKiBjb25zdCBidWZmZXIpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gICAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLy8gV0VCUF9JTUFHRUlPX0lNQUdFX0VOQ19IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby9pbWFnZWlvX3V0aWwuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vaW1hZ2Vpb191dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E0YWRlMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vaW1hZ2Vpb191dGlsLmMKQEAgLTAsMCArMSwxNTggQEAKKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgVXRpbGl0eSBmdW5jdGlvbnMgdXNlZCBieSB0aGUgaW1hZ2UgZGVjb2RlcnMuCisvLworCisjaW5jbHVkZSAiLi9pbWFnZWlvX3V0aWwuaCIKKworI2lmIGRlZmluZWQoX1dJTjMyKQorI2luY2x1ZGUgPGZjbnRsLmg+ICAgLy8gZm9yIF9PX0JJTkFSWQorI2luY2x1ZGUgPGlvLmg+ICAgICAgLy8gZm9yIF9zZXRtb2RlKCkKKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRmlsZSBJL08KKworRklMRSogSW1nSW9VdGlsU2V0QmluYXJ5TW9kZShGSUxFKiBmaWxlKSB7CisjaWYgZGVmaW5lZChfV0lOMzIpCisgIGlmIChfc2V0bW9kZShfZmlsZW5vKGZpbGUpLCBfT19CSU5BUlkpID09IC0xKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gcmVvcGVuIGZpbGUgaW4gT19CSU5BUlkgbW9kZS5cbiIpOworICAgIHJldHVybiBOVUxMOworICB9CisjZW5kaWYKKyAgcmV0dXJuIGZpbGU7Cit9CisKK2ludCBJbWdJb1V0aWxSZWFkRnJvbVN0ZGluKGNvbnN0IHVpbnQ4X3QqKiBkYXRhLCBzaXplX3QqIGRhdGFfc2l6ZSkgeworICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtCbG9ja1NpemUgPSAxNjM4NDsgIC8vIGRlZmF1bHQgaW5pdGlhbCBzaXplCisgIHNpemVfdCBtYXhfc2l6ZSA9IDA7CisgIHNpemVfdCBzaXplID0gMDsKKyAgdWludDhfdCogaW5wdXQgPSBOVUxMOworCisgIGlmIChkYXRhID09IE5VTEwgfHwgZGF0YV9zaXplID09IE5VTEwpIHJldHVybiAwOworICAqZGF0YSA9IE5VTEw7CisgICpkYXRhX3NpemUgPSAwOworCisgIGlmICghSW1nSW9VdGlsU2V0QmluYXJ5TW9kZShzdGRpbikpIHJldHVybiAwOworCisgIHdoaWxlICghZmVvZihzdGRpbikpIHsKKyAgICAvLyBXZSBkb3VibGUgdGhlIGJ1ZmZlciBzaXplIGVhY2ggdGltZSBhbmQgcmVhZCBhcyBtdWNoIGFzIHBvc3NpYmxlLgorICAgIGNvbnN0IHNpemVfdCBleHRyYV9zaXplID0gKG1heF9zaXplID09IDApID8ga0Jsb2NrU2l6ZSA6IG1heF9zaXplOworICAgIC8vIHdlIGFsbG9jYXRlIG9uZSBleHRyYSBieXRlIGZvciB0aGUgXDAgdGVybWluYXRvcgorICAgIHZvaWQqIGNvbnN0IG5ld19kYXRhID0gcmVhbGxvYyhpbnB1dCwgbWF4X3NpemUgKyBleHRyYV9zaXplICsgMSk7CisgICAgaWYgKG5ld19kYXRhID09IE5VTEwpIGdvdG8gRXJyb3I7CisgICAgaW5wdXQgPSAodWludDhfdCopbmV3X2RhdGE7CisgICAgbWF4X3NpemUgKz0gZXh0cmFfc2l6ZTsKKyAgICBzaXplICs9IGZyZWFkKGlucHV0ICsgc2l6ZSwgMSwgZXh0cmFfc2l6ZSwgc3RkaW4pOworICAgIGlmIChzaXplIDwgbWF4X3NpemUpIGJyZWFrOworICB9CisgIGlmIChmZXJyb3Ioc3RkaW4pKSBnb3RvIEVycm9yOworICBpZiAoaW5wdXQgIT0gTlVMTCkgaW5wdXRbc2l6ZV0gPSAnXDAnOyAgLy8gY29udmVuaWVudCAwLXRlcm1pbmF0b3IKKyAgKmRhdGEgPSBpbnB1dDsKKyAgKmRhdGFfc2l6ZSA9IHNpemU7CisgIHJldHVybiAxOworCisgRXJyb3I6CisgIGZyZWUoaW5wdXQpOworICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCByZWFkIGZyb20gc3RkaW5cbiIpOworICByZXR1cm4gMDsKK30KKworaW50IEltZ0lvVXRpbFJlYWRGaWxlKGNvbnN0IGNoYXIqIGNvbnN0IGZpbGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiogZGF0YSwgc2l6ZV90KiBkYXRhX3NpemUpIHsKKyAgaW50IG9rOworICB1aW50OF90KiBmaWxlX2RhdGE7CisgIHNpemVfdCBmaWxlX3NpemU7CisgIEZJTEUqIGluOworICBjb25zdCBpbnQgZnJvbV9zdGRpbiA9IChmaWxlX25hbWUgPT0gTlVMTCkgfHwgIXN0cmNtcChmaWxlX25hbWUsICItIik7CisKKyAgaWYgKGZyb21fc3RkaW4pIHJldHVybiBJbWdJb1V0aWxSZWFkRnJvbVN0ZGluKGRhdGEsIGRhdGFfc2l6ZSk7CisKKyAgaWYgKGRhdGEgPT0gTlVMTCB8fCBkYXRhX3NpemUgPT0gTlVMTCkgcmV0dXJuIDA7CisgICpkYXRhID0gTlVMTDsKKyAgKmRhdGFfc2l6ZSA9IDA7CisKKyAgaW4gPSBmb3BlbihmaWxlX25hbWUsICJyYiIpOworICBpZiAoaW4gPT0gTlVMTCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiY2Fubm90IG9wZW4gaW5wdXQgZmlsZSAnJXMnXG4iLCBmaWxlX25hbWUpOworICAgIHJldHVybiAwOworICB9CisgIGZzZWVrKGluLCAwLCBTRUVLX0VORCk7CisgIGZpbGVfc2l6ZSA9IGZ0ZWxsKGluKTsKKyAgZnNlZWsoaW4sIDAsIFNFRUtfU0VUKTsKKyAgLy8gd2UgYWxsb2NhdGUgb25lIGV4dHJhIGJ5dGUgZm9yIHRoZSBcMCB0ZXJtaW5hdG9yCisgIGZpbGVfZGF0YSA9ICh1aW50OF90KiltYWxsb2MoZmlsZV9zaXplICsgMSk7CisgIGlmIChmaWxlX2RhdGEgPT0gTlVMTCkgeworICAgIGZjbG9zZShpbik7CisgICAgZnByaW50ZihzdGRlcnIsICJtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlIHdoZW4gcmVhZGluZyBmaWxlICVzXG4iLAorICAgICAgICAgICAgZmlsZV9uYW1lKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBvayA9IChmcmVhZChmaWxlX2RhdGEsIGZpbGVfc2l6ZSwgMSwgaW4pID09IDEpOworICBmY2xvc2UoaW4pOworCisgIGlmICghb2spIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCByZWFkICVkIGJ5dGVzIG9mIGRhdGEgZnJvbSBmaWxlICVzXG4iLAorICAgICAgICAgICAgKGludClmaWxlX3NpemUsIGZpbGVfbmFtZSk7CisgICAgZnJlZShmaWxlX2RhdGEpOworICAgIHJldHVybiAwOworICB9CisgIGZpbGVfZGF0YVtmaWxlX3NpemVdID0gJ1wwJzsgIC8vIGNvbnZlbmllbnQgMC10ZXJtaW5hdG9yCisgICpkYXRhID0gZmlsZV9kYXRhOworICAqZGF0YV9zaXplID0gZmlsZV9zaXplOworICByZXR1cm4gMTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IEltZ0lvVXRpbFdyaXRlRmlsZShjb25zdCBjaGFyKiBjb25zdCBmaWxlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUpIHsKKyAgaW50IG9rOworICBGSUxFKiBvdXQ7CisgIGNvbnN0IGludCB0b19zdGRvdXQgPSAoZmlsZV9uYW1lID09IE5VTEwpIHx8ICFzdHJjbXAoZmlsZV9uYW1lLCAiLSIpOworCisgIGlmIChkYXRhID09IE5VTEwpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBvdXQgPSB0b19zdGRvdXQgPyBJbWdJb1V0aWxTZXRCaW5hcnlNb2RlKHN0ZG91dCkgOiBmb3BlbihmaWxlX25hbWUsICJ3YiIpOworICBpZiAob3V0ID09IE5VTEwpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yISBDYW5ub3Qgb3BlbiBvdXRwdXQgZmlsZSAnJXMnXG4iLCBmaWxlX25hbWUpOworICAgIHJldHVybiAwOworICB9CisgIG9rID0gKGZ3cml0ZShkYXRhLCBkYXRhX3NpemUsIDEsIG91dCkgPT0gMSk7CisgIGlmIChvdXQgIT0gc3Rkb3V0KSBmY2xvc2Uob3V0KTsKKyAgcmV0dXJuIG9rOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIEltZ0lvVXRpbENvcHlQbGFuZShjb25zdCB1aW50OF90KiBzcmMsIGludCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgZHN0X3N0cmlkZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgIHdoaWxlIChoZWlnaHQtLSA+IDApIHsKKyAgICBtZW1jcHkoZHN0LCBzcmMsIHdpZHRoICogc2l6ZW9mKCpkc3QpKTsKKyAgICBzcmMgKz0gc3JjX3N0cmlkZTsKKyAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKyAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgSW1nSW9VdGlsQ2hlY2tTaXplQXJndW1lbnRzT3ZlcmZsb3codWludDY0X3Qgbm1lbWIsIHNpemVfdCBzaXplKSB7CisgIGNvbnN0IHVpbnQ2NF90IHRvdGFsX3NpemUgPSBubWVtYiAqIHNpemU7CisgIGludCBvayA9ICh0b3RhbF9zaXplID09IChzaXplX3QpdG90YWxfc2l6ZSk7CisjaWYgZGVmaW5lZChXRUJQX01BWF9JTUFHRV9TSVpFKQorICBvayA9IG9rICYmICh0b3RhbF9zaXplIDw9ICh1aW50NjRfdClXRUJQX01BWF9JTUFHRV9TSVpFKTsKKyNlbmRpZgorICByZXR1cm4gb2s7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL2ltYWdlaW9fdXRpbC5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby9pbWFnZWlvX3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmRiMTU5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby9pbWFnZWlvX3V0aWwuaApAQCAtMCwwICsxLDY0IEBACisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gIFV0aWxpdHkgZnVuY3Rpb25zIHVzZWQgYnkgdGhlIGltYWdlIGRlY29kZXJzLgorLy8KKworI2lmbmRlZiBXRUJQX0lNQUdFSU9fSU1BR0VJT19VVElMX0hfCisjZGVmaW5lIFdFQlBfSU1BR0VJT19JTUFHRUlPX1VUSUxfSF8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAid2VicC90eXBlcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGaWxlIEkvTworCisvLyBSZW9wZW4gZmlsZSBpbiBiaW5hcnkgKE9fQklOQVJZKSBtb2RlLgorLy8gUmV0dXJucyAnZmlsZScgb24gc3VjY2VzcywgTlVMTCBvdGhlcndpc2UuCitGSUxFKiBJbWdJb1V0aWxTZXRCaW5hcnlNb2RlKEZJTEUqIGZpbGUpOworCisvLyBBbGxvY2F0ZXMgc3RvcmFnZSBmb3IgZW50aXJlIGZpbGUgJ2ZpbGVfbmFtZScgYW5kIHJldHVybnMgY29udGVudHMgYW5kIHNpemUKKy8vIGluICdkYXRhJyBhbmQgJ2RhdGFfc2l6ZScuIFJldHVybnMgMSBvbiBzdWNjZXNzLCAwIG90aGVyd2lzZS4gJypkYXRhJyBzaG91bGQKKy8vIGJlIGRlbGV0ZWQgdXNpbmcgZnJlZSgpLgorLy8gTm90ZTogZm9yIGNvbnZlbmllbmNlLCB0aGUgZGF0YSB3aWxsIGJlIG51bGwtdGVybWluYXRlZCB3aXRoIGFuIGV4dHJhIGJ5dGUKKy8vIChub3QgYWNjb3VudGVkIGZvciBpbiAqZGF0YV9zaXplKSwgaW4gY2FzZSB0aGUgZmlsZSBpcyB0ZXh0IGFuZCBpbnRlbmRlZAorLy8gdG8gYmUgdXNlZCBhcyBhIEMtc3RyaW5nLgorLy8gSWYgJ2ZpbGVfbmFtZScgaXMgTlVMTCBvciBlcXVhbCB0byAiLSIsIGlucHV0IGlzIHJlYWQgZnJvbSBzdGRpbiBieSBjYWxsaW5nCisvLyB0aGUgZnVuY3Rpb24gSW1nSW9VdGlsUmVhZEZyb21TdGRpbigpLgoraW50IEltZ0lvVXRpbFJlYWRGaWxlKGNvbnN0IGNoYXIqIGNvbnN0IGZpbGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiogZGF0YSwgc2l6ZV90KiBkYXRhX3NpemUpOworCisvLyBTYW1lIGFzIEltZ0lvVXRpbFJlYWRGaWxlKCksIGJ1dCByZWFkcyB1bnRpbCBFT0YgZnJvbSBzdGRpbiBpbnN0ZWFkLgoraW50IEltZ0lvVXRpbFJlYWRGcm9tU3RkaW4oY29uc3QgdWludDhfdCoqIGRhdGEsIHNpemVfdCogZGF0YV9zaXplKTsKKworLy8gV3JpdGUgYSBkYXRhIHNlZ21lbnQgaW50byBhIGZpbGUgbmFtZWQgJ2ZpbGVfbmFtZScuIFJldHVybnMgdHJ1ZSBpZiBvay4KKy8vIElmICdmaWxlX25hbWUnIGlzIE5VTEwgb3IgZXF1YWwgdG8gIi0iLCBvdXRwdXQgaXMgd3JpdHRlbiB0byBzdGRvdXQuCitpbnQgSW1nSW9VdGlsV3JpdGVGaWxlKGNvbnN0IGNoYXIqIGNvbnN0IGZpbGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIENvcHkgd2lkdGggeCBoZWlnaHQgcGl4ZWxzIGZyb20gJ3NyYycgdG8gJ2RzdCcgaG9ub3JpbmcgdGhlIHN0cmlkZXMuCit2b2lkIEltZ0lvVXRpbENvcHlQbGFuZShjb25zdCB1aW50OF90KiBzcmMsIGludCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgZHN0X3N0cmlkZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gUmV0dXJucyAwIGluIGNhc2Ugb2Ygb3ZlcmZsb3cgb2Ygbm1lbWIgKiBzaXplLgoraW50IEltZ0lvVXRpbENoZWNrU2l6ZUFyZ3VtZW50c092ZXJmbG93KHVpbnQ2NF90IG5tZW1iLCBzaXplX3Qgc2l6ZSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvLyBXRUJQX0lNQUdFSU9fSU1BR0VJT19VVElMX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL2pwZWdkZWMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vanBlZ2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZmU5MmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL2pwZWdkZWMuYwpAQCAtMCwwICsxLDM1OSBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEpQRUcgZGVjb2RlLgorCisjaW5jbHVkZSAiLi9qcGVnZGVjLmgiCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAid2VicC9jb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmZGVmIFdFQlBfSEFWRV9KUEVHCisjaW5jbHVkZSA8anBlZ2xpYi5oPgorI2luY2x1ZGUgPGplcnJvci5oPgorI2luY2x1ZGUgPHNldGptcC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAid2VicC9lbmNvZGUuaCIKKyNpbmNsdWRlICIuL2ltYWdlaW9fdXRpbC5oIgorI2luY2x1ZGUgIi4vbWV0YWRhdGEuaCIKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1ldGFkYXRhIHByb2Nlc3NpbmcKKworI2lmbmRlZiBKUEVHX0FQUDEKKyMgZGVmaW5lIEpQRUdfQVBQMSAoSlBFR19BUFAwICsgMSkKKyNlbmRpZgorI2lmbmRlZiBKUEVHX0FQUDIKKyMgZGVmaW5lIEpQRUdfQVBQMiAoSlBFR19BUFAwICsgMikKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisgIGNvbnN0IHVpbnQ4X3QqIGRhdGE7CisgIHNpemVfdCBkYXRhX2xlbmd0aDsKKyAgaW50IHNlcTsgIC8vIHRoaXMgc2VnbWVudCdzIHNlcXVlbmNlIG51bWJlciBbMSwgMjU1XSBmb3IgdXNlIGluIHJlYXNzZW1ibHkuCit9IElDQ1BTZWdtZW50OworCitzdGF0aWMgdm9pZCBTYXZlTWV0YWRhdGFNYXJrZXJzKGpfZGVjb21wcmVzc19wdHIgZGluZm8pIHsKKyAgY29uc3QgdW5zaWduZWQgaW50IG1heF9tYXJrZXJfbGVuZ3RoID0gMHhmZmZmOworICBqcGVnX3NhdmVfbWFya2VycyhkaW5mbywgSlBFR19BUFAxLCBtYXhfbWFya2VyX2xlbmd0aCk7ICAvLyBFeGlmL1hNUAorICBqcGVnX3NhdmVfbWFya2VycyhkaW5mbywgSlBFR19BUFAyLCBtYXhfbWFya2VyX2xlbmd0aCk7ICAvLyBJQ0MgcHJvZmlsZQorfQorCitzdGF0aWMgaW50IENvbXBhcmVJQ0NQU2VnbWVudHMoY29uc3Qgdm9pZCogYSwgY29uc3Qgdm9pZCogYikgeworICBjb25zdCBJQ0NQU2VnbWVudCogczEgPSAoY29uc3QgSUNDUFNlZ21lbnQqKWE7CisgIGNvbnN0IElDQ1BTZWdtZW50KiBzMiA9IChjb25zdCBJQ0NQU2VnbWVudCopYjsKKyAgcmV0dXJuIHMxLT5zZXEgLSBzMi0+c2VxOworfQorCisvLyBFeHRyYWN0IElDQyBwcm9maWxlIHNlZ21lbnRzIGZyb20gdGhlIG1hcmtlciBsaXN0IGluICdkaW5mbycsIHJlYXNzZW1ibGluZworLy8gYW5kIHN0b3JpbmcgdGhlbSBpbiAnaWNjcCcuCisvLyBSZXR1cm5zIHRydWUgb24gc3VjY2VzcyBhbmQgZmFsc2UgZm9yIG1lbW9yeSBlcnJvcnMgYW5kIGNvcnJ1cHQgcHJvZmlsZXMuCitzdGF0aWMgaW50IFN0b3JlSUNDUChqX2RlY29tcHJlc3NfcHRyIGRpbmZvLCBNZXRhZGF0YVBheWxvYWQqIGNvbnN0IGljY3ApIHsKKyAgLy8gSUNDLjE6MjAxMC0xMiAoNC4zLjAuMCkgQW5uZXggQi40IEVtYmVkZGluZyBJQ0MgUHJvZmlsZXMgaW4gSlBFRyBmaWxlcworICBzdGF0aWMgY29uc3QgY2hhciBrSUNDUFNpZ25hdHVyZVtdID0gIklDQ19QUk9GSUxFIjsKKyAgc3RhdGljIGNvbnN0IHNpemVfdCBrSUNDUFNpZ25hdHVyZUxlbmd0aCA9IDEyOyAgLy8gc2lnbmF0dXJlIGluY2x1ZGVzICdcMCcKKyAgc3RhdGljIGNvbnN0IHNpemVfdCBrSUNDUFNraXBMZW5ndGggPSAxNDsgIC8vIHNpZ25hdHVyZSArIHNlcSAmIGNvdW50CisgIGludCBleHBlY3RlZF9jb3VudCA9IDA7CisgIGludCBhY3R1YWxfY291bnQgPSAwOworICBpbnQgc2VxX21heCA9IDA7CisgIHNpemVfdCB0b3RhbF9zaXplID0gMDsKKyAgSUNDUFNlZ21lbnQgaWNjcF9zZWdtZW50c1syNTVdOworICBqcGVnX3NhdmVkX21hcmtlcl9wdHIgbWFya2VyOworCisgIG1lbXNldChpY2NwX3NlZ21lbnRzLCAwLCBzaXplb2YoaWNjcF9zZWdtZW50cykpOworICBmb3IgKG1hcmtlciA9IGRpbmZvLT5tYXJrZXJfbGlzdDsgbWFya2VyICE9IE5VTEw7IG1hcmtlciA9IG1hcmtlci0+bmV4dCkgeworICAgIGlmIChtYXJrZXItPm1hcmtlciA9PSBKUEVHX0FQUDIgJiYKKyAgICAgICAgbWFya2VyLT5kYXRhX2xlbmd0aCA+IGtJQ0NQU2tpcExlbmd0aCAmJgorICAgICAgICAhbWVtY21wKG1hcmtlci0+ZGF0YSwga0lDQ1BTaWduYXR1cmUsIGtJQ0NQU2lnbmF0dXJlTGVuZ3RoKSkgeworICAgICAgLy8gSUNDX1BST0ZJTEVcMDxzZXE+PGNvdW50PjsgJ3NlcScgc3RhcnRzIGF0IDEuCisgICAgICBjb25zdCBpbnQgc2VxID0gbWFya2VyLT5kYXRhW2tJQ0NQU2lnbmF0dXJlTGVuZ3RoXTsKKyAgICAgIGNvbnN0IGludCBjb3VudCA9IG1hcmtlci0+ZGF0YVtrSUNDUFNpZ25hdHVyZUxlbmd0aCArIDFdOworICAgICAgY29uc3Qgc2l6ZV90IHNlZ21lbnRfc2l6ZSA9IG1hcmtlci0+ZGF0YV9sZW5ndGggLSBrSUNDUFNraXBMZW5ndGg7CisgICAgICBJQ0NQU2VnbWVudCogc2VnbWVudDsKKworICAgICAgaWYgKHNlZ21lbnRfc2l6ZSA9PSAwIHx8IGNvdW50ID09IDAgfHwgc2VxID09IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJbSUNDUF0gc2l6ZSAoJWQpIC8gY291bnQgKCVkKSAvIHNlcXVlbmNlIG51bWJlciAoJWQpIgorICAgICAgICAgICAgICAgICAgICAgICAgIiBjYW5ub3QgYmUgMCFcbiIsCisgICAgICAgICAgICAgICAgKGludClzZWdtZW50X3NpemUsIHNlcSwgY291bnQpOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKworICAgICAgaWYgKGV4cGVjdGVkX2NvdW50ID09IDApIHsKKyAgICAgICAgZXhwZWN0ZWRfY291bnQgPSBjb3VudDsKKyAgICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWRfY291bnQgIT0gY291bnQpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJbSUNDUF0gSW5jb25zaXN0ZW50IHNlZ21lbnQgY291bnQgKCVkIC8gJWQpIVxuIiwKKyAgICAgICAgICAgICAgICBleHBlY3RlZF9jb3VudCwgY291bnQpOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKworICAgICAgc2VnbWVudCA9IGljY3Bfc2VnbWVudHMgKyBzZXEgLSAxOworICAgICAgaWYgKHNlZ21lbnQtPmRhdGFfbGVuZ3RoICE9IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJbSUNDUF0gRHVwbGljYXRlIHNlZ21lbnQgbnVtYmVyICglZCkhXG4iICwgc2VxKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisKKyAgICAgIHNlZ21lbnQtPmRhdGEgPSBtYXJrZXItPmRhdGEgKyBrSUNDUFNraXBMZW5ndGg7CisgICAgICBzZWdtZW50LT5kYXRhX2xlbmd0aCA9IHNlZ21lbnRfc2l6ZTsKKyAgICAgIHNlZ21lbnQtPnNlcSA9IHNlcTsKKyAgICAgIHRvdGFsX3NpemUgKz0gc2VnbWVudF9zaXplOworICAgICAgaWYgKHNlcSA+IHNlcV9tYXgpIHNlcV9tYXggPSBzZXE7CisgICAgICArK2FjdHVhbF9jb3VudDsKKyAgICB9CisgIH0KKworICBpZiAoYWN0dWFsX2NvdW50ID09IDApIHJldHVybiAxOworICBpZiAoc2VxX21heCAhPSBhY3R1YWxfY291bnQpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIltJQ0NQXSBEaXNjb250aW51b3VzIHNlZ21lbnRzLCBleHBlY3RlZDogJWQgYWN0dWFsOiAlZCFcbiIsCisgICAgICAgICAgICBhY3R1YWxfY291bnQsIHNlcV9tYXgpOworICAgIHJldHVybiAwOworICB9CisgIGlmIChleHBlY3RlZF9jb3VudCAhPSBhY3R1YWxfY291bnQpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIltJQ0NQXSBTZWdtZW50IGNvdW50OiAlZCBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZDogJWQhXG4iLAorICAgICAgICAgICAgYWN0dWFsX2NvdW50LCBleHBlY3RlZF9jb3VudCk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLyBUaGUgc2VnbWVudHMgbWF5IGFwcGVhciBvdXQgb2Ygb3JkZXIgaW4gdGhlIGZpbGUsIHNvcnQgdGhlbSBiYXNlZCBvbgorICAvLyBzZXF1ZW5jZSBudW1iZXIgYmVmb3JlIGFzc2VtYmxpbmcgdGhlIHBheWxvYWQuCisgIHFzb3J0KGljY3Bfc2VnbWVudHMsIGFjdHVhbF9jb3VudCwgc2l6ZW9mKCppY2NwX3NlZ21lbnRzKSwKKyAgICAgICAgQ29tcGFyZUlDQ1BTZWdtZW50cyk7CisKKyAgaWNjcC0+Ynl0ZXMgPSAodWludDhfdCopbWFsbG9jKHRvdGFsX3NpemUpOworICBpZiAoaWNjcC0+Ynl0ZXMgPT0gTlVMTCkgcmV0dXJuIDA7CisgIGljY3AtPnNpemUgPSB0b3RhbF9zaXplOworCisgIHsKKyAgICBpbnQgaTsKKyAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2VxX21heDsgKytpKSB7CisgICAgICBtZW1jcHkoaWNjcC0+Ynl0ZXMgKyBvZmZzZXQsCisgICAgICAgICAgICAgaWNjcF9zZWdtZW50c1tpXS5kYXRhLCBpY2NwX3NlZ21lbnRzW2ldLmRhdGFfbGVuZ3RoKTsKKyAgICAgIG9mZnNldCArPSBpY2NwX3NlZ21lbnRzW2ldLmRhdGFfbGVuZ3RoOworICAgIH0KKyAgfQorICByZXR1cm4gMTsKK30KKworLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MgYW5kIGZhbHNlIGZvciBtZW1vcnkgZXJyb3JzIGFuZCBjb3JydXB0IHByb2ZpbGVzLgorLy8gVGhlIGNhbGxlciBtdXN0IHVzZSBNZXRhZGF0YUZyZWUoKSBvbiAnbWV0YWRhdGEnIGluIGFsbCBjYXNlcy4KK3N0YXRpYyBpbnQgRXh0cmFjdE1ldGFkYXRhRnJvbUpQRUcoal9kZWNvbXByZXNzX3B0ciBkaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YWRhdGEqIGNvbnN0IG1ldGFkYXRhKSB7CisgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgIGludCBtYXJrZXI7CisgICAgY29uc3QgY2hhciogc2lnbmF0dXJlOworICAgIHNpemVfdCBzaWduYXR1cmVfbGVuZ3RoOworICAgIHNpemVfdCBzdG9yYWdlX29mZnNldDsKKyAgfSBrSlBFR01ldGFkYXRhTWFwW10gPSB7CisgICAgLy8gRXhpZiAyLjIgU2VjdGlvbiA0LjcuMiBJbnRlcm9wZXJhYmlsaXR5IFN0cnVjdHVyZSBvZiBBUFAxIC4uLgorICAgIHsgSlBFR19BUFAxLCAiRXhpZlwwIiwgICAgICAgICAgICAgICAgICAgICAgICA2LCBNRVRBREFUQV9PRkZTRVQoZXhpZikgfSwKKyAgICAvLyBYTVAgU3BlY2lmaWNhdGlvbiBQYXJ0IDMgU2VjdGlvbiAzIEVtYmVkZGluZyBYTVAgTWV0YWRhdGEgLi4uICNKUEVHCisgICAgLy8gVE9ETyhqemVybikgQWRkIHN1cHBvcnQgZm9yICdFeHRlbmRlZFhNUCcKKyAgICB7IEpQRUdfQVBQMSwgImh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iLCAyOSwgTUVUQURBVEFfT0ZGU0VUKHhtcCkgfSwKKyAgICB7IDAsIE5VTEwsIDAsIDAgfSwKKyAgfTsKKyAganBlZ19zYXZlZF9tYXJrZXJfcHRyIG1hcmtlcjsKKyAgLy8gVHJlYXQgSUNDIHByb2ZpbGVzIHNlcGFyYXRlbHkgYXMgdGhleSBtYXkgYmUgc2VnbWVudGVkIGFuZCBvdXQgb2Ygb3JkZXIuCisgIGlmICghU3RvcmVJQ0NQKGRpbmZvLCAmbWV0YWRhdGEtPmljY3ApKSByZXR1cm4gMDsKKworICBmb3IgKG1hcmtlciA9IGRpbmZvLT5tYXJrZXJfbGlzdDsgbWFya2VyICE9IE5VTEw7IG1hcmtlciA9IG1hcmtlci0+bmV4dCkgeworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGtKUEVHTWV0YWRhdGFNYXBbaV0ubWFya2VyICE9IDA7ICsraSkgeworICAgICAgaWYgKG1hcmtlci0+bWFya2VyID09IGtKUEVHTWV0YWRhdGFNYXBbaV0ubWFya2VyICYmCisgICAgICAgICAgbWFya2VyLT5kYXRhX2xlbmd0aCA+IGtKUEVHTWV0YWRhdGFNYXBbaV0uc2lnbmF0dXJlX2xlbmd0aCAmJgorICAgICAgICAgICFtZW1jbXAobWFya2VyLT5kYXRhLCBrSlBFR01ldGFkYXRhTWFwW2ldLnNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgIGtKUEVHTWV0YWRhdGFNYXBbaV0uc2lnbmF0dXJlX2xlbmd0aCkpIHsKKyAgICAgICAgTWV0YWRhdGFQYXlsb2FkKiBjb25zdCBwYXlsb2FkID0KKyAgICAgICAgICAgIChNZXRhZGF0YVBheWxvYWQqKSgodWludDhfdCopbWV0YWRhdGEgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtKUEVHTWV0YWRhdGFNYXBbaV0uc3RvcmFnZV9vZmZzZXQpOworCisgICAgICAgIGlmIChwYXlsb2FkLT5ieXRlcyA9PSBOVUxMKSB7CisgICAgICAgICAgY29uc3QgY2hhciogbWFya2VyX2RhdGEgPSAoY29uc3QgY2hhciopbWFya2VyLT5kYXRhICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtKUEVHTWV0YWRhdGFNYXBbaV0uc2lnbmF0dXJlX2xlbmd0aDsKKyAgICAgICAgICBjb25zdCBzaXplX3QgbWFya2VyX2RhdGFfbGVuZ3RoID0KKyAgICAgICAgICAgICAgbWFya2VyLT5kYXRhX2xlbmd0aCAtIGtKUEVHTWV0YWRhdGFNYXBbaV0uc2lnbmF0dXJlX2xlbmd0aDsKKyAgICAgICAgICBpZiAoIU1ldGFkYXRhQ29weShtYXJrZXJfZGF0YSwgbWFya2VyX2RhdGFfbGVuZ3RoLCBwYXlsb2FkKSkgcmV0dXJuIDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJJZ25vcmluZyBhZGRpdGlvbmFsICclcycgbWFya2VyXG4iLAorICAgICAgICAgICAgICAgICAga0pQRUdNZXRhZGF0YU1hcFtpXS5zaWduYXR1cmUpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiAxOworfQorCisjdW5kZWYgSlBFR19BUFAxCisjdW5kZWYgSlBFR19BUFAyCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBKUEVHIGRlY29kaW5nCisKK3N0cnVjdCBteV9lcnJvcl9tZ3IgeworICBzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgcHViOworICBqbXBfYnVmIHNldGptcF9idWZmZXI7Cit9OworCitzdGF0aWMgdm9pZCBteV9lcnJvcl9leGl0KGpfY29tbW9uX3B0ciBkaW5mbykgeworICBzdHJ1Y3QgbXlfZXJyb3JfbWdyKiBteWVyciA9IChzdHJ1Y3QgbXlfZXJyb3JfbWdyKilkaW5mby0+ZXJyOworICBkaW5mby0+ZXJyLT5vdXRwdXRfbWVzc2FnZShkaW5mbyk7CisgIGxvbmdqbXAobXllcnItPnNldGptcF9idWZmZXIsIDEpOworfQorCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX3NvdXJjZV9tZ3IgcHViOworICBjb25zdCB1aW50OF90KiBkYXRhOworICBzaXplX3QgZGF0YV9zaXplOworfSBKUEVHUmVhZENvbnRleHQ7CisKK3N0YXRpYyB2b2lkIENvbnRleHRJbml0KGpfZGVjb21wcmVzc19wdHIgY2luZm8pIHsKKyAgSlBFR1JlYWRDb250ZXh0KiBjb25zdCBjdHggPSAoSlBFR1JlYWRDb250ZXh0KiljaW5mby0+c3JjOworICBjdHgtPnB1Yi5uZXh0X2lucHV0X2J5dGUgPSBjdHgtPmRhdGE7CisgIGN0eC0+cHViLmJ5dGVzX2luX2J1ZmZlciA9IGN0eC0+ZGF0YV9zaXplOworfQorCitzdGF0aWMgYm9vbGVhbiBDb250ZXh0RmlsbChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSB7CisgIC8vIHdlIHNob3VsZG4ndCBnZXQgaGVyZS4KKyAgRVJSRVhJVChjaW5mbywgSkVSUl9GSUxFX1JFQUQpOworICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyB2b2lkIENvbnRleHRTa2lwKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGxvbmcganVtcF9zaXplKSB7CisgIEpQRUdSZWFkQ29udGV4dCogY29uc3QgY3R4ID0gKEpQRUdSZWFkQ29udGV4dCopY2luZm8tPnNyYzsKKyAgc2l6ZV90IGp1bXAgPSAoc2l6ZV90KWp1bXBfc2l6ZTsKKyAgaWYgKGp1bXAgPiBjdHgtPnB1Yi5ieXRlc19pbl9idWZmZXIpIHsgIC8vIERvbid0IG92ZXJmbG93IHRoZSBidWZmZXIuCisgICAganVtcCA9IGN0eC0+cHViLmJ5dGVzX2luX2J1ZmZlcjsKKyAgfQorICBjdHgtPnB1Yi5ieXRlc19pbl9idWZmZXIgLT0ganVtcDsKKyAgY3R4LT5wdWIubmV4dF9pbnB1dF9ieXRlICs9IGp1bXA7Cit9CisKK3N0YXRpYyB2b2lkIENvbnRleHRUZXJtKGpfZGVjb21wcmVzc19wdHIgY2luZm8pIHsKKyAgKHZvaWQpY2luZm87Cit9CisKK3N0YXRpYyB2b2lkIENvbnRleHRTZXR1cCh2b2xhdGlsZSBzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCogY29uc3QgY2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgSlBFR1JlYWRDb250ZXh0KiBjb25zdCBjdHgpIHsKKyAgY2luZm8tPnNyYyA9IChzdHJ1Y3QganBlZ19zb3VyY2VfbWdyKiljdHg7CisgIGN0eC0+cHViLmluaXRfc291cmNlID0gQ29udGV4dEluaXQ7CisgIGN0eC0+cHViLmZpbGxfaW5wdXRfYnVmZmVyID0gQ29udGV4dEZpbGw7CisgIGN0eC0+cHViLnNraXBfaW5wdXRfZGF0YSA9IENvbnRleHRTa2lwOworICBjdHgtPnB1Yi5yZXN5bmNfdG9fcmVzdGFydCA9IGpwZWdfcmVzeW5jX3RvX3Jlc3RhcnQ7CisgIGN0eC0+cHViLnRlcm1fc291cmNlID0gQ29udGV4dFRlcm07CisgIGN0eC0+cHViLmJ5dGVzX2luX2J1ZmZlciA9IDA7CisgIGN0eC0+cHViLm5leHRfaW5wdXRfYnl0ZSA9IE5VTEw7Cit9CisKK2ludCBSZWFkSlBFRyhjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgIFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsIGludCBrZWVwX2FscGhhLAorICAgICAgICAgICAgIE1ldGFkYXRhKiBjb25zdCBtZXRhZGF0YSkgeworICB2b2xhdGlsZSBpbnQgb2sgPSAwOworICBpbnQgd2lkdGgsIGhlaWdodDsKKyAgaW50NjRfdCBzdHJpZGU7CisgIHZvbGF0aWxlIHN0cnVjdCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0IGRpbmZvOworICBzdHJ1Y3QgbXlfZXJyb3JfbWdyIGplcnI7CisgIHVpbnQ4X3QqIHZvbGF0aWxlIHJnYiA9IE5VTEw7CisgIEpTQU1QUk9XIGJ1ZmZlclsxXTsKKyAgSlBFR1JlYWRDb250ZXh0IGN0eDsKKworICBpZiAoZGF0YSA9PSBOVUxMIHx8IGRhdGFfc2l6ZSA9PSAwIHx8IHBpYyA9PSBOVUxMKSByZXR1cm4gMDsKKworICAodm9pZClrZWVwX2FscGhhOworICBtZW1zZXQoJmN0eCwgMCwgc2l6ZW9mKGN0eCkpOworICBjdHguZGF0YSA9IGRhdGE7CisgIGN0eC5kYXRhX3NpemUgPSBkYXRhX3NpemU7CisKKyAgbWVtc2V0KChqX2RlY29tcHJlc3NfcHRyKSZkaW5mbywgMCwgc2l6ZW9mKGRpbmZvKSk7ICAgLy8gZm9yIHNldGptcCBzYW5pdHkKKyAgZGluZm8uZXJyID0ganBlZ19zdGRfZXJyb3IoJmplcnIucHViKTsKKyAgamVyci5wdWIuZXJyb3JfZXhpdCA9IG15X2Vycm9yX2V4aXQ7CisKKyAgaWYgKHNldGptcChqZXJyLnNldGptcF9idWZmZXIpKSB7CisgRXJyb3I6CisgICAgTWV0YWRhdGFGcmVlKG1ldGFkYXRhKTsKKyAgICBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcygoal9kZWNvbXByZXNzX3B0cikmZGluZm8pOworICAgIGdvdG8gRW5kOworICB9CisKKyAganBlZ19jcmVhdGVfZGVjb21wcmVzcygoal9kZWNvbXByZXNzX3B0cikmZGluZm8pOworICBDb250ZXh0U2V0dXAoJmRpbmZvLCAmY3R4KTsKKyAgaWYgKG1ldGFkYXRhICE9IE5VTEwpIFNhdmVNZXRhZGF0YU1hcmtlcnMoKGpfZGVjb21wcmVzc19wdHIpJmRpbmZvKTsKKyAganBlZ19yZWFkX2hlYWRlcigoal9kZWNvbXByZXNzX3B0cikmZGluZm8sIFRSVUUpOworCisgIGRpbmZvLm91dF9jb2xvcl9zcGFjZSA9IEpDU19SR0I7CisgIGRpbmZvLmRvX2ZhbmN5X3Vwc2FtcGxpbmcgPSBUUlVFOworCisgIGpwZWdfc3RhcnRfZGVjb21wcmVzcygoal9kZWNvbXByZXNzX3B0cikmZGluZm8pOworCisgIGlmIChkaW5mby5vdXRwdXRfY29tcG9uZW50cyAhPSAzKSB7CisgICAgZ290byBFcnJvcjsKKyAgfQorCisgIHdpZHRoID0gZGluZm8ub3V0cHV0X3dpZHRoOworICBoZWlnaHQgPSBkaW5mby5vdXRwdXRfaGVpZ2h0OworICBzdHJpZGUgPSAoaW50NjRfdClkaW5mby5vdXRwdXRfd2lkdGggKiBkaW5mby5vdXRwdXRfY29tcG9uZW50cyAqIHNpemVvZigqcmdiKTsKKworICBpZiAoc3RyaWRlICE9IChpbnQpc3RyaWRlIHx8CisgICAgICAhSW1nSW9VdGlsQ2hlY2tTaXplQXJndW1lbnRzT3ZlcmZsb3coc3RyaWRlLCBoZWlnaHQpKSB7CisgICAgZ290byBFcnJvcjsKKyAgfQorCisgIHJnYiA9ICh1aW50OF90KiltYWxsb2MoKHNpemVfdClzdHJpZGUgKiBoZWlnaHQpOworICBpZiAocmdiID09IE5VTEwpIHsKKyAgICBnb3RvIEVycm9yOworICB9CisgIGJ1ZmZlclswXSA9IChKU0FNUExFKilyZ2I7CisKKyAgd2hpbGUgKGRpbmZvLm91dHB1dF9zY2FubGluZSA8IGRpbmZvLm91dHB1dF9oZWlnaHQpIHsKKyAgICBpZiAoanBlZ19yZWFkX3NjYW5saW5lcygoal9kZWNvbXByZXNzX3B0cikmZGluZm8sIGJ1ZmZlciwgMSkgIT0gMSkgeworICAgICAgZ290byBFcnJvcjsKKyAgICB9CisgICAgYnVmZmVyWzBdICs9IHN0cmlkZTsKKyAgfQorCisgIGlmIChtZXRhZGF0YSAhPSBOVUxMKSB7CisgICAgb2sgPSBFeHRyYWN0TWV0YWRhdGFGcm9tSlBFRygoal9kZWNvbXByZXNzX3B0cikmZGluZm8sIG1ldGFkYXRhKTsKKyAgICBpZiAoIW9rKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGV4dHJhY3RpbmcgSlBFRyBtZXRhZGF0YSFcbiIpOworICAgICAgZ290byBFcnJvcjsKKyAgICB9CisgIH0KKworICBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKChqX2RlY29tcHJlc3NfcHRyKSZkaW5mbyk7CisgIGpwZWdfZGVzdHJveV9kZWNvbXByZXNzKChqX2RlY29tcHJlc3NfcHRyKSZkaW5mbyk7CisKKyAgLy8gV2ViUCBjb252ZXJzaW9uLgorICBwaWMtPndpZHRoID0gd2lkdGg7CisgIHBpYy0+aGVpZ2h0ID0gaGVpZ2h0OworICBvayA9IFdlYlBQaWN0dXJlSW1wb3J0UkdCKHBpYywgcmdiLCAoaW50KXN0cmlkZSk7CisgIGlmICghb2spIGdvdG8gRXJyb3I7CisKKyBFbmQ6CisgIGZyZWUocmdiKTsKKyAgcmV0dXJuIG9rOworfQorI2Vsc2UgIC8vICFXRUJQX0hBVkVfSlBFRworaW50IFJlYWRKUEVHKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgc3RydWN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsIGludCBrZWVwX2FscGhhLAorICAgICAgICAgICAgIHN0cnVjdCBNZXRhZGF0YSogY29uc3QgbWV0YWRhdGEpIHsKKyAgKHZvaWQpZGF0YTsKKyAgKHZvaWQpZGF0YV9zaXplOworICAodm9pZClwaWM7CisgICh2b2lkKWtlZXBfYWxwaGE7CisgICh2b2lkKW1ldGFkYXRhOworICBmcHJpbnRmKHN0ZGVyciwgIkpQRUcgc3VwcG9ydCBub3QgY29tcGlsZWQuIFBsZWFzZSBpbnN0YWxsIHRoZSBsaWJqcGVnICIKKyAgICAgICAgICAiZGV2ZWxvcG1lbnQgcGFja2FnZSBiZWZvcmUgYnVpbGRpbmcuXG4iKTsKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYgIC8vIFdFQlBfSEFWRV9KUEVHCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL2pwZWdkZWMuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vanBlZ2RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZmMxNGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL2pwZWdkZWMuaApAQCAtMCwwICsxLDM3IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gSlBFRyBkZWNvZGUuCisKKyNpZm5kZWYgV0VCUF9JTUFHRUlPX0pQRUdERUNfSF8KKyNkZWZpbmUgV0VCUF9JTUFHRUlPX0pQRUdERUNfSF8KKworI2luY2x1ZGUgIndlYnAvdHlwZXMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgTWV0YWRhdGE7CitzdHJ1Y3QgV2ViUFBpY3R1cmU7CisKKy8vIFJlYWRzIGEgSlBFRyBmcm9tICdkYXRhJywgcmV0dXJuaW5nIHRoZSBkZWNvZGVkIG91dHB1dCBpbiAncGljJy4KKy8vIFRoZSBvdXRwdXQgaXMgUkdCIG9yIFlVViBkZXBlbmRpbmcgb24gcGljLT51c2VfYXJnYiB2YWx1ZS4KKy8vIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLgorLy8gJ2tlZXBfYWxwaGEnIGhhcyBubyBlZmZlY3QsIGJ1dCBpcyBrZXB0IGZvciBjb2hlcmVuY2Ugd2l0aCBvdGhlciBzaWduYXR1cmVzCisvLyBmb3IgaW1hZ2UgcmVhZGVycy4KK2ludCBSZWFkSlBFRyhjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgIHN0cnVjdCBXZWJQUGljdHVyZSogY29uc3QgcGljLCBpbnQga2VlcF9hbHBoYSwKKyAgICAgICAgICAgICBzdHJ1Y3QgTWV0YWRhdGEqIGNvbnN0IG1ldGFkYXRhKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8vIFdFQlBfSU1BR0VJT19KUEVHREVDX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL21ldGFkYXRhLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL21ldGFkYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM2ZjJmNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vbWV0YWRhdGEuYwpAQCAtMCwwICsxLDQ5IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gIE1ldGFkYXRhIHR5cGVzIGFuZCBmdW5jdGlvbnMuCisvLworCisjaW5jbHVkZSAiLi9tZXRhZGF0YS5oIgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJ3ZWJwL3R5cGVzLmgiCisKK3ZvaWQgTWV0YWRhdGFJbml0KE1ldGFkYXRhKiBjb25zdCBtZXRhZGF0YSkgeworICBpZiAobWV0YWRhdGEgPT0gTlVMTCkgcmV0dXJuOworICBtZW1zZXQobWV0YWRhdGEsIDAsIHNpemVvZigqbWV0YWRhdGEpKTsKK30KKwordm9pZCBNZXRhZGF0YVBheWxvYWREZWxldGUoTWV0YWRhdGFQYXlsb2FkKiBjb25zdCBwYXlsb2FkKSB7CisgIGlmIChwYXlsb2FkID09IE5VTEwpIHJldHVybjsKKyAgZnJlZShwYXlsb2FkLT5ieXRlcyk7CisgIHBheWxvYWQtPmJ5dGVzID0gTlVMTDsKKyAgcGF5bG9hZC0+c2l6ZSA9IDA7Cit9CisKK3ZvaWQgTWV0YWRhdGFGcmVlKE1ldGFkYXRhKiBjb25zdCBtZXRhZGF0YSkgeworICBpZiAobWV0YWRhdGEgPT0gTlVMTCkgcmV0dXJuOworICBNZXRhZGF0YVBheWxvYWREZWxldGUoJm1ldGFkYXRhLT5leGlmKTsKKyAgTWV0YWRhdGFQYXlsb2FkRGVsZXRlKCZtZXRhZGF0YS0+aWNjcCk7CisgIE1ldGFkYXRhUGF5bG9hZERlbGV0ZSgmbWV0YWRhdGEtPnhtcCk7Cit9CisKK2ludCBNZXRhZGF0YUNvcHkoY29uc3QgY2hhciogbWV0YWRhdGEsIHNpemVfdCBtZXRhZGF0YV9sZW4sCisgICAgICAgICAgICAgICAgIE1ldGFkYXRhUGF5bG9hZCogY29uc3QgcGF5bG9hZCkgeworICBpZiAobWV0YWRhdGEgPT0gTlVMTCB8fCBtZXRhZGF0YV9sZW4gPT0gMCB8fCBwYXlsb2FkID09IE5VTEwpIHJldHVybiAwOworICBwYXlsb2FkLT5ieXRlcyA9ICh1aW50OF90KiltYWxsb2MobWV0YWRhdGFfbGVuKTsKKyAgaWYgKHBheWxvYWQtPmJ5dGVzID09IE5VTEwpIHJldHVybiAwOworICBwYXlsb2FkLT5zaXplID0gbWV0YWRhdGFfbGVuOworICBtZW1jcHkocGF5bG9hZC0+Ynl0ZXMsIG1ldGFkYXRhLCBtZXRhZGF0YV9sZW4pOworICByZXR1cm4gMTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vbWV0YWRhdGEuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vbWV0YWRhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDViZTkxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby9tZXRhZGF0YS5oCkBAIC0wLDAgKzEsNDcgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgTWV0YWRhdGEgdHlwZXMgYW5kIGZ1bmN0aW9ucy4KKy8vCisKKyNpZm5kZWYgV0VCUF9JTUFHRUlPX01FVEFEQVRBX0hfCisjZGVmaW5lIFdFQlBfSU1BR0VJT19NRVRBREFUQV9IXworCisjaW5jbHVkZSAid2VicC90eXBlcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IE1ldGFkYXRhUGF5bG9hZCB7CisgIHVpbnQ4X3QqIGJ5dGVzOworICBzaXplX3Qgc2l6ZTsKK30gTWV0YWRhdGFQYXlsb2FkOworCit0eXBlZGVmIHN0cnVjdCBNZXRhZGF0YSB7CisgIE1ldGFkYXRhUGF5bG9hZCBleGlmOworICBNZXRhZGF0YVBheWxvYWQgaWNjcDsKKyAgTWV0YWRhdGFQYXlsb2FkIHhtcDsKK30gTWV0YWRhdGE7CisKKyNkZWZpbmUgTUVUQURBVEFfT0ZGU0VUKHgpIG9mZnNldG9mKE1ldGFkYXRhLCB4KQorCit2b2lkIE1ldGFkYXRhSW5pdChNZXRhZGF0YSogY29uc3QgbWV0YWRhdGEpOwordm9pZCBNZXRhZGF0YVBheWxvYWREZWxldGUoTWV0YWRhdGFQYXlsb2FkKiBjb25zdCBwYXlsb2FkKTsKK3ZvaWQgTWV0YWRhdGFGcmVlKE1ldGFkYXRhKiBjb25zdCBtZXRhZGF0YSk7CisKKy8vIFN0b3JlcyAnbWV0YWRhdGEnIHRvICdwYXlsb2FkLT5ieXRlcycsIHJldHVybnMgZmFsc2Ugb24gYWxsb2NhdGlvbiBlcnJvci4KK2ludCBNZXRhZGF0YUNvcHkoY29uc3QgY2hhciogbWV0YWRhdGEsIHNpemVfdCBtZXRhZGF0YV9sZW4sCisgICAgICAgICAgICAgICAgIE1ldGFkYXRhUGF5bG9hZCogY29uc3QgcGF5bG9hZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvLyBXRUJQX0lNQUdFSU9fTUVUQURBVEFfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vcG5nZGVjLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL3BuZ2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MjIzNTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL3BuZ2RlYy5jCkBAIC0wLDAgKzEsMzQwIEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gUE5HIGRlY29kZS4KKworI2luY2x1ZGUgIi4vcG5nZGVjLmgiCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAid2VicC9jb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmZGVmIFdFQlBfSEFWRV9QTkcKKyNpbmNsdWRlIDxwbmcuaD4KKyNpbmNsdWRlIDxzZXRqbXAuaD4gICAvLyBub3RlOiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgKmFmdGVyKiBwbmcuaAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAid2VicC9lbmNvZGUuaCIKKyNpbmNsdWRlICIuL2ltYWdlaW9fdXRpbC5oIgorI2luY2x1ZGUgIi4vbWV0YWRhdGEuaCIKKworc3RhdGljIHZvaWQgUE5HQVBJIGVycm9yX2Z1bmN0aW9uKHBuZ19zdHJ1Y3RwIHBuZywgcG5nX2NvbnN0X2NoYXJwIGVycm9yKSB7CisgIGlmIChlcnJvciAhPSBOVUxMKSBmcHJpbnRmKHN0ZGVyciwgImxpYnBuZyBlcnJvcjogJXNcbiIsIGVycm9yKTsKKyAgbG9uZ2ptcChwbmdfam1wYnVmKHBuZyksIDEpOworfQorCisvLyBDb252ZXJ0cyB0aGUgTlVMTCB0ZXJtaW5hdGVkICdoZXhzdHJpbmcnIHdoaWNoIGNvbnRhaW5zIDItYnl0ZSBjaGFyYWN0ZXIKKy8vIHJlcHJlc2VudGF0aW9ucyBvZiBoZXggdmFsdWVzIHRvIHJhdyBkYXRhLgorLy8gJ2hleHN0cmluZycgbWF5IGNvbnRhaW4gdmFsdWVzIGNvbnNpc3Rpbmcgb2YgW0EtRl1bYS1mXVswLTldIGluIHBhaXJzLAorLy8gZS5nLiwgN2FmMi4uLiwgc2VwYXJhdGVkIGJ5IGFueSBudW1iZXIgb2YgbmV3bGluZXMuCisvLyAnZXhwZWN0ZWRfbGVuZ3RoJyBpcyB0aGUgYW50aWNpcGF0ZWQgcHJvY2Vzc2VkIHNpemUuCisvLyBPbiBzdWNjZXNzIHRoZSByYXcgYnVmZmVyIGlzIHJldHVybmVkIHdpdGggaXRzIGxlbmd0aCBlcXVpdmFsZW50IHRvCisvLyAnZXhwZWN0ZWRfbGVuZ3RoJy4gTlVMTCBpcyByZXR1cm5lZCBpZiB0aGUgcHJvY2Vzc2VkIGxlbmd0aCBpcyBsZXNzIHRoYW4KKy8vICdleHBlY3RlZF9sZW5ndGgnIG9yIGFueSBjaGFyYWN0ZXIgYXNpZGUgZnJvbSB0aG9zZSBhYm92ZSBpcyBlbmNvdW50ZXJlZC4KKy8vIFRoZSByZXR1cm5lZCBidWZmZXIgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgorc3RhdGljIHVpbnQ4X3QqIEhleFN0cmluZ1RvQnl0ZXMoY29uc3QgY2hhciogaGV4c3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGV4cGVjdGVkX2xlbmd0aCkgeworICBjb25zdCBjaGFyKiBzcmMgPSBoZXhzdHJpbmc7CisgIHNpemVfdCBhY3R1YWxfbGVuZ3RoID0gMDsKKyAgdWludDhfdCogY29uc3QgcmF3X2RhdGEgPSAodWludDhfdCopbWFsbG9jKGV4cGVjdGVkX2xlbmd0aCk7CisgIHVpbnQ4X3QqIGRzdDsKKworICBpZiAocmF3X2RhdGEgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgZm9yIChkc3QgPSByYXdfZGF0YTsgYWN0dWFsX2xlbmd0aCA8IGV4cGVjdGVkX2xlbmd0aCAmJiAqc3JjICE9ICdcMCc7ICsrc3JjKSB7CisgICAgY2hhciogZW5kOworICAgIGNoYXIgdmFsWzNdOworICAgIGlmICgqc3JjID09ICdcbicpIGNvbnRpbnVlOworICAgIHZhbFswXSA9ICpzcmMrKzsKKyAgICB2YWxbMV0gPSAqc3JjOworICAgIHZhbFsyXSA9ICdcMCc7CisgICAgKmRzdCsrID0gKHVpbnQ4X3Qpc3RydG9sKHZhbCwgJmVuZCwgMTYpOworICAgIGlmIChlbmQgIT0gdmFsICsgMikgYnJlYWs7CisgICAgKythY3R1YWxfbGVuZ3RoOworICB9CisKKyAgaWYgKGFjdHVhbF9sZW5ndGggIT0gZXhwZWN0ZWRfbGVuZ3RoKSB7CisgICAgZnJlZShyYXdfZGF0YSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIHJhd19kYXRhOworfQorCitzdGF0aWMgaW50IFByb2Nlc3NSYXdQcm9maWxlKGNvbnN0IGNoYXIqIHByb2ZpbGUsIHNpemVfdCBwcm9maWxlX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YWRhdGFQYXlsb2FkKiBjb25zdCBwYXlsb2FkKSB7CisgIGNvbnN0IGNoYXIqIHNyYyA9IHByb2ZpbGU7CisgIGNoYXIqIGVuZDsKKyAgaW50IGV4cGVjdGVkX2xlbmd0aDsKKworICBpZiAocHJvZmlsZSA9PSBOVUxMIHx8IHByb2ZpbGVfbGVuID09IDApIHJldHVybiAwOworCisgIC8vIEltYWdlTWFnaWNrIGZvcm1hdHMgJ3JhdyBwcm9maWxlcycgYXMKKyAgLy8gJ1xuPG5hbWU+XG48bGVuZ3RoPiglOGx1KVxuPGhleCBwYXlsb2FkPlxuJy4KKyAgaWYgKCpzcmMgIT0gJ1xuJykgeworICAgIGZwcmludGYoc3RkZXJyLCAiTWFsZm9ybWVkIHJhdyBwcm9maWxlLCBleHBlY3RlZCAnXFxuJyBnb3QgJ1xceCUuMlgnXG4iLAorICAgICAgICAgICAgKnNyYyk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgKytzcmM7CisgIC8vIHNraXAgdGhlIHByb2ZpbGUgbmFtZSBhbmQgZXh0cmFjdCB0aGUgbGVuZ3RoLgorICB3aGlsZSAoKnNyYyAhPSAnXDAnICYmICpzcmMrKyAhPSAnXG4nKSB7fQorICBleHBlY3RlZF9sZW5ndGggPSAoaW50KXN0cnRvbChzcmMsICZlbmQsIDEwKTsKKyAgaWYgKCplbmQgIT0gJ1xuJykgeworICAgIGZwcmludGYoc3RkZXJyLCAiTWFsZm9ybWVkIHJhdyBwcm9maWxlLCBleHBlY3RlZCAnXFxuJyBnb3QgJ1xceCUuMlgnXG4iLAorICAgICAgICAgICAgKmVuZCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgKytlbmQ7CisKKyAgLy8gJ2VuZCcgbm93IHBvaW50cyB0byB0aGUgcHJvZmlsZSBwYXlsb2FkLgorICBwYXlsb2FkLT5ieXRlcyA9IEhleFN0cmluZ1RvQnl0ZXMoZW5kLCBleHBlY3RlZF9sZW5ndGgpOworICBpZiAocGF5bG9hZC0+Ynl0ZXMgPT0gTlVMTCkgcmV0dXJuIDA7CisgIHBheWxvYWQtPnNpemUgPSBleHBlY3RlZF9sZW5ndGg7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgY29uc3QgY2hhciogbmFtZTsKKyAgaW50ICgqcHJvY2VzcykoY29uc3QgY2hhciogcHJvZmlsZSwgc2l6ZV90IHByb2ZpbGVfbGVuLAorICAgICAgICAgICAgICAgICBNZXRhZGF0YVBheWxvYWQqIGNvbnN0IHBheWxvYWQpOworICBzaXplX3Qgc3RvcmFnZV9vZmZzZXQ7Cit9IGtQTkdNZXRhZGF0YU1hcFtdID0geworICAvLyBodHRwOi8vd3d3LnNuby5waHkucXVlZW5zdS5jYS9+cGhpbC9leGlmdG9vbC9UYWdOYW1lcy9QTkcuaHRtbCNUZXh0dWFsRGF0YQorICAvLyBTZWUgYWxzbzogRXhpZlRvb2wgb24gQ1BBTi4KKyAgeyAiUmF3IHByb2ZpbGUgdHlwZSBleGlmIiwgUHJvY2Vzc1Jhd1Byb2ZpbGUsIE1FVEFEQVRBX09GRlNFVChleGlmKSB9LAorICB7ICJSYXcgcHJvZmlsZSB0eXBlIHhtcCIsICBQcm9jZXNzUmF3UHJvZmlsZSwgTUVUQURBVEFfT0ZGU0VUKHhtcCkgfSwKKyAgLy8gRXhpZnRvb2wgcHV0cyBleGlmIGRhdGEgaW4gQVBQMSBjaHVuaywgdG9vLgorICB7ICJSYXcgcHJvZmlsZSB0eXBlIEFQUDEiLCBQcm9jZXNzUmF3UHJvZmlsZSwgTUVUQURBVEFfT0ZGU0VUKGV4aWYpIH0sCisgIC8vIFhNUCBTcGVjaWZpY2F0aW9uIFBhcnQgMywgU2VjdGlvbiAzICNQTkcKKyAgeyAiWE1MOmNvbS5hZG9iZS54bXAiLCAgICAgTWV0YWRhdGFDb3B5LCAgICAgIE1FVEFEQVRBX09GRlNFVCh4bXApIH0sCisgIHsgTlVMTCwgTlVMTCwgMCB9LAorfTsKKworLy8gTG9va3MgZm9yIG1ldGFkYXRhIGF0IGJvdGggdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIHRoZSBQTkcgZmlsZSwgZ2l2aW5nCisvLyBwcmVmZXJlbmNlIHRvIHRoZSBoZWFkLgorLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MuIFRoZSBjYWxsZXIgbXVzdCB1c2UgTWV0YWRhdGFGcmVlKCkgb24gJ21ldGFkYXRhJyBpbgorLy8gYWxsIGNhc2VzLgorc3RhdGljIGludCBFeHRyYWN0TWV0YWRhdGFGcm9tUE5HKHBuZ19zdHJ1Y3RwIHBuZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfaW5mb3AgY29uc3QgaGVhZF9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19pbmZvcCBjb25zdCBlbmRfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhZGF0YSogY29uc3QgbWV0YWRhdGEpIHsKKyAgaW50IHA7CisKKyAgZm9yIChwID0gMDsgcCA8IDI7ICsrcCkgIHsKKyAgICBwbmdfaW5mb3AgY29uc3QgaW5mbyA9IChwID09IDApID8gaGVhZF9pbmZvIDogZW5kX2luZm87CisgICAgcG5nX3RleHRwIHRleHQgPSBOVUxMOworICAgIGNvbnN0IHBuZ191aW50XzMyIG51bSA9IHBuZ19nZXRfdGV4dChwbmcsIGluZm8sICZ0ZXh0LCBOVUxMKTsKKyAgICBwbmdfdWludF8zMiBpOworICAgIC8vIExvb2sgZm9yIEVYSUYgLyBYTVAgbWV0YWRhdGEuCisgICAgZm9yIChpID0gMDsgaSA8IG51bTsgKytpLCArK3RleHQpIHsKKyAgICAgIGludCBqOworICAgICAgZm9yIChqID0gMDsga1BOR01ldGFkYXRhTWFwW2pdLm5hbWUgIT0gTlVMTDsgKytqKSB7CisgICAgICAgIGlmICghc3RyY21wKHRleHQtPmtleSwga1BOR01ldGFkYXRhTWFwW2pdLm5hbWUpKSB7CisgICAgICAgICAgTWV0YWRhdGFQYXlsb2FkKiBjb25zdCBwYXlsb2FkID0KKyAgICAgICAgICAgICAgKE1ldGFkYXRhUGF5bG9hZCopKCh1aW50OF90KiltZXRhZGF0YSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUE5HTWV0YWRhdGFNYXBbal0uc3RvcmFnZV9vZmZzZXQpOworICAgICAgICAgIHBuZ19zaXplX3QgdGV4dF9sZW5ndGg7CisgICAgICAgICAgc3dpdGNoICh0ZXh0LT5jb21wcmVzc2lvbikgeworI2lmZGVmIFBOR19pVFh0X1NVUFBPUlRFRAorICAgICAgICAgICAgY2FzZSBQTkdfSVRYVF9DT01QUkVTU0lPTl9OT05FOgorICAgICAgICAgICAgY2FzZSBQTkdfSVRYVF9DT01QUkVTU0lPTl96VFh0OgorICAgICAgICAgICAgICB0ZXh0X2xlbmd0aCA9IHRleHQtPml0eHRfbGVuZ3RoOworICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICAgICAgY2FzZSBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FOgorICAgICAgICAgICAgY2FzZSBQTkdfVEVYVF9DT01QUkVTU0lPTl96VFh0OgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgdGV4dF9sZW5ndGggPSB0ZXh0LT50ZXh0X2xlbmd0aDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChwYXlsb2FkLT5ieXRlcyAhPSBOVUxMKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIklnbm9yaW5nIGFkZGl0aW9uYWwgJyVzJ1xuIiwgdGV4dC0+a2V5KTsKKyAgICAgICAgICB9IGVsc2UgaWYgKCFrUE5HTWV0YWRhdGFNYXBbal0ucHJvY2Vzcyh0ZXh0LT50ZXh0LCB0ZXh0X2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkKSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gcHJvY2VzczogJyVzJ1xuIiwgdGV4dC0+a2V5KTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAvLyBMb29rIGZvciBhbiBJQ0MgcHJvZmlsZS4KKyAgICB7CisgICAgICBwbmdfY2hhcnAgbmFtZTsKKyAgICAgIGludCBjb21wX3R5cGU7CisjaWYgKChQTkdfTElCUE5HX1ZFUl9NQUpPUiA8PCA4KSB8IFBOR19MSUJQTkdfVkVSX01JTk9SIDw8IDApIDwgXAorICAgICgoMSA8PCA4KSB8ICg1IDw8IDApKQorICAgICAgcG5nX2NoYXJwIHByb2ZpbGU7CisjZWxzZSAgLy8gPj0gbGlicG5nIDEuNS4wCisgICAgICBwbmdfYnl0ZXAgcHJvZmlsZTsKKyNlbmRpZgorICAgICAgcG5nX3VpbnRfMzIgbGVuOworCisgICAgICBpZiAocG5nX2dldF9pQ0NQKHBuZywgaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgJm5hbWUsICZjb21wX3R5cGUsICZwcm9maWxlLCAmbGVuKSA9PSBQTkdfSU5GT19pQ0NQKSB7CisgICAgICAgIGlmICghTWV0YWRhdGFDb3B5KChjb25zdCBjaGFyKilwcm9maWxlLCBsZW4sICZtZXRhZGF0YS0+aWNjcCkpIHJldHVybiAwOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gMTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgeworICBjb25zdCB1aW50OF90KiBkYXRhOworICBzaXplX3QgZGF0YV9zaXplOworICBwbmdfc2l6ZV90IG9mZnNldDsKK30gUE5HUmVhZENvbnRleHQ7CisKK3N0YXRpYyB2b2lkIFJlYWRGdW5jKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcCBkYXRhLCBwbmdfc2l6ZV90IGxlbmd0aCkgeworICBQTkdSZWFkQ29udGV4dCogY29uc3QgY3R4ID0gKFBOR1JlYWRDb250ZXh0KilwbmdfZ2V0X2lvX3B0cihwbmdfcHRyKTsKKyAgaWYgKGN0eC0+ZGF0YV9zaXplIC0gY3R4LT5vZmZzZXQgPCBsZW5ndGgpIHsKKyAgICBwbmdfZXJyb3IocG5nX3B0ciwgIlJlYWRGdW5jOiBpbnZhbGlkIHJlYWQgbGVuZ3RoIChvdmVyZmxvdykhIik7CisgIH0KKyAgbWVtY3B5KGRhdGEsIGN0eC0+ZGF0YSArIGN0eC0+b2Zmc2V0LCBsZW5ndGgpOworICBjdHgtPm9mZnNldCArPSBsZW5ndGg7Cit9CisKK2ludCBSZWFkUE5HKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICBzdHJ1Y3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywKKyAgICAgICAgICAgIGludCBrZWVwX2FscGhhLCBzdHJ1Y3QgTWV0YWRhdGEqIGNvbnN0IG1ldGFkYXRhKSB7CisgIHZvbGF0aWxlIHBuZ19zdHJ1Y3RwIHBuZyA9IE5VTEw7CisgIHZvbGF0aWxlIHBuZ19pbmZvcCBpbmZvID0gTlVMTDsKKyAgdm9sYXRpbGUgcG5nX2luZm9wIGVuZF9pbmZvID0gTlVMTDsKKyAgUE5HUmVhZENvbnRleHQgY29udGV4dCA9IHsgTlVMTCwgMCwgMCB9OworICBpbnQgY29sb3JfdHlwZSwgYml0X2RlcHRoLCBpbnRlcmxhY2VkOworICBpbnQgaGFzX2FscGhhOworICBpbnQgbnVtX3Bhc3NlczsKKyAgaW50IHA7CisgIHZvbGF0aWxlIGludCBvayA9IDA7CisgIHBuZ191aW50XzMyIHdpZHRoLCBoZWlnaHQsIHk7CisgIGludDY0X3Qgc3RyaWRlOworICB1aW50OF90KiB2b2xhdGlsZSByZ2IgPSBOVUxMOworCisgIGlmIChkYXRhID09IE5VTEwgfHwgZGF0YV9zaXplID09IDAgfHwgcGljID09IE5VTEwpIHJldHVybiAwOworCisgIGNvbnRleHQuZGF0YSA9IGRhdGE7CisgIGNvbnRleHQuZGF0YV9zaXplID0gZGF0YV9zaXplOworCisgIHBuZyA9IHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QoUE5HX0xJQlBOR19WRVJfU1RSSU5HLCAwLCAwLCAwKTsKKyAgaWYgKHBuZyA9PSBOVUxMKSBnb3RvIEVuZDsKKworICBwbmdfc2V0X2Vycm9yX2ZuKHBuZywgMCwgZXJyb3JfZnVuY3Rpb24sIE5VTEwpOworICBpZiAoc2V0am1wKHBuZ19qbXBidWYocG5nKSkpIHsKKyBFcnJvcjoKKyAgICBNZXRhZGF0YUZyZWUobWV0YWRhdGEpOworICAgIGdvdG8gRW5kOworICB9CisKKyAgaW5mbyA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocG5nKTsKKyAgaWYgKGluZm8gPT0gTlVMTCkgZ290byBFcnJvcjsKKyAgZW5kX2luZm8gPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KHBuZyk7CisgIGlmIChlbmRfaW5mbyA9PSBOVUxMKSBnb3RvIEVycm9yOworCisgIHBuZ19zZXRfcmVhZF9mbihwbmcsICZjb250ZXh0LCBSZWFkRnVuYyk7CisgIHBuZ19yZWFkX2luZm8ocG5nLCBpbmZvKTsKKyAgaWYgKCFwbmdfZ2V0X0lIRFIocG5nLCBpbmZvLAorICAgICAgICAgICAgICAgICAgICAmd2lkdGgsICZoZWlnaHQsICZiaXRfZGVwdGgsICZjb2xvcl90eXBlLCAmaW50ZXJsYWNlZCwKKyAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCkpIGdvdG8gRXJyb3I7CisKKyAgcG5nX3NldF9zdHJpcF8xNihwbmcpOworICBwbmdfc2V0X3BhY2tpbmcocG5nKTsKKyAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkgeworICAgIHBuZ19zZXRfcGFsZXR0ZV90b19yZ2IocG5nKTsKKyAgfQorICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZIHx8CisgICAgICBjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEpIHsKKyAgICBpZiAoYml0X2RlcHRoIDwgOCkgeworICAgICAgcG5nX3NldF9leHBhbmRfZ3JheV8xXzJfNF90b184KHBuZyk7CisgICAgfQorICAgIHBuZ19zZXRfZ3JheV90b19yZ2IocG5nKTsKKyAgfQorICBpZiAocG5nX2dldF92YWxpZChwbmcsIGluZm8sIFBOR19JTkZPX3RSTlMpKSB7CisgICAgcG5nX3NldF90Uk5TX3RvX2FscGhhKHBuZyk7CisgICAgaGFzX2FscGhhID0gMTsKKyAgfSBlbHNlIHsKKyAgICBoYXNfYWxwaGEgPSAhIShjb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpOworICB9CisKKyAgLy8gQXBwbHkgZ2FtbWEgY29ycmVjdGlvbiBpZiBuZWVkZWQuCisgIHsKKyAgICBkb3VibGUgaW1hZ2VfZ2FtbWEgPSAxIC8gMi4yLCBzY3JlZW5fZ2FtbWEgPSAyLjI7CisgICAgaW50IHNyZ2JfaW50ZW50OworICAgIGlmIChwbmdfZ2V0X3NSR0IocG5nLCBpbmZvLCAmc3JnYl9pbnRlbnQpIHx8CisgICAgICAgIHBuZ19nZXRfZ0FNQShwbmcsIGluZm8sICZpbWFnZV9nYW1tYSkpIHsKKyAgICAgIHBuZ19zZXRfZ2FtbWEocG5nLCBzY3JlZW5fZ2FtbWEsIGltYWdlX2dhbW1hKTsKKyAgICB9CisgIH0KKworICBpZiAoIWtlZXBfYWxwaGEpIHsKKyAgICBwbmdfc2V0X3N0cmlwX2FscGhhKHBuZyk7CisgICAgaGFzX2FscGhhID0gMDsKKyAgfQorCisgIG51bV9wYXNzZXMgPSBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZyhwbmcpOworICBwbmdfcmVhZF91cGRhdGVfaW5mbyhwbmcsIGluZm8pOworCisgIHN0cmlkZSA9IChpbnQ2NF90KShoYXNfYWxwaGEgPyA0IDogMykgKiB3aWR0aCAqIHNpemVvZigqcmdiKTsKKyAgaWYgKHN0cmlkZSAhPSAoaW50KXN0cmlkZSB8fAorICAgICAgIUltZ0lvVXRpbENoZWNrU2l6ZUFyZ3VtZW50c092ZXJmbG93KHN0cmlkZSwgaGVpZ2h0KSkgeworICAgIGdvdG8gRXJyb3I7CisgIH0KKworICByZ2IgPSAodWludDhfdCopbWFsbG9jKChzaXplX3Qpc3RyaWRlICogaGVpZ2h0KTsKKyAgaWYgKHJnYiA9PSBOVUxMKSBnb3RvIEVycm9yOworICBmb3IgKHAgPSAwOyBwIDwgbnVtX3Bhc3NlczsgKytwKSB7CisgICAgcG5nX2J5dGVwIHJvdyA9IHJnYjsKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKKyAgICAgIHBuZ19yZWFkX3Jvd3MocG5nLCAmcm93LCBOVUxMLCAxKTsKKyAgICAgIHJvdyArPSBzdHJpZGU7CisgICAgfQorICB9CisgIHBuZ19yZWFkX2VuZChwbmcsIGVuZF9pbmZvKTsKKworICBpZiAobWV0YWRhdGEgIT0gTlVMTCAmJgorICAgICAgIUV4dHJhY3RNZXRhZGF0YUZyb21QTkcocG5nLCBpbmZvLCBlbmRfaW5mbywgbWV0YWRhdGEpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBleHRyYWN0aW5nIFBORyBtZXRhZGF0YSFcbiIpOworICAgIGdvdG8gRXJyb3I7CisgIH0KKworICBwaWMtPndpZHRoID0gKGludCl3aWR0aDsKKyAgcGljLT5oZWlnaHQgPSAoaW50KWhlaWdodDsKKyAgb2sgPSBoYXNfYWxwaGEgPyBXZWJQUGljdHVyZUltcG9ydFJHQkEocGljLCByZ2IsIChpbnQpc3RyaWRlKQorICAgICAgICAgICAgICAgICA6IFdlYlBQaWN0dXJlSW1wb3J0UkdCKHBpYywgcmdiLCAoaW50KXN0cmlkZSk7CisKKyAgaWYgKCFvaykgeworICAgIGdvdG8gRXJyb3I7CisgIH0KKworIEVuZDoKKyAgaWYgKHBuZyAhPSBOVUxMKSB7CisgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoKHBuZ19zdHJ1Y3RwcCkmcG5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwbmdfaW5mb3BwKSZpbmZvLCAocG5nX2luZm9wcCkmZW5kX2luZm8pOworICB9CisgIGZyZWUocmdiKTsKKyAgcmV0dXJuIG9rOworfQorI2Vsc2UgIC8vICFXRUJQX0hBVkVfUE5HCitpbnQgUmVhZFBORyhjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgc3RydWN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsCisgICAgICAgICAgICBpbnQga2VlcF9hbHBoYSwgc3RydWN0IE1ldGFkYXRhKiBjb25zdCBtZXRhZGF0YSkgeworICAodm9pZClkYXRhOworICAodm9pZClkYXRhX3NpemU7CisgICh2b2lkKXBpYzsKKyAgKHZvaWQpa2VlcF9hbHBoYTsKKyAgKHZvaWQpbWV0YWRhdGE7CisgIGZwcmludGYoc3RkZXJyLCAiUE5HIHN1cHBvcnQgbm90IGNvbXBpbGVkLiBQbGVhc2UgaW5zdGFsbCB0aGUgbGlicG5nICIKKyAgICAgICAgICAiZGV2ZWxvcG1lbnQgcGFja2FnZSBiZWZvcmUgYnVpbGRpbmcuXG4iKTsKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYgIC8vIFdFQlBfSEFWRV9QTkcKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vcG5nZGVjLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL3BuZ2RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYTYxMjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL3BuZ2RlYy5oCkBAIC0wLDAgKzEsMzcgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBQTkcgZGVjb2RlLgorCisjaWZuZGVmIFdFQlBfSU1BR0VJT19QTkdERUNfSF8KKyNkZWZpbmUgV0VCUF9JTUFHRUlPX1BOR0RFQ19IXworCisjaW5jbHVkZSAid2VicC90eXBlcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBNZXRhZGF0YTsKK3N0cnVjdCBXZWJQUGljdHVyZTsKKworLy8gUmVhZHMgYSBQTkcgZnJvbSAnZGF0YScsIHJldHVybmluZyB0aGUgZGVjb2RlZCBvdXRwdXQgaW4gJ3BpYycuCisvLyBPdXRwdXQgaXMgUkdCQSBvciBZVVZBLCBkZXBlbmRpbmcgb24gcGljLT51c2VfYXJnYiB2YWx1ZS4KKy8vIElmICdrZWVwX2FscGhhJyBpcyB0cnVlIGFuZCB0aGUgUE5HIGhhcyBhbiBhbHBoYSBjaGFubmVsLCB0aGUgb3V0cHV0IGlzIFJHQkEKKy8vIG9yIFlVVkEuIE90aGVyd2lzZSwgYWxwaGEgY2hhbm5lbCBpcyBkcm9wcGVkIGFuZCBvdXRwdXQgaXMgUkdCIG9yIFlVVi4KKy8vIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLgoraW50IFJlYWRQTkcoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgIHN0cnVjdCBXZWJQUGljdHVyZSogY29uc3QgcGljLAorICAgICAgICAgICAgaW50IGtlZXBfYWxwaGEsIHN0cnVjdCBNZXRhZGF0YSogY29uc3QgbWV0YWRhdGEpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gICAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLy8gV0VCUF9JTUFHRUlPX1BOR0RFQ19IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby9wbm1kZWMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vcG5tZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY1YTRhMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vcG5tZGVjLmMKQEAgLTAsMCArMSwyNTcgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAobGltaXRlZCkgUE5NIGRlY29kZXIKKworI2luY2x1ZGUgIi4vcG5tZGVjLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJ3ZWJwL2VuY29kZS5oIgorI2luY2x1ZGUgIi4vaW1hZ2Vpb191dGlsLmgiCisKK3R5cGVkZWYgZW51bSB7CisgIFdJRFRIX0ZMQUcgICAgICA9IDEgPDwgMCwKKyAgSEVJR0hUX0ZMQUcgICAgID0gMSA8PCAxLAorICBERVBUSF9GTEFHICAgICAgPSAxIDw8IDIsCisgIE1BWFZBTF9GTEFHICAgICA9IDEgPDwgMywKKyAgVFVQTEVfRkxBRyAgICAgID0gMSA8PCA0LAorICBBTExfTkVFREVEX0ZMQUdTID0gMHgxZgorfSBQTk1GbGFnczsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBjb25zdCB1aW50OF90KiBkYXRhOworICBzaXplX3QgZGF0YV9zaXplOworICBpbnQgd2lkdGgsIGhlaWdodDsKKyAgaW50IGJ5dGVzX3Blcl9weDsgICAvLyAxLCAzLCA0CisgIGludCBkZXB0aDsKKyAgaW50IG1heF92YWx1ZTsKKyAgaW50IHR5cGU7ICAgICAgICAgICAvLyA1LCA2IG9yIDcKKyAgaW50IHNlZW5fZmxhZ3M7Cit9IFBOTUluZm87CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQTk0gZGVjb2RpbmcKKworI2RlZmluZSBNQVhfTElORV9TSVpFIDEwMjQKK3N0YXRpYyBjb25zdCBzaXplX3Qga01pblBOTUhlYWRlclNpemUgPSAzOworCitzdGF0aWMgc2l6ZV90IFJlYWRMaW5lKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsIHNpemVfdCBvZmYsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgb3V0W01BWF9MSU5FX1NJWkUgKyAxXSwgc2l6ZV90KiBjb25zdCBvdXRfc2l6ZSkgeworICBzaXplX3QgaSA9IDA7CisgICpvdXRfc2l6ZSA9IDA7CisgcmVkbzoKKyAgZm9yIChpID0gMDsgaSA8IE1BWF9MSU5FX1NJWkUgJiYgb2ZmIDwgZGF0YV9zaXplOyArK2kpIHsKKyAgICBvdXRbaV0gPSBkYXRhW29mZisrXTsKKyAgICBpZiAob3V0W2ldID09ICdcbicpIGJyZWFrOworICB9CisgIGlmIChvZmYgPCBkYXRhX3NpemUpIHsKKyAgICBpZiAoaSA9PSAwKSBnb3RvIHJlZG87ICAgICAgICAgLy8gZW1wdHkgbGluZQorICAgIGlmIChvdXRbMF0gPT0gJyMnKSBnb3RvIHJlZG87ICAvLyBza2lwIGNvbW1lbnQKKyAgfQorICBvdXRbaV0gPSAwOyAgIC8vIHNhZmV0eSBzZW50aW5lbAorICAqb3V0X3NpemUgPSBpOworICByZXR1cm4gb2ZmOworfQorCitzdGF0aWMgc2l6ZV90IEZsYWdFcnJvcihjb25zdCBjaGFyIGZsYWdbXSkgeworICBmcHJpbnRmKHN0ZGVyciwgIlBBTSBoZWFkZXIgZXJyb3I6IGZsYWdzICclcycgYWxyZWFkeSBzZWVuLlxuIiwgZmxhZyk7CisgIHJldHVybiAwOworfQorCisvLyBpbnNwaXJlZCBmcm9tIGh0dHA6Ly9uZXRwYm0uc291cmNlZm9yZ2UubmV0L2RvYy9wYW0uaHRtbAorc3RhdGljIHNpemVfdCBSZWFkUEFNRmllbGRzKFBOTUluZm8qIGNvbnN0IGluZm8sIHNpemVfdCBvZmYpIHsKKyAgY2hhciBvdXRbTUFYX0xJTkVfU0laRSArIDFdOworICBzaXplX3Qgb3V0X3NpemU7CisgIGludCB0bXA7CisgIGFzc2VydChpbmZvICE9IE5VTEwpOworICB3aGlsZSAoMSkgeworICAgIG9mZiA9IFJlYWRMaW5lKGluZm8tPmRhdGEsIG9mZiwgaW5mby0+ZGF0YV9zaXplLCBvdXQsICZvdXRfc2l6ZSk7CisgICAgaWYgKG9mZiA9PSAwKSByZXR1cm4gMDsKKyAgICBpZiAoc3NjYW5mKG91dCwgIldJRFRIICVkIiwgJnRtcCkgPT0gMSkgeworICAgICAgaWYgKGluZm8tPnNlZW5fZmxhZ3MgJiBXSURUSF9GTEFHKSByZXR1cm4gRmxhZ0Vycm9yKCJXSURUSCIpOworICAgICAgaW5mby0+c2Vlbl9mbGFncyB8PSBXSURUSF9GTEFHOworICAgICAgaW5mby0+d2lkdGggPSB0bXA7CisgICAgfSBlbHNlIGlmIChzc2NhbmYob3V0LCAiSEVJR0hUICVkIiwgJnRtcCkgPT0gMSkgeworICAgICAgaWYgKGluZm8tPnNlZW5fZmxhZ3MgJiBIRUlHSFRfRkxBRykgcmV0dXJuIEZsYWdFcnJvcigiSEVJR0hUIik7CisgICAgICBpbmZvLT5zZWVuX2ZsYWdzIHw9IEhFSUdIVF9GTEFHOworICAgICAgaW5mby0+aGVpZ2h0ID0gdG1wOworICAgIH0gZWxzZSBpZiAoc3NjYW5mKG91dCwgIkRFUFRIICVkIiwgJnRtcCkgPT0gMSkgeworICAgICAgaWYgKGluZm8tPnNlZW5fZmxhZ3MgJiBERVBUSF9GTEFHKSByZXR1cm4gRmxhZ0Vycm9yKCJERVBUSCIpOworICAgICAgaW5mby0+c2Vlbl9mbGFncyB8PSBERVBUSF9GTEFHOworICAgICAgaW5mby0+ZGVwdGggPSB0bXA7CisgICAgfSBlbHNlIGlmIChzc2NhbmYob3V0LCAiTUFYVkFMICVkIiwgJnRtcCkgPT0gMSkgeworICAgICAgaWYgKGluZm8tPnNlZW5fZmxhZ3MgJiBNQVhWQUxfRkxBRykgcmV0dXJuIEZsYWdFcnJvcigiTUFYVkFMIik7CisgICAgICBpbmZvLT5zZWVuX2ZsYWdzIHw9IE1BWFZBTF9GTEFHOworICAgICAgaW5mby0+bWF4X3ZhbHVlID0gdG1wOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChvdXQsICJUVVBMVFlQRSBSR0JfQUxQSEEiKSkgeworICAgICAgaW5mby0+Ynl0ZXNfcGVyX3B4ID0gNDsKKyAgICAgIGluZm8tPnNlZW5fZmxhZ3MgfD0gVFVQTEVfRkxBRzsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAob3V0LCAiVFVQTFRZUEUgUkdCIikpIHsKKyAgICAgIGluZm8tPmJ5dGVzX3Blcl9weCA9IDM7CisgICAgICBpbmZvLT5zZWVuX2ZsYWdzIHw9IFRVUExFX0ZMQUc7CisgICAgfSBlbHNlIGlmICghc3RyY21wKG91dCwgIlRVUExUWVBFIEdSQVlTQ0FMRSIpKSB7CisgICAgICBpbmZvLT5ieXRlc19wZXJfcHggPSAxOworICAgICAgaW5mby0+c2Vlbl9mbGFncyB8PSBUVVBMRV9GTEFHOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChvdXQsICJFTkRIRFIiKSkgeworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGtFbGxpcHNpc1tdID0gIiAuLi4iOworICAgICAgaW50IGk7CisgICAgICBpZiAob3V0X3NpemUgPiAyMCkgc3ByaW50ZihvdXQgKyAyMCAtIHN0cmxlbihrRWxsaXBzaXMpLCBrRWxsaXBzaXMpOworICAgICAgZm9yIChpID0gMDsgaSA8IChpbnQpc3RybGVuKG91dCk7ICsraSkgeworICAgICAgICBpZiAoIWlzcHJpbnQob3V0W2ldKSkgb3V0W2ldID0gJyAnOworICAgICAgfQorICAgICAgZnByaW50ZihzdGRlcnIsICJQQU0gaGVhZGVyIGVycm9yOiB1bnJlY29nbml6ZWQgZW50cnkgWyVzXVxuIiwgb3V0KTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorICBpZiAoIShpbmZvLT5zZWVuX2ZsYWdzICYgVFVQTEVfRkxBRykpIHsKKyAgICBpZiAoaW5mby0+ZGVwdGggPiAwICYmIGluZm8tPmRlcHRoIDw9IDQgJiYgaW5mby0+ZGVwdGggIT0gMikgeworICAgICAgaW5mby0+c2Vlbl9mbGFncyB8PSBUVVBMRV9GTEFHOworICAgICAgaW5mby0+Ynl0ZXNfcGVyX3B4ID0gaW5mby0+ZGVwdGggKiAoaW5mby0+bWF4X3ZhbHVlID4gMjU1ID8gMiA6IDEpOworICAgIH0gZWxzZSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIlBBTTogaW52YWxpZCBiaXRkZXB0aCAoJWQpLlxuIiwgaW5mby0+ZGVwdGgpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisgIGlmIChpbmZvLT5zZWVuX2ZsYWdzICE9IEFMTF9ORUVERURfRkxBR1MpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlBBTTogaW5jb21wbGV0ZSBoZWFkZXIuXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gb2ZmOworfQorCitzdGF0aWMgc2l6ZV90IFJlYWRIZWFkZXIoUE5NSW5mbyogY29uc3QgaW5mbykgeworICBzaXplX3Qgb2ZmID0gMDsKKyAgY2hhciBvdXRbTUFYX0xJTkVfU0laRSArIDFdOworICBzaXplX3Qgb3V0X3NpemU7CisgIGlmIChpbmZvID09IE5VTEwpIHJldHVybiAwOworICBpZiAoaW5mby0+ZGF0YSA9PSBOVUxMIHx8IGluZm8tPmRhdGFfc2l6ZSA8IGtNaW5QTk1IZWFkZXJTaXplKSByZXR1cm4gMDsKKworICBpbmZvLT53aWR0aCA9IGluZm8tPmhlaWdodCA9IDA7CisgIGluZm8tPnR5cGUgPSAtMTsKKyAgaW5mby0+c2Vlbl9mbGFncyA9IDA7CisgIGluZm8tPmJ5dGVzX3Blcl9weCA9IDA7CisgIGluZm8tPmRlcHRoID0gMDsKKyAgaW5mby0+bWF4X3ZhbHVlID0gMDsKKworICBvZmYgPSBSZWFkTGluZShpbmZvLT5kYXRhLCBvZmYsIGluZm8tPmRhdGFfc2l6ZSwgb3V0LCAmb3V0X3NpemUpOworICBpZiAob2ZmID09IDAgfHwgc3NjYW5mKG91dCwgIlAlZCIsICZpbmZvLT50eXBlKSAhPSAxKSByZXR1cm4gMDsKKyAgaWYgKGluZm8tPnR5cGUgPT0gNykgeworICAgIG9mZiA9IFJlYWRQQU1GaWVsZHMoaW5mbywgb2ZmKTsKKyAgfSBlbHNlIHsKKyAgICBvZmYgPSBSZWFkTGluZShpbmZvLT5kYXRhLCBvZmYsIGluZm8tPmRhdGFfc2l6ZSwgb3V0LCAmb3V0X3NpemUpOworICAgIGlmIChvZmYgPT0gMCB8fCBzc2NhbmYob3V0LCAiJWQgJWQiLCAmaW5mby0+d2lkdGgsICZpbmZvLT5oZWlnaHQpICE9IDIpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBvZmYgPSBSZWFkTGluZShpbmZvLT5kYXRhLCBvZmYsIGluZm8tPmRhdGFfc2l6ZSwgb3V0LCAmb3V0X3NpemUpOworICAgIGlmIChvZmYgPT0gMCB8fCBzc2NhbmYob3V0LCAiJWQiLCAmaW5mby0+bWF4X3ZhbHVlKSAhPSAxKSByZXR1cm4gMDsKKworICAgIC8vIGZpbmlzaCBpbml0aWFsaXppbmcgbWlzc2luZyBmaWVsZHMKKyAgICBpbmZvLT5kZXB0aCA9IChpbmZvLT50eXBlID09IDUpID8gMSA6IDM7CisgICAgaW5mby0+Ynl0ZXNfcGVyX3B4ID0gaW5mby0+ZGVwdGggKiAoaW5mby0+bWF4X3ZhbHVlID4gMjU1ID8gMiA6IDEpOworICB9CisgIC8vIHBlcmZvcm0gc29tZSBiYXNpYyBudW1lcmljYWwgdmFsaWRhdGlvbgorICBpZiAoaW5mby0+d2lkdGggPD0gMCB8fCBpbmZvLT5oZWlnaHQgPD0gMCB8fAorICAgICAgaW5mby0+dHlwZSA8PSAwIHx8IGluZm8tPnR5cGUgPj0gOSB8fAorICAgICAgaW5mby0+ZGVwdGggPD0gMCB8fCBpbmZvLT5kZXB0aCA9PSAyIHx8IGluZm8tPmRlcHRoID4gNCB8fAorICAgICAgaW5mby0+Ynl0ZXNfcGVyX3B4IDwgaW5mby0+ZGVwdGggfHwKKyAgICAgIGluZm8tPm1heF92YWx1ZSA8PSAwIHx8IGluZm8tPm1heF92YWx1ZSA+PSA2NTUzNikgeworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiBvZmY7Cit9CisKK2ludCBSZWFkUE5NKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICBXZWJQUGljdHVyZSogY29uc3QgcGljLCBpbnQga2VlcF9hbHBoYSwKKyAgICAgICAgICAgIHN0cnVjdCBNZXRhZGF0YSogY29uc3QgbWV0YWRhdGEpIHsKKyAgaW50IG9rID0gMDsKKyAgaW50IGksIGo7CisgIHVpbnQ2NF90IHN0cmlkZSwgcGl4ZWxfYnl0ZXM7CisgIHVpbnQ4X3QqIHJnYiA9IE5VTEwsICp0bXBfcmdiOworICBzaXplX3Qgb2Zmc2V0OworICBQTk1JbmZvIGluZm87CisKKyAgaW5mby5kYXRhID0gZGF0YTsKKyAgaW5mby5kYXRhX3NpemUgPSBkYXRhX3NpemU7CisgIG9mZnNldCA9IFJlYWRIZWFkZXIoJmluZm8pOworICBpZiAob2Zmc2V0ID09IDApIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIHBhcnNpbmcgUE5NIGhlYWRlci5cbiIpOworICAgIGdvdG8gRW5kOworICB9CisKKyAgaWYgKGluZm8udHlwZSA8IDUgfHwgaW5mby50eXBlID4gNykgeworICAgIGZwcmludGYoc3RkZXJyLCAiVW5zdXBwb3J0ZWQgUCVkIFBOTSBmb3JtYXQuXG4iLCBpbmZvLnR5cGUpOworICAgIGdvdG8gRW5kOworICB9CisKKyAgLy8gU29tZSBiYXNpYyB2YWxpZGF0aW9ucy4KKyAgaWYgKHBpYyA9PSBOVUxMKSBnb3RvIEVuZDsKKyAgaWYgKGluZm8ud2lkdGggPiBXRUJQX01BWF9ESU1FTlNJT04gfHwgaW5mby5oZWlnaHQgPiBXRUJQX01BWF9ESU1FTlNJT04pIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgJWR4JWQgZGltZW5zaW9uIGZvciBQTk1cbiIsCisgICAgICAgICAgICAgICAgICAgIGluZm8ud2lkdGgsIGluZm8uaGVpZ2h0KTsKKyAgICBnb3RvIEVuZDsKKyAgfQorCisgIHBpeGVsX2J5dGVzID0gKHVpbnQ2NF90KWluZm8ud2lkdGggKiBpbmZvLmhlaWdodCAqIGluZm8uYnl0ZXNfcGVyX3B4OworICBpZiAoZGF0YV9zaXplIDwgb2Zmc2V0ICsgcGl4ZWxfYnl0ZXMpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlRydW5jYXRlZCBQTk0gZmlsZSAoUCVkKS5cbiIsIGluZm8udHlwZSk7CisgICAgZ290byBFbmQ7CisgIH0KKyAgc3RyaWRlID0KKyAgICAgICh1aW50NjRfdCkoaW5mby5ieXRlc19wZXJfcHggPCAzID8gMyA6IGluZm8uYnl0ZXNfcGVyX3B4KSAqIGluZm8ud2lkdGg7CisgIGlmIChzdHJpZGUgIT0gKHNpemVfdClzdHJpZGUgfHwKKyAgICAgICFJbWdJb1V0aWxDaGVja1NpemVBcmd1bWVudHNPdmVyZmxvdyhzdHJpZGUsIGluZm8uaGVpZ2h0KSkgeworICAgIGdvdG8gRW5kOworICB9CisKKyAgcmdiID0gKHVpbnQ4X3QqKW1hbGxvYygoc2l6ZV90KXN0cmlkZSAqIGluZm8uaGVpZ2h0KTsKKyAgaWYgKHJnYiA9PSBOVUxMKSBnb3RvIEVuZDsKKworICAvLyBDb252ZXJ0IGlucHV0CisgIHRtcF9yZ2IgPSByZ2I7CisgIGZvciAoaiA9IDA7IGogPCBpbmZvLmhlaWdodDsgKytqKSB7CisgICAgYXNzZXJ0KG9mZnNldCArIGluZm8uYnl0ZXNfcGVyX3B4ICogaW5mby53aWR0aCA8PSBkYXRhX3NpemUpOworICAgIGlmIChpbmZvLmRlcHRoID09IDEpIHsKKyAgICAgIC8vIGNvbnZlcnQgZ3JheXNjYWxlIC0+IFJHQgorICAgICAgZm9yIChpID0gMDsgaSA8IGluZm8ud2lkdGg7ICsraSkgeworICAgICAgICBjb25zdCB1aW50OF90IHYgPSBkYXRhW29mZnNldCArIGldOworICAgICAgICB0bXBfcmdiWzMgKiBpICsgMF0gPSB0bXBfcmdiWzMgKiBpICsgMV0gPSB0bXBfcmdiWzMgKiBpICsgMl0gPSB2OworICAgICAgfQorICAgIH0gZWxzZSBpZiAoaW5mby5kZXB0aCA9PSAzKSB7ICAgLy8gUkdCCisgICAgICBtZW1jcHkodG1wX3JnYiwgZGF0YSArIG9mZnNldCwgMyAqIGluZm8ud2lkdGggKiBzaXplb2YoKmRhdGEpKTsKKyAgICB9IGVsc2UgaWYgKGluZm8uZGVwdGggPT0gNCkgeyAgIC8vIFJHQkEKKyAgICAgIG1lbWNweSh0bXBfcmdiLCBkYXRhICsgb2Zmc2V0LCA0ICogaW5mby53aWR0aCAqIHNpemVvZigqZGF0YSkpOworICAgIH0KKyAgICBvZmZzZXQgKz0gaW5mby5ieXRlc19wZXJfcHggKiBpbmZvLndpZHRoOworICAgIHRtcF9yZ2IgKz0gc3RyaWRlOworICB9CisKKyAgLy8gV2ViUCBjb252ZXJzaW9uLgorICBwaWMtPndpZHRoID0gaW5mby53aWR0aDsKKyAgcGljLT5oZWlnaHQgPSBpbmZvLmhlaWdodDsKKyAgb2sgPSAoaW5mby5kZXB0aCA9PSA0KSA/IFdlYlBQaWN0dXJlSW1wb3J0UkdCQShwaWMsIHJnYiwgKGludClzdHJpZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgOiBXZWJQUGljdHVyZUltcG9ydFJHQihwaWMsIHJnYiwgKGludClzdHJpZGUpOworICBpZiAoIW9rKSBnb3RvIEVuZDsKKworICBvayA9IDE7CisgRW5kOgorICBmcmVlKCh2b2lkKilyZ2IpOworCisgICh2b2lkKW1ldGFkYXRhOworICAodm9pZClrZWVwX2FscGhhOworICByZXR1cm4gb2s7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL3BubWRlYy5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby9wbm1kZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGQ1ODIzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby9wbm1kZWMuaApAQCAtMCwwICsxLDM3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gcGFydGlhbCBQTk0gZm9ybWF0IGRlY29kZXIgKHBwbS9wZ20pCisKKyNpZm5kZWYgV0VCUF9JTUFHRUlPX1BOTURFQ19IXworI2RlZmluZSBXRUJQX0lNQUdFSU9fUE5NREVDX0hfCisKKyNpbmNsdWRlICJ3ZWJwL3R5cGVzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IE1ldGFkYXRhOworc3RydWN0IFdlYlBQaWN0dXJlOworCisvLyBSZWFkcyBhIFBOTSBmaWxlIGZyb20gJ2RhdGEnLCByZXR1cm5pbmcgdGhlIGRlY29kZWQgb3V0cHV0IGluICdwaWMnLgorLy8gVGhlIG91dHB1dCBpcyBSR0Igb3IgWVVWIGRlcGVuZGluZyBvbiBwaWMtPnVzZV9hcmdiIHZhbHVlLgorLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MuCisvLyAnbWV0YWRhdGEnIGhhcyBubyBlZmZlY3QsIGJ1dCBpcyBrZXB0IGZvciBjb2hlcmVuY2Ugd2l0aCBvdGhlciBzaWduYXR1cmVzCisvLyBmb3IgaW1hZ2UgcmVhZGVycy4KK2ludCBSZWFkUE5NKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICBzdHJ1Y3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywgaW50IGtlZXBfYWxwaGEsCisgICAgICAgICAgICBzdHJ1Y3QgTWV0YWRhdGEqIGNvbnN0IG1ldGFkYXRhKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8vIFdFQlBfSU1BR0VJT19QTk1ERUNfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vdGlmZmRlYy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby90aWZmZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJlYjY4MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vdGlmZmRlYy5jCkBAIC0wLDAgKzEsMjY4IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVElGRiBkZWNvZGUuCisKKyNpbmNsdWRlICIuL3RpZmZkZWMuaCIKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJ3ZWJwL2NvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWZkZWYgV0VCUF9IQVZFX1RJRkYKKyNpbmNsdWRlIDx0aWZmaW8uaD4KKworI2luY2x1ZGUgIndlYnAvZW5jb2RlLmgiCisjaW5jbHVkZSAiLi9pbWFnZWlvX3V0aWwuaCIKKyNpbmNsdWRlICIuL21ldGFkYXRhLmgiCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworICB0dGFnX3QgdGFnOworICBzaXplX3Qgc3RvcmFnZV9vZmZzZXQ7Cit9IGtUSUZGTWV0YWRhdGFNYXBbXSA9IHsKKyAgeyBUSUZGVEFHX0lDQ1BST0ZJTEUsIE1FVEFEQVRBX09GRlNFVChpY2NwKSB9LAorICB7IFRJRkZUQUdfWE1MUEFDS0VULCAgTUVUQURBVEFfT0ZGU0VUKHhtcCkgfSwKKyAgeyAwLCAwIH0sCit9OworCisvLyBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcy4gVGhlIGNhbGxlciBtdXN0IHVzZSBNZXRhZGF0YUZyZWUoKSBvbiAnbWV0YWRhdGEnIGluCisvLyBhbGwgY2FzZXMuCitzdGF0aWMgaW50IEV4dHJhY3RNZXRhZGF0YUZyb21USUZGKFRJRkYqIGNvbnN0IHRpZiwgTWV0YWRhdGEqIGNvbnN0IG1ldGFkYXRhKSB7CisgIGludCBpOworICB0b2ZmX3QgZXhpZl9pZmRfb2Zmc2V0OworCisgIGZvciAoaSA9IDA7IGtUSUZGTWV0YWRhdGFNYXBbaV0udGFnICE9IDA7ICsraSkgeworICAgIE1ldGFkYXRhUGF5bG9hZCogY29uc3QgcGF5bG9hZCA9CisgICAgICAgIChNZXRhZGF0YVBheWxvYWQqKSgodWludDhfdCopbWV0YWRhdGEgKworICAgICAgICAgICAgICAgICAgICAgICAgICAga1RJRkZNZXRhZGF0YU1hcFtpXS5zdG9yYWdlX29mZnNldCk7CisgICAgdm9pZCogdGFnX2RhdGE7CisgICAgdWludDMyIHRhZ19kYXRhX2xlbjsKKworICAgIGlmIChUSUZGR2V0RmllbGQodGlmLCBrVElGRk1ldGFkYXRhTWFwW2ldLnRhZywgJnRhZ19kYXRhX2xlbiwgJnRhZ19kYXRhKSAmJgorICAgICAgICAhTWV0YWRhdGFDb3B5KChjb25zdCBjaGFyKil0YWdfZGF0YSwgdGFnX2RhdGFfbGVuLCBwYXlsb2FkKSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisKKyAgLy8gVE9ETyhqemVybik6IFRvIGV4dHJhY3QgdGhlIHJhdyBFWElGIGRpcmVjdG9yeSBzb21lIHBhcnNpbmcgb2YgaXQgd291bGQgYmUKKyAgLy8gbmVjZXNzYXJ5IHRvIGRldGVybWluZSB0aGUgb3ZlcmFsbCBzaXplLiBJbiBhZGRpdGlvbiwgdmFsdWUgb2Zmc2V0cyBpbgorICAvLyBpbmRpdmlkdWFsIGRpcmVjdG9yeSBlbnRyaWVzIG1heSBuZWVkIHRvIGJlIHVwZGF0ZWQgYXMsIGRlcGVuZGluZyBvbiB0aGUKKyAgLy8gdHlwZSwgdGhleSBhcmUgZmlsZSBiYXNlZC4KKyAgLy8gRXhpZiAyLjIgU2VjdGlvbiA0LjYuMiBUYWcgU3RydWN0dXJlCisgIC8vIFRJRkYgUmV2aXNpb24gNi4wIFBhcnQgMSBTZWN0aW9uIDIgVElGRiBTdHJ1Y3R1cmUgI0ltYWdlIEZpbGUgRGlyZWN0b3J5CisgIGlmIChUSUZGR2V0RmllbGQodGlmLCBUSUZGVEFHX0VYSUZJRkQsICZleGlmX2lmZF9vZmZzZXQpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiBFWElGIGV4dHJhY3Rpb24gZnJvbSBUSUZGIGlzIHVuc3VwcG9ydGVkLlxuIik7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8vIEFkLWhvYyBzdHJ1Y3R1cmUgdG8gc3VwcGx5IHJlYWQtZnJvbS1tZW1vcnkgZnVuY3Rpb25hbGl0aWVzLgordHlwZWRlZiBzdHJ1Y3QgeworICBjb25zdCB1aW50OF90KiBkYXRhOworICB0b2ZmX3Qgc2l6ZTsKKyAgdG9mZl90IHBvczsKK30gTXlEYXRhOworCitzdGF0aWMgaW50IE15Q2xvc2UodGhhbmRsZV90IG9wYXF1ZSkgeworICAodm9pZClvcGFxdWU7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgdG9mZl90IE15U2l6ZSh0aGFuZGxlX3Qgb3BhcXVlKSB7CisgIGNvbnN0IE15RGF0YSogY29uc3QgbXlfZGF0YSA9IChNeURhdGEqKW9wYXF1ZTsKKyAgcmV0dXJuIG15X2RhdGEtPnNpemU7Cit9CisKK3N0YXRpYyB0b2ZmX3QgTXlTZWVrKHRoYW5kbGVfdCBvcGFxdWUsIHRvZmZfdCBvZmZzZXQsIGludCB3aGVuY2UpIHsKKyAgTXlEYXRhKiBjb25zdCBteV9kYXRhID0gKE15RGF0YSopb3BhcXVlOworICBvZmZzZXQgKz0gKHdoZW5jZSA9PSBTRUVLX0NVUikgPyBteV9kYXRhLT5wb3MKKyAgICAgICAgICA6ICh3aGVuY2UgPT0gU0VFS19TRVQpID8gMAorICAgICAgICAgIDogbXlfZGF0YS0+c2l6ZTsKKyAgaWYgKG9mZnNldCA+IG15X2RhdGEtPnNpemUpIHJldHVybiAodG9mZl90KS0xOworICBteV9kYXRhLT5wb3MgPSBvZmZzZXQ7CisgIHJldHVybiBvZmZzZXQ7Cit9CisKK3N0YXRpYyBpbnQgTXlNYXBGaWxlKHRoYW5kbGVfdCBvcGFxdWUsIHZvaWQqKiBiYXNlLCB0b2ZmX3QqIHNpemUpIHsKKyAgKHZvaWQpb3BhcXVlOworICAodm9pZCliYXNlOworICAodm9pZClzaXplOworICByZXR1cm4gMDsKK30KK3N0YXRpYyB2b2lkIE15VW5tYXBGaWxlKHRoYW5kbGVfdCBvcGFxdWUsIHZvaWQqIGJhc2UsIHRvZmZfdCBzaXplKSB7CisgICh2b2lkKW9wYXF1ZTsKKyAgKHZvaWQpYmFzZTsKKyAgKHZvaWQpc2l6ZTsKK30KKworc3RhdGljIHRzaXplX3QgTXlSZWFkKHRoYW5kbGVfdCBvcGFxdWUsIHZvaWQqIGRzdCwgdHNpemVfdCBzaXplKSB7CisgIE15RGF0YSogY29uc3QgbXlfZGF0YSA9IChNeURhdGEqKW9wYXF1ZTsKKyAgaWYgKG15X2RhdGEtPnBvcyArIHNpemUgPiBteV9kYXRhLT5zaXplKSB7CisgICAgc2l6ZSA9ICh0c2l6ZV90KShteV9kYXRhLT5zaXplIC0gbXlfZGF0YS0+cG9zKTsKKyAgfQorICBpZiAoc2l6ZSA+IDApIHsKKyAgICBtZW1jcHkoZHN0LCBteV9kYXRhLT5kYXRhICsgbXlfZGF0YS0+cG9zLCBzaXplKTsKKyAgICBteV9kYXRhLT5wb3MgKz0gc2l6ZTsKKyAgfQorICByZXR1cm4gc2l6ZTsKK30KKworLy8gVW5tdWx0aXBseSBBcmdiIGRhdGEuIFRha2VuIGZyb20gZHNwL2FscGhhX3Byb2Nlc3NpbmcKKy8vICh3ZSBkb24ndCB3YW50IHRvIGZvcmNlIGEgZGVwZW5kZW5jeSB0byBhIGxpYmRzcGRlYyBsaWJyYXJ5KS4KKyNkZWZpbmUgTUZJWCAyNCAgICAvLyAyNGJpdCBmaXhlZC1wb2ludCBhcml0aG1ldGljCisjZGVmaW5lIEhBTEYgKCgxdSA8PCBNRklYKSA+PiAxKQorI2RlZmluZSBLSU5WXzI1NSAoKDF1IDw8IE1GSVgpIC8gMjU1dSkKKworc3RhdGljIHVpbnQzMl90IFVubXVsdCh1aW50OF90IHgsIHVpbnQzMl90IG11bHQpIHsKKyAgY29uc3QgdWludDMyX3QgdiA9ICh4ICogbXVsdCArIEhBTEYpID4+IE1GSVg7CisgIHJldHVybiAodiA+IDI1NXUpID8gMjU1dSA6IHY7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBHZXRTY2FsZSh1aW50MzJfdCBhKSB7CisgIHJldHVybiAoMjU1dSA8PCBNRklYKSAvIGE7Cit9CisKK3N0YXRpYyB2b2lkIE11bHRBUkdCUm93KHVpbnQ4X3QqIHB0ciwgaW50IHdpZHRoKSB7CisgIGludCB4OworICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7ICsreCwgcHRyICs9IDQpIHsKKyAgICBjb25zdCB1aW50MzJfdCBhbHBoYSA9IHB0clszXTsKKyAgICBpZiAoYWxwaGEgPCAyNTUpIHsKKyAgICAgIGlmIChhbHBoYSA9PSAwKSB7ICAgLy8gYWxwaGEgPT0gMAorICAgICAgICBwdHJbMF0gPSBwdHJbMV0gPSBwdHJbMl0gPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgdWludDMyX3Qgc2NhbGUgPSBHZXRTY2FsZShhbHBoYSk7CisgICAgICAgIHB0clswXSA9IFVubXVsdChwdHJbMF0sIHNjYWxlKTsKKyAgICAgICAgcHRyWzFdID0gVW5tdWx0KHB0clsxXSwgc2NhbGUpOworICAgICAgICBwdHJbMl0gPSBVbm11bHQocHRyWzJdLCBzY2FsZSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK2ludCBSZWFkVElGRihjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgIFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsIGludCBrZWVwX2FscGhhLAorICAgICAgICAgICAgIE1ldGFkYXRhKiBjb25zdCBtZXRhZGF0YSkgeworICBNeURhdGEgbXlfZGF0YSA9IHsgZGF0YSwgKHRvZmZfdClkYXRhX3NpemUsIDAgfTsKKyAgVElGRiogdGlmOworICB1aW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICB1aW50MTZfdCBzYW1wbGVzX3Blcl9weCA9IDA7CisgIHVpbnQxNl90IGV4dHJhX3NhbXBsZXMgPSAwOworICB1aW50MTZfdCogZXh0cmFfc2FtcGxlc19wdHIgPSBOVUxMOworICB1aW50MzJfdCogcmFzdGVyOworICBpbnQ2NF90IGFsbG9jX3NpemU7CisgIGludCBvayA9IDA7CisgIHRkaXJfdCBkaXJjb3VudDsKKworICBpZiAoZGF0YSA9PSBOVUxMIHx8IGRhdGFfc2l6ZSA9PSAwIHx8IGRhdGFfc2l6ZSA+IElOVF9NQVggfHwgcGljID09IE5VTEwpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHRpZiA9IFRJRkZDbGllbnRPcGVuKCJNZW1vcnkiLCAiciIsICZteV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICBNeVJlYWQsIE15UmVhZCwgTXlTZWVrLCBNeUNsb3NlLAorICAgICAgICAgICAgICAgICAgICAgICBNeVNpemUsIE15TWFwRmlsZSwgTXlVbm1hcEZpbGUpOworICBpZiAodGlmID09IE5VTEwpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yISBDYW5ub3QgcGFyc2UgVElGRiBmaWxlXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGRpcmNvdW50ID0gVElGRk51bWJlck9mRGlyZWN0b3JpZXModGlmKTsKKyAgaWYgKGRpcmNvdW50ID4gMSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiV2FybmluZzogbXVsdGktZGlyZWN0b3J5IFRJRkYgZmlsZXMgYXJlIG5vdCBzdXBwb3J0ZWQuXG4iCisgICAgICAgICAgICAgICAgICAgICJPbmx5IHRoZSBmaXJzdCB3aWxsIGJlIHVzZWQsICVkIHdpbGwgYmUgaWdub3JlZC5cbiIsCisgICAgICAgICAgICAgICAgICAgIGRpcmNvdW50IC0gMSk7CisgIH0KKyAgaWYgKCFUSUZGR2V0RmllbGREZWZhdWx0ZWQodGlmLCBUSUZGVEFHX1NBTVBMRVNQRVJQSVhFTCwgJnNhbXBsZXNfcGVyX3B4KSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IhIENhbm5vdCByZXRyaWV2ZSBUSUZGIHNhbXBsZXMtcGVyLXBpeGVsIGluZm8uXG4iKTsKKyAgICBnb3RvIEVuZDsKKyAgfQorICBpZiAoc2FtcGxlc19wZXJfcHggPCAzIHx8IHNhbXBsZXNfcGVyX3B4ID4gNCkgZ290byBFbmQ7ICAvLyBub3Qgc3VwcG9ydGVkCisKKyAgaWYgKCEoVElGRkdldEZpZWxkKHRpZiwgVElGRlRBR19JTUFHRVdJRFRILCAmd2lkdGgpICYmCisgICAgICAgIFRJRkZHZXRGaWVsZCh0aWYsIFRJRkZUQUdfSU1BR0VMRU5HVEgsICZoZWlnaHQpKSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IhIENhbm5vdCByZXRyaWV2ZSBUSUZGIGltYWdlIGRpbWVuc2lvbnMuXG4iKTsKKyAgICBnb3RvIEVuZDsKKyAgfQorICBpZiAoIUltZ0lvVXRpbENoZWNrU2l6ZUFyZ3VtZW50c092ZXJmbG93KCh1aW50NjRfdCl3aWR0aCAqIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKnJhc3RlcikpKSB7CisgICAgZ290byBFbmQ7CisgIH0KKyAgaWYgKHNhbXBsZXNfcGVyX3B4ID4gMyAmJiAhVElGRkdldEZpZWxkKHRpZiwgVElGRlRBR19FWFRSQVNBTVBMRVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXh0cmFfc2FtcGxlcywgJmV4dHJhX3NhbXBsZXNfcHRyKSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IhIENhbm5vdCByZXRyaWV2ZSBUSUZGIEV4dHJhU2FtcGxlcyBpbmZvLlxuIik7CisgICAgZ290byBFbmQ7CisgIH0KKworICAvLyBfVGlmZm1hbGxvYyB1c2VzIGEgc2lnbmVkIHR5cGUgZm9yIHNpemUuCisgIGFsbG9jX3NpemUgPSAoaW50NjRfdCkoKHVpbnQ2NF90KXdpZHRoICogaGVpZ2h0ICogc2l6ZW9mKCpyYXN0ZXIpKTsKKyAgaWYgKGFsbG9jX3NpemUgPCAwIHx8IGFsbG9jX3NpemUgIT0gKHRzaXplX3QpYWxsb2Nfc2l6ZSkgZ290byBFbmQ7CisKKyAgcmFzdGVyID0gKHVpbnQzMiopX1RJRkZtYWxsb2MoKHRzaXplX3QpYWxsb2Nfc2l6ZSk7CisgIGlmIChyYXN0ZXIgIT0gTlVMTCkgeworICAgIGlmIChUSUZGUmVhZFJHQkFJbWFnZU9yaWVudGVkKHRpZiwgd2lkdGgsIGhlaWdodCwgcmFzdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9SSUVOVEFUSU9OX1RPUExFRlQsIDEpKSB7CisgICAgICBjb25zdCBpbnQgc3RyaWRlID0gd2lkdGggKiBzaXplb2YoKnJhc3Rlcik7CisgICAgICBwaWMtPndpZHRoID0gd2lkdGg7CisgICAgICBwaWMtPmhlaWdodCA9IGhlaWdodDsKKyAgICAgIC8vIFRJRkYgZGF0YSBpcyBBQkdSCisjaWZkZWYgV09SRFNfQklHRU5ESUFOCisgICAgICBUSUZGU3dhYkFycmF5T2ZMb25nKHJhc3Rlciwgd2lkdGggKiBoZWlnaHQpOworI2VuZGlmCisgICAgICAvLyBpZiB3ZSBoYXZlIGFuIGFscGhhIGNoYW5uZWwsIHdlIG11c3QgdW4tbXVsdGlwbHkgZnJvbSByZ2JBIHRvIFJHQkEKKyAgICAgIGlmIChleHRyYV9zYW1wbGVzID09IDEgJiYgZXh0cmFfc2FtcGxlc19wdHIgIT0gTlVMTCAmJgorICAgICAgICAgIGV4dHJhX3NhbXBsZXNfcHRyWzBdID09IEVYVFJBU0FNUExFX0FTU09DQUxQSEEpIHsKKyAgICAgICAgdWludDMyX3QgeTsKKyAgICAgICAgdWludDhfdCogdG1wID0gKHVpbnQ4X3QqKXJhc3RlcjsKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CisgICAgICAgICAgTXVsdEFSR0JSb3codG1wLCB3aWR0aCk7CisgICAgICAgICAgdG1wICs9IHN0cmlkZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgb2sgPSBrZWVwX2FscGhhCisgICAgICAgICA/IFdlYlBQaWN0dXJlSW1wb3J0UkdCQShwaWMsIChjb25zdCB1aW50OF90KilyYXN0ZXIsIHN0cmlkZSkKKyAgICAgICAgIDogV2ViUFBpY3R1cmVJbXBvcnRSR0JYKHBpYywgKGNvbnN0IHVpbnQ4X3QqKXJhc3Rlciwgc3RyaWRlKTsKKyAgICB9CisgICAgX1RJRkZmcmVlKHJhc3Rlcik7CisgIH0gZWxzZSB7CisgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBhbGxvY2F0aW5nIFRJRkYgUkdCQSBtZW1vcnkhXG4iKTsKKyAgfQorCisgIGlmIChvaykgeworICAgIGlmIChtZXRhZGF0YSAhPSBOVUxMKSB7CisgICAgICBvayA9IEV4dHJhY3RNZXRhZGF0YUZyb21USUZGKHRpZiwgbWV0YWRhdGEpOworICAgICAgaWYgKCFvaykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGV4dHJhY3RpbmcgVElGRiBtZXRhZGF0YSFcbiIpOworICAgICAgICBNZXRhZGF0YUZyZWUobWV0YWRhdGEpOworICAgICAgICBXZWJQUGljdHVyZUZyZWUocGljKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyBFbmQ6CisgIFRJRkZDbG9zZSh0aWYpOworICByZXR1cm4gb2s7Cit9CisjZWxzZSAgLy8gIVdFQlBfSEFWRV9USUZGCitpbnQgUmVhZFRJRkYoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICBzdHJ1Y3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywgaW50IGtlZXBfYWxwaGEsCisgICAgICAgICAgICAgc3RydWN0IE1ldGFkYXRhKiBjb25zdCBtZXRhZGF0YSkgeworICAodm9pZClkYXRhOworICAodm9pZClkYXRhX3NpemU7CisgICh2b2lkKXBpYzsKKyAgKHZvaWQpa2VlcF9hbHBoYTsKKyAgKHZvaWQpbWV0YWRhdGE7CisgIGZwcmludGYoc3RkZXJyLCAiVElGRiBzdXBwb3J0IG5vdCBjb21waWxlZC4gUGxlYXNlIGluc3RhbGwgdGhlIGxpYnRpZmYgIgorICAgICAgICAgICJkZXZlbG9wbWVudCBwYWNrYWdlIGJlZm9yZSBidWlsZGluZy5cbiIpOworICByZXR1cm4gMDsKK30KKyNlbmRpZiAgLy8gV0VCUF9IQVZFX1RJRkYKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vdGlmZmRlYy5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby90aWZmZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM4YmVjYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vdGlmZmRlYy5oCkBAIC0wLDAgKzEsMzcgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUSUZGIGRlY29kZS4KKworI2lmbmRlZiBXRUJQX0lNQUdFSU9fVElGRkRFQ19IXworI2RlZmluZSBXRUJQX0lNQUdFSU9fVElGRkRFQ19IXworCisjaW5jbHVkZSAid2VicC90eXBlcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBNZXRhZGF0YTsKK3N0cnVjdCBXZWJQUGljdHVyZTsKKworLy8gUmVhZHMgYSBUSUZGIGZyb20gJ2RhdGEnLCByZXR1cm5pbmcgdGhlIGRlY29kZWQgb3V0cHV0IGluICdwaWMnLgorLy8gT3V0cHV0IGlzIFJHQkEgb3IgWVVWQSwgZGVwZW5kaW5nIG9uIHBpYy0+dXNlX2FyZ2IgdmFsdWUuCisvLyBJZiAna2VlcF9hbHBoYScgaXMgdHJ1ZSBhbmQgdGhlIFRJRkYgaGFzIGFuIGFscGhhIGNoYW5uZWwsIHRoZSBvdXRwdXQgaXMgUkdCQQorLy8gb3IgWVVWQS4gT3RoZXJ3aXNlLCBhbHBoYSBjaGFubmVsIGlzIGRyb3BwZWQgYW5kIG91dHB1dCBpcyBSR0Igb3IgWVVWLgorLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MuCitpbnQgUmVhZFRJRkYoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICBzdHJ1Y3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywgaW50IGtlZXBfYWxwaGEsCisgICAgICAgICAgICAgc3RydWN0IE1ldGFkYXRhKiBjb25zdCBtZXRhZGF0YSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvLyBXRUJQX0lNQUdFSU9fVElGRkRFQ19IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby93ZWJwZGVjLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL3dlYnBkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWQwNjU0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby93ZWJwZGVjLmMKQEAgLTAsMCArMSwyNDMgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBXZWJQIGRlY29kZS4KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJ3ZWJwL2NvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICIuL3dlYnBkZWMuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJ3ZWJwL2RlY29kZS5oIgorI2luY2x1ZGUgIndlYnAvZGVtdXguaCIKKyNpbmNsdWRlICJ3ZWJwL2VuY29kZS5oIgorI2luY2x1ZGUgIi4vaW1hZ2Vpb191dGlsLmgiCisjaW5jbHVkZSAiLi9tZXRhZGF0YS5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gV2ViUCBkZWNvZGluZworCitzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga1N0YXR1c01lc3NhZ2VzW1ZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBICsgMV0gPSB7CisgICJPSyIsICJPVVRfT0ZfTUVNT1JZIiwgIklOVkFMSURfUEFSQU0iLCAiQklUU1RSRUFNX0VSUk9SIiwKKyAgIlVOU1VQUE9SVEVEX0ZFQVRVUkUiLCAiU1VTUEVOREVEIiwgIlVTRVJfQUJPUlQiLCAiTk9UX0VOT1VHSF9EQVRBIgorfTsKKworc3RhdGljIHZvaWQgUHJpbnRBbmltYXRpb25XYXJuaW5nKGNvbnN0IFdlYlBEZWNvZGVyQ29uZmlnKiBjb25zdCBjb25maWcpIHsKKyAgaWYgKGNvbmZpZy0+aW5wdXQuaGFzX2FuaW1hdGlvbikgeworICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgIkVycm9yISBEZWNvZGluZyBvZiBhbiBhbmltYXRlZCBXZWJQIGZpbGUgaXMgbm90IHN1cHBvcnRlZC5cbiIKKyAgICAgICAgICAgICIgICAgICAgVXNlIHdlYnBtdXggdG8gZXh0cmFjdCB0aGUgaW5kaXZpZHVhbCBmcmFtZXMgb3JcbiIKKyAgICAgICAgICAgICIgICAgICAgdndlYnAgdG8gdmlldyB0aGlzIGltYWdlLlxuIik7CisgIH0KK30KKwordm9pZCBQcmludFdlYlBFcnJvcihjb25zdCBjaGFyKiBjb25zdCBpbl9maWxlLCBpbnQgc3RhdHVzKSB7CisgIGZwcmludGYoc3RkZXJyLCAiRGVjb2Rpbmcgb2YgJXMgZmFpbGVkLlxuIiwgaW5fZmlsZSk7CisgIGZwcmludGYoc3RkZXJyLCAiU3RhdHVzOiAlZCIsIHN0YXR1cyk7CisgIGlmIChzdGF0dXMgPj0gVlA4X1NUQVRVU19PSyAmJiBzdGF0dXMgPD0gVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEEpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiglcykiLCBrU3RhdHVzTWVzc2FnZXNbc3RhdHVzXSk7CisgIH0KKyAgZnByaW50ZihzdGRlcnIsICJcbiIpOworfQorCitpbnQgTG9hZFdlYlAoY29uc3QgY2hhciogY29uc3QgaW5fZmlsZSwKKyAgICAgICAgICAgICBjb25zdCB1aW50OF90KiogZGF0YSwgc2l6ZV90KiBkYXRhX3NpemUsCisgICAgICAgICAgICAgV2ViUEJpdHN0cmVhbUZlYXR1cmVzKiBiaXRzdHJlYW0pIHsKKyAgVlA4U3RhdHVzQ29kZSBzdGF0dXM7CisgIFdlYlBCaXRzdHJlYW1GZWF0dXJlcyBsb2NhbF9mZWF0dXJlczsKKyAgaWYgKCFJbWdJb1V0aWxSZWFkRmlsZShpbl9maWxlLCBkYXRhLCBkYXRhX3NpemUpKSByZXR1cm4gMDsKKworICBpZiAoYml0c3RyZWFtID09IE5VTEwpIHsKKyAgICBiaXRzdHJlYW0gPSAmbG9jYWxfZmVhdHVyZXM7CisgIH0KKworICBzdGF0dXMgPSBXZWJQR2V0RmVhdHVyZXMoKmRhdGEsICpkYXRhX3NpemUsIGJpdHN0cmVhbSk7CisgIGlmIChzdGF0dXMgIT0gVlA4X1NUQVRVU19PSykgeworICAgIGZyZWUoKHZvaWQqKSpkYXRhKTsKKyAgICAqZGF0YSA9IE5VTEw7CisgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgUHJpbnRXZWJQRXJyb3IoaW5fZmlsZSwgc3RhdHVzKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gMTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVlA4U3RhdHVzQ29kZSBEZWNvZGVXZWJQKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUERlY29kZXJDb25maWcqIGNvbnN0IGNvbmZpZykgeworICBpZiAoY29uZmlnID09IE5VTEwpIHJldHVybiBWUDhfU1RBVFVTX0lOVkFMSURfUEFSQU07CisgIFByaW50QW5pbWF0aW9uV2FybmluZyhjb25maWcpOworICByZXR1cm4gV2ViUERlY29kZShkYXRhLCBkYXRhX3NpemUsIGNvbmZpZyk7Cit9CisKK1ZQOFN0YXR1c0NvZGUgRGVjb2RlV2ViUEluY3JlbWVudGFsKAorICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgV2ViUERlY29kZXJDb25maWcqIGNvbnN0IGNvbmZpZykgeworICBWUDhTdGF0dXNDb2RlIHN0YXR1cyA9IFZQOF9TVEFUVVNfT0s7CisgIGlmIChjb25maWcgPT0gTlVMTCkgcmV0dXJuIFZQOF9TVEFUVVNfSU5WQUxJRF9QQVJBTTsKKworICBQcmludEFuaW1hdGlvbldhcm5pbmcoY29uZmlnKTsKKworICAvLyBEZWNvZGluZyBjYWxsLgorICB7CisgICAgV2ViUElEZWNvZGVyKiBjb25zdCBpZGVjID0gV2ViUElEZWNvZGUoZGF0YSwgZGF0YV9zaXplLCBjb25maWcpOworICAgIGlmIChpZGVjID09IE5VTEwpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIGR1cmluZyBXZWJQSU5ld0RlY29kZXIoKS5cbiIpOworICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfT1VUX09GX01FTU9SWTsKKyAgICB9IGVsc2UgeworICAgICAgc3RhdHVzID0gV2ViUElVcGRhdGUoaWRlYywgZGF0YSwgZGF0YV9zaXplKTsKKyAgICAgIFdlYlBJRGVsZXRlKGlkZWMpOworICAgIH0KKyAgfQorICByZXR1cm4gc3RhdHVzOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWV0YWRhdGEKKworc3RhdGljIGludCBFeHRyYWN0TWV0YWRhdGEoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFkYXRhKiBjb25zdCBtZXRhZGF0YSkgeworICBXZWJQRGF0YSB3ZWJwX2RhdGEgPSB7IGRhdGEsIGRhdGFfc2l6ZSB9OworICBXZWJQRGVtdXhlciogY29uc3QgZGVtdXggPSBXZWJQRGVtdXgoJndlYnBfZGF0YSk7CisgIFdlYlBDaHVua0l0ZXJhdG9yIGNodW5rX2l0ZXI7CisgIHVpbnQzMl90IGZsYWdzOworCisgIGlmIChkZW11eCA9PSBOVUxMKSByZXR1cm4gMDsKKyAgYXNzZXJ0KG1ldGFkYXRhICE9IE5VTEwpOworCisgIGZsYWdzID0gV2ViUERlbXV4R2V0SShkZW11eCwgV0VCUF9GRl9GT1JNQVRfRkxBR1MpOworCisgIGlmICgoZmxhZ3MgJiBJQ0NQX0ZMQUcpICYmIFdlYlBEZW11eEdldENodW5rKGRlbXV4LCAiSUNDUCIsIDEsICZjaHVua19pdGVyKSkgeworICAgIE1ldGFkYXRhQ29weSgoY29uc3QgY2hhciopY2h1bmtfaXRlci5jaHVuay5ieXRlcywgY2h1bmtfaXRlci5jaHVuay5zaXplLAorICAgICAgICAgICAgICAgICAmbWV0YWRhdGEtPmljY3ApOworICAgIFdlYlBEZW11eFJlbGVhc2VDaHVua0l0ZXJhdG9yKCZjaHVua19pdGVyKTsKKyAgfQorICBpZiAoKGZsYWdzICYgRVhJRl9GTEFHKSAmJiBXZWJQRGVtdXhHZXRDaHVuayhkZW11eCwgIkVYSUYiLCAxLCAmY2h1bmtfaXRlcikpIHsKKyAgICBNZXRhZGF0YUNvcHkoKGNvbnN0IGNoYXIqKWNodW5rX2l0ZXIuY2h1bmsuYnl0ZXMsIGNodW5rX2l0ZXIuY2h1bmsuc2l6ZSwKKyAgICAgICAgICAgICAgICAgJm1ldGFkYXRhLT5leGlmKTsKKyAgICBXZWJQRGVtdXhSZWxlYXNlQ2h1bmtJdGVyYXRvcigmY2h1bmtfaXRlcik7CisgIH0KKyAgaWYgKChmbGFncyAmIFhNUF9GTEFHKSAmJiBXZWJQRGVtdXhHZXRDaHVuayhkZW11eCwgIlhNUCAiLCAxLCAmY2h1bmtfaXRlcikpIHsKKyAgICBNZXRhZGF0YUNvcHkoKGNvbnN0IGNoYXIqKWNodW5rX2l0ZXIuY2h1bmsuYnl0ZXMsIGNodW5rX2l0ZXIuY2h1bmsuc2l6ZSwKKyAgICAgICAgICAgICAgICAgJm1ldGFkYXRhLT54bXApOworICAgIFdlYlBEZW11eFJlbGVhc2VDaHVua0l0ZXJhdG9yKCZjaHVua19pdGVyKTsKKyAgfQorICBXZWJQRGVtdXhEZWxldGUoZGVtdXgpOworICByZXR1cm4gMTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IFJlYWRXZWJQKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywKKyAgICAgICAgICAgICBpbnQga2VlcF9hbHBoYSwgTWV0YWRhdGEqIGNvbnN0IG1ldGFkYXRhKSB7CisgIGludCBvayA9IDA7CisgIFZQOFN0YXR1c0NvZGUgc3RhdHVzID0gVlA4X1NUQVRVU19PSzsKKyAgV2ViUERlY29kZXJDb25maWcgY29uZmlnOworICBXZWJQRGVjQnVmZmVyKiBjb25zdCBvdXRwdXRfYnVmZmVyID0gJmNvbmZpZy5vdXRwdXQ7CisgIFdlYlBCaXRzdHJlYW1GZWF0dXJlcyogY29uc3QgYml0c3RyZWFtID0gJmNvbmZpZy5pbnB1dDsKKworICBpZiAoZGF0YSA9PSBOVUxMIHx8IGRhdGFfc2l6ZSA9PSAwIHx8IHBpYyA9PSBOVUxMKSByZXR1cm4gMDsKKworICBpZiAoIVdlYlBJbml0RGVjb2RlckNvbmZpZygmY29uZmlnKSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiTGlicmFyeSB2ZXJzaW9uIG1pc21hdGNoIVxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBzdGF0dXMgPSBXZWJQR2V0RmVhdHVyZXMoZGF0YSwgZGF0YV9zaXplLCBiaXRzdHJlYW0pOworICBpZiAoc3RhdHVzICE9IFZQOF9TVEFUVVNfT0spIHsKKyAgICBQcmludFdlYlBFcnJvcigiaW5wdXQgZGF0YSIsIHN0YXR1cyk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBkbyB7CisgICAgY29uc3QgaW50IGhhc19hbHBoYSA9IGtlZXBfYWxwaGEgJiYgYml0c3RyZWFtLT5oYXNfYWxwaGE7CisgICAgdWludDY0X3Qgc3RyaWRlOworICAgIHBpYy0+d2lkdGggPSBiaXRzdHJlYW0tPndpZHRoOworICAgIHBpYy0+aGVpZ2h0ID0gYml0c3RyZWFtLT5oZWlnaHQ7CisgICAgaWYgKHBpYy0+dXNlX2FyZ2IpIHsKKyAgICAgIHN0cmlkZSA9ICh1aW50NjRfdCliaXRzdHJlYW0tPndpZHRoICogNDsKKyAgICB9IGVsc2UgeworICAgICAgc3RyaWRlID0gKHVpbnQ2NF90KWJpdHN0cmVhbS0+d2lkdGggKiAoaGFzX2FscGhhID8gNSA6IDMpIC8gMjsKKyAgICAgIHBpYy0+Y29sb3JzcGFjZSA9IGhhc19hbHBoYSA/IFdFQlBfWVVWNDIwQSA6IFdFQlBfWVVWNDIwOworICAgIH0KKworICAgIGlmICghSW1nSW9VdGlsQ2hlY2tTaXplQXJndW1lbnRzT3ZlcmZsb3coc3RyaWRlLCBiaXRzdHJlYW0tPmhlaWdodCkpIHsKKyAgICAgIHN0YXR1cyA9IFZQOF9TVEFUVVNfT1VUX09GX01FTU9SWTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIG9rID0gV2ViUFBpY3R1cmVBbGxvYyhwaWMpOworICAgIGlmICghb2spIHsKKyAgICAgIHN0YXR1cyA9IFZQOF9TVEFUVVNfT1VUX09GX01FTU9SWTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAocGljLT51c2VfYXJnYikgeworI2lmZGVmIFdPUkRTX0JJR0VORElBTgorICAgICAgb3V0cHV0X2J1ZmZlci0+Y29sb3JzcGFjZSA9IE1PREVfQVJHQjsKKyNlbHNlCisgICAgICBvdXRwdXRfYnVmZmVyLT5jb2xvcnNwYWNlID0gTU9ERV9CR1JBOworI2VuZGlmCisgICAgICBvdXRwdXRfYnVmZmVyLT51LlJHQkEucmdiYSA9ICh1aW50OF90KilwaWMtPmFyZ2I7CisgICAgICBvdXRwdXRfYnVmZmVyLT51LlJHQkEuc3RyaWRlID0gcGljLT5hcmdiX3N0cmlkZSAqIHNpemVvZih1aW50MzJfdCk7CisgICAgICBvdXRwdXRfYnVmZmVyLT51LlJHQkEuc2l6ZSA9IG91dHB1dF9idWZmZXItPnUuUkdCQS5zdHJpZGUgKiBwaWMtPmhlaWdodDsKKyAgICB9IGVsc2UgeworICAgICAgb3V0cHV0X2J1ZmZlci0+Y29sb3JzcGFjZSA9IGhhc19hbHBoYSA/IE1PREVfWVVWQSA6IE1PREVfWVVWOworICAgICAgb3V0cHV0X2J1ZmZlci0+dS5ZVVZBLnkgPSBwaWMtPnk7CisgICAgICBvdXRwdXRfYnVmZmVyLT51LllVVkEudSA9IHBpYy0+dTsKKyAgICAgIG91dHB1dF9idWZmZXItPnUuWVVWQS52ID0gcGljLT52OworICAgICAgb3V0cHV0X2J1ZmZlci0+dS5ZVVZBLmEgPSBoYXNfYWxwaGEgPyBwaWMtPmEgOiBOVUxMOworICAgICAgb3V0cHV0X2J1ZmZlci0+dS5ZVVZBLnlfc3RyaWRlID0gcGljLT55X3N0cmlkZTsKKyAgICAgIG91dHB1dF9idWZmZXItPnUuWVVWQS51X3N0cmlkZSA9IHBpYy0+dXZfc3RyaWRlOworICAgICAgb3V0cHV0X2J1ZmZlci0+dS5ZVVZBLnZfc3RyaWRlID0gcGljLT51dl9zdHJpZGU7CisgICAgICBvdXRwdXRfYnVmZmVyLT51LllVVkEuYV9zdHJpZGUgPSBoYXNfYWxwaGEgPyBwaWMtPmFfc3RyaWRlIDogMDsKKyAgICAgIG91dHB1dF9idWZmZXItPnUuWVVWQS55X3NpemUgPSBwaWMtPmhlaWdodCAqIHBpYy0+eV9zdHJpZGU7CisgICAgICBvdXRwdXRfYnVmZmVyLT51LllVVkEudV9zaXplID0gKHBpYy0+aGVpZ2h0ICsgMSkgLyAyICogcGljLT51dl9zdHJpZGU7CisgICAgICBvdXRwdXRfYnVmZmVyLT51LllVVkEudl9zaXplID0gKHBpYy0+aGVpZ2h0ICsgMSkgLyAyICogcGljLT51dl9zdHJpZGU7CisgICAgICBvdXRwdXRfYnVmZmVyLT51LllVVkEuYV9zaXplID0gcGljLT5oZWlnaHQgKiBwaWMtPmFfc3RyaWRlOworICAgIH0KKyAgICBvdXRwdXRfYnVmZmVyLT5pc19leHRlcm5hbF9tZW1vcnkgPSAxOworCisgICAgc3RhdHVzID0gRGVjb2RlV2ViUChkYXRhLCBkYXRhX3NpemUsICZjb25maWcpOworICAgIG9rID0gKHN0YXR1cyA9PSBWUDhfU1RBVFVTX09LKTsKKyAgICBpZiAob2sgJiYgIWtlZXBfYWxwaGEgJiYgcGljLT51c2VfYXJnYikgeworICAgICAgLy8gTmVlZCB0byB3aXBlIG91dCB0aGUgYWxwaGEgdmFsdWUsIGFzIHJlcXVlc3RlZC4KKyAgICAgIGludCB4LCB5OworICAgICAgdWludDMyX3QqIGFyZ2IgPSBwaWMtPmFyZ2I7CisgICAgICBmb3IgKHkgPSAwOyB5IDwgcGljLT5oZWlnaHQ7ICsreSkgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgcGljLT53aWR0aDsgKyt4KSBhcmdiW3hdIHw9IDB4ZmYwMDAwMDB1OworICAgICAgICBhcmdiICs9IHBpYy0+YXJnYl9zdHJpZGU7CisgICAgICB9CisgICAgfQorICB9IHdoaWxlICgwKTsgICAvLyA8LSBzbyB3ZSBjYW4gJ2JyZWFrJyBvdXQgb2YgdGhlIGxvb3AKKworICBpZiAoc3RhdHVzICE9IFZQOF9TVEFUVVNfT0spIHsKKyAgICBQcmludFdlYlBFcnJvcigiaW5wdXQgZGF0YSIsIHN0YXR1cyk7CisgICAgb2sgPSAwOworICB9CisKKyAgV2ViUEZyZWVEZWNCdWZmZXIob3V0cHV0X2J1ZmZlcik7CisKKyAgaWYgKG9rICYmIG1ldGFkYXRhICE9IE5VTEwpIHsKKyAgICBvayA9IEV4dHJhY3RNZXRhZGF0YShkYXRhLCBkYXRhX3NpemUsIG1ldGFkYXRhKTsKKyAgICBpZiAoIW9rKSB7CisgICAgICBQcmludFdlYlBFcnJvcigibWV0YWRhdGEiLCBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUik7CisgICAgfQorICB9CisgIGlmICghb2spIFdlYlBQaWN0dXJlRnJlZShwaWMpOworICByZXR1cm4gb2s7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL3dlYnBkZWMuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vd2VicGRlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMjlkNDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL3dlYnBkZWMuaApAQCAtMCwwICsxLDY3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gV2ViUCBkZWNvZGUuCisKKyNpZm5kZWYgV0VCUF9JTUFHRUlPX1dFQlBERUNfSF8KKyNkZWZpbmUgV0VCUF9JTUFHRUlPX1dFQlBERUNfSF8KKworI2luY2x1ZGUgIndlYnAvZGVjb2RlLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IE1ldGFkYXRhOworc3RydWN0IFdlYlBQaWN0dXJlOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gV2ViUCBkZWNvZGluZworCisvLyBQcmludHMgYW4gaW5mb3JtYXRpdmUgZXJyb3IgbWVzc2FnZSByZWdhcmRpbmcgZGVjb2RlIGZhaWx1cmUgb2YgJ2luX2ZpbGUnLgorLy8gJ3N0YXR1cycgaXMgdHJlYXRlZCBhcyBhIFZQOFN0YXR1c0NvZGUgYW5kIGlmIHZhbGlkIHdpbGwgYmUgcHJpbnRlZCBhcyBhCisvLyB0ZXh0IHN0cmluZy4KK3ZvaWQgUHJpbnRXZWJQRXJyb3IoY29uc3QgY2hhciogY29uc3QgaW5fZmlsZSwgaW50IHN0YXR1cyk7CisKKy8vIFJlYWRzIGEgV2ViUCBmcm9tICdpbl9maWxlJywgcmV0dXJuaW5nIHRoZSBjb250ZW50cyBhbmQgc2l6ZSBpbiAnZGF0YScgYW5kCisvLyAnZGF0YV9zaXplJy4gSWYgbm90IE5VTEwsICdiaXRzdHJlYW0nIGlzIHBvcHVsYXRlZCB1c2luZyBXZWJQR2V0RmVhdHVyZXMoKS4KKy8vIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLgoraW50IExvYWRXZWJQKGNvbnN0IGNoYXIqIGNvbnN0IGluX2ZpbGUsCisgICAgICAgICAgICAgY29uc3QgdWludDhfdCoqIGRhdGEsIHNpemVfdCogZGF0YV9zaXplLAorICAgICAgICAgICAgIFdlYlBCaXRzdHJlYW1GZWF0dXJlcyogYml0c3RyZWFtKTsKKworLy8gRGVjb2RlcyB0aGUgV2ViUCBjb250YWluZWQgaW4gJ2RhdGEnLgorLy8gJ2NvbmZpZycgaXMgYSBzdHJ1Y3R1cmUgcHJldmlvdXNseSBpbml0aWFsaXplZCBieSBXZWJQSW5pdERlY29kZXJDb25maWcoKS4KKy8vICdjb25maWctPm91dHB1dCcgc2hvdWxkIGhhdmUgdGhlIGRlc2lyZWQgY29sb3JzcGFjZSBzZWxlY3RlZC4KKy8vIFJldHVybnMgdGhlIGRlY29kZXIgc3RhdHVzLiBPbiBzdWNjZXNzICdjb25maWctPm91dHB1dCcgd2lsbCBjb250YWluIHRoZQorLy8gZGVjb2RlZCBwaWN0dXJlLgorVlA4U3RhdHVzQ29kZSBEZWNvZGVXZWJQKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUERlY29kZXJDb25maWcqIGNvbnN0IGNvbmZpZyk7CisKKy8vIFNhbWUgYXMgRGVjb2RlV2ViUCgpLCBidXQgdXNpbmcgdGhlIGluY3JlbWVudGFsIGRlY29kZXIuCitWUDhTdGF0dXNDb2RlIERlY29kZVdlYlBJbmNyZW1lbnRhbCgKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgIFdlYlBEZWNvZGVyQ29uZmlnKiBjb25zdCBjb25maWcpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBEZWNvZGVzIGEgV2ViUCBjb250YWluZWQgaW4gJ2RhdGEnLCByZXR1cm5pbmcgdGhlIGRlY29kZWQgb3V0cHV0IGluICdwaWMnLgorLy8gT3V0cHV0IGlzIFJHQkEgb3IgWVVWQSwgZGVwZW5kaW5nIG9uIHBpYy0+dXNlX2FyZ2IgdmFsdWUuCisvLyBJZiAna2VlcF9hbHBoYScgaXMgdHJ1ZSBhbmQgdGhlIFdlYlAgaGFzIGFuIGFscGhhIGNoYW5uZWwsIHRoZSBvdXRwdXQgaXMgUkdCQQorLy8gb3IgWVVWQS4gT3RoZXJ3aXNlLCBhbHBoYSBjaGFubmVsIGlzIGRyb3BwZWQgYW5kIG91dHB1dCBpcyBSR0Igb3IgWVVWLgorLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MuCitpbnQgUmVhZFdlYlAoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICBzdHJ1Y3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywKKyAgICAgICAgICAgICBpbnQga2VlcF9hbHBoYSwgc3RydWN0IE1ldGFkYXRhKiBjb25zdCBtZXRhZGF0YSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvLyBXRUJQX0lNQUdFSU9fV0VCUERFQ19IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby93aWNkZWMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vd2ljZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VlNzJhOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vd2ljZGVjLmMKQEAgLTAsMCArMSwzOTYgQEAKKy8vIENvcHlyaWdodCAyMDEzIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBXaW5kb3dzIEltYWdpbmcgQ29tcG9uZW50IChXSUMpIGRlY29kZS4KKworI2luY2x1ZGUgIi4vd2ljZGVjLmgiCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAid2VicC9jb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmZGVmIEhBVkVfV0lOQ09ERUNfSAorI2lmZGVmIF9fTUlOR1czMl9fCisjZGVmaW5lIElOSVRHVUlEICAvLyBXaXRob3V0IHRoaXMgR1VJRHMgYXJlIGRlY2xhcmVkIGV4dGVybiBhbmQgZmFpbCB0byBsaW5rCisjZW5kaWYKKyNkZWZpbmUgQ0lOVEVSRkFDRQorI2RlZmluZSBDT0JKTUFDUk9TCisjZGVmaW5lIF9XSU4zMl9JRSAweDUwMCAgLy8gV29ya2Fyb3VuZCBidWcgaW4gc2hsd2FwaS5oIHdoZW4gY29tcGlsaW5nIEMrKworICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvZGUgd2l0aCBDT0JKTUFDUk9TLgorI2luY2x1ZGUgPG9sZTIuaD4gIC8vIENyZWF0ZVN0cmVhbU9uSEdsb2JhbCgpCisjaW5jbHVkZSA8c2hsd2FwaS5oPgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDx3aW5jb2RlYy5oPgorCisjaW5jbHVkZSAid2VicC9lbmNvZGUuaCIKKyNpbmNsdWRlICIuL2ltYWdlaW9fdXRpbC5oIgorI2luY2x1ZGUgIi4vbWV0YWRhdGEuaCIKKworI2RlZmluZSBJRlMoZm4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoU1VDQ0VFREVEKGhyKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaHIgPSAoZm4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAoRkFJTEVEKGhyKSkgZnByaW50ZihzdGRlcnIsICNmbiAiIGZhaWxlZCAlMDhseFxuIiwgaHIpOyAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisvLyBtb2RpZmllZCB2ZXJzaW9uIG9mIERFRklORV9HVUlEIGZyb20gZ3VpZGRlZi5oLgorI2RlZmluZSBXRUJQX0RFRklORV9HVUlEKG5hbWUsIGwsIHcxLCB3MiwgYjEsIGIyLCBiMywgYjQsIGI1LCBiNiwgYjcsIGI4KSBcCisgIHN0YXRpYyBjb25zdCBHVUlEIG5hbWUgPSBcCisgICAgICB7IGwsIHcxLCB3MiwgeyBiMSwgYjIsICBiMywgIGI0LCAgYjUsICBiNiwgIGI3LCAgYjggfSB9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworI2RlZmluZSBNQUtFX1JFRkdVSUQoeCkgKHgpCisjZWxzZQorI2RlZmluZSBNQUtFX1JFRkdVSUQoeCkgJih4KQorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IFdJQ0Zvcm1hdEltcG9ydGVyIHsKKyAgY29uc3QgR1VJRCogcGl4ZWxfZm9ybWF0OworICBpbnQgYnl0ZXNfcGVyX3BpeGVsOworICBpbnQgKCppbXBvcnQpKFdlYlBQaWN0dXJlKiBjb25zdCwgY29uc3QgdWludDhfdCogY29uc3QsIGludCk7Cit9IFdJQ0Zvcm1hdEltcG9ydGVyOworCisvLyBGcm9tIE1pY3Jvc29mdCBTREsgNy4wYSAtLSB3aW5jb2RlYy5oCisvLyBDcmVhdGUgbG9jYWwgY29waWVzIGZvciBjb21wYXRpYmlsaXR5IHdoZW4gYnVpbGRpbmcgYWdhaW5zdCBlYXJsaWVyCisvLyB2ZXJzaW9ucyBvZiB0aGUgU0RLLgorV0VCUF9ERUZJTkVfR1VJRChHVUlEX1dJQ1BpeGVsRm9ybWF0MjRicHBCR1JfLAorICAgICAgICAgICAgICAgICAweDZmZGRjMzI0LCAweDRlMDMsIDB4NGJmZSwKKyAgICAgICAgICAgICAgICAgMHhiMSwgMHg4NSwgMHgzZCwgMHg3NywgMHg3NiwgMHg4ZCwgMHhjOSwgMHgwYyk7CitXRUJQX0RFRklORV9HVUlEKEdVSURfV0lDUGl4ZWxGb3JtYXQyNGJwcFJHQl8sCisgICAgICAgICAgICAgICAgIDB4NmZkZGMzMjQsIDB4NGUwMywgMHg0YmZlLAorICAgICAgICAgICAgICAgICAweGIxLCAweDg1LCAweDNkLCAweDc3LCAweDc2LCAweDhkLCAweGM5LCAweDBkKTsKK1dFQlBfREVGSU5FX0dVSUQoR1VJRF9XSUNQaXhlbEZvcm1hdDMyYnBwQkdSQV8sCisgICAgICAgICAgICAgICAgIDB4NmZkZGMzMjQsIDB4NGUwMywgMHg0YmZlLAorICAgICAgICAgICAgICAgICAweGIxLCAweDg1LCAweDNkLCAweDc3LCAweDc2LCAweDhkLCAweGM5LCAweDBmKTsKK1dFQlBfREVGSU5FX0dVSUQoR1VJRF9XSUNQaXhlbEZvcm1hdDMyYnBwUkdCQV8sCisgICAgICAgICAgICAgICAgIDB4ZjVjN2FkMmQsIDB4NmE4ZCwgMHg0M2RkLAorICAgICAgICAgICAgICAgICAweGE3LCAweGE4LCAweGEyLCAweDk5LCAweDM1LCAweDI2LCAweDFhLCAweGU5KTsKK1dFQlBfREVGSU5FX0dVSUQoR1VJRF9XSUNQaXhlbEZvcm1hdDY0YnBwQkdSQV8sCisgICAgICAgICAgICAgICAgIDB4MTU2MmZmN2MsIDB4ZDM1MiwgMHg0NmY5LAorICAgICAgICAgICAgICAgICAweDk3LCAweDllLCAweDQyLCAweDk3LCAweDZiLCAweDc5LCAweDIyLCAweDQ2KTsKK1dFQlBfREVGSU5FX0dVSUQoR1VJRF9XSUNQaXhlbEZvcm1hdDY0YnBwUkdCQV8sCisgICAgICAgICAgICAgICAgIDB4NmZkZGMzMjQsIDB4NGUwMywgMHg0YmZlLAorICAgICAgICAgICAgICAgICAweGIxLCAweDg1LCAweDNkLCAweDc3LCAweDc2LCAweDhkLCAweGM5LCAweDE2KTsKKworc3RhdGljIEhSRVNVTFQgT3BlbklucHV0U3RyZWFtKGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBJU3RyZWFtKiogc3RyZWFtKSB7CisgIEhSRVNVTFQgaHIgPSBTX09LOworICBpZiAoIXN0cmNtcChmaWxlbmFtZSwgIi0iKSkgeworICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEgPSBOVUxMOworICAgIHNpemVfdCBkYXRhX3NpemUgPSAwOworICAgIGNvbnN0IGludCBvayA9IEltZ0lvVXRpbFJlYWRGaWxlKGZpbGVuYW1lLCAmZGF0YSwgJmRhdGFfc2l6ZSk7CisgICAgaWYgKG9rKSB7CisgICAgICBIR0xPQkFMIGltYWdlID0gR2xvYmFsQWxsb2MoR01FTV9NT1ZFQUJMRSwgZGF0YV9zaXplKTsKKyAgICAgIGlmIChpbWFnZSAhPSBOVUxMKSB7CisgICAgICAgIHZvaWQqIGNvbnN0IGltYWdlX21lbSA9IEdsb2JhbExvY2soaW1hZ2UpOworICAgICAgICBpZiAoaW1hZ2VfbWVtICE9IE5VTEwpIHsKKyAgICAgICAgICBtZW1jcHkoaW1hZ2VfbWVtLCBkYXRhLCBkYXRhX3NpemUpOworICAgICAgICAgIEdsb2JhbFVubG9jayhpbWFnZSk7CisgICAgICAgICAgSUZTKENyZWF0ZVN0cmVhbU9uSEdsb2JhbChpbWFnZSwgVFJVRSwgc3RyZWFtKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaHIgPSBFX0ZBSUw7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGhyID0gRV9PVVRPRk1FTU9SWTsKKyAgICAgIH0KKyAgICAgIGZyZWUoKHZvaWQqKWRhdGEpOworICAgIH0gZWxzZSB7CisgICAgICBociA9IEVfRkFJTDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgSUZTKFNIQ3JlYXRlU3RyZWFtT25GaWxlQShmaWxlbmFtZSwgU1RHTV9SRUFELCBzdHJlYW0pKTsKKyAgfQorCisgIGlmIChGQUlMRUQoaHIpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBvcGVuaW5nIGlucHV0IGZpbGUgJXMgKCUwOGx4KVxuIiwgZmlsZW5hbWUsIGhyKTsKKyAgfQorICByZXR1cm4gaHI7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNZXRhZGF0YSBwcm9jZXNzaW5nCisKKy8vIFN0b3JlcyB0aGUgZmlyc3Qgbm9uLXplcm8gc2l6ZWQgY29sb3IgcHJvZmlsZSBmcm9tICdmcmFtZScgdG8gJ2ljY3AnLgorLy8gUmV0dXJucyBhbiBIUkVTVUxUIHRvIGluZGljYXRlIHN1Y2Nlc3Mgb3IgZmFpbHVyZS4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZQorLy8gZm9yIGZyZWVpbmcgJ2ljY3AtPmJ5dGVzJyBpbiBlaXRoZXIgY2FzZS4KK3N0YXRpYyBIUkVTVUxUIEV4dHJhY3RJQ0NQKElXSUNJbWFnaW5nRmFjdG9yeSogY29uc3QgZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElXSUNCaXRtYXBGcmFtZURlY29kZSogY29uc3QgZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhZGF0YVBheWxvYWQqIGNvbnN0IGljY3ApIHsKKyAgSFJFU1VMVCBociA9IFNfT0s7CisgIFVJTlQgaSwgY291bnQ7CisgIElXSUNDb2xvckNvbnRleHQqKiBjb2xvcl9jb250ZXh0czsKKworICBJRlMoSVdJQ0JpdG1hcEZyYW1lRGVjb2RlX0dldENvbG9yQ29udGV4dHMoZnJhbWUsIDAsIE5VTEwsICZjb3VudCkpOworICBpZiAoRkFJTEVEKGhyKSB8fCBjb3VudCA9PSAwKSByZXR1cm4gaHI7CisKKyAgY29sb3JfY29udGV4dHMgPSAoSVdJQ0NvbG9yQ29udGV4dCoqKWNhbGxvYyhjb3VudCwgc2l6ZW9mKCpjb2xvcl9jb250ZXh0cykpOworICBpZiAoY29sb3JfY29udGV4dHMgPT0gTlVMTCkgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7CisgIGZvciAoaSA9IDA7IFNVQ0NFRURFRChocikgJiYgaSA8IGNvdW50OyArK2kpIHsKKyAgICBJRlMoSVdJQ0ltYWdpbmdGYWN0b3J5X0NyZWF0ZUNvbG9yQ29udGV4dChmYWN0b3J5LCAmY29sb3JfY29udGV4dHNbaV0pKTsKKyAgfQorCisgIGlmIChTVUNDRUVERUQoaHIpKSB7CisgICAgVUlOVCBudW1fY29sb3JfY29udGV4dHM7CisgICAgSUZTKElXSUNCaXRtYXBGcmFtZURlY29kZV9HZXRDb2xvckNvbnRleHRzKGZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCwgY29sb3JfY29udGV4dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1fY29sb3JfY29udGV4dHMpKTsKKyAgICBhc3NlcnQoRkFJTEVEKGhyKSB8fCBudW1fY29sb3JfY29udGV4dHMgPD0gY291bnQpOworICAgIGZvciAoaSA9IDA7IFNVQ0NFRURFRChocikgJiYgaSA8IG51bV9jb2xvcl9jb250ZXh0czsgKytpKSB7CisgICAgICBXSUNDb2xvckNvbnRleHRUeXBlIHR5cGU7CisgICAgICBJRlMoSVdJQ0NvbG9yQ29udGV4dF9HZXRUeXBlKGNvbG9yX2NvbnRleHRzW2ldLCAmdHlwZSkpOworICAgICAgaWYgKFNVQ0NFRURFRChocikgJiYgdHlwZSA9PSBXSUNDb2xvckNvbnRleHRQcm9maWxlKSB7CisgICAgICAgIFVJTlQgc2l6ZTsKKyAgICAgICAgSUZTKElXSUNDb2xvckNvbnRleHRfR2V0UHJvZmlsZUJ5dGVzKGNvbG9yX2NvbnRleHRzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgTlVMTCwgJnNpemUpKTsKKyAgICAgICAgaWYgKFNVQ0NFRURFRChocikgJiYgc2l6ZSA+IDApIHsKKyAgICAgICAgICBpY2NwLT5ieXRlcyA9ICh1aW50OF90KiltYWxsb2Moc2l6ZSk7CisgICAgICAgICAgaWYgKGljY3AtPmJ5dGVzID09IE5VTEwpIHsKKyAgICAgICAgICAgIGhyID0gRV9PVVRPRk1FTU9SWTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBpY2NwLT5zaXplID0gc2l6ZTsKKyAgICAgICAgICBJRlMoSVdJQ0NvbG9yQ29udGV4dF9HZXRQcm9maWxlQnl0ZXMoY29sb3JfY29udGV4dHNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVSU5UKWljY3AtPnNpemUsIGljY3AtPmJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSkpOworICAgICAgICAgIGlmIChTVUNDRUVERUQoaHIpICYmIHNpemUgIT0gaWNjcC0+c2l6ZSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJXYXJuaW5nISBJQ0MgcHJvZmlsZSBzaXplICgldSkgIT0gZXhwZWN0ZWQgKCV1KVxuIiwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSwgKHVpbnQzMl90KWljY3AtPnNpemUpOworICAgICAgICAgICAgaWNjcC0+c2l6ZSA9IHNpemU7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgaWYgKGNvbG9yX2NvbnRleHRzW2ldICE9IE5VTEwpIElVbmtub3duX1JlbGVhc2UoY29sb3JfY29udGV4dHNbaV0pOworICB9CisgIGZyZWUoY29sb3JfY29udGV4dHMpOworICByZXR1cm4gaHI7Cit9CisKK3N0YXRpYyBIUkVTVUxUIEV4dHJhY3RNZXRhZGF0YShJV0lDSW1hZ2luZ0ZhY3RvcnkqIGNvbnN0IGZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVdJQ0JpdG1hcEZyYW1lRGVjb2RlKiBjb25zdCBmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhZGF0YSogY29uc3QgbWV0YWRhdGEpIHsKKyAgLy8gVE9ETyhqemVybik6IGFkZCBYTVAvRVhJRiBleHRyYWN0aW9uLgorICBjb25zdCBIUkVTVUxUIGhyID0gRXh0cmFjdElDQ1AoZmFjdG9yeSwgZnJhbWUsICZtZXRhZGF0YS0+aWNjcCk7CisgIGlmIChGQUlMRUQoaHIpKSBNZXRhZGF0YUZyZWUobWV0YWRhdGEpOworICByZXR1cm4gaHI7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBpbnQgSGFzUGFsZXR0ZShHVUlEIHBpeGVsX2Zvcm1hdCkgeworICByZXR1cm4gKElzRXF1YWxHVUlEKE1BS0VfUkVGR1VJRChwaXhlbF9mb3JtYXQpLAorICAgICAgICAgICAgICAgICAgICAgIE1BS0VfUkVGR1VJRChHVUlEX1dJQ1BpeGVsRm9ybWF0MWJwcEluZGV4ZWQpKSB8fAorICAgICAgICAgIElzRXF1YWxHVUlEKE1BS0VfUkVGR1VJRChwaXhlbF9mb3JtYXQpLAorICAgICAgICAgICAgICAgICAgICAgIE1BS0VfUkVGR1VJRChHVUlEX1dJQ1BpeGVsRm9ybWF0MmJwcEluZGV4ZWQpKSB8fAorICAgICAgICAgIElzRXF1YWxHVUlEKE1BS0VfUkVGR1VJRChwaXhlbF9mb3JtYXQpLAorICAgICAgICAgICAgICAgICAgICAgIE1BS0VfUkVGR1VJRChHVUlEX1dJQ1BpeGVsRm9ybWF0NGJwcEluZGV4ZWQpKSB8fAorICAgICAgICAgIElzRXF1YWxHVUlEKE1BS0VfUkVGR1VJRChwaXhlbF9mb3JtYXQpLAorICAgICAgICAgICAgICAgICAgICAgIE1BS0VfUkVGR1VJRChHVUlEX1dJQ1BpeGVsRm9ybWF0OGJwcEluZGV4ZWQpKSk7Cit9CisKK3N0YXRpYyBpbnQgSGFzQWxwaGEoSVdJQ0ltYWdpbmdGYWN0b3J5KiBjb25zdCBmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICBJV0lDQml0bWFwRGVjb2RlciogY29uc3QgZGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgSVdJQ0JpdG1hcEZyYW1lRGVjb2RlKiBjb25zdCBmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgR1VJRCBwaXhlbF9mb3JtYXQpIHsKKyAgaW50IGhhc19hbHBoYTsKKyAgaWYgKEhhc1BhbGV0dGUocGl4ZWxfZm9ybWF0KSkgeworICAgIElXSUNQYWxldHRlKiBmcmFtZV9wYWxldHRlID0gTlVMTDsKKyAgICBJV0lDUGFsZXR0ZSogZ2xvYmFsX3BhbGV0dGUgPSBOVUxMOworICAgIEJPT0wgZnJhbWVfcGFsZXR0ZV9oYXNfYWxwaGEgPSBGQUxTRTsKKyAgICBCT09MIGdsb2JhbF9wYWxldHRlX2hhc19hbHBoYSA9IEZBTFNFOworCisgICAgLy8gQSBwYWxldHRlIG1heSBleGlzdCBhdCB0aGUgZnJhbWUgb3IgY29udGFpbmVyIGxldmVsLAorICAgIC8vIGNoZWNrIElXSUNQYWxldHRlOjpIYXNBbHBoYSgpIGZvciBib3RoIGlmIHByZXNlbnQuCisgICAgaWYgKFNVQ0NFRURFRChJV0lDSW1hZ2luZ0ZhY3RvcnlfQ3JlYXRlUGFsZXR0ZShmYWN0b3J5LCAmZnJhbWVfcGFsZXR0ZSkpICYmCisgICAgICAgIFNVQ0NFRURFRChJV0lDQml0bWFwRnJhbWVEZWNvZGVfQ29weVBhbGV0dGUoZnJhbWUsIGZyYW1lX3BhbGV0dGUpKSkgeworICAgICAgSVdJQ1BhbGV0dGVfSGFzQWxwaGEoZnJhbWVfcGFsZXR0ZSwgJmZyYW1lX3BhbGV0dGVfaGFzX2FscGhhKTsKKyAgICB9CisgICAgaWYgKFNVQ0NFRURFRChJV0lDSW1hZ2luZ0ZhY3RvcnlfQ3JlYXRlUGFsZXR0ZShmYWN0b3J5LCAmZ2xvYmFsX3BhbGV0dGUpKSAmJgorICAgICAgICBTVUNDRUVERUQoSVdJQ0JpdG1hcERlY29kZXJfQ29weVBhbGV0dGUoZGVjb2RlciwgZ2xvYmFsX3BhbGV0dGUpKSkgeworICAgICAgSVdJQ1BhbGV0dGVfSGFzQWxwaGEoZ2xvYmFsX3BhbGV0dGUsICZnbG9iYWxfcGFsZXR0ZV9oYXNfYWxwaGEpOworICAgIH0KKyAgICBoYXNfYWxwaGEgPSBmcmFtZV9wYWxldHRlX2hhc19hbHBoYSB8fCBnbG9iYWxfcGFsZXR0ZV9oYXNfYWxwaGE7CisKKyAgICBpZiAoZnJhbWVfcGFsZXR0ZSAhPSBOVUxMKSBJVW5rbm93bl9SZWxlYXNlKGZyYW1lX3BhbGV0dGUpOworICAgIGlmIChnbG9iYWxfcGFsZXR0ZSAhPSBOVUxMKSBJVW5rbm93bl9SZWxlYXNlKGdsb2JhbF9wYWxldHRlKTsKKyAgfSBlbHNlIHsKKyAgICBoYXNfYWxwaGEgPSBJc0VxdWFsR1VJRChNQUtFX1JFRkdVSUQocGl4ZWxfZm9ybWF0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQUtFX1JFRkdVSUQoR1VJRF9XSUNQaXhlbEZvcm1hdDMyYnBwUkdCQV8pKSB8fAorICAgICAgICAgICAgICAgIElzRXF1YWxHVUlEKE1BS0VfUkVGR1VJRChwaXhlbF9mb3JtYXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VfUkVGR1VJRChHVUlEX1dJQ1BpeGVsRm9ybWF0MzJicHBCR1JBXykpIHx8CisgICAgICAgICAgICAgICAgSXNFcXVhbEdVSUQoTUFLRV9SRUZHVUlEKHBpeGVsX2Zvcm1hdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFLRV9SRUZHVUlEKEdVSURfV0lDUGl4ZWxGb3JtYXQ2NGJwcFJHQkFfKSkgfHwKKyAgICAgICAgICAgICAgICBJc0VxdWFsR1VJRChNQUtFX1JFRkdVSUQocGl4ZWxfZm9ybWF0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQUtFX1JFRkdVSUQoR1VJRF9XSUNQaXhlbEZvcm1hdDY0YnBwQkdSQV8pKTsKKyAgfQorICByZXR1cm4gaGFzX2FscGhhOworfQorCitpbnQgUmVhZFBpY3R1cmVXaXRoV0lDKGNvbnN0IGNoYXIqIGNvbnN0IGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBXZWJQUGljdHVyZSogY29uc3QgcGljLCBpbnQga2VlcF9hbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgTWV0YWRhdGEqIGNvbnN0IG1ldGFkYXRhKSB7CisgIC8vIEZyb20gTWljcm9zb2Z0IFNESyA2LjBhIC0tIGtzLmgKKyAgLy8gRGVmaW5lIGEgbG9jYWwgY29weSB0byBhdm9pZCBsaW5rIGVycm9ycyB1bmRlciBtaW5ndy4KKyAgV0VCUF9ERUZJTkVfR1VJRChHVUlEX05VTExfLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwKTsKKyAgc3RhdGljIGNvbnN0IFdJQ0Zvcm1hdEltcG9ydGVyIGtBbHBoYUZvcm1hdEltcG9ydGVyc1tdID0geworICAgIHsgJkdVSURfV0lDUGl4ZWxGb3JtYXQzMmJwcEJHUkFfLCA0LCBXZWJQUGljdHVyZUltcG9ydEJHUkEgfSwKKyAgICB7ICZHVUlEX1dJQ1BpeGVsRm9ybWF0MzJicHBSR0JBXywgNCwgV2ViUFBpY3R1cmVJbXBvcnRSR0JBIH0sCisgICAgeyBOVUxMLCAwLCBOVUxMIH0sCisgIH07CisgIHN0YXRpYyBjb25zdCBXSUNGb3JtYXRJbXBvcnRlciBrTm9uQWxwaGFGb3JtYXRJbXBvcnRlcnNbXSA9IHsKKyAgICB7ICZHVUlEX1dJQ1BpeGVsRm9ybWF0MjRicHBCR1JfLCAzLCBXZWJQUGljdHVyZUltcG9ydEJHUiB9LAorICAgIHsgJkdVSURfV0lDUGl4ZWxGb3JtYXQyNGJwcFJHQl8sIDMsIFdlYlBQaWN0dXJlSW1wb3J0UkdCIH0sCisgICAgeyBOVUxMLCAwLCBOVUxMIH0sCisgIH07CisgIEhSRVNVTFQgaHIgPSBTX09LOworICBJV0lDQml0bWFwRnJhbWVEZWNvZGUqIGZyYW1lID0gTlVMTDsKKyAgSVdJQ0Zvcm1hdENvbnZlcnRlciogY29udmVydGVyID0gTlVMTDsKKyAgSVdJQ0ltYWdpbmdGYWN0b3J5KiBmYWN0b3J5ID0gTlVMTDsKKyAgSVdJQ0JpdG1hcERlY29kZXIqIGRlY29kZXIgPSBOVUxMOworICBJU3RyZWFtKiBzdHJlYW0gPSBOVUxMOworICBVSU5UIGZyYW1lX2NvdW50ID0gMDsKKyAgVUlOVCB3aWR0aCA9IDAsIGhlaWdodCA9IDA7CisgIEJZVEUqIHJnYiA9IE5VTEw7CisgIFdJQ1BpeGVsRm9ybWF0R1VJRCBzcmNfcGl4ZWxfZm9ybWF0ID0gR1VJRF9XSUNQaXhlbEZvcm1hdFVuZGVmaW5lZDsKKyAgY29uc3QgV0lDRm9ybWF0SW1wb3J0ZXIqIGltcG9ydGVyID0gTlVMTDsKKyAgR1VJRCBzcmNfY29udGFpbmVyX2Zvcm1hdCA9IEdVSURfTlVMTF87CisgIHN0YXRpYyBjb25zdCBHVUlEKiBrQWxwaGFDb250YWluZXJzW10gPSB7CisgICAgJkdVSURfQ29udGFpbmVyRm9ybWF0Qm1wLAorICAgICZHVUlEX0NvbnRhaW5lckZvcm1hdFBuZywKKyAgICAmR1VJRF9Db250YWluZXJGb3JtYXRUaWZmLAorICAgIE5VTEwKKyAgfTsKKyAgaW50IGhhc19hbHBoYSA9IDA7CisgIGludDY0X3Qgc3RyaWRlOworCisgIGlmIChmaWxlbmFtZSA9PSBOVUxMIHx8IHBpYyA9PSBOVUxMKSByZXR1cm4gMDsKKworICBJRlMoQ29Jbml0aWFsaXplKE5VTEwpKTsKKyAgSUZTKENvQ3JlYXRlSW5zdGFuY2UoTUFLRV9SRUZHVUlEKENMU0lEX1dJQ0ltYWdpbmdGYWN0b3J5KSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ0xTQ1RYX0lOUFJPQ19TRVJWRVIsCisgICAgICAgICAgICAgICAgICAgICAgIE1BS0VfUkVGR1VJRChJSURfSVdJQ0ltYWdpbmdGYWN0b3J5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgKExQVk9JRCopJmZhY3RvcnkpKTsKKyAgaWYgKGhyID09IFJFR0RCX0VfQ0xBU1NOT1RSRUcpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICJDb3VsZG4ndCBhY2Nlc3MgV2luZG93cyBJbWFnaW5nIENvbXBvbmVudCAoYXJlIHlvdSBydW5uaW5nICIKKyAgICAgICAgICAgICJXaW5kb3dzIFhQIFNQMyBvciBuZXdlcj8pLiBNb3N0IGZvcm1hdHMgbm90IGF2YWlsYWJsZS4gIgorICAgICAgICAgICAgIlVzZSAtcyBmb3IgdGhlIGF2YWlsYWJsZSBZVVYgaW5wdXQuXG4iKTsKKyAgfQorICAvLyBQcmVwYXJlIGZvciBpbWFnZSBkZWNvZGluZy4KKyAgSUZTKE9wZW5JbnB1dFN0cmVhbShmaWxlbmFtZSwgJnN0cmVhbSkpOworICBJRlMoSVdJQ0ltYWdpbmdGYWN0b3J5X0NyZWF0ZURlY29kZXJGcm9tU3RyZWFtKAorICAgICAgICAgIGZhY3RvcnksIHN0cmVhbSwgTlVMTCwKKyAgICAgICAgICBXSUNEZWNvZGVNZXRhZGF0YUNhY2hlT25EZW1hbmQsICZkZWNvZGVyKSk7CisgIElGUyhJV0lDQml0bWFwRGVjb2Rlcl9HZXRGcmFtZUNvdW50KGRlY29kZXIsICZmcmFtZV9jb3VudCkpOworICBpZiAoU1VDQ0VFREVEKGhyKSAmJiBmcmFtZV9jb3VudCA9PSAwKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJObyBmcmFtZSBmb3VuZCBpbiBpbnB1dCBmaWxlLlxuIik7CisgICAgaHIgPSBFX0ZBSUw7CisgIH0KKyAgSUZTKElXSUNCaXRtYXBEZWNvZGVyX0dldEZyYW1lKGRlY29kZXIsIDAsICZmcmFtZSkpOworICBJRlMoSVdJQ0JpdG1hcEZyYW1lRGVjb2RlX0dldFBpeGVsRm9ybWF0KGZyYW1lLCAmc3JjX3BpeGVsX2Zvcm1hdCkpOworICBJRlMoSVdJQ0JpdG1hcERlY29kZXJfR2V0Q29udGFpbmVyRm9ybWF0KGRlY29kZXIsICZzcmNfY29udGFpbmVyX2Zvcm1hdCkpOworCisgIGlmIChTVUNDRUVERUQoaHIpICYmIGtlZXBfYWxwaGEpIHsKKyAgICBjb25zdCBHVUlEKiogZ3VpZDsKKyAgICBmb3IgKGd1aWQgPSBrQWxwaGFDb250YWluZXJzOyAqZ3VpZCAhPSBOVUxMOyArK2d1aWQpIHsKKyAgICAgIGlmIChJc0VxdWFsR1VJRChNQUtFX1JFRkdVSUQoc3JjX2NvbnRhaW5lcl9mb3JtYXQpLAorICAgICAgICAgICAgICAgICAgICAgIE1BS0VfUkVGR1VJRCgqKmd1aWQpKSkgeworICAgICAgICBoYXNfYWxwaGEgPSBIYXNBbHBoYShmYWN0b3J5LCBkZWNvZGVyLCBmcmFtZSwgc3JjX3BpeGVsX2Zvcm1hdCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIFByZXBhcmUgZm9yIHBpeGVsIGZvcm1hdCBjb252ZXJzaW9uIChpZiBuZWNlc3NhcnkpLgorICBJRlMoSVdJQ0ltYWdpbmdGYWN0b3J5X0NyZWF0ZUZvcm1hdENvbnZlcnRlcihmYWN0b3J5LCAmY29udmVydGVyKSk7CisKKyAgZm9yIChpbXBvcnRlciA9IGhhc19hbHBoYSA/IGtBbHBoYUZvcm1hdEltcG9ydGVycyA6IGtOb25BbHBoYUZvcm1hdEltcG9ydGVyczsKKyAgICAgICBociA9PSBTX09LICYmIGltcG9ydGVyLT5pbXBvcnQgIT0gTlVMTDsgKytpbXBvcnRlcikgeworICAgIEJPT0wgY2FuX2NvbnZlcnQ7CisgICAgY29uc3QgSFJFU1VMVCBjY2hyID0gSVdJQ0Zvcm1hdENvbnZlcnRlcl9DYW5Db252ZXJ0KAorICAgICAgICBjb252ZXJ0ZXIsCisgICAgICAgIE1BS0VfUkVGR1VJRChzcmNfcGl4ZWxfZm9ybWF0KSwKKyAgICAgICAgTUFLRV9SRUZHVUlEKCppbXBvcnRlci0+cGl4ZWxfZm9ybWF0KSwKKyAgICAgICAgJmNhbl9jb252ZXJ0KTsKKyAgICBpZiAoU1VDQ0VFREVEKGNjaHIpICYmIGNhbl9jb252ZXJ0KSBicmVhazsKKyAgfQorICBpZiAoaW1wb3J0ZXItPmltcG9ydCA9PSBOVUxMKSBociA9IEVfRkFJTDsKKworICBJRlMoSVdJQ0Zvcm1hdENvbnZlcnRlcl9Jbml0aWFsaXplKGNvbnZlcnRlciwgKElXSUNCaXRtYXBTb3VyY2UqKWZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydGVyLT5waXhlbF9mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lDQml0bWFwRGl0aGVyVHlwZU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMC4wLCBXSUNCaXRtYXBQYWxldHRlVHlwZUN1c3RvbSkpOworCisgIC8vIERlY29kZS4KKyAgSUZTKElXSUNGb3JtYXRDb252ZXJ0ZXJfR2V0U2l6ZShjb252ZXJ0ZXIsICZ3aWR0aCwgJmhlaWdodCkpOworICBzdHJpZGUgPSAoaW50NjRfdClpbXBvcnRlci0+Ynl0ZXNfcGVyX3BpeGVsICogd2lkdGggKiBzaXplb2YoKnJnYik7CisgIGlmIChzdHJpZGUgIT0gKGludClzdHJpZGUgfHwKKyAgICAgICFJbWdJb1V0aWxDaGVja1NpemVBcmd1bWVudHNPdmVyZmxvdyhzdHJpZGUsIGhlaWdodCkpIHsKKyAgICBociA9IEVfRkFJTDsKKyAgfQorCisgIGlmIChTVUNDRUVERUQoaHIpKSB7CisgICAgcmdiID0gKEJZVEUqKW1hbGxvYygoc2l6ZV90KXN0cmlkZSAqIGhlaWdodCk7CisgICAgaWYgKHJnYiA9PSBOVUxMKQorICAgICAgaHIgPSBFX09VVE9GTUVNT1JZOworICB9CisgIElGUyhJV0lDRm9ybWF0Q29udmVydGVyX0NvcHlQaXhlbHMoY29udmVydGVyLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVSU5UKXN0cmlkZSwgKFVJTlQpc3RyaWRlICogaGVpZ2h0LCByZ2IpKTsKKworICAvLyBXZWJQIGNvbnZlcnNpb24uCisgIGlmIChTVUNDRUVERUQoaHIpKSB7CisgICAgaW50IG9rOworICAgIHBpYy0+d2lkdGggPSB3aWR0aDsKKyAgICBwaWMtPmhlaWdodCA9IGhlaWdodDsKKyAgICBwaWMtPnVzZV9hcmdiID0gMTsgICAgLy8gRm9yIFdJQywgd2UgYWx3YXlzIGZvcmNlIHRvIGFyZ2IKKyAgICBvayA9IGltcG9ydGVyLT5pbXBvcnQocGljLCByZ2IsIChpbnQpc3RyaWRlKTsKKyAgICBpZiAoIW9rKSBociA9IEVfRkFJTDsKKyAgfQorICBpZiAoU1VDQ0VFREVEKGhyKSkgeworICAgIGlmIChtZXRhZGF0YSAhPSBOVUxMKSB7CisgICAgICBociA9IEV4dHJhY3RNZXRhZGF0YShmYWN0b3J5LCBmcmFtZSwgbWV0YWRhdGEpOworICAgICAgaWYgKEZBSUxFRChocikpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBleHRyYWN0aW5nIGltYWdlIG1ldGFkYXRhIHVzaW5nIFdJQyFcbiIpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIENsZWFudXAuCisgIGlmIChjb252ZXJ0ZXIgIT0gTlVMTCkgSVVua25vd25fUmVsZWFzZShjb252ZXJ0ZXIpOworICBpZiAoZnJhbWUgIT0gTlVMTCkgSVVua25vd25fUmVsZWFzZShmcmFtZSk7CisgIGlmIChkZWNvZGVyICE9IE5VTEwpIElVbmtub3duX1JlbGVhc2UoZGVjb2Rlcik7CisgIGlmIChmYWN0b3J5ICE9IE5VTEwpIElVbmtub3duX1JlbGVhc2UoZmFjdG9yeSk7CisgIGlmIChzdHJlYW0gIT0gTlVMTCkgSVVua25vd25fUmVsZWFzZShzdHJlYW0pOworICBmcmVlKHJnYik7CisgIHJldHVybiBTVUNDRUVERUQoaHIpOworfQorI2Vsc2UgIC8vICFIQVZFX1dJTkNPREVDX0gKK2ludCBSZWFkUGljdHVyZVdpdGhXSUMoY29uc3QgY2hhciogY29uc3QgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBXZWJQUGljdHVyZSogY29uc3QgcGljLCBpbnQga2VlcF9hbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IE1ldGFkYXRhKiBjb25zdCBtZXRhZGF0YSkgeworICAodm9pZClmaWxlbmFtZTsKKyAgKHZvaWQpcGljOworICAodm9pZClrZWVwX2FscGhhOworICAodm9pZCltZXRhZGF0YTsKKyAgZnByaW50ZihzdGRlcnIsICJXaW5kb3dzIEltYWdpbmcgQ29tcG9uZW50IChXSUMpIHN1cHBvcnQgbm90IGNvbXBpbGVkLiAiCisgICAgICAgICAgICAgICAgICAiVmlzdWFsIFN0dWRpbyBhbmQgbWluZ3ctdzY0IGJ1aWxkcyBzdXBwb3J0IFdJQy4gTWFrZSBzdXJlICIKKyAgICAgICAgICAgICAgICAgICJ3aW5jb2RlYy5oIGRldGVjdGlvbiBpcyB3b3JraW5nIGNvcnJlY3RseSBpZiB1c2luZyBhdXRvY29uZiAiCisgICAgICAgICAgICAgICAgICAiYW5kIEhBVkVfV0lOQ09ERUNfSCBpcyBkZWZpbmVkIGJlZm9yZSBidWlsZGluZy5cbiIpOworICByZXR1cm4gMDsKK30KKyNlbmRpZiAgLy8gSEFWRV9XSU5DT0RFQ19ICisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL3dpY2RlYy5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby93aWNkZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWVlY2E4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby93aWNkZWMuaApAQCAtMCwwICsxLDM0IEBACisvLyBDb3B5cmlnaHQgMjAxMyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gV2luZG93cyBJbWFnaW5nIENvbXBvbmVudCAoV0lDKSBkZWNvZGUuCisKKyNpZm5kZWYgV0VCUF9JTUFHRUlPX1dJQ0RFQ19IXworI2RlZmluZSBXRUJQX0lNQUdFSU9fV0lDREVDX0hfCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IE1ldGFkYXRhOworc3RydWN0IFdlYlBQaWN0dXJlOworCisvLyBSZWFkcyBhbiBpbWFnZSBmcm9tICdmaWxlbmFtZScsIHJldHVybmluZyB0aGUgZGVjb2RlZCBvdXRwdXQgaW4gJ3BpYycuCisvLyBJZiAna2VlcF9hbHBoYScgaXMgdHJ1ZSBhbmQgdGhlIGltYWdlIGhhcyBhbiBhbHBoYSBjaGFubmVsLCB0aGUgb3V0cHV0IGlzCisvLyBSR0JBIG90aGVyd2lzZSBpdCB3aWxsIGJlIFJHQi4gcGljLT51c2VfYXJnYiBpcyBhbHdheXMgZm9yY2VkIHRvIHRydWUuCisvLyBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcy4KK2ludCBSZWFkUGljdHVyZVdpdGhXSUMoY29uc3QgY2hhciogY29uc3QgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBXZWJQUGljdHVyZSogY29uc3QgcGljLCBpbnQga2VlcF9hbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IE1ldGFkYXRhKiBjb25zdCBtZXRhZGF0YSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvLyBXRUJQX0lNQUdFSU9fV0lDREVDX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pb3NidWlsZC5zaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2lvc2J1aWxkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk3MWVmYzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pb3NidWlsZC5zaApAQCAtMCwwICsxLDEyOSBAQAorIyEvYmluL2Jhc2gKKyMKKyMgVGhpcyBzY3JpcHQgZ2VuZXJhdGVzICdXZWJQLmZyYW1ld29yaycgYW5kICdXZWJQRGVjb2Rlci5mcmFtZXdvcmsnLiBBbiBpT1MKKyMgYXBwIGNhbiBkZWNvZGUgV2ViUCBpbWFnZXMgYnkgaW5jbHVkaW5nICdXZWJQRGVjb2Rlci5mcmFtZXdvcmsnIGFuZCBib3RoCisjIGVuY29kZSBhbmQgZGVjb2RlIFdlYlAgaW1hZ2VzIGJ5IGluY2x1ZGluZyAnV2ViUC5mcmFtZXdvcmsnLgorIworIyBSdW4gLi9pb3NidWlsZC5zaCB0byBnZW5lcmF0ZSB0aGUgZnJhbWV3b3JrcyB1bmRlciB0aGUgY3VycmVudCBkaXJlY3RvcnkKKyMgKHRoZSBwcmV2aW91cyBidWlsZCB3aWxsIGJlIGVyYXNlZCBpZiBpdCBleGlzdHMpLgorIworIyBUaGlzIHNjcmlwdCBpcyBpbnNwaXJlZCBieSB0aGUgYnVpbGQgc2NyaXB0IHdyaXR0ZW4gYnkgQ2Fyc29uIE1jRG9uYWxkLgorIyAoaHR0cDovL3d3dy5pb25jYW5ub24ubmV0L3Byb2dyYW1taW5nLzE0ODMvdXNpbmctd2VicC10by1yZWR1Y2UtbmF0aXZlLWlvcy1hcHAtc2l6ZS8pLgorCitzZXQgLWUKKworIyBFeHRyYWN0IHRoZSBsYXRlc3QgU0RLIHZlcnNpb24gZnJvbSB0aGUgZmluYWwgZmllbGQgb2YgdGhlIGZvcm06IGlwaG9uZW9zWC5ZCityZWFkb25seSBTREs9JCh4Y29kZWJ1aWxkIC1zaG93c2RrcyBcCisgIHwgZ3JlcCBpcGhvbmVvcyB8IHNvcnQgfCB0YWlsIC1uIDEgfCBhd2sgJ3twcmludCBzdWJzdHIoJE5GLCA5KX0nCispCisjIEV4dHJhY3QgWGNvZGUgdmVyc2lvbi4KK3JlYWRvbmx5IFhDT0RFPSQoeGNvZGVidWlsZCAtdmVyc2lvbiB8IGdyZXAgWGNvZGUgfCBjdXQgLWQgIiAiIC1mMikKK2lmIFtbIC16ICIke1hDT0RFfSIgXV07IHRoZW4KKyAgZWNobyAiWGNvZGUgbm90IGF2YWlsYWJsZSIKKyAgZXhpdCAxCitmaQorCityZWFkb25seSBPTERQQVRIPSR7UEFUSH0KKworIyBBZGQgaVBob25lT1MtVjYgdG8gdGhlIGxpc3Qgb2YgcGxhdGZvcm1zIGJlbG93IGlmIHlvdSBuZWVkIGFybXY2IHN1cHBvcnQuCisjIE5vdGUgdGhhdCBpUGhvbmVPUy1WNiBzdXBwb3J0IGlzIG5vdCBhdmFpbGFibGUgd2l0aCB0aGUgaU9TNiBTREsuCitQTEFURk9STVM9ImlQaG9uZVNpbXVsYXRvciBpUGhvbmVTaW11bGF0b3I2NCIKK1BMQVRGT1JNUys9IiBpUGhvbmVPUy1WNyBpUGhvbmVPUy1WN3MgaVBob25lT1MtVjctYXJtNjQiCityZWFkb25seSBQTEFURk9STVMKK3JlYWRvbmx5IFNSQ0RJUj0kKGRpcm5hbWUgJDApCityZWFkb25seSBUT1BESVI9JChwd2QpCityZWFkb25seSBCVUlMRERJUj0iJHtUT1BESVJ9L2lvc2J1aWxkIgorcmVhZG9ubHkgVEFSR0VURElSPSIke1RPUERJUn0vV2ViUC5mcmFtZXdvcmsiCityZWFkb25seSBERUNUQVJHRVRESVI9IiR7VE9QRElSfS9XZWJQRGVjb2Rlci5mcmFtZXdvcmsiCityZWFkb25seSBERVZFTE9QRVI9JCh4Y29kZS1zZWxlY3QgLS1wcmludC1wYXRoKQorcmVhZG9ubHkgUExBVEZPUk1TUk9PVD0iJHtERVZFTE9QRVJ9L1BsYXRmb3JtcyIKK3JlYWRvbmx5IExJUE89JCh4Y3J1biAtc2RrIGlwaG9uZW9zJHtTREt9IC1maW5kIGxpcG8pCitMSUJMSVNUPScnCitERUNMSUJMSVNUPScnCisKK2lmIFtbIC16ICIke1NES30iIF1dOyB0aGVuCisgIGVjaG8gImlPUyBTREsgbm90IGF2YWlsYWJsZSIKKyAgZXhpdCAxCitlbGlmIFtbICR7U0RLJSUuKn0gLWd0IDggXV07IHRoZW4KKyAgRVhUUkFfQ0ZMQUdTPSItZmVtYmVkLWJpdGNvZGUiCitlbGlmIFtbICR7U0RLfSA8IDYuMCBdXTsgdGhlbgorICBlY2hvICJZb3UgbmVlZCBpT1MgU0RLIHZlcnNpb24gNi4wIG9yIGFib3ZlIgorICBleGl0IDEKK2Vsc2UKKyAgZWNobyAiaU9TIFNESyBWZXJzaW9uICR7U0RLfSIKK2ZpCisKK3JtIC1yZiAke0JVSUxERElSfSAke1RBUkdFVERJUn0gJHtERUNUQVJHRVRESVJ9Citta2RpciAtcCAke0JVSUxERElSfSAke1RBUkdFVERJUn0vSGVhZGVycy8gJHtERUNUQVJHRVRESVJ9L0hlYWRlcnMvCisKK2lmIFtbICEgLWUgJHtTUkNESVJ9L2NvbmZpZ3VyZSBdXTsgdGhlbgorICBpZiAhIChjZCAke1NSQ0RJUn0gJiYgc2ggYXV0b2dlbi5zaCk7IHRoZW4KKyAgICBjYXQgPDxFT1QKK0Vycm9yIGNyZWF0aW5nIGNvbmZpZ3VyZSBzY3JpcHQhCitUaGlzIHNjcmlwdCByZXF1aXJlcyB0aGUgYXV0b2NvbmYvYXV0b21ha2UgYW5kIGxpYnRvb2wgdG8gYnVpbGQuIE1hY1BvcnRzIGNhbgorYmUgdXNlZCB0byBvYnRhaW4gdGhlc2U6CitodHRwOi8vd3d3Lm1hY3BvcnRzLm9yZy9pbnN0YWxsLnBocAorRU9UCisgICAgZXhpdCAxCisgIGZpCitmaQorCitmb3IgUExBVEZPUk0gaW4gJHtQTEFURk9STVN9OyBkbworICBBUkNIMj0iIgorICBpZiBbWyAiJHtQTEFURk9STX0iID09ICJpUGhvbmVPUy1WNy1hcm02NCIgXV07IHRoZW4KKyAgICBQTEFURk9STT0iaVBob25lT1MiCisgICAgQVJDSD0iYWFyY2g2NCIKKyAgICBBUkNIMj0iYXJtNjQiCisgIGVsaWYgW1sgIiR7UExBVEZPUk19IiA9PSAiaVBob25lT1MtVjdzIiBdXTsgdGhlbgorICAgIFBMQVRGT1JNPSJpUGhvbmVPUyIKKyAgICBBUkNIPSJhcm12N3MiCisgIGVsaWYgW1sgIiR7UExBVEZPUk19IiA9PSAiaVBob25lT1MtVjciIF1dOyB0aGVuCisgICAgUExBVEZPUk09ImlQaG9uZU9TIgorICAgIEFSQ0g9ImFybXY3IgorICBlbGlmIFtbICIke1BMQVRGT1JNfSIgPT0gImlQaG9uZU9TLVY2IiBdXTsgdGhlbgorICAgIFBMQVRGT1JNPSJpUGhvbmVPUyIKKyAgICBBUkNIPSJhcm12NiIKKyAgZWxpZiBbWyAiJHtQTEFURk9STX0iID09ICJpUGhvbmVTaW11bGF0b3I2NCIgXV07IHRoZW4KKyAgICBQTEFURk9STT0iaVBob25lU2ltdWxhdG9yIgorICAgIEFSQ0g9Ing4Nl82NCIKKyAgZWxzZQorICAgIEFSQ0g9ImkzODYiCisgIGZpCisKKyAgUk9PVERJUj0iJHtCVUlMRERJUn0vJHtQTEFURk9STX0tJHtTREt9LSR7QVJDSH0iCisgIG1rZGlyIC1wICIke1JPT1RESVJ9IgorCisgIERFVlJPT1Q9IiR7REVWRUxPUEVSfS9Ub29sY2hhaW5zL1hjb2RlRGVmYXVsdC54Y3Rvb2xjaGFpbiIKKyAgU0RLUk9PVD0iJHtQTEFURk9STVNST09UfS8iCisgIFNES1JPT1QrPSIke1BMQVRGT1JNfS5wbGF0Zm9ybS9EZXZlbG9wZXIvU0RLcy8ke1BMQVRGT1JNfSR7U0RLfS5zZGsvIgorICBDRkxBR1M9Ii1hcmNoICR7QVJDSDI6LSR7QVJDSH19IC1waXBlIC1pc3lzcm9vdCAke1NES1JPT1R9IC1PMyAtRE5ERUJVRyIKKyAgQ0ZMQUdTKz0iIC1taXBob25lb3MtdmVyc2lvbi1taW49Ni4wICR7RVhUUkFfQ0ZMQUdTfSIKKworICBzZXQgLXgKKyAgZXhwb3J0IFBBVEg9IiR7REVWUk9PVH0vdXNyL2Jpbjoke09MRFBBVEh9IgorICAke1NSQ0RJUn0vY29uZmlndXJlIC0taG9zdD0ke0FSQ0h9LWFwcGxlLWRhcndpbiAtLXByZWZpeD0ke1JPT1RESVJ9IFwKKyAgICAtLWJ1aWxkPSQoJHtTUkNESVJ9L2NvbmZpZy5ndWVzcykgXAorICAgIC0tZGlzYWJsZS1zaGFyZWQgLS1lbmFibGUtc3RhdGljIFwKKyAgICAtLWVuYWJsZS1saWJ3ZWJwZGVjb2RlciAtLWVuYWJsZS1zd2FwLTE2Yml0LWNzcCBcCisgICAgQ0ZMQUdTPSIke0NGTEFHU30iCisgIHNldCAreAorCisgICMgcnVuIG1ha2Ugb25seSBpbiB0aGUgc3JjLyBkaXJlY3RvcnkgdG8gY3JlYXRlIGxpYndlYnAuYS9saWJ3ZWJwZGVjb2Rlci5hCisgIGNkIHNyYy8KKyAgbWFrZSBWPTAKKyAgbWFrZSBpbnN0YWxsCisKKyAgTElCTElTVCs9IiAke1JPT1RESVJ9L2xpYi9saWJ3ZWJwLmEiCisgIERFQ0xJQkxJU1QrPSIgJHtST09URElSfS9saWIvbGlid2VicGRlY29kZXIuYSIKKworICBtYWtlIGNsZWFuCisgIGNkIC4uCisKKyAgZXhwb3J0IFBBVEg9JHtPTERQQVRIfQorZG9uZQorCitjcCAtYSAke1NSQ0RJUn0vc3JjL3dlYnAve2RlY29kZSxlbmNvZGUsdHlwZXN9LmggJHtUQVJHRVRESVJ9L0hlYWRlcnMvCiske0xJUE99IC1jcmVhdGUgJHtMSUJMSVNUfSAtb3V0cHV0ICR7VEFSR0VURElSfS9XZWJQCisKK2NwIC1hICR7U1JDRElSfS9zcmMvd2VicC97ZGVjb2RlLHR5cGVzfS5oICR7REVDVEFSR0VURElSfS9IZWFkZXJzLworJHtMSVBPfSAtY3JlYXRlICR7REVDTElCTElTVH0gLW91dHB1dCAke0RFQ1RBUkdFVERJUn0vV2ViUERlY29kZXIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2xpYndlYnAuZ3lwIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvbGlid2VicC5neXAKaW5kZXggNjgwNmYwNy4uMjZiOGQ2ZCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvbGlid2VicC5neXAKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvbGlid2VicC5neXAKQEAgLTEsMzAgKzEsMTcgQEAKICMgQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogIyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAjIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KIHsKKyAgJ2luY2x1ZGVzJzogWworICAgICdsaWJ3ZWJwLmd5cGknCisgIF0sCiAgICd0YXJnZXRzJzogWwogICAgIHsKICAgICAgICd0YXJnZXRfbmFtZSc6ICdsaWJ3ZWJwX2RlYycsCiAgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCi0gICAgICAnZGVwZW5kZW5jaWVzJyA6IFsKLSAgICAgICAgJ2xpYndlYnBfZHNwJywKLSAgICAgICAgJ2xpYndlYnBfZHNwX25lb24nLAotICAgICAgICAnbGlid2VicF91dGlscycsCi0gICAgICBdLAogICAgICAgJ2luY2x1ZGVfZGlycyc6IFsnLiddLAogICAgICAgJ3NvdXJjZXMnOiBbCi0gICAgICAgICdkZWMvYWxwaGEuYycsCi0gICAgICAgICdkZWMvYnVmZmVyLmMnLAotICAgICAgICAnZGVjL2ZyYW1lLmMnLAotICAgICAgICAnZGVjL2lkZWMuYycsCi0gICAgICAgICdkZWMvaW8uYycsCi0gICAgICAgICdkZWMvbGF5ZXIuYycsCi0gICAgICAgICdkZWMvcXVhbnQuYycsCi0gICAgICAgICdkZWMvdHJlZS5jJywKLSAgICAgICAgJ2RlYy92cDguYycsCi0gICAgICAgICdkZWMvdnA4bC5jJywKLSAgICAgICAgJ2RlYy93ZWJwLmMnLAorICAgICAgICAnPEAobGlid2VicF9kZWNfc291cmNlcyknLAogICAgICAgXSwKICAgICB9LAogICAgIHsKQEAgLTMyLDExMyArMTksMTI0IEBACiAgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCiAgICAgICAnaW5jbHVkZV9kaXJzJzogWycuJ10sCiAgICAgICAnc291cmNlcyc6IFsKLSAgICAgICAgJ2RlbXV4L2RlbXV4LmMnLAorICAgICAgICAnPEAobGlid2VicF9kZW11eF9zb3VyY2VzKScsCiAgICAgICBdLAogICAgIH0sCiAgICAgewotICAgICAgJ3RhcmdldF9uYW1lJzogJ2xpYndlYnBfZHNwJywKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdsaWJ3ZWJwX2RzcF9kZWMnLAorICAgICAgJ3R5cGUnIDogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdpbmNsdWRlX2RpcnMnOiBbJy4nXSwKKyAgICAgICdzb3VyY2VzJyA6IFsKKyAgICAgICAgJzxAKGxpYndlYnBfZHNwX2RlY19jb21tb25fc291cmNlcyknLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICdsaWJ3ZWJwX2RzcF9kZWNfbXNhJywKKyAgICAgICAgJ2xpYndlYnBfZHNwX2RlY19uZW9uJywKKyAgICAgICAgJ2xpYndlYnBfZHNwX2RlY19zc2UyJywKKyAgICAgICAgJ2xpYndlYnBfZHNwX2RlY19zc2U0MScsCisgICAgICAgICdsaWJ3ZWJwX2RzcF9kZWNfbWlwczMyJywKKyAgICAgICAgJ2xpYndlYnBfZHNwX2RlY19taXBzX2RzcF9yMicsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2xpYndlYnBfZHNwX2RlY19tc2EnLAorICAgICAgJ3R5cGUnIDogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdpbmNsdWRlX2RpcnMnOiBbJy4nXSwKKyAgICAgICdzb3VyY2VzJyA6IFsKKyAgICAgICAgJzxAKGxpYndlYnBfZHNwX2RlY19tc2Ffc291cmNlcyknLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdsaWJ3ZWJwX2RzcF9kZWNfbmVvbicsCisgICAgICAndHlwZScgOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ2luY2x1ZGVfZGlycyc6IFsnLiddLAorICAgICAgJ3NvdXJjZXMnIDogWworICAgICAgICAnPEAobGlid2VicF9kc3BfZGVjX25lb25fc291cmNlcyknLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdsaWJ3ZWJwX2RzcF9kZWNfc3NlMicsCisgICAgICAndHlwZScgOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ2luY2x1ZGVfZGlycyc6IFsnLiddLAorICAgICAgJ3NvdXJjZXMnIDogWworICAgICAgICAnPEAobGlid2VicF9kc3BfZGVjX3NzZTJfc291cmNlcyknLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdsaWJ3ZWJwX2RzcF9kZWNfc3NlNDEnLAorICAgICAgJ3R5cGUnIDogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdpbmNsdWRlX2RpcnMnOiBbJy4nXSwKKyAgICAgICdzb3VyY2VzJyA6IFsKKyAgICAgICAgJzxAKGxpYndlYnBfZHNwX2RlY19zc2U0MV9zb3VyY2VzKScsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2xpYndlYnBfZHNwX2RlY19taXBzMzInLAorICAgICAgJ3R5cGUnIDogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdpbmNsdWRlX2RpcnMnOiBbJy4nXSwKKyAgICAgICdzb3VyY2VzJyA6IFsKKyAgICAgICAgJzxAKGxpYndlYnBfZHNwX2RlY19taXBzMzJfc291cmNlcyknLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdsaWJ3ZWJwX2RzcF9kZWNfbWlwc19kc3BfcjInLAorICAgICAgJ3R5cGUnIDogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdpbmNsdWRlX2RpcnMnOiBbJy4nXSwKKyAgICAgICdzb3VyY2VzJyA6IFsKKyAgICAgICAgJzxAKGxpYndlYnBfZHNwX2RlY19taXBzX2RzcF9yMl9zb3VyY2VzKScsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2xpYndlYnBfdXRpbHNfZGVjJywKICAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKICAgICAgICdpbmNsdWRlX2RpcnMnOiBbJy4nXSwKICAgICAgICdzb3VyY2VzJzogWwotICAgICAgICAnZHNwL2NwdS5jJywKLSAgICAgICAgJ2RzcC9kZWMuYycsCi0gICAgICAgICdkc3AvZGVjX3NzZTIuYycsCi0gICAgICAgICdkc3AvZW5jLmMnLAotICAgICAgICAnZHNwL2VuY19zc2UyLmMnLAotICAgICAgICAnZHNwL2xvc3NsZXNzLmMnLAotICAgICAgICAnZHNwL3Vwc2FtcGxpbmcuYycsCi0gICAgICAgICdkc3AvdXBzYW1wbGluZ19zc2UyLmMnLAotICAgICAgICAnZHNwL3l1di5jJywKLSAgICAgIF0sCi0gICAgICAnY29uZGl0aW9ucyc6IFsKLSAgICAgICAgWydPUyA9PSAiYW5kcm9pZCInLCB7Ci0gICAgICAgICAgJ2luY2x1ZGVzJzogWyAnLi4vLi4vYnVpbGQvYW5kcm9pZC9jcHVmZWF0dXJlcy5neXBpJyBdLAotICAgICAgICB9XSwKKyAgICAgICAgJzxAKGxpYndlYnBfdXRpbHNfZGVjX3NvdXJjZXMpJywKICAgICAgIF0sCiAgICAgfSwKLSAgICB7Ci0gICAgICAndGFyZ2V0X25hbWUnOiAnbGlid2VicF9kc3BfbmVvbicsCi0gICAgICAnY29uZGl0aW9ucyc6IFsKLSAgICAgICAgWycoKHRhcmdldF9hcmNoID09ICJhcm0iIGFuZCBhcm1fdmVyc2lvbiA+PSA3KSBvciAodGFyZ2V0X2FyY2ggPT0gImFybTY0IikpJywgewotICAgICAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKLSAgICAgICAgICAnaW5jbHVkZV9kaXJzJzogWycuJ10sCi0gICAgICAgICAgJ3NvdXJjZXMnOiBbCi0gICAgICAgICAgICAnZHNwL2RlY19uZW9uLmMnLAotICAgICAgICAgICAgJ2RzcC9lbmNfbmVvbi5jJywKLSAgICAgICAgICAgICdkc3AvdXBzYW1wbGluZ19uZW9uLmMnLAotICAgICAgICAgIF0sCi0gICAgICAgICAgIyBiZWhhdmlvciBzaW1pbGFyIHRvICouYy5uZW9uIGluIGFuIEFuZHJvaWQubWsKLSAgICAgICAgICAnY2ZsYWdzISc6IFsgJy1tZnB1PXZmcHYzLWQxNicgXSwKLSAgICAgICAgICAnY2ZsYWdzJzogWyAnLW1mcHU9bmVvbicgXSwKLSAgICAgICAgfSx7ICAjICJ0YXJnZXRfYXJjaCAhPSAiYXJtIiBvciBhcm1fdmVyc2lvbiA8IDciCi0gICAgICAgICAgJ3R5cGUnOiAnbm9uZScsCi0gICAgICAgIH1dLAotICAgICAgICBbJyh0YXJnZXRfYXJjaCA9PSAiYXJtIiBhbmQgYXJtX3ZlcnNpb24gPj0gOCkgb3IgKHRhcmdldF9hcmNoID09ICJhcm02NCIpJywgewotICAgICAgICAgICMgTkVPTiBpcyBpbXBsaWNpdCBvbiBBUk12OCwgYW5kIGJvdGggY2xhbmcgYW5kIGdjYyBkb24ndCBsaWtlIHRoZQotICAgICAgICAgICMgcmVkdW5kYW50IGZsYWcuCi0gICAgICAgICAgJ2NmbGFncyEnOiBbICctbWZwdT1uZW9uJyBdLAotICAgICAgICB9XSwKLSAgICAgIF0sCi0gICAgfSwKKwogICAgIHsKICAgICAgICd0YXJnZXRfbmFtZSc6ICdsaWJ3ZWJwX2VuYycsCi0gICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAndHlwZScgOiAnc3RhdGljX2xpYnJhcnknLAogICAgICAgJ2luY2x1ZGVfZGlycyc6IFsnLiddLAotICAgICAgJ3NvdXJjZXMnOiBbCi0gICAgICAgICdlbmMvYWxwaGEuYycsCi0gICAgICAgICdlbmMvYW5hbHlzaXMuYycsCi0gICAgICAgICdlbmMvYmFja3dhcmRfcmVmZXJlbmNlcy5jJywKLSAgICAgICAgJ2VuYy9jb25maWcuYycsCi0gICAgICAgICdlbmMvY29zdC5jJywKLSAgICAgICAgJ2VuYy9maWx0ZXIuYycsCi0gICAgICAgICdlbmMvZnJhbWUuYycsCi0gICAgICAgICdlbmMvaGlzdG9ncmFtLmMnLAotICAgICAgICAnZW5jL2l0ZXJhdG9yLmMnLAotICAgICAgICAnZW5jL2xheWVyLmMnLAotICAgICAgICAnZW5jL3BpY3R1cmUuYycsCi0gICAgICAgICdlbmMvcXVhbnQuYycsCi0gICAgICAgICdlbmMvc3ludGF4LmMnLAotICAgICAgICAnZW5jL3Rva2VuLmMnLAotICAgICAgICAnZW5jL3RyZWUuYycsCi0gICAgICAgICdlbmMvdnA4bC5jJywKLSAgICAgICAgJ2VuYy93ZWJwZW5jLmMnLAorICAgICAgJ3NvdXJjZXMnIDogWworICAgICAgICAnPEAobGlid2VicF9lbmNfc291cmNlcyknLAogICAgICAgXSwKICAgICB9LAogICAgIHsKLSAgICAgICd0YXJnZXRfbmFtZSc6ICdsaWJ3ZWJwX3V0aWxzJywKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdsaWJ3ZWJwX2RzcF9lbmMnLAorICAgICAgJ3R5cGUnIDogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdpbmNsdWRlX2RpcnMnOiBbJy4nXSwKKyAgICAgICdzb3VyY2VzJyA6IFsKKyAgICAgICAgJzxAKGxpYndlYnBfZHNwX2VuY19zb3VyY2VzKScsCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnbGlid2VicF91dGlsc19lbmMnLAogICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAogICAgICAgJ2luY2x1ZGVfZGlycyc6IFsnLiddLAogICAgICAgJ3NvdXJjZXMnOiBbCi0gICAgICAgICd1dGlscy9iaXRfcmVhZGVyLmMnLAotICAgICAgICAndXRpbHMvYml0X3dyaXRlci5jJywKLSAgICAgICAgJ3V0aWxzL2NvbG9yX2NhY2hlLmMnLAotICAgICAgICAndXRpbHMvZmlsdGVycy5jJywKLSAgICAgICAgJ3V0aWxzL2h1ZmZtYW4uYycsCi0gICAgICAgICMndXRpbHMvaHVmZm1hbl9lbmNvZGUuYycsCi0gICAgICAgICd1dGlscy9xdWFudF9sZXZlbHMuYycsCi0gICAgICAgICd1dGlscy9xdWFudF9sZXZlbHNfZGVjLmMnLAotICAgICAgICAndXRpbHMvcmVzY2FsZXIuYycsCi0gICAgICAgICd1dGlscy90aHJlYWQuYycsCi0gICAgICAgICd1dGlscy91dGlscy5jJywKKyAgICAgICAgJzxAKGxpYndlYnBfdXRpbHNfZW5jX3NvdXJjZXMpJywKICAgICAgIF0sCiAgICAgfSwKKwogICAgIHsKICAgICAgICd0YXJnZXRfbmFtZSc6ICdsaWJ3ZWJwJywKICAgICAgICd0eXBlJzogJ25vbmUnLAogICAgICAgJ2RlcGVuZGVuY2llcycgOiBbCiAgICAgICAgICdsaWJ3ZWJwX2RlYycsCiAgICAgICAgICdsaWJ3ZWJwX2RlbXV4JywKLSAgICAgICAgIydsaWJ3ZWJwX2RzcCcsCi0gICAgICAgICMnbGlid2VicF9kc3BfbmVvbicsCi0gICAgICAgICMnbGlid2VicF9lbmMnLCAgIyBOb3QgbmVlZGVkIGJ5IENvYmFsdAotICAgICAgICAnbGlid2VicF91dGlscycsCisgICAgICAgICdsaWJ3ZWJwX2RzcF9kZWMnLAorICAgICAgICAnbGlid2VicF91dGlsc19kZWMnLAorICAgICAgICAnbGlid2VicF9lbmMnLAorICAgICAgICAnbGlid2VicF9kc3BfZW5jJywKKyAgICAgICAgJ2xpYndlYnBfdXRpbHNfZW5jJywKICAgICAgIF0sCiAgICAgICAnZGlyZWN0X2RlcGVuZGVudF9zZXR0aW5ncyc6IHsKICAgICAgICAgJ2luY2x1ZGVfZGlycyc6IFsnLiddLAogICAgICAgfSwKLSAgICAgICdjb25kaXRpb25zJzogWwotICAgICAgICBbJ09TIT0id2luIicsIHsncHJvZHVjdF9uYW1lJzogJ3dlYnAnfV0sCi0gICAgICBdLAogICAgIH0sCiAgIF0sCiB9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9saWJ3ZWJwLmd5cGkgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9saWJ3ZWJwLmd5cGkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBhMWJmZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2xpYndlYnAuZ3lwaQpAQCAtMCwwICsxLDE2OCBAQAoreworICAndmFyaWFibGVzJzogeworICAgICdsaWJ3ZWJwX2RlY19zb3VyY2VzJzogWworICAgICAgJ3NyYy9kZWMvYWxwaGFfZGVjLmMnLAorICAgICAgJ3NyYy9kZWMvYnVmZmVyX2RlYy5jJywKKyAgICAgICdzcmMvZGVjL2ZyYW1lX2RlYy5jJywKKyAgICAgICdzcmMvZGVjL2lkZWNfZGVjLmMnLAorICAgICAgJ3NyYy9kZWMvaW9fZGVjLmMnLAorICAgICAgJ3NyYy9kZWMvcXVhbnRfZGVjLmMnLAorICAgICAgJ3NyYy9kZWMvdHJlZV9kZWMuYycsCisgICAgICAnc3JjL2RlYy92cDhfZGVjLmMnLAorICAgICAgJ3NyYy9kZWMvdnA4bF9kZWMuYycsCisgICAgICAnc3JjL2RlYy93ZWJwX2RlYy5jJywKKyAgICBdLAorICAgICdsaWJ3ZWJwX2RlbXV4X3NvdXJjZXMnOiBbCisgICAgICAnc3JjL2RlbXV4L2FuaW1fZGVjb2RlLmMnLAorICAgICAgJ3NyYy9kZW11eC9kZW11eC5jJywKKyAgICBdLAorICAgICdsaWJ3ZWJwX2RzcF9kZWNfY29tbW9uX3NvdXJjZXMnOiBbCisgICAgICAnc3JjL2RzcC9hbHBoYV9wcm9jZXNzaW5nLmMnLAorICAgICAgJ3NyYy9kc3AvY3B1LmMnLAorICAgICAgJ3NyYy9kc3AvZGVjLmMnLAorICAgICAgJ3NyYy9kc3AvZGVjX2NsaXBfdGFibGVzLmMnLAorICAgICAgJ3NyYy9kc3AvZmlsdGVycy5jJywKKyAgICAgICdzcmMvZHNwL2xvc3NsZXNzLmMnLAorICAgICAgJ3NyYy9kc3AvcmVzY2FsZXIuYycsCisgICAgICAnc3JjL2RzcC91cHNhbXBsaW5nLmMnLAorICAgICAgJ3NyYy9kc3AveXV2LmMnLAorICAgIF0sCisgICAgJ2xpYndlYnBfZHNwX2RlY19zc2U0MV9zb3VyY2VzJzogWworICAgICAgJ3NyYy9kc3AvYWxwaGFfcHJvY2Vzc2luZ19zc2U0MS5jJywKKyAgICAgICdzcmMvZHNwL2RlY19zc2U0MS5jJywKKyAgICAgICdzcmMvZHNwL3Vwc2FtcGxpbmdfc3NlNDEuYycsCisgICAgICAnc3JjL2RzcC95dXZfc3NlNDEuYycsCisgICAgXSwKKyAgICAnbGlid2VicF9kc3BfZGVjX3NzZTJfc291cmNlcyc6IFsKKyAgICAgICdzcmMvZHNwL2FscGhhX3Byb2Nlc3Npbmdfc3NlMi5jJywKKyAgICAgICdzcmMvZHNwL2RlY19zc2UyLmMnLAorICAgICAgJ3NyYy9kc3AvZmlsdGVyc19zc2UyLmMnLAorICAgICAgJ3NyYy9kc3AvbG9zc2xlc3Nfc3NlMi5jJywKKyAgICAgICdzcmMvZHNwL3Jlc2NhbGVyX3NzZTIuYycsCisgICAgICAnc3JjL2RzcC91cHNhbXBsaW5nX3NzZTIuYycsCisgICAgICAnc3JjL2RzcC95dXZfc3NlMi5jJywKKyAgICBdLAorICAgICdsaWJ3ZWJwX2RzcF9kZWNfbmVvbl9zb3VyY2VzJzogWworICAgICAgJ3NyYy9kc3AvYWxwaGFfcHJvY2Vzc2luZ19uZW9uLmMnLAorICAgICAgJ3NyYy9kc3AvZGVjX25lb24uYycsCisgICAgICAnc3JjL2RzcC9maWx0ZXJzX25lb24uYycsCisgICAgICAnc3JjL2RzcC9sb3NzbGVzc19uZW9uLmMnLAorICAgICAgJ3NyYy9kc3AvcmVzY2FsZXJfbmVvbi5jJywKKyAgICAgICdzcmMvZHNwL3Vwc2FtcGxpbmdfbmVvbi5jJywKKyAgICAgICdzcmMvZHNwL3l1dl9uZW9uLmMnLAorICAgIF0sCisgICAgJ2xpYndlYnBfZHNwX2RlY19taXBzX2RzcF9yMl9zb3VyY2VzJzogWworICAgICAgJ3NyYy9kc3AvYWxwaGFfcHJvY2Vzc2luZ19taXBzX2RzcF9yMi5jJywKKyAgICAgICdzcmMvZHNwL2RlY19taXBzX2RzcF9yMi5jJywKKyAgICAgICdzcmMvZHNwL2ZpbHRlcnNfbWlwc19kc3BfcjIuYycsCisgICAgICAnc3JjL2RzcC9sb3NzbGVzc19taXBzX2RzcF9yMi5jJywKKyAgICAgICdzcmMvZHNwL3Jlc2NhbGVyX21pcHNfZHNwX3IyLmMnLAorICAgICAgJ3NyYy9kc3AvdXBzYW1wbGluZ19taXBzX2RzcF9yMi5jJywKKyAgICAgICdzcmMvZHNwL3l1dl9taXBzX2RzcF9yMi5jJywKKyAgICBdLAorICAgICdsaWJ3ZWJwX2RzcF9kZWNfbWlwczMyX3NvdXJjZXMnOiBbCisgICAgICAnc3JjL2RzcC9kZWNfbWlwczMyLmMnLAorICAgICAgJ3NyYy9kc3AvcmVzY2FsZXJfbWlwczMyLmMnLAorICAgICAgJ3NyYy9kc3AveXV2X21pcHMzMi5jJywKKyAgICBdLAorICAgICdsaWJ3ZWJwX2RzcF9kZWNfbXNhX3NvdXJjZXMnOiBbCisgICAgICAnc3JjL2RzcC9kZWNfbXNhLmMnLAorICAgICAgJ3NyYy9kc3AvZmlsdGVyc19tc2EuYycsCisgICAgICAnc3JjL2RzcC9sb3NzbGVzc19tc2EuYycsCisgICAgICAnc3JjL2RzcC9yZXNjYWxlcl9tc2EuYycsCisgICAgICAnc3JjL2RzcC91cHNhbXBsaW5nX21zYS5jJywKKyAgICBdLAorICAgICdsaWJ3ZWJwX2RzcF9lbmNfc291cmNlcycgOiBbCisgICAgICAnc3JjL2RzcC9jb3N0LmMnLAorICAgICAgJ3NyYy9kc3AvY29zdF9taXBzMzIuYycsCisgICAgICAnc3JjL2RzcC9jb3N0X21pcHNfZHNwX3IyLmMnLAorICAgICAgJ3NyYy9kc3AvY29zdF9zc2UyLmMnLAorICAgICAgJ3NyYy9kc3AvZW5jLmMnLAorICAgICAgJ3NyYy9kc3AvZW5jX2F2eDIuYycsCisgICAgICAnc3JjL2RzcC9lbmNfbWlwczMyLmMnLAorICAgICAgJ3NyYy9kc3AvZW5jX21pcHNfZHNwX3IyLmMnLAorICAgICAgJ3NyYy9kc3AvZW5jX21zYS5jJywKKyAgICAgICdzcmMvZHNwL2VuY19uZW9uLmMnLAorICAgICAgJ3NyYy9kc3AvZW5jX3NzZTIuYycsCisgICAgICAnc3JjL2RzcC9lbmNfc3NlNDEuYycsCisgICAgICAnc3JjL2RzcC9sb3NzbGVzc19lbmMuYycsCisgICAgICAnc3JjL2RzcC9sb3NzbGVzc19lbmNfbWlwczMyLmMnLAorICAgICAgJ3NyYy9kc3AvbG9zc2xlc3NfZW5jX21pcHNfZHNwX3IyLmMnLAorICAgICAgJ3NyYy9kc3AvbG9zc2xlc3NfZW5jX21zYS5jJywKKyAgICAgICdzcmMvZHNwL2xvc3NsZXNzX2VuY19uZW9uLmMnLAorICAgICAgJ3NyYy9kc3AvbG9zc2xlc3NfZW5jX3NzZTIuYycsCisgICAgICAnc3JjL2RzcC9sb3NzbGVzc19lbmNfc3NlNDEuYycsCisgICAgICAnc3JjL2RzcC9zc2ltLmMnLAorICAgICAgJ3NyYy9kc3Avc3NpbV9zc2UyLmMnLAorICAgIF0sCisgICAgJ2xpYndlYnBfZW5jX3NvdXJjZXMnOiBbCisgICAgICAnc3JjL2VuYy9hbHBoYV9lbmMuYycsCisgICAgICAnc3JjL2VuYy9hbmFseXNpc19lbmMuYycsCisgICAgICAnc3JjL2VuYy9iYWNrd2FyZF9yZWZlcmVuY2VzX2Nvc3RfZW5jLmMnLAorICAgICAgJ3NyYy9lbmMvYmFja3dhcmRfcmVmZXJlbmNlc19lbmMuYycsCisgICAgICAnc3JjL2VuYy9jb25maWdfZW5jLmMnLAorICAgICAgJ3NyYy9lbmMvY29zdF9lbmMuYycsCisgICAgICAnc3JjL2VuYy9maWx0ZXJfZW5jLmMnLAorICAgICAgJ3NyYy9lbmMvZnJhbWVfZW5jLmMnLAorICAgICAgJ3NyYy9lbmMvaGlzdG9ncmFtX2VuYy5jJywKKyAgICAgICdzcmMvZW5jL2l0ZXJhdG9yX2VuYy5jJywKKyAgICAgICdzcmMvZW5jL25lYXJfbG9zc2xlc3NfZW5jLmMnLAorICAgICAgJ3NyYy9lbmMvcGljdHVyZV9lbmMuYycsCisgICAgICAnc3JjL2VuYy9waWN0dXJlX2NzcF9lbmMuYycsCisgICAgICAnc3JjL2VuYy9waWN0dXJlX3BzbnJfZW5jLmMnLAorICAgICAgJ3NyYy9lbmMvcGljdHVyZV9yZXNjYWxlX2VuYy5jJywKKyAgICAgICdzcmMvZW5jL3BpY3R1cmVfdG9vbHNfZW5jLmMnLAorICAgICAgJ3NyYy9lbmMvcHJlZGljdG9yX2VuYy5jJywKKyAgICAgICdzcmMvZW5jL3F1YW50X2VuYy5jJywKKyAgICAgICdzcmMvZW5jL3N5bnRheF9lbmMuYycsCisgICAgICAnc3JjL2VuYy90b2tlbl9lbmMuYycsCisgICAgICAnc3JjL2VuYy90cmVlX2VuYy5jJywKKyAgICAgICdzcmMvZW5jL3ZwOGxfZW5jLmMnLAorICAgICAgJ3NyYy9lbmMvd2VicF9lbmMuYycsCisgICAgXSwKKyAgICAnbGlid2VicF9mb3JtYXRfZGVjX3NvdXJjZXMnOiBbCisgICAgICAnaW1hZ2Vpby9pbWFnZV9kZWMuYycsCisgICAgICAnaW1hZ2Vpby9qcGVnZGVjLmMnLAorICAgICAgJ2ltYWdlaW8vbWV0YWRhdGEuYycsCisgICAgICAnaW1hZ2Vpby9wbmdkZWMuYycsCisgICAgICAnaW1hZ2Vpby9wbm1kZWMuYycsCisgICAgICAnaW1hZ2Vpby90aWZmZGVjLmMnLAorICAgICAgJ2ltYWdlaW8vd2VicGRlYy5jJywKKyAgICBdLAorICAgICdsaWJ3ZWJwX2Zvcm1hdF9lbmNfc291cmNlcyc6IFsKKyAgICAgICdpbWFnZWlvL2ltYWdlX2VuYy5jJywKKyAgICBdLAorICAgICdsaWJ3ZWJwX3V0aWxfc291cmNlcyc6IFsKKyAgICAgICdleGFtcGxlcy9leGFtcGxlX3V0aWwuYycsCisgICAgXSwKKyAgICAnbGlid2VicF9pbWFnZV91dGlsX3NvdXJjZXMnOiBbCisgICAgICAnaW1hZ2Vpby9pbWFnZWlvX3V0aWwuYycsCisgICAgXSwKKyAgICAnbGlid2VicF9tdXhfc291cmNlcyc6IFsKKyAgICAgICdzcmMvbXV4L2FuaW1fZW5jb2RlLmMnLAorICAgICAgJ3NyYy9tdXgvbXV4ZWRpdC5jJywKKyAgICAgICdzcmMvbXV4L211eGludGVybmFsLmMnLAorICAgICAgJ3NyYy9tdXgvbXV4cmVhZC5jJywKKyAgICBdLAorICAgICdsaWJ3ZWJwX3V0aWxzX2RlY19zb3VyY2VzJzogWworICAgICAgJ3NyYy91dGlscy9iaXRfcmVhZGVyX3V0aWxzLmMnLAorICAgICAgJ3NyYy91dGlscy9jb2xvcl9jYWNoZV91dGlscy5jJywKKyAgICAgICdzcmMvdXRpbHMvZmlsdGVyc191dGlscy5jJywKKyAgICAgICdzcmMvdXRpbHMvaHVmZm1hbl91dGlscy5jJywKKyAgICAgICdzcmMvdXRpbHMvcXVhbnRfbGV2ZWxzX2RlY191dGlscy5jJywKKyAgICAgICdzcmMvdXRpbHMvcmFuZG9tX3V0aWxzLmMnLAorICAgICAgJ3NyYy91dGlscy9yZXNjYWxlcl91dGlscy5jJywKKyAgICAgICdzcmMvdXRpbHMvdGhyZWFkX3V0aWxzLmMnLAorICAgICAgJ3NyYy91dGlscy91dGlscy5jJywKKyAgICBdLAorICAgICdsaWJ3ZWJwX3V0aWxzX2VuY19zb3VyY2VzJzogWworICAgICAgJ3NyYy91dGlscy9iaXRfd3JpdGVyX3V0aWxzLmMnLAorICAgICAgJ3NyYy91dGlscy9odWZmbWFuX2VuY29kZV91dGlscy5jJywKKyAgICAgICdzcmMvdXRpbHMvcXVhbnRfbGV2ZWxzX3V0aWxzLmMnLAorICAgIF0sCisgICAgJ2xpYndlYnBfZXh0cmFfc291cmNlcyc6IFsKKyAgICAgICdleHRyYXMvZXh0cmFzLmMnLAorICAgICAgJ2V4dHJhcy9xdWFsaXR5X2VzdGltYXRlLmMnLAorICAgIF0sCisgIH0sCit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9tNC9heF9wdGhyZWFkLm00IGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvbTQvYXhfcHRocmVhZC5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzgzYWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvbTQvYXhfcHRocmVhZC5tNApAQCAtMCwwICsxLDMzMiBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgICAgICAgIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X3B0aHJlYWQuaHRtbAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgU1lOT1BTSVMKKyMKKyMgICBBWF9QVEhSRUFEKFtBQ1RJT04tSUYtRk9VTkRbLCBBQ1RJT04tSUYtTk9ULUZPVU5EXV0pCisjCisjIERFU0NSSVBUSU9OCisjCisjICAgVGhpcyBtYWNybyBmaWd1cmVzIG91dCBob3cgdG8gYnVpbGQgQyBwcm9ncmFtcyB1c2luZyBQT1NJWCB0aHJlYWRzLiBJdAorIyAgIHNldHMgdGhlIFBUSFJFQURfTElCUyBvdXRwdXQgdmFyaWFibGUgdG8gdGhlIHRocmVhZHMgbGlicmFyeSBhbmQgbGlua2VyCisjICAgZmxhZ3MsIGFuZCB0aGUgUFRIUkVBRF9DRkxBR1Mgb3V0cHV0IHZhcmlhYmxlIHRvIGFueSBzcGVjaWFsIEMgY29tcGlsZXIKKyMgICBmbGFncyB0aGF0IGFyZSBuZWVkZWQuIChUaGUgdXNlciBjYW4gYWxzbyBmb3JjZSBjZXJ0YWluIGNvbXBpbGVyCisjICAgZmxhZ3MvbGlicyB0byBiZSB0ZXN0ZWQgYnkgc2V0dGluZyB0aGVzZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuKQorIworIyAgIEFsc28gc2V0cyBQVEhSRUFEX0NDIHRvIGFueSBzcGVjaWFsIEMgY29tcGlsZXIgdGhhdCBpcyBuZWVkZWQgZm9yCisjICAgbXVsdGktdGhyZWFkZWQgcHJvZ3JhbXMgKGRlZmF1bHRzIHRvIHRoZSB2YWx1ZSBvZiBDQyBvdGhlcndpc2UpLiAoVGhpcworIyAgIGlzIG5lY2Vzc2FyeSBvbiBBSVggdG8gdXNlIHRoZSBzcGVjaWFsIGNjX3IgY29tcGlsZXIgYWxpYXMuKQorIworIyAgIE5PVEU6IFlvdSBhcmUgYXNzdW1lZCB0byBub3Qgb25seSBjb21waWxlIHlvdXIgcHJvZ3JhbSB3aXRoIHRoZXNlIGZsYWdzLAorIyAgIGJ1dCBhbHNvIGxpbmsgaXQgd2l0aCB0aGVtIGFzIHdlbGwuIGUuZy4geW91IHNob3VsZCBsaW5rIHdpdGgKKyMgICAkUFRIUkVBRF9DQyAkQ0ZMQUdTICRQVEhSRUFEX0NGTEFHUyAkTERGTEFHUyAuLi4gJFBUSFJFQURfTElCUyAkTElCUworIworIyAgIElmIHlvdSBhcmUgb25seSBidWlsZGluZyB0aHJlYWRzIHByb2dyYW1zLCB5b3UgbWF5IHdpc2ggdG8gdXNlIHRoZXNlCisjICAgdmFyaWFibGVzIGluIHlvdXIgZGVmYXVsdCBMSUJTLCBDRkxBR1MsIGFuZCBDQzoKKyMKKyMgICAgIExJQlM9IiRQVEhSRUFEX0xJQlMgJExJQlMiCisjICAgICBDRkxBR1M9IiRDRkxBR1MgJFBUSFJFQURfQ0ZMQUdTIgorIyAgICAgQ0M9IiRQVEhSRUFEX0NDIgorIworIyAgIEluIGFkZGl0aW9uLCBpZiB0aGUgUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUgdGhyZWFkLWF0dHJpYnV0ZSBjb25zdGFudAorIyAgIGhhcyBhIG5vbnN0YW5kYXJkIG5hbWUsIGRlZmluZXMgUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUgdG8gdGhhdCBuYW1lCisjICAgKGUuZy4gUFRIUkVBRF9DUkVBVEVfVU5ERVRBQ0hFRCBvbiBBSVgpLgorIworIyAgIEFsc28gSEFWRV9QVEhSRUFEX1BSSU9fSU5IRVJJVCBpcyBkZWZpbmVkIGlmIHB0aHJlYWQgaXMgZm91bmQgYW5kIHRoZQorIyAgIFBUSFJFQURfUFJJT19JTkhFUklUIHN5bWJvbCBpcyBkZWZpbmVkIHdoZW4gY29tcGlsaW5nIHdpdGgKKyMgICBQVEhSRUFEX0NGTEFHUy4KKyMKKyMgICBBQ1RJT04tSUYtRk9VTkQgaXMgYSBsaXN0IG9mIHNoZWxsIGNvbW1hbmRzIHRvIHJ1biBpZiBhIHRocmVhZHMgbGlicmFyeQorIyAgIGlzIGZvdW5kLCBhbmQgQUNUSU9OLUlGLU5PVC1GT1VORCBpcyBhIGxpc3Qgb2YgY29tbWFuZHMgdG8gcnVuIGl0IGlmIGl0CisjICAgaXMgbm90IGZvdW5kLiBJZiBBQ1RJT04tSUYtRk9VTkQgaXMgbm90IHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgYWN0aW9uCisjICAgd2lsbCBkZWZpbmUgSEFWRV9QVEhSRUFELgorIworIyAgIFBsZWFzZSBsZXQgdGhlIGF1dGhvcnMga25vdyBpZiB0aGlzIG1hY3JvIGZhaWxzIG9uIGFueSBwbGF0Zm9ybSwgb3IgaWYKKyMgICB5b3UgaGF2ZSBhbnkgb3RoZXIgc3VnZ2VzdGlvbnMgb3IgY29tbWVudHMuIFRoaXMgbWFjcm8gd2FzIGJhc2VkIG9uIHdvcmsKKyMgICBieSBTR0ogb24gYXV0b2NvbmYgc2NyaXB0cyBmb3IgRkZUVyAoaHR0cDovL3d3dy5mZnR3Lm9yZy8pICh3aXRoIGhlbHAKKyMgICBmcm9tIE0uIEZyaWdvKSwgYXMgd2VsbCBhcyBhY19wdGhyZWFkIGFuZCBoYl9wdGhyZWFkIG1hY3JvcyBwb3N0ZWQgYnkKKyMgICBBbGVqYW5kcm8gRm9yZXJvIEN1ZXJ2byB0byB0aGUgYXV0b2NvbmYgbWFjcm8gcmVwb3NpdG9yeS4gV2UgYXJlIGFsc28KKyMgICBncmF0ZWZ1bCBmb3IgdGhlIGhlbHBmdWwgZmVlZGJhY2sgb2YgbnVtZXJvdXMgdXNlcnMuCisjCisjICAgVXBkYXRlZCBmb3IgQXV0b2NvbmYgMi42OCBieSBEYW5pZWwgUmljaGFyZCBHLgorIworIyBMSUNFTlNFCisjCisjICAgQ29weXJpZ2h0IChjKSAyMDA4IFN0ZXZlbiBHLiBKb2huc29uIDxzdGV2ZW5qQGFsdW0ubWl0LmVkdT4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMTEgRGFuaWVsIFJpY2hhcmQgRy4gPHNrdW5rQGlTS1VOSy5PUkc+CisjCisjICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyMgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisjICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbAorIyAgIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgICB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorIworIyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSByZXNwZWN0aXZlIEF1dG9jb25mIE1hY3JvJ3MgY29weXJpZ2h0IG93bmVyCisjICAgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IHRoZSBjb25maWd1cmUKKyMgICBzY3JpcHRzIHRoYXQgYXJlIHRoZSBvdXRwdXQgb2YgQXV0b2NvbmYgd2hlbiBwcm9jZXNzaW5nIHRoZSBNYWNyby4gWW91CisjICAgbmVlZCBub3QgZm9sbG93IHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugd2hlbiB1c2luZworIyAgIG9yIGRpc3RyaWJ1dGluZyBzdWNoIHNjcmlwdHMsIGV2ZW4gdGhvdWdoIHBvcnRpb25zIG9mIHRoZSB0ZXh0IG9mIHRoZQorIyAgIE1hY3JvIGFwcGVhciBpbiB0aGVtLiBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgZG9lcyBnb3Zlcm4KKyMgICBhbGwgb3RoZXIgdXNlIG9mIHRoZSBtYXRlcmlhbCB0aGF0IGNvbnN0aXR1dGVzIHRoZSBBdXRvY29uZiBNYWNyby4KKyMKKyMgICBUaGlzIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHUEwgYXBwbGllcyB0byB2ZXJzaW9ucyBvZiB0aGUgQXV0b2NvbmYKKyMgICBNYWNybyByZWxlYXNlZCBieSB0aGUgQXV0b2NvbmYgQXJjaGl2ZS4gV2hlbiB5b3UgbWFrZSBhbmQgZGlzdHJpYnV0ZSBhCisjICAgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgQXV0b2NvbmYgTWFjcm8sIHlvdSBtYXkgZXh0ZW5kIHRoaXMgc3BlY2lhbAorIyAgIGV4Y2VwdGlvbiB0byB0aGUgR1BMIHRvIGFwcGx5IHRvIHlvdXIgbW9kaWZpZWQgdmVyc2lvbiBhcyB3ZWxsLgorCisjc2VyaWFsIDIxCisKK0FVX0FMSUFTKFtBQ1hfUFRIUkVBRF0sIFtBWF9QVEhSRUFEXSkKK0FDX0RFRlVOKFtBWF9QVEhSRUFEXSwgWworQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKQorQUNfTEFOR19QVVNIKFtDXSkKK2F4X3B0aHJlYWRfb2s9bm8KKworIyBXZSB1c2VkIHRvIGNoZWNrIGZvciBwdGhyZWFkLmggZmlyc3QsIGJ1dCB0aGlzIGZhaWxzIGlmIHB0aHJlYWQuaAorIyByZXF1aXJlcyBzcGVjaWFsIGNvbXBpbGVyIGZsYWdzIChlLmcuIG9uIFRydWU2NCBvciBTZXF1ZW50KS4KKyMgSXQgZ2V0cyBjaGVja2VkIGZvciBpbiB0aGUgbGluayB0ZXN0IGFueXdheS4KKworIyBGaXJzdCBvZiBhbGwsIGNoZWNrIGlmIHRoZSB1c2VyIGhhcyBzZXQgYW55IG9mIHRoZSBQVEhSRUFEX0xJQlMsCisjIGV0Y2V0ZXJhIGVudmlyb25tZW50IHZhcmlhYmxlcywgYW5kIGlmIHRocmVhZHMgbGlua2luZyB3b3JrcyB1c2luZworIyB0aGVtOgoraWYgdGVzdCB4IiRQVEhSRUFEX0xJQlMkUFRIUkVBRF9DRkxBR1MiICE9IHg7IHRoZW4KKyAgICAgICAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisgICAgICAgIENGTEFHUz0iJENGTEFHUyAkUFRIUkVBRF9DRkxBR1MiCisgICAgICAgIHNhdmVfTElCUz0iJExJQlMiCisgICAgICAgIExJQlM9IiRQVEhSRUFEX0xJQlMgJExJQlMiCisgICAgICAgIEFDX01TR19DSEVDS0lORyhbZm9yIHB0aHJlYWRfam9pbiBpbiBMSUJTPSRQVEhSRUFEX0xJQlMgd2l0aCBDRkxBR1M9JFBUSFJFQURfQ0ZMQUdTXSkKKyAgICAgICAgQUNfVFJZX0xJTktfRlVOQyhbcHRocmVhZF9qb2luXSwgW2F4X3B0aHJlYWRfb2s9eWVzXSkKKyAgICAgICAgQUNfTVNHX1JFU1VMVChbJGF4X3B0aHJlYWRfb2tdKQorICAgICAgICBpZiB0ZXN0IHgiJGF4X3B0aHJlYWRfb2siID0geG5vOyB0aGVuCisgICAgICAgICAgICAgICAgUFRIUkVBRF9MSUJTPSIiCisgICAgICAgICAgICAgICAgUFRIUkVBRF9DRkxBR1M9IiIKKyAgICAgICAgZmkKKyAgICAgICAgTElCUz0iJHNhdmVfTElCUyIKKyAgICAgICAgQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCitmaQorCisjIFdlIG11c3QgY2hlY2sgZm9yIHRoZSB0aHJlYWRzIGxpYnJhcnkgdW5kZXIgYSBudW1iZXIgb2YgZGlmZmVyZW50CisjIG5hbWVzOyB0aGUgb3JkZXJpbmcgaXMgdmVyeSBpbXBvcnRhbnQgYmVjYXVzZSBzb21lIHN5c3RlbXMKKyMgKGUuZy4gREVDKSBoYXZlIGJvdGggLWxwdGhyZWFkIGFuZCAtbHB0aHJlYWRzLCB3aGVyZSBvbmUgb2YgdGhlCisjIGxpYnJhcmllcyBpcyBicm9rZW4gKG5vbi1QT1NJWCkuCisKKyMgQ3JlYXRlIGEgbGlzdCBvZiB0aHJlYWQgZmxhZ3MgdG8gdHJ5LiAgSXRlbXMgc3RhcnRpbmcgd2l0aCBhICItIiBhcmUKKyMgQyBjb21waWxlciBmbGFncywgYW5kIG90aGVyIGl0ZW1zIGFyZSBsaWJyYXJ5IG5hbWVzLCBleGNlcHQgZm9yICJub25lIgorIyB3aGljaCBpbmRpY2F0ZXMgdGhhdCB3ZSB0cnkgd2l0aG91dCBhbnkgZmxhZ3MgYXQgYWxsLCBhbmQgInB0aHJlYWQtY29uZmlnIgorIyB3aGljaCBpcyBhIHByb2dyYW0gcmV0dXJuaW5nIHRoZSBmbGFncyBmb3IgdGhlIFB0aCBlbXVsYXRpb24gbGlicmFyeS4KKworYXhfcHRocmVhZF9mbGFncz0icHRocmVhZHMgbm9uZSAtS3RocmVhZCAta3RocmVhZCBsdGhyZWFkIC1wdGhyZWFkIC1wdGhyZWFkcyAtbXRocmVhZHMgcHRocmVhZCAtLXRocmVhZC1zYWZlIC1tdCBwdGhyZWFkLWNvbmZpZyIKKworIyBUaGUgb3JkZXJpbmcgKmlzKiAoc29tZXRpbWVzKSBpbXBvcnRhbnQuICBTb21lIG5vdGVzIG9uIHRoZQorIyBpbmRpdmlkdWFsIGl0ZW1zIGZvbGxvdzoKKworIyBwdGhyZWFkczogQUlYIChtdXN0IGNoZWNrIHRoaXMgYmVmb3JlIC1scHRocmVhZCkKKyMgbm9uZTogaW4gY2FzZSB0aHJlYWRzIGFyZSBpbiBsaWJjOyBzaG91bGQgYmUgdHJpZWQgYmVmb3JlIC1LdGhyZWFkIGFuZAorIyAgICAgICBvdGhlciBjb21waWxlciBmbGFncyB0byBwcmV2ZW50IGNvbnRpbnVhbCBjb21waWxlciB3YXJuaW5ncworIyAtS3RocmVhZDogU2VxdWVudCAodGhyZWFkcyBpbiBsaWJjLCBidXQgLUt0aHJlYWQgbmVlZGVkIGZvciBwdGhyZWFkLmgpCisjIC1rdGhyZWFkOiBGcmVlQlNEIGtlcm5lbCB0aHJlYWRzIChwcmVmZXJyZWQgdG8gLXB0aHJlYWQgc2luY2UgU01QLWFibGUpCisjIGx0aHJlYWQ6IExpbnV4VGhyZWFkcyBwb3J0IG9uIEZyZWVCU0QgKGFsc28gcHJlZmVycmVkIHRvIC1wdGhyZWFkKQorIyAtcHRocmVhZDogTGludXgvZ2NjIChrZXJuZWwgdGhyZWFkcyksIEJTRC9nY2MgKHVzZXJsYW5kIHRocmVhZHMpCisjIC1wdGhyZWFkczogU29sYXJpcy9nY2MKKyMgLW10aHJlYWRzOiBNaW5ndzMyL2djYywgTHlueC9nY2MKKyMgLW10OiBTdW4gV29ya3Nob3AgQyAobWF5IG9ubHkgbGluayBTdW5PUyB0aHJlYWRzIFstbHRocmVhZF0sIGJ1dCBpdAorIyAgICAgIGRvZXNuJ3QgaHVydCB0byBjaGVjayBzaW5jZSB0aGlzIHNvbWV0aW1lcyBkZWZpbmVzIHB0aHJlYWRzIHRvbzsKKyMgICAgICBhbHNvIGRlZmluZXMgLURfUkVFTlRSQU5UKQorIyAgICAgIC4uLiAtbXQgaXMgYWxzbyB0aGUgcHRocmVhZHMgZmxhZyBmb3IgSFAvYUNDCisjIHB0aHJlYWQ6IExpbnV4LCBldGNldGVyYQorIyAtLXRocmVhZC1zYWZlOiBLQUkgQysrCisjIHB0aHJlYWQtY29uZmlnOiB1c2UgcHRocmVhZC1jb25maWcgcHJvZ3JhbSAoZm9yIEdOVSBQdGggbGlicmFyeSkKKworY2FzZSAke2hvc3Rfb3N9IGluCisgICAgICAgIHNvbGFyaXMqKQorCisgICAgICAgICMgT24gU29sYXJpcyAoYXQgbGVhc3QsIGZvciBzb21lIHZlcnNpb25zKSwgbGliYyBjb250YWlucyBzdHViYmVkCisgICAgICAgICMgKG5vbi1mdW5jdGlvbmFsKSB2ZXJzaW9ucyBvZiB0aGUgcHRocmVhZHMgcm91dGluZXMsIHNvIGxpbmstYmFzZWQKKyAgICAgICAgIyB0ZXN0cyB3aWxsIGVycm9uZW91c2x5IHN1Y2NlZWQuICAoV2UgbmVlZCB0byBsaW5rIHdpdGggLXB0aHJlYWRzLy1tdC8KKyAgICAgICAgIyAtbHB0aHJlYWQuKSAgKFRoZSBzdHVicyBhcmUgbWlzc2luZyBwdGhyZWFkX2NsZWFudXBfcHVzaCwgb3IgcmF0aGVyCisgICAgICAgICMgYSBmdW5jdGlvbiBjYWxsZWQgYnkgdGhpcyBtYWNybywgc28gd2UgY291bGQgY2hlY2sgZm9yIHRoYXQsIGJ1dAorICAgICAgICAjIHdobyBrbm93cyB3aGV0aGVyIHRoZXknbGwgc3R1YiB0aGF0IHRvbyBpbiBhIGZ1dHVyZSBsaWJjLikgIFNvLAorICAgICAgICAjIHdlJ2xsIGp1c3QgbG9vayBmb3IgLXB0aHJlYWRzIGFuZCAtbHB0aHJlYWQgZmlyc3Q6CisKKyAgICAgICAgYXhfcHRocmVhZF9mbGFncz0iLXB0aHJlYWRzIHB0aHJlYWQgLW10IC1wdGhyZWFkICRheF9wdGhyZWFkX2ZsYWdzIgorICAgICAgICA7OworCisgICAgICAgIGRhcndpbiopCisgICAgICAgIGF4X3B0aHJlYWRfZmxhZ3M9Ii1wdGhyZWFkICRheF9wdGhyZWFkX2ZsYWdzIgorICAgICAgICA7OworZXNhYworCisjIENsYW5nIGRvZXNuJ3QgY29uc2lkZXIgdW5yZWNvZ25pemVkIG9wdGlvbnMgYW4gZXJyb3IgdW5sZXNzIHdlIHNwZWNpZnkKKyMgLVdlcnJvci4gV2UgdGhyb3cgaW4gc29tZSBleHRyYSBDbGFuZy1zcGVjaWZpYyBvcHRpb25zIHRvIGVuc3VyZSB0aGF0CisjIHRoaXMgZG9lc24ndCBoYXBwZW4gZm9yIEdDQywgd2hpY2ggYWxzbyBhY2NlcHRzIC1XZXJyb3IuCisKK0FDX01TR19DSEVDS0lORyhbaWYgY29tcGlsZXIgbmVlZHMgLVdlcnJvciB0byByZWplY3QgdW5rbm93biBmbGFnc10pCitzYXZlX0NGTEFHUz0iJENGTEFHUyIKK2F4X3B0aHJlYWRfZXh0cmFfZmxhZ3M9Ii1XZXJyb3IiCitDRkxBR1M9IiRDRkxBR1MgJGF4X3B0aHJlYWRfZXh0cmFfZmxhZ3MgLVd1bmtub3duLXdhcm5pbmctb3B0aW9uIC1Xc2l6ZW9mLWFycmF5LWFyZ3VtZW50IgorQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbaW50IGZvbyh2b2lkKTtdLFtmb28oKV0pXSwKKyAgICAgICAgICAgICAgICAgIFtBQ19NU0dfUkVTVUxUKFt5ZXNdKV0sCisgICAgICAgICAgICAgICAgICBbYXhfcHRocmVhZF9leHRyYV9mbGFncz0KKyAgICAgICAgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKFtub10pXSkKK0NGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorCitpZiB0ZXN0IHgiJGF4X3B0aHJlYWRfb2siID0geG5vOyB0aGVuCitmb3IgZmxhZyBpbiAkYXhfcHRocmVhZF9mbGFnczsgZG8KKworICAgICAgICBjYXNlICRmbGFnIGluCisgICAgICAgICAgICAgICAgbm9uZSkKKyAgICAgICAgICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgcHRocmVhZHMgd29yayB3aXRob3V0IGFueSBmbGFnc10pCisgICAgICAgICAgICAgICAgOzsKKworICAgICAgICAgICAgICAgIC0qKQorICAgICAgICAgICAgICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciBwdGhyZWFkcyB3b3JrIHdpdGggJGZsYWddKQorICAgICAgICAgICAgICAgIFBUSFJFQURfQ0ZMQUdTPSIkZmxhZyIKKyAgICAgICAgICAgICAgICA7OworCisgICAgICAgICAgICAgICAgcHRocmVhZC1jb25maWcpCisgICAgICAgICAgICAgICAgQUNfQ0hFQ0tfUFJPRyhbYXhfcHRocmVhZF9jb25maWddLCBbcHRocmVhZC1jb25maWddLCBbeWVzXSwgW25vXSkKKyAgICAgICAgICAgICAgICBpZiB0ZXN0IHgiJGF4X3B0aHJlYWRfY29uZmlnIiA9IHhubzsgdGhlbiBjb250aW51ZTsgZmkKKyAgICAgICAgICAgICAgICBQVEhSRUFEX0NGTEFHUz0iYHB0aHJlYWQtY29uZmlnIC0tY2ZsYWdzYCIKKyAgICAgICAgICAgICAgICBQVEhSRUFEX0xJQlM9ImBwdGhyZWFkLWNvbmZpZyAtLWxkZmxhZ3NgIGBwdGhyZWFkLWNvbmZpZyAtLWxpYnNgIgorICAgICAgICAgICAgICAgIDs7CisKKyAgICAgICAgICAgICAgICAqKQorICAgICAgICAgICAgICAgIEFDX01TR19DSEVDS0lORyhbZm9yIHRoZSBwdGhyZWFkcyBsaWJyYXJ5IC1sJGZsYWddKQorICAgICAgICAgICAgICAgIFBUSFJFQURfTElCUz0iLWwkZmxhZyIKKyAgICAgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisKKyAgICAgICAgc2F2ZV9MSUJTPSIkTElCUyIKKyAgICAgICAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisgICAgICAgIExJQlM9IiRQVEhSRUFEX0xJQlMgJExJQlMiCisgICAgICAgIENGTEFHUz0iJENGTEFHUyAkUFRIUkVBRF9DRkxBR1MgJGF4X3B0aHJlYWRfZXh0cmFfZmxhZ3MiCisKKyAgICAgICAgIyBDaGVjayBmb3IgdmFyaW91cyBmdW5jdGlvbnMuICBXZSBtdXN0IGluY2x1ZGUgcHRocmVhZC5oLAorICAgICAgICAjIHNpbmNlIHNvbWUgZnVuY3Rpb25zIG1heSBiZSBtYWNyb3MuICAoT24gdGhlIFNlcXVlbnQsIHdlCisgICAgICAgICMgbmVlZCBhIHNwZWNpYWwgZmxhZyAtS3RocmVhZCB0byBtYWtlIHRoaXMgaGVhZGVyIGNvbXBpbGUuKQorICAgICAgICAjIFdlIGNoZWNrIGZvciBwdGhyZWFkX2pvaW4gYmVjYXVzZSBpdCBpcyBpbiAtbHB0aHJlYWQgb24gSVJJWAorICAgICAgICAjIHdoaWxlIHB0aHJlYWRfY3JlYXRlIGlzIGluIGxpYmMuICBXZSBjaGVjayBmb3IgcHRocmVhZF9hdHRyX2luaXQKKyAgICAgICAgIyBkdWUgdG8gREVDIGNyYXppbmVzcyB3aXRoIC1scHRocmVhZHMuICBXZSBjaGVjayBmb3IKKyAgICAgICAgIyBwdGhyZWFkX2NsZWFudXBfcHVzaCBiZWNhdXNlIGl0IGlzIG9uZSBvZiB0aGUgZmV3IHB0aHJlYWQKKyAgICAgICAgIyBmdW5jdGlvbnMgb24gU29sYXJpcyB0aGF0IGRvZXNuJ3QgaGF2ZSBhIG5vbi1mdW5jdGlvbmFsIGxpYmMgc3R1Yi4KKyAgICAgICAgIyBXZSB0cnkgcHRocmVhZF9jcmVhdGUgb24gZ2VuZXJhbCBwcmluY2lwbGVzLgorICAgICAgICBBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFsjaW5jbHVkZSA8cHRocmVhZC5oPgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljIHZvaWQgcm91dGluZSh2b2lkICphKSB7IGEgPSAwOyB9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWMgdm9pZCAqc3RhcnRfcm91dGluZSh2b2lkICphKSB7IHJldHVybiBhOyB9XSwKKyAgICAgICAgICAgICAgICAgICAgICAgW3B0aHJlYWRfdCB0aDsgcHRocmVhZF9hdHRyX3QgYXR0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0aHJlYWRfY3JlYXRlKCZ0aCwgMCwgc3RhcnRfcm91dGluZSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX2pvaW4odGgsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9hdHRyX2luaXQoJmF0dHIpOworICAgICAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9jbGVhbnVwX3B1c2gocm91dGluZSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX2NsZWFudXBfcG9wKDApIC8qIDsgKi9dKV0sCisgICAgICAgICAgICAgICAgW2F4X3B0aHJlYWRfb2s9eWVzXSwKKyAgICAgICAgICAgICAgICBbXSkKKworICAgICAgICBMSUJTPSIkc2F2ZV9MSUJTIgorICAgICAgICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKworICAgICAgICBBQ19NU0dfUkVTVUxUKFskYXhfcHRocmVhZF9va10pCisgICAgICAgIGlmIHRlc3QgIngkYXhfcHRocmVhZF9vayIgPSB4eWVzOyB0aGVuCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGZpCisKKyAgICAgICAgUFRIUkVBRF9MSUJTPSIiCisgICAgICAgIFBUSFJFQURfQ0ZMQUdTPSIiCitkb25lCitmaQorCisjIFZhcmlvdXMgb3RoZXIgY2hlY2tzOgoraWYgdGVzdCAieCRheF9wdGhyZWFkX29rIiA9IHh5ZXM7IHRoZW4KKyAgICAgICAgc2F2ZV9MSUJTPSIkTElCUyIKKyAgICAgICAgTElCUz0iJFBUSFJFQURfTElCUyAkTElCUyIKKyAgICAgICAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisgICAgICAgIENGTEFHUz0iJENGTEFHUyAkUFRIUkVBRF9DRkxBR1MiCisKKyAgICAgICAgIyBEZXRlY3QgQUlYIGxvc3NhZ2U6IEpPSU5BQkxFIGF0dHJpYnV0ZSBpcyBjYWxsZWQgVU5ERVRBQ0hFRC4KKyAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3Igam9pbmFibGUgcHRocmVhZCBhdHRyaWJ1dGVdKQorICAgICAgICBhdHRyX25hbWU9dW5rbm93bgorICAgICAgICBmb3IgYXR0ciBpbiBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSBQVEhSRUFEX0NSRUFURV9VTkRFVEFDSEVEOyBkbworICAgICAgICAgICAgQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbI2luY2x1ZGUgPHB0aHJlYWQuaD5dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ludCBhdHRyID0gJGF0dHI7IHJldHVybiBhdHRyIC8qIDsgKi9dKV0sCisgICAgICAgICAgICAgICAgW2F0dHJfbmFtZT0kYXR0cjsgYnJlYWtdLAorICAgICAgICAgICAgICAgIFtdKQorICAgICAgICBkb25lCisgICAgICAgIEFDX01TR19SRVNVTFQoWyRhdHRyX25hbWVdKQorICAgICAgICBpZiB0ZXN0ICIkYXR0cl9uYW1lIiAhPSBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRTsgdGhlbgorICAgICAgICAgICAgQUNfREVGSU5FX1VOUVVPVEVEKFtQVEhSRUFEX0NSRUFURV9KT0lOQUJMRV0sIFskYXR0cl9uYW1lXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbRGVmaW5lIHRvIG5lY2Vzc2FyeSBzeW1ib2wgaWYgdGhpcyBjb25zdGFudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VzIGEgbm9uLXN0YW5kYXJkIG5hbWUgb24geW91ciBzeXN0ZW0uXSkKKyAgICAgICAgZmkKKworICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2lmIG1vcmUgc3BlY2lhbCBmbGFncyBhcmUgcmVxdWlyZWQgZm9yIHB0aHJlYWRzXSkKKyAgICAgICAgZmxhZz1ubworICAgICAgICBjYXNlICR7aG9zdF9vc30gaW4KKyAgICAgICAgICAgIGFpeCogfCBmcmVlYnNkKiB8IGRhcndpbiopIGZsYWc9Ii1EX1RIUkVBRF9TQUZFIjs7CisgICAgICAgICAgICBvc2YqIHwgaHB1eCopIGZsYWc9Ii1EX1JFRU5UUkFOVCI7OworICAgICAgICAgICAgc29sYXJpcyopCisgICAgICAgICAgICBpZiB0ZXN0ICIkR0NDIiA9ICJ5ZXMiOyB0aGVuCisgICAgICAgICAgICAgICAgZmxhZz0iLURfUkVFTlRSQU5UIgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICMgVE9ETzogV2hhdCBhYm91dCBDbGFuZyBvbiBTb2xhcmlzPworICAgICAgICAgICAgICAgIGZsYWc9Ii1tdCAtRF9SRUVOVFJBTlQiCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICBBQ19NU0dfUkVTVUxUKFskZmxhZ10pCisgICAgICAgIGlmIHRlc3QgIngkZmxhZyIgIT0geG5vOyB0aGVuCisgICAgICAgICAgICBQVEhSRUFEX0NGTEFHUz0iJGZsYWcgJFBUSFJFQURfQ0ZMQUdTIgorICAgICAgICBmaQorCisgICAgICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgUFRIUkVBRF9QUklPX0lOSEVSSVRdLAorICAgICAgICAgICAgW2F4X2N2X1BUSFJFQURfUFJJT19JTkhFUklUXSwgWworICAgICAgICAgICAgICAgIEFDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sjaW5jbHVkZSA8cHRocmVhZC5oPl1dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1tpbnQgaSA9IFBUSFJFQURfUFJJT19JTkhFUklUO11dKV0sCisgICAgICAgICAgICAgICAgICAgIFtheF9jdl9QVEhSRUFEX1BSSU9fSU5IRVJJVD15ZXNdLAorICAgICAgICAgICAgICAgICAgICBbYXhfY3ZfUFRIUkVBRF9QUklPX0lOSEVSSVQ9bm9dKQorICAgICAgICAgICAgXSkKKyAgICAgICAgQVNfSUYoW3Rlc3QgIngkYXhfY3ZfUFRIUkVBRF9QUklPX0lOSEVSSVQiID0gInh5ZXMiXSwKKyAgICAgICAgICAgIFtBQ19ERUZJTkUoW0hBVkVfUFRIUkVBRF9QUklPX0lOSEVSSVRdLCBbMV0sIFtIYXZlIFBUSFJFQURfUFJJT19JTkhFUklULl0pXSkKKworICAgICAgICBMSUJTPSIkc2F2ZV9MSUJTIgorICAgICAgICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKworICAgICAgICAjIE1vcmUgQUlYIGxvc3NhZ2U6IGNvbXBpbGUgd2l0aCAqX3IgdmFyaWFudAorICAgICAgICBpZiB0ZXN0ICJ4JEdDQyIgIT0geHllczsgdGhlbgorICAgICAgICAgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgICAgICAgICAgIGFpeCopCisgICAgICAgICAgICAgICAgQVNfQ0FTRShbIngvJENDIl0sCisgICAgICAgICAgICAgICAgICBbeCovYzg5fHgqL2M4OV8xMjh8eCovYzk5fHgqL2M5OV8xMjh8eCovY2N8eCovY2MxMjh8eCoveGxjfHgqL3hsY192Nnx4Ki94bGMxMjh8eCoveGxjMTI4X3Y2XSwKKyAgICAgICAgICAgICAgICAgIFsjaGFuZGxlIGFic29sdXRlIHBhdGggZGlmZmVyZW50bHkgZnJvbSBQQVRIIGJhc2VkIHByb2dyYW0gbG9va3VwCisgICAgICAgICAgICAgICAgICAgQVNfQ0FTRShbIngkQ0MiXSwKKyAgICAgICAgICAgICAgICAgICAgIFt4LypdLAorICAgICAgICAgICAgICAgICAgICAgW0FTX0lGKFtBU19FWEVDVVRBQkxFX1AoWyR7Q0N9X3JdKV0sW1BUSFJFQURfQ0M9IiR7Q0N9X3IiXSldLAorICAgICAgICAgICAgICAgICAgICAgW0FDX0NIRUNLX1BST0dTKFtQVEhSRUFEX0NDXSxbJHtDQ31fcl0sWyRDQ10pXSldKQorICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICBlc2FjCisgICAgICAgIGZpCitmaQorCit0ZXN0IC1uICIkUFRIUkVBRF9DQyIgfHwgUFRIUkVBRF9DQz0iJENDIgorCitBQ19TVUJTVChbUFRIUkVBRF9MSUJTXSkKK0FDX1NVQlNUKFtQVEhSRUFEX0NGTEFHU10pCitBQ19TVUJTVChbUFRIUkVBRF9DQ10pCisKKyMgRmluYWxseSwgZXhlY3V0ZSBBQ1RJT04tSUYtRk9VTkQvQUNUSU9OLUlGLU5PVC1GT1VORDoKK2lmIHRlc3QgeCIkYXhfcHRocmVhZF9vayIgPSB4eWVzOyB0aGVuCisgICAgICAgIGlmZWxzZShbJDFdLCxbQUNfREVGSU5FKFtIQVZFX1BUSFJFQURdLFsxXSxbRGVmaW5lIGlmIHlvdSBoYXZlIFBPU0lYIHRocmVhZHMgbGlicmFyaWVzIGFuZCBoZWFkZXIgZmlsZXMuXSldLFskMV0pCisgICAgICAgIDoKK2Vsc2UKKyAgICAgICAgYXhfcHRocmVhZF9vaz1ubworICAgICAgICAkMgorZmkKK0FDX0xBTkdfUE9QCitdKWRubCBBWF9QVEhSRUFECmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9tYWtlZmlsZS51bml4IGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvbWFrZWZpbGUudW5peApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzAwMzVkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvbWFrZWZpbGUudW5peApAQCAtMCwwICsxLDUwMiBAQAorIyBUaGlzIG1ha2VmaWxlIGlzIGEgc2ltcGxlciBhbHRlcm5hdGl2ZSB0byB0aGUgYXV0b2NvbmYtYmFzZWQgYnVpbGQKKyMgc3lzdGVtLCBmb3Igc2ltcGxlIGxvY2FsIGJ1aWxkaW5nIG9mIHRoZSBsaWJyYXJpZXMgYW5kIHRvb2xzLgorIyBJdCB3aWxsIG5vdCBpbnN0YWxsIHRoZSBsaWJyYXJpZXMgc3lzdGVtLXdpZGUsIGJ1dCBqdXN0IGNyZWF0ZSB0aGUgJ2N3ZWJwJworIyBhbmQgJ2R3ZWJwJyB0b29scyBpbiB0aGUgZXhhbXBsZXMvIGRpcmVjdG9yeSwgYWxvbmcgd2l0aCB0aGUgc3RhdGljCisjIGxpYnJhcmllcyAnc3JjL2xpYndlYnAuYScsICdzcmMvbGlid2VicGRlY29kZXIuYScsICdzcmMvbXV4L2xpYndlYnBtdXguYScsCisjICdzcmMvZGVtdXgvbGlid2VicGRlbXV4LmEnIGFuZCAnZXh0cmFzL2xpYndlYnBleHRyYXMuYScuCisjCisjIFRvIGJ1aWxkIHRoZSBsaWJyYXJ5IGFuZCBleGFtcGxlcywgdXNlOgorIyAgICBtYWtlIC1mIG1ha2VmaWxlLnVuaXgKKyMgZnJvbSB0aGlzIHRvcCBkaXJlY3RvcnkuCisKKyMjIyMgQ3VzdG9taXphYmxlIHBhcnQgIyMjIworCisjIFRoZXNlIGZsYWdzIGFzc3VtZSB5b3UgaGF2ZSBsaWJwbmcsIGxpYmpwZWcsIGxpYnRpZmYgYW5kIGxpYmdpZiBpbnN0YWxsZWQuIElmCisjIG5vdCwgZWl0aGVyIGZvbGxvdyB0aGUgaW5zdGFsbCBpbnN0cnVjdGlvbnMgYmVsb3cgb3IganVzdCBjb21tZW50IG91dCB0aGUgbmV4dAorIyBmb3VyIGxpbmVzLgorRVhUUkFfRkxBR1M9IC1EV0VCUF9IQVZFX1BORyAtRFdFQlBfSEFWRV9KUEVHIC1EV0VCUF9IQVZFX1RJRkYKK0RXRUJQX0xJQlM9IC1scG5nIC1segorQ1dFQlBfTElCUz0gJChEV0VCUF9MSUJTKSAtbGpwZWcgLWx0aWZmCitHSUZfTElCUyA9IC1sZ2lmCisKK2lmZXEgKCQoc3RyaXAgJChzaGVsbCB1bmFtZSkpLCBEYXJ3aW4pCisgICMgV29yayBhcm91bmQgYSBwcm9ibGVtIGxpbmtpbmcgdGFibGVzIG1hcmtlZCBhcyBjb21tb24gc3ltYm9scywKKyAgIyBjZi4sIHNyYy9lbmMveXV2LltoY10KKyAgIyBGYWlsdXJlIG9ic2VydmVkIHdpdGg6IGdjYyA0LjIuMSBhbmQgNC4wLjEuCisgIEVYVFJBX0ZMQUdTICs9IC1mbm8tY29tbW9uCisgIEVYVFJBX0ZMQUdTICs9IC1ESEFWRV9HTFVUX0dMVVRfSAorICBFWFRSQV9GTEFHUyArPSAtV25vLWRlcHJlY2F0ZWQtZGVjbGFyYXRpb25zCisgIEVYVFJBX0ZMQUdTICs9IC1JL29wdC9sb2NhbC9pbmNsdWRlCisgIEVYVFJBX0xJQlMgICs9IC1ML29wdC9sb2NhbC9saWIKKyAgR0xfTElCUyA9IC1mcmFtZXdvcmsgR0xVVCAtZnJhbWV3b3JrIE9wZW5HTAorZWxzZQorICBFWFRSQV9GTEFHUyArPSAtSS91c3IvbG9jYWwvaW5jbHVkZQorICBFWFRSQV9MSUJTICArPSAtTC91c3IvbG9jYWwvbGliCisgIEdMX0xJQlMgPSAtbGdsdXQgLWxHTAorZW5kaWYKKworIyBTREwgZmxhZ3M6IHVzZSBzZGwtY29uZmlnIGlmIGl0IGV4aXN0cworU0RMX0NPTkZJRyA9ICQoc2hlbGwgc2RsLWNvbmZpZyAtLXZlcnNpb24gMj4gL2Rldi9udWxsKQoraWZuZXEgKCQoU0RMX0NPTkZJRyksKQorICBTRExfTElCUyA9ICQoc2hlbGwgc2RsLWNvbmZpZyAtLWxpYnMpCisgIFNETF9GTEFHUyA9ICQoc2hlbGwgc2RsLWNvbmZpZyAtLWNmbGFncykKK2Vsc2UKKyAgIyB1c2UgYmVzdC1ndWVzcworICBTRExfTElCUyA9IC1sU0RMCisgIFNETF9GTEFHUyA9CitlbmRpZgorCisjIFRvIGluc3RhbGwgbGlicmFyaWVzIG9uIE1hYyBPUyBYOgorIyAxLiBJbnN0YWxsIE1hY1BvcnRzIChodHRwOi8vd3d3Lm1hY3BvcnRzLm9yZy9pbnN0YWxsLnBocCkKKyMgMi4gUnVuICJzdWRvIHBvcnQgaW5zdGFsbCBqcGVnIgorIyAzLiBSdW4gInN1ZG8gcG9ydCBpbnN0YWxsIGxpYnBuZyIKKyMgNC4gUnVuICJzdWRvIHBvcnQgaW5zdGFsbCB0aWZmIgorIyA1LiBSdW4gInN1ZG8gcG9ydCBpbnN0YWxsIGdpZmxpYiIKKworIyBUbyBpbnN0YWxsIGxpYnJhcmllcyBvbiBMaW51eDoKKyMgMS4gUnVuICJzdWRvIGFwdC1nZXQgaW5zdGFsbCBsaWJqcGVnNjItZGV2IgorIyAyLiBSdW4gInN1ZG8gYXB0LWdldCBpbnN0YWxsIGxpYnBuZzEyLWRldiIKKyMgMy4gUnVuICJzdWRvIGFwdC1nZXQgaW5zdGFsbCBsaWJ0aWZmNC1kZXYiCisjIDQuIFJ1biAic3VkbyBhcHQtZ2V0IGluc3RhbGwgbGliZ2lmLWRldiIKKworIyBVbmNvbW1lbnQgZm9yIGJ1aWxkIGZvciAzMmJpdCBwbGF0Zm9ybQorIyBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGp1c3QgdXNlIHRoZSBjb21tYW5kCisjICdtYWtlIC1mIG1ha2VmaWxlLnVuaXggRVhUUkFfRkxBR1M9LW0zMicgdG8gdGhhdCBlZmZlY3QuCisjIEVYVFJBX0ZMQUdTICs9IC1tMzIKKworIyBFeHRyYSBmbGFncyB0byBlbmFibGUgYnl0ZSBzd2FwIGZvciAxNiBiaXQgY29sb3JzcGFjZXMuCisjIEVYVFJBX0ZMQUdTICs9IC1EV0VCUF9TV0FQXzE2QklUX0NTUD0xCisKKyMgRXh0cmEgZmxhZ3MgdG8gZW5hYmxlIG11bHRpLXRocmVhZGluZworRVhUUkFfRkxBR1MgKz0gLURXRUJQX1VTRV9USFJFQUQKK0VYVFJBX0xJQlMgKz0gLWxwdGhyZWFkCisKKyMgQ29udHJvbCBzeW1ib2wgdmlzaWJpbGl0eS4gQ29tbWVudCBvdXQgaWYgeW91ciBjb21waWxlciBkb2Vzbid0IHN1cHBvcnQgaXQuCitFWFRSQV9GTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuCisKKyMgRXh0cmEgZmxhZ3MgdG8gZW11bGF0ZSBDODkgc3RyaWN0bmVzcyB3aXRoIHRoZSBmdWxsIEFOU0kKK0VYVFJBX0ZMQUdTICs9IC1XZXh0cmEgLVdvbGQtc3R5bGUtZGVmaW5pdGlvbgorRVhUUkFfRkxBR1MgKz0gLVdtaXNzaW5nLXByb3RvdHlwZXMKK0VYVFJBX0ZMQUdTICs9IC1XbWlzc2luZy1kZWNsYXJhdGlvbnMKK0VYVFJBX0ZMQUdTICs9IC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50CitFWFRSQV9GTEFHUyArPSAtV3NoYWRvdworRVhUUkFfRkxBR1MgKz0gLVdmb3JtYXQtc2VjdXJpdHkgLVdmb3JtYXQtbm9ubGl0ZXJhbAorIyBFWFRSQV9GTEFHUyArPSAtV3ZsYQorCisjIFNTRTQuMS1zcGVjaWZpYyBmbGFnczoKK2lmZXEgKCQoSEFWRV9TU0U0MSksIDEpCitFWFRSQV9GTEFHUyArPSAtRFdFQlBfSEFWRV9TU0U0MQorc3JjL2RzcC8lX3NzZTQxLm86IEVYVFJBX0ZMQUdTICs9IC1tc3NlNC4xCitlbmRpZgorCisjIEFWWDItc3BlY2lmaWMgZmxhZ3M6CitpZmVxICgkKEhBVkVfQVZYMiksIDEpCitFWFRSQV9GTEFHUyArPSAtRFdFQlBfSEFWRV9BVlgyCitzcmMvZHNwLyVfYXZ4Mi5vOiBFWFRSQV9GTEFHUyArPSAtbWF2eDIKK2VuZGlmCisKKyMgTkVPTi1zcGVjaWZpYyBmbGFnczoKKyMgRVhUUkFfRkxBR1MgKz0gLW1hcmNoPWFybXY3LWEgLW1mbG9hdC1hYmk9aGFyZCAtbWZwdT1uZW9uIC1tdHVuZT1jb3J0ZXgtYTgKKyMgLT4gc2VlbXMgdG8gbWFrZSB0aGUgb3ZlcmFsbCBsaWIgc2xvd2VyOiAtZm5vLXNwbGl0LXdpZGUtdHlwZXMKKworIyBNSVBTIChNU0EpIDMyLWJpdCBidWlsZCBzcGVjaWZpYyBmbGFncyBmb3IgbWlwczMycjUgKHA1NjAwKToKKyMgRVhUUkFfRkxBR1MgKz0gLW1pcHMzMnI1IC1tYWJpPTMyIC1tdHVuZT1wNTYwMCAtbW1zYSAtbWZwNjQKKyMgRVhUUkFfRkxBR1MgKz0gLW1zY2hlZC13ZWlnaHQgLW1sb2FkLXN0b3JlLXBhaXJzCisKKyMgTUlQUyAoTVNBKSA2NC1iaXQgYnVpbGQgc3BlY2lmaWMgZmxhZ3MgZm9yIG1pcHM2NHI2IChpNjQwMCk6CisjIEVYVFJBX0ZMQUdTICs9IC1taXBzNjRyNiAtbWFiaT02NCAtbXR1bmU9aTY0MDAgLW1tc2EgLW1mcDY0CisjIEVYVFJBX0ZMQUdTICs9IC1tc2NoZWQtd2VpZ2h0IC1tbG9hZC1zdG9yZS1wYWlycworCisjIyMjIE5vdGhpbmcgc2hvdWxkIG5vcm1hbGx5IGJlIGNoYW5nZWQgYmVsb3cgdGhpcyBsaW5lICMjIyMKKworQVIgPSBhcgorQVJGTEFHUyA9IHIKK0NQUEZMQUdTID0gLUkuIC1Jc3JjLyAtV2FsbAoraWZlcSAoJChERUJVRyksIDEpCisgIENGTEFHUyA9IC1nCitlbHNlCisgIENGTEFHUyA9IC1PMyAtRE5ERUJVRworZW5kaWYKK0NGTEFHUyArPSAkKEVYVFJBX0ZMQUdTKQorQ0MgPSBnY2MKK0lOU1RBTEwgPSBpbnN0YWxsCitHUk9GRiA9IC91c3IvYmluL2dyb2ZmCitDT0wgPSAvdXNyL2Jpbi9jb2wKK0xERkxBR1MgPSAkKEVYVFJBX0xJQlMpICQoRVhUUkFfRkxBR1MpIC1sbQorCitBTklNX1VUSUxfT0JKUyA9IFwKKyAgICBleGFtcGxlcy9hbmltX3V0aWwubyBcCisKK0RFQ19PQkpTID0gXAorICAgIHNyYy9kZWMvYWxwaGFfZGVjLm8gXAorICAgIHNyYy9kZWMvYnVmZmVyX2RlYy5vIFwKKyAgICBzcmMvZGVjL2ZyYW1lX2RlYy5vIFwKKyAgICBzcmMvZGVjL2lkZWNfZGVjLm8gXAorICAgIHNyYy9kZWMvaW9fZGVjLm8gXAorICAgIHNyYy9kZWMvcXVhbnRfZGVjLm8gXAorICAgIHNyYy9kZWMvdHJlZV9kZWMubyBcCisgICAgc3JjL2RlYy92cDhfZGVjLm8gXAorICAgIHNyYy9kZWMvdnA4bF9kZWMubyBcCisgICAgc3JjL2RlYy93ZWJwX2RlYy5vIFwKKworREVNVVhfT0JKUyA9IFwKKyAgICBzcmMvZGVtdXgvYW5pbV9kZWNvZGUubyBcCisgICAgc3JjL2RlbXV4L2RlbXV4Lm8gXAorCitEU1BfREVDX09CSlMgPSBcCisgICAgc3JjL2RzcC9hbHBoYV9wcm9jZXNzaW5nLm8gXAorICAgIHNyYy9kc3AvYWxwaGFfcHJvY2Vzc2luZ19taXBzX2RzcF9yMi5vIFwKKyAgICBzcmMvZHNwL2FscGhhX3Byb2Nlc3NpbmdfbmVvbi5vIFwKKyAgICBzcmMvZHNwL2FscGhhX3Byb2Nlc3Npbmdfc3NlMi5vIFwKKyAgICBzcmMvZHNwL2FscGhhX3Byb2Nlc3Npbmdfc3NlNDEubyBcCisgICAgc3JjL2RzcC9jcHUubyBcCisgICAgc3JjL2RzcC9kZWMubyBcCisgICAgc3JjL2RzcC9kZWNfY2xpcF90YWJsZXMubyBcCisgICAgc3JjL2RzcC9kZWNfbWlwczMyLm8gXAorICAgIHNyYy9kc3AvZGVjX21pcHNfZHNwX3IyLm8gXAorICAgIHNyYy9kc3AvZGVjX21zYS5vIFwKKyAgICBzcmMvZHNwL2RlY19uZW9uLm8gXAorICAgIHNyYy9kc3AvZGVjX3NzZTIubyBcCisgICAgc3JjL2RzcC9kZWNfc3NlNDEubyBcCisgICAgc3JjL2RzcC9maWx0ZXJzLm8gXAorICAgIHNyYy9kc3AvZmlsdGVyc19taXBzX2RzcF9yMi5vIFwKKyAgICBzcmMvZHNwL2ZpbHRlcnNfbXNhLm8gXAorICAgIHNyYy9kc3AvZmlsdGVyc19uZW9uLm8gXAorICAgIHNyYy9kc3AvZmlsdGVyc19zc2UyLm8gXAorICAgIHNyYy9kc3AvbG9zc2xlc3MubyBcCisgICAgc3JjL2RzcC9sb3NzbGVzc19taXBzX2RzcF9yMi5vIFwKKyAgICBzcmMvZHNwL2xvc3NsZXNzX21zYS5vIFwKKyAgICBzcmMvZHNwL2xvc3NsZXNzX25lb24ubyBcCisgICAgc3JjL2RzcC9sb3NzbGVzc19zc2UyLm8gXAorICAgIHNyYy9kc3AvcmVzY2FsZXIubyBcCisgICAgc3JjL2RzcC9yZXNjYWxlcl9taXBzMzIubyBcCisgICAgc3JjL2RzcC9yZXNjYWxlcl9taXBzX2RzcF9yMi5vIFwKKyAgICBzcmMvZHNwL3Jlc2NhbGVyX21zYS5vIFwKKyAgICBzcmMvZHNwL3Jlc2NhbGVyX25lb24ubyBcCisgICAgc3JjL2RzcC9yZXNjYWxlcl9zc2UyLm8gXAorICAgIHNyYy9kc3AvdXBzYW1wbGluZy5vIFwKKyAgICBzcmMvZHNwL3Vwc2FtcGxpbmdfbWlwc19kc3BfcjIubyBcCisgICAgc3JjL2RzcC91cHNhbXBsaW5nX21zYS5vIFwKKyAgICBzcmMvZHNwL3Vwc2FtcGxpbmdfbmVvbi5vIFwKKyAgICBzcmMvZHNwL3Vwc2FtcGxpbmdfc3NlMi5vIFwKKyAgICBzcmMvZHNwL3Vwc2FtcGxpbmdfc3NlNDEubyBcCisgICAgc3JjL2RzcC95dXYubyBcCisgICAgc3JjL2RzcC95dXZfbWlwczMyLm8gXAorICAgIHNyYy9kc3AveXV2X21pcHNfZHNwX3IyLm8gXAorICAgIHNyYy9kc3AveXV2X25lb24ubyBcCisgICAgc3JjL2RzcC95dXZfc3NlMi5vIFwKKyAgICBzcmMvZHNwL3l1dl9zc2U0MS5vIFwKKworRFNQX0VOQ19PQkpTID0gXAorICAgIHNyYy9kc3AvY29zdC5vIFwKKyAgICBzcmMvZHNwL2Nvc3RfbWlwczMyLm8gXAorICAgIHNyYy9kc3AvY29zdF9taXBzX2RzcF9yMi5vIFwKKyAgICBzcmMvZHNwL2Nvc3Rfc3NlMi5vIFwKKyAgICBzcmMvZHNwL2VuYy5vIFwKKyAgICBzcmMvZHNwL2VuY19hdngyLm8gXAorICAgIHNyYy9kc3AvZW5jX21pcHMzMi5vIFwKKyAgICBzcmMvZHNwL2VuY19taXBzX2RzcF9yMi5vIFwKKyAgICBzcmMvZHNwL2VuY19tc2EubyBcCisgICAgc3JjL2RzcC9lbmNfbmVvbi5vIFwKKyAgICBzcmMvZHNwL2VuY19zc2UyLm8gXAorICAgIHNyYy9kc3AvZW5jX3NzZTQxLm8gXAorICAgIHNyYy9kc3AvbG9zc2xlc3NfZW5jLm8gXAorICAgIHNyYy9kc3AvbG9zc2xlc3NfZW5jX21pcHMzMi5vIFwKKyAgICBzcmMvZHNwL2xvc3NsZXNzX2VuY19taXBzX2RzcF9yMi5vIFwKKyAgICBzcmMvZHNwL2xvc3NsZXNzX2VuY19tc2EubyBcCisgICAgc3JjL2RzcC9sb3NzbGVzc19lbmNfbmVvbi5vIFwKKyAgICBzcmMvZHNwL2xvc3NsZXNzX2VuY19zc2UyLm8gXAorICAgIHNyYy9kc3AvbG9zc2xlc3NfZW5jX3NzZTQxLm8gXAorICAgIHNyYy9kc3Avc3NpbS5vIFwKKyAgICBzcmMvZHNwL3NzaW1fc3NlMi5vIFwKKworRU5DX09CSlMgPSBcCisgICAgc3JjL2VuYy9hbHBoYV9lbmMubyBcCisgICAgc3JjL2VuYy9hbmFseXNpc19lbmMubyBcCisgICAgc3JjL2VuYy9iYWNrd2FyZF9yZWZlcmVuY2VzX2Nvc3RfZW5jLm8gXAorICAgIHNyYy9lbmMvYmFja3dhcmRfcmVmZXJlbmNlc19lbmMubyBcCisgICAgc3JjL2VuYy9jb25maWdfZW5jLm8gXAorICAgIHNyYy9lbmMvY29zdF9lbmMubyBcCisgICAgc3JjL2VuYy9maWx0ZXJfZW5jLm8gXAorICAgIHNyYy9lbmMvZnJhbWVfZW5jLm8gXAorICAgIHNyYy9lbmMvaGlzdG9ncmFtX2VuYy5vIFwKKyAgICBzcmMvZW5jL2l0ZXJhdG9yX2VuYy5vIFwKKyAgICBzcmMvZW5jL25lYXJfbG9zc2xlc3NfZW5jLm8gXAorICAgIHNyYy9lbmMvcGljdHVyZV9lbmMubyBcCisgICAgc3JjL2VuYy9waWN0dXJlX2NzcF9lbmMubyBcCisgICAgc3JjL2VuYy9waWN0dXJlX3BzbnJfZW5jLm8gXAorICAgIHNyYy9lbmMvcGljdHVyZV9yZXNjYWxlX2VuYy5vIFwKKyAgICBzcmMvZW5jL3BpY3R1cmVfdG9vbHNfZW5jLm8gXAorICAgIHNyYy9lbmMvcHJlZGljdG9yX2VuYy5vIFwKKyAgICBzcmMvZW5jL3F1YW50X2VuYy5vIFwKKyAgICBzcmMvZW5jL3N5bnRheF9lbmMubyBcCisgICAgc3JjL2VuYy90b2tlbl9lbmMubyBcCisgICAgc3JjL2VuYy90cmVlX2VuYy5vIFwKKyAgICBzcmMvZW5jL3ZwOGxfZW5jLm8gXAorICAgIHNyYy9lbmMvd2VicF9lbmMubyBcCisKK0VYX0ZPUk1BVF9ERUNfT0JKUyA9IFwKKyAgICBpbWFnZWlvL2ltYWdlX2RlYy5vIFwKKyAgICBpbWFnZWlvL2pwZWdkZWMubyBcCisgICAgaW1hZ2Vpby9tZXRhZGF0YS5vIFwKKyAgICBpbWFnZWlvL3BuZ2RlYy5vIFwKKyAgICBpbWFnZWlvL3BubWRlYy5vIFwKKyAgICBpbWFnZWlvL3RpZmZkZWMubyBcCisgICAgaW1hZ2Vpby93ZWJwZGVjLm8gXAorCitFWF9GT1JNQVRfRU5DX09CSlMgPSBcCisgICAgaW1hZ2Vpby9pbWFnZV9lbmMubyBcCisKK0VYX1VUSUxfT0JKUyA9IFwKKyAgICBleGFtcGxlcy9leGFtcGxlX3V0aWwubyBcCisKK0dJRkRFQ19PQkpTID0gXAorICAgIGV4YW1wbGVzL2dpZmRlYy5vIFwKKworSU1BR0VfVVRJTF9PQkpTID0gXAorICAgIGltYWdlaW8vaW1hZ2Vpb191dGlsLm8gXAorCitNVVhfT0JKUyA9IFwKKyAgICBzcmMvbXV4L2FuaW1fZW5jb2RlLm8gXAorICAgIHNyYy9tdXgvbXV4ZWRpdC5vIFwKKyAgICBzcmMvbXV4L211eGludGVybmFsLm8gXAorICAgIHNyYy9tdXgvbXV4cmVhZC5vIFwKKworVVRJTFNfREVDX09CSlMgPSBcCisgICAgc3JjL3V0aWxzL2JpdF9yZWFkZXJfdXRpbHMubyBcCisgICAgc3JjL3V0aWxzL2NvbG9yX2NhY2hlX3V0aWxzLm8gXAorICAgIHNyYy91dGlscy9maWx0ZXJzX3V0aWxzLm8gXAorICAgIHNyYy91dGlscy9odWZmbWFuX3V0aWxzLm8gXAorICAgIHNyYy91dGlscy9xdWFudF9sZXZlbHNfZGVjX3V0aWxzLm8gXAorICAgIHNyYy91dGlscy9yYW5kb21fdXRpbHMubyBcCisgICAgc3JjL3V0aWxzL3Jlc2NhbGVyX3V0aWxzLm8gXAorICAgIHNyYy91dGlscy90aHJlYWRfdXRpbHMubyBcCisgICAgc3JjL3V0aWxzL3V0aWxzLm8gXAorCitVVElMU19FTkNfT0JKUyA9IFwKKyAgICBzcmMvdXRpbHMvYml0X3dyaXRlcl91dGlscy5vIFwKKyAgICBzcmMvdXRpbHMvaHVmZm1hbl9lbmNvZGVfdXRpbHMubyBcCisgICAgc3JjL3V0aWxzL3F1YW50X2xldmVsc191dGlscy5vIFwKKworRVhUUkFfT0JKUyA9IFwKKyAgICBleHRyYXMvZXh0cmFzLm8gXAorICAgIGV4dHJhcy9xdWFsaXR5X2VzdGltYXRlLm8gXAorCitMSUJXRUJQREVDT0RFUl9PQkpTID0gJChERUNfT0JKUykgJChEU1BfREVDX09CSlMpICQoVVRJTFNfREVDX09CSlMpCitMSUJXRUJQX09CSlMgPSAkKExJQldFQlBERUNPREVSX09CSlMpICQoRU5DX09CSlMpICQoRFNQX0VOQ19PQkpTKSBcCisgICAgICAgICAgICAgICAkKFVUSUxTX0VOQ19PQkpTKQorTElCV0VCUE1VWF9PQkpTID0gJChNVVhfT0JKUykKK0xJQldFQlBERU1VWF9PQkpTID0gJChERU1VWF9PQkpTKQorTElCV0VCUEVYVFJBX09CSlMgPSAkKEVYVFJBX09CSlMpCisKK0hEUlNfSU5TVEFMTEVEID0gXAorICAgIHNyYy93ZWJwL2RlY29kZS5oIFwKKyAgICBzcmMvd2VicC9kZW11eC5oIFwKKyAgICBzcmMvd2VicC9lbmNvZGUuaCBcCisgICAgc3JjL3dlYnAvbXV4LmggXAorICAgIHNyYy93ZWJwL211eF90eXBlcy5oIFwKKyAgICBzcmMvd2VicC90eXBlcy5oIFwKKworSERSUyA9IFwKKyAgICBzcmMvZGVjL2FscGhhaV9kZWMuaCBcCisgICAgc3JjL2RlYy9jb21tb25fZGVjLmggXAorICAgIHNyYy9kZWMvdnA4X2RlYy5oIFwKKyAgICBzcmMvZGVjL3ZwOGlfZGVjLmggXAorICAgIHNyYy9kZWMvdnA4bGlfZGVjLmggXAorICAgIHNyYy9kZWMvd2VicGlfZGVjLmggXAorICAgIHNyYy9kc3AvY29tbW9uX3NzZTIuaCBcCisgICAgc3JjL2RzcC9kc3AuaCBcCisgICAgc3JjL2RzcC9sb3NzbGVzcy5oIFwKKyAgICBzcmMvZHNwL2xvc3NsZXNzX2NvbW1vbi5oIFwKKyAgICBzcmMvZHNwL21pcHNfbWFjcm8uaCBcCisgICAgc3JjL2RzcC9tc2FfbWFjcm8uaCBcCisgICAgc3JjL2RzcC9uZW9uLmggXAorICAgIHNyYy9kc3AveXV2LmggXAorICAgIHNyYy9lbmMvYmFja3dhcmRfcmVmZXJlbmNlc19lbmMuaCBcCisgICAgc3JjL2VuYy9jb3N0X2VuYy5oIFwKKyAgICBzcmMvZW5jL2hpc3RvZ3JhbV9lbmMuaCBcCisgICAgc3JjL2VuYy92cDhpX2VuYy5oIFwKKyAgICBzcmMvZW5jL3ZwOGxpX2VuYy5oIFwKKyAgICBzcmMvbXV4L2FuaW1pLmggXAorICAgIHNyYy9tdXgvbXV4aS5oIFwKKyAgICBzcmMvdXRpbHMvYml0X3JlYWRlcl91dGlscy5oIFwKKyAgICBzcmMvdXRpbHMvYml0X3JlYWRlcl9pbmxfdXRpbHMuaCBcCisgICAgc3JjL3V0aWxzL2JpdF93cml0ZXJfdXRpbHMuaCBcCisgICAgc3JjL3V0aWxzL2NvbG9yX2NhY2hlX3V0aWxzLmggXAorICAgIHNyYy91dGlscy9lbmRpYW5faW5sX3V0aWxzLmggXAorICAgIHNyYy91dGlscy9maWx0ZXJzX3V0aWxzLmggXAorICAgIHNyYy91dGlscy9odWZmbWFuX3V0aWxzLmggXAorICAgIHNyYy91dGlscy9odWZmbWFuX2VuY29kZV91dGlscy5oIFwKKyAgICBzcmMvdXRpbHMvcXVhbnRfbGV2ZWxzX3V0aWxzLmggXAorICAgIHNyYy91dGlscy9xdWFudF9sZXZlbHNfZGVjX3V0aWxzLmggXAorICAgIHNyYy91dGlscy9yYW5kb21fdXRpbHMuaCBcCisgICAgc3JjL3V0aWxzL3Jlc2NhbGVyX3V0aWxzLmggXAorICAgIHNyYy91dGlscy90aHJlYWRfdXRpbHMuaCBcCisgICAgc3JjL3V0aWxzL3V0aWxzLmggXAorICAgIHNyYy93ZWJwL2Zvcm1hdF9jb25zdGFudHMuaCBcCisgICAgJChIRFJTX0lOU1RBTExFRCkgXAorCitPVVRfTElCUyA9IGV4YW1wbGVzL2xpYmV4YW1wbGVfdXRpbC5hCitPVVRfTElCUyArPSBpbWFnZWlvL2xpYmltYWdlaW9fdXRpbC5hCitPVVRfTElCUyArPSBpbWFnZWlvL2xpYmltYWdlZGVjLmEKK09VVF9MSUJTICs9IGltYWdlaW8vbGliaW1hZ2VlbmMuYQorT1VUX0xJQlMgKz0gc3JjL2xpYndlYnBkZWNvZGVyLmEKK09VVF9MSUJTICs9IHNyYy9saWJ3ZWJwLmEKK0VYVFJBX0xJQiA9IGV4dHJhcy9saWJ3ZWJwZXh0cmFzLmEKK09VVF9FWEFNUExFUyA9IGV4YW1wbGVzL2N3ZWJwIGV4YW1wbGVzL2R3ZWJwCitFWFRSQV9FWEFNUExFUyA9IGV4YW1wbGVzL2dpZjJ3ZWJwIGV4YW1wbGVzL3Z3ZWJwIGV4YW1wbGVzL3dlYnBtdXggXAorICAgICAgICAgICAgICAgICBleGFtcGxlcy9hbmltX2RpZmYgZXhhbXBsZXMvYW5pbV9kdW1wIFwKKyAgICAgICAgICAgICAgICAgZXhhbXBsZXMvaW1nMndlYnAgZXhhbXBsZXMvd2VicGluZm8KK09USEVSX0VYQU1QTEVTID0gZXh0cmFzL2dldF9kaXN0byBleHRyYXMvd2VicF9xdWFsaXR5IGV4dHJhcy92d2VicF9zZGwKKworT1VUUFVUID0gJChPVVRfTElCUykgJChPVVRfRVhBTVBMRVMpCitpZmVxICgkKE1BS0VDTURHT0FMUyksY2xlYW4pCisgIE9VVFBVVCArPSAkKEVYVFJBX0VYQU1QTEVTKSAkKE9USEVSX0VYQU1QTEVTKQorICBPVVRQVVQgKz0gc3JjL2RlbXV4L2xpYndlYnBkZW11eC5hIHNyYy9tdXgvbGlid2VicG11eC5hICQoRVhUUkFfTElCKQorICBPVVRQVVQgKz0gZXhhbXBsZXMvbGliZ2lmZGVjLmEgZXhhbXBsZXMvbGliYW5pbV91dGlsLmEKK2VuZGlmCisKK2V4OiAkKE9VVF9FWEFNUExFUykKK2FsbDogZXggJChFWFRSQV9FWEFNUExFUykgJChPVEhFUl9FWEFNUExFUykKK2V4dHJhczogJChFWFRSQV9MSUIpCisKKyQoRVhfRk9STUFUX0RFQ19PQkpTKTogJS5vOiAlLmgKKworIyBzcGVjaWFsIGRlcGVuZGVuY2llczoKKyMgICB0cmVlX2RlYy5jL3ZwOF9kZWMuYy9iaXRfcmVhZGVyX3V0aWxzLmMgPC0+CisjICAgICBiaXRfcmVhZGVyX2lubF91dGlscy5oLCBlbmRpYW5faW5sX3V0aWxzLmgKKyMgICBiaXRfd3JpdGVyX3V0aWxzLmMgPC0+IGVuZGlhbl9pbmxfdXRpbHMuaAorc3JjL2RlYy90cmVlX2RlYy5vOiBzcmMvdXRpbHMvYml0X3JlYWRlcl9pbmxfdXRpbHMuaAorc3JjL2RlYy90cmVlX2RlYy5vOiBzcmMvdXRpbHMvZW5kaWFuX2lubF91dGlscy5oCitzcmMvZGVjL3ZwOF9kZWMubzogc3JjL3V0aWxzL2JpdF9yZWFkZXJfaW5sX3V0aWxzLmggc3JjL3V0aWxzL2VuZGlhbl9pbmxfdXRpbHMuaAorc3JjL3V0aWxzL2JpdF9yZWFkZXJfdXRpbHMubzogc3JjL3V0aWxzL2JpdF9yZWFkZXJfaW5sX3V0aWxzLmgKK3NyYy91dGlscy9iaXRfcmVhZGVyX3V0aWxzLm86IHNyYy91dGlscy9lbmRpYW5faW5sX3V0aWxzLmgKK3NyYy91dGlscy9iaXRfd3JpdGVyX3V0aWxzLm86IHNyYy91dGlscy9lbmRpYW5faW5sX3V0aWxzLmgKKworJS5vOiAlLmMgJChIRFJTKQorCSQoQ0MpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAtYyAkPCAtbyAkQAorCitleGFtcGxlcy9saWJhbmltX3V0aWwuYTogJChBTklNX1VUSUxfT0JKUykKK2V4YW1wbGVzL2xpYmV4YW1wbGVfdXRpbC5hOiAkKEVYX1VUSUxfT0JKUykKK2V4YW1wbGVzL2xpYmdpZmRlYy5hOiAkKEdJRkRFQ19PQkpTKQorZXh0cmFzL2xpYndlYnBleHRyYXMuYTogJChMSUJXRUJQRVhUUkFfT0JKUykKK2ltYWdlaW8vbGliaW1hZ2VkZWMuYTogJChFWF9GT1JNQVRfREVDX09CSlMpCitpbWFnZWlvL2xpYmltYWdlZW5jLmE6ICQoRVhfRk9STUFUX0VOQ19PQkpTKQoraW1hZ2Vpby9saWJpbWFnZWlvX3V0aWwuYTogJChJTUFHRV9VVElMX09CSlMpCitzcmMvbGlid2VicGRlY29kZXIuYTogJChMSUJXRUJQREVDT0RFUl9PQkpTKQorc3JjL2xpYndlYnAuYTogJChMSUJXRUJQX09CSlMpCitzcmMvbXV4L2xpYndlYnBtdXguYTogJChMSUJXRUJQTVVYX09CSlMpCitzcmMvZGVtdXgvbGlid2VicGRlbXV4LmE6ICQoTElCV0VCUERFTVVYX09CSlMpCisKKyUuYToKKwkkKEFSKSAkKEFSRkxBR1MpICRAICReCisKK2V4YW1wbGVzL2FuaW1fZGlmZjogZXhhbXBsZXMvYW5pbV9kaWZmLm8gJChBTklNX1VUSUxfT0JKUykgJChHSUZERUNfT0JKUykKK2V4YW1wbGVzL2FuaW1fZHVtcDogZXhhbXBsZXMvYW5pbV9kdW1wLm8gJChBTklNX1VUSUxfT0JKUykKK2V4YW1wbGVzL2N3ZWJwOiBleGFtcGxlcy9jd2VicC5vCitleGFtcGxlcy9kd2VicDogZXhhbXBsZXMvZHdlYnAubworZXhhbXBsZXMvZ2lmMndlYnA6IGV4YW1wbGVzL2dpZjJ3ZWJwLm8gJChHSUZERUNfT0JKUykKK2V4YW1wbGVzL3Z3ZWJwOiBleGFtcGxlcy92d2VicC5vCitleGFtcGxlcy93ZWJwbXV4OiBleGFtcGxlcy93ZWJwbXV4Lm8KK2V4YW1wbGVzL2ltZzJ3ZWJwOiBleGFtcGxlcy9pbWcyd2VicC5vCitleGFtcGxlcy93ZWJwaW5mbzogZXhhbXBsZXMvd2VicGluZm8ubworCitleGFtcGxlcy9hbmltX2RpZmY6IGV4YW1wbGVzL2xpYmFuaW1fdXRpbC5hIGV4YW1wbGVzL2xpYmdpZmRlYy5hCitleGFtcGxlcy9hbmltX2RpZmY6IHNyYy9kZW11eC9saWJ3ZWJwZGVtdXguYSBleGFtcGxlcy9saWJleGFtcGxlX3V0aWwuYQorZXhhbXBsZXMvYW5pbV9kaWZmOiBpbWFnZWlvL2xpYmltYWdlaW9fdXRpbC5hIHNyYy9saWJ3ZWJwLmEKK2V4YW1wbGVzL2FuaW1fZGlmZjogRVhUUkFfTElCUyArPSAkKEdJRl9MSUJTKQorZXhhbXBsZXMvYW5pbV9kaWZmOiBFWFRSQV9GTEFHUyArPSAtRFdFQlBfSEFWRV9HSUYKK2V4YW1wbGVzL2FuaW1fZHVtcDogZXhhbXBsZXMvbGliYW5pbV91dGlsLmEKK2V4YW1wbGVzL2FuaW1fZHVtcDogc3JjL2RlbXV4L2xpYndlYnBkZW11eC5hCitleGFtcGxlcy9hbmltX2R1bXA6IGV4YW1wbGVzL2xpYmV4YW1wbGVfdXRpbC5hCitleGFtcGxlcy9hbmltX2R1bXA6IGltYWdlaW8vbGliaW1hZ2Vpb191dGlsLmEKK2V4YW1wbGVzL2FuaW1fZHVtcDogaW1hZ2Vpby9saWJpbWFnZWVuYy5hCitleGFtcGxlcy9hbmltX2R1bXA6IHNyYy9saWJ3ZWJwLmEKK2V4YW1wbGVzL2FuaW1fZHVtcDogRVhUUkFfTElCUyArPSAkKEdJRl9MSUJTKSAkKERXRUJQX0xJQlMpCitleGFtcGxlcy9jd2VicDogZXhhbXBsZXMvbGliZXhhbXBsZV91dGlsLmEKK2V4YW1wbGVzL2N3ZWJwOiBpbWFnZWlvL2xpYmltYWdlZGVjLmEKK2V4YW1wbGVzL2N3ZWJwOiBzcmMvZGVtdXgvbGlid2VicGRlbXV4LmEKK2V4YW1wbGVzL2N3ZWJwOiBpbWFnZWlvL2xpYmltYWdlaW9fdXRpbC5hCitleGFtcGxlcy9jd2VicDogc3JjL2xpYndlYnAuYQorZXhhbXBsZXMvY3dlYnA6IEVYVFJBX0xJQlMgKz0gJChDV0VCUF9MSUJTKQorZXhhbXBsZXMvZHdlYnA6IGV4YW1wbGVzL2xpYmV4YW1wbGVfdXRpbC5hCitleGFtcGxlcy9kd2VicDogaW1hZ2Vpby9saWJpbWFnZWRlYy5hCitleGFtcGxlcy9kd2VicDogc3JjL2RlbXV4L2xpYndlYnBkZW11eC5hCitleGFtcGxlcy9kd2VicDogaW1hZ2Vpby9saWJpbWFnZWVuYy5hCitleGFtcGxlcy9kd2VicDogaW1hZ2Vpby9saWJpbWFnZWlvX3V0aWwuYQorZXhhbXBsZXMvZHdlYnA6IHNyYy9saWJ3ZWJwLmEKK2V4YW1wbGVzL2R3ZWJwOiBFWFRSQV9MSUJTICs9ICQoRFdFQlBfTElCUykKK2V4YW1wbGVzL2dpZjJ3ZWJwOiBleGFtcGxlcy9saWJleGFtcGxlX3V0aWwuYSBpbWFnZWlvL2xpYmltYWdlaW9fdXRpbC5hCitleGFtcGxlcy9naWYyd2VicDogZXhhbXBsZXMvbGliZ2lmZGVjLmEgc3JjL211eC9saWJ3ZWJwbXV4LmEgc3JjL2xpYndlYnAuYQorZXhhbXBsZXMvZ2lmMndlYnA6IEVYVFJBX0xJQlMgKz0gJChHSUZfTElCUykKK2V4YW1wbGVzL2dpZjJ3ZWJwOiBFWFRSQV9GTEFHUyArPSAtRFdFQlBfSEFWRV9HSUYKK2V4YW1wbGVzL3Z3ZWJwOiBleGFtcGxlcy9saWJleGFtcGxlX3V0aWwuYSBzcmMvZGVtdXgvbGlid2VicGRlbXV4LmEKK2V4YW1wbGVzL3Z3ZWJwOiBpbWFnZWlvL2xpYmltYWdlaW9fdXRpbC5hIHNyYy9saWJ3ZWJwLmEKK2V4YW1wbGVzL3Z3ZWJwOiBFWFRSQV9MSUJTICs9ICQoR0xfTElCUykKK2V4YW1wbGVzL3Z3ZWJwOiBFWFRSQV9GTEFHUyArPSAtRFdFQlBfSEFWRV9HTAorZXhhbXBsZXMvd2VicG11eDogZXhhbXBsZXMvbGliZXhhbXBsZV91dGlsLmEgaW1hZ2Vpby9saWJpbWFnZWlvX3V0aWwuYQorZXhhbXBsZXMvd2VicG11eDogc3JjL211eC9saWJ3ZWJwbXV4LmEgc3JjL2xpYndlYnBkZWNvZGVyLmEKK2V4YW1wbGVzL2ltZzJ3ZWJwOiBleGFtcGxlcy9saWJleGFtcGxlX3V0aWwuYSBpbWFnZWlvL2xpYmltYWdlaW9fdXRpbC5hCitleGFtcGxlcy9pbWcyd2VicDogaW1hZ2Vpby9saWJpbWFnZWRlYy5hCitleGFtcGxlcy9pbWcyd2VicDogc3JjL2RlbXV4L2xpYndlYnBkZW11eC5hCitleGFtcGxlcy9pbWcyd2VicDogc3JjL211eC9saWJ3ZWJwbXV4LmEgc3JjL2xpYndlYnAuYQorZXhhbXBsZXMvaW1nMndlYnA6IEVYVFJBX0xJQlMgKz0gJChDV0VCUF9MSUJTKQorZXhhbXBsZXMvd2VicGluZm86IGV4YW1wbGVzL2xpYmV4YW1wbGVfdXRpbC5hIGltYWdlaW8vbGliaW1hZ2Vpb191dGlsLmEKK2V4YW1wbGVzL3dlYnBpbmZvOiBzcmMvbGlid2VicGRlY29kZXIuYQorCitleHRyYXMvZ2V0X2Rpc3RvOiBleHRyYXMvZ2V0X2Rpc3RvLm8KK2V4dHJhcy9nZXRfZGlzdG86IGltYWdlaW8vbGliaW1hZ2VkZWMuYQorZXh0cmFzL2dldF9kaXN0bzogc3JjL2RlbXV4L2xpYndlYnBkZW11eC5hCitleHRyYXMvZ2V0X2Rpc3RvOiBpbWFnZWlvL2xpYmltYWdlaW9fdXRpbC5hCitleHRyYXMvZ2V0X2Rpc3RvOiBzcmMvbGlid2VicC5hCitleHRyYXMvZ2V0X2Rpc3RvOiBFWFRSQV9MSUJTICs9ICQoQ1dFQlBfTElCUykKKworZXh0cmFzL3dlYnBfcXVhbGl0eTogZXh0cmFzL3dlYnBfcXVhbGl0eS5vCitleHRyYXMvd2VicF9xdWFsaXR5OiBpbWFnZWlvL2xpYmltYWdlaW9fdXRpbC5hCitleHRyYXMvd2VicF9xdWFsaXR5OiAkKEVYVFJBX0xJQikgc3JjL2xpYndlYnAuYQorCitleHRyYXMvdndlYnBfc2RsOiBleHRyYXMvdndlYnBfc2RsLm8KK2V4dHJhcy92d2VicF9zZGw6IGV4dHJhcy93ZWJwX3RvX3NkbC5vCitleHRyYXMvdndlYnBfc2RsOiBpbWFnZWlvL2xpYmltYWdlaW9fdXRpbC5hCitleHRyYXMvdndlYnBfc2RsOiBzcmMvbGlid2VicC5hCitleHRyYXMvdndlYnBfc2RsOiBFWFRSQV9GTEFHUyArPSAtRFdFQlBfSEFWRV9TREwgJChTRExfRkxBR1MpCitleHRyYXMvdndlYnBfc2RsOiBFWFRSQV9MSUJTICs9ICQoU0RMX0xJQlMpCisKKyQoT1VUX0VYQU1QTEVTKSAkKEVYVFJBX0VYQU1QTEVTKSAkKE9USEVSX0VYQU1QTEVTKToKKwkkKENDKSAtbyAkQCAkXiAkKExERkxBR1MpCisKK2Rpc3Q6IERFU1RESVIgOj0gZGlzdAorZGlzdDogT1VUX0VYQU1QTEVTICs9ICQoRVhUUkFfRVhBTVBMRVMpCitkaXN0OiBhbGwKKwkkKElOU1RBTEwpIC1tNzU1IC1kICQoREVTVERJUikvaW5jbHVkZS93ZWJwIFwKKwkgICAgICAgICAgICQoREVTVERJUikvYmluICQoREVTVERJUikvZG9jICQoREVTVERJUikvbGliCisJJChJTlNUQUxMKSAtbTc1NSAtcyAkKE9VVF9FWEFNUExFUykgJChERVNURElSKS9iaW4KKwkkKElOU1RBTEwpIC1tNjQ0ICQoSERSU19JTlNUQUxMRUQpICQoREVTVERJUikvaW5jbHVkZS93ZWJwCisJJChJTlNUQUxMKSAtbTY0NCBzcmMvbGlid2VicC5hICQoREVTVERJUikvbGliCisJJChJTlNUQUxMKSAtbTY0NCBzcmMvZGVtdXgvbGlid2VicGRlbXV4LmEgJChERVNURElSKS9saWIKKwkkKElOU1RBTEwpIC1tNjQ0IHNyYy9tdXgvbGlid2VicG11eC5hICQoREVTVERJUikvbGliCisJdW1hc2sgMDIyOyBcCisJZm9yIG0gaW4gbWFuL1tjZHZdd2VicC4xIG1hbi9naWYyd2VicC4xIG1hbi93ZWJwbXV4LjEgXAorICAgICAgICAgICAgICAgICBtYW4vaW1nMndlYnAuMSBtYW4vd2VicGluZm8uMTsgZG8gXAorCSAgYmFzZW5hbT0kJChiYXNlbmFtZSAkJG0gLjEpOyBcCisJICAkKEdST0ZGKSAtdCAtZSAtbWFuIC1UIGFzY2lpICQkbSBcCisJICAgIHwgJChDT0wpIC1ieCA+JChERVNURElSKS9kb2MvJCR7YmFzZW5hbX0udHh0OyBcCisJICAkKEdST0ZGKSAtdCAtZSAtbWFuIC1UIGh0bWwgJCRtIFwKKwkgICAgfCAkKENPTCkgLWJ4ID4kKERFU1RESVIpL2RvYy8kJHtiYXNlbmFtfS5odG1sOyBcCisJZG9uZQorCitjbGVhbjoKKwkkKFJNKSAkKE9VVFBVVCkgKn4gXAorICAgICAgICAgICAgICBleGFtcGxlcy8qLm8gZXhhbXBsZXMvKn4gXAorICAgICAgICAgICAgICBleHRyYXMvKi5vIGV4dHJhcy8qfiBcCisgICAgICAgICAgICAgIGltYWdlaW8vKi5vIGltYWdlaW8vKn4gXAorICAgICAgICAgICAgICBzcmMvZGVjLyoubyBzcmMvZGVjLyp+IFwKKyAgICAgICAgICAgICAgc3JjL2RlbXV4LyoubyBzcmMvZGVtdXgvKn4gXAorICAgICAgICAgICAgICBzcmMvZHNwLyoubyBzcmMvZHNwLyp+IFwKKyAgICAgICAgICAgICAgc3JjL2VuYy8qLm8gc3JjL2VuYy8qfiBcCisgICAgICAgICAgICAgIHNyYy9tdXgvKi5vIHNyYy9tdXgvKn4gXAorICAgICAgICAgICAgICBzcmMvdXRpbHMvKi5vIHNyYy91dGlscy8qfiBcCisgICAgICAgICAgICAgIHNyYy93ZWJwLyp+IG1hbi8qfiBkb2MvKn4gc3dpZy8qfiBcCisKKy5QSE9OWTogYWxsIGNsZWFuIGRpc3QgZXgKKy5TVUZGSVhFUzoKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL21hbi9NYWtlZmlsZS5hbSBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL21hbi9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2VmNzdmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvbWFuL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTQgQEAKK21hbl9NQU5TID0gY3dlYnAuMSBkd2VicC4xCitpZiBXQU5UX01VWAorICBtYW5fTUFOUyArPSB3ZWJwbXV4LjEKK2VuZGlmCitpZiBCVUlMRF9HSUYyV0VCUAorICBtYW5fTUFOUyArPSBnaWYyd2VicC4xCitlbmRpZgoraWYgQlVJTERfVldFQlAKKyAgbWFuX01BTlMgKz0gdndlYnAuMQorZW5kaWYKK2lmIEJVSUxEX1dFQlBJTkZPCisgIG1hbl9NQU5TICs9IHdlYnBpbmZvLjEKK2VuZGlmCitFWFRSQV9ESVNUID0gJChtYW5fTUFOUykKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL21hbi9jd2VicC4xIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvbWFuL2N3ZWJwLjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk0MzMyNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL21hbi9jd2VicC4xCkBAIC0wLDAgKzEsMzE2IEBACisuXCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhleSwgRU1BQ1M6IC0qLSBucm9mZiAtKi0KKy5USCBDV0VCUCAxICJKYW51YXJ5IDIwLCAyMDE3IgorLlNIIE5BTUUKK2N3ZWJwIFwtIGNvbXByZXNzIGFuIGltYWdlIGZpbGUgdG8gYSBXZWJQIGZpbGUKKy5TSCBTWU5PUFNJUworLkIgY3dlYnAKKy5SSSBbIG9wdGlvbnMgXSAiIGlucHV0X2ZpbGUgXC1vIG91dHB1dF9maWxlLndlYnAKKy5icgorLlNIIERFU0NSSVBUSU9OCitUaGlzIG1hbnVhbCBwYWdlIGRvY3VtZW50cyB0aGUKKy5CIGN3ZWJwCitjb21tYW5kLgorLlBQCitcZkJjd2VicFxmUCBjb21wcmVzc2VzIGFuIGltYWdlIHVzaW5nIHRoZSBXZWJQIGZvcm1hdC4KK0lucHV0IGZvcm1hdCBjYW4gYmUgZWl0aGVyIFBORywgSlBFRywgVElGRiwgV2ViUCBvciByYXcgWSdDYkNyIHNhbXBsZXMuCisuU0ggT1BUSU9OUworVGhlIGJhc2ljIG9wdGlvbnMgYXJlOgorLlRQCisuQkkgXC1vICIgc3RyaW5nCitTcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBvdXRwdXQgV2ViUCBmaWxlLiBJZiBvbWl0dGVkLCBcZkJjd2VicFxmUCB3aWxsCitwZXJmb3JtIGNvbXByZXNzaW9uIGJ1dCBvbmx5IHJlcG9ydCBzdGF0aXN0aWNzLgorVXNpbmcgIlwtIiBhcyBvdXRwdXQgbmFtZSB3aWxsIGRpcmVjdCBvdXRwdXQgdG8gJ3N0ZG91dCcuCisuVFAKKy5CSSBcLVwtICIgc3RyaW5nCitFeHBsaWNpdGx5IHNwZWNpZnkgdGhlIGlucHV0IGZpbGUuIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCBpZiB0aGUgaW5wdXQKK2ZpbGUgc3RhcnRzIHdpdGggYSAnXC0nIGZvciBpbnN0YW5jZS4gVGhpcyBvcHRpb24gbXVzdCBhcHBlYXIgXGZCbGFzdFxmUC4KK0FueSBvdGhlciBvcHRpb25zIGFmdGVyd2FyZCB3aWxsIGJlIGlnbm9yZWQuCisuVFAKKy5CIFwtaCwgXC1oZWxwCitBIHNob3J0IHVzYWdlIHN1bW1hcnkuCisuVFAKKy5CIFwtSCwgXC1sb25naGVscAorQSBzdW1tYXJ5IG9mIGFsbCB0aGUgcG9zc2libGUgb3B0aW9ucy4KKy5UUAorLkIgXC12ZXJzaW9uCitQcmludCB0aGUgdmVyc2lvbiBudW1iZXIgKGFzIG1ham9yLm1pbm9yLnJldmlzaW9uKSBhbmQgZXhpdC4KKy5UUAorLkIgXC1sb3NzbGVzcworRW5jb2RlIHRoZSBpbWFnZSB3aXRob3V0IGFueSBsb3NzLiBGb3IgaW1hZ2VzIHdpdGggZnVsbHkgdHJhbnNwYXJlbnQgYXJlYSwKK3RoZSBpbnZpc2libGUgcGl4ZWwgdmFsdWVzIChSL0cvQiBvciBZL1UvVikgd2lsbCBiZSBwcmVzZXJ2ZWQgb25seSBpZiB0aGUKK1wtZXhhY3Qgb3B0aW9uIGlzIHVzZWQuCisuVFAKKy5CSSBcLW5lYXJfbG9zc2xlc3MgIiBpbnQKK1VzZSBuZWFyXC1sb3NzbGVzcyBpbWFnZSBwcmVwcm9jZXNzaW5nLiBUaGlzIG9wdGlvbiBhZGp1c3RzIHBpeGVsIHZhbHVlcwordG8gaGVscCBjb21wcmVzc2liaWxpdHksIGJ1dCBoYXMgbWluaW1hbCBpbXBhY3Qgb24gdGhlIHZpc3VhbCBxdWFsaXR5LgorSXQgdHJpZ2dlcnMgbG9zc2xlc3MgY29tcHJlc3Npb24gbW9kZSBhdXRvbWF0aWNhbGx5LgorUmFuZ2UgaXMgMCAobWF4aW11bSBwcmVwcm9jZXNzaW5nKSB0byAxMDAgKG5vIHByZXByb2Nlc3NpbmcsIHRoZSBkZWZhdWx0KS4KKy5UUAorLkJJIFwtcSAiIGZsb2F0CitTcGVjaWZ5IHRoZSBjb21wcmVzc2lvbiBmYWN0b3IgZm9yIFJHQiBjaGFubmVscyBiZXR3ZWVuIDAgYW5kIDEwMC4gVGhlIGRlZmF1bHQKK2lzIDc1LgorLmJyCitJbiBjYXNlIG9mIGxvc3N5IGNvbXByZXNzaW9uIChkZWZhdWx0KSwgYSBzbWFsbCBmYWN0b3IgcHJvZHVjZXMgYSBzbWFsbGVyIGZpbGUKK3dpdGggbG93ZXIgcXVhbGl0eS4gQmVzdCBxdWFsaXR5IGlzIGFjaGlldmVkIGJ5IHVzaW5nIGEgdmFsdWUgb2YgMTAwLgorLmJyCitJbiBjYXNlIG9mIGxvc3NsZXNzIGNvbXByZXNzaW9uIChzcGVjaWZpZWQgYnkgdGhlIFxmQlwtbG9zc2xlc3NcZlAgb3B0aW9uKSwgYQorc21hbGwgZmFjdG9yIGVuYWJsZXMgZmFzdGVyIGNvbXByZXNzaW9uIHNwZWVkLCBidXQgcHJvZHVjZXMgYSBsYXJnZXIgZmlsZS4KK01heGltdW0gY29tcHJlc3Npb24gaXMgYWNoaWV2ZWQgYnkgdXNpbmcgYSB2YWx1ZSBvZiAxMDAuCisuVFAKKy5CSSBcLXogIiBpbnQKK1N3aXRjaCBvbiBcZkJsb3NzbGVzc1xmUCBjb21wcmVzc2lvbiBtb2RlIHdpdGggdGhlIHNwZWNpZmllZCBsZXZlbCBiZXR3ZWVuIDAKK2FuZCA5LCB3aXRoIGxldmVsIDAgYmVpbmcgdGhlIGZhc3Rlc3QsIDkgYmVpbmcgdGhlIHNsb3dlc3QuIEZhc3QgbW9kZQorcHJvZHVjZXMgbGFyZ2VyIGZpbGUgc2l6ZSB0aGFuIHNsb3dlciBvbmVzLiBBIGdvb2QgZGVmYXVsdCBpcyBcZkJcLXogNlxmUC4KK1RoaXMgb3B0aW9uIGlzIGFjdHVhbGx5IGEgc2hvcnRjdXQgZm9yIHNvbWUgcHJlZGVmaW5lZCBzZXR0aW5ncyBmb3IgcXVhbGl0eQorYW5kIG1ldGhvZC4gSWYgb3B0aW9ucyBcZkJcLXFcZlAgIG9yIFxmQlwtbVxmUCBhcmUgc3Vic2VxdWVudGx5IHVzZWQsIHRoZXkgd2lsbAoraW52YWxpZGF0ZSB0aGUgZWZmZWN0IG9mIHRoaXMgb3B0aW9uLgorLlRQCisuQkkgXC1hbHBoYV9xICIgaW50CitTcGVjaWZ5IHRoZSBjb21wcmVzc2lvbiBmYWN0b3IgZm9yIGFscGhhIGNvbXByZXNzaW9uIGJldHdlZW4gMCBhbmQgMTAwLgorTG9zc2xlc3MgY29tcHJlc3Npb24gb2YgYWxwaGEgaXMgYWNoaWV2ZWQgdXNpbmcgYSB2YWx1ZSBvZiAxMDAsIHdoaWxlIHRoZSBsb3dlcgordmFsdWVzIHJlc3VsdCBpbiBhIGxvc3N5IGNvbXByZXNzaW9uLiBUaGUgZGVmYXVsdCBpcyAxMDAuCisuVFAKKy5CSSBcLXByZXNldCAiIHN0cmluZworU3BlY2lmeSBhIHNldCBvZiBwcmVcLWRlZmluZWQgcGFyYW1ldGVycyB0byBzdWl0IGEgcGFydGljdWxhciB0eXBlIG9mCitzb3VyY2UgbWF0ZXJpYWwuIFBvc3NpYmxlIHZhbHVlcyBhcmU6ICBcZkJkZWZhdWx0XGZQLCBcZkJwaG90b1xmUCwKK1xmQnBpY3R1cmVcZlAsIFxmQmRyYXdpbmdcZlAsIFxmQmljb25cZlAsIFxmQnRleHRcZlAuIFNpbmNlCitcZkJcLXByZXNldFxmUCBvdmVyd3JpdGVzIHRoZSBvdGhlciBwYXJhbWV0ZXJzJyB2YWx1ZXMgKGV4Y2VwdCB0aGUKK1xmQlwtcVxmUCBvbmUpLCB0aGlzIG9wdGlvbiBzaG91bGQgcHJlZmVyYWJseSBhcHBlYXIgZmlyc3QgaW4gdGhlCitvcmRlciBvZiB0aGUgYXJndW1lbnRzLgorLlRQCisuQkkgXC1tICIgaW50CitTcGVjaWZ5IHRoZSBjb21wcmVzc2lvbiBtZXRob2QgdG8gdXNlLiBUaGlzIHBhcmFtZXRlciBjb250cm9scyB0aGUKK3RyYWRlIG9mZiBiZXR3ZWVuIGVuY29kaW5nIHNwZWVkIGFuZCB0aGUgY29tcHJlc3NlZCBmaWxlIHNpemUgYW5kIHF1YWxpdHkuCitQb3NzaWJsZSB2YWx1ZXMgcmFuZ2UgZnJvbSAwIHRvIDYuIERlZmF1bHQgdmFsdWUgaXMgNC4KK1doZW4gaGlnaGVyIHZhbHVlcyBhcmUgdXNlZCwgdGhlIGVuY29kZXIgd2lsbCBzcGVuZCBtb3JlIHRpbWUgaW5zcGVjdGluZworYWRkaXRpb25hbCBlbmNvZGluZyBwb3NzaWJpbGl0aWVzIGFuZCBkZWNpZGUgb24gdGhlIHF1YWxpdHkgZ2Fpbi4KK0xvd2VyIHZhbHVlIGNhbiByZXN1bHQgaW4gZmFzdGVyIHByb2Nlc3NpbmcgdGltZSBhdCB0aGUgZXhwZW5zZSBvZgorbGFyZ2VyIGZpbGUgc2l6ZSBhbmQgbG93ZXIgY29tcHJlc3Npb24gcXVhbGl0eS4KKy5UUAorLkJJIFwtcmVzaXplICIgd2lkdGggaGVpZ2h0CitSZXNpemUgdGhlIHNvdXJjZSB0byBhIHJlY3RhbmdsZSB3aXRoIHNpemUgXGZCd2lkdGhcZlAgeCBcZkJoZWlnaHRcZlAuCitJZiBlaXRoZXIgKGJ1dCBub3QgYm90aCkgb2YgdGhlIFxmQndpZHRoXGZQIG9yIFxmQmhlaWdodFxmUCBwYXJhbWV0ZXJzIGlzIDAsCit0aGUgdmFsdWUgd2lsbCBiZSBjYWxjdWxhdGVkIHByZXNlcnZpbmcgdGhlIGFzcGVjdFwtcmF0aW8uCisuVFAKKy5CSSBcLWNyb3AgIiB4X3Bvc2l0aW9uIHlfcG9zaXRpb24gd2lkdGggaGVpZ2h0CitDcm9wIHRoZSBzb3VyY2UgdG8gYSByZWN0YW5nbGUgd2l0aCB0b3BcLWxlZnQgY29ybmVyIGF0IGNvb3JkaW5hdGVzCisoXGZCeF9wb3NpdGlvblxmUCwgXGZCeV9wb3NpdGlvblxmUCkgYW5kIHNpemUgXGZCd2lkdGhcZlAgeCBcZkJoZWlnaHRcZlAuCitUaGlzIGNyb3BwaW5nIGFyZWEgbXVzdCBiZSBmdWxseSBjb250YWluZWQgd2l0aGluIHRoZSBzb3VyY2UgcmVjdGFuZ2xlLgorLlRQCisuQiBcLW10CitVc2UgbXVsdGlcLXRocmVhZGluZyBmb3IgZW5jb2RpbmcsIGlmIHBvc3NpYmxlLgorLlRQCisuQiBcLWxvd19tZW1vcnkKK1JlZHVjZSBtZW1vcnkgdXNhZ2Ugb2YgbG9zc3kgZW5jb2RpbmcgYnkgc2F2aW5nIGZvdXIgdGltZXMgdGhlIGNvbXByZXNzZWQKK3NpemUgKHR5cGljYWxseSkuIFRoaXMgd2lsbCBtYWtlIHRoZSBlbmNvZGluZyBzbG93ZXIgYW5kIHRoZSBvdXRwdXQgc2xpZ2h0bHkKK2RpZmZlcmVudCBpbiBzaXplIGFuZCBkaXN0b3J0aW9uLiBUaGlzIGZsYWcgaXMgb25seSBlZmZlY3RpdmUgZm9yIG1ldGhvZHMKKzMgYW5kIHVwLCBhbmQgaXMgb2ZmIGJ5IGRlZmF1bHQuIE5vdGUgdGhhdCBsZWF2aW5nIHRoaXMgZmxhZyBvZmYgd2lsbCBoYXZlCitzb21lIHNpZGUgZWZmZWN0cyBvbiB0aGUgYml0c3RyZWFtOiBpdCBmb3JjZXMgY2VydGFpbiBiaXRzdHJlYW0gZmVhdHVyZXMKK2xpa2UgbnVtYmVyIG9mIHBhcnRpdGlvbnMgKGZvcmNlZCB0byAxKS4gTm90ZSB0aGF0IGEgbW9yZSBkZXRhaWxlZCByZXBvcnQKK29mIGJpdHN0cmVhbSBzaXplIGlzIHByaW50ZWQgYnkgXGZCY3dlYnBcZlAgd2hlbiB1c2luZyB0aGlzIG9wdGlvbi4KKworLlNTIExPU1NZIE9QVElPTlMKK1RoZXNlIG9wdGlvbnMgYXJlIG9ubHkgZWZmZWN0aXZlIHdoZW4gZG9pbmcgbG9zc3kgZW5jb2RpbmcgKHRoZSBkZWZhdWx0LCB3aXRoCitvciB3aXRob3V0IGFscGhhKS4KKworLlRQCisuQkkgXC1zaXplICIgaW50CitTcGVjaWZ5IGEgdGFyZ2V0IHNpemUgKGluIGJ5dGVzKSB0byB0cnkgYW5kIHJlYWNoIGZvciB0aGUgY29tcHJlc3NlZCBvdXRwdXQuCitUaGUgY29tcHJlc3NvciB3aWxsIG1ha2Ugc2V2ZXJhbCBwYXNzZXMgb2YgcGFydGlhbCBlbmNvZGluZyBpbiBvcmRlciB0byBnZXQgYXMKK2Nsb3NlIGFzIHBvc3NpYmxlIHRvIHRoaXMgdGFyZ2V0LiBJZiBib3RoIFxmQlwtc2l6ZVxmUCBhbmQgXGZCXC1wc25yXGZQCithcmUgdXNlZCwgXGZCXC1zaXplXGZQIHZhbHVlIHdpbGwgcHJldmFpbC4KKy5UUAorLkJJIFwtcHNuciAiIGZsb2F0CitTcGVjaWZ5IGEgdGFyZ2V0IFBTTlIgKGluIGRCKSB0byB0cnkgYW5kIHJlYWNoIGZvciB0aGUgY29tcHJlc3NlZCBvdXRwdXQuCitUaGUgY29tcHJlc3NvciB3aWxsIG1ha2Ugc2V2ZXJhbCBwYXNzZXMgb2YgcGFydGlhbCBlbmNvZGluZyBpbiBvcmRlciB0byBnZXQgYXMKK2Nsb3NlIGFzIHBvc3NpYmxlIHRvIHRoaXMgdGFyZ2V0LiBJZiBib3RoIFxmQlwtc2l6ZVxmUCBhbmQgXGZCXC1wc25yXGZQCithcmUgdXNlZCwgXGZCXC1zaXplXGZQIHZhbHVlIHdpbGwgcHJldmFpbC4KKy5UUAorLkJJIFwtcGFzcyAiIGludAorU2V0IGEgbWF4aW11bSBudW1iZXIgb2YgcGFzc2VzIHRvIHVzZSBkdXJpbmcgdGhlIGRpY2hvdG9teSB1c2VkIGJ5CitvcHRpb25zIFxmQlwtc2l6ZVxmUCBvciBcZkJcLXBzbnJcZlAuIE1heGltdW0gdmFsdWUgaXMgMTAsIGRlZmF1bHQgaXMgMS4KK0lmIG9wdGlvbnMgXGZCXC1zaXplXGZQIG9yIFxmQlwtcHNuclxmUCB3ZXJlIHVzZWQsIGJ1dCBcZkJcLXBhc3NcZlAgd2Fzbid0CitzcGVjaWZpZWQsIGEgZGVmYXVsdCB2YWx1ZSBvZiAnNicgcGFzc2VzIHdpbGwgYmUgdXNlZC4KKy5UUAorLkIgXC1hZgorVHVybnMgYXV0b1wtZmlsdGVyIG9uLiBUaGlzIGFsZ29yaXRobSB3aWxsIHNwZW5kIGFkZGl0aW9uYWwgdGltZSBvcHRpbWl6aW5nCit0aGUgZmlsdGVyaW5nIHN0cmVuZ3RoIHRvIHJlYWNoIGEgd2VsbFwtYmFsYW5jZWQgcXVhbGl0eS4KKy5UUAorLkIgXC1qcGVnX2xpa2UKK0NoYW5nZSB0aGUgaW50ZXJuYWwgcGFyYW1ldGVyIG1hcHBpbmcgdG8gYmV0dGVyIG1hdGNoIHRoZSBleHBlY3RlZCBzaXplCitvZiBKUEVHIGNvbXByZXNzaW9uLiBUaGlzIGZsYWcgd2lsbCBnZW5lcmFsbHkgcHJvZHVjZSBhbiBvdXRwdXQgZmlsZSBvZgorc2ltaWxhciBzaXplIHRvIGl0cyBKUEVHIGVxdWl2YWxlbnQgKGZvciB0aGUgc2FtZSBcZkJcLXFcZlAgc2V0dGluZyksIGJ1dAord2l0aCBsZXNzIHZpc3VhbCBkaXN0b3J0aW9uLgorCisuVFAKK0FkdmFuY2VkIG9wdGlvbnM6CisKKy5UUAorLkJJIFwtZiAiIGludAorU3BlY2lmeSB0aGUgc3RyZW5ndGggb2YgdGhlIGRlYmxvY2tpbmcgZmlsdGVyLCBiZXR3ZWVuIDAgKG5vIGZpbHRlcmluZykKK2FuZCAxMDAgKG1heGltdW0gZmlsdGVyaW5nKS4gQSB2YWx1ZSBvZiAwIHdpbGwgdHVybiBvZmYgYW55IGZpbHRlcmluZy4KK0hpZ2hlciB2YWx1ZSB3aWxsIGluY3JlYXNlIHRoZSBzdHJlbmd0aCBvZiB0aGUgZmlsdGVyaW5nIHByb2Nlc3MgYXBwbGllZAorYWZ0ZXIgZGVjb2RpbmcgdGhlIHBpY3R1cmUuIFRoZSBoaWdoZXIgdGhlIHZhbHVlIHRoZSBzbW9vdGhlciB0aGUgcGljdHVyZSB3aWxsCithcHBlYXIuIFR5cGljYWwgdmFsdWVzIGFyZSB1c3VhbGx5IGluIHRoZSByYW5nZSBvZiAyMCB0byA1MC4KKy5UUAorLkJJIFwtc2hhcnBuZXNzICIgaW50CitTcGVjaWZ5IHRoZSBzaGFycG5lc3Mgb2YgdGhlIGZpbHRlcmluZyAoaWYgdXNlZCkuCitSYW5nZSBpcyAwIChzaGFycGVzdCkgdG8gNyAobGVhc3Qgc2hhcnApLiBEZWZhdWx0IGlzIDAuCisuVFAKKy5CIFwtc3Ryb25nCitVc2Ugc3Ryb25nIGZpbHRlcmluZyAoaWYgZmlsdGVyaW5nIGlzIGJlaW5nIHVzZWQgdGhhbmtzIHRvIHRoZQorXGZCXC1mXGZQIG9wdGlvbikuIFN0cm9uZyBmaWx0ZXJpbmcgaXMgb24gYnkgZGVmYXVsdC4KKy5UUAorLkIgXC1ub3N0cm9uZworRGlzYWJsZSBzdHJvbmcgZmlsdGVyaW5nIChpZiBmaWx0ZXJpbmcgaXMgYmVpbmcgdXNlZCB0aGFua3MgdG8gdGhlCitcZkJcLWZcZlAgb3B0aW9uKSBhbmQgdXNlIHNpbXBsZSBmaWx0ZXJpbmcgaW5zdGVhZC4KKy5UUAorLkIgXC1zaGFycF95dXYKK1VzZSBtb3JlIGFjY3VyYXRlIGFuZCBzaGFycGVyIFJHQi0+WVVWIGNvbnZlcnNpb24gaWYgbmVlZGVkLiBOb3RlIHRoYXQgdGhpcworcHJvY2VzcyBpcyBzbG93ZXIgdGhhbiB0aGUgZGVmYXVsdCAnZmFzdCcgUkdCLT5ZVVYgY29udmVyc2lvbi4KKy5UUAorLkJJIFwtc25zICIgaW50CitTcGVjaWZ5IHRoZSBhbXBsaXR1ZGUgb2YgdGhlIHNwYXRpYWwgbm9pc2Ugc2hhcGluZy4gU3BhdGlhbCBub2lzZSBzaGFwaW5nCisob3IgXGZCc25zXGZQIGZvciBzaG9ydCkgcmVmZXJzIHRvIGEgZ2VuZXJhbCBjb2xsZWN0aW9uIG9mIGJ1aWx0XC1pbiBhbGdvcml0aG1zCit1c2VkIHRvIGRlY2lkZSB3aGljaCBhcmVhIG9mIHRoZSBwaWN0dXJlIHNob3VsZCB1c2UgcmVsYXRpdmVseSBsZXNzIGJpdHMsCithbmQgd2hlcmUgZWxzZSB0byBiZXR0ZXIgdHJhbnNmZXIgdGhlc2UgYml0cy4gVGhlIHBvc3NpYmxlIHJhbmdlIGdvZXMgZnJvbQorMCAoYWxnb3JpdGhtIGlzIG9mZikgdG8gMTAwICh0aGUgbWF4aW1hbCBlZmZlY3QpLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA1MC4KKy5UUAorLkJJIFwtc2VnbWVudHMgIiBpbnQKK0NoYW5nZSB0aGUgbnVtYmVyIG9mIHBhcnRpdGlvbnMgdG8gdXNlIGR1cmluZyB0aGUgc2VnbWVudGF0aW9uIG9mIHRoZQorc25zIGFsZ29yaXRobS4gU2VnbWVudHMgc2hvdWxkIGJlIGluIHJhbmdlIDEgdG8gNC4gRGVmYXVsdCB2YWx1ZSBpcyA0LgorVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBmb3IgbWV0aG9kcyAzIGFuZCB1cCwgdW5sZXNzIFxmQlwtbG93X21lbW9yeVxmUAoraXMgdXNlZC4KKy5UUAorLkJJIFwtcGFydGl0aW9uX2xpbWl0ICIgaW50CitEZWdyYWRlIHF1YWxpdHkgYnkgbGltaXRpbmcgdGhlIG51bWJlciBvZiBiaXRzIHVzZWQgYnkgc29tZSBtYWNyb2Jsb2Nrcy4KK1JhbmdlIGlzIDAgKG5vIGRlZ3JhZGF0aW9uLCB0aGUgZGVmYXVsdCkgdG8gMTAwIChmdWxsIGRlZ3JhZGF0aW9uKS4KK1VzZWZ1bCB2YWx1ZXMgYXJlIHVzdWFsbHkgYXJvdW5kIDMwXC03MCBmb3IgbW9kZXJhdGVseSBsYXJnZSBpbWFnZXMuCitJbiB0aGUgVlA4IGZvcm1hdCwgdGhlIHNvXC1jYWxsZWQgY29udHJvbCBwYXJ0aXRpb24gaGFzIGEgbGltaXQgb2YgNTEyayBhbmQKK2lzIHVzZWQgdG8gc3RvcmUgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbjogd2hldGhlciB0aGUgbWFjcm9ibG9jayBpcyBza2lwcGVkLAord2hpY2ggc2VnbWVudCBpdCBiZWxvbmdzIHRvLCB3aGV0aGVyIGl0IGlzIGNvZGVkIGFzIGludHJhIDR4NCBvciBpbnRyYSAxNngxNgorbW9kZSwgYW5kIGZpbmFsbHkgdGhlIHByZWRpY3Rpb24gbW9kZXMgdG8gdXNlIGZvciBlYWNoIG9mIHRoZSBzdWJcLWJsb2Nrcy4KK0ZvciBhIHZlcnkgbGFyZ2UgaW1hZ2UsIDUxMmsgb25seSBsZWF2ZXMgcm9vbSB0byBmZXcgYml0cyBwZXIgMTZ4MTYgbWFjcm9ibG9jay4KK1RoZSBhYnNvbHV0ZSBtaW5pbXVtIGlzIDQgYml0cyBwZXIgbWFjcm9ibG9jay4gU2tpcCwgc2VnbWVudCwgYW5kIG1vZGUKK2luZm9ybWF0aW9uIGNhbiB1c2UgdXAgYWxtb3N0IGFsbCB0aGVzZSA0IGJpdHMgKGFsdGhvdWdoIHRoZSBjYXNlIGlzIHVubGlrZWx5KSwKK3doaWNoIGlzIHByb2JsZW1hdGljIGZvciB2ZXJ5IGxhcmdlIGltYWdlcy4gVGhlIHBhcnRpdGlvbl9saW1pdCBmYWN0b3IgY29udHJvbHMKK2hvdyBmcmVxdWVudGx5IHRoZSBtb3N0IGJpdFwtY29zdGx5IG1vZGUgKGludHJhIDR4NCkgd2lsbCBiZSB1c2VkLiBUaGlzIGlzCit1c2VmdWwgaW4gY2FzZSB0aGUgNTEyayBsaW1pdCBpcyByZWFjaGVkIGFuZCB0aGUgZm9sbG93aW5nIG1lc3NhZ2UgaXMgZGlzcGxheWVkOgorXGZJRXJyb3IgY29kZTogNiAoUEFSVElUSU9OMF9PVkVSRkxPVzogUGFydGl0aW9uICMwIGlzIHRvbyBiaWcgdG8gZml0IDUxMmspXGZQLgorSWYgdXNpbmcgXGZCXC1wYXJ0aXRpb25fbGltaXRcZlAgaXMgbm90IGVub3VnaCB0byBtZWV0IHRoZSA1MTJrIGNvbnN0cmFpbnQsIG9uZQorc2hvdWxkIHVzZSBsZXNzIHNlZ21lbnRzIGluIG9yZGVyIHRvIHNhdmUgbW9yZSBoZWFkZXIgYml0cyBwZXIgbWFjcm9ibG9jay4KK1NlZSB0aGUgXGZCXC1zZWdtZW50c1xmUCBvcHRpb24uCisKKy5TUyBMT0dHSU5HIE9QVElPTlMKK1RoZXNlIG9wdGlvbnMgY29udHJvbCB0aGUgbGV2ZWwgb2Ygb3V0cHV0OgorLlRQCisuQiBcLXYKK1ByaW50IGV4dHJhIGluZm9ybWF0aW9uIChlbmNvZGluZyB0aW1lIGluIHBhcnRpY3VsYXIpLgorLlRQCisuQiBcLXByaW50X3BzbnIKK0NvbXB1dGUgYW5kIHJlcG9ydCBhdmVyYWdlIFBTTlIgKFBlYWtcLVNpZ25hbFwtVG9cLU5vaXNlIHJhdGlvKS4KKy5UUAorLkIgXC1wcmludF9zc2ltCitDb21wdXRlIGFuZCByZXBvcnQgYXZlcmFnZSBTU0lNIChzdHJ1Y3R1cmFsIHNpbWlsYXJpdHkKK21ldHJpYywgc2VlIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU1NJTSBmb3IgYWRkaXRpb25hbCBkZXRhaWxzKS4KKy5UUAorLkIgXC1wcmludF9sc2ltCitDb21wdXRlIGFuZCByZXBvcnQgbG9jYWwgc2ltaWxhcml0eSBtZXRyaWMgKHN1bSBvZiBsb3dlc3QgZXJyb3IgYW1vbmdzdCB0aGUKK2NvbGxvY2F0ZWQgcGl4ZWwgbmVpZ2hib3JzKS4KKy5UUAorLkIgXC1wcm9ncmVzcworUmVwb3J0IGVuY29kaW5nIHByb2dyZXNzIGluIHBlcmNlbnQuCisuVFAKKy5CIFwtcXVpZXQKK0RvIG5vdCBwcmludCBhbnl0aGluZy4KKy5UUAorLkIgXC1zaG9ydAorT25seSBwcmludCBicmllZiBpbmZvcm1hdGlvbiAob3V0cHV0IGZpbGUgc2l6ZSBhbmQgUFNOUikgZm9yIHRlc3RpbmcgcHVycG9zZXMuCisuVFAKKy5CSSBcLW1hcCAiIGludAorT3V0cHV0IGFkZGl0aW9uYWwgQVNDSUlcLW1hcCBvZiBlbmNvZGluZyBpbmZvcm1hdGlvbi4gUG9zc2libGUgbWFwIHZhbHVlcworcmFuZ2UgZnJvbSAxIHRvIDYuIFRoaXMgaXMgb25seSBtZWFudCB0byBoZWxwIGRlYnVnZ2luZy4KKworLlNTIEFERElUSU9OQUwgT1BUSU9OUworTW9yZSBhZHZhbmNlZCBvcHRpb25zIGFyZToKKy5UUAorLkJJIFwtcyAiIHdpZHRoIGhlaWdodAorU3BlY2lmeSB0aGF0IHRoZSBpbnB1dCBmaWxlIGFjdHVhbGx5IGNvbnNpc3RzIG9mIHJhdyBZJ0NiQ3Igc2FtcGxlcyBmb2xsb3dpbmcKK3RoZSBJVFVcLVIgQlQuNjAxIHJlY29tbWVuZGF0aW9uLCBpbiA0OjI6MCBsaW5lYXIgZm9ybWF0LgorVGhlIGx1bWEgcGxhbmUgaGFzIHNpemUgXGZCd2lkdGhcZlAgeCBcZkJoZWlnaHRcZlAuCisuVFAKKy5CSSBcLXByZSAiIGludAorU3BlY2lmeSBzb21lIHByZXByb2Nlc3Npbmcgc3RlcHMuIFVzaW5nIGEgdmFsdWUgb2YgJzInIHdpbGwgdHJpZ2dlcgorcXVhbGl0eVwtZGVwZW5kZW50IHBzZXVkb1wtcmFuZG9tIGRpdGhlcmluZyBkdXJpbmcgUkdCQVwtPllVVkEgY29udmVyc2lvbgorKGxvc3N5IGNvbXByZXNzaW9uIG9ubHkpLgorLlRQCisuQkkgXC1hbHBoYV9maWx0ZXIgIiBzdHJpbmcKK1NwZWNpZnkgdGhlIHByZWRpY3RpdmUgZmlsdGVyaW5nIG1ldGhvZCBmb3IgdGhlIGFscGhhIHBsYW5lLiBPbmUgb2YgJ25vbmUnLAorXCYnZmFzdCcgb3IgJ2Jlc3QnLCBpbiBpbmNyZWFzaW5nIGNvbXBsZXhpdHkgYW5kIHNsb3duZXNzIG9yZGVyLiBEZWZhdWx0IGlzCitcJidmYXN0Jy4gSW50ZXJuYWxseSwgYWxwaGEgZmlsdGVyaW5nIGlzIHBlcmZvcm1lZCB1c2luZyBmb3VyIHBvc3NpYmxlCitwcmVkaWN0aW9ucyAobm9uZSwgaG9yaXpvbnRhbCwgdmVydGljYWwsIGdyYWRpZW50KS4gVGhlICdiZXN0JyBtb2RlIHdpbGwgdHJ5CitlYWNoIG1vZGUgaW4gdHVybiBhbmQgcGljayB0aGUgb25lIHdoaWNoIGdpdmVzIHRoZSBzbWFsbGVyIHNpemUuIFRoZSAnZmFzdCcKK21vZGUgd2lsbCBqdXN0IHRyeSB0byBmb3JtIGFuIGEgcHJpb3JpIGd1ZXNzIHdpdGhvdXQgdGVzdGluZyBhbGwgbW9kZXMuCisuVFAKKy5CSSBcLWFscGhhX21ldGhvZCAiIGludAorU3BlY2lmeSB0aGUgYWxnb3JpdGhtIHVzZWQgZm9yIGFscGhhIGNvbXByZXNzaW9uOiAwIG9yIDEuIEFsZ29yaXRobSAwIGRlbm90ZXMKK25vIGNvbXByZXNzaW9uLCAxIHVzZXMgV2ViUCBsb3NzbGVzcyBmb3JtYXQgZm9yIGNvbXByZXNzaW9uLiBUaGUgZGVmYXVsdCBpcyAxLgorLlRQCisuQiBcLWV4YWN0CitQcmVzZXJ2ZSBSR0IgdmFsdWVzIGluIHRyYW5zcGFyZW50IGFyZWEuIFRoZSBkZWZhdWx0IGlzIG9mZiwgdG8gaGVscAorY29tcHJlc3NpYmlsaXR5LgorLlRQCisuQkkgXC1ibGVuZF9hbHBoYSAiIGludAorVGhpcyBvcHRpb24gYmxlbmRzIHRoZSBhbHBoYSBjaGFubmVsIChpZiBwcmVzZW50KSB3aXRoIHRoZSBzb3VyY2UgdXNpbmcgdGhlCitiYWNrZ3JvdW5kIGNvbG9yIHNwZWNpZmllZCBpbiBoZXhhZGVjaW1hbCBhcyAweHJyZ2diYi4gVGhlIGFscGhhIGNoYW5uZWwgaXMKK2FmdGVyd2FyZCByZXNldCB0byB0aGUgb3BhcXVlIHZhbHVlIDI1NS4KKy5UUAorLkIgXC1ub2FscGhhCitVc2luZyB0aGlzIG9wdGlvbiB3aWxsIGRpc2NhcmQgdGhlIGFscGhhIGNoYW5uZWwuCisuVFAKKy5CSSBcLWhpbnQgIiBzdHJpbmcKK1NwZWNpZnkgdGhlIGhpbnQgYWJvdXQgaW5wdXQgaW1hZ2UgdHlwZS4gUG9zc2libGUgdmFsdWVzIGFyZToKK1xmQnBob3RvXGZQLCBcZkJwaWN0dXJlXGZQIG9yIFxmQmdyYXBoXGZQLgorLlRQCisuQkkgXC1tZXRhZGF0YSAiIHN0cmluZworQSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBtZXRhZGF0YSB0byBjb3B5IGZyb20gdGhlIGlucHV0IHRvIHRoZSBvdXRwdXQgaWYKK3ByZXNlbnQuCitWYWxpZCB2YWx1ZXM6IFxmQmFsbFxmUCwgXGZCbm9uZVxmUCwgXGZCZXhpZlxmUCwgXGZCaWNjXGZQLCBcZkJ4bXBcZlAuCitUaGUgZGVmYXVsdCBpcyBcZkJub25lXGZQLgorCitOb3RlOiBlYWNoIGlucHV0IGZvcm1hdCBtYXkgbm90IHN1cHBvcnQgYWxsIGNvbWJpbmF0aW9ucy4KKy5UUAorLkIgXC1ub2FzbQorRGlzYWJsZSBhbGwgYXNzZW1ibHkgb3B0aW1pemF0aW9ucy4KKworLlNIIEJVR1MKK1BsZWFzZSByZXBvcnQgYWxsIGJ1Z3MgdG8gdGhlIGlzc3VlIHRyYWNrZXI6CitodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avd2VicAorLmJyCitQYXRjaGVzIHdlbGNvbWUhIFNlZSB0aGlzIHBhZ2UgdG8gZ2V0IHN0YXJ0ZWQ6CitodHRwOi8vd3d3LndlYm1wcm9qZWN0Lm9yZy9jb2RlL2NvbnRyaWJ1dGUvc3VibWl0dGluZ1wtcGF0Y2hlcy8KKworLlNIIEVYQU1QTEVTCitjd2VicCBcLXEgNTAgLWxvc3NsZXNzIHBpY3R1cmUucG5nIFwtbyBwaWN0dXJlX2xvc3NsZXNzLndlYnAKKy5icgorY3dlYnAgXC1xIDcwIHBpY3R1cmVfd2l0aF9hbHBoYS5wbmcgXC1vIHBpY3R1cmVfd2l0aF9hbHBoYS53ZWJwCisuYnIKK2N3ZWJwIFwtc25zIDcwIFwtZiA1MCBcLXNpemUgNjAwMDAgcGljdHVyZS5wbmcgXC1vIHBpY3R1cmUud2VicAorLmJyCitjd2VicCBcLW8gcGljdHVyZS53ZWJwIFwtXC0gXC1cLVwtcGljdHVyZS5wbmcKKworLlNIIEFVVEhPUlMKK1xmQmN3ZWJwXGZQIGlzIGEgcGFydCBvZiBsaWJ3ZWJwIGFuZCB3YXMgd3JpdHRlbiBieSB0aGUgV2ViUCB0ZWFtLgorLmJyCitUaGUgbGF0ZXN0IHNvdXJjZSB0cmVlIGlzIGF2YWlsYWJsZSBhdAoraHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL3dlYm0vbGlid2VicAorLlBQCitUaGlzIG1hbnVhbCBwYWdlIHdhcyB3cml0dGVuIGJ5IFBhc2NhbCBNYXNzaW1pbm8gPHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tPiwKK2ZvciB0aGUgRGViaWFuIHByb2plY3QgKGFuZCBtYXkgYmUgdXNlZCBieSBvdGhlcnMpLgorCisuU0ggU0VFIEFMU08KKy5CUiBkd2VicCAoMSksCisuQlIgZ2lmMndlYnAgKDEpCisuYnIKK1BsZWFzZSByZWZlciB0byBodHRwOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3NwZWVkL3dlYnAvIGZvciBhZGRpdGlvbmFsCitpbmZvcm1hdGlvbi4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL21hbi9kd2VicC4xIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvbWFuL2R3ZWJwLjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRiNjBlZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL21hbi9kd2VicC4xCkBAIC0wLDAgKzEsMTQ5IEBACisuXCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhleSwgRU1BQ1M6IC0qLSBucm9mZiAtKi0KKy5USCBEV0VCUCAxICJKdW5lIDIzLCAyMDE2IgorLlNIIE5BTUUKK2R3ZWJwIFwtIGRlY29tcHJlc3MgYSBXZWJQIGZpbGUgdG8gYW4gaW1hZ2UgZmlsZQorLlNIIFNZTk9QU0lTCisuQiBkd2VicAorLlJJIFsgb3B0aW9ucyBdICIgaW5wdXRfZmlsZS53ZWJwCisuYnIKKy5TSCBERVNDUklQVElPTgorVGhpcyBtYW51YWwgcGFnZSBkb2N1bWVudHMgdGhlCisuQiBkd2VicAorY29tbWFuZC4KKy5QUAorXGZCZHdlYnBcZlAgZGVjb21wcmVzc2VzIFdlYlAgZmlsZXMgaW50byBQTkcsIFBBTSwgUFBNIG9yIFBHTSBpbWFnZXMuCisuU0ggT1BUSU9OUworVGhlIGJhc2ljIG9wdGlvbnMgYXJlOgorLlRQCisuQiBcLWgKK1ByaW50IHVzYWdlIHN1bW1hcnkuCisuVFAKKy5CIFwtdmVyc2lvbgorUHJpbnQgdGhlIHZlcnNpb24gbnVtYmVyIChhcyBtYWpvci5taW5vci5yZXZpc2lvbikgYW5kIGV4aXQuCisuVFAKKy5CSSBcLW8gIiBzdHJpbmcKK1NwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIG91dHB1dCBmaWxlIChhcyBQTkcgZm9ybWF0IGJ5IGRlZmF1bHQpLgorVXNpbmcgIi0iIGFzIG91dHB1dCBuYW1lIHdpbGwgZGlyZWN0IG91dHB1dCB0byAnc3Rkb3V0Jy4KKy5UUAorLkJJIFwtXC0gIiBzdHJpbmcKK0V4cGxpY2l0bHkgc3BlY2lmeSB0aGUgaW5wdXQgZmlsZS4gVGhpcyBvcHRpb24gaXMgdXNlZnVsIGlmIHRoZSBpbnB1dAorZmlsZSBzdGFydHMgd2l0aCBhbiAnXC0nIGZvciBpbnN0YW5jZS4gVGhpcyBvcHRpb24gbXVzdCBhcHBlYXIgXGZCbGFzdFxmUC4KK0FueSBvdGhlciBvcHRpb25zIGFmdGVyd2FyZCB3aWxsIGJlIGlnbm9yZWQuIElmIHRoZSBpbnB1dCBmaWxlIGlzICJcLSIsCit0aGUgZGF0YSB3aWxsIGJlIHJlYWQgZnJvbSBcZklzdGRpblxmUCBpbnN0ZWFkIG9mIGEgZmlsZS4KKy5UUAorLkIgXC1ibXAKK0NoYW5nZSB0aGUgb3V0cHV0IGZvcm1hdCB0byB1bmNvbXByZXNzZWQgQk1QLgorLlRQCisuQiBcLXRpZmYKK0NoYW5nZSB0aGUgb3V0cHV0IGZvcm1hdCB0byB1bmNvbXByZXNzZWQgVElGRi4KKy5UUAorLkIgXC1wYW0KK0NoYW5nZSB0aGUgb3V0cHV0IGZvcm1hdCB0byBQQU0gKHJldGFpbnMgYWxwaGEpLgorLlRQCisuQiBcLXBwbQorQ2hhbmdlIHRoZSBvdXRwdXQgZm9ybWF0IHRvIFBQTSAoZGlzY2FyZHMgYWxwaGEpLgorLlRQCisuQiBcLXBnbQorQ2hhbmdlIHRoZSBvdXRwdXQgZm9ybWF0IHRvIFBHTS4gVGhlIG91dHB1dCBjb25zaXN0cyBvZiBsdW1hL2Nocm9tYQorc2FtcGxlcyBpbnN0ZWFkIG9mIFJHQiwgdXNpbmcgdGhlIElNQzQgbGF5b3V0LiBUaGlzIG9wdGlvbiBpcyBtYWlubHkKK2ZvciB2ZXJpZmljYXRpb24gYW5kIGRlYnVnZ2luZyBwdXJwb3Nlcy4KKy5UUAorLkIgXC15dXYKK0NoYW5nZSB0aGUgb3V0cHV0IGZvcm1hdCB0byByYXcgWVVWLiBUaGUgb3V0cHV0IGNvbnNpc3RzIG9mCitsdW1hL2Nocm9tYS1VL2Nocm9tYS1WIHNhbXBsZXMgaW5zdGVhZCBvZiBSR0IsIHNhdmVkIHNlcXVlbnRpYWxseSBhcworaW5kaXZpZHVhbCBwbGFuZXMuIFRoaXMgb3B0aW9uIGlzIG1haW5seSBmb3IgdmVyaWZpY2F0aW9uIGFuZCBkZWJ1Z2dpbmcKK3B1cnBvc2VzLgorLlRQCisuQiBcLW5vZmFuY3kKK0Rvbid0IHVzZSB0aGUgZmFuY3kgdXBzY2FsZXIgZm9yIFlVVjQyMC4gVGhpcyBtYXkgbGVhZCB0byBqYWdneQorZWRnZXMgKGVzcGVjaWFsbHkgdGhlIHJlZCBvbmVzKSwgYnV0IHNob3VsZCBiZSBmYXN0ZXIuCisuVFAKKy5CIFwtbm9maWx0ZXIKK0Rvbid0IHVzZSB0aGUgaW4tbG9vcCBmaWx0ZXJpbmcgcHJvY2VzcyBldmVuIGlmIGl0IGlzIHJlcXVpcmVkIGJ5Cit0aGUgYml0c3RyZWFtLiBUaGlzIG1heSBwcm9kdWNlIHZpc2libGUgYmxvY2tzIG9uIHRoZSBub24tY29tcGxpYW50IG91dHB1dCwKK2J1dCBpdCB3aWxsIG1ha2UgdGhlIGRlY29kaW5nIGZhc3Rlci4KKy5UUAorLkJJIFwtZGl0aGVyICIgc3RyZW5ndGgKK1NwZWNpZnkgYSBkaXRoZXJpbmcgXGZCc3RyZW5ndGhcZlAgYmV0d2VlbiAwIGFuZCAxMDAuIERpdGhlcmluZyBpcyBhCitwb3N0LXByb2Nlc3NpbmcgZWZmZWN0IGFwcGxpZWQgdG8gY2hyb21hIGNvbXBvbmVudHMgaW4gbG9zc3kgY29tcHJlc3Npb24uCitJdCBoZWxwcyBieSBzbW9vdGhpbmcgZ3JhZGllbnRzIGFuZCBhdm9pZGluZyBiYW5kaW5nIGFydGlmYWN0cy4KKy5UUAorLkJJIFwtYWxwaGFfZGl0aGVyCitJZiB0aGUgY29tcHJlc3NlZCBmaWxlIGNvbnRhaW5zIGEgdHJhbnNwYXJlbmN5IHBsYW5lIHRoYXQgd2FzIHF1YW50aXplZAorZHVyaW5nIGNvbXByZXNzaW9uLCB0aGlzIGZsYWcgd2lsbCBhbGxvdyBkaXRoZXJpbmcgdGhlIHJlY29uc3RydWN0ZWQgcGxhbmUKK2luIG9yZGVyIHRvIGdlbmVyYXRlIHNtb290aGVyIHRyYW5zcGFyZW5jeSBncmFkaWVudHMuCisuVFAKKy5CIFwtbm9kaXRoZXIKK0Rpc2FibGUgYWxsIGRpdGhlcmluZyAoZGVmYXVsdCkuCisuVFAKKy5CIFwtbXQKK1VzZSBtdWx0aS10aHJlYWRpbmcgZm9yIGRlY29kaW5nLCBpZiBwb3NzaWJsZS4KKy5UUAorLkJJIFwtY3JvcCAiIHhfcG9zaXRpb24geV9wb3NpdGlvbiB3aWR0aCBoZWlnaHQKK0Nyb3AgdGhlIGRlY29kZWQgcGljdHVyZSB0byBhIHJlY3RhbmdsZSB3aXRoIHRvcC1sZWZ0IGNvcm5lciBhdCBjb29yZGluYXRlcworKFxmQnhfcG9zaXRpb25cZlAsIFxmQnlfcG9zaXRpb25cZlApIGFuZCBzaXplIFxmQndpZHRoXGZQIHggXGZCaGVpZ2h0XGZQLgorVGhpcyBjcm9wcGluZyBhcmVhIG11c3QgYmUgZnVsbHkgY29udGFpbmVkIHdpdGhpbiB0aGUgc291cmNlIHJlY3RhbmdsZS4KK1RoZSB0b3AtbGVmdCBjb3JuZXIgd2lsbCBiZSBzbmFwcGVkIHRvIGV2ZW4gY29vcmRpbmF0ZXMgaWYgbmVlZGVkLgorVGhpcyBvcHRpb24gaXMgbWVhbnQgdG8gcmVkdWNlIHRoZSBtZW1vcnkgbmVlZGVkIGZvciBjcm9wcGluZyBsYXJnZSBpbWFnZXMuCitOb3RlOiB0aGUgY3JvcHBpbmcgaXMgYXBwbGllZCBcZkliZWZvcmVcZlAgYW55IHNjYWxpbmcuCisuVFAKKy5CIFwtZmxpcAorRmxpcCBkZWNvZGVkIGltYWdlIHZlcnRpY2FsbHkgKGNhbiBiZSB1c2VmdWwgZm9yIE9wZW5HTCB0ZXh0dXJlcyBmb3IgaW5zdGFuY2UpLgorLlRQCitcZkJcLXJlc2l6ZVxmUiwgXGZCXC1zY2FsZVxmSSB3aWR0aCBoZWlnaHRcZlIKK1Jlc2NhbGUgdGhlIGRlY29kZWQgcGljdHVyZSB0byBkaW1lbnNpb24gXGZCd2lkdGhcZlAgeCBcZkJoZWlnaHRcZlAuIFRoaXMKK29wdGlvbiBpcyBtb3N0bHkgaW50ZW5kZWQgdG8gcmVkdWNpbmcgdGhlIG1lbW9yeSBuZWVkZWQgdG8gZGVjb2RlIGxhcmdlIGltYWdlcywKK3doZW4gb25seSBhIHNtYWxsIHZlcnNpb24gaXMgbmVlZGVkICh0aHVtYm5haWwsIHByZXZpZXcsIGV0Yy4pLiBOb3RlOiBzY2FsaW5nCitpcyBhcHBsaWVkIFxmSWFmdGVyXGZQIGNyb3BwaW5nLgorSWYgZWl0aGVyIChidXQgbm90IGJvdGgpIG9mIHRoZSBcZkJ3aWR0aFxmUCBvciBcZkJoZWlnaHRcZlAgcGFyYW1ldGVycyBpcyAwLAordGhlIHZhbHVlIHdpbGwgYmUgY2FsY3VsYXRlZCBwcmVzZXJ2aW5nIHRoZSBhc3BlY3QtcmF0aW8uCisuVFAKKy5CIFwtcXVpZXQKK0RvIG5vdCBwcmludCBhbnl0aGluZy4KKy5UUAorLkIgXC12CitQcmludCBleHRyYSBpbmZvcm1hdGlvbiAoZGVjb2RpbmcgdGltZSBpbiBwYXJ0aWN1bGFyKS4KKy5UUAorLkIgXC1ub2FzbQorRGlzYWJsZSBhbGwgYXNzZW1ibHkgb3B0aW1pemF0aW9ucy4KKworLlNIIEJVR1MKK1BsZWFzZSByZXBvcnQgYWxsIGJ1Z3MgdG8gdGhlIGlzc3VlIHRyYWNrZXI6CitodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avd2VicAorLmJyCitQYXRjaGVzIHdlbGNvbWUhIFNlZSB0aGlzIHBhZ2UgdG8gZ2V0IHN0YXJ0ZWQ6CitodHRwOi8vd3d3LndlYm1wcm9qZWN0Lm9yZy9jb2RlL2NvbnRyaWJ1dGUvc3VibWl0dGluZy1wYXRjaGVzLworCisuU0ggRVhBTVBMRVMKK2R3ZWJwIHBpY3R1cmUud2VicCBcLW8gb3V0cHV0LnBuZworLmJyCitkd2VicCBwaWN0dXJlLndlYnAgXC1wcG0gXC1vIG91dHB1dC5wcG0KKy5icgorZHdlYnAgXC1vIG91dHB1dC5wcG0gXC1cLSBcLVwtXC1waWN0dXJlLndlYnAKKy5icgorY2F0IHBpY3R1cmUud2VicCB8IGR3ZWJwIFwtbyBcLSBcLVwtIFwtID4gb3V0cHV0LnBwbQorCisuU0ggQVVUSE9SUworXGZCZHdlYnBcZlAgaXMgYSBwYXJ0IG9mIGxpYndlYnAgYW5kIHdhcyB3cml0dGVuIGJ5IHRoZSBXZWJQIHRlYW0uCisuYnIKK1RoZSBsYXRlc3Qgc291cmNlIHRyZWUgaXMgYXZhaWxhYmxlIGF0CitodHRwczovL2Nocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vd2VibS9saWJ3ZWJwCisuUFAKK1RoaXMgbWFudWFsIHBhZ2Ugd2FzIHdyaXR0ZW4gYnkgUGFzY2FsIE1hc3NpbWlubyA8cGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20+LAorZm9yIHRoZSBEZWJpYW4gcHJvamVjdCAoYW5kIG1heSBiZSB1c2VkIGJ5IG90aGVycykuCisKKy5TSCBTRUUgQUxTTworLkJSIGN3ZWJwICgxKSwKKy5CUiBnaWYyd2VicCAoMSksCisuQlIgd2VicG11eCAoMSkKKy5icgorUGxlYXNlIHJlZmVyIHRvIGh0dHA6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vc3BlZWQvd2VicC8gZm9yIGFkZGl0aW9uYWwKK2luZm9ybWF0aW9uLgorLlNTIE91dHB1dCBmaWxlIGZvcm1hdCBkZXRhaWxzCitQQU06IGh0dHA6Ly9uZXRwYm0uc291cmNlZm9yZ2UubmV0L2RvYy9wYW0uaHRtbAorLmJyCitQR006IGh0dHA6Ly9uZXRwYm0uc291cmNlZm9yZ2UubmV0L2RvYy9wZ20uaHRtbAorLmJyCitQUE06IGh0dHA6Ly9uZXRwYm0uc291cmNlZm9yZ2UubmV0L2RvYy9wcG0uaHRtbAorLmJyCitQTkc6IGh0dHA6Ly93d3cubGlicG5nLm9yZy9wdWIvcG5nL3BuZy1zaXRlbWFwLmh0bWwjaW5mbwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvbWFuL2dpZjJ3ZWJwLjEgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9tYW4vZ2lmMndlYnAuMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTRmMmVlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvbWFuL2dpZjJ3ZWJwLjEKQEAgLTAsMCArMSwxNjQgQEAKKy5cIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGV5LCBFTUFDUzogLSotIG5yb2ZmIC0qLQorLlRIIEdJRjJXRUJQIDEgIkphbnVhcnkgMjUsIDIwMTgiCisuU0ggTkFNRQorZ2lmMndlYnAgXC0gQ29udmVydCBhIEdJRiBpbWFnZSB0byBXZWJQCisuU0ggU1lOT1BTSVMKKy5CIGdpZjJ3ZWJwCisuUkkgWyBvcHRpb25zIF0gIiBpbnB1dF9maWxlLmdpZiBcLW8gb3V0cHV0X2ZpbGUud2VicAorLmJyCisuU0ggREVTQ1JJUFRJT04KK1RoaXMgbWFudWFsIHBhZ2UgZG9jdW1lbnRzIHRoZQorLkIgZ2lmMndlYnAKK2NvbW1hbmQuCisuUFAKK1xmQmdpZjJ3ZWJwXGZQIGNvbnZlcnRzIGEgR0lGIGltYWdlIHRvIGEgV2ViUCBpbWFnZS4KKy5TSCBPUFRJT05TCitUaGUgYmFzaWMgb3B0aW9ucyBhcmU6CisuVFAKKy5CSSBcLW8gIiBzdHJpbmcKK1NwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIG91dHB1dCBXZWJQIGZpbGUuIElmIG9taXR0ZWQsIFxmQmdpZjJ3ZWJwXGZQIHdpbGwKK3BlcmZvcm0gY29udmVyc2lvbiBidXQgb25seSByZXBvcnQgc3RhdGlzdGljcy4KK1VzaW5nICJcLSIgYXMgb3V0cHV0IG5hbWUgd2lsbCBkaXJlY3Qgb3V0cHV0IHRvICdzdGRvdXQnLgorLlRQCisuQkkgXC1cLSAiIHN0cmluZworRXhwbGljaXRseSBzcGVjaWZ5IHRoZSBpbnB1dCBmaWxlLiBUaGlzIG9wdGlvbiBpcyB1c2VmdWwgaWYgdGhlIGlucHV0CitmaWxlIHN0YXJ0cyB3aXRoIGFuICdcLScgZm9yIGluc3RhbmNlLiBUaGlzIG9wdGlvbiBtdXN0IGFwcGVhciBcZkJsYXN0XGZQLgorQW55IG90aGVyIG9wdGlvbnMgYWZ0ZXJ3YXJkIHdpbGwgYmUgaWdub3JlZC4gSWYgdGhlIGlucHV0IGZpbGUgaXMgIlwtIiwKK3RoZSBkYXRhIHdpbGwgYmUgcmVhZCBmcm9tIFxmSXN0ZGluXGZQIGluc3RlYWQgb2YgYSBmaWxlLgorLlRQCisuQiBcLWgsIFwtaGVscAorVXNhZ2UgaW5mb3JtYXRpb24uCisuVFAKKy5CIFwtdmVyc2lvbgorUHJpbnQgdGhlIHZlcnNpb24gbnVtYmVyIChhcyBtYWpvci5taW5vci5yZXZpc2lvbikgYW5kIGV4aXQuCisuVFAKKy5CIFwtbG9zc3kKK0VuY29kZSB0aGUgaW1hZ2UgdXNpbmcgbG9zc3kgY29tcHJlc3Npb24uCisuVFAKKy5CIFwtbWl4ZWQKK01peGVkIGNvbXByZXNzaW9uIG1vZGU6IG9wdGltaXplIGNvbXByZXNzaW9uIG9mIHRoZSBpbWFnZSBieSBwaWNraW5nIGVpdGhlcgorbG9zc3kgb3IgbG9zc2xlc3MgY29tcHJlc3Npb24gZm9yIGVhY2ggZnJhbWUgaGV1cmlzdGljYWxseS4KKy5UUAorLkJJIFwtcSAiIGZsb2F0CitTcGVjaWZ5IHRoZSBjb21wcmVzc2lvbiBmYWN0b3IgZm9yIFJHQiBjaGFubmVscyBiZXR3ZWVuIDAgYW5kIDEwMC4gVGhlIGRlZmF1bHQKK2lzIDc1LgorLmJyCitJbiBjYXNlIG9mIGxvc3NsZXNzIGNvbXByZXNzaW9uIChkZWZhdWx0KSwgYSBzbWFsbCBmYWN0b3IgZW5hYmxlcyBmYXN0ZXIKK2NvbXByZXNzaW9uIHNwZWVkLCBidXQgcHJvZHVjZXMgYSBsYXJnZXIgZmlsZS4gTWF4aW11bSBjb21wcmVzc2lvbiBpcyBhY2hpZXZlZAorYnkgdXNpbmcgYSB2YWx1ZSBvZiAxMDAuCisuYnIKK0luIGNhc2Ugb2YgbG9zc3kgY29tcHJlc3Npb24gKHNwZWNpZmllZCBieSB0aGUgXC1sb3NzeSBvcHRpb24pLCBhIHNtYWxsIGZhY3RvcgorcHJvZHVjZXMgYSBzbWFsbGVyIGZpbGUgd2l0aCBsb3dlciBxdWFsaXR5LiBCZXN0IHF1YWxpdHkgaXMgYWNoaWV2ZWQgYnkgdXNpbmcgYQordmFsdWUgb2YgMTAwLgorLlRQCisuQkkgXC1tICIgaW50CitTcGVjaWZ5IHRoZSBjb21wcmVzc2lvbiBtZXRob2QgdG8gdXNlLiBUaGlzIHBhcmFtZXRlciBjb250cm9scyB0aGUKK3RyYWRlIG9mZiBiZXR3ZWVuIGVuY29kaW5nIHNwZWVkIGFuZCB0aGUgY29tcHJlc3NlZCBmaWxlIHNpemUgYW5kIHF1YWxpdHkuCitQb3NzaWJsZSB2YWx1ZXMgcmFuZ2UgZnJvbSAwIHRvIDYuIERlZmF1bHQgdmFsdWUgaXMgNC4KK1doZW4gaGlnaGVyIHZhbHVlcyBhcmUgdXNlZCwgdGhlIGVuY29kZXIgd2lsbCBzcGVuZCBtb3JlIHRpbWUgaW5zcGVjdGluZworYWRkaXRpb25hbCBlbmNvZGluZyBwb3NzaWJpbGl0aWVzIGFuZCBkZWNpZGUgb24gdGhlIHF1YWxpdHkgZ2Fpbi4KK0xvd2VyIHZhbHVlIGNhbiByZXN1bHQgaXMgZmFzdGVyIHByb2Nlc3NpbmcgdGltZSBhdCB0aGUgZXhwZW5zZSBvZgorbGFyZ2VyIGZpbGUgc2l6ZSBhbmQgbG93ZXIgY29tcHJlc3Npb24gcXVhbGl0eS4KKy5UUAorLkJJIFwtbWluX3NpemUKK0VuY29kZSBpbWFnZSB0byBhY2hpZXZlIHNtYWxsZXN0IHNpemUuIFRoaXMgZGlzYWJsZXMga2V5IGZyYW1lIGluc2VydGlvbiBhbmQKK3BpY2tzIHRoZSBkaXNwb3NlIG1ldGhvZCByZXN1bHRpbmcgaW4gc21hbGxlc3Qgb3V0cHV0IGZvciBlYWNoIGZyYW1lLiBJdCB1c2VzCitsb3NzbGVzcyBjb21wcmVzc2lvbiBieSBkZWZhdWx0LCBidXQgY2FuIGJlIGNvbWJpbmVkIHdpdGggXC1xLCBcLW0sIFwtbG9zc3kgb3IKK1wtbWl4ZWQgb3B0aW9ucy4KKy5UUAorLkJJIFwta21pbiAiIGludAorLlRQCisuQkkgXC1rbWF4ICIgaW50CitTcGVjaWZ5IHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIGRpc3RhbmNlIGJldHdlZW4gY29uc2VjdXRpdmUga2V5IGZyYW1lcworKGluZGVwZW5kZW50bHkgZGVjb2RhYmxlIGZyYW1lcykgaW4gdGhlIG91dHB1dCBhbmltYXRpb24uIFRoZSB0b29sIHdpbGwgaW5zZXJ0Citzb21lIGtleSBmcmFtZXMgaW50byB0aGUgb3V0cHV0IGFuaW1hdGlvbiBhcyBuZWVkZWQgc28gdGhhdCB0aGlzIGNyaXRlcmlhIGlzCitzYXRpc2ZpZWQuCisuYnIKK0EgJ2ttYXgnIHZhbHVlIG9mIDAgd2lsbCB0dXJuIG9mZiBpbnNlcnRpb24gb2Yga2V5IGZyYW1lcy4gQSAna21heCcgdmFsdWUgb2YgMQord2lsbCByZXN1bHQgaW4gYWxsIGZyYW1lcyBiZWluZyBrZXkgZnJhbWVzLiAna21pbicgdmFsdWUgaXMgbm90IHRha2VuIGludG8KK2FjY291bnQgaW4gYm90aCB0aGVzZSBzcGVjaWFsIGNhc2VzLgorVHlwaWNhbCB2YWx1ZXMgYXJlIGluIHRoZSByYW5nZSAzIHRvIDMwLiBEZWZhdWx0IHZhbHVlcyBhcmUga21pbiA9IDksCitrbWF4ID0gMTcgZm9yIGxvc3NsZXNzIGNvbXByZXNzaW9uIGFuZCBrbWluID0gMywga21heCA9IDUgZm9yIGxvc3N5IGNvbXByZXNzaW9uLgorLmJyCitUaGVzZSB0d28gb3B0aW9ucyBhcmUgcmVsZXZhbnQgb25seSBmb3IgYW5pbWF0ZWQgaW1hZ2VzIHdpdGggbGFyZ2UgbnVtYmVyIG9mCitmcmFtZXMgKD41MCkuCisuYnIKK1doZW4gbG93ZXIgdmFsdWVzIGFyZSB1c2VkLCBtb3JlIGZyYW1lcyB3aWxsIGJlIGNvbnZlcnRlZCB0byBrZXkgZnJhbWVzLiBUaGlzCittYXkgbGVhZCB0byBzbWFsbGVyIG51bWJlciBvZiBmcmFtZXMgcmVxdWlyZWQgdG8gZGVjb2RlIGEgZnJhbWUgb24gYXZlcmFnZSwKK3RoZXJlYnkgaW1wcm92aW5nIHRoZSBkZWNvZGluZyBwZXJmb3JtYW5jZS4gQnV0IHRoaXMgbWF5IGxlYWQgdG8gc2xpZ2h0bHkgYmlnZ2VyCitmaWxlIHNpemVzLgorSGlnaGVyIHZhbHVlcyBtYXkgbGVhZCB0byB3b3JzZSBkZWNvZGluZyBwZXJmb3JtYW5jZSwgYnV0IHNtYWxsZXIgZmlsZSBzaXplcy4KKy5icgorU29tZSByZXN0cmljdGlvbnM6CisuYnIKKyhpKSBrbWluIDwga21heCwKKy5icgorKGlpKSBrbWluID49IGttYXggLyAyICsgMSBhbmQKKy5icgorKGlpaSkga21heCAtIGttaW4gPD0gMzAuCisuYnIKK0lmIGFueSBvZiB0aGVzZSByZXN0cmljdGlvbnMgYXJlIG5vdCBtZXQsIHRoZXkgd2lsbCBiZSBlbmZvcmNlZCBhdXRvbWF0aWNhbGx5LgorLlRQCisuQkkgXC1tZXRhZGF0YSAiIHN0cmluZworQSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBtZXRhZGF0YSB0byBjb3B5IGZyb20gdGhlIGlucHV0IHRvIHRoZSBvdXRwdXQgaWYKK3ByZXNlbnQuCitWYWxpZCB2YWx1ZXM6IFxmQmFsbFxmUCwgXGZCbm9uZVxmUCwgXGZCaWNjXGZQLCBcZkJ4bXBcZlAuCitUaGUgZGVmYXVsdCBpcyBcZkJ4bXBcZlAuCisuVFAKKy5CSSBcLWYgIiBpbnQKK0ZvciBsb3NzeSBlbmNvZGluZyBvbmx5IChzcGVjaWZpZWQgYnkgdGhlIFwtbG9zc3kgb3B0aW9uKS4gU3BlY2lmeSB0aGUgc3RyZW5ndGgKK29mIHRoZSBkZWJsb2NraW5nIGZpbHRlciwgYmV0d2VlbiAwIChubyBmaWx0ZXJpbmcpIGFuZCAxMDAgKG1heGltdW0gZmlsdGVyaW5nKS4KK0EgdmFsdWUgb2YgMCB3aWxsIHR1cm4gb2ZmIGFueSBmaWx0ZXJpbmcuIEhpZ2hlciB2YWx1ZSB3aWxsIGluY3JlYXNlIHRoZQorc3RyZW5ndGggb2YgdGhlIGZpbHRlcmluZyBwcm9jZXNzIGFwcGxpZWQgYWZ0ZXIgZGVjb2RpbmcgdGhlIHBpY3R1cmUuIFRoZSBoaWdoZXIKK3RoZSB2YWx1ZSB0aGUgc21vb3RoZXIgdGhlIHBpY3R1cmUgd2lsbCBhcHBlYXIuIFR5cGljYWwgdmFsdWVzIGFyZSB1c3VhbGx5IGluCit0aGUgcmFuZ2Ugb2YgMjAgdG8gNTAuCisuVFAKKy5CIFwtbXQKK1VzZSBtdWx0aS10aHJlYWRpbmcgZm9yIGVuY29kaW5nLCBpZiBwb3NzaWJsZS4KKy5UUAorLkIgXC1sb29wX2NvbXBhdGliaWxpdHkKK0lmIGVuYWJsZWQsIGhhbmRsZSB0aGUgbG9vcCBpbmZvcm1hdGlvbiBpbiBhIGNvbXBhdGlibGUgZmFzaGlvbiBmb3IgQ2hyb21lCit2ZXJzaW9uIHByaW9yIHRvIE02MiAoaW5jbHVzaXZlKSBhbmQgRmlyZWZveC4KKy5UUAorLkIgXC12CitQcmludCBleHRyYSBpbmZvcm1hdGlvbi4KKy5UUAorLkIgXC1xdWlldAorRG8gbm90IHByaW50IGFueXRoaW5nLgorCisuU0ggQlVHUworUGxlYXNlIHJlcG9ydCBhbGwgYnVncyB0byB0aGUgaXNzdWUgdHJhY2tlcjoKK2h0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC93ZWJwCisuYnIKK1BhdGNoZXMgd2VsY29tZSEgU2VlIHRoaXMgcGFnZSB0byBnZXQgc3RhcnRlZDoKK2h0dHA6Ly93d3cud2VibXByb2plY3Qub3JnL2NvZGUvY29udHJpYnV0ZS9zdWJtaXR0aW5nLXBhdGNoZXMvCisKKy5TSCBFWEFNUExFUworZ2lmMndlYnAgcGljdHVyZS5naWYgXC1vIHBpY3R1cmUud2VicAorLmJyCitnaWYyd2VicCBcLXEgNzAgcGljdHVyZS5naWYgXC1vIHBpY3R1cmUud2VicAorLmJyCitnaWYyd2VicCBcLWxvc3N5IFwtbSAzIHBpY3R1cmUuZ2lmIFwtbyBwaWN0dXJlX2xvc3N5LndlYnAKKy5icgorZ2lmMndlYnAgXC1sb3NzeSBcLWYgNTAgcGljdHVyZS5naWYgXC1vIHBpY3R1cmUud2VicAorLmJyCitnaWYyd2VicCBcLXEgNzAgXC1vIHBpY3R1cmUud2VicCBcLVwtIFwtXC1cLXBpY3R1cmUuZ2lmCisuYnIKK2NhdCBwaWN0dXJlLmdpZiB8IGdpZjJ3ZWJwIFwtbyBcLSBcLVwtIFwtID4gb3V0cHV0LndlYnAKKworLlNIIEFVVEhPUlMKK1xmQmdpZjJ3ZWJwXGZQIGlzIGEgcGFydCBvZiBsaWJ3ZWJwIGFuZCB3YXMgd3JpdHRlbiBieSB0aGUgV2ViUCB0ZWFtLgorLmJyCitUaGUgbGF0ZXN0IHNvdXJjZSB0cmVlIGlzIGF2YWlsYWJsZSBhdAoraHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL3dlYm0vbGlid2VicAorLlBQCitUaGlzIG1hbnVhbCBwYWdlIHdhcyB3cml0dGVuIGJ5IFVydmFuZyBKb3NoaSA8dXJ2YW5nQGdvb2dsZS5jb20+LCBmb3IgdGhlCitEZWJpYW4gcHJvamVjdCAoYW5kIG1heSBiZSB1c2VkIGJ5IG90aGVycykuCisKKy5TSCBTRUUgQUxTTworLkJSIGN3ZWJwICgxKSwKKy5CUiBkd2VicCAoMSksCisuQlIgd2VicG11eCAoMSkKKy5icgorUGxlYXNlIHJlZmVyIHRvIGh0dHA6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vc3BlZWQvd2VicC8gZm9yIGFkZGl0aW9uYWwKK2luZm9ybWF0aW9uLgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvbWFuL2ltZzJ3ZWJwLjEgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9tYW4vaW1nMndlYnAuMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTFkOTFkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvbWFuL2ltZzJ3ZWJwLjEKQEAgLTAsMCArMSwxMDUgQEAKKy5cIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGV5LCBFTUFDUzogLSotIG5yb2ZmIC0qLQorLlRIIElNRzJXRUJQIDEgIkFwcmlsIDMsIDIwMTgiCisuU0ggTkFNRQoraW1nMndlYnAgXC0gY3JlYXRlIGFuaW1hdGVkIFdlYlAgZmlsZSBmcm9tIGEgc2VxdWVuY2Ugb2YgaW5wdXQgaW1hZ2VzLgorLlNIIFNZTk9QU0lTCisuQiBpbWcyd2VicAorW2ZpbGVfbGV2ZWxfb3B0aW9uc10gW2ZpbGVzXSBbcGVyX2ZyYW1lX29wdGlvbnMuLi5dCisuYnIKKy5CIGltZzJ3ZWJwIGFyZ3VtZW50X2ZpbGVfbmFtZQorLmJyCisuU0ggREVTQ1JJUFRJT04KK1RoaXMgbWFudWFsIHBhZ2UgZG9jdW1lbnRzIHRoZQorLkIgaW1nMndlYnAKK2NvbW1hbmQuCisuUFAKK1xmQmltZzJ3ZWJwXGZQIGNvbXByZXNzZXMgYSBzZXF1ZW5jZSBvZiBpbWFnZXMgdXNpbmcgdGhlIGFuaW1hdGVkIFdlYlAgZm9ybWF0LgorSW5wdXQgaW1hZ2VzIGNhbiBlaXRoZXIgYmUgUE5HLCBKUEVHLCBUSUZGIG9yIFdlYlAuCitJZiBhIHNpbmdsZSBmaWxlIG5hbWUgKG5vdCBzdGFydGluZyB3aXRoIHRoZSBjaGFyYWN0ZXIgJ1wtJykgaXMgc3VwcGxpZWQgYXMKK3RoZSBhcmd1bWVudCwgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudCBhcmUgYWN0dWFsbHkgdG9rZW5pemVkIGZyb20gdGhpcyBmaWxlLgorVGhpcyBhbGxvd3MgZm9yIGVhc3kgc2NyaXB0aW5nIG9yIHVzaW5nIGxhcmdlIG51bWJlciBvZiBhcmd1bWVudHMuCisuU0ggRklMRS1MRVZFTCBPUFRJT05TCitUaGUgZmlsZS1sZXZlbCBvcHRpb25zIGFyZSBhcHBsaWVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvbXByZXNzaW9uIHByb2Nlc3MsCitiZWZvcmUgdGhlIGlucHV0IGZyYW1lcyBhcmUgcmVhZC4KKy5UUAorLkJJIFwtbyAiIHN0cmluZworU3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgb3V0cHV0IFdlYlAgZmlsZS4KKy5UUAorLkJJIFwtbWluX3NpemUKK0VuY29kZSBpbWFnZXMgdG8gYWNoaWV2ZSBzbWFsbGVzdCBzaXplLiBUaGlzIGRpc2FibGVzIGtleSBmcmFtZSBpbnNlcnRpb24gYW5kCitwaWNrcyB0aGUgcGFyYW1ldGVycyByZXN1bHRpbmcgaW4gc21hbGxlc3Qgb3V0cHV0IGZvciBlYWNoIGZyYW1lLiBJdCB1c2VzCitsb3NzbGVzcyBjb21wcmVzc2lvbiBieSBkZWZhdWx0LCBidXQgY2FuIGJlIGNvbWJpbmVkIHdpdGggXC1xLCBcLW0sIFwtbG9zc3kgb3IKK1wtbWl4ZWQgb3B0aW9ucy4KKy5UUAorLkJJIFwta21pbiAiIGludAorLlRQCisuQkkgXC1rbWF4ICIgaW50CitTcGVjaWZ5IHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIGRpc3RhbmNlIGJldHdlZW4gY29uc2VjdXRpdmUga2V5IGZyYW1lcworKGluZGVwZW5kZW50bHkgZGVjb2RhYmxlIGZyYW1lcykgaW4gdGhlIG91dHB1dCBhbmltYXRpb24uIFRoZSB0b29sIHdpbGwgaW5zZXJ0Citzb21lIGtleSBmcmFtZXMgaW50byB0aGUgb3V0cHV0IGFuaW1hdGlvbiBhcyBuZWVkZWQgc28gdGhhdCB0aGlzIGNyaXRlcmlhIGlzCitzYXRpc2ZpZWQuCisuYnIKKy5CIFwtbWl4ZWQKK01peGVkIGNvbXByZXNzaW9uIG1vZGU6IG9wdGltaXplIGNvbXByZXNzaW9uIG9mIHRoZSBpbWFnZSBieSBwaWNraW5nIGVpdGhlcgorbG9zc3kgb3IgbG9zc2xlc3MgY29tcHJlc3Npb24gZm9yIGVhY2ggZnJhbWUgaGV1cmlzdGljYWxseS4gVGhpcyBnbG9iYWwKK29wdGlvbiBkaXNhYmxlcyB0aGUgbG9jYWwgb3B0aW9uIFxmQi1sb3NzeVxmUCBhbmQgXGZCLWxvc3NsZXNzXGZQIC4KKy5UUAorLkJJIFwtbG9vcCAiIGludAorU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFuaW1hdGlvbiBzaG91bGQgbG9vcC4gVXNpbmcgJzAnCittZWFucyAnbG9vcCBpbmRlZmluaXRlbHknLgorLlRQCisuQkkgXC12CitCZSBtb3JlIHZlcmJvc2UuCisuVFAKKy5CIFwtaCwgXC1oZWxwCitBIHNob3J0IHVzYWdlIHN1bW1hcnkuCisuVFAKKy5CIFwtdmVyc2lvbgorUHJpbnQgdGhlIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgcmVsZXZhbnQgbGlicmFyaWVzIHVzZWQuCisKKy5TSCBQRVItRlJBTUUgT1BUSU9OUworVGhlIHBlci1mcmFtZSBvcHRpb25zIGFyZSBhcHBsaWVkIGZvciB0aGUgaW1hZ2VzIGZvbGxvd2luZyBhcyBhcmd1bWVudHMgaW4gdGhlCitjb21tYW5kIGxpbmUuIFRoZXkgY2FuIGJlIG1vZGlmaWVkIGFueSBudW1iZXIgb2YgdGltZXMgcHJlY2VkaW5nIGVhY2ggcGFydGljdWxhcgoraW5wdXQgaW1hZ2UuCisuVFAKKy5CSSBcLWQgIiBpbnQKK1NwZWNpZnkgdGhlIGltYWdlIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcy4KKy5UUAorLkIgXC1sb3NzbGVzcywgXC1sb3NzeQorQ29tcHJlc3MgdGhlIG5leHQgaW1hZ2UocykgdXNpbmcgbG9zc2xlc3Mgb3IgbG9zc3kgY29tcHJlc3Npb24gbW9kZS4gVGhlCitkZWZhdWx0IG1vZGUgaXMgbG9zc2xlc3MuCisuVFAKKy5CSSBcLXEgIiBmbG9hdAorU3BlY2lmeSB0aGUgY29tcHJlc3Npb24gZmFjdG9yIGJldHdlZW4gMCBhbmQgMTAwLiBUaGUgZGVmYXVsdCBpcyA3NS4KKy5UUAorLkJJIFwtbSAiIGludAorU3BlY2lmeSB0aGUgY29tcHJlc3Npb24gbWV0aG9kIHRvIHVzZS4gVGhpcyBwYXJhbWV0ZXIgY29udHJvbHMgdGhlCit0cmFkZSBvZmYgYmV0d2VlbiBlbmNvZGluZyBzcGVlZCBhbmQgdGhlIGNvbXByZXNzZWQgZmlsZSBzaXplIGFuZCBxdWFsaXR5LgorUG9zc2libGUgdmFsdWVzIHJhbmdlIGZyb20gMCB0byA2LiBEZWZhdWx0IHZhbHVlIGlzIDQuCisKKy5TSCBFWEFNUExFCitpbWcyd2VicCAtbG9vcCAyIGluMC5wbmcgLWxvc3N5IGluMS5qcGcgLWQgODAgaW4yLnRpZmYgLW8gb3V0LndlYnAKKy5icgorCisuU0ggQlVHUworUGxlYXNlIHJlcG9ydCBhbGwgYnVncyB0byB0aGUgaXNzdWUgdHJhY2tlcjoKK2h0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC93ZWJwCisuYnIKK1BhdGNoZXMgd2VsY29tZSEgU2VlIHRoaXMgcGFnZSB0byBnZXQgc3RhcnRlZDoKK2h0dHA6Ly93d3cud2VibXByb2plY3Qub3JnL2NvZGUvY29udHJpYnV0ZS9zdWJtaXR0aW5nXC1wYXRjaGVzLworCisuU0ggQVVUSE9SUworXGZCaW1nMndlYnBcZlAgaXMgYSBwYXJ0IG9mIGxpYndlYnAgYW5kIHdhcyB3cml0dGVuIGJ5IHRoZSBXZWJQIHRlYW0uCisuYnIKK1RoZSBsYXRlc3Qgc291cmNlIHRyZWUgaXMgYXZhaWxhYmxlIGF0CitodHRwczovL2Nocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vd2VibS9saWJ3ZWJwCisuUFAKK1RoaXMgbWFudWFsIHBhZ2Ugd2FzIHdyaXR0ZW4gYnkgUGFzY2FsIE1hc3NpbWlubyA8cGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20+LAorZm9yIHRoZSBEZWJpYW4gcHJvamVjdCAoYW5kIG1heSBiZSB1c2VkIGJ5IG90aGVycykuCisKKy5TSCBTRUUgQUxTTworLkJSIHdlYnBtdXggKDEpLAorLkJSIGdpZjJ3ZWJwICgxKQorLmJyCitQbGVhc2UgcmVmZXIgdG8gaHR0cDovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9zcGVlZC93ZWJwLyBmb3IgYWRkaXRpb25hbAoraW5mb3JtYXRpb24uCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9tYW4vdndlYnAuMSBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL21hbi92d2VicC4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYzM0NmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9tYW4vdndlYnAuMQpAQCAtMCwwICsxLDk0IEBACisuXCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhleSwgRU1BQ1M6IC0qLSBucm9mZiAtKi0KKy5USCBWV0VCUCAxICJOb3ZlbWJlciAyNSwgMjAxNiIKKy5TSCBOQU1FCit2d2VicCBcLSBkZWNvbXByZXNzIGEgV2ViUCBmaWxlIGFuZCBkaXNwbGF5IGl0IGluIGEgd2luZG93CisuU0ggU1lOT1BTSVMKKy5CIHZ3ZWJwCisuUkkgWyBvcHRpb25zIF0gIiBpbnB1dF9maWxlLndlYnAKKy5icgorLlNIIERFU0NSSVBUSU9OCitUaGlzIG1hbnVhbCBwYWdlIGRvY3VtZW50cyB0aGUKKy5CIHZ3ZWJwCitjb21tYW5kLgorLlBQCitcZkJ2d2VicFxmUCBkZWNvbXByZXNzZXMgYSBXZWJQIGZpbGUgYW5kIGRpc3BsYXlzIGl0IGluIGEgd2luZG93IHVzaW5nIE9wZW5HTC4KKy5TSCBPUFRJT05TCisuVFAKKy5CIFwtaAorUHJpbnQgdXNhZ2Ugc3VtbWFyeS4KKy5UUAorLkIgXC12ZXJzaW9uCitQcmludCB2ZXJzaW9uIG51bWJlciBhbmQgZXhpdC4KKy5UUAorLkIgXC1ub2ljYworRG9uJ3QgdXNlIHRoZSBJQ0MgcHJvZmlsZSBpZiBwcmVzZW50LgorLlRQCisuQiBcLW5vZmFuY3kKK0Rvbid0IHVzZSB0aGUgZmFuY3kgWVVWNDIwIHVwc2NhbGVyLgorLlRQCisuQiBcLW5vZmlsdGVyCitEaXNhYmxlIGluLWxvb3AgZmlsdGVyaW5nLgorLlRQCisuQkkgXC1kaXRoZXIgIiBzdHJlbmd0aAorU3BlY2lmeSBhIGRpdGhlcmluZyBcZkJzdHJlbmd0aFxmUCBiZXR3ZWVuIDAgYW5kIDEwMC4gRGl0aGVyaW5nIGlzIGEKK3Bvc3QtcHJvY2Vzc2luZyBlZmZlY3QgYXBwbGllZCB0byBjaHJvbWEgY29tcG9uZW50cyBpbiBsb3NzeSBjb21wcmVzc2lvbi4KK0l0IGhlbHBzIGJ5IHNtb290aGluZyBncmFkaWVudHMgYW5kIGF2b2lkaW5nIGJhbmRpbmcgYXJ0aWZhY3RzLiBEZWZhdWx0OiA1MC4KKy5UUAorLkJJIFwtbm9hbHBoYWRpdGhlcgorQnkgZGVmYXVsdCwgcXVhbnRpemVkIHRyYW5zcGFyZW5jeSBwbGFuZXMgYXJlIGRpdGhlcmVkIGR1cmluZyBkZWNvbXByZXNzaW9uLAordG8gc21vb3RoIHRoZSBncmFkaWVudHMuIFRoaXMgZmxhZyB3aWxsIHByZXZlbnQgdGhpcyBkaXRoZXJpbmcuCisuVFAKKy5CIFwtbXQKK1VzZSBtdWx0aS10aHJlYWRpbmcgZm9yIGRlY29kaW5nLCBpZiBwb3NzaWJsZS4KKy5UUAorLkIgXC1pbmZvCitEaXNwbGF5IGltYWdlIGluZm9ybWF0aW9uIG9uIHRvcCBvZiB0aGUgZGVjb2RlZCBpbWFnZS4KKy5UUAorLkJJIFwtXC0gIiBzdHJpbmcKK0V4cGxpY2l0bHkgc3BlY2lmeSB0aGUgaW5wdXQgZmlsZS4gVGhpcyBvcHRpb24gaXMgdXNlZnVsIGlmIHRoZSBpbnB1dAorZmlsZSBzdGFydHMgd2l0aCBhbiAnXC0nIGZvciBpbnN0YW5jZS4gVGhpcyBvcHRpb24gbXVzdCBhcHBlYXIgXGZCbGFzdFxmUC4KK0FueSBvdGhlciBvcHRpb25zIGFmdGVyd2FyZCB3aWxsIGJlIGlnbm9yZWQuIElmIHRoZSBpbnB1dCBmaWxlIGlzICJcLSIsCit0aGUgZGF0YSB3aWxsIGJlIHJlYWQgZnJvbSBcZklzdGRpblxmUCBpbnN0ZWFkIG9mIGEgZmlsZS4KKy5UUAorCisuU0ggS0VZQk9BUkQgU0hPUlRDVVRTCisuVFAKKy5CICdjJworVG9nZ2xlIHVzZSBvZiBjb2xvciBwcm9maWxlLgorLlRQCisuQiAnaScKK092ZXJsYXkgZmlsZSBpbmZvcm1hdGlvbi4KKy5UUAorLkIgJ2QnCitEaXNhYmxlIGJsZW5kaW5nIGFuZCBkaXNwb3NhbCBwcm9jZXNzLCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgorLlRQCisuQiAncScgLyAnUScgLyBFU0MKK1F1aXQuCisKKy5TSCBCVUdTCitQbGVhc2UgcmVwb3J0IGFsbCBidWdzIHRvIHRoZSBpc3N1ZSB0cmFja2VyOgoraHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3dlYnAKKy5icgorUGF0Y2hlcyB3ZWxjb21lISBTZWUgdGhpcyBwYWdlIHRvIGdldCBzdGFydGVkOgoraHR0cDovL3d3dy53ZWJtcHJvamVjdC5vcmcvY29kZS9jb250cmlidXRlL3N1Ym1pdHRpbmctcGF0Y2hlcy8KKworLlNIIEVYQU1QTEVTCit2d2VicCBwaWN0dXJlLndlYnAKKy5icgordndlYnAgcGljdHVyZS53ZWJwIC1tdCAtZGl0aGVyIDAKKy5icgordndlYnAgXC1cLSBcLVwtXC1waWN0dXJlLndlYnAKKworLlNIIEFVVEhPUlMKK1xmQnZ3ZWJwXGZQIGlzIGEgcGFydCBvZiBsaWJ3ZWJwIGFuZCB3YXMgd3JpdHRlbiBieSB0aGUgV2ViUCB0ZWFtLgorLmJyCitUaGUgbGF0ZXN0IHNvdXJjZSB0cmVlIGlzIGF2YWlsYWJsZSBhdAoraHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL3dlYm0vbGlid2VicAorLlBQCitUaGlzIG1hbnVhbCBwYWdlIHdhcyB3cml0dGVuIGZvciB0aGUgRGViaWFuIHByb2plY3QgKGFuZCBtYXkgYmUgdXNlZCBieSBvdGhlcnMpLgorCisuU0ggU0VFIEFMU08KKy5CUiBkd2VicCAoMSkKKy5icgorUGxlYXNlIHJlZmVyIHRvIGh0dHA6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vc3BlZWQvd2VicC8gZm9yIGFkZGl0aW9uYWwKK2luZm9ybWF0aW9uLgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvbWFuL3dlYnBpbmZvLjEgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9tYW4vd2VicGluZm8uMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDJiYTllCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvbWFuL3dlYnBpbmZvLjEKQEAgLTAsMCArMSw4MCBAQAorLlwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIZXksIEVNQUNTOiAtKi0gbnJvZmYgLSotCisuVEggV0VCUElORk8gMSAiTm92ZW1iZXIgMjQsIDIwMTciCisuU0ggTkFNRQord2VicGluZm8gXC0gcHJpbnQgb3V0IHRoZSBjaHVuayBsZXZlbCBzdHJ1Y3R1cmUgb2YgV2ViUCBmaWxlcworYWxvbmcgd2l0aCBiYXNpYyBpbnRlZ3JpdHkgY2hlY2tzLgorLlNIIFNZTk9QU0lTCisuQiB3ZWJwaW5mbworLkkgT1BUSU9OUworLkkgSU5QVVQKKy5icgorLkIgd2VicGluZm8gW1wtaHxcLWhlbHB8XC1IfFwtbG9uZ2hlbHBdCisuYnIKKworLlNIIERFU0NSSVBUSU9OCitUaGlzIG1hbnVhbCBwYWdlIGRvY3VtZW50cyB0aGUKKy5CIHdlYnBpbmZvCitjb21tYW5kLgorLlBQCitcZkJ3ZWJwaW5mb1xmUCBjYW4gYmUgdXNlZCB0byBwcmludCBvdXQgdGhlIGNodW5rIGxldmVsIHN0cnVjdHVyZSBhbmQgYml0c3RyZWFtCitoZWFkZXIgaW5mb3JtYXRpb24gb2YgV2ViUCBmaWxlcy4gSXQgY2FuIGFsc28gY2hlY2sgaWYgdGhlIGZpbGVzIGFyZSBvZiB2YWxpZAorV2ViUCBmb3JtYXQuCisKKy5TSCBPUFRJT05TCisuVFAKKy5CIFwtdmVyc2lvbgorUHJpbnQgdGhlIHZlcnNpb24gbnVtYmVyIChhcyBtYWpvci5taW5vci5yZXZpc2lvbikgYW5kIGV4aXQuCisuVFAKKy5CIFwtcXVpZXQKK0RvIG5vdCBzaG93IGNodW5rIHBhcnNpbmcgaW5mb3JtYXRpb24uCisuVFAKKy5CIFwtZGlhZworU2hvdyBwYXJzaW5nIGVycm9yIGRpYWdub3Npcy4KKy5UUAorLkIgXC1zdW1tYXJ5CitTaG93IGNodW5rIHN0YXRzIHN1bW1hcnkuCisuVFAKKy5CSSBcLWJpdHN0cmVhbV9pbmZvCitQYXJzZSBiaXRzdHJlYW0gaGVhZGVyLgorLlRQCisuQiBcLWgsIFwtaGVscAorQSBzaG9ydCB1c2FnZSBzdW1tYXJ5LgorLlRQCisuQiBcLUgsIFwtbG9uZ2hlbHAKK0RldGFpbGVkIHVzYWdlIGluc3RydWN0aW9ucy4KKworLlNIIElOUFVUCitJbnB1dCBmaWxlcyBpbiBXZWJQIGZvcm1hdC4gSW5wdXQgZmlsZXMgbXVzdCBjb21lIGxhc3QsIGZvbGxvd2luZworb3B0aW9ucyAoaWYgYW55KS4gVGhlcmUgY2FuIGJlIG11bHRpcGxlIGlucHV0IGZpbGVzLgorCisuU0ggQlVHUworUGxlYXNlIHJlcG9ydCBhbGwgYnVncyB0byB0aGUgaXNzdWUgdHJhY2tlcjoKK2h0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC93ZWJwCisuYnIKK1BhdGNoZXMgd2VsY29tZSEgU2VlIHRoaXMgcGFnZSB0byBnZXQgc3RhcnRlZDoKK2h0dHA6Ly93d3cud2VibXByb2plY3Qub3JnL2NvZGUvY29udHJpYnV0ZS9zdWJtaXR0aW5nXC1wYXRjaGVzLworCisuU0ggRVhBTVBMRVMKKy5icgord2VicGluZm8gXC1oCisuYnIKK3dlYnBpbmZvIFwtZGlhZyBcLXN1bW1hcnkgaW5wdXRfZmlsZS53ZWJwCisuYnIKK3dlYnBpbmZvIFwtYml0c3RyZWFtX2luZm8gaW5wdXRfZmlsZV8xLndlYnAgaW5wdXRfZmlsZV8yLndlYnAKKy5icgord2VicGluZm8gKi53ZWJwCisKKy5TSCBBVVRIT1JTCitcZkJ3ZWJwaW5mb1xmUCBpcyBhIHBhcnQgb2YgbGlid2VicCBhbmQgd2FzIHdyaXR0ZW4gYnkgdGhlIFdlYlAgdGVhbS4KKy5icgorVGhlIGxhdGVzdCBzb3VyY2UgdHJlZSBpcyBhdmFpbGFibGUgYXQKK2h0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS93ZWJtL2xpYndlYnAKKy5QUAorVGhpcyBtYW51YWwgcGFnZSB3YXMgd3JpdHRlbiBieSBIdWkgU3UgPGh1aXN1QGdvb2dsZS5jb20+LAorZm9yIHRoZSBEZWJpYW4gcHJvamVjdCAoYW5kIG1heSBiZSB1c2VkIGJ5IG90aGVycykuCisKKy5TSCBTRUUgQUxTTworLkJSIHdlYnBtdXggKDEpCisuYnIKK1BsZWFzZSByZWZlciB0byBodHRwOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3NwZWVkL3dlYnAvIGZvciBhZGRpdGlvbmFsCitpbmZvcm1hdGlvbi4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL21hbi93ZWJwbXV4LjEgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9tYW4vd2VicG11eC4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNDFhNjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9tYW4vd2VicG11eC4xCkBAIC0wLDAgKzEsMjYwIEBACisuXCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhleSwgRU1BQ1M6IC0qLSBucm9mZiAtKi0KKy5USCBXRUJQTVVYIDEgIkRlY2VtYmVyIDEsIDIwMTciCisuU0ggTkFNRQord2VicG11eCBcLSBjcmVhdGUgYW5pbWF0ZWQgV2ViUCBmaWxlcyBmcm9tIG5vblwtYW5pbWF0ZWQgV2ViUCBpbWFnZXMsIGV4dHJhY3QKK2ZyYW1lcyBmcm9tIGFuaW1hdGVkIFdlYlAgaW1hZ2VzLCBhbmQgbWFuYWdlIFhNUC9FWElGIG1ldGFkYXRhIGFuZCBJQ0MgcHJvZmlsZS4KKy5TSCBTWU5PUFNJUworLkIgd2VicG11eCBcLWdldAorLkkgR0VUX09QVElPTlMKKy5JIElOUFVUCisuQiBcLW8KKy5JIE9VVFBVVAorLmJyCisuQiB3ZWJwbXV4IFwtc2V0CisuSSBTRVRfT1BUSU9OUworLkkgSU5QVVQKKy5CIFwtbworLkkgT1VUUFVUCisuYnIKKy5CIHdlYnBtdXggXC1zdHJpcAorLkkgU1RSSVBfT1BUSU9OUworLkkgSU5QVVQKKy5CIFwtbworLkkgT1VUUFVUCisuYnIKKy5CIHdlYnBtdXggXC1mcmFtZQorLkkgRlJBTUVfT1BUSU9OUworLkIgWyBcLWZyYW1lIC4uLiBdIFsgXC1sb29wCisuSSBMT09QX0NPVU5UCisuQiBdCisuYnIKKy5SUyA4CisuQiBbIFwtYmdjb2xvcgorLkkgQkFDS0dST1VORF9DT0xPUgorLkIgXSBcLW8KKy5JIE9VVFBVVAorLlJFCisuYnIKKy5CIHdlYnBtdXggXC1kdXJhdGlvbgorLkkgRFVSQVRJT04gT1BUSU9OUworLkIgWyBcLWR1cmF0aW9uIC4uLiBdCisuSSBJTlBVVAorLkIgXC1vCisuSSBPVVRQVVQKKy5icgorLkIgd2VicG11eCBcLWluZm8KKy5JIElOUFVUCisuYnIKKy5CIHdlYnBtdXggW1wtaHxcLWhlbHBdCisuYnIKKy5CIHdlYnBtdXggXC12ZXJzaW9uCisuYnIKKy5CIHdlYnBtdXggYXJndW1lbnRfZmlsZV9uYW1lCisuU0ggREVTQ1JJUFRJT04KK1RoaXMgbWFudWFsIHBhZ2UgZG9jdW1lbnRzIHRoZQorLkIgd2VicG11eAorY29tbWFuZC4KKy5QUAorXGZCd2VicG11eFxmUCBjYW4gYmUgdXNlZCB0byBjcmVhdGUvZXh0cmFjdCBmcm9tIGFuaW1hdGVkIFdlYlAgZmlsZXMsIGFzIHdlbGwgYXMKK3RvIGFkZC9leHRyYWN0L3N0cmlwIFhNUC9FWElGIG1ldGFkYXRhIGFuZCBJQ0MgcHJvZmlsZS4KK0lmIGEgc2luZ2xlIGZpbGUgbmFtZSAobm90IHN0YXJ0aW5nIHdpdGggdGhlIGNoYXJhY3RlciAnXC0nKSBpcyBzdXBwbGllZCBhcwordGhlIGFyZ3VtZW50LCB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50IGFyZSBhY3R1YWxseSB0b2tlbml6ZWQgZnJvbSB0aGlzIGZpbGUuCitUaGlzIGFsbG93cyBmb3IgZWFzeSBzY3JpcHRpbmcgb3IgdXNpbmcgbGFyZ2UgbnVtYmVyIG9mIGFyZ3VtZW50cy4KKy5TSCBPUFRJT05TCisuU1MgR0VUX09QVElPTlMgKFwtZ2V0KToKKy5UUAorLkIgaWNjCitHZXQgSUNDIHByb2ZpbGUuCisuVFAKKy5CIGV4aWYKK0dldCBFWElGIG1ldGFkYXRhLgorLlRQCisuQiB4bXAKK0dldCBYTVAgbWV0YWRhdGEuCisuVFAKKy5CSSBmcmFtZSAiIG4KK0dldCBudGggZnJhbWUgZnJvbSBhbiBhbmltYXRlZCBpbWFnZS4gKG4gPSAwIGhhcyBhIHNwZWNpYWwgbWVhbmluZzogbGFzdCBmcmFtZSkuCisKKy5TUyBTRVRfT1BUSU9OUyAoXC1zZXQpCisuVFAKKy5CSSBpY2MgIiBmaWxlLmljYworU2V0IElDQyBwcm9maWxlLgorLlAKK1doZXJlOiAnZmlsZS5pY2MnIGNvbnRhaW5zIHRoZSBJQ0MgcHJvZmlsZSB0byBiZSBzZXQuCisuVFAKKy5CSSBleGlmICIgZmlsZS5leGlmCitTZXQgRVhJRiBtZXRhZGF0YS4KKy5QCitXaGVyZTogJ2ZpbGUuZXhpZicgY29udGFpbnMgdGhlIEVYSUYgbWV0YWRhdGEgdG8gYmUgc2V0LgorLlRQCisuQkkgeG1wICIgZmlsZS54bXAKK1NldCBYTVAgbWV0YWRhdGEuCisuUAorV2hlcmU6ICdmaWxlLnhtcCcgY29udGFpbnMgdGhlIFhNUCBtZXRhZGF0YSB0byBiZSBzZXQuCisKKy5TUyBTVFJJUF9PUFRJT05TIChcLXN0cmlwKQorLlRQCisuQiBpY2MKK1N0cmlwIElDQyBwcm9maWxlLgorLlRQCisuQiBleGlmCitTdHJpcCBFWElGIG1ldGFkYXRhLgorLlRQCisuQiB4bXAKK1N0cmlwIFhNUCBtZXRhZGF0YS4KKworLlNTIERVUkFUSU9OX09QVElPTlMgKFwtZHVyYXRpb24pCitBbWVuZCB0aGUgZHVyYXRpb24gb2YgYSBzcGVjaWZpYyBpbnRlcnZhbCBvZiBmcmFtZXMuIFRoaXMgb3B0aW9uIGlzIG9ubHkKK2VmZmVjdGl2ZSBvbiBhbmltYXRlZCBXZWJQIGFuZCBoYXMgbm8gZWZmZWN0IG9uIGEgc2luZ2xlLWZyYW1lIGZpbGUuCisuVFAKKy5JIGR1cmF0aW9uWyxzdGFydFssZW5kXV0KK1doZXJlOgorLmJyCisuQiBkdXJhdGlvbgoraXMgdGhlIGR1cmF0aW9uIGZvciB0aGUgaW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzIChtYW5kYXRvcnkpLgorTXVzdCBiZSBub24tbmVnYXRpdmUuCisuYnIKKy5CIHN0YXJ0CitpcyB0aGUgc3RhcnRpbmcgZnJhbWUgaW5kZXggb2YgdGhlIGludGVydmFsIChvcHRpb25hbCkuCisuYnIKKy5CIGVuZAoraXMgdGhlIGVuZGluZyBmcmFtZSBpbmRleCAoaW5jbHVzaXZlKSBvZiB0aGUgaW50ZXJ2YWwgKG9wdGlvbmFsKS4KKy5UUAorVGhlIHRocmVlIHR5cGljYWwgdXNhZ2VzIG9mIHRoaXMgb3B0aW9uIGFyZToKKy5icgorLkIgLWR1cmF0aW9uIGQKKyAgICAgc2V0IHRoZSBkdXJhdGlvbiB0byAnZCcgZm9yIHRoZSB3aG9sZSBhbmltYXRpb24uCisuYnIKKy5CIC1kdXJhdGlvbiBkLGYKKyAgICAgc2V0IHRoZSBkdXJhdGlvbiBvZiBmcmFtZSAnZicgdG8gJ2QnLgorLmJyCisuQiAtZHVyYXRpb24gZCxzdGFydCxlbmQKKyAgICAgc2V0IHRoZSBkdXJhdGlvbiB0byAnZCcgZm9yIHRoZSB3aG9sZSBbc3RhcnQsZW5kXSBpbnRlcnZhbC4KKy5UUAorLlAKK05vdGUgdGhhdCB0aGUgZnJhbWVzIG91dHNpZGUgb2YgdGhlIFtzdGFydCwgZW5kXSBpbnRlcnZhbCB3aWxsIHJlbWFpbiB1bnRvdWNoZWQuCitUaGUgJ2VuZCcgdmFsdWUgJzAnIGhhcyB0aGUgc3BlY2lhbCBtZWFuaW5nICdsYXN0IGZyYW1lIG9mIHRoZSBhbmltYXRpb24nLgorLlRQCisuSSBSZW1pbmRlcjoKK2ZyYW1lIGluZGV4aW5nIHN0YXJ0cyBhdCAnMScuCisuYnIKKworLlNTIEZSQU1FX09QVElPTlMgKFwtZnJhbWUpCitDcmVhdGUgYW4gYW5pbWF0ZWQgV2ViUCBmaWxlIGZyb20gbXVsdGlwbGUgKG5vblwtYW5pbWF0ZWQpIFdlYlAgaW1hZ2VzLgorLlRQCisuSSBmaWxlX2kgK2RpWyt4aSt5aVsrbWlbYmldXV0KK1doZXJlOiAnZmlsZV9pJyBpcyB0aGUgaSd0aCBmcmFtZSAoV2ViUCBmb3JtYXQpLCAneGknLCd5aScgc3BlY2lmeSB0aGUgaW1hZ2UKK29mZnNldCBmb3IgdGhpcyBmcmFtZSwgJ2RpJyBpcyB0aGUgcGF1c2UgZHVyYXRpb24gYmVmb3JlIG5leHQgZnJhbWUsICdtaScgaXMKK3RoZSBkaXNwb3NlIG1ldGhvZCBmb3IgdGhpcyBmcmFtZSAoMCBmb3IgTk9ORSBvciAxIGZvciBCQUNLR1JPVU5EKSBhbmQgJ2JpJyBpcwordGhlIGJsZW5kaW5nIG1ldGhvZCBmb3IgdGhpcyBmcmFtZSAoK2IgZm9yIEJMRU5EIG9yIFwtYiBmb3IgTk9fQkxFTkQpLgorQXJndW1lbnQgJ2JpJyBjYW4gYmUgb21pdHRlZCBhbmQgd2lsbCBkZWZhdWx0IHRvICtiIChCTEVORCkuCitBbHNvLCAnbWknIGNhbiBiZSBvbWl0dGVkIGlmICdiaScgaXMgb21pdHRlZCBhbmQgd2lsbCBkZWZhdWx0IHRvIDAgKE5PTkUpLgorRmluYWxseSwgaWYgJ21pJyBhbmQgJ2JpJyBhcmUgb21pdHRlZCB0aGVuICd4aScgYW5kICd5aScgY2FuIGJlIG9taXR0ZWQgYW5kIHdpbGwKK2RlZmF1bHQgdG8gKzArMC4KKy5UUAorLkJJIFwtbG9vcCAiIG4KK0xvb3AgdGhlIGZyYW1lcyBuIG51bWJlciBvZiB0aW1lcy4gMCBpbmRpY2F0ZXMgdGhlIGZyYW1lcyBzaG91bGQgbG9vcCBmb3JldmVyLgorVmFsaWQgcmFuZ2UgaXMgMCB0byA2NTUzNSBbRGVmYXVsdDogMCAoaW5maW5pdGUpXS4KKy5UUAorLkJJIFwtYmdjb2xvciAiIEEsUixHLEIKK0JhY2tncm91bmQgY29sb3Igb2YgdGhlIGNhbnZhcy4KKy5icgord2hlcmU6ICdBJywgJ1InLCAnRycgYW5kICdCJyBhcmUgaW50ZWdlcnMgaW4gdGhlIHJhbmdlIDAgdG8gMjU1IHNwZWNpZnlpbmcgdGhlCitBbHBoYSwgUmVkLCBHcmVlbiBhbmQgQmx1ZSBjb21wb25lbnQgdmFsdWVzIHJlc3BlY3RpdmVseQorW0RlZmF1bHQ6IDI1NSwyNTUsMjU1LDI1NV0uCisKKy5TUyBJTlBVVAorLlRQCitJbnB1dCBmaWxlIGluIFdlYlAgZm9ybWF0LgorCisuU1MgT1VUUFVUIChcLW8pCisuVFAKK091dHB1dCBmaWxlIGluIFdlYlAgZm9ybWF0LgorCisuU1MgTm90ZToKKy5UUAorVGhlIG5hdHVyZSBvZiBFWElGLCBYTVAgYW5kIElDQyBkYXRhIGlzIG5vdCBjaGVja2VkIGFuZCBpcyBhc3N1bWVkIHRvIGJlIHZhbGlkLgorCisuU0ggQlVHUworUGxlYXNlIHJlcG9ydCBhbGwgYnVncyB0byB0aGUgaXNzdWUgdHJhY2tlcjoKK2h0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC93ZWJwCisuYnIKK1BhdGNoZXMgd2VsY29tZSEgU2VlIHRoaXMgcGFnZSB0byBnZXQgc3RhcnRlZDoKK2h0dHA6Ly93d3cud2VibXByb2plY3Qub3JnL2NvZGUvY29udHJpYnV0ZS9zdWJtaXR0aW5nXC1wYXRjaGVzLworCisuU0ggRVhBTVBMRVMKKy5QCitBZGQgSUNDIHByb2ZpbGU6CisuYnIKK3dlYnBtdXggXC1zZXQgaWNjIGltYWdlX3Byb2ZpbGUuaWNjIGluLndlYnAgXC1vIGljY19jb250YWluZXIud2VicAorLlAKK0V4dHJhY3QgSUNDIHByb2ZpbGU6CisuYnIKK3dlYnBtdXggXC1nZXQgaWNjIGljY19jb250YWluZXIud2VicCBcLW8gaW1hZ2VfcHJvZmlsZS5pY2MKKy5QCitTdHJpcCBJQ0MgcHJvZmlsZToKKy5icgord2VicG11eCBcLXN0cmlwIGljYyBpY2NfY29udGFpbmVyLndlYnAgXC1vIHdpdGhvdXRfaWNjLndlYnAKKy5QCitBZGQgWE1QIG1ldGFkYXRhOgorLmJyCit3ZWJwbXV4IFwtc2V0IHhtcCBpbWFnZV9tZXRhZGF0YS54bXAgaW4ud2VicCBcLW8geG1wX2NvbnRhaW5lci53ZWJwCisuUAorRXh0cmFjdCBYTVAgbWV0YWRhdGE6CisuYnIKK3dlYnBtdXggXC1nZXQgeG1wIHhtcF9jb250YWluZXIud2VicCBcLW8gaW1hZ2VfbWV0YWRhdGEueG1wCisuUAorU3RyaXAgWE1QIG1ldGFkYXRhOgorLmJyCit3ZWJwbXV4IFwtc3RyaXAgeG1wIHhtcF9jb250YWluZXIud2VicCBcLW8gd2l0aG91dF94bXAud2VicAorLlAKK0FkZCBFWElGIG1ldGFkYXRhOgorLmJyCit3ZWJwbXV4IFwtc2V0IGV4aWYgaW1hZ2VfbWV0YWRhdGEuZXhpZiBpbi53ZWJwIFwtbyBleGlmX2NvbnRhaW5lci53ZWJwCisuUAorRXh0cmFjdCBFWElGIG1ldGFkYXRhOgorLmJyCit3ZWJwbXV4IFwtZ2V0IGV4aWYgZXhpZl9jb250YWluZXIud2VicCBcLW8gaW1hZ2VfbWV0YWRhdGEuZXhpZgorLlAKK1N0cmlwIEVYSUYgbWV0YWRhdGE6CisuYnIKK3dlYnBtdXggXC1zdHJpcCBleGlmIGV4aWZfY29udGFpbmVyLndlYnAgXC1vIHdpdGhvdXRfZXhpZi53ZWJwCisuUAorQ3JlYXRlIGFuIGFuaW1hdGVkIFdlYlAgZmlsZSBmcm9tIDMgKG5vblwtYW5pbWF0ZWQpIFdlYlAgaW1hZ2VzOgorLmJyCit3ZWJwbXV4IFwtZnJhbWUgMS53ZWJwICsxMDAgXC1mcmFtZSAyLndlYnAgKzEwMCs1MCs1MAorLmJyCisuUlMgOAorXC1mcmFtZSAzLndlYnAgKzEwMCs1MCs1MCsxK2IgXC1sb29wIDEwIFwtYmdjb2xvciAyNTUsMjU1LDI1NSwyNTUKKy5icgorXC1vIGFuaW1fY29udGFpbmVyLndlYnAKKy5SRQorLlAKK0dldCB0aGUgMm5kIGZyYW1lIGZyb20gYW4gYW5pbWF0ZWQgV2ViUCBmaWxlOgorLmJyCit3ZWJwbXV4IFwtZ2V0IGZyYW1lIDIgYW5pbV9jb250YWluZXIud2VicCBcLW8gZnJhbWVfMi53ZWJwCisuUAorVXNpbmcgXC1nZXQvXC1zZXQvXC1zdHJpcCB3aXRoIGlucHV0IGZpbGUgbmFtZSBzdGFydGluZyB3aXRoICdcLSc6CisuYnIKK3dlYnBtdXggXC1zZXQgaWNjIGltYWdlX3Byb2ZpbGUuaWNjIFwtbyBpY2NfY29udGFpbmVyLndlYnAgXC1cLSBcLVwtXC1pbi53ZWJwCisuYnIKK3dlYnBtdXggXC1nZXQgaWNjIFwtbyBpbWFnZV9wcm9maWxlLmljYyBcLVwtIFwtXC1cLWljY19jb250YWluZXIud2VicAorLmJyCit3ZWJwbXV4IFwtc3RyaXAgaWNjIFwtbyB3aXRob3V0X2ljYy53ZWJwIFwtXC0gXC1cLVwtaWNjX2NvbnRhaW5lci53ZWJwCisKKy5TSCBBVVRIT1JTCitcZkJ3ZWJwbXV4XGZQIGlzIGEgcGFydCBvZiBsaWJ3ZWJwIGFuZCB3YXMgd3JpdHRlbiBieSB0aGUgV2ViUCB0ZWFtLgorLmJyCitUaGUgbGF0ZXN0IHNvdXJjZSB0cmVlIGlzIGF2YWlsYWJsZSBhdAoraHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL3dlYm0vbGlid2VicAorLlBQCitUaGlzIG1hbnVhbCBwYWdlIHdhcyB3cml0dGVuIGJ5IFZpa2FzIEFyb3JhIDx2aWthYXMuYXJvcmFAZ21haWwuY29tPiwKK2ZvciB0aGUgRGViaWFuIHByb2plY3QgKGFuZCBtYXkgYmUgdXNlZCBieSBvdGhlcnMpLgorCisuU0ggU0VFIEFMU08KKy5CUiBjd2VicCAoMSksCisuQlIgZHdlYnAgKDEpLAorLkJSIGdpZjJ3ZWJwICgxKQorLmJyCitQbGVhc2UgcmVmZXIgdG8gaHR0cDovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9zcGVlZC93ZWJwLyBmb3IgYWRkaXRpb25hbAoraW5mb3JtYXRpb24uCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvTWFrZWZpbGUuYW0gYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJjZmEzOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDU1IEBACisjIFRoZSBtdXggYW5kIGRlbXV4IGxpYnJhcmllcyBkZXBlbmQgb24gbGlid2VicCwgdGh1cyB0aGUgJy4nIHRvIGZvcmNlCisjIHRoZSBidWlsZCBvcmRlciBzbyBpdCdzIGF2YWlsYWJsZSB0byB0aGVtLgorU1VCRElSUyA9IGRlYyBlbmMgZHNwIHV0aWxzIC4KK2lmIFdBTlRfTVVYCisgIFNVQkRJUlMgKz0gbXV4CitlbmRpZgoraWYgV0FOVF9ERU1VWAorICBTVUJESVJTICs9IGRlbXV4CitlbmRpZgorCitsaWJfTFRMSUJSQVJJRVMgPSBsaWJ3ZWJwLmxhCisKK2lmIEJVSUxEX0xJQldFQlBERUNPREVSCisgIGxpYl9MVExJQlJBUklFUyArPSBsaWJ3ZWJwZGVjb2Rlci5sYQorZW5kaWYKKworY29tbW9uX0hFQURFUlMgPQorY29tbW9uX0hFQURFUlMgKz0gd2VicC9kZWNvZGUuaAorY29tbW9uX0hFQURFUlMgKz0gd2VicC90eXBlcy5oCitjb21tb25kaXIgPSAkKGluY2x1ZGVkaXIpL3dlYnAKKworbGlid2VicF9sYV9TT1VSQ0VTID0KK2xpYndlYnBpbmNsdWRlX0hFQURFUlMgPQorbGlid2VicGluY2x1ZGVfSEVBREVSUyArPSB3ZWJwL2VuY29kZS5oCisKK25vaW5zdF9IRUFERVJTID0KK25vaW5zdF9IRUFERVJTICs9IHdlYnAvZm9ybWF0X2NvbnN0YW50cy5oCisKK2xpYndlYnBfbGFfTElCQUREID0KK2xpYndlYnBfbGFfTElCQUREICs9IGRlYy9saWJ3ZWJwZGVjb2RlLmxhCitsaWJ3ZWJwX2xhX0xJQkFERCArPSBkc3AvbGlid2VicGRzcC5sYQorbGlid2VicF9sYV9MSUJBREQgKz0gZW5jL2xpYndlYnBlbmNvZGUubGEKK2xpYndlYnBfbGFfTElCQUREICs9IHV0aWxzL2xpYndlYnB1dGlscy5sYQorCisjIFVzZSAnLW5vLXVuZGVmaW5lZCcgdG8gZGVjbGFyZSB0aGF0IGxpYndlYnAgZG9lcyBub3QgZGVwZW5kIG9uIGFueSBsaWJyYXJpZXMKKyMgb3RoZXIgdGhhbiB0aGUgb25lcyBsaXN0ZWQgb24gdGhlIGNvbW1hbmQgbGluZSwgaS5lLiwgYWZ0ZXIgbGlua2luZywgaXQgd2lsbAorIyBub3QgaGF2ZSB1bnJlc29sdmVkIHN5bWJvbHMuIFNvbWUgcGxhdGZvcm1zIChXaW5kb3dzIGFtb25nIHRoZW0pIHJlcXVpcmUgYWxsCisjIHN5bWJvbHMgaW4gc2hhcmVkIGxpYnJhcmllcyB0byBiZSByZXNvbHZlZCBhdCBsaWJyYXJ5IGNyZWF0aW9uLgorbGlid2VicF9sYV9MREZMQUdTID0gLW5vLXVuZGVmaW5lZCAtdmVyc2lvbi1pbmZvIDc6MjowCitsaWJ3ZWJwaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvd2VicAorcGtnY29uZmlnX0RBVEEgPSBsaWJ3ZWJwLnBjCisKK2lmIEJVSUxEX0xJQldFQlBERUNPREVSCisgIGxpYndlYnBkZWNvZGVyX2xhX1NPVVJDRVMgPQorCisgIGxpYndlYnBkZWNvZGVyX2xhX0xJQkFERCA9CisgIGxpYndlYnBkZWNvZGVyX2xhX0xJQkFERCArPSBkZWMvbGlid2VicGRlY29kZS5sYQorICBsaWJ3ZWJwZGVjb2Rlcl9sYV9MSUJBREQgKz0gZHNwL2xpYndlYnBkc3BkZWNvZGUubGEKKyAgbGlid2VicGRlY29kZXJfbGFfTElCQUREICs9IHV0aWxzL2xpYndlYnB1dGlsc2RlY29kZS5sYQorCisgIGxpYndlYnBkZWNvZGVyX2xhX0xERkxBR1MgPSAtbm8tdW5kZWZpbmVkIC12ZXJzaW9uLWluZm8gMzoyOjAKKyAgcGtnY29uZmlnX0RBVEEgKz0gbGlid2VicGRlY29kZXIucGMKK2VuZGlmCisKKyR7cGtnY29uZmlnX0RBVEF9OiAke3RvcF9idWlsZGRpcn0vY29uZmlnLnN0YXR1cwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlYy9NYWtlZmlsZS5hbSBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhjNjM5OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwyOSBAQAorQU1fQ1BQRkxBR1MgKz0gLUkkKHRvcF9idWlsZGRpcikgLUkkKHRvcF9zcmNkaXIpCitub2luc3RfTFRMSUJSQVJJRVMgPSBsaWJ3ZWJwZGVjb2RlLmxhCisKK2xpYndlYnBkZWNvZGVfbGFfU09VUkNFUyA9CitsaWJ3ZWJwZGVjb2RlX2xhX1NPVVJDRVMgKz0gYWxwaGFfZGVjLmMKK2xpYndlYnBkZWNvZGVfbGFfU09VUkNFUyArPSBhbHBoYWlfZGVjLmgKK2xpYndlYnBkZWNvZGVfbGFfU09VUkNFUyArPSBidWZmZXJfZGVjLmMKK2xpYndlYnBkZWNvZGVfbGFfU09VUkNFUyArPSBjb21tb25fZGVjLmgKK2xpYndlYnBkZWNvZGVfbGFfU09VUkNFUyArPSB2cDhfZGVjLmgKK2xpYndlYnBkZWNvZGVfbGFfU09VUkNFUyArPSBmcmFtZV9kZWMuYworbGlid2VicGRlY29kZV9sYV9TT1VSQ0VTICs9IGlkZWNfZGVjLmMKK2xpYndlYnBkZWNvZGVfbGFfU09VUkNFUyArPSBpb19kZWMuYworbGlid2VicGRlY29kZV9sYV9TT1VSQ0VTICs9IHF1YW50X2RlYy5jCitsaWJ3ZWJwZGVjb2RlX2xhX1NPVVJDRVMgKz0gdHJlZV9kZWMuYworbGlid2VicGRlY29kZV9sYV9TT1VSQ0VTICs9IHZwOF9kZWMuYworbGlid2VicGRlY29kZV9sYV9TT1VSQ0VTICs9IHZwOGlfZGVjLmgKK2xpYndlYnBkZWNvZGVfbGFfU09VUkNFUyArPSB2cDhsX2RlYy5jCitsaWJ3ZWJwZGVjb2RlX2xhX1NPVVJDRVMgKz0gdnA4bGlfZGVjLmgKK2xpYndlYnBkZWNvZGVfbGFfU09VUkNFUyArPSB3ZWJwX2RlYy5jCitsaWJ3ZWJwZGVjb2RlX2xhX1NPVVJDRVMgKz0gd2VicGlfZGVjLmgKKworbGlid2VicGRlY29kZWluY2x1ZGVfSEVBREVSUyA9CitsaWJ3ZWJwZGVjb2RlaW5jbHVkZV9IRUFERVJTICs9IC4uL3dlYnAvZGVjb2RlLmgKK2xpYndlYnBkZWNvZGVpbmNsdWRlX0hFQURFUlMgKz0gLi4vd2VicC90eXBlcy5oCitub2luc3RfSEVBREVSUyA9Citub2luc3RfSEVBREVSUyArPSAuLi93ZWJwL2Zvcm1hdF9jb25zdGFudHMuaAorCitsaWJ3ZWJwZGVjb2RlX2xhX0NQUEZMQUdTID0gJChBTV9DUFBGTEFHUykKK2xpYndlYnBkZWNvZGVpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS93ZWJwCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL2FscGhhX2RlYy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlYy9hbHBoYV9kZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTZjOGE3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlYy9hbHBoYV9kZWMuYwpAQCAtMCwwICsxLDIzOCBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEFscGhhLXBsYW5lIGRlY29tcHJlc3Npb24uCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL2Fzc2VydF9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RkbGliX3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdfcG9lbS5oIgorI2Vsc2UKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorI2luY2x1ZGUgInNyYy9kZWMvYWxwaGFpX2RlYy5oIgorI2luY2x1ZGUgInNyYy9kZWMvdnA4aV9kZWMuaCIKKyNpbmNsdWRlICJzcmMvZGVjL3ZwOGxpX2RlYy5oIgorI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL3F1YW50X2xldmVsc19kZWNfdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvd2VicC9mb3JtYXRfY29uc3RhbnRzLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBTFBIRGVjb2RlciBvYmplY3QuCisKKy8vIEFsbG9jYXRlcyBhIG5ldyBhbHBoYSBkZWNvZGVyIGluc3RhbmNlLgorc3RhdGljIEFMUEhEZWNvZGVyKiBBTFBITmV3KHZvaWQpIHsKKyAgQUxQSERlY29kZXIqIGNvbnN0IGRlYyA9IChBTFBIRGVjb2RlciopV2ViUFNhZmVDYWxsb2MoMVVMTCwgc2l6ZW9mKCpkZWMpKTsKKyAgcmV0dXJuIGRlYzsKK30KKworLy8gQ2xlYXJzIGFuZCBkZWFsbG9jYXRlcyBhbiBhbHBoYSBkZWNvZGVyIGluc3RhbmNlLgorc3RhdGljIHZvaWQgQUxQSERlbGV0ZShBTFBIRGVjb2RlciogY29uc3QgZGVjKSB7CisgIGlmIChkZWMgIT0gTlVMTCkgeworICAgIFZQOExEZWxldGUoZGVjLT52cDhsX2RlY18pOworICAgIGRlYy0+dnA4bF9kZWNfID0gTlVMTDsKKyAgICBXZWJQU2FmZUZyZWUoZGVjKTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRGVjb2RpbmcuCisKKy8vIEluaXRpYWxpemUgYWxwaGEgZGVjb2RpbmcgYnkgcGFyc2luZyB0aGUgYWxwaGEgaGVhZGVyIGFuZCBkZWNvZGluZyB0aGUgaW1hZ2UKKy8vIGhlYWRlciBmb3IgYWxwaGEgZGF0YSBzdG9yZWQgdXNpbmcgbG9zc2xlc3MgY29tcHJlc3Npb24uCisvLyBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgZXJyb3IgaW4gYWxwaGEgaGVhZGVyIChkYXRhIHRvbyBzaG9ydCwgaW52YWxpZAorLy8gY29tcHJlc3Npb24gbWV0aG9kIG9yIGZpbHRlciwgZXJyb3IgaW4gbG9zc2xlc3MgaGVhZGVyIGRhdGEgZXRjKS4KK3N0YXRpYyBpbnQgQUxQSEluaXQoQUxQSERlY29kZXIqIGNvbnN0IGRlYywgY29uc3QgdWludDhfdCogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRhdGFfc2l6ZSwgY29uc3QgVlA4SW8qIGNvbnN0IHNyY19pbywKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3V0cHV0KSB7CisgIGludCBvayA9IDA7CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGFscGhhX2RhdGEgPSBkYXRhICsgQUxQSEFfSEVBREVSX0xFTjsKKyAgY29uc3Qgc2l6ZV90IGFscGhhX2RhdGFfc2l6ZSA9IGRhdGFfc2l6ZSAtIEFMUEhBX0hFQURFUl9MRU47CisgIGludCByc3J2OworICBWUDhJbyogY29uc3QgaW8gPSAmZGVjLT5pb187CisKKyAgYXNzZXJ0KGRhdGEgIT0gTlVMTCAmJiBvdXRwdXQgIT0gTlVMTCAmJiBzcmNfaW8gIT0gTlVMTCk7CisKKyAgVlA4RmlsdGVyc0luaXQoKTsKKyAgZGVjLT5vdXRwdXRfID0gb3V0cHV0OworICBkZWMtPndpZHRoXyA9IHNyY19pby0+d2lkdGg7CisgIGRlYy0+aGVpZ2h0XyA9IHNyY19pby0+aGVpZ2h0OworICBhc3NlcnQoZGVjLT53aWR0aF8gPiAwICYmIGRlYy0+aGVpZ2h0XyA+IDApOworCisgIGlmIChkYXRhX3NpemUgPD0gQUxQSEFfSEVBREVSX0xFTikgeworICAgIHJldHVybiAwOworICB9CisKKyAgZGVjLT5tZXRob2RfID0gKGRhdGFbMF0gPj4gMCkgJiAweDAzOworICBkZWMtPmZpbHRlcl8gPSAoV0VCUF9GSUxURVJfVFlQRSkoKGRhdGFbMF0gPj4gMikgJiAweDAzKTsKKyAgZGVjLT5wcmVfcHJvY2Vzc2luZ18gPSAoZGF0YVswXSA+PiA0KSAmIDB4MDM7CisgIHJzcnYgPSAoZGF0YVswXSA+PiA2KSAmIDB4MDM7CisgIGlmIChkZWMtPm1ldGhvZF8gPCBBTFBIQV9OT19DT01QUkVTU0lPTiB8fAorICAgICAgZGVjLT5tZXRob2RfID4gQUxQSEFfTE9TU0xFU1NfQ09NUFJFU1NJT04gfHwKKyAgICAgIGRlYy0+ZmlsdGVyXyA+PSBXRUJQX0ZJTFRFUl9MQVNUIHx8CisgICAgICBkZWMtPnByZV9wcm9jZXNzaW5nXyA+IEFMUEhBX1BSRVBST0NFU1NFRF9MRVZFTFMgfHwKKyAgICAgIHJzcnYgIT0gMCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgLy8gQ29weSB0aGUgbmVjZXNzYXJ5IHBhcmFtZXRlcnMgZnJvbSBzcmNfaW8gdG8gaW8KKyAgVlA4SW5pdElvKGlvKTsKKyAgV2ViUEluaXRDdXN0b21JbyhOVUxMLCBpbyk7CisgIGlvLT5vcGFxdWUgPSBkZWM7CisgIGlvLT53aWR0aCA9IHNyY19pby0+d2lkdGg7CisgIGlvLT5oZWlnaHQgPSBzcmNfaW8tPmhlaWdodDsKKworICBpby0+dXNlX2Nyb3BwaW5nID0gc3JjX2lvLT51c2VfY3JvcHBpbmc7CisgIGlvLT5jcm9wX2xlZnQgPSBzcmNfaW8tPmNyb3BfbGVmdDsKKyAgaW8tPmNyb3BfcmlnaHQgPSBzcmNfaW8tPmNyb3BfcmlnaHQ7CisgIGlvLT5jcm9wX3RvcCA9IHNyY19pby0+Y3JvcF90b3A7CisgIGlvLT5jcm9wX2JvdHRvbSA9IHNyY19pby0+Y3JvcF9ib3R0b207CisgIC8vIE5vIG5lZWQgdG8gY29weSB0aGUgc2NhbGluZyBwYXJhbWV0ZXJzLgorCisgIGlmIChkZWMtPm1ldGhvZF8gPT0gQUxQSEFfTk9fQ09NUFJFU1NJT04pIHsKKyAgICBjb25zdCBzaXplX3QgYWxwaGFfZGVjb2RlZF9zaXplID0gZGVjLT53aWR0aF8gKiBkZWMtPmhlaWdodF87CisgICAgb2sgPSAoYWxwaGFfZGF0YV9zaXplID49IGFscGhhX2RlY29kZWRfc2l6ZSk7CisgIH0gZWxzZSB7CisgICAgYXNzZXJ0KGRlYy0+bWV0aG9kXyA9PSBBTFBIQV9MT1NTTEVTU19DT01QUkVTU0lPTik7CisgICAgb2sgPSBWUDhMRGVjb2RlQWxwaGFIZWFkZXIoZGVjLCBhbHBoYV9kYXRhLCBhbHBoYV9kYXRhX3NpemUpOworICB9CisKKyAgcmV0dXJuIG9rOworfQorCisvLyBEZWNvZGVzLCB1bmZpbHRlcnMgYW5kIGRlcXVhbnRpemVzICphdCBsZWFzdCogJ251bV9yb3dzJyByb3dzIG9mIGFscGhhCisvLyBzdGFydGluZyBmcm9tIHJvdyBudW1iZXIgJ3JvdycuIEl0IGFzc3VtZXMgdGhhdCByb3dzIHVwIHRvIChyb3cgLSAxKSBoYXZlCisvLyBhbHJlYWR5IGJlZW4gZGVjb2RlZC4KKy8vIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiBiaXRzdHJlYW0gZXJyb3IuCitzdGF0aWMgaW50IEFMUEhEZWNvZGUoVlA4RGVjb2RlciogY29uc3QgZGVjLCBpbnQgcm93LCBpbnQgbnVtX3Jvd3MpIHsKKyAgQUxQSERlY29kZXIqIGNvbnN0IGFscGhfZGVjID0gZGVjLT5hbHBoX2RlY187CisgIGNvbnN0IGludCB3aWR0aCA9IGFscGhfZGVjLT53aWR0aF87CisgIGNvbnN0IGludCBoZWlnaHQgPSBhbHBoX2RlYy0+aW9fLmNyb3BfYm90dG9tOworICBpZiAoYWxwaF9kZWMtPm1ldGhvZF8gPT0gQUxQSEFfTk9fQ09NUFJFU1NJT04pIHsKKyAgICBpbnQgeTsKKyAgICBjb25zdCB1aW50OF90KiBwcmV2X2xpbmUgPSBkZWMtPmFscGhhX3ByZXZfbGluZV87CisgICAgY29uc3QgdWludDhfdCogZGVsdGFzID0gZGVjLT5hbHBoYV9kYXRhXyArIEFMUEhBX0hFQURFUl9MRU4gKyByb3cgKiB3aWR0aDsKKyAgICB1aW50OF90KiBkc3QgPSBkZWMtPmFscGhhX3BsYW5lXyArIHJvdyAqIHdpZHRoOworICAgIGFzc2VydChkZWx0YXMgPD0gJmRlYy0+YWxwaGFfZGF0YV9bZGVjLT5hbHBoYV9kYXRhX3NpemVfXSk7CisgICAgaWYgKGFscGhfZGVjLT5maWx0ZXJfICE9IFdFQlBfRklMVEVSX05PTkUpIHsKKyAgICAgIGFzc2VydChXZWJQVW5maWx0ZXJzW2FscGhfZGVjLT5maWx0ZXJfXSAhPSBOVUxMKTsKKyAgICAgIGZvciAoeSA9IDA7IHkgPCBudW1fcm93czsgKyt5KSB7CisgICAgICAgIFdlYlBVbmZpbHRlcnNbYWxwaF9kZWMtPmZpbHRlcl9dKHByZXZfbGluZSwgZGVsdGFzLCBkc3QsIHdpZHRoKTsKKyAgICAgICAgcHJldl9saW5lID0gZHN0OworICAgICAgICBkc3QgKz0gd2lkdGg7CisgICAgICAgIGRlbHRhcyArPSB3aWR0aDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZm9yICh5ID0gMDsgeSA8IG51bV9yb3dzOyArK3kpIHsKKyAgICAgICAgbWVtY3B5KGRzdCwgZGVsdGFzLCB3aWR0aCAqIHNpemVvZigqZHN0KSk7CisgICAgICAgIHByZXZfbGluZSA9IGRzdDsKKyAgICAgICAgZHN0ICs9IHdpZHRoOworICAgICAgICBkZWx0YXMgKz0gd2lkdGg7CisgICAgICB9CisgICAgfQorICAgIGRlYy0+YWxwaGFfcHJldl9saW5lXyA9IHByZXZfbGluZTsKKyAgfSBlbHNlIHsgIC8vIGFscGhfZGVjLT5tZXRob2RfID09IEFMUEhBX0xPU1NMRVNTX0NPTVBSRVNTSU9OCisgICAgYXNzZXJ0KGFscGhfZGVjLT52cDhsX2RlY18gIT0gTlVMTCk7CisgICAgaWYgKCFWUDhMRGVjb2RlQWxwaGFJbWFnZVN0cmVhbShhbHBoX2RlYywgcm93ICsgbnVtX3Jvd3MpKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKworICBpZiAocm93ICsgbnVtX3Jvd3MgPj0gaGVpZ2h0KSB7CisgICAgZGVjLT5pc19hbHBoYV9kZWNvZGVkXyA9IDE7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgQWxsb2NhdGVBbHBoYVBsYW5lKFZQOERlY29kZXIqIGNvbnN0IGRlYywgY29uc3QgVlA4SW8qIGNvbnN0IGlvKSB7CisgIGNvbnN0IGludCBzdHJpZGUgPSBpby0+d2lkdGg7CisgIGNvbnN0IGludCBoZWlnaHQgPSBpby0+Y3JvcF9ib3R0b207CisgIGNvbnN0IHVpbnQ2NF90IGFscGhhX3NpemUgPSAodWludDY0X3Qpc3RyaWRlICogaGVpZ2h0OworICBhc3NlcnQoZGVjLT5hbHBoYV9wbGFuZV9tZW1fID09IE5VTEwpOworICBkZWMtPmFscGhhX3BsYW5lX21lbV8gPQorICAgICAgKHVpbnQ4X3QqKVdlYlBTYWZlTWFsbG9jKGFscGhhX3NpemUsIHNpemVvZigqZGVjLT5hbHBoYV9wbGFuZV8pKTsKKyAgaWYgKGRlYy0+YWxwaGFfcGxhbmVfbWVtXyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgZGVjLT5hbHBoYV9wbGFuZV8gPSBkZWMtPmFscGhhX3BsYW5lX21lbV87CisgIGRlYy0+YWxwaGFfcHJldl9saW5lXyA9IE5VTEw7CisgIHJldHVybiAxOworfQorCit2b2lkIFdlYlBEZWFsbG9jYXRlQWxwaGFNZW1vcnkoVlA4RGVjb2RlciogY29uc3QgZGVjKSB7CisgIGFzc2VydChkZWMgIT0gTlVMTCk7CisgIFdlYlBTYWZlRnJlZShkZWMtPmFscGhhX3BsYW5lX21lbV8pOworICBkZWMtPmFscGhhX3BsYW5lX21lbV8gPSBOVUxMOworICBkZWMtPmFscGhhX3BsYW5lXyA9IE5VTEw7CisgIEFMUEhEZWxldGUoZGVjLT5hbHBoX2RlY18pOworICBkZWMtPmFscGhfZGVjXyA9IE5VTEw7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNYWluIGVudHJ5IHBvaW50LgorCitjb25zdCB1aW50OF90KiBWUDhEZWNvbXByZXNzQWxwaGFSb3dzKFZQOERlY29kZXIqIGNvbnN0IGRlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4SW8qIGNvbnN0IGlvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93LCBpbnQgbnVtX3Jvd3MpIHsKKyAgY29uc3QgaW50IHdpZHRoID0gaW8tPndpZHRoOworICBjb25zdCBpbnQgaGVpZ2h0ID0gaW8tPmNyb3BfYm90dG9tOworCisgIGFzc2VydChkZWMgIT0gTlVMTCAmJiBpbyAhPSBOVUxMKTsKKworICBpZiAocm93IDwgMCB8fCBudW1fcm93cyA8PSAwIHx8IHJvdyArIG51bV9yb3dzID4gaGVpZ2h0KSB7CisgICAgcmV0dXJuIE5VTEw7ICAgIC8vIHNhbml0eSBjaGVjay4KKyAgfQorCisgIGlmICghZGVjLT5pc19hbHBoYV9kZWNvZGVkXykgeworICAgIGlmIChkZWMtPmFscGhfZGVjXyA9PSBOVUxMKSB7ICAgIC8vIEluaXRpYWxpemUgZGVjb2Rlci4KKyAgICAgIGRlYy0+YWxwaF9kZWNfID0gQUxQSE5ldygpOworICAgICAgaWYgKGRlYy0+YWxwaF9kZWNfID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICAgaWYgKCFBbGxvY2F0ZUFscGhhUGxhbmUoZGVjLCBpbykpIGdvdG8gRXJyb3I7CisgICAgICBpZiAoIUFMUEhJbml0KGRlYy0+YWxwaF9kZWNfLCBkZWMtPmFscGhhX2RhdGFfLCBkZWMtPmFscGhhX2RhdGFfc2l6ZV8sCisgICAgICAgICAgICAgICAgICAgIGlvLCBkZWMtPmFscGhhX3BsYW5lXykpIHsKKyAgICAgICAgZ290byBFcnJvcjsKKyAgICAgIH0KKyAgICAgIC8vIGlmIHdlIGFsbG93ZWQgdXNlIG9mIGFscGhhIGRpdGhlcmluZywgY2hlY2sgd2hldGhlciBpdCdzIG5lZWRlZCBhdCBhbGwKKyAgICAgIGlmIChkZWMtPmFscGhfZGVjXy0+cHJlX3Byb2Nlc3NpbmdfICE9IEFMUEhBX1BSRVBST0NFU1NFRF9MRVZFTFMpIHsKKyAgICAgICAgZGVjLT5hbHBoYV9kaXRoZXJpbmdfID0gMDsgICAvLyBkaXNhYmxlIGRpdGhlcmluZworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbnVtX3Jvd3MgPSBoZWlnaHQgLSByb3c7ICAgICAvLyBkZWNvZGUgZXZlcnl0aGluZyBpbiBvbmUgcGFzcworICAgICAgfQorICAgIH0KKworICAgIGFzc2VydChkZWMtPmFscGhfZGVjXyAhPSBOVUxMKTsKKyAgICBhc3NlcnQocm93ICsgbnVtX3Jvd3MgPD0gaGVpZ2h0KTsKKyAgICBpZiAoIUFMUEhEZWNvZGUoZGVjLCByb3csIG51bV9yb3dzKSkgZ290byBFcnJvcjsKKworICAgIGlmIChkZWMtPmlzX2FscGhhX2RlY29kZWRfKSB7ICAgLy8gZmluaXNoZWQ/CisgICAgICBBTFBIRGVsZXRlKGRlYy0+YWxwaF9kZWNfKTsKKyAgICAgIGRlYy0+YWxwaF9kZWNfID0gTlVMTDsKKyAgICAgIGlmIChkZWMtPmFscGhhX2RpdGhlcmluZ18gPiAwKSB7CisgICAgICAgIHVpbnQ4X3QqIGNvbnN0IGFscGhhID0gZGVjLT5hbHBoYV9wbGFuZV8gKyBpby0+Y3JvcF90b3AgKiB3aWR0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGlvLT5jcm9wX2xlZnQ7CisgICAgICAgIGlmICghV2ViUERlcXVhbnRpemVMZXZlbHMoYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW8tPmNyb3BfcmlnaHQgLSBpby0+Y3JvcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvLT5jcm9wX2JvdHRvbSAtIGlvLT5jcm9wX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgZGVjLT5hbHBoYV9kaXRoZXJpbmdfKSkgeworICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGRlY29kZWQgcm93LgorICByZXR1cm4gZGVjLT5hbHBoYV9wbGFuZV8gKyByb3cgKiB3aWR0aDsKKworIEVycm9yOgorICBXZWJQRGVhbGxvY2F0ZUFscGhhTWVtb3J5KGRlYyk7CisgIHJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlYy9hbHBoYWlfZGVjLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL2FscGhhaV9kZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGZhMjgxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlYy9hbHBoYWlfZGVjLmgKQEAgLTAsMCArMSw1NCBAQAorLy8gQ29weXJpZ2h0IDIwMTMgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEFscGhhIGRlY29kZXI6IGludGVybmFsIGhlYWRlci4KKy8vCisvLyBBdXRob3I6IFVydmFuZyAodXJ2YW5nQGdvb2dsZS5jb20pCisKKyNpZm5kZWYgV0VCUF9ERUNfQUxQSEFJX0RFQ19IXworI2RlZmluZSBXRUJQX0RFQ19BTFBIQUlfREVDX0hfCisKKyNpbmNsdWRlICJzcmMvZGVjL3dlYnBpX2RlYy5oIgorI2luY2x1ZGUgInNyYy91dGlscy9maWx0ZXJzX3V0aWxzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IFZQOExEZWNvZGVyOyAgLy8gRGVmaW5lZCBpbiBkZWMvdnA4bGkuaC4KKwordHlwZWRlZiBzdHJ1Y3QgQUxQSERlY29kZXIgQUxQSERlY29kZXI7CitzdHJ1Y3QgQUxQSERlY29kZXIgeworICBpbnQgd2lkdGhfOworICBpbnQgaGVpZ2h0XzsKKyAgaW50IG1ldGhvZF87CisgIFdFQlBfRklMVEVSX1RZUEUgZmlsdGVyXzsKKyAgaW50IHByZV9wcm9jZXNzaW5nXzsKKyAgc3RydWN0IFZQOExEZWNvZGVyKiB2cDhsX2RlY187CisgIFZQOElvIGlvXzsKKyAgaW50IHVzZV84Yl9kZWNvZGVfOyAgLy8gQWx0aG91Z2ggYWxwaGEgY2hhbm5lbCByZXF1aXJlcyBvbmx5IDEgYnl0ZSBwZXIKKyAgICAgICAgICAgICAgICAgICAgICAgLy8gcGl4ZWwsIHNvbWV0aW1lcyBWUDhMRGVjb2RlciBtYXkgbmVlZCB0byBhbGxvY2F0ZQorICAgICAgICAgICAgICAgICAgICAgICAvLyA0IGJ5dGVzIHBlciBwaXhlbCBpbnRlcm5hbGx5IGR1cmluZyBkZWNvZGUuCisgIHVpbnQ4X3QqIG91dHB1dF87CisgIGNvbnN0IHVpbnQ4X3QqIHByZXZfbGluZV87ICAgLy8gbGFzdCBvdXRwdXQgcm93IChvciBOVUxMKQorfTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGludGVybmFsIGZ1bmN0aW9ucy4gTm90IHB1YmxpYy4KKworLy8gRGVhbGxvY2F0ZSBtZW1vcnkgYXNzb2NpYXRlZCB0byBkZWMtPmFscGhhX3BsYW5lXyBkZWNvZGluZwordm9pZCBXZWJQRGVhbGxvY2F0ZUFscGhhTWVtb3J5KFZQOERlY29kZXIqIGNvbnN0IGRlYyk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvKiBXRUJQX0RFQ19BTFBIQUlfREVDX0hfICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL2J1ZmZlcl9kZWMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvYnVmZmVyX2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ZTNkMGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL2J1ZmZlcl9kZWMuYwpAQCAtMCwwICsxLDMxNyBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEV2ZXJ5dGhpbmcgYWJvdXQgV2ViUERlY0J1ZmZlcgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9hc3NlcnRfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0ZGxpYl9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RyaW5nX3BvZW0uaCIKKyNlbHNlCisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKworI2luY2x1ZGUgInNyYy9kZWMvdnA4aV9kZWMuaCIKKyNpbmNsdWRlICJzcmMvZGVjL3dlYnBpX2RlYy5oIgorI2luY2x1ZGUgInNyYy91dGlscy91dGlscy5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gV2ViUERlY0J1ZmZlcgorCisvLyBOdW1iZXIgb2YgYnl0ZXMgcGVyIHBpeGVsIGZvciB0aGUgZGlmZmVyZW50IGNvbG9yLXNwYWNlcy4KK3N0YXRpYyBjb25zdCB1aW50OF90IGtNb2RlQnBwW01PREVfTEFTVF0gPSB7CisgIDMsIDQsIDMsIDQsIDQsIDIsIDIsCisgIDQsIDQsIDQsIDIsICAgIC8vIHByZS1tdWx0aXBsaWVkIG1vZGVzCisgIDEsIDEgfTsKKworLy8gQ2hlY2sgdGhhdCB3ZWJwX2NzcF9tb2RlIGlzIHdpdGhpbiB0aGUgYm91bmRzIG9mIFdFQlBfQ1NQX01PREUuCisvLyBDb252ZXJ0IHRvIGFuIGludGVnZXIgdG8gaGFuZGxlIGJvdGggdGhlIHVuc2lnbmVkL3NpZ25lZCBlbnVtIGNhc2VzCisvLyB3aXRob3V0IHRoZSBuZWVkIGZvciBjYXN0aW5nIHRvIHJlbW92ZSB0eXBlIGxpbWl0IHdhcm5pbmdzLgorc3RhdGljIGludCBJc1ZhbGlkQ29sb3JzcGFjZShpbnQgd2VicF9jc3BfbW9kZSkgeworICByZXR1cm4gKHdlYnBfY3NwX21vZGUgPj0gTU9ERV9SR0IgJiYgd2VicF9jc3BfbW9kZSA8IE1PREVfTEFTVCk7Cit9CisKKy8vIHN0cmljdGx5IHNwZWFraW5nLCB0aGUgdmVyeSBsYXN0IChvciBmaXJzdCwgaWYgZmxpcHBlZCkgcm93CisvLyBkb2Vzbid0IHJlcXVpcmUgcGFkZGluZy4KKyNkZWZpbmUgTUlOX0JVRkZFUl9TSVpFKFdJRFRILCBIRUlHSFQsIFNUUklERSkgICAgICAgXAorICAgICgodWludDY0X3QpKFNUUklERSkgKiAoKEhFSUdIVCkgLSAxKSArIChXSURUSCkpCisKK3N0YXRpYyBWUDhTdGF0dXNDb2RlIENoZWNrRGVjQnVmZmVyKGNvbnN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IGJ1ZmZlcikgeworICBpbnQgb2sgPSAxOworICBjb25zdCBXRUJQX0NTUF9NT0RFIG1vZGUgPSBidWZmZXItPmNvbG9yc3BhY2U7CisgIGNvbnN0IGludCB3aWR0aCA9IGJ1ZmZlci0+d2lkdGg7CisgIGNvbnN0IGludCBoZWlnaHQgPSBidWZmZXItPmhlaWdodDsKKyAgaWYgKCFJc1ZhbGlkQ29sb3JzcGFjZShtb2RlKSkgeworICAgIG9rID0gMDsKKyAgfSBlbHNlIGlmICghV2ViUElzUkdCTW9kZShtb2RlKSkgeyAgIC8vIFlVViBjaGVja3MKKyAgICBjb25zdCBXZWJQWVVWQUJ1ZmZlciogY29uc3QgYnVmID0gJmJ1ZmZlci0+dS5ZVVZBOworICAgIGNvbnN0IGludCB1dl93aWR0aCAgPSAod2lkdGggICsgMSkgLyAyOworICAgIGNvbnN0IGludCB1dl9oZWlnaHQgPSAoaGVpZ2h0ICsgMSkgLyAyOworICAgIGNvbnN0IGludCB5X3N0cmlkZSA9IGFicyhidWYtPnlfc3RyaWRlKTsKKyAgICBjb25zdCBpbnQgdV9zdHJpZGUgPSBhYnMoYnVmLT51X3N0cmlkZSk7CisgICAgY29uc3QgaW50IHZfc3RyaWRlID0gYWJzKGJ1Zi0+dl9zdHJpZGUpOworICAgIGNvbnN0IGludCBhX3N0cmlkZSA9IGFicyhidWYtPmFfc3RyaWRlKTsKKyAgICBjb25zdCB1aW50NjRfdCB5X3NpemUgPSBNSU5fQlVGRkVSX1NJWkUod2lkdGgsIGhlaWdodCwgeV9zdHJpZGUpOworICAgIGNvbnN0IHVpbnQ2NF90IHVfc2l6ZSA9IE1JTl9CVUZGRVJfU0laRSh1dl93aWR0aCwgdXZfaGVpZ2h0LCB1X3N0cmlkZSk7CisgICAgY29uc3QgdWludDY0X3Qgdl9zaXplID0gTUlOX0JVRkZFUl9TSVpFKHV2X3dpZHRoLCB1dl9oZWlnaHQsIHZfc3RyaWRlKTsKKyAgICBjb25zdCB1aW50NjRfdCBhX3NpemUgPSBNSU5fQlVGRkVSX1NJWkUod2lkdGgsIGhlaWdodCwgYV9zdHJpZGUpOworICAgIG9rICY9ICh5X3NpemUgPD0gYnVmLT55X3NpemUpOworICAgIG9rICY9ICh1X3NpemUgPD0gYnVmLT51X3NpemUpOworICAgIG9rICY9ICh2X3NpemUgPD0gYnVmLT52X3NpemUpOworICAgIG9rICY9ICh5X3N0cmlkZSA+PSB3aWR0aCk7CisgICAgb2sgJj0gKHVfc3RyaWRlID49IHV2X3dpZHRoKTsKKyAgICBvayAmPSAodl9zdHJpZGUgPj0gdXZfd2lkdGgpOworICAgIG9rICY9IChidWYtPnkgIT0gTlVMTCk7CisgICAgb2sgJj0gKGJ1Zi0+dSAhPSBOVUxMKTsKKyAgICBvayAmPSAoYnVmLT52ICE9IE5VTEwpOworICAgIGlmIChtb2RlID09IE1PREVfWVVWQSkgeworICAgICAgb2sgJj0gKGFfc3RyaWRlID49IHdpZHRoKTsKKyAgICAgIG9rICY9IChhX3NpemUgPD0gYnVmLT5hX3NpemUpOworICAgICAgb2sgJj0gKGJ1Zi0+YSAhPSBOVUxMKTsKKyAgICB9CisgIH0gZWxzZSB7ICAgIC8vIFJHQiBjaGVja3MKKyAgICBjb25zdCBXZWJQUkdCQUJ1ZmZlciogY29uc3QgYnVmID0gJmJ1ZmZlci0+dS5SR0JBOworICAgIGNvbnN0IGludCBzdHJpZGUgPSBhYnMoYnVmLT5zdHJpZGUpOworICAgIGNvbnN0IHVpbnQ2NF90IHNpemUgPSBNSU5fQlVGRkVSX1NJWkUod2lkdGgsIGhlaWdodCwgc3RyaWRlKTsKKyAgICBvayAmPSAoc2l6ZSA8PSBidWYtPnNpemUpOworICAgIG9rICY9IChzdHJpZGUgPj0gd2lkdGggKiBrTW9kZUJwcFttb2RlXSk7CisgICAgb2sgJj0gKGJ1Zi0+cmdiYSAhPSBOVUxMKTsKKyAgfQorICByZXR1cm4gb2sgPyBWUDhfU1RBVFVTX09LIDogVlA4X1NUQVRVU19JTlZBTElEX1BBUkFNOworfQorI3VuZGVmIE1JTl9CVUZGRVJfU0laRQorCitzdGF0aWMgVlA4U3RhdHVzQ29kZSBBbGxvY2F0ZUJ1ZmZlcihXZWJQRGVjQnVmZmVyKiBjb25zdCBidWZmZXIpIHsKKyAgY29uc3QgaW50IHcgPSBidWZmZXItPndpZHRoOworICBjb25zdCBpbnQgaCA9IGJ1ZmZlci0+aGVpZ2h0OworICBjb25zdCBXRUJQX0NTUF9NT0RFIG1vZGUgPSBidWZmZXItPmNvbG9yc3BhY2U7CisKKyAgaWYgKHcgPD0gMCB8fCBoIDw9IDAgfHwgIUlzVmFsaWRDb2xvcnNwYWNlKG1vZGUpKSB7CisgICAgcmV0dXJuIFZQOF9TVEFUVVNfSU5WQUxJRF9QQVJBTTsKKyAgfQorCisgIGlmIChidWZmZXItPmlzX2V4dGVybmFsX21lbW9yeSA8PSAwICYmIGJ1ZmZlci0+cHJpdmF0ZV9tZW1vcnkgPT0gTlVMTCkgeworICAgIHVpbnQ4X3QqIG91dHB1dDsKKyAgICBpbnQgdXZfc3RyaWRlID0gMCwgYV9zdHJpZGUgPSAwOworICAgIHVpbnQ2NF90IHV2X3NpemUgPSAwLCBhX3NpemUgPSAwLCB0b3RhbF9zaXplOworICAgIC8vIFdlIG5lZWQgbWVtb3J5IGFuZCBpdCBoYXNuJ3QgYmVlbiBhbGxvY2F0ZWQgeWV0LgorICAgIC8vID0+IGluaXRpYWxpemUgb3V0cHV0IGJ1ZmZlciwgbm93IHRoYXQgZGltZW5zaW9ucyBhcmUga25vd24uCisgICAgaW50IHN0cmlkZTsKKyAgICB1aW50NjRfdCBzaXplOworCisgICAgaWYgKCh1aW50NjRfdCl3ICoga01vZGVCcHBbbW9kZV0gPj0gKDF1bGwgPDwgMzIpKSB7CisgICAgICByZXR1cm4gVlA4X1NUQVRVU19JTlZBTElEX1BBUkFNOworICAgIH0KKyAgICBzdHJpZGUgPSB3ICoga01vZGVCcHBbbW9kZV07CisgICAgc2l6ZSA9ICh1aW50NjRfdClzdHJpZGUgKiBoOworICAgIGlmICghV2ViUElzUkdCTW9kZShtb2RlKSkgeworICAgICAgdXZfc3RyaWRlID0gKHcgKyAxKSAvIDI7CisgICAgICB1dl9zaXplID0gKHVpbnQ2NF90KXV2X3N0cmlkZSAqICgoaCArIDEpIC8gMik7CisgICAgICBpZiAobW9kZSA9PSBNT0RFX1lVVkEpIHsKKyAgICAgICAgYV9zdHJpZGUgPSB3OworICAgICAgICBhX3NpemUgPSAodWludDY0X3QpYV9zdHJpZGUgKiBoOworICAgICAgfQorICAgIH0KKyAgICB0b3RhbF9zaXplID0gc2l6ZSArIDIgKiB1dl9zaXplICsgYV9zaXplOworCisgICAgLy8gU2VjdXJpdHkvc2FuaXR5IGNoZWNrcworICAgIG91dHB1dCA9ICh1aW50OF90KilXZWJQU2FmZU1hbGxvYyh0b3RhbF9zaXplLCBzaXplb2YoKm91dHB1dCkpOworICAgIGlmIChvdXRwdXQgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfT1VUX09GX01FTU9SWTsKKyAgICB9CisgICAgYnVmZmVyLT5wcml2YXRlX21lbW9yeSA9IG91dHB1dDsKKworICAgIGlmICghV2ViUElzUkdCTW9kZShtb2RlKSkgeyAgIC8vIFlVVkEgaW5pdGlhbGl6YXRpb24KKyAgICAgIFdlYlBZVVZBQnVmZmVyKiBjb25zdCBidWYgPSAmYnVmZmVyLT51LllVVkE7CisgICAgICBidWYtPnkgPSBvdXRwdXQ7CisgICAgICBidWYtPnlfc3RyaWRlID0gc3RyaWRlOworICAgICAgYnVmLT55X3NpemUgPSAoc2l6ZV90KXNpemU7CisgICAgICBidWYtPnUgPSBvdXRwdXQgKyBzaXplOworICAgICAgYnVmLT51X3N0cmlkZSA9IHV2X3N0cmlkZTsKKyAgICAgIGJ1Zi0+dV9zaXplID0gKHNpemVfdCl1dl9zaXplOworICAgICAgYnVmLT52ID0gb3V0cHV0ICsgc2l6ZSArIHV2X3NpemU7CisgICAgICBidWYtPnZfc3RyaWRlID0gdXZfc3RyaWRlOworICAgICAgYnVmLT52X3NpemUgPSAoc2l6ZV90KXV2X3NpemU7CisgICAgICBpZiAobW9kZSA9PSBNT0RFX1lVVkEpIHsKKyAgICAgICAgYnVmLT5hID0gb3V0cHV0ICsgc2l6ZSArIDIgKiB1dl9zaXplOworICAgICAgfQorICAgICAgYnVmLT5hX3NpemUgPSAoc2l6ZV90KWFfc2l6ZTsKKyAgICAgIGJ1Zi0+YV9zdHJpZGUgPSBhX3N0cmlkZTsKKyAgICB9IGVsc2UgeyAgLy8gUkdCQSBpbml0aWFsaXphdGlvbgorICAgICAgV2ViUFJHQkFCdWZmZXIqIGNvbnN0IGJ1ZiA9ICZidWZmZXItPnUuUkdCQTsKKyAgICAgIGJ1Zi0+cmdiYSA9IG91dHB1dDsKKyAgICAgIGJ1Zi0+c3RyaWRlID0gc3RyaWRlOworICAgICAgYnVmLT5zaXplID0gKHNpemVfdClzaXplOworICAgIH0KKyAgfQorICByZXR1cm4gQ2hlY2tEZWNCdWZmZXIoYnVmZmVyKTsKK30KKworVlA4U3RhdHVzQ29kZSBXZWJQRmxpcEJ1ZmZlcihXZWJQRGVjQnVmZmVyKiBjb25zdCBidWZmZXIpIHsKKyAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisgICAgcmV0dXJuIFZQOF9TVEFUVVNfSU5WQUxJRF9QQVJBTTsKKyAgfQorICBpZiAoV2ViUElzUkdCTW9kZShidWZmZXItPmNvbG9yc3BhY2UpKSB7CisgICAgV2ViUFJHQkFCdWZmZXIqIGNvbnN0IGJ1ZiA9ICZidWZmZXItPnUuUkdCQTsKKyAgICBidWYtPnJnYmEgKz0gKGJ1ZmZlci0+aGVpZ2h0IC0gMSkgKiBidWYtPnN0cmlkZTsKKyAgICBidWYtPnN0cmlkZSA9IC1idWYtPnN0cmlkZTsKKyAgfSBlbHNlIHsKKyAgICBXZWJQWVVWQUJ1ZmZlciogY29uc3QgYnVmID0gJmJ1ZmZlci0+dS5ZVVZBOworICAgIGNvbnN0IGludCBIID0gYnVmZmVyLT5oZWlnaHQ7CisgICAgYnVmLT55ICs9IChIIC0gMSkgKiBidWYtPnlfc3RyaWRlOworICAgIGJ1Zi0+eV9zdHJpZGUgPSAtYnVmLT55X3N0cmlkZTsKKyAgICBidWYtPnUgKz0gKChIIC0gMSkgPj4gMSkgKiBidWYtPnVfc3RyaWRlOworICAgIGJ1Zi0+dV9zdHJpZGUgPSAtYnVmLT51X3N0cmlkZTsKKyAgICBidWYtPnYgKz0gKChIIC0gMSkgPj4gMSkgKiBidWYtPnZfc3RyaWRlOworICAgIGJ1Zi0+dl9zdHJpZGUgPSAtYnVmLT52X3N0cmlkZTsKKyAgICBpZiAoYnVmLT5hICE9IE5VTEwpIHsKKyAgICAgIGJ1Zi0+YSArPSAoSCAtIDEpICogYnVmLT5hX3N0cmlkZTsKKyAgICAgIGJ1Zi0+YV9zdHJpZGUgPSAtYnVmLT5hX3N0cmlkZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFZQOF9TVEFUVVNfT0s7Cit9CisKK1ZQOFN0YXR1c0NvZGUgV2ViUEFsbG9jYXRlRGVjQnVmZmVyKGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBEZWNvZGVyT3B0aW9ucyogY29uc3Qgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBEZWNCdWZmZXIqIGNvbnN0IGJ1ZmZlcikgeworICBWUDhTdGF0dXNDb2RlIHN0YXR1czsKKyAgaWYgKGJ1ZmZlciA9PSBOVUxMIHx8IHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDApIHsKKyAgICByZXR1cm4gVlA4X1NUQVRVU19JTlZBTElEX1BBUkFNOworICB9CisgIGlmIChvcHRpb25zICE9IE5VTEwpIHsgICAgLy8gRmlyc3QsIGFwcGx5IG9wdGlvbnMgaWYgdGhlcmUgaXMgYW55LgorICAgIGlmIChvcHRpb25zLT51c2VfY3JvcHBpbmcpIHsKKyAgICAgIGNvbnN0IGludCBjdyA9IG9wdGlvbnMtPmNyb3Bfd2lkdGg7CisgICAgICBjb25zdCBpbnQgY2ggPSBvcHRpb25zLT5jcm9wX2hlaWdodDsKKyAgICAgIGNvbnN0IGludCB4ID0gb3B0aW9ucy0+Y3JvcF9sZWZ0ICYgfjE7CisgICAgICBjb25zdCBpbnQgeSA9IG9wdGlvbnMtPmNyb3BfdG9wICYgfjE7CisgICAgICBpZiAoeCA8IDAgfHwgeSA8IDAgfHwgY3cgPD0gMCB8fCBjaCA8PSAwIHx8CisgICAgICAgICAgeCArIGN3ID4gd2lkdGggfHwgeSArIGNoID4gaGVpZ2h0KSB7CisgICAgICAgIHJldHVybiBWUDhfU1RBVFVTX0lOVkFMSURfUEFSQU07ICAgLy8gb3V0IG9mIGZyYW1lIGJvdW5kYXJ5LgorICAgICAgfQorICAgICAgd2lkdGggPSBjdzsKKyAgICAgIGhlaWdodCA9IGNoOworICAgIH0KKworICAgIGlmIChvcHRpb25zLT51c2Vfc2NhbGluZykgeworI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX1NJWkUpCisgICAgICBpbnQgc2NhbGVkX3dpZHRoID0gb3B0aW9ucy0+c2NhbGVkX3dpZHRoOworICAgICAgaW50IHNjYWxlZF9oZWlnaHQgPSBvcHRpb25zLT5zY2FsZWRfaGVpZ2h0OworICAgICAgaWYgKCFXZWJQUmVzY2FsZXJHZXRTY2FsZWREaW1lbnNpb25zKAorICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCAmc2NhbGVkX3dpZHRoLCAmc2NhbGVkX2hlaWdodCkpIHsKKyAgICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfSU5WQUxJRF9QQVJBTTsKKyAgICAgIH0KKyAgICAgIHdpZHRoID0gc2NhbGVkX3dpZHRoOworICAgICAgaGVpZ2h0ID0gc2NhbGVkX2hlaWdodDsKKyNlbHNlCisgICAgICByZXR1cm4gVlA4X1NUQVRVU19JTlZBTElEX1BBUkFNOyAgIC8vIHJlc2NhbGluZyBub3Qgc3VwcG9ydGVkCisjZW5kaWYKKyAgICB9CisgIH0KKyAgYnVmZmVyLT53aWR0aCA9IHdpZHRoOworICBidWZmZXItPmhlaWdodCA9IGhlaWdodDsKKworICAvLyBUaGVuLCBhbGxvY2F0ZSBidWZmZXIgZm9yIHJlYWwuCisgIHN0YXR1cyA9IEFsbG9jYXRlQnVmZmVyKGJ1ZmZlcik7CisgIGlmIChzdGF0dXMgIT0gVlA4X1NUQVRVU19PSykgcmV0dXJuIHN0YXR1czsKKworICAvLyBVc2UgdGhlIHN0cmlkZSB0cmljayBpZiB2ZXJ0aWNhbCBmbGlwIGlzIG5lZWRlZC4KKyAgaWYgKG9wdGlvbnMgIT0gTlVMTCAmJiBvcHRpb25zLT5mbGlwKSB7CisgICAgc3RhdHVzID0gV2ViUEZsaXBCdWZmZXIoYnVmZmVyKTsKKyAgfQorICByZXR1cm4gc3RhdHVzOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29uc3RydWN0b3JzIC8gZGVzdHJ1Y3RvcnMKKworaW50IFdlYlBJbml0RGVjQnVmZmVySW50ZXJuYWwoV2ViUERlY0J1ZmZlciogYnVmZmVyLCBpbnQgdmVyc2lvbikgeworICBpZiAoV0VCUF9BQklfSVNfSU5DT01QQVRJQkxFKHZlcnNpb24sIFdFQlBfREVDT0RFUl9BQklfVkVSU0lPTikpIHsKKyAgICByZXR1cm4gMDsgIC8vIHZlcnNpb24gbWlzbWF0Y2gKKyAgfQorICBpZiAoYnVmZmVyID09IE5VTEwpIHJldHVybiAwOworICBtZW1zZXQoYnVmZmVyLCAwLCBzaXplb2YoKmJ1ZmZlcikpOworICByZXR1cm4gMTsKK30KKwordm9pZCBXZWJQRnJlZURlY0J1ZmZlcihXZWJQRGVjQnVmZmVyKiBidWZmZXIpIHsKKyAgaWYgKGJ1ZmZlciAhPSBOVUxMKSB7CisgICAgaWYgKGJ1ZmZlci0+aXNfZXh0ZXJuYWxfbWVtb3J5IDw9IDApIHsKKyAgICAgIFdlYlBTYWZlRnJlZShidWZmZXItPnByaXZhdGVfbWVtb3J5KTsKKyAgICB9CisgICAgYnVmZmVyLT5wcml2YXRlX21lbW9yeSA9IE5VTEw7CisgIH0KK30KKwordm9pZCBXZWJQQ29weURlY0J1ZmZlcihjb25zdCBXZWJQRGVjQnVmZmVyKiBjb25zdCBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgIFdlYlBEZWNCdWZmZXIqIGNvbnN0IGRzdCkgeworICBpZiAoc3JjICE9IE5VTEwgJiYgZHN0ICE9IE5VTEwpIHsKKyAgICAqZHN0ID0gKnNyYzsKKyAgICBpZiAoc3JjLT5wcml2YXRlX21lbW9yeSAhPSBOVUxMKSB7CisgICAgICBkc3QtPmlzX2V4dGVybmFsX21lbW9yeSA9IDE7ICAgLy8gZHN0IGJ1ZmZlciBkb2Vzbid0IG93biB0aGUgbWVtb3J5LgorICAgICAgZHN0LT5wcml2YXRlX21lbW9yeSA9IE5VTEw7CisgICAgfQorICB9Cit9CisKKy8vIENvcHkgYW5kIHRyYW5zZmVyIG93bmVyc2hpcCBmcm9tIHNyYyB0byBkc3QgKGJld2FyZSBvZiBwYXJhbWV0ZXIgb3JkZXIhKQordm9pZCBXZWJQR3JhYkRlY0J1ZmZlcihXZWJQRGVjQnVmZmVyKiBjb25zdCBzcmMsIFdlYlBEZWNCdWZmZXIqIGNvbnN0IGRzdCkgeworICBpZiAoc3JjICE9IE5VTEwgJiYgZHN0ICE9IE5VTEwpIHsKKyAgICAqZHN0ID0gKnNyYzsKKyAgICBpZiAoc3JjLT5wcml2YXRlX21lbW9yeSAhPSBOVUxMKSB7CisgICAgICBzcmMtPmlzX2V4dGVybmFsX21lbW9yeSA9IDE7ICAgLy8gc3JjIHJlbGlucXVpc2hlcyBvd25lcnNoaXAKKyAgICAgIHNyYy0+cHJpdmF0ZV9tZW1vcnkgPSBOVUxMOworICAgIH0KKyAgfQorfQorCitWUDhTdGF0dXNDb2RlIFdlYlBDb3B5RGVjQnVmZmVyUGl4ZWxzKGNvbnN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBEZWNCdWZmZXIqIGNvbnN0IGRzdF9idWYpIHsKKyAgYXNzZXJ0KHNyY19idWYgIT0gTlVMTCAmJiBkc3RfYnVmICE9IE5VTEwpOworICBhc3NlcnQoc3JjX2J1Zi0+Y29sb3JzcGFjZSA9PSBkc3RfYnVmLT5jb2xvcnNwYWNlKTsKKworICBkc3RfYnVmLT53aWR0aCA9IHNyY19idWYtPndpZHRoOworICBkc3RfYnVmLT5oZWlnaHQgPSBzcmNfYnVmLT5oZWlnaHQ7CisgIGlmIChDaGVja0RlY0J1ZmZlcihkc3RfYnVmKSAhPSBWUDhfU1RBVFVTX09LKSB7CisgICAgcmV0dXJuIFZQOF9TVEFUVVNfSU5WQUxJRF9QQVJBTTsKKyAgfQorICBpZiAoV2ViUElzUkdCTW9kZShzcmNfYnVmLT5jb2xvcnNwYWNlKSkgeworICAgIGNvbnN0IFdlYlBSR0JBQnVmZmVyKiBjb25zdCBzcmMgPSAmc3JjX2J1Zi0+dS5SR0JBOworICAgIGNvbnN0IFdlYlBSR0JBQnVmZmVyKiBjb25zdCBkc3QgPSAmZHN0X2J1Zi0+dS5SR0JBOworICAgIFdlYlBDb3B5UGxhbmUoc3JjLT5yZ2JhLCBzcmMtPnN0cmlkZSwgZHN0LT5yZ2JhLCBkc3QtPnN0cmlkZSwKKyAgICAgICAgICAgICAgICAgIHNyY19idWYtPndpZHRoICoga01vZGVCcHBbc3JjX2J1Zi0+Y29sb3JzcGFjZV0sCisgICAgICAgICAgICAgICAgICBzcmNfYnVmLT5oZWlnaHQpOworICB9IGVsc2UgeworICAgIGNvbnN0IFdlYlBZVVZBQnVmZmVyKiBjb25zdCBzcmMgPSAmc3JjX2J1Zi0+dS5ZVVZBOworICAgIGNvbnN0IFdlYlBZVVZBQnVmZmVyKiBjb25zdCBkc3QgPSAmZHN0X2J1Zi0+dS5ZVVZBOworICAgIFdlYlBDb3B5UGxhbmUoc3JjLT55LCBzcmMtPnlfc3RyaWRlLCBkc3QtPnksIGRzdC0+eV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICBzcmNfYnVmLT53aWR0aCwgc3JjX2J1Zi0+aGVpZ2h0KTsKKyAgICBXZWJQQ29weVBsYW5lKHNyYy0+dSwgc3JjLT51X3N0cmlkZSwgZHN0LT51LCBkc3QtPnVfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgKHNyY19idWYtPndpZHRoICsgMSkgLyAyLCAoc3JjX2J1Zi0+aGVpZ2h0ICsgMSkgLyAyKTsKKyAgICBXZWJQQ29weVBsYW5lKHNyYy0+diwgc3JjLT52X3N0cmlkZSwgZHN0LT52LCBkc3QtPnZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgKHNyY19idWYtPndpZHRoICsgMSkgLyAyLCAoc3JjX2J1Zi0+aGVpZ2h0ICsgMSkgLyAyKTsKKyAgICBpZiAoV2ViUElzQWxwaGFNb2RlKHNyY19idWYtPmNvbG9yc3BhY2UpKSB7CisgICAgICBXZWJQQ29weVBsYW5lKHNyYy0+YSwgc3JjLT5hX3N0cmlkZSwgZHN0LT5hLCBkc3QtPmFfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICBzcmNfYnVmLT53aWR0aCwgc3JjX2J1Zi0+aGVpZ2h0KTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFZQOF9TVEFUVVNfT0s7Cit9CisKK2ludCBXZWJQQXZvaWRTbG93TWVtb3J5KGNvbnN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBCaXRzdHJlYW1GZWF0dXJlcyogY29uc3QgZmVhdHVyZXMpIHsKKyAgYXNzZXJ0KG91dHB1dCAhPSBOVUxMKTsKKyAgcmV0dXJuIChvdXRwdXQtPmlzX2V4dGVybmFsX21lbW9yeSA+PSAyKSAmJgorICAgICAgICAgV2ViUElzUHJlbXVsdGlwbGllZE1vZGUob3V0cHV0LT5jb2xvcnNwYWNlKSAmJgorICAgICAgICAgKGZlYXR1cmVzICE9IE5VTEwgJiYgZmVhdHVyZXMtPmhhc19hbHBoYSk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL2NvbW1vbl9kZWMuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvY29tbW9uX2RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5OTVmMWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL2NvbW1vbl9kZWMuaApAQCAtMCwwICsxLDU0IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBjb21tb24gdG8gZW5jb2RpbmcgYW5kIGRlY29kaW5nCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2lmbmRlZiBXRUJQX0RFQ19DT01NT05fREVDX0hfCisjZGVmaW5lIFdFQlBfREVDX0NPTU1PTl9ERUNfSF8KKworLy8gaW50cmEgcHJlZGljdGlvbiBtb2RlcworZW51bSB7IEJfRENfUFJFRCA9IDAsICAgLy8gNHg0IG1vZGVzCisgICAgICAgQl9UTV9QUkVEID0gMSwKKyAgICAgICBCX1ZFX1BSRUQgPSAyLAorICAgICAgIEJfSEVfUFJFRCA9IDMsCisgICAgICAgQl9SRF9QUkVEID0gNCwKKyAgICAgICBCX1ZSX1BSRUQgPSA1LAorICAgICAgIEJfTERfUFJFRCA9IDYsCisgICAgICAgQl9WTF9QUkVEID0gNywKKyAgICAgICBCX0hEX1BSRUQgPSA4LAorICAgICAgIEJfSFVfUFJFRCA9IDksCisgICAgICAgTlVNX0JNT0RFUyA9IEJfSFVfUFJFRCArIDEgLSBCX0RDX1BSRUQsICAvLyA9IDEwCisKKyAgICAgICAvLyBMdW1hMTYgb3IgVVYgbW9kZXMKKyAgICAgICBEQ19QUkVEID0gQl9EQ19QUkVELCBWX1BSRUQgPSBCX1ZFX1BSRUQsCisgICAgICAgSF9QUkVEID0gQl9IRV9QUkVELCBUTV9QUkVEID0gQl9UTV9QUkVELAorICAgICAgIEJfUFJFRCA9IE5VTV9CTU9ERVMsICAgLy8gcmVmaW5lZCBJNHg0IG1vZGUKKyAgICAgICBOVU1fUFJFRF9NT0RFUyA9IDQsCisKKyAgICAgICAvLyBzcGVjaWFsIG1vZGVzCisgICAgICAgQl9EQ19QUkVEX05PVE9QID0gNCwKKyAgICAgICBCX0RDX1BSRURfTk9MRUZUID0gNSwKKyAgICAgICBCX0RDX1BSRURfTk9UT1BMRUZUID0gNiwKKyAgICAgICBOVU1fQl9EQ19NT0RFUyA9IDcgfTsKKworZW51bSB7IE1CX0ZFQVRVUkVfVFJFRV9QUk9CUyA9IDMsCisgICAgICAgTlVNX01CX1NFR01FTlRTID0gNCwKKyAgICAgICBOVU1fUkVGX0xGX0RFTFRBUyA9IDQsCisgICAgICAgTlVNX01PREVfTEZfREVMVEFTID0gNCwgICAgLy8gSTR4NCwgWkVSTywgKiwgU1BMSVQKKyAgICAgICBNQVhfTlVNX1BBUlRJVElPTlMgPSA4LAorICAgICAgIC8vIFByb2JhYmlsaXRpZXMKKyAgICAgICBOVU1fVFlQRVMgPSA0LCAgIC8vIDA6IGkxNi1BQywgIDE6IGkxNi1EQywgIDI6Y2hyb21hLUFDLCAgMzppNC1BQworICAgICAgIE5VTV9CQU5EUyA9IDgsCisgICAgICAgTlVNX0NUWCA9IDMsCisgICAgICAgTlVNX1BST0JBUyA9IDExCisgICAgIH07CisKKyNlbmRpZiAgICAvLyBXRUJQX0RFQ19DT01NT05fREVDX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL2ZyYW1lX2RlYy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlYy9mcmFtZV9kZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzVmMzFlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlYy9mcmFtZV9kZWMuYwpAQCAtMCwwICsxLDgxNiBAQAorLy8gQ29weXJpZ2h0IDIwMTAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZyYW1lLXJlY29uc3RydWN0aW9uIGZ1bmN0aW9uLiBNZW1vcnkgYWxsb2NhdGlvbi4KKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vYXNzZXJ0X3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdGRsaWJfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0cmluZ19wb2VtLmgiCisjZWxzZQorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisjaW5jbHVkZSAic3JjL2RlYy92cDhpX2RlYy5oIgorI2luY2x1ZGUgInNyYy91dGlscy91dGlscy5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWFpbiByZWNvbnN0cnVjdGlvbiBmdW5jdGlvbi4KKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGtTY2FuWzE2XSA9IHsKKyAgMCArICAwICogQlBTLCAgNCArICAwICogQlBTLCA4ICsgIDAgKiBCUFMsIDEyICsgIDAgKiBCUFMsCisgIDAgKyAgNCAqIEJQUywgIDQgKyAgNCAqIEJQUywgOCArICA0ICogQlBTLCAxMiArICA0ICogQlBTLAorICAwICsgIDggKiBCUFMsICA0ICsgIDggKiBCUFMsIDggKyAgOCAqIEJQUywgMTIgKyAgOCAqIEJQUywKKyAgMCArIDEyICogQlBTLCAgNCArIDEyICogQlBTLCA4ICsgMTIgKiBCUFMsIDEyICsgMTIgKiBCUFMKK307CisKK3N0YXRpYyBpbnQgQ2hlY2tNb2RlKGludCBtYl94LCBpbnQgbWJfeSwgaW50IG1vZGUpIHsKKyAgaWYgKG1vZGUgPT0gQl9EQ19QUkVEKSB7CisgICAgaWYgKG1iX3ggPT0gMCkgeworICAgICAgcmV0dXJuIChtYl95ID09IDApID8gQl9EQ19QUkVEX05PVE9QTEVGVCA6IEJfRENfUFJFRF9OT0xFRlQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAobWJfeSA9PSAwKSA/IEJfRENfUFJFRF9OT1RPUCA6IEJfRENfUFJFRDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG1vZGU7Cit9CisKK3N0YXRpYyB2b2lkIENvcHkzMmIodWludDhfdCogY29uc3QgZHN0LCBjb25zdCB1aW50OF90KiBjb25zdCBzcmMpIHsKKyAgbWVtY3B5KGRzdCwgc3JjLCA0KTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRG9UcmFuc2Zvcm0odWludDMyX3QgYml0cywgY29uc3QgaW50MTZfdCogY29uc3Qgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgZHN0KSB7CisgIHN3aXRjaCAoYml0cyA+PiAzMCkgeworICAgIGNhc2UgMzoKKyAgICAgIFZQOFRyYW5zZm9ybShzcmMsIGRzdCwgMCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBWUDhUcmFuc2Zvcm1BQzMoc3JjLCBkc3QpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgVlA4VHJhbnNmb3JtREMoc3JjLCBkc3QpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkIERvVVZUcmFuc2Zvcm0odWludDMyX3QgYml0cywgY29uc3QgaW50MTZfdCogY29uc3Qgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBkc3QpIHsKKyAgaWYgKGJpdHMgJiAweGZmKSB7ICAgIC8vIGFueSBub24temVybyBjb2VmZiBhdCBhbGw/CisgICAgaWYgKGJpdHMgJiAweGFhKSB7ICAvLyBhbnkgbm9uLXplcm8gQUMgY29lZmZpY2llbnQ/CisgICAgICBWUDhUcmFuc2Zvcm1VVihzcmMsIGRzdCk7ICAgLy8gbm90ZSB3ZSBkb24ndCB1c2UgdGhlIEFDMyB2YXJpYW50IGZvciBVL1YKKyAgICB9IGVsc2UgeworICAgICAgVlA4VHJhbnNmb3JtRENVVihzcmMsIGRzdCk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIFJlY29uc3RydWN0Um93KGNvbnN0IFZQOERlY29kZXIqIGNvbnN0IGRlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOFRocmVhZENvbnRleHQqIGN0eCkgeworICBpbnQgajsKKyAgaW50IG1iX3g7CisgIGNvbnN0IGludCBtYl95ID0gY3R4LT5tYl95XzsKKyAgY29uc3QgaW50IGNhY2hlX2lkID0gY3R4LT5pZF87CisgIHVpbnQ4X3QqIGNvbnN0IHlfZHN0ID0gZGVjLT55dXZfYl8gKyBZX09GRjsKKyAgdWludDhfdCogY29uc3QgdV9kc3QgPSBkZWMtPnl1dl9iXyArIFVfT0ZGOworICB1aW50OF90KiBjb25zdCB2X2RzdCA9IGRlYy0+eXV2X2JfICsgVl9PRkY7CisKKyAgLy8gSW5pdGlhbGl6ZSBsZWZ0LW1vc3QgYmxvY2suCisgIGZvciAoaiA9IDA7IGogPCAxNjsgKytqKSB7CisgICAgeV9kc3RbaiAqIEJQUyAtIDFdID0gMTI5OworICB9CisgIGZvciAoaiA9IDA7IGogPCA4OyArK2opIHsKKyAgICB1X2RzdFtqICogQlBTIC0gMV0gPSAxMjk7CisgICAgdl9kc3RbaiAqIEJQUyAtIDFdID0gMTI5OworICB9CisKKyAgLy8gSW5pdCB0b3AtbGVmdCBzYW1wbGUgb24gbGVmdCBjb2x1bW4gdG9vLgorICBpZiAobWJfeSA+IDApIHsKKyAgICB5X2RzdFstMSAtIEJQU10gPSB1X2RzdFstMSAtIEJQU10gPSB2X2RzdFstMSAtIEJQU10gPSAxMjk7CisgIH0gZWxzZSB7CisgICAgLy8gd2Ugb25seSBuZWVkIHRvIGRvIHRoaXMgaW5pdCBvbmNlIGF0IGJsb2NrICgwLDApLgorICAgIC8vIEFmdGVyd2FyZCwgaXQgcmVtYWlucyB2YWxpZCBmb3IgdGhlIHdob2xlIHRvcG1vc3Qgcm93LgorICAgIG1lbXNldCh5X2RzdCAtIEJQUyAtIDEsIDEyNywgMTYgKyA0ICsgMSk7CisgICAgbWVtc2V0KHVfZHN0IC0gQlBTIC0gMSwgMTI3LCA4ICsgMSk7CisgICAgbWVtc2V0KHZfZHN0IC0gQlBTIC0gMSwgMTI3LCA4ICsgMSk7CisgIH0KKworICAvLyBSZWNvbnN0cnVjdCBvbmUgcm93LgorICBmb3IgKG1iX3ggPSAwOyBtYl94IDwgZGVjLT5tYl93XzsgKyttYl94KSB7CisgICAgY29uc3QgVlA4TUJEYXRhKiBjb25zdCBibG9jayA9IGN0eC0+bWJfZGF0YV8gKyBtYl94OworCisgICAgLy8gUm90YXRlIGluIHRoZSBsZWZ0IHNhbXBsZXMgZnJvbSBwcmV2aW91c2x5IGRlY29kZWQgYmxvY2suIFdlIG1vdmUgZm91cgorICAgIC8vIHBpeGVscyBhdCBhIHRpbWUgZm9yIGFsaWdubWVudCByZWFzb24sIGFuZCBiZWNhdXNlIG9mIGluLWxvb3AgZmlsdGVyLgorICAgIGlmIChtYl94ID4gMCkgeworICAgICAgZm9yIChqID0gLTE7IGogPCAxNjsgKytqKSB7CisgICAgICAgIENvcHkzMmIoJnlfZHN0W2ogKiBCUFMgLSA0XSwgJnlfZHN0W2ogKiBCUFMgKyAxMl0pOworICAgICAgfQorICAgICAgZm9yIChqID0gLTE7IGogPCA4OyArK2opIHsKKyAgICAgICAgQ29weTMyYigmdV9kc3RbaiAqIEJQUyAtIDRdLCAmdV9kc3RbaiAqIEJQUyArIDRdKTsKKyAgICAgICAgQ29weTMyYigmdl9kc3RbaiAqIEJQUyAtIDRdLCAmdl9kc3RbaiAqIEJQUyArIDRdKTsKKyAgICAgIH0KKyAgICB9CisgICAgeworICAgICAgLy8gYnJpbmcgdG9wIHNhbXBsZXMgaW50byB0aGUgY2FjaGUKKyAgICAgIFZQOFRvcFNhbXBsZXMqIGNvbnN0IHRvcF95dXYgPSBkZWMtPnl1dl90XyArIG1iX3g7CisgICAgICBjb25zdCBpbnQxNl90KiBjb25zdCBjb2VmZnMgPSBibG9jay0+Y29lZmZzXzsKKyAgICAgIHVpbnQzMl90IGJpdHMgPSBibG9jay0+bm9uX3plcm9feV87CisgICAgICBpbnQgbjsKKworICAgICAgaWYgKG1iX3kgPiAwKSB7CisgICAgICAgIG1lbWNweSh5X2RzdCAtIEJQUywgdG9wX3l1dlswXS55LCAxNik7CisgICAgICAgIG1lbWNweSh1X2RzdCAtIEJQUywgdG9wX3l1dlswXS51LCA4KTsKKyAgICAgICAgbWVtY3B5KHZfZHN0IC0gQlBTLCB0b3BfeXV2WzBdLnYsIDgpOworICAgICAgfQorCisgICAgICAvLyBwcmVkaWN0IGFuZCBhZGQgcmVzaWR1YWxzCisgICAgICBpZiAoYmxvY2stPmlzX2k0eDRfKSB7ICAgLy8gNHg0CisgICAgICAgIHVpbnQzMl90KiBjb25zdCB0b3BfcmlnaHQgPSAodWludDMyX3QqKSh5X2RzdCAtIEJQUyArIDE2KTsKKworICAgICAgICBpZiAobWJfeSA+IDApIHsKKyAgICAgICAgICBpZiAobWJfeCA+PSBkZWMtPm1iX3dfIC0gMSkgeyAgICAvLyBvbiByaWdodG1vc3QgYm9yZGVyCisgICAgICAgICAgICBtZW1zZXQodG9wX3JpZ2h0LCB0b3BfeXV2WzBdLnlbMTVdLCBzaXplb2YoKnRvcF9yaWdodCkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZW1jcHkodG9wX3JpZ2h0LCB0b3BfeXV2WzFdLnksIHNpemVvZigqdG9wX3JpZ2h0KSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIHJlcGxpY2F0ZSB0aGUgdG9wLXJpZ2h0IHBpeGVscyBiZWxvdworICAgICAgICB0b3BfcmlnaHRbQlBTXSA9IHRvcF9yaWdodFsyICogQlBTXSA9IHRvcF9yaWdodFszICogQlBTXSA9IHRvcF9yaWdodFswXTsKKworICAgICAgICAvLyBwcmVkaWN0IGFuZCBhZGQgcmVzaWR1YWxzIGZvciBhbGwgNHg0IGJsb2NrcyBpbiB0dXJuLgorICAgICAgICBmb3IgKG4gPSAwOyBuIDwgMTY7ICsrbiwgYml0cyA8PD0gMikgeworICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IGRzdCA9IHlfZHN0ICsga1NjYW5bbl07CisgICAgICAgICAgVlA4UHJlZEx1bWE0W2Jsb2NrLT5pbW9kZXNfW25dXShkc3QpOworICAgICAgICAgIERvVHJhbnNmb3JtKGJpdHMsIGNvZWZmcyArIG4gKiAxNiwgZHN0KTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsgICAgLy8gMTZ4MTYKKyAgICAgICAgY29uc3QgaW50IHByZWRfZnVuYyA9IENoZWNrTW9kZShtYl94LCBtYl95LCBibG9jay0+aW1vZGVzX1swXSk7CisgICAgICAgIFZQOFByZWRMdW1hMTZbcHJlZF9mdW5jXSh5X2RzdCk7CisgICAgICAgIGlmIChiaXRzICE9IDApIHsKKyAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgMTY7ICsrbiwgYml0cyA8PD0gMikgeworICAgICAgICAgICAgRG9UcmFuc2Zvcm0oYml0cywgY29lZmZzICsgbiAqIDE2LCB5X2RzdCArIGtTY2FuW25dKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHsKKyAgICAgICAgLy8gQ2hyb21hCisgICAgICAgIGNvbnN0IHVpbnQzMl90IGJpdHNfdXYgPSBibG9jay0+bm9uX3plcm9fdXZfOworICAgICAgICBjb25zdCBpbnQgcHJlZF9mdW5jID0gQ2hlY2tNb2RlKG1iX3gsIG1iX3ksIGJsb2NrLT51dm1vZGVfKTsKKyAgICAgICAgVlA4UHJlZENocm9tYThbcHJlZF9mdW5jXSh1X2RzdCk7CisgICAgICAgIFZQOFByZWRDaHJvbWE4W3ByZWRfZnVuY10odl9kc3QpOworICAgICAgICBEb1VWVHJhbnNmb3JtKGJpdHNfdXYgPj4gMCwgY29lZmZzICsgMTYgKiAxNiwgdV9kc3QpOworICAgICAgICBEb1VWVHJhbnNmb3JtKGJpdHNfdXYgPj4gOCwgY29lZmZzICsgMjAgKiAxNiwgdl9kc3QpOworICAgICAgfQorCisgICAgICAvLyBzdGFzaCBhd2F5IHRvcCBzYW1wbGVzIGZvciBuZXh0IGJsb2NrCisgICAgICBpZiAobWJfeSA8IGRlYy0+bWJfaF8gLSAxKSB7CisgICAgICAgIG1lbWNweSh0b3BfeXV2WzBdLnksIHlfZHN0ICsgMTUgKiBCUFMsIDE2KTsKKyAgICAgICAgbWVtY3B5KHRvcF95dXZbMF0udSwgdV9kc3QgKyAgNyAqIEJQUywgIDgpOworICAgICAgICBtZW1jcHkodG9wX3l1dlswXS52LCB2X2RzdCArICA3ICogQlBTLCAgOCk7CisgICAgICB9CisgICAgfQorICAgIC8vIFRyYW5zZmVyIHJlY29uc3RydWN0ZWQgc2FtcGxlcyBmcm9tIHl1dl9iXyBjYWNoZSB0byBmaW5hbCBkZXN0aW5hdGlvbi4KKyAgICB7CisgICAgICBjb25zdCBpbnQgeV9vZmZzZXQgPSBjYWNoZV9pZCAqIDE2ICogZGVjLT5jYWNoZV95X3N0cmlkZV87CisgICAgICBjb25zdCBpbnQgdXZfb2Zmc2V0ID0gY2FjaGVfaWQgKiA4ICogZGVjLT5jYWNoZV91dl9zdHJpZGVfOworICAgICAgdWludDhfdCogY29uc3QgeV9vdXQgPSBkZWMtPmNhY2hlX3lfICsgbWJfeCAqIDE2ICsgeV9vZmZzZXQ7CisgICAgICB1aW50OF90KiBjb25zdCB1X291dCA9IGRlYy0+Y2FjaGVfdV8gKyBtYl94ICogOCArIHV2X29mZnNldDsKKyAgICAgIHVpbnQ4X3QqIGNvbnN0IHZfb3V0ID0gZGVjLT5jYWNoZV92XyArIG1iX3ggKiA4ICsgdXZfb2Zmc2V0OworICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyArK2opIHsKKyAgICAgICAgbWVtY3B5KHlfb3V0ICsgaiAqIGRlYy0+Y2FjaGVfeV9zdHJpZGVfLCB5X2RzdCArIGogKiBCUFMsIDE2KTsKKyAgICAgIH0KKyAgICAgIGZvciAoaiA9IDA7IGogPCA4OyArK2opIHsKKyAgICAgICAgbWVtY3B5KHVfb3V0ICsgaiAqIGRlYy0+Y2FjaGVfdXZfc3RyaWRlXywgdV9kc3QgKyBqICogQlBTLCA4KTsKKyAgICAgICAgbWVtY3B5KHZfb3V0ICsgaiAqIGRlYy0+Y2FjaGVfdXZfc3RyaWRlXywgdl9kc3QgKyBqICogQlBTLCA4KTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZpbHRlcmluZworCisvLyBrRmlsdGVyRXh0cmFSb3dzW10gPSBIb3cgbWFueSBleHRyYSBsaW5lcyBhcmUgbmVlZGVkIG9uIHRoZSBNQiBib3VuZGFyeQorLy8gZm9yIGNhY2hpbmcsIGdpdmVuIGEgZmlsdGVyaW5nIGxldmVsLgorLy8gU2ltcGxlIGZpbHRlcjogIHVwIHRvIDIgbHVtYSBzYW1wbGVzIGFyZSByZWFkIGFuZCAxIGlzIHdyaXR0ZW4uCisvLyBDb21wbGV4IGZpbHRlcjogdXAgdG8gNCBsdW1hIHNhbXBsZXMgYXJlIHJlYWQgYW5kIDMgYXJlIHdyaXR0ZW4uIFNhbWUgZm9yCisvLyAgICAgICAgICAgICAgICAgVS9WLCBzbyBpdCdzIDggc2FtcGxlcyB0b3RhbCAoYmVjYXVzZSBvZiB0aGUgMnggdXBzYW1wbGluZykuCitzdGF0aWMgY29uc3QgdWludDhfdCBrRmlsdGVyRXh0cmFSb3dzWzNdID0geyAwLCAyLCA4IH07CisKK3N0YXRpYyB2b2lkIERvRmlsdGVyKGNvbnN0IFZQOERlY29kZXIqIGNvbnN0IGRlYywgaW50IG1iX3gsIGludCBtYl95KSB7CisgIGNvbnN0IFZQOFRocmVhZENvbnRleHQqIGNvbnN0IGN0eCA9ICZkZWMtPnRocmVhZF9jdHhfOworICBjb25zdCBpbnQgY2FjaGVfaWQgPSBjdHgtPmlkXzsKKyAgY29uc3QgaW50IHlfYnBzID0gZGVjLT5jYWNoZV95X3N0cmlkZV87CisgIGNvbnN0IFZQOEZJbmZvKiBjb25zdCBmX2luZm8gPSBjdHgtPmZfaW5mb18gKyBtYl94OworICB1aW50OF90KiBjb25zdCB5X2RzdCA9IGRlYy0+Y2FjaGVfeV8gKyBjYWNoZV9pZCAqIDE2ICogeV9icHMgKyBtYl94ICogMTY7CisgIGNvbnN0IGludCBpbGV2ZWwgPSBmX2luZm8tPmZfaWxldmVsXzsKKyAgY29uc3QgaW50IGxpbWl0ID0gZl9pbmZvLT5mX2xpbWl0XzsKKyAgaWYgKGxpbWl0ID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgYXNzZXJ0KGxpbWl0ID49IDMpOworICBpZiAoZGVjLT5maWx0ZXJfdHlwZV8gPT0gMSkgeyAgIC8vIHNpbXBsZQorICAgIGlmIChtYl94ID4gMCkgeworICAgICAgVlA4U2ltcGxlSEZpbHRlcjE2KHlfZHN0LCB5X2JwcywgbGltaXQgKyA0KTsKKyAgICB9CisgICAgaWYgKGZfaW5mby0+Zl9pbm5lcl8pIHsKKyAgICAgIFZQOFNpbXBsZUhGaWx0ZXIxNmkoeV9kc3QsIHlfYnBzLCBsaW1pdCk7CisgICAgfQorICAgIGlmIChtYl95ID4gMCkgeworICAgICAgVlA4U2ltcGxlVkZpbHRlcjE2KHlfZHN0LCB5X2JwcywgbGltaXQgKyA0KTsKKyAgICB9CisgICAgaWYgKGZfaW5mby0+Zl9pbm5lcl8pIHsKKyAgICAgIFZQOFNpbXBsZVZGaWx0ZXIxNmkoeV9kc3QsIHlfYnBzLCBsaW1pdCk7CisgICAgfQorICB9IGVsc2UgeyAgICAvLyBjb21wbGV4CisgICAgY29uc3QgaW50IHV2X2JwcyA9IGRlYy0+Y2FjaGVfdXZfc3RyaWRlXzsKKyAgICB1aW50OF90KiBjb25zdCB1X2RzdCA9IGRlYy0+Y2FjaGVfdV8gKyBjYWNoZV9pZCAqIDggKiB1dl9icHMgKyBtYl94ICogODsKKyAgICB1aW50OF90KiBjb25zdCB2X2RzdCA9IGRlYy0+Y2FjaGVfdl8gKyBjYWNoZV9pZCAqIDggKiB1dl9icHMgKyBtYl94ICogODsKKyAgICBjb25zdCBpbnQgaGV2X3RocmVzaCA9IGZfaW5mby0+aGV2X3RocmVzaF87CisgICAgaWYgKG1iX3ggPiAwKSB7CisgICAgICBWUDhIRmlsdGVyMTYoeV9kc3QsIHlfYnBzLCBsaW1pdCArIDQsIGlsZXZlbCwgaGV2X3RocmVzaCk7CisgICAgICBWUDhIRmlsdGVyOCh1X2RzdCwgdl9kc3QsIHV2X2JwcywgbGltaXQgKyA0LCBpbGV2ZWwsIGhldl90aHJlc2gpOworICAgIH0KKyAgICBpZiAoZl9pbmZvLT5mX2lubmVyXykgeworICAgICAgVlA4SEZpbHRlcjE2aSh5X2RzdCwgeV9icHMsIGxpbWl0LCBpbGV2ZWwsIGhldl90aHJlc2gpOworICAgICAgVlA4SEZpbHRlcjhpKHVfZHN0LCB2X2RzdCwgdXZfYnBzLCBsaW1pdCwgaWxldmVsLCBoZXZfdGhyZXNoKTsKKyAgICB9CisgICAgaWYgKG1iX3kgPiAwKSB7CisgICAgICBWUDhWRmlsdGVyMTYoeV9kc3QsIHlfYnBzLCBsaW1pdCArIDQsIGlsZXZlbCwgaGV2X3RocmVzaCk7CisgICAgICBWUDhWRmlsdGVyOCh1X2RzdCwgdl9kc3QsIHV2X2JwcywgbGltaXQgKyA0LCBpbGV2ZWwsIGhldl90aHJlc2gpOworICAgIH0KKyAgICBpZiAoZl9pbmZvLT5mX2lubmVyXykgeworICAgICAgVlA4VkZpbHRlcjE2aSh5X2RzdCwgeV9icHMsIGxpbWl0LCBpbGV2ZWwsIGhldl90aHJlc2gpOworICAgICAgVlA4VkZpbHRlcjhpKHVfZHN0LCB2X2RzdCwgdXZfYnBzLCBsaW1pdCwgaWxldmVsLCBoZXZfdGhyZXNoKTsKKyAgICB9CisgIH0KK30KKworLy8gRmlsdGVyIHRoZSBkZWNvZGVkIG1hY3JvYmxvY2sgcm93IChpZiBuZWVkZWQpCitzdGF0aWMgdm9pZCBGaWx0ZXJSb3coY29uc3QgVlA4RGVjb2RlciogY29uc3QgZGVjKSB7CisgIGludCBtYl94OworICBjb25zdCBpbnQgbWJfeSA9IGRlYy0+dGhyZWFkX2N0eF8ubWJfeV87CisgIGFzc2VydChkZWMtPnRocmVhZF9jdHhfLmZpbHRlcl9yb3dfKTsKKyAgZm9yIChtYl94ID0gZGVjLT50bF9tYl94XzsgbWJfeCA8IGRlYy0+YnJfbWJfeF87ICsrbWJfeCkgeworICAgIERvRmlsdGVyKGRlYywgbWJfeCwgbWJfeSk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFByZWNvbXB1dGUgdGhlIGZpbHRlcmluZyBzdHJlbmd0aCBmb3IgZWFjaCBzZWdtZW50IGFuZCBlYWNoIGk0eDQvaTE2eDE2IG1vZGUuCisKK3N0YXRpYyB2b2lkIFByZWNvbXB1dGVGaWx0ZXJTdHJlbmd0aHMoVlA4RGVjb2RlciogY29uc3QgZGVjKSB7CisgIGlmIChkZWMtPmZpbHRlcl90eXBlXyA+IDApIHsKKyAgICBpbnQgczsKKyAgICBjb25zdCBWUDhGaWx0ZXJIZWFkZXIqIGNvbnN0IGhkciA9ICZkZWMtPmZpbHRlcl9oZHJfOworICAgIGZvciAocyA9IDA7IHMgPCBOVU1fTUJfU0VHTUVOVFM7ICsrcykgeworICAgICAgaW50IGk0eDQ7CisgICAgICAvLyBGaXJzdCwgY29tcHV0ZSB0aGUgaW5pdGlhbCBsZXZlbAorICAgICAgaW50IGJhc2VfbGV2ZWw7CisgICAgICBpZiAoZGVjLT5zZWdtZW50X2hkcl8udXNlX3NlZ21lbnRfKSB7CisgICAgICAgIGJhc2VfbGV2ZWwgPSBkZWMtPnNlZ21lbnRfaGRyXy5maWx0ZXJfc3RyZW5ndGhfW3NdOworICAgICAgICBpZiAoIWRlYy0+c2VnbWVudF9oZHJfLmFic29sdXRlX2RlbHRhXykgeworICAgICAgICAgIGJhc2VfbGV2ZWwgKz0gaGRyLT5sZXZlbF87CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJhc2VfbGV2ZWwgPSBoZHItPmxldmVsXzsKKyAgICAgIH0KKyAgICAgIGZvciAoaTR4NCA9IDA7IGk0eDQgPD0gMTsgKytpNHg0KSB7CisgICAgICAgIFZQOEZJbmZvKiBjb25zdCBpbmZvID0gJmRlYy0+ZnN0cmVuZ3Roc19bc11baTR4NF07CisgICAgICAgIGludCBsZXZlbCA9IGJhc2VfbGV2ZWw7CisgICAgICAgIGlmIChoZHItPnVzZV9sZl9kZWx0YV8pIHsKKyAgICAgICAgICBsZXZlbCArPSBoZHItPnJlZl9sZl9kZWx0YV9bMF07CisgICAgICAgICAgaWYgKGk0eDQpIHsKKyAgICAgICAgICAgIGxldmVsICs9IGhkci0+bW9kZV9sZl9kZWx0YV9bMF07CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGxldmVsID0gKGxldmVsIDwgMCkgPyAwIDogKGxldmVsID4gNjMpID8gNjMgOiBsZXZlbDsKKyAgICAgICAgaWYgKGxldmVsID4gMCkgeworICAgICAgICAgIGludCBpbGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgICBpZiAoaGRyLT5zaGFycG5lc3NfID4gMCkgeworICAgICAgICAgICAgaWYgKGhkci0+c2hhcnBuZXNzXyA+IDQpIHsKKyAgICAgICAgICAgICAgaWxldmVsID4+PSAyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgaWxldmVsID4+PSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlsZXZlbCA+IDkgLSBoZHItPnNoYXJwbmVzc18pIHsKKyAgICAgICAgICAgICAgaWxldmVsID0gOSAtIGhkci0+c2hhcnBuZXNzXzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGlsZXZlbCA8IDEpIGlsZXZlbCA9IDE7CisgICAgICAgICAgaW5mby0+Zl9pbGV2ZWxfID0gaWxldmVsOworICAgICAgICAgIGluZm8tPmZfbGltaXRfID0gMiAqIGxldmVsICsgaWxldmVsOworICAgICAgICAgIGluZm8tPmhldl90aHJlc2hfID0gKGxldmVsID49IDQwKSA/IDIgOiAobGV2ZWwgPj0gMTUpID8gMSA6IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaW5mby0+Zl9saW1pdF8gPSAwOyAgLy8gbm8gZmlsdGVyaW5nCisgICAgICAgIH0KKyAgICAgICAgaW5mby0+Zl9pbm5lcl8gPSBpNHg0OworICAgICAgfQorICAgIH0KKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRGl0aGVyaW5nCisKKy8vIG1pbmltYWwgYW1wIHRoYXQgd2lsbCBwcm92aWRlIGEgbm9uLXplcm8gZGl0aGVyaW5nIGVmZmVjdAorI2RlZmluZSBNSU5fRElUSEVSX0FNUCA0CisKKyNkZWZpbmUgRElUSEVSX0FNUF9UQUJfU0laRSAxMgorc3RhdGljIGNvbnN0IHVpbnQ4X3Qga1F1YW50VG9EaXRoZXJBbXBbRElUSEVSX0FNUF9UQUJfU0laRV0gPSB7CisgIC8vIHJvdWdobHksIGl0J3MgZHFtLT51dl9tYXRfWzFdCisgIDgsIDcsIDYsIDQsIDQsIDIsIDIsIDIsIDEsIDEsIDEsIDEKK307CisKK3ZvaWQgVlA4SW5pdERpdGhlcmluZyhjb25zdCBXZWJQRGVjb2Rlck9wdGlvbnMqIGNvbnN0IG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgVlA4RGVjb2RlciogY29uc3QgZGVjKSB7CisgIGFzc2VydChkZWMgIT0gTlVMTCk7CisgIGlmIChvcHRpb25zICE9IE5VTEwpIHsKKyAgICBjb25zdCBpbnQgZCA9IG9wdGlvbnMtPmRpdGhlcmluZ19zdHJlbmd0aDsKKyAgICBjb25zdCBpbnQgbWF4X2FtcCA9ICgxIDw8IFZQOF9SQU5ET01fRElUSEVSX0ZJWCkgLSAxOworICAgIGNvbnN0IGludCBmID0gKGQgPCAwKSA/IDAgOiAoZCA+IDEwMCkgPyBtYXhfYW1wIDogKGQgKiBtYXhfYW1wIC8gMTAwKTsKKyAgICBpZiAoZiA+IDApIHsKKyAgICAgIGludCBzOworICAgICAgaW50IGFsbF9hbXAgPSAwOworICAgICAgZm9yIChzID0gMDsgcyA8IE5VTV9NQl9TRUdNRU5UUzsgKytzKSB7CisgICAgICAgIFZQOFF1YW50TWF0cml4KiBjb25zdCBkcW0gPSAmZGVjLT5kcW1fW3NdOworICAgICAgICBpZiAoZHFtLT51dl9xdWFudF8gPCBESVRIRVJfQU1QX1RBQl9TSVpFKSB7CisgICAgICAgICAgLy8gVE9ETyhza2FsKTogc2hvdWxkIHdlIHNwZWNpYWxseSBkaXRoZXIgbW9yZSBmb3IgdXZfcXVhbnRfIDwgMD8KKyAgICAgICAgICBjb25zdCBpbnQgaWR4ID0gKGRxbS0+dXZfcXVhbnRfIDwgMCkgPyAwIDogZHFtLT51dl9xdWFudF87CisgICAgICAgICAgZHFtLT5kaXRoZXJfID0gKGYgKiBrUXVhbnRUb0RpdGhlckFtcFtpZHhdKSA+PiAzOworICAgICAgICB9CisgICAgICAgIGFsbF9hbXAgfD0gZHFtLT5kaXRoZXJfOworICAgICAgfQorICAgICAgaWYgKGFsbF9hbXAgIT0gMCkgeworICAgICAgICBWUDhJbml0UmFuZG9tKCZkZWMtPmRpdGhlcmluZ19yZ18sIDEuMGYpOworICAgICAgICBkZWMtPmRpdGhlcl8gPSAxOworICAgICAgfQorICAgIH0KKyAgICAvLyBwb3RlbnRpYWxseSBhbGxvdyBhbHBoYSBkaXRoZXJpbmcKKyAgICBkZWMtPmFscGhhX2RpdGhlcmluZ18gPSBvcHRpb25zLT5hbHBoYV9kaXRoZXJpbmdfc3RyZW5ndGg7CisgICAgaWYgKGRlYy0+YWxwaGFfZGl0aGVyaW5nXyA+IDEwMCkgeworICAgICAgZGVjLT5hbHBoYV9kaXRoZXJpbmdfID0gMTAwOworICAgIH0gZWxzZSBpZiAoZGVjLT5hbHBoYV9kaXRoZXJpbmdfIDwgMCkgeworICAgICAgZGVjLT5hbHBoYV9kaXRoZXJpbmdfID0gMDsKKyAgICB9CisgIH0KK30KKworLy8gQ29udmVydCB0byByYW5nZTogWy0yLDJdIGZvciBkaXRoZXI9NTAsIFstNCw0XSBmb3IgZGl0aGVyPTEwMAorc3RhdGljIHZvaWQgRGl0aGVyOHg4KFZQOFJhbmRvbSogY29uc3QgcmcsIHVpbnQ4X3QqIGRzdCwgaW50IGJwcywgaW50IGFtcCkgeworICB1aW50OF90IGRpdGhlcls2NF07CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgOCAqIDg7ICsraSkgeworICAgIGRpdGhlcltpXSA9IFZQOFJhbmRvbUJpdHMyKHJnLCBWUDhfRElUSEVSX0FNUF9CSVRTICsgMSwgYW1wKTsKKyAgfQorICBWUDhEaXRoZXJDb21iaW5lOHg4KGRpdGhlciwgZHN0LCBicHMpOworfQorCitzdGF0aWMgdm9pZCBEaXRoZXJSb3coVlA4RGVjb2RlciogY29uc3QgZGVjKSB7CisgIGludCBtYl94OworICBhc3NlcnQoZGVjLT5kaXRoZXJfKTsKKyAgZm9yIChtYl94ID0gZGVjLT50bF9tYl94XzsgbWJfeCA8IGRlYy0+YnJfbWJfeF87ICsrbWJfeCkgeworICAgIGNvbnN0IFZQOFRocmVhZENvbnRleHQqIGNvbnN0IGN0eCA9ICZkZWMtPnRocmVhZF9jdHhfOworICAgIGNvbnN0IFZQOE1CRGF0YSogY29uc3QgZGF0YSA9IGN0eC0+bWJfZGF0YV8gKyBtYl94OworICAgIGNvbnN0IGludCBjYWNoZV9pZCA9IGN0eC0+aWRfOworICAgIGNvbnN0IGludCB1dl9icHMgPSBkZWMtPmNhY2hlX3V2X3N0cmlkZV87CisgICAgaWYgKGRhdGEtPmRpdGhlcl8gPj0gTUlOX0RJVEhFUl9BTVApIHsKKyAgICAgIHVpbnQ4X3QqIGNvbnN0IHVfZHN0ID0gZGVjLT5jYWNoZV91XyArIGNhY2hlX2lkICogOCAqIHV2X2JwcyArIG1iX3ggKiA4OworICAgICAgdWludDhfdCogY29uc3Qgdl9kc3QgPSBkZWMtPmNhY2hlX3ZfICsgY2FjaGVfaWQgKiA4ICogdXZfYnBzICsgbWJfeCAqIDg7CisgICAgICBEaXRoZXI4eDgoJmRlYy0+ZGl0aGVyaW5nX3JnXywgdV9kc3QsIHV2X2JwcywgZGF0YS0+ZGl0aGVyXyk7CisgICAgICBEaXRoZXI4eDgoJmRlYy0+ZGl0aGVyaW5nX3JnXywgdl9kc3QsIHV2X2JwcywgZGF0YS0+ZGl0aGVyXyk7CisgICAgfQorICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciBhIHJvdyBvZiBtYWNyb2Jsb2NrcyBpcyBmaW5pc2hlZCBkZWNvZGluZy4KKy8vIEl0IGFsc28gdGFrZXMgaW50byBhY2NvdW50IHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorLy8gICogSW4gY2FzZSBvZiBpbi1sb29wIGZpbHRlcmluZywgd2UgbXVzdCBob2xkIG9mZiBzZW5kaW5nIHNvbWUgb2YgdGhlIGJvdHRvbQorLy8gICAgcGl4ZWxzIGFzIHRoZXkgYXJlIHlldCB1bmZpbHRlcmVkLiBUaGV5IHdpbGwgYmUgd2hlbiB0aGUgbmV4dCBtYWNyb2Jsb2NrCisvLyAgICByb3cgaXMgZGVjb2RlZC4gTWVhbndoaWxlLCB3ZSBtdXN0IHByZXNlcnZlIHRoZW0gYnkgcm90YXRpbmcgdGhlbSBpbiB0aGUKKy8vICAgIGNhY2hlIGFyZWEuIFRoaXMgZG9lc24ndCBob2xkIGZvciB0aGUgdmVyeSBib3R0b20gcm93IG9mIHRoZSB1bmNyb3BwZWQKKy8vICAgIHBpY3R1cmUgb2YgY291cnNlLgorLy8gICogd2UgbXVzdCBjbGlwIHRoZSByZW1haW5pbmcgcGl4ZWxzIGFnYWluc3QgdGhlIGNyb3BwaW5nIGFyZWEuIFRoZSBWUDhJbworLy8gICAgc3RydWN0IG11c3QgaGF2ZSB0aGUgZm9sbG93aW5nIGZpZWxkcyBzZXQgY29ycmVjdGx5IGJlZm9yZSBjYWxsaW5nIHB1dCgpOgorCisjZGVmaW5lIE1BQ1JPQkxPQ0tfVlBPUyhtYl95KSAgKChtYl95KSAqIDE2KSAgICAvLyB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiBhIE1CCisKKy8vIEZpbmFsaXplIGFuZCB0cmFuc21pdCBhIGNvbXBsZXRlIHJvdy4gUmV0dXJuIGZhbHNlIGluIGNhc2Ugb2YgdXNlci1hYm9ydC4KK3N0YXRpYyBpbnQgRmluaXNoUm93KHZvaWQqIGFyZzEsIHZvaWQqIGFyZzIpIHsKKyAgVlA4RGVjb2RlciogY29uc3QgZGVjID0gKFZQOERlY29kZXIqKWFyZzE7CisgIFZQOElvKiBjb25zdCBpbyA9IChWUDhJbyopYXJnMjsKKyAgaW50IG9rID0gMTsKKyAgY29uc3QgVlA4VGhyZWFkQ29udGV4dCogY29uc3QgY3R4ID0gJmRlYy0+dGhyZWFkX2N0eF87CisgIGNvbnN0IGludCBjYWNoZV9pZCA9IGN0eC0+aWRfOworICBjb25zdCBpbnQgZXh0cmFfeV9yb3dzID0ga0ZpbHRlckV4dHJhUm93c1tkZWMtPmZpbHRlcl90eXBlX107CisgIGNvbnN0IGludCB5c2l6ZSA9IGV4dHJhX3lfcm93cyAqIGRlYy0+Y2FjaGVfeV9zdHJpZGVfOworICBjb25zdCBpbnQgdXZzaXplID0gKGV4dHJhX3lfcm93cyAvIDIpICogZGVjLT5jYWNoZV91dl9zdHJpZGVfOworICBjb25zdCBpbnQgeV9vZmZzZXQgPSBjYWNoZV9pZCAqIDE2ICogZGVjLT5jYWNoZV95X3N0cmlkZV87CisgIGNvbnN0IGludCB1dl9vZmZzZXQgPSBjYWNoZV9pZCAqIDggKiBkZWMtPmNhY2hlX3V2X3N0cmlkZV87CisgIHVpbnQ4X3QqIGNvbnN0IHlkc3QgPSBkZWMtPmNhY2hlX3lfIC0geXNpemUgKyB5X29mZnNldDsKKyAgdWludDhfdCogY29uc3QgdWRzdCA9IGRlYy0+Y2FjaGVfdV8gLSB1dnNpemUgKyB1dl9vZmZzZXQ7CisgIHVpbnQ4X3QqIGNvbnN0IHZkc3QgPSBkZWMtPmNhY2hlX3ZfIC0gdXZzaXplICsgdXZfb2Zmc2V0OworICBjb25zdCBpbnQgbWJfeSA9IGN0eC0+bWJfeV87CisgIGNvbnN0IGludCBpc19maXJzdF9yb3cgPSAobWJfeSA9PSAwKTsKKyAgY29uc3QgaW50IGlzX2xhc3Rfcm93ID0gKG1iX3kgPj0gZGVjLT5icl9tYl95XyAtIDEpOworCisgIGlmIChkZWMtPm10X21ldGhvZF8gPT0gMikgeworICAgIFJlY29uc3RydWN0Um93KGRlYywgY3R4KTsKKyAgfQorCisgIGlmIChjdHgtPmZpbHRlcl9yb3dfKSB7CisgICAgRmlsdGVyUm93KGRlYyk7CisgIH0KKworICBpZiAoZGVjLT5kaXRoZXJfKSB7CisgICAgRGl0aGVyUm93KGRlYyk7CisgIH0KKworICBpZiAoaW8tPnB1dCAhPSBOVUxMKSB7CisgICAgaW50IHlfc3RhcnQgPSBNQUNST0JMT0NLX1ZQT1MobWJfeSk7CisgICAgaW50IHlfZW5kID0gTUFDUk9CTE9DS19WUE9TKG1iX3kgKyAxKTsKKyAgICBpZiAoIWlzX2ZpcnN0X3JvdykgeworICAgICAgeV9zdGFydCAtPSBleHRyYV95X3Jvd3M7CisgICAgICBpby0+eSA9IHlkc3Q7CisgICAgICBpby0+dSA9IHVkc3Q7CisgICAgICBpby0+diA9IHZkc3Q7CisgICAgfSBlbHNlIHsKKyAgICAgIGlvLT55ID0gZGVjLT5jYWNoZV95XyArIHlfb2Zmc2V0OworICAgICAgaW8tPnUgPSBkZWMtPmNhY2hlX3VfICsgdXZfb2Zmc2V0OworICAgICAgaW8tPnYgPSBkZWMtPmNhY2hlX3ZfICsgdXZfb2Zmc2V0OworICAgIH0KKworICAgIGlmICghaXNfbGFzdF9yb3cpIHsKKyAgICAgIHlfZW5kIC09IGV4dHJhX3lfcm93czsKKyAgICB9CisgICAgaWYgKHlfZW5kID4gaW8tPmNyb3BfYm90dG9tKSB7CisgICAgICB5X2VuZCA9IGlvLT5jcm9wX2JvdHRvbTsgICAgLy8gbWFrZSBzdXJlIHdlIGRvbid0IG92ZXJmbG93IG9uIGxhc3Qgcm93LgorICAgIH0KKyAgICAvLyBJZiBkZWMtPmFscGhhX2RhdGFfIGlzIG5vdCBOVUxMLCB3ZSBoYXZlIHNvbWUgYWxwaGEgcGxhbmUgcHJlc2VudC4KKyAgICBpby0+YSA9IE5VTEw7CisgICAgaWYgKGRlYy0+YWxwaGFfZGF0YV8gIT0gTlVMTCAmJiB5X3N0YXJ0IDwgeV9lbmQpIHsKKyAgICAgIGlvLT5hID0gVlA4RGVjb21wcmVzc0FscGhhUm93cyhkZWMsIGlvLCB5X3N0YXJ0LCB5X2VuZCAtIHlfc3RhcnQpOworICAgICAgaWYgKGlvLT5hID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGRlY29kZSBhbHBoYSBkYXRhLiIpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoeV9zdGFydCA8IGlvLT5jcm9wX3RvcCkgeworICAgICAgY29uc3QgaW50IGRlbHRhX3kgPSBpby0+Y3JvcF90b3AgLSB5X3N0YXJ0OworICAgICAgeV9zdGFydCA9IGlvLT5jcm9wX3RvcDsKKyAgICAgIGFzc2VydCghKGRlbHRhX3kgJiAxKSk7CisgICAgICBpby0+eSArPSBkZWMtPmNhY2hlX3lfc3RyaWRlXyAqIGRlbHRhX3k7CisgICAgICBpby0+dSArPSBkZWMtPmNhY2hlX3V2X3N0cmlkZV8gKiAoZGVsdGFfeSA+PiAxKTsKKyAgICAgIGlvLT52ICs9IGRlYy0+Y2FjaGVfdXZfc3RyaWRlXyAqIChkZWx0YV95ID4+IDEpOworICAgICAgaWYgKGlvLT5hICE9IE5VTEwpIHsKKyAgICAgICAgaW8tPmEgKz0gaW8tPndpZHRoICogZGVsdGFfeTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHlfc3RhcnQgPCB5X2VuZCkgeworICAgICAgaW8tPnkgKz0gaW8tPmNyb3BfbGVmdDsKKyAgICAgIGlvLT51ICs9IGlvLT5jcm9wX2xlZnQgPj4gMTsKKyAgICAgIGlvLT52ICs9IGlvLT5jcm9wX2xlZnQgPj4gMTsKKyAgICAgIGlmIChpby0+YSAhPSBOVUxMKSB7CisgICAgICAgIGlvLT5hICs9IGlvLT5jcm9wX2xlZnQ7CisgICAgICB9CisgICAgICBpby0+bWJfeSA9IHlfc3RhcnQgLSBpby0+Y3JvcF90b3A7CisgICAgICBpby0+bWJfdyA9IGlvLT5jcm9wX3JpZ2h0IC0gaW8tPmNyb3BfbGVmdDsKKyAgICAgIGlvLT5tYl9oID0geV9lbmQgLSB5X3N0YXJ0OworICAgICAgb2sgPSBpby0+cHV0KGlvKTsKKyAgICB9CisgIH0KKyAgLy8gcm90YXRlIHRvcCBzYW1wbGVzIGlmIG5lZWRlZAorICBpZiAoY2FjaGVfaWQgKyAxID09IGRlYy0+bnVtX2NhY2hlc18pIHsKKyAgICBpZiAoIWlzX2xhc3Rfcm93KSB7CisgICAgICBtZW1jcHkoZGVjLT5jYWNoZV95XyAtIHlzaXplLCB5ZHN0ICsgMTYgKiBkZWMtPmNhY2hlX3lfc3RyaWRlXywgeXNpemUpOworICAgICAgbWVtY3B5KGRlYy0+Y2FjaGVfdV8gLSB1dnNpemUsIHVkc3QgKyA4ICogZGVjLT5jYWNoZV91dl9zdHJpZGVfLCB1dnNpemUpOworICAgICAgbWVtY3B5KGRlYy0+Y2FjaGVfdl8gLSB1dnNpemUsIHZkc3QgKyA4ICogZGVjLT5jYWNoZV91dl9zdHJpZGVfLCB1dnNpemUpOworICAgIH0KKyAgfQorCisgIHJldHVybiBvazsKK30KKworI3VuZGVmIE1BQ1JPQkxPQ0tfVlBPUworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgVlA4UHJvY2Vzc1JvdyhWUDhEZWNvZGVyKiBjb25zdCBkZWMsIFZQOElvKiBjb25zdCBpbykgeworICBpbnQgb2sgPSAxOworICBWUDhUaHJlYWRDb250ZXh0KiBjb25zdCBjdHggPSAmZGVjLT50aHJlYWRfY3R4XzsKKyAgY29uc3QgaW50IGZpbHRlcl9yb3cgPQorICAgICAgKGRlYy0+ZmlsdGVyX3R5cGVfID4gMCkgJiYKKyAgICAgIChkZWMtPm1iX3lfID49IGRlYy0+dGxfbWJfeV8pICYmIChkZWMtPm1iX3lfIDw9IGRlYy0+YnJfbWJfeV8pOworICBpZiAoZGVjLT5tdF9tZXRob2RfID09IDApIHsKKyAgICAvLyBjdHgtPmlkXyBhbmQgY3R4LT5mX2luZm9fIGFyZSBhbHJlYWR5IHNldAorICAgIGN0eC0+bWJfeV8gPSBkZWMtPm1iX3lfOworICAgIGN0eC0+ZmlsdGVyX3Jvd18gPSBmaWx0ZXJfcm93OworICAgIFJlY29uc3RydWN0Um93KGRlYywgY3R4KTsKKyAgICBvayA9IEZpbmlzaFJvdyhkZWMsIGlvKTsKKyAgfSBlbHNlIHsKKyAgICBXZWJQV29ya2VyKiBjb25zdCB3b3JrZXIgPSAmZGVjLT53b3JrZXJfOworICAgIC8vIEZpbmlzaCBwcmV2aW91cyBqb2IgKmJlZm9yZSogdXBkYXRpbmcgY29udGV4dAorICAgIG9rICY9IFdlYlBHZXRXb3JrZXJJbnRlcmZhY2UoKS0+U3luYyh3b3JrZXIpOworICAgIGFzc2VydCh3b3JrZXItPnN0YXR1c18gPT0gT0spOworICAgIGlmIChvaykgeyAgIC8vIHNwYXduIGEgbmV3IGRlYmxvY2tpbmcvb3V0cHV0IGpvYgorICAgICAgY3R4LT5pb18gPSAqaW87CisgICAgICBjdHgtPmlkXyA9IGRlYy0+Y2FjaGVfaWRfOworICAgICAgY3R4LT5tYl95XyA9IGRlYy0+bWJfeV87CisgICAgICBjdHgtPmZpbHRlcl9yb3dfID0gZmlsdGVyX3JvdzsKKyAgICAgIGlmIChkZWMtPm10X21ldGhvZF8gPT0gMikgeyAgLy8gc3dhcCBtYWNyb2Jsb2NrIGRhdGEKKyAgICAgICAgVlA4TUJEYXRhKiBjb25zdCB0bXAgPSBjdHgtPm1iX2RhdGFfOworICAgICAgICBjdHgtPm1iX2RhdGFfID0gZGVjLT5tYl9kYXRhXzsKKyAgICAgICAgZGVjLT5tYl9kYXRhXyA9IHRtcDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIHBlcmZvcm0gcmVjb25zdHJ1Y3Rpb24gZGlyZWN0bHkgaW4gbWFpbiB0aHJlYWQKKyAgICAgICAgUmVjb25zdHJ1Y3RSb3coZGVjLCBjdHgpOworICAgICAgfQorICAgICAgaWYgKGZpbHRlcl9yb3cpIHsgICAgICAgICAgICAvLyBzd2FwIGZpbHRlciBpbmZvCisgICAgICAgIFZQOEZJbmZvKiBjb25zdCB0bXAgPSBjdHgtPmZfaW5mb187CisgICAgICAgIGN0eC0+Zl9pbmZvXyA9IGRlYy0+Zl9pbmZvXzsKKyAgICAgICAgZGVjLT5mX2luZm9fID0gdG1wOworICAgICAgfQorICAgICAgLy8gKHJlY29uc3RydWN0KStmaWx0ZXIgaW4gcGFyYWxsZWwKKyAgICAgIFdlYlBHZXRXb3JrZXJJbnRlcmZhY2UoKS0+TGF1bmNoKHdvcmtlcik7CisgICAgICBpZiAoKytkZWMtPmNhY2hlX2lkXyA9PSBkZWMtPm51bV9jYWNoZXNfKSB7CisgICAgICAgIGRlYy0+Y2FjaGVfaWRfID0gMDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIG9rOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRmluaXNoIHNldHRpbmcgdXAgdGhlIGRlY29kaW5nIHBhcmFtZXRlciBvbmNlIHVzZXIncyBzZXR1cCgpIGlzIGNhbGxlZC4KKworVlA4U3RhdHVzQ29kZSBWUDhFbnRlckNyaXRpY2FsKFZQOERlY29kZXIqIGNvbnN0IGRlYywgVlA4SW8qIGNvbnN0IGlvKSB7CisgIC8vIENhbGwgc2V0dXAoKSBmaXJzdC4gVGhpcyBtYXkgdHJpZ2dlciBhZGRpdGlvbmFsIGRlY29kaW5nIGZlYXR1cmVzIG9uICdpbycuCisgIC8vIE5vdGU6IEFmdGVyd2FyZCwgd2UgbXVzdCBjYWxsIHRlYXJkb3duKCkgbm8gbWF0dGVyIHdoYXQuCisgIGlmIChpby0+c2V0dXAgIT0gTlVMTCAmJiAhaW8tPnNldHVwKGlvKSkgeworICAgIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19VU0VSX0FCT1JULCAiRnJhbWUgc2V0dXAgZmFpbGVkIik7CisgICAgcmV0dXJuIGRlYy0+c3RhdHVzXzsKKyAgfQorCisgIC8vIERpc2FibGUgZmlsdGVyaW5nIHBlciB1c2VyIHJlcXVlc3QKKyAgaWYgKGlvLT5ieXBhc3NfZmlsdGVyaW5nKSB7CisgICAgZGVjLT5maWx0ZXJfdHlwZV8gPSAwOworICB9CisKKyAgLy8gRGVmaW5lIHRoZSBhcmVhIHdoZXJlIHdlIGNhbiBza2lwIGluLWxvb3AgZmlsdGVyaW5nLCBpbiBjYXNlIG9mIGNyb3BwaW5nLgorICAvLworICAvLyAnU2ltcGxlJyBmaWx0ZXIgcmVhZHMgdHdvIGx1bWEgc2FtcGxlcyBvdXRzaWRlIG9mIHRoZSBtYWNyb2Jsb2NrCisgIC8vIGFuZCBmaWx0ZXJzIG9uZS4gSXQgZG9lc24ndCBmaWx0ZXIgdGhlIGNocm9tYSBzYW1wbGVzLiBIZW5jZSwgd2UgY2FuCisgIC8vIGF2b2lkIGRvaW5nIHRoZSBpbi1sb29wIGZpbHRlcmluZyBiZWZvcmUgY3JvcF90b3AvY3JvcF9sZWZ0IHBvc2l0aW9uLgorICAvLyBGb3IgdGhlICdDb21wbGV4JyBmaWx0ZXIsIDMgc2FtcGxlcyBhcmUgcmVhZCBhbmQgdXAgdG8gMyBhcmUgZmlsdGVyZWQuCisgIC8vIE1lYW5zOiB0aGVyZSdzIGEgZGVwZW5kZW5jeSBjaGFpbiB0aGF0IGdvZXMgYWxsIHRoZSB3YXkgdXAgdG8gdGhlCisgIC8vIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgcGljdHVyZSAoTUIgIzApLiBXZSBtdXN0IGZpbHRlciBhbGwgdGhlIHByZXZpb3VzCisgIC8vIG1hY3JvYmxvY2tzLgorICB7CisgICAgY29uc3QgaW50IGV4dHJhX3BpeGVscyA9IGtGaWx0ZXJFeHRyYVJvd3NbZGVjLT5maWx0ZXJfdHlwZV9dOworICAgIGlmIChkZWMtPmZpbHRlcl90eXBlXyA9PSAyKSB7CisgICAgICAvLyBGb3IgY29tcGxleCBmaWx0ZXIsIHdlIG5lZWQgdG8gcHJlc2VydmUgdGhlIGRlcGVuZGVuY3kgY2hhaW4uCisgICAgICBkZWMtPnRsX21iX3hfID0gMDsKKyAgICAgIGRlYy0+dGxfbWJfeV8gPSAwOworICAgIH0gZWxzZSB7CisgICAgICAvLyBGb3Igc2ltcGxlIGZpbHRlciwgd2UgY2FuIGZpbHRlciBvbmx5IHRoZSBjcm9wcGVkIHJlZ2lvbi4KKyAgICAgIC8vIFdlIGluY2x1ZGUgJ2V4dHJhX3BpeGVscycgb24gdGhlIG90aGVyIHNpZGUgb2YgdGhlIGJvdW5kYXJ5LCBzaW5jZQorICAgICAgLy8gdmVydGljYWwgb3IgaG9yaXpvbnRhbCBmaWx0ZXJpbmcgb2YgdGhlIHByZXZpb3VzIG1hY3JvYmxvY2sgY2FuCisgICAgICAvLyBtb2RpZnkgc29tZSBhYnV0dGluZyBwaXhlbHMuCisgICAgICBkZWMtPnRsX21iX3hfID0gKGlvLT5jcm9wX2xlZnQgLSBleHRyYV9waXhlbHMpID4+IDQ7CisgICAgICBkZWMtPnRsX21iX3lfID0gKGlvLT5jcm9wX3RvcCAtIGV4dHJhX3BpeGVscykgPj4gNDsKKyAgICAgIGlmIChkZWMtPnRsX21iX3hfIDwgMCkgZGVjLT50bF9tYl94XyA9IDA7CisgICAgICBpZiAoZGVjLT50bF9tYl95XyA8IDApIGRlYy0+dGxfbWJfeV8gPSAwOworICAgIH0KKyAgICAvLyBXZSBuZWVkIHNvbWUgJ2V4dHJhJyBwaXhlbHMgb24gdGhlIHJpZ2h0L2JvdHRvbS4KKyAgICBkZWMtPmJyX21iX3lfID0gKGlvLT5jcm9wX2JvdHRvbSArIDE1ICsgZXh0cmFfcGl4ZWxzKSA+PiA0OworICAgIGRlYy0+YnJfbWJfeF8gPSAoaW8tPmNyb3BfcmlnaHQgKyAxNSArIGV4dHJhX3BpeGVscykgPj4gNDsKKyAgICBpZiAoZGVjLT5icl9tYl94XyA+IGRlYy0+bWJfd18pIHsKKyAgICAgIGRlYy0+YnJfbWJfeF8gPSBkZWMtPm1iX3dfOworICAgIH0KKyAgICBpZiAoZGVjLT5icl9tYl95XyA+IGRlYy0+bWJfaF8pIHsKKyAgICAgIGRlYy0+YnJfbWJfeV8gPSBkZWMtPm1iX2hfOworICAgIH0KKyAgfQorICBQcmVjb21wdXRlRmlsdGVyU3RyZW5ndGhzKGRlYyk7CisgIHJldHVybiBWUDhfU1RBVFVTX09LOworfQorCitpbnQgVlA4RXhpdENyaXRpY2FsKFZQOERlY29kZXIqIGNvbnN0IGRlYywgVlA4SW8qIGNvbnN0IGlvKSB7CisgIGludCBvayA9IDE7CisgIGlmIChkZWMtPm10X21ldGhvZF8gPiAwKSB7CisgICAgb2sgPSBXZWJQR2V0V29ya2VySW50ZXJmYWNlKCktPlN5bmMoJmRlYy0+d29ya2VyXyk7CisgIH0KKworICBpZiAoaW8tPnRlYXJkb3duICE9IE5VTEwpIHsKKyAgICBpby0+dGVhcmRvd24oaW8pOworICB9CisgIHJldHVybiBvazsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZvciBtdWx0aS10aHJlYWRlZCBkZWNvZGluZyB3ZSBuZWVkIHRvIHVzZSAzIHJvd3Mgb2YgMTYgcGl4ZWxzIGFzIGRlbGF5IGxpbmUuCisvLworLy8gUmVhc29uIGlzOiB0aGUgZGVibG9ja2luZyBmaWx0ZXIgY2Fubm90IGRlYmxvY2sgdGhlIGJvdHRvbSBob3Jpem9udGFsIGVkZ2VzCisvLyBpbW1lZGlhdGVseSwgYW5kIG5lZWRzIHRvIHdhaXQgZm9yIGZpcnN0IGZldyByb3dzIG9mIHRoZSBuZXh0IG1hY3JvYmxvY2sgdG8KKy8vIGJlIGRlY29kZWQuIEhlbmNlLCBkZWJsb2NraW5nIGlzIGxhZ2dpbmcgYmVoaW5kIGJ5IDQgb3IgOCBwaXhlbHMgKGRlcGVuZGluZworLy8gb24gc3RyZW5ndGgpLgorLy8gV2l0aCB0d28gdGhyZWFkcywgdGhlIHZlcnRpY2FsIHBvc2l0aW9ucyBvZiB0aGUgcm93cyBiZWluZyBkZWNvZGVkIGFyZToKKy8vIERlY29kZTogIFsgMC4uMTVdWzE2Li4zMV1bMzIuLjQ3XVs0OC4uNjNdWzY0Li43OV1bLi4uCisvLyBEZWJsb2NrOiAgICAgICAgIFsgMC4uMTFdWzEyLi4yN11bMjguLjQzXVs0NC4uNTldWy4uLgorLy8gSWYgd2UgdXNlIHR3byB0aHJlYWRzIGFuZCB0d28gY2FjaGVzIG9mIDE2IHBpeGVscywgdGhlIHNlcXVlbmNlIHdvdWxkIGJlOgorLy8gRGVjb2RlOiAgWyAwLi4xNV1bMTYuLjMxXVsgMC4uMTUhIV1bMTYuLjMxXVsgMC4uMTVdWy4uLgorLy8gRGVibG9jazogICAgICAgICBbIDAuLjExXVsxMi4uMjchIV1bLTQuLjExXVsxMi4uMjddWy4uLgorLy8gVGhlIHByb2JsZW0gb2NjdXJzIGR1cmluZyByb3cgWzEyLi4xNSEhXSB0aGF0IGJvdGggdGhlIGRlY29kaW5nIGFuZAorLy8gZGVibG9ja2luZyB0aHJlYWRzIGFyZSB3cml0aW5nIHNpbXVsdGFuZW91c2x5LgorLy8gV2l0aCAzIGNhY2hlIGxpbmVzLCBvbmUgZ2V0IGEgc2FmZSB3cml0ZSBwYXR0ZXJuOgorLy8gRGVjb2RlOiAgWyAwLi4xNV1bMTYuLjMxXVszMi4uNDddWyAwLi4xNV1bMTYuLjMxXVszMi4uNDddWzAuLgorLy8gRGVibG9jazogICAgICAgICBbIDAuLjExXVsxMi4uMjddWzI4Li40M11bLTQuLjExXVsxMi4uMjddWzI4Li4uCisvLyBOb3RlIHRoYXQgbXVsdGktdGhyZWFkZWQgb3V0cHV0IF93aXRob3V0XyBkZWJsb2NraW5nIGNhbiBtYWtlIHVzZSBvZiB0d28KKy8vIGNhY2hlIGxpbmVzIG9mIDE2IHBpeGVscyBvbmx5LCBzaW5jZSB0aGVyZSdzIG5vIGxhZ2dpbmcgYmVoaW5kLiBUaGUgZGVjb2RpbmcKKy8vIGFuZCBvdXRwdXQgcHJvY2VzcyBoYXZlIG5vbi1jb25jdXJyZW50IHdyaXRpbmc6CisvLyBEZWNvZGU6ICBbIDAuLjE1XVsxNi4uMzFdWyAwLi4xNV1bMTYuLjMxXVsuLi4KKy8vIGlvLT5wdXQ6ICAgICAgICAgWyAwLi4xNV1bMTYuLjMxXVsgMC4uMTVdWy4uLgorCisjZGVmaW5lIE1UX0NBQ0hFX0xJTkVTIDMKKyNkZWZpbmUgU1RfQ0FDSEVfTElORVMgMSAgIC8vIDEgY2FjaGUgcm93IG9ubHkgZm9yIHNpbmdsZS10aHJlYWRlZCBjYXNlCisKKy8vIEluaXRpYWxpemUgbXVsdGkvc2luZ2xlLXRocmVhZCB3b3JrZXIKK3N0YXRpYyBpbnQgSW5pdFRocmVhZENvbnRleHQoVlA4RGVjb2RlciogY29uc3QgZGVjKSB7CisgIGRlYy0+Y2FjaGVfaWRfID0gMDsKKyAgaWYgKGRlYy0+bXRfbWV0aG9kXyA+IDApIHsKKyAgICBXZWJQV29ya2VyKiBjb25zdCB3b3JrZXIgPSAmZGVjLT53b3JrZXJfOworICAgIGlmICghV2ViUEdldFdvcmtlckludGVyZmFjZSgpLT5SZXNldCh3b3JrZXIpKSB7CisgICAgICByZXR1cm4gVlA4U2V0RXJyb3IoZGVjLCBWUDhfU1RBVFVTX09VVF9PRl9NRU1PUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgInRocmVhZCBpbml0aWFsaXphdGlvbiBmYWlsZWQuIik7CisgICAgfQorICAgIHdvcmtlci0+ZGF0YTEgPSBkZWM7CisgICAgd29ya2VyLT5kYXRhMiA9ICh2b2lkKikmZGVjLT50aHJlYWRfY3R4Xy5pb187CisgICAgd29ya2VyLT5ob29rID0gRmluaXNoUm93OworICAgIGRlYy0+bnVtX2NhY2hlc18gPQorICAgICAgKGRlYy0+ZmlsdGVyX3R5cGVfID4gMCkgPyBNVF9DQUNIRV9MSU5FUyA6IE1UX0NBQ0hFX0xJTkVTIC0gMTsKKyAgfSBlbHNlIHsKKyAgICBkZWMtPm51bV9jYWNoZXNfID0gU1RfQ0FDSEVfTElORVM7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK2ludCBWUDhHZXRUaHJlYWRNZXRob2QoY29uc3QgV2ViUERlY29kZXJPcHRpb25zKiBjb25zdCBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQSGVhZGVyU3RydWN0dXJlKiBjb25zdCBoZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgaWYgKG9wdGlvbnMgPT0gTlVMTCB8fCBvcHRpb25zLT51c2VfdGhyZWFkcyA9PSAwKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgKHZvaWQpaGVhZGVyczsKKyAgKHZvaWQpd2lkdGg7CisgICh2b2lkKWhlaWdodDsKKyAgYXNzZXJ0KGhlYWRlcnMgPT0gTlVMTCB8fCAhaGVhZGVycy0+aXNfbG9zc2xlc3MpOworI2lmIGRlZmluZWQoV0VCUF9VU0VfVEhSRUFEKQorICBpZiAod2lkdGggPCBNSU5fV0lEVEhfRk9SX1RIUkVBRFMpIHJldHVybiAwOworICAvLyBUT0RPKHNrYWwpOiB0dW5lIHRoZSBoZXVyaXN0aWMgZnVydGhlcgorI2lmIDAKKyAgaWYgKGhlaWdodCA8IDIgKiB3aWR0aCkgcmV0dXJuIDI7CisjZW5kaWYKKyAgcmV0dXJuIDI7CisjZWxzZSAgIC8vICFXRUJQX1VTRV9USFJFQUQKKyAgcmV0dXJuIDA7CisjZW5kaWYKK30KKworI3VuZGVmIE1UX0NBQ0hFX0xJTkVTCisjdW5kZWYgU1RfQ0FDSEVfTElORVMKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1lbW9yeSBzZXR1cAorCitzdGF0aWMgaW50IEFsbG9jYXRlTWVtb3J5KFZQOERlY29kZXIqIGNvbnN0IGRlYykgeworICBjb25zdCBpbnQgbnVtX2NhY2hlcyA9IGRlYy0+bnVtX2NhY2hlc187CisgIGNvbnN0IGludCBtYl93ID0gZGVjLT5tYl93XzsKKyAgLy8gTm90ZTogd2UgdXNlICdzaXplX3QnIHdoZW4gdGhlcmUncyBubyBvdmVyZmxvdyByaXNrLCB1aW50NjRfdCBvdGhlcndpc2UuCisgIGNvbnN0IHNpemVfdCBpbnRyYV9wcmVkX21vZGVfc2l6ZSA9IDQgKiBtYl93ICogc2l6ZW9mKHVpbnQ4X3QpOworICBjb25zdCBzaXplX3QgdG9wX3NpemUgPSBzaXplb2YoVlA4VG9wU2FtcGxlcykgKiBtYl93OworICBjb25zdCBzaXplX3QgbWJfaW5mb19zaXplID0gKG1iX3cgKyAxKSAqIHNpemVvZihWUDhNQik7CisgIGNvbnN0IHNpemVfdCBmX2luZm9fc2l6ZSA9CisgICAgICAoZGVjLT5maWx0ZXJfdHlwZV8gPiAwKSA/CisgICAgICAgICAgbWJfdyAqIChkZWMtPm10X21ldGhvZF8gPiAwID8gMiA6IDEpICogc2l6ZW9mKFZQOEZJbmZvKQorICAgICAgICA6IDA7CisgIGNvbnN0IHNpemVfdCB5dXZfc2l6ZSA9IFlVVl9TSVpFICogc2l6ZW9mKCpkZWMtPnl1dl9iXyk7CisgIGNvbnN0IHNpemVfdCBtYl9kYXRhX3NpemUgPQorICAgICAgKGRlYy0+bXRfbWV0aG9kXyA9PSAyID8gMiA6IDEpICogbWJfdyAqIHNpemVvZigqZGVjLT5tYl9kYXRhXyk7CisgIGNvbnN0IHNpemVfdCBjYWNoZV9oZWlnaHQgPSAoMTYgKiBudW1fY2FjaGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBrRmlsdGVyRXh0cmFSb3dzW2RlYy0+ZmlsdGVyX3R5cGVfXSkgKiAzIC8gMjsKKyAgY29uc3Qgc2l6ZV90IGNhY2hlX3NpemUgPSB0b3Bfc2l6ZSAqIGNhY2hlX2hlaWdodDsKKyAgLy8gYWxwaGFfc2l6ZSBpcyB0aGUgb25seSBvbmUgdGhhdCBzY2FsZXMgYXMgd2lkdGggeCBoZWlnaHQuCisgIGNvbnN0IHVpbnQ2NF90IGFscGhhX3NpemUgPSAoZGVjLT5hbHBoYV9kYXRhXyAhPSBOVUxMKSA/CisgICAgICAodWludDY0X3QpZGVjLT5waWNfaGRyXy53aWR0aF8gKiBkZWMtPnBpY19oZHJfLmhlaWdodF8gOiAwVUxMOworICBjb25zdCB1aW50NjRfdCBuZWVkZWQgPSAodWludDY0X3QpaW50cmFfcHJlZF9tb2RlX3NpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgdG9wX3NpemUgKyBtYl9pbmZvX3NpemUgKyBmX2luZm9fc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgKyB5dXZfc2l6ZSArIG1iX2RhdGFfc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgKyBjYWNoZV9zaXplICsgYWxwaGFfc2l6ZSArIFdFQlBfQUxJR05fQ1NUOworICB1aW50OF90KiBtZW07CisKKyAgaWYgKG5lZWRlZCAhPSAoc2l6ZV90KW5lZWRlZCkgcmV0dXJuIDA7ICAvLyBjaGVjayBmb3Igb3ZlcmZsb3cKKyAgaWYgKG5lZWRlZCA+IGRlYy0+bWVtX3NpemVfKSB7CisgICAgV2ViUFNhZmVGcmVlKGRlYy0+bWVtXyk7CisgICAgZGVjLT5tZW1fc2l6ZV8gPSAwOworICAgIGRlYy0+bWVtXyA9IFdlYlBTYWZlTWFsbG9jKG5lZWRlZCwgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICBpZiAoZGVjLT5tZW1fID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBWUDhTZXRFcnJvcihkZWMsIFZQOF9TVEFUVVNfT1VUX09GX01FTU9SWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAibm8gbWVtb3J5IGR1cmluZyBmcmFtZSBpbml0aWFsaXphdGlvbi4iKTsKKyAgICB9CisgICAgLy8gZG93bi1jYXN0IGlzIG9rLCB0aGFua3MgdG8gV2ViUFNhZmVNYWxsb2MoKSBhYm92ZS4KKyAgICBkZWMtPm1lbV9zaXplXyA9IChzaXplX3QpbmVlZGVkOworICB9CisKKyAgbWVtID0gKHVpbnQ4X3QqKWRlYy0+bWVtXzsKKyAgZGVjLT5pbnRyYV90XyA9IG1lbTsKKyAgbWVtICs9IGludHJhX3ByZWRfbW9kZV9zaXplOworCisgIGRlYy0+eXV2X3RfID0gKFZQOFRvcFNhbXBsZXMqKW1lbTsKKyAgbWVtICs9IHRvcF9zaXplOworCisgIGRlYy0+bWJfaW5mb18gPSAoKFZQOE1CKiltZW0pICsgMTsKKyAgbWVtICs9IG1iX2luZm9fc2l6ZTsKKworICBkZWMtPmZfaW5mb18gPSBmX2luZm9fc2l6ZSA/IChWUDhGSW5mbyopbWVtIDogTlVMTDsKKyAgbWVtICs9IGZfaW5mb19zaXplOworICBkZWMtPnRocmVhZF9jdHhfLmlkXyA9IDA7CisgIGRlYy0+dGhyZWFkX2N0eF8uZl9pbmZvXyA9IGRlYy0+Zl9pbmZvXzsKKyAgaWYgKGRlYy0+bXRfbWV0aG9kXyA+IDApIHsKKyAgICAvLyBzZWNvbmRhcnkgY2FjaGUgbGluZS4gVGhlIGRlYmxvY2tpbmcgcHJvY2VzcyBuZWVkIHRvIG1ha2UgdXNlIG9mIHRoZQorICAgIC8vIGZpbHRlcmluZyBzdHJlbmd0aCBmcm9tIHByZXZpb3VzIG1hY3JvYmxvY2sgcm93LCB3aGlsZSB0aGUgbmV3IG9uZXMKKyAgICAvLyBhcmUgYmVpbmcgZGVjb2RlZCBpbiBwYXJhbGxlbC4gV2UnbGwganVzdCBzd2FwIHRoZSBwb2ludGVycy4KKyAgICBkZWMtPnRocmVhZF9jdHhfLmZfaW5mb18gKz0gbWJfdzsKKyAgfQorCisgIG1lbSA9ICh1aW50OF90KilXRUJQX0FMSUdOKG1lbSk7CisgIGFzc2VydCgoeXV2X3NpemUgJiBXRUJQX0FMSUdOX0NTVCkgPT0gMCk7CisgIGRlYy0+eXV2X2JfID0gbWVtOworICBtZW0gKz0geXV2X3NpemU7CisKKyAgZGVjLT5tYl9kYXRhXyA9IChWUDhNQkRhdGEqKW1lbTsKKyAgZGVjLT50aHJlYWRfY3R4Xy5tYl9kYXRhXyA9IChWUDhNQkRhdGEqKW1lbTsKKyAgaWYgKGRlYy0+bXRfbWV0aG9kXyA9PSAyKSB7CisgICAgZGVjLT50aHJlYWRfY3R4Xy5tYl9kYXRhXyArPSBtYl93OworICB9CisgIG1lbSArPSBtYl9kYXRhX3NpemU7CisKKyAgZGVjLT5jYWNoZV95X3N0cmlkZV8gPSAxNiAqIG1iX3c7CisgIGRlYy0+Y2FjaGVfdXZfc3RyaWRlXyA9IDggKiBtYl93OworICB7CisgICAgY29uc3QgaW50IGV4dHJhX3Jvd3MgPSBrRmlsdGVyRXh0cmFSb3dzW2RlYy0+ZmlsdGVyX3R5cGVfXTsKKyAgICBjb25zdCBpbnQgZXh0cmFfeSA9IGV4dHJhX3Jvd3MgKiBkZWMtPmNhY2hlX3lfc3RyaWRlXzsKKyAgICBjb25zdCBpbnQgZXh0cmFfdXYgPSAoZXh0cmFfcm93cyAvIDIpICogZGVjLT5jYWNoZV91dl9zdHJpZGVfOworICAgIGRlYy0+Y2FjaGVfeV8gPSBtZW0gKyBleHRyYV95OworICAgIGRlYy0+Y2FjaGVfdV8gPSBkZWMtPmNhY2hlX3lfCisgICAgICAgICAgICAgICAgICArIDE2ICogbnVtX2NhY2hlcyAqIGRlYy0+Y2FjaGVfeV9zdHJpZGVfICsgZXh0cmFfdXY7CisgICAgZGVjLT5jYWNoZV92XyA9IGRlYy0+Y2FjaGVfdV8KKyAgICAgICAgICAgICAgICAgICsgOCAqIG51bV9jYWNoZXMgKiBkZWMtPmNhY2hlX3V2X3N0cmlkZV8gKyBleHRyYV91djsKKyAgICBkZWMtPmNhY2hlX2lkXyA9IDA7CisgIH0KKyAgbWVtICs9IGNhY2hlX3NpemU7CisKKyAgLy8gYWxwaGEgcGxhbmUKKyAgZGVjLT5hbHBoYV9wbGFuZV8gPSBhbHBoYV9zaXplID8gbWVtIDogTlVMTDsKKyAgbWVtICs9IGFscGhhX3NpemU7CisgIGFzc2VydChtZW0gPD0gKHVpbnQ4X3QqKWRlYy0+bWVtXyArIGRlYy0+bWVtX3NpemVfKTsKKworICAvLyBub3RlOiBsZWZ0L3RvcC1pbmZvIGlzIGluaXRpYWxpemVkIG9uY2UgZm9yIGFsbC4KKyAgbWVtc2V0KGRlYy0+bWJfaW5mb18gLSAxLCAwLCBtYl9pbmZvX3NpemUpOworICBWUDhJbml0U2NhbmxpbmUoZGVjKTsgICAvLyBpbml0aWFsaXplIGxlZnQgdG9vLgorCisgIC8vIGluaXRpYWxpemUgdG9wCisgIG1lbXNldChkZWMtPmludHJhX3RfLCBCX0RDX1BSRUQsIGludHJhX3ByZWRfbW9kZV9zaXplKTsKKworICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgSW5pdElvKFZQOERlY29kZXIqIGNvbnN0IGRlYywgVlA4SW8qIGlvKSB7CisgIC8vIHByZXBhcmUgJ2lvJworICBpby0+bWJfeSA9IDA7CisgIGlvLT55ID0gZGVjLT5jYWNoZV95XzsKKyAgaW8tPnUgPSBkZWMtPmNhY2hlX3VfOworICBpby0+diA9IGRlYy0+Y2FjaGVfdl87CisgIGlvLT55X3N0cmlkZSA9IGRlYy0+Y2FjaGVfeV9zdHJpZGVfOworICBpby0+dXZfc3RyaWRlID0gZGVjLT5jYWNoZV91dl9zdHJpZGVfOworICBpby0+YSA9IE5VTEw7Cit9CisKK2ludCBWUDhJbml0RnJhbWUoVlA4RGVjb2RlciogY29uc3QgZGVjLCBWUDhJbyogY29uc3QgaW8pIHsKKyAgaWYgKCFJbml0VGhyZWFkQ29udGV4dChkZWMpKSByZXR1cm4gMDsgIC8vIGNhbGwgZmlyc3QuIFNldHMgZGVjLT5udW1fY2FjaGVzXy4KKyAgaWYgKCFBbGxvY2F0ZU1lbW9yeShkZWMpKSByZXR1cm4gMDsKKyAgSW5pdElvKGRlYywgaW8pOworICBWUDhEc3BJbml0KCk7ICAvLyBJbml0IGNyaXRpY2FsIGZ1bmN0aW9uIHBvaW50ZXJzIGFuZCBsb29rLXVwIHRhYmxlcy4KKyAgcmV0dXJuIDE7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL2lkZWNfZGVjLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL2lkZWNfZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIwOWIwMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvaWRlY19kZWMuYwpAQCAtMCwwICsxLDg5OCBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEluY3JlbWVudGFsIGRlY29kaW5nCisvLworLy8gQXV0aG9yOiBzb21uYXRoQGdvb2dsZS5jb20gKFNvbW5hdGggQmFuZXJqZWUpCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9hc3NlcnRfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0ZGxpYl9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RyaW5nX3BvZW0uaCIKKyNlbHNlCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKworI2luY2x1ZGUgInNyYy9kZWMvYWxwaGFpX2RlYy5oIgorI2luY2x1ZGUgInNyYy9kZWMvd2VicGlfZGVjLmgiCisjaW5jbHVkZSAic3JjL2RlYy92cDhpX2RlYy5oIgorI2luY2x1ZGUgInNyYy91dGlscy91dGlscy5oIgorCisvLyBJbiBhcHBlbmQgbW9kZSwgYnVmZmVyIGFsbG9jYXRpb25zIGluY3JlYXNlIGFzIG11bHRpcGxlcyBvZiB0aGlzIHZhbHVlLgorLy8gTmVlZHMgdG8gYmUgYSBwb3dlciBvZiAyLgorI2RlZmluZSBDSFVOS19TSVpFIDQwOTYKKyNkZWZpbmUgTUFYX01CX1NJWkUgNDA5NgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRGF0YSBzdHJ1Y3R1cmVzIGZvciBtZW1vcnkgYW5kIHN0YXRlcworCisvLyBEZWNvZGluZyBzdGF0ZXMuIFN0YXRlIG5vcm1hbGx5IGZsb3dzIGFzOgorLy8gV0VCUF9IRUFERVItPlZQOF9IRUFERVItPlZQOF9QQVJUUzAtPlZQOF9EQVRBLT5ET05FIGZvciBhIGxvc3N5IGltYWdlLCBhbmQKKy8vIFdFQlBfSEVBREVSLT5WUDhMX0hFQURFUi0+VlA4TF9EQVRBLT5ET05FIGZvciBhIGxvc3NsZXNzIGltYWdlLgorLy8gSWYgdGhlcmUgaXMgYW55IGVycm9yIHRoZSBkZWNvZGVyIGdvZXMgaW50byBzdGF0ZSBFUlJPUi4KK3R5cGVkZWYgZW51bSB7CisgIFNUQVRFX1dFQlBfSEVBREVSLCAgLy8gQWxsIHRoZSBkYXRhIGJlZm9yZSB0aGF0IG9mIHRoZSBWUDgvVlA4TCBjaHVuay4KKyAgU1RBVEVfVlA4X0hFQURFUiwgICAvLyBUaGUgVlA4IEZyYW1lIGhlYWRlciAod2l0aGluIHRoZSBWUDggY2h1bmspLgorICBTVEFURV9WUDhfUEFSVFMwLAorICBTVEFURV9WUDhfREFUQSwKKyAgU1RBVEVfVlA4TF9IRUFERVIsCisgIFNUQVRFX1ZQOExfREFUQSwKKyAgU1RBVEVfRE9ORSwKKyAgU1RBVEVfRVJST1IKK30gRGVjU3RhdGU7CisKKy8vIE9wZXJhdGluZyBzdGF0ZSBmb3IgdGhlIE1lbUJ1ZmZlcgordHlwZWRlZiBlbnVtIHsKKyAgTUVNX01PREVfTk9ORSA9IDAsCisgIE1FTV9NT0RFX0FQUEVORCwKKyAgTUVNX01PREVfTUFQCit9IE1lbUJ1ZmZlck1vZGU7CisKKy8vIHN0b3JhZ2UgZm9yIHBhcnRpdGlvbiAjMCBhbmQgcGFydGlhbCBkYXRhIChpbiBhIHJvbGxpbmcgZmFzaGlvbikKK3R5cGVkZWYgc3RydWN0IHsKKyAgTWVtQnVmZmVyTW9kZSBtb2RlXzsgIC8vIE9wZXJhdGlvbiBtb2RlCisgIHNpemVfdCBzdGFydF87ICAgICAgICAvLyBzdGFydCBsb2NhdGlvbiBvZiB0aGUgZGF0YSB0byBiZSBkZWNvZGVkCisgIHNpemVfdCBlbmRfOyAgICAgICAgICAvLyBlbmQgbG9jYXRpb24KKyAgc2l6ZV90IGJ1Zl9zaXplXzsgICAgIC8vIHNpemUgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIKKyAgdWludDhfdCogYnVmXzsgICAgICAgIC8vIFdlIGRvbid0IG93biB0aGlzIGJ1ZmZlciBpbiBjYXNlIFdlYlBJVXBkYXRlKCkKKworICBzaXplX3QgcGFydDBfc2l6ZV87ICAgICAgICAgLy8gc2l6ZSBvZiBwYXJ0aXRpb24gIzAKKyAgY29uc3QgdWludDhfdCogcGFydDBfYnVmXzsgIC8vIGJ1ZmZlciB0byBzdG9yZSBwYXJ0aXRpb24gIzAKK30gTWVtQnVmZmVyOworCitzdHJ1Y3QgV2ViUElEZWNvZGVyIHsKKyAgRGVjU3RhdGUgc3RhdGVfOyAgICAgICAgIC8vIGN1cnJlbnQgZGVjb2Rpbmcgc3RhdGUKKyAgV2ViUERlY1BhcmFtcyBwYXJhbXNfOyAgIC8vIFBhcmFtcyB0byBzdG9yZSBvdXRwdXQgaW5mbworICBpbnQgaXNfbG9zc2xlc3NfOyAgICAgICAgLy8gZm9yIGRvd24tY2FzdGluZyAnZGVjXycuCisgIHZvaWQqIGRlY187ICAgICAgICAgICAgICAvLyBlaXRoZXIgYSBWUDhEZWNvZGVyIG9yIGEgVlA4TERlY29kZXIgaW5zdGFuY2UKKyAgVlA4SW8gaW9fOworCisgIE1lbUJ1ZmZlciBtZW1fOyAgICAgICAgICAvLyBpbnB1dCBtZW1vcnkgYnVmZmVyLgorICBXZWJQRGVjQnVmZmVyIG91dHB1dF87ICAgLy8gb3V0cHV0IGJ1ZmZlciAod2hlbiBubyBleHRlcm5hbCBvbmUgaXMgc3VwcGxpZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciBpZiB0aGUgZXh0ZXJuYWwgb25lIGhhcyBzbG93LW1lbW9yeSkKKyAgV2ViUERlY0J1ZmZlciogZmluYWxfb3V0cHV0XzsgIC8vIFNsb3ctbWVtb3J5IG91dHB1dCB0byBjb3B5IHRvIGV2ZW50dWFsbHkuCisgIHNpemVfdCBjaHVua19zaXplXzsgICAgICAvLyBDb21wcmVzc2VkIFZQOC9WUDhMIHNpemUgZXh0cmFjdGVkIGZyb20gSGVhZGVyLgorCisgIGludCBsYXN0X21iX3lfOyAgICAgICAgICAvLyBsYXN0IHJvdyByZWFjaGVkIGZvciBpbnRyYS1tb2RlIGRlY29kaW5nCit9OworCisvLyBNQiBjb250ZXh0IHRvIHJlc3RvcmUgaW4gY2FzZSBWUDhEZWNvZGVNQigpIGZhaWxzCit0eXBlZGVmIHN0cnVjdCB7CisgIFZQOE1CIGxlZnRfOworICBWUDhNQiBpbmZvXzsKKyAgVlA4Qml0UmVhZGVyIHRva2VuX2JyXzsKK30gTUJDb250ZXh0OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWVtQnVmZmVyOiBpbmNvbWluZyBkYXRhIGhhbmRsaW5nCisKK3N0YXRpYyBXRUJQX0lOTElORSBzaXplX3QgTWVtRGF0YVNpemUoY29uc3QgTWVtQnVmZmVyKiBtZW0pIHsKKyAgcmV0dXJuIChtZW0tPmVuZF8gLSBtZW0tPnN0YXJ0Xyk7Cit9CisKKy8vIENoZWNrIGlmIHdlIG5lZWQgdG8gcHJlc2VydmUgdGhlIGNvbXByZXNzZWQgYWxwaGEgZGF0YSwgYXMgaXQgbWF5IG5vdCBoYXZlCisvLyBiZWVuIGRlY29kZWQgeWV0Lgorc3RhdGljIGludCBOZWVkQ29tcHJlc3NlZEFscGhhKGNvbnN0IFdlYlBJRGVjb2RlciogY29uc3QgaWRlYykgeworICBpZiAoaWRlYy0+c3RhdGVfID09IFNUQVRFX1dFQlBfSEVBREVSKSB7CisgICAgLy8gV2UgaGF2ZW4ndCBwYXJzZWQgdGhlIGhlYWRlcnMgeWV0LCBzbyB3ZSBkb24ndCBrbm93IHdoZXRoZXIgdGhlIGltYWdlIGlzCisgICAgLy8gbG9zc3kgb3IgbG9zc2xlc3MuIFRoaXMgYWxzbyBtZWFucyB0aGF0IHdlIGhhdmVuJ3QgcGFyc2VkIHRoZSBBTFBIIGNodW5rLgorICAgIHJldHVybiAwOworICB9CisgIGlmIChpZGVjLT5pc19sb3NzbGVzc18pIHsKKyAgICByZXR1cm4gMDsgIC8vIEFMUEggY2h1bmsgaXMgbm90IHByZXNlbnQgZm9yIGxvc3NsZXNzIGltYWdlcy4KKyAgfSBlbHNlIHsKKyAgICBjb25zdCBWUDhEZWNvZGVyKiBjb25zdCBkZWMgPSAoVlA4RGVjb2RlciopaWRlYy0+ZGVjXzsKKyAgICBhc3NlcnQoZGVjICE9IE5VTEwpOyAgLy8gTXVzdCBiZSB0cnVlIGFzIGlkZWMtPnN0YXRlXyAhPSBTVEFURV9XRUJQX0hFQURFUi4KKyAgICByZXR1cm4gKGRlYy0+YWxwaGFfZGF0YV8gIT0gTlVMTCkgJiYgIWRlYy0+aXNfYWxwaGFfZGVjb2RlZF87CisgIH0KK30KKworc3RhdGljIHZvaWQgRG9SZW1hcChXZWJQSURlY29kZXIqIGNvbnN0IGlkZWMsIHB0cmRpZmZfdCBvZmZzZXQpIHsKKyAgTWVtQnVmZmVyKiBjb25zdCBtZW0gPSAmaWRlYy0+bWVtXzsKKyAgY29uc3QgdWludDhfdCogY29uc3QgbmV3X2Jhc2UgPSBtZW0tPmJ1Zl8gKyBtZW0tPnN0YXJ0XzsKKyAgLy8gbm90ZTogZm9yIFZQOCwgc2V0dGluZyB1cCBpZGVjLT5pb18gaXMgb25seSByZWFsbHkgbmVlZGVkIGF0IHRoZSBiZWdpbm5pbmcKKyAgLy8gb2YgdGhlIGRlY29kaW5nLCB0aWxsIHBhcnRpdGlvbiAjMCBpcyBjb21wbGV0ZS4KKyAgaWRlYy0+aW9fLmRhdGEgPSBuZXdfYmFzZTsKKyAgaWRlYy0+aW9fLmRhdGFfc2l6ZSA9IE1lbURhdGFTaXplKG1lbSk7CisKKyAgaWYgKGlkZWMtPmRlY18gIT0gTlVMTCkgeworICAgIGlmICghaWRlYy0+aXNfbG9zc2xlc3NfKSB7CisgICAgICBWUDhEZWNvZGVyKiBjb25zdCBkZWMgPSAoVlA4RGVjb2RlciopaWRlYy0+ZGVjXzsKKyAgICAgIGNvbnN0IHVpbnQzMl90IGxhc3RfcGFydCA9IGRlYy0+bnVtX3BhcnRzX21pbnVzX29uZV87CisgICAgICBpZiAob2Zmc2V0ICE9IDApIHsKKyAgICAgICAgdWludDMyX3QgcDsKKyAgICAgICAgZm9yIChwID0gMDsgcCA8PSBsYXN0X3BhcnQ7ICsrcCkgeworICAgICAgICAgIFZQOFJlbWFwQml0UmVhZGVyKGRlYy0+cGFydHNfICsgcCwgb2Zmc2V0KTsKKyAgICAgICAgfQorICAgICAgICAvLyBSZW1hcCBwYXJ0aXRpb24gIzAgZGF0YSBwb2ludGVyIHRvIG5ldyBvZmZzZXQsIGJ1dCBvbmx5IGluIE1BUAorICAgICAgICAvLyBtb2RlIChpbiBBUFBFTkQgbW9kZSwgcGFydGl0aW9uICMwIGlzIGNvcGllZCBpbnRvIGEgZml4ZWQgbWVtb3J5KS4KKyAgICAgICAgaWYgKG1lbS0+bW9kZV8gPT0gTUVNX01PREVfTUFQKSB7CisgICAgICAgICAgVlA4UmVtYXBCaXRSZWFkZXIoJmRlYy0+YnJfLCBvZmZzZXQpOworICAgICAgICB9CisgICAgICB9CisgICAgICB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGxhc3Rfc3RhcnQgPSBkZWMtPnBhcnRzX1tsYXN0X3BhcnRdLmJ1Zl87CisgICAgICAgIFZQOEJpdFJlYWRlclNldEJ1ZmZlcigmZGVjLT5wYXJ0c19bbGFzdF9wYXJ0XSwgbGFzdF9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbS0+YnVmXyArIG1lbS0+ZW5kXyAtIGxhc3Rfc3RhcnQpOworICAgICAgfQorICAgICAgaWYgKE5lZWRDb21wcmVzc2VkQWxwaGEoaWRlYykpIHsKKyAgICAgICAgQUxQSERlY29kZXIqIGNvbnN0IGFscGhfZGVjID0gZGVjLT5hbHBoX2RlY187CisgICAgICAgIGRlYy0+YWxwaGFfZGF0YV8gKz0gb2Zmc2V0OworICAgICAgICBpZiAoYWxwaF9kZWMgIT0gTlVMTCkgeworICAgICAgICAgIGlmIChhbHBoX2RlYy0+bWV0aG9kXyA9PSBBTFBIQV9MT1NTTEVTU19DT01QUkVTU0lPTikgeworICAgICAgICAgICAgVlA4TERlY29kZXIqIGNvbnN0IGFscGhfdnA4bF9kZWMgPSBhbHBoX2RlYy0+dnA4bF9kZWNfOworICAgICAgICAgICAgYXNzZXJ0KGFscGhfdnA4bF9kZWMgIT0gTlVMTCk7CisgICAgICAgICAgICBhc3NlcnQoZGVjLT5hbHBoYV9kYXRhX3NpemVfID49IEFMUEhBX0hFQURFUl9MRU4pOworICAgICAgICAgICAgVlA4TEJpdFJlYWRlclNldEJ1ZmZlcigmYWxwaF92cDhsX2RlYy0+YnJfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWMtPmFscGhhX2RhdGFfICsgQUxQSEFfSEVBREVSX0xFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjLT5hbHBoYV9kYXRhX3NpemVfIC0gQUxQSEFfSEVBREVSX0xFTik7CisgICAgICAgICAgfSBlbHNlIHsgIC8vIGFscGhfZGVjLT5tZXRob2RfID09IEFMUEhBX05PX0NPTVBSRVNTSU9OCisgICAgICAgICAgICAvLyBOb3RoaW5nIHNwZWNpYWwgdG8gZG8gaW4gdGhpcyBjYXNlLgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7ICAgIC8vIFJlc2l6ZSBsb3NzbGVzcyBiaXRyZWFkZXIKKyAgICAgIFZQOExEZWNvZGVyKiBjb25zdCBkZWMgPSAoVlA4TERlY29kZXIqKWlkZWMtPmRlY187CisgICAgICBWUDhMQml0UmVhZGVyU2V0QnVmZmVyKCZkZWMtPmJyXywgbmV3X2Jhc2UsIE1lbURhdGFTaXplKG1lbSkpOworICAgIH0KKyAgfQorfQorCisvLyBBcHBlbmRzIGRhdGEgdG8gdGhlIGVuZCBvZiBNZW1CdWZmZXItPmJ1Zl8uIEl0IGV4cGFuZHMgdGhlIGFsbG9jYXRlZCBtZW1vcnkKKy8vIHNpemUgaWYgcmVxdWlyZWQgYW5kIGFsc28gdXBkYXRlcyBWUDhCaXRSZWFkZXIncyBpZiBuZXcgbWVtb3J5IGlzIGFsbG9jYXRlZC4KK3N0YXRpYyBpbnQgQXBwZW5kVG9NZW1CdWZmZXIoV2ViUElEZWNvZGVyKiBjb25zdCBpZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBzaXplX3QgZGF0YV9zaXplKSB7CisgIFZQOERlY29kZXIqIGNvbnN0IGRlYyA9IChWUDhEZWNvZGVyKilpZGVjLT5kZWNfOworICBNZW1CdWZmZXIqIGNvbnN0IG1lbSA9ICZpZGVjLT5tZW1fOworICBjb25zdCBpbnQgbmVlZF9jb21wcmVzc2VkX2FscGhhID0gTmVlZENvbXByZXNzZWRBbHBoYShpZGVjKTsKKyAgY29uc3QgdWludDhfdCogY29uc3Qgb2xkX3N0YXJ0ID0gbWVtLT5idWZfICsgbWVtLT5zdGFydF87CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IG9sZF9iYXNlID0KKyAgICAgIG5lZWRfY29tcHJlc3NlZF9hbHBoYSA/IGRlYy0+YWxwaGFfZGF0YV8gOiBvbGRfc3RhcnQ7CisgIGFzc2VydChtZW0tPm1vZGVfID09IE1FTV9NT0RFX0FQUEVORCk7CisgIGlmIChkYXRhX3NpemUgPiBNQVhfQ0hVTktfUEFZTE9BRCkgeworICAgIC8vIHNlY3VyaXR5IHNhZmVndWFyZDogdHJ5aW5nIHRvIGFsbG9jYXRlIG1vcmUgdGhhbiB3aGF0IHRoZSBmb3JtYXQKKyAgICAvLyBhbGxvd3MgZm9yIGEgY2h1bmsgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBzbW9rZSBzbWVsbC4KKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChtZW0tPmVuZF8gKyBkYXRhX3NpemUgPiBtZW0tPmJ1Zl9zaXplXykgeyAgLy8gTmVlZCBzb21lIGZyZWUgbWVtb3J5CisgICAgY29uc3Qgc2l6ZV90IG5ld19tZW1fc3RhcnQgPSBvbGRfc3RhcnQgLSBvbGRfYmFzZTsKKyAgICBjb25zdCBzaXplX3QgY3VycmVudF9zaXplID0gTWVtRGF0YVNpemUobWVtKSArIG5ld19tZW1fc3RhcnQ7CisgICAgY29uc3QgdWludDY0X3QgbmV3X3NpemUgPSAodWludDY0X3QpY3VycmVudF9zaXplICsgZGF0YV9zaXplOworICAgIGNvbnN0IHVpbnQ2NF90IGV4dHJhX3NpemUgPSAobmV3X3NpemUgKyBDSFVOS19TSVpFIC0gMSkgJiB+KENIVU5LX1NJWkUgLSAxKTsKKyAgICB1aW50OF90KiBjb25zdCBuZXdfYnVmID0KKyAgICAgICAgKHVpbnQ4X3QqKVdlYlBTYWZlTWFsbG9jKGV4dHJhX3NpemUsIHNpemVvZigqbmV3X2J1ZikpOworICAgIGlmIChuZXdfYnVmID09IE5VTEwpIHJldHVybiAwOworICAgIG1lbWNweShuZXdfYnVmLCBvbGRfYmFzZSwgY3VycmVudF9zaXplKTsKKyAgICBXZWJQU2FmZUZyZWUobWVtLT5idWZfKTsKKyAgICBtZW0tPmJ1Zl8gPSBuZXdfYnVmOworICAgIG1lbS0+YnVmX3NpemVfID0gKHNpemVfdClleHRyYV9zaXplOworICAgIG1lbS0+c3RhcnRfID0gbmV3X21lbV9zdGFydDsKKyAgICBtZW0tPmVuZF8gPSBjdXJyZW50X3NpemU7CisgIH0KKworICBtZW1jcHkobWVtLT5idWZfICsgbWVtLT5lbmRfLCBkYXRhLCBkYXRhX3NpemUpOworICBtZW0tPmVuZF8gKz0gZGF0YV9zaXplOworICBhc3NlcnQobWVtLT5lbmRfIDw9IG1lbS0+YnVmX3NpemVfKTsKKworICBEb1JlbWFwKGlkZWMsIG1lbS0+YnVmXyArIG1lbS0+c3RhcnRfIC0gb2xkX3N0YXJ0KTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgUmVtYXBNZW1CdWZmZXIoV2ViUElEZWNvZGVyKiBjb25zdCBpZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBzaXplX3QgZGF0YV9zaXplKSB7CisgIE1lbUJ1ZmZlciogY29uc3QgbWVtID0gJmlkZWMtPm1lbV87CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IG9sZF9idWYgPSBtZW0tPmJ1Zl87CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IG9sZF9zdGFydCA9IG9sZF9idWYgKyBtZW0tPnN0YXJ0XzsKKyAgYXNzZXJ0KG1lbS0+bW9kZV8gPT0gTUVNX01PREVfTUFQKTsKKworICBpZiAoZGF0YV9zaXplIDwgbWVtLT5idWZfc2l6ZV8pIHJldHVybiAwOyAgLy8gY2FuJ3QgcmVtYXAgdG8gYSBzaG9ydGVyIGJ1ZmZlciEKKworICBtZW0tPmJ1Zl8gPSAodWludDhfdCopZGF0YTsKKyAgbWVtLT5lbmRfID0gbWVtLT5idWZfc2l6ZV8gPSBkYXRhX3NpemU7CisKKyAgRG9SZW1hcChpZGVjLCBtZW0tPmJ1Zl8gKyBtZW0tPnN0YXJ0XyAtIG9sZF9zdGFydCk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBJbml0TWVtQnVmZmVyKE1lbUJ1ZmZlciogY29uc3QgbWVtKSB7CisgIG1lbS0+bW9kZV8gICAgICAgPSBNRU1fTU9ERV9OT05FOworICBtZW0tPmJ1Zl8gICAgICAgID0gTlVMTDsKKyAgbWVtLT5idWZfc2l6ZV8gICA9IDA7CisgIG1lbS0+cGFydDBfYnVmXyAgPSBOVUxMOworICBtZW0tPnBhcnQwX3NpemVfID0gMDsKK30KKworc3RhdGljIHZvaWQgQ2xlYXJNZW1CdWZmZXIoTWVtQnVmZmVyKiBjb25zdCBtZW0pIHsKKyAgYXNzZXJ0KG1lbSk7CisgIGlmIChtZW0tPm1vZGVfID09IE1FTV9NT0RFX0FQUEVORCkgeworICAgIFdlYlBTYWZlRnJlZShtZW0tPmJ1Zl8pOworICAgIFdlYlBTYWZlRnJlZSgodm9pZCopbWVtLT5wYXJ0MF9idWZfKTsKKyAgfQorfQorCitzdGF0aWMgaW50IENoZWNrTWVtQnVmZmVyTW9kZShNZW1CdWZmZXIqIGNvbnN0IG1lbSwgTWVtQnVmZmVyTW9kZSBleHBlY3RlZCkgeworICBpZiAobWVtLT5tb2RlXyA9PSBNRU1fTU9ERV9OT05FKSB7CisgICAgbWVtLT5tb2RlXyA9IGV4cGVjdGVkOyAgICAvLyBzd2l0Y2ggdG8gdGhlIGV4cGVjdGVkIG1vZGUKKyAgfSBlbHNlIGlmIChtZW0tPm1vZGVfICE9IGV4cGVjdGVkKSB7CisgICAgcmV0dXJuIDA7ICAgICAgICAgLy8gd2UgbWl4ZWQgdGhlIG1vZGVzID0+IGVycm9yCisgIH0KKyAgYXNzZXJ0KG1lbS0+bW9kZV8gPT0gZXhwZWN0ZWQpOyAgIC8vIG1vZGUgaXMgb2sKKyAgcmV0dXJuIDE7Cit9CisKKy8vIFRvIGJlIGNhbGxlZCBsYXN0Lgorc3RhdGljIFZQOFN0YXR1c0NvZGUgRmluaXNoRGVjb2RpbmcoV2ViUElEZWNvZGVyKiBjb25zdCBpZGVjKSB7CisgIGNvbnN0IFdlYlBEZWNvZGVyT3B0aW9ucyogY29uc3Qgb3B0aW9ucyA9IGlkZWMtPnBhcmFtc18ub3B0aW9uczsKKyAgV2ViUERlY0J1ZmZlciogY29uc3Qgb3V0cHV0ID0gaWRlYy0+cGFyYW1zXy5vdXRwdXQ7CisKKyAgaWRlYy0+c3RhdGVfID0gU1RBVEVfRE9ORTsKKyAgaWYgKG9wdGlvbnMgIT0gTlVMTCAmJiBvcHRpb25zLT5mbGlwKSB7CisgICAgY29uc3QgVlA4U3RhdHVzQ29kZSBzdGF0dXMgPSBXZWJQRmxpcEJ1ZmZlcihvdXRwdXQpOworICAgIGlmIChzdGF0dXMgIT0gVlA4X1NUQVRVU19PSykgcmV0dXJuIHN0YXR1czsKKyAgfQorICBpZiAoaWRlYy0+ZmluYWxfb3V0cHV0XyAhPSBOVUxMKSB7CisgICAgV2ViUENvcHlEZWNCdWZmZXJQaXhlbHMob3V0cHV0LCBpZGVjLT5maW5hbF9vdXRwdXRfKTsgIC8vIGRvIHRoZSBzbG93LWNvcHkKKyAgICBXZWJQRnJlZURlY0J1ZmZlcigmaWRlYy0+b3V0cHV0Xyk7CisgICAgKm91dHB1dCA9ICppZGVjLT5maW5hbF9vdXRwdXRfOworICAgIGlkZWMtPmZpbmFsX291dHB1dF8gPSBOVUxMOworICB9CisgIHJldHVybiBWUDhfU1RBVFVTX09LOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWFjcm9ibG9jay1kZWNvZGluZyBjb250ZXh0cworCitzdGF0aWMgdm9pZCBTYXZlQ29udGV4dChjb25zdCBWUDhEZWNvZGVyKiBkZWMsIGNvbnN0IFZQOEJpdFJlYWRlciogdG9rZW5fYnIsCisgICAgICAgICAgICAgICAgICAgICAgICBNQkNvbnRleHQqIGNvbnN0IGNvbnRleHQpIHsKKyAgY29udGV4dC0+bGVmdF8gPSBkZWMtPm1iX2luZm9fWy0xXTsKKyAgY29udGV4dC0+aW5mb18gPSBkZWMtPm1iX2luZm9fW2RlYy0+bWJfeF9dOworICBjb250ZXh0LT50b2tlbl9icl8gPSAqdG9rZW5fYnI7Cit9CisKK3N0YXRpYyB2b2lkIFJlc3RvcmVDb250ZXh0KGNvbnN0IE1CQ29udGV4dCogY29udGV4dCwgVlA4RGVjb2RlciogY29uc3QgZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4Qml0UmVhZGVyKiBjb25zdCB0b2tlbl9icikgeworICBkZWMtPm1iX2luZm9fWy0xXSA9IGNvbnRleHQtPmxlZnRfOworICBkZWMtPm1iX2luZm9fW2RlYy0+bWJfeF9dID0gY29udGV4dC0+aW5mb187CisgICp0b2tlbl9iciA9IGNvbnRleHQtPnRva2VuX2JyXzsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIFZQOFN0YXR1c0NvZGUgSURlY0Vycm9yKFdlYlBJRGVjb2RlciogY29uc3QgaWRlYywgVlA4U3RhdHVzQ29kZSBlcnJvcikgeworICBpZiAoaWRlYy0+c3RhdGVfID09IFNUQVRFX1ZQOF9EQVRBKSB7CisgICAgVlA4SW8qIGNvbnN0IGlvID0gJmlkZWMtPmlvXzsKKyAgICBpZiAoaW8tPnRlYXJkb3duICE9IE5VTEwpIHsKKyAgICAgIGlvLT50ZWFyZG93bihpbyk7CisgICAgfQorICB9CisgIGlkZWMtPnN0YXRlXyA9IFNUQVRFX0VSUk9SOworICByZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyB2b2lkIENoYW5nZVN0YXRlKFdlYlBJRGVjb2RlciogY29uc3QgaWRlYywgRGVjU3RhdGUgbmV3X3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGNvbnN1bWVkX2J5dGVzKSB7CisgIE1lbUJ1ZmZlciogY29uc3QgbWVtID0gJmlkZWMtPm1lbV87CisgIGlkZWMtPnN0YXRlXyA9IG5ld19zdGF0ZTsKKyAgbWVtLT5zdGFydF8gKz0gY29uc3VtZWRfYnl0ZXM7CisgIGFzc2VydChtZW0tPnN0YXJ0XyA8PSBtZW0tPmVuZF8pOworICBpZGVjLT5pb18uZGF0YSA9IG1lbS0+YnVmXyArIG1lbS0+c3RhcnRfOworICBpZGVjLT5pb18uZGF0YV9zaXplID0gTWVtRGF0YVNpemUobWVtKTsKK30KKworLy8gSGVhZGVycworc3RhdGljIFZQOFN0YXR1c0NvZGUgRGVjb2RlV2ViUEhlYWRlcnMoV2ViUElEZWNvZGVyKiBjb25zdCBpZGVjKSB7CisgIE1lbUJ1ZmZlciogY29uc3QgbWVtID0gJmlkZWMtPm1lbV87CisgIGNvbnN0IHVpbnQ4X3QqIGRhdGEgPSBtZW0tPmJ1Zl8gKyBtZW0tPnN0YXJ0XzsKKyAgc2l6ZV90IGN1cnJfc2l6ZSA9IE1lbURhdGFTaXplKG1lbSk7CisgIFZQOFN0YXR1c0NvZGUgc3RhdHVzOworICBXZWJQSGVhZGVyU3RydWN0dXJlIGhlYWRlcnM7CisKKyAgaGVhZGVycy5kYXRhID0gZGF0YTsKKyAgaGVhZGVycy5kYXRhX3NpemUgPSBjdXJyX3NpemU7CisgIGhlYWRlcnMuaGF2ZV9hbGxfZGF0YSA9IDA7CisgIHN0YXR1cyA9IFdlYlBQYXJzZUhlYWRlcnMoJmhlYWRlcnMpOworICBpZiAoc3RhdHVzID09IFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBKSB7CisgICAgcmV0dXJuIFZQOF9TVEFUVVNfU1VTUEVOREVEOyAgLy8gV2UgaGF2ZW4ndCBmb3VuZCBhIFZQOCBjaHVuayB5ZXQuCisgIH0gZWxzZSBpZiAoc3RhdHVzICE9IFZQOF9TVEFUVVNfT0spIHsKKyAgICByZXR1cm4gSURlY0Vycm9yKGlkZWMsIHN0YXR1cyk7CisgIH0KKworICBpZGVjLT5jaHVua19zaXplXyA9IGhlYWRlcnMuY29tcHJlc3NlZF9zaXplOworICBpZGVjLT5pc19sb3NzbGVzc18gPSBoZWFkZXJzLmlzX2xvc3NsZXNzOworICBpZiAoIWlkZWMtPmlzX2xvc3NsZXNzXykgeworICAgIFZQOERlY29kZXIqIGNvbnN0IGRlYyA9IFZQOE5ldygpOworICAgIGlmIChkZWMgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfT1VUX09GX01FTU9SWTsKKyAgICB9CisgICAgaWRlYy0+ZGVjXyA9IGRlYzsKKyAgICBkZWMtPmFscGhhX2RhdGFfID0gaGVhZGVycy5hbHBoYV9kYXRhOworICAgIGRlYy0+YWxwaGFfZGF0YV9zaXplXyA9IGhlYWRlcnMuYWxwaGFfZGF0YV9zaXplOworICAgIENoYW5nZVN0YXRlKGlkZWMsIFNUQVRFX1ZQOF9IRUFERVIsIGhlYWRlcnMub2Zmc2V0KTsKKyAgfSBlbHNlIHsKKyAgICBWUDhMRGVjb2RlciogY29uc3QgZGVjID0gVlA4TE5ldygpOworICAgIGlmIChkZWMgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfT1VUX09GX01FTU9SWTsKKyAgICB9CisgICAgaWRlYy0+ZGVjXyA9IGRlYzsKKyAgICBDaGFuZ2VTdGF0ZShpZGVjLCBTVEFURV9WUDhMX0hFQURFUiwgaGVhZGVycy5vZmZzZXQpOworICB9CisgIHJldHVybiBWUDhfU1RBVFVTX09LOworfQorCitzdGF0aWMgVlA4U3RhdHVzQ29kZSBEZWNvZGVWUDhGcmFtZUhlYWRlcihXZWJQSURlY29kZXIqIGNvbnN0IGlkZWMpIHsKKyAgY29uc3QgdWludDhfdCogZGF0YSA9IGlkZWMtPm1lbV8uYnVmXyArIGlkZWMtPm1lbV8uc3RhcnRfOworICBjb25zdCBzaXplX3QgY3Vycl9zaXplID0gTWVtRGF0YVNpemUoJmlkZWMtPm1lbV8pOworICBpbnQgd2lkdGgsIGhlaWdodDsKKyAgdWludDMyX3QgYml0czsKKworICBpZiAoY3Vycl9zaXplIDwgVlA4X0ZSQU1FX0hFQURFUl9TSVpFKSB7CisgICAgLy8gTm90IGVub3VnaCBkYXRhIGJ5dGVzIHRvIGV4dHJhY3QgVlA4IEZyYW1lIEhlYWRlci4KKyAgICByZXR1cm4gVlA4X1NUQVRVU19TVVNQRU5ERUQ7CisgIH0KKyAgaWYgKCFWUDhHZXRJbmZvKGRhdGEsIGN1cnJfc2l6ZSwgaWRlYy0+Y2h1bmtfc2l6ZV8sICZ3aWR0aCwgJmhlaWdodCkpIHsKKyAgICByZXR1cm4gSURlY0Vycm9yKGlkZWMsIFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SKTsKKyAgfQorCisgIGJpdHMgPSBkYXRhWzBdIHwgKGRhdGFbMV0gPDwgOCkgfCAoZGF0YVsyXSA8PCAxNik7CisgIGlkZWMtPm1lbV8ucGFydDBfc2l6ZV8gPSAoYml0cyA+PiA1KSArIFZQOF9GUkFNRV9IRUFERVJfU0laRTsKKworICBpZGVjLT5pb18uZGF0YSA9IGRhdGE7CisgIGlkZWMtPmlvXy5kYXRhX3NpemUgPSBjdXJyX3NpemU7CisgIGlkZWMtPnN0YXRlXyA9IFNUQVRFX1ZQOF9QQVJUUzA7CisgIHJldHVybiBWUDhfU1RBVFVTX09LOworfQorCisvLyBQYXJ0aXRpb24gIzAKK3N0YXRpYyBWUDhTdGF0dXNDb2RlIENvcHlQYXJ0czBEYXRhKFdlYlBJRGVjb2RlciogY29uc3QgaWRlYykgeworICBWUDhEZWNvZGVyKiBjb25zdCBkZWMgPSAoVlA4RGVjb2RlciopaWRlYy0+ZGVjXzsKKyAgVlA4Qml0UmVhZGVyKiBjb25zdCBiciA9ICZkZWMtPmJyXzsKKyAgY29uc3Qgc2l6ZV90IHBhcnRfc2l6ZSA9IGJyLT5idWZfZW5kXyAtIGJyLT5idWZfOworICBNZW1CdWZmZXIqIGNvbnN0IG1lbSA9ICZpZGVjLT5tZW1fOworICBhc3NlcnQoIWlkZWMtPmlzX2xvc3NsZXNzXyk7CisgIGFzc2VydChtZW0tPnBhcnQwX2J1Zl8gPT0gTlVMTCk7CisgIC8vIHRoZSBmb2xsb3dpbmcgaXMgYSBmb3JtYXQgbGltaXRhdGlvbiwgbm8gbmVlZCBmb3IgcnVudGltZSBjaGVjazoKKyAgYXNzZXJ0KHBhcnRfc2l6ZSA8PSBtZW0tPnBhcnQwX3NpemVfKTsKKyAgaWYgKHBhcnRfc2l6ZSA9PSAwKSB7ICAgLy8gY2FuJ3QgaGF2ZSB6ZXJvLXNpemUgcGFydGl0aW9uICMwCisgICAgcmV0dXJuIFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SOworICB9CisgIGlmIChtZW0tPm1vZGVfID09IE1FTV9NT0RFX0FQUEVORCkgeworICAgIC8vIFdlIGNvcHkgYW5kIGdyYWIgb3duZXJzaGlwIG9mIHRoZSBwYXJ0aXRpb24gIzAgZGF0YS4KKyAgICB1aW50OF90KiBjb25zdCBwYXJ0MF9idWYgPSAodWludDhfdCopV2ViUFNhZmVNYWxsb2MoMVVMTCwgcGFydF9zaXplKTsKKyAgICBpZiAocGFydDBfYnVmID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBWUDhfU1RBVFVTX09VVF9PRl9NRU1PUlk7CisgICAgfQorICAgIG1lbWNweShwYXJ0MF9idWYsIGJyLT5idWZfLCBwYXJ0X3NpemUpOworICAgIG1lbS0+cGFydDBfYnVmXyA9IHBhcnQwX2J1ZjsKKyAgICBWUDhCaXRSZWFkZXJTZXRCdWZmZXIoYnIsIHBhcnQwX2J1ZiwgcGFydF9zaXplKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBFbHNlOiBqdXN0IGtlZXAgcG9pbnRlcnMgdG8gdGhlIHBhcnRpdGlvbiAjMCdzIGRhdGEgaW4gZGVjXy0+YnJfLgorICB9CisgIG1lbS0+c3RhcnRfICs9IHBhcnRfc2l6ZTsKKyAgcmV0dXJuIFZQOF9TVEFUVVNfT0s7Cit9CisKK3N0YXRpYyBWUDhTdGF0dXNDb2RlIERlY29kZVBhcnRpdGlvbjAoV2ViUElEZWNvZGVyKiBjb25zdCBpZGVjKSB7CisgIFZQOERlY29kZXIqIGNvbnN0IGRlYyA9IChWUDhEZWNvZGVyKilpZGVjLT5kZWNfOworICBWUDhJbyogY29uc3QgaW8gPSAmaWRlYy0+aW9fOworICBjb25zdCBXZWJQRGVjUGFyYW1zKiBjb25zdCBwYXJhbXMgPSAmaWRlYy0+cGFyYW1zXzsKKyAgV2ViUERlY0J1ZmZlciogY29uc3Qgb3V0cHV0ID0gcGFyYW1zLT5vdXRwdXQ7CisKKyAgLy8gV2FpdCB0aWxsIHdlIGhhdmUgZW5vdWdoIGRhdGEgZm9yIHRoZSB3aG9sZSBwYXJ0aXRpb24gIzAKKyAgaWYgKE1lbURhdGFTaXplKCZpZGVjLT5tZW1fKSA8IGlkZWMtPm1lbV8ucGFydDBfc2l6ZV8pIHsKKyAgICByZXR1cm4gVlA4X1NUQVRVU19TVVNQRU5ERUQ7CisgIH0KKworICBpZiAoIVZQOEdldEhlYWRlcnMoZGVjLCBpbykpIHsKKyAgICBjb25zdCBWUDhTdGF0dXNDb2RlIHN0YXR1cyA9IGRlYy0+c3RhdHVzXzsKKyAgICBpZiAoc3RhdHVzID09IFZQOF9TVEFUVVNfU1VTUEVOREVEIHx8CisgICAgICAgIHN0YXR1cyA9PSBWUDhfU1RBVFVTX05PVF9FTk9VR0hfREFUQSkgeworICAgICAgLy8gdHJlYXRpbmcgTk9UX0VOT1VHSF9EQVRBIGFzIFNVU1BFTkRFRCBzdGF0ZQorICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfU1VTUEVOREVEOworICAgIH0KKyAgICByZXR1cm4gSURlY0Vycm9yKGlkZWMsIHN0YXR1cyk7CisgIH0KKworICAvLyBBbGxvY2F0ZS9WZXJpZnkgb3V0cHV0IGJ1ZmZlciBub3cKKyAgZGVjLT5zdGF0dXNfID0gV2ViUEFsbG9jYXRlRGVjQnVmZmVyKGlvLT53aWR0aCwgaW8tPmhlaWdodCwgcGFyYW1zLT5vcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0KTsKKyAgaWYgKGRlYy0+c3RhdHVzXyAhPSBWUDhfU1RBVFVTX09LKSB7CisgICAgcmV0dXJuIElEZWNFcnJvcihpZGVjLCBkZWMtPnN0YXR1c18pOworICB9CisgIC8vIFRoaXMgY2hhbmdlIG11c3QgYmUgZG9uZSBiZWZvcmUgY2FsbGluZyBWUDhJbml0RnJhbWUoKQorICBkZWMtPm10X21ldGhvZF8gPSBWUDhHZXRUaHJlYWRNZXRob2QocGFyYW1zLT5vcHRpb25zLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW8tPndpZHRoLCBpby0+aGVpZ2h0KTsKKyAgVlA4SW5pdERpdGhlcmluZyhwYXJhbXMtPm9wdGlvbnMsIGRlYyk7CisKKyAgZGVjLT5zdGF0dXNfID0gQ29weVBhcnRzMERhdGEoaWRlYyk7CisgIGlmIChkZWMtPnN0YXR1c18gIT0gVlA4X1NUQVRVU19PSykgeworICAgIHJldHVybiBJRGVjRXJyb3IoaWRlYywgZGVjLT5zdGF0dXNfKTsKKyAgfQorCisgIC8vIEZpbmlzaCBzZXR0aW5nIHVwIHRoZSBkZWNvZGluZyBwYXJhbWV0ZXJzLiBXaWxsIGNhbGwgaW8tPnNldHVwKCkuCisgIGlmIChWUDhFbnRlckNyaXRpY2FsKGRlYywgaW8pICE9IFZQOF9TVEFUVVNfT0spIHsKKyAgICByZXR1cm4gSURlY0Vycm9yKGlkZWMsIGRlYy0+c3RhdHVzXyk7CisgIH0KKworICAvLyBOb3RlOiBwYXN0IHRoaXMgcG9pbnQsIHRlYXJkb3duKCkgbXVzdCBhbHdheXMgYmUgY2FsbGVkCisgIC8vIGluIGNhc2Ugb2YgZXJyb3IuCisgIGlkZWMtPnN0YXRlXyA9IFNUQVRFX1ZQOF9EQVRBOworICAvLyBBbGxvY2F0ZSBtZW1vcnkgYW5kIHByZXBhcmUgZXZlcnl0aGluZy4KKyAgaWYgKCFWUDhJbml0RnJhbWUoZGVjLCBpbykpIHsKKyAgICByZXR1cm4gSURlY0Vycm9yKGlkZWMsIGRlYy0+c3RhdHVzXyk7CisgIH0KKyAgcmV0dXJuIFZQOF9TVEFUVVNfT0s7Cit9CisKKy8vIFJlbWFpbmluZyBwYXJ0aXRpb25zCitzdGF0aWMgVlA4U3RhdHVzQ29kZSBEZWNvZGVSZW1haW5pbmcoV2ViUElEZWNvZGVyKiBjb25zdCBpZGVjKSB7CisgIFZQOERlY29kZXIqIGNvbnN0IGRlYyA9IChWUDhEZWNvZGVyKilpZGVjLT5kZWNfOworICBWUDhJbyogY29uc3QgaW8gPSAmaWRlYy0+aW9fOworCisgIGFzc2VydChkZWMtPnJlYWR5Xyk7CisgIGZvciAoOyBkZWMtPm1iX3lfIDwgZGVjLT5tYl9oXzsgKytkZWMtPm1iX3lfKSB7CisgICAgaWYgKGlkZWMtPmxhc3RfbWJfeV8gIT0gZGVjLT5tYl95XykgeworICAgICAgaWYgKCFWUDhQYXJzZUludHJhTW9kZVJvdygmZGVjLT5icl8sIGRlYykpIHsKKyAgICAgICAgLy8gbm90ZTogbm9ybWFsbHksIGVycm9yIHNob3VsZG4ndCBvY2N1ciBzaW5jZSB3ZSBhbHJlYWR5IGhhdmUgdGhlIHdob2xlCisgICAgICAgIC8vIHBhcnRpdGlvbjAgYXZhaWxhYmxlIGhlcmUgaW4gRGVjb2RlUmVtYWluaW5nKCkuIFJlYWNoaW5nIEVPRiB3aGlsZQorICAgICAgICAvLyByZWFkaW5nIGludHJhIG1vZGVzIHJlYWxseSBtZWFucyBhIEJJVFNUUkVBTV9FUlJPUi4KKyAgICAgICAgcmV0dXJuIElEZWNFcnJvcihpZGVjLCBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUik7CisgICAgICB9CisgICAgICBpZGVjLT5sYXN0X21iX3lfID0gZGVjLT5tYl95XzsKKyAgICB9CisgICAgZm9yICg7IGRlYy0+bWJfeF8gPCBkZWMtPm1iX3dfOyArK2RlYy0+bWJfeF8pIHsKKyAgICAgIFZQOEJpdFJlYWRlciogY29uc3QgdG9rZW5fYnIgPQorICAgICAgICAgICZkZWMtPnBhcnRzX1tkZWMtPm1iX3lfICYgZGVjLT5udW1fcGFydHNfbWludXNfb25lX107CisgICAgICBNQkNvbnRleHQgY29udGV4dDsKKyAgICAgIFNhdmVDb250ZXh0KGRlYywgdG9rZW5fYnIsICZjb250ZXh0KTsKKyAgICAgIGlmICghVlA4RGVjb2RlTUIoZGVjLCB0b2tlbl9icikpIHsKKyAgICAgICAgLy8gV2Ugc2hvdWxkbid0IGZhaWwgd2hlbiBNQVhfTUIgZGF0YSB3YXMgYXZhaWxhYmxlCisgICAgICAgIGlmIChkZWMtPm51bV9wYXJ0c19taW51c19vbmVfID09IDAgJiYKKyAgICAgICAgICAgIE1lbURhdGFTaXplKCZpZGVjLT5tZW1fKSA+IE1BWF9NQl9TSVpFKSB7CisgICAgICAgICAgcmV0dXJuIElEZWNFcnJvcihpZGVjLCBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUik7CisgICAgICAgIH0KKyAgICAgICAgUmVzdG9yZUNvbnRleHQoJmNvbnRleHQsIGRlYywgdG9rZW5fYnIpOworICAgICAgICByZXR1cm4gVlA4X1NUQVRVU19TVVNQRU5ERUQ7CisgICAgICB9CisgICAgICAvLyBSZWxlYXNlIGJ1ZmZlciBvbmx5IGlmIHRoZXJlIGlzIG9ubHkgb25lIHBhcnRpdGlvbgorICAgICAgaWYgKGRlYy0+bnVtX3BhcnRzX21pbnVzX29uZV8gPT0gMCkgeworICAgICAgICBpZGVjLT5tZW1fLnN0YXJ0XyA9IHRva2VuX2JyLT5idWZfIC0gaWRlYy0+bWVtXy5idWZfOworICAgICAgICBhc3NlcnQoaWRlYy0+bWVtXy5zdGFydF8gPD0gaWRlYy0+bWVtXy5lbmRfKTsKKyAgICAgIH0KKyAgICB9CisgICAgVlA4SW5pdFNjYW5saW5lKGRlYyk7ICAgLy8gUHJlcGFyZSBmb3IgbmV4dCBzY2FubGluZQorCisgICAgLy8gUmVjb25zdHJ1Y3QsIGZpbHRlciBhbmQgZW1pdCB0aGUgcm93LgorICAgIGlmICghVlA4UHJvY2Vzc1JvdyhkZWMsIGlvKSkgeworICAgICAgcmV0dXJuIElEZWNFcnJvcihpZGVjLCBWUDhfU1RBVFVTX1VTRVJfQUJPUlQpOworICAgIH0KKyAgfQorICAvLyBTeW5jaHJvbml6ZSB0aGUgdGhyZWFkIGFuZCBjaGVjayBmb3IgZXJyb3JzLgorICBpZiAoIVZQOEV4aXRDcml0aWNhbChkZWMsIGlvKSkgeworICAgIHJldHVybiBJRGVjRXJyb3IoaWRlYywgVlA4X1NUQVRVU19VU0VSX0FCT1JUKTsKKyAgfQorICBkZWMtPnJlYWR5XyA9IDA7CisgIHJldHVybiBGaW5pc2hEZWNvZGluZyhpZGVjKTsKK30KKworc3RhdGljIFZQOFN0YXR1c0NvZGUgRXJyb3JTdGF0dXNMb3NzbGVzcyhXZWJQSURlY29kZXIqIGNvbnN0IGlkZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOFN0YXR1c0NvZGUgc3RhdHVzKSB7CisgIGlmIChzdGF0dXMgPT0gVlA4X1NUQVRVU19TVVNQRU5ERUQgfHwgc3RhdHVzID09IFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBKSB7CisgICAgcmV0dXJuIFZQOF9TVEFUVVNfU1VTUEVOREVEOworICB9CisgIHJldHVybiBJRGVjRXJyb3IoaWRlYywgc3RhdHVzKTsKK30KKworc3RhdGljIFZQOFN0YXR1c0NvZGUgRGVjb2RlVlA4TEhlYWRlcihXZWJQSURlY29kZXIqIGNvbnN0IGlkZWMpIHsKKyAgVlA4SW8qIGNvbnN0IGlvID0gJmlkZWMtPmlvXzsKKyAgVlA4TERlY29kZXIqIGNvbnN0IGRlYyA9IChWUDhMRGVjb2RlciopaWRlYy0+ZGVjXzsKKyAgY29uc3QgV2ViUERlY1BhcmFtcyogY29uc3QgcGFyYW1zID0gJmlkZWMtPnBhcmFtc187CisgIFdlYlBEZWNCdWZmZXIqIGNvbnN0IG91dHB1dCA9IHBhcmFtcy0+b3V0cHV0OworICBzaXplX3QgY3Vycl9zaXplID0gTWVtRGF0YVNpemUoJmlkZWMtPm1lbV8pOworICBhc3NlcnQoaWRlYy0+aXNfbG9zc2xlc3NfKTsKKworICAvLyBXYWl0IHVudGlsIHRoZXJlJ3MgZW5vdWdoIGRhdGEgZm9yIGRlY29kaW5nIGhlYWRlci4KKyAgaWYgKGN1cnJfc2l6ZSA8IChpZGVjLT5jaHVua19zaXplXyA+PiAzKSkgeworICAgIGRlYy0+c3RhdHVzXyA9IFZQOF9TVEFUVVNfU1VTUEVOREVEOworICAgIHJldHVybiBFcnJvclN0YXR1c0xvc3NsZXNzKGlkZWMsIGRlYy0+c3RhdHVzXyk7CisgIH0KKworICBpZiAoIVZQOExEZWNvZGVIZWFkZXIoZGVjLCBpbykpIHsKKyAgICBpZiAoZGVjLT5zdGF0dXNfID09IFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SICYmCisgICAgICAgIGN1cnJfc2l6ZSA8IGlkZWMtPmNodW5rX3NpemVfKSB7CisgICAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX1NVU1BFTkRFRDsKKyAgICB9CisgICAgcmV0dXJuIEVycm9yU3RhdHVzTG9zc2xlc3MoaWRlYywgZGVjLT5zdGF0dXNfKTsKKyAgfQorICAvLyBBbGxvY2F0ZS92ZXJpZnkgb3V0cHV0IGJ1ZmZlciBub3cuCisgIGRlYy0+c3RhdHVzXyA9IFdlYlBBbGxvY2F0ZURlY0J1ZmZlcihpby0+d2lkdGgsIGlvLT5oZWlnaHQsIHBhcmFtcy0+b3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCk7CisgIGlmIChkZWMtPnN0YXR1c18gIT0gVlA4X1NUQVRVU19PSykgeworICAgIHJldHVybiBJRGVjRXJyb3IoaWRlYywgZGVjLT5zdGF0dXNfKTsKKyAgfQorCisgIGlkZWMtPnN0YXRlXyA9IFNUQVRFX1ZQOExfREFUQTsKKyAgcmV0dXJuIFZQOF9TVEFUVVNfT0s7Cit9CisKK3N0YXRpYyBWUDhTdGF0dXNDb2RlIERlY29kZVZQOExEYXRhKFdlYlBJRGVjb2RlciogY29uc3QgaWRlYykgeworICBWUDhMRGVjb2RlciogY29uc3QgZGVjID0gKFZQOExEZWNvZGVyKilpZGVjLT5kZWNfOworICBjb25zdCBzaXplX3QgY3Vycl9zaXplID0gTWVtRGF0YVNpemUoJmlkZWMtPm1lbV8pOworICBhc3NlcnQoaWRlYy0+aXNfbG9zc2xlc3NfKTsKKworICAvLyBTd2l0Y2ggdG8gaW5jcmVtZW50YWwgZGVjb2RpbmcgaWYgd2UgZG9uJ3QgaGF2ZSBhbGwgdGhlIGJ5dGVzIGF2YWlsYWJsZS4KKyAgZGVjLT5pbmNyZW1lbnRhbF8gPSAoY3Vycl9zaXplIDwgaWRlYy0+Y2h1bmtfc2l6ZV8pOworCisgIGlmICghVlA4TERlY29kZUltYWdlKGRlYykpIHsKKyAgICByZXR1cm4gRXJyb3JTdGF0dXNMb3NzbGVzcyhpZGVjLCBkZWMtPnN0YXR1c18pOworICB9CisgIGFzc2VydChkZWMtPnN0YXR1c18gPT0gVlA4X1NUQVRVU19PSyB8fCBkZWMtPnN0YXR1c18gPT0gVlA4X1NUQVRVU19TVVNQRU5ERUQpOworICByZXR1cm4gKGRlYy0+c3RhdHVzXyA9PSBWUDhfU1RBVFVTX1NVU1BFTkRFRCkgPyBkZWMtPnN0YXR1c18KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRmluaXNoRGVjb2RpbmcoaWRlYyk7Cit9CisKKyAgLy8gTWFpbiBkZWNvZGluZyBsb29wCitzdGF0aWMgVlA4U3RhdHVzQ29kZSBJRGVjb2RlKFdlYlBJRGVjb2RlciogaWRlYykgeworICBWUDhTdGF0dXNDb2RlIHN0YXR1cyA9IFZQOF9TVEFUVVNfU1VTUEVOREVEOworCisgIGlmIChpZGVjLT5zdGF0ZV8gPT0gU1RBVEVfV0VCUF9IRUFERVIpIHsKKyAgICBzdGF0dXMgPSBEZWNvZGVXZWJQSGVhZGVycyhpZGVjKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoaWRlYy0+ZGVjXyA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gVlA4X1NUQVRVU19TVVNQRU5ERUQ7ICAgIC8vIGNhbid0IGNvbnRpbnVlIGlmIHdlIGhhdmUgbm8gZGVjb2Rlci4KKyAgICB9CisgIH0KKyAgaWYgKGlkZWMtPnN0YXRlXyA9PSBTVEFURV9WUDhfSEVBREVSKSB7CisgICAgc3RhdHVzID0gRGVjb2RlVlA4RnJhbWVIZWFkZXIoaWRlYyk7CisgIH0KKyAgaWYgKGlkZWMtPnN0YXRlXyA9PSBTVEFURV9WUDhfUEFSVFMwKSB7CisgICAgc3RhdHVzID0gRGVjb2RlUGFydGl0aW9uMChpZGVjKTsKKyAgfQorICBpZiAoaWRlYy0+c3RhdGVfID09IFNUQVRFX1ZQOF9EQVRBKSB7CisgICAgc3RhdHVzID0gRGVjb2RlUmVtYWluaW5nKGlkZWMpOworICB9CisgIGlmIChpZGVjLT5zdGF0ZV8gPT0gU1RBVEVfVlA4TF9IRUFERVIpIHsKKyAgICBzdGF0dXMgPSBEZWNvZGVWUDhMSGVhZGVyKGlkZWMpOworICB9CisgIGlmIChpZGVjLT5zdGF0ZV8gPT0gU1RBVEVfVlA4TF9EQVRBKSB7CisgICAgc3RhdHVzID0gRGVjb2RlVlA4TERhdGEoaWRlYyk7CisgIH0KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEludGVybmFsIGNvbnN0cnVjdG9yCisKK3N0YXRpYyBXZWJQSURlY29kZXIqIE5ld0RlY29kZXIoV2ViUERlY0J1ZmZlciogY29uc3Qgb3V0cHV0X2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUEJpdHN0cmVhbUZlYXR1cmVzKiBjb25zdCBmZWF0dXJlcykgeworICBXZWJQSURlY29kZXIqIGlkZWMgPSAoV2ViUElEZWNvZGVyKilXZWJQU2FmZUNhbGxvYygxVUxMLCBzaXplb2YoKmlkZWMpKTsKKyAgaWYgKGlkZWMgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgaWRlYy0+c3RhdGVfID0gU1RBVEVfV0VCUF9IRUFERVI7CisgIGlkZWMtPmNodW5rX3NpemVfID0gMDsKKworICBpZGVjLT5sYXN0X21iX3lfID0gLTE7CisKKyAgSW5pdE1lbUJ1ZmZlcigmaWRlYy0+bWVtXyk7CisgIFdlYlBJbml0RGVjQnVmZmVyKCZpZGVjLT5vdXRwdXRfKTsKKyAgVlA4SW5pdElvKCZpZGVjLT5pb18pOworCisgIFdlYlBSZXNldERlY1BhcmFtcygmaWRlYy0+cGFyYW1zXyk7CisgIGlmIChvdXRwdXRfYnVmZmVyID09IE5VTEwgfHwgV2ViUEF2b2lkU2xvd01lbW9yeShvdXRwdXRfYnVmZmVyLCBmZWF0dXJlcykpIHsKKyAgICBpZGVjLT5wYXJhbXNfLm91dHB1dCA9ICZpZGVjLT5vdXRwdXRfOworICAgIGlkZWMtPmZpbmFsX291dHB1dF8gPSBvdXRwdXRfYnVmZmVyOworICAgIGlmIChvdXRwdXRfYnVmZmVyICE9IE5VTEwpIHsKKyAgICAgIGlkZWMtPnBhcmFtc18ub3V0cHV0LT5jb2xvcnNwYWNlID0gb3V0cHV0X2J1ZmZlci0+Y29sb3JzcGFjZTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWRlYy0+cGFyYW1zXy5vdXRwdXQgPSBvdXRwdXRfYnVmZmVyOworICAgIGlkZWMtPmZpbmFsX291dHB1dF8gPSBOVUxMOworICB9CisgIFdlYlBJbml0Q3VzdG9tSW8oJmlkZWMtPnBhcmFtc18sICZpZGVjLT5pb18pOyAgLy8gUGx1ZyB0aGUgSS9PIGZ1bmN0aW9ucy4KKworICByZXR1cm4gaWRlYzsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1YmxpYyBmdW5jdGlvbnMKKworV2ViUElEZWNvZGVyKiBXZWJQSU5ld0RlY29kZXIoV2ViUERlY0J1ZmZlciogb3V0cHV0X2J1ZmZlcikgeworICByZXR1cm4gTmV3RGVjb2RlcihvdXRwdXRfYnVmZmVyLCBOVUxMKTsKK30KKworV2ViUElEZWNvZGVyKiBXZWJQSURlY29kZShjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQRGVjb2RlckNvbmZpZyogY29uZmlnKSB7CisgIFdlYlBJRGVjb2RlciogaWRlYzsKKyAgV2ViUEJpdHN0cmVhbUZlYXR1cmVzIHRtcF9mZWF0dXJlczsKKyAgV2ViUEJpdHN0cmVhbUZlYXR1cmVzKiBjb25zdCBmZWF0dXJlcyA9CisgICAgICAoY29uZmlnID09IE5VTEwpID8gJnRtcF9mZWF0dXJlcyA6ICZjb25maWctPmlucHV0OworICBtZW1zZXQoJnRtcF9mZWF0dXJlcywgMCwgc2l6ZW9mKHRtcF9mZWF0dXJlcykpOworCisgIC8vIFBhcnNlIHRoZSBiaXRzdHJlYW0ncyBmZWF0dXJlcywgaWYgcmVxdWVzdGVkOgorICBpZiAoZGF0YSAhPSBOVUxMICYmIGRhdGFfc2l6ZSA+IDApIHsKKyAgICBpZiAoV2ViUEdldEZlYXR1cmVzKGRhdGEsIGRhdGFfc2l6ZSwgZmVhdHVyZXMpICE9IFZQOF9TVEFUVVNfT0spIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgfQorCisgIC8vIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgaW5jcmVtZW50YWwgZGVjb2RlcgorICBpZGVjID0gKGNvbmZpZyAhPSBOVUxMKSA/IE5ld0RlY29kZXIoJmNvbmZpZy0+b3V0cHV0LCBmZWF0dXJlcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiBOZXdEZWNvZGVyKE5VTEwsIGZlYXR1cmVzKTsKKyAgaWYgKGlkZWMgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIC8vIEZpbmlzaCBpbml0aWFsaXphdGlvbgorICBpZiAoY29uZmlnICE9IE5VTEwpIHsKKyAgICBpZGVjLT5wYXJhbXNfLm9wdGlvbnMgPSAmY29uZmlnLT5vcHRpb25zOworICB9CisgIHJldHVybiBpZGVjOworfQorCit2b2lkIFdlYlBJRGVsZXRlKFdlYlBJRGVjb2RlciogaWRlYykgeworICBpZiAoaWRlYyA9PSBOVUxMKSByZXR1cm47CisgIGlmIChpZGVjLT5kZWNfICE9IE5VTEwpIHsKKyAgICBpZiAoIWlkZWMtPmlzX2xvc3NsZXNzXykgeworICAgICAgaWYgKGlkZWMtPnN0YXRlXyA9PSBTVEFURV9WUDhfREFUQSkgeworICAgICAgICAvLyBTeW5jaHJvbml6ZSB0aGUgdGhyZWFkLCBjbGVhbi11cCBhbmQgY2hlY2sgZm9yIGVycm9ycy4KKyAgICAgICAgVlA4RXhpdENyaXRpY2FsKChWUDhEZWNvZGVyKilpZGVjLT5kZWNfLCAmaWRlYy0+aW9fKTsKKyAgICAgIH0KKyAgICAgIFZQOERlbGV0ZSgoVlA4RGVjb2RlciopaWRlYy0+ZGVjXyk7CisgICAgfSBlbHNlIHsKKyAgICAgIFZQOExEZWxldGUoKFZQOExEZWNvZGVyKilpZGVjLT5kZWNfKTsKKyAgICB9CisgIH0KKyAgQ2xlYXJNZW1CdWZmZXIoJmlkZWMtPm1lbV8pOworICBXZWJQRnJlZURlY0J1ZmZlcigmaWRlYy0+b3V0cHV0Xyk7CisgIFdlYlBTYWZlRnJlZShpZGVjKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFdyYXBwZXIgdG93YXJkIFdlYlBJTmV3RGVjb2RlcgorCitXZWJQSURlY29kZXIqIFdlYlBJTmV3UkdCKFdFQlBfQ1NQX01PREUgY3NwLCB1aW50OF90KiBvdXRwdXRfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb3V0cHV0X2J1ZmZlcl9zaXplLCBpbnQgb3V0cHV0X3N0cmlkZSkgeworICBjb25zdCBpbnQgaXNfZXh0ZXJuYWxfbWVtb3J5ID0gKG91dHB1dF9idWZmZXIgIT0gTlVMTCkgPyAxIDogMDsKKyAgV2ViUElEZWNvZGVyKiBpZGVjOworCisgIGlmIChjc3AgPj0gTU9ERV9ZVVYpIHJldHVybiBOVUxMOworICBpZiAoaXNfZXh0ZXJuYWxfbWVtb3J5ID09IDApIHsgICAgLy8gT3ZlcndyaXRlIHBhcmFtZXRlcnMgdG8gc2FuZSB2YWx1ZXMuCisgICAgb3V0cHV0X2J1ZmZlcl9zaXplID0gMDsKKyAgICBvdXRwdXRfc3RyaWRlID0gMDsKKyAgfSBlbHNlIHsgIC8vIEEgYnVmZmVyIHdhcyBwYXNzZWQuIFZhbGlkYXRlIHRoZSBvdGhlciBwYXJhbXMuCisgICAgaWYgKG91dHB1dF9zdHJpZGUgPT0gMCB8fCBvdXRwdXRfYnVmZmVyX3NpemUgPT0gMCkgeworICAgICAgcmV0dXJuIE5VTEw7ICAgLy8gaW52YWxpZCBwYXJhbWV0ZXIuCisgICAgfQorICB9CisgIGlkZWMgPSBXZWJQSU5ld0RlY29kZXIoTlVMTCk7CisgIGlmIChpZGVjID09IE5VTEwpIHJldHVybiBOVUxMOworICBpZGVjLT5vdXRwdXRfLmNvbG9yc3BhY2UgPSBjc3A7CisgIGlkZWMtPm91dHB1dF8uaXNfZXh0ZXJuYWxfbWVtb3J5ID0gaXNfZXh0ZXJuYWxfbWVtb3J5OworICBpZGVjLT5vdXRwdXRfLnUuUkdCQS5yZ2JhID0gb3V0cHV0X2J1ZmZlcjsKKyAgaWRlYy0+b3V0cHV0Xy51LlJHQkEuc3RyaWRlID0gb3V0cHV0X3N0cmlkZTsKKyAgaWRlYy0+b3V0cHV0Xy51LlJHQkEuc2l6ZSA9IG91dHB1dF9idWZmZXJfc2l6ZTsKKyAgcmV0dXJuIGlkZWM7Cit9CisKK1dlYlBJRGVjb2RlciogV2ViUElOZXdZVVZBKHVpbnQ4X3QqIGx1bWEsIHNpemVfdCBsdW1hX3NpemUsIGludCBsdW1hX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHUsIHNpemVfdCB1X3NpemUsIGludCB1X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHYsIHNpemVfdCB2X3NpemUsIGludCB2X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGEsIHNpemVfdCBhX3NpemUsIGludCBhX3N0cmlkZSkgeworICBjb25zdCBpbnQgaXNfZXh0ZXJuYWxfbWVtb3J5ID0gKGx1bWEgIT0gTlVMTCkgPyAxIDogMDsKKyAgV2ViUElEZWNvZGVyKiBpZGVjOworICBXRUJQX0NTUF9NT0RFIGNvbG9yc3BhY2U7CisKKyAgaWYgKGlzX2V4dGVybmFsX21lbW9yeSA9PSAwKSB7ICAgIC8vIE92ZXJ3cml0ZSBwYXJhbWV0ZXJzIHRvIHNhbmUgdmFsdWVzLgorICAgIGx1bWFfc2l6ZSA9IHVfc2l6ZSA9IHZfc2l6ZSA9IGFfc2l6ZSA9IDA7CisgICAgbHVtYV9zdHJpZGUgPSB1X3N0cmlkZSA9IHZfc3RyaWRlID0gYV9zdHJpZGUgPSAwOworICAgIHUgPSB2ID0gYSA9IE5VTEw7CisgICAgY29sb3JzcGFjZSA9IE1PREVfWVVWQTsKKyAgfSBlbHNlIHsgIC8vIEEgbHVtYSBidWZmZXIgd2FzIHBhc3NlZC4gVmFsaWRhdGUgdGhlIG90aGVyIHBhcmFtZXRlcnMuCisgICAgaWYgKHUgPT0gTlVMTCB8fCB2ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGlmIChsdW1hX3NpemUgPT0gMCB8fCB1X3NpemUgPT0gMCB8fCB2X3NpemUgPT0gMCkgcmV0dXJuIE5VTEw7CisgICAgaWYgKGx1bWFfc3RyaWRlID09IDAgfHwgdV9zdHJpZGUgPT0gMCB8fCB2X3N0cmlkZSA9PSAwKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoYSAhPSBOVUxMKSB7CisgICAgICBpZiAoYV9zaXplID09IDAgfHwgYV9zdHJpZGUgPT0gMCkgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGNvbG9yc3BhY2UgPSAoYSA9PSBOVUxMKSA/IE1PREVfWVVWIDogTU9ERV9ZVVZBOworICB9CisKKyAgaWRlYyA9IFdlYlBJTmV3RGVjb2RlcihOVUxMKTsKKyAgaWYgKGlkZWMgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgaWRlYy0+b3V0cHV0Xy5jb2xvcnNwYWNlID0gY29sb3JzcGFjZTsKKyAgaWRlYy0+b3V0cHV0Xy5pc19leHRlcm5hbF9tZW1vcnkgPSBpc19leHRlcm5hbF9tZW1vcnk7CisgIGlkZWMtPm91dHB1dF8udS5ZVVZBLnkgPSBsdW1hOworICBpZGVjLT5vdXRwdXRfLnUuWVVWQS55X3N0cmlkZSA9IGx1bWFfc3RyaWRlOworICBpZGVjLT5vdXRwdXRfLnUuWVVWQS55X3NpemUgPSBsdW1hX3NpemU7CisgIGlkZWMtPm91dHB1dF8udS5ZVVZBLnUgPSB1OworICBpZGVjLT5vdXRwdXRfLnUuWVVWQS51X3N0cmlkZSA9IHVfc3RyaWRlOworICBpZGVjLT5vdXRwdXRfLnUuWVVWQS51X3NpemUgPSB1X3NpemU7CisgIGlkZWMtPm91dHB1dF8udS5ZVVZBLnYgPSB2OworICBpZGVjLT5vdXRwdXRfLnUuWVVWQS52X3N0cmlkZSA9IHZfc3RyaWRlOworICBpZGVjLT5vdXRwdXRfLnUuWVVWQS52X3NpemUgPSB2X3NpemU7CisgIGlkZWMtPm91dHB1dF8udS5ZVVZBLmEgPSBhOworICBpZGVjLT5vdXRwdXRfLnUuWVVWQS5hX3N0cmlkZSA9IGFfc3RyaWRlOworICBpZGVjLT5vdXRwdXRfLnUuWVVWQS5hX3NpemUgPSBhX3NpemU7CisgIHJldHVybiBpZGVjOworfQorCitXZWJQSURlY29kZXIqIFdlYlBJTmV3WVVWKHVpbnQ4X3QqIGx1bWEsIHNpemVfdCBsdW1hX3NpemUsIGludCBsdW1hX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdSwgc2l6ZV90IHVfc2l6ZSwgaW50IHVfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB2LCBzaXplX3Qgdl9zaXplLCBpbnQgdl9zdHJpZGUpIHsKKyAgcmV0dXJuIFdlYlBJTmV3WVVWQShsdW1hLCBsdW1hX3NpemUsIGx1bWFfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgIHUsIHVfc2l6ZSwgdV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgdiwgdl9zaXplLCB2X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCAwKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIFZQOFN0YXR1c0NvZGUgSURlY0NoZWNrU3RhdHVzKGNvbnN0IFdlYlBJRGVjb2RlciogY29uc3QgaWRlYykgeworICBhc3NlcnQoaWRlYyk7CisgIGlmIChpZGVjLT5zdGF0ZV8gPT0gU1RBVEVfRVJST1IpIHsKKyAgICByZXR1cm4gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7CisgIH0KKyAgaWYgKGlkZWMtPnN0YXRlXyA9PSBTVEFURV9ET05FKSB7CisgICAgcmV0dXJuIFZQOF9TVEFUVVNfT0s7CisgIH0KKyAgcmV0dXJuIFZQOF9TVEFUVVNfU1VTUEVOREVEOworfQorCitWUDhTdGF0dXNDb2RlIFdlYlBJQXBwZW5kKFdlYlBJRGVjb2RlciogaWRlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSkgeworICBWUDhTdGF0dXNDb2RlIHN0YXR1czsKKyAgaWYgKGlkZWMgPT0gTlVMTCB8fCBkYXRhID09IE5VTEwpIHsKKyAgICByZXR1cm4gVlA4X1NUQVRVU19JTlZBTElEX1BBUkFNOworICB9CisgIHN0YXR1cyA9IElEZWNDaGVja1N0YXR1cyhpZGVjKTsKKyAgaWYgKHN0YXR1cyAhPSBWUDhfU1RBVFVTX1NVU1BFTkRFRCkgeworICAgIHJldHVybiBzdGF0dXM7CisgIH0KKyAgLy8gQ2hlY2sgbWl4ZWQgY2FsbHMgYmV0d2VlbiBSZW1hcE1lbUJ1ZmZlciBhbmQgQXBwZW5kVG9NZW1CdWZmZXIuCisgIGlmICghQ2hlY2tNZW1CdWZmZXJNb2RlKCZpZGVjLT5tZW1fLCBNRU1fTU9ERV9BUFBFTkQpKSB7CisgICAgcmV0dXJuIFZQOF9TVEFUVVNfSU5WQUxJRF9QQVJBTTsKKyAgfQorICAvLyBBcHBlbmQgZGF0YSB0byBtZW1vcnkgYnVmZmVyCisgIGlmICghQXBwZW5kVG9NZW1CdWZmZXIoaWRlYywgZGF0YSwgZGF0YV9zaXplKSkgeworICAgIHJldHVybiBWUDhfU1RBVFVTX09VVF9PRl9NRU1PUlk7CisgIH0KKyAgcmV0dXJuIElEZWNvZGUoaWRlYyk7Cit9CisKK1ZQOFN0YXR1c0NvZGUgV2ViUElVcGRhdGUoV2ViUElEZWNvZGVyKiBpZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplKSB7CisgIFZQOFN0YXR1c0NvZGUgc3RhdHVzOworICBpZiAoaWRlYyA9PSBOVUxMIHx8IGRhdGEgPT0gTlVMTCkgeworICAgIHJldHVybiBWUDhfU1RBVFVTX0lOVkFMSURfUEFSQU07CisgIH0KKyAgc3RhdHVzID0gSURlY0NoZWNrU3RhdHVzKGlkZWMpOworICBpZiAoc3RhdHVzICE9IFZQOF9TVEFUVVNfU1VTUEVOREVEKSB7CisgICAgcmV0dXJuIHN0YXR1czsKKyAgfQorICAvLyBDaGVjayBtaXhlZCBjYWxscyBiZXR3ZWVuIFJlbWFwTWVtQnVmZmVyIGFuZCBBcHBlbmRUb01lbUJ1ZmZlci4KKyAgaWYgKCFDaGVja01lbUJ1ZmZlck1vZGUoJmlkZWMtPm1lbV8sIE1FTV9NT0RFX01BUCkpIHsKKyAgICByZXR1cm4gVlA4X1NUQVRVU19JTlZBTElEX1BBUkFNOworICB9CisgIC8vIE1ha2UgdGhlIG1lbW9yeSBidWZmZXIgcG9pbnQgdG8gdGhlIG5ldyBidWZmZXIKKyAgaWYgKCFSZW1hcE1lbUJ1ZmZlcihpZGVjLCBkYXRhLCBkYXRhX3NpemUpKSB7CisgICAgcmV0dXJuIFZQOF9TVEFUVVNfSU5WQUxJRF9QQVJBTTsKKyAgfQorICByZXR1cm4gSURlY29kZShpZGVjKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGNvbnN0IFdlYlBEZWNCdWZmZXIqIEdldE91dHB1dEJ1ZmZlcihjb25zdCBXZWJQSURlY29kZXIqIGNvbnN0IGlkZWMpIHsKKyAgaWYgKGlkZWMgPT0gTlVMTCB8fCBpZGVjLT5kZWNfID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoaWRlYy0+c3RhdGVfIDw9IFNUQVRFX1ZQOF9QQVJUUzApIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoaWRlYy0+ZmluYWxfb3V0cHV0XyAhPSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7ICAgLy8gbm90IHlldCBzbG93LWNvcGllZAorICB9CisgIHJldHVybiBpZGVjLT5wYXJhbXNfLm91dHB1dDsKK30KKworY29uc3QgV2ViUERlY0J1ZmZlciogV2ViUElEZWNvZGVkQXJlYShjb25zdCBXZWJQSURlY29kZXIqIGlkZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogbGVmdCwgaW50KiB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsIGludCogaGVpZ2h0KSB7CisgIGNvbnN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IHNyYyA9IEdldE91dHB1dEJ1ZmZlcihpZGVjKTsKKyAgaWYgKGxlZnQgIT0gTlVMTCkgKmxlZnQgPSAwOworICBpZiAodG9wICE9IE5VTEwpICp0b3AgPSAwOworICBpZiAoc3JjICE9IE5VTEwpIHsKKyAgICBpZiAod2lkdGggIT0gTlVMTCkgKndpZHRoID0gc3JjLT53aWR0aDsKKyAgICBpZiAoaGVpZ2h0ICE9IE5VTEwpICpoZWlnaHQgPSBpZGVjLT5wYXJhbXNfLmxhc3RfeTsKKyAgfSBlbHNlIHsKKyAgICBpZiAod2lkdGggIT0gTlVMTCkgKndpZHRoID0gMDsKKyAgICBpZiAoaGVpZ2h0ICE9IE5VTEwpICpoZWlnaHQgPSAwOworICB9CisgIHJldHVybiBzcmM7Cit9CisKK3VpbnQ4X3QqIFdlYlBJRGVjR2V0UkdCKGNvbnN0IFdlYlBJRGVjb2RlciogaWRlYywgaW50KiBsYXN0X3ksCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCwgaW50KiBzdHJpZGUpIHsKKyAgY29uc3QgV2ViUERlY0J1ZmZlciogY29uc3Qgc3JjID0gR2V0T3V0cHV0QnVmZmVyKGlkZWMpOworICBpZiAoc3JjID09IE5VTEwpIHJldHVybiBOVUxMOworICBpZiAoc3JjLT5jb2xvcnNwYWNlID49IE1PREVfWVVWKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBpZiAobGFzdF95ICE9IE5VTEwpICpsYXN0X3kgPSBpZGVjLT5wYXJhbXNfLmxhc3RfeTsKKyAgaWYgKHdpZHRoICE9IE5VTEwpICp3aWR0aCA9IHNyYy0+d2lkdGg7CisgIGlmIChoZWlnaHQgIT0gTlVMTCkgKmhlaWdodCA9IHNyYy0+aGVpZ2h0OworICBpZiAoc3RyaWRlICE9IE5VTEwpICpzdHJpZGUgPSBzcmMtPnUuUkdCQS5zdHJpZGU7CisKKyAgcmV0dXJuIHNyYy0+dS5SR0JBLnJnYmE7Cit9CisKK3VpbnQ4X3QqIFdlYlBJRGVjR2V0WVVWQShjb25zdCBXZWJQSURlY29kZXIqIGlkZWMsIGludCogbGFzdF95LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiB1LCB1aW50OF90KiogdiwgdWludDhfdCoqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBzdHJpZGUsIGludCogdXZfc3RyaWRlLCBpbnQqIGFfc3RyaWRlKSB7CisgIGNvbnN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IHNyYyA9IEdldE91dHB1dEJ1ZmZlcihpZGVjKTsKKyAgaWYgKHNyYyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgaWYgKHNyYy0+Y29sb3JzcGFjZSA8IE1PREVfWVVWKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBpZiAobGFzdF95ICE9IE5VTEwpICpsYXN0X3kgPSBpZGVjLT5wYXJhbXNfLmxhc3RfeTsKKyAgaWYgKHUgIT0gTlVMTCkgKnUgPSBzcmMtPnUuWVVWQS51OworICBpZiAodiAhPSBOVUxMKSAqdiA9IHNyYy0+dS5ZVVZBLnY7CisgIGlmIChhICE9IE5VTEwpICphID0gc3JjLT51LllVVkEuYTsKKyAgaWYgKHdpZHRoICE9IE5VTEwpICp3aWR0aCA9IHNyYy0+d2lkdGg7CisgIGlmIChoZWlnaHQgIT0gTlVMTCkgKmhlaWdodCA9IHNyYy0+aGVpZ2h0OworICBpZiAoc3RyaWRlICE9IE5VTEwpICpzdHJpZGUgPSBzcmMtPnUuWVVWQS55X3N0cmlkZTsKKyAgaWYgKHV2X3N0cmlkZSAhPSBOVUxMKSAqdXZfc3RyaWRlID0gc3JjLT51LllVVkEudV9zdHJpZGU7CisgIGlmIChhX3N0cmlkZSAhPSBOVUxMKSAqYV9zdHJpZGUgPSBzcmMtPnUuWVVWQS5hX3N0cmlkZTsKKworICByZXR1cm4gc3JjLT51LllVVkEueTsKK30KKworaW50IFdlYlBJU2V0SU9Ib29rcyhXZWJQSURlY29kZXIqIGNvbnN0IGlkZWMsCisgICAgICAgICAgICAgICAgICAgIFZQOElvUHV0SG9vayBwdXQsCisgICAgICAgICAgICAgICAgICAgIFZQOElvU2V0dXBIb29rIHNldHVwLAorICAgICAgICAgICAgICAgICAgICBWUDhJb1RlYXJkb3duSG9vayB0ZWFyZG93biwKKyAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlcl9kYXRhKSB7CisgIGlmIChpZGVjID09IE5VTEwgfHwgaWRlYy0+c3RhdGVfID4gU1RBVEVfV0VCUF9IRUFERVIpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlkZWMtPmlvXy5wdXQgPSBwdXQ7CisgIGlkZWMtPmlvXy5zZXR1cCA9IHNldHVwOworICBpZGVjLT5pb18udGVhcmRvd24gPSB0ZWFyZG93bjsKKyAgaWRlYy0+aW9fLm9wYXF1ZSA9IHVzZXJfZGF0YTsKKworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvaW9fZGVjLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL2lvX2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhOWU1NWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL2lvX2RlYy5jCkBAIC0wLDAgKzEsNjU1IEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gZnVuY3Rpb25zIGZvciBzYW1wbGUgb3V0cHV0LgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9hc3NlcnRfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0ZGxpYl9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RyaW5nX3BvZW0uaCIKKyNlbHNlCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKyNpbmNsdWRlICJzcmMvZGVjL3ZwOGlfZGVjLmgiCisjaW5jbHVkZSAic3JjL2RlYy93ZWJwaV9kZWMuaCIKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorI2luY2x1ZGUgInNyYy9kc3AveXV2LmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL3V0aWxzLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNYWluIFlVVjwtPlJHQiBjb252ZXJzaW9uIGZ1bmN0aW9ucworCitzdGF0aWMgaW50IEVtaXRZVVYoY29uc3QgVlA4SW8qIGNvbnN0IGlvLCBXZWJQRGVjUGFyYW1zKiBjb25zdCBwKSB7CisgIFdlYlBEZWNCdWZmZXIqIG91dHB1dCA9IHAtPm91dHB1dDsKKyAgY29uc3QgV2ViUFlVVkFCdWZmZXIqIGNvbnN0IGJ1ZiA9ICZvdXRwdXQtPnUuWVVWQTsKKyAgdWludDhfdCogY29uc3QgeV9kc3QgPSBidWYtPnkgKyBpby0+bWJfeSAqIGJ1Zi0+eV9zdHJpZGU7CisgIHVpbnQ4X3QqIGNvbnN0IHVfZHN0ID0gYnVmLT51ICsgKGlvLT5tYl95ID4+IDEpICogYnVmLT51X3N0cmlkZTsKKyAgdWludDhfdCogY29uc3Qgdl9kc3QgPSBidWYtPnYgKyAoaW8tPm1iX3kgPj4gMSkgKiBidWYtPnZfc3RyaWRlOworICBjb25zdCBpbnQgbWJfdyA9IGlvLT5tYl93OworICBjb25zdCBpbnQgbWJfaCA9IGlvLT5tYl9oOworICBjb25zdCBpbnQgdXZfdyA9IChtYl93ICsgMSkgLyAyOworICBjb25zdCBpbnQgdXZfaCA9IChtYl9oICsgMSkgLyAyOworICBpbnQgajsKKyAgZm9yIChqID0gMDsgaiA8IG1iX2g7ICsraikgeworICAgIG1lbWNweSh5X2RzdCArIGogKiBidWYtPnlfc3RyaWRlLCBpby0+eSArIGogKiBpby0+eV9zdHJpZGUsIG1iX3cpOworICB9CisgIGZvciAoaiA9IDA7IGogPCB1dl9oOyArK2opIHsKKyAgICBtZW1jcHkodV9kc3QgKyBqICogYnVmLT51X3N0cmlkZSwgaW8tPnUgKyBqICogaW8tPnV2X3N0cmlkZSwgdXZfdyk7CisgICAgbWVtY3B5KHZfZHN0ICsgaiAqIGJ1Zi0+dl9zdHJpZGUsIGlvLT52ICsgaiAqIGlvLT51dl9zdHJpZGUsIHV2X3cpOworICB9CisgIHJldHVybiBpby0+bWJfaDsKK30KKworLy8gUG9pbnQtc2FtcGxpbmcgVS9WIHNhbXBsZXIuCitzdGF0aWMgaW50IEVtaXRTYW1wbGVkUkdCKGNvbnN0IFZQOElvKiBjb25zdCBpbywgV2ViUERlY1BhcmFtcyogY29uc3QgcCkgeworICBXZWJQRGVjQnVmZmVyKiBjb25zdCBvdXRwdXQgPSBwLT5vdXRwdXQ7CisgIFdlYlBSR0JBQnVmZmVyKiBjb25zdCBidWYgPSAmb3V0cHV0LT51LlJHQkE7CisgIHVpbnQ4X3QqIGNvbnN0IGRzdCA9IGJ1Zi0+cmdiYSArIGlvLT5tYl95ICogYnVmLT5zdHJpZGU7CisgIFdlYlBTYW1wbGVyUHJvY2Vzc1BsYW5lKGlvLT55LCBpby0+eV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlvLT51LCBpby0+diwgaW8tPnV2X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBidWYtPnN0cmlkZSwgaW8tPm1iX3csIGlvLT5tYl9oLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQU2FtcGxlcnNbb3V0cHV0LT5jb2xvcnNwYWNlXSk7CisgIHJldHVybiBpby0+bWJfaDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZhbmN5IHVwc2FtcGxpbmcKKworI2lmZGVmIEZBTkNZX1VQU0FNUExJTkcKK3N0YXRpYyBpbnQgRW1pdEZhbmN5UkdCKGNvbnN0IFZQOElvKiBjb25zdCBpbywgV2ViUERlY1BhcmFtcyogY29uc3QgcCkgeworICBpbnQgbnVtX2xpbmVzX291dCA9IGlvLT5tYl9oOyAgIC8vIGEgcHJpb3JpIGd1ZXNzCisgIGNvbnN0IFdlYlBSR0JBQnVmZmVyKiBjb25zdCBidWYgPSAmcC0+b3V0cHV0LT51LlJHQkE7CisgIHVpbnQ4X3QqIGRzdCA9IGJ1Zi0+cmdiYSArIGlvLT5tYl95ICogYnVmLT5zdHJpZGU7CisgIFdlYlBVcHNhbXBsZUxpbmVQYWlyRnVuYyB1cHNhbXBsZSA9IFdlYlBVcHNhbXBsZXJzW3AtPm91dHB1dC0+Y29sb3JzcGFjZV07CisgIGNvbnN0IHVpbnQ4X3QqIGN1cl95ID0gaW8tPnk7CisgIGNvbnN0IHVpbnQ4X3QqIGN1cl91ID0gaW8tPnU7CisgIGNvbnN0IHVpbnQ4X3QqIGN1cl92ID0gaW8tPnY7CisgIGNvbnN0IHVpbnQ4X3QqIHRvcF91ID0gcC0+dG1wX3U7CisgIGNvbnN0IHVpbnQ4X3QqIHRvcF92ID0gcC0+dG1wX3Y7CisgIGludCB5ID0gaW8tPm1iX3k7CisgIGNvbnN0IGludCB5X2VuZCA9IGlvLT5tYl95ICsgaW8tPm1iX2g7CisgIGNvbnN0IGludCBtYl93ID0gaW8tPm1iX3c7CisgIGNvbnN0IGludCB1dl93ID0gKG1iX3cgKyAxKSAvIDI7CisKKyAgaWYgKHkgPT0gMCkgeworICAgIC8vIEZpcnN0IGxpbmUgaXMgc3BlY2lhbCBjYXNlZC4gV2UgbWlycm9yIHRoZSB1L3Ygc2FtcGxlcyBhdCBib3VuZGFyeS4KKyAgICB1cHNhbXBsZShjdXJfeSwgTlVMTCwgY3VyX3UsIGN1cl92LCBjdXJfdSwgY3VyX3YsIGRzdCwgTlVMTCwgbWJfdyk7CisgIH0gZWxzZSB7CisgICAgLy8gV2UgY2FuIGZpbmlzaCB0aGUgbGVmdC1vdmVyIGxpbmUgZnJvbSBwcmV2aW91cyBjYWxsLgorICAgIHVwc2FtcGxlKHAtPnRtcF95LCBjdXJfeSwgdG9wX3UsIHRvcF92LCBjdXJfdSwgY3VyX3YsCisgICAgICAgICAgICAgZHN0IC0gYnVmLT5zdHJpZGUsIGRzdCwgbWJfdyk7CisgICAgKytudW1fbGluZXNfb3V0OworICB9CisgIC8vIExvb3Agb3ZlciBlYWNoIG91dHB1dCBwYWlycyBvZiByb3cuCisgIGZvciAoOyB5ICsgMiA8IHlfZW5kOyB5ICs9IDIpIHsKKyAgICB0b3BfdSA9IGN1cl91OworICAgIHRvcF92ID0gY3VyX3Y7CisgICAgY3VyX3UgKz0gaW8tPnV2X3N0cmlkZTsKKyAgICBjdXJfdiArPSBpby0+dXZfc3RyaWRlOworICAgIGRzdCArPSAyICogYnVmLT5zdHJpZGU7CisgICAgY3VyX3kgKz0gMiAqIGlvLT55X3N0cmlkZTsKKyAgICB1cHNhbXBsZShjdXJfeSAtIGlvLT55X3N0cmlkZSwgY3VyX3ksCisgICAgICAgICAgICAgdG9wX3UsIHRvcF92LCBjdXJfdSwgY3VyX3YsCisgICAgICAgICAgICAgZHN0IC0gYnVmLT5zdHJpZGUsIGRzdCwgbWJfdyk7CisgIH0KKyAgLy8gbW92ZSB0byBsYXN0IHJvdworICBjdXJfeSArPSBpby0+eV9zdHJpZGU7CisgIGlmIChpby0+Y3JvcF90b3AgKyB5X2VuZCA8IGlvLT5jcm9wX2JvdHRvbSkgeworICAgIC8vIFNhdmUgdGhlIHVuZmluaXNoZWQgc2FtcGxlcyBmb3IgbmV4dCBjYWxsIChhcyB3ZSdyZSBub3QgZG9uZSB5ZXQpLgorICAgIG1lbWNweShwLT50bXBfeSwgY3VyX3ksIG1iX3cgKiBzaXplb2YoKnAtPnRtcF95KSk7CisgICAgbWVtY3B5KHAtPnRtcF91LCBjdXJfdSwgdXZfdyAqIHNpemVvZigqcC0+dG1wX3UpKTsKKyAgICBtZW1jcHkocC0+dG1wX3YsIGN1cl92LCB1dl93ICogc2l6ZW9mKCpwLT50bXBfdikpOworICAgIC8vIFRoZSBmYW5jeSB1cHNhbXBsZXIgbGVhdmVzIGEgcm93IHVuZmluaXNoZWQgYmVoaW5kCisgICAgLy8gKGV4Y2VwdCBmb3IgdGhlIHZlcnkgbGFzdCByb3cpCisgICAgbnVtX2xpbmVzX291dC0tOworICB9IGVsc2UgeworICAgIC8vIFByb2Nlc3MgdGhlIHZlcnkgbGFzdCByb3cgb2YgZXZlbi1zaXplZCBwaWN0dXJlCisgICAgaWYgKCEoeV9lbmQgJiAxKSkgeworICAgICAgdXBzYW1wbGUoY3VyX3ksIE5VTEwsIGN1cl91LCBjdXJfdiwgY3VyX3UsIGN1cl92LAorICAgICAgICAgICAgICAgZHN0ICsgYnVmLT5zdHJpZGUsIE5VTEwsIG1iX3cpOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2xpbmVzX291dDsKK30KKworI2VuZGlmICAgIC8qIEZBTkNZX1VQU0FNUExJTkcgKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgRmlsbEFscGhhUGxhbmUodWludDhfdCogZHN0LCBpbnQgdywgaW50IGgsIGludCBzdHJpZGUpIHsKKyAgaW50IGo7CisgIGZvciAoaiA9IDA7IGogPCBoOyArK2opIHsKKyAgICBtZW1zZXQoZHN0LCAweGZmLCB3ICogc2l6ZW9mKCpkc3QpKTsKKyAgICBkc3QgKz0gc3RyaWRlOworICB9Cit9CisKK3N0YXRpYyBpbnQgRW1pdEFscGhhWVVWKGNvbnN0IFZQOElvKiBjb25zdCBpbywgV2ViUERlY1BhcmFtcyogY29uc3QgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBleHBlY3RlZF9udW1fbGluZXNfb3V0KSB7CisgIGNvbnN0IHVpbnQ4X3QqIGFscGhhID0gaW8tPmE7CisgIGNvbnN0IFdlYlBZVVZBQnVmZmVyKiBjb25zdCBidWYgPSAmcC0+b3V0cHV0LT51LllVVkE7CisgIGNvbnN0IGludCBtYl93ID0gaW8tPm1iX3c7CisgIGNvbnN0IGludCBtYl9oID0gaW8tPm1iX2g7CisgIHVpbnQ4X3QqIGRzdCA9IGJ1Zi0+YSArIGlvLT5tYl95ICogYnVmLT5hX3N0cmlkZTsKKyAgaW50IGo7CisgICh2b2lkKWV4cGVjdGVkX251bV9saW5lc19vdXQ7CisgIGFzc2VydChleHBlY3RlZF9udW1fbGluZXNfb3V0ID09IG1iX2gpOworICBpZiAoYWxwaGEgIT0gTlVMTCkgeworICAgIGZvciAoaiA9IDA7IGogPCBtYl9oOyArK2opIHsKKyAgICAgIG1lbWNweShkc3QsIGFscGhhLCBtYl93ICogc2l6ZW9mKCpkc3QpKTsKKyAgICAgIGFscGhhICs9IGlvLT53aWR0aDsKKyAgICAgIGRzdCArPSBidWYtPmFfc3RyaWRlOworICAgIH0KKyAgfSBlbHNlIGlmIChidWYtPmEgIT0gTlVMTCkgeworICAgIC8vIHRoZSB1c2VyIHJlcXVlc3RlZCBhbHBoYSwgYnV0IHRoZXJlIGlzIG5vbmUsIHNldCBpdCB0byBvcGFxdWUuCisgICAgRmlsbEFscGhhUGxhbmUoZHN0LCBtYl93LCBtYl9oLCBidWYtPmFfc3RyaWRlKTsKKyAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBHZXRBbHBoYVNvdXJjZVJvdyhjb25zdCBWUDhJbyogY29uc3QgaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqKiBhbHBoYSwgaW50KiBjb25zdCBudW1fcm93cykgeworICBpbnQgc3RhcnRfeSA9IGlvLT5tYl95OworICAqbnVtX3Jvd3MgPSBpby0+bWJfaDsKKworICAvLyBDb21wZW5zYXRlIGZvciB0aGUgMS1saW5lIGRlbGF5IG9mIHRoZSBmYW5jeSB1cHNjYWxlci4KKyAgLy8gVGhpcyBpcyBzaW1pbGFyIHRvIEVtaXRGYW5jeVJHQigpLgorICBpZiAoaW8tPmZhbmN5X3Vwc2FtcGxpbmcpIHsKKyAgICBpZiAoc3RhcnRfeSA9PSAwKSB7CisgICAgICAvLyBXZSBkb24ndCBwcm9jZXNzIHRoZSBsYXN0IHJvdyB5ZXQuIEl0J2xsIGJlIGRvbmUgZHVyaW5nIHRoZSBuZXh0IGNhbGwuCisgICAgICAtLSpudW1fcm93czsKKyAgICB9IGVsc2UgeworICAgICAgLS1zdGFydF95OworICAgICAgLy8gRm9ydHVuYXRlbHksICphbHBoYSBkYXRhIGlzIHBlcnNpc3RlbnQsIHNvIHdlIGNhbiBnbyBiYWNrCisgICAgICAvLyBvbmUgcm93IGFuZCBmaW5pc2ggYWxwaGEgYmxlbmRpbmcsIG5vdyB0aGF0IHRoZSBmYW5jeSB1cHNjYWxlcgorICAgICAgLy8gY29tcGxldGVkIHRoZSBZVVYtPlJHQiBpbnRlcnBvbGF0aW9uLgorICAgICAgKmFscGhhIC09IGlvLT53aWR0aDsKKyAgICB9CisgICAgaWYgKGlvLT5jcm9wX3RvcCArIGlvLT5tYl95ICsgaW8tPm1iX2ggPT0gaW8tPmNyb3BfYm90dG9tKSB7CisgICAgICAvLyBJZiBpdCdzIHRoZSB2ZXJ5IGxhc3QgY2FsbCwgd2UgcHJvY2VzcyBhbGwgdGhlIHJlbWFpbmluZyByb3dzIQorICAgICAgKm51bV9yb3dzID0gaW8tPmNyb3BfYm90dG9tIC0gaW8tPmNyb3BfdG9wIC0gc3RhcnRfeTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHN0YXJ0X3k7Cit9CisKK3N0YXRpYyBpbnQgRW1pdEFscGhhUkdCKGNvbnN0IFZQOElvKiBjb25zdCBpbywgV2ViUERlY1BhcmFtcyogY29uc3QgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBleHBlY3RlZF9udW1fbGluZXNfb3V0KSB7CisgIGNvbnN0IHVpbnQ4X3QqIGFscGhhID0gaW8tPmE7CisgIGlmIChhbHBoYSAhPSBOVUxMKSB7CisgICAgY29uc3QgaW50IG1iX3cgPSBpby0+bWJfdzsKKyAgICBjb25zdCBXRUJQX0NTUF9NT0RFIGNvbG9yc3BhY2UgPSBwLT5vdXRwdXQtPmNvbG9yc3BhY2U7CisgICAgY29uc3QgaW50IGFscGhhX2ZpcnN0ID0KKyAgICAgICAgKGNvbG9yc3BhY2UgPT0gTU9ERV9BUkdCIHx8IGNvbG9yc3BhY2UgPT0gTU9ERV9BcmdiKTsKKyAgICBjb25zdCBXZWJQUkdCQUJ1ZmZlciogY29uc3QgYnVmID0gJnAtPm91dHB1dC0+dS5SR0JBOworICAgIGludCBudW1fcm93czsKKyAgICBjb25zdCBpbnQgc3RhcnRfeSA9IEdldEFscGhhU291cmNlUm93KGlvLCAmYWxwaGEsICZudW1fcm93cyk7CisgICAgdWludDhfdCogY29uc3QgYmFzZV9yZ2JhID0gYnVmLT5yZ2JhICsgc3RhcnRfeSAqIGJ1Zi0+c3RyaWRlOworICAgIHVpbnQ4X3QqIGNvbnN0IGRzdCA9IGJhc2VfcmdiYSArIChhbHBoYV9maXJzdCA/IDAgOiAzKTsKKyAgICBjb25zdCBpbnQgaGFzX2FscGhhID0gV2ViUERpc3BhdGNoQWxwaGEoYWxwaGEsIGlvLT53aWR0aCwgbWJfdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3Jvd3MsIGRzdCwgYnVmLT5zdHJpZGUpOworICAgICh2b2lkKWV4cGVjdGVkX251bV9saW5lc19vdXQ7CisgICAgYXNzZXJ0KGV4cGVjdGVkX251bV9saW5lc19vdXQgPT0gbnVtX3Jvd3MpOworICAgIC8vIGhhc19hbHBoYSBpcyB0cnVlIGlmIHRoZXJlJ3Mgbm9uLXRyaXZpYWwgYWxwaGEgdG8gcHJlbXVsdGlwbHkgd2l0aC4KKyAgICBpZiAoaGFzX2FscGhhICYmIFdlYlBJc1ByZW11bHRpcGxpZWRNb2RlKGNvbG9yc3BhY2UpKSB7CisgICAgICBXZWJQQXBwbHlBbHBoYU11bHRpcGx5KGJhc2VfcmdiYSwgYWxwaGFfZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1iX3csIG51bV9yb3dzLCBidWYtPnN0cmlkZSk7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IEVtaXRBbHBoYVJHQkE0NDQ0KGNvbnN0IFZQOElvKiBjb25zdCBpbywgV2ViUERlY1BhcmFtcyogY29uc3QgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4cGVjdGVkX251bV9saW5lc19vdXQpIHsKKyAgY29uc3QgdWludDhfdCogYWxwaGEgPSBpby0+YTsKKyAgaWYgKGFscGhhICE9IE5VTEwpIHsKKyAgICBjb25zdCBpbnQgbWJfdyA9IGlvLT5tYl93OworICAgIGNvbnN0IFdFQlBfQ1NQX01PREUgY29sb3JzcGFjZSA9IHAtPm91dHB1dC0+Y29sb3JzcGFjZTsKKyAgICBjb25zdCBXZWJQUkdCQUJ1ZmZlciogY29uc3QgYnVmID0gJnAtPm91dHB1dC0+dS5SR0JBOworICAgIGludCBudW1fcm93czsKKyAgICBjb25zdCBpbnQgc3RhcnRfeSA9IEdldEFscGhhU291cmNlUm93KGlvLCAmYWxwaGEsICZudW1fcm93cyk7CisgICAgdWludDhfdCogY29uc3QgYmFzZV9yZ2JhID0gYnVmLT5yZ2JhICsgc3RhcnRfeSAqIGJ1Zi0+c3RyaWRlOworI2lmIChXRUJQX1NXQVBfMTZCSVRfQ1NQID09IDEpCisgICAgdWludDhfdCogYWxwaGFfZHN0ID0gYmFzZV9yZ2JhOworI2Vsc2UKKyAgICB1aW50OF90KiBhbHBoYV9kc3QgPSBiYXNlX3JnYmEgKyAxOworI2VuZGlmCisgICAgdWludDMyX3QgYWxwaGFfbWFzayA9IDB4MGY7CisgICAgaW50IGksIGo7CisgICAgZm9yIChqID0gMDsgaiA8IG51bV9yb3dzOyArK2opIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBtYl93OyArK2kpIHsKKyAgICAgICAgLy8gRmlsbCBpbiB0aGUgYWxwaGEgdmFsdWUgKGNvbnZlcnRlZCB0byA0IGJpdHMpLgorICAgICAgICBjb25zdCB1aW50MzJfdCBhbHBoYV92YWx1ZSA9IGFscGhhW2ldID4+IDQ7CisgICAgICAgIGFscGhhX2RzdFsyICogaV0gPSAoYWxwaGFfZHN0WzIgKiBpXSAmIDB4ZjApIHwgYWxwaGFfdmFsdWU7CisgICAgICAgIGFscGhhX21hc2sgJj0gYWxwaGFfdmFsdWU7CisgICAgICB9CisgICAgICBhbHBoYSArPSBpby0+d2lkdGg7CisgICAgICBhbHBoYV9kc3QgKz0gYnVmLT5zdHJpZGU7CisgICAgfQorICAgICh2b2lkKWV4cGVjdGVkX251bV9saW5lc19vdXQ7CisgICAgYXNzZXJ0KGV4cGVjdGVkX251bV9saW5lc19vdXQgPT0gbnVtX3Jvd3MpOworICAgIGlmIChhbHBoYV9tYXNrICE9IDB4MGYgJiYgV2ViUElzUHJlbXVsdGlwbGllZE1vZGUoY29sb3JzcGFjZSkpIHsKKyAgICAgIFdlYlBBcHBseUFscGhhTXVsdGlwbHk0NDQ0KGJhc2VfcmdiYSwgbWJfdywgbnVtX3Jvd3MsIGJ1Zi0+c3RyaWRlKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBZVVYgcmVzY2FsaW5nIChubyBmaW5hbCBSR0IgY29udmVyc2lvbiBuZWVkZWQpCisKKyNpZiAhZGVmaW5lZChXRUJQX1JFRFVDRV9TSVpFKQorc3RhdGljIGludCBSZXNjYWxlKGNvbnN0IHVpbnQ4X3QqIHNyYywgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgaW50IG5ld19saW5lcywgV2ViUFJlc2NhbGVyKiBjb25zdCB3cmspIHsKKyAgaW50IG51bV9saW5lc19vdXQgPSAwOworICB3aGlsZSAobmV3X2xpbmVzID4gMCkgeyAgICAvLyBpbXBvcnQgbmV3IGNvbnRyaWJ1dGlvbnMgb2Ygc291cmNlIHJvd3MuCisgICAgY29uc3QgaW50IGxpbmVzX2luID0gV2ViUFJlc2NhbGVySW1wb3J0KHdyaywgbmV3X2xpbmVzLCBzcmMsIHNyY19zdHJpZGUpOworICAgIHNyYyArPSBsaW5lc19pbiAqIHNyY19zdHJpZGU7CisgICAgbmV3X2xpbmVzIC09IGxpbmVzX2luOworICAgIG51bV9saW5lc19vdXQgKz0gV2ViUFJlc2NhbGVyRXhwb3J0KHdyayk7ICAgIC8vIGVtaXQgb3V0cHV0IHJvdyhzKQorICB9CisgIHJldHVybiBudW1fbGluZXNfb3V0OworfQorCitzdGF0aWMgaW50IEVtaXRSZXNjYWxlZFlVVihjb25zdCBWUDhJbyogY29uc3QgaW8sIFdlYlBEZWNQYXJhbXMqIGNvbnN0IHApIHsKKyAgY29uc3QgaW50IG1iX2ggPSBpby0+bWJfaDsKKyAgY29uc3QgaW50IHV2X21iX2ggPSAobWJfaCArIDEpID4+IDE7CisgIFdlYlBSZXNjYWxlciogY29uc3Qgc2NhbGVyID0gcC0+c2NhbGVyX3k7CisgIGludCBudW1fbGluZXNfb3V0ID0gMDsKKyAgaWYgKFdlYlBJc0FscGhhTW9kZShwLT5vdXRwdXQtPmNvbG9yc3BhY2UpICYmIGlvLT5hICE9IE5VTEwpIHsKKyAgICAvLyBCZWZvcmUgcmVzY2FsaW5nLCB3ZSBwcmVtdWx0aXBseSB0aGUgbHVtYSBkaXJlY3RseSBpbnRvIHRoZSBpby0+eQorICAgIC8vIGludGVybmFsIGJ1ZmZlci4gVGhpcyBpcyBPSyBzaW5jZSB0aGVzZSBzYW1wbGVzIGFyZSBub3QgdXNlZCBmb3IKKyAgICAvLyBpbnRyYS1wcmVkaWN0aW9uICh0aGUgdG9wIHNhbXBsZXMgYXJlIHNhdmVkIGluIGNhY2hlX3lfL3VfL3ZfKS4KKyAgICAvLyBCdXQgd2UgbmVlZCB0byBjYXN0IHRoZSBjb25zdCBhd2F5LCB0aG91Z2guCisgICAgV2ViUE11bHRSb3dzKCh1aW50OF90Kilpby0+eSwgaW8tPnlfc3RyaWRlLAorICAgICAgICAgICAgICAgICBpby0+YSwgaW8tPndpZHRoLCBpby0+bWJfdywgbWJfaCwgMCk7CisgIH0KKyAgbnVtX2xpbmVzX291dCA9IFJlc2NhbGUoaW8tPnksIGlvLT55X3N0cmlkZSwgbWJfaCwgc2NhbGVyKTsKKyAgUmVzY2FsZShpby0+dSwgaW8tPnV2X3N0cmlkZSwgdXZfbWJfaCwgcC0+c2NhbGVyX3UpOworICBSZXNjYWxlKGlvLT52LCBpby0+dXZfc3RyaWRlLCB1dl9tYl9oLCBwLT5zY2FsZXJfdik7CisgIHJldHVybiBudW1fbGluZXNfb3V0OworfQorCitzdGF0aWMgaW50IEVtaXRSZXNjYWxlZEFscGhhWVVWKGNvbnN0IFZQOElvKiBjb25zdCBpbywgV2ViUERlY1BhcmFtcyogY29uc3QgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4cGVjdGVkX251bV9saW5lc19vdXQpIHsKKyAgY29uc3QgV2ViUFlVVkFCdWZmZXIqIGNvbnN0IGJ1ZiA9ICZwLT5vdXRwdXQtPnUuWVVWQTsKKyAgdWludDhfdCogY29uc3QgZHN0X2EgPSBidWYtPmEgKyBwLT5sYXN0X3kgKiBidWYtPmFfc3RyaWRlOworICBpZiAoaW8tPmEgIT0gTlVMTCkgeworICAgIHVpbnQ4X3QqIGNvbnN0IGRzdF95ID0gYnVmLT55ICsgcC0+bGFzdF95ICogYnVmLT55X3N0cmlkZTsKKyAgICBjb25zdCBpbnQgbnVtX2xpbmVzX291dCA9IFJlc2NhbGUoaW8tPmEsIGlvLT53aWR0aCwgaW8tPm1iX2gsIHAtPnNjYWxlcl9hKTsKKyAgICBhc3NlcnQoZXhwZWN0ZWRfbnVtX2xpbmVzX291dCA9PSBudW1fbGluZXNfb3V0KTsKKyAgICBpZiAobnVtX2xpbmVzX291dCA+IDApIHsgICAvLyB1bm11bHRpcGx5IHRoZSBZCisgICAgICBXZWJQTXVsdFJvd3MoZHN0X3ksIGJ1Zi0+eV9zdHJpZGUsIGRzdF9hLCBidWYtPmFfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgIHAtPnNjYWxlcl9hLT5kc3Rfd2lkdGgsIG51bV9saW5lc19vdXQsIDEpOworICAgIH0KKyAgfSBlbHNlIGlmIChidWYtPmEgIT0gTlVMTCkgeworICAgIC8vIHRoZSB1c2VyIHJlcXVlc3RlZCBhbHBoYSwgYnV0IHRoZXJlIGlzIG5vbmUsIHNldCBpdCB0byBvcGFxdWUuCisgICAgYXNzZXJ0KHAtPmxhc3RfeSArIGV4cGVjdGVkX251bV9saW5lc19vdXQgPD0gaW8tPnNjYWxlZF9oZWlnaHQpOworICAgIEZpbGxBbHBoYVBsYW5lKGRzdF9hLCBpby0+c2NhbGVkX3dpZHRoLCBleHBlY3RlZF9udW1fbGluZXNfb3V0LAorICAgICAgICAgICAgICAgICAgIGJ1Zi0+YV9zdHJpZGUpOworICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IEluaXRZVVZSZXNjYWxlcihjb25zdCBWUDhJbyogY29uc3QgaW8sIFdlYlBEZWNQYXJhbXMqIGNvbnN0IHApIHsKKyAgY29uc3QgaW50IGhhc19hbHBoYSA9IFdlYlBJc0FscGhhTW9kZShwLT5vdXRwdXQtPmNvbG9yc3BhY2UpOworICBjb25zdCBXZWJQWVVWQUJ1ZmZlciogY29uc3QgYnVmID0gJnAtPm91dHB1dC0+dS5ZVVZBOworICBjb25zdCBpbnQgb3V0X3dpZHRoICA9IGlvLT5zY2FsZWRfd2lkdGg7CisgIGNvbnN0IGludCBvdXRfaGVpZ2h0ID0gaW8tPnNjYWxlZF9oZWlnaHQ7CisgIGNvbnN0IGludCB1dl9vdXRfd2lkdGggID0gKG91dF93aWR0aCArIDEpID4+IDE7CisgIGNvbnN0IGludCB1dl9vdXRfaGVpZ2h0ID0gKG91dF9oZWlnaHQgKyAxKSA+PiAxOworICBjb25zdCBpbnQgdXZfaW5fd2lkdGggID0gKGlvLT5tYl93ICsgMSkgPj4gMTsKKyAgY29uc3QgaW50IHV2X2luX2hlaWdodCA9IChpby0+bWJfaCArIDEpID4+IDE7CisgIGNvbnN0IHNpemVfdCB3b3JrX3NpemUgPSAyICogb3V0X3dpZHRoOyAgIC8vIHNjcmF0Y2ggbWVtb3J5IGZvciBsdW1hIHJlc2NhbGVyCisgIGNvbnN0IHNpemVfdCB1dl93b3JrX3NpemUgPSAyICogdXZfb3V0X3dpZHRoOyAgLy8gYW5kIGZvciBlYWNoIHUvdiBvbmVzCisgIHNpemVfdCB0bXBfc2l6ZSwgcmVzY2FsZXJfc2l6ZTsKKyAgcmVzY2FsZXJfdCogd29yazsKKyAgV2ViUFJlc2NhbGVyKiBzY2FsZXJzOworICBjb25zdCBpbnQgbnVtX3Jlc2NhbGVycyA9IGhhc19hbHBoYSA/IDQgOiAzOworCisgIHRtcF9zaXplID0gKHdvcmtfc2l6ZSArIDIgKiB1dl93b3JrX3NpemUpICogc2l6ZW9mKCp3b3JrKTsKKyAgaWYgKGhhc19hbHBoYSkgeworICAgIHRtcF9zaXplICs9IHdvcmtfc2l6ZSAqIHNpemVvZigqd29yayk7CisgIH0KKyAgcmVzY2FsZXJfc2l6ZSA9IG51bV9yZXNjYWxlcnMgKiBzaXplb2YoKnAtPnNjYWxlcl95KSArIFdFQlBfQUxJR05fQ1NUOworCisgIHAtPm1lbW9yeSA9IFdlYlBTYWZlTWFsbG9jKDFVTEwsIHRtcF9zaXplICsgcmVzY2FsZXJfc2l6ZSk7CisgIGlmIChwLT5tZW1vcnkgPT0gTlVMTCkgeworICAgIHJldHVybiAwOyAgIC8vIG1lbW9yeSBlcnJvcgorICB9CisgIHdvcmsgPSAocmVzY2FsZXJfdCopcC0+bWVtb3J5OworCisgIHNjYWxlcnMgPSAoV2ViUFJlc2NhbGVyKilXRUJQX0FMSUdOKChjb25zdCB1aW50OF90Kil3b3JrICsgdG1wX3NpemUpOworICBwLT5zY2FsZXJfeSA9ICZzY2FsZXJzWzBdOworICBwLT5zY2FsZXJfdSA9ICZzY2FsZXJzWzFdOworICBwLT5zY2FsZXJfdiA9ICZzY2FsZXJzWzJdOworICBwLT5zY2FsZXJfYSA9IGhhc19hbHBoYSA/ICZzY2FsZXJzWzNdIDogTlVMTDsKKworICBXZWJQUmVzY2FsZXJJbml0KHAtPnNjYWxlcl95LCBpby0+bWJfdywgaW8tPm1iX2gsCisgICAgICAgICAgICAgICAgICAgYnVmLT55LCBvdXRfd2lkdGgsIG91dF9oZWlnaHQsIGJ1Zi0+eV9zdHJpZGUsIDEsCisgICAgICAgICAgICAgICAgICAgd29yayk7CisgIFdlYlBSZXNjYWxlckluaXQocC0+c2NhbGVyX3UsIHV2X2luX3dpZHRoLCB1dl9pbl9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgYnVmLT51LCB1dl9vdXRfd2lkdGgsIHV2X291dF9oZWlnaHQsIGJ1Zi0+dV9zdHJpZGUsIDEsCisgICAgICAgICAgICAgICAgICAgd29yayArIHdvcmtfc2l6ZSk7CisgIFdlYlBSZXNjYWxlckluaXQocC0+c2NhbGVyX3YsIHV2X2luX3dpZHRoLCB1dl9pbl9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgYnVmLT52LCB1dl9vdXRfd2lkdGgsIHV2X291dF9oZWlnaHQsIGJ1Zi0+dl9zdHJpZGUsIDEsCisgICAgICAgICAgICAgICAgICAgd29yayArIHdvcmtfc2l6ZSArIHV2X3dvcmtfc2l6ZSk7CisgIHAtPmVtaXQgPSBFbWl0UmVzY2FsZWRZVVY7CisKKyAgaWYgKGhhc19hbHBoYSkgeworICAgIFdlYlBSZXNjYWxlckluaXQocC0+c2NhbGVyX2EsIGlvLT5tYl93LCBpby0+bWJfaCwKKyAgICAgICAgICAgICAgICAgICAgIGJ1Zi0+YSwgb3V0X3dpZHRoLCBvdXRfaGVpZ2h0LCBidWYtPmFfc3RyaWRlLCAxLAorICAgICAgICAgICAgICAgICAgICAgd29yayArIHdvcmtfc2l6ZSArIDIgKiB1dl93b3JrX3NpemUpOworICAgIHAtPmVtaXRfYWxwaGEgPSBFbWl0UmVzY2FsZWRBbHBoYVlVVjsKKyAgICBXZWJQSW5pdEFscGhhUHJvY2Vzc2luZygpOworICB9CisgIHJldHVybiAxOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUkdCQSByZXNjYWxpbmcKKworc3RhdGljIGludCBFeHBvcnRSR0IoV2ViUERlY1BhcmFtcyogY29uc3QgcCwgaW50IHlfcG9zKSB7CisgIGNvbnN0IFdlYlBZVVY0NDRDb252ZXJ0ZXIgY29udmVydCA9CisgICAgICBXZWJQWVVWNDQ0Q29udmVydGVyc1twLT5vdXRwdXQtPmNvbG9yc3BhY2VdOworICBjb25zdCBXZWJQUkdCQUJ1ZmZlciogY29uc3QgYnVmID0gJnAtPm91dHB1dC0+dS5SR0JBOworICB1aW50OF90KiBkc3QgPSBidWYtPnJnYmEgKyB5X3BvcyAqIGJ1Zi0+c3RyaWRlOworICBpbnQgbnVtX2xpbmVzX291dCA9IDA7CisgIC8vIEZvciBSR0IgcmVzY2FsaW5nLCBiZWNhdXNlIG9mIHRoZSBZVVY0MjAsIGN1cnJlbnQgc2NhbiBwb3NpdGlvbgorICAvLyBVL1YgY2FuIGJlICsxLy0xIGxpbmUgZnJvbSB0aGUgWSBvbmUuICBIZW5jZSB0aGUgZG91YmxlIHRlc3QuCisgIHdoaWxlIChXZWJQUmVzY2FsZXJIYXNQZW5kaW5nT3V0cHV0KHAtPnNjYWxlcl95KSAmJgorICAgICAgICAgV2ViUFJlc2NhbGVySGFzUGVuZGluZ091dHB1dChwLT5zY2FsZXJfdSkpIHsKKyAgICBhc3NlcnQoeV9wb3MgKyBudW1fbGluZXNfb3V0IDwgcC0+b3V0cHV0LT5oZWlnaHQpOworICAgIGFzc2VydChwLT5zY2FsZXJfdS0+eV9hY2N1bSA9PSBwLT5zY2FsZXJfdi0+eV9hY2N1bSk7CisgICAgV2ViUFJlc2NhbGVyRXhwb3J0Um93KHAtPnNjYWxlcl95KTsKKyAgICBXZWJQUmVzY2FsZXJFeHBvcnRSb3cocC0+c2NhbGVyX3UpOworICAgIFdlYlBSZXNjYWxlckV4cG9ydFJvdyhwLT5zY2FsZXJfdik7CisgICAgY29udmVydChwLT5zY2FsZXJfeS0+ZHN0LCBwLT5zY2FsZXJfdS0+ZHN0LCBwLT5zY2FsZXJfdi0+ZHN0LAorICAgICAgICAgICAgZHN0LCBwLT5zY2FsZXJfeS0+ZHN0X3dpZHRoKTsKKyAgICBkc3QgKz0gYnVmLT5zdHJpZGU7CisgICAgKytudW1fbGluZXNfb3V0OworICB9CisgIHJldHVybiBudW1fbGluZXNfb3V0OworfQorCitzdGF0aWMgaW50IEVtaXRSZXNjYWxlZFJHQihjb25zdCBWUDhJbyogY29uc3QgaW8sIFdlYlBEZWNQYXJhbXMqIGNvbnN0IHApIHsKKyAgY29uc3QgaW50IG1iX2ggPSBpby0+bWJfaDsKKyAgY29uc3QgaW50IHV2X21iX2ggPSAobWJfaCArIDEpID4+IDE7CisgIGludCBqID0gMCwgdXZfaiA9IDA7CisgIGludCBudW1fbGluZXNfb3V0ID0gMDsKKyAgd2hpbGUgKGogPCBtYl9oKSB7CisgICAgY29uc3QgaW50IHlfbGluZXNfaW4gPQorICAgICAgICBXZWJQUmVzY2FsZXJJbXBvcnQocC0+c2NhbGVyX3ksIG1iX2ggLSBqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW8tPnkgKyBqICogaW8tPnlfc3RyaWRlLCBpby0+eV9zdHJpZGUpOworICAgIGogKz0geV9saW5lc19pbjsKKyAgICBpZiAoV2ViUFJlc2NhbGVOZWVkZWRMaW5lcyhwLT5zY2FsZXJfdSwgdXZfbWJfaCAtIHV2X2opKSB7CisgICAgICBjb25zdCBpbnQgdV9saW5lc19pbiA9CisgICAgICAgICAgV2ViUFJlc2NhbGVySW1wb3J0KHAtPnNjYWxlcl91LCB1dl9tYl9oIC0gdXZfaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW8tPnUgKyB1dl9qICogaW8tPnV2X3N0cmlkZSwgaW8tPnV2X3N0cmlkZSk7CisgICAgICBjb25zdCBpbnQgdl9saW5lc19pbiA9CisgICAgICAgICAgV2ViUFJlc2NhbGVySW1wb3J0KHAtPnNjYWxlcl92LCB1dl9tYl9oIC0gdXZfaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW8tPnYgKyB1dl9qICogaW8tPnV2X3N0cmlkZSwgaW8tPnV2X3N0cmlkZSk7CisgICAgICAodm9pZCl2X2xpbmVzX2luOyAgIC8vIHJlbW92ZSBhIGdjYyB3YXJuaW5nCisgICAgICBhc3NlcnQodV9saW5lc19pbiA9PSB2X2xpbmVzX2luKTsKKyAgICAgIHV2X2ogKz0gdV9saW5lc19pbjsKKyAgICB9CisgICAgbnVtX2xpbmVzX291dCArPSBFeHBvcnRSR0IocCwgcC0+bGFzdF95ICsgbnVtX2xpbmVzX291dCk7CisgIH0KKyAgcmV0dXJuIG51bV9saW5lc19vdXQ7Cit9CisKK3N0YXRpYyBpbnQgRXhwb3J0QWxwaGEoV2ViUERlY1BhcmFtcyogY29uc3QgcCwgaW50IHlfcG9zLCBpbnQgbWF4X2xpbmVzX291dCkgeworICBjb25zdCBXZWJQUkdCQUJ1ZmZlciogY29uc3QgYnVmID0gJnAtPm91dHB1dC0+dS5SR0JBOworICB1aW50OF90KiBjb25zdCBiYXNlX3JnYmEgPSBidWYtPnJnYmEgKyB5X3BvcyAqIGJ1Zi0+c3RyaWRlOworICBjb25zdCBXRUJQX0NTUF9NT0RFIGNvbG9yc3BhY2UgPSBwLT5vdXRwdXQtPmNvbG9yc3BhY2U7CisgIGNvbnN0IGludCBhbHBoYV9maXJzdCA9CisgICAgICAoY29sb3JzcGFjZSA9PSBNT0RFX0FSR0IgfHwgY29sb3JzcGFjZSA9PSBNT0RFX0FyZ2IpOworICB1aW50OF90KiBkc3QgPSBiYXNlX3JnYmEgKyAoYWxwaGFfZmlyc3QgPyAwIDogMyk7CisgIGludCBudW1fbGluZXNfb3V0ID0gMDsKKyAgY29uc3QgaW50IGlzX3ByZW11bHRfYWxwaGEgPSBXZWJQSXNQcmVtdWx0aXBsaWVkTW9kZShjb2xvcnNwYWNlKTsKKyAgdWludDMyX3Qgbm9uX29wYXF1ZSA9IDA7CisgIGNvbnN0IGludCB3aWR0aCA9IHAtPnNjYWxlcl9hLT5kc3Rfd2lkdGg7CisKKyAgd2hpbGUgKFdlYlBSZXNjYWxlckhhc1BlbmRpbmdPdXRwdXQocC0+c2NhbGVyX2EpICYmCisgICAgICAgICBudW1fbGluZXNfb3V0IDwgbWF4X2xpbmVzX291dCkgeworICAgIGFzc2VydCh5X3BvcyArIG51bV9saW5lc19vdXQgPCBwLT5vdXRwdXQtPmhlaWdodCk7CisgICAgV2ViUFJlc2NhbGVyRXhwb3J0Um93KHAtPnNjYWxlcl9hKTsKKyAgICBub25fb3BhcXVlIHw9IFdlYlBEaXNwYXRjaEFscGhhKHAtPnNjYWxlcl9hLT5kc3QsIDAsIHdpZHRoLCAxLCBkc3QsIDApOworICAgIGRzdCArPSBidWYtPnN0cmlkZTsKKyAgICArK251bV9saW5lc19vdXQ7CisgIH0KKyAgaWYgKGlzX3ByZW11bHRfYWxwaGEgJiYgbm9uX29wYXF1ZSkgeworICAgIFdlYlBBcHBseUFscGhhTXVsdGlwbHkoYmFzZV9yZ2JhLCBhbHBoYV9maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBudW1fbGluZXNfb3V0LCBidWYtPnN0cmlkZSk7CisgIH0KKyAgcmV0dXJuIG51bV9saW5lc19vdXQ7Cit9CisKK3N0YXRpYyBpbnQgRXhwb3J0QWxwaGFSR0JBNDQ0NChXZWJQRGVjUGFyYW1zKiBjb25zdCBwLCBpbnQgeV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heF9saW5lc19vdXQpIHsKKyAgY29uc3QgV2ViUFJHQkFCdWZmZXIqIGNvbnN0IGJ1ZiA9ICZwLT5vdXRwdXQtPnUuUkdCQTsKKyAgdWludDhfdCogY29uc3QgYmFzZV9yZ2JhID0gYnVmLT5yZ2JhICsgeV9wb3MgKiBidWYtPnN0cmlkZTsKKyNpZiAoV0VCUF9TV0FQXzE2QklUX0NTUCA9PSAxKQorICB1aW50OF90KiBhbHBoYV9kc3QgPSBiYXNlX3JnYmE7CisjZWxzZQorICB1aW50OF90KiBhbHBoYV9kc3QgPSBiYXNlX3JnYmEgKyAxOworI2VuZGlmCisgIGludCBudW1fbGluZXNfb3V0ID0gMDsKKyAgY29uc3QgV0VCUF9DU1BfTU9ERSBjb2xvcnNwYWNlID0gcC0+b3V0cHV0LT5jb2xvcnNwYWNlOworICBjb25zdCBpbnQgd2lkdGggPSBwLT5zY2FsZXJfYS0+ZHN0X3dpZHRoOworICBjb25zdCBpbnQgaXNfcHJlbXVsdF9hbHBoYSA9IFdlYlBJc1ByZW11bHRpcGxpZWRNb2RlKGNvbG9yc3BhY2UpOworICB1aW50MzJfdCBhbHBoYV9tYXNrID0gMHgwZjsKKworICB3aGlsZSAoV2ViUFJlc2NhbGVySGFzUGVuZGluZ091dHB1dChwLT5zY2FsZXJfYSkgJiYKKyAgICAgICAgIG51bV9saW5lc19vdXQgPCBtYXhfbGluZXNfb3V0KSB7CisgICAgaW50IGk7CisgICAgYXNzZXJ0KHlfcG9zICsgbnVtX2xpbmVzX291dCA8IHAtPm91dHB1dC0+aGVpZ2h0KTsKKyAgICBXZWJQUmVzY2FsZXJFeHBvcnRSb3cocC0+c2NhbGVyX2EpOworICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgKytpKSB7CisgICAgICAvLyBGaWxsIGluIHRoZSBhbHBoYSB2YWx1ZSAoY29udmVydGVkIHRvIDQgYml0cykuCisgICAgICBjb25zdCB1aW50MzJfdCBhbHBoYV92YWx1ZSA9IHAtPnNjYWxlcl9hLT5kc3RbaV0gPj4gNDsKKyAgICAgIGFscGhhX2RzdFsyICogaV0gPSAoYWxwaGFfZHN0WzIgKiBpXSAmIDB4ZjApIHwgYWxwaGFfdmFsdWU7CisgICAgICBhbHBoYV9tYXNrICY9IGFscGhhX3ZhbHVlOworICAgIH0KKyAgICBhbHBoYV9kc3QgKz0gYnVmLT5zdHJpZGU7CisgICAgKytudW1fbGluZXNfb3V0OworICB9CisgIGlmIChpc19wcmVtdWx0X2FscGhhICYmIGFscGhhX21hc2sgIT0gMHgwZikgeworICAgIFdlYlBBcHBseUFscGhhTXVsdGlwbHk0NDQ0KGJhc2VfcmdiYSwgd2lkdGgsIG51bV9saW5lc19vdXQsIGJ1Zi0+c3RyaWRlKTsKKyAgfQorICByZXR1cm4gbnVtX2xpbmVzX291dDsKK30KKworc3RhdGljIGludCBFbWl0UmVzY2FsZWRBbHBoYVJHQihjb25zdCBWUDhJbyogY29uc3QgaW8sIFdlYlBEZWNQYXJhbXMqIGNvbnN0IHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBleHBlY3RlZF9udW1fb3V0X2xpbmVzKSB7CisgIGlmIChpby0+YSAhPSBOVUxMKSB7CisgICAgV2ViUFJlc2NhbGVyKiBjb25zdCBzY2FsZXIgPSBwLT5zY2FsZXJfYTsKKyAgICBpbnQgbGluZXNfbGVmdCA9IGV4cGVjdGVkX251bV9vdXRfbGluZXM7CisgICAgY29uc3QgaW50IHlfZW5kID0gcC0+bGFzdF95ICsgbGluZXNfbGVmdDsKKyAgICB3aGlsZSAobGluZXNfbGVmdCA+IDApIHsKKyAgICAgIGNvbnN0IGludCByb3dfb2Zmc2V0ID0gc2NhbGVyLT5zcmNfeSAtIGlvLT5tYl95OworICAgICAgV2ViUFJlc2NhbGVySW1wb3J0KHNjYWxlciwgaW8tPm1iX2ggKyBpby0+bWJfeSAtIHNjYWxlci0+c3JjX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgaW8tPmEgKyByb3dfb2Zmc2V0ICogaW8tPndpZHRoLCBpby0+d2lkdGgpOworICAgICAgbGluZXNfbGVmdCAtPSBwLT5lbWl0X2FscGhhX3JvdyhwLCB5X2VuZCAtIGxpbmVzX2xlZnQsIGxpbmVzX2xlZnQpOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBJbml0UkdCUmVzY2FsZXIoY29uc3QgVlA4SW8qIGNvbnN0IGlvLCBXZWJQRGVjUGFyYW1zKiBjb25zdCBwKSB7CisgIGNvbnN0IGludCBoYXNfYWxwaGEgPSBXZWJQSXNBbHBoYU1vZGUocC0+b3V0cHV0LT5jb2xvcnNwYWNlKTsKKyAgY29uc3QgaW50IG91dF93aWR0aCAgPSBpby0+c2NhbGVkX3dpZHRoOworICBjb25zdCBpbnQgb3V0X2hlaWdodCA9IGlvLT5zY2FsZWRfaGVpZ2h0OworICBjb25zdCBpbnQgdXZfaW5fd2lkdGggID0gKGlvLT5tYl93ICsgMSkgPj4gMTsKKyAgY29uc3QgaW50IHV2X2luX2hlaWdodCA9IChpby0+bWJfaCArIDEpID4+IDE7CisgIGNvbnN0IHNpemVfdCB3b3JrX3NpemUgPSAyICogb3V0X3dpZHRoOyAgIC8vIHNjcmF0Y2ggbWVtb3J5IGZvciBvbmUgcmVzY2FsZXIKKyAgcmVzY2FsZXJfdCogd29yazsgIC8vIHJlc2NhbGVycyB3b3JrIGFyZWEKKyAgdWludDhfdCogdG1wOyAgIC8vIHRtcCBzdG9yYWdlIGZvciBzY2FsZWQgWVVWNDQ0IHNhbXBsZXMgYmVmb3JlIFJHQiBjb252ZXJzaW9uCisgIHNpemVfdCB0bXBfc2l6ZTEsIHRtcF9zaXplMiwgdG90YWxfc2l6ZSwgcmVzY2FsZXJfc2l6ZTsKKyAgV2ViUFJlc2NhbGVyKiBzY2FsZXJzOworICBjb25zdCBpbnQgbnVtX3Jlc2NhbGVycyA9IGhhc19hbHBoYSA/IDQgOiAzOworCisgIHRtcF9zaXplMSA9IDMgKiB3b3JrX3NpemU7CisgIHRtcF9zaXplMiA9IDMgKiBvdXRfd2lkdGg7CisgIGlmIChoYXNfYWxwaGEpIHsKKyAgICB0bXBfc2l6ZTEgKz0gd29ya19zaXplOworICAgIHRtcF9zaXplMiArPSBvdXRfd2lkdGg7CisgIH0KKyAgdG90YWxfc2l6ZSA9IHRtcF9zaXplMSAqIHNpemVvZigqd29yaykgKyB0bXBfc2l6ZTIgKiBzaXplb2YoKnRtcCk7CisgIHJlc2NhbGVyX3NpemUgPSBudW1fcmVzY2FsZXJzICogc2l6ZW9mKCpwLT5zY2FsZXJfeSkgKyBXRUJQX0FMSUdOX0NTVDsKKworICBwLT5tZW1vcnkgPSBXZWJQU2FmZU1hbGxvYygxVUxMLCB0b3RhbF9zaXplICsgcmVzY2FsZXJfc2l6ZSk7CisgIGlmIChwLT5tZW1vcnkgPT0gTlVMTCkgeworICAgIHJldHVybiAwOyAgIC8vIG1lbW9yeSBlcnJvcgorICB9CisgIHdvcmsgPSAocmVzY2FsZXJfdCopcC0+bWVtb3J5OworICB0bXAgPSAodWludDhfdCopKHdvcmsgKyB0bXBfc2l6ZTEpOworCisgIHNjYWxlcnMgPSAoV2ViUFJlc2NhbGVyKilXRUJQX0FMSUdOKChjb25zdCB1aW50OF90Kil3b3JrICsgdG90YWxfc2l6ZSk7CisgIHAtPnNjYWxlcl95ID0gJnNjYWxlcnNbMF07CisgIHAtPnNjYWxlcl91ID0gJnNjYWxlcnNbMV07CisgIHAtPnNjYWxlcl92ID0gJnNjYWxlcnNbMl07CisgIHAtPnNjYWxlcl9hID0gaGFzX2FscGhhID8gJnNjYWxlcnNbM10gOiBOVUxMOworCisgIFdlYlBSZXNjYWxlckluaXQocC0+c2NhbGVyX3ksIGlvLT5tYl93LCBpby0+bWJfaCwKKyAgICAgICAgICAgICAgICAgICB0bXAgKyAwICogb3V0X3dpZHRoLCBvdXRfd2lkdGgsIG91dF9oZWlnaHQsIDAsIDEsCisgICAgICAgICAgICAgICAgICAgd29yayArIDAgKiB3b3JrX3NpemUpOworICBXZWJQUmVzY2FsZXJJbml0KHAtPnNjYWxlcl91LCB1dl9pbl93aWR0aCwgdXZfaW5faGVpZ2h0LAorICAgICAgICAgICAgICAgICAgIHRtcCArIDEgKiBvdXRfd2lkdGgsIG91dF93aWR0aCwgb3V0X2hlaWdodCwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICB3b3JrICsgMSAqIHdvcmtfc2l6ZSk7CisgIFdlYlBSZXNjYWxlckluaXQocC0+c2NhbGVyX3YsIHV2X2luX3dpZHRoLCB1dl9pbl9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgdG1wICsgMiAqIG91dF93aWR0aCwgb3V0X3dpZHRoLCBvdXRfaGVpZ2h0LCAwLCAxLAorICAgICAgICAgICAgICAgICAgIHdvcmsgKyAyICogd29ya19zaXplKTsKKyAgcC0+ZW1pdCA9IEVtaXRSZXNjYWxlZFJHQjsKKyAgV2ViUEluaXRZVVY0NDRDb252ZXJ0ZXJzKCk7CisKKyAgaWYgKGhhc19hbHBoYSkgeworICAgIFdlYlBSZXNjYWxlckluaXQocC0+c2NhbGVyX2EsIGlvLT5tYl93LCBpby0+bWJfaCwKKyAgICAgICAgICAgICAgICAgICAgIHRtcCArIDMgKiBvdXRfd2lkdGgsIG91dF93aWR0aCwgb3V0X2hlaWdodCwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgIHdvcmsgKyAzICogd29ya19zaXplKTsKKyAgICBwLT5lbWl0X2FscGhhID0gRW1pdFJlc2NhbGVkQWxwaGFSR0I7CisgICAgaWYgKHAtPm91dHB1dC0+Y29sb3JzcGFjZSA9PSBNT0RFX1JHQkFfNDQ0NCB8fAorICAgICAgICBwLT5vdXRwdXQtPmNvbG9yc3BhY2UgPT0gTU9ERV9yZ2JBXzQ0NDQpIHsKKyAgICAgIHAtPmVtaXRfYWxwaGFfcm93ID0gRXhwb3J0QWxwaGFSR0JBNDQ0NDsKKyAgICB9IGVsc2UgeworICAgICAgcC0+ZW1pdF9hbHBoYV9yb3cgPSBFeHBvcnRBbHBoYTsKKyAgICB9CisgICAgV2ViUEluaXRBbHBoYVByb2Nlc3NpbmcoKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworI2VuZGlmICAvLyBXRUJQX1JFRFVDRV9TSVpFCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEZWZhdWx0IGN1c3RvbSBmdW5jdGlvbnMKKworc3RhdGljIGludCBDdXN0b21TZXR1cChWUDhJbyogaW8pIHsKKyAgV2ViUERlY1BhcmFtcyogY29uc3QgcCA9IChXZWJQRGVjUGFyYW1zKilpby0+b3BhcXVlOworICBjb25zdCBXRUJQX0NTUF9NT0RFIGNvbG9yc3BhY2UgPSBwLT5vdXRwdXQtPmNvbG9yc3BhY2U7CisgIGNvbnN0IGludCBpc19yZ2IgPSBXZWJQSXNSR0JNb2RlKGNvbG9yc3BhY2UpOworICBjb25zdCBpbnQgaXNfYWxwaGEgPSBXZWJQSXNBbHBoYU1vZGUoY29sb3JzcGFjZSk7CisKKyAgcC0+bWVtb3J5ID0gTlVMTDsKKyAgcC0+ZW1pdCA9IE5VTEw7CisgIHAtPmVtaXRfYWxwaGEgPSBOVUxMOworICBwLT5lbWl0X2FscGhhX3JvdyA9IE5VTEw7CisgIGlmICghV2ViUElvSW5pdEZyb21PcHRpb25zKHAtPm9wdGlvbnMsIGlvLCBpc19hbHBoYSA/IE1PREVfWVVWIDogTU9ERV9ZVVZBKSkgeworICAgIHJldHVybiAwOworICB9CisgIGlmIChpc19hbHBoYSAmJiBXZWJQSXNQcmVtdWx0aXBsaWVkTW9kZShjb2xvcnNwYWNlKSkgeworICAgIFdlYlBJbml0VXBzYW1wbGVycygpOworICB9CisgIGlmIChpby0+dXNlX3NjYWxpbmcpIHsKKyNpZiAhZGVmaW5lZChXRUJQX1JFRFVDRV9TSVpFKQorICAgIGNvbnN0IGludCBvayA9IGlzX3JnYiA/IEluaXRSR0JSZXNjYWxlcihpbywgcCkgOiBJbml0WVVWUmVzY2FsZXIoaW8sIHApOworICAgIGlmICghb2spIHsKKyAgICAgIHJldHVybiAwOyAgICAvLyBtZW1vcnkgZXJyb3IKKyAgICB9CisjZWxzZQorICAgIHJldHVybiAwOyAgIC8vIHJlc2NhbGluZyBzdXBwb3J0IG5vdCBjb21waWxlZAorI2VuZGlmCisgIH0gZWxzZSB7CisgICAgaWYgKGlzX3JnYikgeworICAgICAgV2ViUEluaXRTYW1wbGVycygpOworICAgICAgcC0+ZW1pdCA9IEVtaXRTYW1wbGVkUkdCOyAgIC8vIGRlZmF1bHQKKyAgICAgIGlmIChpby0+ZmFuY3lfdXBzYW1wbGluZykgeworI2lmZGVmIEZBTkNZX1VQU0FNUExJTkcKKyAgICAgICAgY29uc3QgaW50IHV2X3dpZHRoID0gKGlvLT5tYl93ICsgMSkgPj4gMTsKKyAgICAgICAgcC0+bWVtb3J5ID0gV2ViUFNhZmVNYWxsb2MoMVVMTCwgKHNpemVfdCkoaW8tPm1iX3cgKyAyICogdXZfd2lkdGgpKTsKKyAgICAgICAgaWYgKHAtPm1lbW9yeSA9PSBOVUxMKSB7CisgICAgICAgICAgcmV0dXJuIDA7ICAgLy8gbWVtb3J5IGVycm9yLgorICAgICAgICB9CisgICAgICAgIHAtPnRtcF95ID0gKHVpbnQ4X3QqKXAtPm1lbW9yeTsKKyAgICAgICAgcC0+dG1wX3UgPSBwLT50bXBfeSArIGlvLT5tYl93OworICAgICAgICBwLT50bXBfdiA9IHAtPnRtcF91ICsgdXZfd2lkdGg7CisgICAgICAgIHAtPmVtaXQgPSBFbWl0RmFuY3lSR0I7CisgICAgICAgIFdlYlBJbml0VXBzYW1wbGVycygpOworI2VuZGlmCisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHAtPmVtaXQgPSBFbWl0WVVWOworICAgIH0KKyAgICBpZiAoaXNfYWxwaGEpIHsgIC8vIG5lZWQgdHJhbnNwYXJlbmN5IG91dHB1dAorICAgICAgcC0+ZW1pdF9hbHBoYSA9CisgICAgICAgICAgKGNvbG9yc3BhY2UgPT0gTU9ERV9SR0JBXzQ0NDQgfHwgY29sb3JzcGFjZSA9PSBNT0RFX3JnYkFfNDQ0NCkgPworICAgICAgICAgICAgICBFbWl0QWxwaGFSR0JBNDQ0NAorICAgICAgICAgIDogaXNfcmdiID8gRW1pdEFscGhhUkdCCisgICAgICAgICAgOiBFbWl0QWxwaGFZVVY7CisgICAgICBpZiAoaXNfcmdiKSB7CisgICAgICAgIFdlYlBJbml0QWxwaGFQcm9jZXNzaW5nKCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIDE7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBpbnQgQ3VzdG9tUHV0KGNvbnN0IFZQOElvKiBpbykgeworICBXZWJQRGVjUGFyYW1zKiBjb25zdCBwID0gKFdlYlBEZWNQYXJhbXMqKWlvLT5vcGFxdWU7CisgIGNvbnN0IGludCBtYl93ID0gaW8tPm1iX3c7CisgIGNvbnN0IGludCBtYl9oID0gaW8tPm1iX2g7CisgIGludCBudW1fbGluZXNfb3V0OworICBhc3NlcnQoIShpby0+bWJfeSAmIDEpKTsKKworICBpZiAobWJfdyA8PSAwIHx8IG1iX2ggPD0gMCkgeworICAgIHJldHVybiAwOworICB9CisgIG51bV9saW5lc19vdXQgPSBwLT5lbWl0KGlvLCBwKTsKKyAgaWYgKHAtPmVtaXRfYWxwaGEgIT0gTlVMTCkgeworICAgIHAtPmVtaXRfYWxwaGEoaW8sIHAsIG51bV9saW5lc19vdXQpOworICB9CisgIHAtPmxhc3RfeSArPSBudW1fbGluZXNfb3V0OworICByZXR1cm4gMTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgQ3VzdG9tVGVhcmRvd24oY29uc3QgVlA4SW8qIGlvKSB7CisgIFdlYlBEZWNQYXJhbXMqIGNvbnN0IHAgPSAoV2ViUERlY1BhcmFtcyopaW8tPm9wYXF1ZTsKKyAgV2ViUFNhZmVGcmVlKHAtPm1lbW9yeSk7CisgIHAtPm1lbW9yeSA9IE5VTEw7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNYWluIGVudHJ5IHBvaW50CisKK3ZvaWQgV2ViUEluaXRDdXN0b21JbyhXZWJQRGVjUGFyYW1zKiBjb25zdCBwYXJhbXMsIFZQOElvKiBjb25zdCBpbykgeworICBpby0+cHV0ICAgICAgPSBDdXN0b21QdXQ7CisgIGlvLT5zZXR1cCAgICA9IEN1c3RvbVNldHVwOworICBpby0+dGVhcmRvd24gPSBDdXN0b21UZWFyZG93bjsKKyAgaW8tPm9wYXF1ZSAgID0gcGFyYW1zOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlYy9xdWFudF9kZWMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvcXVhbnRfZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA3MjEyYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvcXVhbnRfZGVjLmMKQEAgLTAsMCArMSwxMTAgQEAKKy8vIENvcHlyaWdodCAyMDEwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBRdWFudGl6ZXIgaW5pdGlhbGl6YXRpb24KKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSAic3JjL2RlYy92cDhpX2RlYy5oIgorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IGNsaXAoaW50IHYsIGludCBNKSB7CisgIHJldHVybiB2IDwgMCA/IDAgOiB2ID4gTSA/IE0gOiB2OworfQorCisvLyBQYXJhZ3JhcGggMTQuMQorc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0RjVGFibGVbMTI4XSA9IHsKKyAgNCwgICAgIDUsICAgNiwgICA3LCAgIDgsICAgOSwgIDEwLCAgMTAsCisgIDExLCAgIDEyLCAgMTMsICAxNCwgIDE1LCAgMTYsICAxNywgIDE3LAorICAxOCwgICAxOSwgIDIwLCAgMjAsICAyMSwgIDIxLCAgMjIsICAyMiwKKyAgMjMsICAgMjMsICAyNCwgIDI1LCAgMjUsICAyNiwgIDI3LCAgMjgsCisgIDI5LCAgIDMwLCAgMzEsICAzMiwgIDMzLCAgMzQsICAzNSwgIDM2LAorICAzNywgICAzNywgIDM4LCAgMzksICA0MCwgIDQxLCAgNDIsICA0MywKKyAgNDQsICAgNDUsICA0NiwgIDQ2LCAgNDcsICA0OCwgIDQ5LCAgNTAsCisgIDUxLCAgIDUyLCAgNTMsICA1NCwgIDU1LCAgNTYsICA1NywgIDU4LAorICA1OSwgICA2MCwgIDYxLCAgNjIsICA2MywgIDY0LCAgNjUsICA2NiwKKyAgNjcsICAgNjgsICA2OSwgIDcwLCAgNzEsICA3MiwgIDczLCAgNzQsCisgIDc1LCAgIDc2LCAgNzYsICA3NywgIDc4LCAgNzksICA4MCwgIDgxLAorICA4MiwgICA4MywgIDg0LCAgODUsICA4NiwgIDg3LCAgODgsICA4OSwKKyAgOTEsICAgOTMsICA5NSwgIDk2LCAgOTgsIDEwMCwgMTAxLCAxMDIsCisgIDEwNCwgMTA2LCAxMDgsIDExMCwgMTEyLCAxMTQsIDExNiwgMTE4LAorICAxMjIsIDEyNCwgMTI2LCAxMjgsIDEzMCwgMTMyLCAxMzQsIDEzNiwKKyAgMTM4LCAxNDAsIDE0MywgMTQ1LCAxNDgsIDE1MSwgMTU0LCAxNTcKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBrQWNUYWJsZVsxMjhdID0geworICA0LCAgICAgNSwgICA2LCAgIDcsICAgOCwgICA5LCAgMTAsICAxMSwKKyAgMTIsICAgMTMsICAxNCwgIDE1LCAgMTYsICAxNywgIDE4LCAgMTksCisgIDIwLCAgIDIxLCAgMjIsICAyMywgIDI0LCAgMjUsICAyNiwgIDI3LAorICAyOCwgICAyOSwgIDMwLCAgMzEsICAzMiwgIDMzLCAgMzQsICAzNSwKKyAgMzYsICAgMzcsICAzOCwgIDM5LCAgNDAsICA0MSwgIDQyLCAgNDMsCisgIDQ0LCAgIDQ1LCAgNDYsICA0NywgIDQ4LCAgNDksICA1MCwgIDUxLAorICA1MiwgICA1MywgIDU0LCAgNTUsICA1NiwgIDU3LCAgNTgsICA2MCwKKyAgNjIsICAgNjQsICA2NiwgIDY4LCAgNzAsICA3MiwgIDc0LCAgNzYsCisgIDc4LCAgIDgwLCAgODIsICA4NCwgIDg2LCAgODgsICA5MCwgIDkyLAorICA5NCwgICA5NiwgIDk4LCAxMDAsIDEwMiwgMTA0LCAxMDYsIDEwOCwKKyAgMTEwLCAxMTIsIDExNCwgMTE2LCAxMTksIDEyMiwgMTI1LCAxMjgsCisgIDEzMSwgMTM0LCAxMzcsIDE0MCwgMTQzLCAxNDYsIDE0OSwgMTUyLAorICAxNTUsIDE1OCwgMTYxLCAxNjQsIDE2NywgMTcwLCAxNzMsIDE3NywKKyAgMTgxLCAxODUsIDE4OSwgMTkzLCAxOTcsIDIwMSwgMjA1LCAyMDksCisgIDIxMywgMjE3LCAyMjEsIDIyNSwgMjI5LCAyMzQsIDIzOSwgMjQ1LAorICAyNDksIDI1NCwgMjU5LCAyNjQsIDI2OSwgMjc0LCAyNzksIDI4NAorfTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFBhcmFncmFwaCA5LjYKKwordm9pZCBWUDhQYXJzZVF1YW50KFZQOERlY29kZXIqIGNvbnN0IGRlYykgeworICBWUDhCaXRSZWFkZXIqIGNvbnN0IGJyID0gJmRlYy0+YnJfOworICBjb25zdCBpbnQgYmFzZV9xMCA9IFZQOEdldFZhbHVlKGJyLCA3KTsKKyAgY29uc3QgaW50IGRxeTFfZGMgPSBWUDhHZXQoYnIpID8gVlA4R2V0U2lnbmVkVmFsdWUoYnIsIDQpIDogMDsKKyAgY29uc3QgaW50IGRxeTJfZGMgPSBWUDhHZXQoYnIpID8gVlA4R2V0U2lnbmVkVmFsdWUoYnIsIDQpIDogMDsKKyAgY29uc3QgaW50IGRxeTJfYWMgPSBWUDhHZXQoYnIpID8gVlA4R2V0U2lnbmVkVmFsdWUoYnIsIDQpIDogMDsKKyAgY29uc3QgaW50IGRxdXZfZGMgPSBWUDhHZXQoYnIpID8gVlA4R2V0U2lnbmVkVmFsdWUoYnIsIDQpIDogMDsKKyAgY29uc3QgaW50IGRxdXZfYWMgPSBWUDhHZXQoYnIpID8gVlA4R2V0U2lnbmVkVmFsdWUoYnIsIDQpIDogMDsKKworICBjb25zdCBWUDhTZWdtZW50SGVhZGVyKiBjb25zdCBoZHIgPSAmZGVjLT5zZWdtZW50X2hkcl87CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fTUJfU0VHTUVOVFM7ICsraSkgeworICAgIGludCBxOworICAgIGlmIChoZHItPnVzZV9zZWdtZW50XykgeworICAgICAgcSA9IGhkci0+cXVhbnRpemVyX1tpXTsKKyAgICAgIGlmICghaGRyLT5hYnNvbHV0ZV9kZWx0YV8pIHsKKyAgICAgICAgcSArPSBiYXNlX3EwOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgZGVjLT5kcW1fW2ldID0gZGVjLT5kcW1fWzBdOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHEgPSBiYXNlX3EwOworICAgICAgfQorICAgIH0KKyAgICB7CisgICAgICBWUDhRdWFudE1hdHJpeCogY29uc3QgbSA9ICZkZWMtPmRxbV9baV07CisgICAgICBtLT55MV9tYXRfWzBdID0ga0RjVGFibGVbY2xpcChxICsgZHF5MV9kYywgMTI3KV07CisgICAgICBtLT55MV9tYXRfWzFdID0ga0FjVGFibGVbY2xpcChxICsgMCwgICAgICAgMTI3KV07CisKKyAgICAgIG0tPnkyX21hdF9bMF0gPSBrRGNUYWJsZVtjbGlwKHEgKyBkcXkyX2RjLCAxMjcpXSAqIDI7CisgICAgICAvLyBGb3IgYWxsIHggaW4gWzAuLjI4NF0sIHgqMTU1LzEwMCBpcyBiaXR3aXNlIGVxdWFsIHRvICh4KjEwMTU4MSkgPj4gMTYuCisgICAgICAvLyBUaGUgc21hbGxlc3QgcHJlY2lzaW9uIGZvciB0aGF0IGlzICcoeCo2MzQ5KSA+PiAxMicgYnV0IDE2IGlzIGEgZ29vZAorICAgICAgLy8gd29yZCBzaXplLgorICAgICAgbS0+eTJfbWF0X1sxXSA9IChrQWNUYWJsZVtjbGlwKHEgKyBkcXkyX2FjLCAxMjcpXSAqIDEwMTU4MSkgPj4gMTY7CisgICAgICBpZiAobS0+eTJfbWF0X1sxXSA8IDgpIG0tPnkyX21hdF9bMV0gPSA4OworCisgICAgICBtLT51dl9tYXRfWzBdID0ga0RjVGFibGVbY2xpcChxICsgZHF1dl9kYywgMTE3KV07CisgICAgICBtLT51dl9tYXRfWzFdID0ga0FjVGFibGVbY2xpcChxICsgZHF1dl9hYywgMTI3KV07CisKKyAgICAgIG0tPnV2X3F1YW50XyA9IHEgKyBkcXV2X2FjOyAgIC8vIGZvciBkaXRoZXJpbmcgc3RyZW5ndGggZXZhbHVhdGlvbgorICAgIH0KKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL3RyZWVfZGVjLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL3RyZWVfZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJkNGRmYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvdHJlZV9kZWMuYwpAQCAtMCwwICsxLDUzNiBAQAorLy8gQ29weXJpZ2h0IDIwMTAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIENvZGluZyB0cmVlcyBhbmQgcHJvYmFzCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0cmluZ19wb2VtLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInNyYy9kZWMvdnA4aV9kZWMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvYml0X3JlYWRlcl9pbmxfdXRpbHMuaCIKKworI2lmICFkZWZpbmVkKFVTRV9HRU5FUklDX1RSRUUpCisjaWYgIWRlZmluZWQoX19hcm1fXykgJiYgIWRlZmluZWQoX01fQVJNKSAmJiAhZGVmaW5lZChfX2FhcmNoNjRfXykKKy8vIHVzaW5nIGEgdGFibGUgaXMgfjEtMiUgc2xvd2VyIG9uIEFSTS4gUHJlZmVyIHRoZSBjb2RlZC10cmVlIGFwcHJvYWNoIHRoZW4uCisjZGVmaW5lIFVTRV9HRU5FUklDX1RSRUUgMSAgIC8vIEFMVEVSTkFURV9DT0RFCisjZWxzZQorI2RlZmluZSBVU0VfR0VORVJJQ19UUkVFIDAKKyNlbmRpZgorI2VuZGlmICAvLyBVU0VfR0VORVJJQ19UUkVFCisKKyNpZiAoVVNFX0dFTkVSSUNfVFJFRSA9PSAxKQorc3RhdGljIGNvbnN0IGludDhfdCBrWU1vZGVzSW50cmE0WzE4XSA9IHsKKyAgLUJfRENfUFJFRCwgMSwKKyAgICAtQl9UTV9QUkVELCAyLAorICAgICAgLUJfVkVfUFJFRCwgMywKKyAgICAgICAgNCwgNiwKKyAgICAgICAgICAtQl9IRV9QUkVELCA1LAorICAgICAgICAgICAgLUJfUkRfUFJFRCwgLUJfVlJfUFJFRCwKKyAgICAgICAgLUJfTERfUFJFRCwgNywKKyAgICAgICAgICAtQl9WTF9QUkVELCA4LAorICAgICAgICAgICAgLUJfSERfUFJFRCwgLUJfSFVfUFJFRAorfTsKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRGVmYXVsdCBwcm9iYWJpbGl0aWVzCisKKy8vIFBhcmFncmFwaCAxMy41CitzdGF0aWMgY29uc3QgdWludDhfdAorICBDb2VmZnNQcm9iYTBbTlVNX1RZUEVTXVtOVU1fQkFORFNdW05VTV9DVFhdW05VTV9QUk9CQVNdID0geworICB7IHsgeyAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9CisgICAgfSwKKyAgICB7IHsgMjUzLCAxMzYsIDI1NCwgMjU1LCAyMjgsIDIxOSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMTg5LCAxMjksIDI0MiwgMjU1LCAyMjcsIDIxMywgMjU1LCAyMTksIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMTA2LCAxMjYsIDIyNywgMjUyLCAyMTQsIDIwOSwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfQorICAgIH0sCisgICAgeyB7IDEsIDk4LCAyNDgsIDI1NSwgMjM2LCAyMjYsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDE4MSwgMTMzLCAyMzgsIDI1NCwgMjIxLCAyMzQsIDI1NSwgMTU0LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDc4LCAxMzQsIDIwMiwgMjQ3LCAxOTgsIDE4MCwgMjU1LCAyMTksIDEyOCwgMTI4LCAxMjggfSwKKyAgICB9LAorICAgIHsgeyAxLCAxODUsIDI0OSwgMjU1LCAyNDMsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMTg0LCAxNTAsIDI0NywgMjU1LCAyMzYsIDIyNCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgNzcsIDExMCwgMjE2LCAyNTUsIDIzNiwgMjMwLCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgIH0sCisgICAgeyB7IDEsIDEwMSwgMjUxLCAyNTUsIDI0MSwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAxNzAsIDEzOSwgMjQxLCAyNTIsIDIzNiwgMjA5LCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAzNywgMTE2LCAxOTYsIDI0MywgMjI4LCAyNTUsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4IH0KKyAgICB9LAorICAgIHsgeyAxLCAyMDQsIDI1NCwgMjU1LCAyNDUsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMjA3LCAxNjAsIDI1MCwgMjU1LCAyMzgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMTAyLCAxMDMsIDIzMSwgMjU1LCAyMTEsIDE3MSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfQorICAgIH0sCisgICAgeyB7IDEsIDE1MiwgMjUyLCAyNTUsIDI0MCwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAxNzcsIDEzNSwgMjQzLCAyNTUsIDIzNCwgMjI1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyA4MCwgMTI5LCAyMTEsIDI1NSwgMTk0LCAyMjQsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0KKyAgICB9LAorICAgIHsgeyAxLCAxLCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDI0NiwgMSwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9CisgICAgfQorICB9LAorICB7IHsgeyAxOTgsIDM1LCAyMzcsIDIyMywgMTkzLCAxODcsIDE2MiwgMTYwLCAxNDUsIDE1NSwgNjIgfSwKKyAgICAgIHsgMTMxLCA0NSwgMTk4LCAyMjEsIDE3MiwgMTc2LCAyMjAsIDE1NywgMjUyLCAyMjEsIDEgfSwKKyAgICAgIHsgNjgsIDQ3LCAxNDYsIDIwOCwgMTQ5LCAxNjcsIDIyMSwgMTYyLCAyNTUsIDIyMywgMTI4IH0KKyAgICB9LAorICAgIHsgeyAxLCAxNDksIDI0MSwgMjU1LCAyMjEsIDIyNCwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMTg0LCAxNDEsIDIzNCwgMjUzLCAyMjIsIDIyMCwgMjU1LCAxOTksIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgODEsIDk5LCAxODEsIDI0MiwgMTc2LCAxOTAsIDI0OSwgMjAyLCAyNTUsIDI1NSwgMTI4IH0KKyAgICB9LAorICAgIHsgeyAxLCAxMjksIDIzMiwgMjUzLCAyMTQsIDE5NywgMjQyLCAxOTYsIDI1NSwgMjU1LCAxMjggfSwKKyAgICAgIHsgOTksIDEyMSwgMjEwLCAyNTAsIDIwMSwgMTk4LCAyNTUsIDIwMiwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAyMywgOTEsIDE2MywgMjQyLCAxNzAsIDE4NywgMjQ3LCAyMTAsIDI1NSwgMjU1LCAxMjggfQorICAgIH0sCisgICAgeyB7IDEsIDIwMCwgMjQ2LCAyNTUsIDIzNCwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAxMDksIDE3OCwgMjQxLCAyNTUsIDIzMSwgMjQ1LCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyA0NCwgMTMwLCAyMDEsIDI1MywgMjA1LCAxOTIsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4IH0KKyAgICB9LAorICAgIHsgeyAxLCAxMzIsIDIzOSwgMjUxLCAyMTksIDIwOSwgMjU1LCAxNjUsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgOTQsIDEzNiwgMjI1LCAyNTEsIDIxOCwgMTkwLCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAyMiwgMTAwLCAxNzQsIDI0NSwgMTg2LCAxNjEsIDI1NSwgMTk5LCAxMjgsIDEyOCwgMTI4IH0KKyAgICB9LAorICAgIHsgeyAxLCAxODIsIDI0OSwgMjU1LCAyMzIsIDIzNSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMTI0LCAxNDMsIDI0MSwgMjU1LCAyMjcsIDIzNCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMzUsIDc3LCAxODEsIDI1MSwgMTkzLCAyMTEsIDI1NSwgMjA1LCAxMjgsIDEyOCwgMTI4IH0KKyAgICB9LAorICAgIHsgeyAxLCAxNTcsIDI0NywgMjU1LCAyMzYsIDIzMSwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMTIxLCAxNDEsIDIzNSwgMjU1LCAyMjUsIDIyNywgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgNDUsIDk5LCAxODgsIDI1MSwgMTk1LCAyMTcsIDI1NSwgMjI0LCAxMjgsIDEyOCwgMTI4IH0KKyAgICB9LAorICAgIHsgeyAxLCAxLCAyNTEsIDI1NSwgMjEzLCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDIwMywgMSwgMjQ4LCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAxMzcsIDEsIDE3NywgMjU1LCAyMjQsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfQorICAgIH0KKyAgfSwKKyAgeyB7IHsgMjUzLCA5LCAyNDgsIDI1MSwgMjA3LCAyMDgsIDI1NSwgMTkyLCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDE3NSwgMTMsIDIyNCwgMjQzLCAxOTMsIDE4NSwgMjQ5LCAxOTgsIDI1NSwgMjU1LCAxMjggfSwKKyAgICAgIHsgNzMsIDE3LCAxNzEsIDIyMSwgMTYxLCAxNzksIDIzNiwgMTY3LCAyNTUsIDIzNCwgMTI4IH0KKyAgICB9LAorICAgIHsgeyAxLCA5NSwgMjQ3LCAyNTMsIDIxMiwgMTgzLCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAyMzksIDkwLCAyNDQsIDI1MCwgMjExLCAyMDksIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDE1NSwgNzcsIDE5NSwgMjQ4LCAxODgsIDE5NSwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfQorICAgIH0sCisgICAgeyB7IDEsIDI0LCAyMzksIDI1MSwgMjE4LCAyMTksIDI1NSwgMjA1LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDIwMSwgNTEsIDIxOSwgMjU1LCAxOTYsIDE4NiwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgNjksIDQ2LCAxOTAsIDIzOSwgMjAxLCAyMTgsIDI1NSwgMjI4LCAxMjgsIDEyOCwgMTI4IH0KKyAgICB9LAorICAgIHsgeyAxLCAxOTEsIDI1MSwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMjIzLCAxNjUsIDI0OSwgMjU1LCAyMTMsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMTQxLCAxMjQsIDI0OCwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfQorICAgIH0sCisgICAgeyB7IDEsIDE2LCAyNDgsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDE5MCwgMzYsIDIzMCwgMjU1LCAyMzYsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMTQ5LCAxLCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0KKyAgICB9LAorICAgIHsgeyAxLCAyMjYsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMjQ3LCAxOTIsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMjQwLCAxMjgsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfQorICAgIH0sCisgICAgeyB7IDEsIDEzNCwgMjUyLCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAyMTMsIDYyLCAyNTAsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDU1LCA5MywgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9CisgICAgfSwKKyAgICB7IHsgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfQorICAgIH0KKyAgfSwKKyAgeyB7IHsgMjAyLCAyNCwgMjEzLCAyMzUsIDE4NiwgMTkxLCAyMjAsIDE2MCwgMjQwLCAxNzUsIDI1NSB9LAorICAgICAgeyAxMjYsIDM4LCAxODIsIDIzMiwgMTY5LCAxODQsIDIyOCwgMTc0LCAyNTUsIDE4NywgMTI4IH0sCisgICAgICB7IDYxLCA0NiwgMTM4LCAyMTksIDE1MSwgMTc4LCAyNDAsIDE3MCwgMjU1LCAyMTYsIDEyOCB9CisgICAgfSwKKyAgICB7IHsgMSwgMTEyLCAyMzAsIDI1MCwgMTk5LCAxOTEsIDI0NywgMTU5LCAyNTUsIDI1NSwgMTI4IH0sCisgICAgICB7IDE2NiwgMTA5LCAyMjgsIDI1MiwgMjExLCAyMTUsIDI1NSwgMTc0LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDM5LCA3NywgMTYyLCAyMzIsIDE3MiwgMTgwLCAyNDUsIDE3OCwgMjU1LCAyNTUsIDEyOCB9CisgICAgfSwKKyAgICB7IHsgMSwgNTIsIDIyMCwgMjQ2LCAxOTgsIDE5OSwgMjQ5LCAyMjAsIDI1NSwgMjU1LCAxMjggfSwKKyAgICAgIHsgMTI0LCA3NCwgMTkxLCAyNDMsIDE4MywgMTkzLCAyNTAsIDIyMSwgMjU1LCAyNTUsIDEyOCB9LAorICAgICAgeyAyNCwgNzEsIDEzMCwgMjE5LCAxNTQsIDE3MCwgMjQzLCAxODIsIDI1NSwgMjU1LCAxMjggfQorICAgIH0sCisgICAgeyB7IDEsIDE4MiwgMjI1LCAyNDksIDIxOSwgMjQwLCAyNTUsIDIyNCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAxNDksIDE1MCwgMjI2LCAyNTIsIDIxNiwgMjA1LCAyNTUsIDE3MSwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAyOCwgMTA4LCAxNzAsIDI0MiwgMTgzLCAxOTQsIDI1NCwgMjIzLCAyNTUsIDI1NSwgMTI4IH0KKyAgICB9LAorICAgIHsgeyAxLCA4MSwgMjMwLCAyNTIsIDIwNCwgMjAzLCAyNTUsIDE5MiwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAxMjMsIDEwMiwgMjA5LCAyNDcsIDE4OCwgMTk2LCAyNTUsIDIzMywgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAyMCwgOTUsIDE1MywgMjQzLCAxNjQsIDE3MywgMjU1LCAyMDMsIDEyOCwgMTI4LCAxMjggfQorICAgIH0sCisgICAgeyB7IDEsIDIyMiwgMjQ4LCAyNTUsIDIxNiwgMjEzLCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAxNjgsIDE3NSwgMjQ2LCAyNTIsIDIzNSwgMjA1LCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyA0NywgMTE2LCAyMTUsIDI1NSwgMjExLCAyMTIsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4IH0KKyAgICB9LAorICAgIHsgeyAxLCAxMjEsIDIzNiwgMjUzLCAyMTIsIDIxNCwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMTQxLCA4NCwgMjEzLCAyNTIsIDIwMSwgMjAyLCAyNTUsIDIxOSwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyA0MiwgODAsIDE2MCwgMjQwLCAxNjIsIDE4NSwgMjU1LCAyMDUsIDEyOCwgMTI4LCAxMjggfQorICAgIH0sCisgICAgeyB7IDEsIDEsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMjQ0LCAxLCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDIzOCwgMSwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9CisgICAgfQorICB9Cit9OworCisvLyBQYXJhZ3JhcGggMTEuNQorc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0JNb2Rlc1Byb2JhW05VTV9CTU9ERVNdW05VTV9CTU9ERVNdW05VTV9CTU9ERVMgLSAxXSA9IHsKKyAgeyB7IDIzMSwgMTIwLCA0OCwgODksIDExNSwgMTEzLCAxMjAsIDE1MiwgMTEyIH0sCisgICAgeyAxNTIsIDE3OSwgNjQsIDEyNiwgMTcwLCAxMTgsIDQ2LCA3MCwgOTUgfSwKKyAgICB7IDE3NSwgNjksIDE0MywgODAsIDg1LCA4MiwgNzIsIDE1NSwgMTAzIH0sCisgICAgeyA1NiwgNTgsIDEwLCAxNzEsIDIxOCwgMTg5LCAxNywgMTMsIDE1MiB9LAorICAgIHsgMTE0LCAyNiwgMTcsIDE2MywgNDQsIDE5NSwgMjEsIDEwLCAxNzMgfSwKKyAgICB7IDEyMSwgMjQsIDgwLCAxOTUsIDI2LCA2MiwgNDQsIDY0LCA4NSB9LAorICAgIHsgMTQ0LCA3MSwgMTAsIDM4LCAxNzEsIDIxMywgMTQ0LCAzNCwgMjYgfSwKKyAgICB7IDE3MCwgNDYsIDU1LCAxOSwgMTM2LCAxNjAsIDMzLCAyMDYsIDcxIH0sCisgICAgeyA2MywgMjAsIDgsIDExNCwgMTE0LCAyMDgsIDEyLCA5LCAyMjYgfSwKKyAgICB7IDgxLCA0MCwgMTEsIDk2LCAxODIsIDg0LCAyOSwgMTYsIDM2IH0gfSwKKyAgeyB7IDEzNCwgMTgzLCA4OSwgMTM3LCA5OCwgMTAxLCAxMDYsIDE2NSwgMTQ4IH0sCisgICAgeyA3MiwgMTg3LCAxMDAsIDEzMCwgMTU3LCAxMTEsIDMyLCA3NSwgODAgfSwKKyAgICB7IDY2LCAxMDIsIDE2NywgOTksIDc0LCA2MiwgNDAsIDIzNCwgMTI4IH0sCisgICAgeyA0MSwgNTMsIDksIDE3OCwgMjQxLCAxNDEsIDI2LCA4LCAxMDcgfSwKKyAgICB7IDc0LCA0MywgMjYsIDE0NiwgNzMsIDE2NiwgNDksIDIzLCAxNTcgfSwKKyAgICB7IDY1LCAzOCwgMTA1LCAxNjAsIDUxLCA1MiwgMzEsIDExNSwgMTI4IH0sCisgICAgeyAxMDQsIDc5LCAxMiwgMjcsIDIxNywgMjU1LCA4NywgMTcsIDcgfSwKKyAgICB7IDg3LCA2OCwgNzEsIDQ0LCAxMTQsIDUxLCAxNSwgMTg2LCAyMyB9LAorICAgIHsgNDcsIDQxLCAxNCwgMTEwLCAxODIsIDE4MywgMjEsIDE3LCAxOTQgfSwKKyAgICB7IDY2LCA0NSwgMjUsIDEwMiwgMTk3LCAxODksIDIzLCAxOCwgMjIgfSB9LAorICB7IHsgODgsIDg4LCAxNDcsIDE1MCwgNDIsIDQ2LCA0NSwgMTk2LCAyMDUgfSwKKyAgICB7IDQzLCA5NywgMTgzLCAxMTcsIDg1LCAzOCwgMzUsIDE3OSwgNjEgfSwKKyAgICB7IDM5LCA1MywgMjAwLCA4NywgMjYsIDIxLCA0MywgMjMyLCAxNzEgfSwKKyAgICB7IDU2LCAzNCwgNTEsIDEwNCwgMTE0LCAxMDIsIDI5LCA5MywgNzcgfSwKKyAgICB7IDM5LCAyOCwgODUsIDE3MSwgNTgsIDE2NSwgOTAsIDk4LCA2NCB9LAorICAgIHsgMzQsIDIyLCAxMTYsIDIwNiwgMjMsIDM0LCA0MywgMTY2LCA3MyB9LAorICAgIHsgMTA3LCA1NCwgMzIsIDI2LCA1MSwgMSwgODEsIDQzLCAzMSB9LAorICAgIHsgNjgsIDI1LCAxMDYsIDIyLCA2NCwgMTcxLCAzNiwgMjI1LCAxMTQgfSwKKyAgICB7IDM0LCAxOSwgMjEsIDEwMiwgMTMyLCAxODgsIDE2LCA3NiwgMTI0IH0sCisgICAgeyA2MiwgMTgsIDc4LCA5NSwgODUsIDU3LCA1MCwgNDgsIDUxIH0gfSwKKyAgeyB7IDE5MywgMTAxLCAzNSwgMTU5LCAyMTUsIDExMSwgODksIDQ2LCAxMTEgfSwKKyAgICB7IDYwLCAxNDgsIDMxLCAxNzIsIDIxOSwgMjI4LCAyMSwgMTgsIDExMSB9LAorICAgIHsgMTEyLCAxMTMsIDc3LCA4NSwgMTc5LCAyNTUsIDM4LCAxMjAsIDExNCB9LAorICAgIHsgNDAsIDQyLCAxLCAxOTYsIDI0NSwgMjA5LCAxMCwgMjUsIDEwOSB9LAorICAgIHsgODgsIDQzLCAyOSwgMTQwLCAxNjYsIDIxMywgMzcsIDQzLCAxNTQgfSwKKyAgICB7IDYxLCA2MywgMzAsIDE1NSwgNjcsIDQ1LCA2OCwgMSwgMjA5IH0sCisgICAgeyAxMDAsIDgwLCA4LCA0MywgMTU0LCAxLCA1MSwgMjYsIDcxIH0sCisgICAgeyAxNDIsIDc4LCA3OCwgMTYsIDI1NSwgMTI4LCAzNCwgMTk3LCAxNzEgfSwKKyAgICB7IDQxLCA0MCwgNSwgMTAyLCAyMTEsIDE4MywgNCwgMSwgMjIxIH0sCisgICAgeyA1MSwgNTAsIDE3LCAxNjgsIDIwOSwgMTkyLCAyMywgMjUsIDgyIH0gfSwKKyAgeyB7IDEzOCwgMzEsIDM2LCAxNzEsIDI3LCAxNjYsIDM4LCA0NCwgMjI5IH0sCisgICAgeyA2NywgODcsIDU4LCAxNjksIDgyLCAxMTUsIDI2LCA1OSwgMTc5IH0sCisgICAgeyA2MywgNTksIDkwLCAxODAsIDU5LCAxNjYsIDkzLCA3MywgMTU0IH0sCisgICAgeyA0MCwgNDAsIDIxLCAxMTYsIDE0MywgMjA5LCAzNCwgMzksIDE3NSB9LAorICAgIHsgNDcsIDE1LCAxNiwgMTgzLCAzNCwgMjIzLCA0OSwgNDUsIDE4MyB9LAorICAgIHsgNDYsIDE3LCAzMywgMTgzLCA2LCA5OCwgMTUsIDMyLCAxODMgfSwKKyAgICB7IDU3LCA0NiwgMjIsIDI0LCAxMjgsIDEsIDU0LCAxNywgMzcgfSwKKyAgICB7IDY1LCAzMiwgNzMsIDExNSwgMjgsIDEyOCwgMjMsIDEyOCwgMjA1IH0sCisgICAgeyA0MCwgMywgOSwgMTE1LCA1MSwgMTkyLCAxOCwgNiwgMjIzIH0sCisgICAgeyA4NywgMzcsIDksIDExNSwgNTksIDc3LCA2NCwgMjEsIDQ3IH0gfSwKKyAgeyB7IDEwNCwgNTUsIDQ0LCAyMTgsIDksIDU0LCA1MywgMTMwLCAyMjYgfSwKKyAgICB7IDY0LCA5MCwgNzAsIDIwNSwgNDAsIDQxLCAyMywgMjYsIDU3IH0sCisgICAgeyA1NCwgNTcsIDExMiwgMTg0LCA1LCA0MSwgMzgsIDE2NiwgMjEzIH0sCisgICAgeyAzMCwgMzQsIDI2LCAxMzMsIDE1MiwgMTE2LCAxMCwgMzIsIDEzNCB9LAorICAgIHsgMzksIDE5LCA1MywgMjIxLCAyNiwgMTE0LCAzMiwgNzMsIDI1NSB9LAorICAgIHsgMzEsIDksIDY1LCAyMzQsIDIsIDE1LCAxLCAxMTgsIDczIH0sCisgICAgeyA3NSwgMzIsIDEyLCA1MSwgMTkyLCAyNTUsIDE2MCwgNDMsIDUxIH0sCisgICAgeyA4OCwgMzEsIDM1LCA2NywgMTAyLCA4NSwgNTUsIDE4NiwgODUgfSwKKyAgICB7IDU2LCAyMSwgMjMsIDExMSwgNTksIDIwNSwgNDUsIDM3LCAxOTIgfSwKKyAgICB7IDU1LCAzOCwgNzAsIDEyNCwgNzMsIDEwMiwgMSwgMzQsIDk4IH0gfSwKKyAgeyB7IDEyNSwgOTgsIDQyLCA4OCwgMTA0LCA4NSwgMTE3LCAxNzUsIDgyIH0sCisgICAgeyA5NSwgODQsIDUzLCA4OSwgMTI4LCAxMDAsIDExMywgMTAxLCA0NSB9LAorICAgIHsgNzUsIDc5LCAxMjMsIDQ3LCA1MSwgMTI4LCA4MSwgMTcxLCAxIH0sCisgICAgeyA1NywgMTcsIDUsIDcxLCAxMDIsIDU3LCA1MywgNDEsIDQ5IH0sCisgICAgeyAzOCwgMzMsIDEzLCAxMjEsIDU3LCA3MywgMjYsIDEsIDg1IH0sCisgICAgeyA0MSwgMTAsIDY3LCAxMzgsIDc3LCAxMTAsIDkwLCA0NywgMTE0IH0sCisgICAgeyAxMTUsIDIxLCAyLCAxMCwgMTAyLCAyNTUsIDE2NiwgMjMsIDYgfSwKKyAgICB7IDEwMSwgMjksIDE2LCAxMCwgODUsIDEyOCwgMTAxLCAxOTYsIDI2IH0sCisgICAgeyA1NywgMTgsIDEwLCAxMDIsIDEwMiwgMjEzLCAzNCwgMjAsIDQzIH0sCisgICAgeyAxMTcsIDIwLCAxNSwgMzYsIDE2MywgMTI4LCA2OCwgMSwgMjYgfSB9LAorICB7IHsgMTAyLCA2MSwgNzEsIDM3LCAzNCwgNTMsIDMxLCAyNDMsIDE5MiB9LAorICAgIHsgNjksIDYwLCA3MSwgMzgsIDczLCAxMTksIDI4LCAyMjIsIDM3IH0sCisgICAgeyA2OCwgNDUsIDEyOCwgMzQsIDEsIDQ3LCAxMSwgMjQ1LCAxNzEgfSwKKyAgICB7IDYyLCAxNywgMTksIDcwLCAxNDYsIDg1LCA1NSwgNjIsIDcwIH0sCisgICAgeyAzNywgNDMsIDM3LCAxNTQsIDEwMCwgMTYzLCA4NSwgMTYwLCAxIH0sCisgICAgeyA2MywgOSwgOTIsIDEzNiwgMjgsIDY0LCAzMiwgMjAxLCA4NSB9LAorICAgIHsgNzUsIDE1LCA5LCA5LCA2NCwgMjU1LCAxODQsIDExOSwgMTYgfSwKKyAgICB7IDg2LCA2LCAyOCwgNSwgNjQsIDI1NSwgMjUsIDI0OCwgMSB9LAorICAgIHsgNTYsIDgsIDE3LCAxMzIsIDEzNywgMjU1LCA1NSwgMTE2LCAxMjggfSwKKyAgICB7IDU4LCAxNSwgMjAsIDgyLCAxMzUsIDU3LCAyNiwgMTIxLCA0MCB9IH0sCisgIHsgeyAxNjQsIDUwLCAzMSwgMTM3LCAxNTQsIDEzMywgMjUsIDM1LCAyMTggfSwKKyAgICB7IDUxLCAxMDMsIDQ0LCAxMzEsIDEzMSwgMTIzLCAzMSwgNiwgMTU4IH0sCisgICAgeyA4NiwgNDAsIDY0LCAxMzUsIDE0OCwgMjI0LCA0NSwgMTgzLCAxMjggfSwKKyAgICB7IDIyLCAyNiwgMTcsIDEzMSwgMjQwLCAxNTQsIDE0LCAxLCAyMDkgfSwKKyAgICB7IDQ1LCAxNiwgMjEsIDkxLCA2NCwgMjIyLCA3LCAxLCAxOTcgfSwKKyAgICB7IDU2LCAyMSwgMzksIDE1NSwgNjAsIDEzOCwgMjMsIDEwMiwgMjEzIH0sCisgICAgeyA4MywgMTIsIDEzLCA1NCwgMTkyLCAyNTUsIDY4LCA0NywgMjggfSwKKyAgICB7IDg1LCAyNiwgODUsIDg1LCAxMjgsIDEyOCwgMzIsIDE0NiwgMTcxIH0sCisgICAgeyAxOCwgMTEsIDcsIDYzLCAxNDQsIDE3MSwgNCwgNCwgMjQ2IH0sCisgICAgeyAzNSwgMjcsIDEwLCAxNDYsIDE3NCwgMTcxLCAxMiwgMjYsIDEyOCB9IH0sCisgIHsgeyAxOTAsIDgwLCAzNSwgOTksIDE4MCwgODAsIDEyNiwgNTQsIDQ1IH0sCisgICAgeyA4NSwgMTI2LCA0NywgODcsIDE3NiwgNTEsIDQxLCAyMCwgMzIgfSwKKyAgICB7IDEwMSwgNzUsIDEyOCwgMTM5LCAxMTgsIDE0NiwgMTE2LCAxMjgsIDg1IH0sCisgICAgeyA1NiwgNDEsIDE1LCAxNzYsIDIzNiwgODUsIDM3LCA5LCA2MiB9LAorICAgIHsgNzEsIDMwLCAxNywgMTE5LCAxMTgsIDI1NSwgMTcsIDE4LCAxMzggfSwKKyAgICB7IDEwMSwgMzgsIDYwLCAxMzgsIDU1LCA3MCwgNDMsIDI2LCAxNDIgfSwKKyAgICB7IDE0NiwgMzYsIDE5LCAzMCwgMTcxLCAyNTUsIDk3LCAyNywgMjAgfSwKKyAgICB7IDEzOCwgNDUsIDYxLCA2MiwgMjE5LCAxLCA4MSwgMTg4LCA2NCB9LAorICAgIHsgMzIsIDQxLCAyMCwgMTE3LCAxNTEsIDE0MiwgMjAsIDIxLCAxNjMgfSwKKyAgICB7IDExMiwgMTksIDEyLCA2MSwgMTk1LCAxMjgsIDQ4LCA0LCAyNCB9IH0KK307CisKK3ZvaWQgVlA4UmVzZXRQcm9iYShWUDhQcm9iYSogY29uc3QgcHJvYmEpIHsKKyAgbWVtc2V0KHByb2JhLT5zZWdtZW50c18sIDI1NXUsIHNpemVvZihwcm9iYS0+c2VnbWVudHNfKSk7CisgIC8vIHByb2JhLT5iYW5kc19bXVtdIGlzIGluaXRpYWxpemVkIGxhdGVyCit9CisKK3N0YXRpYyB2b2lkIFBhcnNlSW50cmFNb2RlKFZQOEJpdFJlYWRlciogY29uc3QgYnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhEZWNvZGVyKiBjb25zdCBkZWMsIGludCBtYl94KSB7CisgIHVpbnQ4X3QqIGNvbnN0IHRvcCA9IGRlYy0+aW50cmFfdF8gKyA0ICogbWJfeDsKKyAgdWludDhfdCogY29uc3QgbGVmdCA9IGRlYy0+aW50cmFfbF87CisgIFZQOE1CRGF0YSogY29uc3QgYmxvY2sgPSBkZWMtPm1iX2RhdGFfICsgbWJfeDsKKworICAvLyBOb3RlOiB3ZSBkb24ndCBzYXZlIHNlZ21lbnQgbWFwICh5ZXQpLCBhcyB3ZSBkb24ndCBleHBlY3QKKyAgLy8gdG8gZGVjb2RlIG1vcmUgdGhhbiAxIGtleWZyYW1lLgorICBpZiAoZGVjLT5zZWdtZW50X2hkcl8udXBkYXRlX21hcF8pIHsKKyAgICAvLyBIYXJkY29kZWQgdHJlZSBwYXJzaW5nCisgICAgYmxvY2stPnNlZ21lbnRfID0gIVZQOEdldEJpdChiciwgZGVjLT5wcm9iYV8uc2VnbWVudHNfWzBdKQorICAgICAgICAgICAgICAgICAgICA/IFZQOEdldEJpdChiciwgZGVjLT5wcm9iYV8uc2VnbWVudHNfWzFdKQorICAgICAgICAgICAgICAgICAgICA6IDIgKyBWUDhHZXRCaXQoYnIsIGRlYy0+cHJvYmFfLnNlZ21lbnRzX1syXSk7CisgIH0gZWxzZSB7CisgICAgYmxvY2stPnNlZ21lbnRfID0gMDsgIC8vIGRlZmF1bHQgZm9yIGludHJhCisgIH0KKyAgaWYgKGRlYy0+dXNlX3NraXBfcHJvYmFfKSBibG9jay0+c2tpcF8gPSBWUDhHZXRCaXQoYnIsIGRlYy0+c2tpcF9wXyk7CisKKyAgYmxvY2stPmlzX2k0eDRfID0gIVZQOEdldEJpdChiciwgMTQ1KTsgICAvLyBkZWNpZGUgZm9yIEJfUFJFRCBmaXJzdAorICBpZiAoIWJsb2NrLT5pc19pNHg0XykgeworICAgIC8vIEhhcmRjb2RlZCAxNngxNiBpbnRyYS1tb2RlIGRlY2lzaW9uIHRyZWUuCisgICAgY29uc3QgaW50IHltb2RlID0KKyAgICAgICAgVlA4R2V0Qml0KGJyLCAxNTYpID8gKFZQOEdldEJpdChiciwgMTI4KSA/IFRNX1BSRUQgOiBIX1BSRUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChWUDhHZXRCaXQoYnIsIDE2MykgPyBWX1BSRUQgOiBEQ19QUkVEKTsKKyAgICBibG9jay0+aW1vZGVzX1swXSA9IHltb2RlOworICAgIG1lbXNldCh0b3AsIHltb2RlLCA0ICogc2l6ZW9mKCp0b3ApKTsKKyAgICBtZW1zZXQobGVmdCwgeW1vZGUsIDQgKiBzaXplb2YoKmxlZnQpKTsKKyAgfSBlbHNlIHsKKyAgICB1aW50OF90KiBtb2RlcyA9IGJsb2NrLT5pbW9kZXNfOworICAgIGludCB5OworICAgIGZvciAoeSA9IDA7IHkgPCA0OyArK3kpIHsKKyAgICAgIGludCB5bW9kZSA9IGxlZnRbeV07CisgICAgICBpbnQgeDsKKyAgICAgIGZvciAoeCA9IDA7IHggPCA0OyArK3gpIHsKKyAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgcHJvYiA9IGtCTW9kZXNQcm9iYVt0b3BbeF1dW3ltb2RlXTsKKyNpZiAoVVNFX0dFTkVSSUNfVFJFRSA9PSAxKQorICAgICAgICAvLyBHZW5lcmljIHRyZWUtcGFyc2luZworICAgICAgICBpbnQgaSA9IGtZTW9kZXNJbnRyYTRbVlA4R2V0Qml0KGJyLCBwcm9iWzBdKV07CisgICAgICAgIHdoaWxlIChpID4gMCkgeworICAgICAgICAgIGkgPSBrWU1vZGVzSW50cmE0WzIgKiBpICsgVlA4R2V0Qml0KGJyLCBwcm9iW2ldKV07CisgICAgICAgIH0KKyAgICAgICAgeW1vZGUgPSAtaTsKKyNlbHNlCisgICAgICAgIC8vIEhhcmRjb2RlZCB0cmVlIHBhcnNpbmcKKyAgICAgICAgeW1vZGUgPSAhVlA4R2V0Qml0KGJyLCBwcm9iWzBdKSA/IEJfRENfUFJFRCA6CisgICAgICAgICAgICAgICAgICAhVlA4R2V0Qml0KGJyLCBwcm9iWzFdKSA/IEJfVE1fUFJFRCA6CisgICAgICAgICAgICAgICAgICAgICFWUDhHZXRCaXQoYnIsIHByb2JbMl0pID8gQl9WRV9QUkVEIDoKKyAgICAgICAgICAgICAgICAgICAgICAhVlA4R2V0Qml0KGJyLCBwcm9iWzNdKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAoIVZQOEdldEJpdChiciwgcHJvYls0XSkgPyBCX0hFX1BSRUQgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAoIVZQOEdldEJpdChiciwgcHJvYls1XSkgPyBCX1JEX1BSRUQgOiBCX1ZSX1BSRUQpKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAoIVZQOEdldEJpdChiciwgcHJvYls2XSkgPyBCX0xEX1BSRUQgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAoIVZQOEdldEJpdChiciwgcHJvYls3XSkgPyBCX1ZMX1BSRUQgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICghVlA4R2V0Qml0KGJyLCBwcm9iWzhdKSA/IEJfSERfUFJFRCA6IEJfSFVfUFJFRCkpKTsKKyNlbmRpZiAgLy8gVVNFX0dFTkVSSUNfVFJFRQorICAgICAgICB0b3BbeF0gPSB5bW9kZTsKKyAgICAgIH0KKyAgICAgIG1lbWNweShtb2RlcywgdG9wLCA0ICogc2l6ZW9mKCp0b3ApKTsKKyAgICAgIG1vZGVzICs9IDQ7CisgICAgICBsZWZ0W3ldID0geW1vZGU7CisgICAgfQorICB9CisgIC8vIEhhcmRjb2RlZCBVVk1vZGUgZGVjaXNpb24gdHJlZQorICBibG9jay0+dXZtb2RlXyA9ICFWUDhHZXRCaXQoYnIsIDE0MikgPyBEQ19QUkVECisgICAgICAgICAgICAgICAgIDogIVZQOEdldEJpdChiciwgMTE0KSA/IFZfUFJFRAorICAgICAgICAgICAgICAgICA6IFZQOEdldEJpdChiciwgMTgzKSA/IFRNX1BSRUQgOiBIX1BSRUQ7Cit9CisKK2ludCBWUDhQYXJzZUludHJhTW9kZVJvdyhWUDhCaXRSZWFkZXIqIGNvbnN0IGJyLCBWUDhEZWNvZGVyKiBjb25zdCBkZWMpIHsKKyAgaW50IG1iX3g7CisgIGZvciAobWJfeCA9IDA7IG1iX3ggPCBkZWMtPm1iX3dfOyArK21iX3gpIHsKKyAgICBQYXJzZUludHJhTW9kZShiciwgZGVjLCBtYl94KTsKKyAgfQorICByZXR1cm4gIWRlYy0+YnJfLmVvZl87Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQYXJhZ3JhcGggMTMKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QKKyAgICBDb2VmZnNVcGRhdGVQcm9iYVtOVU1fVFlQRVNdW05VTV9CQU5EU11bTlVNX0NUWF1bTlVNX1BST0JBU10gPSB7CisgIHsgeyB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KKyAgICB9LAorICAgIHsgeyAxNzYsIDI0NiwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyMjMsIDI0MSwgMjUyLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNDksIDI1MywgMjUzLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9CisgICAgfSwKKyAgICB7IHsgMjU1LCAyNDQsIDI1MiwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjM0LCAyNTQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjUzLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQorICAgIH0sCisgICAgeyB7IDI1NSwgMjQ2LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDIzOSwgMjUzLCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1NCwgMjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KKyAgICB9LAorICAgIHsgeyAyNTUsIDI0OCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTEsIDI1NSwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9CisgICAgfSwKKyAgICB7IHsgMjU1LCAyNTMsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjUxLCAyNTQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjU0LCAyNTUsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQorICAgIH0sCisgICAgeyB7IDI1NSwgMjU0LCAyNTMsIDI1NSwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1MCwgMjU1LCAyNTQsIDI1NSwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KKyAgICB9LAorICAgIHsgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9CisgICAgfQorICB9LAorICB7IHsgeyAyMTcsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyMjUsIDI1MiwgMjQxLCAyNTMsIDI1NSwgMjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyMzQsIDI1MCwgMjQxLCAyNTAsIDI1MywgMjU1LCAyNTMsIDI1NCwgMjU1LCAyNTUsIDI1NSB9CisgICAgfSwKKyAgICB7IHsgMjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjIzLCAyNTQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjM4LCAyNTMsIDI1NCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQorICAgIH0sCisgICAgeyB7IDI1NSwgMjQ4LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI0OSwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KKyAgICB9LAorICAgIHsgeyAyNTUsIDI1MywgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNDcsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9CisgICAgfSwKKyAgICB7IHsgMjU1LCAyNTMsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjUyLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQorICAgIH0sCisgICAgeyB7IDI1NSwgMjU0LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1MywgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KKyAgICB9LAorICAgIHsgeyAyNTUsIDI1NCwgMjUzLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTAsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9CisgICAgfSwKKyAgICB7IHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQorICAgIH0KKyAgfSwKKyAgeyB7IHsgMTg2LCAyNTEsIDI1MCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjM0LCAyNTEsIDI0NCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjUxLCAyNTEsIDI0MywgMjUzLCAyNTQsIDI1NSwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQorICAgIH0sCisgICAgeyB7IDI1NSwgMjUzLCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDIzNiwgMjUzLCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1MSwgMjUzLCAyNTMsIDI1NCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KKyAgICB9LAorICAgIHsgeyAyNTUsIDI1NCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTQsIDI1NCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9CisgICAgfSwKKyAgICB7IHsgMjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjU0LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQorICAgIH0sCisgICAgeyB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KKyAgICB9LAorICAgIHsgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9CisgICAgfSwKKyAgICB7IHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQorICAgIH0sCisgICAgeyB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KKyAgICB9CisgIH0sCisgIHsgeyB7IDI0OCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1MCwgMjU0LCAyNTIsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI0OCwgMjU0LCAyNDksIDI1MywgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KKyAgICB9LAorICAgIHsgeyAyNTUsIDI1MywgMjUzLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNDYsIDI1MywgMjUzLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTIsIDI1NCwgMjUxLCAyNTQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9CisgICAgfSwKKyAgICB7IHsgMjU1LCAyNTQsIDI1MiwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjQ4LCAyNTQsIDI1MywgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjUzLCAyNTUsIDI1NCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQorICAgIH0sCisgICAgeyB7IDI1NSwgMjUxLCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI0NSwgMjUxLCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1MywgMjUzLCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KKyAgICB9LAorICAgIHsgeyAyNTUsIDI1MSwgMjUzLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTIsIDI1MywgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTUsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9CisgICAgfSwKKyAgICB7IHsgMjU1LCAyNTIsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjQ5LCAyNTUsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjU1LCAyNTUsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQorICAgIH0sCisgICAgeyB7IDI1NSwgMjU1LCAyNTMsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1MCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KKyAgICB9LAorICAgIHsgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9CisgICAgfQorICB9Cit9OworCisvLyBQYXJhZ3JhcGggOS45CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGtCYW5kc1sxNiArIDFdID0geworICAwLCAxLCAyLCAzLCA2LCA0LCA1LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA3LAorICAwICAvLyBleHRyYSBlbnRyeSBhcyBzZW50aW5lbAorfTsKKwordm9pZCBWUDhQYXJzZVByb2JhKFZQOEJpdFJlYWRlciogY29uc3QgYnIsIFZQOERlY29kZXIqIGNvbnN0IGRlYykgeworICBWUDhQcm9iYSogY29uc3QgcHJvYmEgPSAmZGVjLT5wcm9iYV87CisgIGludCB0LCBiLCBjLCBwOworICBmb3IgKHQgPSAwOyB0IDwgTlVNX1RZUEVTOyArK3QpIHsKKyAgICBmb3IgKGIgPSAwOyBiIDwgTlVNX0JBTkRTOyArK2IpIHsKKyAgICAgIGZvciAoYyA9IDA7IGMgPCBOVU1fQ1RYOyArK2MpIHsKKyAgICAgICAgZm9yIChwID0gMDsgcCA8IE5VTV9QUk9CQVM7ICsrcCkgeworICAgICAgICAgIGNvbnN0IGludCB2ID0gVlA4R2V0Qml0KGJyLCBDb2VmZnNVcGRhdGVQcm9iYVt0XVtiXVtjXVtwXSkgPworICAgICAgICAgICAgICAgICAgICAgICAgVlA4R2V0VmFsdWUoYnIsIDgpIDogQ29lZmZzUHJvYmEwW3RdW2JdW2NdW3BdOworICAgICAgICAgIHByb2JhLT5iYW5kc19bdF1bYl0ucHJvYmFzX1tjXVtwXSA9IHY7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZm9yIChiID0gMDsgYiA8IDE2ICsgMTsgKytiKSB7CisgICAgICBwcm9iYS0+YmFuZHNfcHRyX1t0XVtiXSA9ICZwcm9iYS0+YmFuZHNfW3RdW2tCYW5kc1tiXV07CisgICAgfQorICB9CisgIGRlYy0+dXNlX3NraXBfcHJvYmFfID0gVlA4R2V0KGJyKTsKKyAgaWYgKGRlYy0+dXNlX3NraXBfcHJvYmFfKSB7CisgICAgZGVjLT5za2lwX3BfID0gVlA4R2V0VmFsdWUoYnIsIDgpOworICB9Cit9CisKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvdnA4X2RlYy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlYy92cDhfZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY0NzZmYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvdnA4X2RlYy5jCkBAIC0wLDAgKzEsNzI3IEBACisvLyBDb3B5cmlnaHQgMjAxMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gbWFpbiBlbnRyeSBmb3IgdGhlIGRlY29kZXIKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vYXNzZXJ0X3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdGRsaWJfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0cmluZ19wb2VtLmgiCisjZWxzZQorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvZGVjL2FscGhhaV9kZWMuaCIKKyNpbmNsdWRlICJzcmMvZGVjL3ZwOGlfZGVjLmgiCisjaW5jbHVkZSAic3JjL2RlYy92cDhsaV9kZWMuaCIKKyNpbmNsdWRlICJzcmMvZGVjL3dlYnBpX2RlYy5oIgorI2luY2x1ZGUgInNyYy91dGlscy9iaXRfcmVhZGVyX2lubF91dGlscy5oIgorI2luY2x1ZGUgInNyYy91dGlscy91dGlscy5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgV2ViUEdldERlY29kZXJWZXJzaW9uKHZvaWQpIHsKKyAgcmV0dXJuIChERUNfTUFKX1ZFUlNJT04gPDwgMTYpIHwgKERFQ19NSU5fVkVSU0lPTiA8PCA4KSB8IERFQ19SRVZfVkVSU0lPTjsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFNpZ25hdHVyZSBhbmQgcG9pbnRlci10by1mdW5jdGlvbiBmb3IgR2V0Q29lZmZzKCkgdmFyaWFudHMgYmVsb3cuCisKK3R5cGVkZWYgaW50ICgqR2V0Q29lZmZzRnVuYykoVlA4Qml0UmVhZGVyKiBjb25zdCBiciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4QmFuZFByb2JhcyogY29uc3QgcHJvYltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY3R4LCBjb25zdCBxdWFudF90IGRxLCBpbnQgbiwgaW50MTZfdCogb3V0KTsKK3N0YXRpYyB2b2xhdGlsZSBHZXRDb2VmZnNGdW5jIEdldENvZWZmcyA9IE5VTEw7CisKK3N0YXRpYyB2b2lkIEluaXRHZXRDb2VmZnModm9pZCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWUDhEZWNvZGVyCisKK3N0YXRpYyB2b2lkIFNldE9rKFZQOERlY29kZXIqIGNvbnN0IGRlYykgeworICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX09LOworICBkZWMtPmVycm9yX21zZ18gPSAiT0siOworfQorCitpbnQgVlA4SW5pdElvSW50ZXJuYWwoVlA4SW8qIGNvbnN0IGlvLCBpbnQgdmVyc2lvbikgeworICBpZiAoV0VCUF9BQklfSVNfSU5DT01QQVRJQkxFKHZlcnNpb24sIFdFQlBfREVDT0RFUl9BQklfVkVSU0lPTikpIHsKKyAgICByZXR1cm4gMDsgIC8vIG1pc21hdGNoIGVycm9yCisgIH0KKyAgaWYgKGlvICE9IE5VTEwpIHsKKyAgICBtZW1zZXQoaW8sIDAsIHNpemVvZigqaW8pKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworVlA4RGVjb2RlciogVlA4TmV3KHZvaWQpIHsKKyAgVlA4RGVjb2RlciogY29uc3QgZGVjID0gKFZQOERlY29kZXIqKVdlYlBTYWZlQ2FsbG9jKDFVTEwsIHNpemVvZigqZGVjKSk7CisgIGlmIChkZWMgIT0gTlVMTCkgeworICAgIFNldE9rKGRlYyk7CisgICAgV2ViUEdldFdvcmtlckludGVyZmFjZSgpLT5Jbml0KCZkZWMtPndvcmtlcl8pOworICAgIGRlYy0+cmVhZHlfID0gMDsKKyAgICBkZWMtPm51bV9wYXJ0c19taW51c19vbmVfID0gMDsKKyAgICBJbml0R2V0Q29lZmZzKCk7CisgIH0KKyAgcmV0dXJuIGRlYzsKK30KKworVlA4U3RhdHVzQ29kZSBWUDhTdGF0dXMoVlA4RGVjb2RlciogY29uc3QgZGVjKSB7CisgIGlmICghZGVjKSByZXR1cm4gVlA4X1NUQVRVU19JTlZBTElEX1BBUkFNOworICByZXR1cm4gZGVjLT5zdGF0dXNfOworfQorCitjb25zdCBjaGFyKiBWUDhTdGF0dXNNZXNzYWdlKFZQOERlY29kZXIqIGNvbnN0IGRlYykgeworICBpZiAoZGVjID09IE5VTEwpIHJldHVybiAibm8gb2JqZWN0IjsKKyAgaWYgKCFkZWMtPmVycm9yX21zZ18pIHJldHVybiAiT0siOworICByZXR1cm4gZGVjLT5lcnJvcl9tc2dfOworfQorCit2b2lkIFZQOERlbGV0ZShWUDhEZWNvZGVyKiBjb25zdCBkZWMpIHsKKyAgaWYgKGRlYyAhPSBOVUxMKSB7CisgICAgVlA4Q2xlYXIoZGVjKTsKKyAgICBXZWJQU2FmZUZyZWUoZGVjKTsKKyAgfQorfQorCitpbnQgVlA4U2V0RXJyb3IoVlA4RGVjb2RlciogY29uc3QgZGVjLAorICAgICAgICAgICAgICAgIFZQOFN0YXR1c0NvZGUgZXJyb3IsIGNvbnN0IGNoYXIqIGNvbnN0IG1zZykgeworICAvLyBUaGUgb2xkZXN0IGVycm9yIHJlcG9ydGVkIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGUgbmV3IG9uZS4KKyAgaWYgKGRlYy0+c3RhdHVzXyA9PSBWUDhfU1RBVFVTX09LKSB7CisgICAgZGVjLT5zdGF0dXNfID0gZXJyb3I7CisgICAgZGVjLT5lcnJvcl9tc2dfID0gbXNnOworICAgIGRlYy0+cmVhZHlfID0gMDsKKyAgfQorICByZXR1cm4gMDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IFZQOENoZWNrU2lnbmF0dXJlKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsIHNpemVfdCBkYXRhX3NpemUpIHsKKyAgcmV0dXJuIChkYXRhX3NpemUgPj0gMyAmJgorICAgICAgICAgIGRhdGFbMF0gPT0gMHg5ZCAmJiBkYXRhWzFdID09IDB4MDEgJiYgZGF0YVsyXSA9PSAweDJhKTsKK30KKworaW50IFZQOEdldEluZm8oY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwgc2l6ZV90IGNodW5rX3NpemUsCisgICAgICAgICAgICAgICBpbnQqIGNvbnN0IHdpZHRoLCBpbnQqIGNvbnN0IGhlaWdodCkgeworICBpZiAoZGF0YSA9PSBOVUxMIHx8IGRhdGFfc2l6ZSA8IFZQOF9GUkFNRV9IRUFERVJfU0laRSkgeworICAgIHJldHVybiAwOyAgICAgICAgIC8vIG5vdCBlbm91Z2ggZGF0YQorICB9CisgIC8vIGNoZWNrIHNpZ25hdHVyZQorICBpZiAoIVZQOENoZWNrU2lnbmF0dXJlKGRhdGEgKyAzLCBkYXRhX3NpemUgLSAzKSkgeworICAgIHJldHVybiAwOyAgICAgICAgIC8vIFdyb25nIHNpZ25hdHVyZS4KKyAgfSBlbHNlIHsKKyAgICBjb25zdCB1aW50MzJfdCBiaXRzID0gZGF0YVswXSB8IChkYXRhWzFdIDw8IDgpIHwgKGRhdGFbMl0gPDwgMTYpOworICAgIGNvbnN0IGludCBrZXlfZnJhbWUgPSAhKGJpdHMgJiAxKTsKKyAgICBjb25zdCBpbnQgdyA9ICgoZGF0YVs3XSA8PCA4KSB8IGRhdGFbNl0pICYgMHgzZmZmOworICAgIGNvbnN0IGludCBoID0gKChkYXRhWzldIDw8IDgpIHwgZGF0YVs4XSkgJiAweDNmZmY7CisKKyAgICBpZiAoIWtleV9mcmFtZSkgeyAgIC8vIE5vdCBhIGtleWZyYW1lLgorICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKCgoYml0cyA+PiAxKSAmIDcpID4gMykgeworICAgICAgcmV0dXJuIDA7ICAgICAgICAgLy8gdW5rbm93biBwcm9maWxlCisgICAgfQorICAgIGlmICghKChiaXRzID4+IDQpICYgMSkpIHsKKyAgICAgIHJldHVybiAwOyAgICAgICAgIC8vIGZpcnN0IGZyYW1lIGlzIGludmlzaWJsZSEKKyAgICB9CisgICAgaWYgKCgoYml0cyA+PiA1KSkgPj0gY2h1bmtfc2l6ZSkgeyAgLy8gcGFydGl0aW9uX2xlbmd0aAorICAgICAgcmV0dXJuIDA7ICAgICAgICAgLy8gaW5jb25zaXN0ZW50IHNpemUgaW5mb3JtYXRpb24uCisgICAgfQorICAgIGlmICh3ID09IDAgfHwgaCA9PSAwKSB7CisgICAgICByZXR1cm4gMDsgICAgICAgICAvLyBXZSBkb24ndCBzdXBwb3J0IGJvdGggd2lkdGggYW5kIGhlaWdodCB0byBiZSB6ZXJvLgorICAgIH0KKworICAgIGlmICh3aWR0aCkgeworICAgICAgKndpZHRoID0gdzsKKyAgICB9CisgICAgaWYgKGhlaWdodCkgeworICAgICAgKmhlaWdodCA9IGg7CisgICAgfQorCisgICAgcmV0dXJuIDE7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhlYWRlciBwYXJzaW5nCisKK3N0YXRpYyB2b2lkIFJlc2V0U2VnbWVudEhlYWRlcihWUDhTZWdtZW50SGVhZGVyKiBjb25zdCBoZHIpIHsKKyAgYXNzZXJ0KGhkciAhPSBOVUxMKTsKKyAgaGRyLT51c2Vfc2VnbWVudF8gPSAwOworICBoZHItPnVwZGF0ZV9tYXBfID0gMDsKKyAgaGRyLT5hYnNvbHV0ZV9kZWx0YV8gPSAxOworICBtZW1zZXQoaGRyLT5xdWFudGl6ZXJfLCAwLCBzaXplb2YoaGRyLT5xdWFudGl6ZXJfKSk7CisgIG1lbXNldChoZHItPmZpbHRlcl9zdHJlbmd0aF8sIDAsIHNpemVvZihoZHItPmZpbHRlcl9zdHJlbmd0aF8pKTsKK30KKworLy8gUGFyYWdyYXBoIDkuMworc3RhdGljIGludCBQYXJzZVNlZ21lbnRIZWFkZXIoVlA4Qml0UmVhZGVyKiBiciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOFNlZ21lbnRIZWFkZXIqIGhkciwgVlA4UHJvYmEqIHByb2JhKSB7CisgIGFzc2VydChiciAhPSBOVUxMKTsKKyAgYXNzZXJ0KGhkciAhPSBOVUxMKTsKKyAgaGRyLT51c2Vfc2VnbWVudF8gPSBWUDhHZXQoYnIpOworICBpZiAoaGRyLT51c2Vfc2VnbWVudF8pIHsKKyAgICBoZHItPnVwZGF0ZV9tYXBfID0gVlA4R2V0KGJyKTsKKyAgICBpZiAoVlA4R2V0KGJyKSkgeyAgIC8vIHVwZGF0ZSBkYXRhCisgICAgICBpbnQgczsKKyAgICAgIGhkci0+YWJzb2x1dGVfZGVsdGFfID0gVlA4R2V0KGJyKTsKKyAgICAgIGZvciAocyA9IDA7IHMgPCBOVU1fTUJfU0VHTUVOVFM7ICsrcykgeworICAgICAgICBoZHItPnF1YW50aXplcl9bc10gPSBWUDhHZXQoYnIpID8gVlA4R2V0U2lnbmVkVmFsdWUoYnIsIDcpIDogMDsKKyAgICAgIH0KKyAgICAgIGZvciAocyA9IDA7IHMgPCBOVU1fTUJfU0VHTUVOVFM7ICsrcykgeworICAgICAgICBoZHItPmZpbHRlcl9zdHJlbmd0aF9bc10gPSBWUDhHZXQoYnIpID8gVlA4R2V0U2lnbmVkVmFsdWUoYnIsIDYpIDogMDsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGhkci0+dXBkYXRlX21hcF8pIHsKKyAgICAgIGludCBzOworICAgICAgZm9yIChzID0gMDsgcyA8IE1CX0ZFQVRVUkVfVFJFRV9QUk9CUzsgKytzKSB7CisgICAgICAgIHByb2JhLT5zZWdtZW50c19bc10gPSBWUDhHZXQoYnIpID8gVlA4R2V0VmFsdWUoYnIsIDgpIDogMjU1dTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgaGRyLT51cGRhdGVfbWFwXyA9IDA7CisgIH0KKyAgcmV0dXJuICFici0+ZW9mXzsKK30KKworLy8gUGFyYWdyYXBoIDkuNQorLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIFZQOF9TVEFUVVNfU1VTUEVOREVEIGlmIHdlIGRvbid0IGhhdmUgYWxsIHRoZQorLy8gbmVjZXNzYXJ5IGRhdGEgaW4gJ2J1ZicuCisvLyBUaGlzIGNhc2UgaXMgbm90IG5lY2Vzc2FyaWx5IGFuIGVycm9yIChmb3IgaW5jcmVtZW50YWwgZGVjb2RpbmcpLgorLy8gU3RpbGwsIG5vIGJpdHJlYWRlciBpcyBldmVyIGluaXRpYWxpemVkIHRvIG1ha2UgaXQgcG9zc2libGUgdG8gcmVhZAorLy8gdW5hdmFpbGFibGUgbWVtb3J5LgorLy8gSWYgd2UgZG9uJ3QgZXZlbiBoYXZlIHRoZSBwYXJ0aXRpb25zJyBzaXplcywgdGhhbiBWUDhfU1RBVFVTX05PVF9FTk9VR0hfREFUQQorLy8gaXMgcmV0dXJuZWQsIGFuZCB0aGlzIGlzIGFuIHVucmVjb3ZlcmFibGUgZXJyb3IuCisvLyBJZiB0aGUgcGFydGl0aW9ucyB3ZXJlIHBvc2l0aW9uZWQgb2ssIFZQOF9TVEFUVVNfT0sgaXMgcmV0dXJuZWQuCitzdGF0aWMgVlA4U3RhdHVzQ29kZSBQYXJzZVBhcnRpdGlvbnMoVlA4RGVjb2RlciogY29uc3QgZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGJ1Ziwgc2l6ZV90IHNpemUpIHsKKyAgVlA4Qml0UmVhZGVyKiBjb25zdCBiciA9ICZkZWMtPmJyXzsKKyAgY29uc3QgdWludDhfdCogc3ogPSBidWY7CisgIGNvbnN0IHVpbnQ4X3QqIGJ1Zl9lbmQgPSBidWYgKyBzaXplOworICBjb25zdCB1aW50OF90KiBwYXJ0X3N0YXJ0OworICBzaXplX3Qgc2l6ZV9sZWZ0ID0gc2l6ZTsKKyAgc2l6ZV90IGxhc3RfcGFydDsKKyAgc2l6ZV90IHA7CisKKyAgZGVjLT5udW1fcGFydHNfbWludXNfb25lXyA9ICgxIDw8IFZQOEdldFZhbHVlKGJyLCAyKSkgLSAxOworICBsYXN0X3BhcnQgPSBkZWMtPm51bV9wYXJ0c19taW51c19vbmVfOworICBpZiAoc2l6ZSA8IDMgKiBsYXN0X3BhcnQpIHsKKyAgICAvLyB3ZSBjYW4ndCBldmVuIHJlYWQgdGhlIHNpemVzIHdpdGggc3pbXSEgVGhhdCdzIGEgZmFpbHVyZS4KKyAgICByZXR1cm4gVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEE7CisgIH0KKyAgcGFydF9zdGFydCA9IGJ1ZiArIGxhc3RfcGFydCAqIDM7CisgIHNpemVfbGVmdCAtPSBsYXN0X3BhcnQgKiAzOworICBmb3IgKHAgPSAwOyBwIDwgbGFzdF9wYXJ0OyArK3ApIHsKKyAgICBzaXplX3QgcHNpemUgPSBzelswXSB8IChzelsxXSA8PCA4KSB8IChzelsyXSA8PCAxNik7CisgICAgaWYgKHBzaXplID4gc2l6ZV9sZWZ0KSBwc2l6ZSA9IHNpemVfbGVmdDsKKyAgICBWUDhJbml0Qml0UmVhZGVyKGRlYy0+cGFydHNfICsgcCwgcGFydF9zdGFydCwgcHNpemUpOworICAgIHBhcnRfc3RhcnQgKz0gcHNpemU7CisgICAgc2l6ZV9sZWZ0IC09IHBzaXplOworICAgIHN6ICs9IDM7CisgIH0KKyAgVlA4SW5pdEJpdFJlYWRlcihkZWMtPnBhcnRzXyArIGxhc3RfcGFydCwgcGFydF9zdGFydCwgc2l6ZV9sZWZ0KTsKKyAgcmV0dXJuIChwYXJ0X3N0YXJ0IDwgYnVmX2VuZCkgPyBWUDhfU1RBVFVTX09LIDoKKyAgICAgICAgICAgVlA4X1NUQVRVU19TVVNQRU5ERUQ7ICAgLy8gSW5pdCBpcyBvaywgYnV0IHRoZXJlJ3Mgbm90IGVub3VnaCBkYXRhCit9CisKKy8vIFBhcmFncmFwaCA5LjQKK3N0YXRpYyBpbnQgUGFyc2VGaWx0ZXJIZWFkZXIoVlA4Qml0UmVhZGVyKiBiciwgVlA4RGVjb2RlciogY29uc3QgZGVjKSB7CisgIFZQOEZpbHRlckhlYWRlciogY29uc3QgaGRyID0gJmRlYy0+ZmlsdGVyX2hkcl87CisgIGhkci0+c2ltcGxlXyAgICA9IFZQOEdldChicik7CisgIGhkci0+bGV2ZWxfICAgICA9IFZQOEdldFZhbHVlKGJyLCA2KTsKKyAgaGRyLT5zaGFycG5lc3NfID0gVlA4R2V0VmFsdWUoYnIsIDMpOworICBoZHItPnVzZV9sZl9kZWx0YV8gPSBWUDhHZXQoYnIpOworICBpZiAoaGRyLT51c2VfbGZfZGVsdGFfKSB7CisgICAgaWYgKFZQOEdldChicikpIHsgICAvLyB1cGRhdGUgbGYtZGVsdGE/CisgICAgICBpbnQgaTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fUkVGX0xGX0RFTFRBUzsgKytpKSB7CisgICAgICAgIGlmIChWUDhHZXQoYnIpKSB7CisgICAgICAgICAgaGRyLT5yZWZfbGZfZGVsdGFfW2ldID0gVlA4R2V0U2lnbmVkVmFsdWUoYnIsIDYpOworICAgICAgICB9CisgICAgICB9CisgICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX01PREVfTEZfREVMVEFTOyArK2kpIHsKKyAgICAgICAgaWYgKFZQOEdldChicikpIHsKKyAgICAgICAgICBoZHItPm1vZGVfbGZfZGVsdGFfW2ldID0gVlA4R2V0U2lnbmVkVmFsdWUoYnIsIDYpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGRlYy0+ZmlsdGVyX3R5cGVfID0gKGhkci0+bGV2ZWxfID09IDApID8gMCA6IGhkci0+c2ltcGxlXyA/IDEgOiAyOworICByZXR1cm4gIWJyLT5lb2ZfOworfQorCisvLyBUb3Btb3N0IGNhbGwKK2ludCBWUDhHZXRIZWFkZXJzKFZQOERlY29kZXIqIGNvbnN0IGRlYywgVlA4SW8qIGNvbnN0IGlvKSB7CisgIGNvbnN0IHVpbnQ4X3QqIGJ1ZjsKKyAgc2l6ZV90IGJ1Zl9zaXplOworICBWUDhGcmFtZUhlYWRlciogZnJtX2hkcjsKKyAgVlA4UGljdHVyZUhlYWRlciogcGljX2hkcjsKKyAgVlA4Qml0UmVhZGVyKiBicjsKKyAgVlA4U3RhdHVzQ29kZSBzdGF0dXM7CisKKyAgaWYgKGRlYyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgU2V0T2soZGVjKTsKKyAgaWYgKGlvID09IE5VTEwpIHsKKyAgICByZXR1cm4gVlA4U2V0RXJyb3IoZGVjLCBWUDhfU1RBVFVTX0lOVkFMSURfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICJudWxsIFZQOElvIHBhc3NlZCB0byBWUDhHZXRIZWFkZXJzKCkiKTsKKyAgfQorICBidWYgPSBpby0+ZGF0YTsKKyAgYnVmX3NpemUgPSBpby0+ZGF0YV9zaXplOworICBpZiAoYnVmX3NpemUgPCA0KSB7CisgICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICJUcnVuY2F0ZWQgaGVhZGVyLiIpOworICB9CisKKyAgLy8gUGFyYWdyYXBoIDkuMQorICB7CisgICAgY29uc3QgdWludDMyX3QgYml0cyA9IGJ1ZlswXSB8IChidWZbMV0gPDwgOCkgfCAoYnVmWzJdIDw8IDE2KTsKKyAgICBmcm1faGRyID0gJmRlYy0+ZnJtX2hkcl87CisgICAgZnJtX2hkci0+a2V5X2ZyYW1lXyA9ICEoYml0cyAmIDEpOworICAgIGZybV9oZHItPnByb2ZpbGVfID0gKGJpdHMgPj4gMSkgJiA3OworICAgIGZybV9oZHItPnNob3dfID0gKGJpdHMgPj4gNCkgJiAxOworICAgIGZybV9oZHItPnBhcnRpdGlvbl9sZW5ndGhfID0gKGJpdHMgPj4gNSk7CisgICAgaWYgKGZybV9oZHItPnByb2ZpbGVfID4gMykgeworICAgICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIkluY29ycmVjdCBrZXlmcmFtZSBwYXJhbWV0ZXJzLiIpOworICAgIH0KKyAgICBpZiAoIWZybV9oZHItPnNob3dfKSB7CisgICAgICByZXR1cm4gVlA4U2V0RXJyb3IoZGVjLCBWUDhfU1RBVFVTX1VOU1VQUE9SVEVEX0ZFQVRVUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIkZyYW1lIG5vdCBkaXNwbGF5YWJsZS4iKTsKKyAgICB9CisgICAgYnVmICs9IDM7CisgICAgYnVmX3NpemUgLT0gMzsKKyAgfQorCisgIHBpY19oZHIgPSAmZGVjLT5waWNfaGRyXzsKKyAgaWYgKGZybV9oZHItPmtleV9mcmFtZV8pIHsKKyAgICAvLyBQYXJhZ3JhcGggOS4yCisgICAgaWYgKGJ1Zl9zaXplIDwgNykgeworICAgICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBwYXJzZSBwaWN0dXJlIGhlYWRlciIpOworICAgIH0KKyAgICBpZiAoIVZQOENoZWNrU2lnbmF0dXJlKGJ1ZiwgYnVmX3NpemUpKSB7CisgICAgICByZXR1cm4gVlA4U2V0RXJyb3IoZGVjLCBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIGNvZGUgd29yZCIpOworICAgIH0KKyAgICBwaWNfaGRyLT53aWR0aF8gPSAoKGJ1Zls0XSA8PCA4KSB8IGJ1ZlszXSkgJiAweDNmZmY7CisgICAgcGljX2hkci0+eHNjYWxlXyA9IGJ1Zls0XSA+PiA2OyAgIC8vIHJhdGlvOiAxLCA1LzQgNS8zIG9yIDIKKyAgICBwaWNfaGRyLT5oZWlnaHRfID0gKChidWZbNl0gPDwgOCkgfCBidWZbNV0pICYgMHgzZmZmOworICAgIHBpY19oZHItPnlzY2FsZV8gPSBidWZbNl0gPj4gNjsKKyAgICBidWYgKz0gNzsKKyAgICBidWZfc2l6ZSAtPSA3OworCisgICAgZGVjLT5tYl93XyA9IChwaWNfaGRyLT53aWR0aF8gKyAxNSkgPj4gNDsKKyAgICBkZWMtPm1iX2hfID0gKHBpY19oZHItPmhlaWdodF8gKyAxNSkgPj4gNDsKKworICAgIC8vIFNldHVwIGRlZmF1bHQgb3V0cHV0IGFyZWEgKGNhbiBiZSBsYXRlciBtb2RpZmllZCBkdXJpbmcgaW8tPnNldHVwKCkpCisgICAgaW8tPndpZHRoID0gcGljX2hkci0+d2lkdGhfOworICAgIGlvLT5oZWlnaHQgPSBwaWNfaGRyLT5oZWlnaHRfOworICAgIC8vIElNUE9SVEFOVCEgdXNlIHNvbWUgc2FuZSBkaW1lbnNpb25zIGluIGNyb3BfKiBhbmQgc2NhbGVkXyogZmllbGRzLgorICAgIC8vIFNvIHRoZXkgY2FuIGJlIHVzZWQgaW50ZXJjaGFuZ2VhYmx5IHdpdGhvdXQgYWx3YXlzIHRlc3RpbmcgZm9yCisgICAgLy8gJ3VzZV9jcm9wcGluZycuCisgICAgaW8tPnVzZV9jcm9wcGluZyA9IDA7CisgICAgaW8tPmNyb3BfdG9wICA9IDA7CisgICAgaW8tPmNyb3BfbGVmdCA9IDA7CisgICAgaW8tPmNyb3BfcmlnaHQgID0gaW8tPndpZHRoOworICAgIGlvLT5jcm9wX2JvdHRvbSA9IGlvLT5oZWlnaHQ7CisgICAgaW8tPnVzZV9zY2FsaW5nICA9IDA7CisgICAgaW8tPnNjYWxlZF93aWR0aCA9IGlvLT53aWR0aDsKKyAgICBpby0+c2NhbGVkX2hlaWdodCA9IGlvLT5oZWlnaHQ7CisKKyAgICBpby0+bWJfdyA9IGlvLT53aWR0aDsgICAvLyBzYW5pdHkgY2hlY2sKKyAgICBpby0+bWJfaCA9IGlvLT5oZWlnaHQ7ICAvLyBkaXR0bworCisgICAgVlA4UmVzZXRQcm9iYSgmZGVjLT5wcm9iYV8pOworICAgIFJlc2V0U2VnbWVudEhlYWRlcigmZGVjLT5zZWdtZW50X2hkcl8pOworICB9CisKKyAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhbGwgdGhlIHBhcnRpdGlvbiAjMCBhdmFpbGFibGUsIGFuZCBpbml0aWFsaXplIGRlYy0+YnJfCisgIC8vIHRvIHJlYWQgdGhpcyBwYXJ0aXRpb24gKGFuZCB0aGlzIHBhcnRpdGlvbiBvbmx5KS4KKyAgaWYgKGZybV9oZHItPnBhcnRpdGlvbl9sZW5ndGhfID4gYnVmX3NpemUpIHsKKyAgICByZXR1cm4gVlA4U2V0RXJyb3IoZGVjLCBWUDhfU1RBVFVTX05PVF9FTk9VR0hfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgImJhZCBwYXJ0aXRpb24gbGVuZ3RoIik7CisgIH0KKworICBiciA9ICZkZWMtPmJyXzsKKyAgVlA4SW5pdEJpdFJlYWRlcihiciwgYnVmLCBmcm1faGRyLT5wYXJ0aXRpb25fbGVuZ3RoXyk7CisgIGJ1ZiArPSBmcm1faGRyLT5wYXJ0aXRpb25fbGVuZ3RoXzsKKyAgYnVmX3NpemUgLT0gZnJtX2hkci0+cGFydGl0aW9uX2xlbmd0aF87CisKKyAgaWYgKGZybV9oZHItPmtleV9mcmFtZV8pIHsKKyAgICBwaWNfaGRyLT5jb2xvcnNwYWNlXyA9IFZQOEdldChicik7CisgICAgcGljX2hkci0+Y2xhbXBfdHlwZV8gPSBWUDhHZXQoYnIpOworICB9CisgIGlmICghUGFyc2VTZWdtZW50SGVhZGVyKGJyLCAmZGVjLT5zZWdtZW50X2hkcl8sICZkZWMtPnByb2JhXykpIHsKKyAgICByZXR1cm4gVlA4U2V0RXJyb3IoZGVjLCBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBwYXJzZSBzZWdtZW50IGhlYWRlciIpOworICB9CisgIC8vIEZpbHRlciBzcGVjcworICBpZiAoIVBhcnNlRmlsdGVySGVhZGVyKGJyLCBkZWMpKSB7CisgICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgcGFyc2UgZmlsdGVyIGhlYWRlciIpOworICB9CisgIHN0YXR1cyA9IFBhcnNlUGFydGl0aW9ucyhkZWMsIGJ1ZiwgYnVmX3NpemUpOworICBpZiAoc3RhdHVzICE9IFZQOF9TVEFUVVNfT0spIHsKKyAgICByZXR1cm4gVlA4U2V0RXJyb3IoZGVjLCBzdGF0dXMsICJjYW5ub3QgcGFyc2UgcGFydGl0aW9ucyIpOworICB9CisKKyAgLy8gcXVhbnRpemVyIGNoYW5nZQorICBWUDhQYXJzZVF1YW50KGRlYyk7CisKKyAgLy8gRnJhbWUgYnVmZmVyIG1hcmtpbmcKKyAgaWYgKCFmcm1faGRyLT5rZXlfZnJhbWVfKSB7CisgICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19VTlNVUFBPUlRFRF9GRUFUVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAiTm90IGEga2V5IGZyYW1lLiIpOworICB9CisKKyAgVlA4R2V0KGJyKTsgICAvLyBpZ25vcmUgdGhlIHZhbHVlIG9mIHVwZGF0ZV9wcm9iYV8KKworICBWUDhQYXJzZVByb2JhKGJyLCBkZWMpOworCisgIC8vIHNhbml0aXplZCBzdGF0ZQorICBkZWMtPnJlYWR5XyA9IDE7CisgIHJldHVybiAxOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUmVzaWR1YWwgZGVjb2RpbmcgKFBhcmFncmFwaCAxMy4yIC8gMTMuMykKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0NhdDNbXSA9IHsgMTczLCAxNDgsIDE0MCwgMCB9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0NhdDRbXSA9IHsgMTc2LCAxNTUsIDE0MCwgMTM1LCAwIH07CitzdGF0aWMgY29uc3QgdWludDhfdCBrQ2F0NVtdID0geyAxODAsIDE1NywgMTQxLCAxMzQsIDEzMCwgMCB9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0NhdDZbXSA9CisgIHsgMjU0LCAyNTQsIDI0MywgMjMwLCAxOTYsIDE3NywgMTUzLCAxNDAsIDEzMywgMTMwLCAxMjksIDAgfTsKK3N0YXRpYyBjb25zdCB1aW50OF90KiBjb25zdCBrQ2F0MzQ1NltdID0geyBrQ2F0Mywga0NhdDQsIGtDYXQ1LCBrQ2F0NiB9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga1ppZ3phZ1sxNl0gPSB7CisgIDAsIDEsIDQsIDgsICA1LCAyLCAzLCA2LCAgOSwgMTIsIDEzLCAxMCwgIDcsIDExLCAxNCwgMTUKK307CisKKy8vIFNlZSBzZWN0aW9uIDEzLTI6IGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzYzODYjc2VjdGlvbi0xMy4yCitzdGF0aWMgaW50IEdldExhcmdlVmFsdWUoVlA4Qml0UmVhZGVyKiBjb25zdCBiciwgY29uc3QgdWludDhfdCogY29uc3QgcCkgeworICBpbnQgdjsKKyAgaWYgKCFWUDhHZXRCaXQoYnIsIHBbM10pKSB7CisgICAgaWYgKCFWUDhHZXRCaXQoYnIsIHBbNF0pKSB7CisgICAgICB2ID0gMjsKKyAgICB9IGVsc2UgeworICAgICAgdiA9IDMgKyBWUDhHZXRCaXQoYnIsIHBbNV0pOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoIVZQOEdldEJpdChiciwgcFs2XSkpIHsKKyAgICAgIGlmICghVlA4R2V0Qml0KGJyLCBwWzddKSkgeworICAgICAgICB2ID0gNSArIFZQOEdldEJpdChiciwgMTU5KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHYgPSA3ICsgMiAqIFZQOEdldEJpdChiciwgMTY1KTsKKyAgICAgICAgdiArPSBWUDhHZXRCaXQoYnIsIDE0NSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbnN0IHVpbnQ4X3QqIHRhYjsKKyAgICAgIGNvbnN0IGludCBiaXQxID0gVlA4R2V0Qml0KGJyLCBwWzhdKTsKKyAgICAgIGNvbnN0IGludCBiaXQwID0gVlA4R2V0Qml0KGJyLCBwWzkgKyBiaXQxXSk7CisgICAgICBjb25zdCBpbnQgY2F0ID0gMiAqIGJpdDEgKyBiaXQwOworICAgICAgdiA9IDA7CisgICAgICBmb3IgKHRhYiA9IGtDYXQzNDU2W2NhdF07ICp0YWI7ICsrdGFiKSB7CisgICAgICAgIHYgKz0gdiArIFZQOEdldEJpdChiciwgKnRhYik7CisgICAgICB9CisgICAgICB2ICs9IDMgKyAoOCA8PCBjYXQpOworICAgIH0KKyAgfQorICByZXR1cm4gdjsKK30KKworLy8gUmV0dXJucyB0aGUgcG9zaXRpb24gb2YgdGhlIGxhc3Qgbm9uLXplcm8gY29lZmYgcGx1cyBvbmUKK3N0YXRpYyBpbnQgR2V0Q29lZmZzRmFzdChWUDhCaXRSZWFkZXIqIGNvbnN0IGJyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOEJhbmRQcm9iYXMqIGNvbnN0IHByb2JbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY3R4LCBjb25zdCBxdWFudF90IGRxLCBpbnQgbiwgaW50MTZfdCogb3V0KSB7CisgIGNvbnN0IHVpbnQ4X3QqIHAgPSBwcm9iW25dLT5wcm9iYXNfW2N0eF07CisgIGZvciAoOyBuIDwgMTY7ICsrbikgeworICAgIGlmICghVlA4R2V0Qml0KGJyLCBwWzBdKSkgeworICAgICAgcmV0dXJuIG47ICAvLyBwcmV2aW91cyBjb2VmZiB3YXMgbGFzdCBub24temVybyBjb2VmZgorICAgIH0KKyAgICB3aGlsZSAoIVZQOEdldEJpdChiciwgcFsxXSkpIHsgICAgICAgLy8gc2VxdWVuY2Ugb2YgemVybyBjb2VmZnMKKyAgICAgIHAgPSBwcm9iWysrbl0tPnByb2Jhc19bMF07CisgICAgICBpZiAobiA9PSAxNikgcmV0dXJuIDE2OworICAgIH0KKyAgICB7ICAgICAgICAvLyBub24gemVybyBjb2VmZgorICAgICAgY29uc3QgVlA4UHJvYmFBcnJheSogY29uc3QgcF9jdHggPSAmcHJvYltuICsgMV0tPnByb2Jhc19bMF07CisgICAgICBpbnQgdjsKKyAgICAgIGlmICghVlA4R2V0Qml0KGJyLCBwWzJdKSkgeworICAgICAgICB2ID0gMTsKKyAgICAgICAgcCA9IHBfY3R4WzFdOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdiA9IEdldExhcmdlVmFsdWUoYnIsIHApOworICAgICAgICBwID0gcF9jdHhbMl07CisgICAgICB9CisgICAgICBvdXRba1ppZ3phZ1tuXV0gPSBWUDhHZXRTaWduZWQoYnIsIHYpICogZHFbbiA+IDBdOworICAgIH0KKyAgfQorICByZXR1cm4gMTY7Cit9CisKKy8vIFRoaXMgdmVyc2lvbiBvZiBHZXRDb2VmZnMoKSB1c2VzIFZQOEdldEJpdEFsdCgpIHdoaWNoIGlzIGFuIGFsdGVybmF0ZSB2ZXJzaW9uCisvLyBvZiBWUDhHZXRCaXRBbHQoKSB0YXJnZXRpbmcgc3BlY2lmaWMgcGxhdGZvcm1zLgorc3RhdGljIGludCBHZXRDb2VmZnNBbHQoVlA4Qml0UmVhZGVyKiBjb25zdCBiciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOEJhbmRQcm9iYXMqIGNvbnN0IHByb2JbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBjdHgsIGNvbnN0IHF1YW50X3QgZHEsIGludCBuLCBpbnQxNl90KiBvdXQpIHsKKyAgY29uc3QgdWludDhfdCogcCA9IHByb2Jbbl0tPnByb2Jhc19bY3R4XTsKKyAgZm9yICg7IG4gPCAxNjsgKytuKSB7CisgICAgaWYgKCFWUDhHZXRCaXRBbHQoYnIsIHBbMF0pKSB7CisgICAgICByZXR1cm4gbjsgIC8vIHByZXZpb3VzIGNvZWZmIHdhcyBsYXN0IG5vbi16ZXJvIGNvZWZmCisgICAgfQorICAgIHdoaWxlICghVlA4R2V0Qml0QWx0KGJyLCBwWzFdKSkgeyAgICAgICAvLyBzZXF1ZW5jZSBvZiB6ZXJvIGNvZWZmcworICAgICAgcCA9IHByb2JbKytuXS0+cHJvYmFzX1swXTsKKyAgICAgIGlmIChuID09IDE2KSByZXR1cm4gMTY7CisgICAgfQorICAgIHsgICAgICAgIC8vIG5vbiB6ZXJvIGNvZWZmCisgICAgICBjb25zdCBWUDhQcm9iYUFycmF5KiBjb25zdCBwX2N0eCA9ICZwcm9iW24gKyAxXS0+cHJvYmFzX1swXTsKKyAgICAgIGludCB2OworICAgICAgaWYgKCFWUDhHZXRCaXRBbHQoYnIsIHBbMl0pKSB7CisgICAgICAgIHYgPSAxOworICAgICAgICBwID0gcF9jdHhbMV07CisgICAgICB9IGVsc2UgeworICAgICAgICB2ID0gR2V0TGFyZ2VWYWx1ZShiciwgcCk7CisgICAgICAgIHAgPSBwX2N0eFsyXTsKKyAgICAgIH0KKyAgICAgIG91dFtrWmlnemFnW25dXSA9IFZQOEdldFNpZ25lZChiciwgdikgKiBkcVtuID4gMF07CisgICAgfQorICB9CisgIHJldHVybiAxNjsKK30KKworc3RhdGljIFdFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBJbml0R2V0Q29lZmZzKHZvaWQpIHsKKyAgaWYgKEdldENvZWZmcyA9PSBOVUxMKSB7CisgICAgaWYgKFZQOEdldENQVUluZm8gIT0gTlVMTCAmJiBWUDhHZXRDUFVJbmZvKGtTbG93U1NTRTMpKSB7CisgICAgICBHZXRDb2VmZnMgPSBHZXRDb2VmZnNBbHQ7CisgICAgfSBlbHNlIHsKKyAgICAgIEdldENvZWZmcyA9IEdldENvZWZmc0Zhc3Q7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBOekNvZGVCaXRzKHVpbnQzMl90IG56X2NvZWZmcywgaW50IG56LCBpbnQgZGNfbnopIHsKKyAgbnpfY29lZmZzIDw8PSAyOworICBuel9jb2VmZnMgfD0gKG56ID4gMykgPyAzIDogKG56ID4gMSkgPyAyIDogZGNfbno7CisgIHJldHVybiBuel9jb2VmZnM7Cit9CisKK3N0YXRpYyBpbnQgUGFyc2VSZXNpZHVhbHMoVlA4RGVjb2RlciogY29uc3QgZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhNQiogY29uc3QgbWIsIFZQOEJpdFJlYWRlciogY29uc3QgdG9rZW5fYnIpIHsKKyAgY29uc3QgVlA4QmFuZFByb2JhcyogKCogY29uc3QgYmFuZHMpWzE2ICsgMV0gPSBkZWMtPnByb2JhXy5iYW5kc19wdHJfOworICBjb25zdCBWUDhCYW5kUHJvYmFzKiBjb25zdCAqIGFjX3Byb2JhOworICBWUDhNQkRhdGEqIGNvbnN0IGJsb2NrID0gZGVjLT5tYl9kYXRhXyArIGRlYy0+bWJfeF87CisgIGNvbnN0IFZQOFF1YW50TWF0cml4KiBjb25zdCBxID0gJmRlYy0+ZHFtX1tibG9jay0+c2VnbWVudF9dOworICBpbnQxNl90KiBkc3QgPSBibG9jay0+Y29lZmZzXzsKKyAgVlA4TUIqIGNvbnN0IGxlZnRfbWIgPSBkZWMtPm1iX2luZm9fIC0gMTsKKyAgdWludDhfdCB0bnosIGxuejsKKyAgdWludDMyX3Qgbm9uX3plcm9feSA9IDA7CisgIHVpbnQzMl90IG5vbl96ZXJvX3V2ID0gMDsKKyAgaW50IHgsIHksIGNoOworICB1aW50MzJfdCBvdXRfdF9ueiwgb3V0X2xfbno7CisgIGludCBmaXJzdDsKKworICBtZW1zZXQoZHN0LCAwLCAzODQgKiBzaXplb2YoKmRzdCkpOworICBpZiAoIWJsb2NrLT5pc19pNHg0XykgeyAgICAvLyBwYXJzZSBEQworICAgIGludDE2X3QgZGNbMTZdID0geyAwIH07CisgICAgY29uc3QgaW50IGN0eCA9IG1iLT5uel9kY18gKyBsZWZ0X21iLT5uel9kY187CisgICAgY29uc3QgaW50IG56ID0gR2V0Q29lZmZzKHRva2VuX2JyLCBiYW5kc1sxXSwgY3R4LCBxLT55Ml9tYXRfLCAwLCBkYyk7CisgICAgbWItPm56X2RjXyA9IGxlZnRfbWItPm56X2RjXyA9IChueiA+IDApOworICAgIGlmIChueiA+IDEpIHsgICAvLyBtb3JlIHRoYW4ganVzdCB0aGUgREMgLT4gcGVyZm9ybSB0aGUgZnVsbCB0cmFuc2Zvcm0KKyAgICAgIFZQOFRyYW5zZm9ybVdIVChkYywgZHN0KTsKKyAgICB9IGVsc2UgeyAgICAgICAgLy8gb25seSBEQyBpcyBub24temVybyAtPiBpbmxpbmVkIHNpbXBsaWZpZWQgdHJhbnNmb3JtCisgICAgICBpbnQgaTsKKyAgICAgIGNvbnN0IGludCBkYzAgPSAoZGNbMF0gKyAzKSA+PiAzOworICAgICAgZm9yIChpID0gMDsgaSA8IDE2ICogMTY7IGkgKz0gMTYpIGRzdFtpXSA9IGRjMDsKKyAgICB9CisgICAgZmlyc3QgPSAxOworICAgIGFjX3Byb2JhID0gYmFuZHNbMF07CisgIH0gZWxzZSB7CisgICAgZmlyc3QgPSAwOworICAgIGFjX3Byb2JhID0gYmFuZHNbM107CisgIH0KKworICB0bnogPSBtYi0+bnpfICYgMHgwZjsKKyAgbG56ID0gbGVmdF9tYi0+bnpfICYgMHgwZjsKKyAgZm9yICh5ID0gMDsgeSA8IDQ7ICsreSkgeworICAgIGludCBsID0gbG56ICYgMTsKKyAgICB1aW50MzJfdCBuel9jb2VmZnMgPSAwOworICAgIGZvciAoeCA9IDA7IHggPCA0OyArK3gpIHsKKyAgICAgIGNvbnN0IGludCBjdHggPSBsICsgKHRueiAmIDEpOworICAgICAgY29uc3QgaW50IG56ID0gR2V0Q29lZmZzKHRva2VuX2JyLCBhY19wcm9iYSwgY3R4LCBxLT55MV9tYXRfLCBmaXJzdCwgZHN0KTsKKyAgICAgIGwgPSAobnogPiBmaXJzdCk7CisgICAgICB0bnogPSAodG56ID4+IDEpIHwgKGwgPDwgNyk7CisgICAgICBuel9jb2VmZnMgPSBOekNvZGVCaXRzKG56X2NvZWZmcywgbnosIGRzdFswXSAhPSAwKTsKKyAgICAgIGRzdCArPSAxNjsKKyAgICB9CisgICAgdG56ID4+PSA0OworICAgIGxueiA9IChsbnogPj4gMSkgfCAobCA8PCA3KTsKKyAgICBub25femVyb195ID0gKG5vbl96ZXJvX3kgPDwgOCkgfCBuel9jb2VmZnM7CisgIH0KKyAgb3V0X3RfbnogPSB0bno7CisgIG91dF9sX256ID0gbG56ID4+IDQ7CisKKyAgZm9yIChjaCA9IDA7IGNoIDwgNDsgY2ggKz0gMikgeworICAgIHVpbnQzMl90IG56X2NvZWZmcyA9IDA7CisgICAgdG56ID0gbWItPm56XyA+PiAoNCArIGNoKTsKKyAgICBsbnogPSBsZWZ0X21iLT5uel8gPj4gKDQgKyBjaCk7CisgICAgZm9yICh5ID0gMDsgeSA8IDI7ICsreSkgeworICAgICAgaW50IGwgPSBsbnogJiAxOworICAgICAgZm9yICh4ID0gMDsgeCA8IDI7ICsreCkgeworICAgICAgICBjb25zdCBpbnQgY3R4ID0gbCArICh0bnogJiAxKTsKKyAgICAgICAgY29uc3QgaW50IG56ID0gR2V0Q29lZmZzKHRva2VuX2JyLCBiYW5kc1syXSwgY3R4LCBxLT51dl9tYXRfLCAwLCBkc3QpOworICAgICAgICBsID0gKG56ID4gMCk7CisgICAgICAgIHRueiA9ICh0bnogPj4gMSkgfCAobCA8PCAzKTsKKyAgICAgICAgbnpfY29lZmZzID0gTnpDb2RlQml0cyhuel9jb2VmZnMsIG56LCBkc3RbMF0gIT0gMCk7CisgICAgICAgIGRzdCArPSAxNjsKKyAgICAgIH0KKyAgICAgIHRueiA+Pj0gMjsKKyAgICAgIGxueiA9IChsbnogPj4gMSkgfCAobCA8PCA1KTsKKyAgICB9CisgICAgLy8gTm90ZTogd2UgZG9uJ3QgcmVhbGx5IG5lZWQgdGhlIHBlci00eDQgZGV0YWlscyBmb3IgVS9WIGJsb2Nrcy4KKyAgICBub25femVyb191diB8PSBuel9jb2VmZnMgPDwgKDQgKiBjaCk7CisgICAgb3V0X3RfbnogfD0gKHRueiA8PCA0KSA8PCBjaDsKKyAgICBvdXRfbF9ueiB8PSAobG56ICYgMHhmMCkgPDwgY2g7CisgIH0KKyAgbWItPm56XyA9IG91dF90X256OworICBsZWZ0X21iLT5uel8gPSBvdXRfbF9uejsKKworICBibG9jay0+bm9uX3plcm9feV8gPSBub25femVyb195OworICBibG9jay0+bm9uX3plcm9fdXZfID0gbm9uX3plcm9fdXY7CisKKyAgLy8gV2UgbG9vayBhdCB0aGUgbW9kZS1jb2RlIG9mIGVhY2ggYmxvY2sgYW5kIGNoZWNrIGlmIHNvbWUgYmxvY2tzIGhhdmUgbGVzcworICAvLyB0aGFuIHRocmVlIG5vbi16ZXJvIGNvZWZmcyAoY29kZSA8IDIpLiBUaGlzIGlzIHRvIGF2b2lkIGRpdGhlcmluZyBmbGF0IGFuZAorICAvLyBlbXB0eSBibG9ja3MuCisgIGJsb2NrLT5kaXRoZXJfID0gKG5vbl96ZXJvX3V2ICYgMHhhYWFhKSA/IDAgOiBxLT5kaXRoZXJfOworCisgIHJldHVybiAhKG5vbl96ZXJvX3kgfCBub25femVyb191dik7ICAvLyB3aWxsIGJlIHVzZWQgZm9yIGZ1cnRoZXIgb3B0aW1pemF0aW9uCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNYWluIGxvb3AKKworaW50IFZQOERlY29kZU1CKFZQOERlY29kZXIqIGNvbnN0IGRlYywgVlA4Qml0UmVhZGVyKiBjb25zdCB0b2tlbl9icikgeworICBWUDhNQiogY29uc3QgbGVmdCA9IGRlYy0+bWJfaW5mb18gLSAxOworICBWUDhNQiogY29uc3QgbWIgPSBkZWMtPm1iX2luZm9fICsgZGVjLT5tYl94XzsKKyAgVlA4TUJEYXRhKiBjb25zdCBibG9jayA9IGRlYy0+bWJfZGF0YV8gKyBkZWMtPm1iX3hfOworICBpbnQgc2tpcCA9IGRlYy0+dXNlX3NraXBfcHJvYmFfID8gYmxvY2stPnNraXBfIDogMDsKKworICBpZiAoIXNraXApIHsKKyAgICBza2lwID0gUGFyc2VSZXNpZHVhbHMoZGVjLCBtYiwgdG9rZW5fYnIpOworICB9IGVsc2UgeworICAgIGxlZnQtPm56XyA9IG1iLT5uel8gPSAwOworICAgIGlmICghYmxvY2stPmlzX2k0eDRfKSB7CisgICAgICBsZWZ0LT5uel9kY18gPSBtYi0+bnpfZGNfID0gMDsKKyAgICB9CisgICAgYmxvY2stPm5vbl96ZXJvX3lfID0gMDsKKyAgICBibG9jay0+bm9uX3plcm9fdXZfID0gMDsKKyAgICBibG9jay0+ZGl0aGVyXyA9IDA7CisgIH0KKworICBpZiAoZGVjLT5maWx0ZXJfdHlwZV8gPiAwKSB7ICAvLyBzdG9yZSBmaWx0ZXIgaW5mbworICAgIFZQOEZJbmZvKiBjb25zdCBmaW5mbyA9IGRlYy0+Zl9pbmZvXyArIGRlYy0+bWJfeF87CisgICAgKmZpbmZvID0gZGVjLT5mc3RyZW5ndGhzX1tibG9jay0+c2VnbWVudF9dW2Jsb2NrLT5pc19pNHg0X107CisgICAgZmluZm8tPmZfaW5uZXJfIHw9ICFza2lwOworICB9CisKKyAgcmV0dXJuICF0b2tlbl9ici0+ZW9mXzsKK30KKwordm9pZCBWUDhJbml0U2NhbmxpbmUoVlA4RGVjb2RlciogY29uc3QgZGVjKSB7CisgIFZQOE1CKiBjb25zdCBsZWZ0ID0gZGVjLT5tYl9pbmZvXyAtIDE7CisgIGxlZnQtPm56XyA9IDA7CisgIGxlZnQtPm56X2RjXyA9IDA7CisgIG1lbXNldChkZWMtPmludHJhX2xfLCBCX0RDX1BSRUQsIHNpemVvZihkZWMtPmludHJhX2xfKSk7CisgIGRlYy0+bWJfeF8gPSAwOworfQorCitzdGF0aWMgaW50IFBhcnNlRnJhbWUoVlA4RGVjb2RlciogY29uc3QgZGVjLCBWUDhJbyogaW8pIHsKKyAgZm9yIChkZWMtPm1iX3lfID0gMDsgZGVjLT5tYl95XyA8IGRlYy0+YnJfbWJfeV87ICsrZGVjLT5tYl95XykgeworICAgIC8vIFBhcnNlIGJpdHN0cmVhbSBmb3IgdGhpcyByb3cuCisgICAgVlA4Qml0UmVhZGVyKiBjb25zdCB0b2tlbl9iciA9CisgICAgICAgICZkZWMtPnBhcnRzX1tkZWMtPm1iX3lfICYgZGVjLT5udW1fcGFydHNfbWludXNfb25lX107CisgICAgaWYgKCFWUDhQYXJzZUludHJhTW9kZVJvdygmZGVjLT5icl8sIGRlYykpIHsKKyAgICAgIHJldHVybiBWUDhTZXRFcnJvcihkZWMsIFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICJQcmVtYXR1cmUgZW5kLW9mLXBhcnRpdGlvbjAgZW5jb3VudGVyZWQuIik7CisgICAgfQorICAgIGZvciAoOyBkZWMtPm1iX3hfIDwgZGVjLT5tYl93XzsgKytkZWMtPm1iX3hfKSB7CisgICAgICBpZiAoIVZQOERlY29kZU1CKGRlYywgdG9rZW5fYnIpKSB7CisgICAgICAgIHJldHVybiBWUDhTZXRFcnJvcihkZWMsIFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByZW1hdHVyZSBlbmQtb2YtZmlsZSBlbmNvdW50ZXJlZC4iKTsKKyAgICAgIH0KKyAgICB9CisgICAgVlA4SW5pdFNjYW5saW5lKGRlYyk7ICAgLy8gUHJlcGFyZSBmb3IgbmV4dCBzY2FubGluZQorCisgICAgLy8gUmVjb25zdHJ1Y3QsIGZpbHRlciBhbmQgZW1pdCB0aGUgcm93LgorICAgIGlmICghVlA4UHJvY2Vzc1JvdyhkZWMsIGlvKSkgeworICAgICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19VU0VSX0FCT1JULCAiT3V0cHV0IGFib3J0ZWQuIik7CisgICAgfQorICB9CisgIGlmIChkZWMtPm10X21ldGhvZF8gPiAwKSB7CisgICAgaWYgKCFXZWJQR2V0V29ya2VySW50ZXJmYWNlKCktPlN5bmMoJmRlYy0+d29ya2VyXykpIHJldHVybiAwOworICB9CisKKyAgcmV0dXJuIDE7Cit9CisKKy8vIE1haW4gZW50cnkgcG9pbnQKK2ludCBWUDhEZWNvZGUoVlA4RGVjb2RlciogY29uc3QgZGVjLCBWUDhJbyogY29uc3QgaW8pIHsKKyAgaW50IG9rID0gMDsKKyAgaWYgKGRlYyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGlvID09IE5VTEwpIHsKKyAgICByZXR1cm4gVlA4U2V0RXJyb3IoZGVjLCBWUDhfU1RBVFVTX0lOVkFMSURfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICJOVUxMIFZQOElvIHBhcmFtZXRlciBpbiBWUDhEZWNvZGUoKS4iKTsKKyAgfQorCisgIGlmICghZGVjLT5yZWFkeV8pIHsKKyAgICBpZiAoIVZQOEdldEhlYWRlcnMoZGVjLCBpbykpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorICBhc3NlcnQoZGVjLT5yZWFkeV8pOworCisgIC8vIEZpbmlzaCBzZXR0aW5nIHVwIHRoZSBkZWNvZGluZyBwYXJhbWV0ZXIuIFdpbGwgY2FsbCBpby0+c2V0dXAoKS4KKyAgb2sgPSAoVlA4RW50ZXJDcml0aWNhbChkZWMsIGlvKSA9PSBWUDhfU1RBVFVTX09LKTsKKyAgaWYgKG9rKSB7ICAgLy8gZ29vZCB0byBnby4KKyAgICAvLyBXaWxsIGFsbG9jYXRlIG1lbW9yeSBhbmQgcHJlcGFyZSBldmVyeXRoaW5nLgorICAgIGlmIChvaykgb2sgPSBWUDhJbml0RnJhbWUoZGVjLCBpbyk7CisKKyAgICAvLyBNYWluIGRlY29kaW5nIGxvb3AKKyAgICBpZiAob2spIG9rID0gUGFyc2VGcmFtZShkZWMsIGlvKTsKKworICAgIC8vIEV4aXQuCisgICAgb2sgJj0gVlA4RXhpdENyaXRpY2FsKGRlYywgaW8pOworICB9CisKKyAgaWYgKCFvaykgeworICAgIFZQOENsZWFyKGRlYyk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBkZWMtPnJlYWR5XyA9IDA7CisgIHJldHVybiBvazsKK30KKwordm9pZCBWUDhDbGVhcihWUDhEZWNvZGVyKiBjb25zdCBkZWMpIHsKKyAgaWYgKGRlYyA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIFdlYlBHZXRXb3JrZXJJbnRlcmZhY2UoKS0+RW5kKCZkZWMtPndvcmtlcl8pOworICBXZWJQRGVhbGxvY2F0ZUFscGhhTWVtb3J5KGRlYyk7CisgIFdlYlBTYWZlRnJlZShkZWMtPm1lbV8pOworICBkZWMtPm1lbV8gPSBOVUxMOworICBkZWMtPm1lbV9zaXplXyA9IDA7CisgIG1lbXNldCgmZGVjLT5icl8sIDAsIHNpemVvZihkZWMtPmJyXykpOworICBkZWMtPnJlYWR5XyA9IDA7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL3ZwOF9kZWMuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvdnA4X2RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhODViMzQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL3ZwOF9kZWMuaApAQCAtMCwwICsxLDE4NSBAQAorLy8gQ29weXJpZ2h0IDIwMTAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICBMb3ctbGV2ZWwgQVBJIGZvciBWUDggZGVjb2RlcgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpZm5kZWYgV0VCUF9ERUNfVlA4X0RFQ19IXworI2RlZmluZSBXRUJQX0RFQ19WUDhfREVDX0hfCisKKyNpbmNsdWRlICJzcmMvd2VicC9kZWNvZGUuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTG93ZXItbGV2ZWwgQVBJCisvLworLy8gVGhlc2UgZnVuY3Rpb25zIHByb3ZpZGUgZmluZS1ncmFpbmVkIGNvbnRyb2wgb2YgdGhlIGRlY29kaW5nIHByb2Nlc3MuCisvLyBUaGUgY2FsbCBmbG93IHNob3VsZCByZXNlbWJsZToKKy8vCisvLyAgIFZQOElvIGlvOworLy8gICBWUDhJbml0SW8oJmlvKTsKKy8vICAgaW8uZGF0YSA9IGRhdGE7CisvLyAgIGlvLmRhdGFfc2l6ZSA9IHNpemU7CisvLyAgIC8qIGN1c3RvbWl6ZSBpbydzIGZ1bmN0aW9ucyAoc2V0dXAoKS9wdXQoKS90ZWFyZG93bigpKSBpZiBuZWVkZWQuICovCisvLworLy8gICBWUDhEZWNvZGVyKiBkZWMgPSBWUDhOZXcoKTsKKy8vICAgaW50IG9rID0gVlA4RGVjb2RlKGRlYywgJmlvKTsKKy8vICAgaWYgKCFvaykgcHJpbnRmKCJFcnJvcjogJXNcbiIsIFZQOFN0YXR1c01lc3NhZ2UoZGVjKSk7CisvLyAgIFZQOERlbGV0ZShkZWMpOworLy8gICByZXR1cm4gb2s7CisKKy8vIElucHV0IC8gT3V0cHV0Cit0eXBlZGVmIHN0cnVjdCBWUDhJbyBWUDhJbzsKK3R5cGVkZWYgaW50ICgqVlA4SW9QdXRIb29rKShjb25zdCBWUDhJbyogaW8pOwordHlwZWRlZiBpbnQgKCpWUDhJb1NldHVwSG9vaykoVlA4SW8qIGlvKTsKK3R5cGVkZWYgdm9pZCAoKlZQOElvVGVhcmRvd25Ib29rKShjb25zdCBWUDhJbyogaW8pOworCitzdHJ1Y3QgVlA4SW8geworICAvLyBzZXQgYnkgVlA4R2V0SGVhZGVycygpCisgIGludCB3aWR0aCwgaGVpZ2h0OyAgICAgICAgIC8vIHBpY3R1cmUgZGltZW5zaW9ucywgaW4gcGl4ZWxzIChpbnZhcmlhYmxlKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlc2UgYXJlIHRoZSBvcmlnaW5hbCwgdW5jcm9wcGVkIGRpbWVuc2lvbnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBhY3R1YWwgYXJlYSBwYXNzZWQgdG8gcHV0KCkgaXMgc3RvcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIG1iX3cgLyBtYl9oIGZpZWxkcy4KKworICAvLyBzZXQgYmVmb3JlIGNhbGxpbmcgcHV0KCkKKyAgaW50IG1iX3k7ICAgICAgICAgICAgICAgICAgLy8gcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgcm93cyAoaW4gcGl4ZWxzKQorICBpbnQgbWJfdzsgICAgICAgICAgICAgICAgICAvLyBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgc2FtcGxlCisgIGludCBtYl9oOyAgICAgICAgICAgICAgICAgIC8vIG51bWJlciBvZiByb3dzIGluIHRoZSBzYW1wbGUKKyAgY29uc3QgdWludDhfdCogeSwgKnUsICp2OyAgLy8gcm93cyB0byBjb3B5IChpbiB5dXY0MjAgZm9ybWF0KQorICBpbnQgeV9zdHJpZGU7ICAgICAgICAgICAgICAvLyByb3cgc3RyaWRlIGZvciBsdW1hCisgIGludCB1dl9zdHJpZGU7ICAgICAgICAgICAgIC8vIHJvdyBzdHJpZGUgZm9yIGNocm9tYQorCisgIHZvaWQqIG9wYXF1ZTsgICAgICAgICAgICAgIC8vIHVzZXIgZGF0YQorCisgIC8vIGNhbGxlZCB3aGVuIGZyZXNoIHNhbXBsZXMgYXJlIGF2YWlsYWJsZS4gQ3VycmVudGx5LCBzYW1wbGVzIGFyZSBpbgorICAvLyBZVVY0MjAgZm9ybWF0LCBhbmQgY2FuIGJlIHVwIHRvIHdpZHRoIHggMjQgaW4gc2l6ZSAoZGVwZW5kaW5nIG9uIHRoZQorICAvLyBpbi1sb29wIGZpbHRlcmluZyBsZXZlbCwgZS5nLikuIFNob3VsZCByZXR1cm4gZmFsc2UgaW4gY2FzZSBvZiBlcnJvcgorICAvLyBvciBhYm9ydCByZXF1ZXN0LiBUaGUgYWN0dWFsIHNpemUgb2YgdGhlIGFyZWEgdG8gdXBkYXRlIGlzIG1iX3cgeCBtYl9oCisgIC8vIGluIHNpemUsIHRha2luZyBjcm9wcGluZyBpbnRvIGFjY291bnQuCisgIFZQOElvUHV0SG9vayBwdXQ7CisKKyAgLy8gY2FsbGVkIGp1c3QgYmVmb3JlIHN0YXJ0aW5nIHRvIGRlY29kZSB0aGUgYmxvY2tzLgorICAvLyBNdXN0IHJldHVybiBmYWxzZSBpbiBjYXNlIG9mIHNldHVwIGVycm9yLCB0cnVlIG90aGVyd2lzZS4gSWYgZmFsc2UgaXMKKyAgLy8gcmV0dXJuZWQsIHRlYXJkb3duKCkgd2lsbCBOT1QgYmUgY2FsbGVkLiBCdXQgaWYgdGhlIHNldHVwIHN1Y2NlZWRlZAorICAvLyBhbmQgdHJ1ZSBpcyByZXR1cm5lZCwgdGhlbiB0ZWFyZG93bigpIHdpbGwgYWx3YXlzIGJlIGNhbGxlZCBhZnRlcndhcmQuCisgIFZQOElvU2V0dXBIb29rIHNldHVwOworCisgIC8vIENhbGxlZCBqdXN0IGFmdGVyIGJsb2NrIGRlY29kaW5nIGlzIGZpbmlzaGVkIChvciB3aGVuIGFuIGVycm9yIG9jY3VycmVkCisgIC8vIGR1cmluZyBwdXQoKSkuIElzIE5PVCBjYWxsZWQgaWYgc2V0dXAoKSBmYWlsZWQuCisgIFZQOElvVGVhcmRvd25Ib29rIHRlYXJkb3duOworCisgIC8vIHRoaXMgaXMgYSByZWNvbW1lbmRhdGlvbiBmb3IgdGhlIHVzZXItc2lkZSB5dXYtPnJnYiBjb252ZXJ0ZXIuIFRoaXMgZmxhZworICAvLyBpcyBzZXQgd2hlbiBjYWxsaW5nIHNldHVwKCkgaG9vayBhbmQgY2FuIGJlIG92ZXJ3cml0dGVuIGJ5IGl0LiBJdCB0aGVuCisgIC8vIGNhbiBiZSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb24gZHVyaW5nIHRoZSBwdXQoKSBtZXRob2QuCisgIGludCBmYW5jeV91cHNhbXBsaW5nOworCisgIC8vIElucHV0IGJ1ZmZlci4KKyAgc2l6ZV90IGRhdGFfc2l6ZTsKKyAgY29uc3QgdWludDhfdCogZGF0YTsKKworICAvLyBJZiB0cnVlLCBpbi1sb29wIGZpbHRlcmluZyB3aWxsIG5vdCBiZSBwZXJmb3JtZWQgZXZlbiBpZiBwcmVzZW50IGluIHRoZQorICAvLyBiaXRzdHJlYW0uIFN3aXRjaGluZyBvZmYgZmlsdGVyaW5nIG1heSBzcGVlZCB1cCBkZWNvZGluZyBhdCB0aGUgZXhwZW5zZQorICAvLyBvZiBtb3JlIHZpc2libGUgYmxvY2tpbmcuIE5vdGUgdGhhdCBvdXRwdXQgd2lsbCBhbHNvIGJlIG5vbi1jb21wbGlhbnQKKyAgLy8gd2l0aCB0aGUgVlA4IHNwZWNpZmljYXRpb25zLgorICBpbnQgYnlwYXNzX2ZpbHRlcmluZzsKKworICAvLyBDcm9wcGluZyBwYXJhbWV0ZXJzLgorICBpbnQgdXNlX2Nyb3BwaW5nOworICBpbnQgY3JvcF9sZWZ0LCBjcm9wX3JpZ2h0LCBjcm9wX3RvcCwgY3JvcF9ib3R0b207CisKKyAgLy8gU2NhbGluZyBwYXJhbWV0ZXJzLgorICBpbnQgdXNlX3NjYWxpbmc7CisgIGludCBzY2FsZWRfd2lkdGgsIHNjYWxlZF9oZWlnaHQ7CisKKyAgLy8gSWYgbm9uIE5VTEwsIHBvaW50ZXIgdG8gdGhlIGFscGhhIGRhdGEgKGlmIHByZXNlbnQpIGNvcnJlc3BvbmRpbmcgdG8gdGhlCisgIC8vIHN0YXJ0IG9mIHRoZSBjdXJyZW50IHJvdyAoVGhhdCBpczogaXQgaXMgcHJlLW9mZnNldCBieSBtYl95IGFuZCB0YWtlcworICAvLyBjcm9wcGluZyBpbnRvIGFjY291bnQpLgorICBjb25zdCB1aW50OF90KiBhOworfTsKKworLy8gSW50ZXJuYWwsIHZlcnNpb24tY2hlY2tlZCwgZW50cnkgcG9pbnQKK2ludCBWUDhJbml0SW9JbnRlcm5hbChWUDhJbyogY29uc3QsIGludCk7CisKKy8vIFNldCB0aGUgY3VzdG9tIElPIGZ1bmN0aW9uIHBvaW50ZXJzIGFuZCB1c2VyLWRhdGEuIFRoZSBzZXR0ZXIgZm9yIElPIGhvb2tzCisvLyBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBpbml0aWF0aW5nIGluY3JlbWVudGFsIGRlY29kaW5nLiBSZXR1cm5zIHRydWUgaWYKKy8vIFdlYlBJRGVjb2RlciBvYmplY3QgaXMgc3VjY2Vzc2Z1bGx5IG1vZGlmaWVkLCBmYWxzZSBvdGhlcndpc2UuCitpbnQgV2ViUElTZXRJT0hvb2tzKFdlYlBJRGVjb2RlciogY29uc3QgaWRlYywKKyAgICAgICAgICAgICAgICAgICAgVlA4SW9QdXRIb29rIHB1dCwKKyAgICAgICAgICAgICAgICAgICAgVlA4SW9TZXR1cEhvb2sgc2V0dXAsCisgICAgICAgICAgICAgICAgICAgIFZQOElvVGVhcmRvd25Ib29rIHRlYXJkb3duLAorICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyX2RhdGEpOworCisvLyBNYWluIGRlY29kaW5nIG9iamVjdC4gVGhpcyBpcyBhbiBvcGFxdWUgc3RydWN0dXJlLgordHlwZWRlZiBzdHJ1Y3QgVlA4RGVjb2RlciBWUDhEZWNvZGVyOworCisvLyBDcmVhdGUgYSBuZXcgZGVjb2RlciBvYmplY3QuCitWUDhEZWNvZGVyKiBWUDhOZXcodm9pZCk7CisKKy8vIE11c3QgYmUgY2FsbGVkIHRvIG1ha2Ugc3VyZSAnaW8nIGlzIGluaXRpYWxpemVkIHByb3Blcmx5LgorLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIHZlcnNpb24gbWlzbWF0Y2guIFVwb24gc3VjaCBmYWlsdXJlLCBubyBvdGhlcgorLy8gZGVjb2RpbmcgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCAoVlA4RGVjb2RlLCBWUDhHZXRIZWFkZXJzLCAuLi4pCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOEluaXRJbyhWUDhJbyogY29uc3QgaW8pIHsKKyAgcmV0dXJuIFZQOEluaXRJb0ludGVybmFsKGlvLCBXRUJQX0RFQ09ERVJfQUJJX1ZFUlNJT04pOworfQorCisvLyBEZWNvZGUgdGhlIFZQOCBmcmFtZSBoZWFkZXIuIFJldHVybnMgdHJ1ZSBpZiBvay4KKy8vIE5vdGU6ICdpby0+ZGF0YScgbXVzdCBiZSBwb2ludGluZyB0byB0aGUgc3RhcnQgb2YgdGhlIFZQOCBmcmFtZSBoZWFkZXIuCitpbnQgVlA4R2V0SGVhZGVycyhWUDhEZWNvZGVyKiBjb25zdCBkZWMsIFZQOElvKiBjb25zdCBpbyk7CisKKy8vIERlY29kZSBhIHBpY3R1cmUuIFdpbGwgY2FsbCBWUDhHZXRIZWFkZXJzKCkgaWYgaXQgd2Fzbid0IGRvbmUgYWxyZWFkeS4KKy8vIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiBlcnJvci4KK2ludCBWUDhEZWNvZGUoVlA4RGVjb2RlciogY29uc3QgZGVjLCBWUDhJbyogY29uc3QgaW8pOworCisvLyBSZXR1cm4gY3VycmVudCBzdGF0dXMgb2YgdGhlIGRlY29kZXI6CitWUDhTdGF0dXNDb2RlIFZQOFN0YXR1cyhWUDhEZWNvZGVyKiBjb25zdCBkZWMpOworCisvLyByZXR1cm4gcmVhZGFibGUgc3RyaW5nIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGxhc3Qgc3RhdHVzLgorY29uc3QgY2hhciogVlA4U3RhdHVzTWVzc2FnZShWUDhEZWNvZGVyKiBjb25zdCBkZWMpOworCisvLyBSZXNldHMgdGhlIGRlY29kZXIgaW4gaXRzIGluaXRpYWwgc3RhdGUsIHJlY2xhaW1pbmcgbWVtb3J5LgorLy8gTm90IGEgbWFuZGF0b3J5IGNhbGwgYmV0d2VlbiBjYWxscyB0byBWUDhEZWNvZGUoKS4KK3ZvaWQgVlA4Q2xlYXIoVlA4RGVjb2RlciogY29uc3QgZGVjKTsKKworLy8gRGVzdHJveSB0aGUgZGVjb2RlciBvYmplY3QuCit2b2lkIFZQOERlbGV0ZShWUDhEZWNvZGVyKiBjb25zdCBkZWMpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWlzY2VsbGFuZW91cyBWUDgvVlA4TCBiaXRzdHJlYW0gcHJvYmluZyBmdW5jdGlvbnMuCisKKy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgbmV4dCAzIGJ5dGVzIGluIGRhdGEgY29udGFpbiB0aGUgVlA4IHNpZ25hdHVyZS4KK1dFQlBfRVhURVJOIGludCBWUDhDaGVja1NpZ25hdHVyZShjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBzaXplX3QgZGF0YV9zaXplKTsKKworLy8gVmFsaWRhdGVzIHRoZSBWUDggZGF0YS1oZWFkZXIgYW5kIHJldHJpZXZlcyBiYXNpYyBoZWFkZXIgaW5mb3JtYXRpb24gdml6CisvLyB3aWR0aCBhbmQgaGVpZ2h0LiBSZXR1cm5zIDAgaW4gY2FzZSBvZiBmb3JtYXR0aW5nIGVycm9yLiAqd2lkdGgvKmhlaWdodAorLy8gY2FuIGJlIHBhc3NlZCBOVUxMLgorV0VCUF9FWFRFUk4gaW50IFZQOEdldEluZm8oCisgICAgY29uc3QgdWludDhfdCogZGF0YSwKKyAgICBzaXplX3QgZGF0YV9zaXplLCAgICAvLyBkYXRhIGF2YWlsYWJsZSBzbyBmYXIKKyAgICBzaXplX3QgY2h1bmtfc2l6ZSwgICAvLyB0b3RhbCBkYXRhIHNpemUgZXhwZWN0ZWQgaW4gdGhlIGNodW5rCisgICAgaW50KiBjb25zdCB3aWR0aCwgaW50KiBjb25zdCBoZWlnaHQpOworCisvLyBSZXR1cm5zIHRydWUgaWYgdGhlIG5leHQgYnl0ZShzKSBpbiBkYXRhIGlzIGEgVlA4TCBzaWduYXR1cmUuCitXRUJQX0VYVEVSTiBpbnQgVlA4TENoZWNrU2lnbmF0dXJlKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsIHNpemVfdCBzaXplKTsKKworLy8gVmFsaWRhdGVzIHRoZSBWUDhMIGRhdGEtaGVhZGVyIGFuZCByZXRyaWV2ZXMgYmFzaWMgaGVhZGVyIGluZm9ybWF0aW9uIHZpegorLy8gd2lkdGgsIGhlaWdodCBhbmQgYWxwaGEuIFJldHVybnMgMCBpbiBjYXNlIG9mIGZvcm1hdHRpbmcgZXJyb3IuCisvLyB3aWR0aC9oZWlnaHQvaGFzX2FscGhhIGNhbiBiZSBwYXNzZWQgTlVMTC4KK1dFQlBfRVhURVJOIGludCBWUDhMR2V0SW5mbygKKyAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLCAgLy8gZGF0YSBhdmFpbGFibGUgc28gZmFyCisgICAgaW50KiBjb25zdCB3aWR0aCwgaW50KiBjb25zdCBoZWlnaHQsIGludCogY29uc3QgaGFzX2FscGhhKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8qIFdFQlBfREVDX1ZQOF9ERUNfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvdnA4aV9kZWMuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvdnA4aV9kZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2IwZGJkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlYy92cDhpX2RlYy5oCkBAIC0wLDAgKzEsMzIyIEBACisvLyBDb3B5cmlnaHQgMjAxMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVlA4IGRlY29kZXI6IGludGVybmFsIGhlYWRlci4KKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaWZuZGVmIFdFQlBfREVDX1ZQOElfREVDX0hfCisjZGVmaW5lIFdFQlBfREVDX1ZQOElfREVDX0hfCisKKyNpZiAhZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSA8c3RyaW5nLmg+ICAgICAvLyBmb3IgbWVtY3B5KCkKKyNlbmRpZgorCisjaW5jbHVkZSAic3JjL2RlYy9jb21tb25fZGVjLmgiCisjaW5jbHVkZSAic3JjL2RlYy92cDhsaV9kZWMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvYml0X3JlYWRlcl91dGlscy5oIgorI2luY2x1ZGUgInNyYy91dGlscy9yYW5kb21fdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdGhyZWFkX3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVmFyaW91cyBkZWZpbmVzIGFuZCBlbnVtcworCisvLyB2ZXJzaW9uIG51bWJlcnMKKyNkZWZpbmUgREVDX01BSl9WRVJTSU9OIDEKKyNkZWZpbmUgREVDX01JTl9WRVJTSU9OIDAKKyNkZWZpbmUgREVDX1JFVl9WRVJTSU9OIDAKKworLy8gWVVWLWNhY2hlIHBhcmFtZXRlcnMuIENhY2hlIGlzIDMyLWJ5dGVzIHdpZGUgKD0gb25lIGNhY2hlbGluZSkuCisvLyBDb25zdHJhaW50cyBhcmU6IFdlIG5lZWQgdG8gc3RvcmUgb25lIDE2eDE2IGJsb2NrIG9mIGx1bWEgc2FtcGxlcyAoeSksCisvLyBhbmQgdHdvIDh4OCBjaHJvbWEgYmxvY2tzICh1L3YpLiBUaGVzZSBhcmUgYmV0dGVyIGJlIDE2LWJ5dGVzIGFsaWduZWQsCisvLyBpbiBvcmRlciB0byBiZSBTSU1ELWZyaWVuZGx5LiBXZSBhbHNvIG5lZWQgdG8gc3RvcmUgdGhlIHRvcCwgbGVmdCBhbmQKKy8vIHRvcC1sZWZ0IHNhbXBsZXMgKGZyb20gcHJldmlvdXNseSBkZWNvZGVkIGJsb2NrcyksIGFsb25nIHdpdGggZm91cgorLy8gZXh0cmEgdG9wLXJpZ2h0IHNhbXBsZXMgZm9yIGx1bWEgKGludHJhNHg0IHByZWRpY3Rpb24gb25seSkuCisvLyBPbmUgcG9zc2libGUgbGF5b3V0IGlzLCB1c2luZyAzMiAqICgxNyArIDkpIGJ5dGVzOgorLy8KKy8vICAgListLS0tLS0gICA8LSBvbmx5IDEgcGl4ZWwgaGlnaAorLy8gICAufHl5eXl0LgorLy8gICAufHl5eXl0LgorLy8gICAufHl5eXl0LgorLy8gICAufHl5eXkuLgorLy8gICAuKy0tListLSAgIDwtIG9ubHkgMSBwaXhlbCBoaWdoCisvLyAgIC58dXUufHZ2CisvLyAgIC58dXUufHZ2CisvLworLy8gRXZlcnkgY2hhcmFjdGVyIGlzIGEgNHg0IGJsb2NrLCB3aXRoIGxlZ2VuZDoKKy8vICAnLicgPSB1bnVzZWQKKy8vICAneScgPSB5LXNhbXBsZXMgICAndScgPSB1LXNhbXBsZXMgICAgICd2JyA9IHUtc2FtcGxlcworLy8gICd8JyA9IGxlZnQgc2FtcGxlLCAgICctJyA9IHRvcCBzYW1wbGUsICAgICcrJyA9IHRvcC1sZWZ0IHNhbXBsZQorLy8gICd0JyA9IGV4dHJhIHRvcC1yaWdodCBzYW1wbGUgZm9yIDR4NCBtb2RlcworI2RlZmluZSBZVVZfU0laRSAoQlBTICogMTcgKyBCUFMgKiA5KQorI2RlZmluZSBZX09GRiAgICAoQlBTICogMSArIDgpCisjZGVmaW5lIFVfT0ZGICAgIChZX09GRiArIEJQUyAqIDE2ICsgQlBTKQorI2RlZmluZSBWX09GRiAgICAoVV9PRkYgKyAxNikKKworLy8gbWluaW1hbCB3aWR0aCB1bmRlciB3aGljaCBsb3NzeSBtdWx0aS10aHJlYWRpbmcgaXMgYWx3YXlzIGRpc2FibGVkCisjZGVmaW5lIE1JTl9XSURUSF9GT1JfVEhSRUFEUyA1MTIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhlYWRlcnMKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50OF90IGtleV9mcmFtZV87CisgIHVpbnQ4X3QgcHJvZmlsZV87CisgIHVpbnQ4X3Qgc2hvd187CisgIHVpbnQzMl90IHBhcnRpdGlvbl9sZW5ndGhfOworfSBWUDhGcmFtZUhlYWRlcjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MTZfdCB3aWR0aF87CisgIHVpbnQxNl90IGhlaWdodF87CisgIHVpbnQ4X3QgeHNjYWxlXzsKKyAgdWludDhfdCB5c2NhbGVfOworICB1aW50OF90IGNvbG9yc3BhY2VfOyAgIC8vIDAgPSBZQ2JDcgorICB1aW50OF90IGNsYW1wX3R5cGVfOworfSBWUDhQaWN0dXJlSGVhZGVyOworCisvLyBzZWdtZW50IGZlYXR1cmVzCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCB1c2Vfc2VnbWVudF87CisgIGludCB1cGRhdGVfbWFwXzsgICAgICAgIC8vIHdoZXRoZXIgdG8gdXBkYXRlIHRoZSBzZWdtZW50IG1hcCBvciBub3QKKyAgaW50IGFic29sdXRlX2RlbHRhXzsgICAgLy8gYWJzb2x1dGUgb3IgZGVsdGEgdmFsdWVzIGZvciBxdWFudGl6ZXIgYW5kIGZpbHRlcgorICBpbnQ4X3QgcXVhbnRpemVyX1tOVU1fTUJfU0VHTUVOVFNdOyAgICAgICAgLy8gcXVhbnRpemF0aW9uIGNoYW5nZXMKKyAgaW50OF90IGZpbHRlcl9zdHJlbmd0aF9bTlVNX01CX1NFR01FTlRTXTsgIC8vIGZpbHRlciBzdHJlbmd0aCBmb3Igc2VnbWVudHMKK30gVlA4U2VnbWVudEhlYWRlcjsKKworLy8gcHJvYmFzIGFzc29jaWF0ZWQgdG8gb25lIG9mIHRoZSBjb250ZXh0cwordHlwZWRlZiB1aW50OF90IFZQOFByb2JhQXJyYXlbTlVNX1BST0JBU107CisKK3R5cGVkZWYgc3RydWN0IHsgICAvLyBhbGwgdGhlIHByb2JhcyBhc3NvY2lhdGVkIHRvIG9uZSBiYW5kCisgIFZQOFByb2JhQXJyYXkgcHJvYmFzX1tOVU1fQ1RYXTsKK30gVlA4QmFuZFByb2JhczsKKworLy8gU3RydWN0IGNvbGxlY3RpbmcgYWxsIGZyYW1lLXBlcnNpc3RlbnQgcHJvYmFiaWxpdGllcy4KK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDhfdCBzZWdtZW50c19bTUJfRkVBVFVSRV9UUkVFX1BST0JTXTsKKyAgLy8gVHlwZTogMDpJbnRyYTE2LUFDICAxOkludHJhMTYtREMgICAyOkNocm9tYSAgIDM6SW50cmE0CisgIFZQOEJhbmRQcm9iYXMgYmFuZHNfW05VTV9UWVBFU11bTlVNX0JBTkRTXTsKKyAgY29uc3QgVlA4QmFuZFByb2JhcyogYmFuZHNfcHRyX1tOVU1fVFlQRVNdWzE2ICsgMV07Cit9IFZQOFByb2JhOworCisvLyBGaWx0ZXIgcGFyYW1ldGVycwordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQgc2ltcGxlXzsgICAgICAgICAgICAgICAgICAvLyAwPWNvbXBsZXgsIDE9c2ltcGxlCisgIGludCBsZXZlbF87ICAgICAgICAgICAgICAgICAgIC8vIFswLi42M10KKyAgaW50IHNoYXJwbmVzc187ICAgICAgICAgICAgICAgLy8gWzAuLjddCisgIGludCB1c2VfbGZfZGVsdGFfOworICBpbnQgcmVmX2xmX2RlbHRhX1tOVU1fUkVGX0xGX0RFTFRBU107CisgIGludCBtb2RlX2xmX2RlbHRhX1tOVU1fTU9ERV9MRl9ERUxUQVNdOworfSBWUDhGaWx0ZXJIZWFkZXI7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbmZvcm1hdGlvbnMgYWJvdXQgdGhlIG1hY3JvYmxvY2tzLgorCit0eXBlZGVmIHN0cnVjdCB7ICAvLyBmaWx0ZXIgc3BlY3MKKyAgdWludDhfdCBmX2xpbWl0XzsgICAgICAvLyBmaWx0ZXIgbGltaXQgaW4gWzMuLjE4OV0sIG9yIDAgaWYgbm8gZmlsdGVyaW5nCisgIHVpbnQ4X3QgZl9pbGV2ZWxfOyAgICAgLy8gaW5uZXIgbGltaXQgaW4gWzEuLjYzXQorICB1aW50OF90IGZfaW5uZXJfOyAgICAgIC8vIGRvIGlubmVyIGZpbHRlcmluZz8KKyAgdWludDhfdCBoZXZfdGhyZXNoXzsgICAvLyBoaWdoIGVkZ2UgdmFyaWFuY2UgdGhyZXNob2xkIGluIFswLi4yXQorfSBWUDhGSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgeyAgLy8gVG9wL0xlZnQgQ29udGV4dHMgdXNlZCBmb3Igc3ludGF4LXBhcnNpbmcKKyAgdWludDhfdCBuel87ICAgICAgICAvLyBub24temVybyBBQy9EQyBjb2VmZnMgKDRiaXQgZm9yIGx1bWEgKyA0Yml0IGZvciBjaHJvbWEpCisgIHVpbnQ4X3QgbnpfZGNfOyAgICAgLy8gbm9uLXplcm8gREMgY29lZmYgKDFiaXQpCit9IFZQOE1COworCisvLyBEZXF1YW50aXphdGlvbiBtYXRyaWNlcwordHlwZWRlZiBpbnQgcXVhbnRfdFsyXTsgICAgICAvLyBbREMgLyBBQ10uICBDYW4gYmUgJ3VpbnQxNl90WzJdJyB0b28gKH5zbG93ZXIpLgordHlwZWRlZiBzdHJ1Y3QgeworICBxdWFudF90IHkxX21hdF8sIHkyX21hdF8sIHV2X21hdF87CisKKyAgaW50IHV2X3F1YW50XzsgICAvLyBVL1YgcXVhbnRpemVyIHZhbHVlCisgIGludCBkaXRoZXJfOyAgICAgLy8gZGl0aGVyaW5nIGFtcGxpdHVkZSAoMCA9IG9mZiwgbWF4PTI1NSkKK30gVlA4UXVhbnRNYXRyaXg7CisKKy8vIERhdGEgbmVlZGVkIHRvIHJlY29uc3RydWN0IGEgbWFjcm9ibG9jawordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQxNl90IGNvZWZmc19bMzg0XTsgICAvLyAzODQgY29lZmZzID0gKDE2KzQrNCkgKiA0KjQKKyAgdWludDhfdCBpc19pNHg0XzsgICAgICAgLy8gdHJ1ZSBpZiBpbnRyYTR4NAorICB1aW50OF90IGltb2Rlc19bMTZdOyAgICAvLyBvbmUgMTZ4MTYgbW9kZSAoIzApIG9yIHNpeHRlZW4gNHg0IG1vZGVzCisgIHVpbnQ4X3QgdXZtb2RlXzsgICAgICAgIC8vIGNocm9tYSBwcmVkaWN0aW9uIG1vZGUKKyAgLy8gYml0LXdpc2UgaW5mbyBhYm91dCB0aGUgY29udGVudCBvZiBlYWNoIHN1Yi00eDQgYmxvY2tzIChpbiBkZWNvZGluZyBvcmRlcikuCisgIC8vIEVhY2ggb2YgdGhlIDR4NCBibG9ja3MgZm9yIHkvdS92IGlzIGFzc29jaWF0ZWQgd2l0aCBhIDJiIGNvZGUgYWNjb3JkaW5nIHRvOgorICAvLyAgIGNvZGU9MCAtPiBubyBjb2VmZmljaWVudAorICAvLyAgIGNvZGU9MSAtPiBvbmx5IERDCisgIC8vICAgY29kZT0yIC0+IGZpcnN0IHRocmVlIGNvZWZmaWNpZW50cyBhcmUgbm9uLXplcm8KKyAgLy8gICBjb2RlPTMgLT4gbW9yZSB0aGFuIHRocmVlIGNvZWZmaWNpZW50cyBhcmUgbm9uLXplcm8KKyAgLy8gVGhpcyBhbGxvd3MgdG8gY2FsbCBzcGVjaWFsaXplZCB0cmFuc2Zvcm0gZnVuY3Rpb25zLgorICB1aW50MzJfdCBub25femVyb195XzsKKyAgdWludDMyX3Qgbm9uX3plcm9fdXZfOworICB1aW50OF90IGRpdGhlcl87ICAgICAgLy8gbG9jYWwgZGl0aGVyaW5nIHN0cmVuZ3RoIChkZWR1Y2VkIGZyb20gbm9uX3plcm9fKikKKyAgdWludDhfdCBza2lwXzsKKyAgdWludDhfdCBzZWdtZW50XzsKK30gVlA4TUJEYXRhOworCisvLyBQZXJzaXN0ZW50IGluZm9ybWF0aW9uIG5lZWRlZCBieSB0aGUgcGFyYWxsZWwgcHJvY2Vzc2luZwordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQgaWRfOyAgICAgICAgICAgICAgLy8gY2FjaGUgcm93IHRvIHByb2Nlc3MgKGluIFswLi4yXSkKKyAgaW50IG1iX3lfOyAgICAgICAgICAgIC8vIG1hY3JvYmxvY2sgcG9zaXRpb24gb2YgdGhlIHJvdworICBpbnQgZmlsdGVyX3Jvd187ICAgICAgLy8gdHJ1ZSBpZiByb3ctZmlsdGVyaW5nIGlzIG5lZWRlZAorICBWUDhGSW5mbyogZl9pbmZvXzsgICAgLy8gZmlsdGVyIHN0cmVuZ3RocyAoc3dhcHBlZCB3aXRoIGRlYy0+Zl9pbmZvXykKKyAgVlA4TUJEYXRhKiBtYl9kYXRhXzsgIC8vIHJlY29uc3RydWN0aW9uIGRhdGEgKHN3YXBwZWQgd2l0aCBkZWMtPm1iX2RhdGFfKQorICBWUDhJbyBpb187ICAgICAgICAgICAgLy8gY29weSBvZiB0aGUgVlA4SW8gdG8gcGFzcyB0byBwdXQoKQorfSBWUDhUaHJlYWRDb250ZXh0OworCisvLyBTYXZlZCB0b3Agc2FtcGxlcywgcGVyIG1hY3JvYmxvY2suIEZpdHMgaW50byBhIGNhY2hlLWxpbmUuCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQ4X3QgeVsxNl0sIHVbOF0sIHZbOF07Cit9IFZQOFRvcFNhbXBsZXM7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWUDhEZWNvZGVyOiB0aGUgbWFpbiBvcGFxdWUgc3RydWN0dXJlIGhhbmRlZCBvdmVyIHRvIHVzZXIKKworc3RydWN0IFZQOERlY29kZXIgeworICBWUDhTdGF0dXNDb2RlIHN0YXR1c187CisgIGludCByZWFkeV87ICAgICAvLyB0cnVlIGlmIHJlYWR5IHRvIGRlY29kZSBhIHBpY3R1cmUgd2l0aCBWUDhEZWNvZGUoKQorICBjb25zdCBjaGFyKiBlcnJvcl9tc2dfOyAgLy8gc2V0IHdoZW4gc3RhdHVzXyBpcyBub3QgT0suCisKKyAgLy8gTWFpbiBkYXRhIHNvdXJjZQorICBWUDhCaXRSZWFkZXIgYnJfOworCisgIC8vIGhlYWRlcnMKKyAgVlA4RnJhbWVIZWFkZXIgICBmcm1faGRyXzsKKyAgVlA4UGljdHVyZUhlYWRlciBwaWNfaGRyXzsKKyAgVlA4RmlsdGVySGVhZGVyICBmaWx0ZXJfaGRyXzsKKyAgVlA4U2VnbWVudEhlYWRlciBzZWdtZW50X2hkcl87CisKKyAgLy8gV29ya2VyCisgIFdlYlBXb3JrZXIgd29ya2VyXzsKKyAgaW50IG10X21ldGhvZF87ICAgICAgLy8gbXVsdGktdGhyZWFkIG1ldGhvZDogMD1vZmYsIDE9W3BhcnNlK3JlY29uXVtmaWx0ZXJdCisgICAgICAgICAgICAgICAgICAgICAgIC8vIDI9W3BhcnNlXVtyZWNvbitmaWx0ZXJdCisgIGludCBjYWNoZV9pZF87ICAgICAgIC8vIGN1cnJlbnQgY2FjaGUgcm93CisgIGludCBudW1fY2FjaGVzXzsgICAgIC8vIG51bWJlciBvZiBjYWNoZWQgcm93cyBvZiAxNiBwaXhlbHMgKDEsIDIgb3IgMykKKyAgVlA4VGhyZWFkQ29udGV4dCB0aHJlYWRfY3R4XzsgIC8vIFRocmVhZCBjb250ZXh0CisKKyAgLy8gZGltZW5zaW9uLCBpbiBtYWNyb2Jsb2NrIHVuaXRzLgorICBpbnQgbWJfd18sIG1iX2hfOworCisgIC8vIE1hY3JvYmxvY2sgdG8gcHJvY2Vzcy9maWx0ZXIsIGRlcGVuZGluZyBvbiBjcm9wcGluZyBhbmQgZmlsdGVyX3R5cGUuCisgIGludCB0bF9tYl94XywgdGxfbWJfeV87ICAvLyB0b3AtbGVmdCBNQiB0aGF0IG11c3QgYmUgaW4tbG9vcCBmaWx0ZXJlZAorICBpbnQgYnJfbWJfeF8sIGJyX21iX3lfOyAgLy8gbGFzdCBib3R0b20tcmlnaHQgTUIgdGhhdCBtdXN0IGJlIGRlY29kZWQKKworICAvLyBudW1iZXIgb2YgcGFydGl0aW9ucyBtaW51cyBvbmUuCisgIHVpbnQzMl90IG51bV9wYXJ0c19taW51c19vbmVfOworICAvLyBwZXItcGFydGl0aW9uIGJvb2xlYW4gZGVjb2RlcnMuCisgIFZQOEJpdFJlYWRlciBwYXJ0c19bTUFYX05VTV9QQVJUSVRJT05TXTsKKworICAvLyBEaXRoZXJpbmcgc3RyZW5ndGgsIGRlZHVjZWQgZnJvbSBkZWNvZGluZyBvcHRpb25zCisgIGludCBkaXRoZXJfOyAgICAgICAgICAgICAgICAvLyB3aGV0aGVyIHRvIHVzZSBkaXRoZXJpbmcgb3Igbm90CisgIFZQOFJhbmRvbSBkaXRoZXJpbmdfcmdfOyAgICAvLyByYW5kb20gZ2VuZXJhdG9yIGZvciBkaXRoZXJpbmcKKworICAvLyBkZXF1YW50aXphdGlvbiAob25lIHNldCBvZiBEQy9BQyBkZXF1YW50IGZhY3RvciBwZXIgc2VnbWVudCkKKyAgVlA4UXVhbnRNYXRyaXggZHFtX1tOVU1fTUJfU0VHTUVOVFNdOworCisgIC8vIHByb2JhYmlsaXRpZXMKKyAgVlA4UHJvYmEgcHJvYmFfOworICBpbnQgdXNlX3NraXBfcHJvYmFfOworICB1aW50OF90IHNraXBfcF87CisKKyAgLy8gQm91bmRhcnkgZGF0YSBjYWNoZSBhbmQgcGVyc2lzdGVudCBidWZmZXJzLgorICB1aW50OF90KiBpbnRyYV90XzsgICAgICAvLyB0b3AgaW50cmEgbW9kZXMgdmFsdWVzOiA0ICogbWJfd18KKyAgdWludDhfdCAgaW50cmFfbF9bNF07ICAgLy8gbGVmdCBpbnRyYSBtb2RlcyB2YWx1ZXMKKworICBWUDhUb3BTYW1wbGVzKiB5dXZfdF87ICAvLyB0b3AgeS91L3Ygc2FtcGxlcworCisgIFZQOE1CKiBtYl9pbmZvXzsgICAgICAgIC8vIGNvbnRleHR1YWwgbWFjcm9ibG9jayBpbmZvIChtYl93XyArIDEpCisgIFZQOEZJbmZvKiBmX2luZm9fOyAgICAgIC8vIGZpbHRlciBzdHJlbmd0aCBpbmZvCisgIHVpbnQ4X3QqIHl1dl9iXzsgICAgICAgIC8vIG1haW4gYmxvY2sgZm9yIFkvVS9WIChzaXplID0gWVVWX1NJWkUpCisKKyAgdWludDhfdCogY2FjaGVfeV87ICAgICAgLy8gbWFjcm9ibG9jayByb3cgZm9yIHN0b3JpbmcgdW5maWx0ZXJlZCBzYW1wbGVzCisgIHVpbnQ4X3QqIGNhY2hlX3VfOworICB1aW50OF90KiBjYWNoZV92XzsKKyAgaW50IGNhY2hlX3lfc3RyaWRlXzsKKyAgaW50IGNhY2hlX3V2X3N0cmlkZV87CisKKyAgLy8gbWFpbiBtZW1vcnkgY2h1bmsgZm9yIHRoZSBhYm92ZSBkYXRhLiBQZXJzaXN0ZW50LgorICB2b2lkKiBtZW1fOworICBzaXplX3QgbWVtX3NpemVfOworCisgIC8vIFBlciBtYWNyb2Jsb2NrIG5vbi1wZXJzaXN0ZW50IGluZm9zLgorICBpbnQgbWJfeF8sIG1iX3lfOyAgICAgICAvLyBjdXJyZW50IHBvc2l0aW9uLCBpbiBtYWNyb2Jsb2NrIHVuaXRzCisgIFZQOE1CRGF0YSogbWJfZGF0YV87ICAgIC8vIHBhcnNlZCByZWNvbnN0cnVjdGlvbiBkYXRhCisKKyAgLy8gRmlsdGVyaW5nIHNpZGUtaW5mbworICBpbnQgZmlsdGVyX3R5cGVfOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMD1vZmYsIDE9c2ltcGxlLCAyPWNvbXBsZXgKKyAgVlA4RkluZm8gZnN0cmVuZ3Roc19bTlVNX01CX1NFR01FTlRTXVsyXTsgIC8vIHByZWNhbGN1bGF0ZWQgcGVyLXNlZ21lbnQvdHlwZQorCisgIC8vIEFscGhhCisgIHN0cnVjdCBBTFBIRGVjb2RlciogYWxwaF9kZWNfOyAgLy8gYWxwaGEtcGxhbmUgZGVjb2RlciBvYmplY3QKKyAgY29uc3QgdWludDhfdCogYWxwaGFfZGF0YV87ICAgICAvLyBjb21wcmVzc2VkIGFscGhhIGRhdGEgKGlmIHByZXNlbnQpCisgIHNpemVfdCBhbHBoYV9kYXRhX3NpemVfOworICBpbnQgaXNfYWxwaGFfZGVjb2RlZF87ICAgICAgLy8gdHJ1ZSBpZiBhbHBoYV9kYXRhXyBpcyBkZWNvZGVkIGluIGFscGhhX3BsYW5lXworICB1aW50OF90KiBhbHBoYV9wbGFuZV9tZW1fOyAgLy8gbWVtb3J5IGFsbG9jYXRlZCBmb3IgYWxwaGFfcGxhbmVfCisgIHVpbnQ4X3QqIGFscGhhX3BsYW5lXzsgICAgICAvLyBvdXRwdXQuIFBlcnNpc3RlbnQsIGNvbnRhaW5zIHRoZSB3aG9sZSBkYXRhLgorICBjb25zdCB1aW50OF90KiBhbHBoYV9wcmV2X2xpbmVfOyAgLy8gbGFzdCBkZWNvZGVkIGFscGhhIHJvdyAob3IgTlVMTCkKKyAgaW50IGFscGhhX2RpdGhlcmluZ187ICAgICAgIC8vIGRlcml2ZWQgZnJvbSBkZWNvZGluZyBvcHRpb25zICgwPW9mZiwgMTAwPWZ1bGwpCit9OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gaW50ZXJuYWwgZnVuY3Rpb25zLiBOb3QgcHVibGljLgorCisvLyBpbiB2cDguYworaW50IFZQOFNldEVycm9yKFZQOERlY29kZXIqIGNvbnN0IGRlYywKKyAgICAgICAgICAgICAgICBWUDhTdGF0dXNDb2RlIGVycm9yLCBjb25zdCBjaGFyKiBjb25zdCBtc2cpOworCisvLyBpbiB0cmVlLmMKK3ZvaWQgVlA4UmVzZXRQcm9iYShWUDhQcm9iYSogY29uc3QgcHJvYmEpOwordm9pZCBWUDhQYXJzZVByb2JhKFZQOEJpdFJlYWRlciogY29uc3QgYnIsIFZQOERlY29kZXIqIGNvbnN0IGRlYyk7CisvLyBwYXJzZXMgb25lIHJvdyBvZiBpbnRyYSBtb2RlIGRhdGEgaW4gcGFydGl0aW9uIDAsIHJldHVybnMgIWVvZgoraW50IFZQOFBhcnNlSW50cmFNb2RlUm93KFZQOEJpdFJlYWRlciogY29uc3QgYnIsIFZQOERlY29kZXIqIGNvbnN0IGRlYyk7CisKKy8vIGluIHF1YW50LmMKK3ZvaWQgVlA4UGFyc2VRdWFudChWUDhEZWNvZGVyKiBjb25zdCBkZWMpOworCisvLyBpbiBmcmFtZS5jCitpbnQgVlA4SW5pdEZyYW1lKFZQOERlY29kZXIqIGNvbnN0IGRlYywgVlA4SW8qIGNvbnN0IGlvKTsKKy8vIENhbGwgaW8tPnNldHVwKCkgYW5kIGZpbmlzaCBzZXR0aW5nIHVwIHNjYW4gcGFyYW1ldGVycy4KKy8vIEFmdGVyIHRoaXMgY2FsbCByZXR1cm5zLCBvbmUgbXVzdCBhbHdheXMgY2FsbCBWUDhFeGl0Q3JpdGljYWwoKSB3aXRoIHRoZQorLy8gc2FtZSBwYXJhbWV0ZXJzLiBCb3RoIGZ1bmN0aW9ucyBzaG91bGQgYmUgdXNlZCBpbiBwYWlyLiBSZXR1cm5zIFZQOF9TVEFUVVNfT0sKKy8vIGlmIG9rLCBvdGhlcndpc2Ugc2V0cyBhbmQgcmV0dXJucyB0aGUgZXJyb3Igc3RhdHVzIG9uICpkZWMuCitWUDhTdGF0dXNDb2RlIFZQOEVudGVyQ3JpdGljYWwoVlA4RGVjb2RlciogY29uc3QgZGVjLCBWUDhJbyogY29uc3QgaW8pOworLy8gTXVzdCBhbHdheXMgYmUgY2FsbGVkIGluIHBhaXIgd2l0aCBWUDhFbnRlckNyaXRpY2FsKCkuCisvLyBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgZXJyb3IuCitpbnQgVlA4RXhpdENyaXRpY2FsKFZQOERlY29kZXIqIGNvbnN0IGRlYywgVlA4SW8qIGNvbnN0IGlvKTsKKy8vIFJldHVybiB0aGUgbXVsdGktdGhyZWFkaW5nIG1ldGhvZCB0byB1c2UgKDA9b2ZmKSwgZGVwZW5kaW5nCisvLyBvbiBvcHRpb25zIGFuZCBiaXRzdHJlYW0gc2l6ZS4gT25seSBmb3IgbG9zc3kgZGVjb2RpbmcuCitpbnQgVlA4R2V0VGhyZWFkTWV0aG9kKGNvbnN0IFdlYlBEZWNvZGVyT3B0aW9ucyogY29uc3Qgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUEhlYWRlclN0cnVjdHVyZSogY29uc3QgaGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKy8vIEluaXRpYWxpemUgZGl0aGVyaW5nIHBvc3QtcHJvY2VzcyBpZiBuZWVkZWQuCit2b2lkIFZQOEluaXREaXRoZXJpbmcoY29uc3QgV2ViUERlY29kZXJPcHRpb25zKiBjb25zdCBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgIFZQOERlY29kZXIqIGNvbnN0IGRlYyk7CisvLyBQcm9jZXNzIHRoZSBsYXN0IGRlY29kZWQgcm93IChmaWx0ZXJpbmcgKyBvdXRwdXQpLgoraW50IFZQOFByb2Nlc3NSb3coVlA4RGVjb2RlciogY29uc3QgZGVjLCBWUDhJbyogY29uc3QgaW8pOworLy8gVG8gYmUgY2FsbGVkIGF0IHRoZSBzdGFydCBvZiBhIG5ldyBzY2FubGluZSwgdG8gaW5pdGlhbGl6ZSBwcmVkaWN0b3JzLgordm9pZCBWUDhJbml0U2NhbmxpbmUoVlA4RGVjb2RlciogY29uc3QgZGVjKTsKKy8vIERlY29kZSBvbmUgbWFjcm9ibG9jay4gUmV0dXJucyBmYWxzZSBpZiB0aGVyZSBpcyBub3QgZW5vdWdoIGRhdGEuCitpbnQgVlA4RGVjb2RlTUIoVlA4RGVjb2RlciogY29uc3QgZGVjLCBWUDhCaXRSZWFkZXIqIGNvbnN0IHRva2VuX2JyKTsKKworLy8gaW4gYWxwaGEuYworY29uc3QgdWludDhfdCogVlA4RGVjb21wcmVzc0FscGhhUm93cyhWUDhEZWNvZGVyKiBjb25zdCBkZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOElvKiBjb25zdCBpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdywgaW50IG51bV9yb3dzKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8qIFdFQlBfREVDX1ZQOElfREVDX0hfICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL3ZwOGxfZGVjLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL3ZwOGxfZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU3MjRiNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvdnA4bF9kZWMuYwpAQCAtMCwwICsxLDE2OTQgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBtYWluIGVudHJ5IGZvciB0aGUgZGVjb2RlcgorLy8KKy8vIEF1dGhvcnM6IFZpa2FzIEFyb3JhICh2aWthYXMuYXJvcmFAZ21haWwuY29tKQorLy8gICAgICAgICAgSnlya2kgQWxha3VpamFsYSAoanlya2lAZ29vZ2xlLmNvbSkKKworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL2Fzc2VydF9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RkbGliX3BvZW0uaCIKKyNlbHNlCisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKworI2luY2x1ZGUgInNyYy9kZWMvYWxwaGFpX2RlYy5oIgorI2luY2x1ZGUgInNyYy9kZWMvdnA4bGlfZGVjLmgiCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKyNpbmNsdWRlICJzcmMvZHNwL2xvc3NsZXNzLmgiCisjaW5jbHVkZSAic3JjL2RzcC9sb3NzbGVzc19jb21tb24uaCIKKyNpbmNsdWRlICJzcmMvZHNwL3l1di5oIgorI2luY2x1ZGUgInNyYy91dGlscy9lbmRpYW5faW5sX3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL2h1ZmZtYW5fdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKKworI2RlZmluZSBOVU1fQVJHQl9DQUNIRV9ST1dTICAgICAgICAgIDE2CisKK3N0YXRpYyBjb25zdCBpbnQga0NvZGVMZW5ndGhMaXRlcmFscyA9IDE2Oworc3RhdGljIGNvbnN0IGludCBrQ29kZUxlbmd0aFJlcGVhdENvZGUgPSAxNjsKK3N0YXRpYyBjb25zdCB1aW50OF90IGtDb2RlTGVuZ3RoRXh0cmFCaXRzWzNdID0geyAyLCAzLCA3IH07CitzdGF0aWMgY29uc3QgdWludDhfdCBrQ29kZUxlbmd0aFJlcGVhdE9mZnNldHNbM10gPSB7IDMsIDMsIDExIH07CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgRml2ZSBIdWZmbWFuIGNvZGVzIGFyZSB1c2VkIGF0IGVhY2ggbWV0YSBjb2RlOgorLy8gIDEuIGdyZWVuICsgbGVuZ3RoIHByZWZpeCBjb2RlcyArIGNvbG9yIGNhY2hlIGNvZGVzLAorLy8gIDIuIGFscGhhLAorLy8gIDMuIHJlZCwKKy8vICA0LiBibHVlLCBhbmQsCisvLyAgNS4gZGlzdGFuY2UgcHJlZml4IGNvZGVzLgordHlwZWRlZiBlbnVtIHsKKyAgR1JFRU4gPSAwLAorICBSRUQgICA9IDEsCisgIEJMVUUgID0gMiwKKyAgQUxQSEEgPSAzLAorICBESVNUICA9IDQKK30gSHVmZkluZGV4OworCitzdGF0aWMgY29uc3QgdWludDE2X3Qga0FscGhhYmV0U2l6ZVtIVUZGTUFOX0NPREVTX1BFUl9NRVRBX0NPREVdID0geworICBOVU1fTElURVJBTF9DT0RFUyArIE5VTV9MRU5HVEhfQ09ERVMsCisgIE5VTV9MSVRFUkFMX0NPREVTLCBOVU1fTElURVJBTF9DT0RFUywgTlVNX0xJVEVSQUxfQ09ERVMsCisgIE5VTV9ESVNUQU5DRV9DT0RFUworfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0xpdGVyYWxNYXBbSFVGRk1BTl9DT0RFU19QRVJfTUVUQV9DT0RFXSA9IHsKKyAgMCwgMSwgMSwgMSwgMAorfTsKKworI2RlZmluZSBOVU1fQ09ERV9MRU5HVEhfQ09ERVMgICAgICAgMTkKK3N0YXRpYyBjb25zdCB1aW50OF90IGtDb2RlTGVuZ3RoQ29kZU9yZGVyW05VTV9DT0RFX0xFTkdUSF9DT0RFU10gPSB7CisgIDE3LCAxOCwgMCwgMSwgMiwgMywgNCwgNSwgMTYsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUKK307CisKKyNkZWZpbmUgQ09ERV9UT19QTEFORV9DT0RFUyAgICAgICAgMTIwCitzdGF0aWMgY29uc3QgdWludDhfdCBrQ29kZVRvUGxhbmVbQ09ERV9UT19QTEFORV9DT0RFU10gPSB7CisgIDB4MTgsIDB4MDcsIDB4MTcsIDB4MTksIDB4MjgsIDB4MDYsIDB4MjcsIDB4MjksIDB4MTYsIDB4MWEsCisgIDB4MjYsIDB4MmEsIDB4MzgsIDB4MDUsIDB4MzcsIDB4MzksIDB4MTUsIDB4MWIsIDB4MzYsIDB4M2EsCisgIDB4MjUsIDB4MmIsIDB4NDgsIDB4MDQsIDB4NDcsIDB4NDksIDB4MTQsIDB4MWMsIDB4MzUsIDB4M2IsCisgIDB4NDYsIDB4NGEsIDB4MjQsIDB4MmMsIDB4NTgsIDB4NDUsIDB4NGIsIDB4MzQsIDB4M2MsIDB4MDMsCisgIDB4NTcsIDB4NTksIDB4MTMsIDB4MWQsIDB4NTYsIDB4NWEsIDB4MjMsIDB4MmQsIDB4NDQsIDB4NGMsCisgIDB4NTUsIDB4NWIsIDB4MzMsIDB4M2QsIDB4NjgsIDB4MDIsIDB4NjcsIDB4NjksIDB4MTIsIDB4MWUsCisgIDB4NjYsIDB4NmEsIDB4MjIsIDB4MmUsIDB4NTQsIDB4NWMsIDB4NDMsIDB4NGQsIDB4NjUsIDB4NmIsCisgIDB4MzIsIDB4M2UsIDB4NzgsIDB4MDEsIDB4NzcsIDB4NzksIDB4NTMsIDB4NWQsIDB4MTEsIDB4MWYsCisgIDB4NjQsIDB4NmMsIDB4NDIsIDB4NGUsIDB4NzYsIDB4N2EsIDB4MjEsIDB4MmYsIDB4NzUsIDB4N2IsCisgIDB4MzEsIDB4M2YsIDB4NjMsIDB4NmQsIDB4NTIsIDB4NWUsIDB4MDAsIDB4NzQsIDB4N2MsIDB4NDEsCisgIDB4NGYsIDB4MTAsIDB4MjAsIDB4NjIsIDB4NmUsIDB4MzAsIDB4NzMsIDB4N2QsIDB4NTEsIDB4NWYsCisgIDB4NDAsIDB4NzIsIDB4N2UsIDB4NjEsIDB4NmYsIDB4NTAsIDB4NzEsIDB4N2YsIDB4NjAsIDB4NzAKK307CisKKy8vIE1lbW9yeSBuZWVkZWQgZm9yIGxvb2t1cCB0YWJsZXMgb2Ygb25lIEh1ZmZtYW4gdHJlZSBncm91cC4gUmVkLCBibHVlLCBhbHBoYQorLy8gYW5kIGRpc3RhbmNlIGFscGhhYmV0cyBhcmUgY29uc3RhbnQgKDI1NiBmb3IgcmVkLCBibHVlIGFuZCBhbHBoYSwgNDAgZm9yCisvLyBkaXN0YW5jZSkgYW5kIGxvb2t1cCB0YWJsZSBzaXplcyBmb3IgdGhlbSBpbiB3b3JzdCBjYXNlIGFyZSA2MzAgYW5kIDQxMAorLy8gcmVzcGVjdGl2ZWx5LiBTaXplIG9mIGdyZWVuIGFscGhhYmV0IGRlcGVuZHMgb24gY29sb3IgY2FjaGUgc2l6ZSBhbmQgaXMgZXF1YWwKKy8vIHRvIDI1NiAoZ3JlZW4gY29tcG9uZW50IHZhbHVlcykgKyAyNCAobGVuZ3RoIHByZWZpeCB2YWx1ZXMpCisvLyArIGNvbG9yX2NhY2hlX3NpemUgKGJldHdlZW4gMCBhbmQgMjA0OCkuCisvLyBBbGwgdmFsdWVzIGNvbXB1dGVkIGZvciA4LWJpdCBmaXJzdCBsZXZlbCBsb29rdXAgd2l0aCBNYXJrIEFkbGVyJ3MgdG9vbDoKKy8vIGh0dHA6Ly93d3cuaGRmZ3JvdXAub3JnL2Z0cC9saWItZXh0ZXJuYWwvemxpYi96bGliLTEuMi41L2V4YW1wbGVzL2Vub3VnaC5jCisjZGVmaW5lIEZJWEVEX1RBQkxFX1NJWkUgKDYzMCAqIDMgKyA0MTApCitzdGF0aWMgY29uc3QgdWludDE2X3Qga1RhYmxlU2l6ZVsxMl0gPSB7CisgIEZJWEVEX1RBQkxFX1NJWkUgKyA2NTQsCisgIEZJWEVEX1RBQkxFX1NJWkUgKyA2NTYsCisgIEZJWEVEX1RBQkxFX1NJWkUgKyA2NTgsCisgIEZJWEVEX1RBQkxFX1NJWkUgKyA2NjIsCisgIEZJWEVEX1RBQkxFX1NJWkUgKyA2NzAsCisgIEZJWEVEX1RBQkxFX1NJWkUgKyA2ODYsCisgIEZJWEVEX1RBQkxFX1NJWkUgKyA3MTgsCisgIEZJWEVEX1RBQkxFX1NJWkUgKyA3ODIsCisgIEZJWEVEX1RBQkxFX1NJWkUgKyA5MTIsCisgIEZJWEVEX1RBQkxFX1NJWkUgKyAxMTY4LAorICBGSVhFRF9UQUJMRV9TSVpFICsgMTY4MCwKKyAgRklYRURfVEFCTEVfU0laRSArIDI3MDQKK307CisKK3N0YXRpYyBpbnQgRGVjb2RlSW1hZ2VTdHJlYW0oaW50IHhzaXplLCBpbnQgeXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpc19sZXZlbDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExEZWNvZGVyKiBjb25zdCBkZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiogY29uc3QgZGVjb2RlZF9kYXRhKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IFZQOExDaGVja1NpZ25hdHVyZShjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICByZXR1cm4gKHNpemUgPj0gVlA4TF9GUkFNRV9IRUFERVJfU0laRSAmJgorICAgICAgICAgIGRhdGFbMF0gPT0gVlA4TF9NQUdJQ19CWVRFICYmCisgICAgICAgICAgKGRhdGFbNF0gPj4gNSkgPT0gMCk7ICAvLyB2ZXJzaW9uCit9CisKK3N0YXRpYyBpbnQgUmVhZEltYWdlSW5mbyhWUDhMQml0UmVhZGVyKiBjb25zdCBiciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IHdpZHRoLCBpbnQqIGNvbnN0IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGhhc19hbHBoYSkgeworICBpZiAoVlA4TFJlYWRCaXRzKGJyLCA4KSAhPSBWUDhMX01BR0lDX0JZVEUpIHJldHVybiAwOworICAqd2lkdGggPSBWUDhMUmVhZEJpdHMoYnIsIFZQOExfSU1BR0VfU0laRV9CSVRTKSArIDE7CisgICpoZWlnaHQgPSBWUDhMUmVhZEJpdHMoYnIsIFZQOExfSU1BR0VfU0laRV9CSVRTKSArIDE7CisgICpoYXNfYWxwaGEgPSBWUDhMUmVhZEJpdHMoYnIsIDEpOworICBpZiAoVlA4TFJlYWRCaXRzKGJyLCBWUDhMX1ZFUlNJT05fQklUUykgIT0gMCkgcmV0dXJuIDA7CisgIHJldHVybiAhYnItPmVvc187Cit9CisKK2ludCBWUDhMR2V0SW5mbyhjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgIGludCogY29uc3Qgd2lkdGgsIGludCogY29uc3QgaGVpZ2h0LCBpbnQqIGNvbnN0IGhhc19hbHBoYSkgeworICBpZiAoZGF0YSA9PSBOVUxMIHx8IGRhdGFfc2l6ZSA8IFZQOExfRlJBTUVfSEVBREVSX1NJWkUpIHsKKyAgICByZXR1cm4gMDsgICAgICAgICAvLyBub3QgZW5vdWdoIGRhdGEKKyAgfSBlbHNlIGlmICghVlA4TENoZWNrU2lnbmF0dXJlKGRhdGEsIGRhdGFfc2l6ZSkpIHsKKyAgICByZXR1cm4gMDsgICAgICAgICAvLyBiYWQgc2lnbmF0dXJlCisgIH0gZWxzZSB7CisgICAgaW50IHcsIGgsIGE7CisgICAgVlA4TEJpdFJlYWRlciBicjsKKyAgICBWUDhMSW5pdEJpdFJlYWRlcigmYnIsIGRhdGEsIGRhdGFfc2l6ZSk7CisgICAgaWYgKCFSZWFkSW1hZ2VJbmZvKCZiciwgJncsICZoLCAmYSkpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAod2lkdGggIT0gTlVMTCkgKndpZHRoID0gdzsKKyAgICBpZiAoaGVpZ2h0ICE9IE5VTEwpICpoZWlnaHQgPSBoOworICAgIGlmIChoYXNfYWxwaGEgIT0gTlVMTCkgKmhhc19hbHBoYSA9IGE7CisgICAgcmV0dXJuIDE7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBHZXRDb3B5RGlzdGFuY2UoaW50IGRpc3RhbmNlX3N5bWJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyKSB7CisgIGludCBleHRyYV9iaXRzLCBvZmZzZXQ7CisgIGlmIChkaXN0YW5jZV9zeW1ib2wgPCA0KSB7CisgICAgcmV0dXJuIGRpc3RhbmNlX3N5bWJvbCArIDE7CisgIH0KKyAgZXh0cmFfYml0cyA9IChkaXN0YW5jZV9zeW1ib2wgLSAyKSA+PiAxOworICBvZmZzZXQgPSAoMiArIChkaXN0YW5jZV9zeW1ib2wgJiAxKSkgPDwgZXh0cmFfYml0czsKKyAgcmV0dXJuIG9mZnNldCArIFZQOExSZWFkQml0cyhiciwgZXh0cmFfYml0cykgKyAxOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IEdldENvcHlMZW5ndGgoaW50IGxlbmd0aF9zeW1ib2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEJpdFJlYWRlciogY29uc3QgYnIpIHsKKyAgLy8gTGVuZ3RoIGFuZCBkaXN0YW5jZSBwcmVmaXhlcyBhcmUgZW5jb2RlZCB0aGUgc2FtZSB3YXkuCisgIHJldHVybiBHZXRDb3B5RGlzdGFuY2UobGVuZ3RoX3N5bWJvbCwgYnIpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFBsYW5lQ29kZVRvRGlzdGFuY2UoaW50IHhzaXplLCBpbnQgcGxhbmVfY29kZSkgeworICBpZiAocGxhbmVfY29kZSA+IENPREVfVE9fUExBTkVfQ09ERVMpIHsKKyAgICByZXR1cm4gcGxhbmVfY29kZSAtIENPREVfVE9fUExBTkVfQ09ERVM7CisgIH0gZWxzZSB7CisgICAgY29uc3QgaW50IGRpc3RfY29kZSA9IGtDb2RlVG9QbGFuZVtwbGFuZV9jb2RlIC0gMV07CisgICAgY29uc3QgaW50IHlvZmZzZXQgPSBkaXN0X2NvZGUgPj4gNDsKKyAgICBjb25zdCBpbnQgeG9mZnNldCA9IDggLSAoZGlzdF9jb2RlICYgMHhmKTsKKyAgICBjb25zdCBpbnQgZGlzdCA9IHlvZmZzZXQgKiB4c2l6ZSArIHhvZmZzZXQ7CisgICAgcmV0dXJuIChkaXN0ID49IDEpID8gZGlzdCA6IDE7ICAvLyBkaXN0PDEgY2FuIGhhcHBlbiBpZiB4c2l6ZSBpcyB2ZXJ5IHNtYWxsCisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERlY29kZXMgdGhlIG5leHQgSHVmZm1hbiBjb2RlIGZyb20gYml0LXN0cmVhbS4KKy8vIEZpbGxCaXRXaW5kb3coYnIpIG5lZWRzIHRvIGJlIGNhbGxlZCBhdCBtaW5pbXVtIGV2ZXJ5IHNlY29uZCBjYWxsCisvLyB0byBSZWFkU3ltYm9sLCBpbiBvcmRlciB0byBwcmUtZmV0Y2ggZW5vdWdoIGJpdHMuCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFJlYWRTeW1ib2woY29uc3QgSHVmZm1hbkNvZGUqIHRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyKSB7CisgIGludCBuYml0czsKKyAgdWludDMyX3QgdmFsID0gVlA4TFByZWZldGNoQml0cyhicik7CisgIHRhYmxlICs9IHZhbCAmIEhVRkZNQU5fVEFCTEVfTUFTSzsKKyAgbmJpdHMgPSB0YWJsZS0+Yml0cyAtIEhVRkZNQU5fVEFCTEVfQklUUzsKKyAgaWYgKG5iaXRzID4gMCkgeworICAgIFZQOExTZXRCaXRQb3MoYnIsIGJyLT5iaXRfcG9zXyArIEhVRkZNQU5fVEFCTEVfQklUUyk7CisgICAgdmFsID0gVlA4TFByZWZldGNoQml0cyhicik7CisgICAgdGFibGUgKz0gdGFibGUtPnZhbHVlOworICAgIHRhYmxlICs9IHZhbCAmICgoMSA8PCBuYml0cykgLSAxKTsKKyAgfQorICBWUDhMU2V0Qml0UG9zKGJyLCBici0+Yml0X3Bvc18gKyB0YWJsZS0+Yml0cyk7CisgIHJldHVybiB0YWJsZS0+dmFsdWU7Cit9CisKKy8vIFJlYWRzIHBhY2tlZCBzeW1ib2wgZGVwZW5kaW5nIG9uIEdSRUVOIGNoYW5uZWwKKyNkZWZpbmUgQklUU19TUEVDSUFMX01BUktFUiAweDEwMCAgLy8gc29tZXRoaW5nIGxhcmdlIGVub3VnaCAoYW5kIGEgYml0LW1hc2spCisjZGVmaW5lIFBBQ0tFRF9OT05fTElURVJBTF9DT0RFIDAgIC8vIG11c3QgYmUgPCBOVU1fTElURVJBTF9DT0RFUworc3RhdGljIFdFQlBfSU5MSU5FIGludCBSZWFkUGFja2VkU3ltYm9scyhjb25zdCBIVHJlZUdyb3VwKiBncm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEJpdFJlYWRlciogY29uc3QgYnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBjb25zdCBkc3QpIHsKKyAgY29uc3QgdWludDMyX3QgdmFsID0gVlA4TFByZWZldGNoQml0cyhicikgJiAoSFVGRk1BTl9QQUNLRURfVEFCTEVfU0laRSAtIDEpOworICBjb25zdCBIdWZmbWFuQ29kZTMyIGNvZGUgPSBncm91cC0+cGFja2VkX3RhYmxlW3ZhbF07CisgIGFzc2VydChncm91cC0+dXNlX3BhY2tlZF90YWJsZSk7CisgIGlmIChjb2RlLmJpdHMgPCBCSVRTX1NQRUNJQUxfTUFSS0VSKSB7CisgICAgVlA4TFNldEJpdFBvcyhiciwgYnItPmJpdF9wb3NfICsgY29kZS5iaXRzKTsKKyAgICAqZHN0ID0gY29kZS52YWx1ZTsKKyAgICByZXR1cm4gUEFDS0VEX05PTl9MSVRFUkFMX0NPREU7CisgIH0gZWxzZSB7CisgICAgVlA4TFNldEJpdFBvcyhiciwgYnItPmJpdF9wb3NfICsgY29kZS5iaXRzIC0gQklUU19TUEVDSUFMX01BUktFUik7CisgICAgYXNzZXJ0KGNvZGUudmFsdWUgPj0gTlVNX0xJVEVSQUxfQ09ERVMpOworICAgIHJldHVybiBjb2RlLnZhbHVlOworICB9Cit9CisKK3N0YXRpYyBpbnQgQWNjdW11bGF0ZUhDb2RlKEh1ZmZtYW5Db2RlIGhjb2RlLCBpbnQgc2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuQ29kZTMyKiBjb25zdCBodWZmKSB7CisgIGh1ZmYtPmJpdHMgKz0gaGNvZGUuYml0czsKKyAgaHVmZi0+dmFsdWUgfD0gKHVpbnQzMl90KWhjb2RlLnZhbHVlIDw8IHNoaWZ0OworICBhc3NlcnQoaHVmZi0+Yml0cyA8PSBIVUZGTUFOX1RBQkxFX0JJVFMpOworICByZXR1cm4gaGNvZGUuYml0czsKK30KKworc3RhdGljIHZvaWQgQnVpbGRQYWNrZWRUYWJsZShIVHJlZUdyb3VwKiBjb25zdCBodHJlZV9ncm91cCkgeworICB1aW50MzJfdCBjb2RlOworICBmb3IgKGNvZGUgPSAwOyBjb2RlIDwgSFVGRk1BTl9QQUNLRURfVEFCTEVfU0laRTsgKytjb2RlKSB7CisgICAgdWludDMyX3QgYml0cyA9IGNvZGU7CisgICAgSHVmZm1hbkNvZGUzMiogY29uc3QgaHVmZiA9ICZodHJlZV9ncm91cC0+cGFja2VkX3RhYmxlW2JpdHNdOworICAgIEh1ZmZtYW5Db2RlIGhjb2RlID0gaHRyZWVfZ3JvdXAtPmh0cmVlc1tHUkVFTl1bYml0c107CisgICAgaWYgKGhjb2RlLnZhbHVlID49IE5VTV9MSVRFUkFMX0NPREVTKSB7CisgICAgICBodWZmLT5iaXRzID0gaGNvZGUuYml0cyArIEJJVFNfU1BFQ0lBTF9NQVJLRVI7CisgICAgICBodWZmLT52YWx1ZSA9IGhjb2RlLnZhbHVlOworICAgIH0gZWxzZSB7CisgICAgICBodWZmLT5iaXRzID0gMDsKKyAgICAgIGh1ZmYtPnZhbHVlID0gMDsKKyAgICAgIGJpdHMgPj49IEFjY3VtdWxhdGVIQ29kZShoY29kZSwgOCwgaHVmZik7CisgICAgICBiaXRzID4+PSBBY2N1bXVsYXRlSENvZGUoaHRyZWVfZ3JvdXAtPmh0cmVlc1tSRURdW2JpdHNdLCAxNiwgaHVmZik7CisgICAgICBiaXRzID4+PSBBY2N1bXVsYXRlSENvZGUoaHRyZWVfZ3JvdXAtPmh0cmVlc1tCTFVFXVtiaXRzXSwgMCwgaHVmZik7CisgICAgICBiaXRzID4+PSBBY2N1bXVsYXRlSENvZGUoaHRyZWVfZ3JvdXAtPmh0cmVlc1tBTFBIQV1bYml0c10sIDI0LCBodWZmKTsKKyAgICAgICh2b2lkKWJpdHM7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyBpbnQgUmVhZEh1ZmZtYW5Db2RlTGVuZ3RocygKKyAgICBWUDhMRGVjb2RlciogY29uc3QgZGVjLCBjb25zdCBpbnQqIGNvbnN0IGNvZGVfbGVuZ3RoX2NvZGVfbGVuZ3RocywKKyAgICBpbnQgbnVtX3N5bWJvbHMsIGludCogY29uc3QgY29kZV9sZW5ndGhzKSB7CisgIGludCBvayA9IDA7CisgIFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyID0gJmRlYy0+YnJfOworICBpbnQgc3ltYm9sOworICBpbnQgbWF4X3N5bWJvbDsKKyAgaW50IHByZXZfY29kZV9sZW4gPSBERUZBVUxUX0NPREVfTEVOR1RIOworICBIdWZmbWFuQ29kZSB0YWJsZVsxIDw8IExFTkdUSFNfVEFCTEVfQklUU107CisKKyAgaWYgKCFWUDhMQnVpbGRIdWZmbWFuVGFibGUodGFibGUsIExFTkdUSFNfVEFCTEVfQklUUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZV9sZW5ndGhfY29kZV9sZW5ndGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVU1fQ09ERV9MRU5HVEhfQ09ERVMpKSB7CisgICAgZ290byBFbmQ7CisgIH0KKworICBpZiAoVlA4TFJlYWRCaXRzKGJyLCAxKSkgeyAgICAvLyB1c2UgbGVuZ3RoCisgICAgY29uc3QgaW50IGxlbmd0aF9uYml0cyA9IDIgKyAyICogVlA4TFJlYWRCaXRzKGJyLCAzKTsKKyAgICBtYXhfc3ltYm9sID0gMiArIFZQOExSZWFkQml0cyhiciwgbGVuZ3RoX25iaXRzKTsKKyAgICBpZiAobWF4X3N5bWJvbCA+IG51bV9zeW1ib2xzKSB7CisgICAgICBnb3RvIEVuZDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgbWF4X3N5bWJvbCA9IG51bV9zeW1ib2xzOworICB9CisKKyAgc3ltYm9sID0gMDsKKyAgd2hpbGUgKHN5bWJvbCA8IG51bV9zeW1ib2xzKSB7CisgICAgY29uc3QgSHVmZm1hbkNvZGUqIHA7CisgICAgaW50IGNvZGVfbGVuOworICAgIGlmIChtYXhfc3ltYm9sLS0gPT0gMCkgYnJlYWs7CisgICAgVlA4TEZpbGxCaXRXaW5kb3coYnIpOworICAgIHAgPSAmdGFibGVbVlA4TFByZWZldGNoQml0cyhicikgJiBMRU5HVEhTX1RBQkxFX01BU0tdOworICAgIFZQOExTZXRCaXRQb3MoYnIsIGJyLT5iaXRfcG9zXyArIHAtPmJpdHMpOworICAgIGNvZGVfbGVuID0gcC0+dmFsdWU7CisgICAgaWYgKGNvZGVfbGVuIDwga0NvZGVMZW5ndGhMaXRlcmFscykgeworICAgICAgY29kZV9sZW5ndGhzW3N5bWJvbCsrXSA9IGNvZGVfbGVuOworICAgICAgaWYgKGNvZGVfbGVuICE9IDApIHByZXZfY29kZV9sZW4gPSBjb2RlX2xlbjsKKyAgICB9IGVsc2UgeworICAgICAgY29uc3QgaW50IHVzZV9wcmV2ID0gKGNvZGVfbGVuID09IGtDb2RlTGVuZ3RoUmVwZWF0Q29kZSk7CisgICAgICBjb25zdCBpbnQgc2xvdCA9IGNvZGVfbGVuIC0ga0NvZGVMZW5ndGhMaXRlcmFsczsKKyAgICAgIGNvbnN0IGludCBleHRyYV9iaXRzID0ga0NvZGVMZW5ndGhFeHRyYUJpdHNbc2xvdF07CisgICAgICBjb25zdCBpbnQgcmVwZWF0X29mZnNldCA9IGtDb2RlTGVuZ3RoUmVwZWF0T2Zmc2V0c1tzbG90XTsKKyAgICAgIGludCByZXBlYXQgPSBWUDhMUmVhZEJpdHMoYnIsIGV4dHJhX2JpdHMpICsgcmVwZWF0X29mZnNldDsKKyAgICAgIGlmIChzeW1ib2wgKyByZXBlYXQgPiBudW1fc3ltYm9scykgeworICAgICAgICBnb3RvIEVuZDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IGludCBsZW5ndGggPSB1c2VfcHJldiA/IHByZXZfY29kZV9sZW4gOiAwOworICAgICAgICB3aGlsZSAocmVwZWF0LS0gPiAwKSBjb2RlX2xlbmd0aHNbc3ltYm9sKytdID0gbGVuZ3RoOworICAgICAgfQorICAgIH0KKyAgfQorICBvayA9IDE7CisKKyBFbmQ6CisgIGlmICghb2spIGRlYy0+c3RhdHVzXyA9IFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SOworICByZXR1cm4gb2s7Cit9CisKKy8vICdjb2RlX2xlbmd0aHMnIGlzIHByZS1hbGxvY2F0ZWQgdGVtcG9yYXJ5IGJ1ZmZlciwgdXNlZCBmb3IgY3JlYXRpbmcgSHVmZm1hbgorLy8gdHJlZS4KK3N0YXRpYyBpbnQgUmVhZEh1ZmZtYW5Db2RlKGludCBhbHBoYWJldF9zaXplLCBWUDhMRGVjb2RlciogY29uc3QgZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBjb2RlX2xlbmd0aHMsIEh1ZmZtYW5Db2RlKiBjb25zdCB0YWJsZSkgeworICBpbnQgb2sgPSAwOworICBpbnQgc2l6ZSA9IDA7CisgIFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyID0gJmRlYy0+YnJfOworICBjb25zdCBpbnQgc2ltcGxlX2NvZGUgPSBWUDhMUmVhZEJpdHMoYnIsIDEpOworCisgIG1lbXNldChjb2RlX2xlbmd0aHMsIDAsIGFscGhhYmV0X3NpemUgKiBzaXplb2YoKmNvZGVfbGVuZ3RocykpOworCisgIGlmIChzaW1wbGVfY29kZSkgeyAgLy8gUmVhZCBzeW1ib2xzLCBjb2RlcyAmIGNvZGUgbGVuZ3RocyBkaXJlY3RseS4KKyAgICBjb25zdCBpbnQgbnVtX3N5bWJvbHMgPSBWUDhMUmVhZEJpdHMoYnIsIDEpICsgMTsKKyAgICBjb25zdCBpbnQgZmlyc3Rfc3ltYm9sX2xlbl9jb2RlID0gVlA4TFJlYWRCaXRzKGJyLCAxKTsKKyAgICAvLyBUaGUgZmlyc3QgY29kZSBpcyBlaXRoZXIgMSBiaXQgb3IgOCBiaXQgY29kZS4KKyAgICBpbnQgc3ltYm9sID0gVlA4TFJlYWRCaXRzKGJyLCAoZmlyc3Rfc3ltYm9sX2xlbl9jb2RlID09IDApID8gMSA6IDgpOworICAgIGNvZGVfbGVuZ3Roc1tzeW1ib2xdID0gMTsKKyAgICAvLyBUaGUgc2Vjb25kIGNvZGUgKGlmIHByZXNlbnQpLCBpcyBhbHdheXMgOCBiaXQgbG9uZy4KKyAgICBpZiAobnVtX3N5bWJvbHMgPT0gMikgeworICAgICAgc3ltYm9sID0gVlA4TFJlYWRCaXRzKGJyLCA4KTsKKyAgICAgIGNvZGVfbGVuZ3Roc1tzeW1ib2xdID0gMTsKKyAgICB9CisgICAgb2sgPSAxOworICB9IGVsc2UgeyAgLy8gRGVjb2RlIEh1ZmZtYW4tY29kZWQgY29kZSBsZW5ndGhzLgorICAgIGludCBpOworICAgIGludCBjb2RlX2xlbmd0aF9jb2RlX2xlbmd0aHNbTlVNX0NPREVfTEVOR1RIX0NPREVTXSA9IHsgMCB9OworICAgIGNvbnN0IGludCBudW1fY29kZXMgPSBWUDhMUmVhZEJpdHMoYnIsIDQpICsgNDsKKyAgICBpZiAobnVtX2NvZGVzID4gTlVNX0NPREVfTEVOR1RIX0NPREVTKSB7CisgICAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUjsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fY29kZXM7ICsraSkgeworICAgICAgY29kZV9sZW5ndGhfY29kZV9sZW5ndGhzW2tDb2RlTGVuZ3RoQ29kZU9yZGVyW2ldXSA9IFZQOExSZWFkQml0cyhiciwgMyk7CisgICAgfQorICAgIG9rID0gUmVhZEh1ZmZtYW5Db2RlTGVuZ3RocyhkZWMsIGNvZGVfbGVuZ3RoX2NvZGVfbGVuZ3RocywgYWxwaGFiZXRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZV9sZW5ndGhzKTsKKyAgfQorCisgIG9rID0gb2sgJiYgIWJyLT5lb3NfOworICBpZiAob2spIHsKKyAgICBzaXplID0gVlA4TEJ1aWxkSHVmZm1hblRhYmxlKHRhYmxlLCBIVUZGTUFOX1RBQkxFX0JJVFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlX2xlbmd0aHMsIGFscGhhYmV0X3NpemUpOworICB9CisgIGlmICghb2sgfHwgc2l6ZSA9PSAwKSB7CisgICAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBpbnQgUmVhZEh1ZmZtYW5Db2RlcyhWUDhMRGVjb2RlciogY29uc3QgZGVjLCBpbnQgeHNpemUsIGludCB5c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sb3JfY2FjaGVfYml0cywgaW50IGFsbG93X3JlY3Vyc2lvbikgeworICBpbnQgaSwgajsKKyAgVlA4TEJpdFJlYWRlciogY29uc3QgYnIgPSAmZGVjLT5icl87CisgIFZQOExNZXRhZGF0YSogY29uc3QgaGRyID0gJmRlYy0+aGRyXzsKKyAgdWludDMyX3QqIGh1ZmZtYW5faW1hZ2UgPSBOVUxMOworICBIVHJlZUdyb3VwKiBodHJlZV9ncm91cHMgPSBOVUxMOworICBIdWZmbWFuQ29kZSogaHVmZm1hbl90YWJsZXMgPSBOVUxMOworICBIdWZmbWFuQ29kZSogbmV4dCA9IE5VTEw7CisgIGludCBudW1faHRyZWVfZ3JvdXBzID0gMTsKKyAgaW50IG1heF9hbHBoYWJldF9zaXplID0gMDsKKyAgaW50KiBjb2RlX2xlbmd0aHMgPSBOVUxMOworICBjb25zdCBpbnQgdGFibGVfc2l6ZSA9IGtUYWJsZVNpemVbY29sb3JfY2FjaGVfYml0c107CisKKyAgaWYgKGFsbG93X3JlY3Vyc2lvbiAmJiBWUDhMUmVhZEJpdHMoYnIsIDEpKSB7CisgICAgLy8gdXNlIG1ldGEgSHVmZm1hbiBjb2Rlcy4KKyAgICBjb25zdCBpbnQgaHVmZm1hbl9wcmVjaXNpb24gPSBWUDhMUmVhZEJpdHMoYnIsIDMpICsgMjsKKyAgICBjb25zdCBpbnQgaHVmZm1hbl94c2l6ZSA9IFZQOExTdWJTYW1wbGVTaXplKHhzaXplLCBodWZmbWFuX3ByZWNpc2lvbik7CisgICAgY29uc3QgaW50IGh1ZmZtYW5feXNpemUgPSBWUDhMU3ViU2FtcGxlU2l6ZSh5c2l6ZSwgaHVmZm1hbl9wcmVjaXNpb24pOworICAgIGNvbnN0IGludCBodWZmbWFuX3BpeHMgPSBodWZmbWFuX3hzaXplICogaHVmZm1hbl95c2l6ZTsKKyAgICBpZiAoIURlY29kZUltYWdlU3RyZWFtKGh1ZmZtYW5feHNpemUsIGh1ZmZtYW5feXNpemUsIDAsIGRlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZodWZmbWFuX2ltYWdlKSkgeworICAgICAgZ290byBFcnJvcjsKKyAgICB9CisgICAgaGRyLT5odWZmbWFuX3N1YnNhbXBsZV9iaXRzXyA9IGh1ZmZtYW5fcHJlY2lzaW9uOworICAgIGZvciAoaSA9IDA7IGkgPCBodWZmbWFuX3BpeHM7ICsraSkgeworICAgICAgLy8gVGhlIGh1ZmZtYW4gZGF0YSBpcyBzdG9yZWQgaW4gcmVkIGFuZCBncmVlbiBieXRlcy4KKyAgICAgIGNvbnN0IGludCBncm91cCA9IChodWZmbWFuX2ltYWdlW2ldID4+IDgpICYgMHhmZmZmOworICAgICAgaHVmZm1hbl9pbWFnZVtpXSA9IGdyb3VwOworICAgICAgaWYgKGdyb3VwID49IG51bV9odHJlZV9ncm91cHMpIHsKKyAgICAgICAgbnVtX2h0cmVlX2dyb3VwcyA9IGdyb3VwICsgMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoYnItPmVvc18pIGdvdG8gRXJyb3I7CisKKyAgLy8gRmluZCBtYXhpbXVtIGFscGhhYmV0IHNpemUgZm9yIHRoZSBodHJlZSBncm91cC4KKyAgZm9yIChqID0gMDsgaiA8IEhVRkZNQU5fQ09ERVNfUEVSX01FVEFfQ09ERTsgKytqKSB7CisgICAgaW50IGFscGhhYmV0X3NpemUgPSBrQWxwaGFiZXRTaXplW2pdOworICAgIGlmIChqID09IDAgJiYgY29sb3JfY2FjaGVfYml0cyA+IDApIHsKKyAgICAgIGFscGhhYmV0X3NpemUgKz0gMSA8PCBjb2xvcl9jYWNoZV9iaXRzOworICAgIH0KKyAgICBpZiAobWF4X2FscGhhYmV0X3NpemUgPCBhbHBoYWJldF9zaXplKSB7CisgICAgICBtYXhfYWxwaGFiZXRfc2l6ZSA9IGFscGhhYmV0X3NpemU7CisgICAgfQorICB9CisKKyAgaHVmZm1hbl90YWJsZXMgPSAoSHVmZm1hbkNvZGUqKVdlYlBTYWZlTWFsbG9jKG51bV9odHJlZV9ncm91cHMgKiB0YWJsZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpodWZmbWFuX3RhYmxlcykpOworICBodHJlZV9ncm91cHMgPSBWUDhMSHRyZWVHcm91cHNOZXcobnVtX2h0cmVlX2dyb3Vwcyk7CisgIGNvZGVfbGVuZ3RocyA9IChpbnQqKVdlYlBTYWZlQ2FsbG9jKCh1aW50NjRfdCltYXhfYWxwaGFiZXRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpjb2RlX2xlbmd0aHMpKTsKKworICBpZiAoaHRyZWVfZ3JvdXBzID09IE5VTEwgfHwgY29kZV9sZW5ndGhzID09IE5VTEwgfHwgaHVmZm1hbl90YWJsZXMgPT0gTlVMTCkgeworICAgIGRlYy0+c3RhdHVzXyA9IFZQOF9TVEFUVVNfT1VUX09GX01FTU9SWTsKKyAgICBnb3RvIEVycm9yOworICB9CisKKyAgbmV4dCA9IGh1ZmZtYW5fdGFibGVzOworICBmb3IgKGkgPSAwOyBpIDwgbnVtX2h0cmVlX2dyb3VwczsgKytpKSB7CisgICAgSFRyZWVHcm91cCogY29uc3QgaHRyZWVfZ3JvdXAgPSAmaHRyZWVfZ3JvdXBzW2ldOworICAgIEh1ZmZtYW5Db2RlKiogY29uc3QgaHRyZWVzID0gaHRyZWVfZ3JvdXAtPmh0cmVlczsKKyAgICBpbnQgc2l6ZTsKKyAgICBpbnQgdG90YWxfc2l6ZSA9IDA7CisgICAgaW50IGlzX3RyaXZpYWxfbGl0ZXJhbCA9IDE7CisgICAgaW50IG1heF9iaXRzID0gMDsKKyAgICBmb3IgKGogPSAwOyBqIDwgSFVGRk1BTl9DT0RFU19QRVJfTUVUQV9DT0RFOyArK2opIHsKKyAgICAgIGludCBhbHBoYWJldF9zaXplID0ga0FscGhhYmV0U2l6ZVtqXTsKKyAgICAgIGh0cmVlc1tqXSA9IG5leHQ7CisgICAgICBpZiAoaiA9PSAwICYmIGNvbG9yX2NhY2hlX2JpdHMgPiAwKSB7CisgICAgICAgIGFscGhhYmV0X3NpemUgKz0gMSA8PCBjb2xvcl9jYWNoZV9iaXRzOworICAgICAgfQorICAgICAgc2l6ZSA9IFJlYWRIdWZmbWFuQ29kZShhbHBoYWJldF9zaXplLCBkZWMsIGNvZGVfbGVuZ3RocywgbmV4dCk7CisgICAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICB9CisgICAgICBpZiAoaXNfdHJpdmlhbF9saXRlcmFsICYmIGtMaXRlcmFsTWFwW2pdID09IDEpIHsKKyAgICAgICAgaXNfdHJpdmlhbF9saXRlcmFsID0gKG5leHQtPmJpdHMgPT0gMCk7CisgICAgICB9CisgICAgICB0b3RhbF9zaXplICs9IG5leHQtPmJpdHM7CisgICAgICBuZXh0ICs9IHNpemU7CisgICAgICBpZiAoaiA8PSBBTFBIQSkgeworICAgICAgICBpbnQgbG9jYWxfbWF4X2JpdHMgPSBjb2RlX2xlbmd0aHNbMF07CisgICAgICAgIGludCBrOworICAgICAgICBmb3IgKGsgPSAxOyBrIDwgYWxwaGFiZXRfc2l6ZTsgKytrKSB7CisgICAgICAgICAgaWYgKGNvZGVfbGVuZ3Roc1trXSA+IGxvY2FsX21heF9iaXRzKSB7CisgICAgICAgICAgICBsb2NhbF9tYXhfYml0cyA9IGNvZGVfbGVuZ3Roc1trXTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbWF4X2JpdHMgKz0gbG9jYWxfbWF4X2JpdHM7CisgICAgICB9CisgICAgfQorICAgIGh0cmVlX2dyb3VwLT5pc190cml2aWFsX2xpdGVyYWwgPSBpc190cml2aWFsX2xpdGVyYWw7CisgICAgaHRyZWVfZ3JvdXAtPmlzX3RyaXZpYWxfY29kZSA9IDA7CisgICAgaWYgKGlzX3RyaXZpYWxfbGl0ZXJhbCkgeworICAgICAgY29uc3QgaW50IHJlZCA9IGh0cmVlc1tSRURdWzBdLnZhbHVlOworICAgICAgY29uc3QgaW50IGJsdWUgPSBodHJlZXNbQkxVRV1bMF0udmFsdWU7CisgICAgICBjb25zdCBpbnQgYWxwaGEgPSBodHJlZXNbQUxQSEFdWzBdLnZhbHVlOworICAgICAgaHRyZWVfZ3JvdXAtPmxpdGVyYWxfYXJiID0KKyAgICAgICAgICAoKHVpbnQzMl90KWFscGhhIDw8IDI0KSB8IChyZWQgPDwgMTYpIHwgYmx1ZTsKKyAgICAgIGlmICh0b3RhbF9zaXplID09IDAgJiYgaHRyZWVzW0dSRUVOXVswXS52YWx1ZSA8IE5VTV9MSVRFUkFMX0NPREVTKSB7CisgICAgICAgIGh0cmVlX2dyb3VwLT5pc190cml2aWFsX2NvZGUgPSAxOworICAgICAgICBodHJlZV9ncm91cC0+bGl0ZXJhbF9hcmIgfD0gaHRyZWVzW0dSRUVOXVswXS52YWx1ZSA8PCA4OworICAgICAgfQorICAgIH0KKyAgICBodHJlZV9ncm91cC0+dXNlX3BhY2tlZF90YWJsZSA9ICFodHJlZV9ncm91cC0+aXNfdHJpdmlhbF9jb2RlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF4X2JpdHMgPCBIVUZGTUFOX1BBQ0tFRF9CSVRTKTsKKyAgICBpZiAoaHRyZWVfZ3JvdXAtPnVzZV9wYWNrZWRfdGFibGUpIEJ1aWxkUGFja2VkVGFibGUoaHRyZWVfZ3JvdXApOworICB9CisgIFdlYlBTYWZlRnJlZShjb2RlX2xlbmd0aHMpOworCisgIC8vIEFsbCBPSy4gRmluYWxpemUgcG9pbnRlcnMgYW5kIHJldHVybi4KKyAgaGRyLT5odWZmbWFuX2ltYWdlXyA9IGh1ZmZtYW5faW1hZ2U7CisgIGhkci0+bnVtX2h0cmVlX2dyb3Vwc18gPSBudW1faHRyZWVfZ3JvdXBzOworICBoZHItPmh0cmVlX2dyb3Vwc18gPSBodHJlZV9ncm91cHM7CisgIGhkci0+aHVmZm1hbl90YWJsZXNfID0gaHVmZm1hbl90YWJsZXM7CisgIHJldHVybiAxOworCisgRXJyb3I6CisgIFdlYlBTYWZlRnJlZShjb2RlX2xlbmd0aHMpOworICBXZWJQU2FmZUZyZWUoaHVmZm1hbl9pbWFnZSk7CisgIFdlYlBTYWZlRnJlZShodWZmbWFuX3RhYmxlcyk7CisgIFZQOExIdHJlZUdyb3Vwc0ZyZWUoaHRyZWVfZ3JvdXBzKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTY2FsaW5nLgorCisjaWYgIWRlZmluZWQoV0VCUF9SRURVQ0VfU0laRSkKK3N0YXRpYyBpbnQgQWxsb2NhdGVBbmRJbml0UmVzY2FsZXIoVlA4TERlY29kZXIqIGNvbnN0IGRlYywgVlA4SW8qIGNvbnN0IGlvKSB7CisgIGNvbnN0IGludCBudW1fY2hhbm5lbHMgPSA0OworICBjb25zdCBpbnQgaW5fd2lkdGggPSBpby0+bWJfdzsKKyAgY29uc3QgaW50IG91dF93aWR0aCA9IGlvLT5zY2FsZWRfd2lkdGg7CisgIGNvbnN0IGludCBpbl9oZWlnaHQgPSBpby0+bWJfaDsKKyAgY29uc3QgaW50IG91dF9oZWlnaHQgPSBpby0+c2NhbGVkX2hlaWdodDsKKyAgY29uc3QgdWludDY0X3Qgd29ya19zaXplID0gMiAqIG51bV9jaGFubmVscyAqICh1aW50NjRfdClvdXRfd2lkdGg7CisgIHJlc2NhbGVyX3QqIHdvcms7ICAgICAgICAvLyBSZXNjYWxlciB3b3JrIGFyZWEuCisgIGNvbnN0IHVpbnQ2NF90IHNjYWxlZF9kYXRhX3NpemUgPSAodWludDY0X3Qpb3V0X3dpZHRoOworICB1aW50MzJfdCogc2NhbGVkX2RhdGE7ICAvLyBUZW1wb3Jhcnkgc3RvcmFnZSBmb3Igc2NhbGVkIEJHUkEgZGF0YS4KKyAgY29uc3QgdWludDY0X3QgbWVtb3J5X3NpemUgPSBzaXplb2YoKmRlYy0+cmVzY2FsZXIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrX3NpemUgKiBzaXplb2YoKndvcmspICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZWRfZGF0YV9zaXplICogc2l6ZW9mKCpzY2FsZWRfZGF0YSk7CisgIHVpbnQ4X3QqIG1lbW9yeSA9ICh1aW50OF90KilXZWJQU2FmZU1hbGxvYyhtZW1vcnlfc2l6ZSwgc2l6ZW9mKCptZW1vcnkpKTsKKyAgaWYgKG1lbW9yeSA9PSBOVUxMKSB7CisgICAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19PVVRfT0ZfTUVNT1JZOworICAgIHJldHVybiAwOworICB9CisgIGFzc2VydChkZWMtPnJlc2NhbGVyX21lbW9yeSA9PSBOVUxMKTsKKyAgZGVjLT5yZXNjYWxlcl9tZW1vcnkgPSBtZW1vcnk7CisKKyAgZGVjLT5yZXNjYWxlciA9IChXZWJQUmVzY2FsZXIqKW1lbW9yeTsKKyAgbWVtb3J5ICs9IHNpemVvZigqZGVjLT5yZXNjYWxlcik7CisgIHdvcmsgPSAocmVzY2FsZXJfdCopbWVtb3J5OworICBtZW1vcnkgKz0gd29ya19zaXplICogc2l6ZW9mKCp3b3JrKTsKKyAgc2NhbGVkX2RhdGEgPSAodWludDMyX3QqKW1lbW9yeTsKKworICBXZWJQUmVzY2FsZXJJbml0KGRlYy0+cmVzY2FsZXIsIGluX3dpZHRoLCBpbl9oZWlnaHQsICh1aW50OF90KilzY2FsZWRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICBvdXRfd2lkdGgsIG91dF9oZWlnaHQsIDAsIG51bV9jaGFubmVscywgd29yayk7CisgIHJldHVybiAxOworfQorI2VuZGlmICAgLy8gV0VCUF9SRURVQ0VfU0laRQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRXhwb3J0IHRvIEFSR0IKKworI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX1NJWkUpCisKKy8vIFdlIGhhdmUgc3BlY2lhbCAiZXhwb3J0IiBmdW5jdGlvbiBzaW5jZSB3ZSBuZWVkIHRvIGNvbnZlcnQgZnJvbSBCR1JBCitzdGF0aWMgaW50IEV4cG9ydChXZWJQUmVzY2FsZXIqIGNvbnN0IHJlc2NhbGVyLCBXRUJQX0NTUF9NT0RFIGNvbG9yc3BhY2UsCisgICAgICAgICAgICAgICAgICBpbnQgcmdiYV9zdHJpZGUsIHVpbnQ4X3QqIGNvbnN0IHJnYmEpIHsKKyAgdWludDMyX3QqIGNvbnN0IHNyYyA9ICh1aW50MzJfdCopcmVzY2FsZXItPmRzdDsKKyAgY29uc3QgaW50IGRzdF93aWR0aCA9IHJlc2NhbGVyLT5kc3Rfd2lkdGg7CisgIGludCBudW1fbGluZXNfb3V0ID0gMDsKKyAgd2hpbGUgKFdlYlBSZXNjYWxlckhhc1BlbmRpbmdPdXRwdXQocmVzY2FsZXIpKSB7CisgICAgdWludDhfdCogY29uc3QgZHN0ID0gcmdiYSArIG51bV9saW5lc19vdXQgKiByZ2JhX3N0cmlkZTsKKyAgICBXZWJQUmVzY2FsZXJFeHBvcnRSb3cocmVzY2FsZXIpOworICAgIFdlYlBNdWx0QVJHQlJvdyhzcmMsIGRzdF93aWR0aCwgMSk7CisgICAgVlA4TENvbnZlcnRGcm9tQkdSQShzcmMsIGRzdF93aWR0aCwgY29sb3JzcGFjZSwgZHN0KTsKKyAgICArK251bV9saW5lc19vdXQ7CisgIH0KKyAgcmV0dXJuIG51bV9saW5lc19vdXQ7Cit9CisKKy8vIEVtaXQgc2NhbGVkIHJvd3MuCitzdGF0aWMgaW50IEVtaXRSZXNjYWxlZFJvd3NSR0JBKGNvbnN0IFZQOExEZWNvZGVyKiBjb25zdCBkZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGluLCBpbnQgaW5fc3RyaWRlLCBpbnQgbWJfaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3Qgb3V0LCBpbnQgb3V0X3N0cmlkZSkgeworICBjb25zdCBXRUJQX0NTUF9NT0RFIGNvbG9yc3BhY2UgPSBkZWMtPm91dHB1dF8tPmNvbG9yc3BhY2U7CisgIGludCBudW1fbGluZXNfaW4gPSAwOworICBpbnQgbnVtX2xpbmVzX291dCA9IDA7CisgIHdoaWxlIChudW1fbGluZXNfaW4gPCBtYl9oKSB7CisgICAgdWludDhfdCogY29uc3Qgcm93X2luID0gaW4gKyBudW1fbGluZXNfaW4gKiBpbl9zdHJpZGU7CisgICAgdWludDhfdCogY29uc3Qgcm93X291dCA9IG91dCArIG51bV9saW5lc19vdXQgKiBvdXRfc3RyaWRlOworICAgIGNvbnN0IGludCBsaW5lc19sZWZ0ID0gbWJfaCAtIG51bV9saW5lc19pbjsKKyAgICBjb25zdCBpbnQgbmVlZGVkX2xpbmVzID0gV2ViUFJlc2NhbGVOZWVkZWRMaW5lcyhkZWMtPnJlc2NhbGVyLCBsaW5lc19sZWZ0KTsKKyAgICBpbnQgbGluZXNfaW1wb3J0ZWQ7CisgICAgYXNzZXJ0KG5lZWRlZF9saW5lcyA+IDAgJiYgbmVlZGVkX2xpbmVzIDw9IGxpbmVzX2xlZnQpOworICAgIFdlYlBNdWx0QVJHQlJvd3Mocm93X2luLCBpbl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICBkZWMtPnJlc2NhbGVyLT5zcmNfd2lkdGgsIG5lZWRlZF9saW5lcywgMCk7CisgICAgbGluZXNfaW1wb3J0ZWQgPQorICAgICAgICBXZWJQUmVzY2FsZXJJbXBvcnQoZGVjLT5yZXNjYWxlciwgbGluZXNfbGVmdCwgcm93X2luLCBpbl9zdHJpZGUpOworICAgIGFzc2VydChsaW5lc19pbXBvcnRlZCA9PSBuZWVkZWRfbGluZXMpOworICAgIG51bV9saW5lc19pbiArPSBsaW5lc19pbXBvcnRlZDsKKyAgICBudW1fbGluZXNfb3V0ICs9IEV4cG9ydChkZWMtPnJlc2NhbGVyLCBjb2xvcnNwYWNlLCBvdXRfc3RyaWRlLCByb3dfb3V0KTsKKyAgfQorICByZXR1cm4gbnVtX2xpbmVzX291dDsKK30KKworI2VuZGlmICAgLy8gV0VCUF9SRURVQ0VfU0laRQorCisvLyBFbWl0IHJvd3Mgd2l0aG91dCBhbnkgc2NhbGluZy4KK3N0YXRpYyBpbnQgRW1pdFJvd3MoV0VCUF9DU1BfTU9ERSBjb2xvcnNwYWNlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiByb3dfaW4sIGludCBpbl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgIGludCBtYl93LCBpbnQgbWJfaCwKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3Qgb3V0LCBpbnQgb3V0X3N0cmlkZSkgeworICBpbnQgbGluZXMgPSBtYl9oOworICB1aW50OF90KiByb3dfb3V0ID0gb3V0OworICB3aGlsZSAobGluZXMtLSA+IDApIHsKKyAgICBWUDhMQ29udmVydEZyb21CR1JBKChjb25zdCB1aW50MzJfdCopcm93X2luLCBtYl93LCBjb2xvcnNwYWNlLCByb3dfb3V0KTsKKyAgICByb3dfaW4gKz0gaW5fc3RyaWRlOworICAgIHJvd19vdXQgKz0gb3V0X3N0cmlkZTsKKyAgfQorICByZXR1cm4gbWJfaDsgIC8vIE51bSByb3dzIG91dCA9PSBudW0gcm93cyBpbi4KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEV4cG9ydCB0byBZVVZBCisKK3N0YXRpYyB2b2lkIENvbnZlcnRUb1lVVkEoY29uc3QgdWludDMyX3QqIGNvbnN0IHNyYywgaW50IHdpZHRoLCBpbnQgeV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IG91dHB1dCkgeworICBjb25zdCBXZWJQWVVWQUJ1ZmZlciogY29uc3QgYnVmID0gJm91dHB1dC0+dS5ZVVZBOworCisgIC8vIGZpcnN0LCB0aGUgbHVtYSBwbGFuZQorICBXZWJQQ29udmVydEFSR0JUb1koc3JjLCBidWYtPnkgKyB5X3BvcyAqIGJ1Zi0+eV9zdHJpZGUsIHdpZHRoKTsKKworICAvLyB0aGVuIFUvViBwbGFuZXMKKyAgeworICAgIHVpbnQ4X3QqIGNvbnN0IHUgPSBidWYtPnUgKyAoeV9wb3MgPj4gMSkgKiBidWYtPnVfc3RyaWRlOworICAgIHVpbnQ4X3QqIGNvbnN0IHYgPSBidWYtPnYgKyAoeV9wb3MgPj4gMSkgKiBidWYtPnZfc3RyaWRlOworICAgIC8vIGV2ZW4gbGluZXM6IHN0b3JlIHZhbHVlcworICAgIC8vIG9kZCBsaW5lczogYXZlcmFnZSB3aXRoIHByZXZpb3VzIHZhbHVlcworICAgIFdlYlBDb252ZXJ0QVJHQlRvVVYoc3JjLCB1LCB2LCB3aWR0aCwgISh5X3BvcyAmIDEpKTsKKyAgfQorICAvLyBMYXN0bHksIHN0b3JlIGFscGhhIGlmIG5lZWRlZC4KKyAgaWYgKGJ1Zi0+YSAhPSBOVUxMKSB7CisgICAgdWludDhfdCogY29uc3QgYSA9IGJ1Zi0+YSArIHlfcG9zICogYnVmLT5hX3N0cmlkZTsKKyNpZiBkZWZpbmVkKFdPUkRTX0JJR0VORElBTikKKyAgICBXZWJQRXh0cmFjdEFscGhhKCh1aW50OF90KilzcmMgKyAwLCAwLCB3aWR0aCwgMSwgYSwgMCk7CisjZWxzZQorICAgIFdlYlBFeHRyYWN0QWxwaGEoKHVpbnQ4X3QqKXNyYyArIDMsIDAsIHdpZHRoLCAxLCBhLCAwKTsKKyNlbmRpZgorICB9Cit9CisKK3N0YXRpYyBpbnQgRXhwb3J0WVVWQShjb25zdCBWUDhMRGVjb2RlciogY29uc3QgZGVjLCBpbnQgeV9wb3MpIHsKKyAgV2ViUFJlc2NhbGVyKiBjb25zdCByZXNjYWxlciA9IGRlYy0+cmVzY2FsZXI7CisgIHVpbnQzMl90KiBjb25zdCBzcmMgPSAodWludDMyX3QqKXJlc2NhbGVyLT5kc3Q7CisgIGNvbnN0IGludCBkc3Rfd2lkdGggPSByZXNjYWxlci0+ZHN0X3dpZHRoOworICBpbnQgbnVtX2xpbmVzX291dCA9IDA7CisgIHdoaWxlIChXZWJQUmVzY2FsZXJIYXNQZW5kaW5nT3V0cHV0KHJlc2NhbGVyKSkgeworICAgIFdlYlBSZXNjYWxlckV4cG9ydFJvdyhyZXNjYWxlcik7CisgICAgV2ViUE11bHRBUkdCUm93KHNyYywgZHN0X3dpZHRoLCAxKTsKKyAgICBDb252ZXJ0VG9ZVVZBKHNyYywgZHN0X3dpZHRoLCB5X3BvcywgZGVjLT5vdXRwdXRfKTsKKyAgICArK3lfcG9zOworICAgICsrbnVtX2xpbmVzX291dDsKKyAgfQorICByZXR1cm4gbnVtX2xpbmVzX291dDsKK30KKworc3RhdGljIGludCBFbWl0UmVzY2FsZWRSb3dzWVVWQShjb25zdCBWUDhMRGVjb2RlciogY29uc3QgZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBpbiwgaW50IGluX3N0cmlkZSwgaW50IG1iX2gpIHsKKyAgaW50IG51bV9saW5lc19pbiA9IDA7CisgIGludCB5X3BvcyA9IGRlYy0+bGFzdF9vdXRfcm93XzsKKyAgd2hpbGUgKG51bV9saW5lc19pbiA8IG1iX2gpIHsKKyAgICBjb25zdCBpbnQgbGluZXNfbGVmdCA9IG1iX2ggLSBudW1fbGluZXNfaW47CisgICAgY29uc3QgaW50IG5lZWRlZF9saW5lcyA9IFdlYlBSZXNjYWxlTmVlZGVkTGluZXMoZGVjLT5yZXNjYWxlciwgbGluZXNfbGVmdCk7CisgICAgaW50IGxpbmVzX2ltcG9ydGVkOworICAgIFdlYlBNdWx0QVJHQlJvd3MoaW4sIGluX3N0cmlkZSwgZGVjLT5yZXNjYWxlci0+c3JjX3dpZHRoLCBuZWVkZWRfbGluZXMsIDApOworICAgIGxpbmVzX2ltcG9ydGVkID0KKyAgICAgICAgV2ViUFJlc2NhbGVySW1wb3J0KGRlYy0+cmVzY2FsZXIsIGxpbmVzX2xlZnQsIGluLCBpbl9zdHJpZGUpOworICAgIGFzc2VydChsaW5lc19pbXBvcnRlZCA9PSBuZWVkZWRfbGluZXMpOworICAgIG51bV9saW5lc19pbiArPSBsaW5lc19pbXBvcnRlZDsKKyAgICBpbiArPSBuZWVkZWRfbGluZXMgKiBpbl9zdHJpZGU7CisgICAgeV9wb3MgKz0gRXhwb3J0WVVWQShkZWMsIHlfcG9zKTsKKyAgfQorICByZXR1cm4geV9wb3M7Cit9CisKK3N0YXRpYyBpbnQgRW1pdFJvd3NZVVZBKGNvbnN0IFZQOExEZWNvZGVyKiBjb25zdCBkZWMsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBpbiwgaW50IGluX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYl93LCBpbnQgbnVtX3Jvd3MpIHsKKyAgaW50IHlfcG9zID0gZGVjLT5sYXN0X291dF9yb3dfOworICB3aGlsZSAobnVtX3Jvd3MtLSA+IDApIHsKKyAgICBDb252ZXJ0VG9ZVVZBKChjb25zdCB1aW50MzJfdCopaW4sIG1iX3csIHlfcG9zLCBkZWMtPm91dHB1dF8pOworICAgIGluICs9IGluX3N0cmlkZTsKKyAgICArK3lfcG9zOworICB9CisgIHJldHVybiB5X3BvczsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENyb3BwaW5nLgorCisvLyBTZXRzIGlvLT5tYl95LCBpby0+bWJfaCAmIGlvLT5tYl93IGFjY29yZGluZyB0byBzdGFydCByb3csIGVuZCByb3cgYW5kCisvLyBjcm9wIG9wdGlvbnMuIEFsc28gdXBkYXRlcyB0aGUgaW5wdXQgZGF0YSBwb2ludGVyLCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKy8vIHN0YXJ0IG9mIHRoZSBjcm9wcGVkIHdpbmRvdy4gTm90ZSB0aGF0IHBpeGVscyBhcmUgaW4gQVJHQiBmb3JtYXQgZXZlbiBpZgorLy8gJ2luX2RhdGEnIGlzIHVpbnQ4X3QqLgorLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBjcm9wIHdpbmRvdyBpcyBub3QgZW1wdHkuCitzdGF0aWMgaW50IFNldENyb3BXaW5kb3coVlA4SW8qIGNvbnN0IGlvLCBpbnQgeV9zdGFydCwgaW50IHlfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBjb25zdCBpbl9kYXRhLCBpbnQgcGl4ZWxfc3RyaWRlKSB7CisgIGFzc2VydCh5X3N0YXJ0IDwgeV9lbmQpOworICBhc3NlcnQoaW8tPmNyb3BfbGVmdCA8IGlvLT5jcm9wX3JpZ2h0KTsKKyAgaWYgKHlfZW5kID4gaW8tPmNyb3BfYm90dG9tKSB7CisgICAgeV9lbmQgPSBpby0+Y3JvcF9ib3R0b207ICAvLyBtYWtlIHN1cmUgd2UgZG9uJ3Qgb3ZlcmZsb3cgb24gbGFzdCByb3cuCisgIH0KKyAgaWYgKHlfc3RhcnQgPCBpby0+Y3JvcF90b3ApIHsKKyAgICBjb25zdCBpbnQgZGVsdGEgPSBpby0+Y3JvcF90b3AgLSB5X3N0YXJ0OworICAgIHlfc3RhcnQgPSBpby0+Y3JvcF90b3A7CisgICAgKmluX2RhdGEgKz0gZGVsdGEgKiBwaXhlbF9zdHJpZGU7CisgIH0KKyAgaWYgKHlfc3RhcnQgPj0geV9lbmQpIHJldHVybiAwOyAgLy8gQ3JvcCB3aW5kb3cgaXMgZW1wdHkuCisKKyAgKmluX2RhdGEgKz0gaW8tPmNyb3BfbGVmdCAqIHNpemVvZih1aW50MzJfdCk7CisKKyAgaW8tPm1iX3kgPSB5X3N0YXJ0IC0gaW8tPmNyb3BfdG9wOworICBpby0+bWJfdyA9IGlvLT5jcm9wX3JpZ2h0IC0gaW8tPmNyb3BfbGVmdDsKKyAgaW8tPm1iX2ggPSB5X2VuZCAtIHlfc3RhcnQ7CisgIHJldHVybiAxOyAgLy8gTm9uLWVtcHR5IGNyb3Agd2luZG93LgorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IEdldE1ldGFJbmRleCgKKyAgICBjb25zdCB1aW50MzJfdCogY29uc3QgaW1hZ2UsIGludCB4c2l6ZSwgaW50IGJpdHMsIGludCB4LCBpbnQgeSkgeworICBpZiAoYml0cyA9PSAwKSByZXR1cm4gMDsKKyAgcmV0dXJuIGltYWdlW3hzaXplICogKHkgPj4gYml0cykgKyAoeCA+PiBiaXRzKV07Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBIVHJlZUdyb3VwKiBHZXRIdHJlZUdyb3VwRm9yUG9zKFZQOExNZXRhZGF0YSogY29uc3QgaGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHgsIGludCB5KSB7CisgIGNvbnN0IGludCBtZXRhX2luZGV4ID0gR2V0TWV0YUluZGV4KGhkci0+aHVmZm1hbl9pbWFnZV8sIGhkci0+aHVmZm1hbl94c2l6ZV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkci0+aHVmZm1hbl9zdWJzYW1wbGVfYml0c18sIHgsIHkpOworICBhc3NlcnQobWV0YV9pbmRleCA8IGhkci0+bnVtX2h0cmVlX2dyb3Vwc18pOworICByZXR1cm4gaGRyLT5odHJlZV9ncm91cHNfICsgbWV0YV9pbmRleDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1haW4gbG9vcCwgd2l0aCBjdXN0b20gcm93LXByb2Nlc3NpbmcgZnVuY3Rpb24KKwordHlwZWRlZiB2b2lkICgqUHJvY2Vzc1Jvd3NGdW5jKShWUDhMRGVjb2RlciogY29uc3QgZGVjLCBpbnQgcm93KTsKKworc3RhdGljIHZvaWQgQXBwbHlJbnZlcnNlVHJhbnNmb3JtcyhWUDhMRGVjb2RlciogY29uc3QgZGVjLCBpbnQgbnVtX3Jvd3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCByb3dzKSB7CisgIGludCBuID0gZGVjLT5uZXh0X3RyYW5zZm9ybV87CisgIGNvbnN0IGludCBjYWNoZV9waXhzID0gZGVjLT53aWR0aF8gKiBudW1fcm93czsKKyAgY29uc3QgaW50IHN0YXJ0X3JvdyA9IGRlYy0+bGFzdF9yb3dfOworICBjb25zdCBpbnQgZW5kX3JvdyA9IHN0YXJ0X3JvdyArIG51bV9yb3dzOworICBjb25zdCB1aW50MzJfdCogcm93c19pbiA9IHJvd3M7CisgIHVpbnQzMl90KiBjb25zdCByb3dzX291dCA9IGRlYy0+YXJnYl9jYWNoZV87CisKKyAgLy8gSW52ZXJzZSB0cmFuc2Zvcm1zLgorICB3aGlsZSAobi0tID4gMCkgeworICAgIFZQOExUcmFuc2Zvcm0qIGNvbnN0IHRyYW5zZm9ybSA9ICZkZWMtPnRyYW5zZm9ybXNfW25dOworICAgIFZQOExJbnZlcnNlVHJhbnNmb3JtKHRyYW5zZm9ybSwgc3RhcnRfcm93LCBlbmRfcm93LCByb3dzX2luLCByb3dzX291dCk7CisgICAgcm93c19pbiA9IHJvd3Nfb3V0OworICB9CisgIGlmIChyb3dzX2luICE9IHJvd3Nfb3V0KSB7CisgICAgLy8gTm8gdHJhbnNmb3JtIGNhbGxlZCwgaGVuY2UganVzdCBjb3B5LgorICAgIG1lbWNweShyb3dzX291dCwgcm93c19pbiwgY2FjaGVfcGl4cyAqIHNpemVvZigqcm93c19vdXQpKTsKKyAgfQorfQorCisvLyBQcm9jZXNzZXMgKHRyYW5zZm9ybXMsIHNjYWxlcyAmIGNvbG9yLWNvbnZlcnRzKSB0aGUgcm93cyBkZWNvZGVkIGFmdGVyIHRoZQorLy8gbGFzdCBjYWxsLgorc3RhdGljIHZvaWQgUHJvY2Vzc1Jvd3MoVlA4TERlY29kZXIqIGNvbnN0IGRlYywgaW50IHJvdykgeworICBjb25zdCB1aW50MzJfdCogY29uc3Qgcm93cyA9IGRlYy0+cGl4ZWxzXyArIGRlYy0+d2lkdGhfICogZGVjLT5sYXN0X3Jvd187CisgIGNvbnN0IGludCBudW1fcm93cyA9IHJvdyAtIGRlYy0+bGFzdF9yb3dfOworCisgIGFzc2VydChyb3cgPD0gZGVjLT5pb18tPmNyb3BfYm90dG9tKTsKKyAgLy8gV2UgY2FuJ3QgcHJvY2VzcyBtb3JlIHRoYW4gTlVNX0FSR0JfQ0FDSEVfUk9XUyBhdCBhIHRpbWUgKHRoYXQncyB0aGUgc2l6ZQorICAvLyBvZiBhcmdiX2NhY2hlXyksIGJ1dCB3ZSBjdXJyZW50bHkgZG9uJ3QgbmVlZCBtb3JlIHRoYW4gdGhhdC4KKyAgYXNzZXJ0KG51bV9yb3dzIDw9IE5VTV9BUkdCX0NBQ0hFX1JPV1MpOworICBpZiAobnVtX3Jvd3MgPiAwKSB7ICAgIC8vIEVtaXQgb3V0cHV0LgorICAgIFZQOElvKiBjb25zdCBpbyA9IGRlYy0+aW9fOworICAgIHVpbnQ4X3QqIHJvd3NfZGF0YSA9ICh1aW50OF90KilkZWMtPmFyZ2JfY2FjaGVfOworICAgIGNvbnN0IGludCBpbl9zdHJpZGUgPSBpby0+d2lkdGggKiBzaXplb2YodWludDMyX3QpOyAgLy8gaW4gdW5pdCBvZiBSR0JBCisKKyAgICBBcHBseUludmVyc2VUcmFuc2Zvcm1zKGRlYywgbnVtX3Jvd3MsIHJvd3MpOworICAgIGlmICghU2V0Q3JvcFdpbmRvdyhpbywgZGVjLT5sYXN0X3Jvd18sIHJvdywgJnJvd3NfZGF0YSwgaW5fc3RyaWRlKSkgeworICAgICAgLy8gTm90aGluZyB0byBvdXRwdXQgKHRoaXMgdGltZSkuCisgICAgfSBlbHNlIHsKKyAgICAgIGNvbnN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IG91dHB1dCA9IGRlYy0+b3V0cHV0XzsKKyAgICAgIGlmIChXZWJQSXNSR0JNb2RlKG91dHB1dC0+Y29sb3JzcGFjZSkpIHsgIC8vIGNvbnZlcnQgdG8gUkdCQQorICAgICAgICBjb25zdCBXZWJQUkdCQUJ1ZmZlciogY29uc3QgYnVmID0gJm91dHB1dC0+dS5SR0JBOworICAgICAgICB1aW50OF90KiBjb25zdCByZ2JhID0gYnVmLT5yZ2JhICsgZGVjLT5sYXN0X291dF9yb3dfICogYnVmLT5zdHJpZGU7CisgICAgICAgIGNvbnN0IGludCBudW1fcm93c19vdXQgPQorI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX1NJWkUpCisgICAgICAgICBpby0+dXNlX3NjYWxpbmcgPworICAgICAgICAgICAgRW1pdFJlc2NhbGVkUm93c1JHQkEoZGVjLCByb3dzX2RhdGEsIGluX3N0cmlkZSwgaW8tPm1iX2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ2JhLCBidWYtPnN0cmlkZSkgOgorI2VuZGlmICAvLyBXRUJQX1JFRFVDRV9TSVpFCisgICAgICAgICAgICBFbWl0Um93cyhvdXRwdXQtPmNvbG9yc3BhY2UsIHJvd3NfZGF0YSwgaW5fc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgaW8tPm1iX3csIGlvLT5tYl9oLCByZ2JhLCBidWYtPnN0cmlkZSk7CisgICAgICAgIC8vIFVwZGF0ZSAnbGFzdF9vdXRfcm93XycuCisgICAgICAgIGRlYy0+bGFzdF9vdXRfcm93XyArPSBudW1fcm93c19vdXQ7CisgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gWVVWQQorICAgICAgICBkZWMtPmxhc3Rfb3V0X3Jvd18gPSBpby0+dXNlX3NjYWxpbmcgPworICAgICAgICAgICAgRW1pdFJlc2NhbGVkUm93c1lVVkEoZGVjLCByb3dzX2RhdGEsIGluX3N0cmlkZSwgaW8tPm1iX2gpIDoKKyAgICAgICAgICAgIEVtaXRSb3dzWVVWQShkZWMsIHJvd3NfZGF0YSwgaW5fc3RyaWRlLCBpby0+bWJfdywgaW8tPm1iX2gpOworICAgICAgfQorICAgICAgYXNzZXJ0KGRlYy0+bGFzdF9vdXRfcm93XyA8PSBvdXRwdXQtPmhlaWdodCk7CisgICAgfQorICB9CisKKyAgLy8gVXBkYXRlICdsYXN0X3Jvd18nLgorICBkZWMtPmxhc3Rfcm93XyA9IHJvdzsKKyAgYXNzZXJ0KGRlYy0+bGFzdF9yb3dfIDw9IGRlYy0+aGVpZ2h0Xyk7Cit9CisKKy8vIFJvdy1wcm9jZXNzaW5nIGZvciB0aGUgc3BlY2lhbCBjYXNlIHdoZW4gYWxwaGEgZGF0YSBjb250YWlucyBvbmx5IG9uZQorLy8gdHJhbnNmb3JtIChjb2xvciBpbmRleGluZyksIGFuZCB0cml2aWFsIG5vbi1ncmVlbiBsaXRlcmFscy4KK3N0YXRpYyBpbnQgSXM4Yk9wdGltaXphYmxlKGNvbnN0IFZQOExNZXRhZGF0YSogY29uc3QgaGRyKSB7CisgIGludCBpOworICBpZiAoaGRyLT5jb2xvcl9jYWNoZV9zaXplXyA+IDApIHJldHVybiAwOworICAvLyBXaGVuIHRoZSBIdWZmbWFuIHRyZWUgY29udGFpbnMgb25seSBvbmUgc3ltYm9sLCB3ZSBjYW4gc2tpcCB0aGUKKyAgLy8gY2FsbCB0byBSZWFkU3ltYm9sKCkgZm9yIHJlZC9ibHVlL2FscGhhIGNoYW5uZWxzLgorICBmb3IgKGkgPSAwOyBpIDwgaGRyLT5udW1faHRyZWVfZ3JvdXBzXzsgKytpKSB7CisgICAgSHVmZm1hbkNvZGUqKiBjb25zdCBodHJlZXMgPSBoZHItPmh0cmVlX2dyb3Vwc19baV0uaHRyZWVzOworICAgIGlmIChodHJlZXNbUkVEXVswXS5iaXRzID4gMCkgcmV0dXJuIDA7CisgICAgaWYgKGh0cmVlc1tCTFVFXVswXS5iaXRzID4gMCkgcmV0dXJuIDA7CisgICAgaWYgKGh0cmVlc1tBTFBIQV1bMF0uYml0cyA+IDApIHJldHVybiAwOworICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBBbHBoYUFwcGx5RmlsdGVyKEFMUEhEZWNvZGVyKiBjb25zdCBhbHBoX2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpcnN0X3JvdywgaW50IGxhc3Rfcm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXQsIGludCBzdHJpZGUpIHsKKyAgaWYgKGFscGhfZGVjLT5maWx0ZXJfICE9IFdFQlBfRklMVEVSX05PTkUpIHsKKyAgICBpbnQgeTsKKyAgICBjb25zdCB1aW50OF90KiBwcmV2X2xpbmUgPSBhbHBoX2RlYy0+cHJldl9saW5lXzsKKyAgICBhc3NlcnQoV2ViUFVuZmlsdGVyc1thbHBoX2RlYy0+ZmlsdGVyX10gIT0gTlVMTCk7CisgICAgZm9yICh5ID0gZmlyc3Rfcm93OyB5IDwgbGFzdF9yb3c7ICsreSkgeworICAgICAgV2ViUFVuZmlsdGVyc1thbHBoX2RlYy0+ZmlsdGVyX10ocHJldl9saW5lLCBvdXQsIG91dCwgc3RyaWRlKTsKKyAgICAgIHByZXZfbGluZSA9IG91dDsKKyAgICAgIG91dCArPSBzdHJpZGU7CisgICAgfQorICAgIGFscGhfZGVjLT5wcmV2X2xpbmVfID0gcHJldl9saW5lOworICB9Cit9CisKK3N0YXRpYyB2b2lkIEV4dHJhY3RQYWxldHRlZEFscGhhUm93cyhWUDhMRGVjb2RlciogY29uc3QgZGVjLCBpbnQgbGFzdF9yb3cpIHsKKyAgLy8gRm9yIHZlcnRpY2FsIGFuZCBncmFkaWVudCBmaWx0ZXJpbmcsIHdlIG5lZWQgdG8gZGVjb2RlIHRoZSBwYXJ0IGFib3ZlIHRoZQorICAvLyBjcm9wX3RvcCByb3csIGluIG9yZGVyIHRvIGhhdmUgdGhlIGNvcnJlY3Qgc3BhdGlhbCBwcmVkaWN0b3JzLgorICBBTFBIRGVjb2RlciogY29uc3QgYWxwaF9kZWMgPSAoQUxQSERlY29kZXIqKWRlYy0+aW9fLT5vcGFxdWU7CisgIGNvbnN0IGludCB0b3Bfcm93ID0KKyAgICAgIChhbHBoX2RlYy0+ZmlsdGVyXyA9PSBXRUJQX0ZJTFRFUl9OT05FIHx8CisgICAgICAgYWxwaF9kZWMtPmZpbHRlcl8gPT0gV0VCUF9GSUxURVJfSE9SSVpPTlRBTCkgPyBkZWMtPmlvXy0+Y3JvcF90b3AKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRlYy0+bGFzdF9yb3dfOworICBjb25zdCBpbnQgZmlyc3Rfcm93ID0gKGRlYy0+bGFzdF9yb3dfIDwgdG9wX3JvdykgPyB0b3Bfcm93IDogZGVjLT5sYXN0X3Jvd187CisgIGFzc2VydChsYXN0X3JvdyA8PSBkZWMtPmlvXy0+Y3JvcF9ib3R0b20pOworICBpZiAobGFzdF9yb3cgPiBmaXJzdF9yb3cpIHsKKyAgICAvLyBTcGVjaWFsIG1ldGhvZCBmb3IgcGFsZXR0ZWQgYWxwaGEgZGF0YS4gV2Ugb25seSBwcm9jZXNzIHRoZSBjcm9wcGVkIGFyZWEuCisgICAgY29uc3QgaW50IHdpZHRoID0gZGVjLT5pb18tPndpZHRoOworICAgIHVpbnQ4X3QqIG91dCA9IGFscGhfZGVjLT5vdXRwdXRfICsgd2lkdGggKiBmaXJzdF9yb3c7CisgICAgY29uc3QgdWludDhfdCogY29uc3QgaW4gPQorICAgICAgKHVpbnQ4X3QqKWRlYy0+cGl4ZWxzXyArIGRlYy0+d2lkdGhfICogZmlyc3Rfcm93OworICAgIFZQOExUcmFuc2Zvcm0qIGNvbnN0IHRyYW5zZm9ybSA9ICZkZWMtPnRyYW5zZm9ybXNfWzBdOworICAgIGFzc2VydChkZWMtPm5leHRfdHJhbnNmb3JtXyA9PSAxKTsKKyAgICBhc3NlcnQodHJhbnNmb3JtLT50eXBlXyA9PSBDT0xPUl9JTkRFWElOR19UUkFOU0ZPUk0pOworICAgIFZQOExDb2xvckluZGV4SW52ZXJzZVRyYW5zZm9ybUFscGhhKHRyYW5zZm9ybSwgZmlyc3Rfcm93LCBsYXN0X3JvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiwgb3V0KTsKKyAgICBBbHBoYUFwcGx5RmlsdGVyKGFscGhfZGVjLCBmaXJzdF9yb3csIGxhc3Rfcm93LCBvdXQsIHdpZHRoKTsKKyAgfQorICBkZWMtPmxhc3Rfcm93XyA9IGRlYy0+bGFzdF9vdXRfcm93XyA9IGxhc3Rfcm93OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgZmFzdCBwYXR0ZXJuIGNvcHkgKDhiIGFuZCAzMmIpCisKKy8vIGN5Y2xpYyByb3RhdGlvbiBvZiBwYXR0ZXJuIHdvcmQKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBSb3RhdGU4Yih1aW50MzJfdCBWKSB7CisjaWYgZGVmaW5lZChXT1JEU19CSUdFTkRJQU4pCisgIHJldHVybiAoKFYgJiAweGZmMDAwMDAwdSkgPj4gMjQpIHwgKFYgPDwgOCk7CisjZWxzZQorICByZXR1cm4gKChWICYgMHhmZnUpIDw8IDI0KSB8IChWID4+IDgpOworI2VuZGlmCit9CisKKy8vIGNvcHkgMSwgMiBvciA0LWJ5dGVzIHBhdHRlcm4KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIENvcHlTbWFsbFBhdHRlcm44Yihjb25zdCB1aW50OF90KiBzcmMsIHVpbnQ4X3QqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoLCB1aW50MzJfdCBwYXR0ZXJuKSB7CisgIGludCBpOworICAvLyBhbGlnbiAnZHN0JyB0byA0LWJ5dGVzIGJvdW5kYXJ5LiBBZGp1c3QgdGhlIHBhdHRlcm4gYWxvbmcgdGhlIHdheS4KKyAgd2hpbGUgKCh1aW50cHRyX3QpZHN0ICYgMykgeworICAgICpkc3QrKyA9ICpzcmMrKzsKKyAgICBwYXR0ZXJuID0gUm90YXRlOGIocGF0dGVybik7CisgICAgLS1sZW5ndGg7CisgIH0KKyAgLy8gQ29weSB0aGUgcGF0dGVybiA0IGJ5dGVzIGF0IGEgdGltZS4KKyAgZm9yIChpID0gMDsgaSA8IChsZW5ndGggPj4gMik7ICsraSkgeworICAgICgodWludDMyX3QqKWRzdClbaV0gPSBwYXR0ZXJuOworICB9CisgIC8vIEZpbmlzaCB3aXRoIGxlZnQtb3ZlcnMuICdwYXR0ZXJuJyBpcyBzdGlsbCBjb3JyZWN0bHkgcG9zaXRpb25lZCwKKyAgLy8gc28gbm8gUm90YXRlOGIoKSBjYWxsIGlzIG5lZWRlZC4KKyAgZm9yIChpIDw8PSAyOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICBkc3RbaV0gPSBzcmNbaV07CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgQ29weUJsb2NrOGIodWludDhfdCogY29uc3QgZHN0LCBpbnQgZGlzdCwgaW50IGxlbmd0aCkgeworICBjb25zdCB1aW50OF90KiBzcmMgPSBkc3QgLSBkaXN0OworICBpZiAobGVuZ3RoID49IDgpIHsKKyAgICB1aW50MzJfdCBwYXR0ZXJuID0gMDsKKyAgICBzd2l0Y2ggKGRpc3QpIHsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgcGF0dGVybiA9IHNyY1swXTsKKyNpZiBkZWZpbmVkKF9fYXJtX18pIHx8IGRlZmluZWQoX01fQVJNKSAgIC8vIGFybSBkb2Vzbid0IGxpa2UgbXVsdGlwbHkgdGhhdCBtdWNoCisgICAgICAgIHBhdHRlcm4gfD0gcGF0dGVybiA8PCA4OworICAgICAgICBwYXR0ZXJuIHw9IHBhdHRlcm4gPDwgMTY7CisjZWxpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFNfRFNQX1IyKQorICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICgicmVwbHYucWIgJTAsICUwIiA6ICIrciIocGF0dGVybikpOworI2Vsc2UKKyAgICAgICAgcGF0dGVybiA9IDB4MDEwMTAxMDF1ICogcGF0dGVybjsKKyNlbmRpZgorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgbWVtY3B5KCZwYXR0ZXJuLCBzcmMsIHNpemVvZih1aW50MTZfdCkpOworI2lmIGRlZmluZWQoX19hcm1fXykgfHwgZGVmaW5lZChfTV9BUk0pCisgICAgICAgIHBhdHRlcm4gfD0gcGF0dGVybiA8PCAxNjsKKyNlbGlmIGRlZmluZWQoV0VCUF9VU0VfTUlQU19EU1BfUjIpCisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKCJyZXBsdi5waCAlMCwgJTAiIDogIityIihwYXR0ZXJuKSk7CisjZWxzZQorICAgICAgICBwYXR0ZXJuID0gMHgwMDAxMDAwMXUgKiBwYXR0ZXJuOworI2VuZGlmCisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA0OgorICAgICAgICBtZW1jcHkoJnBhdHRlcm4sIHNyYywgc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZ290byBDb3B5OworICAgICAgICBicmVhazsKKyAgICB9CisgICAgQ29weVNtYWxsUGF0dGVybjhiKHNyYywgZHN0LCBsZW5ndGgsIHBhdHRlcm4pOworICAgIHJldHVybjsKKyAgfQorIENvcHk6CisgIGlmIChkaXN0ID49IGxlbmd0aCkgeyAgLy8gbm8gb3ZlcmxhcCAtPiB1c2UgbWVtY3B5KCkKKyAgICBtZW1jcHkoZHN0LCBzcmMsIGxlbmd0aCAqIHNpemVvZigqZHN0KSk7CisgIH0gZWxzZSB7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSBkc3RbaV0gPSBzcmNbaV07CisgIH0KK30KKworLy8gY29weSBwYXR0ZXJuIG9mIDEgb3IgMiB1aW50MzJfdCdzCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBDb3B5U21hbGxQYXR0ZXJuMzJiKGNvbnN0IHVpbnQzMl90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgsIHVpbnQ2NF90IHBhdHRlcm4pIHsKKyAgaW50IGk7CisgIGlmICgodWludHB0cl90KWRzdCAmIDQpIHsgICAgICAgICAgIC8vIEFsaWduICdkc3QnIHRvIDgtYnl0ZXMgYm91bmRhcnkuCisgICAgKmRzdCsrID0gKnNyYysrOworICAgIHBhdHRlcm4gPSAocGF0dGVybiA+PiAzMikgfCAocGF0dGVybiA8PCAzMik7CisgICAgLS1sZW5ndGg7CisgIH0KKyAgYXNzZXJ0KDAgPT0gKCh1aW50cHRyX3QpZHN0ICYgNykpOworICBmb3IgKGkgPSAwOyBpIDwgKGxlbmd0aCA+PiAxKTsgKytpKSB7CisgICAgKCh1aW50NjRfdCopZHN0KVtpXSA9IHBhdHRlcm47ICAgIC8vIENvcHkgdGhlIHBhdHRlcm4gOCBieXRlcyBhdCBhIHRpbWUuCisgIH0KKyAgaWYgKGxlbmd0aCAmIDEpIHsgICAgICAgICAgICAgICAgICAgLy8gRmluaXNoIHdpdGggbGVmdC1vdmVyLgorICAgIGRzdFtpIDw8IDFdID0gc3JjW2kgPDwgMV07CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgQ29weUJsb2NrMzJiKHVpbnQzMl90KiBjb25zdCBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpc3QsIGludCBsZW5ndGgpIHsKKyAgY29uc3QgdWludDMyX3QqIGNvbnN0IHNyYyA9IGRzdCAtIGRpc3Q7CisgIGlmIChkaXN0IDw9IDIgJiYgbGVuZ3RoID49IDQgJiYgKCh1aW50cHRyX3QpZHN0ICYgMykgPT0gMCkgeworICAgIHVpbnQ2NF90IHBhdHRlcm47CisgICAgaWYgKGRpc3QgPT0gMSkgeworICAgICAgcGF0dGVybiA9ICh1aW50NjRfdClzcmNbMF07CisgICAgICBwYXR0ZXJuIHw9IHBhdHRlcm4gPDwgMzI7CisgICAgfSBlbHNlIHsKKyAgICAgIG1lbWNweSgmcGF0dGVybiwgc3JjLCBzaXplb2YocGF0dGVybikpOworICAgIH0KKyAgICBDb3B5U21hbGxQYXR0ZXJuMzJiKHNyYywgZHN0LCBsZW5ndGgsIHBhdHRlcm4pOworICB9IGVsc2UgaWYgKGRpc3QgPj0gbGVuZ3RoKSB7ICAvLyBubyBvdmVybGFwCisgICAgbWVtY3B5KGRzdCwgc3JjLCBsZW5ndGggKiBzaXplb2YoKmRzdCkpOworICB9IGVsc2UgeworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgZHN0W2ldID0gc3JjW2ldOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBpbnQgRGVjb2RlQWxwaGFEYXRhKFZQOExEZWNvZGVyKiBjb25zdCBkZWMsIHVpbnQ4X3QqIGNvbnN0IGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBsYXN0X3JvdykgeworICBpbnQgb2sgPSAxOworICBpbnQgcm93ID0gZGVjLT5sYXN0X3BpeGVsXyAvIHdpZHRoOworICBpbnQgY29sID0gZGVjLT5sYXN0X3BpeGVsXyAlIHdpZHRoOworICBWUDhMQml0UmVhZGVyKiBjb25zdCBiciA9ICZkZWMtPmJyXzsKKyAgVlA4TE1ldGFkYXRhKiBjb25zdCBoZHIgPSAmZGVjLT5oZHJfOworICBpbnQgcG9zID0gZGVjLT5sYXN0X3BpeGVsXzsgICAgICAgICAvLyBjdXJyZW50IHBvc2l0aW9uCisgIGNvbnN0IGludCBlbmQgPSB3aWR0aCAqIGhlaWdodDsgICAgIC8vIEVuZCBvZiBkYXRhCisgIGNvbnN0IGludCBsYXN0ID0gd2lkdGggKiBsYXN0X3JvdzsgIC8vIExhc3QgcGl4ZWwgdG8gZGVjb2RlCisgIGNvbnN0IGludCBsZW5fY29kZV9saW1pdCA9IE5VTV9MSVRFUkFMX0NPREVTICsgTlVNX0xFTkdUSF9DT0RFUzsKKyAgY29uc3QgaW50IG1hc2sgPSBoZHItPmh1ZmZtYW5fbWFza187CisgIGNvbnN0IEhUcmVlR3JvdXAqIGh0cmVlX2dyb3VwID0KKyAgICAgIChwb3MgPCBsYXN0KSA/IEdldEh0cmVlR3JvdXBGb3JQb3MoaGRyLCBjb2wsIHJvdykgOiBOVUxMOworICBhc3NlcnQocG9zIDw9IGVuZCk7CisgIGFzc2VydChsYXN0X3JvdyA8PSBoZWlnaHQpOworICBhc3NlcnQoSXM4Yk9wdGltaXphYmxlKGhkcikpOworCisgIHdoaWxlICghYnItPmVvc18gJiYgcG9zIDwgbGFzdCkgeworICAgIGludCBjb2RlOworICAgIC8vIE9ubHkgdXBkYXRlIHdoZW4gY2hhbmdpbmcgdGlsZS4KKyAgICBpZiAoKGNvbCAmIG1hc2spID09IDApIHsKKyAgICAgIGh0cmVlX2dyb3VwID0gR2V0SHRyZWVHcm91cEZvclBvcyhoZHIsIGNvbCwgcm93KTsKKyAgICB9CisgICAgYXNzZXJ0KGh0cmVlX2dyb3VwICE9IE5VTEwpOworICAgIFZQOExGaWxsQml0V2luZG93KGJyKTsKKyAgICBjb2RlID0gUmVhZFN5bWJvbChodHJlZV9ncm91cC0+aHRyZWVzW0dSRUVOXSwgYnIpOworICAgIGlmIChjb2RlIDwgTlVNX0xJVEVSQUxfQ09ERVMpIHsgIC8vIExpdGVyYWwKKyAgICAgIGRhdGFbcG9zXSA9IGNvZGU7CisgICAgICArK3BvczsKKyAgICAgICsrY29sOworICAgICAgaWYgKGNvbCA+PSB3aWR0aCkgeworICAgICAgICBjb2wgPSAwOworICAgICAgICArK3JvdzsKKyAgICAgICAgaWYgKHJvdyA8PSBsYXN0X3JvdyAmJiAocm93ICUgTlVNX0FSR0JfQ0FDSEVfUk9XUyA9PSAwKSkgeworICAgICAgICAgIEV4dHJhY3RQYWxldHRlZEFscGhhUm93cyhkZWMsIHJvdyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGNvZGUgPCBsZW5fY29kZV9saW1pdCkgeyAgLy8gQmFja3dhcmQgcmVmZXJlbmNlCisgICAgICBpbnQgZGlzdF9jb2RlLCBkaXN0OworICAgICAgY29uc3QgaW50IGxlbmd0aF9zeW0gPSBjb2RlIC0gTlVNX0xJVEVSQUxfQ09ERVM7CisgICAgICBjb25zdCBpbnQgbGVuZ3RoID0gR2V0Q29weUxlbmd0aChsZW5ndGhfc3ltLCBicik7CisgICAgICBjb25zdCBpbnQgZGlzdF9zeW1ib2wgPSBSZWFkU3ltYm9sKGh0cmVlX2dyb3VwLT5odHJlZXNbRElTVF0sIGJyKTsKKyAgICAgIFZQOExGaWxsQml0V2luZG93KGJyKTsKKyAgICAgIGRpc3RfY29kZSA9IEdldENvcHlEaXN0YW5jZShkaXN0X3N5bWJvbCwgYnIpOworICAgICAgZGlzdCA9IFBsYW5lQ29kZVRvRGlzdGFuY2Uod2lkdGgsIGRpc3RfY29kZSk7CisgICAgICBpZiAocG9zID49IGRpc3QgJiYgZW5kIC0gcG9zID49IGxlbmd0aCkgeworICAgICAgICBDb3B5QmxvY2s4YihkYXRhICsgcG9zLCBkaXN0LCBsZW5ndGgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb2sgPSAwOworICAgICAgICBnb3RvIEVuZDsKKyAgICAgIH0KKyAgICAgIHBvcyArPSBsZW5ndGg7CisgICAgICBjb2wgKz0gbGVuZ3RoOworICAgICAgd2hpbGUgKGNvbCA+PSB3aWR0aCkgeworICAgICAgICBjb2wgLT0gd2lkdGg7CisgICAgICAgICsrcm93OworICAgICAgICBpZiAocm93IDw9IGxhc3Rfcm93ICYmIChyb3cgJSBOVU1fQVJHQl9DQUNIRV9ST1dTID09IDApKSB7CisgICAgICAgICAgRXh0cmFjdFBhbGV0dGVkQWxwaGFSb3dzKGRlYywgcm93KTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHBvcyA8IGxhc3QgJiYgKGNvbCAmIG1hc2spKSB7CisgICAgICAgIGh0cmVlX2dyb3VwID0gR2V0SHRyZWVHcm91cEZvclBvcyhoZHIsIGNvbCwgcm93KTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeyAgLy8gTm90IHJlYWNoZWQKKyAgICAgIG9rID0gMDsKKyAgICAgIGdvdG8gRW5kOworICAgIH0KKyAgICBici0+ZW9zXyA9IFZQOExJc0VuZE9mU3RyZWFtKGJyKTsKKyAgfQorICAvLyBQcm9jZXNzIHRoZSByZW1haW5pbmcgcm93cyBjb3JyZXNwb25kaW5nIHRvIGxhc3Qgcm93LWJsb2NrLgorICBFeHRyYWN0UGFsZXR0ZWRBbHBoYVJvd3MoZGVjLCByb3cgPiBsYXN0X3JvdyA/IGxhc3Rfcm93IDogcm93KTsKKworIEVuZDoKKyAgYnItPmVvc18gPSBWUDhMSXNFbmRPZlN0cmVhbShicik7CisgIGlmICghb2sgfHwgKGJyLT5lb3NfICYmIHBvcyA8IGVuZCkpIHsKKyAgICBvayA9IDA7CisgICAgZGVjLT5zdGF0dXNfID0gYnItPmVvc18gPyBWUDhfU1RBVFVTX1NVU1BFTkRFRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7CisgIH0gZWxzZSB7CisgICAgZGVjLT5sYXN0X3BpeGVsXyA9IHBvczsKKyAgfQorICByZXR1cm4gb2s7Cit9CisKK3N0YXRpYyB2b2lkIFNhdmVTdGF0ZShWUDhMRGVjb2RlciogY29uc3QgZGVjLCBpbnQgbGFzdF9waXhlbCkgeworICBhc3NlcnQoZGVjLT5pbmNyZW1lbnRhbF8pOworICBkZWMtPnNhdmVkX2JyXyA9IGRlYy0+YnJfOworICBkZWMtPnNhdmVkX2xhc3RfcGl4ZWxfID0gbGFzdF9waXhlbDsKKyAgaWYgKGRlYy0+aGRyXy5jb2xvcl9jYWNoZV9zaXplXyA+IDApIHsKKyAgICBWUDhMQ29sb3JDYWNoZUNvcHkoJmRlYy0+aGRyXy5jb2xvcl9jYWNoZV8sICZkZWMtPmhkcl8uc2F2ZWRfY29sb3JfY2FjaGVfKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBSZXN0b3JlU3RhdGUoVlA4TERlY29kZXIqIGNvbnN0IGRlYykgeworICBhc3NlcnQoZGVjLT5icl8uZW9zXyk7CisgIGRlYy0+c3RhdHVzXyA9IFZQOF9TVEFUVVNfU1VTUEVOREVEOworICBkZWMtPmJyXyA9IGRlYy0+c2F2ZWRfYnJfOworICBkZWMtPmxhc3RfcGl4ZWxfID0gZGVjLT5zYXZlZF9sYXN0X3BpeGVsXzsKKyAgaWYgKGRlYy0+aGRyXy5jb2xvcl9jYWNoZV9zaXplXyA+IDApIHsKKyAgICBWUDhMQ29sb3JDYWNoZUNvcHkoJmRlYy0+aGRyXy5zYXZlZF9jb2xvcl9jYWNoZV8sICZkZWMtPmhkcl8uY29sb3JfY2FjaGVfKTsKKyAgfQorfQorCisjZGVmaW5lIFNZTkNfRVZFUllfTl9ST1dTIDggIC8vIG1pbmltdW0gbnVtYmVyIG9mIHJvd3MgYmV0d2VlbiBjaGVjay1wb2ludHMKK3N0YXRpYyBpbnQgRGVjb2RlSW1hZ2VEYXRhKFZQOExEZWNvZGVyKiBjb25zdCBkZWMsIHVpbnQzMl90KiBjb25zdCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgbGFzdF9yb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9jZXNzUm93c0Z1bmMgcHJvY2Vzc19mdW5jKSB7CisgIGludCByb3cgPSBkZWMtPmxhc3RfcGl4ZWxfIC8gd2lkdGg7CisgIGludCBjb2wgPSBkZWMtPmxhc3RfcGl4ZWxfICUgd2lkdGg7CisgIFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyID0gJmRlYy0+YnJfOworICBWUDhMTWV0YWRhdGEqIGNvbnN0IGhkciA9ICZkZWMtPmhkcl87CisgIHVpbnQzMl90KiBzcmMgPSBkYXRhICsgZGVjLT5sYXN0X3BpeGVsXzsKKyAgdWludDMyX3QqIGxhc3RfY2FjaGVkID0gc3JjOworICB1aW50MzJfdCogY29uc3Qgc3JjX2VuZCA9IGRhdGEgKyB3aWR0aCAqIGhlaWdodDsgICAgIC8vIEVuZCBvZiBkYXRhCisgIHVpbnQzMl90KiBjb25zdCBzcmNfbGFzdCA9IGRhdGEgKyB3aWR0aCAqIGxhc3Rfcm93OyAgLy8gTGFzdCBwaXhlbCB0byBkZWNvZGUKKyAgY29uc3QgaW50IGxlbl9jb2RlX2xpbWl0ID0gTlVNX0xJVEVSQUxfQ09ERVMgKyBOVU1fTEVOR1RIX0NPREVTOworICBjb25zdCBpbnQgY29sb3JfY2FjaGVfbGltaXQgPSBsZW5fY29kZV9saW1pdCArIGhkci0+Y29sb3JfY2FjaGVfc2l6ZV87CisgIGludCBuZXh0X3N5bmNfcm93ID0gZGVjLT5pbmNyZW1lbnRhbF8gPyByb3cgOiAxIDw8IDI0OworICBWUDhMQ29sb3JDYWNoZSogY29uc3QgY29sb3JfY2FjaGUgPQorICAgICAgKGhkci0+Y29sb3JfY2FjaGVfc2l6ZV8gPiAwKSA/ICZoZHItPmNvbG9yX2NhY2hlXyA6IE5VTEw7CisgIGNvbnN0IGludCBtYXNrID0gaGRyLT5odWZmbWFuX21hc2tfOworICBjb25zdCBIVHJlZUdyb3VwKiBodHJlZV9ncm91cCA9CisgICAgICAoc3JjIDwgc3JjX2xhc3QpID8gR2V0SHRyZWVHcm91cEZvclBvcyhoZHIsIGNvbCwgcm93KSA6IE5VTEw7CisgIGFzc2VydChkZWMtPmxhc3Rfcm93XyA8IGxhc3Rfcm93KTsKKyAgYXNzZXJ0KHNyY19sYXN0IDw9IHNyY19lbmQpOworCisgIHdoaWxlIChzcmMgPCBzcmNfbGFzdCkgeworICAgIGludCBjb2RlOworICAgIGlmIChyb3cgPj0gbmV4dF9zeW5jX3JvdykgeworICAgICAgU2F2ZVN0YXRlKGRlYywgKGludCkoc3JjIC0gZGF0YSkpOworICAgICAgbmV4dF9zeW5jX3JvdyA9IHJvdyArIFNZTkNfRVZFUllfTl9ST1dTOworICAgIH0KKyAgICAvLyBPbmx5IHVwZGF0ZSB3aGVuIGNoYW5naW5nIHRpbGUuIE5vdGUgd2UgY291bGQgdXNlIHRoaXMgdGVzdDoKKyAgICAvLyBpZiAiKCgoKHByZXZfY29sIF4gY29sKSB8IHByZXZfcm93IF4gcm93KSkgPiBtYXNrKSIgLT4gdGlsZSBjaGFuZ2VkCisgICAgLy8gYnV0IHRoYXQncyBhY3R1YWxseSBzbG93ZXIgYW5kIG5lZWRzIHN0b3JpbmcgdGhlIHByZXZpb3VzIGNvbC9yb3cuCisgICAgaWYgKChjb2wgJiBtYXNrKSA9PSAwKSB7CisgICAgICBodHJlZV9ncm91cCA9IEdldEh0cmVlR3JvdXBGb3JQb3MoaGRyLCBjb2wsIHJvdyk7CisgICAgfQorICAgIGFzc2VydChodHJlZV9ncm91cCAhPSBOVUxMKTsKKyAgICBpZiAoaHRyZWVfZ3JvdXAtPmlzX3RyaXZpYWxfY29kZSkgeworICAgICAgKnNyYyA9IGh0cmVlX2dyb3VwLT5saXRlcmFsX2FyYjsKKyAgICAgIGdvdG8gQWR2YW5jZUJ5T25lOworICAgIH0KKyAgICBWUDhMRmlsbEJpdFdpbmRvdyhicik7CisgICAgaWYgKGh0cmVlX2dyb3VwLT51c2VfcGFja2VkX3RhYmxlKSB7CisgICAgICBjb2RlID0gUmVhZFBhY2tlZFN5bWJvbHMoaHRyZWVfZ3JvdXAsIGJyLCBzcmMpOworICAgICAgaWYgKFZQOExJc0VuZE9mU3RyZWFtKGJyKSkgYnJlYWs7CisgICAgICBpZiAoY29kZSA9PSBQQUNLRURfTk9OX0xJVEVSQUxfQ09ERSkgZ290byBBZHZhbmNlQnlPbmU7CisgICAgfSBlbHNlIHsKKyAgICAgIGNvZGUgPSBSZWFkU3ltYm9sKGh0cmVlX2dyb3VwLT5odHJlZXNbR1JFRU5dLCBicik7CisgICAgfQorICAgIGlmIChWUDhMSXNFbmRPZlN0cmVhbShicikpIGJyZWFrOworICAgIGlmIChjb2RlIDwgTlVNX0xJVEVSQUxfQ09ERVMpIHsgIC8vIExpdGVyYWwKKyAgICAgIGlmIChodHJlZV9ncm91cC0+aXNfdHJpdmlhbF9saXRlcmFsKSB7CisgICAgICAgICpzcmMgPSBodHJlZV9ncm91cC0+bGl0ZXJhbF9hcmIgfCAoY29kZSA8PCA4KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGludCByZWQsIGJsdWUsIGFscGhhOworICAgICAgICByZWQgPSBSZWFkU3ltYm9sKGh0cmVlX2dyb3VwLT5odHJlZXNbUkVEXSwgYnIpOworICAgICAgICBWUDhMRmlsbEJpdFdpbmRvdyhicik7CisgICAgICAgIGJsdWUgPSBSZWFkU3ltYm9sKGh0cmVlX2dyb3VwLT5odHJlZXNbQkxVRV0sIGJyKTsKKyAgICAgICAgYWxwaGEgPSBSZWFkU3ltYm9sKGh0cmVlX2dyb3VwLT5odHJlZXNbQUxQSEFdLCBicik7CisgICAgICAgIGlmIChWUDhMSXNFbmRPZlN0cmVhbShicikpIGJyZWFrOworICAgICAgICAqc3JjID0gKCh1aW50MzJfdClhbHBoYSA8PCAyNCkgfCAocmVkIDw8IDE2KSB8IChjb2RlIDw8IDgpIHwgYmx1ZTsKKyAgICAgIH0KKyAgICBBZHZhbmNlQnlPbmU6CisgICAgICArK3NyYzsKKyAgICAgICsrY29sOworICAgICAgaWYgKGNvbCA+PSB3aWR0aCkgeworICAgICAgICBjb2wgPSAwOworICAgICAgICArK3JvdzsKKyAgICAgICAgaWYgKHByb2Nlc3NfZnVuYyAhPSBOVUxMKSB7CisgICAgICAgICAgaWYgKHJvdyA8PSBsYXN0X3JvdyAmJiAocm93ICUgTlVNX0FSR0JfQ0FDSEVfUk9XUyA9PSAwKSkgeworICAgICAgICAgICAgcHJvY2Vzc19mdW5jKGRlYywgcm93KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbG9yX2NhY2hlICE9IE5VTEwpIHsKKyAgICAgICAgICB3aGlsZSAobGFzdF9jYWNoZWQgPCBzcmMpIHsKKyAgICAgICAgICAgIFZQOExDb2xvckNhY2hlSW5zZXJ0KGNvbG9yX2NhY2hlLCAqbGFzdF9jYWNoZWQrKyk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIGlmIChjb2RlIDwgbGVuX2NvZGVfbGltaXQpIHsgIC8vIEJhY2t3YXJkIHJlZmVyZW5jZQorICAgICAgaW50IGRpc3RfY29kZSwgZGlzdDsKKyAgICAgIGNvbnN0IGludCBsZW5ndGhfc3ltID0gY29kZSAtIE5VTV9MSVRFUkFMX0NPREVTOworICAgICAgY29uc3QgaW50IGxlbmd0aCA9IEdldENvcHlMZW5ndGgobGVuZ3RoX3N5bSwgYnIpOworICAgICAgY29uc3QgaW50IGRpc3Rfc3ltYm9sID0gUmVhZFN5bWJvbChodHJlZV9ncm91cC0+aHRyZWVzW0RJU1RdLCBicik7CisgICAgICBWUDhMRmlsbEJpdFdpbmRvdyhicik7CisgICAgICBkaXN0X2NvZGUgPSBHZXRDb3B5RGlzdGFuY2UoZGlzdF9zeW1ib2wsIGJyKTsKKyAgICAgIGRpc3QgPSBQbGFuZUNvZGVUb0Rpc3RhbmNlKHdpZHRoLCBkaXN0X2NvZGUpOworICAgICAgaWYgKFZQOExJc0VuZE9mU3RyZWFtKGJyKSkgYnJlYWs7CisgICAgICBpZiAoc3JjIC0gZGF0YSA8IChwdHJkaWZmX3QpZGlzdCB8fCBzcmNfZW5kIC0gc3JjIDwgKHB0cmRpZmZfdClsZW5ndGgpIHsKKyAgICAgICAgZ290byBFcnJvcjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIENvcHlCbG9jazMyYihzcmMsIGRpc3QsIGxlbmd0aCk7CisgICAgICB9CisgICAgICBzcmMgKz0gbGVuZ3RoOworICAgICAgY29sICs9IGxlbmd0aDsKKyAgICAgIHdoaWxlIChjb2wgPj0gd2lkdGgpIHsKKyAgICAgICAgY29sIC09IHdpZHRoOworICAgICAgICArK3JvdzsKKyAgICAgICAgaWYgKHByb2Nlc3NfZnVuYyAhPSBOVUxMKSB7CisgICAgICAgICAgaWYgKHJvdyA8PSBsYXN0X3JvdyAmJiAocm93ICUgTlVNX0FSR0JfQ0FDSEVfUk9XUyA9PSAwKSkgeworICAgICAgICAgICAgcHJvY2Vzc19mdW5jKGRlYywgcm93KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8vIEJlY2F1c2Ugb2YgdGhlIGNoZWNrIGRvbmUgYWJvdmUgKGJlZm9yZSAnc3JjJyB3YXMgaW5jcmVtZW50ZWQgYnkKKyAgICAgIC8vICdsZW5ndGgnKSwgdGhlIGZvbGxvd2luZyBob2xkcyB0cnVlLgorICAgICAgYXNzZXJ0KHNyYyA8PSBzcmNfZW5kKTsKKyAgICAgIGlmIChjb2wgJiBtYXNrKSBodHJlZV9ncm91cCA9IEdldEh0cmVlR3JvdXBGb3JQb3MoaGRyLCBjb2wsIHJvdyk7CisgICAgICBpZiAoY29sb3JfY2FjaGUgIT0gTlVMTCkgeworICAgICAgICB3aGlsZSAobGFzdF9jYWNoZWQgPCBzcmMpIHsKKyAgICAgICAgICBWUDhMQ29sb3JDYWNoZUluc2VydChjb2xvcl9jYWNoZSwgKmxhc3RfY2FjaGVkKyspOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIGlmIChjb2RlIDwgY29sb3JfY2FjaGVfbGltaXQpIHsgIC8vIENvbG9yIGNhY2hlCisgICAgICBjb25zdCBpbnQga2V5ID0gY29kZSAtIGxlbl9jb2RlX2xpbWl0OworICAgICAgYXNzZXJ0KGNvbG9yX2NhY2hlICE9IE5VTEwpOworICAgICAgd2hpbGUgKGxhc3RfY2FjaGVkIDwgc3JjKSB7CisgICAgICAgIFZQOExDb2xvckNhY2hlSW5zZXJ0KGNvbG9yX2NhY2hlLCAqbGFzdF9jYWNoZWQrKyk7CisgICAgICB9CisgICAgICAqc3JjID0gVlA4TENvbG9yQ2FjaGVMb29rdXAoY29sb3JfY2FjaGUsIGtleSk7CisgICAgICBnb3RvIEFkdmFuY2VCeU9uZTsKKyAgICB9IGVsc2UgeyAgLy8gTm90IHJlYWNoZWQKKyAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorICB9CisKKyAgYnItPmVvc18gPSBWUDhMSXNFbmRPZlN0cmVhbShicik7CisgIGlmIChkZWMtPmluY3JlbWVudGFsXyAmJiBici0+ZW9zXyAmJiBzcmMgPCBzcmNfZW5kKSB7CisgICAgUmVzdG9yZVN0YXRlKGRlYyk7CisgIH0gZWxzZSBpZiAoIWJyLT5lb3NfKSB7CisgICAgLy8gUHJvY2VzcyB0aGUgcmVtYWluaW5nIHJvd3MgY29ycmVzcG9uZGluZyB0byBsYXN0IHJvdy1ibG9jay4KKyAgICBpZiAocHJvY2Vzc19mdW5jICE9IE5VTEwpIHsKKyAgICAgIHByb2Nlc3NfZnVuYyhkZWMsIHJvdyA+IGxhc3Rfcm93ID8gbGFzdF9yb3cgOiByb3cpOworICAgIH0KKyAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX09LOworICAgIGRlYy0+bGFzdF9waXhlbF8gPSAoaW50KShzcmMgLSBkYXRhKTsgIC8vIGVuZC1vZi1zY2FuIG1hcmtlcgorICB9IGVsc2UgeworICAgIC8vIGlmIG5vdCBpbmNyZW1lbnRhbCwgYW5kIHdlIGFyZSBwYXN0IHRoZSBlbmQgb2YgYnVmZmVyIChlb3NfPTEpLCB0aGVuIHRoaXMKKyAgICAvLyBpcyBhIHJlYWwgYml0c3RyZWFtIGVycm9yLgorICAgIGdvdG8gRXJyb3I7CisgIH0KKyAgcmV0dXJuIDE7CisKKyBFcnJvcjoKKyAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7CisgIHJldHVybiAwOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVlA4TFRyYW5zZm9ybQorCitzdGF0aWMgdm9pZCBDbGVhclRyYW5zZm9ybShWUDhMVHJhbnNmb3JtKiBjb25zdCB0cmFuc2Zvcm0pIHsKKyAgV2ViUFNhZmVGcmVlKHRyYW5zZm9ybS0+ZGF0YV8pOworICB0cmFuc2Zvcm0tPmRhdGFfID0gTlVMTDsKK30KKworLy8gRm9yIHNlY3VyaXR5IHJlYXNvbiwgd2UgbmVlZCB0byByZW1hcCB0aGUgY29sb3IgbWFwIHRvIHNwYW4KKy8vIHRoZSB0b3RhbCBwb3NzaWJsZSBidW5kbGVkIHZhbHVlcywgYW5kIG5vdCBqdXN0IHRoZSBudW1fY29sb3JzLgorc3RhdGljIGludCBFeHBhbmRDb2xvck1hcChpbnQgbnVtX2NvbG9ycywgVlA4TFRyYW5zZm9ybSogY29uc3QgdHJhbnNmb3JtKSB7CisgIGludCBpOworICBjb25zdCBpbnQgZmluYWxfbnVtX2NvbG9ycyA9IDEgPDwgKDggPj4gdHJhbnNmb3JtLT5iaXRzXyk7CisgIHVpbnQzMl90KiBjb25zdCBuZXdfY29sb3JfbWFwID0KKyAgICAgICh1aW50MzJfdCopV2ViUFNhZmVNYWxsb2MoKHVpbnQ2NF90KWZpbmFsX251bV9jb2xvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqbmV3X2NvbG9yX21hcCkpOworICBpZiAobmV3X2NvbG9yX21hcCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0gZWxzZSB7CisgICAgdWludDhfdCogY29uc3QgZGF0YSA9ICh1aW50OF90Kil0cmFuc2Zvcm0tPmRhdGFfOworICAgIHVpbnQ4X3QqIGNvbnN0IG5ld19kYXRhID0gKHVpbnQ4X3QqKW5ld19jb2xvcl9tYXA7CisgICAgbmV3X2NvbG9yX21hcFswXSA9IHRyYW5zZm9ybS0+ZGF0YV9bMF07CisgICAgZm9yIChpID0gNDsgaSA8IDQgKiBudW1fY29sb3JzOyArK2kpIHsKKyAgICAgIC8vIEVxdWl2YWxlbnQgdG8gQWRkUGl4ZWxFcSgpLCBvbiBhIGJ5dGUtYmFzaXMuCisgICAgICBuZXdfZGF0YVtpXSA9IChkYXRhW2ldICsgbmV3X2RhdGFbaSAtIDRdKSAmIDB4ZmY7CisgICAgfQorICAgIGZvciAoOyBpIDwgNCAqIGZpbmFsX251bV9jb2xvcnM7ICsraSkgeworICAgICAgbmV3X2RhdGFbaV0gPSAwOyAgLy8gYmxhY2sgdGFpbC4KKyAgICB9CisgICAgV2ViUFNhZmVGcmVlKHRyYW5zZm9ybS0+ZGF0YV8pOworICAgIHRyYW5zZm9ybS0+ZGF0YV8gPSBuZXdfY29sb3JfbWFwOworICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IFJlYWRUcmFuc2Zvcm0oaW50KiBjb25zdCB4c2l6ZSwgaW50IGNvbnN0KiB5c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMRGVjb2RlciogY29uc3QgZGVjKSB7CisgIGludCBvayA9IDE7CisgIFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyID0gJmRlYy0+YnJfOworICBWUDhMVHJhbnNmb3JtKiB0cmFuc2Zvcm0gPSAmZGVjLT50cmFuc2Zvcm1zX1tkZWMtPm5leHRfdHJhbnNmb3JtX107CisgIGNvbnN0IFZQOExJbWFnZVRyYW5zZm9ybVR5cGUgdHlwZSA9CisgICAgICAoVlA4TEltYWdlVHJhbnNmb3JtVHlwZSlWUDhMUmVhZEJpdHMoYnIsIDIpOworCisgIC8vIEVhY2ggdHJhbnNmb3JtIHR5cGUgY2FuIG9ubHkgYmUgcHJlc2VudCBvbmNlIGluIHRoZSBzdHJlYW0uCisgIGlmIChkZWMtPnRyYW5zZm9ybXNfc2Vlbl8gJiAoMVUgPDwgdHlwZSkpIHsKKyAgICByZXR1cm4gMDsgIC8vIEFscmVhZHkgdGhlcmUsIGxldCdzIG5vdCBhY2NlcHQgdGhlIHNlY29uZCBzYW1lIHRyYW5zZm9ybS4KKyAgfQorICBkZWMtPnRyYW5zZm9ybXNfc2Vlbl8gfD0gKDFVIDw8IHR5cGUpOworCisgIHRyYW5zZm9ybS0+dHlwZV8gPSB0eXBlOworICB0cmFuc2Zvcm0tPnhzaXplXyA9ICp4c2l6ZTsKKyAgdHJhbnNmb3JtLT55c2l6ZV8gPSAqeXNpemU7CisgIHRyYW5zZm9ybS0+ZGF0YV8gPSBOVUxMOworICArK2RlYy0+bmV4dF90cmFuc2Zvcm1fOworICBhc3NlcnQoZGVjLT5uZXh0X3RyYW5zZm9ybV8gPD0gTlVNX1RSQU5TRk9STVMpOworCisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgUFJFRElDVE9SX1RSQU5TRk9STToKKyAgICBjYXNlIENST1NTX0NPTE9SX1RSQU5TRk9STToKKyAgICAgIHRyYW5zZm9ybS0+Yml0c18gPSBWUDhMUmVhZEJpdHMoYnIsIDMpICsgMjsKKyAgICAgIG9rID0gRGVjb2RlSW1hZ2VTdHJlYW0oVlA4TFN1YlNhbXBsZVNpemUodHJhbnNmb3JtLT54c2l6ZV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybS0+Yml0c18pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMU3ViU2FtcGxlU2l6ZSh0cmFuc2Zvcm0tPnlzaXplXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtLT5iaXRzXyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGRlYywgJnRyYW5zZm9ybS0+ZGF0YV8pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDT0xPUl9JTkRFWElOR19UUkFOU0ZPUk06IHsKKyAgICAgICBjb25zdCBpbnQgbnVtX2NvbG9ycyA9IFZQOExSZWFkQml0cyhiciwgOCkgKyAxOworICAgICAgIGNvbnN0IGludCBiaXRzID0gKG51bV9jb2xvcnMgPiAxNikgPyAwCisgICAgICAgICAgICAgICAgICAgICAgOiAobnVtX2NvbG9ycyA+IDQpID8gMQorICAgICAgICAgICAgICAgICAgICAgIDogKG51bV9jb2xvcnMgPiAyKSA/IDIKKyAgICAgICAgICAgICAgICAgICAgICA6IDM7CisgICAgICAgKnhzaXplID0gVlA4TFN1YlNhbXBsZVNpemUodHJhbnNmb3JtLT54c2l6ZV8sIGJpdHMpOworICAgICAgIHRyYW5zZm9ybS0+Yml0c18gPSBiaXRzOworICAgICAgIG9rID0gRGVjb2RlSW1hZ2VTdHJlYW0obnVtX2NvbG9ycywgMSwgMCwgZGVjLCAmdHJhbnNmb3JtLT5kYXRhXyk7CisgICAgICAgb2sgPSBvayAmJiBFeHBhbmRDb2xvck1hcChudW1fY29sb3JzLCB0cmFuc2Zvcm0pOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgU1VCVFJBQ1RfR1JFRU46CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYXNzZXJ0KDApOyAgICAvLyBjYW4ndCBoYXBwZW4KKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIG9rOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVlA4TE1ldGFkYXRhCisKK3N0YXRpYyB2b2lkIEluaXRNZXRhZGF0YShWUDhMTWV0YWRhdGEqIGNvbnN0IGhkcikgeworICBhc3NlcnQoaGRyICE9IE5VTEwpOworICBtZW1zZXQoaGRyLCAwLCBzaXplb2YoKmhkcikpOworfQorCitzdGF0aWMgdm9pZCBDbGVhck1ldGFkYXRhKFZQOExNZXRhZGF0YSogY29uc3QgaGRyKSB7CisgIGFzc2VydChoZHIgIT0gTlVMTCk7CisKKyAgV2ViUFNhZmVGcmVlKGhkci0+aHVmZm1hbl9pbWFnZV8pOworICBXZWJQU2FmZUZyZWUoaGRyLT5odWZmbWFuX3RhYmxlc18pOworICBWUDhMSHRyZWVHcm91cHNGcmVlKGhkci0+aHRyZWVfZ3JvdXBzXyk7CisgIFZQOExDb2xvckNhY2hlQ2xlYXIoJmhkci0+Y29sb3JfY2FjaGVfKTsKKyAgVlA4TENvbG9yQ2FjaGVDbGVhcigmaGRyLT5zYXZlZF9jb2xvcl9jYWNoZV8pOworICBJbml0TWV0YWRhdGEoaGRyKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZQOExEZWNvZGVyCisKK1ZQOExEZWNvZGVyKiBWUDhMTmV3KHZvaWQpIHsKKyAgVlA4TERlY29kZXIqIGNvbnN0IGRlYyA9IChWUDhMRGVjb2RlciopV2ViUFNhZmVDYWxsb2MoMVVMTCwgc2l6ZW9mKCpkZWMpKTsKKyAgaWYgKGRlYyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19PSzsKKyAgZGVjLT5zdGF0ZV8gPSBSRUFEX0RJTTsKKworICBWUDhMRHNwSW5pdCgpOyAgLy8gSW5pdCBjcml0aWNhbCBmdW5jdGlvbiBwb2ludGVycy4KKworICByZXR1cm4gZGVjOworfQorCit2b2lkIFZQOExDbGVhcihWUDhMRGVjb2RlciogY29uc3QgZGVjKSB7CisgIGludCBpOworICBpZiAoZGVjID09IE5VTEwpIHJldHVybjsKKyAgQ2xlYXJNZXRhZGF0YSgmZGVjLT5oZHJfKTsKKworICBXZWJQU2FmZUZyZWUoZGVjLT5waXhlbHNfKTsKKyAgZGVjLT5waXhlbHNfID0gTlVMTDsKKyAgZm9yIChpID0gMDsgaSA8IGRlYy0+bmV4dF90cmFuc2Zvcm1fOyArK2kpIHsKKyAgICBDbGVhclRyYW5zZm9ybSgmZGVjLT50cmFuc2Zvcm1zX1tpXSk7CisgIH0KKyAgZGVjLT5uZXh0X3RyYW5zZm9ybV8gPSAwOworICBkZWMtPnRyYW5zZm9ybXNfc2Vlbl8gPSAwOworCisgIFdlYlBTYWZlRnJlZShkZWMtPnJlc2NhbGVyX21lbW9yeSk7CisgIGRlYy0+cmVzY2FsZXJfbWVtb3J5ID0gTlVMTDsKKworICBkZWMtPm91dHB1dF8gPSBOVUxMOyAgIC8vIGxlYXZlIG5vIHRyYWNlIGJlaGluZAorfQorCit2b2lkIFZQOExEZWxldGUoVlA4TERlY29kZXIqIGNvbnN0IGRlYykgeworICBpZiAoZGVjICE9IE5VTEwpIHsKKyAgICBWUDhMQ2xlYXIoZGVjKTsKKyAgICBXZWJQU2FmZUZyZWUoZGVjKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBVcGRhdGVEZWNvZGVyKFZQOExEZWNvZGVyKiBjb25zdCBkZWMsIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICBWUDhMTWV0YWRhdGEqIGNvbnN0IGhkciA9ICZkZWMtPmhkcl87CisgIGNvbnN0IGludCBudW1fYml0cyA9IGhkci0+aHVmZm1hbl9zdWJzYW1wbGVfYml0c187CisgIGRlYy0+d2lkdGhfID0gd2lkdGg7CisgIGRlYy0+aGVpZ2h0XyA9IGhlaWdodDsKKworICBoZHItPmh1ZmZtYW5feHNpemVfID0gVlA4TFN1YlNhbXBsZVNpemUod2lkdGgsIG51bV9iaXRzKTsKKyAgaGRyLT5odWZmbWFuX21hc2tfID0gKG51bV9iaXRzID09IDApID8gfjAgOiAoMSA8PCBudW1fYml0cykgLSAxOworfQorCitzdGF0aWMgaW50IERlY29kZUltYWdlU3RyZWFtKGludCB4c2l6ZSwgaW50IHlzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXNfbGV2ZWwwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMRGVjb2RlciogY29uc3QgZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCoqIGNvbnN0IGRlY29kZWRfZGF0YSkgeworICBpbnQgb2sgPSAxOworICBpbnQgdHJhbnNmb3JtX3hzaXplID0geHNpemU7CisgIGludCB0cmFuc2Zvcm1feXNpemUgPSB5c2l6ZTsKKyAgVlA4TEJpdFJlYWRlciogY29uc3QgYnIgPSAmZGVjLT5icl87CisgIFZQOExNZXRhZGF0YSogY29uc3QgaGRyID0gJmRlYy0+aGRyXzsKKyAgdWludDMyX3QqIGRhdGEgPSBOVUxMOworICBpbnQgY29sb3JfY2FjaGVfYml0cyA9IDA7CisKKyAgLy8gUmVhZCB0aGUgdHJhbnNmb3JtcyAobWF5IHJlY3Vyc2UpLgorICBpZiAoaXNfbGV2ZWwwKSB7CisgICAgd2hpbGUgKG9rICYmIFZQOExSZWFkQml0cyhiciwgMSkpIHsKKyAgICAgIG9rID0gUmVhZFRyYW5zZm9ybSgmdHJhbnNmb3JtX3hzaXplLCAmdHJhbnNmb3JtX3lzaXplLCBkZWMpOworICAgIH0KKyAgfQorCisgIC8vIENvbG9yIGNhY2hlCisgIGlmIChvayAmJiBWUDhMUmVhZEJpdHMoYnIsIDEpKSB7CisgICAgY29sb3JfY2FjaGVfYml0cyA9IFZQOExSZWFkQml0cyhiciwgNCk7CisgICAgb2sgPSAoY29sb3JfY2FjaGVfYml0cyA+PSAxICYmIGNvbG9yX2NhY2hlX2JpdHMgPD0gTUFYX0NBQ0hFX0JJVFMpOworICAgIGlmICghb2spIHsKKyAgICAgIGRlYy0+c3RhdHVzXyA9IFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SOworICAgICAgZ290byBFbmQ7CisgICAgfQorICB9CisKKyAgLy8gUmVhZCB0aGUgSHVmZm1hbiBjb2RlcyAobWF5IHJlY3Vyc2UpLgorICBvayA9IG9rICYmIFJlYWRIdWZmbWFuQ29kZXMoZGVjLCB0cmFuc2Zvcm1feHNpemUsIHRyYW5zZm9ybV95c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yX2NhY2hlX2JpdHMsIGlzX2xldmVsMCk7CisgIGlmICghb2spIHsKKyAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUjsKKyAgICBnb3RvIEVuZDsKKyAgfQorCisgIC8vIEZpbmlzaCBzZXR0aW5nIHVwIHRoZSBjb2xvci1jYWNoZQorICBpZiAoY29sb3JfY2FjaGVfYml0cyA+IDApIHsKKyAgICBoZHItPmNvbG9yX2NhY2hlX3NpemVfID0gMSA8PCBjb2xvcl9jYWNoZV9iaXRzOworICAgIGlmICghVlA4TENvbG9yQ2FjaGVJbml0KCZoZHItPmNvbG9yX2NhY2hlXywgY29sb3JfY2FjaGVfYml0cykpIHsKKyAgICAgIGRlYy0+c3RhdHVzXyA9IFZQOF9TVEFUVVNfT1VUX09GX01FTU9SWTsKKyAgICAgIG9rID0gMDsKKyAgICAgIGdvdG8gRW5kOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBoZHItPmNvbG9yX2NhY2hlX3NpemVfID0gMDsKKyAgfQorICBVcGRhdGVEZWNvZGVyKGRlYywgdHJhbnNmb3JtX3hzaXplLCB0cmFuc2Zvcm1feXNpemUpOworCisgIGlmIChpc19sZXZlbDApIHsgICAvLyBsZXZlbCAwIGNvbXBsZXRlCisgICAgZGVjLT5zdGF0ZV8gPSBSRUFEX0hEUjsKKyAgICBnb3RvIEVuZDsKKyAgfQorCisgIHsKKyAgICBjb25zdCB1aW50NjRfdCB0b3RhbF9zaXplID0gKHVpbnQ2NF90KXRyYW5zZm9ybV94c2l6ZSAqIHRyYW5zZm9ybV95c2l6ZTsKKyAgICBkYXRhID0gKHVpbnQzMl90KilXZWJQU2FmZU1hbGxvYyh0b3RhbF9zaXplLCBzaXplb2YoKmRhdGEpKTsKKyAgICBpZiAoZGF0YSA9PSBOVUxMKSB7CisgICAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX09VVF9PRl9NRU1PUlk7CisgICAgICBvayA9IDA7CisgICAgICBnb3RvIEVuZDsKKyAgICB9CisgIH0KKworICAvLyBVc2UgdGhlIEh1ZmZtYW4gdHJlZXMgdG8gZGVjb2RlIHRoZSBMWjc3IGVuY29kZWQgZGF0YS4KKyAgb2sgPSBEZWNvZGVJbWFnZURhdGEoZGVjLCBkYXRhLCB0cmFuc2Zvcm1feHNpemUsIHRyYW5zZm9ybV95c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtX3lzaXplLCBOVUxMKTsKKyAgb2sgPSBvayAmJiAhYnItPmVvc187CisKKyBFbmQ6CisgIGlmICghb2spIHsKKyAgICBXZWJQU2FmZUZyZWUoZGF0YSk7CisgICAgQ2xlYXJNZXRhZGF0YShoZHIpOworICB9IGVsc2UgeworICAgIGlmIChkZWNvZGVkX2RhdGEgIT0gTlVMTCkgeworICAgICAgKmRlY29kZWRfZGF0YSA9IGRhdGE7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFdlIGFsbG9jYXRlIGltYWdlIGRhdGEgaW4gdGhpcyBmdW5jdGlvbiBvbmx5IGZvciB0cmFuc2Zvcm1zLiBBdCBsZXZlbCAwCisgICAgICAvLyAodGhhdCBpczogbm90IHRoZSB0cmFuc2Zvcm1zKSwgd2Ugc2hvdWxkbid0IGhhdmUgYWxsb2NhdGVkIGFueXRoaW5nLgorICAgICAgYXNzZXJ0KGRhdGEgPT0gTlVMTCk7CisgICAgICBhc3NlcnQoaXNfbGV2ZWwwKTsKKyAgICB9CisgICAgZGVjLT5sYXN0X3BpeGVsXyA9IDA7ICAvLyBSZXNldCBmb3IgZnV0dXJlIERFQ09ERV9EQVRBX0ZVTkMoKSBjYWxscy4KKyAgICBpZiAoIWlzX2xldmVsMCkgQ2xlYXJNZXRhZGF0YShoZHIpOyAgLy8gQ2xlYW4gdXAgdGVtcG9yYXJ5IGRhdGEgYmVoaW5kLgorICB9CisgIHJldHVybiBvazsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEFsbG9jYXRlIGludGVybmFsIGJ1ZmZlcnMgZGVjLT5waXhlbHNfIGFuZCBkZWMtPmFyZ2JfY2FjaGVfLgorc3RhdGljIGludCBBbGxvY2F0ZUludGVybmFsQnVmZmVyczMyYihWUDhMRGVjb2RlciogY29uc3QgZGVjLCBpbnQgZmluYWxfd2lkdGgpIHsKKyAgY29uc3QgdWludDY0X3QgbnVtX3BpeGVscyA9ICh1aW50NjRfdClkZWMtPndpZHRoXyAqIGRlYy0+aGVpZ2h0XzsKKyAgLy8gU2NyYXRjaCBidWZmZXIgY29ycmVzcG9uZGluZyB0byB0b3AtcHJlZGljdGlvbiByb3cgZm9yIHRyYW5zZm9ybWluZyB0aGUKKyAgLy8gZmlyc3Qgcm93IGluIHRoZSByb3ctYmxvY2tzLiBOb3QgbmVlZGVkIGZvciBwYWxldHRlZCBhbHBoYS4KKyAgY29uc3QgdWludDY0X3QgY2FjaGVfdG9wX3BpeGVscyA9ICh1aW50MTZfdClmaW5hbF93aWR0aDsKKyAgLy8gU2NyYXRjaCBidWZmZXIgZm9yIHRlbXBvcmFyeSBCR1JBIHN0b3JhZ2UuIE5vdCBuZWVkZWQgZm9yIHBhbGV0dGVkIGFscGhhLgorICBjb25zdCB1aW50NjRfdCBjYWNoZV9waXhlbHMgPSAodWludDY0X3QpZmluYWxfd2lkdGggKiBOVU1fQVJHQl9DQUNIRV9ST1dTOworICBjb25zdCB1aW50NjRfdCB0b3RhbF9udW1fcGl4ZWxzID0KKyAgICAgIG51bV9waXhlbHMgKyBjYWNoZV90b3BfcGl4ZWxzICsgY2FjaGVfcGl4ZWxzOworCisgIGFzc2VydChkZWMtPndpZHRoXyA8PSBmaW5hbF93aWR0aCk7CisgIGRlYy0+cGl4ZWxzXyA9ICh1aW50MzJfdCopV2ViUFNhZmVNYWxsb2ModG90YWxfbnVtX3BpeGVscywgc2l6ZW9mKHVpbnQzMl90KSk7CisgIGlmIChkZWMtPnBpeGVsc18gPT0gTlVMTCkgeworICAgIGRlYy0+YXJnYl9jYWNoZV8gPSBOVUxMOyAgICAvLyBmb3Igc2FuaXR5IGNoZWNrCisgICAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19PVVRfT0ZfTUVNT1JZOworICAgIHJldHVybiAwOworICB9CisgIGRlYy0+YXJnYl9jYWNoZV8gPSBkZWMtPnBpeGVsc18gKyBudW1fcGl4ZWxzICsgY2FjaGVfdG9wX3BpeGVsczsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgQWxsb2NhdGVJbnRlcm5hbEJ1ZmZlcnM4YihWUDhMRGVjb2RlciogY29uc3QgZGVjKSB7CisgIGNvbnN0IHVpbnQ2NF90IHRvdGFsX251bV9waXhlbHMgPSAodWludDY0X3QpZGVjLT53aWR0aF8gKiBkZWMtPmhlaWdodF87CisgIGRlYy0+YXJnYl9jYWNoZV8gPSBOVUxMOyAgICAvLyBmb3Igc2FuaXR5IGNoZWNrCisgIGRlYy0+cGl4ZWxzXyA9ICh1aW50MzJfdCopV2ViUFNhZmVNYWxsb2ModG90YWxfbnVtX3BpeGVscywgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgaWYgKGRlYy0+cGl4ZWxzXyA9PSBOVUxMKSB7CisgICAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19PVVRfT0ZfTUVNT1JZOworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiAxOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBTcGVjaWFsIHJvdy1wcm9jZXNzaW5nIHRoYXQgb25seSBzdG9yZXMgdGhlIGFscGhhIGRhdGEuCitzdGF0aWMgdm9pZCBFeHRyYWN0QWxwaGFSb3dzKFZQOExEZWNvZGVyKiBjb25zdCBkZWMsIGludCBsYXN0X3JvdykgeworICBpbnQgY3VyX3JvdyA9IGRlYy0+bGFzdF9yb3dfOworICBpbnQgbnVtX3Jvd3MgPSBsYXN0X3JvdyAtIGN1cl9yb3c7CisgIGNvbnN0IHVpbnQzMl90KiBpbiA9IGRlYy0+cGl4ZWxzXyArIGRlYy0+d2lkdGhfICogY3VyX3JvdzsKKworICBhc3NlcnQobGFzdF9yb3cgPD0gZGVjLT5pb18tPmNyb3BfYm90dG9tKTsKKyAgd2hpbGUgKG51bV9yb3dzID4gMCkgeworICAgIGNvbnN0IGludCBudW1fcm93c190b19wcm9jZXNzID0KKyAgICAgICAgKG51bV9yb3dzID4gTlVNX0FSR0JfQ0FDSEVfUk9XUykgPyBOVU1fQVJHQl9DQUNIRV9ST1dTIDogbnVtX3Jvd3M7CisgICAgLy8gRXh0cmFjdCBhbHBoYSAod2hpY2ggaXMgc3RvcmVkIGluIHRoZSBncmVlbiBwbGFuZSkuCisgICAgQUxQSERlY29kZXIqIGNvbnN0IGFscGhfZGVjID0gKEFMUEhEZWNvZGVyKilkZWMtPmlvXy0+b3BhcXVlOworICAgIHVpbnQ4X3QqIGNvbnN0IG91dHB1dCA9IGFscGhfZGVjLT5vdXRwdXRfOworICAgIGNvbnN0IGludCB3aWR0aCA9IGRlYy0+aW9fLT53aWR0aDsgICAgICAvLyB0aGUgZmluYWwgd2lkdGggKCE9IGRlYy0+d2lkdGhfKQorICAgIGNvbnN0IGludCBjYWNoZV9waXhzID0gd2lkdGggKiBudW1fcm93c190b19wcm9jZXNzOworICAgIHVpbnQ4X3QqIGNvbnN0IGRzdCA9IG91dHB1dCArIHdpZHRoICogY3VyX3JvdzsKKyAgICBjb25zdCB1aW50MzJfdCogY29uc3Qgc3JjID0gZGVjLT5hcmdiX2NhY2hlXzsKKyAgICBBcHBseUludmVyc2VUcmFuc2Zvcm1zKGRlYywgbnVtX3Jvd3NfdG9fcHJvY2VzcywgaW4pOworICAgIFdlYlBFeHRyYWN0R3JlZW4oc3JjLCBkc3QsIGNhY2hlX3BpeHMpOworICAgIEFscGhhQXBwbHlGaWx0ZXIoYWxwaF9kZWMsCisgICAgICAgICAgICAgICAgICAgICBjdXJfcm93LCBjdXJfcm93ICsgbnVtX3Jvd3NfdG9fcHJvY2VzcywgZHN0LCB3aWR0aCk7CisgICAgbnVtX3Jvd3MgLT0gbnVtX3Jvd3NfdG9fcHJvY2VzczsKKyAgICBpbiArPSBudW1fcm93c190b19wcm9jZXNzICogZGVjLT53aWR0aF87CisgICAgY3VyX3JvdyArPSBudW1fcm93c190b19wcm9jZXNzOworICB9CisgIGFzc2VydChjdXJfcm93ID09IGxhc3Rfcm93KTsKKyAgZGVjLT5sYXN0X3Jvd18gPSBkZWMtPmxhc3Rfb3V0X3Jvd18gPSBsYXN0X3JvdzsKK30KKworaW50IFZQOExEZWNvZGVBbHBoYUhlYWRlcihBTFBIRGVjb2RlciogY29uc3QgYWxwaF9kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsIHNpemVfdCBkYXRhX3NpemUpIHsKKyAgaW50IG9rID0gMDsKKyAgVlA4TERlY29kZXIqIGRlYyA9IFZQOExOZXcoKTsKKworICBpZiAoZGVjID09IE5VTEwpIHJldHVybiAwOworCisgIGFzc2VydChhbHBoX2RlYyAhPSBOVUxMKTsKKyAgYWxwaF9kZWMtPnZwOGxfZGVjXyA9IGRlYzsKKworICBkZWMtPndpZHRoXyA9IGFscGhfZGVjLT53aWR0aF87CisgIGRlYy0+aGVpZ2h0XyA9IGFscGhfZGVjLT5oZWlnaHRfOworICBkZWMtPmlvXyA9ICZhbHBoX2RlYy0+aW9fOworICBkZWMtPmlvXy0+b3BhcXVlID0gYWxwaF9kZWM7CisgIGRlYy0+aW9fLT53aWR0aCA9IGFscGhfZGVjLT53aWR0aF87CisgIGRlYy0+aW9fLT5oZWlnaHQgPSBhbHBoX2RlYy0+aGVpZ2h0XzsKKworICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX09LOworICBWUDhMSW5pdEJpdFJlYWRlcigmZGVjLT5icl8sIGRhdGEsIGRhdGFfc2l6ZSk7CisKKyAgaWYgKCFEZWNvZGVJbWFnZVN0cmVhbShhbHBoX2RlYy0+d2lkdGhfLCBhbHBoX2RlYy0+aGVpZ2h0XywgMSwgZGVjLCBOVUxMKSkgeworICAgIGdvdG8gRXJyOworICB9CisKKyAgLy8gU3BlY2lhbCBjYXNlOiBpZiBhbHBoYSBkYXRhIHVzZXMgb25seSB0aGUgY29sb3IgaW5kZXhpbmcgdHJhbnNmb3JtIGFuZAorICAvLyBkb2Vzbid0IHVzZSBjb2xvciBjYWNoZSAoYSBmcmVxdWVudCBjYXNlKSwgd2Ugd2lsbCB1c2UgRGVjb2RlQWxwaGFEYXRhKCkKKyAgLy8gbWV0aG9kIHRoYXQgb25seSBuZWVkcyBhbGxvY2F0aW9uIG9mIDEgYnl0ZSBwZXIgcGl4ZWwgKGFscGhhIGNoYW5uZWwpLgorICBpZiAoZGVjLT5uZXh0X3RyYW5zZm9ybV8gPT0gMSAmJgorICAgICAgZGVjLT50cmFuc2Zvcm1zX1swXS50eXBlXyA9PSBDT0xPUl9JTkRFWElOR19UUkFOU0ZPUk0gJiYKKyAgICAgIElzOGJPcHRpbWl6YWJsZSgmZGVjLT5oZHJfKSkgeworICAgIGFscGhfZGVjLT51c2VfOGJfZGVjb2RlXyA9IDE7CisgICAgb2sgPSBBbGxvY2F0ZUludGVybmFsQnVmZmVyczhiKGRlYyk7CisgIH0gZWxzZSB7CisgICAgLy8gQWxsb2NhdGUgaW50ZXJuYWwgYnVmZmVycyAobm90ZSB0aGF0IGRlYy0+d2lkdGhfIG1heSBoYXZlIGNoYW5nZWQgaGVyZSkuCisgICAgYWxwaF9kZWMtPnVzZV84Yl9kZWNvZGVfID0gMDsKKyAgICBvayA9IEFsbG9jYXRlSW50ZXJuYWxCdWZmZXJzMzJiKGRlYywgYWxwaF9kZWMtPndpZHRoXyk7CisgIH0KKworICBpZiAoIW9rKSBnb3RvIEVycjsKKworICByZXR1cm4gMTsKKworIEVycjoKKyAgVlA4TERlbGV0ZShhbHBoX2RlYy0+dnA4bF9kZWNfKTsKKyAgYWxwaF9kZWMtPnZwOGxfZGVjXyA9IE5VTEw7CisgIHJldHVybiAwOworfQorCitpbnQgVlA4TERlY29kZUFscGhhSW1hZ2VTdHJlYW0oQUxQSERlY29kZXIqIGNvbnN0IGFscGhfZGVjLCBpbnQgbGFzdF9yb3cpIHsKKyAgVlA4TERlY29kZXIqIGNvbnN0IGRlYyA9IGFscGhfZGVjLT52cDhsX2RlY187CisgIGFzc2VydChkZWMgIT0gTlVMTCk7CisgIGFzc2VydChsYXN0X3JvdyA8PSBkZWMtPmhlaWdodF8pOworCisgIGlmIChkZWMtPmxhc3Rfcm93XyA+PSBsYXN0X3JvdykgeworICAgIHJldHVybiAxOyAgLy8gZG9uZQorICB9CisKKyAgaWYgKCFhbHBoX2RlYy0+dXNlXzhiX2RlY29kZV8pIFdlYlBJbml0QWxwaGFQcm9jZXNzaW5nKCk7CisKKyAgLy8gRGVjb2RlICh3aXRoIHNwZWNpYWwgcm93IHByb2Nlc3NpbmcpLgorICByZXR1cm4gYWxwaF9kZWMtPnVzZV84Yl9kZWNvZGVfID8KKyAgICAgIERlY29kZUFscGhhRGF0YShkZWMsICh1aW50OF90KilkZWMtPnBpeGVsc18sIGRlYy0+d2lkdGhfLCBkZWMtPmhlaWdodF8sCisgICAgICAgICAgICAgICAgICAgICAgbGFzdF9yb3cpIDoKKyAgICAgIERlY29kZUltYWdlRGF0YShkZWMsIGRlYy0+cGl4ZWxzXywgZGVjLT53aWR0aF8sIGRlYy0+aGVpZ2h0XywKKyAgICAgICAgICAgICAgICAgICAgICBsYXN0X3JvdywgRXh0cmFjdEFscGhhUm93cyk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBWUDhMRGVjb2RlSGVhZGVyKFZQOExEZWNvZGVyKiBjb25zdCBkZWMsIFZQOElvKiBjb25zdCBpbykgeworICBpbnQgd2lkdGgsIGhlaWdodCwgaGFzX2FscGhhOworCisgIGlmIChkZWMgPT0gTlVMTCkgcmV0dXJuIDA7CisgIGlmIChpbyA9PSBOVUxMKSB7CisgICAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19JTlZBTElEX1BBUkFNOworICAgIHJldHVybiAwOworICB9CisKKyAgZGVjLT5pb18gPSBpbzsKKyAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19PSzsKKyAgVlA4TEluaXRCaXRSZWFkZXIoJmRlYy0+YnJfLCBpby0+ZGF0YSwgaW8tPmRhdGFfc2l6ZSk7CisgIGlmICghUmVhZEltYWdlSW5mbygmZGVjLT5icl8sICZ3aWR0aCwgJmhlaWdodCwgJmhhc19hbHBoYSkpIHsKKyAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUjsKKyAgICBnb3RvIEVycm9yOworICB9CisgIGRlYy0+c3RhdGVfID0gUkVBRF9ESU07CisgIGlvLT53aWR0aCA9IHdpZHRoOworICBpby0+aGVpZ2h0ID0gaGVpZ2h0OworCisgIGlmICghRGVjb2RlSW1hZ2VTdHJlYW0od2lkdGgsIGhlaWdodCwgMSwgZGVjLCBOVUxMKSkgZ290byBFcnJvcjsKKyAgcmV0dXJuIDE7CisKKyBFcnJvcjoKKyAgVlA4TENsZWFyKGRlYyk7CisgIGFzc2VydChkZWMtPnN0YXR1c18gIT0gVlA4X1NUQVRVU19PSyk7CisgIHJldHVybiAwOworfQorCitpbnQgVlA4TERlY29kZUltYWdlKFZQOExEZWNvZGVyKiBjb25zdCBkZWMpIHsKKyAgVlA4SW8qIGlvID0gTlVMTDsKKyAgV2ViUERlY1BhcmFtcyogcGFyYW1zID0gTlVMTDsKKworICAvLyBTYW5pdHkgY2hlY2tzLgorICBpZiAoZGVjID09IE5VTEwpIHJldHVybiAwOworCisgIGFzc2VydChkZWMtPmhkcl8uaHVmZm1hbl90YWJsZXNfICE9IE5VTEwpOworICBhc3NlcnQoZGVjLT5oZHJfLmh0cmVlX2dyb3Vwc18gIT0gTlVMTCk7CisgIGFzc2VydChkZWMtPmhkcl8ubnVtX2h0cmVlX2dyb3Vwc18gPiAwKTsKKworICBpbyA9IGRlYy0+aW9fOworICBhc3NlcnQoaW8gIT0gTlVMTCk7CisgIHBhcmFtcyA9IChXZWJQRGVjUGFyYW1zKilpby0+b3BhcXVlOworICBhc3NlcnQocGFyYW1zICE9IE5VTEwpOworCisgIC8vIEluaXRpYWxpemF0aW9uLgorICBpZiAoZGVjLT5zdGF0ZV8gIT0gUkVBRF9EQVRBKSB7CisgICAgZGVjLT5vdXRwdXRfID0gcGFyYW1zLT5vdXRwdXQ7CisgICAgYXNzZXJ0KGRlYy0+b3V0cHV0XyAhPSBOVUxMKTsKKworICAgIGlmICghV2ViUElvSW5pdEZyb21PcHRpb25zKHBhcmFtcy0+b3B0aW9ucywgaW8sIE1PREVfQkdSQSkpIHsKKyAgICAgIGRlYy0+c3RhdHVzXyA9IFZQOF9TVEFUVVNfSU5WQUxJRF9QQVJBTTsKKyAgICAgIGdvdG8gRXJyOworICAgIH0KKworICAgIGlmICghQWxsb2NhdGVJbnRlcm5hbEJ1ZmZlcnMzMmIoZGVjLCBpby0+d2lkdGgpKSBnb3RvIEVycjsKKworI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX1NJWkUpCisgICAgaWYgKGlvLT51c2Vfc2NhbGluZyAmJiAhQWxsb2NhdGVBbmRJbml0UmVzY2FsZXIoZGVjLCBpbykpIGdvdG8gRXJyOworI2Vsc2UKKyAgICBpZiAoaW8tPnVzZV9zY2FsaW5nKSB7CisgICAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX0lOVkFMSURfUEFSQU07CisgICAgICBnb3RvIEVycjsKKyAgICB9CisjZW5kaWYKKyAgICBpZiAoaW8tPnVzZV9zY2FsaW5nIHx8IFdlYlBJc1ByZW11bHRpcGxpZWRNb2RlKGRlYy0+b3V0cHV0Xy0+Y29sb3JzcGFjZSkpIHsKKyAgICAgIC8vIG5lZWQgdGhlIGFscGhhLW11bHRpcGx5IGZ1bmN0aW9ucyBmb3IgcHJlbXVsdGlwbGllZCBvdXRwdXQgb3IgcmVzY2FsaW5nCisgICAgICBXZWJQSW5pdEFscGhhUHJvY2Vzc2luZygpOworICAgIH0KKworICAgIGlmICghV2ViUElzUkdCTW9kZShkZWMtPm91dHB1dF8tPmNvbG9yc3BhY2UpKSB7CisgICAgICBXZWJQSW5pdENvbnZlcnRBUkdCVG9ZVVYoKTsKKyAgICAgIGlmIChkZWMtPm91dHB1dF8tPnUuWVVWQS5hICE9IE5VTEwpIFdlYlBJbml0QWxwaGFQcm9jZXNzaW5nKCk7CisgICAgfQorICAgIGlmIChkZWMtPmluY3JlbWVudGFsXykgeworICAgICAgaWYgKGRlYy0+aGRyXy5jb2xvcl9jYWNoZV9zaXplXyA+IDAgJiYKKyAgICAgICAgICBkZWMtPmhkcl8uc2F2ZWRfY29sb3JfY2FjaGVfLmNvbG9yc18gPT0gTlVMTCkgeworICAgICAgICBpZiAoIVZQOExDb2xvckNhY2hlSW5pdCgmZGVjLT5oZHJfLnNhdmVkX2NvbG9yX2NhY2hlXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjLT5oZHJfLmNvbG9yX2NhY2hlXy5oYXNoX2JpdHNfKSkgeworICAgICAgICAgIGRlYy0+c3RhdHVzXyA9IFZQOF9TVEFUVVNfT1VUX09GX01FTU9SWTsKKyAgICAgICAgICBnb3RvIEVycjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBkZWMtPnN0YXRlXyA9IFJFQURfREFUQTsKKyAgfQorCisgIC8vIERlY29kZS4KKyAgaWYgKCFEZWNvZGVJbWFnZURhdGEoZGVjLCBkZWMtPnBpeGVsc18sIGRlYy0+d2lkdGhfLCBkZWMtPmhlaWdodF8sCisgICAgICAgICAgICAgICAgICAgICAgIGlvLT5jcm9wX2JvdHRvbSwgUHJvY2Vzc1Jvd3MpKSB7CisgICAgZ290byBFcnI7CisgIH0KKworICBwYXJhbXMtPmxhc3RfeSA9IGRlYy0+bGFzdF9vdXRfcm93XzsKKyAgcmV0dXJuIDE7CisKKyBFcnI6CisgIFZQOExDbGVhcihkZWMpOworICBhc3NlcnQoZGVjLT5zdGF0dXNfICE9IFZQOF9TVEFUVVNfT0spOworICByZXR1cm4gMDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvdnA4bGlfZGVjLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL3ZwOGxpX2RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYTIyZjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL3ZwOGxpX2RlYy5oCkBAIC0wLDAgKzEsMTM3IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gTG9zc2xlc3MgZGVjb2RlcjogaW50ZXJuYWwgaGVhZGVyLgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisvLyAgICAgICAgIFZpa2FzIEFyb3JhKHZpa2Fhcy5hcm9yYUBnbWFpbC5jb20pCisKKyNpZm5kZWYgV0VCUF9ERUNfVlA4TElfREVDX0hfCisjZGVmaW5lIFdFQlBfREVDX1ZQOExJX0RFQ19IXworCisjaWYgIWRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgPHN0cmluZy5oPiAgICAgLy8gZm9yIG1lbWNweSgpCisjZW5kaWYKKyNpbmNsdWRlICJzcmMvZGVjL3dlYnBpX2RlYy5oIgorI2luY2x1ZGUgInNyYy91dGlscy9iaXRfcmVhZGVyX3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL2NvbG9yX2NhY2hlX3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL2h1ZmZtYW5fdXRpbHMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit0eXBlZGVmIGVudW0geworICBSRUFEX0RBVEEgPSAwLAorICBSRUFEX0hEUiA9IDEsCisgIFJFQURfRElNID0gMgorfSBWUDhMRGVjb2RlU3RhdGU7CisKK3R5cGVkZWYgc3RydWN0IFZQOExUcmFuc2Zvcm0gVlA4TFRyYW5zZm9ybTsKK3N0cnVjdCBWUDhMVHJhbnNmb3JtIHsKKyAgVlA4TEltYWdlVHJhbnNmb3JtVHlwZSB0eXBlXzsgICAvLyB0cmFuc2Zvcm0gdHlwZS4KKyAgaW50ICAgICAgICAgICAgICAgICAgICBiaXRzXzsgICAvLyBzdWJzYW1wbGluZyBiaXRzIGRlZmluaW5nIHRyYW5zZm9ybSB3aW5kb3cuCisgIGludCAgICAgICAgICAgICAgICAgICAgeHNpemVfOyAgLy8gdHJhbnNmb3JtIHdpbmRvdyBYIGluZGV4LgorICBpbnQgICAgICAgICAgICAgICAgICAgIHlzaXplXzsgIC8vIHRyYW5zZm9ybSB3aW5kb3cgWSBpbmRleC4KKyAgdWludDMyX3QgICAgICAgICAgICAgICpkYXRhXzsgICAvLyB0cmFuc2Zvcm0gZGF0YS4KK307CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50ICAgICAgICAgICAgIGNvbG9yX2NhY2hlX3NpemVfOworICBWUDhMQ29sb3JDYWNoZSAgY29sb3JfY2FjaGVfOworICBWUDhMQ29sb3JDYWNoZSAgc2F2ZWRfY29sb3JfY2FjaGVfOyAgLy8gZm9yIGluY3JlbWVudGFsCisKKyAgaW50ICAgICAgICAgICAgIGh1ZmZtYW5fbWFza187CisgIGludCAgICAgICAgICAgICBodWZmbWFuX3N1YnNhbXBsZV9iaXRzXzsKKyAgaW50ICAgICAgICAgICAgIGh1ZmZtYW5feHNpemVfOworICB1aW50MzJfdCAgICAgICAqaHVmZm1hbl9pbWFnZV87CisgIGludCAgICAgICAgICAgICBudW1faHRyZWVfZ3JvdXBzXzsKKyAgSFRyZWVHcm91cCAgICAgKmh0cmVlX2dyb3Vwc187CisgIEh1ZmZtYW5Db2RlICAgICpodWZmbWFuX3RhYmxlc187Cit9IFZQOExNZXRhZGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QgVlA4TERlY29kZXIgVlA4TERlY29kZXI7CitzdHJ1Y3QgVlA4TERlY29kZXIgeworICBWUDhTdGF0dXNDb2RlICAgIHN0YXR1c187CisgIFZQOExEZWNvZGVTdGF0ZSAgc3RhdGVfOworICBWUDhJbyAgICAgICAgICAgKmlvXzsKKworICBjb25zdCBXZWJQRGVjQnVmZmVyICpvdXRwdXRfOyAgICAvLyBzaG9ydGN1dCB0byBpby0+b3BhcXVlLT5vdXRwdXQKKworICB1aW50MzJfdCAgICAgICAgKnBpeGVsc187ICAgICAgICAvLyBJbnRlcm5hbCBkYXRhOiBlaXRoZXIgdWludDhfdCogZm9yIGFscGhhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIHVpbnQzMl90KiBmb3IgQkdSQS4KKyAgdWludDMyX3QgICAgICAgICphcmdiX2NhY2hlXzsgICAgLy8gU2NyYXRjaCBidWZmZXIgZm9yIHRlbXBvcmFyeSBCR1JBIHN0b3JhZ2UuCisKKyAgVlA4TEJpdFJlYWRlciAgICBicl87CisgIGludCAgICAgICAgICAgICAgaW5jcmVtZW50YWxfOyAgIC8vIGlmIHRydWUsIGluY3JlbWVudGFsIGRlY29kaW5nIGlzIGV4cGVjdGVkCisgIFZQOExCaXRSZWFkZXIgICAgc2F2ZWRfYnJfOyAgICAgIC8vIG5vdGU6IGNvdWxkIGJlIGxvY2FsIHZhcmlhYmxlcyB0b28KKyAgaW50ICAgICAgICAgICAgICBzYXZlZF9sYXN0X3BpeGVsXzsKKworICBpbnQgICAgICAgICAgICAgIHdpZHRoXzsKKyAgaW50ICAgICAgICAgICAgICBoZWlnaHRfOworICBpbnQgICAgICAgICAgICAgIGxhc3Rfcm93XzsgICAgICAvLyBsYXN0IGlucHV0IHJvdyBkZWNvZGVkIHNvIGZhci4KKyAgaW50ICAgICAgICAgICAgICBsYXN0X3BpeGVsXzsgICAgLy8gbGFzdCBwaXhlbCBkZWNvZGVkIHNvIGZhci4gSG93ZXZlciwgaXQgbWF5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBiZSB0cmFuc2Zvcm1lZCwgc2NhbGVkIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xvci1jb252ZXJ0ZWQgeWV0LgorICBpbnQgICAgICAgICAgICAgIGxhc3Rfb3V0X3Jvd187ICAvLyBsYXN0IHJvdyBvdXRwdXQgc28gZmFyLgorCisgIFZQOExNZXRhZGF0YSAgICAgaGRyXzsKKworICBpbnQgICAgICAgICAgICAgIG5leHRfdHJhbnNmb3JtXzsKKyAgVlA4TFRyYW5zZm9ybSAgICB0cmFuc2Zvcm1zX1tOVU1fVFJBTlNGT1JNU107CisgIC8vIG9yJ2QgYml0c2V0IHN0b3JpbmcgdGhlIHRyYW5zZm9ybXMgdHlwZXMuCisgIHVpbnQzMl90ICAgICAgICAgdHJhbnNmb3Jtc19zZWVuXzsKKworICB1aW50OF90ICAgICAgICAgKnJlc2NhbGVyX21lbW9yeTsgIC8vIFdvcmtpbmcgbWVtb3J5IGZvciByZXNjYWxpbmcgd29yay4KKyAgV2ViUFJlc2NhbGVyICAgICpyZXNjYWxlcjsgICAgICAgICAvLyBDb21tb24gcmVzY2FsZXIgZm9yIGFsbCBjaGFubmVscy4KK307CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBpbnRlcm5hbCBmdW5jdGlvbnMuIE5vdCBwdWJsaWMuCisKK3N0cnVjdCBBTFBIRGVjb2RlcjsgIC8vIERlZmluZWQgaW4gZGVjL2FscGhhaS5oLgorCisvLyBpbiB2cDhsLmMKKworLy8gRGVjb2RlcyBpbWFnZSBoZWFkZXIgZm9yIGFscGhhIGRhdGEgc3RvcmVkIHVzaW5nIGxvc3NsZXNzIGNvbXByZXNzaW9uLgorLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIGVycm9yLgoraW50IFZQOExEZWNvZGVBbHBoYUhlYWRlcihzdHJ1Y3QgQUxQSERlY29kZXIqIGNvbnN0IGFscGhfZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBzaXplX3QgZGF0YV9zaXplKTsKKworLy8gRGVjb2RlcyAqYXQgbGVhc3QqICdsYXN0X3Jvdycgcm93cyBvZiBhbHBoYS4gSWYgc29tZSBvZiB0aGUgaW5pdGlhbCByb3dzIGFyZQorLy8gYWxyZWFkeSBkZWNvZGVkIGluIHByZXZpb3VzIGNhbGwocyksIGl0IHdpbGwgcmVzdW1lIGRlY29kaW5nIGZyb20gd2hlcmUgaXQKKy8vIHdhcyBwYXVzZWQuCisvLyBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgYml0c3RyZWFtIGVycm9yLgoraW50IFZQOExEZWNvZGVBbHBoYUltYWdlU3RyZWFtKHN0cnVjdCBBTFBIRGVjb2RlciogY29uc3QgYWxwaF9kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxhc3Rfcm93KTsKKworLy8gQWxsb2NhdGVzIGFuZCBpbml0aWFsaXplIGEgbmV3IGxvc3NsZXNzIGRlY29kZXIgaW5zdGFuY2UuCitWUDhMRGVjb2RlciogVlA4TE5ldyh2b2lkKTsKKworLy8gRGVjb2RlcyB0aGUgaW1hZ2UgaGVhZGVyLiBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgZXJyb3IuCitpbnQgVlA4TERlY29kZUhlYWRlcihWUDhMRGVjb2RlciogY29uc3QgZGVjLCBWUDhJbyogY29uc3QgaW8pOworCisvLyBEZWNvZGVzIGFuIGltYWdlLiBJdCdzIHJlcXVpcmVkIHRvIGRlY29kZSB0aGUgbG9zc2xlc3MgaGVhZGVyIGJlZm9yZSBjYWxsaW5nCisvLyB0aGlzIGZ1bmN0aW9uLiBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgZXJyb3IsIHdpdGggdXBkYXRlZCBkZWMtPnN0YXR1c18uCitpbnQgVlA4TERlY29kZUltYWdlKFZQOExEZWNvZGVyKiBjb25zdCBkZWMpOworCisvLyBSZXNldHMgdGhlIGRlY29kZXIgaW4gaXRzIGluaXRpYWwgc3RhdGUsIHJlY2xhaW1pbmcgbWVtb3J5LgorLy8gUHJlc2VydmVzIHRoZSBkZWMtPnN0YXR1c18gdmFsdWUuCit2b2lkIFZQOExDbGVhcihWUDhMRGVjb2RlciogY29uc3QgZGVjKTsKKworLy8gQ2xlYXJzIGFuZCBkZWFsbG9jYXRlIGEgbG9zc2xlc3MgZGVjb2RlciBpbnN0YW5jZS4KK3ZvaWQgVlA4TERlbGV0ZShWUDhMRGVjb2RlciogY29uc3QgZGVjKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8qIFdFQlBfREVDX1ZQOExJX0RFQ19IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlYy93ZWJwX2RlYy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlYy93ZWJwX2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZDQyMjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL3dlYnBfZGVjLmMKQEAgLTAsMCArMSw4NTEgQEAKKy8vIENvcHlyaWdodCAyMDEwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBNYWluIGRlY29kaW5nIGZ1bmN0aW9ucyBmb3IgV0VCUCBpbWFnZXMuCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL2Fzc2VydF9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RkbGliX3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdfcG9lbS5oIgorI2Vsc2UKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAic3JjL2RlYy92cDhpX2RlYy5oIgorI2luY2x1ZGUgInNyYy9kZWMvdnA4bGlfZGVjLmgiCisjaW5jbHVkZSAic3JjL2RlYy93ZWJwaV9kZWMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvd2VicC9tdXhfdHlwZXMuaCIgIC8vIEFMUEhBX0ZMQUcKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJJRkYgbGF5b3V0IGlzOgorLy8gICBPZmZzZXQgIHRhZworLy8gICAwLi4uMyAgICJSSUZGIiA0LWJ5dGUgdGFnCisvLyAgIDQuLi43ICAgc2l6ZSBvZiBpbWFnZSBkYXRhIChpbmNsdWRpbmcgbWV0YWRhdGEpIHN0YXJ0aW5nIGF0IG9mZnNldCA4CisvLyAgIDguLi4xMSAgIldFQlAiICAgb3VyIGZvcm0tdHlwZSBzaWduYXR1cmUKKy8vIFRoZSBSSUZGIGNvbnRhaW5lciAoMTIgYnl0ZXMpIGlzIGZvbGxvd2VkIGJ5IGFwcHJvcHJpYXRlIGNodW5rczoKKy8vICAgMTIuLjE1ICAiVlA4ICI6IDQtYnl0ZXMgdGFncywgc2lnbmFsaW5nIHRoZSB1c2Ugb2YgVlA4IHZpZGVvIGZvcm1hdAorLy8gICAxNi4uMTkgIHNpemUgb2YgdGhlIHJhdyBWUDggaW1hZ2UgZGF0YSwgc3RhcnRpbmcgYXQgb2Zmc2V0IDIwCisvLyAgIDIwLi4uLiAgdGhlIFZQOCBieXRlcworLy8gT3IsCisvLyAgIDEyLi4xNSAgIlZQOEwiOiA0LWJ5dGVzIHRhZ3MsIHNpZ25hbGluZyB0aGUgdXNlIG9mIFZQOEwgbG9zc2xlc3MgZm9ybWF0CisvLyAgIDE2Li4xOSAgc2l6ZSBvZiB0aGUgcmF3IFZQOEwgaW1hZ2UgZGF0YSwgc3RhcnRpbmcgYXQgb2Zmc2V0IDIwCisvLyAgIDIwLi4uLiAgdGhlIFZQOEwgYnl0ZXMKKy8vIE9yLAorLy8gICAxMi4uMTUgICJWUDhYIjogNC1ieXRlcyB0YWdzLCBkZXNjcmliaW5nIHRoZSBleHRlbmRlZC1WUDggY2h1bmsuCisvLyAgIDE2Li4xOSAgc2l6ZSBvZiB0aGUgVlA4WCBjaHVuayBzdGFydGluZyBhdCBvZmZzZXQgMjAuCisvLyAgIDIwLi4yMyAgVlA4WCBmbGFncyBiaXQtbWFwIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNodW5rLXR5cGVzIHByZXNlbnQuCisvLyAgIDI0Li4yNiAgV2lkdGggb2YgdGhlIENhbnZhcyBJbWFnZS4KKy8vICAgMjcuLjI5ICBIZWlnaHQgb2YgdGhlIENhbnZhcyBJbWFnZS4KKy8vIFRoZXJlIGNhbiBiZSBleHRyYSBjaHVua3MgYWZ0ZXIgdGhlICJWUDhYIiBjaHVuayAoSUNDUCwgQU5NRiwgVlA4LCBWUDhMLAorLy8gWE1QLCBFWElGICAuLi4pCisvLyBBbGwgc2l6ZXMgYXJlIGluIGxpdHRsZS1lbmRpYW4gb3JkZXIuCisvLyBOb3RlOiBjaHVuayBkYXRhIHNpemUgbXVzdCBiZSBwYWRkZWQgdG8gbXVsdGlwbGUgb2YgMiB3aGVuIHdyaXR0ZW4uCisKKy8vIFZhbGlkYXRlcyB0aGUgUklGRiBjb250YWluZXIgKGlmIGRldGVjdGVkKSBhbmQgc2tpcHMgb3ZlciBpdC4KKy8vIElmIGEgUklGRiBjb250YWluZXIgaXMgZGV0ZWN0ZWQsIHJldHVybnM6CisvLyAgICAgVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1IgZm9yIGludmFsaWQgaGVhZGVyLAorLy8gICAgIFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBIGZvciB0cnVuY2F0ZWQgZGF0YSBpZiBoYXZlX2FsbF9kYXRhIGlzIHRydWUsCisvLyBhbmQgVlA4X1NUQVRVU19PSyBvdGhlcndpc2UuCisvLyBJbiBjYXNlIHRoZXJlIGFyZSBub3QgZW5vdWdoIGJ5dGVzIChwYXJ0aWFsIFJJRkYgY29udGFpbmVyKSwgcmV0dXJuIDAgZm9yCisvLyAqcmlmZl9zaXplLiBFbHNlIHJldHVybiB0aGUgUklGRiBzaXplIGV4dHJhY3RlZCBmcm9tIHRoZSBoZWFkZXIuCitzdGF0aWMgVlA4U3RhdHVzQ29kZSBQYXJzZVJJRkYoY29uc3QgdWludDhfdCoqIGNvbnN0IGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBjb25zdCBkYXRhX3NpemUsIGludCBoYXZlX2FsbF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogY29uc3QgcmlmZl9zaXplKSB7CisgIGFzc2VydChkYXRhICE9IE5VTEwpOworICBhc3NlcnQoZGF0YV9zaXplICE9IE5VTEwpOworICBhc3NlcnQocmlmZl9zaXplICE9IE5VTEwpOworCisgICpyaWZmX3NpemUgPSAwOyAgLy8gRGVmYXVsdDogbm8gUklGRiBwcmVzZW50LgorICBpZiAoKmRhdGFfc2l6ZSA+PSBSSUZGX0hFQURFUl9TSVpFICYmICFtZW1jbXAoKmRhdGEsICJSSUZGIiwgVEFHX1NJWkUpKSB7CisgICAgaWYgKG1lbWNtcCgqZGF0YSArIDgsICJXRUJQIiwgVEFHX1NJWkUpKSB7CisgICAgICByZXR1cm4gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7ICAvLyBXcm9uZyBpbWFnZSBmaWxlIHNpZ25hdHVyZS4KKyAgICB9IGVsc2UgeworICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSA9IEdldExFMzIoKmRhdGEgKyBUQUdfU0laRSk7CisgICAgICAvLyBDaGVjayB0aGF0IHdlIGhhdmUgYXQgbGVhc3Qgb25lIGNodW5rIChpLmUgIldFQlAiICsgIlZQOD9ubm5uIikuCisgICAgICBpZiAoc2l6ZSA8IFRBR19TSVpFICsgQ0hVTktfSEVBREVSX1NJWkUpIHsKKyAgICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SOworICAgICAgfQorICAgICAgaWYgKHNpemUgPiBNQVhfQ0hVTktfUEFZTE9BRCkgeworICAgICAgICByZXR1cm4gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7CisgICAgICB9CisgICAgICBpZiAoaGF2ZV9hbGxfZGF0YSAmJiAoc2l6ZSA+ICpkYXRhX3NpemUgLSBDSFVOS19IRUFERVJfU0laRSkpIHsKKyAgICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBOyAgLy8gVHJ1bmNhdGVkIGJpdHN0cmVhbS4KKyAgICAgIH0KKyAgICAgIC8vIFdlIGhhdmUgYSBSSUZGIGNvbnRhaW5lci4gU2tpcCBpdC4KKyAgICAgICpyaWZmX3NpemUgPSBzaXplOworICAgICAgKmRhdGEgKz0gUklGRl9IRUFERVJfU0laRTsKKyAgICAgICpkYXRhX3NpemUgLT0gUklGRl9IRUFERVJfU0laRTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFZQOF9TVEFUVVNfT0s7Cit9CisKKy8vIFZhbGlkYXRlcyB0aGUgVlA4WCBoZWFkZXIgYW5kIHNraXBzIG92ZXIgaXQuCisvLyBSZXR1cm5zIFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SIGZvciBpbnZhbGlkIFZQOFggaGVhZGVyLAorLy8gICAgICAgICBWUDhfU1RBVFVTX05PVF9FTk9VR0hfREFUQSBpbiBjYXNlIG9mIGluc3VmZmljaWVudCBkYXRhLCBhbmQKKy8vICAgICAgICAgVlA4X1NUQVRVU19PSyBvdGhlcndpc2UuCisvLyBJZiBhIFZQOFggY2h1bmsgaXMgZm91bmQsIGZvdW5kX3ZwOHggaXMgc2V0IHRvIHRydWUgYW5kICp3aWR0aF9wdHIsCisvLyAqaGVpZ2h0X3B0ciBhbmQgKmZsYWdzX3B0ciBhcmUgc2V0IHRvIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlcyBleHRyYWN0ZWQKKy8vIGZyb20gdGhlIFZQOFggY2h1bmsuCitzdGF0aWMgVlA4U3RhdHVzQ29kZSBQYXJzZVZQOFgoY29uc3QgdWludDhfdCoqIGNvbnN0IGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBjb25zdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBmb3VuZF92cDh4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3Qgd2lkdGhfcHRyLCBpbnQqIGNvbnN0IGhlaWdodF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGNvbnN0IGZsYWdzX3B0cikgeworICBjb25zdCB1aW50MzJfdCB2cDh4X3NpemUgPSBDSFVOS19IRUFERVJfU0laRSArIFZQOFhfQ0hVTktfU0laRTsKKyAgYXNzZXJ0KGRhdGEgIT0gTlVMTCk7CisgIGFzc2VydChkYXRhX3NpemUgIT0gTlVMTCk7CisgIGFzc2VydChmb3VuZF92cDh4ICE9IE5VTEwpOworCisgICpmb3VuZF92cDh4ID0gMDsKKworICBpZiAoKmRhdGFfc2l6ZSA8IENIVU5LX0hFQURFUl9TSVpFKSB7CisgICAgcmV0dXJuIFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBOyAgLy8gSW5zdWZmaWNpZW50IGRhdGEuCisgIH0KKworICBpZiAoIW1lbWNtcCgqZGF0YSwgIlZQOFgiLCBUQUdfU0laRSkpIHsKKyAgICBpbnQgd2lkdGgsIGhlaWdodDsKKyAgICB1aW50MzJfdCBmbGFnczsKKyAgICBjb25zdCB1aW50MzJfdCBjaHVua19zaXplID0gR2V0TEUzMigqZGF0YSArIFRBR19TSVpFKTsKKyAgICBpZiAoY2h1bmtfc2l6ZSAhPSBWUDhYX0NIVU5LX1NJWkUpIHsKKyAgICAgIHJldHVybiBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUjsgIC8vIFdyb25nIGNodW5rIHNpemUuCisgICAgfQorCisgICAgLy8gVmVyaWZ5IGlmIGVub3VnaCBkYXRhIGlzIGF2YWlsYWJsZSB0byB2YWxpZGF0ZSB0aGUgVlA4WCBjaHVuay4KKyAgICBpZiAoKmRhdGFfc2l6ZSA8IHZwOHhfc2l6ZSkgeworICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBOyAgLy8gSW5zdWZmaWNpZW50IGRhdGEuCisgICAgfQorICAgIGZsYWdzID0gR2V0TEUzMigqZGF0YSArIDgpOworICAgIHdpZHRoID0gMSArIEdldExFMjQoKmRhdGEgKyAxMik7CisgICAgaGVpZ2h0ID0gMSArIEdldExFMjQoKmRhdGEgKyAxNSk7CisgICAgaWYgKHdpZHRoICogKHVpbnQ2NF90KWhlaWdodCA+PSBNQVhfSU1BR0VfQVJFQSkgeworICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SOyAgLy8gaW1hZ2UgaXMgdG9vIGxhcmdlCisgICAgfQorCisgICAgaWYgKGZsYWdzX3B0ciAhPSBOVUxMKSAqZmxhZ3NfcHRyID0gZmxhZ3M7CisgICAgaWYgKHdpZHRoX3B0ciAhPSBOVUxMKSAqd2lkdGhfcHRyID0gd2lkdGg7CisgICAgaWYgKGhlaWdodF9wdHIgIT0gTlVMTCkgKmhlaWdodF9wdHIgPSBoZWlnaHQ7CisgICAgLy8gU2tpcCBvdmVyIFZQOFggaGVhZGVyIGJ5dGVzLgorICAgICpkYXRhICs9IHZwOHhfc2l6ZTsKKyAgICAqZGF0YV9zaXplIC09IHZwOHhfc2l6ZTsKKyAgICAqZm91bmRfdnA4eCA9IDE7CisgIH0KKyAgcmV0dXJuIFZQOF9TVEFUVVNfT0s7Cit9CisKKy8vIFNraXBzIHRvIHRoZSBuZXh0IFZQOC9WUDhMIGNodW5rIGhlYWRlciBpbiB0aGUgZGF0YSBnaXZlbiB0aGUgc2l6ZSBvZiB0aGUKKy8vIFJJRkYgY2h1bmsgJ3JpZmZfc2l6ZScuCisvLyBSZXR1cm5zIFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SIGlmIGFueSBpbnZhbGlkIGNodW5rIHNpemUgaXMgZW5jb3VudGVyZWQsCisvLyAgICAgICAgIFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBIGluIGNhc2Ugb2YgaW5zdWZmaWNpZW50IGRhdGEsIGFuZAorLy8gICAgICAgICBWUDhfU1RBVFVTX09LIG90aGVyd2lzZS4KKy8vIElmIGFuIGFscGhhIGNodW5rIGlzIGZvdW5kLCAqYWxwaGFfZGF0YSBhbmQgKmFscGhhX3NpemUgYXJlIHNldAorLy8gYXBwcm9wcmlhdGVseS4KK3N0YXRpYyBWUDhTdGF0dXNDb2RlIFBhcnNlT3B0aW9uYWxDaHVua3MoY29uc3QgdWludDhfdCoqIGNvbnN0IGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogY29uc3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgY29uc3QgcmlmZl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiogY29uc3QgYWxwaGFfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBjb25zdCBhbHBoYV9zaXplKSB7CisgIGNvbnN0IHVpbnQ4X3QqIGJ1ZjsKKyAgc2l6ZV90IGJ1Zl9zaXplOworICB1aW50MzJfdCB0b3RhbF9zaXplID0gVEFHX1NJWkUgKyAgICAgICAgICAgLy8gIldFQlAiLgorICAgICAgICAgICAgICAgICAgICAgICAgQ0hVTktfSEVBREVSX1NJWkUgKyAgLy8gIlZQOFhubm5uIi4KKyAgICAgICAgICAgICAgICAgICAgICAgIFZQOFhfQ0hVTktfU0laRTsgICAgIC8vIGRhdGEuCisgIGFzc2VydChkYXRhICE9IE5VTEwpOworICBhc3NlcnQoZGF0YV9zaXplICE9IE5VTEwpOworICBidWYgPSAqZGF0YTsKKyAgYnVmX3NpemUgPSAqZGF0YV9zaXplOworCisgIGFzc2VydChhbHBoYV9kYXRhICE9IE5VTEwpOworICBhc3NlcnQoYWxwaGFfc2l6ZSAhPSBOVUxMKTsKKyAgKmFscGhhX2RhdGEgPSBOVUxMOworICAqYWxwaGFfc2l6ZSA9IDA7CisKKyAgd2hpbGUgKDEpIHsKKyAgICB1aW50MzJfdCBjaHVua19zaXplOworICAgIHVpbnQzMl90IGRpc2tfY2h1bmtfc2l6ZTsgICAvLyBjaHVua19zaXplIHdpdGggcGFkZGluZworCisgICAgKmRhdGEgPSBidWY7CisgICAgKmRhdGFfc2l6ZSA9IGJ1Zl9zaXplOworCisgICAgaWYgKGJ1Zl9zaXplIDwgQ0hVTktfSEVBREVSX1NJWkUpIHsgIC8vIEluc3VmZmljaWVudCBkYXRhLgorICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBOworICAgIH0KKworICAgIGNodW5rX3NpemUgPSBHZXRMRTMyKGJ1ZiArIFRBR19TSVpFKTsKKyAgICBpZiAoY2h1bmtfc2l6ZSA+IE1BWF9DSFVOS19QQVlMT0FEKSB7CisgICAgICByZXR1cm4gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7ICAgICAgICAgIC8vIE5vdCBhIHZhbGlkIGNodW5rIHNpemUuCisgICAgfQorICAgIC8vIEZvciBvZGQtc2l6ZWQgY2h1bmstcGF5bG9hZCwgdGhlcmUncyBvbmUgYnl0ZSBwYWRkaW5nIGF0IHRoZSBlbmQuCisgICAgZGlza19jaHVua19zaXplID0gKENIVU5LX0hFQURFUl9TSVpFICsgY2h1bmtfc2l6ZSArIDEpICYgfjE7CisgICAgdG90YWxfc2l6ZSArPSBkaXNrX2NodW5rX3NpemU7CisKKyAgICAvLyBDaGVjayB0aGF0IHRvdGFsIGJ5dGVzIHNraXBwZWQgc28gZmFyIGRvZXMgbm90IGV4Y2VlZCByaWZmX3NpemUuCisgICAgaWYgKHJpZmZfc2l6ZSA+IDAgJiYgKHRvdGFsX3NpemUgPiByaWZmX3NpemUpKSB7CisgICAgICByZXR1cm4gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7ICAgICAgICAgIC8vIE5vdCBhIHZhbGlkIGNodW5rIHNpemUuCisgICAgfQorCisgICAgLy8gU3RhcnQgb2YgYSAocG9zc2libHkgaW5jb21wbGV0ZSkgVlA4L1ZQOEwgY2h1bmsgaW1wbGllcyB0aGF0IHdlIGhhdmUKKyAgICAvLyBwYXJzZWQgYWxsIHRoZSBvcHRpb25hbCBjaHVua3MuCisgICAgLy8gTm90ZTogVGhpcyBjaGVjayBtdXN0IG9jY3VyIGJlZm9yZSB0aGUgY2hlY2sgJ2J1Zl9zaXplIDwgZGlza19jaHVua19zaXplJworICAgIC8vIGJlbG93IHRvIGFsbG93IGluY29tcGxldGUgVlA4L1ZQOEwgY2h1bmtzLgorICAgIGlmICghbWVtY21wKGJ1ZiwgIlZQOCAiLCBUQUdfU0laRSkgfHwKKyAgICAgICAgIW1lbWNtcChidWYsICJWUDhMIiwgVEFHX1NJWkUpKSB7CisgICAgICByZXR1cm4gVlA4X1NUQVRVU19PSzsKKyAgICB9CisKKyAgICBpZiAoYnVmX3NpemUgPCBkaXNrX2NodW5rX3NpemUpIHsgICAgICAgICAgICAgLy8gSW5zdWZmaWNpZW50IGRhdGEuCisgICAgICByZXR1cm4gVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEE7CisgICAgfQorCisgICAgaWYgKCFtZW1jbXAoYnVmLCAiQUxQSCIsIFRBR19TSVpFKSkgeyAgICAgICAgIC8vIEEgdmFsaWQgQUxQSCBoZWFkZXIuCisgICAgICAqYWxwaGFfZGF0YSA9IGJ1ZiArIENIVU5LX0hFQURFUl9TSVpFOworICAgICAgKmFscGhhX3NpemUgPSBjaHVua19zaXplOworICAgIH0KKworICAgIC8vIFdlIGhhdmUgYSBmdWxsIGFuZCB2YWxpZCBjaHVuazsgc2tpcCBpdC4KKyAgICBidWYgKz0gZGlza19jaHVua19zaXplOworICAgIGJ1Zl9zaXplIC09IGRpc2tfY2h1bmtfc2l6ZTsKKyAgfQorfQorCisvLyBWYWxpZGF0ZXMgdGhlIFZQOC9WUDhMIEhlYWRlciAoIlZQOCBubm5uIiBvciAiVlA4TCBubm5uIikgYW5kIHNraXBzIG92ZXIgaXQuCisvLyBSZXR1cm5zIFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SIGZvciBpbnZhbGlkIChjaHVuayBsYXJnZXIgdGhhbgorLy8gICAgICAgICByaWZmX3NpemUpIFZQOC9WUDhMIGhlYWRlciwKKy8vICAgICAgICAgVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEEgaW4gY2FzZSBvZiBpbnN1ZmZpY2llbnQgZGF0YSwgYW5kCisvLyAgICAgICAgIFZQOF9TVEFUVVNfT0sgb3RoZXJ3aXNlLgorLy8gSWYgYSBWUDgvVlA4TCBjaHVuayBpcyBmb3VuZCwgKmNodW5rX3NpemUgaXMgc2V0IHRvIHRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMKKy8vIGV4dHJhY3RlZCBmcm9tIHRoZSBWUDgvVlA4TCBjaHVuayBoZWFkZXIuCisvLyBUaGUgZmxhZyAnKmlzX2xvc3NsZXNzJyBpcyBzZXQgdG8gMSBpbiBjYXNlIG9mIFZQOEwgY2h1bmsgLyByYXcgVlA4TCBkYXRhLgorc3RhdGljIFZQOFN0YXR1c0NvZGUgUGFyc2VWUDhIZWFkZXIoY29uc3QgdWludDhfdCoqIGNvbnN0IGRhdGFfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBjb25zdCBkYXRhX3NpemUsIGludCBoYXZlX2FsbF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHJpZmZfc2l6ZSwgc2l6ZV90KiBjb25zdCBjaHVua19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBpc19sb3NzbGVzcykgeworICBjb25zdCB1aW50OF90KiBjb25zdCBkYXRhID0gKmRhdGFfcHRyOworICBjb25zdCBpbnQgaXNfdnA4ID0gIW1lbWNtcChkYXRhLCAiVlA4ICIsIFRBR19TSVpFKTsKKyAgY29uc3QgaW50IGlzX3ZwOGwgPSAhbWVtY21wKGRhdGEsICJWUDhMIiwgVEFHX1NJWkUpOworICBjb25zdCB1aW50MzJfdCBtaW5pbWFsX3NpemUgPQorICAgICAgVEFHX1NJWkUgKyBDSFVOS19IRUFERVJfU0laRTsgIC8vICJXRUJQIiArICJWUDggbm5ubiIgT1IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAiV0VCUCIgKyAiVlA4TG5ubm4iCisgIGFzc2VydChkYXRhICE9IE5VTEwpOworICBhc3NlcnQoZGF0YV9zaXplICE9IE5VTEwpOworICBhc3NlcnQoY2h1bmtfc2l6ZSAhPSBOVUxMKTsKKyAgYXNzZXJ0KGlzX2xvc3NsZXNzICE9IE5VTEwpOworCisgIGlmICgqZGF0YV9zaXplIDwgQ0hVTktfSEVBREVSX1NJWkUpIHsKKyAgICByZXR1cm4gVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEE7ICAvLyBJbnN1ZmZpY2llbnQgZGF0YS4KKyAgfQorCisgIGlmIChpc192cDggfHwgaXNfdnA4bCkgeworICAgIC8vIEJpdHN0cmVhbSBjb250YWlucyBWUDgvVlA4TCBoZWFkZXIuCisgICAgY29uc3QgdWludDMyX3Qgc2l6ZSA9IEdldExFMzIoZGF0YSArIFRBR19TSVpFKTsKKyAgICBpZiAoKHJpZmZfc2l6ZSA+PSBtaW5pbWFsX3NpemUpICYmIChzaXplID4gcmlmZl9zaXplIC0gbWluaW1hbF9zaXplKSkgeworICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SOyAgLy8gSW5jb25zaXN0ZW50IHNpemUgaW5mb3JtYXRpb24uCisgICAgfQorICAgIGlmIChoYXZlX2FsbF9kYXRhICYmIChzaXplID4gKmRhdGFfc2l6ZSAtIENIVU5LX0hFQURFUl9TSVpFKSkgeworICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBOyAgLy8gVHJ1bmNhdGVkIGJpdHN0cmVhbS4KKyAgICB9CisgICAgLy8gU2tpcCBvdmVyIENIVU5LX0hFQURFUl9TSVpFIGJ5dGVzIGZyb20gVlA4L1ZQOEwgSGVhZGVyLgorICAgICpjaHVua19zaXplID0gc2l6ZTsKKyAgICAqZGF0YV9wdHIgKz0gQ0hVTktfSEVBREVSX1NJWkU7CisgICAgKmRhdGFfc2l6ZSAtPSBDSFVOS19IRUFERVJfU0laRTsKKyAgICAqaXNfbG9zc2xlc3MgPSBpc192cDhsOworICB9IGVsc2UgeworICAgIC8vIFJhdyBWUDgvVlA4TCBiaXRzdHJlYW0gKG5vIGhlYWRlcikuCisgICAgKmlzX2xvc3NsZXNzID0gVlA4TENoZWNrU2lnbmF0dXJlKGRhdGEsICpkYXRhX3NpemUpOworICAgICpjaHVua19zaXplID0gKmRhdGFfc2l6ZTsKKyAgfQorCisgIHJldHVybiBWUDhfU1RBVFVTX09LOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBGZXRjaCAnKndpZHRoJywgJypoZWlnaHQnLCAnKmhhc19hbHBoYScgYW5kIGZpbGwgb3V0ICdoZWFkZXJzJyBiYXNlZCBvbgorLy8gJ2RhdGEnLiBBbGwgdGhlIG91dHB1dCBwYXJhbWV0ZXJzIG1heSBiZSBOVUxMLiBJZiAnaGVhZGVycycgaXMgTlVMTCBvbmx5IHRoZQorLy8gbWluaW1hbCBhbW91bnQgd2lsbCBiZSByZWFkIHRvIGZldGNoIHRoZSByZW1haW5pbmcgcGFyYW1ldGVycy4KKy8vIElmICdoZWFkZXJzJyBpcyBub24tTlVMTCB0aGlzIGZ1bmN0aW9uIHdpbGwgYXR0ZW1wdCB0byBsb2NhdGUgYm90aCBhbHBoYQorLy8gZGF0YSAod2l0aCBvciB3aXRob3V0IGEgVlA4WCBjaHVuaykgYW5kIHRoZSBiaXRzdHJlYW0gY2h1bmsgKFZQOC9WUDhMKS4KKy8vIE5vdGU6IFRoZSBmb2xsb3dpbmcgY2h1bmsgc2VxdWVuY2VzIChiZWZvcmUgdGhlIHJhdyBWUDgvVlA4TCBkYXRhKSBhcmUKKy8vIGNvbnNpZGVyZWQgdmFsaWQgYnkgdGhpcyBmdW5jdGlvbjoKKy8vIFJJRkYgKyBWUDgoTCkKKy8vIFJJRkYgKyBWUDhYICsgKG9wdGlvbmFsIGNodW5rcykgKyBWUDgoTCkKKy8vIEFMUEggKyBWUDggPC0tIE5vdCBhIHZhbGlkIFdlYlAgZm9ybWF0OiBvbmx5IGFsbG93ZWQgZm9yIGludGVybmFsIHB1cnBvc2UuCisvLyBWUDgoTCkgICAgIDwtLSBOb3QgYSB2YWxpZCBXZWJQIGZvcm1hdDogb25seSBhbGxvd2VkIGZvciBpbnRlcm5hbCBwdXJwb3NlLgorc3RhdGljIFZQOFN0YXR1c0NvZGUgUGFyc2VIZWFkZXJzSW50ZXJuYWwoY29uc3QgdWludDhfdCogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGhhc19hbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgaGFzX2FuaW1hdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUEhlYWRlclN0cnVjdHVyZSogY29uc3QgaGVhZGVycykgeworICBpbnQgY2FudmFzX3dpZHRoID0gMDsKKyAgaW50IGNhbnZhc19oZWlnaHQgPSAwOworICBpbnQgaW1hZ2Vfd2lkdGggPSAwOworICBpbnQgaW1hZ2VfaGVpZ2h0ID0gMDsKKyAgaW50IGZvdW5kX3JpZmYgPSAwOworICBpbnQgZm91bmRfdnA4eCA9IDA7CisgIGludCBhbmltYXRpb25fcHJlc2VudCA9IDA7CisgIGNvbnN0IGludCBoYXZlX2FsbF9kYXRhID0gKGhlYWRlcnMgIT0gTlVMTCkgPyBoZWFkZXJzLT5oYXZlX2FsbF9kYXRhIDogMDsKKworICBWUDhTdGF0dXNDb2RlIHN0YXR1czsKKyAgV2ViUEhlYWRlclN0cnVjdHVyZSBoZHJzOworCisgIGlmIChkYXRhID09IE5VTEwgfHwgZGF0YV9zaXplIDwgUklGRl9IRUFERVJfU0laRSkgeworICAgIHJldHVybiBWUDhfU1RBVFVTX05PVF9FTk9VR0hfREFUQTsKKyAgfQorICBtZW1zZXQoJmhkcnMsIDAsIHNpemVvZihoZHJzKSk7CisgIGhkcnMuZGF0YSA9IGRhdGE7CisgIGhkcnMuZGF0YV9zaXplID0gZGF0YV9zaXplOworCisgIC8vIFNraXAgb3ZlciBSSUZGIGhlYWRlci4KKyAgc3RhdHVzID0gUGFyc2VSSUZGKCZkYXRhLCAmZGF0YV9zaXplLCBoYXZlX2FsbF9kYXRhLCAmaGRycy5yaWZmX3NpemUpOworICBpZiAoc3RhdHVzICE9IFZQOF9TVEFUVVNfT0spIHsKKyAgICByZXR1cm4gc3RhdHVzOyAgIC8vIFdyb25nIFJJRkYgaGVhZGVyIC8gaW5zdWZmaWNpZW50IGRhdGEuCisgIH0KKyAgZm91bmRfcmlmZiA9IChoZHJzLnJpZmZfc2l6ZSA+IDApOworCisgIC8vIFNraXAgb3ZlciBWUDhYLgorICB7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIHN0YXR1cyA9IFBhcnNlVlA4WCgmZGF0YSwgJmRhdGFfc2l6ZSwgJmZvdW5kX3ZwOHgsCisgICAgICAgICAgICAgICAgICAgICAgICZjYW52YXNfd2lkdGgsICZjYW52YXNfaGVpZ2h0LCAmZmxhZ3MpOworICAgIGlmIChzdGF0dXMgIT0gVlA4X1NUQVRVU19PSykgeworICAgICAgcmV0dXJuIHN0YXR1czsgIC8vIFdyb25nIFZQOFggLyBpbnN1ZmZpY2llbnQgZGF0YS4KKyAgICB9CisgICAgYW5pbWF0aW9uX3ByZXNlbnQgPSAhIShmbGFncyAmIEFOSU1BVElPTl9GTEFHKTsKKyAgICBpZiAoIWZvdW5kX3JpZmYgJiYgZm91bmRfdnA4eCkgeworICAgICAgLy8gTm90ZTogVGhpcyByZXN0cmljdGlvbiBtYXkgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLCBpZiBpdCBiZWNvbWVzCisgICAgICAvLyBuZWNlc3NhcnkgdG8gc2VuZCBWUDhYIGNodW5rIHRvIHRoZSBkZWNvZGVyLgorICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SOworICAgIH0KKyAgICBpZiAoaGFzX2FscGhhICE9IE5VTEwpICpoYXNfYWxwaGEgPSAhIShmbGFncyAmIEFMUEhBX0ZMQUcpOworICAgIGlmIChoYXNfYW5pbWF0aW9uICE9IE5VTEwpICpoYXNfYW5pbWF0aW9uID0gYW5pbWF0aW9uX3ByZXNlbnQ7CisgICAgaWYgKGZvcm1hdCAhPSBOVUxMKSAqZm9ybWF0ID0gMDsgICAvLyBkZWZhdWx0ID0gdW5kZWZpbmVkCisKKyAgICBpbWFnZV93aWR0aCA9IGNhbnZhc193aWR0aDsKKyAgICBpbWFnZV9oZWlnaHQgPSBjYW52YXNfaGVpZ2h0OworICAgIGlmIChmb3VuZF92cDh4ICYmIGFuaW1hdGlvbl9wcmVzZW50ICYmIGhlYWRlcnMgPT0gTlVMTCkgeworICAgICAgc3RhdHVzID0gVlA4X1NUQVRVU19PSzsKKyAgICAgIGdvdG8gUmV0dXJuV2lkdGhIZWlnaHQ7ICAvLyBKdXN0IHJldHVybiBmZWF0dXJlcyBmcm9tIFZQOFggaGVhZGVyLgorICAgIH0KKyAgfQorCisgIGlmIChkYXRhX3NpemUgPCBUQUdfU0laRSkgeworICAgIHN0YXR1cyA9IFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBOworICAgIGdvdG8gUmV0dXJuV2lkdGhIZWlnaHQ7CisgIH0KKworICAvLyBTa2lwIG92ZXIgb3B0aW9uYWwgY2h1bmtzIGlmIGRhdGEgc3RhcnRlZCB3aXRoICJSSUZGICsgVlA4WCIgb3IgIkFMUEgiLgorICBpZiAoKGZvdW5kX3JpZmYgJiYgZm91bmRfdnA4eCkgfHwKKyAgICAgICghZm91bmRfcmlmZiAmJiAhZm91bmRfdnA4eCAmJiAhbWVtY21wKGRhdGEsICJBTFBIIiwgVEFHX1NJWkUpKSkgeworICAgIHN0YXR1cyA9IFBhcnNlT3B0aW9uYWxDaHVua3MoJmRhdGEsICZkYXRhX3NpemUsIGhkcnMucmlmZl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhkcnMuYWxwaGFfZGF0YSwgJmhkcnMuYWxwaGFfZGF0YV9zaXplKTsKKyAgICBpZiAoc3RhdHVzICE9IFZQOF9TVEFUVVNfT0spIHsKKyAgICAgIGdvdG8gUmV0dXJuV2lkdGhIZWlnaHQ7ICAvLyBJbnZhbGlkIGNodW5rIHNpemUgLyBpbnN1ZmZpY2llbnQgZGF0YS4KKyAgICB9CisgIH0KKworICAvLyBTa2lwIG92ZXIgVlA4L1ZQOEwgaGVhZGVyLgorICBzdGF0dXMgPSBQYXJzZVZQOEhlYWRlcigmZGF0YSwgJmRhdGFfc2l6ZSwgaGF2ZV9hbGxfZGF0YSwgaGRycy5yaWZmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoZHJzLmNvbXByZXNzZWRfc2l6ZSwgJmhkcnMuaXNfbG9zc2xlc3MpOworICBpZiAoc3RhdHVzICE9IFZQOF9TVEFUVVNfT0spIHsKKyAgICBnb3RvIFJldHVybldpZHRoSGVpZ2h0OyAgLy8gV3JvbmcgVlA4L1ZQOEwgY2h1bmstaGVhZGVyIC8gaW5zdWZmaWNpZW50IGRhdGEuCisgIH0KKyAgaWYgKGhkcnMuY29tcHJlc3NlZF9zaXplID4gTUFYX0NIVU5LX1BBWUxPQUQpIHsKKyAgICByZXR1cm4gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7CisgIH0KKworICBpZiAoZm9ybWF0ICE9IE5VTEwgJiYgIWFuaW1hdGlvbl9wcmVzZW50KSB7CisgICAgKmZvcm1hdCA9IGhkcnMuaXNfbG9zc2xlc3MgPyAyIDogMTsKKyAgfQorCisgIGlmICghaGRycy5pc19sb3NzbGVzcykgeworICAgIGlmIChkYXRhX3NpemUgPCBWUDhfRlJBTUVfSEVBREVSX1NJWkUpIHsKKyAgICAgIHN0YXR1cyA9IFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBOworICAgICAgZ290byBSZXR1cm5XaWR0aEhlaWdodDsKKyAgICB9CisgICAgLy8gVmFsaWRhdGVzIHJhdyBWUDggZGF0YS4KKyAgICBpZiAoIVZQOEdldEluZm8oZGF0YSwgZGF0YV9zaXplLCAodWludDMyX3QpaGRycy5jb21wcmVzc2VkX3NpemUsCisgICAgICAgICAgICAgICAgICAgICZpbWFnZV93aWR0aCwgJmltYWdlX2hlaWdodCkpIHsKKyAgICAgIHJldHVybiBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKGRhdGFfc2l6ZSA8IFZQOExfRlJBTUVfSEVBREVSX1NJWkUpIHsKKyAgICAgIHN0YXR1cyA9IFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBOworICAgICAgZ290byBSZXR1cm5XaWR0aEhlaWdodDsKKyAgICB9CisgICAgLy8gVmFsaWRhdGVzIHJhdyBWUDhMIGRhdGEuCisgICAgaWYgKCFWUDhMR2V0SW5mbyhkYXRhLCBkYXRhX3NpemUsICZpbWFnZV93aWR0aCwgJmltYWdlX2hlaWdodCwgaGFzX2FscGhhKSkgeworICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SOworICAgIH0KKyAgfQorICAvLyBWYWxpZGF0ZXMgaW1hZ2Ugc2l6ZSBjb2hlcmVuY3kuCisgIGlmIChmb3VuZF92cDh4KSB7CisgICAgaWYgKGNhbnZhc193aWR0aCAhPSBpbWFnZV93aWR0aCB8fCBjYW52YXNfaGVpZ2h0ICE9IGltYWdlX2hlaWdodCkgeworICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SOworICAgIH0KKyAgfQorICBpZiAoaGVhZGVycyAhPSBOVUxMKSB7CisgICAgKmhlYWRlcnMgPSBoZHJzOworICAgIGhlYWRlcnMtPm9mZnNldCA9IGRhdGEgLSBoZWFkZXJzLT5kYXRhOworICAgIGFzc2VydCgodWludDY0X3QpKGRhdGEgLSBoZWFkZXJzLT5kYXRhKSA8IE1BWF9DSFVOS19QQVlMT0FEKTsKKyAgICBhc3NlcnQoaGVhZGVycy0+b2Zmc2V0ID09IGhlYWRlcnMtPmRhdGFfc2l6ZSAtIGRhdGFfc2l6ZSk7CisgIH0KKyBSZXR1cm5XaWR0aEhlaWdodDoKKyAgaWYgKHN0YXR1cyA9PSBWUDhfU1RBVFVTX09LIHx8CisgICAgICAoc3RhdHVzID09IFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBICYmIGZvdW5kX3ZwOHggJiYgaGVhZGVycyA9PSBOVUxMKSkgeworICAgIGlmIChoYXNfYWxwaGEgIT0gTlVMTCkgeworICAgICAgLy8gSWYgdGhlIGRhdGEgZGlkIG5vdCBjb250YWluIGEgVlA4WC9WUDhMIGNodW5rIHRoZSBvbmx5IGRlZmluaXRpdmUgd2F5CisgICAgICAvLyB0byBzZXQgdGhpcyBpcyBieSBsb29raW5nIGZvciBhbHBoYSBkYXRhIChmcm9tIGFuIEFMUEggY2h1bmspLgorICAgICAgKmhhc19hbHBoYSB8PSAoaGRycy5hbHBoYV9kYXRhICE9IE5VTEwpOworICAgIH0KKyAgICBpZiAod2lkdGggIT0gTlVMTCkgKndpZHRoID0gaW1hZ2Vfd2lkdGg7CisgICAgaWYgKGhlaWdodCAhPSBOVUxMKSAqaGVpZ2h0ID0gaW1hZ2VfaGVpZ2h0OworICAgIHJldHVybiBWUDhfU1RBVFVTX09LOworICB9IGVsc2UgeworICAgIHJldHVybiBzdGF0dXM7CisgIH0KK30KKworVlA4U3RhdHVzQ29kZSBXZWJQUGFyc2VIZWFkZXJzKFdlYlBIZWFkZXJTdHJ1Y3R1cmUqIGNvbnN0IGhlYWRlcnMpIHsKKyAgLy8gc3RhdHVzIGlzIG1hcmtlZCB2b2xhdGlsZSBhcyBhIHdvcmthcm91bmQgZm9yIGEgY2xhbmctMy44IChhYXJjaDY0KSBidWcKKyAgdm9sYXRpbGUgVlA4U3RhdHVzQ29kZSBzdGF0dXM7CisgIGludCBoYXNfYW5pbWF0aW9uID0gMDsKKyAgYXNzZXJ0KGhlYWRlcnMgIT0gTlVMTCk7CisgIC8vIGZpbGwgb3V0IGhlYWRlcnMsIGlnbm9yZSB3aWR0aC9oZWlnaHQvaGFzX2FscGhhLgorICBzdGF0dXMgPSBQYXJzZUhlYWRlcnNJbnRlcm5hbChoZWFkZXJzLT5kYXRhLCBoZWFkZXJzLT5kYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsICZoYXNfYW5pbWF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBoZWFkZXJzKTsKKyAgaWYgKHN0YXR1cyA9PSBWUDhfU1RBVFVTX09LIHx8IHN0YXR1cyA9PSBWUDhfU1RBVFVTX05PVF9FTk9VR0hfREFUQSkgeworICAgIC8vIFRoZSBXZWJQRGVtdXggQVBJICsgbGlid2VicCBjYW4gYmUgdXNlZCB0byBkZWNvZGUgaW5kaXZpZHVhbAorICAgIC8vIHVuY29tcG9zaXRlZCBmcmFtZXMgb3IgdGhlIFdlYlBBbmltRGVjb2RlciBjYW4gYmUgdXNlZCB0byBmdWxseQorICAgIC8vIHJlY29uc3RydWN0IHRoZW0gKHNlZSB3ZWJwL2RlbXV4LmgpLgorICAgIGlmIChoYXNfYW5pbWF0aW9uKSB7CisgICAgICBzdGF0dXMgPSBWUDhfU1RBVFVTX1VOU1VQUE9SVEVEX0ZFQVRVUkU7CisgICAgfQorICB9CisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBXZWJQRGVjUGFyYW1zCisKK3ZvaWQgV2ViUFJlc2V0RGVjUGFyYW1zKFdlYlBEZWNQYXJhbXMqIGNvbnN0IHBhcmFtcykgeworICBpZiAocGFyYW1zICE9IE5VTEwpIHsKKyAgICBtZW1zZXQocGFyYW1zLCAwLCBzaXplb2YoKnBhcmFtcykpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAiSW50byIgZGVjb2RpbmcgdmFyaWFudHMKKworLy8gTWFpbiBmbG93CitzdGF0aWMgVlA4U3RhdHVzQ29kZSBEZWNvZGVJbnRvKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBEZWNQYXJhbXMqIGNvbnN0IHBhcmFtcykgeworICBWUDhTdGF0dXNDb2RlIHN0YXR1czsKKyAgVlA4SW8gaW87CisgIFdlYlBIZWFkZXJTdHJ1Y3R1cmUgaGVhZGVyczsKKworICBoZWFkZXJzLmRhdGEgPSBkYXRhOworICBoZWFkZXJzLmRhdGFfc2l6ZSA9IGRhdGFfc2l6ZTsKKyAgaGVhZGVycy5oYXZlX2FsbF9kYXRhID0gMTsKKyAgc3RhdHVzID0gV2ViUFBhcnNlSGVhZGVycygmaGVhZGVycyk7ICAgLy8gUHJvY2VzcyBQcmUtVlA4IGNodW5rcy4KKyAgaWYgKHN0YXR1cyAhPSBWUDhfU1RBVFVTX09LKSB7CisgICAgcmV0dXJuIHN0YXR1czsKKyAgfQorCisgIGFzc2VydChwYXJhbXMgIT0gTlVMTCk7CisgIFZQOEluaXRJbygmaW8pOworICBpby5kYXRhID0gaGVhZGVycy5kYXRhICsgaGVhZGVycy5vZmZzZXQ7CisgIGlvLmRhdGFfc2l6ZSA9IGhlYWRlcnMuZGF0YV9zaXplIC0gaGVhZGVycy5vZmZzZXQ7CisgIFdlYlBJbml0Q3VzdG9tSW8ocGFyYW1zLCAmaW8pOyAgLy8gUGx1ZyB0aGUgSS9PIGZ1bmN0aW9ucy4KKworICBpZiAoIWhlYWRlcnMuaXNfbG9zc2xlc3MpIHsKKyAgICBWUDhEZWNvZGVyKiBjb25zdCBkZWMgPSBWUDhOZXcoKTsKKyAgICBpZiAoZGVjID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBWUDhfU1RBVFVTX09VVF9PRl9NRU1PUlk7CisgICAgfQorICAgIGRlYy0+YWxwaGFfZGF0YV8gPSBoZWFkZXJzLmFscGhhX2RhdGE7CisgICAgZGVjLT5hbHBoYV9kYXRhX3NpemVfID0gaGVhZGVycy5hbHBoYV9kYXRhX3NpemU7CisKKyAgICAvLyBEZWNvZGUgYml0c3RyZWFtIGhlYWRlciwgdXBkYXRlIGlvLT53aWR0aC9pby0+aGVpZ2h0LgorICAgIGlmICghVlA4R2V0SGVhZGVycyhkZWMsICZpbykpIHsKKyAgICAgIHN0YXR1cyA9IGRlYy0+c3RhdHVzXzsgICAvLyBBbiBlcnJvciBvY2N1cnJlZC4gR3JhYiBlcnJvciBzdGF0dXMuCisgICAgfSBlbHNlIHsKKyAgICAgIC8vIEFsbG9jYXRlL2NoZWNrIG91dHB1dCBidWZmZXJzLgorICAgICAgc3RhdHVzID0gV2ViUEFsbG9jYXRlRGVjQnVmZmVyKGlvLndpZHRoLCBpby5oZWlnaHQsIHBhcmFtcy0+b3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPm91dHB1dCk7CisgICAgICBpZiAoc3RhdHVzID09IFZQOF9TVEFUVVNfT0spIHsgIC8vIERlY29kZQorICAgICAgICAvLyBUaGlzIGNoYW5nZSBtdXN0IGJlIGRvbmUgYmVmb3JlIGNhbGxpbmcgVlA4RGVjb2RlKCkKKyAgICAgICAgZGVjLT5tdF9tZXRob2RfID0gVlA4R2V0VGhyZWFkTWV0aG9kKHBhcmFtcy0+b3B0aW9ucywgJmhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpby53aWR0aCwgaW8uaGVpZ2h0KTsKKyAgICAgICAgVlA4SW5pdERpdGhlcmluZyhwYXJhbXMtPm9wdGlvbnMsIGRlYyk7CisgICAgICAgIGlmICghVlA4RGVjb2RlKGRlYywgJmlvKSkgeworICAgICAgICAgIHN0YXR1cyA9IGRlYy0+c3RhdHVzXzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBWUDhEZWxldGUoZGVjKTsKKyAgfSBlbHNlIHsKKyAgICBWUDhMRGVjb2RlciogY29uc3QgZGVjID0gVlA4TE5ldygpOworICAgIGlmIChkZWMgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfT1VUX09GX01FTU9SWTsKKyAgICB9CisgICAgaWYgKCFWUDhMRGVjb2RlSGVhZGVyKGRlYywgJmlvKSkgeworICAgICAgc3RhdHVzID0gZGVjLT5zdGF0dXNfOyAgIC8vIEFuIGVycm9yIG9jY3VycmVkLiBHcmFiIGVycm9yIHN0YXR1cy4KKyAgICB9IGVsc2UgeworICAgICAgLy8gQWxsb2NhdGUvY2hlY2sgb3V0cHV0IGJ1ZmZlcnMuCisgICAgICBzdGF0dXMgPSBXZWJQQWxsb2NhdGVEZWNCdWZmZXIoaW8ud2lkdGgsIGlvLmhlaWdodCwgcGFyYW1zLT5vcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy0+b3V0cHV0KTsKKyAgICAgIGlmIChzdGF0dXMgPT0gVlA4X1NUQVRVU19PSykgeyAgLy8gRGVjb2RlCisgICAgICAgIGlmICghVlA4TERlY29kZUltYWdlKGRlYykpIHsKKyAgICAgICAgICBzdGF0dXMgPSBkZWMtPnN0YXR1c187CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgVlA4TERlbGV0ZShkZWMpOworICB9CisKKyAgaWYgKHN0YXR1cyAhPSBWUDhfU1RBVFVTX09LKSB7CisgICAgV2ViUEZyZWVEZWNCdWZmZXIocGFyYW1zLT5vdXRwdXQpOworICB9IGVsc2UgeworICAgIGlmIChwYXJhbXMtPm9wdGlvbnMgIT0gTlVMTCAmJiBwYXJhbXMtPm9wdGlvbnMtPmZsaXApIHsKKyAgICAgIC8vIFRoaXMgcmVzdG9yZXMgdGhlIG9yaWdpbmFsIHN0cmlkZSB2YWx1ZXMgaWYgb3B0aW9ucy0+ZmxpcCB3YXMgdXNlZAorICAgICAgLy8gZHVyaW5nIHRoZSBjYWxsIHRvIFdlYlBBbGxvY2F0ZURlY0J1ZmZlciBhYm92ZS4KKyAgICAgIHN0YXR1cyA9IFdlYlBGbGlwQnVmZmVyKHBhcmFtcy0+b3V0cHV0KTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLy8gSGVscGVycworc3RhdGljIHVpbnQ4X3QqIERlY29kZUludG9SR0JBQnVmZmVyKFdFQlBfQ1NQX01PREUgY29sb3JzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgcmdiYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBzaXplX3Qgc2l6ZSkgeworICBXZWJQRGVjUGFyYW1zIHBhcmFtczsKKyAgV2ViUERlY0J1ZmZlciBidWY7CisgIGlmIChyZ2JhID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBXZWJQSW5pdERlY0J1ZmZlcigmYnVmKTsKKyAgV2ViUFJlc2V0RGVjUGFyYW1zKCZwYXJhbXMpOworICBwYXJhbXMub3V0cHV0ID0gJmJ1ZjsKKyAgYnVmLmNvbG9yc3BhY2UgICAgPSBjb2xvcnNwYWNlOworICBidWYudS5SR0JBLnJnYmEgICA9IHJnYmE7CisgIGJ1Zi51LlJHQkEuc3RyaWRlID0gc3RyaWRlOworICBidWYudS5SR0JBLnNpemUgICA9IHNpemU7CisgIGJ1Zi5pc19leHRlcm5hbF9tZW1vcnkgPSAxOworICBpZiAoRGVjb2RlSW50byhkYXRhLCBkYXRhX3NpemUsICZwYXJhbXMpICE9IFZQOF9TVEFUVVNfT0spIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gcmdiYTsKK30KKwordWludDhfdCogV2ViUERlY29kZVJHQkludG8oY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG91dHB1dCwgc2l6ZV90IHNpemUsIGludCBzdHJpZGUpIHsKKyAgcmV0dXJuIERlY29kZUludG9SR0JBQnVmZmVyKE1PREVfUkdCLCBkYXRhLCBkYXRhX3NpemUsIG91dHB1dCwgc3RyaWRlLCBzaXplKTsKK30KKwordWludDhfdCogV2ViUERlY29kZVJHQkFJbnRvKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3V0cHV0LCBzaXplX3Qgc2l6ZSwgaW50IHN0cmlkZSkgeworICByZXR1cm4gRGVjb2RlSW50b1JHQkFCdWZmZXIoTU9ERV9SR0JBLCBkYXRhLCBkYXRhX3NpemUsIG91dHB1dCwgc3RyaWRlLCBzaXplKTsKK30KKwordWludDhfdCogV2ViUERlY29kZUFSR0JJbnRvKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3V0cHV0LCBzaXplX3Qgc2l6ZSwgaW50IHN0cmlkZSkgeworICByZXR1cm4gRGVjb2RlSW50b1JHQkFCdWZmZXIoTU9ERV9BUkdCLCBkYXRhLCBkYXRhX3NpemUsIG91dHB1dCwgc3RyaWRlLCBzaXplKTsKK30KKwordWludDhfdCogV2ViUERlY29kZUJHUkludG8oY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG91dHB1dCwgc2l6ZV90IHNpemUsIGludCBzdHJpZGUpIHsKKyAgcmV0dXJuIERlY29kZUludG9SR0JBQnVmZmVyKE1PREVfQkdSLCBkYXRhLCBkYXRhX3NpemUsIG91dHB1dCwgc3RyaWRlLCBzaXplKTsKK30KKwordWludDhfdCogV2ViUERlY29kZUJHUkFJbnRvKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3V0cHV0LCBzaXplX3Qgc2l6ZSwgaW50IHN0cmlkZSkgeworICByZXR1cm4gRGVjb2RlSW50b1JHQkFCdWZmZXIoTU9ERV9CR1JBLCBkYXRhLCBkYXRhX3NpemUsIG91dHB1dCwgc3RyaWRlLCBzaXplKTsKK30KKwordWludDhfdCogV2ViUERlY29kZVlVVkludG8oY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGx1bWEsIHNpemVfdCBsdW1hX3NpemUsIGludCBsdW1hX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHUsIHNpemVfdCB1X3NpemUsIGludCB1X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHYsIHNpemVfdCB2X3NpemUsIGludCB2X3N0cmlkZSkgeworICBXZWJQRGVjUGFyYW1zIHBhcmFtczsKKyAgV2ViUERlY0J1ZmZlciBvdXRwdXQ7CisgIGlmIChsdW1hID09IE5VTEwpIHJldHVybiBOVUxMOworICBXZWJQSW5pdERlY0J1ZmZlcigmb3V0cHV0KTsKKyAgV2ViUFJlc2V0RGVjUGFyYW1zKCZwYXJhbXMpOworICBwYXJhbXMub3V0cHV0ID0gJm91dHB1dDsKKyAgb3V0cHV0LmNvbG9yc3BhY2UgICAgICA9IE1PREVfWVVWOworICBvdXRwdXQudS5ZVVZBLnkgICAgICAgID0gbHVtYTsKKyAgb3V0cHV0LnUuWVVWQS55X3N0cmlkZSA9IGx1bWFfc3RyaWRlOworICBvdXRwdXQudS5ZVVZBLnlfc2l6ZSAgID0gbHVtYV9zaXplOworICBvdXRwdXQudS5ZVVZBLnUgICAgICAgID0gdTsKKyAgb3V0cHV0LnUuWVVWQS51X3N0cmlkZSA9IHVfc3RyaWRlOworICBvdXRwdXQudS5ZVVZBLnVfc2l6ZSAgID0gdV9zaXplOworICBvdXRwdXQudS5ZVVZBLnYgICAgICAgID0gdjsKKyAgb3V0cHV0LnUuWVVWQS52X3N0cmlkZSA9IHZfc3RyaWRlOworICBvdXRwdXQudS5ZVVZBLnZfc2l6ZSAgID0gdl9zaXplOworICBvdXRwdXQuaXNfZXh0ZXJuYWxfbWVtb3J5ID0gMTsKKyAgaWYgKERlY29kZUludG8oZGF0YSwgZGF0YV9zaXplLCAmcGFyYW1zKSAhPSBWUDhfU1RBVFVTX09LKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIGx1bWE7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB1aW50OF90KiBEZWNvZGUoV0VCUF9DU1BfTU9ERSBtb2RlLCBjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZGF0YV9zaXplLCBpbnQqIGNvbnN0IHdpZHRoLCBpbnQqIGNvbnN0IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgV2ViUERlY0J1ZmZlciogY29uc3Qga2VlcF9pbmZvKSB7CisgIFdlYlBEZWNQYXJhbXMgcGFyYW1zOworICBXZWJQRGVjQnVmZmVyIG91dHB1dDsKKworICBXZWJQSW5pdERlY0J1ZmZlcigmb3V0cHV0KTsKKyAgV2ViUFJlc2V0RGVjUGFyYW1zKCZwYXJhbXMpOworICBwYXJhbXMub3V0cHV0ID0gJm91dHB1dDsKKyAgb3V0cHV0LmNvbG9yc3BhY2UgPSBtb2RlOworCisgIC8vIFJldHJpZXZlIChhbmQgcmVwb3J0IGJhY2spIHRoZSByZXF1aXJlZCBkaW1lbnNpb25zIGZyb20gYml0c3RyZWFtLgorICBpZiAoIVdlYlBHZXRJbmZvKGRhdGEsIGRhdGFfc2l6ZSwgJm91dHB1dC53aWR0aCwgJm91dHB1dC5oZWlnaHQpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHdpZHRoICE9IE5VTEwpICp3aWR0aCA9IG91dHB1dC53aWR0aDsKKyAgaWYgKGhlaWdodCAhPSBOVUxMKSAqaGVpZ2h0ID0gb3V0cHV0LmhlaWdodDsKKworICAvLyBEZWNvZGUKKyAgaWYgKERlY29kZUludG8oZGF0YSwgZGF0YV9zaXplLCAmcGFyYW1zKSAhPSBWUDhfU1RBVFVTX09LKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKGtlZXBfaW5mbyAhPSBOVUxMKSB7ICAgIC8vIGtlZXAgdHJhY2sgb2YgdGhlIHNpZGUtaW5mbworICAgIFdlYlBDb3B5RGVjQnVmZmVyKCZvdXRwdXQsIGtlZXBfaW5mbyk7CisgIH0KKyAgLy8gcmV0dXJuIGRlY29kZWQgc2FtcGxlcyAoZG9uJ3QgY2xlYXIgJ291dHB1dCchKQorICByZXR1cm4gV2ViUElzUkdCTW9kZShtb2RlKSA/IG91dHB1dC51LlJHQkEucmdiYSA6IG91dHB1dC51LllVVkEueTsKK30KKwordWludDhfdCogV2ViUERlY29kZVJHQihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCkgeworICByZXR1cm4gRGVjb2RlKE1PREVfUkdCLCBkYXRhLCBkYXRhX3NpemUsIHdpZHRoLCBoZWlnaHQsIE5VTEwpOworfQorCit1aW50OF90KiBXZWJQRGVjb2RlUkdCQShjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQpIHsKKyAgcmV0dXJuIERlY29kZShNT0RFX1JHQkEsIGRhdGEsIGRhdGFfc2l6ZSwgd2lkdGgsIGhlaWdodCwgTlVMTCk7Cit9CisKK3VpbnQ4X3QqIFdlYlBEZWNvZGVBUkdCKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCkgeworICByZXR1cm4gRGVjb2RlKE1PREVfQVJHQiwgZGF0YSwgZGF0YV9zaXplLCB3aWR0aCwgaGVpZ2h0LCBOVUxMKTsKK30KKwordWludDhfdCogV2ViUERlY29kZUJHUihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCkgeworICByZXR1cm4gRGVjb2RlKE1PREVfQkdSLCBkYXRhLCBkYXRhX3NpemUsIHdpZHRoLCBoZWlnaHQsIE5VTEwpOworfQorCit1aW50OF90KiBXZWJQRGVjb2RlQkdSQShjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQpIHsKKyAgcmV0dXJuIERlY29kZShNT0RFX0JHUkEsIGRhdGEsIGRhdGFfc2l6ZSwgd2lkdGgsIGhlaWdodCwgTlVMTCk7Cit9CisKK3VpbnQ4X3QqIFdlYlBEZWNvZGVZVVYoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQsIHVpbnQ4X3QqKiB1LCB1aW50OF90KiogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50KiBzdHJpZGUsIGludCogdXZfc3RyaWRlKSB7CisgIFdlYlBEZWNCdWZmZXIgb3V0cHV0OyAgIC8vIG9ubHkgdG8gcHJlc2VydmUgdGhlIHNpZGUtaW5mb3MKKyAgdWludDhfdCogY29uc3Qgb3V0ID0gRGVjb2RlKE1PREVfWVVWLCBkYXRhLCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCAmb3V0cHV0KTsKKworICBpZiAob3V0ICE9IE5VTEwpIHsKKyAgICBjb25zdCBXZWJQWVVWQUJ1ZmZlciogY29uc3QgYnVmID0gJm91dHB1dC51LllVVkE7CisgICAgKnUgPSBidWYtPnU7CisgICAgKnYgPSBidWYtPnY7CisgICAgKnN0cmlkZSA9IGJ1Zi0+eV9zdHJpZGU7CisgICAgKnV2X3N0cmlkZSA9IGJ1Zi0+dV9zdHJpZGU7CisgICAgYXNzZXJ0KGJ1Zi0+dV9zdHJpZGUgPT0gYnVmLT52X3N0cmlkZSk7CisgIH0KKyAgcmV0dXJuIG91dDsKK30KKworc3RhdGljIHZvaWQgRGVmYXVsdEZlYXR1cmVzKFdlYlBCaXRzdHJlYW1GZWF0dXJlcyogY29uc3QgZmVhdHVyZXMpIHsKKyAgYXNzZXJ0KGZlYXR1cmVzICE9IE5VTEwpOworICBtZW1zZXQoZmVhdHVyZXMsIDAsIHNpemVvZigqZmVhdHVyZXMpKTsKK30KKworc3RhdGljIFZQOFN0YXR1c0NvZGUgR2V0RmVhdHVyZXMoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBCaXRzdHJlYW1GZWF0dXJlcyogY29uc3QgZmVhdHVyZXMpIHsKKyAgaWYgKGZlYXR1cmVzID09IE5VTEwgfHwgZGF0YSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIFZQOF9TVEFUVVNfSU5WQUxJRF9QQVJBTTsKKyAgfQorICBEZWZhdWx0RmVhdHVyZXMoZmVhdHVyZXMpOworCisgIC8vIE9ubHkgcGFyc2UgZW5vdWdoIG9mIHRoZSBkYXRhIHRvIHJldHJpZXZlIHRoZSBmZWF0dXJlcy4KKyAgcmV0dXJuIFBhcnNlSGVhZGVyc0ludGVybmFsKGRhdGEsIGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmZWF0dXJlcy0+d2lkdGgsICZmZWF0dXJlcy0+aGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZlYXR1cmVzLT5oYXNfYWxwaGEsICZmZWF0dXJlcy0+aGFzX2FuaW1hdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmZWF0dXJlcy0+Zm9ybWF0LCBOVUxMKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFdlYlBHZXRJbmZvKCkKKworaW50IFdlYlBHZXRJbmZvKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQpIHsKKyAgV2ViUEJpdHN0cmVhbUZlYXR1cmVzIGZlYXR1cmVzOworCisgIGlmIChHZXRGZWF0dXJlcyhkYXRhLCBkYXRhX3NpemUsICZmZWF0dXJlcykgIT0gVlA4X1NUQVRVU19PSykgeworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKHdpZHRoICE9IE5VTEwpIHsKKyAgICAqd2lkdGggID0gZmVhdHVyZXMud2lkdGg7CisgIH0KKyAgaWYgKGhlaWdodCAhPSBOVUxMKSB7CisgICAgKmhlaWdodCA9IGZlYXR1cmVzLmhlaWdodDsKKyAgfQorCisgIHJldHVybiAxOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQWR2YW5jZSBkZWNvZGluZyBBUEkKKworaW50IFdlYlBJbml0RGVjb2RlckNvbmZpZ0ludGVybmFsKFdlYlBEZWNvZGVyQ29uZmlnKiBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZlcnNpb24pIHsKKyAgaWYgKFdFQlBfQUJJX0lTX0lOQ09NUEFUSUJMRSh2ZXJzaW9uLCBXRUJQX0RFQ09ERVJfQUJJX1ZFUlNJT04pKSB7CisgICAgcmV0dXJuIDA7ICAgLy8gdmVyc2lvbiBtaXNtYXRjaAorICB9CisgIGlmIChjb25maWcgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisgIG1lbXNldChjb25maWcsIDAsIHNpemVvZigqY29uZmlnKSk7CisgIERlZmF1bHRGZWF0dXJlcygmY29uZmlnLT5pbnB1dCk7CisgIFdlYlBJbml0RGVjQnVmZmVyKCZjb25maWctPm91dHB1dCk7CisgIHJldHVybiAxOworfQorCitWUDhTdGF0dXNDb2RlIFdlYlBHZXRGZWF0dXJlc0ludGVybmFsKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBCaXRzdHJlYW1GZWF0dXJlcyogZmVhdHVyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2ZXJzaW9uKSB7CisgIGlmIChXRUJQX0FCSV9JU19JTkNPTVBBVElCTEUodmVyc2lvbiwgV0VCUF9ERUNPREVSX0FCSV9WRVJTSU9OKSkgeworICAgIHJldHVybiBWUDhfU1RBVFVTX0lOVkFMSURfUEFSQU07ICAgLy8gdmVyc2lvbiBtaXNtYXRjaAorICB9CisgIGlmIChmZWF0dXJlcyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIFZQOF9TVEFUVVNfSU5WQUxJRF9QQVJBTTsKKyAgfQorICByZXR1cm4gR2V0RmVhdHVyZXMoZGF0YSwgZGF0YV9zaXplLCBmZWF0dXJlcyk7Cit9CisKK1ZQOFN0YXR1c0NvZGUgV2ViUERlY29kZShjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBEZWNvZGVyQ29uZmlnKiBjb25maWcpIHsKKyAgV2ViUERlY1BhcmFtcyBwYXJhbXM7CisgIFZQOFN0YXR1c0NvZGUgc3RhdHVzOworCisgIGlmIChjb25maWcgPT0gTlVMTCkgeworICAgIHJldHVybiBWUDhfU1RBVFVTX0lOVkFMSURfUEFSQU07CisgIH0KKworICBzdGF0dXMgPSBHZXRGZWF0dXJlcyhkYXRhLCBkYXRhX3NpemUsICZjb25maWctPmlucHV0KTsKKyAgaWYgKHN0YXR1cyAhPSBWUDhfU1RBVFVTX09LKSB7CisgICAgaWYgKHN0YXR1cyA9PSBWUDhfU1RBVFVTX05PVF9FTk9VR0hfREFUQSkgeworICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SOyAgLy8gTm90LWVub3VnaC1kYXRhIHRyZWF0ZWQgYXMgZXJyb3IuCisgICAgfQorICAgIHJldHVybiBzdGF0dXM7CisgIH0KKworICBXZWJQUmVzZXREZWNQYXJhbXMoJnBhcmFtcyk7CisgIHBhcmFtcy5vcHRpb25zID0gJmNvbmZpZy0+b3B0aW9uczsKKyAgcGFyYW1zLm91dHB1dCA9ICZjb25maWctPm91dHB1dDsKKyAgaWYgKFdlYlBBdm9pZFNsb3dNZW1vcnkocGFyYW1zLm91dHB1dCwgJmNvbmZpZy0+aW5wdXQpKSB7CisgICAgLy8gZGVjb2RpbmcgdG8gc2xvdyBtZW1vcnk6IHVzZSBhIHRlbXBvcmFyeSBpbi1tZW0gYnVmZmVyIHRvIGRlY29kZSBpbnRvLgorICAgIFdlYlBEZWNCdWZmZXIgaW5fbWVtX2J1ZmZlcjsKKyAgICBXZWJQSW5pdERlY0J1ZmZlcigmaW5fbWVtX2J1ZmZlcik7CisgICAgaW5fbWVtX2J1ZmZlci5jb2xvcnNwYWNlID0gY29uZmlnLT5vdXRwdXQuY29sb3JzcGFjZTsKKyAgICBpbl9tZW1fYnVmZmVyLndpZHRoID0gY29uZmlnLT5pbnB1dC53aWR0aDsKKyAgICBpbl9tZW1fYnVmZmVyLmhlaWdodCA9IGNvbmZpZy0+aW5wdXQuaGVpZ2h0OworICAgIHBhcmFtcy5vdXRwdXQgPSAmaW5fbWVtX2J1ZmZlcjsKKyAgICBzdGF0dXMgPSBEZWNvZGVJbnRvKGRhdGEsIGRhdGFfc2l6ZSwgJnBhcmFtcyk7CisgICAgaWYgKHN0YXR1cyA9PSBWUDhfU1RBVFVTX09LKSB7ICAvLyBkbyB0aGUgc2xvdy1jb3B5CisgICAgICBzdGF0dXMgPSBXZWJQQ29weURlY0J1ZmZlclBpeGVscygmaW5fbWVtX2J1ZmZlciwgJmNvbmZpZy0+b3V0cHV0KTsKKyAgICB9CisgICAgV2ViUEZyZWVEZWNCdWZmZXIoJmluX21lbV9idWZmZXIpOworICB9IGVsc2UgeworICAgIHN0YXR1cyA9IERlY29kZUludG8oZGF0YSwgZGF0YV9zaXplLCAmcGFyYW1zKTsKKyAgfQorCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDcm9wcGluZyBhbmQgcmVzY2FsaW5nLgorCitpbnQgV2ViUElvSW5pdEZyb21PcHRpb25zKGNvbnN0IFdlYlBEZWNvZGVyT3B0aW9ucyogY29uc3Qgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4SW8qIGNvbnN0IGlvLCBXRUJQX0NTUF9NT0RFIHNyY19jb2xvcnNwYWNlKSB7CisgIGNvbnN0IGludCBXID0gaW8tPndpZHRoOworICBjb25zdCBpbnQgSCA9IGlvLT5oZWlnaHQ7CisgIGludCB4ID0gMCwgeSA9IDAsIHcgPSBXLCBoID0gSDsKKworICAvLyBDcm9wcGluZworICBpby0+dXNlX2Nyb3BwaW5nID0gKG9wdGlvbnMgIT0gTlVMTCkgJiYgKG9wdGlvbnMtPnVzZV9jcm9wcGluZyA+IDApOworICBpZiAoaW8tPnVzZV9jcm9wcGluZykgeworICAgIHcgPSBvcHRpb25zLT5jcm9wX3dpZHRoOworICAgIGggPSBvcHRpb25zLT5jcm9wX2hlaWdodDsKKyAgICB4ID0gb3B0aW9ucy0+Y3JvcF9sZWZ0OworICAgIHkgPSBvcHRpb25zLT5jcm9wX3RvcDsKKyAgICBpZiAoIVdlYlBJc1JHQk1vZGUoc3JjX2NvbG9yc3BhY2UpKSB7ICAgLy8gb25seSBzbmFwIGZvciBZVVY0MjAKKyAgICAgIHggJj0gfjE7CisgICAgICB5ICY9IH4xOworICAgIH0KKyAgICBpZiAoeCA8IDAgfHwgeSA8IDAgfHwgdyA8PSAwIHx8IGggPD0gMCB8fCB4ICsgdyA+IFcgfHwgeSArIGggPiBIKSB7CisgICAgICByZXR1cm4gMDsgIC8vIG91dCBvZiBmcmFtZSBib3VuZGFyeSBlcnJvcgorICAgIH0KKyAgfQorICBpby0+Y3JvcF9sZWZ0ICAgPSB4OworICBpby0+Y3JvcF90b3AgICAgPSB5OworICBpby0+Y3JvcF9yaWdodCAgPSB4ICsgdzsKKyAgaW8tPmNyb3BfYm90dG9tID0geSArIGg7CisgIGlvLT5tYl93ID0gdzsKKyAgaW8tPm1iX2ggPSBoOworCisgIC8vIFNjYWxpbmcKKyAgaW8tPnVzZV9zY2FsaW5nID0gKG9wdGlvbnMgIT0gTlVMTCkgJiYgKG9wdGlvbnMtPnVzZV9zY2FsaW5nID4gMCk7CisgIGlmIChpby0+dXNlX3NjYWxpbmcpIHsKKyAgICBpbnQgc2NhbGVkX3dpZHRoID0gb3B0aW9ucy0+c2NhbGVkX3dpZHRoOworICAgIGludCBzY2FsZWRfaGVpZ2h0ID0gb3B0aW9ucy0+c2NhbGVkX2hlaWdodDsKKyAgICBpZiAoIVdlYlBSZXNjYWxlckdldFNjYWxlZERpbWVuc2lvbnModywgaCwgJnNjYWxlZF93aWR0aCwgJnNjYWxlZF9oZWlnaHQpKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaW8tPnNjYWxlZF93aWR0aCA9IHNjYWxlZF93aWR0aDsKKyAgICBpby0+c2NhbGVkX2hlaWdodCA9IHNjYWxlZF9oZWlnaHQ7CisgIH0KKworICAvLyBGaWx0ZXIKKyAgaW8tPmJ5cGFzc19maWx0ZXJpbmcgPSAob3B0aW9ucyAhPSBOVUxMKSAmJiBvcHRpb25zLT5ieXBhc3NfZmlsdGVyaW5nOworCisgIC8vIEZhbmN5IHVwc2FtcGxlcgorI2lmZGVmIEZBTkNZX1VQU0FNUExJTkcKKyAgaW8tPmZhbmN5X3Vwc2FtcGxpbmcgPSAob3B0aW9ucyA9PSBOVUxMKSB8fCAoIW9wdGlvbnMtPm5vX2ZhbmN5X3Vwc2FtcGxpbmcpOworI2VuZGlmCisKKyAgaWYgKGlvLT51c2Vfc2NhbGluZykgeworICAgIC8vIGRpc2FibGUgZmlsdGVyIChvbmx5IGZvciBsYXJnZSBkb3duc2NhbGluZyByYXRpbykuCisgICAgaW8tPmJ5cGFzc19maWx0ZXJpbmcgPSAoaW8tPnNjYWxlZF93aWR0aCA8IFcgKiAzIC8gNCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChpby0+c2NhbGVkX2hlaWdodCA8IEggKiAzIC8gNCk7CisgICAgaW8tPmZhbmN5X3Vwc2FtcGxpbmcgPSAwOworICB9CisgIHJldHVybiAxOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlYy93ZWJwaV9kZWMuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvd2VicGlfZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM3OGJhNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvd2VicGlfZGVjLmgKQEAgLTAsMCArMSwxMzMgQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBJbnRlcm5hbCBoZWFkZXI6IFdlYlAgZGVjb2RpbmcgcGFyYW1ldGVycyBhbmQgY3VzdG9tIElPIG9uIGJ1ZmZlcgorLy8KKy8vIEF1dGhvcjogc29tbmF0aEBnb29nbGUuY29tIChTb21uYXRoIEJhbmVyamVlKQorCisjaWZuZGVmIFdFQlBfREVDX1dFQlBJX0RFQ19IXworI2RlZmluZSBXRUJQX0RFQ19XRUJQSV9ERUNfSF8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaW5jbHVkZSAic3JjL3V0aWxzL3Jlc2NhbGVyX3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL2RlYy92cDhfZGVjLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBXZWJQRGVjUGFyYW1zOiBEZWNvZGluZyBvdXRwdXQgcGFyYW1ldGVycy4gVHJhbnNpZW50IGludGVybmFsIG9iamVjdC4KKwordHlwZWRlZiBzdHJ1Y3QgV2ViUERlY1BhcmFtcyBXZWJQRGVjUGFyYW1zOwordHlwZWRlZiBpbnQgKCpPdXRwdXRGdW5jKShjb25zdCBWUDhJbyogY29uc3QgaW8sIFdlYlBEZWNQYXJhbXMqIGNvbnN0IHApOwordHlwZWRlZiBpbnQgKCpPdXRwdXRBbHBoYUZ1bmMpKGNvbnN0IFZQOElvKiBjb25zdCBpbywgV2ViUERlY1BhcmFtcyogY29uc3QgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXhwZWN0ZWRfbnVtX291dF9saW5lcyk7Cit0eXBlZGVmIGludCAoKk91dHB1dFJvd0Z1bmMpKFdlYlBEZWNQYXJhbXMqIGNvbnN0IHAsIGludCB5X3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heF9vdXRfbGluZXMpOworCitzdHJ1Y3QgV2ViUERlY1BhcmFtcyB7CisgIFdlYlBEZWNCdWZmZXIqIG91dHB1dDsgICAgICAgICAgICAgLy8gb3V0cHV0IGJ1ZmZlci4KKyAgdWludDhfdCogdG1wX3ksICp0bXBfdSwgKnRtcF92OyAgICAvLyBjYWNoZSBmb3IgdGhlIGZhbmN5IHVwc2FtcGxlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIHVzZWQgZm9yIHRtcCByZXNjYWxpbmcKKworICBpbnQgbGFzdF95OyAgICAgICAgICAgICAgICAgLy8gY29vcmRpbmF0ZSBvZiB0aGUgbGluZSB0aGF0IHdhcyBsYXN0IG91dHB1dAorICBjb25zdCBXZWJQRGVjb2Rlck9wdGlvbnMqIG9wdGlvbnM7ICAvLyBpZiBub3QgTlVMTCwgdXNlIGFsdCBkZWNvZGluZyBmZWF0dXJlcworCisgIFdlYlBSZXNjYWxlciogc2NhbGVyX3ksICpzY2FsZXJfdSwgKnNjYWxlcl92LCAqc2NhbGVyX2E7ICAvLyByZXNjYWxlcnMKKyAgdm9pZCogbWVtb3J5OyAgICAgICAgICAgICAgICAgIC8vIG92ZXJhbGwgc2NyYXRjaCBtZW1vcnkgZm9yIHRoZSBvdXRwdXQgd29yay4KKworICBPdXRwdXRGdW5jIGVtaXQ7ICAgICAgICAgICAgICAgLy8gb3V0cHV0IFJHQiBvciBZVVYgc2FtcGxlcworICBPdXRwdXRBbHBoYUZ1bmMgZW1pdF9hbHBoYTsgICAgLy8gb3V0cHV0IGFscGhhIGNoYW5uZWwKKyAgT3V0cHV0Um93RnVuYyBlbWl0X2FscGhhX3JvdzsgIC8vIG91dHB1dCBvbmUgbGluZSBvZiByZXNjYWxlZCBhbHBoYSB2YWx1ZXMKK307CisKKy8vIFNob3VsZCBiZSBjYWxsZWQgZmlyc3QsIGJlZm9yZSBhbnkgdXNlIG9mIHRoZSBXZWJQRGVjUGFyYW1zIG9iamVjdC4KK3ZvaWQgV2ViUFJlc2V0RGVjUGFyYW1zKFdlYlBEZWNQYXJhbXMqIGNvbnN0IHBhcmFtcyk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIZWFkZXIgcGFyc2luZyBoZWxwZXJzCisKKy8vIFN0cnVjdHVyZSBzdG9yaW5nIGEgZGVzY3JpcHRpb24gb2YgdGhlIFJJRkYgaGVhZGVycy4KK3R5cGVkZWYgc3RydWN0IHsKKyAgY29uc3QgdWludDhfdCogZGF0YTsgICAgICAgICAvLyBpbnB1dCBidWZmZXIKKyAgc2l6ZV90IGRhdGFfc2l6ZTsgICAgICAgICAgICAvLyBpbnB1dCBidWZmZXIgc2l6ZQorICBpbnQgaGF2ZV9hbGxfZGF0YTsgICAgICAgICAgIC8vIHRydWUgaWYgYWxsIGRhdGEgaXMga25vd24gdG8gYmUgYXZhaWxhYmxlCisgIHNpemVfdCBvZmZzZXQ7ICAgICAgICAgICAgICAgLy8gb2Zmc2V0IHRvIG1haW4gZGF0YSBjaHVuayAoVlA4IG9yIFZQOEwpCisgIGNvbnN0IHVpbnQ4X3QqIGFscGhhX2RhdGE7ICAgLy8gcG9pbnRzIHRvIGFscGhhIGNodW5rIChpZiBwcmVzZW50KQorICBzaXplX3QgYWxwaGFfZGF0YV9zaXplOyAgICAgIC8vIGFscGhhIGNodW5rIHNpemUKKyAgc2l6ZV90IGNvbXByZXNzZWRfc2l6ZTsgICAgICAvLyBWUDgvVlA4TCBjb21wcmVzc2VkIGRhdGEgc2l6ZQorICBzaXplX3QgcmlmZl9zaXplOyAgICAgICAgICAgIC8vIHNpemUgb2YgdGhlIHJpZmYgcGF5bG9hZCAob3IgMCBpZiBhYnNlbnQpCisgIGludCBpc19sb3NzbGVzczsgICAgICAgICAgICAgLy8gdHJ1ZSBpZiBhIFZQOEwgY2h1bmsgaXMgcHJlc2VudAorfSBXZWJQSGVhZGVyU3RydWN0dXJlOworCisvLyBTa2lwcyBvdmVyIGFsbCB2YWxpZCBjaHVua3MgcHJpb3IgdG8gdGhlIGZpcnN0IFZQOC9WUDhMIGZyYW1lIGhlYWRlci4KKy8vIFJldHVybnM6IFZQOF9TVEFUVVNfT0ssIFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SIChpbnZhbGlkIGhlYWRlci9jaHVuayksCisvLyBWUDhfU1RBVFVTX05PVF9FTk9VR0hfREFUQSAocGFydGlhbCBpbnB1dCkgb3IgVlA4X1NUQVRVU19VTlNVUFBPUlRFRF9GRUFUVVJFCisvLyBpbiB0aGUgY2FzZSBvZiBub24tZGVjb2RhYmxlIGZlYXR1cmVzIChhbmltYXRpb24gZm9yIGluc3RhbmNlKS4KKy8vIEluICdoZWFkZXJzJywgY29tcHJlc3NlZF9zaXplLCBvZmZzZXQsIGFscGhhX2RhdGEsIGFscGhhX3NpemUsIGFuZCBsb3NzbGVzcworLy8gZmllbGRzIGFyZSB1cGRhdGVkIGFwcHJvcHJpYXRlbHkgdXBvbiBzdWNjZXNzLgorVlA4U3RhdHVzQ29kZSBXZWJQUGFyc2VIZWFkZXJzKFdlYlBIZWFkZXJTdHJ1Y3R1cmUqIGNvbnN0IGhlYWRlcnMpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWlzYyB1dGlscworCisvLyBJbml0aWFsaXplcyBWUDhJbyB3aXRoIGN1c3RvbSBzZXR1cCwgaW8gYW5kIHRlYXJkb3duIGZ1bmN0aW9ucy4gVGhlIGRlZmF1bHQKKy8vIGhvb2tzIHdpbGwgdXNlIHRoZSBzdXBwbGllZCAncGFyYW1zJyBhcyBpby0+b3BhcXVlIGhhbmRsZS4KK3ZvaWQgV2ViUEluaXRDdXN0b21JbyhXZWJQRGVjUGFyYW1zKiBjb25zdCBwYXJhbXMsIFZQOElvKiBjb25zdCBpbyk7CisKKy8vIFNldHVwIGNyb3BfeHh4IGZpZWxkcywgbWJfdyBhbmQgbWJfaCBpbiBpby4gJ3NyY19jb2xvcnNwYWNlJyByZWZlcnMKKy8vIHRvIHRoZSAqY29tcHJlc3NlZCogZm9ybWF0LCBub3QgdGhlIG91dHB1dCBvbmUuCitpbnQgV2ViUElvSW5pdEZyb21PcHRpb25zKGNvbnN0IFdlYlBEZWNvZGVyT3B0aW9ucyogY29uc3Qgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4SW8qIGNvbnN0IGlvLCBXRUJQX0NTUF9NT0RFIHNyY19jb2xvcnNwYWNlKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEludGVybmFsIGZ1bmN0aW9ucyByZWdhcmRpbmcgV2ViUERlY0J1ZmZlciBtZW1vcnkgKGluIGJ1ZmZlci5jKS4KKy8vIERvbid0IHJlYWxseSBuZWVkIHRvIGJlIGV4dGVybmFsbHkgdmlzaWJsZSBmb3Igbm93LgorCisvLyBQcmVwYXJlICdidWZmZXInIHdpdGggdGhlIHJlcXVlc3RlZCBpbml0aWFsIGRpbWVuc2lvbnMgd2lkdGgvaGVpZ2h0LgorLy8gSWYgbm8gZXh0ZXJuYWwgc3RvcmFnZSBpcyBzdXBwbGllZCwgaW5pdGlhbGl6ZXMgYnVmZmVyIGJ5IGFsbG9jYXRpbmcgb3V0cHV0CisvLyBtZW1vcnkgYW5kIHNldHRpbmcgdXAgdGhlIHN0cmlkZSBpbmZvcm1hdGlvbi4gVmFsaWRhdGUgdGhlIHBhcmFtZXRlcnMuIFJldHVybgorLy8gYW4gZXJyb3IgY29kZSBpbiBjYXNlIG9mIHByb2JsZW0gKG5vIG1lbW9yeSwgb3IgaW52YWxpZCBzdHJpZGUgLyBzaXplIC8KKy8vIGRpbWVuc2lvbiAvIGV0Yy4pLiBJZiAqb3B0aW9ucyBpcyBub3QgTlVMTCwgYWxzbyB2ZXJpZnkgdGhhdCB0aGUgb3B0aW9ucycKKy8vIHBhcmFtZXRlcnMgYXJlIHZhbGlkIGFuZCBhcHBseSB0aGVtIHRvIHRoZSB3aWR0aC9oZWlnaHQgZGltZW5zaW9ucyBvZiB0aGUKKy8vIG91dHB1dCBidWZmZXIuIFRoaXMgdGFrZXMgY3JvcHBpbmcgLyBzY2FsaW5nIC8gcm90YXRpb24gaW50byBhY2NvdW50LgorLy8gQWxzbyBpbmNvcnBvcmF0ZXMgdGhlIG9wdGlvbnMtPmZsaXAgZmxhZyB0byBmbGlwIHRoZSBidWZmZXIgcGFyYW1ldGVycyBpZgorLy8gbmVlZGVkLgorVlA4U3RhdHVzQ29kZSBXZWJQQWxsb2NhdGVEZWNCdWZmZXIoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUERlY29kZXJPcHRpb25zKiBjb25zdCBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUERlY0J1ZmZlciogY29uc3QgYnVmZmVyKTsKKworLy8gRmxpcCBidWZmZXIgdmVydGljYWxseSBieSBuZWdhdGluZyB0aGUgdmFyaW91cyBzdHJpZGVzLgorVlA4U3RhdHVzQ29kZSBXZWJQRmxpcEJ1ZmZlcihXZWJQRGVjQnVmZmVyKiBjb25zdCBidWZmZXIpOworCisvLyBDb3B5ICdzcmMnIGludG8gJ2RzdCcgYnVmZmVyLCBtYWtpbmcgc3VyZSAnZHN0JyBpcyBub3QgbWFya2VkIGFzIG93bmVyIG9mIHRoZQorLy8gbWVtb3J5IChzdGlsbCBoZWxkIGJ5ICdzcmMnKS4gTm8gcGl4ZWxzIGFyZSBjb3BpZWQuCit2b2lkIFdlYlBDb3B5RGVjQnVmZmVyKGNvbnN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgV2ViUERlY0J1ZmZlciogY29uc3QgZHN0KTsKKworLy8gQ29weSBhbmQgdHJhbnNmZXIgb3duZXJzaGlwIGZyb20gc3JjIHRvIGRzdCAoYmV3YXJlIG9mIHBhcmFtZXRlciBvcmRlciEpCit2b2lkIFdlYlBHcmFiRGVjQnVmZmVyKFdlYlBEZWNCdWZmZXIqIGNvbnN0IHNyYywgV2ViUERlY0J1ZmZlciogY29uc3QgZHN0KTsKKworLy8gQ29weSBwaXhlbHMgZnJvbSAnc3JjJyBpbnRvIGEgKnByZWFsbG9jYXRlZCogJ2RzdCcgYnVmZmVyLiBSZXR1cm5zCisvLyBWUDhfU1RBVFVTX0lOVkFMSURfUEFSQU0gaWYgdGhlICdkc3QnIGlzIG5vdCBzZXQgdXAgY29ycmVjdGx5IGZvciB0aGUgY29weS4KK1ZQOFN0YXR1c0NvZGUgV2ViUENvcHlEZWNCdWZmZXJQaXhlbHMoY29uc3QgV2ViUERlY0J1ZmZlciogY29uc3Qgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQRGVjQnVmZmVyKiBjb25zdCBkc3QpOworCisvLyBSZXR1cm5zIHRydWUgaWYgZGVjb2Rpbmcgd2lsbCBiZSBzbG93IHdpdGggdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbgorLy8gYW5kIGJpdHN0cmVhbSBmZWF0dXJlcy4KK2ludCBXZWJQQXZvaWRTbG93TWVtb3J5KGNvbnN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBCaXRzdHJlYW1GZWF0dXJlcyogY29uc3QgZmVhdHVyZXMpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30gICAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLyogV0VCUF9ERUNfV0VCUElfREVDX0hfICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVtdXgvTWFrZWZpbGUuYW0gYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVtdXgvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U4MGJkYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZW11eC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDE4IEBACitBTV9DUFBGTEFHUyArPSAtSSQodG9wX2J1aWxkZGlyKSAtSSQodG9wX3NyY2RpcikKK2xpYl9MVExJQlJBUklFUyA9IGxpYndlYnBkZW11eC5sYQorCitsaWJ3ZWJwZGVtdXhfbGFfU09VUkNFUyA9CitsaWJ3ZWJwZGVtdXhfbGFfU09VUkNFUyArPSBhbmltX2RlY29kZS5jIGRlbXV4LmMKKworbGlid2VicGRlbXV4aW5jbHVkZV9IRUFERVJTID0KK2xpYndlYnBkZW11eGluY2x1ZGVfSEVBREVSUyArPSAuLi93ZWJwL2RlY29kZS5oCitsaWJ3ZWJwZGVtdXhpbmNsdWRlX0hFQURFUlMgKz0gLi4vd2VicC9kZW11eC5oCitsaWJ3ZWJwZGVtdXhpbmNsdWRlX0hFQURFUlMgKz0gLi4vd2VicC9tdXhfdHlwZXMuaAorbGlid2VicGRlbXV4aW5jbHVkZV9IRUFERVJTICs9IC4uL3dlYnAvdHlwZXMuaAorbm9pbnN0X0hFQURFUlMgPQorbm9pbnN0X0hFQURFUlMgKz0gLi4vd2VicC9mb3JtYXRfY29uc3RhbnRzLmgKKworbGlid2VicGRlbXV4X2xhX0xJQkFERCA9IC4uL2xpYndlYnAubGEKK2xpYndlYnBkZW11eF9sYV9MREZMQUdTID0gLW5vLXVuZGVmaW5lZCAtdmVyc2lvbi1pbmZvIDI6NDowCitsaWJ3ZWJwZGVtdXhpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS93ZWJwCitwa2djb25maWdfREFUQSA9IGxpYndlYnBkZW11eC5wYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlbXV4L2FuaW1fZGVjb2RlLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVtdXgvYW5pbV9kZWNvZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGUzMTIxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlbXV4L2FuaW1fZGVjb2RlLmMKQEAgLTAsMCArMSw0NTkgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgQW5pbURlY29kZXIgaW1wbGVtZW50YXRpb24uCisvLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgInNyYy93ZWJwL2NvbmZpZy5oIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9hc3NlcnRfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0cmluZ19wb2VtLmgiCisjZWxzZQorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvd2VicC9kZWNvZGUuaCIKKyNpbmNsdWRlICJzcmMvd2VicC9kZW11eC5oIgorCisjZGVmaW5lIE5VTV9DSEFOTkVMUyA0CisKK3R5cGVkZWYgdm9pZCAoKkJsZW5kUm93RnVuYykodWludDMyX3QqIGNvbnN0LCBjb25zdCB1aW50MzJfdCogY29uc3QsIGludCk7CitzdGF0aWMgdm9pZCBCbGVuZFBpeGVsUm93Tm9uUHJlbXVsdCh1aW50MzJfdCogY29uc3Qgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGRzdCwgaW50IG51bV9waXhlbHMpOworc3RhdGljIHZvaWQgQmxlbmRQaXhlbFJvd1ByZW11bHQodWludDMyX3QqIGNvbnN0IHNyYywgY29uc3QgdWludDMyX3QqIGNvbnN0IGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzKTsKKworc3RydWN0IFdlYlBBbmltRGVjb2RlciB7CisgIFdlYlBEZW11eGVyKiBkZW11eF87ICAgICAgICAgICAgIC8vIERlbXV4ZXIgY3JlYXRlZCBmcm9tIGdpdmVuIFdlYlAgYml0c3RyZWFtLgorICBXZWJQRGVjb2RlckNvbmZpZyBjb25maWdfOyAgICAgICAvLyBEZWNvZGVyIGNvbmZpZy4KKyAgLy8gTm90ZTogd2UgdXNlIGEgcG9pbnRlciB0byBhIGZ1bmN0aW9uIGJsZW5kaW5nIG11bHRpcGxlIHBpeGVscyBhdCBhIHRpbWUgdG8KKyAgLy8gYWxsb3cgcG9zc2libGUgaW5saW5pbmcgb2YgcGVyLXBpeGVsIGJsZW5kaW5nIGZ1bmN0aW9uLgorICBCbGVuZFJvd0Z1bmMgYmxlbmRfZnVuY187ICAgICAgICAvLyBQb2ludGVyIHRvIHRoZSBjaG9zZSBibGVuZCByb3cgZnVuY3Rpb24uCisgIFdlYlBBbmltSW5mbyBpbmZvXzsgICAgICAgICAgICAgIC8vIEdsb2JhbCBpbmZvIGFib3V0IHRoZSBhbmltYXRpb24uCisgIHVpbnQ4X3QqIGN1cnJfZnJhbWVfOyAgICAgICAgICAgIC8vIEN1cnJlbnQgY2FudmFzIChub3QgZGlzcG9zZWQpLgorICB1aW50OF90KiBwcmV2X2ZyYW1lX2Rpc3Bvc2VkXzsgICAvLyBQcmV2aW91cyBjYW52YXMgKHByb3Blcmx5IGRpc3Bvc2VkKS4KKyAgaW50IHByZXZfZnJhbWVfdGltZXN0YW1wXzsgICAgICAgLy8gUHJldmlvdXMgZnJhbWUgdGltZXN0YW1wIChtaWxsaXNlY29uZHMpLgorICBXZWJQSXRlcmF0b3IgcHJldl9pdGVyXzsgICAgICAgICAvLyBJdGVyYXRvciBvYmplY3QgZm9yIHByZXZpb3VzIGZyYW1lLgorICBpbnQgcHJldl9mcmFtZV93YXNfa2V5ZnJhbWVfOyAgICAvLyBUcnVlIGlmIHByZXZpb3VzIGZyYW1lIHdhcyBhIGtleWZyYW1lLgorICBpbnQgbmV4dF9mcmFtZV87ICAgICAgICAgICAgICAgICAvLyBJbmRleCBvZiB0aGUgbmV4dCBmcmFtZSB0byBiZSBkZWNvZGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChzdGFydGluZyBmcm9tIDEpLgorfTsKKworc3RhdGljIHZvaWQgRGVmYXVsdERlY29kZXJPcHRpb25zKFdlYlBBbmltRGVjb2Rlck9wdGlvbnMqIGNvbnN0IGRlY19vcHRpb25zKSB7CisgIGRlY19vcHRpb25zLT5jb2xvcl9tb2RlID0gTU9ERV9SR0JBOworICBkZWNfb3B0aW9ucy0+dXNlX3RocmVhZHMgPSAwOworfQorCitpbnQgV2ViUEFuaW1EZWNvZGVyT3B0aW9uc0luaXRJbnRlcm5hbChXZWJQQW5pbURlY29kZXJPcHRpb25zKiBkZWNfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhYmlfdmVyc2lvbikgeworICBpZiAoZGVjX29wdGlvbnMgPT0gTlVMTCB8fAorICAgICAgV0VCUF9BQklfSVNfSU5DT01QQVRJQkxFKGFiaV92ZXJzaW9uLCBXRUJQX0RFTVVYX0FCSV9WRVJTSU9OKSkgeworICAgIHJldHVybiAwOworICB9CisgIERlZmF1bHREZWNvZGVyT3B0aW9ucyhkZWNfb3B0aW9ucyk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IEFwcGx5RGVjb2Rlck9wdGlvbnMoY29uc3QgV2ViUEFuaW1EZWNvZGVyT3B0aW9ucyogY29uc3QgZGVjX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUEFuaW1EZWNvZGVyKiBjb25zdCBkZWMpIHsKKyAgV0VCUF9DU1BfTU9ERSBtb2RlOworICBXZWJQRGVjb2RlckNvbmZpZyogY29uZmlnID0gJmRlYy0+Y29uZmlnXzsKKyAgYXNzZXJ0KGRlY19vcHRpb25zICE9IE5VTEwpOworCisgIG1vZGUgPSBkZWNfb3B0aW9ucy0+Y29sb3JfbW9kZTsKKyAgaWYgKG1vZGUgIT0gTU9ERV9SR0JBICYmIG1vZGUgIT0gTU9ERV9CR1JBICYmCisgICAgICBtb2RlICE9IE1PREVfcmdiQSAmJiBtb2RlICE9IE1PREVfYmdyQSkgeworICAgIHJldHVybiAwOworICB9CisgIGRlYy0+YmxlbmRfZnVuY18gPSAobW9kZSA9PSBNT0RFX1JHQkEgfHwgbW9kZSA9PSBNT0RFX0JHUkEpCisgICAgICAgICAgICAgICAgICAgICAgICAgPyAmQmxlbmRQaXhlbFJvd05vblByZW11bHQKKyAgICAgICAgICAgICAgICAgICAgICAgICA6ICZCbGVuZFBpeGVsUm93UHJlbXVsdDsKKyAgV2ViUEluaXREZWNvZGVyQ29uZmlnKGNvbmZpZyk7CisgIGNvbmZpZy0+b3V0cHV0LmNvbG9yc3BhY2UgPSBtb2RlOworICBjb25maWctPm91dHB1dC5pc19leHRlcm5hbF9tZW1vcnkgPSAxOworICBjb25maWctPm9wdGlvbnMudXNlX3RocmVhZHMgPSBkZWNfb3B0aW9ucy0+dXNlX3RocmVhZHM7CisgIC8vIE5vdGU6IGNvbmZpZy0+b3V0cHV0LnUuUkdCQSBpcyBzZXQgYXQgdGhlIHRpbWUgb2YgZGVjb2RpbmcgZWFjaCBmcmFtZS4KKyAgcmV0dXJuIDE7Cit9CisKK1dlYlBBbmltRGVjb2RlciogV2ViUEFuaW1EZWNvZGVyTmV3SW50ZXJuYWwoCisgICAgY29uc3QgV2ViUERhdGEqIHdlYnBfZGF0YSwgY29uc3QgV2ViUEFuaW1EZWNvZGVyT3B0aW9ucyogZGVjX29wdGlvbnMsCisgICAgaW50IGFiaV92ZXJzaW9uKSB7CisgIFdlYlBBbmltRGVjb2Rlck9wdGlvbnMgb3B0aW9uczsKKyAgV2ViUEFuaW1EZWNvZGVyKiBkZWMgPSBOVUxMOworICBpZiAod2VicF9kYXRhID09IE5VTEwgfHwKKyAgICAgIFdFQlBfQUJJX0lTX0lOQ09NUEFUSUJMRShhYmlfdmVyc2lvbiwgV0VCUF9ERU1VWF9BQklfVkVSU0lPTikpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIC8vIE5vdGU6IGNhbGxvYygpIHNvIHRoYXQgdGhlIHBvaW50ZXIgbWVtYmVycyBhcmUgaW5pdGlhbGl6ZWQgdG8gTlVMTC4KKyAgZGVjID0gKFdlYlBBbmltRGVjb2RlciopV2ViUFNhZmVDYWxsb2MoMVVMTCwgc2l6ZW9mKCpkZWMpKTsKKyAgaWYgKGRlYyA9PSBOVUxMKSBnb3RvIEVycm9yOworCisgIGlmIChkZWNfb3B0aW9ucyAhPSBOVUxMKSB7CisgICAgb3B0aW9ucyA9ICpkZWNfb3B0aW9uczsKKyAgfSBlbHNlIHsKKyAgICBEZWZhdWx0RGVjb2Rlck9wdGlvbnMoJm9wdGlvbnMpOworICB9CisgIGlmICghQXBwbHlEZWNvZGVyT3B0aW9ucygmb3B0aW9ucywgZGVjKSkgZ290byBFcnJvcjsKKworICBkZWMtPmRlbXV4XyA9IFdlYlBEZW11eCh3ZWJwX2RhdGEpOworICBpZiAoZGVjLT5kZW11eF8gPT0gTlVMTCkgZ290byBFcnJvcjsKKworICBkZWMtPmluZm9fLmNhbnZhc193aWR0aCA9IFdlYlBEZW11eEdldEkoZGVjLT5kZW11eF8sIFdFQlBfRkZfQ0FOVkFTX1dJRFRIKTsKKyAgZGVjLT5pbmZvXy5jYW52YXNfaGVpZ2h0ID0gV2ViUERlbXV4R2V0SShkZWMtPmRlbXV4XywgV0VCUF9GRl9DQU5WQVNfSEVJR0hUKTsKKyAgZGVjLT5pbmZvXy5sb29wX2NvdW50ID0gV2ViUERlbXV4R2V0SShkZWMtPmRlbXV4XywgV0VCUF9GRl9MT09QX0NPVU5UKTsKKyAgZGVjLT5pbmZvXy5iZ2NvbG9yID0gV2ViUERlbXV4R2V0SShkZWMtPmRlbXV4XywgV0VCUF9GRl9CQUNLR1JPVU5EX0NPTE9SKTsKKyAgZGVjLT5pbmZvXy5mcmFtZV9jb3VudCA9IFdlYlBEZW11eEdldEkoZGVjLT5kZW11eF8sIFdFQlBfRkZfRlJBTUVfQ09VTlQpOworCisgIC8vIE5vdGU6IGNhbGxvYygpIGJlY2F1c2Ugd2UgZmlsbCBmcmFtZSB3aXRoIHplcm9lcyBhcyB3ZWxsLgorICBkZWMtPmN1cnJfZnJhbWVfID0gKHVpbnQ4X3QqKVdlYlBTYWZlQ2FsbG9jKAorICAgICAgZGVjLT5pbmZvXy5jYW52YXNfd2lkdGggKiBOVU1fQ0hBTk5FTFMsIGRlYy0+aW5mb18uY2FudmFzX2hlaWdodCk7CisgIGlmIChkZWMtPmN1cnJfZnJhbWVfID09IE5VTEwpIGdvdG8gRXJyb3I7CisgIGRlYy0+cHJldl9mcmFtZV9kaXNwb3NlZF8gPSAodWludDhfdCopV2ViUFNhZmVDYWxsb2MoCisgICAgICBkZWMtPmluZm9fLmNhbnZhc193aWR0aCAqIE5VTV9DSEFOTkVMUywgZGVjLT5pbmZvXy5jYW52YXNfaGVpZ2h0KTsKKyAgaWYgKGRlYy0+cHJldl9mcmFtZV9kaXNwb3NlZF8gPT0gTlVMTCkgZ290byBFcnJvcjsKKworICBXZWJQQW5pbURlY29kZXJSZXNldChkZWMpOworICByZXR1cm4gZGVjOworCisgRXJyb3I6CisgIFdlYlBBbmltRGVjb2RlckRlbGV0ZShkZWMpOworICByZXR1cm4gTlVMTDsKK30KKworaW50IFdlYlBBbmltRGVjb2RlckdldEluZm8oY29uc3QgV2ViUEFuaW1EZWNvZGVyKiBkZWMsIFdlYlBBbmltSW5mbyogaW5mbykgeworICBpZiAoZGVjID09IE5VTEwgfHwgaW5mbyA9PSBOVUxMKSByZXR1cm4gMDsKKyAgKmluZm8gPSBkZWMtPmluZm9fOworICByZXR1cm4gMTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBmcmFtZSBjb3ZlcnMgdGhlIGZ1bGwgY2FudmFzLgorc3RhdGljIGludCBJc0Z1bGxGcmFtZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBjYW52YXNfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBjYW52YXNfaGVpZ2h0KSB7CisgIHJldHVybiAod2lkdGggPT0gY2FudmFzX3dpZHRoICYmIGhlaWdodCA9PSBjYW52YXNfaGVpZ2h0KTsKK30KKworLy8gQ2xlYXIgdGhlIGNhbnZhcyB0byB0cmFuc3BhcmVudC4KK3N0YXRpYyBpbnQgWmVyb0ZpbGxDYW52YXModWludDhfdCogYnVmLCB1aW50MzJfdCBjYW52YXNfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNhbnZhc19oZWlnaHQpIHsKKyAgY29uc3QgdWludDY0X3Qgc2l6ZSA9CisgICAgICAodWludDY0X3QpY2FudmFzX3dpZHRoICogY2FudmFzX2hlaWdodCAqIE5VTV9DSEFOTkVMUyAqIHNpemVvZigqYnVmKTsKKyAgaWYgKHNpemUgIT0gKHNpemVfdClzaXplKSByZXR1cm4gMDsKKyAgbWVtc2V0KGJ1ZiwgMCwgKHNpemVfdClzaXplKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIENsZWFyIGdpdmVuIGZyYW1lIHJlY3RhbmdsZSB0byB0cmFuc3BhcmVudC4KK3N0YXRpYyB2b2lkIFplcm9GaWxsRnJhbWVSZWN0KHVpbnQ4X3QqIGJ1ZiwgaW50IGJ1Zl9zdHJpZGUsIGludCB4X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5X29mZnNldCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgIGludCBqOworICBhc3NlcnQod2lkdGggKiBOVU1fQ0hBTk5FTFMgPD0gYnVmX3N0cmlkZSk7CisgIGJ1ZiArPSB5X29mZnNldCAqIGJ1Zl9zdHJpZGUgKyB4X29mZnNldCAqIE5VTV9DSEFOTkVMUzsKKyAgZm9yIChqID0gMDsgaiA8IGhlaWdodDsgKytqKSB7CisgICAgbWVtc2V0KGJ1ZiwgMCwgd2lkdGggKiBOVU1fQ0hBTk5FTFMpOworICAgIGJ1ZiArPSBidWZfc3RyaWRlOworICB9Cit9CisKKy8vIENvcHkgd2lkdGggKiBoZWlnaHQgcGl4ZWxzIGZyb20gJ3NyYycgdG8gJ2RzdCcuCitzdGF0aWMgaW50IENvcHlDYW52YXMoY29uc3QgdWludDhfdCogc3JjLCB1aW50OF90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgeworICBjb25zdCB1aW50NjRfdCBzaXplID0gKHVpbnQ2NF90KXdpZHRoICogaGVpZ2h0ICogTlVNX0NIQU5ORUxTOworICBpZiAoc2l6ZSAhPSAoc2l6ZV90KXNpemUpIHJldHVybiAwOworICBhc3NlcnQoc3JjICE9IE5VTEwgJiYgZHN0ICE9IE5VTEwpOworICBtZW1jcHkoZHN0LCBzcmMsIChzaXplX3Qpc2l6ZSk7CisgIHJldHVybiAxOworfQorCisvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgZnJhbWUgaXMgYSBrZXktZnJhbWUuCitzdGF0aWMgaW50IElzS2V5RnJhbWUoY29uc3QgV2ViUEl0ZXJhdG9yKiBjb25zdCBjdXJyLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBJdGVyYXRvciogY29uc3QgcHJldiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJldl9mcmFtZV93YXNfa2V5X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgIGludCBjYW52YXNfd2lkdGgsIGludCBjYW52YXNfaGVpZ2h0KSB7CisgIGlmIChjdXJyLT5mcmFtZV9udW0gPT0gMSkgeworICAgIHJldHVybiAxOworICB9IGVsc2UgaWYgKCghY3Vyci0+aGFzX2FscGhhIHx8IGN1cnItPmJsZW5kX21ldGhvZCA9PSBXRUJQX01VWF9OT19CTEVORCkgJiYKKyAgICAgICAgICAgICBJc0Z1bGxGcmFtZShjdXJyLT53aWR0aCwgY3Vyci0+aGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhc193aWR0aCwgY2FudmFzX2hlaWdodCkpIHsKKyAgICByZXR1cm4gMTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gKHByZXYtPmRpc3Bvc2VfbWV0aG9kID09IFdFQlBfTVVYX0RJU1BPU0VfQkFDS0dST1VORCkgJiYKKyAgICAgICAgICAgKElzRnVsbEZyYW1lKHByZXYtPndpZHRoLCBwcmV2LT5oZWlnaHQsIGNhbnZhc193aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhc19oZWlnaHQpIHx8CisgICAgICAgICAgICBwcmV2X2ZyYW1lX3dhc19rZXlfZnJhbWUpOworICB9Cit9CisKKworLy8gQmxlbmQgYSBzaW5nbGUgY2hhbm5lbCBvZiAnc3JjJyBvdmVyICdkc3QnLCBnaXZlbiB0aGVpciBhbHBoYSBjaGFubmVsIHZhbHVlcy4KKy8vICdzcmMnIGFuZCAnZHN0JyBhcmUgYXNzdW1lZCB0byBiZSBOT1QgcHJlLW11bHRpcGxpZWQgYnkgYWxwaGEuCitzdGF0aWMgdWludDhfdCBCbGVuZENoYW5uZWxOb25QcmVtdWx0KHVpbnQzMl90IHNyYywgdWludDhfdCBzcmNfYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHN0LCB1aW50OF90IGRzdF9hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzY2FsZSwgaW50IHNoaWZ0KSB7CisgIGNvbnN0IHVpbnQ4X3Qgc3JjX2NoYW5uZWwgPSAoc3JjID4+IHNoaWZ0KSAmIDB4ZmY7CisgIGNvbnN0IHVpbnQ4X3QgZHN0X2NoYW5uZWwgPSAoZHN0ID4+IHNoaWZ0KSAmIDB4ZmY7CisgIGNvbnN0IHVpbnQzMl90IGJsZW5kX3Vuc2NhbGVkID0gc3JjX2NoYW5uZWwgKiBzcmNfYSArIGRzdF9jaGFubmVsICogZHN0X2E7CisgIGFzc2VydChibGVuZF91bnNjYWxlZCA8ICgxVUxMIDw8IDMyKSAvIHNjYWxlKTsKKyAgcmV0dXJuIChibGVuZF91bnNjYWxlZCAqIHNjYWxlKSA+PiAyNDsKK30KKworLy8gQmxlbmQgJ3NyYycgb3ZlciAnZHN0JyBhc3N1bWluZyB0aGV5IGFyZSBOT1QgcHJlLW11bHRpcGxpZWQgYnkgYWxwaGEuCitzdGF0aWMgdWludDMyX3QgQmxlbmRQaXhlbE5vblByZW11bHQodWludDMyX3Qgc3JjLCB1aW50MzJfdCBkc3QpIHsKKyAgY29uc3QgdWludDhfdCBzcmNfYSA9IChzcmMgPj4gMjQpICYgMHhmZjsKKworICBpZiAoc3JjX2EgPT0gMCkgeworICAgIHJldHVybiBkc3Q7CisgIH0gZWxzZSB7CisgICAgY29uc3QgdWludDhfdCBkc3RfYSA9IChkc3QgPj4gMjQpICYgMHhmZjsKKyAgICAvLyBUaGlzIGlzIHRoZSBhcHByb3hpbWF0ZSBpbnRlZ2VyIGFyaXRobWV0aWMgZm9yIHRoZSBhY3R1YWwgZm9ybXVsYToKKyAgICAvLyBkc3RfZmFjdG9yX2EgPSAoZHN0X2EgKiAoMjU1IC0gc3JjX2EpKSAvIDI1NS4KKyAgICBjb25zdCB1aW50OF90IGRzdF9mYWN0b3JfYSA9IChkc3RfYSAqICgyNTYgLSBzcmNfYSkpID4+IDg7CisgICAgY29uc3QgdWludDhfdCBibGVuZF9hID0gc3JjX2EgKyBkc3RfZmFjdG9yX2E7CisgICAgY29uc3QgdWludDMyX3Qgc2NhbGUgPSAoMVVMIDw8IDI0KSAvIGJsZW5kX2E7CisKKyAgICBjb25zdCB1aW50OF90IGJsZW5kX3IgPQorICAgICAgICBCbGVuZENoYW5uZWxOb25QcmVtdWx0KHNyYywgc3JjX2EsIGRzdCwgZHN0X2ZhY3Rvcl9hLCBzY2FsZSwgMCk7CisgICAgY29uc3QgdWludDhfdCBibGVuZF9nID0KKyAgICAgICAgQmxlbmRDaGFubmVsTm9uUHJlbXVsdChzcmMsIHNyY19hLCBkc3QsIGRzdF9mYWN0b3JfYSwgc2NhbGUsIDgpOworICAgIGNvbnN0IHVpbnQ4X3QgYmxlbmRfYiA9CisgICAgICAgIEJsZW5kQ2hhbm5lbE5vblByZW11bHQoc3JjLCBzcmNfYSwgZHN0LCBkc3RfZmFjdG9yX2EsIHNjYWxlLCAxNik7CisgICAgYXNzZXJ0KHNyY19hICsgZHN0X2ZhY3Rvcl9hIDwgMjU2KTsKKworICAgIHJldHVybiAoYmxlbmRfciA8PCAwKSB8CisgICAgICAgICAgIChibGVuZF9nIDw8IDgpIHwKKyAgICAgICAgICAgKGJsZW5kX2IgPDwgMTYpIHwKKyAgICAgICAgICAgKCh1aW50MzJfdClibGVuZF9hIDw8IDI0KTsKKyAgfQorfQorCisvLyBCbGVuZCAnbnVtX3BpeGVscycgaW4gJ3NyYycgb3ZlciAnZHN0JyBhc3N1bWluZyB0aGV5IGFyZSBOT1QgcHJlLW11bHRpcGxpZWQKKy8vIGJ5IGFscGhhLgorc3RhdGljIHZvaWQgQmxlbmRQaXhlbFJvd05vblByZW11bHQodWludDMyX3QqIGNvbnN0IHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBkc3QsIGludCBudW1fcGl4ZWxzKSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BpeGVsczsgKytpKSB7CisgICAgY29uc3QgdWludDhfdCBzcmNfYWxwaGEgPSAoc3JjW2ldID4+IDI0KSAmIDB4ZmY7CisgICAgaWYgKHNyY19hbHBoYSAhPSAweGZmKSB7CisgICAgICBzcmNbaV0gPSBCbGVuZFBpeGVsTm9uUHJlbXVsdChzcmNbaV0sIGRzdFtpXSk7CisgICAgfQorICB9Cit9CisKKy8vIEluZGl2aWR1YWxseSBtdWx0aXBseSBlYWNoIGNoYW5uZWwgaW4gJ3BpeCcgYnkgJ3NjYWxlJy4KK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBDaGFubmVsd2lzZU11bHRpcGx5KHVpbnQzMl90IHBpeCwgdWludDMyX3Qgc2NhbGUpIHsKKyAgdWludDMyX3QgbWFzayA9IDB4MDBGRjAwRkY7CisgIHVpbnQzMl90IHJiID0gKChwaXggJiBtYXNrKSAqIHNjYWxlKSA+PiA4OworICB1aW50MzJfdCBhZyA9ICgocGl4ID4+IDgpICYgbWFzaykgKiBzY2FsZTsKKyAgcmV0dXJuIChyYiAmIG1hc2spIHwgKGFnICYgfm1hc2spOworfQorCisvLyBCbGVuZCAnc3JjJyBvdmVyICdkc3QnIGFzc3VtaW5nIHRoZXkgYXJlIHByZS1tdWx0aXBsaWVkIGJ5IGFscGhhLgorc3RhdGljIHVpbnQzMl90IEJsZW5kUGl4ZWxQcmVtdWx0KHVpbnQzMl90IHNyYywgdWludDMyX3QgZHN0KSB7CisgIGNvbnN0IHVpbnQ4X3Qgc3JjX2EgPSAoc3JjID4+IDI0KSAmIDB4ZmY7CisgIHJldHVybiBzcmMgKyBDaGFubmVsd2lzZU11bHRpcGx5KGRzdCwgMjU2IC0gc3JjX2EpOworfQorCisvLyBCbGVuZCAnbnVtX3BpeGVscycgaW4gJ3NyYycgb3ZlciAnZHN0JyBhc3N1bWluZyB0aGV5IGFyZSBwcmUtbXVsdGlwbGllZCBieQorLy8gYWxwaGEuCitzdGF0aWMgdm9pZCBCbGVuZFBpeGVsUm93UHJlbXVsdCh1aW50MzJfdCogY29uc3Qgc3JjLCBjb25zdCB1aW50MzJfdCogY29uc3QgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBudW1fcGl4ZWxzOyArK2kpIHsKKyAgICBjb25zdCB1aW50OF90IHNyY19hbHBoYSA9IChzcmNbaV0gPj4gMjQpICYgMHhmZjsKKyAgICBpZiAoc3JjX2FscGhhICE9IDB4ZmYpIHsKKyAgICAgIHNyY1tpXSA9IEJsZW5kUGl4ZWxQcmVtdWx0KHNyY1tpXSwgZHN0W2ldKTsKKyAgICB9CisgIH0KK30KKworLy8gUmV0dXJucyB0d28gcmFuZ2VzICg8bGVmdCwgd2lkdGg+IHBhaXJzKSBhdCByb3cgJ2NhbnZhc195JywgdGhhdCBiZWxvbmcgdG8KKy8vICdzcmMnIGJ1dCBub3QgJ2RzdCcuIEEgcG9pbnQgcmFuZ2UgaXMgZW1wdHkgaWYgdGhlIGNvcnJlc3BvbmRpbmcgd2lkdGggaXMgMC4KK3N0YXRpYyB2b2lkIEZpbmRCbGVuZFJhbmdlQXRSb3coY29uc3QgV2ViUEl0ZXJhdG9yKiBjb25zdCBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBJdGVyYXRvciogY29uc3QgZHN0LCBpbnQgY2FudmFzX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgbGVmdDEsIGludCogY29uc3Qgd2lkdGgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGxlZnQyLCBpbnQqIGNvbnN0IHdpZHRoMikgeworICBjb25zdCBpbnQgc3JjX21heF94ID0gc3JjLT54X29mZnNldCArIHNyYy0+d2lkdGg7CisgIGNvbnN0IGludCBkc3RfbWF4X3ggPSBkc3QtPnhfb2Zmc2V0ICsgZHN0LT53aWR0aDsKKyAgY29uc3QgaW50IGRzdF9tYXhfeSA9IGRzdC0+eV9vZmZzZXQgKyBkc3QtPmhlaWdodDsKKyAgYXNzZXJ0KGNhbnZhc195ID49IHNyYy0+eV9vZmZzZXQgJiYgY2FudmFzX3kgPCAoc3JjLT55X29mZnNldCArIHNyYy0+aGVpZ2h0KSk7CisgICpsZWZ0MSA9IC0xOworICAqd2lkdGgxID0gMDsKKyAgKmxlZnQyID0gLTE7CisgICp3aWR0aDIgPSAwOworCisgIGlmIChjYW52YXNfeSA8IGRzdC0+eV9vZmZzZXQgfHwgY2FudmFzX3kgPj0gZHN0X21heF95IHx8CisgICAgICBzcmMtPnhfb2Zmc2V0ID49IGRzdF9tYXhfeCB8fCBzcmNfbWF4X3ggPD0gZHN0LT54X29mZnNldCkgeworICAgICpsZWZ0MSA9IHNyYy0+eF9vZmZzZXQ7CisgICAgKndpZHRoMSA9IHNyYy0+d2lkdGg7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHNyYy0+eF9vZmZzZXQgPCBkc3QtPnhfb2Zmc2V0KSB7CisgICAgKmxlZnQxID0gc3JjLT54X29mZnNldDsKKyAgICAqd2lkdGgxID0gZHN0LT54X29mZnNldCAtIHNyYy0+eF9vZmZzZXQ7CisgIH0KKworICBpZiAoc3JjX21heF94ID4gZHN0X21heF94KSB7CisgICAgKmxlZnQyID0gZHN0X21heF94OworICAgICp3aWR0aDIgPSBzcmNfbWF4X3ggLSBkc3RfbWF4X3g7CisgIH0KK30KKworaW50IFdlYlBBbmltRGVjb2RlckdldE5leHQoV2ViUEFuaW1EZWNvZGVyKiBkZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogYnVmX3B0ciwgaW50KiB0aW1lc3RhbXBfcHRyKSB7CisgIFdlYlBJdGVyYXRvciBpdGVyOworICB1aW50MzJfdCB3aWR0aDsKKyAgdWludDMyX3QgaGVpZ2h0OworICBpbnQgaXNfa2V5X2ZyYW1lOworICBpbnQgdGltZXN0YW1wOworICBCbGVuZFJvd0Z1bmMgYmxlbmRfcm93OworCisgIGlmIChkZWMgPT0gTlVMTCB8fCBidWZfcHRyID09IE5VTEwgfHwgdGltZXN0YW1wX3B0ciA9PSBOVUxMKSByZXR1cm4gMDsKKyAgaWYgKCFXZWJQQW5pbURlY29kZXJIYXNNb3JlRnJhbWVzKGRlYykpIHJldHVybiAwOworCisgIHdpZHRoID0gZGVjLT5pbmZvXy5jYW52YXNfd2lkdGg7CisgIGhlaWdodCA9IGRlYy0+aW5mb18uY2FudmFzX2hlaWdodDsKKyAgYmxlbmRfcm93ID0gZGVjLT5ibGVuZF9mdW5jXzsKKworICAvLyBHZXQgY29tcHJlc3NlZCBmcmFtZS4KKyAgaWYgKCFXZWJQRGVtdXhHZXRGcmFtZShkZWMtPmRlbXV4XywgZGVjLT5uZXh0X2ZyYW1lXywgJml0ZXIpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgdGltZXN0YW1wID0gZGVjLT5wcmV2X2ZyYW1lX3RpbWVzdGFtcF8gKyBpdGVyLmR1cmF0aW9uOworCisgIC8vIEluaXRpYWxpemUuCisgIGlzX2tleV9mcmFtZSA9IElzS2V5RnJhbWUoJml0ZXIsICZkZWMtPnByZXZfaXRlcl8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjLT5wcmV2X2ZyYW1lX3dhc19rZXlmcmFtZV8sIHdpZHRoLCBoZWlnaHQpOworICBpZiAoaXNfa2V5X2ZyYW1lKSB7CisgICAgaWYgKCFaZXJvRmlsbENhbnZhcyhkZWMtPmN1cnJfZnJhbWVfLCB3aWR0aCwgaGVpZ2h0KSkgeworICAgICAgZ290byBFcnJvcjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKCFDb3B5Q2FudmFzKGRlYy0+cHJldl9mcmFtZV9kaXNwb3NlZF8sIGRlYy0+Y3Vycl9mcmFtZV8sCisgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQpKSB7CisgICAgICBnb3RvIEVycm9yOworICAgIH0KKyAgfQorCisgIC8vIERlY29kZS4KKyAgeworICAgIGNvbnN0IHVpbnQ4X3QqIGluID0gaXRlci5mcmFnbWVudC5ieXRlczsKKyAgICBjb25zdCBzaXplX3QgaW5fc2l6ZSA9IGl0ZXIuZnJhZ21lbnQuc2l6ZTsKKyAgICBjb25zdCBzaXplX3Qgb3V0X29mZnNldCA9CisgICAgICAgIChpdGVyLnlfb2Zmc2V0ICogd2lkdGggKyBpdGVyLnhfb2Zmc2V0KSAqIE5VTV9DSEFOTkVMUzsKKyAgICBXZWJQRGVjb2RlckNvbmZpZyogY29uc3QgY29uZmlnID0gJmRlYy0+Y29uZmlnXzsKKyAgICBXZWJQUkdCQUJ1ZmZlciogY29uc3QgYnVmID0gJmNvbmZpZy0+b3V0cHV0LnUuUkdCQTsKKyAgICBidWYtPnN0cmlkZSA9IE5VTV9DSEFOTkVMUyAqIHdpZHRoOworICAgIGJ1Zi0+c2l6ZSA9IGJ1Zi0+c3RyaWRlICogaXRlci5oZWlnaHQ7CisgICAgYnVmLT5yZ2JhID0gZGVjLT5jdXJyX2ZyYW1lXyArIG91dF9vZmZzZXQ7CisKKyAgICBpZiAoV2ViUERlY29kZShpbiwgaW5fc2l6ZSwgY29uZmlnKSAhPSBWUDhfU1RBVFVTX09LKSB7CisgICAgICBnb3RvIEVycm9yOworICAgIH0KKyAgfQorCisgIC8vIER1cmluZyB0aGUgZGVjb2Rpbmcgb2YgY3VycmVudCBmcmFtZSwgd2UgbWF5IGhhdmUgc2V0IHNvbWUgcGl4ZWxzIHRvIGJlCisgIC8vIHRyYW5zcGFyZW50IChpLmUuIGFscGhhIDwgMjU1KS4gSG93ZXZlciwgdGhlIHZhbHVlIG9mIGVhY2ggb2YgdGhlc2UKKyAgLy8gcGl4ZWxzIHNob3VsZCBoYXZlIGJlZW4gZGV0ZXJtaW5lZCBieSBibGVuZGluZyBpdCBhZ2FpbnN0IHRoZSB2YWx1ZSBvZgorICAvLyB0aGF0IHBpeGVsIGluIHRoZSBwcmV2aW91cyBmcmFtZSBpZiBibGVuZGluZyBtZXRob2Qgb2YgaXMgV0VCUF9NVVhfQkxFTkQuCisgIGlmIChpdGVyLmZyYW1lX251bSA+IDEgJiYgaXRlci5ibGVuZF9tZXRob2QgPT0gV0VCUF9NVVhfQkxFTkQgJiYKKyAgICAgICFpc19rZXlfZnJhbWUpIHsKKyAgICBpZiAoZGVjLT5wcmV2X2l0ZXJfLmRpc3Bvc2VfbWV0aG9kID09IFdFQlBfTVVYX0RJU1BPU0VfTk9ORSkgeworICAgICAgaW50IHk7CisgICAgICAvLyBCbGVuZCB0cmFuc3BhcmVudCBwaXhlbHMgd2l0aCBwaXhlbHMgaW4gcHJldmlvdXMgY2FudmFzLgorICAgICAgZm9yICh5ID0gMDsgeSA8IGl0ZXIuaGVpZ2h0OyArK3kpIHsKKyAgICAgICAgY29uc3Qgc2l6ZV90IG9mZnNldCA9CisgICAgICAgICAgICAoaXRlci55X29mZnNldCArIHkpICogd2lkdGggKyBpdGVyLnhfb2Zmc2V0OworICAgICAgICBibGVuZF9yb3coKHVpbnQzMl90KilkZWMtPmN1cnJfZnJhbWVfICsgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KilkZWMtPnByZXZfZnJhbWVfZGlzcG9zZWRfICsgb2Zmc2V0LCBpdGVyLndpZHRoKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaW50IHk7CisgICAgICBhc3NlcnQoZGVjLT5wcmV2X2l0ZXJfLmRpc3Bvc2VfbWV0aG9kID09IFdFQlBfTVVYX0RJU1BPU0VfQkFDS0dST1VORCk7CisgICAgICAvLyBXZSBuZWVkIHRvIGJsZW5kIGEgdHJhbnNwYXJlbnQgcGl4ZWwgd2l0aCBpdHMgdmFsdWUganVzdCBhZnRlcgorICAgICAgLy8gaW5pdGlhbGl6YXRpb24uIFRoYXQgaXMsIGJsZW5kIGl0IHdpdGg6CisgICAgICAvLyAqIEZ1bGx5IHRyYW5zcGFyZW50IHBpeGVsIGlmIGl0IGJlbG9uZ3MgdG8gcHJldlJlY3QgPC0tIE5vLW9wLgorICAgICAgLy8gKiBUaGUgcGl4ZWwgaW4gdGhlIHByZXZpb3VzIGNhbnZhcyBvdGhlcndpc2UgPC0tIE5lZWQgYWxwaGEtYmxlbmRpbmcuCisgICAgICBmb3IgKHkgPSAwOyB5IDwgaXRlci5oZWlnaHQ7ICsreSkgeworICAgICAgICBjb25zdCBpbnQgY2FudmFzX3kgPSBpdGVyLnlfb2Zmc2V0ICsgeTsKKyAgICAgICAgaW50IGxlZnQxLCB3aWR0aDEsIGxlZnQyLCB3aWR0aDI7CisgICAgICAgIEZpbmRCbGVuZFJhbmdlQXRSb3coJml0ZXIsICZkZWMtPnByZXZfaXRlcl8sIGNhbnZhc195LCAmbGVmdDEsICZ3aWR0aDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlZnQyLCAmd2lkdGgyKTsKKyAgICAgICAgaWYgKHdpZHRoMSA+IDApIHsKKyAgICAgICAgICBjb25zdCBzaXplX3Qgb2Zmc2V0MSA9IGNhbnZhc195ICogd2lkdGggKyBsZWZ0MTsKKyAgICAgICAgICBibGVuZF9yb3coKHVpbnQzMl90KilkZWMtPmN1cnJfZnJhbWVfICsgb2Zmc2V0MSwKKyAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KilkZWMtPnByZXZfZnJhbWVfZGlzcG9zZWRfICsgb2Zmc2V0MSwgd2lkdGgxKTsKKyAgICAgICAgfQorICAgICAgICBpZiAod2lkdGgyID4gMCkgeworICAgICAgICAgIGNvbnN0IHNpemVfdCBvZmZzZXQyID0gY2FudmFzX3kgKiB3aWR0aCArIGxlZnQyOworICAgICAgICAgIGJsZW5kX3JvdygodWludDMyX3QqKWRlYy0+Y3Vycl9mcmFtZV8gKyBvZmZzZXQyLAorICAgICAgICAgICAgICAgICAgICAodWludDMyX3QqKWRlYy0+cHJldl9mcmFtZV9kaXNwb3NlZF8gKyBvZmZzZXQyLCB3aWR0aDIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gVXBkYXRlIGluZm8gb2YgdGhlIHByZXZpb3VzIGZyYW1lIGFuZCBkaXNwb3NlIGl0IGZvciB0aGUgbmV4dCBpdGVyYXRpb24uCisgIGRlYy0+cHJldl9mcmFtZV90aW1lc3RhbXBfID0gdGltZXN0YW1wOworICBXZWJQRGVtdXhSZWxlYXNlSXRlcmF0b3IoJmRlYy0+cHJldl9pdGVyXyk7CisgIGRlYy0+cHJldl9pdGVyXyA9IGl0ZXI7CisgIGRlYy0+cHJldl9mcmFtZV93YXNfa2V5ZnJhbWVfID0gaXNfa2V5X2ZyYW1lOworICBDb3B5Q2FudmFzKGRlYy0+Y3Vycl9mcmFtZV8sIGRlYy0+cHJldl9mcmFtZV9kaXNwb3NlZF8sIHdpZHRoLCBoZWlnaHQpOworICBpZiAoZGVjLT5wcmV2X2l0ZXJfLmRpc3Bvc2VfbWV0aG9kID09IFdFQlBfTVVYX0RJU1BPU0VfQkFDS0dST1VORCkgeworICAgIFplcm9GaWxsRnJhbWVSZWN0KGRlYy0+cHJldl9mcmFtZV9kaXNwb3NlZF8sIHdpZHRoICogTlVNX0NIQU5ORUxTLAorICAgICAgICAgICAgICAgICAgICAgIGRlYy0+cHJldl9pdGVyXy54X29mZnNldCwgZGVjLT5wcmV2X2l0ZXJfLnlfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgIGRlYy0+cHJldl9pdGVyXy53aWR0aCwgZGVjLT5wcmV2X2l0ZXJfLmhlaWdodCk7CisgIH0KKyAgKytkZWMtPm5leHRfZnJhbWVfOworCisgIC8vIEFsbCBPSywgZmlsbCBpbiB0aGUgdmFsdWVzLgorICAqYnVmX3B0ciA9IGRlYy0+Y3Vycl9mcmFtZV87CisgICp0aW1lc3RhbXBfcHRyID0gdGltZXN0YW1wOworICByZXR1cm4gMTsKKworIEVycm9yOgorICBXZWJQRGVtdXhSZWxlYXNlSXRlcmF0b3IoJml0ZXIpOworICByZXR1cm4gMDsKK30KKworaW50IFdlYlBBbmltRGVjb2Rlckhhc01vcmVGcmFtZXMoY29uc3QgV2ViUEFuaW1EZWNvZGVyKiBkZWMpIHsKKyAgaWYgKGRlYyA9PSBOVUxMKSByZXR1cm4gMDsKKyAgcmV0dXJuIChkZWMtPm5leHRfZnJhbWVfIDw9IChpbnQpZGVjLT5pbmZvXy5mcmFtZV9jb3VudCk7Cit9CisKK3ZvaWQgV2ViUEFuaW1EZWNvZGVyUmVzZXQoV2ViUEFuaW1EZWNvZGVyKiBkZWMpIHsKKyAgaWYgKGRlYyAhPSBOVUxMKSB7CisgICAgZGVjLT5wcmV2X2ZyYW1lX3RpbWVzdGFtcF8gPSAwOworICAgIFdlYlBEZW11eFJlbGVhc2VJdGVyYXRvcigmZGVjLT5wcmV2X2l0ZXJfKTsKKyAgICBtZW1zZXQoJmRlYy0+cHJldl9pdGVyXywgMCwgc2l6ZW9mKGRlYy0+cHJldl9pdGVyXykpOworICAgIGRlYy0+cHJldl9mcmFtZV93YXNfa2V5ZnJhbWVfID0gMDsKKyAgICBkZWMtPm5leHRfZnJhbWVfID0gMTsKKyAgfQorfQorCitjb25zdCBXZWJQRGVtdXhlciogV2ViUEFuaW1EZWNvZGVyR2V0RGVtdXhlcihjb25zdCBXZWJQQW5pbURlY29kZXIqIGRlYykgeworICBpZiAoZGVjID09IE5VTEwpIHJldHVybiBOVUxMOworICByZXR1cm4gZGVjLT5kZW11eF87Cit9CisKK3ZvaWQgV2ViUEFuaW1EZWNvZGVyRGVsZXRlKFdlYlBBbmltRGVjb2RlciogZGVjKSB7CisgIGlmIChkZWMgIT0gTlVMTCkgeworICAgIFdlYlBEZW11eFJlbGVhc2VJdGVyYXRvcigmZGVjLT5wcmV2X2l0ZXJfKTsKKyAgICBXZWJQRGVtdXhEZWxldGUoZGVjLT5kZW11eF8pOworICAgIFdlYlBTYWZlRnJlZShkZWMtPmN1cnJfZnJhbWVfKTsKKyAgICBXZWJQU2FmZUZyZWUoZGVjLT5wcmV2X2ZyYW1lX2Rpc3Bvc2VkXyk7CisgICAgV2ViUFNhZmVGcmVlKGRlYyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZW11eC9kZW11eC5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlbXV4L2RlbXV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg0MjE1ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZW11eC9kZW11eC5jCkBAIC0wLDAgKzEsOTY3IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gIFdlYlAgY29udGFpbmVyIGRlbXV4LgorLy8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJzcmMvd2VicC9jb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvd2VicC9kZWNvZGUuaCIgICAgIC8vIFdlYlBHZXRGZWF0dXJlcworI2luY2x1ZGUgInNyYy93ZWJwL2RlbXV4LmgiCisjaW5jbHVkZSAic3JjL3dlYnAvZm9ybWF0X2NvbnN0YW50cy5oIgorCisjZGVmaW5lIERNVVhfTUFKX1ZFUlNJT04gMQorI2RlZmluZSBETVVYX01JTl9WRVJTSU9OIDAKKyNkZWZpbmUgRE1VWF9SRVZfVkVSU0lPTiAwCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc2l6ZV90IHN0YXJ0XzsgICAgICAgIC8vIHN0YXJ0IGxvY2F0aW9uIG9mIHRoZSBkYXRhCisgIHNpemVfdCBlbmRfOyAgICAgICAgICAvLyBlbmQgbG9jYXRpb24KKyAgc2l6ZV90IHJpZmZfZW5kXzsgICAgIC8vIHJpZmYgY2h1bmsgZW5kIGxvY2F0aW9uLCBjYW4gYmUgPiBlbmRfLgorICBzaXplX3QgYnVmX3NpemVfOyAgICAgLy8gc2l6ZSBvZiB0aGUgYnVmZmVyCisgIGNvbnN0IHVpbnQ4X3QqIGJ1Zl87Cit9IE1lbUJ1ZmZlcjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBzaXplX3Qgb2Zmc2V0XzsKKyAgc2l6ZV90IHNpemVfOworfSBDaHVua0RhdGE7CisKK3R5cGVkZWYgc3RydWN0IEZyYW1lIHsKKyAgaW50IHhfb2Zmc2V0XywgeV9vZmZzZXRfOworICBpbnQgd2lkdGhfLCBoZWlnaHRfOworICBpbnQgaGFzX2FscGhhXzsKKyAgaW50IGR1cmF0aW9uXzsKKyAgV2ViUE11eEFuaW1EaXNwb3NlIGRpc3Bvc2VfbWV0aG9kXzsKKyAgV2ViUE11eEFuaW1CbGVuZCBibGVuZF9tZXRob2RfOworICBpbnQgZnJhbWVfbnVtXzsKKyAgaW50IGNvbXBsZXRlXzsgICAvLyBpbWdfY29tcG9uZW50c18gY29udGFpbnMgYSBmdWxsIGltYWdlLgorICBDaHVua0RhdGEgaW1nX2NvbXBvbmVudHNfWzJdOyAgLy8gMD1WUDh7LEx9IDE9QUxQSAorICBzdHJ1Y3QgRnJhbWUqIG5leHRfOworfSBGcmFtZTsKKwordHlwZWRlZiBzdHJ1Y3QgQ2h1bmsgeworICBDaHVua0RhdGEgZGF0YV87CisgIHN0cnVjdCBDaHVuayogbmV4dF87Cit9IENodW5rOworCitzdHJ1Y3QgV2ViUERlbXV4ZXIgeworICBNZW1CdWZmZXIgbWVtXzsKKyAgV2ViUERlbXV4U3RhdGUgc3RhdGVfOworICBpbnQgaXNfZXh0X2Zvcm1hdF87CisgIHVpbnQzMl90IGZlYXR1cmVfZmxhZ3NfOworICBpbnQgY2FudmFzX3dpZHRoXywgY2FudmFzX2hlaWdodF87CisgIGludCBsb29wX2NvdW50XzsKKyAgdWludDMyX3QgYmdjb2xvcl87CisgIGludCBudW1fZnJhbWVzXzsKKyAgRnJhbWUqIGZyYW1lc187CisgIEZyYW1lKiogZnJhbWVzX3RhaWxfOworICBDaHVuayogY2h1bmtzXzsgIC8vIG5vbi1pbWFnZSBjaHVua3MKKyAgQ2h1bmsqKiBjaHVua3NfdGFpbF87Cit9OworCit0eXBlZGVmIGVudW0geworICBQQVJTRV9PSywKKyAgUEFSU0VfTkVFRF9NT1JFX0RBVEEsCisgIFBBUlNFX0VSUk9SCit9IFBhcnNlU3RhdHVzOworCit0eXBlZGVmIHN0cnVjdCBDaHVua1BhcnNlciB7CisgIHVpbnQ4X3QgaWRbNF07CisgIFBhcnNlU3RhdHVzICgqcGFyc2UpKFdlYlBEZW11eGVyKiBjb25zdCBkbXV4KTsKKyAgaW50ICgqdmFsaWQpKGNvbnN0IFdlYlBEZW11eGVyKiBjb25zdCBkbXV4KTsKK30gQ2h1bmtQYXJzZXI7CisKK3N0YXRpYyBQYXJzZVN0YXR1cyBQYXJzZVNpbmdsZUltYWdlKFdlYlBEZW11eGVyKiBjb25zdCBkbXV4KTsKK3N0YXRpYyBQYXJzZVN0YXR1cyBQYXJzZVZQOFgoV2ViUERlbXV4ZXIqIGNvbnN0IGRtdXgpOworc3RhdGljIGludCBJc1ZhbGlkU2ltcGxlRm9ybWF0KGNvbnN0IFdlYlBEZW11eGVyKiBjb25zdCBkbXV4KTsKK3N0YXRpYyBpbnQgSXNWYWxpZEV4dGVuZGVkRm9ybWF0KGNvbnN0IFdlYlBEZW11eGVyKiBjb25zdCBkbXV4KTsKKworc3RhdGljIGNvbnN0IENodW5rUGFyc2VyIGtNYXN0ZXJDaHVua3NbXSA9IHsKKyAgeyB7ICdWJywgJ1AnLCAnOCcsICcgJyB9LCBQYXJzZVNpbmdsZUltYWdlLCBJc1ZhbGlkU2ltcGxlRm9ybWF0IH0sCisgIHsgeyAnVicsICdQJywgJzgnLCAnTCcgfSwgUGFyc2VTaW5nbGVJbWFnZSwgSXNWYWxpZFNpbXBsZUZvcm1hdCB9LAorICB7IHsgJ1YnLCAnUCcsICc4JywgJ1gnIH0sIFBhcnNlVlA4WCwgICAgICAgIElzVmFsaWRFeHRlbmRlZEZvcm1hdCB9LAorICB7IHsgJzAnLCAnMCcsICcwJywgJzAnIH0sIE5VTEwsICAgICAgICAgICAgIE5VTEwgfSwKK307CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBXZWJQR2V0RGVtdXhWZXJzaW9uKHZvaWQpIHsKKyAgcmV0dXJuIChETVVYX01BSl9WRVJTSU9OIDw8IDE2KSB8IChETVVYX01JTl9WRVJTSU9OIDw8IDgpIHwgRE1VWF9SRVZfVkVSU0lPTjsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1lbUJ1ZmZlcgorCitzdGF0aWMgaW50IFJlbWFwTWVtQnVmZmVyKE1lbUJ1ZmZlciogY29uc3QgbWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBpZiAoc2l6ZSA8IG1lbS0+YnVmX3NpemVfKSByZXR1cm4gMDsgIC8vIGNhbid0IHJlbWFwIHRvIGEgc2hvcnRlciBidWZmZXIhCisKKyAgbWVtLT5idWZfID0gZGF0YTsKKyAgbWVtLT5lbmRfID0gbWVtLT5idWZfc2l6ZV8gPSBzaXplOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBJbml0TWVtQnVmZmVyKE1lbUJ1ZmZlciogY29uc3QgbWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgIG1lbXNldChtZW0sIDAsIHNpemVvZigqbWVtKSk7CisgIHJldHVybiBSZW1hcE1lbUJ1ZmZlcihtZW0sIGRhdGEsIHNpemUpOworfQorCisvLyBSZXR1cm4gdGhlIHJlbWFpbmluZyBkYXRhIHNpemUgYXZhaWxhYmxlIGluICdtZW0nLgorc3RhdGljIFdFQlBfSU5MSU5FIHNpemVfdCBNZW1EYXRhU2l6ZShjb25zdCBNZW1CdWZmZXIqIGNvbnN0IG1lbSkgeworICByZXR1cm4gKG1lbS0+ZW5kXyAtIG1lbS0+c3RhcnRfKTsKK30KKworLy8gUmV0dXJuIHRydWUgaWYgJ3NpemUnIGV4Y2VlZHMgdGhlIGVuZCBvZiB0aGUgUklGRiBjaHVuay4KK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgU2l6ZUlzSW52YWxpZChjb25zdCBNZW1CdWZmZXIqIGNvbnN0IG1lbSwgc2l6ZV90IHNpemUpIHsKKyAgcmV0dXJuIChzaXplID4gbWVtLT5yaWZmX2VuZF8gLSBtZW0tPnN0YXJ0Xyk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFNraXAoTWVtQnVmZmVyKiBjb25zdCBtZW0sIHNpemVfdCBzaXplKSB7CisgIG1lbS0+c3RhcnRfICs9IHNpemU7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFJld2luZChNZW1CdWZmZXIqIGNvbnN0IG1lbSwgc2l6ZV90IHNpemUpIHsKKyAgbWVtLT5zdGFydF8gLT0gc2l6ZTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGNvbnN0IHVpbnQ4X3QqIEdldEJ1ZmZlcihNZW1CdWZmZXIqIGNvbnN0IG1lbSkgeworICByZXR1cm4gbWVtLT5idWZfICsgbWVtLT5zdGFydF87Cit9CisKKy8vIFJlYWQgZnJvbSAnbWVtJyBhbmQgc2tpcCB0aGUgcmVhZCBieXRlcy4KK3N0YXRpYyBXRUJQX0lOTElORSB1aW50OF90IFJlYWRCeXRlKE1lbUJ1ZmZlciogY29uc3QgbWVtKSB7CisgIGNvbnN0IHVpbnQ4X3QgYnl0ZSA9IG1lbS0+YnVmX1ttZW0tPnN0YXJ0X107CisgIFNraXAobWVtLCAxKTsKKyAgcmV0dXJuIGJ5dGU7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgUmVhZExFMTZzKE1lbUJ1ZmZlciogY29uc3QgbWVtKSB7CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEgPSBtZW0tPmJ1Zl8gKyBtZW0tPnN0YXJ0XzsKKyAgY29uc3QgaW50IHZhbCA9IEdldExFMTYoZGF0YSk7CisgIFNraXAobWVtLCAyKTsKKyAgcmV0dXJuIHZhbDsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBSZWFkTEUyNHMoTWVtQnVmZmVyKiBjb25zdCBtZW0pIHsKKyAgY29uc3QgdWludDhfdCogY29uc3QgZGF0YSA9IG1lbS0+YnVmXyArIG1lbS0+c3RhcnRfOworICBjb25zdCBpbnQgdmFsID0gR2V0TEUyNChkYXRhKTsKKyAgU2tpcChtZW0sIDMpOworICByZXR1cm4gdmFsOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgUmVhZExFMzIoTWVtQnVmZmVyKiBjb25zdCBtZW0pIHsKKyAgY29uc3QgdWludDhfdCogY29uc3QgZGF0YSA9IG1lbS0+YnVmXyArIG1lbS0+c3RhcnRfOworICBjb25zdCB1aW50MzJfdCB2YWwgPSBHZXRMRTMyKGRhdGEpOworICBTa2lwKG1lbSwgNCk7CisgIHJldHVybiB2YWw7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTZWNvbmRhcnkgY2h1bmsgcGFyc2luZworCitzdGF0aWMgdm9pZCBBZGRDaHVuayhXZWJQRGVtdXhlciogY29uc3QgZG11eCwgQ2h1bmsqIGNvbnN0IGNodW5rKSB7CisgICpkbXV4LT5jaHVua3NfdGFpbF8gPSBjaHVuazsKKyAgY2h1bmstPm5leHRfID0gTlVMTDsKKyAgZG11eC0+Y2h1bmtzX3RhaWxfID0gJmNodW5rLT5uZXh0XzsKK30KKworLy8gQWRkIGEgZnJhbWUgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCwgZW5zdXJpbmcgdGhlIGxhc3QgZnJhbWUgaXMgY29tcGxldGUuCisvLyBSZXR1cm5zIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlLgorc3RhdGljIGludCBBZGRGcmFtZShXZWJQRGVtdXhlciogY29uc3QgZG11eCwgRnJhbWUqIGNvbnN0IGZyYW1lKSB7CisgIGNvbnN0IEZyYW1lKiBjb25zdCBsYXN0X2ZyYW1lID0gKmRtdXgtPmZyYW1lc190YWlsXzsKKyAgaWYgKGxhc3RfZnJhbWUgIT0gTlVMTCAmJiAhbGFzdF9mcmFtZS0+Y29tcGxldGVfKSByZXR1cm4gMDsKKworICAqZG11eC0+ZnJhbWVzX3RhaWxfID0gZnJhbWU7CisgIGZyYW1lLT5uZXh0XyA9IE5VTEw7CisgIGRtdXgtPmZyYW1lc190YWlsXyA9ICZmcmFtZS0+bmV4dF87CisgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBTZXRGcmFtZUluZm8oc2l6ZV90IHN0YXJ0X29mZnNldCwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lX251bSwgaW50IGNvbXBsZXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBCaXRzdHJlYW1GZWF0dXJlcyogY29uc3QgZmVhdHVyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWUqIGNvbnN0IGZyYW1lKSB7CisgIGZyYW1lLT5pbWdfY29tcG9uZW50c19bMF0ub2Zmc2V0XyA9IHN0YXJ0X29mZnNldDsKKyAgZnJhbWUtPmltZ19jb21wb25lbnRzX1swXS5zaXplXyA9IHNpemU7CisgIGZyYW1lLT53aWR0aF8gPSBmZWF0dXJlcy0+d2lkdGg7CisgIGZyYW1lLT5oZWlnaHRfID0gZmVhdHVyZXMtPmhlaWdodDsKKyAgZnJhbWUtPmhhc19hbHBoYV8gfD0gZmVhdHVyZXMtPmhhc19hbHBoYTsKKyAgZnJhbWUtPmZyYW1lX251bV8gPSBmcmFtZV9udW07CisgIGZyYW1lLT5jb21wbGV0ZV8gPSBjb21wbGV0ZTsKK30KKworLy8gU3RvcmUgaW1hZ2UgYmVhcmluZyBjaHVua3MgdG8gJ2ZyYW1lJy4gJ21pbl9zaXplJyBpcyBhbiBvcHRpb25hbCBzaXplCisvLyByZXF1aXJlbWVudCwgaXQgbWF5IGJlIHplcm8uCitzdGF0aWMgUGFyc2VTdGF0dXMgU3RvcmVGcmFtZShpbnQgZnJhbWVfbnVtLCB1aW50MzJfdCBtaW5fc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbUJ1ZmZlciogY29uc3QgbWVtLCBGcmFtZSogY29uc3QgZnJhbWUpIHsKKyAgaW50IGFscGhhX2NodW5rcyA9IDA7CisgIGludCBpbWFnZV9jaHVua3MgPSAwOworICBpbnQgZG9uZSA9IChNZW1EYXRhU2l6ZShtZW0pIDwgQ0hVTktfSEVBREVSX1NJWkUgfHwKKyAgICAgICAgICAgICAgTWVtRGF0YVNpemUobWVtKSA8IG1pbl9zaXplKTsKKyAgUGFyc2VTdGF0dXMgc3RhdHVzID0gUEFSU0VfT0s7CisKKyAgaWYgKGRvbmUpIHJldHVybiBQQVJTRV9ORUVEX01PUkVfREFUQTsKKworICBkbyB7CisgICAgY29uc3Qgc2l6ZV90IGNodW5rX3N0YXJ0X29mZnNldCA9IG1lbS0+c3RhcnRfOworICAgIGNvbnN0IHVpbnQzMl90IGZvdXJjYyA9IFJlYWRMRTMyKG1lbSk7CisgICAgY29uc3QgdWludDMyX3QgcGF5bG9hZF9zaXplID0gUmVhZExFMzIobWVtKTsKKyAgICBjb25zdCB1aW50MzJfdCBwYXlsb2FkX3NpemVfcGFkZGVkID0gcGF5bG9hZF9zaXplICsgKHBheWxvYWRfc2l6ZSAmIDEpOworICAgIGNvbnN0IHNpemVfdCBwYXlsb2FkX2F2YWlsYWJsZSA9IChwYXlsb2FkX3NpemVfcGFkZGVkID4gTWVtRGF0YVNpemUobWVtKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBNZW1EYXRhU2l6ZShtZW0pIDogcGF5bG9hZF9zaXplX3BhZGRlZDsKKyAgICBjb25zdCBzaXplX3QgY2h1bmtfc2l6ZSA9IENIVU5LX0hFQURFUl9TSVpFICsgcGF5bG9hZF9hdmFpbGFibGU7CisKKyAgICBpZiAocGF5bG9hZF9zaXplID4gTUFYX0NIVU5LX1BBWUxPQUQpIHJldHVybiBQQVJTRV9FUlJPUjsKKyAgICBpZiAoU2l6ZUlzSW52YWxpZChtZW0sIHBheWxvYWRfc2l6ZV9wYWRkZWQpKSByZXR1cm4gUEFSU0VfRVJST1I7CisgICAgaWYgKHBheWxvYWRfc2l6ZV9wYWRkZWQgPiBNZW1EYXRhU2l6ZShtZW0pKSBzdGF0dXMgPSBQQVJTRV9ORUVEX01PUkVfREFUQTsKKworICAgIHN3aXRjaCAoZm91cmNjKSB7CisgICAgICBjYXNlIE1LRk9VUkNDKCdBJywgJ0wnLCAnUCcsICdIJyk6CisgICAgICAgIGlmIChhbHBoYV9jaHVua3MgPT0gMCkgeworICAgICAgICAgICsrYWxwaGFfY2h1bmtzOworICAgICAgICAgIGZyYW1lLT5pbWdfY29tcG9uZW50c19bMV0ub2Zmc2V0XyA9IGNodW5rX3N0YXJ0X29mZnNldDsKKyAgICAgICAgICBmcmFtZS0+aW1nX2NvbXBvbmVudHNfWzFdLnNpemVfID0gY2h1bmtfc2l6ZTsKKyAgICAgICAgICBmcmFtZS0+aGFzX2FscGhhXyA9IDE7CisgICAgICAgICAgZnJhbWUtPmZyYW1lX251bV8gPSBmcmFtZV9udW07CisgICAgICAgICAgU2tpcChtZW0sIHBheWxvYWRfYXZhaWxhYmxlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIERvbmU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE1LRk9VUkNDKCdWJywgJ1AnLCAnOCcsICdMJyk6CisgICAgICAgIGlmIChhbHBoYV9jaHVua3MgPiAwKSByZXR1cm4gUEFSU0VfRVJST1I7ICAvLyBWUDhMIGhhcyBpdHMgb3duIGFscGhhCisgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgY2FzZSBNS0ZPVVJDQygnVicsICdQJywgJzgnLCAnICcpOgorICAgICAgICBpZiAoaW1hZ2VfY2h1bmtzID09IDApIHsKKyAgICAgICAgICAvLyBFeHRyYWN0IHRoZSBiaXRzdHJlYW0gZmVhdHVyZXMsIHRvbGVyYXRpbmcgZmFpbHVyZXMgd2hlbiB0aGUgZGF0YQorICAgICAgICAgIC8vIGlzIGluY29tcGxldGUuCisgICAgICAgICAgV2ViUEJpdHN0cmVhbUZlYXR1cmVzIGZlYXR1cmVzOworICAgICAgICAgIGNvbnN0IFZQOFN0YXR1c0NvZGUgdnA4X3N0YXR1cyA9CisgICAgICAgICAgICAgIFdlYlBHZXRGZWF0dXJlcyhtZW0tPmJ1Zl8gKyBjaHVua19zdGFydF9vZmZzZXQsIGNodW5rX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmVhdHVyZXMpOworICAgICAgICAgIGlmIChzdGF0dXMgPT0gUEFSU0VfTkVFRF9NT1JFX0RBVEEgJiYKKyAgICAgICAgICAgICAgdnA4X3N0YXR1cyA9PSBWUDhfU1RBVFVTX05PVF9FTk9VR0hfREFUQSkgeworICAgICAgICAgICAgcmV0dXJuIFBBUlNFX05FRURfTU9SRV9EQVRBOworICAgICAgICAgIH0gZWxzZSBpZiAodnA4X3N0YXR1cyAhPSBWUDhfU1RBVFVTX09LKSB7CisgICAgICAgICAgICAvLyBXZSBoYXZlIGVub3VnaCBkYXRhLCBhbmQgeWV0IFdlYlBHZXRGZWF0dXJlcygpIGZhaWxlZC4KKyAgICAgICAgICAgIHJldHVybiBQQVJTRV9FUlJPUjsKKyAgICAgICAgICB9CisgICAgICAgICAgKytpbWFnZV9jaHVua3M7CisgICAgICAgICAgU2V0RnJhbWVJbmZvKGNodW5rX3N0YXJ0X29mZnNldCwgY2h1bmtfc2l6ZSwgZnJhbWVfbnVtLAorICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPT0gUEFSU0VfT0ssICZmZWF0dXJlcywgZnJhbWUpOworICAgICAgICAgIFNraXAobWVtLCBwYXlsb2FkX2F2YWlsYWJsZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBEb25lOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworIERvbmU6CisgICAgICBkZWZhdWx0OgorICAgICAgICAvLyBSZXN0b3JlIGZvdXJjYy9zaXplIHdoZW4gbW92aW5nIHVwIG9uZSBsZXZlbCBpbiBwYXJzaW5nLgorICAgICAgICBSZXdpbmQobWVtLCBDSFVOS19IRUFERVJfU0laRSk7CisgICAgICAgIGRvbmUgPSAxOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAobWVtLT5zdGFydF8gPT0gbWVtLT5yaWZmX2VuZF8pIHsKKyAgICAgIGRvbmUgPSAxOworICAgIH0gZWxzZSBpZiAoTWVtRGF0YVNpemUobWVtKSA8IENIVU5LX0hFQURFUl9TSVpFKSB7CisgICAgICBzdGF0dXMgPSBQQVJTRV9ORUVEX01PUkVfREFUQTsKKyAgICB9CisgIH0gd2hpbGUgKCFkb25lICYmIHN0YXR1cyA9PSBQQVJTRV9PSyk7CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLy8gQ3JlYXRlcyBhIG5ldyBGcmFtZSBpZiAnYWN0dWFsX3NpemUnIGlzIHdpdGhpbiBib3VuZHMgYW5kICdtZW0nIGNvbnRhaW5zCisvLyBlbm91Z2ggZGF0YSAoJ21pbl9zaXplJykgdG8gcGFyc2UgdGhlIHBheWxvYWQuCisvLyBSZXR1cm5zIFBBUlNFX09LIG9uIHN1Y2Nlc3Mgd2l0aCAqZnJhbWUgcG9pbnRpbmcgdG8gdGhlIG5ldyBGcmFtZS4KKy8vIFJldHVybnMgUEFSU0VfTkVFRF9NT1JFX0RBVEEgd2l0aCBpbnN1ZmZpY2llbnQgZGF0YSwgUEFSU0VfRVJST1Igb3RoZXJ3aXNlLgorc3RhdGljIFBhcnNlU3RhdHVzIE5ld0ZyYW1lKGNvbnN0IE1lbUJ1ZmZlciogY29uc3QgbWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1pbl9zaXplLCB1aW50MzJfdCBhY3R1YWxfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtZSoqIGZyYW1lKSB7CisgIGlmIChTaXplSXNJbnZhbGlkKG1lbSwgbWluX3NpemUpKSByZXR1cm4gUEFSU0VfRVJST1I7CisgIGlmIChhY3R1YWxfc2l6ZSA8IG1pbl9zaXplKSByZXR1cm4gUEFSU0VfRVJST1I7CisgIGlmIChNZW1EYXRhU2l6ZShtZW0pIDwgbWluX3NpemUpICByZXR1cm4gUEFSU0VfTkVFRF9NT1JFX0RBVEE7CisKKyAgKmZyYW1lID0gKEZyYW1lKilXZWJQU2FmZUNhbGxvYygxVUxMLCBzaXplb2YoKipmcmFtZSkpOworICByZXR1cm4gKCpmcmFtZSA9PSBOVUxMKSA/IFBBUlNFX0VSUk9SIDogUEFSU0VfT0s7Cit9CisKKy8vIFBhcnNlIGEgJ0FOTUYnIGNodW5rIGFuZCBhbnkgaW1hZ2UgYmVhcmluZyBjaHVua3MgdGhhdCBpbW1lZGlhdGVseSBmb2xsb3cuCisvLyAnZnJhbWVfY2h1bmtfc2l6ZScgaXMgdGhlIHByZXZpb3VzbHkgdmFsaWRhdGVkLCBwYWRkZWQgY2h1bmsgc2l6ZS4KK3N0YXRpYyBQYXJzZVN0YXR1cyBQYXJzZUFuaW1hdGlvbkZyYW1lKAorICAgIFdlYlBEZW11eGVyKiBjb25zdCBkbXV4LCB1aW50MzJfdCBmcmFtZV9jaHVua19zaXplKSB7CisgIGNvbnN0IGludCBpc19hbmltYXRpb24gPSAhIShkbXV4LT5mZWF0dXJlX2ZsYWdzXyAmIEFOSU1BVElPTl9GTEFHKTsKKyAgY29uc3QgdWludDMyX3QgYW5tZl9wYXlsb2FkX3NpemUgPSBmcmFtZV9jaHVua19zaXplIC0gQU5NRl9DSFVOS19TSVpFOworICBpbnQgYWRkZWRfZnJhbWUgPSAwOworICBpbnQgYml0czsKKyAgTWVtQnVmZmVyKiBjb25zdCBtZW0gPSAmZG11eC0+bWVtXzsKKyAgRnJhbWUqIGZyYW1lOworICBQYXJzZVN0YXR1cyBzdGF0dXMgPQorICAgICAgTmV3RnJhbWUobWVtLCBBTk1GX0NIVU5LX1NJWkUsIGZyYW1lX2NodW5rX3NpemUsICZmcmFtZSk7CisgIGlmIChzdGF0dXMgIT0gUEFSU0VfT0spIHJldHVybiBzdGF0dXM7CisKKyAgZnJhbWUtPnhfb2Zmc2V0XyAgICAgICA9IDIgKiBSZWFkTEUyNHMobWVtKTsKKyAgZnJhbWUtPnlfb2Zmc2V0XyAgICAgICA9IDIgKiBSZWFkTEUyNHMobWVtKTsKKyAgZnJhbWUtPndpZHRoXyAgICAgICAgICA9IDEgKyBSZWFkTEUyNHMobWVtKTsKKyAgZnJhbWUtPmhlaWdodF8gICAgICAgICA9IDEgKyBSZWFkTEUyNHMobWVtKTsKKyAgZnJhbWUtPmR1cmF0aW9uXyAgICAgICA9IFJlYWRMRTI0cyhtZW0pOworICBiaXRzID0gUmVhZEJ5dGUobWVtKTsKKyAgZnJhbWUtPmRpc3Bvc2VfbWV0aG9kXyA9CisgICAgICAoYml0cyAmIDEpID8gV0VCUF9NVVhfRElTUE9TRV9CQUNLR1JPVU5EIDogV0VCUF9NVVhfRElTUE9TRV9OT05FOworICBmcmFtZS0+YmxlbmRfbWV0aG9kXyA9IChiaXRzICYgMikgPyBXRUJQX01VWF9OT19CTEVORCA6IFdFQlBfTVVYX0JMRU5EOworICBpZiAoZnJhbWUtPndpZHRoXyAqICh1aW50NjRfdClmcmFtZS0+aGVpZ2h0XyA+PSBNQVhfSU1BR0VfQVJFQSkgeworICAgIFdlYlBTYWZlRnJlZShmcmFtZSk7CisgICAgcmV0dXJuIFBBUlNFX0VSUk9SOworICB9CisKKyAgLy8gU3RvcmUgYSBmcmFtZSBvbmx5IGlmIHRoZSBhbmltYXRpb24gZmxhZyBpcyBzZXQgdGhlcmUgaXMgc29tZSBkYXRhIGZvcgorICAvLyB0aGlzIGZyYW1lIGlzIGF2YWlsYWJsZS4KKyAgc3RhdHVzID0gU3RvcmVGcmFtZShkbXV4LT5udW1fZnJhbWVzXyArIDEsIGFubWZfcGF5bG9hZF9zaXplLCBtZW0sIGZyYW1lKTsKKyAgaWYgKHN0YXR1cyAhPSBQQVJTRV9FUlJPUiAmJiBpc19hbmltYXRpb24gJiYgZnJhbWUtPmZyYW1lX251bV8gPiAwKSB7CisgICAgYWRkZWRfZnJhbWUgPSBBZGRGcmFtZShkbXV4LCBmcmFtZSk7CisgICAgaWYgKGFkZGVkX2ZyYW1lKSB7CisgICAgICArK2RtdXgtPm51bV9mcmFtZXNfOworICAgIH0gZWxzZSB7CisgICAgICBzdGF0dXMgPSBQQVJTRV9FUlJPUjsKKyAgICB9CisgIH0KKworICBpZiAoIWFkZGVkX2ZyYW1lKSBXZWJQU2FmZUZyZWUoZnJhbWUpOworICByZXR1cm4gc3RhdHVzOworfQorCisvLyBHZW5lcmFsIGNodW5rIHN0b3JhZ2UsIHN0YXJ0aW5nIHdpdGggdGhlIGhlYWRlciBhdCAnc3RhcnRfb2Zmc2V0JywgYWxsb3dpbmcKKy8vIHRoZSB1c2VyIHRvIHJlcXVlc3QgdGhlIHBheWxvYWQgdmlhIGEgZm91cmNjIHN0cmluZy4gJ3NpemUnIGluY2x1ZGVzIHRoZQorLy8gaGVhZGVyIGFuZCB0aGUgdW5wYWRkZWQgcGF5bG9hZCBzaXplLgorLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZS4KK3N0YXRpYyBpbnQgU3RvcmVDaHVuayhXZWJQRGVtdXhlciogY29uc3QgZG11eCwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3RhcnRfb2Zmc2V0LCB1aW50MzJfdCBzaXplKSB7CisgIENodW5rKiBjb25zdCBjaHVuayA9IChDaHVuayopV2ViUFNhZmVDYWxsb2MoMVVMTCwgc2l6ZW9mKCpjaHVuaykpOworICBpZiAoY2h1bmsgPT0gTlVMTCkgcmV0dXJuIDA7CisKKyAgY2h1bmstPmRhdGFfLm9mZnNldF8gPSBzdGFydF9vZmZzZXQ7CisgIGNodW5rLT5kYXRhXy5zaXplXyA9IHNpemU7CisgIEFkZENodW5rKGRtdXgsIGNodW5rKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQcmltYXJ5IGNodW5rIHBhcnNpbmcKKworc3RhdGljIFBhcnNlU3RhdHVzIFJlYWRIZWFkZXIoTWVtQnVmZmVyKiBjb25zdCBtZW0pIHsKKyAgY29uc3Qgc2l6ZV90IG1pbl9zaXplID0gUklGRl9IRUFERVJfU0laRSArIENIVU5LX0hFQURFUl9TSVpFOworICB1aW50MzJfdCByaWZmX3NpemU7CisKKyAgLy8gQmFzaWMgZmlsZSBsZXZlbCB2YWxpZGF0aW9uLgorICBpZiAoTWVtRGF0YVNpemUobWVtKSA8IG1pbl9zaXplKSByZXR1cm4gUEFSU0VfTkVFRF9NT1JFX0RBVEE7CisgIGlmIChtZW1jbXAoR2V0QnVmZmVyKG1lbSksICJSSUZGIiwgQ0hVTktfU0laRV9CWVRFUykgfHwKKyAgICAgIG1lbWNtcChHZXRCdWZmZXIobWVtKSArIENIVU5LX0hFQURFUl9TSVpFLCAiV0VCUCIsIENIVU5LX1NJWkVfQllURVMpKSB7CisgICAgcmV0dXJuIFBBUlNFX0VSUk9SOworICB9CisKKyAgcmlmZl9zaXplID0gR2V0TEUzMihHZXRCdWZmZXIobWVtKSArIFRBR19TSVpFKTsKKyAgaWYgKHJpZmZfc2l6ZSA8IENIVU5LX0hFQURFUl9TSVpFKSByZXR1cm4gUEFSU0VfRVJST1I7CisgIGlmIChyaWZmX3NpemUgPiBNQVhfQ0hVTktfUEFZTE9BRCkgcmV0dXJuIFBBUlNFX0VSUk9SOworCisgIC8vIFRoZXJlJ3Mgbm8gcG9pbnQgaW4gcmVhZGluZyBwYXN0IHRoZSBlbmQgb2YgdGhlIFJJRkYgY2h1bmsKKyAgbWVtLT5yaWZmX2VuZF8gPSByaWZmX3NpemUgKyBDSFVOS19IRUFERVJfU0laRTsKKyAgaWYgKG1lbS0+YnVmX3NpemVfID4gbWVtLT5yaWZmX2VuZF8pIHsKKyAgICBtZW0tPmJ1Zl9zaXplXyA9IG1lbS0+ZW5kXyA9IG1lbS0+cmlmZl9lbmRfOworICB9CisKKyAgU2tpcChtZW0sIFJJRkZfSEVBREVSX1NJWkUpOworICByZXR1cm4gUEFSU0VfT0s7Cit9CisKK3N0YXRpYyBQYXJzZVN0YXR1cyBQYXJzZVNpbmdsZUltYWdlKFdlYlBEZW11eGVyKiBjb25zdCBkbXV4KSB7CisgIGNvbnN0IHNpemVfdCBtaW5fc2l6ZSA9IENIVU5LX0hFQURFUl9TSVpFOworICBNZW1CdWZmZXIqIGNvbnN0IG1lbSA9ICZkbXV4LT5tZW1fOworICBGcmFtZSogZnJhbWU7CisgIFBhcnNlU3RhdHVzIHN0YXR1czsKKyAgaW50IGltYWdlX2FkZGVkID0gMDsKKworICBpZiAoZG11eC0+ZnJhbWVzXyAhPSBOVUxMKSByZXR1cm4gUEFSU0VfRVJST1I7CisgIGlmIChTaXplSXNJbnZhbGlkKG1lbSwgbWluX3NpemUpKSByZXR1cm4gUEFSU0VfRVJST1I7CisgIGlmIChNZW1EYXRhU2l6ZShtZW0pIDwgbWluX3NpemUpIHJldHVybiBQQVJTRV9ORUVEX01PUkVfREFUQTsKKworICBmcmFtZSA9IChGcmFtZSopV2ViUFNhZmVDYWxsb2MoMVVMTCwgc2l6ZW9mKCpmcmFtZSkpOworICBpZiAoZnJhbWUgPT0gTlVMTCkgcmV0dXJuIFBBUlNFX0VSUk9SOworCisgIC8vIEZvciB0aGUgc2luZ2xlIGltYWdlIGNhc2Ugd2UgYWxsb3cgcGFyc2luZyBvZiBhIHBhcnRpYWwgZnJhbWUsIHNvIG5vCisgIC8vIG1pbmltdW0gc2l6ZSBpcyBpbXBvc2VkIGhlcmUuCisgIHN0YXR1cyA9IFN0b3JlRnJhbWUoMSwgMCwgJmRtdXgtPm1lbV8sIGZyYW1lKTsKKyAgaWYgKHN0YXR1cyAhPSBQQVJTRV9FUlJPUikgeworICAgIGNvbnN0IGludCBoYXNfYWxwaGEgPSAhIShkbXV4LT5mZWF0dXJlX2ZsYWdzXyAmIEFMUEhBX0ZMQUcpOworICAgIC8vIENsZWFyIGFueSBhbHBoYSB3aGVuIHRoZSBhbHBoYSBmbGFnIGlzIG1pc3NpbmcuCisgICAgaWYgKCFoYXNfYWxwaGEgJiYgZnJhbWUtPmltZ19jb21wb25lbnRzX1sxXS5zaXplXyA+IDApIHsKKyAgICAgIGZyYW1lLT5pbWdfY29tcG9uZW50c19bMV0ub2Zmc2V0XyA9IDA7CisgICAgICBmcmFtZS0+aW1nX2NvbXBvbmVudHNfWzFdLnNpemVfID0gMDsKKyAgICAgIGZyYW1lLT5oYXNfYWxwaGFfID0gMDsKKyAgICB9CisKKyAgICAvLyBVc2UgdGhlIGZyYW1lIHdpZHRoL2hlaWdodCBhcyB0aGUgY2FudmFzIHZhbHVlcyBmb3Igbm9uLXZwOHggZmlsZXMuCisgICAgLy8gQWxzbywgc2V0IEFMUEhBX0ZMQUcgaWYgdGhpcyBpcyBhIGxvc3NsZXNzIGltYWdlIHdpdGggYWxwaGEuCisgICAgaWYgKCFkbXV4LT5pc19leHRfZm9ybWF0XyAmJiBmcmFtZS0+d2lkdGhfID4gMCAmJiBmcmFtZS0+aGVpZ2h0XyA+IDApIHsKKyAgICAgIGRtdXgtPnN0YXRlXyA9IFdFQlBfREVNVVhfUEFSU0VEX0hFQURFUjsKKyAgICAgIGRtdXgtPmNhbnZhc193aWR0aF8gPSBmcmFtZS0+d2lkdGhfOworICAgICAgZG11eC0+Y2FudmFzX2hlaWdodF8gPSBmcmFtZS0+aGVpZ2h0XzsKKyAgICAgIGRtdXgtPmZlYXR1cmVfZmxhZ3NfIHw9IGZyYW1lLT5oYXNfYWxwaGFfID8gQUxQSEFfRkxBRyA6IDA7CisgICAgfQorICAgIGlmICghQWRkRnJhbWUoZG11eCwgZnJhbWUpKSB7CisgICAgICBzdGF0dXMgPSBQQVJTRV9FUlJPUjsgIC8vIGxhc3QgZnJhbWUgd2FzIGxlZnQgaW5jb21wbGV0ZQorICAgIH0gZWxzZSB7CisgICAgICBpbWFnZV9hZGRlZCA9IDE7CisgICAgICBkbXV4LT5udW1fZnJhbWVzXyA9IDE7CisgICAgfQorICB9CisKKyAgaWYgKCFpbWFnZV9hZGRlZCkgV2ViUFNhZmVGcmVlKGZyYW1lKTsKKyAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIFBhcnNlU3RhdHVzIFBhcnNlVlA4WENodW5rcyhXZWJQRGVtdXhlciogY29uc3QgZG11eCkgeworICBjb25zdCBpbnQgaXNfYW5pbWF0aW9uID0gISEoZG11eC0+ZmVhdHVyZV9mbGFnc18gJiBBTklNQVRJT05fRkxBRyk7CisgIE1lbUJ1ZmZlciogY29uc3QgbWVtID0gJmRtdXgtPm1lbV87CisgIGludCBhbmltX2NodW5rcyA9IDA7CisgIFBhcnNlU3RhdHVzIHN0YXR1cyA9IFBBUlNFX09LOworCisgIGRvIHsKKyAgICBpbnQgc3RvcmVfY2h1bmsgPSAxOworICAgIGNvbnN0IHNpemVfdCBjaHVua19zdGFydF9vZmZzZXQgPSBtZW0tPnN0YXJ0XzsKKyAgICBjb25zdCB1aW50MzJfdCBmb3VyY2MgPSBSZWFkTEUzMihtZW0pOworICAgIGNvbnN0IHVpbnQzMl90IGNodW5rX3NpemUgPSBSZWFkTEUzMihtZW0pOworICAgIGNvbnN0IHVpbnQzMl90IGNodW5rX3NpemVfcGFkZGVkID0gY2h1bmtfc2l6ZSArIChjaHVua19zaXplICYgMSk7CisKKyAgICBpZiAoY2h1bmtfc2l6ZSA+IE1BWF9DSFVOS19QQVlMT0FEKSByZXR1cm4gUEFSU0VfRVJST1I7CisgICAgaWYgKFNpemVJc0ludmFsaWQobWVtLCBjaHVua19zaXplX3BhZGRlZCkpIHJldHVybiBQQVJTRV9FUlJPUjsKKworICAgIHN3aXRjaCAoZm91cmNjKSB7CisgICAgICBjYXNlIE1LRk9VUkNDKCdWJywgJ1AnLCAnOCcsICdYJyk6IHsKKyAgICAgICAgcmV0dXJuIFBBUlNFX0VSUk9SOworICAgICAgfQorICAgICAgY2FzZSBNS0ZPVVJDQygnQScsICdMJywgJ1AnLCAnSCcpOgorICAgICAgY2FzZSBNS0ZPVVJDQygnVicsICdQJywgJzgnLCAnICcpOgorICAgICAgY2FzZSBNS0ZPVVJDQygnVicsICdQJywgJzgnLCAnTCcpOiB7CisgICAgICAgIC8vIGNoZWNrIHRoYXQgdGhpcyBpc24ndCBhbiBhbmltYXRpb24gKGFsbCBmcmFtZXMgc2hvdWxkIGJlIGluIGFuIEFOTUYpLgorICAgICAgICBpZiAoYW5pbV9jaHVua3MgPiAwIHx8IGlzX2FuaW1hdGlvbikgcmV0dXJuIFBBUlNFX0VSUk9SOworCisgICAgICAgIFJld2luZChtZW0sIENIVU5LX0hFQURFUl9TSVpFKTsKKyAgICAgICAgc3RhdHVzID0gUGFyc2VTaW5nbGVJbWFnZShkbXV4KTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIE1LRk9VUkNDKCdBJywgJ04nLCAnSScsICdNJyk6IHsKKyAgICAgICAgaWYgKGNodW5rX3NpemVfcGFkZGVkIDwgQU5JTV9DSFVOS19TSVpFKSByZXR1cm4gUEFSU0VfRVJST1I7CisKKyAgICAgICAgaWYgKE1lbURhdGFTaXplKG1lbSkgPCBjaHVua19zaXplX3BhZGRlZCkgeworICAgICAgICAgIHN0YXR1cyA9IFBBUlNFX05FRURfTU9SRV9EQVRBOworICAgICAgICB9IGVsc2UgaWYgKGFuaW1fY2h1bmtzID09IDApIHsKKyAgICAgICAgICArK2FuaW1fY2h1bmtzOworICAgICAgICAgIGRtdXgtPmJnY29sb3JfID0gUmVhZExFMzIobWVtKTsKKyAgICAgICAgICBkbXV4LT5sb29wX2NvdW50XyA9IFJlYWRMRTE2cyhtZW0pOworICAgICAgICAgIFNraXAobWVtLCBjaHVua19zaXplX3BhZGRlZCAtIEFOSU1fQ0hVTktfU0laRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3RvcmVfY2h1bmsgPSAwOworICAgICAgICAgIGdvdG8gU2tpcDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgTUtGT1VSQ0MoJ0EnLCAnTicsICdNJywgJ0YnKTogeworICAgICAgICBpZiAoYW5pbV9jaHVua3MgPT0gMCkgcmV0dXJuIFBBUlNFX0VSUk9SOyAgLy8gJ0FOSU0nIHByZWNlZGVzIGZyYW1lcy4KKyAgICAgICAgc3RhdHVzID0gUGFyc2VBbmltYXRpb25GcmFtZShkbXV4LCBjaHVua19zaXplX3BhZGRlZCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBNS0ZPVVJDQygnSScsICdDJywgJ0MnLCAnUCcpOiB7CisgICAgICAgIHN0b3JlX2NodW5rID0gISEoZG11eC0+ZmVhdHVyZV9mbGFnc18gJiBJQ0NQX0ZMQUcpOworICAgICAgICBnb3RvIFNraXA7CisgICAgICB9CisgICAgICBjYXNlIE1LRk9VUkNDKCdFJywgJ1gnLCAnSScsICdGJyk6IHsKKyAgICAgICAgc3RvcmVfY2h1bmsgPSAhIShkbXV4LT5mZWF0dXJlX2ZsYWdzXyAmIEVYSUZfRkxBRyk7CisgICAgICAgIGdvdG8gU2tpcDsKKyAgICAgIH0KKyAgICAgIGNhc2UgTUtGT1VSQ0MoJ1gnLCAnTScsICdQJywgJyAnKTogeworICAgICAgICBzdG9yZV9jaHVuayA9ICEhKGRtdXgtPmZlYXR1cmVfZmxhZ3NfICYgWE1QX0ZMQUcpOworICAgICAgICBnb3RvIFNraXA7CisgICAgICB9CisgU2tpcDoKKyAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgaWYgKGNodW5rX3NpemVfcGFkZGVkIDw9IE1lbURhdGFTaXplKG1lbSkpIHsKKyAgICAgICAgICBpZiAoc3RvcmVfY2h1bmspIHsKKyAgICAgICAgICAgIC8vIFN0b3JlIG9ubHkgdGhlIGNodW5rIGhlYWRlciBhbmQgdW5wYWRkZWQgc2l6ZSBhcyBvbmx5IHRoZSBwYXlsb2FkCisgICAgICAgICAgICAvLyB3aWxsIGJlIHJldHVybmVkIHRvIHRoZSB1c2VyLgorICAgICAgICAgICAgaWYgKCFTdG9yZUNodW5rKGRtdXgsIGNodW5rX3N0YXJ0X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSFVOS19IRUFERVJfU0laRSArIGNodW5rX3NpemUpKSB7CisgICAgICAgICAgICAgIHJldHVybiBQQVJTRV9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgU2tpcChtZW0sIGNodW5rX3NpemVfcGFkZGVkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzdGF0dXMgPSBQQVJTRV9ORUVEX01PUkVfREFUQTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGlmIChtZW0tPnN0YXJ0XyA9PSBtZW0tPnJpZmZfZW5kXykgeworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIGlmIChNZW1EYXRhU2l6ZShtZW0pIDwgQ0hVTktfSEVBREVSX1NJWkUpIHsKKyAgICAgIHN0YXR1cyA9IFBBUlNFX05FRURfTU9SRV9EQVRBOworICAgIH0KKyAgfSB3aGlsZSAoc3RhdHVzID09IFBBUlNFX09LKTsKKworICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgUGFyc2VTdGF0dXMgUGFyc2VWUDhYKFdlYlBEZW11eGVyKiBjb25zdCBkbXV4KSB7CisgIE1lbUJ1ZmZlciogY29uc3QgbWVtID0gJmRtdXgtPm1lbV87CisgIHVpbnQzMl90IHZwOHhfc2l6ZTsKKworICBpZiAoTWVtRGF0YVNpemUobWVtKSA8IENIVU5LX0hFQURFUl9TSVpFKSByZXR1cm4gUEFSU0VfTkVFRF9NT1JFX0RBVEE7CisKKyAgZG11eC0+aXNfZXh0X2Zvcm1hdF8gPSAxOworICBTa2lwKG1lbSwgVEFHX1NJWkUpOyAgLy8gVlA4WAorICB2cDh4X3NpemUgPSBSZWFkTEUzMihtZW0pOworICBpZiAodnA4eF9zaXplID4gTUFYX0NIVU5LX1BBWUxPQUQpIHJldHVybiBQQVJTRV9FUlJPUjsKKyAgaWYgKHZwOHhfc2l6ZSA8IFZQOFhfQ0hVTktfU0laRSkgcmV0dXJuIFBBUlNFX0VSUk9SOworICB2cDh4X3NpemUgKz0gdnA4eF9zaXplICYgMTsKKyAgaWYgKFNpemVJc0ludmFsaWQobWVtLCB2cDh4X3NpemUpKSByZXR1cm4gUEFSU0VfRVJST1I7CisgIGlmIChNZW1EYXRhU2l6ZShtZW0pIDwgdnA4eF9zaXplKSByZXR1cm4gUEFSU0VfTkVFRF9NT1JFX0RBVEE7CisKKyAgZG11eC0+ZmVhdHVyZV9mbGFnc18gPSBSZWFkQnl0ZShtZW0pOworICBTa2lwKG1lbSwgMyk7ICAvLyBSZXNlcnZlZC4KKyAgZG11eC0+Y2FudmFzX3dpZHRoXyAgPSAxICsgUmVhZExFMjRzKG1lbSk7CisgIGRtdXgtPmNhbnZhc19oZWlnaHRfID0gMSArIFJlYWRMRTI0cyhtZW0pOworICBpZiAoZG11eC0+Y2FudmFzX3dpZHRoXyAqICh1aW50NjRfdClkbXV4LT5jYW52YXNfaGVpZ2h0XyA+PSBNQVhfSU1BR0VfQVJFQSkgeworICAgIHJldHVybiBQQVJTRV9FUlJPUjsgIC8vIGltYWdlIGZpbmFsIGRpbWVuc2lvbiBpcyB0b28gbGFyZ2UKKyAgfQorICBTa2lwKG1lbSwgdnA4eF9zaXplIC0gVlA4WF9DSFVOS19TSVpFKTsgIC8vIHNraXAgYW55IHRyYWlsaW5nIGRhdGEuCisgIGRtdXgtPnN0YXRlXyA9IFdFQlBfREVNVVhfUEFSU0VEX0hFQURFUjsKKworICBpZiAoU2l6ZUlzSW52YWxpZChtZW0sIENIVU5LX0hFQURFUl9TSVpFKSkgcmV0dXJuIFBBUlNFX0VSUk9SOworICBpZiAoTWVtRGF0YVNpemUobWVtKSA8IENIVU5LX0hFQURFUl9TSVpFKSByZXR1cm4gUEFSU0VfTkVFRF9NT1JFX0RBVEE7CisKKyAgcmV0dXJuIFBhcnNlVlA4WENodW5rcyhkbXV4KTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZvcm1hdCB2YWxpZGF0aW9uCisKK3N0YXRpYyBpbnQgSXNWYWxpZFNpbXBsZUZvcm1hdChjb25zdCBXZWJQRGVtdXhlciogY29uc3QgZG11eCkgeworICBjb25zdCBGcmFtZSogY29uc3QgZnJhbWUgPSBkbXV4LT5mcmFtZXNfOworICBpZiAoZG11eC0+c3RhdGVfID09IFdFQlBfREVNVVhfUEFSU0lOR19IRUFERVIpIHJldHVybiAxOworCisgIGlmIChkbXV4LT5jYW52YXNfd2lkdGhfIDw9IDAgfHwgZG11eC0+Y2FudmFzX2hlaWdodF8gPD0gMCkgcmV0dXJuIDA7CisgIGlmIChkbXV4LT5zdGF0ZV8gPT0gV0VCUF9ERU1VWF9ET05FICYmIGZyYW1lID09IE5VTEwpIHJldHVybiAwOworCisgIGlmIChmcmFtZS0+d2lkdGhfIDw9IDAgfHwgZnJhbWUtPmhlaWdodF8gPD0gMCkgcmV0dXJuIDA7CisgIHJldHVybiAxOworfQorCisvLyBJZiAnZXhhY3QnIGlzIHRydWUsIGNoZWNrIHRoYXQgdGhlIGltYWdlIHJlc29sdXRpb24gbWF0Y2hlcyB0aGUgY2FudmFzLgorLy8gSWYgJ2V4YWN0JyBpcyBmYWxzZSwgY2hlY2sgdGhhdCB0aGUgeC95IG9mZnNldHMgZG8gbm90IGV4Y2VlZCB0aGUgY2FudmFzLgorc3RhdGljIGludCBDaGVja0ZyYW1lQm91bmRzKGNvbnN0IEZyYW1lKiBjb25zdCBmcmFtZSwgaW50IGV4YWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYW52YXNfd2lkdGgsIGludCBjYW52YXNfaGVpZ2h0KSB7CisgIGlmIChleGFjdCkgeworICAgIGlmIChmcmFtZS0+eF9vZmZzZXRfICE9IDAgfHwgZnJhbWUtPnlfb2Zmc2V0XyAhPSAwKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKGZyYW1lLT53aWR0aF8gIT0gY2FudmFzX3dpZHRoIHx8IGZyYW1lLT5oZWlnaHRfICE9IGNhbnZhc19oZWlnaHQpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoZnJhbWUtPnhfb2Zmc2V0XyA8IDAgfHwgZnJhbWUtPnlfb2Zmc2V0XyA8IDApIHJldHVybiAwOworICAgIGlmIChmcmFtZS0+d2lkdGhfICsgZnJhbWUtPnhfb2Zmc2V0XyA+IGNhbnZhc193aWR0aCkgcmV0dXJuIDA7CisgICAgaWYgKGZyYW1lLT5oZWlnaHRfICsgZnJhbWUtPnlfb2Zmc2V0XyA+IGNhbnZhc19oZWlnaHQpIHJldHVybiAwOworICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IElzVmFsaWRFeHRlbmRlZEZvcm1hdChjb25zdCBXZWJQRGVtdXhlciogY29uc3QgZG11eCkgeworICBjb25zdCBpbnQgaXNfYW5pbWF0aW9uID0gISEoZG11eC0+ZmVhdHVyZV9mbGFnc18gJiBBTklNQVRJT05fRkxBRyk7CisgIGNvbnN0IEZyYW1lKiBmID0gZG11eC0+ZnJhbWVzXzsKKworICBpZiAoZG11eC0+c3RhdGVfID09IFdFQlBfREVNVVhfUEFSU0lOR19IRUFERVIpIHJldHVybiAxOworCisgIGlmIChkbXV4LT5jYW52YXNfd2lkdGhfIDw9IDAgfHwgZG11eC0+Y2FudmFzX2hlaWdodF8gPD0gMCkgcmV0dXJuIDA7CisgIGlmIChkbXV4LT5sb29wX2NvdW50XyA8IDApIHJldHVybiAwOworICBpZiAoZG11eC0+c3RhdGVfID09IFdFQlBfREVNVVhfRE9ORSAmJiBkbXV4LT5mcmFtZXNfID09IE5VTEwpIHJldHVybiAwOworICBpZiAoZG11eC0+ZmVhdHVyZV9mbGFnc18gJiB+QUxMX1ZBTElEX0ZMQUdTKSByZXR1cm4gMDsgIC8vIGludmFsaWQgYml0c3RyZWFtCisKKyAgd2hpbGUgKGYgIT0gTlVMTCkgeworICAgIGNvbnN0IGludCBjdXJfZnJhbWVfc2V0ID0gZi0+ZnJhbWVfbnVtXzsKKyAgICBpbnQgZnJhbWVfY291bnQgPSAwOworCisgICAgLy8gQ2hlY2sgZnJhbWUgcHJvcGVydGllcy4KKyAgICBmb3IgKDsgZiAhPSBOVUxMICYmIGYtPmZyYW1lX251bV8gPT0gY3VyX2ZyYW1lX3NldDsgZiA9IGYtPm5leHRfKSB7CisgICAgICBjb25zdCBDaHVua0RhdGEqIGNvbnN0IGltYWdlID0gZi0+aW1nX2NvbXBvbmVudHNfOworICAgICAgY29uc3QgQ2h1bmtEYXRhKiBjb25zdCBhbHBoYSA9IGYtPmltZ19jb21wb25lbnRzXyArIDE7CisKKyAgICAgIGlmICghaXNfYW5pbWF0aW9uICYmIGYtPmZyYW1lX251bV8gPiAxKSByZXR1cm4gMDsKKworICAgICAgaWYgKGYtPmNvbXBsZXRlXykgeworICAgICAgICBpZiAoYWxwaGEtPnNpemVfID09IDAgJiYgaW1hZ2UtPnNpemVfID09IDApIHJldHVybiAwOworICAgICAgICAvLyBFbnN1cmUgYWxwaGEgcHJlY2VkZXMgaW1hZ2UgYml0c3RyZWFtLgorICAgICAgICBpZiAoYWxwaGEtPnNpemVfID4gMCAmJiBhbHBoYS0+b2Zmc2V0XyA+IGltYWdlLT5vZmZzZXRfKSB7CisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZi0+d2lkdGhfIDw9IDAgfHwgZi0+aGVpZ2h0XyA8PSAwKSByZXR1cm4gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFRoZXJlIHNob3VsZG4ndCBiZSBhIHBhcnRpYWwgZnJhbWUgaW4gYSBjb21wbGV0ZSBmaWxlLgorICAgICAgICBpZiAoZG11eC0+c3RhdGVfID09IFdFQlBfREVNVVhfRE9ORSkgcmV0dXJuIDA7CisKKyAgICAgICAgLy8gRW5zdXJlIGFscGhhIHByZWNlZGVzIGltYWdlIGJpdHN0cmVhbS4KKyAgICAgICAgaWYgKGFscGhhLT5zaXplXyA+IDAgJiYgaW1hZ2UtPnNpemVfID4gMCAmJgorICAgICAgICAgICAgYWxwaGEtPm9mZnNldF8gPiBpbWFnZS0+b2Zmc2V0XykgeworICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIC8vIFRoZXJlIHNob3VsZG4ndCBiZSBhbnkgZnJhbWVzIGFmdGVyIGFuIGluY29tcGxldGUgb25lLgorICAgICAgICBpZiAoZi0+bmV4dF8gIT0gTlVMTCkgcmV0dXJuIDA7CisgICAgICB9CisKKyAgICAgIGlmIChmLT53aWR0aF8gPiAwICYmIGYtPmhlaWdodF8gPiAwICYmCisgICAgICAgICAgIUNoZWNrRnJhbWVCb3VuZHMoZiwgIWlzX2FuaW1hdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbXV4LT5jYW52YXNfd2lkdGhfLCBkbXV4LT5jYW52YXNfaGVpZ2h0XykpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisKKyAgICAgICsrZnJhbWVfY291bnQ7CisgICAgfQorICB9CisgIHJldHVybiAxOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gV2ViUERlbXV4ZXIgb2JqZWN0CisKK3N0YXRpYyB2b2lkIEluaXREZW11eChXZWJQRGVtdXhlciogY29uc3QgZG11eCwgY29uc3QgTWVtQnVmZmVyKiBjb25zdCBtZW0pIHsKKyAgZG11eC0+c3RhdGVfID0gV0VCUF9ERU1VWF9QQVJTSU5HX0hFQURFUjsKKyAgZG11eC0+bG9vcF9jb3VudF8gPSAxOworICBkbXV4LT5iZ2NvbG9yXyA9IDB4RkZGRkZGRkY7ICAvLyBXaGl0ZSBiYWNrZ3JvdW5kIGJ5IGRlZmF1bHQuCisgIGRtdXgtPmNhbnZhc193aWR0aF8gPSAtMTsKKyAgZG11eC0+Y2FudmFzX2hlaWdodF8gPSAtMTsKKyAgZG11eC0+ZnJhbWVzX3RhaWxfID0gJmRtdXgtPmZyYW1lc187CisgIGRtdXgtPmNodW5rc190YWlsXyA9ICZkbXV4LT5jaHVua3NfOworICBkbXV4LT5tZW1fID0gKm1lbTsKK30KKworc3RhdGljIFBhcnNlU3RhdHVzIENyZWF0ZVJhd0ltYWdlRGVtdXhlcihNZW1CdWZmZXIqIGNvbnN0IG1lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUERlbXV4ZXIqKiBkZW11eGVyKSB7CisgIFdlYlBCaXRzdHJlYW1GZWF0dXJlcyBmZWF0dXJlczsKKyAgY29uc3QgVlA4U3RhdHVzQ29kZSBzdGF0dXMgPQorICAgICAgV2ViUEdldEZlYXR1cmVzKG1lbS0+YnVmXywgbWVtLT5idWZfc2l6ZV8sICZmZWF0dXJlcyk7CisgICpkZW11eGVyID0gTlVMTDsKKyAgaWYgKHN0YXR1cyAhPSBWUDhfU1RBVFVTX09LKSB7CisgICAgcmV0dXJuIChzdGF0dXMgPT0gVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEEpID8gUEFSU0VfTkVFRF9NT1JFX0RBVEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBQQVJTRV9FUlJPUjsKKyAgfQorCisgIHsKKyAgICBXZWJQRGVtdXhlciogY29uc3QgZG11eCA9IChXZWJQRGVtdXhlciopV2ViUFNhZmVDYWxsb2MoMVVMTCwgc2l6ZW9mKCpkbXV4KSk7CisgICAgRnJhbWUqIGNvbnN0IGZyYW1lID0gKEZyYW1lKilXZWJQU2FmZUNhbGxvYygxVUxMLCBzaXplb2YoKmZyYW1lKSk7CisgICAgaWYgKGRtdXggPT0gTlVMTCB8fCBmcmFtZSA9PSBOVUxMKSBnb3RvIEVycm9yOworICAgIEluaXREZW11eChkbXV4LCBtZW0pOworICAgIFNldEZyYW1lSW5mbygwLCBtZW0tPmJ1Zl9zaXplXywgMSAvKmZyYW1lX251bSovLCAxIC8qY29tcGxldGUqLywgJmZlYXR1cmVzLAorICAgICAgICAgICAgICAgICBmcmFtZSk7CisgICAgaWYgKCFBZGRGcmFtZShkbXV4LCBmcmFtZSkpIGdvdG8gRXJyb3I7CisgICAgZG11eC0+c3RhdGVfID0gV0VCUF9ERU1VWF9ET05FOworICAgIGRtdXgtPmNhbnZhc193aWR0aF8gPSBmcmFtZS0+d2lkdGhfOworICAgIGRtdXgtPmNhbnZhc19oZWlnaHRfID0gZnJhbWUtPmhlaWdodF87CisgICAgZG11eC0+ZmVhdHVyZV9mbGFnc18gfD0gZnJhbWUtPmhhc19hbHBoYV8gPyBBTFBIQV9GTEFHIDogMDsKKyAgICBkbXV4LT5udW1fZnJhbWVzXyA9IDE7CisgICAgYXNzZXJ0KElzVmFsaWRTaW1wbGVGb3JtYXQoZG11eCkpOworICAgICpkZW11eGVyID0gZG11eDsKKyAgICByZXR1cm4gUEFSU0VfT0s7CisKKyBFcnJvcjoKKyAgICBXZWJQU2FmZUZyZWUoZG11eCk7CisgICAgV2ViUFNhZmVGcmVlKGZyYW1lKTsKKyAgICByZXR1cm4gUEFSU0VfRVJST1I7CisgIH0KK30KKworV2ViUERlbXV4ZXIqIFdlYlBEZW11eEludGVybmFsKGNvbnN0IFdlYlBEYXRhKiBkYXRhLCBpbnQgYWxsb3dfcGFydGlhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQRGVtdXhTdGF0ZSogc3RhdGUsIGludCB2ZXJzaW9uKSB7CisgIGNvbnN0IENodW5rUGFyc2VyKiBwYXJzZXI7CisgIGludCBwYXJ0aWFsOworICBQYXJzZVN0YXR1cyBzdGF0dXMgPSBQQVJTRV9FUlJPUjsKKyAgTWVtQnVmZmVyIG1lbTsKKyAgV2ViUERlbXV4ZXIqIGRtdXg7CisKKyAgaWYgKHN0YXRlICE9IE5VTEwpICpzdGF0ZSA9IFdFQlBfREVNVVhfUEFSU0VfRVJST1I7CisKKyAgaWYgKFdFQlBfQUJJX0lTX0lOQ09NUEFUSUJMRSh2ZXJzaW9uLCBXRUJQX0RFTVVYX0FCSV9WRVJTSU9OKSkgcmV0dXJuIE5VTEw7CisgIGlmIChkYXRhID09IE5VTEwgfHwgZGF0YS0+Ynl0ZXMgPT0gTlVMTCB8fCBkYXRhLT5zaXplID09IDApIHJldHVybiBOVUxMOworCisgIGlmICghSW5pdE1lbUJ1ZmZlcigmbWVtLCBkYXRhLT5ieXRlcywgZGF0YS0+c2l6ZSkpIHJldHVybiBOVUxMOworICBzdGF0dXMgPSBSZWFkSGVhZGVyKCZtZW0pOworICBpZiAoc3RhdHVzICE9IFBBUlNFX09LKSB7CisgICAgLy8gSWYgcGFyc2luZyBvZiB0aGUgd2VicCBmaWxlIGhlYWRlciBmYWlscyBhdHRlbXB0IHRvIGhhbmRsZSBhIHJhdworICAgIC8vIFZQOC9WUDhMIGZyYW1lLiBOb3RlICdhbGxvd19wYXJ0aWFsJyBpcyBpZ25vcmVkIGluIHRoaXMgY2FzZS4KKyAgICBpZiAoc3RhdHVzID09IFBBUlNFX0VSUk9SKSB7CisgICAgICBzdGF0dXMgPSBDcmVhdGVSYXdJbWFnZURlbXV4ZXIoJm1lbSwgJmRtdXgpOworICAgICAgaWYgKHN0YXR1cyA9PSBQQVJTRV9PSykgeworICAgICAgICBpZiAoc3RhdGUgIT0gTlVMTCkgKnN0YXRlID0gV0VCUF9ERU1VWF9ET05FOworICAgICAgICByZXR1cm4gZG11eDsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHN0YXRlICE9IE5VTEwpIHsKKyAgICAgICpzdGF0ZSA9IChzdGF0dXMgPT0gUEFSU0VfTkVFRF9NT1JFX0RBVEEpID8gV0VCUF9ERU1VWF9QQVJTSU5HX0hFQURFUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBXRUJQX0RFTVVYX1BBUlNFX0VSUk9SOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHBhcnRpYWwgPSAobWVtLmJ1Zl9zaXplXyA8IG1lbS5yaWZmX2VuZF8pOworICBpZiAoIWFsbG93X3BhcnRpYWwgJiYgcGFydGlhbCkgcmV0dXJuIE5VTEw7CisKKyAgZG11eCA9IChXZWJQRGVtdXhlciopV2ViUFNhZmVDYWxsb2MoMVVMTCwgc2l6ZW9mKCpkbXV4KSk7CisgIGlmIChkbXV4ID09IE5VTEwpIHJldHVybiBOVUxMOworICBJbml0RGVtdXgoZG11eCwgJm1lbSk7CisKKyAgc3RhdHVzID0gUEFSU0VfRVJST1I7CisgIGZvciAocGFyc2VyID0ga01hc3RlckNodW5rczsgcGFyc2VyLT5wYXJzZSAhPSBOVUxMOyArK3BhcnNlcikgeworICAgIGlmICghbWVtY21wKHBhcnNlci0+aWQsIEdldEJ1ZmZlcigmZG11eC0+bWVtXyksIFRBR19TSVpFKSkgeworICAgICAgc3RhdHVzID0gcGFyc2VyLT5wYXJzZShkbXV4KTsKKyAgICAgIGlmIChzdGF0dXMgPT0gUEFSU0VfT0spIGRtdXgtPnN0YXRlXyA9IFdFQlBfREVNVVhfRE9ORTsKKyAgICAgIGlmIChzdGF0dXMgPT0gUEFSU0VfTkVFRF9NT1JFX0RBVEEgJiYgIXBhcnRpYWwpIHN0YXR1cyA9IFBBUlNFX0VSUk9SOworICAgICAgaWYgKHN0YXR1cyAhPSBQQVJTRV9FUlJPUiAmJiAhcGFyc2VyLT52YWxpZChkbXV4KSkgc3RhdHVzID0gUEFSU0VfRVJST1I7CisgICAgICBpZiAoc3RhdHVzID09IFBBUlNFX0VSUk9SKSBkbXV4LT5zdGF0ZV8gPSBXRUJQX0RFTVVYX1BBUlNFX0VSUk9SOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmIChzdGF0ZSAhPSBOVUxMKSAqc3RhdGUgPSBkbXV4LT5zdGF0ZV87CisKKyAgaWYgKHN0YXR1cyA9PSBQQVJTRV9FUlJPUikgeworICAgIFdlYlBEZW11eERlbGV0ZShkbXV4KTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gZG11eDsKK30KKwordm9pZCBXZWJQRGVtdXhEZWxldGUoV2ViUERlbXV4ZXIqIGRtdXgpIHsKKyAgQ2h1bmsqIGM7CisgIEZyYW1lKiBmOworICBpZiAoZG11eCA9PSBOVUxMKSByZXR1cm47CisKKyAgZm9yIChmID0gZG11eC0+ZnJhbWVzXzsgZiAhPSBOVUxMOykgeworICAgIEZyYW1lKiBjb25zdCBjdXJfZnJhbWUgPSBmOworICAgIGYgPSBmLT5uZXh0XzsKKyAgICBXZWJQU2FmZUZyZWUoY3VyX2ZyYW1lKTsKKyAgfQorICBmb3IgKGMgPSBkbXV4LT5jaHVua3NfOyBjICE9IE5VTEw7KSB7CisgICAgQ2h1bmsqIGNvbnN0IGN1cl9jaHVuayA9IGM7CisgICAgYyA9IGMtPm5leHRfOworICAgIFdlYlBTYWZlRnJlZShjdXJfY2h1bmspOworICB9CisgIFdlYlBTYWZlRnJlZShkbXV4KTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordWludDMyX3QgV2ViUERlbXV4R2V0SShjb25zdCBXZWJQRGVtdXhlciogZG11eCwgV2ViUEZvcm1hdEZlYXR1cmUgZmVhdHVyZSkgeworICBpZiAoZG11eCA9PSBOVUxMKSByZXR1cm4gMDsKKworICBzd2l0Y2ggKGZlYXR1cmUpIHsKKyAgICBjYXNlIFdFQlBfRkZfRk9STUFUX0ZMQUdTOiAgICAgcmV0dXJuIGRtdXgtPmZlYXR1cmVfZmxhZ3NfOworICAgIGNhc2UgV0VCUF9GRl9DQU5WQVNfV0lEVEg6ICAgICByZXR1cm4gKHVpbnQzMl90KWRtdXgtPmNhbnZhc193aWR0aF87CisgICAgY2FzZSBXRUJQX0ZGX0NBTlZBU19IRUlHSFQ6ICAgIHJldHVybiAodWludDMyX3QpZG11eC0+Y2FudmFzX2hlaWdodF87CisgICAgY2FzZSBXRUJQX0ZGX0xPT1BfQ09VTlQ6ICAgICAgIHJldHVybiAodWludDMyX3QpZG11eC0+bG9vcF9jb3VudF87CisgICAgY2FzZSBXRUJQX0ZGX0JBQ0tHUk9VTkRfQ09MT1I6IHJldHVybiBkbXV4LT5iZ2NvbG9yXzsKKyAgICBjYXNlIFdFQlBfRkZfRlJBTUVfQ09VTlQ6ICAgICAgcmV0dXJuICh1aW50MzJfdClkbXV4LT5udW1fZnJhbWVzXzsKKyAgfQorICByZXR1cm4gMDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZyYW1lIGl0ZXJhdGlvbgorCitzdGF0aWMgY29uc3QgRnJhbWUqIEdldEZyYW1lKGNvbnN0IFdlYlBEZW11eGVyKiBjb25zdCBkbXV4LCBpbnQgZnJhbWVfbnVtKSB7CisgIGNvbnN0IEZyYW1lKiBmOworICBmb3IgKGYgPSBkbXV4LT5mcmFtZXNfOyBmICE9IE5VTEw7IGYgPSBmLT5uZXh0XykgeworICAgIGlmIChmcmFtZV9udW0gPT0gZi0+ZnJhbWVfbnVtXykgYnJlYWs7CisgIH0KKyAgcmV0dXJuIGY7Cit9CisKK3N0YXRpYyBjb25zdCB1aW50OF90KiBHZXRGcmFtZVBheWxvYWQoY29uc3QgdWludDhfdCogY29uc3QgbWVtX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnJhbWUqIGNvbnN0IGZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIGNvbnN0IGRhdGFfc2l6ZSkgeworICAqZGF0YV9zaXplID0gMDsKKyAgaWYgKGZyYW1lICE9IE5VTEwpIHsKKyAgICBjb25zdCBDaHVua0RhdGEqIGNvbnN0IGltYWdlID0gZnJhbWUtPmltZ19jb21wb25lbnRzXzsKKyAgICBjb25zdCBDaHVua0RhdGEqIGNvbnN0IGFscGhhID0gZnJhbWUtPmltZ19jb21wb25lbnRzXyArIDE7CisgICAgc2l6ZV90IHN0YXJ0X29mZnNldCA9IGltYWdlLT5vZmZzZXRfOworICAgICpkYXRhX3NpemUgPSBpbWFnZS0+c2l6ZV87CisKKyAgICAvLyBpZiBhbHBoYSBleGlzdHMgaXQgcHJlY2VkZXMgaW1hZ2UsIHVwZGF0ZSB0aGUgc2l6ZSBhbGxvd2luZyBmb3IKKyAgICAvLyBpbnRlcnZlbmluZyBjaHVua3MuCisgICAgaWYgKGFscGhhLT5zaXplXyA+IDApIHsKKyAgICAgIGNvbnN0IHNpemVfdCBpbnRlcl9zaXplID0gKGltYWdlLT5vZmZzZXRfID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gaW1hZ2UtPm9mZnNldF8gLSAoYWxwaGEtPm9mZnNldF8gKyBhbHBoYS0+c2l6ZV8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDA7CisgICAgICBzdGFydF9vZmZzZXQgPSBhbHBoYS0+b2Zmc2V0XzsKKyAgICAgICpkYXRhX3NpemUgICs9IGFscGhhLT5zaXplXyArIGludGVyX3NpemU7CisgICAgfQorICAgIHJldHVybiBtZW1fYnVmICsgc3RhcnRfb2Zmc2V0OworICB9CisgIHJldHVybiBOVUxMOworfQorCisvLyBDcmVhdGUgYSB3aG9sZSAnZnJhbWUnIGZyb20gVlA4ICgrIGFscGhhKSBvciBsb3NzbGVzcy4KK3N0YXRpYyBpbnQgU3ludGhlc2l6ZUZyYW1lKGNvbnN0IFdlYlBEZW11eGVyKiBjb25zdCBkbXV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnJhbWUqIGNvbnN0IGZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUEl0ZXJhdG9yKiBjb25zdCBpdGVyKSB7CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IG1lbV9idWYgPSBkbXV4LT5tZW1fLmJ1Zl87CisgIHNpemVfdCBwYXlsb2FkX3NpemUgPSAwOworICBjb25zdCB1aW50OF90KiBjb25zdCBwYXlsb2FkID0gR2V0RnJhbWVQYXlsb2FkKG1lbV9idWYsIGZyYW1lLCAmcGF5bG9hZF9zaXplKTsKKyAgaWYgKHBheWxvYWQgPT0gTlVMTCkgcmV0dXJuIDA7CisgIGFzc2VydChmcmFtZSAhPSBOVUxMKTsKKworICBpdGVyLT5mcmFtZV9udW0gICAgICA9IGZyYW1lLT5mcmFtZV9udW1fOworICBpdGVyLT5udW1fZnJhbWVzICAgICA9IGRtdXgtPm51bV9mcmFtZXNfOworICBpdGVyLT54X29mZnNldCAgICAgICA9IGZyYW1lLT54X29mZnNldF87CisgIGl0ZXItPnlfb2Zmc2V0ICAgICAgID0gZnJhbWUtPnlfb2Zmc2V0XzsKKyAgaXRlci0+d2lkdGggICAgICAgICAgPSBmcmFtZS0+d2lkdGhfOworICBpdGVyLT5oZWlnaHQgICAgICAgICA9IGZyYW1lLT5oZWlnaHRfOworICBpdGVyLT5oYXNfYWxwaGEgICAgICA9IGZyYW1lLT5oYXNfYWxwaGFfOworICBpdGVyLT5kdXJhdGlvbiAgICAgICA9IGZyYW1lLT5kdXJhdGlvbl87CisgIGl0ZXItPmRpc3Bvc2VfbWV0aG9kID0gZnJhbWUtPmRpc3Bvc2VfbWV0aG9kXzsKKyAgaXRlci0+YmxlbmRfbWV0aG9kICAgPSBmcmFtZS0+YmxlbmRfbWV0aG9kXzsKKyAgaXRlci0+Y29tcGxldGUgICAgICAgPSBmcmFtZS0+Y29tcGxldGVfOworICBpdGVyLT5mcmFnbWVudC5ieXRlcyA9IHBheWxvYWQ7CisgIGl0ZXItPmZyYWdtZW50LnNpemUgID0gcGF5bG9hZF9zaXplOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBTZXRGcmFtZShpbnQgZnJhbWVfbnVtLCBXZWJQSXRlcmF0b3IqIGNvbnN0IGl0ZXIpIHsKKyAgY29uc3QgRnJhbWUqIGZyYW1lOworICBjb25zdCBXZWJQRGVtdXhlciogY29uc3QgZG11eCA9IChXZWJQRGVtdXhlciopaXRlci0+cHJpdmF0ZV87CisgIGlmIChkbXV4ID09IE5VTEwgfHwgZnJhbWVfbnVtIDwgMCkgcmV0dXJuIDA7CisgIGlmIChmcmFtZV9udW0gPiBkbXV4LT5udW1fZnJhbWVzXykgcmV0dXJuIDA7CisgIGlmIChmcmFtZV9udW0gPT0gMCkgZnJhbWVfbnVtID0gZG11eC0+bnVtX2ZyYW1lc187CisKKyAgZnJhbWUgPSBHZXRGcmFtZShkbXV4LCBmcmFtZV9udW0pOworICBpZiAoZnJhbWUgPT0gTlVMTCkgcmV0dXJuIDA7CisKKyAgcmV0dXJuIFN5bnRoZXNpemVGcmFtZShkbXV4LCBmcmFtZSwgaXRlcik7Cit9CisKK2ludCBXZWJQRGVtdXhHZXRGcmFtZShjb25zdCBXZWJQRGVtdXhlciogZG11eCwgaW50IGZyYW1lLCBXZWJQSXRlcmF0b3IqIGl0ZXIpIHsKKyAgaWYgKGl0ZXIgPT0gTlVMTCkgcmV0dXJuIDA7CisKKyAgbWVtc2V0KGl0ZXIsIDAsIHNpemVvZigqaXRlcikpOworICBpdGVyLT5wcml2YXRlXyA9ICh2b2lkKilkbXV4OworICByZXR1cm4gU2V0RnJhbWUoZnJhbWUsIGl0ZXIpOworfQorCitpbnQgV2ViUERlbXV4TmV4dEZyYW1lKFdlYlBJdGVyYXRvciogaXRlcikgeworICBpZiAoaXRlciA9PSBOVUxMKSByZXR1cm4gMDsKKyAgcmV0dXJuIFNldEZyYW1lKGl0ZXItPmZyYW1lX251bSArIDEsIGl0ZXIpOworfQorCitpbnQgV2ViUERlbXV4UHJldkZyYW1lKFdlYlBJdGVyYXRvciogaXRlcikgeworICBpZiAoaXRlciA9PSBOVUxMKSByZXR1cm4gMDsKKyAgaWYgKGl0ZXItPmZyYW1lX251bSA8PSAxKSByZXR1cm4gMDsKKyAgcmV0dXJuIFNldEZyYW1lKGl0ZXItPmZyYW1lX251bSAtIDEsIGl0ZXIpOworfQorCit2b2lkIFdlYlBEZW11eFJlbGVhc2VJdGVyYXRvcihXZWJQSXRlcmF0b3IqIGl0ZXIpIHsKKyAgKHZvaWQpaXRlcjsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENodW5rIGl0ZXJhdGlvbgorCitzdGF0aWMgaW50IENodW5rQ291bnQoY29uc3QgV2ViUERlbXV4ZXIqIGNvbnN0IGRtdXgsIGNvbnN0IGNoYXIgZm91cmNjWzRdKSB7CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IG1lbV9idWYgPSBkbXV4LT5tZW1fLmJ1Zl87CisgIGNvbnN0IENodW5rKiBjOworICBpbnQgY291bnQgPSAwOworICBmb3IgKGMgPSBkbXV4LT5jaHVua3NfOyBjICE9IE5VTEw7IGMgPSBjLT5uZXh0XykgeworICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGhlYWRlciA9IG1lbV9idWYgKyBjLT5kYXRhXy5vZmZzZXRfOworICAgIGlmICghbWVtY21wKGhlYWRlciwgZm91cmNjLCBUQUdfU0laRSkpICsrY291bnQ7CisgIH0KKyAgcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgY29uc3QgQ2h1bmsqIEdldENodW5rKGNvbnN0IFdlYlBEZW11eGVyKiBjb25zdCBkbXV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyIGZvdXJjY1s0XSwgaW50IGNodW5rX251bSkgeworICBjb25zdCB1aW50OF90KiBjb25zdCBtZW1fYnVmID0gZG11eC0+bWVtXy5idWZfOworICBjb25zdCBDaHVuayogYzsKKyAgaW50IGNvdW50ID0gMDsKKyAgZm9yIChjID0gZG11eC0+Y2h1bmtzXzsgYyAhPSBOVUxMOyBjID0gYy0+bmV4dF8pIHsKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCBoZWFkZXIgPSBtZW1fYnVmICsgYy0+ZGF0YV8ub2Zmc2V0XzsKKyAgICBpZiAoIW1lbWNtcChoZWFkZXIsIGZvdXJjYywgVEFHX1NJWkUpKSArK2NvdW50OworICAgIGlmIChjb3VudCA9PSBjaHVua19udW0pIGJyZWFrOworICB9CisgIHJldHVybiBjOworfQorCitzdGF0aWMgaW50IFNldENodW5rKGNvbnN0IGNoYXIgZm91cmNjWzRdLCBpbnQgY2h1bmtfbnVtLAorICAgICAgICAgICAgICAgICAgICBXZWJQQ2h1bmtJdGVyYXRvciogY29uc3QgaXRlcikgeworICBjb25zdCBXZWJQRGVtdXhlciogY29uc3QgZG11eCA9IChXZWJQRGVtdXhlciopaXRlci0+cHJpdmF0ZV87CisgIGludCBjb3VudDsKKworICBpZiAoZG11eCA9PSBOVUxMIHx8IGZvdXJjYyA9PSBOVUxMIHx8IGNodW5rX251bSA8IDApIHJldHVybiAwOworICBjb3VudCA9IENodW5rQ291bnQoZG11eCwgZm91cmNjKTsKKyAgaWYgKGNvdW50ID09IDApIHJldHVybiAwOworICBpZiAoY2h1bmtfbnVtID09IDApIGNodW5rX251bSA9IGNvdW50OworCisgIGlmIChjaHVua19udW0gPD0gY291bnQpIHsKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCBtZW1fYnVmID0gZG11eC0+bWVtXy5idWZfOworICAgIGNvbnN0IENodW5rKiBjb25zdCBjaHVuayA9IEdldENodW5rKGRtdXgsIGZvdXJjYywgY2h1bmtfbnVtKTsKKyAgICBpdGVyLT5jaHVuay5ieXRlcyA9IG1lbV9idWYgKyBjaHVuay0+ZGF0YV8ub2Zmc2V0XyArIENIVU5LX0hFQURFUl9TSVpFOworICAgIGl0ZXItPmNodW5rLnNpemUgID0gY2h1bmstPmRhdGFfLnNpemVfIC0gQ0hVTktfSEVBREVSX1NJWkU7CisgICAgaXRlci0+bnVtX2NodW5rcyAgPSBjb3VudDsKKyAgICBpdGVyLT5jaHVua19udW0gICA9IGNodW5rX251bTsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworaW50IFdlYlBEZW11eEdldENodW5rKGNvbnN0IFdlYlBEZW11eGVyKiBkbXV4LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgZm91cmNjWzRdLCBpbnQgY2h1bmtfbnVtLAorICAgICAgICAgICAgICAgICAgICAgIFdlYlBDaHVua0l0ZXJhdG9yKiBpdGVyKSB7CisgIGlmIChpdGVyID09IE5VTEwpIHJldHVybiAwOworCisgIG1lbXNldChpdGVyLCAwLCBzaXplb2YoKml0ZXIpKTsKKyAgaXRlci0+cHJpdmF0ZV8gPSAodm9pZCopZG11eDsKKyAgcmV0dXJuIFNldENodW5rKGZvdXJjYywgY2h1bmtfbnVtLCBpdGVyKTsKK30KKworaW50IFdlYlBEZW11eE5leHRDaHVuayhXZWJQQ2h1bmtJdGVyYXRvciogaXRlcikgeworICBpZiAoaXRlciAhPSBOVUxMKSB7CisgICAgY29uc3QgY2hhciogY29uc3QgZm91cmNjID0KKyAgICAgICAgKGNvbnN0IGNoYXIqKWl0ZXItPmNodW5rLmJ5dGVzIC0gQ0hVTktfSEVBREVSX1NJWkU7CisgICAgcmV0dXJuIFNldENodW5rKGZvdXJjYywgaXRlci0+Y2h1bmtfbnVtICsgMSwgaXRlcik7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2ludCBXZWJQRGVtdXhQcmV2Q2h1bmsoV2ViUENodW5rSXRlcmF0b3IqIGl0ZXIpIHsKKyAgaWYgKGl0ZXIgIT0gTlVMTCAmJiBpdGVyLT5jaHVua19udW0gPiAxKSB7CisgICAgY29uc3QgY2hhciogY29uc3QgZm91cmNjID0KKyAgICAgICAgKGNvbnN0IGNoYXIqKWl0ZXItPmNodW5rLmJ5dGVzIC0gQ0hVTktfSEVBREVSX1NJWkU7CisgICAgcmV0dXJuIFNldENodW5rKGZvdXJjYywgaXRlci0+Y2h1bmtfbnVtIC0gMSwgaXRlcik7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgV2ViUERlbXV4UmVsZWFzZUNodW5rSXRlcmF0b3IoV2ViUENodW5rSXRlcmF0b3IqIGl0ZXIpIHsKKyAgKHZvaWQpaXRlcjsKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlbXV4L2xpYndlYnBkZW11eC5wYy5pbiBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZW11eC9saWJ3ZWJwZGVtdXgucGMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRmYmJiZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZW11eC9saWJ3ZWJwZGVtdXgucGMuaW4KQEAgLTAsMCArMSwxMSBAQAorcHJlZml4PUBwcmVmaXhACitleGVjX3ByZWZpeD1AZXhlY19wcmVmaXhACitsaWJkaXI9QGxpYmRpckAKK2luY2x1ZGVkaXI9QGluY2x1ZGVkaXJACisKK05hbWU6IGxpYndlYnBkZW11eAorRGVzY3JpcHRpb246IExpYnJhcnkgZm9yIHBhcnNpbmcgdGhlIFdlYlAgZ3JhcGhpY3MgZm9ybWF0IGNvbnRhaW5lcgorVmVyc2lvbjogQFBBQ0tBR0VfVkVSU0lPTkAKK1JlcXVpcmVzOiBsaWJ3ZWJwID49IDAuMi4wCitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfQorTGliczogLUwke2xpYmRpcn0gLWx3ZWJwZGVtdXgKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZW11eC9saWJ3ZWJwZGVtdXgucmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVtdXgvbGlid2VicGRlbXV4LnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NGE4YjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVtdXgvbGlid2VicGRlbXV4LnJjCkBAIC0wLDAgKzEsNDEgQEAKKyNkZWZpbmUgQVBTVFVESU9fUkVBRE9OTFlfU1lNQk9MUworI2luY2x1ZGUgIndpbnJlcy5oIgorI3VuZGVmIEFQU1RVRElPX1JFQURPTkxZX1NZTUJPTFMKKworI2lmICFkZWZpbmVkKEFGWF9SRVNPVVJDRV9ETEwpIHx8IGRlZmluZWQoQUZYX1RBUkdfRU5VKQorTEFOR1VBR0UgTEFOR19FTkdMSVNILCBTVUJMQU5HX0VOR0xJU0hfVVMKKworVlNfVkVSU0lPTl9JTkZPIFZFUlNJT05JTkZPCisgRklMRVZFUlNJT04gMSwwLDAsMAorIFBST0RVQ1RWRVJTSU9OIDEsMCwwLDAKKyBGSUxFRkxBR1NNQVNLIDB4M2ZMCisjaWZkZWYgX0RFQlVHCisgRklMRUZMQUdTIDB4MUwKKyNlbHNlCisgRklMRUZMQUdTIDB4MEwKKyNlbmRpZgorIEZJTEVPUyAweDQwMDA0TAorIEZJTEVUWVBFIDB4MkwKKyBGSUxFU1VCVFlQRSAweDBMCitCRUdJTgorICAgIEJMT0NLICJTdHJpbmdGaWxlSW5mbyIKKyAgICBCRUdJTgorICAgICAgICBCTE9DSyAiMDQwOTA0YjAiCisgICAgICAgIEJFR0lOCisgICAgICAgICAgICBWQUxVRSAiQ29tcGFueU5hbWUiLCAiR29vZ2xlLCBJbmMuIgorICAgICAgICAgICAgVkFMVUUgIkZpbGVEZXNjcmlwdGlvbiIsICJsaWJ3ZWJwZGVtdXggRExMIgorICAgICAgICAgICAgVkFMVUUgIkZpbGVWZXJzaW9uIiwgIjEuMC4wIgorICAgICAgICAgICAgVkFMVUUgIkludGVybmFsTmFtZSIsICJsaWJ3ZWJwZGVtdXguZGxsIgorICAgICAgICAgICAgVkFMVUUgIkxlZ2FsQ29weXJpZ2h0IiwgIkNvcHlyaWdodCAoQykgMjAxOCIKKyAgICAgICAgICAgIFZBTFVFICJPcmlnaW5hbEZpbGVuYW1lIiwgImxpYndlYnBkZW11eC5kbGwiCisgICAgICAgICAgICBWQUxVRSAiUHJvZHVjdE5hbWUiLCAiV2ViUCBJbWFnZSBEZW11eGVyIgorICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3RWZXJzaW9uIiwgIjEuMC4wIgorICAgICAgICBFTkQKKyAgICBFTkQKKyAgICBCTE9DSyAiVmFyRmlsZUluZm8iCisgICAgQkVHSU4KKyAgICAgICAgVkFMVUUgIlRyYW5zbGF0aW9uIiwgMHg0MDksIDEyMDAKKyAgICBFTkQKK0VORAorCisjZW5kaWYgICAgLy8gRW5nbGlzaCAoVW5pdGVkIFN0YXRlcykgcmVzb3VyY2VzCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL01ha2VmaWxlLmFtIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODM2ZDhmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDE2MyBAQAorQU1fQ1BQRkxBR1MgKz0gLUkkKHRvcF9idWlsZGRpcikgLUkkKHRvcF9zcmNkaXIpCitub2luc3RfTFRMSUJSQVJJRVMgPQorbm9pbnN0X0xUTElCUkFSSUVTICs9IGxpYndlYnBkc3AubGEKK25vaW5zdF9MVExJQlJBUklFUyArPSBsaWJ3ZWJwZHNwX2F2eDIubGEKK25vaW5zdF9MVExJQlJBUklFUyArPSBsaWJ3ZWJwZHNwX3NzZTIubGEKK25vaW5zdF9MVExJQlJBUklFUyArPSBsaWJ3ZWJwZHNwZGVjb2RlX3NzZTIubGEKK25vaW5zdF9MVExJQlJBUklFUyArPSBsaWJ3ZWJwZHNwX3NzZTQxLmxhCitub2luc3RfTFRMSUJSQVJJRVMgKz0gbGlid2VicGRzcGRlY29kZV9zc2U0MS5sYQorbm9pbnN0X0xUTElCUkFSSUVTICs9IGxpYndlYnBkc3BfbmVvbi5sYQorbm9pbnN0X0xUTElCUkFSSUVTICs9IGxpYndlYnBkc3BkZWNvZGVfbmVvbi5sYQorbm9pbnN0X0xUTElCUkFSSUVTICs9IGxpYndlYnBkc3BfbXNhLmxhCitub2luc3RfTFRMSUJSQVJJRVMgKz0gbGlid2VicGRzcGRlY29kZV9tc2EubGEKKworaWYgQlVJTERfTElCV0VCUERFQ09ERVIKKyAgbm9pbnN0X0xUTElCUkFSSUVTICs9IGxpYndlYnBkc3BkZWNvZGUubGEKK2VuZGlmCisKK2NvbW1vbl9IRUFERVJTID0gLi4vd2VicC90eXBlcy5oCitjb21tb25kaXIgPSAkKGluY2x1ZGVkaXIpL3dlYnAKKworQ09NTU9OX1NPVVJDRVMgPQorQ09NTU9OX1NPVVJDRVMgKz0gYWxwaGFfcHJvY2Vzc2luZy5jCitDT01NT05fU09VUkNFUyArPSBhbHBoYV9wcm9jZXNzaW5nX21pcHNfZHNwX3IyLmMKK0NPTU1PTl9TT1VSQ0VTICs9IGNvbW1vbl9zc2UyLmgKK0NPTU1PTl9TT1VSQ0VTICs9IGNwdS5jCitDT01NT05fU09VUkNFUyArPSBkZWMuYworQ09NTU9OX1NPVVJDRVMgKz0gZGVjX2NsaXBfdGFibGVzLmMKK0NPTU1PTl9TT1VSQ0VTICs9IGRlY19taXBzMzIuYworQ09NTU9OX1NPVVJDRVMgKz0gZGVjX21pcHNfZHNwX3IyLmMKK0NPTU1PTl9TT1VSQ0VTICs9IGRzcC5oCitDT01NT05fU09VUkNFUyArPSBmaWx0ZXJzLmMKK0NPTU1PTl9TT1VSQ0VTICs9IGZpbHRlcnNfbWlwc19kc3BfcjIuYworQ09NTU9OX1NPVVJDRVMgKz0gbG9zc2xlc3MuYworQ09NTU9OX1NPVVJDRVMgKz0gbG9zc2xlc3MuaAorQ09NTU9OX1NPVVJDRVMgKz0gbG9zc2xlc3NfY29tbW9uLmgKK0NPTU1PTl9TT1VSQ0VTICs9IGxvc3NsZXNzX21pcHNfZHNwX3IyLmMKK0NPTU1PTl9TT1VSQ0VTICs9IG1pcHNfbWFjcm8uaAorQ09NTU9OX1NPVVJDRVMgKz0gcmVzY2FsZXIuYworQ09NTU9OX1NPVVJDRVMgKz0gcmVzY2FsZXJfbWlwczMyLmMKK0NPTU1PTl9TT1VSQ0VTICs9IHJlc2NhbGVyX21pcHNfZHNwX3IyLmMKK0NPTU1PTl9TT1VSQ0VTICs9IHVwc2FtcGxpbmcuYworQ09NTU9OX1NPVVJDRVMgKz0gdXBzYW1wbGluZ19taXBzX2RzcF9yMi5jCitDT01NT05fU09VUkNFUyArPSB5dXYuYworQ09NTU9OX1NPVVJDRVMgKz0geXV2LmgKK0NPTU1PTl9TT1VSQ0VTICs9IHl1dl9taXBzMzIuYworQ09NTU9OX1NPVVJDRVMgKz0geXV2X21pcHNfZHNwX3IyLmMKKworRU5DX1NPVVJDRVMgPQorRU5DX1NPVVJDRVMgKz0gY29zdC5jCitFTkNfU09VUkNFUyArPSBjb3N0X21pcHMzMi5jCitFTkNfU09VUkNFUyArPSBjb3N0X21pcHNfZHNwX3IyLmMKK0VOQ19TT1VSQ0VTICs9IGVuYy5jCitFTkNfU09VUkNFUyArPSBlbmNfbWlwczMyLmMKK0VOQ19TT1VSQ0VTICs9IGVuY19taXBzX2RzcF9yMi5jCitFTkNfU09VUkNFUyArPSBsb3NzbGVzc19lbmMuYworRU5DX1NPVVJDRVMgKz0gbG9zc2xlc3NfZW5jX21pcHMzMi5jCitFTkNfU09VUkNFUyArPSBsb3NzbGVzc19lbmNfbWlwc19kc3BfcjIuYworRU5DX1NPVVJDRVMgKz0gc3NpbS5jCisKK2xpYndlYnBkc3BfYXZ4Ml9sYV9TT1VSQ0VTID0KK2xpYndlYnBkc3BfYXZ4Ml9sYV9TT1VSQ0VTICs9IGVuY19hdngyLmMKK2xpYndlYnBkc3BfYXZ4Ml9sYV9DUFBGTEFHUyA9ICQobGlid2VicGRzcF9sYV9DUFBGTEFHUykKK2xpYndlYnBkc3BfYXZ4Ml9sYV9DRkxBR1MgPSAkKEFNX0NGTEFHUykgJChBVlgyX0ZMQUdTKQorCitsaWJ3ZWJwZHNwZGVjb2RlX3NzZTQxX2xhX1NPVVJDRVMgPQorbGlid2VicGRzcGRlY29kZV9zc2U0MV9sYV9TT1VSQ0VTICs9IGFscGhhX3Byb2Nlc3Npbmdfc3NlNDEuYworbGlid2VicGRzcGRlY29kZV9zc2U0MV9sYV9TT1VSQ0VTICs9IGRlY19zc2U0MS5jCitsaWJ3ZWJwZHNwZGVjb2RlX3NzZTQxX2xhX1NPVVJDRVMgKz0gdXBzYW1wbGluZ19zc2U0MS5jCitsaWJ3ZWJwZHNwZGVjb2RlX3NzZTQxX2xhX1NPVVJDRVMgKz0geXV2X3NzZTQxLmMKK2xpYndlYnBkc3BkZWNvZGVfc3NlNDFfbGFfQ1BQRkxBR1MgPSAkKGxpYndlYnBkc3BfbGFfQ1BQRkxBR1MpCitsaWJ3ZWJwZHNwZGVjb2RlX3NzZTQxX2xhX0NGTEFHUyA9ICQoQU1fQ0ZMQUdTKSAkKFNTRTQxX0ZMQUdTKQorCitsaWJ3ZWJwZHNwZGVjb2RlX3NzZTJfbGFfU09VUkNFUyA9CitsaWJ3ZWJwZHNwZGVjb2RlX3NzZTJfbGFfU09VUkNFUyArPSBhbHBoYV9wcm9jZXNzaW5nX3NzZTIuYworbGlid2VicGRzcGRlY29kZV9zc2UyX2xhX1NPVVJDRVMgKz0gZGVjX3NzZTIuYworbGlid2VicGRzcGRlY29kZV9zc2UyX2xhX1NPVVJDRVMgKz0gZmlsdGVyc19zc2UyLmMKK2xpYndlYnBkc3BkZWNvZGVfc3NlMl9sYV9TT1VSQ0VTICs9IGxvc3NsZXNzX3NzZTIuYworbGlid2VicGRzcGRlY29kZV9zc2UyX2xhX1NPVVJDRVMgKz0gcmVzY2FsZXJfc3NlMi5jCitsaWJ3ZWJwZHNwZGVjb2RlX3NzZTJfbGFfU09VUkNFUyArPSB1cHNhbXBsaW5nX3NzZTIuYworbGlid2VicGRzcGRlY29kZV9zc2UyX2xhX1NPVVJDRVMgKz0geXV2X3NzZTIuYworbGlid2VicGRzcGRlY29kZV9zc2UyX2xhX0NQUEZMQUdTID0gJChsaWJ3ZWJwZHNwX3NzZTJfbGFfQ1BQRkxBR1MpCitsaWJ3ZWJwZHNwZGVjb2RlX3NzZTJfbGFfQ0ZMQUdTID0gJChsaWJ3ZWJwZHNwX3NzZTJfbGFfQ0ZMQUdTKQorCitsaWJ3ZWJwZHNwZGVjb2RlX25lb25fbGFfU09VUkNFUyA9CitsaWJ3ZWJwZHNwZGVjb2RlX25lb25fbGFfU09VUkNFUyArPSBhbHBoYV9wcm9jZXNzaW5nX25lb24uYworbGlid2VicGRzcGRlY29kZV9uZW9uX2xhX1NPVVJDRVMgKz0gZGVjX25lb24uYworbGlid2VicGRzcGRlY29kZV9uZW9uX2xhX1NPVVJDRVMgKz0gZmlsdGVyc19uZW9uLmMKK2xpYndlYnBkc3BkZWNvZGVfbmVvbl9sYV9TT1VSQ0VTICs9IGxvc3NsZXNzX25lb24uYworbGlid2VicGRzcGRlY29kZV9uZW9uX2xhX1NPVVJDRVMgKz0gbmVvbi5oCitsaWJ3ZWJwZHNwZGVjb2RlX25lb25fbGFfU09VUkNFUyArPSByZXNjYWxlcl9uZW9uLmMKK2xpYndlYnBkc3BkZWNvZGVfbmVvbl9sYV9TT1VSQ0VTICs9IHVwc2FtcGxpbmdfbmVvbi5jCitsaWJ3ZWJwZHNwZGVjb2RlX25lb25fbGFfU09VUkNFUyArPSB5dXZfbmVvbi5jCitsaWJ3ZWJwZHNwZGVjb2RlX25lb25fbGFfQ1BQRkxBR1MgPSAkKGxpYndlYnBkc3BfbmVvbl9sYV9DUFBGTEFHUykKK2xpYndlYnBkc3BkZWNvZGVfbmVvbl9sYV9DRkxBR1MgPSAkKGxpYndlYnBkc3BfbmVvbl9sYV9DRkxBR1MpCisKK2xpYndlYnBkc3BkZWNvZGVfbXNhX2xhX1NPVVJDRVMgPQorbGlid2VicGRzcGRlY29kZV9tc2FfbGFfU09VUkNFUyArPSBkZWNfbXNhLmMKK2xpYndlYnBkc3BkZWNvZGVfbXNhX2xhX1NPVVJDRVMgKz0gZmlsdGVyc19tc2EuYworbGlid2VicGRzcGRlY29kZV9tc2FfbGFfU09VUkNFUyArPSBsb3NzbGVzc19tc2EuYworbGlid2VicGRzcGRlY29kZV9tc2FfbGFfU09VUkNFUyArPSBtc2FfbWFjcm8uaAorbGlid2VicGRzcGRlY29kZV9tc2FfbGFfU09VUkNFUyArPSByZXNjYWxlcl9tc2EuYworbGlid2VicGRzcGRlY29kZV9tc2FfbGFfU09VUkNFUyArPSB1cHNhbXBsaW5nX21zYS5jCitsaWJ3ZWJwZHNwZGVjb2RlX21zYV9sYV9DUFBGTEFHUyA9ICQobGlid2VicGRzcF9tc2FfbGFfQ1BQRkxBR1MpCitsaWJ3ZWJwZHNwZGVjb2RlX21zYV9sYV9DRkxBR1MgPSAkKGxpYndlYnBkc3BfbXNhX2xhX0NGTEFHUykKKworbGlid2VicGRzcF9zc2UyX2xhX1NPVVJDRVMgPQorbGlid2VicGRzcF9zc2UyX2xhX1NPVVJDRVMgKz0gY29zdF9zc2UyLmMKK2xpYndlYnBkc3Bfc3NlMl9sYV9TT1VSQ0VTICs9IGVuY19zc2UyLmMKK2xpYndlYnBkc3Bfc3NlMl9sYV9TT1VSQ0VTICs9IGxvc3NsZXNzX2VuY19zc2UyLmMKK2xpYndlYnBkc3Bfc3NlMl9sYV9TT1VSQ0VTICs9IHNzaW1fc3NlMi5jCitsaWJ3ZWJwZHNwX3NzZTJfbGFfQ1BQRkxBR1MgPSAkKGxpYndlYnBkc3BfbGFfQ1BQRkxBR1MpCitsaWJ3ZWJwZHNwX3NzZTJfbGFfQ0ZMQUdTID0gJChBTV9DRkxBR1MpICQoU1NFMl9GTEFHUykKK2xpYndlYnBkc3Bfc3NlMl9sYV9MSUJBREQgPSBsaWJ3ZWJwZHNwZGVjb2RlX3NzZTIubGEKKworbGlid2VicGRzcF9zc2U0MV9sYV9TT1VSQ0VTID0KK2xpYndlYnBkc3Bfc3NlNDFfbGFfU09VUkNFUyArPSBlbmNfc3NlNDEuYworbGlid2VicGRzcF9zc2U0MV9sYV9TT1VSQ0VTICs9IGxvc3NsZXNzX2VuY19zc2U0MS5jCitsaWJ3ZWJwZHNwX3NzZTQxX2xhX0NQUEZMQUdTID0gJChsaWJ3ZWJwZHNwX2xhX0NQUEZMQUdTKQorbGlid2VicGRzcF9zc2U0MV9sYV9DRkxBR1MgPSAkKEFNX0NGTEFHUykgJChTU0U0MV9GTEFHUykKK2xpYndlYnBkc3Bfc3NlNDFfbGFfTElCQUREID0gbGlid2VicGRzcGRlY29kZV9zc2U0MS5sYQorCitsaWJ3ZWJwZHNwX25lb25fbGFfU09VUkNFUyA9CitsaWJ3ZWJwZHNwX25lb25fbGFfU09VUkNFUyArPSBlbmNfbmVvbi5jCitsaWJ3ZWJwZHNwX25lb25fbGFfU09VUkNFUyArPSBsb3NzbGVzc19lbmNfbmVvbi5jCitsaWJ3ZWJwZHNwX25lb25fbGFfQ1BQRkxBR1MgPSAkKGxpYndlYnBkc3BfbGFfQ1BQRkxBR1MpCitsaWJ3ZWJwZHNwX25lb25fbGFfQ0ZMQUdTID0gJChBTV9DRkxBR1MpICQoTkVPTl9GTEFHUykKK2xpYndlYnBkc3BfbmVvbl9sYV9MSUJBREQgPSBsaWJ3ZWJwZHNwZGVjb2RlX25lb24ubGEKKworbGlid2VicGRzcF9tc2FfbGFfU09VUkNFUyA9CitsaWJ3ZWJwZHNwX21zYV9sYV9TT1VSQ0VTICs9IGVuY19tc2EuYworbGlid2VicGRzcF9tc2FfbGFfU09VUkNFUyArPSBsb3NzbGVzc19lbmNfbXNhLmMKK2xpYndlYnBkc3BfbXNhX2xhX0NQUEZMQUdTID0gJChsaWJ3ZWJwZHNwX2xhX0NQUEZMQUdTKQorbGlid2VicGRzcF9tc2FfbGFfQ0ZMQUdTID0gJChBTV9DRkxBR1MpCitsaWJ3ZWJwZHNwX21zYV9sYV9MSUJBREQgPSBsaWJ3ZWJwZHNwZGVjb2RlX21zYS5sYQorCitsaWJ3ZWJwZHNwX2xhX1NPVVJDRVMgPSAkKENPTU1PTl9TT1VSQ0VTKSAkKEVOQ19TT1VSQ0VTKQorCitub2luc3RfSEVBREVSUyA9Citub2luc3RfSEVBREVSUyArPSAuLi9kZWMvdnA4X2RlYy5oCitub2luc3RfSEVBREVSUyArPSAuLi93ZWJwL2RlY29kZS5oCisKK2xpYndlYnBkc3BfbGFfQ1BQRkxBR1MgPQorbGlid2VicGRzcF9sYV9DUFBGTEFHUyArPSAkKEFNX0NQUEZMQUdTKQorbGlid2VicGRzcF9sYV9DUFBGTEFHUyArPSAkKFVTRV9TV0FQXzE2QklUX0NTUCkKK2xpYndlYnBkc3BfbGFfTERGTEFHUyA9IC1sbQorbGlid2VicGRzcF9sYV9MSUJBREQgPQorbGlid2VicGRzcF9sYV9MSUJBREQgKz0gbGlid2VicGRzcF9hdngyLmxhCitsaWJ3ZWJwZHNwX2xhX0xJQkFERCArPSBsaWJ3ZWJwZHNwX3NzZTIubGEKK2xpYndlYnBkc3BfbGFfTElCQUREICs9IGxpYndlYnBkc3Bfc3NlNDEubGEKK2xpYndlYnBkc3BfbGFfTElCQUREICs9IGxpYndlYnBkc3BfbmVvbi5sYQorbGlid2VicGRzcF9sYV9MSUJBREQgKz0gbGlid2VicGRzcF9tc2EubGEKKworaWYgQlVJTERfTElCV0VCUERFQ09ERVIKKyAgbGlid2VicGRzcGRlY29kZV9sYV9TT1VSQ0VTID0gJChDT01NT05fU09VUkNFUykKKworICBsaWJ3ZWJwZHNwZGVjb2RlX2xhX0NQUEZMQUdTID0gJChsaWJ3ZWJwZHNwX2xhX0NQUEZMQUdTKQorICBsaWJ3ZWJwZHNwZGVjb2RlX2xhX0xERkxBR1MgPSAkKGxpYndlYnBkc3BfbGFfTERGTEFHUykKKyAgbGlid2VicGRzcGRlY29kZV9sYV9MSUJBREQgPQorICBsaWJ3ZWJwZHNwZGVjb2RlX2xhX0xJQkFERCArPSBsaWJ3ZWJwZHNwZGVjb2RlX3NzZTIubGEKKyAgbGlid2VicGRzcGRlY29kZV9sYV9MSUJBREQgKz0gbGlid2VicGRzcGRlY29kZV9zc2U0MS5sYQorICBsaWJ3ZWJwZHNwZGVjb2RlX2xhX0xJQkFERCArPSBsaWJ3ZWJwZHNwZGVjb2RlX25lb24ubGEKKyAgbGlid2VicGRzcGRlY29kZV9sYV9MSUJBREQgKz0gbGlid2VicGRzcGRlY29kZV9tc2EubGEKK2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2FscGhhX3Byb2Nlc3NpbmcuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvYWxwaGFfcHJvY2Vzc2luZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxOWQxMzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2FscGhhX3Byb2Nlc3NpbmcuYwpAQCAtMCwwICsxLDQ3MiBAQAorLy8gQ29weXJpZ2h0IDIwMTMgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFV0aWxpdGllcyBmb3IgcHJvY2Vzc2luZyB0cmFuc3BhcmVudCBjaGFubmVsLgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisvLyBUYWJsZXMgY2FuIGJlIGZhc3RlciBvbiBzb21lIHBsYXRmb3JtIGJ1dCBpbmN1ciBzb21lIGV4dHJhIGJpbmFyeSBzaXplICh+MmspLgorI2lmICFkZWZpbmVkKFVTRV9UQUJMRVNfRk9SX0FMUEhBX01VTFQpCisjZGVmaW5lIFVTRV9UQUJMRVNfRk9SX0FMUEhBX01VTFQgMCAgIC8vIEFMVEVSTkFURV9DT0RFCisjZW5kaWYKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIE1GSVggMjQgICAgLy8gMjRiaXQgZml4ZWQtcG9pbnQgYXJpdGhtZXRpYworI2RlZmluZSBIQUxGICgoMXUgPDwgTUZJWCkgPj4gMSkKKyNkZWZpbmUgS0lOVl8yNTUgKCgxdSA8PCBNRklYKSAvIDI1NXUpCisKK3N0YXRpYyB1aW50MzJfdCBNdWx0KHVpbnQ4X3QgeCwgdWludDMyX3QgbXVsdCkgeworICBjb25zdCB1aW50MzJfdCB2ID0gKHggKiBtdWx0ICsgSEFMRikgPj4gTUZJWDsKKyAgYXNzZXJ0KHYgPD0gMjU1KTsgIC8vIDwtIDI0Yml0IHByZWNpc2lvbiBpcyBlbm91Z2ggdG8gZW5zdXJlIHRoYXQuCisgIHJldHVybiB2OworfQorCisjaWYgKFVTRV9UQUJMRVNfRk9SX0FMUEhBX01VTFQgPT0gMSkKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IGtNdWx0VGFibGVzWzJdWzI1Nl0gPSB7CisgIHsgICAgLy8gKDI1NXUgPDwgTUZJWCkgLyBhbHBoYQorICAgIDB4MDAwMDAwMDAsIDB4ZmYwMDAwMDAsIDB4N2Y4MDAwMDAsIDB4NTUwMDAwMDAsIDB4M2ZjMDAwMDAsIDB4MzMwMDAwMDAsCisgICAgMHgyYTgwMDAwMCwgMHgyNDZkYjZkYiwgMHgxZmUwMDAwMCwgMHgxYzU1NTU1NSwgMHgxOTgwMDAwMCwgMHgxNzJlOGJhMiwKKyAgICAweDE1NDAwMDAwLCAweDEzOWQ4OWQ4LCAweDEyMzZkYjZkLCAweDExMDAwMDAwLCAweDBmZjAwMDAwLCAweDBmMDAwMDAwLAorICAgIDB4MGUyYWFhYWEsIDB4MGQ2YmNhMWEsIDB4MGNjMDAwMDAsIDB4MGMyNDkyNDksIDB4MGI5NzQ1ZDEsIDB4MGIxNjQyYzgsCisgICAgMHgwYWEwMDAwMCwgMHgwYTMzMzMzMywgMHgwOWNlYzRlYywgMHgwOTcxYzcxYywgMHgwOTFiNmRiNiwgMHgwOGNiMDhkMywKKyAgICAweDA4ODAwMDAwLCAweDA4MzljZTczLCAweDA3ZjgwMDAwLCAweDA3YmEyZThiLCAweDA3ODAwMDAwLCAweDA3NDkyNDkyLAorICAgIDB4MDcxNTU1NTUsIDB4MDZlNDUzMDYsIDB4MDZiNWU1MGQsIDB4MDY4OWQ4OWQsIDB4MDY2MDAwMDAsIDB4MDYzODMxZjMsCisgICAgMHgwNjEyNDkyNCwgMHgwNWVlMjNiOCwgMHgwNWNiYTJlOCwgMHgwNWFhYWFhYSwgMHgwNThiMjE2NCwgMHgwNTZjZWZhOCwKKyAgICAweDA1NTAwMDAwLCAweDA1MzQzZWIxLCAweDA1MTk5OTk5LCAweDA1MDAwMDAwLCAweDA0ZTc2Mjc2LCAweDA0Y2ZiMmI3LAorICAgIDB4MDRiOGUzOGUsIDB4MDRhMmU4YmEsIDB4MDQ4ZGI2ZGIsIDB4MDQ3OTQzNWUsIDB4MDQ2NTg0NjksIDB4MDQ1MjcwZDAsCisgICAgMHgwNDQwMDAwMCwgMHgwNDJlMjlmNywgMHgwNDFjZTczOSwgMHgwNDBjMzBjMywgMHgwM2ZjMDAwMCwgMHgwM2VjNGVjNCwKKyAgICAweDAzZGQxNzQ1LCAweDAzY2U1NDBmLCAweDAzYzAwMDAwLCAweDAzYjIxNjQyLCAweDAzYTQ5MjQ5LCAweDAzOTc2ZmM2LAorICAgIDB4MDM4YWFhYWEsIDB4MDM3ZTNmMWYsIDB4MDM3MjI5ODMsIDB4MDM2NjY2NjYsIDB4MDM1YWYyODYsIDB4MDM0ZmNhY2UsCisgICAgMHgwMzQ0ZWM0ZSwgMHgwMzNhNTQ0MCwgMHgwMzMwMDAwMCwgMHgwMzI1ZWQwOSwgMHgwMzFjMThmOSwgMHgwMzEyODE4YSwKKyAgICAweDAzMDkyNDkyLCAweDAzMDAwMDAwLCAweDAyZjcxMWRjLCAweDAyZWU1ODQ2LCAweDAyZTVkMTc0LCAweDAyZGQ3YmFmLAorICAgIDB4MDJkNTU1NTUsIDB4MDJjZDVjZDUsIDB4MDJjNTkwYjIsIDB4MDJiZGVmN2IsIDB4MDJiNjc3ZDQsIDB4MDJhZjI4NmIsCisgICAgMHgwMmE4MDAwMCwgMHgwMmEwZmQ1YywgMHgwMjlhMWY1OCwgMHgwMjkzNjRkOSwgMHgwMjhjY2NjYywgMHgwMjg2NTYyZCwKKyAgICAweDAyODAwMDAwLCAweDAyNzljOTUyLCAweDAyNzNiMTNiLCAweDAyNmRiNmRiLCAweDAyNjdkOTViLCAweDAyNjIxN2VjLAorICAgIDB4MDI1YzcxYzcsIDB4MDI1NmU2MmEsIDB4MDI1MTc0NWQsIDB4MDI0YzFiYWMsIDB4MDI0NmRiNmQsIDB4MDI0MWIyZjksCisgICAgMHgwMjNjYTFhZiwgMHgwMjM3YTZmNCwgMHgwMjMyYzIzNCwgMHgwMjJkZjJkZiwgMHgwMjI5Mzg2OCwgMHgwMjI0OTI0OSwKKyAgICAweDAyMjAwMDAwLCAweDAyMWI4MTBlLCAweDAyMTcxNGZiLCAweDAyMTJiYjUxLCAweDAyMGU3MzljLCAweDAyMGEzZDcwLAorICAgIDB4MDIwNjE4NjEsIDB4MDIwMjA0MDgsIDB4MDFmZTAwMDAsIDB4MDFmYTBiZTgsIDB4MDFmNjI3NjIsIDB4MDFmMjUyMTMsCisgICAgMHgwMWVlOGJhMiwgMHgwMWVhZDNiYSwgMHgwMWU3MmEwNywgMHgwMWUzOGUzOCwgMHgwMWUwMDAwMCwgMHgwMWRjN2YxMCwKKyAgICAweDAxZDkwYjIxLCAweDAxZDVhM2U5LCAweDAxZDI0OTI0LCAweDAxY2VmYThkLCAweDAxY2JiN2UzLCAweDAxYzg4MGU1LAorICAgIDB4MDFjNTU1NTUsIDB4MDFjMjM0ZjcsIDB4MDFiZjFmOGYsIDB4MDFiYzE0ZTUsIDB4MDFiOTE0YzEsIDB4MDFiNjFlZWQsCisgICAgMHgwMWIzMzMzMywgMHgwMWIwNTE2MCwgMHgwMWFkNzk0MywgMHgwMWFhYWFhYSwgMHgwMWE3ZTU2NywgMHgwMWE1Mjk0YSwKKyAgICAweDAxYTI3NjI3LCAweDAxOWZjYmQyLCAweDAxOWQyYTIwLCAweDAxOWE5MGU3LCAweDAxOTgwMDAwLCAweDAxOTU3NzQxLAorICAgIDB4MDE5MmY2ODQsIDB4MDE5MDdkYTQsIDB4MDE4ZTBjN2MsIDB4MDE4YmEyZTgsIDB4MDE4OTQwYzUsIDB4MDE4NmU1ZjAsCisgICAgMHgwMTg0OTI0OSwgMHgwMTgyNDVhZSwgMHgwMTgwMDAwMCwgMHgwMTdkYzExZiwgMHgwMTdiODhlZSwgMHgwMTc5NTc0ZSwKKyAgICAweDAxNzcyYzIzLCAweDAxNzUwNzUwLCAweDAxNzJlOGJhLCAweDAxNzBkMDQ1LCAweDAxNmViZGQ3LCAweDAxNmNiMTU3LAorICAgIDB4MDE2YWFhYWEsIDB4MDE2OGE5YjksIDB4MDE2NmFlNmEsIDB4MDE2NGI4YTcsIDB4MDE2MmM4NTksIDB4MDE2MGRkNjcsCisgICAgMHgwMTVlZjdiZCwgMHgwMTVkMTc0NSwgMHgwMTViM2JlYSwgMHgwMTU5NjU5NiwgMHgwMTU3OTQzNSwgMHgwMTU1YzdiNCwKKyAgICAweDAxNTQwMDAwLCAweDAxNTIzZDAzLCAweDAxNTA3ZWFlLCAweDAxNGVjNGVjLCAweDAxNGQwZmFjLCAweDAxNGI1ZWRjLAorICAgIDB4MDE0OWIyNmMsIDB4MDE0ODBhNGEsIDB4MDE0NjY2NjYsIDB4MDE0NGM2YWYsIDB4MDE0MzJiMTYsIDB4MDE0MTkzOGIsCisgICAgMHgwMTQwMDAwMCwgMHgwMTNlNzA2MywgMHgwMTNjZTRhOSwgMHgwMTNiNWNjMCwgMHgwMTM5ZDg5ZCwgMHgwMTM4NTgzMCwKKyAgICAweDAxMzZkYjZkLCAweDAxMzU2MjQ2LCAweDAxMzNlY2FkLCAweDAxMzI3YTk3LCAweDAxMzEwYmY2LCAweDAxMmZhMGJlLAorICAgIDB4MDEyZTM4ZTMsIDB4MDEyY2Q0NTksIDB4MDEyYjczMTUsIDB4MDEyYTE1MGEsIDB4MDEyOGJhMmUsIDB4MDEyNzYyNzYsCisgICAgMHgwMTI2MGRkNiwgMHgwMTI0YmM0NCwgMHgwMTIzNmRiNiwgMHgwMTIyMjIyMiwgMHgwMTIwZDk3YywgMHgwMTFmOTNiYywKKyAgICAweDAxMWU1MGQ3LCAweDAxMWQxMGM0LCAweDAxMWJkMzdhLCAweDAxMWE5OGVmLCAweDAxMTk2MTFhLCAweDAxMTgyYmYyLAorICAgIDB4MDExNmY5NmYsIDB4MDExNWM5ODgsIDB4MDExNDljMzQsIDB4MDExMzcxNmEsIDB4MDExMjQ5MjQsIDB4MDExMTIzNTgsCisgICAgMHgwMTEwMDAwMCwgMHgwMTBlZGYxMiwgMHgwMTBkYzA4NywgMHgwMTBjYTQ1OCwgMHgwMTBiOGE3ZCwgMHgwMTBhNzJmMCwKKyAgICAweDAxMDk1ZGE4LCAweDAxMDg0YTlmLCAweDAxMDczOWNlLCAweDAxMDYyYjJlLCAweDAxMDUxZWI4LCAweDAxMDQxNDY1LAorICAgIDB4MDEwMzBjMzAsIDB4MDEwMjA2MTIsIDB4MDEwMTAyMDQsIDB4MDEwMDAwMDAgfSwKKyAgeyAgIC8vIGFscGhhICogS0lOVl8yNTUKKyAgICAweDAwMDAwMDAwLCAweDAwMDEwMTAxLCAweDAwMDIwMjAyLCAweDAwMDMwMzAzLCAweDAwMDQwNDA0LCAweDAwMDUwNTA1LAorICAgIDB4MDAwNjA2MDYsIDB4MDAwNzA3MDcsIDB4MDAwODA4MDgsIDB4MDAwOTA5MDksIDB4MDAwYTBhMGEsIDB4MDAwYjBiMGIsCisgICAgMHgwMDBjMGMwYywgMHgwMDBkMGQwZCwgMHgwMDBlMGUwZSwgMHgwMDBmMGYwZiwgMHgwMDEwMTAxMCwgMHgwMDExMTExMSwKKyAgICAweDAwMTIxMjEyLCAweDAwMTMxMzEzLCAweDAwMTQxNDE0LCAweDAwMTUxNTE1LCAweDAwMTYxNjE2LCAweDAwMTcxNzE3LAorICAgIDB4MDAxODE4MTgsIDB4MDAxOTE5MTksIDB4MDAxYTFhMWEsIDB4MDAxYjFiMWIsIDB4MDAxYzFjMWMsIDB4MDAxZDFkMWQsCisgICAgMHgwMDFlMWUxZSwgMHgwMDFmMWYxZiwgMHgwMDIwMjAyMCwgMHgwMDIxMjEyMSwgMHgwMDIyMjIyMiwgMHgwMDIzMjMyMywKKyAgICAweDAwMjQyNDI0LCAweDAwMjUyNTI1LCAweDAwMjYyNjI2LCAweDAwMjcyNzI3LCAweDAwMjgyODI4LCAweDAwMjkyOTI5LAorICAgIDB4MDAyYTJhMmEsIDB4MDAyYjJiMmIsIDB4MDAyYzJjMmMsIDB4MDAyZDJkMmQsIDB4MDAyZTJlMmUsIDB4MDAyZjJmMmYsCisgICAgMHgwMDMwMzAzMCwgMHgwMDMxMzEzMSwgMHgwMDMyMzIzMiwgMHgwMDMzMzMzMywgMHgwMDM0MzQzNCwgMHgwMDM1MzUzNSwKKyAgICAweDAwMzYzNjM2LCAweDAwMzczNzM3LCAweDAwMzgzODM4LCAweDAwMzkzOTM5LCAweDAwM2EzYTNhLCAweDAwM2IzYjNiLAorICAgIDB4MDAzYzNjM2MsIDB4MDAzZDNkM2QsIDB4MDAzZTNlM2UsIDB4MDAzZjNmM2YsIDB4MDA0MDQwNDAsIDB4MDA0MTQxNDEsCisgICAgMHgwMDQyNDI0MiwgMHgwMDQzNDM0MywgMHgwMDQ0NDQ0NCwgMHgwMDQ1NDU0NSwgMHgwMDQ2NDY0NiwgMHgwMDQ3NDc0NywKKyAgICAweDAwNDg0ODQ4LCAweDAwNDk0OTQ5LCAweDAwNGE0YTRhLCAweDAwNGI0YjRiLCAweDAwNGM0YzRjLCAweDAwNGQ0ZDRkLAorICAgIDB4MDA0ZTRlNGUsIDB4MDA0ZjRmNGYsIDB4MDA1MDUwNTAsIDB4MDA1MTUxNTEsIDB4MDA1MjUyNTIsIDB4MDA1MzUzNTMsCisgICAgMHgwMDU0NTQ1NCwgMHgwMDU1NTU1NSwgMHgwMDU2NTY1NiwgMHgwMDU3NTc1NywgMHgwMDU4NTg1OCwgMHgwMDU5NTk1OSwKKyAgICAweDAwNWE1YTVhLCAweDAwNWI1YjViLCAweDAwNWM1YzVjLCAweDAwNWQ1ZDVkLCAweDAwNWU1ZTVlLCAweDAwNWY1ZjVmLAorICAgIDB4MDA2MDYwNjAsIDB4MDA2MTYxNjEsIDB4MDA2MjYyNjIsIDB4MDA2MzYzNjMsIDB4MDA2NDY0NjQsIDB4MDA2NTY1NjUsCisgICAgMHgwMDY2NjY2NiwgMHgwMDY3Njc2NywgMHgwMDY4Njg2OCwgMHgwMDY5Njk2OSwgMHgwMDZhNmE2YSwgMHgwMDZiNmI2YiwKKyAgICAweDAwNmM2YzZjLCAweDAwNmQ2ZDZkLCAweDAwNmU2ZTZlLCAweDAwNmY2ZjZmLCAweDAwNzA3MDcwLCAweDAwNzE3MTcxLAorICAgIDB4MDA3MjcyNzIsIDB4MDA3MzczNzMsIDB4MDA3NDc0NzQsIDB4MDA3NTc1NzUsIDB4MDA3Njc2NzYsIDB4MDA3Nzc3NzcsCisgICAgMHgwMDc4Nzg3OCwgMHgwMDc5Nzk3OSwgMHgwMDdhN2E3YSwgMHgwMDdiN2I3YiwgMHgwMDdjN2M3YywgMHgwMDdkN2Q3ZCwKKyAgICAweDAwN2U3ZTdlLCAweDAwN2Y3ZjdmLCAweDAwODA4MDgwLCAweDAwODE4MTgxLCAweDAwODI4MjgyLCAweDAwODM4MzgzLAorICAgIDB4MDA4NDg0ODQsIDB4MDA4NTg1ODUsIDB4MDA4Njg2ODYsIDB4MDA4Nzg3ODcsIDB4MDA4ODg4ODgsIDB4MDA4OTg5ODksCisgICAgMHgwMDhhOGE4YSwgMHgwMDhiOGI4YiwgMHgwMDhjOGM4YywgMHgwMDhkOGQ4ZCwgMHgwMDhlOGU4ZSwgMHgwMDhmOGY4ZiwKKyAgICAweDAwOTA5MDkwLCAweDAwOTE5MTkxLCAweDAwOTI5MjkyLCAweDAwOTM5MzkzLCAweDAwOTQ5NDk0LCAweDAwOTU5NTk1LAorICAgIDB4MDA5Njk2OTYsIDB4MDA5Nzk3OTcsIDB4MDA5ODk4OTgsIDB4MDA5OTk5OTksIDB4MDA5YTlhOWEsIDB4MDA5YjliOWIsCisgICAgMHgwMDljOWM5YywgMHgwMDlkOWQ5ZCwgMHgwMDllOWU5ZSwgMHgwMDlmOWY5ZiwgMHgwMGEwYTBhMCwgMHgwMGExYTFhMSwKKyAgICAweDAwYTJhMmEyLCAweDAwYTNhM2EzLCAweDAwYTRhNGE0LCAweDAwYTVhNWE1LCAweDAwYTZhNmE2LCAweDAwYTdhN2E3LAorICAgIDB4MDBhOGE4YTgsIDB4MDBhOWE5YTksIDB4MDBhYWFhYWEsIDB4MDBhYmFiYWIsIDB4MDBhY2FjYWMsIDB4MDBhZGFkYWQsCisgICAgMHgwMGFlYWVhZSwgMHgwMGFmYWZhZiwgMHgwMGIwYjBiMCwgMHgwMGIxYjFiMSwgMHgwMGIyYjJiMiwgMHgwMGIzYjNiMywKKyAgICAweDAwYjRiNGI0LCAweDAwYjViNWI1LCAweDAwYjZiNmI2LCAweDAwYjdiN2I3LCAweDAwYjhiOGI4LCAweDAwYjliOWI5LAorICAgIDB4MDBiYWJhYmEsIDB4MDBiYmJiYmIsIDB4MDBiY2JjYmMsIDB4MDBiZGJkYmQsIDB4MDBiZWJlYmUsIDB4MDBiZmJmYmYsCisgICAgMHgwMGMwYzBjMCwgMHgwMGMxYzFjMSwgMHgwMGMyYzJjMiwgMHgwMGMzYzNjMywgMHgwMGM0YzRjNCwgMHgwMGM1YzVjNSwKKyAgICAweDAwYzZjNmM2LCAweDAwYzdjN2M3LCAweDAwYzhjOGM4LCAweDAwYzljOWM5LCAweDAwY2FjYWNhLCAweDAwY2JjYmNiLAorICAgIDB4MDBjY2NjY2MsIDB4MDBjZGNkY2QsIDB4MDBjZWNlY2UsIDB4MDBjZmNmY2YsIDB4MDBkMGQwZDAsIDB4MDBkMWQxZDEsCisgICAgMHgwMGQyZDJkMiwgMHgwMGQzZDNkMywgMHgwMGQ0ZDRkNCwgMHgwMGQ1ZDVkNSwgMHgwMGQ2ZDZkNiwgMHgwMGQ3ZDdkNywKKyAgICAweDAwZDhkOGQ4LCAweDAwZDlkOWQ5LCAweDAwZGFkYWRhLCAweDAwZGJkYmRiLCAweDAwZGNkY2RjLCAweDAwZGRkZGRkLAorICAgIDB4MDBkZWRlZGUsIDB4MDBkZmRmZGYsIDB4MDBlMGUwZTAsIDB4MDBlMWUxZTEsIDB4MDBlMmUyZTIsIDB4MDBlM2UzZTMsCisgICAgMHgwMGU0ZTRlNCwgMHgwMGU1ZTVlNSwgMHgwMGU2ZTZlNiwgMHgwMGU3ZTdlNywgMHgwMGU4ZThlOCwgMHgwMGU5ZTllOSwKKyAgICAweDAwZWFlYWVhLCAweDAwZWJlYmViLCAweDAwZWNlY2VjLCAweDAwZWRlZGVkLCAweDAwZWVlZWVlLCAweDAwZWZlZmVmLAorICAgIDB4MDBmMGYwZjAsIDB4MDBmMWYxZjEsIDB4MDBmMmYyZjIsIDB4MDBmM2YzZjMsIDB4MDBmNGY0ZjQsIDB4MDBmNWY1ZjUsCisgICAgMHgwMGY2ZjZmNiwgMHgwMGY3ZjdmNywgMHgwMGY4ZjhmOCwgMHgwMGY5ZjlmOSwgMHgwMGZhZmFmYSwgMHgwMGZiZmJmYiwKKyAgICAweDAwZmNmY2ZjLCAweDAwZmRmZGZkLCAweDAwZmVmZWZlLCAweDAwZmZmZmZmIH0KK307CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBHZXRTY2FsZSh1aW50MzJfdCBhLCBpbnQgaW52ZXJzZSkgeworICByZXR1cm4ga011bHRUYWJsZXNbIWludmVyc2VdW2FdOworfQorCisjZWxzZQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgR2V0U2NhbGUodWludDMyX3QgYSwgaW50IGludmVyc2UpIHsKKyAgcmV0dXJuIGludmVyc2UgPyAoMjU1dSA8PCBNRklYKSAvIGEgOiBhICogS0lOVl8yNTU7Cit9CisKKyNlbmRpZiAgLy8gVVNFX1RBQkxFU19GT1JfQUxQSEFfTVVMVAorCit2b2lkIFdlYlBNdWx0QVJHQlJvd19DKHVpbnQzMl90KiBjb25zdCBwdHIsIGludCB3aWR0aCwgaW50IGludmVyc2UpIHsKKyAgaW50IHg7CisgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7CisgICAgY29uc3QgdWludDMyX3QgYXJnYiA9IHB0clt4XTsKKyAgICBpZiAoYXJnYiA8IDB4ZmYwMDAwMDB1KSB7ICAgICAgLy8gYWxwaGEgPCAyNTUKKyAgICAgIGlmIChhcmdiIDw9IDB4MDBmZmZmZmZ1KSB7ICAgLy8gYWxwaGEgPT0gMAorICAgICAgICBwdHJbeF0gPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgdWludDMyX3QgYWxwaGEgPSAoYXJnYiA+PiAyNCkgJiAweGZmOworICAgICAgICBjb25zdCB1aW50MzJfdCBzY2FsZSA9IEdldFNjYWxlKGFscGhhLCBpbnZlcnNlKTsKKyAgICAgICAgdWludDMyX3Qgb3V0ID0gYXJnYiAmIDB4ZmYwMDAwMDB1OworICAgICAgICBvdXQgfD0gTXVsdChhcmdiID4+ICAwLCBzY2FsZSkgPDwgIDA7CisgICAgICAgIG91dCB8PSBNdWx0KGFyZ2IgPj4gIDgsIHNjYWxlKSA8PCAgODsKKyAgICAgICAgb3V0IHw9IE11bHQoYXJnYiA+PiAxNiwgc2NhbGUpIDw8IDE2OworICAgICAgICBwdHJbeF0gPSBvdXQ7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3ZvaWQgV2ViUE11bHRSb3dfQyh1aW50OF90KiBjb25zdCBwdHIsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGFscGhhLAorICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGludmVyc2UpIHsKKyAgaW50IHg7CisgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7CisgICAgY29uc3QgdWludDMyX3QgYSA9IGFscGhhW3hdOworICAgIGlmIChhICE9IDI1NSkgeworICAgICAgaWYgKGEgPT0gMCkgeworICAgICAgICBwdHJbeF0gPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgdWludDMyX3Qgc2NhbGUgPSBHZXRTY2FsZShhLCBpbnZlcnNlKTsKKyAgICAgICAgcHRyW3hdID0gTXVsdChwdHJbeF0sIHNjYWxlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworI3VuZGVmIEtJTlZfMjU1CisjdW5kZWYgSEFMRgorI3VuZGVmIE1GSVgKKwordm9pZCAoKldlYlBNdWx0QVJHQlJvdykodWludDMyX3QqIGNvbnN0IHB0ciwgaW50IHdpZHRoLCBpbnQgaW52ZXJzZSk7Cit2b2lkICgqV2ViUE11bHRSb3cpKHVpbnQ4X3QqIGNvbnN0IHB0ciwgY29uc3QgdWludDhfdCogY29uc3QgYWxwaGEsCisgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGludmVyc2UpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gR2VuZXJpYyBwZXItcGxhbmUgY2FsbHMKKwordm9pZCBXZWJQTXVsdEFSR0JSb3dzKHVpbnQ4X3QqIHB0ciwgaW50IHN0cmlkZSwgaW50IHdpZHRoLCBpbnQgbnVtX3Jvd3MsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGludmVyc2UpIHsKKyAgaW50IG47CisgIGZvciAobiA9IDA7IG4gPCBudW1fcm93czsgKytuKSB7CisgICAgV2ViUE11bHRBUkdCUm93KCh1aW50MzJfdCopcHRyLCB3aWR0aCwgaW52ZXJzZSk7CisgICAgcHRyICs9IHN0cmlkZTsKKyAgfQorfQorCit2b2lkIFdlYlBNdWx0Um93cyh1aW50OF90KiBwdHIsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBhbHBoYSwgaW50IGFscGhhX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IG51bV9yb3dzLCBpbnQgaW52ZXJzZSkgeworICBpbnQgbjsKKyAgZm9yIChuID0gMDsgbiA8IG51bV9yb3dzOyArK24pIHsKKyAgICBXZWJQTXVsdFJvdyhwdHIsIGFscGhhLCB3aWR0aCwgaW52ZXJzZSk7CisgICAgcHRyICs9IHN0cmlkZTsKKyAgICBhbHBoYSArPSBhbHBoYV9zdHJpZGU7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFByZW11bHRpcGxpZWQgbW9kZXMKKworLy8gbm9uIGRpdGhlcmVkLW1vZGVzCisKKy8vICh4ICogYSAqIDMyODk3KSA+PiAyMyBpcyBiaXQtd2lzZSBlcXVpdmFsZW50IHRvIChpbnQpKHggKiBhIC8gMjU1LikKKy8vIGZvciBhbGwgOGJpdCB4IG9yIGEuIEZvciBiaXQtd2lzZSBlcXVpdmFsZW5jZSB0byAoaW50KSh4ICogYSAvIDI1NS4gKyAuNSksCisvLyBvbmUgY2FuIHVzZSBpbnN0ZWFkOiAoeCAqIGEgKiA2NTc5MyArICgxIDw8IDIzKSkgPj4gMjQKKyNpZiAxICAgICAvLyAoaW50KSh4ICogYSAvIDI1NS4pCisjZGVmaW5lIE1VTFRJUExJRVIoYSkgICAoKGEpICogMzI4OTdVKQorI2RlZmluZSBQUkVNVUxUSVBMWSh4LCBtKSAoKCh4KSAqIChtKSkgPj4gMjMpCisjZWxzZSAgICAgLy8gKGludCkoeCAqIGEgLyAyNTUuICsgLjUpCisjZGVmaW5lIE1VTFRJUExJRVIoYSkgKChhKSAqIDY1NzkzVSkKKyNkZWZpbmUgUFJFTVVMVElQTFkoeCwgbSkgKCgoeCkgKiAobSkgKyAoMVUgPDwgMjMpKSA+PiAyNCkKKyNlbmRpZgorCisjaWYgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorc3RhdGljIHZvaWQgQXBwbHlBbHBoYU11bHRpcGx5X0ModWludDhfdCogcmdiYSwgaW50IGFscGhhX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLCBpbnQgc3RyaWRlKSB7CisgIHdoaWxlIChoLS0gPiAwKSB7CisgICAgdWludDhfdCogY29uc3QgcmdiID0gcmdiYSArIChhbHBoYV9maXJzdCA/IDEgOiAwKTsKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCBhbHBoYSA9IHJnYmEgKyAoYWxwaGFfZmlyc3QgPyAwIDogMyk7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IHc7ICsraSkgeworICAgICAgY29uc3QgdWludDMyX3QgYSA9IGFscGhhWzQgKiBpXTsKKyAgICAgIGlmIChhICE9IDB4ZmYpIHsKKyAgICAgICAgY29uc3QgdWludDMyX3QgbXVsdCA9IE1VTFRJUExJRVIoYSk7CisgICAgICAgIHJnYls0ICogaSArIDBdID0gUFJFTVVMVElQTFkocmdiWzQgKiBpICsgMF0sIG11bHQpOworICAgICAgICByZ2JbNCAqIGkgKyAxXSA9IFBSRU1VTFRJUExZKHJnYls0ICogaSArIDFdLCBtdWx0KTsKKyAgICAgICAgcmdiWzQgKiBpICsgMl0gPSBQUkVNVUxUSVBMWShyZ2JbNCAqIGkgKyAyXSwgbXVsdCk7CisgICAgICB9CisgICAgfQorICAgIHJnYmEgKz0gc3RyaWRlOworICB9Cit9CisjZW5kaWYgIC8vICFXRUJQX05FT05fT01JVF9DX0NPREUKKyN1bmRlZiBNVUxUSVBMSUVSCisjdW5kZWYgUFJFTVVMVElQTFkKKworLy8gcmdiQTQ0NDQKKworI2RlZmluZSBNVUxUSVBMSUVSKGEpICAoKGEpICogMHgxMTExKSAgICAvLyAweDExMTEgfj0gKDEgPDwgMTYpIC8gMTUKKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ4X3QgZGl0aGVyX2hpKHVpbnQ4X3QgeCkgeworICByZXR1cm4gKHggJiAweGYwKSB8ICh4ID4+IDQpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDhfdCBkaXRoZXJfbG8odWludDhfdCB4KSB7CisgIHJldHVybiAoeCAmIDB4MGYpIHwgKHggPDwgNCk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50OF90IG11bHRpcGx5KHVpbnQ4X3QgeCwgdWludDMyX3QgbSkgeworICByZXR1cm4gKHggKiBtKSA+PiAxNjsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgQXBwbHlBbHBoYU11bHRpcGx5NDQ0NF9DKHVpbnQ4X3QqIHJnYmE0NDQ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmdfYnl0ZV9wb3MgLyogMCBvciAxICovKSB7CisgIHdoaWxlIChoLS0gPiAwKSB7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IHc7ICsraSkgeworICAgICAgY29uc3QgdWludDMyX3QgcmcgPSByZ2JhNDQ0NFsyICogaSArIHJnX2J5dGVfcG9zXTsKKyAgICAgIGNvbnN0IHVpbnQzMl90IGJhID0gcmdiYTQ0NDRbMiAqIGkgKyAocmdfYnl0ZV9wb3MgXiAxKV07CisgICAgICBjb25zdCB1aW50OF90IGEgPSBiYSAmIDB4MGY7CisgICAgICBjb25zdCB1aW50MzJfdCBtdWx0ID0gTVVMVElQTElFUihhKTsKKyAgICAgIGNvbnN0IHVpbnQ4X3QgciA9IG11bHRpcGx5KGRpdGhlcl9oaShyZyksIG11bHQpOworICAgICAgY29uc3QgdWludDhfdCBnID0gbXVsdGlwbHkoZGl0aGVyX2xvKHJnKSwgbXVsdCk7CisgICAgICBjb25zdCB1aW50OF90IGIgPSBtdWx0aXBseShkaXRoZXJfaGkoYmEpLCBtdWx0KTsKKyAgICAgIHJnYmE0NDQ0WzIgKiBpICsgcmdfYnl0ZV9wb3NdID0gKHIgJiAweGYwKSB8ICgoZyA+PiA0KSAmIDB4MGYpOworICAgICAgcmdiYTQ0NDRbMiAqIGkgKyAocmdfYnl0ZV9wb3MgXiAxKV0gPSAoYiAmIDB4ZjApIHwgYTsKKyAgICB9CisgICAgcmdiYTQ0NDQgKz0gc3RyaWRlOworICB9Cit9CisjdW5kZWYgTVVMVElQTElFUgorCitzdGF0aWMgdm9pZCBBcHBseUFscGhhTXVsdGlwbHlfMTZiX0ModWludDhfdCogcmdiYTQ0NDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLCBpbnQgc3RyaWRlKSB7CisjaWYgKFdFQlBfU1dBUF8xNkJJVF9DU1AgPT0gMSkKKyAgQXBwbHlBbHBoYU11bHRpcGx5NDQ0NF9DKHJnYmE0NDQ0LCB3LCBoLCBzdHJpZGUsIDEpOworI2Vsc2UKKyAgQXBwbHlBbHBoYU11bHRpcGx5NDQ0NF9DKHJnYmE0NDQ0LCB3LCBoLCBzdHJpZGUsIDApOworI2VuZGlmCit9CisKKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCitzdGF0aWMgaW50IERpc3BhdGNoQWxwaGFfQyhjb25zdCB1aW50OF90KiBhbHBoYSwgaW50IGFscGhhX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGRzdF9zdHJpZGUpIHsKKyAgdWludDMyX3QgYWxwaGFfbWFzayA9IDB4ZmY7CisgIGludCBpLCBqOworCisgIGZvciAoaiA9IDA7IGogPCBoZWlnaHQ7ICsraikgeworICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgKytpKSB7CisgICAgICBjb25zdCB1aW50MzJfdCBhbHBoYV92YWx1ZSA9IGFscGhhW2ldOworICAgICAgZHN0WzQgKiBpXSA9IGFscGhhX3ZhbHVlOworICAgICAgYWxwaGFfbWFzayAmPSBhbHBoYV92YWx1ZTsKKyAgICB9CisgICAgYWxwaGEgKz0gYWxwaGFfc3RyaWRlOworICAgIGRzdCArPSBkc3Rfc3RyaWRlOworICB9CisKKyAgcmV0dXJuIChhbHBoYV9tYXNrICE9IDB4ZmYpOworfQorCitzdGF0aWMgdm9pZCBEaXNwYXRjaEFscGhhVG9HcmVlbl9DKGNvbnN0IHVpbnQ4X3QqIGFscGhhLCBpbnQgYWxwaGFfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkc3QsIGludCBkc3Rfc3RyaWRlKSB7CisgIGludCBpLCBqOworICBmb3IgKGogPSAwOyBqIDwgaGVpZ2h0OyArK2opIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7ICsraSkgeworICAgICAgZHN0W2ldID0gYWxwaGFbaV0gPDwgODsgIC8vIGxlYXZlIEEvUi9CIGNoYW5uZWxzIHplcm8nZC4KKyAgICB9CisgICAgYWxwaGEgKz0gYWxwaGFfc3RyaWRlOworICAgIGRzdCArPSBkc3Rfc3RyaWRlOworICB9Cit9CisKK3N0YXRpYyBpbnQgRXh0cmFjdEFscGhhX0MoY29uc3QgdWludDhfdCogYXJnYiwgaW50IGFyZ2Jfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGFscGhhLCBpbnQgYWxwaGFfc3RyaWRlKSB7CisgIHVpbnQ4X3QgYWxwaGFfbWFzayA9IDB4ZmY7CisgIGludCBpLCBqOworCisgIGZvciAoaiA9IDA7IGogPCBoZWlnaHQ7ICsraikgeworICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgKytpKSB7CisgICAgICBjb25zdCB1aW50OF90IGFscGhhX3ZhbHVlID0gYXJnYls0ICogaV07CisgICAgICBhbHBoYVtpXSA9IGFscGhhX3ZhbHVlOworICAgICAgYWxwaGFfbWFzayAmPSBhbHBoYV92YWx1ZTsKKyAgICB9CisgICAgYXJnYiArPSBhcmdiX3N0cmlkZTsKKyAgICBhbHBoYSArPSBhbHBoYV9zdHJpZGU7CisgIH0KKyAgcmV0dXJuIChhbHBoYV9tYXNrID09IDB4ZmYpOworfQorCitzdGF0aWMgdm9pZCBFeHRyYWN0R3JlZW5fQyhjb25zdCB1aW50MzJfdCogYXJnYiwgdWludDhfdCogYWxwaGEsIGludCBzaXplKSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgKytpKSBhbHBoYVtpXSA9IGFyZ2JbaV0gPj4gODsKK30KKyNlbmRpZiAgLy8gIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50IEhhc0FscGhhOGJfQyhjb25zdCB1aW50OF90KiBzcmMsIGludCBsZW5ndGgpIHsKKyAgd2hpbGUgKGxlbmd0aC0tID4gMCkgaWYgKCpzcmMrKyAhPSAweGZmKSByZXR1cm4gMTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgSGFzQWxwaGEzMmJfQyhjb25zdCB1aW50OF90KiBzcmMsIGludCBsZW5ndGgpIHsKKyAgaW50IHg7CisgIGZvciAoeCA9IDA7IGxlbmd0aC0tID4gMDsgeCArPSA0KSBpZiAoc3JjW3hdICE9IDB4ZmYpIHJldHVybiAxOworICByZXR1cm4gMDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFNpbXBsZSBjaGFubmVsIG1hbmlwdWxhdGlvbnMuCisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBNYWtlQVJHQjMyKGludCBhLCBpbnQgciwgaW50IGcsIGludCBiKSB7CisgIHJldHVybiAoKCh1aW50MzJfdClhIDw8IDI0KSB8IChyIDw8IDE2KSB8IChnIDw8IDgpIHwgYik7Cit9CisKKyNpZmRlZiBXT1JEU19CSUdFTkRJQU4KK3N0YXRpYyB2b2lkIFBhY2tBUkdCX0MoY29uc3QgdWludDhfdCogYSwgY29uc3QgdWludDhfdCogciwgY29uc3QgdWludDhfdCogZywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogYiwgaW50IGxlbiwgdWludDMyX3QqIG91dCkgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7CisgICAgb3V0W2ldID0gTWFrZUFSR0IzMihhWzQgKiBpXSwgcls0ICogaV0sIGdbNCAqIGldLCBiWzQgKiBpXSk7CisgIH0KK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBQYWNrUkdCX0MoY29uc3QgdWludDhfdCogciwgY29uc3QgdWludDhfdCogZywgY29uc3QgdWludDhfdCogYiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBpbnQgc3RlcCwgdWludDMyX3QqIG91dCkgeworICBpbnQgaSwgb2Zmc2V0ID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7CisgICAgb3V0W2ldID0gTWFrZUFSR0IzMigweGZmLCByW29mZnNldF0sIGdbb2Zmc2V0XSwgYltvZmZzZXRdKTsKKyAgICBvZmZzZXQgKz0gc3RlcDsKKyAgfQorfQorCit2b2lkICgqV2ViUEFwcGx5QWxwaGFNdWx0aXBseSkodWludDhfdCosIGludCwgaW50LCBpbnQsIGludCk7Cit2b2lkICgqV2ViUEFwcGx5QWxwaGFNdWx0aXBseTQ0NDQpKHVpbnQ4X3QqLCBpbnQsIGludCwgaW50KTsKK2ludCAoKldlYlBEaXNwYXRjaEFscGhhKShjb25zdCB1aW50OF90KiwgaW50LCBpbnQsIGludCwgdWludDhfdCosIGludCk7Cit2b2lkICgqV2ViUERpc3BhdGNoQWxwaGFUb0dyZWVuKShjb25zdCB1aW50OF90KiwgaW50LCBpbnQsIGludCwgdWludDMyX3QqLCBpbnQpOworaW50ICgqV2ViUEV4dHJhY3RBbHBoYSkoY29uc3QgdWludDhfdCosIGludCwgaW50LCBpbnQsIHVpbnQ4X3QqLCBpbnQpOwordm9pZCAoKldlYlBFeHRyYWN0R3JlZW4pKGNvbnN0IHVpbnQzMl90KiBhcmdiLCB1aW50OF90KiBhbHBoYSwgaW50IHNpemUpOworI2lmZGVmIFdPUkRTX0JJR0VORElBTgordm9pZCAoKldlYlBQYWNrQVJHQikoY29uc3QgdWludDhfdCogYSwgY29uc3QgdWludDhfdCogciwgY29uc3QgdWludDhfdCogZywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGIsIGludCwgdWludDMyX3QqKTsKKyNlbmRpZgordm9pZCAoKldlYlBQYWNrUkdCKShjb25zdCB1aW50OF90KiByLCBjb25zdCB1aW50OF90KiBnLCBjb25zdCB1aW50OF90KiBiLAorICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBpbnQgc3RlcCwgdWludDMyX3QqIG91dCk7CisKK2ludCAoKldlYlBIYXNBbHBoYThiKShjb25zdCB1aW50OF90KiBzcmMsIGludCBsZW5ndGgpOworaW50ICgqV2ViUEhhc0FscGhhMzJiKShjb25zdCB1aW50OF90KiBzcmMsIGludCBsZW5ndGgpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW5pdCBmdW5jdGlvbgorCitleHRlcm4gdm9pZCBXZWJQSW5pdEFscGhhUHJvY2Vzc2luZ01JUFNkc3BSMih2b2lkKTsKK2V4dGVybiB2b2lkIFdlYlBJbml0QWxwaGFQcm9jZXNzaW5nU1NFMih2b2lkKTsKK2V4dGVybiB2b2lkIFdlYlBJbml0QWxwaGFQcm9jZXNzaW5nU1NFNDEodm9pZCk7CitleHRlcm4gdm9pZCBXZWJQSW5pdEFscGhhUHJvY2Vzc2luZ05FT04odm9pZCk7CisKK1dFQlBfRFNQX0lOSVRfRlVOQyhXZWJQSW5pdEFscGhhUHJvY2Vzc2luZykgeworICBXZWJQTXVsdEFSR0JSb3cgPSBXZWJQTXVsdEFSR0JSb3dfQzsKKyAgV2ViUE11bHRSb3cgPSBXZWJQTXVsdFJvd19DOworICBXZWJQQXBwbHlBbHBoYU11bHRpcGx5NDQ0NCA9IEFwcGx5QWxwaGFNdWx0aXBseV8xNmJfQzsKKworI2lmZGVmIFdPUkRTX0JJR0VORElBTgorICBXZWJQUGFja0FSR0IgPSBQYWNrQVJHQl9DOworI2VuZGlmCisgIFdlYlBQYWNrUkdCID0gUGFja1JHQl9DOworI2lmICFXRUJQX05FT05fT01JVF9DX0NPREUKKyAgV2ViUEFwcGx5QWxwaGFNdWx0aXBseSA9IEFwcGx5QWxwaGFNdWx0aXBseV9DOworICBXZWJQRGlzcGF0Y2hBbHBoYSA9IERpc3BhdGNoQWxwaGFfQzsKKyAgV2ViUERpc3BhdGNoQWxwaGFUb0dyZWVuID0gRGlzcGF0Y2hBbHBoYVRvR3JlZW5fQzsKKyAgV2ViUEV4dHJhY3RBbHBoYSA9IEV4dHJhY3RBbHBoYV9DOworICBXZWJQRXh0cmFjdEdyZWVuID0gRXh0cmFjdEdyZWVuX0M7CisjZW5kaWYKKworICBXZWJQSGFzQWxwaGE4YiA9IEhhc0FscGhhOGJfQzsKKyAgV2ViUEhhc0FscGhhMzJiID0gSGFzQWxwaGEzMmJfQzsKKworICAvLyBJZiBkZWZpbmVkLCB1c2UgQ1BVSW5mbygpIHRvIG92ZXJ3cml0ZSBzb21lIHBvaW50ZXJzIHdpdGggZmFzdGVyIHZlcnNpb25zLgorICBpZiAoVlA4R2V0Q1BVSW5mbyAhPSBOVUxMKSB7CisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0UyKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtTU0UyKSkgeworICAgICAgV2ViUEluaXRBbHBoYVByb2Nlc3NpbmdTU0UyKCk7CisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0U0MSkKKyAgICAgIGlmIChWUDhHZXRDUFVJbmZvKGtTU0U0XzEpKSB7CisgICAgICAgIFdlYlBJbml0QWxwaGFQcm9jZXNzaW5nU1NFNDEoKTsKKyAgICAgIH0KKyNlbmRpZgorICAgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQU19EU1BfUjIpCisgICAgaWYgKFZQOEdldENQVUluZm8oa01JUFNkc3BSMikpIHsKKyAgICAgIFdlYlBJbml0QWxwaGFQcm9jZXNzaW5nTUlQU2RzcFIyKCk7CisgICAgfQorI2VuZGlmCisgIH0KKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTkVPTikKKyAgaWYgKFdFQlBfTkVPTl9PTUlUX0NfQ09ERSB8fAorICAgICAgKFZQOEdldENQVUluZm8gIT0gTlVMTCAmJiBWUDhHZXRDUFVJbmZvKGtORU9OKSkpIHsKKyAgICBXZWJQSW5pdEFscGhhUHJvY2Vzc2luZ05FT04oKTsKKyAgfQorI2VuZGlmCisKKyAgYXNzZXJ0KFdlYlBNdWx0QVJHQlJvdyAhPSBOVUxMKTsKKyAgYXNzZXJ0KFdlYlBNdWx0Um93ICE9IE5VTEwpOworICBhc3NlcnQoV2ViUEFwcGx5QWxwaGFNdWx0aXBseSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFdlYlBBcHBseUFscGhhTXVsdGlwbHk0NDQ0ICE9IE5VTEwpOworICBhc3NlcnQoV2ViUERpc3BhdGNoQWxwaGEgIT0gTlVMTCk7CisgIGFzc2VydChXZWJQRGlzcGF0Y2hBbHBoYVRvR3JlZW4gIT0gTlVMTCk7CisgIGFzc2VydChXZWJQRXh0cmFjdEFscGhhICE9IE5VTEwpOworICBhc3NlcnQoV2ViUEV4dHJhY3RHcmVlbiAhPSBOVUxMKTsKKyNpZmRlZiBXT1JEU19CSUdFTkRJQU4KKyAgYXNzZXJ0KFdlYlBQYWNrQVJHQiAhPSBOVUxMKTsKKyNlbmRpZgorICBhc3NlcnQoV2ViUFBhY2tSR0IgIT0gTlVMTCk7CisgIGFzc2VydChXZWJQSGFzQWxwaGE4YiAhPSBOVUxMKTsKKyAgYXNzZXJ0KFdlYlBIYXNBbHBoYTMyYiAhPSBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvYWxwaGFfcHJvY2Vzc2luZ19taXBzX2RzcF9yMi5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9hbHBoYV9wcm9jZXNzaW5nX21pcHNfZHNwX3IyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA5MGU4NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvYWxwaGFfcHJvY2Vzc2luZ19taXBzX2RzcF9yMi5jCkBAIC0wLDAgKzEsMjI4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVXRpbGl0aWVzIGZvciBwcm9jZXNzaW5nIHRyYW5zcGFyZW50IGNoYW5uZWwuCisvLworLy8gQXV0aG9yKHMpOiBCcmFuaW1pciBWYXNpYyAoYnJhbmltaXIudmFzaWNAaW1ndGVjLmNvbSkKKy8vICAgICAgICAgICAgRGpvcmRqZSBQZXN1dCAgKGRqb3JkamUucGVzdXRAaW1ndGVjLmNvbSkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFNfRFNQX1IyKQorCitzdGF0aWMgaW50IERpc3BhdGNoQWxwaGFfTUlQU2RzcFIyKGNvbnN0IHVpbnQ4X3QqIGFscGhhLCBpbnQgYWxwaGFfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGRzdF9zdHJpZGUpIHsKKyAgdWludDMyX3QgYWxwaGFfbWFzayA9IDB4ZmZmZmZmZmY7CisgIGludCBpLCBqLCB0ZW1wMDsKKworICBmb3IgKGogPSAwOyBqIDwgaGVpZ2h0OyArK2opIHsKKyAgICB1aW50OF90KiBwZHN0ID0gZHN0OworICAgIGNvbnN0IHVpbnQ4X3QqIHBhbHBoYSA9IGFscGhhOworICAgIGZvciAoaSA9IDA7IGkgPCAod2lkdGggPj4gMik7ICsraSkgeworICAgICAgaW50IHRlbXAxLCB0ZW1wMiwgdGVtcDM7CisKKyAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAidWx3ICAgICVbdGVtcDBdLCAgICAgIDAoJVtwYWxwaGFdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkaXUgICVbcGFscGhhXSwgICAgICVbcGFscGhhXSwgICAgIDQgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkaXUgICVbcGRzdF0sICAgICAgICVbcGRzdF0sICAgICAgIDE2ICAgICAgICAgICBcblx0IgorICAgICAgICAic3JsICAgICVbdGVtcDFdLCAgICAgICVbdGVtcDBdLCAgICAgIDggICAgICAgICAgICBcblx0IgorICAgICAgICAic3JsICAgICVbdGVtcDJdLCAgICAgICVbdGVtcDBdLCAgICAgIDE2ICAgICAgICAgICBcblx0IgorICAgICAgICAic3JsICAgICVbdGVtcDNdLCAgICAgICVbdGVtcDBdLCAgICAgIDI0ICAgICAgICAgICBcblx0IgorICAgICAgICAiYW5kICAgICVbYWxwaGFfbWFza10sICVbYWxwaGFfbWFza10sICVbdGVtcDBdICAgICBcblx0IgorICAgICAgICAic2IgICAgICVbdGVtcDBdLCAgICAgIC0xNiglW3Bkc3RdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2IgICAgICVbdGVtcDFdLCAgICAgIC0xMiglW3Bkc3RdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2IgICAgICVbdGVtcDJdLCAgICAgIC04KCVbcGRzdF0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2IgICAgICVbdGVtcDNdLCAgICAgIC00KCVbcGRzdF0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3BhbHBoYV0iK3IiKHBhbHBoYSksIFtwZHN0XSIrciIocGRzdCksCisgICAgICAgICAgW2FscGhhX21hc2tdIityIihhbHBoYV9tYXNrKQorICAgICAgICA6CisgICAgICAgIDogIm1lbW9yeSIKKyAgICAgICk7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8ICh3aWR0aCAmIDMpOyArK2kpIHsKKyAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAibGJ1ICAgICVbdGVtcDBdLCAgICAgIDAoJVtwYWxwaGFdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkaXUgICVbcGFscGhhXSwgICAgICVbcGFscGhhXSwgICAgIDEgICAgICAgICAgICBcblx0IgorICAgICAgICAic2IgICAgICVbdGVtcDBdLCAgICAgIDAoJVtwZHN0XSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYW5kICAgICVbYWxwaGFfbWFza10sICVbYWxwaGFfbWFza10sICVbdGVtcDBdICAgICBcblx0IgorICAgICAgICAiYWRkaXUgICVbcGRzdF0sICAgICAgICVbcGRzdF0sICAgICAgIDQgICAgICAgICAgICBcblx0IgorICAgICAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFtwYWxwaGFdIityIihwYWxwaGEpLCBbcGRzdF0iK3IiKHBkc3QpLAorICAgICAgICAgIFthbHBoYV9tYXNrXSIrciIoYWxwaGFfbWFzaykKKyAgICAgICAgOgorICAgICAgICA6ICJtZW1vcnkiCisgICAgICApOworICAgIH0KKyAgICBhbHBoYSArPSBhbHBoYV9zdHJpZGU7CisgICAgZHN0ICs9IGRzdF9zdHJpZGU7CisgIH0KKworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAiZXh0ICAgICVbdGVtcDBdLCAgICAgICVbYWxwaGFfbWFza10sIDAsIDE2ICAgICAgICAgICAgXG5cdCIKKyAgICAic3JsICAgICVbYWxwaGFfbWFza10sICVbYWxwaGFfbWFza10sIDE2ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYW5kICAgICVbYWxwaGFfbWFza10sICVbYWxwaGFfbWFza10sICVbdGVtcDBdICAgICAgICAgXG5cdCIKKyAgICAiZXh0ICAgICVbdGVtcDBdLCAgICAgICVbYWxwaGFfbWFza10sIDAsIDggICAgICAgICAgICAgXG5cdCIKKyAgICAic3JsICAgICVbYWxwaGFfbWFza10sICVbYWxwaGFfbWFza10sIDggICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYW5kICAgICVbYWxwaGFfbWFza10sICVbYWxwaGFfbWFza10sICVbdGVtcDBdICAgICAgICAgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFthbHBoYV9tYXNrXSIrciIoYWxwaGFfbWFzaykKKyAgICA6CisgICk7CisKKyAgcmV0dXJuIChhbHBoYV9tYXNrICE9IDB4ZmYpOworfQorCitzdGF0aWMgdm9pZCBNdWx0QVJHQlJvd19NSVBTZHNwUjIodWludDMyX3QqIGNvbnN0IHB0ciwgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnZlcnNlKSB7CisgIGludCB4OworICBjb25zdCB1aW50MzJfdCBjXzAwZmZmZmZmID0gMHgwMGZmZmZmZnU7CisgIGNvbnN0IHVpbnQzMl90IGNfZmYwMDAwMDAgPSAweGZmMDAwMDAwdTsKKyAgY29uc3QgdWludDMyX3QgY184MDAwMDAwICA9IDB4MDA4MDAwMDB1OworICBjb25zdCB1aW50MzJfdCBjXzgwMDAwODAgID0gMHgwMDgwMDA4MHU7CisgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7CisgICAgY29uc3QgdWludDMyX3QgYXJnYiA9IHB0clt4XTsKKyAgICBpZiAoYXJnYiA8IDB4ZmYwMDAwMDB1KSB7ICAgICAgLy8gYWxwaGEgPCAyNTUKKyAgICAgIGlmIChhcmdiIDw9IDB4MDBmZmZmZmZ1KSB7ICAgLy8gYWxwaGEgPT0gMAorICAgICAgICBwdHJbeF0gPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCBhbHBoYTsKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICAgInNybCAgICAgICAgICAlW2FscGhhXSwgICAlW2FyZ2JdLCAgICAgICAyNCAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICJyZXBsdi5xYiAgICAgJVt0ZW1wMF0sICAgJVthbHBoYV0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAiYW5kICAgICAgICAgICVbdGVtcDBdLCAgICVbdGVtcDBdLCAgICAgICVbY18wMGZmZmZmZl0gICAgIFxuXHQiCisgICAgICAgICAgImJlcXogICAgICAgICAlW2ludmVyc2VdLCAwZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICJkaXZ1ICAgICAgICAgJHplcm8sICAgICAgJVtjX2ZmMDAwMDAwXSwgJVthbHBoYV0gICAgICAgICAgXG5cdCIKKyAgICAgICAgICAibWZsbyAgICAgICAgICVbdGVtcDBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICJhbmRpICAgICAgICAgJVt0ZW1wMV0sICAgJVthcmdiXSwgICAgICAgMHhmZiAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAiZXh0ICAgICAgICAgICVbdGVtcDJdLCAgICVbYXJnYl0sICAgICAgIDgsICAgICAgICAgICAgIDggIFxuXHQiCisgICAgICAgICAgImV4dCAgICAgICAgICAlW3RlbXAzXSwgICAlW2FyZ2JdLCAgICAgICAxNiwgICAgICAgICAgICA4ICBcblx0IgorICAgICAgICAgICJtdWwgICAgICAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICAgICAgJVt0ZW1wMF0gICAgICAgICAgXG5cdCIKKyAgICAgICAgICAibXVsICAgICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgICAgICVbdGVtcDBdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgIm11bCAgICAgICAgICAlW3RlbXAzXSwgICAlW3RlbXAzXSwgICAgICAlW3RlbXAwXSAgICAgICAgICBcblx0IgorICAgICAgICAgICJwcmVjcnEucGgudyAgJVt0ZW1wMV0sICAgJVt0ZW1wMl0sICAgICAgJVt0ZW1wMV0gICAgICAgICAgXG5cdCIKKyAgICAgICAgICAiYWRkdSAgICAgICAgICVbdGVtcDNdLCAgICVbdGVtcDNdLCAgICAgICVbY184MDAwMDAwXSAgICAgIFxuXHQiCisgICAgICAgICAgImFkZHUgICAgICAgICAlW3RlbXAxXSwgICAlW3RlbXAxXSwgICAgICAlW2NfODAwMDA4MF0gICAgICBcblx0IgorICAgICAgICAgICJwcmVjcnEucGgudyAgJVt0ZW1wM10sICAgJVthcmdiXSwgICAgICAgJVt0ZW1wM10gICAgICAgICAgXG5cdCIKKyAgICAgICAgICAicHJlY3JxLnFiLnBoICVbdGVtcDFdLCAgICVbdGVtcDNdLCAgICAgICVbdGVtcDFdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW2FscGhhXSI9JnIiKGFscGhhKQorICAgICAgICAgIDogW2ludmVyc2VdInIiKGludmVyc2UpLCBbY18wMGZmZmZmZl0iciIoY18wMGZmZmZmZiksCisgICAgICAgICAgICBbY184MDAwMDAwXSJyIihjXzgwMDAwMDApLCBbY184MDAwMDgwXSJyIihjXzgwMDAwODApLAorICAgICAgICAgICAgW2NfZmYwMDAwMDBdInIiKGNfZmYwMDAwMDApLCBbYXJnYl0iciIoYXJnYikKKyAgICAgICAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iCisgICAgICAgICk7CisgICAgICAgIHB0clt4XSA9IHRlbXAxOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisjaWZkZWYgV09SRFNfQklHRU5ESUFOCitzdGF0aWMgdm9pZCBQYWNrQVJHQl9NSVBTZHNwUjIoY29uc3QgdWludDhfdCogYSwgY29uc3QgdWludDhfdCogciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBnLCBjb25zdCB1aW50OF90KiBiLCBpbnQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBvdXQpIHsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCBvZmZzZXQ7CisgIGNvbnN0IGludCByZXN0ID0gbGVuICYgMTsKKyAgY29uc3QgdWludDMyX3QqIGNvbnN0IGxvb3BfZW5kID0gb3V0ICsgbGVuIC0gcmVzdDsKKyAgY29uc3QgaW50IHN0ZXAgPSA0OworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAieG9yICAgICAgICAgICVbb2Zmc2V0XSwgICAlW29mZnNldF0sICVbb2Zmc2V0XSAgICBcblx0IgorICAgICJiZXEgICAgICAgICAgJVtsb29wX2VuZF0sICVbb3V0XSwgICAgMGYgICAgICAgICAgIFxuXHQiCisgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICAgICVbdGVtcDBdLCAgICAlW29mZnNldF0oJVthXSkgICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgICAgJVt0ZW1wMV0sICAgICVbb2Zmc2V0XSglW3JdKSAgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAgICAlW3RlbXAyXSwgICAgJVtvZmZzZXRdKCVbZ10pICAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICAgICVbdGVtcDNdLCAgICAlW29mZnNldF0oJVtiXSkgICAgICAgICBcblx0IgorICAgICJpbnMgICAgICAgICAgJVt0ZW1wMV0sICAgICVbdGVtcDBdLCAgMTYsICAgICAxNiAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wMl0sICAxNiwgICAgIDE2ICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICAgICVbb3V0XSwgICAgICAlW291dF0sICAgIDQgICAgICAgICAgICBcblx0IgorICAgICJwcmVjci5xYi5waCAgJVt0ZW1wMF0sICAgICVbdGVtcDFdLCAgJVt0ZW1wM10gICAgIFxuXHQiCisgICAgInN3ICAgICAgICAgICAlW3RlbXAwXSwgICAgLTQoJVtvdXRdKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgICVbb2Zmc2V0XSwgICAlW29mZnNldF0sICVbc3RlcF0gICAgICBcblx0IgorICAgICJibmUgICAgICAgICAgJVtsb29wX2VuZF0sICVbb3V0XSwgICAgMmIgICAgICAgICAgIFxuXHQiCisgICIwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxICAgICAgICAgICVbcmVzdF0sICAgICAkemVybywgICAgIDFmICAgICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgICAgJVt0ZW1wMF0sICAgICVbb2Zmc2V0XSglW2FdKSAgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAgICAlW3RlbXAxXSwgICAgJVtvZmZzZXRdKCVbcl0pICAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICAgICVbdGVtcDJdLCAgICAlW29mZnNldF0oJVtnXSkgICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgICAgJVt0ZW1wM10sICAgICVbb2Zmc2V0XSglW2JdKSAgICAgICAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAlW3RlbXAxXSwgICAgJVt0ZW1wMF0sICAxNiwgICAgIDE2ICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICVbdGVtcDNdLCAgICAlW3RlbXAyXSwgIDE2LCAgICAgMTYgICBcblx0IgorICAgICJwcmVjci5xYi5waCAgJVt0ZW1wMF0sICAgICVbdGVtcDFdLCAgJVt0ZW1wM10gICAgIFxuXHQiCisgICAgInN3ICAgICAgICAgICAlW3RlbXAwXSwgICAgMCglW291dF0pICAgICAgICAgICAgICAgXG5cdCIKKyAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFtvZmZzZXRdIj0mciIob2Zmc2V0KSwgW291dF0iKyZyIihvdXQpCisgICAgOiBbYV0iciIoYSksIFtyXSJyIihyKSwgW2ddInIiKGcpLCBbYl0iciIoYiksIFtzdGVwXSJyIihzdGVwKSwKKyAgICAgIFtsb29wX2VuZF0iciIobG9vcF9lbmQpLCBbcmVzdF0iciIocmVzdCkKKyAgICA6ICJtZW1vcnkiCisgICk7Cit9CisjZW5kaWYgIC8vIFdPUkRTX0JJR0VORElBTgorCitzdGF0aWMgdm9pZCBQYWNrUkdCX01JUFNkc3BSMihjb25zdCB1aW50OF90KiByLCBjb25zdCB1aW50OF90KiBnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogYiwgaW50IGxlbiwgaW50IHN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogb3V0KSB7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCBvZmZzZXQ7CisgIGNvbnN0IGludCByZXN0ID0gbGVuICYgMTsKKyAgY29uc3QgaW50IGEgPSAweGZmOworICBjb25zdCB1aW50MzJfdCogY29uc3QgbG9vcF9lbmQgPSBvdXQgKyBsZW4gLSByZXN0OworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAieG9yICAgICAgICAgICVbb2Zmc2V0XSwgICAlW29mZnNldF0sICVbb2Zmc2V0XSAgICBcblx0IgorICAgICJiZXEgICAgICAgICAgJVtsb29wX2VuZF0sICVbb3V0XSwgICAgMGYgICAgICAgICAgIFxuXHQiCisgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICAgICVbdGVtcDBdLCAgICAlW29mZnNldF0oJVtyXSkgICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgICAgJVt0ZW1wMV0sICAgICVbb2Zmc2V0XSglW2ddKSAgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAgICAlW3RlbXAyXSwgICAgJVtvZmZzZXRdKCVbYl0pICAgICAgICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICVbdGVtcDBdLCAgICAlW2FdLCAgICAgIDE2LCAgICAgMTYgICBcblx0IgorICAgICJpbnMgICAgICAgICAgJVt0ZW1wMl0sICAgICVbdGVtcDFdLCAgMTYsICAgICAxNiAgIFxuXHQiCisgICAgImFkZGl1ICAgICAgICAlW291dF0sICAgICAgJVtvdXRdLCAgICA0ICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY3IucWIucGggICVbdGVtcDBdLCAgICAlW3RlbXAwXSwgICVbdGVtcDJdICAgICBcblx0IgorICAgICJzdyAgICAgICAgICAgJVt0ZW1wMF0sICAgIC00KCVbb3V0XSkgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAgICAlW29mZnNldF0sICAgJVtvZmZzZXRdLCAlW3N0ZXBdICAgICAgXG5cdCIKKyAgICAiYm5lICAgICAgICAgICVbbG9vcF9lbmRdLCAlW291dF0sICAgIDJiICAgICAgICAgICBcblx0IgorICAiMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcSAgICAgICAgICAlW3Jlc3RdLCAgICAgJHplcm8sICAgICAxZiAgICAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICAgICVbdGVtcDBdLCAgICAlW29mZnNldF0oJVtyXSkgICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgICAgJVt0ZW1wMV0sICAgICVbb2Zmc2V0XSglW2ddKSAgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAgICAlW3RlbXAyXSwgICAgJVtvZmZzZXRdKCVbYl0pICAgICAgICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICVbdGVtcDBdLCAgICAlW2FdLCAgICAgIDE2LCAgICAgMTYgICBcblx0IgorICAgICJpbnMgICAgICAgICAgJVt0ZW1wMl0sICAgICVbdGVtcDFdLCAgMTYsICAgICAxNiAgIFxuXHQiCisgICAgInByZWNyLnFiLnBoICAlW3RlbXAwXSwgICAgJVt0ZW1wMF0sICAlW3RlbXAyXSAgICAgXG5cdCIKKyAgICAic3cgICAgICAgICAgICVbdGVtcDBdLCAgICAwKCVbb3V0XSkgICAgICAgICAgICAgICBcblx0IgorICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW29mZnNldF0iPSZyIihvZmZzZXQpLCBbb3V0XSIrJnIiKG91dCkKKyAgICA6IFthXSJyIihhKSwgW3JdInIiKHIpLCBbZ10iciIoZyksIFtiXSJyIihiKSwgW3N0ZXBdInIiKHN0ZXApLAorICAgICAgW2xvb3BfZW5kXSJyIihsb29wX2VuZCksIFtyZXN0XSJyIihyZXN0KQorICAgIDogIm1lbW9yeSIKKyAgKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFdlYlBJbml0QWxwaGFQcm9jZXNzaW5nTUlQU2RzcFIyKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgV2ViUEluaXRBbHBoYVByb2Nlc3NpbmdNSVBTZHNwUjIodm9pZCkgeworICBXZWJQRGlzcGF0Y2hBbHBoYSA9IERpc3BhdGNoQWxwaGFfTUlQU2RzcFIyOworICBXZWJQTXVsdEFSR0JSb3cgPSBNdWx0QVJHQlJvd19NSVBTZHNwUjI7CisjaWZkZWYgV09SRFNfQklHRU5ESUFOCisgIFdlYlBQYWNrQVJHQiA9IFBhY2tBUkdCX01JUFNkc3BSMjsKKyNlbmRpZgorICBXZWJQUGFja1JHQiA9IFBhY2tSR0JfTUlQU2RzcFIyOworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX01JUFNfRFNQX1IyCisKK1dFQlBfRFNQX0lOSVRfU1RVQihXZWJQSW5pdEFscGhhUHJvY2Vzc2luZ01JUFNkc3BSMikKKworI2VuZGlmICAvLyBXRUJQX1VTRV9NSVBTX0RTUF9SMgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9hbHBoYV9wcm9jZXNzaW5nX25lb24uYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvYWxwaGFfcHJvY2Vzc2luZ19uZW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ1NTQyMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvYWxwaGFfcHJvY2Vzc2luZ19uZW9uLmMKQEAgLTAsMCArMSwxOTEgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBVdGlsaXRpZXMgZm9yIHByb2Nlc3NpbmcgdHJhbnNwYXJlbnQgY2hhbm5lbCwgTkVPTiB2ZXJzaW9uLgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9ORU9OKQorCisjaW5jbHVkZSAic3JjL2RzcC9uZW9uLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgTVVMVElQTElFUihhKSAoKGEpICogMHg4MDgxKQorI2RlZmluZSBQUkVNVUxUSVBMWSh4LCBtKSAoKCh4KSAqIChtKSkgPj4gMjMpCisKKyNkZWZpbmUgTVVMVElQTFlfQllfQUxQSEEoViwgQUxQSEEsIE9USEVSKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50OHg4X3QgYWxwaGEgPSAoVikudmFsWyhBTFBIQSldOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQxNng4X3QgcjEgPSB2bXVsbF91OCgoVikudmFsWzFdLCBhbHBoYSk7ICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDE2eDhfdCBnMSA9IHZtdWxsX3U4KChWKS52YWxbMl0sIGFscGhhKTsgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50MTZ4OF90IGIxID0gdm11bGxfdTgoKFYpLnZhbFsoT1RIRVIpXSwgYWxwaGEpOyAgICAgICAgICAgICBcCisgIC8qIHdlIHVzZTogdiAvIDI1NSA9ICh2ICsgMSArICh2ID4+IDgpKSA+PiA4ICovICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDE2eDhfdCByMiA9IHZzcmFxX25fdTE2KHIxLCByMSwgOCk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50MTZ4OF90IGcyID0gdnNyYXFfbl91MTYoZzEsIGcxLCA4KTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQxNng4X3QgYjIgPSB2c3JhcV9uX3UxNihiMSwgYjEsIDgpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDE2eDhfdCByMyA9IHZhZGRxX3UxNihyMiwga09uZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50MTZ4OF90IGczID0gdmFkZHFfdTE2KGcyLCBrT25lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQxNng4X3QgYjMgPSB2YWRkcV91MTYoYjIsIGtPbmUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFYpLnZhbFsxXSA9IHZzaHJuX25fdTE2KHIzLCA4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoVikudmFsWzJdID0gdnNocm5fbl91MTYoZzMsIDgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChWKS52YWxbKE9USEVSKV0gPSB2c2hybl9uX3UxNihiMywgOCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIEFwcGx5QWxwaGFNdWx0aXBseV9ORU9OKHVpbnQ4X3QqIHJnYmEsIGludCBhbHBoYV9maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgaW50IHN0cmlkZSkgeworICBjb25zdCB1aW50MTZ4OF90IGtPbmUgPSB2ZHVwcV9uX3UxNigxdSk7CisgIHdoaWxlIChoLS0gPiAwKSB7CisgICAgdWludDMyX3QqIGNvbnN0IHJnYnggPSAodWludDMyX3QqKXJnYmE7CisgICAgaW50IGkgPSAwOworICAgIGlmIChhbHBoYV9maXJzdCkgeworICAgICAgZm9yICg7IGkgKyA4IDw9IHc7IGkgKz0gOCkgeworICAgICAgICAvLyBsb2FkIGFhYWEuLi58cnJyci4uLnxnZ2dnLi4ufGJiYmIuLi4KKyAgICAgICAgdWludDh4OHg0X3QgUkdCWCA9IHZsZDRfdTgoKGNvbnN0IHVpbnQ4X3QqKShyZ2J4ICsgaSkpOworICAgICAgICBNVUxUSVBMWV9CWV9BTFBIQShSR0JYLCAwLCAzKTsKKyAgICAgICAgdnN0NF91OCgodWludDhfdCopKHJnYnggKyBpKSwgUkdCWCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoOyBpICsgOCA8PSB3OyBpICs9IDgpIHsKKyAgICAgICAgdWludDh4OHg0X3QgUkdCWCA9IHZsZDRfdTgoKGNvbnN0IHVpbnQ4X3QqKShyZ2J4ICsgaSkpOworICAgICAgICBNVUxUSVBMWV9CWV9BTFBIQShSR0JYLCAzLCAwKTsKKyAgICAgICAgdnN0NF91OCgodWludDhfdCopKHJnYnggKyBpKSwgUkdCWCk7CisgICAgICB9CisgICAgfQorICAgIC8vIEZpbmlzaCB3aXRoIGxlZnQtb3ZlcnMuCisgICAgZm9yICg7IGkgPCB3OyArK2kpIHsKKyAgICAgIHVpbnQ4X3QqIGNvbnN0IHJnYiA9IHJnYmEgKyAoYWxwaGFfZmlyc3QgPyAxIDogMCk7CisgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBhbHBoYSA9IHJnYmEgKyAoYWxwaGFfZmlyc3QgPyAwIDogMyk7CisgICAgICBjb25zdCB1aW50MzJfdCBhID0gYWxwaGFbNCAqIGldOworICAgICAgaWYgKGEgIT0gMHhmZikgeworICAgICAgICBjb25zdCB1aW50MzJfdCBtdWx0ID0gTVVMVElQTElFUihhKTsKKyAgICAgICAgcmdiWzQgKiBpICsgMF0gPSBQUkVNVUxUSVBMWShyZ2JbNCAqIGkgKyAwXSwgbXVsdCk7CisgICAgICAgIHJnYls0ICogaSArIDFdID0gUFJFTVVMVElQTFkocmdiWzQgKiBpICsgMV0sIG11bHQpOworICAgICAgICByZ2JbNCAqIGkgKyAyXSA9IFBSRU1VTFRJUExZKHJnYls0ICogaSArIDJdLCBtdWx0KTsKKyAgICAgIH0KKyAgICB9CisgICAgcmdiYSArPSBzdHJpZGU7CisgIH0KK30KKyN1bmRlZiBNVUxUSVBMWV9CWV9BTFBIQQorI3VuZGVmIE1VTFRJUExJRVIKKyN1bmRlZiBQUkVNVUxUSVBMWQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50IERpc3BhdGNoQWxwaGFfTkVPTihjb25zdCB1aW50OF90KiBhbHBoYSwgaW50IGFscGhhX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGRzdF9zdHJpZGUpIHsKKyAgdWludDMyX3QgYWxwaGFfbWFzayA9IDB4ZmZmZmZmZmZ1OworICB1aW50OHg4X3QgbWFzazggPSB2ZHVwX25fdTgoMHhmZik7CisgIHVpbnQzMl90IHRtcFsyXTsKKyAgaW50IGksIGo7CisgIGZvciAoaiA9IDA7IGogPCBoZWlnaHQ7ICsraikgeworICAgIC8vIFdlIGRvbid0IGtub3cgaWYgYWxwaGEgaXMgZmlyc3Qgb3IgbGFzdCBpbiBkc3RbXSAoZGVwZW5kaW5nIG9uIHJnYkEvQXJnYgorICAgIC8vIG1vZGUpLiBTbyB3ZSBtdXN0IGJlIHN1cmUgZHN0WzQqaSArIDggLSAxXSBpcyB3cml0YWJsZSBmb3IgdGhlIHN0b3JlLgorICAgIC8vIEhlbmNlIHRoZSB0ZXN0IHdpdGggJ3dpZHRoIC0gMScgaW5zdGVhZCBvZiBqdXN0ICd3aWR0aCcuCisgICAgZm9yIChpID0gMDsgaSArIDggPD0gd2lkdGggLSAxOyBpICs9IDgpIHsKKyAgICAgIHVpbnQ4eDh4NF90IHJnYlggPSB2bGQ0X3U4KChjb25zdCB1aW50OF90KikoZHN0ICsgNCAqIGkpKTsKKyAgICAgIGNvbnN0IHVpbnQ4eDhfdCBhbHBoYXMgPSB2bGQxX3U4KGFscGhhICsgaSk7CisgICAgICByZ2JYLnZhbFswXSA9IGFscGhhczsKKyAgICAgIHZzdDRfdTgoKHVpbnQ4X3QqKShkc3QgKyA0ICogaSksIHJnYlgpOworICAgICAgbWFzazggPSB2YW5kX3U4KG1hc2s4LCBhbHBoYXMpOworICAgIH0KKyAgICBmb3IgKDsgaSA8IHdpZHRoOyArK2kpIHsKKyAgICAgIGNvbnN0IHVpbnQzMl90IGFscGhhX3ZhbHVlID0gYWxwaGFbaV07CisgICAgICBkc3RbNCAqIGldID0gYWxwaGFfdmFsdWU7CisgICAgICBhbHBoYV9tYXNrICY9IGFscGhhX3ZhbHVlOworICAgIH0KKyAgICBhbHBoYSArPSBhbHBoYV9zdHJpZGU7CisgICAgZHN0ICs9IGRzdF9zdHJpZGU7CisgIH0KKyAgdnN0MV91OCgodWludDhfdCopdG1wLCBtYXNrOCk7CisgIGFscGhhX21hc2sgJj0gdG1wWzBdOworICBhbHBoYV9tYXNrICY9IHRtcFsxXTsKKyAgcmV0dXJuIChhbHBoYV9tYXNrICE9IDB4ZmZmZmZmZmZ1KTsKK30KKworc3RhdGljIHZvaWQgRGlzcGF0Y2hBbHBoYVRvR3JlZW5fTkVPTihjb25zdCB1aW50OF90KiBhbHBoYSwgaW50IGFscGhhX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZHN0LCBpbnQgZHN0X3N0cmlkZSkgeworICBpbnQgaSwgajsKKyAgdWludDh4OHg0X3QgZ3JlZW5zOyAgIC8vIGxlYXZlIEEvUi9CIGNoYW5uZWxzIHplcm8nZC4KKyAgZ3JlZW5zLnZhbFswXSA9IHZkdXBfbl91OCgwKTsKKyAgZ3JlZW5zLnZhbFsyXSA9IHZkdXBfbl91OCgwKTsKKyAgZ3JlZW5zLnZhbFszXSA9IHZkdXBfbl91OCgwKTsKKyAgZm9yIChqID0gMDsgaiA8IGhlaWdodDsgKytqKSB7CisgICAgZm9yIChpID0gMDsgaSArIDggPD0gd2lkdGg7IGkgKz0gOCkgeworICAgICAgZ3JlZW5zLnZhbFsxXSA9IHZsZDFfdTgoYWxwaGEgKyBpKTsKKyAgICAgIHZzdDRfdTgoKHVpbnQ4X3QqKShkc3QgKyBpKSwgZ3JlZW5zKTsKKyAgICB9CisgICAgZm9yICg7IGkgPCB3aWR0aDsgKytpKSBkc3RbaV0gPSBhbHBoYVtpXSA8PCA4OworICAgIGFscGhhICs9IGFscGhhX3N0cmlkZTsKKyAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKyAgfQorfQorCitzdGF0aWMgaW50IEV4dHJhY3RBbHBoYV9ORU9OKGNvbnN0IHVpbnQ4X3QqIGFyZ2IsIGludCBhcmdiX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBhbHBoYSwgaW50IGFscGhhX3N0cmlkZSkgeworICB1aW50MzJfdCBhbHBoYV9tYXNrID0gMHhmZmZmZmZmZnU7CisgIHVpbnQ4eDhfdCBtYXNrOCA9IHZkdXBfbl91OCgweGZmKTsKKyAgdWludDMyX3QgdG1wWzJdOworICBpbnQgaSwgajsKKyAgZm9yIChqID0gMDsgaiA8IGhlaWdodDsgKytqKSB7CisgICAgLy8gV2UgZG9uJ3Qga25vdyBpZiBhbHBoYSBpcyBmaXJzdCBvciBsYXN0IGluIGRzdFtdIChkZXBlbmRpbmcgb24gcmdiQS9BcmdiCisgICAgLy8gbW9kZSkuIFNvIHdlIG11c3QgYmUgc3VyZSBkc3RbNCppICsgOCAtIDFdIGlzIHdyaXRhYmxlIGZvciB0aGUgc3RvcmUuCisgICAgLy8gSGVuY2UgdGhlIHRlc3Qgd2l0aCAnd2lkdGggLSAxJyBpbnN0ZWFkIG9mIGp1c3QgJ3dpZHRoJy4KKyAgICBmb3IgKGkgPSAwOyBpICsgOCA8PSB3aWR0aCAtIDE7IGkgKz0gOCkgeworICAgICAgY29uc3QgdWludDh4OHg0X3QgcmdiWCA9IHZsZDRfdTgoKGNvbnN0IHVpbnQ4X3QqKShhcmdiICsgNCAqIGkpKTsKKyAgICAgIGNvbnN0IHVpbnQ4eDhfdCBhbHBoYXMgPSByZ2JYLnZhbFswXTsKKyAgICAgIHZzdDFfdTgoKHVpbnQ4X3QqKShhbHBoYSArIGkpLCBhbHBoYXMpOworICAgICAgbWFzazggPSB2YW5kX3U4KG1hc2s4LCBhbHBoYXMpOworICAgIH0KKyAgICBmb3IgKDsgaSA8IHdpZHRoOyArK2kpIHsKKyAgICAgIGFscGhhW2ldID0gYXJnYls0ICogaV07CisgICAgICBhbHBoYV9tYXNrICY9IGFscGhhW2ldOworICAgIH0KKyAgICBhcmdiICs9IGFyZ2Jfc3RyaWRlOworICAgIGFscGhhICs9IGFscGhhX3N0cmlkZTsKKyAgfQorICB2c3QxX3U4KCh1aW50OF90Kil0bXAsIG1hc2s4KTsKKyAgYWxwaGFfbWFzayAmPSB0bXBbMF07CisgIGFscGhhX21hc2sgJj0gdG1wWzFdOworICByZXR1cm4gKGFscGhhX21hc2sgPT0gMHhmZmZmZmZmZnUpOworfQorCitzdGF0aWMgdm9pZCBFeHRyYWN0R3JlZW5fTkVPTihjb25zdCB1aW50MzJfdCogYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGFscGhhLCBpbnQgc2l6ZSkgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSArIDE2IDw9IHNpemU7IGkgKz0gMTYpIHsKKyAgICBjb25zdCB1aW50OHgxNng0X3QgcmdiWCA9IHZsZDRxX3U4KChjb25zdCB1aW50OF90KikoYXJnYiArIGkpKTsKKyAgICBjb25zdCB1aW50OHgxNl90IGdyZWVucyA9IHJnYlgudmFsWzFdOworICAgIHZzdDFxX3U4KGFscGhhICsgaSwgZ3JlZW5zKTsKKyAgfQorICBmb3IgKDsgaSA8IHNpemU7ICsraSkgYWxwaGFbaV0gPSAoYXJnYltpXSA+PiA4KSAmIDB4ZmY7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2V4dGVybiB2b2lkIFdlYlBJbml0QWxwaGFQcm9jZXNzaW5nTkVPTih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFdlYlBJbml0QWxwaGFQcm9jZXNzaW5nTkVPTih2b2lkKSB7CisgIFdlYlBBcHBseUFscGhhTXVsdGlwbHkgPSBBcHBseUFscGhhTXVsdGlwbHlfTkVPTjsKKyAgV2ViUERpc3BhdGNoQWxwaGEgPSBEaXNwYXRjaEFscGhhX05FT047CisgIFdlYlBEaXNwYXRjaEFscGhhVG9HcmVlbiA9IERpc3BhdGNoQWxwaGFUb0dyZWVuX05FT047CisgIFdlYlBFeHRyYWN0QWxwaGEgPSBFeHRyYWN0QWxwaGFfTkVPTjsKKyAgV2ViUEV4dHJhY3RHcmVlbiA9IEV4dHJhY3RHcmVlbl9ORU9OOworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX05FT04KKworV0VCUF9EU1BfSU5JVF9TVFVCKFdlYlBJbml0QWxwaGFQcm9jZXNzaW5nTkVPTikKKworI2VuZGlmICAvLyBXRUJQX1VTRV9ORU9OCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2FscGhhX3Byb2Nlc3Npbmdfc3NlMi5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9hbHBoYV9wcm9jZXNzaW5nX3NzZTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjU4NzAwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9hbHBoYV9wcm9jZXNzaW5nX3NzZTIuYwpAQCAtMCwwICsxLDM0MyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFV0aWxpdGllcyBmb3IgcHJvY2Vzc2luZyB0cmFuc3BhcmVudCBjaGFubmVsLgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0UyKQorI2luY2x1ZGUgPGVtbWludHJpbi5oPgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50IERpc3BhdGNoQWxwaGFfU1NFMihjb25zdCB1aW50OF90KiBhbHBoYSwgaW50IGFscGhhX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGRzdF9zdHJpZGUpIHsKKyAgLy8gYWxwaGFfYW5kIHN0b3JlcyBhbiAnYW5kJyBvcGVyYXRpb24gb2YgYWxsIHRoZSBhbHBoYVtdIHZhbHVlcy4gVGhlIGZpbmFsCisgIC8vIHZhbHVlIGlzIG5vdCAweGZmIGlmIGFueSBvZiB0aGUgYWxwaGFbXSBpcyBub3QgZXF1YWwgdG8gMHhmZi4KKyAgdWludDMyX3QgYWxwaGFfYW5kID0gMHhmZjsKKyAgaW50IGksIGo7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGNvbnN0IF9fbTEyOGkgcmdiX21hc2sgPSBfbW1fc2V0MV9lcGkzMigweGZmZmZmZjAwdSk7ICAvLyB0byBwcmVzZXJ2ZSBSR0IKKyAgY29uc3QgX19tMTI4aSBhbGxfMHhmZiA9IF9tbV9zZXRfZXBpMzIoMCwgMCwgfjB1LCB+MHUpOworICBfX20xMjhpIGFsbF9hbHBoYXMgPSBhbGxfMHhmZjsKKworICAvLyBXZSBtdXN0IGJlIGFibGUgdG8gYWNjZXNzIDMgZXh0cmEgYnl0ZXMgYWZ0ZXIgdGhlIGxhc3Qgd3JpdHRlbiBieXRlCisgIC8vICdkc3RbNCAqIHdpZHRoIC0gNF0nLCBiZWNhdXNlIHdlIGRvbid0IGtub3cgaWYgYWxwaGEgaXMgdGhlIGZpcnN0IG9yIHRoZQorICAvLyBsYXN0IGJ5dGUgb2YgdGhlIHF1YWRydXBsZXQuCisgIGNvbnN0IGludCBsaW1pdCA9ICh3aWR0aCAtIDEpICYgfjc7CisKKyAgZm9yIChqID0gMDsgaiA8IGhlaWdodDsgKytqKSB7CisgICAgX19tMTI4aSogb3V0ID0gKF9fbTEyOGkqKWRzdDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGltaXQ7IGkgKz0gOCkgeworICAgICAgLy8gbG9hZCA4IGFscGhhIGJ5dGVzCisgICAgICBjb25zdCBfX20xMjhpIGEwID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmYWxwaGFbaV0pOworICAgICAgY29uc3QgX19tMTI4aSBhMSA9IF9tbV91bnBhY2tsb19lcGk4KGEwLCB6ZXJvKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYTJfbG8gPSBfbW1fdW5wYWNrbG9fZXBpMTYoYTEsIHplcm8pOworICAgICAgY29uc3QgX19tMTI4aSBhMl9oaSA9IF9tbV91bnBhY2toaV9lcGkxNihhMSwgemVybyk7CisgICAgICAvLyBsb2FkIDggZHN0IHBpeGVscyAoMzIgYnl0ZXMpCisgICAgICBjb25zdCBfX20xMjhpIGIwX2xvID0gX21tX2xvYWR1X3NpMTI4KG91dCArIDApOworICAgICAgY29uc3QgX19tMTI4aSBiMF9oaSA9IF9tbV9sb2FkdV9zaTEyOChvdXQgKyAxKTsKKyAgICAgIC8vIG1hc2sgZHN0IGFscGhhIHZhbHVlcworICAgICAgY29uc3QgX19tMTI4aSBiMV9sbyA9IF9tbV9hbmRfc2kxMjgoYjBfbG8sIHJnYl9tYXNrKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYjFfaGkgPSBfbW1fYW5kX3NpMTI4KGIwX2hpLCByZ2JfbWFzayk7CisgICAgICAvLyBjb21iaW5lCisgICAgICBjb25zdCBfX20xMjhpIGIyX2xvID0gX21tX29yX3NpMTI4KGIxX2xvLCBhMl9sbyk7CisgICAgICBjb25zdCBfX20xMjhpIGIyX2hpID0gX21tX29yX3NpMTI4KGIxX2hpLCBhMl9oaSk7CisgICAgICAvLyBzdG9yZQorICAgICAgX21tX3N0b3JldV9zaTEyOChvdXQgKyAwLCBiMl9sbyk7CisgICAgICBfbW1fc3RvcmV1X3NpMTI4KG91dCArIDEsIGIyX2hpKTsKKyAgICAgIC8vIGFjY3VtdWxhdGUgZWlnaHQgYWxwaGEgJ2FuZCcgaW4gcGFyYWxsZWwKKyAgICAgIGFsbF9hbHBoYXMgPSBfbW1fYW5kX3NpMTI4KGFsbF9hbHBoYXMsIGEwKTsKKyAgICAgIG91dCArPSAyOworICAgIH0KKyAgICBmb3IgKDsgaSA8IHdpZHRoOyArK2kpIHsKKyAgICAgIGNvbnN0IHVpbnQzMl90IGFscGhhX3ZhbHVlID0gYWxwaGFbaV07CisgICAgICBkc3RbNCAqIGldID0gYWxwaGFfdmFsdWU7CisgICAgICBhbHBoYV9hbmQgJj0gYWxwaGFfdmFsdWU7CisgICAgfQorICAgIGFscGhhICs9IGFscGhhX3N0cmlkZTsKKyAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKyAgfQorICAvLyBDb21iaW5lIHRoZSBlaWdodCBhbHBoYSAnYW5kJyBpbnRvIGEgOC1iaXQgbWFzay4KKyAgYWxwaGFfYW5kICY9IF9tbV9tb3ZlbWFza19lcGk4KF9tbV9jbXBlcV9lcGk4KGFsbF9hbHBoYXMsIGFsbF8weGZmKSk7CisgIHJldHVybiAoYWxwaGFfYW5kICE9IDB4ZmYpOworfQorCitzdGF0aWMgdm9pZCBEaXNwYXRjaEFscGhhVG9HcmVlbl9TU0UyKGNvbnN0IHVpbnQ4X3QqIGFscGhhLCBpbnQgYWxwaGFfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkc3QsIGludCBkc3Rfc3RyaWRlKSB7CisgIGludCBpLCBqOworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBjb25zdCBpbnQgbGltaXQgPSB3aWR0aCAmIH4xNTsKKyAgZm9yIChqID0gMDsgaiA8IGhlaWdodDsgKytqKSB7CisgICAgZm9yIChpID0gMDsgaSA8IGxpbWl0OyBpICs9IDE2KSB7ICAgLy8gcHJvY2VzcyAxNiBhbHBoYSBieXRlcworICAgICAgY29uc3QgX19tMTI4aSBhMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmFscGhhW2ldKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYTEgPSBfbW1fdW5wYWNrbG9fZXBpOCh6ZXJvLCBhMCk7ICAvLyBub3RlIHRoZSAnemVybycgZmlyc3QhCisgICAgICBjb25zdCBfX20xMjhpIGIxID0gX21tX3VucGFja2hpX2VwaTgoemVybywgYTApOworICAgICAgY29uc3QgX19tMTI4aSBhMl9sbyA9IF9tbV91bnBhY2tsb19lcGkxNihhMSwgemVybyk7CisgICAgICBjb25zdCBfX20xMjhpIGIyX2xvID0gX21tX3VucGFja2xvX2VwaTE2KGIxLCB6ZXJvKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYTJfaGkgPSBfbW1fdW5wYWNraGlfZXBpMTYoYTEsIHplcm8pOworICAgICAgY29uc3QgX19tMTI4aSBiMl9oaSA9IF9tbV91bnBhY2toaV9lcGkxNihiMSwgemVybyk7CisgICAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmZHN0W2kgKyAgMF0sIGEyX2xvKTsKKyAgICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZkc3RbaSArICA0XSwgYTJfaGkpOworICAgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJmRzdFtpICsgIDhdLCBiMl9sbyk7CisgICAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmZHN0W2kgKyAxMl0sIGIyX2hpKTsKKyAgICB9CisgICAgZm9yICg7IGkgPCB3aWR0aDsgKytpKSBkc3RbaV0gPSBhbHBoYVtpXSA8PCA4OworICAgIGFscGhhICs9IGFscGhhX3N0cmlkZTsKKyAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKyAgfQorfQorCitzdGF0aWMgaW50IEV4dHJhY3RBbHBoYV9TU0UyKGNvbnN0IHVpbnQ4X3QqIGFyZ2IsIGludCBhcmdiX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBhbHBoYSwgaW50IGFscGhhX3N0cmlkZSkgeworICAvLyBhbHBoYV9hbmQgc3RvcmVzIGFuICdhbmQnIG9wZXJhdGlvbiBvZiBhbGwgdGhlIGFscGhhW10gdmFsdWVzLiBUaGUgZmluYWwKKyAgLy8gdmFsdWUgaXMgbm90IDB4ZmYgaWYgYW55IG9mIHRoZSBhbHBoYVtdIGlzIG5vdCBlcXVhbCB0byAweGZmLgorICB1aW50MzJfdCBhbHBoYV9hbmQgPSAweGZmOworICBpbnQgaSwgajsKKyAgY29uc3QgX19tMTI4aSBhX21hc2sgPSBfbW1fc2V0MV9lcGkzMigweGZmdSk7ICAvLyB0byBwcmVzZXJ2ZSBhbHBoYQorICBjb25zdCBfX20xMjhpIGFsbF8weGZmID0gX21tX3NldF9lcGkzMigwLCAwLCB+MHUsIH4wdSk7CisgIF9fbTEyOGkgYWxsX2FscGhhcyA9IGFsbF8weGZmOworCisgIC8vIFdlIG11c3QgYmUgYWJsZSB0byBhY2Nlc3MgMyBleHRyYSBieXRlcyBhZnRlciB0aGUgbGFzdCB3cml0dGVuIGJ5dGUKKyAgLy8gJ3NyY1s0ICogd2lkdGggLSA0XScsIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyBpZiBhbHBoYSBpcyB0aGUgZmlyc3Qgb3IgdGhlCisgIC8vIGxhc3QgYnl0ZSBvZiB0aGUgcXVhZHJ1cGxldC4KKyAgY29uc3QgaW50IGxpbWl0ID0gKHdpZHRoIC0gMSkgJiB+NzsKKworICBmb3IgKGogPSAwOyBqIDwgaGVpZ2h0OyArK2opIHsKKyAgICBjb25zdCBfX20xMjhpKiBzcmMgPSAoY29uc3QgX19tMTI4aSopYXJnYjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGltaXQ7IGkgKz0gOCkgeworICAgICAgLy8gbG9hZCAzMiBhcmdiIGJ5dGVzCisgICAgICBjb25zdCBfX20xMjhpIGEwID0gX21tX2xvYWR1X3NpMTI4KHNyYyArIDApOworICAgICAgY29uc3QgX19tMTI4aSBhMSA9IF9tbV9sb2FkdV9zaTEyOChzcmMgKyAxKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYjAgPSBfbW1fYW5kX3NpMTI4KGEwLCBhX21hc2spOworICAgICAgY29uc3QgX19tMTI4aSBiMSA9IF9tbV9hbmRfc2kxMjgoYTEsIGFfbWFzayk7CisgICAgICBjb25zdCBfX20xMjhpIGMwID0gX21tX3BhY2tzX2VwaTMyKGIwLCBiMSk7CisgICAgICBjb25zdCBfX20xMjhpIGQwID0gX21tX3BhY2t1c19lcGkxNihjMCwgYzApOworICAgICAgLy8gc3RvcmUKKyAgICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKSZhbHBoYVtpXSwgZDApOworICAgICAgLy8gYWNjdW11bGF0ZSBlaWdodCBhbHBoYSAnYW5kJyBpbiBwYXJhbGxlbAorICAgICAgYWxsX2FscGhhcyA9IF9tbV9hbmRfc2kxMjgoYWxsX2FscGhhcywgZDApOworICAgICAgc3JjICs9IDI7CisgICAgfQorICAgIGZvciAoOyBpIDwgd2lkdGg7ICsraSkgeworICAgICAgY29uc3QgdWludDMyX3QgYWxwaGFfdmFsdWUgPSBhcmdiWzQgKiBpXTsKKyAgICAgIGFscGhhW2ldID0gYWxwaGFfdmFsdWU7CisgICAgICBhbHBoYV9hbmQgJj0gYWxwaGFfdmFsdWU7CisgICAgfQorICAgIGFyZ2IgKz0gYXJnYl9zdHJpZGU7CisgICAgYWxwaGEgKz0gYWxwaGFfc3RyaWRlOworICB9CisgIC8vIENvbWJpbmUgdGhlIGVpZ2h0IGFscGhhICdhbmQnIGludG8gYSA4LWJpdCBtYXNrLgorICBhbHBoYV9hbmQgJj0gX21tX21vdmVtYXNrX2VwaTgoX21tX2NtcGVxX2VwaTgoYWxsX2FscGhhcywgYWxsXzB4ZmYpKTsKKyAgcmV0dXJuIChhbHBoYV9hbmQgPT0gMHhmZik7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBOb24tZGl0aGVyIHByZW11bHRpcGxpZWQgbW9kZXMKKworI2RlZmluZSBNVUxUSVBMSUVSKGEpICAgKChhKSAqIDB4ODA4MSkKKyNkZWZpbmUgUFJFTVVMVElQTFkoeCwgbSkgKCgoeCkgKiAobSkpID4+IDIzKQorCisvLyBXZSBjYW4ndCB1c2UgYSAnY29uc3QgaW50JyBmb3IgdGhlIFNIVUZGTEUgdmFsdWUsIGJlY2F1c2UgaXQgaGFzIHRvIGJlIGFuCisvLyBpbW1lZGlhdGUgaW4gdGhlIF9tbV9zaHVmZmxleHhfZXBpMTYoKSBpbnN0cnVjdGlvbi4gV2UgcmVhbGx5IG5lZWQgYSBtYWNyby4KKy8vIFdlIHVzZTogdiAvIDI1NSA9ICh2ICogMHg4MDgxKSA+PiAyMywgd2hlcmUgdiA9IGFscGhhICoge3IsZyxifSBpcyBhIDE2Yml0CisvLyB2YWx1ZS4KKyNkZWZpbmUgQVBQTFlfQUxQSEEoUkdCWCwgU0hVRkZMRSkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBhcmdiMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJihSR0JYKSk7ICAgIFwKKyAgY29uc3QgX19tMTI4aSBhcmdiMV9sbyA9IF9tbV91bnBhY2tsb19lcGk4KGFyZ2IwLCB6ZXJvKTsgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBhcmdiMV9oaSA9IF9tbV91bnBhY2toaV9lcGk4KGFyZ2IwLCB6ZXJvKTsgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBhbHBoYTBfbG8gPSBfbW1fb3Jfc2kxMjgoYXJnYjFfbG8sIGtNYXNrKTsgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBhbHBoYTBfaGkgPSBfbW1fb3Jfc2kxMjgoYXJnYjFfaGksIGtNYXNrKTsgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBhbHBoYTFfbG8gPSBfbW1fc2h1ZmZsZWxvX2VwaTE2KGFscGhhMF9sbywgU0hVRkZMRSk7IFwKKyAgY29uc3QgX19tMTI4aSBhbHBoYTFfaGkgPSBfbW1fc2h1ZmZsZWxvX2VwaTE2KGFscGhhMF9oaSwgU0hVRkZMRSk7IFwKKyAgY29uc3QgX19tMTI4aSBhbHBoYTJfbG8gPSBfbW1fc2h1ZmZsZWhpX2VwaTE2KGFscGhhMV9sbywgU0hVRkZMRSk7IFwKKyAgY29uc3QgX19tMTI4aSBhbHBoYTJfaGkgPSBfbW1fc2h1ZmZsZWhpX2VwaTE2KGFscGhhMV9oaSwgU0hVRkZMRSk7IFwKKyAgLyogYWxwaGEyID0gW2ZmIGEwIGEwIGEwXVtmZiBhMSBhMSBhMV0gKi8gICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBBMF9sbyA9IF9tbV9tdWxsb19lcGkxNihhbHBoYTJfbG8sIGFyZ2IxX2xvKTsgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBBMF9oaSA9IF9tbV9tdWxsb19lcGkxNihhbHBoYTJfaGksIGFyZ2IxX2hpKTsgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBBMV9sbyA9IF9tbV9tdWxoaV9lcHUxNihBMF9sbywga011bHQpOyAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBBMV9oaSA9IF9tbV9tdWxoaV9lcHUxNihBMF9oaSwga011bHQpOyAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBBMl9sbyA9IF9tbV9zcmxpX2VwaTE2KEExX2xvLCA3KTsgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBBMl9oaSA9IF9tbV9zcmxpX2VwaTE2KEExX2hpLCA3KTsgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBBMyA9IF9tbV9wYWNrdXNfZXBpMTYoQTJfbG8sIEEyX2hpKTsgICAgICAgICAgICAgICAgIFwKKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJihSR0JYKSwgQTMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIEFwcGx5QWxwaGFNdWx0aXBseV9TU0UyKHVpbnQ4X3QqIHJnYmEsIGludCBhbHBoYV9maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgaW50IHN0cmlkZSkgeworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBjb25zdCBfX20xMjhpIGtNdWx0ID0gX21tX3NldDFfZXBpMTYoMHg4MDgxdSk7CisgIGNvbnN0IF9fbTEyOGkga01hc2sgPSBfbW1fc2V0X2VwaTE2KDAsIDB4ZmYsIDB4ZmYsIDAsIDAsIDB4ZmYsIDB4ZmYsIDApOworICBjb25zdCBpbnQga1NwYW4gPSA0OworICB3aGlsZSAoaC0tID4gMCkgeworICAgIHVpbnQzMl90KiBjb25zdCByZ2J4ID0gKHVpbnQzMl90KilyZ2JhOworICAgIGludCBpOworICAgIGlmICghYWxwaGFfZmlyc3QpIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgKyBrU3BhbiA8PSB3OyBpICs9IGtTcGFuKSB7CisgICAgICAgIEFQUExZX0FMUEhBKHJnYnhbaV0sIF9NTV9TSFVGRkxFKDIsIDMsIDMsIDMpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZm9yIChpID0gMDsgaSArIGtTcGFuIDw9IHc7IGkgKz0ga1NwYW4pIHsKKyAgICAgICAgQVBQTFlfQUxQSEEocmdieFtpXSwgX01NX1NIVUZGTEUoMCwgMCwgMCwgMSkpOworICAgICAgfQorICAgIH0KKyAgICAvLyBGaW5pc2ggd2l0aCBsZWZ0LW92ZXJzLgorICAgIGZvciAoOyBpIDwgdzsgKytpKSB7CisgICAgICB1aW50OF90KiBjb25zdCByZ2IgPSByZ2JhICsgKGFscGhhX2ZpcnN0ID8gMSA6IDApOworICAgICAgY29uc3QgdWludDhfdCogY29uc3QgYWxwaGEgPSByZ2JhICsgKGFscGhhX2ZpcnN0ID8gMCA6IDMpOworICAgICAgY29uc3QgdWludDMyX3QgYSA9IGFscGhhWzQgKiBpXTsKKyAgICAgIGlmIChhICE9IDB4ZmYpIHsKKyAgICAgICAgY29uc3QgdWludDMyX3QgbXVsdCA9IE1VTFRJUExJRVIoYSk7CisgICAgICAgIHJnYls0ICogaSArIDBdID0gUFJFTVVMVElQTFkocmdiWzQgKiBpICsgMF0sIG11bHQpOworICAgICAgICByZ2JbNCAqIGkgKyAxXSA9IFBSRU1VTFRJUExZKHJnYls0ICogaSArIDFdLCBtdWx0KTsKKyAgICAgICAgcmdiWzQgKiBpICsgMl0gPSBQUkVNVUxUSVBMWShyZ2JbNCAqIGkgKyAyXSwgbXVsdCk7CisgICAgICB9CisgICAgfQorICAgIHJnYmEgKz0gc3RyaWRlOworICB9Cit9CisjdW5kZWYgTVVMVElQTElFUgorI3VuZGVmIFBSRU1VTFRJUExZCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBbHBoYSBkZXRlY3Rpb24KKworc3RhdGljIGludCBIYXNBbHBoYThiX1NTRTIoY29uc3QgdWludDhfdCogc3JjLCBpbnQgbGVuZ3RoKSB7CisgIGNvbnN0IF9fbTEyOGkgYWxsXzB4ZmYgPSBfbW1fc2V0MV9lcGk4KDB4ZmYpOworICBpbnQgaSA9IDA7CisgIGZvciAoOyBpICsgMTYgPD0gbGVuZ3RoOyBpICs9IDE2KSB7CisgICAgY29uc3QgX19tMTI4aSB2ID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikoc3JjICsgaSkpOworICAgIGNvbnN0IF9fbTEyOGkgYml0cyA9IF9tbV9jbXBlcV9lcGk4KHYsIGFsbF8weGZmKTsKKyAgICBjb25zdCBpbnQgbWFzayA9IF9tbV9tb3ZlbWFza19lcGk4KGJpdHMpOworICAgIGlmIChtYXNrICE9IDB4ZmZmZikgcmV0dXJuIDE7CisgIH0KKyAgZm9yICg7IGkgPCBsZW5ndGg7ICsraSkgaWYgKHNyY1tpXSAhPSAweGZmKSByZXR1cm4gMTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgSGFzQWxwaGEzMmJfU1NFMihjb25zdCB1aW50OF90KiBzcmMsIGludCBsZW5ndGgpIHsKKyAgY29uc3QgX19tMTI4aSBhbHBoYV9tYXNrID0gX21tX3NldDFfZXBpMzIoMHhmZik7CisgIGNvbnN0IF9fbTEyOGkgYWxsXzB4ZmYgPSBfbW1fc2V0MV9lcGk4KDB4ZmYpOworICBpbnQgaSA9IDA7CisgIC8vIFdlIGRvbid0IGtub3cgaWYgd2UgY2FuIGFjY2VzcyB0aGUgbGFzdCAzIGJ5dGVzIGFmdGVyIHRoZSBsYXN0IGFscGhhCisgIC8vIHZhbHVlICdzcmNbNCAqIGxlbmd0aCAtIDRdJyAoYmVjYXVzZSB3ZSBkb24ndCBrbm93IGlmIGFscGhhIGlzIHRoZSBmaXJzdAorICAvLyBvciB0aGUgbGFzdCBieXRlIG9mIHRoZSBxdWFkcnVwbGV0KS4gSGVuY2UgdGhlICctMycgcHJvdGVjdGlvbiBiZWxvdy4KKyAgbGVuZ3RoID0gbGVuZ3RoICogNCAtIDM7ICAgLy8gc2l6ZSBpbiBieXRlcworICBmb3IgKDsgaSArIDY0IDw9IGxlbmd0aDsgaSArPSA2NCkgeworICAgIGNvbnN0IF9fbTEyOGkgYTAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShzcmMgKyBpICsgIDApKTsKKyAgICBjb25zdCBfX20xMjhpIGExID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikoc3JjICsgaSArIDE2KSk7CisgICAgY29uc3QgX19tMTI4aSBhMiA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKHNyYyArIGkgKyAzMikpOworICAgIGNvbnN0IF9fbTEyOGkgYTMgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShzcmMgKyBpICsgNDgpKTsKKyAgICBjb25zdCBfX20xMjhpIGIwID0gX21tX2FuZF9zaTEyOChhMCwgYWxwaGFfbWFzayk7CisgICAgY29uc3QgX19tMTI4aSBiMSA9IF9tbV9hbmRfc2kxMjgoYTEsIGFscGhhX21hc2spOworICAgIGNvbnN0IF9fbTEyOGkgYjIgPSBfbW1fYW5kX3NpMTI4KGEyLCBhbHBoYV9tYXNrKTsKKyAgICBjb25zdCBfX20xMjhpIGIzID0gX21tX2FuZF9zaTEyOChhMywgYWxwaGFfbWFzayk7CisgICAgY29uc3QgX19tMTI4aSBjMCA9IF9tbV9wYWNrc19lcGkzMihiMCwgYjEpOworICAgIGNvbnN0IF9fbTEyOGkgYzEgPSBfbW1fcGFja3NfZXBpMzIoYjIsIGIzKTsKKyAgICBjb25zdCBfX20xMjhpIGQgID0gX21tX3BhY2t1c19lcGkxNihjMCwgYzEpOworICAgIGNvbnN0IF9fbTEyOGkgYml0cyA9IF9tbV9jbXBlcV9lcGk4KGQsIGFsbF8weGZmKTsKKyAgICBjb25zdCBpbnQgbWFzayA9IF9tbV9tb3ZlbWFza19lcGk4KGJpdHMpOworICAgIGlmIChtYXNrICE9IDB4ZmZmZikgcmV0dXJuIDE7CisgIH0KKyAgZm9yICg7IGkgKyAzMiA8PSBsZW5ndGg7IGkgKz0gMzIpIHsKKyAgICBjb25zdCBfX20xMjhpIGEwID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikoc3JjICsgaSArICAwKSk7CisgICAgY29uc3QgX19tMTI4aSBhMSA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKHNyYyArIGkgKyAxNikpOworICAgIGNvbnN0IF9fbTEyOGkgYjAgPSBfbW1fYW5kX3NpMTI4KGEwLCBhbHBoYV9tYXNrKTsKKyAgICBjb25zdCBfX20xMjhpIGIxID0gX21tX2FuZF9zaTEyOChhMSwgYWxwaGFfbWFzayk7CisgICAgY29uc3QgX19tMTI4aSBjICA9IF9tbV9wYWNrc19lcGkzMihiMCwgYjEpOworICAgIGNvbnN0IF9fbTEyOGkgZCAgPSBfbW1fcGFja3VzX2VwaTE2KGMsIGMpOworICAgIGNvbnN0IF9fbTEyOGkgYml0cyA9IF9tbV9jbXBlcV9lcGk4KGQsIGFsbF8weGZmKTsKKyAgICBjb25zdCBpbnQgbWFzayA9IF9tbV9tb3ZlbWFza19lcGk4KGJpdHMpOworICAgIGlmIChtYXNrICE9IDB4ZmZmZikgcmV0dXJuIDE7CisgIH0KKyAgZm9yICg7IGkgPD0gbGVuZ3RoOyBpICs9IDQpIGlmIChzcmNbaV0gIT0gMHhmZikgcmV0dXJuIDE7CisgIHJldHVybiAwOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQXBwbHkgYWxwaGEgdmFsdWUgdG8gcm93cworCitzdGF0aWMgdm9pZCBNdWx0QVJHQlJvd19TU0UyKHVpbnQzMl90KiBjb25zdCBwdHIsIGludCB3aWR0aCwgaW50IGludmVyc2UpIHsKKyAgaW50IHggPSAwOworICBpZiAoIWludmVyc2UpIHsKKyAgICBjb25zdCBpbnQga1NwYW4gPSAyOworICAgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgICAgY29uc3QgX19tMTI4aSBrMTI4ID0gX21tX3NldDFfZXBpMTYoMTI4KTsKKyAgICBjb25zdCBfX20xMjhpIGtNdWx0ID0gX21tX3NldDFfZXBpMTYoMHgwMTAxKTsKKyAgICBjb25zdCBfX20xMjhpIGtNYXNrID0gX21tX3NldF9lcGkxNigwLCAweGZmLCAwLCAwLCAwLCAweGZmLCAwLCAwKTsKKyAgICBmb3IgKHggPSAwOyB4ICsga1NwYW4gPD0gd2lkdGg7IHggKz0ga1NwYW4pIHsKKyAgICAgIC8vIFRvIGNvbXB1dGUgJ3Jlc3VsdCA9IChpbnQpKGEgKiB4IC8gMjU1LiArIC41KScsIHdlIHVzZToKKyAgICAgIC8vICAgdG1wID0gYSAqIHYgKyAxMjgsIHJlc3VsdCA9ICh0bXAgKiAweDAxMDF1KSA+PiAxNgorICAgICAgY29uc3QgX19tMTI4aSBBMCA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJnB0clt4XSk7CisgICAgICBjb25zdCBfX20xMjhpIEExID0gX21tX3VucGFja2xvX2VwaTgoQTAsIHplcm8pOworICAgICAgY29uc3QgX19tMTI4aSBBMiA9IF9tbV9vcl9zaTEyOChBMSwga01hc2spOworICAgICAgY29uc3QgX19tMTI4aSBBMyA9IF9tbV9zaHVmZmxlbG9fZXBpMTYoQTIsIF9NTV9TSFVGRkxFKDIsIDMsIDMsIDMpKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgQTQgPSBfbW1fc2h1ZmZsZWhpX2VwaTE2KEEzLCBfTU1fU0hVRkZMRSgyLCAzLCAzLCAzKSk7CisgICAgICAvLyBoZXJlLCBBNCA9IFtmZiBhMCBhMCBhMF1bZmYgYTEgYTEgYTFdCisgICAgICBjb25zdCBfX20xMjhpIEE1ID0gX21tX211bGxvX2VwaTE2KEE0LCBBMSk7CisgICAgICBjb25zdCBfX20xMjhpIEE2ID0gX21tX2FkZF9lcGkxNihBNSwgazEyOCk7CisgICAgICBjb25zdCBfX20xMjhpIEE3ID0gX21tX211bGhpX2VwdTE2KEE2LCBrTXVsdCk7CisgICAgICBjb25zdCBfX20xMjhpIEExMCA9IF9tbV9wYWNrdXNfZXBpMTYoQTcsIHplcm8pOworICAgICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopJnB0clt4XSwgQTEwKTsKKyAgICB9CisgIH0KKyAgd2lkdGggLT0geDsKKyAgaWYgKHdpZHRoID4gMCkgV2ViUE11bHRBUkdCUm93X0MocHRyICsgeCwgd2lkdGgsIGludmVyc2UpOworfQorCitzdGF0aWMgdm9pZCBNdWx0Um93X1NTRTIodWludDhfdCogY29uc3QgcHRyLCBjb25zdCB1aW50OF90KiBjb25zdCBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBpbnZlcnNlKSB7CisgIGludCB4ID0gMDsKKyAgaWYgKCFpbnZlcnNlKSB7CisgICAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgICBjb25zdCBfX20xMjhpIGsxMjggPSBfbW1fc2V0MV9lcGkxNigxMjgpOworICAgIGNvbnN0IF9fbTEyOGkga011bHQgPSBfbW1fc2V0MV9lcGkxNigweDAxMDEpOworICAgIGZvciAoeCA9IDA7IHggKyA4IDw9IHdpZHRoOyB4ICs9IDgpIHsKKyAgICAgIGNvbnN0IF9fbTEyOGkgdjAgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSZwdHJbeF0pOworICAgICAgY29uc3QgX19tMTI4aSBhMCA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmFscGhhW3hdKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgdjEgPSBfbW1fdW5wYWNrbG9fZXBpOCh2MCwgemVybyk7CisgICAgICBjb25zdCBfX20xMjhpIGExID0gX21tX3VucGFja2xvX2VwaTgoYTAsIHplcm8pOworICAgICAgY29uc3QgX19tMTI4aSB2MiA9IF9tbV9tdWxsb19lcGkxNih2MSwgYTEpOworICAgICAgY29uc3QgX19tMTI4aSB2MyA9IF9tbV9hZGRfZXBpMTYodjIsIGsxMjgpOworICAgICAgY29uc3QgX19tMTI4aSB2NCA9IF9tbV9tdWxoaV9lcHUxNih2Mywga011bHQpOworICAgICAgY29uc3QgX19tMTI4aSB2NSA9IF9tbV9wYWNrdXNfZXBpMTYodjQsIHplcm8pOworICAgICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopJnB0clt4XSwgdjUpOworICAgIH0KKyAgfQorICB3aWR0aCAtPSB4OworICBpZiAod2lkdGggPiAwKSBXZWJQTXVsdFJvd19DKHB0ciArIHgsIGFscGhhICsgeCwgd2lkdGgsIGludmVyc2UpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgV2ViUEluaXRBbHBoYVByb2Nlc3NpbmdTU0UyKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgV2ViUEluaXRBbHBoYVByb2Nlc3NpbmdTU0UyKHZvaWQpIHsKKyAgV2ViUE11bHRBUkdCUm93ID0gTXVsdEFSR0JSb3dfU1NFMjsKKyAgV2ViUE11bHRSb3cgPSBNdWx0Um93X1NTRTI7CisgIFdlYlBBcHBseUFscGhhTXVsdGlwbHkgPSBBcHBseUFscGhhTXVsdGlwbHlfU1NFMjsKKyAgV2ViUERpc3BhdGNoQWxwaGEgPSBEaXNwYXRjaEFscGhhX1NTRTI7CisgIFdlYlBEaXNwYXRjaEFscGhhVG9HcmVlbiA9IERpc3BhdGNoQWxwaGFUb0dyZWVuX1NTRTI7CisgIFdlYlBFeHRyYWN0QWxwaGEgPSBFeHRyYWN0QWxwaGFfU1NFMjsKKworICBXZWJQSGFzQWxwaGE4YiA9IEhhc0FscGhhOGJfU1NFMjsKKyAgV2ViUEhhc0FscGhhMzJiID0gSGFzQWxwaGEzMmJfU1NFMjsKK30KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9TU0UyCisKK1dFQlBfRFNQX0lOSVRfU1RVQihXZWJQSW5pdEFscGhhUHJvY2Vzc2luZ1NTRTIpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfU1NFMgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9hbHBoYV9wcm9jZXNzaW5nX3NzZTQxLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2FscGhhX3Byb2Nlc3Npbmdfc3NlNDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjA0MGY5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9hbHBoYV9wcm9jZXNzaW5nX3NzZTQxLmMKQEAgLTAsMCArMSw5MiBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFV0aWxpdGllcyBmb3IgcHJvY2Vzc2luZyB0cmFuc3BhcmVudCBjaGFubmVsLCBTU0U0LjEgdmFyaWFudC4KKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFNDEpCisKKyNpbmNsdWRlIDxzbW1pbnRyaW4uaD4KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGludCBFeHRyYWN0QWxwaGFfU1NFNDEoY29uc3QgdWludDhfdCogYXJnYiwgaW50IGFyZ2Jfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogYWxwaGEsIGludCBhbHBoYV9zdHJpZGUpIHsKKyAgLy8gYWxwaGFfYW5kIHN0b3JlcyBhbiAnYW5kJyBvcGVyYXRpb24gb2YgYWxsIHRoZSBhbHBoYVtdIHZhbHVlcy4gVGhlIGZpbmFsCisgIC8vIHZhbHVlIGlzIG5vdCAweGZmIGlmIGFueSBvZiB0aGUgYWxwaGFbXSBpcyBub3QgZXF1YWwgdG8gMHhmZi4KKyAgdWludDMyX3QgYWxwaGFfYW5kID0gMHhmZjsKKyAgaW50IGksIGo7CisgIGNvbnN0IF9fbTEyOGkgYWxsXzB4ZmYgPSBfbW1fc2V0MV9lcGkzMih+MHUpOworICBfX20xMjhpIGFsbF9hbHBoYXMgPSBhbGxfMHhmZjsKKworICAvLyBXZSBtdXN0IGJlIGFibGUgdG8gYWNjZXNzIDMgZXh0cmEgYnl0ZXMgYWZ0ZXIgdGhlIGxhc3Qgd3JpdHRlbiBieXRlCisgIC8vICdzcmNbNCAqIHdpZHRoIC0gNF0nLCBiZWNhdXNlIHdlIGRvbid0IGtub3cgaWYgYWxwaGEgaXMgdGhlIGZpcnN0IG9yIHRoZQorICAvLyBsYXN0IGJ5dGUgb2YgdGhlIHF1YWRydXBsZXQuCisgIGNvbnN0IGludCBsaW1pdCA9ICh3aWR0aCAtIDEpICYgfjE1OworICBjb25zdCBfX20xMjhpIGtDc3RBbHBoYTAgPSBfbW1fc2V0X2VwaTgoLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIDEyLCA4LCA0LCAwKTsKKyAgY29uc3QgX19tMTI4aSBrQ3N0QWxwaGExID0gX21tX3NldF9lcGk4KC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyLCA4LCA0LCAwLCAtMSwgLTEsIC0xLCAtMSk7CisgIGNvbnN0IF9fbTEyOGkga0NzdEFscGhhMiA9IF9tbV9zZXRfZXBpOCgtMSwgLTEsIC0xLCAtMSwgMTIsIDgsIDQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpOworICBjb25zdCBfX20xMjhpIGtDc3RBbHBoYTMgPSBfbW1fc2V0X2VwaTgoMTIsIDgsIDQsIDAsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKTsKKyAgZm9yIChqID0gMDsgaiA8IGhlaWdodDsgKytqKSB7CisgICAgY29uc3QgX19tMTI4aSogc3JjID0gKGNvbnN0IF9fbTEyOGkqKWFyZ2I7CisgICAgZm9yIChpID0gMDsgaSA8IGxpbWl0OyBpICs9IDE2KSB7CisgICAgICAvLyBsb2FkIDY0IGFyZ2IgYnl0ZXMKKyAgICAgIGNvbnN0IF9fbTEyOGkgYTAgPSBfbW1fbG9hZHVfc2kxMjgoc3JjICsgMCk7CisgICAgICBjb25zdCBfX20xMjhpIGExID0gX21tX2xvYWR1X3NpMTI4KHNyYyArIDEpOworICAgICAgY29uc3QgX19tMTI4aSBhMiA9IF9tbV9sb2FkdV9zaTEyOChzcmMgKyAyKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYTMgPSBfbW1fbG9hZHVfc2kxMjgoc3JjICsgMyk7CisgICAgICBjb25zdCBfX20xMjhpIGIwID0gX21tX3NodWZmbGVfZXBpOChhMCwga0NzdEFscGhhMCk7CisgICAgICBjb25zdCBfX20xMjhpIGIxID0gX21tX3NodWZmbGVfZXBpOChhMSwga0NzdEFscGhhMSk7CisgICAgICBjb25zdCBfX20xMjhpIGIyID0gX21tX3NodWZmbGVfZXBpOChhMiwga0NzdEFscGhhMik7CisgICAgICBjb25zdCBfX20xMjhpIGIzID0gX21tX3NodWZmbGVfZXBpOChhMywga0NzdEFscGhhMyk7CisgICAgICBjb25zdCBfX20xMjhpIGMwID0gX21tX29yX3NpMTI4KGIwLCBiMSk7CisgICAgICBjb25zdCBfX20xMjhpIGMxID0gX21tX29yX3NpMTI4KGIyLCBiMyk7CisgICAgICBjb25zdCBfX20xMjhpIGQwID0gX21tX29yX3NpMTI4KGMwLCBjMSk7CisgICAgICAvLyBzdG9yZQorICAgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJmFscGhhW2ldLCBkMCk7CisgICAgICAvLyBhY2N1bXVsYXRlIHNpeHRlZW4gYWxwaGEgJ2FuZCcgaW4gcGFyYWxsZWwKKyAgICAgIGFsbF9hbHBoYXMgPSBfbW1fYW5kX3NpMTI4KGFsbF9hbHBoYXMsIGQwKTsKKyAgICAgIHNyYyArPSA0OworICAgIH0KKyAgICBmb3IgKDsgaSA8IHdpZHRoOyArK2kpIHsKKyAgICAgIGNvbnN0IHVpbnQzMl90IGFscGhhX3ZhbHVlID0gYXJnYls0ICogaV07CisgICAgICBhbHBoYVtpXSA9IGFscGhhX3ZhbHVlOworICAgICAgYWxwaGFfYW5kICY9IGFscGhhX3ZhbHVlOworICAgIH0KKyAgICBhcmdiICs9IGFyZ2Jfc3RyaWRlOworICAgIGFscGhhICs9IGFscGhhX3N0cmlkZTsKKyAgfQorICAvLyBDb21iaW5lIHRoZSBzaXh0ZWVuIGFscGhhICdhbmQnIGludG8gYW4gOC1iaXQgbWFzay4KKyAgYWxwaGFfYW5kIHw9IDB4ZmYwMHU7ICAvLyBwcmV0ZW5kIHRoZSB1cHBlciBiaXRzIFs4Li4xNV0gd2VyZSB0ZXN0ZWQgb2suCisgIGFscGhhX2FuZCAmPSBfbW1fbW92ZW1hc2tfZXBpOChfbW1fY21wZXFfZXBpOChhbGxfYWxwaGFzLCBhbGxfMHhmZikpOworICByZXR1cm4gKGFscGhhX2FuZCA9PSAweGZmZmZ1KTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFdlYlBJbml0QWxwaGFQcm9jZXNzaW5nU1NFNDEodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBXZWJQSW5pdEFscGhhUHJvY2Vzc2luZ1NTRTQxKHZvaWQpIHsKKyAgV2ViUEV4dHJhY3RBbHBoYSA9IEV4dHJhY3RBbHBoYV9TU0U0MTsKK30KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9TU0U0MQorCitXRUJQX0RTUF9JTklUX1NUVUIoV2ViUEluaXRBbHBoYVByb2Nlc3NpbmdTU0U0MSkKKworI2VuZGlmICAvLyBXRUJQX1VTRV9TU0U0MQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9jb21tb25fc3NlMi5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9jb21tb25fc3NlMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ZjFlYmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2NvbW1vbl9zc2UyLmgKQEAgLTAsMCArMSwxOTQgQEAKKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBTU0UyIGNvZGUgY29tbW9uIHRvIHNldmVyYWwgZmlsZXMuCisvLworLy8gQXV0aG9yOiBWaW5jZW50IFJhYmF1ZCAodnJhYmF1ZEBnb29nbGUuY29tKQorCisjaWZuZGVmIFdFQlBfRFNQX0NPTU1PTl9TU0UyX0hfCisjZGVmaW5lIFdFQlBfRFNQX0NPTU1PTl9TU0UyX0hfCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFMikKKworI2luY2x1ZGUgPGVtbWludHJpbi5oPgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUXVpdGUgdXNlZnVsIG1hY3JvIGZvciBkZWJ1Z2dpbmcuIExlZnQgaGVyZSBmb3IgY29udmVuaWVuY2UuCisKKyNpZiAwCisjaW5jbHVkZSA8c3RkaW8uaD4KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFByaW50UmVnKGNvbnN0IF9fbTEyOGkgciwgY29uc3QgY2hhciogY29uc3QgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplKSB7CisgIGludCBuOworICB1bmlvbiB7CisgICAgX19tMTI4aSByOworICAgIHVpbnQ4X3QgaThbMTZdOworICAgIHVpbnQxNl90IGkxNls4XTsKKyAgICB1aW50MzJfdCBpMzJbNF07CisgICAgdWludDY0X3QgaTY0WzJdOworICB9IHRtcDsKKyAgdG1wLnIgPSByOworICBmcHJpbnRmKHN0ZGVyciwgIiVzXHQ6ICIsIG5hbWUpOworICBpZiAoc2l6ZSA9PSA4KSB7CisgICAgZm9yIChuID0gMDsgbiA8IDE2OyArK24pIGZwcmludGYoc3RkZXJyLCAiJS4yeCAiLCB0bXAuaThbbl0pOworICB9IGVsc2UgaWYgKHNpemUgPT0gMTYpIHsKKyAgICBmb3IgKG4gPSAwOyBuIDwgODsgKytuKSBmcHJpbnRmKHN0ZGVyciwgIiUuNHggIiwgdG1wLmkxNltuXSk7CisgIH0gZWxzZSBpZiAoc2l6ZSA9PSAzMikgeworICAgIGZvciAobiA9IDA7IG4gPCA0OyArK24pIGZwcmludGYoc3RkZXJyLCAiJS44eCAiLCB0bXAuaTMyW25dKTsKKyAgfSBlbHNlIHsKKyAgICBmb3IgKG4gPSAwOyBuIDwgMjsgKytuKSBmcHJpbnRmKHN0ZGVyciwgIiUuMTZseCAiLCB0bXAuaTY0W25dKTsKKyAgfQorICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7Cit9CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1hdGggZnVuY3Rpb25zLgorCisvLyBSZXR1cm4gdGhlIHN1bSBvZiBhbGwgdGhlIDhiIGluIHRoZSByZWdpc3Rlci4KK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4SG9yaXpvbnRhbEFkZDhiKGNvbnN0IF9fbTEyOGkqIGNvbnN0IGEpIHsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgY29uc3QgX19tMTI4aSBzYWQ4eDIgPSBfbW1fc2FkX2VwdTgoKmEsIHplcm8pOworICAvLyBzdW0gdGhlIHR3byBzYWRzOiBzYWQ4eDJbMDoxXSArIHNhZDh4Mls4OjldCisgIGNvbnN0IF9fbTEyOGkgc3VtID0gX21tX2FkZF9lcGkzMihzYWQ4eDIsIF9tbV9zaHVmZmxlX2VwaTMyKHNhZDh4MiwgMikpOworICByZXR1cm4gX21tX2N2dHNpMTI4X3NpMzIoc3VtKTsKK30KKworLy8gVHJhbnNwb3NlIHR3byA0eDQgMTZiIG1hdHJpY2VzIGhvcml6b250YWxseSBzdG9yZWQgaW4gcmVnaXN0ZXJzLgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVlA4VHJhbnNwb3NlXzJfNHg0XzE2YigKKyAgICBjb25zdCBfX20xMjhpKiBjb25zdCBpbjAsIGNvbnN0IF9fbTEyOGkqIGNvbnN0IGluMSwKKyAgICBjb25zdCBfX20xMjhpKiBjb25zdCBpbjIsIGNvbnN0IF9fbTEyOGkqIGNvbnN0IGluMywgX19tMTI4aSogY29uc3Qgb3V0MCwKKyAgICBfX20xMjhpKiBjb25zdCBvdXQxLCBfX20xMjhpKiBjb25zdCBvdXQyLCBfX20xMjhpKiBjb25zdCBvdXQzKSB7CisgIC8vIFRyYW5zcG9zZSB0aGUgdHdvIDR4NC4KKyAgLy8gYTAwIGEwMSBhMDIgYTAzICAgYjAwIGIwMSBiMDIgYjAzCisgIC8vIGExMCBhMTEgYTEyIGExMyAgIGIxMCBiMTEgYjEyIGIxMworICAvLyBhMjAgYTIxIGEyMiBhMjMgICBiMjAgYjIxIGIyMiBiMjMKKyAgLy8gYTMwIGEzMSBhMzIgYTMzICAgYjMwIGIzMSBiMzIgYjMzCisgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMF8wID0gX21tX3VucGFja2xvX2VwaTE2KCppbjAsICppbjEpOworICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTBfMSA9IF9tbV91bnBhY2tsb19lcGkxNigqaW4yLCAqaW4zKTsKKyAgY29uc3QgX19tMTI4aSB0cmFuc3Bvc2UwXzIgPSBfbW1fdW5wYWNraGlfZXBpMTYoKmluMCwgKmluMSk7CisgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMF8zID0gX21tX3VucGFja2hpX2VwaTE2KCppbjIsICppbjMpOworICAvLyBhMDAgYTEwIGEwMSBhMTEgICBhMDIgYTEyIGEwMyBhMTMKKyAgLy8gYTIwIGEzMCBhMjEgYTMxICAgYTIyIGEzMiBhMjMgYTMzCisgIC8vIGIwMCBiMTAgYjAxIGIxMSAgIGIwMiBiMTIgYjAzIGIxMworICAvLyBiMjAgYjMwIGIyMSBiMzEgICBiMjIgYjMyIGIyMyBiMzMKKyAgY29uc3QgX19tMTI4aSB0cmFuc3Bvc2UxXzAgPSBfbW1fdW5wYWNrbG9fZXBpMzIodHJhbnNwb3NlMF8wLCB0cmFuc3Bvc2UwXzEpOworICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTFfMSA9IF9tbV91bnBhY2tsb19lcGkzMih0cmFuc3Bvc2UwXzIsIHRyYW5zcG9zZTBfMyk7CisgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMV8yID0gX21tX3VucGFja2hpX2VwaTMyKHRyYW5zcG9zZTBfMCwgdHJhbnNwb3NlMF8xKTsKKyAgY29uc3QgX19tMTI4aSB0cmFuc3Bvc2UxXzMgPSBfbW1fdW5wYWNraGlfZXBpMzIodHJhbnNwb3NlMF8yLCB0cmFuc3Bvc2UwXzMpOworICAvLyBhMDAgYTEwIGEyMCBhMzAgYTAxIGExMSBhMjEgYTMxCisgIC8vIGIwMCBiMTAgYjIwIGIzMCBiMDEgYjExIGIyMSBiMzEKKyAgLy8gYTAyIGExMiBhMjIgYTMyIGEwMyBhMTMgYTIzIGEzMworICAvLyBiMDIgYjEyIGEyMiBiMzIgYjAzIGIxMyBiMjMgYjMzCisgICpvdXQwID0gX21tX3VucGFja2xvX2VwaTY0KHRyYW5zcG9zZTFfMCwgdHJhbnNwb3NlMV8xKTsKKyAgKm91dDEgPSBfbW1fdW5wYWNraGlfZXBpNjQodHJhbnNwb3NlMV8wLCB0cmFuc3Bvc2UxXzEpOworICAqb3V0MiA9IF9tbV91bnBhY2tsb19lcGk2NCh0cmFuc3Bvc2UxXzIsIHRyYW5zcG9zZTFfMyk7CisgICpvdXQzID0gX21tX3VucGFja2hpX2VwaTY0KHRyYW5zcG9zZTFfMiwgdHJhbnNwb3NlMV8zKTsKKyAgLy8gYTAwIGExMCBhMjAgYTMwICAgYjAwIGIxMCBiMjAgYjMwCisgIC8vIGEwMSBhMTEgYTIxIGEzMSAgIGIwMSBiMTEgYjIxIGIzMQorICAvLyBhMDIgYTEyIGEyMiBhMzIgICBiMDIgYjEyIGIyMiBiMzIKKyAgLy8gYTAzIGExMyBhMjMgYTMzICAgYjAzIGIxMyBiMjMgYjMzCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDaGFubmVsIG1peGluZy4KKworLy8gRnVuY3Rpb24gdXNlZCBzZXZlcmFsIHRpbWVzIGluIFZQOFBsYW5hclRvMjRiLgorLy8gSXQgc2FtcGxlcyB0aGUgaW4gYnVmZmVyIGFzIGZvbGxvd3M6IG9uZSBldmVyeSB0d28gdW5zaWduZWQgY2hhciBpcyBzdG9yZWQKKy8vIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlciwgd2hpbGUgdGhlIG90aGVyIGhhbGYgaXMgc3RvcmVkIGF0IHRoZSBlbmQuCisjZGVmaW5lIFZQOFBsYW5hclRvMjRiSGVscGVyKElOLCBPVVQpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IF9fbTEyOGkgdl9tYXNrID0gX21tX3NldDFfZXBpMTYoMHgwMGZmKTsgICAgICAgICAgICAgICBcCisgICAgLyogVGFrZSBvbmUgZXZlcnkgdHdvIHVwcGVyIDhiIHZhbHVlcy4qLyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoT1VUIyMwKSA9IF9tbV9wYWNrdXNfZXBpMTYoX21tX2FuZF9zaTEyOCgoSU4jIzApLCB2X21hc2spLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbW1fYW5kX3NpMTI4KChJTiMjMSksIHZfbWFzaykpOyBcCisgICAgKE9VVCMjMSkgPSBfbW1fcGFja3VzX2VwaTE2KF9tbV9hbmRfc2kxMjgoKElOIyMyKSwgdl9tYXNrKSwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21tX2FuZF9zaTEyOCgoSU4jIzMpLCB2X21hc2spKTsgXAorICAgIChPVVQjIzIpID0gX21tX3BhY2t1c19lcGkxNihfbW1fYW5kX3NpMTI4KChJTiMjNCksIHZfbWFzayksICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tbV9hbmRfc2kxMjgoKElOIyM1KSwgdl9tYXNrKSk7IFwKKyAgICAvKiBUYWtlIG9uZSBldmVyeSB0d28gbG93ZXIgOGIgdmFsdWVzLiovICAgICAgICAgICAgICAgICAgICAgXAorICAgIChPVVQjIzMpID0gX21tX3BhY2t1c19lcGkxNihfbW1fc3JsaV9lcGkxNigoSU4jIzApLCA4KSwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tbV9zcmxpX2VwaTE2KChJTiMjMSksIDgpKTsgICAgIFwKKyAgICAoT1VUIyM0KSA9IF9tbV9wYWNrdXNfZXBpMTYoX21tX3NybGlfZXBpMTYoKElOIyMyKSwgOCksICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbW1fc3JsaV9lcGkxNigoSU4jIzMpLCA4KSk7ICAgICBcCisgICAgKE9VVCMjNSkgPSBfbW1fcGFja3VzX2VwaTE2KF9tbV9zcmxpX2VwaTE2KChJTiMjNCksIDgpLCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21tX3NybGlfZXBpMTYoKElOIyM1KSwgOCkpOyAgICAgXAorICB9IHdoaWxlICgwKQorCisvLyBQYWNrIHRoZSBwbGFuYXIgYnVmZmVycworLy8gcnJyci4uLiBycnJyLi4uIGdnZ2cuLi4gZ2dnZy4uLiBiYmJiLi4uIGJiYmIuLi4uCisvLyB0cmlwbGV0IGJ5IHRyaXBsZXQgaW4gdGhlIG91dHB1dCBidWZmZXIgcmdiIGFzIHJnYnJnYnJnYnJnYiAuLi4KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZQOFBsYW5hclRvMjRiX1NTRTIoCisgICAgX19tMTI4aSogY29uc3QgaW4wLCBfX20xMjhpKiBjb25zdCBpbjEsIF9fbTEyOGkqIGNvbnN0IGluMiwKKyAgICBfX20xMjhpKiBjb25zdCBpbjMsIF9fbTEyOGkqIGNvbnN0IGluNCwgX19tMTI4aSogY29uc3QgaW41KSB7CisgIC8vIFRoZSBpbnB1dCBpcyA2IHJlZ2lzdGVycyBvZiBzaXh0ZWVuIDhiIGJ1dCBmb3IgdGhlIHNha2Ugb2YgZXhwbGFuYXRpb24sCisgIC8vIGxldCdzIHRha2UgNiByZWdpc3RlcnMgb2YgZm91ciA4YiB2YWx1ZXMuCisgIC8vIFRvIHBhY2ssIHdlIHdpbGwga2VlcCB0YWtpbmcgb25lIGV2ZXJ5IHR3byA4YiBpbnRlZ2VyIGFuZCBtb3ZlIGl0CisgIC8vIGFyb3VuZCBhcyBmb2xsb3dzOgorICAvLyBJbnB1dDoKKyAgLy8gICByMHIxcjJyMyB8IHI0cjVyNnI3IHwgZzBnMWcyZzMgfCBnNGc1ZzZnNyB8IGIwYjFiMmIzIHwgYjRiNWI2YjcKKyAgLy8gU3BsaXQgdGhlIDYgcmVnaXN0ZXJzIGluIHR3byBzZXRzIG9mIDMgcmVnaXN0ZXJzOiB0aGUgZmlyc3Qgc2V0IGFzIHRoZSBldmVuCisgIC8vIDhiIGJ5dGVzLCB0aGUgc2Vjb25kIHRoZSBvZGQgb25lczoKKyAgLy8gICByMHIycjRyNiB8IGcwZzJnNGc2IHwgYjBiMmI0YjYgfCByMXIzcjVyNyB8IGcxZzNnNWc3IHwgYjFiM2I1YjcKKyAgLy8gUmVwZWF0IHRoZSBzYW1lIHBlcm11dGF0aW9ucyB0d2ljZSBtb3JlOgorICAvLyAgIHIwcjRnMGc0IHwgYjBiNHIxcjUgfCBnMWc1YjFiNSB8IHIycjZnMmc2IHwgYjJiNnIzcjcgfCBnM2c3YjNiNworICAvLyAgIHIwZzBiMHIxIHwgZzFiMXIyZzIgfCBiMnIzZzNiMyB8IHI0ZzRiNHI1IHwgZzViNXI2ZzYgfCBiNnI3ZzdiNworICBfX20xMjhpIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDU7CisgIFZQOFBsYW5hclRvMjRiSGVscGVyKCppbiwgdG1wKTsKKyAgVlA4UGxhbmFyVG8yNGJIZWxwZXIodG1wLCAqaW4pOworICBWUDhQbGFuYXJUbzI0YkhlbHBlcigqaW4sIHRtcCk7CisgIC8vIFdlIG5lZWQgdG8gZG8gaXQgdHdvIG1vcmUgdGltZXMgdGhhbiB0aGUgZXhhbXBsZSBhcyB3ZSBoYXZlIHNpeHRlZW4gYnl0ZXMuCisgIHsKKyAgICBfX20xMjhpIG91dDAsIG91dDEsIG91dDIsIG91dDMsIG91dDQsIG91dDU7CisgICAgVlA4UGxhbmFyVG8yNGJIZWxwZXIodG1wLCBvdXQpOworICAgIFZQOFBsYW5hclRvMjRiSGVscGVyKG91dCwgKmluKTsKKyAgfQorfQorCisjdW5kZWYgVlA4UGxhbmFyVG8yNGJIZWxwZXIKKworLy8gQ29udmVydCBmb3VyIHBhY2tlZCBmb3VyLWNoYW5uZWwgYnVmZmVycyBsaWtlIGFyZ2JhcmdiYXJnYmFyZ2IuLi4gaW50byB0aGUKKy8vIHNwbGl0IGNoYW5uZWxzIGFhYWFhIC4uLiBycnJyIC4uLiBnZ2dnIC4uLi4gYmJiYmIgLi4uLi4uCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWUDhMMzJiVG9QbGFuYXJfU1NFMihfX20xMjhpKiBjb25zdCBpbjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBpbjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBpbjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBpbjMpIHsKKyAgLy8gQ29sdW1uLXdpc2UgdHJhbnNwb3NlLgorICBjb25zdCBfX20xMjhpIEEwID0gX21tX3VucGFja2xvX2VwaTgoKmluMCwgKmluMSk7CisgIGNvbnN0IF9fbTEyOGkgQTEgPSBfbW1fdW5wYWNraGlfZXBpOCgqaW4wLCAqaW4xKTsKKyAgY29uc3QgX19tMTI4aSBBMiA9IF9tbV91bnBhY2tsb19lcGk4KCppbjIsICppbjMpOworICBjb25zdCBfX20xMjhpIEEzID0gX21tX3VucGFja2hpX2VwaTgoKmluMiwgKmluMyk7CisgIGNvbnN0IF9fbTEyOGkgQjAgPSBfbW1fdW5wYWNrbG9fZXBpOChBMCwgQTEpOworICBjb25zdCBfX20xMjhpIEIxID0gX21tX3VucGFja2hpX2VwaTgoQTAsIEExKTsKKyAgY29uc3QgX19tMTI4aSBCMiA9IF9tbV91bnBhY2tsb19lcGk4KEEyLCBBMyk7CisgIGNvbnN0IF9fbTEyOGkgQjMgPSBfbW1fdW5wYWNraGlfZXBpOChBMiwgQTMpOworICAvLyBDMCA9IGc3IGc2IC4uLiBnMSBnMCB8IGI3IGI2IC4uLiBiMSBiMAorICAvLyBDMSA9IGE3IGE2IC4uLiBhMSBhMCB8IHI3IHI2IC4uLiByMSByMAorICBjb25zdCBfX20xMjhpIEMwID0gX21tX3VucGFja2xvX2VwaTgoQjAsIEIxKTsKKyAgY29uc3QgX19tMTI4aSBDMSA9IF9tbV91bnBhY2toaV9lcGk4KEIwLCBCMSk7CisgIGNvbnN0IF9fbTEyOGkgQzIgPSBfbW1fdW5wYWNrbG9fZXBpOChCMiwgQjMpOworICBjb25zdCBfX20xMjhpIEMzID0gX21tX3VucGFja2hpX2VwaTgoQjIsIEIzKTsKKyAgLy8gR2F0aGVyIHRoZSBjaGFubmVscy4KKyAgKmluMCA9IF9tbV91bnBhY2toaV9lcGk2NChDMSwgQzMpOworICAqaW4xID0gX21tX3VucGFja2xvX2VwaTY0KEMxLCBDMyk7CisgICppbjIgPSBfbW1fdW5wYWNraGlfZXBpNjQoQzAsIEMyKTsKKyAgKmluMyA9IF9tbV91bnBhY2tsb19lcGk2NChDMCwgQzIpOworfQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX1NTRTIKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvLyBXRUJQX0RTUF9DT01NT05fU1NFMl9IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9jb21tb25fc3NlNDEuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvY29tbW9uX3NzZTQxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYxNzNjMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvY29tbW9uX3NzZTQxLmgKQEAgLTAsMCArMSwxMzIgQEAKKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBTU0U0IGNvZGUgY29tbW9uIHRvIHNldmVyYWwgZmlsZXMuCisvLworLy8gQXV0aG9yOiBWaW5jZW50IFJhYmF1ZCAodnJhYmF1ZEBnb29nbGUuY29tKQorCisjaWZuZGVmIFdFQlBfRFNQX0NPTU1PTl9TU0U0MV9IXworI2RlZmluZSBXRUJQX0RTUF9DT01NT05fU1NFNDFfSF8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0U0MSkKKyNpbmNsdWRlIDxzbW1pbnRyaW4uaD4KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENoYW5uZWwgbWl4aW5nLgorLy8gU2h1ZmZsZXMgdGhlIGlucHV0IGJ1ZmZlciBhcyBBMCAwIDAgQTEgMCAwIEEyIC4uLgorI2RlZmluZSBXRUJQX1NTRTQxX1NIVUZGKE9VVCwgSU4wLCBJTjEpICAgIFwKKyAgT1VUIyMwID0gX21tX3NodWZmbGVfZXBpOCgqSU4wLCBzaHVmZjApOyBcCisgIE9VVCMjMSA9IF9tbV9zaHVmZmxlX2VwaTgoKklOMCwgc2h1ZmYxKTsgXAorICBPVVQjIzIgPSBfbW1fc2h1ZmZsZV9lcGk4KCpJTjAsIHNodWZmMik7IFwKKyAgT1VUIyMzID0gX21tX3NodWZmbGVfZXBpOCgqSU4xLCBzaHVmZjApOyBcCisgIE9VVCMjNCA9IF9tbV9zaHVmZmxlX2VwaTgoKklOMSwgc2h1ZmYxKTsgXAorICBPVVQjIzUgPSBfbW1fc2h1ZmZsZV9lcGk4KCpJTjEsIHNodWZmMik7CisKKy8vIFBhY2sgdGhlIHBsYW5hciBidWZmZXJzCisvLyBycnJyLi4uIHJycnIuLi4gZ2dnZy4uLiBnZ2dnLi4uIGJiYmIuLi4gYmJiYi4uLi4KKy8vIHRyaXBsZXQgYnkgdHJpcGxldCBpbiB0aGUgb3V0cHV0IGJ1ZmZlciByZ2IgYXMgcmdicmdicmdicmdiIC4uLgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVlA4UGxhbmFyVG8yNGJfU1NFNDEoCisgICAgX19tMTI4aSogY29uc3QgaW4wLCBfX20xMjhpKiBjb25zdCBpbjEsIF9fbTEyOGkqIGNvbnN0IGluMiwKKyAgICBfX20xMjhpKiBjb25zdCBpbjMsIF9fbTEyOGkqIGNvbnN0IGluNCwgX19tMTI4aSogY29uc3QgaW41KSB7CisgIF9fbTEyOGkgUjAsIFIxLCBSMiwgUjMsIFI0LCBSNTsKKyAgX19tMTI4aSBHMCwgRzEsIEcyLCBHMywgRzQsIEc1OworICBfX20xMjhpIEIwLCBCMSwgQjIsIEIzLCBCNCwgQjU7CisKKyAgLy8gUHJvY2VzcyBSLgorICB7CisgICAgY29uc3QgX19tMTI4aSBzaHVmZjAgPSBfbW1fc2V0X2VwaTgoCisgICAgICAgIDUsIC0xLCAtMSwgNCwgLTEsIC0xLCAzLCAtMSwgLTEsIDIsIC0xLCAtMSwgMSwgLTEsIC0xLCAwKTsKKyAgICBjb25zdCBfX20xMjhpIHNodWZmMSA9IF9tbV9zZXRfZXBpOCgKKyAgICAgICAgLTEsIDEwLCAtMSwgLTEsIDksIC0xLCAtMSwgOCwgLTEsIC0xLCA3LCAtMSwgLTEsIDYsIC0xLCAtMSk7CisgICAgY29uc3QgX19tMTI4aSBzaHVmZjIgPSBfbW1fc2V0X2VwaTgoCisgICAgIC0xLCAtMSwgMTUsIC0xLCAtMSwgMTQsIC0xLCAtMSwgMTMsIC0xLCAtMSwgMTIsIC0xLCAtMSwgMTEsIC0xKTsKKyAgICBXRUJQX1NTRTQxX1NIVUZGKFIsIGluMCwgaW4xKQorICB9CisKKyAgLy8gUHJvY2VzcyBHLgorICB7CisgICAgLy8gU2FtZSBhcyBiZWZvcmUsIGp1c3Qgc2hpZnRlZCB0byB0aGUgbGVmdCBieSBvbmUgYW5kIGluY2x1ZGluZyB0aGUgcmlnaHQKKyAgICAvLyBwYWRkaW5nLgorICAgIGNvbnN0IF9fbTEyOGkgc2h1ZmYwID0gX21tX3NldF9lcGk4KAorICAgICAgICAtMSwgLTEsIDQsIC0xLCAtMSwgMywgLTEsIC0xLCAyLCAtMSwgLTEsIDEsIC0xLCAtMSwgMCwgLTEpOworICAgIGNvbnN0IF9fbTEyOGkgc2h1ZmYxID0gX21tX3NldF9lcGk4KAorICAgICAgICAxMCwgLTEsIC0xLCA5LCAtMSwgLTEsIDgsIC0xLCAtMSwgNywgLTEsIC0xLCA2LCAtMSwgLTEsIDUpOworICAgIGNvbnN0IF9fbTEyOGkgc2h1ZmYyID0gX21tX3NldF9lcGk4KAorICAgICAtMSwgMTUsIC0xLCAtMSwgMTQsIC0xLCAtMSwgMTMsIC0xLCAtMSwgMTIsIC0xLCAtMSwgMTEsIC0xLCAtMSk7CisgICAgV0VCUF9TU0U0MV9TSFVGRihHLCBpbjIsIGluMykKKyAgfQorCisgIC8vIFByb2Nlc3MgQi4KKyAgeworICAgIGNvbnN0IF9fbTEyOGkgc2h1ZmYwID0gX21tX3NldF9lcGk4KAorICAgICAgICAtMSwgNCwgLTEsIC0xLCAzLCAtMSwgLTEsIDIsIC0xLCAtMSwgMSwgLTEsIC0xLCAwLCAtMSwgLTEpOworICAgIGNvbnN0IF9fbTEyOGkgc2h1ZmYxID0gX21tX3NldF9lcGk4KAorICAgICAgICAtMSwgLTEsIDksIC0xLCAtMSwgOCwgLTEsIC0xLCA3LCAtMSwgLTEsIDYsIC0xLCAtMSwgNSwgLTEpOworICAgIGNvbnN0IF9fbTEyOGkgc2h1ZmYyID0gX21tX3NldF9lcGk4KAorICAgICAgMTUsIC0xLCAtMSwgMTQsIC0xLCAtMSwgMTMsIC0xLCAtMSwgMTIsIC0xLCAtMSwgMTEsIC0xLCAtMSwgMTApOworICAgIFdFQlBfU1NFNDFfU0hVRkYoQiwgaW40LCBpbjUpCisgIH0KKworICAvLyBPUiB0aGUgZGlmZmVyZW50IGNoYW5uZWxzLgorICB7CisgICAgY29uc3QgX19tMTI4aSBSRzAgPSBfbW1fb3Jfc2kxMjgoUjAsIEcwKTsKKyAgICBjb25zdCBfX20xMjhpIFJHMSA9IF9tbV9vcl9zaTEyOChSMSwgRzEpOworICAgIGNvbnN0IF9fbTEyOGkgUkcyID0gX21tX29yX3NpMTI4KFIyLCBHMik7CisgICAgY29uc3QgX19tMTI4aSBSRzMgPSBfbW1fb3Jfc2kxMjgoUjMsIEczKTsKKyAgICBjb25zdCBfX20xMjhpIFJHNCA9IF9tbV9vcl9zaTEyOChSNCwgRzQpOworICAgIGNvbnN0IF9fbTEyOGkgUkc1ID0gX21tX29yX3NpMTI4KFI1LCBHNSk7CisgICAgKmluMCA9IF9tbV9vcl9zaTEyOChSRzAsIEIwKTsKKyAgICAqaW4xID0gX21tX29yX3NpMTI4KFJHMSwgQjEpOworICAgICppbjIgPSBfbW1fb3Jfc2kxMjgoUkcyLCBCMik7CisgICAgKmluMyA9IF9tbV9vcl9zaTEyOChSRzMsIEIzKTsKKyAgICAqaW40ID0gX21tX29yX3NpMTI4KFJHNCwgQjQpOworICAgICppbjUgPSBfbW1fb3Jfc2kxMjgoUkc1LCBCNSk7CisgIH0KK30KKworI3VuZGVmIFdFQlBfU1NFNDFfU0hVRkYKKworLy8gQ29udmVydCBmb3VyIHBhY2tlZCBmb3VyLWNoYW5uZWwgYnVmZmVycyBsaWtlIGFyZ2JhcmdiYXJnYmFyZ2IuLi4gaW50byB0aGUKKy8vIHNwbGl0IGNoYW5uZWxzIGFhYWFhIC4uLiBycnJyIC4uLiBnZ2dnIC4uLi4gYmJiYmIgLi4uLi4uCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWUDhMMzJiVG9QbGFuYXJfU1NFNDEoX19tMTI4aSogY29uc3QgaW4wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IGluMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBpbjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgaW4zKSB7CisgIC8vIGFhYWFycnJyZ2dnZ2JiYmIKKyAgY29uc3QgX19tMTI4aSBzaHVmZjAgPQorICAgICAgX21tX3NldF9lcGk4KDE1LCAxMSwgNywgMywgMTQsIDEwLCA2LCAyLCAxMywgOSwgNSwgMSwgMTIsIDgsIDQsIDApOworICBjb25zdCBfX20xMjhpIEEwID0gX21tX3NodWZmbGVfZXBpOCgqaW4wLCBzaHVmZjApOworICBjb25zdCBfX20xMjhpIEExID0gX21tX3NodWZmbGVfZXBpOCgqaW4xLCBzaHVmZjApOworICBjb25zdCBfX20xMjhpIEEyID0gX21tX3NodWZmbGVfZXBpOCgqaW4yLCBzaHVmZjApOworICBjb25zdCBfX20xMjhpIEEzID0gX21tX3NodWZmbGVfZXBpOCgqaW4zLCBzaHVmZjApOworICAvLyBBMEExUjBSMQorICAvLyBHMEcxQjBCMQorICAvLyBBMkEzUjJSMworICAvLyBHMEcxQjBCMQorICBjb25zdCBfX20xMjhpIEIwID0gX21tX3VucGFja2xvX2VwaTMyKEEwLCBBMSk7CisgIGNvbnN0IF9fbTEyOGkgQjEgPSBfbW1fdW5wYWNraGlfZXBpMzIoQTAsIEExKTsKKyAgY29uc3QgX19tMTI4aSBCMiA9IF9tbV91bnBhY2tsb19lcGkzMihBMiwgQTMpOworICBjb25zdCBfX20xMjhpIEIzID0gX21tX3VucGFja2hpX2VwaTMyKEEyLCBBMyk7CisgICppbjMgPSBfbW1fdW5wYWNrbG9fZXBpNjQoQjAsIEIyKTsKKyAgKmluMiA9IF9tbV91bnBhY2toaV9lcGk2NChCMCwgQjIpOworICAqaW4xID0gX21tX3VucGFja2xvX2VwaTY0KEIxLCBCMyk7CisgICppbjAgPSBfbW1fdW5wYWNraGlfZXBpNjQoQjEsIEIzKTsKK30KKworI2VuZGlmICAvLyBXRUJQX1VTRV9TU0U0MQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30gIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8vIFdFQlBfRFNQX0NPTU1PTl9TU0U0MV9IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9jb3N0LmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2Nvc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGZiM2RiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9jb3N0LmMKQEAgLTAsMCArMSw0MTAgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vYXNzZXJ0X3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdGRsaWJfcG9lbS5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorI2luY2x1ZGUgInNyYy9lbmMvY29zdF9lbmMuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEJvb2xlYW4tY29zdCBjb3N0IHRhYmxlCisKK2NvbnN0IHVpbnQxNl90IFZQOEVudHJvcHlDb3N0WzI1Nl0gPSB7CisgIDE3OTIsIDE3OTIsIDE3OTIsIDE1MzYsIDE1MzYsIDE0MDgsIDEzNjYsIDEyODAsIDEyODAsIDEyMTYsCisgIDExNzgsIDExNTIsIDExMTAsIDEwNzYsIDEwNjEsIDEwMjQsIDEwMjQsICA5OTIsICA5NjgsICA5NTEsCisgICA5MzksICA5MTEsICA4OTYsICA4NzgsICA4NzEsICA4NTQsICA4MzgsICA4MjAsICA4MTEsICA3OTQsCisgICA3ODYsICA3NjgsICA3NjgsICA3NTIsICA3NDAsICA3MzIsICA3MjAsICA3MDksICA3MDQsICA2OTAsCisgICA2ODMsICA2NzIsICA2NjYsICA2NTUsICA2NDcsICA2NDAsICA2MzEsICA2MjIsICA2MTUsICA2MDcsCisgICA1OTgsICA1OTIsICA1ODYsICA1NzYsICA1NzIsICA1NjQsICA1NTksICA1NTUsICA1NDcsICA1NDEsCisgICA1MzQsICA1MjgsICA1MjIsICA1MTIsICA1MTIsICA1MDQsICA1MDAsICA0OTQsICA0ODgsICA0ODMsCisgICA0NzcsICA0NzMsICA0NjcsICA0NjEsICA0NTgsICA0NTIsICA0NDgsICA0NDMsICA0MzgsICA0MzQsCisgICA0MjcsICA0MjQsICA0MTksICA0MTUsICA0MTAsICA0MDYsICA0MDMsICAzOTksICAzOTQsICAzOTAsCisgICAzODQsICAzODQsICAzNzcsICAzNzQsICAzNzAsICAzNjYsICAzNjIsICAzNTksICAzNTUsICAzNTEsCisgICAzNDcsICAzNDIsICAzNDIsICAzMzYsICAzMzMsICAzMzAsICAzMjYsICAzMjMsICAzMjAsICAzMTYsCisgICAzMTIsICAzMDgsICAzMDUsICAzMDIsICAyOTksICAyOTYsICAyOTMsICAyODgsICAyODcsICAyODMsCisgICAyODAsICAyNzcsICAyNzQsICAyNzIsICAyNjgsICAyNjYsICAyNjIsICAyNTYsICAyNTYsICAyNTYsCisgICAyNTEsICAyNDgsICAyNDUsICAyNDIsICAyNDAsICAyMzcsICAyMzQsICAyMzIsICAyMjgsICAyMjYsCisgICAyMjMsICAyMjEsICAyMTgsICAyMTYsICAyMTQsICAyMTEsICAyMDgsICAyMDUsICAyMDMsICAyMDEsCisgICAxOTgsICAxOTYsICAxOTIsICAxOTEsICAxODgsICAxODcsICAxODMsICAxODEsICAxNzksICAxNzYsCisgICAxNzUsICAxNzEsICAxNzEsICAxNjgsICAxNjUsICAxNjMsICAxNjAsICAxNTksICAxNTYsICAxNTQsCisgICAxNTIsICAxNTAsICAxNDgsICAxNDYsICAxNDQsICAxNDIsICAxMzksICAxMzgsICAxMzUsICAxMzMsCisgICAxMzEsICAxMjgsICAxMjgsICAxMjUsICAxMjMsICAxMjEsICAxMTksICAxMTcsICAxMTUsICAxMTMsCisgICAxMTEsICAxMTAsICAxMDcsICAxMDUsICAxMDMsICAxMDIsICAxMDAsICAgOTgsICAgOTYsICAgOTQsCisgICAgOTIsICAgOTEsICAgODksICAgODYsICAgODYsICAgODMsICAgODIsICAgODAsICAgNzcsICAgNzYsCisgICAgNzQsICAgNzMsICAgNzEsICAgNjksICAgNjcsICAgNjYsICAgNjQsICAgNjMsICAgNjEsICAgNTksCisgICAgNTcsICAgNTUsICAgNTQsICAgNTIsICAgNTEsICAgNDksICAgNDcsICAgNDYsICAgNDQsICAgNDMsCisgICAgNDEsICAgNDAsICAgMzgsICAgMzYsICAgMzUsICAgMzMsICAgMzIsICAgMzAsICAgMjksICAgMjcsCisgICAgMjUsICAgMjQsICAgMjIsICAgMjEsICAgMTksICAgMTgsICAgMTYsICAgMTUsICAgMTMsICAgMTIsCisgICAgMTAsICAgIDksICAgIDcsICAgIDYsICAgIDQsICAgIDMKK307CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBMZXZlbCBjb3N0IHRhYmxlcworCisvLyBmaXhlZCBjb3N0cyBmb3IgY29kaW5nIGxldmVscywgZGVkdWNlIGZyb20gdGhlIGNvZGluZyB0cmVlLgorLy8gVGhpcyBpcyBvbmx5IHRoZSBwYXJ0IHRoYXQgZG9lc24ndCBkZXBlbmQgb24gdGhlIHByb2JhYmlsaXR5IHN0YXRlLgorY29uc3QgdWludDE2X3QgVlA4TGV2ZWxGaXhlZENvc3RzW01BWF9MRVZFTCArIDFdID0geworICAgICAwLCAgMjU2LCAgMjU2LCAgMjU2LCAgMjU2LCAgNDMyLCAgNjE4LCAgNjMwLAorICAgNzMxLCAgNjQwLCAgNjQwLCAgODI4LCAgOTAxLCAgOTQ4LCAxMDIxLCAxMTAxLAorICAxMTc0LCAxMjIxLCAxMjk0LCAxMDQyLCAxMDg1LCAxMTE1LCAxMTU4LCAxMjAyLAorICAxMjQ1LCAxMjc1LCAxMzE4LCAxMzM3LCAxMzgwLCAxNDEwLCAxNDUzLCAxNDk3LAorICAxNTQwLCAxNTcwLCAxNjEzLCAxMjgwLCAxMjk1LCAxMzE3LCAxMzMyLCAxMzU4LAorICAxMzczLCAxMzk1LCAxNDEwLCAxNDU0LCAxNDY5LCAxNDkxLCAxNTA2LCAxNTMyLAorICAxNTQ3LCAxNTY5LCAxNTg0LCAxNjAxLCAxNjE2LCAxNjM4LCAxNjUzLCAxNjc5LAorICAxNjk0LCAxNzE2LCAxNzMxLCAxNzc1LCAxNzkwLCAxODEyLCAxODI3LCAxODUzLAorICAxODY4LCAxODkwLCAxOTA1LCAxNzI3LCAxNzMzLCAxNzQyLCAxNzQ4LCAxNzU5LAorICAxNzY1LCAxNzc0LCAxNzgwLCAxODAwLCAxODA2LCAxODE1LCAxODIxLCAxODMyLAorICAxODM4LCAxODQ3LCAxODUzLCAxODc4LCAxODg0LCAxODkzLCAxODk5LCAxOTEwLAorICAxOTE2LCAxOTI1LCAxOTMxLCAxOTUxLCAxOTU3LCAxOTY2LCAxOTcyLCAxOTgzLAorICAxOTg5LCAxOTk4LCAyMDA0LCAyMDI3LCAyMDMzLCAyMDQyLCAyMDQ4LCAyMDU5LAorICAyMDY1LCAyMDc0LCAyMDgwLCAyMTAwLCAyMTA2LCAyMTE1LCAyMTIxLCAyMTMyLAorICAyMTM4LCAyMTQ3LCAyMTUzLCAyMTc4LCAyMTg0LCAyMTkzLCAyMTk5LCAyMjEwLAorICAyMjE2LCAyMjI1LCAyMjMxLCAyMjUxLCAyMjU3LCAyMjY2LCAyMjcyLCAyMjgzLAorICAyMjg5LCAyMjk4LCAyMzA0LCAyMTY4LCAyMTc0LCAyMTgzLCAyMTg5LCAyMjAwLAorICAyMjA2LCAyMjE1LCAyMjIxLCAyMjQxLCAyMjQ3LCAyMjU2LCAyMjYyLCAyMjczLAorICAyMjc5LCAyMjg4LCAyMjk0LCAyMzE5LCAyMzI1LCAyMzM0LCAyMzQwLCAyMzUxLAorICAyMzU3LCAyMzY2LCAyMzcyLCAyMzkyLCAyMzk4LCAyNDA3LCAyNDEzLCAyNDI0LAorICAyNDMwLCAyNDM5LCAyNDQ1LCAyNDY4LCAyNDc0LCAyNDgzLCAyNDg5LCAyNTAwLAorICAyNTA2LCAyNTE1LCAyNTIxLCAyNTQxLCAyNTQ3LCAyNTU2LCAyNTYyLCAyNTczLAorICAyNTc5LCAyNTg4LCAyNTk0LCAyNjE5LCAyNjI1LCAyNjM0LCAyNjQwLCAyNjUxLAorICAyNjU3LCAyNjY2LCAyNjcyLCAyNjkyLCAyNjk4LCAyNzA3LCAyNzEzLCAyNzI0LAorICAyNzMwLCAyNzM5LCAyNzQ1LCAyNTQwLCAyNTQ2LCAyNTU1LCAyNTYxLCAyNTcyLAorICAyNTc4LCAyNTg3LCAyNTkzLCAyNjEzLCAyNjE5LCAyNjI4LCAyNjM0LCAyNjQ1LAorICAyNjUxLCAyNjYwLCAyNjY2LCAyNjkxLCAyNjk3LCAyNzA2LCAyNzEyLCAyNzIzLAorICAyNzI5LCAyNzM4LCAyNzQ0LCAyNzY0LCAyNzcwLCAyNzc5LCAyNzg1LCAyNzk2LAorICAyODAyLCAyODExLCAyODE3LCAyODQwLCAyODQ2LCAyODU1LCAyODYxLCAyODcyLAorICAyODc4LCAyODg3LCAyODkzLCAyOTEzLCAyOTE5LCAyOTI4LCAyOTM0LCAyOTQ1LAorICAyOTUxLCAyOTYwLCAyOTY2LCAyOTkxLCAyOTk3LCAzMDA2LCAzMDEyLCAzMDIzLAorICAzMDI5LCAzMDM4LCAzMDQ0LCAzMDY0LCAzMDcwLCAzMDc5LCAzMDg1LCAzMDk2LAorICAzMTAyLCAzMTExLCAzMTE3LCAyOTgxLCAyOTg3LCAyOTk2LCAzMDAyLCAzMDEzLAorICAzMDE5LCAzMDI4LCAzMDM0LCAzMDU0LCAzMDYwLCAzMDY5LCAzMDc1LCAzMDg2LAorICAzMDkyLCAzMTAxLCAzMTA3LCAzMTMyLCAzMTM4LCAzMTQ3LCAzMTUzLCAzMTY0LAorICAzMTcwLCAzMTc5LCAzMTg1LCAzMjA1LCAzMjExLCAzMjIwLCAzMjI2LCAzMjM3LAorICAzMjQzLCAzMjUyLCAzMjU4LCAzMjgxLCAzMjg3LCAzMjk2LCAzMzAyLCAzMzEzLAorICAzMzE5LCAzMzI4LCAzMzM0LCAzMzU0LCAzMzYwLCAzMzY5LCAzMzc1LCAzMzg2LAorICAzMzkyLCAzNDAxLCAzNDA3LCAzNDMyLCAzNDM4LCAzNDQ3LCAzNDUzLCAzNDY0LAorICAzNDcwLCAzNDc5LCAzNDg1LCAzNTA1LCAzNTExLCAzNTIwLCAzNTI2LCAzNTM3LAorICAzNTQzLCAzNTUyLCAzNTU4LCAyODE2LCAyODIyLCAyODMxLCAyODM3LCAyODQ4LAorICAyODU0LCAyODYzLCAyODY5LCAyODg5LCAyODk1LCAyOTA0LCAyOTEwLCAyOTIxLAorICAyOTI3LCAyOTM2LCAyOTQyLCAyOTY3LCAyOTczLCAyOTgyLCAyOTg4LCAyOTk5LAorICAzMDA1LCAzMDE0LCAzMDIwLCAzMDQwLCAzMDQ2LCAzMDU1LCAzMDYxLCAzMDcyLAorICAzMDc4LCAzMDg3LCAzMDkzLCAzMTE2LCAzMTIyLCAzMTMxLCAzMTM3LCAzMTQ4LAorICAzMTU0LCAzMTYzLCAzMTY5LCAzMTg5LCAzMTk1LCAzMjA0LCAzMjEwLCAzMjIxLAorICAzMjI3LCAzMjM2LCAzMjQyLCAzMjY3LCAzMjczLCAzMjgyLCAzMjg4LCAzMjk5LAorICAzMzA1LCAzMzE0LCAzMzIwLCAzMzQwLCAzMzQ2LCAzMzU1LCAzMzYxLCAzMzcyLAorICAzMzc4LCAzMzg3LCAzMzkzLCAzMjU3LCAzMjYzLCAzMjcyLCAzMjc4LCAzMjg5LAorICAzMjk1LCAzMzA0LCAzMzEwLCAzMzMwLCAzMzM2LCAzMzQ1LCAzMzUxLCAzMzYyLAorICAzMzY4LCAzMzc3LCAzMzgzLCAzNDA4LCAzNDE0LCAzNDIzLCAzNDI5LCAzNDQwLAorICAzNDQ2LCAzNDU1LCAzNDYxLCAzNDgxLCAzNDg3LCAzNDk2LCAzNTAyLCAzNTEzLAorICAzNTE5LCAzNTI4LCAzNTM0LCAzNTU3LCAzNTYzLCAzNTcyLCAzNTc4LCAzNTg5LAorICAzNTk1LCAzNjA0LCAzNjEwLCAzNjMwLCAzNjM2LCAzNjQ1LCAzNjUxLCAzNjYyLAorICAzNjY4LCAzNjc3LCAzNjgzLCAzNzA4LCAzNzE0LCAzNzIzLCAzNzI5LCAzNzQwLAorICAzNzQ2LCAzNzU1LCAzNzYxLCAzNzgxLCAzNzg3LCAzNzk2LCAzODAyLCAzODEzLAorICAzODE5LCAzODI4LCAzODM0LCAzNjI5LCAzNjM1LCAzNjQ0LCAzNjUwLCAzNjYxLAorICAzNjY3LCAzNjc2LCAzNjgyLCAzNzAyLCAzNzA4LCAzNzE3LCAzNzIzLCAzNzM0LAorICAzNzQwLCAzNzQ5LCAzNzU1LCAzNzgwLCAzNzg2LCAzNzk1LCAzODAxLCAzODEyLAorICAzODE4LCAzODI3LCAzODMzLCAzODUzLCAzODU5LCAzODY4LCAzODc0LCAzODg1LAorICAzODkxLCAzOTAwLCAzOTA2LCAzOTI5LCAzOTM1LCAzOTQ0LCAzOTUwLCAzOTYxLAorICAzOTY3LCAzOTc2LCAzOTgyLCA0MDAyLCA0MDA4LCA0MDE3LCA0MDIzLCA0MDM0LAorICA0MDQwLCA0MDQ5LCA0MDU1LCA0MDgwLCA0MDg2LCA0MDk1LCA0MTAxLCA0MTEyLAorICA0MTE4LCA0MTI3LCA0MTMzLCA0MTUzLCA0MTU5LCA0MTY4LCA0MTc0LCA0MTg1LAorICA0MTkxLCA0MjAwLCA0MjA2LCA0MDcwLCA0MDc2LCA0MDg1LCA0MDkxLCA0MTAyLAorICA0MTA4LCA0MTE3LCA0MTIzLCA0MTQzLCA0MTQ5LCA0MTU4LCA0MTY0LCA0MTc1LAorICA0MTgxLCA0MTkwLCA0MTk2LCA0MjIxLCA0MjI3LCA0MjM2LCA0MjQyLCA0MjUzLAorICA0MjU5LCA0MjY4LCA0Mjc0LCA0Mjk0LCA0MzAwLCA0MzA5LCA0MzE1LCA0MzI2LAorICA0MzMyLCA0MzQxLCA0MzQ3LCA0MzcwLCA0Mzc2LCA0Mzg1LCA0MzkxLCA0NDAyLAorICA0NDA4LCA0NDE3LCA0NDIzLCA0NDQzLCA0NDQ5LCA0NDU4LCA0NDY0LCA0NDc1LAorICA0NDgxLCA0NDkwLCA0NDk2LCA0NTIxLCA0NTI3LCA0NTM2LCA0NTQyLCA0NTUzLAorICA0NTU5LCA0NTY4LCA0NTc0LCA0NTk0LCA0NjAwLCA0NjA5LCA0NjE1LCA0NjI2LAorICA0NjMyLCA0NjQxLCA0NjQ3LCAzNTE1LCAzNTIxLCAzNTMwLCAzNTM2LCAzNTQ3LAorICAzNTUzLCAzNTYyLCAzNTY4LCAzNTg4LCAzNTk0LCAzNjAzLCAzNjA5LCAzNjIwLAorICAzNjI2LCAzNjM1LCAzNjQxLCAzNjY2LCAzNjcyLCAzNjgxLCAzNjg3LCAzNjk4LAorICAzNzA0LCAzNzEzLCAzNzE5LCAzNzM5LCAzNzQ1LCAzNzU0LCAzNzYwLCAzNzcxLAorICAzNzc3LCAzNzg2LCAzNzkyLCAzODE1LCAzODIxLCAzODMwLCAzODM2LCAzODQ3LAorICAzODUzLCAzODYyLCAzODY4LCAzODg4LCAzODk0LCAzOTAzLCAzOTA5LCAzOTIwLAorICAzOTI2LCAzOTM1LCAzOTQxLCAzOTY2LCAzOTcyLCAzOTgxLCAzOTg3LCAzOTk4LAorICA0MDA0LCA0MDEzLCA0MDE5LCA0MDM5LCA0MDQ1LCA0MDU0LCA0MDYwLCA0MDcxLAorICA0MDc3LCA0MDg2LCA0MDkyLCAzOTU2LCAzOTYyLCAzOTcxLCAzOTc3LCAzOTg4LAorICAzOTk0LCA0MDAzLCA0MDA5LCA0MDI5LCA0MDM1LCA0MDQ0LCA0MDUwLCA0MDYxLAorICA0MDY3LCA0MDc2LCA0MDgyLCA0MTA3LCA0MTEzLCA0MTIyLCA0MTI4LCA0MTM5LAorICA0MTQ1LCA0MTU0LCA0MTYwLCA0MTgwLCA0MTg2LCA0MTk1LCA0MjAxLCA0MjEyLAorICA0MjE4LCA0MjI3LCA0MjMzLCA0MjU2LCA0MjYyLCA0MjcxLCA0Mjc3LCA0Mjg4LAorICA0Mjk0LCA0MzAzLCA0MzA5LCA0MzI5LCA0MzM1LCA0MzQ0LCA0MzUwLCA0MzYxLAorICA0MzY3LCA0Mzc2LCA0MzgyLCA0NDA3LCA0NDEzLCA0NDIyLCA0NDI4LCA0NDM5LAorICA0NDQ1LCA0NDU0LCA0NDYwLCA0NDgwLCA0NDg2LCA0NDk1LCA0NTAxLCA0NTEyLAorICA0NTE4LCA0NTI3LCA0NTMzLCA0MzI4LCA0MzM0LCA0MzQzLCA0MzQ5LCA0MzYwLAorICA0MzY2LCA0Mzc1LCA0MzgxLCA0NDAxLCA0NDA3LCA0NDE2LCA0NDIyLCA0NDMzLAorICA0NDM5LCA0NDQ4LCA0NDU0LCA0NDc5LCA0NDg1LCA0NDk0LCA0NTAwLCA0NTExLAorICA0NTE3LCA0NTI2LCA0NTMyLCA0NTUyLCA0NTU4LCA0NTY3LCA0NTczLCA0NTg0LAorICA0NTkwLCA0NTk5LCA0NjA1LCA0NjI4LCA0NjM0LCA0NjQzLCA0NjQ5LCA0NjYwLAorICA0NjY2LCA0Njc1LCA0NjgxLCA0NzAxLCA0NzA3LCA0NzE2LCA0NzIyLCA0NzMzLAorICA0NzM5LCA0NzQ4LCA0NzU0LCA0Nzc5LCA0Nzg1LCA0Nzk0LCA0ODAwLCA0ODExLAorICA0ODE3LCA0ODI2LCA0ODMyLCA0ODUyLCA0ODU4LCA0ODY3LCA0ODczLCA0ODg0LAorICA0ODkwLCA0ODk5LCA0OTA1LCA0NzY5LCA0Nzc1LCA0Nzg0LCA0NzkwLCA0ODAxLAorICA0ODA3LCA0ODE2LCA0ODIyLCA0ODQyLCA0ODQ4LCA0ODU3LCA0ODYzLCA0ODc0LAorICA0ODgwLCA0ODg5LCA0ODk1LCA0OTIwLCA0OTI2LCA0OTM1LCA0OTQxLCA0OTUyLAorICA0OTU4LCA0OTY3LCA0OTczLCA0OTkzLCA0OTk5LCA1MDA4LCA1MDE0LCA1MDI1LAorICA1MDMxLCA1MDQwLCA1MDQ2LCA1MDY5LCA1MDc1LCA1MDg0LCA1MDkwLCA1MTAxLAorICA1MTA3LCA1MTE2LCA1MTIyLCA1MTQyLCA1MTQ4LCA1MTU3LCA1MTYzLCA1MTc0LAorICA1MTgwLCA1MTg5LCA1MTk1LCA1MjIwLCA1MjI2LCA1MjM1LCA1MjQxLCA1MjUyLAorICA1MjU4LCA1MjY3LCA1MjczLCA1MjkzLCA1Mjk5LCA1MzA4LCA1MzE0LCA1MzI1LAorICA1MzMxLCA1MzQwLCA1MzQ2LCA0NjA0LCA0NjEwLCA0NjE5LCA0NjI1LCA0NjM2LAorICA0NjQyLCA0NjUxLCA0NjU3LCA0Njc3LCA0NjgzLCA0NjkyLCA0Njk4LCA0NzA5LAorICA0NzE1LCA0NzI0LCA0NzMwLCA0NzU1LCA0NzYxLCA0NzcwLCA0Nzc2LCA0Nzg3LAorICA0NzkzLCA0ODAyLCA0ODA4LCA0ODI4LCA0ODM0LCA0ODQzLCA0ODQ5LCA0ODYwLAorICA0ODY2LCA0ODc1LCA0ODgxLCA0OTA0LCA0OTEwLCA0OTE5LCA0OTI1LCA0OTM2LAorICA0OTQyLCA0OTUxLCA0OTU3LCA0OTc3LCA0OTgzLCA0OTkyLCA0OTk4LCA1MDA5LAorICA1MDE1LCA1MDI0LCA1MDMwLCA1MDU1LCA1MDYxLCA1MDcwLCA1MDc2LCA1MDg3LAorICA1MDkzLCA1MTAyLCA1MTA4LCA1MTI4LCA1MTM0LCA1MTQzLCA1MTQ5LCA1MTYwLAorICA1MTY2LCA1MTc1LCA1MTgxLCA1MDQ1LCA1MDUxLCA1MDYwLCA1MDY2LCA1MDc3LAorICA1MDgzLCA1MDkyLCA1MDk4LCA1MTE4LCA1MTI0LCA1MTMzLCA1MTM5LCA1MTUwLAorICA1MTU2LCA1MTY1LCA1MTcxLCA1MTk2LCA1MjAyLCA1MjExLCA1MjE3LCA1MjI4LAorICA1MjM0LCA1MjQzLCA1MjQ5LCA1MjY5LCA1Mjc1LCA1Mjg0LCA1MjkwLCA1MzAxLAorICA1MzA3LCA1MzE2LCA1MzIyLCA1MzQ1LCA1MzUxLCA1MzYwLCA1MzY2LCA1Mzc3LAorICA1MzgzLCA1MzkyLCA1Mzk4LCA1NDE4LCA1NDI0LCA1NDMzLCA1NDM5LCA1NDUwLAorICA1NDU2LCA1NDY1LCA1NDcxLCA1NDk2LCA1NTAyLCA1NTExLCA1NTE3LCA1NTI4LAorICA1NTM0LCA1NTQzLCA1NTQ5LCA1NTY5LCA1NTc1LCA1NTg0LCA1NTkwLCA1NjAxLAorICA1NjA3LCA1NjE2LCA1NjIyLCA1NDE3LCA1NDIzLCA1NDMyLCA1NDM4LCA1NDQ5LAorICA1NDU1LCA1NDY0LCA1NDcwLCA1NDkwLCA1NDk2LCA1NTA1LCA1NTExLCA1NTIyLAorICA1NTI4LCA1NTM3LCA1NTQzLCA1NTY4LCA1NTc0LCA1NTgzLCA1NTg5LCA1NjAwLAorICA1NjA2LCA1NjE1LCA1NjIxLCA1NjQxLCA1NjQ3LCA1NjU2LCA1NjYyLCA1NjczLAorICA1Njc5LCA1Njg4LCA1Njk0LCA1NzE3LCA1NzIzLCA1NzMyLCA1NzM4LCA1NzQ5LAorICA1NzU1LCA1NzY0LCA1NzcwLCA1NzkwLCA1Nzk2LCA1ODA1LCA1ODExLCA1ODIyLAorICA1ODI4LCA1ODM3LCA1ODQzLCA1ODY4LCA1ODc0LCA1ODgzLCA1ODg5LCA1OTAwLAorICA1OTA2LCA1OTE1LCA1OTIxLCA1OTQxLCA1OTQ3LCA1OTU2LCA1OTYyLCA1OTczLAorICA1OTc5LCA1OTg4LCA1OTk0LCA1ODU4LCA1ODY0LCA1ODczLCA1ODc5LCA1ODkwLAorICA1ODk2LCA1OTA1LCA1OTExLCA1OTMxLCA1OTM3LCA1OTQ2LCA1OTUyLCA1OTYzLAorICA1OTY5LCA1OTc4LCA1OTg0LCA2MDA5LCA2MDE1LCA2MDI0LCA2MDMwLCA2MDQxLAorICA2MDQ3LCA2MDU2LCA2MDYyLCA2MDgyLCA2MDg4LCA2MDk3LCA2MTAzLCA2MTE0LAorICA2MTIwLCA2MTI5LCA2MTM1LCA2MTU4LCA2MTY0LCA2MTczLCA2MTc5LCA2MTkwLAorICA2MTk2LCA2MjA1LCA2MjExLCA2MjMxLCA2MjM3LCA2MjQ2LCA2MjUyLCA2MjYzLAorICA2MjY5LCA2Mjc4LCA2Mjg0LCA2MzA5LCA2MzE1LCA2MzI0LCA2MzMwLCA2MzQxLAorICA2MzQ3LCA2MzU2LCA2MzYyLCA2MzgyLCA2Mzg4LCA2Mzk3LCA2NDAzLCA2NDE0LAorICA2NDIwLCA2NDI5LCA2NDM1LCAzNTE1LCAzNTIxLCAzNTMwLCAzNTM2LCAzNTQ3LAorICAzNTUzLCAzNTYyLCAzNTY4LCAzNTg4LCAzNTk0LCAzNjAzLCAzNjA5LCAzNjIwLAorICAzNjI2LCAzNjM1LCAzNjQxLCAzNjY2LCAzNjcyLCAzNjgxLCAzNjg3LCAzNjk4LAorICAzNzA0LCAzNzEzLCAzNzE5LCAzNzM5LCAzNzQ1LCAzNzU0LCAzNzYwLCAzNzcxLAorICAzNzc3LCAzNzg2LCAzNzkyLCAzODE1LCAzODIxLCAzODMwLCAzODM2LCAzODQ3LAorICAzODUzLCAzODYyLCAzODY4LCAzODg4LCAzODk0LCAzOTAzLCAzOTA5LCAzOTIwLAorICAzOTI2LCAzOTM1LCAzOTQxLCAzOTY2LCAzOTcyLCAzOTgxLCAzOTg3LCAzOTk4LAorICA0MDA0LCA0MDEzLCA0MDE5LCA0MDM5LCA0MDQ1LCA0MDU0LCA0MDYwLCA0MDcxLAorICA0MDc3LCA0MDg2LCA0MDkyLCAzOTU2LCAzOTYyLCAzOTcxLCAzOTc3LCAzOTg4LAorICAzOTk0LCA0MDAzLCA0MDA5LCA0MDI5LCA0MDM1LCA0MDQ0LCA0MDUwLCA0MDYxLAorICA0MDY3LCA0MDc2LCA0MDgyLCA0MTA3LCA0MTEzLCA0MTIyLCA0MTI4LCA0MTM5LAorICA0MTQ1LCA0MTU0LCA0MTYwLCA0MTgwLCA0MTg2LCA0MTk1LCA0MjAxLCA0MjEyLAorICA0MjE4LCA0MjI3LCA0MjMzLCA0MjU2LCA0MjYyLCA0MjcxLCA0Mjc3LCA0Mjg4LAorICA0Mjk0LCA0MzAzLCA0MzA5LCA0MzI5LCA0MzM1LCA0MzQ0LCA0MzUwLCA0MzYxLAorICA0MzY3LCA0Mzc2LCA0MzgyLCA0NDA3LCA0NDEzLCA0NDIyLCA0NDI4LCA0NDM5LAorICA0NDQ1LCA0NDU0LCA0NDYwLCA0NDgwLCA0NDg2LCA0NDk1LCA0NTAxLCA0NTEyLAorICA0NTE4LCA0NTI3LCA0NTMzLCA0MzI4LCA0MzM0LCA0MzQzLCA0MzQ5LCA0MzYwLAorICA0MzY2LCA0Mzc1LCA0MzgxLCA0NDAxLCA0NDA3LCA0NDE2LCA0NDIyLCA0NDMzLAorICA0NDM5LCA0NDQ4LCA0NDU0LCA0NDc5LCA0NDg1LCA0NDk0LCA0NTAwLCA0NTExLAorICA0NTE3LCA0NTI2LCA0NTMyLCA0NTUyLCA0NTU4LCA0NTY3LCA0NTczLCA0NTg0LAorICA0NTkwLCA0NTk5LCA0NjA1LCA0NjI4LCA0NjM0LCA0NjQzLCA0NjQ5LCA0NjYwLAorICA0NjY2LCA0Njc1LCA0NjgxLCA0NzAxLCA0NzA3LCA0NzE2LCA0NzIyLCA0NzMzLAorICA0NzM5LCA0NzQ4LCA0NzU0LCA0Nzc5LCA0Nzg1LCA0Nzk0LCA0ODAwLCA0ODExLAorICA0ODE3LCA0ODI2LCA0ODMyLCA0ODUyLCA0ODU4LCA0ODY3LCA0ODczLCA0ODg0LAorICA0ODkwLCA0ODk5LCA0OTA1LCA0NzY5LCA0Nzc1LCA0Nzg0LCA0NzkwLCA0ODAxLAorICA0ODA3LCA0ODE2LCA0ODIyLCA0ODQyLCA0ODQ4LCA0ODU3LCA0ODYzLCA0ODc0LAorICA0ODgwLCA0ODg5LCA0ODk1LCA0OTIwLCA0OTI2LCA0OTM1LCA0OTQxLCA0OTUyLAorICA0OTU4LCA0OTY3LCA0OTczLCA0OTkzLCA0OTk5LCA1MDA4LCA1MDE0LCA1MDI1LAorICA1MDMxLCA1MDQwLCA1MDQ2LCA1MDY5LCA1MDc1LCA1MDg0LCA1MDkwLCA1MTAxLAorICA1MTA3LCA1MTE2LCA1MTIyLCA1MTQyLCA1MTQ4LCA1MTU3LCA1MTYzLCA1MTc0LAorICA1MTgwLCA1MTg5LCA1MTk1LCA1MjIwLCA1MjI2LCA1MjM1LCA1MjQxLCA1MjUyLAorICA1MjU4LCA1MjY3LCA1MjczLCA1MjkzLCA1Mjk5LCA1MzA4LCA1MzE0LCA1MzI1LAorICA1MzMxLCA1MzQwLCA1MzQ2LCA0NjA0LCA0NjEwLCA0NjE5LCA0NjI1LCA0NjM2LAorICA0NjQyLCA0NjUxLCA0NjU3LCA0Njc3LCA0NjgzLCA0NjkyLCA0Njk4LCA0NzA5LAorICA0NzE1LCA0NzI0LCA0NzMwLCA0NzU1LCA0NzYxLCA0NzcwLCA0Nzc2LCA0Nzg3LAorICA0NzkzLCA0ODAyLCA0ODA4LCA0ODI4LCA0ODM0LCA0ODQzLCA0ODQ5LCA0ODYwLAorICA0ODY2LCA0ODc1LCA0ODgxLCA0OTA0LCA0OTEwLCA0OTE5LCA0OTI1LCA0OTM2LAorICA0OTQyLCA0OTUxLCA0OTU3LCA0OTc3LCA0OTgzLCA0OTkyLCA0OTk4LCA1MDA5LAorICA1MDE1LCA1MDI0LCA1MDMwLCA1MDU1LCA1MDYxLCA1MDcwLCA1MDc2LCA1MDg3LAorICA1MDkzLCA1MTAyLCA1MTA4LCA1MTI4LCA1MTM0LCA1MTQzLCA1MTQ5LCA1MTYwLAorICA1MTY2LCA1MTc1LCA1MTgxLCA1MDQ1LCA1MDUxLCA1MDYwLCA1MDY2LCA1MDc3LAorICA1MDgzLCA1MDkyLCA1MDk4LCA1MTE4LCA1MTI0LCA1MTMzLCA1MTM5LCA1MTUwLAorICA1MTU2LCA1MTY1LCA1MTcxLCA1MTk2LCA1MjAyLCA1MjExLCA1MjE3LCA1MjI4LAorICA1MjM0LCA1MjQzLCA1MjQ5LCA1MjY5LCA1Mjc1LCA1Mjg0LCA1MjkwLCA1MzAxLAorICA1MzA3LCA1MzE2LCA1MzIyLCA1MzQ1LCA1MzUxLCA1MzYwLCA1MzY2LCA1Mzc3LAorICA1MzgzLCA1MzkyLCA1Mzk4LCA1NDE4LCA1NDI0LCA1NDMzLCA1NDM5LCA1NDUwLAorICA1NDU2LCA1NDY1LCA1NDcxLCA1NDk2LCA1NTAyLCA1NTExLCA1NTE3LCA1NTI4LAorICA1NTM0LCA1NTQzLCA1NTQ5LCA1NTY5LCA1NTc1LCA1NTg0LCA1NTkwLCA1NjAxLAorICA1NjA3LCA1NjE2LCA1NjIyLCA1NDE3LCA1NDIzLCA1NDMyLCA1NDM4LCA1NDQ5LAorICA1NDU1LCA1NDY0LCA1NDcwLCA1NDkwLCA1NDk2LCA1NTA1LCA1NTExLCA1NTIyLAorICA1NTI4LCA1NTM3LCA1NTQzLCA1NTY4LCA1NTc0LCA1NTgzLCA1NTg5LCA1NjAwLAorICA1NjA2LCA1NjE1LCA1NjIxLCA1NjQxLCA1NjQ3LCA1NjU2LCA1NjYyLCA1NjczLAorICA1Njc5LCA1Njg4LCA1Njk0LCA1NzE3LCA1NzIzLCA1NzMyLCA1NzM4LCA1NzQ5LAorICA1NzU1LCA1NzY0LCA1NzcwLCA1NzkwLCA1Nzk2LCA1ODA1LCA1ODExLCA1ODIyLAorICA1ODI4LCA1ODM3LCA1ODQzLCA1ODY4LCA1ODc0LCA1ODgzLCA1ODg5LCA1OTAwLAorICA1OTA2LCA1OTE1LCA1OTIxLCA1OTQxLCA1OTQ3LCA1OTU2LCA1OTYyLCA1OTczLAorICA1OTc5LCA1OTg4LCA1OTk0LCA1ODU4LCA1ODY0LCA1ODczLCA1ODc5LCA1ODkwLAorICA1ODk2LCA1OTA1LCA1OTExLCA1OTMxLCA1OTM3LCA1OTQ2LCA1OTUyLCA1OTYzLAorICA1OTY5LCA1OTc4LCA1OTg0LCA2MDA5LCA2MDE1LCA2MDI0LCA2MDMwLCA2MDQxLAorICA2MDQ3LCA2MDU2LCA2MDYyLCA2MDgyLCA2MDg4LCA2MDk3LCA2MTAzLCA2MTE0LAorICA2MTIwLCA2MTI5LCA2MTM1LCA2MTU4LCA2MTY0LCA2MTczLCA2MTc5LCA2MTkwLAorICA2MTk2LCA2MjA1LCA2MjExLCA2MjMxLCA2MjM3LCA2MjQ2LCA2MjUyLCA2MjYzLAorICA2MjY5LCA2Mjc4LCA2Mjg0LCA2MzA5LCA2MzE1LCA2MzI0LCA2MzMwLCA2MzQxLAorICA2MzQ3LCA2MzU2LCA2MzYyLCA2MzgyLCA2Mzg4LCA2Mzk3LCA2NDAzLCA2NDE0LAorICA2NDIwLCA2NDI5LCA2NDM1LCA1MzAzLCA1MzA5LCA1MzE4LCA1MzI0LCA1MzM1LAorICA1MzQxLCA1MzUwLCA1MzU2LCA1Mzc2LCA1MzgyLCA1MzkxLCA1Mzk3LCA1NDA4LAorICA1NDE0LCA1NDIzLCA1NDI5LCA1NDU0LCA1NDYwLCA1NDY5LCA1NDc1LCA1NDg2LAorICA1NDkyLCA1NTAxLCA1NTA3LCA1NTI3LCA1NTMzLCA1NTQyLCA1NTQ4LCA1NTU5LAorICA1NTY1LCA1NTc0LCA1NTgwLCA1NjAzLCA1NjA5LCA1NjE4LCA1NjI0LCA1NjM1LAorICA1NjQxLCA1NjUwLCA1NjU2LCA1Njc2LCA1NjgyLCA1NjkxLCA1Njk3LCA1NzA4LAorICA1NzE0LCA1NzIzLCA1NzI5LCA1NzU0LCA1NzYwLCA1NzY5LCA1Nzc1LCA1Nzg2LAorICA1NzkyLCA1ODAxLCA1ODA3LCA1ODI3LCA1ODMzLCA1ODQyLCA1ODQ4LCA1ODU5LAorICA1ODY1LCA1ODc0LCA1ODgwLCA1NzQ0LCA1NzUwLCA1NzU5LCA1NzY1LCA1Nzc2LAorICA1NzgyLCA1NzkxLCA1Nzk3LCA1ODE3LCA1ODIzLCA1ODMyLCA1ODM4LCA1ODQ5LAorICA1ODU1LCA1ODY0LCA1ODcwLCA1ODk1LCA1OTAxLCA1OTEwLCA1OTE2LCA1OTI3LAorICA1OTMzLCA1OTQyLCA1OTQ4LCA1OTY4LCA1OTc0LCA1OTgzLCA1OTg5LCA2MDAwLAorICA2MDA2LCA2MDE1LCA2MDIxLCA2MDQ0LCA2MDUwLCA2MDU5LCA2MDY1LCA2MDc2LAorICA2MDgyLCA2MDkxLCA2MDk3LCA2MTE3LCA2MTIzLCA2MTMyLCA2MTM4LCA2MTQ5LAorICA2MTU1LCA2MTY0LCA2MTcwLCA2MTk1LCA2MjAxLCA2MjEwLCA2MjE2LCA2MjI3LAorICA2MjMzLCA2MjQyLCA2MjQ4LCA2MjY4LCA2Mjc0LCA2MjgzLCA2Mjg5LCA2MzAwLAorICA2MzA2LCA2MzE1LCA2MzIxLCA2MTE2LCA2MTIyLCA2MTMxLCA2MTM3LCA2MTQ4LAorICA2MTU0LCA2MTYzLCA2MTY5LCA2MTg5LCA2MTk1LCA2MjA0LCA2MjEwLCA2MjIxLAorICA2MjI3LCA2MjM2LCA2MjQyLCA2MjY3LCA2MjczLCA2MjgyLCA2Mjg4LCA2Mjk5LAorICA2MzA1LCA2MzE0LCA2MzIwLCA2MzQwLCA2MzQ2LCA2MzU1LCA2MzYxLCA2MzcyLAorICA2Mzc4LCA2Mzg3LCA2MzkzLCA2NDE2LCA2NDIyLCA2NDMxLCA2NDM3LCA2NDQ4LAorICA2NDU0LCA2NDYzLCA2NDY5LCA2NDg5LCA2NDk1LCA2NTA0LCA2NTEwLCA2NTIxLAorICA2NTI3LCA2NTM2LCA2NTQyLCA2NTY3LCA2NTczLCA2NTgyLCA2NTg4LCA2NTk5LAorICA2NjA1LCA2NjE0LCA2NjIwLCA2NjQwLCA2NjQ2LCA2NjU1LCA2NjYxLCA2NjcyLAorICA2Njc4LCA2Njg3LCA2NjkzLCA2NTU3LCA2NTYzLCA2NTcyLCA2NTc4LCA2NTg5LAorICA2NTk1LCA2NjA0LCA2NjEwLCA2NjMwLCA2NjM2LCA2NjQ1LCA2NjUxLCA2NjYyLAorICA2NjY4LCA2Njc3LCA2NjgzLCA2NzA4LCA2NzE0LCA2NzIzLCA2NzI5LCA2NzQwLAorICA2NzQ2LCA2NzU1LCA2NzYxLCA2NzgxLCA2Nzg3LCA2Nzk2LCA2ODAyLCA2ODEzLAorICA2ODE5LCA2ODI4LCA2ODM0LCA2ODU3LCA2ODYzLCA2ODcyLCA2ODc4LCA2ODg5LAorICA2ODk1LCA2OTA0LCA2OTEwLCA2OTMwLCA2OTM2LCA2OTQ1LCA2OTUxLCA2OTYyLAorICA2OTY4LCA2OTc3LCA2OTgzLCA3MDA4LCA3MDE0LCA3MDIzLCA3MDI5LCA3MDQwLAorICA3MDQ2LCA3MDU1LCA3MDYxLCA3MDgxLCA3MDg3LCA3MDk2LCA3MTAyLCA3MTEzLAorICA3MTE5LCA3MTI4LCA3MTM0LCA2MzkyLCA2Mzk4LCA2NDA3LCA2NDEzLCA2NDI0LAorICA2NDMwLCA2NDM5LCA2NDQ1LCA2NDY1LCA2NDcxLCA2NDgwLCA2NDg2LCA2NDk3LAorICA2NTAzLCA2NTEyLCA2NTE4LCA2NTQzLCA2NTQ5LCA2NTU4LCA2NTY0LCA2NTc1LAorICA2NTgxLCA2NTkwLCA2NTk2LCA2NjE2LCA2NjIyLCA2NjMxLCA2NjM3LCA2NjQ4LAorICA2NjU0LCA2NjYzLCA2NjY5LCA2NjkyLCA2Njk4LCA2NzA3LCA2NzEzLCA2NzI0LAorICA2NzMwLCA2NzM5LCA2NzQ1LCA2NzY1LCA2NzcxLCA2NzgwLCA2Nzg2LCA2Nzk3LAorICA2ODAzLCA2ODEyLCA2ODE4LCA2ODQzLCA2ODQ5LCA2ODU4LCA2ODY0LCA2ODc1LAorICA2ODgxLCA2ODkwLCA2ODk2LCA2OTE2LCA2OTIyLCA2OTMxLCA2OTM3LCA2OTQ4LAorICA2OTU0LCA2OTYzLCA2OTY5LCA2ODMzLCA2ODM5LCA2ODQ4LCA2ODU0LCA2ODY1LAorICA2ODcxLCA2ODgwLCA2ODg2LCA2OTA2LCA2OTEyLCA2OTIxLCA2OTI3LCA2OTM4LAorICA2OTQ0LCA2OTUzLCA2OTU5LCA2OTg0LCA2OTkwLCA2OTk5LCA3MDA1LCA3MDE2LAorICA3MDIyLCA3MDMxLCA3MDM3LCA3MDU3LCA3MDYzLCA3MDcyLCA3MDc4LCA3MDg5LAorICA3MDk1LCA3MTA0LCA3MTEwLCA3MTMzLCA3MTM5LCA3MTQ4LCA3MTU0LCA3MTY1LAorICA3MTcxLCA3MTgwLCA3MTg2LCA3MjA2LCA3MjEyLCA3MjIxLCA3MjI3LCA3MjM4LAorICA3MjQ0LCA3MjUzLCA3MjU5LCA3Mjg0LCA3MjkwLCA3Mjk5LCA3MzA1LCA3MzE2LAorICA3MzIyLCA3MzMxLCA3MzM3LCA3MzU3LCA3MzYzLCA3MzcyLCA3Mzc4LCA3Mzg5LAorICA3Mzk1LCA3NDA0LCA3NDEwLCA3MjA1LCA3MjExLCA3MjIwLCA3MjI2LCA3MjM3LAorICA3MjQzLCA3MjUyLCA3MjU4LCA3Mjc4LCA3Mjg0LCA3MjkzLCA3Mjk5LCA3MzEwLAorICA3MzE2LCA3MzI1LCA3MzMxLCA3MzU2LCA3MzYyLCA3MzcxLCA3Mzc3LCA3Mzg4LAorICA3Mzk0LCA3NDAzLCA3NDA5LCA3NDI5LCA3NDM1LCA3NDQ0LCA3NDUwLCA3NDYxLAorICA3NDY3LCA3NDc2LCA3NDgyLCA3NTA1LCA3NTExLCA3NTIwLCA3NTI2LCA3NTM3LAorICA3NTQzLCA3NTUyLCA3NTU4LCA3NTc4LCA3NTg0LCA3NTkzLCA3NTk5LCA3NjEwLAorICA3NjE2LCA3NjI1LCA3NjMxLCA3NjU2LCA3NjYyLCA3NjcxLCA3Njc3LCA3Njg4LAorICA3Njk0LCA3NzAzLCA3NzA5LCA3NzI5LCA3NzM1LCA3NzQ0LCA3NzUwLCA3NzYxCit9OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVGFibGVzIGZvciBsZXZlbCBjb2RpbmcKKworY29uc3QgdWludDhfdCBWUDhFbmNCYW5kc1sxNiArIDFdID0geworICAwLCAxLCAyLCAzLCA2LCA0LCA1LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA3LAorICAwICAvLyBzZW50aW5lbAorfTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1vZGUgY29zdHMKKworc3RhdGljIGludCBHZXRSZXNpZHVhbENvc3RfQyhpbnQgY3R4MCwgY29uc3QgVlA4UmVzaWR1YWwqIGNvbnN0IHJlcykgeworICBpbnQgbiA9IHJlcy0+Zmlyc3Q7CisgIC8vIHNob3VsZCBiZSBwcm9iW1ZQOEVuY0JhbmRzW25dXSwgYnV0IGl0J3MgZXF1aXZhbGVudCBmb3Igbj0wIG9yIDEKKyAgY29uc3QgaW50IHAwID0gcmVzLT5wcm9iW25dW2N0eDBdWzBdOworICBDb3N0QXJyYXlQdHIgY29uc3QgY29zdHMgPSByZXMtPmNvc3RzOworICBjb25zdCB1aW50MTZfdCogdCA9IGNvc3RzW25dW2N0eDBdOworICAvLyBiaXRfY29zdCgxLCBwMCkgaXMgYWxyZWFkeSBpbmNvcnBvcmF0ZWQgaW4gdFtdIHRhYmxlcywgYnV0IG9ubHkgaWYgY3R4ICE9IDAKKyAgLy8gKGFzIHJlcXVpcmVkIGJ5IHRoZSBzeW50YXgpLiBGb3IgY3R4MCA9PSAwLCB3ZSBuZWVkIHRvIGFkZCBpdCBoZXJlIG9yIGl0J2xsCisgIC8vIGJlIG1pc3NpbmcgZHVyaW5nIHRoZSBsb29wLgorICBpbnQgY29zdCA9IChjdHgwID09IDApID8gVlA4Qml0Q29zdCgxLCBwMCkgOiAwOworCisgIGlmIChyZXMtPmxhc3QgPCAwKSB7CisgICAgcmV0dXJuIFZQOEJpdENvc3QoMCwgcDApOworICB9CisgIGZvciAoOyBuIDwgcmVzLT5sYXN0OyArK24pIHsKKyAgICBjb25zdCBpbnQgdiA9IGFicyhyZXMtPmNvZWZmc1tuXSk7CisgICAgY29uc3QgaW50IGN0eCA9ICh2ID49IDIpID8gMiA6IHY7CisgICAgY29zdCArPSBWUDhMZXZlbENvc3QodCwgdik7CisgICAgdCA9IGNvc3RzW24gKyAxXVtjdHhdOworICB9CisgIC8vIExhc3QgY29lZmZpY2llbnQgaXMgYWx3YXlzIG5vbi16ZXJvCisgIHsKKyAgICBjb25zdCBpbnQgdiA9IGFicyhyZXMtPmNvZWZmc1tuXSk7CisgICAgYXNzZXJ0KHYgIT0gMCk7CisgICAgY29zdCArPSBWUDhMZXZlbENvc3QodCwgdik7CisgICAgaWYgKG4gPCAxNSkgeworICAgICAgY29uc3QgaW50IGIgPSBWUDhFbmNCYW5kc1tuICsgMV07CisgICAgICBjb25zdCBpbnQgY3R4ID0gKHYgPT0gMSkgPyAxIDogMjsKKyAgICAgIGNvbnN0IGludCBsYXN0X3AwID0gcmVzLT5wcm9iW2JdW2N0eF1bMF07CisgICAgICBjb3N0ICs9IFZQOEJpdENvc3QoMCwgbGFzdF9wMCk7CisgICAgfQorICB9CisgIHJldHVybiBjb3N0OworfQorCitzdGF0aWMgdm9pZCBTZXRSZXNpZHVhbENvZWZmc19DKGNvbnN0IGludDE2X3QqIGNvbnN0IGNvZWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4UmVzaWR1YWwqIGNvbnN0IHJlcykgeworICBpbnQgbjsKKyAgcmVzLT5sYXN0ID0gLTE7CisgIGFzc2VydChyZXMtPmZpcnN0ID09IDAgfHwgY29lZmZzWzBdID09IDApOworICBmb3IgKG4gPSAxNTsgbiA+PSAwOyAtLW4pIHsKKyAgICBpZiAoY29lZmZzW25dKSB7CisgICAgICByZXMtPmxhc3QgPSBuOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJlcy0+Y29lZmZzID0gY29lZmZzOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gaW5pdCBmdW5jdGlvbgorCitWUDhHZXRSZXNpZHVhbENvc3RGdW5jIFZQOEdldFJlc2lkdWFsQ29zdDsKK1ZQOFNldFJlc2lkdWFsQ29lZmZzRnVuYyBWUDhTZXRSZXNpZHVhbENvZWZmczsKKworZXh0ZXJuIHZvaWQgVlA4RW5jRHNwQ29zdEluaXRNSVBTMzIodm9pZCk7CitleHRlcm4gdm9pZCBWUDhFbmNEc3BDb3N0SW5pdE1JUFNkc3BSMih2b2lkKTsKK2V4dGVybiB2b2lkIFZQOEVuY0RzcENvc3RJbml0U1NFMih2b2lkKTsKKworV0VCUF9EU1BfSU5JVF9GVU5DKFZQOEVuY0RzcENvc3RJbml0KSB7CisgIFZQOEdldFJlc2lkdWFsQ29zdCA9IEdldFJlc2lkdWFsQ29zdF9DOworICBWUDhTZXRSZXNpZHVhbENvZWZmcyA9IFNldFJlc2lkdWFsQ29lZmZzX0M7CisKKyAgLy8gSWYgZGVmaW5lZCwgdXNlIENQVUluZm8oKSB0byBvdmVyd3JpdGUgc29tZSBwb2ludGVycyB3aXRoIGZhc3RlciB2ZXJzaW9ucy4KKyAgaWYgKFZQOEdldENQVUluZm8gIT0gTlVMTCkgeworI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQUzMyKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtNSVBTMzIpKSB7CisgICAgICBWUDhFbmNEc3BDb3N0SW5pdE1JUFMzMigpOworICAgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQU19EU1BfUjIpCisgICAgaWYgKFZQOEdldENQVUluZm8oa01JUFNkc3BSMikpIHsKKyAgICAgIFZQOEVuY0RzcENvc3RJbml0TUlQU2RzcFIyKCk7CisgICAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0UyKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtTU0UyKSkgeworICAgICAgVlA4RW5jRHNwQ29zdEluaXRTU0UyKCk7CisgICAgfQorI2VuZGlmCisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvY29zdF9taXBzMzIuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvY29zdF9taXBzMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmM1OGUwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9jb3N0X21pcHMzMi5jCkBAIC0wLDAgKzEsMTU5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQXV0aG9yOiBEam9yZGplIFBlc3V0IChkam9yZGplLnBlc3V0QGltZ3RlYy5jb20pCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTMzIpCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9hc3NlcnRfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0ZGxpYl9wb2VtLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInNyYy9lbmMvY29zdF9lbmMuaCIKKworc3RhdGljIGludCBHZXRSZXNpZHVhbENvc3RfTUlQUzMyKGludCBjdHgwLCBjb25zdCBWUDhSZXNpZHVhbCogY29uc3QgcmVzKSB7CisgIGludCB0ZW1wMCwgdGVtcDE7CisgIGludCB2X3JlZywgY3R4X3JlZzsKKyAgaW50IG4gPSByZXMtPmZpcnN0OworICAvLyBzaG91bGQgYmUgcHJvYltWUDhFbmNCYW5kc1tuXV0sIGJ1dCBpdCdzIGVxdWl2YWxlbnQgZm9yIG49MCBvciAxCisgIGludCBwMCA9IHJlcy0+cHJvYltuXVtjdHgwXVswXTsKKyAgQ29zdEFycmF5UHRyIGNvbnN0IGNvc3RzID0gcmVzLT5jb3N0czsKKyAgY29uc3QgdWludDE2X3QqIHQgPSBjb3N0c1tuXVtjdHgwXTsKKyAgLy8gYml0X2Nvc3QoMSwgcDApIGlzIGFscmVhZHkgaW5jb3Jwb3JhdGVkIGluIHRbXSB0YWJsZXMsIGJ1dCBvbmx5IGlmIGN0eCAhPSAwCisgIC8vIChhcyByZXF1aXJlZCBieSB0aGUgc3ludGF4KS4gRm9yIGN0eDAgPT0gMCwgd2UgbmVlZCB0byBhZGQgaXQgaGVyZSBvciBpdCdsbAorICAvLyBiZSBtaXNzaW5nIGR1cmluZyB0aGUgbG9vcC4KKyAgaW50IGNvc3QgPSAoY3R4MCA9PSAwKSA/IFZQOEJpdENvc3QoMSwgcDApIDogMDsKKyAgY29uc3QgaW50MTZfdCogcmVzX2NvZWZmcyA9IHJlcy0+Y29lZmZzOworICBjb25zdCBpbnQgcmVzX2xhc3QgPSByZXMtPmxhc3Q7CisgIGNvbnN0IGludCBjb25zdF9tYXhfbGV2ZWwgPSBNQVhfVkFSSUFCTEVfTEVWRUw7CisgIGNvbnN0IGludCBjb25zdF8yID0gMjsKKyAgY29uc3QgdWludDE2X3QqKiBwX2Nvc3RzID0gJmNvc3RzW25dWzBdOworICBjb25zdCBzaXplX3QgaW5jX3BfY29zdHMgPSBOVU1fQ1RYICogc2l6ZW9mKCpwX2Nvc3RzKTsKKworICBpZiAocmVzLT5sYXN0IDwgMCkgeworICAgIHJldHVybiBWUDhCaXRDb3N0KDAsIHAwKTsKKyAgfQorCisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICIuc2V0ICAgICAgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiLnNldCAgICAgIG5vcmVvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXAxXSwgICAgICAgICVbcmVzX2xhc3RdLCAgICAgICAgJVtuXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzbGwgICAgICAgJVt0ZW1wMF0sICAgICAgICAlW25dLCAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmxleiAgICAgICVbdGVtcDFdLCAgICAgICAgMmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIiBhZGR1ICAgICAlW3Jlc19jb2VmZnNdLCAgICVbcmVzX2NvZWZmc10sICAgICAgJVt0ZW1wMF0gICAgICAgICAgICAgICBcblx0IgorICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGggICAgICAgICVbdl9yZWddLCAgICAgICAgMCglW3Jlc19jb2VmZnNdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAgICAlW25dLCAgICAgICAgICAgICVbbl0sICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJuZWd1ICAgICAgJVt0ZW1wMF0sICAgICAgICAlW3ZfcmVnXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2x0aSAgICAgICVbdGVtcDFdLCAgICAgICAgJVt2X3JlZ10sICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIm1vdm4gICAgICAlW3ZfcmVnXSwgICAgICAgICVbdGVtcDBdLCAgICAgICAgICAgJVt0ZW1wMV0gICAgICAgICAgICAgICBcblx0IgorICAgICJzbHRpdSAgICAgJVt0ZW1wMF0sICAgICAgICAlW3ZfcmVnXSwgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibW92ZSAgICAgICVbY3R4X3JlZ10sICAgICAgJVt2X3JlZ10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIm1vdnogICAgICAlW2N0eF9yZWddLCAgICAgICVbY29uc3RfMl0sICAgICAgICAgJVt0ZW1wMF0gICAgICAgICAgICAgICBcblx0IgorICAgICJzbGwgICAgICAgJVt0ZW1wMV0sICAgICAgICAlW3ZfcmVnXSwgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbdGVtcDFdLCAgICAgICAgJVt0ZW1wMV0sICAgICAgICAgICAlW1ZQOExldmVsRml4ZWRDb3N0c10gIFxuXHQiCisgICAgImxodSAgICAgICAlW3RlbXAxXSwgICAgICAgIDAoJVt0ZW1wMV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzbHQgICAgICAgJVt0ZW1wMF0sICAgICAgICAlW3ZfcmVnXSwgICAgICAgICAgICVbY29uc3RfbWF4X2xldmVsXSAgICAgXG5cdCIKKyAgICAibW92eiAgICAgICVbdl9yZWddLCAgICAgICAgJVtjb25zdF9tYXhfbGV2ZWxdLCAlW3RlbXAwXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW2Nvc3RdLCAgICAgICAgICVbY29zdF0sICAgICAgICAgICAgJVt0ZW1wMV0gICAgICAgICAgICAgICBcblx0IgorICAgICJzbGwgICAgICAgJVt2X3JlZ10sICAgICAgICAlW3ZfcmVnXSwgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2xsICAgICAgICVbY3R4X3JlZ10sICAgICAgJVtjdHhfcmVnXSwgICAgICAgICAyICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3ZfcmVnXSwgICAgICAgICVbdl9yZWddLCAgICAgICAgICAgJVt0XSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsaHUgICAgICAgJVt0ZW1wMF0sICAgICAgICAwKCVbdl9yZWddKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbcF9jb3N0c10sICAgICAgJVtwX2Nvc3RzXSwgICAgICAgICAlW2luY19wX2Nvc3RzXSAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3RdLCAgICAgICAgICAgICVbcF9jb3N0c10sICAgICAgICAgJVtjdHhfcmVnXSAgICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVtjb3N0XSwgICAgICAgICAlW2Nvc3RdLCAgICAgICAgICAgICVbdGVtcDBdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICVbcmVzX2NvZWZmc10sICAgJVtyZXNfY29lZmZzXSwgICAgICAyICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJuZSAgICAgICAlW25dLCAgICAgICAgICAgICVbcmVzX2xhc3RdLCAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIgbHcgICAgICAgJVt0XSwgICAgICAgICAgICAwKCVbdF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIi5zZXQgICAgICBwb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIDogW2Nvc3RdIismciIoY29zdCksIFt0XSIrJnIiKHQpLCBbbl0iKyZyIihuKSwgW3ZfcmVnXSI9JnIiKHZfcmVnKSwKKyAgICAgIFtjdHhfcmVnXSI9JnIiKGN0eF9yZWcpLCBbcF9jb3N0c10iKyZyIihwX2Nvc3RzKSwgW3RlbXAwXSI9JnIiKHRlbXAwKSwKKyAgICAgIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFtyZXNfY29lZmZzXSIrJnIiKHJlc19jb2VmZnMpCisgICAgOiBbY29uc3RfMl0iciIoY29uc3RfMiksIFtjb25zdF9tYXhfbGV2ZWxdInIiKGNvbnN0X21heF9sZXZlbCksCisgICAgICBbVlA4TGV2ZWxGaXhlZENvc3RzXSJyIihWUDhMZXZlbEZpeGVkQ29zdHMpLCBbcmVzX2xhc3RdInIiKHJlc19sYXN0KSwKKyAgICAgIFtpbmNfcF9jb3N0c10iciIoaW5jX3BfY29zdHMpCisgICAgOiAibWVtb3J5IgorICApOworCisgIC8vIExhc3QgY29lZmZpY2llbnQgaXMgYWx3YXlzIG5vbi16ZXJvCisgIHsKKyAgICBjb25zdCBpbnQgdiA9IGFicyhyZXMtPmNvZWZmc1tuXSk7CisgICAgYXNzZXJ0KHYgIT0gMCk7CisgICAgY29zdCArPSBWUDhMZXZlbENvc3QodCwgdik7CisgICAgaWYgKG4gPCAxNSkgeworICAgICAgY29uc3QgaW50IGIgPSBWUDhFbmNCYW5kc1tuICsgMV07CisgICAgICBjb25zdCBpbnQgY3R4ID0gKHYgPT0gMSkgPyAxIDogMjsKKyAgICAgIGNvbnN0IGludCBsYXN0X3AwID0gcmVzLT5wcm9iW2JdW2N0eF1bMF07CisgICAgICBjb3N0ICs9IFZQOEJpdENvc3QoMCwgbGFzdF9wMCk7CisgICAgfQorICB9CisgIHJldHVybiBjb3N0OworfQorCitzdGF0aWMgdm9pZCBTZXRSZXNpZHVhbENvZWZmc19NSVBTMzIoY29uc3QgaW50MTZfdCogY29uc3QgY29lZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOFJlc2lkdWFsKiBjb25zdCByZXMpIHsKKyAgY29uc3QgaW50MTZfdCogcF9jb2VmZnMgPSAoaW50MTZfdCopY29lZmZzOworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgbiwgbjE7CisgIGFzc2VydChyZXMtPmZpcnN0ID09IDAgfHwgY29lZmZzWzBdID09IDApOworCisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICIuc2V0ICAgICBwdXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIuc2V0ICAgICBub3Jlb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGRpdSAgICAlW3BfY29lZmZzXSwgICAlW3BfY29lZmZzXSwgICAgMjggICAgICAgICBcblx0IgorICAgICJsaSAgICAgICAlW25dLCAgICAgICAgICAxNSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsaSAgICAgICAlW3RlbXAyXSwgICAgICAtMSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAiMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ1bHcgICAgICAlW3RlbXAwXSwgICAgICAwKCVbcF9jb2VmZnNdKSAgICAgICAgICAgICBcblx0IgorICAgICJiZXF6ICAgICAlW3RlbXAwXSwgICAgICAxZiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorI2lmIGRlZmluZWQoV09SRFNfQklHRU5ESUFOKQorICAgICIgc2xsICAgICAlW3RlbXAxXSwgICAgICAlW3RlbXAwXSwgICAgICAgMTYgICAgICAgICBcblx0IgorI2Vsc2UKKyAgICAiIHNybCAgICAgJVt0ZW1wMV0sICAgICAgJVt0ZW1wMF0sICAgICAgIDE2ICAgICAgICAgXG5cdCIKKyNlbmRpZgorICAgICJhZGRpdSAgICAlW24xXSwgICAgICAgICAlW25dLCAgICAgICAgICAgLTEgICAgICAgICBcblx0IgorICAgICJtb3Z6ICAgICAlW3RlbXAwXSwgICAgICAlW24xXSwgICAgICAgICAgJVt0ZW1wMV0gICBcblx0IgorICAgICJtb3ZuICAgICAlW3RlbXAwXSwgICAgICAlW25dLCAgICAgICAgICAgJVt0ZW1wMV0gICBcblx0IgorICAgICJqICAgICAgICAyZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIgYWRkaXUgICAlW3RlbXAyXSwgICAgICAlW3RlbXAwXSwgICAgICAgMCAgICAgICAgICBcblx0IgorICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGRpdSAgICAlW25dLCAgICAgICAgICAlW25dLCAgICAgICAgICAgLTIgICAgICAgICBcblx0IgorICAgICJiZ3R6ICAgICAlW25dLCAgICAgICAgICAwYiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIgYWRkaXUgICAlW3BfY29lZmZzXSwgICAlW3BfY29lZmZzXSwgICAgLTQgICAgICAgICBcblx0IgorICAiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIuc2V0ICAgICBwb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIDogW3BfY29lZmZzXSIrJnIiKHBfY29lZmZzKSwgW3RlbXAwXSI9JnIiKHRlbXAwKSwKKyAgICAgIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbbl0iPSZyIihuKSwgW24xXSI9JnIiKG4xKQorICAgIDoKKyAgICA6ICJtZW1vcnkiCisgICk7CisgIHJlcy0+bGFzdCA9IHRlbXAyOworICByZXMtPmNvZWZmcyA9IGNvZWZmczsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFZQOEVuY0RzcENvc3RJbml0TUlQUzMyKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgVlA4RW5jRHNwQ29zdEluaXRNSVBTMzIodm9pZCkgeworICBWUDhHZXRSZXNpZHVhbENvc3QgPSBHZXRSZXNpZHVhbENvc3RfTUlQUzMyOworICBWUDhTZXRSZXNpZHVhbENvZWZmcyA9IFNldFJlc2lkdWFsQ29lZmZzX01JUFMzMjsKK30KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9NSVBTMzIKKworV0VCUF9EU1BfSU5JVF9TVFVCKFZQOEVuY0RzcENvc3RJbml0TUlQUzMyKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX01JUFMzMgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9jb3N0X21pcHNfZHNwX3IyLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2Nvc3RfbWlwc19kc3BfcjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTcxNTE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9jb3N0X21pcHNfZHNwX3IyLmMKQEAgLTAsMCArMSwxMTIgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBBdXRob3I6IERqb3JkamUgUGVzdXQgKGRqb3JkamUucGVzdXRAaW1ndGVjLmNvbSkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFNfRFNQX1IyKQorCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vYXNzZXJ0X3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdGRsaWJfcG9lbS5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvZW5jL2Nvc3RfZW5jLmgiCisKK3N0YXRpYyBpbnQgR2V0UmVzaWR1YWxDb3N0X01JUFNkc3BSMihpbnQgY3R4MCwgY29uc3QgVlA4UmVzaWR1YWwqIGNvbnN0IHJlcykgeworICBpbnQgdGVtcDAsIHRlbXAxOworICBpbnQgdl9yZWcsIGN0eF9yZWc7CisgIGludCBuID0gcmVzLT5maXJzdDsKKyAgLy8gc2hvdWxkIGJlIHByb2JbVlA4RW5jQmFuZHNbbl1dLCBidXQgaXQncyBlcXVpdmFsZW50IGZvciBuPTAgb3IgMQorICBpbnQgcDAgPSByZXMtPnByb2Jbbl1bY3R4MF1bMF07CisgIENvc3RBcnJheVB0ciBjb25zdCBjb3N0cyA9IHJlcy0+Y29zdHM7CisgIGNvbnN0IHVpbnQxNl90KiB0ID0gY29zdHNbbl1bY3R4MF07CisgIC8vIGJpdF9jb3N0KDEsIHAwKSBpcyBhbHJlYWR5IGluY29ycG9yYXRlZCBpbiB0W10gdGFibGVzLCBidXQgb25seSBpZiBjdHggIT0gMAorICAvLyAoYXMgcmVxdWlyZWQgYnkgdGhlIHN5bnRheCkuIEZvciBjdHgwID09IDAsIHdlIG5lZWQgdG8gYWRkIGl0IGhlcmUgb3IgaXQnbGwKKyAgLy8gYmUgbWlzc2luZyBkdXJpbmcgdGhlIGxvb3AuCisgIGludCBjb3N0ID0gKGN0eDAgPT0gMCkgPyBWUDhCaXRDb3N0KDEsIHAwKSA6IDA7CisgIGNvbnN0IGludDE2X3QqIHJlc19jb2VmZnMgPSByZXMtPmNvZWZmczsKKyAgY29uc3QgaW50IHJlc19sYXN0ID0gcmVzLT5sYXN0OworICBjb25zdCBpbnQgY29uc3RfbWF4X2xldmVsID0gTUFYX1ZBUklBQkxFX0xFVkVMOworICBjb25zdCBpbnQgY29uc3RfMiA9IDI7CisgIGNvbnN0IHVpbnQxNl90KiogcF9jb3N0cyA9ICZjb3N0c1tuXVswXTsKKyAgY29uc3Qgc2l6ZV90IGluY19wX2Nvc3RzID0gTlVNX0NUWCAqIHNpemVvZigqcF9jb3N0cyk7CisKKyAgaWYgKHJlcy0+bGFzdCA8IDApIHsKKyAgICByZXR1cm4gVlA4Qml0Q29zdCgwLCBwMCk7CisgIH0KKworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAiLnNldCAgICAgIHB1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIi5zZXQgICAgICBub3Jlb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVt0ZW1wMV0sICAgICAgICAlW3Jlc19sYXN0XSwgICAgICAgICVbbl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmxleiAgICAgICVbdGVtcDFdLCAgICAgICAgMmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIiBub3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2xsICAgICAgICVbdGVtcDBdLCAgICAgICAgJVtuXSwgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxoeCAgICAgICAlW3ZfcmVnXSwgICAgICAgICVbdGVtcDBdKCVbcmVzX2NvZWZmc10pICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGRpdSAgICAgJVtuXSwgICAgICAgICAgICAlW25dLCAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWJzcV9zLncgICVbdl9yZWddLCAgICAgICAgJVt2X3JlZ10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNsdGl1ICAgICAlW3RlbXAwXSwgICAgICAgICVbdl9yZWddLCAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJtb3ZlICAgICAgJVtjdHhfcmVnXSwgICAgICAlW3ZfcmVnXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibW92eiAgICAgICVbY3R4X3JlZ10sICAgICAgJVtjb25zdF8yXSwgICAgICAgICAlW3RlbXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgInNsbCAgICAgICAlW3RlbXAxXSwgICAgICAgICVbdl9yZWddLCAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsaHggICAgICAgJVt0ZW1wMV0sICAgICAgICAlW3RlbXAxXSglW1ZQOExldmVsRml4ZWRDb3N0c10pICAgICAgICAgXG5cdCIKKyAgICAic2x0ICAgICAgICVbdGVtcDBdLCAgICAgICAgJVt2X3JlZ10sICAgICAgICAgICAlW2NvbnN0X21heF9sZXZlbF0gIFxuXHQiCisgICAgIm1vdnogICAgICAlW3ZfcmVnXSwgICAgICAgICVbY29uc3RfbWF4X2xldmVsXSwgJVt0ZW1wMF0gICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVtjb3N0XSwgICAgICAgICAlW2Nvc3RdLCAgICAgICAgICAgICVbdGVtcDFdICAgICAgICAgICAgXG5cdCIKKyAgICAic2xsICAgICAgICVbdl9yZWddLCAgICAgICAgJVt2X3JlZ10sICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNsbCAgICAgICAlW2N0eF9yZWddLCAgICAgICVbY3R4X3JlZ10sICAgICAgICAgMiAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsaHggICAgICAgJVt0ZW1wMF0sICAgICAgICAlW3ZfcmVnXSglW3RdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbcF9jb3N0c10sICAgICAgJVtwX2Nvc3RzXSwgICAgICAgICAlW2luY19wX2Nvc3RzXSAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3RdLCAgICAgICAgICAgICVbcF9jb3N0c10sICAgICAgICAgJVtjdHhfcmVnXSAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVtjb3N0XSwgICAgICAgICAlW2Nvc3RdLCAgICAgICAgICAgICVbdGVtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAiYm5lICAgICAgICVbbl0sICAgICAgICAgICAgJVtyZXNfbGFzdF0sICAgICAgICAxYiAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIiBsdyAgICAgICAlW3RdLCAgICAgICAgICAgIDAoJVt0XSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiLnNldCAgICAgIHBvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgOiBbY29zdF0iKyZyIihjb3N0KSwgW3RdIismciIodCksIFtuXSIrJnIiKG4pLCBbdl9yZWddIj0mciIodl9yZWcpLAorICAgICAgW2N0eF9yZWddIj0mciIoY3R4X3JlZyksIFtwX2Nvc3RzXSIrJnIiKHBfY29zdHMpLCBbdGVtcDBdIj0mciIodGVtcDApLAorICAgICAgW3RlbXAxXSI9JnIiKHRlbXAxKQorICAgIDogW2NvbnN0XzJdInIiKGNvbnN0XzIpLCBbY29uc3RfbWF4X2xldmVsXSJyIihjb25zdF9tYXhfbGV2ZWwpLAorICAgICAgW1ZQOExldmVsRml4ZWRDb3N0c10iciIoVlA4TGV2ZWxGaXhlZENvc3RzKSwgW3Jlc19sYXN0XSJyIihyZXNfbGFzdCksCisgICAgICBbcmVzX2NvZWZmc10iciIocmVzX2NvZWZmcyksIFtpbmNfcF9jb3N0c10iciIoaW5jX3BfY29zdHMpCisgICAgOiAibWVtb3J5IgorICApOworCisgIC8vIExhc3QgY29lZmZpY2llbnQgaXMgYWx3YXlzIG5vbi16ZXJvCisgIHsKKyAgICBjb25zdCBpbnQgdiA9IGFicyhyZXMtPmNvZWZmc1tuXSk7CisgICAgYXNzZXJ0KHYgIT0gMCk7CisgICAgY29zdCArPSBWUDhMZXZlbENvc3QodCwgdik7CisgICAgaWYgKG4gPCAxNSkgeworICAgICAgY29uc3QgaW50IGIgPSBWUDhFbmNCYW5kc1tuICsgMV07CisgICAgICBjb25zdCBpbnQgY3R4ID0gKHYgPT0gMSkgPyAxIDogMjsKKyAgICAgIGNvbnN0IGludCBsYXN0X3AwID0gcmVzLT5wcm9iW2JdW2N0eF1bMF07CisgICAgICBjb3N0ICs9IFZQOEJpdENvc3QoMCwgbGFzdF9wMCk7CisgICAgfQorICB9CisgIHJldHVybiBjb3N0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgVlA4RW5jRHNwQ29zdEluaXRNSVBTZHNwUjIodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBWUDhFbmNEc3BDb3N0SW5pdE1JUFNkc3BSMih2b2lkKSB7CisgIFZQOEdldFJlc2lkdWFsQ29zdCA9IEdldFJlc2lkdWFsQ29zdF9NSVBTZHNwUjI7Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfTUlQU19EU1BfUjIKKworV0VCUF9EU1BfSU5JVF9TVFVCKFZQOEVuY0RzcENvc3RJbml0TUlQU2RzcFIyKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX01JUFNfRFNQX1IyCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2Nvc3Rfc3NlMi5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9jb3N0X3NzZTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWIwMDAzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9jb3N0X3NzZTIuYwpAQCAtMCwwICsxLDEyMyBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFNTRTIgdmVyc2lvbiBvZiBjb3N0IGZ1bmN0aW9ucworLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0UyKQorI2luY2x1ZGUgPGVtbWludHJpbi5oPgorI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL2Fzc2VydF9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RyaW5nX3BvZW0uaCIKKyNlbmRpZgorCisjaW5jbHVkZSAic3JjL2VuYy9jb3N0X2VuYy5oIgorI2luY2x1ZGUgInNyYy9lbmMvdnA4aV9lbmMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgU2V0UmVzaWR1YWxDb2VmZnNfU1NFMihjb25zdCBpbnQxNl90KiBjb25zdCBjb2VmZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOFJlc2lkdWFsKiBjb25zdCByZXMpIHsKKyAgY29uc3QgX19tMTI4aSBjMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKGNvZWZmcyArIDApKTsKKyAgY29uc3QgX19tMTI4aSBjMSA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKGNvZWZmcyArIDgpKTsKKyAgLy8gVXNlIFNTRTIgdG8gY29tcGFyZSAxNiB2YWx1ZXMgd2l0aCBhIHNpbmdsZSBpbnN0cnVjdGlvbi4KKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgY29uc3QgX19tMTI4aSBtMCA9IF9tbV9wYWNrc19lcGkxNihjMCwgYzEpOworICBjb25zdCBfX20xMjhpIG0xID0gX21tX2NtcGVxX2VwaTgobTAsIHplcm8pOworICAvLyBHZXQgdGhlIGNvbXBhcmlzb24gcmVzdWx0cyBhcyBhIGJpdG1hc2sgaW50byAxNmJpdHMuIE5lZ2F0ZSB0aGUgbWFzayB0byBnZXQKKyAgLy8gdGhlIHBvc2l0aW9uIG9mIGVudHJpZXMgdGhhdCBhcmUgbm90IGVxdWFsIHRvIHplcm8uIFdlIGRvbid0IG5lZWQgdG8gbWFzaworICAvLyBvdXQgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBhY2NvcmRpbmcgdG8gcmVzLT5maXJzdCwgc2luY2UgY29lZmZzWzBdIGlzIDAKKyAgLy8gaWYgcmVzLT5maXJzdCA+IDAuCisgIGNvbnN0IHVpbnQzMl90IG1hc2sgPSAweDAwMDBmZmZmdSBeICh1aW50MzJfdClfbW1fbW92ZW1hc2tfZXBpOChtMSk7CisgIC8vIFRoZSBwb3NpdGlvbiBvZiB0aGUgbW9zdCBzaWduaWZpY2FudCBub24temVybyBiaXQgaW5kaWNhdGVzIHRoZSBwb3NpdGlvbiBvZgorICAvLyB0aGUgbGFzdCBub24temVybyB2YWx1ZS4KKyAgYXNzZXJ0KHJlcy0+Zmlyc3QgPT0gMCB8fCBjb2VmZnNbMF0gPT0gMCk7CisgIHJlcy0+bGFzdCA9IG1hc2sgPyBCaXRzTG9nMkZsb29yKG1hc2spIDogLTE7CisgIHJlcy0+Y29lZmZzID0gY29lZmZzOworfQorCitzdGF0aWMgaW50IEdldFJlc2lkdWFsQ29zdF9TU0UyKGludCBjdHgwLCBjb25zdCBWUDhSZXNpZHVhbCogY29uc3QgcmVzKSB7CisgIHVpbnQ4X3QgbGV2ZWxzWzE2XSwgY3R4c1sxNl07CisgIHVpbnQxNl90IGFic19sZXZlbHNbMTZdOworICBpbnQgbiA9IHJlcy0+Zmlyc3Q7CisgIC8vIHNob3VsZCBiZSBwcm9iW1ZQOEVuY0JhbmRzW25dXSwgYnV0IGl0J3MgZXF1aXZhbGVudCBmb3Igbj0wIG9yIDEKKyAgY29uc3QgaW50IHAwID0gcmVzLT5wcm9iW25dW2N0eDBdWzBdOworICBDb3N0QXJyYXlQdHIgY29uc3QgY29zdHMgPSByZXMtPmNvc3RzOworICBjb25zdCB1aW50MTZfdCogdCA9IGNvc3RzW25dW2N0eDBdOworICAvLyBiaXRfY29zdCgxLCBwMCkgaXMgYWxyZWFkeSBpbmNvcnBvcmF0ZWQgaW4gdFtdIHRhYmxlcywgYnV0IG9ubHkgaWYgY3R4ICE9IDAKKyAgLy8gKGFzIHJlcXVpcmVkIGJ5IHRoZSBzeW50YXgpLiBGb3IgY3R4MCA9PSAwLCB3ZSBuZWVkIHRvIGFkZCBpdCBoZXJlIG9yIGl0J2xsCisgIC8vIGJlIG1pc3NpbmcgZHVyaW5nIHRoZSBsb29wLgorICBpbnQgY29zdCA9IChjdHgwID09IDApID8gVlA4Qml0Q29zdCgxLCBwMCkgOiAwOworCisgIGlmIChyZXMtPmxhc3QgPCAwKSB7CisgICAgcmV0dXJuIFZQOEJpdENvc3QoMCwgcDApOworICB9CisKKyAgeyAgIC8vIHByZWNvbXB1dGUgY2xhbXBlZCBsZXZlbHMgYW5kIGNvbnRleHRzLCBwYWNrZWQgdG8gOGIuCisgICAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgICBjb25zdCBfX20xMjhpIGtDc3QyID0gX21tX3NldDFfZXBpOCgyKTsKKyAgICBjb25zdCBfX20xMjhpIGtDc3Q2NyA9IF9tbV9zZXQxX2VwaTgoTUFYX1ZBUklBQkxFX0xFVkVMKTsKKyAgICBjb25zdCBfX20xMjhpIGMwID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmcmVzLT5jb2VmZnNbMF0pOworICAgIGNvbnN0IF9fbTEyOGkgYzEgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZyZXMtPmNvZWZmc1s4XSk7CisgICAgY29uc3QgX19tMTI4aSBEMCA9IF9tbV9zdWJfZXBpMTYoemVybywgYzApOworICAgIGNvbnN0IF9fbTEyOGkgRDEgPSBfbW1fc3ViX2VwaTE2KHplcm8sIGMxKTsKKyAgICBjb25zdCBfX20xMjhpIEUwID0gX21tX21heF9lcGkxNihjMCwgRDApOyAgIC8vIGFicyh2KSwgMTZiCisgICAgY29uc3QgX19tMTI4aSBFMSA9IF9tbV9tYXhfZXBpMTYoYzEsIEQxKTsKKyAgICBjb25zdCBfX20xMjhpIEYgPSBfbW1fcGFja3NfZXBpMTYoRTAsIEUxKTsKKyAgICBjb25zdCBfX20xMjhpIEcgPSBfbW1fbWluX2VwdTgoRiwga0NzdDIpOyAgICAvLyBjb250ZXh0ID0gMCwxLDIKKyAgICBjb25zdCBfX20xMjhpIEggPSBfbW1fbWluX2VwdTgoRiwga0NzdDY3KTsgICAvLyBjbGFtcF9sZXZlbCBpbiBbMC4uNjddCisKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmY3R4c1swXSwgRyk7CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJmxldmVsc1swXSwgSCk7CisKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmYWJzX2xldmVsc1swXSwgRTApOworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZhYnNfbGV2ZWxzWzhdLCBFMSk7CisgIH0KKyAgZm9yICg7IG4gPCByZXMtPmxhc3Q7ICsrbikgeworICAgIGNvbnN0IGludCBjdHggPSBjdHhzW25dOworICAgIGNvbnN0IGludCBsZXZlbCA9IGxldmVsc1tuXTsKKyAgICBjb25zdCBpbnQgZmxldmVsID0gYWJzX2xldmVsc1tuXTsgICAvLyBmdWxsIGxldmVsCisgICAgY29zdCArPSBWUDhMZXZlbEZpeGVkQ29zdHNbZmxldmVsXSArIHRbbGV2ZWxdOyAgLy8gc2ltcGxpZmllZCBWUDhMZXZlbENvc3QoKQorICAgIHQgPSBjb3N0c1tuICsgMV1bY3R4XTsKKyAgfQorICAvLyBMYXN0IGNvZWZmaWNpZW50IGlzIGFsd2F5cyBub24temVybworICB7CisgICAgY29uc3QgaW50IGxldmVsID0gbGV2ZWxzW25dOworICAgIGNvbnN0IGludCBmbGV2ZWwgPSBhYnNfbGV2ZWxzW25dOworICAgIGFzc2VydChmbGV2ZWwgIT0gMCk7CisgICAgY29zdCArPSBWUDhMZXZlbEZpeGVkQ29zdHNbZmxldmVsXSArIHRbbGV2ZWxdOworICAgIGlmIChuIDwgMTUpIHsKKyAgICAgIGNvbnN0IGludCBiID0gVlA4RW5jQmFuZHNbbiArIDFdOworICAgICAgY29uc3QgaW50IGN0eCA9IGN0eHNbbl07CisgICAgICBjb25zdCBpbnQgbGFzdF9wMCA9IHJlcy0+cHJvYltiXVtjdHhdWzBdOworICAgICAgY29zdCArPSBWUDhCaXRDb3N0KDAsIGxhc3RfcDApOworICAgIH0KKyAgfQorICByZXR1cm4gY29zdDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFZQOEVuY0RzcENvc3RJbml0U1NFMih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFZQOEVuY0RzcENvc3RJbml0U1NFMih2b2lkKSB7CisgIFZQOFNldFJlc2lkdWFsQ29lZmZzID0gU2V0UmVzaWR1YWxDb2VmZnNfU1NFMjsKKyAgVlA4R2V0UmVzaWR1YWxDb3N0ID0gR2V0UmVzaWR1YWxDb3N0X1NTRTI7Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfU1NFMgorCitXRUJQX0RTUF9JTklUX1NUVUIoVlA4RW5jRHNwQ29zdEluaXRTU0UyKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX1NTRTIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvY3B1LmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2NwdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNDBmZWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2NwdS5jCkBAIC0wLDAgKzEsMjIyIEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQ1BVIGRldGVjdGlvbgorLy8KKy8vIEF1dGhvcjogQ2hyaXN0aWFuIER1dml2aWVyIChjZHV2aXZpZXJAZ29vZ2xlLmNvbSkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfSEFWRV9ORU9OX1JUQ0QpCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZChXRUJQX0FORFJPSURfTkVPTikKKyNpbmNsdWRlIDxjcHUtZmVhdHVyZXMuaD4KKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU1NFMiBkZXRlY3Rpb24uCisvLworCisvLyBhcHBsZS9kYXJ3aW4gZ2NjLTQuMC4xIGRlZmluZXMgX19QSUNfXywgYnV0IG5vdCBfX3BpY19fIHdpdGggLWZQSUMuCisjaWYgKGRlZmluZWQoX19waWNfXykgfHwgZGVmaW5lZChfX1BJQ19fKSkgJiYgZGVmaW5lZChfX2kzODZfXykKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEdldENQVUluZm8oaW50IGNwdV9pbmZvWzRdLCBpbnQgaW5mb190eXBlKSB7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICJtb3YgJSVlYngsICUlZWRpXG4iCisgICAgImNwdWlkXG4iCisgICAgInhjaGcgJSVlZGksICUlZWJ4XG4iCisgICAgOiAiPWEiKGNwdV9pbmZvWzBdKSwgIj1EIihjcHVfaW5mb1sxXSksICI9YyIoY3B1X2luZm9bMl0pLCAiPWQiKGNwdV9pbmZvWzNdKQorICAgIDogImEiKGluZm9fdHlwZSksICJjIigwKSk7Cit9CisjZWxpZiBkZWZpbmVkKF9feDg2XzY0X18pICYmIFwKKyAgICAgIChkZWZpbmVkKF9fY29kZV9tb2RlbF9tZWRpdW1fXykgfHwgZGVmaW5lZChfX2NvZGVfbW9kZWxfbGFyZ2VfXykpICYmIFwKKyAgICAgIGRlZmluZWQoX19QSUNfXykKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEdldENQVUluZm8oaW50IGNwdV9pbmZvWzRdLCBpbnQgaW5mb190eXBlKSB7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICJ4Y2hne3F9XHR7JSVyYnh9LCAlcTFcbiIKKyAgICAiY3B1aWRcbiIKKyAgICAieGNoZ3txfVx0eyUlcmJ4fSwgJXExXG4iCisgICAgOiAiPWEiKGNwdV9pbmZvWzBdKSwgIj0mciIoY3B1X2luZm9bMV0pLCAiPWMiKGNwdV9pbmZvWzJdKSwKKyAgICAgICI9ZCIoY3B1X2luZm9bM10pCisgICAgOiAiYSIoaW5mb190eXBlKSwgImMiKDApKTsKK30KKyNlbGlmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEdldENQVUluZm8oaW50IGNwdV9pbmZvWzRdLCBpbnQgaW5mb190eXBlKSB7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICJjcHVpZFxuIgorICAgIDogIj1hIihjcHVfaW5mb1swXSksICI9YiIoY3B1X2luZm9bMV0pLCAiPWMiKGNwdV9pbmZvWzJdKSwgIj1kIihjcHVfaW5mb1szXSkKKyAgICA6ICJhIihpbmZvX3R5cGUpLCAiYyIoMCkpOworfQorI2VsaWYgKGRlZmluZWQoX01fWDY0KSB8fCBkZWZpbmVkKF9NX0lYODYpKSAmJiBcCisgICAgICBkZWZpbmVkKF9NU0NfRlVMTF9WRVIpICYmIF9NU0NfRlVMTF9WRVIgPj0gMTUwMDMwNzI5ICAvLyA+PSBWUzIwMDggU1AxCisjaW5jbHVkZSA8aW50cmluLmg+CisjZGVmaW5lIEdldENQVUluZm8oaW5mbywgdHlwZSkgX19jcHVpZGV4KGluZm8sIHR5cGUsIDApICAvLyBzZXQgZWN4PTAKKyNlbGlmIGRlZmluZWQoV0VCUF9NU0NfU1NFMikKKyNkZWZpbmUgR2V0Q1BVSW5mbyBfX2NwdWlkCisjZW5kaWYKKworLy8gTmFDbCBoYXMgbm8gc3VwcG9ydCBmb3IgeGdldGJ2IG9yIHRoZSByYXcgb3Bjb2RlLgorI2lmICFkZWZpbmVkKF9fbmF0aXZlX2NsaWVudF9fKSAmJiAoZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSkKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50NjRfdCB4Z2V0YnYodm9pZCkgeworICBjb25zdCB1aW50MzJfdCBlY3ggPSAwOworICB1aW50MzJfdCBlYXgsIGVkeDsKKyAgLy8gVXNlIHRoZSByYXcgb3Bjb2RlIGZvciB4Z2V0YnYgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciB0b29sY2hhaW5zLgorICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAiLmJ5dGUgMHgwZiwgMHgwMSwgMHhkMFxuIgorICAgIDogIj1hIihlYXgpLCAiPWQiKGVkeCkgOiAiYyIgKGVjeCkpOworICByZXR1cm4gKCh1aW50NjRfdCllZHggPDwgMzIpIHwgZWF4OworfQorI2VsaWYgKGRlZmluZWQoX01fWDY0KSB8fCBkZWZpbmVkKF9NX0lYODYpKSAmJiBcCisgICAgICBkZWZpbmVkKF9NU0NfRlVMTF9WRVIpICYmIF9NU0NfRlVMTF9WRVIgPj0gMTYwMDQwMjE5ICAvLyA+PSBWUzIwMTAgU1AxCisjaW5jbHVkZSA8aW1taW50cmluLmg+CisjZGVmaW5lIHhnZXRidigpIF94Z2V0YnYoMCkKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpICYmIGRlZmluZWQoX01fSVg4NikKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50NjRfdCB4Z2V0YnYodm9pZCkgeworICB1aW50MzJfdCBlYXhfLCBlZHhfOworICBfX2FzbSB7CisgICAgeG9yIGVjeCwgZWN4ICAvLyBlY3ggPSAwCisgICAgLy8gVXNlIHRoZSByYXcgb3Bjb2RlIGZvciB4Z2V0YnYgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciB0b29sY2hhaW5zLgorICAgIF9fYXNtIF9lbWl0IDB4MGYgX19hc20gX2VtaXQgMHgwMSBfX2FzbSBfZW1pdCAweGQwCisgICAgbW92IGVheF8sIGVheAorICAgIG1vdiBlZHhfLCBlZHgKKyAgfQorICByZXR1cm4gKCh1aW50NjRfdCllZHhfIDw8IDMyKSB8IGVheF87Cit9CisjZWxzZQorI2RlZmluZSB4Z2V0YnYoKSAwVSAgLy8gbm8gQVZYIGZvciBvbGRlciB4NjQgb3IgdW5yZWNvZ25pemVkIHRvb2xjaGFpbnMuCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykgfHwgZGVmaW5lZChXRUJQX01TQ19TU0UyKQorCisvLyBoZWxwZXIgZnVuY3Rpb24gZm9yIHJ1bi10aW1lIGRldGVjdGlvbiBvZiBzbG93IFNTU0UzIHBsYXRmb3Jtcworc3RhdGljIGludCBDaGVja1Nsb3dNb2RlbChpbnQgaW5mbykgeworICAvLyBUYWJsZSBsaXN0aW5nIGRpc3BsYXkgbW9kZWxzIHdpdGggbG9uZ2VyIGxhdGVuY2llcyBmb3IgdGhlIGJzciBpbnN0cnVjdGlvbgorICAvLyAoaWUgMiBjeWNsZXMgdnMgMTAvMTYgY3ljbGVzKSBhbmQgc29tZSBTU1NFMyBpbnN0cnVjdGlvbnMgbGlrZSBwc2h1ZmIuCisgIC8vIFJlZmVyIHRvIEludGVsIDY0IGFuZCBJQS0zMiBBcmNoaXRlY3R1cmVzIE9wdGltaXphdGlvbiBSZWZlcmVuY2UgTWFudWFsLgorICBzdGF0aWMgY29uc3QgdWludDhfdCBrU2xvd01vZGVsc1tdID0geworICAgIDB4MzcsIDB4NGEsIDB4NGQsICAvLyBTaWx2ZXJtb250IE1pY3JvYXJjaGl0ZWN0dXJlCisgICAgMHgxYywgMHgyNiwgMHgyNyAgIC8vIEF0b20gTWljcm9hcmNoaXRlY3R1cmUKKyAgfTsKKyAgY29uc3QgdWludDMyX3QgbW9kZWwgPSAoKGluZm8gJiAweGYwMDAwKSA+PiAxMikgfCAoKGluZm8gPj4gNCkgJiAweGYpOworICBjb25zdCB1aW50MzJfdCBmYW1pbHkgPSAoaW5mbyA+PiA4KSAmIDB4ZjsKKyAgaWYgKGZhbWlseSA9PSAweDA2KSB7CisgICAgc2l6ZV90IGk7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZihrU2xvd01vZGVscykgLyBzaXplb2Yoa1Nsb3dNb2RlbHNbMF0pOyArK2kpIHsKKyAgICAgIGlmIChtb2RlbCA9PSBrU2xvd01vZGVsc1tpXSkgcmV0dXJuIDE7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHg4NkNQVUluZm8oQ1BVRmVhdHVyZSBmZWF0dXJlKSB7CisgIGludCBtYXhfY3B1aWRfdmFsdWU7CisgIGludCBjcHVfaW5mb1s0XTsKKyAgaW50IGlzX2ludGVsID0gMDsKKworICAvLyBnZXQgdGhlIGhpZ2hlc3QgZmVhdHVyZSB2YWx1ZSBjcHVpZCBzdXBwb3J0cworICBHZXRDUFVJbmZvKGNwdV9pbmZvLCAwKTsKKyAgbWF4X2NwdWlkX3ZhbHVlID0gY3B1X2luZm9bMF07CisgIGlmIChtYXhfY3B1aWRfdmFsdWUgPCAxKSB7CisgICAgcmV0dXJuIDA7CisgIH0gZWxzZSB7CisgICAgY29uc3QgaW50IFZFTkRPUl9JRF9JTlRFTF9FQlggPSAweDc1NmU2NTQ3OyAgLy8gdW5lRworICAgIGNvbnN0IGludCBWRU5ET1JfSURfSU5URUxfRURYID0gMHg0OTY1NmU2OTsgIC8vIEllbmkKKyAgICBjb25zdCBpbnQgVkVORE9SX0lEX0lOVEVMX0VDWCA9IDB4NmM2NTc0NmU7ICAvLyBsZXRuCisgICAgaXNfaW50ZWwgPSAoY3B1X2luZm9bMV0gPT0gVkVORE9SX0lEX0lOVEVMX0VCWCAmJgorICAgICAgICAgICAgICAgIGNwdV9pbmZvWzJdID09IFZFTkRPUl9JRF9JTlRFTF9FQ1ggJiYKKyAgICAgICAgICAgICAgICBjcHVfaW5mb1szXSA9PSBWRU5ET1JfSURfSU5URUxfRURYKTsgICAgLy8gZ2VudWluZSBJbnRlbD8KKyAgfQorCisgIEdldENQVUluZm8oY3B1X2luZm8sIDEpOworICBpZiAoZmVhdHVyZSA9PSBrU1NFMikgeworICAgIHJldHVybiAhIShjcHVfaW5mb1szXSAmICgxIDw8IDI2KSk7CisgIH0KKyAgaWYgKGZlYXR1cmUgPT0ga1NTRTMpIHsKKyAgICByZXR1cm4gISEoY3B1X2luZm9bMl0gJiAoMSA8PCAwKSk7CisgIH0KKyAgaWYgKGZlYXR1cmUgPT0ga1Nsb3dTU1NFMykgeworICAgIGlmIChpc19pbnRlbCAmJiAoY3B1X2luZm9bMl0gJiAoMSA8PCA5KSkpIHsgICAvLyBTU1NFMz8KKyAgICAgIHJldHVybiBDaGVja1Nsb3dNb2RlbChjcHVfaW5mb1swXSk7CisgICAgfQorICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKGZlYXR1cmUgPT0ga1NTRTRfMSkgeworICAgIHJldHVybiAhIShjcHVfaW5mb1syXSAmICgxIDw8IDE5KSk7CisgIH0KKyAgaWYgKGZlYXR1cmUgPT0ga0FWWCkgeworICAgIC8vIGJpdHMgMjcgKE9TWFNBVkUpICYgMjggKDI1Ni1iaXQgQVZYKQorICAgIGlmICgoY3B1X2luZm9bMl0gJiAweDE4MDAwMDAwKSA9PSAweDE4MDAwMDAwKSB7CisgICAgICAvLyBYTU0gc3RhdGUgYW5kIFlNTSBzdGF0ZSBlbmFibGVkIGJ5IHRoZSBPUy4KKyAgICAgIHJldHVybiAoeGdldGJ2KCkgJiAweDYpID09IDB4NjsKKyAgICB9CisgIH0KKyAgaWYgKGZlYXR1cmUgPT0ga0FWWDIpIHsKKyAgICBpZiAoeDg2Q1BVSW5mbyhrQVZYKSAmJiBtYXhfY3B1aWRfdmFsdWUgPj0gNykgeworICAgICAgR2V0Q1BVSW5mbyhjcHVfaW5mbywgNyk7CisgICAgICByZXR1cm4gISEoY3B1X2luZm9bMV0gJiAoMSA8PCA1KSk7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorVlA4Q1BVSW5mbyBWUDhHZXRDUFVJbmZvID0geDg2Q1BVSW5mbzsKKyNlbGlmIGRlZmluZWQoV0VCUF9BTkRST0lEX05FT04pICAvLyBOQjogbmVlZHMgdG8gYmUgYmVmb3JlIGdlbmVyaWMgTkVPTiB0ZXN0Lgorc3RhdGljIGludCBBbmRyb2lkQ1BVSW5mbyhDUFVGZWF0dXJlIGZlYXR1cmUpIHsKKyAgY29uc3QgQW5kcm9pZENwdUZhbWlseSBjcHVfZmFtaWx5ID0gYW5kcm9pZF9nZXRDcHVGYW1pbHkoKTsKKyAgY29uc3QgdWludDY0X3QgY3B1X2ZlYXR1cmVzID0gYW5kcm9pZF9nZXRDcHVGZWF0dXJlcygpOworICBpZiAoZmVhdHVyZSA9PSBrTkVPTikgeworICAgIHJldHVybiAoY3B1X2ZhbWlseSA9PSBBTkRST0lEX0NQVV9GQU1JTFlfQVJNICYmCisgICAgICAgICAgICAwICE9IChjcHVfZmVhdHVyZXMgJiBBTkRST0lEX0NQVV9BUk1fRkVBVFVSRV9ORU9OKSk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CitWUDhDUFVJbmZvIFZQOEdldENQVUluZm8gPSBBbmRyb2lkQ1BVSW5mbzsKKyNlbGlmIGRlZmluZWQoV0VCUF9VU0VfTkVPTikKKy8vIGRlZmluZSBhIGR1bW15IGZ1bmN0aW9uIHRvIGVuYWJsZSB0dXJuaW5nIG9mZiBORU9OIGF0IHJ1bnRpbWUgYnkgc2V0dGluZworLy8gVlA4RGVjR2V0Q1BVSW5mbyA9IE5VTEwKK3N0YXRpYyBpbnQgYXJtQ1BVSW5mbyhDUFVGZWF0dXJlIGZlYXR1cmUpIHsKKyAgaWYgKGZlYXR1cmUgIT0ga05FT04pIHJldHVybiAwOworI2lmIGRlZmluZWQoX19saW51eF9fKSAmJiBkZWZpbmVkKFdFQlBfSEFWRV9ORU9OX1JUQ0QpCisgIHsKKyAgICBpbnQgaGFzX25lb24gPSAwOworICAgIGNoYXIgbGluZVsyMDBdOworICAgIEZJTEUqIGNvbnN0IGNwdWluZm8gPSBmb3BlbigiL3Byb2MvY3B1aW5mbyIsICJyIik7CisgICAgaWYgKGNwdWluZm8gPT0gTlVMTCkgcmV0dXJuIDA7CisgICAgd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgY3B1aW5mbykpIHsKKyAgICAgIGlmICghc3RybmNtcChsaW5lLCAiRmVhdHVyZXMiLCA4KSkgeworICAgICAgICBpZiAoc3Ryc3RyKGxpbmUsICIgbmVvbiAiKSAhPSBOVUxMKSB7CisgICAgICAgICAgaGFzX25lb24gPSAxOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGZjbG9zZShjcHVpbmZvKTsKKyAgICByZXR1cm4gaGFzX25lb247CisgIH0KKyNlbHNlCisgIHJldHVybiAxOworI2VuZGlmCit9CitWUDhDUFVJbmZvIFZQOEdldENQVUluZm8gPSBhcm1DUFVJbmZvOworI2VsaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTMzIpIHx8IGRlZmluZWQoV0VCUF9VU0VfTUlQU19EU1BfUjIpIHx8IFwKKyAgICAgIGRlZmluZWQoV0VCUF9VU0VfTVNBKQorc3RhdGljIGludCBtaXBzQ1BVSW5mbyhDUFVGZWF0dXJlIGZlYXR1cmUpIHsKKyAgaWYgKChmZWF0dXJlID09IGtNSVBTMzIpIHx8IChmZWF0dXJlID09IGtNSVBTZHNwUjIpIHx8IChmZWF0dXJlID09IGtNU0EpKSB7CisgICAgcmV0dXJuIDE7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworfQorVlA4Q1BVSW5mbyBWUDhHZXRDUFVJbmZvID0gbWlwc0NQVUluZm87CisjZWxzZQorVlA4Q1BVSW5mbyBWUDhHZXRDUFVJbmZvID0gTlVMTDsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9kZWMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEyMDc5YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZGVjLmMKQEAgLTAsMCArMSw4OTEgQEAKKy8vIENvcHlyaWdodCAyMDEwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBTcGVlZC1jcml0aWNhbCBkZWNvZGluZyBmdW5jdGlvbnMsIGRlZmF1bHQgcGxhaW4tQyBpbXBsZW1lbnRhdGlvbnMuCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL2Fzc2VydF9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RyaW5nX3BvZW0uaCIKKyNlbHNlCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZW5kaWYKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorI2luY2x1ZGUgInNyYy9kZWMvdnA4aV9kZWMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ4X3QgY2xpcF84YihpbnQgdikgeworICByZXR1cm4gKCEodiAmIH4weGZmKSkgPyB2IDogKHYgPCAwKSA/IDAgOiAyNTU7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUcmFuc2Zvcm1zIChQYXJhZ3JhcGggMTQuNCkKKworI2RlZmluZSBTVE9SRSh4LCB5LCB2KSBcCisgIGRzdFsoeCkgKyAoeSkgKiBCUFNdID0gY2xpcF84Yihkc3RbKHgpICsgKHkpICogQlBTXSArICgodikgPj4gMykpCisKKyNkZWZpbmUgU1RPUkUyKHksIGRjLCBkLCBjKSBkbyB7ICAgIFwKKyAgY29uc3QgaW50IERDID0gKGRjKTsgICAgICAgICAgICAgIFwKKyAgU1RPUkUoMCwgeSwgREMgKyAoZCkpOyAgICAgICAgICAgIFwKKyAgU1RPUkUoMSwgeSwgREMgKyAoYykpOyAgICAgICAgICAgIFwKKyAgU1RPUkUoMiwgeSwgREMgLSAoYykpOyAgICAgICAgICAgIFwKKyAgU1RPUkUoMywgeSwgREMgLSAoZCkpOyAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgTVVMMShhKSAoKCgoYSkgKiAyMDA5MSkgPj4gMTYpICsgKGEpKQorI2RlZmluZSBNVUwyKGEpICgoKGEpICogMzU0NjgpID4+IDE2KQorCisjaWYgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorc3RhdGljIHZvaWQgVHJhbnNmb3JtT25lX0MoY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCkgeworICBpbnQgQ1s0ICogNF0sICp0bXA7CisgIGludCBpOworICB0bXAgPSBDOworICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7ICAgIC8vIHZlcnRpY2FsIHBhc3MKKyAgICBjb25zdCBpbnQgYSA9IGluWzBdICsgaW5bOF07ICAgIC8vIFstNDA5NiwgNDA5NF0KKyAgICBjb25zdCBpbnQgYiA9IGluWzBdIC0gaW5bOF07ICAgIC8vIFstNDA5NSwgNDA5NV0KKyAgICBjb25zdCBpbnQgYyA9IE1VTDIoaW5bNF0pIC0gTVVMMShpblsxMl0pOyAgIC8vIFstMzc4MywgMzc4M10KKyAgICBjb25zdCBpbnQgZCA9IE1VTDEoaW5bNF0pICsgTVVMMihpblsxMl0pOyAgIC8vIFstMzc4NSwgMzc4MV0KKyAgICB0bXBbMF0gPSBhICsgZDsgICAvLyBbLTc4ODEsIDc4NzVdCisgICAgdG1wWzFdID0gYiArIGM7ICAgLy8gWy03ODc4LCA3ODc4XQorICAgIHRtcFsyXSA9IGIgLSBjOyAgIC8vIFstNzg3OCwgNzg3OF0KKyAgICB0bXBbM10gPSBhIC0gZDsgICAvLyBbLTc4NzcsIDc4NzldCisgICAgdG1wICs9IDQ7CisgICAgaW4rKzsKKyAgfQorICAvLyBFYWNoIHBhc3MgaXMgZXhwYW5kaW5nIHRoZSBkeW5hbWljIHJhbmdlIGJ5IH4zLjg1ICh1cHBlciBib3VuZCkuCisgIC8vIFRoZSBleGFjdCB2YWx1ZSBpcyAoMi4gKyAoMjAwOTEgKyAzNTQ2OCkgLyA2NTUzNikuCisgIC8vIEFmdGVyIHRoZSBzZWNvbmQgcGFzcywgbWF4aW11bSBpbnRlcnZhbCBpcyBbLTM3OTQsIDM3OTRdLCBhc3N1bWluZworICAvLyBhbiBpbnB1dCBpbiBbLTIwNDgsIDIwNDddIGludGVydmFsLiBXZSB0aGVuIG5lZWQgdG8gYWRkIGEgZHN0IHZhbHVlCisgIC8vIGluIHRoZSBbMCwgMjU1XSByYW5nZS4KKyAgLy8gSW4gdGhlIHdvcnN0IGNhc2Ugc2NlbmFyaW8sIHRoZSBpbnB1dCB0byBjbGlwXzhiKCkgY2FuIGJlIGFzIGxhcmdlIGFzCisgIC8vIFstNjA3MTMsIDYwOTY4XS4KKyAgdG1wID0gQzsKKyAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeyAgICAvLyBob3Jpem9udGFsIHBhc3MKKyAgICBjb25zdCBpbnQgZGMgPSB0bXBbMF0gKyA0OworICAgIGNvbnN0IGludCBhID0gIGRjICsgIHRtcFs4XTsKKyAgICBjb25zdCBpbnQgYiA9ICBkYyAtICB0bXBbOF07CisgICAgY29uc3QgaW50IGMgPSBNVUwyKHRtcFs0XSkgLSBNVUwxKHRtcFsxMl0pOworICAgIGNvbnN0IGludCBkID0gTVVMMSh0bXBbNF0pICsgTVVMMih0bXBbMTJdKTsKKyAgICBTVE9SRSgwLCAwLCBhICsgZCk7CisgICAgU1RPUkUoMSwgMCwgYiArIGMpOworICAgIFNUT1JFKDIsIDAsIGIgLSBjKTsKKyAgICBTVE9SRSgzLCAwLCBhIC0gZCk7CisgICAgdG1wKys7CisgICAgZHN0ICs9IEJQUzsKKyAgfQorfQorCisvLyBTaW1wbGlmaWVkIHRyYW5zZm9ybSB3aGVuIG9ubHkgaW5bMF0sIGluWzFdIGFuZCBpbls0XSBhcmUgbm9uLXplcm8KK3N0YXRpYyB2b2lkIFRyYW5zZm9ybUFDM19DKGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QpIHsKKyAgY29uc3QgaW50IGEgPSBpblswXSArIDQ7CisgIGNvbnN0IGludCBjNCA9IE1VTDIoaW5bNF0pOworICBjb25zdCBpbnQgZDQgPSBNVUwxKGluWzRdKTsKKyAgY29uc3QgaW50IGMxID0gTVVMMihpblsxXSk7CisgIGNvbnN0IGludCBkMSA9IE1VTDEoaW5bMV0pOworICBTVE9SRTIoMCwgYSArIGQ0LCBkMSwgYzEpOworICBTVE9SRTIoMSwgYSArIGM0LCBkMSwgYzEpOworICBTVE9SRTIoMiwgYSAtIGM0LCBkMSwgYzEpOworICBTVE9SRTIoMywgYSAtIGQ0LCBkMSwgYzEpOworfQorI3VuZGVmIE1VTDEKKyN1bmRlZiBNVUwyCisjdW5kZWYgU1RPUkUyCisKK3N0YXRpYyB2b2lkIFRyYW5zZm9ybVR3b19DKGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QsIGludCBkb190d28pIHsKKyAgVHJhbnNmb3JtT25lX0MoaW4sIGRzdCk7CisgIGlmIChkb190d28pIHsKKyAgICBUcmFuc2Zvcm1PbmVfQyhpbiArIDE2LCBkc3QgKyA0KTsKKyAgfQorfQorI2VuZGlmICAvLyAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCisKK3N0YXRpYyB2b2lkIFRyYW5zZm9ybVVWX0MoY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCkgeworICBWUDhUcmFuc2Zvcm0oaW4gKyAwICogMTYsIGRzdCwgMSk7CisgIFZQOFRyYW5zZm9ybShpbiArIDIgKiAxNiwgZHN0ICsgNCAqIEJQUywgMSk7Cit9CisKKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCitzdGF0aWMgdm9pZCBUcmFuc2Zvcm1EQ19DKGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QpIHsKKyAgY29uc3QgaW50IERDID0gaW5bMF0gKyA0OworICBpbnQgaSwgajsKKyAgZm9yIChqID0gMDsgaiA8IDQ7ICsraikgeworICAgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICAgIFNUT1JFKGksIGosIERDKTsKKyAgICB9CisgIH0KK30KKyNlbmRpZiAgLy8gIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorCitzdGF0aWMgdm9pZCBUcmFuc2Zvcm1EQ1VWX0MoY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCkgeworICBpZiAoaW5bMCAqIDE2XSkgVlA4VHJhbnNmb3JtREMoaW4gKyAwICogMTYsIGRzdCk7CisgIGlmIChpblsxICogMTZdKSBWUDhUcmFuc2Zvcm1EQyhpbiArIDEgKiAxNiwgZHN0ICsgNCk7CisgIGlmIChpblsyICogMTZdKSBWUDhUcmFuc2Zvcm1EQyhpbiArIDIgKiAxNiwgZHN0ICsgNCAqIEJQUyk7CisgIGlmIChpblszICogMTZdKSBWUDhUcmFuc2Zvcm1EQyhpbiArIDMgKiAxNiwgZHN0ICsgNCAqIEJQUyArIDQpOworfQorCisjdW5kZWYgU1RPUkUKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFBhcmFncmFwaCAxNC4zCisKKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCitzdGF0aWMgdm9pZCBUcmFuc2Zvcm1XSFRfQyhjb25zdCBpbnQxNl90KiBpbiwgaW50MTZfdCogb3V0KSB7CisgIGludCB0bXBbMTZdOworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeworICAgIGNvbnN0IGludCBhMCA9IGluWzAgKyBpXSArIGluWzEyICsgaV07CisgICAgY29uc3QgaW50IGExID0gaW5bNCArIGldICsgaW5bIDggKyBpXTsKKyAgICBjb25zdCBpbnQgYTIgPSBpbls0ICsgaV0gLSBpblsgOCArIGldOworICAgIGNvbnN0IGludCBhMyA9IGluWzAgKyBpXSAtIGluWzEyICsgaV07CisgICAgdG1wWzAgICsgaV0gPSBhMCArIGExOworICAgIHRtcFs4ICArIGldID0gYTAgLSBhMTsKKyAgICB0bXBbNCAgKyBpXSA9IGEzICsgYTI7CisgICAgdG1wWzEyICsgaV0gPSBhMyAtIGEyOworICB9CisgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICBjb25zdCBpbnQgZGMgPSB0bXBbMCArIGkgKiA0XSArIDM7ICAgIC8vIHcvIHJvdW5kZXIKKyAgICBjb25zdCBpbnQgYTAgPSBkYyAgICAgICAgICAgICArIHRtcFszICsgaSAqIDRdOworICAgIGNvbnN0IGludCBhMSA9IHRtcFsxICsgaSAqIDRdICsgdG1wWzIgKyBpICogNF07CisgICAgY29uc3QgaW50IGEyID0gdG1wWzEgKyBpICogNF0gLSB0bXBbMiArIGkgKiA0XTsKKyAgICBjb25zdCBpbnQgYTMgPSBkYyAgICAgICAgICAgICAtIHRtcFszICsgaSAqIDRdOworICAgIG91dFsgMF0gPSAoYTAgKyBhMSkgPj4gMzsKKyAgICBvdXRbMTZdID0gKGEzICsgYTIpID4+IDM7CisgICAgb3V0WzMyXSA9IChhMCAtIGExKSA+PiAzOworICAgIG91dFs0OF0gPSAoYTMgLSBhMikgPj4gMzsKKyAgICBvdXQgKz0gNjQ7CisgIH0KK30KKyNlbmRpZiAgLy8gIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorCit2b2lkICgqVlA4VHJhbnNmb3JtV0hUKShjb25zdCBpbnQxNl90KiBpbiwgaW50MTZfdCogb3V0KTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEludHJhIHByZWRpY3Rpb25zCisKKyNkZWZpbmUgRFNUKHgsIHkpIGRzdFsoeCkgKyAoeSkgKiBCUFNdCisKKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBUcnVlTW90aW9uKHVpbnQ4X3QqIGRzdCwgaW50IHNpemUpIHsKKyAgY29uc3QgdWludDhfdCogdG9wID0gZHN0IC0gQlBTOworICBjb25zdCB1aW50OF90KiBjb25zdCBjbGlwMCA9IFZQOGtjbGlwMSAtIHRvcFstMV07CisgIGludCB5OworICBmb3IgKHkgPSAwOyB5IDwgc2l6ZTsgKyt5KSB7CisgICAgY29uc3QgdWludDhfdCogY29uc3QgY2xpcCA9IGNsaXAwICsgZHN0Wy0xXTsKKyAgICBpbnQgeDsKKyAgICBmb3IgKHggPSAwOyB4IDwgc2l6ZTsgKyt4KSB7CisgICAgICBkc3RbeF0gPSBjbGlwW3RvcFt4XV07CisgICAgfQorICAgIGRzdCArPSBCUFM7CisgIH0KK30KK3N0YXRpYyB2b2lkIFRNNF9DKHVpbnQ4X3QqIGRzdCkgICB7IFRydWVNb3Rpb24oZHN0LCA0KTsgfQorc3RhdGljIHZvaWQgVE04dXZfQyh1aW50OF90KiBkc3QpIHsgVHJ1ZU1vdGlvbihkc3QsIDgpOyB9CitzdGF0aWMgdm9pZCBUTTE2X0ModWludDhfdCogZHN0KSAgeyBUcnVlTW90aW9uKGRzdCwgMTYpOyB9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAxNngxNgorCitzdGF0aWMgdm9pZCBWRTE2X0ModWludDhfdCogZHN0KSB7ICAgICAvLyB2ZXJ0aWNhbAorICBpbnQgajsKKyAgZm9yIChqID0gMDsgaiA8IDE2OyArK2opIHsKKyAgICBtZW1jcHkoZHN0ICsgaiAqIEJQUywgZHN0IC0gQlBTLCAxNik7CisgIH0KK30KKworc3RhdGljIHZvaWQgSEUxNl9DKHVpbnQ4X3QqIGRzdCkgeyAgICAgLy8gaG9yaXpvbnRhbAorICBpbnQgajsKKyAgZm9yIChqID0gMTY7IGogPiAwOyAtLWopIHsKKyAgICBtZW1zZXQoZHN0LCBkc3RbLTFdLCAxNik7CisgICAgZHN0ICs9IEJQUzsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBQdXQxNihpbnQgdiwgdWludDhfdCogZHN0KSB7CisgIGludCBqOworICBmb3IgKGogPSAwOyBqIDwgMTY7ICsraikgeworICAgIG1lbXNldChkc3QgKyBqICogQlBTLCB2LCAxNik7CisgIH0KK30KKworc3RhdGljIHZvaWQgREMxNl9DKHVpbnQ4X3QqIGRzdCkgeyAgICAvLyBEQworICBpbnQgREMgPSAxNjsKKyAgaW50IGo7CisgIGZvciAoaiA9IDA7IGogPCAxNjsgKytqKSB7CisgICAgREMgKz0gZHN0Wy0xICsgaiAqIEJQU10gKyBkc3RbaiAtIEJQU107CisgIH0KKyAgUHV0MTYoREMgPj4gNSwgZHN0KTsKK30KKworc3RhdGljIHZvaWQgREMxNk5vVG9wX0ModWludDhfdCogZHN0KSB7ICAgLy8gREMgd2l0aCB0b3Agc2FtcGxlcyBub3QgYXZhaWxhYmxlCisgIGludCBEQyA9IDg7CisgIGludCBqOworICBmb3IgKGogPSAwOyBqIDwgMTY7ICsraikgeworICAgIERDICs9IGRzdFstMSArIGogKiBCUFNdOworICB9CisgIFB1dDE2KERDID4+IDQsIGRzdCk7Cit9CisKK3N0YXRpYyB2b2lkIERDMTZOb0xlZnRfQyh1aW50OF90KiBkc3QpIHsgIC8vIERDIHdpdGggbGVmdCBzYW1wbGVzIG5vdCBhdmFpbGFibGUKKyAgaW50IERDID0gODsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSB7CisgICAgREMgKz0gZHN0W2kgLSBCUFNdOworICB9CisgIFB1dDE2KERDID4+IDQsIGRzdCk7Cit9CisKK3N0YXRpYyB2b2lkIERDMTZOb1RvcExlZnRfQyh1aW50OF90KiBkc3QpIHsgIC8vIERDIHdpdGggbm8gdG9wIGFuZCBsZWZ0IHNhbXBsZXMKKyAgUHV0MTYoMHg4MCwgZHN0KTsKK30KKyNlbmRpZiAgLy8gIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorCitWUDhQcmVkRnVuYyBWUDhQcmVkTHVtYTE2W05VTV9CX0RDX01PREVTXTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIDR4NAorCisjZGVmaW5lIEFWRzMoYSwgYiwgYykgKCh1aW50OF90KSgoKGEpICsgMiAqIChiKSArIChjKSArIDIpID4+IDIpKQorI2RlZmluZSBBVkcyKGEsIGIpICgoKGEpICsgKGIpICsgMSkgPj4gMSkKKworI2lmICFXRUJQX05FT05fT01JVF9DX0NPREUKK3N0YXRpYyB2b2lkIFZFNF9DKHVpbnQ4X3QqIGRzdCkgeyAgICAvLyB2ZXJ0aWNhbAorICBjb25zdCB1aW50OF90KiB0b3AgPSBkc3QgLSBCUFM7CisgIGNvbnN0IHVpbnQ4X3QgdmFsc1s0XSA9IHsKKyAgICBBVkczKHRvcFstMV0sIHRvcFswXSwgdG9wWzFdKSwKKyAgICBBVkczKHRvcFsgMF0sIHRvcFsxXSwgdG9wWzJdKSwKKyAgICBBVkczKHRvcFsgMV0sIHRvcFsyXSwgdG9wWzNdKSwKKyAgICBBVkczKHRvcFsgMl0sIHRvcFszXSwgdG9wWzRdKQorICB9OworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeworICAgIG1lbWNweShkc3QgKyBpICogQlBTLCB2YWxzLCBzaXplb2YodmFscykpOworICB9Cit9CisjZW5kaWYgIC8vICFXRUJQX05FT05fT01JVF9DX0NPREUKKworc3RhdGljIHZvaWQgSEU0X0ModWludDhfdCogZHN0KSB7ICAgIC8vIGhvcml6b250YWwKKyAgY29uc3QgaW50IEEgPSBkc3RbLTEgLSBCUFNdOworICBjb25zdCBpbnQgQiA9IGRzdFstMV07CisgIGNvbnN0IGludCBDID0gZHN0Wy0xICsgQlBTXTsKKyAgY29uc3QgaW50IEQgPSBkc3RbLTEgKyAyICogQlBTXTsKKyAgY29uc3QgaW50IEUgPSBkc3RbLTEgKyAzICogQlBTXTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDAgKiBCUFMsIDB4MDEwMTAxMDFVICogQVZHMyhBLCBCLCBDKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAxICogQlBTLCAweDAxMDEwMTAxVSAqIEFWRzMoQiwgQywgRCkpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMiAqIEJQUywgMHgwMTAxMDEwMVUgKiBBVkczKEMsIEQsIEUpKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDMgKiBCUFMsIDB4MDEwMTAxMDFVICogQVZHMyhELCBFLCBFKSk7Cit9CisKKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCitzdGF0aWMgdm9pZCBEQzRfQyh1aW50OF90KiBkc3QpIHsgICAvLyBEQworICB1aW50MzJfdCBkYyA9IDQ7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSBkYyArPSBkc3RbaSAtIEJQU10gKyBkc3RbLTEgKyBpICogQlBTXTsKKyAgZGMgPj49IDM7CisgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIG1lbXNldChkc3QgKyBpICogQlBTLCBkYywgNCk7Cit9CisKK3N0YXRpYyB2b2lkIFJENF9DKHVpbnQ4X3QqIGRzdCkgeyAgIC8vIERvd24tcmlnaHQKKyAgY29uc3QgaW50IEkgPSBkc3RbLTEgKyAwICogQlBTXTsKKyAgY29uc3QgaW50IEogPSBkc3RbLTEgKyAxICogQlBTXTsKKyAgY29uc3QgaW50IEsgPSBkc3RbLTEgKyAyICogQlBTXTsKKyAgY29uc3QgaW50IEwgPSBkc3RbLTEgKyAzICogQlBTXTsKKyAgY29uc3QgaW50IFggPSBkc3RbLTEgLSBCUFNdOworICBjb25zdCBpbnQgQSA9IGRzdFswIC0gQlBTXTsKKyAgY29uc3QgaW50IEIgPSBkc3RbMSAtIEJQU107CisgIGNvbnN0IGludCBDID0gZHN0WzIgLSBCUFNdOworICBjb25zdCBpbnQgRCA9IGRzdFszIC0gQlBTXTsKKyAgRFNUKDAsIDMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gQVZHMyhKLCBLLCBMKTsKKyAgRFNUKDEsIDMpID0gRFNUKDAsIDIpICAgICAgICAgICAgICAgICAgICAgICAgID0gQVZHMyhJLCBKLCBLKTsKKyAgRFNUKDIsIDMpID0gRFNUKDEsIDIpID0gRFNUKDAsIDEpICAgICAgICAgICAgID0gQVZHMyhYLCBJLCBKKTsKKyAgRFNUKDMsIDMpID0gRFNUKDIsIDIpID0gRFNUKDEsIDEpID0gRFNUKDAsIDApID0gQVZHMyhBLCBYLCBJKTsKKyAgICAgICAgICAgICAgRFNUKDMsIDIpID0gRFNUKDIsIDEpID0gRFNUKDEsIDApID0gQVZHMyhCLCBBLCBYKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRFNUKDMsIDEpID0gRFNUKDIsIDApID0gQVZHMyhDLCBCLCBBKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFNUKDMsIDApID0gQVZHMyhELCBDLCBCKTsKK30KKworc3RhdGljIHZvaWQgTEQ0X0ModWludDhfdCogZHN0KSB7ICAgLy8gRG93bi1MZWZ0CisgIGNvbnN0IGludCBBID0gZHN0WzAgLSBCUFNdOworICBjb25zdCBpbnQgQiA9IGRzdFsxIC0gQlBTXTsKKyAgY29uc3QgaW50IEMgPSBkc3RbMiAtIEJQU107CisgIGNvbnN0IGludCBEID0gZHN0WzMgLSBCUFNdOworICBjb25zdCBpbnQgRSA9IGRzdFs0IC0gQlBTXTsKKyAgY29uc3QgaW50IEYgPSBkc3RbNSAtIEJQU107CisgIGNvbnN0IGludCBHID0gZHN0WzYgLSBCUFNdOworICBjb25zdCBpbnQgSCA9IGRzdFs3IC0gQlBTXTsKKyAgRFNUKDAsIDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gQVZHMyhBLCBCLCBDKTsKKyAgRFNUKDEsIDApID0gRFNUKDAsIDEpICAgICAgICAgICAgICAgICAgICAgICAgID0gQVZHMyhCLCBDLCBEKTsKKyAgRFNUKDIsIDApID0gRFNUKDEsIDEpID0gRFNUKDAsIDIpICAgICAgICAgICAgID0gQVZHMyhDLCBELCBFKTsKKyAgRFNUKDMsIDApID0gRFNUKDIsIDEpID0gRFNUKDEsIDIpID0gRFNUKDAsIDMpID0gQVZHMyhELCBFLCBGKTsKKyAgICAgICAgICAgICAgRFNUKDMsIDEpID0gRFNUKDIsIDIpID0gRFNUKDEsIDMpID0gQVZHMyhFLCBGLCBHKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRFNUKDMsIDIpID0gRFNUKDIsIDMpID0gQVZHMyhGLCBHLCBIKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFNUKDMsIDMpID0gQVZHMyhHLCBILCBIKTsKK30KKyNlbmRpZiAgLy8gIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorCitzdGF0aWMgdm9pZCBWUjRfQyh1aW50OF90KiBkc3QpIHsgICAvLyBWZXJ0aWNhbC1SaWdodAorICBjb25zdCBpbnQgSSA9IGRzdFstMSArIDAgKiBCUFNdOworICBjb25zdCBpbnQgSiA9IGRzdFstMSArIDEgKiBCUFNdOworICBjb25zdCBpbnQgSyA9IGRzdFstMSArIDIgKiBCUFNdOworICBjb25zdCBpbnQgWCA9IGRzdFstMSAtIEJQU107CisgIGNvbnN0IGludCBBID0gZHN0WzAgLSBCUFNdOworICBjb25zdCBpbnQgQiA9IGRzdFsxIC0gQlBTXTsKKyAgY29uc3QgaW50IEMgPSBkc3RbMiAtIEJQU107CisgIGNvbnN0IGludCBEID0gZHN0WzMgLSBCUFNdOworICBEU1QoMCwgMCkgPSBEU1QoMSwgMikgPSBBVkcyKFgsIEEpOworICBEU1QoMSwgMCkgPSBEU1QoMiwgMikgPSBBVkcyKEEsIEIpOworICBEU1QoMiwgMCkgPSBEU1QoMywgMikgPSBBVkcyKEIsIEMpOworICBEU1QoMywgMCkgICAgICAgICAgICAgPSBBVkcyKEMsIEQpOworCisgIERTVCgwLCAzKSA9ICAgICAgICAgICAgIEFWRzMoSywgSiwgSSk7CisgIERTVCgwLCAyKSA9ICAgICAgICAgICAgIEFWRzMoSiwgSSwgWCk7CisgIERTVCgwLCAxKSA9IERTVCgxLCAzKSA9IEFWRzMoSSwgWCwgQSk7CisgIERTVCgxLCAxKSA9IERTVCgyLCAzKSA9IEFWRzMoWCwgQSwgQik7CisgIERTVCgyLCAxKSA9IERTVCgzLCAzKSA9IEFWRzMoQSwgQiwgQyk7CisgIERTVCgzLCAxKSA9ICAgICAgICAgICAgIEFWRzMoQiwgQywgRCk7Cit9CisKK3N0YXRpYyB2b2lkIFZMNF9DKHVpbnQ4X3QqIGRzdCkgeyAgIC8vIFZlcnRpY2FsLUxlZnQKKyAgY29uc3QgaW50IEEgPSBkc3RbMCAtIEJQU107CisgIGNvbnN0IGludCBCID0gZHN0WzEgLSBCUFNdOworICBjb25zdCBpbnQgQyA9IGRzdFsyIC0gQlBTXTsKKyAgY29uc3QgaW50IEQgPSBkc3RbMyAtIEJQU107CisgIGNvbnN0IGludCBFID0gZHN0WzQgLSBCUFNdOworICBjb25zdCBpbnQgRiA9IGRzdFs1IC0gQlBTXTsKKyAgY29uc3QgaW50IEcgPSBkc3RbNiAtIEJQU107CisgIGNvbnN0IGludCBIID0gZHN0WzcgLSBCUFNdOworICBEU1QoMCwgMCkgPSAgICAgICAgICAgICBBVkcyKEEsIEIpOworICBEU1QoMSwgMCkgPSBEU1QoMCwgMikgPSBBVkcyKEIsIEMpOworICBEU1QoMiwgMCkgPSBEU1QoMSwgMikgPSBBVkcyKEMsIEQpOworICBEU1QoMywgMCkgPSBEU1QoMiwgMikgPSBBVkcyKEQsIEUpOworCisgIERTVCgwLCAxKSA9ICAgICAgICAgICAgIEFWRzMoQSwgQiwgQyk7CisgIERTVCgxLCAxKSA9IERTVCgwLCAzKSA9IEFWRzMoQiwgQywgRCk7CisgIERTVCgyLCAxKSA9IERTVCgxLCAzKSA9IEFWRzMoQywgRCwgRSk7CisgIERTVCgzLCAxKSA9IERTVCgyLCAzKSA9IEFWRzMoRCwgRSwgRik7CisgICAgICAgICAgICAgIERTVCgzLCAyKSA9IEFWRzMoRSwgRiwgRyk7CisgICAgICAgICAgICAgIERTVCgzLCAzKSA9IEFWRzMoRiwgRywgSCk7Cit9CisKK3N0YXRpYyB2b2lkIEhVNF9DKHVpbnQ4X3QqIGRzdCkgeyAgIC8vIEhvcml6b250YWwtVXAKKyAgY29uc3QgaW50IEkgPSBkc3RbLTEgKyAwICogQlBTXTsKKyAgY29uc3QgaW50IEogPSBkc3RbLTEgKyAxICogQlBTXTsKKyAgY29uc3QgaW50IEsgPSBkc3RbLTEgKyAyICogQlBTXTsKKyAgY29uc3QgaW50IEwgPSBkc3RbLTEgKyAzICogQlBTXTsKKyAgRFNUKDAsIDApID0gICAgICAgICAgICAgQVZHMihJLCBKKTsKKyAgRFNUKDIsIDApID0gRFNUKDAsIDEpID0gQVZHMihKLCBLKTsKKyAgRFNUKDIsIDEpID0gRFNUKDAsIDIpID0gQVZHMihLLCBMKTsKKyAgRFNUKDEsIDApID0gICAgICAgICAgICAgQVZHMyhJLCBKLCBLKTsKKyAgRFNUKDMsIDApID0gRFNUKDEsIDEpID0gQVZHMyhKLCBLLCBMKTsKKyAgRFNUKDMsIDEpID0gRFNUKDEsIDIpID0gQVZHMyhLLCBMLCBMKTsKKyAgRFNUKDMsIDIpID0gRFNUKDIsIDIpID0KKyAgICBEU1QoMCwgMykgPSBEU1QoMSwgMykgPSBEU1QoMiwgMykgPSBEU1QoMywgMykgPSBMOworfQorCitzdGF0aWMgdm9pZCBIRDRfQyh1aW50OF90KiBkc3QpIHsgIC8vIEhvcml6b250YWwtRG93bgorICBjb25zdCBpbnQgSSA9IGRzdFstMSArIDAgKiBCUFNdOworICBjb25zdCBpbnQgSiA9IGRzdFstMSArIDEgKiBCUFNdOworICBjb25zdCBpbnQgSyA9IGRzdFstMSArIDIgKiBCUFNdOworICBjb25zdCBpbnQgTCA9IGRzdFstMSArIDMgKiBCUFNdOworICBjb25zdCBpbnQgWCA9IGRzdFstMSAtIEJQU107CisgIGNvbnN0IGludCBBID0gZHN0WzAgLSBCUFNdOworICBjb25zdCBpbnQgQiA9IGRzdFsxIC0gQlBTXTsKKyAgY29uc3QgaW50IEMgPSBkc3RbMiAtIEJQU107CisKKyAgRFNUKDAsIDApID0gRFNUKDIsIDEpID0gQVZHMihJLCBYKTsKKyAgRFNUKDAsIDEpID0gRFNUKDIsIDIpID0gQVZHMihKLCBJKTsKKyAgRFNUKDAsIDIpID0gRFNUKDIsIDMpID0gQVZHMihLLCBKKTsKKyAgRFNUKDAsIDMpICAgICAgICAgICAgID0gQVZHMihMLCBLKTsKKworICBEU1QoMywgMCkgICAgICAgICAgICAgPSBBVkczKEEsIEIsIEMpOworICBEU1QoMiwgMCkgICAgICAgICAgICAgPSBBVkczKFgsIEEsIEIpOworICBEU1QoMSwgMCkgPSBEU1QoMywgMSkgPSBBVkczKEksIFgsIEEpOworICBEU1QoMSwgMSkgPSBEU1QoMywgMikgPSBBVkczKEosIEksIFgpOworICBEU1QoMSwgMikgPSBEU1QoMywgMykgPSBBVkczKEssIEosIEkpOworICBEU1QoMSwgMykgICAgICAgICAgICAgPSBBVkczKEwsIEssIEopOworfQorCisjdW5kZWYgRFNUCisjdW5kZWYgQVZHMworI3VuZGVmIEFWRzIKKworVlA4UHJlZEZ1bmMgVlA4UHJlZEx1bWE0W05VTV9CTU9ERVNdOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ2hyb21hCisKKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCitzdGF0aWMgdm9pZCBWRTh1dl9DKHVpbnQ4X3QqIGRzdCkgeyAgICAvLyB2ZXJ0aWNhbAorICBpbnQgajsKKyAgZm9yIChqID0gMDsgaiA8IDg7ICsraikgeworICAgIG1lbWNweShkc3QgKyBqICogQlBTLCBkc3QgLSBCUFMsIDgpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIEhFOHV2X0ModWludDhfdCogZHN0KSB7ICAgIC8vIGhvcml6b250YWwKKyAgaW50IGo7CisgIGZvciAoaiA9IDA7IGogPCA4OyArK2opIHsKKyAgICBtZW1zZXQoZHN0LCBkc3RbLTFdLCA4KTsKKyAgICBkc3QgKz0gQlBTOworICB9Cit9CisKKy8vIGhlbHBlciBmb3IgY2hyb21hLURDIHByZWRpY3Rpb25zCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBQdXQ4eDh1dih1aW50OF90IHZhbHVlLCB1aW50OF90KiBkc3QpIHsKKyAgaW50IGo7CisgIGZvciAoaiA9IDA7IGogPCA4OyArK2opIHsKKyAgICBtZW1zZXQoZHN0ICsgaiAqIEJQUywgdmFsdWUsIDgpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIERDOHV2X0ModWludDhfdCogZHN0KSB7ICAgICAvLyBEQworICBpbnQgZGMwID0gODsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCA4OyArK2kpIHsKKyAgICBkYzAgKz0gZHN0W2kgLSBCUFNdICsgZHN0Wy0xICsgaSAqIEJQU107CisgIH0KKyAgUHV0OHg4dXYoZGMwID4+IDQsIGRzdCk7Cit9CisKK3N0YXRpYyB2b2lkIERDOHV2Tm9MZWZ0X0ModWludDhfdCogZHN0KSB7ICAgLy8gREMgd2l0aCBubyBsZWZ0IHNhbXBsZXMKKyAgaW50IGRjMCA9IDQ7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgODsgKytpKSB7CisgICAgZGMwICs9IGRzdFtpIC0gQlBTXTsKKyAgfQorICBQdXQ4eDh1dihkYzAgPj4gMywgZHN0KTsKK30KKworc3RhdGljIHZvaWQgREM4dXZOb1RvcF9DKHVpbnQ4X3QqIGRzdCkgeyAgLy8gREMgd2l0aCBubyB0b3Agc2FtcGxlcworICBpbnQgZGMwID0gNDsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCA4OyArK2kpIHsKKyAgICBkYzAgKz0gZHN0Wy0xICsgaSAqIEJQU107CisgIH0KKyAgUHV0OHg4dXYoZGMwID4+IDMsIGRzdCk7Cit9CisKK3N0YXRpYyB2b2lkIERDOHV2Tm9Ub3BMZWZ0X0ModWludDhfdCogZHN0KSB7ICAgIC8vIERDIHdpdGggbm90aGluZworICBQdXQ4eDh1digweDgwLCBkc3QpOworfQorI2VuZGlmICAvLyAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCisKK1ZQOFByZWRGdW5jIFZQOFByZWRDaHJvbWE4W05VTV9CX0RDX01PREVTXTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVkZ2UgZmlsdGVyaW5nIGZ1bmN0aW9ucworCisjaWYgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERSB8fCBXRUJQX05FT05fV09SS19BUk9VTkRfR0NDCisvLyA0IHBpeGVscyBpbiwgMiBwaXhlbHMgb3V0CitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEb0ZpbHRlcjJfQyh1aW50OF90KiBwLCBpbnQgc3RlcCkgeworICBjb25zdCBpbnQgcDEgPSBwWy0yKnN0ZXBdLCBwMCA9IHBbLXN0ZXBdLCBxMCA9IHBbMF0sIHExID0gcFtzdGVwXTsKKyAgY29uc3QgaW50IGEgPSAzICogKHEwIC0gcDApICsgVlA4a3NjbGlwMVtwMSAtIHExXTsgIC8vIGluIFstODkzLDg5Ml0KKyAgY29uc3QgaW50IGExID0gVlA4a3NjbGlwMlsoYSArIDQpID4+IDNdOyAgICAgICAgICAgIC8vIGluIFstMTYsMTVdCisgIGNvbnN0IGludCBhMiA9IFZQOGtzY2xpcDJbKGEgKyAzKSA+PiAzXTsKKyAgcFstc3RlcF0gPSBWUDhrY2xpcDFbcDAgKyBhMl07CisgIHBbICAgIDBdID0gVlA4a2NsaXAxW3EwIC0gYTFdOworfQorCisvLyA0IHBpeGVscyBpbiwgNCBwaXhlbHMgb3V0CitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEb0ZpbHRlcjRfQyh1aW50OF90KiBwLCBpbnQgc3RlcCkgeworICBjb25zdCBpbnQgcDEgPSBwWy0yKnN0ZXBdLCBwMCA9IHBbLXN0ZXBdLCBxMCA9IHBbMF0sIHExID0gcFtzdGVwXTsKKyAgY29uc3QgaW50IGEgPSAzICogKHEwIC0gcDApOworICBjb25zdCBpbnQgYTEgPSBWUDhrc2NsaXAyWyhhICsgNCkgPj4gM107CisgIGNvbnN0IGludCBhMiA9IFZQOGtzY2xpcDJbKGEgKyAzKSA+PiAzXTsKKyAgY29uc3QgaW50IGEzID0gKGExICsgMSkgPj4gMTsKKyAgcFstMipzdGVwXSA9IFZQOGtjbGlwMVtwMSArIGEzXTsKKyAgcFstICBzdGVwXSA9IFZQOGtjbGlwMVtwMCArIGEyXTsKKyAgcFsgICAgICAwXSA9IFZQOGtjbGlwMVtxMCAtIGExXTsKKyAgcFsgICBzdGVwXSA9IFZQOGtjbGlwMVtxMSAtIGEzXTsKK30KKworLy8gNiBwaXhlbHMgaW4sIDYgcGl4ZWxzIG91dAorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRG9GaWx0ZXI2X0ModWludDhfdCogcCwgaW50IHN0ZXApIHsKKyAgY29uc3QgaW50IHAyID0gcFstMypzdGVwXSwgcDEgPSBwWy0yKnN0ZXBdLCBwMCA9IHBbLXN0ZXBdOworICBjb25zdCBpbnQgcTAgPSBwWzBdLCBxMSA9IHBbc3RlcF0sIHEyID0gcFsyKnN0ZXBdOworICBjb25zdCBpbnQgYSA9IFZQOGtzY2xpcDFbMyAqIChxMCAtIHAwKSArIFZQOGtzY2xpcDFbcDEgLSBxMV1dOworICAvLyBhIGlzIGluIFstMTI4LDEyN10sIGExIGluIFstMjcsMjddLCBhMiBpbiBbLTE4LDE4XSBhbmQgYTMgaW4gWy05LDldCisgIGNvbnN0IGludCBhMSA9ICgyNyAqIGEgKyA2MykgPj4gNzsgIC8vIGVxLiB0byAoKDMgKiBhICsgNykgKiA5KSA+PiA3CisgIGNvbnN0IGludCBhMiA9ICgxOCAqIGEgKyA2MykgPj4gNzsgIC8vIGVxLiB0byAoKDIgKiBhICsgNykgKiA5KSA+PiA3CisgIGNvbnN0IGludCBhMyA9ICg5ICAqIGEgKyA2MykgPj4gNzsgIC8vIGVxLiB0byAoKDEgKiBhICsgNykgKiA5KSA+PiA3CisgIHBbLTMqc3RlcF0gPSBWUDhrY2xpcDFbcDIgKyBhM107CisgIHBbLTIqc3RlcF0gPSBWUDhrY2xpcDFbcDEgKyBhMl07CisgIHBbLSAgc3RlcF0gPSBWUDhrY2xpcDFbcDAgKyBhMV07CisgIHBbICAgICAgMF0gPSBWUDhrY2xpcDFbcTAgLSBhMV07CisgIHBbICAgc3RlcF0gPSBWUDhrY2xpcDFbcTEgLSBhMl07CisgIHBbIDIqc3RlcF0gPSBWUDhrY2xpcDFbcTIgLSBhM107Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgSGV2KGNvbnN0IHVpbnQ4X3QqIHAsIGludCBzdGVwLCBpbnQgdGhyZXNoKSB7CisgIGNvbnN0IGludCBwMSA9IHBbLTIqc3RlcF0sIHAwID0gcFstc3RlcF0sIHEwID0gcFswXSwgcTEgPSBwW3N0ZXBdOworICByZXR1cm4gKFZQOGthYnMwW3AxIC0gcDBdID4gdGhyZXNoKSB8fCAoVlA4a2FiczBbcTEgLSBxMF0gPiB0aHJlc2gpOworfQorI2VuZGlmICAvLyAhV0VCUF9ORU9OX09NSVRfQ19DT0RFIHx8IFdFQlBfTkVPTl9XT1JLX0FST1VORF9HQ0MKKworI2lmICFXRUJQX05FT05fT01JVF9DX0NPREUKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgTmVlZHNGaWx0ZXJfQyhjb25zdCB1aW50OF90KiBwLCBpbnQgc3RlcCwgaW50IHQpIHsKKyAgY29uc3QgaW50IHAxID0gcFstMiAqIHN0ZXBdLCBwMCA9IHBbLXN0ZXBdLCBxMCA9IHBbMF0sIHExID0gcFtzdGVwXTsKKyAgcmV0dXJuICgoNCAqIFZQOGthYnMwW3AwIC0gcTBdICsgVlA4a2FiczBbcDEgLSBxMV0pIDw9IHQpOworfQorI2VuZGlmICAvLyAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCisKKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFIHx8IFdFQlBfTkVPTl9XT1JLX0FST1VORF9HQ0MKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgTmVlZHNGaWx0ZXIyX0MoY29uc3QgdWludDhfdCogcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0ZXAsIGludCB0LCBpbnQgaXQpIHsKKyAgY29uc3QgaW50IHAzID0gcFstNCAqIHN0ZXBdLCBwMiA9IHBbLTMgKiBzdGVwXSwgcDEgPSBwWy0yICogc3RlcF07CisgIGNvbnN0IGludCBwMCA9IHBbLXN0ZXBdLCBxMCA9IHBbMF07CisgIGNvbnN0IGludCBxMSA9IHBbc3RlcF0sIHEyID0gcFsyICogc3RlcF0sIHEzID0gcFszICogc3RlcF07CisgIGlmICgoNCAqIFZQOGthYnMwW3AwIC0gcTBdICsgVlA4a2FiczBbcDEgLSBxMV0pID4gdCkgcmV0dXJuIDA7CisgIHJldHVybiBWUDhrYWJzMFtwMyAtIHAyXSA8PSBpdCAmJiBWUDhrYWJzMFtwMiAtIHAxXSA8PSBpdCAmJgorICAgICAgICAgVlA4a2FiczBbcDEgLSBwMF0gPD0gaXQgJiYgVlA4a2FiczBbcTMgLSBxMl0gPD0gaXQgJiYKKyAgICAgICAgIFZQOGthYnMwW3EyIC0gcTFdIDw9IGl0ICYmIFZQOGthYnMwW3ExIC0gcTBdIDw9IGl0OworfQorI2VuZGlmICAvLyAhV0VCUF9ORU9OX09NSVRfQ19DT0RFIHx8IFdFQlBfTkVPTl9XT1JLX0FST1VORF9HQ0MKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFNpbXBsZSBJbi1sb29wIGZpbHRlcmluZyAoUGFyYWdyYXBoIDE1LjIpCisKKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCitzdGF0aWMgdm9pZCBTaW1wbGVWRmlsdGVyMTZfQyh1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKSB7CisgIGludCBpOworICBjb25zdCBpbnQgdGhyZXNoMiA9IDIgKiB0aHJlc2ggKyAxOworICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgeworICAgIGlmIChOZWVkc0ZpbHRlcl9DKHAgKyBpLCBzdHJpZGUsIHRocmVzaDIpKSB7CisgICAgICBEb0ZpbHRlcjJfQyhwICsgaSwgc3RyaWRlKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgU2ltcGxlSEZpbHRlcjE2X0ModWludDhfdCogcCwgaW50IHN0cmlkZSwgaW50IHRocmVzaCkgeworICBpbnQgaTsKKyAgY29uc3QgaW50IHRocmVzaDIgPSAyICogdGhyZXNoICsgMTsKKyAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIHsKKyAgICBpZiAoTmVlZHNGaWx0ZXJfQyhwICsgaSAqIHN0cmlkZSwgMSwgdGhyZXNoMikpIHsKKyAgICAgIERvRmlsdGVyMl9DKHAgKyBpICogc3RyaWRlLCAxKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgU2ltcGxlVkZpbHRlcjE2aV9DKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsIGludCB0aHJlc2gpIHsKKyAgaW50IGs7CisgIGZvciAoayA9IDM7IGsgPiAwOyAtLWspIHsKKyAgICBwICs9IDQgKiBzdHJpZGU7CisgICAgU2ltcGxlVkZpbHRlcjE2X0MocCwgc3RyaWRlLCB0aHJlc2gpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFNpbXBsZUhGaWx0ZXIxNmlfQyh1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKSB7CisgIGludCBrOworICBmb3IgKGsgPSAzOyBrID4gMDsgLS1rKSB7CisgICAgcCArPSA0OworICAgIFNpbXBsZUhGaWx0ZXIxNl9DKHAsIHN0cmlkZSwgdGhyZXNoKTsKKyAgfQorfQorI2VuZGlmICAvLyAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb21wbGV4IEluLWxvb3AgZmlsdGVyaW5nIChQYXJhZ3JhcGggMTUuMykKKworI2lmICFXRUJQX05FT05fT01JVF9DX0NPREUgfHwgV0VCUF9ORU9OX1dPUktfQVJPVU5EX0dDQworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRmlsdGVyTG9vcDI2X0ModWludDhfdCogcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoc3RyaWRlLCBpbnQgdnN0cmlkZSwgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZXZfdGhyZXNoKSB7CisgIGNvbnN0IGludCB0aHJlc2gyID0gMiAqIHRocmVzaCArIDE7CisgIHdoaWxlIChzaXplLS0gPiAwKSB7CisgICAgaWYgKE5lZWRzRmlsdGVyMl9DKHAsIGhzdHJpZGUsIHRocmVzaDIsIGl0aHJlc2gpKSB7CisgICAgICBpZiAoSGV2KHAsIGhzdHJpZGUsIGhldl90aHJlc2gpKSB7CisgICAgICAgIERvRmlsdGVyMl9DKHAsIGhzdHJpZGUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgRG9GaWx0ZXI2X0MocCwgaHN0cmlkZSk7CisgICAgICB9CisgICAgfQorICAgIHAgKz0gdnN0cmlkZTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBGaWx0ZXJMb29wMjRfQyh1aW50OF90KiBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhzdHJpZGUsIGludCB2c3RyaWRlLCBpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhldl90aHJlc2gpIHsKKyAgY29uc3QgaW50IHRocmVzaDIgPSAyICogdGhyZXNoICsgMTsKKyAgd2hpbGUgKHNpemUtLSA+IDApIHsKKyAgICBpZiAoTmVlZHNGaWx0ZXIyX0MocCwgaHN0cmlkZSwgdGhyZXNoMiwgaXRocmVzaCkpIHsKKyAgICAgIGlmIChIZXYocCwgaHN0cmlkZSwgaGV2X3RocmVzaCkpIHsKKyAgICAgICAgRG9GaWx0ZXIyX0MocCwgaHN0cmlkZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBEb0ZpbHRlcjRfQyhwLCBoc3RyaWRlKTsKKyAgICAgIH0KKyAgICB9CisgICAgcCArPSB2c3RyaWRlOworICB9Cit9CisjZW5kaWYgIC8vICFXRUJQX05FT05fT01JVF9DX0NPREUgfHwgV0VCUF9ORU9OX1dPUktfQVJPVU5EX0dDQworCisjaWYgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorLy8gb24gbWFjcm9ibG9jayBlZGdlcworc3RhdGljIHZvaWQgVkZpbHRlcjE2X0ModWludDhfdCogcCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICBGaWx0ZXJMb29wMjZfQyhwLCBzdHJpZGUsIDEsIDE2LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworfQorCitzdGF0aWMgdm9pZCBIRmlsdGVyMTZfQyh1aW50OF90KiBwLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIEZpbHRlckxvb3AyNl9DKHAsIDEsIHN0cmlkZSwgMTYsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7Cit9CisKKy8vIG9uIHRocmVlIGlubmVyIGVkZ2VzCitzdGF0aWMgdm9pZCBWRmlsdGVyMTZpX0ModWludDhfdCogcCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgaW50IGs7CisgIGZvciAoayA9IDM7IGsgPiAwOyAtLWspIHsKKyAgICBwICs9IDQgKiBzdHJpZGU7CisgICAgRmlsdGVyTG9vcDI0X0MocCwgc3RyaWRlLCAxLCAxNiwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKKyAgfQorfQorI2VuZGlmICAvLyAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCisKKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFIHx8IFdFQlBfTkVPTl9XT1JLX0FST1VORF9HQ0MKK3N0YXRpYyB2b2lkIEhGaWx0ZXIxNmlfQyh1aW50OF90KiBwLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICBpbnQgazsKKyAgZm9yIChrID0gMzsgayA+IDA7IC0taykgeworICAgIHAgKz0gNDsKKyAgICBGaWx0ZXJMb29wMjRfQyhwLCAxLCBzdHJpZGUsIDE2LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworICB9Cit9CisjZW5kaWYgIC8vICFXRUJQX05FT05fT01JVF9DX0NPREUgfHwgV0VCUF9ORU9OX1dPUktfQVJPVU5EX0dDQworCisjaWYgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorLy8gOC1waXhlbHMgd2lkZSB2YXJpYW50LCBmb3IgY2hyb21hIGZpbHRlcmluZworc3RhdGljIHZvaWQgVkZpbHRlcjhfQyh1aW50OF90KiB1LCB1aW50OF90KiB2LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgRmlsdGVyTG9vcDI2X0ModSwgc3RyaWRlLCAxLCA4LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworICBGaWx0ZXJMb29wMjZfQyh2LCBzdHJpZGUsIDEsIDgsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7Cit9CisjZW5kaWYgIC8vICFXRUJQX05FT05fT01JVF9DX0NPREUKKworI2lmICFXRUJQX05FT05fT01JVF9DX0NPREUgfHwgV0VCUF9ORU9OX1dPUktfQVJPVU5EX0dDQworc3RhdGljIHZvaWQgSEZpbHRlcjhfQyh1aW50OF90KiB1LCB1aW50OF90KiB2LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgRmlsdGVyTG9vcDI2X0ModSwgMSwgc3RyaWRlLCA4LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworICBGaWx0ZXJMb29wMjZfQyh2LCAxLCBzdHJpZGUsIDgsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7Cit9CisjZW5kaWYgIC8vICFXRUJQX05FT05fT01JVF9DX0NPREUgfHwgV0VCUF9ORU9OX1dPUktfQVJPVU5EX0dDQworCisjaWYgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorc3RhdGljIHZvaWQgVkZpbHRlcjhpX0ModWludDhfdCogdSwgdWludDhfdCogdiwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICBGaWx0ZXJMb29wMjRfQyh1ICsgNCAqIHN0cmlkZSwgc3RyaWRlLCAxLCA4LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworICBGaWx0ZXJMb29wMjRfQyh2ICsgNCAqIHN0cmlkZSwgc3RyaWRlLCAxLCA4LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworfQorI2VuZGlmICAvLyAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCisKKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFIHx8IFdFQlBfTkVPTl9XT1JLX0FST1VORF9HQ0MKK3N0YXRpYyB2b2lkIEhGaWx0ZXI4aV9DKHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgRmlsdGVyTG9vcDI0X0ModSArIDQsIDEsIHN0cmlkZSwgOCwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKKyAgRmlsdGVyTG9vcDI0X0ModiArIDQsIDEsIHN0cmlkZSwgOCwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKK30KKyNlbmRpZiAgLy8gIVdFQlBfTkVPTl9PTUlUX0NfQ09ERSB8fCBXRUJQX05FT05fV09SS19BUk9VTkRfR0NDCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIERpdGhlckNvbWJpbmU4eDhfQyhjb25zdCB1aW50OF90KiBkaXRoZXIsIHVpbnQ4X3QqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X3N0cmlkZSkgeworICBpbnQgaSwgajsKKyAgZm9yIChqID0gMDsgaiA8IDg7ICsraikgeworICAgIGZvciAoaSA9IDA7IGkgPCA4OyArK2kpIHsKKyAgICAgIGNvbnN0IGludCBkZWx0YTAgPSBkaXRoZXJbaV0gLSBWUDhfRElUSEVSX0FNUF9DRU5URVI7CisgICAgICBjb25zdCBpbnQgZGVsdGExID0KKyAgICAgICAgICAoZGVsdGEwICsgVlA4X0RJVEhFUl9ERVNDQUxFX1JPVU5ERVIpID4+IFZQOF9ESVRIRVJfREVTQ0FMRTsKKyAgICAgIGRzdFtpXSA9IGNsaXBfOGIoKGludClkc3RbaV0gKyBkZWx0YTEpOworICAgIH0KKyAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKyAgICBkaXRoZXIgKz0gODsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitWUDhEZWNJZGN0MiBWUDhUcmFuc2Zvcm07CitWUDhEZWNJZGN0IFZQOFRyYW5zZm9ybUFDMzsKK1ZQOERlY0lkY3QgVlA4VHJhbnNmb3JtVVY7CitWUDhEZWNJZGN0IFZQOFRyYW5zZm9ybURDOworVlA4RGVjSWRjdCBWUDhUcmFuc2Zvcm1EQ1VWOworCitWUDhMdW1hRmlsdGVyRnVuYyBWUDhWRmlsdGVyMTY7CitWUDhMdW1hRmlsdGVyRnVuYyBWUDhIRmlsdGVyMTY7CitWUDhDaHJvbWFGaWx0ZXJGdW5jIFZQOFZGaWx0ZXI4OworVlA4Q2hyb21hRmlsdGVyRnVuYyBWUDhIRmlsdGVyODsKK1ZQOEx1bWFGaWx0ZXJGdW5jIFZQOFZGaWx0ZXIxNmk7CitWUDhMdW1hRmlsdGVyRnVuYyBWUDhIRmlsdGVyMTZpOworVlA4Q2hyb21hRmlsdGVyRnVuYyBWUDhWRmlsdGVyOGk7CitWUDhDaHJvbWFGaWx0ZXJGdW5jIFZQOEhGaWx0ZXI4aTsKK1ZQOFNpbXBsZUZpbHRlckZ1bmMgVlA4U2ltcGxlVkZpbHRlcjE2OworVlA4U2ltcGxlRmlsdGVyRnVuYyBWUDhTaW1wbGVIRmlsdGVyMTY7CitWUDhTaW1wbGVGaWx0ZXJGdW5jIFZQOFNpbXBsZVZGaWx0ZXIxNmk7CitWUDhTaW1wbGVGaWx0ZXJGdW5jIFZQOFNpbXBsZUhGaWx0ZXIxNmk7CisKK3ZvaWQgKCpWUDhEaXRoZXJDb21iaW5lOHg4KShjb25zdCB1aW50OF90KiBkaXRoZXIsIHVpbnQ4X3QqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X3N0cmlkZSk7CisKK2V4dGVybiB2b2lkIFZQOERzcEluaXRTU0UyKHZvaWQpOworZXh0ZXJuIHZvaWQgVlA4RHNwSW5pdFNTRTQxKHZvaWQpOworZXh0ZXJuIHZvaWQgVlA4RHNwSW5pdE5FT04odm9pZCk7CitleHRlcm4gdm9pZCBWUDhEc3BJbml0TUlQUzMyKHZvaWQpOworZXh0ZXJuIHZvaWQgVlA4RHNwSW5pdE1JUFNkc3BSMih2b2lkKTsKK2V4dGVybiB2b2lkIFZQOERzcEluaXRNU0Eodm9pZCk7CisKK1dFQlBfRFNQX0lOSVRfRlVOQyhWUDhEc3BJbml0KSB7CisgIFZQOEluaXRDbGlwVGFibGVzKCk7CisKKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCisgIFZQOFRyYW5zZm9ybVdIVCA9IFRyYW5zZm9ybVdIVF9DOworICBWUDhUcmFuc2Zvcm0gPSBUcmFuc2Zvcm1Ud29fQzsKKyAgVlA4VHJhbnNmb3JtREMgPSBUcmFuc2Zvcm1EQ19DOworICBWUDhUcmFuc2Zvcm1BQzMgPSBUcmFuc2Zvcm1BQzNfQzsKKyNlbmRpZgorICBWUDhUcmFuc2Zvcm1VViA9IFRyYW5zZm9ybVVWX0M7CisgIFZQOFRyYW5zZm9ybURDVVYgPSBUcmFuc2Zvcm1EQ1VWX0M7CisKKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCisgIFZQOFZGaWx0ZXIxNiA9IFZGaWx0ZXIxNl9DOworICBWUDhWRmlsdGVyMTZpID0gVkZpbHRlcjE2aV9DOworICBWUDhIRmlsdGVyMTYgPSBIRmlsdGVyMTZfQzsKKyAgVlA4VkZpbHRlcjggPSBWRmlsdGVyOF9DOworICBWUDhWRmlsdGVyOGkgPSBWRmlsdGVyOGlfQzsKKyAgVlA4U2ltcGxlVkZpbHRlcjE2ID0gU2ltcGxlVkZpbHRlcjE2X0M7CisgIFZQOFNpbXBsZUhGaWx0ZXIxNiA9IFNpbXBsZUhGaWx0ZXIxNl9DOworICBWUDhTaW1wbGVWRmlsdGVyMTZpID0gU2ltcGxlVkZpbHRlcjE2aV9DOworICBWUDhTaW1wbGVIRmlsdGVyMTZpID0gU2ltcGxlSEZpbHRlcjE2aV9DOworI2VuZGlmCisKKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFIHx8IFdFQlBfTkVPTl9XT1JLX0FST1VORF9HQ0MKKyAgVlA4SEZpbHRlcjE2aSA9IEhGaWx0ZXIxNmlfQzsKKyAgVlA4SEZpbHRlcjggPSBIRmlsdGVyOF9DOworICBWUDhIRmlsdGVyOGkgPSBIRmlsdGVyOGlfQzsKKyNlbmRpZgorCisjaWYgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorICBWUDhQcmVkTHVtYTRbMF0gPSBEQzRfQzsKKyAgVlA4UHJlZEx1bWE0WzFdID0gVE00X0M7CisgIFZQOFByZWRMdW1hNFsyXSA9IFZFNF9DOworICBWUDhQcmVkTHVtYTRbNF0gPSBSRDRfQzsKKyAgVlA4UHJlZEx1bWE0WzZdID0gTEQ0X0M7CisjZW5kaWYKKworICBWUDhQcmVkTHVtYTRbM10gPSBIRTRfQzsKKyAgVlA4UHJlZEx1bWE0WzVdID0gVlI0X0M7CisgIFZQOFByZWRMdW1hNFs3XSA9IFZMNF9DOworICBWUDhQcmVkTHVtYTRbOF0gPSBIRDRfQzsKKyAgVlA4UHJlZEx1bWE0WzldID0gSFU0X0M7CisKKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCisgIFZQOFByZWRMdW1hMTZbMF0gPSBEQzE2X0M7CisgIFZQOFByZWRMdW1hMTZbMV0gPSBUTTE2X0M7CisgIFZQOFByZWRMdW1hMTZbMl0gPSBWRTE2X0M7CisgIFZQOFByZWRMdW1hMTZbM10gPSBIRTE2X0M7CisgIFZQOFByZWRMdW1hMTZbNF0gPSBEQzE2Tm9Ub3BfQzsKKyAgVlA4UHJlZEx1bWExNls1XSA9IERDMTZOb0xlZnRfQzsKKyAgVlA4UHJlZEx1bWExNls2XSA9IERDMTZOb1RvcExlZnRfQzsKKworICBWUDhQcmVkQ2hyb21hOFswXSA9IERDOHV2X0M7CisgIFZQOFByZWRDaHJvbWE4WzFdID0gVE04dXZfQzsKKyAgVlA4UHJlZENocm9tYThbMl0gPSBWRTh1dl9DOworICBWUDhQcmVkQ2hyb21hOFszXSA9IEhFOHV2X0M7CisgIFZQOFByZWRDaHJvbWE4WzRdID0gREM4dXZOb1RvcF9DOworICBWUDhQcmVkQ2hyb21hOFs1XSA9IERDOHV2Tm9MZWZ0X0M7CisgIFZQOFByZWRDaHJvbWE4WzZdID0gREM4dXZOb1RvcExlZnRfQzsKKyNlbmRpZgorCisgIFZQOERpdGhlckNvbWJpbmU4eDggPSBEaXRoZXJDb21iaW5lOHg4X0M7CisKKyAgLy8gSWYgZGVmaW5lZCwgdXNlIENQVUluZm8oKSB0byBvdmVyd3JpdGUgc29tZSBwb2ludGVycyB3aXRoIGZhc3RlciB2ZXJzaW9ucy4KKyAgaWYgKFZQOEdldENQVUluZm8gIT0gTlVMTCkgeworI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFMikKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrU1NFMikpIHsKKyAgICAgIFZQOERzcEluaXRTU0UyKCk7CisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0U0MSkKKyAgICAgIGlmIChWUDhHZXRDUFVJbmZvKGtTU0U0XzEpKSB7CisgICAgICAgIFZQOERzcEluaXRTU0U0MSgpOworICAgICAgfQorI2VuZGlmCisgICAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTMzIpCisgICAgaWYgKFZQOEdldENQVUluZm8oa01JUFMzMikpIHsKKyAgICAgIFZQOERzcEluaXRNSVBTMzIoKTsKKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFNfRFNQX1IyKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtNSVBTZHNwUjIpKSB7CisgICAgICBWUDhEc3BJbml0TUlQU2RzcFIyKCk7CisgICAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NU0EpCisgICAgaWYgKFZQOEdldENQVUluZm8oa01TQSkpIHsKKyAgICAgIFZQOERzcEluaXRNU0EoKTsKKyAgICB9CisjZW5kaWYKKyAgfQorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9ORU9OKQorICBpZiAoV0VCUF9ORU9OX09NSVRfQ19DT0RFIHx8CisgICAgICAoVlA4R2V0Q1BVSW5mbyAhPSBOVUxMICYmIFZQOEdldENQVUluZm8oa05FT04pKSkgeworICAgIFZQOERzcEluaXRORU9OKCk7CisgIH0KKyNlbmRpZgorCisgIGFzc2VydChWUDhUcmFuc2Zvcm1XSFQgIT0gTlVMTCk7CisgIGFzc2VydChWUDhUcmFuc2Zvcm0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhUcmFuc2Zvcm1EQyAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOFRyYW5zZm9ybUFDMyAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOFRyYW5zZm9ybVVWICE9IE5VTEwpOworICBhc3NlcnQoVlA4VHJhbnNmb3JtRENVViAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOFZGaWx0ZXIxNiAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOEhGaWx0ZXIxNiAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOFZGaWx0ZXI4ICE9IE5VTEwpOworICBhc3NlcnQoVlA4SEZpbHRlcjggIT0gTlVMTCk7CisgIGFzc2VydChWUDhWRmlsdGVyMTZpICE9IE5VTEwpOworICBhc3NlcnQoVlA4SEZpbHRlcjE2aSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOFZGaWx0ZXI4aSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOEhGaWx0ZXI4aSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOFNpbXBsZVZGaWx0ZXIxNiAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOFNpbXBsZUhGaWx0ZXIxNiAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOFNpbXBsZVZGaWx0ZXIxNmkgIT0gTlVMTCk7CisgIGFzc2VydChWUDhTaW1wbGVIRmlsdGVyMTZpICE9IE5VTEwpOworICBhc3NlcnQoVlA4UHJlZEx1bWE0WzBdICE9IE5VTEwpOworICBhc3NlcnQoVlA4UHJlZEx1bWE0WzFdICE9IE5VTEwpOworICBhc3NlcnQoVlA4UHJlZEx1bWE0WzJdICE9IE5VTEwpOworICBhc3NlcnQoVlA4UHJlZEx1bWE0WzNdICE9IE5VTEwpOworICBhc3NlcnQoVlA4UHJlZEx1bWE0WzRdICE9IE5VTEwpOworICBhc3NlcnQoVlA4UHJlZEx1bWE0WzVdICE9IE5VTEwpOworICBhc3NlcnQoVlA4UHJlZEx1bWE0WzZdICE9IE5VTEwpOworICBhc3NlcnQoVlA4UHJlZEx1bWE0WzddICE9IE5VTEwpOworICBhc3NlcnQoVlA4UHJlZEx1bWE0WzhdICE9IE5VTEwpOworICBhc3NlcnQoVlA4UHJlZEx1bWE0WzldICE9IE5VTEwpOworICBhc3NlcnQoVlA4UHJlZEx1bWExNlswXSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOFByZWRMdW1hMTZbMV0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhQcmVkTHVtYTE2WzJdICE9IE5VTEwpOworICBhc3NlcnQoVlA4UHJlZEx1bWExNlszXSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOFByZWRMdW1hMTZbNF0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhQcmVkTHVtYTE2WzVdICE9IE5VTEwpOworICBhc3NlcnQoVlA4UHJlZEx1bWExNls2XSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOFByZWRDaHJvbWE4WzBdICE9IE5VTEwpOworICBhc3NlcnQoVlA4UHJlZENocm9tYThbMV0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhQcmVkQ2hyb21hOFsyXSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOFByZWRDaHJvbWE4WzNdICE9IE5VTEwpOworICBhc3NlcnQoVlA4UHJlZENocm9tYThbNF0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhQcmVkQ2hyb21hOFs1XSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOFByZWRDaHJvbWE4WzZdICE9IE5VTEwpOworICBhc3NlcnQoVlA4RGl0aGVyQ29tYmluZTh4OCAhPSBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZGVjX2NsaXBfdGFibGVzLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2RlY19jbGlwX3RhYmxlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyN2I3NGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2RlY19jbGlwX3RhYmxlcy5jCkBAIC0wLDAgKzEsMzY5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQ2xpcHBpbmcgdGFibGVzIGZvciBmaWx0ZXJpbmcKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworLy8gZGVmaW5lIHRvIDAgdG8gaGF2ZSBydW4tdGltZSB0YWJsZSBpbml0aWFsaXphdGlvbgorI2lmICFkZWZpbmVkKFVTRV9TVEFUSUNfVEFCTEVTKQorI2RlZmluZSBVU0VfU1RBVElDX1RBQkxFUyAxICAgLy8gQUxURVJOQVRFX0NPREUKKyNlbmRpZgorCisjaWYgKFVTRV9TVEFUSUNfVEFCTEVTID09IDEpCisKK3N0YXRpYyBjb25zdCB1aW50OF90IGFiczBbMjU1ICsgMjU1ICsgMV0gPSB7CisgIDB4ZmYsIDB4ZmUsIDB4ZmQsIDB4ZmMsIDB4ZmIsIDB4ZmEsIDB4ZjksIDB4ZjgsIDB4ZjcsIDB4ZjYsIDB4ZjUsIDB4ZjQsCisgIDB4ZjMsIDB4ZjIsIDB4ZjEsIDB4ZjAsIDB4ZWYsIDB4ZWUsIDB4ZWQsIDB4ZWMsIDB4ZWIsIDB4ZWEsIDB4ZTksIDB4ZTgsCisgIDB4ZTcsIDB4ZTYsIDB4ZTUsIDB4ZTQsIDB4ZTMsIDB4ZTIsIDB4ZTEsIDB4ZTAsIDB4ZGYsIDB4ZGUsIDB4ZGQsIDB4ZGMsCisgIDB4ZGIsIDB4ZGEsIDB4ZDksIDB4ZDgsIDB4ZDcsIDB4ZDYsIDB4ZDUsIDB4ZDQsIDB4ZDMsIDB4ZDIsIDB4ZDEsIDB4ZDAsCisgIDB4Y2YsIDB4Y2UsIDB4Y2QsIDB4Y2MsIDB4Y2IsIDB4Y2EsIDB4YzksIDB4YzgsIDB4YzcsIDB4YzYsIDB4YzUsIDB4YzQsCisgIDB4YzMsIDB4YzIsIDB4YzEsIDB4YzAsIDB4YmYsIDB4YmUsIDB4YmQsIDB4YmMsIDB4YmIsIDB4YmEsIDB4YjksIDB4YjgsCisgIDB4YjcsIDB4YjYsIDB4YjUsIDB4YjQsIDB4YjMsIDB4YjIsIDB4YjEsIDB4YjAsIDB4YWYsIDB4YWUsIDB4YWQsIDB4YWMsCisgIDB4YWIsIDB4YWEsIDB4YTksIDB4YTgsIDB4YTcsIDB4YTYsIDB4YTUsIDB4YTQsIDB4YTMsIDB4YTIsIDB4YTEsIDB4YTAsCisgIDB4OWYsIDB4OWUsIDB4OWQsIDB4OWMsIDB4OWIsIDB4OWEsIDB4OTksIDB4OTgsIDB4OTcsIDB4OTYsIDB4OTUsIDB4OTQsCisgIDB4OTMsIDB4OTIsIDB4OTEsIDB4OTAsIDB4OGYsIDB4OGUsIDB4OGQsIDB4OGMsIDB4OGIsIDB4OGEsIDB4ODksIDB4ODgsCisgIDB4ODcsIDB4ODYsIDB4ODUsIDB4ODQsIDB4ODMsIDB4ODIsIDB4ODEsIDB4ODAsIDB4N2YsIDB4N2UsIDB4N2QsIDB4N2MsCisgIDB4N2IsIDB4N2EsIDB4NzksIDB4NzgsIDB4NzcsIDB4NzYsIDB4NzUsIDB4NzQsIDB4NzMsIDB4NzIsIDB4NzEsIDB4NzAsCisgIDB4NmYsIDB4NmUsIDB4NmQsIDB4NmMsIDB4NmIsIDB4NmEsIDB4NjksIDB4NjgsIDB4NjcsIDB4NjYsIDB4NjUsIDB4NjQsCisgIDB4NjMsIDB4NjIsIDB4NjEsIDB4NjAsIDB4NWYsIDB4NWUsIDB4NWQsIDB4NWMsIDB4NWIsIDB4NWEsIDB4NTksIDB4NTgsCisgIDB4NTcsIDB4NTYsIDB4NTUsIDB4NTQsIDB4NTMsIDB4NTIsIDB4NTEsIDB4NTAsIDB4NGYsIDB4NGUsIDB4NGQsIDB4NGMsCisgIDB4NGIsIDB4NGEsIDB4NDksIDB4NDgsIDB4NDcsIDB4NDYsIDB4NDUsIDB4NDQsIDB4NDMsIDB4NDIsIDB4NDEsIDB4NDAsCisgIDB4M2YsIDB4M2UsIDB4M2QsIDB4M2MsIDB4M2IsIDB4M2EsIDB4MzksIDB4MzgsIDB4MzcsIDB4MzYsIDB4MzUsIDB4MzQsCisgIDB4MzMsIDB4MzIsIDB4MzEsIDB4MzAsIDB4MmYsIDB4MmUsIDB4MmQsIDB4MmMsIDB4MmIsIDB4MmEsIDB4MjksIDB4MjgsCisgIDB4MjcsIDB4MjYsIDB4MjUsIDB4MjQsIDB4MjMsIDB4MjIsIDB4MjEsIDB4MjAsIDB4MWYsIDB4MWUsIDB4MWQsIDB4MWMsCisgIDB4MWIsIDB4MWEsIDB4MTksIDB4MTgsIDB4MTcsIDB4MTYsIDB4MTUsIDB4MTQsIDB4MTMsIDB4MTIsIDB4MTEsIDB4MTAsCisgIDB4MGYsIDB4MGUsIDB4MGQsIDB4MGMsIDB4MGIsIDB4MGEsIDB4MDksIDB4MDgsIDB4MDcsIDB4MDYsIDB4MDUsIDB4MDQsCisgIDB4MDMsIDB4MDIsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDgsCisgIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsCisgIDB4MTUsIDB4MTYsIDB4MTcsIDB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIDB4MjAsCisgIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIDB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsCisgIDB4MmQsIDB4MmUsIDB4MmYsIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIDB4MzgsCisgIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIDB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsCisgIDB4NDUsIDB4NDYsIDB4NDcsIDB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIDB4NTAsCisgIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIDB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsCisgIDB4NWQsIDB4NWUsIDB4NWYsIDB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIDB4NjgsCisgIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIDB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsCisgIDB4NzUsIDB4NzYsIDB4NzcsIDB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIDB4ODAsCisgIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIDB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsCisgIDB4OGQsIDB4OGUsIDB4OGYsIDB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIDB4OTgsCisgIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIDB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTQsCisgIDB4YTUsIDB4YTYsIDB4YTcsIDB4YTgsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIDB4YjAsCisgIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsIDB4YjgsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsCisgIDB4YmQsIDB4YmUsIDB4YmYsIDB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIDB4YzgsCisgIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIDB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsCisgIDB4ZDUsIDB4ZDYsIDB4ZDcsIDB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZGYsIDB4ZTAsCisgIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIDB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsCisgIDB4ZWQsIDB4ZWUsIDB4ZWYsIDB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIDB4ZjgsCisgIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHNjbGlwMVsxMDIwICsgMTAyMCArIDFdID0geworICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLAorICAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LAorICAweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDhlLCAweDhmLCAweDkwLCAweDkxLCAweDkyLCAweDkzLAorICAweDk0LCAweDk1LCAweDk2LCAweDk3LCAweDk4LCAweDk5LCAweDlhLCAweDliLCAweDljLCAweDlkLCAweDllLCAweDlmLAorICAweGEwLCAweGExLCAweGEyLCAweGEzLCAweGE0LCAweGE1LCAweGE2LCAweGE3LCAweGE4LCAweGE5LCAweGFhLCAweGFiLAorICAweGFjLCAweGFkLCAweGFlLCAweGFmLCAweGIwLCAweGIxLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LAorICAweGI4LCAweGI5LCAweGJhLCAweGJiLCAweGJjLCAweGJkLCAweGJlLCAweGJmLCAweGMwLCAweGMxLCAweGMyLCAweGMzLAorICAweGM0LCAweGM1LCAweGM2LCAweGM3LCAweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLAorICAweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAweGQ4LCAweGQ5LCAweGRhLCAweGRiLAorICAweGRjLCAweGRkLCAweGRlLCAweGRmLCAweGUwLCAweGUxLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LAorICAweGU4LCAweGU5LCAweGVhLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVmLCAweGYwLCAweGYxLCAweGYyLCAweGYzLAorICAweGY0LCAweGY1LCAweGY2LCAweGY3LCAweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGZmLAorICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4LCAweDA5LCAweDBhLCAweDBiLAorICAweDBjLCAweDBkLCAweDBlLCAweDBmLCAweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LAorICAweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAweDIwLCAweDIxLCAweDIyLCAweDIzLAorICAweDI0LCAweDI1LCAweDI2LCAweDI3LCAweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLAorICAweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAweDM4LCAweDM5LCAweDNhLCAweDNiLAorICAweDNjLCAweDNkLCAweDNlLCAweDNmLCAweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LAorICAweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAweDUwLCAweDUxLCAweDUyLCAweDUzLAorICAweDU0LCAweDU1LCAweDU2LCAweDU3LCAweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLAorICAweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAweDY4LCAweDY5LCAweDZhLCAweDZiLAorICAweDZjLCAweDZkLCAweDZlLCAweDZmLCAweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LAorICAweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLAorICAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmLCAweDdmCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBzY2xpcDJbMTEyICsgMTEyICsgMV0gPSB7CisgIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsCisgIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsCisgIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsCisgIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsCisgIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsCisgIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsCisgIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsCisgIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsCisgIDB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIDB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsCisgIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsCisgIDB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsCisgIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsCisgIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsCisgIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsCisgIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsCisgIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsCisgIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsCisgIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsCisgIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGNsaXAxWzI1NSArIDUxMSArIDFdID0geworICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4LAorICAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LAorICAweDE1LCAweDE2LCAweDE3LCAweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAweDIwLAorICAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLAorICAweDJkLCAweDJlLCAweDJmLCAweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAweDM4LAorICAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LAorICAweDQ1LCAweDQ2LCAweDQ3LCAweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAweDUwLAorICAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLAorICAweDVkLCAweDVlLCAweDVmLCAweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAweDY4LAorICAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LAorICAweDc1LCAweDc2LCAweDc3LCAweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAweDgwLAorICAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLAorICAweDhkLCAweDhlLCAweDhmLCAweDkwLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAweDk4LAorICAweDk5LCAweDlhLCAweDliLCAweDljLCAweDlkLCAweDllLCAweDlmLCAweGEwLCAweGExLCAweGEyLCAweGEzLCAweGE0LAorICAweGE1LCAweGE2LCAweGE3LCAweGE4LCAweGE5LCAweGFhLCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweGFmLCAweGIwLAorICAweGIxLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAweGI4LCAweGI5LCAweGJhLCAweGJiLCAweGJjLAorICAweGJkLCAweGJlLCAweGJmLCAweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAweGM4LAorICAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LAorICAweGQ1LCAweGQ2LCAweGQ3LCAweGQ4LCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweGRkLCAweGRlLCAweGRmLCAweGUwLAorICAweGUxLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAweGU4LCAweGU5LCAweGVhLCAweGViLCAweGVjLAorICAweGVkLCAweGVlLCAweGVmLCAweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAweGY4LAorICAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmCit9OworCisjZWxzZQorCisvLyB1bmluaXRpYWxpemVkIHRhYmxlcworc3RhdGljIHVpbnQ4X3QgYWJzMFsyNTUgKyAyNTUgKyAxXTsKK3N0YXRpYyBpbnQ4X3Qgc2NsaXAxWzEwMjAgKyAxMDIwICsgMV07CitzdGF0aWMgaW50OF90IHNjbGlwMlsxMTIgKyAxMTIgKyAxXTsKK3N0YXRpYyB1aW50OF90IGNsaXAxWzI1NSArIDUxMSArIDFdOworCisvLyBXZSBkZWNsYXJlIHRoaXMgdmFyaWFibGUgJ3ZvbGF0aWxlJyB0byBwcmV2ZW50IGluc3RydWN0aW9uIHJlb3JkZXJpbmcKKy8vIGFuZCBtYWtlIHN1cmUgaXQncyBzZXQgdG8gdHJ1ZSBfbGFzdF8gKHNvIGFzIHRvIGJlIHRocmVhZC1zYWZlKQorc3RhdGljIHZvbGF0aWxlIGludCB0YWJsZXNfb2sgPSAwOworCisjZW5kaWYgICAgLy8gVVNFX1NUQVRJQ19UQUJMRVMKKworY29uc3QgaW50OF90KiBjb25zdCBWUDhrc2NsaXAxID0gKGNvbnN0IGludDhfdCopJnNjbGlwMVsxMDIwXTsKK2NvbnN0IGludDhfdCogY29uc3QgVlA4a3NjbGlwMiA9IChjb25zdCBpbnQ4X3QqKSZzY2xpcDJbMTEyXTsKK2NvbnN0IHVpbnQ4X3QqIGNvbnN0IFZQOGtjbGlwMSA9ICZjbGlwMVsyNTVdOworY29uc3QgdWludDhfdCogY29uc3QgVlA4a2FiczAgPSAmYWJzMFsyNTVdOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgVlA4SW5pdENsaXBUYWJsZXModm9pZCkgeworI2lmIChVU0VfU1RBVElDX1RBQkxFUyA9PSAwKQorICBpbnQgaTsKKyAgaWYgKCF0YWJsZXNfb2spIHsKKyAgICBmb3IgKGkgPSAtMjU1OyBpIDw9IDI1NTsgKytpKSB7CisgICAgICBhYnMwWzI1NSArIGldID0gKGkgPCAwKSA/IC1pIDogaTsKKyAgICB9CisgICAgZm9yIChpID0gLTEwMjA7IGkgPD0gMTAyMDsgKytpKSB7CisgICAgICBzY2xpcDFbMTAyMCArIGldID0gKGkgPCAtMTI4KSA/IC0xMjggOiAoaSA+IDEyNykgPyAxMjcgOiBpOworICAgIH0KKyAgICBmb3IgKGkgPSAtMTEyOyBpIDw9IDExMjsgKytpKSB7CisgICAgICBzY2xpcDJbMTEyICsgaV0gPSAoaSA8IC0xNikgPyAtMTYgOiAoaSA+IDE1KSA/IDE1IDogaTsKKyAgICB9CisgICAgZm9yIChpID0gLTI1NTsgaSA8PSAyNTUgKyAyNTU7ICsraSkgeworICAgICAgY2xpcDFbMjU1ICsgaV0gPSAoaSA8IDApID8gMCA6IChpID4gMjU1KSA/IDI1NSA6IGk7CisgICAgfQorICAgIHRhYmxlc19vayA9IDE7CisgIH0KKyNlbmRpZiAgICAvLyBVU0VfU1RBVElDX1RBQkxFUworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9kZWNfbWlwczMyLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2RlY19taXBzMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGU3MDk2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9kZWNfbWlwczMyLmMKQEAgLTAsMCArMSw1ODcgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBNSVBTIHZlcnNpb24gb2YgZHNwIGZ1bmN0aW9ucworLy8KKy8vIEF1dGhvcihzKTogIERqb3JkamUgUGVzdXQgICAgKGRqb3JkamUucGVzdXRAaW1ndGVjLmNvbSkKKy8vICAgICAgICAgICAgIEpvdmFuIFplbGluY2V2aWMgKGpvdmFuLnplbGluY2V2aWNAaW1ndGVjLmNvbSkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFMzMikKKworI2luY2x1ZGUgInNyYy9kc3AvbWlwc19tYWNyby5oIgorCitzdGF0aWMgY29uc3QgaW50IGtDMSA9IDIwMDkxICsgKDEgPDwgMTYpOworc3RhdGljIGNvbnN0IGludCBrQzIgPSAzNTQ2ODsKKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBhYnNfbWlwczMyKGludCB4KSB7CisgIGNvbnN0IGludCBzaWduID0geCA+PiAzMTsKKyAgcmV0dXJuICh4IF4gc2lnbikgLSBzaWduOworfQorCisvLyA0IHBpeGVscyBpbiwgMiBwaXhlbHMgb3V0CitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBkb19maWx0ZXIyKHVpbnQ4X3QqIHAsIGludCBzdGVwKSB7CisgIGNvbnN0IGludCBwMSA9IHBbLTIgKiBzdGVwXSwgcDAgPSBwWy1zdGVwXSwgcTAgPSBwWzBdLCBxMSA9IHBbc3RlcF07CisgIGNvbnN0IGludCBhID0gMyAqIChxMCAtIHAwKSArIFZQOGtzY2xpcDFbcDEgLSBxMV07CisgIGNvbnN0IGludCBhMSA9IFZQOGtzY2xpcDJbKGEgKyA0KSA+PiAzXTsKKyAgY29uc3QgaW50IGEyID0gVlA4a3NjbGlwMlsoYSArIDMpID4+IDNdOworICBwWy1zdGVwXSA9IFZQOGtjbGlwMVtwMCArIGEyXTsKKyAgcFsgICAgMF0gPSBWUDhrY2xpcDFbcTAgLSBhMV07Cit9CisKKy8vIDQgcGl4ZWxzIGluLCA0IHBpeGVscyBvdXQKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIGRvX2ZpbHRlcjQodWludDhfdCogcCwgaW50IHN0ZXApIHsKKyAgY29uc3QgaW50IHAxID0gcFstMiAqIHN0ZXBdLCBwMCA9IHBbLXN0ZXBdLCBxMCA9IHBbMF0sIHExID0gcFtzdGVwXTsKKyAgY29uc3QgaW50IGEgPSAzICogKHEwIC0gcDApOworICBjb25zdCBpbnQgYTEgPSBWUDhrc2NsaXAyWyhhICsgNCkgPj4gM107CisgIGNvbnN0IGludCBhMiA9IFZQOGtzY2xpcDJbKGEgKyAzKSA+PiAzXTsKKyAgY29uc3QgaW50IGEzID0gKGExICsgMSkgPj4gMTsKKyAgcFstMiAqIHN0ZXBdID0gVlA4a2NsaXAxW3AxICsgYTNdOworICBwWy0gICAgc3RlcF0gPSBWUDhrY2xpcDFbcDAgKyBhMl07CisgIHBbICAgICAgICAwXSA9IFZQOGtjbGlwMVtxMCAtIGExXTsKKyAgcFsgICAgIHN0ZXBdID0gVlA4a2NsaXAxW3ExIC0gYTNdOworfQorCisvLyA2IHBpeGVscyBpbiwgNiBwaXhlbHMgb3V0CitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBkb19maWx0ZXI2KHVpbnQ4X3QqIHAsIGludCBzdGVwKSB7CisgIGNvbnN0IGludCBwMiA9IHBbLTMgKiBzdGVwXSwgcDEgPSBwWy0yICogc3RlcF0sIHAwID0gcFstc3RlcF07CisgIGNvbnN0IGludCBxMCA9IHBbMF0sIHExID0gcFtzdGVwXSwgcTIgPSBwWzIgKiBzdGVwXTsKKyAgY29uc3QgaW50IGEgPSBWUDhrc2NsaXAxWzMgKiAocTAgLSBwMCkgKyBWUDhrc2NsaXAxW3AxIC0gcTFdXTsKKyAgLy8gYSBpcyBpbiBbLTEyOCwxMjddLCBhMSBpbiBbLTI3LDI3XSwgYTIgaW4gWy0xOCwxOF0gYW5kIGEzIGluIFstOSw5XQorICBjb25zdCBpbnQgYTEgPSAoMjcgKiBhICsgNjMpID4+IDc7ICAvLyBlcS4gdG8gKCgzICogYSArIDcpICogOSkgPj4gNworICBjb25zdCBpbnQgYTIgPSAoMTggKiBhICsgNjMpID4+IDc7ICAvLyBlcS4gdG8gKCgyICogYSArIDcpICogOSkgPj4gNworICBjb25zdCBpbnQgYTMgPSAoOSAgKiBhICsgNjMpID4+IDc7ICAvLyBlcS4gdG8gKCgxICogYSArIDcpICogOSkgPj4gNworICBwWy0zICogc3RlcF0gPSBWUDhrY2xpcDFbcDIgKyBhM107CisgIHBbLTIgKiBzdGVwXSA9IFZQOGtjbGlwMVtwMSArIGEyXTsKKyAgcFstICAgIHN0ZXBdID0gVlA4a2NsaXAxW3AwICsgYTFdOworICBwWyAgICAgICAgMF0gPSBWUDhrY2xpcDFbcTAgLSBhMV07CisgIHBbICAgICBzdGVwXSA9IFZQOGtjbGlwMVtxMSAtIGEyXTsKKyAgcFsgMiAqIHN0ZXBdID0gVlA4a2NsaXAxW3EyIC0gYTNdOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IGhldihjb25zdCB1aW50OF90KiBwLCBpbnQgc3RlcCwgaW50IHRocmVzaCkgeworICBjb25zdCBpbnQgcDEgPSBwWy0yICogc3RlcF0sIHAwID0gcFstc3RlcF0sIHEwID0gcFswXSwgcTEgPSBwW3N0ZXBdOworICByZXR1cm4gKGFic19taXBzMzIocDEgLSBwMCkgPiB0aHJlc2gpIHx8IChhYnNfbWlwczMyKHExIC0gcTApID4gdGhyZXNoKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBuZWVkc19maWx0ZXIoY29uc3QgdWludDhfdCogcCwgaW50IHN0ZXAsIGludCB0KSB7CisgIGNvbnN0IGludCBwMSA9IHBbLTIgKiBzdGVwXSwgcDAgPSBwWy1zdGVwXSwgcTAgPSBwWzBdLCBxMSA9IHBbc3RlcF07CisgIHJldHVybiAoKDQgKiBhYnNfbWlwczMyKHAwIC0gcTApICsgYWJzX21pcHMzMihwMSAtIHExKSkgPD0gdCk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgbmVlZHNfZmlsdGVyMihjb25zdCB1aW50OF90KiBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGVwLCBpbnQgdCwgaW50IGl0KSB7CisgIGNvbnN0IGludCBwMyA9IHBbLTQgKiBzdGVwXSwgcDIgPSBwWy0zICogc3RlcF07CisgIGNvbnN0IGludCBwMSA9IHBbLTIgKiBzdGVwXSwgcDAgPSBwWy1zdGVwXTsKKyAgY29uc3QgaW50IHEwID0gcFswXSwgcTEgPSBwW3N0ZXBdLCBxMiA9IHBbMiAqIHN0ZXBdLCBxMyA9IHBbMyAqIHN0ZXBdOworICBpZiAoKDQgKiBhYnNfbWlwczMyKHAwIC0gcTApICsgYWJzX21pcHMzMihwMSAtIHExKSkgPiB0KSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIGFic19taXBzMzIocDMgLSBwMikgPD0gaXQgJiYgYWJzX21pcHMzMihwMiAtIHAxKSA8PSBpdCAmJgorICAgICAgICAgYWJzX21pcHMzMihwMSAtIHAwKSA8PSBpdCAmJiBhYnNfbWlwczMyKHEzIC0gcTIpIDw9IGl0ICYmCisgICAgICAgICBhYnNfbWlwczMyKHEyIC0gcTEpIDw9IGl0ICYmIGFic19taXBzMzIocTEgLSBxMCkgPD0gaXQ7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEZpbHRlckxvb3AyNih1aW50OF90KiBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoc3RyaWRlLCBpbnQgdnN0cmlkZSwgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIGNvbnN0IGludCB0aHJlc2gyID0gMiAqIHRocmVzaCArIDE7CisgIHdoaWxlIChzaXplLS0gPiAwKSB7CisgICAgaWYgKG5lZWRzX2ZpbHRlcjIocCwgaHN0cmlkZSwgdGhyZXNoMiwgaXRocmVzaCkpIHsKKyAgICAgIGlmIChoZXYocCwgaHN0cmlkZSwgaGV2X3RocmVzaCkpIHsKKyAgICAgICAgZG9fZmlsdGVyMihwLCBoc3RyaWRlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRvX2ZpbHRlcjYocCwgaHN0cmlkZSk7CisgICAgICB9CisgICAgfQorICAgIHAgKz0gdnN0cmlkZTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBGaWx0ZXJMb29wMjQodWludDhfdCogcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaHN0cmlkZSwgaW50IHZzdHJpZGUsIGludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICBjb25zdCBpbnQgdGhyZXNoMiA9IDIgKiB0aHJlc2ggKyAxOworICB3aGlsZSAoc2l6ZS0tID4gMCkgeworICAgIGlmIChuZWVkc19maWx0ZXIyKHAsIGhzdHJpZGUsIHRocmVzaDIsIGl0aHJlc2gpKSB7CisgICAgICBpZiAoaGV2KHAsIGhzdHJpZGUsIGhldl90aHJlc2gpKSB7CisgICAgICAgIGRvX2ZpbHRlcjIocCwgaHN0cmlkZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBkb19maWx0ZXI0KHAsIGhzdHJpZGUpOworICAgICAgfQorICAgIH0KKyAgICBwICs9IHZzdHJpZGU7CisgIH0KK30KKworLy8gb24gbWFjcm9ibG9jayBlZGdlcworc3RhdGljIHZvaWQgVkZpbHRlcjE2KHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIEZpbHRlckxvb3AyNihwLCBzdHJpZGUsIDEsIDE2LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworfQorCitzdGF0aWMgdm9pZCBIRmlsdGVyMTYodWludDhfdCogcCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgRmlsdGVyTG9vcDI2KHAsIDEsIHN0cmlkZSwgMTYsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7Cit9CisKKy8vIDgtcGl4ZWxzIHdpZGUgdmFyaWFudCwgZm9yIGNocm9tYSBmaWx0ZXJpbmcKK3N0YXRpYyB2b2lkIFZGaWx0ZXI4KHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgRmlsdGVyTG9vcDI2KHUsIHN0cmlkZSwgMSwgOCwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKKyAgRmlsdGVyTG9vcDI2KHYsIHN0cmlkZSwgMSwgOCwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKK30KKworc3RhdGljIHZvaWQgSEZpbHRlcjgodWludDhfdCogdSwgdWludDhfdCogdiwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICBGaWx0ZXJMb29wMjYodSwgMSwgc3RyaWRlLCA4LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworICBGaWx0ZXJMb29wMjYodiwgMSwgc3RyaWRlLCA4LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworfQorCitzdGF0aWMgdm9pZCBWRmlsdGVyOGkodWludDhfdCogdSwgdWludDhfdCogdiwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgRmlsdGVyTG9vcDI0KHUgKyA0ICogc3RyaWRlLCBzdHJpZGUsIDEsIDgsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7CisgIEZpbHRlckxvb3AyNCh2ICsgNCAqIHN0cmlkZSwgc3RyaWRlLCAxLCA4LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworfQorCitzdGF0aWMgdm9pZCBIRmlsdGVyOGkodWludDhfdCogdSwgdWludDhfdCogdiwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgRmlsdGVyTG9vcDI0KHUgKyA0LCAxLCBzdHJpZGUsIDgsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7CisgIEZpbHRlckxvb3AyNCh2ICsgNCwgMSwgc3RyaWRlLCA4LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworfQorCisvLyBvbiB0aHJlZSBpbm5lciBlZGdlcworc3RhdGljIHZvaWQgVkZpbHRlcjE2aSh1aW50OF90KiBwLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgaW50IGs7CisgIGZvciAoayA9IDM7IGsgPiAwOyAtLWspIHsKKyAgICBwICs9IDQgKiBzdHJpZGU7CisgICAgRmlsdGVyTG9vcDI0KHAsIHN0cmlkZSwgMSwgMTYsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgSEZpbHRlcjE2aSh1aW50OF90KiBwLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgaW50IGs7CisgIGZvciAoayA9IDM7IGsgPiAwOyAtLWspIHsKKyAgICBwICs9IDQ7CisgICAgRmlsdGVyTG9vcDI0KHAsIDEsIHN0cmlkZSwgMTYsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFNpbXBsZSBJbi1sb29wIGZpbHRlcmluZyAoUGFyYWdyYXBoIDE1LjIpCisKK3N0YXRpYyB2b2lkIFNpbXBsZVZGaWx0ZXIxNih1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKSB7CisgIGludCBpOworICBjb25zdCBpbnQgdGhyZXNoMiA9IDIgKiB0aHJlc2ggKyAxOworICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgeworICAgIGlmIChuZWVkc19maWx0ZXIocCArIGksIHN0cmlkZSwgdGhyZXNoMikpIHsKKyAgICAgIGRvX2ZpbHRlcjIocCArIGksIHN0cmlkZSk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIFNpbXBsZUhGaWx0ZXIxNih1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKSB7CisgIGludCBpOworICBjb25zdCBpbnQgdGhyZXNoMiA9IDIgKiB0aHJlc2ggKyAxOworICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgeworICAgIGlmIChuZWVkc19maWx0ZXIocCArIGkgKiBzdHJpZGUsIDEsIHRocmVzaDIpKSB7CisgICAgICBkb19maWx0ZXIyKHAgKyBpICogc3RyaWRlLCAxKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgU2ltcGxlVkZpbHRlcjE2aSh1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKSB7CisgIGludCBrOworICBmb3IgKGsgPSAzOyBrID4gMDsgLS1rKSB7CisgICAgcCArPSA0ICogc3RyaWRlOworICAgIFNpbXBsZVZGaWx0ZXIxNihwLCBzdHJpZGUsIHRocmVzaCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgU2ltcGxlSEZpbHRlcjE2aSh1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKSB7CisgIGludCBrOworICBmb3IgKGsgPSAzOyBrID4gMDsgLS1rKSB7CisgICAgcCArPSA0OworICAgIFNpbXBsZUhGaWx0ZXIxNihwLCBzdHJpZGUsIHRocmVzaCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgVHJhbnNmb3JtT25lKGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QpIHsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNDsKKyAgaW50IHRlbXA1LCB0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wOTsKKyAgaW50IHRlbXAxMCwgdGVtcDExLCB0ZW1wMTIsIHRlbXAxMywgdGVtcDE0OworICBpbnQgdGVtcDE1LCB0ZW1wMTYsIHRlbXAxNywgdGVtcDE4OworICBpbnQxNl90KiBwX2luID0gKGludDE2X3QqKWluOworCisgIC8vIGxvb3BzIHVucm9sbGVkIGFuZCBtZXJnZWQgdG8gYXZvaWQgdXNhZ2Ugb2YgdG1wIGJ1ZmZlcgorICAvLyBhbmQgdG8gcmVkdWNlIG51bWJlciBvZiBzdGFsbHMuIE1VTCBtYWNybyBpcyB3cml0dGVuCisgIC8vIGluIGFzc2VtYmxlciBhbmQgaW5saW5lZAorICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICJsaCAgICAgICAlW3RlbXAwXSwgIDAoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxoICAgICAgICVbdGVtcDhdLCAgMTYoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGggICAgICAgJVt0ZW1wNF0sICA4KCVbaW5dKSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsaCAgICAgICAlW3RlbXAxMl0sIDI0KCVbaW5dKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDE2XSwgJVt0ZW1wMF0sICAlW3RlbXA4XSAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgJVt0ZW1wMF0sICAlW3RlbXAwXSwgICVbdGVtcDhdICAgICAgICAgICBcblx0IgorICAgICJtdWwgICAgICAlW3RlbXA4XSwgICVbdGVtcDRdLCAgJVtrQzJdICAgICAgICAgICAgIFxuXHQiCisgICAgIm11bCAgICAgICVbdGVtcDE3XSwgJVt0ZW1wMTJdLCAlW2tDMV0gICAgICAgICAgICAgXG5cdCIKKyAgICAibXVsICAgICAgJVt0ZW1wNF0sICAlW3RlbXA0XSwgICVba0MxXSAgICAgICAgICAgICBcblx0IgorICAgICJtdWwgICAgICAlW3RlbXAxMl0sICVbdGVtcDEyXSwgJVtrQzJdICAgICAgICAgICAgIFxuXHQiCisgICAgImxoICAgICAgICVbdGVtcDFdLCAgMiglW2luXSkgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGggICAgICAgJVt0ZW1wNV0sICAxMCglW2luXSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsaCAgICAgICAlW3RlbXA5XSwgIDE4KCVbaW5dKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxoICAgICAgICVbdGVtcDEzXSwgMjYoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wOF0sICAlW3RlbXA4XSwgIDE2ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxN10sICVbdGVtcDE3XSwgMTYgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDRdLCAgJVt0ZW1wNF0sICAxNiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTJdLCAlW3RlbXAxMl0sIDE2ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsaCAgICAgICAlW3RlbXAyXSwgIDQoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxoICAgICAgICVbdGVtcDZdLCAgMTIoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGggICAgICAgJVt0ZW1wMTBdLCAyMCglW2luXSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsaCAgICAgICAlW3RlbXAxNF0sIDI4KCVbaW5dKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICVbdGVtcDE3XSwgJVt0ZW1wOF0sICAlW3RlbXAxN10gICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wNF0sICAlW3RlbXA0XSwgICVbdGVtcDEyXSAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXA4XSwgICVbdGVtcDE2XSwgJVt0ZW1wNF0gICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICVbdGVtcDRdLCAgJVt0ZW1wMTZdLCAlW3RlbXA0XSAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wMTZdLCAlW3RlbXAxXSwgICVbdGVtcDldICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXAxXSwgICVbdGVtcDFdLCAgJVt0ZW1wOV0gICAgICAgICAgIFxuXHQiCisgICAgImxoICAgICAgICVbdGVtcDNdLCAgNiglW2luXSkgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGggICAgICAgJVt0ZW1wN10sICAxNCglW2luXSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsaCAgICAgICAlW3RlbXAxMV0sIDIyKCVbaW5dKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxoICAgICAgICVbdGVtcDE1XSwgMzAoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wMTJdLCAlW3RlbXAwXSwgICVbdGVtcDE3XSAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXAwXSwgICVbdGVtcDBdLCAgJVt0ZW1wMTddICAgICAgICAgIFxuXHQiCisgICAgIm11bCAgICAgICVbdGVtcDldLCAgJVt0ZW1wNV0sICAlW2tDMl0gICAgICAgICAgICAgXG5cdCIKKyAgICAibXVsICAgICAgJVt0ZW1wMTddLCAlW3RlbXAxM10sICVba0MxXSAgICAgICAgICAgICBcblx0IgorICAgICJtdWwgICAgICAlW3RlbXA1XSwgICVbdGVtcDVdLCAgJVtrQzFdICAgICAgICAgICAgIFxuXHQiCisgICAgIm11bCAgICAgICVbdGVtcDEzXSwgJVt0ZW1wMTNdLCAlW2tDMl0gICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wOV0sICAlW3RlbXA5XSwgIDE2ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxN10sICVbdGVtcDE3XSwgMTYgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICVbdGVtcDE3XSwgJVt0ZW1wOV0sICAlW3RlbXAxN10gICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wNV0sICAlW3RlbXA1XSwgIDE2ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxM10sICVbdGVtcDEzXSwgMTYgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDVdLCAgJVt0ZW1wNV0sICAlW3RlbXAxM10gICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wMTNdLCAlW3RlbXAxXSwgICVbdGVtcDE3XSAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXAxXSwgICVbdGVtcDFdLCAgJVt0ZW1wMTddICAgICAgICAgIFxuXHQiCisgICAgIm11bCAgICAgICVbdGVtcDE3XSwgJVt0ZW1wMTRdLCAlW2tDMV0gICAgICAgICAgICAgXG5cdCIKKyAgICAibXVsICAgICAgJVt0ZW1wMTRdLCAlW3RlbXAxNF0sICVba0MyXSAgICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXA5XSwgICVbdGVtcDE2XSwgJVt0ZW1wNV0gICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICVbdGVtcDVdLCAgJVt0ZW1wMTZdLCAlW3RlbXA1XSAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wMTZdLCAlW3RlbXAyXSwgICVbdGVtcDEwXSAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXAyXSwgICVbdGVtcDJdLCAgJVt0ZW1wMTBdICAgICAgICAgIFxuXHQiCisgICAgIm11bCAgICAgICVbdGVtcDEwXSwgJVt0ZW1wNl0sICAlW2tDMl0gICAgICAgICAgICAgXG5cdCIKKyAgICAibXVsICAgICAgJVt0ZW1wNl0sICAlW3RlbXA2XSwgICVba0MxXSAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxN10sICVbdGVtcDE3XSwgMTYgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDE0XSwgJVt0ZW1wMTRdLCAxNiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTBdLCAlW3RlbXAxMF0sIDE2ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXA2XSwgICVbdGVtcDZdLCAgMTYgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICVbdGVtcDE3XSwgJVt0ZW1wMTBdLCAlW3RlbXAxN10gICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wNl0sICAlW3RlbXA2XSwgICVbdGVtcDE0XSAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXAxMF0sICVbdGVtcDE2XSwgJVt0ZW1wNl0gICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICVbdGVtcDZdLCAgJVt0ZW1wMTZdLCAlW3RlbXA2XSAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wMTRdLCAlW3RlbXAyXSwgICVbdGVtcDE3XSAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXAyXSwgICVbdGVtcDJdLCAgJVt0ZW1wMTddICAgICAgICAgIFxuXHQiCisgICAgIm11bCAgICAgICVbdGVtcDE3XSwgJVt0ZW1wMTVdLCAlW2tDMV0gICAgICAgICAgICAgXG5cdCIKKyAgICAibXVsICAgICAgJVt0ZW1wMTVdLCAlW3RlbXAxNV0sICVba0MyXSAgICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXAxNl0sICVbdGVtcDNdLCAgJVt0ZW1wMTFdICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICVbdGVtcDNdLCAgJVt0ZW1wM10sICAlW3RlbXAxMV0gICAgICAgICAgXG5cdCIKKyAgICAibXVsICAgICAgJVt0ZW1wMTFdLCAlW3RlbXA3XSwgICVba0MyXSAgICAgICAgICAgICBcblx0IgorICAgICJtdWwgICAgICAlW3RlbXA3XSwgICVbdGVtcDddLCAgJVtrQzFdICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAgICVbdGVtcDhdLCAgJVt0ZW1wOF0sICA0ICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgJVt0ZW1wMTJdLCAlW3RlbXAxMl0sIDQgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGRpdSAgICAlW3RlbXAwXSwgICVbdGVtcDBdLCAgNCAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAgICVbdGVtcDRdLCAgJVt0ZW1wNF0sICA0ICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTddLCAlW3RlbXAxN10sIDE2ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxNV0sICVbdGVtcDE1XSwgMTYgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDExXSwgJVt0ZW1wMTFdLCAxNiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wN10sICAlW3RlbXA3XSwgIDE2ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXAxN10sICVbdGVtcDExXSwgJVt0ZW1wMTddICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDddLCAgJVt0ZW1wN10sICAlW3RlbXAxNV0gICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wMTVdLCAlW3RlbXAzXSwgICVbdGVtcDE3XSAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXAzXSwgICVbdGVtcDNdLCAgJVt0ZW1wMTddICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDExXSwgJVt0ZW1wMTZdLCAlW3RlbXA3XSAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgJVt0ZW1wN10sICAlW3RlbXAxNl0sICVbdGVtcDddICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXAxNl0sICVbdGVtcDhdLCAgJVt0ZW1wMTBdICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICVbdGVtcDhdLCAgJVt0ZW1wOF0sICAlW3RlbXAxMF0gICAgICAgICAgXG5cdCIKKyAgICAibXVsICAgICAgJVt0ZW1wMTBdLCAlW3RlbXA5XSwgICVba0MyXSAgICAgICAgICAgICBcblx0IgorICAgICJtdWwgICAgICAlW3RlbXAxN10sICVbdGVtcDExXSwgJVtrQzFdICAgICAgICAgICAgIFxuXHQiCisgICAgIm11bCAgICAgICVbdGVtcDldLCAgJVt0ZW1wOV0sICAlW2tDMV0gICAgICAgICAgICAgXG5cdCIKKyAgICAibXVsICAgICAgJVt0ZW1wMTFdLCAlW3RlbXAxMV0sICVba0MyXSAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxMF0sICVbdGVtcDEwXSwgMTYgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDE3XSwgJVt0ZW1wMTddLCAxNiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wOV0sICAlW3RlbXA5XSwgIDE2ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxMV0sICVbdGVtcDExXSwgMTYgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICVbdGVtcDE3XSwgJVt0ZW1wMTBdLCAlW3RlbXAxN10gICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wMTFdLCAlW3RlbXA5XSwgICVbdGVtcDExXSAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXAxMF0sICVbdGVtcDEyXSwgJVt0ZW1wMTRdICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICVbdGVtcDEyXSwgJVt0ZW1wMTJdLCAlW3RlbXAxNF0gICAgICAgICAgXG5cdCIKKyAgICAibXVsICAgICAgJVt0ZW1wMTRdLCAlW3RlbXAxM10sICVba0MyXSAgICAgICAgICAgICBcblx0IgorICAgICJtdWwgICAgICAlW3RlbXA5XSwgICVbdGVtcDE1XSwgJVtrQzFdICAgICAgICAgICAgIFxuXHQiCisgICAgIm11bCAgICAgICVbdGVtcDEzXSwgJVt0ZW1wMTNdLCAlW2tDMV0gICAgICAgICAgICAgXG5cdCIKKyAgICAibXVsICAgICAgJVt0ZW1wMTVdLCAlW3RlbXAxNV0sICVba0MyXSAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxNF0sICVbdGVtcDE0XSwgMTYgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDldLCAgJVt0ZW1wOV0sICAxNiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTNdLCAlW3RlbXAxM10sIDE2ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxNV0sICVbdGVtcDE1XSwgMTYgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICVbdGVtcDldLCAgJVt0ZW1wMTRdLCAlW3RlbXA5XSAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wMTVdLCAlW3RlbXAxM10sICVbdGVtcDE1XSAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXAxNF0sICVbdGVtcDBdLCAgJVt0ZW1wMl0gICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICVbdGVtcDBdLCAgJVt0ZW1wMF0sICAlW3RlbXAyXSAgICAgICAgICAgXG5cdCIKKyAgICAibXVsICAgICAgJVt0ZW1wMl0sICAlW3RlbXAxXSwgICVba0MyXSAgICAgICAgICAgICBcblx0IgorICAgICJtdWwgICAgICAlW3RlbXAxM10sICVbdGVtcDNdLCAgJVtrQzFdICAgICAgICAgICAgIFxuXHQiCisgICAgIm11bCAgICAgICVbdGVtcDFdLCAgJVt0ZW1wMV0sICAlW2tDMV0gICAgICAgICAgICAgXG5cdCIKKyAgICAibXVsICAgICAgJVt0ZW1wM10sICAlW3RlbXAzXSwgICVba0MyXSAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAyXSwgICVbdGVtcDJdLCAgMTYgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDEzXSwgJVt0ZW1wMTNdLCAxNiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMV0sICAlW3RlbXAxXSwgIDE2ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAzXSwgICVbdGVtcDNdLCAgMTYgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICVbdGVtcDEzXSwgJVt0ZW1wMl0sICAlW3RlbXAxM10gICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wM10sICAlW3RlbXAxXSwgICVbdGVtcDNdICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXAyXSwgICVbdGVtcDRdLCAgJVt0ZW1wNl0gICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICVbdGVtcDRdLCAgJVt0ZW1wNF0sICAlW3RlbXA2XSAgICAgICAgICAgXG5cdCIKKyAgICAibXVsICAgICAgJVt0ZW1wNl0sICAlW3RlbXA1XSwgICVba0MyXSAgICAgICAgICAgICBcblx0IgorICAgICJtdWwgICAgICAlW3RlbXAxXSwgICVbdGVtcDddLCAgJVtrQzFdICAgICAgICAgICAgIFxuXHQiCisgICAgIm11bCAgICAgICVbdGVtcDVdLCAgJVt0ZW1wNV0sICAlW2tDMV0gICAgICAgICAgICAgXG5cdCIKKyAgICAibXVsICAgICAgJVt0ZW1wN10sICAlW3RlbXA3XSwgICVba0MyXSAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXA2XSwgICVbdGVtcDZdLCAgMTYgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDFdLCAgJVt0ZW1wMV0sICAxNiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wNV0sICAlW3RlbXA1XSwgIDE2ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXA3XSwgICVbdGVtcDddLCAgMTYgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICVbdGVtcDFdLCAgJVt0ZW1wNl0sICAlW3RlbXAxXSAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wN10sICAlW3RlbXA1XSwgICVbdGVtcDddICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXA1XSwgICVbdGVtcDE2XSwgJVt0ZW1wMTFdICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICVbdGVtcDE2XSwgJVt0ZW1wMTZdLCAlW3RlbXAxMV0gICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wMTFdLCAlW3RlbXA4XSwgICVbdGVtcDE3XSAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXA4XSwgICVbdGVtcDhdLCAgJVt0ZW1wMTddICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDVdLCAgJVt0ZW1wNV0sICAzICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTZdLCAlW3RlbXAxNl0sIDMgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxMV0sICVbdGVtcDExXSwgMyAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDhdLCAgJVt0ZW1wOF0sICAzICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wMTddLCAlW3RlbXAxMF0sICVbdGVtcDE1XSAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXAxMF0sICVbdGVtcDEwXSwgJVt0ZW1wMTVdICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDE1XSwgJVt0ZW1wMTJdLCAlW3RlbXA5XSAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgJVt0ZW1wMTJdLCAlW3RlbXAxMl0sICVbdGVtcDldICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxN10sICVbdGVtcDE3XSwgMyAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDEwXSwgJVt0ZW1wMTBdLCAzICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTVdLCAlW3RlbXAxNV0sIDMgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxMl0sICVbdGVtcDEyXSwgMyAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDldLCAgJVt0ZW1wMTRdLCAlW3RlbXAzXSAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgJVt0ZW1wMTRdLCAlW3RlbXAxNF0sICVbdGVtcDNdICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXAzXSwgICVbdGVtcDBdLCAgJVt0ZW1wMTNdICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICVbdGVtcDBdLCAgJVt0ZW1wMF0sICAlW3RlbXAxM10gICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wOV0sICAlW3RlbXA5XSwgIDMgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxNF0sICVbdGVtcDE0XSwgMyAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDNdLCAgJVt0ZW1wM10sICAzICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMF0sICAlW3RlbXAwXSwgIDMgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXAxM10sICVbdGVtcDJdLCAgJVt0ZW1wN10gICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICVbdGVtcDJdLCAgJVt0ZW1wMl0sICAlW3RlbXA3XSAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wN10sICAlW3RlbXA0XSwgICVbdGVtcDFdICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXA0XSwgICVbdGVtcDRdLCAgJVt0ZW1wMV0gICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDEzXSwgJVt0ZW1wMTNdLCAzICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMl0sICAlW3RlbXAyXSwgIDMgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXA3XSwgICVbdGVtcDddLCAgMyAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDRdLCAgJVt0ZW1wNF0sICAzICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgJVt0ZW1wNl0sICAkemVybywgICAgIDI1NSAgICAgICAgICAgICAgICBcblx0IgorICAgICJsYnUgICAgICAlW3RlbXAxXSwgIDArMCoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDFdLCAgJVt0ZW1wMV0sICAlW3RlbXA1XSAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wNV0sICAlW3RlbXAxXSwgIDggICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxOF0sICVbdGVtcDFdLCAgMzEgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcXogICAgICVbdGVtcDVdLCAgMWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAieG9yICAgICAgJVt0ZW1wMV0sICAlW3RlbXAxXSwgICVbdGVtcDFdICAgICAgICAgICBcblx0IgorICAgICJtb3Z6ICAgICAlW3RlbXAxXSwgICVbdGVtcDZdLCAgJVt0ZW1wMThdICAgICAgICAgIFxuXHQiCisgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGJ1ICAgICAgJVt0ZW1wMThdLCAxKzAqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICBcblx0IgorICAgICJzYiAgICAgICAlW3RlbXAxXSwgIDArMCoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDE4XSwgJVt0ZW1wMThdLCAlW3RlbXAxMV0gICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTFdLCAlW3RlbXAxOF0sIDggICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxXSwgICVbdGVtcDE4XSwgMzEgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcXogICAgICVbdGVtcDExXSwgMmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAieG9yICAgICAgJVt0ZW1wMThdLCAlW3RlbXAxOF0sICVbdGVtcDE4XSAgICAgICAgICBcblx0IgorICAgICJtb3Z6ICAgICAlW3RlbXAxOF0sICVbdGVtcDZdLCAgJVt0ZW1wMV0gICAgICAgICAgIFxuXHQiCisgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGJ1ICAgICAgJVt0ZW1wMV0sICAyKzAqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICBcblx0IgorICAgICJzYiAgICAgICAlW3RlbXAxOF0sIDErMCoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDFdLCAgJVt0ZW1wMV0sICAlW3RlbXA4XSAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wOF0sICAlW3RlbXAxXSwgIDggICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxOF0sICVbdGVtcDFdLCAgMzEgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcXogICAgICVbdGVtcDhdLCAgM2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAieG9yICAgICAgJVt0ZW1wMV0sICAlW3RlbXAxXSwgICVbdGVtcDFdICAgICAgICAgICBcblx0IgorICAgICJtb3Z6ICAgICAlW3RlbXAxXSwgICVbdGVtcDZdLCAgJVt0ZW1wMThdICAgICAgICAgIFxuXHQiCisgICIzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGJ1ICAgICAgJVt0ZW1wMThdLCAzKzAqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICBcblx0IgorICAgICJzYiAgICAgICAlW3RlbXAxXSwgIDIrMCoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDE4XSwgJVt0ZW1wMThdLCAlW3RlbXAxNl0gICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTZdLCAlW3RlbXAxOF0sIDggICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxXSwgICVbdGVtcDE4XSwgMzEgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcXogICAgICVbdGVtcDE2XSwgNGYgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAieG9yICAgICAgJVt0ZW1wMThdLCAlW3RlbXAxOF0sICVbdGVtcDE4XSAgICAgICAgICBcblx0IgorICAgICJtb3Z6ICAgICAlW3RlbXAxOF0sICVbdGVtcDZdLCAgJVt0ZW1wMV0gICAgICAgICAgIFxuXHQiCisgICI0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2IgICAgICAgJVt0ZW1wMThdLCAzKzAqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICBcblx0IgorICAgICJsYnUgICAgICAlW3RlbXA1XSwgIDArMSoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgICAgIFxuXHQiCisgICAgImxidSAgICAgICVbdGVtcDhdLCAgMSsxKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgXG5cdCIKKyAgICAibGJ1ICAgICAgJVt0ZW1wMTFdLCAyKzEqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICBcblx0IgorICAgICJsYnUgICAgICAlW3RlbXAxNl0sIDMrMSoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDVdLCAgJVt0ZW1wNV0sICAlW3RlbXAxN10gICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wOF0sICAlW3RlbXA4XSwgICVbdGVtcDE1XSAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXAxMV0sICVbdGVtcDExXSwgJVt0ZW1wMTJdICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDE2XSwgJVt0ZW1wMTZdLCAlW3RlbXAxMF0gICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMThdLCAlW3RlbXA1XSwgIDggICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxXSwgICVbdGVtcDVdLCAgMzEgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcXogICAgICVbdGVtcDE4XSwgNWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAieG9yICAgICAgJVt0ZW1wNV0sICAlW3RlbXA1XSwgICVbdGVtcDVdICAgICAgICAgICBcblx0IgorICAgICJtb3Z6ICAgICAlW3RlbXA1XSwgICVbdGVtcDZdLCAgJVt0ZW1wMV0gICAgICAgICAgIFxuXHQiCisgICI1OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMThdLCAlW3RlbXA4XSwgIDggICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxXSwgICVbdGVtcDhdLCAgMzEgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcXogICAgICVbdGVtcDE4XSwgNmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAieG9yICAgICAgJVt0ZW1wOF0sICAlW3RlbXA4XSwgICVbdGVtcDhdICAgICAgICAgICBcblx0IgorICAgICJtb3Z6ICAgICAlW3RlbXA4XSwgICVbdGVtcDZdLCAgJVt0ZW1wMV0gICAgICAgICAgIFxuXHQiCisgICI2OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMThdLCAlW3RlbXAxMV0sIDggICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxXSwgICVbdGVtcDExXSwgMzEgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDE3XSwgJVt0ZW1wMTZdLCA4ICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTVdLCAlW3RlbXAxNl0sIDMxICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXF6ICAgICAlW3RlbXAxOF0sIDdmICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInhvciAgICAgICVbdGVtcDExXSwgJVt0ZW1wMTFdLCAlW3RlbXAxMV0gICAgICAgICAgXG5cdCIKKyAgICAibW92eiAgICAgJVt0ZW1wMTFdLCAlW3RlbXA2XSwgICVbdGVtcDFdICAgICAgICAgICBcblx0IgorICAiNzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcXogICAgICVbdGVtcDE3XSwgOGYgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAieG9yICAgICAgJVt0ZW1wMTZdLCAlW3RlbXAxNl0sICVbdGVtcDE2XSAgICAgICAgICBcblx0IgorICAgICJtb3Z6ICAgICAlW3RlbXAxNl0sICVbdGVtcDZdLCAgJVt0ZW1wMTVdICAgICAgICAgIFxuXHQiCisgICI4OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2IgICAgICAgJVt0ZW1wNV0sICAwKzEqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICBcblx0IgorICAgICJzYiAgICAgICAlW3RlbXA4XSwgIDErMSoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgICAgIFxuXHQiCisgICAgInNiICAgICAgICVbdGVtcDExXSwgMisxKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgXG5cdCIKKyAgICAic2IgICAgICAgJVt0ZW1wMTZdLCAzKzEqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICBcblx0IgorICAgICJsYnUgICAgICAlW3RlbXA1XSwgIDArMioiIFhTVFIoQlBTKSAiKCVbZHN0XSkgICAgIFxuXHQiCisgICAgImxidSAgICAgICVbdGVtcDhdLCAgMSsyKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgXG5cdCIKKyAgICAibGJ1ICAgICAgJVt0ZW1wMTFdLCAyKzIqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICBcblx0IgorICAgICJsYnUgICAgICAlW3RlbXAxNl0sIDMrMioiIFhTVFIoQlBTKSAiKCVbZHN0XSkgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDVdLCAgJVt0ZW1wNV0sICAlW3RlbXA5XSAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wOF0sICAlW3RlbXA4XSwgICVbdGVtcDNdICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXAxMV0sICVbdGVtcDExXSwgJVt0ZW1wMF0gICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDE2XSwgJVt0ZW1wMTZdLCAlW3RlbXAxNF0gICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMThdLCAlW3RlbXA1XSwgIDggICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxXSwgICVbdGVtcDVdLCAgMzEgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDE3XSwgJVt0ZW1wOF0sICA4ICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTVdLCAlW3RlbXA4XSwgIDMxICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxMl0sICVbdGVtcDExXSwgOCAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDEwXSwgJVt0ZW1wMTFdLCAzMSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wOV0sICAlW3RlbXAxNl0sIDggICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAzXSwgICVbdGVtcDE2XSwgMzEgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcXogICAgICVbdGVtcDE4XSwgOWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAieG9yICAgICAgJVt0ZW1wNV0sICAlW3RlbXA1XSwgICVbdGVtcDVdICAgICAgICAgICBcblx0IgorICAgICJtb3Z6ICAgICAlW3RlbXA1XSwgICVbdGVtcDZdLCAgJVt0ZW1wMV0gICAgICAgICAgIFxuXHQiCisgICI5OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxeiAgICAgJVt0ZW1wMTddLCAxMGYgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ4b3IgICAgICAlW3RlbXA4XSwgICVbdGVtcDhdLCAgJVt0ZW1wOF0gICAgICAgICAgIFxuXHQiCisgICAgIm1vdnogICAgICVbdGVtcDhdLCAgJVt0ZW1wNl0sICAlW3RlbXAxNV0gICAgICAgICAgXG5cdCIKKyAgIjEwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXF6ICAgICAlW3RlbXAxMl0sIDExZiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInhvciAgICAgICVbdGVtcDExXSwgJVt0ZW1wMTFdLCAlW3RlbXAxMV0gICAgICAgICAgXG5cdCIKKyAgICAibW92eiAgICAgJVt0ZW1wMTFdLCAlW3RlbXA2XSwgICVbdGVtcDEwXSAgICAgICAgICBcblx0IgorICAiMTE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcXogICAgICVbdGVtcDldLCAgMTJmICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAieG9yICAgICAgJVt0ZW1wMTZdLCAlW3RlbXAxNl0sICVbdGVtcDE2XSAgICAgICAgICBcblx0IgorICAgICJtb3Z6ICAgICAlW3RlbXAxNl0sICVbdGVtcDZdLCAgJVt0ZW1wM10gICAgICAgICAgIFxuXHQiCisgICIxMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2IgICAgICAgJVt0ZW1wNV0sICAwKzIqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICBcblx0IgorICAgICJzYiAgICAgICAlW3RlbXA4XSwgIDErMioiIFhTVFIoQlBTKSAiKCVbZHN0XSkgICAgIFxuXHQiCisgICAgInNiICAgICAgICVbdGVtcDExXSwgMisyKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgXG5cdCIKKyAgICAic2IgICAgICAgJVt0ZW1wMTZdLCAzKzIqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICBcblx0IgorICAgICJsYnUgICAgICAlW3RlbXA1XSwgIDArMyoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgICAgIFxuXHQiCisgICAgImxidSAgICAgICVbdGVtcDhdLCAgMSszKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgXG5cdCIKKyAgICAibGJ1ICAgICAgJVt0ZW1wMTFdLCAyKzMqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICBcblx0IgorICAgICJsYnUgICAgICAlW3RlbXAxNl0sIDMrMyoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDVdLCAgJVt0ZW1wNV0sICAlW3RlbXAxM10gICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wOF0sICAlW3RlbXA4XSwgICVbdGVtcDddICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXAxMV0sICVbdGVtcDExXSwgJVt0ZW1wNF0gICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDE2XSwgJVt0ZW1wMTZdLCAlW3RlbXAyXSAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMThdLCAlW3RlbXA1XSwgIDggICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxXSwgICVbdGVtcDVdLCAgMzEgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDE3XSwgJVt0ZW1wOF0sICA4ICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTVdLCAlW3RlbXA4XSwgIDMxICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxMl0sICVbdGVtcDExXSwgOCAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDEwXSwgJVt0ZW1wMTFdLCAzMSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wOV0sICAlW3RlbXAxNl0sIDggICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAzXSwgICVbdGVtcDE2XSwgMzEgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcXogICAgICVbdGVtcDE4XSwgMTNmICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAieG9yICAgICAgJVt0ZW1wNV0sICAlW3RlbXA1XSwgICVbdGVtcDVdICAgICAgICAgICBcblx0IgorICAgICJtb3Z6ICAgICAlW3RlbXA1XSwgICVbdGVtcDZdLCAgJVt0ZW1wMV0gICAgICAgICAgIFxuXHQiCisgICIxMzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxeiAgICAgJVt0ZW1wMTddLCAxNGYgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ4b3IgICAgICAlW3RlbXA4XSwgICVbdGVtcDhdLCAgJVt0ZW1wOF0gICAgICAgICAgIFxuXHQiCisgICAgIm1vdnogICAgICVbdGVtcDhdLCAgJVt0ZW1wNl0sICAlW3RlbXAxNV0gICAgICAgICAgXG5cdCIKKyAgIjE0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXF6ICAgICAlW3RlbXAxMl0sIDE1ZiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInhvciAgICAgICVbdGVtcDExXSwgJVt0ZW1wMTFdLCAlW3RlbXAxMV0gICAgICAgICAgXG5cdCIKKyAgICAibW92eiAgICAgJVt0ZW1wMTFdLCAlW3RlbXA2XSwgICVbdGVtcDEwXSAgICAgICAgICBcblx0IgorICAiMTU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcXogICAgICVbdGVtcDldLCAgMTZmICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAieG9yICAgICAgJVt0ZW1wMTZdLCAlW3RlbXAxNl0sICVbdGVtcDE2XSAgICAgICAgICBcblx0IgorICAgICJtb3Z6ICAgICAlW3RlbXAxNl0sICVbdGVtcDZdLCAgJVt0ZW1wM10gICAgICAgICAgIFxuXHQiCisgICIxNjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2IgICAgICAgJVt0ZW1wNV0sICAwKzMqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICBcblx0IgorICAgICJzYiAgICAgICAlW3RlbXA4XSwgIDErMyoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgICAgIFxuXHQiCisgICAgInNiICAgICAgICVbdGVtcDExXSwgMiszKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgXG5cdCIKKyAgICAic2IgICAgICAgJVt0ZW1wMTZdLCAzKzMqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICBcblx0IgorCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgIFt0ZW1wNl0iPSZyIih0ZW1wNiksIFt0ZW1wN10iPSZyIih0ZW1wNyksIFt0ZW1wOF0iPSZyIih0ZW1wOCksCisgICAgICBbdGVtcDldIj0mciIodGVtcDkpLCBbdGVtcDEwXSI9JnIiKHRlbXAxMCksIFt0ZW1wMTFdIj0mciIodGVtcDExKSwKKyAgICAgIFt0ZW1wMTJdIj0mciIodGVtcDEyKSwgW3RlbXAxM10iPSZyIih0ZW1wMTMpLCBbdGVtcDE0XSI9JnIiKHRlbXAxNCksCisgICAgICBbdGVtcDE1XSI9JnIiKHRlbXAxNSksIFt0ZW1wMTZdIj0mciIodGVtcDE2KSwgW3RlbXAxN10iPSZyIih0ZW1wMTcpLAorICAgICAgW3RlbXAxOF0iPSZyIih0ZW1wMTgpCisgICAgOiBbaW5dInIiKHBfaW4pLCBba0MxXSJyIihrQzEpLCBba0MyXSJyIihrQzIpLCBbZHN0XSJyIihkc3QpCisgICAgOiAibWVtb3J5IiwgImhpIiwgImxvIgorICApOworfQorCitzdGF0aWMgdm9pZCBUcmFuc2Zvcm1Ud28oY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCwgaW50IGRvX3R3bykgeworICBUcmFuc2Zvcm1PbmUoaW4sIGRzdCk7CisgIGlmIChkb190d28pIHsKKyAgICBUcmFuc2Zvcm1PbmUoaW4gKyAxNiwgZHN0ICsgNCk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFZQOERzcEluaXRNSVBTMzIodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBWUDhEc3BJbml0TUlQUzMyKHZvaWQpIHsKKyAgVlA4SW5pdENsaXBUYWJsZXMoKTsKKworICBWUDhUcmFuc2Zvcm0gPSBUcmFuc2Zvcm1Ud287CisKKyAgVlA4VkZpbHRlcjE2ID0gVkZpbHRlcjE2OworICBWUDhIRmlsdGVyMTYgPSBIRmlsdGVyMTY7CisgIFZQOFZGaWx0ZXI4ID0gVkZpbHRlcjg7CisgIFZQOEhGaWx0ZXI4ID0gSEZpbHRlcjg7CisgIFZQOFZGaWx0ZXIxNmkgPSBWRmlsdGVyMTZpOworICBWUDhIRmlsdGVyMTZpID0gSEZpbHRlcjE2aTsKKyAgVlA4VkZpbHRlcjhpID0gVkZpbHRlcjhpOworICBWUDhIRmlsdGVyOGkgPSBIRmlsdGVyOGk7CisKKyAgVlA4U2ltcGxlVkZpbHRlcjE2ID0gU2ltcGxlVkZpbHRlcjE2OworICBWUDhTaW1wbGVIRmlsdGVyMTYgPSBTaW1wbGVIRmlsdGVyMTY7CisgIFZQOFNpbXBsZVZGaWx0ZXIxNmkgPSBTaW1wbGVWRmlsdGVyMTZpOworICBWUDhTaW1wbGVIRmlsdGVyMTZpID0gU2ltcGxlSEZpbHRlcjE2aTsKK30KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9NSVBTMzIKKworV0VCUF9EU1BfSU5JVF9TVFVCKFZQOERzcEluaXRNSVBTMzIpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfTUlQUzMyCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2RlY19taXBzX2RzcF9yMi5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9kZWNfbWlwc19kc3BfcjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDkzNmJjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9kZWNfbWlwc19kc3BfcjIuYwpAQCAtMCwwICsxLDk5NCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIE1JUFMgdmVyc2lvbiBvZiBkc3AgZnVuY3Rpb25zCisvLworLy8gQXV0aG9yKHMpOiAgRGpvcmRqZSBQZXN1dCAgICAoZGpvcmRqZS5wZXN1dEBpbWd0ZWMuY29tKQorLy8gICAgICAgICAgICAgSm92YW4gWmVsaW5jZXZpYyAoam92YW4uemVsaW5jZXZpY0BpbWd0ZWMuY29tKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQU19EU1BfUjIpCisKKyNpbmNsdWRlICJzcmMvZHNwL21pcHNfbWFjcm8uaCIKKworc3RhdGljIGNvbnN0IGludCBrQzEgPSAyMDA5MSArICgxIDw8IDE2KTsKK3N0YXRpYyBjb25zdCBpbnQga0MyID0gMzU0Njg7CisKKyNkZWZpbmUgTVVMKGEsIGIpICgoKGEpICogKGIpKSA+PiAxNikKKworc3RhdGljIHZvaWQgVHJhbnNmb3JtREMoY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCkgeworICBpbnQgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wOSwgdGVtcDEwOworCisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgIExPQURfV0lUSF9PRkZTRVRfWDQodGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAxLCAyLCAzLAorICAgICAgICAgICAgICAgICAgICAgICAgQlBTKQorICAgICJsaCAgICAgICAgICAgICAgICVbdGVtcDVdLCAgMCglW2luXSkgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGRpdSAgICAgICAgICAgICVbdGVtcDVdLCAgJVt0ZW1wNV0sICA0ICAgICAgICAgICBcblx0IgorICAgICJpbnMgICAgICAgICAgICAgICVbdGVtcDVdLCAgJVt0ZW1wNV0sICAxNiwgMTYgICAgICBcblx0IgorICAgICJzaHJhLnBoICAgICAgICAgICVbdGVtcDVdLCAgJVt0ZW1wNV0sICAzICAgICAgICAgICBcblx0IgorICAgIENPTlZFUlRfMl9CWVRFU19UT19IQUxGKHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXA5LCB0ZW1wMTAsIHRlbXAxLCB0ZW1wMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMywgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQpCisgICAgU1RPUkVfU0FUX1NVTV9YMih0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wOSwgdGVtcDEwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLAorICAgICAgICAgICAgICAgICAgICAgdGVtcDUsIHRlbXA1LCB0ZW1wNSwgdGVtcDUsIHRlbXA1LCB0ZW1wNSwgdGVtcDUsIHRlbXA1LAorICAgICAgICAgICAgICAgICAgICAgZHN0LCAwLCAxLCAyLCAzLCBCUFMpCisKKyAgICBPVVRQVVRfRUFSTFlfQ0xPQkJFUl9SRUdTXzEwKCkKKyAgICA6IFtpbl0iciIoaW4pLCBbZHN0XSJyIihkc3QpCisgICAgOiAibWVtb3J5IgorICApOworfQorCitzdGF0aWMgdm9pZCBUcmFuc2Zvcm1BQzMoY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCkgeworICBjb25zdCBpbnQgYSA9IGluWzBdICsgNDsKKyAgaW50IGM0ID0gTVVMKGluWzRdLCBrQzIpOworICBjb25zdCBpbnQgZDQgPSBNVUwoaW5bNF0sIGtDMSk7CisgIGNvbnN0IGludCBjMSA9IE1VTChpblsxXSwga0MyKTsKKyAgY29uc3QgaW50IGQxID0gTVVMKGluWzFdLCBrQzEpOworICBpbnQgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wOTsKKyAgaW50IHRlbXAxMCwgdGVtcDExLCB0ZW1wMTIsIHRlbXAxMywgdGVtcDE0LCB0ZW1wMTUsIHRlbXAxNiwgdGVtcDE3LCB0ZW1wMTg7CisKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgImlucyAgICAgICAgICAgICAgJVtjNF0sICAgICAgJVtkNF0sICAgICAxNiwgICAgICAgMTYgICAgXG5cdCIKKyAgICAicmVwbHYucGggICAgICAgICAlW3RlbXAxXSwgICAlW2FdICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJyZXBsdi5waCAgICAgICAgICVbdGVtcDRdLCAgICVbZDFdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgQUREX1NVQl9IQUxWRVModGVtcDIsIHRlbXAzLCB0ZW1wMSwgYzQpCisgICAgInJlcGx2LnBoICAgICAgICAgJVt0ZW1wNV0sICAgJVtjMV0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICBTSElGVF9SX1NVTV9YMih0ZW1wMSwgdGVtcDYsIHRlbXA3LCB0ZW1wOCwgdGVtcDIsIHRlbXA5LCB0ZW1wMTAsIHRlbXA0LAorICAgICAgICAgICAgICAgICAgIHRlbXAyLCB0ZW1wMiwgdGVtcDMsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA0LCB0ZW1wNSkKKyAgICBMT0FEX1dJVEhfT0ZGU0VUX1g0KHRlbXAzLCB0ZW1wNSwgdGVtcDExLCB0ZW1wMTIsIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAxLCAyLCAzLAorICAgICAgICAgICAgICAgICAgICAgICAgQlBTKQorICAgIENPTlZFUlRfMl9CWVRFU19UT19IQUxGKHRlbXAxMywgdGVtcDE0LCB0ZW1wMywgdGVtcDE1LCB0ZW1wNSwgdGVtcDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAxMSwgdGVtcDE3LCB0ZW1wMywgdGVtcDUsIHRlbXAxMSwgdGVtcDEyKQorICAgIFBBQ0tfMl9IQUxWRVNfVE9fV09SRCh0ZW1wMTIsIHRlbXAxOCwgdGVtcDcsIHRlbXA2LCB0ZW1wMSwgdGVtcDgsIHRlbXAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wNCwgdGVtcDcsIHRlbXA2LCB0ZW1wMTAsIHRlbXA5KQorICAgIFNUT1JFX1NBVF9TVU1fWDIodGVtcDEzLCB0ZW1wMTQsIHRlbXAzLCB0ZW1wMTUsIHRlbXA1LCB0ZW1wMTYsIHRlbXAxMSwKKyAgICAgICAgICAgICAgICAgICAgIHRlbXAxNywgdGVtcDEyLCB0ZW1wMTgsIHRlbXAxLCB0ZW1wOCwgdGVtcDIsIHRlbXA0LAorICAgICAgICAgICAgICAgICAgICAgdGVtcDcsIHRlbXA2LCBkc3QsIDAsIDEsIDIsIDMsIEJQUykKKworICAgIE9VVFBVVF9FQVJMWV9DTE9CQkVSX1JFR1NfMTgoKSwKKyAgICAgIFtjNF0iKyZyIihjNCkKKyAgICA6IFtkc3RdInIiKGRzdCksIFthXSJyIihhKSwgW2QxXSJyIihkMSksIFtkNF0iciIoZDQpLCBbYzFdInIiKGMxKQorICAgIDogIm1lbW9yeSIKKyAgKTsKK30KKworc3RhdGljIHZvaWQgVHJhbnNmb3JtT25lKGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QpIHsKKyAgaW50IHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3LCB0ZW1wOCwgdGVtcDk7CisgIGludCB0ZW1wMTAsIHRlbXAxMSwgdGVtcDEyLCB0ZW1wMTMsIHRlbXAxNCwgdGVtcDE1LCB0ZW1wMTYsIHRlbXAxNywgdGVtcDE4OworCisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICJ1bHcgICAgICAgICAgICAgICVbdGVtcDFdLCAgIDAoJVtpbl0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ1bHcgICAgICAgICAgICAgICVbdGVtcDJdLCAgIDE2KCVbaW5dKSAgICAgICAgICAgICAgICBcblx0IgorICAgIExPQURfSU5fWDIodGVtcDUsIHRlbXA2LCAyNCwgMjYpCisgICAgQUREX1NVQl9IQUxWRVModGVtcDMsIHRlbXA0LCB0ZW1wMSwgdGVtcDIpCisgICAgTE9BRF9JTl9YMih0ZW1wMSwgdGVtcDIsIDgsIDEwKQorICAgIE1VTF9TSElGVF9TVU0odGVtcDcsIHRlbXA4LCB0ZW1wOSwgdGVtcDEwLCB0ZW1wMTEsIHRlbXAxMiwgdGVtcDEzLCB0ZW1wMTQsCisgICAgICAgICAgICAgICAgICB0ZW1wMTAsIHRlbXA4LCB0ZW1wOSwgdGVtcDcsIHRlbXAxLCB0ZW1wMiwgdGVtcDUsIHRlbXA2LAorICAgICAgICAgICAgICAgICAgdGVtcDEzLCB0ZW1wMTEsIHRlbXAxNCwgdGVtcDEyKQorICAgIElOU0VSVF9IQUxGX1gyKHRlbXA4LCB0ZW1wNywgdGVtcDEwLCB0ZW1wOSkKKyAgICAidWx3ICAgICAgICAgICAgICAlW3RlbXAxN10sICA0KCVbaW5dKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAidWx3ICAgICAgICAgICAgICAlW3RlbXAxOF0sICAyMCglW2luXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICBBRERfU1VCX0hBTFZFUyh0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wOCkKKyAgICBBRERfU1VCX0hBTFZFUyh0ZW1wNSwgdGVtcDYsIHRlbXA0LCB0ZW1wNykKKyAgICBBRERfU1VCX0hBTFZFUyh0ZW1wNywgdGVtcDgsIHRlbXAxNywgdGVtcDE4KQorICAgIExPQURfSU5fWDIodGVtcDE3LCB0ZW1wMTgsIDEyLCAxNCkKKyAgICBMT0FEX0lOX1gyKHRlbXA5LCB0ZW1wMTAsIDI4LCAzMCkKKyAgICBNVUxfU0hJRlRfU1VNKHRlbXAxMSwgdGVtcDEyLCB0ZW1wMTMsIHRlbXAxNCwgdGVtcDE1LCB0ZW1wMTYsIHRlbXA0LCB0ZW1wMTcsCisgICAgICAgICAgICAgICAgICB0ZW1wMTIsIHRlbXAxNCwgdGVtcDExLCB0ZW1wMTMsIHRlbXAxNywgdGVtcDE4LCB0ZW1wOSwgdGVtcDEwLAorICAgICAgICAgICAgICAgICAgdGVtcDE1LCB0ZW1wNCwgdGVtcDE2LCB0ZW1wMTcpCisgICAgSU5TRVJUX0hBTEZfWDIodGVtcDExLCB0ZW1wMTIsIHRlbXAxMywgdGVtcDE0KQorICAgIEFERF9TVUJfSEFMVkVTKHRlbXAxNywgdGVtcDgsIHRlbXA4LCB0ZW1wMTEpCisgICAgQUREX1NVQl9IQUxWRVModGVtcDMsIHRlbXA0LCB0ZW1wNywgdGVtcDEyKQorCisgICAgLy8gaG9yaXpvbnRhbAorICAgIFNSQV8xNih0ZW1wOSwgdGVtcDEwLCB0ZW1wMTEsIHRlbXAxMiwgdGVtcDEsIHRlbXAyLCB0ZW1wNSwgdGVtcDYpCisgICAgSU5TRVJUX0hBTEZfWDIodGVtcDEsIHRlbXA2LCB0ZW1wNSwgdGVtcDIpCisgICAgU1JBXzE2KHRlbXAxMywgdGVtcDE0LCB0ZW1wMTUsIHRlbXAxNiwgdGVtcDMsIHRlbXA0LCB0ZW1wMTcsIHRlbXA4KQorICAgICJyZXBsLnBoICAgICAgICAgICVbdGVtcDJdLCAgIDB4NCAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIElOU0VSVF9IQUxGX1gyKHRlbXAzLCB0ZW1wOCwgdGVtcDE3LCB0ZW1wNCkKKyAgICAiYWRkcS5waCAgICAgICAgICAlW3RlbXAxXSwgICAlW3RlbXAxXSwgICVbdGVtcDJdICAgICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgICAlW3RlbXA2XSwgICAlW3RlbXA2XSwgICVbdGVtcDJdICAgICAgXG5cdCIKKyAgICBBRERfU1VCX0hBTFZFUyh0ZW1wMiwgdGVtcDQsIHRlbXAxLCB0ZW1wMykKKyAgICBBRERfU1VCX0hBTFZFUyh0ZW1wNSwgdGVtcDcsIHRlbXA2LCB0ZW1wOCkKKyAgICBNVUxfU0hJRlRfU1VNKHRlbXAxLCB0ZW1wMywgdGVtcDYsIHRlbXA4LCB0ZW1wOSwgdGVtcDEzLCB0ZW1wMTcsIHRlbXAxOCwKKyAgICAgICAgICAgICAgICAgIHRlbXAzLCB0ZW1wMTMsIHRlbXAxLCB0ZW1wOSwgdGVtcDksIHRlbXAxMywgdGVtcDExLCB0ZW1wMTUsCisgICAgICAgICAgICAgICAgICB0ZW1wNiwgdGVtcDE3LCB0ZW1wOCwgdGVtcDE4KQorICAgIE1VTF9TSElGVF9TVU0odGVtcDYsIHRlbXA4LCB0ZW1wMTgsIHRlbXAxNywgdGVtcDExLCB0ZW1wMTUsIHRlbXAxMiwgdGVtcDE2LAorICAgICAgICAgICAgICAgICAgdGVtcDgsIHRlbXAxNSwgdGVtcDYsIHRlbXAxMSwgdGVtcDEyLCB0ZW1wMTYsIHRlbXAxMCwgdGVtcDE0LAorICAgICAgICAgICAgICAgICAgdGVtcDE4LCB0ZW1wMTIsIHRlbXAxNywgdGVtcDE2KQorICAgIElOU0VSVF9IQUxGX1gyKHRlbXAxLCB0ZW1wMywgdGVtcDksIHRlbXAxMykKKyAgICBJTlNFUlRfSEFMRl9YMih0ZW1wNiwgdGVtcDgsIHRlbXAxMSwgdGVtcDE1KQorICAgIFNISUZUX1JfU1VNX1gyKHRlbXA5LCB0ZW1wMTAsIHRlbXAxMSwgdGVtcDEyLCB0ZW1wMTMsIHRlbXAxNCwgdGVtcDE1LAorICAgICAgICAgICAgICAgICAgIHRlbXAxNiwgdGVtcDIsIHRlbXA0LCB0ZW1wNSwgdGVtcDcsIHRlbXAzLCB0ZW1wMSwgdGVtcDgsCisgICAgICAgICAgICAgICAgICAgdGVtcDYpCisgICAgUEFDS18yX0hBTFZFU19UT19XT1JEKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wOSwgdGVtcDEyLCB0ZW1wMTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAxNiwgdGVtcDExLCB0ZW1wMTAsIHRlbXAxNSwgdGVtcDE0KQorICAgIExPQURfV0lUSF9PRkZTRVRfWDQodGVtcDEwLCB0ZW1wMTEsIHRlbXAxNCwgdGVtcDE1LCBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgMiwgMywKKyAgICAgICAgICAgICAgICAgICAgICAgIEJQUykKKyAgICBDT05WRVJUXzJfQllURVNfVE9fSEFMRih0ZW1wNSwgdGVtcDYsIHRlbXA3LCB0ZW1wOCwgdGVtcDE3LCB0ZW1wMTgsIHRlbXAxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMTEsIHRlbXAxMCwgdGVtcDExLCB0ZW1wMTQsIHRlbXAxNSkKKyAgICBTVE9SRV9TQVRfU1VNX1gyKHRlbXA1LCB0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wMTcsIHRlbXAxOCwgdGVtcDEwLCB0ZW1wMTEsCisgICAgICAgICAgICAgICAgICAgICB0ZW1wOSwgdGVtcDEyLCB0ZW1wMSwgdGVtcDIsIHRlbXAxMywgdGVtcDE2LCB0ZW1wMywgdGVtcDQsCisgICAgICAgICAgICAgICAgICAgICBkc3QsIDAsIDEsIDIsIDMsIEJQUykKKworICAgIE9VVFBVVF9FQVJMWV9DTE9CQkVSX1JFR1NfMTgoKQorICAgIDogW2RzdF0iciIoZHN0KSwgW2luXSJyIihpbiksIFtrQzFdInIiKGtDMSksIFtrQzJdInIiKGtDMikKKyAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iCisgICk7Cit9CisKK3N0YXRpYyB2b2lkIFRyYW5zZm9ybVR3byhjb25zdCBpbnQxNl90KiBpbiwgdWludDhfdCogZHN0LCBpbnQgZG9fdHdvKSB7CisgIFRyYW5zZm9ybU9uZShpbiwgZHN0KTsKKyAgaWYgKGRvX3R3bykgeworICAgIFRyYW5zZm9ybU9uZShpbiArIDE2LCBkc3QgKyA0KTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBGaWx0ZXJMb29wMjYodWludDhfdCogcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaHN0cmlkZSwgaW50IHZzdHJpZGUsIGludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICBjb25zdCBpbnQgdGhyZXNoMiA9IDIgKiB0aHJlc2ggKyAxOworICBpbnQgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wOTsKKyAgaW50IHRlbXAxMCwgdGVtcDExLCB0ZW1wMTIsIHRlbXAxMywgdGVtcDE0LCB0ZW1wMTU7CisKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgIi5zZXQgICAgICBwdXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIuc2V0ICAgICAgbm9yZW9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIm5lZ3UgICAgICAlW3RlbXAxXSwgICVbaHN0cmlkZV0gICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGRpdSAgICAgJVtzaXplXSwgICAlW3NpemVdLCAgICAgICAgLTEgICAgICAgICAgICAgXG5cdCIKKyAgICAic2xsICAgICAgICVbdGVtcDJdLCAgJVtoc3RyaWRlXSwgICAgIDEgICAgICAgICAgICAgIFxuXHQiCisgICAgInNsbCAgICAgICAlW3RlbXAzXSwgICVbdGVtcDFdLCAgICAgICAxICAgICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVt0ZW1wNF0sICAlW3RlbXAyXSwgICAgICAgJVtoc3RyaWRlXSAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbdGVtcDVdLCAgJVt0ZW1wM10sICAgICAgICVbdGVtcDFdICAgICAgIFxuXHQiCisgICAgImxidSAgICAgICAlW3RlbXA3XSwgIDAoJVtwXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzbGwgICAgICAgJVt0ZW1wNl0sICAlW3RlbXAzXSwgICAgICAgMSAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICVbdGVtcDhdLCAgJVt0ZW1wNV0oJVtwXSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAlW3RlbXA5XSwgICVbdGVtcDNdKCVbcF0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgJVt0ZW1wMTBdLCAlW3RlbXAxXSglW3BdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICVbdGVtcDExXSwgJVt0ZW1wNl0oJVtwXSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAlW3RlbXAxMl0sICVbaHN0cmlkZV0oJVtwXSkgICAgICAgICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgJVt0ZW1wMTNdLCAlW3RlbXAyXSglW3BdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICVbdGVtcDE0XSwgJVt0ZW1wNF0oJVtwXSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXAxXSwgICVbdGVtcDEwXSwgICAgICAlW3RlbXA3XSAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVt0ZW1wMl0sICAlW3RlbXA5XSwgICAgICAgJVt0ZW1wMTJdICAgICAgXG5cdCIKKyAgICAiYWJzcV9zLncgICVbdGVtcDNdLCAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFic3Ffcy53ICAlW3RlbXA0XSwgICVbdGVtcDJdICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJuZWd1ICAgICAgJVt0ZW1wMV0sICAlW3RlbXAxXSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2xsICAgICAgICVbdGVtcDNdLCAgJVt0ZW1wM10sICAgICAgIDIgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3RlbXAxNV0sICVbdGVtcDNdLCAgICAgICAlW3RlbXA0XSAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVt0ZW1wM10sICAlW3RlbXAxNV0sICAgICAgJVt0aHJlc2gyXSAgICAgXG5cdCIKKyAgICAic2xsICAgICAgICVbdGVtcDZdLCAgJVt0ZW1wMV0sICAgICAgIDEgICAgICAgICAgICAgIFxuXHQiCisgICAgImJndHogICAgICAlW3RlbXAzXSwgIDNmICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIgc3VidSAgICAgJVt0ZW1wNF0sICAlW3RlbXAxMV0sICAgICAgJVt0ZW1wOF0gICAgICAgXG5cdCIKKyAgICAiYWJzcV9zLncgICVbdGVtcDRdLCAgJVt0ZW1wNF0gICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNobGxfcy53ICAlW3RlbXAyXSwgICVbdGVtcDJdLCAgICAgICAyNCAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVt0ZW1wNF0sICAlW3RlbXA0XSwgICAgICAgJVtpdGhyZXNoXSAgICAgXG5cdCIKKyAgICAiYmd0eiAgICAgICVbdGVtcDRdLCAgM2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIiBzdWJ1ICAgICAlW3RlbXAzXSwgICVbdGVtcDhdLCAgICAgICAlW3RlbXA5XSAgICAgICBcblx0IgorICAgICJhYnNxX3MudyAgJVt0ZW1wM10sICAlW3RlbXAzXSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbdGVtcDNdLCAgJVt0ZW1wM10sICAgICAgICVbaXRocmVzaF0gICAgIFxuXHQiCisgICAgImJndHogICAgICAlW3RlbXAzXSwgIDNmICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIgc3VidSAgICAgJVt0ZW1wNV0sICAlW3RlbXA5XSwgICAgICAgJVt0ZW1wMTBdICAgICAgXG5cdCIKKyAgICAiYWJzcV9zLncgICVbdGVtcDNdLCAgJVt0ZW1wNV0gICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFic3Ffcy53ICAlW3RlbXA1XSwgICVbdGVtcDVdICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVt0ZW1wM10sICAlW3RlbXAzXSwgICAgICAgJVtpdGhyZXNoXSAgICAgXG5cdCIKKyAgICAiYmd0eiAgICAgICVbdGVtcDNdLCAgM2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIiBzdWJ1ICAgICAlW3RlbXAzXSwgICVbdGVtcDE0XSwgICAgICAlW3RlbXAxM10gICAgICBcblx0IgorICAgICJhYnNxX3MudyAgJVt0ZW1wM10sICAlW3RlbXAzXSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2x0ICAgICAgICVbdGVtcDVdLCAgJVtoZXZfdGhyZXNoXSwgICVbdGVtcDVdICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXAzXSwgICVbdGVtcDNdLCAgICAgICAlW2l0aHJlc2hdICAgICBcblx0IgorICAgICJiZ3R6ICAgICAgJVt0ZW1wM10sICAzZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiIHN1YnUgICAgICVbdGVtcDNdLCAgJVt0ZW1wMTNdLCAgICAgICVbdGVtcDEyXSAgICAgIFxuXHQiCisgICAgImFic3Ffcy53ICAlW3RlbXAzXSwgICVbdGVtcDNdICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAgJVt0ZW1wNF0sICAlW3RlbXAyXSwgICAgICAgMjQgICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbdGVtcDNdLCAgJVt0ZW1wM10sICAgICAgICVbaXRocmVzaF0gICAgIFxuXHQiCisgICAgImJndHogICAgICAlW3RlbXAzXSwgIDNmICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIgc3VidSAgICAgJVt0ZW1wMTVdLCAlW3RlbXAxMl0sICAgICAgJVt0ZW1wN10gICAgICAgXG5cdCIKKyAgICAiYWJzcV9zLncgICVbdGVtcDNdLCAgJVt0ZW1wMTVdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFic3Ffcy53ICAlW3RlbXAxNV0sICVbdGVtcDE1XSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVt0ZW1wM10sICAlW3RlbXAzXSwgICAgICAgJVtpdGhyZXNoXSAgICAgXG5cdCIKKyAgICAiYmd0eiAgICAgICVbdGVtcDNdLCAgM2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIiBzbHQgICAgICAlW3RlbXAxNV0sICVbaGV2X3RocmVzaF0sICAlW3RlbXAxNV0gICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVt0ZW1wM10sICAlW3RlbXA2XSwgICAgICAgJVt0ZW1wMV0gICAgICAgXG5cdCIKKyAgICAib3IgICAgICAgICVbdGVtcDJdLCAgJVt0ZW1wNV0sICAgICAgICVbdGVtcDE1XSAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3RlbXA1XSwgICVbdGVtcDRdLCAgICAgICAlW3RlbXAzXSAgICAgICBcblx0IgorICAgICJiZXF6ICAgICAgJVt0ZW1wMl0sICA0ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiIHNocmFfci53ICVbdGVtcDFdLCAgJVt0ZW1wNV0sICAgICAgIDMgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAgICAlW3RlbXAyXSwgICVbdGVtcDVdLCAgICAgICAzICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAgJVt0ZW1wMl0sICAlW3RlbXAyXSwgICAgICAgMyAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2hsbF9zLncgICVbdGVtcDFdLCAgJVt0ZW1wMV0sICAgICAgIDI3ICAgICAgICAgICAgIFxuXHQiCisgICAgInNobGxfcy53ICAlW3RlbXAyXSwgICVbdGVtcDJdLCAgICAgICAyNyAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVt0ZW1wM10sICAlW3BdLCAgICAgICAgICAgJVtoc3RyaWRlXSAgICAgXG5cdCIKKyAgICAic3JhICAgICAgICVbdGVtcDFdLCAgJVt0ZW1wMV0sICAgICAgIDI3ICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICAlW3RlbXAyXSwgICVbdGVtcDJdLCAgICAgICAyNyAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVt0ZW1wMV0sICAlW3RlbXA3XSwgICAgICAgJVt0ZW1wMV0gICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbdGVtcDJdLCAgJVt0ZW1wMTBdLCAgICAgICVbdGVtcDJdICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAlW3RlbXAyXSwgICVbdGVtcDJdKCVbVlA4a2NsaXAxXSkgICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgJVt0ZW1wMV0sICAlW3RlbXAxXSglW1ZQOGtjbGlwMV0pICAgICAgICAgXG5cdCIKKyAgICAic2IgICAgICAgICVbdGVtcDJdLCAgMCglW3RlbXAzXSkgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImogICAgICAgICAzZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIgc2IgICAgICAgJVt0ZW1wMV0sICAwKCVbcF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgIjQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNobGxfcy53ICAlW3RlbXA1XSwgICVbdGVtcDVdLCAgICAgICAyNCAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVt0ZW1wMTRdLCAlW3BdLCAgICAgICAgICAgJVtoc3RyaWRlXSAgICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbdGVtcDExXSwgJVt0ZW1wMTRdLCAgICAgICVbaHN0cmlkZV0gICAgIFxuXHQiCisgICAgInNyYSAgICAgICAlW3RlbXA2XSwgICVbdGVtcDVdLCAgICAgICAyNCAgICAgICAgICAgICBcblx0IgorICAgICJzbGwgICAgICAgJVt0ZW1wMV0sICAlW3RlbXA2XSwgICAgICAgMyAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbdGVtcDE1XSwgJVt0ZW1wMTFdLCAgICAgICVbaHN0cmlkZV0gICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3RlbXAyXSwgICVbdGVtcDZdLCAgICAgICAlW3RlbXAxXSAgICAgICBcblx0IgorICAgICJzbGwgICAgICAgJVt0ZW1wM10sICAlW3RlbXAyXSwgICAgICAgMSAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbdGVtcDRdLCAgJVt0ZW1wM10sICAgICAgICVbdGVtcDJdICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAgICAlW3RlbXAyXSwgICVbdGVtcDJdLCAgICAgICA2MyAgICAgICAgICAgICBcblx0IgorICAgICJhZGRpdSAgICAgJVt0ZW1wM10sICAlW3RlbXAzXSwgICAgICAgNjMgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICVbdGVtcDRdLCAgJVt0ZW1wNF0sICAgICAgIDYzICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICAlW3RlbXAyXSwgICVbdGVtcDJdLCAgICAgICA3ICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAgJVt0ZW1wM10sICAlW3RlbXAzXSwgICAgICAgNyAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgICVbdGVtcDRdLCAgJVt0ZW1wNF0sICAgICAgIDcgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3RlbXAxXSwgICVbdGVtcDhdLCAgICAgICAlW3RlbXAyXSAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVt0ZW1wNV0sICAlW3RlbXA5XSwgICAgICAgJVt0ZW1wM10gICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbdGVtcDZdLCAgJVt0ZW1wMTBdLCAgICAgICVbdGVtcDRdICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXA4XSwgICVbdGVtcDddLCAgICAgICAlW3RlbXA0XSAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVt0ZW1wN10sICAlW3RlbXAxMl0sICAgICAgJVt0ZW1wM10gICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbdGVtcDEwXSwgJVtwXSwgICAgICAgICAgICVbaHN0cmlkZV0gICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXA5XSwgICVbdGVtcDEzXSwgICAgICAlW3RlbXAyXSAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVt0ZW1wMTJdLCAlW3RlbXAxMF0sICAgICAgJVtoc3RyaWRlXSAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICVbdGVtcDJdLCAgJVt0ZW1wMV0oJVtWUDhrY2xpcDFdKSAgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAlW3RlbXAzXSwgICVbdGVtcDVdKCVbVlA4a2NsaXAxXSkgICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgJVt0ZW1wNF0sICAlW3RlbXA2XSglW1ZQOGtjbGlwMV0pICAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICVbdGVtcDVdLCAgJVt0ZW1wOF0oJVtWUDhrY2xpcDFdKSAgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAlW3RlbXA2XSwgICVbdGVtcDddKCVbVlA4a2NsaXAxXSkgICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgJVt0ZW1wOF0sICAlW3RlbXA5XSglW1ZQOGtjbGlwMV0pICAgICAgICAgXG5cdCIKKyAgICAic2IgICAgICAgICVbdGVtcDJdLCAgMCglW3RlbXAxNV0pICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNiICAgICAgICAlW3RlbXAzXSwgIDAoJVt0ZW1wMTFdKSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzYiAgICAgICAgJVt0ZW1wNF0sICAwKCVbdGVtcDE0XSkgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2IgICAgICAgICVbdGVtcDVdLCAgMCglW3BdKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNiICAgICAgICAlW3RlbXA2XSwgIDAoJVt0ZW1wMTBdKSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzYiAgICAgICAgJVt0ZW1wOF0sICAwKCVbdGVtcDEyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgIjM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJndHogICAgICAlW3NpemVdLCAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIgYWRkdSAgICAgJVtwXSwgICAgICAlW3BdLCAgICAgICAgICAgJVt2c3RyaWRlXSAgICAgXG5cdCIKKyAgICAiLnNldCAgICAgIHBvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgOiBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLFt0ZW1wM10iPSZyIih0ZW1wMyksCisgICAgICBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLCBbdGVtcDZdIj0mciIodGVtcDYpLAorICAgICAgW3RlbXA3XSI9JnIiKHRlbXA3KSxbdGVtcDhdIj0mciIodGVtcDgpLFt0ZW1wOV0iPSZyIih0ZW1wOSksCisgICAgICBbdGVtcDEwXSI9JnIiKHRlbXAxMCksW3RlbXAxMV0iPSZyIih0ZW1wMTEpLFt0ZW1wMTJdIj0mciIodGVtcDEyKSwKKyAgICAgIFt0ZW1wMTNdIj0mciIodGVtcDEzKSxbdGVtcDE0XSI9JnIiKHRlbXAxNCksW3RlbXAxNV0iPSZyIih0ZW1wMTUpLAorICAgICAgW3NpemVdIismciIoc2l6ZSksIFtwXSIrJnIiKHApCisgICAgOiBbaHN0cmlkZV0iciIoaHN0cmlkZSksIFt0aHJlc2gyXSJyIih0aHJlc2gyKSwKKyAgICAgIFtpdGhyZXNoXSJyIihpdGhyZXNoKSxbdnN0cmlkZV0iciIodnN0cmlkZSksIFtoZXZfdGhyZXNoXSJyIihoZXZfdGhyZXNoKSwKKyAgICAgIFtWUDhrY2xpcDFdInIiKFZQOGtjbGlwMSkKKyAgICA6ICJtZW1vcnkiCisgICk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEZpbHRlckxvb3AyNCh1aW50OF90KiBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoc3RyaWRlLCBpbnQgdnN0cmlkZSwgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIGludCBwMCwgcTAsIHAxLCBxMSwgcDIsIHEyLCBwMywgcTM7CisgIGludCBzdGVwMSwgc3RlcDIsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0OworICB1aW50OF90KiBwVGVtcDA7CisgIHVpbnQ4X3QqIHBUZW1wMTsKKyAgY29uc3QgaW50IHRocmVzaDIgPSAyICogdGhyZXNoICsgMTsKKworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAiLnNldCAgICAgIHB1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIi5zZXQgICAgICBub3Jlb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJibHR6ICAgICAgJVtzaXplXSwgICAgM2YgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiIG5vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJuZWd1ICAgICAgJVtzdGVwMV0sICAgJVtoc3RyaWRlXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGJ1ICAgICAgICVbcTBdLCAgICAgIDAoJVtwXSkgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAlW3AwXSwgICAgICAlW3N0ZXAxXSglW3BdKSAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVtzdGVwMV0sICAgJVtzdGVwMV0sICAgICAgJVtoc3RyaWRlXSAgXG5cdCIKKyAgICAibGJ1eCAgICAgICVbcTFdLCAgICAgICVbaHN0cmlkZV0oJVtwXSkgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXAxXSwgICAlW3AwXSwgICAgICAgICAlW3EwXSAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgJVtwMV0sICAgICAgJVtzdGVwMV0oJVtwXSkgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbc3RlcDJdLCAgICVbaHN0cmlkZV0sICAgICVbaHN0cmlkZV0gIFxuXHQiCisgICAgImFic3Ffcy53ICAlW3RlbXAyXSwgICAlW3RlbXAxXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVt0ZW1wM10sICAgJVtwMV0sICAgICAgICAgJVtxMV0gICAgICAgXG5cdCIKKyAgICAiYWJzcV9zLncgICVbdGVtcDRdLCAgICVbdGVtcDNdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNsbCAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAgICAyICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgICAgJVt0ZW1wNF0gICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbdGVtcDRdLCAgICVbdGVtcDJdLCAgICAgICVbdGhyZXNoMl0gIFxuXHQiCisgICAgInN1YnUgICAgICAlW3N0ZXAxXSwgICAlW3N0ZXAxXSwgICAgICAlW2hzdHJpZGVdICBcblx0IgorICAgICJiZ3R6ICAgICAgJVt0ZW1wNF0sICAgMGYgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiIGxidXggICAgICVbcDJdLCAgICAgICVbc3RlcDFdKCVbcF0pICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3N0ZXAxXSwgICAlW3N0ZXAxXSwgICAgICAlW2hzdHJpZGVdICBcblx0IgorICAgICJsYnV4ICAgICAgJVtxMl0sICAgICAgJVtzdGVwMl0oJVtwXSkgICAgICAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICVbcDNdLCAgICAgICVbc3RlcDFdKCVbcF0pICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXA0XSwgICAlW3AyXSwgICAgICAgICAlW3AxXSAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVtzdGVwMl0sICAgJVtzdGVwMl0sICAgICAgJVtoc3RyaWRlXSAgXG5cdCIKKyAgICAic3VidSAgICAgICVbdGVtcDJdLCAgICVbcDNdLCAgICAgICAgICVbcDJdICAgICAgIFxuXHQiCisgICAgImFic3Ffcy53ICAlW3RlbXA0XSwgICAlW3RlbXA0XSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhYnNxX3MudyAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICVbcTNdLCAgICAgICVbc3RlcDJdKCVbcF0pICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXA0XSwgICAlW3RlbXA0XSwgICAgICAlW2l0aHJlc2hdICBcblx0IgorICAgICJuZWd1ICAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmd0eiAgICAgICVbdGVtcDRdLCAgIDBmICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIiBzdWJ1ICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAgICAlW2l0aHJlc2hdICBcblx0IgorICAgICJzdWJ1ICAgICAgJVtwM10sICAgICAgJVtwMV0sICAgICAgICAgJVtwMF0gICAgICAgXG5cdCIKKyAgICAiYmd0eiAgICAgICVbdGVtcDJdLCAgIDBmICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIiBhYnNxX3MudyAlW3AzXSwgICAgICAlW3AzXSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVt0ZW1wNF0sICAgJVtxM10sICAgICAgICAgJVtxMl0gICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbcFRlbXAwXSwgICVbcF0sICAgICAgICAgICVbaHN0cmlkZV0gIFxuXHQiCisgICAgImFic3Ffcy53ICAlW3RlbXA0XSwgICAlW3RlbXA0XSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVt0ZW1wMl0sICAgJVtwM10sICAgICAgICAgJVtpdGhyZXNoXSAgXG5cdCIKKyAgICAic2xsICAgICAgICVbc3RlcDFdLCAgICVbdGVtcDFdLCAgICAgIDEgICAgICAgICAgIFxuXHQiCisgICAgImJndHogICAgICAlW3RlbXAyXSwgICAwZiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIgc3VidSAgICAgJVt0ZW1wNF0sICAgJVt0ZW1wNF0sICAgICAgJVtpdGhyZXNoXSAgXG5cdCIKKyAgICAic3VidSAgICAgICVbdGVtcDJdLCAgICVbcTJdLCAgICAgICAgICVbcTFdICAgICAgIFxuXHQiCisgICAgImJndHogICAgICAlW3RlbXA0XSwgICAwZiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIgYWJzcV9zLncgJVt0ZW1wMl0sICAgJVt0ZW1wMl0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbcTNdLCAgICAgICVbcTFdLCAgICAgICAgICVbcTBdICAgICAgIFxuXHQiCisgICAgImFic3Ffcy53ICAlW3EzXSwgICAgICAlW3EzXSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgICAgJVtpdGhyZXNoXSAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbdGVtcDFdLCAgICVbdGVtcDFdLCAgICAgICVbc3RlcDFdICAgIFxuXHQiCisgICAgImJndHogICAgICAlW3RlbXAyXSwgICAwZiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIgc3VidSAgICAgJVt0ZW1wNF0sICAgJVtxM10sICAgICAgICAgJVtpdGhyZXNoXSAgXG5cdCIKKyAgICAic2x0ICAgICAgICVbcDNdLCAgICAgICVbaGV2X3RocmVzaF0sICVbcDNdICAgICAgIFxuXHQiCisgICAgImJndHogICAgICAlW3RlbXA0XSwgICAwZiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIgc2x0ICAgICAgJVtxM10sICAgICAgJVtoZXZfdGhyZXNoXSwgJVtxM10gICAgICAgXG5cdCIKKyAgICAib3IgICAgICAgICVbcTNdLCAgICAgICVbcTNdLCAgICAgICAgICVbcDNdICAgICAgIFxuXHQiCisgICAgImJndHogICAgICAlW3EzXSwgICAgICAxZiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIgc2hyYV9yLncgJVt0ZW1wMl0sICAgJVt0ZW1wMV0sICAgICAgMyAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICVbdGVtcDFdLCAgICVbdGVtcDFdLCAgICAgIDMgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICAlW3RlbXAxXSwgICAlW3RlbXAxXSwgICAgICAzICAgICAgICAgICBcblx0IgorICAgICJzaGxsX3MudyAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgICAgMjcgICAgICAgICAgXG5cdCIKKyAgICAic2hsbF9zLncgICVbdGVtcDFdLCAgICVbdGVtcDFdLCAgICAgIDI3ICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3BUZW1wMV0sICAlW3BdLCAgICAgICAgICAlW2hzdHJpZGVdICBcblx0IgorICAgICJzcmEgICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgICAgMjcgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgICVbdGVtcDFdLCAgICVbdGVtcDFdLCAgICAgIDI3ICAgICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAgICAlW3N0ZXAxXSwgICAlW3RlbXAyXSwgICAgICAxICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAgJVtzdGVwMV0sICAgJVtzdGVwMV0sICAgICAgMSAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbcDBdLCAgICAgICVbcDBdLCAgICAgICAgICVbdGVtcDFdICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3AxXSwgICAgICAlW3AxXSwgICAgICAgICAlW3N0ZXAxXSAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVtxMF0sICAgICAgJVtxMF0sICAgICAgICAgJVt0ZW1wMl0gICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbcTFdLCAgICAgICVbcTFdLCAgICAgICAgICVbc3RlcDFdICAgIFxuXHQiCisgICAgImxidXggICAgICAlW3RlbXAyXSwgICAlW3AwXSglW1ZQOGtjbGlwMV0pICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgJVt0ZW1wM10sICAgJVtxMF0oJVtWUDhrY2xpcDFdKSAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICVbdGVtcDRdLCAgICVbcTFdKCVbVlA4a2NsaXAxXSkgICAgICAgIFxuXHQiCisgICAgInNiICAgICAgICAlW3RlbXAyXSwgICAwKCVbcFRlbXAwXSkgICAgICAgICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgJVt0ZW1wMV0sICAgJVtwMV0oJVtWUDhrY2xpcDFdKSAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbcFRlbXAwXSwgICVbcFRlbXAwXSwgICAgJVtoc3RyaWRlXSAgIFxuXHQiCisgICAgInNiICAgICAgICAlW3RlbXAzXSwgICAwKCVbcF0pICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzYiAgICAgICAgJVt0ZW1wNF0sICAgMCglW3BUZW1wMV0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiaiAgICAgICAgIDBmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIiBzYiAgICAgICAlW3RlbXAxXSwgICAwKCVbcFRlbXAwXSkgICAgICAgICAgICAgICBcblx0IgorICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2hsbF9zLncgICVbdGVtcDNdLCAgICVbdGVtcDNdLCAgICAgIDI0ICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICAlW3RlbXAzXSwgICAlW3RlbXAzXSwgICAgICAyNCAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICAgICAgJVt0ZW1wM10gICAgXG5cdCIKKyAgICAic2hyYV9yLncgICVbdGVtcDJdLCAgICVbdGVtcDFdLCAgICAgIDMgICAgICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAgICAlW3RlbXAxXSwgICAlW3RlbXAxXSwgICAgICAzICAgICAgICAgICBcblx0IgorICAgICJzaGxsX3MudyAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgICAgMjcgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgICVbdGVtcDFdLCAgICVbdGVtcDFdLCAgICAgIDMgICAgICAgICAgIFxuXHQiCisgICAgInNobGxfcy53ICAlW3RlbXAxXSwgICAlW3RlbXAxXSwgICAgICAyNyAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgICAgMjcgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgICVbdGVtcDFdLCAgICVbdGVtcDFdLCAgICAgIDI3ICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3AwXSwgICAgICAlW3AwXSwgICAgICAgICAlW3RlbXAxXSAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVtxMF0sICAgICAgJVtxMF0sICAgICAgICAgJVt0ZW1wMl0gICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICVbdGVtcDFdLCAgICVbcDBdKCVbVlA4a2NsaXAxXSkgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAlW3RlbXAyXSwgICAlW3EwXSglW1ZQOGtjbGlwMV0pICAgICAgICBcblx0IgorICAgICJzYiAgICAgICAgJVt0ZW1wMl0sICAgMCglW3BdKSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2IgICAgICAgICVbdGVtcDFdLCAgIDAoJVtwVGVtcDBdKSAgICAgICAgICAgICAgIFxuXHQiCisgICIwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVtzaXplXSwgICAgJVtzaXplXSwgICAgICAgMSAgICAgICAgICAgXG5cdCIKKyAgICAiYmd0eiAgICAgICVbc2l6ZV0sICAgIDJiICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIiBhZGR1ICAgICAlW3BdLCAgICAgICAlW3BdLCAgICAgICAgICAlW3ZzdHJpZGVdICBcblx0IgorICAiMzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiLnNldCAgICAgIHBvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgOiBbcDBdIj0mciIocDApLCBbcTBdIj0mciIocTApLCBbcDFdIj0mciIocDEpLCBbcTFdIj0mciIocTEpLAorICAgICAgW3AyXSI9JnIiKHAyKSwgW3EyXSI9JnIiKHEyKSwgW3AzXSI9JnIiKHAzKSwgW3EzXSI9JnIiKHEzKSwKKyAgICAgIFtzdGVwMl0iPSZyIihzdGVwMiksIFtzdGVwMV0iPSZyIihzdGVwMSksIFt0ZW1wMV0iPSZyIih0ZW1wMSksCisgICAgICBbdGVtcDJdIj0mciIodGVtcDIpLCBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLAorICAgICAgW3BUZW1wMF0iPSZyIihwVGVtcDApLCBbcFRlbXAxXSI9JnIiKHBUZW1wMSksIFtwXSIrJnIiKHApLAorICAgICAgW3NpemVdIismciIoc2l6ZSkKKyAgICA6IFt2c3RyaWRlXSJyIih2c3RyaWRlKSwgW2l0aHJlc2hdInIiKGl0aHJlc2gpLAorICAgICAgW2hldl90aHJlc2hdInIiKGhldl90aHJlc2gpLCBbaHN0cmlkZV0iciIoaHN0cmlkZSksCisgICAgICBbVlA4a2NsaXAxXSJyIihWUDhrY2xpcDEpLCBbdGhyZXNoMl0iciIodGhyZXNoMikKKyAgICA6ICJtZW1vcnkiCisgICk7Cit9CisKKy8vIG9uIG1hY3JvYmxvY2sgZWRnZXMKK3N0YXRpYyB2b2lkIFZGaWx0ZXIxNih1aW50OF90KiBwLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICBGaWx0ZXJMb29wMjYocCwgc3RyaWRlLCAxLCAxNiwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKK30KKworc3RhdGljIHZvaWQgSEZpbHRlcjE2KHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIEZpbHRlckxvb3AyNihwLCAxLCBzdHJpZGUsIDE2LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworfQorCisvLyA4LXBpeGVscyB3aWRlIHZhcmlhbnQsIGZvciBjaHJvbWEgZmlsdGVyaW5nCitzdGF0aWMgdm9pZCBWRmlsdGVyOCh1aW50OF90KiB1LCB1aW50OF90KiB2LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIEZpbHRlckxvb3AyNih1LCBzdHJpZGUsIDEsIDgsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7CisgIEZpbHRlckxvb3AyNih2LCBzdHJpZGUsIDEsIDgsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7Cit9CisKK3N0YXRpYyB2b2lkIEhGaWx0ZXI4KHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgRmlsdGVyTG9vcDI2KHUsIDEsIHN0cmlkZSwgOCwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKKyAgRmlsdGVyTG9vcDI2KHYsIDEsIHN0cmlkZSwgOCwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKK30KKworLy8gb24gdGhyZWUgaW5uZXIgZWRnZXMKK3N0YXRpYyB2b2lkIFZGaWx0ZXIxNmkodWludDhfdCogcCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIGludCBrOworICBmb3IgKGsgPSAzOyBrID4gMDsgLS1rKSB7CisgICAgcCArPSA0ICogc3RyaWRlOworICAgIEZpbHRlckxvb3AyNChwLCBzdHJpZGUsIDEsIDE2LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIEhGaWx0ZXIxNmkodWludDhfdCogcCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIGludCBrOworICBmb3IgKGsgPSAzOyBrID4gMDsgLS1rKSB7CisgICAgcCArPSA0OworICAgIEZpbHRlckxvb3AyNChwLCAxLCBzdHJpZGUsIDE2LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFZGaWx0ZXI4aSh1aW50OF90KiB1LCB1aW50OF90KiB2LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICBGaWx0ZXJMb29wMjQodSArIDQgKiBzdHJpZGUsIHN0cmlkZSwgMSwgOCwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKKyAgRmlsdGVyTG9vcDI0KHYgKyA0ICogc3RyaWRlLCBzdHJpZGUsIDEsIDgsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7Cit9CisKK3N0YXRpYyB2b2lkIEhGaWx0ZXI4aSh1aW50OF90KiB1LCB1aW50OF90KiB2LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICBGaWx0ZXJMb29wMjQodSArIDQsIDEsIHN0cmlkZSwgOCwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKKyAgRmlsdGVyTG9vcDI0KHYgKyA0LCAxLCBzdHJpZGUsIDgsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7Cit9CisKKyN1bmRlZiBNVUwKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFNpbXBsZSBJbi1sb29wIGZpbHRlcmluZyAoUGFyYWdyYXBoIDE1LjIpCisKK3N0YXRpYyB2b2lkIFNpbXBsZVZGaWx0ZXIxNih1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKSB7CisgIGludCBpOworICBjb25zdCBpbnQgdGhyZXNoMiA9IDIgKiB0aHJlc2ggKyAxOworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3LCB0ZW1wODsKKyAgdWludDhfdCogcDEgPSBwIC0gc3RyaWRlOworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAiLnNldCAgICAgIHB1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIi5zZXQgICAgICBub3Jlb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsaSAgICAgICAgJVtpXSwgICAgICAgIDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgIjA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIm5lZ3UgICAgICAlW3RlbXA0XSwgICAgJVtzdHJpZGVdICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzbGwgICAgICAgJVt0ZW1wNV0sICAgICVbdGVtcDRdLCAgICAgICAxICAgICAgICAgICAgXG5cdCIKKyAgICAibGJ1ICAgICAgICVbdGVtcDJdLCAgICAwKCVbcF0pICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAlW3RlbXAzXSwgICAgJVtzdHJpZGVdKCVbcF0pICAgICAgICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgJVt0ZW1wMV0sICAgICVbdGVtcDRdKCVbcF0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICVbdGVtcDBdLCAgICAlW3RlbXA1XSglW3BdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXA3XSwgICAgJVt0ZW1wMV0sICAgICAgICVbdGVtcDJdICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVt0ZW1wNl0sICAgICVbdGVtcDBdLCAgICAgICAlW3RlbXAzXSAgICAgXG5cdCIKKyAgICAiYWJzcV9zLncgICVbdGVtcDRdLCAgICAlW3RlbXA3XSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFic3Ffcy53ICAlW3RlbXA1XSwgICAgJVt0ZW1wNl0gICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzbGwgICAgICAgJVt0ZW1wNF0sICAgICVbdGVtcDRdLCAgICAgICAyICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbdGVtcDVdLCAgICAlW3RlbXA1XSwgICAgICAgJVt0aHJlc2gyXSAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3RlbXA1XSwgICAgJVt0ZW1wNF0sICAgICAgICVbdGVtcDVdICAgICBcblx0IgorICAgICJuZWd1ICAgICAgJVt0ZW1wOF0sICAgICVbdGVtcDddICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmd0eiAgICAgICVbdGVtcDVdLCAgICAxZiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIiBhZGRpdSAgICAlW2ldLCAgICAgICAgJVtpXSwgICAgICAgICAgIC0xICAgICAgICAgICBcblx0IgorICAgICJzbGwgICAgICAgJVt0ZW1wNF0sICAgICVbdGVtcDhdLCAgICAgICAxICAgICAgICAgICAgXG5cdCIKKyAgICAic2hsbF9zLncgICVbdGVtcDVdLCAgICAlW3RlbXA2XSwgICAgICAgMjQgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wNF0sICAgICAgICVbdGVtcDhdICAgICBcblx0IgorICAgICJzcmEgICAgICAgJVt0ZW1wNV0sICAgICVbdGVtcDVdLCAgICAgICAyNCAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbdGVtcDNdLCAgICAlW3RlbXAzXSwgICAgICAgJVt0ZW1wNV0gICAgIFxuXHQiCisgICAgImFkZGl1ICAgICAlW3RlbXA3XSwgICAgJVt0ZW1wM10sICAgICAgIDMgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAgJVt0ZW1wN10sICAgICVbdGVtcDddLCAgICAgICAzICAgICAgICAgICAgXG5cdCIKKyAgICAic2hyYV9yLncgICVbdGVtcDhdLCAgICAlW3RlbXAzXSwgICAgICAgMyAgICAgICAgICAgIFxuXHQiCisgICAgInNobGxfcy53ICAlW3RlbXAwXSwgICAgJVt0ZW1wN10sICAgICAgIDI3ICAgICAgICAgICBcblx0IgorICAgICJzaGxsX3MudyAgJVt0ZW1wNF0sICAgICVbdGVtcDhdLCAgICAgICAyNyAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgICVbdGVtcDBdLCAgICAlW3RlbXAwXSwgICAgICAgMjcgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICAlW3RlbXA0XSwgICAgJVt0ZW1wNF0sICAgICAgIDI3ICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVt0ZW1wN10sICAgICVbdGVtcDFdLCAgICAgICAlW3RlbXAwXSAgICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbdGVtcDJdLCAgICAlW3RlbXAyXSwgICAgICAgJVt0ZW1wNF0gICAgIFxuXHQiCisgICAgImxidXggICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wN10oJVtWUDhrY2xpcDFdKSAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgJVt0ZW1wNF0sICAgICVbdGVtcDJdKCVbVlA4a2NsaXAxXSkgICAgICAgXG5cdCIKKyAgICAic2IgICAgICAgICVbdGVtcDNdLCAgICAwKCVbcDFdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNiICAgICAgICAlW3RlbXA0XSwgICAgMCglW3BdKSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICVbcDFdLCAgICAgICAlW3AxXSwgICAgICAgICAgMSAgICAgICAgICAgIFxuXHQiCisgICAgImJndHogICAgICAlW2ldLCAgICAgICAgMGIgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIgYWRkaXUgICAgJVtwXSwgICAgICAgICVbcF0sICAgICAgICAgICAxICAgICAgICAgICAgXG5cdCIKKyAgICAiIC5zZXQgICAgIHBvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgIFt0ZW1wNl0iPSZyIih0ZW1wNiksIFt0ZW1wN10iPSZyIih0ZW1wNyksIFt0ZW1wOF0iPSZyIih0ZW1wOCksCisgICAgICBbcF0iKyZyIihwKSwgW2ldIj0mciIoaSksIFtwMV0iKyZyIihwMSkKKyAgICA6IFtzdHJpZGVdInIiKHN0cmlkZSksIFtWUDhrY2xpcDFdInIiKFZQOGtjbGlwMSksIFt0aHJlc2gyXSJyIih0aHJlc2gyKQorICAgIDogIm1lbW9yeSIKKyAgKTsKK30KKworLy8gVEVNUDAgPSBTUkNbQSArIEExICogQlBTXQorLy8gVEVNUDEgPSBTUkNbQiArIEIxICogQlBTXQorLy8gVEVNUDIgPSBTUkNbQyArIEMxICogQlBTXQorLy8gVEVNUDMgPSBTUkNbRCArIEQxICogQlBTXQorI2RlZmluZSBMT0FEXzRfQllURVMoVEVNUDAsIFRFTVAxLCBURU1QMiwgVEVNUDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIEEsIEExLCBCLCBCMSwgQywgQzEsIEQsIEQxLCBTUkMpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJsYnUgICAgICAlWyIgI1RFTVAwICJdLCAgICIgI0EgIisiICNBMSAiKiIgWFNUUihCUFMpICIoJVsiICNTUkMgIl0pIFxuXHQiICAgXAorICAibGJ1ICAgICAgJVsiICNURU1QMSAiXSwgICAiICNCICIrIiAjQjEgIioiIFhTVFIoQlBTKSAiKCVbIiAjU1JDICJdKSBcblx0IiAgIFwKKyAgImxidSAgICAgICVbIiAjVEVNUDIgIl0sICAgIiAjQyAiKyIgI0MxICIqIiBYU1RSKEJQUykgIiglWyIgI1NSQyAiXSkgXG5cdCIgICBcCisgICJsYnUgICAgICAlWyIgI1RFTVAzICJdLCAgICIgI0QgIisiICNEMSAiKiIgWFNUUihCUFMpICIoJVsiICNTUkMgIl0pIFxuXHQiICAgXAorCitzdGF0aWMgdm9pZCBTaW1wbGVIRmlsdGVyMTYodWludDhfdCogcCwgaW50IHN0cmlkZSwgaW50IHRocmVzaCkgeworICBpbnQgaTsKKyAgY29uc3QgaW50IHRocmVzaDIgPSAyICogdGhyZXNoICsgMTsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA2LCB0ZW1wNywgdGVtcDg7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICIuc2V0ICAgICAgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIuc2V0ICAgICAgbm9yZW9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsaSAgICAgICAgJVtpXSwgICAgICAgMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAiMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIExPQURfNF9CWVRFUyh0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgLTIsIDAsIC0xLCAwLCAwLCAwLCAxLCAwLCBwKQorICAgICJzdWJ1ICAgICAgJVt0ZW1wN10sICAgICVbdGVtcDFdLCAgICAgICAlW3RlbXAyXSAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVt0ZW1wNl0sICAgICVbdGVtcDBdLCAgICAgICAlW3RlbXAzXSAgICBcblx0IgorICAgICJhYnNxX3MudyAgJVt0ZW1wNF0sICAgICVbdGVtcDddICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhYnNxX3MudyAgJVt0ZW1wNV0sICAgICVbdGVtcDZdICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzbGwgICAgICAgJVt0ZW1wNF0sICAgICVbdGVtcDRdLCAgICAgICAyICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVt0ZW1wNV0sICAgICVbdGVtcDRdLCAgICAgICAlW3RlbXA1XSAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVt0ZW1wNV0sICAgICVbdGVtcDVdLCAgICAgICAlW3RocmVzaDJdICBcblx0IgorICAgICJuZWd1ICAgICAgJVt0ZW1wOF0sICAgICVbdGVtcDddICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZ3R6ICAgICAgJVt0ZW1wNV0sICAgIDFmICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIgYWRkaXUgICAgJVtpXSwgICAgICAgICVbaV0sICAgICAgICAgICAtMSAgICAgICAgICBcblx0IgorICAgICJzbGwgICAgICAgJVt0ZW1wNF0sICAgICVbdGVtcDhdLCAgICAgICAxICAgICAgICAgICBcblx0IgorICAgICJzaGxsX3MudyAgJVt0ZW1wNV0sICAgICVbdGVtcDZdLCAgICAgICAyNCAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDRdLCAgICAgICAlW3RlbXA4XSAgICBcblx0IgorICAgICJzcmEgICAgICAgJVt0ZW1wNV0sICAgICVbdGVtcDVdLCAgICAgICAyNCAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDNdLCAgICAgICAlW3RlbXA1XSAgICBcblx0IgorICAgICJhZGRpdSAgICAgJVt0ZW1wN10sICAgICVbdGVtcDNdLCAgICAgICAzICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAgJVt0ZW1wN10sICAgICVbdGVtcDddLCAgICAgICAzICAgICAgICAgICBcblx0IgorICAgICJzaHJhX3IudyAgJVt0ZW1wOF0sICAgICVbdGVtcDNdLCAgICAgICAzICAgICAgICAgICBcblx0IgorICAgICJzaGxsX3MudyAgJVt0ZW1wMF0sICAgICVbdGVtcDddLCAgICAgICAyNyAgICAgICAgICBcblx0IgorICAgICJzaGxsX3MudyAgJVt0ZW1wNF0sICAgICVbdGVtcDhdLCAgICAgICAyNyAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDBdLCAgICAgICAyNyAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAgJVt0ZW1wNF0sICAgICVbdGVtcDRdLCAgICAgICAyNyAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVt0ZW1wN10sICAgICVbdGVtcDFdLCAgICAgICAlW3RlbXAwXSAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVt0ZW1wMl0sICAgICVbdGVtcDJdLCAgICAgICAlW3RlbXA0XSAgICBcblx0IgorICAgICJsYnV4ICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDddKCVbVlA4a2NsaXAxXSkgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgJVt0ZW1wNF0sICAgICVbdGVtcDJdKCVbVlA4a2NsaXAxXSkgICAgICBcblx0IgorICAgICJzYiAgICAgICAgJVt0ZW1wM10sICAgIC0xKCVbcF0pICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzYiAgICAgICAgJVt0ZW1wNF0sICAgIDAoJVtwXSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZ3R6ICAgICAgJVtpXSwgICAgICAgIDBiICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIgYWRkdSAgICAgJVtwXSwgICAgICAgICVbcF0sICAgICAgICAgICAlW3N0cmlkZV0gICBcblx0IgorICAgICIuc2V0ICAgICAgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksCisgICAgICBbdGVtcDZdIj0mciIodGVtcDYpLCBbdGVtcDddIj0mciIodGVtcDcpLCBbdGVtcDhdIj0mciIodGVtcDgpLAorICAgICAgW3BdIismciIocCksIFtpXSI9JnIiKGkpCisgICAgOiBbc3RyaWRlXSJyIihzdHJpZGUpLCBbVlA4a2NsaXAxXSJyIihWUDhrY2xpcDEpLCBbdGhyZXNoMl0iciIodGhyZXNoMikKKyAgICA6ICJtZW1vcnkiCisgICk7Cit9CisKK3N0YXRpYyB2b2lkIFNpbXBsZVZGaWx0ZXIxNmkodWludDhfdCogcCwgaW50IHN0cmlkZSwgaW50IHRocmVzaCkgeworICBpbnQgazsKKyAgZm9yIChrID0gMzsgayA+IDA7IC0taykgeworICAgIHAgKz0gNCAqIHN0cmlkZTsKKyAgICBTaW1wbGVWRmlsdGVyMTYocCwgc3RyaWRlLCB0aHJlc2gpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFNpbXBsZUhGaWx0ZXIxNmkodWludDhfdCogcCwgaW50IHN0cmlkZSwgaW50IHRocmVzaCkgeworICBpbnQgazsKKyAgZm9yIChrID0gMzsgayA+IDA7IC0taykgeworICAgIHAgKz0gNDsKKyAgICBTaW1wbGVIRmlsdGVyMTYocCwgc3RyaWRlLCB0aHJlc2gpOworICB9Cit9CisKKy8vIERTVFtBICogQlBTXSAgICAgPSBURU1QMAorLy8gRFNUW0IgKyBDICogQlBTXSA9IFRFTVAxCisjZGVmaW5lIFNUT1JFXzhfQllURVMoVEVNUDAsIFRFTVAxLCBBLCBCLCBDLCBEU1QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidXN3ICAgICVbIiAjVEVNUDAgIl0sICAgIiAjQSAiKiIgWFNUUihCUFMpICIoJVsiICNEU1QgIl0pICAgICAgICAgXG5cdCIgICAgIFwKKyAgInVzdyAgICAlWyIgI1RFTVAxICJdLCAgICIgI0IgIisiICNDICIqIiBYU1RSKEJQUykgIiglWyIgI0RTVCAiXSkgIFxuXHQiCisKK3N0YXRpYyB2b2lkIFZFNCh1aW50OF90KiBkc3QpIHsgICAgLy8gdmVydGljYWwKKyAgY29uc3QgdWludDhfdCogdG9wID0gZHN0IC0gQlBTOworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDY7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICJ1bHcgICAgICAgICAgICAgJVt0ZW1wMF0sICAgLTEoJVt0b3BdKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAidWxoICAgICAgICAgICAgICVbdGVtcDFdLCAgIDMoJVt0b3BdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYnIgICAlW3RlbXAyXSwgICAlW3RlbXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJsICAgJVt0ZW1wM10sICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFiciAgICVbdGVtcDRdLCAgICVbdGVtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInBhY2tybC5waCAgICAgICAlW3RlbXA1XSwgICAlW3RlbXAzXSwgICAgJVt0ZW1wMl0gICBcblx0IgorICAgICJwYWNrcmwucGggICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wNF0sICAgICVbdGVtcDNdICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgICVbdGVtcDVdLCAgICVbdGVtcDVdLCAgICAxICAgICAgICAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICAlW3RlbXA2XSwgICAlW3RlbXA2XSwgICAgMSAgICAgICAgICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wNV0sICAgICVbdGVtcDJdICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDZdLCAgICAlW3RlbXA0XSAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAgJVt0ZW1wM10gICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wNl0sICAgICVbdGVtcDNdICAgXG5cdCIKKyAgICAic2hyYV9yLnBoICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgICAyICAgICAgICAgIFxuXHQiCisgICAgInNocmFfci5waCAgICAgICAlW3RlbXA2XSwgICAlW3RlbXA2XSwgICAgMiAgICAgICAgICBcblx0IgorICAgICJwcmVjci5xYi5waCAgICAgJVt0ZW1wNF0sICAgJVt0ZW1wNl0sICAgICVbdGVtcDJdICAgXG5cdCIKKyAgICBTVE9SRV84X0JZVEVTKHRlbXA0LCB0ZW1wNCwgMCwgMCwgMSwgZHN0KQorICAgIFNUT1JFXzhfQllURVModGVtcDQsIHRlbXA0LCAyLCAwLCAzLCBkc3QpCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgIFt0ZW1wNl0iPSZyIih0ZW1wNikKKyAgICA6IFt0b3BdInIiKHRvcCksIFtkc3RdInIiKGRzdCkKKyAgICA6ICJtZW1vcnkiCisgICk7Cit9CisKK3N0YXRpYyB2b2lkIERDNCh1aW50OF90KiBkc3QpIHsgICAvLyBEQworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0OworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAidWx3ICAgICAgICAgICVbdGVtcDBdLCAgIC0xKiIgWFNUUihCUFMpICIoJVtkc3RdKSBcblx0IgorICAgIExPQURfNF9CWVRFUyh0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgLTEsIDAsIC0xLCAxLCAtMSwgMiwgLTEsIDMsIGRzdCkKKyAgICAiaW5zICAgICAgICAgICVbdGVtcDFdLCAgICVbdGVtcDJdLCAgICA4LCAgICAgOCAgICBcblx0IgorICAgICJpbnMgICAgICAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wM10sICAgIDE2LCAgICA4ICAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAlW3RlbXAxXSwgICAlW3RlbXA0XSwgICAgMjQsICAgIDggICAgXG5cdCIKKyAgICAicmFkZHUudy5xYiAgICVbdGVtcDBdLCAgICVbdGVtcDBdICAgICAgICAgICAgICAgICBcblx0IgorICAgICJyYWRkdS53LnFiICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgICAgJVt0ZW1wMV0gICAgXG5cdCIKKyAgICAic2hyYV9yLncgICAgICVbdGVtcDBdLCAgICVbdGVtcDBdLCAgICAzICAgICAgICAgICBcblx0IgorICAgICJyZXBsdi5xYiAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgU1RPUkVfOF9CWVRFUyh0ZW1wMCwgdGVtcDAsIDAsIDAsIDEsIGRzdCkKKyAgICBTVE9SRV84X0JZVEVTKHRlbXAwLCB0ZW1wMCwgMiwgMCwgMywgZHN0KQorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCkKKyAgICA6IFtkc3RdInIiKGRzdCkKKyAgICA6ICJtZW1vcnkiCisgICk7Cit9CisKK3N0YXRpYyB2b2lkIFJENCh1aW50OF90KiBkc3QpIHsgICAvLyBEb3duLXJpZ2h0CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQ7CisgIGludCB0ZW1wNSwgdGVtcDYsIHRlbXA3LCB0ZW1wODsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgTE9BRF80X0JZVEVTKHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCAtMSwgMCwgLTEsIDEsIC0xLCAyLCAtMSwgMywgZHN0KQorICAgICJ1bHcgICAgICAgICAgICAlW3RlbXA3XSwgICAtMS0iIFhTVFIoQlBTKSAiKCVbZHN0XSkgICAgICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMF0sIDE2LCAxNiAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYnIgICVbdGVtcDVdLCAgICVbdGVtcDddICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJpbnMgICAgICAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAxXSwgMTYsIDE2ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFibCAgJVt0ZW1wNF0sICAgJVt0ZW1wN10gICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAgICVbdGVtcDNdLCAgICVbdGVtcDJdLCAxNiwgMTYgICAgICAgICAgICAgICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgMSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wM10sICVbdGVtcDFdICAgICAgICAgICAgIFxuXHQiCisgICAgInBhY2tybC5waCAgICAgICVbdGVtcDZdLCAgICVbdGVtcDVdLCAlW3RlbXAxXSAgICAgICAgICAgICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAlW3RlbXAzXSwgICAlW3RlbXAzXSwgJVt0ZW1wMl0gICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICVbdGVtcDVdICAgICAgICAgICAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDZdLCAxICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAlW3RlbXAxXSwgICAlW3RlbXAxXSwgJVt0ZW1wNl0gICAgICAgICAgICAgXG5cdCIKKyAgICAicGFja3JsLnBoICAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wNF0sICVbdGVtcDVdICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICVbdGVtcDhdLCAgICVbdGVtcDVdLCAlW3RlbXA0XSAgICAgICAgICAgICBcblx0IgorICAgICJzaHJhX3IucGggICAgICAlW3RlbXAzXSwgICAlW3RlbXAzXSwgMiAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sIDEgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNocmFfci5waCAgICAgICVbdGVtcDFdLCAgICVbdGVtcDFdLCAyICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAlW3RlbXA4XSwgICAlW3RlbXAwXSwgJVt0ZW1wOF0gICAgICAgICAgICAgXG5cdCIKKyAgICAibGJ1ICAgICAgICAgICAgJVt0ZW1wNV0sICAgMy0iIFhTVFIoQlBTKSAiKCVbZHN0XSkgICAgICAgIFxuXHQiCisgICAgInByZWNycS5waC53ICAgICVbdGVtcDddLCAgICVbdGVtcDddLCAlW3RlbXA3XSAgICAgICAgICAgICBcblx0IgorICAgICJzaHJhX3IucGggICAgICAlW3RlbXA4XSwgICAlW3RlbXA4XSwgMiAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICAgJVt0ZW1wN10sICAgJVt0ZW1wNV0sIDAsICA4ICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNyLnFiLnBoICAgICVbdGVtcDJdLCAgICVbdGVtcDFdLCAlW3RlbXAzXSAgICAgICAgICAgICBcblx0IgorICAgICJyYWRkdS53LnFiICAgICAlW3RlbXA0XSwgICAlW3RlbXA3XSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY3IucWIucGggICAgJVt0ZW1wNl0sICAgJVt0ZW1wOF0sICVbdGVtcDFdICAgICAgICAgICAgIFxuXHQiCisgICAgInNocmFfci53ICAgICAgICVbdGVtcDRdLCAgICVbdGVtcDRdLCAyICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIFNUT1JFXzhfQllURVModGVtcDIsIHRlbXA2LCAzLCAwLCAxLCBkc3QpCisgICAgInByZXBlbmQgICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDhdLCA4ICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVwZW5kICAgICAgICAlW3RlbXA2XSwgICAlW3RlbXA0XSwgOCAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICBTVE9SRV84X0JZVEVTKHRlbXAyLCB0ZW1wNiwgMiwgMCwgMCwgZHN0KQorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksCisgICAgICBbdGVtcDZdIj0mciIodGVtcDYpLCBbdGVtcDddIj0mciIodGVtcDcpLCBbdGVtcDhdIj0mciIodGVtcDgpCisgICAgOiBbZHN0XSJyIihkc3QpCisgICAgOiAibWVtb3J5IgorICApOworfQorCisvLyBURU1QMCA9IFNSQ1tBICogQlBTXQorLy8gVEVNUDEgPSBTUkNbQiArIEMgKiBCUFNdCisjZGVmaW5lIExPQURfOF9CWVRFUyhURU1QMCwgVEVNUDEsIEEsIEIsIEMsIFNSQykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidWx3ICAgICVbIiAjVEVNUDAgIl0sICAgIiAjQSAiKiIgWFNUUihCUFMpICIoJVsiICNTUkMgIl0pICAgICAgICAgXG5cdCIgICAgIFwKKyAgInVsdyAgICAlWyIgI1RFTVAxICJdLCAgICIgI0IgIisiICNDICIqIiBYU1RSKEJQUykgIiglWyIgI1NSQyAiXSkgIFxuXHQiCisKK3N0YXRpYyB2b2lkIExENCh1aW50OF90KiBkc3QpIHsgICAvLyBEb3duLUxlZnQKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNDsKKyAgaW50IHRlbXA1LCB0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wOTsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgTE9BRF84X0JZVEVTKHRlbXAwLCB0ZW1wMSwgLTEsIDQsIC0xLCBkc3QpCisgICAgInByZWNldS5waC5xYmwgICAlW3RlbXAyXSwgICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJyICAgJVt0ZW1wM10sICAgICVbdGVtcDBdICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFiciAgICVbdGVtcDRdLCAgICAlW3RlbXAxXSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYmwgICAlW3RlbXA1XSwgICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJwYWNrcmwucGggICAgICAgJVt0ZW1wNl0sICAgICVbdGVtcDJdLCAgICAlW3RlbXAzXSAgICAgICAgXG5cdCIKKyAgICAicGFja3JsLnBoICAgICAgICVbdGVtcDddLCAgICAlW3RlbXA0XSwgICAgJVt0ZW1wMl0gICAgICAgIFxuXHQiCisgICAgInBhY2tybC5waCAgICAgICAlW3RlbXA4XSwgICAgJVt0ZW1wNV0sICAgICVbdGVtcDRdICAgICAgICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgJVt0ZW1wNl0sICAgICVbdGVtcDZdLCAgICAxICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgICVbdGVtcDldLCAgICAlW3RlbXAyXSwgICAgJVt0ZW1wNl0gICAgICAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICAlW3RlbXA3XSwgICAgJVt0ZW1wN10sICAgIDEgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wOV0sICAgICVbdGVtcDldLCAgICAlW3RlbXAzXSAgICAgICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgICVbdGVtcDhdLCAgICAlW3RlbXA4XSwgICAgMSAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNocmFfci5waCAgICAgICAlW3RlbXA5XSwgICAgJVt0ZW1wOV0sICAgIDIgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDRdLCAgICAlW3RlbXA3XSAgICAgICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgICVbdGVtcDBdLCAgICAlW3RlbXA1XSwgICAgJVt0ZW1wOF0gICAgICAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wM10sICAgICVbdGVtcDJdICAgICAgICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDBdLCAgICAlW3RlbXA0XSAgICAgICAgXG5cdCIKKyAgICAic2hyYV9yLnBoICAgICAgICVbdGVtcDNdLCAgICAlW3RlbXAzXSwgICAgMiAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNocmFfci5waCAgICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMF0sICAgIDIgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmwgICAgICAgICAgICAgJVt0ZW1wMV0sICAgICVbdGVtcDFdLCAgICAyNCAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2xsICAgICAgICAgICAgICVbdGVtcDFdLCAgICAlW3RlbXAxXSwgICAgMSAgICAgICAgICAgICAgIFxuXHQiCisgICAgInJhZGR1LncucWIgICAgICAlW3RlbXA1XSwgICAgJVt0ZW1wNV0gICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjci5xYi5waCAgICAgJVt0ZW1wOV0sICAgICVbdGVtcDNdLCAgICAlW3RlbXA5XSAgICAgICAgXG5cdCIKKyAgICAicHJlY3IucWIucGggICAgICVbdGVtcDNdLCAgICAlW3RlbXAwXSwgICAgJVt0ZW1wM10gICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAgICAgICAlW3RlbXAxXSwgICAgJVt0ZW1wMV0sICAgICVbdGVtcDVdICAgICAgICBcblx0IgorICAgICJzaHJhX3IudyAgICAgICAgJVt0ZW1wMV0sICAgICVbdGVtcDFdLCAgICAyICAgICAgICAgICAgICAgXG5cdCIKKyAgICBTVE9SRV84X0JZVEVTKHRlbXA5LCB0ZW1wMywgMCwgMCwgMiwgZHN0KQorICAgICJwcmVwZW5kICAgICAgICAgJVt0ZW1wOV0sICAgICVbdGVtcDBdLCAgICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlcGVuZCAgICAgICAgICVbdGVtcDNdLCAgICAlW3RlbXAxXSwgICAgOCAgICAgICAgICAgICAgIFxuXHQiCisgICAgU1RPUkVfOF9CWVRFUyh0ZW1wOSwgdGVtcDMsIDEsIDAsIDMsIGRzdCkKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLAorICAgICAgW3RlbXA2XSI9JnIiKHRlbXA2KSwgW3RlbXA3XSI9JnIiKHRlbXA3KSwgW3RlbXA4XSI9JnIiKHRlbXA4KSwKKyAgICAgIFt0ZW1wOV0iPSZyIih0ZW1wOSkKKyAgICA6IFtkc3RdInIiKGRzdCkKKyAgICA6ICJtZW1vcnkiCisgICk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDaHJvbWEKKworc3RhdGljIHZvaWQgREM4dXYodWludDhfdCogZHN0KSB7ICAgICAvLyBEQworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0OworICBpbnQgdGVtcDUsIHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXA5OworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICBMT0FEXzhfQllURVModGVtcDAsIHRlbXAxLCAtMSwgNCwgLTEsIGRzdCkKKyAgICBMT0FEXzRfQllURVModGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIC0xLCAwLCAtMSwgMSwgLTEsIDIsIC0xLCAzLCBkc3QpCisgICAgTE9BRF80X0JZVEVTKHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXA5LCAtMSwgNCwgLTEsIDUsIC0xLCA2LCAtMSwgNywgZHN0KQorICAgICJyYWRkdS53LnFiICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicmFkZHUudy5xYiAgICVbdGVtcDFdLCAgICVbdGVtcDFdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAgJVt0ZW1wM10gICAgICBcblx0IgorICAgICJhZGR1ICAgICAgICAgJVt0ZW1wNF0sICAgJVt0ZW1wNF0sICAgICVbdGVtcDVdICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDZdLCAgICAlW3RlbXA3XSAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAgICAlW3RlbXA4XSwgICAlW3RlbXA4XSwgICAgJVt0ZW1wOV0gICAgICBcblx0IgorICAgICJhZGR1ICAgICAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgICVbdGVtcDFdICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgICAlW3RlbXA0XSAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAgICAlW3RlbXA2XSwgICAlW3RlbXA2XSwgICAgJVt0ZW1wOF0gICAgICBcblx0IgorICAgICJhZGR1ICAgICAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgICVbdGVtcDJdICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgICVbdGVtcDBdLCAgICVbdGVtcDBdLCAgICAlW3RlbXA2XSAgICAgIFxuXHQiCisgICAgInNocmFfci53ICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgICAgNCAgICAgICAgICAgICBcblx0IgorICAgICJyZXBsdi5xYiAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICBTVE9SRV84X0JZVEVTKHRlbXAwLCB0ZW1wMCwgMCwgNCwgMCwgZHN0KQorICAgIFNUT1JFXzhfQllURVModGVtcDAsIHRlbXAwLCAxLCA0LCAxLCBkc3QpCisgICAgU1RPUkVfOF9CWVRFUyh0ZW1wMCwgdGVtcDAsIDIsIDQsIDIsIGRzdCkKKyAgICBTVE9SRV84X0JZVEVTKHRlbXAwLCB0ZW1wMCwgMywgNCwgMywgZHN0KQorICAgIFNUT1JFXzhfQllURVModGVtcDAsIHRlbXAwLCA0LCA0LCA0LCBkc3QpCisgICAgU1RPUkVfOF9CWVRFUyh0ZW1wMCwgdGVtcDAsIDUsIDQsIDUsIGRzdCkKKyAgICBTVE9SRV84X0JZVEVTKHRlbXAwLCB0ZW1wMCwgNiwgNCwgNiwgZHN0KQorICAgIFNUT1JFXzhfQllURVModGVtcDAsIHRlbXAwLCA3LCA0LCA3LCBkc3QpCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgIFt0ZW1wNl0iPSZyIih0ZW1wNiksIFt0ZW1wN10iPSZyIih0ZW1wNyksIFt0ZW1wOF0iPSZyIih0ZW1wOCksCisgICAgICBbdGVtcDldIj0mciIodGVtcDkpCisgICAgOiBbZHN0XSJyIihkc3QpCisgICAgOiAibWVtb3J5IgorICApOworfQorCitzdGF0aWMgdm9pZCBEQzh1dk5vTGVmdCh1aW50OF90KiBkc3QpIHsgICAvLyBEQyB3aXRoIG5vIGxlZnQgc2FtcGxlcworICBpbnQgdGVtcDAsIHRlbXAxOworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICBMT0FEXzhfQllURVModGVtcDAsIHRlbXAxLCAtMSwgNCwgLTEsIGRzdCkKKyAgICAicmFkZHUudy5xYiAgICVbdGVtcDBdLCAgICVbdGVtcDBdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInJhZGR1LncucWIgICAlW3RlbXAxXSwgICAlW3RlbXAxXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgICVbdGVtcDFdICAgICAgXG5cdCIKKyAgICAic2hyYV9yLncgICAgICVbdGVtcDBdLCAgICVbdGVtcDBdLCAgICAzICAgICAgICAgICAgIFxuXHQiCisgICAgInJlcGx2LnFiICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIFNUT1JFXzhfQllURVModGVtcDAsIHRlbXAwLCAwLCA0LCAwLCBkc3QpCisgICAgU1RPUkVfOF9CWVRFUyh0ZW1wMCwgdGVtcDAsIDEsIDQsIDEsIGRzdCkKKyAgICBTVE9SRV84X0JZVEVTKHRlbXAwLCB0ZW1wMCwgMiwgNCwgMiwgZHN0KQorICAgIFNUT1JFXzhfQllURVModGVtcDAsIHRlbXAwLCAzLCA0LCAzLCBkc3QpCisgICAgU1RPUkVfOF9CWVRFUyh0ZW1wMCwgdGVtcDAsIDQsIDQsIDQsIGRzdCkKKyAgICBTVE9SRV84X0JZVEVTKHRlbXAwLCB0ZW1wMCwgNSwgNCwgNSwgZHN0KQorICAgIFNUT1JFXzhfQllURVModGVtcDAsIHRlbXAwLCA2LCA0LCA2LCBkc3QpCisgICAgU1RPUkVfOF9CWVRFUyh0ZW1wMCwgdGVtcDAsIDcsIDQsIDcsIGRzdCkKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSkKKyAgICA6IFtkc3RdInIiKGRzdCkKKyAgICA6ICJtZW1vcnkiCisgICk7Cit9CisKK3N0YXRpYyB2b2lkIERDOHV2Tm9Ub3AodWludDhfdCogZHN0KSB7ICAvLyBEQyB3aXRoIG5vIHRvcCBzYW1wbGVzCisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQ7CisgIGludCB0ZW1wNSwgdGVtcDYsIHRlbXA3LCB0ZW1wODsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgTE9BRF80X0JZVEVTKHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCAtMSwgMCwgLTEsIDEsIC0xLCAyLCAtMSwgMywgZHN0KQorICAgIExPQURfNF9CWVRFUyh0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wMSwgLTEsIDQsIC0xLCA1LCAtMSwgNiwgLTEsIDcsIGRzdCkKKyAgICAiYWRkdSAgICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgICAlW3RlbXAzXSAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAgICAlW3RlbXA0XSwgICAlW3RlbXA0XSwgICAgJVt0ZW1wNV0gICAgICBcblx0IgorICAgICJhZGR1ICAgICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wNl0sICAgICVbdGVtcDddICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgICVbdGVtcDhdLCAgICVbdGVtcDhdLCAgICAlW3RlbXAxXSAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAgJVt0ZW1wNF0gICAgICBcblx0IgorICAgICJhZGR1ICAgICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wNl0sICAgICVbdGVtcDhdICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgICVbdGVtcDBdLCAgICVbdGVtcDZdLCAgICAlW3RlbXAyXSAgICAgIFxuXHQiCisgICAgInNocmFfci53ICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgICAgMyAgICAgICAgICAgICBcblx0IgorICAgICJyZXBsdi5xYiAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICBTVE9SRV84X0JZVEVTKHRlbXAwLCB0ZW1wMCwgMCwgNCwgMCwgZHN0KQorICAgIFNUT1JFXzhfQllURVModGVtcDAsIHRlbXAwLCAxLCA0LCAxLCBkc3QpCisgICAgU1RPUkVfOF9CWVRFUyh0ZW1wMCwgdGVtcDAsIDIsIDQsIDIsIGRzdCkKKyAgICBTVE9SRV84X0JZVEVTKHRlbXAwLCB0ZW1wMCwgMywgNCwgMywgZHN0KQorICAgIFNUT1JFXzhfQllURVModGVtcDAsIHRlbXAwLCA0LCA0LCA0LCBkc3QpCisgICAgU1RPUkVfOF9CWVRFUyh0ZW1wMCwgdGVtcDAsIDUsIDQsIDUsIGRzdCkKKyAgICBTVE9SRV84X0JZVEVTKHRlbXAwLCB0ZW1wMCwgNiwgNCwgNiwgZHN0KQorICAgIFNUT1JFXzhfQllURVModGVtcDAsIHRlbXAwLCA3LCA0LCA3LCBkc3QpCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgIFt0ZW1wNl0iPSZyIih0ZW1wNiksIFt0ZW1wN10iPSZyIih0ZW1wNyksIFt0ZW1wOF0iPSZyIih0ZW1wOCkKKyAgICA6IFtkc3RdInIiKGRzdCkKKyAgICA6ICJtZW1vcnkiCisgICk7Cit9CisKKyN1bmRlZiBMT0FEXzhfQllURVMKKyN1bmRlZiBTVE9SRV84X0JZVEVTCisjdW5kZWYgTE9BRF80X0JZVEVTCisKKyNkZWZpbmUgQ0xJUFBJTkcoU0laRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJwcmVjZXUucGgucWJsICAgJVt0ZW1wMl0sICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAicHJlY2V1LnBoLnFiciAgICVbdGVtcDBdLCAgICVbdGVtcDBdICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyIuaWYgIiAjU0laRSAiID09IDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICJwcmVjZXUucGgucWJsICAgJVt0ZW1wM10sICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAicHJlY2V1LnBoLnFiciAgICVbdGVtcDFdLCAgICVbdGVtcDFdICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyIuZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICJhZGR1LnBoICAgICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgJVtkc3RfMV0gICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAiYWRkdS5waCAgICAgICAgICVbdGVtcDBdLCAgICVbdGVtcDBdLCAgICVbZHN0XzFdICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyIuaWYgIiAjU0laRSAiID09IDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICJhZGR1LnBoICAgICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wM10sICAgJVtkc3RfMV0gICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAiYWRkdS5waCAgICAgICAgICVbdGVtcDFdLCAgICVbdGVtcDFdLCAgICVbZHN0XzFdICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyIuZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICJzaGxsX3MucGggICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgNyAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAic2hsbF9zLnBoICAgICAgICVbdGVtcDBdLCAgICVbdGVtcDBdLCAgIDcgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyIuaWYgIiAjU0laRSAiID09IDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICJzaGxsX3MucGggICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wM10sICAgNyAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAic2hsbF9zLnBoICAgICAgICVbdGVtcDFdLCAgICVbdGVtcDFdLCAgIDcgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyIuZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICJwcmVjcnF1X3MucWIucGggJVt0ZW1wMF0sICAgJVt0ZW1wMl0sICAgJVt0ZW1wMF0gICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorIi5pZiAiICNTSVpFICIgPT0gOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgInByZWNycXVfcy5xYi5waCAlW3RlbXAxXSwgICAlW3RlbXAzXSwgICAlW3RlbXAxXSAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisiLmVuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisKKyNkZWZpbmUgQ0xJUF84Ql9UT19EU1QoRFNULCBUT1AsIFNJWkUpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludCBkc3RfMSA9ICgoaW50KShEU1QpWy0xXSA8PCAxNikgKyAoRFNUKVstMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19hc21fXyB2b2xhdGlsZSAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIuaWYgIiAjU0laRSAiIDwgOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAgICJ1bHcgICAgICAgICAgICAgJVt0ZW1wMF0sICAgMCglW3RvcF0pICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgICAic3VidS5waCAgICAgICAgICVbZHN0XzFdLCAgICVbZHN0XzFdLCAgICAlW3RvcF8xXSAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICAgQ0xJUFBJTkcoNCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJ1c3cgICAgICAgICAgICAgJVt0ZW1wMF0sICAgMCglW2RzdF0pICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgIi5lbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICAgInVsdyAgICAgICAgICAgICAlW3RlbXAwXSwgICAwKCVbdG9wXSkgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAgICJ1bHcgICAgICAgICAgICAgJVt0ZW1wMV0sICAgNCglW3RvcF0pICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgICAic3VidS5waCAgICAgICAgICVbZHN0XzFdLCAgICVbZHN0XzFdLCAgICAlW3RvcF8xXSAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICAgQ0xJUFBJTkcoOCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJ1c3cgICAgICAgICAgICAgJVt0ZW1wMF0sICAgMCglW2RzdF0pICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgICAidXN3ICAgICAgICAgICAgICVbdGVtcDFdLCAgIDQoJVtkc3RdKSAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICIuaWYgIiAjU0laRSAiID09IDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAgICJ1bHcgICAgICAgICAgICAgJVt0ZW1wMF0sICAgOCglW3RvcF0pICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgICAidWx3ICAgICAgICAgICAgICVbdGVtcDFdLCAgIDEyKCVbdG9wXSkgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICAgQ0xJUFBJTkcoOCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJ1c3cgICAgICAgICAgICAgJVt0ZW1wMF0sICAgOCglW2RzdF0pICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgICAidXN3ICAgICAgICAgICAgICVbdGVtcDFdLCAgIDEyKCVbZHN0XSkgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICIuZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAiLmVuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgICA6IFtkc3RfMV0iKyZyIihkc3RfMSksIFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksICAgICAgICAgICBcCisgICAgICBbdGVtcDJdIj0mciIodGVtcDIpLCBbdGVtcDNdIj0mciIodGVtcDMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDogW3RvcF8xXSJyIih0b3BfMSksIFt0b3BdInIiKChUT1ApKSwgW2RzdF0iciIoKERTVCkpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA6ICJtZW1vcnkiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDTElQX1RPX0RTVChEU1QsIFNJWkUpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50IHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQ4X3QqIHRvcCA9IChEU1QpIC0gQlBTOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBpbnQgdG9wXzEgPSAoKGludCl0b3BbLTFdIDw8IDE2KSArIHRvcFstMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yICh5ID0gMDsgeSA8IChTSVpFKTsgKyt5KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ0xJUF84Ql9UT19EU1QoKERTVCksIHRvcCwgKFNJWkUpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChEU1QpICs9IEJQUzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFRSVUVfTU9USU9OKERTVCwgU0laRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgVHJ1ZU1vdGlvbiMjU0laRSh1aW50OF90KiAoRFNUKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQ0xJUF9UT19EU1QoKERTVCksIChTSVpFKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK1RSVUVfTU9USU9OKGRzdCwgNCkKK1RSVUVfTU9USU9OKGRzdCwgOCkKK1RSVUVfTU9USU9OKGRzdCwgMTYpCisKKyN1bmRlZiBUUlVFX01PVElPTgorI3VuZGVmIENMSVBfVE9fRFNUCisjdW5kZWYgQ0xJUF84Ql9UT19EU1QKKyN1bmRlZiBDTElQUElORworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgVlA4RHNwSW5pdE1JUFNkc3BSMih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFZQOERzcEluaXRNSVBTZHNwUjIodm9pZCkgeworICBWUDhUcmFuc2Zvcm1EQyA9IFRyYW5zZm9ybURDOworICBWUDhUcmFuc2Zvcm1BQzMgPSBUcmFuc2Zvcm1BQzM7CisgIFZQOFRyYW5zZm9ybSA9IFRyYW5zZm9ybVR3bzsKKworICBWUDhWRmlsdGVyMTYgPSBWRmlsdGVyMTY7CisgIFZQOEhGaWx0ZXIxNiA9IEhGaWx0ZXIxNjsKKyAgVlA4VkZpbHRlcjggPSBWRmlsdGVyODsKKyAgVlA4SEZpbHRlcjggPSBIRmlsdGVyODsKKyAgVlA4VkZpbHRlcjE2aSA9IFZGaWx0ZXIxNmk7CisgIFZQOEhGaWx0ZXIxNmkgPSBIRmlsdGVyMTZpOworICBWUDhWRmlsdGVyOGkgPSBWRmlsdGVyOGk7CisgIFZQOEhGaWx0ZXI4aSA9IEhGaWx0ZXI4aTsKKyAgVlA4U2ltcGxlVkZpbHRlcjE2ID0gU2ltcGxlVkZpbHRlcjE2OworICBWUDhTaW1wbGVIRmlsdGVyMTYgPSBTaW1wbGVIRmlsdGVyMTY7CisgIFZQOFNpbXBsZVZGaWx0ZXIxNmkgPSBTaW1wbGVWRmlsdGVyMTZpOworICBWUDhTaW1wbGVIRmlsdGVyMTZpID0gU2ltcGxlSEZpbHRlcjE2aTsKKworICBWUDhQcmVkTHVtYTRbMF0gPSBEQzQ7CisgIFZQOFByZWRMdW1hNFsxXSA9IFRydWVNb3Rpb240OworICBWUDhQcmVkTHVtYTRbMl0gPSBWRTQ7CisgIFZQOFByZWRMdW1hNFs0XSA9IFJENDsKKyAgVlA4UHJlZEx1bWE0WzZdID0gTEQ0OworCisgIFZQOFByZWRDaHJvbWE4WzBdID0gREM4dXY7CisgIFZQOFByZWRDaHJvbWE4WzFdID0gVHJ1ZU1vdGlvbjg7CisgIFZQOFByZWRDaHJvbWE4WzRdID0gREM4dXZOb1RvcDsKKyAgVlA4UHJlZENocm9tYThbNV0gPSBEQzh1dk5vTGVmdDsKKworICBWUDhQcmVkTHVtYTE2WzFdID0gVHJ1ZU1vdGlvbjE2OworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX01JUFNfRFNQX1IyCisKK1dFQlBfRFNQX0lOSVRfU1RVQihWUDhEc3BJbml0TUlQU2RzcFIyKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX01JUFNfRFNQX1IyCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2RlY19tc2EuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZGVjX21zYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwOTA2MjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2RlY19tc2EuYwpAQCAtMCwwICsxLDEwMjAgQEAKKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBNU0EgdmVyc2lvbiBvZiBkc3AgZnVuY3Rpb25zCisvLworLy8gQXV0aG9yKHMpOiAgUHJhc2hhbnQgUGF0aWwgICAocHJhc2hhbnQucGF0aWxAaW1ndGVjLmNvbSkKKworCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTVNBKQorCisjaW5jbHVkZSAic3JjL2RzcC9tc2FfbWFjcm8uaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRyYW5zZm9ybXMKKworI2RlZmluZSBJRENUXzFEX1coaW4wLCBpbjEsIGluMiwgaW4zLCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKSB7ICBcCisgIHY0aTMyIGExX20sIGIxX20sIGMxX20sIGQxX207ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdjRpMzIgY190bXAxX20sIGNfdG1wMl9tLCBkX3RtcDFfbSwgZF90bXAyX207ICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB2NGkzMiBjb3NwaThzcXJ0Mm1pbnVzMSA9IF9fbXNhX2ZpbGxfdygyMDA5MSk7ICAgICAgICAgICBcCisgIGNvbnN0IHY0aTMyIHNpbnBpOHNxcnQyID0gX19tc2FfZmlsbF93KDM1NDY4KTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBhMV9tID0gaW4wICsgaW4yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGIxX20gPSBpbjAgLSBpbjI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY190bXAxX20gPSAoaW4xICogc2lucGk4c3FydDIpID4+IDE2OyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjX3RtcDJfbSA9IGluMyArICgoaW4zICogY29zcGk4c3FydDJtaW51czEpID4+IDE2KTsgICAgICAgICAgICBcCisgIGMxX20gPSBjX3RtcDFfbSAtIGNfdG1wMl9tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZF90bXAxX20gPSBpbjEgKyAoKGluMSAqIGNvc3BpOHNxcnQybWludXMxKSA+PiAxNik7ICAgICAgICAgICAgXAorICBkX3RtcDJfbSA9IChpbjMgKiBzaW5waThzcXJ0MikgPj4gMTY7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGQxX20gPSBkX3RtcDFfbSArIGRfdG1wMl9tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQlVUVEVSRkxZXzQoYTFfbSwgYjFfbSwgYzFfbSwgZDFfbSwgb3V0MCwgb3V0MSwgb3V0Miwgb3V0Myk7ICAgXAorfQorI2RlZmluZSBNVUxUMShhKSAoKCgoYSkgKiAyMDA5MSkgPj4gMTYpICsgKGEpKQorI2RlZmluZSBNVUxUMihhKSAoKChhKSAqIDM1NDY4KSA+PiAxNikKKworc3RhdGljIHZvaWQgVHJhbnNmb3JtT25lKGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QpIHsKKyAgdjhpMTYgaW5wdXQwLCBpbnB1dDE7CisgIHY0aTMyIGluMCwgaW4xLCBpbjIsIGluMywgaHowLCBoejEsIGh6MiwgaHozLCB2dDAsIHZ0MSwgdnQyLCB2dDM7CisgIHY0aTMyIHJlczAsIHJlczEsIHJlczIsIHJlczM7CisgIGNvbnN0IHYxNmk4IHplcm8gPSB7IDAgfTsKKyAgdjE2aTggZGVzdDAsIGRlc3QxLCBkZXN0MiwgZGVzdDM7CisKKyAgTERfU0gyKGluLCA4LCBpbnB1dDAsIGlucHV0MSk7CisgIFVOUENLX1NIX1NXKGlucHV0MCwgaW4wLCBpbjEpOworICBVTlBDS19TSF9TVyhpbnB1dDEsIGluMiwgaW4zKTsKKyAgSURDVF8xRF9XKGluMCwgaW4xLCBpbjIsIGluMywgaHowLCBoejEsIGh6MiwgaHozKTsKKyAgVFJBTlNQT1NFNHg0X1NXX1NXKGh6MCwgaHoxLCBoejIsIGh6MywgaHowLCBoejEsIGh6MiwgaHozKTsKKyAgSURDVF8xRF9XKGh6MCwgaHoxLCBoejIsIGh6MywgdnQwLCB2dDEsIHZ0MiwgdnQzKTsKKyAgU1JBUklfVzRfU1codnQwLCB2dDEsIHZ0MiwgdnQzLCAzKTsKKyAgVFJBTlNQT1NFNHg0X1NXX1NXKHZ0MCwgdnQxLCB2dDIsIHZ0MywgdnQwLCB2dDEsIHZ0MiwgdnQzKTsKKyAgTERfU0I0KGRzdCwgQlBTLCBkZXN0MCwgZGVzdDEsIGRlc3QyLCBkZXN0Myk7CisgIElMVlJfQjRfU1coemVybywgZGVzdDAsIHplcm8sIGRlc3QxLCB6ZXJvLCBkZXN0MiwgemVybywgZGVzdDMsCisgICAgICAgICAgICAgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMyk7CisgIElMVlJfSDRfU1coemVybywgcmVzMCwgemVybywgcmVzMSwgemVybywgcmVzMiwgemVybywgcmVzMywKKyAgICAgICAgICAgICByZXMwLCByZXMxLCByZXMyLCByZXMzKTsKKyAgQURENChyZXMwLCB2dDAsIHJlczEsIHZ0MSwgcmVzMiwgdnQyLCByZXMzLCB2dDMsIHJlczAsIHJlczEsIHJlczIsIHJlczMpOworICBDTElQX1NXNF8wXzI1NShyZXMwLCByZXMxLCByZXMyLCByZXMzKTsKKyAgUENLRVZfQjJfU1cocmVzMCwgcmVzMSwgcmVzMiwgcmVzMywgdnQwLCB2dDEpOworICByZXMwID0gKHY0aTMyKV9fbXNhX3Bja2V2X2IoKHYxNmk4KXZ0MCwgKHYxNmk4KXZ0MSk7CisgIFNUNHg0X1VCKHJlczAsIHJlczAsIDMsIDIsIDEsIDAsIGRzdCwgQlBTKTsKK30KKworc3RhdGljIHZvaWQgVHJhbnNmb3JtVHdvKGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QsIGludCBkb190d28pIHsKKyAgVHJhbnNmb3JtT25lKGluLCBkc3QpOworICBpZiAoZG9fdHdvKSB7CisgICAgVHJhbnNmb3JtT25lKGluICsgMTYsIGRzdCArIDQpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFRyYW5zZm9ybVdIVChjb25zdCBpbnQxNl90KiBpbiwgaW50MTZfdCogb3V0KSB7CisgIHY4aTE2IGlucHV0MCwgaW5wdXQxOworICBjb25zdCB2OGkxNiBtYXNrMCA9IHsgMCwgMSwgMiwgMywgOCwgOSwgMTAsIDExIH07CisgIGNvbnN0IHY4aTE2IG1hc2sxID0geyA0LCA1LCA2LCA3LCAxMiwgMTMsIDE0LCAxNSB9OworICBjb25zdCB2OGkxNiBtYXNrMiA9IHsgMCwgNCwgOCwgMTIsIDEsIDUsIDksIDEzIH07CisgIGNvbnN0IHY4aTE2IG1hc2szID0geyAzLCA3LCAxMSwgMTUsIDIsIDYsIDEwLCAxNCB9OworICB2OGkxNiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzOworICB2OGkxNiBvdXQwLCBvdXQxOworCisgIExEX1NIMihpbiwgOCwgaW5wdXQwLCBpbnB1dDEpOworICBpbnB1dDEgPSBTTERJX1NIKGlucHV0MSwgaW5wdXQxLCA4KTsKKyAgdG1wMCA9IGlucHV0MCArIGlucHV0MTsKKyAgdG1wMSA9IGlucHV0MCAtIGlucHV0MTsKKyAgVlNIRl9IMl9TSCh0bXAwLCB0bXAxLCB0bXAwLCB0bXAxLCBtYXNrMCwgbWFzazEsIHRtcDIsIHRtcDMpOworICBvdXQwID0gdG1wMiArIHRtcDM7CisgIG91dDEgPSB0bXAyIC0gdG1wMzsKKyAgVlNIRl9IMl9TSChvdXQwLCBvdXQxLCBvdXQwLCBvdXQxLCBtYXNrMiwgbWFzazMsIGlucHV0MCwgaW5wdXQxKTsKKyAgdG1wMCA9IGlucHV0MCArIGlucHV0MTsKKyAgdG1wMSA9IGlucHV0MCAtIGlucHV0MTsKKyAgVlNIRl9IMl9TSCh0bXAwLCB0bXAxLCB0bXAwLCB0bXAxLCBtYXNrMCwgbWFzazEsIHRtcDIsIHRtcDMpOworICB0bXAwID0gdG1wMiArIHRtcDM7CisgIHRtcDEgPSB0bXAyIC0gdG1wMzsKKyAgQUREVklfSDJfU0godG1wMCwgMywgdG1wMSwgMywgb3V0MCwgb3V0MSk7CisgIFNSQUlfSDJfU0gob3V0MCwgb3V0MSwgMyk7CisgIG91dFswXSA9IF9fbXNhX2NvcHlfc19oKG91dDAsIDApOworICBvdXRbMTZdID0gX19tc2FfY29weV9zX2gob3V0MCwgNCk7CisgIG91dFszMl0gPSBfX21zYV9jb3B5X3NfaChvdXQxLCAwKTsKKyAgb3V0WzQ4XSA9IF9fbXNhX2NvcHlfc19oKG91dDEsIDQpOworICBvdXRbNjRdID0gX19tc2FfY29weV9zX2gob3V0MCwgMSk7CisgIG91dFs4MF0gPSBfX21zYV9jb3B5X3NfaChvdXQwLCA1KTsKKyAgb3V0Wzk2XSA9IF9fbXNhX2NvcHlfc19oKG91dDEsIDEpOworICBvdXRbMTEyXSA9IF9fbXNhX2NvcHlfc19oKG91dDEsIDUpOworICBvdXRbMTI4XSA9IF9fbXNhX2NvcHlfc19oKG91dDAsIDIpOworICBvdXRbMTQ0XSA9IF9fbXNhX2NvcHlfc19oKG91dDAsIDYpOworICBvdXRbMTYwXSA9IF9fbXNhX2NvcHlfc19oKG91dDEsIDIpOworICBvdXRbMTc2XSA9IF9fbXNhX2NvcHlfc19oKG91dDEsIDYpOworICBvdXRbMTkyXSA9IF9fbXNhX2NvcHlfc19oKG91dDAsIDMpOworICBvdXRbMjA4XSA9IF9fbXNhX2NvcHlfc19oKG91dDAsIDcpOworICBvdXRbMjI0XSA9IF9fbXNhX2NvcHlfc19oKG91dDEsIDMpOworICBvdXRbMjQwXSA9IF9fbXNhX2NvcHlfc19oKG91dDEsIDcpOworfQorCitzdGF0aWMgdm9pZCBUcmFuc2Zvcm1EQyhjb25zdCBpbnQxNl90KiBpbiwgdWludDhfdCogZHN0KSB7CisgIGNvbnN0IGludCBEQyA9IChpblswXSArIDQpID4+IDM7CisgIGNvbnN0IHY4aTE2IHRtcDAgPSBfX21zYV9maWxsX2goREMpOworICBBRERCTEtfU1Q0eDRfVUIodG1wMCwgdG1wMCwgdG1wMCwgdG1wMCwgZHN0LCBCUFMpOworfQorCitzdGF0aWMgdm9pZCBUcmFuc2Zvcm1BQzMoY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCkgeworICBjb25zdCBpbnQgYSA9IGluWzBdICsgNDsKKyAgY29uc3QgaW50IGM0ID0gTVVMVDIoaW5bNF0pOworICBjb25zdCBpbnQgZDQgPSBNVUxUMShpbls0XSk7CisgIGNvbnN0IGludCBpbjIgPSBNVUxUMihpblsxXSk7CisgIGNvbnN0IGludCBpbjMgPSBNVUxUMShpblsxXSk7CisgIHY0aTMyIHRtcDAgPSB7IDAgfTsKKyAgdjRpMzIgb3V0MCA9IF9fbXNhX2ZpbGxfdyhhICsgZDQpOworICB2NGkzMiBvdXQxID0gX19tc2FfZmlsbF93KGEgKyBjNCk7CisgIHY0aTMyIG91dDIgPSBfX21zYV9maWxsX3coYSAtIGM0KTsKKyAgdjRpMzIgb3V0MyA9IF9fbXNhX2ZpbGxfdyhhIC0gZDQpOworICB2NGkzMiByZXMwLCByZXMxLCByZXMyLCByZXMzOworICBjb25zdCB2NGkzMiB6ZXJvID0geyAwIH07CisgIHYxNnU4IGRlc3QwLCBkZXN0MSwgZGVzdDIsIGRlc3QzOworCisgIElOU0VSVF9XNF9TVyhpbjMsIGluMiwgLWluMiwgLWluMywgdG1wMCk7CisgIEFERDQob3V0MCwgdG1wMCwgb3V0MSwgdG1wMCwgb3V0MiwgdG1wMCwgb3V0MywgdG1wMCwKKyAgICAgICBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKTsKKyAgU1JBSV9XNF9TVyhvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCAzKTsKKyAgTERfVUI0KGRzdCwgQlBTLCBkZXN0MCwgZGVzdDEsIGRlc3QyLCBkZXN0Myk7CisgIElMVlJfQjRfU1coemVybywgZGVzdDAsIHplcm8sIGRlc3QxLCB6ZXJvLCBkZXN0MiwgemVybywgZGVzdDMsCisgICAgICAgICAgICAgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMyk7CisgIElMVlJfSDRfU1coemVybywgcmVzMCwgemVybywgcmVzMSwgemVybywgcmVzMiwgemVybywgcmVzMywKKyAgICAgICAgICAgICByZXMwLCByZXMxLCByZXMyLCByZXMzKTsKKyAgQURENChyZXMwLCBvdXQwLCByZXMxLCBvdXQxLCByZXMyLCBvdXQyLCByZXMzLCBvdXQzLCByZXMwLCByZXMxLCByZXMyLCByZXMzKTsKKyAgQ0xJUF9TVzRfMF8yNTUocmVzMCwgcmVzMSwgcmVzMiwgcmVzMyk7CisgIFBDS0VWX0IyX1NXKHJlczAsIHJlczEsIHJlczIsIHJlczMsIG91dDAsIG91dDEpOworICByZXMwID0gKHY0aTMyKV9fbXNhX3Bja2V2X2IoKHYxNmk4KW91dDAsICh2MTZpOClvdXQxKTsKKyAgU1Q0eDRfVUIocmVzMCwgcmVzMCwgMywgMiwgMSwgMCwgZHN0LCBCUFMpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRWRnZSBmaWx0ZXJpbmcgZnVuY3Rpb25zCisKKyNkZWZpbmUgRkxJUF9TSUdOMihpbjAsIGluMSwgb3V0MCwgb3V0MSkgeyAgXAorICBvdXQwID0gKHYxNmk4KV9fbXNhX3hvcmlfYihpbjAsIDB4ODApOyAgICBcCisgIG91dDEgPSAodjE2aTgpX19tc2FfeG9yaV9iKGluMSwgMHg4MCk7ICAgIFwKK30KKworI2RlZmluZSBGTElQX1NJR040KGluMCwgaW4xLCBpbjIsIGluMywgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MykgeyAgXAorICBGTElQX1NJR04yKGluMCwgaW4xLCBvdXQwLCBvdXQxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGTElQX1NJR04yKGluMiwgaW4zLCBvdXQyLCBvdXQzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIEZJTFRfVkFMKHEwX20sIHAwX20sIG1hc2ssIGZpbHQpIGRvIHsgIFwKKyAgdjE2aTggcTBfc3ViX3AwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBxMF9zdWJfcDAgPSBfX21zYV9zdWJzX3NfYihxMF9tLCBwMF9tKTsgICAgICBcCisgIGZpbHQgPSBfX21zYV9hZGRzX3NfYihmaWx0LCBxMF9zdWJfcDApOyAgICAgIFwKKyAgZmlsdCA9IF9fbXNhX2FkZHNfc19iKGZpbHQsIHEwX3N1Yl9wMCk7ICAgICAgXAorICBmaWx0ID0gX19tc2FfYWRkc19zX2IoZmlsdCwgcTBfc3ViX3AwKTsgICAgICBcCisgIGZpbHQgPSBmaWx0ICYgbWFzazsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgRklMVDIocV9tLCBwX20sIHEsIHApIGRvIHsgICAgICAgICAgICBcCisgIHVfciA9IFNSQUlfSCh0ZW1wMSwgNyk7ICAgICAgICAgICAgICAgICAgICAgXAorICB1X3IgPSBfX21zYV9zYXRfc19oKHVfciwgNyk7ICAgICAgICAgICAgICAgIFwKKyAgdV9sID0gU1JBSV9IKHRlbXAzLCA3KTsgICAgICAgICAgICAgICAgICAgICBcCisgIHVfbCA9IF9fbXNhX3NhdF9zX2godV9sLCA3KTsgICAgICAgICAgICAgICAgXAorICB1ID0gX19tc2FfcGNrZXZfYigodjE2aTgpdV9sLCAodjE2aTgpdV9yKTsgIFwKKyAgcV9tID0gX19tc2Ffc3Vic19zX2IocV9tLCB1KTsgICAgICAgICAgICAgICBcCisgIHBfbSA9IF9fbXNhX2FkZHNfc19iKHBfbSwgdSk7ICAgICAgICAgICAgICAgXAorICBxID0gX19tc2FfeG9yaV9iKCh2MTZ1OClxX20sIDB4ODApOyAgICAgICAgIFwKKyAgcCA9IF9fbXNhX3hvcmlfYigodjE2dTgpcF9tLCAweDgwKTsgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIExQRl9GSUxURVI0XzRXKHAxLCBwMCwgcTAsIHExLCBtYXNrLCBoZXYpIGRvIHsgIFwKKyAgdjE2aTggcDFfbSwgcDBfbSwgcTBfbSwgcTFfbTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2MTZpOCBmaWx0LCB0MSwgdDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHYxNmk4IGNuc3Q0YiA9IF9fbXNhX2xkaV9iKDQpOyAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdjE2aTggY25zdDNiID0gX19tc2FfbGRpX2IoMyk7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZMSVBfU0lHTjQocDEsIHAwLCBxMCwgcTEsIHAxX20sIHAwX20sIHEwX20sIHExX20pOyAgIFwKKyAgZmlsdCA9IF9fbXNhX3N1YnNfc19iKHAxX20sIHExX20pOyAgICAgICAgICAgICAgICAgICAgXAorICBmaWx0ID0gZmlsdCAmIGhldjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZJTFRfVkFMKHEwX20sIHAwX20sIG1hc2ssIGZpbHQpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgdDEgPSBfX21zYV9hZGRzX3NfYihmaWx0LCBjbnN0NGIpOyAgICAgICAgICAgICAgICAgICAgXAorICB0MSA9IFNSQUlfQih0MSwgMyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHQyID0gX19tc2FfYWRkc19zX2IoZmlsdCwgY25zdDNiKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgdDIgPSBTUkFJX0IodDIsIDMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBxMF9tID0gX19tc2Ffc3Vic19zX2IocTBfbSwgdDEpOyAgICAgICAgICAgICAgICAgICAgICBcCisgIHEwID0gX19tc2FfeG9yaV9iKCh2MTZ1OClxMF9tLCAweDgwKTsgICAgICAgICAgICAgICAgIFwKKyAgcDBfbSA9IF9fbXNhX2FkZHNfc19iKHAwX20sIHQyKTsgICAgICAgICAgICAgICAgICAgICAgXAorICBwMCA9IF9fbXNhX3hvcmlfYigodjE2dTgpcDBfbSwgMHg4MCk7ICAgICAgICAgICAgICAgICBcCisgIGZpbHQgPSBfX21zYV9zcmFyaV9iKHQxLCAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaGV2ID0gX19tc2FfeG9yaV9iKGhldiwgMHhmZik7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmaWx0ID0gZmlsdCAmIGhldjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHExX20gPSBfX21zYV9zdWJzX3NfYihxMV9tLCBmaWx0KTsgICAgICAgICAgICAgICAgICAgIFwKKyAgcTEgPSBfX21zYV94b3JpX2IoKHYxNnU4KXExX20sIDB4ODApOyAgICAgICAgICAgICAgICAgXAorICBwMV9tID0gX19tc2FfYWRkc19zX2IocDFfbSwgZmlsdCk7ICAgICAgICAgICAgICAgICAgICBcCisgIHAxID0gX19tc2FfeG9yaV9iKCh2MTZ1OClwMV9tLCAweDgwKTsgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgTFBGX01CRklMVEVSKHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIG1hc2ssIGhldikgZG8geyAgXAorICB2MTZpOCBwMl9tLCBwMV9tLCBwMF9tLCBxMl9tLCBxMV9tLCBxMF9tOyAgICAgICAgICAgICAgICAgICBcCisgIHYxNmk4IHUsIGZpbHQsIHQxLCB0MiwgZmlsdF9zaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdjhpMTYgZmlsdF9yLCBmaWx0X2wsIHVfciwgdV9sOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2OGkxNiB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMzsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHYxNmk4IGNuc3Q0YiA9IF9fbXNhX2xkaV9iKDQpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdjE2aTggY25zdDNiID0gX19tc2FfbGRpX2IoMyk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB2OGkxNiBjbnN0OWggPSBfX21zYV9sZGlfaCg5KTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHY4aTE2IGNuc3Q2M2ggPSBfX21zYV9sZGlfaCg2Myk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGTElQX1NJR040KHAxLCBwMCwgcTAsIHExLCBwMV9tLCBwMF9tLCBxMF9tLCBxMV9tKTsgICAgICAgICBcCisgIGZpbHQgPSBfX21zYV9zdWJzX3NfYihwMV9tLCBxMV9tKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRklMVF9WQUwocTBfbSwgcDBfbSwgbWFzaywgZmlsdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGTElQX1NJR04yKHAyLCBxMiwgcDJfbSwgcTJfbSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHQyID0gZmlsdCAmIGhldjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgLyogZmlsdF92YWwgJj0gfmhldiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBoZXYgPSBfX21zYV94b3JpX2IoaGV2LCAweGZmKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZpbHQgPSBmaWx0ICYgaGV2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdDEgPSBfX21zYV9hZGRzX3NfYih0MiwgY25zdDRiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0MSA9IFNSQUlfQih0MSwgMyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHQyID0gX19tc2FfYWRkc19zX2IodDIsIGNuc3QzYik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdDIgPSBTUkFJX0IodDIsIDMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBxMF9tID0gX19tc2Ffc3Vic19zX2IocTBfbSwgdDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHAwX20gPSBfX21zYV9hZGRzX3NfYihwMF9tLCB0Mik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZmlsdF9zaWduID0gX19tc2FfY2x0aV9zX2IoZmlsdCwgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTFZSTF9CMl9TSChmaWx0X3NpZ24sIGZpbHQsIGZpbHRfciwgZmlsdF9sKTsgICAgICAgICAgICAgICBcCisgIC8qIHVwZGF0ZSBxMi9wMiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcDAgPSBmaWx0X3IgKiBjbnN0OWg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wMSA9IHRlbXAwICsgY25zdDYzaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXAyID0gZmlsdF9sICogY25zdDloOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcDMgPSB0ZW1wMiArIGNuc3Q2M2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGSUxUMihxMl9tLCBwMl9tLCBxMiwgcDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIC8qIHVwZGF0ZSBxMS9wMSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcDEgPSB0ZW1wMSArIHRlbXAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wMyA9IHRlbXAzICsgdGVtcDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZJTFQyKHExX20sIHAxX20sIHExLCBwMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgLyogdXBkYXRlIHEwL3AwICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wMSA9IHRlbXAxICsgdGVtcDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXAzID0gdGVtcDMgKyB0ZW1wMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRklMVDIocTBfbSwgcDBfbSwgcTAsIHAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBMUEZfTUFTS19IRVYocDNfaW4sIHAyX2luLCBwMV9pbiwgcDBfaW4sICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICBxMF9pbiwgcTFfaW4sIHEyX2luLCBxM19pbiwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIGxpbWl0X2luLCBiX2xpbWl0X2luLCB0aHJlc2hfaW4sICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgaGV2X291dCwgbWFza19vdXQpIGRvIHsgICAgICAgICAgICAgICAgICAgICBcCisgIHYxNnU4IHAzX2FzdWJfcDJfbSwgcDJfYXN1Yl9wMV9tLCBwMV9hc3ViX3AwX20sIHExX2FzdWJfcTBfbTsgIFwKKyAgdjE2dTggcDFfYXN1Yl9xMV9tLCBwMF9hc3ViX3EwX20sIHEzX2FzdWJfcTJfbSwgcTJfYXN1Yl9xMV9tOyAgXAorICB2MTZ1OCBmbGF0X291dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgLyogYWJzb2x1dGUgc3VidHJhY3Rpb24gb2YgcGl4ZWwgdmFsdWVzICovICAgICAgICAgICAgICAgICAgICAgXAorICBwM19hc3ViX3AyX20gPSBfX21zYV9hc3ViX3VfYihwM19pbiwgcDJfaW4pOyAgICAgICAgICAgICAgICAgICBcCisgIHAyX2FzdWJfcDFfbSA9IF9fbXNhX2FzdWJfdV9iKHAyX2luLCBwMV9pbik7ICAgICAgICAgICAgICAgICAgIFwKKyAgcDFfYXN1Yl9wMF9tID0gX19tc2FfYXN1Yl91X2IocDFfaW4sIHAwX2luKTsgICAgICAgICAgICAgICAgICAgXAorICBxMV9hc3ViX3EwX20gPSBfX21zYV9hc3ViX3VfYihxMV9pbiwgcTBfaW4pOyAgICAgICAgICAgICAgICAgICBcCisgIHEyX2FzdWJfcTFfbSA9IF9fbXNhX2FzdWJfdV9iKHEyX2luLCBxMV9pbik7ICAgICAgICAgICAgICAgICAgIFwKKyAgcTNfYXN1Yl9xMl9tID0gX19tc2FfYXN1Yl91X2IocTNfaW4sIHEyX2luKTsgICAgICAgICAgICAgICAgICAgXAorICBwMF9hc3ViX3EwX20gPSBfX21zYV9hc3ViX3VfYihwMF9pbiwgcTBfaW4pOyAgICAgICAgICAgICAgICAgICBcCisgIHAxX2FzdWJfcTFfbSA9IF9fbXNhX2FzdWJfdV9iKHAxX2luLCBxMV9pbik7ICAgICAgICAgICAgICAgICAgIFwKKyAgLyogY2FsY3VsYXRpb24gb2YgaGV2ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmbGF0X291dCA9IF9fbXNhX21heF91X2IocDFfYXN1Yl9wMF9tLCBxMV9hc3ViX3EwX20pOyAgICAgICAgICBcCisgIGhldl9vdXQgPSAodGhyZXNoX2luIDwgZmxhdF9vdXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgLyogY2FsY3VsYXRpb24gb2YgbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBwMF9hc3ViX3EwX20gPSBfX21zYV9hZGRzX3VfYihwMF9hc3ViX3EwX20sIHAwX2FzdWJfcTBfbSk7ICAgICBcCisgIHAxX2FzdWJfcTFfbSA9IFNSQUlfQihwMV9hc3ViX3ExX20sIDEpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcDBfYXN1Yl9xMF9tID0gX19tc2FfYWRkc191X2IocDBfYXN1Yl9xMF9tLCBwMV9hc3ViX3ExX20pOyAgICAgXAorICBtYXNrX291dCA9IChiX2xpbWl0X2luIDwgcDBfYXN1Yl9xMF9tKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG1hc2tfb3V0ID0gX19tc2FfbWF4X3VfYihmbGF0X291dCwgbWFza19vdXQpOyAgICAgICAgICAgICAgICAgIFwKKyAgcDNfYXN1Yl9wMl9tID0gX19tc2FfbWF4X3VfYihwM19hc3ViX3AyX20sIHAyX2FzdWJfcDFfbSk7ICAgICAgXAorICBtYXNrX291dCA9IF9fbXNhX21heF91X2IocDNfYXN1Yl9wMl9tLCBtYXNrX291dCk7ICAgICAgICAgICAgICBcCisgIHEyX2FzdWJfcTFfbSA9IF9fbXNhX21heF91X2IocTJfYXN1Yl9xMV9tLCBxM19hc3ViX3EyX20pOyAgICAgIFwKKyAgbWFza19vdXQgPSBfX21zYV9tYXhfdV9iKHEyX2FzdWJfcTFfbSwgbWFza19vdXQpOyAgICAgICAgICAgICAgXAorICBtYXNrX291dCA9IChsaW1pdF9pbiA8IG1hc2tfb3V0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG1hc2tfb3V0ID0gX19tc2FfeG9yaV9iKG1hc2tfb3V0LCAweGZmKTsgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgU1Q2eDFfVUIoaW4wLCBpbjBfaWR4LCBpbjEsIGluMV9pZHgsIHBkc3QsIHN0cmlkZSkgZG8geyBcCisgIGNvbnN0IHVpbnQxNl90IHRtcDBfaCA9IF9fbXNhX2NvcHlfc19oKCh2OGkxNilpbjEsIGluMV9pZHgpOyAgXAorICBjb25zdCB1aW50MzJfdCB0bXAwX3cgPSBfX21zYV9jb3B5X3NfdygodjRpMzIpaW4wLCBpbjBfaWR4KTsgIFwKKyAgU1codG1wMF93LCBwZHN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFNIKHRtcDBfaCwgcGRzdCArIHN0cmlkZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBTVDZ4NF9VQihpbjAsIHN0YXJ0X2luMF9pZHgsIGluMSwgc3RhcnRfaW4xX2lkeCwgcGRzdCwgc3RyaWRlKSBkbyB7IFwKKyAgdWludDhfdCogcHRtcDEgPSAodWludDhfdCopcGRzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFNUNngxX1VCKGluMCwgc3RhcnRfaW4wX2lkeCwgaW4xLCBzdGFydF9pbjFfaWR4LCBwdG1wMSwgNCk7ICAgICAgICAgICAgICAgXAorICBwdG1wMSArPSBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU1Q2eDFfVUIoaW4wLCBzdGFydF9pbjBfaWR4ICsgMSwgaW4xLCBzdGFydF9pbjFfaWR4ICsgMSwgcHRtcDEsIDQpOyAgICAgICBcCisgIHB0bXAxICs9IHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBTVDZ4MV9VQihpbjAsIHN0YXJ0X2luMF9pZHggKyAyLCBpbjEsIHN0YXJ0X2luMV9pZHggKyAyLCBwdG1wMSwgNCk7ICAgICAgIFwKKyAgcHRtcDEgKz0gc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFNUNngxX1VCKGluMCwgc3RhcnRfaW4wX2lkeCArIDMsIGluMSwgc3RhcnRfaW4xX2lkeCArIDMsIHB0bXAxLCA0KTsgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBMUEZfU0lNUExFX0ZJTFQocDFfaW4sIHAwX2luLCBxMF9pbiwgcTFfaW4sIG1hc2spIGRvIHsgICAgICAgXAorICAgIHYxNmk4IHAxX20sIHAwX20sIHEwX20sIHExX20sIGZpbHQsIGZpbHQxLCBmaWx0MjsgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHYxNmk4IGNuc3Q0YiA9IF9fbXNhX2xkaV9iKDQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHYxNmk4IGNuc3QzYiA9ICBfX21zYV9sZGlfYigzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZMSVBfU0lHTjQocDFfaW4sIHAwX2luLCBxMF9pbiwgcTFfaW4sIHAxX20sIHAwX20sIHEwX20sIHExX20pOyAgXAorICAgIGZpbHQgPSBfX21zYV9zdWJzX3NfYihwMV9tLCBxMV9tKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZJTFRfVkFMKHEwX20sIHAwX20sIG1hc2ssIGZpbHQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZpbHQxID0gX19tc2FfYWRkc19zX2IoZmlsdCwgY25zdDRiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZpbHQxID0gU1JBSV9CKGZpbHQxLCAzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZpbHQyID0gX19tc2FfYWRkc19zX2IoZmlsdCwgY25zdDNiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZpbHQyID0gU1JBSV9CKGZpbHQyLCAzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHEwX20gPSBfX21zYV9zdWJzX3NfYihxMF9tLCBmaWx0MSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHAwX20gPSBfX21zYV9hZGRzX3NfYihwMF9tLCBmaWx0Mik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHEwX2luID0gX19tc2FfeG9yaV9iKCh2MTZ1OClxMF9tLCAweDgwKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHAwX2luID0gX19tc2FfeG9yaV9iKCh2MTZ1OClwMF9tLCAweDgwKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBMUEZfU0lNUExFX01BU0socDEsIHAwLCBxMCwgcTEsIGJfbGltaXQsIG1hc2spIGRvIHsgICAgXAorICAgIHYxNnU4IHAxX2Ffc3ViX3ExLCBwMF9hX3N1Yl9xMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHAwX2Ffc3ViX3EwID0gX19tc2FfYXN1Yl91X2IocDAsIHEwKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHAxX2Ffc3ViX3ExID0gX19tc2FfYXN1Yl91X2IocDEsIHExKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHAxX2Ffc3ViX3ExID0gKHYxNnU4KV9fbXNhX3NybGlfYigodjE2aTgpcDFfYV9zdWJfcTEsIDEpOyAgXAorICAgIHAwX2Ffc3ViX3EwID0gX19tc2FfYWRkc191X2IocDBfYV9zdWJfcTAsIHAwX2Ffc3ViX3EwKTsgICAgXAorICAgIG1hc2sgPSBfX21zYV9hZGRzX3VfYihwMF9hX3N1Yl9xMCwgcDFfYV9zdWJfcTEpOyAgICAgICAgICAgXAorICAgIG1hc2sgPSAobWFzayA8PSBiX2xpbWl0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgVkZpbHRlcjE2KHVpbnQ4X3QqIHNyYywgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgYl9saW1pdF9pbiwgaW50IGxpbWl0X2luLCBpbnQgdGhyZXNoX2luKSB7CisgIHVpbnQ4X3QqIHB0ZW1wID0gc3JjIC0gNCAqIHN0cmlkZTsKKyAgdjE2dTggcDMsIHAyLCBwMSwgcDAsIHEzLCBxMiwgcTEsIHEwOworICB2MTZ1OCBtYXNrLCBoZXY7CisgIGNvbnN0IHYxNnU4IHRocmVzaCA9ICh2MTZ1OClfX21zYV9maWxsX2IodGhyZXNoX2luKTsKKyAgY29uc3QgdjE2dTggbGltaXQgPSAodjE2dTgpX19tc2FfZmlsbF9iKGxpbWl0X2luKTsKKyAgY29uc3QgdjE2dTggYl9saW1pdCA9ICh2MTZ1OClfX21zYV9maWxsX2IoYl9saW1pdF9pbik7CisKKyAgTERfVUI4KHB0ZW1wLCBzdHJpZGUsIHAzLCBwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBxMyk7CisgIExQRl9NQVNLX0hFVihwMywgcDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgcTMsIGxpbWl0LCBiX2xpbWl0LCB0aHJlc2gsCisgICAgICAgICAgICAgICBoZXYsIG1hc2spOworICBMUEZfTUJGSUxURVIocDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgbWFzaywgaGV2KTsKKyAgcHRlbXAgPSBzcmMgLSAzICogc3RyaWRlOworICBTVF9VQjQocDIsIHAxLCBwMCwgcTAsIHB0ZW1wLCBzdHJpZGUpOworICBwdGVtcCArPSAoNCAqIHN0cmlkZSk7CisgIFNUX1VCMihxMSwgcTIsIHB0ZW1wLCBzdHJpZGUpOworfQorCitzdGF0aWMgdm9pZCBIRmlsdGVyMTYodWludDhfdCogc3JjLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgIGludCBiX2xpbWl0X2luLCBpbnQgbGltaXRfaW4sIGludCB0aHJlc2hfaW4pIHsKKyAgdWludDhfdCogcHRtcCAgPSBzcmMgLSA0OworICB2MTZ1OCBwMywgcDIsIHAxLCBwMCwgcTMsIHEyLCBxMSwgcTA7CisgIHYxNnU4IG1hc2ssIGhldjsKKyAgdjE2dTggcm93MCwgcm93MSwgcm93Miwgcm93Mywgcm93NCwgcm93NSwgcm93Niwgcm93Nywgcm93ODsKKyAgdjE2dTggcm93OSwgcm93MTAsIHJvdzExLCByb3cxMiwgcm93MTMsIHJvdzE0LCByb3cxNTsKKyAgdjhpMTYgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKKyAgY29uc3QgdjE2dTggYl9saW1pdCA9ICh2MTZ1OClfX21zYV9maWxsX2IoYl9saW1pdF9pbik7CisgIGNvbnN0IHYxNnU4IGxpbWl0ID0gKHYxNnU4KV9fbXNhX2ZpbGxfYihsaW1pdF9pbik7CisgIGNvbnN0IHYxNnU4IHRocmVzaCA9ICh2MTZ1OClfX21zYV9maWxsX2IodGhyZXNoX2luKTsKKworICBMRF9VQjgocHRtcCwgc3RyaWRlLCByb3cwLCByb3cxLCByb3cyLCByb3czLCByb3c0LCByb3c1LCByb3c2LCByb3c3KTsKKyAgcHRtcCArPSAoOCAqIHN0cmlkZSk7CisgIExEX1VCOChwdG1wLCBzdHJpZGUsIHJvdzgsIHJvdzksIHJvdzEwLCByb3cxMSwgcm93MTIsIHJvdzEzLCByb3cxNCwgcm93MTUpOworICBUUkFOU1BPU0UxNng4X1VCX1VCKHJvdzAsIHJvdzEsIHJvdzIsIHJvdzMsIHJvdzQsIHJvdzUsIHJvdzYsIHJvdzcsCisgICAgICAgICAgICAgICAgICAgICAgcm93OCwgcm93OSwgcm93MTAsIHJvdzExLCByb3cxMiwgcm93MTMsIHJvdzE0LCByb3cxNSwKKyAgICAgICAgICAgICAgICAgICAgICBwMywgcDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgcTMpOworICBMUEZfTUFTS19IRVYocDMsIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIHEzLCBsaW1pdCwgYl9saW1pdCwgdGhyZXNoLAorICAgICAgICAgICAgICAgaGV2LCBtYXNrKTsKKyAgTFBGX01CRklMVEVSKHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIG1hc2ssIGhldik7CisgIElMVlJfQjJfU0gocDEsIHAyLCBxMCwgcDAsIHRtcDAsIHRtcDEpOworICBJTFZSTF9IMl9TSCh0bXAxLCB0bXAwLCB0bXAzLCB0bXA0KTsKKyAgSUxWTF9CMl9TSChwMSwgcDIsIHEwLCBwMCwgdG1wMCwgdG1wMSk7CisgIElMVlJMX0gyX1NIKHRtcDEsIHRtcDAsIHRtcDYsIHRtcDcpOworICBJTFZSTF9CMl9TSChxMiwgcTEsIHRtcDIsIHRtcDUpOworICBwdG1wID0gc3JjIC0gMzsKKyAgU1Q2eDFfVUIodG1wMywgMCwgdG1wMiwgMCwgcHRtcCwgNCk7CisgIHB0bXAgKz0gc3RyaWRlOworICBTVDZ4MV9VQih0bXAzLCAxLCB0bXAyLCAxLCBwdG1wLCA0KTsKKyAgcHRtcCArPSBzdHJpZGU7CisgIFNUNngxX1VCKHRtcDMsIDIsIHRtcDIsIDIsIHB0bXAsIDQpOworICBwdG1wICs9IHN0cmlkZTsKKyAgU1Q2eDFfVUIodG1wMywgMywgdG1wMiwgMywgcHRtcCwgNCk7CisgIHB0bXAgKz0gc3RyaWRlOworICBTVDZ4MV9VQih0bXA0LCAwLCB0bXAyLCA0LCBwdG1wLCA0KTsKKyAgcHRtcCArPSBzdHJpZGU7CisgIFNUNngxX1VCKHRtcDQsIDEsIHRtcDIsIDUsIHB0bXAsIDQpOworICBwdG1wICs9IHN0cmlkZTsKKyAgU1Q2eDFfVUIodG1wNCwgMiwgdG1wMiwgNiwgcHRtcCwgNCk7CisgIHB0bXAgKz0gc3RyaWRlOworICBTVDZ4MV9VQih0bXA0LCAzLCB0bXAyLCA3LCBwdG1wLCA0KTsKKyAgcHRtcCArPSBzdHJpZGU7CisgIFNUNngxX1VCKHRtcDYsIDAsIHRtcDUsIDAsIHB0bXAsIDQpOworICBwdG1wICs9IHN0cmlkZTsKKyAgU1Q2eDFfVUIodG1wNiwgMSwgdG1wNSwgMSwgcHRtcCwgNCk7CisgIHB0bXAgKz0gc3RyaWRlOworICBTVDZ4MV9VQih0bXA2LCAyLCB0bXA1LCAyLCBwdG1wLCA0KTsKKyAgcHRtcCArPSBzdHJpZGU7CisgIFNUNngxX1VCKHRtcDYsIDMsIHRtcDUsIDMsIHB0bXAsIDQpOworICBwdG1wICs9IHN0cmlkZTsKKyAgU1Q2eDFfVUIodG1wNywgMCwgdG1wNSwgNCwgcHRtcCwgNCk7CisgIHB0bXAgKz0gc3RyaWRlOworICBTVDZ4MV9VQih0bXA3LCAxLCB0bXA1LCA1LCBwdG1wLCA0KTsKKyAgcHRtcCArPSBzdHJpZGU7CisgIFNUNngxX1VCKHRtcDcsIDIsIHRtcDUsIDYsIHB0bXAsIDQpOworICBwdG1wICs9IHN0cmlkZTsKKyAgU1Q2eDFfVUIodG1wNywgMywgdG1wNSwgNywgcHRtcCwgNCk7Cit9CisKKy8vIG9uIHRocmVlIGlubmVyIGVkZ2VzCitzdGF0aWMgdm9pZCBWRmlsdGVySG9yRWRnZTE2aSh1aW50OF90KiBzcmMsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYl9saW1pdCwgaW50IGxpbWl0LCBpbnQgdGhyZXNoKSB7CisgIHYxNnU4IG1hc2ssIGhldjsKKyAgdjE2dTggcDMsIHAyLCBwMSwgcDAsIHEzLCBxMiwgcTEsIHEwOworICBjb25zdCB2MTZ1OCB0aHJlc2gwID0gKHYxNnU4KV9fbXNhX2ZpbGxfYih0aHJlc2gpOworICBjb25zdCB2MTZ1OCBiX2xpbWl0MCA9ICh2MTZ1OClfX21zYV9maWxsX2IoYl9saW1pdCk7CisgIGNvbnN0IHYxNnU4IGxpbWl0MCA9ICh2MTZ1OClfX21zYV9maWxsX2IobGltaXQpOworCisgIExEX1VCOCgoc3JjIC0gNCAqIHN0cmlkZSksIHN0cmlkZSwgcDMsIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIHEzKTsKKyAgTFBGX01BU0tfSEVWKHAzLCBwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBxMywgbGltaXQwLCBiX2xpbWl0MCwgdGhyZXNoMCwKKyAgICAgICAgICAgICAgIGhldiwgbWFzayk7CisgIExQRl9GSUxURVI0XzRXKHAxLCBwMCwgcTAsIHExLCBtYXNrLCBoZXYpOworICBTVF9VQjQocDEsIHAwLCBxMCwgcTEsIChzcmMgLSAyICogc3RyaWRlKSwgc3RyaWRlKTsKK30KKworc3RhdGljIHZvaWQgVkZpbHRlcjE2aSh1aW50OF90KiBzcmNfeSwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGJfbGltaXQsIGludCBsaW1pdCwgaW50IHRocmVzaCkgeworICBWRmlsdGVySG9yRWRnZTE2aShzcmNfeSArICA0ICogc3RyaWRlLCBzdHJpZGUsIGJfbGltaXQsIGxpbWl0LCB0aHJlc2gpOworICBWRmlsdGVySG9yRWRnZTE2aShzcmNfeSArICA4ICogc3RyaWRlLCBzdHJpZGUsIGJfbGltaXQsIGxpbWl0LCB0aHJlc2gpOworICBWRmlsdGVySG9yRWRnZTE2aShzcmNfeSArIDEyICogc3RyaWRlLCBzdHJpZGUsIGJfbGltaXQsIGxpbWl0LCB0aHJlc2gpOworfQorCitzdGF0aWMgdm9pZCBIRmlsdGVyVmVydEVkZ2UxNmkodWludDhfdCogc3JjLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiX2xpbWl0LCBpbnQgbGltaXQsIGludCB0aHJlc2gpIHsKKyAgdjE2dTggbWFzaywgaGV2OworICB2MTZ1OCBwMywgcDIsIHAxLCBwMCwgcTMsIHEyLCBxMSwgcTA7CisgIHYxNnU4IHJvdzAsIHJvdzEsIHJvdzIsIHJvdzMsIHJvdzQsIHJvdzUsIHJvdzYsIHJvdzc7CisgIHYxNnU4IHJvdzgsIHJvdzksIHJvdzEwLCByb3cxMSwgcm93MTIsIHJvdzEzLCByb3cxNCwgcm93MTU7CisgIHY4aTE2IHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDU7CisgIGNvbnN0IHYxNnU4IHRocmVzaDAgPSAodjE2dTgpX19tc2FfZmlsbF9iKHRocmVzaCk7CisgIGNvbnN0IHYxNnU4IGJfbGltaXQwID0gKHYxNnU4KV9fbXNhX2ZpbGxfYihiX2xpbWl0KTsKKyAgY29uc3QgdjE2dTggbGltaXQwID0gKHYxNnU4KV9fbXNhX2ZpbGxfYihsaW1pdCk7CisKKyAgTERfVUI4KHNyYyAtIDQsIHN0cmlkZSwgcm93MCwgcm93MSwgcm93Miwgcm93Mywgcm93NCwgcm93NSwgcm93Niwgcm93Nyk7CisgIExEX1VCOChzcmMgLSA0ICsgKDggKiBzdHJpZGUpLCBzdHJpZGUsCisgICAgICAgICByb3c4LCByb3c5LCByb3cxMCwgcm93MTEsIHJvdzEyLCByb3cxMywgcm93MTQsIHJvdzE1KTsKKyAgVFJBTlNQT1NFMTZ4OF9VQl9VQihyb3cwLCByb3cxLCByb3cyLCByb3czLCByb3c0LCByb3c1LCByb3c2LCByb3c3LAorICAgICAgICAgICAgICAgICAgICAgIHJvdzgsIHJvdzksIHJvdzEwLCByb3cxMSwgcm93MTIsIHJvdzEzLCByb3cxNCwgcm93MTUsCisgICAgICAgICAgICAgICAgICAgICAgcDMsIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIHEzKTsKKyAgTFBGX01BU0tfSEVWKHAzLCBwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBxMywgbGltaXQwLCBiX2xpbWl0MCwgdGhyZXNoMCwKKyAgICAgICAgICAgICAgIGhldiwgbWFzayk7CisgIExQRl9GSUxURVI0XzRXKHAxLCBwMCwgcTAsIHExLCBtYXNrLCBoZXYpOworICBJTFZSX0IyX1NIKHAwLCBwMSwgcTEsIHEwLCB0bXAwLCB0bXAxKTsKKyAgSUxWUkxfSDJfU0godG1wMSwgdG1wMCwgdG1wMiwgdG1wMyk7CisgIElMVkxfQjJfU0gocDAsIHAxLCBxMSwgcTAsIHRtcDAsIHRtcDEpOworICBJTFZSTF9IMl9TSCh0bXAxLCB0bXAwLCB0bXA0LCB0bXA1KTsKKyAgc3JjIC09IDI7CisgIFNUNHg4X1VCKHRtcDIsIHRtcDMsIHNyYywgc3RyaWRlKTsKKyAgc3JjICs9ICg4ICogc3RyaWRlKTsKKyAgU1Q0eDhfVUIodG1wNCwgdG1wNSwgc3JjLCBzdHJpZGUpOworfQorCitzdGF0aWMgdm9pZCBIRmlsdGVyMTZpKHVpbnQ4X3QqIHNyY195LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgYl9saW1pdCwgaW50IGxpbWl0LCBpbnQgdGhyZXNoKSB7CisgIEhGaWx0ZXJWZXJ0RWRnZTE2aShzcmNfeSArICA0LCBzdHJpZGUsIGJfbGltaXQsIGxpbWl0LCB0aHJlc2gpOworICBIRmlsdGVyVmVydEVkZ2UxNmkoc3JjX3kgKyAgOCwgc3RyaWRlLCBiX2xpbWl0LCBsaW1pdCwgdGhyZXNoKTsKKyAgSEZpbHRlclZlcnRFZGdlMTZpKHNyY195ICsgMTIsIHN0cmlkZSwgYl9saW1pdCwgbGltaXQsIHRocmVzaCk7Cit9CisKKy8vIDgtcGl4ZWxzIHdpZGUgdmFyaWFudHMsIGZvciBjaHJvbWEgZmlsdGVyaW5nCitzdGF0aWMgdm9pZCBWRmlsdGVyOCh1aW50OF90KiBzcmNfdSwgdWludDhfdCogc3JjX3YsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICBpbnQgYl9saW1pdF9pbiwgaW50IGxpbWl0X2luLCBpbnQgdGhyZXNoX2luKSB7CisgIHVpbnQ4X3QqIHB0bXBfc3JjX3UgPSBzcmNfdSAtIDQgKiBzdHJpZGU7CisgIHVpbnQ4X3QqIHB0bXBfc3JjX3YgPSBzcmNfdiAtIDQgKiBzdHJpZGU7CisgIHVpbnQ2NF90IHAyX2QsIHAxX2QsIHAwX2QsIHEwX2QsIHExX2QsIHEyX2Q7CisgIHYxNnU4IHAzLCBwMiwgcDEsIHAwLCBxMywgcTIsIHExLCBxMCwgbWFzaywgaGV2OworICB2MTZ1OCBwM191LCBwMl91LCBwMV91LCBwMF91LCBxM191LCBxMl91LCBxMV91LCBxMF91OworICB2MTZ1OCBwM192LCBwMl92LCBwMV92LCBwMF92LCBxM192LCBxMl92LCBxMV92LCBxMF92OworICBjb25zdCB2MTZ1OCBiX2xpbWl0ID0gKHYxNnU4KV9fbXNhX2ZpbGxfYihiX2xpbWl0X2luKTsKKyAgY29uc3QgdjE2dTggbGltaXQgPSAodjE2dTgpX19tc2FfZmlsbF9iKGxpbWl0X2luKTsKKyAgY29uc3QgdjE2dTggdGhyZXNoID0gKHYxNnU4KV9fbXNhX2ZpbGxfYih0aHJlc2hfaW4pOworCisgIExEX1VCOChwdG1wX3NyY191LCBzdHJpZGUsIHAzX3UsIHAyX3UsIHAxX3UsIHAwX3UsIHEwX3UsIHExX3UsIHEyX3UsIHEzX3UpOworICBMRF9VQjgocHRtcF9zcmNfdiwgc3RyaWRlLCBwM192LCBwMl92LCBwMV92LCBwMF92LCBxMF92LCBxMV92LCBxMl92LCBxM192KTsKKyAgSUxWUl9ENF9VQihwM192LCBwM191LCBwMl92LCBwMl91LCBwMV92LCBwMV91LCBwMF92LCBwMF91LCBwMywgcDIsIHAxLCBwMCk7CisgIElMVlJfRDRfVUIocTBfdiwgcTBfdSwgcTFfdiwgcTFfdSwgcTJfdiwgcTJfdSwgcTNfdiwgcTNfdSwgcTAsIHExLCBxMiwgcTMpOworICBMUEZfTUFTS19IRVYocDMsIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIHEzLCBsaW1pdCwgYl9saW1pdCwgdGhyZXNoLAorICAgICAgICAgICAgICAgaGV2LCBtYXNrKTsKKyAgTFBGX01CRklMVEVSKHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIG1hc2ssIGhldik7CisgIHAyX2QgPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpcDIsIDApOworICBwMV9kID0gX19tc2FfY29weV9zX2QoKHYyaTY0KXAxLCAwKTsKKyAgcDBfZCA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NClwMCwgMCk7CisgIHEwX2QgPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpcTAsIDApOworICBxMV9kID0gX19tc2FfY29weV9zX2QoKHYyaTY0KXExLCAwKTsKKyAgcTJfZCA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NClxMiwgMCk7CisgIHB0bXBfc3JjX3UgKz0gc3RyaWRlOworICBTRDQocDJfZCwgcDFfZCwgcDBfZCwgcTBfZCwgcHRtcF9zcmNfdSwgc3RyaWRlKTsKKyAgcHRtcF9zcmNfdSArPSAoNCAqIHN0cmlkZSk7CisgIFNEKHExX2QsIHB0bXBfc3JjX3UpOworICBwdG1wX3NyY191ICs9IHN0cmlkZTsKKyAgU0QocTJfZCwgcHRtcF9zcmNfdSk7CisgIHAyX2QgPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpcDIsIDEpOworICBwMV9kID0gX19tc2FfY29weV9zX2QoKHYyaTY0KXAxLCAxKTsKKyAgcDBfZCA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NClwMCwgMSk7CisgIHEwX2QgPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpcTAsIDEpOworICBxMV9kID0gX19tc2FfY29weV9zX2QoKHYyaTY0KXExLCAxKTsKKyAgcTJfZCA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NClxMiwgMSk7CisgIHB0bXBfc3JjX3YgKz0gc3RyaWRlOworICBTRDQocDJfZCwgcDFfZCwgcDBfZCwgcTBfZCwgcHRtcF9zcmNfdiwgc3RyaWRlKTsKKyAgcHRtcF9zcmNfdiArPSAoNCAqIHN0cmlkZSk7CisgIFNEKHExX2QsIHB0bXBfc3JjX3YpOworICBwdG1wX3NyY192ICs9IHN0cmlkZTsKKyAgU0QocTJfZCwgcHRtcF9zcmNfdik7Cit9CisKK3N0YXRpYyB2b2lkIEhGaWx0ZXI4KHVpbnQ4X3QqIHNyY191LCB1aW50OF90KiBzcmNfdiwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgIGludCBiX2xpbWl0X2luLCBpbnQgbGltaXRfaW4sIGludCB0aHJlc2hfaW4pIHsKKyAgdWludDhfdCogcHRtcF9zcmNfdSA9IHNyY191IC0gNDsKKyAgdWludDhfdCogcHRtcF9zcmNfdiA9IHNyY192IC0gNDsKKyAgdjE2dTggcDMsIHAyLCBwMSwgcDAsIHEzLCBxMiwgcTEsIHEwLCBtYXNrLCBoZXY7CisgIHYxNnU4IHJvdzAsIHJvdzEsIHJvdzIsIHJvdzMsIHJvdzQsIHJvdzUsIHJvdzYsIHJvdzcsIHJvdzg7CisgIHYxNnU4IHJvdzksIHJvdzEwLCByb3cxMSwgcm93MTIsIHJvdzEzLCByb3cxNCwgcm93MTU7CisgIHY4aTE2IHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7CisgIGNvbnN0IHYxNnU4IGJfbGltaXQgPSAodjE2dTgpX19tc2FfZmlsbF9iKGJfbGltaXRfaW4pOworICBjb25zdCB2MTZ1OCBsaW1pdCA9ICh2MTZ1OClfX21zYV9maWxsX2IobGltaXRfaW4pOworICBjb25zdCB2MTZ1OCB0aHJlc2ggPSAodjE2dTgpX19tc2FfZmlsbF9iKHRocmVzaF9pbik7CisKKyAgTERfVUI4KHB0bXBfc3JjX3UsIHN0cmlkZSwgcm93MCwgcm93MSwgcm93Miwgcm93Mywgcm93NCwgcm93NSwgcm93Niwgcm93Nyk7CisgIExEX1VCOChwdG1wX3NyY192LCBzdHJpZGUsCisgICAgICAgICByb3c4LCByb3c5LCByb3cxMCwgcm93MTEsIHJvdzEyLCByb3cxMywgcm93MTQsIHJvdzE1KTsKKyAgVFJBTlNQT1NFMTZ4OF9VQl9VQihyb3cwLCByb3cxLCByb3cyLCByb3czLCByb3c0LCByb3c1LCByb3c2LCByb3c3LAorICAgICAgICAgICAgICAgICAgICAgIHJvdzgsIHJvdzksIHJvdzEwLCByb3cxMSwgcm93MTIsIHJvdzEzLCByb3cxNCwgcm93MTUsCisgICAgICAgICAgICAgICAgICAgICAgcDMsIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIHEzKTsKKyAgTFBGX01BU0tfSEVWKHAzLCBwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBxMywgbGltaXQsIGJfbGltaXQsIHRocmVzaCwKKyAgICAgICAgICAgICAgIGhldiwgbWFzayk7CisgIExQRl9NQkZJTFRFUihwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBtYXNrLCBoZXYpOworICBJTFZSX0IyX1NIKHAxLCBwMiwgcTAsIHAwLCB0bXAwLCB0bXAxKTsKKyAgSUxWUkxfSDJfU0godG1wMSwgdG1wMCwgdG1wMywgdG1wNCk7CisgIElMVkxfQjJfU0gocDEsIHAyLCBxMCwgcDAsIHRtcDAsIHRtcDEpOworICBJTFZSTF9IMl9TSCh0bXAxLCB0bXAwLCB0bXA2LCB0bXA3KTsKKyAgSUxWUkxfQjJfU0gocTIsIHExLCB0bXAyLCB0bXA1KTsKKyAgcHRtcF9zcmNfdSArPSAxOworICBTVDZ4NF9VQih0bXAzLCAwLCB0bXAyLCAwLCBwdG1wX3NyY191LCBzdHJpZGUpOworICBwdG1wX3NyY191ICs9IDQgKiBzdHJpZGU7CisgIFNUNng0X1VCKHRtcDQsIDAsIHRtcDIsIDQsIHB0bXBfc3JjX3UsIHN0cmlkZSk7CisgIHB0bXBfc3JjX3YgKz0gMTsKKyAgU1Q2eDRfVUIodG1wNiwgMCwgdG1wNSwgMCwgcHRtcF9zcmNfdiwgc3RyaWRlKTsKKyAgcHRtcF9zcmNfdiArPSA0ICogc3RyaWRlOworICBTVDZ4NF9VQih0bXA3LCAwLCB0bXA1LCA0LCBwdG1wX3NyY192LCBzdHJpZGUpOworfQorCitzdGF0aWMgdm9pZCBWRmlsdGVyOGkodWludDhfdCogc3JjX3UsIHVpbnQ4X3QqIHNyY192LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgIGludCBiX2xpbWl0X2luLCBpbnQgbGltaXRfaW4sIGludCB0aHJlc2hfaW4pIHsKKyAgdWludDY0X3QgcDFfZCwgcDBfZCwgcTBfZCwgcTFfZDsKKyAgdjE2dTggcDMsIHAyLCBwMSwgcDAsIHEzLCBxMiwgcTEsIHEwLCBtYXNrLCBoZXY7CisgIHYxNnU4IHAzX3UsIHAyX3UsIHAxX3UsIHAwX3UsIHEzX3UsIHEyX3UsIHExX3UsIHEwX3U7CisgIHYxNnU4IHAzX3YsIHAyX3YsIHAxX3YsIHAwX3YsIHEzX3YsIHEyX3YsIHExX3YsIHEwX3Y7CisgIGNvbnN0IHYxNnU4IHRocmVzaCA9ICh2MTZ1OClfX21zYV9maWxsX2IodGhyZXNoX2luKTsKKyAgY29uc3QgdjE2dTggbGltaXQgPSAodjE2dTgpX19tc2FfZmlsbF9iKGxpbWl0X2luKTsKKyAgY29uc3QgdjE2dTggYl9saW1pdCA9ICh2MTZ1OClfX21zYV9maWxsX2IoYl9saW1pdF9pbik7CisKKyAgTERfVUI4KHNyY191LCBzdHJpZGUsIHAzX3UsIHAyX3UsIHAxX3UsIHAwX3UsIHEwX3UsIHExX3UsIHEyX3UsIHEzX3UpOworICBzcmNfdSArPSAoNSAqIHN0cmlkZSk7CisgIExEX1VCOChzcmNfdiwgc3RyaWRlLCBwM192LCBwMl92LCBwMV92LCBwMF92LCBxMF92LCBxMV92LCBxMl92LCBxM192KTsKKyAgc3JjX3YgKz0gKDUgKiBzdHJpZGUpOworICBJTFZSX0Q0X1VCKHAzX3YsIHAzX3UsIHAyX3YsIHAyX3UsIHAxX3YsIHAxX3UsIHAwX3YsIHAwX3UsIHAzLCBwMiwgcDEsIHAwKTsKKyAgSUxWUl9ENF9VQihxMF92LCBxMF91LCBxMV92LCBxMV91LCBxMl92LCBxMl91LCBxM192LCBxM191LCBxMCwgcTEsIHEyLCBxMyk7CisgIExQRl9NQVNLX0hFVihwMywgcDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgcTMsIGxpbWl0LCBiX2xpbWl0LCB0aHJlc2gsCisgICAgICAgICAgICAgICBoZXYsIG1hc2spOworICBMUEZfRklMVEVSNF80VyhwMSwgcDAsIHEwLCBxMSwgbWFzaywgaGV2KTsKKyAgcDFfZCA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NClwMSwgMCk7CisgIHAwX2QgPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpcDAsIDApOworICBxMF9kID0gX19tc2FfY29weV9zX2QoKHYyaTY0KXEwLCAwKTsKKyAgcTFfZCA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NClxMSwgMCk7CisgIFNENChxMV9kLCBxMF9kLCBwMF9kLCBwMV9kLCBzcmNfdSwgLXN0cmlkZSk7CisgIHAxX2QgPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpcDEsIDEpOworICBwMF9kID0gX19tc2FfY29weV9zX2QoKHYyaTY0KXAwLCAxKTsKKyAgcTBfZCA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NClxMCwgMSk7CisgIHExX2QgPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpcTEsIDEpOworICBTRDQocTFfZCwgcTBfZCwgcDBfZCwgcDFfZCwgc3JjX3YsIC1zdHJpZGUpOworfQorCitzdGF0aWMgdm9pZCBIRmlsdGVyOGkodWludDhfdCogc3JjX3UsIHVpbnQ4X3QqIHNyY192LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgIGludCBiX2xpbWl0X2luLCBpbnQgbGltaXRfaW4sIGludCB0aHJlc2hfaW4pIHsKKyAgdjE2dTggcDMsIHAyLCBwMSwgcDAsIHEzLCBxMiwgcTEsIHEwLCBtYXNrLCBoZXY7CisgIHYxNnU4IHJvdzAsIHJvdzEsIHJvdzIsIHJvdzMsIHJvdzQsIHJvdzUsIHJvdzYsIHJvdzcsIHJvdzg7CisgIHYxNnU4IHJvdzksIHJvdzEwLCByb3cxMSwgcm93MTIsIHJvdzEzLCByb3cxNCwgcm93MTU7CisgIHY0aTMyIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDU7CisgIGNvbnN0IHYxNnU4IHRocmVzaCA9ICh2MTZ1OClfX21zYV9maWxsX2IodGhyZXNoX2luKTsKKyAgY29uc3QgdjE2dTggbGltaXQgPSAodjE2dTgpX19tc2FfZmlsbF9iKGxpbWl0X2luKTsKKyAgY29uc3QgdjE2dTggYl9saW1pdCA9ICh2MTZ1OClfX21zYV9maWxsX2IoYl9saW1pdF9pbik7CisKKyAgTERfVUI4KHNyY191LCBzdHJpZGUsIHJvdzAsIHJvdzEsIHJvdzIsIHJvdzMsIHJvdzQsIHJvdzUsIHJvdzYsIHJvdzcpOworICBMRF9VQjgoc3JjX3YsIHN0cmlkZSwKKyAgICAgICAgIHJvdzgsIHJvdzksIHJvdzEwLCByb3cxMSwgcm93MTIsIHJvdzEzLCByb3cxNCwgcm93MTUpOworICBUUkFOU1BPU0UxNng4X1VCX1VCKHJvdzAsIHJvdzEsIHJvdzIsIHJvdzMsIHJvdzQsIHJvdzUsIHJvdzYsIHJvdzcsCisgICAgICAgICAgICAgICAgICAgICAgcm93OCwgcm93OSwgcm93MTAsIHJvdzExLCByb3cxMiwgcm93MTMsIHJvdzE0LCByb3cxNSwKKyAgICAgICAgICAgICAgICAgICAgICBwMywgcDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgcTMpOworICBMUEZfTUFTS19IRVYocDMsIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIHEzLCBsaW1pdCwgYl9saW1pdCwgdGhyZXNoLAorICAgICAgICAgICAgICAgaGV2LCBtYXNrKTsKKyAgTFBGX0ZJTFRFUjRfNFcocDEsIHAwLCBxMCwgcTEsIG1hc2ssIGhldik7CisgIElMVlJfQjJfU1cocDAsIHAxLCBxMSwgcTAsIHRtcDAsIHRtcDEpOworICBJTFZSTF9IMl9TVyh0bXAxLCB0bXAwLCB0bXAyLCB0bXAzKTsKKyAgSUxWTF9CMl9TVyhwMCwgcDEsIHExLCBxMCwgdG1wMCwgdG1wMSk7CisgIElMVlJMX0gyX1NXKHRtcDEsIHRtcDAsIHRtcDQsIHRtcDUpOworICBzcmNfdSArPSAyOworICBTVDR4NF9VQih0bXAyLCB0bXAyLCAwLCAxLCAyLCAzLCBzcmNfdSwgc3RyaWRlKTsKKyAgc3JjX3UgKz0gNCAqIHN0cmlkZTsKKyAgU1Q0eDRfVUIodG1wMywgdG1wMywgMCwgMSwgMiwgMywgc3JjX3UsIHN0cmlkZSk7CisgIHNyY192ICs9IDI7CisgIFNUNHg0X1VCKHRtcDQsIHRtcDQsIDAsIDEsIDIsIDMsIHNyY192LCBzdHJpZGUpOworICBzcmNfdiArPSA0ICogc3RyaWRlOworICBTVDR4NF9VQih0bXA1LCB0bXA1LCAwLCAxLCAyLCAzLCBzcmNfdiwgc3RyaWRlKTsKK30KKworc3RhdGljIHZvaWQgU2ltcGxlVkZpbHRlcjE2KHVpbnQ4X3QqIHNyYywgaW50IHN0cmlkZSwgaW50IGJfbGltaXRfaW4pIHsKKyAgdjE2dTggcDEsIHAwLCBxMSwgcTAsIG1hc2s7CisgIGNvbnN0IHYxNnU4IGJfbGltaXQgPSAodjE2dTgpX19tc2FfZmlsbF9iKGJfbGltaXRfaW4pOworCisgIExEX1VCNChzcmMgLSAyICogc3RyaWRlLCBzdHJpZGUsIHAxLCBwMCwgcTAsIHExKTsKKyAgTFBGX1NJTVBMRV9NQVNLKHAxLCBwMCwgcTAsIHExLCBiX2xpbWl0LCBtYXNrKTsKKyAgTFBGX1NJTVBMRV9GSUxUKHAxLCBwMCwgcTAsIHExLCBtYXNrKTsKKyAgU1RfVUIyKHAwLCBxMCwgc3JjIC0gc3RyaWRlLCBzdHJpZGUpOworfQorCitzdGF0aWMgdm9pZCBTaW1wbGVIRmlsdGVyMTYodWludDhfdCogc3JjLCBpbnQgc3RyaWRlLCBpbnQgYl9saW1pdF9pbikgeworICB2MTZ1OCBwMSwgcDAsIHExLCBxMCwgbWFzaywgcm93MCwgcm93MSwgcm93Miwgcm93Mywgcm93NCwgcm93NSwgcm93Niwgcm93NzsKKyAgdjE2dTggcm93OCwgcm93OSwgcm93MTAsIHJvdzExLCByb3cxMiwgcm93MTMsIHJvdzE0LCByb3cxNTsKKyAgdjhpMTYgdG1wMCwgdG1wMTsKKyAgY29uc3QgdjE2dTggYl9saW1pdCA9ICh2MTZ1OClfX21zYV9maWxsX2IoYl9saW1pdF9pbik7CisgIHVpbnQ4X3QqIHB0ZW1wX3NyYyA9IHNyYyAtIDI7CisKKyAgTERfVUI4KHB0ZW1wX3NyYywgc3RyaWRlLCByb3cwLCByb3cxLCByb3cyLCByb3czLCByb3c0LCByb3c1LCByb3c2LCByb3c3KTsKKyAgTERfVUI4KHB0ZW1wX3NyYyArIDggKiBzdHJpZGUsIHN0cmlkZSwKKyAgICAgICAgIHJvdzgsIHJvdzksIHJvdzEwLCByb3cxMSwgcm93MTIsIHJvdzEzLCByb3cxNCwgcm93MTUpOworICBUUkFOU1BPU0UxNng0X1VCX1VCKHJvdzAsIHJvdzEsIHJvdzIsIHJvdzMsIHJvdzQsIHJvdzUsIHJvdzYsIHJvdzcsCisgICAgICAgICAgICAgICAgICAgICAgcm93OCwgcm93OSwgcm93MTAsIHJvdzExLCByb3cxMiwgcm93MTMsIHJvdzE0LCByb3cxNSwKKyAgICAgICAgICAgICAgICAgICAgICBwMSwgcDAsIHEwLCBxMSk7CisgIExQRl9TSU1QTEVfTUFTSyhwMSwgcDAsIHEwLCBxMSwgYl9saW1pdCwgbWFzayk7CisgIExQRl9TSU1QTEVfRklMVChwMSwgcDAsIHEwLCBxMSwgbWFzayk7CisgIElMVlJMX0IyX1NIKHEwLCBwMCwgdG1wMSwgdG1wMCk7CisgIHB0ZW1wX3NyYyArPSAxOworICBTVDJ4NF9VQih0bXAxLCAwLCBwdGVtcF9zcmMsIHN0cmlkZSk7CisgIHB0ZW1wX3NyYyArPSA0ICogc3RyaWRlOworICBTVDJ4NF9VQih0bXAxLCA0LCBwdGVtcF9zcmMsIHN0cmlkZSk7CisgIHB0ZW1wX3NyYyArPSA0ICogc3RyaWRlOworICBTVDJ4NF9VQih0bXAwLCAwLCBwdGVtcF9zcmMsIHN0cmlkZSk7CisgIHB0ZW1wX3NyYyArPSA0ICogc3RyaWRlOworICBTVDJ4NF9VQih0bXAwLCA0LCBwdGVtcF9zcmMsIHN0cmlkZSk7CisgIHB0ZW1wX3NyYyArPSA0ICogc3RyaWRlOworfQorCitzdGF0aWMgdm9pZCBTaW1wbGVWRmlsdGVyMTZpKHVpbnQ4X3QqIHNyY195LCBpbnQgc3RyaWRlLCBpbnQgYl9saW1pdF9pbikgeworICBTaW1wbGVWRmlsdGVyMTYoc3JjX3kgKyAgNCAqIHN0cmlkZSwgc3RyaWRlLCBiX2xpbWl0X2luKTsKKyAgU2ltcGxlVkZpbHRlcjE2KHNyY195ICsgIDggKiBzdHJpZGUsIHN0cmlkZSwgYl9saW1pdF9pbik7CisgIFNpbXBsZVZGaWx0ZXIxNihzcmNfeSArIDEyICogc3RyaWRlLCBzdHJpZGUsIGJfbGltaXRfaW4pOworfQorCitzdGF0aWMgdm9pZCBTaW1wbGVIRmlsdGVyMTZpKHVpbnQ4X3QqIHNyY195LCBpbnQgc3RyaWRlLCBpbnQgYl9saW1pdF9pbikgeworICBTaW1wbGVIRmlsdGVyMTYoc3JjX3kgKyAgNCwgc3RyaWRlLCBiX2xpbWl0X2luKTsKKyAgU2ltcGxlSEZpbHRlcjE2KHNyY195ICsgIDgsIHN0cmlkZSwgYl9saW1pdF9pbik7CisgIFNpbXBsZUhGaWx0ZXIxNihzcmNfeSArIDEyLCBzdHJpZGUsIGJfbGltaXRfaW4pOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW50cmEgcHJlZGljdGlvbnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIDR4NAorCitzdGF0aWMgdm9pZCBEQzQodWludDhfdCogZHN0KSB7ICAgLy8gREMKKyAgdWludDMyX3QgZGMgPSA0OworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgZGMgKz0gZHN0W2kgLSBCUFNdICsgZHN0Wy0xICsgaSAqIEJQU107CisgIGRjID4+PSAzOworICBkYyA9IGRjIHwgKGRjIDw8IDgpIHwgKGRjIDw8IDE2KSB8IChkYyA8PCAyNCk7CisgIFNXNChkYywgZGMsIGRjLCBkYywgZHN0LCBCUFMpOworfQorCitzdGF0aWMgdm9pZCBUTTQodWludDhfdCogZHN0KSB7CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHB0ZW1wID0gZHN0IC0gQlBTIC0gMTsKKyAgdjhpMTYgVCwgZCwgcjAsIHIxLCByMiwgcjM7CisgIGNvbnN0IHYxNmk4IHplcm8gPSB7IDAgfTsKKyAgY29uc3QgdjhpMTYgVEwgPSAodjhpMTYpX19tc2FfZmlsbF9oKHB0ZW1wWzAgKiBCUFNdKTsKKyAgY29uc3QgdjhpMTYgTDAgPSAodjhpMTYpX19tc2FfZmlsbF9oKHB0ZW1wWzEgKiBCUFNdKTsKKyAgY29uc3QgdjhpMTYgTDEgPSAodjhpMTYpX19tc2FfZmlsbF9oKHB0ZW1wWzIgKiBCUFNdKTsKKyAgY29uc3QgdjhpMTYgTDIgPSAodjhpMTYpX19tc2FfZmlsbF9oKHB0ZW1wWzMgKiBCUFNdKTsKKyAgY29uc3QgdjhpMTYgTDMgPSAodjhpMTYpX19tc2FfZmlsbF9oKHB0ZW1wWzQgKiBCUFNdKTsKKyAgY29uc3QgdjE2dTggVDEgPSBMRF9VQihwdGVtcCArIDEpOworCisgIFQgID0gKHY4aTE2KV9fbXNhX2lsdnJfYih6ZXJvLCAodjE2aTgpVDEpOworICBkID0gVCAtIFRMOworICBBREQ0KGQsIEwwLCBkLCBMMSwgZCwgTDIsIGQsIEwzLCByMCwgcjEsIHIyLCByMyk7CisgIENMSVBfU0g0XzBfMjU1KHIwLCByMSwgcjIsIHIzKTsKKyAgUENLRVZfU1Q0eDRfVUIocjAsIHIxLCByMiwgcjMsIGRzdCwgQlBTKTsKK30KKworc3RhdGljIHZvaWQgVkU0KHVpbnQ4X3QqIGRzdCkgeyAgICAvLyB2ZXJ0aWNhbAorICBjb25zdCB1aW50OF90KiBjb25zdCBwdG9wID0gZHN0IC0gQlBTIC0gMTsKKyAgY29uc3QgdWludDMyX3QgdmFsMCA9IExXKHB0b3AgKyAwKTsKKyAgY29uc3QgdWludDMyX3QgdmFsMSA9IExXKHB0b3AgKyA0KTsKKyAgdWludDMyX3Qgb3V0OworICB2MTZ1OCBBID0geyAwIH0sIEIsIEMsIEFDLCBCMiwgUjsKKworICBJTlNFUlRfVzJfVUIodmFsMCwgdmFsMSwgQSk7CisgIEIgPSBTTERJX1VCKEEsIEEsIDEpOworICBDID0gU0xESV9VQihBLCBBLCAyKTsKKyAgQUMgPSBfX21zYV9hdmVfdV9iKEEsIEMpOworICBCMiA9IF9fbXNhX2F2ZV91X2IoQiwgQik7CisgIFIgPSBfX21zYV9hdmVyX3VfYihBQywgQjIpOworICBvdXQgPSBfX21zYV9jb3B5X3NfdygodjRpMzIpUiwgMCk7CisgIFNXNChvdXQsIG91dCwgb3V0LCBvdXQsIGRzdCwgQlBTKTsKK30KKworc3RhdGljIHZvaWQgUkQ0KHVpbnQ4X3QqIGRzdCkgeyAgIC8vIERvd24tcmlnaHQKKyAgY29uc3QgdWludDhfdCogY29uc3QgcHRvcCA9IGRzdCAtIDEgLSBCUFM7CisgIHVpbnQzMl90IHZhbDAgPSBMVyhwdG9wICsgMCk7CisgIHVpbnQzMl90IHZhbDEgPSBMVyhwdG9wICsgNCk7CisgIHVpbnQzMl90IHZhbDIsIHZhbDM7CisgIHYxNnU4IEEsIEIsIEMsIEFDLCBCMiwgUiwgQTEgPSB7IDAgfTsKKworICBJTlNFUlRfVzJfVUIodmFsMCwgdmFsMSwgQTEpOworICBBID0gU0xESV9VQihBMSwgQTEsIDEyKTsKKyAgQSA9ICh2MTZ1OClfX21zYV9pbnNlcnRfYigodjE2aTgpQSwgMywgcHRvcFsxICogQlBTXSk7CisgIEEgPSAodjE2dTgpX19tc2FfaW5zZXJ0X2IoKHYxNmk4KUEsIDIsIHB0b3BbMiAqIEJQU10pOworICBBID0gKHYxNnU4KV9fbXNhX2luc2VydF9iKCh2MTZpOClBLCAxLCBwdG9wWzMgKiBCUFNdKTsKKyAgQSA9ICh2MTZ1OClfX21zYV9pbnNlcnRfYigodjE2aTgpQSwgMCwgcHRvcFs0ICogQlBTXSk7CisgIEIgPSBTTERJX1VCKEEsIEEsIDEpOworICBDID0gU0xESV9VQihBLCBBLCAyKTsKKyAgQUMgPSBfX21zYV9hdmVfdV9iKEEsIEMpOworICBCMiA9IF9fbXNhX2F2ZV91X2IoQiwgQik7CisgIFIgPSBfX21zYV9hdmVyX3VfYihBQywgQjIpOworICB2YWwzID0gX19tc2FfY29weV9zX3coKHY0aTMyKVIsIDApOworICBSID0gU0xESV9VQihSLCBSLCAxKTsKKyAgdmFsMiA9IF9fbXNhX2NvcHlfc193KCh2NGkzMilSLCAwKTsKKyAgUiA9IFNMRElfVUIoUiwgUiwgMSk7CisgIHZhbDEgPSBfX21zYV9jb3B5X3NfdygodjRpMzIpUiwgMCk7CisgIFIgPSBTTERJX1VCKFIsIFIsIDEpOworICB2YWwwID0gX19tc2FfY29weV9zX3coKHY0aTMyKVIsIDApOworICBTVzQodmFsMCwgdmFsMSwgdmFsMiwgdmFsMywgZHN0LCBCUFMpOworfQorCitzdGF0aWMgdm9pZCBMRDQodWludDhfdCogZHN0KSB7ICAgLy8gRG93bi1MZWZ0CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHB0b3AgPSBkc3QgLSBCUFM7CisgIHVpbnQzMl90IHZhbDAgPSBMVyhwdG9wICsgMCk7CisgIHVpbnQzMl90IHZhbDEgPSBMVyhwdG9wICsgNCk7CisgIHVpbnQzMl90IHZhbDIsIHZhbDM7CisgIHYxNnU4IEEgPSB7IDAgfSwgQiwgQywgQUMsIEIyLCBSOworCisgIElOU0VSVF9XMl9VQih2YWwwLCB2YWwxLCBBKTsKKyAgQiA9IFNMRElfVUIoQSwgQSwgMSk7CisgIEMgPSBTTERJX1VCKEEsIEEsIDIpOworICBDID0gKHYxNnU4KV9fbXNhX2luc2VydF9iKCh2MTZpOClDLCA2LCBwdG9wWzddKTsKKyAgQUMgPSBfX21zYV9hdmVfdV9iKEEsIEMpOworICBCMiA9IF9fbXNhX2F2ZV91X2IoQiwgQik7CisgIFIgPSBfX21zYV9hdmVyX3VfYihBQywgQjIpOworICB2YWwwID0gX19tc2FfY29weV9zX3coKHY0aTMyKVIsIDApOworICBSID0gU0xESV9VQihSLCBSLCAxKTsKKyAgdmFsMSA9IF9fbXNhX2NvcHlfc193KCh2NGkzMilSLCAwKTsKKyAgUiA9IFNMRElfVUIoUiwgUiwgMSk7CisgIHZhbDIgPSBfX21zYV9jb3B5X3NfdygodjRpMzIpUiwgMCk7CisgIFIgPSBTTERJX1VCKFIsIFIsIDEpOworICB2YWwzID0gX19tc2FfY29weV9zX3coKHY0aTMyKVIsIDApOworICBTVzQodmFsMCwgdmFsMSwgdmFsMiwgdmFsMywgZHN0LCBCUFMpOworfQorCisvLyAxNngxNgorCitzdGF0aWMgdm9pZCBEQzE2KHVpbnQ4X3QqIGRzdCkgeyAgIC8vIERDCisgIHVpbnQzMl90IGRjID0gMTY7CisgIGludCBpOworICBjb25zdCB2MTZ1OCBydG9wID0gTERfVUIoZHN0IC0gQlBTKTsKKyAgY29uc3Qgdjh1MTYgZGN0b3AgPSBfX21zYV9oYWRkX3VfaChydG9wLCBydG9wKTsKKyAgdjE2dTggb3V0OworCisgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSB7CisgICAgZGMgKz0gZHN0Wy0xICsgaSAqIEJQU107CisgIH0KKyAgZGMgKz0gSEFERF9VSF9VMzIoZGN0b3ApOworICBvdXQgPSAodjE2dTgpX19tc2FfZmlsbF9iKGRjID4+IDUpOworICBTVF9VQjgob3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIGRzdCwgQlBTKTsKKyAgU1RfVUI4KG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBkc3QgKyA4ICogQlBTLCBCUFMpOworfQorCitzdGF0aWMgdm9pZCBUTTE2KHVpbnQ4X3QqIGRzdCkgeworICBpbnQgajsKKyAgdjhpMTYgZDEsIGQyOworICBjb25zdCB2MTZpOCB6ZXJvID0geyAwIH07CisgIGNvbnN0IHY4aTE2IFRMID0gKHY4aTE2KV9fbXNhX2ZpbGxfaChkc3RbLTEgLSBCUFNdKTsKKyAgY29uc3QgdjE2aTggVCA9IExEX1NCKGRzdCAtIEJQUyk7CisKKyAgSUxWUkxfQjJfU0goemVybywgVCwgZDEsIGQyKTsKKyAgU1VCMihkMSwgVEwsIGQyLCBUTCwgZDEsIGQyKTsKKyAgZm9yIChqID0gMDsgaiA8IDE2OyBqICs9IDQpIHsKKyAgICB2MTZpOCB0MCwgdDEsIHQyLCB0MzsKKyAgICB2OGkxNiByMCwgcjEsIHIyLCByMywgcjQsIHI1LCByNiwgcjc7CisgICAgY29uc3QgdjhpMTYgTDAgPSAodjhpMTYpX19tc2FfZmlsbF9oKGRzdFstMSArIDAgKiBCUFNdKTsKKyAgICBjb25zdCB2OGkxNiBMMSA9ICh2OGkxNilfX21zYV9maWxsX2goZHN0Wy0xICsgMSAqIEJQU10pOworICAgIGNvbnN0IHY4aTE2IEwyID0gKHY4aTE2KV9fbXNhX2ZpbGxfaChkc3RbLTEgKyAyICogQlBTXSk7CisgICAgY29uc3QgdjhpMTYgTDMgPSAodjhpMTYpX19tc2FfZmlsbF9oKGRzdFstMSArIDMgKiBCUFNdKTsKKyAgICBBREQ0KGQxLCBMMCwgZDEsIEwxLCBkMSwgTDIsIGQxLCBMMywgcjAsIHIxLCByMiwgcjMpOworICAgIEFERDQoZDIsIEwwLCBkMiwgTDEsIGQyLCBMMiwgZDIsIEwzLCByNCwgcjUsIHI2LCByNyk7CisgICAgQ0xJUF9TSDRfMF8yNTUocjAsIHIxLCByMiwgcjMpOworICAgIENMSVBfU0g0XzBfMjU1KHI0LCByNSwgcjYsIHI3KTsKKyAgICBQQ0tFVl9CNF9TQihyNCwgcjAsIHI1LCByMSwgcjYsIHIyLCByNywgcjMsIHQwLCB0MSwgdDIsIHQzKTsKKyAgICBTVF9TQjQodDAsIHQxLCB0MiwgdDMsIGRzdCwgQlBTKTsKKyAgICBkc3QgKz0gNCAqIEJQUzsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBWRTE2KHVpbnQ4X3QqIGRzdCkgeyAgIC8vIHZlcnRpY2FsCisgIGNvbnN0IHYxNnU4IHJ0b3AgPSBMRF9VQihkc3QgLSBCUFMpOworICBTVF9VQjgocnRvcCwgcnRvcCwgcnRvcCwgcnRvcCwgcnRvcCwgcnRvcCwgcnRvcCwgcnRvcCwgZHN0LCBCUFMpOworICBTVF9VQjgocnRvcCwgcnRvcCwgcnRvcCwgcnRvcCwgcnRvcCwgcnRvcCwgcnRvcCwgcnRvcCwgZHN0ICsgOCAqIEJQUywgQlBTKTsKK30KKworc3RhdGljIHZvaWQgSEUxNih1aW50OF90KiBkc3QpIHsgICAvLyBob3Jpem9udGFsCisgIGludCBqOworICBmb3IgKGogPSAxNjsgaiA+IDA7IGogLT0gNCkgeworICAgIGNvbnN0IHYxNnU4IEwwID0gKHYxNnU4KV9fbXNhX2ZpbGxfYihkc3RbLTEgKyAwICogQlBTXSk7CisgICAgY29uc3QgdjE2dTggTDEgPSAodjE2dTgpX19tc2FfZmlsbF9iKGRzdFstMSArIDEgKiBCUFNdKTsKKyAgICBjb25zdCB2MTZ1OCBMMiA9ICh2MTZ1OClfX21zYV9maWxsX2IoZHN0Wy0xICsgMiAqIEJQU10pOworICAgIGNvbnN0IHYxNnU4IEwzID0gKHYxNnU4KV9fbXNhX2ZpbGxfYihkc3RbLTEgKyAzICogQlBTXSk7CisgICAgU1RfVUI0KEwwLCBMMSwgTDIsIEwzLCBkc3QsIEJQUyk7CisgICAgZHN0ICs9IDQgKiBCUFM7CisgIH0KK30KKworc3RhdGljIHZvaWQgREMxNk5vVG9wKHVpbnQ4X3QqIGRzdCkgeyAgIC8vIERDIHdpdGggdG9wIHNhbXBsZXMgbm90IGF2YWlsYWJsZQorICBpbnQgajsKKyAgdWludDMyX3QgZGMgPSA4OworICB2MTZ1OCBvdXQ7CisKKyAgZm9yIChqID0gMDsgaiA8IDE2OyArK2opIHsKKyAgICBkYyArPSBkc3RbLTEgKyBqICogQlBTXTsKKyAgfQorICBvdXQgPSAodjE2dTgpX19tc2FfZmlsbF9iKGRjID4+IDQpOworICBTVF9VQjgob3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIGRzdCwgQlBTKTsKKyAgU1RfVUI4KG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBkc3QgKyA4ICogQlBTLCBCUFMpOworfQorCitzdGF0aWMgdm9pZCBEQzE2Tm9MZWZ0KHVpbnQ4X3QqIGRzdCkgeyAgIC8vIERDIHdpdGggbGVmdCBzYW1wbGVzIG5vdCBhdmFpbGFibGUKKyAgdWludDMyX3QgZGMgPSA4OworICBjb25zdCB2MTZ1OCBydG9wID0gTERfVUIoZHN0IC0gQlBTKTsKKyAgY29uc3Qgdjh1MTYgZGN0b3AgPSBfX21zYV9oYWRkX3VfaChydG9wLCBydG9wKTsKKyAgdjE2dTggb3V0OworCisgIGRjICs9IEhBRERfVUhfVTMyKGRjdG9wKTsKKyAgb3V0ID0gKHYxNnU4KV9fbXNhX2ZpbGxfYihkYyA+PiA0KTsKKyAgU1RfVUI4KG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBkc3QsIEJQUyk7CisgIFNUX1VCOChvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgZHN0ICsgOCAqIEJQUywgQlBTKTsKK30KKworc3RhdGljIHZvaWQgREMxNk5vVG9wTGVmdCh1aW50OF90KiBkc3QpIHsgICAvLyBEQyB3aXRoIG5vdGhpbmcKKyAgY29uc3QgdjE2dTggb3V0ID0gKHYxNnU4KV9fbXNhX2ZpbGxfYigweDgwKTsKKyAgU1RfVUI4KG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBkc3QsIEJQUyk7CisgIFNUX1VCOChvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgZHN0ICsgOCAqIEJQUywgQlBTKTsKK30KKworLy8gQ2hyb21hCisKKyNkZWZpbmUgU1RPUkU4eDgob3V0LCBkc3QpIGRvIHsgICAgICAgICAgICAgICAgIFwKKyAgU0Q0KG91dCwgb3V0LCBvdXQsIG91dCwgZHN0ICsgMCAqIEJQUywgQlBTKTsgIFwKKyAgU0Q0KG91dCwgb3V0LCBvdXQsIG91dCwgZHN0ICsgNCAqIEJQUywgQlBTKTsgIFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIERDOHV2KHVpbnQ4X3QqIGRzdCkgeyAgIC8vIERDCisgIHVpbnQzMl90IGRjID0gODsKKyAgaW50IGk7CisgIHVpbnQ2NF90IG91dDsKKyAgY29uc3QgdjE2dTggcnRvcCA9IExEX1VCKGRzdCAtIEJQUyk7CisgIGNvbnN0IHY4dTE2IHRlbXAwID0gX19tc2FfaGFkZF91X2gocnRvcCwgcnRvcCk7CisgIGNvbnN0IHY0dTMyIHRlbXAxID0gX19tc2FfaGFkZF91X3codGVtcDAsIHRlbXAwKTsKKyAgY29uc3QgdjJ1NjQgdGVtcDIgPSBfX21zYV9oYWRkX3VfZCh0ZW1wMSwgdGVtcDEpOworICB2MTZ1OCBkY3RlbXA7CisKKyAgZm9yIChpID0gMDsgaSA8IDg7ICsraSkgeworICAgIGRjICs9IGRzdFstMSArIGkgKiBCUFNdOworICB9CisgIGRjICs9IF9fbXNhX2NvcHlfc193KCh2NGkzMil0ZW1wMiwgMCk7CisgIGRjdGVtcCA9ICh2MTZ1OClfX21zYV9maWxsX2IoZGMgPj4gNCk7CisgIG91dCA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NClkY3RlbXAsIDApOworICBTVE9SRTh4OChvdXQsIGRzdCk7Cit9CisKK3N0YXRpYyB2b2lkIFRNOHV2KHVpbnQ4X3QqIGRzdCkgeworICBpbnQgajsKKyAgY29uc3QgdjE2aTggVDEgPSBMRF9TQihkc3QgLSBCUFMpOworICBjb25zdCB2MTZpOCB6ZXJvID0geyAwIH07CisgIGNvbnN0IHY4aTE2IFQgID0gKHY4aTE2KV9fbXNhX2lsdnJfYih6ZXJvLCBUMSk7CisgIGNvbnN0IHY4aTE2IFRMID0gKHY4aTE2KV9fbXNhX2ZpbGxfaChkc3RbLTEgLSBCUFNdKTsKKyAgY29uc3QgdjhpMTYgZCA9IFQgLSBUTDsKKworICBmb3IgKGogPSAwOyBqIDwgODsgaiArPSA0KSB7CisgICAgdjE2aTggdDAsIHQxOworICAgIHY4aTE2IHIwID0gKHY4aTE2KV9fbXNhX2ZpbGxfaChkc3RbLTEgKyAwICogQlBTXSk7CisgICAgdjhpMTYgcjEgPSAodjhpMTYpX19tc2FfZmlsbF9oKGRzdFstMSArIDEgKiBCUFNdKTsKKyAgICB2OGkxNiByMiA9ICh2OGkxNilfX21zYV9maWxsX2goZHN0Wy0xICsgMiAqIEJQU10pOworICAgIHY4aTE2IHIzID0gKHY4aTE2KV9fbXNhX2ZpbGxfaChkc3RbLTEgKyAzICogQlBTXSk7CisgICAgQURENChkLCByMCwgZCwgcjEsIGQsIHIyLCBkLCByMywgcjAsIHIxLCByMiwgcjMpOworICAgIENMSVBfU0g0XzBfMjU1KHIwLCByMSwgcjIsIHIzKTsKKyAgICBQQ0tFVl9CMl9TQihyMSwgcjAsIHIzLCByMiwgdDAsIHQxKTsKKyAgICBTVDR4NF9VQih0MCwgdDEsIDAsIDIsIDAsIDIsIGRzdCwgQlBTKTsKKyAgICBTVDR4NF9VQih0MCwgdDEsIDEsIDMsIDEsIDMsIGRzdCArIDQsIEJQUyk7CisgICAgZHN0ICs9IDQgKiBCUFM7CisgIH0KK30KKworc3RhdGljIHZvaWQgVkU4dXYodWludDhfdCogZHN0KSB7ICAgLy8gdmVydGljYWwKKyAgY29uc3QgdjE2dTggcnRvcCA9IExEX1VCKGRzdCAtIEJQUyk7CisgIGNvbnN0IHVpbnQ2NF90IG91dCA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NClydG9wLCAwKTsKKyAgU1RPUkU4eDgob3V0LCBkc3QpOworfQorCitzdGF0aWMgdm9pZCBIRTh1dih1aW50OF90KiBkc3QpIHsgICAvLyBob3Jpem9udGFsCisgIGludCBqOworICBmb3IgKGogPSAwOyBqIDwgODsgaiArPSA0KSB7CisgICAgY29uc3QgdjE2dTggTDAgPSAodjE2dTgpX19tc2FfZmlsbF9iKGRzdFstMSArIDAgKiBCUFNdKTsKKyAgICBjb25zdCB2MTZ1OCBMMSA9ICh2MTZ1OClfX21zYV9maWxsX2IoZHN0Wy0xICsgMSAqIEJQU10pOworICAgIGNvbnN0IHYxNnU4IEwyID0gKHYxNnU4KV9fbXNhX2ZpbGxfYihkc3RbLTEgKyAyICogQlBTXSk7CisgICAgY29uc3QgdjE2dTggTDMgPSAodjE2dTgpX19tc2FfZmlsbF9iKGRzdFstMSArIDMgKiBCUFNdKTsKKyAgICBjb25zdCB1aW50NjRfdCBvdXQwID0gX19tc2FfY29weV9zX2QoKHYyaTY0KUwwLCAwKTsKKyAgICBjb25zdCB1aW50NjRfdCBvdXQxID0gX19tc2FfY29weV9zX2QoKHYyaTY0KUwxLCAwKTsKKyAgICBjb25zdCB1aW50NjRfdCBvdXQyID0gX19tc2FfY29weV9zX2QoKHYyaTY0KUwyLCAwKTsKKyAgICBjb25zdCB1aW50NjRfdCBvdXQzID0gX19tc2FfY29weV9zX2QoKHYyaTY0KUwzLCAwKTsKKyAgICBTRDQob3V0MCwgb3V0MSwgb3V0Miwgb3V0MywgZHN0LCBCUFMpOworICAgIGRzdCArPSA0ICogQlBTOworICB9Cit9CisKK3N0YXRpYyB2b2lkIERDOHV2Tm9MZWZ0KHVpbnQ4X3QqIGRzdCkgeyAgIC8vIERDIHdpdGggbm8gbGVmdCBzYW1wbGVzCisgIGNvbnN0IHVpbnQzMl90IGRjID0gNDsKKyAgY29uc3QgdjE2dTggcnRvcCA9IExEX1VCKGRzdCAtIEJQUyk7CisgIGNvbnN0IHY4dTE2IHRlbXAwID0gX19tc2FfaGFkZF91X2gocnRvcCwgcnRvcCk7CisgIGNvbnN0IHY0dTMyIHRlbXAxID0gX19tc2FfaGFkZF91X3codGVtcDAsIHRlbXAwKTsKKyAgY29uc3QgdjJ1NjQgdGVtcDIgPSBfX21zYV9oYWRkX3VfZCh0ZW1wMSwgdGVtcDEpOworICBjb25zdCB1aW50MzJfdCBzdW1fbSA9IF9fbXNhX2NvcHlfc193KCh2NGkzMil0ZW1wMiwgMCk7CisgIGNvbnN0IHYxNnU4IGRjdmFsID0gKHYxNnU4KV9fbXNhX2ZpbGxfYigoZGMgKyBzdW1fbSkgPj4gMyk7CisgIGNvbnN0IHVpbnQ2NF90IG91dCA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NClkY3ZhbCwgMCk7CisgIFNUT1JFOHg4KG91dCwgZHN0KTsKK30KKworc3RhdGljIHZvaWQgREM4dXZOb1RvcCh1aW50OF90KiBkc3QpIHsgICAvLyBEQyB3aXRoIG5vIHRvcCBzYW1wbGVzCisgIHVpbnQzMl90IGRjID0gNDsKKyAgaW50IGk7CisgIHVpbnQ2NF90IG91dDsKKyAgdjE2dTggZGN0ZW1wOworCisgIGZvciAoaSA9IDA7IGkgPCA4OyArK2kpIHsKKyAgICBkYyArPSBkc3RbLTEgKyBpICogQlBTXTsKKyAgfQorICBkY3RlbXAgPSAodjE2dTgpX19tc2FfZmlsbF9iKGRjID4+IDMpOworICBvdXQgPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpZGN0ZW1wLCAwKTsKKyAgU1RPUkU4eDgob3V0LCBkc3QpOworfQorCitzdGF0aWMgdm9pZCBEQzh1dk5vVG9wTGVmdCh1aW50OF90KiBkc3QpIHsgICAvLyBEQyB3aXRoIG5vdGhpbmcKKyAgY29uc3QgdWludDY0X3Qgb3V0ID0gMHg4MDgwODA4MDgwODA4MDgwVUxMOworICBTVE9SRTh4OChvdXQsIGRzdCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBWUDhEc3BJbml0TVNBKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgVlA4RHNwSW5pdE1TQSh2b2lkKSB7CisgIFZQOFRyYW5zZm9ybVdIVCA9IFRyYW5zZm9ybVdIVDsKKyAgVlA4VHJhbnNmb3JtID0gVHJhbnNmb3JtVHdvOworICBWUDhUcmFuc2Zvcm1EQyA9IFRyYW5zZm9ybURDOworICBWUDhUcmFuc2Zvcm1BQzMgPSBUcmFuc2Zvcm1BQzM7CisKKyAgVlA4VkZpbHRlcjE2ICA9IFZGaWx0ZXIxNjsKKyAgVlA4SEZpbHRlcjE2ICA9IEhGaWx0ZXIxNjsKKyAgVlA4VkZpbHRlcjE2aSA9IFZGaWx0ZXIxNmk7CisgIFZQOEhGaWx0ZXIxNmkgPSBIRmlsdGVyMTZpOworICBWUDhWRmlsdGVyOCAgPSBWRmlsdGVyODsKKyAgVlA4SEZpbHRlcjggID0gSEZpbHRlcjg7CisgIFZQOFZGaWx0ZXI4aSA9IFZGaWx0ZXI4aTsKKyAgVlA4SEZpbHRlcjhpID0gSEZpbHRlcjhpOworICBWUDhTaW1wbGVWRmlsdGVyMTYgID0gU2ltcGxlVkZpbHRlcjE2OworICBWUDhTaW1wbGVIRmlsdGVyMTYgID0gU2ltcGxlSEZpbHRlcjE2OworICBWUDhTaW1wbGVWRmlsdGVyMTZpID0gU2ltcGxlVkZpbHRlcjE2aTsKKyAgVlA4U2ltcGxlSEZpbHRlcjE2aSA9IFNpbXBsZUhGaWx0ZXIxNmk7CisKKyAgVlA4UHJlZEx1bWE0WzBdID0gREM0OworICBWUDhQcmVkTHVtYTRbMV0gPSBUTTQ7CisgIFZQOFByZWRMdW1hNFsyXSA9IFZFNDsKKyAgVlA4UHJlZEx1bWE0WzRdID0gUkQ0OworICBWUDhQcmVkTHVtYTRbNl0gPSBMRDQ7CisgIFZQOFByZWRMdW1hMTZbMF0gPSBEQzE2OworICBWUDhQcmVkTHVtYTE2WzFdID0gVE0xNjsKKyAgVlA4UHJlZEx1bWExNlsyXSA9IFZFMTY7CisgIFZQOFByZWRMdW1hMTZbM10gPSBIRTE2OworICBWUDhQcmVkTHVtYTE2WzRdID0gREMxNk5vVG9wOworICBWUDhQcmVkTHVtYTE2WzVdID0gREMxNk5vTGVmdDsKKyAgVlA4UHJlZEx1bWExNls2XSA9IERDMTZOb1RvcExlZnQ7CisgIFZQOFByZWRDaHJvbWE4WzBdID0gREM4dXY7CisgIFZQOFByZWRDaHJvbWE4WzFdID0gVE04dXY7CisgIFZQOFByZWRDaHJvbWE4WzJdID0gVkU4dXY7CisgIFZQOFByZWRDaHJvbWE4WzNdID0gSEU4dXY7CisgIFZQOFByZWRDaHJvbWE4WzRdID0gREM4dXZOb1RvcDsKKyAgVlA4UHJlZENocm9tYThbNV0gPSBEQzh1dk5vTGVmdDsKKyAgVlA4UHJlZENocm9tYThbNl0gPSBEQzh1dk5vVG9wTGVmdDsKK30KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9NU0EKKworV0VCUF9EU1BfSU5JVF9TVFVCKFZQOERzcEluaXRNU0EpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfTVNBCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2RlY19uZW9uLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2RlY19uZW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZhNjk3ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZGVjX25lb24uYwpAQCAtMCwwICsxLDE2NTIgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBBUk0gTkVPTiB2ZXJzaW9uIG9mIGRzcCBmdW5jdGlvbnMgYW5kIGxvb3AgZmlsdGVyaW5nLgorLy8KKy8vIEF1dGhvcnM6IFNvbW5hdGggQmFuZXJqZWUgKHNvbW5hdGhAZ29vZ2xlLmNvbSkKKy8vICAgICAgICAgIEpvaGFubiBLb2VuaWcgKGpvaGFubmtvZW5pZ0Bnb29nbGUuY29tKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTkVPTikKKworI2luY2x1ZGUgInNyYy9kc3AvbmVvbi5oIgorI2luY2x1ZGUgInNyYy9kZWMvdnA4aV9kZWMuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE54TSBMb2FkaW5nIGZ1bmN0aW9ucworCisjaWYgIWRlZmluZWQoV09SS19BUk9VTkRfR0NDKQorCisvLyBUaGlzIGludHJpbnNpY3MgdmVyc2lvbiBtYWtlcyBnY2MtNC42LjMgY3Jhc2ggZHVyaW5nIExvYWQ0eD8/KCkgY29tcGlsYXRpb24KKy8vIChyZWdpc3RlciBhbGxvYywgcHJvYmFibHkpLiBUaGUgdmFyaWFudHMgc29tZXdoYXQgbWl0aWdhdGUgdGhlIHByb2JsZW0sIGJ1dAorLy8gbm90IHF1aXRlLiBIRmlsdGVyMTZpKCkgcmVtYWlucyBwcm9ibGVtYXRpYy4KK3N0YXRpYyBXRUJQX0lOTElORSB1aW50OHg4eDRfdCBMb2FkNHg4X05FT04oY29uc3QgdWludDhfdCogY29uc3Qgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlKSB7CisgIGNvbnN0IHVpbnQ4eDhfdCB6ZXJvID0gdmR1cF9uX3U4KDApOworICB1aW50OHg4eDRfdCBvdXQ7CisgIElOSVRfVkVDVE9SNChvdXQsIHplcm8sIHplcm8sIHplcm8sIHplcm8pOworICBvdXQgPSB2bGQ0X2xhbmVfdTgoc3JjICsgMCAqIHN0cmlkZSwgb3V0LCAwKTsKKyAgb3V0ID0gdmxkNF9sYW5lX3U4KHNyYyArIDEgKiBzdHJpZGUsIG91dCwgMSk7CisgIG91dCA9IHZsZDRfbGFuZV91OChzcmMgKyAyICogc3RyaWRlLCBvdXQsIDIpOworICBvdXQgPSB2bGQ0X2xhbmVfdTgoc3JjICsgMyAqIHN0cmlkZSwgb3V0LCAzKTsKKyAgb3V0ID0gdmxkNF9sYW5lX3U4KHNyYyArIDQgKiBzdHJpZGUsIG91dCwgNCk7CisgIG91dCA9IHZsZDRfbGFuZV91OChzcmMgKyA1ICogc3RyaWRlLCBvdXQsIDUpOworICBvdXQgPSB2bGQ0X2xhbmVfdTgoc3JjICsgNiAqIHN0cmlkZSwgb3V0LCA2KTsKKyAgb3V0ID0gdmxkNF9sYW5lX3U4KHNyYyArIDcgKiBzdHJpZGUsIG91dCwgNyk7CisgIHJldHVybiBvdXQ7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIExvYWQ0eDE2X05FT04oY29uc3QgdWludDhfdCogY29uc3Qgc3JjLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OHgxNl90KiBjb25zdCBwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDh4MTZfdCogY29uc3QgcDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4eDE2X3QqIGNvbnN0IHEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OHgxNl90KiBjb25zdCBxMSkgeworICAvLyByb3cwID0gcDFbMC4uN118cDBbMC4uN118cTBbMC4uN118cTFbMC4uN10KKyAgLy8gcm93OCA9IHAxWzguLjE1XXxwMFs4Li4xNV18cTBbOC4uMTVdfHExWzguLjE1XQorICBjb25zdCB1aW50OHg4eDRfdCByb3cwID0gTG9hZDR4OF9ORU9OKHNyYyAtIDIgKyAwICogc3RyaWRlLCBzdHJpZGUpOworICBjb25zdCB1aW50OHg4eDRfdCByb3c4ID0gTG9hZDR4OF9ORU9OKHNyYyAtIDIgKyA4ICogc3RyaWRlLCBzdHJpZGUpOworICAqcDEgPSB2Y29tYmluZV91OChyb3cwLnZhbFswXSwgcm93OC52YWxbMF0pOworICAqcDAgPSB2Y29tYmluZV91OChyb3cwLnZhbFsxXSwgcm93OC52YWxbMV0pOworICAqcTAgPSB2Y29tYmluZV91OChyb3cwLnZhbFsyXSwgcm93OC52YWxbMl0pOworICAqcTEgPSB2Y29tYmluZV91OChyb3cwLnZhbFszXSwgcm93OC52YWxbM10pOworfQorCisjZWxzZSAgLy8gV09SS19BUk9VTkRfR0NDCisKKyNkZWZpbmUgTE9BRFFfTEFORV8zMmIoVkFMVUUsIExBTkUpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFZBTFVFKSA9IHZsZDFxX2xhbmVfdTMyKChjb25zdCB1aW50MzJfdCopc3JjLCAoVkFMVUUpLCAoTEFORSkpOyAgIFwKKyAgc3JjICs9IHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIExvYWQ0eDE2X05FT04oY29uc3QgdWludDhfdCogc3JjLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OHgxNl90KiBjb25zdCBwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDh4MTZfdCogY29uc3QgcDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4eDE2X3QqIGNvbnN0IHEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OHgxNl90KiBjb25zdCBxMSkgeworICBjb25zdCB1aW50MzJ4NF90IHplcm8gPSB2ZHVwcV9uX3UzMigwKTsKKyAgdWludDMyeDR4NF90IGluOworICBJTklUX1ZFQ1RPUjQoaW4sIHplcm8sIHplcm8sIHplcm8sIHplcm8pOworICBzcmMgLT0gMjsKKyAgTE9BRFFfTEFORV8zMmIoaW4udmFsWzBdLCAwKTsKKyAgTE9BRFFfTEFORV8zMmIoaW4udmFsWzFdLCAwKTsKKyAgTE9BRFFfTEFORV8zMmIoaW4udmFsWzJdLCAwKTsKKyAgTE9BRFFfTEFORV8zMmIoaW4udmFsWzNdLCAwKTsKKyAgTE9BRFFfTEFORV8zMmIoaW4udmFsWzBdLCAxKTsKKyAgTE9BRFFfTEFORV8zMmIoaW4udmFsWzFdLCAxKTsKKyAgTE9BRFFfTEFORV8zMmIoaW4udmFsWzJdLCAxKTsKKyAgTE9BRFFfTEFORV8zMmIoaW4udmFsWzNdLCAxKTsKKyAgTE9BRFFfTEFORV8zMmIoaW4udmFsWzBdLCAyKTsKKyAgTE9BRFFfTEFORV8zMmIoaW4udmFsWzFdLCAyKTsKKyAgTE9BRFFfTEFORV8zMmIoaW4udmFsWzJdLCAyKTsKKyAgTE9BRFFfTEFORV8zMmIoaW4udmFsWzNdLCAyKTsKKyAgTE9BRFFfTEFORV8zMmIoaW4udmFsWzBdLCAzKTsKKyAgTE9BRFFfTEFORV8zMmIoaW4udmFsWzFdLCAzKTsKKyAgTE9BRFFfTEFORV8zMmIoaW4udmFsWzJdLCAzKTsKKyAgTE9BRFFfTEFORV8zMmIoaW4udmFsWzNdLCAzKTsKKyAgLy8gVHJhbnNwb3NlIGZvdXIgNHg0IHBhcnRzOgorICB7CisgICAgY29uc3QgdWludDh4MTZ4Ml90IHJvdzAxID0gdnRybnFfdTgodnJlaW50ZXJwcmV0cV91OF91MzIoaW4udmFsWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cmVpbnRlcnByZXRxX3U4X3UzMihpbi52YWxbMV0pKTsKKyAgICBjb25zdCB1aW50OHgxNngyX3Qgcm93MjMgPSB2dHJucV91OCh2cmVpbnRlcnByZXRxX3U4X3UzMihpbi52YWxbMl0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZyZWludGVycHJldHFfdThfdTMyKGluLnZhbFszXSkpOworICAgIGNvbnN0IHVpbnQxNng4eDJfdCByb3cwMiA9IHZ0cm5xX3UxNih2cmVpbnRlcnByZXRxX3UxNl91OChyb3cwMS52YWxbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cmVpbnRlcnByZXRxX3UxNl91OChyb3cyMy52YWxbMF0pKTsKKyAgICBjb25zdCB1aW50MTZ4OHgyX3Qgcm93MTMgPSB2dHJucV91MTYodnJlaW50ZXJwcmV0cV91MTZfdTgocm93MDEudmFsWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnJlaW50ZXJwcmV0cV91MTZfdTgocm93MjMudmFsWzFdKSk7CisgICAgKnAxID0gdnJlaW50ZXJwcmV0cV91OF91MTYocm93MDIudmFsWzBdKTsKKyAgICAqcDAgPSB2cmVpbnRlcnByZXRxX3U4X3UxNihyb3cxMy52YWxbMF0pOworICAgICpxMCA9IHZyZWludGVycHJldHFfdThfdTE2KHJvdzAyLnZhbFsxXSk7CisgICAgKnExID0gdnJlaW50ZXJwcmV0cV91OF91MTYocm93MTMudmFsWzFdKTsKKyAgfQorfQorI3VuZGVmIExPQURRX0xBTkVfMzJiCisKKyNlbmRpZiAgLy8gIVdPUktfQVJPVU5EX0dDQworCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBMb2FkOHgxNl9ORU9OKAorICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHNyYywgaW50IHN0cmlkZSwKKyAgICB1aW50OHgxNl90KiBjb25zdCBwMywgdWludDh4MTZfdCogY29uc3QgcDIsIHVpbnQ4eDE2X3QqIGNvbnN0IHAxLAorICAgIHVpbnQ4eDE2X3QqIGNvbnN0IHAwLCB1aW50OHgxNl90KiBjb25zdCBxMCwgdWludDh4MTZfdCogY29uc3QgcTEsCisgICAgdWludDh4MTZfdCogY29uc3QgcTIsIHVpbnQ4eDE2X3QqIGNvbnN0IHEzKSB7CisgIExvYWQ0eDE2X05FT04oc3JjIC0gMiwgc3RyaWRlLCBwMywgcDIsIHAxLCBwMCk7CisgIExvYWQ0eDE2X05FT04oc3JjICsgMiwgc3RyaWRlLCBxMCwgcTEsIHEyLCBxMyk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIExvYWQxNng0X05FT04oY29uc3QgdWludDhfdCogY29uc3Qgc3JjLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OHgxNl90KiBjb25zdCBwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDh4MTZfdCogY29uc3QgcDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4eDE2X3QqIGNvbnN0IHEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OHgxNl90KiBjb25zdCBxMSkgeworICAqcDEgPSB2bGQxcV91OChzcmMgLSAyICogc3RyaWRlKTsKKyAgKnAwID0gdmxkMXFfdTgoc3JjIC0gMSAqIHN0cmlkZSk7CisgICpxMCA9IHZsZDFxX3U4KHNyYyArIDAgKiBzdHJpZGUpOworICAqcTEgPSB2bGQxcV91OChzcmMgKyAxICogc3RyaWRlKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgTG9hZDE2eDhfTkVPTigKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCBzcmMsIGludCBzdHJpZGUsCisgICAgdWludDh4MTZfdCogY29uc3QgcDMsIHVpbnQ4eDE2X3QqIGNvbnN0IHAyLCB1aW50OHgxNl90KiBjb25zdCBwMSwKKyAgICB1aW50OHgxNl90KiBjb25zdCBwMCwgdWludDh4MTZfdCogY29uc3QgcTAsIHVpbnQ4eDE2X3QqIGNvbnN0IHExLAorICAgIHVpbnQ4eDE2X3QqIGNvbnN0IHEyLCB1aW50OHgxNl90KiBjb25zdCBxMykgeworICBMb2FkMTZ4NF9ORU9OKHNyYyAtIDIgICogc3RyaWRlLCBzdHJpZGUsIHAzLCBwMiwgcDEsIHAwKTsKKyAgTG9hZDE2eDRfTkVPTihzcmMgKyAyICAqIHN0cmlkZSwgc3RyaWRlLCBxMCwgcTEsIHEyLCBxMyk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIExvYWQ4eDh4Ml9ORU9OKAorICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHUsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHYsIGludCBzdHJpZGUsCisgICAgdWludDh4MTZfdCogY29uc3QgcDMsIHVpbnQ4eDE2X3QqIGNvbnN0IHAyLCB1aW50OHgxNl90KiBjb25zdCBwMSwKKyAgICB1aW50OHgxNl90KiBjb25zdCBwMCwgdWludDh4MTZfdCogY29uc3QgcTAsIHVpbnQ4eDE2X3QqIGNvbnN0IHExLAorICAgIHVpbnQ4eDE2X3QqIGNvbnN0IHEyLCB1aW50OHgxNl90KiBjb25zdCBxMykgeworICAvLyBXZSBwYWNrIHRoZSA4eDggdS1zYW1wbGVzIGluIHRoZSBsb3dlciBoYWxmIG9mIHRoZSB1aW50OHgxNl90IGRlc3RpbmF0aW9uCisgIC8vIGFuZCB0aGUgdi1zYW1wbGVzIG9uIHRoZSBoaWdoZXIgaGFsZi4KKyAgKnAzID0gdmNvbWJpbmVfdTgodmxkMV91OCh1IC0gNCAqIHN0cmlkZSksIHZsZDFfdTgodiAtIDQgKiBzdHJpZGUpKTsKKyAgKnAyID0gdmNvbWJpbmVfdTgodmxkMV91OCh1IC0gMyAqIHN0cmlkZSksIHZsZDFfdTgodiAtIDMgKiBzdHJpZGUpKTsKKyAgKnAxID0gdmNvbWJpbmVfdTgodmxkMV91OCh1IC0gMiAqIHN0cmlkZSksIHZsZDFfdTgodiAtIDIgKiBzdHJpZGUpKTsKKyAgKnAwID0gdmNvbWJpbmVfdTgodmxkMV91OCh1IC0gMSAqIHN0cmlkZSksIHZsZDFfdTgodiAtIDEgKiBzdHJpZGUpKTsKKyAgKnEwID0gdmNvbWJpbmVfdTgodmxkMV91OCh1ICsgMCAqIHN0cmlkZSksIHZsZDFfdTgodiArIDAgKiBzdHJpZGUpKTsKKyAgKnExID0gdmNvbWJpbmVfdTgodmxkMV91OCh1ICsgMSAqIHN0cmlkZSksIHZsZDFfdTgodiArIDEgKiBzdHJpZGUpKTsKKyAgKnEyID0gdmNvbWJpbmVfdTgodmxkMV91OCh1ICsgMiAqIHN0cmlkZSksIHZsZDFfdTgodiArIDIgKiBzdHJpZGUpKTsKKyAgKnEzID0gdmNvbWJpbmVfdTgodmxkMV91OCh1ICsgMyAqIHN0cmlkZSksIHZsZDFfdTgodiArIDMgKiBzdHJpZGUpKTsKK30KKworI2lmICFkZWZpbmVkKFdPUktfQVJPVU5EX0dDQykKKworI2RlZmluZSBMT0FEX1VWXzgoUk9XKSBcCisgIHZjb21iaW5lX3U4KHZsZDFfdTgodSAtIDQgKyAoUk9XKSAqIHN0cmlkZSksIHZsZDFfdTgodiAtIDQgKyAoUk9XKSAqIHN0cmlkZSkpCisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIExvYWQ4eDh4MlRfTkVPTigKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCB1LCBjb25zdCB1aW50OF90KiBjb25zdCB2LCBpbnQgc3RyaWRlLAorICAgIHVpbnQ4eDE2X3QqIGNvbnN0IHAzLCB1aW50OHgxNl90KiBjb25zdCBwMiwgdWludDh4MTZfdCogY29uc3QgcDEsCisgICAgdWludDh4MTZfdCogY29uc3QgcDAsIHVpbnQ4eDE2X3QqIGNvbnN0IHEwLCB1aW50OHgxNl90KiBjb25zdCBxMSwKKyAgICB1aW50OHgxNl90KiBjb25zdCBxMiwgdWludDh4MTZfdCogY29uc3QgcTMpIHsKKyAgLy8gV2UgcGFjayB0aGUgOHg4IHUtc2FtcGxlcyBpbiB0aGUgbG93ZXIgaGFsZiBvZiB0aGUgdWludDh4MTZfdCBkZXN0aW5hdGlvbgorICAvLyBhbmQgdGhlIHYtc2FtcGxlcyBvbiB0aGUgaGlnaGVyIGhhbGYuCisgIGNvbnN0IHVpbnQ4eDE2X3Qgcm93MCA9IExPQURfVVZfOCgwKTsKKyAgY29uc3QgdWludDh4MTZfdCByb3cxID0gTE9BRF9VVl84KDEpOworICBjb25zdCB1aW50OHgxNl90IHJvdzIgPSBMT0FEX1VWXzgoMik7CisgIGNvbnN0IHVpbnQ4eDE2X3Qgcm93MyA9IExPQURfVVZfOCgzKTsKKyAgY29uc3QgdWludDh4MTZfdCByb3c0ID0gTE9BRF9VVl84KDQpOworICBjb25zdCB1aW50OHgxNl90IHJvdzUgPSBMT0FEX1VWXzgoNSk7CisgIGNvbnN0IHVpbnQ4eDE2X3Qgcm93NiA9IExPQURfVVZfOCg2KTsKKyAgY29uc3QgdWludDh4MTZfdCByb3c3ID0gTE9BRF9VVl84KDcpOworICAvLyBQZXJmb3JtIHR3byBzaWRlLWJ5LXNpZGUgOHg4IHRyYW5zcG9zZXMKKyAgLy8gdTAwIHUwMSB1MDIgdTAzIHUwNCB1MDUgdTA2IHUwNyB8IHYwMCB2MDEgdjAyIHYwMyB2MDQgdjA1IHYwNiB2MDcKKyAgLy8gdTEwIHUxMSB1MTIgdTEzIHUxNCB1MTUgdTE2IHUxNyB8IHYxMCB2MTEgdjEyIC4uLgorICAvLyB1MjAgdTIxIHUyMiB1MjMgdTI0IHUyNSB1MjYgdTI3IHwgdjIwIHYyMSAuLi4KKyAgLy8gdTMwIHUzMSB1MzIgdTMzIHUzNCB1MzUgdTM2IHUzNyB8IC4uLgorICAvLyB1NDAgdTQxIHU0MiB1NDMgdTQ0IHU0NSB1NDYgdTQ3IHwgLi4uCisgIC8vIHU1MCB1NTEgdTUyIHU1MyB1NTQgdTU1IHU1NiB1NTcgfCAuLi4KKyAgLy8gdTYwIHU2MSB1NjIgdTYzIHU2NCB1NjUgdTY2IHU2NyB8IHY2MCAuLi4KKyAgLy8gdTcwIHU3MSB1NzIgdTczIHU3NCB1NzUgdTc2IHU3NyB8IHY3MCB2NzEgdjcyIC4uLgorICBjb25zdCB1aW50OHgxNngyX3Qgcm93MDEgPSB2dHJucV91OChyb3cwLCByb3cxKTsgIC8vIHUwMCB1MTAgdTAyIHUxMiAuLi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1MDEgdTExIHUwMyB1MTMgLi4uCisgIGNvbnN0IHVpbnQ4eDE2eDJfdCByb3cyMyA9IHZ0cm5xX3U4KHJvdzIsIHJvdzMpOyAgLy8gdTIwIHUzMCB1MjIgdTMyIC4uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHUyMSB1MzEgdTIzIHUzMyAuLi4KKyAgY29uc3QgdWludDh4MTZ4Ml90IHJvdzQ1ID0gdnRybnFfdTgocm93NCwgcm93NSk7ICAvLyAuLi4KKyAgY29uc3QgdWludDh4MTZ4Ml90IHJvdzY3ID0gdnRybnFfdTgocm93Niwgcm93Nyk7ICAvLyAuLi4KKyAgY29uc3QgdWludDE2eDh4Ml90IHJvdzAyID0gdnRybnFfdTE2KHZyZWludGVycHJldHFfdTE2X3U4KHJvdzAxLnZhbFswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cmVpbnRlcnByZXRxX3UxNl91OChyb3cyMy52YWxbMF0pKTsKKyAgY29uc3QgdWludDE2eDh4Ml90IHJvdzEzID0gdnRybnFfdTE2KHZyZWludGVycHJldHFfdTE2X3U4KHJvdzAxLnZhbFsxXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cmVpbnRlcnByZXRxX3UxNl91OChyb3cyMy52YWxbMV0pKTsKKyAgY29uc3QgdWludDE2eDh4Ml90IHJvdzQ2ID0gdnRybnFfdTE2KHZyZWludGVycHJldHFfdTE2X3U4KHJvdzQ1LnZhbFswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cmVpbnRlcnByZXRxX3UxNl91OChyb3c2Ny52YWxbMF0pKTsKKyAgY29uc3QgdWludDE2eDh4Ml90IHJvdzU3ID0gdnRybnFfdTE2KHZyZWludGVycHJldHFfdTE2X3U4KHJvdzQ1LnZhbFsxXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cmVpbnRlcnByZXRxX3UxNl91OChyb3c2Ny52YWxbMV0pKTsKKyAgY29uc3QgdWludDMyeDR4Ml90IHJvdzA0ID0gdnRybnFfdTMyKHZyZWludGVycHJldHFfdTMyX3UxNihyb3cwMi52YWxbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnJlaW50ZXJwcmV0cV91MzJfdTE2KHJvdzQ2LnZhbFswXSkpOworICBjb25zdCB1aW50MzJ4NHgyX3Qgcm93MjYgPSB2dHJucV91MzIodnJlaW50ZXJwcmV0cV91MzJfdTE2KHJvdzAyLnZhbFsxXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cmVpbnRlcnByZXRxX3UzMl91MTYocm93NDYudmFsWzFdKSk7CisgIGNvbnN0IHVpbnQzMng0eDJfdCByb3cxNSA9IHZ0cm5xX3UzMih2cmVpbnRlcnByZXRxX3UzMl91MTYocm93MTMudmFsWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZyZWludGVycHJldHFfdTMyX3UxNihyb3c1Ny52YWxbMF0pKTsKKyAgY29uc3QgdWludDMyeDR4Ml90IHJvdzM3ID0gdnRybnFfdTMyKHZyZWludGVycHJldHFfdTMyX3UxNihyb3cxMy52YWxbMV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnJlaW50ZXJwcmV0cV91MzJfdTE2KHJvdzU3LnZhbFsxXSkpOworICAqcDMgPSB2cmVpbnRlcnByZXRxX3U4X3UzMihyb3cwNC52YWxbMF0pOworICAqcDIgPSB2cmVpbnRlcnByZXRxX3U4X3UzMihyb3cxNS52YWxbMF0pOworICAqcDEgPSB2cmVpbnRlcnByZXRxX3U4X3UzMihyb3cyNi52YWxbMF0pOworICAqcDAgPSB2cmVpbnRlcnByZXRxX3U4X3UzMihyb3czNy52YWxbMF0pOworICAqcTAgPSB2cmVpbnRlcnByZXRxX3U4X3UzMihyb3cwNC52YWxbMV0pOworICAqcTEgPSB2cmVpbnRlcnByZXRxX3U4X3UzMihyb3cxNS52YWxbMV0pOworICAqcTIgPSB2cmVpbnRlcnByZXRxX3U4X3UzMihyb3cyNi52YWxbMV0pOworICAqcTMgPSB2cmVpbnRlcnByZXRxX3U4X3UzMihyb3czNy52YWxbMV0pOworfQorI3VuZGVmIExPQURfVVZfOAorCisjZW5kaWYgIC8vICFXT1JLX0FST1VORF9HQ0MKKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgU3RvcmUyeDhfTkVPTihjb25zdCB1aW50OHg4eDJfdCB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBkc3QsIGludCBzdHJpZGUpIHsKKyAgdnN0Ml9sYW5lX3U4KGRzdCArIDAgKiBzdHJpZGUsIHYsIDApOworICB2c3QyX2xhbmVfdTgoZHN0ICsgMSAqIHN0cmlkZSwgdiwgMSk7CisgIHZzdDJfbGFuZV91OChkc3QgKyAyICogc3RyaWRlLCB2LCAyKTsKKyAgdnN0Ml9sYW5lX3U4KGRzdCArIDMgKiBzdHJpZGUsIHYsIDMpOworICB2c3QyX2xhbmVfdTgoZHN0ICsgNCAqIHN0cmlkZSwgdiwgNCk7CisgIHZzdDJfbGFuZV91OChkc3QgKyA1ICogc3RyaWRlLCB2LCA1KTsKKyAgdnN0Ml9sYW5lX3U4KGRzdCArIDYgKiBzdHJpZGUsIHYsIDYpOworICB2c3QyX2xhbmVfdTgoZHN0ICsgNyAqIHN0cmlkZSwgdiwgNyk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFN0b3JlMngxNl9ORU9OKGNvbnN0IHVpbnQ4eDE2X3QgcDAsIGNvbnN0IHVpbnQ4eDE2X3QgcTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBkc3QsIGludCBzdHJpZGUpIHsKKyAgdWludDh4OHgyX3QgbG8sIGhpOworICBsby52YWxbMF0gPSB2Z2V0X2xvd191OChwMCk7CisgIGxvLnZhbFsxXSA9IHZnZXRfbG93X3U4KHEwKTsKKyAgaGkudmFsWzBdID0gdmdldF9oaWdoX3U4KHAwKTsKKyAgaGkudmFsWzFdID0gdmdldF9oaWdoX3U4KHEwKTsKKyAgU3RvcmUyeDhfTkVPTihsbywgZHN0IC0gMSArIDAgKiBzdHJpZGUsIHN0cmlkZSk7CisgIFN0b3JlMng4X05FT04oaGksIGRzdCAtIDEgKyA4ICogc3RyaWRlLCBzdHJpZGUpOworfQorCisjaWYgIWRlZmluZWQoV09SS19BUk9VTkRfR0NDKQorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgU3RvcmU0eDhfTkVPTihjb25zdCB1aW50OHg4eDRfdCB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBkc3QsIGludCBzdHJpZGUpIHsKKyAgdnN0NF9sYW5lX3U4KGRzdCArIDAgKiBzdHJpZGUsIHYsIDApOworICB2c3Q0X2xhbmVfdTgoZHN0ICsgMSAqIHN0cmlkZSwgdiwgMSk7CisgIHZzdDRfbGFuZV91OChkc3QgKyAyICogc3RyaWRlLCB2LCAyKTsKKyAgdnN0NF9sYW5lX3U4KGRzdCArIDMgKiBzdHJpZGUsIHYsIDMpOworICB2c3Q0X2xhbmVfdTgoZHN0ICsgNCAqIHN0cmlkZSwgdiwgNCk7CisgIHZzdDRfbGFuZV91OChkc3QgKyA1ICogc3RyaWRlLCB2LCA1KTsKKyAgdnN0NF9sYW5lX3U4KGRzdCArIDYgKiBzdHJpZGUsIHYsIDYpOworICB2c3Q0X2xhbmVfdTgoZHN0ICsgNyAqIHN0cmlkZSwgdiwgNyk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFN0b3JlNHgxNl9ORU9OKGNvbnN0IHVpbnQ4eDE2X3QgcDEsIGNvbnN0IHVpbnQ4eDE2X3QgcDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OHgxNl90IHEwLCBjb25zdCB1aW50OHgxNl90IHExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgZHN0LCBpbnQgc3RyaWRlKSB7CisgIHVpbnQ4eDh4NF90IGxvLCBoaTsKKyAgSU5JVF9WRUNUT1I0KGxvLAorICAgICAgICAgICAgICAgdmdldF9sb3dfdTgocDEpLCB2Z2V0X2xvd191OChwMCksCisgICAgICAgICAgICAgICB2Z2V0X2xvd191OChxMCksIHZnZXRfbG93X3U4KHExKSk7CisgIElOSVRfVkVDVE9SNChoaSwKKyAgICAgICAgICAgICAgIHZnZXRfaGlnaF91OChwMSksIHZnZXRfaGlnaF91OChwMCksCisgICAgICAgICAgICAgICB2Z2V0X2hpZ2hfdTgocTApLCB2Z2V0X2hpZ2hfdTgocTEpKTsKKyAgU3RvcmU0eDhfTkVPTihsbywgZHN0IC0gMiArIDAgKiBzdHJpZGUsIHN0cmlkZSk7CisgIFN0b3JlNHg4X05FT04oaGksIGRzdCAtIDIgKyA4ICogc3RyaWRlLCBzdHJpZGUpOworfQorI2VuZGlmICAvLyAhV09SS19BUk9VTkRfR0NDCisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFN0b3JlMTZ4Ml9ORU9OKGNvbnN0IHVpbnQ4eDE2X3QgcDAsIGNvbnN0IHVpbnQ4eDE2X3QgcTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBkc3QsIGludCBzdHJpZGUpIHsKKyAgdnN0MXFfdTgoZHN0IC0gc3RyaWRlLCBwMCk7CisgIHZzdDFxX3U4KGRzdCwgcTApOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBTdG9yZTE2eDRfTkVPTihjb25zdCB1aW50OHgxNl90IHAxLCBjb25zdCB1aW50OHgxNl90IHAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDh4MTZfdCBxMCwgY29uc3QgdWludDh4MTZfdCBxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IGRzdCwgaW50IHN0cmlkZSkgeworICBTdG9yZTE2eDJfTkVPTihwMSwgcDAsIGRzdCAtIHN0cmlkZSwgc3RyaWRlKTsKKyAgU3RvcmUxNngyX05FT04ocTAsIHExLCBkc3QgKyBzdHJpZGUsIHN0cmlkZSk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFN0b3JlOHgyeDJfTkVPTihjb25zdCB1aW50OHgxNl90IHAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4eDE2X3QgcTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgdSwgdWludDhfdCogY29uc3QgdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlKSB7CisgIC8vIHAwIGFuZCBxMCBjb250YWluIHRoZSB1K3Ygc2FtcGxlcyBwYWNrZWQgaW4gbG93L2hpZ2ggaGFsdmVzLgorICB2c3QxX3U4KHUgLSBzdHJpZGUsIHZnZXRfbG93X3U4KHAwKSk7CisgIHZzdDFfdTgodSwgICAgICAgICAgdmdldF9sb3dfdTgocTApKTsKKyAgdnN0MV91OCh2IC0gc3RyaWRlLCB2Z2V0X2hpZ2hfdTgocDApKTsKKyAgdnN0MV91OCh2LCAgICAgICAgICB2Z2V0X2hpZ2hfdTgocTApKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgU3RvcmU4eDR4Ml9ORU9OKGNvbnN0IHVpbnQ4eDE2X3QgcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDh4MTZfdCBwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OHgxNl90IHEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4eDE2X3QgcTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgdSwgdWludDhfdCogY29uc3QgdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlKSB7CisgIC8vIFRoZSBwMS4uLnExIHJlZ2lzdGVycyBjb250YWluIHRoZSB1K3Ygc2FtcGxlcyBwYWNrZWQgaW4gbG93L2hpZ2ggaGFsdmVzLgorICBTdG9yZTh4MngyX05FT04ocDEsIHAwLCB1IC0gc3RyaWRlLCB2IC0gc3RyaWRlLCBzdHJpZGUpOworICBTdG9yZTh4MngyX05FT04ocTAsIHExLCB1ICsgc3RyaWRlLCB2ICsgc3RyaWRlLCBzdHJpZGUpOworfQorCisjaWYgIWRlZmluZWQoV09SS19BUk9VTkRfR0NDKQorCisjZGVmaW5lIFNUT1JFNl9MQU5FKERTVCwgVkFMMCwgVkFMMSwgTEFORSkgZG8geyAgIFwKKyAgdnN0M19sYW5lX3U4KChEU1QpIC0gMywgKFZBTDApLCAoTEFORSkpOyAgICAgICAgXAorICB2c3QzX2xhbmVfdTgoKERTVCkgKyAwLCAoVkFMMSksIChMQU5FKSk7ICAgICAgICBcCisgIChEU1QpICs9IHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFN0b3JlNng4eDJfTkVPTigKKyAgICBjb25zdCB1aW50OHgxNl90IHAyLCBjb25zdCB1aW50OHgxNl90IHAxLCBjb25zdCB1aW50OHgxNl90IHAwLAorICAgIGNvbnN0IHVpbnQ4eDE2X3QgcTAsIGNvbnN0IHVpbnQ4eDE2X3QgcTEsIGNvbnN0IHVpbnQ4eDE2X3QgcTIsCisgICAgdWludDhfdCogdSwgdWludDhfdCogdiwgaW50IHN0cmlkZSkgeworICB1aW50OHg4eDNfdCB1MCwgdTEsIHYwLCB2MTsKKyAgSU5JVF9WRUNUT1IzKHUwLCB2Z2V0X2xvd191OChwMiksIHZnZXRfbG93X3U4KHAxKSwgdmdldF9sb3dfdTgocDApKTsKKyAgSU5JVF9WRUNUT1IzKHUxLCB2Z2V0X2xvd191OChxMCksIHZnZXRfbG93X3U4KHExKSwgdmdldF9sb3dfdTgocTIpKTsKKyAgSU5JVF9WRUNUT1IzKHYwLCB2Z2V0X2hpZ2hfdTgocDIpLCB2Z2V0X2hpZ2hfdTgocDEpLCB2Z2V0X2hpZ2hfdTgocDApKTsKKyAgSU5JVF9WRUNUT1IzKHYxLCB2Z2V0X2hpZ2hfdTgocTApLCB2Z2V0X2hpZ2hfdTgocTEpLCB2Z2V0X2hpZ2hfdTgocTIpKTsKKyAgU1RPUkU2X0xBTkUodSwgdTAsIHUxLCAwKTsKKyAgU1RPUkU2X0xBTkUodSwgdTAsIHUxLCAxKTsKKyAgU1RPUkU2X0xBTkUodSwgdTAsIHUxLCAyKTsKKyAgU1RPUkU2X0xBTkUodSwgdTAsIHUxLCAzKTsKKyAgU1RPUkU2X0xBTkUodSwgdTAsIHUxLCA0KTsKKyAgU1RPUkU2X0xBTkUodSwgdTAsIHUxLCA1KTsKKyAgU1RPUkU2X0xBTkUodSwgdTAsIHUxLCA2KTsKKyAgU1RPUkU2X0xBTkUodSwgdTAsIHUxLCA3KTsKKyAgU1RPUkU2X0xBTkUodiwgdjAsIHYxLCAwKTsKKyAgU1RPUkU2X0xBTkUodiwgdjAsIHYxLCAxKTsKKyAgU1RPUkU2X0xBTkUodiwgdjAsIHYxLCAyKTsKKyAgU1RPUkU2X0xBTkUodiwgdjAsIHYxLCAzKTsKKyAgU1RPUkU2X0xBTkUodiwgdjAsIHYxLCA0KTsKKyAgU1RPUkU2X0xBTkUodiwgdjAsIHYxLCA1KTsKKyAgU1RPUkU2X0xBTkUodiwgdjAsIHYxLCA2KTsKKyAgU1RPUkU2X0xBTkUodiwgdjAsIHYxLCA3KTsKK30KKyN1bmRlZiBTVE9SRTZfTEFORQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBTdG9yZTR4OHgyX05FT04oY29uc3QgdWludDh4MTZfdCBwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OHgxNl90IHAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4eDE2X3QgcTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDh4MTZfdCBxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCB1LCB1aW50OF90KiBjb25zdCB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUpIHsKKyAgdWludDh4OHg0X3QgdTAsIHYwOworICBJTklUX1ZFQ1RPUjQodTAsCisgICAgICAgICAgICAgICB2Z2V0X2xvd191OChwMSksIHZnZXRfbG93X3U4KHAwKSwKKyAgICAgICAgICAgICAgIHZnZXRfbG93X3U4KHEwKSwgdmdldF9sb3dfdTgocTEpKTsKKyAgSU5JVF9WRUNUT1I0KHYwLAorICAgICAgICAgICAgICAgdmdldF9oaWdoX3U4KHAxKSwgdmdldF9oaWdoX3U4KHAwKSwKKyAgICAgICAgICAgICAgIHZnZXRfaGlnaF91OChxMCksIHZnZXRfaGlnaF91OChxMSkpOworICB2c3Q0X2xhbmVfdTgodSAtIDIgKyAwICogc3RyaWRlLCB1MCwgMCk7CisgIHZzdDRfbGFuZV91OCh1IC0gMiArIDEgKiBzdHJpZGUsIHUwLCAxKTsKKyAgdnN0NF9sYW5lX3U4KHUgLSAyICsgMiAqIHN0cmlkZSwgdTAsIDIpOworICB2c3Q0X2xhbmVfdTgodSAtIDIgKyAzICogc3RyaWRlLCB1MCwgMyk7CisgIHZzdDRfbGFuZV91OCh1IC0gMiArIDQgKiBzdHJpZGUsIHUwLCA0KTsKKyAgdnN0NF9sYW5lX3U4KHUgLSAyICsgNSAqIHN0cmlkZSwgdTAsIDUpOworICB2c3Q0X2xhbmVfdTgodSAtIDIgKyA2ICogc3RyaWRlLCB1MCwgNik7CisgIHZzdDRfbGFuZV91OCh1IC0gMiArIDcgKiBzdHJpZGUsIHUwLCA3KTsKKyAgdnN0NF9sYW5lX3U4KHYgLSAyICsgMCAqIHN0cmlkZSwgdjAsIDApOworICB2c3Q0X2xhbmVfdTgodiAtIDIgKyAxICogc3RyaWRlLCB2MCwgMSk7CisgIHZzdDRfbGFuZV91OCh2IC0gMiArIDIgKiBzdHJpZGUsIHYwLCAyKTsKKyAgdnN0NF9sYW5lX3U4KHYgLSAyICsgMyAqIHN0cmlkZSwgdjAsIDMpOworICB2c3Q0X2xhbmVfdTgodiAtIDIgKyA0ICogc3RyaWRlLCB2MCwgNCk7CisgIHZzdDRfbGFuZV91OCh2IC0gMiArIDUgKiBzdHJpZGUsIHYwLCA1KTsKKyAgdnN0NF9sYW5lX3U4KHYgLSAyICsgNiAqIHN0cmlkZSwgdjAsIDYpOworICB2c3Q0X2xhbmVfdTgodiAtIDIgKyA3ICogc3RyaWRlLCB2MCwgNyk7Cit9CisKKyNlbmRpZiAgLy8gIVdPUktfQVJPVU5EX0dDQworCisvLyBaZXJvIGV4dGVuZCAndicgdG8gYW4gaW50MTZ4OF90Lgorc3RhdGljIFdFQlBfSU5MSU5FIGludDE2eDhfdCBDb252ZXJ0VThUb1MxNl9ORU9OKHVpbnQ4eDhfdCB2KSB7CisgIHJldHVybiB2cmVpbnRlcnByZXRxX3MxNl91MTYodm1vdmxfdTgodikpOworfQorCisvLyBQZXJmb3JtcyB1bnNpZ25lZCA4YiBzYXR1cmF0aW9uIG9uICdkc3QwMScgYW5kICdkc3QyMycgc3RvcmluZyB0aGUgcmVzdWx0CisvLyB0byB0aGUgY29ycmVzcG9uZGluZyByb3dzIG9mICdkc3QnLgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgU2F0dXJhdGVBbmRTdG9yZTR4NF9ORU9OKHVpbnQ4X3QqIGNvbnN0IGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNng4X3QgZHN0MDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZ4OF90IGRzdDIzKSB7CisgIC8vIFVuc2lnbmVkIHNhdHVyYXRlIHRvIDhiLgorICBjb25zdCB1aW50OHg4X3QgZHN0MDFfdTggPSB2cW1vdnVuX3MxNihkc3QwMSk7CisgIGNvbnN0IHVpbnQ4eDhfdCBkc3QyM191OCA9IHZxbW92dW5fczE2KGRzdDIzKTsKKworICAvLyBTdG9yZSB0aGUgcmVzdWx0cy4KKyAgdnN0MV9sYW5lX3UzMigodWludDMyX3QqKShkc3QgKyAwICogQlBTKSwgdnJlaW50ZXJwcmV0X3UzMl91OChkc3QwMV91OCksIDApOworICB2c3QxX2xhbmVfdTMyKCh1aW50MzJfdCopKGRzdCArIDEgKiBCUFMpLCB2cmVpbnRlcnByZXRfdTMyX3U4KGRzdDAxX3U4KSwgMSk7CisgIHZzdDFfbGFuZV91MzIoKHVpbnQzMl90KikoZHN0ICsgMiAqIEJQUyksIHZyZWludGVycHJldF91MzJfdTgoZHN0MjNfdTgpLCAwKTsKKyAgdnN0MV9sYW5lX3UzMigodWludDMyX3QqKShkc3QgKyAzICogQlBTKSwgdnJlaW50ZXJwcmV0X3UzMl91OChkc3QyM191OCksIDEpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBBZGQ0eDRfTkVPTihjb25zdCBpbnQxNng4X3Qgcm93MDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNng4X3Qgcm93MjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBkc3QpIHsKKyAgdWludDMyeDJfdCBkc3QwMSA9IHZkdXBfbl91MzIoMCk7CisgIHVpbnQzMngyX3QgZHN0MjMgPSB2ZHVwX25fdTMyKDApOworCisgIC8vIExvYWQgdGhlIHNvdXJjZSBwaXhlbHMuCisgIGRzdDAxID0gdmxkMV9sYW5lX3UzMigodWludDMyX3QqKShkc3QgKyAwICogQlBTKSwgZHN0MDEsIDApOworICBkc3QyMyA9IHZsZDFfbGFuZV91MzIoKHVpbnQzMl90KikoZHN0ICsgMiAqIEJQUyksIGRzdDIzLCAwKTsKKyAgZHN0MDEgPSB2bGQxX2xhbmVfdTMyKCh1aW50MzJfdCopKGRzdCArIDEgKiBCUFMpLCBkc3QwMSwgMSk7CisgIGRzdDIzID0gdmxkMV9sYW5lX3UzMigodWludDMyX3QqKShkc3QgKyAzICogQlBTKSwgZHN0MjMsIDEpOworCisgIHsKKyAgICAvLyBDb252ZXJ0IHRvIDE2Yi4KKyAgICBjb25zdCBpbnQxNng4X3QgZHN0MDFfczE2ID0gQ29udmVydFU4VG9TMTZfTkVPTih2cmVpbnRlcnByZXRfdThfdTMyKGRzdDAxKSk7CisgICAgY29uc3QgaW50MTZ4OF90IGRzdDIzX3MxNiA9IENvbnZlcnRVOFRvUzE2X05FT04odnJlaW50ZXJwcmV0X3U4X3UzMihkc3QyMykpOworCisgICAgLy8gRGVzY2FsZSB3aXRoIHJvdW5kaW5nLgorICAgIGNvbnN0IGludDE2eDhfdCBvdXQwMSA9IHZyc3JhcV9uX3MxNihkc3QwMV9zMTYsIHJvdzAxLCAzKTsKKyAgICBjb25zdCBpbnQxNng4X3Qgb3V0MjMgPSB2cnNyYXFfbl9zMTYoZHN0MjNfczE2LCByb3cyMywgMyk7CisgICAgLy8gQWRkIHRoZSBpbnZlcnNlIHRyYW5zZm9ybS4KKyAgICBTYXR1cmF0ZUFuZFN0b3JlNHg0X05FT04oZHN0LCBvdXQwMSwgb3V0MjMpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFNpbXBsZSBJbi1sb29wIGZpbHRlcmluZyAoUGFyYWdyYXBoIDE1LjIpCisKK3N0YXRpYyB1aW50OHgxNl90IE5lZWRzRmlsdGVyX05FT04oY29uc3QgdWludDh4MTZfdCBwMSwgY29uc3QgdWludDh4MTZfdCBwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDh4MTZfdCBxMCwgY29uc3QgdWludDh4MTZfdCBxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCkgeworICBjb25zdCB1aW50OHgxNl90IHRocmVzaF92ID0gdmR1cHFfbl91OCgodWludDhfdCl0aHJlc2gpOworICBjb25zdCB1aW50OHgxNl90IGFfcDBfcTAgPSB2YWJkcV91OChwMCwgcTApOyAgICAgICAgICAgICAgIC8vIGFicyhwMC1xMCkKKyAgY29uc3QgdWludDh4MTZfdCBhX3AxX3ExID0gdmFiZHFfdTgocDEsIHExKTsgICAgICAgICAgICAgICAvLyBhYnMocDEtcTEpCisgIGNvbnN0IHVpbnQ4eDE2X3QgYV9wMF9xMF8yID0gdnFhZGRxX3U4KGFfcDBfcTAsIGFfcDBfcTApOyAgLy8gMiAqIGFicyhwMC1xMCkKKyAgY29uc3QgdWludDh4MTZfdCBhX3AxX3ExXzIgPSB2c2hycV9uX3U4KGFfcDFfcTEsIDEpOyAgICAgICAvLyBhYnMocDEtcTEpIC8gMgorICBjb25zdCB1aW50OHgxNl90IHN1bSA9IHZxYWRkcV91OChhX3AwX3EwXzIsIGFfcDFfcTFfMik7CisgIGNvbnN0IHVpbnQ4eDE2X3QgbWFzayA9IHZjZ2VxX3U4KHRocmVzaF92LCBzdW0pOworICByZXR1cm4gbWFzazsKK30KKworc3RhdGljIGludDh4MTZfdCBGbGlwU2lnbl9ORU9OKGNvbnN0IHVpbnQ4eDE2X3QgdikgeworICBjb25zdCB1aW50OHgxNl90IHNpZ25fYml0ID0gdmR1cHFfbl91OCgweDgwKTsKKyAgcmV0dXJuIHZyZWludGVycHJldHFfczhfdTgodmVvcnFfdTgodiwgc2lnbl9iaXQpKTsKK30KKworc3RhdGljIHVpbnQ4eDE2X3QgRmxpcFNpZ25CYWNrX05FT04oY29uc3QgaW50OHgxNl90IHYpIHsKKyAgY29uc3QgaW50OHgxNl90IHNpZ25fYml0ID0gdmR1cHFfbl9zOCgweDgwKTsKKyAgcmV0dXJuIHZyZWludGVycHJldHFfdThfczgodmVvcnFfczgodiwgc2lnbl9iaXQpKTsKK30KKworc3RhdGljIGludDh4MTZfdCBHZXRCYXNlRGVsdGFfTkVPTihjb25zdCBpbnQ4eDE2X3QgcDEsIGNvbnN0IGludDh4MTZfdCBwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OHgxNl90IHEwLCBjb25zdCBpbnQ4eDE2X3QgcTEpIHsKKyAgY29uc3QgaW50OHgxNl90IHEwX3AwID0gdnFzdWJxX3M4KHEwLCBwMCk7ICAgICAgLy8gKHEwLXAwKQorICBjb25zdCBpbnQ4eDE2X3QgcDFfcTEgPSB2cXN1YnFfczgocDEsIHExKTsgICAgICAvLyAocDEtcTEpCisgIGNvbnN0IGludDh4MTZfdCBzMSA9IHZxYWRkcV9zOChwMV9xMSwgcTBfcDApOyAgIC8vIChwMS1xMSkgKyAxICogKHEwIC0gcDApCisgIGNvbnN0IGludDh4MTZfdCBzMiA9IHZxYWRkcV9zOChxMF9wMCwgczEpOyAgICAgIC8vIChwMS1xMSkgKyAyICogKHEwIC0gcDApCisgIGNvbnN0IGludDh4MTZfdCBzMyA9IHZxYWRkcV9zOChxMF9wMCwgczIpOyAgICAgIC8vIChwMS1xMSkgKyAzICogKHEwIC0gcDApCisgIHJldHVybiBzMzsKK30KKworc3RhdGljIGludDh4MTZfdCBHZXRCYXNlRGVsdGEwX05FT04oY29uc3QgaW50OHgxNl90IHAwLCBjb25zdCBpbnQ4eDE2X3QgcTApIHsKKyAgY29uc3QgaW50OHgxNl90IHEwX3AwID0gdnFzdWJxX3M4KHEwLCBwMCk7ICAgICAgLy8gKHEwLXAwKQorICBjb25zdCBpbnQ4eDE2X3QgczEgPSB2cWFkZHFfczgocTBfcDAsIHEwX3AwKTsgICAvLyAyICogKHEwIC0gcDApCisgIGNvbnN0IGludDh4MTZfdCBzMiA9IHZxYWRkcV9zOChxMF9wMCwgczEpOyAgICAgIC8vIDMgKiAocTAgLSBwMCkKKyAgcmV0dXJuIHMyOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBBcHBseUZpbHRlcjJOb0ZsaXBfTkVPTihjb25zdCBpbnQ4eDE2X3QgcDBzLCBjb25zdCBpbnQ4eDE2X3QgcTBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OHgxNl90IGRlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50OHgxNl90KiBjb25zdCBvcDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4eDE2X3QqIGNvbnN0IG9xMCkgeworICBjb25zdCBpbnQ4eDE2X3Qga0NzdDMgPSB2ZHVwcV9uX3M4KDB4MDMpOworICBjb25zdCBpbnQ4eDE2X3Qga0NzdDQgPSB2ZHVwcV9uX3M4KDB4MDQpOworICBjb25zdCBpbnQ4eDE2X3QgZGVsdGFfcDMgPSB2cWFkZHFfczgoZGVsdGEsIGtDc3QzKTsKKyAgY29uc3QgaW50OHgxNl90IGRlbHRhX3A0ID0gdnFhZGRxX3M4KGRlbHRhLCBrQ3N0NCk7CisgIGNvbnN0IGludDh4MTZfdCBkZWx0YTMgPSB2c2hycV9uX3M4KGRlbHRhX3AzLCAzKTsKKyAgY29uc3QgaW50OHgxNl90IGRlbHRhNCA9IHZzaHJxX25fczgoZGVsdGFfcDQsIDMpOworICAqb3AwID0gdnFhZGRxX3M4KHAwcywgZGVsdGEzKTsKKyAgKm9xMCA9IHZxc3VicV9zOChxMHMsIGRlbHRhNCk7Cit9CisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX0lOVFJJTlNJQ1MpCisKK3N0YXRpYyB2b2lkIEFwcGx5RmlsdGVyMl9ORU9OKGNvbnN0IGludDh4MTZfdCBwMHMsIGNvbnN0IGludDh4MTZfdCBxMHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4eDE2X3QgZGVsdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OHgxNl90KiBjb25zdCBvcDAsIHVpbnQ4eDE2X3QqIGNvbnN0IG9xMCkgeworICBjb25zdCBpbnQ4eDE2X3Qga0NzdDMgPSB2ZHVwcV9uX3M4KDB4MDMpOworICBjb25zdCBpbnQ4eDE2X3Qga0NzdDQgPSB2ZHVwcV9uX3M4KDB4MDQpOworICBjb25zdCBpbnQ4eDE2X3QgZGVsdGFfcDMgPSB2cWFkZHFfczgoZGVsdGEsIGtDc3QzKTsKKyAgY29uc3QgaW50OHgxNl90IGRlbHRhX3A0ID0gdnFhZGRxX3M4KGRlbHRhLCBrQ3N0NCk7CisgIGNvbnN0IGludDh4MTZfdCBkZWx0YTMgPSB2c2hycV9uX3M4KGRlbHRhX3AzLCAzKTsKKyAgY29uc3QgaW50OHgxNl90IGRlbHRhNCA9IHZzaHJxX25fczgoZGVsdGFfcDQsIDMpOworICBjb25zdCBpbnQ4eDE2X3Qgc3AwID0gdnFhZGRxX3M4KHAwcywgZGVsdGEzKTsKKyAgY29uc3QgaW50OHgxNl90IHNxMCA9IHZxc3VicV9zOChxMHMsIGRlbHRhNCk7CisgICpvcDAgPSBGbGlwU2lnbkJhY2tfTkVPTihzcDApOworICAqb3EwID0gRmxpcFNpZ25CYWNrX05FT04oc3EwKTsKK30KKworc3RhdGljIHZvaWQgRG9GaWx0ZXIyX05FT04oY29uc3QgdWludDh4MTZfdCBwMSwgY29uc3QgdWludDh4MTZfdCBwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4eDE2X3QgcTAsIGNvbnN0IHVpbnQ4eDE2X3QgcTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OHgxNl90IG1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OHgxNl90KiBjb25zdCBvcDAsIHVpbnQ4eDE2X3QqIGNvbnN0IG9xMCkgeworICBjb25zdCBpbnQ4eDE2X3QgcDFzID0gRmxpcFNpZ25fTkVPTihwMSk7CisgIGNvbnN0IGludDh4MTZfdCBwMHMgPSBGbGlwU2lnbl9ORU9OKHAwKTsKKyAgY29uc3QgaW50OHgxNl90IHEwcyA9IEZsaXBTaWduX05FT04ocTApOworICBjb25zdCBpbnQ4eDE2X3QgcTFzID0gRmxpcFNpZ25fTkVPTihxMSk7CisgIGNvbnN0IGludDh4MTZfdCBkZWx0YTAgPSBHZXRCYXNlRGVsdGFfTkVPTihwMXMsIHAwcywgcTBzLCBxMXMpOworICBjb25zdCBpbnQ4eDE2X3QgZGVsdGExID0gdmFuZHFfczgoZGVsdGEwLCB2cmVpbnRlcnByZXRxX3M4X3U4KG1hc2spKTsKKyAgQXBwbHlGaWx0ZXIyX05FT04ocDBzLCBxMHMsIGRlbHRhMSwgb3AwLCBvcTApOworfQorCitzdGF0aWMgdm9pZCBTaW1wbGVWRmlsdGVyMTZfTkVPTih1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKSB7CisgIHVpbnQ4eDE2X3QgcDEsIHAwLCBxMCwgcTEsIG9wMCwgb3EwOworICBMb2FkMTZ4NF9ORU9OKHAsIHN0cmlkZSwgJnAxLCAmcDAsICZxMCwgJnExKTsKKyAgeworICAgIGNvbnN0IHVpbnQ4eDE2X3QgbWFzayA9IE5lZWRzRmlsdGVyX05FT04ocDEsIHAwLCBxMCwgcTEsIHRocmVzaCk7CisgICAgRG9GaWx0ZXIyX05FT04ocDEsIHAwLCBxMCwgcTEsIG1hc2ssICZvcDAsICZvcTApOworICB9CisgIFN0b3JlMTZ4Ml9ORU9OKG9wMCwgb3EwLCBwLCBzdHJpZGUpOworfQorCitzdGF0aWMgdm9pZCBTaW1wbGVIRmlsdGVyMTZfTkVPTih1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKSB7CisgIHVpbnQ4eDE2X3QgcDEsIHAwLCBxMCwgcTEsIG9xMCwgb3AwOworICBMb2FkNHgxNl9ORU9OKHAsIHN0cmlkZSwgJnAxLCAmcDAsICZxMCwgJnExKTsKKyAgeworICAgIGNvbnN0IHVpbnQ4eDE2X3QgbWFzayA9IE5lZWRzRmlsdGVyX05FT04ocDEsIHAwLCBxMCwgcTEsIHRocmVzaCk7CisgICAgRG9GaWx0ZXIyX05FT04ocDEsIHAwLCBxMCwgcTEsIG1hc2ssICZvcDAsICZvcTApOworICB9CisgIFN0b3JlMngxNl9ORU9OKG9wMCwgb3EwLCBwLCBzdHJpZGUpOworfQorCisjZWxzZQorCisvLyBMb2FkL1N0b3JlIHZlcnRpY2FsIGVkZ2UKKyNkZWZpbmUgTE9BRDh4NChjMSwgYzIsIGMzLCBjNCwgYjEsIGIyLCBzdHJpZGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ2bGQ0LjggeyIgI2MxICJbMF0sIiAjYzIgIlswXSwiICNjMyAiWzBdLCIgI2M0ICJbMF19LCIgI2IxICIsIiAjc3RyaWRlICJcbiIgXAorICAidmxkNC44IHsiICNjMSAiWzFdLCIgI2MyICJbMV0sIiAjYzMgIlsxXSwiICNjNCAiWzFdfSwiICNiMiAiLCIgI3N0cmlkZSAiXG4iIFwKKyAgInZsZDQuOCB7IiAjYzEgIlsyXSwiICNjMiAiWzJdLCIgI2MzICJbMl0sIiAjYzQgIlsyXX0sIiAjYjEgIiwiICNzdHJpZGUgIlxuIiBcCisgICJ2bGQ0LjggeyIgI2MxICJbM10sIiAjYzIgIlszXSwiICNjMyAiWzNdLCIgI2M0ICJbM119LCIgI2IyICIsIiAjc3RyaWRlICJcbiIgXAorICAidmxkNC44IHsiICNjMSAiWzRdLCIgI2MyICJbNF0sIiAjYzMgIls0XSwiICNjNCAiWzRdfSwiICNiMSAiLCIgI3N0cmlkZSAiXG4iIFwKKyAgInZsZDQuOCB7IiAjYzEgIls1XSwiICNjMiAiWzVdLCIgI2MzICJbNV0sIiAjYzQgIls1XX0sIiAjYjIgIiwiICNzdHJpZGUgIlxuIiBcCisgICJ2bGQ0LjggeyIgI2MxICJbNl0sIiAjYzIgIls2XSwiICNjMyAiWzZdLCIgI2M0ICJbNl19LCIgI2IxICIsIiAjc3RyaWRlICJcbiIgXAorICAidmxkNC44IHsiICNjMSAiWzddLCIgI2MyICJbN10sIiAjYzMgIls3XSwiICNjNCAiWzddfSwiICNiMiAiLCIgI3N0cmlkZSAiXG4iCisKKyNkZWZpbmUgU1RPUkU4eDIoYzEsIGMyLCBwLCBzdHJpZGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ2c3QyLjggICB7IiAjYzEgIlswXSwgIiAjYzIgIlswXX0sIiAjcCAiLCIgI3N0cmlkZSAiIFxuIiAgICAgICAgICAgICAgICAgICAgXAorICAidnN0Mi44ICAgeyIgI2MxICJbMV0sICIgI2MyICJbMV19LCIgI3AgIiwiICNzdHJpZGUgIiBcbiIgICAgICAgICAgICAgICAgICAgIFwKKyAgInZzdDIuOCAgIHsiICNjMSAiWzJdLCAiICNjMiAiWzJdfSwiICNwICIsIiAjc3RyaWRlICIgXG4iICAgICAgICAgICAgICAgICAgICBcCisgICJ2c3QyLjggICB7IiAjYzEgIlszXSwgIiAjYzIgIlszXX0sIiAjcCAiLCIgI3N0cmlkZSAiIFxuIiAgICAgICAgICAgICAgICAgICAgXAorICAidnN0Mi44ICAgeyIgI2MxICJbNF0sICIgI2MyICJbNF19LCIgI3AgIiwiICNzdHJpZGUgIiBcbiIgICAgICAgICAgICAgICAgICAgIFwKKyAgInZzdDIuOCAgIHsiICNjMSAiWzVdLCAiICNjMiAiWzVdfSwiICNwICIsIiAjc3RyaWRlICIgXG4iICAgICAgICAgICAgICAgICAgICBcCisgICJ2c3QyLjggICB7IiAjYzEgIls2XSwgIiAjYzIgIls2XX0sIiAjcCAiLCIgI3N0cmlkZSAiIFxuIiAgICAgICAgICAgICAgICAgICAgXAorICAidnN0Mi44ICAgeyIgI2MxICJbN10sICIgI2MyICJbN119LCIgI3AgIiwiICNzdHJpZGUgIiBcbiIKKworI2RlZmluZSBRUmVncyAicTAiLCAicTEiLCAicTIiLCAicTMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgInE4IiwgInE5IiwgInExMCIsICJxMTEiLCAicTEyIiwgInExMyIsICJxMTQiLCAicTE1IgorCisjZGVmaW5lIEZMSVBfU0lHTl9CSVQyKGEsIGIsIHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidmVvciAgICAgIiAjYSAiLCIgI2EgIiwiICNzICIgICAgICAgICAgICAgICBcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgInZlb3IgICAgICIgI2IgIiwiICNiICIsIiAjcyAiICAgICAgICAgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisKKyNkZWZpbmUgRkxJUF9TSUdOX0JJVDQoYSwgYiwgYywgZCwgcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZMSVBfU0lHTl9CSVQyKGEsIGIsIHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGTElQX1NJR05fQklUMihjLCBkLCBzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworI2RlZmluZSBORUVEU19GSUxURVIocDEsIHAwLCBxMCwgcTEsIHRocmVzaCwgbWFzaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgInZhYmQudTggICAgcTE1LCIgI3AwICIsIiAjcTAgIiAgICAgICAgIFxuIiAgLyogYWJzKHAwIC0gcTApICovICAgICAgICAgICAgICBcCisgICJ2YWJkLnU4ICAgIHExNCwiICNwMSAiLCIgI3ExICIgICAgICAgICBcbiIgIC8qIGFicyhwMSAtIHExKSAqLyAgICAgICAgICAgICAgXAorICAidnFhZGQudTggICBxMTUsIHExNSwgcTE1ICAgICAgICAgICAgICAgXG4iICAvKiBhYnMocDAgLSBxMCkgKiAyICovICAgICAgICAgIFwKKyAgInZzaHIudTggICAgcTE0LCBxMTQsICMxICAgICAgICAgICAgICAgIFxuIiAgLyogYWJzKHAxIC0gcTEpIC8gMiAqLyAgICAgICAgICBcCisgICJ2cWFkZC51OCAgIHExNSwgcTE1LCBxMTQgICAgIFxuIiAgLyogYWJzKHAwIC0gcTApICogMiArIGFicyhwMSAtIHExKSAvIDIgKi8gXAorICAidmR1cC44ICAgICBxMTQsICIgI3RocmVzaCAiICAgICAgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgInZjZ2UudTggICAiICNtYXNrICIsIHExNCwgcTE1ICAgICAgICAgIFxuIiAgLyogbWFzayA8PSB0aHJlc2ggKi8KKworI2RlZmluZSBHRVRfQkFTRV9ERUxUQShwMSwgcDAsIHEwLCBxMSwgbykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgInZxc3ViLnM4ICAgcTE1LCIgI3EwICIsIiAjcDAgIiAgICAgICAgIFxuIiAgLyogKHEwIC0gcDApICovICAgICAgICAgICAgICAgICBcCisgICJ2cXN1Yi5zOCAgIiAjbyAiLCIgI3AxICIsIiAjcTEgIiAgICAgICBcbiIgIC8qIChwMSAtIHExKSAqLyAgICAgICAgICAgICAgICAgXAorICAidnFhZGQuczggICIgI28gIiwiICNvICIsIHExNSAgICAgICAgICAgXG4iICAvKiAocDEgLSBxMSkgKyAxICogKHAwIC0gcTApICovIFwKKyAgInZxYWRkLnM4ICAiICNvICIsIiAjbyAiLCBxMTUgICAgICAgICAgIFxuIiAgLyogKHAxIC0gcTEpICsgMiAqIChwMCAtIHEwKSAqLyBcCisgICJ2cWFkZC5zOCAgIiAjbyAiLCIgI28gIiwgcTE1ICAgICAgICAgICBcbiIgIC8qIChwMSAtIHExKSArIDMgKiAocDAgLSBxMCkgKi8KKworI2RlZmluZSBET19TSU1QTEVfRklMVEVSKHAwLCBxMCwgZmwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgInZtb3YuaTggICAgcTE1LCAjMHgwMyAgICAgICAgICAgICAgICAgIFxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ2cWFkZC5zOCAgIHExNSwgcTE1LCAiICNmbCAiICAgICAgICAgICBcbiIgIC8qIGZpbHRlcjEgPSBmaWx0ZXIgKyAzICovICAgICAgXAorICAidnNoci5zOCAgICBxMTUsIHExNSwgIzMgICAgICAgICAgICAgICAgXG4iICAvKiBmaWx0ZXIxID4+IDMgKi8gICAgICAgICAgICAgIFwKKyAgInZxYWRkLnM4ICAiICNwMCAiLCIgI3AwICIsIHExNSAgICAgICAgIFxuIiAgLyogcDAgKz0gZmlsdGVyMSAqLyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidm1vdi5pOCAgICBxMTUsICMweDA0ICAgICAgICAgICAgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgInZxYWRkLnM4ICAgcTE1LCBxMTUsICIgI2ZsICIgICAgICAgICAgIFxuIiAgLyogZmlsdGVyMSA9IGZpbHRlciArIDQgKi8gICAgICBcCisgICJ2c2hyLnM4ICAgIHExNSwgcTE1LCAjMyAgICAgICAgICAgICAgICBcbiIgIC8qIGZpbHRlcjIgPj4gMyAqLyAgICAgICAgICAgICAgXAorICAidnFzdWIuczggICIgI3EwICIsIiAjcTAgIiwgcTE1ICAgICAgICAgXG4iICAvKiBxMCAtPSBmaWx0ZXIyICovCisKKy8vIEFwcGxpZXMgZmlsdGVyIG9uIDIgcGl4ZWxzIChwMCBhbmQgcTApCisjZGVmaW5lIERPX0ZJTFRFUjIocDEsIHAwLCBxMCwgcTEsIHRocmVzaCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBORUVEU19GSUxURVIocDEsIHAwLCBxMCwgcTEsIHRocmVzaCwgcTkpICAgICAvKiBmaWx0ZXIgbWFzayBpbiBxOSAqLyAgICAgICAgIFwKKyAgInZtb3YuaTggICAgcTEwLCAjMHg4MCAgICAgICAgICAgICAgICAgIFxuIiAgLyogc2lnbiBiaXQgKi8gICAgICAgICAgICAgICAgICBcCisgIEZMSVBfU0lHTl9CSVQ0KHAxLCBwMCwgcTAsIHExLCBxMTApICAgICAgICAgIC8qIGNvbnZlcnQgdG8gc2lnbmVkIHZhbHVlICovICAgXAorICBHRVRfQkFTRV9ERUxUQShwMSwgcDAsIHEwLCBxMSwgcTExKSAgICAgICAgICAvKiBnZXQgZmlsdGVyIGxldmVsICAqLyAgICAgICAgIFwKKyAgInZhbmQgICAgICAgcTksIHE5LCBxMTEgICAgICAgICAgICAgICAgIFxuIiAgLyogYXBwbHkgZmlsdGVyIG1hc2sgKi8gICAgICAgICBcCisgIERPX1NJTVBMRV9GSUxURVIocDAsIHEwLCBxOSkgICAgICAgICAgICAgICAgIC8qIGFwcGx5IGZpbHRlciAqLyAgICAgICAgICAgICAgXAorICBGTElQX1NJR05fQklUMihwMCwgcTAsIHExMCkKKworc3RhdGljIHZvaWQgU2ltcGxlVkZpbHRlcjE2X05FT04odWludDhfdCogcCwgaW50IHN0cmlkZSwgaW50IHRocmVzaCkgeworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAic3ViICAgICAgICAlW3BdLCAlW3BdLCAlW3N0cmlkZV0sIGxzbCAjMSAgXG4iICAvLyBwIC09IDIgKiBzdHJpZGUKKworICAgICJ2bGQxLnU4ICAgIHtxMX0sIFslW3BdXSwgJVtzdHJpZGVdICAgICAgICBcbiIgIC8vIHAxCisgICAgInZsZDEudTggICAge3EyfSwgWyVbcF1dLCAlW3N0cmlkZV0gICAgICAgIFxuIiAgLy8gcDAKKyAgICAidmxkMS51OCAgICB7cTN9LCBbJVtwXV0sICVbc3RyaWRlXSAgICAgICAgXG4iICAvLyBxMAorICAgICJ2bGQxLnU4ICAgIHtxMTJ9LCBbJVtwXV0gICAgICAgICAgICAgICAgICBcbiIgIC8vIHExCisKKyAgICBET19GSUxURVIyKHExLCBxMiwgcTMsIHExMiwgJVt0aHJlc2hdKQorCisgICAgInN1YiAgICAgICAgJVtwXSwgJVtwXSwgJVtzdHJpZGVdLCBsc2wgIzEgIFxuIiAgLy8gcCAtPSAyICogc3RyaWRlCisKKyAgICAidnN0MS51OCAgICB7cTJ9LCBbJVtwXV0sICVbc3RyaWRlXSAgICAgICAgXG4iICAvLyBzdG9yZSBvcDAKKyAgICAidnN0MS51OCAgICB7cTN9LCBbJVtwXV0gICAgICAgICAgICAgICAgICAgXG4iICAvLyBzdG9yZSBvcTAKKyAgICA6IFtwXSAiK3IiKHApCisgICAgOiBbc3RyaWRlXSAiciIoc3RyaWRlKSwgW3RocmVzaF0gInIiKHRocmVzaCkKKyAgICA6ICJtZW1vcnkiLCBRUmVncworICApOworfQorCitzdGF0aWMgdm9pZCBTaW1wbGVIRmlsdGVyMTZfTkVPTih1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKSB7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICJzdWIgICAgICAgIHI0LCAlW3BdLCAjMiAgICAgICAgICAgICAgICAgICBcbiIgIC8vIGJhc2UxID0gcCAtIDIKKyAgICAibHNsICAgICAgICByNiwgJVtzdHJpZGVdLCAjMSAgICAgICAgICAgICAgXG4iICAvLyByNiA9IDIgKiBzdHJpZGUKKyAgICAiYWRkICAgICAgICByNSwgcjQsICVbc3RyaWRlXSAgICAgICAgICAgICAgXG4iICAvLyBiYXNlMiA9IGJhc2UxICsgc3RyaWRlCisKKyAgICBMT0FEOHg0KGQyLCBkMywgZDQsIGQ1LCBbcjRdLCBbcjVdLCByNikKKyAgICBMT0FEOHg0KGQyNCwgZDI1LCBkMjYsIGQyNywgW3I0XSwgW3I1XSwgcjYpCisgICAgInZzd3AgICAgICAgZDMsIGQyNCAgICAgICAgICAgICAgICAgICAgICAgIFxuIiAgLy8gcDE6cTEgcDA6cTMKKyAgICAidnN3cCAgICAgICBkNSwgZDI2ICAgICAgICAgICAgICAgICAgICAgICAgXG4iICAvLyBxMDpxMiBxMTpxNAorICAgICJ2c3dwICAgICAgIHEyLCBxMTIgICAgICAgICAgICAgICAgICAgICAgICBcbiIgIC8vIHAxOnExIHAwOnEyIHEwOnEzIHExOnE0CisKKyAgICBET19GSUxURVIyKHExLCBxMiwgcTEyLCBxMTMsICVbdGhyZXNoXSkKKworICAgICJzdWIgICAgICAgICVbcF0sICVbcF0sICMxICAgICAgICAgICAgICAgICBcbiIgIC8vIHAgLSAxCisKKyAgICAidnN3cCAgICAgICAgZDUsIGQyNCAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgU1RPUkU4eDIoZDQsIGQ1LCBbJVtwXV0sICVbc3RyaWRlXSkKKyAgICBTVE9SRTh4MihkMjQsIGQyNSwgWyVbcF1dLCAlW3N0cmlkZV0pCisKKyAgICA6IFtwXSAiK3IiKHApCisgICAgOiBbc3RyaWRlXSAiciIoc3RyaWRlKSwgW3RocmVzaF0gInIiKHRocmVzaCkKKyAgICA6ICJtZW1vcnkiLCAicjQiLCAicjUiLCAicjYiLCBRUmVncworICApOworfQorCisjdW5kZWYgTE9BRDh4NAorI3VuZGVmIFNUT1JFOHgyCisKKyNlbmRpZiAgICAvLyBXRUJQX1VTRV9JTlRSSU5TSUNTCisKK3N0YXRpYyB2b2lkIFNpbXBsZVZGaWx0ZXIxNmlfTkVPTih1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKSB7CisgIHVpbnQzMl90IGs7CisgIGZvciAoayA9IDM7IGsgIT0gMDsgLS1rKSB7CisgICAgcCArPSA0ICogc3RyaWRlOworICAgIFNpbXBsZVZGaWx0ZXIxNl9ORU9OKHAsIHN0cmlkZSwgdGhyZXNoKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBTaW1wbGVIRmlsdGVyMTZpX05FT04odWludDhfdCogcCwgaW50IHN0cmlkZSwgaW50IHRocmVzaCkgeworICB1aW50MzJfdCBrOworICBmb3IgKGsgPSAzOyBrICE9IDA7IC0taykgeworICAgIHAgKz0gNDsKKyAgICBTaW1wbGVIRmlsdGVyMTZfTkVPTihwLCBzdHJpZGUsIHRocmVzaCk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvbXBsZXggSW4tbG9vcCBmaWx0ZXJpbmcgKFBhcmFncmFwaCAxNS4zKQorCitzdGF0aWMgdWludDh4MTZfdCBOZWVkc0hldl9ORU9OKGNvbnN0IHVpbnQ4eDE2X3QgcDEsIGNvbnN0IHVpbnQ4eDE2X3QgcDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4eDE2X3QgcTAsIGNvbnN0IHVpbnQ4eDE2X3QgcTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZXZfdGhyZXNoKSB7CisgIGNvbnN0IHVpbnQ4eDE2X3QgaGV2X3RocmVzaF92ID0gdmR1cHFfbl91OCgodWludDhfdCloZXZfdGhyZXNoKTsKKyAgY29uc3QgdWludDh4MTZfdCBhX3AxX3AwID0gdmFiZHFfdTgocDEsIHAwKTsgIC8vIGFicyhwMSAtIHAwKQorICBjb25zdCB1aW50OHgxNl90IGFfcTFfcTAgPSB2YWJkcV91OChxMSwgcTApOyAgLy8gYWJzKHExIC0gcTApCisgIGNvbnN0IHVpbnQ4eDE2X3QgYV9tYXggPSB2bWF4cV91OChhX3AxX3AwLCBhX3ExX3EwKTsKKyAgY29uc3QgdWludDh4MTZfdCBtYXNrID0gdmNndHFfdTgoYV9tYXgsIGhldl90aHJlc2hfdik7CisgIHJldHVybiBtYXNrOworfQorCitzdGF0aWMgdWludDh4MTZfdCBOZWVkc0ZpbHRlcjJfTkVPTihjb25zdCB1aW50OHgxNl90IHAzLCBjb25zdCB1aW50OHgxNl90IHAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDh4MTZfdCBwMSwgY29uc3QgdWludDh4MTZfdCBwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4eDE2X3QgcTAsIGNvbnN0IHVpbnQ4eDE2X3QgcTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OHgxNl90IHEyLCBjb25zdCB1aW50OHgxNl90IHEzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGl0aHJlc2gsIGludCB0aHJlc2gpIHsKKyAgY29uc3QgdWludDh4MTZfdCBpdGhyZXNoX3YgPSB2ZHVwcV9uX3U4KCh1aW50OF90KWl0aHJlc2gpOworICBjb25zdCB1aW50OHgxNl90IGFfcDNfcDIgPSB2YWJkcV91OChwMywgcDIpOyAgLy8gYWJzKHAzIC0gcDIpCisgIGNvbnN0IHVpbnQ4eDE2X3QgYV9wMl9wMSA9IHZhYmRxX3U4KHAyLCBwMSk7ICAvLyBhYnMocDIgLSBwMSkKKyAgY29uc3QgdWludDh4MTZfdCBhX3AxX3AwID0gdmFiZHFfdTgocDEsIHAwKTsgIC8vIGFicyhwMSAtIHAwKQorICBjb25zdCB1aW50OHgxNl90IGFfcTNfcTIgPSB2YWJkcV91OChxMywgcTIpOyAgLy8gYWJzKHEzIC0gcTIpCisgIGNvbnN0IHVpbnQ4eDE2X3QgYV9xMl9xMSA9IHZhYmRxX3U4KHEyLCBxMSk7ICAvLyBhYnMocTIgLSBxMSkKKyAgY29uc3QgdWludDh4MTZfdCBhX3ExX3EwID0gdmFiZHFfdTgocTEsIHEwKTsgIC8vIGFicyhxMSAtIHEwKQorICBjb25zdCB1aW50OHgxNl90IG1heDEgPSB2bWF4cV91OChhX3AzX3AyLCBhX3AyX3AxKTsKKyAgY29uc3QgdWludDh4MTZfdCBtYXgyID0gdm1heHFfdTgoYV9wMV9wMCwgYV9xM19xMik7CisgIGNvbnN0IHVpbnQ4eDE2X3QgbWF4MyA9IHZtYXhxX3U4KGFfcTJfcTEsIGFfcTFfcTApOworICBjb25zdCB1aW50OHgxNl90IG1heDEyID0gdm1heHFfdTgobWF4MSwgbWF4Mik7CisgIGNvbnN0IHVpbnQ4eDE2X3QgbWF4MTIzID0gdm1heHFfdTgobWF4MTIsIG1heDMpOworICBjb25zdCB1aW50OHgxNl90IG1hc2syID0gdmNnZXFfdTgoaXRocmVzaF92LCBtYXgxMjMpOworICBjb25zdCB1aW50OHgxNl90IG1hc2sxID0gTmVlZHNGaWx0ZXJfTkVPTihwMSwgcDAsIHEwLCBxMSwgdGhyZXNoKTsKKyAgY29uc3QgdWludDh4MTZfdCBtYXNrID0gdmFuZHFfdTgobWFzazEsIG1hc2syKTsKKyAgcmV0dXJuIG1hc2s7Cit9CisKKy8vICA0LXBvaW50cyBmaWx0ZXIKKworc3RhdGljIHZvaWQgQXBwbHlGaWx0ZXI0X05FT04oCisgICAgY29uc3QgaW50OHgxNl90IHAxLCBjb25zdCBpbnQ4eDE2X3QgcDAsCisgICAgY29uc3QgaW50OHgxNl90IHEwLCBjb25zdCBpbnQ4eDE2X3QgcTEsCisgICAgY29uc3QgaW50OHgxNl90IGRlbHRhMCwKKyAgICB1aW50OHgxNl90KiBjb25zdCBvcDEsIHVpbnQ4eDE2X3QqIGNvbnN0IG9wMCwKKyAgICB1aW50OHgxNl90KiBjb25zdCBvcTAsIHVpbnQ4eDE2X3QqIGNvbnN0IG9xMSkgeworICBjb25zdCBpbnQ4eDE2X3Qga0NzdDMgPSB2ZHVwcV9uX3M4KDB4MDMpOworICBjb25zdCBpbnQ4eDE2X3Qga0NzdDQgPSB2ZHVwcV9uX3M4KDB4MDQpOworICBjb25zdCBpbnQ4eDE2X3QgZGVsdGExID0gdnFhZGRxX3M4KGRlbHRhMCwga0NzdDQpOworICBjb25zdCBpbnQ4eDE2X3QgZGVsdGEyID0gdnFhZGRxX3M4KGRlbHRhMCwga0NzdDMpOworICBjb25zdCBpbnQ4eDE2X3QgYTEgPSB2c2hycV9uX3M4KGRlbHRhMSwgMyk7CisgIGNvbnN0IGludDh4MTZfdCBhMiA9IHZzaHJxX25fczgoZGVsdGEyLCAzKTsKKyAgY29uc3QgaW50OHgxNl90IGEzID0gdnJzaHJxX25fczgoYTEsIDEpOyAgIC8vIGEzID0gKGExICsgMSkgPj4gMQorICAqb3AwID0gRmxpcFNpZ25CYWNrX05FT04odnFhZGRxX3M4KHAwLCBhMikpOyAgLy8gY2xpcChwMCArIGEyKQorICAqb3EwID0gRmxpcFNpZ25CYWNrX05FT04odnFzdWJxX3M4KHEwLCBhMSkpOyAgLy8gY2xpcChxMCAtIGExKQorICAqb3AxID0gRmxpcFNpZ25CYWNrX05FT04odnFhZGRxX3M4KHAxLCBhMykpOyAgLy8gY2xpcChwMSArIGEzKQorICAqb3ExID0gRmxpcFNpZ25CYWNrX05FT04odnFzdWJxX3M4KHExLCBhMykpOyAgLy8gY2xpcChxMSAtIGEzKQorfQorCitzdGF0aWMgdm9pZCBEb0ZpbHRlcjRfTkVPTigKKyAgICBjb25zdCB1aW50OHgxNl90IHAxLCBjb25zdCB1aW50OHgxNl90IHAwLAorICAgIGNvbnN0IHVpbnQ4eDE2X3QgcTAsIGNvbnN0IHVpbnQ4eDE2X3QgcTEsCisgICAgY29uc3QgdWludDh4MTZfdCBtYXNrLCBjb25zdCB1aW50OHgxNl90IGhldl9tYXNrLAorICAgIHVpbnQ4eDE2X3QqIGNvbnN0IG9wMSwgdWludDh4MTZfdCogY29uc3Qgb3AwLAorICAgIHVpbnQ4eDE2X3QqIGNvbnN0IG9xMCwgdWludDh4MTZfdCogY29uc3Qgb3ExKSB7CisgIC8vIFRoaXMgaXMgYSBmdXNlZCB2ZXJzaW9uIG9mIERvRmlsdGVyMigpIGNhbGxpbmcgQXBwbHlGaWx0ZXIyIGRpcmVjdGx5CisgIGNvbnN0IGludDh4MTZfdCBwMXMgPSBGbGlwU2lnbl9ORU9OKHAxKTsKKyAgaW50OHgxNl90IHAwcyA9IEZsaXBTaWduX05FT04ocDApOworICBpbnQ4eDE2X3QgcTBzID0gRmxpcFNpZ25fTkVPTihxMCk7CisgIGNvbnN0IGludDh4MTZfdCBxMXMgPSBGbGlwU2lnbl9ORU9OKHExKTsKKyAgY29uc3QgdWludDh4MTZfdCBzaW1wbGVfbGZfbWFzayA9IHZhbmRxX3U4KG1hc2ssIGhldl9tYXNrKTsKKworICAvLyBkb19maWx0ZXIyIHBhcnQgKHNpbXBsZSBsb29wZmlsdGVyIG9uIHBpeGVscyB3aXRoIGhldikKKyAgeworICAgIGNvbnN0IGludDh4MTZfdCBkZWx0YSA9IEdldEJhc2VEZWx0YV9ORU9OKHAxcywgcDBzLCBxMHMsIHExcyk7CisgICAgY29uc3QgaW50OHgxNl90IHNpbXBsZV9sZl9kZWx0YSA9CisgICAgICAgIHZhbmRxX3M4KGRlbHRhLCB2cmVpbnRlcnByZXRxX3M4X3U4KHNpbXBsZV9sZl9tYXNrKSk7CisgICAgQXBwbHlGaWx0ZXIyTm9GbGlwX05FT04ocDBzLCBxMHMsIHNpbXBsZV9sZl9kZWx0YSwgJnAwcywgJnEwcyk7CisgIH0KKworICAvLyBkb19maWx0ZXI0IHBhcnQgKGNvbXBsZXggbG9vcGZpbHRlciBvbiBwaXhlbHMgd2l0aG91dCBoZXYpCisgIHsKKyAgICBjb25zdCBpbnQ4eDE2X3QgZGVsdGEwID0gR2V0QmFzZURlbHRhMF9ORU9OKHAwcywgcTBzKTsKKyAgICAvLyB3ZSB1c2U6IChtYXNrICYgaGV2X21hc2spIF4gbWFzayA9IG1hc2sgJiAhaGV2X21hc2sKKyAgICBjb25zdCB1aW50OHgxNl90IGNvbXBsZXhfbGZfbWFzayA9IHZlb3JxX3U4KHNpbXBsZV9sZl9tYXNrLCBtYXNrKTsKKyAgICBjb25zdCBpbnQ4eDE2X3QgY29tcGxleF9sZl9kZWx0YSA9CisgICAgICAgIHZhbmRxX3M4KGRlbHRhMCwgdnJlaW50ZXJwcmV0cV9zOF91OChjb21wbGV4X2xmX21hc2spKTsKKyAgICBBcHBseUZpbHRlcjRfTkVPTihwMXMsIHAwcywgcTBzLCBxMXMsIGNvbXBsZXhfbGZfZGVsdGEsIG9wMSwgb3AwLCBvcTAsIG9xMSk7CisgIH0KK30KKworLy8gIDYtcG9pbnRzIGZpbHRlcgorCitzdGF0aWMgdm9pZCBBcHBseUZpbHRlcjZfTkVPTigKKyAgICBjb25zdCBpbnQ4eDE2X3QgcDIsIGNvbnN0IGludDh4MTZfdCBwMSwgY29uc3QgaW50OHgxNl90IHAwLAorICAgIGNvbnN0IGludDh4MTZfdCBxMCwgY29uc3QgaW50OHgxNl90IHExLCBjb25zdCBpbnQ4eDE2X3QgcTIsCisgICAgY29uc3QgaW50OHgxNl90IGRlbHRhLAorICAgIHVpbnQ4eDE2X3QqIGNvbnN0IG9wMiwgdWludDh4MTZfdCogY29uc3Qgb3AxLCB1aW50OHgxNl90KiBjb25zdCBvcDAsCisgICAgdWludDh4MTZfdCogY29uc3Qgb3EwLCB1aW50OHgxNl90KiBjb25zdCBvcTEsIHVpbnQ4eDE2X3QqIGNvbnN0IG9xMikgeworICAvLyBXZSBoYXZlIHRvIGNvbXB1dGU6IFggPSAoOSphKzYzKSA+PiA3LCBZID0gKDE4KmErNjMpPj43LCBaID0gKDI3KmErNjMpID4+IDcKKyAgLy8gVHVybnMgb3V0LCB0aGVyZSdzIGEgY29tbW9uIHN1Yi1leHByZXNzaW9uIFM9OSAqIGEgLSAxIHRoYXQgY2FuIGJlIHVzZWQKKyAgLy8gd2l0aCB0aGUgc3BlY2lhbCB2cXJzaHJuX25fczE2IHJvdW5kaW5nLXNoaWZ0LWFuZC1uYXJyb3cgaW5zdHJ1Y3Rpb246CisgIC8vICAgWCA9IChTICsgNjQpID4+IDcsIFkgPSAoUyArIDMyKSA+PiA2LCBaID0gKDE4ICogYSArIFMgKyA2NCkgPj4gNworICBjb25zdCBpbnQ4eDhfdCBkZWx0YV9sbyA9IHZnZXRfbG93X3M4KGRlbHRhKTsKKyAgY29uc3QgaW50OHg4X3QgZGVsdGFfaGkgPSB2Z2V0X2hpZ2hfczgoZGVsdGEpOworICBjb25zdCBpbnQ4eDhfdCBrQ3N0OSA9IHZkdXBfbl9zOCg5KTsKKyAgY29uc3QgaW50MTZ4OF90IGtDc3RtMSA9IHZkdXBxX25fczE2KC0xKTsKKyAgY29uc3QgaW50OHg4X3Qga0NzdDE4ID0gdmR1cF9uX3M4KDE4KTsKKyAgY29uc3QgaW50MTZ4OF90IFNfbG8gPSB2bWxhbF9zOChrQ3N0bTEsIGtDc3Q5LCBkZWx0YV9sbyk7ICAvLyBTID0gOSAqIGEgLSAxCisgIGNvbnN0IGludDE2eDhfdCBTX2hpID0gdm1sYWxfczgoa0NzdG0xLCBrQ3N0OSwgZGVsdGFfaGkpOworICBjb25zdCBpbnQxNng4X3QgWl9sbyA9IHZtbGFsX3M4KFNfbG8sIGtDc3QxOCwgZGVsdGFfbG8pOyAgIC8vIFMgKyAxOCAqIGEKKyAgY29uc3QgaW50MTZ4OF90IFpfaGkgPSB2bWxhbF9zOChTX2hpLCBrQ3N0MTgsIGRlbHRhX2hpKTsKKyAgY29uc3QgaW50OHg4X3QgYTNfbG8gPSB2cXJzaHJuX25fczE2KFNfbG8sIDcpOyAgIC8vICg5ICogYSArIDYzKSA+PiA3CisgIGNvbnN0IGludDh4OF90IGEzX2hpID0gdnFyc2hybl9uX3MxNihTX2hpLCA3KTsKKyAgY29uc3QgaW50OHg4X3QgYTJfbG8gPSB2cXJzaHJuX25fczE2KFNfbG8sIDYpOyAgIC8vICg5ICogYSArIDMxKSA+PiA2CisgIGNvbnN0IGludDh4OF90IGEyX2hpID0gdnFyc2hybl9uX3MxNihTX2hpLCA2KTsKKyAgY29uc3QgaW50OHg4X3QgYTFfbG8gPSB2cXJzaHJuX25fczE2KFpfbG8sIDcpOyAgIC8vICgyNyAqIGEgKyA2MykgPj4gNworICBjb25zdCBpbnQ4eDhfdCBhMV9oaSA9IHZxcnNocm5fbl9zMTYoWl9oaSwgNyk7CisgIGNvbnN0IGludDh4MTZfdCBhMSA9IHZjb21iaW5lX3M4KGExX2xvLCBhMV9oaSk7CisgIGNvbnN0IGludDh4MTZfdCBhMiA9IHZjb21iaW5lX3M4KGEyX2xvLCBhMl9oaSk7CisgIGNvbnN0IGludDh4MTZfdCBhMyA9IHZjb21iaW5lX3M4KGEzX2xvLCBhM19oaSk7CisKKyAgKm9wMCA9IEZsaXBTaWduQmFja19ORU9OKHZxYWRkcV9zOChwMCwgYTEpKTsgIC8vIGNsaXAocDAgKyBhMSkKKyAgKm9xMCA9IEZsaXBTaWduQmFja19ORU9OKHZxc3VicV9zOChxMCwgYTEpKTsgIC8vIGNsaXAocTAgLSBxMSkKKyAgKm9xMSA9IEZsaXBTaWduQmFja19ORU9OKHZxc3VicV9zOChxMSwgYTIpKTsgIC8vIGNsaXAocTEgLSBhMikKKyAgKm9wMSA9IEZsaXBTaWduQmFja19ORU9OKHZxYWRkcV9zOChwMSwgYTIpKTsgIC8vIGNsaXAocDEgKyBhMikKKyAgKm9xMiA9IEZsaXBTaWduQmFja19ORU9OKHZxc3VicV9zOChxMiwgYTMpKTsgIC8vIGNsaXAocTIgLSBhMykKKyAgKm9wMiA9IEZsaXBTaWduQmFja19ORU9OKHZxYWRkcV9zOChwMiwgYTMpKTsgIC8vIGNsaXAocDIgKyBhMykKK30KKworc3RhdGljIHZvaWQgRG9GaWx0ZXI2X05FT04oCisgICAgY29uc3QgdWludDh4MTZfdCBwMiwgY29uc3QgdWludDh4MTZfdCBwMSwgY29uc3QgdWludDh4MTZfdCBwMCwKKyAgICBjb25zdCB1aW50OHgxNl90IHEwLCBjb25zdCB1aW50OHgxNl90IHExLCBjb25zdCB1aW50OHgxNl90IHEyLAorICAgIGNvbnN0IHVpbnQ4eDE2X3QgbWFzaywgY29uc3QgdWludDh4MTZfdCBoZXZfbWFzaywKKyAgICB1aW50OHgxNl90KiBjb25zdCBvcDIsIHVpbnQ4eDE2X3QqIGNvbnN0IG9wMSwgdWludDh4MTZfdCogY29uc3Qgb3AwLAorICAgIHVpbnQ4eDE2X3QqIGNvbnN0IG9xMCwgdWludDh4MTZfdCogY29uc3Qgb3ExLCB1aW50OHgxNl90KiBjb25zdCBvcTIpIHsKKyAgLy8gVGhpcyBpcyBhIGZ1c2VkIHZlcnNpb24gb2YgRG9GaWx0ZXIyKCkgY2FsbGluZyBBcHBseUZpbHRlcjIgZGlyZWN0bHkKKyAgY29uc3QgaW50OHgxNl90IHAycyA9IEZsaXBTaWduX05FT04ocDIpOworICBjb25zdCBpbnQ4eDE2X3QgcDFzID0gRmxpcFNpZ25fTkVPTihwMSk7CisgIGludDh4MTZfdCBwMHMgPSBGbGlwU2lnbl9ORU9OKHAwKTsKKyAgaW50OHgxNl90IHEwcyA9IEZsaXBTaWduX05FT04ocTApOworICBjb25zdCBpbnQ4eDE2X3QgcTFzID0gRmxpcFNpZ25fTkVPTihxMSk7CisgIGNvbnN0IGludDh4MTZfdCBxMnMgPSBGbGlwU2lnbl9ORU9OKHEyKTsKKyAgY29uc3QgdWludDh4MTZfdCBzaW1wbGVfbGZfbWFzayA9IHZhbmRxX3U4KG1hc2ssIGhldl9tYXNrKTsKKyAgY29uc3QgaW50OHgxNl90IGRlbHRhMCA9IEdldEJhc2VEZWx0YV9ORU9OKHAxcywgcDBzLCBxMHMsIHExcyk7CisKKyAgLy8gZG9fZmlsdGVyMiBwYXJ0IChzaW1wbGUgbG9vcGZpbHRlciBvbiBwaXhlbHMgd2l0aCBoZXYpCisgIHsKKyAgICBjb25zdCBpbnQ4eDE2X3Qgc2ltcGxlX2xmX2RlbHRhID0KKyAgICAgICAgdmFuZHFfczgoZGVsdGEwLCB2cmVpbnRlcnByZXRxX3M4X3U4KHNpbXBsZV9sZl9tYXNrKSk7CisgICAgQXBwbHlGaWx0ZXIyTm9GbGlwX05FT04ocDBzLCBxMHMsIHNpbXBsZV9sZl9kZWx0YSwgJnAwcywgJnEwcyk7CisgIH0KKworICAvLyBkb19maWx0ZXI2IHBhcnQgKGNvbXBsZXggbG9vcGZpbHRlciBvbiBwaXhlbHMgd2l0aG91dCBoZXYpCisgIHsKKyAgICAvLyB3ZSB1c2U6IChtYXNrICYgaGV2X21hc2spIF4gbWFzayA9IG1hc2sgJiAhaGV2X21hc2sKKyAgICBjb25zdCB1aW50OHgxNl90IGNvbXBsZXhfbGZfbWFzayA9IHZlb3JxX3U4KHNpbXBsZV9sZl9tYXNrLCBtYXNrKTsKKyAgICBjb25zdCBpbnQ4eDE2X3QgY29tcGxleF9sZl9kZWx0YSA9CisgICAgICAgIHZhbmRxX3M4KGRlbHRhMCwgdnJlaW50ZXJwcmV0cV9zOF91OChjb21wbGV4X2xmX21hc2spKTsKKyAgICBBcHBseUZpbHRlcjZfTkVPTihwMnMsIHAxcywgcDBzLCBxMHMsIHExcywgcTJzLCBjb21wbGV4X2xmX2RlbHRhLAorICAgICAgICAgICAgICAgICAgICAgIG9wMiwgb3AxLCBvcDAsIG9xMCwgb3ExLCBvcTIpOworICB9Cit9CisKKy8vIG9uIG1hY3JvYmxvY2sgZWRnZXMKKworc3RhdGljIHZvaWQgVkZpbHRlcjE2X05FT04odWludDhfdCogcCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICB1aW50OHgxNl90IHAzLCBwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBxMzsKKyAgTG9hZDE2eDhfTkVPTihwLCBzdHJpZGUsICZwMywgJnAyLCAmcDEsICZwMCwgJnEwLCAmcTEsICZxMiwgJnEzKTsKKyAgeworICAgIGNvbnN0IHVpbnQ4eDE2X3QgbWFzayA9IE5lZWRzRmlsdGVyMl9ORU9OKHAzLCBwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBxMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGhyZXNoLCB0aHJlc2gpOworICAgIGNvbnN0IHVpbnQ4eDE2X3QgaGV2X21hc2sgPSBOZWVkc0hldl9ORU9OKHAxLCBwMCwgcTAsIHExLCBoZXZfdGhyZXNoKTsKKyAgICB1aW50OHgxNl90IG9wMiwgb3AxLCBvcDAsIG9xMCwgb3ExLCBvcTI7CisgICAgRG9GaWx0ZXI2X05FT04ocDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgbWFzaywgaGV2X21hc2ssCisgICAgICAgICAgICAgICAgICAgJm9wMiwgJm9wMSwgJm9wMCwgJm9xMCwgJm9xMSwgJm9xMik7CisgICAgU3RvcmUxNngyX05FT04ob3AyLCBvcDEsIHAgLSAyICogc3RyaWRlLCBzdHJpZGUpOworICAgIFN0b3JlMTZ4Ml9ORU9OKG9wMCwgb3EwLCBwICsgMCAqIHN0cmlkZSwgc3RyaWRlKTsKKyAgICBTdG9yZTE2eDJfTkVPTihvcTEsIG9xMiwgcCArIDIgKiBzdHJpZGUsIHN0cmlkZSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgSEZpbHRlcjE2X05FT04odWludDhfdCogcCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICB1aW50OHgxNl90IHAzLCBwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBxMzsKKyAgTG9hZDh4MTZfTkVPTihwLCBzdHJpZGUsICZwMywgJnAyLCAmcDEsICZwMCwgJnEwLCAmcTEsICZxMiwgJnEzKTsKKyAgeworICAgIGNvbnN0IHVpbnQ4eDE2X3QgbWFzayA9IE5lZWRzRmlsdGVyMl9ORU9OKHAzLCBwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBxMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGhyZXNoLCB0aHJlc2gpOworICAgIGNvbnN0IHVpbnQ4eDE2X3QgaGV2X21hc2sgPSBOZWVkc0hldl9ORU9OKHAxLCBwMCwgcTAsIHExLCBoZXZfdGhyZXNoKTsKKyAgICB1aW50OHgxNl90IG9wMiwgb3AxLCBvcDAsIG9xMCwgb3ExLCBvcTI7CisgICAgRG9GaWx0ZXI2X05FT04ocDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgbWFzaywgaGV2X21hc2ssCisgICAgICAgICAgICAgICAgICAgJm9wMiwgJm9wMSwgJm9wMCwgJm9xMCwgJm9xMSwgJm9xMik7CisgICAgU3RvcmUyeDE2X05FT04ob3AyLCBvcDEsIHAgLSAyLCBzdHJpZGUpOworICAgIFN0b3JlMngxNl9ORU9OKG9wMCwgb3EwLCBwICsgMCwgc3RyaWRlKTsKKyAgICBTdG9yZTJ4MTZfTkVPTihvcTEsIG9xMiwgcCArIDIsIHN0cmlkZSk7CisgIH0KK30KKworLy8gb24gdGhyZWUgaW5uZXIgZWRnZXMKK3N0YXRpYyB2b2lkIFZGaWx0ZXIxNmlfTkVPTih1aW50OF90KiBwLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICB1aW50MzJfdCBrOworICB1aW50OHgxNl90IHAzLCBwMiwgcDEsIHAwOworICBMb2FkMTZ4NF9ORU9OKHAgKyAyICAqIHN0cmlkZSwgc3RyaWRlLCAmcDMsICZwMiwgJnAxLCAmcDApOworICBmb3IgKGsgPSAzOyBrICE9IDA7IC0taykgeworICAgIHVpbnQ4eDE2X3QgcTAsIHExLCBxMiwgcTM7CisgICAgcCArPSA0ICogc3RyaWRlOworICAgIExvYWQxNng0X05FT04ocCArIDIgICogc3RyaWRlLCBzdHJpZGUsICZxMCwgJnExLCAmcTIsICZxMyk7CisgICAgeworICAgICAgY29uc3QgdWludDh4MTZfdCBtYXNrID0KKyAgICAgICAgICBOZWVkc0ZpbHRlcjJfTkVPTihwMywgcDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgcTMsIGl0aHJlc2gsIHRocmVzaCk7CisgICAgICBjb25zdCB1aW50OHgxNl90IGhldl9tYXNrID0gTmVlZHNIZXZfTkVPTihwMSwgcDAsIHEwLCBxMSwgaGV2X3RocmVzaCk7CisgICAgICAvLyBwMyBhbmQgcDIgYXJlIG5vdCBqdXN0IHRlbXBvcmFyeSB2YXJpYWJsZXMgaGVyZTogdGhleSB3aWxsIGJlCisgICAgICAvLyByZS11c2VkIGZvciBuZXh0IHNwYW4uIEFuZCBxMi9xMyB3aWxsIGJlY29tZSBwMS9wMCBhY2NvcmRpbmdseS4KKyAgICAgIERvRmlsdGVyNF9ORU9OKHAxLCBwMCwgcTAsIHExLCBtYXNrLCBoZXZfbWFzaywgJnAxLCAmcDAsICZwMywgJnAyKTsKKyAgICAgIFN0b3JlMTZ4NF9ORU9OKHAxLCBwMCwgcDMsIHAyLCBwLCBzdHJpZGUpOworICAgICAgcDEgPSBxMjsKKyAgICAgIHAwID0gcTM7CisgICAgfQorICB9Cit9CisKKyNpZiAhZGVmaW5lZChXT1JLX0FST1VORF9HQ0MpCitzdGF0aWMgdm9pZCBIRmlsdGVyMTZpX05FT04odWludDhfdCogcCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgdWludDMyX3QgazsKKyAgdWludDh4MTZfdCBwMywgcDIsIHAxLCBwMDsKKyAgTG9hZDR4MTZfTkVPTihwICsgMiwgc3RyaWRlLCAmcDMsICZwMiwgJnAxLCAmcDApOworICBmb3IgKGsgPSAzOyBrICE9IDA7IC0taykgeworICAgIHVpbnQ4eDE2X3QgcTAsIHExLCBxMiwgcTM7CisgICAgcCArPSA0OworICAgIExvYWQ0eDE2X05FT04ocCArIDIsIHN0cmlkZSwgJnEwLCAmcTEsICZxMiwgJnEzKTsKKyAgICB7CisgICAgICBjb25zdCB1aW50OHgxNl90IG1hc2sgPQorICAgICAgICAgIE5lZWRzRmlsdGVyMl9ORU9OKHAzLCBwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBxMywgaXRocmVzaCwgdGhyZXNoKTsKKyAgICAgIGNvbnN0IHVpbnQ4eDE2X3QgaGV2X21hc2sgPSBOZWVkc0hldl9ORU9OKHAxLCBwMCwgcTAsIHExLCBoZXZfdGhyZXNoKTsKKyAgICAgIERvRmlsdGVyNF9ORU9OKHAxLCBwMCwgcTAsIHExLCBtYXNrLCBoZXZfbWFzaywgJnAxLCAmcDAsICZwMywgJnAyKTsKKyAgICAgIFN0b3JlNHgxNl9ORU9OKHAxLCBwMCwgcDMsIHAyLCBwLCBzdHJpZGUpOworICAgICAgcDEgPSBxMjsKKyAgICAgIHAwID0gcTM7CisgICAgfQorICB9Cit9CisjZW5kaWYgIC8vICFXT1JLX0FST1VORF9HQ0MKKworLy8gOC1waXhlbHMgd2lkZSB2YXJpYW50LCBmb3IgY2hyb21hIGZpbHRlcmluZworc3RhdGljIHZvaWQgVkZpbHRlcjhfTkVPTih1aW50OF90KiB1LCB1aW50OF90KiB2LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgdWludDh4MTZfdCBwMywgcDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgcTM7CisgIExvYWQ4eDh4Ml9ORU9OKHUsIHYsIHN0cmlkZSwgJnAzLCAmcDIsICZwMSwgJnAwLCAmcTAsICZxMSwgJnEyLCAmcTMpOworICB7CisgICAgY29uc3QgdWludDh4MTZfdCBtYXNrID0gTmVlZHNGaWx0ZXIyX05FT04ocDMsIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIHEzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0aHJlc2gsIHRocmVzaCk7CisgICAgY29uc3QgdWludDh4MTZfdCBoZXZfbWFzayA9IE5lZWRzSGV2X05FT04ocDEsIHAwLCBxMCwgcTEsIGhldl90aHJlc2gpOworICAgIHVpbnQ4eDE2X3Qgb3AyLCBvcDEsIG9wMCwgb3EwLCBvcTEsIG9xMjsKKyAgICBEb0ZpbHRlcjZfTkVPTihwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBtYXNrLCBoZXZfbWFzaywKKyAgICAgICAgICAgICAgICAgICAmb3AyLCAmb3AxLCAmb3AwLCAmb3EwLCAmb3ExLCAmb3EyKTsKKyAgICBTdG9yZTh4MngyX05FT04ob3AyLCBvcDEsIHUgLSAyICogc3RyaWRlLCB2IC0gMiAqIHN0cmlkZSwgc3RyaWRlKTsKKyAgICBTdG9yZTh4MngyX05FT04ob3AwLCBvcTAsIHUgKyAwICogc3RyaWRlLCB2ICsgMCAqIHN0cmlkZSwgc3RyaWRlKTsKKyAgICBTdG9yZTh4MngyX05FT04ob3ExLCBvcTIsIHUgKyAyICogc3RyaWRlLCB2ICsgMiAqIHN0cmlkZSwgc3RyaWRlKTsKKyAgfQorfQorc3RhdGljIHZvaWQgVkZpbHRlcjhpX05FT04odWludDhfdCogdSwgdWludDhfdCogdiwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICB1aW50OHgxNl90IHAzLCBwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBxMzsKKyAgdSArPSA0ICogc3RyaWRlOworICB2ICs9IDQgKiBzdHJpZGU7CisgIExvYWQ4eDh4Ml9ORU9OKHUsIHYsIHN0cmlkZSwgJnAzLCAmcDIsICZwMSwgJnAwLCAmcTAsICZxMSwgJnEyLCAmcTMpOworICB7CisgICAgY29uc3QgdWludDh4MTZfdCBtYXNrID0gTmVlZHNGaWx0ZXIyX05FT04ocDMsIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIHEzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0aHJlc2gsIHRocmVzaCk7CisgICAgY29uc3QgdWludDh4MTZfdCBoZXZfbWFzayA9IE5lZWRzSGV2X05FT04ocDEsIHAwLCBxMCwgcTEsIGhldl90aHJlc2gpOworICAgIHVpbnQ4eDE2X3Qgb3AxLCBvcDAsIG9xMCwgb3ExOworICAgIERvRmlsdGVyNF9ORU9OKHAxLCBwMCwgcTAsIHExLCBtYXNrLCBoZXZfbWFzaywgJm9wMSwgJm9wMCwgJm9xMCwgJm9xMSk7CisgICAgU3RvcmU4eDR4Ml9ORU9OKG9wMSwgb3AwLCBvcTAsIG9xMSwgdSwgdiwgc3RyaWRlKTsKKyAgfQorfQorCisjaWYgIWRlZmluZWQoV09SS19BUk9VTkRfR0NDKQorc3RhdGljIHZvaWQgSEZpbHRlcjhfTkVPTih1aW50OF90KiB1LCB1aW50OF90KiB2LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgdWludDh4MTZfdCBwMywgcDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgcTM7CisgIExvYWQ4eDh4MlRfTkVPTih1LCB2LCBzdHJpZGUsICZwMywgJnAyLCAmcDEsICZwMCwgJnEwLCAmcTEsICZxMiwgJnEzKTsKKyAgeworICAgIGNvbnN0IHVpbnQ4eDE2X3QgbWFzayA9IE5lZWRzRmlsdGVyMl9ORU9OKHAzLCBwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBxMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGhyZXNoLCB0aHJlc2gpOworICAgIGNvbnN0IHVpbnQ4eDE2X3QgaGV2X21hc2sgPSBOZWVkc0hldl9ORU9OKHAxLCBwMCwgcTAsIHExLCBoZXZfdGhyZXNoKTsKKyAgICB1aW50OHgxNl90IG9wMiwgb3AxLCBvcDAsIG9xMCwgb3ExLCBvcTI7CisgICAgRG9GaWx0ZXI2X05FT04ocDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgbWFzaywgaGV2X21hc2ssCisgICAgICAgICAgICAgICAgICAgJm9wMiwgJm9wMSwgJm9wMCwgJm9xMCwgJm9xMSwgJm9xMik7CisgICAgU3RvcmU2eDh4Ml9ORU9OKG9wMiwgb3AxLCBvcDAsIG9xMCwgb3ExLCBvcTIsIHUsIHYsIHN0cmlkZSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgSEZpbHRlcjhpX05FT04odWludDhfdCogdSwgdWludDhfdCogdiwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICB1aW50OHgxNl90IHAzLCBwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBxMzsKKyAgdSArPSA0OworICB2ICs9IDQ7CisgIExvYWQ4eDh4MlRfTkVPTih1LCB2LCBzdHJpZGUsICZwMywgJnAyLCAmcDEsICZwMCwgJnEwLCAmcTEsICZxMiwgJnEzKTsKKyAgeworICAgIGNvbnN0IHVpbnQ4eDE2X3QgbWFzayA9IE5lZWRzRmlsdGVyMl9ORU9OKHAzLCBwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBxMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGhyZXNoLCB0aHJlc2gpOworICAgIGNvbnN0IHVpbnQ4eDE2X3QgaGV2X21hc2sgPSBOZWVkc0hldl9ORU9OKHAxLCBwMCwgcTAsIHExLCBoZXZfdGhyZXNoKTsKKyAgICB1aW50OHgxNl90IG9wMSwgb3AwLCBvcTAsIG9xMTsKKyAgICBEb0ZpbHRlcjRfTkVPTihwMSwgcDAsIHEwLCBxMSwgbWFzaywgaGV2X21hc2ssICZvcDEsICZvcDAsICZvcTAsICZvcTEpOworICAgIFN0b3JlNHg4eDJfTkVPTihvcDEsIG9wMCwgb3EwLCBvcTEsIHUsIHYsIHN0cmlkZSk7CisgIH0KK30KKyNlbmRpZiAgLy8gIVdPUktfQVJPVU5EX0dDQworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbnZlcnNlIHRyYW5zZm9ybXMgKFBhcmFncmFwaCAxNC40KQorCisvLyBUZWNobmljYWxseSB0aGVzZSBhcmUgdW5zaWduZWQgYnV0IHZxZG11bGggaXMgb25seSBhdmFpbGFibGUgaW4gc2lnbmVkLgorLy8gdnFkbXVsaCByZXR1cm5zIGhpZ2ggaGFsZiAoZWZmZWN0aXZlbHkgPj4gMTYpIGJ1dCBhbHNvIGRvdWJsZXMgdGhlIHZhbHVlLAorLy8gY2hhbmdpbmcgdGhlID4+IDE2IHRvID4+IDE1IGFuZCByZXF1aXJpbmcgYW4gYWRkaXRpb25hbCA+PiAxLgorLy8gV2UgdXNlIHRoaXMgdG8gb3VyIGFkdmFudGFnZSB3aXRoIGtDMi4gVGhlIGNhbm9uaWNhbCB2YWx1ZSBpcyAzNTQ2OC4KKy8vIEhvd2V2ZXIsIHRoZSBoaWdoIGJpdCBpcyBzZXQgc28gdHJlYXRpbmcgaXQgYXMgc2lnbmVkIHdpbGwgZ2l2ZSBpbmNvcnJlY3QKKy8vIHJlc3VsdHMuIFdlIGF2b2lkIHRoaXMgYnkgZG93biBzaGlmdGluZyBieSAxIGhlcmUgdG8gY2xlYXIgdGhlIGhpZ2hlc3QgYml0LgorLy8gQ29tYmluZWQgd2l0aCB0aGUgZG91YmxpbmcgZWZmZWN0IG9mIHZxZG11bGggd2UgZ2V0ID4+IDE2LgorLy8gVGhpcyBjYW4gbm90IGJlIGFwcGxpZWQgdG8ga0MxIGJlY2F1c2UgdGhlIGxvd2VzdCBiaXQgaXMgc2V0LiBEb3duIHNoaWZ0aW5nCisvLyB0aGUgY29uc3RhbnQgd291bGQgcmVkdWNlIHByZWNpc2lvbi4KKworLy8gbGlid2VicCB1c2VzIGEgdHJpY2sgdG8gYXZvaWQgc29tZSBleHRyYSBhZGRpdGlvbiB0aGF0IGxpYnZweCBkb2VzLgorLy8gSW5zdGVhZCBvZjoKKy8vIHRlbXAyID0gaXBbMTJdICsgKChpcFsxMl0gKiBjb3NwaThzcXJ0Mm1pbnVzMSkgPj4gMTYpOworLy8gbGlid2VicCBhZGRzIDEgPDwgMTYgdG8gY29zcGk4c3FydDJtaW51czEgKGtDMSkuIEhvd2V2ZXIsIHRoaXMgY2F1c2VzIHRoZQorLy8gc2FtZSBpc3N1ZSB3aXRoIGtDMSBhbmQgdnFkbXVsaCB0aGF0IHdlIHdvcmsgYXJvdW5kIGJ5IGRvd24gc2hpZnRpbmcga0MyCisKK3N0YXRpYyBjb25zdCBpbnQxNl90IGtDMSA9IDIwMDkxOworc3RhdGljIGNvbnN0IGludDE2X3Qga0MyID0gMTc3MzQ7ICAvLyBoYWxmIG9mIGtDMiwgYWN0dWFsbHkuIFNlZSBjb21tZW50IGFib3ZlLgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9JTlRSSU5TSUNTKQorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVHJhbnNwb3NlOHgyX05FT04oY29uc3QgaW50MTZ4OF90IGluMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2eDhfdCBpbjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNng4eDJfdCogY29uc3Qgb3V0KSB7CisgIC8vIGEwIGExIGEyIGEzIHwgYjAgYjEgYjIgYjMgICA9PiBhMCBiMCBjMCBkMCB8IGExIGIxIGMxIGQxCisgIC8vIGMwIGMxIGMyIGMzIHwgZDAgZDEgZDIgZDMgICAgICBhMiBiMiBjMiBkMiB8IGEzIGIzIGMzIGQzCisgIGNvbnN0IGludDE2eDh4Ml90IHRtcDAgPSB2emlwcV9zMTYoaW4wLCBpbjEpOyAgIC8vIGEwIGMwIGExIGMxIGEyIGMyIC4uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiMCBkMCBiMSBkMSBiMiBkMiAuLi4KKyAgKm91dCA9IHZ6aXBxX3MxNih0bXAwLnZhbFswXSwgdG1wMC52YWxbMV0pOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBUcmFuc2Zvcm1QYXNzX05FT04oaW50MTZ4OHgyX3QqIGNvbnN0IHJvd3MpIHsKKyAgLy8ge3Jvd3N9ID0gaW4wIHwgaW40CisgIC8vICAgICAgICAgIGluOCB8IGluMTIKKyAgLy8gQjEgPSBpbjQgfCBpbjEyCisgIGNvbnN0IGludDE2eDhfdCBCMSA9CisgICAgICB2Y29tYmluZV9zMTYodmdldF9oaWdoX3MxNihyb3dzLT52YWxbMF0pLCB2Z2V0X2hpZ2hfczE2KHJvd3MtPnZhbFsxXSkpOworICAvLyBDMCA9IGtDMSAqIGluNCB8IGtDMSAqIGluMTIKKyAgLy8gQzEgPSBrQzIgKiBpbjQgfCBrQzIgKiBpbjEyCisgIGNvbnN0IGludDE2eDhfdCBDMCA9IHZzcmFxX25fczE2KEIxLCB2cWRtdWxocV9uX3MxNihCMSwga0MxKSwgMSk7CisgIGNvbnN0IGludDE2eDhfdCBDMSA9IHZxZG11bGhxX25fczE2KEIxLCBrQzIpOworICBjb25zdCBpbnQxNng0X3QgYSA9IHZxYWRkX3MxNih2Z2V0X2xvd19zMTYocm93cy0+dmFsWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmdldF9sb3dfczE2KHJvd3MtPnZhbFsxXSkpOyAgIC8vIGluMCArIGluOAorICBjb25zdCBpbnQxNng0X3QgYiA9IHZxc3ViX3MxNih2Z2V0X2xvd19zMTYocm93cy0+dmFsWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmdldF9sb3dfczE2KHJvd3MtPnZhbFsxXSkpOyAgIC8vIGluMCAtIGluOAorICAvLyBjID0ga0MyICogaW40IC0ga0MxICogaW4xMgorICAvLyBkID0ga0MxICogaW40ICsga0MyICogaW4xMgorICBjb25zdCBpbnQxNng0X3QgYyA9IHZxc3ViX3MxNih2Z2V0X2xvd19zMTYoQzEpLCB2Z2V0X2hpZ2hfczE2KEMwKSk7CisgIGNvbnN0IGludDE2eDRfdCBkID0gdnFhZGRfczE2KHZnZXRfbG93X3MxNihDMCksIHZnZXRfaGlnaF9zMTYoQzEpKTsKKyAgY29uc3QgaW50MTZ4OF90IEQwID0gdmNvbWJpbmVfczE2KGEsIGIpOyAgICAgIC8vIEQwID0gYSB8IGIKKyAgY29uc3QgaW50MTZ4OF90IEQxID0gdmNvbWJpbmVfczE2KGQsIGMpOyAgICAgIC8vIEQxID0gZCB8IGMKKyAgY29uc3QgaW50MTZ4OF90IEUwID0gdnFhZGRxX3MxNihEMCwgRDEpOyAgICAgIC8vIGErZCB8IGIrYworICBjb25zdCBpbnQxNng4X3QgRV90bXAgPSB2cXN1YnFfczE2KEQwLCBEMSk7ICAgLy8gYS1kIHwgYi1jCisgIGNvbnN0IGludDE2eDhfdCBFMSA9IHZjb21iaW5lX3MxNih2Z2V0X2hpZ2hfczE2KEVfdG1wKSwgdmdldF9sb3dfczE2KEVfdG1wKSk7CisgIFRyYW5zcG9zZTh4Ml9ORU9OKEUwLCBFMSwgcm93cyk7Cit9CisKK3N0YXRpYyB2b2lkIFRyYW5zZm9ybU9uZV9ORU9OKGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QpIHsKKyAgaW50MTZ4OHgyX3Qgcm93czsKKyAgSU5JVF9WRUNUT1IyKHJvd3MsIHZsZDFxX3MxNihpbiArIDApLCB2bGQxcV9zMTYoaW4gKyA4KSk7CisgIFRyYW5zZm9ybVBhc3NfTkVPTigmcm93cyk7CisgIFRyYW5zZm9ybVBhc3NfTkVPTigmcm93cyk7CisgIEFkZDR4NF9ORU9OKHJvd3MudmFsWzBdLCByb3dzLnZhbFsxXSwgZHN0KTsKK30KKworI2Vsc2UKKworc3RhdGljIHZvaWQgVHJhbnNmb3JtT25lX05FT04oY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCkgeworICBjb25zdCBpbnQga0JQUyA9IEJQUzsKKyAgLy8ga0MxLCBrQzIuIFBhZGRlZCBiZWNhdXNlIHZsZDEuMTYgbG9hZHMgOCBieXRlcworICBjb25zdCBpbnQxNl90IGNvbnN0YW50c1s0XSA9IHsga0MxLCBrQzIsIDAsIDAgfTsKKyAgLyogQWRhcHRlZCBmcm9tIGxpYnZweDogdnA4L2NvbW1vbi9hcm0vbmVvbi9zaG9ydGlkY3Q0eDRsbG1fbmVvbi5hc20gKi8KKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgInZsZDEuMTYgICAgICAgICB7cTEsIHEyfSwgWyVbaW5dXSAgICAgICAgICAgXG4iCisgICAgInZsZDEuMTYgICAgICAgICB7ZDB9LCBbJVtjb25zdGFudHNdXSAgICAgICAgXG4iCisKKyAgICAvKiBkMjogaW5bMF0KKyAgICAgKiBkMzogaW5bOF0KKyAgICAgKiBkNDogaW5bNF0KKyAgICAgKiBkNTogaW5bMTJdCisgICAgICovCisgICAgInZzd3AgICAgICAgICAgICBkMywgZDQgICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAvKiBxOCA9IHtpbls0XSwgaW5bMTJdfSAqIGtDMSAqIDIgPj4gMTYKKyAgICAgKiBxOSA9IHtpbls0XSwgaW5bMTJdfSAqIGtDMiA+PiAxNgorICAgICAqLworICAgICJ2cWRtdWxoLnMxNiAgICAgcTgsIHEyLCBkMFswXSAgICAgICAgICAgICAgIFxuIgorICAgICJ2cWRtdWxoLnMxNiAgICAgcTksIHEyLCBkMFsxXSAgICAgICAgICAgICAgIFxuIgorCisgICAgLyogZDIyID0gYSA9IGluWzBdICsgaW5bOF0KKyAgICAgKiBkMjMgPSBiID0gaW5bMF0gLSBpbls4XQorICAgICAqLworICAgICJ2cWFkZC5zMTYgICAgICAgZDIyLCBkMiwgZDMgICAgICAgICAgICAgICAgIFxuIgorICAgICJ2cXN1Yi5zMTYgICAgICAgZDIzLCBkMiwgZDMgICAgICAgICAgICAgICAgIFxuIgorCisgICAgLyogVGhlIG11bHRpcGxpY2F0aW9uIHNob3VsZCBiZSB4ICoga0MxID4+IDE2CisgICAgICogSG93ZXZlciwgd2l0aCB2cWRtdWxoIHdlIGdldCB4ICoga0MxICogMiA+PiAxNgorICAgICAqIChtdWx0aXBseSwgZG91YmxlLCByZXR1cm4gaGlnaCBoYWxmKQorICAgICAqIFdlIGF2b2lkZWQgdGhpcyBpbiBrQzIgYnkgcHJlLXNoaWZ0aW5nIHRoZSBjb25zdGFudC4KKyAgICAgKiBxOCA9IGluWzRdL1sxMl0gKiBrQzEgPj4gMTYKKyAgICAgKi8KKyAgICAidnNoci5zMTYgICAgICAgIHE4LCBxOCwgIzEgICAgICAgICAgICAgICAgICBcbiIKKworICAgIC8qIEFkZCB7aW5bNF0sIGluWzEyXX0gYmFjayBhZnRlciB0aGUgbXVsdGlwbGljYXRpb24uIFRoaXMgaXMgaGFuZGxlZCBieQorICAgICAqIGFkZGluZyAxIDw8IDE2IHRvIGtDMSBpbiB0aGUgbGlid2VicCBDIGNvZGUuCisgICAgICovCisgICAgInZxYWRkLnMxNiAgICAgICBxOCwgcTIsIHE4ICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAvKiBkMjAgPSBjID0gaW5bNF0qa0MyIC0gaW5bMTJdKmtDMQorICAgICAqIGQyMSA9IGQgPSBpbls0XSprQzEgKyBpblsxMl0qa0MyCisgICAgICovCisgICAgInZxc3ViLnMxNiAgICAgICBkMjAsIGQxOCwgZDE3ICAgICAgICAgICAgICAgXG4iCisgICAgInZxYWRkLnMxNiAgICAgICBkMjEsIGQxOSwgZDE2ICAgICAgICAgICAgICAgXG4iCisKKyAgICAvKiBkMiA9IHRtcFswXSA9IGEgKyBkCisgICAgICogZDMgPSB0bXBbMV0gPSBiICsgYworICAgICAqIGQ0ID0gdG1wWzJdID0gYiAtIGMKKyAgICAgKiBkNSA9IHRtcFszXSA9IGEgLSBkCisgICAgICovCisgICAgInZxYWRkLnMxNiAgICAgICBkMiwgZDIyLCBkMjEgICAgICAgICAgICAgICAgXG4iCisgICAgInZxYWRkLnMxNiAgICAgICBkMywgZDIzLCBkMjAgICAgICAgICAgICAgICAgXG4iCisgICAgInZxc3ViLnMxNiAgICAgICBkNCwgZDIzLCBkMjAgICAgICAgICAgICAgICAgXG4iCisgICAgInZxc3ViLnMxNiAgICAgICBkNSwgZDIyLCBkMjEgICAgICAgICAgICAgICAgXG4iCisKKyAgICAidnppcC4xNiAgICAgICAgIHExLCBxMiAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAidnppcC4xNiAgICAgICAgIHExLCBxMiAgICAgICAgICAgICAgICAgICAgICBcbiIKKworICAgICJ2c3dwICAgICAgICAgICAgZDMsIGQ0ICAgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgLyogcTggPSB7dG1wWzRdLCB0bXBbMTJdfSAqIGtDMSAqIDIgPj4gMTYKKyAgICAgKiBxOSA9IHt0bXBbNF0sIHRtcFsxMl19ICoga0MyID4+IDE2CisgICAgICovCisgICAgInZxZG11bGguczE2ICAgICBxOCwgcTIsIGQwWzBdICAgICAgICAgICAgICAgXG4iCisgICAgInZxZG11bGguczE2ICAgICBxOSwgcTIsIGQwWzFdICAgICAgICAgICAgICAgXG4iCisKKyAgICAvKiBkMjIgPSBhID0gdG1wWzBdICsgdG1wWzhdCisgICAgICogZDIzID0gYiA9IHRtcFswXSAtIHRtcFs4XQorICAgICAqLworICAgICJ2cWFkZC5zMTYgICAgICAgZDIyLCBkMiwgZDMgICAgICAgICAgICAgICAgIFxuIgorICAgICJ2cXN1Yi5zMTYgICAgICAgZDIzLCBkMiwgZDMgICAgICAgICAgICAgICAgIFxuIgorCisgICAgLyogU2VlIGxvbmcgd2luZGVkIGV4cGxhbmF0aW9ucyBwcmlvciAqLworICAgICJ2c2hyLnMxNiAgICAgICAgcTgsIHE4LCAjMSAgICAgICAgICAgICAgICAgIFxuIgorICAgICJ2cWFkZC5zMTYgICAgICAgcTgsIHEyLCBxOCAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgLyogZDIwID0gYyA9IGluWzRdKmtDMiAtIGluWzEyXSprQzEKKyAgICAgKiBkMjEgPSBkID0gaW5bNF0qa0MxICsgaW5bMTJdKmtDMgorICAgICAqLworICAgICJ2cXN1Yi5zMTYgICAgICAgZDIwLCBkMTgsIGQxNyAgICAgICAgICAgICAgIFxuIgorICAgICJ2cWFkZC5zMTYgICAgICAgZDIxLCBkMTksIGQxNiAgICAgICAgICAgICAgIFxuIgorCisgICAgLyogZDIgPSB0bXBbMF0gPSBhICsgZAorICAgICAqIGQzID0gdG1wWzFdID0gYiArIGMKKyAgICAgKiBkNCA9IHRtcFsyXSA9IGIgLSBjCisgICAgICogZDUgPSB0bXBbM10gPSBhIC0gZAorICAgICAqLworICAgICJ2cWFkZC5zMTYgICAgICAgZDIsIGQyMiwgZDIxICAgICAgICAgICAgICAgIFxuIgorICAgICJ2cWFkZC5zMTYgICAgICAgZDMsIGQyMywgZDIwICAgICAgICAgICAgICAgIFxuIgorICAgICJ2cXN1Yi5zMTYgICAgICAgZDQsIGQyMywgZDIwICAgICAgICAgICAgICAgIFxuIgorICAgICJ2cXN1Yi5zMTYgICAgICAgZDUsIGQyMiwgZDIxICAgICAgICAgICAgICAgIFxuIgorCisgICAgInZsZDEuMzIgICAgICAgICBkNlswXSwgWyVbZHN0XV0sICVba0JQU10gICAgXG4iCisgICAgInZsZDEuMzIgICAgICAgICBkNlsxXSwgWyVbZHN0XV0sICVba0JQU10gICAgXG4iCisgICAgInZsZDEuMzIgICAgICAgICBkN1swXSwgWyVbZHN0XV0sICVba0JQU10gICAgXG4iCisgICAgInZsZDEuMzIgICAgICAgICBkN1sxXSwgWyVbZHN0XV0sICVba0JQU10gICAgXG4iCisKKyAgICAic3ViICAgICAgICAgJVtkc3RdLCAlW2RzdF0sICVba0JQU10sIGxzbCAjMiBcbiIKKworICAgIC8qICh2YWwpICsgNCA+PiAzICovCisgICAgInZyc2hyLnMxNiAgICAgICBkMiwgZDIsICMzICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZyc2hyLnMxNiAgICAgICBkMywgZDMsICMzICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZyc2hyLnMxNiAgICAgICBkNCwgZDQsICMzICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZyc2hyLnMxNiAgICAgICBkNSwgZDUsICMzICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAidnppcC4xNiAgICAgICAgIHExLCBxMiAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAidnppcC4xNiAgICAgICAgIHExLCBxMiAgICAgICAgICAgICAgICAgICAgICBcbiIKKworICAgIC8qIE11c3QgYWNjdW11bGF0ZSBiZWZvcmUgc2F0dXJhdGluZyAqLworICAgICJ2bW92bC51OCAgICAgICAgcTgsIGQ2ICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJ2bW92bC51OCAgICAgICAgcTksIGQ3ICAgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgInZxYWRkLnMxNiAgICAgICBxMSwgcTEsIHE4ICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZxYWRkLnMxNiAgICAgICBxMiwgcTIsIHE5ICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAidnFtb3Z1bi5zMTYgICAgIGQwLCBxMSAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAidnFtb3Z1bi5zMTYgICAgIGQxLCBxMiAgICAgICAgICAgICAgICAgICAgICBcbiIKKworICAgICJ2c3QxLjMyICAgICAgICAgZDBbMF0sIFslW2RzdF1dLCAlW2tCUFNdICAgIFxuIgorICAgICJ2c3QxLjMyICAgICAgICAgZDBbMV0sIFslW2RzdF1dLCAlW2tCUFNdICAgIFxuIgorICAgICJ2c3QxLjMyICAgICAgICAgZDFbMF0sIFslW2RzdF1dLCAlW2tCUFNdICAgIFxuIgorICAgICJ2c3QxLjMyICAgICAgICAgZDFbMV0sIFslW2RzdF1dICAgICAgICAgICAgIFxuIgorCisgICAgOiBbaW5dICIrciIoaW4pLCBbZHN0XSAiK3IiKGRzdCkgIC8qIG1vZGlmaWVkIHJlZ2lzdGVycyAqLworICAgIDogW2tCUFNdICJyIihrQlBTKSwgW2NvbnN0YW50c10gInIiKGNvbnN0YW50cykgIC8qIGNvbnN0YW50cyAqLworICAgIDogIm1lbW9yeSIsICJxMCIsICJxMSIsICJxMiIsICJxOCIsICJxOSIsICJxMTAiLCAicTExIiAgLyogY2xvYmJlcmVkICovCisgICk7Cit9CisKKyNlbmRpZiAgICAvLyBXRUJQX1VTRV9JTlRSSU5TSUNTCisKK3N0YXRpYyB2b2lkIFRyYW5zZm9ybVR3b19ORU9OKGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QsIGludCBkb190d28pIHsKKyAgVHJhbnNmb3JtT25lX05FT04oaW4sIGRzdCk7CisgIGlmIChkb190d28pIHsKKyAgICBUcmFuc2Zvcm1PbmVfTkVPTihpbiArIDE2LCBkc3QgKyA0KTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBUcmFuc2Zvcm1EQ19ORU9OKGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QpIHsKKyAgY29uc3QgaW50MTZ4OF90IERDID0gdmR1cHFfbl9zMTYoaW5bMF0pOworICBBZGQ0eDRfTkVPTihEQywgREMsIGRzdCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgU1RPUkVfV0hUKGRzdCwgY29sLCByb3dzKSBkbyB7ICAgICAgICAgICAgICAgICAgXAorICAqZHN0ID0gdmdldHFfbGFuZV9zMzIocm93cy52YWxbMF0sIGNvbCk7IChkc3QpICs9IDE2OyBcCisgICpkc3QgPSB2Z2V0cV9sYW5lX3MzMihyb3dzLnZhbFsxXSwgY29sKTsgKGRzdCkgKz0gMTY7IFwKKyAgKmRzdCA9IHZnZXRxX2xhbmVfczMyKHJvd3MudmFsWzJdLCBjb2wpOyAoZHN0KSArPSAxNjsgXAorICAqZHN0ID0gdmdldHFfbGFuZV9zMzIocm93cy52YWxbM10sIGNvbCk7IChkc3QpICs9IDE2OyBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBUcmFuc2Zvcm1XSFRfTkVPTihjb25zdCBpbnQxNl90KiBpbiwgaW50MTZfdCogb3V0KSB7CisgIGludDMyeDR4NF90IHRtcDsKKworICB7CisgICAgLy8gTG9hZCB0aGUgc291cmNlLgorICAgIGNvbnN0IGludDE2eDRfdCBpbjAwXzAzID0gdmxkMV9zMTYoaW4gKyAwKTsKKyAgICBjb25zdCBpbnQxNng0X3QgaW4wNF8wNyA9IHZsZDFfczE2KGluICsgNCk7CisgICAgY29uc3QgaW50MTZ4NF90IGluMDhfMTEgPSB2bGQxX3MxNihpbiArIDgpOworICAgIGNvbnN0IGludDE2eDRfdCBpbjEyXzE1ID0gdmxkMV9zMTYoaW4gKyAxMik7CisgICAgY29uc3QgaW50MzJ4NF90IGEwID0gdmFkZGxfczE2KGluMDBfMDMsIGluMTJfMTUpOyAgLy8gaW5bMC4uM10gKyBpblsxMi4uMTVdCisgICAgY29uc3QgaW50MzJ4NF90IGExID0gdmFkZGxfczE2KGluMDRfMDcsIGluMDhfMTEpOyAgLy8gaW5bNC4uN10gKyBpbls4Li4xMV0KKyAgICBjb25zdCBpbnQzMng0X3QgYTIgPSB2c3VibF9zMTYoaW4wNF8wNywgaW4wOF8xMSk7ICAvLyBpbls0Li43XSAtIGluWzguLjExXQorICAgIGNvbnN0IGludDMyeDRfdCBhMyA9IHZzdWJsX3MxNihpbjAwXzAzLCBpbjEyXzE1KTsgIC8vIGluWzAuLjNdIC0gaW5bMTIuLjE1XQorICAgIHRtcC52YWxbMF0gPSB2YWRkcV9zMzIoYTAsIGExKTsKKyAgICB0bXAudmFsWzFdID0gdmFkZHFfczMyKGEzLCBhMik7CisgICAgdG1wLnZhbFsyXSA9IHZzdWJxX3MzMihhMCwgYTEpOworICAgIHRtcC52YWxbM10gPSB2c3VicV9zMzIoYTMsIGEyKTsKKyAgICAvLyBBcnJhbmdlIHRoZSB0ZW1wb3JhcnkgcmVzdWx0cyBjb2x1bW4td2lzZS4KKyAgICB0bXAgPSBUcmFuc3Bvc2U0eDRfTkVPTih0bXApOworICB9CisKKyAgeworICAgIGNvbnN0IGludDMyeDRfdCBrQ3N0MyA9IHZkdXBxX25fczMyKDMpOworICAgIGNvbnN0IGludDMyeDRfdCBkYyA9IHZhZGRxX3MzMih0bXAudmFsWzBdLCBrQ3N0Myk7ICAvLyBhZGQgcm91bmRlcgorICAgIGNvbnN0IGludDMyeDRfdCBhMCA9IHZhZGRxX3MzMihkYywgdG1wLnZhbFszXSk7CisgICAgY29uc3QgaW50MzJ4NF90IGExID0gdmFkZHFfczMyKHRtcC52YWxbMV0sIHRtcC52YWxbMl0pOworICAgIGNvbnN0IGludDMyeDRfdCBhMiA9IHZzdWJxX3MzMih0bXAudmFsWzFdLCB0bXAudmFsWzJdKTsKKyAgICBjb25zdCBpbnQzMng0X3QgYTMgPSB2c3VicV9zMzIoZGMsIHRtcC52YWxbM10pOworCisgICAgdG1wLnZhbFswXSA9IHZhZGRxX3MzMihhMCwgYTEpOworICAgIHRtcC52YWxbMV0gPSB2YWRkcV9zMzIoYTMsIGEyKTsKKyAgICB0bXAudmFsWzJdID0gdnN1YnFfczMyKGEwLCBhMSk7CisgICAgdG1wLnZhbFszXSA9IHZzdWJxX3MzMihhMywgYTIpOworCisgICAgLy8gcmlnaHQgc2hpZnQgdGhlIHJlc3VsdHMgYnkgMy4KKyAgICB0bXAudmFsWzBdID0gdnNocnFfbl9zMzIodG1wLnZhbFswXSwgMyk7CisgICAgdG1wLnZhbFsxXSA9IHZzaHJxX25fczMyKHRtcC52YWxbMV0sIDMpOworICAgIHRtcC52YWxbMl0gPSB2c2hycV9uX3MzMih0bXAudmFsWzJdLCAzKTsKKyAgICB0bXAudmFsWzNdID0gdnNocnFfbl9zMzIodG1wLnZhbFszXSwgMyk7CisKKyAgICBTVE9SRV9XSFQob3V0LCAwLCB0bXApOworICAgIFNUT1JFX1dIVChvdXQsIDEsIHRtcCk7CisgICAgU1RPUkVfV0hUKG91dCwgMiwgdG1wKTsKKyAgICBTVE9SRV9XSFQob3V0LCAzLCB0bXApOworICB9Cit9CisKKyN1bmRlZiBTVE9SRV9XSFQKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBNVUwoYSwgYikgKCgoYSkgKiAoYikpID4+IDE2KQorc3RhdGljIHZvaWQgVHJhbnNmb3JtQUMzX05FT04oY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCkgeworICBzdGF0aWMgY29uc3QgaW50IGtDMV9mdWxsID0gMjAwOTEgKyAoMSA8PCAxNik7CisgIHN0YXRpYyBjb25zdCBpbnQga0MyX2Z1bGwgPSAzNTQ2ODsKKyAgY29uc3QgaW50MTZ4NF90IEEgPSB2bGQxX2R1cF9zMTYoaW4pOworICBjb25zdCBpbnQxNng0X3QgYzQgPSB2ZHVwX25fczE2KE1VTChpbls0XSwga0MyX2Z1bGwpKTsKKyAgY29uc3QgaW50MTZ4NF90IGQ0ID0gdmR1cF9uX3MxNihNVUwoaW5bNF0sIGtDMV9mdWxsKSk7CisgIGNvbnN0IGludCBjMSA9IE1VTChpblsxXSwga0MyX2Z1bGwpOworICBjb25zdCBpbnQgZDEgPSBNVUwoaW5bMV0sIGtDMV9mdWxsKTsKKyAgY29uc3QgdWludDY0X3QgY2QgPSAodWludDY0X3QpKCBkMSAmIDB4ZmZmZikgPDwgIDAgfAorICAgICAgICAgICAgICAgICAgICAgICh1aW50NjRfdCkoIGMxICYgMHhmZmZmKSA8PCAxNiB8CisgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ2NF90KSgtYzEgJiAweGZmZmYpIDw8IDMyIHwKKyAgICAgICAgICAgICAgICAgICAgICAodWludDY0X3QpKC1kMSAmIDB4ZmZmZikgPDwgNDg7CisgIGNvbnN0IGludDE2eDRfdCBDRCA9IHZjcmVhdGVfczE2KGNkKTsKKyAgY29uc3QgaW50MTZ4NF90IEIgPSB2cWFkZF9zMTYoQSwgQ0QpOworICBjb25zdCBpbnQxNng4X3QgbTBfbTEgPSB2Y29tYmluZV9zMTYodnFhZGRfczE2KEIsIGQ0KSwgdnFhZGRfczE2KEIsIGM0KSk7CisgIGNvbnN0IGludDE2eDhfdCBtMl9tMyA9IHZjb21iaW5lX3MxNih2cXN1Yl9zMTYoQiwgYzQpLCB2cXN1Yl9zMTYoQiwgZDQpKTsKKyAgQWRkNHg0X05FT04obTBfbTEsIG0yX20zLCBkc3QpOworfQorI3VuZGVmIE1VTAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gNHg0CisKK3N0YXRpYyB2b2lkIERDNF9ORU9OKHVpbnQ4X3QqIGRzdCkgeyAgICAvLyBEQworICBjb25zdCB1aW50OHg4X3QgQSA9IHZsZDFfdTgoZHN0IC0gQlBTKTsgIC8vIHRvcCByb3cKKyAgY29uc3QgdWludDE2eDRfdCBwMCA9IHZwYWRkbF91OChBKTsgIC8vIGNhc2NhZGluZyBzdW1tYXRpb24gb2YgdGhlIHRvcAorICBjb25zdCB1aW50MTZ4NF90IHAxID0gdnBhZGRfdTE2KHAwLCBwMCk7CisgIGNvbnN0IHVpbnQxNng4X3QgTDAgPSB2bW92bF91OCh2bGQxX3U4KGRzdCArIDAgKiBCUFMgLSAxKSk7CisgIGNvbnN0IHVpbnQxNng4X3QgTDEgPSB2bW92bF91OCh2bGQxX3U4KGRzdCArIDEgKiBCUFMgLSAxKSk7CisgIGNvbnN0IHVpbnQxNng4X3QgTDIgPSB2bW92bF91OCh2bGQxX3U4KGRzdCArIDIgKiBCUFMgLSAxKSk7CisgIGNvbnN0IHVpbnQxNng4X3QgTDMgPSB2bW92bF91OCh2bGQxX3U4KGRzdCArIDMgKiBCUFMgLSAxKSk7CisgIGNvbnN0IHVpbnQxNng4X3QgczAgPSB2YWRkcV91MTYoTDAsIEwxKTsKKyAgY29uc3QgdWludDE2eDhfdCBzMSA9IHZhZGRxX3UxNihMMiwgTDMpOworICBjb25zdCB1aW50MTZ4OF90IHMwMSA9IHZhZGRxX3UxNihzMCwgczEpOworICBjb25zdCB1aW50MTZ4OF90IHN1bSA9IHZhZGRxX3UxNihzMDEsIHZjb21iaW5lX3UxNihwMSwgcDEpKTsKKyAgY29uc3QgdWludDh4OF90IGRjMCA9IHZyc2hybl9uX3UxNihzdW0sIDMpOyAgLy8gKHN1bSArIDQpID4+IDMKKyAgY29uc3QgdWludDh4OF90IGRjID0gdmR1cF9sYW5lX3U4KGRjMCwgMCk7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgdnN0MV9sYW5lX3UzMigodWludDMyX3QqKShkc3QgKyBpICogQlBTKSwgdnJlaW50ZXJwcmV0X3UzMl91OChkYyksIDApOworICB9Cit9CisKKy8vIFRydWVNb3Rpb24gKDR4NCArIDh4OCkKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFRydWVNb3Rpb25fTkVPTih1aW50OF90KiBkc3QsIGludCBzaXplKSB7CisgIGNvbnN0IHVpbnQ4eDhfdCBUTCA9IHZsZDFfZHVwX3U4KGRzdCAtIEJQUyAtIDEpOyAgLy8gdG9wLWxlZnQgcGl4ZWwgJ0FbLTFdJworICBjb25zdCB1aW50OHg4X3QgVCA9IHZsZDFfdTgoZHN0IC0gQlBTKTsgIC8vIHRvcCByb3cgJ0FbMC4uM10nCisgIGNvbnN0IGludDE2eDhfdCBkID0gdnJlaW50ZXJwcmV0cV9zMTZfdTE2KHZzdWJsX3U4KFQsIFRMKSk7ICAvLyBBW2NdIC0gQVstMV0KKyAgaW50IHk7CisgIGZvciAoeSA9IDA7IHkgPCBzaXplOyB5ICs9IDQpIHsKKyAgICAvLyBsZWZ0IGVkZ2UKKyAgICBjb25zdCBpbnQxNng4X3QgTDAgPSBDb252ZXJ0VThUb1MxNl9ORU9OKHZsZDFfZHVwX3U4KGRzdCArIDAgKiBCUFMgLSAxKSk7CisgICAgY29uc3QgaW50MTZ4OF90IEwxID0gQ29udmVydFU4VG9TMTZfTkVPTih2bGQxX2R1cF91OChkc3QgKyAxICogQlBTIC0gMSkpOworICAgIGNvbnN0IGludDE2eDhfdCBMMiA9IENvbnZlcnRVOFRvUzE2X05FT04odmxkMV9kdXBfdTgoZHN0ICsgMiAqIEJQUyAtIDEpKTsKKyAgICBjb25zdCBpbnQxNng4X3QgTDMgPSBDb252ZXJ0VThUb1MxNl9ORU9OKHZsZDFfZHVwX3U4KGRzdCArIDMgKiBCUFMgLSAxKSk7CisgICAgY29uc3QgaW50MTZ4OF90IHIwID0gdmFkZHFfczE2KEwwLCBkKTsgIC8vIExbcl0gKyBBW2NdIC0gQVstMV0KKyAgICBjb25zdCBpbnQxNng4X3QgcjEgPSB2YWRkcV9zMTYoTDEsIGQpOworICAgIGNvbnN0IGludDE2eDhfdCByMiA9IHZhZGRxX3MxNihMMiwgZCk7CisgICAgY29uc3QgaW50MTZ4OF90IHIzID0gdmFkZHFfczE2KEwzLCBkKTsKKyAgICAvLyBTYXR1cmF0ZSBhbmQgc3RvcmUgdGhlIHJlc3VsdC4KKyAgICBjb25zdCB1aW50MzJ4Ml90IHIwX3UzMiA9IHZyZWludGVycHJldF91MzJfdTgodnFtb3Z1bl9zMTYocjApKTsKKyAgICBjb25zdCB1aW50MzJ4Ml90IHIxX3UzMiA9IHZyZWludGVycHJldF91MzJfdTgodnFtb3Z1bl9zMTYocjEpKTsKKyAgICBjb25zdCB1aW50MzJ4Ml90IHIyX3UzMiA9IHZyZWludGVycHJldF91MzJfdTgodnFtb3Z1bl9zMTYocjIpKTsKKyAgICBjb25zdCB1aW50MzJ4Ml90IHIzX3UzMiA9IHZyZWludGVycHJldF91MzJfdTgodnFtb3Z1bl9zMTYocjMpKTsKKyAgICBpZiAoc2l6ZSA9PSA0KSB7CisgICAgICB2c3QxX2xhbmVfdTMyKCh1aW50MzJfdCopKGRzdCArIDAgKiBCUFMpLCByMF91MzIsIDApOworICAgICAgdnN0MV9sYW5lX3UzMigodWludDMyX3QqKShkc3QgKyAxICogQlBTKSwgcjFfdTMyLCAwKTsKKyAgICAgIHZzdDFfbGFuZV91MzIoKHVpbnQzMl90KikoZHN0ICsgMiAqIEJQUyksIHIyX3UzMiwgMCk7CisgICAgICB2c3QxX2xhbmVfdTMyKCh1aW50MzJfdCopKGRzdCArIDMgKiBCUFMpLCByM191MzIsIDApOworICAgIH0gZWxzZSB7CisgICAgICB2c3QxX3UzMigodWludDMyX3QqKShkc3QgKyAwICogQlBTKSwgcjBfdTMyKTsKKyAgICAgIHZzdDFfdTMyKCh1aW50MzJfdCopKGRzdCArIDEgKiBCUFMpLCByMV91MzIpOworICAgICAgdnN0MV91MzIoKHVpbnQzMl90KikoZHN0ICsgMiAqIEJQUyksIHIyX3UzMik7CisgICAgICB2c3QxX3UzMigodWludDMyX3QqKShkc3QgKyAzICogQlBTKSwgcjNfdTMyKTsKKyAgICB9CisgICAgZHN0ICs9IDQgKiBCUFM7CisgIH0KK30KKworc3RhdGljIHZvaWQgVE00X05FT04odWludDhfdCogZHN0KSB7IFRydWVNb3Rpb25fTkVPTihkc3QsIDQpOyB9CisKK3N0YXRpYyB2b2lkIFZFNF9ORU9OKHVpbnQ4X3QqIGRzdCkgeyAgICAvLyB2ZXJ0aWNhbAorICAvLyBOQjogYXZvaWQgdmxkMV91NjQgaGVyZSBhcyBhbiBhbGlnbm1lbnQgaGludCBtYXkgYmUgYWRkZWQgLT4gU0lHQlVTLgorICBjb25zdCB1aW50NjR4MV90IEEwID0gdnJlaW50ZXJwcmV0X3U2NF91OCh2bGQxX3U4KGRzdCAtIEJQUyAtIDEpKTsgIC8vIHRvcCByb3cKKyAgY29uc3QgdWludDY0eDFfdCBBMSA9IHZzaHJfbl91NjQoQTAsIDgpOworICBjb25zdCB1aW50NjR4MV90IEEyID0gdnNocl9uX3U2NChBMCwgMTYpOworICBjb25zdCB1aW50OHg4X3QgQUJDREVGR0ggPSB2cmVpbnRlcnByZXRfdThfdTY0KEEwKTsKKyAgY29uc3QgdWludDh4OF90IEJDREVGR0gwID0gdnJlaW50ZXJwcmV0X3U4X3U2NChBMSk7CisgIGNvbnN0IHVpbnQ4eDhfdCBDREVGR0gwMCA9IHZyZWludGVycHJldF91OF91NjQoQTIpOworICBjb25zdCB1aW50OHg4X3QgYiA9IHZoYWRkX3U4KEFCQ0RFRkdILCBDREVGR0gwMCk7CisgIGNvbnN0IHVpbnQ4eDhfdCBhdmcgPSB2cmhhZGRfdTgoYiwgQkNERUZHSDApOworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeworICAgIHZzdDFfbGFuZV91MzIoKHVpbnQzMl90KikoZHN0ICsgaSAqIEJQUyksIHZyZWludGVycHJldF91MzJfdTgoYXZnKSwgMCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgUkQ0X05FT04odWludDhfdCogZHN0KSB7ICAgLy8gRG93bi1yaWdodAorICBjb25zdCB1aW50OHg4X3QgWEFCQ0RfdTggPSB2bGQxX3U4KGRzdCAtIEJQUyAtIDEpOworICBjb25zdCB1aW50NjR4MV90IFhBQkNEID0gdnJlaW50ZXJwcmV0X3U2NF91OChYQUJDRF91OCk7CisgIGNvbnN0IHVpbnQ2NHgxX3QgX19fX1hBQkMgPSB2c2hsX25fdTY0KFhBQkNELCAzMik7CisgIGNvbnN0IHVpbnQzMl90IEkgPSBkc3RbLTEgKyAwICogQlBTXTsKKyAgY29uc3QgdWludDMyX3QgSiA9IGRzdFstMSArIDEgKiBCUFNdOworICBjb25zdCB1aW50MzJfdCBLID0gZHN0Wy0xICsgMiAqIEJQU107CisgIGNvbnN0IHVpbnQzMl90IEwgPSBkc3RbLTEgKyAzICogQlBTXTsKKyAgY29uc3QgdWludDY0eDFfdCBMS0pJX19fXyA9IHZjcmVhdGVfdTY0KEwgfCAoSyA8PCA4KSB8IChKIDw8IDE2KSB8IChJIDw8IDI0KSk7CisgIGNvbnN0IHVpbnQ2NHgxX3QgTEtKSVhBQkMgPSB2b3JyX3U2NChMS0pJX19fXywgX19fX1hBQkMpOworICBjb25zdCB1aW50OHg4X3QgS0pJWEFCQ18gPSB2cmVpbnRlcnByZXRfdThfdTY0KHZzaHJfbl91NjQoTEtKSVhBQkMsIDgpKTsKKyAgY29uc3QgdWludDh4OF90IEpJWEFCQ19fID0gdnJlaW50ZXJwcmV0X3U4X3U2NCh2c2hyX25fdTY0KExLSklYQUJDLCAxNikpOworICBjb25zdCB1aW50OF90IEQgPSB2Z2V0X2xhbmVfdTgoWEFCQ0RfdTgsIDQpOworICBjb25zdCB1aW50OHg4X3QgSklYQUJDRF8gPSB2c2V0X2xhbmVfdTgoRCwgSklYQUJDX18sIDYpOworICBjb25zdCB1aW50OHg4X3QgTEtKSVhBQkNfdTggPSB2cmVpbnRlcnByZXRfdThfdTY0KExLSklYQUJDKTsKKyAgY29uc3QgdWludDh4OF90IGF2ZzEgPSB2aGFkZF91OChKSVhBQkNEXywgTEtKSVhBQkNfdTgpOworICBjb25zdCB1aW50OHg4X3QgYXZnMiA9IHZyaGFkZF91OChhdmcxLCBLSklYQUJDXyk7CisgIGNvbnN0IHVpbnQ2NHgxX3QgYXZnMl91NjQgPSB2cmVpbnRlcnByZXRfdTY0X3U4KGF2ZzIpOworICBjb25zdCB1aW50MzJ4Ml90IHIzID0gdnJlaW50ZXJwcmV0X3UzMl91OChhdmcyKTsKKyAgY29uc3QgdWludDMyeDJfdCByMiA9IHZyZWludGVycHJldF91MzJfdTY0KHZzaHJfbl91NjQoYXZnMl91NjQsIDgpKTsKKyAgY29uc3QgdWludDMyeDJfdCByMSA9IHZyZWludGVycHJldF91MzJfdTY0KHZzaHJfbl91NjQoYXZnMl91NjQsIDE2KSk7CisgIGNvbnN0IHVpbnQzMngyX3QgcjAgPSB2cmVpbnRlcnByZXRfdTMyX3U2NCh2c2hyX25fdTY0KGF2ZzJfdTY0LCAyNCkpOworICB2c3QxX2xhbmVfdTMyKCh1aW50MzJfdCopKGRzdCArIDAgKiBCUFMpLCByMCwgMCk7CisgIHZzdDFfbGFuZV91MzIoKHVpbnQzMl90KikoZHN0ICsgMSAqIEJQUyksIHIxLCAwKTsKKyAgdnN0MV9sYW5lX3UzMigodWludDMyX3QqKShkc3QgKyAyICogQlBTKSwgcjIsIDApOworICB2c3QxX2xhbmVfdTMyKCh1aW50MzJfdCopKGRzdCArIDMgKiBCUFMpLCByMywgMCk7Cit9CisKK3N0YXRpYyB2b2lkIExENF9ORU9OKHVpbnQ4X3QqIGRzdCkgeyAgICAvLyBEb3duLWxlZnQKKyAgLy8gTm90ZSB1c2luZyB0aGUgc2FtZSBzaGlmdCB0cmljayBhcyBWRTQoKSBpcyBzbG93ZXIgaGVyZS4KKyAgY29uc3QgdWludDh4OF90IEFCQ0RFRkdIID0gdmxkMV91OChkc3QgLSBCUFMgKyAwKTsKKyAgY29uc3QgdWludDh4OF90IEJDREVGR0gwID0gdmxkMV91OChkc3QgLSBCUFMgKyAxKTsKKyAgY29uc3QgdWludDh4OF90IENERUZHSDAwID0gdmxkMV91OChkc3QgLSBCUFMgKyAyKTsKKyAgY29uc3QgdWludDh4OF90IENERUZHSEgwID0gdnNldF9sYW5lX3U4KGRzdFstQlBTICsgN10sIENERUZHSDAwLCA2KTsKKyAgY29uc3QgdWludDh4OF90IGF2ZzEgPSB2aGFkZF91OChBQkNERUZHSCwgQ0RFRkdISDApOworICBjb25zdCB1aW50OHg4X3QgYXZnMiA9IHZyaGFkZF91OChhdmcxLCBCQ0RFRkdIMCk7CisgIGNvbnN0IHVpbnQ2NHgxX3QgYXZnMl91NjQgPSB2cmVpbnRlcnByZXRfdTY0X3U4KGF2ZzIpOworICBjb25zdCB1aW50MzJ4Ml90IHIwID0gdnJlaW50ZXJwcmV0X3UzMl91OChhdmcyKTsKKyAgY29uc3QgdWludDMyeDJfdCByMSA9IHZyZWludGVycHJldF91MzJfdTY0KHZzaHJfbl91NjQoYXZnMl91NjQsIDgpKTsKKyAgY29uc3QgdWludDMyeDJfdCByMiA9IHZyZWludGVycHJldF91MzJfdTY0KHZzaHJfbl91NjQoYXZnMl91NjQsIDE2KSk7CisgIGNvbnN0IHVpbnQzMngyX3QgcjMgPSB2cmVpbnRlcnByZXRfdTMyX3U2NCh2c2hyX25fdTY0KGF2ZzJfdTY0LCAyNCkpOworICB2c3QxX2xhbmVfdTMyKCh1aW50MzJfdCopKGRzdCArIDAgKiBCUFMpLCByMCwgMCk7CisgIHZzdDFfbGFuZV91MzIoKHVpbnQzMl90KikoZHN0ICsgMSAqIEJQUyksIHIxLCAwKTsKKyAgdnN0MV9sYW5lX3UzMigodWludDMyX3QqKShkc3QgKyAyICogQlBTKSwgcjIsIDApOworICB2c3QxX2xhbmVfdTMyKCh1aW50MzJfdCopKGRzdCArIDMgKiBCUFMpLCByMywgMCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDaHJvbWEKKworc3RhdGljIHZvaWQgVkU4dXZfTkVPTih1aW50OF90KiBkc3QpIHsgICAgLy8gdmVydGljYWwKKyAgY29uc3QgdWludDh4OF90IHRvcCA9IHZsZDFfdTgoZHN0IC0gQlBTKTsKKyAgaW50IGo7CisgIGZvciAoaiA9IDA7IGogPCA4OyArK2opIHsKKyAgICB2c3QxX3U4KGRzdCArIGogKiBCUFMsIHRvcCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgSEU4dXZfTkVPTih1aW50OF90KiBkc3QpIHsgICAgLy8gaG9yaXpvbnRhbAorICBpbnQgajsKKyAgZm9yIChqID0gMDsgaiA8IDg7ICsraikgeworICAgIGNvbnN0IHVpbnQ4eDhfdCBsZWZ0ID0gdmxkMV9kdXBfdTgoZHN0IC0gMSk7CisgICAgdnN0MV91OChkc3QsIGxlZnQpOworICAgIGRzdCArPSBCUFM7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgREM4X05FT04odWludDhfdCogZHN0LCBpbnQgZG9fdG9wLCBpbnQgZG9fbGVmdCkgeworICB1aW50MTZ4OF90IHN1bV90b3A7CisgIHVpbnQxNng4X3Qgc3VtX2xlZnQ7CisgIHVpbnQ4eDhfdCBkYzA7CisKKyAgaWYgKGRvX3RvcCkgeworICAgIGNvbnN0IHVpbnQ4eDhfdCBBID0gdmxkMV91OChkc3QgLSBCUFMpOyAgLy8gdG9wIHJvdworICAgIGNvbnN0IHVpbnQxNng0X3QgcDAgPSB2cGFkZGxfdTgoQSk7ICAvLyBjYXNjYWRpbmcgc3VtbWF0aW9uIG9mIHRoZSB0b3AKKyAgICBjb25zdCB1aW50MTZ4NF90IHAxID0gdnBhZGRfdTE2KHAwLCBwMCk7CisgICAgY29uc3QgdWludDE2eDRfdCBwMiA9IHZwYWRkX3UxNihwMSwgcDEpOworICAgIHN1bV90b3AgPSB2Y29tYmluZV91MTYocDIsIHAyKTsKKyAgfQorCisgIGlmIChkb19sZWZ0KSB7CisgICAgY29uc3QgdWludDE2eDhfdCBMMCA9IHZtb3ZsX3U4KHZsZDFfdTgoZHN0ICsgMCAqIEJQUyAtIDEpKTsKKyAgICBjb25zdCB1aW50MTZ4OF90IEwxID0gdm1vdmxfdTgodmxkMV91OChkc3QgKyAxICogQlBTIC0gMSkpOworICAgIGNvbnN0IHVpbnQxNng4X3QgTDIgPSB2bW92bF91OCh2bGQxX3U4KGRzdCArIDIgKiBCUFMgLSAxKSk7CisgICAgY29uc3QgdWludDE2eDhfdCBMMyA9IHZtb3ZsX3U4KHZsZDFfdTgoZHN0ICsgMyAqIEJQUyAtIDEpKTsKKyAgICBjb25zdCB1aW50MTZ4OF90IEw0ID0gdm1vdmxfdTgodmxkMV91OChkc3QgKyA0ICogQlBTIC0gMSkpOworICAgIGNvbnN0IHVpbnQxNng4X3QgTDUgPSB2bW92bF91OCh2bGQxX3U4KGRzdCArIDUgKiBCUFMgLSAxKSk7CisgICAgY29uc3QgdWludDE2eDhfdCBMNiA9IHZtb3ZsX3U4KHZsZDFfdTgoZHN0ICsgNiAqIEJQUyAtIDEpKTsKKyAgICBjb25zdCB1aW50MTZ4OF90IEw3ID0gdm1vdmxfdTgodmxkMV91OChkc3QgKyA3ICogQlBTIC0gMSkpOworICAgIGNvbnN0IHVpbnQxNng4X3QgczAgPSB2YWRkcV91MTYoTDAsIEwxKTsKKyAgICBjb25zdCB1aW50MTZ4OF90IHMxID0gdmFkZHFfdTE2KEwyLCBMMyk7CisgICAgY29uc3QgdWludDE2eDhfdCBzMiA9IHZhZGRxX3UxNihMNCwgTDUpOworICAgIGNvbnN0IHVpbnQxNng4X3QgczMgPSB2YWRkcV91MTYoTDYsIEw3KTsKKyAgICBjb25zdCB1aW50MTZ4OF90IHMwMSA9IHZhZGRxX3UxNihzMCwgczEpOworICAgIGNvbnN0IHVpbnQxNng4X3QgczIzID0gdmFkZHFfdTE2KHMyLCBzMyk7CisgICAgc3VtX2xlZnQgPSB2YWRkcV91MTYoczAxLCBzMjMpOworICB9CisKKyAgaWYgKGRvX3RvcCAmJiBkb19sZWZ0KSB7CisgICAgY29uc3QgdWludDE2eDhfdCBzdW0gPSB2YWRkcV91MTYoc3VtX2xlZnQsIHN1bV90b3ApOworICAgIGRjMCA9IHZyc2hybl9uX3UxNihzdW0sIDQpOworICB9IGVsc2UgaWYgKGRvX3RvcCkgeworICAgIGRjMCA9IHZyc2hybl9uX3UxNihzdW1fdG9wLCAzKTsKKyAgfSBlbHNlIGlmIChkb19sZWZ0KSB7CisgICAgZGMwID0gdnJzaHJuX25fdTE2KHN1bV9sZWZ0LCAzKTsKKyAgfSBlbHNlIHsKKyAgICBkYzAgPSB2ZHVwX25fdTgoMHg4MCk7CisgIH0KKworICB7CisgICAgY29uc3QgdWludDh4OF90IGRjID0gdmR1cF9sYW5lX3U4KGRjMCwgMCk7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IDg7ICsraSkgeworICAgICAgdnN0MV91MzIoKHVpbnQzMl90KikoZHN0ICsgaSAqIEJQUyksIHZyZWludGVycHJldF91MzJfdTgoZGMpKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgREM4dXZfTkVPTih1aW50OF90KiBkc3QpIHsgREM4X05FT04oZHN0LCAxLCAxKTsgfQorc3RhdGljIHZvaWQgREM4dXZOb1RvcF9ORU9OKHVpbnQ4X3QqIGRzdCkgeyBEQzhfTkVPTihkc3QsIDAsIDEpOyB9CitzdGF0aWMgdm9pZCBEQzh1dk5vTGVmdF9ORU9OKHVpbnQ4X3QqIGRzdCkgeyBEQzhfTkVPTihkc3QsIDEsIDApOyB9CitzdGF0aWMgdm9pZCBEQzh1dk5vVG9wTGVmdF9ORU9OKHVpbnQ4X3QqIGRzdCkgeyBEQzhfTkVPTihkc3QsIDAsIDApOyB9CisKK3N0YXRpYyB2b2lkIFRNOHV2X05FT04odWludDhfdCogZHN0KSB7IFRydWVNb3Rpb25fTkVPTihkc3QsIDgpOyB9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAxNngxNgorCitzdGF0aWMgdm9pZCBWRTE2X05FT04odWludDhfdCogZHN0KSB7ICAgICAvLyB2ZXJ0aWNhbAorICBjb25zdCB1aW50OHgxNl90IHRvcCA9IHZsZDFxX3U4KGRzdCAtIEJQUyk7CisgIGludCBqOworICBmb3IgKGogPSAwOyBqIDwgMTY7ICsraikgeworICAgIHZzdDFxX3U4KGRzdCArIGogKiBCUFMsIHRvcCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgSEUxNl9ORU9OKHVpbnQ4X3QqIGRzdCkgeyAgICAgLy8gaG9yaXpvbnRhbAorICBpbnQgajsKKyAgZm9yIChqID0gMDsgaiA8IDE2OyArK2opIHsKKyAgICBjb25zdCB1aW50OHgxNl90IGxlZnQgPSB2bGQxcV9kdXBfdTgoZHN0IC0gMSk7CisgICAgdnN0MXFfdTgoZHN0LCBsZWZ0KTsKKyAgICBkc3QgKz0gQlBTOworICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIERDMTZfTkVPTih1aW50OF90KiBkc3QsIGludCBkb190b3AsIGludCBkb19sZWZ0KSB7CisgIHVpbnQxNng4X3Qgc3VtX3RvcDsKKyAgdWludDE2eDhfdCBzdW1fbGVmdDsKKyAgdWludDh4OF90IGRjMDsKKworICBpZiAoZG9fdG9wKSB7CisgICAgY29uc3QgdWludDh4MTZfdCBBID0gdmxkMXFfdTgoZHN0IC0gQlBTKTsgIC8vIHRvcCByb3cKKyAgICBjb25zdCB1aW50MTZ4OF90IHAwID0gdnBhZGRscV91OChBKTsgIC8vIGNhc2NhZGluZyBzdW1tYXRpb24gb2YgdGhlIHRvcAorICAgIGNvbnN0IHVpbnQxNng0X3QgcDEgPSB2YWRkX3UxNih2Z2V0X2xvd191MTYocDApLCB2Z2V0X2hpZ2hfdTE2KHAwKSk7CisgICAgY29uc3QgdWludDE2eDRfdCBwMiA9IHZwYWRkX3UxNihwMSwgcDEpOworICAgIGNvbnN0IHVpbnQxNng0X3QgcDMgPSB2cGFkZF91MTYocDIsIHAyKTsKKyAgICBzdW1fdG9wID0gdmNvbWJpbmVfdTE2KHAzLCBwMyk7CisgIH0KKworICBpZiAoZG9fbGVmdCkgeworICAgIGludCBpOworICAgIHN1bV9sZWZ0ID0gdmR1cHFfbl91MTYoMCk7CisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpICs9IDgpIHsKKyAgICAgIGNvbnN0IHVpbnQxNng4X3QgTDAgPSB2bW92bF91OCh2bGQxX3U4KGRzdCArIChpICsgMCkgKiBCUFMgLSAxKSk7CisgICAgICBjb25zdCB1aW50MTZ4OF90IEwxID0gdm1vdmxfdTgodmxkMV91OChkc3QgKyAoaSArIDEpICogQlBTIC0gMSkpOworICAgICAgY29uc3QgdWludDE2eDhfdCBMMiA9IHZtb3ZsX3U4KHZsZDFfdTgoZHN0ICsgKGkgKyAyKSAqIEJQUyAtIDEpKTsKKyAgICAgIGNvbnN0IHVpbnQxNng4X3QgTDMgPSB2bW92bF91OCh2bGQxX3U4KGRzdCArIChpICsgMykgKiBCUFMgLSAxKSk7CisgICAgICBjb25zdCB1aW50MTZ4OF90IEw0ID0gdm1vdmxfdTgodmxkMV91OChkc3QgKyAoaSArIDQpICogQlBTIC0gMSkpOworICAgICAgY29uc3QgdWludDE2eDhfdCBMNSA9IHZtb3ZsX3U4KHZsZDFfdTgoZHN0ICsgKGkgKyA1KSAqIEJQUyAtIDEpKTsKKyAgICAgIGNvbnN0IHVpbnQxNng4X3QgTDYgPSB2bW92bF91OCh2bGQxX3U4KGRzdCArIChpICsgNikgKiBCUFMgLSAxKSk7CisgICAgICBjb25zdCB1aW50MTZ4OF90IEw3ID0gdm1vdmxfdTgodmxkMV91OChkc3QgKyAoaSArIDcpICogQlBTIC0gMSkpOworICAgICAgY29uc3QgdWludDE2eDhfdCBzMCA9IHZhZGRxX3UxNihMMCwgTDEpOworICAgICAgY29uc3QgdWludDE2eDhfdCBzMSA9IHZhZGRxX3UxNihMMiwgTDMpOworICAgICAgY29uc3QgdWludDE2eDhfdCBzMiA9IHZhZGRxX3UxNihMNCwgTDUpOworICAgICAgY29uc3QgdWludDE2eDhfdCBzMyA9IHZhZGRxX3UxNihMNiwgTDcpOworICAgICAgY29uc3QgdWludDE2eDhfdCBzMDEgPSB2YWRkcV91MTYoczAsIHMxKTsKKyAgICAgIGNvbnN0IHVpbnQxNng4X3QgczIzID0gdmFkZHFfdTE2KHMyLCBzMyk7CisgICAgICBjb25zdCB1aW50MTZ4OF90IHN1bSA9IHZhZGRxX3UxNihzMDEsIHMyMyk7CisgICAgICBzdW1fbGVmdCA9IHZhZGRxX3UxNihzdW1fbGVmdCwgc3VtKTsKKyAgICB9CisgIH0KKworICBpZiAoZG9fdG9wICYmIGRvX2xlZnQpIHsKKyAgICBjb25zdCB1aW50MTZ4OF90IHN1bSA9IHZhZGRxX3UxNihzdW1fbGVmdCwgc3VtX3RvcCk7CisgICAgZGMwID0gdnJzaHJuX25fdTE2KHN1bSwgNSk7CisgIH0gZWxzZSBpZiAoZG9fdG9wKSB7CisgICAgZGMwID0gdnJzaHJuX25fdTE2KHN1bV90b3AsIDQpOworICB9IGVsc2UgaWYgKGRvX2xlZnQpIHsKKyAgICBkYzAgPSB2cnNocm5fbl91MTYoc3VtX2xlZnQsIDQpOworICB9IGVsc2UgeworICAgIGRjMCA9IHZkdXBfbl91OCgweDgwKTsKKyAgfQorCisgIHsKKyAgICBjb25zdCB1aW50OHgxNl90IGRjID0gdmR1cHFfbGFuZV91OChkYzAsIDApOworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSB7CisgICAgICB2c3QxcV91OChkc3QgKyBpICogQlBTLCBkYyk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIERDMTZUb3BMZWZ0X05FT04odWludDhfdCogZHN0KSB7IERDMTZfTkVPTihkc3QsIDEsIDEpOyB9CitzdGF0aWMgdm9pZCBEQzE2Tm9Ub3BfTkVPTih1aW50OF90KiBkc3QpIHsgREMxNl9ORU9OKGRzdCwgMCwgMSk7IH0KK3N0YXRpYyB2b2lkIERDMTZOb0xlZnRfTkVPTih1aW50OF90KiBkc3QpIHsgREMxNl9ORU9OKGRzdCwgMSwgMCk7IH0KK3N0YXRpYyB2b2lkIERDMTZOb1RvcExlZnRfTkVPTih1aW50OF90KiBkc3QpIHsgREMxNl9ORU9OKGRzdCwgMCwgMCk7IH0KKworc3RhdGljIHZvaWQgVE0xNl9ORU9OKHVpbnQ4X3QqIGRzdCkgeworICBjb25zdCB1aW50OHg4X3QgVEwgPSB2bGQxX2R1cF91OChkc3QgLSBCUFMgLSAxKTsgIC8vIHRvcC1sZWZ0IHBpeGVsICdBWy0xXScKKyAgY29uc3QgdWludDh4MTZfdCBUID0gdmxkMXFfdTgoZHN0IC0gQlBTKTsgIC8vIHRvcCByb3cgJ0FbMC4uMTVdJworICAvLyBBW2NdIC0gQVstMV0KKyAgY29uc3QgaW50MTZ4OF90IGRfbG8gPSB2cmVpbnRlcnByZXRxX3MxNl91MTYodnN1YmxfdTgodmdldF9sb3dfdTgoVCksIFRMKSk7CisgIGNvbnN0IGludDE2eDhfdCBkX2hpID0gdnJlaW50ZXJwcmV0cV9zMTZfdTE2KHZzdWJsX3U4KHZnZXRfaGlnaF91OChUKSwgVEwpKTsKKyAgaW50IHk7CisgIGZvciAoeSA9IDA7IHkgPCAxNjsgeSArPSA0KSB7CisgICAgLy8gbGVmdCBlZGdlCisgICAgY29uc3QgaW50MTZ4OF90IEwwID0gQ29udmVydFU4VG9TMTZfTkVPTih2bGQxX2R1cF91OChkc3QgKyAwICogQlBTIC0gMSkpOworICAgIGNvbnN0IGludDE2eDhfdCBMMSA9IENvbnZlcnRVOFRvUzE2X05FT04odmxkMV9kdXBfdTgoZHN0ICsgMSAqIEJQUyAtIDEpKTsKKyAgICBjb25zdCBpbnQxNng4X3QgTDIgPSBDb252ZXJ0VThUb1MxNl9ORU9OKHZsZDFfZHVwX3U4KGRzdCArIDIgKiBCUFMgLSAxKSk7CisgICAgY29uc3QgaW50MTZ4OF90IEwzID0gQ29udmVydFU4VG9TMTZfTkVPTih2bGQxX2R1cF91OChkc3QgKyAzICogQlBTIC0gMSkpOworICAgIGNvbnN0IGludDE2eDhfdCByMF9sbyA9IHZhZGRxX3MxNihMMCwgZF9sbyk7ICAvLyBMW3JdICsgQVtjXSAtIEFbLTFdCisgICAgY29uc3QgaW50MTZ4OF90IHIxX2xvID0gdmFkZHFfczE2KEwxLCBkX2xvKTsKKyAgICBjb25zdCBpbnQxNng4X3QgcjJfbG8gPSB2YWRkcV9zMTYoTDIsIGRfbG8pOworICAgIGNvbnN0IGludDE2eDhfdCByM19sbyA9IHZhZGRxX3MxNihMMywgZF9sbyk7CisgICAgY29uc3QgaW50MTZ4OF90IHIwX2hpID0gdmFkZHFfczE2KEwwLCBkX2hpKTsKKyAgICBjb25zdCBpbnQxNng4X3QgcjFfaGkgPSB2YWRkcV9zMTYoTDEsIGRfaGkpOworICAgIGNvbnN0IGludDE2eDhfdCByMl9oaSA9IHZhZGRxX3MxNihMMiwgZF9oaSk7CisgICAgY29uc3QgaW50MTZ4OF90IHIzX2hpID0gdmFkZHFfczE2KEwzLCBkX2hpKTsKKyAgICAvLyBTYXR1cmF0ZSBhbmQgc3RvcmUgdGhlIHJlc3VsdC4KKyAgICBjb25zdCB1aW50OHgxNl90IHJvdzAgPSB2Y29tYmluZV91OCh2cW1vdnVuX3MxNihyMF9sbyksIHZxbW92dW5fczE2KHIwX2hpKSk7CisgICAgY29uc3QgdWludDh4MTZfdCByb3cxID0gdmNvbWJpbmVfdTgodnFtb3Z1bl9zMTYocjFfbG8pLCB2cW1vdnVuX3MxNihyMV9oaSkpOworICAgIGNvbnN0IHVpbnQ4eDE2X3Qgcm93MiA9IHZjb21iaW5lX3U4KHZxbW92dW5fczE2KHIyX2xvKSwgdnFtb3Z1bl9zMTYocjJfaGkpKTsKKyAgICBjb25zdCB1aW50OHgxNl90IHJvdzMgPSB2Y29tYmluZV91OCh2cW1vdnVuX3MxNihyM19sbyksIHZxbW92dW5fczE2KHIzX2hpKSk7CisgICAgdnN0MXFfdTgoZHN0ICsgMCAqIEJQUywgcm93MCk7CisgICAgdnN0MXFfdTgoZHN0ICsgMSAqIEJQUywgcm93MSk7CisgICAgdnN0MXFfdTgoZHN0ICsgMiAqIEJQUywgcm93Mik7CisgICAgdnN0MXFfdTgoZHN0ICsgMyAqIEJQUywgcm93Myk7CisgICAgZHN0ICs9IDQgKiBCUFM7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFZQOERzcEluaXRORU9OKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgVlA4RHNwSW5pdE5FT04odm9pZCkgeworICBWUDhUcmFuc2Zvcm0gPSBUcmFuc2Zvcm1Ud29fTkVPTjsKKyAgVlA4VHJhbnNmb3JtQUMzID0gVHJhbnNmb3JtQUMzX05FT047CisgIFZQOFRyYW5zZm9ybURDID0gVHJhbnNmb3JtRENfTkVPTjsKKyAgVlA4VHJhbnNmb3JtV0hUID0gVHJhbnNmb3JtV0hUX05FT047CisKKyAgVlA4VkZpbHRlcjE2ID0gVkZpbHRlcjE2X05FT047CisgIFZQOFZGaWx0ZXIxNmkgPSBWRmlsdGVyMTZpX05FT047CisgIFZQOEhGaWx0ZXIxNiA9IEhGaWx0ZXIxNl9ORU9OOworI2lmICFkZWZpbmVkKFdPUktfQVJPVU5EX0dDQykKKyAgVlA4SEZpbHRlcjE2aSA9IEhGaWx0ZXIxNmlfTkVPTjsKKyNlbmRpZgorICBWUDhWRmlsdGVyOCA9IFZGaWx0ZXI4X05FT047CisgIFZQOFZGaWx0ZXI4aSA9IFZGaWx0ZXI4aV9ORU9OOworI2lmICFkZWZpbmVkKFdPUktfQVJPVU5EX0dDQykKKyAgVlA4SEZpbHRlcjggPSBIRmlsdGVyOF9ORU9OOworICBWUDhIRmlsdGVyOGkgPSBIRmlsdGVyOGlfTkVPTjsKKyNlbmRpZgorICBWUDhTaW1wbGVWRmlsdGVyMTYgPSBTaW1wbGVWRmlsdGVyMTZfTkVPTjsKKyAgVlA4U2ltcGxlSEZpbHRlcjE2ID0gU2ltcGxlSEZpbHRlcjE2X05FT047CisgIFZQOFNpbXBsZVZGaWx0ZXIxNmkgPSBTaW1wbGVWRmlsdGVyMTZpX05FT047CisgIFZQOFNpbXBsZUhGaWx0ZXIxNmkgPSBTaW1wbGVIRmlsdGVyMTZpX05FT047CisKKyAgVlA4UHJlZEx1bWE0WzBdID0gREM0X05FT047CisgIFZQOFByZWRMdW1hNFsxXSA9IFRNNF9ORU9OOworICBWUDhQcmVkTHVtYTRbMl0gPSBWRTRfTkVPTjsKKyAgVlA4UHJlZEx1bWE0WzRdID0gUkQ0X05FT047CisgIFZQOFByZWRMdW1hNFs2XSA9IExENF9ORU9OOworCisgIFZQOFByZWRMdW1hMTZbMF0gPSBEQzE2VG9wTGVmdF9ORU9OOworICBWUDhQcmVkTHVtYTE2WzFdID0gVE0xNl9ORU9OOworICBWUDhQcmVkTHVtYTE2WzJdID0gVkUxNl9ORU9OOworICBWUDhQcmVkTHVtYTE2WzNdID0gSEUxNl9ORU9OOworICBWUDhQcmVkTHVtYTE2WzRdID0gREMxNk5vVG9wX05FT047CisgIFZQOFByZWRMdW1hMTZbNV0gPSBEQzE2Tm9MZWZ0X05FT047CisgIFZQOFByZWRMdW1hMTZbNl0gPSBEQzE2Tm9Ub3BMZWZ0X05FT047CisKKyAgVlA4UHJlZENocm9tYThbMF0gPSBEQzh1dl9ORU9OOworICBWUDhQcmVkQ2hyb21hOFsxXSA9IFRNOHV2X05FT047CisgIFZQOFByZWRDaHJvbWE4WzJdID0gVkU4dXZfTkVPTjsKKyAgVlA4UHJlZENocm9tYThbM10gPSBIRTh1dl9ORU9OOworICBWUDhQcmVkQ2hyb21hOFs0XSA9IERDOHV2Tm9Ub3BfTkVPTjsKKyAgVlA4UHJlZENocm9tYThbNV0gPSBEQzh1dk5vTGVmdF9ORU9OOworICBWUDhQcmVkQ2hyb21hOFs2XSA9IERDOHV2Tm9Ub3BMZWZ0X05FT047Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfTkVPTgorCitXRUJQX0RTUF9JTklUX1NUVUIoVlA4RHNwSW5pdE5FT04pCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfTkVPTgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9kZWNfc3NlMi5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9kZWNfc3NlMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzODQwZmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2RlY19zc2UyLmMKQEAgLTAsMCArMSwxMjI3IEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU1NFMiB2ZXJzaW9uIG9mIHNvbWUgZGVjb2RpbmcgZnVuY3Rpb25zIChpZGN0LCBsb29wIGZpbHRlcmluZykuCisvLworLy8gQXV0aG9yOiBzb21uYXRoQGdvb2dsZS5jb20gKFNvbW5hdGggQmFuZXJqZWUpCisvLyAgICAgICAgIGNkdXZpdmllckBnb29nbGUuY29tIChDaHJpc3RpYW4gRHV2aXZpZXIpCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0UyKQorCisvLyBUaGUgMy1jb2VmZiBzcGFyc2UgdHJhbnNmb3JtIGluIFNTRTIgaXMgbm90IHJlYWxseSBmYXN0ZXIgdGhhbiB0aGUgcGxhaW4tQworLy8gb25lIGl0IHNlZW1zID0+IGRpc2FibGUgaXQgYnkgZGVmYXVsdC4gVW5jb21tZW50IHRoZSBmb2xsb3dpbmcgdG8gZW5hYmxlOgorI2lmICFkZWZpbmVkKFVTRV9UUkFOU0ZPUk1fQUMzKQorI2RlZmluZSBVU0VfVFJBTlNGT1JNX0FDMyAwICAgLy8gQUxURVJOQVRFX0NPREUKKyNlbmRpZgorCisjaW5jbHVkZSA8ZW1taW50cmluLmg+CisjaW5jbHVkZSAic3JjL2RzcC9jb21tb25fc3NlMi5oIgorI2luY2x1ZGUgInNyYy9kZWMvdnA4aV9kZWMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRyYW5zZm9ybXMgKFBhcmFncmFwaCAxNC40KQorCitzdGF0aWMgdm9pZCBUcmFuc2Zvcm1fU1NFMihjb25zdCBpbnQxNl90KiBpbiwgdWludDhfdCogZHN0LCBpbnQgZG9fdHdvKSB7CisgIC8vIFRoaXMgaW1wbGVtZW50YXRpb24gbWFrZXMgdXNlIG9mIDE2LWJpdCBmaXhlZCBwb2ludCB2ZXJzaW9ucyBvZiB0d28KKyAgLy8gbXVsdGlwbHkgY29uc3RhbnRzOgorICAvLyAgICBLMSA9IHNxcnQoMikgKiBjb3MgKHBpLzgpIH49IDg1NjI3IC8gMl4xNgorICAvLyAgICBLMiA9IHNxcnQoMikgKiBzaW4gKHBpLzgpIH49IDM1NDY4IC8gMl4xNgorICAvLworICAvLyBUbyBiZSBhYmxlIHRvIHVzZSBzaWduZWQgMTYtYml0IGludGVnZXJzLCB3ZSB1c2UgdGhlIGZvbGxvd2luZyB0cmljayB0bworICAvLyBoYXZlIGNvbnN0YW50cyB3aXRoaW4gcmFuZ2U6CisgIC8vIC0gQXNzb2NpYXRlZCBjb25zdGFudHMgYXJlIG9idGFpbmVkIGJ5IHN1YnRyYWN0aW5nIHRoZSAxNi1iaXQgZml4ZWQgcG9pbnQKKyAgLy8gICB2ZXJzaW9uIG9mIG9uZToKKyAgLy8gICAgICBrID0gSyAtICgxIDw8IDE2KSAgPT4gIEsgPSBrICsgKDEgPDwgMTYpCisgIC8vICAgICAgSzEgPSA4NTI2NyAgPT4gIGsxID0gIDIwMDkxCisgIC8vICAgICAgSzIgPSAzNTQ2OCAgPT4gIGsyID0gLTMwMDY4CisgIC8vIC0gVGhlIG11bHRpcGxpY2F0aW9uIG9mIGEgdmFyaWFibGUgYnkgYSBjb25zdGFudCBiZWNvbWUgdGhlIHN1bSBvZiB0aGUKKyAgLy8gICB2YXJpYWJsZSBhbmQgdGhlIG11bHRpcGxpY2F0aW9uIG9mIHRoYXQgdmFyaWFibGUgYnkgdGhlIGFzc29jaWF0ZWQKKyAgLy8gICBjb25zdGFudDoKKyAgLy8gICAgICAoeCAqIEspID4+IDE2ID0gKHggKiAoayArICgxIDw8IDE2KSkpID4+IDE2ID0gKCh4ICogayApID4+IDE2KSArIHgKKyAgY29uc3QgX19tMTI4aSBrMSA9IF9tbV9zZXQxX2VwaTE2KDIwMDkxKTsKKyAgY29uc3QgX19tMTI4aSBrMiA9IF9tbV9zZXQxX2VwaTE2KC0zMDA2OCk7CisgIF9fbTEyOGkgVDAsIFQxLCBUMiwgVDM7CisKKyAgLy8gTG9hZCBhbmQgY29uY2F0ZW5hdGUgdGhlIHRyYW5zZm9ybSBjb2VmZmljaWVudHMgKHdlJ2xsIGRvIHR3byB0cmFuc2Zvcm1zCisgIC8vIGluIHBhcmFsbGVsKS4gSW4gdGhlIGNhc2Ugb2Ygb25seSBvbmUgdHJhbnNmb3JtLCB0aGUgc2Vjb25kIGhhbGYgb2YgdGhlCisgIC8vIHZlY3RvcnMgd2lsbCBqdXN0IGNvbnRhaW4gcmFuZG9tIHZhbHVlIHdlJ2xsIG5ldmVyIHVzZSBub3Igc3RvcmUuCisgIF9fbTEyOGkgaW4wLCBpbjEsIGluMiwgaW4zOworICB7CisgICAgaW4wID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmaW5bMF0pOworICAgIGluMSA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmluWzRdKTsKKyAgICBpbjIgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZpbls4XSk7CisgICAgaW4zID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmaW5bMTJdKTsKKyAgICAvLyBhMDAgYTEwIGEyMCBhMzAgICB4IHggeCB4CisgICAgLy8gYTAxIGExMSBhMjEgYTMxICAgeCB4IHggeAorICAgIC8vIGEwMiBhMTIgYTIyIGEzMiAgIHggeCB4IHgKKyAgICAvLyBhMDMgYTEzIGEyMyBhMzMgICB4IHggeCB4CisgICAgaWYgKGRvX3R3bykgeworICAgICAgY29uc3QgX19tMTI4aSBpbkIwID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmaW5bMTZdKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgaW5CMSA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmluWzIwXSk7CisgICAgICBjb25zdCBfX20xMjhpIGluQjIgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZpblsyNF0pOworICAgICAgY29uc3QgX19tMTI4aSBpbkIzID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmaW5bMjhdKTsKKyAgICAgIGluMCA9IF9tbV91bnBhY2tsb19lcGk2NChpbjAsIGluQjApOworICAgICAgaW4xID0gX21tX3VucGFja2xvX2VwaTY0KGluMSwgaW5CMSk7CisgICAgICBpbjIgPSBfbW1fdW5wYWNrbG9fZXBpNjQoaW4yLCBpbkIyKTsKKyAgICAgIGluMyA9IF9tbV91bnBhY2tsb19lcGk2NChpbjMsIGluQjMpOworICAgICAgLy8gYTAwIGExMCBhMjAgYTMwICAgYjAwIGIxMCBiMjAgYjMwCisgICAgICAvLyBhMDEgYTExIGEyMSBhMzEgICBiMDEgYjExIGIyMSBiMzEKKyAgICAgIC8vIGEwMiBhMTIgYTIyIGEzMiAgIGIwMiBiMTIgYjIyIGIzMgorICAgICAgLy8gYTAzIGExMyBhMjMgYTMzICAgYjAzIGIxMyBiMjMgYjMzCisgICAgfQorICB9CisKKyAgLy8gVmVydGljYWwgcGFzcyBhbmQgc3Vic2VxdWVudCB0cmFuc3Bvc2UuCisgIHsKKyAgICAvLyBGaXJzdCBwYXNzLCBjIGFuZCBkIGNhbGN1bGF0aW9ucyBhcmUgbG9uZ2VyIGJlY2F1c2Ugb2YgdGhlICJ0cmljayIKKyAgICAvLyBtdWx0aXBsaWNhdGlvbnMuCisgICAgY29uc3QgX19tMTI4aSBhID0gX21tX2FkZF9lcGkxNihpbjAsIGluMik7CisgICAgY29uc3QgX19tMTI4aSBiID0gX21tX3N1Yl9lcGkxNihpbjAsIGluMik7CisgICAgLy8gYyA9IE1VTChpbjEsIEsyKSAtIE1VTChpbjMsIEsxKSA9IE1VTChpbjEsIGsyKSAtIE1VTChpbjMsIGsxKSArIGluMSAtIGluMworICAgIGNvbnN0IF9fbTEyOGkgYzEgPSBfbW1fbXVsaGlfZXBpMTYoaW4xLCBrMik7CisgICAgY29uc3QgX19tMTI4aSBjMiA9IF9tbV9tdWxoaV9lcGkxNihpbjMsIGsxKTsKKyAgICBjb25zdCBfX20xMjhpIGMzID0gX21tX3N1Yl9lcGkxNihpbjEsIGluMyk7CisgICAgY29uc3QgX19tMTI4aSBjNCA9IF9tbV9zdWJfZXBpMTYoYzEsIGMyKTsKKyAgICBjb25zdCBfX20xMjhpIGMgPSBfbW1fYWRkX2VwaTE2KGMzLCBjNCk7CisgICAgLy8gZCA9IE1VTChpbjEsIEsxKSArIE1VTChpbjMsIEsyKSA9IE1VTChpbjEsIGsxKSArIE1VTChpbjMsIGsyKSArIGluMSArIGluMworICAgIGNvbnN0IF9fbTEyOGkgZDEgPSBfbW1fbXVsaGlfZXBpMTYoaW4xLCBrMSk7CisgICAgY29uc3QgX19tMTI4aSBkMiA9IF9tbV9tdWxoaV9lcGkxNihpbjMsIGsyKTsKKyAgICBjb25zdCBfX20xMjhpIGQzID0gX21tX2FkZF9lcGkxNihpbjEsIGluMyk7CisgICAgY29uc3QgX19tMTI4aSBkNCA9IF9tbV9hZGRfZXBpMTYoZDEsIGQyKTsKKyAgICBjb25zdCBfX20xMjhpIGQgPSBfbW1fYWRkX2VwaTE2KGQzLCBkNCk7CisKKyAgICAvLyBTZWNvbmQgcGFzcy4KKyAgICBjb25zdCBfX20xMjhpIHRtcDAgPSBfbW1fYWRkX2VwaTE2KGEsIGQpOworICAgIGNvbnN0IF9fbTEyOGkgdG1wMSA9IF9tbV9hZGRfZXBpMTYoYiwgYyk7CisgICAgY29uc3QgX19tMTI4aSB0bXAyID0gX21tX3N1Yl9lcGkxNihiLCBjKTsKKyAgICBjb25zdCBfX20xMjhpIHRtcDMgPSBfbW1fc3ViX2VwaTE2KGEsIGQpOworCisgICAgLy8gVHJhbnNwb3NlIHRoZSB0d28gNHg0LgorICAgIFZQOFRyYW5zcG9zZV8yXzR4NF8xNmIoJnRtcDAsICZ0bXAxLCAmdG1wMiwgJnRtcDMsICZUMCwgJlQxLCAmVDIsICZUMyk7CisgIH0KKworICAvLyBIb3Jpem9udGFsIHBhc3MgYW5kIHN1YnNlcXVlbnQgdHJhbnNwb3NlLgorICB7CisgICAgLy8gRmlyc3QgcGFzcywgYyBhbmQgZCBjYWxjdWxhdGlvbnMgYXJlIGxvbmdlciBiZWNhdXNlIG9mIHRoZSAidHJpY2siCisgICAgLy8gbXVsdGlwbGljYXRpb25zLgorICAgIGNvbnN0IF9fbTEyOGkgZm91ciA9IF9tbV9zZXQxX2VwaTE2KDQpOworICAgIGNvbnN0IF9fbTEyOGkgZGMgPSBfbW1fYWRkX2VwaTE2KFQwLCBmb3VyKTsKKyAgICBjb25zdCBfX20xMjhpIGEgPSAgX21tX2FkZF9lcGkxNihkYywgVDIpOworICAgIGNvbnN0IF9fbTEyOGkgYiA9ICBfbW1fc3ViX2VwaTE2KGRjLCBUMik7CisgICAgLy8gYyA9IE1VTChUMSwgSzIpIC0gTVVMKFQzLCBLMSkgPSBNVUwoVDEsIGsyKSAtIE1VTChUMywgazEpICsgVDEgLSBUMworICAgIGNvbnN0IF9fbTEyOGkgYzEgPSBfbW1fbXVsaGlfZXBpMTYoVDEsIGsyKTsKKyAgICBjb25zdCBfX20xMjhpIGMyID0gX21tX211bGhpX2VwaTE2KFQzLCBrMSk7CisgICAgY29uc3QgX19tMTI4aSBjMyA9IF9tbV9zdWJfZXBpMTYoVDEsIFQzKTsKKyAgICBjb25zdCBfX20xMjhpIGM0ID0gX21tX3N1Yl9lcGkxNihjMSwgYzIpOworICAgIGNvbnN0IF9fbTEyOGkgYyA9IF9tbV9hZGRfZXBpMTYoYzMsIGM0KTsKKyAgICAvLyBkID0gTVVMKFQxLCBLMSkgKyBNVUwoVDMsIEsyKSA9IE1VTChUMSwgazEpICsgTVVMKFQzLCBrMikgKyBUMSArIFQzCisgICAgY29uc3QgX19tMTI4aSBkMSA9IF9tbV9tdWxoaV9lcGkxNihUMSwgazEpOworICAgIGNvbnN0IF9fbTEyOGkgZDIgPSBfbW1fbXVsaGlfZXBpMTYoVDMsIGsyKTsKKyAgICBjb25zdCBfX20xMjhpIGQzID0gX21tX2FkZF9lcGkxNihUMSwgVDMpOworICAgIGNvbnN0IF9fbTEyOGkgZDQgPSBfbW1fYWRkX2VwaTE2KGQxLCBkMik7CisgICAgY29uc3QgX19tMTI4aSBkID0gX21tX2FkZF9lcGkxNihkMywgZDQpOworCisgICAgLy8gU2Vjb25kIHBhc3MuCisgICAgY29uc3QgX19tMTI4aSB0bXAwID0gX21tX2FkZF9lcGkxNihhLCBkKTsKKyAgICBjb25zdCBfX20xMjhpIHRtcDEgPSBfbW1fYWRkX2VwaTE2KGIsIGMpOworICAgIGNvbnN0IF9fbTEyOGkgdG1wMiA9IF9tbV9zdWJfZXBpMTYoYiwgYyk7CisgICAgY29uc3QgX19tMTI4aSB0bXAzID0gX21tX3N1Yl9lcGkxNihhLCBkKTsKKyAgICBjb25zdCBfX20xMjhpIHNoaWZ0ZWQwID0gX21tX3NyYWlfZXBpMTYodG1wMCwgMyk7CisgICAgY29uc3QgX19tMTI4aSBzaGlmdGVkMSA9IF9tbV9zcmFpX2VwaTE2KHRtcDEsIDMpOworICAgIGNvbnN0IF9fbTEyOGkgc2hpZnRlZDIgPSBfbW1fc3JhaV9lcGkxNih0bXAyLCAzKTsKKyAgICBjb25zdCBfX20xMjhpIHNoaWZ0ZWQzID0gX21tX3NyYWlfZXBpMTYodG1wMywgMyk7CisKKyAgICAvLyBUcmFuc3Bvc2UgdGhlIHR3byA0eDQuCisgICAgVlA4VHJhbnNwb3NlXzJfNHg0XzE2Yigmc2hpZnRlZDAsICZzaGlmdGVkMSwgJnNoaWZ0ZWQyLCAmc2hpZnRlZDMsICZUMCwgJlQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJlQyLCAmVDMpOworICB9CisKKyAgLy8gQWRkIGludmVyc2UgdHJhbnNmb3JtIHRvICdkc3QnIGFuZCBzdG9yZS4KKyAgeworICAgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgICAgLy8gTG9hZCB0aGUgcmVmZXJlbmNlKHMpLgorICAgIF9fbTEyOGkgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MzsKKyAgICBpZiAoZG9fdHdvKSB7CisgICAgICAvLyBMb2FkIGVpZ2h0IGJ5dGVzL3BpeGVscyBwZXIgbGluZS4KKyAgICAgIGRzdDAgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKShkc3QgKyAwICogQlBTKSk7CisgICAgICBkc3QxID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikoZHN0ICsgMSAqIEJQUykpOworICAgICAgZHN0MiA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopKGRzdCArIDIgKiBCUFMpKTsKKyAgICAgIGRzdDMgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKShkc3QgKyAzICogQlBTKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIExvYWQgZm91ciBieXRlcy9waXhlbHMgcGVyIGxpbmUuCisgICAgICBkc3QwID0gX21tX2N2dHNpMzJfc2kxMjgoV2ViUE1lbVRvVWludDMyKGRzdCArIDAgKiBCUFMpKTsKKyAgICAgIGRzdDEgPSBfbW1fY3Z0c2kzMl9zaTEyOChXZWJQTWVtVG9VaW50MzIoZHN0ICsgMSAqIEJQUykpOworICAgICAgZHN0MiA9IF9tbV9jdnRzaTMyX3NpMTI4KFdlYlBNZW1Ub1VpbnQzMihkc3QgKyAyICogQlBTKSk7CisgICAgICBkc3QzID0gX21tX2N2dHNpMzJfc2kxMjgoV2ViUE1lbVRvVWludDMyKGRzdCArIDMgKiBCUFMpKTsKKyAgICB9CisgICAgLy8gQ29udmVydCB0byAxNmIuCisgICAgZHN0MCA9IF9tbV91bnBhY2tsb19lcGk4KGRzdDAsIHplcm8pOworICAgIGRzdDEgPSBfbW1fdW5wYWNrbG9fZXBpOChkc3QxLCB6ZXJvKTsKKyAgICBkc3QyID0gX21tX3VucGFja2xvX2VwaTgoZHN0MiwgemVybyk7CisgICAgZHN0MyA9IF9tbV91bnBhY2tsb19lcGk4KGRzdDMsIHplcm8pOworICAgIC8vIEFkZCB0aGUgaW52ZXJzZSB0cmFuc2Zvcm0ocykuCisgICAgZHN0MCA9IF9tbV9hZGRfZXBpMTYoZHN0MCwgVDApOworICAgIGRzdDEgPSBfbW1fYWRkX2VwaTE2KGRzdDEsIFQxKTsKKyAgICBkc3QyID0gX21tX2FkZF9lcGkxNihkc3QyLCBUMik7CisgICAgZHN0MyA9IF9tbV9hZGRfZXBpMTYoZHN0MywgVDMpOworICAgIC8vIFVuc2lnbmVkIHNhdHVyYXRlIHRvIDhiLgorICAgIGRzdDAgPSBfbW1fcGFja3VzX2VwaTE2KGRzdDAsIGRzdDApOworICAgIGRzdDEgPSBfbW1fcGFja3VzX2VwaTE2KGRzdDEsIGRzdDEpOworICAgIGRzdDIgPSBfbW1fcGFja3VzX2VwaTE2KGRzdDIsIGRzdDIpOworICAgIGRzdDMgPSBfbW1fcGFja3VzX2VwaTE2KGRzdDMsIGRzdDMpOworICAgIC8vIFN0b3JlIHRoZSByZXN1bHRzLgorICAgIGlmIChkb190d28pIHsKKyAgICAgIC8vIFN0b3JlIGVpZ2h0IGJ5dGVzL3BpeGVscyBwZXIgbGluZS4KKyAgICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKShkc3QgKyAwICogQlBTKSwgZHN0MCk7CisgICAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikoZHN0ICsgMSAqIEJQUyksIGRzdDEpOworICAgICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopKGRzdCArIDIgKiBCUFMpLCBkc3QyKTsKKyAgICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKShkc3QgKyAzICogQlBTKSwgZHN0Myk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFN0b3JlIGZvdXIgYnl0ZXMvcGl4ZWxzIHBlciBsaW5lLgorICAgICAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDAgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKGRzdDApKTsKKyAgICAgIFdlYlBVaW50MzJUb01lbShkc3QgKyAxICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMihkc3QxKSk7CisgICAgICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMiAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoZHN0MikpOworICAgICAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDMgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKGRzdDMpKTsKKyAgICB9CisgIH0KK30KKworI2lmIChVU0VfVFJBTlNGT1JNX0FDMyA9PSAxKQorI2RlZmluZSBNVUwoYSwgYikgKCgoYSkgKiAoYikpID4+IDE2KQorc3RhdGljIHZvaWQgVHJhbnNmb3JtQUMzKGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QpIHsKKyAgc3RhdGljIGNvbnN0IGludCBrQzEgPSAyMDA5MSArICgxIDw8IDE2KTsKKyAgc3RhdGljIGNvbnN0IGludCBrQzIgPSAzNTQ2ODsKKyAgY29uc3QgX19tMTI4aSBBID0gX21tX3NldDFfZXBpMTYoaW5bMF0gKyA0KTsKKyAgY29uc3QgX19tMTI4aSBjNCA9IF9tbV9zZXQxX2VwaTE2KE1VTChpbls0XSwga0MyKSk7CisgIGNvbnN0IF9fbTEyOGkgZDQgPSBfbW1fc2V0MV9lcGkxNihNVUwoaW5bNF0sIGtDMSkpOworICBjb25zdCBpbnQgYzEgPSBNVUwoaW5bMV0sIGtDMik7CisgIGNvbnN0IGludCBkMSA9IE1VTChpblsxXSwga0MxKTsKKyAgY29uc3QgX19tMTI4aSBDRCA9IF9tbV9zZXRfZXBpMTYoMCwgMCwgMCwgMCwgLWQxLCAtYzEsIGMxLCBkMSk7CisgIGNvbnN0IF9fbTEyOGkgQiA9IF9tbV9hZGRzX2VwaTE2KEEsIENEKTsKKyAgY29uc3QgX19tMTI4aSBtMCA9IF9tbV9hZGRzX2VwaTE2KEIsIGQ0KTsKKyAgY29uc3QgX19tMTI4aSBtMSA9IF9tbV9hZGRzX2VwaTE2KEIsIGM0KTsKKyAgY29uc3QgX19tMTI4aSBtMiA9IF9tbV9zdWJzX2VwaTE2KEIsIGM0KTsKKyAgY29uc3QgX19tMTI4aSBtMyA9IF9tbV9zdWJzX2VwaTE2KEIsIGQ0KTsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgLy8gTG9hZCB0aGUgc291cmNlIHBpeGVscy4KKyAgX19tMTI4aSBkc3QwID0gX21tX2N2dHNpMzJfc2kxMjgoV2ViUE1lbVRvVWludDMyKGRzdCArIDAgKiBCUFMpKTsKKyAgX19tMTI4aSBkc3QxID0gX21tX2N2dHNpMzJfc2kxMjgoV2ViUE1lbVRvVWludDMyKGRzdCArIDEgKiBCUFMpKTsKKyAgX19tMTI4aSBkc3QyID0gX21tX2N2dHNpMzJfc2kxMjgoV2ViUE1lbVRvVWludDMyKGRzdCArIDIgKiBCUFMpKTsKKyAgX19tMTI4aSBkc3QzID0gX21tX2N2dHNpMzJfc2kxMjgoV2ViUE1lbVRvVWludDMyKGRzdCArIDMgKiBCUFMpKTsKKyAgLy8gQ29udmVydCB0byAxNmIuCisgIGRzdDAgPSBfbW1fdW5wYWNrbG9fZXBpOChkc3QwLCB6ZXJvKTsKKyAgZHN0MSA9IF9tbV91bnBhY2tsb19lcGk4KGRzdDEsIHplcm8pOworICBkc3QyID0gX21tX3VucGFja2xvX2VwaTgoZHN0MiwgemVybyk7CisgIGRzdDMgPSBfbW1fdW5wYWNrbG9fZXBpOChkc3QzLCB6ZXJvKTsKKyAgLy8gQWRkIHRoZSBpbnZlcnNlIHRyYW5zZm9ybS4KKyAgZHN0MCA9IF9tbV9hZGRzX2VwaTE2KGRzdDAsIF9tbV9zcmFpX2VwaTE2KG0wLCAzKSk7CisgIGRzdDEgPSBfbW1fYWRkc19lcGkxNihkc3QxLCBfbW1fc3JhaV9lcGkxNihtMSwgMykpOworICBkc3QyID0gX21tX2FkZHNfZXBpMTYoZHN0MiwgX21tX3NyYWlfZXBpMTYobTIsIDMpKTsKKyAgZHN0MyA9IF9tbV9hZGRzX2VwaTE2KGRzdDMsIF9tbV9zcmFpX2VwaTE2KG0zLCAzKSk7CisgIC8vIFVuc2lnbmVkIHNhdHVyYXRlIHRvIDhiLgorICBkc3QwID0gX21tX3BhY2t1c19lcGkxNihkc3QwLCBkc3QwKTsKKyAgZHN0MSA9IF9tbV9wYWNrdXNfZXBpMTYoZHN0MSwgZHN0MSk7CisgIGRzdDIgPSBfbW1fcGFja3VzX2VwaTE2KGRzdDIsIGRzdDIpOworICBkc3QzID0gX21tX3BhY2t1c19lcGkxNihkc3QzLCBkc3QzKTsKKyAgLy8gU3RvcmUgdGhlIHJlc3VsdHMuCisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAwICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMihkc3QwKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAxICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMihkc3QxKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAyICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMihkc3QyKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAzICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMihkc3QzKSk7Cit9CisjdW5kZWYgTVVMCisjZW5kaWYgICAvLyBVU0VfVFJBTlNGT1JNX0FDMworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTG9vcCBGaWx0ZXIgKFBhcmFncmFwaCAxNSkKKworLy8gQ29tcHV0ZSBhYnMocCAtIHEpID0gc3VicyhwIC0gcSkgT1Igc3VicyhxIC0gcCkKKyNkZWZpbmUgTU1fQUJTKHAsIHEpICBfbW1fb3Jfc2kxMjgoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX21tX3N1YnNfZXB1OCgocSksIChwKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9tbV9zdWJzX2VwdTgoKHApLCAocSkpKQorCisvLyBTaGlmdCBlYWNoIGJ5dGUgb2YgIngiIGJ5IDMgYml0cyB3aGlsZSBwcmVzZXJ2aW5nIGJ5IHRoZSBzaWduIGJpdC4KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFNpZ25lZFNoaWZ0OGJfU1NFMihfX20xMjhpKiBjb25zdCB4KSB7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGNvbnN0IF9fbTEyOGkgbG9fMCA9IF9tbV91bnBhY2tsb19lcGk4KHplcm8sICp4KTsKKyAgY29uc3QgX19tMTI4aSBoaV8wID0gX21tX3VucGFja2hpX2VwaTgoemVybywgKngpOworICBjb25zdCBfX20xMjhpIGxvXzEgPSBfbW1fc3JhaV9lcGkxNihsb18wLCAzICsgOCk7CisgIGNvbnN0IF9fbTEyOGkgaGlfMSA9IF9tbV9zcmFpX2VwaTE2KGhpXzAsIDMgKyA4KTsKKyAgKnggPSBfbW1fcGFja3NfZXBpMTYobG9fMSwgaGlfMSk7Cit9CisKKyNkZWZpbmUgRkxJUF9TSUdOX0JJVDIoYSwgYikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChhKSA9IF9tbV94b3Jfc2kxMjgoYSwgc2lnbl9iaXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoYikgPSBfbW1feG9yX3NpMTI4KGIsIHNpZ25fYml0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBGTElQX1NJR05fQklUNChhLCBiLCBjLCBkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRkxJUF9TSUdOX0JJVDIoYSwgYik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZMSVBfU0lHTl9CSVQyKGMsIGQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvLyBpbnB1dC9vdXRwdXQgaXMgdWludDhfdAorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgR2V0Tm90SEVWX1NTRTIoY29uc3QgX19tMTI4aSogY29uc3QgcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IHEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgcTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGV2X3RocmVzaCwgX19tMTI4aSogY29uc3Qgbm90X2hldikgeworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBjb25zdCBfX20xMjhpIHRfMSA9IE1NX0FCUygqcDEsICpwMCk7CisgIGNvbnN0IF9fbTEyOGkgdF8yID0gTU1fQUJTKCpxMSwgKnEwKTsKKworICBjb25zdCBfX20xMjhpIGggPSBfbW1fc2V0MV9lcGk4KGhldl90aHJlc2gpOworICBjb25zdCBfX20xMjhpIHRfbWF4ID0gX21tX21heF9lcHU4KHRfMSwgdF8yKTsKKworICBjb25zdCBfX20xMjhpIHRfbWF4X2ggPSBfbW1fc3Vic19lcHU4KHRfbWF4LCBoKTsKKyAgKm5vdF9oZXYgPSBfbW1fY21wZXFfZXBpOCh0X21heF9oLCB6ZXJvKTsgIC8vIG5vdF9oZXYgPD0gdDEgJiYgbm90X2hldiA8PSB0MgorfQorCisvLyBpbnB1dCBwaXhlbHMgYXJlIGludDhfdAorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgR2V0QmFzZURlbHRhX1NTRTIoY29uc3QgX19tMTI4aSogY29uc3QgcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IHEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgcTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBkZWx0YSkgeworICAvLyBiZXdhcmUgb2YgYWRkaXRpb24gb3JkZXIsIGZvciBzYXR1cmF0aW9uIQorICBjb25zdCBfX20xMjhpIHAxX3ExID0gX21tX3N1YnNfZXBpOCgqcDEsICpxMSk7ICAgLy8gcDEgLSBxMQorICBjb25zdCBfX20xMjhpIHEwX3AwID0gX21tX3N1YnNfZXBpOCgqcTAsICpwMCk7ICAgLy8gcTAgLSBwMAorICBjb25zdCBfX20xMjhpIHMxID0gX21tX2FkZHNfZXBpOChwMV9xMSwgcTBfcDApOyAgLy8gcDEgLSBxMSArIDEgKiAocTAgLSBwMCkKKyAgY29uc3QgX19tMTI4aSBzMiA9IF9tbV9hZGRzX2VwaTgocTBfcDAsIHMxKTsgICAgIC8vIHAxIC0gcTEgKyAyICogKHEwIC0gcDApCisgIGNvbnN0IF9fbTEyOGkgczMgPSBfbW1fYWRkc19lcGk4KHEwX3AwLCBzMik7ICAgICAvLyBwMSAtIHExICsgMyAqIChxMCAtIHAwKQorICAqZGVsdGEgPSBzMzsKK30KKworLy8gaW5wdXQgYW5kIG91dHB1dCBhcmUgaW50OF90CitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEb1NpbXBsZUZpbHRlcl9TU0UyKF9fbTEyOGkqIGNvbnN0IHAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgZmwpIHsKKyAgY29uc3QgX19tMTI4aSBrMyA9IF9tbV9zZXQxX2VwaTgoMyk7CisgIGNvbnN0IF9fbTEyOGkgazQgPSBfbW1fc2V0MV9lcGk4KDQpOworICBfX20xMjhpIHYzID0gX21tX2FkZHNfZXBpOCgqZmwsIGszKTsKKyAgX19tMTI4aSB2NCA9IF9tbV9hZGRzX2VwaTgoKmZsLCBrNCk7CisKKyAgU2lnbmVkU2hpZnQ4Yl9TU0UyKCZ2NCk7ICAgICAgICAgICAgIC8vIHY0ID4+IDMKKyAgU2lnbmVkU2hpZnQ4Yl9TU0UyKCZ2Myk7ICAgICAgICAgICAgIC8vIHYzID4+IDMKKyAgKnEwID0gX21tX3N1YnNfZXBpOCgqcTAsIHY0KTsgICAgICAgIC8vIHEwIC09IHY0CisgICpwMCA9IF9tbV9hZGRzX2VwaTgoKnAwLCB2Myk7ICAgICAgICAvLyBwMCArPSB2MworfQorCisvLyBVcGRhdGVzIHZhbHVlcyBvZiAyIHBpeGVscyBhdCBNQiBlZGdlIGR1cmluZyBjb21wbGV4IGZpbHRlcmluZy4KKy8vIFVwZGF0ZSBvcGVyYXRpb25zOgorLy8gcSA9IHEgLSBkZWx0YSBhbmQgcCA9IHAgKyBkZWx0YTsgd2hlcmUgZGVsdGEgPSBbKGFfaGkgPj4gNyksIChhX2xvID4+IDcpXQorLy8gUGl4ZWxzICdwaScgYW5kICdxaScgYXJlIGludDhfdCBvbiBpbnB1dCwgdWludDhfdCBvbiBvdXRwdXQgKHNpZ24gZmxpcCkuCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBVcGRhdGUyUGl4ZWxzX1NTRTIoX19tMTI4aSogY29uc3QgcGksIF9fbTEyOGkqIGNvbnN0IHFpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IGEwX2xvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IGEwX2hpKSB7CisgIGNvbnN0IF9fbTEyOGkgYTFfbG8gPSBfbW1fc3JhaV9lcGkxNigqYTBfbG8sIDcpOworICBjb25zdCBfX20xMjhpIGExX2hpID0gX21tX3NyYWlfZXBpMTYoKmEwX2hpLCA3KTsKKyAgY29uc3QgX19tMTI4aSBkZWx0YSA9IF9tbV9wYWNrc19lcGkxNihhMV9sbywgYTFfaGkpOworICBjb25zdCBfX20xMjhpIHNpZ25fYml0ID0gX21tX3NldDFfZXBpOCgweDgwKTsKKyAgKnBpID0gX21tX2FkZHNfZXBpOCgqcGksIGRlbHRhKTsKKyAgKnFpID0gX21tX3N1YnNfZXBpOCgqcWksIGRlbHRhKTsKKyAgRkxJUF9TSUdOX0JJVDIoKnBpLCAqcWkpOworfQorCisvLyBpbnB1dCBwaXhlbHMgYXJlIHVpbnQ4X3QKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIE5lZWRzRmlsdGVyX1NTRTIoY29uc3QgX19tMTI4aSogY29uc3QgcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IHAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgcTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIF9fbTEyOGkqIGNvbnN0IG1hc2spIHsKKyAgY29uc3QgX19tMTI4aSBtX3RocmVzaCA9IF9tbV9zZXQxX2VwaTgodGhyZXNoKTsKKyAgY29uc3QgX19tMTI4aSB0MSA9IE1NX0FCUygqcDEsICpxMSk7ICAgICAgICAvLyBhYnMocDEgLSBxMSkKKyAgY29uc3QgX19tMTI4aSBrRkUgPSBfbW1fc2V0MV9lcGk4KDB4RkUpOworICBjb25zdCBfX20xMjhpIHQyID0gX21tX2FuZF9zaTEyOCh0MSwga0ZFKTsgIC8vIHNldCBsc2Igb2YgZWFjaCBieXRlIHRvIHplcm8KKyAgY29uc3QgX19tMTI4aSB0MyA9IF9tbV9zcmxpX2VwaTE2KHQyLCAxKTsgICAvLyBhYnMocDEgLSBxMSkgLyAyCisKKyAgY29uc3QgX19tMTI4aSB0NCA9IE1NX0FCUygqcDAsICpxMCk7ICAgICAgICAvLyBhYnMocDAgLSBxMCkKKyAgY29uc3QgX19tMTI4aSB0NSA9IF9tbV9hZGRzX2VwdTgodDQsIHQ0KTsgICAvLyBhYnMocDAgLSBxMCkgKiAyCisgIGNvbnN0IF9fbTEyOGkgdDYgPSBfbW1fYWRkc19lcHU4KHQ1LCB0Myk7ICAgLy8gYWJzKHAwLXEwKSoyICsgYWJzKHAxLXExKS8yCisKKyAgY29uc3QgX19tMTI4aSB0NyA9IF9tbV9zdWJzX2VwdTgodDYsIG1fdGhyZXNoKTsgIC8vIG1hc2sgPD0gbV90aHJlc2gKKyAgKm1hc2sgPSBfbW1fY21wZXFfZXBpOCh0NywgX21tX3NldHplcm9fc2kxMjgoKSk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFZGdlIGZpbHRlcmluZyBmdW5jdGlvbnMKKworLy8gQXBwbGllcyBmaWx0ZXIgb24gMiBwaXhlbHMgKHAwIGFuZCBxMCkKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIERvRmlsdGVyMl9TU0UyKF9fbTEyOGkqIGNvbnN0IHAxLCBfX20xMjhpKiBjb25zdCBwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IHEwLCBfX20xMjhpKiBjb25zdCBxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gpIHsKKyAgX19tMTI4aSBhLCBtYXNrOworICBjb25zdCBfX20xMjhpIHNpZ25fYml0ID0gX21tX3NldDFfZXBpOCgweDgwKTsKKyAgLy8gY29udmVydCBwMS9xMSB0byBpbnQ4X3QgKGZvciBHZXRCYXNlRGVsdGFfU1NFMikKKyAgY29uc3QgX19tMTI4aSBwMXMgPSBfbW1feG9yX3NpMTI4KCpwMSwgc2lnbl9iaXQpOworICBjb25zdCBfX20xMjhpIHExcyA9IF9tbV94b3Jfc2kxMjgoKnExLCBzaWduX2JpdCk7CisKKyAgTmVlZHNGaWx0ZXJfU1NFMihwMSwgcDAsIHEwLCBxMSwgdGhyZXNoLCAmbWFzayk7CisKKyAgRkxJUF9TSUdOX0JJVDIoKnAwLCAqcTApOworICBHZXRCYXNlRGVsdGFfU1NFMigmcDFzLCBwMCwgcTAsICZxMXMsICZhKTsKKyAgYSA9IF9tbV9hbmRfc2kxMjgoYSwgbWFzayk7ICAgICAvLyBtYXNrIGZpbHRlciB2YWx1ZXMgd2UgZG9uJ3QgY2FyZSBhYm91dAorICBEb1NpbXBsZUZpbHRlcl9TU0UyKHAwLCBxMCwgJmEpOworICBGTElQX1NJR05fQklUMigqcDAsICpxMCk7Cit9CisKKy8vIEFwcGxpZXMgZmlsdGVyIG9uIDQgcGl4ZWxzIChwMSwgcDAsIHEwIGFuZCBxMSkKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIERvRmlsdGVyNF9TU0UyKF9fbTEyOGkqIGNvbnN0IHAxLCBfX20xMjhpKiBjb25zdCBwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IHEwLCBfX20xMjhpKiBjb25zdCBxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IG1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGV2X3RocmVzaCkgeworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBjb25zdCBfX20xMjhpIHNpZ25fYml0ID0gX21tX3NldDFfZXBpOCgweDgwKTsKKyAgY29uc3QgX19tMTI4aSBrNjQgPSBfbW1fc2V0MV9lcGk4KDY0KTsKKyAgY29uc3QgX19tMTI4aSBrMyA9IF9tbV9zZXQxX2VwaTgoMyk7CisgIGNvbnN0IF9fbTEyOGkgazQgPSBfbW1fc2V0MV9lcGk4KDQpOworICBfX20xMjhpIG5vdF9oZXY7CisgIF9fbTEyOGkgdDEsIHQyLCB0MzsKKworICAvLyBjb21wdXRlIGhldiBtYXNrCisgIEdldE5vdEhFVl9TU0UyKHAxLCBwMCwgcTAsIHExLCBoZXZfdGhyZXNoLCAmbm90X2hldik7CisKKyAgLy8gY29udmVydCB0byBzaWduZWQgdmFsdWVzCisgIEZMSVBfU0lHTl9CSVQ0KCpwMSwgKnAwLCAqcTAsICpxMSk7CisKKyAgdDEgPSBfbW1fc3Vic19lcGk4KCpwMSwgKnExKTsgICAgICAgIC8vIHAxIC0gcTEKKyAgdDEgPSBfbW1fYW5kbm90X3NpMTI4KG5vdF9oZXYsIHQxKTsgIC8vIGhldihwMSAtIHExKQorICB0MiA9IF9tbV9zdWJzX2VwaTgoKnEwLCAqcDApOyAgICAgICAgLy8gcTAgLSBwMAorICB0MSA9IF9tbV9hZGRzX2VwaTgodDEsIHQyKTsgICAgICAgICAgLy8gaGV2KHAxIC0gcTEpICsgMSAqIChxMCAtIHAwKQorICB0MSA9IF9tbV9hZGRzX2VwaTgodDEsIHQyKTsgICAgICAgICAgLy8gaGV2KHAxIC0gcTEpICsgMiAqIChxMCAtIHAwKQorICB0MSA9IF9tbV9hZGRzX2VwaTgodDEsIHQyKTsgICAgICAgICAgLy8gaGV2KHAxIC0gcTEpICsgMyAqIChxMCAtIHAwKQorICB0MSA9IF9tbV9hbmRfc2kxMjgodDEsICptYXNrKTsgICAgICAgLy8gbWFzayBmaWx0ZXIgdmFsdWVzIHdlIGRvbid0IGNhcmUgYWJvdXQKKworICB0MiA9IF9tbV9hZGRzX2VwaTgodDEsIGszKTsgICAgICAgIC8vIDMgKiAocTAgLSBwMCkgKyBoZXYocDEgLSBxMSkgKyAzCisgIHQzID0gX21tX2FkZHNfZXBpOCh0MSwgazQpOyAgICAgICAgLy8gMyAqIChxMCAtIHAwKSArIGhldihwMSAtIHExKSArIDQKKyAgU2lnbmVkU2hpZnQ4Yl9TU0UyKCZ0Mik7ICAgICAgICAgICAvLyAoMyAqIChxMCAtIHAwKSArIGhldihwMSAtIHExKSArIDMpID4+IDMKKyAgU2lnbmVkU2hpZnQ4Yl9TU0UyKCZ0Myk7ICAgICAgICAgICAvLyAoMyAqIChxMCAtIHAwKSArIGhldihwMSAtIHExKSArIDQpID4+IDMKKyAgKnAwID0gX21tX2FkZHNfZXBpOCgqcDAsIHQyKTsgICAgICAvLyBwMCArPSB0MgorICAqcTAgPSBfbW1fc3Vic19lcGk4KCpxMCwgdDMpOyAgICAgIC8vIHEwIC09IHQzCisgIEZMSVBfU0lHTl9CSVQyKCpwMCwgKnEwKTsKKworICAvLyB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gc2lnbmVkIChhICsgMSkgPj4gMSBjYWxjdWxhdGlvbgorICB0MiA9IF9tbV9hZGRfZXBpOCh0Mywgc2lnbl9iaXQpOworICB0MyA9IF9tbV9hdmdfZXB1OCh0MiwgemVybyk7CisgIHQzID0gX21tX3N1Yl9lcGk4KHQzLCBrNjQpOworCisgIHQzID0gX21tX2FuZF9zaTEyOChub3RfaGV2LCB0Myk7ICAgLy8gaWYgIWhldgorICAqcTEgPSBfbW1fc3Vic19lcGk4KCpxMSwgdDMpOyAgICAgIC8vIHExIC09IHQzCisgICpwMSA9IF9tbV9hZGRzX2VwaTgoKnAxLCB0Myk7ICAgICAgLy8gcDEgKz0gdDMKKyAgRkxJUF9TSUdOX0JJVDIoKnAxLCAqcTEpOworfQorCisvLyBBcHBsaWVzIGZpbHRlciBvbiA2IHBpeGVscyAocDIsIHAxLCBwMCwgcTAsIHExIGFuZCBxMikKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIERvRmlsdGVyNl9TU0UyKF9fbTEyOGkqIGNvbnN0IHAyLCBfX20xMjhpKiBjb25zdCBwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IHAwLCBfX20xMjhpKiBjb25zdCBxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IHExLCBfX20xMjhpKiBjb25zdCBxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IG1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGV2X3RocmVzaCkgeworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBjb25zdCBfX20xMjhpIHNpZ25fYml0ID0gX21tX3NldDFfZXBpOCgweDgwKTsKKyAgX19tMTI4aSBhLCBub3RfaGV2OworCisgIC8vIGNvbXB1dGUgaGV2IG1hc2sKKyAgR2V0Tm90SEVWX1NTRTIocDEsIHAwLCBxMCwgcTEsIGhldl90aHJlc2gsICZub3RfaGV2KTsKKworICBGTElQX1NJR05fQklUNCgqcDEsICpwMCwgKnEwLCAqcTEpOworICBGTElQX1NJR05fQklUMigqcDIsICpxMik7CisgIEdldEJhc2VEZWx0YV9TU0UyKHAxLCBwMCwgcTAsIHExLCAmYSk7CisKKyAgeyAvLyBkbyBzaW1wbGUgZmlsdGVyIG9uIHBpeGVscyB3aXRoIGhldgorICAgIGNvbnN0IF9fbTEyOGkgbSA9IF9tbV9hbmRub3Rfc2kxMjgobm90X2hldiwgKm1hc2spOworICAgIGNvbnN0IF9fbTEyOGkgZiA9IF9tbV9hbmRfc2kxMjgoYSwgbSk7CisgICAgRG9TaW1wbGVGaWx0ZXJfU1NFMihwMCwgcTAsICZmKTsKKyAgfQorCisgIHsgLy8gZG8gc3Ryb25nIGZpbHRlciBvbiBwaXhlbHMgd2l0aCBub3QgaGV2CisgICAgY29uc3QgX19tMTI4aSBrOSA9IF9tbV9zZXQxX2VwaTE2KDB4MDkwMCk7CisgICAgY29uc3QgX19tMTI4aSBrNjMgPSBfbW1fc2V0MV9lcGkxNig2Myk7CisKKyAgICBjb25zdCBfX20xMjhpIG0gPSBfbW1fYW5kX3NpMTI4KG5vdF9oZXYsICptYXNrKTsKKyAgICBjb25zdCBfX20xMjhpIGYgPSBfbW1fYW5kX3NpMTI4KGEsIG0pOworCisgICAgY29uc3QgX19tMTI4aSBmX2xvID0gX21tX3VucGFja2xvX2VwaTgoemVybywgZik7CisgICAgY29uc3QgX19tMTI4aSBmX2hpID0gX21tX3VucGFja2hpX2VwaTgoemVybywgZik7CisKKyAgICBjb25zdCBfX20xMjhpIGY5X2xvID0gX21tX211bGhpX2VwaTE2KGZfbG8sIGs5KTsgICAgLy8gRmlsdGVyIChsbykgKiA5CisgICAgY29uc3QgX19tMTI4aSBmOV9oaSA9IF9tbV9tdWxoaV9lcGkxNihmX2hpLCBrOSk7ICAgIC8vIEZpbHRlciAoaGkpICogOQorCisgICAgY29uc3QgX19tMTI4aSBhMl9sbyA9IF9tbV9hZGRfZXBpMTYoZjlfbG8sIGs2Myk7ICAgIC8vIEZpbHRlciAqIDkgKyA2MworICAgIGNvbnN0IF9fbTEyOGkgYTJfaGkgPSBfbW1fYWRkX2VwaTE2KGY5X2hpLCBrNjMpOyAgICAvLyBGaWx0ZXIgKiA5ICsgNjMKKworICAgIGNvbnN0IF9fbTEyOGkgYTFfbG8gPSBfbW1fYWRkX2VwaTE2KGEyX2xvLCBmOV9sbyk7ICAvLyBGaWx0ZXIgKiAxOCArIDYzCisgICAgY29uc3QgX19tMTI4aSBhMV9oaSA9IF9tbV9hZGRfZXBpMTYoYTJfaGksIGY5X2hpKTsgIC8vIEZpbHRlciAqIDE4ICsgNjMKKworICAgIGNvbnN0IF9fbTEyOGkgYTBfbG8gPSBfbW1fYWRkX2VwaTE2KGExX2xvLCBmOV9sbyk7ICAvLyBGaWx0ZXIgKiAyNyArIDYzCisgICAgY29uc3QgX19tMTI4aSBhMF9oaSA9IF9tbV9hZGRfZXBpMTYoYTFfaGksIGY5X2hpKTsgIC8vIEZpbHRlciAqIDI3ICsgNjMKKworICAgIFVwZGF0ZTJQaXhlbHNfU1NFMihwMiwgcTIsICZhMl9sbywgJmEyX2hpKTsKKyAgICBVcGRhdGUyUGl4ZWxzX1NTRTIocDEsIHExLCAmYTFfbG8sICZhMV9oaSk7CisgICAgVXBkYXRlMlBpeGVsc19TU0UyKHAwLCBxMCwgJmEwX2xvLCAmYTBfaGkpOworICB9Cit9CisKKy8vIHJlYWRzIDggcm93cyBhY3Jvc3MgYSB2ZXJ0aWNhbCBlZGdlLgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgTG9hZDh4NF9TU0UyKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGIsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgcCwgX19tMTI4aSogY29uc3QgcSkgeworICAvLyBBMCA9IDYzIDYyIDYxIDYwIDIzIDIyIDIxIDIwIDQzIDQyIDQxIDQwIDAzIDAyIDAxIDAwCisgIC8vIEExID0gNzMgNzIgNzEgNzAgMzMgMzIgMzEgMzAgNTMgNTIgNTEgNTAgMTMgMTIgMTEgMTAKKyAgY29uc3QgX19tMTI4aSBBMCA9IF9tbV9zZXRfZXBpMzIoCisgICAgICBXZWJQTWVtVG9VaW50MzIoJmJbNiAqIHN0cmlkZV0pLCBXZWJQTWVtVG9VaW50MzIoJmJbMiAqIHN0cmlkZV0pLAorICAgICAgV2ViUE1lbVRvVWludDMyKCZiWzQgKiBzdHJpZGVdKSwgV2ViUE1lbVRvVWludDMyKCZiWzAgKiBzdHJpZGVdKSk7CisgIGNvbnN0IF9fbTEyOGkgQTEgPSBfbW1fc2V0X2VwaTMyKAorICAgICAgV2ViUE1lbVRvVWludDMyKCZiWzcgKiBzdHJpZGVdKSwgV2ViUE1lbVRvVWludDMyKCZiWzMgKiBzdHJpZGVdKSwKKyAgICAgIFdlYlBNZW1Ub1VpbnQzMigmYls1ICogc3RyaWRlXSksIFdlYlBNZW1Ub1VpbnQzMigmYlsxICogc3RyaWRlXSkpOworCisgIC8vIEIwID0gNTMgNDMgNTIgNDIgNTEgNDEgNTAgNDAgMTMgMDMgMTIgMDIgMTEgMDEgMTAgMDAKKyAgLy8gQjEgPSA3MyA2MyA3MiA2MiA3MSA2MSA3MCA2MCAzMyAyMyAzMiAyMiAzMSAyMSAzMCAyMAorICBjb25zdCBfX20xMjhpIEIwID0gX21tX3VucGFja2xvX2VwaTgoQTAsIEExKTsKKyAgY29uc3QgX19tMTI4aSBCMSA9IF9tbV91bnBhY2toaV9lcGk4KEEwLCBBMSk7CisKKyAgLy8gQzAgPSAzMyAyMyAxMyAwMyAzMiAyMiAxMiAwMiAzMSAyMSAxMSAwMSAzMCAyMCAxMCAwMAorICAvLyBDMSA9IDczIDYzIDUzIDQzIDcyIDYyIDUyIDQyIDcxIDYxIDUxIDQxIDcwIDYwIDUwIDQwCisgIGNvbnN0IF9fbTEyOGkgQzAgPSBfbW1fdW5wYWNrbG9fZXBpMTYoQjAsIEIxKTsKKyAgY29uc3QgX19tMTI4aSBDMSA9IF9tbV91bnBhY2toaV9lcGkxNihCMCwgQjEpOworCisgIC8vICpwID0gNzEgNjEgNTEgNDEgMzEgMjEgMTEgMDEgNzAgNjAgNTAgNDAgMzAgMjAgMTAgMDAKKyAgLy8gKnEgPSA3MyA2MyA1MyA0MyAzMyAyMyAxMyAwMyA3MiA2MiA1MiA0MiAzMiAyMiAxMiAwMgorICAqcCA9IF9tbV91bnBhY2tsb19lcGkzMihDMCwgQzEpOworICAqcSA9IF9tbV91bnBhY2toaV9lcGkzMihDMCwgQzEpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBMb2FkMTZ4NF9TU0UyKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCByOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgcDEsIF9fbTEyOGkqIGNvbnN0IHAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBxMCwgX19tMTI4aSogY29uc3QgcTEpIHsKKyAgLy8gQXNzdW1lIHRoZSBwaXhlbHMgYXJvdW5kIHRoZSBlZGdlICh8KSBhcmUgbnVtYmVyZWQgYXMgZm9sbG93cworICAvLyAgICAgICAgICAgICAgICAwMCAwMSB8IDAyIDAzCisgIC8vICAgICAgICAgICAgICAgIDEwIDExIHwgMTIgMTMKKyAgLy8gICAgICAgICAgICAgICAgIC4uLiAgfCAgLi4uCisgIC8vICAgICAgICAgICAgICAgIGUwIGUxIHwgZTIgZTMKKyAgLy8gICAgICAgICAgICAgICAgZjAgZjEgfCBmMiBmMworICAvLworICAvLyByMCBpcyBwb2ludGluZyB0byB0aGUgMHRoIHJvdyAoMDApCisgIC8vIHI4IGlzIHBvaW50aW5nIHRvIHRoZSA4dGggcm93ICg4MCkKKworICAvLyBMb2FkCisgIC8vIHAxID0gNzEgNjEgNTEgNDEgMzEgMjEgMTEgMDEgNzAgNjAgNTAgNDAgMzAgMjAgMTAgMDAKKyAgLy8gcTAgPSA3MyA2MyA1MyA0MyAzMyAyMyAxMyAwMyA3MiA2MiA1MiA0MiAzMiAyMiAxMiAwMgorICAvLyBwMCA9IGYxIGUxIGQxIGMxIGIxIGExIDkxIDgxIGYwIGUwIGQwIGMwIGIwIGEwIDkwIDgwCisgIC8vIHExID0gZjMgZTMgZDMgYzMgYjMgYTMgOTMgODMgZjIgZTIgZDIgYzIgYjIgYTIgOTIgODIKKyAgTG9hZDh4NF9TU0UyKHIwLCBzdHJpZGUsIHAxLCBxMCk7CisgIExvYWQ4eDRfU1NFMihyOCwgc3RyaWRlLCBwMCwgcTEpOworCisgIHsKKyAgICAvLyBwMSA9IGYwIGUwIGQwIGMwIGIwIGEwIDkwIDgwIDcwIDYwIDUwIDQwIDMwIDIwIDEwIDAwCisgICAgLy8gcDAgPSBmMSBlMSBkMSBjMSBiMSBhMSA5MSA4MSA3MSA2MSA1MSA0MSAzMSAyMSAxMSAwMQorICAgIC8vIHEwID0gZjIgZTIgZDIgYzIgYjIgYTIgOTIgODIgNzIgNjIgNTIgNDIgMzIgMjIgMTIgMDIKKyAgICAvLyBxMSA9IGYzIGUzIGQzIGMzIGIzIGEzIDkzIDgzIDczIDYzIDUzIDQzIDMzIDIzIDEzIDAzCisgICAgY29uc3QgX19tMTI4aSB0MSA9ICpwMTsKKyAgICBjb25zdCBfX20xMjhpIHQyID0gKnEwOworICAgICpwMSA9IF9tbV91bnBhY2tsb19lcGk2NCh0MSwgKnAwKTsKKyAgICAqcDAgPSBfbW1fdW5wYWNraGlfZXBpNjQodDEsICpwMCk7CisgICAgKnEwID0gX21tX3VucGFja2xvX2VwaTY0KHQyLCAqcTEpOworICAgICpxMSA9IF9tbV91bnBhY2toaV9lcGk2NCh0MiwgKnExKTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBTdG9yZTR4NF9TU0UyKF9fbTEyOGkqIGNvbnN0IHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IHN0cmlkZSkgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSwgZHN0ICs9IHN0cmlkZSkgeworICAgIFdlYlBVaW50MzJUb01lbShkc3QsIF9tbV9jdnRzaTEyOF9zaTMyKCp4KSk7CisgICAgKnggPSBfbW1fc3JsaV9zaTEyOCgqeCwgNCk7CisgIH0KK30KKworLy8gVHJhbnNwb3NlIGJhY2sgYW5kIHN0b3JlCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBTdG9yZTE2eDRfU1NFMihjb25zdCBfX20xMjhpKiBjb25zdCBwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IHAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgcTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHIwLCB1aW50OF90KiByOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUpIHsKKyAgX19tMTI4aSB0MSwgcDFfcywgcDBfcywgcTBfcywgcTFfczsKKworICAvLyBwMCA9IDcxIDcwIDYxIDYwIDUxIDUwIDQxIDQwIDMxIDMwIDIxIDIwIDExIDEwIDAxIDAwCisgIC8vIHAxID0gZjEgZjAgZTEgZTAgZDEgZDAgYzEgYzAgYjEgYjAgYTEgYTAgOTEgOTAgODEgODAKKyAgdDEgPSAqcDA7CisgIHAwX3MgPSBfbW1fdW5wYWNrbG9fZXBpOCgqcDEsIHQxKTsKKyAgcDFfcyA9IF9tbV91bnBhY2toaV9lcGk4KCpwMSwgdDEpOworCisgIC8vIHEwID0gNzMgNzIgNjMgNjIgNTMgNTIgNDMgNDIgMzMgMzIgMjMgMjIgMTMgMTIgMDMgMDIKKyAgLy8gcTEgPSBmMyBmMiBlMyBlMiBkMyBkMiBjMyBjMiBiMyBiMiBhMyBhMiA5MyA5MiA4MyA4MgorICB0MSA9ICpxMDsKKyAgcTBfcyA9IF9tbV91bnBhY2tsb19lcGk4KHQxLCAqcTEpOworICBxMV9zID0gX21tX3VucGFja2hpX2VwaTgodDEsICpxMSk7CisKKyAgLy8gcDAgPSAzMyAzMiAzMSAzMCAyMyAyMiAyMSAyMCAxMyAxMiAxMSAxMCAwMyAwMiAwMSAwMAorICAvLyBxMCA9IDczIDcyIDcxIDcwIDYzIDYyIDYxIDYwIDUzIDUyIDUxIDUwIDQzIDQyIDQxIDQwCisgIHQxID0gcDBfczsKKyAgcDBfcyA9IF9tbV91bnBhY2tsb19lcGkxNih0MSwgcTBfcyk7CisgIHEwX3MgPSBfbW1fdW5wYWNraGlfZXBpMTYodDEsIHEwX3MpOworCisgIC8vIHAxID0gYjMgYjIgYjEgYjAgYTMgYTIgYTEgYTAgOTMgOTIgOTEgOTAgODMgODIgODEgODAKKyAgLy8gcTEgPSBmMyBmMiBmMSBmMCBlMyBlMiBlMSBlMCBkMyBkMiBkMSBkMCBjMyBjMiBjMSBjMAorICB0MSA9IHAxX3M7CisgIHAxX3MgPSBfbW1fdW5wYWNrbG9fZXBpMTYodDEsIHExX3MpOworICBxMV9zID0gX21tX3VucGFja2hpX2VwaTE2KHQxLCBxMV9zKTsKKworICBTdG9yZTR4NF9TU0UyKCZwMF9zLCByMCwgc3RyaWRlKTsKKyAgcjAgKz0gNCAqIHN0cmlkZTsKKyAgU3RvcmU0eDRfU1NFMigmcTBfcywgcjAsIHN0cmlkZSk7CisKKyAgU3RvcmU0eDRfU1NFMigmcDFfcywgcjgsIHN0cmlkZSk7CisgIHI4ICs9IDQgKiBzdHJpZGU7CisgIFN0b3JlNHg0X1NTRTIoJnExX3MsIHI4LCBzdHJpZGUpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU2ltcGxlIEluLWxvb3AgZmlsdGVyaW5nIChQYXJhZ3JhcGggMTUuMikKKworc3RhdGljIHZvaWQgU2ltcGxlVkZpbHRlcjE2X1NTRTIodWludDhfdCogcCwgaW50IHN0cmlkZSwgaW50IHRocmVzaCkgeworICAvLyBMb2FkCisgIF9fbTEyOGkgcDEgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZwWy0yICogc3RyaWRlXSk7CisgIF9fbTEyOGkgcDAgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZwWy1zdHJpZGVdKTsKKyAgX19tMTI4aSBxMCA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJnBbMF0pOworICBfX20xMjhpIHExID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmcFtzdHJpZGVdKTsKKworICBEb0ZpbHRlcjJfU1NFMigmcDEsICZwMCwgJnEwLCAmcTEsIHRocmVzaCk7CisKKyAgLy8gU3RvcmUKKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJnBbLXN0cmlkZV0sIHAwKTsKKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJnBbMF0sIHEwKTsKK30KKworc3RhdGljIHZvaWQgU2ltcGxlSEZpbHRlcjE2X1NTRTIodWludDhfdCogcCwgaW50IHN0cmlkZSwgaW50IHRocmVzaCkgeworICBfX20xMjhpIHAxLCBwMCwgcTAsIHExOworCisgIHAgLT0gMjsgIC8vIGJlZ2lubmluZyBvZiBwMQorCisgIExvYWQxNng0X1NTRTIocCwgcCArIDggKiBzdHJpZGUsIHN0cmlkZSwgJnAxLCAmcDAsICZxMCwgJnExKTsKKyAgRG9GaWx0ZXIyX1NTRTIoJnAxLCAmcDAsICZxMCwgJnExLCB0aHJlc2gpOworICBTdG9yZTE2eDRfU1NFMigmcDEsICZwMCwgJnEwLCAmcTEsIHAsIHAgKyA4ICogc3RyaWRlLCBzdHJpZGUpOworfQorCitzdGF0aWMgdm9pZCBTaW1wbGVWRmlsdGVyMTZpX1NTRTIodWludDhfdCogcCwgaW50IHN0cmlkZSwgaW50IHRocmVzaCkgeworICBpbnQgazsKKyAgZm9yIChrID0gMzsgayA+IDA7IC0taykgeworICAgIHAgKz0gNCAqIHN0cmlkZTsKKyAgICBTaW1wbGVWRmlsdGVyMTZfU1NFMihwLCBzdHJpZGUsIHRocmVzaCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgU2ltcGxlSEZpbHRlcjE2aV9TU0UyKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsIGludCB0aHJlc2gpIHsKKyAgaW50IGs7CisgIGZvciAoayA9IDM7IGsgPiAwOyAtLWspIHsKKyAgICBwICs9IDQ7CisgICAgU2ltcGxlSEZpbHRlcjE2X1NTRTIocCwgc3RyaWRlLCB0aHJlc2gpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb21wbGV4IEluLWxvb3AgZmlsdGVyaW5nIChQYXJhZ3JhcGggMTUuMykKKworI2RlZmluZSBNQVhfRElGRjEocDMsIHAyLCBwMSwgcDAsIG0pIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKG0pID0gTU1fQUJTKHAxLCBwMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChtKSA9IF9tbV9tYXhfZXB1OChtLCBNTV9BQlMocDMsIHAyKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAobSkgPSBfbW1fbWF4X2VwdTgobSwgTU1fQUJTKHAyLCBwMSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgTUFYX0RJRkYyKHAzLCBwMiwgcDEsIHAwLCBtKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChtKSA9IF9tbV9tYXhfZXB1OChtLCBNTV9BQlMocDEsIHAwKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAobSkgPSBfbW1fbWF4X2VwdTgobSwgTU1fQUJTKHAzLCBwMikpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKG0pID0gX21tX21heF9lcHU4KG0sIE1NX0FCUyhwMiwgcDEpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIExPQURfSF9FREdFUzQocCwgc3RyaWRlLCBlMSwgZTIsIGUzLCBlNCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoZTEpID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmKHApWzAgKiAoc3RyaWRlKV0pOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKGUyKSA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJihwKVsxICogKHN0cmlkZSldKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChlMykgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSYocClbMiAqIChzdHJpZGUpXSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoZTQpID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmKHApWzMgKiAoc3RyaWRlKV0pOyAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBMT0FEVVZfSF9FREdFKHAsIHUsIHYsIHN0cmlkZSkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBVID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmKHUpWyhzdHJpZGUpXSk7ICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgViA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJih2KVsoc3RyaWRlKV0pOyAgICAgICAgICAgICAgICAgXAorICAocCkgPSBfbW1fdW5wYWNrbG9fZXBpNjQoVSwgVik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgTE9BRFVWX0hfRURHRVM0KHUsIHYsIHN0cmlkZSwgZTEsIGUyLCBlMywgZTQpIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgIExPQURVVl9IX0VER0UoZTEsIHUsIHYsIDAgKiAoc3RyaWRlKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBMT0FEVVZfSF9FREdFKGUyLCB1LCB2LCAxICogKHN0cmlkZSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgTE9BRFVWX0hfRURHRShlMywgdSwgdiwgMiAqIChzdHJpZGUpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIExPQURVVl9IX0VER0UoZTQsIHUsIHYsIDMgKiAoc3RyaWRlKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIFNUT1JFVVYocCwgdSwgdiwgc3RyaWRlKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikmKHUpWyhzdHJpZGUpXSwgcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKHApID0gX21tX3NybGlfc2kxMjgocCwgOCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKSYodilbKHN0cmlkZSldLCBwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBDb21wbGV4TWFza19TU0UyKGNvbnN0IF9fbTEyOGkqIGNvbnN0IHAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgcTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IHExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgbWFzaykgeworICBjb25zdCBfX20xMjhpIGl0ID0gX21tX3NldDFfZXBpOChpdGhyZXNoKTsKKyAgY29uc3QgX19tMTI4aSBkaWZmID0gX21tX3N1YnNfZXB1OCgqbWFzaywgaXQpOworICBjb25zdCBfX20xMjhpIHRocmVzaF9tYXNrID0gX21tX2NtcGVxX2VwaTgoZGlmZiwgX21tX3NldHplcm9fc2kxMjgoKSk7CisgIF9fbTEyOGkgZmlsdGVyX21hc2s7CisgIE5lZWRzRmlsdGVyX1NTRTIocDEsIHAwLCBxMCwgcTEsIHRocmVzaCwgJmZpbHRlcl9tYXNrKTsKKyAgKm1hc2sgPSBfbW1fYW5kX3NpMTI4KHRocmVzaF9tYXNrLCBmaWx0ZXJfbWFzayk7Cit9CisKKy8vIG9uIG1hY3JvYmxvY2sgZWRnZXMKK3N0YXRpYyB2b2lkIFZGaWx0ZXIxNl9TU0UyKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgX19tMTI4aSB0MTsKKyAgX19tMTI4aSBtYXNrOworICBfX20xMjhpIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTI7CisKKyAgLy8gTG9hZCBwMywgcDIsIHAxLCBwMAorICBMT0FEX0hfRURHRVM0KHAgLSA0ICogc3RyaWRlLCBzdHJpZGUsIHQxLCBwMiwgcDEsIHAwKTsKKyAgTUFYX0RJRkYxKHQxLCBwMiwgcDEsIHAwLCBtYXNrKTsKKworICAvLyBMb2FkIHEwLCBxMSwgcTIsIHEzCisgIExPQURfSF9FREdFUzQocCwgc3RyaWRlLCBxMCwgcTEsIHEyLCB0MSk7CisgIE1BWF9ESUZGMih0MSwgcTIsIHExLCBxMCwgbWFzayk7CisKKyAgQ29tcGxleE1hc2tfU1NFMigmcDEsICZwMCwgJnEwLCAmcTEsIHRocmVzaCwgaXRocmVzaCwgJm1hc2spOworICBEb0ZpbHRlcjZfU1NFMigmcDIsICZwMSwgJnAwLCAmcTAsICZxMSwgJnEyLCAmbWFzaywgaGV2X3RocmVzaCk7CisKKyAgLy8gU3RvcmUKKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJnBbLTMgKiBzdHJpZGVdLCBwMik7CisgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZwWy0yICogc3RyaWRlXSwgcDEpOworICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmcFstMSAqIHN0cmlkZV0sIHAwKTsKKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJnBbKzAgKiBzdHJpZGVdLCBxMCk7CisgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZwWysxICogc3RyaWRlXSwgcTEpOworICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmcFsrMiAqIHN0cmlkZV0sIHEyKTsKK30KKworc3RhdGljIHZvaWQgSEZpbHRlcjE2X1NTRTIodWludDhfdCogcCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICBfX20xMjhpIG1hc2s7CisgIF9fbTEyOGkgcDMsIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIHEzOworCisgIHVpbnQ4X3QqIGNvbnN0IGIgPSBwIC0gNDsKKyAgTG9hZDE2eDRfU1NFMihiLCBiICsgOCAqIHN0cmlkZSwgc3RyaWRlLCAmcDMsICZwMiwgJnAxLCAmcDApOworICBNQVhfRElGRjEocDMsIHAyLCBwMSwgcDAsIG1hc2spOworCisgIExvYWQxNng0X1NTRTIocCwgcCArIDggKiBzdHJpZGUsIHN0cmlkZSwgJnEwLCAmcTEsICZxMiwgJnEzKTsKKyAgTUFYX0RJRkYyKHEzLCBxMiwgcTEsIHEwLCBtYXNrKTsKKworICBDb21wbGV4TWFza19TU0UyKCZwMSwgJnAwLCAmcTAsICZxMSwgdGhyZXNoLCBpdGhyZXNoLCAmbWFzayk7CisgIERvRmlsdGVyNl9TU0UyKCZwMiwgJnAxLCAmcDAsICZxMCwgJnExLCAmcTIsICZtYXNrLCBoZXZfdGhyZXNoKTsKKworICBTdG9yZTE2eDRfU1NFMigmcDMsICZwMiwgJnAxLCAmcDAsIGIsIGIgKyA4ICogc3RyaWRlLCBzdHJpZGUpOworICBTdG9yZTE2eDRfU1NFMigmcTAsICZxMSwgJnEyLCAmcTMsIHAsIHAgKyA4ICogc3RyaWRlLCBzdHJpZGUpOworfQorCisvLyBvbiB0aHJlZSBpbm5lciBlZGdlcworc3RhdGljIHZvaWQgVkZpbHRlcjE2aV9TU0UyKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIGludCBrOworICBfX20xMjhpIHAzLCBwMiwgcDEsIHAwOyAgIC8vIGxvb3AgaW52YXJpYW50cworCisgIExPQURfSF9FREdFUzQocCwgc3RyaWRlLCBwMywgcDIsIHAxLCBwMCk7ICAvLyBwcm9sb2d1ZQorCisgIGZvciAoayA9IDM7IGsgPiAwOyAtLWspIHsKKyAgICBfX20xMjhpIG1hc2ssIHRtcDEsIHRtcDI7CisgICAgdWludDhfdCogY29uc3QgYiA9IHAgKyAyICogc3RyaWRlOyAgIC8vIGJlZ2lubmluZyBvZiBwMQorICAgIHAgKz0gNCAqIHN0cmlkZTsKKworICAgIE1BWF9ESUZGMShwMywgcDIsIHAxLCBwMCwgbWFzayk7ICAgLy8gY29tcHV0ZSBwYXJ0aWFsIG1hc2sKKyAgICBMT0FEX0hfRURHRVM0KHAsIHN0cmlkZSwgcDMsIHAyLCB0bXAxLCB0bXAyKTsKKyAgICBNQVhfRElGRjIocDMsIHAyLCB0bXAxLCB0bXAyLCBtYXNrKTsKKworICAgIC8vIHAzIGFuZCBwMiBhcmUgbm90IGp1c3QgdGVtcG9yYXJ5IHZhcmlhYmxlcyBoZXJlOiB0aGV5IHdpbGwgYmUKKyAgICAvLyByZS11c2VkIGZvciBuZXh0IHNwYW4uIEFuZCBxMi9xMyB3aWxsIGJlY29tZSBwMS9wMCBhY2NvcmRpbmdseS4KKyAgICBDb21wbGV4TWFza19TU0UyKCZwMSwgJnAwLCAmcDMsICZwMiwgdGhyZXNoLCBpdGhyZXNoLCAmbWFzayk7CisgICAgRG9GaWx0ZXI0X1NTRTIoJnAxLCAmcDAsICZwMywgJnAyLCAmbWFzaywgaGV2X3RocmVzaCk7CisKKyAgICAvLyBTdG9yZQorICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZiWzAgKiBzdHJpZGVdLCBwMSk7CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJmJbMSAqIHN0cmlkZV0sIHAwKTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmYlsyICogc3RyaWRlXSwgcDMpOworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZiWzMgKiBzdHJpZGVdLCBwMik7CisKKyAgICAvLyByb3RhdGUgc2FtcGxlcworICAgIHAxID0gdG1wMTsKKyAgICBwMCA9IHRtcDI7CisgIH0KK30KKworc3RhdGljIHZvaWQgSEZpbHRlcjE2aV9TU0UyKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIGludCBrOworICBfX20xMjhpIHAzLCBwMiwgcDEsIHAwOyAgIC8vIGxvb3AgaW52YXJpYW50cworCisgIExvYWQxNng0X1NTRTIocCwgcCArIDggKiBzdHJpZGUsIHN0cmlkZSwgJnAzLCAmcDIsICZwMSwgJnAwKTsgIC8vIHByb2xvZ3VlCisKKyAgZm9yIChrID0gMzsgayA+IDA7IC0taykgeworICAgIF9fbTEyOGkgbWFzaywgdG1wMSwgdG1wMjsKKyAgICB1aW50OF90KiBjb25zdCBiID0gcCArIDI7ICAgLy8gYmVnaW5uaW5nIG9mIHAxCisKKyAgICBwICs9IDQ7ICAvLyBiZWdpbm5pbmcgb2YgcTAgKGFuZCBuZXh0IHNwYW4pCisKKyAgICBNQVhfRElGRjEocDMsIHAyLCBwMSwgcDAsIG1hc2spOyAgIC8vIGNvbXB1dGUgcGFydGlhbCBtYXNrCisgICAgTG9hZDE2eDRfU1NFMihwLCBwICsgOCAqIHN0cmlkZSwgc3RyaWRlLCAmcDMsICZwMiwgJnRtcDEsICZ0bXAyKTsKKyAgICBNQVhfRElGRjIocDMsIHAyLCB0bXAxLCB0bXAyLCBtYXNrKTsKKworICAgIENvbXBsZXhNYXNrX1NTRTIoJnAxLCAmcDAsICZwMywgJnAyLCB0aHJlc2gsIGl0aHJlc2gsICZtYXNrKTsKKyAgICBEb0ZpbHRlcjRfU1NFMigmcDEsICZwMCwgJnAzLCAmcDIsICZtYXNrLCBoZXZfdGhyZXNoKTsKKworICAgIFN0b3JlMTZ4NF9TU0UyKCZwMSwgJnAwLCAmcDMsICZwMiwgYiwgYiArIDggKiBzdHJpZGUsIHN0cmlkZSk7CisKKyAgICAvLyByb3RhdGUgc2FtcGxlcworICAgIHAxID0gdG1wMTsKKyAgICBwMCA9IHRtcDI7CisgIH0KK30KKworLy8gOC1waXhlbHMgd2lkZSB2YXJpYW50LCBmb3IgY2hyb21hIGZpbHRlcmluZworc3RhdGljIHZvaWQgVkZpbHRlcjhfU1NFMih1aW50OF90KiB1LCB1aW50OF90KiB2LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgX19tMTI4aSBtYXNrOworICBfX20xMjhpIHQxLCBwMiwgcDEsIHAwLCBxMCwgcTEsIHEyOworCisgIC8vIExvYWQgcDMsIHAyLCBwMSwgcDAKKyAgTE9BRFVWX0hfRURHRVM0KHUgLSA0ICogc3RyaWRlLCB2IC0gNCAqIHN0cmlkZSwgc3RyaWRlLCB0MSwgcDIsIHAxLCBwMCk7CisgIE1BWF9ESUZGMSh0MSwgcDIsIHAxLCBwMCwgbWFzayk7CisKKyAgLy8gTG9hZCBxMCwgcTEsIHEyLCBxMworICBMT0FEVVZfSF9FREdFUzQodSwgdiwgc3RyaWRlLCBxMCwgcTEsIHEyLCB0MSk7CisgIE1BWF9ESUZGMih0MSwgcTIsIHExLCBxMCwgbWFzayk7CisKKyAgQ29tcGxleE1hc2tfU1NFMigmcDEsICZwMCwgJnEwLCAmcTEsIHRocmVzaCwgaXRocmVzaCwgJm1hc2spOworICBEb0ZpbHRlcjZfU1NFMigmcDIsICZwMSwgJnAwLCAmcTAsICZxMSwgJnEyLCAmbWFzaywgaGV2X3RocmVzaCk7CisKKyAgLy8gU3RvcmUKKyAgU1RPUkVVVihwMiwgdSwgdiwgLTMgKiBzdHJpZGUpOworICBTVE9SRVVWKHAxLCB1LCB2LCAtMiAqIHN0cmlkZSk7CisgIFNUT1JFVVYocDAsIHUsIHYsIC0xICogc3RyaWRlKTsKKyAgU1RPUkVVVihxMCwgdSwgdiwgMCAqIHN0cmlkZSk7CisgIFNUT1JFVVYocTEsIHUsIHYsIDEgKiBzdHJpZGUpOworICBTVE9SRVVWKHEyLCB1LCB2LCAyICogc3RyaWRlKTsKK30KKworc3RhdGljIHZvaWQgSEZpbHRlcjhfU1NFMih1aW50OF90KiB1LCB1aW50OF90KiB2LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgX19tMTI4aSBtYXNrOworICBfX20xMjhpIHAzLCBwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBxMzsKKworICB1aW50OF90KiBjb25zdCB0dSA9IHUgLSA0OworICB1aW50OF90KiBjb25zdCB0diA9IHYgLSA0OworICBMb2FkMTZ4NF9TU0UyKHR1LCB0diwgc3RyaWRlLCAmcDMsICZwMiwgJnAxLCAmcDApOworICBNQVhfRElGRjEocDMsIHAyLCBwMSwgcDAsIG1hc2spOworCisgIExvYWQxNng0X1NTRTIodSwgdiwgc3RyaWRlLCAmcTAsICZxMSwgJnEyLCAmcTMpOworICBNQVhfRElGRjIocTMsIHEyLCBxMSwgcTAsIG1hc2spOworCisgIENvbXBsZXhNYXNrX1NTRTIoJnAxLCAmcDAsICZxMCwgJnExLCB0aHJlc2gsIGl0aHJlc2gsICZtYXNrKTsKKyAgRG9GaWx0ZXI2X1NTRTIoJnAyLCAmcDEsICZwMCwgJnEwLCAmcTEsICZxMiwgJm1hc2ssIGhldl90aHJlc2gpOworCisgIFN0b3JlMTZ4NF9TU0UyKCZwMywgJnAyLCAmcDEsICZwMCwgdHUsIHR2LCBzdHJpZGUpOworICBTdG9yZTE2eDRfU1NFMigmcTAsICZxMSwgJnEyLCAmcTMsIHUsIHYsIHN0cmlkZSk7Cit9CisKK3N0YXRpYyB2b2lkIFZGaWx0ZXI4aV9TU0UyKHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgX19tMTI4aSBtYXNrOworICBfX20xMjhpIHQxLCB0MiwgcDEsIHAwLCBxMCwgcTE7CisKKyAgLy8gTG9hZCBwMywgcDIsIHAxLCBwMAorICBMT0FEVVZfSF9FREdFUzQodSwgdiwgc3RyaWRlLCB0MiwgdDEsIHAxLCBwMCk7CisgIE1BWF9ESUZGMSh0MiwgdDEsIHAxLCBwMCwgbWFzayk7CisKKyAgdSArPSA0ICogc3RyaWRlOworICB2ICs9IDQgKiBzdHJpZGU7CisKKyAgLy8gTG9hZCBxMCwgcTEsIHEyLCBxMworICBMT0FEVVZfSF9FREdFUzQodSwgdiwgc3RyaWRlLCBxMCwgcTEsIHQxLCB0Mik7CisgIE1BWF9ESUZGMih0MiwgdDEsIHExLCBxMCwgbWFzayk7CisKKyAgQ29tcGxleE1hc2tfU1NFMigmcDEsICZwMCwgJnEwLCAmcTEsIHRocmVzaCwgaXRocmVzaCwgJm1hc2spOworICBEb0ZpbHRlcjRfU1NFMigmcDEsICZwMCwgJnEwLCAmcTEsICZtYXNrLCBoZXZfdGhyZXNoKTsKKworICAvLyBTdG9yZQorICBTVE9SRVVWKHAxLCB1LCB2LCAtMiAqIHN0cmlkZSk7CisgIFNUT1JFVVYocDAsIHUsIHYsIC0xICogc3RyaWRlKTsKKyAgU1RPUkVVVihxMCwgdSwgdiwgMCAqIHN0cmlkZSk7CisgIFNUT1JFVVYocTEsIHUsIHYsIDEgKiBzdHJpZGUpOworfQorCitzdGF0aWMgdm9pZCBIRmlsdGVyOGlfU1NFMih1aW50OF90KiB1LCB1aW50OF90KiB2LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIF9fbTEyOGkgbWFzazsKKyAgX19tMTI4aSB0MSwgdDIsIHAxLCBwMCwgcTAsIHExOworICBMb2FkMTZ4NF9TU0UyKHUsIHYsIHN0cmlkZSwgJnQyLCAmdDEsICZwMSwgJnAwKTsgICAvLyBwMywgcDIsIHAxLCBwMAorICBNQVhfRElGRjEodDIsIHQxLCBwMSwgcDAsIG1hc2spOworCisgIHUgKz0gNDsgIC8vIGJlZ2lubmluZyBvZiBxMAorICB2ICs9IDQ7CisgIExvYWQxNng0X1NTRTIodSwgdiwgc3RyaWRlLCAmcTAsICZxMSwgJnQxLCAmdDIpOyAgLy8gcTAsIHExLCBxMiwgcTMKKyAgTUFYX0RJRkYyKHQyLCB0MSwgcTEsIHEwLCBtYXNrKTsKKworICBDb21wbGV4TWFza19TU0UyKCZwMSwgJnAwLCAmcTAsICZxMSwgdGhyZXNoLCBpdGhyZXNoLCAmbWFzayk7CisgIERvRmlsdGVyNF9TU0UyKCZwMSwgJnAwLCAmcTAsICZxMSwgJm1hc2ssIGhldl90aHJlc2gpOworCisgIHUgLT0gMjsgIC8vIGJlZ2lubmluZyBvZiBwMQorICB2IC09IDI7CisgIFN0b3JlMTZ4NF9TU0UyKCZwMSwgJnAwLCAmcTAsICZxMSwgdSwgdiwgc3RyaWRlKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIDR4NCBwcmVkaWN0aW9ucworCisjZGVmaW5lIERTVCh4LCB5KSBkc3RbKHgpICsgKHkpICogQlBTXQorI2RlZmluZSBBVkczKGEsIGIsIGMpICgoKGEpICsgMiAqIChiKSArIChjKSArIDIpID4+IDIpCisKKy8vIFdlIHVzZSB0aGUgZm9sbG93aW5nIDhiLWFyaXRobWV0aWMgdHJpY2tzOgorLy8gICAgIChhICsgMiAqIGIgKyBjICsgMikgPj4gMiA9IChBQyArIGIgKyAxKSA+PiAxCisvLyAgIHdoZXJlOiBBQyA9IChhICsgYykgPj4gMSA9IFsoYSArIGMgKyAxKSA+PiAxXSAtIFsoYV5jKSAmIDFdCisvLyBhbmQ6CisvLyAgICAgKGEgKyAyICogYiArIGMgKyAyKSA+PiAyID0gKEFCICsgQkMgKyAxKSA+PiAxIC0gKGFifGJjKSZsc2IKKy8vICAgd2hlcmU6IEFDID0gKGEgKyBiICsgMSkgPj4gMSwgICBCQyA9IChiICsgYyArIDEpID4+IDEKKy8vICAgYW5kIGFiID0gYSBeIGIsIGJjID0gYiBeIGMsIGxzYiA9IChBQ15CQykmMQorCitzdGF0aWMgdm9pZCBWRTRfU1NFMih1aW50OF90KiBkc3QpIHsgICAgLy8gdmVydGljYWwKKyAgY29uc3QgX19tMTI4aSBvbmUgPSBfbW1fc2V0MV9lcGk4KDEpOworICBjb25zdCBfX20xMjhpIEFCQ0RFRkdIID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikoZHN0IC0gQlBTIC0gMSkpOworICBjb25zdCBfX20xMjhpIEJDREVGR0gwID0gX21tX3NybGlfc2kxMjgoQUJDREVGR0gsIDEpOworICBjb25zdCBfX20xMjhpIENERUZHSDAwID0gX21tX3NybGlfc2kxMjgoQUJDREVGR0gsIDIpOworICBjb25zdCBfX20xMjhpIGEgPSBfbW1fYXZnX2VwdTgoQUJDREVGR0gsIENERUZHSDAwKTsKKyAgY29uc3QgX19tMTI4aSBsc2IgPSBfbW1fYW5kX3NpMTI4KF9tbV94b3Jfc2kxMjgoQUJDREVGR0gsIENERUZHSDAwKSwgb25lKTsKKyAgY29uc3QgX19tMTI4aSBiID0gX21tX3N1YnNfZXB1OChhLCBsc2IpOworICBjb25zdCBfX20xMjhpIGF2ZyA9IF9tbV9hdmdfZXB1OChiLCBCQ0RFRkdIMCk7CisgIGNvbnN0IHVpbnQzMl90IHZhbHMgPSBfbW1fY3Z0c2kxMjhfc2kzMihhdmcpOworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeworICAgIFdlYlBVaW50MzJUb01lbShkc3QgKyBpICogQlBTLCB2YWxzKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBMRDRfU1NFMih1aW50OF90KiBkc3QpIHsgICAvLyBEb3duLUxlZnQKKyAgY29uc3QgX19tMTI4aSBvbmUgPSBfbW1fc2V0MV9lcGk4KDEpOworICBjb25zdCBfX20xMjhpIEFCQ0RFRkdIID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikoZHN0IC0gQlBTKSk7CisgIGNvbnN0IF9fbTEyOGkgQkNERUZHSDAgPSBfbW1fc3JsaV9zaTEyOChBQkNERUZHSCwgMSk7CisgIGNvbnN0IF9fbTEyOGkgQ0RFRkdIMDAgPSBfbW1fc3JsaV9zaTEyOChBQkNERUZHSCwgMik7CisgIGNvbnN0IF9fbTEyOGkgQ0RFRkdISDAgPSBfbW1faW5zZXJ0X2VwaTE2KENERUZHSDAwLCBkc3RbLUJQUyArIDddLCAzKTsKKyAgY29uc3QgX19tMTI4aSBhdmcxID0gX21tX2F2Z19lcHU4KEFCQ0RFRkdILCBDREVGR0hIMCk7CisgIGNvbnN0IF9fbTEyOGkgbHNiID0gX21tX2FuZF9zaTEyOChfbW1feG9yX3NpMTI4KEFCQ0RFRkdILCBDREVGR0hIMCksIG9uZSk7CisgIGNvbnN0IF9fbTEyOGkgYXZnMiA9IF9tbV9zdWJzX2VwdTgoYXZnMSwgbHNiKTsKKyAgY29uc3QgX19tMTI4aSBhYmNkZWZnID0gX21tX2F2Z19lcHU4KGF2ZzIsIEJDREVGR0gwKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDAgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKCAgICAgICAgICAgICAgIGFiY2RlZmcgICAgKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAxICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMihfbW1fc3JsaV9zaTEyOChhYmNkZWZnLCAxKSkpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMiAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoX21tX3NybGlfc2kxMjgoYWJjZGVmZywgMikpKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDMgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKF9tbV9zcmxpX3NpMTI4KGFiY2RlZmcsIDMpKSk7Cit9CisKK3N0YXRpYyB2b2lkIFZSNF9TU0UyKHVpbnQ4X3QqIGRzdCkgeyAgIC8vIFZlcnRpY2FsLVJpZ2h0CisgIGNvbnN0IF9fbTEyOGkgb25lID0gX21tX3NldDFfZXBpOCgxKTsKKyAgY29uc3QgaW50IEkgPSBkc3RbLTEgKyAwICogQlBTXTsKKyAgY29uc3QgaW50IEogPSBkc3RbLTEgKyAxICogQlBTXTsKKyAgY29uc3QgaW50IEsgPSBkc3RbLTEgKyAyICogQlBTXTsKKyAgY29uc3QgaW50IFggPSBkc3RbLTEgLSBCUFNdOworICBjb25zdCBfX20xMjhpIFhBQkNEID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikoZHN0IC0gQlBTIC0gMSkpOworICBjb25zdCBfX20xMjhpIEFCQ0QwID0gX21tX3NybGlfc2kxMjgoWEFCQ0QsIDEpOworICBjb25zdCBfX20xMjhpIGFiY2QgPSBfbW1fYXZnX2VwdTgoWEFCQ0QsIEFCQ0QwKTsKKyAgY29uc3QgX19tMTI4aSBfWEFCQ0QgPSBfbW1fc2xsaV9zaTEyOChYQUJDRCwgMSk7CisgIGNvbnN0IF9fbTEyOGkgSVhBQkNEID0gX21tX2luc2VydF9lcGkxNihfWEFCQ0QsIEkgfCAoWCA8PCA4KSwgMCk7CisgIGNvbnN0IF9fbTEyOGkgYXZnMSA9IF9tbV9hdmdfZXB1OChJWEFCQ0QsIEFCQ0QwKTsKKyAgY29uc3QgX19tMTI4aSBsc2IgPSBfbW1fYW5kX3NpMTI4KF9tbV94b3Jfc2kxMjgoSVhBQkNELCBBQkNEMCksIG9uZSk7CisgIGNvbnN0IF9fbTEyOGkgYXZnMiA9IF9tbV9zdWJzX2VwdTgoYXZnMSwgbHNiKTsKKyAgY29uc3QgX19tMTI4aSBlZmdoID0gX21tX2F2Z19lcHU4KGF2ZzIsIFhBQkNEKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDAgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKCAgICAgICAgICAgICAgIGFiY2QgICAgKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAxICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMiggICAgICAgICAgICAgICBlZmdoICAgICkpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMiAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoX21tX3NsbGlfc2kxMjgoYWJjZCwgMSkpKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDMgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKF9tbV9zbGxpX3NpMTI4KGVmZ2gsIDEpKSk7CisKKyAgLy8gdGhlc2UgdHdvIGFyZSBoYXJkIHRvIGltcGxlbWVudCBpbiBTU0UyLCBzbyB3ZSBrZWVwIHRoZSBDLXZlcnNpb246CisgIERTVCgwLCAyKSA9IEFWRzMoSiwgSSwgWCk7CisgIERTVCgwLCAzKSA9IEFWRzMoSywgSiwgSSk7Cit9CisKK3N0YXRpYyB2b2lkIFZMNF9TU0UyKHVpbnQ4X3QqIGRzdCkgeyAgIC8vIFZlcnRpY2FsLUxlZnQKKyAgY29uc3QgX19tMTI4aSBvbmUgPSBfbW1fc2V0MV9lcGk4KDEpOworICBjb25zdCBfX20xMjhpIEFCQ0RFRkdIID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikoZHN0IC0gQlBTKSk7CisgIGNvbnN0IF9fbTEyOGkgQkNERUZHSF8gPSBfbW1fc3JsaV9zaTEyOChBQkNERUZHSCwgMSk7CisgIGNvbnN0IF9fbTEyOGkgQ0RFRkdIX18gPSBfbW1fc3JsaV9zaTEyOChBQkNERUZHSCwgMik7CisgIGNvbnN0IF9fbTEyOGkgYXZnMSA9IF9tbV9hdmdfZXB1OChBQkNERUZHSCwgQkNERUZHSF8pOworICBjb25zdCBfX20xMjhpIGF2ZzIgPSBfbW1fYXZnX2VwdTgoQ0RFRkdIX18sIEJDREVGR0hfKTsKKyAgY29uc3QgX19tMTI4aSBhdmczID0gX21tX2F2Z19lcHU4KGF2ZzEsIGF2ZzIpOworICBjb25zdCBfX20xMjhpIGxzYjEgPSBfbW1fYW5kX3NpMTI4KF9tbV94b3Jfc2kxMjgoYXZnMSwgYXZnMiksIG9uZSk7CisgIGNvbnN0IF9fbTEyOGkgYWIgPSBfbW1feG9yX3NpMTI4KEFCQ0RFRkdILCBCQ0RFRkdIXyk7CisgIGNvbnN0IF9fbTEyOGkgYmMgPSBfbW1feG9yX3NpMTI4KENERUZHSF9fLCBCQ0RFRkdIXyk7CisgIGNvbnN0IF9fbTEyOGkgYWJiYyA9IF9tbV9vcl9zaTEyOChhYiwgYmMpOworICBjb25zdCBfX20xMjhpIGxzYjIgPSBfbW1fYW5kX3NpMTI4KGFiYmMsIGxzYjEpOworICBjb25zdCBfX20xMjhpIGF2ZzQgPSBfbW1fc3Vic19lcHU4KGF2ZzMsIGxzYjIpOworICBjb25zdCB1aW50MzJfdCBleHRyYV9vdXQgPSBfbW1fY3Z0c2kxMjhfc2kzMihfbW1fc3JsaV9zaTEyOChhdmc0LCA0KSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAwICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMiggICAgICAgICAgICAgICBhdmcxICAgICkpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMSAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoICAgICAgICAgICAgICAgYXZnNCAgICApKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDIgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKF9tbV9zcmxpX3NpMTI4KGF2ZzEsIDEpKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAzICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMihfbW1fc3JsaV9zaTEyOChhdmc0LCAxKSkpOworCisgIC8vIHRoZXNlIHR3byBhcmUgaGFyZCB0byBnZXQgYW5kIGlycmVndWxhcgorICBEU1QoMywgMikgPSAoZXh0cmFfb3V0ID4+IDApICYgMHhmZjsKKyAgRFNUKDMsIDMpID0gKGV4dHJhX291dCA+PiA4KSAmIDB4ZmY7Cit9CisKK3N0YXRpYyB2b2lkIFJENF9TU0UyKHVpbnQ4X3QqIGRzdCkgeyAgIC8vIERvd24tcmlnaHQKKyAgY29uc3QgX19tMTI4aSBvbmUgPSBfbW1fc2V0MV9lcGk4KDEpOworICBjb25zdCBfX20xMjhpIFhBQkNEID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikoZHN0IC0gQlBTIC0gMSkpOworICBjb25zdCBfX20xMjhpIF9fX19YQUJDRCA9IF9tbV9zbGxpX3NpMTI4KFhBQkNELCA0KTsKKyAgY29uc3QgdWludDMyX3QgSSA9IGRzdFstMSArIDAgKiBCUFNdOworICBjb25zdCB1aW50MzJfdCBKID0gZHN0Wy0xICsgMSAqIEJQU107CisgIGNvbnN0IHVpbnQzMl90IEsgPSBkc3RbLTEgKyAyICogQlBTXTsKKyAgY29uc3QgdWludDMyX3QgTCA9IGRzdFstMSArIDMgKiBCUFNdOworICBjb25zdCBfX20xMjhpIExLSklfX19fXyA9CisgICAgICBfbW1fY3Z0c2kzMl9zaTEyOChMIHwgKEsgPDwgOCkgfCAoSiA8PCAxNikgfCAoSSA8PCAyNCkpOworICBjb25zdCBfX20xMjhpIExLSklYQUJDRCA9IF9tbV9vcl9zaTEyOChMS0pJX19fX18sIF9fX19YQUJDRCk7CisgIGNvbnN0IF9fbTEyOGkgS0pJWEFCQ0RfID0gX21tX3NybGlfc2kxMjgoTEtKSVhBQkNELCAxKTsKKyAgY29uc3QgX19tMTI4aSBKSVhBQkNEX18gPSBfbW1fc3JsaV9zaTEyOChMS0pJWEFCQ0QsIDIpOworICBjb25zdCBfX20xMjhpIGF2ZzEgPSBfbW1fYXZnX2VwdTgoSklYQUJDRF9fLCBMS0pJWEFCQ0QpOworICBjb25zdCBfX20xMjhpIGxzYiA9IF9tbV9hbmRfc2kxMjgoX21tX3hvcl9zaTEyOChKSVhBQkNEX18sIExLSklYQUJDRCksIG9uZSk7CisgIGNvbnN0IF9fbTEyOGkgYXZnMiA9IF9tbV9zdWJzX2VwdTgoYXZnMSwgbHNiKTsKKyAgY29uc3QgX19tMTI4aSBhYmNkZWZnID0gX21tX2F2Z19lcHU4KGF2ZzIsIEtKSVhBQkNEXyk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAzICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMiggICAgICAgICAgICAgICBhYmNkZWZnICAgICkpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMiAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoX21tX3NybGlfc2kxMjgoYWJjZGVmZywgMSkpKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDEgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKF9tbV9zcmxpX3NpMTI4KGFiY2RlZmcsIDIpKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAwICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMihfbW1fc3JsaV9zaTEyOChhYmNkZWZnLCAzKSkpOworfQorCisjdW5kZWYgRFNUCisjdW5kZWYgQVZHMworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTHVtYSAxNngxNgorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBUcnVlTW90aW9uX1NTRTIodWludDhfdCogZHN0LCBpbnQgc2l6ZSkgeworICBjb25zdCB1aW50OF90KiB0b3AgPSBkc3QgLSBCUFM7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGludCB5OworICBpZiAoc2l6ZSA9PSA0KSB7CisgICAgY29uc3QgX19tMTI4aSB0b3BfdmFsdWVzID0gX21tX2N2dHNpMzJfc2kxMjgoV2ViUE1lbVRvVWludDMyKHRvcCkpOworICAgIGNvbnN0IF9fbTEyOGkgdG9wX2Jhc2UgPSBfbW1fdW5wYWNrbG9fZXBpOCh0b3BfdmFsdWVzLCB6ZXJvKTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgNDsgKyt5LCBkc3QgKz0gQlBTKSB7CisgICAgICBjb25zdCBpbnQgdmFsID0gZHN0Wy0xXSAtIHRvcFstMV07CisgICAgICBjb25zdCBfX20xMjhpIGJhc2UgPSBfbW1fc2V0MV9lcGkxNih2YWwpOworICAgICAgY29uc3QgX19tMTI4aSBvdXQgPSBfbW1fcGFja3VzX2VwaTE2KF9tbV9hZGRfZXBpMTYoYmFzZSwgdG9wX2Jhc2UpLCB6ZXJvKTsKKyAgICAgIFdlYlBVaW50MzJUb01lbShkc3QsIF9tbV9jdnRzaTEyOF9zaTMyKG91dCkpOworICAgIH0KKyAgfSBlbHNlIGlmIChzaXplID09IDgpIHsKKyAgICBjb25zdCBfX20xMjhpIHRvcF92YWx1ZXMgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKXRvcCk7CisgICAgY29uc3QgX19tMTI4aSB0b3BfYmFzZSA9IF9tbV91bnBhY2tsb19lcGk4KHRvcF92YWx1ZXMsIHplcm8pOworICAgIGZvciAoeSA9IDA7IHkgPCA4OyArK3ksIGRzdCArPSBCUFMpIHsKKyAgICAgIGNvbnN0IGludCB2YWwgPSBkc3RbLTFdIC0gdG9wWy0xXTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYmFzZSA9IF9tbV9zZXQxX2VwaTE2KHZhbCk7CisgICAgICBjb25zdCBfX20xMjhpIG91dCA9IF9tbV9wYWNrdXNfZXBpMTYoX21tX2FkZF9lcGkxNihiYXNlLCB0b3BfYmFzZSksIHplcm8pOworICAgICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopZHN0LCBvdXQpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBjb25zdCBfX20xMjhpIHRvcF92YWx1ZXMgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKXRvcCk7CisgICAgY29uc3QgX19tMTI4aSB0b3BfYmFzZV8wID0gX21tX3VucGFja2xvX2VwaTgodG9wX3ZhbHVlcywgemVybyk7CisgICAgY29uc3QgX19tMTI4aSB0b3BfYmFzZV8xID0gX21tX3VucGFja2hpX2VwaTgodG9wX3ZhbHVlcywgemVybyk7CisgICAgZm9yICh5ID0gMDsgeSA8IDE2OyArK3ksIGRzdCArPSBCUFMpIHsKKyAgICAgIGNvbnN0IGludCB2YWwgPSBkc3RbLTFdIC0gdG9wWy0xXTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYmFzZSA9IF9tbV9zZXQxX2VwaTE2KHZhbCk7CisgICAgICBjb25zdCBfX20xMjhpIG91dF8wID0gX21tX2FkZF9lcGkxNihiYXNlLCB0b3BfYmFzZV8wKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgb3V0XzEgPSBfbW1fYWRkX2VwaTE2KGJhc2UsIHRvcF9iYXNlXzEpOworICAgICAgY29uc3QgX19tMTI4aSBvdXQgPSBfbW1fcGFja3VzX2VwaTE2KG91dF8wLCBvdXRfMSk7CisgICAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKilkc3QsIG91dCk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIFRNNF9TU0UyKHVpbnQ4X3QqIGRzdCkgICB7IFRydWVNb3Rpb25fU1NFMihkc3QsIDQpOyB9CitzdGF0aWMgdm9pZCBUTTh1dl9TU0UyKHVpbnQ4X3QqIGRzdCkgeyBUcnVlTW90aW9uX1NTRTIoZHN0LCA4KTsgfQorc3RhdGljIHZvaWQgVE0xNl9TU0UyKHVpbnQ4X3QqIGRzdCkgIHsgVHJ1ZU1vdGlvbl9TU0UyKGRzdCwgMTYpOyB9CisKK3N0YXRpYyB2b2lkIFZFMTZfU1NFMih1aW50OF90KiBkc3QpIHsKKyAgY29uc3QgX19tMTI4aSB0b3AgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShkc3QgLSBCUFMpKTsKKyAgaW50IGo7CisgIGZvciAoaiA9IDA7IGogPCAxNjsgKytqKSB7CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopKGRzdCArIGogKiBCUFMpLCB0b3ApOworICB9Cit9CisKK3N0YXRpYyB2b2lkIEhFMTZfU1NFMih1aW50OF90KiBkc3QpIHsgICAgIC8vIGhvcml6b250YWwKKyAgaW50IGo7CisgIGZvciAoaiA9IDE2OyBqID4gMDsgLS1qKSB7CisgICAgY29uc3QgX19tMTI4aSB2YWx1ZXMgPSBfbW1fc2V0MV9lcGk4KGRzdFstMV0pOworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKWRzdCwgdmFsdWVzKTsKKyAgICBkc3QgKz0gQlBTOworICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFB1dDE2X1NTRTIodWludDhfdCB2LCB1aW50OF90KiBkc3QpIHsKKyAgaW50IGo7CisgIGNvbnN0IF9fbTEyOGkgdmFsdWVzID0gX21tX3NldDFfZXBpOCh2KTsKKyAgZm9yIChqID0gMDsgaiA8IDE2OyArK2opIHsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikoZHN0ICsgaiAqIEJQUyksIHZhbHVlcyk7CisgIH0KK30KKworc3RhdGljIHZvaWQgREMxNl9TU0UyKHVpbnQ4X3QqIGRzdCkgeyAgLy8gREMKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgY29uc3QgX19tMTI4aSB0b3AgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShkc3QgLSBCUFMpKTsKKyAgY29uc3QgX19tMTI4aSBzYWQ4eDIgPSBfbW1fc2FkX2VwdTgodG9wLCB6ZXJvKTsKKyAgLy8gc3VtIHRoZSB0d28gc2Fkczogc2FkOHgyWzA6MV0gKyBzYWQ4eDJbODo5XQorICBjb25zdCBfX20xMjhpIHN1bSA9IF9tbV9hZGRfZXBpMTYoc2FkOHgyLCBfbW1fc2h1ZmZsZV9lcGkzMihzYWQ4eDIsIDIpKTsKKyAgaW50IGxlZnQgPSAwOworICBpbnQgajsKKyAgZm9yIChqID0gMDsgaiA8IDE2OyArK2opIHsKKyAgICBsZWZ0ICs9IGRzdFstMSArIGogKiBCUFNdOworICB9CisgIHsKKyAgICBjb25zdCBpbnQgREMgPSBfbW1fY3Z0c2kxMjhfc2kzMihzdW0pICsgbGVmdCArIDE2OworICAgIFB1dDE2X1NTRTIoREMgPj4gNSwgZHN0KTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBEQzE2Tm9Ub3BfU1NFMih1aW50OF90KiBkc3QpIHsgIC8vIERDIHdpdGggdG9wIHNhbXBsZXMgdW5hdmFpbGFibGUKKyAgaW50IERDID0gODsKKyAgaW50IGo7CisgIGZvciAoaiA9IDA7IGogPCAxNjsgKytqKSB7CisgICAgREMgKz0gZHN0Wy0xICsgaiAqIEJQU107CisgIH0KKyAgUHV0MTZfU1NFMihEQyA+PiA0LCBkc3QpOworfQorCitzdGF0aWMgdm9pZCBEQzE2Tm9MZWZ0X1NTRTIodWludDhfdCogZHN0KSB7ICAvLyBEQyB3aXRoIGxlZnQgc2FtcGxlcyB1bmF2YWlsYWJsZQorICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBjb25zdCBfX20xMjhpIHRvcCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKGRzdCAtIEJQUykpOworICBjb25zdCBfX20xMjhpIHNhZDh4MiA9IF9tbV9zYWRfZXB1OCh0b3AsIHplcm8pOworICAvLyBzdW0gdGhlIHR3byBzYWRzOiBzYWQ4eDJbMDoxXSArIHNhZDh4Mls4OjldCisgIGNvbnN0IF9fbTEyOGkgc3VtID0gX21tX2FkZF9lcGkxNihzYWQ4eDIsIF9tbV9zaHVmZmxlX2VwaTMyKHNhZDh4MiwgMikpOworICBjb25zdCBpbnQgREMgPSBfbW1fY3Z0c2kxMjhfc2kzMihzdW0pICsgODsKKyAgUHV0MTZfU1NFMihEQyA+PiA0LCBkc3QpOworfQorCitzdGF0aWMgdm9pZCBEQzE2Tm9Ub3BMZWZ0X1NTRTIodWludDhfdCogZHN0KSB7ICAvLyBEQyB3aXRoIG5vIHRvcCAmIGxlZnQgc2FtcGxlcworICBQdXQxNl9TU0UyKDB4ODAsIGRzdCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDaHJvbWEKKworc3RhdGljIHZvaWQgVkU4dXZfU1NFMih1aW50OF90KiBkc3QpIHsgICAgLy8gdmVydGljYWwKKyAgaW50IGo7CisgIGNvbnN0IF9fbTEyOGkgdG9wID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikoZHN0IC0gQlBTKSk7CisgIGZvciAoaiA9IDA7IGogPCA4OyArK2opIHsKKyAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikoZHN0ICsgaiAqIEJQUyksIHRvcCk7CisgIH0KK30KKworLy8gaGVscGVyIGZvciBjaHJvbWEtREMgcHJlZGljdGlvbnMKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFB1dDh4OHV2X1NTRTIodWludDhfdCB2LCB1aW50OF90KiBkc3QpIHsKKyAgaW50IGo7CisgIGNvbnN0IF9fbTEyOGkgdmFsdWVzID0gX21tX3NldDFfZXBpOCh2KTsKKyAgZm9yIChqID0gMDsgaiA8IDg7ICsraikgeworICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKShkc3QgKyBqICogQlBTKSwgdmFsdWVzKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBEQzh1dl9TU0UyKHVpbnQ4X3QqIGRzdCkgeyAgICAgLy8gREMKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgY29uc3QgX19tMTI4aSB0b3AgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKShkc3QgLSBCUFMpKTsKKyAgY29uc3QgX19tMTI4aSBzdW0gPSBfbW1fc2FkX2VwdTgodG9wLCB6ZXJvKTsKKyAgaW50IGxlZnQgPSAwOworICBpbnQgajsKKyAgZm9yIChqID0gMDsgaiA8IDg7ICsraikgeworICAgIGxlZnQgKz0gZHN0Wy0xICsgaiAqIEJQU107CisgIH0KKyAgeworICAgIGNvbnN0IGludCBEQyA9IF9tbV9jdnRzaTEyOF9zaTMyKHN1bSkgKyBsZWZ0ICsgODsKKyAgICBQdXQ4eDh1dl9TU0UyKERDID4+IDQsIGRzdCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgREM4dXZOb0xlZnRfU1NFMih1aW50OF90KiBkc3QpIHsgICAvLyBEQyB3aXRoIG5vIGxlZnQgc2FtcGxlcworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBjb25zdCBfX20xMjhpIHRvcCA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopKGRzdCAtIEJQUykpOworICBjb25zdCBfX20xMjhpIHN1bSA9IF9tbV9zYWRfZXB1OCh0b3AsIHplcm8pOworICBjb25zdCBpbnQgREMgPSBfbW1fY3Z0c2kxMjhfc2kzMihzdW0pICsgNDsKKyAgUHV0OHg4dXZfU1NFMihEQyA+PiAzLCBkc3QpOworfQorCitzdGF0aWMgdm9pZCBEQzh1dk5vVG9wX1NTRTIodWludDhfdCogZHN0KSB7ICAvLyBEQyB3aXRoIG5vIHRvcCBzYW1wbGVzCisgIGludCBkYzAgPSA0OworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IDg7ICsraSkgeworICAgIGRjMCArPSBkc3RbLTEgKyBpICogQlBTXTsKKyAgfQorICBQdXQ4eDh1dl9TU0UyKGRjMCA+PiAzLCBkc3QpOworfQorCitzdGF0aWMgdm9pZCBEQzh1dk5vVG9wTGVmdF9TU0UyKHVpbnQ4X3QqIGRzdCkgeyAgICAvLyBEQyB3aXRoIG5vdGhpbmcKKyAgUHV0OHg4dXZfU1NFMigweDgwLCBkc3QpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgVlA4RHNwSW5pdFNTRTIodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBWUDhEc3BJbml0U1NFMih2b2lkKSB7CisgIFZQOFRyYW5zZm9ybSA9IFRyYW5zZm9ybV9TU0UyOworI2lmIChVU0VfVFJBTlNGT1JNX0FDMyA9PSAxKQorICBWUDhUcmFuc2Zvcm1BQzMgPSBUcmFuc2Zvcm1BQzNfU1NFMjsKKyNlbmRpZgorCisgIFZQOFZGaWx0ZXIxNiA9IFZGaWx0ZXIxNl9TU0UyOworICBWUDhIRmlsdGVyMTYgPSBIRmlsdGVyMTZfU1NFMjsKKyAgVlA4VkZpbHRlcjggPSBWRmlsdGVyOF9TU0UyOworICBWUDhIRmlsdGVyOCA9IEhGaWx0ZXI4X1NTRTI7CisgIFZQOFZGaWx0ZXIxNmkgPSBWRmlsdGVyMTZpX1NTRTI7CisgIFZQOEhGaWx0ZXIxNmkgPSBIRmlsdGVyMTZpX1NTRTI7CisgIFZQOFZGaWx0ZXI4aSA9IFZGaWx0ZXI4aV9TU0UyOworICBWUDhIRmlsdGVyOGkgPSBIRmlsdGVyOGlfU1NFMjsKKworICBWUDhTaW1wbGVWRmlsdGVyMTYgPSBTaW1wbGVWRmlsdGVyMTZfU1NFMjsKKyAgVlA4U2ltcGxlSEZpbHRlcjE2ID0gU2ltcGxlSEZpbHRlcjE2X1NTRTI7CisgIFZQOFNpbXBsZVZGaWx0ZXIxNmkgPSBTaW1wbGVWRmlsdGVyMTZpX1NTRTI7CisgIFZQOFNpbXBsZUhGaWx0ZXIxNmkgPSBTaW1wbGVIRmlsdGVyMTZpX1NTRTI7CisKKyAgVlA4UHJlZEx1bWE0WzFdID0gVE00X1NTRTI7CisgIFZQOFByZWRMdW1hNFsyXSA9IFZFNF9TU0UyOworICBWUDhQcmVkTHVtYTRbNF0gPSBSRDRfU1NFMjsKKyAgVlA4UHJlZEx1bWE0WzVdID0gVlI0X1NTRTI7CisgIFZQOFByZWRMdW1hNFs2XSA9IExENF9TU0UyOworICBWUDhQcmVkTHVtYTRbN10gPSBWTDRfU1NFMjsKKworICBWUDhQcmVkTHVtYTE2WzBdID0gREMxNl9TU0UyOworICBWUDhQcmVkTHVtYTE2WzFdID0gVE0xNl9TU0UyOworICBWUDhQcmVkTHVtYTE2WzJdID0gVkUxNl9TU0UyOworICBWUDhQcmVkTHVtYTE2WzNdID0gSEUxNl9TU0UyOworICBWUDhQcmVkTHVtYTE2WzRdID0gREMxNk5vVG9wX1NTRTI7CisgIFZQOFByZWRMdW1hMTZbNV0gPSBEQzE2Tm9MZWZ0X1NTRTI7CisgIFZQOFByZWRMdW1hMTZbNl0gPSBEQzE2Tm9Ub3BMZWZ0X1NTRTI7CisKKyAgVlA4UHJlZENocm9tYThbMF0gPSBEQzh1dl9TU0UyOworICBWUDhQcmVkQ2hyb21hOFsxXSA9IFRNOHV2X1NTRTI7CisgIFZQOFByZWRDaHJvbWE4WzJdID0gVkU4dXZfU1NFMjsKKyAgVlA4UHJlZENocm9tYThbNF0gPSBEQzh1dk5vVG9wX1NTRTI7CisgIFZQOFByZWRDaHJvbWE4WzVdID0gREM4dXZOb0xlZnRfU1NFMjsKKyAgVlA4UHJlZENocm9tYThbNl0gPSBEQzh1dk5vVG9wTGVmdF9TU0UyOworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX1NTRTIKKworV0VCUF9EU1BfSU5JVF9TVFVCKFZQOERzcEluaXRTU0UyKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX1NTRTIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZGVjX3NzZTQxLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2RlY19zc2U0MS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMTg1MDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2RlY19zc2U0MS5jCkBAIC0wLDAgKzEsNDYgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBTU0U0IHZlcnNpb24gb2Ygc29tZSBkZWNvZGluZyBmdW5jdGlvbnMuCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTQxKQorCisjaW5jbHVkZSA8c21taW50cmluLmg+CisjaW5jbHVkZSAic3JjL2RlYy92cDhpX2RlYy5oIgorI2luY2x1ZGUgInNyYy91dGlscy91dGlscy5oIgorCitzdGF0aWMgdm9pZCBIRTE2X1NTRTQxKHVpbnQ4X3QqIGRzdCkgeyAgICAgLy8gaG9yaXpvbnRhbAorICBpbnQgajsKKyAgY29uc3QgX19tMTI4aSBrU2h1ZmZsZTMgPSBfbW1fc2V0MV9lcGk4KDMpOworICBmb3IgKGogPSAxNjsgaiA+IDA7IC0taikgeworICAgIGNvbnN0IF9fbTEyOGkgaW4gPSBfbW1fY3Z0c2kzMl9zaTEyOChXZWJQTWVtVG9VaW50MzIoZHN0IC0gNCkpOworICAgIGNvbnN0IF9fbTEyOGkgdmFsdWVzID0gX21tX3NodWZmbGVfZXBpOChpbiwga1NodWZmbGUzKTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKilkc3QsIHZhbHVlcyk7CisgICAgZHN0ICs9IEJQUzsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgVlA4RHNwSW5pdFNTRTQxKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgVlA4RHNwSW5pdFNTRTQxKHZvaWQpIHsKKyAgVlA4UHJlZEx1bWExNlszXSA9IEhFMTZfU1NFNDE7Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfU1NFNDEKKworV0VCUF9EU1BfSU5JVF9TVFVCKFZQOERzcEluaXRTU0U0MSkKKworI2VuZGlmICAvLyBXRUJQX1VTRV9TU0U0MQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9kc3AuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZHNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y5YmI1MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZHNwLmgKQEAgLTAsMCArMSw2OTMgQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIFNwZWVkLWNyaXRpY2FsIGZ1bmN0aW9ucy4KKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaWZuZGVmIFdFQlBfRFNQX0RTUF9IXworI2RlZmluZSBXRUJQX0RTUF9EU1BfSF8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJzcmMvd2VicC9jb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAic3JjL3dlYnAvdHlwZXMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIEJQUyAzMiAgIC8vIHRoaXMgaXMgdGhlIGNvbW1vbiBzdHJpZGUgZm9yIGVuYy9kZWMKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENQVSBkZXRlY3Rpb24KKworI2lmIGRlZmluZWQoX19HTlVDX18pCisjIGRlZmluZSBMT0NBTF9HQ0NfVkVSU0lPTiAoKF9fR05VQ19fIDw8IDgpIHwgX19HTlVDX01JTk9SX18pCisjIGRlZmluZSBMT0NBTF9HQ0NfUFJFUkVRKG1haiwgbWluKSBcCisgICAgKExPQ0FMX0dDQ19WRVJTSU9OID49ICgoKG1haikgPDwgOCkgfCAobWluKSkpCisjZWxzZQorIyBkZWZpbmUgTE9DQUxfR0NDX1ZFUlNJT04gMAorIyBkZWZpbmUgTE9DQUxfR0NDX1BSRVJFUShtYWosIG1pbikgMAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fY2xhbmdfXykKKyMgZGVmaW5lIExPQ0FMX0NMQU5HX1ZFUlNJT04gKChfX2NsYW5nX21ham9yX18gPDwgOCkgfCBfX2NsYW5nX21pbm9yX18pCisjIGRlZmluZSBMT0NBTF9DTEFOR19QUkVSRVEobWFqLCBtaW4pIFwKKyAgICAoTE9DQUxfQ0xBTkdfVkVSU0lPTiA+PSAoKChtYWopIDw8IDgpIHwgKG1pbikpKQorI2Vsc2UKKyMgZGVmaW5lIExPQ0FMX0NMQU5HX1ZFUlNJT04gMAorIyBkZWZpbmUgTE9DQUxfQ0xBTkdfUFJFUkVRKG1haiwgbWluKSAwCisjZW5kaWYKKworI2lmbmRlZiBfX2hhc19idWlsdGluCisjIGRlZmluZSBfX2hhc19idWlsdGluKHgpIDAKKyNlbmRpZgorCisvLyBmb3Igbm93LCBub25lIG9mIHRoZSBvcHRpbWl6YXRpb25zIGJlbG93IGFyZSBhdmFpbGFibGUgaW4gZW1zY3JpcHRlbgorI2lmICFkZWZpbmVkKEVNU0NSSVBURU4pCisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBfTVNDX1ZFUiA+IDEzMTAgJiYgXAorICAgIChkZWZpbmVkKF9NX1g2NCkgfHwgZGVmaW5lZChfTV9JWDg2KSkKKyNkZWZpbmUgV0VCUF9NU0NfU1NFMiAgLy8gVmlzdWFsIEMrKyBTU0UyIHRhcmdldHMKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVIgPj0gMTUwMCAmJiBcCisgICAgKGRlZmluZWQoX01fWDY0KSB8fCBkZWZpbmVkKF9NX0lYODYpKQorI2RlZmluZSBXRUJQX01TQ19TU0U0MSAgLy8gVmlzdWFsIEMrKyBTU0U0LjEgdGFyZ2V0cworI2VuZGlmCisKKy8vIFdFQlBfSEFWRV8qIGFyZSB1c2VkIHRvIGluZGljYXRlIHRoZSBwcmVzZW5jZSBvZiB0aGUgaW5zdHJ1Y3Rpb24gc2V0IGluIGRzcAorLy8gZmlsZXMgd2l0aG91dCBpbnRyaW5zaWNzLCBhbGxvd2luZyB0aGUgY29ycmVzcG9uZGluZyBJbml0KCkgdG8gYmUgY2FsbGVkLgorLy8gRmlsZXMgY29udGFpbmluZyBpbnRyaW5zaWNzIHdpbGwgbmVlZCB0byBiZSBidWlsdCB0YXJnZXRpbmcgdGhlIGluc3RydWN0aW9uCisvLyBzZXQgc28gc2hvdWxkIHN1Y2NlZWQgb24gb25lIG9mIHRoZSBlYXJsaWVyIHRlc3RzLgorI2lmIGRlZmluZWQoX19TU0UyX18pIHx8IGRlZmluZWQoV0VCUF9NU0NfU1NFMikgfHwgZGVmaW5lZChXRUJQX0hBVkVfU1NFMikKKyNkZWZpbmUgV0VCUF9VU0VfU1NFMgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fU1NFNF8xX18pIHx8IGRlZmluZWQoV0VCUF9NU0NfU1NFNDEpIHx8IGRlZmluZWQoV0VCUF9IQVZFX1NTRTQxKQorI2RlZmluZSBXRUJQX1VTRV9TU0U0MQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fQVZYMl9fKSB8fCBkZWZpbmVkKFdFQlBfSEFWRV9BVlgyKQorI2RlZmluZSBXRUJQX1VTRV9BVlgyCisjZW5kaWYKKworLy8gVGhlIGludHJpbnNpY3MgY3VycmVudGx5IGNhdXNlIGNvbXBpbGVyIGVycm9ycyB3aXRoIGFybS1uYWNsLWdjYyBhbmQgdGhlCisvLyBpbmxpbmUgYXNzZW1ibHkgd291bGQgbmVlZCB0byBiZSBtb2RpZmllZCBmb3IgdXNlIHdpdGggTmF0aXZlIENsaWVudC4KKyNpZiAoZGVmaW5lZChfX0FSTV9ORU9OX18pIHx8IFwKKyAgICAgZGVmaW5lZChfX2FhcmNoNjRfXykgfHwgZGVmaW5lZChXRUJQX0hBVkVfTkVPTikpICYmIFwKKyAgICAhZGVmaW5lZChfX25hdGl2ZV9jbGllbnRfXykKKyNkZWZpbmUgV0VCUF9VU0VfTkVPTgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChXRUJQX1VTRV9ORU9OKSAmJiBkZWZpbmVkKF9fQU5EUk9JRF9fKSAmJiBcCisgICAgZGVmaW5lZChfX0FSTV9BUkNIXzdBX18pICYmIGRlZmluZWQoSEFWRV9DUFVfRkVBVFVSRVNfSCkKKyNkZWZpbmUgV0VCUF9BTkRST0lEX05FT04gIC8vIEFuZHJvaWQgdGFyZ2V0cyB0aGF0IG1heSBoYXZlIE5FT04KKyNkZWZpbmUgV0VCUF9VU0VfTkVPTgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBfTVNDX1ZFUiA+PSAxNzAwICYmIGRlZmluZWQoX01fQVJNKQorI2RlZmluZSBXRUJQX1VTRV9ORU9OCisjZGVmaW5lIFdFQlBfVVNFX0lOVFJJTlNJQ1MKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX21pcHNfXykgJiYgIWRlZmluZWQoX19taXBzNjQpICYmIFwKKyAgICBkZWZpbmVkKF9fbWlwc19pc2FfcmV2KSAmJiAoX19taXBzX2lzYV9yZXYgPj0gMSkgJiYgKF9fbWlwc19pc2FfcmV2IDwgNikKKyNkZWZpbmUgV0VCUF9VU0VfTUlQUzMyCisjaWYgKF9fbWlwc19pc2FfcmV2ID49IDIpCisjZGVmaW5lIFdFQlBfVVNFX01JUFMzMl9SMgorI2lmIGRlZmluZWQoX19taXBzX2RzcHIyKSB8fCAoZGVmaW5lZChfX21pcHNfZHNwX3JldikgJiYgX19taXBzX2RzcF9yZXYgPj0gMikKKyNkZWZpbmUgV0VCUF9VU0VfTUlQU19EU1BfUjIKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19taXBzX21zYSkgJiYgZGVmaW5lZChfX21pcHNfaXNhX3JldikgJiYgKF9fbWlwc19pc2FfcmV2ID49IDUpCisjZGVmaW5lIFdFQlBfVVNFX01TQQorI2VuZGlmCisKKyNlbmRpZiAgLyogRU1TQ1JJUFRFTiAqLworCisjaWZuZGVmIFdFQlBfRFNQX09NSVRfQ19DT0RFCisjZGVmaW5lIFdFQlBfRFNQX09NSVRfQ19DT0RFIDEKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoX19hYXJjaDY0X18pIHx8IGRlZmluZWQoX19BUk1fTkVPTl9fKSkgJiYgV0VCUF9EU1BfT01JVF9DX0NPREUKKyNkZWZpbmUgV0VCUF9ORU9OX09NSVRfQ19DT0RFIDEKKyNlbHNlCisjZGVmaW5lIFdFQlBfTkVPTl9PTUlUX0NfQ09ERSAwCisjZW5kaWYKKworI2lmICEoTE9DQUxfQ0xBTkdfUFJFUkVRKDMsOCkgfHwgTE9DQUxfR0NDX1BSRVJFUSg0LDgpIHx8IGRlZmluZWQoX19hYXJjaDY0X18pKQorI2RlZmluZSBXRUJQX05FT05fV09SS19BUk9VTkRfR0NDIDEKKyNlbHNlCisjZGVmaW5lIFdFQlBfTkVPTl9XT1JLX0FST1VORF9HQ0MgMAorI2VuZGlmCisKKy8vIFRoaXMgbWFjcm8gcHJldmVudHMgdGhyZWFkX3Nhbml0aXplciBmcm9tIHJlcG9ydGluZyBrbm93biBjb25jdXJyZW50IHdyaXRlcy4KKyNkZWZpbmUgV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTgorI2lmIGRlZmluZWQoX19oYXNfZmVhdHVyZSkKKyNpZiBfX2hhc19mZWF0dXJlKHRocmVhZF9zYW5pdGl6ZXIpCisjdW5kZWYgV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTgorI2RlZmluZSBXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIF9fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplX3RocmVhZCkpCisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9USFJFQUQpICYmICFkZWZpbmVkKF9XSU4zMikKKyNpZiAhZGVmaW5lZChTVEFSQk9BUkQpCisvLyBUT0RPOiBJZiBub3QgaW5jbHVkaW5nIHRoaXMgaXMgYSBwcm9ibGVtIG9uIGEgU3RhcmJvYXJkIHBsYXRmb3JtLCB0aGVuCisvLyAgICAgICB3ZSBzaG91bGQgaW1wbGVtZW50IHRoaXMgZnVuY3Rpb25hbGl0eSB3aXRoIFN0YXJib2FyZCB0aHJlYWRpbmcKKy8vICAgICAgIHByaW1pdGl2ZXMgaW5zdGVhZC4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+ICAvLyBOT0xJTlQKKyNlbmRpZgorCisjZGVmaW5lIFdFQlBfRFNQX0lOSVQoZnVuYykgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIHZvbGF0aWxlIFZQOENQVUluZm8gZnVuYyAjIyBfbGFzdF9jcHVpbmZvX3VzZWQgPSAgICAgICAgICAgXAorICAgICAgKFZQOENQVUluZm8pJmZ1bmMgIyMgX2xhc3RfY3B1aW5mb191c2VkOyAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyBwdGhyZWFkX211dGV4X3QgZnVuYyAjIyBfbG9jayA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7IFwKKyAgaWYgKHB0aHJlYWRfbXV0ZXhfbG9jaygmZnVuYyAjIyBfbG9jaykpIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoZnVuYyAjIyBfbGFzdF9jcHVpbmZvX3VzZWQgIT0gVlA4R2V0Q1BVSW5mbykgZnVuYygpOyAgICAgICAgICBcCisgIGZ1bmMgIyMgX2xhc3RfY3B1aW5mb191c2VkID0gVlA4R2V0Q1BVSW5mbzsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKHZvaWQpcHRocmVhZF9tdXRleF91bmxvY2soJmZ1bmMgIyMgX2xvY2spOyAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNlbHNlICAvLyAhKGRlZmluZWQoV0VCUF9VU0VfVEhSRUFEKSAmJiAhZGVmaW5lZChfV0lOMzIpKQorI2RlZmluZSBXRUJQX0RTUF9JTklUKGZ1bmMpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyB2b2xhdGlsZSBWUDhDUFVJbmZvIGZ1bmMgIyMgX2xhc3RfY3B1aW5mb191c2VkID0gICAgICAgICAgIFwKKyAgICAgIChWUDhDUFVJbmZvKSZmdW5jICMjIF9sYXN0X2NwdWluZm9fdXNlZDsgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoZnVuYyAjIyBfbGFzdF9jcHVpbmZvX3VzZWQgPT0gVlA4R2V0Q1BVSW5mbykgYnJlYWs7ICAgICAgICAgICBcCisgIGZ1bmMoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZnVuYyAjIyBfbGFzdF9jcHVpbmZvX3VzZWQgPSBWUDhHZXRDUFVJbmZvOyAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNlbmRpZiAgLy8gZGVmaW5lZChXRUJQX1VTRV9USFJFQUQpICYmICFkZWZpbmVkKF9XSU4zMikKKworLy8gRGVmaW5lcyBhbiBJbml0ICsgaGVscGVyIGZ1bmN0aW9uIHRoYXQgY29udHJvbCBtdWx0aXBsZSBpbml0aWFsaXphdGlvbiBvZgorLy8gZnVuY3Rpb24gcG9pbnRlcnMgLyB0YWJsZXMuCisvKiBVc2FnZToKKyAgIFdFQlBfRFNQX0lOSVRfRlVOQyhJbml0RnVuYykgeworICAgICAuLi5mdW5jdGlvbiBib2R5CisgICB9CisqLworI2RlZmluZSBXRUJQX0RTUF9JTklUX0ZVTkMobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIFdFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBuYW1lICMjIF9ib2R5KHZvaWQpOyBcCisgIFdFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBuYW1lKHZvaWQpIHsgICAgICAgICAgICAgICAgXAorICAgIFdFQlBfRFNQX0lOSVQobmFtZSAjIyBfYm9keSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyBXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgbmFtZSAjIyBfYm9keSh2b2lkKQorCisjZGVmaW5lIFdFQlBfVUJTQU5fSUdOT1JFX1VOREVGCisjZGVmaW5lIFdFQlBfVUJTQU5fSUdOT1JFX1VOU0lHTkVEX09WRVJGTE9XCisjaWYgZGVmaW5lZChfX2NsYW5nX18pICYmIGRlZmluZWQoX19oYXNfYXR0cmlidXRlKQorI2lmIF9faGFzX2F0dHJpYnV0ZShub19zYW5pdGl6ZSkKKy8vIFRoaXMgbWFjcm8gcHJldmVudHMgdGhlIHVuZGVmaW5lZCBiZWhhdmlvciBzYW5pdGl6ZXIgZnJvbSByZXBvcnRpbmcKKy8vIGZhaWx1cmVzLiBUaGlzIGlzIG9ubHkgbWVhbnQgdG8gc2lsZW5jZSB1bmFsaWduZWQgbG9hZHMgb24gcGxhdGZvcm1zIHRoYXQKKy8vIGFyZSBrbm93biB0byBzdXBwb3J0IHRoZW0uCisjdW5kZWYgV0VCUF9VQlNBTl9JR05PUkVfVU5ERUYKKyNkZWZpbmUgV0VCUF9VQlNBTl9JR05PUkVfVU5ERUYgXAorICBfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgidW5kZWZpbmVkIikpKQorCisvLyBUaGlzIG1hY3JvIHByZXZlbnRzIHRoZSB1bmRlZmluZWQgYmVoYXZpb3Igc2FuaXRpemVyIGZyb20gcmVwb3J0aW5nCisvLyBmYWlsdXJlcyByZWxhdGVkIHRvIHVuc2lnbmVkIGludGVnZXIgb3ZlcmZsb3dzLiBUaGlzIGlzIG9ubHkgbWVhbnQgdG8KKy8vIHNpbGVuY2UgY2FzZXMgd2hlcmUgdGhpcyB3ZWxsIGRlZmluZWQgYmVoYXZpb3IgaXMgZXhwZWN0ZWQuCisjdW5kZWYgV0VCUF9VQlNBTl9JR05PUkVfVU5TSUdORURfT1ZFUkZMT1cKKyNkZWZpbmUgV0VCUF9VQlNBTl9JR05PUkVfVU5TSUdORURfT1ZFUkZMT1cgXAorICBfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKKyNlbmRpZgorI2VuZGlmCisKKy8vIFJlZ3VsYXJpemUgdGhlIGRlZmluaXRpb24gb2YgV0VCUF9TV0FQXzE2QklUX0NTUCAoYmFja3dhcmQgY29tcGF0aWJpbGl0eSkKKyNpZiAhZGVmaW5lZChXRUJQX1NXQVBfMTZCSVRfQ1NQKQorI2RlZmluZSBXRUJQX1NXQVBfMTZCSVRfQ1NQIDAKKyNlbmRpZgorCisvLyBzb21lIGVuZGlhbiBmaXggKGUuZy46IG1pcHMtZ2NjIGRvZXNuJ3QgZGVmaW5lIF9fQklHX0VORElBTl9fKQorI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2lmIFNCX0lTKEJJR19FTkRJQU4pCisjZGVmaW5lIFdPUkRTX0JJR0VORElBTgorI2VuZGlmCisjZWxzZQorI2lmICFkZWZpbmVkKFdPUkRTX0JJR0VORElBTikgJiYgXAorICAgIChkZWZpbmVkKF9fQklHX0VORElBTl9fKSB8fCBkZWZpbmVkKF9NX1BQQykgfHwgXAorICAgICAoZGVmaW5lZChfX0JZVEVfT1JERVJfXykgJiYgKF9fQllURV9PUkRFUl9fID09IF9fT1JERVJfQklHX0VORElBTl9fKSkpCisjZGVmaW5lIFdPUkRTX0JJR0VORElBTgorI2VuZGlmCisjZW5kaWYgIC8vIGRlZmluZWQoU1RBUkJPQVJEKQorCit0eXBlZGVmIGVudW0geworICBrU1NFMiwKKyAga1NTRTMsCisgIGtTbG93U1NTRTMsICAvLyBzcGVjaWFsIGZlYXR1cmUgZm9yIHNsb3cgU1NTRTMgYXJjaGl0ZWN0dXJlcworICBrU1NFNF8xLAorICBrQVZYLAorICBrQVZYMiwKKyAga05FT04sCisgIGtNSVBTMzIsCisgIGtNSVBTZHNwUjIsCisgIGtNU0EKK30gQ1BVRmVhdHVyZTsKKy8vIHJldHVybnMgdHJ1ZSBpZiB0aGUgQ1BVIHN1cHBvcnRzIHRoZSBmZWF0dXJlLgordHlwZWRlZiBpbnQgKCpWUDhDUFVJbmZvKShDUFVGZWF0dXJlIGZlYXR1cmUpOworV0VCUF9FWFRFUk4gVlA4Q1BVSW5mbyBWUDhHZXRDUFVJbmZvOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW5pdCBzdHViIGdlbmVyYXRvcgorCisvLyBEZWZpbmVzIGFuIGluaXQgZnVuY3Rpb24gc3R1YiB0byBlbnN1cmUgZWFjaCBtb2R1bGUgZXhwb3NlcyBhIHN5bWJvbCwKKy8vIGF2b2lkaW5nIGEgY29tcGlsZXIgd2FybmluZy4KKyNkZWZpbmUgV0VCUF9EU1BfSU5JVF9TVFVCKGZ1bmMpIFwKKyAgZXh0ZXJuIHZvaWQgZnVuYyh2b2lkKTsgXAorICB2b2lkIGZ1bmModm9pZCkge30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVuY29kaW5nCisKKy8vIFRyYW5zZm9ybXMKKy8vIFZQOElkY3Q6IERvZXMgb25lIG9mIHR3byBpbnZlcnNlIHRyYW5zZm9ybXMuIElmIGRvX3R3byBpcyBzZXQsIHRoZSB0cmFuc2Zvcm1zCisvLyAgICAgICAgICB3aWxsIGJlIGRvbmUgZm9yIChyZWYsIGluLCBkc3QpIGFuZCAocmVmICsgNCwgaW4gKyAxNiwgZHN0ICsgNCkuCit0eXBlZGVmIHZvaWQgKCpWUDhJZGN0KShjb25zdCB1aW50OF90KiByZWYsIGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZG9fdHdvKTsKK3R5cGVkZWYgdm9pZCAoKlZQOEZkY3QpKGNvbnN0IHVpbnQ4X3QqIHNyYywgY29uc3QgdWludDhfdCogcmVmLCBpbnQxNl90KiBvdXQpOwordHlwZWRlZiB2b2lkICgqVlA4V0hUKShjb25zdCBpbnQxNl90KiBpbiwgaW50MTZfdCogb3V0KTsKK2V4dGVybiBWUDhJZGN0IFZQOElUcmFuc2Zvcm07CitleHRlcm4gVlA4RmRjdCBWUDhGVHJhbnNmb3JtOworZXh0ZXJuIFZQOEZkY3QgVlA4RlRyYW5zZm9ybTI7ICAgLy8gcGVyZm9ybXMgdHdvIHRyYW5zZm9ybXMgYXQgYSB0aW1lCitleHRlcm4gVlA4V0hUIFZQOEZUcmFuc2Zvcm1XSFQ7CisvLyBQcmVkaWN0aW9ucworLy8gKmRzdCBpcyB0aGUgZGVzdGluYXRpb24gYmxvY2suICp0b3AgYW5kICpsZWZ0IGNhbiBiZSBOVUxMLgordHlwZWRlZiB2b2lkICgqVlA4SW50cmFQcmVkcykodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90KiBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdG9wKTsKK3R5cGVkZWYgdm9pZCAoKlZQOEludHJhNFByZWRzKSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCk7CitleHRlcm4gVlA4SW50cmE0UHJlZHMgVlA4RW5jUHJlZEx1bWE0OworZXh0ZXJuIFZQOEludHJhUHJlZHMgVlA4RW5jUHJlZEx1bWExNjsKK2V4dGVybiBWUDhJbnRyYVByZWRzIFZQOEVuY1ByZWRDaHJvbWE4OworCit0eXBlZGVmIGludCAoKlZQOE1ldHJpYykoY29uc3QgdWludDhfdCogcGl4LCBjb25zdCB1aW50OF90KiByZWYpOworZXh0ZXJuIFZQOE1ldHJpYyBWUDhTU0UxNngxNiwgVlA4U1NFMTZ4OCwgVlA4U1NFOHg4LCBWUDhTU0U0eDQ7Cit0eXBlZGVmIGludCAoKlZQOFdNZXRyaWMpKGNvbnN0IHVpbnQ4X3QqIHBpeCwgY29uc3QgdWludDhfdCogcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCogY29uc3Qgd2VpZ2h0cyk7CisvLyBUaGUgd2VpZ2h0cyBmb3IgVlA4VERpc3RvNHg0IGFuZCBWUDhURGlzdG8xNngxNiBjb250YWluIGEgcm93LW1ham9yCisvLyA0IGJ5IDQgc3ltbWV0cmljIG1hdHJpeC4KK2V4dGVybiBWUDhXTWV0cmljIFZQOFREaXN0bzR4NCwgVlA4VERpc3RvMTZ4MTY7CisKKy8vIENvbXB1dGUgdGhlIGF2ZXJhZ2UgKERDKSBvZiBmb3VyIDR4NCBibG9ja3MuCisvLyBFYWNoIHN1Yi00eDQgYmxvY2sgI2kgc3VtIGlzIHN0b3JlZCBpbiBkY1tpXS4KK3R5cGVkZWYgdm9pZCAoKlZQOE1lYW5NZXRyaWMpKGNvbnN0IHVpbnQ4X3QqIHJlZiwgdWludDMyX3QgZGNbNF0pOworZXh0ZXJuIFZQOE1lYW5NZXRyaWMgVlA4TWVhbjE2eDQ7CisKK3R5cGVkZWYgdm9pZCAoKlZQOEJsb2NrQ29weSkoY29uc3QgdWludDhfdCogc3JjLCB1aW50OF90KiBkc3QpOworZXh0ZXJuIFZQOEJsb2NrQ29weSBWUDhDb3B5NHg0OworZXh0ZXJuIFZQOEJsb2NrQ29weSBWUDhDb3B5MTZ4ODsKKy8vIFF1YW50aXphdGlvbgorc3RydWN0IFZQOE1hdHJpeDsgICAvLyBmb3J3YXJkIGRlY2xhcmF0aW9uCit0eXBlZGVmIGludCAoKlZQOFF1YW50aXplQmxvY2spKGludDE2X3QgaW5bMTZdLCBpbnQxNl90IG91dFsxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBWUDhNYXRyaXgqIGNvbnN0IG10eCk7CisvLyBTYW1lIGFzIFZQOFF1YW50aXplQmxvY2ssIGJ1dCBxdWFudGl6ZXMgdHdvIGNvbnNlY3V0aXZlIGJsb2Nrcy4KK3R5cGVkZWYgaW50ICgqVlA4UXVhbnRpemUyQmxvY2tzKShpbnQxNl90IGluWzMyXSwgaW50MTZfdCBvdXRbMzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBWUDhNYXRyaXgqIGNvbnN0IG10eCk7CisKK2V4dGVybiBWUDhRdWFudGl6ZUJsb2NrIFZQOEVuY1F1YW50aXplQmxvY2s7CitleHRlcm4gVlA4UXVhbnRpemUyQmxvY2tzIFZQOEVuY1F1YW50aXplMkJsb2NrczsKKworLy8gc3BlY2lmaWMgdG8gMm5kIHRyYW5zZm9ybToKK3R5cGVkZWYgaW50ICgqVlA4UXVhbnRpemVCbG9ja1dIVCkoaW50MTZfdCBpblsxNl0sIGludDE2X3Qgb3V0WzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IFZQOE1hdHJpeCogY29uc3QgbXR4KTsKK2V4dGVybiBWUDhRdWFudGl6ZUJsb2NrV0hUIFZQOEVuY1F1YW50aXplQmxvY2tXSFQ7CisKK2V4dGVybiBjb25zdCBpbnQgVlA4RHNwU2NhblsxNiArIDQgKyA0XTsKKworLy8gQ29sbGVjdCBoaXN0b2dyYW0gZm9yIHN1c2NlcHRpYmlsaXR5IGNhbGN1bGF0aW9uLgorI2RlZmluZSBNQVhfQ09FRkZfVEhSRVNIICAgMzEgICAvLyBzaXplIG9mIGhpc3RvZ3JhbSB1c2VkIGJ5IENvbGxlY3RIaXN0b2dyYW0uCit0eXBlZGVmIHN0cnVjdCB7CisgIC8vIFdlIG9ubHkgbmVlZCB0byBzdG9yZSBtYXhfdmFsdWUgYW5kIGxhc3Rfbm9uX3plcm8sIG5vdCB0aGUgZGlzdHJpYnV0aW9uLgorICBpbnQgbWF4X3ZhbHVlOworICBpbnQgbGFzdF9ub25femVybzsKK30gVlA4SGlzdG9ncmFtOwordHlwZWRlZiB2b2lkICgqVlA4Q0hpc3RvKShjb25zdCB1aW50OF90KiByZWYsIGNvbnN0IHVpbnQ4X3QqIHByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF9ibG9jaywgaW50IGVuZF9ibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4SGlzdG9ncmFtKiBjb25zdCBoaXN0byk7CitleHRlcm4gVlA4Q0hpc3RvIFZQOENvbGxlY3RIaXN0b2dyYW07CisvLyBHZW5lcmFsLXB1cnBvc2UgdXRpbCBmdW5jdGlvbiB0byBoZWxwIFZQOENvbGxlY3RIaXN0b2dyYW0oKS4KK3ZvaWQgVlA4U2V0SGlzdG9ncmFtRGF0YShjb25zdCBpbnQgZGlzdHJpYnV0aW9uW01BWF9DT0VGRl9USFJFU0ggKyAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWUDhIaXN0b2dyYW0qIGNvbnN0IGhpc3RvKTsKKworLy8gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHVzaW5nIGFueSBvZiB0aGUgYWJvdmUKK3ZvaWQgVlA4RW5jRHNwSW5pdCh2b2lkKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvc3QgZnVuY3Rpb25zIChlbmNvZGluZykKKworZXh0ZXJuIGNvbnN0IHVpbnQxNl90IFZQOEVudHJvcHlDb3N0WzI1Nl07ICAgICAgICAvLyA4Yml0IGZpeGVkLXBvaW50IGxvZyhwKQorLy8gYXBwcm94aW1hdGUgY29zdCBwZXIgbGV2ZWw6CitleHRlcm4gY29uc3QgdWludDE2X3QgVlA4TGV2ZWxGaXhlZENvc3RzWzIwNDcgLypNQVhfTEVWRUwqLyArIDFdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgVlA4RW5jQmFuZHNbMTYgKyAxXTsKKworc3RydWN0IFZQOFJlc2lkdWFsOwordHlwZWRlZiB2b2lkICgqVlA4U2V0UmVzaWR1YWxDb2VmZnNGdW5jKShjb25zdCBpbnQxNl90KiBjb25zdCBjb2VmZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBWUDhSZXNpZHVhbCogY29uc3QgcmVzKTsKK2V4dGVybiBWUDhTZXRSZXNpZHVhbENvZWZmc0Z1bmMgVlA4U2V0UmVzaWR1YWxDb2VmZnM7CisKKy8vIENvc3QgY2FsY3VsYXRpb24gZnVuY3Rpb24uCit0eXBlZGVmIGludCAoKlZQOEdldFJlc2lkdWFsQ29zdEZ1bmMpKGludCBjdHgwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgVlA4UmVzaWR1YWwqIGNvbnN0IHJlcyk7CitleHRlcm4gVlA4R2V0UmVzaWR1YWxDb3N0RnVuYyBWUDhHZXRSZXNpZHVhbENvc3Q7CisKKy8vIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnl0aGluZyB1c2luZyB0aGUgYWJvdmUKK3ZvaWQgVlA4RW5jRHNwQ29zdEluaXQodm9pZCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTU0lNIC8gUFNOUiB1dGlscworCisvLyBzdHJ1Y3QgZm9yIGFjY3VtdWxhdGluZyBzdGF0aXN0aWNhbCBtb21lbnRzCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQzMl90IHc7ICAgICAgICAgICAgICAvLyBzdW0od19pKSA6IHN1bSBvZiB3ZWlnaHRzCisgIHVpbnQzMl90IHhtLCB5bTsgICAgICAgICAvLyBzdW0od19pICogeF9pKSwgc3VtKHdfaSAqIHlfaSkKKyAgdWludDMyX3QgeHhtLCB4eW0sIHl5bTsgIC8vIHN1bSh3X2kgKiB4X2kgKiB4X2kpLCBldGMuCit9IFZQOERpc3RvU3RhdHM7CisKKy8vIENvbXB1dGUgdGhlIGZpbmFsIFNTSU0gdmFsdWUKKy8vIFRoZSBub24tY2xpcHBlZCB2ZXJzaW9uIGFzc3VtZXMgc3RhdHMtPncgPSAoMiAqIFZQOF9TU0lNX0tFUk5FTCArIDEpXjIuCitkb3VibGUgVlA4U1NJTUZyb21TdGF0cyhjb25zdCBWUDhEaXN0b1N0YXRzKiBjb25zdCBzdGF0cyk7Citkb3VibGUgVlA4U1NJTUZyb21TdGF0c0NsaXBwZWQoY29uc3QgVlA4RGlzdG9TdGF0cyogY29uc3Qgc3RhdHMpOworCisjZGVmaW5lIFZQOF9TU0lNX0tFUk5FTCAzICAgLy8gdG90YWwgc2l6ZSBvZiB0aGUga2VybmVsOiAyICogVlA4X1NTSU1fS0VSTkVMICsgMQordHlwZWRlZiBkb3VibGUgKCpWUDhTU0lNR2V0Q2xpcHBlZEZ1bmMpKGNvbnN0IHVpbnQ4X3QqIHNyYzEsIGludCBzdHJpZGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyYzIsIGludCBzdHJpZGUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4bywgaW50IHlvLCAgLy8gY2VudGVyIHBvc2l0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFcsIGludCBIKTsgICAvLyBwbGFuZSBkaW1lbnNpb24KKworI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX1NJWkUpCisvLyBUaGlzIHZlcnNpb24gaXMgY2FsbGVkIHdpdGggdGhlIGd1YXJhbnRlZSB0aGF0IHlvdSBjYW4gbG9hZCA4IGJ5dGVzIGFuZAorLy8gOCByb3dzIGF0IG9mZnNldCBzcmMxIGFuZCBzcmMyCit0eXBlZGVmIGRvdWJsZSAoKlZQOFNTSU1HZXRGdW5jKShjb25zdCB1aW50OF90KiBzcmMxLCBpbnQgc3RyaWRlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyYzIsIGludCBzdHJpZGUyKTsKKworZXh0ZXJuIFZQOFNTSU1HZXRGdW5jIFZQOFNTSU1HZXQ7ICAgICAgICAgLy8gdW5jbGlwcGVkIC8gdW5jaGVja2VkCitleHRlcm4gVlA4U1NJTUdldENsaXBwZWRGdW5jIFZQOFNTSU1HZXRDbGlwcGVkOyAgIC8vIHdpdGggY2xpcHBpbmcKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoV0VCUF9ESVNBQkxFX1NUQVRTKQordHlwZWRlZiB1aW50MzJfdCAoKlZQOEFjY3VtdWxhdGVTU0VGdW5jKShjb25zdCB1aW50OF90KiBzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmMyLCBpbnQgbGVuKTsKK2V4dGVybiBWUDhBY2N1bXVsYXRlU1NFRnVuYyBWUDhBY2N1bXVsYXRlU1NFOworI2VuZGlmCisKKy8vIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB1c2luZyBhbnkgb2YgdGhlIGFib3ZlIGRpcmVjdGx5Cit2b2lkIFZQOFNTSU1Ec3BJbml0KHZvaWQpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRGVjb2RpbmcKKwordHlwZWRlZiB2b2lkICgqVlA4RGVjSWRjdCkoY29uc3QgaW50MTZfdCogY29lZmZzLCB1aW50OF90KiBkc3QpOworLy8gd2hlbiBkb2luZyB0d28gdHJhbnNmb3JtcywgY29lZmZzIGlzIGFjdHVhbGx5IGludDE2X3RbMl1bMTZdLgordHlwZWRlZiB2b2lkICgqVlA4RGVjSWRjdDIpKGNvbnN0IGludDE2X3QqIGNvZWZmcywgdWludDhfdCogZHN0LCBpbnQgZG9fdHdvKTsKK2V4dGVybiBWUDhEZWNJZGN0MiBWUDhUcmFuc2Zvcm07CitleHRlcm4gVlA4RGVjSWRjdCBWUDhUcmFuc2Zvcm1BQzM7CitleHRlcm4gVlA4RGVjSWRjdCBWUDhUcmFuc2Zvcm1VVjsKK2V4dGVybiBWUDhEZWNJZGN0IFZQOFRyYW5zZm9ybURDOworZXh0ZXJuIFZQOERlY0lkY3QgVlA4VHJhbnNmb3JtRENVVjsKK2V4dGVybiBWUDhXSFQgVlA4VHJhbnNmb3JtV0hUOworCisvLyAqZHN0IGlzIHRoZSBkZXN0aW5hdGlvbiBibG9jaywgd2l0aCBzdHJpZGUgQlBTLiBCb3VuZGFyeSBzYW1wbGVzIGFyZQorLy8gYXNzdW1lZCBhY2Nlc3NpYmxlIHdoZW4gbmVlZGVkLgordHlwZWRlZiB2b2lkICgqVlA4UHJlZEZ1bmMpKHVpbnQ4X3QqIGRzdCk7CitleHRlcm4gVlA4UHJlZEZ1bmMgVlA4UHJlZEx1bWExNlsvKiBOVU1fQl9EQ19NT0RFUyAqL107CitleHRlcm4gVlA4UHJlZEZ1bmMgVlA4UHJlZENocm9tYThbLyogTlVNX0JfRENfTU9ERVMgKi9dOworZXh0ZXJuIFZQOFByZWRGdW5jIFZQOFByZWRMdW1hNFsvKiBOVU1fQk1PREVTICovXTsKKworLy8gY2xpcHBpbmcgdGFibGVzIChmb3IgZmlsdGVyaW5nKQorZXh0ZXJuIGNvbnN0IGludDhfdCogY29uc3QgVlA4a3NjbGlwMTsgIC8vIGNsaXBzIFstMTAyMCwgMTAyMF0gdG8gWy0xMjgsIDEyN10KK2V4dGVybiBjb25zdCBpbnQ4X3QqIGNvbnN0IFZQOGtzY2xpcDI7ICAvLyBjbGlwcyBbLTExMiwgMTEyXSB0byBbLTE2LCAxNV0KK2V4dGVybiBjb25zdCB1aW50OF90KiBjb25zdCBWUDhrY2xpcDE7ICAvLyBjbGlwcyBbLTI1NSw1MTFdIHRvIFswLDI1NV0KK2V4dGVybiBjb25zdCB1aW50OF90KiBjb25zdCBWUDhrYWJzMDsgICAvLyBhYnMoeCkgZm9yIHggaW4gWy0yNTUsMjU1XQorLy8gbXVzdCBiZSBjYWxsZWQgZmlyc3QKK3ZvaWQgVlA4SW5pdENsaXBUYWJsZXModm9pZCk7CisKKy8vIHNpbXBsZSBmaWx0ZXIgKG9ubHkgZm9yIGx1bWEpCit0eXBlZGVmIHZvaWQgKCpWUDhTaW1wbGVGaWx0ZXJGdW5jKSh1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKTsKK2V4dGVybiBWUDhTaW1wbGVGaWx0ZXJGdW5jIFZQOFNpbXBsZVZGaWx0ZXIxNjsKK2V4dGVybiBWUDhTaW1wbGVGaWx0ZXJGdW5jIFZQOFNpbXBsZUhGaWx0ZXIxNjsKK2V4dGVybiBWUDhTaW1wbGVGaWx0ZXJGdW5jIFZQOFNpbXBsZVZGaWx0ZXIxNmk7ICAvLyBmaWx0ZXIgMyBpbm5lciBlZGdlcworZXh0ZXJuIFZQOFNpbXBsZUZpbHRlckZ1bmMgVlA4U2ltcGxlSEZpbHRlcjE2aTsKKworLy8gcmVndWxhciBmaWx0ZXIgKG9uIGJvdGggbWFjcm9ibG9jayBlZGdlcyBhbmQgaW5uZXIgZWRnZXMpCit0eXBlZGVmIHZvaWQgKCpWUDhMdW1hRmlsdGVyRnVuYykodWludDhfdCogbHVtYSwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90KTsKK3R5cGVkZWYgdm9pZCAoKlZQOENocm9tYUZpbHRlckZ1bmMpKHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90KTsKKy8vIG9uIG91dGVyIGVkZ2UKK2V4dGVybiBWUDhMdW1hRmlsdGVyRnVuYyBWUDhWRmlsdGVyMTY7CitleHRlcm4gVlA4THVtYUZpbHRlckZ1bmMgVlA4SEZpbHRlcjE2OworZXh0ZXJuIFZQOENocm9tYUZpbHRlckZ1bmMgVlA4VkZpbHRlcjg7CitleHRlcm4gVlA4Q2hyb21hRmlsdGVyRnVuYyBWUDhIRmlsdGVyODsKKworLy8gb24gaW5uZXIgZWRnZQorZXh0ZXJuIFZQOEx1bWFGaWx0ZXJGdW5jIFZQOFZGaWx0ZXIxNmk7ICAgLy8gZmlsdGVyaW5nIDMgaW5uZXIgZWRnZXMgYWx0b2dldGhlcgorZXh0ZXJuIFZQOEx1bWFGaWx0ZXJGdW5jIFZQOEhGaWx0ZXIxNmk7CitleHRlcm4gVlA4Q2hyb21hRmlsdGVyRnVuYyBWUDhWRmlsdGVyOGk7ICAvLyBmaWx0ZXJpbmcgdSBhbmQgdiBhbHRvZ2V0aGVyCitleHRlcm4gVlA4Q2hyb21hRmlsdGVyRnVuYyBWUDhIRmlsdGVyOGk7CisKKy8vIERpdGhlcmluZy4gQ29tYmluZXMgZGl0aGVyaW5nIHZhbHVlcyAoY2VudGVyZWQgYXJvdW5kIDEyOCkgd2l0aCBkc3RbXSwKKy8vIGFjY29yZGluZyB0bzogZHN0W10gPSBjbGlwKGRzdFtdICsgKCgoZGl0aGVyW10tMTI4KSArIDgpID4+IDQpCisjZGVmaW5lIFZQOF9ESVRIRVJfREVTQ0FMRSA0CisjZGVmaW5lIFZQOF9ESVRIRVJfREVTQ0FMRV9ST1VOREVSICgxIDw8IChWUDhfRElUSEVSX0RFU0NBTEUgLSAxKSkKKyNkZWZpbmUgVlA4X0RJVEhFUl9BTVBfQklUUyA3CisjZGVmaW5lIFZQOF9ESVRIRVJfQU1QX0NFTlRFUiAoMSA8PCBWUDhfRElUSEVSX0FNUF9CSVRTKQorZXh0ZXJuIHZvaWQgKCpWUDhEaXRoZXJDb21iaW5lOHg4KShjb25zdCB1aW50OF90KiBkaXRoZXIsIHVpbnQ4X3QqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF9zdHJpZGUpOworCisvLyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55dGhpbmcgdXNpbmcgdGhlIGFib3ZlCit2b2lkIFZQOERzcEluaXQodm9pZCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBXZWJQIEkvTworCisjZGVmaW5lIEZBTkNZX1VQU0FNUExJTkcgICAvLyB1bmRlZmluZWQgdG8gcmVtb3ZlIGZhbmN5IHVwc2FtcGxpbmcgc3VwcG9ydAorCisvLyBDb252ZXJ0IGEgcGFpciBvZiB5L3UvdiBsaW5lcyB0b2dldGhlciB0byB0aGUgb3V0cHV0IHJnYi9hIGNvbG9yc3BhY2UuCisvLyBib3R0b21feSBjYW4gYmUgTlVMTCBpZiBvbmx5IG9uZSBsaW5lIG9mIG91dHB1dCBpcyBuZWVkZWQgKGF0IHRvcC9ib3R0b20pLgordHlwZWRlZiB2b2lkICgqV2ViUFVwc2FtcGxlTGluZVBhaXJGdW5jKSgKKyAgICBjb25zdCB1aW50OF90KiB0b3BfeSwgY29uc3QgdWludDhfdCogYm90dG9tX3ksCisgICAgY29uc3QgdWludDhfdCogdG9wX3UsIGNvbnN0IHVpbnQ4X3QqIHRvcF92LAorICAgIGNvbnN0IHVpbnQ4X3QqIGN1cl91LCBjb25zdCB1aW50OF90KiBjdXJfdiwKKyAgICB1aW50OF90KiB0b3BfZHN0LCB1aW50OF90KiBib3R0b21fZHN0LCBpbnQgbGVuKTsKKworI2lmZGVmIEZBTkNZX1VQU0FNUExJTkcKKworLy8gRmFuY3kgdXBzYW1wbGluZyBmdW5jdGlvbnMgdG8gY29udmVydCBZVVYgdG8gUkdCKEEpIG1vZGVzCitleHRlcm4gV2ViUFVwc2FtcGxlTGluZVBhaXJGdW5jIFdlYlBVcHNhbXBsZXJzWy8qIE1PREVfTEFTVCAqL107CisKKyNlbmRpZiAgICAvLyBGQU5DWV9VUFNBTVBMSU5HCisKKy8vIFBlci1yb3cgcG9pbnQtc2FtcGxpbmcgbWV0aG9kcy4KK3R5cGVkZWYgdm9pZCAoKldlYlBTYW1wbGVyUm93RnVuYykoY29uc3QgdWludDhfdCogeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgbGVuKTsKKy8vIEdlbmVyaWMgZnVuY3Rpb24gdG8gYXBwbHkgJ1dlYlBTYW1wbGVyUm93RnVuYycgdG8gdGhlIHdob2xlIHBsYW5lOgordm9pZCBXZWJQU2FtcGxlclByb2Nlc3NQbGFuZShjb25zdCB1aW50OF90KiB5LCBpbnQgeV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsIGludCB1dl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgV2ViUFNhbXBsZXJSb3dGdW5jIGZ1bmMpOworCisvLyBTYW1wbGluZyBmdW5jdGlvbnMgdG8gY29udmVydCByb3dzIG9mIFlVViB0byBSR0IoQSkKK2V4dGVybiBXZWJQU2FtcGxlclJvd0Z1bmMgV2ViUFNhbXBsZXJzWy8qIE1PREVfTEFTVCAqL107CisKKy8vIEdlbmVyYWwgZnVuY3Rpb24gZm9yIGNvbnZlcnRpbmcgdHdvIGxpbmVzIG9mIEFSR0Igb3IgUkdCQS4KKy8vICdhbHBoYV9pc19sYXN0JyBzaG91bGQgYmUgdHJ1ZSBpZiAweGZmMDAwMDAwIGlzIHN0b3JlZCBpbiBtZW1vcnkgYXMKKy8vIGFzIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYgKGxpdHRsZSBlbmRpYW4pLgorV2ViUFVwc2FtcGxlTGluZVBhaXJGdW5jIFdlYlBHZXRMaW5lUGFpckNvbnZlcnRlcihpbnQgYWxwaGFfaXNfbGFzdCk7CisKKy8vIFlVVjQ0NC0+UkdCIGNvbnZlcnRlcnMKK3R5cGVkZWYgdm9pZCAoKldlYlBZVVY0NDRDb252ZXJ0ZXIpKGNvbnN0IHVpbnQ4X3QqIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgbGVuKTsKKworZXh0ZXJuIFdlYlBZVVY0NDRDb252ZXJ0ZXIgV2ViUFlVVjQ0NENvbnZlcnRlcnNbLyogTU9ERV9MQVNUICovXTsKKworLy8gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIHVzaW5nIHRoZSBXZWJQVXBzYW1wbGVyc1tdIChhbmQgZm9yIHByZW11bHRpcGxpZWQKKy8vIGNvbG9yc3BhY2VzIGxpa2UgcmdiQSwgcmdiQTQ0NDQsIGV0YykKK3ZvaWQgV2ViUEluaXRVcHNhbXBsZXJzKHZvaWQpOworLy8gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIHVzaW5nIFdlYlBTYW1wbGVyc1tdCit2b2lkIFdlYlBJbml0U2FtcGxlcnModm9pZCk7CisvLyBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgdXNpbmcgV2ViUFlVVjQ0NENvbnZlcnRlcnNbXQordm9pZCBXZWJQSW5pdFlVVjQ0NENvbnZlcnRlcnModm9pZCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBUkdCIC0+IFlVViBjb252ZXJ0ZXJzCisKKy8vIENvbnZlcnQgQVJHQiBzYW1wbGVzIHRvIGx1bWEgWS4KK2V4dGVybiB2b2lkICgqV2ViUENvbnZlcnRBUkdCVG9ZKShjb25zdCB1aW50MzJfdCogYXJnYiwgdWludDhfdCogeSwgaW50IHdpZHRoKTsKKy8vIENvbnZlcnQgQVJHQiBzYW1wbGVzIHRvIFUvViB3aXRoIGRvd25zYW1wbGluZy4gZG9fc3RvcmUgc2hvdWxkIGJlICcxJyBmb3IKKy8vIGV2ZW4gbGluZXMgYW5kICcwJyBmb3Igb2RkIG9uZXMuICdzcmNfd2lkdGgnIGlzIHRoZSBvcmlnaW5hbCB3aWR0aCwgbm90CisvLyB0aGUgVS9WIG9uZS4KK2V4dGVybiB2b2lkICgqV2ViUENvbnZlcnRBUkdCVG9VVikoY29uc3QgdWludDMyX3QqIGFyZ2IsIHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfd2lkdGgsIGludCBkb19zdG9yZSk7CisKKy8vIENvbnZlcnQgYSByb3cgb2YgYWNjdW11bGF0ZWQgKGZvdXItdmFsdWVzKSBvZiByZ2JhMzIgdG93YXJkIFUvVgorZXh0ZXJuIHZvaWQgKCpXZWJQQ29udmVydFJHQkEzMlRvVVYpKGNvbnN0IHVpbnQxNl90KiByZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdSwgdWludDhfdCogdiwgaW50IHdpZHRoKTsKKworLy8gQ29udmVydCBSR0Igb3IgQkdSIHRvIFkKK2V4dGVybiB2b2lkICgqV2ViUENvbnZlcnRSR0IyNFRvWSkoY29uc3QgdWludDhfdCogcmdiLCB1aW50OF90KiB5LCBpbnQgd2lkdGgpOworZXh0ZXJuIHZvaWQgKCpXZWJQQ29udmVydEJHUjI0VG9ZKShjb25zdCB1aW50OF90KiBiZ3IsIHVpbnQ4X3QqIHksIGludCB3aWR0aCk7CisKKy8vIHVzZWQgZm9yIHBsYWluLUMgZmFsbGJhY2suCitleHRlcm4gdm9pZCBXZWJQQ29udmVydEFSR0JUb1VWX0MoY29uc3QgdWludDMyX3QqIGFyZ2IsIHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY193aWR0aCwgaW50IGRvX3N0b3JlKTsKK2V4dGVybiB2b2lkIFdlYlBDb252ZXJ0UkdCQTMyVG9VVl9DKGNvbnN0IHVpbnQxNl90KiByZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB1LCB1aW50OF90KiB2LCBpbnQgd2lkdGgpOworCisvLyB1dGlsaXRpZXMgZm9yIGFjY3VyYXRlIFJHQi0+WVVWIGNvbnZlcnNpb24KK2V4dGVybiB1aW50NjRfdCAoKldlYlBTaGFycFlVVlVwZGF0ZVkpKGNvbnN0IHVpbnQxNl90KiBzcmMsIGNvbnN0IHVpbnQxNl90KiByZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogZHN0LCBpbnQgbGVuKTsKK2V4dGVybiB2b2lkICgqV2ViUFNoYXJwWVVWVXBkYXRlUkdCKShjb25zdCBpbnQxNl90KiBzcmMsIGNvbnN0IGludDE2X3QqIHJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90KiBkc3QsIGludCBsZW4pOworZXh0ZXJuIHZvaWQgKCpXZWJQU2hhcnBZVVZGaWx0ZXJSb3cpKGNvbnN0IGludDE2X3QqIEEsIGNvbnN0IGludDE2X3QqIEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCogYmVzdF95LCB1aW50MTZfdCogb3V0KTsKKworLy8gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIHVzaW5nIHRoZSBhYm92ZS4KK3ZvaWQgV2ViUEluaXRDb252ZXJ0QVJHQlRvWVVWKHZvaWQpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUmVzY2FsZXIKKworc3RydWN0IFdlYlBSZXNjYWxlcjsKKworLy8gSW1wb3J0IGEgcm93IG9mIGRhdGEgYW5kIHNhdmUgaXRzIGNvbnRyaWJ1dGlvbiBpbiB0aGUgcmVzY2FsZXIuCisvLyAnY2hhbm5lbCcgZGVub3RlcyB0aGUgY2hhbm5lbCBudW1iZXIgdG8gYmUgaW1wb3J0ZWQuICdFeHBhbmQnIGNvcnJlc3BvbmRzIHRvCisvLyB0aGUgd3JrLT54X2V4cGFuZCBjYXNlLiBPdGhlcndpc2UsICdTaHJpbmsnIGlzIHRvIGJlIHVzZWQuCit0eXBlZGVmIHZvaWQgKCpXZWJQUmVzY2FsZXJJbXBvcnRSb3dGdW5jKShzdHJ1Y3QgV2ViUFJlc2NhbGVyKiBjb25zdCB3cmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmMpOworCitleHRlcm4gV2ViUFJlc2NhbGVySW1wb3J0Um93RnVuYyBXZWJQUmVzY2FsZXJJbXBvcnRSb3dFeHBhbmQ7CitleHRlcm4gV2ViUFJlc2NhbGVySW1wb3J0Um93RnVuYyBXZWJQUmVzY2FsZXJJbXBvcnRSb3dTaHJpbms7CisKKy8vIEV4cG9ydCBvbmUgcm93IChzdGFydGluZyBhdCB4X291dCBwb3NpdGlvbikgZnJvbSByZXNjYWxlci4KKy8vICdFeHBhbmQnIGNvcnJlc3BvbmRzIHRvIHRoZSB3cmstPnlfZXhwYW5kIGNhc2UuCisvLyBPdGhlcndpc2UgJ1NocmluaycgaXMgdG8gYmUgdXNlZAordHlwZWRlZiB2b2lkICgqV2ViUFJlc2NhbGVyRXhwb3J0Um93RnVuYykoc3RydWN0IFdlYlBSZXNjYWxlciogY29uc3Qgd3JrKTsKK2V4dGVybiBXZWJQUmVzY2FsZXJFeHBvcnRSb3dGdW5jIFdlYlBSZXNjYWxlckV4cG9ydFJvd0V4cGFuZDsKK2V4dGVybiBXZWJQUmVzY2FsZXJFeHBvcnRSb3dGdW5jIFdlYlBSZXNjYWxlckV4cG9ydFJvd1NocmluazsKKworLy8gUGxhaW4tQyBpbXBsZW1lbnRhdGlvbiwgYXMgZmFsbC1iYWNrLgorZXh0ZXJuIHZvaWQgV2ViUFJlc2NhbGVySW1wb3J0Um93RXhwYW5kX0Moc3RydWN0IFdlYlBSZXNjYWxlciogY29uc3Qgd3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjKTsKK2V4dGVybiB2b2lkIFdlYlBSZXNjYWxlckltcG9ydFJvd1Nocmlua19DKHN0cnVjdCBXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyYyk7CitleHRlcm4gdm9pZCBXZWJQUmVzY2FsZXJFeHBvcnRSb3dFeHBhbmRfQyhzdHJ1Y3QgV2ViUFJlc2NhbGVyKiBjb25zdCB3cmspOworZXh0ZXJuIHZvaWQgV2ViUFJlc2NhbGVyRXhwb3J0Um93U2hyaW5rX0Moc3RydWN0IFdlYlBSZXNjYWxlciogY29uc3Qgd3JrKTsKKworLy8gTWFpbiBlbnRyeSBjYWxsczoKK2V4dGVybiB2b2lkIFdlYlBSZXNjYWxlckltcG9ydFJvdyhzdHJ1Y3QgV2ViUFJlc2NhbGVyKiBjb25zdCB3cmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjKTsKKy8vIEV4cG9ydCBvbmUgcm93IChzdGFydGluZyBhdCB4X291dCBwb3NpdGlvbikgZnJvbSByZXNjYWxlci4KK2V4dGVybiB2b2lkIFdlYlBSZXNjYWxlckV4cG9ydFJvdyhzdHJ1Y3QgV2ViUFJlc2NhbGVyKiBjb25zdCB3cmspOworCisvLyBNdXN0IGJlIGNhbGxlZCBmaXJzdCBiZWZvcmUgdXNpbmcgdGhlIGFib3ZlLgordm9pZCBXZWJQUmVzY2FsZXJEc3BJbml0KHZvaWQpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVXRpbGl0aWVzIGZvciBwcm9jZXNzaW5nIHRyYW5zcGFyZW50IGNoYW5uZWwuCisKKy8vIEFwcGx5IGFscGhhIHByZS1tdWx0aXBseSBvbiBhbiByZ2JhLCBiZ3JhIG9yIGFyZ2IgcGxhbmUgb2Ygc2l6ZSB3ICogaC4KKy8vIGFscGhhX2ZpcnN0IHNob3VsZCBiZSAwIGZvciBhcmdiLCAxIGZvciByZ2JhIG9yIGJncmEgKHdoZXJlIGFscGhhIGlzIGxhc3QpLgorZXh0ZXJuIHZvaWQgKCpXZWJQQXBwbHlBbHBoYU11bHRpcGx5KSgKKyAgICB1aW50OF90KiByZ2JhLCBpbnQgYWxwaGFfZmlyc3QsIGludCB3LCBpbnQgaCwgaW50IHN0cmlkZSk7CisKKy8vIFNhbWUsIGJ1ZiBzcGVjaWZpY2FsbHkgZm9yIFJHQkE0NDQ0IGZvcm1hdAorZXh0ZXJuIHZvaWQgKCpXZWJQQXBwbHlBbHBoYU11bHRpcGx5NDQ0NCkoCisgICAgdWludDhfdCogcmdiYTQ0NDQsIGludCB3LCBpbnQgaCwgaW50IHN0cmlkZSk7CisKKy8vIERpc3BhdGNoIHRoZSB2YWx1ZXMgZnJvbSBhbHBoYVtdIHBsYW5lIHRvIHRoZSBBUkdCIGRlc3RpbmF0aW9uICdkc3QnLgorLy8gUmV0dXJucyB0cnVlIGlmIGFscGhhW10gcGxhbmUgaGFzIG5vbi10cml2aWFsIHZhbHVlcyBkaWZmZXJlbnQgZnJvbSAweGZmLgorZXh0ZXJuIGludCAoKldlYlBEaXNwYXRjaEFscGhhKShjb25zdCB1aW50OF90KiBhbHBoYSwgaW50IGFscGhhX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBkc3Rfc3RyaWRlKTsKKworLy8gVHJhbnNmZXIgcGFja2VkIDhiIGFscGhhW10gdmFsdWVzIHRvIGdyZWVuIGNoYW5uZWwgaW4gZHN0W10sIHplcm8naW5nIHRoZQorLy8gQS9SL0IgdmFsdWVzLiAnZHN0X3N0cmlkZScgaXMgdGhlIHN0cmlkZSBmb3IgZHN0W10gaW4gdWludDMyX3QgdW5pdHMuCitleHRlcm4gdm9pZCAoKldlYlBEaXNwYXRjaEFscGhhVG9HcmVlbikoY29uc3QgdWludDhfdCogYWxwaGEsIGludCBhbHBoYV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkc3QsIGludCBkc3Rfc3RyaWRlKTsKKworLy8gRXh0cmFjdCB0aGUgYWxwaGEgdmFsdWVzIGZyb20gMzJiIHZhbHVlcyBpbiBhcmdiW10gYW5kIHBhY2sgdGhlbSBpbnRvIGFscGhhW10KKy8vICh0aGlzIGlzIHRoZSBvcHBvc2l0ZSBvZiBXZWJQRGlzcGF0Y2hBbHBoYSkuCisvLyBSZXR1cm5zIHRydWUgaWYgdGhlcmUncyBvbmx5IHRyaXZpYWwgMHhmZiBhbHBoYSB2YWx1ZXMuCitleHRlcm4gaW50ICgqV2ViUEV4dHJhY3RBbHBoYSkoY29uc3QgdWludDhfdCogYXJnYiwgaW50IGFyZ2Jfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBhbHBoYSwgaW50IGFscGhhX3N0cmlkZSk7CisKKy8vIEV4dHJhY3QgdGhlIGdyZWVuIHZhbHVlcyBmcm9tIDMyYiB2YWx1ZXMgaW4gYXJnYltdIGFuZCBwYWNrIHRoZW0gaW50byBhbHBoYVtdCisvLyAodGhpcyBpcyB0aGUgb3Bwb3NpdGUgb2YgV2ViUERpc3BhdGNoQWxwaGFUb0dyZWVuKS4KK2V4dGVybiB2b2lkICgqV2ViUEV4dHJhY3RHcmVlbikoY29uc3QgdWludDMyX3QqIGFyZ2IsIHVpbnQ4X3QqIGFscGhhLCBpbnQgc2l6ZSk7CisKKy8vIFByZS1NdWx0aXBseSBvcGVyYXRpb24gdHJhbnNmb3JtcyB4IGludG8geCAqIEEgLyAyNTUgICh3aGVyZSB4PVksUixHIG9yIEIpLgorLy8gVW4tTXVsdGlwbHkgb3BlcmF0aW9uIHRyYW5zZm9ybXMgeCBpbnRvIHggKiAyNTUgLyBBLgorCisvLyBQcmUtTXVsdGlwbHkgb3IgVW4tTXVsdGlwbHkgKGlmICdpbnZlcnNlJyBpcyB0cnVlKSBhcmdiIHZhbHVlcyBpbiBhIHJvdy4KK2V4dGVybiB2b2lkICgqV2ViUE11bHRBUkdCUm93KSh1aW50MzJfdCogY29uc3QgcHRyLCBpbnQgd2lkdGgsIGludCBpbnZlcnNlKTsKKworLy8gU2FtZSBhIFdlYlBNdWx0QVJHQlJvdygpLCBidXQgZm9yIHNldmVyYWwgcm93cy4KK3ZvaWQgV2ViUE11bHRBUkdCUm93cyh1aW50OF90KiBwdHIsIGludCBzdHJpZGUsIGludCB3aWR0aCwgaW50IG51bV9yb3dzLAorICAgICAgICAgICAgICAgICAgICAgIGludCBpbnZlcnNlKTsKKworLy8gU2FtZSBmb3IgYSByb3cgb2Ygc2luZ2xlIHZhbHVlcywgd2l0aCBzaWRlIGFscGhhIHZhbHVlcy4KK2V4dGVybiB2b2lkICgqV2ViUE11bHRSb3cpKHVpbnQ4X3QqIGNvbnN0IHB0ciwgY29uc3QgdWludDhfdCogY29uc3QgYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBpbnZlcnNlKTsKKworLy8gU2FtZSBhIFdlYlBNdWx0Um93KCksIGJ1dCBmb3Igc2V2ZXJhbCAnbnVtX3Jvd3MnIHJvd3MuCit2b2lkIFdlYlBNdWx0Um93cyh1aW50OF90KiBwdHIsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBhbHBoYSwgaW50IGFscGhhX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IG51bV9yb3dzLCBpbnQgaW52ZXJzZSk7CisKKy8vIFBsYWluLUMgdmVyc2lvbnMsIHVzZWQgYXMgZmFsbGJhY2sgYnkgc29tZSBpbXBsZW1lbnRhdGlvbnMuCit2b2lkIFdlYlBNdWx0Um93X0ModWludDhfdCogY29uc3QgcHRyLCBjb25zdCB1aW50OF90KiBjb25zdCBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBpbnZlcnNlKTsKK3ZvaWQgV2ViUE11bHRBUkdCUm93X0ModWludDMyX3QqIGNvbnN0IHB0ciwgaW50IHdpZHRoLCBpbnQgaW52ZXJzZSk7CisKKyNpZmRlZiBXT1JEU19CSUdFTkRJQU4KKy8vIEFSR0IgcGFja2luZyBmdW5jdGlvbjogYS9yL2cvYiBpbnB1dCBpcyByZ2JhIG9yIGJncmEgb3JkZXIuCitleHRlcm4gdm9pZCAoKldlYlBQYWNrQVJHQikoY29uc3QgdWludDhfdCogYSwgY29uc3QgdWludDhfdCogciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBnLCBjb25zdCB1aW50OF90KiBiLCBpbnQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBvdXQpOworI2VuZGlmCisKKy8vIFJHQiBwYWNraW5nIGZ1bmN0aW9uLiAnc3RlcCcgY2FuIGJlIDMgb3IgNC4gci9nL2IgaW5wdXQgaXMgcmdiIG9yIGJnciBvcmRlci4KK2V4dGVybiB2b2lkICgqV2ViUFBhY2tSR0IpKGNvbnN0IHVpbnQ4X3QqIHIsIGNvbnN0IHVpbnQ4X3QqIGcsIGNvbnN0IHVpbnQ4X3QqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBpbnQgc3RlcCwgdWludDMyX3QqIG91dCk7CisKKy8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHNyY1tpXSBjb250YWlucyBhIHZhbHVlIGRpZmZlcmVudCBmcm9tIDB4ZmYuCitleHRlcm4gaW50ICgqV2ViUEhhc0FscGhhOGIpKGNvbnN0IHVpbnQ4X3QqIHNyYywgaW50IGxlbmd0aCk7CisvLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiBzcmNbNCppXSBjb250YWlucyBhIHZhbHVlIGRpZmZlcmVudCBmcm9tIDB4ZmYuCitleHRlcm4gaW50ICgqV2ViUEhhc0FscGhhMzJiKShjb25zdCB1aW50OF90KiBzcmMsIGludCBsZW5ndGgpOworCisvLyBUbyBiZSBjYWxsZWQgZmlyc3QgYmVmb3JlIHVzaW5nIHRoZSBhYm92ZS4KK3ZvaWQgV2ViUEluaXRBbHBoYVByb2Nlc3Npbmcodm9pZCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGaWx0ZXIgZnVuY3Rpb25zCisKK3R5cGVkZWYgZW51bSB7ICAgICAvLyBGaWx0ZXIgdHlwZXMuCisgIFdFQlBfRklMVEVSX05PTkUgPSAwLAorICBXRUJQX0ZJTFRFUl9IT1JJWk9OVEFMLAorICBXRUJQX0ZJTFRFUl9WRVJUSUNBTCwKKyAgV0VCUF9GSUxURVJfR1JBRElFTlQsCisgIFdFQlBfRklMVEVSX0xBU1QgPSBXRUJQX0ZJTFRFUl9HUkFESUVOVCArIDEsICAvLyBlbmQgbWFya2VyCisgIFdFQlBfRklMVEVSX0JFU1QsICAgIC8vIG1ldGEtdHlwZXMKKyAgV0VCUF9GSUxURVJfRkFTVAorfSBXRUJQX0ZJTFRFUl9UWVBFOworCit0eXBlZGVmIHZvaWQgKCpXZWJQRmlsdGVyRnVuYykoY29uc3QgdWludDhfdCogaW4sIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCB1aW50OF90KiBvdXQpOworLy8gSW4tcGxhY2UgdW4tZmlsdGVyaW5nLgorLy8gV2FybmluZyEgJ3ByZXZfbGluZScgcG9pbnRlciBjYW4gYmUgZXF1YWwgdG8gJ2N1cl9saW5lJyBvciAncHJlZHMnLgordHlwZWRlZiB2b2lkICgqV2ViUFVuZmlsdGVyRnVuYykoY29uc3QgdWludDhfdCogcHJldl9saW5lLCBjb25zdCB1aW50OF90KiBwcmVkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGN1cl9saW5lLCBpbnQgd2lkdGgpOworCisvLyBGaWx0ZXIgdGhlIGdpdmVuIGRhdGEgdXNpbmcgdGhlIGdpdmVuIHByZWRpY3Rvci4KKy8vICdpbicgY29ycmVzcG9uZHMgdG8gYSAyLWRpbWVuc2lvbmFsIHBpeGVsIGFycmF5IG9mIHNpemUgKHN0cmlkZSAqIGhlaWdodCkKKy8vIGluIHJhc3RlciBvcmRlci4KKy8vICdzdHJpZGUnIGlzIG51bWJlciBvZiBieXRlcyBwZXIgc2NhbiBsaW5lICh3aXRoIHBvc3NpYmxlIHBhZGRpbmcpLgorLy8gJ291dCcgc2hvdWxkIGJlIHByZS1hbGxvY2F0ZWQuCitleHRlcm4gV2ViUEZpbHRlckZ1bmMgV2ViUEZpbHRlcnNbV0VCUF9GSUxURVJfTEFTVF07CisKKy8vIEluLXBsYWNlIHJlY29uc3RydWN0IHRoZSBvcmlnaW5hbCBkYXRhIGZyb20gdGhlIGdpdmVuIGZpbHRlcmVkIGRhdGEuCisvLyBUaGUgcmVjb25zdHJ1Y3Rpb24gd2lsbCBiZSBkb25lIGZvciAnbnVtX3Jvd3MnIHJvd3Mgc3RhcnRpbmcgZnJvbSAncm93JworLy8gKGFzc3VtaW5nIHJvd3MgdXB0byAncm93IC0gMScgYXJlIGFscmVhZHkgcmVjb25zdHJ1Y3RlZCkuCitleHRlcm4gV2ViUFVuZmlsdGVyRnVuYyBXZWJQVW5maWx0ZXJzW1dFQlBfRklMVEVSX0xBU1RdOworCisvLyBUbyBiZSBjYWxsZWQgZmlyc3QgYmVmb3JlIHVzaW5nIHRoZSBhYm92ZS4KK3ZvaWQgVlA4RmlsdGVyc0luaXQodm9pZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvKiBXRUJQX0RTUF9EU1BfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZW5jLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NmUxOWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2VuYy5jCkBAIC0wLDAgKzEsODQyIEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU3BlZWQtY3JpdGljYWwgZW5jb2RpbmcgZnVuY3Rpb25zLgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9hc3NlcnRfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0ZGxpYl9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RyaW5nX3BvZW0uaCIKKyNlbHNlCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+ICAvLyBmb3IgYWJzKCkKKyNlbmRpZgorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKyNpbmNsdWRlICJzcmMvZW5jL3ZwOGlfZW5jLmgiCisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50OF90IGNsaXBfOGIoaW50IHYpIHsKKyAgcmV0dXJuICghKHYgJiB+MHhmZikpID8gdiA6ICh2IDwgMCkgPyAwIDogMjU1OworfQorCisjaWYgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorc3RhdGljIFdFQlBfSU5MSU5FIGludCBjbGlwX21heChpbnQgdiwgaW50IG1heCkgeworICByZXR1cm4gKHYgPiBtYXgpID8gbWF4IDogdjsKK30KKyNlbmRpZiAgLy8gIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29tcHV0ZSBzdXNjZXB0aWJpbGl0eSBiYXNlZCBvbiBEQ1QtY29lZmYgaGlzdG9ncmFtczoKKy8vIHRoZSBoaWdoZXIsIHRoZSAiZWFzaWVyIiB0aGUgbWFjcm9ibG9jayBpcyB0byBjb21wcmVzcy4KKworY29uc3QgaW50IFZQOERzcFNjYW5bMTYgKyA0ICsgNF0gPSB7CisgIC8vIEx1bWEKKyAgMCArICAwICogQlBTLCAgNCArICAwICogQlBTLCA4ICsgIDAgKiBCUFMsIDEyICsgIDAgKiBCUFMsCisgIDAgKyAgNCAqIEJQUywgIDQgKyAgNCAqIEJQUywgOCArICA0ICogQlBTLCAxMiArICA0ICogQlBTLAorICAwICsgIDggKiBCUFMsICA0ICsgIDggKiBCUFMsIDggKyAgOCAqIEJQUywgMTIgKyAgOCAqIEJQUywKKyAgMCArIDEyICogQlBTLCAgNCArIDEyICogQlBTLCA4ICsgMTIgKiBCUFMsIDEyICsgMTIgKiBCUFMsCisKKyAgMCArIDAgKiBCUFMsICAgNCArIDAgKiBCUFMsIDAgKyA0ICogQlBTLCAgNCArIDQgKiBCUFMsICAgIC8vIFUKKyAgOCArIDAgKiBCUFMsICAxMiArIDAgKiBCUFMsIDggKyA0ICogQlBTLCAxMiArIDQgKiBCUFMgICAgIC8vIFYKK307CisKKy8vIGdlbmVyYWwtcHVycG9zZSB1dGlsIGZ1bmN0aW9uCit2b2lkIFZQOFNldEhpc3RvZ3JhbURhdGEoY29uc3QgaW50IGRpc3RyaWJ1dGlvbltNQVhfQ09FRkZfVEhSRVNIICsgMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgVlA4SGlzdG9ncmFtKiBjb25zdCBoaXN0bykgeworICBpbnQgbWF4X3ZhbHVlID0gMCwgbGFzdF9ub25femVybyA9IDE7CisgIGludCBrOworICBmb3IgKGsgPSAwOyBrIDw9IE1BWF9DT0VGRl9USFJFU0g7ICsraykgeworICAgIGNvbnN0IGludCB2YWx1ZSA9IGRpc3RyaWJ1dGlvbltrXTsKKyAgICBpZiAodmFsdWUgPiAwKSB7CisgICAgICBpZiAodmFsdWUgPiBtYXhfdmFsdWUpIG1heF92YWx1ZSA9IHZhbHVlOworICAgICAgbGFzdF9ub25femVybyA9IGs7CisgICAgfQorICB9CisgIGhpc3RvLT5tYXhfdmFsdWUgPSBtYXhfdmFsdWU7CisgIGhpc3RvLT5sYXN0X25vbl96ZXJvID0gbGFzdF9ub25femVybzsKK30KKworI2lmICFXRUJQX05FT05fT01JVF9DX0NPREUKK3N0YXRpYyB2b2lkIENvbGxlY3RIaXN0b2dyYW1fQyhjb25zdCB1aW50OF90KiByZWYsIGNvbnN0IHVpbnQ4X3QqIHByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X2Jsb2NrLCBpbnQgZW5kX2Jsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEhpc3RvZ3JhbSogY29uc3QgaGlzdG8pIHsKKyAgaW50IGo7CisgIGludCBkaXN0cmlidXRpb25bTUFYX0NPRUZGX1RIUkVTSCArIDFdID0geyAwIH07CisgIGZvciAoaiA9IHN0YXJ0X2Jsb2NrOyBqIDwgZW5kX2Jsb2NrOyArK2opIHsKKyAgICBpbnQgazsKKyAgICBpbnQxNl90IG91dFsxNl07CisKKyAgICBWUDhGVHJhbnNmb3JtKHJlZiArIFZQOERzcFNjYW5bal0sIHByZWQgKyBWUDhEc3BTY2FuW2pdLCBvdXQpOworCisgICAgLy8gQ29udmVydCBjb2VmZmljaWVudHMgdG8gYmluLgorICAgIGZvciAoayA9IDA7IGsgPCAxNjsgKytrKSB7CisgICAgICBjb25zdCBpbnQgdiA9IGFicyhvdXRba10pID4+IDM7CisgICAgICBjb25zdCBpbnQgY2xpcHBlZF92YWx1ZSA9IGNsaXBfbWF4KHYsIE1BWF9DT0VGRl9USFJFU0gpOworICAgICAgKytkaXN0cmlidXRpb25bY2xpcHBlZF92YWx1ZV07CisgICAgfQorICB9CisgIFZQOFNldEhpc3RvZ3JhbURhdGEoZGlzdHJpYnV0aW9uLCBoaXN0byk7Cit9CisjZW5kaWYgIC8vICFXRUJQX05FT05fT01JVF9DX0NPREUKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHJ1bi10aW1lIHRhYmxlcyAofjRrKQorCitzdGF0aWMgdWludDhfdCBjbGlwMVsyNTUgKyA1MTAgKyAxXTsgICAgLy8gY2xpcHMgWy0yNTUsNTEwXSB0byBbMCwyNTVdCisKKy8vIFdlIGRlY2xhcmUgdGhpcyB2YXJpYWJsZSAndm9sYXRpbGUnIHRvIHByZXZlbnQgaW5zdHJ1Y3Rpb24gcmVvcmRlcmluZworLy8gYW5kIG1ha2Ugc3VyZSBpdCdzIHNldCB0byB0cnVlIF9sYXN0XyAoc28gYXMgdG8gYmUgdGhyZWFkLXNhZmUpCitzdGF0aWMgdm9sYXRpbGUgaW50IHRhYmxlc19vayA9IDA7CisKK3N0YXRpYyBXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgSW5pdFRhYmxlcyh2b2lkKSB7CisgIGlmICghdGFibGVzX29rKSB7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gLTI1NTsgaSA8PSAyNTUgKyAyNTU7ICsraSkgeworICAgICAgY2xpcDFbMjU1ICsgaV0gPSBjbGlwXzhiKGkpOworICAgIH0KKyAgICB0YWJsZXNfb2sgPSAxOworICB9Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRyYW5zZm9ybXMgKFBhcmFncmFwaCAxNC40KQorCisjaWYgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorCisjZGVmaW5lIFNUT1JFKHgsIHksIHYpIFwKKyAgZHN0Wyh4KSArICh5KSAqIEJQU10gPSBjbGlwXzhiKHJlZlsoeCkgKyAoeSkgKiBCUFNdICsgKCh2KSA+PiAzKSkKKworc3RhdGljIGNvbnN0IGludCBrQzEgPSAyMDA5MSArICgxIDw8IDE2KTsKK3N0YXRpYyBjb25zdCBpbnQga0MyID0gMzU0Njg7CisjZGVmaW5lIE1VTChhLCBiKSAoKChhKSAqIChiKSkgPj4gMTYpCisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIElUcmFuc2Zvcm1PbmUoY29uc3QgdWludDhfdCogcmVmLCBjb25zdCBpbnQxNl90KiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0KSB7CisgIGludCBDWzQgKiA0XSwgKnRtcDsKKyAgaW50IGk7CisgIHRtcCA9IEM7CisgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsgICAgLy8gdmVydGljYWwgcGFzcworICAgIGNvbnN0IGludCBhID0gaW5bMF0gKyBpbls4XTsKKyAgICBjb25zdCBpbnQgYiA9IGluWzBdIC0gaW5bOF07CisgICAgY29uc3QgaW50IGMgPSBNVUwoaW5bNF0sIGtDMikgLSBNVUwoaW5bMTJdLCBrQzEpOworICAgIGNvbnN0IGludCBkID0gTVVMKGluWzRdLCBrQzEpICsgTVVMKGluWzEyXSwga0MyKTsKKyAgICB0bXBbMF0gPSBhICsgZDsKKyAgICB0bXBbMV0gPSBiICsgYzsKKyAgICB0bXBbMl0gPSBiIC0gYzsKKyAgICB0bXBbM10gPSBhIC0gZDsKKyAgICB0bXAgKz0gNDsKKyAgICBpbisrOworICB9CisKKyAgdG1wID0gQzsKKyAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeyAgICAvLyBob3Jpem9udGFsIHBhc3MKKyAgICBjb25zdCBpbnQgZGMgPSB0bXBbMF0gKyA0OworICAgIGNvbnN0IGludCBhID0gIGRjICsgIHRtcFs4XTsKKyAgICBjb25zdCBpbnQgYiA9ICBkYyAtICB0bXBbOF07CisgICAgY29uc3QgaW50IGMgPSBNVUwodG1wWzRdLCBrQzIpIC0gTVVMKHRtcFsxMl0sIGtDMSk7CisgICAgY29uc3QgaW50IGQgPSBNVUwodG1wWzRdLCBrQzEpICsgTVVMKHRtcFsxMl0sIGtDMik7CisgICAgU1RPUkUoMCwgaSwgYSArIGQpOworICAgIFNUT1JFKDEsIGksIGIgKyBjKTsKKyAgICBTVE9SRSgyLCBpLCBiIC0gYyk7CisgICAgU1RPUkUoMywgaSwgYSAtIGQpOworICAgIHRtcCsrOworICB9Cit9CisKK3N0YXRpYyB2b2lkIElUcmFuc2Zvcm1fQyhjb25zdCB1aW50OF90KiByZWYsIGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRvX3R3bykgeworICBJVHJhbnNmb3JtT25lKHJlZiwgaW4sIGRzdCk7CisgIGlmIChkb190d28pIHsKKyAgICBJVHJhbnNmb3JtT25lKHJlZiArIDQsIGluICsgMTYsIGRzdCArIDQpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIEZUcmFuc2Zvcm1fQyhjb25zdCB1aW50OF90KiBzcmMsIGNvbnN0IHVpbnQ4X3QqIHJlZiwgaW50MTZfdCogb3V0KSB7CisgIGludCBpOworICBpbnQgdG1wWzE2XTsKKyAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSwgc3JjICs9IEJQUywgcmVmICs9IEJQUykgeworICAgIGNvbnN0IGludCBkMCA9IHNyY1swXSAtIHJlZlswXTsgICAvLyA5Yml0IGR5bmFtaWMgcmFuZ2UgKFstMjU1LDI1NV0pCisgICAgY29uc3QgaW50IGQxID0gc3JjWzFdIC0gcmVmWzFdOworICAgIGNvbnN0IGludCBkMiA9IHNyY1syXSAtIHJlZlsyXTsKKyAgICBjb25zdCBpbnQgZDMgPSBzcmNbM10gLSByZWZbM107CisgICAgY29uc3QgaW50IGEwID0gKGQwICsgZDMpOyAgICAgICAgIC8vIDEwYiAgICAgICAgICAgICAgICAgICAgICBbLTUxMCw1MTBdCisgICAgY29uc3QgaW50IGExID0gKGQxICsgZDIpOworICAgIGNvbnN0IGludCBhMiA9IChkMSAtIGQyKTsKKyAgICBjb25zdCBpbnQgYTMgPSAoZDAgLSBkMyk7CisgICAgdG1wWzAgKyBpICogNF0gPSAoYTAgKyBhMSkgKiA4OyAgIC8vIDE0YiAgICAgICAgICAgICAgICAgICAgICBbLTgxNjAsODE2MF0KKyAgICB0bXBbMSArIGkgKiA0XSA9IChhMiAqIDIyMTcgKyBhMyAqIDUzNTIgKyAxODEyKSA+PiA5OyAgICAgIC8vIFstNzUzNiw3NTQyXQorICAgIHRtcFsyICsgaSAqIDRdID0gKGEwIC0gYTEpICogODsKKyAgICB0bXBbMyArIGkgKiA0XSA9IChhMyAqIDIyMTcgLSBhMiAqIDUzNTIgKyAgOTM3KSA+PiA5OworICB9CisgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICBjb25zdCBpbnQgYTAgPSAodG1wWzAgKyBpXSArIHRtcFsxMiArIGldKTsgIC8vIDE1YgorICAgIGNvbnN0IGludCBhMSA9ICh0bXBbNCArIGldICsgdG1wWyA4ICsgaV0pOworICAgIGNvbnN0IGludCBhMiA9ICh0bXBbNCArIGldIC0gdG1wWyA4ICsgaV0pOworICAgIGNvbnN0IGludCBhMyA9ICh0bXBbMCArIGldIC0gdG1wWzEyICsgaV0pOworICAgIG91dFswICsgaV0gPSAoYTAgKyBhMSArIDcpID4+IDQ7ICAgICAgICAgICAgLy8gMTJiCisgICAgb3V0WzQgKyBpXSA9ICgoYTIgKiAyMjE3ICsgYTMgKiA1MzUyICsgMTIwMDApID4+IDE2KSArIChhMyAhPSAwKTsKKyAgICBvdXRbOCArIGldID0gKGEwIC0gYTEgKyA3KSA+PiA0OworICAgIG91dFsxMisgaV0gPSAoKGEzICogMjIxNyAtIGEyICogNTM1MiArIDUxMDAwKSA+PiAxNik7CisgIH0KK30KKyNlbmRpZiAgLy8gIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorCitzdGF0aWMgdm9pZCBGVHJhbnNmb3JtMl9DKGNvbnN0IHVpbnQ4X3QqIHNyYywgY29uc3QgdWludDhfdCogcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90KiBvdXQpIHsKKyAgVlA4RlRyYW5zZm9ybShzcmMsIHJlZiwgb3V0KTsKKyAgVlA4RlRyYW5zZm9ybShzcmMgKyA0LCByZWYgKyA0LCBvdXQgKyAxNik7Cit9CisKKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCitzdGF0aWMgdm9pZCBGVHJhbnNmb3JtV0hUX0MoY29uc3QgaW50MTZfdCogaW4sIGludDE2X3QqIG91dCkgeworICAvLyBpbnB1dCBpcyAxMmIgc2lnbmVkCisgIGludDMyX3QgdG1wWzE2XTsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCA0OyArK2ksIGluICs9IDY0KSB7CisgICAgY29uc3QgaW50IGEwID0gKGluWzAgKiAxNl0gKyBpblsyICogMTZdKTsgIC8vIDEzYgorICAgIGNvbnN0IGludCBhMSA9IChpblsxICogMTZdICsgaW5bMyAqIDE2XSk7CisgICAgY29uc3QgaW50IGEyID0gKGluWzEgKiAxNl0gLSBpblszICogMTZdKTsKKyAgICBjb25zdCBpbnQgYTMgPSAoaW5bMCAqIDE2XSAtIGluWzIgKiAxNl0pOworICAgIHRtcFswICsgaSAqIDRdID0gYTAgKyBhMTsgICAvLyAxNGIKKyAgICB0bXBbMSArIGkgKiA0XSA9IGEzICsgYTI7CisgICAgdG1wWzIgKyBpICogNF0gPSBhMyAtIGEyOworICAgIHRtcFszICsgaSAqIDRdID0gYTAgLSBhMTsKKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgY29uc3QgaW50IGEwID0gKHRtcFswICsgaV0gKyB0bXBbOCArIGldKTsgIC8vIDE1YgorICAgIGNvbnN0IGludCBhMSA9ICh0bXBbNCArIGldICsgdG1wWzEyKyBpXSk7CisgICAgY29uc3QgaW50IGEyID0gKHRtcFs0ICsgaV0gLSB0bXBbMTIrIGldKTsKKyAgICBjb25zdCBpbnQgYTMgPSAodG1wWzAgKyBpXSAtIHRtcFs4ICsgaV0pOworICAgIGNvbnN0IGludCBiMCA9IGEwICsgYTE7ICAgIC8vIDE2YgorICAgIGNvbnN0IGludCBiMSA9IGEzICsgYTI7CisgICAgY29uc3QgaW50IGIyID0gYTMgLSBhMjsKKyAgICBjb25zdCBpbnQgYjMgPSBhMCAtIGExOworICAgIG91dFsgMCArIGldID0gYjAgPj4gMTsgICAgIC8vIDE1YgorICAgIG91dFsgNCArIGldID0gYjEgPj4gMTsKKyAgICBvdXRbIDggKyBpXSA9IGIyID4+IDE7CisgICAgb3V0WzEyICsgaV0gPSBiMyA+PiAxOworICB9Cit9CisjZW5kaWYgIC8vICFXRUJQX05FT05fT01JVF9DX0NPREUKKworI3VuZGVmIE1VTAorI3VuZGVmIFNUT1JFCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbnRyYSBwcmVkaWN0aW9ucworCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBGaWxsKHVpbnQ4X3QqIGRzdCwgaW50IHZhbHVlLCBpbnQgc2l6ZSkgeworICBpbnQgajsKKyAgZm9yIChqID0gMDsgaiA8IHNpemU7ICsraikgeworICAgIG1lbXNldChkc3QgKyBqICogQlBTLCB2YWx1ZSwgc2l6ZSk7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVmVydGljYWxQcmVkKHVpbnQ4X3QqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3AsIGludCBzaXplKSB7CisgIGludCBqOworICBpZiAodG9wICE9IE5VTEwpIHsKKyAgICBmb3IgKGogPSAwOyBqIDwgc2l6ZTsgKytqKSBtZW1jcHkoZHN0ICsgaiAqIEJQUywgdG9wLCBzaXplKTsKKyAgfSBlbHNlIHsKKyAgICBGaWxsKGRzdCwgMTI3LCBzaXplKTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBIb3Jpem9udGFsUHJlZCh1aW50OF90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBsZWZ0LCBpbnQgc2l6ZSkgeworICBpZiAobGVmdCAhPSBOVUxMKSB7CisgICAgaW50IGo7CisgICAgZm9yIChqID0gMDsgaiA8IHNpemU7ICsraikgeworICAgICAgbWVtc2V0KGRzdCArIGogKiBCUFMsIGxlZnRbal0sIHNpemUpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBGaWxsKGRzdCwgMTI5LCBzaXplKTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBUcnVlTW90aW9uKHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdG9wLCBpbnQgc2l6ZSkgeworICBpbnQgeTsKKyAgaWYgKGxlZnQgIT0gTlVMTCkgeworICAgIGlmICh0b3AgIT0gTlVMTCkgeworICAgICAgY29uc3QgdWludDhfdCogY29uc3QgY2xpcCA9IGNsaXAxICsgMjU1IC0gbGVmdFstMV07CisgICAgICBmb3IgKHkgPSAwOyB5IDwgc2l6ZTsgKyt5KSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGNsaXBfdGFibGUgPSBjbGlwICsgbGVmdFt5XTsKKyAgICAgICAgaW50IHg7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBzaXplOyArK3gpIHsKKyAgICAgICAgICBkc3RbeF0gPSBjbGlwX3RhYmxlW3RvcFt4XV07CisgICAgICAgIH0KKyAgICAgICAgZHN0ICs9IEJQUzsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgSG9yaXpvbnRhbFByZWQoZHN0LCBsZWZ0LCBzaXplKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLy8gdHJ1ZSBtb3Rpb24gd2l0aG91dCBsZWZ0IHNhbXBsZXMgKGhlbmNlOiB3aXRoIGRlZmF1bHQgMTI5IHZhbHVlKQorICAgIC8vIGlzIGVxdWl2YWxlbnQgdG8gVkUgcHJlZGljdGlvbiB3aGVyZSB5b3UganVzdCBjb3B5IHRoZSB0b3Agc2FtcGxlcy4KKyAgICAvLyBOb3RlIHRoYXQgaWYgdG9wIHNhbXBsZXMgYXJlIG5vdCBhdmFpbGFibGUsIHRoZSBkZWZhdWx0IHZhbHVlIGlzCisgICAgLy8gdGhlbiAxMjksIGFuZCBub3QgMTI3IGFzIGluIHRoZSBWZXJ0aWNhbFByZWQgY2FzZS4KKyAgICBpZiAodG9wICE9IE5VTEwpIHsKKyAgICAgIFZlcnRpY2FsUHJlZChkc3QsIHRvcCwgc2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEZpbGwoZHN0LCAxMjksIHNpemUpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEQ01vZGUodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSwgaW50IHJvdW5kLCBpbnQgc2hpZnQpIHsKKyAgaW50IERDID0gMDsKKyAgaW50IGo7CisgIGlmICh0b3AgIT0gTlVMTCkgeworICAgIGZvciAoaiA9IDA7IGogPCBzaXplOyArK2opIERDICs9IHRvcFtqXTsKKyAgICBpZiAobGVmdCAhPSBOVUxMKSB7ICAgLy8gdG9wIGFuZCBsZWZ0IHByZXNlbnQKKyAgICAgIGZvciAoaiA9IDA7IGogPCBzaXplOyArK2opIERDICs9IGxlZnRbal07CisgICAgfSBlbHNlIHsgICAgICAvLyB0b3AsIGJ1dCBubyBsZWZ0CisgICAgICBEQyArPSBEQzsKKyAgICB9CisgICAgREMgPSAoREMgKyByb3VuZCkgPj4gc2hpZnQ7CisgIH0gZWxzZSBpZiAobGVmdCAhPSBOVUxMKSB7ICAgLy8gbGVmdCBidXQgbm8gdG9wCisgICAgZm9yIChqID0gMDsgaiA8IHNpemU7ICsraikgREMgKz0gbGVmdFtqXTsKKyAgICBEQyArPSBEQzsKKyAgICBEQyA9IChEQyArIHJvdW5kKSA+PiBzaGlmdDsKKyAgfSBlbHNlIHsgICAvLyBubyB0b3AsIG5vIGxlZnQsIG5vdGhpbmcuCisgICAgREMgPSAweDgwOworICB9CisgIEZpbGwoZHN0LCBEQywgc2l6ZSk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDaHJvbWEgOHg4IHByZWRpY3Rpb24gKHBhcmFncmFwaCAxMi4yKQorCitzdGF0aWMgdm9pZCBJbnRyYUNocm9tYVByZWRzX0ModWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICAvLyBVIGJsb2NrCisgIERDTW9kZShDOERDOCArIGRzdCwgbGVmdCwgdG9wLCA4LCA4LCA0KTsKKyAgVmVydGljYWxQcmVkKEM4VkU4ICsgZHN0LCB0b3AsIDgpOworICBIb3Jpem9udGFsUHJlZChDOEhFOCArIGRzdCwgbGVmdCwgOCk7CisgIFRydWVNb3Rpb24oQzhUTTggKyBkc3QsIGxlZnQsIHRvcCwgOCk7CisgIC8vIFYgYmxvY2sKKyAgZHN0ICs9IDg7CisgIGlmICh0b3AgIT0gTlVMTCkgdG9wICs9IDg7CisgIGlmIChsZWZ0ICE9IE5VTEwpIGxlZnQgKz0gMTY7CisgIERDTW9kZShDOERDOCArIGRzdCwgbGVmdCwgdG9wLCA4LCA4LCA0KTsKKyAgVmVydGljYWxQcmVkKEM4VkU4ICsgZHN0LCB0b3AsIDgpOworICBIb3Jpem9udGFsUHJlZChDOEhFOCArIGRzdCwgbGVmdCwgOCk7CisgIFRydWVNb3Rpb24oQzhUTTggKyBkc3QsIGxlZnQsIHRvcCwgOCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsdW1hIDE2eDE2IHByZWRpY3Rpb24gKHBhcmFncmFwaCAxMi4zKQorCitzdGF0aWMgdm9pZCBJbnRyYTE2UHJlZHNfQyh1aW50OF90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBsZWZ0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgRENNb2RlKEkxNkRDMTYgKyBkc3QsIGxlZnQsIHRvcCwgMTYsIDE2LCA1KTsKKyAgVmVydGljYWxQcmVkKEkxNlZFMTYgKyBkc3QsIHRvcCwgMTYpOworICBIb3Jpem9udGFsUHJlZChJMTZIRTE2ICsgZHN0LCBsZWZ0LCAxNik7CisgIFRydWVNb3Rpb24oSTE2VE0xNiArIGRzdCwgbGVmdCwgdG9wLCAxNik7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsdW1hIDR4NCBwcmVkaWN0aW9uCisKKyNkZWZpbmUgRFNUKHgsIHkpIGRzdFsoeCkgKyAoeSkgKiBCUFNdCisjZGVmaW5lIEFWRzMoYSwgYiwgYykgKCh1aW50OF90KSgoKGEpICsgMiAqIChiKSArIChjKSArIDIpID4+IDIpKQorI2RlZmluZSBBVkcyKGEsIGIpICgoKGEpICsgKGIpICsgMSkgPj4gMSkKKworc3RhdGljIHZvaWQgVkU0KHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogdG9wKSB7ICAgIC8vIHZlcnRpY2FsCisgIGNvbnN0IHVpbnQ4X3QgdmFsc1s0XSA9IHsKKyAgICBBVkczKHRvcFstMV0sIHRvcFswXSwgdG9wWzFdKSwKKyAgICBBVkczKHRvcFsgMF0sIHRvcFsxXSwgdG9wWzJdKSwKKyAgICBBVkczKHRvcFsgMV0sIHRvcFsyXSwgdG9wWzNdKSwKKyAgICBBVkczKHRvcFsgMl0sIHRvcFszXSwgdG9wWzRdKQorICB9OworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeworICAgIG1lbWNweShkc3QgKyBpICogQlBTLCB2YWxzLCA0KTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBIRTQodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsgICAgLy8gaG9yaXpvbnRhbAorICBjb25zdCBpbnQgWCA9IHRvcFstMV07CisgIGNvbnN0IGludCBJID0gdG9wWy0yXTsKKyAgY29uc3QgaW50IEogPSB0b3BbLTNdOworICBjb25zdCBpbnQgSyA9IHRvcFstNF07CisgIGNvbnN0IGludCBMID0gdG9wWy01XTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDAgKiBCUFMsIDB4MDEwMTAxMDFVICogQVZHMyhYLCBJLCBKKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAxICogQlBTLCAweDAxMDEwMTAxVSAqIEFWRzMoSSwgSiwgSykpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMiAqIEJQUywgMHgwMTAxMDEwMVUgKiBBVkczKEosIEssIEwpKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDMgKiBCUFMsIDB4MDEwMTAxMDFVICogQVZHMyhLLCBMLCBMKSk7Cit9CisKK3N0YXRpYyB2b2lkIERDNCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICB1aW50MzJfdCBkYyA9IDQ7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSBkYyArPSB0b3BbaV0gKyB0b3BbLTUgKyBpXTsKKyAgRmlsbChkc3QsIGRjID4+IDMsIDQpOworfQorCitzdGF0aWMgdm9pZCBSRDQodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgY29uc3QgaW50IFggPSB0b3BbLTFdOworICBjb25zdCBpbnQgSSA9IHRvcFstMl07CisgIGNvbnN0IGludCBKID0gdG9wWy0zXTsKKyAgY29uc3QgaW50IEsgPSB0b3BbLTRdOworICBjb25zdCBpbnQgTCA9IHRvcFstNV07CisgIGNvbnN0IGludCBBID0gdG9wWzBdOworICBjb25zdCBpbnQgQiA9IHRvcFsxXTsKKyAgY29uc3QgaW50IEMgPSB0b3BbMl07CisgIGNvbnN0IGludCBEID0gdG9wWzNdOworICBEU1QoMCwgMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBBVkczKEosIEssIEwpOworICBEU1QoMCwgMikgPSBEU1QoMSwgMykgICAgICAgICAgICAgICAgICAgICAgICAgPSBBVkczKEksIEosIEspOworICBEU1QoMCwgMSkgPSBEU1QoMSwgMikgPSBEU1QoMiwgMykgICAgICAgICAgICAgPSBBVkczKFgsIEksIEopOworICBEU1QoMCwgMCkgPSBEU1QoMSwgMSkgPSBEU1QoMiwgMikgPSBEU1QoMywgMykgPSBBVkczKEEsIFgsIEkpOworICBEU1QoMSwgMCkgPSBEU1QoMiwgMSkgPSBEU1QoMywgMikgICAgICAgICAgICAgPSBBVkczKEIsIEEsIFgpOworICBEU1QoMiwgMCkgPSBEU1QoMywgMSkgICAgICAgICAgICAgICAgICAgICAgICAgPSBBVkczKEMsIEIsIEEpOworICBEU1QoMywgMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBBVkczKEQsIEMsIEIpOworfQorCitzdGF0aWMgdm9pZCBMRDQodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgY29uc3QgaW50IEEgPSB0b3BbMF07CisgIGNvbnN0IGludCBCID0gdG9wWzFdOworICBjb25zdCBpbnQgQyA9IHRvcFsyXTsKKyAgY29uc3QgaW50IEQgPSB0b3BbM107CisgIGNvbnN0IGludCBFID0gdG9wWzRdOworICBjb25zdCBpbnQgRiA9IHRvcFs1XTsKKyAgY29uc3QgaW50IEcgPSB0b3BbNl07CisgIGNvbnN0IGludCBIID0gdG9wWzddOworICBEU1QoMCwgMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBBVkczKEEsIEIsIEMpOworICBEU1QoMSwgMCkgPSBEU1QoMCwgMSkgICAgICAgICAgICAgICAgICAgICAgICAgPSBBVkczKEIsIEMsIEQpOworICBEU1QoMiwgMCkgPSBEU1QoMSwgMSkgPSBEU1QoMCwgMikgICAgICAgICAgICAgPSBBVkczKEMsIEQsIEUpOworICBEU1QoMywgMCkgPSBEU1QoMiwgMSkgPSBEU1QoMSwgMikgPSBEU1QoMCwgMykgPSBBVkczKEQsIEUsIEYpOworICBEU1QoMywgMSkgPSBEU1QoMiwgMikgPSBEU1QoMSwgMykgICAgICAgICAgICAgPSBBVkczKEUsIEYsIEcpOworICBEU1QoMywgMikgPSBEU1QoMiwgMykgICAgICAgICAgICAgICAgICAgICAgICAgPSBBVkczKEYsIEcsIEgpOworICBEU1QoMywgMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBBVkczKEcsIEgsIEgpOworfQorCitzdGF0aWMgdm9pZCBWUjQodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgY29uc3QgaW50IFggPSB0b3BbLTFdOworICBjb25zdCBpbnQgSSA9IHRvcFstMl07CisgIGNvbnN0IGludCBKID0gdG9wWy0zXTsKKyAgY29uc3QgaW50IEsgPSB0b3BbLTRdOworICBjb25zdCBpbnQgQSA9IHRvcFswXTsKKyAgY29uc3QgaW50IEIgPSB0b3BbMV07CisgIGNvbnN0IGludCBDID0gdG9wWzJdOworICBjb25zdCBpbnQgRCA9IHRvcFszXTsKKyAgRFNUKDAsIDApID0gRFNUKDEsIDIpID0gQVZHMihYLCBBKTsKKyAgRFNUKDEsIDApID0gRFNUKDIsIDIpID0gQVZHMihBLCBCKTsKKyAgRFNUKDIsIDApID0gRFNUKDMsIDIpID0gQVZHMihCLCBDKTsKKyAgRFNUKDMsIDApICAgICAgICAgICAgID0gQVZHMihDLCBEKTsKKworICBEU1QoMCwgMykgPSAgICAgICAgICAgICBBVkczKEssIEosIEkpOworICBEU1QoMCwgMikgPSAgICAgICAgICAgICBBVkczKEosIEksIFgpOworICBEU1QoMCwgMSkgPSBEU1QoMSwgMykgPSBBVkczKEksIFgsIEEpOworICBEU1QoMSwgMSkgPSBEU1QoMiwgMykgPSBBVkczKFgsIEEsIEIpOworICBEU1QoMiwgMSkgPSBEU1QoMywgMykgPSBBVkczKEEsIEIsIEMpOworICBEU1QoMywgMSkgPSAgICAgICAgICAgICBBVkczKEIsIEMsIEQpOworfQorCitzdGF0aWMgdm9pZCBWTDQodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgY29uc3QgaW50IEEgPSB0b3BbMF07CisgIGNvbnN0IGludCBCID0gdG9wWzFdOworICBjb25zdCBpbnQgQyA9IHRvcFsyXTsKKyAgY29uc3QgaW50IEQgPSB0b3BbM107CisgIGNvbnN0IGludCBFID0gdG9wWzRdOworICBjb25zdCBpbnQgRiA9IHRvcFs1XTsKKyAgY29uc3QgaW50IEcgPSB0b3BbNl07CisgIGNvbnN0IGludCBIID0gdG9wWzddOworICBEU1QoMCwgMCkgPSAgICAgICAgICAgICBBVkcyKEEsIEIpOworICBEU1QoMSwgMCkgPSBEU1QoMCwgMikgPSBBVkcyKEIsIEMpOworICBEU1QoMiwgMCkgPSBEU1QoMSwgMikgPSBBVkcyKEMsIEQpOworICBEU1QoMywgMCkgPSBEU1QoMiwgMikgPSBBVkcyKEQsIEUpOworCisgIERTVCgwLCAxKSA9ICAgICAgICAgICAgIEFWRzMoQSwgQiwgQyk7CisgIERTVCgxLCAxKSA9IERTVCgwLCAzKSA9IEFWRzMoQiwgQywgRCk7CisgIERTVCgyLCAxKSA9IERTVCgxLCAzKSA9IEFWRzMoQywgRCwgRSk7CisgIERTVCgzLCAxKSA9IERTVCgyLCAzKSA9IEFWRzMoRCwgRSwgRik7CisgICAgICAgICAgICAgIERTVCgzLCAyKSA9IEFWRzMoRSwgRiwgRyk7CisgICAgICAgICAgICAgIERTVCgzLCAzKSA9IEFWRzMoRiwgRywgSCk7Cit9CisKK3N0YXRpYyB2b2lkIEhVNCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBjb25zdCBpbnQgSSA9IHRvcFstMl07CisgIGNvbnN0IGludCBKID0gdG9wWy0zXTsKKyAgY29uc3QgaW50IEsgPSB0b3BbLTRdOworICBjb25zdCBpbnQgTCA9IHRvcFstNV07CisgIERTVCgwLCAwKSA9ICAgICAgICAgICAgIEFWRzIoSSwgSik7CisgIERTVCgyLCAwKSA9IERTVCgwLCAxKSA9IEFWRzIoSiwgSyk7CisgIERTVCgyLCAxKSA9IERTVCgwLCAyKSA9IEFWRzIoSywgTCk7CisgIERTVCgxLCAwKSA9ICAgICAgICAgICAgIEFWRzMoSSwgSiwgSyk7CisgIERTVCgzLCAwKSA9IERTVCgxLCAxKSA9IEFWRzMoSiwgSywgTCk7CisgIERTVCgzLCAxKSA9IERTVCgxLCAyKSA9IEFWRzMoSywgTCwgTCk7CisgIERTVCgzLCAyKSA9IERTVCgyLCAyKSA9CisgIERTVCgwLCAzKSA9IERTVCgxLCAzKSA9IERTVCgyLCAzKSA9IERTVCgzLCAzKSA9IEw7Cit9CisKK3N0YXRpYyB2b2lkIEhENCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBjb25zdCBpbnQgWCA9IHRvcFstMV07CisgIGNvbnN0IGludCBJID0gdG9wWy0yXTsKKyAgY29uc3QgaW50IEogPSB0b3BbLTNdOworICBjb25zdCBpbnQgSyA9IHRvcFstNF07CisgIGNvbnN0IGludCBMID0gdG9wWy01XTsKKyAgY29uc3QgaW50IEEgPSB0b3BbMF07CisgIGNvbnN0IGludCBCID0gdG9wWzFdOworICBjb25zdCBpbnQgQyA9IHRvcFsyXTsKKworICBEU1QoMCwgMCkgPSBEU1QoMiwgMSkgPSBBVkcyKEksIFgpOworICBEU1QoMCwgMSkgPSBEU1QoMiwgMikgPSBBVkcyKEosIEkpOworICBEU1QoMCwgMikgPSBEU1QoMiwgMykgPSBBVkcyKEssIEopOworICBEU1QoMCwgMykgICAgICAgICAgICAgPSBBVkcyKEwsIEspOworCisgIERTVCgzLCAwKSAgICAgICAgICAgICA9IEFWRzMoQSwgQiwgQyk7CisgIERTVCgyLCAwKSAgICAgICAgICAgICA9IEFWRzMoWCwgQSwgQik7CisgIERTVCgxLCAwKSA9IERTVCgzLCAxKSA9IEFWRzMoSSwgWCwgQSk7CisgIERTVCgxLCAxKSA9IERTVCgzLCAyKSA9IEFWRzMoSiwgSSwgWCk7CisgIERTVCgxLCAyKSA9IERTVCgzLCAzKSA9IEFWRzMoSywgSiwgSSk7CisgIERTVCgxLCAzKSAgICAgICAgICAgICA9IEFWRzMoTCwgSywgSik7Cit9CisKK3N0YXRpYyB2b2lkIFRNNCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBpbnQgeCwgeTsKKyAgY29uc3QgdWludDhfdCogY29uc3QgY2xpcCA9IGNsaXAxICsgMjU1IC0gdG9wWy0xXTsKKyAgZm9yICh5ID0gMDsgeSA8IDQ7ICsreSkgeworICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGNsaXBfdGFibGUgPSBjbGlwICsgdG9wWy0yIC0geV07CisgICAgZm9yICh4ID0gMDsgeCA8IDQ7ICsreCkgeworICAgICAgZHN0W3hdID0gY2xpcF90YWJsZVt0b3BbeF1dOworICAgIH0KKyAgICBkc3QgKz0gQlBTOworICB9Cit9CisKKyN1bmRlZiBEU1QKKyN1bmRlZiBBVkczCisjdW5kZWYgQVZHMgorCisvLyBMZWZ0IHNhbXBsZXMgYXJlIHRvcFstNSAuLiAtMl0sIHRvcF9sZWZ0IGlzIHRvcFstMV0sIHRvcCBhcmUKKy8vIGxvY2F0ZWQgYXQgdG9wWzAuLjNdLCBhbmQgdG9wIHJpZ2h0IGlzIHRvcFs0Li43XQorc3RhdGljIHZvaWQgSW50cmE0UHJlZHNfQyh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBEQzQoSTREQzQgKyBkc3QsIHRvcCk7CisgIFRNNChJNFRNNCArIGRzdCwgdG9wKTsKKyAgVkU0KEk0VkU0ICsgZHN0LCB0b3ApOworICBIRTQoSTRIRTQgKyBkc3QsIHRvcCk7CisgIFJENChJNFJENCArIGRzdCwgdG9wKTsKKyAgVlI0KEk0VlI0ICsgZHN0LCB0b3ApOworICBMRDQoSTRMRDQgKyBkc3QsIHRvcCk7CisgIFZMNChJNFZMNCArIGRzdCwgdG9wKTsKKyAgSEQ0KEk0SEQ0ICsgZHN0LCB0b3ApOworICBIVTQoSTRIVTQgKyBkc3QsIHRvcCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNZXRyaWMKKworI2lmICFXRUJQX05FT05fT01JVF9DX0NPREUKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgR2V0U1NFKGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpIHsKKyAgaW50IGNvdW50ID0gMDsKKyAgaW50IHksIHg7CisgIGZvciAoeSA9IDA7IHkgPCBoOyArK3kpIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgdzsgKyt4KSB7CisgICAgICBjb25zdCBpbnQgZGlmZiA9IChpbnQpYVt4XSAtIGJbeF07CisgICAgICBjb3VudCArPSBkaWZmICogZGlmZjsKKyAgICB9CisgICAgYSArPSBCUFM7CisgICAgYiArPSBCUFM7CisgIH0KKyAgcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IFNTRTE2eDE2X0MoY29uc3QgdWludDhfdCogYSwgY29uc3QgdWludDhfdCogYikgeworICByZXR1cm4gR2V0U1NFKGEsIGIsIDE2LCAxNik7Cit9CitzdGF0aWMgaW50IFNTRTE2eDhfQyhjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiBiKSB7CisgIHJldHVybiBHZXRTU0UoYSwgYiwgMTYsIDgpOworfQorc3RhdGljIGludCBTU0U4eDhfQyhjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiBiKSB7CisgIHJldHVybiBHZXRTU0UoYSwgYiwgOCwgOCk7Cit9CitzdGF0aWMgaW50IFNTRTR4NF9DKGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIpIHsKKyAgcmV0dXJuIEdldFNTRShhLCBiLCA0LCA0KTsKK30KKyNlbmRpZiAgLy8gIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorCitzdGF0aWMgdm9pZCBNZWFuMTZ4NF9DKGNvbnN0IHVpbnQ4X3QqIHJlZiwgdWludDMyX3QgZGNbNF0pIHsKKyAgaW50IGssIHgsIHk7CisgIGZvciAoayA9IDA7IGsgPCA0OyArK2spIHsKKyAgICB1aW50MzJfdCBhdmcgPSAwOworICAgIGZvciAoeSA9IDA7IHkgPCA0OyArK3kpIHsKKyAgICAgIGZvciAoeCA9IDA7IHggPCA0OyArK3gpIHsKKyAgICAgICAgYXZnICs9IHJlZlt4ICsgeSAqIEJQU107CisgICAgICB9CisgICAgfQorICAgIGRjW2tdID0gYXZnOworICAgIHJlZiArPSA0OyAgIC8vIGdvIHRvIG5leHQgNHg0IGJsb2NrLgorICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUZXh0dXJlIGRpc3RvcnRpb24KKy8vCisvLyBXZSB0cnkgdG8gbWF0Y2ggdGhlIHNwZWN0cmFsIGNvbnRlbnQgKHdlaWdodGVkKSBiZXR3ZWVuIHNvdXJjZSBhbmQKKy8vIHJlY29uc3RydWN0ZWQgc2FtcGxlcy4KKworI2lmICFXRUJQX05FT05fT01JVF9DX0NPREUKKy8vIEhhZGFtYXJkIHRyYW5zZm9ybQorLy8gUmV0dXJucyB0aGUgd2VpZ2h0ZWQgc3VtIG9mIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMuCisvLyB3W10gY29udGFpbnMgYSByb3ctbWFqb3IgNCBieSA0IHN5bW1ldHJpYyBtYXRyaXguCitzdGF0aWMgaW50IFRUcmFuc2Zvcm0oY29uc3QgdWludDhfdCogaW4sIGNvbnN0IHVpbnQxNl90KiB3KSB7CisgIGludCBzdW0gPSAwOworICBpbnQgdG1wWzE2XTsKKyAgaW50IGk7CisgIC8vIGhvcml6b250YWwgcGFzcworICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpLCBpbiArPSBCUFMpIHsKKyAgICBjb25zdCBpbnQgYTAgPSBpblswXSArIGluWzJdOworICAgIGNvbnN0IGludCBhMSA9IGluWzFdICsgaW5bM107CisgICAgY29uc3QgaW50IGEyID0gaW5bMV0gLSBpblszXTsKKyAgICBjb25zdCBpbnQgYTMgPSBpblswXSAtIGluWzJdOworICAgIHRtcFswICsgaSAqIDRdID0gYTAgKyBhMTsKKyAgICB0bXBbMSArIGkgKiA0XSA9IGEzICsgYTI7CisgICAgdG1wWzIgKyBpICogNF0gPSBhMyAtIGEyOworICAgIHRtcFszICsgaSAqIDRdID0gYTAgLSBhMTsKKyAgfQorICAvLyB2ZXJ0aWNhbCBwYXNzCisgIGZvciAoaSA9IDA7IGkgPCA0OyArK2ksICsrdykgeworICAgIGNvbnN0IGludCBhMCA9IHRtcFswICsgaV0gKyB0bXBbOCArIGldOworICAgIGNvbnN0IGludCBhMSA9IHRtcFs0ICsgaV0gKyB0bXBbMTIrIGldOworICAgIGNvbnN0IGludCBhMiA9IHRtcFs0ICsgaV0gLSB0bXBbMTIrIGldOworICAgIGNvbnN0IGludCBhMyA9IHRtcFswICsgaV0gLSB0bXBbOCArIGldOworICAgIGNvbnN0IGludCBiMCA9IGEwICsgYTE7CisgICAgY29uc3QgaW50IGIxID0gYTMgKyBhMjsKKyAgICBjb25zdCBpbnQgYjIgPSBhMyAtIGEyOworICAgIGNvbnN0IGludCBiMyA9IGEwIC0gYTE7CisKKyAgICBzdW0gKz0gd1sgMF0gKiBhYnMoYjApOworICAgIHN1bSArPSB3WyA0XSAqIGFicyhiMSk7CisgICAgc3VtICs9IHdbIDhdICogYWJzKGIyKTsKKyAgICBzdW0gKz0gd1sxMl0gKiBhYnMoYjMpOworICB9CisgIHJldHVybiBzdW07Cit9CisKK3N0YXRpYyBpbnQgRGlzdG80eDRfQyhjb25zdCB1aW50OF90KiBjb25zdCBhLCBjb25zdCB1aW50OF90KiBjb25zdCBiLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90KiBjb25zdCB3KSB7CisgIGNvbnN0IGludCBzdW0xID0gVFRyYW5zZm9ybShhLCB3KTsKKyAgY29uc3QgaW50IHN1bTIgPSBUVHJhbnNmb3JtKGIsIHcpOworICByZXR1cm4gYWJzKHN1bTIgLSBzdW0xKSA+PiA1OworfQorCitzdGF0aWMgaW50IERpc3RvMTZ4MTZfQyhjb25zdCB1aW50OF90KiBjb25zdCBhLCBjb25zdCB1aW50OF90KiBjb25zdCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QqIGNvbnN0IHcpIHsKKyAgaW50IEQgPSAwOworICBpbnQgeCwgeTsKKyAgZm9yICh5ID0gMDsgeSA8IDE2ICogQlBTOyB5ICs9IDQgKiBCUFMpIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgMTY7IHggKz0gNCkgeworICAgICAgRCArPSBEaXN0bzR4NF9DKGEgKyB4ICsgeSwgYiArIHggKyB5LCB3KTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEQ7Cit9CisjZW5kaWYgIC8vICFXRUJQX05FT05fT01JVF9DX0NPREUKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFF1YW50aXphdGlvbgorLy8KKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga1ppZ3phZ1sxNl0gPSB7CisgIDAsIDEsIDQsIDgsIDUsIDIsIDMsIDYsIDksIDEyLCAxMywgMTAsIDcsIDExLCAxNCwgMTUKK307CisKKy8vIFNpbXBsZSBxdWFudGl6YXRpb24KK3N0YXRpYyBpbnQgUXVhbnRpemVCbG9ja19DKGludDE2X3QgaW5bMTZdLCBpbnQxNl90IG91dFsxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhNYXRyaXgqIGNvbnN0IG10eCkgeworICBpbnQgbGFzdCA9IC0xOworICBpbnQgbjsKKyAgZm9yIChuID0gMDsgbiA8IDE2OyArK24pIHsKKyAgICBjb25zdCBpbnQgaiA9IGtaaWd6YWdbbl07CisgICAgY29uc3QgaW50IHNpZ24gPSAoaW5bal0gPCAwKTsKKyAgICBjb25zdCB1aW50MzJfdCBjb2VmZiA9IChzaWduID8gLWluW2pdIDogaW5bal0pICsgbXR4LT5zaGFycGVuX1tqXTsKKyAgICBpZiAoY29lZmYgPiBtdHgtPnp0aHJlc2hfW2pdKSB7CisgICAgICBjb25zdCB1aW50MzJfdCBRID0gbXR4LT5xX1tqXTsKKyAgICAgIGNvbnN0IHVpbnQzMl90IGlRID0gbXR4LT5pcV9bal07CisgICAgICBjb25zdCB1aW50MzJfdCBCID0gbXR4LT5iaWFzX1tqXTsKKyAgICAgIGludCBsZXZlbCA9IFFVQU5URElWKGNvZWZmLCBpUSwgQik7CisgICAgICBpZiAobGV2ZWwgPiBNQVhfTEVWRUwpIGxldmVsID0gTUFYX0xFVkVMOworICAgICAgaWYgKHNpZ24pIGxldmVsID0gLWxldmVsOworICAgICAgaW5bal0gPSBsZXZlbCAqIChpbnQpUTsKKyAgICAgIG91dFtuXSA9IGxldmVsOworICAgICAgaWYgKGxldmVsKSBsYXN0ID0gbjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0W25dID0gMDsKKyAgICAgIGluW2pdID0gMDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIChsYXN0ID49IDApOworfQorCisjaWYgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERSB8fCBXRUJQX05FT05fV09SS19BUk9VTkRfR0NDCitzdGF0aWMgaW50IFF1YW50aXplMkJsb2Nrc19DKGludDE2X3QgaW5bMzJdLCBpbnQxNl90IG91dFszMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOE1hdHJpeCogY29uc3QgbXR4KSB7CisgIGludCBuejsKKyAgbnogID0gVlA4RW5jUXVhbnRpemVCbG9jayhpbiArIDAgKiAxNiwgb3V0ICsgMCAqIDE2LCBtdHgpIDw8IDA7CisgIG56IHw9IFZQOEVuY1F1YW50aXplQmxvY2soaW4gKyAxICogMTYsIG91dCArIDEgKiAxNiwgbXR4KSA8PCAxOworICByZXR1cm4gbno7Cit9CisjZW5kaWYgIC8vICFXRUJQX05FT05fT01JVF9DX0NPREUgfHwgV0VCUF9ORU9OX1dPUktfQVJPVU5EX0dDQworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQmxvY2sgY29weQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBDb3B5KGNvbnN0IHVpbnQ4X3QqIHNyYywgdWludDhfdCogZHN0LCBpbnQgdywgaW50IGgpIHsKKyAgaW50IHk7CisgIGZvciAoeSA9IDA7IHkgPCBoOyArK3kpIHsKKyAgICBtZW1jcHkoZHN0LCBzcmMsIHcpOworICAgIHNyYyArPSBCUFM7CisgICAgZHN0ICs9IEJQUzsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBDb3B5NHg0X0MoY29uc3QgdWludDhfdCogc3JjLCB1aW50OF90KiBkc3QpIHsKKyAgQ29weShzcmMsIGRzdCwgNCwgNCk7Cit9CisKK3N0YXRpYyB2b2lkIENvcHkxNng4X0MoY29uc3QgdWludDhfdCogc3JjLCB1aW50OF90KiBkc3QpIHsKKyAgQ29weShzcmMsIGRzdCwgMTYsIDgpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW5pdGlhbGl6YXRpb24KKworLy8gU3BlZWQtY3JpdGljYWwgZnVuY3Rpb24gcG9pbnRlcnMuIFdlIGhhdmUgdG8gaW5pdGlhbGl6ZSB0aGVtIHRvIHRoZSBkZWZhdWx0CisvLyBpbXBsZW1lbnRhdGlvbnMgd2l0aGluIFZQOEVuY0RzcEluaXQoKS4KK1ZQOENIaXN0byBWUDhDb2xsZWN0SGlzdG9ncmFtOworVlA4SWRjdCBWUDhJVHJhbnNmb3JtOworVlA4RmRjdCBWUDhGVHJhbnNmb3JtOworVlA4RmRjdCBWUDhGVHJhbnNmb3JtMjsKK1ZQOFdIVCBWUDhGVHJhbnNmb3JtV0hUOworVlA4SW50cmE0UHJlZHMgVlA4RW5jUHJlZEx1bWE0OworVlA4SW50cmFQcmVkcyBWUDhFbmNQcmVkTHVtYTE2OworVlA4SW50cmFQcmVkcyBWUDhFbmNQcmVkQ2hyb21hODsKK1ZQOE1ldHJpYyBWUDhTU0UxNngxNjsKK1ZQOE1ldHJpYyBWUDhTU0U4eDg7CitWUDhNZXRyaWMgVlA4U1NFMTZ4ODsKK1ZQOE1ldHJpYyBWUDhTU0U0eDQ7CitWUDhXTWV0cmljIFZQOFREaXN0bzR4NDsKK1ZQOFdNZXRyaWMgVlA4VERpc3RvMTZ4MTY7CitWUDhNZWFuTWV0cmljIFZQOE1lYW4xNng0OworVlA4UXVhbnRpemVCbG9jayBWUDhFbmNRdWFudGl6ZUJsb2NrOworVlA4UXVhbnRpemUyQmxvY2tzIFZQOEVuY1F1YW50aXplMkJsb2NrczsKK1ZQOFF1YW50aXplQmxvY2tXSFQgVlA4RW5jUXVhbnRpemVCbG9ja1dIVDsKK1ZQOEJsb2NrQ29weSBWUDhDb3B5NHg0OworVlA4QmxvY2tDb3B5IFZQOENvcHkxNng4OworCitleHRlcm4gdm9pZCBWUDhFbmNEc3BJbml0U1NFMih2b2lkKTsKK2V4dGVybiB2b2lkIFZQOEVuY0RzcEluaXRTU0U0MSh2b2lkKTsKK2V4dGVybiB2b2lkIFZQOEVuY0RzcEluaXRBVlgyKHZvaWQpOworZXh0ZXJuIHZvaWQgVlA4RW5jRHNwSW5pdE5FT04odm9pZCk7CitleHRlcm4gdm9pZCBWUDhFbmNEc3BJbml0TUlQUzMyKHZvaWQpOworZXh0ZXJuIHZvaWQgVlA4RW5jRHNwSW5pdE1JUFNkc3BSMih2b2lkKTsKK2V4dGVybiB2b2lkIFZQOEVuY0RzcEluaXRNU0Eodm9pZCk7CisKK1dFQlBfRFNQX0lOSVRfRlVOQyhWUDhFbmNEc3BJbml0KSB7CisgIFZQOERzcEluaXQoKTsgIC8vIGNvbW1vbiBpbnZlcnNlIHRyYW5zZm9ybXMKKyAgSW5pdFRhYmxlcygpOworCisgIC8vIGRlZmF1bHQgQyBpbXBsZW1lbnRhdGlvbnMKKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCisgIFZQOElUcmFuc2Zvcm0gPSBJVHJhbnNmb3JtX0M7CisgIFZQOEZUcmFuc2Zvcm0gPSBGVHJhbnNmb3JtX0M7CisgIFZQOEZUcmFuc2Zvcm1XSFQgPSBGVHJhbnNmb3JtV0hUX0M7CisgIFZQOFREaXN0bzR4NCA9IERpc3RvNHg0X0M7CisgIFZQOFREaXN0bzE2eDE2ID0gRGlzdG8xNngxNl9DOworICBWUDhDb2xsZWN0SGlzdG9ncmFtID0gQ29sbGVjdEhpc3RvZ3JhbV9DOworICBWUDhTU0UxNngxNiA9IFNTRTE2eDE2X0M7CisgIFZQOFNTRTE2eDggPSBTU0UxNng4X0M7CisgIFZQOFNTRTh4OCA9IFNTRTh4OF9DOworICBWUDhTU0U0eDQgPSBTU0U0eDRfQzsKKyNlbmRpZgorCisjaWYgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERSB8fCBXRUJQX05FT05fV09SS19BUk9VTkRfR0NDCisgIFZQOEVuY1F1YW50aXplQmxvY2sgPSBRdWFudGl6ZUJsb2NrX0M7CisgIFZQOEVuY1F1YW50aXplMkJsb2NrcyA9IFF1YW50aXplMkJsb2Nrc19DOworI2VuZGlmCisKKyAgVlA4RlRyYW5zZm9ybTIgPSBGVHJhbnNmb3JtMl9DOworICBWUDhFbmNQcmVkTHVtYTQgPSBJbnRyYTRQcmVkc19DOworICBWUDhFbmNQcmVkTHVtYTE2ID0gSW50cmExNlByZWRzX0M7CisgIFZQOEVuY1ByZWRDaHJvbWE4ID0gSW50cmFDaHJvbWFQcmVkc19DOworICBWUDhNZWFuMTZ4NCA9IE1lYW4xNng0X0M7CisgIFZQOEVuY1F1YW50aXplQmxvY2tXSFQgPSBRdWFudGl6ZUJsb2NrX0M7CisgIFZQOENvcHk0eDQgPSBDb3B5NHg0X0M7CisgIFZQOENvcHkxNng4ID0gQ29weTE2eDhfQzsKKworICAvLyBJZiBkZWZpbmVkLCB1c2UgQ1BVSW5mbygpIHRvIG92ZXJ3cml0ZSBzb21lIHBvaW50ZXJzIHdpdGggZmFzdGVyIHZlcnNpb25zLgorICBpZiAoVlA4R2V0Q1BVSW5mbyAhPSBOVUxMKSB7CisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0UyKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtTU0UyKSkgeworICAgICAgVlA4RW5jRHNwSW5pdFNTRTIoKTsKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTQxKQorICAgICAgaWYgKFZQOEdldENQVUluZm8oa1NTRTRfMSkpIHsKKyAgICAgICAgVlA4RW5jRHNwSW5pdFNTRTQxKCk7CisgICAgICB9CisjZW5kaWYKKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX0FWWDIpCisgICAgaWYgKFZQOEdldENQVUluZm8oa0FWWDIpKSB7CisgICAgICBWUDhFbmNEc3BJbml0QVZYMigpOworICAgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQUzMyKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtNSVBTMzIpKSB7CisgICAgICBWUDhFbmNEc3BJbml0TUlQUzMyKCk7CisgICAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTX0RTUF9SMikKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrTUlQU2RzcFIyKSkgeworICAgICAgVlA4RW5jRHNwSW5pdE1JUFNkc3BSMigpOworICAgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoV0VCUF9VU0VfTVNBKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtNU0EpKSB7CisgICAgICBWUDhFbmNEc3BJbml0TVNBKCk7CisgICAgfQorI2VuZGlmCisgIH0KKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTkVPTikKKyAgaWYgKFdFQlBfTkVPTl9PTUlUX0NfQ09ERSB8fAorICAgICAgKFZQOEdldENQVUluZm8gIT0gTlVMTCAmJiBWUDhHZXRDUFVJbmZvKGtORU9OKSkpIHsKKyAgICBWUDhFbmNEc3BJbml0TkVPTigpOworICB9CisjZW5kaWYKKworICBhc3NlcnQoVlA4SVRyYW5zZm9ybSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOEZUcmFuc2Zvcm0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhGVHJhbnNmb3JtV0hUICE9IE5VTEwpOworICBhc3NlcnQoVlA4VERpc3RvNHg0ICE9IE5VTEwpOworICBhc3NlcnQoVlA4VERpc3RvMTZ4MTYgIT0gTlVMTCk7CisgIGFzc2VydChWUDhDb2xsZWN0SGlzdG9ncmFtICE9IE5VTEwpOworICBhc3NlcnQoVlA4U1NFMTZ4MTYgIT0gTlVMTCk7CisgIGFzc2VydChWUDhTU0UxNng4ICE9IE5VTEwpOworICBhc3NlcnQoVlA4U1NFOHg4ICE9IE5VTEwpOworICBhc3NlcnQoVlA4U1NFNHg0ICE9IE5VTEwpOworICBhc3NlcnQoVlA4RW5jUXVhbnRpemVCbG9jayAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOEVuY1F1YW50aXplMkJsb2NrcyAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOEZUcmFuc2Zvcm0yICE9IE5VTEwpOworICBhc3NlcnQoVlA4RW5jUHJlZEx1bWE0ICE9IE5VTEwpOworICBhc3NlcnQoVlA4RW5jUHJlZEx1bWExNiAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOEVuY1ByZWRDaHJvbWE4ICE9IE5VTEwpOworICBhc3NlcnQoVlA4TWVhbjE2eDQgIT0gTlVMTCk7CisgIGFzc2VydChWUDhFbmNRdWFudGl6ZUJsb2NrV0hUICE9IE5VTEwpOworICBhc3NlcnQoVlA4Q29weTR4NCAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOENvcHkxNng4ICE9IE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9lbmNfYXZ4Mi5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9lbmNfYXZ4Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYzU3OTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2VuY19hdngyLmMKQEAgLTAsMCArMSwyMSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEFWWDIgdmVyc2lvbiBvZiBzcGVlZC1jcml0aWNhbCBlbmNvZGluZyBmdW5jdGlvbnMuCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9BVlgyKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX0FWWDIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK1dFQlBfRFNQX0lOSVRfU1RVQihWUDhFbmNEc3BJbml0QVZYMikKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZW5jX21pcHMzMi5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9lbmNfbWlwczMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE4ZjBmYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZW5jX21pcHMzMi5jCkBAIC0wLDAgKzEsNjc3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gTUlQUyB2ZXJzaW9uIG9mIHNwZWVkLWNyaXRpY2FsIGVuY29kaW5nIGZ1bmN0aW9ucy4KKy8vCisvLyBBdXRob3Iocyk6IERqb3JkamUgUGVzdXQgICAgKGRqb3JkamUucGVzdXRAaW1ndGVjLmNvbSkKKy8vICAgICAgICAgICAgSm92YW4gWmVsaW5jZXZpYyAoam92YW4uemVsaW5jZXZpY0BpbWd0ZWMuY29tKQorLy8gICAgICAgICAgICBTbG9ib2RhbiBQcmlqaWMgIChzbG9ib2Rhbi5wcmlqaWNAaW1ndGVjLmNvbSkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFMzMikKKworI2luY2x1ZGUgInNyYy9kc3AvbWlwc19tYWNyby5oIgorI2luY2x1ZGUgInNyYy9lbmMvdnA4aV9lbmMuaCIKKyNpbmNsdWRlICJzcmMvZW5jL2Nvc3RfZW5jLmgiCisKK3N0YXRpYyBjb25zdCBpbnQga0MxID0gMjAwOTEgKyAoMSA8PCAxNik7CitzdGF0aWMgY29uc3QgaW50IGtDMiA9IDM1NDY4OworCisvLyBtYWNybyBmb3Igb25lIHZlcnRpY2FsIHBhc3MgaW4gSVRyYW5zZm9ybU9uZQorLy8gTVVMIG1hY3JvIGlubGluZWQKKy8vIHRlbXAwLi50ZW1wMTUgaG9sZHMgdG1wWzBdLi50bXBbMTVdCisvLyBBLi5EIC0gb2Zmc2V0cyBpbiBieXRlcyB0byBsb2FkIGZyb20gaW4gYnVmZmVyCisvLyBURU1QMC4uVEVNUDMgLSByZWdpc3RlcnMgZm9yIGNvcnJlc3BvbmRpbmcgdG1wIGVsZW1lbnRzCisvLyBURU1QNC4uVEVNUDUgLSB0ZW1wb3JhcnkgcmVnaXN0ZXJzCisjZGVmaW5lIFZFUlRJQ0FMX1BBU1MoQSwgQiwgQywgRCwgVEVNUDQsIFRFTVAwLCBURU1QMSwgVEVNUDIsIFRFTVAzKSAgICAgICAgXAorICAibGggICAgICAlW3RlbXAxNl0sICAgICAgIiAjQSAiKCVbdGVtcDIwXSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgImxoICAgICAgJVt0ZW1wMThdLCAgICAgICIgI0IgIiglW3RlbXAyMF0pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJsaCAgICAgICVbdGVtcDE3XSwgICAgICAiICNDICIoJVt0ZW1wMjBdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibGggICAgICAlW3RlbXAxOV0sICAgICAgIiAjRCAiKCVbdGVtcDIwXSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgImFkZHUgICAgJVsiICNURU1QNCAiXSwgICAgJVt0ZW1wMTZdLCAgICAgICVbdGVtcDE4XSAgICAgICBcblx0IiAgICAgICAgICBcCisgICJzdWJ1ICAgICVbdGVtcDE2XSwgICAgICAlW3RlbXAxNl0sICAgICAgJVt0ZW1wMThdICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibXVsICAgICAlWyIgI1RFTVAwICJdLCAgICAlW3RlbXAxN10sICAgICAgJVtrQzJdICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgIm11bCAgICAgJVt0ZW1wMThdLCAgICAgICVbdGVtcDE5XSwgICAgICAlW2tDMV0gICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJtdWwgICAgICVbdGVtcDE3XSwgICAgICAlW3RlbXAxN10sICAgICAgJVtrQzFdICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibXVsICAgICAlW3RlbXAxOV0sICAgICAgJVt0ZW1wMTldLCAgICAgICVba0MyXSAgICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgInNyYSAgICAgJVsiICNURU1QMCAiXSwgICAgJVsiICNURU1QMCAiXSwgICAgMTYgICAgICAgICAgICBcblxuIiAgICAgICAgICBcCisgICJzcmEgICAgICVbdGVtcDE4XSwgICAgICAlW3RlbXAxOF0sICAgICAgMTYgICAgICAgICAgICAgICAgXG5cbiIgICAgICAgICAgXAorICAic3JhICAgICAlW3RlbXAxN10sICAgICAgJVt0ZW1wMTddLCAgICAgIDE2ICAgICAgICAgICAgICAgIFxuXG4iICAgICAgICAgIFwKKyAgInNyYSAgICAgJVt0ZW1wMTldLCAgICAgICVbdGVtcDE5XSwgICAgICAxNiAgICAgICAgICAgICAgICBcblxuIiAgICAgICAgICBcCisgICJzdWJ1ICAgICVbIiAjVEVNUDIgIl0sICAgICVbIiAjVEVNUDAgIl0sICAgICVbdGVtcDE4XSAgICAgXG5cdCIgICAgICAgICAgXAorICAiYWRkdSAgICAlWyIgI1RFTVAzICJdLCAgICAlW3RlbXAxN10sICAgICAgJVt0ZW1wMTldICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgImFkZHUgICAgJVsiICNURU1QMCAiXSwgICAgJVsiICNURU1QNCAiXSwgICAgJVsiICNURU1QMyAiXSBcblx0IiAgICAgICAgICBcCisgICJhZGR1ICAgICVbIiAjVEVNUDEgIl0sICAgICVbdGVtcDE2XSwgICAgICAlWyIgI1RFTVAyICJdICAgXG5cdCIgICAgICAgICAgXAorICAic3VidSAgICAlWyIgI1RFTVAyICJdLCAgICAlW3RlbXAxNl0sICAgICAgJVsiICNURU1QMiAiXSAgIFxuXHQiICAgICAgICAgIFwKKyAgInN1YnUgICAgJVsiICNURU1QMyAiXSwgICAgJVsiICNURU1QNCAiXSwgICAgJVsiICNURU1QMyAiXSBcblx0IgorCisvLyBtYWNybyBmb3Igb25lIGhvcml6b250YWwgcGFzcyBpbiBJVHJhbnNmb3JtT25lCisvLyBNVUwgYW5kIFNUT1JFIG1hY3JvcyBpbmxpbmVkCisvLyBhID0gY2xpcF84YihhKSBpcyByZXBsYWNlZCB3aXRoOiBhID0gbWF4KGEsIDApOyBhID0gbWluKGEsIDI1NSkKKy8vIHRlbXAwLi50ZW1wMTUgaG9sZHMgdG1wWzBdLi50bXBbMTVdCisvLyBBIC0gb2Zmc2V0IGluIGJ5dGVzIHRvIGxvYWQgZnJvbSByZWYgYW5kIHN0b3JlIHRvIGRzdCBidWZmZXIKKy8vIFRFTVAwLCBURU1QNCwgVEVNUDggYW5kIFRFTVAxMiAtIHJlZ2lzdGVycyBmb3IgY29ycmVzcG9uZGluZyB0bXAgZWxlbWVudHMKKyNkZWZpbmUgSE9SSVpPTlRBTF9QQVNTKEEsIFRFTVAwLCBURU1QNCwgVEVNUDgsIFRFTVAxMikgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgImFkZGl1ICAgJVsiICNURU1QMCAiXSwgICAgJVsiICNURU1QMCAiXSwgICAgNCAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgImFkZHUgICAgJVt0ZW1wMTZdLCAgICAgICVbIiAjVEVNUDAgIl0sICAgICVbIiAjVEVNUDggIl0gICAgIFxuXHQiICAgICAgICAgIFwKKyAgInN1YnUgICAgJVt0ZW1wMTddLCAgICAgICVbIiAjVEVNUDAgIl0sICAgICVbIiAjVEVNUDggIl0gICAgIFxuXHQiICAgICAgICAgIFwKKyAgIm11bCAgICAgJVsiICNURU1QMCAiXSwgICAgJVsiICNURU1QNCAiXSwgICAgJVtrQzJdICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgIm11bCAgICAgJVsiICNURU1QOCAiXSwgICAgJVsiICNURU1QMTIgIl0sICAgJVtrQzFdICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgIm11bCAgICAgJVsiICNURU1QNCAiXSwgICAgJVsiICNURU1QNCAiXSwgICAgJVtrQzFdICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgIm11bCAgICAgJVsiICNURU1QMTIgIl0sICAgJVsiICNURU1QMTIgIl0sICAgJVtrQzJdICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgInNyYSAgICAgJVsiICNURU1QMCAiXSwgICAgJVsiICNURU1QMCAiXSwgICAgMTYgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgInNyYSAgICAgJVsiICNURU1QOCAiXSwgICAgJVsiICNURU1QOCAiXSwgICAgMTYgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgInNyYSAgICAgJVsiICNURU1QNCAiXSwgICAgJVsiICNURU1QNCAiXSwgICAgMTYgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgInNyYSAgICAgJVsiICNURU1QMTIgIl0sICAgJVsiICNURU1QMTIgIl0sICAgMTYgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgInN1YnUgICAgJVt0ZW1wMThdLCAgICAgICVbIiAjVEVNUDAgIl0sICAgICVbIiAjVEVNUDggIl0gICAgIFxuXHQiICAgICAgICAgIFwKKyAgImFkZHUgICAgJVt0ZW1wMTldLCAgICAgICVbIiAjVEVNUDQgIl0sICAgICVbIiAjVEVNUDEyICJdICAgIFxuXHQiICAgICAgICAgIFwKKyAgImFkZHUgICAgJVsiICNURU1QMCAiXSwgICAgJVt0ZW1wMTZdLCAgICAgICVbdGVtcDE5XSAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgImFkZHUgICAgJVsiICNURU1QNCAiXSwgICAgJVt0ZW1wMTddLCAgICAgICVbdGVtcDE4XSAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgInN1YnUgICAgJVsiICNURU1QOCAiXSwgICAgJVt0ZW1wMTddLCAgICAgICVbdGVtcDE4XSAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgInN1YnUgICAgJVsiICNURU1QMTIgIl0sICAgJVt0ZW1wMTZdLCAgICAgICVbdGVtcDE5XSAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgImx3ICAgICAgJVt0ZW1wMjBdLCAgICAgIDAoJVthcmdzXSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgInNyYSAgICAgJVsiICNURU1QMCAiXSwgICAgJVsiICNURU1QMCAiXSwgICAgMyAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgInNyYSAgICAgJVsiICNURU1QNCAiXSwgICAgJVsiICNURU1QNCAiXSwgICAgMyAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgInNyYSAgICAgJVsiICNURU1QOCAiXSwgICAgJVsiICNURU1QOCAiXSwgICAgMyAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgInNyYSAgICAgJVsiICNURU1QMTIgIl0sICAgJVsiICNURU1QMTIgIl0sICAgMyAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgImxidSAgICAgJVt0ZW1wMTZdLCAgICAgIDArIiBYU1RSKEJQUykgIioiICNBICIoJVt0ZW1wMjBdKSAgIFxuXHQiICAgICAgICAgIFwKKyAgImxidSAgICAgJVt0ZW1wMTddLCAgICAgIDErIiBYU1RSKEJQUykgIioiICNBICIoJVt0ZW1wMjBdKSAgIFxuXHQiICAgICAgICAgIFwKKyAgImxidSAgICAgJVt0ZW1wMThdLCAgICAgIDIrIiBYU1RSKEJQUykgIioiICNBICIoJVt0ZW1wMjBdKSAgIFxuXHQiICAgICAgICAgIFwKKyAgImxidSAgICAgJVt0ZW1wMTldLCAgICAgIDMrIiBYU1RSKEJQUykgIioiICNBICIoJVt0ZW1wMjBdKSAgIFxuXHQiICAgICAgICAgIFwKKyAgImFkZHUgICAgJVsiICNURU1QMCAiXSwgICAgJVt0ZW1wMTZdLCAgICAgICVbIiAjVEVNUDAgIl0gICAgIFxuXHQiICAgICAgICAgIFwKKyAgImFkZHUgICAgJVsiICNURU1QNCAiXSwgICAgJVt0ZW1wMTddLCAgICAgICVbIiAjVEVNUDQgIl0gICAgIFxuXHQiICAgICAgICAgIFwKKyAgImFkZHUgICAgJVsiICNURU1QOCAiXSwgICAgJVt0ZW1wMThdLCAgICAgICVbIiAjVEVNUDggIl0gICAgIFxuXHQiICAgICAgICAgIFwKKyAgImFkZHUgICAgJVsiICNURU1QMTIgIl0sICAgJVt0ZW1wMTldLCAgICAgICVbIiAjVEVNUDEyICJdICAgIFxuXHQiICAgICAgICAgIFwKKyAgInNsdCAgICAgJVt0ZW1wMTZdLCAgICAgICVbIiAjVEVNUDAgIl0sICAgICR6ZXJvICAgICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgInNsdCAgICAgJVt0ZW1wMTddLCAgICAgICVbIiAjVEVNUDQgIl0sICAgICR6ZXJvICAgICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgInNsdCAgICAgJVt0ZW1wMThdLCAgICAgICVbIiAjVEVNUDggIl0sICAgICR6ZXJvICAgICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgInNsdCAgICAgJVt0ZW1wMTldLCAgICAgICVbIiAjVEVNUDEyICJdLCAgICR6ZXJvICAgICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgIm1vdm4gICAgJVsiICNURU1QMCAiXSwgICAgJHplcm8sICAgICAgICAgICVbdGVtcDE2XSAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgIm1vdm4gICAgJVsiICNURU1QNCAiXSwgICAgJHplcm8sICAgICAgICAgICVbdGVtcDE3XSAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgIm1vdm4gICAgJVsiICNURU1QOCAiXSwgICAgJHplcm8sICAgICAgICAgICVbdGVtcDE4XSAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgIm1vdm4gICAgJVsiICNURU1QMTIgIl0sICAgJHplcm8sICAgICAgICAgICVbdGVtcDE5XSAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgImFkZGl1ICAgJVt0ZW1wMjBdLCAgICAgICR6ZXJvLCAgICAgICAgICAyNTUgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgInNsdCAgICAgJVt0ZW1wMTZdLCAgICAgICVbIiAjVEVNUDAgIl0sICAgICVbdGVtcDIwXSAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgInNsdCAgICAgJVt0ZW1wMTddLCAgICAgICVbIiAjVEVNUDQgIl0sICAgICVbdGVtcDIwXSAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgInNsdCAgICAgJVt0ZW1wMThdLCAgICAgICVbIiAjVEVNUDggIl0sICAgICVbdGVtcDIwXSAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgInNsdCAgICAgJVt0ZW1wMTldLCAgICAgICVbIiAjVEVNUDEyICJdLCAgICVbdGVtcDIwXSAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgIm1vdnogICAgJVsiICNURU1QMCAiXSwgICAgJVt0ZW1wMjBdLCAgICAgICVbdGVtcDE2XSAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgIm1vdnogICAgJVsiICNURU1QNCAiXSwgICAgJVt0ZW1wMjBdLCAgICAgICVbdGVtcDE3XSAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgImx3ICAgICAgJVt0ZW1wMTZdLCAgICAgIDgoJVthcmdzXSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgIm1vdnogICAgJVsiICNURU1QOCAiXSwgICAgJVt0ZW1wMjBdLCAgICAgICVbdGVtcDE4XSAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgIm1vdnogICAgJVsiICNURU1QMTIgIl0sICAgJVt0ZW1wMjBdLCAgICAgICVbdGVtcDE5XSAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgInNiICAgICAgJVsiICNURU1QMCAiXSwgICAgMCsiIFhTVFIoQlBTKSAiKiIgI0EgIiglW3RlbXAxNl0pIFxuXHQiICAgICAgICAgIFwKKyAgInNiICAgICAgJVsiICNURU1QNCAiXSwgICAgMSsiIFhTVFIoQlBTKSAiKiIgI0EgIiglW3RlbXAxNl0pIFxuXHQiICAgICAgICAgIFwKKyAgInNiICAgICAgJVsiICNURU1QOCAiXSwgICAgMisiIFhTVFIoQlBTKSAiKiIgI0EgIiglW3RlbXAxNl0pIFxuXHQiICAgICAgICAgIFwKKyAgInNiICAgICAgJVsiICNURU1QMTIgIl0sICAgMysiIFhTVFIoQlBTKSAiKiIgI0EgIiglW3RlbXAxNl0pIFxuXHQiCisKKy8vIERvZXMgb25lIG9yIHR3byBpbnZlcnNlIHRyYW5zZm9ybXMuCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBJVHJhbnNmb3JtT25lX01JUFMzMihjb25zdCB1aW50OF90KiByZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90KiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCkgeworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDY7CisgIGludCB0ZW1wNywgdGVtcDgsIHRlbXA5LCB0ZW1wMTAsIHRlbXAxMSwgdGVtcDEyLCB0ZW1wMTM7CisgIGludCB0ZW1wMTQsIHRlbXAxNSwgdGVtcDE2LCB0ZW1wMTcsIHRlbXAxOCwgdGVtcDE5LCB0ZW1wMjA7CisgIGNvbnN0IGludCogYXJnc1szXSA9IHsoY29uc3QgaW50KilyZWYsIChjb25zdCBpbnQqKWluLCAoY29uc3QgaW50Kilkc3R9OworCisgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgImx3ICAgICAgJVt0ZW1wMjBdLCAgICAgIDQoJVthcmdzXSkgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICBWRVJUSUNBTF9QQVNTKDAsIDE2LCAgOCwgMjQsIHRlbXA0LCAgdGVtcDAsICB0ZW1wMSwgIHRlbXAyLCAgdGVtcDMpCisgICAgVkVSVElDQUxfUEFTUygyLCAxOCwgMTAsIDI2LCB0ZW1wOCwgIHRlbXA0LCAgdGVtcDUsICB0ZW1wNiwgIHRlbXA3KQorICAgIFZFUlRJQ0FMX1BBU1MoNCwgMjAsIDEyLCAyOCwgdGVtcDEyLCB0ZW1wOCwgIHRlbXA5LCAgdGVtcDEwLCB0ZW1wMTEpCisgICAgVkVSVElDQUxfUEFTUyg2LCAyMiwgMTQsIDMwLCB0ZW1wMjAsIHRlbXAxMiwgdGVtcDEzLCB0ZW1wMTQsIHRlbXAxNSkKKworICAgIEhPUklaT05UQUxfUEFTUygwLCB0ZW1wMCwgdGVtcDQsIHRlbXA4LCAgdGVtcDEyKQorICAgIEhPUklaT05UQUxfUEFTUygxLCB0ZW1wMSwgdGVtcDUsIHRlbXA5LCAgdGVtcDEzKQorICAgIEhPUklaT05UQUxfUEFTUygyLCB0ZW1wMiwgdGVtcDYsIHRlbXAxMCwgdGVtcDE0KQorICAgIEhPUklaT05UQUxfUEFTUygzLCB0ZW1wMywgdGVtcDcsIHRlbXAxMSwgdGVtcDE1KQorCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgIFt0ZW1wNl0iPSZyIih0ZW1wNiksIFt0ZW1wN10iPSZyIih0ZW1wNyksIFt0ZW1wOF0iPSZyIih0ZW1wOCksCisgICAgICBbdGVtcDldIj0mciIodGVtcDkpLCBbdGVtcDEwXSI9JnIiKHRlbXAxMCksIFt0ZW1wMTFdIj0mciIodGVtcDExKSwKKyAgICAgIFt0ZW1wMTJdIj0mciIodGVtcDEyKSwgW3RlbXAxM10iPSZyIih0ZW1wMTMpLCBbdGVtcDE0XSI9JnIiKHRlbXAxNCksCisgICAgICBbdGVtcDE1XSI9JnIiKHRlbXAxNSksIFt0ZW1wMTZdIj0mciIodGVtcDE2KSwgW3RlbXAxN10iPSZyIih0ZW1wMTcpLAorICAgICAgW3RlbXAxOF0iPSZyIih0ZW1wMTgpLCBbdGVtcDE5XSI9JnIiKHRlbXAxOSksIFt0ZW1wMjBdIj0mciIodGVtcDIwKQorICAgIDogW2FyZ3NdInIiKGFyZ3MpLCBba0MxXSJyIihrQzEpLCBba0MyXSJyIihrQzIpCisgICAgOiAibWVtb3J5IiwgImhpIiwgImxvIgorICApOworfQorCitzdGF0aWMgdm9pZCBJVHJhbnNmb3JtX01JUFMzMihjb25zdCB1aW50OF90KiByZWYsIGNvbnN0IGludDE2X3QqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgZG9fdHdvKSB7CisgIElUcmFuc2Zvcm1PbmVfTUlQUzMyKHJlZiwgaW4sIGRzdCk7CisgIGlmIChkb190d28pIHsKKyAgICBJVHJhbnNmb3JtT25lX01JUFMzMihyZWYgKyA0LCBpbiArIDE2LCBkc3QgKyA0KTsKKyAgfQorfQorCisjdW5kZWYgVkVSVElDQUxfUEFTUworI3VuZGVmIEhPUklaT05UQUxfUEFTUworCisvLyBtYWNybyBmb3Igb25lIHBhc3MgdGhyb3VnaCBmb3IgbG9vcCBpbiBRdWFudGl6ZUJsb2NrCisvLyBRVUFOVERJViBtYWNybyBpbmxpbmVkCisvLyBKIC0gb2Zmc2V0IGluIGJ5dGVzIChrWmlnemFnW25dICogMikKKy8vIEsgLSBvZmZzZXQgaW4gYnl0ZXMgKGtaaWd6YWdbbl0gKiA0KQorLy8gTiAtIG9mZnNldCBpbiBieXRlcyAobiAqIDIpCisjZGVmaW5lIFFVQU5USVpFX09ORShKLCBLLCBOKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAibGggICAgICAgICAgICVbdGVtcDBdLCAgICAgICAiICNKICIoJVtwcGluXSkgICAgICAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgImxodSAgICAgICAgICAlW3RlbXAxXSwgICAgICAgIiAjSiAiKCVbcHBzaGFycGVuXSkgICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICJsdyAgICAgICAgICAgJVt0ZW1wMl0sICAgICAgICIgI0sgIiglW3BwenRocmVzaF0pICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAic3JhICAgICAgICAgICVbc2lnbl0sICAgICAgICAlW3RlbXAwXSwgICAgICAgICAgIDE1ICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgInhvciAgICAgICAgICAlW2NvZWZmXSwgICAgICAgJVt0ZW1wMF0sICAgICAgICAgICAlW3NpZ25dICAgICAgICAgXG5cdCIgICBcCisgICJzdWJ1ICAgICAgICAgJVtjb2VmZl0sICAgICAgICVbY29lZmZdLCAgICAgICAgICAgJVtzaWduXSAgICAgICAgIFxuXHQiICAgXAorICAiYWRkdSAgICAgICAgICVbY29lZmZdLCAgICAgICAlW2NvZWZmXSwgICAgICAgICAgICVbdGVtcDFdICAgICAgICBcblx0IiAgIFwKKyAgInNsdCAgICAgICAgICAlW3RlbXA0XSwgICAgICAgJVt0ZW1wMl0sICAgICAgICAgICAlW2NvZWZmXSAgICAgICAgXG5cdCIgICBcCisgICJhZGRpdSAgICAgICAgJVt0ZW1wNV0sICAgICAgICR6ZXJvLCAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAiYWRkaXUgICAgICAgICVbbGV2ZWxdLCAgICAgICAkemVybywgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgImJlcXogICAgICAgICAlW3RlbXA0XSwgICAgICAgMmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICJsaHUgICAgICAgICAgJVt0ZW1wMV0sICAgICAgICIgI0ogIiglW3BwaXFdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAibHcgICAgICAgICAgICVbdGVtcDJdLCAgICAgICAiICNLICIoJVtwcGJpYXNdKSAgICAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgImxodSAgICAgICAgICAlW3RlbXAzXSwgICAgICAgIiAjSiAiKCVbcHBxXSkgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICJtdWwgICAgICAgICAgJVtsZXZlbF0sICAgICAgICVbY29lZmZdLCAgICAgICAgICAgJVt0ZW1wMV0gICAgICAgIFxuXHQiICAgXAorICAiYWRkdSAgICAgICAgICVbbGV2ZWxdLCAgICAgICAlW2xldmVsXSwgICAgICAgICAgICVbdGVtcDJdICAgICAgICBcblx0IiAgIFwKKyAgInNyYSAgICAgICAgICAlW2xldmVsXSwgICAgICAgJVtsZXZlbF0sICAgICAgICAgICAxNyAgICAgICAgICAgICAgXG5cdCIgICBcCisgICJzbHQgICAgICAgICAgJVt0ZW1wNF0sICAgICAgICVbbWF4X2xldmVsXSwgICAgICAgJVtsZXZlbF0gICAgICAgIFxuXHQiICAgXAorICAibW92biAgICAgICAgICVbbGV2ZWxdLCAgICAgICAlW21heF9sZXZlbF0sICAgICAgICVbdGVtcDRdICAgICAgICBcblx0IiAgIFwKKyAgInhvciAgICAgICAgICAlW2xldmVsXSwgICAgICAgJVtsZXZlbF0sICAgICAgICAgICAlW3NpZ25dICAgICAgICAgXG5cdCIgICBcCisgICJzdWJ1ICAgICAgICAgJVtsZXZlbF0sICAgICAgICVbbGV2ZWxdLCAgICAgICAgICAgJVtzaWduXSAgICAgICAgIFxuXHQiICAgXAorICAibXVsICAgICAgICAgICVbdGVtcDVdLCAgICAgICAlW2xldmVsXSwgICAgICAgICAgICVbdGVtcDNdICAgICAgICBcblx0IiAgIFwKKyIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICJzaCAgICAgICAgICAgJVt0ZW1wNV0sICAgICAgICIgI0ogIiglW3BwaW5dKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAic2ggICAgICAgICAgICVbbGV2ZWxdLCAgICAgICAiICNOICIoJVtwb3V0XSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorCitzdGF0aWMgaW50IFF1YW50aXplQmxvY2tfTUlQUzMyKGludDE2X3QgaW5bMTZdLCBpbnQxNl90IG91dFsxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOE1hdHJpeCogY29uc3QgbXR4KSB7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1OworICBpbnQgc2lnbiwgY29lZmYsIGxldmVsLCBpOworICBpbnQgbWF4X2xldmVsID0gTUFYX0xFVkVMOworCisgIGludDE2X3QqIHBwaW4gICAgICAgICAgICAgPSAmaW5bMF07CisgIGludDE2X3QqIHBvdXQgICAgICAgICAgICAgPSAmb3V0WzBdOworICBjb25zdCB1aW50MTZfdCogcHBzaGFycGVuID0gJm10eC0+c2hhcnBlbl9bMF07CisgIGNvbnN0IHVpbnQzMl90KiBwcHp0aHJlc2ggPSAmbXR4LT56dGhyZXNoX1swXTsKKyAgY29uc3QgdWludDE2X3QqIHBwcSAgICAgICA9ICZtdHgtPnFfWzBdOworICBjb25zdCB1aW50MTZfdCogcHBpcSAgICAgID0gJm10eC0+aXFfWzBdOworICBjb25zdCB1aW50MzJfdCogcHBiaWFzICAgID0gJm10eC0+Ymlhc19bMF07CisKKyAgX19hc21fXyB2b2xhdGlsZSgKKyAgICBRVUFOVElaRV9PTkUoIDAsICAwLCAgMCkKKyAgICBRVUFOVElaRV9PTkUoIDIsICA0LCAgMikKKyAgICBRVUFOVElaRV9PTkUoIDgsIDE2LCAgNCkKKyAgICBRVUFOVElaRV9PTkUoMTYsIDMyLCAgNikKKyAgICBRVUFOVElaRV9PTkUoMTAsIDIwLCAgOCkKKyAgICBRVUFOVElaRV9PTkUoIDQsICA4LCAxMCkKKyAgICBRVUFOVElaRV9PTkUoIDYsIDEyLCAxMikKKyAgICBRVUFOVElaRV9PTkUoMTIsIDI0LCAxNCkKKyAgICBRVUFOVElaRV9PTkUoMTgsIDM2LCAxNikKKyAgICBRVUFOVElaRV9PTkUoMjQsIDQ4LCAxOCkKKyAgICBRVUFOVElaRV9PTkUoMjYsIDUyLCAyMCkKKyAgICBRVUFOVElaRV9PTkUoMjAsIDQwLCAyMikKKyAgICBRVUFOVElaRV9PTkUoMTQsIDI4LCAyNCkKKyAgICBRVUFOVElaRV9PTkUoMjIsIDQ0LCAyNikKKyAgICBRVUFOVElaRV9PTkUoMjgsIDU2LCAyOCkKKyAgICBRVUFOVElaRV9PTkUoMzAsIDYwLCAzMCkKKworICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwKKyAgICAgIFt0ZW1wMl0iPSZyIih0ZW1wMiksIFt0ZW1wM10iPSZyIih0ZW1wMyksCisgICAgICBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLAorICAgICAgW3NpZ25dIj0mciIoc2lnbiksIFtjb2VmZl0iPSZyIihjb2VmZiksCisgICAgICBbbGV2ZWxdIj0mciIobGV2ZWwpCisgICAgOiBbcG91dF0iciIocG91dCksIFtwcGluXSJyIihwcGluKSwKKyAgICAgIFtwcGlxXSJyIihwcGlxKSwgW21heF9sZXZlbF0iciIobWF4X2xldmVsKSwKKyAgICAgIFtwcGJpYXNdInIiKHBwYmlhcyksIFtwcHp0aHJlc2hdInIiKHBwenRocmVzaCksCisgICAgICBbcHBzaGFycGVuXSJyIihwcHNoYXJwZW4pLCBbcHBxXSJyIihwcHEpCisgICAgOiAibWVtb3J5IiwgImhpIiwgImxvIgorICApOworCisgIC8vIG1vdmVkIG91dCBmcm9tIG1hY3JvIHRvIGluY3JlYXNlIHBvc3NpYmlsaXR5IGZvciBlYXJsaWVyIGJyZWFraW5nCisgIGZvciAoaSA9IDE1OyBpID49IDA7IGktLSkgeworICAgIGlmIChvdXRbaV0pIHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IFF1YW50aXplMkJsb2Nrc19NSVBTMzIoaW50MTZfdCBpblszMl0sIGludDE2X3Qgb3V0WzMyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhNYXRyaXgqIGNvbnN0IG10eCkgeworICBpbnQgbno7CisgIG56ICA9IFF1YW50aXplQmxvY2tfTUlQUzMyKGluICsgMCAqIDE2LCBvdXQgKyAwICogMTYsIG10eCkgPDwgMDsKKyAgbnogfD0gUXVhbnRpemVCbG9ja19NSVBTMzIoaW4gKyAxICogMTYsIG91dCArIDEgKiAxNiwgbXR4KSA8PCAxOworICByZXR1cm4gbno7Cit9CisKKyN1bmRlZiBRVUFOVElaRV9PTkUKKworLy8gbWFjcm8gZm9yIG9uZSBob3Jpem9udGFsIHBhc3MgaW4gRGlzdG80eDQgKFRUcmFuc2Zvcm0pCisvLyB0d28gY2FsbHMgb2YgZnVuY3Rpb24gVFRyYW5zZm9ybSBhcmUgbWVyZ2VkIGludG8gc2luZ2xlIG9uZQorLy8gQSAtIG9mZnNldCBpbiBieXRlcyB0byBsb2FkIGZyb20gYSBhbmQgYiBidWZmZXJzCisvLyBFLi5IIC0gb2Zmc2V0cyBpbiBieXRlcyB0byBzdG9yZSBmaXJzdCByZXN1bHRzIHRvIHRtcCBidWZmZXIKKy8vIEUxLi5IMSAtIG9mZnNldHMgaW4gYnl0ZXMgdG8gc3RvcmUgc2Vjb25kIHJlc3VsdHMgdG8gdG1wIGJ1ZmZlcgorI2RlZmluZSBIT1JJWk9OVEFMX1BBU1MoQSwgRSwgRiwgRywgSCwgRTEsIEYxLCBHMSwgSDEpICAgICAgICAgICAgICAgICAgXAorICAibGJ1ICAgICVbdGVtcDBdLCAgMCsiIFhTVFIoQlBTKSAiKiIgI0EgIiglW2FdKSAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAibGJ1ICAgICVbdGVtcDFdLCAgMSsiIFhTVFIoQlBTKSAiKiIgI0EgIiglW2FdKSAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAibGJ1ICAgICVbdGVtcDJdLCAgMisiIFhTVFIoQlBTKSAiKiIgI0EgIiglW2FdKSAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAibGJ1ICAgICVbdGVtcDNdLCAgMysiIFhTVFIoQlBTKSAiKiIgI0EgIiglW2FdKSAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAibGJ1ICAgICVbdGVtcDRdLCAgMCsiIFhTVFIoQlBTKSAiKiIgI0EgIiglW2JdKSAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAibGJ1ICAgICVbdGVtcDVdLCAgMSsiIFhTVFIoQlBTKSAiKiIgI0EgIiglW2JdKSAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAibGJ1ICAgICVbdGVtcDZdLCAgMisiIFhTVFIoQlBTKSAiKiIgI0EgIiglW2JdKSAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAibGJ1ICAgICVbdGVtcDddLCAgMysiIFhTVFIoQlBTKSAiKiIgI0EgIiglW2JdKSAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAiYWRkdSAgICVbdGVtcDhdLCAgJVt0ZW1wMF0sICAgICVbdGVtcDJdICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAic3VidSAgICVbdGVtcDBdLCAgJVt0ZW1wMF0sICAgICVbdGVtcDJdICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAiYWRkdSAgICVbdGVtcDJdLCAgJVt0ZW1wMV0sICAgICVbdGVtcDNdICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAic3VidSAgICVbdGVtcDFdLCAgJVt0ZW1wMV0sICAgICVbdGVtcDNdICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAiYWRkdSAgICVbdGVtcDNdLCAgJVt0ZW1wNF0sICAgICVbdGVtcDZdICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAic3VidSAgICVbdGVtcDRdLCAgJVt0ZW1wNF0sICAgICVbdGVtcDZdICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAiYWRkdSAgICVbdGVtcDZdLCAgJVt0ZW1wNV0sICAgICVbdGVtcDddICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAic3VidSAgICVbdGVtcDVdLCAgJVt0ZW1wNV0sICAgICVbdGVtcDddICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAiYWRkdSAgICVbdGVtcDddLCAgJVt0ZW1wOF0sICAgICVbdGVtcDJdICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAic3VidSAgICVbdGVtcDJdLCAgJVt0ZW1wOF0sICAgICVbdGVtcDJdICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAiYWRkdSAgICVbdGVtcDhdLCAgJVt0ZW1wMF0sICAgICVbdGVtcDFdICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAic3VidSAgICVbdGVtcDBdLCAgJVt0ZW1wMF0sICAgICVbdGVtcDFdICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAiYWRkdSAgICVbdGVtcDFdLCAgJVt0ZW1wM10sICAgICVbdGVtcDZdICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAic3VidSAgICVbdGVtcDNdLCAgJVt0ZW1wM10sICAgICVbdGVtcDZdICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAiYWRkdSAgICVbdGVtcDZdLCAgJVt0ZW1wNF0sICAgICVbdGVtcDVdICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAic3VidSAgICVbdGVtcDRdLCAgJVt0ZW1wNF0sICAgICVbdGVtcDVdICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAic3cgICAgICVbdGVtcDddLCAgIiAjRSAiKCVbdG1wXSkgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAic3cgICAgICVbdGVtcDJdLCAgIiAjSCAiKCVbdG1wXSkgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAic3cgICAgICVbdGVtcDhdLCAgIiAjRiAiKCVbdG1wXSkgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAic3cgICAgICVbdGVtcDBdLCAgIiAjRyAiKCVbdG1wXSkgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAic3cgICAgICVbdGVtcDFdLCAgIiAjRTEgIiglW3RtcF0pICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAic3cgICAgICVbdGVtcDNdLCAgIiAjSDEgIiglW3RtcF0pICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAic3cgICAgICVbdGVtcDZdLCAgIiAjRjEgIiglW3RtcF0pICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAic3cgICAgICVbdGVtcDRdLCAgIiAjRzEgIiglW3RtcF0pICAgICAgICAgICAgICAgXG5cdCIKKworLy8gbWFjcm8gZm9yIG9uZSB2ZXJ0aWNhbCBwYXNzIGluIERpc3RvNHg0IChUVHJhbnNmb3JtKQorLy8gdHdvIGNhbGxzIG9mIGZ1bmN0aW9uIFRUcmFuc2Zvcm0gYXJlIG1lcmdlZCBpbnRvIHNpbmdsZSBvbmUKKy8vIHNpbmNlIG9ubHkgb25lIGFjY3UgaXMgYXZhaWxhYmxlIGluIG1pcHMzMnIxIGluc3RydWN0aW9uIHNldAorLy8gICBmaXJzdCBpcyBkb25lIHNlY29uZCBjYWxsIG9mIGZ1bmN0aW9uIFRUcmFuc2Zvcm0gYW5kIGFmdGVyCisvLyAgIHRoYXQgZmlyc3Qgb25lLgorLy8gICBjb25zdCBpbnQgc3VtMSA9IFRUcmFuc2Zvcm0oYSwgdyk7CisvLyAgIGNvbnN0IGludCBzdW0yID0gVFRyYW5zZm9ybShiLCB3KTsKKy8vICAgcmV0dXJuIGFicyhzdW0yIC0gc3VtMSkgPj4gNTsKKy8vICAgKHN1bTIgLSBzdW0xKSBpcyBjYWxjdWxhdGVkIHdpdGggbWFkZHMgKHN1YjIpIGFuZCBtc3VicyAoc3ViMSkKKy8vIEEuLkQgLSBvZmZzZXRzIGluIGJ5dGVzIHRvIGxvYWQgZmlyc3QgcmVzdWx0cyBmcm9tIHRtcCBidWZmZXIKKy8vIEExLi5EMSAtIG9mZnNldHMgaW4gYnl0ZXMgdG8gbG9hZCBzZWNvbmQgcmVzdWx0cyBmcm9tIHRtcCBidWZmZXIKKy8vIEUuLkggLSBvZmZzZXRzIGluIGJ5dGVzIHRvIGxvYWQgZnJvbSB3IGJ1ZmZlcgorI2RlZmluZSBWRVJUSUNBTF9QQVNTKEEsIEIsIEMsIEQsIEExLCBCMSwgQzEsIEQxLCBFLCBGLCBHLCBIKSAgICAgXAorICAibHcgICAgICVbdGVtcDBdLCAgIiAjQTEgIiglW3RtcF0pICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAibHcgICAgICVbdGVtcDFdLCAgIiAjQzEgIiglW3RtcF0pICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAibHcgICAgICVbdGVtcDJdLCAgIiAjQjEgIiglW3RtcF0pICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAibHcgICAgICVbdGVtcDNdLCAgIiAjRDEgIiglW3RtcF0pICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAiYWRkdSAgICVbdGVtcDhdLCAgJVt0ZW1wMF0sICAgICVbdGVtcDFdICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAic3VidSAgICVbdGVtcDBdLCAgJVt0ZW1wMF0sICAgICVbdGVtcDFdICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAiYWRkdSAgICVbdGVtcDFdLCAgJVt0ZW1wMl0sICAgICVbdGVtcDNdICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAic3VidSAgICVbdGVtcDJdLCAgJVt0ZW1wMl0sICAgICVbdGVtcDNdICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAiYWRkdSAgICVbdGVtcDNdLCAgJVt0ZW1wOF0sICAgICVbdGVtcDFdICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAic3VidSAgICVbdGVtcDhdLCAgJVt0ZW1wOF0sICAgICVbdGVtcDFdICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAiYWRkdSAgICVbdGVtcDFdLCAgJVt0ZW1wMF0sICAgICVbdGVtcDJdICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAic3VidSAgICVbdGVtcDBdLCAgJVt0ZW1wMF0sICAgICVbdGVtcDJdICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAic3JhICAgICVbdGVtcDRdLCAgJVt0ZW1wM10sICAgIDMxICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAic3JhICAgICVbdGVtcDVdLCAgJVt0ZW1wMV0sICAgIDMxICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAic3JhICAgICVbdGVtcDZdLCAgJVt0ZW1wMF0sICAgIDMxICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAic3JhICAgICVbdGVtcDddLCAgJVt0ZW1wOF0sICAgIDMxICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAieG9yICAgICVbdGVtcDNdLCAgJVt0ZW1wM10sICAgICVbdGVtcDRdICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAieG9yICAgICVbdGVtcDFdLCAgJVt0ZW1wMV0sICAgICVbdGVtcDVdICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAieG9yICAgICVbdGVtcDBdLCAgJVt0ZW1wMF0sICAgICVbdGVtcDZdICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAieG9yICAgICVbdGVtcDhdLCAgJVt0ZW1wOF0sICAgICVbdGVtcDddICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAic3VidSAgICVbdGVtcDNdLCAgJVt0ZW1wM10sICAgICVbdGVtcDRdICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAic3VidSAgICVbdGVtcDFdLCAgJVt0ZW1wMV0sICAgICVbdGVtcDVdICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAic3VidSAgICVbdGVtcDBdLCAgJVt0ZW1wMF0sICAgICVbdGVtcDZdICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAic3VidSAgICVbdGVtcDhdLCAgJVt0ZW1wOF0sICAgICVbdGVtcDddICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAibGh1ICAgICVbdGVtcDRdLCAgIiAjRSAiKCVbd10pICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAibGh1ICAgICVbdGVtcDVdLCAgIiAjRiAiKCVbd10pICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAibGh1ICAgICVbdGVtcDZdLCAgIiAjRyAiKCVbd10pICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAibGh1ICAgICVbdGVtcDddLCAgIiAjSCAiKCVbd10pICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAibWFkZCAgICVbdGVtcDRdLCAgJVt0ZW1wM10gICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAibWFkZCAgICVbdGVtcDVdLCAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAibWFkZCAgICVbdGVtcDZdLCAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAibWFkZCAgICVbdGVtcDddLCAgJVt0ZW1wOF0gICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAibHcgICAgICVbdGVtcDBdLCAgIiAjQSAiKCVbdG1wXSkgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAibHcgICAgICVbdGVtcDFdLCAgIiAjQyAiKCVbdG1wXSkgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAibHcgICAgICVbdGVtcDJdLCAgIiAjQiAiKCVbdG1wXSkgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAibHcgICAgICVbdGVtcDNdLCAgIiAjRCAiKCVbdG1wXSkgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAiYWRkdSAgICVbdGVtcDhdLCAgJVt0ZW1wMF0sICAgICVbdGVtcDFdICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAic3VidSAgICVbdGVtcDBdLCAgJVt0ZW1wMF0sICAgICVbdGVtcDFdICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAiYWRkdSAgICVbdGVtcDFdLCAgJVt0ZW1wMl0sICAgICVbdGVtcDNdICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAic3VidSAgICVbdGVtcDJdLCAgJVt0ZW1wMl0sICAgICVbdGVtcDNdICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAiYWRkdSAgICVbdGVtcDNdLCAgJVt0ZW1wOF0sICAgICVbdGVtcDFdICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAic3VidSAgICVbdGVtcDFdLCAgJVt0ZW1wOF0sICAgICVbdGVtcDFdICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAiYWRkdSAgICVbdGVtcDhdLCAgJVt0ZW1wMF0sICAgICVbdGVtcDJdICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAic3VidSAgICVbdGVtcDBdLCAgJVt0ZW1wMF0sICAgICVbdGVtcDJdICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAic3JhICAgICVbdGVtcDJdLCAgJVt0ZW1wM10sICAgIDMxICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAieG9yICAgICVbdGVtcDNdLCAgJVt0ZW1wM10sICAgICVbdGVtcDJdICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAic3VidSAgICVbdGVtcDNdLCAgJVt0ZW1wM10sICAgICVbdGVtcDJdICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAibXN1YiAgICVbdGVtcDRdLCAgJVt0ZW1wM10gICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAic3JhICAgICVbdGVtcDJdLCAgJVt0ZW1wOF0sICAgIDMxICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAic3JhICAgICVbdGVtcDNdLCAgJVt0ZW1wMF0sICAgIDMxICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAic3JhICAgICVbdGVtcDRdLCAgJVt0ZW1wMV0sICAgIDMxICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAieG9yICAgICVbdGVtcDhdLCAgJVt0ZW1wOF0sICAgICVbdGVtcDJdICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAieG9yICAgICVbdGVtcDBdLCAgJVt0ZW1wMF0sICAgICVbdGVtcDNdICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAieG9yICAgICVbdGVtcDFdLCAgJVt0ZW1wMV0sICAgICVbdGVtcDRdICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAic3VidSAgICVbdGVtcDhdLCAgJVt0ZW1wOF0sICAgICVbdGVtcDJdICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAic3VidSAgICVbdGVtcDBdLCAgJVt0ZW1wMF0sICAgICVbdGVtcDNdICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAic3VidSAgICVbdGVtcDFdLCAgJVt0ZW1wMV0sICAgICVbdGVtcDRdICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAibXN1YiAgICVbdGVtcDVdLCAgJVt0ZW1wOF0gICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAibXN1YiAgICVbdGVtcDZdLCAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgXAorICAibXN1YiAgICVbdGVtcDddLCAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKworc3RhdGljIGludCBEaXN0bzR4NF9NSVBTMzIoY29uc3QgdWludDhfdCogY29uc3QgYSwgY29uc3QgdWludDhfdCogY29uc3QgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90KiBjb25zdCB3KSB7CisgIGludCB0bXBbMzJdOworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3LCB0ZW1wODsKKworICBfX2FzbV9fIHZvbGF0aWxlKAorICAgIEhPUklaT05UQUxfUEFTUygwLCAgIDAsICA0LCAgOCwgMTIsICAgIDY0LCAgNjgsICA3MiwgIDc2KQorICAgIEhPUklaT05UQUxfUEFTUygxLCAgMTYsIDIwLCAyNCwgMjgsICAgIDgwLCAgODQsICA4OCwgIDkyKQorICAgIEhPUklaT05UQUxfUEFTUygyLCAgMzIsIDM2LCA0MCwgNDQsICAgIDk2LCAxMDAsIDEwNCwgMTA4KQorICAgIEhPUklaT05UQUxfUEFTUygzLCAgNDgsIDUyLCA1NiwgNjAsICAgMTEyLCAxMTYsIDEyMCwgMTI0KQorICAgICJtdGhpICAgJHplcm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIm10bG8gICAkemVybyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICBWRVJUSUNBTF9QQVNTKCAwLCAxNiwgMzIsIDQ4LCAgICAgNjQsIDgwLCAgOTYsIDExMiwgICAwLCAgOCwgMTYsIDI0KQorICAgIFZFUlRJQ0FMX1BBU1MoIDQsIDIwLCAzNiwgNTIsICAgICA2OCwgODQsIDEwMCwgMTE2LCAgIDIsIDEwLCAxOCwgMjYpCisgICAgVkVSVElDQUxfUEFTUyggOCwgMjQsIDQwLCA1NiwgICAgIDcyLCA4OCwgMTA0LCAxMjAsICAgNCwgMTIsIDIwLCAyOCkKKyAgICBWRVJUSUNBTF9QQVNTKDEyLCAyOCwgNDQsIDYwLCAgICAgNzYsIDkyLCAxMDgsIDEyNCwgICA2LCAxNCwgMjIsIDMwKQorICAgICJtZmxvICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAlW3RlbXAxXSwgICVbdGVtcDBdLCAgMzEgICAgICAgICAgXG5cdCIKKyAgICAieG9yICAgICVbdGVtcDBdLCAgJVt0ZW1wMF0sICAlW3RlbXAxXSAgICBcblx0IgorICAgICJzdWJ1ICAgJVt0ZW1wMF0sICAlW3RlbXAwXSwgICVbdGVtcDFdICAgIFxuXHQiCisgICAgInNyYSAgICAlW3RlbXAwXSwgICVbdGVtcDBdLCAgNSAgICAgICAgICAgXG5cdCIKKworICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksCisgICAgICBbdGVtcDZdIj0mciIodGVtcDYpLCBbdGVtcDddIj0mciIodGVtcDcpLCBbdGVtcDhdIj0mciIodGVtcDgpCisgICAgOiBbYV0iciIoYSksIFtiXSJyIihiKSwgW3ddInIiKHcpLCBbdG1wXSJyIih0bXApCisgICAgOiAibWVtb3J5IiwgImhpIiwgImxvIgorICApOworCisgIHJldHVybiB0ZW1wMDsKK30KKworI3VuZGVmIFZFUlRJQ0FMX1BBU1MKKyN1bmRlZiBIT1JJWk9OVEFMX1BBU1MKKworc3RhdGljIGludCBEaXN0bzE2eDE2X01JUFMzMihjb25zdCB1aW50OF90KiBjb25zdCBhLCBjb25zdCB1aW50OF90KiBjb25zdCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCogY29uc3QgdykgeworICBpbnQgRCA9IDA7CisgIGludCB4LCB5OworICBmb3IgKHkgPSAwOyB5IDwgMTYgKiBCUFM7IHkgKz0gNCAqIEJQUykgeworICAgIGZvciAoeCA9IDA7IHggPCAxNjsgeCArPSA0KSB7CisgICAgICBEICs9IERpc3RvNHg0X01JUFMzMihhICsgeCArIHksIGIgKyB4ICsgeSwgdyk7CisgICAgfQorICB9CisgIHJldHVybiBEOworfQorCisvLyBtYWNybyBmb3Igb25lIGhvcml6b250YWwgcGFzcyBpbiBGVHJhbnNmb3JtCisvLyB0ZW1wMC4udGVtcDE1IGhvbGRzIHRtcFswXS4udG1wWzE1XQorLy8gQSAtIG9mZnNldCBpbiBieXRlcyB0byBsb2FkIGZyb20gc3JjIGFuZCByZWYgYnVmZmVycworLy8gVEVNUDAuLlRFTVAzIC0gcmVnaXN0ZXJzIGZvciBjb3JyZXNwb25kaW5nIHRtcCBlbGVtZW50cworI2RlZmluZSBIT1JJWk9OVEFMX1BBU1MoQSwgVEVNUDAsIFRFTVAxLCBURU1QMiwgVEVNUDMpICAgICAgICAgICAgICAgICAgXAorICAibHcgICAgICVbIiAjVEVNUDEgIl0sICAwKCVbYXJnc10pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgXAorICAibHcgICAgICVbIiAjVEVNUDIgIl0sICA0KCVbYXJnc10pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgXAorICAibGJ1ICAgICVbdGVtcDE2XSwgICAgMCsiIFhTVFIoQlBTKSAiKiIgI0EgIiglWyIgI1RFTVAxICJdKSAgXG5cdCIgICAgXAorICAibGJ1ICAgICVbdGVtcDE3XSwgICAgMCsiIFhTVFIoQlBTKSAiKiIgI0EgIiglWyIgI1RFTVAyICJdKSAgXG5cdCIgICAgXAorICAibGJ1ICAgICVbdGVtcDE4XSwgICAgMSsiIFhTVFIoQlBTKSAiKiIgI0EgIiglWyIgI1RFTVAxICJdKSAgXG5cdCIgICAgXAorICAibGJ1ICAgICVbdGVtcDE5XSwgICAgMSsiIFhTVFIoQlBTKSAiKiIgI0EgIiglWyIgI1RFTVAyICJdKSAgXG5cdCIgICAgXAorICAic3VidSAgICVbdGVtcDIwXSwgICAgJVt0ZW1wMTZdLCAgICAlW3RlbXAxN10gICAgICAgICAgICAgICAgXG5cdCIgICAgXAorICAibGJ1ICAgICVbdGVtcDE2XSwgICAgMisiIFhTVFIoQlBTKSAiKiIgI0EgIiglWyIgI1RFTVAxICJdKSAgXG5cdCIgICAgXAorICAibGJ1ICAgICVbdGVtcDE3XSwgICAgMisiIFhTVFIoQlBTKSAiKiIgI0EgIiglWyIgI1RFTVAyICJdKSAgXG5cdCIgICAgXAorICAic3VidSAgICVbIiAjVEVNUDAgIl0sICAlW3RlbXAxOF0sICAgICVbdGVtcDE5XSAgICAgICAgICAgICAgXG5cdCIgICAgXAorICAibGJ1ICAgICVbdGVtcDE4XSwgICAgMysiIFhTVFIoQlBTKSAiKiIgI0EgIiglWyIgI1RFTVAxICJdKSAgXG5cdCIgICAgXAorICAibGJ1ICAgICVbdGVtcDE5XSwgICAgMysiIFhTVFIoQlBTKSAiKiIgI0EgIiglWyIgI1RFTVAyICJdKSAgXG5cdCIgICAgXAorICAic3VidSAgICVbIiAjVEVNUDEgIl0sICAlW3RlbXAxNl0sICAgICVbdGVtcDE3XSAgICAgICAgICAgICAgXG5cdCIgICAgXAorICAic3VidSAgICVbIiAjVEVNUDIgIl0sICAlW3RlbXAxOF0sICAgICVbdGVtcDE5XSAgICAgICAgICAgICAgXG5cdCIgICAgXAorICAiYWRkdSAgICVbIiAjVEVNUDMgIl0sICAlW3RlbXAyMF0sICAgICVbIiAjVEVNUDIgIl0gICAgICAgICAgXG5cdCIgICAgXAorICAic3VidSAgICVbIiAjVEVNUDIgIl0sICAlW3RlbXAyMF0sICAgICVbIiAjVEVNUDIgIl0gICAgICAgICAgXG5cdCIgICAgXAorICAiYWRkdSAgICVbdGVtcDIwXSwgICAgJVsiICNURU1QMCAiXSwgICVbIiAjVEVNUDEgIl0gICAgICAgICAgXG5cdCIgICAgXAorICAic3VidSAgICVbIiAjVEVNUDAgIl0sICAlWyIgI1RFTVAwICJdLCAgJVsiICNURU1QMSAiXSAgICAgICAgXG5cdCIgICAgXAorICAibXVsICAgICVbdGVtcDE2XSwgICAgJVsiICNURU1QMiAiXSwgICVbYzUzNTJdICAgICAgICAgICAgICAgXG5cdCIgICAgXAorICAibXVsICAgICVbdGVtcDE3XSwgICAgJVsiICNURU1QMiAiXSwgICVbYzIyMTddICAgICAgICAgICAgICAgXG5cdCIgICAgXAorICAibXVsICAgICVbdGVtcDE4XSwgICAgJVsiICNURU1QMCAiXSwgICVbYzUzNTJdICAgICAgICAgICAgICAgXG5cdCIgICAgXAorICAibXVsICAgICVbdGVtcDE5XSwgICAgJVsiICNURU1QMCAiXSwgICVbYzIyMTddICAgICAgICAgICAgICAgXG5cdCIgICAgXAorICAiYWRkdSAgICVbIiAjVEVNUDEgIl0sICAlWyIgI1RFTVAzICJdLCAgJVt0ZW1wMjBdICAgICAgICAgICAgXG5cdCIgICAgXAorICAic3VidSAgICVbdGVtcDIwXSwgICAgJVsiICNURU1QMyAiXSwgICVbdGVtcDIwXSAgICAgICAgICAgICAgXG5cdCIgICAgXAorICAic2xsICAgICVbIiAjVEVNUDAgIl0sICAlWyIgI1RFTVAxICJdLCAgMyAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgXAorICAic2xsICAgICVbIiAjVEVNUDIgIl0sICAlW3RlbXAyMF0sICAgIDMgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgXAorICAiYWRkaXUgICVbdGVtcDE2XSwgICAgJVt0ZW1wMTZdLCAgICAxODEyICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgXAorICAiYWRkaXUgICVbdGVtcDE3XSwgICAgJVt0ZW1wMTddLCAgICA5MzcgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgXAorICAiYWRkdSAgICVbdGVtcDE2XSwgICAgJVt0ZW1wMTZdLCAgICAlW3RlbXAxOV0gICAgICAgICAgICAgICAgXG5cdCIgICAgXAorICAic3VidSAgICVbdGVtcDE3XSwgICAgJVt0ZW1wMTddLCAgICAlW3RlbXAxOF0gICAgICAgICAgICAgICAgXG5cdCIgICAgXAorICAic3JhICAgICVbIiAjVEVNUDEgIl0sICAlW3RlbXAxNl0sICAgIDkgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgXAorICAic3JhICAgICVbIiAjVEVNUDMgIl0sICAlW3RlbXAxN10sICAgIDkgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworLy8gbWFjcm8gZm9yIG9uZSB2ZXJ0aWNhbCBwYXNzIGluIEZUcmFuc2Zvcm0KKy8vIHRlbXAwLi50ZW1wMTUgaG9sZHMgdG1wWzBdLi50bXBbMTVdCisvLyBBLi5EIC0gb2Zmc2V0cyBpbiBieXRlcyB0byBzdG9yZSB0byBvdXQgYnVmZmVyCisvLyBURU1QMCwgVEVNUDQsIFRFTVA4IGFuZCBURU1QMTIgLSByZWdpc3RlcnMgZm9yIGNvcnJlc3BvbmRpbmcgdG1wIGVsZW1lbnRzCisjZGVmaW5lIFZFUlRJQ0FMX1BBU1MoQSwgQiwgQywgRCwgVEVNUDAsIFRFTVA0LCBURU1QOCwgVEVNUDEyKSAgICBcCisgICJhZGR1ICAgJVt0ZW1wMTZdLCAgICAlWyIgI1RFTVAwICJdLCAgJVsiICNURU1QMTIgIl0gICBcblx0IiAgICBcCisgICJzdWJ1ICAgJVt0ZW1wMTldLCAgICAlWyIgI1RFTVAwICJdLCAgJVsiICNURU1QMTIgIl0gICBcblx0IiAgICBcCisgICJhZGR1ICAgJVt0ZW1wMTddLCAgICAlWyIgI1RFTVA0ICJdLCAgJVsiICNURU1QOCAiXSAgICBcblx0IiAgICBcCisgICJzdWJ1ICAgJVt0ZW1wMThdLCAgICAlWyIgI1RFTVA0ICJdLCAgJVsiICNURU1QOCAiXSAgICBcblx0IiAgICBcCisgICJtdWwgICAgJVsiICNURU1QOCAiXSwgICVbdGVtcDE5XSwgICAgJVtjMjIxN10gICAgICAgICBcblx0IiAgICBcCisgICJtdWwgICAgJVsiICNURU1QMTIgIl0sICVbdGVtcDE4XSwgICAgJVtjMjIxN10gICAgICAgICBcblx0IiAgICBcCisgICJtdWwgICAgJVsiICNURU1QNCAiXSwgICVbdGVtcDE5XSwgICAgJVtjNTM1Ml0gICAgICAgICBcblx0IiAgICBcCisgICJtdWwgICAgJVt0ZW1wMThdLCAgICAlW3RlbXAxOF0sICAgICVbYzUzNTJdICAgICAgICAgICBcblx0IiAgICBcCisgICJhZGRpdSAgJVt0ZW1wMTZdLCAgICAlW3RlbXAxNl0sICAgIDcgICAgICAgICAgICAgICAgICBcblx0IiAgICBcCisgICJhZGR1ICAgJVsiICNURU1QMCAiXSwgICVbdGVtcDE2XSwgICAgJVt0ZW1wMTddICAgICAgICBcblx0IiAgICBcCisgICJzcmEgICAgJVsiICNURU1QMCAiXSwgICVbIiAjVEVNUDAgIl0sICA0ICAgICAgICAgICAgICBcblx0IiAgICBcCisgICJhZGR1ICAgJVsiICNURU1QMTIgIl0sICVbIiAjVEVNUDEyICJdLCAlWyIgI1RFTVA0ICJdICBcblx0IiAgICBcCisgICJzdWJ1ICAgJVsiICNURU1QNCAiXSwgICVbdGVtcDE2XSwgICAgJVt0ZW1wMTddICAgICAgICBcblx0IiAgICBcCisgICJzcmEgICAgJVsiICNURU1QNCAiXSwgICVbIiAjVEVNUDQgIl0sICA0ICAgICAgICAgICAgICBcblx0IiAgICBcCisgICJhZGRpdSAgJVsiICNURU1QOCAiXSwgICVbIiAjVEVNUDggIl0sICAzMDAwMCAgICAgICAgICBcblx0IiAgICBcCisgICJhZGRpdSAgJVsiICNURU1QMTIgIl0sICVbIiAjVEVNUDEyICJdLCAxMjAwMCAgICAgICAgICBcblx0IiAgICBcCisgICJhZGRpdSAgJVsiICNURU1QOCAiXSwgICVbIiAjVEVNUDggIl0sICAyMTAwMCAgICAgICAgICBcblx0IiAgICBcCisgICJzdWJ1ICAgJVsiICNURU1QOCAiXSwgICVbIiAjVEVNUDggIl0sICAlW3RlbXAxOF0gICAgICBcblx0IiAgICBcCisgICJzcmEgICAgJVsiICNURU1QMTIgIl0sICVbIiAjVEVNUDEyICJdLCAxNiAgICAgICAgICAgICBcblx0IiAgICBcCisgICJzcmEgICAgJVsiICNURU1QOCAiXSwgICVbIiAjVEVNUDggIl0sICAxNiAgICAgICAgICAgICBcblx0IiAgICBcCisgICJhZGRpdSAgJVt0ZW1wMTZdLCAgICAlWyIgI1RFTVAxMiAiXSwgMSAgICAgICAgICAgICAgICBcblx0IiAgICBcCisgICJtb3ZuICAgJVsiICNURU1QMTIgIl0sICVbdGVtcDE2XSwgICAgJVt0ZW1wMTldICAgICAgICBcblx0IiAgICBcCisgICJzaCAgICAgJVsiICNURU1QMCAiXSwgICIgI0EgIiglW3RlbXAyMF0pICAgICAgICAgICAgICBcblx0IiAgICBcCisgICJzaCAgICAgJVsiICNURU1QNCAiXSwgICIgI0MgIiglW3RlbXAyMF0pICAgICAgICAgICAgICBcblx0IiAgICBcCisgICJzaCAgICAgJVsiICNURU1QOCAiXSwgICIgI0QgIiglW3RlbXAyMF0pICAgICAgICAgICAgICBcblx0IiAgICBcCisgICJzaCAgICAgJVsiICNURU1QMTIgIl0sICIgI0IgIiglW3RlbXAyMF0pICAgICAgICAgICAgICBcblx0IgorCitzdGF0aWMgdm9pZCBGVHJhbnNmb3JtX01JUFMzMihjb25zdCB1aW50OF90KiBzcmMsIGNvbnN0IHVpbnQ4X3QqIHJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QqIG91dCkgeworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3LCB0ZW1wODsKKyAgaW50IHRlbXA5LCB0ZW1wMTAsIHRlbXAxMSwgdGVtcDEyLCB0ZW1wMTMsIHRlbXAxNCwgdGVtcDE1LCB0ZW1wMTY7CisgIGludCB0ZW1wMTcsIHRlbXAxOCwgdGVtcDE5LCB0ZW1wMjA7CisgIGNvbnN0IGludCBjMjIxNyA9IDIyMTc7CisgIGNvbnN0IGludCBjNTM1MiA9IDUzNTI7CisgIGNvbnN0IGludCogY29uc3QgYXJnc1szXSA9CisgICAgICB7IChjb25zdCBpbnQqKXNyYywgKGNvbnN0IGludCopcmVmLCAoY29uc3QgaW50KilvdXQgfTsKKworICBfX2FzbV9fIHZvbGF0aWxlKAorICAgIEhPUklaT05UQUxfUEFTUygwLCB0ZW1wMCwgIHRlbXAxLCAgdGVtcDIsICB0ZW1wMykKKyAgICBIT1JJWk9OVEFMX1BBU1MoMSwgdGVtcDQsICB0ZW1wNSwgIHRlbXA2LCAgdGVtcDcpCisgICAgSE9SSVpPTlRBTF9QQVNTKDIsIHRlbXA4LCAgdGVtcDksICB0ZW1wMTAsIHRlbXAxMSkKKyAgICBIT1JJWk9OVEFMX1BBU1MoMywgdGVtcDEyLCB0ZW1wMTMsIHRlbXAxNCwgdGVtcDE1KQorICAgICJsdyAgICVbdGVtcDIwXSwgICAgOCglW2FyZ3NdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgVkVSVElDQUxfUEFTUygwLCAgOCwgMTYsIDI0LCB0ZW1wMCwgdGVtcDQsIHRlbXA4LCAgdGVtcDEyKQorICAgIFZFUlRJQ0FMX1BBU1MoMiwgMTAsIDE4LCAyNiwgdGVtcDEsIHRlbXA1LCB0ZW1wOSwgIHRlbXAxMykKKyAgICBWRVJUSUNBTF9QQVNTKDQsIDEyLCAyMCwgMjgsIHRlbXAyLCB0ZW1wNiwgdGVtcDEwLCB0ZW1wMTQpCisgICAgVkVSVElDQUxfUEFTUyg2LCAxNCwgMjIsIDMwLCB0ZW1wMywgdGVtcDcsIHRlbXAxMSwgdGVtcDE1KQorCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgIFt0ZW1wNl0iPSZyIih0ZW1wNiksIFt0ZW1wN10iPSZyIih0ZW1wNyksIFt0ZW1wOF0iPSZyIih0ZW1wOCksCisgICAgICBbdGVtcDldIj0mciIodGVtcDkpLCBbdGVtcDEwXSI9JnIiKHRlbXAxMCksIFt0ZW1wMTFdIj0mciIodGVtcDExKSwKKyAgICAgIFt0ZW1wMTJdIj0mciIodGVtcDEyKSwgW3RlbXAxM10iPSZyIih0ZW1wMTMpLCBbdGVtcDE0XSI9JnIiKHRlbXAxNCksCisgICAgICBbdGVtcDE1XSI9JnIiKHRlbXAxNSksIFt0ZW1wMTZdIj0mciIodGVtcDE2KSwgW3RlbXAxN10iPSZyIih0ZW1wMTcpLAorICAgICAgW3RlbXAxOF0iPSZyIih0ZW1wMTgpLCBbdGVtcDE5XSI9JnIiKHRlbXAxOSksIFt0ZW1wMjBdIj0mciIodGVtcDIwKQorICAgIDogW2FyZ3NdInIiKGFyZ3MpLCBbYzIyMTddInIiKGMyMjE3KSwgW2M1MzUyXSJyIihjNTM1MikKKyAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iCisgICk7Cit9CisKKyN1bmRlZiBWRVJUSUNBTF9QQVNTCisjdW5kZWYgSE9SSVpPTlRBTF9QQVNTCisKKyNpZiAhZGVmaW5lZChXT1JLX0FST1VORF9HQ0MpCisKKyNkZWZpbmUgR0VUX1NTRV9JTk5FUihBLCBCLCBDLCBEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJsYnUgICAgICVbdGVtcDBdLCAgICAiICNBICIoJVthXSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAibGJ1ICAgICAlW3RlbXAxXSwgICAgIiAjQSAiKCVbYl0pICAgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgImxidSAgICAgJVt0ZW1wMl0sICAgICIgI0IgIiglW2FdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJsYnUgICAgICVbdGVtcDNdLCAgICAiICNCICIoJVtiXSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAibGJ1ICAgICAlW3RlbXA0XSwgICAgIiAjQyAiKCVbYV0pICAgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgImxidSAgICAgJVt0ZW1wNV0sICAgICIgI0MgIiglW2JdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJsYnUgICAgICVbdGVtcDZdLCAgICAiICNEICIoJVthXSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAibGJ1ICAgICAlW3RlbXA3XSwgICAgIiAjRCAiKCVbYl0pICAgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgInN1YnUgICAgJVt0ZW1wMF0sICAgICVbdGVtcDBdLCAgICAgJVt0ZW1wMV0gICAgICAgXG5cdCIgICAgICBcCisgICJzdWJ1ICAgICVbdGVtcDJdLCAgICAlW3RlbXAyXSwgICAgICVbdGVtcDNdICAgICAgIFxuXHQiICAgICAgXAorICAic3VidSAgICAlW3RlbXA0XSwgICAgJVt0ZW1wNF0sICAgICAlW3RlbXA1XSAgICAgICBcblx0IiAgICAgIFwKKyAgInN1YnUgICAgJVt0ZW1wNl0sICAgICVbdGVtcDZdLCAgICAgJVt0ZW1wN10gICAgICAgXG5cdCIgICAgICBcCisgICJtYWRkICAgICVbdGVtcDBdLCAgICAlW3RlbXAwXSAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAibWFkZCAgICAlW3RlbXAyXSwgICAgJVt0ZW1wMl0gICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgIm1hZGQgICAgJVt0ZW1wNF0sICAgICVbdGVtcDRdICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJtYWRkICAgICVbdGVtcDZdLCAgICAlW3RlbXA2XSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyNkZWZpbmUgR0VUX1NTRShBLCBCLCBDLCBEKSAgICAgICAgICAgICAgIFwKKyAgR0VUX1NTRV9JTk5FUihBLCBBICsgMSwgQSArIDIsIEEgKyAzKSAgIFwKKyAgR0VUX1NTRV9JTk5FUihCLCBCICsgMSwgQiArIDIsIEIgKyAzKSAgIFwKKyAgR0VUX1NTRV9JTk5FUihDLCBDICsgMSwgQyArIDIsIEMgKyAzKSAgIFwKKyAgR0VUX1NTRV9JTk5FUihELCBEICsgMSwgRCArIDIsIEQgKyAzKQorCitzdGF0aWMgaW50IFNTRTE2eDE2X01JUFMzMihjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiBiKSB7CisgIGludCBjb3VudDsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA2LCB0ZW1wNzsKKworICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAibXVsdCAgICR6ZXJvLCAgICAkemVybyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgIEdFVF9TU0UoIDAgKiBCUFMsIDQgKyAgMCAqIEJQUywgOCArICAwICogQlBTLCAxMiArICAwICogQlBTKQorICAgICBHRVRfU1NFKCAxICogQlBTLCA0ICsgIDEgKiBCUFMsIDggKyAgMSAqIEJQUywgMTIgKyAgMSAqIEJQUykKKyAgICAgR0VUX1NTRSggMiAqIEJQUywgNCArICAyICogQlBTLCA4ICsgIDIgKiBCUFMsIDEyICsgIDIgKiBCUFMpCisgICAgIEdFVF9TU0UoIDMgKiBCUFMsIDQgKyAgMyAqIEJQUywgOCArICAzICogQlBTLCAxMiArICAzICogQlBTKQorICAgICBHRVRfU1NFKCA0ICogQlBTLCA0ICsgIDQgKiBCUFMsIDggKyAgNCAqIEJQUywgMTIgKyAgNCAqIEJQUykKKyAgICAgR0VUX1NTRSggNSAqIEJQUywgNCArICA1ICogQlBTLCA4ICsgIDUgKiBCUFMsIDEyICsgIDUgKiBCUFMpCisgICAgIEdFVF9TU0UoIDYgKiBCUFMsIDQgKyAgNiAqIEJQUywgOCArICA2ICogQlBTLCAxMiArICA2ICogQlBTKQorICAgICBHRVRfU1NFKCA3ICogQlBTLCA0ICsgIDcgKiBCUFMsIDggKyAgNyAqIEJQUywgMTIgKyAgNyAqIEJQUykKKyAgICAgR0VUX1NTRSggOCAqIEJQUywgNCArICA4ICogQlBTLCA4ICsgIDggKiBCUFMsIDEyICsgIDggKiBCUFMpCisgICAgIEdFVF9TU0UoIDkgKiBCUFMsIDQgKyAgOSAqIEJQUywgOCArICA5ICogQlBTLCAxMiArICA5ICogQlBTKQorICAgICBHRVRfU1NFKDEwICogQlBTLCA0ICsgMTAgKiBCUFMsIDggKyAxMCAqIEJQUywgMTIgKyAxMCAqIEJQUykKKyAgICAgR0VUX1NTRSgxMSAqIEJQUywgNCArIDExICogQlBTLCA4ICsgMTEgKiBCUFMsIDEyICsgMTEgKiBCUFMpCisgICAgIEdFVF9TU0UoMTIgKiBCUFMsIDQgKyAxMiAqIEJQUywgOCArIDEyICogQlBTLCAxMiArIDEyICogQlBTKQorICAgICBHRVRfU1NFKDEzICogQlBTLCA0ICsgMTMgKiBCUFMsIDggKyAxMyAqIEJQUywgMTIgKyAxMyAqIEJQUykKKyAgICAgR0VUX1NTRSgxNCAqIEJQUywgNCArIDE0ICogQlBTLCA4ICsgMTQgKiBCUFMsIDEyICsgMTQgKiBCUFMpCisgICAgIEdFVF9TU0UoMTUgKiBCUFMsIDQgKyAxNSAqIEJQUywgOCArIDE1ICogQlBTLCAxMiArIDE1ICogQlBTKQorCisgICAgIm1mbG8gICAgJVtjb3VudF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgIFt0ZW1wNl0iPSZyIih0ZW1wNiksIFt0ZW1wN10iPSZyIih0ZW1wNyksIFtjb3VudF0iPSZyIihjb3VudCkKKyAgICA6IFthXSJyIihhKSwgW2JdInIiKGIpCisgICAgOiAibWVtb3J5IiwgImhpIiwgImxvIgorICApOworICByZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgU1NFMTZ4OF9NSVBTMzIoY29uc3QgdWludDhfdCogYSwgY29uc3QgdWludDhfdCogYikgeworICBpbnQgY291bnQ7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNiwgdGVtcDc7CisKKyAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgIm11bHQgICAkemVybywgICAgJHplcm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICBHRVRfU1NFKCAwICogQlBTLCA0ICsgIDAgKiBCUFMsIDggKyAgMCAqIEJQUywgMTIgKyAgMCAqIEJQUykKKyAgICAgR0VUX1NTRSggMSAqIEJQUywgNCArICAxICogQlBTLCA4ICsgIDEgKiBCUFMsIDEyICsgIDEgKiBCUFMpCisgICAgIEdFVF9TU0UoIDIgKiBCUFMsIDQgKyAgMiAqIEJQUywgOCArICAyICogQlBTLCAxMiArICAyICogQlBTKQorICAgICBHRVRfU1NFKCAzICogQlBTLCA0ICsgIDMgKiBCUFMsIDggKyAgMyAqIEJQUywgMTIgKyAgMyAqIEJQUykKKyAgICAgR0VUX1NTRSggNCAqIEJQUywgNCArICA0ICogQlBTLCA4ICsgIDQgKiBCUFMsIDEyICsgIDQgKiBCUFMpCisgICAgIEdFVF9TU0UoIDUgKiBCUFMsIDQgKyAgNSAqIEJQUywgOCArICA1ICogQlBTLCAxMiArICA1ICogQlBTKQorICAgICBHRVRfU1NFKCA2ICogQlBTLCA0ICsgIDYgKiBCUFMsIDggKyAgNiAqIEJQUywgMTIgKyAgNiAqIEJQUykKKyAgICAgR0VUX1NTRSggNyAqIEJQUywgNCArICA3ICogQlBTLCA4ICsgIDcgKiBCUFMsIDEyICsgIDcgKiBCUFMpCisKKyAgICAibWZsbyAgICAlW2NvdW50XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLAorICAgICAgW3RlbXA2XSI9JnIiKHRlbXA2KSwgW3RlbXA3XSI9JnIiKHRlbXA3KSwgW2NvdW50XSI9JnIiKGNvdW50KQorICAgIDogW2FdInIiKGEpLCBbYl0iciIoYikKKyAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iCisgICk7CisgIHJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBTU0U4eDhfTUlQUzMyKGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIpIHsKKyAgaW50IGNvdW50OworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3OworCisgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICJtdWx0ICAgJHplcm8sICAgICR6ZXJvICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgR0VUX1NTRSgwICogQlBTLCA0ICsgMCAqIEJQUywgMSAqIEJQUywgNCArIDEgKiBCUFMpCisgICAgIEdFVF9TU0UoMiAqIEJQUywgNCArIDIgKiBCUFMsIDMgKiBCUFMsIDQgKyAzICogQlBTKQorICAgICBHRVRfU1NFKDQgKiBCUFMsIDQgKyA0ICogQlBTLCA1ICogQlBTLCA0ICsgNSAqIEJQUykKKyAgICAgR0VUX1NTRSg2ICogQlBTLCA0ICsgNiAqIEJQUywgNyAqIEJQUywgNCArIDcgKiBCUFMpCisKKyAgICAibWZsbyAgICAlW2NvdW50XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLAorICAgICAgW3RlbXA2XSI9JnIiKHRlbXA2KSwgW3RlbXA3XSI9JnIiKHRlbXA3KSwgW2NvdW50XSI9JnIiKGNvdW50KQorICAgIDogW2FdInIiKGEpLCBbYl0iciIoYikKKyAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iCisgICk7CisgIHJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBTU0U0eDRfTUlQUzMyKGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIpIHsKKyAgaW50IGNvdW50OworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3OworCisgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICJtdWx0ICAgJHplcm8sICAgICR6ZXJvICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgR0VUX1NTRSgwICogQlBTLCAxICogQlBTLCAyICogQlBTLCAzICogQlBTKQorCisgICAgIm1mbG8gICAgJVtjb3VudF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgIFt0ZW1wNl0iPSZyIih0ZW1wNiksIFt0ZW1wN10iPSZyIih0ZW1wNyksIFtjb3VudF0iPSZyIihjb3VudCkKKyAgICA6IFthXSJyIihhKSwgW2JdInIiKGIpCisgICAgOiAibWVtb3J5IiwgImhpIiwgImxvIgorICApOworICByZXR1cm4gY291bnQ7Cit9CisKKyN1bmRlZiBHRVRfU1NFCisjdW5kZWYgR0VUX1NTRV9JTk5FUgorCisjZW5kaWYgIC8vICFXT1JLX0FST1VORF9HQ0MKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFZQOEVuY0RzcEluaXRNSVBTMzIodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBWUDhFbmNEc3BJbml0TUlQUzMyKHZvaWQpIHsKKyAgVlA4SVRyYW5zZm9ybSA9IElUcmFuc2Zvcm1fTUlQUzMyOworICBWUDhGVHJhbnNmb3JtID0gRlRyYW5zZm9ybV9NSVBTMzI7CisKKyAgVlA4RW5jUXVhbnRpemVCbG9jayA9IFF1YW50aXplQmxvY2tfTUlQUzMyOworICBWUDhFbmNRdWFudGl6ZTJCbG9ja3MgPSBRdWFudGl6ZTJCbG9ja3NfTUlQUzMyOworCisgIFZQOFREaXN0bzR4NCA9IERpc3RvNHg0X01JUFMzMjsKKyAgVlA4VERpc3RvMTZ4MTYgPSBEaXN0bzE2eDE2X01JUFMzMjsKKworI2lmICFkZWZpbmVkKFdPUktfQVJPVU5EX0dDQykKKyAgVlA4U1NFMTZ4MTYgPSBTU0UxNngxNl9NSVBTMzI7CisgIFZQOFNTRTh4OCA9IFNTRTh4OF9NSVBTMzI7CisgIFZQOFNTRTE2eDggPSBTU0UxNng4X01JUFMzMjsKKyAgVlA4U1NFNHg0ID0gU1NFNHg0X01JUFMzMjsKKyNlbmRpZgorfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX01JUFMzMgorCitXRUJQX0RTUF9JTklUX1NUVUIoVlA4RW5jRHNwSW5pdE1JUFMzMikKKworI2VuZGlmICAvLyBXRUJQX1VTRV9NSVBTMzIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZW5jX21pcHNfZHNwX3IyLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2VuY19taXBzX2RzcF9yMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMjg3NmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2VuY19taXBzX2RzcF9yMi5jCkBAIC0wLDAgKzEsMTUyMiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIE1JUFMgdmVyc2lvbiBvZiBzcGVlZC1jcml0aWNhbCBlbmNvZGluZyBmdW5jdGlvbnMuCisvLworLy8gQXV0aG9yKHMpOiBEYXJrbyBMYXVzIChkYXJrby5sYXVzQGltZ3RlYy5jb20pCisvLyAgICAgICAgICAgIE1pcmtvIFJhdXMgKG1pcmtvLnJhdXNAaW1ndGVjLmNvbSkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFNfRFNQX1IyKQorCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RkbGliX3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdfcG9lbS5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvZHNwL21pcHNfbWFjcm8uaCIKKyNpbmNsdWRlICJzcmMvZW5jL2Nvc3RfZW5jLmgiCisjaW5jbHVkZSAic3JjL2VuYy92cDhpX2VuYy5oIgorCitzdGF0aWMgY29uc3QgaW50IGtDMSA9IDIwMDkxICsgKDEgPDwgMTYpOworc3RhdGljIGNvbnN0IGludCBrQzIgPSAzNTQ2ODsKKworLy8gTyAtIG91dHB1dAorLy8gSSAtIGlucHV0IChtYWNybyBkb2Vzbid0IGNoYW5nZSBpdCkKKyNkZWZpbmUgQUREX1NVQl9IQUxWRVNfWDQoTzAsIE8xLCBPMiwgTzMsIE80LCBPNSwgTzYsIE83LCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIEkwLCBJMSwgSTIsIEkzLCBJNCwgSTUsIEk2LCBJNykgICAgICAgICAgICAgICAgICAgICAgXAorICAiYWRkcS5waCAgICAgICAgICAlWyIgI08wICJdLCAgICVbIiAjSTAgIl0sICAlWyIgI0kxICJdICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgInN1YnEucGggICAgICAgICAgJVsiICNPMSAiXSwgICAlWyIgI0kwICJdLCAgJVsiICNJMSAiXSAgICAgXG5cdCIgICAgICAgICAgICBcCisgICJhZGRxLnBoICAgICAgICAgICVbIiAjTzIgIl0sICAgJVsiICNJMiAiXSwgICVbIiAjSTMgIl0gICAgIFxuXHQiICAgICAgICAgICAgXAorICAic3VicS5waCAgICAgICAgICAlWyIgI08zICJdLCAgICVbIiAjSTIgIl0sICAlWyIgI0kzICJdICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgImFkZHEucGggICAgICAgICAgJVsiICNPNCAiXSwgICAlWyIgI0k0ICJdLCAgJVsiICNJNSAiXSAgICAgXG5cdCIgICAgICAgICAgICBcCisgICJzdWJxLnBoICAgICAgICAgICVbIiAjTzUgIl0sICAgJVsiICNJNCAiXSwgICVbIiAjSTUgIl0gICAgIFxuXHQiICAgICAgICAgICAgXAorICAiYWRkcS5waCAgICAgICAgICAlWyIgI082ICJdLCAgICVbIiAjSTYgIl0sICAlWyIgI0k3ICJdICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgInN1YnEucGggICAgICAgICAgJVsiICNPNyAiXSwgICAlWyIgI0k2ICJdLCAgJVsiICNJNyAiXSAgICAgXG5cdCIKKworLy8gSU8gLSBpbnB1dC9vdXRwdXQKKyNkZWZpbmUgQUJTX1g4KElPMCwgSU8xLCBJTzIsIElPMywgSU80LCBJTzUsIElPNiwgSU83KSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJhYnNxX3MucGggICAgICAgICVbIiAjSU8wICJdLCAgICVbIiAjSU8wICJdICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAiYWJzcV9zLnBoICAgICAgICAlWyIgI0lPMSAiXSwgICAlWyIgI0lPMSAiXSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgImFic3Ffcy5waCAgICAgICAgJVsiICNJTzIgIl0sICAgJVsiICNJTzIgIl0gICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICJhYnNxX3MucGggICAgICAgICVbIiAjSU8zICJdLCAgICVbIiAjSU8zICJdICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAiYWJzcV9zLnBoICAgICAgICAlWyIgI0lPNCAiXSwgICAlWyIgI0lPNCAiXSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgImFic3Ffcy5waCAgICAgICAgJVsiICNJTzUgIl0sICAgJVsiICNJTzUgIl0gICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICJhYnNxX3MucGggICAgICAgICVbIiAjSU82ICJdLCAgICVbIiAjSU82ICJdICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAiYWJzcV9zLnBoICAgICAgICAlWyIgI0lPNyAiXSwgICAlWyIgI0lPNyAiXSAgICAgICAgICAgICAgICBcblx0IgorCisvLyBkcGEudy5waCAkYWMwIHRlbXAwICx0ZW1wMQorLy8gICRhYyArPSB0ZW1wMFszMS4uMTZdICogdGVtcDFbMzEuLjE2XSArIHRlbXAwWzE1Li4wXSAqIHRlbXAxWzE1Li4wXQorLy8gZHBheC53LnBoICRhYzAgdGVtcDAgLHRlbXAxCisvLyAgJGFjICs9IHRlbXAwWzMxLi4xNl0gKiB0ZW1wMVsxNS4uMF0gKyB0ZW1wMFsxNS4uMF0gKiB0ZW1wMVszMS4uMTZdCisvLyBPIC0gb3V0cHV0CisvLyBJIC0gaW5wdXQgKG1hY3JvIGRvZXNuJ3QgY2hhbmdlIGl0KQorI2RlZmluZSBNVUxfSEFMRihPMCwgSTAsIEkxLCBJMiwgSTMsIEk0LCBJNSwgSTYsIEk3LCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgSTgsIEk5LCBJMTAsIEkxMSwgSTEyLCBJMTMsIEkxNCwgSTE1KSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIm11bHQgICAgICAgICAgICAkYWMwLCAgICAgICR6ZXJvLCAgICAgJHplcm8gICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAgICJkcGEudy5waCAgICAgICAgJGFjMCwgICAgICAlWyIgI0kyICJdLCAgJVsiICNJMCAiXSAgICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgICAiZHBheC53LnBoICAgICAgICRhYzAsICAgICAgJVsiICNJNSAiXSwgICVbIiAjSTYgIl0gICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICAgImRwYS53LnBoICAgICAgICAkYWMwLCAgICAgICVbIiAjSTggIl0sICAlWyIgI0k5ICJdICAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAgICJkcGF4LncucGggICAgICAgJGFjMCwgICAgICAlWyIgI0kxMSAiXSwgJVsiICNJNCAiXSAgICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgICAiZHBhLncucGggICAgICAgICRhYzAsICAgICAgJVsiICNJMTIgIl0sICVbIiAjSTcgIl0gICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICAgImRwYXgudy5waCAgICAgICAkYWMwLCAgICAgICVbIiAjSTEzICJdLCAlWyIgI0kxICJdICAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAgICJkcGEudy5waCAgICAgICAgJGFjMCwgICAgICAlWyIgI0kxNCAiXSwgJVsiICNJMyAiXSAgICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgICAiZHBheC53LnBoICAgICAgICRhYzAsICAgICAgJVsiICNJMTUgIl0sICVbIiAjSTEwICJdICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICAgIm1mbG8gICAgICAgICAgICAlWyIgI08wICJdLCAgJGFjMCAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyNkZWZpbmUgT1VUUFVUX0VBUkxZX0NMT0JCRVJfUkVHU18xNygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIE9VVFBVVF9FQVJMWV9DTE9CQkVSX1JFR1NfMTAoKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBbdGVtcDExXSI9JnIiKHRlbXAxMSksIFt0ZW1wMTJdIj0mciIodGVtcDEyKSwgW3RlbXAxM10iPSZyIih0ZW1wMTMpLCAgICAgICAgIFwKKyAgW3RlbXAxNF0iPSZyIih0ZW1wMTQpLCBbdGVtcDE1XSI9JnIiKHRlbXAxNSksIFt0ZW1wMTZdIj0mciIodGVtcDE2KSwgICAgICAgICBcCisgIFt0ZW1wMTddIj0mciIodGVtcDE3KQorCisvLyBtYWNybyBmb3Igb25lIGhvcml6b250YWwgcGFzcyBpbiBGVHJhbnNmb3JtCisvLyB0ZW1wMC4udGVtcDE1IGhvbGRzIHRtcFswXS4udG1wWzE1XQorLy8gQSAtIG9mZnNldCBpbiBieXRlcyB0byBsb2FkIGZyb20gc3JjIGFuZCByZWYgYnVmZmVycworLy8gVEVNUDAuLlRFTVAzIC0gcmVnaXN0ZXJzIGZvciBjb3JyZXNwb25kaW5nIHRtcCBlbGVtZW50cworI2RlZmluZSBIT1JJWk9OVEFMX1BBU1MoQSwgVEVNUDAsIFRFTVAxLCBURU1QMiwgVEVNUDMpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgImx3ICAgICAgICAgICAgICAlWyIgI1RFTVAwICJdLCAgIDAoJVthcmdzXSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICBcCisgICJsdyAgICAgICAgICAgICAgJVsiICNURU1QMSAiXSwgICA0KCVbYXJnc10pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgXAorICAibHcgICAgICAgICAgICAgICVbIiAjVEVNUDIgIl0sICAgIiBYU1RSKEJQUykgIioiICNBICIoJVsiICNURU1QMCAiXSkgXG5cdCIgIFwKKyAgImx3ICAgICAgICAgICAgICAlWyIgI1RFTVAzICJdLCAgICIgWFNUUihCUFMpICIqIiAjQSAiKCVbIiAjVEVNUDEgIl0pIFxuXHQiICBcCisgICJwcmVjZXUucGgucWJsICAgJVsiICNURU1QMCAiXSwgICAlWyIgI1RFTVAyICJdICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgXAorICAicHJlY2V1LnBoLnFibCAgICVbIiAjVEVNUDEgIl0sICAgJVsiICNURU1QMyAiXSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgIFwKKyAgInByZWNldS5waC5xYnIgICAlWyIgI1RFTVAyICJdLCAgICVbIiAjVEVNUDIgIl0gICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICBcCisgICJwcmVjZXUucGgucWJyICAgJVsiICNURU1QMyAiXSwgICAlWyIgI1RFTVAzICJdICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgXAorICAic3VicS5waCAgICAgICAgICVbIiAjVEVNUDAgIl0sICAgJVsiICNURU1QMCAiXSwgICAlWyIgI1RFTVAxICJdICAgICAgXG5cdCIgIFwKKyAgInN1YnEucGggICAgICAgICAlWyIgI1RFTVAyICJdLCAgICVbIiAjVEVNUDIgIl0sICAgJVsiICNURU1QMyAiXSAgICAgIFxuXHQiICBcCisgICJyb3RyICAgICAgICAgICAgJVsiICNURU1QMCAiXSwgICAlWyIgI1RFTVAwICJdLCAgIDE2ICAgICAgICAgICAgICAgICBcblx0IiAgXAorICAiYWRkcS5waCAgICAgICAgICVbIiAjVEVNUDEgIl0sICAgJVsiICNURU1QMiAiXSwgICAlWyIgI1RFTVAwICJdICAgICAgXG5cdCIgIFwKKyAgInN1YnEucGggICAgICAgICAlWyIgI1RFTVAzICJdLCAgICVbIiAjVEVNUDIgIl0sICAgJVsiICNURU1QMCAiXSAgICAgIFxuXHQiICBcCisgICJzZWggICAgICAgICAgICAgJVsiICNURU1QMCAiXSwgICAlWyIgI1RFTVAxICJdICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgXAorICAic3JhICAgICAgICAgICAgICVbdGVtcDE2XSwgICAgICVbIiAjVEVNUDEgIl0sICAgMTYgICAgICAgICAgICAgICAgICAgXG5cdCIgIFwKKyAgInNlaCAgICAgICAgICAgICAlW3RlbXAxOV0sICAgICAlWyIgI1RFTVAzICJdICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICBcCisgICJzcmEgICAgICAgICAgICAgJVsiICNURU1QMyAiXSwgICAlWyIgI1RFTVAzICJdLCAgIDE2ICAgICAgICAgICAgICAgICBcblx0IiAgXAorICAic3VidSAgICAgICAgICAgICVbIiAjVEVNUDIgIl0sICAgJVsiICNURU1QMCAiXSwgICAlW3RlbXAxNl0gICAgICAgICAgXG5cdCIgIFwKKyAgImFkZHUgICAgICAgICAgICAlWyIgI1RFTVAwICJdLCAgICVbIiAjVEVNUDAgIl0sICAgJVt0ZW1wMTZdICAgICAgICAgIFxuXHQiICBcCisgICJtdWwgICAgICAgICAgICAgJVt0ZW1wMTddLCAgICAgJVt0ZW1wMTldLCAgICAgJVtjMjIxN10gICAgICAgICAgICAgICBcblx0IiAgXAorICAibXVsICAgICAgICAgICAgICVbdGVtcDE4XSwgICAgICVbIiAjVEVNUDMgIl0sICAgJVtjNTM1Ml0gICAgICAgICAgICAgXG5cdCIgIFwKKyAgIm11bCAgICAgICAgICAgICAlWyIgI1RFTVAxICJdLCAgICVbdGVtcDE5XSwgICAgICVbYzUzNTJdICAgICAgICAgICAgIFxuXHQiICBcCisgICJtdWwgICAgICAgICAgICAgJVt0ZW1wMTZdLCAgICAgJVsiICNURU1QMyAiXSwgICAlW2MyMjE3XSAgICAgICAgICAgICBcblx0IiAgXAorICAic2xsICAgICAgICAgICAgICVbIiAjVEVNUDIgIl0sICAgJVsiICNURU1QMiAiXSwgICAzICAgICAgICAgICAgICAgICAgXG5cdCIgIFwKKyAgInNsbCAgICAgICAgICAgICAlWyIgI1RFTVAwICJdLCAgICVbIiAjVEVNUDAgIl0sICAgMyAgICAgICAgICAgICAgICAgIFxuXHQiICBcCisgICJzdWJ1ICAgICAgICAgICAgJVsiICNURU1QMyAiXSwgICAlW3RlbXAxN10sICAgICAlW3RlbXAxOF0gICAgICAgICAgICBcblx0IiAgXAorICAiYWRkdSAgICAgICAgICAgICVbIiAjVEVNUDEgIl0sICAgJVt0ZW1wMTZdLCAgICAgJVsiICNURU1QMSAiXSAgICAgICAgXG5cdCIgIFwKKyAgImFkZGl1ICAgICAgICAgICAlWyIgI1RFTVAzICJdLCAgICVbIiAjVEVNUDMgIl0sICAgOTM3ICAgICAgICAgICAgICAgIFxuXHQiICBcCisgICJhZGRpdSAgICAgICAgICAgJVsiICNURU1QMSAiXSwgICAlWyIgI1RFTVAxICJdLCAgIDE4MTIgICAgICAgICAgICAgICBcblx0IiAgXAorICAic3JhICAgICAgICAgICAgICVbIiAjVEVNUDMgIl0sICAgJVsiICNURU1QMyAiXSwgICA5ICAgICAgICAgICAgICAgICAgXG5cdCIgIFwKKyAgInNyYSAgICAgICAgICAgICAlWyIgI1RFTVAxICJdLCAgICVbIiAjVEVNUDEgIl0sICAgOSAgICAgICAgICAgICAgICAgIFxuXHQiCisKKy8vIG1hY3JvIGZvciBvbmUgdmVydGljYWwgcGFzcyBpbiBGVHJhbnNmb3JtCisvLyB0ZW1wMC4udGVtcDE1IGhvbGRzIHRtcFswXS4udG1wWzE1XQorLy8gQS4uRCAtIG9mZnNldHMgaW4gYnl0ZXMgdG8gc3RvcmUgdG8gb3V0IGJ1ZmZlcgorLy8gVEVNUDAsIFRFTVA0LCBURU1QOCBhbmQgVEVNUDEyIC0gcmVnaXN0ZXJzIGZvciBjb3JyZXNwb25kaW5nIHRtcCBlbGVtZW50cworI2RlZmluZSBWRVJUSUNBTF9QQVNTKEEsIEIsIEMsIEQsIFRFTVAwLCBURU1QNCwgVEVNUDgsIFRFTVAxMikgICAgICAgICAgICAgICAgIFwKKyAgImFkZHUgICAgICAgICAgICAlW3RlbXAxNl0sICAgICAlWyIgI1RFTVAwICJdLCAgICVbIiAjVEVNUDEyICJdICAgXG5cdCIgICAgICBcCisgICJzdWJ1ICAgICAgICAgICAgJVt0ZW1wMTldLCAgICAgJVsiICNURU1QMCAiXSwgICAlWyIgI1RFTVAxMiAiXSAgIFxuXHQiICAgICAgXAorICAiYWRkdSAgICAgICAgICAgICVbdGVtcDE3XSwgICAgICVbIiAjVEVNUDQgIl0sICAgJVsiICNURU1QOCAiXSAgICBcblx0IiAgICAgIFwKKyAgInN1YnUgICAgICAgICAgICAlW3RlbXAxOF0sICAgICAlWyIgI1RFTVA0ICJdLCAgICVbIiAjVEVNUDggIl0gICAgXG5cdCIgICAgICBcCisgICJtdWwgICAgICAgICAgICAgJVsiICNURU1QOCAiXSwgICAlW3RlbXAxOV0sICAgICAlW2MyMjE3XSAgICAgICAgIFxuXHQiICAgICAgXAorICAibXVsICAgICAgICAgICAgICVbIiAjVEVNUDEyICJdLCAgJVt0ZW1wMThdLCAgICAgJVtjMjIxN10gICAgICAgICBcblx0IiAgICAgIFwKKyAgIm11bCAgICAgICAgICAgICAlWyIgI1RFTVA0ICJdLCAgICVbdGVtcDE5XSwgICAgICVbYzUzNTJdICAgICAgICAgXG5cdCIgICAgICBcCisgICJtdWwgICAgICAgICAgICAgJVt0ZW1wMThdLCAgICAgJVt0ZW1wMThdLCAgICAgJVtjNTM1Ml0gICAgICAgICAgIFxuXHQiICAgICAgXAorICAiYWRkaXUgICAgICAgICAgICVbdGVtcDE2XSwgICAgICVbdGVtcDE2XSwgICAgIDcgICAgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgImFkZHUgICAgICAgICAgICAlWyIgI1RFTVAwICJdLCAgICVbdGVtcDE2XSwgICAgICVbdGVtcDE3XSAgICAgICAgXG5cdCIgICAgICBcCisgICJzcmEgICAgICAgICAgICAgJVsiICNURU1QMCAiXSwgICAlWyIgI1RFTVAwICJdLCAgIDQgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAiYWRkdSAgICAgICAgICAgICVbIiAjVEVNUDEyICJdLCAgJVsiICNURU1QMTIgIl0sICAlWyIgI1RFTVA0ICJdICBcblx0IiAgICAgIFwKKyAgInN1YnUgICAgICAgICAgICAlWyIgI1RFTVA0ICJdLCAgICVbdGVtcDE2XSwgICAgICVbdGVtcDE3XSAgICAgICAgXG5cdCIgICAgICBcCisgICJzcmEgICAgICAgICAgICAgJVsiICNURU1QNCAiXSwgICAlWyIgI1RFTVA0ICJdLCAgIDQgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAiYWRkaXUgICAgICAgICAgICVbIiAjVEVNUDggIl0sICAgJVsiICNURU1QOCAiXSwgICAzMDAwMCAgICAgICAgICBcblx0IiAgICAgIFwKKyAgImFkZGl1ICAgICAgICAgICAlWyIgI1RFTVAxMiAiXSwgICVbIiAjVEVNUDEyICJdLCAgMTIwMDAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJhZGRpdSAgICAgICAgICAgJVsiICNURU1QOCAiXSwgICAlWyIgI1RFTVA4ICJdLCAgIDIxMDAwICAgICAgICAgIFxuXHQiICAgICAgXAorICAic3VidSAgICAgICAgICAgICVbIiAjVEVNUDggIl0sICAgJVsiICNURU1QOCAiXSwgICAlW3RlbXAxOF0gICAgICBcblx0IiAgICAgIFwKKyAgInNyYSAgICAgICAgICAgICAlWyIgI1RFTVAxMiAiXSwgICVbIiAjVEVNUDEyICJdLCAgMTYgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJzcmEgICAgICAgICAgICAgJVsiICNURU1QOCAiXSwgICAlWyIgI1RFTVA4ICJdLCAgIDE2ICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAiYWRkaXUgICAgICAgICAgICVbdGVtcDE2XSwgICAgICVbIiAjVEVNUDEyICJdLCAgMSAgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgIm1vdm4gICAgICAgICAgICAlWyIgI1RFTVAxMiAiXSwgICVbdGVtcDE2XSwgICAgICVbdGVtcDE5XSAgICAgICAgXG5cdCIgICAgICBcCisgICJzaCAgICAgICAgICAgICAgJVsiICNURU1QMCAiXSwgICAiICNBICIoJVt0ZW1wMjBdKSAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAic2ggICAgICAgICAgICAgICVbIiAjVEVNUDQgIl0sICAgIiAjQyAiKCVbdGVtcDIwXSkgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgInNoICAgICAgICAgICAgICAlWyIgI1RFTVA4ICJdLCAgICIgI0QgIiglW3RlbXAyMF0pICAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJzaCAgICAgICAgICAgICAgJVsiICNURU1QMTIgIl0sICAiICNCICIoJVt0ZW1wMjBdKSAgICAgICAgICAgICAgIFxuXHQiCisKK3N0YXRpYyB2b2lkIEZUcmFuc2Zvcm1fTUlQU2RzcFIyKGNvbnN0IHVpbnQ4X3QqIHNyYywgY29uc3QgdWludDhfdCogcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCogb3V0KSB7CisgIGNvbnN0IGludCBjMjIxNyA9IDIyMTc7CisgIGNvbnN0IGludCBjNTM1MiA9IDUzNTI7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNiwgdGVtcDcsIHRlbXA4OworICBpbnQgdGVtcDksIHRlbXAxMCwgdGVtcDExLCB0ZW1wMTIsIHRlbXAxMywgdGVtcDE0LCB0ZW1wMTUsIHRlbXAxNjsKKyAgaW50IHRlbXAxNywgdGVtcDE4LCB0ZW1wMTksIHRlbXAyMDsKKyAgY29uc3QgaW50KiBjb25zdCBhcmdzWzNdID0KKyAgICAgIHsgKGNvbnN0IGludCopc3JjLCAoY29uc3QgaW50KilyZWYsIChjb25zdCBpbnQqKW91dCB9OworCisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgIEhPUklaT05UQUxfUEFTUygwLCB0ZW1wMCwgIHRlbXAxLCAgdGVtcDIsICB0ZW1wMykKKyAgICBIT1JJWk9OVEFMX1BBU1MoMSwgdGVtcDQsICB0ZW1wNSwgIHRlbXA2LCAgdGVtcDcpCisgICAgSE9SSVpPTlRBTF9QQVNTKDIsIHRlbXA4LCAgdGVtcDksICB0ZW1wMTAsIHRlbXAxMSkKKyAgICBIT1JJWk9OVEFMX1BBU1MoMywgdGVtcDEyLCB0ZW1wMTMsIHRlbXAxNCwgdGVtcDE1KQorICAgICJsdyAgICAgICAgICAgICVbdGVtcDIwXSwgICAgIDgoJVthcmdzXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgIFZFUlRJQ0FMX1BBU1MoMCwgIDgsIDE2LCAyNCwgdGVtcDAsIHRlbXA0LCB0ZW1wOCwgIHRlbXAxMikKKyAgICBWRVJUSUNBTF9QQVNTKDIsIDEwLCAxOCwgMjYsIHRlbXAxLCB0ZW1wNSwgdGVtcDksICB0ZW1wMTMpCisgICAgVkVSVElDQUxfUEFTUyg0LCAxMiwgMjAsIDI4LCB0ZW1wMiwgdGVtcDYsIHRlbXAxMCwgdGVtcDE0KQorICAgIFZFUlRJQ0FMX1BBU1MoNiwgMTQsIDIyLCAzMCwgdGVtcDMsIHRlbXA3LCB0ZW1wMTEsIHRlbXAxNSkKKyAgICBPVVRQVVRfRUFSTFlfQ0xPQkJFUl9SRUdTXzE4KCksCisgICAgICBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDE5XSI9JnIiKHRlbXAxOSksIFt0ZW1wMjBdIj0mciIodGVtcDIwKQorICAgIDogW2FyZ3NdInIiKGFyZ3MpLCBbYzIyMTddInIiKGMyMjE3KSwgW2M1MzUyXSJyIihjNTM1MikKKyAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iCisgICk7Cit9CisKKyN1bmRlZiBWRVJUSUNBTF9QQVNTCisjdW5kZWYgSE9SSVpPTlRBTF9QQVNTCisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIElUcmFuc2Zvcm1PbmUoY29uc3QgdWludDhfdCogcmVmLCBjb25zdCBpbnQxNl90KiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0KSB7CisgIGludCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXA5OworICBpbnQgdGVtcDEwLCB0ZW1wMTEsIHRlbXAxMiwgdGVtcDEzLCB0ZW1wMTQsIHRlbXAxNSwgdGVtcDE2LCB0ZW1wMTcsIHRlbXAxODsKKworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAidWx3ICAgICAgICAgICAgICAlW3RlbXAxXSwgICAwKCVbaW5dKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAidWx3ICAgICAgICAgICAgICAlW3RlbXAyXSwgICAxNiglW2luXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICBMT0FEX0lOX1gyKHRlbXA1LCB0ZW1wNiwgMjQsIDI2KQorICAgIEFERF9TVUJfSEFMVkVTKHRlbXAzLCB0ZW1wNCwgdGVtcDEsIHRlbXAyKQorICAgIExPQURfSU5fWDIodGVtcDEsIHRlbXAyLCA4LCAxMCkKKyAgICBNVUxfU0hJRlRfU1VNKHRlbXA3LCB0ZW1wOCwgdGVtcDksIHRlbXAxMCwgdGVtcDExLCB0ZW1wMTIsIHRlbXAxMywgdGVtcDE0LAorICAgICAgICAgICAgICAgICAgdGVtcDEwLCB0ZW1wOCwgdGVtcDksIHRlbXA3LCB0ZW1wMSwgdGVtcDIsIHRlbXA1LCB0ZW1wNiwKKyAgICAgICAgICAgICAgICAgIHRlbXAxMywgdGVtcDExLCB0ZW1wMTQsIHRlbXAxMikKKyAgICBJTlNFUlRfSEFMRl9YMih0ZW1wOCwgdGVtcDcsIHRlbXAxMCwgdGVtcDkpCisgICAgInVsdyAgICAgICAgICAgICAgJVt0ZW1wMTddLCAgNCglW2luXSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInVsdyAgICAgICAgICAgICAgJVt0ZW1wMThdLCAgMjAoJVtpbl0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgQUREX1NVQl9IQUxWRVModGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDgpCisgICAgQUREX1NVQl9IQUxWRVModGVtcDUsIHRlbXA2LCB0ZW1wNCwgdGVtcDcpCisgICAgQUREX1NVQl9IQUxWRVModGVtcDcsIHRlbXA4LCB0ZW1wMTcsIHRlbXAxOCkKKyAgICBMT0FEX0lOX1gyKHRlbXAxNywgdGVtcDE4LCAxMiwgMTQpCisgICAgTE9BRF9JTl9YMih0ZW1wOSwgdGVtcDEwLCAyOCwgMzApCisgICAgTVVMX1NISUZUX1NVTSh0ZW1wMTEsIHRlbXAxMiwgdGVtcDEzLCB0ZW1wMTQsIHRlbXAxNSwgdGVtcDE2LCB0ZW1wNCwgdGVtcDE3LAorICAgICAgICAgICAgICAgICAgdGVtcDEyLCB0ZW1wMTQsIHRlbXAxMSwgdGVtcDEzLCB0ZW1wMTcsIHRlbXAxOCwgdGVtcDksIHRlbXAxMCwKKyAgICAgICAgICAgICAgICAgIHRlbXAxNSwgdGVtcDQsIHRlbXAxNiwgdGVtcDE3KQorICAgIElOU0VSVF9IQUxGX1gyKHRlbXAxMSwgdGVtcDEyLCB0ZW1wMTMsIHRlbXAxNCkKKyAgICBBRERfU1VCX0hBTFZFUyh0ZW1wMTcsIHRlbXA4LCB0ZW1wOCwgdGVtcDExKQorICAgIEFERF9TVUJfSEFMVkVTKHRlbXAzLCB0ZW1wNCwgdGVtcDcsIHRlbXAxMikKKworICAgIC8vIGhvcml6b250YWwKKyAgICBTUkFfMTYodGVtcDksIHRlbXAxMCwgdGVtcDExLCB0ZW1wMTIsIHRlbXAxLCB0ZW1wMiwgdGVtcDUsIHRlbXA2KQorICAgIElOU0VSVF9IQUxGX1gyKHRlbXAxLCB0ZW1wNiwgdGVtcDUsIHRlbXAyKQorICAgIFNSQV8xNih0ZW1wMTMsIHRlbXAxNCwgdGVtcDE1LCB0ZW1wMTYsIHRlbXAzLCB0ZW1wNCwgdGVtcDE3LCB0ZW1wOCkKKyAgICAicmVwbC5waCAgICAgICAgICAlW3RlbXAyXSwgICAweDQgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICBJTlNFUlRfSEFMRl9YMih0ZW1wMywgdGVtcDgsIHRlbXAxNywgdGVtcDQpCisgICAgImFkZHEucGggICAgICAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICAlW3RlbXAyXSAgICAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wNl0sICAlW3RlbXAyXSAgICAgIFxuXHQiCisgICAgQUREX1NVQl9IQUxWRVModGVtcDIsIHRlbXA0LCB0ZW1wMSwgdGVtcDMpCisgICAgQUREX1NVQl9IQUxWRVModGVtcDUsIHRlbXA3LCB0ZW1wNiwgdGVtcDgpCisgICAgTVVMX1NISUZUX1NVTSh0ZW1wMSwgdGVtcDMsIHRlbXA2LCB0ZW1wOCwgdGVtcDksIHRlbXAxMywgdGVtcDE3LCB0ZW1wMTgsCisgICAgICAgICAgICAgICAgICB0ZW1wMywgdGVtcDEzLCB0ZW1wMSwgdGVtcDksIHRlbXA5LCB0ZW1wMTMsIHRlbXAxMSwgdGVtcDE1LAorICAgICAgICAgICAgICAgICAgdGVtcDYsIHRlbXAxNywgdGVtcDgsIHRlbXAxOCkKKyAgICBNVUxfU0hJRlRfU1VNKHRlbXA2LCB0ZW1wOCwgdGVtcDE4LCB0ZW1wMTcsIHRlbXAxMSwgdGVtcDE1LCB0ZW1wMTIsIHRlbXAxNiwKKyAgICAgICAgICAgICAgICAgIHRlbXA4LCB0ZW1wMTUsIHRlbXA2LCB0ZW1wMTEsIHRlbXAxMiwgdGVtcDE2LCB0ZW1wMTAsIHRlbXAxNCwKKyAgICAgICAgICAgICAgICAgIHRlbXAxOCwgdGVtcDEyLCB0ZW1wMTcsIHRlbXAxNikKKyAgICBJTlNFUlRfSEFMRl9YMih0ZW1wMSwgdGVtcDMsIHRlbXA5LCB0ZW1wMTMpCisgICAgSU5TRVJUX0hBTEZfWDIodGVtcDYsIHRlbXA4LCB0ZW1wMTEsIHRlbXAxNSkKKyAgICBTSElGVF9SX1NVTV9YMih0ZW1wOSwgdGVtcDEwLCB0ZW1wMTEsIHRlbXAxMiwgdGVtcDEzLCB0ZW1wMTQsIHRlbXAxNSwKKyAgICAgICAgICAgICAgICAgICB0ZW1wMTYsIHRlbXAyLCB0ZW1wNCwgdGVtcDUsIHRlbXA3LCB0ZW1wMywgdGVtcDEsIHRlbXA4LAorICAgICAgICAgICAgICAgICAgIHRlbXA2KQorICAgIFBBQ0tfMl9IQUxWRVNfVE9fV09SRCh0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDksIHRlbXAxMiwgdGVtcDEzLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMTYsIHRlbXAxMSwgdGVtcDEwLCB0ZW1wMTUsIHRlbXAxNCkKKyAgICBMT0FEX1dJVEhfT0ZGU0VUX1g0KHRlbXAxMCwgdGVtcDExLCB0ZW1wMTQsIHRlbXAxNSwgcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDEsIDIsIDMsCisgICAgICAgICAgICAgICAgICAgICAgICBCUFMpCisgICAgQ09OVkVSVF8yX0JZVEVTX1RPX0hBTEYodGVtcDUsIHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXAxNywgdGVtcDE4LCB0ZW1wMTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDExLCB0ZW1wMTAsIHRlbXAxMSwgdGVtcDE0LCB0ZW1wMTUpCisgICAgU1RPUkVfU0FUX1NVTV9YMih0ZW1wNSwgdGVtcDYsIHRlbXA3LCB0ZW1wOCwgdGVtcDE3LCB0ZW1wMTgsIHRlbXAxMCwgdGVtcDExLAorICAgICAgICAgICAgICAgICAgICAgdGVtcDksIHRlbXAxMiwgdGVtcDEsIHRlbXAyLCB0ZW1wMTMsIHRlbXAxNiwgdGVtcDMsIHRlbXA0LAorICAgICAgICAgICAgICAgICAgICAgZHN0LCAwLCAxLCAyLCAzLCBCUFMpCisKKyAgICBPVVRQVVRfRUFSTFlfQ0xPQkJFUl9SRUdTXzE4KCkKKyAgICA6IFtkc3RdInIiKGRzdCksIFtpbl0iciIoaW4pLCBba0MxXSJyIihrQzEpLCBba0MyXSJyIihrQzIpLCBbcmVmXSJyIihyZWYpCisgICAgOiAibWVtb3J5IiwgImhpIiwgImxvIgorICApOworfQorCitzdGF0aWMgdm9pZCBJVHJhbnNmb3JtX01JUFNkc3BSMihjb25zdCB1aW50OF90KiByZWYsIGNvbnN0IGludDE2X3QqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgZG9fdHdvKSB7CisgIElUcmFuc2Zvcm1PbmUocmVmLCBpbiwgZHN0KTsKKyAgaWYgKGRvX3R3bykgeworICAgIElUcmFuc2Zvcm1PbmUocmVmICsgNCwgaW4gKyAxNiwgZHN0ICsgNCk7CisgIH0KK30KKworc3RhdGljIGludCBEaXN0bzR4NF9NSVBTZHNwUjIoY29uc3QgdWludDhfdCogY29uc3QgYSwgY29uc3QgdWludDhfdCogY29uc3QgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90KiBjb25zdCB3KSB7CisgIGludCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXA5OworICBpbnQgdGVtcDEwLCB0ZW1wMTEsIHRlbXAxMiwgdGVtcDEzLCB0ZW1wMTQsIHRlbXAxNSwgdGVtcDE2LCB0ZW1wMTc7CisKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgTE9BRF9XSVRIX09GRlNFVF9YNCh0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAxLCAyLCAzLAorICAgICAgICAgICAgICAgICAgICAgICAgQlBTKQorICAgIENPTlZFUlRfMl9CWVRFU19UT19IQUxGKHRlbXA1LCB0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wOSx0ZW1wMTAsIHRlbXAxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMTIsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0KQorICAgIEFERF9TVUJfSEFMVkVTX1g0KHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3LCB0ZW1wOCwKKyAgICAgICAgICAgICAgICAgICAgICB0ZW1wNSwgdGVtcDYsIHRlbXA3LCB0ZW1wOCwgdGVtcDksIHRlbXAxMCwgdGVtcDExLCB0ZW1wMTIpCisgICAgUEFDS18yX0hBTFZFU19UT19XT1JEKHRlbXA5LCB0ZW1wMTAsIHRlbXAxMSwgdGVtcDEyLCB0ZW1wMSwgdGVtcDMsIHRlbXA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wNywgdGVtcDIsIHRlbXA0LCB0ZW1wNiwgdGVtcDgpCisgICAgQUREX1NVQl9IQUxWRVNfWDQodGVtcDIsIHRlbXA0LCB0ZW1wNiwgdGVtcDgsIHRlbXA5LCB0ZW1wMSwgdGVtcDMsIHRlbXAxMCwKKyAgICAgICAgICAgICAgICAgICAgICB0ZW1wMSwgdGVtcDksIHRlbXAzLCB0ZW1wMTAsIHRlbXA1LCB0ZW1wMTEsIHRlbXA3LCB0ZW1wMTIpCisgICAgQUREX1NVQl9IQUxWRVNfWDQodGVtcDUsIHRlbXAxMSwgdGVtcDcsIHRlbXAyLCB0ZW1wOSwgdGVtcDMsIHRlbXA2LCB0ZW1wMTIsCisgICAgICAgICAgICAgICAgICAgICAgdGVtcDIsIHRlbXA5LCB0ZW1wNiwgdGVtcDMsIHRlbXA0LCB0ZW1wMSwgdGVtcDgsIHRlbXAxMCkKKyAgICBBRERfU1VCX0hBTFZFU19YNCh0ZW1wMSwgdGVtcDQsIHRlbXAxMCwgdGVtcDgsIHRlbXA3LCB0ZW1wMTEsIHRlbXA1LCB0ZW1wMiwKKyAgICAgICAgICAgICAgICAgICAgICB0ZW1wNSwgdGVtcDcsIHRlbXAxMSwgdGVtcDIsIHRlbXA5LCB0ZW1wNiwgdGVtcDMsIHRlbXAxMikKKyAgICBBQlNfWDgodGVtcDEsIHRlbXA0LCB0ZW1wMTAsIHRlbXA4LCB0ZW1wNywgdGVtcDExLCB0ZW1wNSwgdGVtcDIpCisgICAgTE9BRF9XSVRIX09GRlNFVF9YNCh0ZW1wMywgdGVtcDYsIHRlbXA5LCB0ZW1wMTIsIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCA0LCA4LCAxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAwKQorICAgIExPQURfV0lUSF9PRkZTRVRfWDQodGVtcDEzLCB0ZW1wMTQsIHRlbXAxNSwgdGVtcDE2LCB3LAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgNCwgOCwgMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAxLCAxLCAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgMTYpCisgICAgTVVMX0hBTEYodGVtcDE3LCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA2LCB0ZW1wNywgdGVtcDgsCisgICAgICAgICAgICAgdGVtcDksIHRlbXAxMCwgdGVtcDExLCB0ZW1wMTIsIHRlbXAxMywgdGVtcDE0LCB0ZW1wMTUsIHRlbXAxNikKKyAgICBMT0FEX1dJVEhfT0ZGU0VUX1g0KHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDEsIDIsIDMsCisgICAgICAgICAgICAgICAgICAgICAgICBCUFMpCisgICAgQ09OVkVSVF8yX0JZVEVTX1RPX0hBTEYodGVtcDUsdGVtcDYsIHRlbXA3LCB0ZW1wOCwgdGVtcDksdGVtcDEwLCB0ZW1wMTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDEyLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCkKKyAgICBBRERfU1VCX0hBTFZFU19YNCh0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA2LCB0ZW1wNywgdGVtcDgsCisgICAgICAgICAgICAgICAgICAgICAgdGVtcDUsIHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXA5LCB0ZW1wMTAsIHRlbXAxMSwgdGVtcDEyKQorICAgIFBBQ0tfMl9IQUxWRVNfVE9fV09SRCh0ZW1wOSwgdGVtcDEwLCB0ZW1wMTEsIHRlbXAxMiwgdGVtcDEsIHRlbXAzLCB0ZW1wNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDcsIHRlbXAyLCB0ZW1wNCwgdGVtcDYsIHRlbXA4KQorICAgIEFERF9TVUJfSEFMVkVTX1g0KHRlbXAyLCB0ZW1wNCwgdGVtcDYsIHRlbXA4LCB0ZW1wOSwgdGVtcDEsIHRlbXAzLCB0ZW1wMTAsCisgICAgICAgICAgICAgICAgICAgICAgdGVtcDEsIHRlbXA5LCB0ZW1wMywgdGVtcDEwLCB0ZW1wNSwgdGVtcDExLCB0ZW1wNywgdGVtcDEyKQorICAgIEFERF9TVUJfSEFMVkVTX1g0KHRlbXA1LCB0ZW1wMTEsIHRlbXA3LCB0ZW1wMiwgdGVtcDksIHRlbXAzLCB0ZW1wNiwgdGVtcDEyLAorICAgICAgICAgICAgICAgICAgICAgIHRlbXAyLCB0ZW1wOSwgdGVtcDYsIHRlbXAzLCB0ZW1wNCwgdGVtcDEsIHRlbXA4LCB0ZW1wMTApCisgICAgQUREX1NVQl9IQUxWRVNfWDQodGVtcDEsIHRlbXA0LCB0ZW1wMTAsIHRlbXA4LCB0ZW1wNywgdGVtcDExLCB0ZW1wNSwgdGVtcDIsCisgICAgICAgICAgICAgICAgICAgICAgdGVtcDUsIHRlbXA3LCB0ZW1wMTEsIHRlbXAyLCB0ZW1wOSwgdGVtcDYsIHRlbXAzLCB0ZW1wMTIpCisgICAgQUJTX1g4KHRlbXAxLCB0ZW1wNCwgdGVtcDEwLCB0ZW1wOCwgdGVtcDcsIHRlbXAxMSwgdGVtcDUsIHRlbXAyKQorICAgIExPQURfV0lUSF9PRkZTRVRfWDQodGVtcDMsIHRlbXA2LCB0ZW1wOSwgdGVtcDEyLCB3LAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgNCwgOCwgMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgMCkKKyAgICBMT0FEX1dJVEhfT0ZGU0VUX1g0KHRlbXAxMywgdGVtcDE0LCB0ZW1wMTUsIHRlbXAxNiwgdywKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDQsIDgsIDEyLAorICAgICAgICAgICAgICAgICAgICAgICAgMSwgMSwgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDE2KQorICAgIE1VTF9IQUxGKHRlbXAzLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA2LCB0ZW1wNywgdGVtcDgsCisgICAgICAgICAgICAgdGVtcDksIHRlbXAxMCwgdGVtcDExLCB0ZW1wMTIsIHRlbXAxMywgdGVtcDE0LCB0ZW1wMTUsIHRlbXAxNikKKyAgICBPVVRQVVRfRUFSTFlfQ0xPQkJFUl9SRUdTXzE3KCkKKyAgICA6IFthXSJyIihhKSwgW2JdInIiKGIpLCBbd10iciIodykKKyAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iCisgICk7CisgIHJldHVybiBhYnModGVtcDMgLSB0ZW1wMTcpID4+IDU7Cit9CisKK3N0YXRpYyBpbnQgRGlzdG8xNngxNl9NSVBTZHNwUjIoY29uc3QgdWludDhfdCogY29uc3QgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QqIGNvbnN0IHcpIHsKKyAgaW50IEQgPSAwOworICBpbnQgeCwgeTsKKyAgZm9yICh5ID0gMDsgeSA8IDE2ICogQlBTOyB5ICs9IDQgKiBCUFMpIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgMTY7IHggKz0gNCkgeworICAgICAgRCArPSBEaXN0bzR4NF9NSVBTZHNwUjIoYSArIHggKyB5LCBiICsgeCArIHksIHcpOworICAgIH0KKyAgfQorICByZXR1cm4gRDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEludHJhIHByZWRpY3Rpb25zCisKKyNkZWZpbmUgRklMTF9QQVJUKEosIFNJWkUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInVzdyAgICAgICAgJVt2YWx1ZV0sICAwKyIgI0ogIioiIFhTVFIoQlBTKSAiKCVbZHN0XSkgIFxuXHQiICAgICAgXAorICAgICJ1c3cgICAgICAgICVbdmFsdWVdLCAgNCsiICNKICIqIiBYU1RSKEJQUykgIiglW2RzdF0pICBcblx0IiAgICAgIFwKKyAgIi5pZiAiICNTSVpFICIgPT0gMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICAgInVzdyAgICAgICAgJVt2YWx1ZV0sICA4KyIgI0ogIioiIFhTVFIoQlBTKSAiKCVbZHN0XSkgIFxuXHQiICAgICAgXAorICAgICJ1c3cgICAgICAgICVbdmFsdWVdLCAxMisiICNKICIqIiBYU1RSKEJQUykgIiglW2RzdF0pICBcblx0IiAgICAgIFwKKyAgIi5lbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworI2RlZmluZSBGSUxMXzhfT1JfMTYoRFNULCBWQUxVRSwgU0laRSkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludCB2YWx1ZSA9IChWQUxVRSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19hc21fXyB2b2xhdGlsZSAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJyZXBsdi5xYiAgICVbdmFsdWVdLCAgJVt2YWx1ZV0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICAgRklMTF9QQVJUKCAwLCBTSVpFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGSUxMX1BBUlQoIDEsIFNJWkUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZJTExfUEFSVCggMiwgU0laRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRklMTF9QQVJUKCAzLCBTSVpFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGSUxMX1BBUlQoIDQsIFNJWkUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZJTExfUEFSVCggNSwgU0laRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRklMTF9QQVJUKCA2LCBTSVpFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGSUxMX1BBUlQoIDcsIFNJWkUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmlmICIgI1NJWkUgIiA9PSAxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICAgRklMTF9QQVJUKCA4LCAxNikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGSUxMX1BBUlQoIDksIDE2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZJTExfUEFSVCgxMCwgMTYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRklMTF9QQVJUKDExLCAxNikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGSUxMX1BBUlQoMTIsIDE2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZJTExfUEFSVCgxMywgMTYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRklMTF9QQVJUKDE0LCAxNikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGSUxMX1BBUlQoMTUsIDE2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmVuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICAgOiBbdmFsdWVdIismciIodmFsdWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA6IFtkc3RdInIiKChEU1QpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDogIm1lbW9yeSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgVkVSVElDQUxfUFJFRChEU1QsIFRPUCwgU0laRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWZXJ0aWNhbFByZWQjI1NJWkUodWludDhfdCogKERTVCksICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIChUT1ApKSB7ICAgICAgICAgICAgIFwKKyAgaW50IGo7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmICgoVE9QKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaiA9IDA7IGogPCAoU0laRSk7ICsraikgbWVtY3B5KChEU1QpICsgaiAqIEJQUywgKFRPUCksIChTSVpFKSk7ICAgICAgIFwKKyAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRklMTF84X09SXzE2KChEU1QpLCAxMjcsIChTSVpFKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworVkVSVElDQUxfUFJFRChkc3QsIHRvcCwgOCkKK1ZFUlRJQ0FMX1BSRUQoZHN0LCB0b3AsIDE2KQorCisjdW5kZWYgVkVSVElDQUxfUFJFRAorCisjZGVmaW5lIEhPUklaT05UQUxfUFJFRChEU1QsIExFRlQsIFNJWkUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgSG9yaXpvbnRhbFByZWQjI1NJWkUodWludDhfdCogKERTVCksICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIChMRUZUKSkgeyAgICAgICAgICBcCisgIGlmIChMRUZUKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBqOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGogPSAwOyBqIDwgKFNJWkUpOyArK2opIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBtZW1zZXQoKERTVCkgKyBqICogQlBTLCAoTEVGVClbal0sIChTSVpFKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRklMTF84X09SXzE2KChEU1QpLCAxMjksIChTSVpFKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworSE9SSVpPTlRBTF9QUkVEKGRzdCwgbGVmdCwgOCkKK0hPUklaT05UQUxfUFJFRChkc3QsIGxlZnQsIDE2KQorCisjdW5kZWYgSE9SSVpPTlRBTF9QUkVECisKKyNkZWZpbmUgQ0xJUFBJTkcoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJwcmVjZXUucGgucWJsICAgJVt0ZW1wMl0sICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAicHJlY2V1LnBoLnFiciAgICVbdGVtcDBdLCAgICVbdGVtcDBdICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgInByZWNldS5waC5xYmwgICAlW3RlbXAzXSwgICAlW3RlbXAxXSAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICJwcmVjZXUucGgucWJyICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAiYWRkdS5waCAgICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgICVbbGVmdFlfMV0gICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgImFkZHUucGggICAgICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgICAlW2xlZnRZXzFdICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICJhZGR1LnBoICAgICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wM10sICAgJVtsZWZ0WV8xXSAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAiYWRkdS5waCAgICAgICAgICVbdGVtcDFdLCAgICVbdGVtcDFdLCAgICVbbGVmdFlfMV0gICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgInNobGxfcy5waCAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICA3ICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICJzaGxsX3MucGggICAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgNyAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAic2hsbF9zLnBoICAgICAgICVbdGVtcDNdLCAgICVbdGVtcDNdLCAgIDcgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgInNobGxfcy5waCAgICAgICAlW3RlbXAxXSwgICAlW3RlbXAxXSwgICA3ICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICJwcmVjcnF1X3MucWIucGggJVt0ZW1wMF0sICAgJVt0ZW1wMl0sICAgJVt0ZW1wMF0gICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAicHJlY3JxdV9zLnFiLnBoICVbdGVtcDFdLCAgICVbdGVtcDNdLCAgICVbdGVtcDFdICAgICAgXG5cdCIKKworI2RlZmluZSBDTElQXzhCX1RPX0RTVChEU1QsIExFRlQsIFRPUCwgU0laRSkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50IGxlZnRZXzEgPSAoKGludCkoTEVGVClbeV0gPDwgMTYpICsgKExFRlQpW3ldOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2FzbV9fIHZvbGF0aWxlICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicmVwbHYucGggICAgICAgICVbbGVmdFlfMV0sICVbbGVmdFlfMV0gICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICAgInVsdyAgICAgICAgICAgICAlW3RlbXAwXSwgICAwKCVbdG9wXSkgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAgICJ1bHcgICAgICAgICAgICAgJVt0ZW1wMV0sICAgNCglW3RvcF0pICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgICAic3VidS5waCAgICAgICAgICVbbGVmdFlfMV0sICVbbGVmdFlfMV0sICVbbGVmdF8xXSAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICAgQ0xJUFBJTkcoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJ1c3cgICAgICAgICAgICAgJVt0ZW1wMF0sICAgMCglW2RzdF0pICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgICAidXN3ICAgICAgICAgICAgICVbdGVtcDFdLCAgIDQoJVtkc3RdKSAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICIuaWYgIiAjU0laRSAiID09IDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAgICJ1bHcgICAgICAgICAgICAgJVt0ZW1wMF0sICAgOCglW3RvcF0pICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgICAidWx3ICAgICAgICAgICAgICVbdGVtcDFdLCAgIDEyKCVbdG9wXSkgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICAgQ0xJUFBJTkcoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJ1c3cgICAgICAgICAgICAgJVt0ZW1wMF0sICAgOCglW2RzdF0pICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgICAidXN3ICAgICAgICAgICAgICVbdGVtcDFdLCAgIDEyKCVbZHN0XSkgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICIuZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAgIDogW2xlZnRZXzFdIismciIobGVmdFlfMSksIFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksICAgICAgIFwKKyAgICAgIFt0ZW1wMl0iPSZyIih0ZW1wMiksIFt0ZW1wM10iPSZyIih0ZW1wMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgOiBbbGVmdF8xXSJyIihsZWZ0XzEpLCBbdG9wXSJyIigoVE9QKSksIFtkc3RdInIiKChEU1QpKSAgICAgICAgICAgICAgICAgICAgXAorICAgIDogIm1lbW9yeSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIENMSVBfVE9fRFNUKERTVCwgTEVGVCwgVE9QLCBTSVpFKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnQgeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgaW50IGxlZnRfMSA9ICgoaW50KShMRUZUKVstMV0gPDwgMTYpICsgKExFRlQpWy0xXTsgICAgICAgICAgICAgICAgICAgICBcCisgIGZvciAoeSA9IDA7IHkgPCAoU0laRSk7ICsreSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIENMSVBfOEJfVE9fRFNUKChEU1QpLCAoTEVGVCksIChUT1ApLCAoU0laRSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoRFNUKSArPSBCUFM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBUUlVFX01PVElPTihEU1QsIExFRlQsIFRPUCwgU0laRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFRydWVNb3Rpb24jI1NJWkUodWludDhfdCogKERTVCksIGNvbnN0IHVpbnQ4X3QqIChMRUZUKSxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIChUT1ApKSB7ICAgICAgICAgICAgICAgXAorICBpZiAoKExFRlQpICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKFRPUCkgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDTElQX1RPX0RTVCgoRFNUKSwgKExFRlQpLCAoVE9QKSwgKFNJWkUpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEhvcml6b250YWxQcmVkIyNTSVpFKChEU1QpLCAoTEVGVCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiB0cnVlIG1vdGlvbiB3aXRob3V0IGxlZnQgc2FtcGxlcyAoaGVuY2U6IHdpdGggZGVmYXVsdCAxMjkgdmFsdWUpICAgICovICBcCisgICAgLyogaXMgZXF1aXZhbGVudCB0byBWRSBwcmVkaWN0aW9uIHdoZXJlIHlvdSBqdXN0IGNvcHkgdGhlIHRvcCBzYW1wbGVzLiAqLyAgXAorICAgIC8qIE5vdGUgdGhhdCBpZiB0b3Agc2FtcGxlcyBhcmUgbm90IGF2YWlsYWJsZSwgdGhlIGRlZmF1bHQgdmFsdWUgaXMgICAgKi8gIFwKKyAgICAvKiB0aGVuIDEyOSwgYW5kIG5vdCAxMjcgYXMgaW4gdGhlIFZlcnRpY2FsUHJlZCBjYXNlLiAgICAgICAgICAgICAgICAgICovICBcCisgICAgaWYgKChUT1ApICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgVmVydGljYWxQcmVkIyNTSVpFKChEU1QpLCAoVE9QKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBGSUxMXzhfT1JfMTYoKERTVCksIDEyOSwgKFNJWkUpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK1RSVUVfTU9USU9OKGRzdCwgbGVmdCwgdG9wLCA4KQorVFJVRV9NT1RJT04oZHN0LCBsZWZ0LCB0b3AsIDE2KQorCisjdW5kZWYgVFJVRV9NT1RJT04KKyN1bmRlZiBDTElQX1RPX0RTVAorI3VuZGVmIENMSVBfOEJfVE9fRFNUCisjdW5kZWYgQ0xJUFBJTkcKKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRENNb2RlMTYodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdG9wKSB7CisgIGludCBEQywgREMxOworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDM7CisKKyAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAiYmVxeiAgICAgICAgJVt0b3BdLCAgIDJmICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICBMT0FEX1dJVEhfT0ZGU0VUX1g0KHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCA0LCA4LCAxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAwKQorICAgICJyYWRkdS53LnFiICAlW3RlbXAwXSwgJVt0ZW1wMF0gICAgICAgICAgICBcblx0IgorICAgICJyYWRkdS53LnFiICAlW3RlbXAxXSwgJVt0ZW1wMV0gICAgICAgICAgICBcblx0IgorICAgICJyYWRkdS53LnFiICAlW3RlbXAyXSwgJVt0ZW1wMl0gICAgICAgICAgICBcblx0IgorICAgICJyYWRkdS53LnFiICAlW3RlbXAzXSwgJVt0ZW1wM10gICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgICAlW3RlbXAwXSwgJVt0ZW1wMF0sICVbdGVtcDFdICBcblx0IgorICAgICJhZGR1ICAgICAgICAlW3RlbXAyXSwgJVt0ZW1wMl0sICVbdGVtcDNdICBcblx0IgorICAgICJhZGR1ICAgICAgICAlW0RDXSwgICAgJVt0ZW1wMF0sICVbdGVtcDJdICBcblx0IgorICAgICJtb3ZlICAgICAgICAlW0RDMV0sICAgJVtEQ10gICAgICAgICAgICAgICBcblx0IgorICAgICJiZXF6ICAgICAgICAlW2xlZnRdLCAgMWYgICAgICAgICAgICAgICAgICBcblx0IgorICAgIExPQURfV0lUSF9PRkZTRVRfWDQodGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCA0LCA4LCAxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAwKQorICAgICJyYWRkdS53LnFiICAlW3RlbXAwXSwgJVt0ZW1wMF0gICAgICAgICAgICBcblx0IgorICAgICJyYWRkdS53LnFiICAlW3RlbXAxXSwgJVt0ZW1wMV0gICAgICAgICAgICBcblx0IgorICAgICJyYWRkdS53LnFiICAlW3RlbXAyXSwgJVt0ZW1wMl0gICAgICAgICAgICBcblx0IgorICAgICJyYWRkdS53LnFiICAlW3RlbXAzXSwgJVt0ZW1wM10gICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgICAlW3RlbXAwXSwgJVt0ZW1wMF0sICVbdGVtcDFdICBcblx0IgorICAgICJhZGR1ICAgICAgICAlW3RlbXAyXSwgJVt0ZW1wMl0sICVbdGVtcDNdICBcblx0IgorICAgICJhZGR1ICAgICAgICAlW0RDMV0sICAgJVt0ZW1wMF0sICVbdGVtcDJdICBcblx0IgorICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgICAlW0RDXSwgICAlW0RDXSwgICAgICVbREMxXSAgICBcblx0IgorICAgICJqICAgICAgICAgICAzZiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXF6ICAgICAgICAlW2xlZnRdLCAgNGYgICAgICAgICAgICAgICAgICBcblx0IgorICAgIExPQURfV0lUSF9PRkZTRVRfWDQodGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCA0LCA4LCAxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAwKQorICAgICJyYWRkdS53LnFiICAlW3RlbXAwXSwgJVt0ZW1wMF0gICAgICAgICAgICBcblx0IgorICAgICJyYWRkdS53LnFiICAlW3RlbXAxXSwgJVt0ZW1wMV0gICAgICAgICAgICBcblx0IgorICAgICJyYWRkdS53LnFiICAlW3RlbXAyXSwgJVt0ZW1wMl0gICAgICAgICAgICBcblx0IgorICAgICJyYWRkdS53LnFiICAlW3RlbXAzXSwgJVt0ZW1wM10gICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgICAlW3RlbXAwXSwgJVt0ZW1wMF0sICVbdGVtcDFdICBcblx0IgorICAgICJhZGR1ICAgICAgICAlW3RlbXAyXSwgJVt0ZW1wMl0sICVbdGVtcDNdICBcblx0IgorICAgICJhZGR1ICAgICAgICAlW0RDXSwgICAgJVt0ZW1wMF0sICVbdGVtcDJdICBcblx0IgorICAgICJhZGR1ICAgICAgICAlW0RDXSwgICAgJVtEQ10sICAgICVbRENdICAgICBcblx0IgorICAiMzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzaHJhX3IudyAgICAlW0RDXSwgICAgJVtEQ10sICAgIDUgICAgICAgICBcblx0IgorICAgICJqICAgICAgICAgICA1ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAiNDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsaSAgICAgICAgICAlW0RDXSwgICAgMHg4MCAgICAgICAgICAgICAgICBcblx0IgorICAiNTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW0RDXSI9JnIiKERDKSwKKyAgICAgIFt0ZW1wMl0iPSZyIih0ZW1wMiksIFt0ZW1wM10iPSZyIih0ZW1wMyksIFtEQzFdIj0mciIoREMxKQorICAgIDogW2xlZnRdInIiKGxlZnQpLCBbdG9wXSJyIih0b3ApCisgICAgOiAibWVtb3J5IgorICApOworCisgIEZJTExfOF9PUl8xNihkc3QsIERDLCAxNik7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIERDTW9kZTgodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgaW50IERDLCBEQzE7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMzsKKworICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICJiZXF6ICAgICAgICAlW3RvcF0sICAgMmYgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ1bHcgICAgICAgICAlW3RlbXAwXSwgMCglW3RvcF0pICAgICAgICAgICBcblx0IgorICAgICJ1bHcgICAgICAgICAlW3RlbXAxXSwgNCglW3RvcF0pICAgICAgICAgICBcblx0IgorICAgICJyYWRkdS53LnFiICAlW3RlbXAwXSwgJVt0ZW1wMF0gICAgICAgICAgICBcblx0IgorICAgICJyYWRkdS53LnFiICAlW3RlbXAxXSwgJVt0ZW1wMV0gICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgICAlW0RDXSwgICAgJVt0ZW1wMF0sICVbdGVtcDFdICBcblx0IgorICAgICJtb3ZlICAgICAgICAlW0RDMV0sICAgJVtEQ10gICAgICAgICAgICAgICBcblx0IgorICAgICJiZXF6ICAgICAgICAlW2xlZnRdLCAgMWYgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ1bHcgICAgICAgICAlW3RlbXAyXSwgMCglW2xlZnRdKSAgICAgICAgICBcblx0IgorICAgICJ1bHcgICAgICAgICAlW3RlbXAzXSwgNCglW2xlZnRdKSAgICAgICAgICBcblx0IgorICAgICJyYWRkdS53LnFiICAlW3RlbXAyXSwgJVt0ZW1wMl0gICAgICAgICAgICBcblx0IgorICAgICJyYWRkdS53LnFiICAlW3RlbXAzXSwgJVt0ZW1wM10gICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgICAlW0RDMV0sICAgJVt0ZW1wMl0sICVbdGVtcDNdICBcblx0IgorICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgICAlW0RDXSwgICAgJVtEQ10sICAgICVbREMxXSAgICBcblx0IgorICAgICJqICAgICAgICAgICAzZiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXF6ICAgICAgICAlW2xlZnRdLCAgNGYgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ1bHcgICAgICAgICAlW3RlbXAyXSwgMCglW2xlZnRdKSAgICAgICAgICBcblx0IgorICAgICJ1bHcgICAgICAgICAlW3RlbXAzXSwgNCglW2xlZnRdKSAgICAgICAgICBcblx0IgorICAgICJyYWRkdS53LnFiICAlW3RlbXAyXSwgJVt0ZW1wMl0gICAgICAgICAgICBcblx0IgorICAgICJyYWRkdS53LnFiICAlW3RlbXAzXSwgJVt0ZW1wM10gICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgICAlW0RDXSwgICAgJVt0ZW1wMl0sICVbdGVtcDNdICBcblx0IgorICAgICJhZGR1ICAgICAgICAlW0RDXSwgICAgJVtEQ10sICAgICVbRENdICAgICBcblx0IgorICAiMzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzaHJhX3IudyAgICAlW0RDXSwgJVtEQ10sIDQgICAgICAgICAgICAgICBcblx0IgorICAgICJqICAgICAgICAgICA1ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAiNDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsaSAgICAgICAgICAlW0RDXSwgMHg4MCAgICAgICAgICAgICAgICAgICBcblx0IgorICAiNTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW0RDXSI9JnIiKERDKSwKKyAgICAgIFt0ZW1wMl0iPSZyIih0ZW1wMiksIFt0ZW1wM10iPSZyIih0ZW1wMyksIFtEQzFdIj0mciIoREMxKQorICAgIDogW2xlZnRdInIiKGxlZnQpLCBbdG9wXSJyIih0b3ApCisgICAgOiAibWVtb3J5IgorICApOworCisgIEZJTExfOF9PUl8xNihkc3QsIERDLCA4KTsKK30KKworc3RhdGljIHZvaWQgREM0KHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogdG9wKSB7CisgIGludCB0ZW1wMCwgdGVtcDE7CisgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgInVsdyAgICAgICAgICAlW3RlbXAwXSwgICAwKCVbdG9wXSkgICAgICAgICAgICAgICBcblx0IgorICAgICJ1bHcgICAgICAgICAgJVt0ZW1wMV0sICAgLTUoJVt0b3BdKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAicmFkZHUudy5xYiAgICVbdGVtcDBdLCAgICVbdGVtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInJhZGR1LncucWIgICAlW3RlbXAxXSwgICAlW3RlbXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgICVbdGVtcDFdICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICAgICVbdGVtcDBdLCAgICVbdGVtcDBdLCAgICA0ICAgICAgICAgIFxuXHQiCisgICAgInNybCAgICAgICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgICAgMyAgICAgICAgICBcblx0IgorICAgICJyZXBsdi5xYiAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICVbdGVtcDBdLCAgIDAqIiBYU1RSKEJQUykgIiglW2RzdF0pIFxuXHQiCisgICAgInVzdyAgICAgICAgICAlW3RlbXAwXSwgICAxKiIgWFNUUihCUFMpICIoJVtkc3RdKSBcblx0IgorICAgICJ1c3cgICAgICAgICAgJVt0ZW1wMF0sICAgMioiIFhTVFIoQlBTKSAiKCVbZHN0XSkgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICVbdGVtcDBdLCAgIDMqIiBYU1RSKEJQUykgIiglW2RzdF0pIFxuXHQiCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpCisgICAgOiBbdG9wXSJyIih0b3ApLCBbZHN0XSJyIihkc3QpCisgICAgOiAibWVtb3J5IgorICApOworfQorCitzdGF0aWMgdm9pZCBUTTQodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgaW50IGExMCwgYTMyLCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1OworICBjb25zdCBpbnQgYzM1ID0gMHhmZjAwZmY7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICJsYnUgICAgICAgICAgICAgICVbdGVtcDFdLCAgMCglW3RvcF0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGJ1ICAgICAgICAgICAgICAlW2ExMF0sICAgIDEoJVt0b3BdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxidSAgICAgICAgICAgICAgJVt0ZW1wMl0sICAyKCVbdG9wXSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsYnUgICAgICAgICAgICAgICVbYTMyXSwgICAgMyglW3RvcF0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAidWx3ICAgICAgICAgICAgICAlW3RlbXAwXSwgIC01KCVbdG9wXSkgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxidSAgICAgICAgICAgICAgJVt0ZW1wNF0sICAtMSglW3RvcF0pICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhcHBlbmQgICAgICAgICAgICVbYTEwXSwgICAgJVt0ZW1wMV0sICAgMTYgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYXBwZW5kICAgICAgICAgICAlW2EzMl0sICAgICVbdGVtcDJdLCAgIDE2ICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInJlcGx2LnBoICAgICAgICAgJVt0ZW1wNF0sICAlW3RlbXA0XSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzaHJsLnBoICAgICAgICAgICVbdGVtcDFdLCAgJVt0ZW1wMF0sICAgOCAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYW5kICAgICAgICAgICAgICAlW3RlbXAwXSwgICVbdGVtcDBdLCAgICVbYzM1XSAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUucGggICAgICAgICAgJVt0ZW1wMV0sICAlW3RlbXAxXSwgICAlW3RlbXA0XSAgICAgICAgICBcblx0IgorICAgICJzdWJ1LnBoICAgICAgICAgICVbdGVtcDBdLCAgJVt0ZW1wMF0sICAgJVt0ZW1wNF0gICAgICAgICAgXG5cdCIKKyAgICAic3JsICAgICAgICAgICAgICAlW3RlbXAyXSwgICVbdGVtcDFdLCAgIDE2ICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNybCAgICAgICAgICAgICAgJVt0ZW1wM10sICAlW3RlbXAwXSwgICAxNiAgICAgICAgICAgICAgICBcblx0IgorICAgICJyZXBsdi5waCAgICAgICAgICVbdGVtcDJdLCAgJVt0ZW1wMl0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicmVwbHYucGggICAgICAgICAlW3RlbXAzXSwgICVbdGVtcDNdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInJlcGx2LnBoICAgICAgICAgJVt0ZW1wNF0sICAlW3RlbXAxXSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJyZXBsdi5waCAgICAgICAgICVbdGVtcDVdLCAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdS5waCAgICAgICAgICAlW3RlbXAwXSwgICVbdGVtcDNdLCAgICVbYTEwXSAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUucGggICAgICAgICAgJVt0ZW1wMV0sICAlW3RlbXAzXSwgICAlW2EzMl0gICAgICAgICAgICBcblx0IgorICAgICJhZGR1LnBoICAgICAgICAgICVbdGVtcDNdLCAgJVt0ZW1wMl0sICAgJVthMTBdICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdS5waCAgICAgICAgICAlW3RlbXAyXSwgICVbdGVtcDJdLCAgICVbYTMyXSAgICAgICAgICAgIFxuXHQiCisgICAgInNobGxfcy5waCAgICAgICAgJVt0ZW1wMF0sICAlW3RlbXAwXSwgICA3ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzaGxsX3MucGggICAgICAgICVbdGVtcDFdLCAgJVt0ZW1wMV0sICAgNyAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2hsbF9zLnBoICAgICAgICAlW3RlbXAzXSwgICVbdGVtcDNdLCAgIDcgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNobGxfcy5waCAgICAgICAgJVt0ZW1wMl0sICAlW3RlbXAyXSwgICA3ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjcnF1X3MucWIucGggICVbdGVtcDBdLCAgJVt0ZW1wMV0sICAgJVt0ZW1wMF0gICAgICAgICAgXG5cdCIKKyAgICAicHJlY3JxdV9zLnFiLnBoICAlW3RlbXAxXSwgICVbdGVtcDJdLCAgICVbdGVtcDNdICAgICAgICAgIFxuXHQiCisgICAgImFkZHUucGggICAgICAgICAgJVt0ZW1wMl0sICAlW3RlbXA1XSwgICAlW2ExMF0gICAgICAgICAgICBcblx0IgorICAgICJhZGR1LnBoICAgICAgICAgICVbdGVtcDNdLCAgJVt0ZW1wNV0sICAgJVthMzJdICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdS5waCAgICAgICAgICAlW3RlbXA1XSwgICVbdGVtcDRdLCAgICVbYTEwXSAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUucGggICAgICAgICAgJVt0ZW1wNF0sICAlW3RlbXA0XSwgICAlW2EzMl0gICAgICAgICAgICBcblx0IgorICAgICJzaGxsX3MucGggICAgICAgICVbdGVtcDJdLCAgJVt0ZW1wMl0sICAgNyAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2hsbF9zLnBoICAgICAgICAlW3RlbXAzXSwgICVbdGVtcDNdLCAgIDcgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNobGxfcy5waCAgICAgICAgJVt0ZW1wNF0sICAlW3RlbXA0XSwgICA3ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzaGxsX3MucGggICAgICAgICVbdGVtcDVdLCAgJVt0ZW1wNV0sICAgNyAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY3JxdV9zLnFiLnBoICAlW3RlbXAyXSwgICVbdGVtcDNdLCAgICVbdGVtcDJdICAgICAgICAgIFxuXHQiCisgICAgInByZWNycXVfcy5xYi5waCAgJVt0ZW1wM10sICAlW3RlbXA0XSwgICAlW3RlbXA1XSAgICAgICAgICBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgICVbdGVtcDFdLCAgMCoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgICAgICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgICAlW3RlbXAwXSwgIDEqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICAgIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICAgJVt0ZW1wM10sICAyKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgICBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgICVbdGVtcDJdLCAgMyoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgICAgICAgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLAorICAgICAgW2ExMF0iPSZyIihhMTApLCBbYTMyXSI9JnIiKGEzMikKKyAgICA6IFtjMzVdInIiKGMzNSksIFt0b3BdInIiKHRvcCksIFtkc3RdInIiKGRzdCkKKyAgICA6ICJtZW1vcnkiCisgICk7Cit9CisKK3N0YXRpYyB2b2lkIFZFNCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDY7CisgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgInVsdyAgICAgICAgICAgICAlW3RlbXAwXSwgICAtMSglW3RvcF0pICAgICAgICAgICAgICBcblx0IgorICAgICJ1bGggICAgICAgICAgICAgJVt0ZW1wMV0sICAgMyglW3RvcF0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFiciAgICVbdGVtcDJdLCAgICVbdGVtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYmwgICAlW3RlbXAzXSwgICAlW3RlbXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJyICAgJVt0ZW1wNF0sICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicGFja3JsLnBoICAgICAgICVbdGVtcDVdLCAgICVbdGVtcDNdLCAgICAlW3RlbXAyXSAgIFxuXHQiCisgICAgInBhY2tybC5waCAgICAgICAlW3RlbXA2XSwgICAlW3RlbXA0XSwgICAgJVt0ZW1wM10gICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgJVt0ZW1wNV0sICAgJVt0ZW1wNV0sICAgIDEgICAgICAgICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDZdLCAgICAxICAgICAgICAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAlW3RlbXAyXSwgICAlW3RlbXA1XSwgICAgJVt0ZW1wMl0gICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wNl0sICAgICVbdGVtcDRdICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgICAlW3RlbXAzXSAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAlW3RlbXA2XSwgICAlW3RlbXA2XSwgICAgJVt0ZW1wM10gICBcblx0IgorICAgICJzaHJhX3IucGggICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgIDIgICAgICAgICAgXG5cdCIKKyAgICAic2hyYV9yLnBoICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDZdLCAgICAyICAgICAgICAgIFxuXHQiCisgICAgInByZWNyLnFiLnBoICAgICAlW3RlbXA0XSwgICAlW3RlbXA2XSwgICAgJVt0ZW1wMl0gICBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgJVt0ZW1wNF0sICAgMCoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgICVbdGVtcDRdLCAgIDEqIiBYU1RSKEJQUykgIiglW2RzdF0pIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICAlW3RlbXA0XSwgICAyKiIgWFNUUihCUFMpICIoJVtkc3RdKSBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgJVt0ZW1wNF0sICAgMyoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLAorICAgICAgW3RlbXA2XSI9JnIiKHRlbXA2KQorICAgIDogW3RvcF0iciIodG9wKSwgW2RzdF0iciIoZHN0KQorICAgIDogIm1lbW9yeSIKKyAgKTsKK30KKworc3RhdGljIHZvaWQgSEU0KHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogdG9wKSB7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNjsKKyAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAidWx3ICAgICAgICAgICAgICVbdGVtcDBdLCAgIC00KCVbdG9wXSkgICAgICAgICAgICAgIFxuXHQiCisgICAgImxidSAgICAgICAgICAgICAlW3RlbXAxXSwgICAtNSglW3RvcF0pICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJyICAgJVt0ZW1wMl0sICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFibCAgICVbdGVtcDNdLCAgICVbdGVtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInJlcGx2LnBoICAgICAgICAlW3RlbXA0XSwgICAlW3RlbXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJwYWNrcmwucGggICAgICAgJVt0ZW1wNV0sICAgJVt0ZW1wM10sICAgICVbdGVtcDJdICAgXG5cdCIKKyAgICAicGFja3JsLnBoICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDJdLCAgICAlW3RlbXA0XSAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICAlW3RlbXA1XSwgICAlW3RlbXA1XSwgICAgMSAgICAgICAgICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wNl0sICAgIDEgICAgICAgICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgICVbdGVtcDNdLCAgICVbdGVtcDNdLCAgICAlW3RlbXA1XSAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAlW3RlbXAzXSwgICAlW3RlbXAzXSwgICAgJVt0ZW1wMl0gICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgICVbdGVtcDZdICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgICAlW3RlbXA0XSAgIFxuXHQiCisgICAgInNocmFfci5waCAgICAgICAlW3RlbXAzXSwgICAlW3RlbXAzXSwgICAgMiAgICAgICAgICBcblx0IgorICAgICJzaHJhX3IucGggICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgIDIgICAgICAgICAgXG5cdCIKKyAgICAicmVwbHYucWIgICAgICAgICVbdGVtcDBdLCAgICVbdGVtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInJlcGx2LnFiICAgICAgICAlW3RlbXAxXSwgICAlW3RlbXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmwgICAgICAgICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wM10sICAgIDE2ICAgICAgICAgXG5cdCIKKyAgICAic3JsICAgICAgICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgICAxNiAgICAgICAgIFxuXHQiCisgICAgInJlcGx2LnFiICAgICAgICAlW3RlbXAzXSwgICAlW3RlbXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJyZXBsdi5xYiAgICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgICVbdGVtcDNdLCAgIDAqIiBYU1RSKEJQUykgIiglW2RzdF0pIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICAlW3RlbXAwXSwgICAxKiIgWFNUUihCUFMpICIoJVtkc3RdKSBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgJVt0ZW1wMl0sICAgMioiIFhTVFIoQlBTKSAiKCVbZHN0XSkgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgICVbdGVtcDFdLCAgIDMqIiBYU1RSKEJQUykgIiglW2RzdF0pIFxuXHQiCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgIFt0ZW1wNl0iPSZyIih0ZW1wNikKKyAgICA6IFt0b3BdInIiKHRvcCksIFtkc3RdInIiKGRzdCkKKyAgICA6ICJtZW1vcnkiCisgICk7Cit9CisKK3N0YXRpYyB2b2lkIFJENCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNTsKKyAgaW50IHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXA5LCB0ZW1wMTAsIHRlbXAxMTsKKyAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAidWx3ICAgICAgICAgICAgICVbdGVtcDBdLCAgICAtNSglW3RvcF0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAidWx3ICAgICAgICAgICAgICVbdGVtcDFdLCAgICAtMSglW3RvcF0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFibCAgICVbdGVtcDJdLCAgICAlW3RlbXAwXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFiciAgICVbdGVtcDNdLCAgICAlW3RlbXAwXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFiciAgICVbdGVtcDRdLCAgICAlW3RlbXAxXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFibCAgICVbdGVtcDVdLCAgICAlW3RlbXAxXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicGFja3JsLnBoICAgICAgICVbdGVtcDZdLCAgICAlW3RlbXAyXSwgICAgJVt0ZW1wM10gICAgXG5cdCIKKyAgICAicGFja3JsLnBoICAgICAgICVbdGVtcDddLCAgICAlW3RlbXA0XSwgICAgJVt0ZW1wMl0gICAgXG5cdCIKKyAgICAicGFja3JsLnBoICAgICAgICVbdGVtcDhdLCAgICAlW3RlbXA1XSwgICAgJVt0ZW1wNF0gICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgICVbdGVtcDZdLCAgICAlW3RlbXA2XSwgICAgMSAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgICVbdGVtcDldLCAgICAlW3RlbXAyXSwgICAgJVt0ZW1wNl0gICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgICVbdGVtcDddLCAgICAlW3RlbXA3XSwgICAgMSAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgICVbdGVtcDldLCAgICAlW3RlbXA5XSwgICAgJVt0ZW1wM10gICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgICVbdGVtcDhdLCAgICAlW3RlbXA4XSwgICAgMSAgICAgICAgICAgXG5cdCIKKyAgICAic2hyYV9yLnBoICAgICAgICVbdGVtcDldLCAgICAlW3RlbXA5XSwgICAgMiAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgICVbdGVtcDEwXSwgICAlW3RlbXA0XSwgICAgJVt0ZW1wN10gICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgICVbdGVtcDExXSwgICAlW3RlbXA1XSwgICAgJVt0ZW1wOF0gICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgICVbdGVtcDEwXSwgICAlW3RlbXAxMF0sICAgJVt0ZW1wMl0gICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgICVbdGVtcDExXSwgICAlW3RlbXAxMV0sICAgJVt0ZW1wNF0gICAgXG5cdCIKKyAgICAic2hyYV9yLnBoICAgICAgICVbdGVtcDEwXSwgICAlW3RlbXAxMF0sICAgMiAgICAgICAgICAgXG5cdCIKKyAgICAic2hyYV9yLnBoICAgICAgICVbdGVtcDExXSwgICAlW3RlbXAxMV0sICAgMiAgICAgICAgICAgXG5cdCIKKyAgICAibGJ1ICAgICAgICAgICAgICVbdGVtcDBdLCAgICAzKCVbdG9wXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGJ1ICAgICAgICAgICAgICVbdGVtcDFdLCAgICAyKCVbdG9wXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGJ1ICAgICAgICAgICAgICVbdGVtcDJdLCAgICAxKCVbdG9wXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2xsICAgICAgICAgICAgICVbdGVtcDFdLCAgICAlW3RlbXAxXSwgICAgMSAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgICAgICVbdGVtcDBdLCAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMV0gICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgICAgICVbdGVtcDBdLCAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMl0gICAgXG5cdCIKKyAgICAicHJlY3IucWIucGggICAgICVbdGVtcDldLCAgICAlW3RlbXAxMF0sICAgJVt0ZW1wOV0gICAgXG5cdCIKKyAgICAic2hyYV9yLncgICAgICAgICVbdGVtcDBdLCAgICAlW3RlbXAwXSwgICAgMiAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY3IucWIucGggICAgICVbdGVtcDEwXSwgICAlW3RlbXAxMV0sICAgJVt0ZW1wMTBdICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgICVbdGVtcDldLCAgICAzKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgICVbdGVtcDEwXSwgICAxKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgXG5cdCIKKyAgICAicHJlcGVuZCAgICAgICAgICVbdGVtcDldLCAgICAlW3RlbXAxMV0sICAgOCAgICAgICAgICAgXG5cdCIKKyAgICAicHJlcGVuZCAgICAgICAgICVbdGVtcDEwXSwgICAlW3RlbXAwXSwgICAgOCAgICAgICAgICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgICVbdGVtcDldLCAgICAyKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgICVbdGVtcDEwXSwgICAwKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLAorICAgICAgW3RlbXA2XSI9JnIiKHRlbXA2KSwgW3RlbXA3XSI9JnIiKHRlbXA3KSwgW3RlbXA4XSI9JnIiKHRlbXA4KSwKKyAgICAgIFt0ZW1wOV0iPSZyIih0ZW1wOSksIFt0ZW1wMTBdIj0mciIodGVtcDEwKSwgW3RlbXAxMV0iPSZyIih0ZW1wMTEpCisgICAgOiBbdG9wXSJyIih0b3ApLCBbZHN0XSJyIihkc3QpCisgICAgOiAibWVtb3J5IgorICApOworfQorCitzdGF0aWMgdm9pZCBWUjQodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNDsKKyAgaW50IHRlbXA1LCB0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wOTsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgInVsdyAgICAgICAgICAgICAgJVt0ZW1wMF0sICAgLTQoJVt0b3BdKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAidWx3ICAgICAgICAgICAgICAlW3RlbXAxXSwgICAwKCVbdG9wXSkgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJsICAgICVbdGVtcDJdLCAgICVbdGVtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYnIgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFibGEgICAlW3RlbXAzXSwgICAlW3RlbXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJyYSAgICVbdGVtcDFdLCAgICVbdGVtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInBhY2tybC5waCAgICAgICAgJVt0ZW1wN10sICAgJVt0ZW1wM10sICAgICVbdGVtcDJdICAgXG5cdCIKKyAgICAiYWRkcWhfci5waCAgICAgICAlW3RlbXA0XSwgICAlW3RlbXAxXSwgICAgJVt0ZW1wM10gICBcblx0IgorICAgICJtb3ZlICAgICAgICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFwcGVuZCAgICAgICAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMl0sICAgIDE2ICAgICAgICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgICAlW3RlbXA5XSwgICAlW3RlbXA2XSwgICAgMSAgICAgICAgICBcblx0IgorICAgICJhZGRxaF9yLnBoICAgICAgICVbdGVtcDVdLCAgICVbdGVtcDddLCAgICAlW3RlbXA2XSAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICAgJVt0ZW1wOF0sICAgJVt0ZW1wN10sICAgIDEgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdS5waCAgICAgICAgICAlW3RlbXAzXSwgICAlW3RlbXA3XSwgICAgJVt0ZW1wM10gICBcblx0IgorICAgICJhZGR1LnBoICAgICAgICAgICVbdGVtcDFdLCAgICVbdGVtcDFdLCAgICAlW3RlbXA2XSAgIFxuXHQiCisgICAgInBhY2tybC5waCAgICAgICAgJVt0ZW1wN10sICAgJVt0ZW1wMl0sICAgICVbdGVtcDBdICAgXG5cdCIKKyAgICAiYWRkdS5waCAgICAgICAgICAlW3RlbXA2XSwgICAlW3RlbXAwXSwgICAgJVt0ZW1wMl0gICBcblx0IgorICAgICJhZGR1LnBoICAgICAgICAgICVbdGVtcDNdLCAgICVbdGVtcDNdLCAgICAlW3RlbXA5XSAgIFxuXHQiCisgICAgImFkZHUucGggICAgICAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICAgICVbdGVtcDhdICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgICAlW3RlbXA3XSwgICAlW3RlbXA3XSwgICAgMSAgICAgICAgICBcblx0IgorICAgICJzaHJhX3IucGggICAgICAgICVbdGVtcDNdLCAgICVbdGVtcDNdLCAgICAyICAgICAgICAgIFxuXHQiCisgICAgInNocmFfci5waCAgICAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICAgIDIgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdS5waCAgICAgICAgICAlW3RlbXA2XSwgICAlW3RlbXA2XSwgICAgJVt0ZW1wN10gICBcblx0IgorICAgICJzaHJhX3IucGggICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDZdLCAgICAyICAgICAgICAgIFxuXHQiCisgICAgInByZWNycS5waC53ICAgICAgJVt0ZW1wOF0sICAgJVt0ZW1wNF0sICAgICVbdGVtcDVdICAgXG5cdCIKKyAgICAiYXBwZW5kICAgICAgICAgICAlW3RlbXA0XSwgICAlW3RlbXA1XSwgICAgMTYgICAgICAgICBcblx0IgorICAgICJwcmVjcnEucGgudyAgICAgICVbdGVtcDJdLCAgICVbdGVtcDNdLCAgICAlW3RlbXAxXSAgIFxuXHQiCisgICAgImFwcGVuZCAgICAgICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wMV0sICAgIDE2ICAgICAgICAgXG5cdCIKKyAgICAicHJlY3IucWIucGggICAgICAlW3RlbXA4XSwgICAlW3RlbXA4XSwgICAgJVt0ZW1wNF0gICBcblx0IgorICAgICJwcmVjci5xYi5waCAgICAgICVbdGVtcDNdLCAgICVbdGVtcDJdLCAgICAlW3RlbXAzXSAgIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICAgJVt0ZW1wOF0sICAgMCoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgICAlW3RlbXAzXSwgICAxKiIgWFNUUihCUFMpICIoJVtkc3RdKSBcblx0IgorICAgICJhcHBlbmQgICAgICAgICAgICVbdGVtcDNdLCAgICVbdGVtcDZdLCAgICA4ICAgICAgICAgIFxuXHQiCisgICAgInNybCAgICAgICAgICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wNl0sICAgIDE2ICAgICAgICAgXG5cdCIKKyAgICAiYXBwZW5kICAgICAgICAgICAlW3RlbXA4XSwgICAlW3RlbXA2XSwgICAgOCAgICAgICAgICBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgICVbdGVtcDNdLCAgIDMqIiBYU1RSKEJQUykgIiglW2RzdF0pIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICAgJVt0ZW1wOF0sICAgMioiIFhTVFIoQlBTKSAiKCVbZHN0XSkgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLAorICAgICAgW3RlbXA2XSI9JnIiKHRlbXA2KSwgW3RlbXA3XSI9JnIiKHRlbXA3KSwgW3RlbXA4XSI9JnIiKHRlbXA4KSwKKyAgICAgIFt0ZW1wOV0iPSZyIih0ZW1wOSkKKyAgICA6IFt0b3BdInIiKHRvcCksIFtkc3RdInIiKGRzdCkKKyAgICA6ICJtZW1vcnkiCisgICk7Cit9CisKK3N0YXRpYyB2b2lkIExENCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNTsKKyAgaW50IHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXA5LCB0ZW1wMTAsIHRlbXAxMTsKKyAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAidWx3ICAgICAgICAgICAgICVbdGVtcDBdLCAgICAwKCVbdG9wXSkgICAgICAgICAgICAgICBcblx0IgorICAgICJ1bHcgICAgICAgICAgICAgJVt0ZW1wMV0sICAgIDQoJVt0b3BdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYmwgICAlW3RlbXAyXSwgICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFiciAgICVbdGVtcDNdLCAgICAlW3RlbXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJyICAgJVt0ZW1wNF0sICAgICVbdGVtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYmwgICAlW3RlbXA1XSwgICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicGFja3JsLnBoICAgICAgICVbdGVtcDZdLCAgICAlW3RlbXAyXSwgICAgJVt0ZW1wM10gICBcblx0IgorICAgICJwYWNrcmwucGggICAgICAgJVt0ZW1wN10sICAgICVbdGVtcDRdLCAgICAlW3RlbXAyXSAgIFxuXHQiCisgICAgInBhY2tybC5waCAgICAgICAlW3RlbXA4XSwgICAgJVt0ZW1wNV0sICAgICVbdGVtcDRdICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgICVbdGVtcDZdLCAgICAlW3RlbXA2XSwgICAgMSAgICAgICAgICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wOV0sICAgICVbdGVtcDJdLCAgICAlW3RlbXA2XSAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICAlW3RlbXA3XSwgICAgJVt0ZW1wN10sICAgIDEgICAgICAgICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgICVbdGVtcDldLCAgICAlW3RlbXA5XSwgICAgJVt0ZW1wM10gICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgJVt0ZW1wOF0sICAgICVbdGVtcDhdLCAgICAxICAgICAgICAgIFxuXHQiCisgICAgInNocmFfci5waCAgICAgICAlW3RlbXA5XSwgICAgJVt0ZW1wOV0sICAgIDIgICAgICAgICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgICVbdGVtcDEwXSwgICAlW3RlbXA0XSwgICAgJVt0ZW1wN10gICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wMTFdLCAgICVbdGVtcDVdLCAgICAlW3RlbXA4XSAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAlW3RlbXAxMF0sICAgJVt0ZW1wMTBdLCAgICVbdGVtcDJdICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgICVbdGVtcDExXSwgICAlW3RlbXAxMV0sICAgJVt0ZW1wNF0gICBcblx0IgorICAgICJzaHJhX3IucGggICAgICAgJVt0ZW1wMTBdLCAgICVbdGVtcDEwXSwgICAyICAgICAgICAgIFxuXHQiCisgICAgInNocmFfci5waCAgICAgICAlW3RlbXAxMV0sICAgJVt0ZW1wMTFdLCAgIDIgICAgICAgICAgXG5cdCIKKyAgICAic3JsICAgICAgICAgICAgICVbdGVtcDFdLCAgICAlW3RlbXAxXSwgICAgMjQgICAgICAgICBcblx0IgorICAgICJzbGwgICAgICAgICAgICAgJVt0ZW1wMV0sICAgICVbdGVtcDFdLCAgICAxICAgICAgICAgIFxuXHQiCisgICAgInJhZGR1LncucWIgICAgICAlW3RlbXA1XSwgICAgJVt0ZW1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY3IucWIucGggICAgICVbdGVtcDldLCAgICAlW3RlbXAxMF0sICAgJVt0ZW1wOV0gICBcblx0IgorICAgICJwcmVjci5xYi5waCAgICAgJVt0ZW1wMTBdLCAgICVbdGVtcDExXSwgICAlW3RlbXAxMF0gIFxuXHQiCisgICAgImFkZHUgICAgICAgICAgICAlW3RlbXAxXSwgICAgJVt0ZW1wMV0sICAgICVbdGVtcDVdICAgXG5cdCIKKyAgICAic2hyYV9yLncgICAgICAgICVbdGVtcDFdLCAgICAlW3RlbXAxXSwgICAgMiAgICAgICAgICBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgJVt0ZW1wOV0sICAgIDAqIiBYU1RSKEJQUykgIiglW2RzdF0pIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICAlW3RlbXAxMF0sICAgMioiIFhTVFIoQlBTKSAiKCVbZHN0XSkgXG5cdCIKKyAgICAicHJlcGVuZCAgICAgICAgICVbdGVtcDldLCAgICAlW3RlbXAxMV0sICAgOCAgICAgICAgICBcblx0IgorICAgICJwcmVwZW5kICAgICAgICAgJVt0ZW1wMTBdLCAgICVbdGVtcDFdLCAgICA4ICAgICAgICAgIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICAlW3RlbXA5XSwgICAgMSoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgICVbdGVtcDEwXSwgICAzKiIgWFNUUihCUFMpICIoJVtkc3RdKSBcblx0IgorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksCisgICAgICBbdGVtcDZdIj0mciIodGVtcDYpLCBbdGVtcDddIj0mciIodGVtcDcpLCBbdGVtcDhdIj0mciIodGVtcDgpLAorICAgICAgW3RlbXA5XSI9JnIiKHRlbXA5KSwgW3RlbXAxMF0iPSZyIih0ZW1wMTApLCBbdGVtcDExXSI9JnIiKHRlbXAxMSkKKyAgICA6IFt0b3BdInIiKHRvcCksIFtkc3RdInIiKGRzdCkKKyAgICA6ICJtZW1vcnkiCisgICk7Cit9CisKK3N0YXRpYyB2b2lkIFZMNCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0OworICBpbnQgdGVtcDUsIHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXA5OworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAidWx3ICAgICAgICAgICAgICAlW3RlbXAwXSwgICAwKCVbdG9wXSkgICAgICAgICAgICAgICBcblx0IgorICAgICJ1bHcgICAgICAgICAgICAgICVbdGVtcDFdLCAgIDQoJVt0b3BdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYmxhICAgJVt0ZW1wMl0sICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFicmEgICAlW3RlbXAwXSwgICAlW3RlbXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJsICAgICVbdGVtcDNdLCAgICVbdGVtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYnIgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkcWhfci5waCAgICAgICAlW3RlbXA0XSwgICAlW3RlbXAwXSwgICAgJVt0ZW1wMl0gICBcblx0IgorICAgICJwYWNrcmwucGggICAgICAgICVbdGVtcDddLCAgICVbdGVtcDFdLCAgICAlW3RlbXAwXSAgIFxuXHQiCisgICAgInByZWNycS5waC53ICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wMV0sICAgICVbdGVtcDJdICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgICAlW3RlbXA5XSwgICAlW3RlbXAyXSwgICAgMSAgICAgICAgICBcblx0IgorICAgICJhZGRxaF9yLnBoICAgICAgICVbdGVtcDVdLCAgICVbdGVtcDddLCAgICAlW3RlbXAyXSAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICAgJVt0ZW1wOF0sICAgJVt0ZW1wN10sICAgIDEgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdS5waCAgICAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAgJVt0ZW1wNl0gICBcblx0IgorICAgICJhZGR1LnBoICAgICAgICAgICVbdGVtcDBdLCAgICVbdGVtcDBdLCAgICAlW3RlbXA3XSAgIFxuXHQiCisgICAgInBhY2tybC5waCAgICAgICAgJVt0ZW1wN10sICAgJVt0ZW1wM10sICAgICVbdGVtcDFdICAgXG5cdCIKKyAgICAiYWRkdS5waCAgICAgICAgICAlW3RlbXA2XSwgICAlW3RlbXAxXSwgICAgJVt0ZW1wM10gICBcblx0IgorICAgICJhZGR1LnBoICAgICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgICAlW3RlbXA4XSAgIFxuXHQiCisgICAgImFkZHUucGggICAgICAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgICVbdGVtcDldICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgICAlW3RlbXA3XSwgICAlW3RlbXA3XSwgICAgMSAgICAgICAgICBcblx0IgorICAgICJzaHJhX3IucGggICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgICAyICAgICAgICAgIFxuXHQiCisgICAgInNocmFfci5waCAgICAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgIDIgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdS5waCAgICAgICAgICAlW3RlbXA2XSwgICAlW3RlbXA2XSwgICAgJVt0ZW1wN10gICBcblx0IgorICAgICJzaHJhX3IucGggICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDZdLCAgICAyICAgICAgICAgIFxuXHQiCisgICAgInByZWNycS5waC53ICAgICAgJVt0ZW1wOF0sICAgJVt0ZW1wNV0sICAgICVbdGVtcDRdICAgXG5cdCIKKyAgICAiYXBwZW5kICAgICAgICAgICAlW3RlbXA1XSwgICAlW3RlbXA0XSwgICAgMTYgICAgICAgICBcblx0IgorICAgICJwcmVjcnEucGgudyAgICAgICVbdGVtcDNdLCAgICVbdGVtcDJdLCAgICAlW3RlbXAwXSAgIFxuXHQiCisgICAgImFwcGVuZCAgICAgICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMF0sICAgIDE2ICAgICAgICAgXG5cdCIKKyAgICAicHJlY3IucWIucGggICAgICAlW3RlbXA4XSwgICAlW3RlbXA4XSwgICAgJVt0ZW1wNV0gICBcblx0IgorICAgICJwcmVjci5xYi5waCAgICAgICVbdGVtcDNdLCAgICVbdGVtcDNdLCAgICAlW3RlbXAyXSAgIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICAgJVt0ZW1wOF0sICAgMCoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgXG5cdCIKKyAgICAicHJlcGVuZCAgICAgICAgICAlW3RlbXA4XSwgICAlW3RlbXA2XSwgICAgOCAgICAgICAgICBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgICVbdGVtcDNdLCAgIDEqIiBYU1RSKEJQUykgIiglW2RzdF0pIFxuXHQiCisgICAgInNybCAgICAgICAgICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wNl0sICAgIDE2ICAgICAgICAgXG5cdCIKKyAgICAicHJlcGVuZCAgICAgICAgICAlW3RlbXAzXSwgICAlW3RlbXA2XSwgICAgOCAgICAgICAgICBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgICVbdGVtcDhdLCAgIDIqIiBYU1RSKEJQUykgIiglW2RzdF0pIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICAgJVt0ZW1wM10sICAgMyoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLAorICAgICAgW3RlbXA2XSI9JnIiKHRlbXA2KSwgW3RlbXA3XSI9JnIiKHRlbXA3KSwgW3RlbXA4XSI9JnIiKHRlbXA4KSwKKyAgICAgIFt0ZW1wOV0iPSZyIih0ZW1wOSkKKyAgICA6IFt0b3BdInIiKHRvcCksIFtkc3RdInIiKGRzdCkKKyAgICA6ICJtZW1vcnkiCisgICk7Cit9CisKK3N0YXRpYyB2b2lkIEhENCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0OworICBpbnQgdGVtcDUsIHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXA5OworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAidWx3ICAgICAgICAgICAgICAlW3RlbXAwXSwgICAtNSglW3RvcF0pICAgICAgICAgICAgICBcblx0IgorICAgICJ1bHcgICAgICAgICAgICAgICVbdGVtcDFdLCAgIC0xKCVbdG9wXSkgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYmxhICAgJVt0ZW1wMl0sICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFicmEgICAlW3RlbXAwXSwgICAlW3RlbXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJsICAgICVbdGVtcDNdLCAgICVbdGVtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYnIgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkcWhfci5waCAgICAgICAlW3RlbXA0XSwgICAlW3RlbXAwXSwgICAgJVt0ZW1wMl0gICBcblx0IgorICAgICJwYWNrcmwucGggICAgICAgICVbdGVtcDddLCAgICVbdGVtcDFdLCAgICAlW3RlbXAwXSAgIFxuXHQiCisgICAgInByZWNycS5waC53ICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wMV0sICAgICVbdGVtcDJdICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgICAlW3RlbXA5XSwgICAlW3RlbXAyXSwgICAgMSAgICAgICAgICBcblx0IgorICAgICJhZGRxaF9yLnBoICAgICAgICVbdGVtcDVdLCAgICVbdGVtcDddLCAgICAlW3RlbXAyXSAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICAgJVt0ZW1wOF0sICAgJVt0ZW1wN10sICAgIDEgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdS5waCAgICAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAgJVt0ZW1wNl0gICBcblx0IgorICAgICJhZGR1LnBoICAgICAgICAgICVbdGVtcDBdLCAgICVbdGVtcDBdLCAgICAlW3RlbXA3XSAgIFxuXHQiCisgICAgInBhY2tybC5waCAgICAgICAgJVt0ZW1wN10sICAgJVt0ZW1wM10sICAgICVbdGVtcDFdICAgXG5cdCIKKyAgICAiYWRkdS5waCAgICAgICAgICAlW3RlbXA2XSwgICAlW3RlbXAxXSwgICAgJVt0ZW1wM10gICBcblx0IgorICAgICJhZGR1LnBoICAgICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgICAlW3RlbXA4XSAgIFxuXHQiCisgICAgImFkZHUucGggICAgICAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgICVbdGVtcDldICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgICAlW3RlbXA3XSwgICAlW3RlbXA3XSwgICAgMSAgICAgICAgICBcblx0IgorICAgICJzaHJhX3IucGggICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgICAyICAgICAgICAgIFxuXHQiCisgICAgInNocmFfci5waCAgICAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgIDIgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdS5waCAgICAgICAgICAlW3RlbXA2XSwgICAlW3RlbXA2XSwgICAgJVt0ZW1wN10gICBcblx0IgorICAgICJzaHJhX3IucGggICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDZdLCAgICAyICAgICAgICAgIFxuXHQiCisgICAgInByZWNycS5waC53ICAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMl0sICAgICVbdGVtcDVdICAgXG5cdCIKKyAgICAicHJlY3JxLnBoLncgICAgICAlW3RlbXAzXSwgICAlW3RlbXAwXSwgICAgJVt0ZW1wNF0gICBcblx0IgorICAgICJwcmVjci5xYi5waCAgICAgICVbdGVtcDddLCAgICVbdGVtcDZdLCAgICAlW3RlbXAxXSAgIFxuXHQiCisgICAgInByZWNyLnFiLnBoICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wMV0sICAgICVbdGVtcDNdICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgICAlW3RlbXA3XSwgICAwKiIgWFNUUihCUFMpICIoJVtkc3RdKSBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgICVbdGVtcDZdLCAgIDEqIiBYU1RSKEJQUykgIiglW2RzdF0pIFxuXHQiCisgICAgImFwcGVuZCAgICAgICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wNV0sICAgIDE2ICAgICAgICAgXG5cdCIKKyAgICAiYXBwZW5kICAgICAgICAgICAlW3RlbXAwXSwgICAlW3RlbXA0XSwgICAgMTYgICAgICAgICBcblx0IgorICAgICJwcmVjci5xYi5waCAgICAgICVbdGVtcDVdLCAgICVbdGVtcDNdLCAgICAlW3RlbXAyXSAgIFxuXHQiCisgICAgInByZWNyLnFiLnBoICAgICAgJVt0ZW1wNF0sICAgJVt0ZW1wMl0sICAgICVbdGVtcDBdICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgICAlW3RlbXA1XSwgICAyKiIgWFNUUihCUFMpICIoJVtkc3RdKSBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgICVbdGVtcDRdLCAgIDMqIiBYU1RSKEJQUykgIiglW2RzdF0pIFxuXHQiCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgIFt0ZW1wNl0iPSZyIih0ZW1wNiksIFt0ZW1wN10iPSZyIih0ZW1wNyksIFt0ZW1wOF0iPSZyIih0ZW1wOCksCisgICAgICBbdGVtcDldIj0mciIodGVtcDkpCisgICAgOiBbdG9wXSJyIih0b3ApLCBbZHN0XSJyIihkc3QpCisgICAgOiAibWVtb3J5IgorICApOworfQorCitzdGF0aWMgdm9pZCBIVTQodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA2LCB0ZW1wNzsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgInVsdyAgICAgICAgICAgICAlW3RlbXAwXSwgICAtNSglW3RvcF0pICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJsICAgJVt0ZW1wMV0sICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFiciAgICVbdGVtcDJdLCAgICVbdGVtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInBhY2tybC5waCAgICAgICAlW3RlbXAzXSwgICAlW3RlbXAxXSwgICAgJVt0ZW1wMl0gICBcblx0IgorICAgICJyZXBsdi5xYiAgICAgICAgJVt0ZW1wN10sICAgJVt0ZW1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkcWhfci5waCAgICAgICVbdGVtcDRdLCAgICVbdGVtcDFdLCAgICAlW3RlbXAzXSAgIFxuXHQiCisgICAgImFkZHFoX3IucGggICAgICAlW3RlbXA1XSwgICAlW3RlbXAzXSwgICAgJVt0ZW1wMl0gICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wM10sICAgIDEgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdS5waCAgICAgICAgICVbdGVtcDNdLCAgICVbdGVtcDJdLCAgICAlW3RlbXAzXSAgIFxuXHQiCisgICAgImFkZHUucGggICAgICAgICAlW3RlbXA2XSwgICAlW3RlbXAxXSwgICAgJVt0ZW1wNl0gICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMl0sICAgIDEgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdS5waCAgICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDZdLCAgICAlW3RlbXAyXSAgIFxuXHQiCisgICAgImFkZHUucGggICAgICAgICAlW3RlbXAwXSwgICAlW3RlbXAzXSwgICAgJVt0ZW1wMF0gICBcblx0IgorICAgICJzaHJhX3IucGggICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wNl0sICAgIDIgICAgICAgICAgXG5cdCIKKyAgICAic2hyYV9yLnBoICAgICAgICVbdGVtcDBdLCAgICVbdGVtcDBdLCAgICAyICAgICAgICAgIFxuXHQiCisgICAgInBhY2tybC5waCAgICAgICAlW3RlbXAzXSwgICAlW3RlbXA2XSwgICAgJVt0ZW1wNV0gICBcblx0IgorICAgICJwcmVjcnEucGgudyAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wNl0sICAgICVbdGVtcDRdICAgXG5cdCIKKyAgICAiYXBwZW5kICAgICAgICAgICVbdGVtcDBdLCAgICVbdGVtcDVdLCAgICAxNiAgICAgICAgIFxuXHQiCisgICAgInByZWNyLnFiLnBoICAgICAlW3RlbXAzXSwgICAlW3RlbXAzXSwgICAgJVt0ZW1wMl0gICBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgJVt0ZW1wM10sICAgMCoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgXG5cdCIKKyAgICAicHJlY3IucWIucGggICAgICVbdGVtcDFdLCAgICVbdGVtcDddLCAgICAlW3RlbXAwXSAgIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICAlW3RlbXA3XSwgICAzKiIgWFNUUihCUFMpICIoJVtkc3RdKSBcblx0IgorICAgICJwYWNrcmwucGggICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMV0sICAgICVbdGVtcDNdICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgICVbdGVtcDFdLCAgIDIqIiBYU1RSKEJQUykgIiglW2RzdF0pIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICAlW3RlbXAyXSwgICAxKiIgWFNUUihCUFMpICIoJVtkc3RdKSBcblx0IgorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksCisgICAgICBbdGVtcDZdIj0mciIodGVtcDYpLCBbdGVtcDddIj0mciIodGVtcDcpCisgICAgOiBbdG9wXSJyIih0b3ApLCBbZHN0XSJyIihkc3QpCisgICAgOiAibWVtb3J5IgorICApOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ2hyb21hIDh4OCBwcmVkaWN0aW9uIChwYXJhZ3JhcGggMTIuMikKKworc3RhdGljIHZvaWQgSW50cmFDaHJvbWFQcmVkc19NSVBTZHNwUjIodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdG9wKSB7CisgIC8vIFUgYmxvY2sKKyAgRENNb2RlOChDOERDOCArIGRzdCwgbGVmdCwgdG9wKTsKKyAgVmVydGljYWxQcmVkOChDOFZFOCArIGRzdCwgdG9wKTsKKyAgSG9yaXpvbnRhbFByZWQ4KEM4SEU4ICsgZHN0LCBsZWZ0KTsKKyAgVHJ1ZU1vdGlvbjgoQzhUTTggKyBkc3QsIGxlZnQsIHRvcCk7CisgIC8vIFYgYmxvY2sKKyAgZHN0ICs9IDg7CisgIGlmICh0b3ApIHRvcCArPSA4OworICBpZiAobGVmdCkgbGVmdCArPSAxNjsKKyAgRENNb2RlOChDOERDOCArIGRzdCwgbGVmdCwgdG9wKTsKKyAgVmVydGljYWxQcmVkOChDOFZFOCArIGRzdCwgdG9wKTsKKyAgSG9yaXpvbnRhbFByZWQ4KEM4SEU4ICsgZHN0LCBsZWZ0KTsKKyAgVHJ1ZU1vdGlvbjgoQzhUTTggKyBkc3QsIGxlZnQsIHRvcCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsdW1hIDE2eDE2IHByZWRpY3Rpb24gKHBhcmFncmFwaCAxMi4zKQorCitzdGF0aWMgdm9pZCBJbnRyYTE2UHJlZHNfTUlQU2RzcFIyKHVpbnQ4X3QqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogbGVmdCwgY29uc3QgdWludDhfdCogdG9wKSB7CisgIERDTW9kZTE2KEkxNkRDMTYgKyBkc3QsIGxlZnQsIHRvcCk7CisgIFZlcnRpY2FsUHJlZDE2KEkxNlZFMTYgKyBkc3QsIHRvcCk7CisgIEhvcml6b250YWxQcmVkMTYoSTE2SEUxNiArIGRzdCwgbGVmdCk7CisgIFRydWVNb3Rpb24xNihJMTZUTTE2ICsgZHN0LCBsZWZ0LCB0b3ApOworfQorCisvLyBMZWZ0IHNhbXBsZXMgYXJlIHRvcFstNSAuLiAtMl0sIHRvcF9sZWZ0IGlzIHRvcFstMV0sIHRvcCBhcmUKKy8vIGxvY2F0ZWQgYXQgdG9wWzAuLjNdLCBhbmQgdG9wIHJpZ2h0IGlzIHRvcFs0Li43XQorc3RhdGljIHZvaWQgSW50cmE0UHJlZHNfTUlQU2RzcFIyKHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogdG9wKSB7CisgIERDNChJNERDNCArIGRzdCwgdG9wKTsKKyAgVE00KEk0VE00ICsgZHN0LCB0b3ApOworICBWRTQoSTRWRTQgKyBkc3QsIHRvcCk7CisgIEhFNChJNEhFNCArIGRzdCwgdG9wKTsKKyAgUkQ0KEk0UkQ0ICsgZHN0LCB0b3ApOworICBWUjQoSTRWUjQgKyBkc3QsIHRvcCk7CisgIExENChJNExENCArIGRzdCwgdG9wKTsKKyAgVkw0KEk0Vkw0ICsgZHN0LCB0b3ApOworICBIRDQoSTRIRDQgKyBkc3QsIHRvcCk7CisgIEhVNChJNEhVNCArIGRzdCwgdG9wKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1ldHJpYworCisjaWYgIWRlZmluZWQoV09SS19BUk9VTkRfR0NDKQorCisjZGVmaW5lIEdFVF9TU0VfSU5ORVIoQSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgImx3ICAgICAgICAgICAgICAgJVt0ZW1wMF0sICAgICIgI0EgIiglW2FdKSAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAibHcgICAgICAgICAgICAgICAlW3RlbXAxXSwgICAgIiAjQSAiKCVbYl0pICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJwcmVjZXUucGgucWJyICAgICVbdGVtcDJdLCAgICAlW3RlbXAwXSAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgInByZWNldS5waC5xYmwgICAgJVt0ZW1wMF0sICAgICVbdGVtcDBdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAicHJlY2V1LnBoLnFiciAgICAlW3RlbXAzXSwgICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJwcmVjZXUucGgucWJsICAgICVbdGVtcDFdLCAgICAlW3RlbXAxXSAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgInN1YnEucGggICAgICAgICAgJVt0ZW1wMl0sICAgICVbdGVtcDJdLCAgICAlW3RlbXAzXSAgICAgICAgIFxuXHQiICAgICAgXAorICAic3VicS5waCAgICAgICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMF0sICAgICVbdGVtcDFdICAgICAgICAgXG5cdCIgICAgICBcCisgICJkcGEudy5waCAgICAgICAgICRhYzAsICAgICAgICAlW3RlbXAyXSwgICAgJVt0ZW1wMl0gICAgICAgICBcblx0IiAgICAgIFwKKyAgImRwYS53LnBoICAgICAgICAgJGFjMCwgICAgICAgICVbdGVtcDBdLCAgICAlW3RlbXAwXSAgICAgICAgIFxuXHQiCisKKyNkZWZpbmUgR0VUX1NTRShBLCBCLCBDLCBEKSAgICAgICAgICAgICAgIFwKKyAgR0VUX1NTRV9JTk5FUihBKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgR0VUX1NTRV9JTk5FUihCKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgR0VUX1NTRV9JTk5FUihDKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgR0VUX1NTRV9JTk5FUihEKQorCitzdGF0aWMgaW50IFNTRTE2eDE2X01JUFNkc3BSMihjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiBiKSB7CisgIGludCBjb3VudDsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzOworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAibXVsdCAgICR6ZXJvLCAgICAkemVybyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIEdFVF9TU0UoIDAgKiBCUFMsIDQgKyAgMCAqIEJQUywgOCArICAwICogQlBTLCAxMiArICAwICogQlBTKQorICAgIEdFVF9TU0UoIDEgKiBCUFMsIDQgKyAgMSAqIEJQUywgOCArICAxICogQlBTLCAxMiArICAxICogQlBTKQorICAgIEdFVF9TU0UoIDIgKiBCUFMsIDQgKyAgMiAqIEJQUywgOCArICAyICogQlBTLCAxMiArICAyICogQlBTKQorICAgIEdFVF9TU0UoIDMgKiBCUFMsIDQgKyAgMyAqIEJQUywgOCArICAzICogQlBTLCAxMiArICAzICogQlBTKQorICAgIEdFVF9TU0UoIDQgKiBCUFMsIDQgKyAgNCAqIEJQUywgOCArICA0ICogQlBTLCAxMiArICA0ICogQlBTKQorICAgIEdFVF9TU0UoIDUgKiBCUFMsIDQgKyAgNSAqIEJQUywgOCArICA1ICogQlBTLCAxMiArICA1ICogQlBTKQorICAgIEdFVF9TU0UoIDYgKiBCUFMsIDQgKyAgNiAqIEJQUywgOCArICA2ICogQlBTLCAxMiArICA2ICogQlBTKQorICAgIEdFVF9TU0UoIDcgKiBCUFMsIDQgKyAgNyAqIEJQUywgOCArICA3ICogQlBTLCAxMiArICA3ICogQlBTKQorICAgIEdFVF9TU0UoIDggKiBCUFMsIDQgKyAgOCAqIEJQUywgOCArICA4ICogQlBTLCAxMiArICA4ICogQlBTKQorICAgIEdFVF9TU0UoIDkgKiBCUFMsIDQgKyAgOSAqIEJQUywgOCArICA5ICogQlBTLCAxMiArICA5ICogQlBTKQorICAgIEdFVF9TU0UoMTAgKiBCUFMsIDQgKyAxMCAqIEJQUywgOCArIDEwICogQlBTLCAxMiArIDEwICogQlBTKQorICAgIEdFVF9TU0UoMTEgKiBCUFMsIDQgKyAxMSAqIEJQUywgOCArIDExICogQlBTLCAxMiArIDExICogQlBTKQorICAgIEdFVF9TU0UoMTIgKiBCUFMsIDQgKyAxMiAqIEJQUywgOCArIDEyICogQlBTLCAxMiArIDEyICogQlBTKQorICAgIEdFVF9TU0UoMTMgKiBCUFMsIDQgKyAxMyAqIEJQUywgOCArIDEzICogQlBTLCAxMiArIDEzICogQlBTKQorICAgIEdFVF9TU0UoMTQgKiBCUFMsIDQgKyAxNCAqIEJQUywgOCArIDE0ICogQlBTLCAxMiArIDE0ICogQlBTKQorICAgIEdFVF9TU0UoMTUgKiBCUFMsIDQgKyAxNSAqIEJQUywgOCArIDE1ICogQlBTLCAxMiArIDE1ICogQlBTKQorICAgICJtZmxvICAgJVtjb3VudF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW2NvdW50XSI9JnIiKGNvdW50KQorICAgIDogW2FdInIiKGEpLCBbYl0iciIoYikKKyAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iCisgICk7CisgIHJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBTU0UxNng4X01JUFNkc3BSMihjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiBiKSB7CisgIGludCBjb3VudDsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzOworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAibXVsdCAgICR6ZXJvLCAgICAkemVybyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIEdFVF9TU0UoIDAgKiBCUFMsIDQgKyAgMCAqIEJQUywgOCArICAwICogQlBTLCAxMiArICAwICogQlBTKQorICAgIEdFVF9TU0UoIDEgKiBCUFMsIDQgKyAgMSAqIEJQUywgOCArICAxICogQlBTLCAxMiArICAxICogQlBTKQorICAgIEdFVF9TU0UoIDIgKiBCUFMsIDQgKyAgMiAqIEJQUywgOCArICAyICogQlBTLCAxMiArICAyICogQlBTKQorICAgIEdFVF9TU0UoIDMgKiBCUFMsIDQgKyAgMyAqIEJQUywgOCArICAzICogQlBTLCAxMiArICAzICogQlBTKQorICAgIEdFVF9TU0UoIDQgKiBCUFMsIDQgKyAgNCAqIEJQUywgOCArICA0ICogQlBTLCAxMiArICA0ICogQlBTKQorICAgIEdFVF9TU0UoIDUgKiBCUFMsIDQgKyAgNSAqIEJQUywgOCArICA1ICogQlBTLCAxMiArICA1ICogQlBTKQorICAgIEdFVF9TU0UoIDYgKiBCUFMsIDQgKyAgNiAqIEJQUywgOCArICA2ICogQlBTLCAxMiArICA2ICogQlBTKQorICAgIEdFVF9TU0UoIDcgKiBCUFMsIDQgKyAgNyAqIEJQUywgOCArICA3ICogQlBTLCAxMiArICA3ICogQlBTKQorICAgICJtZmxvICAgJVtjb3VudF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW2NvdW50XSI9JnIiKGNvdW50KQorICAgIDogW2FdInIiKGEpLCBbYl0iciIoYikKKyAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iCisgICk7CisgIHJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBTU0U4eDhfTUlQU2RzcFIyKGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIpIHsKKyAgaW50IGNvdW50OworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDM7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICJtdWx0ICAgJHplcm8sICAgICR6ZXJvICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgR0VUX1NTRSgwICogQlBTLCA0ICsgMCAqIEJQUywgMSAqIEJQUywgNCArIDEgKiBCUFMpCisgICAgR0VUX1NTRSgyICogQlBTLCA0ICsgMiAqIEJQUywgMyAqIEJQUywgNCArIDMgKiBCUFMpCisgICAgR0VUX1NTRSg0ICogQlBTLCA0ICsgNCAqIEJQUywgNSAqIEJQUywgNCArIDUgKiBCUFMpCisgICAgR0VUX1NTRSg2ICogQlBTLCA0ICsgNiAqIEJQUywgNyAqIEJQUywgNCArIDcgKiBCUFMpCisgICAgIm1mbG8gICAlW2NvdW50XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbY291bnRdIj0mciIoY291bnQpCisgICAgOiBbYV0iciIoYSksIFtiXSJyIihiKQorICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIKKyAgKTsKKyAgcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IFNTRTR4NF9NSVBTZHNwUjIoY29uc3QgdWludDhfdCogYSwgY29uc3QgdWludDhfdCogYikgeworICBpbnQgY291bnQ7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMzsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgIm11bHQgICAkemVybywgICAgJHplcm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICBHRVRfU1NFKDAgKiBCUFMsIDEgKiBCUFMsIDIgKiBCUFMsIDMgKiBCUFMpCisgICAgIm1mbG8gICAlW2NvdW50XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbY291bnRdIj0mciIoY291bnQpCisgICAgOiBbYV0iciIoYSksIFtiXSJyIihiKQorICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIKKyAgKTsKKyAgcmV0dXJuIGNvdW50OworfQorCisjdW5kZWYgR0VUX1NTRQorI3VuZGVmIEdFVF9TU0VfSU5ORVIKKworI2VuZGlmICAvLyAhV09SS19BUk9VTkRfR0NDCisKKyN1bmRlZiBGSUxMXzhfT1JfMTYKKyN1bmRlZiBGSUxMX1BBUlQKKyN1bmRlZiBPVVRQVVRfRUFSTFlfQ0xPQkJFUl9SRUdTXzE3CisjdW5kZWYgTVVMX0hBTEYKKyN1bmRlZiBBQlNfWDgKKyN1bmRlZiBBRERfU1VCX0hBTFZFU19YNAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUXVhbnRpemF0aW9uCisvLworCisvLyBtYWNybyBmb3Igb25lIHBhc3MgdGhyb3VnaCBmb3IgbG9vcCBpbiBRdWFudGl6ZUJsb2NrIHJlYWRpbmcgMiB2YWx1ZXMgYXQgdGltZQorLy8gUVVBTlRESVYgbWFjcm8gaW5saW5lZAorLy8gSiAtIG9mZnNldCBpbiBieXRlcyAoa1ppZ3phZ1tuXSAqIDIpCisvLyBLIC0gb2Zmc2V0IGluIGJ5dGVzIChrWmlnemFnW25dICogNCkKKy8vIE4gLSBvZmZzZXQgaW4gYnl0ZXMgKG4gKiAyKQorLy8gTjEgLSBvZmZzZXQgaW4gYnl0ZXMgKChuICsgMSkgKiAyKQorI2RlZmluZSBRVUFOVElaRV9PTkUoSiwgSywgTiwgTjEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ1bHcgICAgICAgICAlW3RlbXAxXSwgICAgICIgI0ogIiglW3BwaW5dKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgInVsdyAgICAgICAgICVbdGVtcDJdLCAgICAgIiAjSiAiKCVbcHBzaGFycGVuXSkgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAibGh1ICAgICAgICAgJVt0ZW1wM10sICAgICAiICNLICIoJVtwcHp0aHJlc2hdKSAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJsaHUgICAgICAgICAlW3RlbXA2XSwgICAgICIgI0sgIis0KCVbcHB6dGhyZXNoXSkgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgImFic3Ffcy5waCAgICVbdGVtcDRdLCAgICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAiaW5zICAgICAgICAgJVt0ZW1wM10sICAgICAlW3RlbXA2XSwgICAgICAgICAxNiwgICAgICAgMTYgIFxuXHQiICAgICAgICBcCisgICJhZGR1LnBoICAgICAlW2NvZWZmXSwgICAgICVbdGVtcDRdLCAgICAgICAgICVbdGVtcDJdICAgICAgXG5cdCIgICAgICAgIFwKKyAgInNocmEucGggICAgICVbc2lnbl0sICAgICAgJVt0ZW1wMV0sICAgICAgICAgMTUgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAibGkgICAgICAgICAgJVtsZXZlbF0sICAgICAweDEwMDAxICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJjbXAubHQucGggICAlW3RlbXAzXSwgICAgICVbY29lZmZdICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgImxodSAgICAgICAgICVbdGVtcDFdLCAgICAgIiAjSiAiKCVbcHBpcV0pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAicGljay5waCAgICAgJVt0ZW1wNV0sICAgICAlW2xldmVsXSwgICAgICAgICAkMCAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJsdyAgICAgICAgICAlW3RlbXAyXSwgICAgICIgI0sgIiglW3BwYmlhc10pICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgImJlcXogICAgICAgICVbdGVtcDVdLCAgICAgMGYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAibGh1ICAgICAgICAgJVt0ZW1wM10sICAgICAiICNKICIoJVtwcHFdKSAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJiZXEgICAgICAgICAlW3RlbXA1XSwgICAgICVbbGV2ZWxdLCAgICAgICAgIDFmICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgImFuZGkgICAgICAgICVbdGVtcDVdLCAgICAgJVt0ZW1wNV0sICAgICAgICAgMHgxICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAiYW5kaSAgICAgICAgJVt0ZW1wNF0sICAgICAlW2NvZWZmXSwgICAgICAgICAweGZmZmYgICAgICAgIFxuXHQiICAgICAgICBcCisgICJiZXF6ICAgICAgICAlW3RlbXA1XSwgICAgIDJmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgIm11bCAgICAgICAgICVbbGV2ZWxdLCAgICAgJVt0ZW1wNF0sICAgICAgICAgJVt0ZW1wMV0gICAgICBcblx0IiAgICAgICAgXAorICAic2ggICAgICAgICAgJDAsICAgICAgICAgICAiICNKICIrMiglW3BwaW5dKSAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJzaCAgICAgICAgICAkMCwgICAgICAgICAgICIgI04xICIoJVtwb3V0XSkgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgImFkZHUgICAgICAgICVbbGV2ZWxdLCAgICAgJVtsZXZlbF0sICAgICAgICAgJVt0ZW1wMl0gICAgICBcblx0IiAgICAgICAgXAorICAic3JhICAgICAgICAgJVtsZXZlbF0sICAgICAlW2xldmVsXSwgICAgICAgICAxNyAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJzbHQgICAgICAgICAlW3RlbXA0XSwgICAgICVbbWF4X2xldmVsXSwgICAgICVbbGV2ZWxdICAgICAgXG5cdCIgICAgICAgIFwKKyAgIm1vdm4gICAgICAgICVbbGV2ZWxdLCAgICAgJVttYXhfbGV2ZWxdLCAgICAgJVt0ZW1wNF0gICAgICBcblx0IiAgICAgICAgXAorICAiYW5kaSAgICAgICAgJVt0ZW1wNl0sICAgICAlW3NpZ25dLCAgICAgICAgICAweGZmZmYgICAgICAgIFxuXHQiICAgICAgICBcCisgICJ4b3IgICAgICAgICAlW2xldmVsXSwgICAgICVbbGV2ZWxdLCAgICAgICAgICVbdGVtcDZdICAgICAgXG5cdCIgICAgICAgIFwKKyAgInN1YnUgICAgICAgICVbbGV2ZWxdLCAgICAgJVtsZXZlbF0sICAgICAgICAgJVt0ZW1wNl0gICAgICBcblx0IiAgICAgICAgXAorICAibXVsICAgICAgICAgJVt0ZW1wNV0sICAgICAlW2xldmVsXSwgICAgICAgICAlW3RlbXAzXSAgICAgIFxuXHQiICAgICAgICBcCisgICJvciAgICAgICAgICAlW3JldF0sICAgICAgICVbcmV0XSwgICAgICAgICAgICVbbGV2ZWxdICAgICAgXG5cdCIgICAgICAgIFwKKyAgInNoICAgICAgICAgICVbbGV2ZWxdLCAgICAgIiAjTiAiKCVbcG91dF0pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAic2ggICAgICAgICAgJVt0ZW1wNV0sICAgICAiICNKICIoJVtwcGluXSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJqICAgICAgICAgICAzZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAibGh1ICAgICAgICAgJVt0ZW1wMV0sICAgICAiICNKICIrMiglW3BwaXFdKSAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJzcmwgICAgICAgICAlW3RlbXA1XSwgICAgICVbY29lZmZdLCAgICAgICAgIDE2ICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgIm11bCAgICAgICAgICVbbGV2ZWxdLCAgICAgJVt0ZW1wNV0sICAgICAgICAgJVt0ZW1wMV0gICAgICBcblx0IiAgICAgICAgXAorICAibHcgICAgICAgICAgJVt0ZW1wMl0sICAgICAiICNLICIrNCglW3BwYmlhc10pICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJsaHUgICAgICAgICAlW3RlbXAzXSwgICAgICIgI0ogIisyKCVbcHBxXSkgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgImFkZHUgICAgICAgICVbbGV2ZWxdLCAgICAgJVtsZXZlbF0sICAgICAgICAgJVt0ZW1wMl0gICAgICBcblx0IiAgICAgICAgXAorICAic3JhICAgICAgICAgJVtsZXZlbF0sICAgICAlW2xldmVsXSwgICAgICAgICAxNyAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJzcmwgICAgICAgICAlW3RlbXA2XSwgICAgICVbc2lnbl0sICAgICAgICAgIDE2ICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgInNsdCAgICAgICAgICVbdGVtcDRdLCAgICAgJVttYXhfbGV2ZWxdLCAgICAgJVtsZXZlbF0gICAgICBcblx0IiAgICAgICAgXAorICAibW92biAgICAgICAgJVtsZXZlbF0sICAgICAlW21heF9sZXZlbF0sICAgICAlW3RlbXA0XSAgICAgIFxuXHQiICAgICAgICBcCisgICJ4b3IgICAgICAgICAlW2xldmVsXSwgICAgICVbbGV2ZWxdLCAgICAgICAgICVbdGVtcDZdICAgICAgXG5cdCIgICAgICAgIFwKKyAgInN1YnUgICAgICAgICVbbGV2ZWxdLCAgICAgJVtsZXZlbF0sICAgICAgICAgJVt0ZW1wNl0gICAgICBcblx0IiAgICAgICAgXAorICAibXVsICAgICAgICAgJVt0ZW1wNV0sICAgICAlW2xldmVsXSwgICAgICAgICAlW3RlbXAzXSAgICAgIFxuXHQiICAgICAgICBcCisgICJzaCAgICAgICAgICAkMCwgICAgICAgICAgICIgI0ogIiglW3BwaW5dKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgInNoICAgICAgICAgICQwLCAgICAgICAgICAgIiAjTiAiKCVbcG91dF0pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAib3IgICAgICAgICAgJVtyZXRdLCAgICAgICAlW3JldF0sICAgICAgICAgICAlW2xldmVsXSAgICAgIFxuXHQiICAgICAgICBcCisgICJzaCAgICAgICAgICAlW3RlbXA1XSwgICAgICIgI0ogIisyKCVbcHBpbl0pICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgInNoICAgICAgICAgICVbbGV2ZWxdLCAgICAgIiAjTjEgIiglW3BvdXRdKSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAiaiAgICAgICAgICAgM2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgImxodSAgICAgICAgICVbdGVtcDFdLCAgICAgIiAjSiAiKCVbcHBpcV0pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAibHcgICAgICAgICAgJVt0ZW1wMl0sICAgICAiICNLICIoJVtwcGJpYXNdKSAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJ1bHcgICAgICAgICAlW3RlbXAzXSwgICAgICIgI0ogIiglW3BwcV0pICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgImFuZGkgICAgICAgICVbdGVtcDVdLCAgICAgJVtjb2VmZl0sICAgICAgICAgMHhmZmZmICAgICAgICBcblx0IiAgICAgICAgXAorICAic3JsICAgICAgICAgJVt0ZW1wMF0sICAgICAlW2NvZWZmXSwgICAgICAgICAxNiAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJsaHUgICAgICAgICAlW3RlbXA2XSwgICAgICIgI0ogIisyKCVbcHBpcV0pICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgImx3ICAgICAgICAgICVbY29lZmZdLCAgICAgIiAjSyAiKzQoJVtwcGJpYXNdKSAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAibXVsICAgICAgICAgJVtsZXZlbF0sICAgICAlW3RlbXA1XSwgICAgICAgICAlW3RlbXAxXSAgICAgIFxuXHQiICAgICAgICBcCisgICJtdWwgICAgICAgICAlW3RlbXA0XSwgICAgICVbdGVtcDBdLCAgICAgICAgICVbdGVtcDZdICAgICAgXG5cdCIgICAgICAgIFwKKyAgImFkZHUgICAgICAgICVbbGV2ZWxdLCAgICAgJVtsZXZlbF0sICAgICAgICAgJVt0ZW1wMl0gICAgICBcblx0IiAgICAgICAgXAorICAiYWRkdSAgICAgICAgJVt0ZW1wNF0sICAgICAlW3RlbXA0XSwgICAgICAgICAlW2NvZWZmXSAgICAgIFxuXHQiICAgICAgICBcCisgICJwcmVjcnEucGgudyAlW2xldmVsXSwgICAgICVbdGVtcDRdLCAgICAgICAgICVbbGV2ZWxdICAgICAgXG5cdCIgICAgICAgIFwKKyAgInNocmEucGggICAgICVbbGV2ZWxdLCAgICAgJVtsZXZlbF0sICAgICAgICAgMSAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAiY21wLmx0LnBoICAgJVttYXhfbGV2ZWwxXSwlW2xldmVsXSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJwaWNrLnBoICAgICAlW2xldmVsXSwgICAgICVbbWF4X2xldmVsXSwgICAgICVbbGV2ZWxdICAgICAgXG5cdCIgICAgICAgIFwKKyAgInhvciAgICAgICAgICVbbGV2ZWxdLCAgICAgJVtsZXZlbF0sICAgICAgICAgJVtzaWduXSAgICAgICBcblx0IiAgICAgICAgXAorICAic3VidS5waCAgICAgJVtsZXZlbF0sICAgICAlW2xldmVsXSwgICAgICAgICAlW3NpZ25dICAgICAgIFxuXHQiICAgICAgICBcCisgICJtdWwucGggICAgICAlW3RlbXAzXSwgICAgICVbbGV2ZWxdLCAgICAgICAgICVbdGVtcDNdICAgICAgXG5cdCIgICAgICAgIFwKKyAgIm9yICAgICAgICAgICVbcmV0XSwgICAgICAgJVtyZXRdLCAgICAgICAgICAgJVtsZXZlbF0gICAgICBcblx0IiAgICAgICAgXAorICAic2ggICAgICAgICAgJVtsZXZlbF0sICAgICAiICNOICIoJVtwb3V0XSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJzcmwgICAgICAgICAlW2xldmVsXSwgICAgICVbbGV2ZWxdLCAgICAgICAgIDE2ICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgInNoICAgICAgICAgICVbbGV2ZWxdLCAgICAgIiAjTjEgIiglW3BvdXRdKSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAidXN3ICAgICAgICAgJVt0ZW1wM10sICAgICAiICNKICIoJVtwcGluXSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJqICAgICAgICAgICAzZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyIwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAic2ggICAgICAgICAgJDAsICAgICAgICAgICAiICNOICIoJVtwb3V0XSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJzaCAgICAgICAgICAkMCwgICAgICAgICAgICIgI04xICIoJVtwb3V0XSkgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgInVzdyAgICAgICAgICQwLCAgICAgICAgICAgIiAjSiAiKCVbcHBpbl0pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorIjM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKK3N0YXRpYyBpbnQgUXVhbnRpemVCbG9ja19NSVBTZHNwUjIoaW50MTZfdCBpblsxNl0sIGludDE2X3Qgb3V0WzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TWF0cml4KiBjb25zdCBtdHgpIHsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsdGVtcDY7CisgIGludCBzaWduLCBjb2VmZiwgbGV2ZWw7CisgIGludCBtYXhfbGV2ZWwgPSBNQVhfTEVWRUw7CisgIGludCBtYXhfbGV2ZWwxID0gbWF4X2xldmVsIDw8IDE2IHwgbWF4X2xldmVsOworICBpbnQgcmV0ID0gMDsKKworICBpbnQxNl90KiBwcGluICAgICAgICAgICAgID0gJmluWzBdOworICBpbnQxNl90KiBwb3V0ICAgICAgICAgICAgID0gJm91dFswXTsKKyAgY29uc3QgdWludDE2X3QqIHBwc2hhcnBlbiA9ICZtdHgtPnNoYXJwZW5fWzBdOworICBjb25zdCB1aW50MzJfdCogcHB6dGhyZXNoID0gJm10eC0+enRocmVzaF9bMF07CisgIGNvbnN0IHVpbnQxNl90KiBwcHEgICAgICAgPSAmbXR4LT5xX1swXTsKKyAgY29uc3QgdWludDE2X3QqIHBwaXEgICAgICA9ICZtdHgtPmlxX1swXTsKKyAgY29uc3QgdWludDMyX3QqIHBwYmlhcyAgICA9ICZtdHgtPmJpYXNfWzBdOworCisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgIFFVQU5USVpFX09ORSggMCwgIDAsICAwLCAgMikKKyAgICBRVUFOVElaRV9PTkUoIDQsICA4LCAxMCwgMTIpCisgICAgUVVBTlRJWkVfT05FKCA4LCAxNiwgIDQsICA4KQorICAgIFFVQU5USVpFX09ORSgxMiwgMjQsIDE0LCAyNCkKKyAgICBRVUFOVElaRV9PTkUoMTYsIDMyLCAgNiwgMTYpCisgICAgUVVBTlRJWkVfT05FKDIwLCA0MCwgMjIsIDI2KQorICAgIFFVQU5USVpFX09ORSgyNCwgNDgsIDE4LCAyMCkKKyAgICBRVUFOVElaRV9PTkUoMjgsIDU2LCAyOCwgMzApCisKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksCisgICAgICBbdGVtcDJdIj0mciIodGVtcDIpLCBbdGVtcDNdIj0mciIodGVtcDMpLAorICAgICAgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgIFtzaWduXSI9JnIiKHNpZ24pLCBbY29lZmZdIj0mciIoY29lZmYpLAorICAgICAgW2xldmVsXSI9JnIiKGxldmVsKSwgW3RlbXA2XSI9JnIiKHRlbXA2KSwgW3JldF0iKyZyIihyZXQpCisgICAgOiBbcHBpbl0iciIocHBpbiksIFtwb3V0XSJyIihwb3V0KSwgW21heF9sZXZlbDFdInIiKG1heF9sZXZlbDEpLAorICAgICAgW3BwaXFdInIiKHBwaXEpLCBbbWF4X2xldmVsXSJyIihtYXhfbGV2ZWwpLAorICAgICAgW3BwYmlhc10iciIocHBiaWFzKSwgW3BwenRocmVzaF0iciIocHB6dGhyZXNoKSwKKyAgICAgIFtwcHNoYXJwZW5dInIiKHBwc2hhcnBlbiksIFtwcHFdInIiKHBwcSkKKyAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iCisgICk7CisKKyAgcmV0dXJuIChyZXQgIT0gMCk7Cit9CisKK3N0YXRpYyBpbnQgUXVhbnRpemUyQmxvY2tzX01JUFNkc3BSMihpbnQxNl90IGluWzMyXSwgaW50MTZfdCBvdXRbMzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOE1hdHJpeCogY29uc3QgbXR4KSB7CisgIGludCBuejsKKyAgbnogID0gUXVhbnRpemVCbG9ja19NSVBTZHNwUjIoaW4gKyAwICogMTYsIG91dCArIDAgKiAxNiwgbXR4KSA8PCAwOworICBueiB8PSBRdWFudGl6ZUJsb2NrX01JUFNkc3BSMihpbiArIDEgKiAxNiwgb3V0ICsgMSAqIDE2LCBtdHgpIDw8IDE7CisgIHJldHVybiBuejsKK30KKworI3VuZGVmIFFVQU5USVpFX09ORQorCisvLyBtYWNybyBmb3Igb25lIGhvcml6b250YWwgcGFzcyBpbiBGVHJhbnNmb3JtV0hUCisvLyB0ZW1wMC4udGVtcDcgaG9sZHMgdG1wWzBdLi50bXBbMTVdCisvLyBBLCBCLCBDLCBEIC0gb2Zmc2V0IGluIGJ5dGVzIHRvIGxvYWQgZnJvbSBpbiBidWZmZXIKKy8vIFRFTVAwLCBURU1QMSAtIHJlZ2lzdGVycyBmb3IgY29ycmVzcG9uZGluZyB0bXAgZWxlbWVudHMKKyNkZWZpbmUgSE9SSVpPTlRBTF9QQVNTX1dIVChBLCBCLCBDLCBELCBURU1QMCwgVEVNUDEpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJsaCAgICAgICAgICAgICAgJVsiICNURU1QMCAiXSwgICIgI0EgIiglW2luXSkgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgXAorICAibGggICAgICAgICAgICAgICVbIiAjVEVNUDEgIl0sICAiICNCICIoJVtpbl0pICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgIFwKKyAgImxoICAgICAgICAgICAgICAlW3RlbXA4XSwgICAgICIgI0MgIiglW2luXSkgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICBcCisgICJsaCAgICAgICAgICAgICAgJVt0ZW1wOV0sICAgICAiICNEICIoJVtpbl0pICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgXAorICAiaW5zICAgICAgICAgICAgICVbIiAjVEVNUDEgIl0sICAlWyIgI1RFTVAwICJdLCAgMTYsICAxNiAgXG5cdCIgICAgICAgICAgICAgIFwKKyAgImlucyAgICAgICAgICAgICAlW3RlbXA5XSwgICAgICVbdGVtcDhdLCAgICAgMTYsICAxNiAgICAgIFxuXHQiICAgICAgICAgICAgICBcCisgICJzdWJxLnBoICAgICAgICAgJVt0ZW1wOF0sICAgICAlWyIgI1RFTVAxICJdLCAgJVt0ZW1wOV0gICBcblx0IiAgICAgICAgICAgICAgXAorICAiYWRkcS5waCAgICAgICAgICVbdGVtcDldLCAgICAgJVsiICNURU1QMSAiXSwgICVbdGVtcDldICAgXG5cdCIgICAgICAgICAgICAgIFwKKyAgInByZWNycS5waC53ICAgICAlWyIgI1RFTVAwICJdLCAgJVt0ZW1wOF0sICAgICAlW3RlbXA5XSAgIFxuXHQiICAgICAgICAgICAgICBcCisgICJhcHBlbmQgICAgICAgICAgJVt0ZW1wOF0sICAgICAlW3RlbXA5XSwgICAgIDE2ICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgXAorICAic3VicS5waCAgICAgICAgICVbIiAjVEVNUDEgIl0sICAlWyIgI1RFTVAwICJdLCAgJVt0ZW1wOF0gXG5cdCIgICAgICAgICAgICAgIFwKKyAgImFkZHEucGggICAgICAgICAlWyIgI1RFTVAwICJdLCAgJVsiICNURU1QMCAiXSwgICVbdGVtcDhdIFxuXHQiICAgICAgICAgICAgICBcCisgICJyb3RyICAgICAgICAgICAgJVsiICNURU1QMSAiXSwgICVbIiAjVEVNUDEgIl0sICAxNiAgICAgICBcblx0IgorCisvLyBtYWNybyBmb3Igb25lIHZlcnRpY2FsIHBhc3MgaW4gRlRyYW5zZm9ybVdIVAorLy8gdGVtcDAuLnRlbXA3IGhvbGRzIHRtcFswXS4udG1wWzE1XQorLy8gQSwgQiwgQywgRCAtIG9mZnNldHMgaW4gYnl0ZXMgdG8gc3RvcmUgdG8gb3V0IGJ1ZmZlcgorLy8gVEVNUDAsIFRFTVAyLCBURU1QNCBhbmQgVEVNUDYgLSByZWdpc3RlcnMgZm9yIGNvcnJlc3BvbmRpbmcgdG1wIGVsZW1lbnRzCisjZGVmaW5lIFZFUlRJQ0FMX1BBU1NfV0hUKEEsIEIsIEMsIEQsIFRFTVAwLCBURU1QMiwgVEVNUDQsIFRFTVA2KSAgICAgICAgICAgICAgXAorICAiYWRkcS5waCAgICAgICAgICVbdGVtcDhdLCAgICAgJVsiICNURU1QMCAiXSwgICVbIiAjVEVNUDQgIl0gICAgXG5cdCIgICAgICAgIFwKKyAgImFkZHEucGggICAgICAgICAlW3RlbXA5XSwgICAgICVbIiAjVEVNUDIgIl0sICAlWyIgI1RFTVA2ICJdICAgIFxuXHQiICAgICAgICBcCisgICJzdWJxLnBoICAgICAgICAgJVsiICNURU1QMiAiXSwgICVbIiAjVEVNUDIgIl0sICAlWyIgI1RFTVA2ICJdICBcblx0IiAgICAgICAgXAorICAic3VicS5waCAgICAgICAgICVbIiAjVEVNUDYgIl0sICAlWyIgI1RFTVAwICJdLCAgJVsiICNURU1QNCAiXSAgXG5cdCIgICAgICAgIFwKKyAgImFkZHFoLnBoICAgICAgICAlWyIgI1RFTVAwICJdLCAgJVt0ZW1wOF0sICAgICAlW3RlbXA5XSAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJzdWJxaC5waCAgICAgICAgJVsiICNURU1QNCAiXSwgICVbIiAjVEVNUDYgIl0sICAlWyIgI1RFTVAyICJdICBcblx0IiAgICAgICAgXAorICAiYWRkcWgucGggICAgICAgICVbIiAjVEVNUDIgIl0sICAlWyIgI1RFTVAyICJdLCAgJVsiICNURU1QNiAiXSAgXG5cdCIgICAgICAgIFwKKyAgInN1YnFoLnBoICAgICAgICAlWyIgI1RFTVA2ICJdLCAgJVt0ZW1wOF0sICAgICAlW3RlbXA5XSAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJ1c3cgICAgICAgICAgICAgJVsiICNURU1QMCAiXSwgICIgI0EgIiglW291dF0pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAidXN3ICAgICAgICAgICAgICVbIiAjVEVNUDIgIl0sICAiICNCICIoJVtvdXRdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgInVzdyAgICAgICAgICAgICAlWyIgI1RFTVA0ICJdLCAgIiAjQyAiKCVbb3V0XSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJ1c3cgICAgICAgICAgICAgJVsiICNURU1QNiAiXSwgICIgI0QgIiglW291dF0pICAgICAgICAgICAgICAgICBcblx0IgorCitzdGF0aWMgdm9pZCBGVHJhbnNmb3JtV0hUX01JUFNkc3BSMihjb25zdCBpbnQxNl90KiBpbiwgaW50MTZfdCogb3V0KSB7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQ7CisgIGludCB0ZW1wNSwgdGVtcDYsIHRlbXA3LCB0ZW1wOCwgdGVtcDk7CisKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgSE9SSVpPTlRBTF9QQVNTX1dIVCggIDAsICAzMiwgIDY0LCAgOTYsIHRlbXAwLCB0ZW1wMSkKKyAgICBIT1JJWk9OVEFMX1BBU1NfV0hUKDEyOCwgMTYwLCAxOTIsIDIyNCwgdGVtcDIsIHRlbXAzKQorICAgIEhPUklaT05UQUxfUEFTU19XSFQoMjU2LCAyODgsIDMyMCwgMzUyLCB0ZW1wNCwgdGVtcDUpCisgICAgSE9SSVpPTlRBTF9QQVNTX1dIVCgzODQsIDQxNiwgNDQ4LCA0ODAsIHRlbXA2LCB0ZW1wNykKKyAgICBWRVJUSUNBTF9QQVNTX1dIVCgwLCAgOCwgMTYsIDI0LCB0ZW1wMCwgdGVtcDIsIHRlbXA0LCB0ZW1wNikKKyAgICBWRVJUSUNBTF9QQVNTX1dIVCg0LCAxMiwgMjAsIDI4LCB0ZW1wMSwgdGVtcDMsIHRlbXA1LCB0ZW1wNykKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLAorICAgICAgW3RlbXA2XSI9JnIiKHRlbXA2KSwgW3RlbXA3XSI9JnIiKHRlbXA3KSwgW3RlbXA4XSI9JnIiKHRlbXA4KSwKKyAgICAgIFt0ZW1wOV0iPSZyIih0ZW1wOSkKKyAgICA6IFtpbl0iciIoaW4pLCBbb3V0XSJyIihvdXQpCisgICAgOiAibWVtb3J5IgorICApOworfQorCisjdW5kZWYgVkVSVElDQUxfUEFTU19XSFQKKyN1bmRlZiBIT1JJWk9OVEFMX1BBU1NfV0hUCisKKy8vIG1hY3JvIGZvciBjb252ZXJ0aW5nIGNvZWZmaWNpZW50cyB0byBiaW4KKy8vIGNvbnZlcnQgOCBjb2VmZnMgYXQgdGltZQorLy8gQSwgQiwgQywgRCAtIG9mZnNldHMgaW4gYnl0ZXMgdG8gbG9hZCBmcm9tIG91dCBidWZmZXIKKyNkZWZpbmUgQ09OVkVSVF9DT0VGRlNfVE9fQklOKEEsIEIsIEMsIEQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ1bHcgICAgICAgICVbdGVtcDBdLCAgIiAjQSAiKCVbb3V0XSkgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAidWx3ICAgICAgICAlW3RlbXAxXSwgICIgI0IgIiglW291dF0pICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgInVsdyAgICAgICAgJVt0ZW1wMl0sICAiICNDICIoJVtvdXRdKSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJ1bHcgICAgICAgICVbdGVtcDNdLCAgIiAjRCAiKCVbb3V0XSkgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAiYWJzcV9zLnBoICAlW3RlbXAwXSwgICVbdGVtcDBdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImFic3Ffcy5waCAgJVt0ZW1wMV0sICAlW3RlbXAxXSAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJhYnNxX3MucGggICVbdGVtcDJdLCAgJVt0ZW1wMl0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAiYWJzcV9zLnBoICAlW3RlbXAzXSwgICVbdGVtcDNdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgInNocmEucGggICAgJVt0ZW1wMF0sICAlW3RlbXAwXSwgICAgMyAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJzaHJhLnBoICAgICVbdGVtcDFdLCAgJVt0ZW1wMV0sICAgIDMgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAic2hyYS5waCAgICAlW3RlbXAyXSwgICVbdGVtcDJdLCAgICAzICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgInNocmEucGggICAgJVt0ZW1wM10sICAlW3RlbXAzXSwgICAgMyAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJzaGxsX3MucGggICVbdGVtcDBdLCAgJVt0ZW1wMF0sICAgIDEwICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAic2hsbF9zLnBoICAlW3RlbXAxXSwgICVbdGVtcDFdLCAgICAxMCAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgInNobGxfcy5waCAgJVt0ZW1wMl0sICAlW3RlbXAyXSwgICAgMTAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJzaGxsX3MucGggICVbdGVtcDNdLCAgJVt0ZW1wM10sICAgIDEwICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAic2hybC5waCAgICAlW3RlbXAwXSwgICVbdGVtcDBdLCAgICAxMCAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgInNocmwucGggICAgJVt0ZW1wMV0sICAlW3RlbXAxXSwgICAgMTAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJzaHJsLnBoICAgICVbdGVtcDJdLCAgJVt0ZW1wMl0sICAgIDEwICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAic2hybC5waCAgICAlW3RlbXAzXSwgICVbdGVtcDNdLCAgICAxMCAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgInNobGwucGggICAgJVt0ZW1wMF0sICAlW3RlbXAwXSwgICAgMiAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJzaGxsLnBoICAgICVbdGVtcDFdLCAgJVt0ZW1wMV0sICAgIDIgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAic2hsbC5waCAgICAlW3RlbXAyXSwgICVbdGVtcDJdLCAgICAyICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgInNobGwucGggICAgJVt0ZW1wM10sICAlW3RlbXAzXSwgICAgMiAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJleHQgICAgICAgICVbdGVtcDRdLCAgJVt0ZW1wMF0sICAgIDAsICAgICAgIDE2ICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAiZXh0ICAgICAgICAlW3RlbXAwXSwgICVbdGVtcDBdLCAgICAxNiwgICAgICAxNiAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImFkZHUgICAgICAgJVt0ZW1wNF0sICAlW3RlbXA0XSwgICAgJVtkaXN0XSAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJhZGR1ICAgICAgICVbdGVtcDBdLCAgJVt0ZW1wMF0sICAgICVbZGlzdF0gICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAiZXh0ICAgICAgICAlW3RlbXA1XSwgICVbdGVtcDFdLCAgICAwLCAgICAgICAxNiAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImx3ICAgICAgICAgJVt0ZW1wOF0sICAwKCVbdGVtcDRdKSAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJleHQgICAgICAgICVbdGVtcDFdLCAgJVt0ZW1wMV0sICAgIDE2LCAgICAgIDE2ICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAiYWRkdSAgICAgICAlW3RlbXA1XSwgICVbdGVtcDVdLCAgICAlW2Rpc3RdICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImFkZGl1ICAgICAgJVt0ZW1wOF0sICAlW3RlbXA4XSwgICAgMSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJzdyAgICAgICAgICVbdGVtcDhdLCAgMCglW3RlbXA0XSkgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAibHcgICAgICAgICAlW3RlbXA4XSwgIDAoJVt0ZW1wMF0pICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImFkZHUgICAgICAgJVt0ZW1wMV0sICAlW3RlbXAxXSwgICAgJVtkaXN0XSAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJleHQgICAgICAgICVbdGVtcDZdLCAgJVt0ZW1wMl0sICAgIDAsICAgICAgIDE2ICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAiYWRkaXUgICAgICAlW3RlbXA4XSwgICVbdGVtcDhdLCAgICAxICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgInN3ICAgICAgICAgJVt0ZW1wOF0sICAwKCVbdGVtcDBdKSAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJsdyAgICAgICAgICVbdGVtcDhdLCAgMCglW3RlbXA1XSkgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAiZXh0ICAgICAgICAlW3RlbXAyXSwgICVbdGVtcDJdLCAgICAxNiwgICAgICAxNiAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImFkZHUgICAgICAgJVt0ZW1wNl0sICAlW3RlbXA2XSwgICAgJVtkaXN0XSAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJhZGRpdSAgICAgICVbdGVtcDhdLCAgJVt0ZW1wOF0sICAgIDEgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAic3cgICAgICAgICAlW3RlbXA4XSwgIDAoJVt0ZW1wNV0pICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImx3ICAgICAgICAgJVt0ZW1wOF0sICAwKCVbdGVtcDFdKSAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJhZGR1ICAgICAgICVbdGVtcDJdLCAgJVt0ZW1wMl0sICAgICVbZGlzdF0gICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAiZXh0ICAgICAgICAlW3RlbXA3XSwgICVbdGVtcDNdLCAgICAwLCAgICAgICAxNiAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImFkZGl1ICAgICAgJVt0ZW1wOF0sICAlW3RlbXA4XSwgICAgMSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJzdyAgICAgICAgICVbdGVtcDhdLCAgMCglW3RlbXAxXSkgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAibHcgICAgICAgICAlW3RlbXA4XSwgIDAoJVt0ZW1wNl0pICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImV4dCAgICAgICAgJVt0ZW1wM10sICAlW3RlbXAzXSwgICAgMTYsICAgICAgMTYgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJhZGR1ICAgICAgICVbdGVtcDddLCAgJVt0ZW1wN10sICAgICVbZGlzdF0gICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAiYWRkaXUgICAgICAlW3RlbXA4XSwgICVbdGVtcDhdLCAgICAxICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgInN3ICAgICAgICAgJVt0ZW1wOF0sICAwKCVbdGVtcDZdKSAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJsdyAgICAgICAgICVbdGVtcDhdLCAgMCglW3RlbXAyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAiYWRkdSAgICAgICAlW3RlbXAzXSwgICVbdGVtcDNdLCAgICAlW2Rpc3RdICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImFkZGl1ICAgICAgJVt0ZW1wOF0sICAlW3RlbXA4XSwgICAgMSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJzdyAgICAgICAgICVbdGVtcDhdLCAgMCglW3RlbXAyXSkgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAibHcgICAgICAgICAlW3RlbXA4XSwgIDAoJVt0ZW1wN10pICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImFkZGl1ICAgICAgJVt0ZW1wOF0sICAlW3RlbXA4XSwgICAgMSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJzdyAgICAgICAgICVbdGVtcDhdLCAgMCglW3RlbXA3XSkgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAibHcgICAgICAgICAlW3RlbXA4XSwgIDAoJVt0ZW1wM10pICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImFkZGl1ICAgICAgJVt0ZW1wOF0sICAlW3RlbXA4XSwgICAgMSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJzdyAgICAgICAgICVbdGVtcDhdLCAgMCglW3RlbXAzXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKKworc3RhdGljIHZvaWQgQ29sbGVjdEhpc3RvZ3JhbV9NSVBTZHNwUjIoY29uc3QgdWludDhfdCogcmVmLCBjb25zdCB1aW50OF90KiBwcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X2Jsb2NrLCBpbnQgZW5kX2Jsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4SGlzdG9ncmFtKiBjb25zdCBoaXN0bykgeworICBpbnQgajsKKyAgaW50IGRpc3RyaWJ1dGlvbltNQVhfQ09FRkZfVEhSRVNIICsgMV0gPSB7IDAgfTsKKyAgY29uc3QgaW50IG1heF9jb2VmZiA9IChNQVhfQ09FRkZfVEhSRVNIIDw8IDE2KSArIE1BWF9DT0VGRl9USFJFU0g7CisgIGZvciAoaiA9IHN0YXJ0X2Jsb2NrOyBqIDwgZW5kX2Jsb2NrOyArK2opIHsKKyAgICBpbnQxNl90IG91dFsxNl07CisgICAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA2LCB0ZW1wNywgdGVtcDg7CisKKyAgICBWUDhGVHJhbnNmb3JtKHJlZiArIFZQOERzcFNjYW5bal0sIHByZWQgKyBWUDhEc3BTY2FuW2pdLCBvdXQpOworCisgICAgLy8gQ29udmVydCBjb2VmZmljaWVudHMgdG8gYmluLgorICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgQ09OVkVSVF9DT0VGRlNfVE9fQklOKCAwLCAgNCwgIDgsIDEyKQorICAgICAgQ09OVkVSVF9DT0VGRlNfVE9fQklOKDE2LCAyMCwgMjQsIDI4KQorICAgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLAorICAgICAgICBbdGVtcDZdIj0mciIodGVtcDYpLCBbdGVtcDddIj0mciIodGVtcDcpLCBbdGVtcDhdIj0mciIodGVtcDgpCisgICAgICA6IFtkaXN0XSJyIihkaXN0cmlidXRpb24pLCBbb3V0XSJyIihvdXQpLCBbbWF4X2NvZWZmXSJyIihtYXhfY29lZmYpCisgICAgICA6ICJtZW1vcnkiCisgICAgKTsKKyAgfQorICBWUDhTZXRIaXN0b2dyYW1EYXRhKGRpc3RyaWJ1dGlvbiwgaGlzdG8pOworfQorCisjdW5kZWYgQ09OVkVSVF9DT0VGRlNfVE9fQklOCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBWUDhFbmNEc3BJbml0TUlQU2RzcFIyKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgVlA4RW5jRHNwSW5pdE1JUFNkc3BSMih2b2lkKSB7CisgIFZQOEZUcmFuc2Zvcm0gPSBGVHJhbnNmb3JtX01JUFNkc3BSMjsKKyAgVlA4RlRyYW5zZm9ybVdIVCA9IEZUcmFuc2Zvcm1XSFRfTUlQU2RzcFIyOworICBWUDhJVHJhbnNmb3JtID0gSVRyYW5zZm9ybV9NSVBTZHNwUjI7CisKKyAgVlA4VERpc3RvNHg0ID0gRGlzdG80eDRfTUlQU2RzcFIyOworICBWUDhURGlzdG8xNngxNiA9IERpc3RvMTZ4MTZfTUlQU2RzcFIyOworCisgIFZQOEVuY1ByZWRMdW1hMTYgPSBJbnRyYTE2UHJlZHNfTUlQU2RzcFIyOworICBWUDhFbmNQcmVkQ2hyb21hOCA9IEludHJhQ2hyb21hUHJlZHNfTUlQU2RzcFIyOworICBWUDhFbmNQcmVkTHVtYTQgPSBJbnRyYTRQcmVkc19NSVBTZHNwUjI7CisKKyNpZiAhZGVmaW5lZChXT1JLX0FST1VORF9HQ0MpCisgIFZQOFNTRTE2eDE2ID0gU1NFMTZ4MTZfTUlQU2RzcFIyOworICBWUDhTU0U4eDggPSBTU0U4eDhfTUlQU2RzcFIyOworICBWUDhTU0UxNng4ID0gU1NFMTZ4OF9NSVBTZHNwUjI7CisgIFZQOFNTRTR4NCA9IFNTRTR4NF9NSVBTZHNwUjI7CisjZW5kaWYKKworICBWUDhFbmNRdWFudGl6ZUJsb2NrID0gUXVhbnRpemVCbG9ja19NSVBTZHNwUjI7CisgIFZQOEVuY1F1YW50aXplMkJsb2NrcyA9IFF1YW50aXplMkJsb2Nrc19NSVBTZHNwUjI7CisKKyAgVlA4Q29sbGVjdEhpc3RvZ3JhbSA9IENvbGxlY3RIaXN0b2dyYW1fTUlQU2RzcFIyOworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX01JUFNfRFNQX1IyCisKK1dFQlBfRFNQX0lOSVRfU1RVQihWUDhFbmNEc3BJbml0TUlQU2RzcFIyKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX01JUFNfRFNQX1IyCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2VuY19tc2EuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZW5jX21zYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmODVhZGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2VuY19tc2EuYwpAQCAtMCwwICsxLDg5NiBAQAorLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIE1TQSB2ZXJzaW9uIG9mIGVuY29kZXIgZHNwIGZ1bmN0aW9ucy4KKy8vCisvLyBBdXRob3I6ICBQcmFzaGFudCBQYXRpbCAgIChwcmFzaGFudC5wYXRpbEBpbWd0ZWMuY29tKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTVNBKQorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAic3JjL2RzcC9tc2FfbWFjcm8uaCIKKyNpbmNsdWRlICJzcmMvZW5jL3ZwOGlfZW5jLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUcmFuc2Zvcm1zCisKKyNkZWZpbmUgSURDVF8xRF9XKGluMCwgaW4xLCBpbjIsIGluMywgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MykgZG8geyAgXAorICB2NGkzMiBhMV9tLCBiMV9tLCBjMV9tLCBkMV9tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHY0aTMyIGNvc3BpOHNxcnQybWludXMxID0gX19tc2FfZmlsbF93KDIwMDkxKTsgICAgICAgICAgICAgIFwKKyAgY29uc3QgdjRpMzIgc2lucGk4c3FydDIgPSBfX21zYV9maWxsX3coMzU0NjgpOyAgICAgICAgICAgICAgICAgICAgXAorICB2NGkzMiBjX3RtcDFfbSA9IGluMSAqIHNpbnBpOHNxcnQyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHY0aTMyIGNfdG1wMl9tID0gaW4zICogY29zcGk4c3FydDJtaW51czE7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdjRpMzIgZF90bXAxX20gPSBpbjEgKiBjb3NwaThzcXJ0Mm1pbnVzMTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2NGkzMiBkX3RtcDJfbSA9IGluMyAqIHNpbnBpOHNxcnQyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQUREU1VCMihpbjAsIGluMiwgYTFfbSwgYjFfbSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBTUkFJX1cyX1NXKGNfdG1wMV9tLCBjX3RtcDJfbSwgMTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNfdG1wMl9tID0gY190bXAyX20gKyBpbjM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYzFfbSA9IGNfdG1wMV9tIC0gY190bXAyX207ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBTUkFJX1cyX1NXKGRfdG1wMV9tLCBkX3RtcDJfbSwgMTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRfdG1wMV9tID0gZF90bXAxX20gKyBpbjE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZDFfbSA9IGRfdG1wMV9tICsgZF90bXAyX207ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBCVVRURVJGTFlfNChhMV9tLCBiMV9tLCBjMV9tLCBkMV9tLCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKTsgICAgICBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBJVHJhbnNmb3JtT25lKGNvbnN0IHVpbnQ4X3QqIHJlZiwgY29uc3QgaW50MTZfdCogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCkgeworICB2OGkxNiBpbnB1dDAsIGlucHV0MTsKKyAgdjRpMzIgaW4wLCBpbjEsIGluMiwgaW4zLCBoejAsIGh6MSwgaHoyLCBoejMsIHZ0MCwgdnQxLCB2dDIsIHZ0MzsKKyAgdjRpMzIgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMzsKKyAgdjE2aTggZGVzdDAsIGRlc3QxLCBkZXN0MiwgZGVzdDM7CisgIGNvbnN0IHYxNmk4IHplcm8gPSB7IDAgfTsKKworICBMRF9TSDIoaW4sIDgsIGlucHV0MCwgaW5wdXQxKTsKKyAgVU5QQ0tfU0hfU1coaW5wdXQwLCBpbjAsIGluMSk7CisgIFVOUENLX1NIX1NXKGlucHV0MSwgaW4yLCBpbjMpOworICBJRENUXzFEX1coaW4wLCBpbjEsIGluMiwgaW4zLCBoejAsIGh6MSwgaHoyLCBoejMpOworICBUUkFOU1BPU0U0eDRfU1dfU1coaHowLCBoejEsIGh6MiwgaHozLCBoejAsIGh6MSwgaHoyLCBoejMpOworICBJRENUXzFEX1coaHowLCBoejEsIGh6MiwgaHozLCB2dDAsIHZ0MSwgdnQyLCB2dDMpOworICBTUkFSSV9XNF9TVyh2dDAsIHZ0MSwgdnQyLCB2dDMsIDMpOworICBUUkFOU1BPU0U0eDRfU1dfU1codnQwLCB2dDEsIHZ0MiwgdnQzLCB2dDAsIHZ0MSwgdnQyLCB2dDMpOworICBMRF9TQjQocmVmLCBCUFMsIGRlc3QwLCBkZXN0MSwgZGVzdDIsIGRlc3QzKTsKKyAgSUxWUl9CNF9TVyh6ZXJvLCBkZXN0MCwgemVybywgZGVzdDEsIHplcm8sIGRlc3QyLCB6ZXJvLCBkZXN0MywKKyAgICAgICAgICAgICByZXMwLCByZXMxLCByZXMyLCByZXMzKTsKKyAgSUxWUl9INF9TVyh6ZXJvLCByZXMwLCB6ZXJvLCByZXMxLCB6ZXJvLCByZXMyLCB6ZXJvLCByZXMzLAorICAgICAgICAgICAgIHJlczAsIHJlczEsIHJlczIsIHJlczMpOworICBBREQ0KHJlczAsIHZ0MCwgcmVzMSwgdnQxLCByZXMyLCB2dDIsIHJlczMsIHZ0MywgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMyk7CisgIENMSVBfU1c0XzBfMjU1KHJlczAsIHJlczEsIHJlczIsIHJlczMpOworICBQQ0tFVl9CMl9TVyhyZXMwLCByZXMxLCByZXMyLCByZXMzLCB2dDAsIHZ0MSk7CisgIHJlczAgPSAodjRpMzIpX19tc2FfcGNrZXZfYigodjE2aTgpdnQwLCAodjE2aTgpdnQxKTsKKyAgU1Q0eDRfVUIocmVzMCwgcmVzMCwgMywgMiwgMSwgMCwgZHN0LCBCUFMpOworfQorCitzdGF0aWMgdm9pZCBJVHJhbnNmb3JtX01TQShjb25zdCB1aW50OF90KiByZWYsIGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZG9fdHdvKSB7CisgIElUcmFuc2Zvcm1PbmUocmVmLCBpbiwgZHN0KTsKKyAgaWYgKGRvX3R3bykgeworICAgIElUcmFuc2Zvcm1PbmUocmVmICsgNCwgaW4gKyAxNiwgZHN0ICsgNCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgRlRyYW5zZm9ybV9NU0EoY29uc3QgdWludDhfdCogc3JjLCBjb25zdCB1aW50OF90KiByZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90KiBvdXQpIHsKKyAgdWludDY0X3Qgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MzsKKyAgdWludDMyX3QgaW4wLCBpbjEsIGluMiwgaW4zOworICB2NGkzMiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1OworICB2OGkxNiB0MCwgdDEsIHQyLCB0MzsKKyAgdjE2dTggc3JjbDAsIHNyY2wxLCBzcmMwID0geyAwIH0sIHNyYzEgPSB7IDAgfTsKKyAgY29uc3QgdjhpMTYgbWFzazAgPSB7IDAsIDQsIDgsIDEyLCAxLCA1LCA5LCAxMyB9OworICBjb25zdCB2OGkxNiBtYXNrMSA9IHsgMywgNywgMTEsIDE1LCAyLCA2LCAxMCwgMTQgfTsKKyAgY29uc3QgdjhpMTYgbWFzazIgPSB7IDQsIDAsIDUsIDEsIDYsIDIsIDcsIDMgfTsKKyAgY29uc3QgdjhpMTYgbWFzazMgPSB7IDAsIDQsIDEsIDUsIDIsIDYsIDMsIDcgfTsKKyAgY29uc3QgdjhpMTYgY25zdDAgPSB7IDIyMTcsIC01MzUyLCAyMjE3LCAtNTM1MiwgMjIxNywgLTUzNTIsIDIyMTcsIC01MzUyIH07CisgIGNvbnN0IHY4aTE2IGNuc3QxID0geyA1MzUyLCAyMjE3LCA1MzUyLCAyMjE3LCA1MzUyLCAyMjE3LCA1MzUyLCAyMjE3IH07CisKKyAgTFc0KHNyYywgQlBTLCBpbjAsIGluMSwgaW4yLCBpbjMpOworICBJTlNFUlRfVzRfVUIoaW4wLCBpbjEsIGluMiwgaW4zLCBzcmMwKTsKKyAgTFc0KHJlZiwgQlBTLCBpbjAsIGluMSwgaW4yLCBpbjMpOworICBJTlNFUlRfVzRfVUIoaW4wLCBpbjEsIGluMiwgaW4zLCBzcmMxKTsKKyAgSUxWUkxfQjJfVUIoc3JjMCwgc3JjMSwgc3JjbDAsIHNyY2wxKTsKKyAgSFNVQl9VQjJfU0goc3JjbDAsIHNyY2wxLCB0MCwgdDEpOworICBWU0hGX0gyX1NIKHQwLCB0MSwgdDAsIHQxLCBtYXNrMCwgbWFzazEsIHQyLCB0Myk7CisgIEFERFNVQjIodDIsIHQzLCB0MCwgdDEpOworICB0MCA9IFNSTElfSCh0MCwgMyk7CisgIFZTSEZfSDJfU0godDAsIHQwLCB0MSwgdDEsIG1hc2syLCBtYXNrMywgdDMsIHQyKTsKKyAgdG1wMCA9IF9fbXNhX2hhZGRfc193KHQzLCB0Myk7CisgIHRtcDIgPSBfX21zYV9oc3ViX3Nfdyh0MywgdDMpOworICBGSUxMX1cyX1NXKDE4MTIsIDkzNywgdG1wMSwgdG1wMyk7CisgIERQQUREX1NIMl9TVyh0MiwgdDIsIGNuc3QwLCBjbnN0MSwgdG1wMywgdG1wMSk7CisgIFNSQUlfVzJfU1codG1wMSwgdG1wMywgOSk7CisgIFBDS0VWX0gyX1NIKHRtcDEsIHRtcDAsIHRtcDMsIHRtcDIsIHQwLCB0MSk7CisgIFZTSEZfSDJfU0godDAsIHQxLCB0MCwgdDEsIG1hc2swLCBtYXNrMSwgdDIsIHQzKTsKKyAgQUREU1VCMih0MiwgdDMsIHQwLCB0MSk7CisgIFZTSEZfSDJfU0godDAsIHQwLCB0MSwgdDEsIG1hc2syLCBtYXNrMywgdDMsIHQyKTsKKyAgdG1wMCA9IF9fbXNhX2hhZGRfc193KHQzLCB0Myk7CisgIHRtcDIgPSBfX21zYV9oc3ViX3Nfdyh0MywgdDMpOworICBBRERWSV9XMl9TVyh0bXAwLCA3LCB0bXAyLCA3LCB0bXAwLCB0bXAyKTsKKyAgU1JBSV9XMl9TVyh0bXAwLCB0bXAyLCA0KTsKKyAgRklMTF9XMl9TVygxMjAwMCwgNTEwMDAsIHRtcDEsIHRtcDMpOworICBEUEFERF9TSDJfU1codDIsIHQyLCBjbnN0MCwgY25zdDEsIHRtcDMsIHRtcDEpOworICBTUkFJX1cyX1NXKHRtcDEsIHRtcDMsIDE2KTsKKyAgVU5QQ0tfUl9TSF9TVyh0MSwgdG1wNCk7CisgIHRtcDUgPSBfX21zYV9jZXFpX3codG1wNCwgMCk7CisgIHRtcDQgPSAodjRpMzIpX19tc2Ffbm9yX3YoKHYxNnU4KXRtcDUsICh2MTZ1OCl0bXA1KTsKKyAgdG1wNSA9IF9fbXNhX2ZpbGxfdygxKTsKKyAgdG1wNSA9ICh2NGkzMilfX21zYV9hbmRfdigodjE2dTgpdG1wNSwgKHYxNnU4KXRtcDQpOworICB0bXAxICs9IHRtcDU7CisgIFBDS0VWX0gyX1NIKHRtcDEsIHRtcDAsIHRtcDMsIHRtcDIsIHQwLCB0MSk7CisgIG91dDAgPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpdDAsIDApOworICBvdXQxID0gX19tc2FfY29weV9zX2QoKHYyaTY0KXQwLCAxKTsKKyAgb3V0MiA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NCl0MSwgMCk7CisgIG91dDMgPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpdDEsIDEpOworICBTRDQob3V0MCwgb3V0MSwgb3V0Miwgb3V0Mywgb3V0LCA4KTsKK30KKworc3RhdGljIHZvaWQgRlRyYW5zZm9ybVdIVF9NU0EoY29uc3QgaW50MTZfdCogaW4sIGludDE2X3QqIG91dCkgeworICB2OGkxNiBpbjAgPSB7IDAgfTsKKyAgdjhpMTYgaW4xID0geyAwIH07CisgIHY4aTE2IHRtcDAsIHRtcDEsIHRtcDIsIHRtcDM7CisgIHY4aTE2IG91dDAsIG91dDE7CisgIGNvbnN0IHY4aTE2IG1hc2swID0geyAwLCAxLCAyLCAzLCA4LCA5LCAxMCwgMTEgfTsKKyAgY29uc3QgdjhpMTYgbWFzazEgPSB7IDQsIDUsIDYsIDcsIDEyLCAxMywgMTQsIDE1IH07CisgIGNvbnN0IHY4aTE2IG1hc2syID0geyAwLCA0LCA4LCAxMiwgMSwgNSwgOSwgMTMgfTsKKyAgY29uc3QgdjhpMTYgbWFzazMgPSB7IDMsIDcsIDExLCAxNSwgMiwgNiwgMTAsIDE0IH07CisKKyAgaW4wID0gX19tc2FfaW5zZXJ0X2goaW4wLCAwLCBpblsgIDBdKTsKKyAgaW4wID0gX19tc2FfaW5zZXJ0X2goaW4wLCAxLCBpblsgNjRdKTsKKyAgaW4wID0gX19tc2FfaW5zZXJ0X2goaW4wLCAyLCBpblsxMjhdKTsKKyAgaW4wID0gX19tc2FfaW5zZXJ0X2goaW4wLCAzLCBpblsxOTJdKTsKKyAgaW4wID0gX19tc2FfaW5zZXJ0X2goaW4wLCA0LCBpblsgMTZdKTsKKyAgaW4wID0gX19tc2FfaW5zZXJ0X2goaW4wLCA1LCBpblsgODBdKTsKKyAgaW4wID0gX19tc2FfaW5zZXJ0X2goaW4wLCA2LCBpblsxNDRdKTsKKyAgaW4wID0gX19tc2FfaW5zZXJ0X2goaW4wLCA3LCBpblsyMDhdKTsKKyAgaW4xID0gX19tc2FfaW5zZXJ0X2goaW4xLCAwLCBpblsgNDhdKTsKKyAgaW4xID0gX19tc2FfaW5zZXJ0X2goaW4xLCAxLCBpblsxMTJdKTsKKyAgaW4xID0gX19tc2FfaW5zZXJ0X2goaW4xLCAyLCBpblsxNzZdKTsKKyAgaW4xID0gX19tc2FfaW5zZXJ0X2goaW4xLCAzLCBpblsyNDBdKTsKKyAgaW4xID0gX19tc2FfaW5zZXJ0X2goaW4xLCA0LCBpblsgMzJdKTsKKyAgaW4xID0gX19tc2FfaW5zZXJ0X2goaW4xLCA1LCBpblsgOTZdKTsKKyAgaW4xID0gX19tc2FfaW5zZXJ0X2goaW4xLCA2LCBpblsxNjBdKTsKKyAgaW4xID0gX19tc2FfaW5zZXJ0X2goaW4xLCA3LCBpblsyMjRdKTsKKyAgQUREU1VCMihpbjAsIGluMSwgdG1wMCwgdG1wMSk7CisgIFZTSEZfSDJfU0godG1wMCwgdG1wMSwgdG1wMCwgdG1wMSwgbWFzazAsIG1hc2sxLCB0bXAyLCB0bXAzKTsKKyAgQUREU1VCMih0bXAyLCB0bXAzLCB0bXAwLCB0bXAxKTsKKyAgVlNIRl9IMl9TSCh0bXAwLCB0bXAxLCB0bXAwLCB0bXAxLCBtYXNrMiwgbWFzazMsIGluMCwgaW4xKTsKKyAgQUREU1VCMihpbjAsIGluMSwgdG1wMCwgdG1wMSk7CisgIFZTSEZfSDJfU0godG1wMCwgdG1wMSwgdG1wMCwgdG1wMSwgbWFzazAsIG1hc2sxLCB0bXAyLCB0bXAzKTsKKyAgQUREU1VCMih0bXAyLCB0bXAzLCBvdXQwLCBvdXQxKTsKKyAgU1JBSV9IMl9TSChvdXQwLCBvdXQxLCAxKTsKKyAgU1RfU0gyKG91dDAsIG91dDEsIG91dCwgOCk7Cit9CisKK3N0YXRpYyBpbnQgVFRyYW5zZm9ybV9NU0EoY29uc3QgdWludDhfdCogaW4sIGNvbnN0IHVpbnQxNl90KiB3KSB7CisgIGludCBzdW07CisgIHVpbnQzMl90IGluMF9tLCBpbjFfbSwgaW4yX20sIGluM19tOworICB2MTZpOCBzcmMwID0geyAwIH07CisgIHY4aTE2IGluMCwgaW4xLCB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzOworICB2NGkzMiBkc3QwLCBkc3QxOworICBjb25zdCB2MTZpOCB6ZXJvID0geyAwIH07CisgIGNvbnN0IHY4aTE2IG1hc2swID0geyAwLCAxLCAyLCAzLCA4LCA5LCAxMCwgMTEgfTsKKyAgY29uc3QgdjhpMTYgbWFzazEgPSB7IDQsIDUsIDYsIDcsIDEyLCAxMywgMTQsIDE1IH07CisgIGNvbnN0IHY4aTE2IG1hc2syID0geyAwLCA0LCA4LCAxMiwgMSwgNSwgOSwgMTMgfTsKKyAgY29uc3QgdjhpMTYgbWFzazMgPSB7IDMsIDcsIDExLCAxNSwgMiwgNiwgMTAsIDE0IH07CisKKyAgTFc0KGluLCBCUFMsIGluMF9tLCBpbjFfbSwgaW4yX20sIGluM19tKTsKKyAgSU5TRVJUX1c0X1NCKGluMF9tLCBpbjFfbSwgaW4yX20sIGluM19tLCBzcmMwKTsKKyAgSUxWUkxfQjJfU0goemVybywgc3JjMCwgdG1wMCwgdG1wMSk7CisgIFZTSEZfSDJfU0godG1wMCwgdG1wMSwgdG1wMCwgdG1wMSwgbWFzazIsIG1hc2szLCBpbjAsIGluMSk7CisgIEFERFNVQjIoaW4wLCBpbjEsIHRtcDAsIHRtcDEpOworICBWU0hGX0gyX1NIKHRtcDAsIHRtcDEsIHRtcDAsIHRtcDEsIG1hc2swLCBtYXNrMSwgdG1wMiwgdG1wMyk7CisgIEFERFNVQjIodG1wMiwgdG1wMywgdG1wMCwgdG1wMSk7CisgIFZTSEZfSDJfU0godG1wMCwgdG1wMSwgdG1wMCwgdG1wMSwgbWFzazIsIG1hc2szLCBpbjAsIGluMSk7CisgIEFERFNVQjIoaW4wLCBpbjEsIHRtcDAsIHRtcDEpOworICBWU0hGX0gyX1NIKHRtcDAsIHRtcDEsIHRtcDAsIHRtcDEsIG1hc2swLCBtYXNrMSwgdG1wMiwgdG1wMyk7CisgIEFERFNVQjIodG1wMiwgdG1wMywgdG1wMCwgdG1wMSk7CisgIHRtcDAgPSBfX21zYV9hZGRfYV9oKHRtcDAsICh2OGkxNil6ZXJvKTsKKyAgdG1wMSA9IF9fbXNhX2FkZF9hX2godG1wMSwgKHY4aTE2KXplcm8pOworICBMRF9TSDIodywgOCwgdG1wMiwgdG1wMyk7CisgIERPVFBfU0gyX1NXKHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIGRzdDAsIGRzdDEpOworICBkc3QwID0gZHN0MCArIGRzdDE7CisgIHN1bSA9IEhBRERfU1dfUzMyKGRzdDApOworICByZXR1cm4gc3VtOworfQorCitzdGF0aWMgaW50IERpc3RvNHg0X01TQShjb25zdCB1aW50OF90KiBjb25zdCBhLCBjb25zdCB1aW50OF90KiBjb25zdCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QqIGNvbnN0IHcpIHsKKyAgY29uc3QgaW50IHN1bTEgPSBUVHJhbnNmb3JtX01TQShhLCB3KTsKKyAgY29uc3QgaW50IHN1bTIgPSBUVHJhbnNmb3JtX01TQShiLCB3KTsKKyAgcmV0dXJuIGFicyhzdW0yIC0gc3VtMSkgPj4gNTsKK30KKworc3RhdGljIGludCBEaXN0bzE2eDE2X01TQShjb25zdCB1aW50OF90KiBjb25zdCBhLCBjb25zdCB1aW50OF90KiBjb25zdCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCogY29uc3QgdykgeworICBpbnQgRCA9IDA7CisgIGludCB4LCB5OworICBmb3IgKHkgPSAwOyB5IDwgMTYgKiBCUFM7IHkgKz0gNCAqIEJQUykgeworICAgIGZvciAoeCA9IDA7IHggPCAxNjsgeCArPSA0KSB7CisgICAgICBEICs9IERpc3RvNHg0X01TQShhICsgeCArIHksIGIgKyB4ICsgeSwgdyk7CisgICAgfQorICB9CisgIHJldHVybiBEOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGlzdG9ncmFtCisKK3N0YXRpYyB2b2lkIENvbGxlY3RIaXN0b2dyYW1fTVNBKGNvbnN0IHVpbnQ4X3QqIHJlZiwgY29uc3QgdWludDhfdCogcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF9ibG9jaywgaW50IGVuZF9ibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEhpc3RvZ3JhbSogY29uc3QgaGlzdG8pIHsKKyAgaW50IGo7CisgIGludCBkaXN0cmlidXRpb25bTUFYX0NPRUZGX1RIUkVTSCArIDFdID0geyAwIH07CisgIGZvciAoaiA9IHN0YXJ0X2Jsb2NrOyBqIDwgZW5kX2Jsb2NrOyArK2opIHsKKyAgICBpbnQxNl90IG91dFsxNl07CisgICAgVlA4RlRyYW5zZm9ybShyZWYgKyBWUDhEc3BTY2FuW2pdLCBwcmVkICsgVlA4RHNwU2NhbltqXSwgb3V0KTsKKyAgICB7CisgICAgICBpbnQgazsKKyAgICAgIHY4aTE2IGNvZWZmMCwgY29lZmYxOworICAgICAgY29uc3QgdjhpMTYgemVybyA9IHsgMCB9OworICAgICAgY29uc3QgdjhpMTYgbWF4X2NvZWZmX3RociA9IF9fbXNhX2xkaV9oKE1BWF9DT0VGRl9USFJFU0gpOworICAgICAgTERfU0gyKCZvdXRbMF0sIDgsIGNvZWZmMCwgY29lZmYxKTsKKyAgICAgIGNvZWZmMCA9IF9fbXNhX2FkZF9hX2goY29lZmYwLCB6ZXJvKTsKKyAgICAgIGNvZWZmMSA9IF9fbXNhX2FkZF9hX2goY29lZmYxLCB6ZXJvKTsKKyAgICAgIFNSQUlfSDJfU0goY29lZmYwLCBjb2VmZjEsIDMpOworICAgICAgY29lZmYwID0gX19tc2FfbWluX3NfaChjb2VmZjAsIG1heF9jb2VmZl90aHIpOworICAgICAgY29lZmYxID0gX19tc2FfbWluX3NfaChjb2VmZjEsIG1heF9jb2VmZl90aHIpOworICAgICAgU1RfU0gyKGNvZWZmMCwgY29lZmYxLCAmb3V0WzBdLCA4KTsKKyAgICAgIGZvciAoayA9IDA7IGsgPCAxNjsgKytrKSB7CisgICAgICAgICsrZGlzdHJpYnV0aW9uW291dFtrXV07CisgICAgICB9CisgICAgfQorICB9CisgIFZQOFNldEhpc3RvZ3JhbURhdGEoZGlzdHJpYnV0aW9uLCBoaXN0byk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbnRyYSBwcmVkaWN0aW9ucworCisvLyBsdW1hIDR4NCBwcmVkaWN0aW9uCisKKyNkZWZpbmUgRFNUKHgsIHkpIGRzdFsoeCkgKyAoeSkgKiBCUFNdCisjZGVmaW5lIEFWRzMoYSwgYiwgYykgKCgoYSkgKyAyICogKGIpICsgKGMpICsgMikgPj4gMikKKyNkZWZpbmUgQVZHMihhLCBiKSAoKChhKSArIChiKSArIDEpID4+IDEpCisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZFNCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeyAgICAvLyB2ZXJ0aWNhbAorICBjb25zdCB2MTZ1OCBBMSA9IHsgMCB9OworICBjb25zdCB1aW50NjRfdCB2YWxfbSA9IExEKHRvcCAtIDEpOworICBjb25zdCB2MTZ1OCBBID0gKHYxNnU4KV9fbXNhX2luc2VydF9kKCh2Mmk2NClBMSwgMCwgdmFsX20pOworICBjb25zdCB2MTZ1OCBCID0gU0xESV9VQihBLCBBLCAxKTsKKyAgY29uc3QgdjE2dTggQyA9IFNMRElfVUIoQSwgQSwgMik7CisgIGNvbnN0IHYxNnU4IEFDID0gX19tc2FfYXZlX3VfYihBLCBDKTsKKyAgY29uc3QgdjE2dTggQjIgPSBfX21zYV9hdmVfdV9iKEIsIEIpOworICBjb25zdCB2MTZ1OCBSID0gX19tc2FfYXZlcl91X2IoQUMsIEIyKTsKKyAgY29uc3QgdWludDMyX3Qgb3V0ID0gX19tc2FfY29weV9zX3coKHY0aTMyKVIsIDApOworICBTVzQob3V0LCBvdXQsIG91dCwgb3V0LCBkc3QsIEJQUyk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEhFNCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeyAgICAvLyBob3Jpem9udGFsCisgIGNvbnN0IGludCBYID0gdG9wWy0xXTsKKyAgY29uc3QgaW50IEkgPSB0b3BbLTJdOworICBjb25zdCBpbnQgSiA9IHRvcFstM107CisgIGNvbnN0IGludCBLID0gdG9wWy00XTsKKyAgY29uc3QgaW50IEwgPSB0b3BbLTVdOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMCAqIEJQUywgMHgwMTAxMDEwMVUgKiBBVkczKFgsIEksIEopKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDEgKiBCUFMsIDB4MDEwMTAxMDFVICogQVZHMyhJLCBKLCBLKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAyICogQlBTLCAweDAxMDEwMTAxVSAqIEFWRzMoSiwgSywgTCkpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMyAqIEJQUywgMHgwMTAxMDEwMVUgKiBBVkczKEssIEwsIEwpKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgREM0KHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogdG9wKSB7CisgIHVpbnQzMl90IGRjID0gNDsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIGRjICs9IHRvcFtpXSArIHRvcFstNSArIGldOworICBkYyA+Pj0gMzsKKyAgZGMgPSBkYyB8IChkYyA8PCA4KSB8IChkYyA8PCAxNikgfCAoZGMgPDwgMjQpOworICBTVzQoZGMsIGRjLCBkYywgZGMsIGRzdCwgQlBTKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUkQ0KHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogdG9wKSB7CisgIGNvbnN0IHYxNnU4IEEyID0geyAwIH07CisgIGNvbnN0IHVpbnQ2NF90IHZhbF9tID0gTEQodG9wIC0gNSk7CisgIGNvbnN0IHYxNnU4IEExID0gKHYxNnU4KV9fbXNhX2luc2VydF9kKCh2Mmk2NClBMiwgMCwgdmFsX20pOworICBjb25zdCB2MTZ1OCBBID0gKHYxNnU4KV9fbXNhX2luc2VydF9iKCh2MTZpOClBMSwgOCwgdG9wWzNdKTsKKyAgY29uc3QgdjE2dTggQiA9IFNMRElfVUIoQSwgQSwgMSk7CisgIGNvbnN0IHYxNnU4IEMgPSBTTERJX1VCKEEsIEEsIDIpOworICBjb25zdCB2MTZ1OCBBQyA9IF9fbXNhX2F2ZV91X2IoQSwgQyk7CisgIGNvbnN0IHYxNnU4IEIyID0gX19tc2FfYXZlX3VfYihCLCBCKTsKKyAgY29uc3QgdjE2dTggUjAgPSBfX21zYV9hdmVyX3VfYihBQywgQjIpOworICBjb25zdCB2MTZ1OCBSMSA9IFNMRElfVUIoUjAsIFIwLCAxKTsKKyAgY29uc3QgdjE2dTggUjIgPSBTTERJX1VCKFIxLCBSMSwgMSk7CisgIGNvbnN0IHYxNnU4IFIzID0gU0xESV9VQihSMiwgUjIsIDEpOworICBjb25zdCB1aW50MzJfdCB2YWwwID0gX19tc2FfY29weV9zX3coKHY0aTMyKVIwLCAwKTsKKyAgY29uc3QgdWludDMyX3QgdmFsMSA9IF9fbXNhX2NvcHlfc193KCh2NGkzMilSMSwgMCk7CisgIGNvbnN0IHVpbnQzMl90IHZhbDIgPSBfX21zYV9jb3B5X3NfdygodjRpMzIpUjIsIDApOworICBjb25zdCB1aW50MzJfdCB2YWwzID0gX19tc2FfY29weV9zX3coKHY0aTMyKVIzLCAwKTsKKyAgU1c0KHZhbDMsIHZhbDIsIHZhbDEsIHZhbDAsIGRzdCwgQlBTKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgTEQ0KHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogdG9wKSB7CisgIGNvbnN0IHYxNnU4IEExID0geyAwIH07CisgIGNvbnN0IHVpbnQ2NF90IHZhbF9tID0gTEQodG9wKTsKKyAgY29uc3QgdjE2dTggQSA9ICh2MTZ1OClfX21zYV9pbnNlcnRfZCgodjJpNjQpQTEsIDAsIHZhbF9tKTsKKyAgY29uc3QgdjE2dTggQiA9IFNMRElfVUIoQSwgQSwgMSk7CisgIGNvbnN0IHYxNnU4IEMxID0gU0xESV9VQihBLCBBLCAyKTsKKyAgY29uc3QgdjE2dTggQyA9ICh2MTZ1OClfX21zYV9pbnNlcnRfYigodjE2aTgpQzEsIDYsIHRvcFs3XSk7CisgIGNvbnN0IHYxNnU4IEFDID0gX19tc2FfYXZlX3VfYihBLCBDKTsKKyAgY29uc3QgdjE2dTggQjIgPSBfX21zYV9hdmVfdV9iKEIsIEIpOworICBjb25zdCB2MTZ1OCBSMCA9IF9fbXNhX2F2ZXJfdV9iKEFDLCBCMik7CisgIGNvbnN0IHYxNnU4IFIxID0gU0xESV9VQihSMCwgUjAsIDEpOworICBjb25zdCB2MTZ1OCBSMiA9IFNMRElfVUIoUjEsIFIxLCAxKTsKKyAgY29uc3QgdjE2dTggUjMgPSBTTERJX1VCKFIyLCBSMiwgMSk7CisgIGNvbnN0IHVpbnQzMl90IHZhbDAgPSBfX21zYV9jb3B5X3NfdygodjRpMzIpUjAsIDApOworICBjb25zdCB1aW50MzJfdCB2YWwxID0gX19tc2FfY29weV9zX3coKHY0aTMyKVIxLCAwKTsKKyAgY29uc3QgdWludDMyX3QgdmFsMiA9IF9fbXNhX2NvcHlfc193KCh2NGkzMilSMiwgMCk7CisgIGNvbnN0IHVpbnQzMl90IHZhbDMgPSBfX21zYV9jb3B5X3NfdygodjRpMzIpUjMsIDApOworICBTVzQodmFsMCwgdmFsMSwgdmFsMiwgdmFsMywgZHN0LCBCUFMpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWUjQodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgY29uc3QgaW50IFggPSB0b3BbLTFdOworICBjb25zdCBpbnQgSSA9IHRvcFstMl07CisgIGNvbnN0IGludCBKID0gdG9wWy0zXTsKKyAgY29uc3QgaW50IEsgPSB0b3BbLTRdOworICBjb25zdCBpbnQgQSA9IHRvcFswXTsKKyAgY29uc3QgaW50IEIgPSB0b3BbMV07CisgIGNvbnN0IGludCBDID0gdG9wWzJdOworICBjb25zdCBpbnQgRCA9IHRvcFszXTsKKyAgRFNUKDAsIDApID0gRFNUKDEsIDIpID0gQVZHMihYLCBBKTsKKyAgRFNUKDEsIDApID0gRFNUKDIsIDIpID0gQVZHMihBLCBCKTsKKyAgRFNUKDIsIDApID0gRFNUKDMsIDIpID0gQVZHMihCLCBDKTsKKyAgRFNUKDMsIDApICAgICAgICAgICAgID0gQVZHMihDLCBEKTsKKyAgRFNUKDAsIDMpID0gICAgICAgICAgICAgQVZHMyhLLCBKLCBJKTsKKyAgRFNUKDAsIDIpID0gICAgICAgICAgICAgQVZHMyhKLCBJLCBYKTsKKyAgRFNUKDAsIDEpID0gRFNUKDEsIDMpID0gQVZHMyhJLCBYLCBBKTsKKyAgRFNUKDEsIDEpID0gRFNUKDIsIDMpID0gQVZHMyhYLCBBLCBCKTsKKyAgRFNUKDIsIDEpID0gRFNUKDMsIDMpID0gQVZHMyhBLCBCLCBDKTsKKyAgRFNUKDMsIDEpID0gICAgICAgICAgICAgQVZHMyhCLCBDLCBEKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVkw0KHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogdG9wKSB7CisgIGNvbnN0IGludCBBID0gdG9wWzBdOworICBjb25zdCBpbnQgQiA9IHRvcFsxXTsKKyAgY29uc3QgaW50IEMgPSB0b3BbMl07CisgIGNvbnN0IGludCBEID0gdG9wWzNdOworICBjb25zdCBpbnQgRSA9IHRvcFs0XTsKKyAgY29uc3QgaW50IEYgPSB0b3BbNV07CisgIGNvbnN0IGludCBHID0gdG9wWzZdOworICBjb25zdCBpbnQgSCA9IHRvcFs3XTsKKyAgRFNUKDAsIDApID0gICAgICAgICAgICAgQVZHMihBLCBCKTsKKyAgRFNUKDEsIDApID0gRFNUKDAsIDIpID0gQVZHMihCLCBDKTsKKyAgRFNUKDIsIDApID0gRFNUKDEsIDIpID0gQVZHMihDLCBEKTsKKyAgRFNUKDMsIDApID0gRFNUKDIsIDIpID0gQVZHMihELCBFKTsKKyAgRFNUKDAsIDEpID0gICAgICAgICAgICAgQVZHMyhBLCBCLCBDKTsKKyAgRFNUKDEsIDEpID0gRFNUKDAsIDMpID0gQVZHMyhCLCBDLCBEKTsKKyAgRFNUKDIsIDEpID0gRFNUKDEsIDMpID0gQVZHMyhDLCBELCBFKTsKKyAgRFNUKDMsIDEpID0gRFNUKDIsIDMpID0gQVZHMyhELCBFLCBGKTsKKyAgICAgICAgICAgICAgRFNUKDMsIDIpID0gQVZHMyhFLCBGLCBHKTsKKyAgICAgICAgICAgICAgRFNUKDMsIDMpID0gQVZHMyhGLCBHLCBIKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgSFU0KHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogdG9wKSB7CisgIGNvbnN0IGludCBJID0gdG9wWy0yXTsKKyAgY29uc3QgaW50IEogPSB0b3BbLTNdOworICBjb25zdCBpbnQgSyA9IHRvcFstNF07CisgIGNvbnN0IGludCBMID0gdG9wWy01XTsKKyAgRFNUKDAsIDApID0gICAgICAgICAgICAgQVZHMihJLCBKKTsKKyAgRFNUKDIsIDApID0gRFNUKDAsIDEpID0gQVZHMihKLCBLKTsKKyAgRFNUKDIsIDEpID0gRFNUKDAsIDIpID0gQVZHMihLLCBMKTsKKyAgRFNUKDEsIDApID0gICAgICAgICAgICAgQVZHMyhJLCBKLCBLKTsKKyAgRFNUKDMsIDApID0gRFNUKDEsIDEpID0gQVZHMyhKLCBLLCBMKTsKKyAgRFNUKDMsIDEpID0gRFNUKDEsIDIpID0gQVZHMyhLLCBMLCBMKTsKKyAgRFNUKDMsIDIpID0gRFNUKDIsIDIpID0KKyAgRFNUKDAsIDMpID0gRFNUKDEsIDMpID0gRFNUKDIsIDMpID0gRFNUKDMsIDMpID0gTDsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgSEQ0KHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogdG9wKSB7CisgIGNvbnN0IGludCBYID0gdG9wWy0xXTsKKyAgY29uc3QgaW50IEkgPSB0b3BbLTJdOworICBjb25zdCBpbnQgSiA9IHRvcFstM107CisgIGNvbnN0IGludCBLID0gdG9wWy00XTsKKyAgY29uc3QgaW50IEwgPSB0b3BbLTVdOworICBjb25zdCBpbnQgQSA9IHRvcFswXTsKKyAgY29uc3QgaW50IEIgPSB0b3BbMV07CisgIGNvbnN0IGludCBDID0gdG9wWzJdOworICBEU1QoMCwgMCkgPSBEU1QoMiwgMSkgPSBBVkcyKEksIFgpOworICBEU1QoMCwgMSkgPSBEU1QoMiwgMikgPSBBVkcyKEosIEkpOworICBEU1QoMCwgMikgPSBEU1QoMiwgMykgPSBBVkcyKEssIEopOworICBEU1QoMCwgMykgICAgICAgICAgICAgPSBBVkcyKEwsIEspOworICBEU1QoMywgMCkgICAgICAgICAgICAgPSBBVkczKEEsIEIsIEMpOworICBEU1QoMiwgMCkgICAgICAgICAgICAgPSBBVkczKFgsIEEsIEIpOworICBEU1QoMSwgMCkgPSBEU1QoMywgMSkgPSBBVkczKEksIFgsIEEpOworICBEU1QoMSwgMSkgPSBEU1QoMywgMikgPSBBVkczKEosIEksIFgpOworICBEU1QoMSwgMikgPSBEU1QoMywgMykgPSBBVkczKEssIEosIEkpOworICBEU1QoMSwgMykgICAgICAgICAgICAgPSBBVkczKEwsIEssIEopOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBUTTQodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgY29uc3QgdjE2aTggemVybyA9IHsgMCB9OworICBjb25zdCB2OGkxNiBUTCA9ICh2OGkxNilfX21zYV9maWxsX2godG9wWy0xXSk7CisgIGNvbnN0IHY4aTE2IEwwID0gKHY4aTE2KV9fbXNhX2ZpbGxfaCh0b3BbLTJdKTsKKyAgY29uc3QgdjhpMTYgTDEgPSAodjhpMTYpX19tc2FfZmlsbF9oKHRvcFstM10pOworICBjb25zdCB2OGkxNiBMMiA9ICh2OGkxNilfX21zYV9maWxsX2godG9wWy00XSk7CisgIGNvbnN0IHY4aTE2IEwzID0gKHY4aTE2KV9fbXNhX2ZpbGxfaCh0b3BbLTVdKTsKKyAgY29uc3QgdjE2dTggVDEgPSBMRF9VQih0b3ApOworICBjb25zdCB2OGkxNiBUICA9ICh2OGkxNilfX21zYV9pbHZyX2IoemVybywgKHYxNmk4KVQxKTsKKyAgY29uc3QgdjhpMTYgZCA9IFQgLSBUTDsKKyAgdjhpMTYgcjAsIHIxLCByMiwgcjM7CisgIEFERDQoZCwgTDAsIGQsIEwxLCBkLCBMMiwgZCwgTDMsIHIwLCByMSwgcjIsIHIzKTsKKyAgQ0xJUF9TSDRfMF8yNTUocjAsIHIxLCByMiwgcjMpOworICBQQ0tFVl9TVDR4NF9VQihyMCwgcjEsIHIyLCByMywgZHN0LCBCUFMpOworfQorCisjdW5kZWYgRFNUCisjdW5kZWYgQVZHMworI3VuZGVmIEFWRzIKKworc3RhdGljIHZvaWQgSW50cmE0UHJlZHNfTVNBKHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogdG9wKSB7CisgIERDNChJNERDNCArIGRzdCwgdG9wKTsKKyAgVE00KEk0VE00ICsgZHN0LCB0b3ApOworICBWRTQoSTRWRTQgKyBkc3QsIHRvcCk7CisgIEhFNChJNEhFNCArIGRzdCwgdG9wKTsKKyAgUkQ0KEk0UkQ0ICsgZHN0LCB0b3ApOworICBWUjQoSTRWUjQgKyBkc3QsIHRvcCk7CisgIExENChJNExENCArIGRzdCwgdG9wKTsKKyAgVkw0KEk0Vkw0ICsgZHN0LCB0b3ApOworICBIRDQoSTRIRDQgKyBkc3QsIHRvcCk7CisgIEhVNChJNEhVNCArIGRzdCwgdG9wKTsKK30KKworLy8gbHVtYSAxNngxNiBwcmVkaWN0aW9uCisKKyNkZWZpbmUgU1RPUkUxNngxNihvdXQsIGRzdCkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgU1RfVUI4KG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBkc3QgKyAwICogQlBTLCBCUFMpOyAgXAorICAgIFNUX1VCOChvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgZHN0ICsgOCAqIEJQUywgQlBTKTsgIFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZlcnRpY2FsUHJlZDE2eDE2KHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogdG9wKSB7CisgIGlmICh0b3AgIT0gTlVMTCkgeworICAgIGNvbnN0IHYxNnU4IG91dCA9IExEX1VCKHRvcCk7CisgICAgU1RPUkUxNngxNihvdXQsIGRzdCk7CisgIH0gZWxzZSB7CisgICAgY29uc3QgdjE2dTggb3V0ID0gKHYxNnU4KV9fbXNhX2ZpbGxfYigweDdmKTsKKyAgICBTVE9SRTE2eDE2KG91dCwgZHN0KTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBIb3Jpem9udGFsUHJlZDE2eDE2KHVpbnQ4X3QqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogbGVmdCkgeworICBpZiAobGVmdCAhPSBOVUxMKSB7CisgICAgaW50IGo7CisgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqICs9IDQpIHsKKyAgICAgIGNvbnN0IHYxNnU4IEwwID0gKHYxNnU4KV9fbXNhX2ZpbGxfYihsZWZ0WzBdKTsKKyAgICAgIGNvbnN0IHYxNnU4IEwxID0gKHYxNnU4KV9fbXNhX2ZpbGxfYihsZWZ0WzFdKTsKKyAgICAgIGNvbnN0IHYxNnU4IEwyID0gKHYxNnU4KV9fbXNhX2ZpbGxfYihsZWZ0WzJdKTsKKyAgICAgIGNvbnN0IHYxNnU4IEwzID0gKHYxNnU4KV9fbXNhX2ZpbGxfYihsZWZ0WzNdKTsKKyAgICAgIFNUX1VCNChMMCwgTDEsIEwyLCBMMywgZHN0LCBCUFMpOworICAgICAgZHN0ICs9IDQgKiBCUFM7CisgICAgICBsZWZ0ICs9IDQ7CisgICAgfQorICB9IGVsc2UgeworICAgIGNvbnN0IHYxNnU4IG91dCA9ICh2MTZ1OClfX21zYV9maWxsX2IoMHg4MSk7CisgICAgU1RPUkUxNngxNihvdXQsIGRzdCk7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVHJ1ZU1vdGlvbjE2eDE2KHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgaWYgKGxlZnQgIT0gTlVMTCkgeworICAgIGlmICh0b3AgIT0gTlVMTCkgeworICAgICAgaW50IGo7CisgICAgICB2OGkxNiBkMSwgZDI7CisgICAgICBjb25zdCB2MTZpOCB6ZXJvID0geyAwIH07CisgICAgICBjb25zdCB2OGkxNiBUTCA9ICh2OGkxNilfX21zYV9maWxsX2gobGVmdFstMV0pOworICAgICAgY29uc3QgdjE2dTggVCA9IExEX1VCKHRvcCk7CisgICAgICBJTFZSTF9CMl9TSCh6ZXJvLCBULCBkMSwgZDIpOworICAgICAgU1VCMihkMSwgVEwsIGQyLCBUTCwgZDEsIGQyKTsKKyAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaiArPSA0KSB7CisgICAgICAgIHYxNmk4IHQwLCB0MSwgdDIsIHQzOworICAgICAgICB2OGkxNiByMCwgcjEsIHIyLCByMywgcjQsIHI1LCByNiwgcjc7CisgICAgICAgIGNvbnN0IHY4aTE2IEwwID0gKHY4aTE2KV9fbXNhX2ZpbGxfaChsZWZ0W2ogKyAwXSk7CisgICAgICAgIGNvbnN0IHY4aTE2IEwxID0gKHY4aTE2KV9fbXNhX2ZpbGxfaChsZWZ0W2ogKyAxXSk7CisgICAgICAgIGNvbnN0IHY4aTE2IEwyID0gKHY4aTE2KV9fbXNhX2ZpbGxfaChsZWZ0W2ogKyAyXSk7CisgICAgICAgIGNvbnN0IHY4aTE2IEwzID0gKHY4aTE2KV9fbXNhX2ZpbGxfaChsZWZ0W2ogKyAzXSk7CisgICAgICAgIEFERDQoZDEsIEwwLCBkMSwgTDEsIGQxLCBMMiwgZDEsIEwzLCByMCwgcjEsIHIyLCByMyk7CisgICAgICAgIEFERDQoZDIsIEwwLCBkMiwgTDEsIGQyLCBMMiwgZDIsIEwzLCByNCwgcjUsIHI2LCByNyk7CisgICAgICAgIENMSVBfU0g0XzBfMjU1KHIwLCByMSwgcjIsIHIzKTsKKyAgICAgICAgQ0xJUF9TSDRfMF8yNTUocjQsIHI1LCByNiwgcjcpOworICAgICAgICBQQ0tFVl9CNF9TQihyNCwgcjAsIHI1LCByMSwgcjYsIHIyLCByNywgcjMsIHQwLCB0MSwgdDIsIHQzKTsKKyAgICAgICAgU1RfU0I0KHQwLCB0MSwgdDIsIHQzLCBkc3QsIEJQUyk7CisgICAgICAgIGRzdCArPSA0ICogQlBTOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBIb3Jpem9udGFsUHJlZDE2eDE2KGRzdCwgbGVmdCk7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmICh0b3AgIT0gTlVMTCkgeworICAgICAgVmVydGljYWxQcmVkMTZ4MTYoZHN0LCB0b3ApOworICAgIH0gZWxzZSB7CisgICAgICBjb25zdCB2MTZ1OCBvdXQgPSAodjE2dTgpX19tc2FfZmlsbF9iKDB4ODEpOworICAgICAgU1RPUkUxNngxNihvdXQsIGRzdCk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIERDTW9kZTE2eDE2KHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBpbnQgREM7CisgIHYxNnU4IG91dDsKKyAgaWYgKHRvcCAhPSBOVUxMICYmIGxlZnQgIT0gTlVMTCkgeworICAgIGNvbnN0IHYxNnU4IHJ0b3AgPSBMRF9VQih0b3ApOworICAgIGNvbnN0IHY4dTE2IGRjdG9wID0gX19tc2FfaGFkZF91X2gocnRvcCwgcnRvcCk7CisgICAgY29uc3QgdjE2dTggcmxlZnQgPSBMRF9VQihsZWZ0KTsKKyAgICBjb25zdCB2OHUxNiBkY2xlZnQgPSBfX21zYV9oYWRkX3VfaChybGVmdCwgcmxlZnQpOworICAgIGNvbnN0IHY4dTE2IGRjdGVtcCA9IGRjdG9wICsgZGNsZWZ0OworICAgIERDID0gSEFERF9VSF9VMzIoZGN0ZW1wKTsKKyAgICBEQyA9IChEQyArIDE2KSA+PiA1OworICB9IGVsc2UgaWYgKGxlZnQgIT0gTlVMTCkgeyAgIC8vIGxlZnQgYnV0IG5vIHRvcAorICAgIGNvbnN0IHYxNnU4IHJsZWZ0ID0gTERfVUIobGVmdCk7CisgICAgY29uc3Qgdjh1MTYgZGNsZWZ0ID0gX19tc2FfaGFkZF91X2gocmxlZnQsIHJsZWZ0KTsKKyAgICBEQyA9IEhBRERfVUhfVTMyKGRjbGVmdCk7CisgICAgREMgPSAoREMgKyBEQyArIDE2KSA+PiA1OworICB9IGVsc2UgaWYgKHRvcCAhPSBOVUxMKSB7ICAgLy8gdG9wIGJ1dCBubyBsZWZ0CisgICAgY29uc3QgdjE2dTggcnRvcCA9IExEX1VCKHRvcCk7CisgICAgY29uc3Qgdjh1MTYgZGN0b3AgPSBfX21zYV9oYWRkX3VfaChydG9wLCBydG9wKTsKKyAgICBEQyA9IEhBRERfVUhfVTMyKGRjdG9wKTsKKyAgICBEQyA9IChEQyArIERDICsgMTYpID4+IDU7CisgIH0gZWxzZSB7ICAgLy8gbm8gdG9wLCBubyBsZWZ0LCBub3RoaW5nLgorICAgIERDID0gMHg4MDsKKyAgfQorICBvdXQgPSAodjE2dTgpX19tc2FfZmlsbF9iKERDKTsKKyAgU1RPUkUxNngxNihvdXQsIGRzdCk7Cit9CisKK3N0YXRpYyB2b2lkIEludHJhMTZQcmVkc19NU0EodWludDhfdCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBsZWZ0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgRENNb2RlMTZ4MTYoSTE2REMxNiArIGRzdCwgbGVmdCwgdG9wKTsKKyAgVmVydGljYWxQcmVkMTZ4MTYoSTE2VkUxNiArIGRzdCwgdG9wKTsKKyAgSG9yaXpvbnRhbFByZWQxNngxNihJMTZIRTE2ICsgZHN0LCBsZWZ0KTsKKyAgVHJ1ZU1vdGlvbjE2eDE2KEkxNlRNMTYgKyBkc3QsIGxlZnQsIHRvcCk7Cit9CisKKy8vIENocm9tYSA4eDggcHJlZGljdGlvbgorCisjZGVmaW5lIENBTENfREM4KGluLCBvdXQpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHY4dTE2IHRlbXAwID0gX19tc2FfaGFkZF91X2goaW4sIGluKTsgICAgICAgICAgICAgICBcCisgIGNvbnN0IHY0dTMyIHRlbXAxID0gX19tc2FfaGFkZF91X3codGVtcDAsIHRlbXAwKTsgICAgICAgICBcCisgIGNvbnN0IHYyaTY0IHRlbXAyID0gKHYyaTY0KV9fbXNhX2hhZGRfdV9kKHRlbXAxLCB0ZW1wMSk7ICBcCisgIGNvbnN0IHYyaTY0IHRlbXAzID0gX19tc2Ffc3BsYXRpX2QodGVtcDIsIDEpOyAgICAgICAgICAgICBcCisgIGNvbnN0IHYyaTY0IHRlbXA0ID0gdGVtcDMgKyB0ZW1wMjsgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHYxNmk4IHRlbXA1ID0gKHYxNmk4KV9fbXNhX3NyYXJpX2QodGVtcDQsIDQpOyAgICAgICBcCisgIGNvbnN0IHYyaTY0IHRlbXA2ID0gKHYyaTY0KV9fbXNhX3NwbGF0aV9iKHRlbXA1LCAwKTsgICAgICBcCisgIG91dCA9IF9fbXNhX2NvcHlfc19kKHRlbXA2LCAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFNUT1JFOHg4KG91dCwgZHN0KSBkbyB7ICAgICAgICAgICAgICAgICBcCisgIFNENChvdXQsIG91dCwgb3V0LCBvdXQsIGRzdCArIDAgKiBCUFMsIEJQUyk7ICBcCisgIFNENChvdXQsIG91dCwgb3V0LCBvdXQsIGRzdCArIDQgKiBCUFMsIEJQUyk7ICBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWZXJ0aWNhbFByZWQ4eDgodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgaWYgKHRvcCAhPSBOVUxMKSB7CisgICAgY29uc3QgdWludDY0X3Qgb3V0ID0gTEQodG9wKTsKKyAgICBTVE9SRTh4OChvdXQsIGRzdCk7CisgIH0gZWxzZSB7CisgICAgY29uc3QgdWludDY0X3Qgb3V0ID0gMHg3ZjdmN2Y3ZjdmN2Y3ZjdmVUxMOworICAgIFNUT1JFOHg4KG91dCwgZHN0KTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBIb3Jpem9udGFsUHJlZDh4OCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIGxlZnQpIHsKKyAgaWYgKGxlZnQgIT0gTlVMTCkgeworICAgIGludCBqOworICAgIGZvciAoaiA9IDA7IGogPCA4OyBqICs9IDQpIHsKKyAgICAgIGNvbnN0IHYxNnU4IEwwID0gKHYxNnU4KV9fbXNhX2ZpbGxfYihsZWZ0WzBdKTsKKyAgICAgIGNvbnN0IHYxNnU4IEwxID0gKHYxNnU4KV9fbXNhX2ZpbGxfYihsZWZ0WzFdKTsKKyAgICAgIGNvbnN0IHYxNnU4IEwyID0gKHYxNnU4KV9fbXNhX2ZpbGxfYihsZWZ0WzJdKTsKKyAgICAgIGNvbnN0IHYxNnU4IEwzID0gKHYxNnU4KV9fbXNhX2ZpbGxfYihsZWZ0WzNdKTsKKyAgICAgIGNvbnN0IHVpbnQ2NF90IG91dDAgPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpTDAsIDApOworICAgICAgY29uc3QgdWludDY0X3Qgb3V0MSA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NClMMSwgMCk7CisgICAgICBjb25zdCB1aW50NjRfdCBvdXQyID0gX19tc2FfY29weV9zX2QoKHYyaTY0KUwyLCAwKTsKKyAgICAgIGNvbnN0IHVpbnQ2NF90IG91dDMgPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpTDMsIDApOworICAgICAgU0Q0KG91dDAsIG91dDEsIG91dDIsIG91dDMsIGRzdCwgQlBTKTsKKyAgICAgIGRzdCArPSA0ICogQlBTOworICAgICAgbGVmdCArPSA0OworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBjb25zdCB1aW50NjRfdCBvdXQgPSAweDgxODE4MTgxODE4MTgxODFVTEw7CisgICAgU1RPUkU4eDgob3V0LCBkc3QpOworICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFRydWVNb3Rpb244eDgodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgaWYgKGxlZnQgIT0gTlVMTCkgeworICAgIGlmICh0b3AgIT0gTlVMTCkgeworICAgICAgaW50IGo7CisgICAgICBjb25zdCB2OGkxNiBUTCA9ICh2OGkxNilfX21zYV9maWxsX2gobGVmdFstMV0pOworICAgICAgY29uc3QgdjE2dTggVDEgPSBMRF9VQih0b3ApOworICAgICAgY29uc3QgdjE2aTggemVybyA9IHsgMCB9OworICAgICAgY29uc3QgdjhpMTYgVCAgPSAodjhpMTYpX19tc2FfaWx2cl9iKHplcm8sICh2MTZpOClUMSk7CisgICAgICBjb25zdCB2OGkxNiBkID0gVCAtIFRMOworICAgICAgZm9yIChqID0gMDsgaiA8IDg7IGogKz0gNCkgeworICAgICAgICB1aW50NjRfdCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzOworICAgICAgICB2MTZpOCB0MCwgdDE7CisgICAgICAgIHY4aTE2IHIwID0gKHY4aTE2KV9fbXNhX2ZpbGxfaChsZWZ0W2ogKyAwXSk7CisgICAgICAgIHY4aTE2IHIxID0gKHY4aTE2KV9fbXNhX2ZpbGxfaChsZWZ0W2ogKyAxXSk7CisgICAgICAgIHY4aTE2IHIyID0gKHY4aTE2KV9fbXNhX2ZpbGxfaChsZWZ0W2ogKyAyXSk7CisgICAgICAgIHY4aTE2IHIzID0gKHY4aTE2KV9fbXNhX2ZpbGxfaChsZWZ0W2ogKyAzXSk7CisgICAgICAgIEFERDQoZCwgcjAsIGQsIHIxLCBkLCByMiwgZCwgcjMsIHIwLCByMSwgcjIsIHIzKTsKKyAgICAgICAgQ0xJUF9TSDRfMF8yNTUocjAsIHIxLCByMiwgcjMpOworICAgICAgICBQQ0tFVl9CMl9TQihyMSwgcjAsIHIzLCByMiwgdDAsIHQxKTsKKyAgICAgICAgb3V0MCA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NCl0MCwgMCk7CisgICAgICAgIG91dDEgPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpdDAsIDEpOworICAgICAgICBvdXQyID0gX19tc2FfY29weV9zX2QoKHYyaTY0KXQxLCAwKTsKKyAgICAgICAgb3V0MyA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NCl0MSwgMSk7CisgICAgICAgIFNENChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBkc3QsIEJQUyk7CisgICAgICAgIGRzdCArPSA0ICogQlBTOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBIb3Jpem9udGFsUHJlZDh4OChkc3QsIGxlZnQpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAodG9wICE9IE5VTEwpIHsKKyAgICAgIFZlcnRpY2FsUHJlZDh4OChkc3QsIHRvcCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbnN0IHVpbnQ2NF90IG91dCA9IDB4ODE4MTgxODE4MTgxODE4MVVMTDsKKyAgICAgIFNUT1JFOHg4KG91dCwgZHN0KTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRENNb2RlOHg4KHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgdWludDY0X3Qgb3V0OworICB2MTZ1OCBzcmMgPSB7IDAgfTsKKyAgaWYgKHRvcCAhPSBOVUxMICYmIGxlZnQgIT0gTlVMTCkgeworICAgIGNvbnN0IHVpbnQ2NF90IGxlZnRfbSA9IExEKGxlZnQpOworICAgIGNvbnN0IHVpbnQ2NF90IHRvcF9tID0gTEQodG9wKTsKKyAgICBJTlNFUlRfRDJfVUIobGVmdF9tLCB0b3BfbSwgc3JjKTsKKyAgICBDQUxDX0RDOChzcmMsIG91dCk7CisgIH0gZWxzZSBpZiAobGVmdCAhPSBOVUxMKSB7ICAgLy8gbGVmdCBidXQgbm8gdG9wCisgICAgY29uc3QgdWludDY0X3QgbGVmdF9tID0gTEQobGVmdCk7CisgICAgSU5TRVJUX0QyX1VCKGxlZnRfbSwgbGVmdF9tLCBzcmMpOworICAgIENBTENfREM4KHNyYywgb3V0KTsKKyAgfSBlbHNlIGlmICh0b3AgIT0gTlVMTCkgeyAgIC8vIHRvcCBidXQgbm8gbGVmdAorICAgIGNvbnN0IHVpbnQ2NF90IHRvcF9tID0gTEQodG9wKTsKKyAgICBJTlNFUlRfRDJfVUIodG9wX20sIHRvcF9tLCBzcmMpOworICAgIENBTENfREM4KHNyYywgb3V0KTsKKyAgfSBlbHNlIHsgICAvLyBubyB0b3AsIG5vIGxlZnQsIG5vdGhpbmcuCisgICAgc3JjID0gKHYxNnU4KV9fbXNhX2ZpbGxfYigweDgwKTsKKyAgICBvdXQgPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpc3JjLCAwKTsKKyAgfQorICBTVE9SRTh4OChvdXQsIGRzdCk7Cit9CisKK3N0YXRpYyB2b2lkIEludHJhQ2hyb21hUHJlZHNfTVNBKHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICAvLyBVIGJsb2NrCisgIERDTW9kZTh4OChDOERDOCArIGRzdCwgbGVmdCwgdG9wKTsKKyAgVmVydGljYWxQcmVkOHg4KEM4VkU4ICsgZHN0LCB0b3ApOworICBIb3Jpem9udGFsUHJlZDh4OChDOEhFOCArIGRzdCwgbGVmdCk7CisgIFRydWVNb3Rpb244eDgoQzhUTTggKyBkc3QsIGxlZnQsIHRvcCk7CisgIC8vIFYgYmxvY2sKKyAgZHN0ICs9IDg7CisgIGlmICh0b3AgIT0gTlVMTCkgdG9wICs9IDg7CisgIGlmIChsZWZ0ICE9IE5VTEwpIGxlZnQgKz0gMTY7CisgIERDTW9kZTh4OChDOERDOCArIGRzdCwgbGVmdCwgdG9wKTsKKyAgVmVydGljYWxQcmVkOHg4KEM4VkU4ICsgZHN0LCB0b3ApOworICBIb3Jpem9udGFsUHJlZDh4OChDOEhFOCArIGRzdCwgbGVmdCk7CisgIFRydWVNb3Rpb244eDgoQzhUTTggKyBkc3QsIGxlZnQsIHRvcCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNZXRyaWMKKworI2RlZmluZSBQQUNLX0RPVFBfVUI0X1NXKGluMCwgaW4xLCBpbjIsIGluMywgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MykgZG8geyAgXAorICB2MTZ1OCB0bXAwLCB0bXAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2OGkxNiB0bXAyLCB0bXAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTFZSTF9CMl9VQihpbjAsIGluMSwgdG1wMCwgdG1wMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBIU1VCX1VCMl9TSCh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBET1RQX1NIMl9TVyh0bXAyLCB0bXAzLCB0bXAyLCB0bXAzLCBvdXQwLCBvdXQxKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTFZSTF9CMl9VQihpbjIsIGluMywgdG1wMCwgdG1wMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBIU1VCX1VCMl9TSCh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBET1RQX1NIMl9TVyh0bXAyLCB0bXAzLCB0bXAyLCB0bXAzLCBvdXQyLCBvdXQzKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBQQUNLX0RQQUREX1VCNF9TVyhpbjAsIGluMSwgaW4yLCBpbjMsIG91dDAsIG91dDEsIG91dDIsIG91dDMpIGRvIHsgIFwKKyAgdjE2dTggdG1wMCwgdG1wMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHY4aTE2IHRtcDIsIHRtcDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTFZSTF9CMl9VQihpbjAsIGluMSwgdG1wMCwgdG1wMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSFNVQl9VQjJfU0godG1wMCwgdG1wMSwgdG1wMiwgdG1wMyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIERQQUREX1NIMl9TVyh0bXAyLCB0bXAzLCB0bXAyLCB0bXAzLCBvdXQwLCBvdXQxKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTFZSTF9CMl9VQihpbjIsIGluMywgdG1wMCwgdG1wMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSFNVQl9VQjJfU0godG1wMCwgdG1wMSwgdG1wMiwgdG1wMyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIERQQUREX1NIMl9TVyh0bXAyLCB0bXAzLCB0bXAyLCB0bXAzLCBvdXQyLCBvdXQzKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIGludCBTU0UxNngxNl9NU0EoY29uc3QgdWludDhfdCogYSwgY29uc3QgdWludDhfdCogYikgeworICB1aW50MzJfdCBzdW07CisgIHYxNnU4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzc7CisgIHYxNnU4IHJlZjAsIHJlZjEsIHJlZjIsIHJlZjMsIHJlZjQsIHJlZjUsIHJlZjYsIHJlZjc7CisgIHY0aTMyIG91dDAsIG91dDEsIG91dDIsIG91dDM7CisKKyAgTERfVUI4KGEsIEJQUywgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNyk7CisgIExEX1VCOChiLCBCUFMsIHJlZjAsIHJlZjEsIHJlZjIsIHJlZjMsIHJlZjQsIHJlZjUsIHJlZjYsIHJlZjcpOworICBQQUNLX0RPVFBfVUI0X1NXKHNyYzAsIHJlZjAsIHNyYzEsIHJlZjEsIG91dDAsIG91dDEsIG91dDIsIG91dDMpOworICBQQUNLX0RQQUREX1VCNF9TVyhzcmMyLCByZWYyLCBzcmMzLCByZWYzLCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKTsKKyAgUEFDS19EUEFERF9VQjRfU1coc3JjNCwgcmVmNCwgc3JjNSwgcmVmNSwgb3V0MCwgb3V0MSwgb3V0Miwgb3V0Myk7CisgIFBBQ0tfRFBBRERfVUI0X1NXKHNyYzYsIHJlZjYsIHNyYzcsIHJlZjcsIG91dDAsIG91dDEsIG91dDIsIG91dDMpOworICBhICs9IDggKiBCUFM7CisgIGIgKz0gOCAqIEJQUzsKKyAgTERfVUI4KGEsIEJQUywgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNyk7CisgIExEX1VCOChiLCBCUFMsIHJlZjAsIHJlZjEsIHJlZjIsIHJlZjMsIHJlZjQsIHJlZjUsIHJlZjYsIHJlZjcpOworICBQQUNLX0RQQUREX1VCNF9TVyhzcmMwLCByZWYwLCBzcmMxLCByZWYxLCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKTsKKyAgUEFDS19EUEFERF9VQjRfU1coc3JjMiwgcmVmMiwgc3JjMywgcmVmMywgb3V0MCwgb3V0MSwgb3V0Miwgb3V0Myk7CisgIFBBQ0tfRFBBRERfVUI0X1NXKHNyYzQsIHJlZjQsIHNyYzUsIHJlZjUsIG91dDAsIG91dDEsIG91dDIsIG91dDMpOworICBQQUNLX0RQQUREX1VCNF9TVyhzcmM2LCByZWY2LCBzcmM3LCByZWY3LCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKTsKKyAgb3V0MCArPSBvdXQxOworICBvdXQyICs9IG91dDM7CisgIG91dDAgKz0gb3V0MjsKKyAgc3VtID0gSEFERF9TV19TMzIob3V0MCk7CisgIHJldHVybiBzdW07Cit9CisKK3N0YXRpYyBpbnQgU1NFMTZ4OF9NU0EoY29uc3QgdWludDhfdCogYSwgY29uc3QgdWludDhfdCogYikgeworICB1aW50MzJfdCBzdW07CisgIHYxNnU4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzc7CisgIHYxNnU4IHJlZjAsIHJlZjEsIHJlZjIsIHJlZjMsIHJlZjQsIHJlZjUsIHJlZjYsIHJlZjc7CisgIHY0aTMyIG91dDAsIG91dDEsIG91dDIsIG91dDM7CisKKyAgTERfVUI4KGEsIEJQUywgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNyk7CisgIExEX1VCOChiLCBCUFMsIHJlZjAsIHJlZjEsIHJlZjIsIHJlZjMsIHJlZjQsIHJlZjUsIHJlZjYsIHJlZjcpOworICBQQUNLX0RPVFBfVUI0X1NXKHNyYzAsIHJlZjAsIHNyYzEsIHJlZjEsIG91dDAsIG91dDEsIG91dDIsIG91dDMpOworICBQQUNLX0RQQUREX1VCNF9TVyhzcmMyLCByZWYyLCBzcmMzLCByZWYzLCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKTsKKyAgUEFDS19EUEFERF9VQjRfU1coc3JjNCwgcmVmNCwgc3JjNSwgcmVmNSwgb3V0MCwgb3V0MSwgb3V0Miwgb3V0Myk7CisgIFBBQ0tfRFBBRERfVUI0X1NXKHNyYzYsIHJlZjYsIHNyYzcsIHJlZjcsIG91dDAsIG91dDEsIG91dDIsIG91dDMpOworICBvdXQwICs9IG91dDE7CisgIG91dDIgKz0gb3V0MzsKKyAgb3V0MCArPSBvdXQyOworICBzdW0gPSBIQUREX1NXX1MzMihvdXQwKTsKKyAgcmV0dXJuIHN1bTsKK30KKworc3RhdGljIGludCBTU0U4eDhfTVNBKGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIpIHsKKyAgdWludDMyX3Qgc3VtOworICB2MTZ1OCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3OworICB2MTZ1OCByZWYwLCByZWYxLCByZWYyLCByZWYzLCByZWY0LCByZWY1LCByZWY2LCByZWY3OworICB2MTZ1OCB0MCwgdDEsIHQyLCB0MzsKKyAgdjRpMzIgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MzsKKworICBMRF9VQjgoYSwgQlBTLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3KTsKKyAgTERfVUI4KGIsIEJQUywgcmVmMCwgcmVmMSwgcmVmMiwgcmVmMywgcmVmNCwgcmVmNSwgcmVmNiwgcmVmNyk7CisgIElMVlJfQjRfVUIoc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgcmVmMCwgcmVmMSwgcmVmMiwgcmVmMywgdDAsIHQxLCB0MiwgdDMpOworICBQQUNLX0RPVFBfVUI0X1NXKHQwLCB0MiwgdDEsIHQzLCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKTsKKyAgSUxWUl9CNF9VQihzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCByZWY0LCByZWY1LCByZWY2LCByZWY3LCB0MCwgdDEsIHQyLCB0Myk7CisgIFBBQ0tfRFBBRERfVUI0X1NXKHQwLCB0MiwgdDEsIHQzLCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKTsKKyAgb3V0MCArPSBvdXQxOworICBvdXQyICs9IG91dDM7CisgIG91dDAgKz0gb3V0MjsKKyAgc3VtID0gSEFERF9TV19TMzIob3V0MCk7CisgIHJldHVybiBzdW07Cit9CisKK3N0YXRpYyBpbnQgU1NFNHg0X01TQShjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiBiKSB7CisgIHVpbnQzMl90IHN1bSA9IDA7CisgIHVpbnQzMl90IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHJlZjAsIHJlZjEsIHJlZjIsIHJlZjM7CisgIHYxNnU4IHNyYyA9IHsgMCB9LCByZWYgPSB7IDAgfSwgdG1wMCwgdG1wMTsKKyAgdjhpMTYgZGlmZjAsIGRpZmYxOworICB2NGkzMiBvdXQwLCBvdXQxOworCisgIExXNChhLCBCUFMsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOworICBMVzQoYiwgQlBTLCByZWYwLCByZWYxLCByZWYyLCByZWYzKTsKKyAgSU5TRVJUX1c0X1VCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYyk7CisgIElOU0VSVF9XNF9VQihyZWYwLCByZWYxLCByZWYyLCByZWYzLCByZWYpOworICBJTFZSTF9CMl9VQihzcmMsIHJlZiwgdG1wMCwgdG1wMSk7CisgIEhTVUJfVUIyX1NIKHRtcDAsIHRtcDEsIGRpZmYwLCBkaWZmMSk7CisgIERPVFBfU0gyX1NXKGRpZmYwLCBkaWZmMSwgZGlmZjAsIGRpZmYxLCBvdXQwLCBvdXQxKTsKKyAgb3V0MCArPSBvdXQxOworICBzdW0gPSBIQUREX1NXX1MzMihvdXQwKTsKKyAgcmV0dXJuIHN1bTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFF1YW50aXphdGlvbgorCitzdGF0aWMgaW50IFF1YW50aXplQmxvY2tfTVNBKGludDE2X3QgaW5bMTZdLCBpbnQxNl90IG91dFsxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOE1hdHJpeCogY29uc3QgbXR4KSB7CisgIGludCBzdW07CisgIHY4aTE2IGluMCwgaW4xLCBzaDAsIHNoMSwgb3V0MCwgb3V0MTsKKyAgdjhpMTYgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgc2lnbjAsIHNpZ24xOworICB2NGkzMiBzMCwgczEsIHMyLCBzMywgYjAsIGIxLCBiMiwgYjMsIHQwLCB0MSwgdDIsIHQzOworICBjb25zdCB2OGkxNiB6ZXJvID0geyAwIH07CisgIGNvbnN0IHY4aTE2IHppZ3phZzAgPSB7IDAsIDEsIDQsIDgsIDUsIDIsIDMsIDYgfTsKKyAgY29uc3QgdjhpMTYgemlnemFnMSA9IHsgOSwgMTIsIDEzLCAxMCwgNywgMTEsIDE0LCAxNSB9OworICBjb25zdCB2OGkxNiBtYXhsZXZlbCA9IF9fbXNhX2ZpbGxfaChNQVhfTEVWRUwpOworCisgIExEX1NIMigmaW5bMF0sIDgsIGluMCwgaW4xKTsKKyAgTERfU0gyKCZtdHgtPnNoYXJwZW5fWzBdLCA4LCBzaDAsIHNoMSk7CisgIHRtcDQgPSBfX21zYV9hZGRfYV9oKGluMCwgemVybyk7CisgIHRtcDUgPSBfX21zYV9hZGRfYV9oKGluMSwgemVybyk7CisgIElMVlJMX0gyX1NIKHNoMCwgdG1wNCwgdG1wMCwgdG1wMSk7CisgIElMVlJMX0gyX1NIKHNoMSwgdG1wNSwgdG1wMiwgdG1wMyk7CisgIEhBRERfU0g0X1NXKHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHMwLCBzMSwgczIsIHMzKTsKKyAgc2lnbjAgPSAoaW4wIDwgemVybyk7CisgIHNpZ24xID0gKGluMSA8IHplcm8pOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpZ24KKyAgTERfU0gyKCZtdHgtPmlxX1swXSwgOCwgdG1wMCwgdG1wMSk7ICAgICAgICAgICAgLy8gaXEKKyAgSUxWUkxfSDJfU1coemVybywgdG1wMCwgdDAsIHQxKTsKKyAgSUxWUkxfSDJfU1coemVybywgdG1wMSwgdDIsIHQzKTsKKyAgTERfU1c0KCZtdHgtPmJpYXNfWzBdLCA0LCBiMCwgYjEsIGIyLCBiMyk7ICAgICAgLy8gYmlhcworICBNVUw0KHQwLCBzMCwgdDEsIHMxLCB0MiwgczIsIHQzLCBzMywgdDAsIHQxLCB0MiwgdDMpOworICBBREQ0KGIwLCB0MCwgYjEsIHQxLCBiMiwgdDIsIGIzLCB0MywgYjAsIGIxLCBiMiwgYjMpOworICBTUkFJX1c0X1NXKGIwLCBiMSwgYjIsIGIzLCAxNyk7CisgIFBDS0VWX0gyX1NIKGIxLCBiMCwgYjMsIGIyLCB0bXAyLCB0bXAzKTsKKyAgdG1wMCA9ICh0bXAyID4gbWF4bGV2ZWwpOworICB0bXAxID0gKHRtcDMgPiBtYXhsZXZlbCk7CisgIHRtcDIgPSAodjhpMTYpX19tc2FfYm1uel92KCh2MTZ1OCl0bXAyLCAodjE2dTgpbWF4bGV2ZWwsICh2MTZ1OCl0bXAwKTsKKyAgdG1wMyA9ICh2OGkxNilfX21zYV9ibW56X3YoKHYxNnU4KXRtcDMsICh2MTZ1OCltYXhsZXZlbCwgKHYxNnU4KXRtcDEpOworICBTVUIyKHplcm8sIHRtcDIsIHplcm8sIHRtcDMsIHRtcDAsIHRtcDEpOworICB0bXAyID0gKHY4aTE2KV9fbXNhX2JtbnpfdigodjE2dTgpdG1wMiwgKHYxNnU4KXRtcDAsICh2MTZ1OClzaWduMCk7CisgIHRtcDMgPSAodjhpMTYpX19tc2FfYm1uel92KCh2MTZ1OCl0bXAzLCAodjE2dTgpdG1wMSwgKHYxNnU4KXNpZ24xKTsKKyAgTERfU1c0KCZtdHgtPnp0aHJlc2hfWzBdLCA0LCB0MCwgdDEsIHQyLCB0Myk7ICAgLy8genRocmVzaAorICB0MCA9IChzMCA+IHQwKTsKKyAgdDEgPSAoczEgPiB0MSk7CisgIHQyID0gKHMyID4gdDIpOworICB0MyA9IChzMyA+IHQzKTsKKyAgUENLRVZfSDJfU0godDEsIHQwLCB0MywgdDIsIHRtcDAsIHRtcDEpOworICB0bXA0ID0gKHY4aTE2KV9fbXNhX2JtbnpfdigodjE2dTgpemVybywgKHYxNnU4KXRtcDIsICh2MTZ1OCl0bXAwKTsKKyAgdG1wNSA9ICh2OGkxNilfX21zYV9ibW56X3YoKHYxNnU4KXplcm8sICh2MTZ1OCl0bXAzLCAodjE2dTgpdG1wMSk7CisgIExEX1NIMigmbXR4LT5xX1swXSwgOCwgdG1wMCwgdG1wMSk7CisgIE1VTDIodG1wNCwgdG1wMCwgdG1wNSwgdG1wMSwgaW4wLCBpbjEpOworICBWU0hGX0gyX1NIKHRtcDQsIHRtcDUsIHRtcDQsIHRtcDUsIHppZ3phZzAsIHppZ3phZzEsIG91dDAsIG91dDEpOworICBTVF9TSDIoaW4wLCBpbjEsICZpblswXSwgOCk7CisgIFNUX1NIMihvdXQwLCBvdXQxLCAmb3V0WzBdLCA4KTsKKyAgb3V0MCA9IF9fbXNhX2FkZF9hX2gob3V0MCwgb3V0MSk7CisgIHN1bSA9IEhBRERfU0hfUzMyKG91dDApOworICByZXR1cm4gKHN1bSA+IDApOworfQorCitzdGF0aWMgaW50IFF1YW50aXplMkJsb2Nrc19NU0EoaW50MTZfdCBpblszMl0sIGludDE2X3Qgb3V0WzMyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhNYXRyaXgqIGNvbnN0IG10eCkgeworICBpbnQgbno7CisgIG56ICA9IFZQOEVuY1F1YW50aXplQmxvY2soaW4gKyAwICogMTYsIG91dCArIDAgKiAxNiwgbXR4KSA8PCAwOworICBueiB8PSBWUDhFbmNRdWFudGl6ZUJsb2NrKGluICsgMSAqIDE2LCBvdXQgKyAxICogMTYsIG10eCkgPDwgMTsKKyAgcmV0dXJuIG56OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgVlA4RW5jRHNwSW5pdE1TQSh2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFZQOEVuY0RzcEluaXRNU0Eodm9pZCkgeworICBWUDhJVHJhbnNmb3JtID0gSVRyYW5zZm9ybV9NU0E7CisgIFZQOEZUcmFuc2Zvcm0gPSBGVHJhbnNmb3JtX01TQTsKKyAgVlA4RlRyYW5zZm9ybVdIVCA9IEZUcmFuc2Zvcm1XSFRfTVNBOworCisgIFZQOFREaXN0bzR4NCA9IERpc3RvNHg0X01TQTsKKyAgVlA4VERpc3RvMTZ4MTYgPSBEaXN0bzE2eDE2X01TQTsKKyAgVlA4Q29sbGVjdEhpc3RvZ3JhbSA9IENvbGxlY3RIaXN0b2dyYW1fTVNBOworCisgIFZQOEVuY1ByZWRMdW1hNCA9IEludHJhNFByZWRzX01TQTsKKyAgVlA4RW5jUHJlZEx1bWExNiA9IEludHJhMTZQcmVkc19NU0E7CisgIFZQOEVuY1ByZWRDaHJvbWE4ID0gSW50cmFDaHJvbWFQcmVkc19NU0E7CisKKyAgVlA4U1NFMTZ4MTYgPSBTU0UxNngxNl9NU0E7CisgIFZQOFNTRTE2eDggPSBTU0UxNng4X01TQTsKKyAgVlA4U1NFOHg4ID0gU1NFOHg4X01TQTsKKyAgVlA4U1NFNHg0ID0gU1NFNHg0X01TQTsKKworICBWUDhFbmNRdWFudGl6ZUJsb2NrID0gUXVhbnRpemVCbG9ja19NU0E7CisgIFZQOEVuY1F1YW50aXplMkJsb2NrcyA9IFF1YW50aXplMkJsb2Nrc19NU0E7CisgIFZQOEVuY1F1YW50aXplQmxvY2tXSFQgPSBRdWFudGl6ZUJsb2NrX01TQTsKK30KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9NU0EKKworV0VCUF9EU1BfSU5JVF9TVFVCKFZQOEVuY0RzcEluaXRNU0EpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfTVNBCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2VuY19uZW9uLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2VuY19uZW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNiZjEyNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZW5jX25lb24uYwpAQCAtMCwwICsxLDkzOCBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEFSTSBORU9OIHZlcnNpb24gb2Ygc3BlZWQtY3JpdGljYWwgZW5jb2RpbmcgZnVuY3Rpb25zLgorLy8KKy8vIGFkYXB0ZWQgZnJvbSBsaWJ2cHggKGh0dHA6Ly93d3cud2VibXByb2plY3Qub3JnL2NvZGUvKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTkVPTikKKworI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSAic3JjL2RzcC9uZW9uLmgiCisjaW5jbHVkZSAic3JjL2VuYy92cDhpX2VuYy5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVHJhbnNmb3JtcyAoUGFyYWdyYXBoIDE0LjQpCisKKy8vIEludmVyc2UgdHJhbnNmb3JtLgorLy8gVGhpcyBjb2RlIGlzIHByZXR0eSBtdWNoIHRoZSBzYW1lIGFzIFRyYW5zZm9ybU9uZSBpbiB0aGUgZGVjX25lb24uYywgZXhjZXB0CisvLyBmb3Igc3VidHJhY3Rpb24gdG8gKnJlZi4gU2VlIHRoZSBjb21tZW50cyB0aGVyZSBmb3IgYWxnb3JpdGhtaWMgZXhwbGFuYXRpb25zLgorCitzdGF0aWMgY29uc3QgaW50MTZfdCBrQzEgPSAyMDA5MTsKK3N0YXRpYyBjb25zdCBpbnQxNl90IGtDMiA9IDE3NzM0OyAgLy8gaGFsZiBvZiBrQzIsIGFjdHVhbGx5LiBTZWUgY29tbWVudCBhYm92ZS4KKworLy8gVGhpcyBjb2RlIHdvcmtzIGJ1dCBpcyAqc2xvd2VyKiB0aGFuIHRoZSBpbmxpbmVkLWFzbSB2ZXJzaW9uIGJlbG93CisvLyAod2l0aCBnY2MtNC42KS4gU28gd2UgZGlzYWJsZSBpdCBmb3Igbm93LiBMYXRlciwgaXQnbGwgYmUgY29uZGl0aW9uYWwgdG8KKy8vIFdFQlBfVVNFX0lOVFJJTlNJQ1MgZGVmaW5lLgorLy8gV2l0aCBnY2MtNC44LCBpdCdzIGEgbGl0dGxlIGZhc3RlciBzcGVlZCB0aGFuIGlubGluZWQtYXNzZW1ibHkuCisjaWYgZGVmaW5lZChXRUJQX1VTRV9JTlRSSU5TSUNTKQorCisvLyBUcmVhdHMgJ3YnIGFzIGFuIHVpbnQ4eDhfdCBhbmQgemVybyBleHRlbmRzIHRvIGFuIGludDE2eDhfdC4KK3N0YXRpYyBXRUJQX0lOTElORSBpbnQxNng4X3QgQ29udmVydFU4VG9TMTZfTkVPTih1aW50MzJ4Ml90IHYpIHsKKyAgcmV0dXJuIHZyZWludGVycHJldHFfczE2X3UxNih2bW92bF91OCh2cmVpbnRlcnByZXRfdThfdTMyKHYpKSk7Cit9CisKKy8vIFBlcmZvcm1zIHVuc2lnbmVkIDhiIHNhdHVyYXRpb24gb24gJ2RzdDAxJyBhbmQgJ2RzdDIzJyBzdG9yaW5nIHRoZSByZXN1bHQKKy8vIHRvIHRoZSBjb3JyZXNwb25kaW5nIHJvd3Mgb2YgJ2RzdCcuCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBTYXR1cmF0ZUFuZFN0b3JlNHg0X05FT04odWludDhfdCogY29uc3QgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2eDhfdCBkc3QwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNng4X3QgZHN0MjMpIHsKKyAgLy8gVW5zaWduZWQgc2F0dXJhdGUgdG8gOGIuCisgIGNvbnN0IHVpbnQ4eDhfdCBkc3QwMV91OCA9IHZxbW92dW5fczE2KGRzdDAxKTsKKyAgY29uc3QgdWludDh4OF90IGRzdDIzX3U4ID0gdnFtb3Z1bl9zMTYoZHN0MjMpOworCisgIC8vIFN0b3JlIHRoZSByZXN1bHRzLgorICB2c3QxX2xhbmVfdTMyKCh1aW50MzJfdCopKGRzdCArIDAgKiBCUFMpLCB2cmVpbnRlcnByZXRfdTMyX3U4KGRzdDAxX3U4KSwgMCk7CisgIHZzdDFfbGFuZV91MzIoKHVpbnQzMl90KikoZHN0ICsgMSAqIEJQUyksIHZyZWludGVycHJldF91MzJfdTgoZHN0MDFfdTgpLCAxKTsKKyAgdnN0MV9sYW5lX3UzMigodWludDMyX3QqKShkc3QgKyAyICogQlBTKSwgdnJlaW50ZXJwcmV0X3UzMl91OChkc3QyM191OCksIDApOworICB2c3QxX2xhbmVfdTMyKCh1aW50MzJfdCopKGRzdCArIDMgKiBCUFMpLCB2cmVpbnRlcnByZXRfdTMyX3U4KGRzdDIzX3U4KSwgMSk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEFkZDR4NF9ORU9OKGNvbnN0IGludDE2eDhfdCByb3cwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2eDhfdCByb3cyMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IGRzdCkgeworICB1aW50MzJ4Ml90IGRzdDAxID0gdmR1cF9uX3UzMigwKTsKKyAgdWludDMyeDJfdCBkc3QyMyA9IHZkdXBfbl91MzIoMCk7CisKKyAgLy8gTG9hZCB0aGUgc291cmNlIHBpeGVscy4KKyAgZHN0MDEgPSB2bGQxX2xhbmVfdTMyKCh1aW50MzJfdCopKHJlZiArIDAgKiBCUFMpLCBkc3QwMSwgMCk7CisgIGRzdDIzID0gdmxkMV9sYW5lX3UzMigodWludDMyX3QqKShyZWYgKyAyICogQlBTKSwgZHN0MjMsIDApOworICBkc3QwMSA9IHZsZDFfbGFuZV91MzIoKHVpbnQzMl90KikocmVmICsgMSAqIEJQUyksIGRzdDAxLCAxKTsKKyAgZHN0MjMgPSB2bGQxX2xhbmVfdTMyKCh1aW50MzJfdCopKHJlZiArIDMgKiBCUFMpLCBkc3QyMywgMSk7CisKKyAgeworICAgIC8vIENvbnZlcnQgdG8gMTZiLgorICAgIGNvbnN0IGludDE2eDhfdCBkc3QwMV9zMTYgPSBDb252ZXJ0VThUb1MxNl9ORU9OKGRzdDAxKTsKKyAgICBjb25zdCBpbnQxNng4X3QgZHN0MjNfczE2ID0gQ29udmVydFU4VG9TMTZfTkVPTihkc3QyMyk7CisKKyAgICAvLyBEZXNjYWxlIHdpdGggcm91bmRpbmcuCisgICAgY29uc3QgaW50MTZ4OF90IG91dDAxID0gdnJzcmFxX25fczE2KGRzdDAxX3MxNiwgcm93MDEsIDMpOworICAgIGNvbnN0IGludDE2eDhfdCBvdXQyMyA9IHZyc3JhcV9uX3MxNihkc3QyM19zMTYsIHJvdzIzLCAzKTsKKyAgICAvLyBBZGQgdGhlIGludmVyc2UgdHJhbnNmb3JtLgorICAgIFNhdHVyYXRlQW5kU3RvcmU0eDRfTkVPTihkc3QsIG91dDAxLCBvdXQyMyk7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVHJhbnNwb3NlOHgyX05FT04oY29uc3QgaW50MTZ4OF90IGluMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2eDhfdCBpbjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNng4eDJfdCogY29uc3Qgb3V0KSB7CisgIC8vIGEwIGExIGEyIGEzIHwgYjAgYjEgYjIgYjMgICA9PiBhMCBiMCBjMCBkMCB8IGExIGIxIGMxIGQxCisgIC8vIGMwIGMxIGMyIGMzIHwgZDAgZDEgZDIgZDMgICAgICBhMiBiMiBjMiBkMiB8IGEzIGIzIGMzIGQzCisgIGNvbnN0IGludDE2eDh4Ml90IHRtcDAgPSB2emlwcV9zMTYoaW4wLCBpbjEpOyAgIC8vIGEwIGMwIGExIGMxIGEyIGMyIC4uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiMCBkMCBiMSBkMSBiMiBkMiAuLi4KKyAgKm91dCA9IHZ6aXBxX3MxNih0bXAwLnZhbFswXSwgdG1wMC52YWxbMV0pOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBUcmFuc2Zvcm1QYXNzX05FT04oaW50MTZ4OHgyX3QqIGNvbnN0IHJvd3MpIHsKKyAgLy8ge3Jvd3N9ID0gaW4wIHwgaW40CisgIC8vICAgICAgICAgIGluOCB8IGluMTIKKyAgLy8gQjEgPSBpbjQgfCBpbjEyCisgIGNvbnN0IGludDE2eDhfdCBCMSA9CisgICAgICB2Y29tYmluZV9zMTYodmdldF9oaWdoX3MxNihyb3dzLT52YWxbMF0pLCB2Z2V0X2hpZ2hfczE2KHJvd3MtPnZhbFsxXSkpOworICAvLyBDMCA9IGtDMSAqIGluNCB8IGtDMSAqIGluMTIKKyAgLy8gQzEgPSBrQzIgKiBpbjQgfCBrQzIgKiBpbjEyCisgIGNvbnN0IGludDE2eDhfdCBDMCA9IHZzcmFxX25fczE2KEIxLCB2cWRtdWxocV9uX3MxNihCMSwga0MxKSwgMSk7CisgIGNvbnN0IGludDE2eDhfdCBDMSA9IHZxZG11bGhxX25fczE2KEIxLCBrQzIpOworICBjb25zdCBpbnQxNng0X3QgYSA9IHZxYWRkX3MxNih2Z2V0X2xvd19zMTYocm93cy0+dmFsWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmdldF9sb3dfczE2KHJvd3MtPnZhbFsxXSkpOyAgIC8vIGluMCArIGluOAorICBjb25zdCBpbnQxNng0X3QgYiA9IHZxc3ViX3MxNih2Z2V0X2xvd19zMTYocm93cy0+dmFsWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmdldF9sb3dfczE2KHJvd3MtPnZhbFsxXSkpOyAgIC8vIGluMCAtIGluOAorICAvLyBjID0ga0MyICogaW40IC0ga0MxICogaW4xMgorICAvLyBkID0ga0MxICogaW40ICsga0MyICogaW4xMgorICBjb25zdCBpbnQxNng0X3QgYyA9IHZxc3ViX3MxNih2Z2V0X2xvd19zMTYoQzEpLCB2Z2V0X2hpZ2hfczE2KEMwKSk7CisgIGNvbnN0IGludDE2eDRfdCBkID0gdnFhZGRfczE2KHZnZXRfbG93X3MxNihDMCksIHZnZXRfaGlnaF9zMTYoQzEpKTsKKyAgY29uc3QgaW50MTZ4OF90IEQwID0gdmNvbWJpbmVfczE2KGEsIGIpOyAgICAgIC8vIEQwID0gYSB8IGIKKyAgY29uc3QgaW50MTZ4OF90IEQxID0gdmNvbWJpbmVfczE2KGQsIGMpOyAgICAgIC8vIEQxID0gZCB8IGMKKyAgY29uc3QgaW50MTZ4OF90IEUwID0gdnFhZGRxX3MxNihEMCwgRDEpOyAgICAgIC8vIGErZCB8IGIrYworICBjb25zdCBpbnQxNng4X3QgRV90bXAgPSB2cXN1YnFfczE2KEQwLCBEMSk7ICAgLy8gYS1kIHwgYi1jCisgIGNvbnN0IGludDE2eDhfdCBFMSA9IHZjb21iaW5lX3MxNih2Z2V0X2hpZ2hfczE2KEVfdG1wKSwgdmdldF9sb3dfczE2KEVfdG1wKSk7CisgIFRyYW5zcG9zZTh4Ml9ORU9OKEUwLCBFMSwgcm93cyk7Cit9CisKK3N0YXRpYyB2b2lkIElUcmFuc2Zvcm1PbmVfTkVPTihjb25zdCB1aW50OF90KiByZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCkgeworICBpbnQxNng4eDJfdCByb3dzOworICBJTklUX1ZFQ1RPUjIocm93cywgdmxkMXFfczE2KGluICsgMCksIHZsZDFxX3MxNihpbiArIDgpKTsKKyAgVHJhbnNmb3JtUGFzc19ORU9OKCZyb3dzKTsKKyAgVHJhbnNmb3JtUGFzc19ORU9OKCZyb3dzKTsKKyAgQWRkNHg0X05FT04ocm93cy52YWxbMF0sIHJvd3MudmFsWzFdLCByZWYsIGRzdCk7Cit9CisKKyNlbHNlCisKK3N0YXRpYyB2b2lkIElUcmFuc2Zvcm1PbmVfTkVPTihjb25zdCB1aW50OF90KiByZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCkgeworICBjb25zdCBpbnQga0JQUyA9IEJQUzsKKyAgY29uc3QgaW50MTZfdCBrQzFDMltdID0geyBrQzEsIGtDMiwgMCwgMCB9OworCisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICJ2bGQxLjE2ICAgICAgICAge3ExLCBxMn0sIFslW2luXV0gICAgICAgICAgIFxuIgorICAgICJ2bGQxLjE2ICAgICAgICAge2QwfSwgWyVba0MxQzJdXSAgICAgICAgICAgIFxuIgorCisgICAgLy8gZDI6IGluWzBdCisgICAgLy8gZDM6IGluWzhdCisgICAgLy8gZDQ6IGluWzRdCisgICAgLy8gZDU6IGluWzEyXQorICAgICJ2c3dwICAgICAgICAgICAgZDMsIGQ0ICAgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgLy8gcTggPSB7aW5bNF0sIGluWzEyXX0gKiBrQzEgKiAyID4+IDE2CisgICAgLy8gcTkgPSB7aW5bNF0sIGluWzEyXX0gKiBrQzIgPj4gMTYKKyAgICAidnFkbXVsaC5zMTYgICAgIHE4LCBxMiwgZDBbMF0gICAgICAgICAgICAgICBcbiIKKyAgICAidnFkbXVsaC5zMTYgICAgIHE5LCBxMiwgZDBbMV0gICAgICAgICAgICAgICBcbiIKKworICAgIC8vIGQyMiA9IGEgPSBpblswXSArIGluWzhdCisgICAgLy8gZDIzID0gYiA9IGluWzBdIC0gaW5bOF0KKyAgICAidnFhZGQuczE2ICAgICAgIGQyMiwgZDIsIGQzICAgICAgICAgICAgICAgICBcbiIKKyAgICAidnFzdWIuczE2ICAgICAgIGQyMywgZDIsIGQzICAgICAgICAgICAgICAgICBcbiIKKworICAgIC8vICBxOCA9IGluWzRdL1sxMl0gKiBrQzEgPj4gMTYKKyAgICAidnNoci5zMTYgICAgICAgIHE4LCBxOCwgIzEgICAgICAgICAgICAgICAgICBcbiIKKworICAgIC8vIEFkZCB7aW5bNF0sIGluWzEyXX0gYmFjayBhZnRlciB0aGUgbXVsdGlwbGljYXRpb24uCisgICAgInZxYWRkLnMxNiAgICAgICBxOCwgcTIsIHE4ICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAvLyBkMjAgPSBjID0gaW5bNF0qa0MyIC0gaW5bMTJdKmtDMQorICAgIC8vIGQyMSA9IGQgPSBpbls0XSprQzEgKyBpblsxMl0qa0MyCisgICAgInZxc3ViLnMxNiAgICAgICBkMjAsIGQxOCwgZDE3ICAgICAgICAgICAgICAgXG4iCisgICAgInZxYWRkLnMxNiAgICAgICBkMjEsIGQxOSwgZDE2ICAgICAgICAgICAgICAgXG4iCisKKyAgICAvLyBkMiA9IHRtcFswXSA9IGEgKyBkCisgICAgLy8gZDMgPSB0bXBbMV0gPSBiICsgYworICAgIC8vIGQ0ID0gdG1wWzJdID0gYiAtIGMKKyAgICAvLyBkNSA9IHRtcFszXSA9IGEgLSBkCisgICAgInZxYWRkLnMxNiAgICAgICBkMiwgZDIyLCBkMjEgICAgICAgICAgICAgICAgXG4iCisgICAgInZxYWRkLnMxNiAgICAgICBkMywgZDIzLCBkMjAgICAgICAgICAgICAgICAgXG4iCisgICAgInZxc3ViLnMxNiAgICAgICBkNCwgZDIzLCBkMjAgICAgICAgICAgICAgICAgXG4iCisgICAgInZxc3ViLnMxNiAgICAgICBkNSwgZDIyLCBkMjEgICAgICAgICAgICAgICAgXG4iCisKKyAgICAidnppcC4xNiAgICAgICAgIHExLCBxMiAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAidnppcC4xNiAgICAgICAgIHExLCBxMiAgICAgICAgICAgICAgICAgICAgICBcbiIKKworICAgICJ2c3dwICAgICAgICAgICAgZDMsIGQ0ICAgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgLy8gcTggPSB7dG1wWzRdLCB0bXBbMTJdfSAqIGtDMSAqIDIgPj4gMTYKKyAgICAvLyBxOSA9IHt0bXBbNF0sIHRtcFsxMl19ICoga0MyID4+IDE2CisgICAgInZxZG11bGguczE2ICAgICBxOCwgcTIsIGQwWzBdICAgICAgICAgICAgICAgXG4iCisgICAgInZxZG11bGguczE2ICAgICBxOSwgcTIsIGQwWzFdICAgICAgICAgICAgICAgXG4iCisKKyAgICAvLyBkMjIgPSBhID0gdG1wWzBdICsgdG1wWzhdCisgICAgLy8gZDIzID0gYiA9IHRtcFswXSAtIHRtcFs4XQorICAgICJ2cWFkZC5zMTYgICAgICAgZDIyLCBkMiwgZDMgICAgICAgICAgICAgICAgIFxuIgorICAgICJ2cXN1Yi5zMTYgICAgICAgZDIzLCBkMiwgZDMgICAgICAgICAgICAgICAgIFxuIgorCisgICAgInZzaHIuczE2ICAgICAgICBxOCwgcTgsICMxICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZxYWRkLnMxNiAgICAgICBxOCwgcTIsIHE4ICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAvLyBkMjAgPSBjID0gaW5bNF0qa0MyIC0gaW5bMTJdKmtDMQorICAgIC8vIGQyMSA9IGQgPSBpbls0XSprQzEgKyBpblsxMl0qa0MyCisgICAgInZxc3ViLnMxNiAgICAgICBkMjAsIGQxOCwgZDE3ICAgICAgICAgICAgICAgXG4iCisgICAgInZxYWRkLnMxNiAgICAgICBkMjEsIGQxOSwgZDE2ICAgICAgICAgICAgICAgXG4iCisKKyAgICAvLyBkMiA9IHRtcFswXSA9IGEgKyBkCisgICAgLy8gZDMgPSB0bXBbMV0gPSBiICsgYworICAgIC8vIGQ0ID0gdG1wWzJdID0gYiAtIGMKKyAgICAvLyBkNSA9IHRtcFszXSA9IGEgLSBkCisgICAgInZxYWRkLnMxNiAgICAgICBkMiwgZDIyLCBkMjEgICAgICAgICAgICAgICAgXG4iCisgICAgInZxYWRkLnMxNiAgICAgICBkMywgZDIzLCBkMjAgICAgICAgICAgICAgICAgXG4iCisgICAgInZxc3ViLnMxNiAgICAgICBkNCwgZDIzLCBkMjAgICAgICAgICAgICAgICAgXG4iCisgICAgInZxc3ViLnMxNiAgICAgICBkNSwgZDIyLCBkMjEgICAgICAgICAgICAgICAgXG4iCisKKyAgICAidmxkMS4zMiAgICAgICAgIGQ2WzBdLCBbJVtyZWZdXSwgJVtrQlBTXSAgICBcbiIKKyAgICAidmxkMS4zMiAgICAgICAgIGQ2WzFdLCBbJVtyZWZdXSwgJVtrQlBTXSAgICBcbiIKKyAgICAidmxkMS4zMiAgICAgICAgIGQ3WzBdLCBbJVtyZWZdXSwgJVtrQlBTXSAgICBcbiIKKyAgICAidmxkMS4zMiAgICAgICAgIGQ3WzFdLCBbJVtyZWZdXSwgJVtrQlBTXSAgICBcbiIKKworICAgICJzdWIgICAgICAgICAlW3JlZl0sICVbcmVmXSwgJVtrQlBTXSwgbHNsICMyIFxuIgorCisgICAgLy8gKHZhbCkgKyA0ID4+IDMKKyAgICAidnJzaHIuczE2ICAgICAgIGQyLCBkMiwgIzMgICAgICAgICAgICAgICAgICBcbiIKKyAgICAidnJzaHIuczE2ICAgICAgIGQzLCBkMywgIzMgICAgICAgICAgICAgICAgICBcbiIKKyAgICAidnJzaHIuczE2ICAgICAgIGQ0LCBkNCwgIzMgICAgICAgICAgICAgICAgICBcbiIKKyAgICAidnJzaHIuczE2ICAgICAgIGQ1LCBkNSwgIzMgICAgICAgICAgICAgICAgICBcbiIKKworICAgICJ2emlwLjE2ICAgICAgICAgcTEsIHEyICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJ2emlwLjE2ICAgICAgICAgcTEsIHEyICAgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgLy8gTXVzdCBhY2N1bXVsYXRlIGJlZm9yZSBzYXR1cmF0aW5nCisgICAgInZtb3ZsLnU4ICAgICAgICBxOCwgZDYgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZtb3ZsLnU4ICAgICAgICBxOSwgZDcgICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAidnFhZGQuczE2ICAgICAgIHExLCBxMSwgcTggICAgICAgICAgICAgICAgICBcbiIKKyAgICAidnFhZGQuczE2ICAgICAgIHEyLCBxMiwgcTkgICAgICAgICAgICAgICAgICBcbiIKKworICAgICJ2cW1vdnVuLnMxNiAgICAgZDAsIHExICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJ2cW1vdnVuLnMxNiAgICAgZDEsIHEyICAgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgInZzdDEuMzIgICAgICAgICBkMFswXSwgWyVbZHN0XV0sICVba0JQU10gICAgXG4iCisgICAgInZzdDEuMzIgICAgICAgICBkMFsxXSwgWyVbZHN0XV0sICVba0JQU10gICAgXG4iCisgICAgInZzdDEuMzIgICAgICAgICBkMVswXSwgWyVbZHN0XV0sICVba0JQU10gICAgXG4iCisgICAgInZzdDEuMzIgICAgICAgICBkMVsxXSwgWyVbZHN0XV0gICAgICAgICAgICAgXG4iCisKKyAgICA6IFtpbl0gIityIihpbiksIFtkc3RdICIrciIoZHN0KSAgICAgICAgICAgICAgIC8vIG1vZGlmaWVkIHJlZ2lzdGVycworICAgIDogW2tCUFNdICJyIihrQlBTKSwgW2tDMUMyXSAiciIoa0MxQzIpLCBbcmVmXSAiciIocmVmKSAgLy8gY29uc3RhbnRzCisgICAgOiAibWVtb3J5IiwgInEwIiwgInExIiwgInEyIiwgInE4IiwgInE5IiwgInExMCIsICJxMTEiICAvLyBjbG9iYmVyZWQKKyAgKTsKK30KKworI2VuZGlmICAgIC8vIFdFQlBfVVNFX0lOVFJJTlNJQ1MKKworc3RhdGljIHZvaWQgSVRyYW5zZm9ybV9ORU9OKGNvbnN0IHVpbnQ4X3QqIHJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90KiBpbiwgdWludDhfdCogZHN0LCBpbnQgZG9fdHdvKSB7CisgIElUcmFuc2Zvcm1PbmVfTkVPTihyZWYsIGluLCBkc3QpOworICBpZiAoZG9fdHdvKSB7CisgICAgSVRyYW5zZm9ybU9uZV9ORU9OKHJlZiArIDQsIGluICsgMTYsIGRzdCArIDQpOworICB9Cit9CisKKy8vIExvYWQgYWxsIDR4NCBwaXhlbHMgaW50byBhIHNpbmdsZSB1aW50OHgxNl90IHZhcmlhYmxlLgorc3RhdGljIHVpbnQ4eDE2X3QgTG9hZDR4NF9ORU9OKGNvbnN0IHVpbnQ4X3QqIHNyYykgeworICB1aW50MzJ4NF90IG91dCA9IHZkdXBxX25fdTMyKDApOworICBvdXQgPSB2bGQxcV9sYW5lX3UzMigoY29uc3QgdWludDMyX3QqKShzcmMgKyAwICogQlBTKSwgb3V0LCAwKTsKKyAgb3V0ID0gdmxkMXFfbGFuZV91MzIoKGNvbnN0IHVpbnQzMl90Kikoc3JjICsgMSAqIEJQUyksIG91dCwgMSk7CisgIG91dCA9IHZsZDFxX2xhbmVfdTMyKChjb25zdCB1aW50MzJfdCopKHNyYyArIDIgKiBCUFMpLCBvdXQsIDIpOworICBvdXQgPSB2bGQxcV9sYW5lX3UzMigoY29uc3QgdWludDMyX3QqKShzcmMgKyAzICogQlBTKSwgb3V0LCAzKTsKKyAgcmV0dXJuIHZyZWludGVycHJldHFfdThfdTMyKG91dCk7Cit9CisKKy8vIEZvcndhcmQgdHJhbnNmb3JtLgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9JTlRSSU5TSUNTKQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBUcmFuc3Bvc2U0eDRfUzE2X05FT04oY29uc3QgaW50MTZ4NF90IEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZ4NF90IEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZ4NF90IEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZ4NF90IEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZ4OF90KiBjb25zdCBvdXQwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNng4X3QqIGNvbnN0IG91dDMyKSB7CisgIGNvbnN0IGludDE2eDR4Ml90IEFCID0gdnRybl9zMTYoQSwgQik7CisgIGNvbnN0IGludDE2eDR4Ml90IENEID0gdnRybl9zMTYoQywgRCk7CisgIGNvbnN0IGludDMyeDJ4Ml90IHRtcDAyID0gdnRybl9zMzIodnJlaW50ZXJwcmV0X3MzMl9zMTYoQUIudmFsWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cmVpbnRlcnByZXRfczMyX3MxNihDRC52YWxbMF0pKTsKKyAgY29uc3QgaW50MzJ4MngyX3QgdG1wMTMgPSB2dHJuX3MzMih2cmVpbnRlcnByZXRfczMyX3MxNihBQi52YWxbMV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZyZWludGVycHJldF9zMzJfczE2KENELnZhbFsxXSkpOworICAqb3V0MDEgPSB2cmVpbnRlcnByZXRxX3MxNl9zNjQoCisgICAgICB2Y29tYmluZV9zNjQodnJlaW50ZXJwcmV0X3M2NF9zMzIodG1wMDIudmFsWzBdKSwKKyAgICAgICAgICAgICAgICAgICB2cmVpbnRlcnByZXRfczY0X3MzMih0bXAxMy52YWxbMF0pKSk7CisgICpvdXQzMiA9IHZyZWludGVycHJldHFfczE2X3M2NCgKKyAgICAgIHZjb21iaW5lX3M2NCh2cmVpbnRlcnByZXRfczY0X3MzMih0bXAxMy52YWxbMV0pLAorICAgICAgICAgICAgICAgICAgIHZyZWludGVycHJldF9zNjRfczMyKHRtcDAyLnZhbFsxXSkpKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludDE2eDhfdCBEaWZmVThUb1MxNl9ORU9OKGNvbnN0IHVpbnQ4eDhfdCBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4eDhfdCBiKSB7CisgIHJldHVybiB2cmVpbnRlcnByZXRxX3MxNl91MTYodnN1YmxfdTgoYSwgYikpOworfQorCitzdGF0aWMgdm9pZCBGVHJhbnNmb3JtX05FT04oY29uc3QgdWludDhfdCogc3JjLCBjb25zdCB1aW50OF90KiByZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCogb3V0KSB7CisgIGludDE2eDhfdCBkMGQxLCBkM2QyOyAgIC8vIHdvcmtpbmcgNHg0IGludDE2IHZhcmlhYmxlcworICB7CisgICAgY29uc3QgdWludDh4MTZfdCBTMCA9IExvYWQ0eDRfTkVPTihzcmMpOworICAgIGNvbnN0IHVpbnQ4eDE2X3QgUjAgPSBMb2FkNHg0X05FT04ocmVmKTsKKyAgICBjb25zdCBpbnQxNng4X3QgRDBEMSA9IERpZmZVOFRvUzE2X05FT04odmdldF9sb3dfdTgoUzApLCB2Z2V0X2xvd191OChSMCkpOworICAgIGNvbnN0IGludDE2eDhfdCBEMkQzID0gRGlmZlU4VG9TMTZfTkVPTih2Z2V0X2hpZ2hfdTgoUzApLCB2Z2V0X2hpZ2hfdTgoUjApKTsKKyAgICBjb25zdCBpbnQxNng0X3QgRDAgPSB2Z2V0X2xvd19zMTYoRDBEMSk7CisgICAgY29uc3QgaW50MTZ4NF90IEQxID0gdmdldF9oaWdoX3MxNihEMEQxKTsKKyAgICBjb25zdCBpbnQxNng0X3QgRDIgPSB2Z2V0X2xvd19zMTYoRDJEMyk7CisgICAgY29uc3QgaW50MTZ4NF90IEQzID0gdmdldF9oaWdoX3MxNihEMkQzKTsKKyAgICBUcmFuc3Bvc2U0eDRfUzE2X05FT04oRDAsIEQxLCBEMiwgRDMsICZkMGQxLCAmZDNkMik7CisgIH0KKyAgeyAgICAvLyAxcnN0IHBhc3MKKyAgICBjb25zdCBpbnQzMng0X3Qga0NzdDkzNyA9IHZkdXBxX25fczMyKDkzNyk7CisgICAgY29uc3QgaW50MzJ4NF90IGtDc3QxODEyID0gdmR1cHFfbl9zMzIoMTgxMik7CisgICAgY29uc3QgaW50MTZ4OF90IGEwYTEgPSB2YWRkcV9zMTYoZDBkMSwgZDNkMik7ICAgLy8gZDArZDMgfCBkMStkMiAgICg9YTB8YTEpCisgICAgY29uc3QgaW50MTZ4OF90IGEzYTIgPSB2c3VicV9zMTYoZDBkMSwgZDNkMik7ICAgLy8gZDAtZDMgfCBkMS1kMiAgICg9YTN8YTIpCisgICAgY29uc3QgaW50MTZ4OF90IGEwYTFfMiA9IHZzaGxxX25fczE2KGEwYTEsIDMpOworICAgIGNvbnN0IGludDE2eDRfdCB0bXAwID0gdmFkZF9zMTYodmdldF9sb3dfczE2KGEwYTFfMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Z2V0X2hpZ2hfczE2KGEwYTFfMikpOworICAgIGNvbnN0IGludDE2eDRfdCB0bXAyID0gdnN1Yl9zMTYodmdldF9sb3dfczE2KGEwYTFfMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Z2V0X2hpZ2hfczE2KGEwYTFfMikpOworICAgIGNvbnN0IGludDMyeDRfdCBhM18yMjE3ID0gdm11bGxfbl9zMTYodmdldF9sb3dfczE2KGEzYTIpLCAyMjE3KTsKKyAgICBjb25zdCBpbnQzMng0X3QgYTJfMjIxNyA9IHZtdWxsX25fczE2KHZnZXRfaGlnaF9zMTYoYTNhMiksIDIyMTcpOworICAgIGNvbnN0IGludDMyeDRfdCBhMl9wX2EzID0gdm1sYWxfbl9zMTYoYTJfMjIxNywgdmdldF9sb3dfczE2KGEzYTIpLCA1MzUyKTsKKyAgICBjb25zdCBpbnQzMng0X3QgYTNfbV9hMiA9IHZtbHNsX25fczE2KGEzXzIyMTcsIHZnZXRfaGlnaF9zMTYoYTNhMiksIDUzNTIpOworICAgIGNvbnN0IGludDE2eDRfdCB0bXAxID0gdnNocm5fbl9zMzIodmFkZHFfczMyKGEyX3BfYTMsIGtDc3QxODEyKSwgOSk7CisgICAgY29uc3QgaW50MTZ4NF90IHRtcDMgPSB2c2hybl9uX3MzMih2YWRkcV9zMzIoYTNfbV9hMiwga0NzdDkzNyksIDkpOworICAgIFRyYW5zcG9zZTR4NF9TMTZfTkVPTih0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCAmZDBkMSwgJmQzZDIpOworICB9CisgIHsgICAgLy8gMm5kIHBhc3MKKyAgICAvLyB0aGUgKDE8PDE2KSBhZGRpdGlvbiBpcyBmb3IgdGhlIHJlcGxhY2VtZW50OiBhMyE9MCAgPC0+IDEtKGEzPT0wKQorICAgIGNvbnN0IGludDMyeDRfdCBrQ3N0MTIwMDAgPSB2ZHVwcV9uX3MzMigxMjAwMCArICgxIDw8IDE2KSk7CisgICAgY29uc3QgaW50MzJ4NF90IGtDc3Q1MTAwMCA9IHZkdXBxX25fczMyKDUxMDAwKTsKKyAgICBjb25zdCBpbnQxNng4X3QgYTBhMSA9IHZhZGRxX3MxNihkMGQxLCBkM2QyKTsgICAvLyBkMCtkMyB8IGQxK2QyICAgKD1hMHxhMSkKKyAgICBjb25zdCBpbnQxNng4X3QgYTNhMiA9IHZzdWJxX3MxNihkMGQxLCBkM2QyKTsgICAvLyBkMC1kMyB8IGQxLWQyICAgKD1hM3xhMikKKyAgICBjb25zdCBpbnQxNng0X3QgYTBfazcgPSB2YWRkX3MxNih2Z2V0X2xvd19zMTYoYTBhMSksIHZkdXBfbl9zMTYoNykpOworICAgIGNvbnN0IGludDE2eDRfdCBvdXQwID0gdnNocl9uX3MxNih2YWRkX3MxNihhMF9rNywgdmdldF9oaWdoX3MxNihhMGExKSksIDQpOworICAgIGNvbnN0IGludDE2eDRfdCBvdXQyID0gdnNocl9uX3MxNih2c3ViX3MxNihhMF9rNywgdmdldF9oaWdoX3MxNihhMGExKSksIDQpOworICAgIGNvbnN0IGludDMyeDRfdCBhM18yMjE3ID0gdm11bGxfbl9zMTYodmdldF9sb3dfczE2KGEzYTIpLCAyMjE3KTsKKyAgICBjb25zdCBpbnQzMng0X3QgYTJfMjIxNyA9IHZtdWxsX25fczE2KHZnZXRfaGlnaF9zMTYoYTNhMiksIDIyMTcpOworICAgIGNvbnN0IGludDMyeDRfdCBhMl9wX2EzID0gdm1sYWxfbl9zMTYoYTJfMjIxNywgdmdldF9sb3dfczE2KGEzYTIpLCA1MzUyKTsKKyAgICBjb25zdCBpbnQzMng0X3QgYTNfbV9hMiA9IHZtbHNsX25fczE2KGEzXzIyMTcsIHZnZXRfaGlnaF9zMTYoYTNhMiksIDUzNTIpOworICAgIGNvbnN0IGludDE2eDRfdCB0bXAxID0gdmFkZGhuX3MzMihhMl9wX2EzLCBrQ3N0MTIwMDApOworICAgIGNvbnN0IGludDE2eDRfdCBvdXQzID0gdmFkZGhuX3MzMihhM19tX2EyLCBrQ3N0NTEwMDApOworICAgIGNvbnN0IGludDE2eDRfdCBhM19lcV8wID0KKyAgICAgICAgdnJlaW50ZXJwcmV0X3MxNl91MTYodmNlcV9zMTYodmdldF9sb3dfczE2KGEzYTIpLCB2ZHVwX25fczE2KDApKSk7CisgICAgY29uc3QgaW50MTZ4NF90IG91dDEgPSB2YWRkX3MxNih0bXAxLCBhM19lcV8wKTsKKyAgICB2c3QxX3MxNihvdXQgKyAgMCwgb3V0MCk7CisgICAgdnN0MV9zMTYob3V0ICsgIDQsIG91dDEpOworICAgIHZzdDFfczE2KG91dCArICA4LCBvdXQyKTsKKyAgICB2c3QxX3MxNihvdXQgKyAxMiwgb3V0Myk7CisgIH0KK30KKworI2Vsc2UKKworLy8gYWRhcHRlZCBmcm9tIHZwOC9lbmNvZGVyL2FybS9uZW9uL3Nob3J0ZmRjdF9uZW9uLmFzbQorc3RhdGljIGNvbnN0IGludDE2X3Qga0NvZWZmMTZbXSA9IHsKKyAgNTM1MiwgIDUzNTIsICA1MzUyLCA1MzUyLCAyMjE3LCAgMjIxNywgIDIyMTcsIDIyMTcKK307CitzdGF0aWMgY29uc3QgaW50MzJfdCBrQ29lZmYzMltdID0geworICAgMTgxMiwgIDE4MTIsICAxODEyLCAgMTgxMiwKKyAgICA5MzcsICAgOTM3LCAgIDkzNywgICA5MzcsCisgIDEyMDAwLCAxMjAwMCwgMTIwMDAsIDEyMDAwLAorICA1MTAwMCwgNTEwMDAsIDUxMDAwLCA1MTAwMAorfTsKKworc3RhdGljIHZvaWQgRlRyYW5zZm9ybV9ORU9OKGNvbnN0IHVpbnQ4X3QqIHNyYywgY29uc3QgdWludDhfdCogcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QqIG91dCkgeworICBjb25zdCBpbnQga0JQUyA9IEJQUzsKKyAgY29uc3QgdWludDhfdCogc3JjX3B0ciA9IHNyYzsKKyAgY29uc3QgdWludDhfdCogcmVmX3B0ciA9IHJlZjsKKyAgY29uc3QgaW50MTZfdCogY29lZmYxNiA9IGtDb2VmZjE2OworICBjb25zdCBpbnQzMl90KiBjb2VmZjMyID0ga0NvZWZmMzI7CisKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgLy8gbG9hZCBzcmMgaW50byBxNCwgcTUgaW4gaGlnaCBoYWxmCisgICAgInZsZDEuOCB7ZDh9LCAgWyVbc3JjX3B0cl1dLCAlW2tCUFNdICAgICAgXG4iCisgICAgInZsZDEuOCB7ZDEwfSwgWyVbc3JjX3B0cl1dLCAlW2tCUFNdICAgICAgXG4iCisgICAgInZsZDEuOCB7ZDl9LCAgWyVbc3JjX3B0cl1dLCAlW2tCUFNdICAgICAgXG4iCisgICAgInZsZDEuOCB7ZDExfSwgWyVbc3JjX3B0cl1dICAgICAgICAgICAgICAgXG4iCisKKyAgICAvLyBsb2FkIHJlZiBpbnRvIHE2LCBxNyBpbiBoaWdoIGhhbGYKKyAgICAidmxkMS44IHtkMTJ9LCBbJVtyZWZfcHRyXV0sICVba0JQU10gICAgICBcbiIKKyAgICAidmxkMS44IHtkMTR9LCBbJVtyZWZfcHRyXV0sICVba0JQU10gICAgICBcbiIKKyAgICAidmxkMS44IHtkMTN9LCBbJVtyZWZfcHRyXV0sICVba0JQU10gICAgICBcbiIKKyAgICAidmxkMS44IHtkMTV9LCBbJVtyZWZfcHRyXV0gICAgICAgICAgICAgICBcbiIKKworICAgIC8vIFBhY2sgdGhlIGhpZ2ggdmFsdWVzIGluIHRvIHE0IGFuZCBxNgorICAgICJ2dHJuLjMyICAgICBxNCwgcTUgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJ2dHJuLjMyICAgICBxNiwgcTcgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgLy8gZFswLTNdID0gc3JjIC0gcmVmCisgICAgInZzdWJsLnU4ICAgIHEwLCBkOCwgZDEyICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZzdWJsLnU4ICAgIHExLCBkOSwgZDEzICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAvLyBsb2FkIGNvZWZmMTYgaW50byBxOChkMTY9NTM1MiwgZDE3PTIyMTcpCisgICAgInZsZDEuMTYgICAgIHtxOH0sIFslW2NvZWZmMTZdXSAgICAgICAgICAgXG4iCisKKyAgICAvLyBsb2FkIGNvZWZmMzIgaGlnaCBoYWxmIGludG8gcTkgPSAxODEyLCBxMTAgPSA5MzcKKyAgICAidmxkMS4zMiAgICAge3E5LCBxMTB9LCBbJVtjb2VmZjMyXV0hICAgICBcbiIKKworICAgIC8vIGxvYWQgY29lZmYzMiBsb3cgaGFsZiBpbnRvIHExMT0xMjAwMCwgcTEyPTUxMDAwCisgICAgInZsZDEuMzIgICAgIHtxMTEscTEyfSwgWyVbY29lZmYzMl1dICAgICAgXG4iCisKKyAgICAvLyBwYXJ0IDEKKyAgICAvLyBUcmFuc3Bvc2UuIFJlZ2lzdGVyIGROIGlzIHRoZSBzYW1lIGFzIGROIGluIEMKKyAgICAidnRybi4zMiAgICAgICAgIGQwLCBkMiAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAidnRybi4zMiAgICAgICAgIGQxLCBkMyAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAidnRybi4xNiAgICAgICAgIGQwLCBkMSAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAidnRybi4xNiAgICAgICAgIGQyLCBkMyAgICAgICAgICAgICAgICAgICBcbiIKKworICAgICJ2YWRkLnMxNiAgICAgICAgZDQsIGQwLCBkMyAgICAgICAgICAgICAgIFxuIiAvLyBhMCA9IGQwICsgZDMKKyAgICAidmFkZC5zMTYgICAgICAgIGQ1LCBkMSwgZDIgICAgICAgICAgICAgICBcbiIgLy8gYTEgPSBkMSArIGQyCisgICAgInZzdWIuczE2ICAgICAgICBkNiwgZDEsIGQyICAgICAgICAgICAgICAgXG4iIC8vIGEyID0gZDEgLSBkMgorICAgICJ2c3ViLnMxNiAgICAgICAgZDcsIGQwLCBkMyAgICAgICAgICAgICAgIFxuIiAvLyBhMyA9IGQwIC0gZDMKKworICAgICJ2YWRkLnMxNiAgICAgICAgZDAsIGQ0LCBkNSAgICAgICAgICAgICAgIFxuIiAvLyBhMCArIGExCisgICAgInZzaGwuczE2ICAgICAgICBkMCwgZDAsICMzICAgICAgICAgICAgICAgXG4iIC8vIHRlbXBbMCtpKjRdID0gKGEwK2ExKSA8PCAzCisgICAgInZzdWIuczE2ICAgICAgICBkMiwgZDQsIGQ1ICAgICAgICAgICAgICAgXG4iIC8vIGEwIC0gYTEKKyAgICAidnNobC5zMTYgICAgICAgIGQyLCBkMiwgIzMgICAgICAgICAgICAgICBcbiIgLy8gKHRlbXBbMitpKjRdID0gKGEwLWExKSA8PCAzCisKKyAgICAidm1sYWwuczE2ICAgICAgIHE5LCBkNywgZDE2ICAgICAgICAgICAgICBcbiIgLy8gYTMqNTM1MiArIDE4MTIKKyAgICAidm1sYWwuczE2ICAgICAgIHExMCwgZDcsIGQxNyAgICAgICAgICAgICBcbiIgLy8gYTMqMjIxNyArIDkzNworICAgICJ2bWxhbC5zMTYgICAgICAgcTksIGQ2LCBkMTcgICAgICAgICAgICAgIFxuIiAvLyBhMioyMjE3ICsgYTMqNTM1MiArIDE4MTIKKyAgICAidm1sc2wuczE2ICAgICAgIHExMCwgZDYsIGQxNiAgICAgICAgICAgICBcbiIgLy8gYTMqMjIxNyArIDkzNyAtIGEyKjUzNTIKKworICAgIC8vIHRlbXBbMStpKjRdID0gKGQyKjIyMTcgKyBkMyo1MzUyICsgMTgxMikgPj4gOQorICAgIC8vIHRlbXBbMytpKjRdID0gKGQzKjIyMTcgKyA5MzcgLSBkMio1MzUyKSA+PiA5CisgICAgInZzaHJuLnMzMiAgICAgICBkMSwgcTksICM5ICAgICAgICAgICAgICAgXG4iCisgICAgInZzaHJuLnMzMiAgICAgICBkMywgcTEwLCAjOSAgICAgICAgICAgICAgXG4iCisKKyAgICAvLyBwYXJ0IDIKKyAgICAvLyB0cmFuc3Bvc2UgZDA9aXBbMF0sIGQxPWlwWzRdLCBkMj1pcFs4XSwgZDM9aXBbMTJdCisgICAgInZ0cm4uMzIgICAgICAgICBkMCwgZDIgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZ0cm4uMzIgICAgICAgICBkMSwgZDMgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZ0cm4uMTYgICAgICAgICBkMCwgZDEgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZ0cm4uMTYgICAgICAgICBkMiwgZDMgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAidm1vdi5zMTYgICAgICAgIGQyNiwgIzcgICAgICAgICAgICAgICAgICBcbiIKKworICAgICJ2YWRkLnMxNiAgICAgICAgZDQsIGQwLCBkMyAgICAgICAgICAgICAgIFxuIiAvLyBhMSA9IGlwWzBdICsgaXBbMTJdCisgICAgInZhZGQuczE2ICAgICAgICBkNSwgZDEsIGQyICAgICAgICAgICAgICAgXG4iIC8vIGIxID0gaXBbNF0gKyBpcFs4XQorICAgICJ2c3ViLnMxNiAgICAgICAgZDYsIGQxLCBkMiAgICAgICAgICAgICAgIFxuIiAvLyBjMSA9IGlwWzRdIC0gaXBbOF0KKyAgICAidmFkZC5zMTYgICAgICAgIGQ0LCBkNCwgZDI2ICAgICAgICAgICAgICBcbiIgLy8gYTEgKyA3CisgICAgInZzdWIuczE2ICAgICAgICBkNywgZDAsIGQzICAgICAgICAgICAgICAgXG4iIC8vIGQxID0gaXBbMF0gLSBpcFsxMl0KKworICAgICJ2YWRkLnMxNiAgICAgICAgZDAsIGQ0LCBkNSAgICAgICAgICAgICAgIFxuIiAvLyBvcFswXSA9IGExICsgYjEgKyA3CisgICAgInZzdWIuczE2ICAgICAgICBkMiwgZDQsIGQ1ICAgICAgICAgICAgICAgXG4iIC8vIG9wWzhdID0gYTEgLSBiMSArIDcKKworICAgICJ2bWxhbC5zMTYgICAgICAgcTExLCBkNywgZDE2ICAgICAgICAgICAgIFxuIiAvLyBkMSo1MzUyICsgMTIwMDAKKyAgICAidm1sYWwuczE2ICAgICAgIHExMiwgZDcsIGQxNyAgICAgICAgICAgICBcbiIgLy8gZDEqMjIxNyArIDUxMDAwCisKKyAgICAidmNlcS5zMTYgICAgICAgIGQ0LCBkNywgIzAgICAgICAgICAgICAgICBcbiIKKworICAgICJ2c2hyLnMxNiAgICAgICAgZDAsIGQwLCAjNCAgICAgICAgICAgICAgIFxuIgorICAgICJ2c2hyLnMxNiAgICAgICAgZDIsIGQyLCAjNCAgICAgICAgICAgICAgIFxuIgorCisgICAgInZtbGFsLnMxNiAgICAgICBxMTEsIGQ2LCBkMTcgICAgICAgICAgICAgXG4iIC8vIGMxKjIyMTcgKyBkMSo1MzUyICsgMTIwMDAKKyAgICAidm1sc2wuczE2ICAgICAgIHExMiwgZDYsIGQxNiAgICAgICAgICAgICBcbiIgLy8gZDEqMjIxNyAtIGMxKjUzNTIgKyA1MTAwMAorCisgICAgInZtdm4gICAgICAgICAgICBkNCwgZDQgICAgICAgICAgICAgICAgICAgXG4iIC8vICEoZDEgPT0gMCkKKyAgICAvLyBvcFs0XSA9IChjMSoyMjE3ICsgZDEqNTM1MiArIDEyMDAwKT4+MTYKKyAgICAidnNocm4uczMyICAgICAgIGQxLCBxMTEsICMxNiAgICAgICAgICAgICBcbiIKKyAgICAvLyBvcFs0XSArPSAoZDEhPTApCisgICAgInZzdWIuczE2ICAgICAgICBkMSwgZDEsIGQ0ICAgICAgICAgICAgICAgXG4iCisgICAgLy8gb3BbMTJdPSAoZDEqMjIxNyAtIGMxKjUzNTIgKyA1MTAwMCk+PjE2CisgICAgInZzaHJuLnMzMiAgICAgICBkMywgcTEyLCAjMTYgICAgICAgICAgICAgXG4iCisKKyAgICAvLyBzZXQgcmVzdWx0IHRvIG91dCBhcnJheQorICAgICJ2c3QxLjE2ICAgICAgICAge3EwLCBxMX0sIFslW291dF1dICAgXG4iCisgICAgOiBbc3JjX3B0cl0gIityIihzcmNfcHRyKSwgW3JlZl9wdHJdICIrciIocmVmX3B0ciksCisgICAgICBbY29lZmYzMl0gIityIihjb2VmZjMyKSAgICAgICAgICAvLyBtb2RpZmllZCByZWdpc3RlcnMKKyAgICA6IFtrQlBTXSAiciIoa0JQUyksIFtjb2VmZjE2XSAiciIoY29lZmYxNiksCisgICAgICBbb3V0XSAiciIob3V0KSAgICAgICAgICAgICAgICAgICAvLyBjb25zdGFudHMKKyAgICA6ICJtZW1vcnkiLCAicTAiLCAicTEiLCAicTIiLCAicTMiLCAicTQiLCAicTUiLCAicTYiLCAicTciLCAicTgiLCAicTkiLAorICAgICAgInExMCIsICJxMTEiLCAicTEyIiwgInExMyIgICAgICAgLy8gY2xvYmJlcmVkCisgICk7Cit9CisKKyNlbmRpZgorCisjZGVmaW5lIExPQURfTEFORV8xNmIoVkFMVUUsIExBTkUpIGRvIHsgICAgICAgICAgICAgXAorICAoVkFMVUUpID0gdmxkMV9sYW5lX3MxNihzcmMsIChWQUxVRSksIChMQU5FKSk7ICAgIFwKKyAgc3JjICs9IHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBGVHJhbnNmb3JtV0hUX05FT04oY29uc3QgaW50MTZfdCogc3JjLCBpbnQxNl90KiBvdXQpIHsKKyAgY29uc3QgaW50IHN0cmlkZSA9IDE2OworICBjb25zdCBpbnQxNng0X3QgemVybyA9IHZkdXBfbl9zMTYoMCk7CisgIGludDMyeDR4NF90IHRtcDA7CisgIGludDE2eDR4NF90IGluOworICBJTklUX1ZFQ1RPUjQoaW4sIHplcm8sIHplcm8sIHplcm8sIHplcm8pOworICBMT0FEX0xBTkVfMTZiKGluLnZhbFswXSwgMCk7CisgIExPQURfTEFORV8xNmIoaW4udmFsWzFdLCAwKTsKKyAgTE9BRF9MQU5FXzE2Yihpbi52YWxbMl0sIDApOworICBMT0FEX0xBTkVfMTZiKGluLnZhbFszXSwgMCk7CisgIExPQURfTEFORV8xNmIoaW4udmFsWzBdLCAxKTsKKyAgTE9BRF9MQU5FXzE2Yihpbi52YWxbMV0sIDEpOworICBMT0FEX0xBTkVfMTZiKGluLnZhbFsyXSwgMSk7CisgIExPQURfTEFORV8xNmIoaW4udmFsWzNdLCAxKTsKKyAgTE9BRF9MQU5FXzE2Yihpbi52YWxbMF0sIDIpOworICBMT0FEX0xBTkVfMTZiKGluLnZhbFsxXSwgMik7CisgIExPQURfTEFORV8xNmIoaW4udmFsWzJdLCAyKTsKKyAgTE9BRF9MQU5FXzE2Yihpbi52YWxbM10sIDIpOworICBMT0FEX0xBTkVfMTZiKGluLnZhbFswXSwgMyk7CisgIExPQURfTEFORV8xNmIoaW4udmFsWzFdLCAzKTsKKyAgTE9BRF9MQU5FXzE2Yihpbi52YWxbMl0sIDMpOworICBMT0FEX0xBTkVfMTZiKGluLnZhbFszXSwgMyk7CisKKyAgeworICAgIC8vIGEwID0gaW5bMCAqIDE2XSArIGluWzIgKiAxNl0KKyAgICAvLyBhMSA9IGluWzEgKiAxNl0gKyBpblszICogMTZdCisgICAgLy8gYTIgPSBpblsxICogMTZdIC0gaW5bMyAqIDE2XQorICAgIC8vIGEzID0gaW5bMCAqIDE2XSAtIGluWzIgKiAxNl0KKyAgICBjb25zdCBpbnQzMng0X3QgYTAgPSB2YWRkbF9zMTYoaW4udmFsWzBdLCBpbi52YWxbMl0pOworICAgIGNvbnN0IGludDMyeDRfdCBhMSA9IHZhZGRsX3MxNihpbi52YWxbMV0sIGluLnZhbFszXSk7CisgICAgY29uc3QgaW50MzJ4NF90IGEyID0gdnN1YmxfczE2KGluLnZhbFsxXSwgaW4udmFsWzNdKTsKKyAgICBjb25zdCBpbnQzMng0X3QgYTMgPSB2c3VibF9zMTYoaW4udmFsWzBdLCBpbi52YWxbMl0pOworICAgIHRtcDAudmFsWzBdID0gdmFkZHFfczMyKGEwLCBhMSk7CisgICAgdG1wMC52YWxbMV0gPSB2YWRkcV9zMzIoYTMsIGEyKTsKKyAgICB0bXAwLnZhbFsyXSA9IHZzdWJxX3MzMihhMywgYTIpOworICAgIHRtcDAudmFsWzNdID0gdnN1YnFfczMyKGEwLCBhMSk7CisgIH0KKyAgeworICAgIGNvbnN0IGludDMyeDR4NF90IHRtcDEgPSBUcmFuc3Bvc2U0eDRfTkVPTih0bXAwKTsKKyAgICAvLyBhMCA9IHRtcFswICsgaV0gKyB0bXBbIDggKyBpXQorICAgIC8vIGExID0gdG1wWzQgKyBpXSArIHRtcFsxMiArIGldCisgICAgLy8gYTIgPSB0bXBbNCArIGldIC0gdG1wWzEyICsgaV0KKyAgICAvLyBhMyA9IHRtcFswICsgaV0gLSB0bXBbIDggKyBpXQorICAgIGNvbnN0IGludDMyeDRfdCBhMCA9IHZhZGRxX3MzMih0bXAxLnZhbFswXSwgdG1wMS52YWxbMl0pOworICAgIGNvbnN0IGludDMyeDRfdCBhMSA9IHZhZGRxX3MzMih0bXAxLnZhbFsxXSwgdG1wMS52YWxbM10pOworICAgIGNvbnN0IGludDMyeDRfdCBhMiA9IHZzdWJxX3MzMih0bXAxLnZhbFsxXSwgdG1wMS52YWxbM10pOworICAgIGNvbnN0IGludDMyeDRfdCBhMyA9IHZzdWJxX3MzMih0bXAxLnZhbFswXSwgdG1wMS52YWxbMl0pOworICAgIGNvbnN0IGludDMyeDRfdCBiMCA9IHZoYWRkcV9zMzIoYTAsIGExKTsgIC8vIChhMCArIGExKSA+PiAxCisgICAgY29uc3QgaW50MzJ4NF90IGIxID0gdmhhZGRxX3MzMihhMywgYTIpOyAgLy8gKGEzICsgYTIpID4+IDEKKyAgICBjb25zdCBpbnQzMng0X3QgYjIgPSB2aHN1YnFfczMyKGEzLCBhMik7ICAvLyAoYTMgLSBhMikgPj4gMQorICAgIGNvbnN0IGludDMyeDRfdCBiMyA9IHZoc3VicV9zMzIoYTAsIGExKTsgIC8vIChhMCAtIGExKSA+PiAxCisgICAgY29uc3QgaW50MTZ4NF90IG91dDAgPSB2bW92bl9zMzIoYjApOworICAgIGNvbnN0IGludDE2eDRfdCBvdXQxID0gdm1vdm5fczMyKGIxKTsKKyAgICBjb25zdCBpbnQxNng0X3Qgb3V0MiA9IHZtb3ZuX3MzMihiMik7CisgICAgY29uc3QgaW50MTZ4NF90IG91dDMgPSB2bW92bl9zMzIoYjMpOworCisgICAgdnN0MV9zMTYob3V0ICsgIDAsIG91dDApOworICAgIHZzdDFfczE2KG91dCArICA0LCBvdXQxKTsKKyAgICB2c3QxX3MxNihvdXQgKyAgOCwgb3V0Mik7CisgICAgdnN0MV9zMTYob3V0ICsgMTIsIG91dDMpOworICB9Cit9CisjdW5kZWYgTE9BRF9MQU5FXzE2YgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVGV4dHVyZSBkaXN0b3J0aW9uCisvLworLy8gV2UgdHJ5IHRvIG1hdGNoIHRoZSBzcGVjdHJhbCBjb250ZW50ICh3ZWlnaHRlZCkgYmV0d2VlbiBzb3VyY2UgYW5kCisvLyByZWNvbnN0cnVjdGVkIHNhbXBsZXMuCisKKy8vIGEgMDEyMywgYiAwMTIzCisvLyBhIDQ1NjcsIGIgNDU2NworLy8gYSA4OWFiLCBiIDg5YWIKKy8vIGEgY2RlZiwgYiBjZGVmCisvLworLy8gdHJhbnNwb3NlCisvLworLy8gYSAwNDhjLCBiIDA0OGMKKy8vIGEgMTU5ZCwgYiAxNTlkCisvLyBhIDI2YWUsIGIgMjZhZQorLy8gYSAzN2JmLCBiIDM3YmYKKy8vCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50MTZ4OHg0X3QgRGlzdG9UcmFuc3Bvc2U0eDRTMTZfTkVPTihpbnQxNng4eDRfdCBxNF9pbikgeworICBjb25zdCBpbnQxNng4eDJfdCBxMl90bXAwID0gdnRybnFfczE2KHE0X2luLnZhbFswXSwgcTRfaW4udmFsWzFdKTsKKyAgY29uc3QgaW50MTZ4OHgyX3QgcTJfdG1wMSA9IHZ0cm5xX3MxNihxNF9pbi52YWxbMl0sIHE0X2luLnZhbFszXSk7CisgIGNvbnN0IGludDMyeDR4Ml90IHEyX3RtcDIgPSB2dHJucV9zMzIodnJlaW50ZXJwcmV0cV9zMzJfczE2KHEyX3RtcDAudmFsWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cmVpbnRlcnByZXRxX3MzMl9zMTYocTJfdG1wMS52YWxbMF0pKTsKKyAgY29uc3QgaW50MzJ4NHgyX3QgcTJfdG1wMyA9IHZ0cm5xX3MzMih2cmVpbnRlcnByZXRxX3MzMl9zMTYocTJfdG1wMC52YWxbMV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZyZWludGVycHJldHFfczMyX3MxNihxMl90bXAxLnZhbFsxXSkpOworICBxNF9pbi52YWxbMF0gPSB2cmVpbnRlcnByZXRxX3MxNl9zMzIocTJfdG1wMi52YWxbMF0pOworICBxNF9pbi52YWxbMl0gPSB2cmVpbnRlcnByZXRxX3MxNl9zMzIocTJfdG1wMi52YWxbMV0pOworICBxNF9pbi52YWxbMV0gPSB2cmVpbnRlcnByZXRxX3MxNl9zMzIocTJfdG1wMy52YWxbMF0pOworICBxNF9pbi52YWxbM10gPSB2cmVpbnRlcnByZXRxX3MxNl9zMzIocTJfdG1wMy52YWxbMV0pOworICByZXR1cm4gcTRfaW47Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQxNng4eDRfdCBEaXN0b0hvcml6b250YWxQYXNzX05FT04oCisgICAgY29uc3QgaW50MTZ4OHg0X3QgcTRfaW4pIHsKKyAgLy8ge2EwLCBhMX0gPSB7aW5bMF0gKyBpblsyXSwgaW5bMV0gKyBpblszXX0KKyAgLy8ge2EzLCBhMn0gPSB7aW5bMF0gLSBpblsyXSwgaW5bMV0gLSBpblszXX0KKyAgY29uc3QgaW50MTZ4OF90IHFfYTAgPSB2YWRkcV9zMTYocTRfaW4udmFsWzBdLCBxNF9pbi52YWxbMl0pOworICBjb25zdCBpbnQxNng4X3QgcV9hMSA9IHZhZGRxX3MxNihxNF9pbi52YWxbMV0sIHE0X2luLnZhbFszXSk7CisgIGNvbnN0IGludDE2eDhfdCBxX2EzID0gdnN1YnFfczE2KHE0X2luLnZhbFswXSwgcTRfaW4udmFsWzJdKTsKKyAgY29uc3QgaW50MTZ4OF90IHFfYTIgPSB2c3VicV9zMTYocTRfaW4udmFsWzFdLCBxNF9pbi52YWxbM10pOworICBpbnQxNng4eDRfdCBxNF9vdXQ7CisgIC8vIHRtcFswXSA9IGEwICsgYTEKKyAgLy8gdG1wWzFdID0gYTMgKyBhMgorICAvLyB0bXBbMl0gPSBhMyAtIGEyCisgIC8vIHRtcFszXSA9IGEwIC0gYTEKKyAgSU5JVF9WRUNUT1I0KHE0X291dCwKKyAgICAgICAgICAgICAgIHZhYnNxX3MxNih2YWRkcV9zMTYocV9hMCwgcV9hMSkpLAorICAgICAgICAgICAgICAgdmFic3FfczE2KHZhZGRxX3MxNihxX2EzLCBxX2EyKSksCisgICAgICAgICAgICAgICB2YWJkcV9zMTYocV9hMywgcV9hMiksIHZhYmRxX3MxNihxX2EwLCBxX2ExKSk7CisgIHJldHVybiBxNF9vdXQ7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQxNng4eDRfdCBEaXN0b1ZlcnRpY2FsUGFzc19ORU9OKGNvbnN0IHVpbnQ4eDh4NF90IHE0X2luKSB7CisgIGNvbnN0IGludDE2eDhfdCBxX2EwID0gdnJlaW50ZXJwcmV0cV9zMTZfdTE2KHZhZGRsX3U4KHE0X2luLnZhbFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcTRfaW4udmFsWzJdKSk7CisgIGNvbnN0IGludDE2eDhfdCBxX2ExID0gdnJlaW50ZXJwcmV0cV9zMTZfdTE2KHZhZGRsX3U4KHE0X2luLnZhbFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcTRfaW4udmFsWzNdKSk7CisgIGNvbnN0IGludDE2eDhfdCBxX2EyID0gdnJlaW50ZXJwcmV0cV9zMTZfdTE2KHZzdWJsX3U4KHE0X2luLnZhbFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcTRfaW4udmFsWzNdKSk7CisgIGNvbnN0IGludDE2eDhfdCBxX2EzID0gdnJlaW50ZXJwcmV0cV9zMTZfdTE2KHZzdWJsX3U4KHE0X2luLnZhbFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcTRfaW4udmFsWzJdKSk7CisgIGludDE2eDh4NF90IHE0X291dDsKKworICBJTklUX1ZFQ1RPUjQocTRfb3V0LAorICAgICAgICAgICAgICAgdmFkZHFfczE2KHFfYTAsIHFfYTEpLCB2YWRkcV9zMTYocV9hMywgcV9hMiksCisgICAgICAgICAgICAgICB2c3VicV9zMTYocV9hMywgcV9hMiksIHZzdWJxX3MxNihxX2EwLCBxX2ExKSk7CisgIHJldHVybiBxNF9vdXQ7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQxNng0eDRfdCBEaXN0b0xvYWRXX05FT04oY29uc3QgdWludDE2X3QqIHcpIHsKKyAgY29uc3QgdWludDE2eDhfdCBxX3cwNyA9IHZsZDFxX3UxNigmd1swXSk7CisgIGNvbnN0IHVpbnQxNng4X3QgcV93OGYgPSB2bGQxcV91MTYoJndbOF0pOworICBpbnQxNng0eDRfdCBkNF93OworICBJTklUX1ZFQ1RPUjQoZDRfdywKKyAgICAgICAgICAgICAgIHZnZXRfbG93X3MxNih2cmVpbnRlcnByZXRxX3MxNl91MTYocV93MDcpKSwKKyAgICAgICAgICAgICAgIHZnZXRfaGlnaF9zMTYodnJlaW50ZXJwcmV0cV9zMTZfdTE2KHFfdzA3KSksCisgICAgICAgICAgICAgICB2Z2V0X2xvd19zMTYodnJlaW50ZXJwcmV0cV9zMTZfdTE2KHFfdzhmKSksCisgICAgICAgICAgICAgICB2Z2V0X2hpZ2hfczE2KHZyZWludGVycHJldHFfczE2X3UxNihxX3c4ZikpKTsKKyAgcmV0dXJuIGQ0X3c7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQzMngyX3QgRGlzdG9TdW1fTkVPTihjb25zdCBpbnQxNng4eDRfdCBxNF9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNng0eDRfdCBkNF93KSB7CisgIGludDMyeDJfdCBkX3N1bTsKKyAgLy8gc3VtICs9IHdbIDBdICogYWJzKGIwKTsKKyAgLy8gc3VtICs9IHdbIDRdICogYWJzKGIxKTsKKyAgLy8gc3VtICs9IHdbIDhdICogYWJzKGIyKTsKKyAgLy8gc3VtICs9IHdbMTJdICogYWJzKGIzKTsKKyAgaW50MzJ4NF90IHFfc3VtMCA9IHZtdWxsX3MxNihkNF93LnZhbFswXSwgdmdldF9sb3dfczE2KHE0X2luLnZhbFswXSkpOworICBpbnQzMng0X3QgcV9zdW0xID0gdm11bGxfczE2KGQ0X3cudmFsWzFdLCB2Z2V0X2xvd19zMTYocTRfaW4udmFsWzFdKSk7CisgIGludDMyeDRfdCBxX3N1bTIgPSB2bXVsbF9zMTYoZDRfdy52YWxbMl0sIHZnZXRfbG93X3MxNihxNF9pbi52YWxbMl0pKTsKKyAgaW50MzJ4NF90IHFfc3VtMyA9IHZtdWxsX3MxNihkNF93LnZhbFszXSwgdmdldF9sb3dfczE2KHE0X2luLnZhbFszXSkpOworICBxX3N1bTAgPSB2bWxzbF9zMTYocV9zdW0wLCBkNF93LnZhbFswXSwgdmdldF9oaWdoX3MxNihxNF9pbi52YWxbMF0pKTsKKyAgcV9zdW0xID0gdm1sc2xfczE2KHFfc3VtMSwgZDRfdy52YWxbMV0sIHZnZXRfaGlnaF9zMTYocTRfaW4udmFsWzFdKSk7CisgIHFfc3VtMiA9IHZtbHNsX3MxNihxX3N1bTIsIGQ0X3cudmFsWzJdLCB2Z2V0X2hpZ2hfczE2KHE0X2luLnZhbFsyXSkpOworICBxX3N1bTMgPSB2bWxzbF9zMTYocV9zdW0zLCBkNF93LnZhbFszXSwgdmdldF9oaWdoX3MxNihxNF9pbi52YWxbM10pKTsKKworICBxX3N1bTAgPSB2YWRkcV9zMzIocV9zdW0wLCBxX3N1bTEpOworICBxX3N1bTIgPSB2YWRkcV9zMzIocV9zdW0yLCBxX3N1bTMpOworICBxX3N1bTIgPSB2YWRkcV9zMzIocV9zdW0wLCBxX3N1bTIpOworICBkX3N1bSA9IHZwYWRkX3MzMih2Z2V0X2xvd19zMzIocV9zdW0yKSwgdmdldF9oaWdoX3MzMihxX3N1bTIpKTsKKyAgZF9zdW0gPSB2cGFkZF9zMzIoZF9zdW0sIGRfc3VtKTsKKyAgcmV0dXJuIGRfc3VtOworfQorCisjZGVmaW5lIExPQURfTEFORV8zMmIoc3JjLCBWQUxVRSwgTEFORSkgXAorICAgIChWQUxVRSkgPSB2bGQxX2xhbmVfdTMyKChjb25zdCB1aW50MzJfdCopKHNyYyksIChWQUxVRSksIChMQU5FKSkKKworLy8gSGFkYW1hcmQgdHJhbnNmb3JtCisvLyBSZXR1cm5zIHRoZSB3ZWlnaHRlZCBzdW0gb2YgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cy4KKy8vIHdbXSBjb250YWlucyBhIHJvdy1tYWpvciA0IGJ5IDQgc3ltbWV0cmljIG1hdHJpeC4KK3N0YXRpYyBpbnQgRGlzdG80eDRfTkVPTihjb25zdCB1aW50OF90KiBjb25zdCBhLCBjb25zdCB1aW50OF90KiBjb25zdCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90KiBjb25zdCB3KSB7CisgIHVpbnQzMngyX3QgZF9pbl9hYl8wMTIzID0gdmR1cF9uX3UzMigwKTsKKyAgdWludDMyeDJfdCBkX2luX2FiXzQ1NjcgPSB2ZHVwX25fdTMyKDApOworICB1aW50MzJ4Ml90IGRfaW5fYWJfODlhYiA9IHZkdXBfbl91MzIoMCk7CisgIHVpbnQzMngyX3QgZF9pbl9hYl9jZGVmID0gdmR1cF9uX3UzMigwKTsKKyAgdWludDh4OHg0X3QgZDRfaW47CisKKyAgLy8gbG9hZCBkYXRhIGEsIGIKKyAgTE9BRF9MQU5FXzMyYihhICsgMCAqIEJQUywgZF9pbl9hYl8wMTIzLCAwKTsKKyAgTE9BRF9MQU5FXzMyYihhICsgMSAqIEJQUywgZF9pbl9hYl80NTY3LCAwKTsKKyAgTE9BRF9MQU5FXzMyYihhICsgMiAqIEJQUywgZF9pbl9hYl84OWFiLCAwKTsKKyAgTE9BRF9MQU5FXzMyYihhICsgMyAqIEJQUywgZF9pbl9hYl9jZGVmLCAwKTsKKyAgTE9BRF9MQU5FXzMyYihiICsgMCAqIEJQUywgZF9pbl9hYl8wMTIzLCAxKTsKKyAgTE9BRF9MQU5FXzMyYihiICsgMSAqIEJQUywgZF9pbl9hYl80NTY3LCAxKTsKKyAgTE9BRF9MQU5FXzMyYihiICsgMiAqIEJQUywgZF9pbl9hYl84OWFiLCAxKTsKKyAgTE9BRF9MQU5FXzMyYihiICsgMyAqIEJQUywgZF9pbl9hYl9jZGVmLCAxKTsKKyAgSU5JVF9WRUNUT1I0KGQ0X2luLAorICAgICAgICAgICAgICAgdnJlaW50ZXJwcmV0X3U4X3UzMihkX2luX2FiXzAxMjMpLAorICAgICAgICAgICAgICAgdnJlaW50ZXJwcmV0X3U4X3UzMihkX2luX2FiXzQ1NjcpLAorICAgICAgICAgICAgICAgdnJlaW50ZXJwcmV0X3U4X3UzMihkX2luX2FiXzg5YWIpLAorICAgICAgICAgICAgICAgdnJlaW50ZXJwcmV0X3U4X3UzMihkX2luX2FiX2NkZWYpKTsKKworICB7CisgICAgLy8gVmVydGljYWwgcGFzcyBmaXJzdCB0byBhdm9pZCBhIHRyYW5zcG9zZSAodmVydGljYWwgYW5kIGhvcml6b250YWwgcGFzc2VzCisgICAgLy8gYXJlIGNvbW11dGF0aXZlIGJlY2F1c2Ugdy9rV2VpZ2h0WSBpcyBzeW1tZXRyaWMpIGFuZCBzdWJzZXF1ZW50CisgICAgLy8gdHJhbnNwb3NlLgorICAgIGNvbnN0IGludDE2eDh4NF90IHE0X3YgPSBEaXN0b1ZlcnRpY2FsUGFzc19ORU9OKGQ0X2luKTsKKyAgICBjb25zdCBpbnQxNng0eDRfdCBkNF93ID0gRGlzdG9Mb2FkV19ORU9OKHcpOworICAgIC8vIGhvcml6b250YWwgcGFzcworICAgIGNvbnN0IGludDE2eDh4NF90IHE0X3QgPSBEaXN0b1RyYW5zcG9zZTR4NFMxNl9ORU9OKHE0X3YpOworICAgIGNvbnN0IGludDE2eDh4NF90IHE0X2ggPSBEaXN0b0hvcml6b250YWxQYXNzX05FT04ocTRfdCk7CisgICAgaW50MzJ4Ml90IGRfc3VtID0gRGlzdG9TdW1fTkVPTihxNF9oLCBkNF93KTsKKworICAgIC8vIGFicyhzdW0yIC0gc3VtMSkgPj4gNQorICAgIGRfc3VtID0gdmFic19zMzIoZF9zdW0pOworICAgIGRfc3VtID0gdnNocl9uX3MzMihkX3N1bSwgNSk7CisgICAgcmV0dXJuIHZnZXRfbGFuZV9zMzIoZF9zdW0sIDApOworICB9Cit9CisjdW5kZWYgTE9BRF9MQU5FXzMyYgorCitzdGF0aWMgaW50IERpc3RvMTZ4MTZfTkVPTihjb25zdCB1aW50OF90KiBjb25zdCBhLCBjb25zdCB1aW50OF90KiBjb25zdCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QqIGNvbnN0IHcpIHsKKyAgaW50IEQgPSAwOworICBpbnQgeCwgeTsKKyAgZm9yICh5ID0gMDsgeSA8IDE2ICogQlBTOyB5ICs9IDQgKiBCUFMpIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgMTY7IHggKz0gNCkgeworICAgICAgRCArPSBEaXN0bzR4NF9ORU9OKGEgKyB4ICsgeSwgYiArIHggKyB5LCB3KTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIENvbGxlY3RIaXN0b2dyYW1fTkVPTihjb25zdCB1aW50OF90KiByZWYsIGNvbnN0IHVpbnQ4X3QqIHByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X2Jsb2NrLCBpbnQgZW5kX2Jsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEhpc3RvZ3JhbSogY29uc3QgaGlzdG8pIHsKKyAgY29uc3QgdWludDE2eDhfdCBtYXhfY29lZmZfdGhyZXNoID0gdmR1cHFfbl91MTYoTUFYX0NPRUZGX1RIUkVTSCk7CisgIGludCBqOworICBpbnQgZGlzdHJpYnV0aW9uW01BWF9DT0VGRl9USFJFU0ggKyAxXSA9IHsgMCB9OworICBmb3IgKGogPSBzdGFydF9ibG9jazsgaiA8IGVuZF9ibG9jazsgKytqKSB7CisgICAgaW50MTZfdCBvdXRbMTZdOworICAgIEZUcmFuc2Zvcm1fTkVPTihyZWYgKyBWUDhEc3BTY2FuW2pdLCBwcmVkICsgVlA4RHNwU2NhbltqXSwgb3V0KTsKKyAgICB7CisgICAgICBpbnQgazsKKyAgICAgIGNvbnN0IGludDE2eDhfdCBhMCA9IHZsZDFxX3MxNihvdXQgKyAwKTsKKyAgICAgIGNvbnN0IGludDE2eDhfdCBiMCA9IHZsZDFxX3MxNihvdXQgKyA4KTsKKyAgICAgIGNvbnN0IHVpbnQxNng4X3QgYTEgPSB2cmVpbnRlcnByZXRxX3UxNl9zMTYodmFic3FfczE2KGEwKSk7CisgICAgICBjb25zdCB1aW50MTZ4OF90IGIxID0gdnJlaW50ZXJwcmV0cV91MTZfczE2KHZhYnNxX3MxNihiMCkpOworICAgICAgY29uc3QgdWludDE2eDhfdCBhMiA9IHZzaHJxX25fdTE2KGExLCAzKTsKKyAgICAgIGNvbnN0IHVpbnQxNng4X3QgYjIgPSB2c2hycV9uX3UxNihiMSwgMyk7CisgICAgICBjb25zdCB1aW50MTZ4OF90IGEzID0gdm1pbnFfdTE2KGEyLCBtYXhfY29lZmZfdGhyZXNoKTsKKyAgICAgIGNvbnN0IHVpbnQxNng4X3QgYjMgPSB2bWlucV91MTYoYjIsIG1heF9jb2VmZl90aHJlc2gpOworICAgICAgdnN0MXFfczE2KG91dCArIDAsIHZyZWludGVycHJldHFfczE2X3UxNihhMykpOworICAgICAgdnN0MXFfczE2KG91dCArIDgsIHZyZWludGVycHJldHFfczE2X3UxNihiMykpOworICAgICAgLy8gQ29udmVydCBjb2VmZmljaWVudHMgdG8gYmluLgorICAgICAgZm9yIChrID0gMDsgayA8IDE2OyArK2spIHsKKyAgICAgICAgKytkaXN0cmlidXRpb25bb3V0W2tdXTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgVlA4U2V0SGlzdG9ncmFtRGF0YShkaXN0cmlidXRpb24sIGhpc3RvKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgQWNjdW11bGF0ZVNTRTE2X05FT04oY29uc3QgdWludDhfdCogY29uc3QgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJ4NF90KiBjb25zdCBzdW0pIHsKKyAgY29uc3QgdWludDh4MTZfdCBhMCA9IHZsZDFxX3U4KGEpOworICBjb25zdCB1aW50OHgxNl90IGIwID0gdmxkMXFfdTgoYik7CisgIGNvbnN0IHVpbnQ4eDE2X3QgYWJzX2RpZmYgPSB2YWJkcV91OChhMCwgYjApOworICBjb25zdCB1aW50MTZ4OF90IHByb2QxID0gdm11bGxfdTgodmdldF9sb3dfdTgoYWJzX2RpZmYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmdldF9sb3dfdTgoYWJzX2RpZmYpKTsKKyAgY29uc3QgdWludDE2eDhfdCBwcm9kMiA9IHZtdWxsX3U4KHZnZXRfaGlnaF91OChhYnNfZGlmZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Z2V0X2hpZ2hfdTgoYWJzX2RpZmYpKTsKKyAgLyogcGFpci13aXNlIGFkZHMgYW5kIHdpZGVuICovCisgIGNvbnN0IHVpbnQzMng0X3Qgc3VtMSA9IHZwYWRkbHFfdTE2KHByb2QxKTsKKyAgY29uc3QgdWludDMyeDRfdCBzdW0yID0gdnBhZGRscV91MTYocHJvZDIpOworICAqc3VtID0gdmFkZHFfdTMyKCpzdW0sIHZhZGRxX3UzMihzdW0xLCBzdW0yKSk7Cit9CisKKy8vIEhvcml6b250YWwgc3VtIG9mIGFsbCBmb3VyIHVpbnQzMl90IHZhbHVlcyBpbiAnc3VtJy4KK3N0YXRpYyBpbnQgU3VtVG9JbnRfTkVPTih1aW50MzJ4NF90IHN1bSkgeworICBjb25zdCB1aW50NjR4Ml90IHN1bTIgPSB2cGFkZGxxX3UzMihzdW0pOworICBjb25zdCB1aW50NjRfdCBzdW0zID0gdmdldHFfbGFuZV91NjQoc3VtMiwgMCkgKyB2Z2V0cV9sYW5lX3U2NChzdW0yLCAxKTsKKyAgcmV0dXJuIChpbnQpc3VtMzsKK30KKworc3RhdGljIGludCBTU0UxNngxNl9ORU9OKGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIpIHsKKyAgdWludDMyeDRfdCBzdW0gPSB2ZHVwcV9uX3UzMigwKTsKKyAgaW50IHk7CisgIGZvciAoeSA9IDA7IHkgPCAxNjsgKyt5KSB7CisgICAgQWNjdW11bGF0ZVNTRTE2X05FT04oYSArIHkgKiBCUFMsIGIgKyB5ICogQlBTLCAmc3VtKTsKKyAgfQorICByZXR1cm4gU3VtVG9JbnRfTkVPTihzdW0pOworfQorCitzdGF0aWMgaW50IFNTRTE2eDhfTkVPTihjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiBiKSB7CisgIHVpbnQzMng0X3Qgc3VtID0gdmR1cHFfbl91MzIoMCk7CisgIGludCB5OworICBmb3IgKHkgPSAwOyB5IDwgODsgKyt5KSB7CisgICAgQWNjdW11bGF0ZVNTRTE2X05FT04oYSArIHkgKiBCUFMsIGIgKyB5ICogQlBTLCAmc3VtKTsKKyAgfQorICByZXR1cm4gU3VtVG9JbnRfTkVPTihzdW0pOworfQorCitzdGF0aWMgaW50IFNTRTh4OF9ORU9OKGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIpIHsKKyAgdWludDMyeDRfdCBzdW0gPSB2ZHVwcV9uX3UzMigwKTsKKyAgaW50IHk7CisgIGZvciAoeSA9IDA7IHkgPCA4OyArK3kpIHsKKyAgICBjb25zdCB1aW50OHg4X3QgYTAgPSB2bGQxX3U4KGEgKyB5ICogQlBTKTsKKyAgICBjb25zdCB1aW50OHg4X3QgYjAgPSB2bGQxX3U4KGIgKyB5ICogQlBTKTsKKyAgICBjb25zdCB1aW50OHg4X3QgYWJzX2RpZmYgPSB2YWJkX3U4KGEwLCBiMCk7CisgICAgY29uc3QgdWludDE2eDhfdCBwcm9kID0gdm11bGxfdTgoYWJzX2RpZmYsIGFic19kaWZmKTsKKyAgICBzdW0gPSB2cGFkYWxxX3UxNihzdW0sIHByb2QpOworICB9CisgIHJldHVybiBTdW1Ub0ludF9ORU9OKHN1bSk7Cit9CisKK3N0YXRpYyBpbnQgU1NFNHg0X05FT04oY29uc3QgdWludDhfdCogYSwgY29uc3QgdWludDhfdCogYikgeworICBjb25zdCB1aW50OHgxNl90IGEwID0gTG9hZDR4NF9ORU9OKGEpOworICBjb25zdCB1aW50OHgxNl90IGIwID0gTG9hZDR4NF9ORU9OKGIpOworICBjb25zdCB1aW50OHgxNl90IGFic19kaWZmID0gdmFiZHFfdTgoYTAsIGIwKTsKKyAgY29uc3QgdWludDE2eDhfdCBwcm9kMSA9IHZtdWxsX3U4KHZnZXRfbG93X3U4KGFic19kaWZmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZnZXRfbG93X3U4KGFic19kaWZmKSk7CisgIGNvbnN0IHVpbnQxNng4X3QgcHJvZDIgPSB2bXVsbF91OCh2Z2V0X2hpZ2hfdTgoYWJzX2RpZmYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmdldF9oaWdoX3U4KGFic19kaWZmKSk7CisgIC8qIHBhaXItd2lzZSBhZGRzIGFuZCB3aWRlbiAqLworICBjb25zdCB1aW50MzJ4NF90IHN1bTEgPSB2cGFkZGxxX3UxNihwcm9kMSk7CisgIGNvbnN0IHVpbnQzMng0X3Qgc3VtMiA9IHZwYWRkbHFfdTE2KHByb2QyKTsKKyAgcmV0dXJuIFN1bVRvSW50X05FT04odmFkZHFfdTMyKHN1bTEsIHN1bTIpKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gQ29tcGlsYXRpb24gd2l0aCBnY2MtNC42LnggaXMgcHJvYmxlbWF0aWMgZm9yIG5vdy4KKyNpZiAhZGVmaW5lZChXT1JLX0FST1VORF9HQ0MpCisKK3N0YXRpYyBpbnQxNng4X3QgUXVhbnRpemVfTkVPTihpbnQxNl90KiBjb25zdCBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhNYXRyaXgqIGNvbnN0IG10eCwgaW50IG9mZnNldCkgeworICBjb25zdCB1aW50MTZ4OF90IHNoYXJwID0gdmxkMXFfdTE2KCZtdHgtPnNoYXJwZW5fW29mZnNldF0pOworICBjb25zdCB1aW50MTZ4OF90IHEgPSB2bGQxcV91MTYoJm10eC0+cV9bb2Zmc2V0XSk7CisgIGNvbnN0IHVpbnQxNng4X3QgaXEgPSB2bGQxcV91MTYoJm10eC0+aXFfW29mZnNldF0pOworICBjb25zdCB1aW50MzJ4NF90IGJpYXMwID0gdmxkMXFfdTMyKCZtdHgtPmJpYXNfW29mZnNldCArIDBdKTsKKyAgY29uc3QgdWludDMyeDRfdCBiaWFzMSA9IHZsZDFxX3UzMigmbXR4LT5iaWFzX1tvZmZzZXQgKyA0XSk7CisKKyAgY29uc3QgaW50MTZ4OF90IGEgPSB2bGQxcV9zMTYoaW4gKyBvZmZzZXQpOyAgICAgICAgICAgICAgICAvLyBpbgorICBjb25zdCB1aW50MTZ4OF90IGIgPSB2cmVpbnRlcnByZXRxX3UxNl9zMTYodmFic3FfczE2KGEpKTsgIC8vIGNvZWZmID0gYWJzKGluKQorICBjb25zdCBpbnQxNng4X3Qgc2lnbiA9IHZzaHJxX25fczE2KGEsIDE1KTsgICAgICAgICAgICAgICAgIC8vIHNpZ24KKyAgY29uc3QgdWludDE2eDhfdCBjID0gdmFkZHFfdTE2KGIsIHNoYXJwKTsgICAgICAgICAgICAgICAgICAvLyArIHNoYXJwZW4KKyAgY29uc3QgdWludDMyeDRfdCBtMCA9IHZtdWxsX3UxNih2Z2V0X2xvd191MTYoYyksIHZnZXRfbG93X3UxNihpcSkpOworICBjb25zdCB1aW50MzJ4NF90IG0xID0gdm11bGxfdTE2KHZnZXRfaGlnaF91MTYoYyksIHZnZXRfaGlnaF91MTYoaXEpKTsKKyAgY29uc3QgdWludDMyeDRfdCBtMiA9IHZoYWRkcV91MzIobTAsIGJpYXMwKTsKKyAgY29uc3QgdWludDMyeDRfdCBtMyA9IHZoYWRkcV91MzIobTEsIGJpYXMxKTsgICAgIC8vIChjb2VmZiAqIGlRICsgYmlhcykgPj4gMQorICBjb25zdCB1aW50MTZ4OF90IGMwID0gdmNvbWJpbmVfdTE2KHZzaHJuX25fdTMyKG0yLCAxNiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnNocm5fbl91MzIobTMsIDE2KSk7ICAgLy8gUUZJWD0xNyA9IDE2KzEKKyAgY29uc3QgdWludDE2eDhfdCBjMSA9IHZtaW5xX3UxNihjMCwgdmR1cHFfbl91MTYoTUFYX0xFVkVMKSk7CisgIGNvbnN0IGludDE2eDhfdCBjMiA9IHZlb3JxX3MxNih2cmVpbnRlcnByZXRxX3MxNl91MTYoYzEpLCBzaWduKTsKKyAgY29uc3QgaW50MTZ4OF90IGMzID0gdnN1YnFfczE2KGMyLCBzaWduKTsgICAgICAgICAgICAgICAgICAvLyByZXN0b3JlIHNpZ24KKyAgY29uc3QgaW50MTZ4OF90IGM0ID0gdm11bHFfczE2KGMzLCB2cmVpbnRlcnByZXRxX3MxNl91MTYocSkpOworICB2c3QxcV9zMTYoaW4gKyBvZmZzZXQsIGM0KTsKKyAgYXNzZXJ0KFFGSVggPT0gMTcpOyAgLy8gdGhpcyBmdW5jdGlvbiBjYW4ndCB3b3JrIGFzIGlzIGlmIFFGSVggIT0gMTYrMQorICByZXR1cm4gYzM7Cit9CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGtTaHVmZmxlc1s0XVs4XSA9IHsKKyAgeyAwLCAgIDEsICAyLCAgMywgIDgsICA5LCAxNiwgMTcgfSwKKyAgeyAxMCwgMTEsICA0LCAgNSwgIDYsICA3LCAxMiwgMTMgfSwKKyAgeyAxOCwgMTksIDI0LCAyNSwgMjYsIDI3LCAyMCwgMjEgfSwKKyAgeyAxNCwgMTUsIDIyLCAyMywgMjgsIDI5LCAzMCwgMzEgfQorfTsKKworc3RhdGljIGludCBRdWFudGl6ZUJsb2NrX05FT04oaW50MTZfdCBpblsxNl0sIGludDE2X3Qgb3V0WzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOE1hdHJpeCogY29uc3QgbXR4KSB7CisgIGNvbnN0IGludDE2eDhfdCBvdXQwID0gUXVhbnRpemVfTkVPTihpbiwgbXR4LCAwKTsKKyAgY29uc3QgaW50MTZ4OF90IG91dDEgPSBRdWFudGl6ZV9ORU9OKGluLCBtdHgsIDgpOworICB1aW50OHg4eDRfdCBzaHVmZmxlczsKKyAgLy8gdnRibD9fdTggYXJlIG1hcmtlZCB1bmF2YWlsYWJsZSBmb3IgaU9TIGFybTY0IHdpdGggWGNvZGUgPCA2LjMsIHVzZQorICAvLyBub24tc3RhbmRhcmQgdmVyc2lvbnMgdGhlcmUuCisjaWYgZGVmaW5lZChfX0FQUExFX18pICYmIGRlZmluZWQoX19hYXJjaDY0X18pICYmIFwKKyAgICBkZWZpbmVkKF9fYXBwbGVfYnVpbGRfdmVyc2lvbl9fKSAmJiAoX19hcHBsZV9idWlsZF92ZXJzaW9uX188IDYwMjAwMzcpCisgIHVpbnQ4eDE2eDJfdCBhbGxfb3V0OworICBJTklUX1ZFQ1RPUjIoYWxsX291dCwgdnJlaW50ZXJwcmV0cV91OF9zMTYob3V0MCksIHZyZWludGVycHJldHFfdThfczE2KG91dDEpKTsKKyAgSU5JVF9WRUNUT1I0KHNodWZmbGVzLAorICAgICAgICAgICAgICAgdnRibDJxX3U4KGFsbF9vdXQsIHZsZDFfdTgoa1NodWZmbGVzWzBdKSksCisgICAgICAgICAgICAgICB2dGJsMnFfdTgoYWxsX291dCwgdmxkMV91OChrU2h1ZmZsZXNbMV0pKSwKKyAgICAgICAgICAgICAgIHZ0YmwycV91OChhbGxfb3V0LCB2bGQxX3U4KGtTaHVmZmxlc1syXSkpLAorICAgICAgICAgICAgICAgdnRibDJxX3U4KGFsbF9vdXQsIHZsZDFfdTgoa1NodWZmbGVzWzNdKSkpOworI2Vsc2UKKyAgdWludDh4OHg0X3QgYWxsX291dDsKKyAgSU5JVF9WRUNUT1I0KGFsbF9vdXQsCisgICAgICAgICAgICAgICB2cmVpbnRlcnByZXRfdThfczE2KHZnZXRfbG93X3MxNihvdXQwKSksCisgICAgICAgICAgICAgICB2cmVpbnRlcnByZXRfdThfczE2KHZnZXRfaGlnaF9zMTYob3V0MCkpLAorICAgICAgICAgICAgICAgdnJlaW50ZXJwcmV0X3U4X3MxNih2Z2V0X2xvd19zMTYob3V0MSkpLAorICAgICAgICAgICAgICAgdnJlaW50ZXJwcmV0X3U4X3MxNih2Z2V0X2hpZ2hfczE2KG91dDEpKSk7CisgIElOSVRfVkVDVE9SNChzaHVmZmxlcywKKyAgICAgICAgICAgICAgIHZ0Ymw0X3U4KGFsbF9vdXQsIHZsZDFfdTgoa1NodWZmbGVzWzBdKSksCisgICAgICAgICAgICAgICB2dGJsNF91OChhbGxfb3V0LCB2bGQxX3U4KGtTaHVmZmxlc1sxXSkpLAorICAgICAgICAgICAgICAgdnRibDRfdTgoYWxsX291dCwgdmxkMV91OChrU2h1ZmZsZXNbMl0pKSwKKyAgICAgICAgICAgICAgIHZ0Ymw0X3U4KGFsbF9vdXQsIHZsZDFfdTgoa1NodWZmbGVzWzNdKSkpOworI2VuZGlmCisgIC8vIFppZ3phZyByZW9yZGVyaW5nCisgIHZzdDFfdTgoKHVpbnQ4X3QqKShvdXQgKyAgMCksIHNodWZmbGVzLnZhbFswXSk7CisgIHZzdDFfdTgoKHVpbnQ4X3QqKShvdXQgKyAgNCksIHNodWZmbGVzLnZhbFsxXSk7CisgIHZzdDFfdTgoKHVpbnQ4X3QqKShvdXQgKyAgOCksIHNodWZmbGVzLnZhbFsyXSk7CisgIHZzdDFfdTgoKHVpbnQ4X3QqKShvdXQgKyAxMiksIHNodWZmbGVzLnZhbFszXSk7CisgIC8vIHRlc3QgemVyb3MKKyAgaWYgKCoodWludDY0X3QqKShvdXQgKyAgMCkgIT0gMCkgcmV0dXJuIDE7CisgIGlmICgqKHVpbnQ2NF90Kikob3V0ICsgIDQpICE9IDApIHJldHVybiAxOworICBpZiAoKih1aW50NjRfdCopKG91dCArICA4KSAhPSAwKSByZXR1cm4gMTsKKyAgaWYgKCoodWludDY0X3QqKShvdXQgKyAxMikgIT0gMCkgcmV0dXJuIDE7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IFF1YW50aXplMkJsb2Nrc19ORU9OKGludDE2X3QgaW5bMzJdLCBpbnQxNl90IG91dFszMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOE1hdHJpeCogY29uc3QgbXR4KSB7CisgIGludCBuejsKKyAgbnogID0gUXVhbnRpemVCbG9ja19ORU9OKGluICsgMCAqIDE2LCBvdXQgKyAwICogMTYsIG10eCkgPDwgMDsKKyAgbnogfD0gUXVhbnRpemVCbG9ja19ORU9OKGluICsgMSAqIDE2LCBvdXQgKyAxICogMTYsIG10eCkgPDwgMTsKKyAgcmV0dXJuIG56OworfQorCisjZW5kaWYgICAvLyAhV09SS19BUk9VTkRfR0NDCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBWUDhFbmNEc3BJbml0TkVPTih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFZQOEVuY0RzcEluaXRORU9OKHZvaWQpIHsKKyAgVlA4SVRyYW5zZm9ybSA9IElUcmFuc2Zvcm1fTkVPTjsKKyAgVlA4RlRyYW5zZm9ybSA9IEZUcmFuc2Zvcm1fTkVPTjsKKworICBWUDhGVHJhbnNmb3JtV0hUID0gRlRyYW5zZm9ybVdIVF9ORU9OOworCisgIFZQOFREaXN0bzR4NCA9IERpc3RvNHg0X05FT047CisgIFZQOFREaXN0bzE2eDE2ID0gRGlzdG8xNngxNl9ORU9OOworICBWUDhDb2xsZWN0SGlzdG9ncmFtID0gQ29sbGVjdEhpc3RvZ3JhbV9ORU9OOworCisgIFZQOFNTRTE2eDE2ID0gU1NFMTZ4MTZfTkVPTjsKKyAgVlA4U1NFMTZ4OCA9IFNTRTE2eDhfTkVPTjsKKyAgVlA4U1NFOHg4ID0gU1NFOHg4X05FT047CisgIFZQOFNTRTR4NCA9IFNTRTR4NF9ORU9OOworCisjaWYgIWRlZmluZWQoV09SS19BUk9VTkRfR0NDKQorICBWUDhFbmNRdWFudGl6ZUJsb2NrID0gUXVhbnRpemVCbG9ja19ORU9OOworICBWUDhFbmNRdWFudGl6ZTJCbG9ja3MgPSBRdWFudGl6ZTJCbG9ja3NfTkVPTjsKKyNlbmRpZgorfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX05FT04KKworV0VCUF9EU1BfSU5JVF9TVFVCKFZQOEVuY0RzcEluaXRORU9OKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX05FT04KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZW5jX3NzZTIuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZW5jX3NzZTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDE0Zjc0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9lbmNfc3NlMi5jCkBAIC0wLDAgKzEsMTM4NyBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFNTRTIgdmVyc2lvbiBvZiBzcGVlZC1jcml0aWNhbCBlbmNvZGluZyBmdW5jdGlvbnMuCisvLworLy8gQXV0aG9yOiBDaHJpc3RpYW4gRHV2aXZpZXIgKGNkdXZpdmllckBnb29nbGUuY29tKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFMikKKyNpbmNsdWRlIDxlbW1pbnRyaW4uaD4KKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9hc3NlcnRfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0ZGxpYl9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RyaW5nX3BvZW0uaCIKKyNlbHNlCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+ICAvLyBmb3IgYWJzKCkKKyNlbmRpZgorCisjaW5jbHVkZSAic3JjL2RzcC9jb21tb25fc3NlMi5oIgorI2luY2x1ZGUgInNyYy9lbmMvY29zdF9lbmMuaCIKKyNpbmNsdWRlICJzcmMvZW5jL3ZwOGlfZW5jLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUcmFuc2Zvcm1zIChQYXJhZ3JhcGggMTQuNCkKKworLy8gRG9lcyBvbmUgb3IgdHdvIGludmVyc2UgdHJhbnNmb3Jtcy4KK3N0YXRpYyB2b2lkIElUcmFuc2Zvcm1fU1NFMihjb25zdCB1aW50OF90KiByZWYsIGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRvX3R3bykgeworICAvLyBUaGlzIGltcGxlbWVudGF0aW9uIG1ha2VzIHVzZSBvZiAxNi1iaXQgZml4ZWQgcG9pbnQgdmVyc2lvbnMgb2YgdHdvCisgIC8vIG11bHRpcGx5IGNvbnN0YW50czoKKyAgLy8gICAgSzEgPSBzcXJ0KDIpICogY29zIChwaS84KSB+PSA4NTYyNyAvIDJeMTYKKyAgLy8gICAgSzIgPSBzcXJ0KDIpICogc2luIChwaS84KSB+PSAzNTQ2OCAvIDJeMTYKKyAgLy8KKyAgLy8gVG8gYmUgYWJsZSB0byB1c2Ugc2lnbmVkIDE2LWJpdCBpbnRlZ2Vycywgd2UgdXNlIHRoZSBmb2xsb3dpbmcgdHJpY2sgdG8KKyAgLy8gaGF2ZSBjb25zdGFudHMgd2l0aGluIHJhbmdlOgorICAvLyAtIEFzc29jaWF0ZWQgY29uc3RhbnRzIGFyZSBvYnRhaW5lZCBieSBzdWJ0cmFjdGluZyB0aGUgMTYtYml0IGZpeGVkIHBvaW50CisgIC8vICAgdmVyc2lvbiBvZiBvbmU6CisgIC8vICAgICAgayA9IEsgLSAoMSA8PCAxNikgID0+ICBLID0gayArICgxIDw8IDE2KQorICAvLyAgICAgIEsxID0gODUyNjcgID0+ICBrMSA9ICAyMDA5MQorICAvLyAgICAgIEsyID0gMzU0NjggID0+ICBrMiA9IC0zMDA2OAorICAvLyAtIFRoZSBtdWx0aXBsaWNhdGlvbiBvZiBhIHZhcmlhYmxlIGJ5IGEgY29uc3RhbnQgYmVjb21lIHRoZSBzdW0gb2YgdGhlCisgIC8vICAgdmFyaWFibGUgYW5kIHRoZSBtdWx0aXBsaWNhdGlvbiBvZiB0aGF0IHZhcmlhYmxlIGJ5IHRoZSBhc3NvY2lhdGVkCisgIC8vICAgY29uc3RhbnQ6CisgIC8vICAgICAgKHggKiBLKSA+PiAxNiA9ICh4ICogKGsgKyAoMSA8PCAxNikpKSA+PiAxNiA9ICgoeCAqIGsgKSA+PiAxNikgKyB4CisgIGNvbnN0IF9fbTEyOGkgazEgPSBfbW1fc2V0MV9lcGkxNigyMDA5MSk7CisgIGNvbnN0IF9fbTEyOGkgazIgPSBfbW1fc2V0MV9lcGkxNigtMzAwNjgpOworICBfX20xMjhpIFQwLCBUMSwgVDIsIFQzOworCisgIC8vIExvYWQgYW5kIGNvbmNhdGVuYXRlIHRoZSB0cmFuc2Zvcm0gY29lZmZpY2llbnRzICh3ZSdsbCBkbyB0d28gaW52ZXJzZQorICAvLyB0cmFuc2Zvcm1zIGluIHBhcmFsbGVsKS4gSW4gdGhlIGNhc2Ugb2Ygb25seSBvbmUgaW52ZXJzZSB0cmFuc2Zvcm0sIHRoZQorICAvLyBzZWNvbmQgaGFsZiBvZiB0aGUgdmVjdG9ycyB3aWxsIGp1c3QgY29udGFpbiByYW5kb20gdmFsdWUgd2UnbGwgbmV2ZXIKKyAgLy8gdXNlIG5vciBzdG9yZS4KKyAgX19tMTI4aSBpbjAsIGluMSwgaW4yLCBpbjM7CisgIHsKKyAgICBpbjAgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZpblswXSk7CisgICAgaW4xID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmaW5bNF0pOworICAgIGluMiA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmluWzhdKTsKKyAgICBpbjMgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZpblsxMl0pOworICAgIC8vIGEwMCBhMTAgYTIwIGEzMCAgIHggeCB4IHgKKyAgICAvLyBhMDEgYTExIGEyMSBhMzEgICB4IHggeCB4CisgICAgLy8gYTAyIGExMiBhMjIgYTMyICAgeCB4IHggeAorICAgIC8vIGEwMyBhMTMgYTIzIGEzMyAgIHggeCB4IHgKKyAgICBpZiAoZG9fdHdvKSB7CisgICAgICBjb25zdCBfX20xMjhpIGluQjAgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZpblsxNl0pOworICAgICAgY29uc3QgX19tMTI4aSBpbkIxID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmaW5bMjBdKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgaW5CMiA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmluWzI0XSk7CisgICAgICBjb25zdCBfX20xMjhpIGluQjMgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZpblsyOF0pOworICAgICAgaW4wID0gX21tX3VucGFja2xvX2VwaTY0KGluMCwgaW5CMCk7CisgICAgICBpbjEgPSBfbW1fdW5wYWNrbG9fZXBpNjQoaW4xLCBpbkIxKTsKKyAgICAgIGluMiA9IF9tbV91bnBhY2tsb19lcGk2NChpbjIsIGluQjIpOworICAgICAgaW4zID0gX21tX3VucGFja2xvX2VwaTY0KGluMywgaW5CMyk7CisgICAgICAvLyBhMDAgYTEwIGEyMCBhMzAgICBiMDAgYjEwIGIyMCBiMzAKKyAgICAgIC8vIGEwMSBhMTEgYTIxIGEzMSAgIGIwMSBiMTEgYjIxIGIzMQorICAgICAgLy8gYTAyIGExMiBhMjIgYTMyICAgYjAyIGIxMiBiMjIgYjMyCisgICAgICAvLyBhMDMgYTEzIGEyMyBhMzMgICBiMDMgYjEzIGIyMyBiMzMKKyAgICB9CisgIH0KKworICAvLyBWZXJ0aWNhbCBwYXNzIGFuZCBzdWJzZXF1ZW50IHRyYW5zcG9zZS4KKyAgeworICAgIC8vIEZpcnN0IHBhc3MsIGMgYW5kIGQgY2FsY3VsYXRpb25zIGFyZSBsb25nZXIgYmVjYXVzZSBvZiB0aGUgInRyaWNrIgorICAgIC8vIG11bHRpcGxpY2F0aW9ucy4KKyAgICBjb25zdCBfX20xMjhpIGEgPSBfbW1fYWRkX2VwaTE2KGluMCwgaW4yKTsKKyAgICBjb25zdCBfX20xMjhpIGIgPSBfbW1fc3ViX2VwaTE2KGluMCwgaW4yKTsKKyAgICAvLyBjID0gTVVMKGluMSwgSzIpIC0gTVVMKGluMywgSzEpID0gTVVMKGluMSwgazIpIC0gTVVMKGluMywgazEpICsgaW4xIC0gaW4zCisgICAgY29uc3QgX19tMTI4aSBjMSA9IF9tbV9tdWxoaV9lcGkxNihpbjEsIGsyKTsKKyAgICBjb25zdCBfX20xMjhpIGMyID0gX21tX211bGhpX2VwaTE2KGluMywgazEpOworICAgIGNvbnN0IF9fbTEyOGkgYzMgPSBfbW1fc3ViX2VwaTE2KGluMSwgaW4zKTsKKyAgICBjb25zdCBfX20xMjhpIGM0ID0gX21tX3N1Yl9lcGkxNihjMSwgYzIpOworICAgIGNvbnN0IF9fbTEyOGkgYyA9IF9tbV9hZGRfZXBpMTYoYzMsIGM0KTsKKyAgICAvLyBkID0gTVVMKGluMSwgSzEpICsgTVVMKGluMywgSzIpID0gTVVMKGluMSwgazEpICsgTVVMKGluMywgazIpICsgaW4xICsgaW4zCisgICAgY29uc3QgX19tMTI4aSBkMSA9IF9tbV9tdWxoaV9lcGkxNihpbjEsIGsxKTsKKyAgICBjb25zdCBfX20xMjhpIGQyID0gX21tX211bGhpX2VwaTE2KGluMywgazIpOworICAgIGNvbnN0IF9fbTEyOGkgZDMgPSBfbW1fYWRkX2VwaTE2KGluMSwgaW4zKTsKKyAgICBjb25zdCBfX20xMjhpIGQ0ID0gX21tX2FkZF9lcGkxNihkMSwgZDIpOworICAgIGNvbnN0IF9fbTEyOGkgZCA9IF9tbV9hZGRfZXBpMTYoZDMsIGQ0KTsKKworICAgIC8vIFNlY29uZCBwYXNzLgorICAgIGNvbnN0IF9fbTEyOGkgdG1wMCA9IF9tbV9hZGRfZXBpMTYoYSwgZCk7CisgICAgY29uc3QgX19tMTI4aSB0bXAxID0gX21tX2FkZF9lcGkxNihiLCBjKTsKKyAgICBjb25zdCBfX20xMjhpIHRtcDIgPSBfbW1fc3ViX2VwaTE2KGIsIGMpOworICAgIGNvbnN0IF9fbTEyOGkgdG1wMyA9IF9tbV9zdWJfZXBpMTYoYSwgZCk7CisKKyAgICAvLyBUcmFuc3Bvc2UgdGhlIHR3byA0eDQuCisgICAgVlA4VHJhbnNwb3NlXzJfNHg0XzE2YigmdG1wMCwgJnRtcDEsICZ0bXAyLCAmdG1wMywgJlQwLCAmVDEsICZUMiwgJlQzKTsKKyAgfQorCisgIC8vIEhvcml6b250YWwgcGFzcyBhbmQgc3Vic2VxdWVudCB0cmFuc3Bvc2UuCisgIHsKKyAgICAvLyBGaXJzdCBwYXNzLCBjIGFuZCBkIGNhbGN1bGF0aW9ucyBhcmUgbG9uZ2VyIGJlY2F1c2Ugb2YgdGhlICJ0cmljayIKKyAgICAvLyBtdWx0aXBsaWNhdGlvbnMuCisgICAgY29uc3QgX19tMTI4aSBmb3VyID0gX21tX3NldDFfZXBpMTYoNCk7CisgICAgY29uc3QgX19tMTI4aSBkYyA9IF9tbV9hZGRfZXBpMTYoVDAsIGZvdXIpOworICAgIGNvbnN0IF9fbTEyOGkgYSA9ICBfbW1fYWRkX2VwaTE2KGRjLCBUMik7CisgICAgY29uc3QgX19tMTI4aSBiID0gIF9tbV9zdWJfZXBpMTYoZGMsIFQyKTsKKyAgICAvLyBjID0gTVVMKFQxLCBLMikgLSBNVUwoVDMsIEsxKSA9IE1VTChUMSwgazIpIC0gTVVMKFQzLCBrMSkgKyBUMSAtIFQzCisgICAgY29uc3QgX19tMTI4aSBjMSA9IF9tbV9tdWxoaV9lcGkxNihUMSwgazIpOworICAgIGNvbnN0IF9fbTEyOGkgYzIgPSBfbW1fbXVsaGlfZXBpMTYoVDMsIGsxKTsKKyAgICBjb25zdCBfX20xMjhpIGMzID0gX21tX3N1Yl9lcGkxNihUMSwgVDMpOworICAgIGNvbnN0IF9fbTEyOGkgYzQgPSBfbW1fc3ViX2VwaTE2KGMxLCBjMik7CisgICAgY29uc3QgX19tMTI4aSBjID0gX21tX2FkZF9lcGkxNihjMywgYzQpOworICAgIC8vIGQgPSBNVUwoVDEsIEsxKSArIE1VTChUMywgSzIpID0gTVVMKFQxLCBrMSkgKyBNVUwoVDMsIGsyKSArIFQxICsgVDMKKyAgICBjb25zdCBfX20xMjhpIGQxID0gX21tX211bGhpX2VwaTE2KFQxLCBrMSk7CisgICAgY29uc3QgX19tMTI4aSBkMiA9IF9tbV9tdWxoaV9lcGkxNihUMywgazIpOworICAgIGNvbnN0IF9fbTEyOGkgZDMgPSBfbW1fYWRkX2VwaTE2KFQxLCBUMyk7CisgICAgY29uc3QgX19tMTI4aSBkNCA9IF9tbV9hZGRfZXBpMTYoZDEsIGQyKTsKKyAgICBjb25zdCBfX20xMjhpIGQgPSBfbW1fYWRkX2VwaTE2KGQzLCBkNCk7CisKKyAgICAvLyBTZWNvbmQgcGFzcy4KKyAgICBjb25zdCBfX20xMjhpIHRtcDAgPSBfbW1fYWRkX2VwaTE2KGEsIGQpOworICAgIGNvbnN0IF9fbTEyOGkgdG1wMSA9IF9tbV9hZGRfZXBpMTYoYiwgYyk7CisgICAgY29uc3QgX19tMTI4aSB0bXAyID0gX21tX3N1Yl9lcGkxNihiLCBjKTsKKyAgICBjb25zdCBfX20xMjhpIHRtcDMgPSBfbW1fc3ViX2VwaTE2KGEsIGQpOworICAgIGNvbnN0IF9fbTEyOGkgc2hpZnRlZDAgPSBfbW1fc3JhaV9lcGkxNih0bXAwLCAzKTsKKyAgICBjb25zdCBfX20xMjhpIHNoaWZ0ZWQxID0gX21tX3NyYWlfZXBpMTYodG1wMSwgMyk7CisgICAgY29uc3QgX19tMTI4aSBzaGlmdGVkMiA9IF9tbV9zcmFpX2VwaTE2KHRtcDIsIDMpOworICAgIGNvbnN0IF9fbTEyOGkgc2hpZnRlZDMgPSBfbW1fc3JhaV9lcGkxNih0bXAzLCAzKTsKKworICAgIC8vIFRyYW5zcG9zZSB0aGUgdHdvIDR4NC4KKyAgICBWUDhUcmFuc3Bvc2VfMl80eDRfMTZiKCZzaGlmdGVkMCwgJnNoaWZ0ZWQxLCAmc2hpZnRlZDIsICZzaGlmdGVkMywgJlQwLCAmVDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmVDIsICZUMyk7CisgIH0KKworICAvLyBBZGQgaW52ZXJzZSB0cmFuc2Zvcm0gdG8gJ3JlZicgYW5kIHN0b3JlLgorICB7CisgICAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgICAvLyBMb2FkIHRoZSByZWZlcmVuY2UocykuCisgICAgX19tMTI4aSByZWYwLCByZWYxLCByZWYyLCByZWYzOworICAgIGlmIChkb190d28pIHsKKyAgICAgIC8vIExvYWQgZWlnaHQgYnl0ZXMvcGl4ZWxzIHBlciBsaW5lLgorICAgICAgcmVmMCA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJnJlZlswICogQlBTXSk7CisgICAgICByZWYxID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmcmVmWzEgKiBCUFNdKTsKKyAgICAgIHJlZjIgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZyZWZbMiAqIEJQU10pOworICAgICAgcmVmMyA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJnJlZlszICogQlBTXSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIExvYWQgZm91ciBieXRlcy9waXhlbHMgcGVyIGxpbmUuCisgICAgICByZWYwID0gX21tX2N2dHNpMzJfc2kxMjgoV2ViUE1lbVRvVWludDMyKCZyZWZbMCAqIEJQU10pKTsKKyAgICAgIHJlZjEgPSBfbW1fY3Z0c2kzMl9zaTEyOChXZWJQTWVtVG9VaW50MzIoJnJlZlsxICogQlBTXSkpOworICAgICAgcmVmMiA9IF9tbV9jdnRzaTMyX3NpMTI4KFdlYlBNZW1Ub1VpbnQzMigmcmVmWzIgKiBCUFNdKSk7CisgICAgICByZWYzID0gX21tX2N2dHNpMzJfc2kxMjgoV2ViUE1lbVRvVWludDMyKCZyZWZbMyAqIEJQU10pKTsKKyAgICB9CisgICAgLy8gQ29udmVydCB0byAxNmIuCisgICAgcmVmMCA9IF9tbV91bnBhY2tsb19lcGk4KHJlZjAsIHplcm8pOworICAgIHJlZjEgPSBfbW1fdW5wYWNrbG9fZXBpOChyZWYxLCB6ZXJvKTsKKyAgICByZWYyID0gX21tX3VucGFja2xvX2VwaTgocmVmMiwgemVybyk7CisgICAgcmVmMyA9IF9tbV91bnBhY2tsb19lcGk4KHJlZjMsIHplcm8pOworICAgIC8vIEFkZCB0aGUgaW52ZXJzZSB0cmFuc2Zvcm0ocykuCisgICAgcmVmMCA9IF9tbV9hZGRfZXBpMTYocmVmMCwgVDApOworICAgIHJlZjEgPSBfbW1fYWRkX2VwaTE2KHJlZjEsIFQxKTsKKyAgICByZWYyID0gX21tX2FkZF9lcGkxNihyZWYyLCBUMik7CisgICAgcmVmMyA9IF9tbV9hZGRfZXBpMTYocmVmMywgVDMpOworICAgIC8vIFVuc2lnbmVkIHNhdHVyYXRlIHRvIDhiLgorICAgIHJlZjAgPSBfbW1fcGFja3VzX2VwaTE2KHJlZjAsIHJlZjApOworICAgIHJlZjEgPSBfbW1fcGFja3VzX2VwaTE2KHJlZjEsIHJlZjEpOworICAgIHJlZjIgPSBfbW1fcGFja3VzX2VwaTE2KHJlZjIsIHJlZjIpOworICAgIHJlZjMgPSBfbW1fcGFja3VzX2VwaTE2KHJlZjMsIHJlZjMpOworICAgIC8vIFN0b3JlIHRoZSByZXN1bHRzLgorICAgIGlmIChkb190d28pIHsKKyAgICAgIC8vIFN0b3JlIGVpZ2h0IGJ5dGVzL3BpeGVscyBwZXIgbGluZS4KKyAgICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKSZkc3RbMCAqIEJQU10sIHJlZjApOworICAgICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopJmRzdFsxICogQlBTXSwgcmVmMSk7CisgICAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikmZHN0WzIgKiBCUFNdLCByZWYyKTsKKyAgICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKSZkc3RbMyAqIEJQU10sIHJlZjMpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBTdG9yZSBmb3VyIGJ5dGVzL3BpeGVscyBwZXIgbGluZS4KKyAgICAgIFdlYlBVaW50MzJUb01lbSgmZHN0WzAgKiBCUFNdLCBfbW1fY3Z0c2kxMjhfc2kzMihyZWYwKSk7CisgICAgICBXZWJQVWludDMyVG9NZW0oJmRzdFsxICogQlBTXSwgX21tX2N2dHNpMTI4X3NpMzIocmVmMSkpOworICAgICAgV2ViUFVpbnQzMlRvTWVtKCZkc3RbMiAqIEJQU10sIF9tbV9jdnRzaTEyOF9zaTMyKHJlZjIpKTsKKyAgICAgIFdlYlBVaW50MzJUb01lbSgmZHN0WzMgKiBCUFNdLCBfbW1fY3Z0c2kxMjhfc2kzMihyZWYzKSk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIEZUcmFuc2Zvcm1QYXNzMV9TU0UyKGNvbnN0IF9fbTEyOGkqIGNvbnN0IGluMDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBpbjIzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3Qgb3V0MDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBvdXQzMikgeworICBjb25zdCBfX20xMjhpIGs5MzcgPSBfbW1fc2V0MV9lcGkzMig5MzcpOworICBjb25zdCBfX20xMjhpIGsxODEyID0gX21tX3NldDFfZXBpMzIoMTgxMik7CisKKyAgY29uc3QgX19tMTI4aSBrODhwID0gX21tX3NldF9lcGkxNig4LCA4LCA4LCA4LCA4LCA4LCA4LCA4KTsKKyAgY29uc3QgX19tMTI4aSBrODhtID0gX21tX3NldF9lcGkxNigtOCwgOCwgLTgsIDgsIC04LCA4LCAtOCwgOCk7CisgIGNvbnN0IF9fbTEyOGkgazUzNTJfMjIxN3AgPSBfbW1fc2V0X2VwaTE2KDIyMTcsIDUzNTIsIDIyMTcsIDUzNTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyMTcsIDUzNTIsIDIyMTcsIDUzNTIpOworICBjb25zdCBfX20xMjhpIGs1MzUyXzIyMTdtID0gX21tX3NldF9lcGkxNigtNTM1MiwgMjIxNywgLTUzNTIsIDIyMTcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC01MzUyLCAyMjE3LCAtNTM1MiwgMjIxNyk7CisKKyAgLy8gKmluMDEgPSAwMCAwMSAxMCAxMSAwMiAwMyAxMiAxMworICAvLyAqaW4yMyA9IDIwIDIxIDMwIDMxIDIyIDIzIDMyIDMzCisgIGNvbnN0IF9fbTEyOGkgc2h1ZjAxX3AgPSBfbW1fc2h1ZmZsZWhpX2VwaTE2KCppbjAxLCBfTU1fU0hVRkZMRSgyLCAzLCAwLCAxKSk7CisgIGNvbnN0IF9fbTEyOGkgc2h1ZjIzX3AgPSBfbW1fc2h1ZmZsZWhpX2VwaTE2KCppbjIzLCBfTU1fU0hVRkZMRSgyLCAzLCAwLCAxKSk7CisgIC8vIDAwIDAxIDEwIDExIDAzIDAyIDEzIDEyCisgIC8vIDIwIDIxIDMwIDMxIDIzIDIyIDMzIDMyCisgIGNvbnN0IF9fbTEyOGkgczAxID0gX21tX3VucGFja2xvX2VwaTY0KHNodWYwMV9wLCBzaHVmMjNfcCk7CisgIGNvbnN0IF9fbTEyOGkgczMyID0gX21tX3VucGFja2hpX2VwaTY0KHNodWYwMV9wLCBzaHVmMjNfcCk7CisgIC8vIDAwIDAxIDEwIDExIDIwIDIxIDMwIDMxCisgIC8vIDAzIDAyIDEzIDEyIDIzIDIyIDMzIDMyCisgIGNvbnN0IF9fbTEyOGkgYTAxID0gX21tX2FkZF9lcGkxNihzMDEsIHMzMik7CisgIGNvbnN0IF9fbTEyOGkgYTMyID0gX21tX3N1Yl9lcGkxNihzMDEsIHMzMik7CisgIC8vIFtkMCArIGQzIHwgZDEgKyBkMiB8IC4uLl0gPSBbYTAgYTEgfCBhMCcgYTEnIHwgLi4uIF0KKyAgLy8gW2QwIC0gZDMgfCBkMSAtIGQyIHwgLi4uXSA9IFthMyBhMiB8IGEzJyBhMicgfCAuLi4gXQorCisgIGNvbnN0IF9fbTEyOGkgdG1wMCAgID0gX21tX21hZGRfZXBpMTYoYTAxLCBrODhwKTsgIC8vIFsgKGEwICsgYTEpIDw8IDMsIC4uLiBdCisgIGNvbnN0IF9fbTEyOGkgdG1wMiAgID0gX21tX21hZGRfZXBpMTYoYTAxLCBrODhtKTsgIC8vIFsgKGEwIC0gYTEpIDw8IDMsIC4uLiBdCisgIGNvbnN0IF9fbTEyOGkgdG1wMV8xID0gX21tX21hZGRfZXBpMTYoYTMyLCBrNTM1Ml8yMjE3cCk7CisgIGNvbnN0IF9fbTEyOGkgdG1wM18xID0gX21tX21hZGRfZXBpMTYoYTMyLCBrNTM1Ml8yMjE3bSk7CisgIGNvbnN0IF9fbTEyOGkgdG1wMV8yID0gX21tX2FkZF9lcGkzMih0bXAxXzEsIGsxODEyKTsKKyAgY29uc3QgX19tMTI4aSB0bXAzXzIgPSBfbW1fYWRkX2VwaTMyKHRtcDNfMSwgazkzNyk7CisgIGNvbnN0IF9fbTEyOGkgdG1wMSAgID0gX21tX3NyYWlfZXBpMzIodG1wMV8yLCA5KTsKKyAgY29uc3QgX19tMTI4aSB0bXAzICAgPSBfbW1fc3JhaV9lcGkzMih0bXAzXzIsIDkpOworICBjb25zdCBfX20xMjhpIHMwMyAgICA9IF9tbV9wYWNrc19lcGkzMih0bXAwLCB0bXAyKTsKKyAgY29uc3QgX19tMTI4aSBzMTIgICAgPSBfbW1fcGFja3NfZXBpMzIodG1wMSwgdG1wMyk7CisgIGNvbnN0IF9fbTEyOGkgc19sbyAgID0gX21tX3VucGFja2xvX2VwaTE2KHMwMywgczEyKTsgICAvLyAwIDEgMCAxIDAgMS4uLgorICBjb25zdCBfX20xMjhpIHNfaGkgICA9IF9tbV91bnBhY2toaV9lcGkxNihzMDMsIHMxMik7ICAgLy8gMiAzIDIgMyAyIDMKKyAgY29uc3QgX19tMTI4aSB2MjMgICAgPSBfbW1fdW5wYWNraGlfZXBpMzIoc19sbywgc19oaSk7CisgICpvdXQwMSA9IF9tbV91bnBhY2tsb19lcGkzMihzX2xvLCBzX2hpKTsKKyAgKm91dDMyID0gX21tX3NodWZmbGVfZXBpMzIodjIzLCBfTU1fU0hVRkZMRSgxLCAwLCAzLCAyKSk7ICAvLyAzIDIgMyAyIDMgMi4uCit9CisKK3N0YXRpYyB2b2lkIEZUcmFuc2Zvcm1QYXNzMl9TU0UyKGNvbnN0IF9fbTEyOGkqIGNvbnN0IHYwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IHYzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QqIG91dCkgeworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBjb25zdCBfX20xMjhpIHNldmVuID0gX21tX3NldDFfZXBpMTYoNyk7CisgIGNvbnN0IF9fbTEyOGkgazUzNTJfMjIxNyA9IF9tbV9zZXRfZXBpMTYoNTM1MiwgIDIyMTcsIDUzNTIsICAyMjE3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUzNTIsICAyMjE3LCA1MzUyLCAgMjIxNyk7CisgIGNvbnN0IF9fbTEyOGkgazIyMTdfNTM1MiA9IF9tbV9zZXRfZXBpMTYoMjIxNywgLTUzNTIsIDIyMTcsIC01MzUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyMTcsIC01MzUyLCAyMjE3LCAtNTM1Mik7CisgIGNvbnN0IF9fbTEyOGkgazEyMDAwX3BsdXNfb25lID0gX21tX3NldDFfZXBpMzIoMTIwMDAgKyAoMSA8PCAxNikpOworICBjb25zdCBfX20xMjhpIGs1MTAwMCA9IF9tbV9zZXQxX2VwaTMyKDUxMDAwKTsKKworICAvLyBTYW1lIG9wZXJhdGlvbnMgYXJlIGRvbmUgb24gdGhlICgwLDMpIGFuZCAoMSwyKSBwYWlycy4KKyAgLy8gYTMgPSB2MCAtIHYzCisgIC8vIGEyID0gdjEgLSB2MgorICBjb25zdCBfX20xMjhpIGEzMiA9IF9tbV9zdWJfZXBpMTYoKnYwMSwgKnYzMik7CisgIGNvbnN0IF9fbTEyOGkgYTIyID0gX21tX3VucGFja2hpX2VwaTY0KGEzMiwgYTMyKTsKKworICBjb25zdCBfX20xMjhpIGIyMyA9IF9tbV91bnBhY2tsb19lcGkxNihhMjIsIGEzMik7CisgIGNvbnN0IF9fbTEyOGkgYzEgPSBfbW1fbWFkZF9lcGkxNihiMjMsIGs1MzUyXzIyMTcpOworICBjb25zdCBfX20xMjhpIGMzID0gX21tX21hZGRfZXBpMTYoYjIzLCBrMjIxN181MzUyKTsKKyAgY29uc3QgX19tMTI4aSBkMSA9IF9tbV9hZGRfZXBpMzIoYzEsIGsxMjAwMF9wbHVzX29uZSk7CisgIGNvbnN0IF9fbTEyOGkgZDMgPSBfbW1fYWRkX2VwaTMyKGMzLCBrNTEwMDApOworICBjb25zdCBfX20xMjhpIGUxID0gX21tX3NyYWlfZXBpMzIoZDEsIDE2KTsKKyAgY29uc3QgX19tMTI4aSBlMyA9IF9tbV9zcmFpX2VwaTMyKGQzLCAxNik7CisgIC8vIGYxID0gKChiMyAqIDUzNTIgKyBiMiAqIDIyMTcgKyAxMjAwMCkgPj4gMTYpCisgIC8vIGYzID0gKChiMyAqIDIyMTcgLSBiMiAqIDUzNTIgKyA1MTAwMCkgPj4gMTYpCisgIGNvbnN0IF9fbTEyOGkgZjEgPSBfbW1fcGFja3NfZXBpMzIoZTEsIGUxKTsKKyAgY29uc3QgX19tMTI4aSBmMyA9IF9tbV9wYWNrc19lcGkzMihlMywgZTMpOworICAvLyBnMSA9IGYxICsgKGEzICE9IDApOworICAvLyBUaGUgY29tcGFyZSB3aWxsIHJldHVybiAoMHhmZmZmLCAwKSBmb3IgKD09MCwgIT0wKS4gVG8gdHVybiB0aGF0IGludG8gdGhlCisgIC8vIGRlc2lyZWQgKDAsIDEpLCB3ZSBhZGQgb25lIGVhcmxpZXIgdGhyb3VnaCBrMTIwMDBfcGx1c19vbmUuCisgIC8vIC0+IGcxID0gZjEgKyAxIC0gKGEzID09IDApCisgIGNvbnN0IF9fbTEyOGkgZzEgPSBfbW1fYWRkX2VwaTE2KGYxLCBfbW1fY21wZXFfZXBpMTYoYTMyLCB6ZXJvKSk7CisKKyAgLy8gYTAgPSB2MCArIHYzCisgIC8vIGExID0gdjEgKyB2MgorICBjb25zdCBfX20xMjhpIGEwMSA9IF9tbV9hZGRfZXBpMTYoKnYwMSwgKnYzMik7CisgIGNvbnN0IF9fbTEyOGkgYTAxX3BsdXNfNyA9IF9tbV9hZGRfZXBpMTYoYTAxLCBzZXZlbik7CisgIGNvbnN0IF9fbTEyOGkgYTExID0gX21tX3VucGFja2hpX2VwaTY0KGEwMSwgYTAxKTsKKyAgY29uc3QgX19tMTI4aSBjMCA9IF9tbV9hZGRfZXBpMTYoYTAxX3BsdXNfNywgYTExKTsKKyAgY29uc3QgX19tMTI4aSBjMiA9IF9tbV9zdWJfZXBpMTYoYTAxX3BsdXNfNywgYTExKTsKKyAgLy8gZDAgPSAoYTAgKyBhMSArIDcpID4+IDQ7CisgIC8vIGQyID0gKGEwIC0gYTEgKyA3KSA+PiA0OworICBjb25zdCBfX20xMjhpIGQwID0gX21tX3NyYWlfZXBpMTYoYzAsIDQpOworICBjb25zdCBfX20xMjhpIGQyID0gX21tX3NyYWlfZXBpMTYoYzIsIDQpOworCisgIGNvbnN0IF9fbTEyOGkgZDBfZzEgPSBfbW1fdW5wYWNrbG9fZXBpNjQoZDAsIGcxKTsKKyAgY29uc3QgX19tMTI4aSBkMl9mMyA9IF9tbV91bnBhY2tsb19lcGk2NChkMiwgZjMpOworICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmb3V0WzBdLCBkMF9nMSk7CisgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbOF0sIGQyX2YzKTsKK30KKworc3RhdGljIHZvaWQgRlRyYW5zZm9ybV9TU0UyKGNvbnN0IHVpbnQ4X3QqIHNyYywgY29uc3QgdWludDhfdCogcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QqIG91dCkgeworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICAvLyBMb2FkIHNyYy4KKyAgY29uc3QgX19tMTI4aSBzcmMwID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmc3JjWzAgKiBCUFNdKTsKKyAgY29uc3QgX19tMTI4aSBzcmMxID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmc3JjWzEgKiBCUFNdKTsKKyAgY29uc3QgX19tMTI4aSBzcmMyID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmc3JjWzIgKiBCUFNdKTsKKyAgY29uc3QgX19tMTI4aSBzcmMzID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmc3JjWzMgKiBCUFNdKTsKKyAgLy8gMDAgMDEgMDIgMDMgKgorICAvLyAxMCAxMSAxMiAxMyAqCisgIC8vIDIwIDIxIDIyIDIzICoKKyAgLy8gMzAgMzEgMzIgMzMgKgorICAvLyBTaHVmZmxlLgorICBjb25zdCBfX20xMjhpIHNyY18wID0gX21tX3VucGFja2xvX2VwaTE2KHNyYzAsIHNyYzEpOworICBjb25zdCBfX20xMjhpIHNyY18xID0gX21tX3VucGFja2xvX2VwaTE2KHNyYzIsIHNyYzMpOworICAvLyAwMCAwMSAxMCAxMSAwMiAwMyAxMiAxMyAqICogLi4uCisgIC8vIDIwIDIxIDMwIDMxIDIyIDIyIDMyIDMzICogKiAuLi4KKworICAvLyBMb2FkIHJlZi4KKyAgY29uc3QgX19tMTI4aSByZWYwID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmcmVmWzAgKiBCUFNdKTsKKyAgY29uc3QgX19tMTI4aSByZWYxID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmcmVmWzEgKiBCUFNdKTsKKyAgY29uc3QgX19tMTI4aSByZWYyID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmcmVmWzIgKiBCUFNdKTsKKyAgY29uc3QgX19tMTI4aSByZWYzID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmcmVmWzMgKiBCUFNdKTsKKyAgY29uc3QgX19tMTI4aSByZWZfMCA9IF9tbV91bnBhY2tsb19lcGkxNihyZWYwLCByZWYxKTsKKyAgY29uc3QgX19tMTI4aSByZWZfMSA9IF9tbV91bnBhY2tsb19lcGkxNihyZWYyLCByZWYzKTsKKworICAvLyBDb252ZXJ0IGJvdGggdG8gMTYgYml0LgorICBjb25zdCBfX20xMjhpIHNyY18wXzE2YiA9IF9tbV91bnBhY2tsb19lcGk4KHNyY18wLCB6ZXJvKTsKKyAgY29uc3QgX19tMTI4aSBzcmNfMV8xNmIgPSBfbW1fdW5wYWNrbG9fZXBpOChzcmNfMSwgemVybyk7CisgIGNvbnN0IF9fbTEyOGkgcmVmXzBfMTZiID0gX21tX3VucGFja2xvX2VwaTgocmVmXzAsIHplcm8pOworICBjb25zdCBfX20xMjhpIHJlZl8xXzE2YiA9IF9tbV91bnBhY2tsb19lcGk4KHJlZl8xLCB6ZXJvKTsKKworICAvLyBDb21wdXRlIHRoZSBkaWZmZXJlbmNlLgorICBjb25zdCBfX20xMjhpIHJvdzAxID0gX21tX3N1Yl9lcGkxNihzcmNfMF8xNmIsIHJlZl8wXzE2Yik7CisgIGNvbnN0IF9fbTEyOGkgcm93MjMgPSBfbW1fc3ViX2VwaTE2KHNyY18xXzE2YiwgcmVmXzFfMTZiKTsKKyAgX19tMTI4aSB2MDEsIHYzMjsKKworICAvLyBGaXJzdCBwYXNzCisgIEZUcmFuc2Zvcm1QYXNzMV9TU0UyKCZyb3cwMSwgJnJvdzIzLCAmdjAxLCAmdjMyKTsKKworICAvLyBTZWNvbmQgcGFzcworICBGVHJhbnNmb3JtUGFzczJfU1NFMigmdjAxLCAmdjMyLCBvdXQpOworfQorCitzdGF0aWMgdm9pZCBGVHJhbnNmb3JtMl9TU0UyKGNvbnN0IHVpbnQ4X3QqIHNyYywgY29uc3QgdWludDhfdCogcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90KiBvdXQpIHsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKworICAvLyBMb2FkIHNyYyBhbmQgY29udmVydCB0byAxNmIuCisgIGNvbnN0IF9fbTEyOGkgc3JjMCA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJnNyY1swICogQlBTXSk7CisgIGNvbnN0IF9fbTEyOGkgc3JjMSA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJnNyY1sxICogQlBTXSk7CisgIGNvbnN0IF9fbTEyOGkgc3JjMiA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJnNyY1syICogQlBTXSk7CisgIGNvbnN0IF9fbTEyOGkgc3JjMyA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJnNyY1szICogQlBTXSk7CisgIGNvbnN0IF9fbTEyOGkgc3JjXzAgPSBfbW1fdW5wYWNrbG9fZXBpOChzcmMwLCB6ZXJvKTsKKyAgY29uc3QgX19tMTI4aSBzcmNfMSA9IF9tbV91bnBhY2tsb19lcGk4KHNyYzEsIHplcm8pOworICBjb25zdCBfX20xMjhpIHNyY18yID0gX21tX3VucGFja2xvX2VwaTgoc3JjMiwgemVybyk7CisgIGNvbnN0IF9fbTEyOGkgc3JjXzMgPSBfbW1fdW5wYWNrbG9fZXBpOChzcmMzLCB6ZXJvKTsKKyAgLy8gTG9hZCByZWYgYW5kIGNvbnZlcnQgdG8gMTZiLgorICBjb25zdCBfX20xMjhpIHJlZjAgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZyZWZbMCAqIEJQU10pOworICBjb25zdCBfX20xMjhpIHJlZjEgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZyZWZbMSAqIEJQU10pOworICBjb25zdCBfX20xMjhpIHJlZjIgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZyZWZbMiAqIEJQU10pOworICBjb25zdCBfX20xMjhpIHJlZjMgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZyZWZbMyAqIEJQU10pOworICBjb25zdCBfX20xMjhpIHJlZl8wID0gX21tX3VucGFja2xvX2VwaTgocmVmMCwgemVybyk7CisgIGNvbnN0IF9fbTEyOGkgcmVmXzEgPSBfbW1fdW5wYWNrbG9fZXBpOChyZWYxLCB6ZXJvKTsKKyAgY29uc3QgX19tMTI4aSByZWZfMiA9IF9tbV91bnBhY2tsb19lcGk4KHJlZjIsIHplcm8pOworICBjb25zdCBfX20xMjhpIHJlZl8zID0gX21tX3VucGFja2xvX2VwaTgocmVmMywgemVybyk7CisgIC8vIENvbXB1dGUgZGlmZmVyZW5jZS4gLT4gMDAgMDEgMDIgMDMgIDAwJyAwMScgMDInIDAzJworICBjb25zdCBfX20xMjhpIGRpZmYwID0gX21tX3N1Yl9lcGkxNihzcmNfMCwgcmVmXzApOworICBjb25zdCBfX20xMjhpIGRpZmYxID0gX21tX3N1Yl9lcGkxNihzcmNfMSwgcmVmXzEpOworICBjb25zdCBfX20xMjhpIGRpZmYyID0gX21tX3N1Yl9lcGkxNihzcmNfMiwgcmVmXzIpOworICBjb25zdCBfX20xMjhpIGRpZmYzID0gX21tX3N1Yl9lcGkxNihzcmNfMywgcmVmXzMpOworCisgIC8vIFVucGFjayBhbmQgc2h1ZmZsZQorICAvLyAwMCAwMSAwMiAwMyAgIDAgMCAwIDAKKyAgLy8gMTAgMTEgMTIgMTMgICAwIDAgMCAwCisgIC8vIDIwIDIxIDIyIDIzICAgMCAwIDAgMAorICAvLyAzMCAzMSAzMiAzMyAgIDAgMCAwIDAKKyAgY29uc3QgX19tMTI4aSBzaHVmMDFsID0gX21tX3VucGFja2xvX2VwaTMyKGRpZmYwLCBkaWZmMSk7CisgIGNvbnN0IF9fbTEyOGkgc2h1ZjIzbCA9IF9tbV91bnBhY2tsb19lcGkzMihkaWZmMiwgZGlmZjMpOworICBjb25zdCBfX20xMjhpIHNodWYwMWggPSBfbW1fdW5wYWNraGlfZXBpMzIoZGlmZjAsIGRpZmYxKTsKKyAgY29uc3QgX19tMTI4aSBzaHVmMjNoID0gX21tX3VucGFja2hpX2VwaTMyKGRpZmYyLCBkaWZmMyk7CisgIF9fbTEyOGkgdjAxbCwgdjMybDsKKyAgX19tMTI4aSB2MDFoLCB2MzJoOworCisgIC8vIEZpcnN0IHBhc3MKKyAgRlRyYW5zZm9ybVBhc3MxX1NTRTIoJnNodWYwMWwsICZzaHVmMjNsLCAmdjAxbCwgJnYzMmwpOworICBGVHJhbnNmb3JtUGFzczFfU1NFMigmc2h1ZjAxaCwgJnNodWYyM2gsICZ2MDFoLCAmdjMyaCk7CisKKyAgLy8gU2Vjb25kIHBhc3MKKyAgRlRyYW5zZm9ybVBhc3MyX1NTRTIoJnYwMWwsICZ2MzJsLCBvdXQgKyAwKTsKKyAgRlRyYW5zZm9ybVBhc3MyX1NTRTIoJnYwMWgsICZ2MzJoLCBvdXQgKyAxNik7Cit9CisKK3N0YXRpYyB2b2lkIEZUcmFuc2Zvcm1XSFRSb3dfU1NFMihjb25zdCBpbnQxNl90KiBjb25zdCBpbiwgX19tMTI4aSogY29uc3Qgb3V0KSB7CisgIGNvbnN0IF9fbTEyOGkga011bHQgPSBfbW1fc2V0X2VwaTE2KC0xLCAxLCAtMSwgMSwgMSwgMSwgMSwgMSk7CisgIGNvbnN0IF9fbTEyOGkgc3JjMCA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJmluWzAgKiAxNl0pOworICBjb25zdCBfX20xMjhpIHNyYzEgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSZpblsxICogMTZdKTsKKyAgY29uc3QgX19tMTI4aSBzcmMyID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmaW5bMiAqIDE2XSk7CisgIGNvbnN0IF9fbTEyOGkgc3JjMyA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJmluWzMgKiAxNl0pOworICBjb25zdCBfX20xMjhpIEEwMSA9IF9tbV91bnBhY2tsb19lcGkxNihzcmMwLCBzcmMxKTsgIC8vIEEwIEExIHwgLi4uCisgIGNvbnN0IF9fbTEyOGkgQTIzID0gX21tX3VucGFja2xvX2VwaTE2KHNyYzIsIHNyYzMpOyAgLy8gQTIgQTMgfCAuLi4KKyAgY29uc3QgX19tMTI4aSBCMCA9IF9tbV9hZGRzX2VwaTE2KEEwMSwgQTIzKTsgICAgLy8gYTAgfCBhMSB8IC4uLgorICBjb25zdCBfX20xMjhpIEIxID0gX21tX3N1YnNfZXBpMTYoQTAxLCBBMjMpOyAgICAvLyBhMyB8IGEyIHwgLi4uCisgIGNvbnN0IF9fbTEyOGkgQzAgPSBfbW1fdW5wYWNrbG9fZXBpMzIoQjAsIEIxKTsgIC8vIGEwIHwgYTEgfCBhMyB8IGEyIHwgLi4uCisgIGNvbnN0IF9fbTEyOGkgQzEgPSBfbW1fdW5wYWNrbG9fZXBpMzIoQjEsIEIwKTsgIC8vIGEzIHwgYTIgfCBhMCB8IGExIHwgLi4uCisgIGNvbnN0IF9fbTEyOGkgRCA9IF9tbV91bnBhY2tsb19lcGk2NChDMCwgQzEpOyAgIC8vIGEwIGExIGEzIGEyIGEzIGEyIGEwIGExCisgICpvdXQgPSBfbW1fbWFkZF9lcGkxNihELCBrTXVsdCk7Cit9CisKK3N0YXRpYyB2b2lkIEZUcmFuc2Zvcm1XSFRfU1NFMihjb25zdCBpbnQxNl90KiBpbiwgaW50MTZfdCogb3V0KSB7CisgIC8vIElucHV0IGlzIDEyYiBzaWduZWQuCisgIF9fbTEyOGkgcm93MCwgcm93MSwgcm93Miwgcm93MzsKKyAgLy8gUm93cyBhcmUgMTRiIHNpZ25lZC4KKyAgRlRyYW5zZm9ybVdIVFJvd19TU0UyKGluICsgMCAqIDY0LCAmcm93MCk7CisgIEZUcmFuc2Zvcm1XSFRSb3dfU1NFMihpbiArIDEgKiA2NCwgJnJvdzEpOworICBGVHJhbnNmb3JtV0hUUm93X1NTRTIoaW4gKyAyICogNjQsICZyb3cyKTsKKyAgRlRyYW5zZm9ybVdIVFJvd19TU0UyKGluICsgMyAqIDY0LCAmcm93Myk7CisKKyAgeworICAgIC8vIFRoZSBhKiBhcmUgMTViIHNpZ25lZC4KKyAgICBjb25zdCBfX20xMjhpIGEwID0gX21tX2FkZF9lcGkzMihyb3cwLCByb3cyKTsKKyAgICBjb25zdCBfX20xMjhpIGExID0gX21tX2FkZF9lcGkzMihyb3cxLCByb3czKTsKKyAgICBjb25zdCBfX20xMjhpIGEyID0gX21tX3N1Yl9lcGkzMihyb3cxLCByb3czKTsKKyAgICBjb25zdCBfX20xMjhpIGEzID0gX21tX3N1Yl9lcGkzMihyb3cwLCByb3cyKTsKKyAgICBjb25zdCBfX20xMjhpIGEwYTMgPSBfbW1fcGFja3NfZXBpMzIoYTAsIGEzKTsKKyAgICBjb25zdCBfX20xMjhpIGExYTIgPSBfbW1fcGFja3NfZXBpMzIoYTEsIGEyKTsKKworICAgIC8vIFRoZSBiKiBhcmUgMTZiIHNpZ25lZC4KKyAgICBjb25zdCBfX20xMjhpIGIwYjEgPSBfbW1fYWRkX2VwaTE2KGEwYTMsIGExYTIpOworICAgIGNvbnN0IF9fbTEyOGkgYjNiMiA9IF9tbV9zdWJfZXBpMTYoYTBhMywgYTFhMik7CisgICAgY29uc3QgX19tMTI4aSB0bXBfYjJiMyA9IF9tbV91bnBhY2toaV9lcGk2NChiM2IyLCBiM2IyKTsKKyAgICBjb25zdCBfX20xMjhpIGIyYjMgPSBfbW1fdW5wYWNrbG9fZXBpNjQodG1wX2IyYjMsIGIzYjIpOworCisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJm91dFswXSwgX21tX3NyYWlfZXBpMTYoYjBiMSwgMSkpOworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbOF0sIF9tbV9zcmFpX2VwaTE2KGIyYjMsIDEpKTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29tcHV0ZSBzdXNjZXB0aWJpbGl0eSBiYXNlZCBvbiBEQ1QtY29lZmYgaGlzdG9ncmFtczoKKy8vIHRoZSBoaWdoZXIsIHRoZSAiZWFzaWVyIiB0aGUgbWFjcm9ibG9jayBpcyB0byBjb21wcmVzcy4KKworc3RhdGljIHZvaWQgQ29sbGVjdEhpc3RvZ3JhbV9TU0UyKGNvbnN0IHVpbnQ4X3QqIHJlZiwgY29uc3QgdWludDhfdCogcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfYmxvY2ssIGludCBlbmRfYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4SGlzdG9ncmFtKiBjb25zdCBoaXN0bykgeworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBjb25zdCBfX20xMjhpIG1heF9jb2VmZl90aHJlc2ggPSBfbW1fc2V0MV9lcGkxNihNQVhfQ09FRkZfVEhSRVNIKTsKKyAgaW50IGo7CisgIGludCBkaXN0cmlidXRpb25bTUFYX0NPRUZGX1RIUkVTSCArIDFdID0geyAwIH07CisgIGZvciAoaiA9IHN0YXJ0X2Jsb2NrOyBqIDwgZW5kX2Jsb2NrOyArK2opIHsKKyAgICBpbnQxNl90IG91dFsxNl07CisgICAgaW50IGs7CisKKyAgICBGVHJhbnNmb3JtX1NTRTIocmVmICsgVlA4RHNwU2NhbltqXSwgcHJlZCArIFZQOERzcFNjYW5bal0sIG91dCk7CisKKyAgICAvLyBDb252ZXJ0IGNvZWZmaWNpZW50cyB0byBiaW4gKHdpdGhpbiBvdXRbXSkuCisgICAgeworICAgICAgLy8gTG9hZC4KKyAgICAgIGNvbnN0IF9fbTEyOGkgb3V0MCA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJm91dFswXSk7CisgICAgICBjb25zdCBfX20xMjhpIG91dDEgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbOF0pOworICAgICAgY29uc3QgX19tMTI4aSBkMCA9IF9tbV9zdWJfZXBpMTYoemVybywgb3V0MCk7CisgICAgICBjb25zdCBfX20xMjhpIGQxID0gX21tX3N1Yl9lcGkxNih6ZXJvLCBvdXQxKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYWJzMCA9IF9tbV9tYXhfZXBpMTYob3V0MCwgZDApOyAgIC8vIGFicyh2KSwgMTZiCisgICAgICBjb25zdCBfX20xMjhpIGFiczEgPSBfbW1fbWF4X2VwaTE2KG91dDEsIGQxKTsKKyAgICAgIC8vIHYgPSBhYnMob3V0KSA+PiAzCisgICAgICBjb25zdCBfX20xMjhpIHYwID0gX21tX3NyYWlfZXBpMTYoYWJzMCwgMyk7CisgICAgICBjb25zdCBfX20xMjhpIHYxID0gX21tX3NyYWlfZXBpMTYoYWJzMSwgMyk7CisgICAgICAvLyBiaW4gPSBtaW4odiwgTUFYX0NPRUZGX1RIUkVTSCkKKyAgICAgIGNvbnN0IF9fbTEyOGkgYmluMCA9IF9tbV9taW5fZXBpMTYodjAsIG1heF9jb2VmZl90aHJlc2gpOworICAgICAgY29uc3QgX19tMTI4aSBiaW4xID0gX21tX21pbl9lcGkxNih2MSwgbWF4X2NvZWZmX3RocmVzaCk7CisgICAgICAvLyBTdG9yZS4KKyAgICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbMF0sIGJpbjApOworICAgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJm91dFs4XSwgYmluMSk7CisgICAgfQorCisgICAgLy8gQ29udmVydCBjb2VmZmljaWVudHMgdG8gYmluLgorICAgIGZvciAoayA9IDA7IGsgPCAxNjsgKytrKSB7CisgICAgICArK2Rpc3RyaWJ1dGlvbltvdXRba11dOworICAgIH0KKyAgfQorICBWUDhTZXRIaXN0b2dyYW1EYXRhKGRpc3RyaWJ1dGlvbiwgaGlzdG8pOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW50cmEgcHJlZGljdGlvbnMKKworLy8gaGVscGVyIGZvciBjaHJvbWEtREMgcHJlZGljdGlvbnMKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFB1dDh4OHV2X1NTRTIodWludDhfdCB2LCB1aW50OF90KiBkc3QpIHsKKyAgaW50IGo7CisgIGNvbnN0IF9fbTEyOGkgdmFsdWVzID0gX21tX3NldDFfZXBpOCh2KTsKKyAgZm9yIChqID0gMDsgaiA8IDg7ICsraikgeworICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKShkc3QgKyBqICogQlBTKSwgdmFsdWVzKTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBQdXQxNl9TU0UyKHVpbnQ4X3QgdiwgdWludDhfdCogZHN0KSB7CisgIGludCBqOworICBjb25zdCBfX20xMjhpIHZhbHVlcyA9IF9tbV9zZXQxX2VwaTgodik7CisgIGZvciAoaiA9IDA7IGogPCAxNjsgKytqKSB7CisgICAgX21tX3N0b3JlX3NpMTI4KChfX20xMjhpKikoZHN0ICsgaiAqIEJQUyksIHZhbHVlcyk7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRmlsbF9TU0UyKHVpbnQ4X3QqIGRzdCwgaW50IHZhbHVlLCBpbnQgc2l6ZSkgeworICBpZiAoc2l6ZSA9PSA0KSB7CisgICAgaW50IGo7CisgICAgZm9yIChqID0gMDsgaiA8IDQ7ICsraikgeworICAgICAgbWVtc2V0KGRzdCArIGogKiBCUFMsIHZhbHVlLCA0KTsKKyAgICB9CisgIH0gZWxzZSBpZiAoc2l6ZSA9PSA4KSB7CisgICAgUHV0OHg4dXZfU1NFMih2YWx1ZSwgZHN0KTsKKyAgfSBlbHNlIHsKKyAgICBQdXQxNl9TU0UyKHZhbHVlLCBkc3QpOworICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZFOHV2X1NTRTIodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgaW50IGo7CisgIGNvbnN0IF9fbTEyOGkgdG9wX3ZhbHVlcyA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopdG9wKTsKKyAgZm9yIChqID0gMDsgaiA8IDg7ICsraikgeworICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKShkc3QgKyBqICogQlBTKSwgdG9wX3ZhbHVlcyk7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVkUxNl9TU0UyKHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogdG9wKSB7CisgIGNvbnN0IF9fbTEyOGkgdG9wX3ZhbHVlcyA9IF9tbV9sb2FkX3NpMTI4KChjb25zdCBfX20xMjhpKil0b3ApOworICBpbnQgajsKKyAgZm9yIChqID0gMDsgaiA8IDE2OyArK2opIHsKKyAgICBfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkqKShkc3QgKyBqICogQlBTKSwgdG9wX3ZhbHVlcyk7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVmVydGljYWxQcmVkX1NTRTIodWludDhfdCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdG9wLCBpbnQgc2l6ZSkgeworICBpZiAodG9wICE9IE5VTEwpIHsKKyAgICBpZiAoc2l6ZSA9PSA4KSB7CisgICAgICBWRTh1dl9TU0UyKGRzdCwgdG9wKTsKKyAgICB9IGVsc2UgeworICAgICAgVkUxNl9TU0UyKGRzdCwgdG9wKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgRmlsbF9TU0UyKGRzdCwgMTI3LCBzaXplKTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBIRTh1dl9TU0UyKHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogbGVmdCkgeworICBpbnQgajsKKyAgZm9yIChqID0gMDsgaiA8IDg7ICsraikgeworICAgIGNvbnN0IF9fbTEyOGkgdmFsdWVzID0gX21tX3NldDFfZXBpOChsZWZ0W2pdKTsKKyAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKilkc3QsIHZhbHVlcyk7CisgICAgZHN0ICs9IEJQUzsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBIRTE2X1NTRTIodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiBsZWZ0KSB7CisgIGludCBqOworICBmb3IgKGogPSAwOyBqIDwgMTY7ICsraikgeworICAgIGNvbnN0IF9fbTEyOGkgdmFsdWVzID0gX21tX3NldDFfZXBpOChsZWZ0W2pdKTsKKyAgICBfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkqKWRzdCwgdmFsdWVzKTsKKyAgICBkc3QgKz0gQlBTOworICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEhvcml6b250YWxQcmVkX1NTRTIodWludDhfdCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBsZWZ0LCBpbnQgc2l6ZSkgeworICBpZiAobGVmdCAhPSBOVUxMKSB7CisgICAgaWYgKHNpemUgPT0gOCkgeworICAgICAgSEU4dXZfU1NFMihkc3QsIGxlZnQpOworICAgIH0gZWxzZSB7CisgICAgICBIRTE2X1NTRTIoZHN0LCBsZWZ0KTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgRmlsbF9TU0UyKGRzdCwgMTI5LCBzaXplKTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBUTV9TU0UyKHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdG9wLCBpbnQgc2l6ZSkgeworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBpbnQgeTsKKyAgaWYgKHNpemUgPT0gOCkgeworICAgIGNvbnN0IF9fbTEyOGkgdG9wX3ZhbHVlcyA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopdG9wKTsKKyAgICBjb25zdCBfX20xMjhpIHRvcF9iYXNlID0gX21tX3VucGFja2xvX2VwaTgodG9wX3ZhbHVlcywgemVybyk7CisgICAgZm9yICh5ID0gMDsgeSA8IDg7ICsreSwgZHN0ICs9IEJQUykgeworICAgICAgY29uc3QgaW50IHZhbCA9IGxlZnRbeV0gLSBsZWZ0Wy0xXTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYmFzZSA9IF9tbV9zZXQxX2VwaTE2KHZhbCk7CisgICAgICBjb25zdCBfX20xMjhpIG91dCA9IF9tbV9wYWNrdXNfZXBpMTYoX21tX2FkZF9lcGkxNihiYXNlLCB0b3BfYmFzZSksIHplcm8pOworICAgICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopZHN0LCBvdXQpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBjb25zdCBfX20xMjhpIHRvcF92YWx1ZXMgPSBfbW1fbG9hZF9zaTEyOCgoY29uc3QgX19tMTI4aSopdG9wKTsKKyAgICBjb25zdCBfX20xMjhpIHRvcF9iYXNlXzAgPSBfbW1fdW5wYWNrbG9fZXBpOCh0b3BfdmFsdWVzLCB6ZXJvKTsKKyAgICBjb25zdCBfX20xMjhpIHRvcF9iYXNlXzEgPSBfbW1fdW5wYWNraGlfZXBpOCh0b3BfdmFsdWVzLCB6ZXJvKTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgMTY7ICsreSwgZHN0ICs9IEJQUykgeworICAgICAgY29uc3QgaW50IHZhbCA9IGxlZnRbeV0gLSBsZWZ0Wy0xXTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYmFzZSA9IF9tbV9zZXQxX2VwaTE2KHZhbCk7CisgICAgICBjb25zdCBfX20xMjhpIG91dF8wID0gX21tX2FkZF9lcGkxNihiYXNlLCB0b3BfYmFzZV8wKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgb3V0XzEgPSBfbW1fYWRkX2VwaTE2KGJhc2UsIHRvcF9iYXNlXzEpOworICAgICAgY29uc3QgX19tMTI4aSBvdXQgPSBfbW1fcGFja3VzX2VwaTE2KG91dF8wLCBvdXRfMSk7CisgICAgICBfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkqKWRzdCwgb3V0KTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVHJ1ZU1vdGlvbl9TU0UyKHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3AsIGludCBzaXplKSB7CisgIGlmIChsZWZ0ICE9IE5VTEwpIHsKKyAgICBpZiAodG9wICE9IE5VTEwpIHsKKyAgICAgIFRNX1NTRTIoZHN0LCBsZWZ0LCB0b3AsIHNpemUpOworICAgIH0gZWxzZSB7CisgICAgICBIb3Jpem9udGFsUHJlZF9TU0UyKGRzdCwgbGVmdCwgc2l6ZSk7CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIHRydWUgbW90aW9uIHdpdGhvdXQgbGVmdCBzYW1wbGVzIChoZW5jZTogd2l0aCBkZWZhdWx0IDEyOSB2YWx1ZSkKKyAgICAvLyBpcyBlcXVpdmFsZW50IHRvIFZFIHByZWRpY3Rpb24gd2hlcmUgeW91IGp1c3QgY29weSB0aGUgdG9wIHNhbXBsZXMuCisgICAgLy8gTm90ZSB0aGF0IGlmIHRvcCBzYW1wbGVzIGFyZSBub3QgYXZhaWxhYmxlLCB0aGUgZGVmYXVsdCB2YWx1ZSBpcworICAgIC8vIHRoZW4gMTI5LCBhbmQgbm90IDEyNyBhcyBpbiB0aGUgVmVydGljYWxQcmVkIGNhc2UuCisgICAgaWYgKHRvcCAhPSBOVUxMKSB7CisgICAgICBWZXJ0aWNhbFByZWRfU1NFMihkc3QsIHRvcCwgc2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEZpbGxfU1NFMihkc3QsIDEyOSwgc2l6ZSk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIERDOHV2X1NTRTIodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgY29uc3QgX19tMTI4aSB0b3BfdmFsdWVzID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKil0b3ApOworICBjb25zdCBfX20xMjhpIGxlZnRfdmFsdWVzID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKilsZWZ0KTsKKyAgY29uc3QgX19tMTI4aSBjb21iaW5lZCA9IF9tbV91bnBhY2tsb19lcGk2NCh0b3BfdmFsdWVzLCBsZWZ0X3ZhbHVlcyk7CisgIGNvbnN0IGludCBEQyA9IFZQOEhvcml6b250YWxBZGQ4YigmY29tYmluZWQpICsgODsKKyAgUHV0OHg4dXZfU1NFMihEQyA+PiA0LCBkc3QpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEQzh1dk5vTGVmdF9TU0UyKHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogdG9wKSB7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGNvbnN0IF9fbTEyOGkgdG9wX3ZhbHVlcyA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopdG9wKTsKKyAgY29uc3QgX19tMTI4aSBzdW0gPSBfbW1fc2FkX2VwdTgodG9wX3ZhbHVlcywgemVybyk7CisgIGNvbnN0IGludCBEQyA9IF9tbV9jdnRzaTEyOF9zaTMyKHN1bSkgKyA0OworICBQdXQ4eDh1dl9TU0UyKERDID4+IDMsIGRzdCk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIERDOHV2Tm9Ub3BfU1NFMih1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIGxlZnQpIHsKKyAgLy8gJ2xlZnQnIGlzIGNvbnRpZ3VvdXMgc28gd2UgY2FuIHJldXNlIHRoZSB0b3Agc3VtbWF0aW9uLgorICBEQzh1dk5vTGVmdF9TU0UyKGRzdCwgbGVmdCk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIERDOHV2Tm9Ub3BMZWZ0X1NTRTIodWludDhfdCogZHN0KSB7CisgIFB1dDh4OHV2X1NTRTIoMHg4MCwgZHN0KTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgREM4dXZNb2RlX1NTRTIodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdG9wKSB7CisgIGlmICh0b3AgIT0gTlVMTCkgeworICAgIGlmIChsZWZ0ICE9IE5VTEwpIHsgIC8vIHRvcCBhbmQgbGVmdCBwcmVzZW50CisgICAgICBEQzh1dl9TU0UyKGRzdCwgbGVmdCwgdG9wKTsKKyAgICB9IGVsc2UgeyAgLy8gdG9wLCBidXQgbm8gbGVmdAorICAgICAgREM4dXZOb0xlZnRfU1NFMihkc3QsIHRvcCk7CisgICAgfQorICB9IGVsc2UgaWYgKGxlZnQgIT0gTlVMTCkgeyAgLy8gbGVmdCBidXQgbm8gdG9wCisgICAgREM4dXZOb1RvcF9TU0UyKGRzdCwgbGVmdCk7CisgIH0gZWxzZSB7ICAvLyBubyB0b3AsIG5vIGxlZnQsIG5vdGhpbmcuCisgICAgREM4dXZOb1RvcExlZnRfU1NFMihkc3QpOworICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIERDMTZfU1NFMih1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdG9wKSB7CisgIGNvbnN0IF9fbTEyOGkgdG9wX3JvdyA9IF9tbV9sb2FkX3NpMTI4KChjb25zdCBfX20xMjhpKil0b3ApOworICBjb25zdCBfX20xMjhpIGxlZnRfcm93ID0gX21tX2xvYWRfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKWxlZnQpOworICBjb25zdCBpbnQgREMgPQorICAgICAgVlA4SG9yaXpvbnRhbEFkZDhiKCZ0b3Bfcm93KSArIFZQOEhvcml6b250YWxBZGQ4YigmbGVmdF9yb3cpICsgMTY7CisgIFB1dDE2X1NTRTIoREMgPj4gNSwgZHN0KTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgREMxNk5vTGVmdF9TU0UyKHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogdG9wKSB7CisgIGNvbnN0IF9fbTEyOGkgdG9wX3JvdyA9IF9tbV9sb2FkX3NpMTI4KChjb25zdCBfX20xMjhpKil0b3ApOworICBjb25zdCBpbnQgREMgPSBWUDhIb3Jpem9udGFsQWRkOGIoJnRvcF9yb3cpICsgODsKKyAgUHV0MTZfU1NFMihEQyA+PiA0LCBkc3QpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEQzE2Tm9Ub3BfU1NFMih1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIGxlZnQpIHsKKyAgLy8gJ2xlZnQnIGlzIGNvbnRpZ3VvdXMgc28gd2UgY2FuIHJldXNlIHRoZSB0b3Agc3VtbWF0aW9uLgorICBEQzE2Tm9MZWZ0X1NTRTIoZHN0LCBsZWZ0KTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgREMxNk5vVG9wTGVmdF9TU0UyKHVpbnQ4X3QqIGRzdCkgeworICBQdXQxNl9TU0UyKDB4ODAsIGRzdCk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIERDMTZNb2RlX1NTRTIodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgaWYgKHRvcCAhPSBOVUxMKSB7CisgICAgaWYgKGxlZnQgIT0gTlVMTCkgeyAgLy8gdG9wIGFuZCBsZWZ0IHByZXNlbnQKKyAgICAgIERDMTZfU1NFMihkc3QsIGxlZnQsIHRvcCk7CisgICAgfSBlbHNlIHsgIC8vIHRvcCwgYnV0IG5vIGxlZnQKKyAgICAgIERDMTZOb0xlZnRfU1NFMihkc3QsIHRvcCk7CisgICAgfQorICB9IGVsc2UgaWYgKGxlZnQgIT0gTlVMTCkgeyAgLy8gbGVmdCBidXQgbm8gdG9wCisgICAgREMxNk5vVG9wX1NTRTIoZHN0LCBsZWZ0KTsKKyAgfSBlbHNlIHsgIC8vIG5vIHRvcCwgbm8gbGVmdCwgbm90aGluZy4KKyAgICBEQzE2Tm9Ub3BMZWZ0X1NTRTIoZHN0KTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gNHg0IHByZWRpY3Rpb25zCisKKyNkZWZpbmUgRFNUKHgsIHkpIGRzdFsoeCkgKyAoeSkgKiBCUFNdCisjZGVmaW5lIEFWRzMoYSwgYiwgYykgKCgoYSkgKyAyICogKGIpICsgKGMpICsgMikgPj4gMikKKyNkZWZpbmUgQVZHMihhLCBiKSAoKChhKSArIChiKSArIDEpID4+IDEpCisKKy8vIFdlIHVzZSB0aGUgZm9sbG93aW5nIDhiLWFyaXRobWV0aWMgdHJpY2tzOgorLy8gICAgIChhICsgMiAqIGIgKyBjICsgMikgPj4gMiA9IChBQyArIGIgKyAxKSA+PiAxCisvLyAgIHdoZXJlOiBBQyA9IChhICsgYykgPj4gMSA9IFsoYSArIGMgKyAxKSA+PiAxXSAtIFsoYV5jKSAmIDFdCisvLyBhbmQ6CisvLyAgICAgKGEgKyAyICogYiArIGMgKyAyKSA+PiAyID0gKEFCICsgQkMgKyAxKSA+PiAxIC0gKGFifGJjKSZsc2IKKy8vICAgd2hlcmU6IEFDID0gKGEgKyBiICsgMSkgPj4gMSwgICBCQyA9IChiICsgYyArIDEpID4+IDEKKy8vICAgYW5kIGFiID0gYSBeIGIsIGJjID0gYiBeIGMsIGxzYiA9IChBQ15CQykmMQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWRTRfU1NFMih1aW50OF90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3ApIHsgIC8vIHZlcnRpY2FsCisgIGNvbnN0IF9fbTEyOGkgb25lID0gX21tX3NldDFfZXBpOCgxKTsKKyAgY29uc3QgX19tMTI4aSBBQkNERUZHSCA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopKHRvcCAtIDEpKTsKKyAgY29uc3QgX19tMTI4aSBCQ0RFRkdIMCA9IF9tbV9zcmxpX3NpMTI4KEFCQ0RFRkdILCAxKTsKKyAgY29uc3QgX19tMTI4aSBDREVGR0gwMCA9IF9tbV9zcmxpX3NpMTI4KEFCQ0RFRkdILCAyKTsKKyAgY29uc3QgX19tMTI4aSBhID0gX21tX2F2Z19lcHU4KEFCQ0RFRkdILCBDREVGR0gwMCk7CisgIGNvbnN0IF9fbTEyOGkgbHNiID0gX21tX2FuZF9zaTEyOChfbW1feG9yX3NpMTI4KEFCQ0RFRkdILCBDREVGR0gwMCksIG9uZSk7CisgIGNvbnN0IF9fbTEyOGkgYiA9IF9tbV9zdWJzX2VwdTgoYSwgbHNiKTsKKyAgY29uc3QgX19tMTI4aSBhdmcgPSBfbW1fYXZnX2VwdTgoYiwgQkNERUZHSDApOworICBjb25zdCB1aW50MzJfdCB2YWxzID0gX21tX2N2dHNpMTI4X3NpMzIoYXZnKTsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICBXZWJQVWludDMyVG9NZW0oZHN0ICsgaSAqIEJQUywgdmFscyk7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgSEU0X1NTRTIodWludDhfdCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdG9wKSB7ICAvLyBob3Jpem9udGFsCisgIGNvbnN0IGludCBYID0gdG9wWy0xXTsKKyAgY29uc3QgaW50IEkgPSB0b3BbLTJdOworICBjb25zdCBpbnQgSiA9IHRvcFstM107CisgIGNvbnN0IGludCBLID0gdG9wWy00XTsKKyAgY29uc3QgaW50IEwgPSB0b3BbLTVdOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMCAqIEJQUywgMHgwMTAxMDEwMVUgKiBBVkczKFgsIEksIEopKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDEgKiBCUFMsIDB4MDEwMTAxMDFVICogQVZHMyhJLCBKLCBLKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAyICogQlBTLCAweDAxMDEwMTAxVSAqIEFWRzMoSiwgSywgTCkpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMyAqIEJQUywgMHgwMTAxMDEwMVUgKiBBVkczKEssIEwsIEwpKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgREM0X1NTRTIodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgdWludDMyX3QgZGMgPSA0OworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgZGMgKz0gdG9wW2ldICsgdG9wWy01ICsgaV07CisgIEZpbGxfU1NFMihkc3QsIGRjID4+IDMsIDQpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBMRDRfU1NFMih1aW50OF90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3ApIHsgIC8vIERvd24tTGVmdAorICBjb25zdCBfX20xMjhpIG9uZSA9IF9tbV9zZXQxX2VwaTgoMSk7CisgIGNvbnN0IF9fbTEyOGkgQUJDREVGR0ggPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKXRvcCk7CisgIGNvbnN0IF9fbTEyOGkgQkNERUZHSDAgPSBfbW1fc3JsaV9zaTEyOChBQkNERUZHSCwgMSk7CisgIGNvbnN0IF9fbTEyOGkgQ0RFRkdIMDAgPSBfbW1fc3JsaV9zaTEyOChBQkNERUZHSCwgMik7CisgIGNvbnN0IF9fbTEyOGkgQ0RFRkdISDAgPSBfbW1faW5zZXJ0X2VwaTE2KENERUZHSDAwLCB0b3BbN10sIDMpOworICBjb25zdCBfX20xMjhpIGF2ZzEgPSBfbW1fYXZnX2VwdTgoQUJDREVGR0gsIENERUZHSEgwKTsKKyAgY29uc3QgX19tMTI4aSBsc2IgPSBfbW1fYW5kX3NpMTI4KF9tbV94b3Jfc2kxMjgoQUJDREVGR0gsIENERUZHSEgwKSwgb25lKTsKKyAgY29uc3QgX19tMTI4aSBhdmcyID0gX21tX3N1YnNfZXB1OChhdmcxLCBsc2IpOworICBjb25zdCBfX20xMjhpIGFiY2RlZmcgPSBfbW1fYXZnX2VwdTgoYXZnMiwgQkNERUZHSDApOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMCAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoICAgICAgICAgICAgICAgYWJjZGVmZyAgICApKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDEgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKF9tbV9zcmxpX3NpMTI4KGFiY2RlZmcsIDEpKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAyICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMihfbW1fc3JsaV9zaTEyOChhYmNkZWZnLCAyKSkpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMyAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoX21tX3NybGlfc2kxMjgoYWJjZGVmZywgMykpKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVlI0X1NTRTIodWludDhfdCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdG9wKSB7ICAvLyBWZXJ0aWNhbC1SaWdodAorICBjb25zdCBfX20xMjhpIG9uZSA9IF9tbV9zZXQxX2VwaTgoMSk7CisgIGNvbnN0IGludCBJID0gdG9wWy0yXTsKKyAgY29uc3QgaW50IEogPSB0b3BbLTNdOworICBjb25zdCBpbnQgSyA9IHRvcFstNF07CisgIGNvbnN0IGludCBYID0gdG9wWy0xXTsKKyAgY29uc3QgX19tMTI4aSBYQUJDRCA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopKHRvcCAtIDEpKTsKKyAgY29uc3QgX19tMTI4aSBBQkNEMCA9IF9tbV9zcmxpX3NpMTI4KFhBQkNELCAxKTsKKyAgY29uc3QgX19tMTI4aSBhYmNkID0gX21tX2F2Z19lcHU4KFhBQkNELCBBQkNEMCk7CisgIGNvbnN0IF9fbTEyOGkgX1hBQkNEID0gX21tX3NsbGlfc2kxMjgoWEFCQ0QsIDEpOworICBjb25zdCBfX20xMjhpIElYQUJDRCA9IF9tbV9pbnNlcnRfZXBpMTYoX1hBQkNELCBJIHwgKFggPDwgOCksIDApOworICBjb25zdCBfX20xMjhpIGF2ZzEgPSBfbW1fYXZnX2VwdTgoSVhBQkNELCBBQkNEMCk7CisgIGNvbnN0IF9fbTEyOGkgbHNiID0gX21tX2FuZF9zaTEyOChfbW1feG9yX3NpMTI4KElYQUJDRCwgQUJDRDApLCBvbmUpOworICBjb25zdCBfX20xMjhpIGF2ZzIgPSBfbW1fc3Vic19lcHU4KGF2ZzEsIGxzYik7CisgIGNvbnN0IF9fbTEyOGkgZWZnaCA9IF9tbV9hdmdfZXB1OChhdmcyLCBYQUJDRCk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAwICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMiggICAgICAgICAgICAgICBhYmNkICAgICkpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMSAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoICAgICAgICAgICAgICAgZWZnaCAgICApKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDIgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKF9tbV9zbGxpX3NpMTI4KGFiY2QsIDEpKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAzICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMihfbW1fc2xsaV9zaTEyOChlZmdoLCAxKSkpOworCisgIC8vIHRoZXNlIHR3byBhcmUgaGFyZCB0byBpbXBsZW1lbnQgaW4gU1NFMiwgc28gd2Uga2VlcCB0aGUgQy12ZXJzaW9uOgorICBEU1QoMCwgMikgPSBBVkczKEosIEksIFgpOworICBEU1QoMCwgMykgPSBBVkczKEssIEosIEkpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWTDRfU1NFMih1aW50OF90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3ApIHsgIC8vIFZlcnRpY2FsLUxlZnQKKyAgY29uc3QgX19tMTI4aSBvbmUgPSBfbW1fc2V0MV9lcGk4KDEpOworICBjb25zdCBfX20xMjhpIEFCQ0RFRkdIID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKil0b3ApOworICBjb25zdCBfX20xMjhpIEJDREVGR0hfID0gX21tX3NybGlfc2kxMjgoQUJDREVGR0gsIDEpOworICBjb25zdCBfX20xMjhpIENERUZHSF9fID0gX21tX3NybGlfc2kxMjgoQUJDREVGR0gsIDIpOworICBjb25zdCBfX20xMjhpIGF2ZzEgPSBfbW1fYXZnX2VwdTgoQUJDREVGR0gsIEJDREVGR0hfKTsKKyAgY29uc3QgX19tMTI4aSBhdmcyID0gX21tX2F2Z19lcHU4KENERUZHSF9fLCBCQ0RFRkdIXyk7CisgIGNvbnN0IF9fbTEyOGkgYXZnMyA9IF9tbV9hdmdfZXB1OChhdmcxLCBhdmcyKTsKKyAgY29uc3QgX19tMTI4aSBsc2IxID0gX21tX2FuZF9zaTEyOChfbW1feG9yX3NpMTI4KGF2ZzEsIGF2ZzIpLCBvbmUpOworICBjb25zdCBfX20xMjhpIGFiID0gX21tX3hvcl9zaTEyOChBQkNERUZHSCwgQkNERUZHSF8pOworICBjb25zdCBfX20xMjhpIGJjID0gX21tX3hvcl9zaTEyOChDREVGR0hfXywgQkNERUZHSF8pOworICBjb25zdCBfX20xMjhpIGFiYmMgPSBfbW1fb3Jfc2kxMjgoYWIsIGJjKTsKKyAgY29uc3QgX19tMTI4aSBsc2IyID0gX21tX2FuZF9zaTEyOChhYmJjLCBsc2IxKTsKKyAgY29uc3QgX19tMTI4aSBhdmc0ID0gX21tX3N1YnNfZXB1OChhdmczLCBsc2IyKTsKKyAgY29uc3QgdWludDMyX3QgZXh0cmFfb3V0ID0gX21tX2N2dHNpMTI4X3NpMzIoX21tX3NybGlfc2kxMjgoYXZnNCwgNCkpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMCAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoICAgICAgICAgICAgICAgYXZnMSAgICApKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDEgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKCAgICAgICAgICAgICAgIGF2ZzQgICAgKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAyICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMihfbW1fc3JsaV9zaTEyOChhdmcxLCAxKSkpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMyAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoX21tX3NybGlfc2kxMjgoYXZnNCwgMSkpKTsKKworICAvLyB0aGVzZSB0d28gYXJlIGhhcmQgdG8gZ2V0IGFuZCBpcnJlZ3VsYXIKKyAgRFNUKDMsIDIpID0gKGV4dHJhX291dCA+PiAwKSAmIDB4ZmY7CisgIERTVCgzLCAzKSA9IChleHRyYV9vdXQgPj4gOCkgJiAweGZmOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBSRDRfU1NFMih1aW50OF90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3ApIHsgIC8vIERvd24tcmlnaHQKKyAgY29uc3QgX19tMTI4aSBvbmUgPSBfbW1fc2V0MV9lcGk4KDEpOworICBjb25zdCBfX20xMjhpIExLSklYQUJDID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikodG9wIC0gNSkpOworICBjb25zdCBfX20xMjhpIExLSklYQUJDRCA9IF9tbV9pbnNlcnRfZXBpMTYoTEtKSVhBQkMsIHRvcFszXSwgNCk7CisgIGNvbnN0IF9fbTEyOGkgS0pJWEFCQ0RfID0gX21tX3NybGlfc2kxMjgoTEtKSVhBQkNELCAxKTsKKyAgY29uc3QgX19tMTI4aSBKSVhBQkNEX18gPSBfbW1fc3JsaV9zaTEyOChMS0pJWEFCQ0QsIDIpOworICBjb25zdCBfX20xMjhpIGF2ZzEgPSBfbW1fYXZnX2VwdTgoSklYQUJDRF9fLCBMS0pJWEFCQ0QpOworICBjb25zdCBfX20xMjhpIGxzYiA9IF9tbV9hbmRfc2kxMjgoX21tX3hvcl9zaTEyOChKSVhBQkNEX18sIExLSklYQUJDRCksIG9uZSk7CisgIGNvbnN0IF9fbTEyOGkgYXZnMiA9IF9tbV9zdWJzX2VwdTgoYXZnMSwgbHNiKTsKKyAgY29uc3QgX19tMTI4aSBhYmNkZWZnID0gX21tX2F2Z19lcHU4KGF2ZzIsIEtKSVhBQkNEXyk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAzICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMiggICAgICAgICAgICAgICBhYmNkZWZnICAgICkpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMiAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoX21tX3NybGlfc2kxMjgoYWJjZGVmZywgMSkpKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDEgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKF9tbV9zcmxpX3NpMTI4KGFiY2RlZmcsIDIpKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAwICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMihfbW1fc3JsaV9zaTEyOChhYmNkZWZnLCAzKSkpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBIVTRfU1NFMih1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBjb25zdCBpbnQgSSA9IHRvcFstMl07CisgIGNvbnN0IGludCBKID0gdG9wWy0zXTsKKyAgY29uc3QgaW50IEsgPSB0b3BbLTRdOworICBjb25zdCBpbnQgTCA9IHRvcFstNV07CisgIERTVCgwLCAwKSA9ICAgICAgICAgICAgIEFWRzIoSSwgSik7CisgIERTVCgyLCAwKSA9IERTVCgwLCAxKSA9IEFWRzIoSiwgSyk7CisgIERTVCgyLCAxKSA9IERTVCgwLCAyKSA9IEFWRzIoSywgTCk7CisgIERTVCgxLCAwKSA9ICAgICAgICAgICAgIEFWRzMoSSwgSiwgSyk7CisgIERTVCgzLCAwKSA9IERTVCgxLCAxKSA9IEFWRzMoSiwgSywgTCk7CisgIERTVCgzLCAxKSA9IERTVCgxLCAyKSA9IEFWRzMoSywgTCwgTCk7CisgIERTVCgzLCAyKSA9IERTVCgyLCAyKSA9CisgIERTVCgwLCAzKSA9IERTVCgxLCAzKSA9IERTVCgyLCAzKSA9IERTVCgzLCAzKSA9IEw7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEhENF9TU0UyKHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogdG9wKSB7CisgIGNvbnN0IGludCBYID0gdG9wWy0xXTsKKyAgY29uc3QgaW50IEkgPSB0b3BbLTJdOworICBjb25zdCBpbnQgSiA9IHRvcFstM107CisgIGNvbnN0IGludCBLID0gdG9wWy00XTsKKyAgY29uc3QgaW50IEwgPSB0b3BbLTVdOworICBjb25zdCBpbnQgQSA9IHRvcFswXTsKKyAgY29uc3QgaW50IEIgPSB0b3BbMV07CisgIGNvbnN0IGludCBDID0gdG9wWzJdOworCisgIERTVCgwLCAwKSA9IERTVCgyLCAxKSA9IEFWRzIoSSwgWCk7CisgIERTVCgwLCAxKSA9IERTVCgyLCAyKSA9IEFWRzIoSiwgSSk7CisgIERTVCgwLCAyKSA9IERTVCgyLCAzKSA9IEFWRzIoSywgSik7CisgIERTVCgwLCAzKSAgICAgICAgICAgICA9IEFWRzIoTCwgSyk7CisKKyAgRFNUKDMsIDApICAgICAgICAgICAgID0gQVZHMyhBLCBCLCBDKTsKKyAgRFNUKDIsIDApICAgICAgICAgICAgID0gQVZHMyhYLCBBLCBCKTsKKyAgRFNUKDEsIDApID0gRFNUKDMsIDEpID0gQVZHMyhJLCBYLCBBKTsKKyAgRFNUKDEsIDEpID0gRFNUKDMsIDIpID0gQVZHMyhKLCBJLCBYKTsKKyAgRFNUKDEsIDIpID0gRFNUKDMsIDMpID0gQVZHMyhLLCBKLCBJKTsKKyAgRFNUKDEsIDMpICAgICAgICAgICAgID0gQVZHMyhMLCBLLCBKKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVE00X1NTRTIodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgY29uc3QgX19tMTI4aSB0b3BfdmFsdWVzID0gX21tX2N2dHNpMzJfc2kxMjgoV2ViUE1lbVRvVWludDMyKHRvcCkpOworICBjb25zdCBfX20xMjhpIHRvcF9iYXNlID0gX21tX3VucGFja2xvX2VwaTgodG9wX3ZhbHVlcywgemVybyk7CisgIGludCB5OworICBmb3IgKHkgPSAwOyB5IDwgNDsgKyt5LCBkc3QgKz0gQlBTKSB7CisgICAgY29uc3QgaW50IHZhbCA9IHRvcFstMiAtIHldIC0gdG9wWy0xXTsKKyAgICBjb25zdCBfX20xMjhpIGJhc2UgPSBfbW1fc2V0MV9lcGkxNih2YWwpOworICAgIGNvbnN0IF9fbTEyOGkgb3V0ID0gX21tX3BhY2t1c19lcGkxNihfbW1fYWRkX2VwaTE2KGJhc2UsIHRvcF9iYXNlKSwgemVybyk7CisgICAgV2ViUFVpbnQzMlRvTWVtKGRzdCwgX21tX2N2dHNpMTI4X3NpMzIob3V0KSk7CisgIH0KK30KKworI3VuZGVmIERTVAorI3VuZGVmIEFWRzMKKyN1bmRlZiBBVkcyCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsdW1hIDR4NCBwcmVkaWN0aW9uCisKKy8vIExlZnQgc2FtcGxlcyBhcmUgdG9wWy01IC4uIC0yXSwgdG9wX2xlZnQgaXMgdG9wWy0xXSwgdG9wIGFyZQorLy8gbG9jYXRlZCBhdCB0b3BbMC4uM10sIGFuZCB0b3AgcmlnaHQgaXMgdG9wWzQuLjddCitzdGF0aWMgdm9pZCBJbnRyYTRQcmVkc19TU0UyKHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogdG9wKSB7CisgIERDNF9TU0UyKEk0REM0ICsgZHN0LCB0b3ApOworICBUTTRfU1NFMihJNFRNNCArIGRzdCwgdG9wKTsKKyAgVkU0X1NTRTIoSTRWRTQgKyBkc3QsIHRvcCk7CisgIEhFNF9TU0UyKEk0SEU0ICsgZHN0LCB0b3ApOworICBSRDRfU1NFMihJNFJENCArIGRzdCwgdG9wKTsKKyAgVlI0X1NTRTIoSTRWUjQgKyBkc3QsIHRvcCk7CisgIExENF9TU0UyKEk0TEQ0ICsgZHN0LCB0b3ApOworICBWTDRfU1NFMihJNFZMNCArIGRzdCwgdG9wKTsKKyAgSEQ0X1NTRTIoSTRIRDQgKyBkc3QsIHRvcCk7CisgIEhVNF9TU0UyKEk0SFU0ICsgZHN0LCB0b3ApOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ2hyb21hIDh4OCBwcmVkaWN0aW9uIChwYXJhZ3JhcGggMTIuMikKKworc3RhdGljIHZvaWQgSW50cmFDaHJvbWFQcmVkc19TU0UyKHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgLy8gVSBibG9jaworICBEQzh1dk1vZGVfU1NFMihDOERDOCArIGRzdCwgbGVmdCwgdG9wKTsKKyAgVmVydGljYWxQcmVkX1NTRTIoQzhWRTggKyBkc3QsIHRvcCwgOCk7CisgIEhvcml6b250YWxQcmVkX1NTRTIoQzhIRTggKyBkc3QsIGxlZnQsIDgpOworICBUcnVlTW90aW9uX1NTRTIoQzhUTTggKyBkc3QsIGxlZnQsIHRvcCwgOCk7CisgIC8vIFYgYmxvY2sKKyAgZHN0ICs9IDg7CisgIGlmICh0b3AgIT0gTlVMTCkgdG9wICs9IDg7CisgIGlmIChsZWZ0ICE9IE5VTEwpIGxlZnQgKz0gMTY7CisgIERDOHV2TW9kZV9TU0UyKEM4REM4ICsgZHN0LCBsZWZ0LCB0b3ApOworICBWZXJ0aWNhbFByZWRfU1NFMihDOFZFOCArIGRzdCwgdG9wLCA4KTsKKyAgSG9yaXpvbnRhbFByZWRfU1NFMihDOEhFOCArIGRzdCwgbGVmdCwgOCk7CisgIFRydWVNb3Rpb25fU1NFMihDOFRNOCArIGRzdCwgbGVmdCwgdG9wLCA4KTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGx1bWEgMTZ4MTYgcHJlZGljdGlvbiAocGFyYWdyYXBoIDEyLjMpCisKK3N0YXRpYyB2b2lkIEludHJhMTZQcmVkc19TU0UyKHVpbnQ4X3QqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGxlZnQsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBEQzE2TW9kZV9TU0UyKEkxNkRDMTYgKyBkc3QsIGxlZnQsIHRvcCk7CisgIFZlcnRpY2FsUHJlZF9TU0UyKEkxNlZFMTYgKyBkc3QsIHRvcCwgMTYpOworICBIb3Jpem9udGFsUHJlZF9TU0UyKEkxNkhFMTYgKyBkc3QsIGxlZnQsIDE2KTsKKyAgVHJ1ZU1vdGlvbl9TU0UyKEkxNlRNMTYgKyBkc3QsIGxlZnQsIHRvcCwgMTYpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWV0cmljCisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFN1YnRyYWN0QW5kQWNjdW11bGF0ZV9TU0UyKGNvbnN0IF9fbTEyOGkgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IHN1bSkgeworICAvLyB0YWtlIGFicyhhLWIpIGluIDhiCisgIGNvbnN0IF9fbTEyOGkgYV9iID0gX21tX3N1YnNfZXB1OChhLCBiKTsKKyAgY29uc3QgX19tMTI4aSBiX2EgPSBfbW1fc3Vic19lcHU4KGIsIGEpOworICBjb25zdCBfX20xMjhpIGFic19hX2IgPSBfbW1fb3Jfc2kxMjgoYV9iLCBiX2EpOworICAvLyB6ZXJvLWV4dGVuZCB0byAxNmIKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgY29uc3QgX19tMTI4aSBDMCA9IF9tbV91bnBhY2tsb19lcGk4KGFic19hX2IsIHplcm8pOworICBjb25zdCBfX20xMjhpIEMxID0gX21tX3VucGFja2hpX2VwaTgoYWJzX2FfYiwgemVybyk7CisgIC8vIG11bHRpcGx5IHdpdGggc2VsZgorICBjb25zdCBfX20xMjhpIHN1bTEgPSBfbW1fbWFkZF9lcGkxNihDMCwgQzApOworICBjb25zdCBfX20xMjhpIHN1bTIgPSBfbW1fbWFkZF9lcGkxNihDMSwgQzEpOworICAqc3VtID0gX21tX2FkZF9lcGkzMihzdW0xLCBzdW0yKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBTU0VfMTZ4Tl9TU0UyKGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9wYWlycykgeworICBfX20xMjhpIHN1bSA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGludDMyX3QgdG1wWzRdOworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BhaXJzOyArK2kpIHsKKyAgICBjb25zdCBfX20xMjhpIGEwID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmYVtCUFMgKiAwXSk7CisgICAgY29uc3QgX19tMTI4aSBiMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmJbQlBTICogMF0pOworICAgIGNvbnN0IF9fbTEyOGkgYTEgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZhW0JQUyAqIDFdKTsKKyAgICBjb25zdCBfX20xMjhpIGIxID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmYltCUFMgKiAxXSk7CisgICAgX19tMTI4aSBzdW0xLCBzdW0yOworICAgIFN1YnRyYWN0QW5kQWNjdW11bGF0ZV9TU0UyKGEwLCBiMCwgJnN1bTEpOworICAgIFN1YnRyYWN0QW5kQWNjdW11bGF0ZV9TU0UyKGExLCBiMSwgJnN1bTIpOworICAgIHN1bSA9IF9tbV9hZGRfZXBpMzIoc3VtLCBfbW1fYWRkX2VwaTMyKHN1bTEsIHN1bTIpKTsKKyAgICBhICs9IDIgKiBCUFM7CisgICAgYiArPSAyICogQlBTOworICB9CisgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKXRtcCwgc3VtKTsKKyAgcmV0dXJuICh0bXBbM10gKyB0bXBbMl0gKyB0bXBbMV0gKyB0bXBbMF0pOworfQorCitzdGF0aWMgaW50IFNTRTE2eDE2X1NTRTIoY29uc3QgdWludDhfdCogYSwgY29uc3QgdWludDhfdCogYikgeworICByZXR1cm4gU1NFXzE2eE5fU1NFMihhLCBiLCA4KTsKK30KKworc3RhdGljIGludCBTU0UxNng4X1NTRTIoY29uc3QgdWludDhfdCogYSwgY29uc3QgdWludDhfdCogYikgeworICByZXR1cm4gU1NFXzE2eE5fU1NFMihhLCBiLCA0KTsKK30KKworI2RlZmluZSBMT0FEXzh4MTZiKHB0cikgXAorICBfbW1fdW5wYWNrbG9fZXBpOChfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKShwdHIpKSwgemVybykKKworc3RhdGljIGludCBTU0U4eDhfU1NFMihjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiBiKSB7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGludCBudW1fcGFpcnMgPSA0OworICBfX20xMjhpIHN1bSA9IHplcm87CisgIGludDMyX3QgdG1wWzRdOworICB3aGlsZSAobnVtX3BhaXJzLS0gPiAwKSB7CisgICAgY29uc3QgX19tMTI4aSBhMCA9IExPQURfOHgxNmIoJmFbQlBTICogMF0pOworICAgIGNvbnN0IF9fbTEyOGkgYTEgPSBMT0FEXzh4MTZiKCZhW0JQUyAqIDFdKTsKKyAgICBjb25zdCBfX20xMjhpIGIwID0gTE9BRF84eDE2YigmYltCUFMgKiAwXSk7CisgICAgY29uc3QgX19tMTI4aSBiMSA9IExPQURfOHgxNmIoJmJbQlBTICogMV0pOworICAgIC8vIHN1YnRyYWN0CisgICAgY29uc3QgX19tMTI4aSBjMCA9IF9tbV9zdWJzX2VwaTE2KGEwLCBiMCk7CisgICAgY29uc3QgX19tMTI4aSBjMSA9IF9tbV9zdWJzX2VwaTE2KGExLCBiMSk7CisgICAgLy8gbXVsdGlwbHkvYWNjdW11bGF0ZSB3aXRoIHNlbGYKKyAgICBjb25zdCBfX20xMjhpIGQwID0gX21tX21hZGRfZXBpMTYoYzAsIGMwKTsKKyAgICBjb25zdCBfX20xMjhpIGQxID0gX21tX21hZGRfZXBpMTYoYzEsIGMxKTsKKyAgICAvLyBjb2xsZWN0CisgICAgY29uc3QgX19tMTI4aSBzdW0wMSA9IF9tbV9hZGRfZXBpMzIoZDAsIGQxKTsKKyAgICBzdW0gPSBfbW1fYWRkX2VwaTMyKHN1bSwgc3VtMDEpOworICAgIGEgKz0gMiAqIEJQUzsKKyAgICBiICs9IDIgKiBCUFM7CisgIH0KKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopdG1wLCBzdW0pOworICByZXR1cm4gKHRtcFszXSArIHRtcFsyXSArIHRtcFsxXSArIHRtcFswXSk7Cit9CisjdW5kZWYgTE9BRF84eDE2YgorCitzdGF0aWMgaW50IFNTRTR4NF9TU0UyKGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIpIHsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKworICAvLyBMb2FkIHZhbHVlcy4gTm90ZSB0aGF0IHdlIHJlYWQgOCBwaXhlbHMgaW5zdGVhZCBvZiA0LAorICAvLyBidXQgdGhlIGEvYiBidWZmZXJzIGFyZSBvdmVyLWFsbG9jYXRlZCB0byB0aGF0IGVmZmVjdC4KKyAgY29uc3QgX19tMTI4aSBhMCA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmFbQlBTICogMF0pOworICBjb25zdCBfX20xMjhpIGExID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmYVtCUFMgKiAxXSk7CisgIGNvbnN0IF9fbTEyOGkgYTIgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZhW0JQUyAqIDJdKTsKKyAgY29uc3QgX19tMTI4aSBhMyA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmFbQlBTICogM10pOworICBjb25zdCBfX20xMjhpIGIwID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmYltCUFMgKiAwXSk7CisgIGNvbnN0IF9fbTEyOGkgYjEgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZiW0JQUyAqIDFdKTsKKyAgY29uc3QgX19tMTI4aSBiMiA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmJbQlBTICogMl0pOworICBjb25zdCBfX20xMjhpIGIzID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmYltCUFMgKiAzXSk7CisgIC8vIENvbWJpbmUgcGFpciBvZiBsaW5lcy4KKyAgY29uc3QgX19tMTI4aSBhMDEgPSBfbW1fdW5wYWNrbG9fZXBpMzIoYTAsIGExKTsKKyAgY29uc3QgX19tMTI4aSBhMjMgPSBfbW1fdW5wYWNrbG9fZXBpMzIoYTIsIGEzKTsKKyAgY29uc3QgX19tMTI4aSBiMDEgPSBfbW1fdW5wYWNrbG9fZXBpMzIoYjAsIGIxKTsKKyAgY29uc3QgX19tMTI4aSBiMjMgPSBfbW1fdW5wYWNrbG9fZXBpMzIoYjIsIGIzKTsKKyAgLy8gQ29udmVydCB0byAxNmIuCisgIGNvbnN0IF9fbTEyOGkgYTAxcyA9IF9tbV91bnBhY2tsb19lcGk4KGEwMSwgemVybyk7CisgIGNvbnN0IF9fbTEyOGkgYTIzcyA9IF9tbV91bnBhY2tsb19lcGk4KGEyMywgemVybyk7CisgIGNvbnN0IF9fbTEyOGkgYjAxcyA9IF9tbV91bnBhY2tsb19lcGk4KGIwMSwgemVybyk7CisgIGNvbnN0IF9fbTEyOGkgYjIzcyA9IF9tbV91bnBhY2tsb19lcGk4KGIyMywgemVybyk7CisgIC8vIHN1YnRyYWN0LCBzcXVhcmUgYW5kIGFjY3VtdWxhdGUKKyAgY29uc3QgX19tMTI4aSBkMCA9IF9tbV9zdWJzX2VwaTE2KGEwMXMsIGIwMXMpOworICBjb25zdCBfX20xMjhpIGQxID0gX21tX3N1YnNfZXBpMTYoYTIzcywgYjIzcyk7CisgIGNvbnN0IF9fbTEyOGkgZTAgPSBfbW1fbWFkZF9lcGkxNihkMCwgZDApOworICBjb25zdCBfX20xMjhpIGUxID0gX21tX21hZGRfZXBpMTYoZDEsIGQxKTsKKyAgY29uc3QgX19tMTI4aSBzdW0gPSBfbW1fYWRkX2VwaTMyKGUwLCBlMSk7CisKKyAgaW50MzJfdCB0bXBbNF07CisgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKXRtcCwgc3VtKTsKKyAgcmV0dXJuICh0bXBbM10gKyB0bXBbMl0gKyB0bXBbMV0gKyB0bXBbMF0pOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBNZWFuMTZ4NF9TU0UyKGNvbnN0IHVpbnQ4X3QqIHJlZiwgdWludDMyX3QgZGNbNF0pIHsKKyAgY29uc3QgX19tMTI4aSBtYXNrID0gX21tX3NldDFfZXBpMTYoMHgwMGZmKTsKKyAgY29uc3QgX19tMTI4aSBhMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnJlZltCUFMgKiAwXSk7CisgIGNvbnN0IF9fbTEyOGkgYTEgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZyZWZbQlBTICogMV0pOworICBjb25zdCBfX20xMjhpIGEyID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmcmVmW0JQUyAqIDJdKTsKKyAgY29uc3QgX19tMTI4aSBhMyA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnJlZltCUFMgKiAzXSk7CisgIGNvbnN0IF9fbTEyOGkgYjAgPSBfbW1fc3JsaV9lcGkxNihhMCwgOCk7ICAgICAvLyBoaSBieXRlCisgIGNvbnN0IF9fbTEyOGkgYjEgPSBfbW1fc3JsaV9lcGkxNihhMSwgOCk7CisgIGNvbnN0IF9fbTEyOGkgYjIgPSBfbW1fc3JsaV9lcGkxNihhMiwgOCk7CisgIGNvbnN0IF9fbTEyOGkgYjMgPSBfbW1fc3JsaV9lcGkxNihhMywgOCk7CisgIGNvbnN0IF9fbTEyOGkgYzAgPSBfbW1fYW5kX3NpMTI4KGEwLCBtYXNrKTsgICAvLyBsbyBieXRlCisgIGNvbnN0IF9fbTEyOGkgYzEgPSBfbW1fYW5kX3NpMTI4KGExLCBtYXNrKTsKKyAgY29uc3QgX19tMTI4aSBjMiA9IF9tbV9hbmRfc2kxMjgoYTIsIG1hc2spOworICBjb25zdCBfX20xMjhpIGMzID0gX21tX2FuZF9zaTEyOChhMywgbWFzayk7CisgIGNvbnN0IF9fbTEyOGkgZDAgPSBfbW1fYWRkX2VwaTMyKGIwLCBjMCk7CisgIGNvbnN0IF9fbTEyOGkgZDEgPSBfbW1fYWRkX2VwaTMyKGIxLCBjMSk7CisgIGNvbnN0IF9fbTEyOGkgZDIgPSBfbW1fYWRkX2VwaTMyKGIyLCBjMik7CisgIGNvbnN0IF9fbTEyOGkgZDMgPSBfbW1fYWRkX2VwaTMyKGIzLCBjMyk7CisgIGNvbnN0IF9fbTEyOGkgZTAgPSBfbW1fYWRkX2VwaTMyKGQwLCBkMSk7CisgIGNvbnN0IF9fbTEyOGkgZTEgPSBfbW1fYWRkX2VwaTMyKGQyLCBkMyk7CisgIGNvbnN0IF9fbTEyOGkgZjAgPSBfbW1fYWRkX2VwaTMyKGUwLCBlMSk7CisgIHVpbnQxNl90IHRtcFs4XTsKKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopdG1wLCBmMCk7CisgIGRjWzBdID0gdG1wWzBdICsgdG1wWzFdOworICBkY1sxXSA9IHRtcFsyXSArIHRtcFszXTsKKyAgZGNbMl0gPSB0bXBbNF0gKyB0bXBbNV07CisgIGRjWzNdID0gdG1wWzZdICsgdG1wWzddOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVGV4dHVyZSBkaXN0b3J0aW9uCisvLworLy8gV2UgdHJ5IHRvIG1hdGNoIHRoZSBzcGVjdHJhbCBjb250ZW50ICh3ZWlnaHRlZCkgYmV0d2VlbiBzb3VyY2UgYW5kCisvLyByZWNvbnN0cnVjdGVkIHNhbXBsZXMuCisKKy8vIEhhZGFtYXJkIHRyYW5zZm9ybQorLy8gUmV0dXJucyB0aGUgd2VpZ2h0ZWQgc3VtIG9mIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMuCisvLyB3W10gY29udGFpbnMgYSByb3ctbWFqb3IgNCBieSA0IHN5bW1ldHJpYyBtYXRyaXguCitzdGF0aWMgaW50IFRUcmFuc2Zvcm1fU1NFMihjb25zdCB1aW50OF90KiBpbkEsIGNvbnN0IHVpbnQ4X3QqIGluQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90KiBjb25zdCB3KSB7CisgIGludDMyX3Qgc3VtWzRdOworICBfX20xMjhpIHRtcF8wLCB0bXBfMSwgdG1wXzIsIHRtcF8zOworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworCisgIC8vIExvYWQgYW5kIGNvbWJpbmUgaW5wdXRzLgorICB7CisgICAgY29uc3QgX19tMTI4aSBpbkFfMCA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmluQVtCUFMgKiAwXSk7CisgICAgY29uc3QgX19tMTI4aSBpbkFfMSA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmluQVtCUFMgKiAxXSk7CisgICAgY29uc3QgX19tMTI4aSBpbkFfMiA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmluQVtCUFMgKiAyXSk7CisgICAgY29uc3QgX19tMTI4aSBpbkFfMyA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmluQVtCUFMgKiAzXSk7CisgICAgY29uc3QgX19tMTI4aSBpbkJfMCA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmluQltCUFMgKiAwXSk7CisgICAgY29uc3QgX19tMTI4aSBpbkJfMSA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmluQltCUFMgKiAxXSk7CisgICAgY29uc3QgX19tMTI4aSBpbkJfMiA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmluQltCUFMgKiAyXSk7CisgICAgY29uc3QgX19tMTI4aSBpbkJfMyA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmluQltCUFMgKiAzXSk7CisKKyAgICAvLyBDb21iaW5lIGluQSBhbmQgaW5CICh3ZSdsbCBkbyB0d28gdHJhbnNmb3JtcyBpbiBwYXJhbGxlbCkuCisgICAgY29uc3QgX19tMTI4aSBpbkFCXzAgPSBfbW1fdW5wYWNrbG9fZXBpMzIoaW5BXzAsIGluQl8wKTsKKyAgICBjb25zdCBfX20xMjhpIGluQUJfMSA9IF9tbV91bnBhY2tsb19lcGkzMihpbkFfMSwgaW5CXzEpOworICAgIGNvbnN0IF9fbTEyOGkgaW5BQl8yID0gX21tX3VucGFja2xvX2VwaTMyKGluQV8yLCBpbkJfMik7CisgICAgY29uc3QgX19tMTI4aSBpbkFCXzMgPSBfbW1fdW5wYWNrbG9fZXBpMzIoaW5BXzMsIGluQl8zKTsKKyAgICB0bXBfMCA9IF9tbV91bnBhY2tsb19lcGk4KGluQUJfMCwgemVybyk7CisgICAgdG1wXzEgPSBfbW1fdW5wYWNrbG9fZXBpOChpbkFCXzEsIHplcm8pOworICAgIHRtcF8yID0gX21tX3VucGFja2xvX2VwaTgoaW5BQl8yLCB6ZXJvKTsKKyAgICB0bXBfMyA9IF9tbV91bnBhY2tsb19lcGk4KGluQUJfMywgemVybyk7CisgICAgLy8gYTAwIGEwMSBhMDIgYTAzICAgYjAwIGIwMSBiMDIgYjAzCisgICAgLy8gYTEwIGExMSBhMTIgYTEzICAgYjEwIGIxMSBiMTIgYjEzCisgICAgLy8gYTIwIGEyMSBhMjIgYTIzICAgYjIwIGIyMSBiMjIgYjIzCisgICAgLy8gYTMwIGEzMSBhMzIgYTMzICAgYjMwIGIzMSBiMzIgYjMzCisgIH0KKworICAvLyBWZXJ0aWNhbCBwYXNzIGZpcnN0IHRvIGF2b2lkIGEgdHJhbnNwb3NlICh2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbCBwYXNzZXMKKyAgLy8gYXJlIGNvbW11dGF0aXZlIGJlY2F1c2Ugdy9rV2VpZ2h0WSBpcyBzeW1tZXRyaWMpIGFuZCBzdWJzZXF1ZW50IHRyYW5zcG9zZS4KKyAgeworICAgIC8vIENhbGN1bGF0ZSBhIGFuZCBiICh0d28gNHg0IGF0IG9uY2UpLgorICAgIGNvbnN0IF9fbTEyOGkgYTAgPSBfbW1fYWRkX2VwaTE2KHRtcF8wLCB0bXBfMik7CisgICAgY29uc3QgX19tMTI4aSBhMSA9IF9tbV9hZGRfZXBpMTYodG1wXzEsIHRtcF8zKTsKKyAgICBjb25zdCBfX20xMjhpIGEyID0gX21tX3N1Yl9lcGkxNih0bXBfMSwgdG1wXzMpOworICAgIGNvbnN0IF9fbTEyOGkgYTMgPSBfbW1fc3ViX2VwaTE2KHRtcF8wLCB0bXBfMik7CisgICAgY29uc3QgX19tMTI4aSBiMCA9IF9tbV9hZGRfZXBpMTYoYTAsIGExKTsKKyAgICBjb25zdCBfX20xMjhpIGIxID0gX21tX2FkZF9lcGkxNihhMywgYTIpOworICAgIGNvbnN0IF9fbTEyOGkgYjIgPSBfbW1fc3ViX2VwaTE2KGEzLCBhMik7CisgICAgY29uc3QgX19tMTI4aSBiMyA9IF9tbV9zdWJfZXBpMTYoYTAsIGExKTsKKyAgICAvLyBhMDAgYTAxIGEwMiBhMDMgICBiMDAgYjAxIGIwMiBiMDMKKyAgICAvLyBhMTAgYTExIGExMiBhMTMgICBiMTAgYjExIGIxMiBiMTMKKyAgICAvLyBhMjAgYTIxIGEyMiBhMjMgICBiMjAgYjIxIGIyMiBiMjMKKyAgICAvLyBhMzAgYTMxIGEzMiBhMzMgICBiMzAgYjMxIGIzMiBiMzMKKworICAgIC8vIFRyYW5zcG9zZSB0aGUgdHdvIDR4NC4KKyAgICBWUDhUcmFuc3Bvc2VfMl80eDRfMTZiKCZiMCwgJmIxLCAmYjIsICZiMywgJnRtcF8wLCAmdG1wXzEsICZ0bXBfMiwgJnRtcF8zKTsKKyAgfQorCisgIC8vIEhvcml6b250YWwgcGFzcyBhbmQgZGlmZmVyZW5jZSBvZiB3ZWlnaHRlZCBzdW1zLgorICB7CisgICAgLy8gTG9hZCBhbGwgaW5wdXRzLgorICAgIGNvbnN0IF9fbTEyOGkgd18wID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmd1swXSk7CisgICAgY29uc3QgX19tMTI4aSB3XzggPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZ3WzhdKTsKKworICAgIC8vIENhbGN1bGF0ZSBhIGFuZCBiICh0d28gNHg0IGF0IG9uY2UpLgorICAgIGNvbnN0IF9fbTEyOGkgYTAgPSBfbW1fYWRkX2VwaTE2KHRtcF8wLCB0bXBfMik7CisgICAgY29uc3QgX19tMTI4aSBhMSA9IF9tbV9hZGRfZXBpMTYodG1wXzEsIHRtcF8zKTsKKyAgICBjb25zdCBfX20xMjhpIGEyID0gX21tX3N1Yl9lcGkxNih0bXBfMSwgdG1wXzMpOworICAgIGNvbnN0IF9fbTEyOGkgYTMgPSBfbW1fc3ViX2VwaTE2KHRtcF8wLCB0bXBfMik7CisgICAgY29uc3QgX19tMTI4aSBiMCA9IF9tbV9hZGRfZXBpMTYoYTAsIGExKTsKKyAgICBjb25zdCBfX20xMjhpIGIxID0gX21tX2FkZF9lcGkxNihhMywgYTIpOworICAgIGNvbnN0IF9fbTEyOGkgYjIgPSBfbW1fc3ViX2VwaTE2KGEzLCBhMik7CisgICAgY29uc3QgX19tMTI4aSBiMyA9IF9tbV9zdWJfZXBpMTYoYTAsIGExKTsKKworICAgIC8vIFNlcGFyYXRlIHRoZSB0cmFuc2Zvcm1zIG9mIGluQSBhbmQgaW5CLgorICAgIF9fbTEyOGkgQV9iMCA9IF9tbV91bnBhY2tsb19lcGk2NChiMCwgYjEpOworICAgIF9fbTEyOGkgQV9iMiA9IF9tbV91bnBhY2tsb19lcGk2NChiMiwgYjMpOworICAgIF9fbTEyOGkgQl9iMCA9IF9tbV91bnBhY2toaV9lcGk2NChiMCwgYjEpOworICAgIF9fbTEyOGkgQl9iMiA9IF9tbV91bnBhY2toaV9lcGk2NChiMiwgYjMpOworCisgICAgeworICAgICAgY29uc3QgX19tMTI4aSBkMCA9IF9tbV9zdWJfZXBpMTYoemVybywgQV9iMCk7CisgICAgICBjb25zdCBfX20xMjhpIGQxID0gX21tX3N1Yl9lcGkxNih6ZXJvLCBBX2IyKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgZDIgPSBfbW1fc3ViX2VwaTE2KHplcm8sIEJfYjApOworICAgICAgY29uc3QgX19tMTI4aSBkMyA9IF9tbV9zdWJfZXBpMTYoemVybywgQl9iMik7CisgICAgICBBX2IwID0gX21tX21heF9lcGkxNihBX2IwLCBkMCk7ICAgLy8gYWJzKHYpLCAxNmIKKyAgICAgIEFfYjIgPSBfbW1fbWF4X2VwaTE2KEFfYjIsIGQxKTsKKyAgICAgIEJfYjAgPSBfbW1fbWF4X2VwaTE2KEJfYjAsIGQyKTsKKyAgICAgIEJfYjIgPSBfbW1fbWF4X2VwaTE2KEJfYjIsIGQzKTsKKyAgICB9CisKKyAgICAvLyB3ZWlnaHRlZCBzdW1zCisgICAgQV9iMCA9IF9tbV9tYWRkX2VwaTE2KEFfYjAsIHdfMCk7CisgICAgQV9iMiA9IF9tbV9tYWRkX2VwaTE2KEFfYjIsIHdfOCk7CisgICAgQl9iMCA9IF9tbV9tYWRkX2VwaTE2KEJfYjAsIHdfMCk7CisgICAgQl9iMiA9IF9tbV9tYWRkX2VwaTE2KEJfYjIsIHdfOCk7CisgICAgQV9iMCA9IF9tbV9hZGRfZXBpMzIoQV9iMCwgQV9iMik7CisgICAgQl9iMCA9IF9tbV9hZGRfZXBpMzIoQl9iMCwgQl9iMik7CisKKyAgICAvLyBkaWZmZXJlbmNlIG9mIHdlaWdodGVkIHN1bXMKKyAgICBBX2IwID0gX21tX3N1Yl9lcGkzMihBX2IwLCBCX2IwKTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmc3VtWzBdLCBBX2IwKTsKKyAgfQorICByZXR1cm4gc3VtWzBdICsgc3VtWzFdICsgc3VtWzJdICsgc3VtWzNdOworfQorCitzdGF0aWMgaW50IERpc3RvNHg0X1NTRTIoY29uc3QgdWludDhfdCogY29uc3QgYSwgY29uc3QgdWludDhfdCogY29uc3QgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCogY29uc3QgdykgeworICBjb25zdCBpbnQgZGlmZl9zdW0gPSBUVHJhbnNmb3JtX1NTRTIoYSwgYiwgdyk7CisgIHJldHVybiBhYnMoZGlmZl9zdW0pID4+IDU7Cit9CisKK3N0YXRpYyBpbnQgRGlzdG8xNngxNl9TU0UyKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGEsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCogY29uc3QgdykgeworICBpbnQgRCA9IDA7CisgIGludCB4LCB5OworICBmb3IgKHkgPSAwOyB5IDwgMTYgKiBCUFM7IHkgKz0gNCAqIEJQUykgeworICAgIGZvciAoeCA9IDA7IHggPCAxNjsgeCArPSA0KSB7CisgICAgICBEICs9IERpc3RvNHg0X1NTRTIoYSArIHggKyB5LCBiICsgeCArIHksIHcpOworICAgIH0KKyAgfQorICByZXR1cm4gRDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFF1YW50aXphdGlvbgorLy8KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBEb1F1YW50aXplQmxvY2tfU1NFMihpbnQxNl90IGluWzE2XSwgaW50MTZfdCBvdXRbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCogY29uc3Qgc2hhcnBlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TWF0cml4KiBjb25zdCBtdHgpIHsKKyAgY29uc3QgX19tMTI4aSBtYXhfY29lZmZfMjA0NyA9IF9tbV9zZXQxX2VwaTE2KE1BWF9MRVZFTCk7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIF9fbTEyOGkgY29lZmYwLCBjb2VmZjg7CisgIF9fbTEyOGkgb3V0MCwgb3V0ODsKKyAgX19tMTI4aSBwYWNrZWRfb3V0OworCisgIC8vIExvYWQgYWxsIGlucHV0cy4KKyAgX19tMTI4aSBpbjAgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZpblswXSk7CisgIF9fbTEyOGkgaW44ID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmaW5bOF0pOworICBjb25zdCBfX20xMjhpIGlxMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJm10eC0+aXFfWzBdKTsKKyAgY29uc3QgX19tMTI4aSBpcTggPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZtdHgtPmlxX1s4XSk7CisgIGNvbnN0IF9fbTEyOGkgcTAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZtdHgtPnFfWzBdKTsKKyAgY29uc3QgX19tMTI4aSBxOCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJm10eC0+cV9bOF0pOworCisgIC8vIGV4dHJhY3Qgc2lnbihpbikgICgweDAwMDAgaWYgcG9zaXRpdmUsIDB4ZmZmZiBpZiBuZWdhdGl2ZSkKKyAgY29uc3QgX19tMTI4aSBzaWduMCA9IF9tbV9jbXBndF9lcGkxNih6ZXJvLCBpbjApOworICBjb25zdCBfX20xMjhpIHNpZ244ID0gX21tX2NtcGd0X2VwaTE2KHplcm8sIGluOCk7CisKKyAgLy8gY29lZmYgPSBhYnMoaW4pID0gKGluIF4gc2lnbikgLSBzaWduCisgIGNvZWZmMCA9IF9tbV94b3Jfc2kxMjgoaW4wLCBzaWduMCk7CisgIGNvZWZmOCA9IF9tbV94b3Jfc2kxMjgoaW44LCBzaWduOCk7CisgIGNvZWZmMCA9IF9tbV9zdWJfZXBpMTYoY29lZmYwLCBzaWduMCk7CisgIGNvZWZmOCA9IF9tbV9zdWJfZXBpMTYoY29lZmY4LCBzaWduOCk7CisKKyAgLy8gY29lZmYgPSBhYnMoaW4pICsgc2hhcnBlbgorICBpZiAoc2hhcnBlbiAhPSBOVUxMKSB7CisgICAgY29uc3QgX19tMTI4aSBzaGFycGVuMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnNoYXJwZW5bMF0pOworICAgIGNvbnN0IF9fbTEyOGkgc2hhcnBlbjggPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZzaGFycGVuWzhdKTsKKyAgICBjb2VmZjAgPSBfbW1fYWRkX2VwaTE2KGNvZWZmMCwgc2hhcnBlbjApOworICAgIGNvZWZmOCA9IF9tbV9hZGRfZXBpMTYoY29lZmY4LCBzaGFycGVuOCk7CisgIH0KKworICAvLyBvdXQgPSAoY29lZmYgKiBpUSArIEIpID4+IFFGSVgKKyAgeworICAgIC8vIGRvaW5nIGNhbGN1bGF0aW9ucyB3aXRoIDMyYiBwcmVjaXNpb24gKFFGSVg9MTcpCisgICAgLy8gb3V0ID0gKGNvZWZmICogaVEpCisgICAgY29uc3QgX19tMTI4aSBjb2VmZl9pUTBIID0gX21tX211bGhpX2VwdTE2KGNvZWZmMCwgaXEwKTsKKyAgICBjb25zdCBfX20xMjhpIGNvZWZmX2lRMEwgPSBfbW1fbXVsbG9fZXBpMTYoY29lZmYwLCBpcTApOworICAgIGNvbnN0IF9fbTEyOGkgY29lZmZfaVE4SCA9IF9tbV9tdWxoaV9lcHUxNihjb2VmZjgsIGlxOCk7CisgICAgY29uc3QgX19tMTI4aSBjb2VmZl9pUThMID0gX21tX211bGxvX2VwaTE2KGNvZWZmOCwgaXE4KTsKKyAgICBfX20xMjhpIG91dF8wMCA9IF9tbV91bnBhY2tsb19lcGkxNihjb2VmZl9pUTBMLCBjb2VmZl9pUTBIKTsKKyAgICBfX20xMjhpIG91dF8wNCA9IF9tbV91bnBhY2toaV9lcGkxNihjb2VmZl9pUTBMLCBjb2VmZl9pUTBIKTsKKyAgICBfX20xMjhpIG91dF8wOCA9IF9tbV91bnBhY2tsb19lcGkxNihjb2VmZl9pUThMLCBjb2VmZl9pUThIKTsKKyAgICBfX20xMjhpIG91dF8xMiA9IF9tbV91bnBhY2toaV9lcGkxNihjb2VmZl9pUThMLCBjb2VmZl9pUThIKTsKKyAgICAvLyBvdXQgPSAoY29lZmYgKiBpUSArIEIpCisgICAgY29uc3QgX19tMTI4aSBiaWFzXzAwID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmbXR4LT5iaWFzX1swXSk7CisgICAgY29uc3QgX19tMTI4aSBiaWFzXzA0ID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmbXR4LT5iaWFzX1s0XSk7CisgICAgY29uc3QgX19tMTI4aSBiaWFzXzA4ID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmbXR4LT5iaWFzX1s4XSk7CisgICAgY29uc3QgX19tMTI4aSBiaWFzXzEyID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmbXR4LT5iaWFzX1sxMl0pOworICAgIG91dF8wMCA9IF9tbV9hZGRfZXBpMzIob3V0XzAwLCBiaWFzXzAwKTsKKyAgICBvdXRfMDQgPSBfbW1fYWRkX2VwaTMyKG91dF8wNCwgYmlhc18wNCk7CisgICAgb3V0XzA4ID0gX21tX2FkZF9lcGkzMihvdXRfMDgsIGJpYXNfMDgpOworICAgIG91dF8xMiA9IF9tbV9hZGRfZXBpMzIob3V0XzEyLCBiaWFzXzEyKTsKKyAgICAvLyBvdXQgPSBRVUFOVERJVihjb2VmZiwgaVEsIEIsIFFGSVgpCisgICAgb3V0XzAwID0gX21tX3NyYWlfZXBpMzIob3V0XzAwLCBRRklYKTsKKyAgICBvdXRfMDQgPSBfbW1fc3JhaV9lcGkzMihvdXRfMDQsIFFGSVgpOworICAgIG91dF8wOCA9IF9tbV9zcmFpX2VwaTMyKG91dF8wOCwgUUZJWCk7CisgICAgb3V0XzEyID0gX21tX3NyYWlfZXBpMzIob3V0XzEyLCBRRklYKTsKKworICAgIC8vIHBhY2sgcmVzdWx0IGFzIDE2YgorICAgIG91dDAgPSBfbW1fcGFja3NfZXBpMzIob3V0XzAwLCBvdXRfMDQpOworICAgIG91dDggPSBfbW1fcGFja3NfZXBpMzIob3V0XzA4LCBvdXRfMTIpOworCisgICAgLy8gaWYgKGNvZWZmID4gMjA0NykgY29lZmYgPSAyMDQ3CisgICAgb3V0MCA9IF9tbV9taW5fZXBpMTYob3V0MCwgbWF4X2NvZWZmXzIwNDcpOworICAgIG91dDggPSBfbW1fbWluX2VwaTE2KG91dDgsIG1heF9jb2VmZl8yMDQ3KTsKKyAgfQorCisgIC8vIGdldCBzaWduIGJhY2sgKGlmIChzaWduW2pdKSBvdXRfbiA9IC1vdXRfbikKKyAgb3V0MCA9IF9tbV94b3Jfc2kxMjgob3V0MCwgc2lnbjApOworICBvdXQ4ID0gX21tX3hvcl9zaTEyOChvdXQ4LCBzaWduOCk7CisgIG91dDAgPSBfbW1fc3ViX2VwaTE2KG91dDAsIHNpZ24wKTsKKyAgb3V0OCA9IF9tbV9zdWJfZXBpMTYob3V0OCwgc2lnbjgpOworCisgIC8vIGluID0gb3V0ICogUQorICBpbjAgPSBfbW1fbXVsbG9fZXBpMTYob3V0MCwgcTApOworICBpbjggPSBfbW1fbXVsbG9fZXBpMTYob3V0OCwgcTgpOworCisgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZpblswXSwgaW4wKTsKKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJmluWzhdLCBpbjgpOworCisgIC8vIHppZ3phZyB0aGUgb3V0cHV0IGJlZm9yZSBzdG9yaW5nIGl0LgorICAvLworICAvLyBUaGUgemlnemFnIHBhdHRlcm4gY2FuIGFsbW9zdCBiZSByZXByb2R1Y2VkIHdpdGggYSBzbWFsbCBzZXF1ZW5jZSBvZgorICAvLyBzaHVmZmxlcy4gQWZ0ZXIgaXQsIHdlIG9ubHkgbmVlZCB0byBzd2FwIHRoZSA3dGggKGVuZGluZyB1cCBpbiB0aGlyZAorICAvLyBwb3NpdGlvbiBpbnN0ZWFkIG9mIHR3ZWxmdGgpIGFuZCA4dGggdmFsdWVzLgorICB7CisgICAgX19tMTI4aSBvdXRaMCwgb3V0Wjg7CisgICAgb3V0WjAgPSBfbW1fc2h1ZmZsZWhpX2VwaTE2KG91dDAsICBfTU1fU0hVRkZMRSgyLCAxLCAzLCAwKSk7CisgICAgb3V0WjAgPSBfbW1fc2h1ZmZsZV9lcGkzMiAgKG91dFowLCBfTU1fU0hVRkZMRSgzLCAxLCAyLCAwKSk7CisgICAgb3V0WjAgPSBfbW1fc2h1ZmZsZWhpX2VwaTE2KG91dFowLCBfTU1fU0hVRkZMRSgzLCAxLCAwLCAyKSk7CisgICAgb3V0WjggPSBfbW1fc2h1ZmZsZWxvX2VwaTE2KG91dDgsICBfTU1fU0hVRkZMRSgzLCAwLCAyLCAxKSk7CisgICAgb3V0WjggPSBfbW1fc2h1ZmZsZV9lcGkzMiAgKG91dFo4LCBfTU1fU0hVRkZMRSgzLCAxLCAyLCAwKSk7CisgICAgb3V0WjggPSBfbW1fc2h1ZmZsZWxvX2VwaTE2KG91dFo4LCBfTU1fU0hVRkZMRSgxLCAzLCAyLCAwKSk7CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJm91dFswXSwgb3V0WjApOworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbOF0sIG91dFo4KTsKKyAgICBwYWNrZWRfb3V0ID0gX21tX3BhY2tzX2VwaTE2KG91dFowLCBvdXRaOCk7CisgIH0KKyAgeworICAgIGNvbnN0IGludDE2X3Qgb3V0Wl8xMiA9IG91dFsxMl07CisgICAgY29uc3QgaW50MTZfdCBvdXRaXzMgPSBvdXRbM107CisgICAgb3V0WzNdID0gb3V0Wl8xMjsKKyAgICBvdXRbMTJdID0gb3V0Wl8zOworICB9CisKKyAgLy8gZGV0ZWN0IGlmIGFsbCAnb3V0JyB2YWx1ZXMgYXJlIHplcm9lcyBvciBub3QKKyAgcmV0dXJuIChfbW1fbW92ZW1hc2tfZXBpOChfbW1fY21wZXFfZXBpOChwYWNrZWRfb3V0LCB6ZXJvKSkgIT0gMHhmZmZmKTsKK30KKworc3RhdGljIGludCBRdWFudGl6ZUJsb2NrX1NTRTIoaW50MTZfdCBpblsxNl0sIGludDE2X3Qgb3V0WzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOE1hdHJpeCogY29uc3QgbXR4KSB7CisgIHJldHVybiBEb1F1YW50aXplQmxvY2tfU1NFMihpbiwgb3V0LCAmbXR4LT5zaGFycGVuX1swXSwgbXR4KTsKK30KKworc3RhdGljIGludCBRdWFudGl6ZUJsb2NrV0hUX1NTRTIoaW50MTZfdCBpblsxNl0sIGludDE2X3Qgb3V0WzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOE1hdHJpeCogY29uc3QgbXR4KSB7CisgIHJldHVybiBEb1F1YW50aXplQmxvY2tfU1NFMihpbiwgb3V0LCBOVUxMLCBtdHgpOworfQorCitzdGF0aWMgaW50IFF1YW50aXplMkJsb2Nrc19TU0UyKGludDE2X3QgaW5bMzJdLCBpbnQxNl90IG91dFszMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOE1hdHJpeCogY29uc3QgbXR4KSB7CisgIGludCBuejsKKyAgY29uc3QgdWludDE2X3QqIGNvbnN0IHNoYXJwZW4gPSAmbXR4LT5zaGFycGVuX1swXTsKKyAgbnogID0gRG9RdWFudGl6ZUJsb2NrX1NTRTIoaW4gKyAwICogMTYsIG91dCArIDAgKiAxNiwgc2hhcnBlbiwgbXR4KSA8PCAwOworICBueiB8PSBEb1F1YW50aXplQmxvY2tfU1NFMihpbiArIDEgKiAxNiwgb3V0ICsgMSAqIDE2LCBzaGFycGVuLCBtdHgpIDw8IDE7CisgIHJldHVybiBuejsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFZQOEVuY0RzcEluaXRTU0UyKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgVlA4RW5jRHNwSW5pdFNTRTIodm9pZCkgeworICBWUDhDb2xsZWN0SGlzdG9ncmFtID0gQ29sbGVjdEhpc3RvZ3JhbV9TU0UyOworICBWUDhFbmNQcmVkTHVtYTE2ID0gSW50cmExNlByZWRzX1NTRTI7CisgIFZQOEVuY1ByZWRDaHJvbWE4ID0gSW50cmFDaHJvbWFQcmVkc19TU0UyOworICBWUDhFbmNQcmVkTHVtYTQgPSBJbnRyYTRQcmVkc19TU0UyOworICBWUDhFbmNRdWFudGl6ZUJsb2NrID0gUXVhbnRpemVCbG9ja19TU0UyOworICBWUDhFbmNRdWFudGl6ZTJCbG9ja3MgPSBRdWFudGl6ZTJCbG9ja3NfU1NFMjsKKyAgVlA4RW5jUXVhbnRpemVCbG9ja1dIVCA9IFF1YW50aXplQmxvY2tXSFRfU1NFMjsKKyAgVlA4SVRyYW5zZm9ybSA9IElUcmFuc2Zvcm1fU1NFMjsKKyAgVlA4RlRyYW5zZm9ybSA9IEZUcmFuc2Zvcm1fU1NFMjsKKyAgVlA4RlRyYW5zZm9ybTIgPSBGVHJhbnNmb3JtMl9TU0UyOworICBWUDhGVHJhbnNmb3JtV0hUID0gRlRyYW5zZm9ybVdIVF9TU0UyOworICBWUDhTU0UxNngxNiA9IFNTRTE2eDE2X1NTRTI7CisgIFZQOFNTRTE2eDggPSBTU0UxNng4X1NTRTI7CisgIFZQOFNTRTh4OCA9IFNTRTh4OF9TU0UyOworICBWUDhTU0U0eDQgPSBTU0U0eDRfU1NFMjsKKyAgVlA4VERpc3RvNHg0ID0gRGlzdG80eDRfU1NFMjsKKyAgVlA4VERpc3RvMTZ4MTYgPSBEaXN0bzE2eDE2X1NTRTI7CisgIFZQOE1lYW4xNng0ID0gTWVhbjE2eDRfU1NFMjsKK30KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9TU0UyCisKK1dFQlBfRFNQX0lOSVRfU1RVQihWUDhFbmNEc3BJbml0U1NFMikKKworI2VuZGlmICAvLyBXRUJQX1VTRV9TU0UyCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2VuY19zc2U0MS5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9lbmNfc3NlNDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWRlMjlhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9lbmNfc3NlNDEuYwpAQCAtMCwwICsxLDM0NCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFNTRTQgdmVyc2lvbiBvZiBzb21lIGVuY29kaW5nIGZ1bmN0aW9ucy4KKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFNDEpCisjaW5jbHVkZSA8c21taW50cmluLmg+CisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RkbGliX3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdfcG9lbS5oIgorI2Vsc2UKKyNpbmNsdWRlIDxzdGRsaWIuaD4gIC8vIGZvciBhYnMoKQorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvZHNwL2NvbW1vbl9zc2UyLmgiCisjaW5jbHVkZSAic3JjL2VuYy92cDhpX2VuYy5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29tcHV0ZSBzdXNjZXB0aWJpbGl0eSBiYXNlZCBvbiBEQ1QtY29lZmYgaGlzdG9ncmFtcy4KKworc3RhdGljIHZvaWQgQ29sbGVjdEhpc3RvZ3JhbV9TU0U0MShjb25zdCB1aW50OF90KiByZWYsIGNvbnN0IHVpbnQ4X3QqIHByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF9ibG9jaywgaW50IGVuZF9ibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4SGlzdG9ncmFtKiBjb25zdCBoaXN0bykgeworICBjb25zdCBfX20xMjhpIG1heF9jb2VmZl90aHJlc2ggPSBfbW1fc2V0MV9lcGkxNihNQVhfQ09FRkZfVEhSRVNIKTsKKyAgaW50IGo7CisgIGludCBkaXN0cmlidXRpb25bTUFYX0NPRUZGX1RIUkVTSCArIDFdID0geyAwIH07CisgIGZvciAoaiA9IHN0YXJ0X2Jsb2NrOyBqIDwgZW5kX2Jsb2NrOyArK2opIHsKKyAgICBpbnQxNl90IG91dFsxNl07CisgICAgaW50IGs7CisKKyAgICBWUDhGVHJhbnNmb3JtKHJlZiArIFZQOERzcFNjYW5bal0sIHByZWQgKyBWUDhEc3BTY2FuW2pdLCBvdXQpOworCisgICAgLy8gQ29udmVydCBjb2VmZmljaWVudHMgdG8gYmluICh3aXRoaW4gb3V0W10pLgorICAgIHsKKyAgICAgIC8vIExvYWQuCisgICAgICBjb25zdCBfX20xMjhpIG91dDAgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbMF0pOworICAgICAgY29uc3QgX19tMTI4aSBvdXQxID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmb3V0WzhdKTsKKyAgICAgIC8vIHYgPSBhYnMob3V0KSA+PiAzCisgICAgICBjb25zdCBfX20xMjhpIGFiczAgPSBfbW1fYWJzX2VwaTE2KG91dDApOworICAgICAgY29uc3QgX19tMTI4aSBhYnMxID0gX21tX2Fic19lcGkxNihvdXQxKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgdjAgPSBfbW1fc3JhaV9lcGkxNihhYnMwLCAzKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgdjEgPSBfbW1fc3JhaV9lcGkxNihhYnMxLCAzKTsKKyAgICAgIC8vIGJpbiA9IG1pbih2LCBNQVhfQ09FRkZfVEhSRVNIKQorICAgICAgY29uc3QgX19tMTI4aSBiaW4wID0gX21tX21pbl9lcGkxNih2MCwgbWF4X2NvZWZmX3RocmVzaCk7CisgICAgICBjb25zdCBfX20xMjhpIGJpbjEgPSBfbW1fbWluX2VwaTE2KHYxLCBtYXhfY29lZmZfdGhyZXNoKTsKKyAgICAgIC8vIFN0b3JlLgorICAgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJm91dFswXSwgYmluMCk7CisgICAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmb3V0WzhdLCBiaW4xKTsKKyAgICB9CisKKyAgICAvLyBDb252ZXJ0IGNvZWZmaWNpZW50cyB0byBiaW4uCisgICAgZm9yIChrID0gMDsgayA8IDE2OyArK2spIHsKKyAgICAgICsrZGlzdHJpYnV0aW9uW291dFtrXV07CisgICAgfQorICB9CisgIFZQOFNldEhpc3RvZ3JhbURhdGEoZGlzdHJpYnV0aW9uLCBoaXN0byk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUZXh0dXJlIGRpc3RvcnRpb24KKy8vCisvLyBXZSB0cnkgdG8gbWF0Y2ggdGhlIHNwZWN0cmFsIGNvbnRlbnQgKHdlaWdodGVkKSBiZXR3ZWVuIHNvdXJjZSBhbmQKKy8vIHJlY29uc3RydWN0ZWQgc2FtcGxlcy4KKworLy8gSGFkYW1hcmQgdHJhbnNmb3JtCisvLyBSZXR1cm5zIHRoZSB3ZWlnaHRlZCBzdW0gb2YgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cy4KKy8vIHdbXSBjb250YWlucyBhIHJvdy1tYWpvciA0IGJ5IDQgc3ltbWV0cmljIG1hdHJpeC4KK3N0YXRpYyBpbnQgVFRyYW5zZm9ybV9TU0U0MShjb25zdCB1aW50OF90KiBpbkEsIGNvbnN0IHVpbnQ4X3QqIGluQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCogY29uc3QgdykgeworICBpbnQzMl90IHN1bVs0XTsKKyAgX19tMTI4aSB0bXBfMCwgdG1wXzEsIHRtcF8yLCB0bXBfMzsKKworICAvLyBMb2FkIGFuZCBjb21iaW5lIGlucHV0cy4KKyAgeworICAgIGNvbnN0IF9fbTEyOGkgaW5BXzAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZpbkFbQlBTICogMF0pOworICAgIGNvbnN0IF9fbTEyOGkgaW5BXzEgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZpbkFbQlBTICogMV0pOworICAgIGNvbnN0IF9fbTEyOGkgaW5BXzIgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZpbkFbQlBTICogMl0pOworICAgIC8vIEluIFNTRTQuMSwgd2l0aCBnY2MgNC44IGF0IGxlYXN0IChtYXliZSBvdGhlciB2ZXJzaW9ucyksCisgICAgLy8gX21tX2xvYWR1X3NpMTI4IGlzIGZhc3RlciB0aGFuIF9tbV9sb2FkbF9lcGk2NC4gQnV0IGZvciB0aGUgbGFzdCBsdW1wCisgICAgLy8gb2YgaW5BIGFuZCBpbkIsIF9tbV9sb2FkbF9lcGk2NCBpcyBzdGlsbCB1c2VkIG5vdCB0byBoYXZlIGFuIG91dCBvZgorICAgIC8vIGJvdW5kIHJlYWQuCisgICAgY29uc3QgX19tMTI4aSBpbkFfMyA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmluQVtCUFMgKiAzXSk7CisgICAgY29uc3QgX19tMTI4aSBpbkJfMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmluQltCUFMgKiAwXSk7CisgICAgY29uc3QgX19tMTI4aSBpbkJfMSA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmluQltCUFMgKiAxXSk7CisgICAgY29uc3QgX19tMTI4aSBpbkJfMiA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmluQltCUFMgKiAyXSk7CisgICAgY29uc3QgX19tMTI4aSBpbkJfMyA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmluQltCUFMgKiAzXSk7CisKKyAgICAvLyBDb21iaW5lIGluQSBhbmQgaW5CICh3ZSdsbCBkbyB0d28gdHJhbnNmb3JtcyBpbiBwYXJhbGxlbCkuCisgICAgY29uc3QgX19tMTI4aSBpbkFCXzAgPSBfbW1fdW5wYWNrbG9fZXBpMzIoaW5BXzAsIGluQl8wKTsKKyAgICBjb25zdCBfX20xMjhpIGluQUJfMSA9IF9tbV91bnBhY2tsb19lcGkzMihpbkFfMSwgaW5CXzEpOworICAgIGNvbnN0IF9fbTEyOGkgaW5BQl8yID0gX21tX3VucGFja2xvX2VwaTMyKGluQV8yLCBpbkJfMik7CisgICAgY29uc3QgX19tMTI4aSBpbkFCXzMgPSBfbW1fdW5wYWNrbG9fZXBpMzIoaW5BXzMsIGluQl8zKTsKKyAgICB0bXBfMCA9IF9tbV9jdnRlcHU4X2VwaTE2KGluQUJfMCk7CisgICAgdG1wXzEgPSBfbW1fY3Z0ZXB1OF9lcGkxNihpbkFCXzEpOworICAgIHRtcF8yID0gX21tX2N2dGVwdThfZXBpMTYoaW5BQl8yKTsKKyAgICB0bXBfMyA9IF9tbV9jdnRlcHU4X2VwaTE2KGluQUJfMyk7CisgICAgLy8gYTAwIGEwMSBhMDIgYTAzICAgYjAwIGIwMSBiMDIgYjAzCisgICAgLy8gYTEwIGExMSBhMTIgYTEzICAgYjEwIGIxMSBiMTIgYjEzCisgICAgLy8gYTIwIGEyMSBhMjIgYTIzICAgYjIwIGIyMSBiMjIgYjIzCisgICAgLy8gYTMwIGEzMSBhMzIgYTMzICAgYjMwIGIzMSBiMzIgYjMzCisgIH0KKworICAvLyBWZXJ0aWNhbCBwYXNzIGZpcnN0IHRvIGF2b2lkIGEgdHJhbnNwb3NlICh2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbCBwYXNzZXMKKyAgLy8gYXJlIGNvbW11dGF0aXZlIGJlY2F1c2Ugdy9rV2VpZ2h0WSBpcyBzeW1tZXRyaWMpIGFuZCBzdWJzZXF1ZW50IHRyYW5zcG9zZS4KKyAgeworICAgIC8vIENhbGN1bGF0ZSBhIGFuZCBiICh0d28gNHg0IGF0IG9uY2UpLgorICAgIGNvbnN0IF9fbTEyOGkgYTAgPSBfbW1fYWRkX2VwaTE2KHRtcF8wLCB0bXBfMik7CisgICAgY29uc3QgX19tMTI4aSBhMSA9IF9tbV9hZGRfZXBpMTYodG1wXzEsIHRtcF8zKTsKKyAgICBjb25zdCBfX20xMjhpIGEyID0gX21tX3N1Yl9lcGkxNih0bXBfMSwgdG1wXzMpOworICAgIGNvbnN0IF9fbTEyOGkgYTMgPSBfbW1fc3ViX2VwaTE2KHRtcF8wLCB0bXBfMik7CisgICAgY29uc3QgX19tMTI4aSBiMCA9IF9tbV9hZGRfZXBpMTYoYTAsIGExKTsKKyAgICBjb25zdCBfX20xMjhpIGIxID0gX21tX2FkZF9lcGkxNihhMywgYTIpOworICAgIGNvbnN0IF9fbTEyOGkgYjIgPSBfbW1fc3ViX2VwaTE2KGEzLCBhMik7CisgICAgY29uc3QgX19tMTI4aSBiMyA9IF9tbV9zdWJfZXBpMTYoYTAsIGExKTsKKyAgICAvLyBhMDAgYTAxIGEwMiBhMDMgICBiMDAgYjAxIGIwMiBiMDMKKyAgICAvLyBhMTAgYTExIGExMiBhMTMgICBiMTAgYjExIGIxMiBiMTMKKyAgICAvLyBhMjAgYTIxIGEyMiBhMjMgICBiMjAgYjIxIGIyMiBiMjMKKyAgICAvLyBhMzAgYTMxIGEzMiBhMzMgICBiMzAgYjMxIGIzMiBiMzMKKworICAgIC8vIFRyYW5zcG9zZSB0aGUgdHdvIDR4NC4KKyAgICBWUDhUcmFuc3Bvc2VfMl80eDRfMTZiKCZiMCwgJmIxLCAmYjIsICZiMywgJnRtcF8wLCAmdG1wXzEsICZ0bXBfMiwgJnRtcF8zKTsKKyAgfQorCisgIC8vIEhvcml6b250YWwgcGFzcyBhbmQgZGlmZmVyZW5jZSBvZiB3ZWlnaHRlZCBzdW1zLgorICB7CisgICAgLy8gTG9hZCBhbGwgaW5wdXRzLgorICAgIGNvbnN0IF9fbTEyOGkgd18wID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmd1swXSk7CisgICAgY29uc3QgX19tMTI4aSB3XzggPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZ3WzhdKTsKKworICAgIC8vIENhbGN1bGF0ZSBhIGFuZCBiICh0d28gNHg0IGF0IG9uY2UpLgorICAgIGNvbnN0IF9fbTEyOGkgYTAgPSBfbW1fYWRkX2VwaTE2KHRtcF8wLCB0bXBfMik7CisgICAgY29uc3QgX19tMTI4aSBhMSA9IF9tbV9hZGRfZXBpMTYodG1wXzEsIHRtcF8zKTsKKyAgICBjb25zdCBfX20xMjhpIGEyID0gX21tX3N1Yl9lcGkxNih0bXBfMSwgdG1wXzMpOworICAgIGNvbnN0IF9fbTEyOGkgYTMgPSBfbW1fc3ViX2VwaTE2KHRtcF8wLCB0bXBfMik7CisgICAgY29uc3QgX19tMTI4aSBiMCA9IF9tbV9hZGRfZXBpMTYoYTAsIGExKTsKKyAgICBjb25zdCBfX20xMjhpIGIxID0gX21tX2FkZF9lcGkxNihhMywgYTIpOworICAgIGNvbnN0IF9fbTEyOGkgYjIgPSBfbW1fc3ViX2VwaTE2KGEzLCBhMik7CisgICAgY29uc3QgX19tMTI4aSBiMyA9IF9tbV9zdWJfZXBpMTYoYTAsIGExKTsKKworICAgIC8vIFNlcGFyYXRlIHRoZSB0cmFuc2Zvcm1zIG9mIGluQSBhbmQgaW5CLgorICAgIF9fbTEyOGkgQV9iMCA9IF9tbV91bnBhY2tsb19lcGk2NChiMCwgYjEpOworICAgIF9fbTEyOGkgQV9iMiA9IF9tbV91bnBhY2tsb19lcGk2NChiMiwgYjMpOworICAgIF9fbTEyOGkgQl9iMCA9IF9tbV91bnBhY2toaV9lcGk2NChiMCwgYjEpOworICAgIF9fbTEyOGkgQl9iMiA9IF9tbV91bnBhY2toaV9lcGk2NChiMiwgYjMpOworCisgICAgQV9iMCA9IF9tbV9hYnNfZXBpMTYoQV9iMCk7CisgICAgQV9iMiA9IF9tbV9hYnNfZXBpMTYoQV9iMik7CisgICAgQl9iMCA9IF9tbV9hYnNfZXBpMTYoQl9iMCk7CisgICAgQl9iMiA9IF9tbV9hYnNfZXBpMTYoQl9iMik7CisKKyAgICAvLyB3ZWlnaHRlZCBzdW1zCisgICAgQV9iMCA9IF9tbV9tYWRkX2VwaTE2KEFfYjAsIHdfMCk7CisgICAgQV9iMiA9IF9tbV9tYWRkX2VwaTE2KEFfYjIsIHdfOCk7CisgICAgQl9iMCA9IF9tbV9tYWRkX2VwaTE2KEJfYjAsIHdfMCk7CisgICAgQl9iMiA9IF9tbV9tYWRkX2VwaTE2KEJfYjIsIHdfOCk7CisgICAgQV9iMCA9IF9tbV9hZGRfZXBpMzIoQV9iMCwgQV9iMik7CisgICAgQl9iMCA9IF9tbV9hZGRfZXBpMzIoQl9iMCwgQl9iMik7CisKKyAgICAvLyBkaWZmZXJlbmNlIG9mIHdlaWdodGVkIHN1bXMKKyAgICBBX2IyID0gX21tX3N1Yl9lcGkzMihBX2IwLCBCX2IwKTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmc3VtWzBdLCBBX2IyKTsKKyAgfQorICByZXR1cm4gc3VtWzBdICsgc3VtWzFdICsgc3VtWzJdICsgc3VtWzNdOworfQorCitzdGF0aWMgaW50IERpc3RvNHg0X1NTRTQxKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGEsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90KiBjb25zdCB3KSB7CisgIGNvbnN0IGludCBkaWZmX3N1bSA9IFRUcmFuc2Zvcm1fU1NFNDEoYSwgYiwgdyk7CisgIHJldHVybiBhYnMoZGlmZl9zdW0pID4+IDU7Cit9CisKK3N0YXRpYyBpbnQgRGlzdG8xNngxNl9TU0U0MShjb25zdCB1aW50OF90KiBjb25zdCBhLCBjb25zdCB1aW50OF90KiBjb25zdCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90KiBjb25zdCB3KSB7CisgIGludCBEID0gMDsKKyAgaW50IHgsIHk7CisgIGZvciAoeSA9IDA7IHkgPCAxNiAqIEJQUzsgeSArPSA0ICogQlBTKSB7CisgICAgZm9yICh4ID0gMDsgeCA8IDE2OyB4ICs9IDQpIHsKKyAgICAgIEQgKz0gRGlzdG80eDRfU1NFNDEoYSArIHggKyB5LCBiICsgeCArIHksIHcpOworICAgIH0KKyAgfQorICByZXR1cm4gRDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFF1YW50aXphdGlvbgorLy8KKworLy8gR2VuZXJhdGVzIGEgcHNodWZiIGNvbnN0YW50IGZvciBzaHVmZmxpbmcgMTZiIHdvcmRzLgorI2RlZmluZSBQU0hVRkJfQ1NUKEEsQixDLEQsRSxGLEcsSCkgXAorICBfbW1fc2V0X2VwaTgoMiAqIChIKSArIDEsIDIgKiAoSCkgKyAwLCAyICogKEcpICsgMSwgMiAqIChHKSArIDAsIFwKKyAgICAgICAgICAgICAgIDIgKiAoRikgKyAxLCAyICogKEYpICsgMCwgMiAqIChFKSArIDEsIDIgKiAoRSkgKyAwLCBcCisgICAgICAgICAgICAgICAyICogKEQpICsgMSwgMiAqIChEKSArIDAsIDIgKiAoQykgKyAxLCAyICogKEMpICsgMCwgXAorICAgICAgICAgICAgICAgMiAqIChCKSArIDEsIDIgKiAoQikgKyAwLCAyICogKEEpICsgMSwgMiAqIChBKSArIDApCisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgRG9RdWFudGl6ZUJsb2NrX1NTRTQxKGludDE2X3QgaW5bMTZdLCBpbnQxNl90IG91dFsxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCogY29uc3Qgc2hhcnBlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOE1hdHJpeCogY29uc3QgbXR4KSB7CisgIGNvbnN0IF9fbTEyOGkgbWF4X2NvZWZmXzIwNDcgPSBfbW1fc2V0MV9lcGkxNihNQVhfTEVWRUwpOworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBfX20xMjhpIG91dDAsIG91dDg7CisgIF9fbTEyOGkgcGFja2VkX291dDsKKworICAvLyBMb2FkIGFsbCBpbnB1dHMuCisgIF9fbTEyOGkgaW4wID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmaW5bMF0pOworICBfX20xMjhpIGluOCA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJmluWzhdKTsKKyAgY29uc3QgX19tMTI4aSBpcTAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZtdHgtPmlxX1swXSk7CisgIGNvbnN0IF9fbTEyOGkgaXE4ID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmbXR4LT5pcV9bOF0pOworICBjb25zdCBfX20xMjhpIHEwID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmbXR4LT5xX1swXSk7CisgIGNvbnN0IF9fbTEyOGkgcTggPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZtdHgtPnFfWzhdKTsKKworICAvLyBjb2VmZiA9IGFicyhpbikKKyAgX19tMTI4aSBjb2VmZjAgPSBfbW1fYWJzX2VwaTE2KGluMCk7CisgIF9fbTEyOGkgY29lZmY4ID0gX21tX2Fic19lcGkxNihpbjgpOworCisgIC8vIGNvZWZmID0gYWJzKGluKSArIHNoYXJwZW4KKyAgaWYgKHNoYXJwZW4gIT0gTlVMTCkgeworICAgIGNvbnN0IF9fbTEyOGkgc2hhcnBlbjAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZzaGFycGVuWzBdKTsKKyAgICBjb25zdCBfX20xMjhpIHNoYXJwZW44ID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmc2hhcnBlbls4XSk7CisgICAgY29lZmYwID0gX21tX2FkZF9lcGkxNihjb2VmZjAsIHNoYXJwZW4wKTsKKyAgICBjb2VmZjggPSBfbW1fYWRkX2VwaTE2KGNvZWZmOCwgc2hhcnBlbjgpOworICB9CisKKyAgLy8gb3V0ID0gKGNvZWZmICogaVEgKyBCKSA+PiBRRklYCisgIHsKKyAgICAvLyBkb2luZyBjYWxjdWxhdGlvbnMgd2l0aCAzMmIgcHJlY2lzaW9uIChRRklYPTE3KQorICAgIC8vIG91dCA9IChjb2VmZiAqIGlRKQorICAgIGNvbnN0IF9fbTEyOGkgY29lZmZfaVEwSCA9IF9tbV9tdWxoaV9lcHUxNihjb2VmZjAsIGlxMCk7CisgICAgY29uc3QgX19tMTI4aSBjb2VmZl9pUTBMID0gX21tX211bGxvX2VwaTE2KGNvZWZmMCwgaXEwKTsKKyAgICBjb25zdCBfX20xMjhpIGNvZWZmX2lROEggPSBfbW1fbXVsaGlfZXB1MTYoY29lZmY4LCBpcTgpOworICAgIGNvbnN0IF9fbTEyOGkgY29lZmZfaVE4TCA9IF9tbV9tdWxsb19lcGkxNihjb2VmZjgsIGlxOCk7CisgICAgX19tMTI4aSBvdXRfMDAgPSBfbW1fdW5wYWNrbG9fZXBpMTYoY29lZmZfaVEwTCwgY29lZmZfaVEwSCk7CisgICAgX19tMTI4aSBvdXRfMDQgPSBfbW1fdW5wYWNraGlfZXBpMTYoY29lZmZfaVEwTCwgY29lZmZfaVEwSCk7CisgICAgX19tMTI4aSBvdXRfMDggPSBfbW1fdW5wYWNrbG9fZXBpMTYoY29lZmZfaVE4TCwgY29lZmZfaVE4SCk7CisgICAgX19tMTI4aSBvdXRfMTIgPSBfbW1fdW5wYWNraGlfZXBpMTYoY29lZmZfaVE4TCwgY29lZmZfaVE4SCk7CisgICAgLy8gb3V0ID0gKGNvZWZmICogaVEgKyBCKQorICAgIGNvbnN0IF9fbTEyOGkgYmlhc18wMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJm10eC0+Ymlhc19bMF0pOworICAgIGNvbnN0IF9fbTEyOGkgYmlhc18wNCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJm10eC0+Ymlhc19bNF0pOworICAgIGNvbnN0IF9fbTEyOGkgYmlhc18wOCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJm10eC0+Ymlhc19bOF0pOworICAgIGNvbnN0IF9fbTEyOGkgYmlhc18xMiA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJm10eC0+Ymlhc19bMTJdKTsKKyAgICBvdXRfMDAgPSBfbW1fYWRkX2VwaTMyKG91dF8wMCwgYmlhc18wMCk7CisgICAgb3V0XzA0ID0gX21tX2FkZF9lcGkzMihvdXRfMDQsIGJpYXNfMDQpOworICAgIG91dF8wOCA9IF9tbV9hZGRfZXBpMzIob3V0XzA4LCBiaWFzXzA4KTsKKyAgICBvdXRfMTIgPSBfbW1fYWRkX2VwaTMyKG91dF8xMiwgYmlhc18xMik7CisgICAgLy8gb3V0ID0gUVVBTlRESVYoY29lZmYsIGlRLCBCLCBRRklYKQorICAgIG91dF8wMCA9IF9tbV9zcmFpX2VwaTMyKG91dF8wMCwgUUZJWCk7CisgICAgb3V0XzA0ID0gX21tX3NyYWlfZXBpMzIob3V0XzA0LCBRRklYKTsKKyAgICBvdXRfMDggPSBfbW1fc3JhaV9lcGkzMihvdXRfMDgsIFFGSVgpOworICAgIG91dF8xMiA9IF9tbV9zcmFpX2VwaTMyKG91dF8xMiwgUUZJWCk7CisKKyAgICAvLyBwYWNrIHJlc3VsdCBhcyAxNmIKKyAgICBvdXQwID0gX21tX3BhY2tzX2VwaTMyKG91dF8wMCwgb3V0XzA0KTsKKyAgICBvdXQ4ID0gX21tX3BhY2tzX2VwaTMyKG91dF8wOCwgb3V0XzEyKTsKKworICAgIC8vIGlmIChjb2VmZiA+IDIwNDcpIGNvZWZmID0gMjA0NworICAgIG91dDAgPSBfbW1fbWluX2VwaTE2KG91dDAsIG1heF9jb2VmZl8yMDQ3KTsKKyAgICBvdXQ4ID0gX21tX21pbl9lcGkxNihvdXQ4LCBtYXhfY29lZmZfMjA0Nyk7CisgIH0KKworICAvLyBwdXQgc2lnbiBiYWNrCisgIG91dDAgPSBfbW1fc2lnbl9lcGkxNihvdXQwLCBpbjApOworICBvdXQ4ID0gX21tX3NpZ25fZXBpMTYob3V0OCwgaW44KTsKKworICAvLyBpbiA9IG91dCAqIFEKKyAgaW4wID0gX21tX211bGxvX2VwaTE2KG91dDAsIHEwKTsKKyAgaW44ID0gX21tX211bGxvX2VwaTE2KG91dDgsIHE4KTsKKworICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmaW5bMF0sIGluMCk7CisgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZpbls4XSwgaW44KTsKKworICAvLyB6aWd6YWcgdGhlIG91dHB1dCBiZWZvcmUgc3RvcmluZyBpdC4gVGhlIHJlLW9yZGVyaW5nIGlzOgorICAvLyAgICAwIDEgMiAzIDQgNSA2IDcgfCA4ICA5IDEwIDExIDEyIDEzIDE0IDE1CisgIC8vIC0+IDAgMSA0WzhdNSAyIDMgNiB8IDkgMTIgMTMgMTAgWzddMTEgMTQgMTUKKyAgLy8gVGhlcmUncyBvbmx5IHR3byBtaXNwbGFjZWQgZW50cmllcyAoWzhdIGFuZCBbN10pIHRoYXQgYXJlIGNyb3NzaW5nIHRoZQorICAvLyByZWcncyBib3VuZGFyaWVzLgorICAvLyBXZSB1c2UgcHNodWZiIGluc3RlYWQgb2YgcHNodWZsby9wc2h1ZmhpLgorICB7CisgICAgY29uc3QgX19tMTI4aSBrQ3N0X2xvID0gUFNIVUZCX0NTVCgwLCAxLCA0LCAtMSwgNSwgMiwgMywgNik7CisgICAgY29uc3QgX19tMTI4aSBrQ3N0XzcgPSBQU0hVRkJfQ1NUKC0xLCAtMSwgLTEsIC0xLCA3LCAtMSwgLTEsIC0xKTsKKyAgICBjb25zdCBfX20xMjhpIHRtcF9sbyA9IF9tbV9zaHVmZmxlX2VwaTgob3V0MCwga0NzdF9sbyk7CisgICAgY29uc3QgX19tMTI4aSB0bXBfNyA9IF9tbV9zaHVmZmxlX2VwaTgob3V0MCwga0NzdF83KTsgIC8vIGV4dHJhY3QgIzcKKyAgICBjb25zdCBfX20xMjhpIGtDc3RfaGkgPSBQU0hVRkJfQ1NUKDEsIDQsIDUsIDIsIC0xLCAzLCA2LCA3KTsKKyAgICBjb25zdCBfX20xMjhpIGtDc3RfOCA9IFBTSFVGQl9DU1QoLTEsIC0xLCAtMSwgMCwgLTEsIC0xLCAtMSwgLTEpOworICAgIGNvbnN0IF9fbTEyOGkgdG1wX2hpID0gX21tX3NodWZmbGVfZXBpOChvdXQ4LCBrQ3N0X2hpKTsKKyAgICBjb25zdCBfX20xMjhpIHRtcF84ID0gX21tX3NodWZmbGVfZXBpOChvdXQ4LCBrQ3N0XzgpOyAgLy8gZXh0cmFjdCAjOAorICAgIGNvbnN0IF9fbTEyOGkgb3V0X3owID0gX21tX29yX3NpMTI4KHRtcF9sbywgdG1wXzgpOworICAgIGNvbnN0IF9fbTEyOGkgb3V0X3o4ID0gX21tX29yX3NpMTI4KHRtcF9oaSwgdG1wXzcpOworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbMF0sIG91dF96MCk7CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJm91dFs4XSwgb3V0X3o4KTsKKyAgICBwYWNrZWRfb3V0ID0gX21tX3BhY2tzX2VwaTE2KG91dF96MCwgb3V0X3o4KTsKKyAgfQorCisgIC8vIGRldGVjdCBpZiBhbGwgJ291dCcgdmFsdWVzIGFyZSB6ZXJvZXMgb3Igbm90CisgIHJldHVybiAoX21tX21vdmVtYXNrX2VwaTgoX21tX2NtcGVxX2VwaTgocGFja2VkX291dCwgemVybykpICE9IDB4ZmZmZik7Cit9CisKKyN1bmRlZiBQU0hVRkJfQ1NUCisKK3N0YXRpYyBpbnQgUXVhbnRpemVCbG9ja19TU0U0MShpbnQxNl90IGluWzE2XSwgaW50MTZfdCBvdXRbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOE1hdHJpeCogY29uc3QgbXR4KSB7CisgIHJldHVybiBEb1F1YW50aXplQmxvY2tfU1NFNDEoaW4sIG91dCwgJm10eC0+c2hhcnBlbl9bMF0sIG10eCk7Cit9CisKK3N0YXRpYyBpbnQgUXVhbnRpemVCbG9ja1dIVF9TU0U0MShpbnQxNl90IGluWzE2XSwgaW50MTZfdCBvdXRbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOE1hdHJpeCogY29uc3QgbXR4KSB7CisgIHJldHVybiBEb1F1YW50aXplQmxvY2tfU1NFNDEoaW4sIG91dCwgTlVMTCwgbXR4KTsKK30KKworc3RhdGljIGludCBRdWFudGl6ZTJCbG9ja3NfU1NFNDEoaW50MTZfdCBpblszMl0sIGludDE2X3Qgb3V0WzMyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOE1hdHJpeCogY29uc3QgbXR4KSB7CisgIGludCBuejsKKyAgY29uc3QgdWludDE2X3QqIGNvbnN0IHNoYXJwZW4gPSAmbXR4LT5zaGFycGVuX1swXTsKKyAgbnogID0gRG9RdWFudGl6ZUJsb2NrX1NTRTQxKGluICsgMCAqIDE2LCBvdXQgKyAwICogMTYsIHNoYXJwZW4sIG10eCkgPDwgMDsKKyAgbnogfD0gRG9RdWFudGl6ZUJsb2NrX1NTRTQxKGluICsgMSAqIDE2LCBvdXQgKyAxICogMTYsIHNoYXJwZW4sIG10eCkgPDwgMTsKKyAgcmV0dXJuIG56OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgVlA4RW5jRHNwSW5pdFNTRTQxKHZvaWQpOworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFZQOEVuY0RzcEluaXRTU0U0MSh2b2lkKSB7CisgIFZQOENvbGxlY3RIaXN0b2dyYW0gPSBDb2xsZWN0SGlzdG9ncmFtX1NTRTQxOworICBWUDhFbmNRdWFudGl6ZUJsb2NrID0gUXVhbnRpemVCbG9ja19TU0U0MTsKKyAgVlA4RW5jUXVhbnRpemUyQmxvY2tzID0gUXVhbnRpemUyQmxvY2tzX1NTRTQxOworICBWUDhFbmNRdWFudGl6ZUJsb2NrV0hUID0gUXVhbnRpemVCbG9ja1dIVF9TU0U0MTsKKyAgVlA4VERpc3RvNHg0ID0gRGlzdG80eDRfU1NFNDE7CisgIFZQOFREaXN0bzE2eDE2ID0gRGlzdG8xNngxNl9TU0U0MTsKK30KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9TU0U0MQorCitXRUJQX0RTUF9JTklUX1NUVUIoVlA4RW5jRHNwSW5pdFNTRTQxKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX1NTRTQxCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2ZpbHRlcnMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZmlsdGVycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2OWEyMmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2ZpbHRlcnMuYwpAQCAtMCwwICsxLDI4NyBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFNwYXRpYWwgcHJlZGljdGlvbiB1c2luZyB2YXJpb3VzIGZpbHRlcnMKKy8vCisvLyBBdXRob3I6IFVydmFuZyAodXJ2YW5nQGdvb2dsZS5jb20pCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGVscGZ1bCBtYWNyby4KKworIyBkZWZpbmUgU0FOSVRZX0NIRUNLKGluLCBvdXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYXNzZXJ0KChpbikgIT0gTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGFzc2VydCgob3V0KSAhPSBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBhc3NlcnQod2lkdGggPiAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYXNzZXJ0KGhlaWdodCA+IDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGFzc2VydChzdHJpZGUgPj0gd2lkdGgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBhc3NlcnQocm93ID49IDAgJiYgbnVtX3Jvd3MgPiAwICYmIHJvdyArIG51bV9yb3dzIDw9IGhlaWdodCk7ICAgICAgICAgICAgICAgIFwKKyAgKHZvaWQpaGVpZ2h0OyAgLy8gU2lsZW5jZSB1bnVzZWQgd2FybmluZy4KKworI2lmICFXRUJQX05FT05fT01JVF9DX0NPREUKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFByZWRpY3RMaW5lX0MoY29uc3QgdWludDhfdCogc3JjLCBjb25zdCB1aW50OF90KiBwcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBsZW5ndGgsIGludCBpbnZlcnNlKSB7CisgIGludCBpOworICBpZiAoaW52ZXJzZSkgeworICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgZHN0W2ldID0gc3JjW2ldICsgcHJlZFtpXTsKKyAgfSBlbHNlIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIGRzdFtpXSA9IHNyY1tpXSAtIHByZWRbaV07CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhvcml6b250YWwgZmlsdGVyLgorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEb0hvcml6b250YWxGaWx0ZXJfQyhjb25zdCB1aW50OF90KiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3csIGludCBudW1fcm93cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnZlcnNlLCB1aW50OF90KiBvdXQpIHsKKyAgY29uc3QgdWludDhfdCogcHJlZHM7CisgIGNvbnN0IHNpemVfdCBzdGFydF9vZmZzZXQgPSByb3cgKiBzdHJpZGU7CisgIGNvbnN0IGludCBsYXN0X3JvdyA9IHJvdyArIG51bV9yb3dzOworICBTQU5JVFlfQ0hFQ0soaW4sIG91dCk7CisgIGluICs9IHN0YXJ0X29mZnNldDsKKyAgb3V0ICs9IHN0YXJ0X29mZnNldDsKKyAgcHJlZHMgPSBpbnZlcnNlID8gb3V0IDogaW47CisKKyAgaWYgKHJvdyA9PSAwKSB7CisgICAgLy8gTGVmdG1vc3QgcGl4ZWwgaXMgdGhlIHNhbWUgYXMgaW5wdXQgZm9yIHRvcG1vc3Qgc2NhbmxpbmUuCisgICAgb3V0WzBdID0gaW5bMF07CisgICAgUHJlZGljdExpbmVfQyhpbiArIDEsIHByZWRzLCBvdXQgKyAxLCB3aWR0aCAtIDEsIGludmVyc2UpOworICAgIHJvdyA9IDE7CisgICAgcHJlZHMgKz0gc3RyaWRlOworICAgIGluICs9IHN0cmlkZTsKKyAgICBvdXQgKz0gc3RyaWRlOworICB9CisKKyAgLy8gRmlsdGVyIGxpbmUtYnktbGluZS4KKyAgd2hpbGUgKHJvdyA8IGxhc3Rfcm93KSB7CisgICAgLy8gTGVmdG1vc3QgcGl4ZWwgaXMgcHJlZGljdGVkIGZyb20gYWJvdmUuCisgICAgUHJlZGljdExpbmVfQyhpbiwgcHJlZHMgLSBzdHJpZGUsIG91dCwgMSwgaW52ZXJzZSk7CisgICAgUHJlZGljdExpbmVfQyhpbiArIDEsIHByZWRzLCBvdXQgKyAxLCB3aWR0aCAtIDEsIGludmVyc2UpOworICAgICsrcm93OworICAgIHByZWRzICs9IHN0cmlkZTsKKyAgICBpbiArPSBzdHJpZGU7CisgICAgb3V0ICs9IHN0cmlkZTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVmVydGljYWwgZmlsdGVyLgorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEb1ZlcnRpY2FsRmlsdGVyX0MoY29uc3QgdWludDhfdCogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3csIGludCBudW1fcm93cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW52ZXJzZSwgdWludDhfdCogb3V0KSB7CisgIGNvbnN0IHVpbnQ4X3QqIHByZWRzOworICBjb25zdCBzaXplX3Qgc3RhcnRfb2Zmc2V0ID0gcm93ICogc3RyaWRlOworICBjb25zdCBpbnQgbGFzdF9yb3cgPSByb3cgKyBudW1fcm93czsKKyAgU0FOSVRZX0NIRUNLKGluLCBvdXQpOworICBpbiArPSBzdGFydF9vZmZzZXQ7CisgIG91dCArPSBzdGFydF9vZmZzZXQ7CisgIHByZWRzID0gaW52ZXJzZSA/IG91dCA6IGluOworCisgIGlmIChyb3cgPT0gMCkgeworICAgIC8vIFZlcnkgZmlyc3QgdG9wLWxlZnQgcGl4ZWwgaXMgY29waWVkLgorICAgIG91dFswXSA9IGluWzBdOworICAgIC8vIFJlc3Qgb2YgdG9wIHNjYW4tbGluZSBpcyBsZWZ0LXByZWRpY3RlZC4KKyAgICBQcmVkaWN0TGluZV9DKGluICsgMSwgcHJlZHMsIG91dCArIDEsIHdpZHRoIC0gMSwgaW52ZXJzZSk7CisgICAgcm93ID0gMTsKKyAgICBpbiArPSBzdHJpZGU7CisgICAgb3V0ICs9IHN0cmlkZTsKKyAgfSBlbHNlIHsKKyAgICAvLyBXZSBhcmUgc3RhcnRpbmcgZnJvbSBpbi1iZXR3ZWVuLiBNYWtlIHN1cmUgJ3ByZWRzJyBwb2ludHMgdG8gcHJldiByb3cuCisgICAgcHJlZHMgLT0gc3RyaWRlOworICB9CisKKyAgLy8gRmlsdGVyIGxpbmUtYnktbGluZS4KKyAgd2hpbGUgKHJvdyA8IGxhc3Rfcm93KSB7CisgICAgUHJlZGljdExpbmVfQyhpbiwgcHJlZHMsIG91dCwgd2lkdGgsIGludmVyc2UpOworICAgICsrcm93OworICAgIHByZWRzICs9IHN0cmlkZTsKKyAgICBpbiArPSBzdHJpZGU7CisgICAgb3V0ICs9IHN0cmlkZTsKKyAgfQorfQorI2VuZGlmICAvLyAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBHcmFkaWVudCBmaWx0ZXIuCisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgR3JhZGllbnRQcmVkaWN0b3JfQyh1aW50OF90IGEsIHVpbnQ4X3QgYiwgdWludDhfdCBjKSB7CisgIGNvbnN0IGludCBnID0gYSArIGIgLSBjOworICByZXR1cm4gKChnICYgfjB4ZmYpID09IDApID8gZyA6IChnIDwgMCkgPyAwIDogMjU1OyAgLy8gY2xpcCB0byA4Yml0Cit9CisKKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEb0dyYWRpZW50RmlsdGVyX0MoY29uc3QgdWludDhfdCogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3csIGludCBudW1fcm93cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW52ZXJzZSwgdWludDhfdCogb3V0KSB7CisgIGNvbnN0IHVpbnQ4X3QqIHByZWRzOworICBjb25zdCBzaXplX3Qgc3RhcnRfb2Zmc2V0ID0gcm93ICogc3RyaWRlOworICBjb25zdCBpbnQgbGFzdF9yb3cgPSByb3cgKyBudW1fcm93czsKKyAgU0FOSVRZX0NIRUNLKGluLCBvdXQpOworICBpbiArPSBzdGFydF9vZmZzZXQ7CisgIG91dCArPSBzdGFydF9vZmZzZXQ7CisgIHByZWRzID0gaW52ZXJzZSA/IG91dCA6IGluOworCisgIC8vIGxlZnQgcHJlZGljdGlvbiBmb3IgdG9wIHNjYW4tbGluZQorICBpZiAocm93ID09IDApIHsKKyAgICBvdXRbMF0gPSBpblswXTsKKyAgICBQcmVkaWN0TGluZV9DKGluICsgMSwgcHJlZHMsIG91dCArIDEsIHdpZHRoIC0gMSwgaW52ZXJzZSk7CisgICAgcm93ID0gMTsKKyAgICBwcmVkcyArPSBzdHJpZGU7CisgICAgaW4gKz0gc3RyaWRlOworICAgIG91dCArPSBzdHJpZGU7CisgIH0KKworICAvLyBGaWx0ZXIgbGluZS1ieS1saW5lLgorICB3aGlsZSAocm93IDwgbGFzdF9yb3cpIHsKKyAgICBpbnQgdzsKKyAgICAvLyBsZWZ0bW9zdCBwaXhlbDogcHJlZGljdCBmcm9tIGFib3ZlLgorICAgIFByZWRpY3RMaW5lX0MoaW4sIHByZWRzIC0gc3RyaWRlLCBvdXQsIDEsIGludmVyc2UpOworICAgIGZvciAodyA9IDE7IHcgPCB3aWR0aDsgKyt3KSB7CisgICAgICBjb25zdCBpbnQgcHJlZCA9IEdyYWRpZW50UHJlZGljdG9yX0MocHJlZHNbdyAtIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRzW3cgLSBzdHJpZGVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRzW3cgLSBzdHJpZGUgLSAxXSk7CisgICAgICBvdXRbd10gPSBpblt3XSArIChpbnZlcnNlID8gcHJlZCA6IC1wcmVkKTsKKyAgICB9CisgICAgKytyb3c7CisgICAgcHJlZHMgKz0gc3RyaWRlOworICAgIGluICs9IHN0cmlkZTsKKyAgICBvdXQgKz0gc3RyaWRlOworICB9Cit9CisjZW5kaWYgIC8vICFXRUJQX05FT05fT01JVF9DX0NPREUKKworI3VuZGVmIFNBTklUWV9DSEVDSworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorc3RhdGljIHZvaWQgSG9yaXpvbnRhbEZpbHRlcl9DKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCB1aW50OF90KiBmaWx0ZXJlZF9kYXRhKSB7CisgIERvSG9yaXpvbnRhbEZpbHRlcl9DKGRhdGEsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgMCwgaGVpZ2h0LCAwLAorICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZF9kYXRhKTsKK30KKworc3RhdGljIHZvaWQgVmVydGljYWxGaWx0ZXJfQyhjb25zdCB1aW50OF90KiBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIHVpbnQ4X3QqIGZpbHRlcmVkX2RhdGEpIHsKKyAgRG9WZXJ0aWNhbEZpbHRlcl9DKGRhdGEsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgMCwgaGVpZ2h0LCAwLCBmaWx0ZXJlZF9kYXRhKTsKK30KKworc3RhdGljIHZvaWQgR3JhZGllbnRGaWx0ZXJfQyhjb25zdCB1aW50OF90KiBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIHVpbnQ4X3QqIGZpbHRlcmVkX2RhdGEpIHsKKyAgRG9HcmFkaWVudEZpbHRlcl9DKGRhdGEsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgMCwgaGVpZ2h0LCAwLCBmaWx0ZXJlZF9kYXRhKTsKK30KKyNlbmRpZiAgLy8gIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBIb3Jpem9udGFsVW5maWx0ZXJfQyhjb25zdCB1aW50OF90KiBwcmV2LCBjb25zdCB1aW50OF90KiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG91dCwgaW50IHdpZHRoKSB7CisgIHVpbnQ4X3QgcHJlZCA9IChwcmV2ID09IE5VTEwpID8gMCA6IHByZXZbMF07CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7ICsraSkgeworICAgIG91dFtpXSA9IHByZWQgKyBpbltpXTsKKyAgICBwcmVkID0gb3V0W2ldOworICB9Cit9CisKKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCitzdGF0aWMgdm9pZCBWZXJ0aWNhbFVuZmlsdGVyX0MoY29uc3QgdWludDhfdCogcHJldiwgY29uc3QgdWludDhfdCogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3V0LCBpbnQgd2lkdGgpIHsKKyAgaWYgKHByZXYgPT0gTlVMTCkgeworICAgIEhvcml6b250YWxVbmZpbHRlcl9DKE5VTEwsIGluLCBvdXQsIHdpZHRoKTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7ICsraSkgb3V0W2ldID0gcHJldltpXSArIGluW2ldOworICB9Cit9CisjZW5kaWYgIC8vICFXRUJQX05FT05fT01JVF9DX0NPREUKKworc3RhdGljIHZvaWQgR3JhZGllbnRVbmZpbHRlcl9DKGNvbnN0IHVpbnQ4X3QqIHByZXYsIGNvbnN0IHVpbnQ4X3QqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG91dCwgaW50IHdpZHRoKSB7CisgIGlmIChwcmV2ID09IE5VTEwpIHsKKyAgICBIb3Jpem9udGFsVW5maWx0ZXJfQyhOVUxMLCBpbiwgb3V0LCB3aWR0aCk7CisgIH0gZWxzZSB7CisgICAgdWludDhfdCB0b3AgPSBwcmV2WzBdLCB0b3BfbGVmdCA9IHRvcCwgbGVmdCA9IHRvcDsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7ICsraSkgeworICAgICAgdG9wID0gcHJldltpXTsgIC8vIG5lZWQgdG8gcmVhZCB0aGlzIGZpcnN0LCBpbiBjYXNlIHByZXY9PW91dAorICAgICAgbGVmdCA9IGluW2ldICsgR3JhZGllbnRQcmVkaWN0b3JfQyhsZWZ0LCB0b3AsIHRvcF9sZWZ0KTsKKyAgICAgIHRvcF9sZWZ0ID0gdG9wOworICAgICAgb3V0W2ldID0gbGVmdDsKKyAgICB9CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEluaXQgZnVuY3Rpb24KKworV2ViUEZpbHRlckZ1bmMgV2ViUEZpbHRlcnNbV0VCUF9GSUxURVJfTEFTVF07CitXZWJQVW5maWx0ZXJGdW5jIFdlYlBVbmZpbHRlcnNbV0VCUF9GSUxURVJfTEFTVF07CisKK2V4dGVybiB2b2lkIFZQOEZpbHRlcnNJbml0TUlQU2RzcFIyKHZvaWQpOworZXh0ZXJuIHZvaWQgVlA4RmlsdGVyc0luaXRNU0Eodm9pZCk7CitleHRlcm4gdm9pZCBWUDhGaWx0ZXJzSW5pdE5FT04odm9pZCk7CitleHRlcm4gdm9pZCBWUDhGaWx0ZXJzSW5pdFNTRTIodm9pZCk7CisKK1dFQlBfRFNQX0lOSVRfRlVOQyhWUDhGaWx0ZXJzSW5pdCkgeworICBXZWJQVW5maWx0ZXJzW1dFQlBfRklMVEVSX05PTkVdID0gTlVMTDsKKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCisgIFdlYlBVbmZpbHRlcnNbV0VCUF9GSUxURVJfSE9SSVpPTlRBTF0gPSBIb3Jpem9udGFsVW5maWx0ZXJfQzsKKyAgV2ViUFVuZmlsdGVyc1tXRUJQX0ZJTFRFUl9WRVJUSUNBTF0gPSBWZXJ0aWNhbFVuZmlsdGVyX0M7CisjZW5kaWYKKyAgV2ViUFVuZmlsdGVyc1tXRUJQX0ZJTFRFUl9HUkFESUVOVF0gPSBHcmFkaWVudFVuZmlsdGVyX0M7CisKKyAgV2ViUEZpbHRlcnNbV0VCUF9GSUxURVJfTk9ORV0gPSBOVUxMOworI2lmICFXRUJQX05FT05fT01JVF9DX0NPREUKKyAgV2ViUEZpbHRlcnNbV0VCUF9GSUxURVJfSE9SSVpPTlRBTF0gPSBIb3Jpem9udGFsRmlsdGVyX0M7CisgIFdlYlBGaWx0ZXJzW1dFQlBfRklMVEVSX1ZFUlRJQ0FMXSA9IFZlcnRpY2FsRmlsdGVyX0M7CisgIFdlYlBGaWx0ZXJzW1dFQlBfRklMVEVSX0dSQURJRU5UXSA9IEdyYWRpZW50RmlsdGVyX0M7CisjZW5kaWYKKworICBpZiAoVlA4R2V0Q1BVSW5mbyAhPSBOVUxMKSB7CisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0UyKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtTU0UyKSkgeworICAgICAgVlA4RmlsdGVyc0luaXRTU0UyKCk7CisgICAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTX0RTUF9SMikKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrTUlQU2RzcFIyKSkgeworICAgICAgVlA4RmlsdGVyc0luaXRNSVBTZHNwUjIoKTsKKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01TQSkKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrTVNBKSkgeworICAgICAgVlA4RmlsdGVyc0luaXRNU0EoKTsKKyAgICB9CisjZW5kaWYKKyAgfQorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9ORU9OKQorICBpZiAoV0VCUF9ORU9OX09NSVRfQ19DT0RFIHx8CisgICAgICAoVlA4R2V0Q1BVSW5mbyAhPSBOVUxMICYmIFZQOEdldENQVUluZm8oa05FT04pKSkgeworICAgIFZQOEZpbHRlcnNJbml0TkVPTigpOworICB9CisjZW5kaWYKKworICBhc3NlcnQoV2ViUFVuZmlsdGVyc1tXRUJQX0ZJTFRFUl9IT1JJWk9OVEFMXSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFdlYlBVbmZpbHRlcnNbV0VCUF9GSUxURVJfVkVSVElDQUxdICE9IE5VTEwpOworICBhc3NlcnQoV2ViUFVuZmlsdGVyc1tXRUJQX0ZJTFRFUl9HUkFESUVOVF0gIT0gTlVMTCk7CisgIGFzc2VydChXZWJQRmlsdGVyc1tXRUJQX0ZJTFRFUl9IT1JJWk9OVEFMXSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFdlYlBGaWx0ZXJzW1dFQlBfRklMVEVSX1ZFUlRJQ0FMXSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFdlYlBGaWx0ZXJzW1dFQlBfRklMVEVSX0dSQURJRU5UXSAhPSBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZmlsdGVyc19taXBzX2RzcF9yMi5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9maWx0ZXJzX21pcHNfZHNwX3IyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM4MmIxMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZmlsdGVyc19taXBzX2RzcF9yMi5jCkBAIC0wLDAgKzEsNDAyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU3BhdGlhbCBwcmVkaWN0aW9uIHVzaW5nIHZhcmlvdXMgZmlsdGVycworLy8KKy8vIEF1dGhvcihzKTogQnJhbmltaXIgVmFzaWMgKGJyYW5pbWlyLnZhc2ljQGltZ3RlYy5jb20pCisvLyAgICAgICAgICAgIERqb3JkamUgUGVzdXQgKGRqb3JkamUucGVzdXRAaW1ndGVjLmNvbSkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFNfRFNQX1IyKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhlbHBmdWwgbWFjcm8uCisKKyMgZGVmaW5lIFNBTklUWV9DSEVDSyhpbiwgb3V0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGFzc2VydChpbiAhPSBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBhc3NlcnQob3V0ICE9IE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYXNzZXJ0KHdpZHRoID4gMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGFzc2VydChoZWlnaHQgPiAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBhc3NlcnQoc3RyaWRlID49IHdpZHRoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYXNzZXJ0KHJvdyA+PSAwICYmIG51bV9yb3dzID4gMCAmJiByb3cgKyBudW1fcm93cyA8PSBoZWlnaHQpOyAgICAgICAgICAgICAgICBcCisgICh2b2lkKWhlaWdodDsgIC8vIFNpbGVuY2UgdW51c2VkIHdhcm5pbmcuCisKKyNkZWZpbmUgRE9fUFJFRElDVF9MSU5FKFNSQywgRFNULCBMRU5HVEgsIElOVkVSU0UpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDhfdCogcHNyYyA9ICh1aW50OF90KikoU1JDKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQ4X3QqIHBkc3QgPSAodWludDhfdCopKERTVCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgaWxlbmd0aCA9IChpbnQpKExFTkdUSCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA2OyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fYXNtX18gdm9sYXRpbGUgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICIuc2V0ICAgICAgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiLnNldCAgICAgIG5vcmVvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgInNybCAgICAgICAlW3RlbXAwXSwgICAgJVtsZW5ndGhdLCAgICAyICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJiZXF6ICAgICAgJVt0ZW1wMF0sICAgIDRmICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiIGFuZGkgICAgICVbdGVtcDZdLCAgICAlW2xlbmd0aF0sICAgIDMgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICIuaWYgIiAjSU5WRVJTRSAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAibGJ1ICAgICAgICVbdGVtcDFdLCAgICAtMSglW2RzdF0pICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImxidSAgICAgICAlW3RlbXAyXSwgICAgMCglW3NyY10pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJsYnUgICAgICAgJVt0ZW1wM10sICAgIDEoJVtzcmNdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAibGJ1ICAgICAgICVbdGVtcDRdLCAgICAyKCVbc3JjXSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImxidSAgICAgICAlW3RlbXA1XSwgICAgMyglW3NyY10pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJhZGR1ICAgICAgJVt0ZW1wMV0sICAgICVbdGVtcDFdLCAgICAgJVt0ZW1wMl0gICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiYWRkdSAgICAgICVbdGVtcDJdLCAgICAlW3RlbXAxXSwgICAgICVbdGVtcDNdICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImFkZHUgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wMl0sICAgICAlW3RlbXA0XSAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJhZGR1ICAgICAgJVt0ZW1wNF0sICAgICVbdGVtcDNdLCAgICAgJVt0ZW1wNV0gICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAic2IgICAgICAgICVbdGVtcDFdLCAgICAwKCVbZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgInNiICAgICAgICAlW3RlbXAyXSwgICAgMSglW2RzdF0pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJzYiAgICAgICAgJVt0ZW1wM10sICAgIDIoJVtkc3RdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAic2IgICAgICAgICVbdGVtcDRdLCAgICAzKCVbZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImFkZGl1ICAgICAlW3NyY10sICAgICAgJVtzcmNdLCAgICAgICA0ICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJhZGRpdSAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDBdLCAgICAgLTEgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiYm5leiAgICAgICVbdGVtcDBdLCAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgIiBhZGRpdSAgICAlW2RzdF0sICAgICAgJVtkc3RdLCAgICAgICA0ICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAiLmVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgInVsdyAgICAgICAlW3RlbXAxXSwgICAgLTEoJVtzcmNdKSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJ1bHcgICAgICAgJVt0ZW1wMl0sICAgIDAoJVtzcmNdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiYWRkaXUgICAgICVbc3JjXSwgICAgICAlW3NyY10sICAgICAgIDQgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImFkZGl1ICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMF0sICAgICAtMSAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJzdWJ1LnFiICAgJVt0ZW1wM10sICAgICVbdGVtcDJdLCAgICAgJVt0ZW1wMV0gICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAidXN3ICAgICAgICVbdGVtcDNdLCAgICAwKCVbZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImJuZXogICAgICAlW3RlbXAwXSwgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICIgYWRkaXUgICAgJVtkc3RdLCAgICAgICVbZHN0XSwgICAgICAgNCAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgIi5lbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICI0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJiZXF6ICAgICAgJVt0ZW1wNl0sICAgIDNmICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiIG5vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJsYnUgICAgICAgJVt0ZW1wMl0sICAgIDAoJVtzcmNdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgIi5pZiAiICNJTlZFUlNFICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImxidSAgICAgICAlW3RlbXAxXSwgICAgLTEoJVtkc3RdKSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJhZGR1ICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDFdLCAgICAgJVt0ZW1wMl0gICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgIi5lbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImxidSAgICAgICAlW3RlbXAxXSwgICAgLTEoJVtzcmNdKSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJzdWJ1ICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDFdLCAgICAgJVt0ZW1wMl0gICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgIi5lbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImFkZGl1ICAgICAlW3NyY10sICAgICAgJVtzcmNdLCAgICAgICAxICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJzYiAgICAgICAgJVt0ZW1wM10sICAgIDAoJVtkc3RdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiYWRkaXUgICAgICVbdGVtcDZdLCAgICAlW3RlbXA2XSwgICAgIC0xICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImJuZXogICAgICAlW3RlbXA2XSwgICAgMmIgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICIgYWRkaXUgICAgJVtkc3RdLCAgICAgICVbZHN0XSwgICAgICAgMSAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgIjM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgIi5zZXQgICAgICBwb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwgICAgICAgICBcCisgICAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksICAgICAgICAgXAorICAgICAgICBbdGVtcDZdIj0mciIodGVtcDYpLCBbZHN0XSIrJnIiKHBkc3QpLCBbc3JjXSIrJnIiKHBzcmMpICAgICAgICAgICAgICAgIFwKKyAgICAgIDogW2xlbmd0aF0iciIoaWxlbmd0aCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICA6ICJtZW1vcnkiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUHJlZGljdExpbmVfTUlQU2RzcFIyKGNvbnN0IHVpbnQ4X3QqIHNyYywgdWludDhfdCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgpIHsKKyAgRE9fUFJFRElDVF9MSU5FKHNyYywgZHN0LCBsZW5ndGgsIDApOworfQorCisjZGVmaW5lIERPX1BSRURJQ1RfTElORV9WRVJUSUNBTChTUkMsIFBSRUQsIERTVCwgTEVOR1RILCBJTlZFUlNFKSBkbyB7ICAgICAgICAgXAorICAgIGNvbnN0IHVpbnQ4X3QqIHBzcmMgPSAodWludDhfdCopKFNSQyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB1aW50OF90KiBwcHJlZCA9ICh1aW50OF90KikoUFJFRCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCogcGRzdCA9ICh1aW50OF90KikoRFNUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBpbGVuZ3RoID0gKGludCkoTEVOR1RIKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3OyAgICAgICAgICAgICAgICBcCisgICAgX19hc21fXyB2b2xhdGlsZSAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIi5zZXQgICAgICBwdXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICIuc2V0ICAgICAgbm9yZW9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAic3JsICAgICAgICVbdGVtcDBdLCAgICAlW2xlbmd0aF0sICAgIDB4MyAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImJlcXogICAgICAlW3RlbXAwXSwgICAgNGYgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICIgYW5kaSAgICAgJVt0ZW1wN10sICAgICVbbGVuZ3RoXSwgICAgMHg3ICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgInVsdyAgICAgICAlW3RlbXAxXSwgICAgMCglW3NyY10pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJ1bHcgICAgICAgJVt0ZW1wMl0sICAgIDAoJVtwcmVkXSkgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAidWx3ICAgICAgICVbdGVtcDNdLCAgICA0KCVbc3JjXSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgInVsdyAgICAgICAlW3RlbXA0XSwgICAgNCglW3ByZWRdKSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJhZGRpdSAgICAgJVtzcmNdLCAgICAgICVbc3JjXSwgICAgICAgOCAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgIi5pZiAiICNJTlZFUlNFICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImFkZHUucWIgICAlW3RlbXA1XSwgICAgJVt0ZW1wMV0sICAgICAlW3RlbXAyXSAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJhZGR1LnFiICAgJVt0ZW1wNl0sICAgICVbdGVtcDNdLCAgICAgJVt0ZW1wNF0gICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgIi5lbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgInN1YnUucWIgICAlW3RlbXA1XSwgICAgJVt0ZW1wMV0sICAgICAlW3RlbXAyXSAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJzdWJ1LnFiICAgJVt0ZW1wNl0sICAgICVbdGVtcDNdLCAgICAgJVt0ZW1wNF0gICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgIi5lbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImFkZGl1ICAgICAlW3ByZWRdLCAgICAgJVtwcmVkXSwgICAgICA4ICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJ1c3cgICAgICAgJVt0ZW1wNV0sICAgIDAoJVtkc3RdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAidXN3ICAgICAgICVbdGVtcDZdLCAgICA0KCVbZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImFkZGl1ICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMF0sICAgICAtMSAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJibmV6ICAgICAgJVt0ZW1wMF0sICAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiIGFkZGl1ICAgICVbZHN0XSwgICAgICAlW2RzdF0sICAgICAgIDggICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICI0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJiZXF6ICAgICAgJVt0ZW1wN10sICAgIDNmICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiIG5vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJsYnUgICAgICAgJVt0ZW1wMV0sICAgIDAoJVtzcmNdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAibGJ1ICAgICAgICVbdGVtcDJdLCAgICAwKCVbcHJlZF0pICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImFkZGl1ICAgICAlW3NyY10sICAgICAgJVtzcmNdLCAgICAgICAxICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJhZGRpdSAgICAgJVtwcmVkXSwgICAgICVbcHJlZF0sICAgICAgMSAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgIi5pZiAiICNJTlZFUlNFICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImFkZHUgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wMV0sICAgICAlW3RlbXAyXSAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAiLmVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAic3VidSAgICAgICVbdGVtcDNdLCAgICAlW3RlbXAxXSwgICAgICVbdGVtcDJdICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICIuZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJzYiAgICAgICAgJVt0ZW1wM10sICAgIDAoJVtkc3RdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiYWRkaXUgICAgICVbdGVtcDddLCAgICAlW3RlbXA3XSwgICAgIC0xICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImJuZXogICAgICAlW3RlbXA3XSwgICAgMmIgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICIgYWRkaXUgICAgJVtkc3RdLCAgICAgICVbZHN0XSwgICAgICAgMSAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgIjM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgIi5zZXQgICAgICBwb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwgICAgICAgICBcCisgICAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksICAgICAgICAgXAorICAgICAgICBbdGVtcDZdIj0mciIodGVtcDYpLCBbdGVtcDddIj0mciIodGVtcDcpLCBbcHJlZF0iKyZyIihwcHJlZCksICAgICAgICAgIFwKKyAgICAgICAgW2RzdF0iKyZyIihwZHN0KSwgW3NyY10iKyZyIihwc3JjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICA6IFtsZW5ndGhdInIiKGlsZW5ndGgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgOiAibWVtb3J5IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgUFJFRElDVF9MSU5FX09ORV9QQVNTKFNSQywgUFJFRCwgRFNUKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IHRlbXAxLCB0ZW1wMiwgdGVtcDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fYXNtX18gdm9sYXRpbGUgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJsYnUgICAgICAgJVt0ZW1wMV0sICAgMCglW3NyY10pICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAibGJ1ICAgICAgICVbdGVtcDJdLCAgIDAoJVtwcmVkXSkgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgInN1YnUgICAgICAlW3RlbXAzXSwgICAlW3RlbXAxXSwgICAlW3RlbXAyXSAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJzYiAgICAgICAgJVt0ZW1wM10sICAgMCglW2RzdF0pICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgICBcCisgICAgICA6IFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksIFt0ZW1wM10iPSZyIih0ZW1wMykgICAgICAgICAgXAorICAgICAgOiBbcHJlZF0iciIoKFBSRUQpKSwgW2RzdF0iciIoKERTVCkpLCBbc3JjXSJyIigoU1JDKSkgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDogIm1lbW9yeSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSG9yaXpvbnRhbCBmaWx0ZXIuCisKKyNkZWZpbmUgRklMVEVSX0xJTkVfQllfTElORSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd2hpbGUgKHJvdyA8IGxhc3Rfcm93KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgUFJFRElDVF9MSU5FX09ORV9QQVNTKGluLCBwcmVkcyAtIHN0cmlkZSwgb3V0KTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIERPX1BSRURJQ1RfTElORShpbiArIDEsIG91dCArIDEsIHdpZHRoIC0gMSwgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICArK3JvdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcHJlZHMgKz0gc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGluICs9IHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBvdXQgKz0gc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRG9Ib3Jpem9udGFsRmlsdGVyX01JUFNkc3BSMihjb25zdCB1aW50OF90KiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93LCBpbnQgbnVtX3Jvd3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG91dCkgeworICBjb25zdCB1aW50OF90KiBwcmVkczsKKyAgY29uc3Qgc2l6ZV90IHN0YXJ0X29mZnNldCA9IHJvdyAqIHN0cmlkZTsKKyAgY29uc3QgaW50IGxhc3Rfcm93ID0gcm93ICsgbnVtX3Jvd3M7CisgIFNBTklUWV9DSEVDSyhpbiwgb3V0KTsKKyAgaW4gKz0gc3RhcnRfb2Zmc2V0OworICBvdXQgKz0gc3RhcnRfb2Zmc2V0OworICBwcmVkcyA9IGluOworCisgIGlmIChyb3cgPT0gMCkgeworICAgIC8vIExlZnRtb3N0IHBpeGVsIGlzIHRoZSBzYW1lIGFzIGlucHV0IGZvciB0b3Btb3N0IHNjYW5saW5lLgorICAgIG91dFswXSA9IGluWzBdOworICAgIFByZWRpY3RMaW5lX01JUFNkc3BSMihpbiArIDEsIG91dCArIDEsIHdpZHRoIC0gMSk7CisgICAgcm93ID0gMTsKKyAgICBwcmVkcyArPSBzdHJpZGU7CisgICAgaW4gKz0gc3RyaWRlOworICAgIG91dCArPSBzdHJpZGU7CisgIH0KKworICAvLyBGaWx0ZXIgbGluZS1ieS1saW5lLgorICBGSUxURVJfTElORV9CWV9MSU5FOworfQorI3VuZGVmIEZJTFRFUl9MSU5FX0JZX0xJTkUKKworc3RhdGljIHZvaWQgSG9yaXpvbnRhbEZpbHRlcl9NSVBTZHNwUjIoY29uc3QgdWludDhfdCogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIHVpbnQ4X3QqIGZpbHRlcmVkX2RhdGEpIHsKKyAgRG9Ib3Jpem9udGFsRmlsdGVyX01JUFNkc3BSMihkYXRhLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIDAsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZF9kYXRhKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZlcnRpY2FsIGZpbHRlci4KKworI2RlZmluZSBGSUxURVJfTElORV9CWV9MSU5FIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB3aGlsZSAocm93IDwgbGFzdF9yb3cpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBET19QUkVESUNUX0xJTkVfVkVSVElDQUwoaW4sIHByZWRzLCBvdXQsIHdpZHRoLCAwKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKytyb3c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHByZWRzICs9IHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpbiArPSBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgb3V0ICs9IHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIERvVmVydGljYWxGaWx0ZXJfTUlQU2RzcFIyKGNvbnN0IHVpbnQ4X3QqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3csIGludCBudW1fcm93cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG91dCkgeworICBjb25zdCB1aW50OF90KiBwcmVkczsKKyAgY29uc3Qgc2l6ZV90IHN0YXJ0X29mZnNldCA9IHJvdyAqIHN0cmlkZTsKKyAgY29uc3QgaW50IGxhc3Rfcm93ID0gcm93ICsgbnVtX3Jvd3M7CisgIFNBTklUWV9DSEVDSyhpbiwgb3V0KTsKKyAgaW4gKz0gc3RhcnRfb2Zmc2V0OworICBvdXQgKz0gc3RhcnRfb2Zmc2V0OworICBwcmVkcyA9IGluOworCisgIGlmIChyb3cgPT0gMCkgeworICAgIC8vIFZlcnkgZmlyc3QgdG9wLWxlZnQgcGl4ZWwgaXMgY29waWVkLgorICAgIG91dFswXSA9IGluWzBdOworICAgIC8vIFJlc3Qgb2YgdG9wIHNjYW4tbGluZSBpcyBsZWZ0LXByZWRpY3RlZC4KKyAgICBQcmVkaWN0TGluZV9NSVBTZHNwUjIoaW4gKyAxLCBvdXQgKyAxLCB3aWR0aCAtIDEpOworICAgIHJvdyA9IDE7CisgICAgaW4gKz0gc3RyaWRlOworICAgIG91dCArPSBzdHJpZGU7CisgIH0gZWxzZSB7CisgICAgLy8gV2UgYXJlIHN0YXJ0aW5nIGZyb20gaW4tYmV0d2Vlbi4gTWFrZSBzdXJlICdwcmVkcycgcG9pbnRzIHRvIHByZXYgcm93LgorICAgIHByZWRzIC09IHN0cmlkZTsKKyAgfQorCisgIC8vIEZpbHRlciBsaW5lLWJ5LWxpbmUuCisgIEZJTFRFUl9MSU5FX0JZX0xJTkU7Cit9CisjdW5kZWYgRklMVEVSX0xJTkVfQllfTElORQorCitzdGF0aWMgdm9pZCBWZXJ0aWNhbEZpbHRlcl9NSVBTZHNwUjIoY29uc3QgdWludDhfdCogZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIHVpbnQ4X3QqIGZpbHRlcmVkX2RhdGEpIHsKKyAgRG9WZXJ0aWNhbEZpbHRlcl9NSVBTZHNwUjIoZGF0YSwgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCAwLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkX2RhdGEpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gR3JhZGllbnQgZmlsdGVyLgorCitzdGF0aWMgaW50IEdyYWRpZW50UHJlZGljdG9yX01JUFNkc3BSMih1aW50OF90IGEsIHVpbnQ4X3QgYiwgdWludDhfdCBjKSB7CisgIGludCB0ZW1wMDsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgImFkZHUgICAgICAgICAgICAgJVt0ZW1wMF0sICAgJVthXSwgICAgICAgJVtiXSAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgICAgICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgICAlW2NdICAgICAgICBcblx0IgorICAgICJzaGxsX3MudyAgICAgICAgICVbdGVtcDBdLCAgICVbdGVtcDBdLCAgIDIzICAgICAgICAgIFxuXHQiCisgICAgInByZWNycXVfcy5xYi5waCAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgJHplcm8gICAgICAgXG5cdCIKKyAgICAic3JsICAgICAgICAgICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgICAyNCAgICAgICAgICBcblx0IgorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKQorICAgIDogW2FdInIiKGEpLFtiXSJyIihiKSxbY10iciIoYykKKyAgKTsKKyAgcmV0dXJuIHRlbXAwOworfQorCisjZGVmaW5lIEZJTFRFUl9MSU5FX0JZX0xJTkUoUFJFRFMsIE9QRVJBVElPTikgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHdoaWxlIChyb3cgPCBsYXN0X3JvdykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGludCB3OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBQUkVESUNUX0xJTkVfT05FX1BBU1MoaW4sIFBSRURTIC0gc3RyaWRlLCBvdXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZm9yICh3ID0gMTsgdyA8IHdpZHRoOyArK3cpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgaW50IHByZWQgPSBHcmFkaWVudFByZWRpY3Rvcl9NSVBTZHNwUjIoUFJFRFNbdyAtIDFdLCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSRURTW3cgLSBzdHJpZGVdLCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUkVEU1t3IC0gc3RyaWRlIC0gMV0pOyAgIFwKKyAgICAgICAgb3V0W3ddID0gaW5bd10gT1BFUkFUSU9OIHByZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKytyb3c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGluICs9IHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBvdXQgKz0gc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgRG9HcmFkaWVudEZpbHRlcl9NSVBTZHNwUjIoY29uc3QgdWludDhfdCogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93LCBpbnQgbnVtX3Jvd3MsIHVpbnQ4X3QqIG91dCkgeworICBjb25zdCB1aW50OF90KiBwcmVkczsKKyAgY29uc3Qgc2l6ZV90IHN0YXJ0X29mZnNldCA9IHJvdyAqIHN0cmlkZTsKKyAgY29uc3QgaW50IGxhc3Rfcm93ID0gcm93ICsgbnVtX3Jvd3M7CisgIFNBTklUWV9DSEVDSyhpbiwgb3V0KTsKKyAgaW4gKz0gc3RhcnRfb2Zmc2V0OworICBvdXQgKz0gc3RhcnRfb2Zmc2V0OworICBwcmVkcyA9IGluOworCisgIC8vIGxlZnQgcHJlZGljdGlvbiBmb3IgdG9wIHNjYW4tbGluZQorICBpZiAocm93ID09IDApIHsKKyAgICBvdXRbMF0gPSBpblswXTsKKyAgICBQcmVkaWN0TGluZV9NSVBTZHNwUjIoaW4gKyAxLCBvdXQgKyAxLCB3aWR0aCAtIDEpOworICAgIHJvdyA9IDE7CisgICAgcHJlZHMgKz0gc3RyaWRlOworICAgIGluICs9IHN0cmlkZTsKKyAgICBvdXQgKz0gc3RyaWRlOworICB9CisKKyAgLy8gRmlsdGVyIGxpbmUtYnktbGluZS4KKyAgRklMVEVSX0xJTkVfQllfTElORShpbiwgLSk7Cit9CisjdW5kZWYgRklMVEVSX0xJTkVfQllfTElORQorCitzdGF0aWMgdm9pZCBHcmFkaWVudEZpbHRlcl9NSVBTZHNwUjIoY29uc3QgdWludDhfdCogZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIHVpbnQ4X3QqIGZpbHRlcmVkX2RhdGEpIHsKKyAgRG9HcmFkaWVudEZpbHRlcl9NSVBTZHNwUjIoZGF0YSwgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCAwLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkX2RhdGEpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBIb3Jpem9udGFsVW5maWx0ZXJfTUlQU2RzcFIyKGNvbnN0IHVpbnQ4X3QqIHByZXYsIGNvbnN0IHVpbnQ4X3QqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXQsIGludCB3aWR0aCkgeworIG91dFswXSA9IGluWzBdICsgKHByZXYgPT0gTlVMTCA/IDAgOiBwcmV2WzBdKTsKKyBET19QUkVESUNUX0xJTkUoaW4gKyAxLCBvdXQgKyAxLCB3aWR0aCAtIDEsIDEpOworfQorCitzdGF0aWMgdm9pZCBWZXJ0aWNhbFVuZmlsdGVyX01JUFNkc3BSMihjb25zdCB1aW50OF90KiBwcmV2LCBjb25zdCB1aW50OF90KiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG91dCwgaW50IHdpZHRoKSB7CisgIGlmIChwcmV2ID09IE5VTEwpIHsKKyAgICBIb3Jpem9udGFsVW5maWx0ZXJfTUlQU2RzcFIyKE5VTEwsIGluLCBvdXQsIHdpZHRoKTsKKyAgfSBlbHNlIHsKKyAgICBET19QUkVESUNUX0xJTkVfVkVSVElDQUwoaW4sIHByZXYsIG91dCwgd2lkdGgsIDEpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIEdyYWRpZW50VW5maWx0ZXJfTUlQU2RzcFIyKGNvbnN0IHVpbnQ4X3QqIHByZXYsIGNvbnN0IHVpbnQ4X3QqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3V0LCBpbnQgd2lkdGgpIHsKKyAgaWYgKHByZXYgPT0gTlVMTCkgeworICAgIEhvcml6b250YWxVbmZpbHRlcl9NSVBTZHNwUjIoTlVMTCwgaW4sIG91dCwgd2lkdGgpOworICB9IGVsc2UgeworICAgIHVpbnQ4X3QgdG9wID0gcHJldlswXSwgdG9wX2xlZnQgPSB0b3AsIGxlZnQgPSB0b3A7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyArK2kpIHsKKyAgICAgIHRvcCA9IHByZXZbaV07ICAvLyBuZWVkIHRvIHJlYWQgdGhpcyBmaXJzdCwgaW4gY2FzZSBwcmV2PT1kc3QKKyAgICAgIGxlZnQgPSBpbltpXSArIEdyYWRpZW50UHJlZGljdG9yX01JUFNkc3BSMihsZWZ0LCB0b3AsIHRvcF9sZWZ0KTsKKyAgICAgIHRvcF9sZWZ0ID0gdG9wOworICAgICAgb3V0W2ldID0gbGVmdDsKKyAgICB9CisgIH0KK30KKworI3VuZGVmIERPX1BSRURJQ1RfTElORV9WRVJUSUNBTAorI3VuZGVmIFBSRURJQ1RfTElORV9PTkVfUEFTUworI3VuZGVmIERPX1BSRURJQ1RfTElORQorI3VuZGVmIFNBTklUWV9DSEVDSworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgVlA4RmlsdGVyc0luaXRNSVBTZHNwUjIodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBWUDhGaWx0ZXJzSW5pdE1JUFNkc3BSMih2b2lkKSB7CisgIFdlYlBVbmZpbHRlcnNbV0VCUF9GSUxURVJfSE9SSVpPTlRBTF0gPSBIb3Jpem9udGFsVW5maWx0ZXJfTUlQU2RzcFIyOworICBXZWJQVW5maWx0ZXJzW1dFQlBfRklMVEVSX1ZFUlRJQ0FMXSA9IFZlcnRpY2FsVW5maWx0ZXJfTUlQU2RzcFIyOworICBXZWJQVW5maWx0ZXJzW1dFQlBfRklMVEVSX0dSQURJRU5UXSA9IEdyYWRpZW50VW5maWx0ZXJfTUlQU2RzcFIyOworCisgIFdlYlBGaWx0ZXJzW1dFQlBfRklMVEVSX0hPUklaT05UQUxdID0gSG9yaXpvbnRhbEZpbHRlcl9NSVBTZHNwUjI7CisgIFdlYlBGaWx0ZXJzW1dFQlBfRklMVEVSX1ZFUlRJQ0FMXSA9IFZlcnRpY2FsRmlsdGVyX01JUFNkc3BSMjsKKyAgV2ViUEZpbHRlcnNbV0VCUF9GSUxURVJfR1JBRElFTlRdID0gR3JhZGllbnRGaWx0ZXJfTUlQU2RzcFIyOworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX01JUFNfRFNQX1IyCisKK1dFQlBfRFNQX0lOSVRfU1RVQihWUDhGaWx0ZXJzSW5pdE1JUFNkc3BSMikKKworI2VuZGlmICAvLyBXRUJQX1VTRV9NSVBTX0RTUF9SMgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9maWx0ZXJzX21zYS5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9maWx0ZXJzX21zYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YzQzN2QKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2ZpbHRlcnNfbXNhLmMKQEAgLTAsMCArMSwyMDIgQEAKKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBNU0EgdmFyaWFudCBvZiBhbHBoYSBmaWx0ZXJzCisvLworLy8gQXV0aG9yOiBQcmFzaGFudCBQYXRpbCAocHJhc2hhbnQucGF0aWxAaW1ndGVjLmNvbSkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01TQSkKKworI2luY2x1ZGUgInNyYy9kc3AvbXNhX21hY3JvLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUHJlZGljdExpbmVJbnZlcnNlMChjb25zdCB1aW50OF90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGxlbmd0aCkgeworICB2MTZ1OCBzcmMwLCBwcmVkMCwgZHN0MDsKKyAgYXNzZXJ0KGxlbmd0aCA+PSAwKTsKKyAgd2hpbGUgKGxlbmd0aCA+PSAzMikgeworICAgIHYxNnU4IHNyYzEsIHByZWQxLCBkc3QxOworICAgIExEX1VCMihzcmMsIDE2LCBzcmMwLCBzcmMxKTsKKyAgICBMRF9VQjIocHJlZCwgMTYsIHByZWQwLCBwcmVkMSk7CisgICAgU1VCMihzcmMwLCBwcmVkMCwgc3JjMSwgcHJlZDEsIGRzdDAsIGRzdDEpOworICAgIFNUX1VCMihkc3QwLCBkc3QxLCBkc3QsIDE2KTsKKyAgICBzcmMgKz0gMzI7CisgICAgcHJlZCArPSAzMjsKKyAgICBkc3QgKz0gMzI7CisgICAgbGVuZ3RoIC09IDMyOworICB9CisgIGlmIChsZW5ndGggPiAwKSB7CisgICAgaW50IGk7CisgICAgaWYgKGxlbmd0aCA+PSAxNikgeworICAgICAgc3JjMCA9IExEX1VCKHNyYyk7CisgICAgICBwcmVkMCA9IExEX1VCKHByZWQpOworICAgICAgZHN0MCA9IHNyYzAgLSBwcmVkMDsKKyAgICAgIFNUX1VCKGRzdDAsIGRzdCk7CisgICAgICBzcmMgKz0gMTY7CisgICAgICBwcmVkICs9IDE2OworICAgICAgZHN0ICs9IDE2OworICAgICAgbGVuZ3RoIC09IDE2OworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgIGRzdFtpXSA9IHNyY1tpXSAtIHByZWRbaV07CisgICAgfQorICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIZWxwZnVsIG1hY3JvLgorCisjZGVmaW5lIFNBTklUWV9DSEVDSyhpbiwgb3V0KSAgXAorICBhc3NlcnQoaW4gIT0gTlVMTCk7ICAgICAgICAgIFwKKyAgYXNzZXJ0KG91dCAhPSBOVUxMKTsgICAgICAgICBcCisgIGFzc2VydCh3aWR0aCA+IDApOyAgICAgICAgICAgXAorICBhc3NlcnQoaGVpZ2h0ID4gMCk7ICAgICAgICAgIFwKKyAgYXNzZXJ0KHN0cmlkZSA+PSB3aWR0aCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIb3JyaXpvbnRhbCBmaWx0ZXIKKworc3RhdGljIHZvaWQgSG9yaXpvbnRhbEZpbHRlcl9NU0EoY29uc3QgdWludDhfdCogZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgdWludDhfdCogZmlsdGVyZWRfZGF0YSkgeworICBjb25zdCB1aW50OF90KiBwcmVkcyA9IGRhdGE7CisgIGNvbnN0IHVpbnQ4X3QqIGluID0gZGF0YTsKKyAgdWludDhfdCogb3V0ID0gZmlsdGVyZWRfZGF0YTsKKyAgaW50IHJvdyA9IDE7CisgIFNBTklUWV9DSEVDSyhpbiwgb3V0KTsKKworICAvLyBMZWZ0bW9zdCBwaXhlbCBpcyB0aGUgc2FtZSBhcyBpbnB1dCBmb3IgdG9wbW9zdCBzY2FubGluZS4KKyAgb3V0WzBdID0gaW5bMF07CisgIFByZWRpY3RMaW5lSW52ZXJzZTAoaW4gKyAxLCBwcmVkcywgb3V0ICsgMSwgd2lkdGggLSAxKTsKKyAgcHJlZHMgKz0gc3RyaWRlOworICBpbiArPSBzdHJpZGU7CisgIG91dCArPSBzdHJpZGU7CisgIC8vIEZpbHRlciBsaW5lLWJ5LWxpbmUuCisgIHdoaWxlIChyb3cgPCBoZWlnaHQpIHsKKyAgICAvLyBMZWZ0bW9zdCBwaXhlbCBpcyBwcmVkaWN0ZWQgZnJvbSBhYm92ZS4KKyAgICBQcmVkaWN0TGluZUludmVyc2UwKGluLCBwcmVkcyAtIHN0cmlkZSwgb3V0LCAxKTsKKyAgICBQcmVkaWN0TGluZUludmVyc2UwKGluICsgMSwgcHJlZHMsIG91dCArIDEsIHdpZHRoIC0gMSk7CisgICAgKytyb3c7CisgICAgcHJlZHMgKz0gc3RyaWRlOworICAgIGluICs9IHN0cmlkZTsKKyAgICBvdXQgKz0gc3RyaWRlOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBHcmFkaWVudCBmaWx0ZXIKKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUHJlZGljdExpbmVHcmFkaWVudChjb25zdCB1aW50OF90KiBwaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBwcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwb3V0cHV0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSkgeworICBpbnQgdzsKKyAgY29uc3QgdjE2aTggemVybyA9IHsgMCB9OworICB3aGlsZSAoc2l6ZSA+PSAxNikgeworICAgIHYxNnU4IHByZWQwLCBkc3QwOworICAgIHY4aTE2IGEwLCBhMSwgYjAsIGIxLCBjMCwgYzE7CisgICAgY29uc3QgdjE2dTggdG1wMCA9IExEX1VCKHBwcmVkIC0gMSk7CisgICAgY29uc3QgdjE2dTggdG1wMSA9IExEX1VCKHBwcmVkIC0gc3RyaWRlKTsKKyAgICBjb25zdCB2MTZ1OCB0bXAyID0gTERfVUIocHByZWQgLSBzdHJpZGUgLSAxKTsKKyAgICBjb25zdCB2MTZ1OCBzcmMwID0gTERfVUIocGlucHV0KTsKKyAgICBJTFZSTF9CMl9TSCh6ZXJvLCB0bXAwLCBhMCwgYTEpOworICAgIElMVlJMX0IyX1NIKHplcm8sIHRtcDEsIGIwLCBiMSk7CisgICAgSUxWUkxfQjJfU0goemVybywgdG1wMiwgYzAsIGMxKTsKKyAgICBBREQyKGEwLCBiMCwgYTEsIGIxLCBhMCwgYTEpOworICAgIFNVQjIoYTAsIGMwLCBhMSwgYzEsIGEwLCBhMSk7CisgICAgQ0xJUF9TSDJfMF8yNTUoYTAsIGExKTsKKyAgICBwcmVkMCA9ICh2MTZ1OClfX21zYV9wY2tldl9iKCh2MTZpOClhMSwgKHYxNmk4KWEwKTsKKyAgICBkc3QwID0gc3JjMCAtIHByZWQwOworICAgIFNUX1VCKGRzdDAsIHBvdXRwdXQpOworICAgIHBwcmVkICs9IDE2OworICAgIHBpbnB1dCArPSAxNjsKKyAgICBwb3V0cHV0ICs9IDE2OworICAgIHNpemUgLT0gMTY7CisgIH0KKyAgZm9yICh3ID0gMDsgdyA8IHNpemU7ICsrdykgeworICAgIGNvbnN0IGludCBwcmVkID0gcHByZWRbdyAtIDFdICsgcHByZWRbdyAtIHN0cmlkZV0gLSBwcHJlZFt3IC0gc3RyaWRlIC0gMV07CisgICAgcG91dHB1dFt3XSA9IHBpbnB1dFt3XSAtIChwcmVkIDwgMCA/IDAgOiBwcmVkID4gMjU1ID8gMjU1IDogcHJlZCk7CisgIH0KK30KKworCitzdGF0aWMgdm9pZCBHcmFkaWVudEZpbHRlcl9NU0EoY29uc3QgdWludDhfdCogZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIHVpbnQ4X3QqIGZpbHRlcmVkX2RhdGEpIHsKKyAgY29uc3QgdWludDhfdCogaW4gPSBkYXRhOworICBjb25zdCB1aW50OF90KiBwcmVkcyA9IGRhdGE7CisgIHVpbnQ4X3QqIG91dCA9IGZpbHRlcmVkX2RhdGE7CisgIGludCByb3cgPSAxOworICBTQU5JVFlfQ0hFQ0soaW4sIG91dCk7CisKKyAgLy8gbGVmdCBwcmVkaWN0aW9uIGZvciB0b3Agc2Nhbi1saW5lCisgIG91dFswXSA9IGluWzBdOworICBQcmVkaWN0TGluZUludmVyc2UwKGluICsgMSwgcHJlZHMsIG91dCArIDEsIHdpZHRoIC0gMSk7CisgIHByZWRzICs9IHN0cmlkZTsKKyAgaW4gKz0gc3RyaWRlOworICBvdXQgKz0gc3RyaWRlOworICAvLyBGaWx0ZXIgbGluZS1ieS1saW5lLgorICB3aGlsZSAocm93IDwgaGVpZ2h0KSB7CisgICAgb3V0WzBdID0gaW5bMF0gLSBwcmVkc1stIHN0cmlkZV07CisgICAgUHJlZGljdExpbmVHcmFkaWVudChwcmVkcyArIDEsIGluICsgMSwgb3V0ICsgMSwgc3RyaWRlLCB3aWR0aCAtIDEpOworICAgICsrcm93OworICAgIHByZWRzICs9IHN0cmlkZTsKKyAgICBpbiArPSBzdHJpZGU7CisgICAgb3V0ICs9IHN0cmlkZTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVmVydGljYWwgZmlsdGVyCisKK3N0YXRpYyB2b2lkIFZlcnRpY2FsRmlsdGVyX01TQShjb25zdCB1aW50OF90KiBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgdWludDhfdCogZmlsdGVyZWRfZGF0YSkgeworICBjb25zdCB1aW50OF90KiBpbiA9IGRhdGE7CisgIGNvbnN0IHVpbnQ4X3QqIHByZWRzID0gZGF0YTsKKyAgdWludDhfdCogb3V0ID0gZmlsdGVyZWRfZGF0YTsKKyAgaW50IHJvdyA9IDE7CisgIFNBTklUWV9DSEVDSyhpbiwgb3V0KTsKKworICAvLyBWZXJ5IGZpcnN0IHRvcC1sZWZ0IHBpeGVsIGlzIGNvcGllZC4KKyAgb3V0WzBdID0gaW5bMF07CisgIC8vIFJlc3Qgb2YgdG9wIHNjYW4tbGluZSBpcyBsZWZ0LXByZWRpY3RlZC4KKyAgUHJlZGljdExpbmVJbnZlcnNlMChpbiArIDEsIHByZWRzLCBvdXQgKyAxLCB3aWR0aCAtIDEpOworICBpbiArPSBzdHJpZGU7CisgIG91dCArPSBzdHJpZGU7CisKKyAgLy8gRmlsdGVyIGxpbmUtYnktbGluZS4KKyAgd2hpbGUgKHJvdyA8IGhlaWdodCkgeworICAgIFByZWRpY3RMaW5lSW52ZXJzZTAoaW4sIHByZWRzLCBvdXQsIHdpZHRoKTsKKyAgICArK3JvdzsKKyAgICBwcmVkcyArPSBzdHJpZGU7CisgICAgaW4gKz0gc3RyaWRlOworICAgIG91dCArPSBzdHJpZGU7CisgIH0KK30KKworI3VuZGVmIFNBTklUWV9DSEVDSworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgVlA4RmlsdGVyc0luaXRNU0Eodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBWUDhGaWx0ZXJzSW5pdE1TQSh2b2lkKSB7CisgIFdlYlBGaWx0ZXJzW1dFQlBfRklMVEVSX0hPUklaT05UQUxdID0gSG9yaXpvbnRhbEZpbHRlcl9NU0E7CisgIFdlYlBGaWx0ZXJzW1dFQlBfRklMVEVSX1ZFUlRJQ0FMXSA9IFZlcnRpY2FsRmlsdGVyX01TQTsKKyAgV2ViUEZpbHRlcnNbV0VCUF9GSUxURVJfR1JBRElFTlRdID0gR3JhZGllbnRGaWx0ZXJfTVNBOworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX01TQQorCitXRUJQX0RTUF9JTklUX1NUVUIoVlA4RmlsdGVyc0luaXRNU0EpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfTVNBCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2ZpbHRlcnNfbmVvbi5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9maWx0ZXJzX25lb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTZhNTc4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9maWx0ZXJzX25lb24uYwpAQCAtMCwwICsxLDMyOSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIE5FT04gdmFyaWFudCBvZiBhbHBoYSBmaWx0ZXJzCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX05FT04pCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlICJzcmMvZHNwL25lb24uaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhlbHBmdWwgbWFjcm9zLgorCisjIGRlZmluZSBTQU5JVFlfQ0hFQ0soaW4sIG91dCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBhc3NlcnQoaW4gIT0gTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYXNzZXJ0KG91dCAhPSBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGFzc2VydCh3aWR0aCA+IDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBhc3NlcnQoaGVpZ2h0ID4gMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYXNzZXJ0KHN0cmlkZSA+PSB3aWR0aCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGFzc2VydChyb3cgPj0gMCAmJiBudW1fcm93cyA+IDAgJiYgcm93ICsgbnVtX3Jvd3MgPD0gaGVpZ2h0KTsgICAgICAgICAgICAgICAgXAorICAodm9pZCloZWlnaHQ7ICAvLyBTaWxlbmNlIHVudXNlZCB3YXJuaW5nLgorCisvLyBsb2FkIGVpZ2h0IHU4IGFuZCB3aWRlbiB0byBzMTYKKyNkZWZpbmUgVThfVE9fUzE2KEEpIHZyZWludGVycHJldHFfczE2X3UxNih2bW92bF91OChBKSkKKyNkZWZpbmUgTE9BRF9VOF9UT19TMTYoQSkgVThfVE9fUzE2KHZsZDFfdTgoQSkpCisKKy8vIHNoaWZ0IGxlZnQgb3IgcmlnaHQgYnkgTiBieXRlLCBpbnNlcnRpbmcgemVyb3MKKyNkZWZpbmUgU0hJRlRfUklHSFRfTl9RKEEsIE4pIHZleHRxX3U4KChBKSwgemVybywgKE4pKQorI2RlZmluZSBTSElGVF9MRUZUX05fUShBLCBOKSB2ZXh0cV91OCh6ZXJvLCAoQSksICgxNiAtIChOKSkgJSAxNikKKworLy8gcm90YXRlIGxlZnQgYnkgTiBieXRlcworI2RlZmluZSBST1RBVEVfTEVGVF9OKEEsIE4pICAgdmV4dF91OCgoQSksIChBKSwgKE4pKQorLy8gcm90YXRlIHJpZ2h0IGJ5IE4gYnl0ZXMKKyNkZWZpbmUgUk9UQVRFX1JJR0hUX04oQSwgTikgICB2ZXh0X3U4KChBKSwgKEEpLCAoOCAtIChOKSkgJSA4KQorCitzdGF0aWMgdm9pZCBQcmVkaWN0TGluZV9ORU9OKGNvbnN0IHVpbnQ4X3QqIHNyYywgY29uc3QgdWludDhfdCogcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgbGVuZ3RoKSB7CisgIGludCBpOworICBhc3NlcnQobGVuZ3RoID49IDApOworICBmb3IgKGkgPSAwOyBpICsgMTYgPD0gbGVuZ3RoOyBpICs9IDE2KSB7CisgICAgY29uc3QgdWludDh4MTZfdCBBID0gdmxkMXFfdTgoJnNyY1tpXSk7CisgICAgY29uc3QgdWludDh4MTZfdCBCID0gdmxkMXFfdTgoJnByZWRbaV0pOworICAgIGNvbnN0IHVpbnQ4eDE2X3QgQyA9IHZzdWJxX3U4KEEsIEIpOworICAgIHZzdDFxX3U4KCZkc3RbaV0sIEMpOworICB9CisgIGZvciAoOyBpIDwgbGVuZ3RoOyArK2kpIGRzdFtpXSA9IHNyY1tpXSAtIHByZWRbaV07Cit9CisKKy8vIFNwZWNpYWwgY2FzZSBmb3IgbGVmdC1iYXNlZCBwcmVkaWN0aW9uICh3aGVuIHByZWRzPT1kc3QtMSBvciBwcmVkcz09c3JjLTEpLgorc3RhdGljIHZvaWQgUHJlZGljdExpbmVMZWZ0X05FT04oY29uc3QgdWludDhfdCogc3JjLCB1aW50OF90KiBkc3QsIGludCBsZW5ndGgpIHsKKyAgUHJlZGljdExpbmVfTkVPTihzcmMsIHNyYyAtIDEsIGRzdCwgbGVuZ3RoKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhvcml6b250YWwgZmlsdGVyLgorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEb0hvcml6b250YWxGaWx0ZXJfTkVPTihjb25zdCB1aW50OF90KiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93LCBpbnQgbnVtX3Jvd3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXQpIHsKKyAgY29uc3Qgc2l6ZV90IHN0YXJ0X29mZnNldCA9IHJvdyAqIHN0cmlkZTsKKyAgY29uc3QgaW50IGxhc3Rfcm93ID0gcm93ICsgbnVtX3Jvd3M7CisgIFNBTklUWV9DSEVDSyhpbiwgb3V0KTsKKyAgaW4gKz0gc3RhcnRfb2Zmc2V0OworICBvdXQgKz0gc3RhcnRfb2Zmc2V0OworCisgIGlmIChyb3cgPT0gMCkgeworICAgIC8vIExlZnRtb3N0IHBpeGVsIGlzIHRoZSBzYW1lIGFzIGlucHV0IGZvciB0b3Btb3N0IHNjYW5saW5lLgorICAgIG91dFswXSA9IGluWzBdOworICAgIFByZWRpY3RMaW5lTGVmdF9ORU9OKGluICsgMSwgb3V0ICsgMSwgd2lkdGggLSAxKTsKKyAgICByb3cgPSAxOworICAgIGluICs9IHN0cmlkZTsKKyAgICBvdXQgKz0gc3RyaWRlOworICB9CisKKyAgLy8gRmlsdGVyIGxpbmUtYnktbGluZS4KKyAgd2hpbGUgKHJvdyA8IGxhc3Rfcm93KSB7CisgICAgLy8gTGVmdG1vc3QgcGl4ZWwgaXMgcHJlZGljdGVkIGZyb20gYWJvdmUuCisgICAgb3V0WzBdID0gaW5bMF0gLSBpblstc3RyaWRlXTsKKyAgICBQcmVkaWN0TGluZUxlZnRfTkVPTihpbiArIDEsIG91dCArIDEsIHdpZHRoIC0gMSk7CisgICAgKytyb3c7CisgICAgaW4gKz0gc3RyaWRlOworICAgIG91dCArPSBzdHJpZGU7CisgIH0KK30KKworc3RhdGljIHZvaWQgSG9yaXpvbnRhbEZpbHRlcl9ORU9OKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCB1aW50OF90KiBmaWx0ZXJlZF9kYXRhKSB7CisgIERvSG9yaXpvbnRhbEZpbHRlcl9ORU9OKGRhdGEsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgMCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZF9kYXRhKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZlcnRpY2FsIGZpbHRlci4KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRG9WZXJ0aWNhbEZpbHRlcl9ORU9OKGNvbnN0IHVpbnQ4X3QqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93LCBpbnQgbnVtX3Jvd3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3V0KSB7CisgIGNvbnN0IHNpemVfdCBzdGFydF9vZmZzZXQgPSByb3cgKiBzdHJpZGU7CisgIGNvbnN0IGludCBsYXN0X3JvdyA9IHJvdyArIG51bV9yb3dzOworICBTQU5JVFlfQ0hFQ0soaW4sIG91dCk7CisgIGluICs9IHN0YXJ0X29mZnNldDsKKyAgb3V0ICs9IHN0YXJ0X29mZnNldDsKKworICBpZiAocm93ID09IDApIHsKKyAgICAvLyBWZXJ5IGZpcnN0IHRvcC1sZWZ0IHBpeGVsIGlzIGNvcGllZC4KKyAgICBvdXRbMF0gPSBpblswXTsKKyAgICAvLyBSZXN0IG9mIHRvcCBzY2FuLWxpbmUgaXMgbGVmdC1wcmVkaWN0ZWQuCisgICAgUHJlZGljdExpbmVMZWZ0X05FT04oaW4gKyAxLCBvdXQgKyAxLCB3aWR0aCAtIDEpOworICAgIHJvdyA9IDE7CisgICAgaW4gKz0gc3RyaWRlOworICAgIG91dCArPSBzdHJpZGU7CisgIH0KKworICAvLyBGaWx0ZXIgbGluZS1ieS1saW5lLgorICB3aGlsZSAocm93IDwgbGFzdF9yb3cpIHsKKyAgICBQcmVkaWN0TGluZV9ORU9OKGluLCBpbiAtIHN0cmlkZSwgb3V0LCB3aWR0aCk7CisgICAgKytyb3c7CisgICAgaW4gKz0gc3RyaWRlOworICAgIG91dCArPSBzdHJpZGU7CisgIH0KK30KKworc3RhdGljIHZvaWQgVmVydGljYWxGaWx0ZXJfTkVPTihjb25zdCB1aW50OF90KiBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIHVpbnQ4X3QqIGZpbHRlcmVkX2RhdGEpIHsKKyAgRG9WZXJ0aWNhbEZpbHRlcl9ORU9OKGRhdGEsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgMCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRfZGF0YSk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBHcmFkaWVudCBmaWx0ZXIuCisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgR3JhZGllbnRQcmVkaWN0b3JfQyh1aW50OF90IGEsIHVpbnQ4X3QgYiwgdWludDhfdCBjKSB7CisgIGNvbnN0IGludCBnID0gYSArIGIgLSBjOworICByZXR1cm4gKChnICYgfjB4ZmYpID09IDApID8gZyA6IChnIDwgMCkgPyAwIDogMjU1OyAgLy8gY2xpcCB0byA4Yml0Cit9CisKK3N0YXRpYyB2b2lkIEdyYWRpZW50UHJlZGljdERpcmVjdF9ORU9OKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHJvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IG91dCwgaW50IGxlbmd0aCkgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSArIDggPD0gbGVuZ3RoOyBpICs9IDgpIHsKKyAgICBjb25zdCB1aW50OHg4X3QgQSA9IHZsZDFfdTgoJnJvd1tpIC0gMV0pOworICAgIGNvbnN0IHVpbnQ4eDhfdCBCID0gdmxkMV91OCgmdG9wW2kgKyAwXSk7CisgICAgY29uc3QgaW50MTZ4OF90IEMgPSB2cmVpbnRlcnByZXRxX3MxNl91MTYodmFkZGxfdTgoQSwgQikpOworICAgIGNvbnN0IGludDE2eDhfdCBEID0gTE9BRF9VOF9UT19TMTYoJnRvcFtpIC0gMV0pOworICAgIGNvbnN0IHVpbnQ4eDhfdCBFID0gdnFtb3Z1bl9zMTYodnN1YnFfczE2KEMsIEQpKTsKKyAgICBjb25zdCB1aW50OHg4X3QgRiA9IHZsZDFfdTgoJnJvd1tpICsgMF0pOworICAgIHZzdDFfdTgoJm91dFtpXSwgdnN1Yl91OChGLCBFKSk7CisgIH0KKyAgZm9yICg7IGkgPCBsZW5ndGg7ICsraSkgeworICAgIG91dFtpXSA9IHJvd1tpXSAtIEdyYWRpZW50UHJlZGljdG9yX0Mocm93W2kgLSAxXSwgdG9wW2ldLCB0b3BbaSAtIDFdKTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEb0dyYWRpZW50RmlsdGVyX05FT04oY29uc3QgdWludDhfdCogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdywgaW50IG51bV9yb3dzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG91dCkgeworICBjb25zdCBzaXplX3Qgc3RhcnRfb2Zmc2V0ID0gcm93ICogc3RyaWRlOworICBjb25zdCBpbnQgbGFzdF9yb3cgPSByb3cgKyBudW1fcm93czsKKyAgU0FOSVRZX0NIRUNLKGluLCBvdXQpOworICBpbiArPSBzdGFydF9vZmZzZXQ7CisgIG91dCArPSBzdGFydF9vZmZzZXQ7CisKKyAgLy8gbGVmdCBwcmVkaWN0aW9uIGZvciB0b3Agc2Nhbi1saW5lCisgIGlmIChyb3cgPT0gMCkgeworICAgIG91dFswXSA9IGluWzBdOworICAgIFByZWRpY3RMaW5lTGVmdF9ORU9OKGluICsgMSwgb3V0ICsgMSwgd2lkdGggLSAxKTsKKyAgICByb3cgPSAxOworICAgIGluICs9IHN0cmlkZTsKKyAgICBvdXQgKz0gc3RyaWRlOworICB9CisKKyAgLy8gRmlsdGVyIGxpbmUtYnktbGluZS4KKyAgd2hpbGUgKHJvdyA8IGxhc3Rfcm93KSB7CisgICAgb3V0WzBdID0gaW5bMF0gLSBpblstc3RyaWRlXTsKKyAgICBHcmFkaWVudFByZWRpY3REaXJlY3RfTkVPTihpbiArIDEsIGluICsgMSAtIHN0cmlkZSwgb3V0ICsgMSwgd2lkdGggLSAxKTsKKyAgICArK3JvdzsKKyAgICBpbiArPSBzdHJpZGU7CisgICAgb3V0ICs9IHN0cmlkZTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBHcmFkaWVudEZpbHRlcl9ORU9OKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgdWludDhfdCogZmlsdGVyZWRfZGF0YSkgeworICBEb0dyYWRpZW50RmlsdGVyX05FT04oZGF0YSwgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCAwLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZF9kYXRhKTsKK30KKworI3VuZGVmIFNBTklUWV9DSEVDSworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW52ZXJzZSB0cmFuc2Zvcm1zCisKK3N0YXRpYyB2b2lkIEhvcml6b250YWxVbmZpbHRlcl9ORU9OKGNvbnN0IHVpbnQ4X3QqIHByZXYsIGNvbnN0IHVpbnQ4X3QqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3V0LCBpbnQgd2lkdGgpIHsKKyAgaW50IGk7CisgIGNvbnN0IHVpbnQ4eDE2X3QgemVybyA9IHZkdXBxX25fdTgoMCk7CisgIHVpbnQ4eDE2X3QgbGFzdDsKKyAgb3V0WzBdID0gaW5bMF0gKyAocHJldiA9PSBOVUxMID8gMCA6IHByZXZbMF0pOworICBpZiAod2lkdGggPD0gMSkgcmV0dXJuOworICBsYXN0ID0gdnNldHFfbGFuZV91OChvdXRbMF0sIHplcm8sIDApOworICBmb3IgKGkgPSAxOyBpICsgMTYgPD0gd2lkdGg7IGkgKz0gMTYpIHsKKyAgICBjb25zdCB1aW50OHgxNl90IEEwID0gdmxkMXFfdTgoJmluW2ldKTsKKyAgICBjb25zdCB1aW50OHgxNl90IEExID0gdmFkZHFfdTgoQTAsIGxhc3QpOworICAgIGNvbnN0IHVpbnQ4eDE2X3QgQTIgPSBTSElGVF9MRUZUX05fUShBMSwgMSk7CisgICAgY29uc3QgdWludDh4MTZfdCBBMyA9IHZhZGRxX3U4KEExLCBBMik7CisgICAgY29uc3QgdWludDh4MTZfdCBBNCA9IFNISUZUX0xFRlRfTl9RKEEzLCAyKTsKKyAgICBjb25zdCB1aW50OHgxNl90IEE1ID0gdmFkZHFfdTgoQTMsIEE0KTsKKyAgICBjb25zdCB1aW50OHgxNl90IEE2ID0gU0hJRlRfTEVGVF9OX1EoQTUsIDQpOworICAgIGNvbnN0IHVpbnQ4eDE2X3QgQTcgPSB2YWRkcV91OChBNSwgQTYpOworICAgIGNvbnN0IHVpbnQ4eDE2X3QgQTggPSBTSElGVF9MRUZUX05fUShBNywgOCk7CisgICAgY29uc3QgdWludDh4MTZfdCBBOSA9IHZhZGRxX3U4KEE3LCBBOCk7CisgICAgdnN0MXFfdTgoJm91dFtpXSwgQTkpOworICAgIGxhc3QgPSBTSElGVF9SSUdIVF9OX1EoQTksIDE1KTsKKyAgfQorICBmb3IgKDsgaSA8IHdpZHRoOyArK2kpIG91dFtpXSA9IGluW2ldICsgb3V0W2kgLSAxXTsKK30KKworc3RhdGljIHZvaWQgVmVydGljYWxVbmZpbHRlcl9ORU9OKGNvbnN0IHVpbnQ4X3QqIHByZXYsIGNvbnN0IHVpbnQ4X3QqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG91dCwgaW50IHdpZHRoKSB7CisgIGlmIChwcmV2ID09IE5VTEwpIHsKKyAgICBIb3Jpem9udGFsVW5maWx0ZXJfTkVPTihOVUxMLCBpbiwgb3V0LCB3aWR0aCk7CisgIH0gZWxzZSB7CisgICAgaW50IGk7CisgICAgYXNzZXJ0KHdpZHRoID49IDApOworICAgIGZvciAoaSA9IDA7IGkgKyAxNiA8PSB3aWR0aDsgaSArPSAxNikgeworICAgICAgY29uc3QgdWludDh4MTZfdCBBID0gdmxkMXFfdTgoJmluW2ldKTsKKyAgICAgIGNvbnN0IHVpbnQ4eDE2X3QgQiA9IHZsZDFxX3U4KCZwcmV2W2ldKTsKKyAgICAgIGNvbnN0IHVpbnQ4eDE2X3QgQyA9IHZhZGRxX3U4KEEsIEIpOworICAgICAgdnN0MXFfdTgoJm91dFtpXSwgQyk7CisgICAgfQorICAgIGZvciAoOyBpIDwgd2lkdGg7ICsraSkgb3V0W2ldID0gaW5baV0gKyBwcmV2W2ldOworICB9Cit9CisKKy8vIEdyYWRpZW50VW5maWx0ZXJfTkVPTiBpcyBjb3JyZWN0IGJ1dCBzbG93ZXIgdGhhbiB0aGUgQy12ZXJzaW9uLAorLy8gYXQgbGVhc3Qgb24gQVJNNjQuIEZvciBhcm12NywgaXQncyBhIHdhc2guCisvLyBTbyBiZXN0IGlzIHRvIGRpc2FibGUgaXQgZm9yIG5vdywgYnV0IGtlZXAgdGhlIGlkZWEgYXJvdW5kLi4uCisjaWYgIWRlZmluZWQoVVNFX0dSQURJRU5UX1VORklMVEVSKQorI2RlZmluZSBVU0VfR1JBRElFTlRfVU5GSUxURVIgMCAgIC8vIEFMVEVSTkFURV9DT0RFCisjZW5kaWYKKworI2lmIChVU0VfR1JBRElFTlRfVU5GSUxURVIgPT0gMSkKKyNkZWZpbmUgR1JBRF9QUk9DRVNTX0xBTkUoTCkgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQ4eDhfdCB0bXAxID0gUk9UQVRFX1JJR0hUX04ocHJlZCwgMSk7ICAvKiByb3RhdGUgcHJlZGljdG9yIGluICovICAgXAorICBjb25zdCBpbnQxNng4X3QgdG1wMiA9IHZhZGRxX3MxNihCQywgVThfVE9fUzE2KHRtcDEpKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDh4OF90IGRlbHRhID0gdnFtb3Z1bl9zMTYodG1wMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHByZWQgPSB2YWRkX3U4KEQsIGRlbHRhKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBvdXQgPSB2ZXh0X3U4KG91dCwgUk9UQVRFX0xFRlRfTihwcmVkLCAoTCkpLCAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIEdyYWRpZW50UHJlZGljdEludmVyc2VfTkVPTihjb25zdCB1aW50OF90KiBjb25zdCBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3Qgcm93LCBpbnQgbGVuZ3RoKSB7CisgIGlmIChsZW5ndGggPiAwKSB7CisgICAgaW50IGk7CisgICAgdWludDh4OF90IHByZWQgPSB2ZHVwX25fdTgocm93Wy0xXSk7ICAgLy8gbGVmdCBzYW1wbGUKKyAgICB1aW50OHg4X3Qgb3V0ID0gdmR1cF9uX3U4KDApOworICAgIGZvciAoaSA9IDA7IGkgKyA4IDw9IGxlbmd0aDsgaSArPSA4KSB7CisgICAgICBjb25zdCBpbnQxNng4X3QgQiA9IExPQURfVThfVE9fUzE2KCZ0b3BbaSArIDBdKTsKKyAgICAgIGNvbnN0IGludDE2eDhfdCBDID0gTE9BRF9VOF9UT19TMTYoJnRvcFtpIC0gMV0pOworICAgICAgY29uc3QgaW50MTZ4OF90IEJDID0gdnN1YnFfczE2KEIsIEMpOyAgLy8gdW5jbGlwcGVkIGdyYWRpZW50IGJhc2lzIEIgLSBDCisgICAgICBjb25zdCB1aW50OHg4X3QgRCA9IHZsZDFfdTgoJmluW2ldKTsgICAvLyBiYXNlIGlucHV0CisgICAgICBHUkFEX1BST0NFU1NfTEFORSgwKTsKKyAgICAgIEdSQURfUFJPQ0VTU19MQU5FKDEpOworICAgICAgR1JBRF9QUk9DRVNTX0xBTkUoMik7CisgICAgICBHUkFEX1BST0NFU1NfTEFORSgzKTsKKyAgICAgIEdSQURfUFJPQ0VTU19MQU5FKDQpOworICAgICAgR1JBRF9QUk9DRVNTX0xBTkUoNSk7CisgICAgICBHUkFEX1BST0NFU1NfTEFORSg2KTsKKyAgICAgIEdSQURfUFJPQ0VTU19MQU5FKDcpOworICAgICAgdnN0MV91OCgmcm93W2ldLCBvdXQpOworICAgIH0KKyAgICBmb3IgKDsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgICByb3dbaV0gPSBpbltpXSArIEdyYWRpZW50UHJlZGljdG9yX0Mocm93W2kgLSAxXSwgdG9wW2ldLCB0b3BbaSAtIDFdKTsKKyAgICB9CisgIH0KK30KKyN1bmRlZiBHUkFEX1BST0NFU1NfTEFORQorCitzdGF0aWMgdm9pZCBHcmFkaWVudFVuZmlsdGVyX05FT04oY29uc3QgdWludDhfdCogcHJldiwgY29uc3QgdWludDhfdCogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3V0LCBpbnQgd2lkdGgpIHsKKyAgaWYgKHByZXYgPT0gTlVMTCkgeworICAgIEhvcml6b250YWxVbmZpbHRlcl9ORU9OKE5VTEwsIGluLCBvdXQsIHdpZHRoKTsKKyAgfSBlbHNlIHsKKyAgICBvdXRbMF0gPSBpblswXSArIHByZXZbMF07ICAvLyBwcmVkaWN0IGZyb20gYWJvdmUKKyAgICBHcmFkaWVudFByZWRpY3RJbnZlcnNlX05FT04oaW4gKyAxLCBwcmV2ICsgMSwgb3V0ICsgMSwgd2lkdGggLSAxKTsKKyAgfQorfQorCisjZW5kaWYgICAvLyBVU0VfR1JBRElFTlRfVU5GSUxURVIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFZQOEZpbHRlcnNJbml0TkVPTih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFZQOEZpbHRlcnNJbml0TkVPTih2b2lkKSB7CisgIFdlYlBVbmZpbHRlcnNbV0VCUF9GSUxURVJfSE9SSVpPTlRBTF0gPSBIb3Jpem9udGFsVW5maWx0ZXJfTkVPTjsKKyAgV2ViUFVuZmlsdGVyc1tXRUJQX0ZJTFRFUl9WRVJUSUNBTF0gPSBWZXJ0aWNhbFVuZmlsdGVyX05FT047CisjaWYgKFVTRV9HUkFESUVOVF9VTkZJTFRFUiA9PSAxKQorICBXZWJQVW5maWx0ZXJzW1dFQlBfRklMVEVSX0dSQURJRU5UXSA9IEdyYWRpZW50VW5maWx0ZXJfTkVPTjsKKyNlbmRpZgorCisgIFdlYlBGaWx0ZXJzW1dFQlBfRklMVEVSX0hPUklaT05UQUxdID0gSG9yaXpvbnRhbEZpbHRlcl9ORU9OOworICBXZWJQRmlsdGVyc1tXRUJQX0ZJTFRFUl9WRVJUSUNBTF0gPSBWZXJ0aWNhbEZpbHRlcl9ORU9OOworICBXZWJQRmlsdGVyc1tXRUJQX0ZJTFRFUl9HUkFESUVOVF0gPSBHcmFkaWVudEZpbHRlcl9ORU9OOworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX05FT04KKworV0VCUF9EU1BfSU5JVF9TVFVCKFZQOEZpbHRlcnNJbml0TkVPTikKKworI2VuZGlmICAvLyBXRUJQX1VTRV9ORU9OCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2ZpbHRlcnNfc3NlMi5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9maWx0ZXJzX3NzZTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTE4ODk1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9maWx0ZXJzX3NzZTIuYwpAQCAtMCwwICsxLDMzMyBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFNTRTIgdmFyaWFudCBvZiBhbHBoYSBmaWx0ZXJzCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTIpCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxlbW1pbnRyaW4uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhlbHBmdWwgbWFjcm8uCisKKyMgZGVmaW5lIFNBTklUWV9DSEVDSyhpbiwgb3V0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGFzc2VydCgoaW4pICE9IE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBhc3NlcnQoKG91dCkgIT0gTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYXNzZXJ0KHdpZHRoID4gMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGFzc2VydChoZWlnaHQgPiAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBhc3NlcnQoc3RyaWRlID49IHdpZHRoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYXNzZXJ0KHJvdyA+PSAwICYmIG51bV9yb3dzID4gMCAmJiByb3cgKyBudW1fcm93cyA8PSBoZWlnaHQpOyAgICAgICAgICAgICAgICBcCisgICh2b2lkKWhlaWdodDsgIC8vIFNpbGVuY2UgdW51c2VkIHdhcm5pbmcuCisKK3N0YXRpYyB2b2lkIFByZWRpY3RMaW5lVG9wX1NTRTIoY29uc3QgdWludDhfdCogc3JjLCBjb25zdCB1aW50OF90KiBwcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBsZW5ndGgpIHsKKyAgaW50IGk7CisgIGNvbnN0IGludCBtYXhfcG9zID0gbGVuZ3RoICYgfjMxOworICBhc3NlcnQobGVuZ3RoID49IDApOworICBmb3IgKGkgPSAwOyBpIDwgbWF4X3BvczsgaSArPSAzMikgeworICAgIGNvbnN0IF9fbTEyOGkgQTAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZzcmNbaSArICAwXSk7CisgICAgY29uc3QgX19tMTI4aSBBMSA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnNyY1tpICsgMTZdKTsKKyAgICBjb25zdCBfX20xMjhpIEIwID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmcHJlZFtpICsgIDBdKTsKKyAgICBjb25zdCBfX20xMjhpIEIxID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmcHJlZFtpICsgMTZdKTsKKyAgICBjb25zdCBfX20xMjhpIEMwID0gX21tX3N1Yl9lcGk4KEEwLCBCMCk7CisgICAgY29uc3QgX19tMTI4aSBDMSA9IF9tbV9zdWJfZXBpOChBMSwgQjEpOworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZkc3RbaSArICAwXSwgQzApOworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZkc3RbaSArIDE2XSwgQzEpOworICB9CisgIGZvciAoOyBpIDwgbGVuZ3RoOyArK2kpIGRzdFtpXSA9IHNyY1tpXSAtIHByZWRbaV07Cit9CisKKy8vIFNwZWNpYWwgY2FzZSBmb3IgbGVmdC1iYXNlZCBwcmVkaWN0aW9uICh3aGVuIHByZWRzPT1kc3QtMSBvciBwcmVkcz09c3JjLTEpLgorc3RhdGljIHZvaWQgUHJlZGljdExpbmVMZWZ0X1NTRTIoY29uc3QgdWludDhfdCogc3JjLCB1aW50OF90KiBkc3QsIGludCBsZW5ndGgpIHsKKyAgaW50IGk7CisgIGNvbnN0IGludCBtYXhfcG9zID0gbGVuZ3RoICYgfjMxOworICBhc3NlcnQobGVuZ3RoID49IDApOworICBmb3IgKGkgPSAwOyBpIDwgbWF4X3BvczsgaSArPSAzMikgeworICAgIGNvbnN0IF9fbTEyOGkgQTAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShzcmMgKyBpICsgIDAgICAgKSk7CisgICAgY29uc3QgX19tMTI4aSBCMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKHNyYyArIGkgKyAgMCAtIDEpKTsKKyAgICBjb25zdCBfX20xMjhpIEExID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikoc3JjICsgaSArIDE2ICAgICkpOworICAgIGNvbnN0IF9fbTEyOGkgQjEgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShzcmMgKyBpICsgMTYgLSAxKSk7CisgICAgY29uc3QgX19tMTI4aSBDMCA9IF9tbV9zdWJfZXBpOChBMCwgQjApOworICAgIGNvbnN0IF9fbTEyOGkgQzEgPSBfbW1fc3ViX2VwaTgoQTEsIEIxKTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikoZHN0ICsgaSArICAwKSwgQzApOworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKShkc3QgKyBpICsgMTYpLCBDMSk7CisgIH0KKyAgZm9yICg7IGkgPCBsZW5ndGg7ICsraSkgZHN0W2ldID0gc3JjW2ldIC0gc3JjW2kgLSAxXTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhvcml6b250YWwgZmlsdGVyLgorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEb0hvcml6b250YWxGaWx0ZXJfU1NFMihjb25zdCB1aW50OF90KiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93LCBpbnQgbnVtX3Jvd3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXQpIHsKKyAgY29uc3Qgc2l6ZV90IHN0YXJ0X29mZnNldCA9IHJvdyAqIHN0cmlkZTsKKyAgY29uc3QgaW50IGxhc3Rfcm93ID0gcm93ICsgbnVtX3Jvd3M7CisgIFNBTklUWV9DSEVDSyhpbiwgb3V0KTsKKyAgaW4gKz0gc3RhcnRfb2Zmc2V0OworICBvdXQgKz0gc3RhcnRfb2Zmc2V0OworCisgIGlmIChyb3cgPT0gMCkgeworICAgIC8vIExlZnRtb3N0IHBpeGVsIGlzIHRoZSBzYW1lIGFzIGlucHV0IGZvciB0b3Btb3N0IHNjYW5saW5lLgorICAgIG91dFswXSA9IGluWzBdOworICAgIFByZWRpY3RMaW5lTGVmdF9TU0UyKGluICsgMSwgb3V0ICsgMSwgd2lkdGggLSAxKTsKKyAgICByb3cgPSAxOworICAgIGluICs9IHN0cmlkZTsKKyAgICBvdXQgKz0gc3RyaWRlOworICB9CisKKyAgLy8gRmlsdGVyIGxpbmUtYnktbGluZS4KKyAgd2hpbGUgKHJvdyA8IGxhc3Rfcm93KSB7CisgICAgLy8gTGVmdG1vc3QgcGl4ZWwgaXMgcHJlZGljdGVkIGZyb20gYWJvdmUuCisgICAgb3V0WzBdID0gaW5bMF0gLSBpblstc3RyaWRlXTsKKyAgICBQcmVkaWN0TGluZUxlZnRfU1NFMihpbiArIDEsIG91dCArIDEsIHdpZHRoIC0gMSk7CisgICAgKytyb3c7CisgICAgaW4gKz0gc3RyaWRlOworICAgIG91dCArPSBzdHJpZGU7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZlcnRpY2FsIGZpbHRlci4KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRG9WZXJ0aWNhbEZpbHRlcl9TU0UyKGNvbnN0IHVpbnQ4X3QqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93LCBpbnQgbnVtX3Jvd3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3V0KSB7CisgIGNvbnN0IHNpemVfdCBzdGFydF9vZmZzZXQgPSByb3cgKiBzdHJpZGU7CisgIGNvbnN0IGludCBsYXN0X3JvdyA9IHJvdyArIG51bV9yb3dzOworICBTQU5JVFlfQ0hFQ0soaW4sIG91dCk7CisgIGluICs9IHN0YXJ0X29mZnNldDsKKyAgb3V0ICs9IHN0YXJ0X29mZnNldDsKKworICBpZiAocm93ID09IDApIHsKKyAgICAvLyBWZXJ5IGZpcnN0IHRvcC1sZWZ0IHBpeGVsIGlzIGNvcGllZC4KKyAgICBvdXRbMF0gPSBpblswXTsKKyAgICAvLyBSZXN0IG9mIHRvcCBzY2FuLWxpbmUgaXMgbGVmdC1wcmVkaWN0ZWQuCisgICAgUHJlZGljdExpbmVMZWZ0X1NTRTIoaW4gKyAxLCBvdXQgKyAxLCB3aWR0aCAtIDEpOworICAgIHJvdyA9IDE7CisgICAgaW4gKz0gc3RyaWRlOworICAgIG91dCArPSBzdHJpZGU7CisgIH0KKworICAvLyBGaWx0ZXIgbGluZS1ieS1saW5lLgorICB3aGlsZSAocm93IDwgbGFzdF9yb3cpIHsKKyAgICBQcmVkaWN0TGluZVRvcF9TU0UyKGluLCBpbiAtIHN0cmlkZSwgb3V0LCB3aWR0aCk7CisgICAgKytyb3c7CisgICAgaW4gKz0gc3RyaWRlOworICAgIG91dCArPSBzdHJpZGU7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEdyYWRpZW50IGZpbHRlci4KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBHcmFkaWVudFByZWRpY3Rvcl9TU0UyKHVpbnQ4X3QgYSwgdWludDhfdCBiLCB1aW50OF90IGMpIHsKKyAgY29uc3QgaW50IGcgPSBhICsgYiAtIGM7CisgIHJldHVybiAoKGcgJiB+MHhmZikgPT0gMCkgPyBnIDogKGcgPCAwKSA/IDAgOiAyNTU7ICAvLyBjbGlwIHRvIDhiaXQKK30KKworc3RhdGljIHZvaWQgR3JhZGllbnRQcmVkaWN0RGlyZWN0X1NTRTIoY29uc3QgdWludDhfdCogY29uc3Qgcm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3Qgb3V0LCBpbnQgbGVuZ3RoKSB7CisgIGNvbnN0IGludCBtYXhfcG9zID0gbGVuZ3RoICYgfjc7CisgIGludCBpOworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBmb3IgKGkgPSAwOyBpIDwgbWF4X3BvczsgaSArPSA4KSB7CisgICAgY29uc3QgX19tMTI4aSBBMCA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJnJvd1tpIC0gMV0pOworICAgIGNvbnN0IF9fbTEyOGkgQjAgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZ0b3BbaV0pOworICAgIGNvbnN0IF9fbTEyOGkgQzAgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZ0b3BbaSAtIDFdKTsKKyAgICBjb25zdCBfX20xMjhpIEQgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZyb3dbaV0pOworICAgIGNvbnN0IF9fbTEyOGkgQTEgPSBfbW1fdW5wYWNrbG9fZXBpOChBMCwgemVybyk7CisgICAgY29uc3QgX19tMTI4aSBCMSA9IF9tbV91bnBhY2tsb19lcGk4KEIwLCB6ZXJvKTsKKyAgICBjb25zdCBfX20xMjhpIEMxID0gX21tX3VucGFja2xvX2VwaTgoQzAsIHplcm8pOworICAgIGNvbnN0IF9fbTEyOGkgRSA9IF9tbV9hZGRfZXBpMTYoQTEsIEIxKTsKKyAgICBjb25zdCBfX20xMjhpIEYgPSBfbW1fc3ViX2VwaTE2KEUsIEMxKTsKKyAgICBjb25zdCBfX20xMjhpIEcgPSBfbW1fcGFja3VzX2VwaTE2KEYsIHplcm8pOworICAgIGNvbnN0IF9fbTEyOGkgSCA9IF9tbV9zdWJfZXBpOChELCBHKTsKKyAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikob3V0ICsgaSksIEgpOworICB9CisgIGZvciAoOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICBvdXRbaV0gPSByb3dbaV0gLSBHcmFkaWVudFByZWRpY3Rvcl9TU0UyKHJvd1tpIC0gMV0sIHRvcFtpXSwgdG9wW2kgLSAxXSk7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRG9HcmFkaWVudEZpbHRlcl9TU0UyKGNvbnN0IHVpbnQ4X3QqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93LCBpbnQgbnVtX3Jvd3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3V0KSB7CisgIGNvbnN0IHNpemVfdCBzdGFydF9vZmZzZXQgPSByb3cgKiBzdHJpZGU7CisgIGNvbnN0IGludCBsYXN0X3JvdyA9IHJvdyArIG51bV9yb3dzOworICBTQU5JVFlfQ0hFQ0soaW4sIG91dCk7CisgIGluICs9IHN0YXJ0X29mZnNldDsKKyAgb3V0ICs9IHN0YXJ0X29mZnNldDsKKworICAvLyBsZWZ0IHByZWRpY3Rpb24gZm9yIHRvcCBzY2FuLWxpbmUKKyAgaWYgKHJvdyA9PSAwKSB7CisgICAgb3V0WzBdID0gaW5bMF07CisgICAgUHJlZGljdExpbmVMZWZ0X1NTRTIoaW4gKyAxLCBvdXQgKyAxLCB3aWR0aCAtIDEpOworICAgIHJvdyA9IDE7CisgICAgaW4gKz0gc3RyaWRlOworICAgIG91dCArPSBzdHJpZGU7CisgIH0KKworICAvLyBGaWx0ZXIgbGluZS1ieS1saW5lLgorICB3aGlsZSAocm93IDwgbGFzdF9yb3cpIHsKKyAgICBvdXRbMF0gPSBpblswXSAtIGluWy1zdHJpZGVdOworICAgIEdyYWRpZW50UHJlZGljdERpcmVjdF9TU0UyKGluICsgMSwgaW4gKyAxIC0gc3RyaWRlLCBvdXQgKyAxLCB3aWR0aCAtIDEpOworICAgICsrcm93OworICAgIGluICs9IHN0cmlkZTsKKyAgICBvdXQgKz0gc3RyaWRlOworICB9Cit9CisKKyN1bmRlZiBTQU5JVFlfQ0hFQ0sKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgSG9yaXpvbnRhbEZpbHRlcl9TU0UyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCB1aW50OF90KiBmaWx0ZXJlZF9kYXRhKSB7CisgIERvSG9yaXpvbnRhbEZpbHRlcl9TU0UyKGRhdGEsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgMCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZF9kYXRhKTsKK30KKworc3RhdGljIHZvaWQgVmVydGljYWxGaWx0ZXJfU1NFMihjb25zdCB1aW50OF90KiBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIHVpbnQ4X3QqIGZpbHRlcmVkX2RhdGEpIHsKKyAgRG9WZXJ0aWNhbEZpbHRlcl9TU0UyKGRhdGEsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgMCwgaGVpZ2h0LCBmaWx0ZXJlZF9kYXRhKTsKK30KKworc3RhdGljIHZvaWQgR3JhZGllbnRGaWx0ZXJfU1NFMihjb25zdCB1aW50OF90KiBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIHVpbnQ4X3QqIGZpbHRlcmVkX2RhdGEpIHsKKyAgRG9HcmFkaWVudEZpbHRlcl9TU0UyKGRhdGEsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgMCwgaGVpZ2h0LCBmaWx0ZXJlZF9kYXRhKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEludmVyc2UgdHJhbnNmb3JtcworCitzdGF0aWMgdm9pZCBIb3Jpem9udGFsVW5maWx0ZXJfU1NFMihjb25zdCB1aW50OF90KiBwcmV2LCBjb25zdCB1aW50OF90KiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG91dCwgaW50IHdpZHRoKSB7CisgIGludCBpOworICBfX20xMjhpIGxhc3Q7CisgIG91dFswXSA9IGluWzBdICsgKHByZXYgPT0gTlVMTCA/IDAgOiBwcmV2WzBdKTsKKyAgaWYgKHdpZHRoIDw9IDEpIHJldHVybjsKKyAgbGFzdCA9IF9tbV9zZXRfZXBpMzIoMCwgMCwgMCwgb3V0WzBdKTsKKyAgZm9yIChpID0gMTsgaSArIDggPD0gd2lkdGg7IGkgKz0gOCkgeworICAgIGNvbnN0IF9fbTEyOGkgQTAgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKShpbiArIGkpKTsKKyAgICBjb25zdCBfX20xMjhpIEExID0gX21tX2FkZF9lcGk4KEEwLCBsYXN0KTsKKyAgICBjb25zdCBfX20xMjhpIEEyID0gX21tX3NsbGlfc2kxMjgoQTEsIDEpOworICAgIGNvbnN0IF9fbTEyOGkgQTMgPSBfbW1fYWRkX2VwaTgoQTEsIEEyKTsKKyAgICBjb25zdCBfX20xMjhpIEE0ID0gX21tX3NsbGlfc2kxMjgoQTMsIDIpOworICAgIGNvbnN0IF9fbTEyOGkgQTUgPSBfbW1fYWRkX2VwaTgoQTMsIEE0KTsKKyAgICBjb25zdCBfX20xMjhpIEE2ID0gX21tX3NsbGlfc2kxMjgoQTUsIDQpOworICAgIGNvbnN0IF9fbTEyOGkgQTcgPSBfbW1fYWRkX2VwaTgoQTUsIEE2KTsKKyAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikob3V0ICsgaSksIEE3KTsKKyAgICBsYXN0ID0gX21tX3NybGlfZXBpNjQoQTcsIDU2KTsKKyAgfQorICBmb3IgKDsgaSA8IHdpZHRoOyArK2kpIG91dFtpXSA9IGluW2ldICsgb3V0W2kgLSAxXTsKK30KKworc3RhdGljIHZvaWQgVmVydGljYWxVbmZpbHRlcl9TU0UyKGNvbnN0IHVpbnQ4X3QqIHByZXYsIGNvbnN0IHVpbnQ4X3QqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG91dCwgaW50IHdpZHRoKSB7CisgIGlmIChwcmV2ID09IE5VTEwpIHsKKyAgICBIb3Jpem9udGFsVW5maWx0ZXJfU1NFMihOVUxMLCBpbiwgb3V0LCB3aWR0aCk7CisgIH0gZWxzZSB7CisgICAgaW50IGk7CisgICAgY29uc3QgaW50IG1heF9wb3MgPSB3aWR0aCAmIH4zMTsKKyAgICBhc3NlcnQod2lkdGggPj0gMCk7CisgICAgZm9yIChpID0gMDsgaSA8IG1heF9wb3M7IGkgKz0gMzIpIHsKKyAgICAgIGNvbnN0IF9fbTEyOGkgQTAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZpbltpICsgIDBdKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgQTEgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZpbltpICsgMTZdKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgQjAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZwcmV2W2kgKyAgMF0pOworICAgICAgY29uc3QgX19tMTI4aSBCMSA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnByZXZbaSArIDE2XSk7CisgICAgICBjb25zdCBfX20xMjhpIEMwID0gX21tX2FkZF9lcGk4KEEwLCBCMCk7CisgICAgICBjb25zdCBfX20xMjhpIEMxID0gX21tX2FkZF9lcGk4KEExLCBCMSk7CisgICAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmb3V0W2kgKyAgMF0sIEMwKTsKKyAgICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbaSArIDE2XSwgQzEpOworICAgIH0KKyAgICBmb3IgKDsgaSA8IHdpZHRoOyArK2kpIG91dFtpXSA9IGluW2ldICsgcHJldltpXTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBHcmFkaWVudFByZWRpY3RJbnZlcnNlX1NTRTIoY29uc3QgdWludDhfdCogY29uc3QgaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IHJvdywgaW50IGxlbmd0aCkgeworICBpZiAobGVuZ3RoID4gMCkgeworICAgIGludCBpOworICAgIGNvbnN0IGludCBtYXhfcG9zID0gbGVuZ3RoICYgfjc7CisgICAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgICBfX20xMjhpIEEgPSBfbW1fc2V0X2VwaTMyKDAsIDAsIDAsIHJvd1stMV0pOyAgIC8vIGxlZnQgc2FtcGxlCisgICAgZm9yIChpID0gMDsgaSA8IG1heF9wb3M7IGkgKz0gOCkgeworICAgICAgY29uc3QgX19tMTI4aSB0bXAwID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmdG9wW2ldKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgdG1wMSA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJnRvcFtpIC0gMV0pOworICAgICAgY29uc3QgX19tMTI4aSBCID0gX21tX3VucGFja2xvX2VwaTgodG1wMCwgemVybyk7CisgICAgICBjb25zdCBfX20xMjhpIEMgPSBfbW1fdW5wYWNrbG9fZXBpOCh0bXAxLCB6ZXJvKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgRCA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmluW2ldKTsgIC8vIGJhc2UgaW5wdXQKKyAgICAgIGNvbnN0IF9fbTEyOGkgRSA9IF9tbV9zdWJfZXBpMTYoQiwgQyk7ICAvLyB1bmNsaXBwZWQgZ3JhZGllbnQgYmFzaXMgQiAtIEMKKyAgICAgIF9fbTEyOGkgb3V0ID0gemVybzsgICAgICAgICAgICAgICAgICAgICAvLyBhY2N1bXVsYXRvciBmb3Igb3V0cHV0CisgICAgICBfX20xMjhpIG1hc2tfaGkgPSBfbW1fc2V0X2VwaTMyKDAsIDAsIDAsIDB4ZmYpOworICAgICAgaW50IGsgPSA4OworICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgY29uc3QgX19tMTI4aSB0bXAzID0gX21tX2FkZF9lcGkxNihBLCBFKTsgICAgICAgICAgIC8vIGRlbHRhID0gQSArIEIgLSBDCisgICAgICAgIGNvbnN0IF9fbTEyOGkgdG1wNCA9IF9tbV9wYWNrdXNfZXBpMTYodG1wMywgemVybyk7ICAvLyBzYXR1cmF0ZSBkZWx0YQorICAgICAgICBjb25zdCBfX20xMjhpIHRtcDUgPSBfbW1fYWRkX2VwaTgodG1wNCwgRCk7ICAgICAgICAgLy8gYWRkIHRvIGluW10KKyAgICAgICAgQSA9IF9tbV9hbmRfc2kxMjgodG1wNSwgbWFza19oaSk7ICAgICAgICAgICAgICAgICAgIC8vIDEtY29tcGxlbWVudCBjbGlwCisgICAgICAgIG91dCA9IF9tbV9vcl9zaTEyOChvdXQsIEEpOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhY2N1bXVsYXRlIG91dHB1dAorICAgICAgICBpZiAoLS1rID09IDApIGJyZWFrOworICAgICAgICBBID0gX21tX3NsbGlfc2kxMjgoQSwgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gcm90YXRlIGxlZnQgc2FtcGxlCisgICAgICAgIG1hc2tfaGkgPSBfbW1fc2xsaV9zaTEyOChtYXNrX2hpLCAxKTsgICAgICAgICAgICAvLyByb3RhdGUgbWFzaworICAgICAgICBBID0gX21tX3VucGFja2xvX2VwaTgoQSwgemVybyk7ICAgICAgICAgICAgICAgICAgLy8gY29udmVydCA4Yi0+MTZiCisgICAgICB9CisgICAgICBBID0gX21tX3NybGlfc2kxMjgoQSwgNyk7ICAgICAgIC8vIHByZXBhcmUgbGVmdCBzYW1wbGUgZm9yIG5leHQgaXRlcmF0aW9uCisgICAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikmcm93W2ldLCBvdXQpOworICAgIH0KKyAgICBmb3IgKDsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgICByb3dbaV0gPSBpbltpXSArIEdyYWRpZW50UHJlZGljdG9yX1NTRTIocm93W2kgLSAxXSwgdG9wW2ldLCB0b3BbaSAtIDFdKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgR3JhZGllbnRVbmZpbHRlcl9TU0UyKGNvbnN0IHVpbnQ4X3QqIHByZXYsIGNvbnN0IHVpbnQ4X3QqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG91dCwgaW50IHdpZHRoKSB7CisgIGlmIChwcmV2ID09IE5VTEwpIHsKKyAgICBIb3Jpem9udGFsVW5maWx0ZXJfU1NFMihOVUxMLCBpbiwgb3V0LCB3aWR0aCk7CisgIH0gZWxzZSB7CisgICAgb3V0WzBdID0gaW5bMF0gKyBwcmV2WzBdOyAgLy8gcHJlZGljdCBmcm9tIGFib3ZlCisgICAgR3JhZGllbnRQcmVkaWN0SW52ZXJzZV9TU0UyKGluICsgMSwgcHJldiArIDEsIG91dCArIDEsIHdpZHRoIC0gMSk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFZQOEZpbHRlcnNJbml0U1NFMih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFZQOEZpbHRlcnNJbml0U1NFMih2b2lkKSB7CisgIFdlYlBVbmZpbHRlcnNbV0VCUF9GSUxURVJfSE9SSVpPTlRBTF0gPSBIb3Jpem9udGFsVW5maWx0ZXJfU1NFMjsKKyAgV2ViUFVuZmlsdGVyc1tXRUJQX0ZJTFRFUl9WRVJUSUNBTF0gPSBWZXJ0aWNhbFVuZmlsdGVyX1NTRTI7CisgIFdlYlBVbmZpbHRlcnNbV0VCUF9GSUxURVJfR1JBRElFTlRdID0gR3JhZGllbnRVbmZpbHRlcl9TU0UyOworCisgIFdlYlBGaWx0ZXJzW1dFQlBfRklMVEVSX0hPUklaT05UQUxdID0gSG9yaXpvbnRhbEZpbHRlcl9TU0UyOworICBXZWJQRmlsdGVyc1tXRUJQX0ZJTFRFUl9WRVJUSUNBTF0gPSBWZXJ0aWNhbEZpbHRlcl9TU0UyOworICBXZWJQRmlsdGVyc1tXRUJQX0ZJTFRFUl9HUkFESUVOVF0gPSBHcmFkaWVudEZpbHRlcl9TU0UyOworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX1NTRTIKKworV0VCUF9EU1BfSU5JVF9TVFVCKFZQOEZpbHRlcnNJbml0U1NFMikKKworI2VuZGlmICAvLyBXRUJQX1VTRV9TU0UyCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2xvc3NsZXNzLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2xvc3NsZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA1M2VmZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbG9zc2xlc3MuYwpAQCAtMCwwICsxLDY2NiBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEltYWdlIHRyYW5zZm9ybXMgYW5kIGNvbG9yIHNwYWNlIGNvbnZlcnNpb24gbWV0aG9kcyBmb3IgbG9zc2xlc3MgZGVjb2Rlci4KKy8vCisvLyBBdXRob3JzOiBWaWthcyBBcm9yYSAodmlrYWFzLmFyb3JhQGdtYWlsLmNvbSkKKy8vICAgICAgICAgIEp5cmtpIEFsYWt1aWphbGEgKGp5cmtpQGdvb2dsZS5jb20pCisvLyAgICAgICAgICBVcnZhbmcgSm9zaGkgKHVydmFuZ0Bnb29nbGUuY29tKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL2Fzc2VydF9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vbWF0aF9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RkbGliX3BvZW0uaCIKKyNlbHNlCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvZGVjL3ZwOGxpX2RlYy5oIgorI2luY2x1ZGUgInNyYy91dGlscy9lbmRpYW5faW5sX3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL2RzcC9sb3NzbGVzcy5oIgorI2luY2x1ZGUgInNyYy9kc3AvbG9zc2xlc3NfY29tbW9uLmgiCisKKyNkZWZpbmUgTUFYX0RJRkZfQ09TVCAoMWUzMGYpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbWFnZSB0cmFuc2Zvcm1zLgorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQXZlcmFnZTIodWludDMyX3QgYTAsIHVpbnQzMl90IGExKSB7CisgIHJldHVybiAoKChhMCBeIGExKSAmIDB4ZmVmZWZlZmV1KSA+PiAxKSArIChhMCAmIGExKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IEF2ZXJhZ2UzKHVpbnQzMl90IGEwLCB1aW50MzJfdCBhMSwgdWludDMyX3QgYTIpIHsKKyAgcmV0dXJuIEF2ZXJhZ2UyKEF2ZXJhZ2UyKGEwLCBhMiksIGExKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IEF2ZXJhZ2U0KHVpbnQzMl90IGEwLCB1aW50MzJfdCBhMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhMiwgdWludDMyX3QgYTMpIHsKKyAgcmV0dXJuIEF2ZXJhZ2UyKEF2ZXJhZ2UyKGEwLCBhMSksIEF2ZXJhZ2UyKGEyLCBhMykpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQ2xpcDI1NSh1aW50MzJfdCBhKSB7CisgIGlmIChhIDwgMjU2KSB7CisgICAgcmV0dXJuIGE7CisgIH0KKyAgLy8gcmV0dXJuIDAsIHdoZW4gYSBpcyBhIG5lZ2F0aXZlIGludGVnZXIuCisgIC8vIHJldHVybiAyNTUsIHdoZW4gYSBpcyBwb3NpdGl2ZS4KKyAgcmV0dXJuIH5hID4+IDI0OworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IEFkZFN1YnRyYWN0Q29tcG9uZW50RnVsbChpbnQgYSwgaW50IGIsIGludCBjKSB7CisgIHJldHVybiBDbGlwMjU1KGEgKyBiIC0gYyk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBDbGFtcGVkQWRkU3VidHJhY3RGdWxsKHVpbnQzMl90IGMwLCB1aW50MzJfdCBjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGMyKSB7CisgIGNvbnN0IGludCBhID0gQWRkU3VidHJhY3RDb21wb25lbnRGdWxsKGMwID4+IDI0LCBjMSA+PiAyNCwgYzIgPj4gMjQpOworICBjb25zdCBpbnQgciA9IEFkZFN1YnRyYWN0Q29tcG9uZW50RnVsbCgoYzAgPj4gMTYpICYgMHhmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGMxID4+IDE2KSAmIDB4ZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjMiA+PiAxNikgJiAweGZmKTsKKyAgY29uc3QgaW50IGcgPSBBZGRTdWJ0cmFjdENvbXBvbmVudEZ1bGwoKGMwID4+IDgpICYgMHhmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGMxID4+IDgpICYgMHhmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGMyID4+IDgpICYgMHhmZik7CisgIGNvbnN0IGludCBiID0gQWRkU3VidHJhY3RDb21wb25lbnRGdWxsKGMwICYgMHhmZiwgYzEgJiAweGZmLCBjMiAmIDB4ZmYpOworICByZXR1cm4gKCh1aW50MzJfdClhIDw8IDI0KSB8IChyIDw8IDE2KSB8IChnIDw8IDgpIHwgYjsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBBZGRTdWJ0cmFjdENvbXBvbmVudEhhbGYoaW50IGEsIGludCBiKSB7CisgIHJldHVybiBDbGlwMjU1KGEgKyAoYSAtIGIpIC8gMik7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBDbGFtcGVkQWRkU3VidHJhY3RIYWxmKHVpbnQzMl90IGMwLCB1aW50MzJfdCBjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGMyKSB7CisgIGNvbnN0IHVpbnQzMl90IGF2ZSA9IEF2ZXJhZ2UyKGMwLCBjMSk7CisgIGNvbnN0IGludCBhID0gQWRkU3VidHJhY3RDb21wb25lbnRIYWxmKGF2ZSA+PiAyNCwgYzIgPj4gMjQpOworICBjb25zdCBpbnQgciA9IEFkZFN1YnRyYWN0Q29tcG9uZW50SGFsZigoYXZlID4+IDE2KSAmIDB4ZmYsIChjMiA+PiAxNikgJiAweGZmKTsKKyAgY29uc3QgaW50IGcgPSBBZGRTdWJ0cmFjdENvbXBvbmVudEhhbGYoKGF2ZSA+PiA4KSAmIDB4ZmYsIChjMiA+PiA4KSAmIDB4ZmYpOworICBjb25zdCBpbnQgYiA9IEFkZFN1YnRyYWN0Q29tcG9uZW50SGFsZigoYXZlID4+IDApICYgMHhmZiwgKGMyID4+IDApICYgMHhmZik7CisgIHJldHVybiAoKHVpbnQzMl90KWEgPDwgMjQpIHwgKHIgPDwgMTYpIHwgKGcgPDwgOCkgfCBiOworfQorCisvLyBnY2MgPD0gNC45IG9uIEFSTSBnZW5lcmF0ZXMgaW5jb3JyZWN0IGNvZGUgaW4gU2VsZWN0KCkgd2hlbiBTdWIzKCkgaXMKKy8vIGlubGluZWQuCisjaWYgZGVmaW5lZChfX2FybV9fKSAmJiBMT0NBTF9HQ0NfVkVSU0lPTiA8PSAweDQwOQorIyBkZWZpbmUgTE9DQUxfSU5MSU5FIF9fYXR0cmlidXRlX18gKChub2lubGluZSkpCisjZWxzZQorIyBkZWZpbmUgTE9DQUxfSU5MSU5FIFdFQlBfSU5MSU5FCisjZW5kaWYKKworc3RhdGljIExPQ0FMX0lOTElORSBpbnQgU3ViMyhpbnQgYSwgaW50IGIsIGludCBjKSB7CisgIGNvbnN0IGludCBwYiA9IGIgLSBjOworICBjb25zdCBpbnQgcGEgPSBhIC0gYzsKKyAgcmV0dXJuIGFicyhwYikgLSBhYnMocGEpOworfQorCisjdW5kZWYgTE9DQUxfSU5MSU5FCisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBTZWxlY3QodWludDMyX3QgYSwgdWludDMyX3QgYiwgdWludDMyX3QgYykgeworICBjb25zdCBpbnQgcGFfbWludXNfcGIgPQorICAgICAgU3ViMygoYSA+PiAyNCkgICAgICAgLCAoYiA+PiAyNCkgICAgICAgLCAoYyA+PiAyNCkgICAgICAgKSArCisgICAgICBTdWIzKChhID4+IDE2KSAmIDB4ZmYsIChiID4+IDE2KSAmIDB4ZmYsIChjID4+IDE2KSAmIDB4ZmYpICsKKyAgICAgIFN1YjMoKGEgPj4gIDgpICYgMHhmZiwgKGIgPj4gIDgpICYgMHhmZiwgKGMgPj4gIDgpICYgMHhmZikgKworICAgICAgU3ViMygoYSAgICAgICkgJiAweGZmLCAoYiAgICAgICkgJiAweGZmLCAoYyAgICAgICkgJiAweGZmKTsKKyAgcmV0dXJuIChwYV9taW51c19wYiA8PSAwKSA/IGEgOiBiOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHJlZGljdG9ycworCitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yMF9DKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgKHZvaWQpdG9wOworICAodm9pZClsZWZ0OworICByZXR1cm4gQVJHQl9CTEFDSzsKK30KK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3IxX0ModWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICAodm9pZCl0b3A7CisgIHJldHVybiBsZWZ0OworfQorc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjJfQyh1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgICh2b2lkKWxlZnQ7CisgIHJldHVybiB0b3BbMF07Cit9CitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yM19DKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgKHZvaWQpbGVmdDsKKyAgcmV0dXJuIHRvcFsxXTsKK30KK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3I0X0ModWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICAodm9pZClsZWZ0OworICByZXR1cm4gdG9wWy0xXTsKK30KK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3I1X0ModWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICBjb25zdCB1aW50MzJfdCBwcmVkID0gQXZlcmFnZTMobGVmdCwgdG9wWzBdLCB0b3BbMV0pOworICByZXR1cm4gcHJlZDsKK30KK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3I2X0ModWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICBjb25zdCB1aW50MzJfdCBwcmVkID0gQXZlcmFnZTIobGVmdCwgdG9wWy0xXSk7CisgIHJldHVybiBwcmVkOworfQorc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjdfQyh1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgIGNvbnN0IHVpbnQzMl90IHByZWQgPSBBdmVyYWdlMihsZWZ0LCB0b3BbMF0pOworICByZXR1cm4gcHJlZDsKK30KK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3I4X0ModWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICBjb25zdCB1aW50MzJfdCBwcmVkID0gQXZlcmFnZTIodG9wWy0xXSwgdG9wWzBdKTsKKyAgKHZvaWQpbGVmdDsKKyAgcmV0dXJuIHByZWQ7Cit9CitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yOV9DKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgY29uc3QgdWludDMyX3QgcHJlZCA9IEF2ZXJhZ2UyKHRvcFswXSwgdG9wWzFdKTsKKyAgKHZvaWQpbGVmdDsKKyAgcmV0dXJuIHByZWQ7Cit9CitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yMTBfQyh1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgIGNvbnN0IHVpbnQzMl90IHByZWQgPSBBdmVyYWdlNChsZWZ0LCB0b3BbLTFdLCB0b3BbMF0sIHRvcFsxXSk7CisgIHJldHVybiBwcmVkOworfQorc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjExX0ModWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICBjb25zdCB1aW50MzJfdCBwcmVkID0gU2VsZWN0KHRvcFswXSwgbGVmdCwgdG9wWy0xXSk7CisgIHJldHVybiBwcmVkOworfQorc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjEyX0ModWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICBjb25zdCB1aW50MzJfdCBwcmVkID0gQ2xhbXBlZEFkZFN1YnRyYWN0RnVsbChsZWZ0LCB0b3BbMF0sIHRvcFstMV0pOworICByZXR1cm4gcHJlZDsKK30KK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3IxM19DKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgY29uc3QgdWludDMyX3QgcHJlZCA9IENsYW1wZWRBZGRTdWJ0cmFjdEhhbGYobGVmdCwgdG9wWzBdLCB0b3BbLTFdKTsKKyAgcmV0dXJuIHByZWQ7Cit9CisKK0dFTkVSQVRFX1BSRURJQ1RPUl9BREQoUHJlZGljdG9yMF9DLCBQcmVkaWN0b3JBZGQwX0MpCitzdGF0aWMgdm9pZCBQcmVkaWN0b3JBZGQxX0MoY29uc3QgdWludDMyX3QqIGluLCBjb25zdCB1aW50MzJfdCogdXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQzMl90KiBvdXQpIHsKKyAgaW50IGk7CisgIHVpbnQzMl90IGxlZnQgPSBvdXRbLTFdOworICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BpeGVsczsgKytpKSB7CisgICAgb3V0W2ldID0gbGVmdCA9IFZQOExBZGRQaXhlbHMoaW5baV0sIGxlZnQpOworICB9CisgICh2b2lkKXVwcGVyOworfQorR0VORVJBVEVfUFJFRElDVE9SX0FERChQcmVkaWN0b3IyX0MsIFByZWRpY3RvckFkZDJfQykKK0dFTkVSQVRFX1BSRURJQ1RPUl9BREQoUHJlZGljdG9yM19DLCBQcmVkaWN0b3JBZGQzX0MpCitHRU5FUkFURV9QUkVESUNUT1JfQUREKFByZWRpY3RvcjRfQywgUHJlZGljdG9yQWRkNF9DKQorR0VORVJBVEVfUFJFRElDVE9SX0FERChQcmVkaWN0b3I1X0MsIFByZWRpY3RvckFkZDVfQykKK0dFTkVSQVRFX1BSRURJQ1RPUl9BREQoUHJlZGljdG9yNl9DLCBQcmVkaWN0b3JBZGQ2X0MpCitHRU5FUkFURV9QUkVESUNUT1JfQUREKFByZWRpY3RvcjdfQywgUHJlZGljdG9yQWRkN19DKQorR0VORVJBVEVfUFJFRElDVE9SX0FERChQcmVkaWN0b3I4X0MsIFByZWRpY3RvckFkZDhfQykKK0dFTkVSQVRFX1BSRURJQ1RPUl9BREQoUHJlZGljdG9yOV9DLCBQcmVkaWN0b3JBZGQ5X0MpCitHRU5FUkFURV9QUkVESUNUT1JfQUREKFByZWRpY3RvcjEwX0MsIFByZWRpY3RvckFkZDEwX0MpCitHRU5FUkFURV9QUkVESUNUT1JfQUREKFByZWRpY3RvcjExX0MsIFByZWRpY3RvckFkZDExX0MpCitHRU5FUkFURV9QUkVESUNUT1JfQUREKFByZWRpY3RvcjEyX0MsIFByZWRpY3RvckFkZDEyX0MpCitHRU5FUkFURV9QUkVESUNUT1JfQUREKFByZWRpY3RvcjEzX0MsIFByZWRpY3RvckFkZDEzX0MpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEludmVyc2UgcHJlZGljdGlvbi4KK3N0YXRpYyB2b2lkIFByZWRpY3RvckludmVyc2VUcmFuc2Zvcm1fQyhjb25zdCBWUDhMVHJhbnNmb3JtKiBjb25zdCB0cmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfc3RhcnQsIGludCB5X2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogaW4sIHVpbnQzMl90KiBvdXQpIHsKKyAgY29uc3QgaW50IHdpZHRoID0gdHJhbnNmb3JtLT54c2l6ZV87CisgIGlmICh5X3N0YXJ0ID09IDApIHsgIC8vIEZpcnN0IFJvdyBmb2xsb3dzIHRoZSBMIChtb2RlPTEpIG1vZGUuCisgICAgUHJlZGljdG9yQWRkMF9DKGluLCBOVUxMLCAxLCBvdXQpOworICAgIFByZWRpY3RvckFkZDFfQyhpbiArIDEsIE5VTEwsIHdpZHRoIC0gMSwgb3V0ICsgMSk7CisgICAgaW4gKz0gd2lkdGg7CisgICAgb3V0ICs9IHdpZHRoOworICAgICsreV9zdGFydDsKKyAgfQorCisgIHsKKyAgICBpbnQgeSA9IHlfc3RhcnQ7CisgICAgY29uc3QgaW50IHRpbGVfd2lkdGggPSAxIDw8IHRyYW5zZm9ybS0+Yml0c187CisgICAgY29uc3QgaW50IG1hc2sgPSB0aWxlX3dpZHRoIC0gMTsKKyAgICBjb25zdCBpbnQgdGlsZXNfcGVyX3JvdyA9IFZQOExTdWJTYW1wbGVTaXplKHdpZHRoLCB0cmFuc2Zvcm0tPmJpdHNfKTsKKyAgICBjb25zdCB1aW50MzJfdCogcHJlZF9tb2RlX2Jhc2UgPQorICAgICAgICB0cmFuc2Zvcm0tPmRhdGFfICsgKHkgPj4gdHJhbnNmb3JtLT5iaXRzXykgKiB0aWxlc19wZXJfcm93OworCisgICAgd2hpbGUgKHkgPCB5X2VuZCkgeworICAgICAgY29uc3QgdWludDMyX3QqIHByZWRfbW9kZV9zcmMgPSBwcmVkX21vZGVfYmFzZTsKKyAgICAgIGludCB4ID0gMTsKKyAgICAgIC8vIEZpcnN0IHBpeGVsIGZvbGxvd3MgdGhlIFQgKG1vZGU9MikgbW9kZS4KKyAgICAgIFByZWRpY3RvckFkZDJfQyhpbiwgb3V0IC0gd2lkdGgsIDEsIG91dCk7CisgICAgICAvLyAuLiB0aGUgcmVzdDoKKyAgICAgIHdoaWxlICh4IDwgd2lkdGgpIHsKKyAgICAgICAgY29uc3QgVlA4TFByZWRpY3RvckFkZFN1YkZ1bmMgcHJlZF9mdW5jID0KKyAgICAgICAgICAgIFZQOExQcmVkaWN0b3JzQWRkWygoKnByZWRfbW9kZV9zcmMrKykgPj4gOCkgJiAweGZdOworICAgICAgICBpbnQgeF9lbmQgPSAoeCAmIH5tYXNrKSArIHRpbGVfd2lkdGg7CisgICAgICAgIGlmICh4X2VuZCA+IHdpZHRoKSB4X2VuZCA9IHdpZHRoOworICAgICAgICBwcmVkX2Z1bmMoaW4gKyB4LCBvdXQgKyB4IC0gd2lkdGgsIHhfZW5kIC0geCwgb3V0ICsgeCk7CisgICAgICAgIHggPSB4X2VuZDsKKyAgICAgIH0KKyAgICAgIGluICs9IHdpZHRoOworICAgICAgb3V0ICs9IHdpZHRoOworICAgICAgKyt5OworICAgICAgaWYgKCh5ICYgbWFzaykgPT0gMCkgeyAgIC8vIFVzZSB0aGUgc2FtZSBtYXNrLCBzaW5jZSB0aWxlcyBhcmUgc3F1YXJlcy4KKyAgICAgICAgcHJlZF9tb2RlX2Jhc2UgKz0gdGlsZXNfcGVyX3JvdzsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLy8gQWRkIGdyZWVuIHRvIGJsdWUgYW5kIHJlZCBjaGFubmVscyAoaS5lLiBwZXJmb3JtIHRoZSBpbnZlcnNlIHRyYW5zZm9ybSBvZgorLy8gJ3N1YnRyYWN0IGdyZWVuJykuCit2b2lkIFZQOExBZGRHcmVlblRvQmx1ZUFuZFJlZF9DKGNvbnN0IHVpbnQzMl90KiBzcmMsIGludCBudW1fcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZHN0KSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BpeGVsczsgKytpKSB7CisgICAgY29uc3QgdWludDMyX3QgYXJnYiA9IHNyY1tpXTsKKyAgICBjb25zdCB1aW50MzJfdCBncmVlbiA9ICgoYXJnYiA+PiA4KSAmIDB4ZmYpOworICAgIHVpbnQzMl90IHJlZF9ibHVlID0gKGFyZ2IgJiAweDAwZmYwMGZmdSk7CisgICAgcmVkX2JsdWUgKz0gKGdyZWVuIDw8IDE2KSB8IGdyZWVuOworICAgIHJlZF9ibHVlICY9IDB4MDBmZjAwZmZ1OworICAgIGRzdFtpXSA9IChhcmdiICYgMHhmZjAwZmYwMHUpIHwgcmVkX2JsdWU7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBDb2xvclRyYW5zZm9ybURlbHRhKGludDhfdCBjb2xvcl9wcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDhfdCBjb2xvcikgeworICByZXR1cm4gKChpbnQpY29sb3JfcHJlZCAqIGNvbG9yKSA+PiA1OworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBDb2xvckNvZGVUb011bHRpcGxpZXJzKHVpbnQzMl90IGNvbG9yX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExNdWx0aXBsaWVycyogY29uc3QgbSkgeworICBtLT5ncmVlbl90b19yZWRfICA9IChjb2xvcl9jb2RlID4+ICAwKSAmIDB4ZmY7CisgIG0tPmdyZWVuX3RvX2JsdWVfID0gKGNvbG9yX2NvZGUgPj4gIDgpICYgMHhmZjsKKyAgbS0+cmVkX3RvX2JsdWVfICAgPSAoY29sb3JfY29kZSA+PiAxNikgJiAweGZmOworfQorCit2b2lkIFZQOExUcmFuc2Zvcm1Db2xvckludmVyc2VfQyhjb25zdCBWUDhMTXVsdGlwbGllcnMqIGNvbnN0IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogc3JjLCBpbnQgbnVtX3BpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkc3QpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBudW1fcGl4ZWxzOyArK2kpIHsKKyAgICBjb25zdCB1aW50MzJfdCBhcmdiID0gc3JjW2ldOworICAgIGNvbnN0IHVpbnQzMl90IGdyZWVuID0gYXJnYiA+PiA4OworICAgIGNvbnN0IHVpbnQzMl90IHJlZCA9IGFyZ2IgPj4gMTY7CisgICAgaW50IG5ld19yZWQgPSByZWQgJiAweGZmOworICAgIGludCBuZXdfYmx1ZSA9IGFyZ2IgJiAweGZmOworICAgIG5ld19yZWQgKz0gQ29sb3JUcmFuc2Zvcm1EZWx0YShtLT5ncmVlbl90b19yZWRfLCBncmVlbik7CisgICAgbmV3X3JlZCAmPSAweGZmOworICAgIG5ld19ibHVlICs9IENvbG9yVHJhbnNmb3JtRGVsdGEobS0+Z3JlZW5fdG9fYmx1ZV8sIGdyZWVuKTsKKyAgICBuZXdfYmx1ZSArPSBDb2xvclRyYW5zZm9ybURlbHRhKG0tPnJlZF90b19ibHVlXywgbmV3X3JlZCk7CisgICAgbmV3X2JsdWUgJj0gMHhmZjsKKyAgICBkc3RbaV0gPSAoYXJnYiAmIDB4ZmYwMGZmMDB1KSB8IChuZXdfcmVkIDw8IDE2KSB8IChuZXdfYmx1ZSk7CisgIH0KK30KKworLy8gQ29sb3Igc3BhY2UgaW52ZXJzZSB0cmFuc2Zvcm0uCitzdGF0aWMgdm9pZCBDb2xvclNwYWNlSW52ZXJzZVRyYW5zZm9ybV9DKGNvbnN0IFZQOExUcmFuc2Zvcm0qIGNvbnN0IHRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfc3RhcnQsIGludCB5X2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIHNyYywgdWludDMyX3QqIGRzdCkgeworICBjb25zdCBpbnQgd2lkdGggPSB0cmFuc2Zvcm0tPnhzaXplXzsKKyAgY29uc3QgaW50IHRpbGVfd2lkdGggPSAxIDw8IHRyYW5zZm9ybS0+Yml0c187CisgIGNvbnN0IGludCBtYXNrID0gdGlsZV93aWR0aCAtIDE7CisgIGNvbnN0IGludCBzYWZlX3dpZHRoID0gd2lkdGggJiB+bWFzazsKKyAgY29uc3QgaW50IHJlbWFpbmluZ193aWR0aCA9IHdpZHRoIC0gc2FmZV93aWR0aDsKKyAgY29uc3QgaW50IHRpbGVzX3Blcl9yb3cgPSBWUDhMU3ViU2FtcGxlU2l6ZSh3aWR0aCwgdHJhbnNmb3JtLT5iaXRzXyk7CisgIGludCB5ID0geV9zdGFydDsKKyAgY29uc3QgdWludDMyX3QqIHByZWRfcm93ID0KKyAgICAgIHRyYW5zZm9ybS0+ZGF0YV8gKyAoeSA+PiB0cmFuc2Zvcm0tPmJpdHNfKSAqIHRpbGVzX3Blcl9yb3c7CisKKyAgd2hpbGUgKHkgPCB5X2VuZCkgeworICAgIGNvbnN0IHVpbnQzMl90KiBwcmVkID0gcHJlZF9yb3c7CisgICAgVlA4TE11bHRpcGxpZXJzIG0gPSB7IDAsIDAsIDAgfTsKKyAgICBjb25zdCB1aW50MzJfdCogY29uc3Qgc3JjX3NhZmVfZW5kID0gc3JjICsgc2FmZV93aWR0aDsKKyAgICBjb25zdCB1aW50MzJfdCogY29uc3Qgc3JjX2VuZCA9IHNyYyArIHdpZHRoOworICAgIHdoaWxlIChzcmMgPCBzcmNfc2FmZV9lbmQpIHsKKyAgICAgIENvbG9yQ29kZVRvTXVsdGlwbGllcnMoKnByZWQrKywgJm0pOworICAgICAgVlA4TFRyYW5zZm9ybUNvbG9ySW52ZXJzZSgmbSwgc3JjLCB0aWxlX3dpZHRoLCBkc3QpOworICAgICAgc3JjICs9IHRpbGVfd2lkdGg7CisgICAgICBkc3QgKz0gdGlsZV93aWR0aDsKKyAgICB9CisgICAgaWYgKHNyYyA8IHNyY19lbmQpIHsgIC8vIExlZnQtb3ZlcnMgdXNpbmcgQy12ZXJzaW9uLgorICAgICAgQ29sb3JDb2RlVG9NdWx0aXBsaWVycygqcHJlZCsrLCAmbSk7CisgICAgICBWUDhMVHJhbnNmb3JtQ29sb3JJbnZlcnNlKCZtLCBzcmMsIHJlbWFpbmluZ193aWR0aCwgZHN0KTsKKyAgICAgIHNyYyArPSByZW1haW5pbmdfd2lkdGg7CisgICAgICBkc3QgKz0gcmVtYWluaW5nX3dpZHRoOworICAgIH0KKyAgICArK3k7CisgICAgaWYgKCh5ICYgbWFzaykgPT0gMCkgcHJlZF9yb3cgKz0gdGlsZXNfcGVyX3JvdzsKKyAgfQorfQorCisvLyBTZXBhcmF0ZSBvdXQgcGl4ZWxzIHBhY2tlZCB0b2dldGhlciB1c2luZyBwaXhlbC1idW5kbGluZy4KKy8vIFdlIGRlZmluZSB0d28gbWV0aG9kcyBmb3IgQVJHQiBkYXRhICh1aW50MzJfdCkgYW5kIGFscGhhLW9ubHkgZGF0YSAodWludDhfdCkuCisjZGVmaW5lIENPTE9SX0lOREVYX0lOVkVSU0UoRlVOQ19OQU1FLCBGX05BTUUsIFNUQVRJQ19ERUNMLCBUWVBFLCBCSVRfU1VGRklYLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9JTkRFWCwgR0VUX1ZBTFVFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIEZfTkFNRShjb25zdCBUWVBFKiBzcmMsIGNvbnN0IHVpbnQzMl90KiBjb25zdCBjb2xvcl9tYXAsICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgVFlQRSogZHN0LCBpbnQgeV9zdGFydCwgaW50IHlfZW5kLCBpbnQgd2lkdGgpIHsgICAgICAgICAgICAgXAorICBpbnQgeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yICh5ID0geV9zdGFydDsgeSA8IHlfZW5kOyArK3kpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICpkc3QrKyA9IEdFVF9WQUxVRShjb2xvcl9tYXBbR0VUX0lOREVYKCpzcmMrKyldKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitTVEFUSUNfREVDTCB2b2lkIEZVTkNfTkFNRShjb25zdCBWUDhMVHJhbnNmb3JtKiBjb25zdCB0cmFuc2Zvcm0sICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfc3RhcnQsIGludCB5X2VuZCwgY29uc3QgVFlQRSogc3JjLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEUqIGRzdCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludCB5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBpbnQgYml0c19wZXJfcGl4ZWwgPSA4ID4+IHRyYW5zZm9ybS0+Yml0c187ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgaW50IHdpZHRoID0gdHJhbnNmb3JtLT54c2l6ZV87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBjb2xvcl9tYXAgPSB0cmFuc2Zvcm0tPmRhdGFfOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoYml0c19wZXJfcGl4ZWwgPCA4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgcGl4ZWxzX3Blcl9ieXRlID0gMSA8PCB0cmFuc2Zvcm0tPmJpdHNfOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IGNvdW50X21hc2sgPSBwaXhlbHNfcGVyX2J5dGUgLSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVpbnQzMl90IGJpdF9tYXNrID0gKDEgPDwgYml0c19wZXJfcGl4ZWwpIC0gMTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKHkgPSB5X3N0YXJ0OyB5IDwgeV9lbmQ7ICsreSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB1aW50MzJfdCBwYWNrZWRfcGl4ZWxzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaW50IHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIC8qIFdlIG5lZWQgdG8gbG9hZCBmcmVzaCAncGFja2VkX3BpeGVscycgb25jZSBldmVyeSAgICAgICAgICAgICAgICAqLyAgXAorICAgICAgICAvKiAncGl4ZWxzX3Blcl9ieXRlJyBpbmNyZW1lbnRzIG9mIHguIEZvcnR1bmF0ZWx5LCBwaXhlbHNfcGVyX2J5dGUgKi8gIFwKKyAgICAgICAgLyogaXMgYSBwb3dlciBvZiAyLCBzbyBjYW4ganVzdCB1c2UgYSBtYXNrIGZvciB0aGF0LCBpbnN0ZWFkIG9mICAgICovICBcCisgICAgICAgIC8qIGRlY3JlbWVudGluZyBhIGNvdW50ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgXAorICAgICAgICBpZiAoKHggJiBjb3VudF9tYXNrKSA9PSAwKSBwYWNrZWRfcGl4ZWxzID0gR0VUX0lOREVYKCpzcmMrKyk7ICAgICAgICAgIFwKKyAgICAgICAgKmRzdCsrID0gR0VUX1ZBTFVFKGNvbG9yX21hcFtwYWNrZWRfcGl4ZWxzICYgYml0X21hc2tdKTsgICAgICAgICAgICAgICBcCisgICAgICAgIHBhY2tlZF9waXhlbHMgPj49IGJpdHNfcGVyX3BpeGVsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFZQOExNYXBDb2xvciMjQklUX1NVRkZJWChzcmMsIGNvbG9yX21hcCwgZHN0LCB5X3N0YXJ0LCB5X2VuZCwgd2lkdGgpOyAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK0NPTE9SX0lOREVYX0lOVkVSU0UoQ29sb3JJbmRleEludmVyc2VUcmFuc2Zvcm1fQywgTWFwQVJHQl9DLCBzdGF0aWMsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90LCAzMmIsIFZQOEdldEFSR0JJbmRleCwgVlA4R2V0QVJHQlZhbHVlKQorQ09MT1JfSU5ERVhfSU5WRVJTRShWUDhMQ29sb3JJbmRleEludmVyc2VUcmFuc2Zvcm1BbHBoYSwgTWFwQWxwaGFfQywgLAorICAgICAgICAgICAgICAgICAgICB1aW50OF90LCA4YiwgVlA4R2V0QWxwaGFJbmRleCwgVlA4R2V0QWxwaGFWYWx1ZSkKKworI3VuZGVmIENPTE9SX0lOREVYX0lOVkVSU0UKKwordm9pZCBWUDhMSW52ZXJzZVRyYW5zZm9ybShjb25zdCBWUDhMVHJhbnNmb3JtKiBjb25zdCB0cmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3dfc3RhcnQsIGludCByb3dfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgaW4sIHVpbnQzMl90KiBjb25zdCBvdXQpIHsKKyAgY29uc3QgaW50IHdpZHRoID0gdHJhbnNmb3JtLT54c2l6ZV87CisgIGFzc2VydChyb3dfc3RhcnQgPCByb3dfZW5kKTsKKyAgYXNzZXJ0KHJvd19lbmQgPD0gdHJhbnNmb3JtLT55c2l6ZV8pOworICBzd2l0Y2ggKHRyYW5zZm9ybS0+dHlwZV8pIHsKKyAgICBjYXNlIFNVQlRSQUNUX0dSRUVOOgorICAgICAgVlA4TEFkZEdyZWVuVG9CbHVlQW5kUmVkKGluLCAocm93X2VuZCAtIHJvd19zdGFydCkgKiB3aWR0aCwgb3V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJFRElDVE9SX1RSQU5TRk9STToKKyAgICAgIFByZWRpY3RvckludmVyc2VUcmFuc2Zvcm1fQyh0cmFuc2Zvcm0sIHJvd19zdGFydCwgcm93X2VuZCwgaW4sIG91dCk7CisgICAgICBpZiAocm93X2VuZCAhPSB0cmFuc2Zvcm0tPnlzaXplXykgeworICAgICAgICAvLyBUaGUgbGFzdCBwcmVkaWN0ZWQgcm93IGluIHRoaXMgaXRlcmF0aW9uIHdpbGwgYmUgdGhlIHRvcC1wcmVkIHJvdworICAgICAgICAvLyBmb3IgdGhlIGZpcnN0IHJvdyBpbiBuZXh0IGl0ZXJhdGlvbi4KKyAgICAgICAgbWVtY3B5KG91dCAtIHdpZHRoLCBvdXQgKyAocm93X2VuZCAtIHJvd19zdGFydCAtIDEpICogd2lkdGgsCisgICAgICAgICAgICAgICB3aWR0aCAqIHNpemVvZigqb3V0KSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIENST1NTX0NPTE9SX1RSQU5TRk9STToKKyAgICAgIENvbG9yU3BhY2VJbnZlcnNlVHJhbnNmb3JtX0ModHJhbnNmb3JtLCByb3dfc3RhcnQsIHJvd19lbmQsIGluLCBvdXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDT0xPUl9JTkRFWElOR19UUkFOU0ZPUk06CisgICAgICBpZiAoaW4gPT0gb3V0ICYmIHRyYW5zZm9ybS0+Yml0c18gPiAwKSB7CisgICAgICAgIC8vIE1vdmUgcGFja2VkIHBpeGVscyB0byB0aGUgZW5kIG9mIHVucGFja2VkIHJlZ2lvbiwgc28gdGhhdCB1bnBhY2tpbmcKKyAgICAgICAgLy8gY2FuIG9jY3VyIHNlYW1sZXNzbHkuCisgICAgICAgIC8vIEFsc28sIG5vdGUgdGhhdCB0aGlzIGlzIHRoZSBvbmx5IHRyYW5zZm9ybSB0aGF0IGFwcGxpZXMgb24KKyAgICAgICAgLy8gdGhlIGVmZmVjdGl2ZSB3aWR0aCBvZiBWUDhMU3ViU2FtcGxlU2l6ZSh4c2l6ZV8sIGJpdHNfKS4gQWxsIG90aGVyCisgICAgICAgIC8vIHRyYW5zZm9ybXMgd29yayBvbiBlZmZlY3RpdmUgd2lkdGggb2YgeHNpemVfLgorICAgICAgICBjb25zdCBpbnQgb3V0X3N0cmlkZSA9IChyb3dfZW5kIC0gcm93X3N0YXJ0KSAqIHdpZHRoOworICAgICAgICBjb25zdCBpbnQgaW5fc3RyaWRlID0gKHJvd19lbmQgLSByb3dfc3RhcnQpICoKKyAgICAgICAgICAgIFZQOExTdWJTYW1wbGVTaXplKHRyYW5zZm9ybS0+eHNpemVfLCB0cmFuc2Zvcm0tPmJpdHNfKTsKKyAgICAgICAgdWludDMyX3QqIGNvbnN0IHNyYyA9IG91dCArIG91dF9zdHJpZGUgLSBpbl9zdHJpZGU7CisgICAgICAgIG1lbW1vdmUoc3JjLCBvdXQsIGluX3N0cmlkZSAqIHNpemVvZigqc3JjKSk7CisgICAgICAgIENvbG9ySW5kZXhJbnZlcnNlVHJhbnNmb3JtX0ModHJhbnNmb3JtLCByb3dfc3RhcnQsIHJvd19lbmQsIHNyYywgb3V0KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIENvbG9ySW5kZXhJbnZlcnNlVHJhbnNmb3JtX0ModHJhbnNmb3JtLCByb3dfc3RhcnQsIHJvd19lbmQsIGluLCBvdXQpOworICAgICAgfQorICAgICAgYnJlYWs7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvbG9yIHNwYWNlIGNvbnZlcnNpb24uCisKK3N0YXRpYyBpbnQgaXNfYmlnX2VuZGlhbih2b2lkKSB7CisgIHN0YXRpYyBjb25zdCB1bmlvbiB7CisgICAgdWludDE2X3QgdzsKKyAgICB1aW50OF90IGJbMl07CisgIH0gdG1wID0geyAxIH07CisgIHJldHVybiAodG1wLmJbMF0gIT0gMSk7Cit9CisKK3ZvaWQgVlA4TENvbnZlcnRCR1JBVG9SR0JfQyhjb25zdCB1aW50MzJfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50OF90KiBkc3QpIHsKKyAgY29uc3QgdWludDMyX3QqIGNvbnN0IHNyY19lbmQgPSBzcmMgKyBudW1fcGl4ZWxzOworICB3aGlsZSAoc3JjIDwgc3JjX2VuZCkgeworICAgIGNvbnN0IHVpbnQzMl90IGFyZ2IgPSAqc3JjKys7CisgICAgKmRzdCsrID0gKGFyZ2IgPj4gMTYpICYgMHhmZjsKKyAgICAqZHN0KysgPSAoYXJnYiA+PiAgOCkgJiAweGZmOworICAgICpkc3QrKyA9IChhcmdiID4+ICAwKSAmIDB4ZmY7CisgIH0KK30KKwordm9pZCBWUDhMQ29udmVydEJHUkFUb1JHQkFfQyhjb25zdCB1aW50MzJfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDhfdCogZHN0KSB7CisgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBzcmNfZW5kID0gc3JjICsgbnVtX3BpeGVsczsKKyAgd2hpbGUgKHNyYyA8IHNyY19lbmQpIHsKKyAgICBjb25zdCB1aW50MzJfdCBhcmdiID0gKnNyYysrOworICAgICpkc3QrKyA9IChhcmdiID4+IDE2KSAmIDB4ZmY7CisgICAgKmRzdCsrID0gKGFyZ2IgPj4gIDgpICYgMHhmZjsKKyAgICAqZHN0KysgPSAoYXJnYiA+PiAgMCkgJiAweGZmOworICAgICpkc3QrKyA9IChhcmdiID4+IDI0KSAmIDB4ZmY7CisgIH0KK30KKwordm9pZCBWUDhMQ29udmVydEJHUkFUb1JHQkE0NDQ0X0MoY29uc3QgdWludDMyX3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50OF90KiBkc3QpIHsKKyAgY29uc3QgdWludDMyX3QqIGNvbnN0IHNyY19lbmQgPSBzcmMgKyBudW1fcGl4ZWxzOworICB3aGlsZSAoc3JjIDwgc3JjX2VuZCkgeworICAgIGNvbnN0IHVpbnQzMl90IGFyZ2IgPSAqc3JjKys7CisgICAgY29uc3QgdWludDhfdCByZyA9ICgoYXJnYiA+PiAxNikgJiAweGYwKSB8ICgoYXJnYiA+PiAxMikgJiAweGYpOworICAgIGNvbnN0IHVpbnQ4X3QgYmEgPSAoKGFyZ2IgPj4gIDApICYgMHhmMCkgfCAoKGFyZ2IgPj4gMjgpICYgMHhmKTsKKyNpZiAoV0VCUF9TV0FQXzE2QklUX0NTUCA9PSAxKQorICAgICpkc3QrKyA9IGJhOworICAgICpkc3QrKyA9IHJnOworI2Vsc2UKKyAgICAqZHN0KysgPSByZzsKKyAgICAqZHN0KysgPSBiYTsKKyNlbmRpZgorICB9Cit9CisKK3ZvaWQgVlA4TENvbnZlcnRCR1JBVG9SR0I1NjVfQyhjb25zdCB1aW50MzJfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50OF90KiBkc3QpIHsKKyAgY29uc3QgdWludDMyX3QqIGNvbnN0IHNyY19lbmQgPSBzcmMgKyBudW1fcGl4ZWxzOworICB3aGlsZSAoc3JjIDwgc3JjX2VuZCkgeworICAgIGNvbnN0IHVpbnQzMl90IGFyZ2IgPSAqc3JjKys7CisgICAgY29uc3QgdWludDhfdCByZyA9ICgoYXJnYiA+PiAxNikgJiAweGY4KSB8ICgoYXJnYiA+PiAxMykgJiAweDcpOworICAgIGNvbnN0IHVpbnQ4X3QgZ2IgPSAoKGFyZ2IgPj4gIDUpICYgMHhlMCkgfCAoKGFyZ2IgPj4gIDMpICYgMHgxZik7CisjaWYgKFdFQlBfU1dBUF8xNkJJVF9DU1AgPT0gMSkKKyAgICAqZHN0KysgPSBnYjsKKyAgICAqZHN0KysgPSByZzsKKyNlbHNlCisgICAgKmRzdCsrID0gcmc7CisgICAgKmRzdCsrID0gZ2I7CisjZW5kaWYKKyAgfQorfQorCit2b2lkIFZQOExDb252ZXJ0QkdSQVRvQkdSX0MoY29uc3QgdWludDMyX3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDhfdCogZHN0KSB7CisgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBzcmNfZW5kID0gc3JjICsgbnVtX3BpeGVsczsKKyAgd2hpbGUgKHNyYyA8IHNyY19lbmQpIHsKKyAgICBjb25zdCB1aW50MzJfdCBhcmdiID0gKnNyYysrOworICAgICpkc3QrKyA9IChhcmdiID4+ICAwKSAmIDB4ZmY7CisgICAgKmRzdCsrID0gKGFyZ2IgPj4gIDgpICYgMHhmZjsKKyAgICAqZHN0KysgPSAoYXJnYiA+PiAxNikgJiAweGZmOworICB9Cit9CisKK3N0YXRpYyB2b2lkIENvcHlPclN3YXAoY29uc3QgdWludDMyX3QqIHNyYywgaW50IG51bV9waXhlbHMsIHVpbnQ4X3QqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHN3YXBfb25fYmlnX2VuZGlhbikgeworICBpZiAoaXNfYmlnX2VuZGlhbigpID09IHN3YXBfb25fYmlnX2VuZGlhbikgeworICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBzcmNfZW5kID0gc3JjICsgbnVtX3BpeGVsczsKKyAgICB3aGlsZSAoc3JjIDwgc3JjX2VuZCkgeworICAgICAgY29uc3QgdWludDMyX3QgYXJnYiA9ICpzcmMrKzsKKyAgICAgIFdlYlBVaW50MzJUb01lbShkc3QsIEJTd2FwMzIoYXJnYikpOworICAgICAgZHN0ICs9IHNpemVvZihhcmdiKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgbWVtY3B5KGRzdCwgc3JjLCBudW1fcGl4ZWxzICogc2l6ZW9mKCpzcmMpKTsKKyAgfQorfQorCit2b2lkIFZQOExDb252ZXJ0RnJvbUJHUkEoY29uc3QgdWludDMyX3QqIGNvbnN0IGluX2RhdGEsIGludCBudW1fcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFdFQlBfQ1NQX01PREUgb3V0X2NvbG9yc3BhY2UsIHVpbnQ4X3QqIGNvbnN0IHJnYmEpIHsKKyAgc3dpdGNoIChvdXRfY29sb3JzcGFjZSkgeworICAgIGNhc2UgTU9ERV9SR0I6CisgICAgICBWUDhMQ29udmVydEJHUkFUb1JHQihpbl9kYXRhLCBudW1fcGl4ZWxzLCByZ2JhKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTU9ERV9SR0JBOgorICAgICAgVlA4TENvbnZlcnRCR1JBVG9SR0JBKGluX2RhdGEsIG51bV9waXhlbHMsIHJnYmEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNT0RFX3JnYkE6CisgICAgICBWUDhMQ29udmVydEJHUkFUb1JHQkEoaW5fZGF0YSwgbnVtX3BpeGVscywgcmdiYSk7CisgICAgICBXZWJQQXBwbHlBbHBoYU11bHRpcGx5KHJnYmEsIDAsIG51bV9waXhlbHMsIDEsIDApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNT0RFX0JHUjoKKyAgICAgIFZQOExDb252ZXJ0QkdSQVRvQkdSKGluX2RhdGEsIG51bV9waXhlbHMsIHJnYmEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNT0RFX0JHUkE6CisgICAgICBDb3B5T3JTd2FwKGluX2RhdGEsIG51bV9waXhlbHMsIHJnYmEsIDEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNT0RFX2JnckE6CisgICAgICBDb3B5T3JTd2FwKGluX2RhdGEsIG51bV9waXhlbHMsIHJnYmEsIDEpOworICAgICAgV2ViUEFwcGx5QWxwaGFNdWx0aXBseShyZ2JhLCAwLCBudW1fcGl4ZWxzLCAxLCAwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTU9ERV9BUkdCOgorICAgICAgQ29weU9yU3dhcChpbl9kYXRhLCBudW1fcGl4ZWxzLCByZ2JhLCAwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTU9ERV9BcmdiOgorICAgICAgQ29weU9yU3dhcChpbl9kYXRhLCBudW1fcGl4ZWxzLCByZ2JhLCAwKTsKKyAgICAgIFdlYlBBcHBseUFscGhhTXVsdGlwbHkocmdiYSwgMSwgbnVtX3BpeGVscywgMSwgMCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE1PREVfUkdCQV80NDQ0OgorICAgICAgVlA4TENvbnZlcnRCR1JBVG9SR0JBNDQ0NChpbl9kYXRhLCBudW1fcGl4ZWxzLCByZ2JhKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTU9ERV9yZ2JBXzQ0NDQ6CisgICAgICBWUDhMQ29udmVydEJHUkFUb1JHQkE0NDQ0KGluX2RhdGEsIG51bV9waXhlbHMsIHJnYmEpOworICAgICAgV2ViUEFwcGx5QWxwaGFNdWx0aXBseTQ0NDQocmdiYSwgbnVtX3BpeGVscywgMSwgMCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE1PREVfUkdCXzU2NToKKyAgICAgIFZQOExDb252ZXJ0QkdSQVRvUkdCNTY1KGluX2RhdGEsIG51bV9waXhlbHMsIHJnYmEpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGFzc2VydCgwKTsgICAgICAgICAgLy8gQ29kZSBmbG93IHNob3VsZCBub3QgcmVhY2ggaGVyZS4KKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitWUDhMUHJvY2Vzc0RlY0JsdWVBbmRSZWRGdW5jIFZQOExBZGRHcmVlblRvQmx1ZUFuZFJlZDsKK1ZQOExQcmVkaWN0b3JBZGRTdWJGdW5jIFZQOExQcmVkaWN0b3JzQWRkWzE2XTsKK1ZQOExQcmVkaWN0b3JGdW5jIFZQOExQcmVkaWN0b3JzWzE2XTsKKworLy8gZXhwb3NlZCBwbGFpbi1DIGltcGxlbWVudGF0aW9ucworVlA4TFByZWRpY3RvckFkZFN1YkZ1bmMgVlA4TFByZWRpY3RvcnNBZGRfQ1sxNl07CitWUDhMUHJlZGljdG9yRnVuYyBWUDhMUHJlZGljdG9yc19DWzE2XTsKKworVlA4TFRyYW5zZm9ybUNvbG9ySW52ZXJzZUZ1bmMgVlA4TFRyYW5zZm9ybUNvbG9ySW52ZXJzZTsKKworVlA4TENvbnZlcnRGdW5jIFZQOExDb252ZXJ0QkdSQVRvUkdCOworVlA4TENvbnZlcnRGdW5jIFZQOExDb252ZXJ0QkdSQVRvUkdCQTsKK1ZQOExDb252ZXJ0RnVuYyBWUDhMQ29udmVydEJHUkFUb1JHQkE0NDQ0OworVlA4TENvbnZlcnRGdW5jIFZQOExDb252ZXJ0QkdSQVRvUkdCNTY1OworVlA4TENvbnZlcnRGdW5jIFZQOExDb252ZXJ0QkdSQVRvQkdSOworCitWUDhMTWFwQVJHQkZ1bmMgVlA4TE1hcENvbG9yMzJiOworVlA4TE1hcEFscGhhRnVuYyBWUDhMTWFwQ29sb3I4YjsKKworZXh0ZXJuIHZvaWQgVlA4TERzcEluaXRTU0UyKHZvaWQpOworZXh0ZXJuIHZvaWQgVlA4TERzcEluaXRORU9OKHZvaWQpOworZXh0ZXJuIHZvaWQgVlA4TERzcEluaXRNSVBTZHNwUjIodm9pZCk7CitleHRlcm4gdm9pZCBWUDhMRHNwSW5pdE1TQSh2b2lkKTsKKworI2RlZmluZSBDT1BZX1BSRURJQ1RPUl9BUlJBWShJTiwgT1VUKSBkbyB7ICAgICAgICAgICAgICAgIFwKKyAgKE9VVClbMF0gPSBJTiMjMF9DOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChPVVQpWzFdID0gSU4jIzFfQzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoT1VUKVsyXSA9IElOIyMyX0M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKE9VVClbM10gPSBJTiMjM19DOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChPVVQpWzRdID0gSU4jIzRfQzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoT1VUKVs1XSA9IElOIyM1X0M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKE9VVClbNl0gPSBJTiMjNl9DOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChPVVQpWzddID0gSU4jIzdfQzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoT1VUKVs4XSA9IElOIyM4X0M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKE9VVClbOV0gPSBJTiMjOV9DOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChPVVQpWzEwXSA9IElOIyMxMF9DOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoT1VUKVsxMV0gPSBJTiMjMTFfQzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKE9VVClbMTJdID0gSU4jIzEyX0M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChPVVQpWzEzXSA9IElOIyMxM19DOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoT1VUKVsxNF0gPSBJTiMjMF9DOyAvKiA8LSBwYWRkaW5nIHNlY3VyaXR5IHNlbnRpbmVscyovIFwKKyAgKE9VVClbMTVdID0gSU4jIzBfQzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKTsKKworV0VCUF9EU1BfSU5JVF9GVU5DKFZQOExEc3BJbml0KSB7CisgIENPUFlfUFJFRElDVE9SX0FSUkFZKFByZWRpY3RvciwgVlA4TFByZWRpY3RvcnMpCisgIENPUFlfUFJFRElDVE9SX0FSUkFZKFByZWRpY3RvciwgVlA4TFByZWRpY3RvcnNfQykKKyAgQ09QWV9QUkVESUNUT1JfQVJSQVkoUHJlZGljdG9yQWRkLCBWUDhMUHJlZGljdG9yc0FkZCkKKyAgQ09QWV9QUkVESUNUT1JfQVJSQVkoUHJlZGljdG9yQWRkLCBWUDhMUHJlZGljdG9yc0FkZF9DKQorCisjaWYgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorICBWUDhMQWRkR3JlZW5Ub0JsdWVBbmRSZWQgPSBWUDhMQWRkR3JlZW5Ub0JsdWVBbmRSZWRfQzsKKworICBWUDhMVHJhbnNmb3JtQ29sb3JJbnZlcnNlID0gVlA4TFRyYW5zZm9ybUNvbG9ySW52ZXJzZV9DOworCisgIFZQOExDb252ZXJ0QkdSQVRvUkdCQSA9IFZQOExDb252ZXJ0QkdSQVRvUkdCQV9DOworICBWUDhMQ29udmVydEJHUkFUb1JHQiA9IFZQOExDb252ZXJ0QkdSQVRvUkdCX0M7CisgIFZQOExDb252ZXJ0QkdSQVRvQkdSID0gVlA4TENvbnZlcnRCR1JBVG9CR1JfQzsKKyNlbmRpZgorCisgIFZQOExDb252ZXJ0QkdSQVRvUkdCQTQ0NDQgPSBWUDhMQ29udmVydEJHUkFUb1JHQkE0NDQ0X0M7CisgIFZQOExDb252ZXJ0QkdSQVRvUkdCNTY1ID0gVlA4TENvbnZlcnRCR1JBVG9SR0I1NjVfQzsKKworICBWUDhMTWFwQ29sb3IzMmIgPSBNYXBBUkdCX0M7CisgIFZQOExNYXBDb2xvcjhiID0gTWFwQWxwaGFfQzsKKworICAvLyBJZiBkZWZpbmVkLCB1c2UgQ1BVSW5mbygpIHRvIG92ZXJ3cml0ZSBzb21lIHBvaW50ZXJzIHdpdGggZmFzdGVyIHZlcnNpb25zLgorICBpZiAoVlA4R2V0Q1BVSW5mbyAhPSBOVUxMKSB7CisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0UyKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtTU0UyKSkgeworICAgICAgVlA4TERzcEluaXRTU0UyKCk7CisgICAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTX0RTUF9SMikKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrTUlQU2RzcFIyKSkgeworICAgICAgVlA4TERzcEluaXRNSVBTZHNwUjIoKTsKKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01TQSkKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrTVNBKSkgeworICAgICAgVlA4TERzcEluaXRNU0EoKTsKKyAgICB9CisjZW5kaWYKKyAgfQorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9ORU9OKQorICBpZiAoV0VCUF9ORU9OX09NSVRfQ19DT0RFIHx8CisgICAgICAoVlA4R2V0Q1BVSW5mbyAhPSBOVUxMICYmIFZQOEdldENQVUluZm8oa05FT04pKSkgeworICAgIFZQOExEc3BJbml0TkVPTigpOworICB9CisjZW5kaWYKKworICBhc3NlcnQoVlA4TEFkZEdyZWVuVG9CbHVlQW5kUmVkICE9IE5VTEwpOworICBhc3NlcnQoVlA4TFRyYW5zZm9ybUNvbG9ySW52ZXJzZSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExDb252ZXJ0QkdSQVRvUkdCQSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExDb252ZXJ0QkdSQVRvUkdCICE9IE5VTEwpOworICBhc3NlcnQoVlA4TENvbnZlcnRCR1JBVG9CR1IgIT0gTlVMTCk7CisgIGFzc2VydChWUDhMQ29udmVydEJHUkFUb1JHQkE0NDQ0ICE9IE5VTEwpOworICBhc3NlcnQoVlA4TENvbnZlcnRCR1JBVG9SR0I1NjUgIT0gTlVMTCk7CisgIGFzc2VydChWUDhMTWFwQ29sb3IzMmIgIT0gTlVMTCk7CisgIGFzc2VydChWUDhMTWFwQ29sb3I4YiAhPSBOVUxMKTsKK30KKyN1bmRlZiBDT1BZX1BSRURJQ1RPUl9BUlJBWQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9sb3NzbGVzcy5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9sb3NzbGVzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyYmJkZmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2xvc3NsZXNzLmgKQEAgLTAsMCArMSwyMjUgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBJbWFnZSB0cmFuc2Zvcm1zIGFuZCBjb2xvciBzcGFjZSBjb252ZXJzaW9uIG1ldGhvZHMgZm9yIGxvc3NsZXNzIGRlY29kZXIuCisvLworLy8gQXV0aG9yczogVmlrYXMgQXJvcmEgKHZpa2Fhcy5hcm9yYUBnbWFpbC5jb20pCisvLyAgICAgICAgICBKeXJraSBBbGFrdWlqYWxhIChqeXJraUBnb29nbGUuY29tKQorCisjaWZuZGVmIFdFQlBfRFNQX0xPU1NMRVNTX0hfCisjZGVmaW5lIFdFQlBfRFNQX0xPU1NMRVNTX0hfCisKKyNpbmNsdWRlICJzcmMvd2VicC90eXBlcy5oIgorI2luY2x1ZGUgInNyYy93ZWJwL2RlY29kZS5oIgorCisjaW5jbHVkZSAic3JjL2VuYy9oaXN0b2dyYW1fZW5jLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL3V0aWxzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERlY29kaW5nCisKK3R5cGVkZWYgdWludDMyX3QgKCpWUDhMUHJlZGljdG9yRnVuYykodWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCk7CitleHRlcm4gVlA4TFByZWRpY3RvckZ1bmMgVlA4TFByZWRpY3RvcnNbMTZdOworZXh0ZXJuIFZQOExQcmVkaWN0b3JGdW5jIFZQOExQcmVkaWN0b3JzX0NbMTZdOworLy8gVGhlc2UgQWRkL1N1YiBmdW5jdGlvbiBleHBlY3RzIHVwcGVyWy0xXSBhbmQgb3V0Wy0xXSB0byBiZSByZWFkYWJsZS4KK3R5cGVkZWYgdm9pZCAoKlZQOExQcmVkaWN0b3JBZGRTdWJGdW5jKShjb25zdCB1aW50MzJfdCogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIHVwcGVyLCBpbnQgbnVtX3BpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogb3V0KTsKK2V4dGVybiBWUDhMUHJlZGljdG9yQWRkU3ViRnVuYyBWUDhMUHJlZGljdG9yc0FkZFsxNl07CitleHRlcm4gVlA4TFByZWRpY3RvckFkZFN1YkZ1bmMgVlA4TFByZWRpY3RvcnNBZGRfQ1sxNl07CisKK3R5cGVkZWYgdm9pZCAoKlZQOExQcm9jZXNzRGVjQmx1ZUFuZFJlZEZ1bmMpKGNvbnN0IHVpbnQzMl90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDMyX3QqIGRzdCk7CitleHRlcm4gVlA4TFByb2Nlc3NEZWNCbHVlQW5kUmVkRnVuYyBWUDhMQWRkR3JlZW5Ub0JsdWVBbmRSZWQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgLy8gTm90ZTogdGhlIG1lbWJlcnMgYXJlIHVpbnQ4X3QsIHNvIHRoYXQgYW55IG5lZ2F0aXZlIHZhbHVlcyBhcmUKKyAgLy8gYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gIm1vZCAyNTYiIHZhbHVlcy4KKyAgdWludDhfdCBncmVlbl90b19yZWRfOworICB1aW50OF90IGdyZWVuX3RvX2JsdWVfOworICB1aW50OF90IHJlZF90b19ibHVlXzsKK30gVlA4TE11bHRpcGxpZXJzOwordHlwZWRlZiB2b2lkICgqVlA4TFRyYW5zZm9ybUNvbG9ySW52ZXJzZUZ1bmMpKGNvbnN0IFZQOExNdWx0aXBsaWVycyogY29uc3QgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50MzJfdCogZHN0KTsKK2V4dGVybiBWUDhMVHJhbnNmb3JtQ29sb3JJbnZlcnNlRnVuYyBWUDhMVHJhbnNmb3JtQ29sb3JJbnZlcnNlOworCitzdHJ1Y3QgVlA4TFRyYW5zZm9ybTsgIC8vIERlZmluZWQgaW4gZGVjL3ZwOGxpLmguCisKKy8vIFBlcmZvcm1zIGludmVyc2UgdHJhbnNmb3JtIG9mIGRhdGEgZ2l2ZW4gdHJhbnNmb3JtIGluZm9ybWF0aW9uLCBzdGFydCBhbmQgZW5kCisvLyByb3dzLiBUcmFuc2Zvcm0gd2lsbCBiZSBhcHBsaWVkIHRvIHJvd3MgW3Jvd19zdGFydCwgcm93X2VuZFsuCisvLyBUaGUgKmluIGFuZCAqb3V0IHBvaW50ZXJzIHJlZmVyIHRvIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZGF0YSByZXNwZWN0aXZlbHkKKy8vIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGludGVybWVkaWF0ZSByb3cgKHJvd19zdGFydCkuCit2b2lkIFZQOExJbnZlcnNlVHJhbnNmb3JtKGNvbnN0IHN0cnVjdCBWUDhMVHJhbnNmb3JtKiBjb25zdCB0cmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3dfc3RhcnQsIGludCByb3dfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgaW4sIHVpbnQzMl90KiBjb25zdCBvdXQpOworCisvLyBDb2xvciBzcGFjZSBjb252ZXJzaW9uLgordHlwZWRlZiB2b2lkICgqVlA4TENvbnZlcnRGdW5jKShjb25zdCB1aW50MzJfdCogc3JjLCBpbnQgbnVtX3BpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0KTsKK2V4dGVybiBWUDhMQ29udmVydEZ1bmMgVlA4TENvbnZlcnRCR1JBVG9SR0I7CitleHRlcm4gVlA4TENvbnZlcnRGdW5jIFZQOExDb252ZXJ0QkdSQVRvUkdCQTsKK2V4dGVybiBWUDhMQ29udmVydEZ1bmMgVlA4TENvbnZlcnRCR1JBVG9SR0JBNDQ0NDsKK2V4dGVybiBWUDhMQ29udmVydEZ1bmMgVlA4TENvbnZlcnRCR1JBVG9SR0I1NjU7CitleHRlcm4gVlA4TENvbnZlcnRGdW5jIFZQOExDb252ZXJ0QkdSQVRvQkdSOworCisvLyBDb252ZXJ0cyBmcm9tIEJHUkEgdG8gb3RoZXIgY29sb3Igc3BhY2VzLgordm9pZCBWUDhMQ29udmVydEZyb21CR1JBKGNvbnN0IHVpbnQzMl90KiBjb25zdCBpbl9kYXRhLCBpbnQgbnVtX3BpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICBXRUJQX0NTUF9NT0RFIG91dF9jb2xvcnNwYWNlLCB1aW50OF90KiBjb25zdCByZ2JhKTsKKwordHlwZWRlZiB2b2lkICgqVlA4TE1hcEFSR0JGdW5jKShjb25zdCB1aW50MzJfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgY29sb3JfbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZHN0LCBpbnQgeV9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfZW5kLCBpbnQgd2lkdGgpOwordHlwZWRlZiB2b2lkICgqVlA4TE1hcEFscGhhRnVuYykoY29uc3QgdWludDhfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGNvbG9yX21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IHlfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9lbmQsIGludCB3aWR0aCk7CisKK2V4dGVybiBWUDhMTWFwQVJHQkZ1bmMgVlA4TE1hcENvbG9yMzJiOworZXh0ZXJuIFZQOExNYXBBbHBoYUZ1bmMgVlA4TE1hcENvbG9yOGI7CisKKy8vIFNpbWlsYXIgdG8gdGhlIHN0YXRpYyBtZXRob2QgQ29sb3JJbmRleEludmVyc2VUcmFuc2Zvcm0oKSB0aGF0IGlzIHBhcnQgb2YKKy8vIGxvc3NsZXNzLmMsIGJ1dCB1c2VkIG9ubHkgZm9yIGFscGhhIGRlY29kaW5nLiBJdCB0YWtlcyB1aW50OF90IChyYXRoZXIgdGhhbgorLy8gdWludDMyX3QpIGFyZ3VtZW50cyBmb3IgJ3NyYycgYW5kICdkc3QnLgordm9pZCBWUDhMQ29sb3JJbmRleEludmVyc2VUcmFuc2Zvcm1BbHBoYSgKKyAgICBjb25zdCBzdHJ1Y3QgVlA4TFRyYW5zZm9ybSogY29uc3QgdHJhbnNmb3JtLCBpbnQgeV9zdGFydCwgaW50IHlfZW5kLAorICAgIGNvbnN0IHVpbnQ4X3QqIHNyYywgdWludDhfdCogZHN0KTsKKworLy8gRXhwb3NlIHNvbWUgQy1vbmx5IGZhbGxiYWNrIGZ1bmN0aW9ucwordm9pZCBWUDhMVHJhbnNmb3JtQ29sb3JJbnZlcnNlX0MoY29uc3QgVlA4TE11bHRpcGxpZXJzKiBjb25zdCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIHNyYywgaW50IG51bV9waXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZHN0KTsKKwordm9pZCBWUDhMQ29udmVydEJHUkFUb1JHQl9DKGNvbnN0IHVpbnQzMl90KiBzcmMsIGludCBudW1fcGl4ZWxzLCB1aW50OF90KiBkc3QpOwordm9pZCBWUDhMQ29udmVydEJHUkFUb1JHQkFfQyhjb25zdCB1aW50MzJfdCogc3JjLCBpbnQgbnVtX3BpeGVscywgdWludDhfdCogZHN0KTsKK3ZvaWQgVlA4TENvbnZlcnRCR1JBVG9SR0JBNDQ0NF9DKGNvbnN0IHVpbnQzMl90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDhfdCogZHN0KTsKK3ZvaWQgVlA4TENvbnZlcnRCR1JBVG9SR0I1NjVfQyhjb25zdCB1aW50MzJfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50OF90KiBkc3QpOwordm9pZCBWUDhMQ29udmVydEJHUkFUb0JHUl9DKGNvbnN0IHVpbnQzMl90KiBzcmMsIGludCBudW1fcGl4ZWxzLCB1aW50OF90KiBkc3QpOwordm9pZCBWUDhMQWRkR3JlZW5Ub0JsdWVBbmRSZWRfQyhjb25zdCB1aW50MzJfdCogc3JjLCBpbnQgbnVtX3BpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGRzdCk7CisKKy8vIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIGFueSBvZiB0aGUgYWJvdmUgbWV0aG9kcy4KK3ZvaWQgVlA4TERzcEluaXQodm9pZCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbmNvZGluZworCit0eXBlZGVmIHZvaWQgKCpWUDhMUHJvY2Vzc0VuY0JsdWVBbmRSZWRGdW5jKSh1aW50MzJfdCogZHN0LCBpbnQgbnVtX3BpeGVscyk7CitleHRlcm4gVlA4TFByb2Nlc3NFbmNCbHVlQW5kUmVkRnVuYyBWUDhMU3VidHJhY3RHcmVlbkZyb21CbHVlQW5kUmVkOwordHlwZWRlZiB2b2lkICgqVlA4TFRyYW5zZm9ybUNvbG9yRnVuYykoY29uc3QgVlA4TE11bHRpcGxpZXJzKiBjb25zdCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGRzdCwgaW50IG51bV9waXhlbHMpOworZXh0ZXJuIFZQOExUcmFuc2Zvcm1Db2xvckZ1bmMgVlA4TFRyYW5zZm9ybUNvbG9yOwordHlwZWRlZiB2b2lkICgqVlA4TENvbGxlY3RDb2xvckJsdWVUcmFuc2Zvcm1zRnVuYykoCisgICAgY29uc3QgdWludDMyX3QqIGFyZ2IsIGludCBzdHJpZGUsCisgICAgaW50IHRpbGVfd2lkdGgsIGludCB0aWxlX2hlaWdodCwKKyAgICBpbnQgZ3JlZW5fdG9fYmx1ZSwgaW50IHJlZF90b19ibHVlLCBpbnQgaGlzdG9bXSk7CitleHRlcm4gVlA4TENvbGxlY3RDb2xvckJsdWVUcmFuc2Zvcm1zRnVuYyBWUDhMQ29sbGVjdENvbG9yQmx1ZVRyYW5zZm9ybXM7CisKK3R5cGVkZWYgdm9pZCAoKlZQOExDb2xsZWN0Q29sb3JSZWRUcmFuc2Zvcm1zRnVuYykoCisgICAgY29uc3QgdWludDMyX3QqIGFyZ2IsIGludCBzdHJpZGUsCisgICAgaW50IHRpbGVfd2lkdGgsIGludCB0aWxlX2hlaWdodCwKKyAgICBpbnQgZ3JlZW5fdG9fcmVkLCBpbnQgaGlzdG9bXSk7CitleHRlcm4gVlA4TENvbGxlY3RDb2xvclJlZFRyYW5zZm9ybXNGdW5jIFZQOExDb2xsZWN0Q29sb3JSZWRUcmFuc2Zvcm1zOworCisvLyBFeHBvc2Ugc29tZSBDLW9ubHkgZmFsbGJhY2sgZnVuY3Rpb25zCit2b2lkIFZQOExUcmFuc2Zvcm1Db2xvcl9DKGNvbnN0IFZQOExNdWx0aXBsaWVycyogY29uc3QgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGRhdGEsIGludCBudW1fcGl4ZWxzKTsKK3ZvaWQgVlA4TFN1YnRyYWN0R3JlZW5Gcm9tQmx1ZUFuZFJlZF9DKHVpbnQzMl90KiBhcmdiX2RhdGEsIGludCBudW1fcGl4ZWxzKTsKK3ZvaWQgVlA4TENvbGxlY3RDb2xvclJlZFRyYW5zZm9ybXNfQyhjb25zdCB1aW50MzJfdCogYXJnYiwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGlsZV93aWR0aCwgaW50IHRpbGVfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBncmVlbl90b19yZWQsIGludCBoaXN0b1tdKTsKK3ZvaWQgVlA4TENvbGxlY3RDb2xvckJsdWVUcmFuc2Zvcm1zX0MoY29uc3QgdWludDMyX3QqIGFyZ2IsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aWxlX3dpZHRoLCBpbnQgdGlsZV9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBncmVlbl90b19ibHVlLCBpbnQgcmVkX3RvX2JsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoaXN0b1tdKTsKKworZXh0ZXJuIFZQOExQcmVkaWN0b3JBZGRTdWJGdW5jIFZQOExQcmVkaWN0b3JzU3ViWzE2XTsKK2V4dGVybiBWUDhMUHJlZGljdG9yQWRkU3ViRnVuYyBWUDhMUHJlZGljdG9yc1N1Yl9DWzE2XTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEh1ZmZtYW4tY29zdCByZWxhdGVkIGZ1bmN0aW9ucy4KKwordHlwZWRlZiBkb3VibGUgKCpWUDhMQ29zdEZ1bmMpKGNvbnN0IHVpbnQzMl90KiBwb3B1bGF0aW9uLCBpbnQgbGVuZ3RoKTsKK3R5cGVkZWYgZG91YmxlICgqVlA4TENvc3RDb21iaW5lZEZ1bmMpKGNvbnN0IHVpbnQzMl90KiBYLCBjb25zdCB1aW50MzJfdCogWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgpOwordHlwZWRlZiBmbG9hdCAoKlZQOExDb21iaW5lZFNoYW5ub25FbnRyb3B5RnVuYykoY29uc3QgaW50IFhbMjU2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBZWzI1Nl0pOworCitleHRlcm4gVlA4TENvc3RGdW5jIFZQOExFeHRyYUNvc3Q7CitleHRlcm4gVlA4TENvc3RDb21iaW5lZEZ1bmMgVlA4TEV4dHJhQ29zdENvbWJpbmVkOworZXh0ZXJuIFZQOExDb21iaW5lZFNoYW5ub25FbnRyb3B5RnVuYyBWUDhMQ29tYmluZWRTaGFubm9uRW50cm9weTsKKwordHlwZWRlZiBzdHJ1Y3QgeyAgICAgICAgLy8gc21hbGwgc3RydWN0IHRvIGhvbGQgY291bnRlcnMKKyAgaW50IGNvdW50c1syXTsgICAgICAgIC8vIGluZGV4OiAwPXplcm8gc3RlYWssIDE9bm9uLXplcm8gc3RyZWFrCisgIGludCBzdHJlYWtzWzJdWzJdOyAgICAvLyBbemVyby9ub24temVyb11bc3RyZWFrPDMgLyBzdHJlYWs+PTNdCit9IFZQOExTdHJlYWtzOworCit0eXBlZGVmIHN0cnVjdCB7ICAgICAgICAgICAgLy8gc21hbGwgc3RydWN0IHRvIGhvbGQgYml0IGVudHJvcHkgcmVzdWx0cworICBkb3VibGUgZW50cm9weTsgICAgICAgICAgIC8vIGVudHJvcHkKKyAgdWludDMyX3Qgc3VtOyAgICAgICAgICAgICAvLyBzdW0gb2YgdGhlIHBvcHVsYXRpb24KKyAgaW50IG5vbnplcm9zOyAgICAgICAgICAgICAvLyBudW1iZXIgb2Ygbm9uLXplcm8gZWxlbWVudHMgaW4gdGhlIHBvcHVsYXRpb24KKyAgdWludDMyX3QgbWF4X3ZhbDsgICAgICAgICAvLyBtYXhpbXVtIHZhbHVlIGluIHRoZSBwb3B1bGF0aW9uCisgIHVpbnQzMl90IG5vbnplcm9fY29kZTsgICAgLy8gaW5kZXggb2YgdGhlIGxhc3Qgbm9uLXplcm8gaW4gdGhlIHBvcHVsYXRpb24KK30gVlA4TEJpdEVudHJvcHk7CisKK3ZvaWQgVlA4TEJpdEVudHJvcHlJbml0KFZQOExCaXRFbnRyb3B5KiBjb25zdCBlbnRyb3B5KTsKKworLy8gR2V0IHRoZSBjb21iaW5lZCBzeW1ib2wgYml0IGVudHJvcHkgYW5kIEh1ZmZtYW4gY29zdCBzdGF0cyBmb3IgdGhlCisvLyBkaXN0cmlidXRpb25zICdYJyBhbmQgJ1knLiBUaG9zZSByZXN1bHRzIGNhbiB0aGVuIGJlIHJlZmluZWQgYWNjb3JkaW5nIHRvCisvLyBjb2RlYyBzcGVjaWZpYyBoZXVyaXN0aWNzLgordHlwZWRlZiB2b2lkICgqVlA4TEdldENvbWJpbmVkRW50cm9weVVucmVmaW5lZEZ1bmMpKAorICAgIGNvbnN0IHVpbnQzMl90IFhbXSwgY29uc3QgdWludDMyX3QgWVtdLCBpbnQgbGVuZ3RoLAorICAgIFZQOExCaXRFbnRyb3B5KiBjb25zdCBiaXRfZW50cm9weSwgVlA4TFN0cmVha3MqIGNvbnN0IHN0YXRzKTsKK2V4dGVybiBWUDhMR2V0Q29tYmluZWRFbnRyb3B5VW5yZWZpbmVkRnVuYyBWUDhMR2V0Q29tYmluZWRFbnRyb3B5VW5yZWZpbmVkOworCisvLyBHZXQgdGhlIGVudHJvcHkgZm9yIHRoZSBkaXN0cmlidXRpb24gJ1gnLgordHlwZWRlZiB2b2lkICgqVlA4TEdldEVudHJvcHlVbnJlZmluZWRGdW5jKShjb25zdCB1aW50MzJfdCBYW10sIGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCaXRFbnRyb3B5KiBjb25zdCBiaXRfZW50cm9weSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TFN0cmVha3MqIGNvbnN0IHN0YXRzKTsKK2V4dGVybiBWUDhMR2V0RW50cm9weVVucmVmaW5lZEZ1bmMgVlA4TEdldEVudHJvcHlVbnJlZmluZWQ7CisKK3ZvaWQgVlA4TEJpdHNFbnRyb3B5VW5yZWZpbmVkKGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcnJheSwgaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQml0RW50cm9weSogY29uc3QgZW50cm9weSk7CisKK3R5cGVkZWYgdm9pZCAoKlZQOExIaXN0b2dyYW1BZGRGdW5jKShjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOExIaXN0b2dyYW0qIGNvbnN0IGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEhpc3RvZ3JhbSogY29uc3Qgb3V0KTsKK2V4dGVybiBWUDhMSGlzdG9ncmFtQWRkRnVuYyBWUDhMSGlzdG9ncmFtQWRkOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHJlZml4RW5jb2RlKCkKKwordHlwZWRlZiBpbnQgKCpWUDhMVmVjdG9yTWlzbWF0Y2hGdW5jKShjb25zdCB1aW50MzJfdCogY29uc3QgYXJyYXkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgYXJyYXkyLCBpbnQgbGVuZ3RoKTsKKy8vIFJldHVybnMgdGhlIGZpcnN0IGluZGV4IHdoZXJlIGFycmF5MSBhbmQgYXJyYXkyIGFyZSBkaWZmZXJlbnQuCitleHRlcm4gVlA4TFZlY3Rvck1pc21hdGNoRnVuYyBWUDhMVmVjdG9yTWlzbWF0Y2g7CisKK3R5cGVkZWYgdm9pZCAoKlZQOExCdW5kbGVDb2xvck1hcEZ1bmMpKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHJvdywgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhiaXRzLCB1aW50MzJfdCogZHN0KTsKK2V4dGVybiBWUDhMQnVuZGxlQ29sb3JNYXBGdW5jIFZQOExCdW5kbGVDb2xvck1hcDsKK3ZvaWQgVlA4TEJ1bmRsZUNvbG9yTWFwX0MoY29uc3QgdWludDhfdCogY29uc3Qgcm93LCBpbnQgd2lkdGgsIGludCB4Yml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGRzdCk7CisKKy8vIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIGFueSBvZiB0aGUgYWJvdmUgbWV0aG9kcy4KK3ZvaWQgVlA4TEVuY0RzcEluaXQodm9pZCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvLyBXRUJQX0RTUF9MT1NTTEVTU19IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9sb3NzbGVzc19jb21tb24uaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbG9zc2xlc3NfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI2NDhkMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbG9zc2xlc3NfY29tbW9uLmgKQEAgLTAsMCArMSwyMDIgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBJbWFnZSB0cmFuc2Zvcm1zIGFuZCBjb2xvciBzcGFjZSBjb252ZXJzaW9uIG1ldGhvZHMgZm9yIGxvc3NsZXNzIGRlY29kZXIuCisvLworLy8gQXV0aG9yczogVmlrYXMgQXJvcmEgKHZpa2Fhcy5hcm9yYUBnbWFpbC5jb20pCisvLyAgICAgICAgICBKeXJraSBBbGFrdWlqYWxhIChqeXJraUBnb29nbGUuY29tKQorLy8gICAgICAgICAgVmluY2VudCBSYWJhdWQgKHZyYWJhdWRAZ29vZ2xlLmNvbSkKKworI2lmbmRlZiBXRUJQX0RTUF9MT1NTTEVTU19DT01NT05fSF8KKyNkZWZpbmUgV0VCUF9EU1BfTE9TU0xFU1NfQ09NTU9OX0hfCisKKyNpbmNsdWRlICJzcmMvd2VicC90eXBlcy5oIgorCisjaW5jbHVkZSAic3JjL3V0aWxzL3V0aWxzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERlY29kaW5nCisKKy8vIGNvbG9yIG1hcHBpbmcgcmVsYXRlZCBmdW5jdGlvbnMuCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgVlA4R2V0QVJHQkluZGV4KHVpbnQzMl90IGlkeCkgeworICByZXR1cm4gKGlkeCA+PiA4KSAmIDB4ZmY7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50OF90IFZQOEdldEFscGhhSW5kZXgodWludDhfdCBpZHgpIHsKKyAgcmV0dXJuIGlkeDsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IFZQOEdldEFSR0JWYWx1ZSh1aW50MzJfdCB2YWwpIHsKKyAgcmV0dXJuIHZhbDsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ4X3QgVlA4R2V0QWxwaGFWYWx1ZSh1aW50MzJfdCB2YWwpIHsKKyAgcmV0dXJuICh2YWwgPj4gOCkgJiAweGZmOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWlzYyBtZXRob2RzLgorCisvLyBDb21wdXRlcyBzYW1wbGVkIHNpemUgb2YgJ3NpemUnIHdoZW4gc2FtcGxpbmcgdXNpbmcgJ3NhbXBsaW5nIGJpdHMnLgorc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IFZQOExTdWJTYW1wbGVTaXplKHVpbnQzMl90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdfYml0cykgeworICByZXR1cm4gKHNpemUgKyAoMSA8PCBzYW1wbGluZ19iaXRzKSAtIDEpID4+IHNhbXBsaW5nX2JpdHM7Cit9CisKKy8vIENvbnZlcnRzIG5lYXIgbG9zc2xlc3MgcXVhbGl0eSBpbnRvIG1heCBudW1iZXIgb2YgYml0cyBzaGF2ZWQgb2ZmLgorc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhMTmVhckxvc3NsZXNzQml0cyhpbnQgbmVhcl9sb3NzbGVzc19xdWFsaXR5KSB7CisgIC8vICAgIDEwMCAtPiAwCisgIC8vIDgwLi45OSAtPiAxCisgIC8vIDYwLi43OSAtPiAyCisgIC8vIDQwLi41OSAtPiAzCisgIC8vIDIwLi4zOSAtPiA0CisgIC8vICAwLi4xOSAtPiA1CisgIHJldHVybiA1IC0gbmVhcl9sb3NzbGVzc19xdWFsaXR5IC8gMjA7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGYXN0ZXIgbG9nYXJpdGhtIGZvciBpbnRlZ2Vycy4gU21hbGwgdmFsdWVzIHVzZSBhIGxvb2stdXAgdGFibGUuCisKKy8vIFRoZSB0aHJlc2hvbGQgdGlsbCBhcHByb3hpbWF0ZSB2ZXJzaW9uIG9mIGxvZ18yIGNhbiBiZSB1c2VkLgorLy8gUHJhY3RpY2FsbHksIHdlIGNhbiBnZXQgcmlkIG9mIHRoZSBjYWxsIHRvIGxvZygpIGFzIHRoZSB0d28gdmFsdWVzIG1hdGNoIHRvCisvLyB2ZXJ5IGhpZ2ggZGVncmVlICh0aGUgcmF0aW8gb2YgdGhlc2UgdHdvIGlzIDAuOTk5OTl4KS4KKy8vIEtlZXBpbmcgYSBoaWdoIHRocmVzaG9sZCBmb3Igbm93LgorI2RlZmluZSBBUFBST1hfTE9HX1dJVEhfQ09SUkVDVElPTl9NQVggIDY1NTM2CisjZGVmaW5lIEFQUFJPWF9MT0dfTUFYICAgICAgICAgICAgICAgICAgIDQwOTYKKyNkZWZpbmUgTE9HXzJfUkVDSVBST0NBTCAxLjQ0MjY5NTA0MDg4ODk2MzM4NzAwNDY1MDk0MDA3MDg2CisjZGVmaW5lIExPR19MT09LVVBfSURYX01BWCAyNTYKK2V4dGVybiBjb25zdCBmbG9hdCBrTG9nMlRhYmxlW0xPR19MT09LVVBfSURYX01BWF07CitleHRlcm4gY29uc3QgZmxvYXQga1NMb2cyVGFibGVbTE9HX0xPT0tVUF9JRFhfTUFYXTsKK3R5cGVkZWYgZmxvYXQgKCpWUDhMRmFzdExvZzJTbG93RnVuYykodWludDMyX3Qgdik7CisKK2V4dGVybiBWUDhMRmFzdExvZzJTbG93RnVuYyBWUDhMRmFzdExvZzJTbG93OworZXh0ZXJuIFZQOExGYXN0TG9nMlNsb3dGdW5jIFZQOExGYXN0U0xvZzJTbG93OworCitzdGF0aWMgV0VCUF9JTkxJTkUgZmxvYXQgVlA4TEZhc3RMb2cyKHVpbnQzMl90IHYpIHsKKyAgcmV0dXJuICh2IDwgTE9HX0xPT0tVUF9JRFhfTUFYKSA/IGtMb2cyVGFibGVbdl0gOiBWUDhMRmFzdExvZzJTbG93KHYpOworfQorLy8gRmFzdCBjYWxjdWxhdGlvbiBvZiB2ICogbG9nMih2KSBmb3IgaW50ZWdlciBpbnB1dC4KK3N0YXRpYyBXRUJQX0lOTElORSBmbG9hdCBWUDhMRmFzdFNMb2cyKHVpbnQzMl90IHYpIHsKKyAgcmV0dXJuICh2IDwgTE9HX0xPT0tVUF9JRFhfTUFYKSA/IGtTTG9nMlRhYmxlW3ZdIDogVlA4TEZhc3RTTG9nMlNsb3codik7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQcmVmaXhFbmNvZGUoKQorCisvLyBTcGxpdHRpbmcgb2YgZGlzdGFuY2UgYW5kIGxlbmd0aCBjb2RlcyBpbnRvIHByZWZpeGVzIGFuZAorLy8gZXh0cmEgYml0cy4gVGhlIHByZWZpeGVzIGFyZSBlbmNvZGVkIHdpdGggYW4gZW50cm9weSBjb2RlCisvLyB3aGlsZSB0aGUgZXh0cmEgYml0cyBhcmUgc3RvcmVkIGp1c3QgYXMgbm9ybWFsIGJpdHMuCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWUDhMUHJlZml4RW5jb2RlQml0c05vTFVUKGludCBkaXN0YW5jZSwgaW50KiBjb25zdCBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGV4dHJhX2JpdHMpIHsKKyAgY29uc3QgaW50IGhpZ2hlc3RfYml0ID0gQml0c0xvZzJGbG9vcigtLWRpc3RhbmNlKTsKKyAgY29uc3QgaW50IHNlY29uZF9oaWdoZXN0X2JpdCA9IChkaXN0YW5jZSA+PiAoaGlnaGVzdF9iaXQgLSAxKSkgJiAxOworICAqZXh0cmFfYml0cyA9IGhpZ2hlc3RfYml0IC0gMTsKKyAgKmNvZGUgPSAyICogaGlnaGVzdF9iaXQgKyBzZWNvbmRfaGlnaGVzdF9iaXQ7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZQOExQcmVmaXhFbmNvZGVOb0xVVChpbnQgZGlzdGFuY2UsIGludCogY29uc3QgY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGV4dHJhX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBleHRyYV9iaXRzX3ZhbHVlKSB7CisgIGNvbnN0IGludCBoaWdoZXN0X2JpdCA9IEJpdHNMb2cyRmxvb3IoLS1kaXN0YW5jZSk7CisgIGNvbnN0IGludCBzZWNvbmRfaGlnaGVzdF9iaXQgPSAoZGlzdGFuY2UgPj4gKGhpZ2hlc3RfYml0IC0gMSkpICYgMTsKKyAgKmV4dHJhX2JpdHMgPSBoaWdoZXN0X2JpdCAtIDE7CisgICpleHRyYV9iaXRzX3ZhbHVlID0gZGlzdGFuY2UgJiAoKDEgPDwgKmV4dHJhX2JpdHMpIC0gMSk7CisgICpjb2RlID0gMiAqIGhpZ2hlc3RfYml0ICsgc2Vjb25kX2hpZ2hlc3RfYml0OworfQorCisjZGVmaW5lIFBSRUZJWF9MT09LVVBfSURYX01BWCAgIDUxMgordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQ4X3QgY29kZV87CisgIGludDhfdCBleHRyYV9iaXRzXzsKK30gVlA4TFByZWZpeENvZGU7CisKKy8vIFRoZXNlIHRhYmxlcyBhcmUgZGVyaXZlZCB1c2luZyBWUDhMUHJlZml4RW5jb2RlTm9MVVQuCitleHRlcm4gY29uc3QgVlA4TFByZWZpeENvZGUga1ByZWZpeEVuY29kZUNvZGVbUFJFRklYX0xPT0tVUF9JRFhfTUFYXTsKK2V4dGVybiBjb25zdCB1aW50OF90IGtQcmVmaXhFbmNvZGVFeHRyYUJpdHNWYWx1ZVtQUkVGSVhfTE9PS1VQX0lEWF9NQVhdOworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVlA4TFByZWZpeEVuY29kZUJpdHMoaW50IGRpc3RhbmNlLCBpbnQqIGNvbnN0IGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGV4dHJhX2JpdHMpIHsKKyAgaWYgKGRpc3RhbmNlIDwgUFJFRklYX0xPT0tVUF9JRFhfTUFYKSB7CisgICAgY29uc3QgVlA4TFByZWZpeENvZGUgcHJlZml4X2NvZGUgPSBrUHJlZml4RW5jb2RlQ29kZVtkaXN0YW5jZV07CisgICAgKmNvZGUgPSBwcmVmaXhfY29kZS5jb2RlXzsKKyAgICAqZXh0cmFfYml0cyA9IHByZWZpeF9jb2RlLmV4dHJhX2JpdHNfOworICB9IGVsc2UgeworICAgIFZQOExQcmVmaXhFbmNvZGVCaXRzTm9MVVQoZGlzdGFuY2UsIGNvZGUsIGV4dHJhX2JpdHMpOworICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZQOExQcmVmaXhFbmNvZGUoaW50IGRpc3RhbmNlLCBpbnQqIGNvbnN0IGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgZXh0cmFfYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBleHRyYV9iaXRzX3ZhbHVlKSB7CisgIGlmIChkaXN0YW5jZSA8IFBSRUZJWF9MT09LVVBfSURYX01BWCkgeworICAgIGNvbnN0IFZQOExQcmVmaXhDb2RlIHByZWZpeF9jb2RlID0ga1ByZWZpeEVuY29kZUNvZGVbZGlzdGFuY2VdOworICAgICpjb2RlID0gcHJlZml4X2NvZGUuY29kZV87CisgICAgKmV4dHJhX2JpdHMgPSBwcmVmaXhfY29kZS5leHRyYV9iaXRzXzsKKyAgICAqZXh0cmFfYml0c192YWx1ZSA9IGtQcmVmaXhFbmNvZGVFeHRyYUJpdHNWYWx1ZVtkaXN0YW5jZV07CisgIH0gZWxzZSB7CisgICAgVlA4TFByZWZpeEVuY29kZU5vTFVUKGRpc3RhbmNlLCBjb2RlLCBleHRyYV9iaXRzLCBleHRyYV9iaXRzX3ZhbHVlKTsKKyAgfQorfQorCisvLyBTdW0gb2YgZWFjaCBjb21wb25lbnQsIG1vZCAyNTYuCitzdGF0aWMgV0VCUF9VQlNBTl9JR05PUkVfVU5TSUdORURfT1ZFUkZMT1cgV0VCUF9JTkxJTkUKK3VpbnQzMl90IFZQOExBZGRQaXhlbHModWludDMyX3QgYSwgdWludDMyX3QgYikgeworICBjb25zdCB1aW50MzJfdCBhbHBoYV9hbmRfZ3JlZW4gPSAoYSAmIDB4ZmYwMGZmMDB1KSArIChiICYgMHhmZjAwZmYwMHUpOworICBjb25zdCB1aW50MzJfdCByZWRfYW5kX2JsdWUgPSAoYSAmIDB4MDBmZjAwZmZ1KSArIChiICYgMHgwMGZmMDBmZnUpOworICByZXR1cm4gKGFscGhhX2FuZF9ncmVlbiAmIDB4ZmYwMGZmMDB1KSB8IChyZWRfYW5kX2JsdWUgJiAweDAwZmYwMGZmdSk7Cit9CisKKy8vIERpZmZlcmVuY2Ugb2YgZWFjaCBjb21wb25lbnQsIG1vZCAyNTYuCitzdGF0aWMgV0VCUF9VQlNBTl9JR05PUkVfVU5TSUdORURfT1ZFUkZMT1cgV0VCUF9JTkxJTkUKK3VpbnQzMl90IFZQOExTdWJQaXhlbHModWludDMyX3QgYSwgdWludDMyX3QgYikgeworICBjb25zdCB1aW50MzJfdCBhbHBoYV9hbmRfZ3JlZW4gPQorICAgICAgMHgwMGZmMDBmZnUgKyAoYSAmIDB4ZmYwMGZmMDB1KSAtIChiICYgMHhmZjAwZmYwMHUpOworICBjb25zdCB1aW50MzJfdCByZWRfYW5kX2JsdWUgPQorICAgICAgMHhmZjAwZmYwMHUgKyAoYSAmIDB4MDBmZjAwZmZ1KSAtIChiICYgMHgwMGZmMDBmZnUpOworICByZXR1cm4gKGFscGhhX2FuZF9ncmVlbiAmIDB4ZmYwMGZmMDB1KSB8IChyZWRfYW5kX2JsdWUgJiAweDAwZmYwMGZmdSk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUcmFuc2Zvcm0tcmVsYXRlZCBmdW5jdGlvbnMgdXNlIGRpbiBib3RoIGVuY29kaW5nIGFuZCBkZWNvZGluZy4KKworLy8gTWFjcm9zIHVzZWQgdG8gY3JlYXRlIGEgYmF0Y2ggcHJlZGljdG9yIHRoYXQgaXRlcmF0aXZlbHkgdXNlcyBhCisvLyBvbmUtcGl4ZWwgcHJlZGljdG9yLgorCisvLyBUaGUgcHJlZGljdG9yIGlzIGFkZGVkIHRvIHRoZSBvdXRwdXQgcGl4ZWwgKHdoaWNoCisvLyBpcyB0aGVyZWZvcmUgY29uc2lkZXJlZCBhcyBhIHJlc2lkdWFsKSB0byBnZXQgdGhlIGZpbmFsIHByZWRpY3Rpb24uCisjZGVmaW5lIEdFTkVSQVRFX1BSRURJQ1RPUl9BREQoUFJFRElDVE9SLCBQUkVESUNUT1JfQUREKSAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBQUkVESUNUT1JfQUREKGNvbnN0IHVpbnQzMl90KiBpbiwgY29uc3QgdWludDMyX3QqIHVwcGVyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50MzJfdCogb3V0KSB7ICAgICAgICAgICBcCisgIGludCB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZvciAoeCA9IDA7IHggPCBudW1fcGl4ZWxzOyArK3gpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDMyX3QgcHJlZCA9IChQUkVESUNUT1IpKG91dFt4IC0gMV0sIHVwcGVyICsgeCk7ICAgICAgICBcCisgICAgb3V0W3hdID0gVlA4TEFkZFBpeGVscyhpblt4XSwgcHJlZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vIEl0IHN1YnRyYWN0cyB0aGUgcHJlZGljdGlvbiBmcm9tIHRoZSBpbnB1dCBwaXhlbCBhbmQgc3RvcmVzIHRoZSByZXNpZHVhbAorLy8gaW4gdGhlIG91dHB1dCBwaXhlbC4KKyNkZWZpbmUgR0VORVJBVEVfUFJFRElDVE9SX1NVQihQUkVESUNUT1IsIFBSRURJQ1RPUl9TVUIpICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIFBSRURJQ1RPUl9TVUIoY29uc3QgdWludDMyX3QqIGluLCBjb25zdCB1aW50MzJfdCogdXBwZXIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQzMl90KiBvdXQpIHsgICAgICAgICAgIFwKKyAgaW50IHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yICh4ID0gMDsgeCA8IG51bV9waXhlbHM7ICsreCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB1aW50MzJfdCBwcmVkID0gKFBSRURJQ1RPUikoaW5beCAtIDFdLCB1cHBlciArIHgpOyAgICAgICAgIFwKKyAgICBvdXRbeF0gPSBWUDhMU3ViUGl4ZWxzKGluW3hdLCBwcmVkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8vIFdFQlBfRFNQX0xPU1NMRVNTX0NPTU1PTl9IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9sb3NzbGVzc19lbmMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbG9zc2xlc3NfZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYwODMyNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbG9zc2xlc3NfZW5jLmMKQEAgLTAsMCArMSwxMDExIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gSW1hZ2UgdHJhbnNmb3JtIG1ldGhvZHMgZm9yIGxvc3NsZXNzIGVuY29kZXIuCisvLworLy8gQXV0aG9yczogVmlrYXMgQXJvcmEgKHZpa2Fhcy5hcm9yYUBnbWFpbC5jb20pCisvLyAgICAgICAgICBKeXJraSBBbGFrdWlqYWxhIChqeXJraUBnb29nbGUuY29tKQorLy8gICAgICAgICAgVXJ2YW5nIEpvc2hpICh1cnZhbmdAZ29vZ2xlLmNvbSkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAic3JjL2RlYy92cDhsaV9kZWMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvZW5kaWFuX2lubF91dGlscy5oIgorI2luY2x1ZGUgInNyYy9kc3AvbG9zc2xlc3MuaCIKKyNpbmNsdWRlICJzcmMvZHNwL2xvc3NsZXNzX2NvbW1vbi5oIgorI2luY2x1ZGUgInNyYy9kc3AveXV2LmgiCisKKy8vIGxvb2t1cCB0YWJsZSBmb3Igc21hbGwgdmFsdWVzIG9mIGxvZzIoaW50KQorY29uc3QgZmxvYXQga0xvZzJUYWJsZVtMT0dfTE9PS1VQX0lEWF9NQVhdID0geworICAwLjAwMDAwMDAwMDAwMDAwMDBmLCAwLjAwMDAwMDAwMDAwMDAwMDBmLAorICAxLjAwMDAwMDAwMDAwMDAwMDBmLCAxLjU4NDk2MjUwMDcyMTE1NjBmLAorICAyLjAwMDAwMDAwMDAwMDAwMDBmLCAyLjMyMTkyODA5NDg4NzM2MjFmLAorICAyLjU4NDk2MjUwMDcyMTE1NjBmLCAyLjgwNzM1NDkyMjA1NzYwNDFmLAorICAzLjAwMDAwMDAwMDAwMDAwMDBmLCAzLjE2OTkyNTAwMTQ0MjMxMjFmLAorICAzLjMyMTkyODA5NDg4NzM2MjFmLCAzLjQ1OTQzMTYxODYzNzI5NzNmLAorICAzLjU4NDk2MjUwMDcyMTE1NjBmLCAzLjcwMDQzOTcxODE0MTA5MjFmLAorICAzLjgwNzM1NDkyMjA1NzYwNDFmLCAzLjkwNjg5MDU5NTYwODUxODdmLAorICA0LjAwMDAwMDAwMDAwMDAwMDBmLCA0LjA4NzQ2Mjg0MTI1MDMzOTBmLAorICA0LjE2OTkyNTAwMTQ0MjMxMjFmLCA0LjI0NzkyNzUxMzQ0MzU4NTJmLAorICA0LjMyMTkyODA5NDg4NzM2MjZmLCA0LjM5MjMxNzQyMjc3ODc2MDZmLAorICA0LjQ1OTQzMTYxODYzNzI5NzNmLCA0LjUyMzU2MTk1NjA1NzAxMzBmLAorICA0LjU4NDk2MjUwMDcyMTE1NjBmLCA0LjY0Mzg1NjE4OTc3NDcyNDNmLAorICA0LjcwMDQzOTcxODE0MTA5MTdmLCA0Ljc1NDg4NzUwMjE2MzQ2ODJmLAorICA0LjgwNzM1NDkyMjA1NzYwMzdmLCA0Ljg1Nzk4MDk5NTEyNzU3MThmLAorICA0LjkwNjg5MDU5NTYwODUxODdmLCA0Ljk1NDE5NjMxMDM4Njg3NDlmLAorICA1LjAwMDAwMDAwMDAwMDAwMDBmLCA1LjA0NDM5NDExOTM1ODQ1MzNmLAorICA1LjA4NzQ2Mjg0MTI1MDMzOTBmLCA1LjEyOTI4MzAxNjk0NDk2NjNmLAorICA1LjE2OTkyNTAwMTQ0MjMxMjFmLCA1LjIwOTQ1MzM2NTYyODk1MDFmLAorICA1LjI0NzkyNzUxMzQ0MzU4NTJmLCA1LjI4NTQwMjIxODg2MjI0ODdmLAorICA1LjMyMTkyODA5NDg4NzM2MjZmLCA1LjM1NzU1MjAwNDYxODA4MzdmLAorICA1LjM5MjMxNzQyMjc3ODc2MDZmLCA1LjQyNjI2NDc1NDcwMjA5NzlmLAorICA1LjQ1OTQzMTYxODYzNzI5NzNmLCA1LjQ5MTg1MzA5NjMyOTY3NDdmLAorICA1LjUyMzU2MTk1NjA1NzAxMzBmLCA1LjU1NDU4ODg1MTY3NzYzNzZmLAorICA1LjU4NDk2MjUwMDcyMTE1NjBmLCA1LjYxNDcwOTg0NDExNTIwODNmLAorICA1LjY0Mzg1NjE4OTc3NDcyNDNmLCA1LjY3MjQyNTM0MTk3MTQ5NTFmLAorICA1LjcwMDQzOTcxODE0MTA5MTdmLCA1LjcyNzkyMDQ1NDU2MzE5ODdmLAorICA1Ljc1NDg4NzUwMjE2MzQ2ODJmLCA1Ljc4MTM1OTcxMzUyNDY1OTlmLAorICA1LjgwNzM1NDkyMjA1NzYwMzdmLCA1LjgzMjg5MDAxNDE2NDc0MTJmLAorICA1Ljg1Nzk4MDk5NTEyNzU3MThmLCA1Ljg4MjY0MzA0OTM2MTg0MTVmLAorICA1LjkwNjg5MDU5NTYwODUxODdmLCA1LjkzMDczNzMzNzU2Mjg4NjZmLAorICA1Ljk1NDE5NjMxMDM4Njg3NDlmLCA1Ljk3NzI3OTkyMzQ5OTkxNjdmLAorICA2LjAwMDAwMDAwMDAwMDAwMDBmLCA2LjAyMjM2NzgxMzAyODQ1NDNmLAorICA2LjA0NDM5NDExOTM1ODQ1MzNmLCA2LjA2NjA4OTE5MDQ1Nzc3MjBmLAorICA2LjA4NzQ2Mjg0MTI1MDMzOTBmLCA2LjEwODUyNDQ1Njc3ODE2OTFmLAorICA2LjEyOTI4MzAxNjk0NDk2NjNmLCA2LjE0OTc0NzExOTUwNDY4MjJmLAorICA2LjE2OTkyNTAwMTQ0MjMxMjFmLCA2LjE4OTgyNDU1ODg4MDAxNzVmLAorICA2LjIwOTQ1MzM2NTYyODk1MDFmLCA2LjIyODgxODY5MDQ5NTg4MDRmLAorICA2LjI0NzkyNzUxMzQ0MzU4NTJmLCA2LjI2Njc4NjU0MDY5NDkwMTBmLAorICA2LjI4NTQwMjIxODg2MjI0ODdmLCA2LjMwMzc4MDc0ODE3NzEwMzBmLAorICA2LjMyMTkyODA5NDg4NzM2MjZmLCA2LjMzOTg1MDAwMjg4NDYyNDNmLAorICA2LjM1NzU1MjAwNDYxODA4MzdmLCA2LjM3NTAzOTQzMTM0NjkyNDVmLAorICA2LjM5MjMxNzQyMjc3ODc2MDZmLCA2LjQwOTM5MDkzNjEzNzcwMTdmLAorICA2LjQyNjI2NDc1NDcwMjA5NzlmLCA2LjQ0Mjk0MzQ5NTg0ODcyNzlmLAorICA2LjQ1OTQzMTYxODYzNzI5NzNmLCA2LjQ3NTczMzQzMDk2NjM5NzZmLAorICA2LjQ5MTg1MzA5NjMyOTY3NDdmLCA2LjUwNzc5NDY0MDE5ODY5NjNmLAorICA2LjUyMzU2MTk1NjA1NzAxMzBmLCA2LjUzOTE1ODgxMTEwODAzMDlmLAorICA2LjU1NDU4ODg1MTY3NzYzNzZmLCA2LjU2OTg1NTYwODMzMDk0NzhmLAorICA2LjU4NDk2MjUwMDcyMTE1NjBmLCA2LjU5OTkxMjg0MjE4NzEyNzhmLAorICA2LjYxNDcwOTg0NDExNTIwODNmLCA2LjYyOTM1NjYyMDA3OTYwOTRmLAorICA2LjY0Mzg1NjE4OTc3NDcyNDNmLCA2LjY1ODIxMTQ4Mjc1MTc5NDZmLAorICA2LjY3MjQyNTM0MTk3MTQ5NTFmLCA2LjY4NjUwMDUyNzE4MzIxODVmLAorICA2LjcwMDQzOTcxODE0MTA5MTdmLCA2LjcxNDI0NTUxNzY2NjEyMjRmLAorICA2LjcyNzkyMDQ1NDU2MzE5ODdmLCA2Ljc0MTQ2Njk4NjQwMTE0NjRmLAorICA2Ljc1NDg4NzUwMjE2MzQ2ODJmLCA2Ljc2ODE4NDMyNDc3NjkyNTlmLAorICA2Ljc4MTM1OTcxMzUyNDY1OTlmLCA2Ljc5NDQxNTg2NjM1MDEwNjFmLAorICA2LjgwNzM1NDkyMjA1NzYwMzdmLCA2LjgyMDE3ODk2MjQxNTE4NzhmLAorICA2LjgzMjg5MDAxNDE2NDc0MTJmLCA2Ljg0NTQ5MDA1MDk0NDM3NDdmLAorICA2Ljg1Nzk4MDk5NTEyNzU3MThmLCA2Ljg3MDM2NDcxOTU4MzQwNDdmLAorICA2Ljg4MjY0MzA0OTM2MTg0MTVmLCA2Ljg5NDgxNzc2MzMwNzk0MzdmLAorICA2LjkwNjg5MDU5NTYwODUxODdmLCA2LjkxODg2MzIzNzI3NDU5NDZmLAorICA2LjkzMDczNzMzNzU2Mjg4NjZmLCA2Ljk0MjUxNDUwNTMzOTIzOThmLAorICA2Ljk1NDE5NjMxMDM4Njg3NDlmLCA2Ljk2NTc4NDI4NDY2MjA4NjlmLAorICA2Ljk3NzI3OTkyMzQ5OTkxNjdmLCA2Ljk4ODY4NDY4Njc3MjE2NTRmLAorICA3LjAwMDAwMDAwMDAwMDAwMDBmLCA3LjAxMTIyNzI1NTQyMzI1MzlmLAorICA3LjAyMjM2NzgxMzAyODQ1NDNmLCA3LjAzMzQyMzAwMTUzNzQ1MDFmLAorICA3LjA0NDM5NDExOTM1ODQ1MzNmLCA3LjA1NTI4MjQzNTUwMTE4OThmLAorICA3LjA2NjA4OTE5MDQ1Nzc3MjBmLCA3LjA3NjgxNTU5NzA1MDgzMDhmLAorICA3LjA4NzQ2Mjg0MTI1MDMzOTBmLCA3LjA5ODAzMjA4Mjk2MDUyNjNmLAorICA3LjEwODUyNDQ1Njc3ODE2OTFmLCA3LjExODk0MTA3MjcyMzUwNzZmLAorICA3LjEyOTI4MzAxNjk0NDk2NjNmLCA3LjEzOTU1MTM1MjM5ODc5MzZmLAorICA3LjE0OTc0NzExOTUwNDY4MjJmLCA3LjE1OTg3MTMzNjc3ODM4OTBmLAorICA3LjE2OTkyNTAwMTQ0MjMxMjFmLCA3LjE3OTkwOTA5MDAxNDkzNDRmLAorICA3LjE4OTgyNDU1ODg4MDAxNzVmLCA3LjE5OTY3MjM0NDgzNjM2NDRmLAorICA3LjIwOTQ1MzM2NTYyODk1MDFmLCA3LjIxOTE2ODUyMDQ2MjE2MTFmLAorICA3LjIyODgxODY5MDQ5NTg4MDRmLCA3LjIzODQwNDczOTMyNTA3ODVmLAorICA3LjI0NzkyNzUxMzQ0MzU4NTJmLCA3LjI1NzM4Nzg0MjY5MjY1MjFmLAorICA3LjI2Njc4NjU0MDY5NDkwMTBmLCA3LjI3NjEyNDQwNTI3NDIzNzVmLAorICA3LjI4NTQwMjIxODg2MjI0ODdmLCA3LjI5NDYyMDc0ODg5MTYyNzBmLAorICA3LjMwMzc4MDc0ODE3NzEwMzBmLCA3LjMxMjg4Mjk1NTI4NDM1NTdmLAorICA3LjMyMTkyODA5NDg4NzM2MjZmLCA3LjMzMDkxNjg3ODExNDYxNjdmLAorICA3LjMzOTg1MDAwMjg4NDYyNDNmLCA3LjM0ODcyODE1NDIzMTA3NzFmLAorICA3LjM1NzU1MjAwNDYxODA4MzdmLCA3LjM2NjMyMjIxNDI0NTgxNjBmLAorICA3LjM3NTAzOTQzMTM0NjkyNDVmLCA3LjM4MzcwNDI5MjQ3NDA1MTlmLAorICA3LjM5MjMxNzQyMjc3ODc2MDZmLCA3LjQwMDg3OTQzNjI4MjE4NDNmLAorICA3LjQwOTM5MDkzNjEzNzcwMTdmLCA3LjQxNzg1MjUxNDg4NTg5ODJmLAorICA3LjQyNjI2NDc1NDcwMjA5NzlmLCA3LjQzNDYyODIyNzYzNjcyNDVmLAorICA3LjQ0Mjk0MzQ5NTg0ODcyNzlmLCA3LjQ1MTIxMTExMTgzMjMyODlmLAorICA3LjQ1OTQzMTYxODYzNzI5NzNmLCA3LjQ2NzYwNTU1MDA4Mjk5NzZmLAorICA3LjQ3NTczMzQzMDk2NjM5NzZmLCA3LjQ4MzgxNTc3NzI2NDI1NjNmLAorICA3LjQ5MTg1MzA5NjMyOTY3NDdmLCA3LjQ5OTg0NTg4NzA4MzIwNTZmLAorICA3LjUwNzc5NDY0MDE5ODY5NjNmLCA3LjUxNTY5OTgzODI4NDA0MjdmLAorICA3LjUyMzU2MTk1NjA1NzAxMzBmLCA3LjUzMTM4MTQ2MDUxNjMxMThmLAorICA3LjUzOTE1ODgxMTEwODAzMDlmLCA3LjU0Njg5NDQ1OTg4NzYzNjRmLAorICA3LjU1NDU4ODg1MTY3NzYzNzZmLCA3LjU2MjI0MjQyNDIyMTA3MjhmLAorICA3LjU2OTg1NTYwODMzMDk0NzhmLCA3LjU3NzQyODgyODAzNTc0ODZmLAorICA3LjU4NDk2MjUwMDcyMTE1NjBmLCA3LjU5MjQ1NzAzNzI2ODA4MDZmLAorICA3LjU5OTkxMjg0MjE4NzEyNzhmLCA3LjYwNzMzMDMxMzc0OTYxMDRmLAorICA3LjYxNDcwOTg0NDExNTIwODNmLCA3LjYyMjA1MTgxOTQ1NjM3NjRmLAorICA3LjYyOTM1NjYyMDA3OTYwOTRmLCA3LjYzNjYyNDYyMDU0MzY0ODdmLAorICA3LjY0Mzg1NjE4OTc3NDcyNDNmLCA3LjY1MTA1MTY5MTE3ODkyODFmLAorICA3LjY1ODIxMTQ4Mjc1MTc5NDZmLCA3LjY2NTMzNTkxNzE4NTE3NjRmLAorICA3LjY3MjQyNTM0MTk3MTQ5NTFmLCA3LjY3OTQ4MDA5OTUwNTQ0NjRmLAorICA3LjY4NjUwMDUyNzE4MzIxODVmLCA3LjY5MzQ4Njk1NzQ5OTMyNTJmLAorICA3LjcwMDQzOTcxODE0MTA5MTdmLCA3LjcwNzM1OTEzMjA4MDg4MjVmLAorICA3LjcxNDI0NTUxNzY2NjEyMjRmLCA3LjcyMTA5OTE4ODcwNzE4NTVmLAorICA3LjcyNzkyMDQ1NDU2MzE5ODdmLCA3LjczNDcwOTYyMDIyNTgzODNmLAorICA3Ljc0MTQ2Njk4NjQwMTE0NjRmLCA3Ljc0ODE5Mjg0OTU4OTQ2MDVmLAorICA3Ljc1NDg4NzUwMjE2MzQ2ODJmLCA3Ljc2MTU1MTIzMjQ0NDQ3OTVmLAorICA3Ljc2ODE4NDMyNDc3NjkyNTlmLCA3Ljc3NDc4NzA1OTYwMTE3MzZmLAorICA3Ljc4MTM1OTcxMzUyNDY1OTlmLCA3Ljc4NzkwMjU1OTM5MTQzMTdmLAorICA3Ljc5NDQxNTg2NjM1MDEwNjFmLCA3LjgwMDg5OTg5OTkyMDMwNDdmLAorICA3LjgwNzM1NDkyMjA1NzYwMzdmLCA3LjgxMzc4MTE5MTIxNzAzNzRmLAorICA3LjgyMDE3ODk2MjQxNTE4NzhmLCA3LjgyNjU0ODQ4NzI5MDkxNTBmLAorICA3LjgzMjg5MDAxNDE2NDc0MTJmLCA3LjgzOTIwMzc4ODA5Njk0MzZmLAorICA3Ljg0NTQ5MDA1MDk0NDM3NDdmLCA3Ljg1MTc0OTA0MTQxNjA1NzFmLAorICA3Ljg1Nzk4MDk5NTEyNzU3MThmLCA3Ljg2NDE4NjE0NDY1NDI3OTdmLAorICA3Ljg3MDM2NDcxOTU4MzQwNDdmLCA3Ljg3NjUxNjk0NjU2NDk5OTNmLAorICA3Ljg4MjY0MzA0OTM2MTg0MTVmLCA3Ljg4ODc0MzI0ODg5ODI1OTFmLAorICA3Ljg5NDgxNzc2MzMwNzk0MzdmLCA3LjkwMDg2NjgwNzk4MDc0ODZmLAorICA3LjkwNjg5MDU5NTYwODUxODdmLCA3LjkxMjg4OTMzNjIyOTk2MTlmLAorICA3LjkxODg2MzIzNzI3NDU5NDZmLCA3LjkyNDgxMjUwMzYwNTc4MTJmLAorICA3LjkzMDczNzMzNzU2Mjg4NjZmLCA3LjkzNjYzNzkzOTAwMjU3MDlmLAorICA3Ljk0MjUxNDUwNTMzOTIzOThmLCA3Ljk0ODM2NzIzMTU4NDY3NzhmLAorICA3Ljk1NDE5NjMxMDM4Njg3NDlmLCA3Ljk2MDAwMTkzMjA2ODA4MDVmLAorICA3Ljk2NTc4NDI4NDY2MjA4NjlmLCA3Ljk3MTU0MzU1Mzk1MDc3MTlmLAorICA3Ljk3NzI3OTkyMzQ5OTkxNjdmLCA3Ljk4Mjk5MzU3NDY5NDMxMDNmLAorICA3Ljk4ODY4NDY4Njc3MjE2NTRmLCA3Ljk5NDM1MzQzNjg1ODg1NzdmCit9OworCitjb25zdCBmbG9hdCBrU0xvZzJUYWJsZVtMT0dfTE9PS1VQX0lEWF9NQVhdID0geworICAwLjAwMDAwMDAwZiwgICAgMC4wMDAwMDAwMGYsICAyLjAwMDAwMDAwZiwgICA0Ljc1NDg4NzUwZiwKKyAgOC4wMDAwMDAwMGYsICAgMTEuNjA5NjQwNDdmLCAgMTUuNTA5Nzc1MDBmLCAgMTkuNjUxNDg0NDVmLAorICAyNC4wMDAwMDAwMGYsICAyOC41MjkzMjUwMWYsICAzMy4yMTkyODA5NWYsICAzOC4wNTM3NDc4MWYsCisgIDQzLjAxOTU1MDAxZiwgIDQ4LjEwNTcxNjM0ZiwgIDUzLjMwMjk2ODkxZiwgIDU4LjYwMzM1ODkzZiwKKyAgNjQuMDAwMDAwMDBmLCAgNjkuNDg2ODY4MzBmLCAgNzUuMDU4NjUwMDNmLCAgODAuNzEwNjIyNzZmLAorICA4Ni40Mzg1NjE5MGYsICA5Mi4yMzg2NjU4OGYsICA5OC4xMDc0OTU2MWYsICAxMDQuMDQxOTI0OTlmLAorICAxMTAuMDM5MTAwMDJmLCAxMTYuMDk2NDA0NzRmLCAxMjIuMjExNDMyNjdmLCAxMjguMzgxOTYyNTZmLAorICAxMzQuNjA1OTM3ODJmLCAxNDAuODgxNDQ4ODZmLCAxNDcuMjA2NzE3ODdmLCAxNTMuNTgwMDg1NjJmLAorICAxNjAuMDAwMDAwMDBmLCAxNjYuNDY1MDA1OTRmLCAxNzIuOTczNzM2NjBmLCAxNzkuNTI0OTA1NTlmLAorICAxODYuMTE3MzAwMDVmLCAxOTIuNzQ5Nzc0NTNmLCAxOTkuNDIxMjQ1NTFmLCAyMDYuMTMwNjg2NTRmLAorICAyMTIuODc3MTIzODBmLCAyMTkuNjU5NjMyMTlmLCAyMjYuNDc3MzMxNzZmLCAyMzMuMzI5Mzg0NDVmLAorICAyNDAuMjE0OTkxMjJmLCAyNDcuMTMzMzg5MzNmLCAyNTQuMDgzODQ5OThmLCAyNjEuMDY1Njc2MDNmLAorICAyNjguMDc4MjAwMDNmLCAyNzUuMTIwNzgyMzZmLCAyODIuMTkyODA5NDlmLCAyODkuMjkzNjkyNDRmLAorICAyOTYuNDIyODY1MzRmLCAzMDMuNTc5Nzg0MDlmLCAzMTAuNzYzOTI1MTJmLCAzMTcuOTc0Nzg0MjRmLAorICAzMjUuMjExODc1NjRmLCAzMzIuNDc0NzMwODFmLCAzMzkuNzYyODk3NzJmLCAzNDcuMDc1OTM5OTFmLAorICAzNTQuNDEzNDM1NzRmLCAzNjEuNzc0OTc3NTlmLCAzNjkuMTYwMTcxMjRmLCAzNzYuNTY4NjM1MThmLAorICAzODQuMDAwMDAwMDBmLCAzOTEuNDUzOTA3ODVmLCAzOTguOTMwMDExODhmLCA0MDYuNDI3OTc1NzZmLAorICA0MTMuOTQ3NDczMjFmLCA0MjEuNDg4MTg3NTJmLCA0MjkuMDQ5ODExMTlmLCA0MzYuNjMyMDQ1NDhmLAorICA0NDQuMjM0NjAwMTBmLCA0NTEuODU3MTkyODBmLCA0NTkuNDk5NTQ5MDZmLCA0NjcuMTYxNDAxNzlmLAorICA0NzQuODQyNDkxMDJmLCA0ODIuNTQyNTYzNjNmLCA0OTAuMjYxMzczMDdmLCA0OTcuOTk4Njc5MTFmLAorICA1MDUuNzU0MjQ3NTlmLCA1MTMuNTI3ODUwMjNmLCA1MjEuMzE5MjY0MzhmLCA1MjkuMTI4MjcyODBmLAorICA1MzYuOTU0NjYzNTFmLCA1NDQuNzk4MjI5NTdmLCA1NTIuNjU4NzY4OTBmLCA1NjAuNTM2MDg0MTRmLAorICA1NjguNDI5OTgyNDRmLCA1NzYuMzQwMjc1MzZmLCA1ODQuMjY2Nzc4NjdmLCA1OTIuMjA5MzEyMjZmLAorICA2MDAuMTY3Njk5OTZmLCA2MDguMTQxNzY5NDNmLCA2MTYuMTMxMzUyMDZmLCA2MjQuMTM2MjgyNzlmLAorICA2MzIuMTU2NDAwMDdmLCA2NDAuMTkxNTQ1NjlmLCA2NDguMjQxNTY0NzJmLCA2NTYuMzA2MzA1MzlmLAorICA2NjQuMzg1NjE4OThmLCA2NzIuNDc5MzU5NzZmLCA2ODAuNTg3Mzg0ODhmLCA2ODguNzA5NTU0MzBmLAorICA2OTYuODQ1NzMwNjlmLCA3MDQuOTk1Nzc5MzVmLCA3MTMuMTU5NTY4MThmLCA3MjEuMzM2OTY3NTRmLAorICA3MjkuNTI3ODUwMjNmLCA3MzcuNzMyMDkxNDBmLCA3NDUuOTQ5NTY4NDlmLCA3NTQuMTgwMTYxMTZmLAorICA3NjIuNDIzNzUxMjdmLCA3NzAuNjgwMjIyNzVmLCA3NzguOTQ5NDYxNjFmLCA3ODcuMjMxMzU1ODZmLAorICA3OTUuNTI1Nzk1NDNmLCA4MDMuODMyNjcyMTlmLCA4MTIuMTUxODc5ODJmLCA4MjAuNDgzMzEzODNmLAorICA4MjguODI2ODcxNDdmLCA4MzcuMTgyNDUxNzFmLCA4NDUuNTQ5OTU1MThmLCA4NTMuOTI5Mjg0MTZmLAorICA4NjIuMzIwMzQyNDlmLCA4NzAuNzIzMDM1NThmLCA4NzkuMTM3MjcwMzZmLCA4ODcuNTYyOTU1MjJmLAorICA4OTYuMDAwMDAwMDBmLCA5MDQuNDQ4MzE1OTVmLCA5MTIuOTA3ODE1NjlmLCA5MjEuMzc4NDEzMjBmLAorICA5MjkuODYwMDIzNzZmLCA5MzguMzUyNTYzOTJmLCA5NDYuODU1OTUxNTJmLCA5NTUuMzcwMTA1NjBmLAorICA5NjMuODk0OTQ2NDFmLCA5NzIuNDMwMzk1MzdmLCA5ODAuOTc2Mzc1MDRmLCA5ODkuNTMyODA5MTFmLAorICA5OTguMDk5NjIyMzdmLCAxMDA2LjY3Njc0MDY5ZiwgMTAxNS4yNjQwOTA5N2YsIDEwMjMuODYxNjAxMTZmLAorICAxMDMyLjQ2OTIwMDIxZiwgMTA0MS4wODY4MTgwNWYsIDEwNDkuNzE0Mzg1NjBmLCAxMDU4LjM1MTgzNDY5ZiwKKyAgMTA2Ni45OTkwOTgxMWYsIDEwNzUuNjU2MTA5NTVmLCAxMDg0LjMyMjgwMzU3ZiwgMTA5Mi45OTkxMTU2NGYsCisgIDExMDEuNjg0OTgyMDRmLCAxMTEwLjM4MDMzOTkzZiwgMTExOS4wODUxMjcyN2YsIDExMjcuNzk5MjgyODJmLAorICAxMTM2LjUyMjc0NjE0ZiwgMTE0NS4yNTU0NTc1OGYsIDExNTMuOTk3MzU4MjFmLCAxMTYyLjc0ODM4OTg5ZiwKKyAgMTE3MS41MDg0OTUxOGYsIDExODAuMjc3NjE3MzhmLCAxMTg5LjA1NTcwMDQ3ZiwgMTE5Ny44NDI2ODkxNGYsCisgIDEyMDYuNjM4NTI4NzZmLCAxMjE1LjQ0MzE2NTM1ZiwgMTIyNC4yNTY1NDU2MGYsIDEyMzMuMDc4NjE2ODRmLAorICAxMjQxLjkwOTMyNzAzZiwgMTI1MC43NDg2MjQ3M2YsIDEyNTkuNTk2NDU5MTRmLCAxMjY4LjQ1Mjc4MDA1ZiwKKyAgMTI3Ny4zMTc1Mzc4MWYsIDEyODYuMTkwNjgzMzhmLCAxMjk1LjA3MjE2ODI4ZiwgMTMwMy45NjE5NDQ1N2YsCisgIDEzMTIuODU5OTY0ODhmLCAxMzIxLjc2NjE4MjM2ZiwgMTMzMC42ODA1NTA3MWYsIDEzMzkuNjAzMDI0MTNmLAorICAxMzQ4LjUzMzU1NzM0ZiwgMTM1Ny40NzIxMDU1NmYsIDEzNjYuNDE4NjI0NTJmLCAxMzc1LjM3MzA3MDQxZiwKKyAgMTM4NC4zMzUzOTk5MWYsIDEzOTMuMzA1NTcwMjBmLCAxNDAyLjI4MzUzODg3ZiwgMTQxMS4yNjkyNjQwMGYsCisgIDE0MjAuMjYyNzA0MTJmLCAxNDI5LjI2MzgxODE4ZiwgMTQzOC4yNzI1NjU1OGYsIDE0NDcuMjg4OTA2MTVmLAorICAxNDU2LjMxMjgwMDE0ZiwgMTQ2NS4zNDQyMDgxOWYsIDE0NzQuMzgzMDkxMzhmLCAxNDgzLjQyOTQxMTE4ZiwKKyAgMTQ5Mi40ODMxMjk0NWYsIDE1MDEuNTQ0MjA4NDNmLCAxNTEwLjYxMjYxMDc4ZiwgMTUxOS42ODgyOTk0OWYsCisgIDE1MjguNzcxMjM3OTVmLCAxNTM3Ljg2MTM4OTkzZiwgMTU0Ni45NTg3MTk1MmYsIDE1NTYuMDYzMTkxMTlmLAorICAxNTY1LjE3NDc2OTc2ZiwgMTU3NC4yOTM0MjA0MGYsIDE1ODMuNDE5MTA4NjBmLCAxNTkyLjU1MTgwMDIwZiwKKyAgMTYwMS42OTE0NjEzN2YsIDE2MTAuODM4MDU4NjBmLCAxNjE5Ljk5MTU1ODcxZiwgMTYyOS4xNTE5Mjg4MmYsCisgIDE2MzguMzE5MTM2MzdmLCAxNjQ3LjQ5MzE0OTExZiwgMTY1Ni42NzM5MzUwOWYsIDE2NjUuODYxNDYyNjZmLAorICAxNjc1LjA1NTcwMDQ3ZiwgMTY4NC4yNTY2MTc0NGYsIDE2OTMuNDY0MTgyODBmLCAxNzAyLjY3ODM2NjA1ZiwKKyAgMTcxMS44OTkxMzY5OGYsIDE3MjEuMTI2NDY1NjNmLCAxNzMwLjM2MDMyMjMzZiwgMTczOS42MDA2Nzc2OGYsCisgIDE3NDguODQ3NTAyNTRmLCAxNzU4LjEwMDc2ODAyZiwgMTc2Ny4zNjA0NDU1MWYsIDE3NzYuNjI2NTA2NjJmLAorICAxNzg1Ljg5ODkyMzIzZiwgMTc5NS4xNzc2Njc0N2YsIDE4MDQuNDYyNzExNzJmLCAxODEzLjc1NDAyODU3ZiwKKyAgMTgyMy4wNTE1OTA4N2YsIDE4MzIuMzU1MzcxNzBmLCAxODQxLjY2NTM0NDM4ZiwgMTg1MC45ODE0ODI0NGYsCisgIDE4NjAuMzAzNzU5NjVmLCAxODY5LjYzMjE0OTk5ZiwgMTg3OC45NjY2Mjc2N2YsIDE4ODguMzA3MTY3MTFmLAorICAxODk3LjY1Mzc0Mjk1ZiwgMTkwNy4wMDYzMzAwM2YsIDE5MTYuMzY0OTAzNDJmLCAxOTI1LjcyOTQzODM4ZiwKKyAgMTkzNS4wOTk5MTAzN2YsIDE5NDQuNDc2Mjk1MDZmLCAxOTUzLjg1ODU2ODMxZiwgMTk2My4yNDY3MDYyMGYsCisgIDE5NzIuNjQwNjg0OThmLCAxOTgyLjA0MDQ4MTA4ZiwgMTk5MS40NDYwNzExN2YsIDIwMDAuODU3NDMyMDRmLAorICAyMDEwLjI3NDU0MDcyZiwgMjAxOS42OTczNzQ0MGYsIDIwMjkuMTI1OTEwNDRmLCAyMDM4LjU2MDEyNjQwZgorfTsKKworY29uc3QgVlA4TFByZWZpeENvZGUga1ByZWZpeEVuY29kZUNvZGVbUFJFRklYX0xPT0tVUF9JRFhfTUFYXSA9IHsKKyAgeyAwLCAwfSwgeyAwLCAwfSwgeyAxLCAwfSwgeyAyLCAwfSwgeyAzLCAwfSwgeyA0LCAxfSwgeyA0LCAxfSwgeyA1LCAxfSwKKyAgeyA1LCAxfSwgeyA2LCAyfSwgeyA2LCAyfSwgeyA2LCAyfSwgeyA2LCAyfSwgeyA3LCAyfSwgeyA3LCAyfSwgeyA3LCAyfSwKKyAgeyA3LCAyfSwgeyA4LCAzfSwgeyA4LCAzfSwgeyA4LCAzfSwgeyA4LCAzfSwgeyA4LCAzfSwgeyA4LCAzfSwgeyA4LCAzfSwKKyAgeyA4LCAzfSwgeyA5LCAzfSwgeyA5LCAzfSwgeyA5LCAzfSwgeyA5LCAzfSwgeyA5LCAzfSwgeyA5LCAzfSwgeyA5LCAzfSwKKyAgeyA5LCAzfSwgezEwLCA0fSwgezEwLCA0fSwgezEwLCA0fSwgezEwLCA0fSwgezEwLCA0fSwgezEwLCA0fSwgezEwLCA0fSwKKyAgezEwLCA0fSwgezEwLCA0fSwgezEwLCA0fSwgezEwLCA0fSwgezEwLCA0fSwgezEwLCA0fSwgezEwLCA0fSwgezEwLCA0fSwKKyAgezEwLCA0fSwgezExLCA0fSwgezExLCA0fSwgezExLCA0fSwgezExLCA0fSwgezExLCA0fSwgezExLCA0fSwgezExLCA0fSwKKyAgezExLCA0fSwgezExLCA0fSwgezExLCA0fSwgezExLCA0fSwgezExLCA0fSwgezExLCA0fSwgezExLCA0fSwgezExLCA0fSwKKyAgezExLCA0fSwgezEyLCA1fSwgezEyLCA1fSwgezEyLCA1fSwgezEyLCA1fSwgezEyLCA1fSwgezEyLCA1fSwgezEyLCA1fSwKKyAgezEyLCA1fSwgezEyLCA1fSwgezEyLCA1fSwgezEyLCA1fSwgezEyLCA1fSwgezEyLCA1fSwgezEyLCA1fSwgezEyLCA1fSwKKyAgezEyLCA1fSwgezEyLCA1fSwgezEyLCA1fSwgezEyLCA1fSwgezEyLCA1fSwgezEyLCA1fSwgezEyLCA1fSwgezEyLCA1fSwKKyAgezEyLCA1fSwgezEyLCA1fSwgezEyLCA1fSwgezEyLCA1fSwgezEyLCA1fSwgezEyLCA1fSwgezEyLCA1fSwgezEyLCA1fSwKKyAgezEyLCA1fSwgezEzLCA1fSwgezEzLCA1fSwgezEzLCA1fSwgezEzLCA1fSwgezEzLCA1fSwgezEzLCA1fSwgezEzLCA1fSwKKyAgezEzLCA1fSwgezEzLCA1fSwgezEzLCA1fSwgezEzLCA1fSwgezEzLCA1fSwgezEzLCA1fSwgezEzLCA1fSwgezEzLCA1fSwKKyAgezEzLCA1fSwgezEzLCA1fSwgezEzLCA1fSwgezEzLCA1fSwgezEzLCA1fSwgezEzLCA1fSwgezEzLCA1fSwgezEzLCA1fSwKKyAgezEzLCA1fSwgezEzLCA1fSwgezEzLCA1fSwgezEzLCA1fSwgezEzLCA1fSwgezEzLCA1fSwgezEzLCA1fSwgezEzLCA1fSwKKyAgezEzLCA1fSwgezE0LCA2fSwgezE0LCA2fSwgezE0LCA2fSwgezE0LCA2fSwgezE0LCA2fSwgezE0LCA2fSwgezE0LCA2fSwKKyAgezE0LCA2fSwgezE0LCA2fSwgezE0LCA2fSwgezE0LCA2fSwgezE0LCA2fSwgezE0LCA2fSwgezE0LCA2fSwgezE0LCA2fSwKKyAgezE0LCA2fSwgezE0LCA2fSwgezE0LCA2fSwgezE0LCA2fSwgezE0LCA2fSwgezE0LCA2fSwgezE0LCA2fSwgezE0LCA2fSwKKyAgezE0LCA2fSwgezE0LCA2fSwgezE0LCA2fSwgezE0LCA2fSwgezE0LCA2fSwgezE0LCA2fSwgezE0LCA2fSwgezE0LCA2fSwKKyAgezE0LCA2fSwgezE0LCA2fSwgezE0LCA2fSwgezE0LCA2fSwgezE0LCA2fSwgezE0LCA2fSwgezE0LCA2fSwgezE0LCA2fSwKKyAgezE0LCA2fSwgezE0LCA2fSwgezE0LCA2fSwgezE0LCA2fSwgezE0LCA2fSwgezE0LCA2fSwgezE0LCA2fSwgezE0LCA2fSwKKyAgezE0LCA2fSwgezE0LCA2fSwgezE0LCA2fSwgezE0LCA2fSwgezE0LCA2fSwgezE0LCA2fSwgezE0LCA2fSwgezE0LCA2fSwKKyAgezE0LCA2fSwgezE0LCA2fSwgezE0LCA2fSwgezE0LCA2fSwgezE0LCA2fSwgezE0LCA2fSwgezE0LCA2fSwgezE0LCA2fSwKKyAgezE0LCA2fSwgezE1LCA2fSwgezE1LCA2fSwgezE1LCA2fSwgezE1LCA2fSwgezE1LCA2fSwgezE1LCA2fSwgezE1LCA2fSwKKyAgezE1LCA2fSwgezE1LCA2fSwgezE1LCA2fSwgezE1LCA2fSwgezE1LCA2fSwgezE1LCA2fSwgezE1LCA2fSwgezE1LCA2fSwKKyAgezE1LCA2fSwgezE1LCA2fSwgezE1LCA2fSwgezE1LCA2fSwgezE1LCA2fSwgezE1LCA2fSwgezE1LCA2fSwgezE1LCA2fSwKKyAgezE1LCA2fSwgezE1LCA2fSwgezE1LCA2fSwgezE1LCA2fSwgezE1LCA2fSwgezE1LCA2fSwgezE1LCA2fSwgezE1LCA2fSwKKyAgezE1LCA2fSwgezE1LCA2fSwgezE1LCA2fSwgezE1LCA2fSwgezE1LCA2fSwgezE1LCA2fSwgezE1LCA2fSwgezE1LCA2fSwKKyAgezE1LCA2fSwgezE1LCA2fSwgezE1LCA2fSwgezE1LCA2fSwgezE1LCA2fSwgezE1LCA2fSwgezE1LCA2fSwgezE1LCA2fSwKKyAgezE1LCA2fSwgezE1LCA2fSwgezE1LCA2fSwgezE1LCA2fSwgezE1LCA2fSwgezE1LCA2fSwgezE1LCA2fSwgezE1LCA2fSwKKyAgezE1LCA2fSwgezE1LCA2fSwgezE1LCA2fSwgezE1LCA2fSwgezE1LCA2fSwgezE1LCA2fSwgezE1LCA2fSwgezE1LCA2fSwKKyAgezE1LCA2fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwKKyAgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwKKyAgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwKKyAgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwKKyAgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwKKyAgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwKKyAgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwKKyAgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwKKyAgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwKKyAgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwKKyAgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwKKyAgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwKKyAgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwKKyAgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwKKyAgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwKKyAgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwgezE2LCA3fSwKKyAgezE2LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwKKyAgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwKKyAgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwKKyAgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwKKyAgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwKKyAgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwKKyAgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwKKyAgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwKKyAgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwKKyAgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwKKyAgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwKKyAgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwKKyAgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwKKyAgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwKKyAgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwKKyAgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwgezE3LCA3fSwKK307CisKK2NvbnN0IHVpbnQ4X3Qga1ByZWZpeEVuY29kZUV4dHJhQml0c1ZhbHVlW1BSRUZJWF9MT09LVVBfSURYX01BWF0gPSB7CisgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDIsICAzLCAgMCwgIDEsICAyLCAgMywKKyAgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsCisgICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LAorICAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwKKyAgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsCisgIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLAorICAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwKKyAgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsCisgICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LAorICAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwKKyAgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LCA0MCwgNDEsIDQyLCA0MywgNDQsIDQ1LCA0NiwgNDcsCisgIDQ4LCA0OSwgNTAsIDUxLCA1MiwgNTMsIDU0LCA1NSwgNTYsIDU3LCA1OCwgNTksIDYwLCA2MSwgNjIsIDYzLAorICAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwKKyAgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsCisgIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LAorICA0OCwgNDksIDUwLCA1MSwgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNTgsIDU5LCA2MCwgNjEsIDYyLCA2MywKKyAgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsCisgIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLAorICAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywKKyAgNDgsIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjMsCisgIDY0LCA2NSwgNjYsIDY3LCA2OCwgNjksIDcwLCA3MSwgNzIsIDczLCA3NCwgNzUsIDc2LCA3NywgNzgsIDc5LAorICA4MCwgODEsIDgyLCA4MywgODQsIDg1LCA4NiwgODcsIDg4LCA4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwKKyAgOTYsIDk3LCA5OCwgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsCisgIDExMiwgMTEzLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LCAxMjAsIDEyMSwgMTIyLCAxMjMsIDEyNCwgMTI1LCAxMjYsCisgIDEyNywKKyAgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsCisgIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLAorICAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywKKyAgNDgsIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjMsCisgIDY0LCA2NSwgNjYsIDY3LCA2OCwgNjksIDcwLCA3MSwgNzIsIDczLCA3NCwgNzUsIDc2LCA3NywgNzgsIDc5LAorICA4MCwgODEsIDgyLCA4MywgODQsIDg1LCA4NiwgODcsIDg4LCA4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwKKyAgOTYsIDk3LCA5OCwgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsCisgIDExMiwgMTEzLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LCAxMjAsIDEyMSwgMTIyLCAxMjMsIDEyNCwgMTI1LCAxMjYKK307CisKK3N0YXRpYyBmbG9hdCBGYXN0U0xvZzJTbG93X0ModWludDMyX3QgdikgeworICBhc3NlcnQodiA+PSBMT0dfTE9PS1VQX0lEWF9NQVgpOworICBpZiAodiA8IEFQUFJPWF9MT0dfV0lUSF9DT1JSRUNUSU9OX01BWCkgeworICAgIGludCBsb2dfY250ID0gMDsKKyAgICB1aW50MzJfdCB5ID0gMTsKKyAgICBpbnQgY29ycmVjdGlvbiA9IDA7CisgICAgY29uc3QgZmxvYXQgdl9mID0gKGZsb2F0KXY7CisgICAgY29uc3QgdWludDMyX3Qgb3JpZ192ID0gdjsKKyAgICBkbyB7CisgICAgICArK2xvZ19jbnQ7CisgICAgICB2ID0gdiA+PiAxOworICAgICAgeSA9IHkgPDwgMTsKKyAgICB9IHdoaWxlICh2ID49IExPR19MT09LVVBfSURYX01BWCk7CisgICAgLy8gdmYgPSAoMl5sb2dfY250KSAqIFhmOyB3aGVyZSB5ID0gMl5sb2dfY250IGFuZCBYZiA8IDI1NgorICAgIC8vIFhmID0gZmxvb3IoWGYpICogKDEgKyAodiAlIHkpIC8gdikKKyAgICAvLyBsb2cyKFhmKSA9IGxvZzIoZmxvb3IoWGYpKSArIGxvZzIoMSArICh2ICUgeSkgLyB2KQorICAgIC8vIFRoZSBjb3JyZWN0aW9uIGZhY3RvcjogbG9nKDEgKyBkKSB+IGQ7IGZvciB2ZXJ5IHNtYWxsIGQgdmFsdWVzLCBzbworICAgIC8vIGxvZzIoMSArICh2ICUgeSkgLyB2KSB+IExPR18yX1JFQ0lQUk9DQUwgKiAodiAlIHkpL3YKKyAgICAvLyBMT0dfMl9SRUNJUFJPQ0FMIH4gMjMvMTYKKyAgICBjb3JyZWN0aW9uID0gKDIzICogKG9yaWdfdiAmICh5IC0gMSkpKSA+PiA0OworICAgIHJldHVybiB2X2YgKiAoa0xvZzJUYWJsZVt2XSArIGxvZ19jbnQpICsgY29ycmVjdGlvbjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gKGZsb2F0KShMT0dfMl9SRUNJUFJPQ0FMICogdiAqIGxvZygoZG91YmxlKXYpKTsKKyAgfQorfQorCitzdGF0aWMgZmxvYXQgRmFzdExvZzJTbG93X0ModWludDMyX3QgdikgeworICBhc3NlcnQodiA+PSBMT0dfTE9PS1VQX0lEWF9NQVgpOworICBpZiAodiA8IEFQUFJPWF9MT0dfV0lUSF9DT1JSRUNUSU9OX01BWCkgeworICAgIGludCBsb2dfY250ID0gMDsKKyAgICB1aW50MzJfdCB5ID0gMTsKKyAgICBjb25zdCB1aW50MzJfdCBvcmlnX3YgPSB2OworICAgIGRvdWJsZSBsb2dfMjsKKyAgICBkbyB7CisgICAgICArK2xvZ19jbnQ7CisgICAgICB2ID0gdiA+PiAxOworICAgICAgeSA9IHkgPDwgMTsKKyAgICB9IHdoaWxlICh2ID49IExPR19MT09LVVBfSURYX01BWCk7CisgICAgbG9nXzIgPSBrTG9nMlRhYmxlW3ZdICsgbG9nX2NudDsKKyAgICBpZiAob3JpZ192ID49IEFQUFJPWF9MT0dfTUFYKSB7CisgICAgICAvLyBTaW5jZSB0aGUgZGl2aXNpb24gaXMgc3RpbGwgZXhwZW5zaXZlLCBhZGQgdGhpcyBjb3JyZWN0aW9uIGZhY3RvciBvbmx5CisgICAgICAvLyBmb3IgbGFyZ2UgdmFsdWVzIG9mICd2Jy4KKyAgICAgIGNvbnN0IGludCBjb3JyZWN0aW9uID0gKDIzICogKG9yaWdfdiAmICh5IC0gMSkpKSA+PiA0OworICAgICAgbG9nXzIgKz0gKGRvdWJsZSljb3JyZWN0aW9uIC8gb3JpZ192OworICAgIH0KKyAgICByZXR1cm4gKGZsb2F0KWxvZ18yOworICB9IGVsc2UgeworICAgIHJldHVybiAoZmxvYXQpKExPR18yX1JFQ0lQUk9DQUwgKiBsb2coKGRvdWJsZSl2KSk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1ldGhvZHMgdG8gY2FsY3VsYXRlIEVudHJvcHkgKFNoYW5ub24pLgorCisvLyBDb21wdXRlIHRoZSBjb21iaW5lZCBTaGFub24ncyBlbnRyb3B5IGZvciBkaXN0cmlidXRpb24ge1h9IGFuZCB7WCtZfQorc3RhdGljIGZsb2F0IENvbWJpbmVkU2hhbm5vbkVudHJvcHlfQyhjb25zdCBpbnQgWFsyNTZdLCBjb25zdCBpbnQgWVsyNTZdKSB7CisgIGludCBpOworICBkb3VibGUgcmV0dmFsID0gMC47CisgIGludCBzdW1YID0gMCwgc3VtWFkgPSAwOworICBmb3IgKGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKKyAgICBjb25zdCBpbnQgeCA9IFhbaV07CisgICAgaWYgKHggIT0gMCkgeworICAgICAgY29uc3QgaW50IHh5ID0geCArIFlbaV07CisgICAgICBzdW1YICs9IHg7CisgICAgICByZXR2YWwgLT0gVlA4TEZhc3RTTG9nMih4KTsKKyAgICAgIHN1bVhZICs9IHh5OworICAgICAgcmV0dmFsIC09IFZQOExGYXN0U0xvZzIoeHkpOworICAgIH0gZWxzZSBpZiAoWVtpXSAhPSAwKSB7CisgICAgICBzdW1YWSArPSBZW2ldOworICAgICAgcmV0dmFsIC09IFZQOExGYXN0U0xvZzIoWVtpXSk7CisgICAgfQorICB9CisgIHJldHZhbCArPSBWUDhMRmFzdFNMb2cyKHN1bVgpICsgVlA4TEZhc3RTTG9nMihzdW1YWSk7CisgIHJldHVybiAoZmxvYXQpcmV0dmFsOworfQorCit2b2lkIFZQOExCaXRFbnRyb3B5SW5pdChWUDhMQml0RW50cm9weSogY29uc3QgZW50cm9weSkgeworICBlbnRyb3B5LT5lbnRyb3B5ID0gMC47CisgIGVudHJvcHktPnN1bSA9IDA7CisgIGVudHJvcHktPm5vbnplcm9zID0gMDsKKyAgZW50cm9weS0+bWF4X3ZhbCA9IDA7CisgIGVudHJvcHktPm5vbnplcm9fY29kZSA9IFZQOExfTk9OX1RSSVZJQUxfU1lNOworfQorCit2b2lkIFZQOExCaXRzRW50cm9weVVucmVmaW5lZChjb25zdCB1aW50MzJfdCogY29uc3QgYXJyYXksIGludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEJpdEVudHJvcHkqIGNvbnN0IGVudHJvcHkpIHsKKyAgaW50IGk7CisKKyAgVlA4TEJpdEVudHJvcHlJbml0KGVudHJvcHkpOworCisgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKKyAgICBpZiAoYXJyYXlbaV0gIT0gMCkgeworICAgICAgZW50cm9weS0+c3VtICs9IGFycmF5W2ldOworICAgICAgZW50cm9weS0+bm9uemVyb19jb2RlID0gaTsKKyAgICAgICsrZW50cm9weS0+bm9uemVyb3M7CisgICAgICBlbnRyb3B5LT5lbnRyb3B5IC09IFZQOExGYXN0U0xvZzIoYXJyYXlbaV0pOworICAgICAgaWYgKGVudHJvcHktPm1heF92YWwgPCBhcnJheVtpXSkgeworICAgICAgICBlbnRyb3B5LT5tYXhfdmFsID0gYXJyYXlbaV07CisgICAgICB9CisgICAgfQorICB9CisgIGVudHJvcHktPmVudHJvcHkgKz0gVlA4TEZhc3RTTG9nMihlbnRyb3B5LT5zdW0pOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBHZXRFbnRyb3B5VW5yZWZpbmVkSGVscGVyKAorICAgIHVpbnQzMl90IHZhbCwgaW50IGksIHVpbnQzMl90KiBjb25zdCB2YWxfcHJldiwgaW50KiBjb25zdCBpX3ByZXYsCisgICAgVlA4TEJpdEVudHJvcHkqIGNvbnN0IGJpdF9lbnRyb3B5LCBWUDhMU3RyZWFrcyogY29uc3Qgc3RhdHMpIHsKKyAgY29uc3QgaW50IHN0cmVhayA9IGkgLSAqaV9wcmV2OworCisgIC8vIEdhdGhlciBpbmZvIGZvciB0aGUgYml0IGVudHJvcHkuCisgIGlmICgqdmFsX3ByZXYgIT0gMCkgeworICAgIGJpdF9lbnRyb3B5LT5zdW0gKz0gKCp2YWxfcHJldikgKiBzdHJlYWs7CisgICAgYml0X2VudHJvcHktPm5vbnplcm9zICs9IHN0cmVhazsKKyAgICBiaXRfZW50cm9weS0+bm9uemVyb19jb2RlID0gKmlfcHJldjsKKyAgICBiaXRfZW50cm9weS0+ZW50cm9weSAtPSBWUDhMRmFzdFNMb2cyKCp2YWxfcHJldikgKiBzdHJlYWs7CisgICAgaWYgKGJpdF9lbnRyb3B5LT5tYXhfdmFsIDwgKnZhbF9wcmV2KSB7CisgICAgICBiaXRfZW50cm9weS0+bWF4X3ZhbCA9ICp2YWxfcHJldjsKKyAgICB9CisgIH0KKworICAvLyBHYXRoZXIgaW5mbyBmb3IgdGhlIEh1ZmZtYW4gY29zdC4KKyAgc3RhdHMtPmNvdW50c1sqdmFsX3ByZXYgIT0gMF0gKz0gKHN0cmVhayA+IDMpOworICBzdGF0cy0+c3RyZWFrc1sqdmFsX3ByZXYgIT0gMF1bKHN0cmVhayA+IDMpXSArPSBzdHJlYWs7CisKKyAgKnZhbF9wcmV2ID0gdmFsOworICAqaV9wcmV2ID0gaTsKK30KKworc3RhdGljIHZvaWQgR2V0RW50cm9weVVucmVmaW5lZF9DKGNvbnN0IHVpbnQzMl90IFhbXSwgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQml0RW50cm9weSogY29uc3QgYml0X2VudHJvcHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TFN0cmVha3MqIGNvbnN0IHN0YXRzKSB7CisgIGludCBpOworICBpbnQgaV9wcmV2ID0gMDsKKyAgdWludDMyX3QgeF9wcmV2ID0gWFswXTsKKworICBtZW1zZXQoc3RhdHMsIDAsIHNpemVvZigqc3RhdHMpKTsKKyAgVlA4TEJpdEVudHJvcHlJbml0KGJpdF9lbnRyb3B5KTsKKworICBmb3IgKGkgPSAxOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICBjb25zdCB1aW50MzJfdCB4ID0gWFtpXTsKKyAgICBpZiAoeCAhPSB4X3ByZXYpIHsKKyAgICAgIEdldEVudHJvcHlVbnJlZmluZWRIZWxwZXIoeCwgaSwgJnhfcHJldiwgJmlfcHJldiwgYml0X2VudHJvcHksIHN0YXRzKTsKKyAgICB9CisgIH0KKyAgR2V0RW50cm9weVVucmVmaW5lZEhlbHBlcigwLCBpLCAmeF9wcmV2LCAmaV9wcmV2LCBiaXRfZW50cm9weSwgc3RhdHMpOworCisgIGJpdF9lbnRyb3B5LT5lbnRyb3B5ICs9IFZQOExGYXN0U0xvZzIoYml0X2VudHJvcHktPnN1bSk7Cit9CisKK3N0YXRpYyB2b2lkIEdldENvbWJpbmVkRW50cm9weVVucmVmaW5lZF9DKGNvbnN0IHVpbnQzMl90IFhbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IFlbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQml0RW50cm9weSogY29uc3QgYml0X2VudHJvcHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMU3RyZWFrcyogY29uc3Qgc3RhdHMpIHsKKyAgaW50IGkgPSAxOworICBpbnQgaV9wcmV2ID0gMDsKKyAgdWludDMyX3QgeHlfcHJldiA9IFhbMF0gKyBZWzBdOworCisgIG1lbXNldChzdGF0cywgMCwgc2l6ZW9mKCpzdGF0cykpOworICBWUDhMQml0RW50cm9weUluaXQoYml0X2VudHJvcHkpOworCisgIGZvciAoaSA9IDE7IGkgPCBsZW5ndGg7ICsraSkgeworICAgIGNvbnN0IHVpbnQzMl90IHh5ID0gWFtpXSArIFlbaV07CisgICAgaWYgKHh5ICE9IHh5X3ByZXYpIHsKKyAgICAgIEdldEVudHJvcHlVbnJlZmluZWRIZWxwZXIoeHksIGksICZ4eV9wcmV2LCAmaV9wcmV2LCBiaXRfZW50cm9weSwgc3RhdHMpOworICAgIH0KKyAgfQorICBHZXRFbnRyb3B5VW5yZWZpbmVkSGVscGVyKDAsIGksICZ4eV9wcmV2LCAmaV9wcmV2LCBiaXRfZW50cm9weSwgc3RhdHMpOworCisgIGJpdF9lbnRyb3B5LT5lbnRyb3B5ICs9IFZQOExGYXN0U0xvZzIoYml0X2VudHJvcHktPnN1bSk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgVlA4TFN1YnRyYWN0R3JlZW5Gcm9tQmx1ZUFuZFJlZF9DKHVpbnQzMl90KiBhcmdiX2RhdGEsIGludCBudW1fcGl4ZWxzKSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BpeGVsczsgKytpKSB7CisgICAgY29uc3QgaW50IGFyZ2IgPSBhcmdiX2RhdGFbaV07CisgICAgY29uc3QgaW50IGdyZWVuID0gKGFyZ2IgPj4gOCkgJiAweGZmOworICAgIGNvbnN0IHVpbnQzMl90IG5ld19yID0gKCgoYXJnYiA+PiAxNikgJiAweGZmKSAtIGdyZWVuKSAmIDB4ZmY7CisgICAgY29uc3QgdWludDMyX3QgbmV3X2IgPSAoKChhcmdiID4+ICAwKSAmIDB4ZmYpIC0gZ3JlZW4pICYgMHhmZjsKKyAgICBhcmdiX2RhdGFbaV0gPSAoYXJnYiAmIDB4ZmYwMGZmMDB1KSB8IChuZXdfciA8PCAxNikgfCBuZXdfYjsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IENvbG9yVHJhbnNmb3JtRGVsdGEoaW50OF90IGNvbG9yX3ByZWQsIGludDhfdCBjb2xvcikgeworICByZXR1cm4gKChpbnQpY29sb3JfcHJlZCAqIGNvbG9yKSA+PiA1OworfQorCit2b2lkIFZQOExUcmFuc2Zvcm1Db2xvcl9DKGNvbnN0IFZQOExNdWx0aXBsaWVycyogY29uc3QgbSwgdWludDMyX3QqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzKSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BpeGVsczsgKytpKSB7CisgICAgY29uc3QgdWludDMyX3QgYXJnYiA9IGRhdGFbaV07CisgICAgY29uc3QgdWludDMyX3QgZ3JlZW4gPSBhcmdiID4+IDg7CisgICAgY29uc3QgdWludDMyX3QgcmVkID0gYXJnYiA+PiAxNjsKKyAgICBpbnQgbmV3X3JlZCA9IHJlZCAmIDB4ZmY7CisgICAgaW50IG5ld19ibHVlID0gYXJnYiAmIDB4ZmY7CisgICAgbmV3X3JlZCAtPSBDb2xvclRyYW5zZm9ybURlbHRhKG0tPmdyZWVuX3RvX3JlZF8sIGdyZWVuKTsKKyAgICBuZXdfcmVkICY9IDB4ZmY7CisgICAgbmV3X2JsdWUgLT0gQ29sb3JUcmFuc2Zvcm1EZWx0YShtLT5ncmVlbl90b19ibHVlXywgZ3JlZW4pOworICAgIG5ld19ibHVlIC09IENvbG9yVHJhbnNmb3JtRGVsdGEobS0+cmVkX3RvX2JsdWVfLCByZWQpOworICAgIG5ld19ibHVlICY9IDB4ZmY7CisgICAgZGF0YVtpXSA9IChhcmdiICYgMHhmZjAwZmYwMHUpIHwgKG5ld19yZWQgPDwgMTYpIHwgKG5ld19ibHVlKTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDhfdCBUcmFuc2Zvcm1Db2xvclJlZCh1aW50OF90IGdyZWVuX3RvX3JlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFyZ2IpIHsKKyAgY29uc3QgdWludDMyX3QgZ3JlZW4gPSBhcmdiID4+IDg7CisgIGludCBuZXdfcmVkID0gYXJnYiA+PiAxNjsKKyAgbmV3X3JlZCAtPSBDb2xvclRyYW5zZm9ybURlbHRhKGdyZWVuX3RvX3JlZCwgZ3JlZW4pOworICByZXR1cm4gKG5ld19yZWQgJiAweGZmKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ4X3QgVHJhbnNmb3JtQ29sb3JCbHVlKHVpbnQ4X3QgZ3JlZW5fdG9fYmx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJlZF90b19ibHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFyZ2IpIHsKKyAgY29uc3QgdWludDMyX3QgZ3JlZW4gPSBhcmdiID4+IDg7CisgIGNvbnN0IHVpbnQzMl90IHJlZCA9IGFyZ2IgPj4gMTY7CisgIHVpbnQ4X3QgbmV3X2JsdWUgPSBhcmdiOworICBuZXdfYmx1ZSAtPSBDb2xvclRyYW5zZm9ybURlbHRhKGdyZWVuX3RvX2JsdWUsIGdyZWVuKTsKKyAgbmV3X2JsdWUgLT0gQ29sb3JUcmFuc2Zvcm1EZWx0YShyZWRfdG9fYmx1ZSwgcmVkKTsKKyAgcmV0dXJuIChuZXdfYmx1ZSAmIDB4ZmYpOworfQorCit2b2lkIFZQOExDb2xsZWN0Q29sb3JSZWRUcmFuc2Zvcm1zX0MoY29uc3QgdWludDMyX3QqIGFyZ2IsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbGVfd2lkdGgsIGludCB0aWxlX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3JlZW5fdG9fcmVkLCBpbnQgaGlzdG9bXSkgeworICB3aGlsZSAodGlsZV9oZWlnaHQtLSA+IDApIHsKKyAgICBpbnQgeDsKKyAgICBmb3IgKHggPSAwOyB4IDwgdGlsZV93aWR0aDsgKyt4KSB7CisgICAgICArK2hpc3RvW1RyYW5zZm9ybUNvbG9yUmVkKGdyZWVuX3RvX3JlZCwgYXJnYlt4XSldOworICAgIH0KKyAgICBhcmdiICs9IHN0cmlkZTsKKyAgfQorfQorCit2b2lkIFZQOExDb2xsZWN0Q29sb3JCbHVlVHJhbnNmb3Jtc19DKGNvbnN0IHVpbnQzMl90KiBhcmdiLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGlsZV93aWR0aCwgaW50IHRpbGVfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3JlZW5fdG9fYmx1ZSwgaW50IHJlZF90b19ibHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGlzdG9bXSkgeworICB3aGlsZSAodGlsZV9oZWlnaHQtLSA+IDApIHsKKyAgICBpbnQgeDsKKyAgICBmb3IgKHggPSAwOyB4IDwgdGlsZV93aWR0aDsgKyt4KSB7CisgICAgICArK2hpc3RvW1RyYW5zZm9ybUNvbG9yQmx1ZShncmVlbl90b19ibHVlLCByZWRfdG9fYmx1ZSwgYXJnYlt4XSldOworICAgIH0KKyAgICBhcmdiICs9IHN0cmlkZTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50IFZlY3Rvck1pc21hdGNoX0MoY29uc3QgdWludDMyX3QqIGNvbnN0IGFycmF5MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgYXJyYXkyLCBpbnQgbGVuZ3RoKSB7CisgIGludCBtYXRjaF9sZW4gPSAwOworCisgIHdoaWxlIChtYXRjaF9sZW4gPCBsZW5ndGggJiYgYXJyYXkxW21hdGNoX2xlbl0gPT0gYXJyYXkyW21hdGNoX2xlbl0pIHsKKyAgICArK21hdGNoX2xlbjsKKyAgfQorICByZXR1cm4gbWF0Y2hfbGVuOworfQorCisvLyBCdW5kbGVzIG11bHRpcGxlICgxLCAyLCA0IG9yIDgpIHBpeGVscyBpbnRvIGEgc2luZ2xlIHBpeGVsLgordm9pZCBWUDhMQnVuZGxlQ29sb3JNYXBfQyhjb25zdCB1aW50OF90KiBjb25zdCByb3csIGludCB3aWR0aCwgaW50IHhiaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZHN0KSB7CisgIGludCB4OworICBpZiAoeGJpdHMgPiAwKSB7CisgICAgY29uc3QgaW50IGJpdF9kZXB0aCA9IDEgPDwgKDMgLSB4Yml0cyk7CisgICAgY29uc3QgaW50IG1hc2sgPSAoMSA8PCB4Yml0cykgLSAxOworICAgIHVpbnQzMl90IGNvZGUgPSAweGZmMDAwMDAwOworICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7CisgICAgICBjb25zdCBpbnQgeHN1YiA9IHggJiBtYXNrOworICAgICAgaWYgKHhzdWIgPT0gMCkgeworICAgICAgICBjb2RlID0gMHhmZjAwMDAwMDsKKyAgICAgIH0KKyAgICAgIGNvZGUgfD0gcm93W3hdIDw8ICg4ICsgYml0X2RlcHRoICogeHN1Yik7CisgICAgICBkc3RbeCA+PiB4Yml0c10gPSBjb2RlOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7ICsreCkgZHN0W3hdID0gMHhmZjAwMDAwMCB8IChyb3dbeF0gPDwgOCk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGRvdWJsZSBFeHRyYUNvc3RfQyhjb25zdCB1aW50MzJfdCogcG9wdWxhdGlvbiwgaW50IGxlbmd0aCkgeworICBpbnQgaTsKKyAgZG91YmxlIGNvc3QgPSAwLjsKKyAgZm9yIChpID0gMjsgaSA8IGxlbmd0aCAtIDI7ICsraSkgY29zdCArPSAoaSA+PiAxKSAqIHBvcHVsYXRpb25baSArIDJdOworICByZXR1cm4gY29zdDsKK30KKworc3RhdGljIGRvdWJsZSBFeHRyYUNvc3RDb21iaW5lZF9DKGNvbnN0IHVpbnQzMl90KiBYLCBjb25zdCB1aW50MzJfdCogWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoKSB7CisgIGludCBpOworICBkb3VibGUgY29zdCA9IDAuOworICBmb3IgKGkgPSAyOyBpIDwgbGVuZ3RoIC0gMjsgKytpKSB7CisgICAgY29uc3QgaW50IHh5ID0gWFtpICsgMl0gKyBZW2kgKyAyXTsKKyAgICBjb3N0ICs9IChpID4+IDEpICogeHk7CisgIH0KKyAgcmV0dXJuIGNvc3Q7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIEhpc3RvZ3JhbUFkZF9DKGNvbnN0IFZQOExIaXN0b2dyYW0qIGNvbnN0IGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEhpc3RvZ3JhbSogY29uc3Qgb3V0KSB7CisgIGludCBpOworICBjb25zdCBpbnQgbGl0ZXJhbF9zaXplID0gVlA4TEhpc3RvZ3JhbU51bUNvZGVzKGEtPnBhbGV0dGVfY29kZV9iaXRzXyk7CisgIGFzc2VydChhLT5wYWxldHRlX2NvZGVfYml0c18gPT0gYi0+cGFsZXR0ZV9jb2RlX2JpdHNfKTsKKyAgaWYgKGIgIT0gb3V0KSB7CisgICAgZm9yIChpID0gMDsgaSA8IGxpdGVyYWxfc2l6ZTsgKytpKSB7CisgICAgICBvdXQtPmxpdGVyYWxfW2ldID0gYS0+bGl0ZXJhbF9baV0gKyBiLT5saXRlcmFsX1tpXTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IE5VTV9ESVNUQU5DRV9DT0RFUzsgKytpKSB7CisgICAgICBvdXQtPmRpc3RhbmNlX1tpXSA9IGEtPmRpc3RhbmNlX1tpXSArIGItPmRpc3RhbmNlX1tpXTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IE5VTV9MSVRFUkFMX0NPREVTOyArK2kpIHsKKyAgICAgIG91dC0+cmVkX1tpXSA9IGEtPnJlZF9baV0gKyBiLT5yZWRfW2ldOworICAgICAgb3V0LT5ibHVlX1tpXSA9IGEtPmJsdWVfW2ldICsgYi0+Ymx1ZV9baV07CisgICAgICBvdXQtPmFscGhhX1tpXSA9IGEtPmFscGhhX1tpXSArIGItPmFscGhhX1tpXTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChpID0gMDsgaSA8IGxpdGVyYWxfc2l6ZTsgKytpKSB7CisgICAgICBvdXQtPmxpdGVyYWxfW2ldICs9IGEtPmxpdGVyYWxfW2ldOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX0RJU1RBTkNFX0NPREVTOyArK2kpIHsKKyAgICAgIG91dC0+ZGlzdGFuY2VfW2ldICs9IGEtPmRpc3RhbmNlX1tpXTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IE5VTV9MSVRFUkFMX0NPREVTOyArK2kpIHsKKyAgICAgIG91dC0+cmVkX1tpXSArPSBhLT5yZWRfW2ldOworICAgICAgb3V0LT5ibHVlX1tpXSArPSBhLT5ibHVlX1tpXTsKKyAgICAgIG91dC0+YWxwaGFfW2ldICs9IGEtPmFscGhhX1tpXTsKKyAgICB9CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEltYWdlIHRyYW5zZm9ybXMuCisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBBdmVyYWdlMih1aW50MzJfdCBhMCwgdWludDMyX3QgYTEpIHsKKyAgcmV0dXJuICgoKGEwIF4gYTEpICYgMHhmZWZlZmVmZXUpID4+IDEpICsgKGEwICYgYTEpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQXZlcmFnZTModWludDMyX3QgYTAsIHVpbnQzMl90IGExLCB1aW50MzJfdCBhMikgeworICByZXR1cm4gQXZlcmFnZTIoQXZlcmFnZTIoYTAsIGEyKSwgYTEpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQXZlcmFnZTQodWludDMyX3QgYTAsIHVpbnQzMl90IGExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGEyLCB1aW50MzJfdCBhMykgeworICByZXR1cm4gQXZlcmFnZTIoQXZlcmFnZTIoYTAsIGExKSwgQXZlcmFnZTIoYTIsIGEzKSk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBDbGlwMjU1KHVpbnQzMl90IGEpIHsKKyAgaWYgKGEgPCAyNTYpIHsKKyAgICByZXR1cm4gYTsKKyAgfQorICAvLyByZXR1cm4gMCwgd2hlbiBhIGlzIGEgbmVnYXRpdmUgaW50ZWdlci4KKyAgLy8gcmV0dXJuIDI1NSwgd2hlbiBhIGlzIHBvc2l0aXZlLgorICByZXR1cm4gfmEgPj4gMjQ7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgQWRkU3VidHJhY3RDb21wb25lbnRGdWxsKGludCBhLCBpbnQgYiwgaW50IGMpIHsKKyAgcmV0dXJuIENsaXAyNTUoYSArIGIgLSBjKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IENsYW1wZWRBZGRTdWJ0cmFjdEZ1bGwodWludDMyX3QgYzAsIHVpbnQzMl90IGMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYzIpIHsKKyAgY29uc3QgaW50IGEgPSBBZGRTdWJ0cmFjdENvbXBvbmVudEZ1bGwoYzAgPj4gMjQsIGMxID4+IDI0LCBjMiA+PiAyNCk7CisgIGNvbnN0IGludCByID0gQWRkU3VidHJhY3RDb21wb25lbnRGdWxsKChjMCA+PiAxNikgJiAweGZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYzEgPj4gMTYpICYgMHhmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGMyID4+IDE2KSAmIDB4ZmYpOworICBjb25zdCBpbnQgZyA9IEFkZFN1YnRyYWN0Q29tcG9uZW50RnVsbCgoYzAgPj4gOCkgJiAweGZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYzEgPj4gOCkgJiAweGZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYzIgPj4gOCkgJiAweGZmKTsKKyAgY29uc3QgaW50IGIgPSBBZGRTdWJ0cmFjdENvbXBvbmVudEZ1bGwoYzAgJiAweGZmLCBjMSAmIDB4ZmYsIGMyICYgMHhmZik7CisgIHJldHVybiAoKHVpbnQzMl90KWEgPDwgMjQpIHwgKHIgPDwgMTYpIHwgKGcgPDwgOCkgfCBiOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IEFkZFN1YnRyYWN0Q29tcG9uZW50SGFsZihpbnQgYSwgaW50IGIpIHsKKyAgcmV0dXJuIENsaXAyNTUoYSArIChhIC0gYikgLyAyKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IENsYW1wZWRBZGRTdWJ0cmFjdEhhbGYodWludDMyX3QgYzAsIHVpbnQzMl90IGMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYzIpIHsKKyAgY29uc3QgdWludDMyX3QgYXZlID0gQXZlcmFnZTIoYzAsIGMxKTsKKyAgY29uc3QgaW50IGEgPSBBZGRTdWJ0cmFjdENvbXBvbmVudEhhbGYoYXZlID4+IDI0LCBjMiA+PiAyNCk7CisgIGNvbnN0IGludCByID0gQWRkU3VidHJhY3RDb21wb25lbnRIYWxmKChhdmUgPj4gMTYpICYgMHhmZiwgKGMyID4+IDE2KSAmIDB4ZmYpOworICBjb25zdCBpbnQgZyA9IEFkZFN1YnRyYWN0Q29tcG9uZW50SGFsZigoYXZlID4+IDgpICYgMHhmZiwgKGMyID4+IDgpICYgMHhmZik7CisgIGNvbnN0IGludCBiID0gQWRkU3VidHJhY3RDb21wb25lbnRIYWxmKChhdmUgPj4gMCkgJiAweGZmLCAoYzIgPj4gMCkgJiAweGZmKTsKKyAgcmV0dXJuICgodWludDMyX3QpYSA8PCAyNCkgfCAociA8PCAxNikgfCAoZyA8PCA4KSB8IGI7Cit9CisKKy8vIGdjYy00Ljkgb24gQVJNIGdlbmVyYXRlcyBpbmNvcnJlY3QgY29kZSBpbiBTZWxlY3QoKSB3aGVuIFN1YjMoKSBpcyBpbmxpbmVkLgorI2lmIGRlZmluZWQoX19hcm1fXykgJiYgXAorICAgIChMT0NBTF9HQ0NfVkVSU0lPTiA9PSAweDQwOSB8fCBMT0NBTF9HQ0NfVkVSU0lPTiA9PSAweDQwOCkKKyMgZGVmaW5lIExPQ0FMX0lOTElORSBfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKQorI2Vsc2UKKyMgZGVmaW5lIExPQ0FMX0lOTElORSBXRUJQX0lOTElORQorI2VuZGlmCisKK3N0YXRpYyBMT0NBTF9JTkxJTkUgaW50IFN1YjMoaW50IGEsIGludCBiLCBpbnQgYykgeworICBjb25zdCBpbnQgcGIgPSBiIC0gYzsKKyAgY29uc3QgaW50IHBhID0gYSAtIGM7CisgIHJldHVybiBhYnMocGIpIC0gYWJzKHBhKTsKK30KKworI3VuZGVmIExPQ0FMX0lOTElORQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgU2VsZWN0KHVpbnQzMl90IGEsIHVpbnQzMl90IGIsIHVpbnQzMl90IGMpIHsKKyAgY29uc3QgaW50IHBhX21pbnVzX3BiID0KKyAgICAgIFN1YjMoKGEgPj4gMjQpICAgICAgICwgKGIgPj4gMjQpICAgICAgICwgKGMgPj4gMjQpICAgICAgICkgKworICAgICAgU3ViMygoYSA+PiAxNikgJiAweGZmLCAoYiA+PiAxNikgJiAweGZmLCAoYyA+PiAxNikgJiAweGZmKSArCisgICAgICBTdWIzKChhID4+ICA4KSAmIDB4ZmYsIChiID4+ICA4KSAmIDB4ZmYsIChjID4+ICA4KSAmIDB4ZmYpICsKKyAgICAgIFN1YjMoKGEgICAgICApICYgMHhmZiwgKGIgICAgICApICYgMHhmZiwgKGMgICAgICApICYgMHhmZik7CisgIHJldHVybiAocGFfbWludXNfcGIgPD0gMCkgPyBhIDogYjsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFByZWRpY3RvcnMKKworc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjIodWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICAodm9pZClsZWZ0OworICByZXR1cm4gdG9wWzBdOworfQorc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjModWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICAodm9pZClsZWZ0OworICByZXR1cm4gdG9wWzFdOworfQorc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjQodWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICAodm9pZClsZWZ0OworICByZXR1cm4gdG9wWy0xXTsKK30KK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3I1KHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgY29uc3QgdWludDMyX3QgcHJlZCA9IEF2ZXJhZ2UzKGxlZnQsIHRvcFswXSwgdG9wWzFdKTsKKyAgcmV0dXJuIHByZWQ7Cit9CitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yNih1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgIGNvbnN0IHVpbnQzMl90IHByZWQgPSBBdmVyYWdlMihsZWZ0LCB0b3BbLTFdKTsKKyAgcmV0dXJuIHByZWQ7Cit9CitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yNyh1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgIGNvbnN0IHVpbnQzMl90IHByZWQgPSBBdmVyYWdlMihsZWZ0LCB0b3BbMF0pOworICByZXR1cm4gcHJlZDsKK30KK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3I4KHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgY29uc3QgdWludDMyX3QgcHJlZCA9IEF2ZXJhZ2UyKHRvcFstMV0sIHRvcFswXSk7CisgICh2b2lkKWxlZnQ7CisgIHJldHVybiBwcmVkOworfQorc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjkodWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICBjb25zdCB1aW50MzJfdCBwcmVkID0gQXZlcmFnZTIodG9wWzBdLCB0b3BbMV0pOworICAodm9pZClsZWZ0OworICByZXR1cm4gcHJlZDsKK30KK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3IxMCh1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgIGNvbnN0IHVpbnQzMl90IHByZWQgPSBBdmVyYWdlNChsZWZ0LCB0b3BbLTFdLCB0b3BbMF0sIHRvcFsxXSk7CisgIHJldHVybiBwcmVkOworfQorc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjExKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgY29uc3QgdWludDMyX3QgcHJlZCA9IFNlbGVjdCh0b3BbMF0sIGxlZnQsIHRvcFstMV0pOworICByZXR1cm4gcHJlZDsKK30KK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3IxMih1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgIGNvbnN0IHVpbnQzMl90IHByZWQgPSBDbGFtcGVkQWRkU3VidHJhY3RGdWxsKGxlZnQsIHRvcFswXSwgdG9wWy0xXSk7CisgIHJldHVybiBwcmVkOworfQorc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjEzKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgY29uc3QgdWludDMyX3QgcHJlZCA9IENsYW1wZWRBZGRTdWJ0cmFjdEhhbGYobGVmdCwgdG9wWzBdLCB0b3BbLTFdKTsKKyAgcmV0dXJuIHByZWQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIFByZWRpY3RvclN1YjBfQyhjb25zdCB1aW50MzJfdCogaW4sIGNvbnN0IHVpbnQzMl90KiB1cHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDMyX3QqIG91dCkgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IG51bV9waXhlbHM7ICsraSkgb3V0W2ldID0gVlA4TFN1YlBpeGVscyhpbltpXSwgQVJHQl9CTEFDSyk7CisgICh2b2lkKXVwcGVyOworfQorCitzdGF0aWMgdm9pZCBQcmVkaWN0b3JTdWIxX0MoY29uc3QgdWludDMyX3QqIGluLCBjb25zdCB1aW50MzJfdCogdXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQzMl90KiBvdXQpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBudW1fcGl4ZWxzOyArK2kpIG91dFtpXSA9IFZQOExTdWJQaXhlbHMoaW5baV0sIGluW2kgLSAxXSk7CisgICh2b2lkKXVwcGVyOworfQorCitHRU5FUkFURV9QUkVESUNUT1JfU1VCKFByZWRpY3RvcjIsIFByZWRpY3RvclN1YjJfQykKK0dFTkVSQVRFX1BSRURJQ1RPUl9TVUIoUHJlZGljdG9yMywgUHJlZGljdG9yU3ViM19DKQorR0VORVJBVEVfUFJFRElDVE9SX1NVQihQcmVkaWN0b3I0LCBQcmVkaWN0b3JTdWI0X0MpCitHRU5FUkFURV9QUkVESUNUT1JfU1VCKFByZWRpY3RvcjUsIFByZWRpY3RvclN1YjVfQykKK0dFTkVSQVRFX1BSRURJQ1RPUl9TVUIoUHJlZGljdG9yNiwgUHJlZGljdG9yU3ViNl9DKQorR0VORVJBVEVfUFJFRElDVE9SX1NVQihQcmVkaWN0b3I3LCBQcmVkaWN0b3JTdWI3X0MpCitHRU5FUkFURV9QUkVESUNUT1JfU1VCKFByZWRpY3RvcjgsIFByZWRpY3RvclN1YjhfQykKK0dFTkVSQVRFX1BSRURJQ1RPUl9TVUIoUHJlZGljdG9yOSwgUHJlZGljdG9yU3ViOV9DKQorR0VORVJBVEVfUFJFRElDVE9SX1NVQihQcmVkaWN0b3IxMCwgUHJlZGljdG9yU3ViMTBfQykKK0dFTkVSQVRFX1BSRURJQ1RPUl9TVUIoUHJlZGljdG9yMTEsIFByZWRpY3RvclN1YjExX0MpCitHRU5FUkFURV9QUkVESUNUT1JfU1VCKFByZWRpY3RvcjEyLCBQcmVkaWN0b3JTdWIxMl9DKQorR0VORVJBVEVfUFJFRElDVE9SX1NVQihQcmVkaWN0b3IxMywgUHJlZGljdG9yU3ViMTNfQykKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVlA4TFByb2Nlc3NFbmNCbHVlQW5kUmVkRnVuYyBWUDhMU3VidHJhY3RHcmVlbkZyb21CbHVlQW5kUmVkOworCitWUDhMVHJhbnNmb3JtQ29sb3JGdW5jIFZQOExUcmFuc2Zvcm1Db2xvcjsKKworVlA4TENvbGxlY3RDb2xvckJsdWVUcmFuc2Zvcm1zRnVuYyBWUDhMQ29sbGVjdENvbG9yQmx1ZVRyYW5zZm9ybXM7CitWUDhMQ29sbGVjdENvbG9yUmVkVHJhbnNmb3Jtc0Z1bmMgVlA4TENvbGxlY3RDb2xvclJlZFRyYW5zZm9ybXM7CisKK1ZQOExGYXN0TG9nMlNsb3dGdW5jIFZQOExGYXN0TG9nMlNsb3c7CitWUDhMRmFzdExvZzJTbG93RnVuYyBWUDhMRmFzdFNMb2cyU2xvdzsKKworVlA4TENvc3RGdW5jIFZQOExFeHRyYUNvc3Q7CitWUDhMQ29zdENvbWJpbmVkRnVuYyBWUDhMRXh0cmFDb3N0Q29tYmluZWQ7CitWUDhMQ29tYmluZWRTaGFubm9uRW50cm9weUZ1bmMgVlA4TENvbWJpbmVkU2hhbm5vbkVudHJvcHk7CisKK1ZQOExHZXRFbnRyb3B5VW5yZWZpbmVkRnVuYyBWUDhMR2V0RW50cm9weVVucmVmaW5lZDsKK1ZQOExHZXRDb21iaW5lZEVudHJvcHlVbnJlZmluZWRGdW5jIFZQOExHZXRDb21iaW5lZEVudHJvcHlVbnJlZmluZWQ7CisKK1ZQOExIaXN0b2dyYW1BZGRGdW5jIFZQOExIaXN0b2dyYW1BZGQ7CisKK1ZQOExWZWN0b3JNaXNtYXRjaEZ1bmMgVlA4TFZlY3Rvck1pc21hdGNoOworVlA4TEJ1bmRsZUNvbG9yTWFwRnVuYyBWUDhMQnVuZGxlQ29sb3JNYXA7CisKK1ZQOExQcmVkaWN0b3JBZGRTdWJGdW5jIFZQOExQcmVkaWN0b3JzU3ViWzE2XTsKK1ZQOExQcmVkaWN0b3JBZGRTdWJGdW5jIFZQOExQcmVkaWN0b3JzU3ViX0NbMTZdOworCitleHRlcm4gdm9pZCBWUDhMRW5jRHNwSW5pdFNTRTIodm9pZCk7CitleHRlcm4gdm9pZCBWUDhMRW5jRHNwSW5pdFNTRTQxKHZvaWQpOworZXh0ZXJuIHZvaWQgVlA4TEVuY0RzcEluaXRORU9OKHZvaWQpOworZXh0ZXJuIHZvaWQgVlA4TEVuY0RzcEluaXRNSVBTMzIodm9pZCk7CitleHRlcm4gdm9pZCBWUDhMRW5jRHNwSW5pdE1JUFNkc3BSMih2b2lkKTsKK2V4dGVybiB2b2lkIFZQOExFbmNEc3BJbml0TVNBKHZvaWQpOworCitXRUJQX0RTUF9JTklUX0ZVTkMoVlA4TEVuY0RzcEluaXQpIHsKKyAgVlA4TERzcEluaXQoKTsKKworI2lmICFXRUJQX05FT05fT01JVF9DX0NPREUKKyAgVlA4TFN1YnRyYWN0R3JlZW5Gcm9tQmx1ZUFuZFJlZCA9IFZQOExTdWJ0cmFjdEdyZWVuRnJvbUJsdWVBbmRSZWRfQzsKKworICBWUDhMVHJhbnNmb3JtQ29sb3IgPSBWUDhMVHJhbnNmb3JtQ29sb3JfQzsKKyNlbmRpZgorCisgIFZQOExDb2xsZWN0Q29sb3JCbHVlVHJhbnNmb3JtcyA9IFZQOExDb2xsZWN0Q29sb3JCbHVlVHJhbnNmb3Jtc19DOworICBWUDhMQ29sbGVjdENvbG9yUmVkVHJhbnNmb3JtcyA9IFZQOExDb2xsZWN0Q29sb3JSZWRUcmFuc2Zvcm1zX0M7CisKKyAgVlA4TEZhc3RMb2cyU2xvdyA9IEZhc3RMb2cyU2xvd19DOworICBWUDhMRmFzdFNMb2cyU2xvdyA9IEZhc3RTTG9nMlNsb3dfQzsKKworICBWUDhMRXh0cmFDb3N0ID0gRXh0cmFDb3N0X0M7CisgIFZQOExFeHRyYUNvc3RDb21iaW5lZCA9IEV4dHJhQ29zdENvbWJpbmVkX0M7CisgIFZQOExDb21iaW5lZFNoYW5ub25FbnRyb3B5ID0gQ29tYmluZWRTaGFubm9uRW50cm9weV9DOworCisgIFZQOExHZXRFbnRyb3B5VW5yZWZpbmVkID0gR2V0RW50cm9weVVucmVmaW5lZF9DOworICBWUDhMR2V0Q29tYmluZWRFbnRyb3B5VW5yZWZpbmVkID0gR2V0Q29tYmluZWRFbnRyb3B5VW5yZWZpbmVkX0M7CisKKyAgVlA4TEhpc3RvZ3JhbUFkZCA9IEhpc3RvZ3JhbUFkZF9DOworCisgIFZQOExWZWN0b3JNaXNtYXRjaCA9IFZlY3Rvck1pc21hdGNoX0M7CisgIFZQOExCdW5kbGVDb2xvck1hcCA9IFZQOExCdW5kbGVDb2xvck1hcF9DOworCisgIFZQOExQcmVkaWN0b3JzU3ViWzBdID0gUHJlZGljdG9yU3ViMF9DOworICBWUDhMUHJlZGljdG9yc1N1YlsxXSA9IFByZWRpY3RvclN1YjFfQzsKKyAgVlA4TFByZWRpY3RvcnNTdWJbMl0gPSBQcmVkaWN0b3JTdWIyX0M7CisgIFZQOExQcmVkaWN0b3JzU3ViWzNdID0gUHJlZGljdG9yU3ViM19DOworICBWUDhMUHJlZGljdG9yc1N1Yls0XSA9IFByZWRpY3RvclN1YjRfQzsKKyAgVlA4TFByZWRpY3RvcnNTdWJbNV0gPSBQcmVkaWN0b3JTdWI1X0M7CisgIFZQOExQcmVkaWN0b3JzU3ViWzZdID0gUHJlZGljdG9yU3ViNl9DOworICBWUDhMUHJlZGljdG9yc1N1Yls3XSA9IFByZWRpY3RvclN1YjdfQzsKKyAgVlA4TFByZWRpY3RvcnNTdWJbOF0gPSBQcmVkaWN0b3JTdWI4X0M7CisgIFZQOExQcmVkaWN0b3JzU3ViWzldID0gUHJlZGljdG9yU3ViOV9DOworICBWUDhMUHJlZGljdG9yc1N1YlsxMF0gPSBQcmVkaWN0b3JTdWIxMF9DOworICBWUDhMUHJlZGljdG9yc1N1YlsxMV0gPSBQcmVkaWN0b3JTdWIxMV9DOworICBWUDhMUHJlZGljdG9yc1N1YlsxMl0gPSBQcmVkaWN0b3JTdWIxMl9DOworICBWUDhMUHJlZGljdG9yc1N1YlsxM10gPSBQcmVkaWN0b3JTdWIxM19DOworICBWUDhMUHJlZGljdG9yc1N1YlsxNF0gPSBQcmVkaWN0b3JTdWIwX0M7ICAvLyA8LSBwYWRkaW5nIHNlY3VyaXR5IHNlbnRpbmVscworICBWUDhMUHJlZGljdG9yc1N1YlsxNV0gPSBQcmVkaWN0b3JTdWIwX0M7CisKKyAgVlA4TFByZWRpY3RvcnNTdWJfQ1swXSA9IFByZWRpY3RvclN1YjBfQzsKKyAgVlA4TFByZWRpY3RvcnNTdWJfQ1sxXSA9IFByZWRpY3RvclN1YjFfQzsKKyAgVlA4TFByZWRpY3RvcnNTdWJfQ1syXSA9IFByZWRpY3RvclN1YjJfQzsKKyAgVlA4TFByZWRpY3RvcnNTdWJfQ1szXSA9IFByZWRpY3RvclN1YjNfQzsKKyAgVlA4TFByZWRpY3RvcnNTdWJfQ1s0XSA9IFByZWRpY3RvclN1YjRfQzsKKyAgVlA4TFByZWRpY3RvcnNTdWJfQ1s1XSA9IFByZWRpY3RvclN1YjVfQzsKKyAgVlA4TFByZWRpY3RvcnNTdWJfQ1s2XSA9IFByZWRpY3RvclN1YjZfQzsKKyAgVlA4TFByZWRpY3RvcnNTdWJfQ1s3XSA9IFByZWRpY3RvclN1YjdfQzsKKyAgVlA4TFByZWRpY3RvcnNTdWJfQ1s4XSA9IFByZWRpY3RvclN1YjhfQzsKKyAgVlA4TFByZWRpY3RvcnNTdWJfQ1s5XSA9IFByZWRpY3RvclN1YjlfQzsKKyAgVlA4TFByZWRpY3RvcnNTdWJfQ1sxMF0gPSBQcmVkaWN0b3JTdWIxMF9DOworICBWUDhMUHJlZGljdG9yc1N1Yl9DWzExXSA9IFByZWRpY3RvclN1YjExX0M7CisgIFZQOExQcmVkaWN0b3JzU3ViX0NbMTJdID0gUHJlZGljdG9yU3ViMTJfQzsKKyAgVlA4TFByZWRpY3RvcnNTdWJfQ1sxM10gPSBQcmVkaWN0b3JTdWIxM19DOworICBWUDhMUHJlZGljdG9yc1N1Yl9DWzE0XSA9IFByZWRpY3RvclN1YjBfQzsgIC8vIDwtIHBhZGRpbmcgc2VjdXJpdHkgc2VudGluZWxzCisgIFZQOExQcmVkaWN0b3JzU3ViX0NbMTVdID0gUHJlZGljdG9yU3ViMF9DOworCisgIC8vIElmIGRlZmluZWQsIHVzZSBDUFVJbmZvKCkgdG8gb3ZlcndyaXRlIHNvbWUgcG9pbnRlcnMgd2l0aCBmYXN0ZXIgdmVyc2lvbnMuCisgIGlmIChWUDhHZXRDUFVJbmZvICE9IE5VTEwpIHsKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTIpCisgICAgaWYgKFZQOEdldENQVUluZm8oa1NTRTIpKSB7CisgICAgICBWUDhMRW5jRHNwSW5pdFNTRTIoKTsKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTQxKQorICAgICAgaWYgKFZQOEdldENQVUluZm8oa1NTRTRfMSkpIHsKKyAgICAgICAgVlA4TEVuY0RzcEluaXRTU0U0MSgpOworICAgICAgfQorI2VuZGlmCisgICAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTMzIpCisgICAgaWYgKFZQOEdldENQVUluZm8oa01JUFMzMikpIHsKKyAgICAgIFZQOExFbmNEc3BJbml0TUlQUzMyKCk7CisgICAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTX0RTUF9SMikKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrTUlQU2RzcFIyKSkgeworICAgICAgVlA4TEVuY0RzcEluaXRNSVBTZHNwUjIoKTsKKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01TQSkKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrTVNBKSkgeworICAgICAgVlA4TEVuY0RzcEluaXRNU0EoKTsKKyAgICB9CisjZW5kaWYKKyAgfQorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9ORU9OKQorICBpZiAoV0VCUF9ORU9OX09NSVRfQ19DT0RFIHx8CisgICAgICAoVlA4R2V0Q1BVSW5mbyAhPSBOVUxMICYmIFZQOEdldENQVUluZm8oa05FT04pKSkgeworICAgIFZQOExFbmNEc3BJbml0TkVPTigpOworICB9CisjZW5kaWYKKworICBhc3NlcnQoVlA4TFN1YnRyYWN0R3JlZW5Gcm9tQmx1ZUFuZFJlZCAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExUcmFuc2Zvcm1Db2xvciAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExDb2xsZWN0Q29sb3JCbHVlVHJhbnNmb3JtcyAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExDb2xsZWN0Q29sb3JSZWRUcmFuc2Zvcm1zICE9IE5VTEwpOworICBhc3NlcnQoVlA4TEZhc3RMb2cyU2xvdyAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExGYXN0U0xvZzJTbG93ICE9IE5VTEwpOworICBhc3NlcnQoVlA4TEV4dHJhQ29zdCAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExFeHRyYUNvc3RDb21iaW5lZCAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExDb21iaW5lZFNoYW5ub25FbnRyb3B5ICE9IE5VTEwpOworICBhc3NlcnQoVlA4TEdldEVudHJvcHlVbnJlZmluZWQgIT0gTlVMTCk7CisgIGFzc2VydChWUDhMR2V0Q29tYmluZWRFbnRyb3B5VW5yZWZpbmVkICE9IE5VTEwpOworICBhc3NlcnQoVlA4TEhpc3RvZ3JhbUFkZCAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExWZWN0b3JNaXNtYXRjaCAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExCdW5kbGVDb2xvck1hcCAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExQcmVkaWN0b3JzU3ViWzBdICE9IE5VTEwpOworICBhc3NlcnQoVlA4TFByZWRpY3RvcnNTdWJbMV0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhMUHJlZGljdG9yc1N1YlsyXSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExQcmVkaWN0b3JzU3ViWzNdICE9IE5VTEwpOworICBhc3NlcnQoVlA4TFByZWRpY3RvcnNTdWJbNF0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhMUHJlZGljdG9yc1N1Yls1XSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExQcmVkaWN0b3JzU3ViWzZdICE9IE5VTEwpOworICBhc3NlcnQoVlA4TFByZWRpY3RvcnNTdWJbN10gIT0gTlVMTCk7CisgIGFzc2VydChWUDhMUHJlZGljdG9yc1N1Yls4XSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExQcmVkaWN0b3JzU3ViWzldICE9IE5VTEwpOworICBhc3NlcnQoVlA4TFByZWRpY3RvcnNTdWJbMTBdICE9IE5VTEwpOworICBhc3NlcnQoVlA4TFByZWRpY3RvcnNTdWJbMTFdICE9IE5VTEwpOworICBhc3NlcnQoVlA4TFByZWRpY3RvcnNTdWJbMTJdICE9IE5VTEwpOworICBhc3NlcnQoVlA4TFByZWRpY3RvcnNTdWJbMTNdICE9IE5VTEwpOworICBhc3NlcnQoVlA4TFByZWRpY3RvcnNTdWJbMTRdICE9IE5VTEwpOworICBhc3NlcnQoVlA4TFByZWRpY3RvcnNTdWJbMTVdICE9IE5VTEwpOworICBhc3NlcnQoVlA4TFByZWRpY3RvcnNTdWJfQ1swXSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExQcmVkaWN0b3JzU3ViX0NbMV0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhMUHJlZGljdG9yc1N1Yl9DWzJdICE9IE5VTEwpOworICBhc3NlcnQoVlA4TFByZWRpY3RvcnNTdWJfQ1szXSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExQcmVkaWN0b3JzU3ViX0NbNF0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhMUHJlZGljdG9yc1N1Yl9DWzVdICE9IE5VTEwpOworICBhc3NlcnQoVlA4TFByZWRpY3RvcnNTdWJfQ1s2XSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExQcmVkaWN0b3JzU3ViX0NbN10gIT0gTlVMTCk7CisgIGFzc2VydChWUDhMUHJlZGljdG9yc1N1Yl9DWzhdICE9IE5VTEwpOworICBhc3NlcnQoVlA4TFByZWRpY3RvcnNTdWJfQ1s5XSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExQcmVkaWN0b3JzU3ViX0NbMTBdICE9IE5VTEwpOworICBhc3NlcnQoVlA4TFByZWRpY3RvcnNTdWJfQ1sxMV0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhMUHJlZGljdG9yc1N1Yl9DWzEyXSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExQcmVkaWN0b3JzU3ViX0NbMTNdICE9IE5VTEwpOworICBhc3NlcnQoVlA4TFByZWRpY3RvcnNTdWJfQ1sxNF0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhMUHJlZGljdG9yc1N1Yl9DWzE1XSAhPSBOVUxMKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbG9zc2xlc3NfZW5jX21pcHMzMi5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9sb3NzbGVzc19lbmNfbWlwczMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU4M2FiZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbG9zc2xlc3NfZW5jX21pcHMzMi5jCkBAIC0wLDAgKzEsNDM5IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gTUlQUyB2ZXJzaW9uIG9mIGxvc3NsZXNzIGZ1bmN0aW9ucworLy8KKy8vIEF1dGhvcihzKTogIERqb3JkamUgUGVzdXQgICAgKGRqb3JkamUucGVzdXRAaW1ndGVjLmNvbSkKKy8vICAgICAgICAgICAgIEpvdmFuIFplbGluY2V2aWMgKGpvdmFuLnplbGluY2V2aWNAaW1ndGVjLmNvbSkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisjaW5jbHVkZSAic3JjL2RzcC9sb3NzbGVzcy5oIgorI2luY2x1ZGUgInNyYy9kc3AvbG9zc2xlc3NfY29tbW9uLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFMzMikKKworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL2Fzc2VydF9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vbWF0aF9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RkbGliX3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdfcG9lbS5oIgorI2Vsc2UKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYKKworc3RhdGljIGZsb2F0IEZhc3RTTG9nMlNsb3dfTUlQUzMyKHVpbnQzMl90IHYpIHsKKyAgYXNzZXJ0KHYgPj0gTE9HX0xPT0tVUF9JRFhfTUFYKTsKKyAgaWYgKHYgPCBBUFBST1hfTE9HX1dJVEhfQ09SUkVDVElPTl9NQVgpIHsKKyAgICB1aW50MzJfdCBsb2dfY250LCB5LCBjb3JyZWN0aW9uOworICAgIGNvbnN0IGludCBjMjQgPSAyNDsKKyAgICBjb25zdCBmbG9hdCB2X2YgPSAoZmxvYXQpdjsKKyAgICB1aW50MzJfdCB0ZW1wOworCisgICAgLy8gWGYgPSAyNTYgPSAyXjgKKyAgICAvLyBsb2dfY250IGlzIGluZGV4IG9mIGxlYWRpbmcgb25lIGluIHVwcGVyIDI0IGJpdHMKKyAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgImNseiAgICAgICVbbG9nX2NudF0sICVbdl0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJhZGRpdSAgICAlW3ldLCAgICAgICAkemVybywgICAgICAgIDEgICAgICAgICAgIFxuXHQiCisgICAgICAic3VidSAgICAgJVtsb2dfY250XSwgJVtjMjRdLCAgICAgICAlW2xvZ19jbnRdICBcblx0IgorICAgICAgInNsbHYgICAgICVbeV0sICAgICAgICVbeV0sICAgICAgICAgJVtsb2dfY250XSAgXG5cdCIKKyAgICAgICJzcmx2ICAgICAlW3RlbXBdLCAgICAlW3ZdLCAgICAgICAgICVbbG9nX2NudF0gIFxuXHQiCisgICAgICA6IFtsb2dfY250XSI9JnIiKGxvZ19jbnQpLCBbeV0iPSZyIih5KSwKKyAgICAgICAgW3RlbXBdIj1yIih0ZW1wKQorICAgICAgOiBbYzI0XSJyIihjMjQpLCBbdl0iciIodikKKyAgICApOworCisgICAgLy8gdmYgPSAoMl5sb2dfY250KSAqIFhmOyB3aGVyZSB5ID0gMl5sb2dfY250IGFuZCBYZiA8IDI1NgorICAgIC8vIFhmID0gZmxvb3IoWGYpICogKDEgKyAodiAlIHkpIC8gdikKKyAgICAvLyBsb2cyKFhmKSA9IGxvZzIoZmxvb3IoWGYpKSArIGxvZzIoMSArICh2ICUgeSkgLyB2KQorICAgIC8vIFRoZSBjb3JyZWN0aW9uIGZhY3RvcjogbG9nKDEgKyBkKSB+IGQ7IGZvciB2ZXJ5IHNtYWxsIGQgdmFsdWVzLCBzbworICAgIC8vIGxvZzIoMSArICh2ICUgeSkgLyB2KSB+IExPR18yX1JFQ0lQUk9DQUwgKiAodiAlIHkpL3YKKyAgICAvLyBMT0dfMl9SRUNJUFJPQ0FMIH4gMjMvMTYKKworICAgIC8vICh2ICUgeSkgPSAodiAlIDJebG9nX2NudCkgPSB2ICYgKDJebG9nX2NudCAtIDEpCisgICAgY29ycmVjdGlvbiA9ICgyMyAqICh2ICYgKHkgLSAxKSkpID4+IDQ7CisgICAgcmV0dXJuIHZfZiAqIChrTG9nMlRhYmxlW3RlbXBdICsgbG9nX2NudCkgKyBjb3JyZWN0aW9uOworICB9IGVsc2UgeworICAgIHJldHVybiAoZmxvYXQpKExPR18yX1JFQ0lQUk9DQUwgKiB2ICogbG9nKChkb3VibGUpdikpOworICB9Cit9CisKK3N0YXRpYyBmbG9hdCBGYXN0TG9nMlNsb3dfTUlQUzMyKHVpbnQzMl90IHYpIHsKKyAgYXNzZXJ0KHYgPj0gTE9HX0xPT0tVUF9JRFhfTUFYKTsKKyAgaWYgKHYgPCBBUFBST1hfTE9HX1dJVEhfQ09SUkVDVElPTl9NQVgpIHsKKyAgICB1aW50MzJfdCBsb2dfY250LCB5OworICAgIGNvbnN0IGludCBjMjQgPSAyNDsKKyAgICBkb3VibGUgbG9nXzI7CisgICAgdWludDMyX3QgdGVtcDsKKworICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAiY2x6ICAgICAgJVtsb2dfY250XSwgJVt2XSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgImFkZGl1ICAgICVbeV0sICAgICAgICR6ZXJvLCAgICAgICAgMSAgICAgICAgICAgXG5cdCIKKyAgICAgICJzdWJ1ICAgICAlW2xvZ19jbnRdLCAlW2MyNF0sICAgICAgICVbbG9nX2NudF0gIFxuXHQiCisgICAgICAic2xsdiAgICAgJVt5XSwgICAgICAgJVt5XSwgICAgICAgICAlW2xvZ19jbnRdICBcblx0IgorICAgICAgInNybHYgICAgICVbdGVtcF0sICAgICVbdl0sICAgICAgICAgJVtsb2dfY250XSAgXG5cdCIKKyAgICAgIDogW2xvZ19jbnRdIj0mciIobG9nX2NudCksIFt5XSI9JnIiKHkpLAorICAgICAgICBbdGVtcF0iPXIiKHRlbXApCisgICAgICA6IFtjMjRdInIiKGMyNCksIFt2XSJyIih2KQorICAgICk7CisKKyAgICBsb2dfMiA9IGtMb2cyVGFibGVbdGVtcF0gKyBsb2dfY250OworICAgIGlmICh2ID49IEFQUFJPWF9MT0dfTUFYKSB7CisgICAgICAvLyBTaW5jZSB0aGUgZGl2aXNpb24gaXMgc3RpbGwgZXhwZW5zaXZlLCBhZGQgdGhpcyBjb3JyZWN0aW9uIGZhY3RvciBvbmx5CisgICAgICAvLyBmb3IgbGFyZ2UgdmFsdWVzIG9mICd2Jy4KKworICAgICAgY29uc3QgdWludDMyX3QgY29ycmVjdGlvbiA9ICgyMyAqICh2ICYgKHkgLSAxKSkpID4+IDQ7CisgICAgICBsb2dfMiArPSAoZG91YmxlKWNvcnJlY3Rpb24gLyB2OworICAgIH0KKyAgICByZXR1cm4gKGZsb2F0KWxvZ18yOworICB9IGVsc2UgeworICAgIHJldHVybiAoZmxvYXQpKExPR18yX1JFQ0lQUk9DQUwgKiBsb2coKGRvdWJsZSl2KSk7CisgIH0KK30KKworLy8gQyB2ZXJzaW9uIG9mIHRoaXMgZnVuY3Rpb246CisvLyAgIGludCBpID0gMDsKKy8vICAgaW50NjRfdCBjb3N0ID0gMDsKKy8vICAgY29uc3QgdWludDMyX3QqIHBvcCA9ICZwb3B1bGF0aW9uWzRdOworLy8gICBjb25zdCB1aW50MzJfdCogTG9vcEVuZCA9ICZwb3B1bGF0aW9uW2xlbmd0aF07CisvLyAgIHdoaWxlIChwb3AgIT0gTG9vcEVuZCkgeworLy8gICAgICsraTsKKy8vICAgICBjb3N0ICs9IGkgKiAqcG9wOworLy8gICAgIGNvc3QgKz0gaSAqICoocG9wICsgMSk7CisvLyAgICAgcG9wICs9IDI7CisvLyAgIH0KKy8vICAgcmV0dXJuIChkb3VibGUpY29zdDsKK3N0YXRpYyBkb3VibGUgRXh0cmFDb3N0X01JUFMzMihjb25zdCB1aW50MzJfdCogY29uc3QgcG9wdWxhdGlvbiwgaW50IGxlbmd0aCkgeworICBpbnQgaSwgdGVtcDAsIHRlbXAxOworICBjb25zdCB1aW50MzJfdCogcG9wID0gJnBvcHVsYXRpb25bNF07CisgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBMb29wRW5kID0gJnBvcHVsYXRpb25bbGVuZ3RoXTsKKworICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICJtdWx0ICAgJHplcm8sICAgICR6ZXJvICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAieG9yICAgICVbaV0sICAgICAlW2ldLCAgICAgICAlW2ldICAgICAgIFxuXHQiCisgICAgImJlcSAgICAlW3BvcF0sICAgJVtMb29wRW5kXSwgMmYgICAgICAgICBcblx0IgorICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICVbdGVtcDBdLCAwKCVbcG9wXSkgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAlW3RlbXAxXSwgNCglW3BvcF0pICAgICAgICAgICAgICBcblx0IgorICAgICJhZGRpdSAgJVtpXSwgICAgICVbaV0sICAgICAgIDEgICAgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICVbcG9wXSwgICAlW3BvcF0sICAgICA4ICAgICAgICAgIFxuXHQiCisgICAgIm1hZGQgICAlW2ldLCAgICAgJVt0ZW1wMF0gICAgICAgICAgICAgICBcblx0IgorICAgICJtYWRkICAgJVtpXSwgICAgICVbdGVtcDFdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYm5lICAgICVbcG9wXSwgICAlW0xvb3BFbmRdLCAxYiAgICAgICAgIFxuXHQiCisgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJtZmhpICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibWZsbyAgICVbdGVtcDFdICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLAorICAgICAgW2ldIj0mciIoaSksIFtwb3BdIityIihwb3ApCisgICAgOiBbTG9vcEVuZF0iciIoTG9vcEVuZCkKKyAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iCisgICk7CisKKyAgcmV0dXJuIChkb3VibGUpKChpbnQ2NF90KXRlbXAwIDw8IDMyIHwgdGVtcDEpOworfQorCisvLyBDIHZlcnNpb24gb2YgdGhpcyBmdW5jdGlvbjoKKy8vICAgaW50IGkgPSAwOworLy8gICBpbnQ2NF90IGNvc3QgPSAwOworLy8gICBjb25zdCB1aW50MzJfdCogcFggPSAmWFs0XTsKKy8vICAgY29uc3QgdWludDMyX3QqIHBZID0gJllbNF07CisvLyAgIGNvbnN0IHVpbnQzMl90KiBMb29wRW5kID0gJlhbbGVuZ3RoXTsKKy8vICAgd2hpbGUgKHBYICE9IExvb3BFbmQpIHsKKy8vICAgICBjb25zdCB1aW50MzJfdCB4eTAgPSAqcFggKyAqcFk7CisvLyAgICAgY29uc3QgdWludDMyX3QgeHkxID0gKihwWCArIDEpICsgKihwWSArIDEpOworLy8gICAgICsraTsKKy8vICAgICBjb3N0ICs9IGkgKiB4eTA7CisvLyAgICAgY29zdCArPSBpICogeHkxOworLy8gICAgIHBYICs9IDI7CisvLyAgICAgcFkgKz0gMjsKKy8vICAgfQorLy8gICByZXR1cm4gKGRvdWJsZSljb3N0Oworc3RhdGljIGRvdWJsZSBFeHRyYUNvc3RDb21iaW5lZF9NSVBTMzIoY29uc3QgdWludDMyX3QqIGNvbnN0IFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgWSwgaW50IGxlbmd0aCkgeworICBpbnQgaSwgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDM7CisgIGNvbnN0IHVpbnQzMl90KiBwWCA9ICZYWzRdOworICBjb25zdCB1aW50MzJfdCogcFkgPSAmWVs0XTsKKyAgY29uc3QgdWludDMyX3QqIGNvbnN0IExvb3BFbmQgPSAmWFtsZW5ndGhdOworCisgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgIm11bHQgICAkemVybywgICAgJHplcm8gICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ4b3IgICAgJVtpXSwgICAgICVbaV0sICAgICAgICVbaV0gICAgICAgXG5cdCIKKyAgICAiYmVxICAgICVbcFhdLCAgICAlW0xvb3BFbmRdLCAyZiAgICAgICAgIFxuXHQiCisgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgJVt0ZW1wMF0sIDAoJVtwWF0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICVbdGVtcDFdLCAwKCVbcFldKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAlW3RlbXAyXSwgNCglW3BYXSkgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgJVt0ZW1wM10sIDQoJVtwWV0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICVbaV0sICAgICAlW2ldLCAgICAgICAxICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAlW3RlbXAwXSwgJVt0ZW1wMF0sICAgJVt0ZW1wMV0gICBcblx0IgorICAgICJhZGR1ICAgJVt0ZW1wMl0sICVbdGVtcDJdLCAgICVbdGVtcDNdICAgXG5cdCIKKyAgICAiYWRkaXUgICVbcFhdLCAgICAlW3BYXSwgICAgICA4ICAgICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAlW3BZXSwgICAgJVtwWV0sICAgICAgOCAgICAgICAgICBcblx0IgorICAgICJtYWRkICAgJVtpXSwgICAgICVbdGVtcDBdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibWFkZCAgICVbaV0sICAgICAlW3RlbXAyXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJuZSAgICAlW3BYXSwgICAgJVtMb29wRW5kXSwgMWIgICAgICAgICBcblx0IgorICAiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibWZoaSAgICVbdGVtcDBdICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIm1mbG8gICAlW3RlbXAxXSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwKKyAgICAgIFt0ZW1wMl0iPSZyIih0ZW1wMiksIFt0ZW1wM10iPSZyIih0ZW1wMyksCisgICAgICBbaV0iPSZyIihpKSwgW3BYXSIrciIocFgpLCBbcFldIityIihwWSkKKyAgICA6IFtMb29wRW5kXSJyIihMb29wRW5kKQorICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIKKyAgKTsKKworICByZXR1cm4gKGRvdWJsZSkoKGludDY0X3QpdGVtcDAgPDwgMzIgfCB0ZW1wMSk7Cit9CisKKyNkZWZpbmUgSFVGRk1BTl9DT1NUX1BBU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fYXNtX18gdm9sYXRpbGUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJzbGwgICAlW3RlbXAxXSwgICVbdGVtcDBdLCAgICAzICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgICAiYWRkaXUgJVt0ZW1wM10sICAlW3N0cmVha10sICAgLTMgICAgICAgICAgXG5cdCIgICAgICBcCisgICAgImFkZHUgICVbdGVtcDJdLCAgJVtwc3RyZWFrc10sICVbdGVtcDFdICAgIFxuXHQiICAgICAgXAorICAgICJibGV6ICAlW3RlbXAzXSwgIDFmICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgICAic3JsICAgJVt0ZW1wMV0sICAlW3RlbXAxXSwgICAgMSAgICAgICAgICAgXG5cdCIgICAgICBcCisgICAgImFkZHUgICVbdGVtcDNdLCAgJVtwY250c10sICAgICVbdGVtcDFdICAgIFxuXHQiICAgICAgXAorICAgICJsdyAgICAlW3RlbXAwXSwgIDQoJVt0ZW1wMl0pICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgICAibHcgICAgJVt0ZW1wMV0sICAwKCVbdGVtcDNdKSAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICAgImFkZHUgICVbdGVtcDBdLCAgJVt0ZW1wMF0sICAgICVbc3RyZWFrXSAgIFxuXHQiICAgICAgXAorICAgICJhZGRpdSAlW3RlbXAxXSwgICVbdGVtcDFdLCAgICAxICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgICAic3cgICAgJVt0ZW1wMF0sICA0KCVbdGVtcDJdKSAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICAgInN3ICAgICVbdGVtcDFdLCAgMCglW3RlbXAzXSkgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAgICJiICAgICAyZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICAgImx3ICAgICVbdGVtcDBdLCAgMCglW3RlbXAyXSkgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAgICJhZGR1ICAlW3RlbXAwXSwgICVbdGVtcDBdLCAgICAlW3N0cmVha10gICBcblx0IiAgICAgIFwKKyAgICAic3cgICAgJVt0ZW1wMF0sICAwKCVbdGVtcDJdKSAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAgIDogW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwgICAgICAgICAgIFwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wMF0iK3IiKHRlbXAwKSAgICAgICAgICAgICBcCisgICAgOiBbcHN0cmVha3NdInIiKHBzdHJlYWtzKSwgW3BjbnRzXSJyIihwY250cyksICAgICAgICAgXAorICAgICAgW3N0cmVha10iciIoc3RyZWFrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA6ICJtZW1vcnkiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICk7CisKKy8vIFJldHVybnMgdGhlIHZhcmlvdXMgUkxFIGNvdW50cworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgR2V0RW50cm9weVVucmVmaW5lZEhlbHBlcigKKyAgICB1aW50MzJfdCB2YWwsIGludCBpLCB1aW50MzJfdCogY29uc3QgdmFsX3ByZXYsIGludCogY29uc3QgaV9wcmV2LAorICAgIFZQOExCaXRFbnRyb3B5KiBjb25zdCBiaXRfZW50cm9weSwgVlA4TFN0cmVha3MqIGNvbnN0IHN0YXRzKSB7CisgIGludCogY29uc3QgcHN0cmVha3MgPSAmc3RhdHMtPnN0cmVha3NbMF1bMF07CisgIGludCogY29uc3QgcGNudHMgPSAmc3RhdHMtPmNvdW50c1swXTsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzOworICBjb25zdCBpbnQgc3RyZWFrID0gaSAtICppX3ByZXY7CisKKyAgLy8gR2F0aGVyIGluZm8gZm9yIHRoZSBiaXQgZW50cm9weS4KKyAgaWYgKCp2YWxfcHJldiAhPSAwKSB7CisgICAgYml0X2VudHJvcHktPnN1bSArPSAoKnZhbF9wcmV2KSAqIHN0cmVhazsKKyAgICBiaXRfZW50cm9weS0+bm9uemVyb3MgKz0gc3RyZWFrOworICAgIGJpdF9lbnRyb3B5LT5ub256ZXJvX2NvZGUgPSAqaV9wcmV2OworICAgIGJpdF9lbnRyb3B5LT5lbnRyb3B5IC09IFZQOExGYXN0U0xvZzIoKnZhbF9wcmV2KSAqIHN0cmVhazsKKyAgICBpZiAoYml0X2VudHJvcHktPm1heF92YWwgPCAqdmFsX3ByZXYpIHsKKyAgICAgIGJpdF9lbnRyb3B5LT5tYXhfdmFsID0gKnZhbF9wcmV2OworICAgIH0KKyAgfQorCisgIC8vIEdhdGhlciBpbmZvIGZvciB0aGUgSHVmZm1hbiBjb3N0LgorICB0ZW1wMCA9ICgqdmFsX3ByZXYgIT0gMCk7CisgIEhVRkZNQU5fQ09TVF9QQVNTCisKKyAgKnZhbF9wcmV2ID0gdmFsOworICAqaV9wcmV2ID0gaTsKK30KKworc3RhdGljIHZvaWQgR2V0RW50cm9weVVucmVmaW5lZF9NSVBTMzIoY29uc3QgdWludDMyX3QgWFtdLCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEJpdEVudHJvcHkqIGNvbnN0IGJpdF9lbnRyb3B5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TFN0cmVha3MqIGNvbnN0IHN0YXRzKSB7CisgIGludCBpOworICBpbnQgaV9wcmV2ID0gMDsKKyAgdWludDMyX3QgeF9wcmV2ID0gWFswXTsKKworICBtZW1zZXQoc3RhdHMsIDAsIHNpemVvZigqc3RhdHMpKTsKKyAgVlA4TEJpdEVudHJvcHlJbml0KGJpdF9lbnRyb3B5KTsKKworICBmb3IgKGkgPSAxOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICBjb25zdCB1aW50MzJfdCB4ID0gWFtpXTsKKyAgICBpZiAoeCAhPSB4X3ByZXYpIHsKKyAgICAgIEdldEVudHJvcHlVbnJlZmluZWRIZWxwZXIoeCwgaSwgJnhfcHJldiwgJmlfcHJldiwgYml0X2VudHJvcHksIHN0YXRzKTsKKyAgICB9CisgIH0KKyAgR2V0RW50cm9weVVucmVmaW5lZEhlbHBlcigwLCBpLCAmeF9wcmV2LCAmaV9wcmV2LCBiaXRfZW50cm9weSwgc3RhdHMpOworCisgIGJpdF9lbnRyb3B5LT5lbnRyb3B5ICs9IFZQOExGYXN0U0xvZzIoYml0X2VudHJvcHktPnN1bSk7Cit9CisKK3N0YXRpYyB2b2lkIEdldENvbWJpbmVkRW50cm9weVVucmVmaW5lZF9NSVBTMzIoY29uc3QgdWludDMyX3QgWFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBZW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCaXRFbnRyb3B5KiBjb25zdCBlbnRyb3B5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMU3RyZWFrcyogY29uc3Qgc3RhdHMpIHsKKyAgaW50IGkgPSAxOworICBpbnQgaV9wcmV2ID0gMDsKKyAgdWludDMyX3QgeHlfcHJldiA9IFhbMF0gKyBZWzBdOworCisgIG1lbXNldChzdGF0cywgMCwgc2l6ZW9mKCpzdGF0cykpOworICBWUDhMQml0RW50cm9weUluaXQoZW50cm9weSk7CisKKyAgZm9yIChpID0gMTsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgY29uc3QgdWludDMyX3QgeHkgPSBYW2ldICsgWVtpXTsKKyAgICBpZiAoeHkgIT0geHlfcHJldikgeworICAgICAgR2V0RW50cm9weVVucmVmaW5lZEhlbHBlcih4eSwgaSwgJnh5X3ByZXYsICZpX3ByZXYsIGVudHJvcHksIHN0YXRzKTsKKyAgICB9CisgIH0KKyAgR2V0RW50cm9weVVucmVmaW5lZEhlbHBlcigwLCBpLCAmeHlfcHJldiwgJmlfcHJldiwgZW50cm9weSwgc3RhdHMpOworCisgIGVudHJvcHktPmVudHJvcHkgKz0gVlA4TEZhc3RTTG9nMihlbnRyb3B5LT5zdW0pOworfQorCisjZGVmaW5lIEFTTV9TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19hc21fXyB2b2xhdGlsZSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICIuc2V0ICAgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICBcCisgICAgIi5zZXQgICBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgIFwKKyAgICAiLnNldCAgIG1hY3JvICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgXAorICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisvLyBQMiA9IFAwICsgUDEKKy8vIEEuLkQgLSBvZmZzZXRzCisvLyBFIC0gdGVtcCB2YXJpYWJsZSB0byB0ZWxsIG1hY3JvCisvLyAgICAgaWYgcG9pbnRlciBzaG91bGQgYmUgaW5jcmVtZW50ZWQKKy8vIGxpdGVyYWxfIGFuZCBzdWNjZXNzaXZlIGhpc3RvZ3JhbXMgY291bGQgYmUgdW5hbGlnbmVkCisvLyBzbyB3ZSBtdXN0IHVzZSB1bHcgYW5kIHVzdworI2RlZmluZSBBRERfVE9fT1VUKEEsIEIsIEMsIEQsIEUsIFAwLCBQMSwgUDIpICAgICAgICAgICBcCisgICAgInVsdyAgICAlW3RlbXAwXSwgIiAjQSAiKCVbIiAjUDAgIl0pICAgIFxuXHQiICAgICAgIFwKKyAgICAidWx3ICAgICVbdGVtcDFdLCAiICNCICIoJVsiICNQMCAiXSkgICAgXG5cdCIgICAgICAgXAorICAgICJ1bHcgICAgJVt0ZW1wMl0sICIgI0MgIiglWyIgI1AwICJdKSAgICBcblx0IiAgICAgICBcCisgICAgInVsdyAgICAlW3RlbXAzXSwgIiAjRCAiKCVbIiAjUDAgIl0pICAgIFxuXHQiICAgICAgIFwKKyAgICAidWx3ICAgICVbdGVtcDRdLCAiICNBICIoJVsiICNQMSAiXSkgICAgXG5cdCIgICAgICAgXAorICAgICJ1bHcgICAgJVt0ZW1wNV0sICIgI0IgIiglWyIgI1AxICJdKSAgICBcblx0IiAgICAgICBcCisgICAgInVsdyAgICAlW3RlbXA2XSwgIiAjQyAiKCVbIiAjUDEgIl0pICAgIFxuXHQiICAgICAgIFwKKyAgICAidWx3ICAgICVbdGVtcDddLCAiICNEICIoJVsiICNQMSAiXSkgICAgXG5cdCIgICAgICAgXAorICAgICJhZGR1ICAgJVt0ZW1wNF0sICVbdGVtcDRdLCAgICVbdGVtcDBdICBcblx0IiAgICAgICBcCisgICAgImFkZHUgICAlW3RlbXA1XSwgJVt0ZW1wNV0sICAgJVt0ZW1wMV0gIFxuXHQiICAgICAgIFwKKyAgICAiYWRkdSAgICVbdGVtcDZdLCAlW3RlbXA2XSwgICAlW3RlbXAyXSAgXG5cdCIgICAgICAgXAorICAgICJhZGR1ICAgJVt0ZW1wN10sICVbdGVtcDddLCAgICVbdGVtcDNdICBcblx0IiAgICAgICBcCisgICAgImFkZGl1ICAlWyIgI1AwICJdLCAgJVsiICNQMCAiXSwgIDE2ICAgIFxuXHQiICAgICAgIFwKKyAgIi5pZiAiICNFICIgPT0gMSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgXAorICAgICJhZGRpdSAgJVsiICNQMSAiXSwgICVbIiAjUDEgIl0sICAxNiAgICBcblx0IiAgICAgICBcCisgICIuZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgIFwKKyAgICAidXN3ICAgICVbdGVtcDRdLCAiICNBICIoJVsiICNQMiAiXSkgICAgXG5cdCIgICAgICAgXAorICAgICJ1c3cgICAgJVt0ZW1wNV0sICIgI0IgIiglWyIgI1AyICJdKSAgICBcblx0IiAgICAgICBcCisgICAgInVzdyAgICAlW3RlbXA2XSwgIiAjQyAiKCVbIiAjUDIgIl0pICAgIFxuXHQiICAgICAgIFwKKyAgICAidXN3ICAgICVbdGVtcDddLCAiICNEICIoJVsiICNQMiAiXSkgICAgXG5cdCIgICAgICAgXAorICAgICJhZGRpdSAgJVsiICNQMiAiXSwgJVsiICNQMiAiXSwgICAxNiAgICBcblx0IiAgICAgICBcCisgICAgImJuZSAgICAlWyIgI1AwICJdLCAlW0xvb3BFbmRdLCAxYiAgICAgIFxuXHQiICAgICAgIFwKKyAgICAiLnNldCAgIHBvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgXAorCisjZGVmaW5lIEFTTV9FTkRfQ09NTU9OXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksICAgICAgICAgXAorICAgICAgW3RlbXAyXSI9JnIiKHRlbXAyKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSwgICAgICAgICBcCisgICAgICBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLCAgICAgICAgIFwKKyAgICAgIFt0ZW1wNl0iPSZyIih0ZW1wNiksIFt0ZW1wN10iPSZyIih0ZW1wNyksICAgICAgICAgXAorICAgICAgW3BhXSIrciIocGEpLCBbcG91dF0iK3IiKHBvdXQpCisKKyNkZWZpbmUgQVNNX0VORF9DT01NT05fMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDogW0xvb3BFbmRdInIiKExvb3BFbmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgOiAibWVtb3J5IiwgImF0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKTsKKworI2RlZmluZSBBU01fRU5EXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQVNNX0VORF9DT01NT05fMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICwgW3BiXSIrciIocGIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEFTTV9FTkRfQ09NTU9OXzEKKworI2RlZmluZSBBU01fRU5EXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQVNNX0VORF9DT01NT05fMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBBU01fRU5EX0NPTU1PTl8xCisKKyNkZWZpbmUgQUREX1ZFQ1RPUihBLCBCLCBPVVQsIFNJWkUsIEVYVFJBX1NJWkUpICBkbyB7ICAgXAorICBjb25zdCB1aW50MzJfdCogcGEgPSAoY29uc3QgdWludDMyX3QqKShBKTsgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQzMl90KiBwYiA9IChjb25zdCB1aW50MzJfdCopKEIpOyAgICAgICAgICAgIFwKKyAgdWludDMyX3QqIHBvdXQgPSAodWludDMyX3QqKShPVVQpOyAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50MzJfdCogY29uc3QgTG9vcEVuZCA9IHBhICsgKFNJWkUpOyAgICAgICAgICBcCisgIGFzc2VydCgoU0laRSkgJSA0ID09IDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQVNNX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBRERfVE9fT1VUKDAsIDQsIDgsIDEyLCAxLCBwYSwgcGIsIHBvdXQpICAgICAgICAgICAgICBcCisgIEFTTV9FTkRfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKChFWFRSQV9TSVpFKSA+IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBsYXN0ID0gKEVYVFJBX1NJWkUpOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGFzdDsgKytpKSBwb3V0W2ldID0gcGFbaV0gKyBwYltpXTsgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEFERF9WRUNUT1JfRVEoQSwgT1VULCBTSVpFLCBFWFRSQV9TSVpFKSAgZG8geyAgIFwKKyAgY29uc3QgdWludDMyX3QqIHBhID0gKGNvbnN0IHVpbnQzMl90KikoQSk7ICAgICAgICAgICAgXAorICB1aW50MzJfdCogcG91dCA9ICh1aW50MzJfdCopKE9VVCk7ICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBMb29wRW5kID0gcGEgKyAoU0laRSk7ICAgICAgICAgIFwKKyAgYXNzZXJ0KChTSVpFKSAlIDQgPT0gMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBU01fU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEFERF9UT19PVVQoMCwgNCwgOCwgMTIsIDAsIHBhLCBwb3V0LCBwb3V0KSAgICAgICAgICAgIFwKKyAgQVNNX0VORF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoKEVYVFJBX1NJWkUpID4gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IGxhc3QgPSAoRVhUUkFfU0laRSk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaSA9IDA7IGkgPCBsYXN0OyArK2kpIHBvdXRbaV0gKz0gcGFbaV07ICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIEhpc3RvZ3JhbUFkZF9NSVBTMzIoY29uc3QgVlA4TEhpc3RvZ3JhbSogY29uc3QgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TEhpc3RvZ3JhbSogY29uc3QgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEhpc3RvZ3JhbSogY29uc3Qgb3V0KSB7CisgIHVpbnQzMl90IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA2LCB0ZW1wNzsKKyAgY29uc3QgaW50IGV4dHJhX2NhY2hlX3NpemUgPSBWUDhMSGlzdG9ncmFtTnVtQ29kZXMoYS0+cGFsZXR0ZV9jb2RlX2JpdHNfKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIChOVU1fTElURVJBTF9DT0RFUyArIE5VTV9MRU5HVEhfQ09ERVMpOworICBhc3NlcnQoYS0+cGFsZXR0ZV9jb2RlX2JpdHNfID09IGItPnBhbGV0dGVfY29kZV9iaXRzXyk7CisKKyAgaWYgKGIgIT0gb3V0KSB7CisgICAgQUREX1ZFQ1RPUihhLT5saXRlcmFsXywgYi0+bGl0ZXJhbF8sIG91dC0+bGl0ZXJhbF8sCisgICAgICAgICAgICAgICBOVU1fTElURVJBTF9DT0RFUyArIE5VTV9MRU5HVEhfQ09ERVMsIGV4dHJhX2NhY2hlX3NpemUpOworICAgIEFERF9WRUNUT1IoYS0+ZGlzdGFuY2VfLCBiLT5kaXN0YW5jZV8sIG91dC0+ZGlzdGFuY2VfLAorICAgICAgICAgICAgICAgTlVNX0RJU1RBTkNFX0NPREVTLCAwKTsKKyAgICBBRERfVkVDVE9SKGEtPnJlZF8sIGItPnJlZF8sIG91dC0+cmVkXywgTlVNX0xJVEVSQUxfQ09ERVMsIDApOworICAgIEFERF9WRUNUT1IoYS0+Ymx1ZV8sIGItPmJsdWVfLCBvdXQtPmJsdWVfLCBOVU1fTElURVJBTF9DT0RFUywgMCk7CisgICAgQUREX1ZFQ1RPUihhLT5hbHBoYV8sIGItPmFscGhhXywgb3V0LT5hbHBoYV8sIE5VTV9MSVRFUkFMX0NPREVTLCAwKTsKKyAgfSBlbHNlIHsKKyAgICBBRERfVkVDVE9SX0VRKGEtPmxpdGVyYWxfLCBvdXQtPmxpdGVyYWxfLAorICAgICAgICAgICAgICAgICAgTlVNX0xJVEVSQUxfQ09ERVMgKyBOVU1fTEVOR1RIX0NPREVTLCBleHRyYV9jYWNoZV9zaXplKTsKKyAgICBBRERfVkVDVE9SX0VRKGEtPmRpc3RhbmNlXywgb3V0LT5kaXN0YW5jZV8sIE5VTV9ESVNUQU5DRV9DT0RFUywgMCk7CisgICAgQUREX1ZFQ1RPUl9FUShhLT5yZWRfLCBvdXQtPnJlZF8sIE5VTV9MSVRFUkFMX0NPREVTLCAwKTsKKyAgICBBRERfVkVDVE9SX0VRKGEtPmJsdWVfLCBvdXQtPmJsdWVfLCBOVU1fTElURVJBTF9DT0RFUywgMCk7CisgICAgQUREX1ZFQ1RPUl9FUShhLT5hbHBoYV8sIG91dC0+YWxwaGFfLCBOVU1fTElURVJBTF9DT0RFUywgMCk7CisgIH0KK30KKworI3VuZGVmIEFERF9WRUNUT1JfRVEKKyN1bmRlZiBBRERfVkVDVE9SCisjdW5kZWYgQVNNX0VORF8xCisjdW5kZWYgQVNNX0VORF8wCisjdW5kZWYgQVNNX0VORF9DT01NT05fMQorI3VuZGVmIEFTTV9FTkRfQ09NTU9OXzAKKyN1bmRlZiBBRERfVE9fT1VUCisjdW5kZWYgQVNNX1NUQVJUCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBWUDhMRW5jRHNwSW5pdE1JUFMzMih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFZQOExFbmNEc3BJbml0TUlQUzMyKHZvaWQpIHsKKyAgVlA4TEZhc3RTTG9nMlNsb3cgPSBGYXN0U0xvZzJTbG93X01JUFMzMjsKKyAgVlA4TEZhc3RMb2cyU2xvdyA9IEZhc3RMb2cyU2xvd19NSVBTMzI7CisgIFZQOExFeHRyYUNvc3QgPSBFeHRyYUNvc3RfTUlQUzMyOworICBWUDhMRXh0cmFDb3N0Q29tYmluZWQgPSBFeHRyYUNvc3RDb21iaW5lZF9NSVBTMzI7CisgIFZQOExHZXRFbnRyb3B5VW5yZWZpbmVkID0gR2V0RW50cm9weVVucmVmaW5lZF9NSVBTMzI7CisgIFZQOExHZXRDb21iaW5lZEVudHJvcHlVbnJlZmluZWQgPSBHZXRDb21iaW5lZEVudHJvcHlVbnJlZmluZWRfTUlQUzMyOworICBWUDhMSGlzdG9ncmFtQWRkID0gSGlzdG9ncmFtQWRkX01JUFMzMjsKK30KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9NSVBTMzIKKworV0VCUF9EU1BfSU5JVF9TVFVCKFZQOExFbmNEc3BJbml0TUlQUzMyKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX01JUFMzMgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9sb3NzbGVzc19lbmNfbWlwc19kc3BfcjIuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbG9zc2xlc3NfZW5jX21pcHNfZHNwX3IyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg1NWU2YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbG9zc2xlc3NfZW5jX21pcHNfZHNwX3IyLmMKQEAgLTAsMCArMSwyODEgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBJbWFnZSB0cmFuc2Zvcm0gbWV0aG9kcyBmb3IgbG9zc2xlc3MgZW5jb2Rlci4KKy8vCisvLyBBdXRob3Iocyk6ICBEam9yZGplIFBlc3V0ICAgIChkam9yZGplLnBlc3V0QGltZ3RlYy5jb20pCisvLyAgICAgICAgICAgICBKb3ZhbiBaZWxpbmNldmljIChqb3Zhbi56ZWxpbmNldmljQGltZ3RlYy5jb20pCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTX0RTUF9SMikKKworI2luY2x1ZGUgInNyYy9kc3AvbG9zc2xlc3MuaCIKKworc3RhdGljIHZvaWQgU3VidHJhY3RHcmVlbkZyb21CbHVlQW5kUmVkX01JUFNkc3BSMih1aW50MzJfdCogYXJnYl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscykgeworICB1aW50MzJfdCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNiwgdGVtcDc7CisgIHVpbnQzMl90KiBjb25zdCBwX2xvb3AxX2VuZCA9IGFyZ2JfZGF0YSArIChudW1fcGl4ZWxzICYgfjMpOworICB1aW50MzJfdCogY29uc3QgcF9sb29wMl9lbmQgPSBwX2xvb3AxX2VuZCArIChudW1fcGl4ZWxzICYgMyk7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICIuc2V0ICAgICAgIHB1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIuc2V0ICAgICAgIG5vcmVvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXEgICAgICAgICVbYXJnYl9kYXRhXSwgICAgJVtwX2xvb3AxX2VuZF0sICAgICAzZiAgICAgICBcblx0IgorICAgICIgbm9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAiMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgICAgICVbdGVtcDBdLCAgICAgICAgMCglW2FyZ2JfZGF0YV0pICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgICAgICVbdGVtcDFdLCAgICAgICAgNCglW2FyZ2JfZGF0YV0pICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgICAgICVbdGVtcDJdLCAgICAgICAgOCglW2FyZ2JfZGF0YV0pICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgICAgICVbdGVtcDNdLCAgICAgICAgMTIoJVthcmdiX2RhdGFdKSAgICAgICAgICAgICBcblx0IgorICAgICJleHQgICAgICAgICVbdGVtcDRdLCAgICAgICAgJVt0ZW1wMF0sICAgICAgICAgICA4LCAgICA4ICBcblx0IgorICAgICJleHQgICAgICAgICVbdGVtcDVdLCAgICAgICAgJVt0ZW1wMV0sICAgICAgICAgICA4LCAgICA4ICBcblx0IgorICAgICJleHQgICAgICAgICVbdGVtcDZdLCAgICAgICAgJVt0ZW1wMl0sICAgICAgICAgICA4LCAgICA4ICBcblx0IgorICAgICJleHQgICAgICAgICVbdGVtcDddLCAgICAgICAgJVt0ZW1wM10sICAgICAgICAgICA4LCAgICA4ICBcblx0IgorICAgICJhZGRpdSAgICAgICVbYXJnYl9kYXRhXSwgICAgJVthcmdiX2RhdGFdLCAgICAgICAxNiAgICAgICBcblx0IgorICAgICJyZXBsdi5waCAgICVbdGVtcDRdLCAgICAgICAgJVt0ZW1wNF0gICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJyZXBsdi5waCAgICVbdGVtcDVdLCAgICAgICAgJVt0ZW1wNV0gICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJyZXBsdi5waCAgICVbdGVtcDZdLCAgICAgICAgJVt0ZW1wNl0gICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJyZXBsdi5waCAgICVbdGVtcDddLCAgICAgICAgJVt0ZW1wN10gICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1LnFiICAgICVbdGVtcDBdLCAgICAgICAgJVt0ZW1wMF0sICAgICAgICAgICAlW3RlbXA0XSBcblx0IgorICAgICJzdWJ1LnFiICAgICVbdGVtcDFdLCAgICAgICAgJVt0ZW1wMV0sICAgICAgICAgICAlW3RlbXA1XSBcblx0IgorICAgICJzdWJ1LnFiICAgICVbdGVtcDJdLCAgICAgICAgJVt0ZW1wMl0sICAgICAgICAgICAlW3RlbXA2XSBcblx0IgorICAgICJzdWJ1LnFiICAgICVbdGVtcDNdLCAgICAgICAgJVt0ZW1wM10sICAgICAgICAgICAlW3RlbXA3XSBcblx0IgorICAgICJzdyAgICAgICAgICVbdGVtcDBdLCAgICAgICAgLTE2KCVbYXJnYl9kYXRhXSkgICAgICAgICAgICBcblx0IgorICAgICJzdyAgICAgICAgICVbdGVtcDFdLCAgICAgICAgLTEyKCVbYXJnYl9kYXRhXSkgICAgICAgICAgICBcblx0IgorICAgICJzdyAgICAgICAgICVbdGVtcDJdLCAgICAgICAgLTgoJVthcmdiX2RhdGFdKSAgICAgICAgICAgICBcblx0IgorICAgICJibmUgICAgICAgICVbYXJnYl9kYXRhXSwgICAgJVtwX2xvb3AxX2VuZF0sICAgICAwYiAgICAgICBcblx0IgorICAgICIgc3cgICAgICAgICVbdGVtcDNdLCAgICAgICAgLTQoJVthcmdiX2RhdGFdKSAgICAgICAgICAgICBcblx0IgorICAiMzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXEgICAgICAgICVbYXJnYl9kYXRhXSwgICAgJVtwX2xvb3AyX2VuZF0sICAgICAyZiAgICAgICBcblx0IgorICAgICIgbm9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgICAgICVbdGVtcDBdLCAgICAgICAgMCglW2FyZ2JfZGF0YV0pICAgICAgICAgICAgICBcblx0IgorICAgICJhZGRpdSAgICAgICVbYXJnYl9kYXRhXSwgICAgJVthcmdiX2RhdGFdLCAgICAgICA0ICAgICAgICBcblx0IgorICAgICJleHQgICAgICAgICVbdGVtcDRdLCAgICAgICAgJVt0ZW1wMF0sICAgICAgICAgICA4LCAgICA4ICBcblx0IgorICAgICJyZXBsdi5waCAgICVbdGVtcDRdLCAgICAgICAgJVt0ZW1wNF0gICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1LnFiICAgICVbdGVtcDBdLCAgICAgICAgJVt0ZW1wMF0sICAgICAgICAgICAlW3RlbXA0XSBcblx0IgorICAgICJibmUgICAgICAgICVbYXJnYl9kYXRhXSwgICAgJVtwX2xvb3AyX2VuZF0sICAgICAxYiAgICAgICBcblx0IgorICAgICIgc3cgICAgICAgICVbdGVtcDBdLCAgICAgICAgLTQoJVthcmdiX2RhdGFdKSAgICAgICAgICAgICBcblx0IgorICAiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIuc2V0ICAgICAgIHBvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIDogW2FyZ2JfZGF0YV0iKyZyIihhcmdiX2RhdGEpLCBbdGVtcDBdIj0mciIodGVtcDApLAorICAgICAgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSwKKyAgICAgIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksIFt0ZW1wNl0iPSZyIih0ZW1wNiksCisgICAgICBbdGVtcDddIj0mciIodGVtcDcpCisgICAgOiBbcF9sb29wMV9lbmRdInIiKHBfbG9vcDFfZW5kKSwgW3BfbG9vcDJfZW5kXSJyIihwX2xvb3AyX2VuZCkKKyAgICA6ICJtZW1vcnkiCisgICk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBDb2xvclRyYW5zZm9ybURlbHRhKGludDhfdCBjb2xvcl9wcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50OF90IGNvbG9yKSB7CisgIHJldHVybiAodWludDMyX3QpKChpbnQpKGNvbG9yX3ByZWQpICogY29sb3IpID4+IDU7Cit9CisKK3N0YXRpYyB2b2lkIFRyYW5zZm9ybUNvbG9yX01JUFNkc3BSMihjb25zdCBWUDhMTXVsdGlwbGllcnMqIGNvbnN0IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGRhdGEsIGludCBudW1fcGl4ZWxzKSB7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1OworICB1aW50MzJfdCBhcmdiLCBhcmdiMSwgbmV3X3JlZCwgbmV3X3JlZDE7CisgIGNvbnN0IHVpbnQzMl90IEdfdG9fUiA9IG0tPmdyZWVuX3RvX3JlZF87CisgIGNvbnN0IHVpbnQzMl90IEdfdG9fQiA9IG0tPmdyZWVuX3RvX2JsdWVfOworICBjb25zdCB1aW50MzJfdCBSX3RvX0IgPSBtLT5yZWRfdG9fYmx1ZV87CisgIHVpbnQzMl90KiBjb25zdCBwX2xvb3BfZW5kID0gZGF0YSArIChudW1fcGl4ZWxzICYgfjEpOworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAiLnNldCAgICAgICAgICAgIHB1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIuc2V0ICAgICAgICAgICAgbm9yZW9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcSAgICAgICAgICAgICAlW2RhdGFdLCAgICAgICVbcF9sb29wX2VuZF0sICAxZiAgICAgICAgXG5cdCIKKyAgICAiIG5vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJyZXBsdi5waCAgICAgICAgJVt0ZW1wMF0sICAgICAlW0dfdG9fUl0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInJlcGx2LnBoICAgICAgICAlW3RlbXAxXSwgICAgICVbR190b19CXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicmVwbHYucGggICAgICAgICVbdGVtcDJdLCAgICAgJVtSX3RvX0JdICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgJVt0ZW1wMF0sICAgICAlW3RlbXAwXSwgICAgICAgOCAgICAgICAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICAlW3RlbXAxXSwgICAgICVbdGVtcDFdLCAgICAgICA4ICAgICAgICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgICVbdGVtcDJdLCAgICAgJVt0ZW1wMl0sICAgICAgIDggICAgICAgICBcblx0IgorICAgICJzaHJhLnBoICAgICAgICAgJVt0ZW1wMF0sICAgICAlW3RlbXAwXSwgICAgICAgOCAgICAgICAgIFxuXHQiCisgICAgInNocmEucGggICAgICAgICAlW3RlbXAxXSwgICAgICVbdGVtcDFdLCAgICAgICA4ICAgICAgICAgXG5cdCIKKyAgICAic2hyYS5waCAgICAgICAgICVbdGVtcDJdLCAgICAgJVt0ZW1wMl0sICAgICAgIDggICAgICAgICBcblx0IgorICAiMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAgICAgICAgICAlW2FyZ2JdLCAgICAgIDAoJVtkYXRhXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAgICAgICVbYXJnYjFdLCAgICAgNCglW2RhdGFdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICJsaHUgICAgICAgICAgICAgJVtuZXdfcmVkXSwgICAyKCVbZGF0YV0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxodSAgICAgICAgICAgICAlW25ld19yZWQxXSwgIDYoJVtkYXRhXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY3JxLnFiLnBoICAgICVbdGVtcDNdLCAgICAgJVthcmdiXSwgICAgICAgICVbYXJnYjFdICBcblx0IgorICAgICJwcmVjci5xYi5waCAgICAgJVt0ZW1wNF0sICAgICAlW2FyZ2JdLCAgICAgICAgJVthcmdiMV0gIFxuXHQiCisgICAgInByZWNldS5waC5xYnJhICAlW3RlbXAzXSwgICAgICVbdGVtcDNdICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFibGEgICVbdGVtcDRdLCAgICAgJVt0ZW1wNF0gICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgJVt0ZW1wM10sICAgICAlW3RlbXAzXSwgICAgICAgOCAgICAgICAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICAlW3RlbXA0XSwgICAgICVbdGVtcDRdLCAgICAgICA4ICAgICAgICAgXG5cdCIKKyAgICAic2hyYS5waCAgICAgICAgICVbdGVtcDNdLCAgICAgJVt0ZW1wM10sICAgICAgIDggICAgICAgICBcblx0IgorICAgICJzaHJhLnBoICAgICAgICAgJVt0ZW1wNF0sICAgICAlW3RlbXA0XSwgICAgICAgOCAgICAgICAgIFxuXHQiCisgICAgIm11bC5waCAgICAgICAgICAlW3RlbXA1XSwgICAgICVbdGVtcDNdLCAgICAgICAlW3RlbXAwXSAgXG5cdCIKKyAgICAibXVsLnBoICAgICAgICAgICVbdGVtcDNdLCAgICAgJVt0ZW1wM10sICAgICAgICVbdGVtcDFdICBcblx0IgorICAgICJtdWwucGggICAgICAgICAgJVt0ZW1wNF0sICAgICAlW3RlbXA0XSwgICAgICAgJVt0ZW1wMl0gIFxuXHQiCisgICAgImFkZGl1ICAgICAgICAgICAlW2RhdGFdLCAgICAgICVbZGF0YV0sICAgICAgICA4ICAgICAgICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICAgICVbbmV3X3JlZDFdLCAgJVtuZXdfcmVkXSwgICAgIDE2LCAgIDE2ICBcblx0IgorICAgICJpbnMgICAgICAgICAgICAgJVthcmdiMV0sICAgICAlW2FyZ2JdLCAgICAgICAgMTYsICAgMTYgIFxuXHQiCisgICAgInNocmEucGggICAgICAgICAlW3RlbXA1XSwgICAgICVbdGVtcDVdLCAgICAgICA1ICAgICAgICAgXG5cdCIKKyAgICAic2hyYS5waCAgICAgICAgICVbdGVtcDNdLCAgICAgJVt0ZW1wM10sICAgICAgIDUgICAgICAgICBcblx0IgorICAgICJzaHJhLnBoICAgICAgICAgJVt0ZW1wNF0sICAgICAlW3RlbXA0XSwgICAgICAgNSAgICAgICAgIFxuXHQiCisgICAgInN1YnUucGggICAgICAgICAlW25ld19yZWQxXSwgICVbbmV3X3JlZDFdLCAgICAlW3RlbXA1XSAgXG5cdCIKKyAgICAic3VidS5waCAgICAgICAgICVbYXJnYjFdLCAgICAgJVthcmdiMV0sICAgICAgICVbdGVtcDNdICBcblx0IgorICAgICJwcmVjZXUucGgucWJyYSAgJVt0ZW1wNV0sICAgICAlW25ld19yZWQxXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUucGggICAgICAgICAlW2FyZ2IxXSwgICAgICVbYXJnYjFdLCAgICAgICAlW3RlbXA0XSAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFicmEgICVbdGVtcDNdLCAgICAgJVthcmdiMV0gICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzYiAgICAgICAgICAgICAgJVt0ZW1wNV0sICAgICAtMiglW2RhdGFdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNiICAgICAgICAgICAgICAlW3RlbXAzXSwgICAgIC00KCVbZGF0YV0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgICAgICAgICVbdGVtcDVdLCAgICAgJVt0ZW1wNV0sICAgICAgIDE2ICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAgICAgICAgJVt0ZW1wM10sICAgICAlW3RlbXAzXSwgICAgICAgMTYgICAgICAgIFxuXHQiCisgICAgInNiICAgICAgICAgICAgICAlW3RlbXA1XSwgICAgIC02KCVbZGF0YV0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYm5lICAgICAgICAgICAgICVbZGF0YV0sICAgICAgJVtwX2xvb3BfZW5kXSwgIDBiICAgICAgICBcblx0IgorICAgICIgc2IgICAgICAgICAgICAgJVt0ZW1wM10sICAgICAtOCglW2RhdGFdKSAgICAgICAgICAgICAgIFxuXHQiCisgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiLnNldCAgICAgICAgICAgIHBvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksCisgICAgICBbbmV3X3JlZDFdIj0mciIobmV3X3JlZDEpLCBbbmV3X3JlZF0iPSZyIihuZXdfcmVkKSwKKyAgICAgIFthcmdiXSI9JnIiKGFyZ2IpLCBbYXJnYjFdIj0mciIoYXJnYjEpLCBbZGF0YV0iKyZyIihkYXRhKQorICAgIDogW0dfdG9fUl0iciIoR190b19SKSwgW1JfdG9fQl0iciIoUl90b19CKSwKKyAgICAgIFtHX3RvX0JdInIiKEdfdG9fQiksIFtwX2xvb3BfZW5kXSJyIihwX2xvb3BfZW5kKQorICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIKKyAgKTsKKworICBpZiAobnVtX3BpeGVscyAmIDEpIHsKKyAgICBjb25zdCB1aW50MzJfdCBhcmdiXyA9IGRhdGFbMF07CisgICAgY29uc3QgdWludDMyX3QgZ3JlZW4gPSBhcmdiXyA+PiA4OworICAgIGNvbnN0IHVpbnQzMl90IHJlZCA9IGFyZ2JfID4+IDE2OworICAgIHVpbnQzMl90IG5ld19ibHVlID0gYXJnYl87CisgICAgbmV3X3JlZCA9IHJlZDsKKyAgICBuZXdfcmVkIC09IENvbG9yVHJhbnNmb3JtRGVsdGEobS0+Z3JlZW5fdG9fcmVkXywgZ3JlZW4pOworICAgIG5ld19yZWQgJj0gMHhmZjsKKyAgICBuZXdfYmx1ZSAtPSBDb2xvclRyYW5zZm9ybURlbHRhKG0tPmdyZWVuX3RvX2JsdWVfLCBncmVlbik7CisgICAgbmV3X2JsdWUgLT0gQ29sb3JUcmFuc2Zvcm1EZWx0YShtLT5yZWRfdG9fYmx1ZV8sIHJlZCk7CisgICAgbmV3X2JsdWUgJj0gMHhmZjsKKyAgICBkYXRhWzBdID0gKGFyZ2JfICYgMHhmZjAwZmYwMHUpIHwgKG5ld19yZWQgPDwgMTYpIHwgKG5ld19ibHVlKTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDhfdCBUcmFuc2Zvcm1Db2xvckJsdWUodWludDhfdCBncmVlbl90b19ibHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcmVkX3RvX2JsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYXJnYikgeworICBjb25zdCB1aW50MzJfdCBncmVlbiA9IGFyZ2IgPj4gODsKKyAgY29uc3QgdWludDMyX3QgcmVkID0gYXJnYiA+PiAxNjsKKyAgdWludDhfdCBuZXdfYmx1ZSA9IGFyZ2I7CisgIG5ld19ibHVlIC09IENvbG9yVHJhbnNmb3JtRGVsdGEoZ3JlZW5fdG9fYmx1ZSwgZ3JlZW4pOworICBuZXdfYmx1ZSAtPSBDb2xvclRyYW5zZm9ybURlbHRhKHJlZF90b19ibHVlLCByZWQpOworICByZXR1cm4gKG5ld19ibHVlICYgMHhmZik7Cit9CisKK3N0YXRpYyB2b2lkIENvbGxlY3RDb2xvckJsdWVUcmFuc2Zvcm1zX01JUFNkc3BSMihjb25zdCB1aW50MzJfdCogYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aWxlX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aWxlX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3JlZW5fdG9fYmx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVkX3RvX2JsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhpc3RvW10pIHsKKyAgY29uc3QgaW50IHJ0YiA9IChyZWRfdG9fYmx1ZSA8PCAxNikgfCAocmVkX3RvX2JsdWUgJiAweGZmZmYpOworICBjb25zdCBpbnQgZ3RiID0gKGdyZWVuX3RvX2JsdWUgPDwgMTYpIHwgKGdyZWVuX3RvX2JsdWUgJiAweGZmZmYpOworICBjb25zdCB1aW50MzJfdCBtYXNrID0gMHhmZjAwZmZ1OworICB3aGlsZSAodGlsZV9oZWlnaHQtLSA+IDApIHsKKyAgICBpbnQgeDsKKyAgICBjb25zdCB1aW50MzJfdCogcF9hcmdiID0gYXJnYjsKKyAgICBhcmdiICs9IHN0cmlkZTsKKyAgICBmb3IgKHggPSAwOyB4IDwgKHRpbGVfd2lkdGggPj4gMSk7ICsreCkgeworICAgICAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA2OworICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICJsdyAgICAgICAgICAgJVt0ZW1wMF0sICAwKCVbcF9hcmdiXSkgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAgICAgICAlW3RlbXAxXSwgIDQoJVtwX2FyZ2JdKSAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHJlY3IucWIucGggICVbdGVtcDJdLCAgJVt0ZW1wMF0sICAlW3RlbXAxXSAgICAgIFxuXHQiCisgICAgICAgICJpbnMgICAgICAgICAgJVt0ZW1wMV0sICAlW3RlbXAwXSwgIDE2LCAgICAxNiAgICAgXG5cdCIKKyAgICAgICAgInNocmEucGggICAgICAlW3RlbXAyXSwgICVbdGVtcDJdLCAgOCAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2hyYS5waCAgICAgICVbdGVtcDNdLCAgJVt0ZW1wMV0sICA4ICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWwucGggICAgICAgJVt0ZW1wNV0sICAlW3RlbXAyXSwgICVbcnRiXSAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bC5waCAgICAgICAlW3RlbXA2XSwgICVbdGVtcDNdLCAgJVtndGJdICAgICAgICBcblx0IgorICAgICAgICAiYW5kICAgICAgICAgICVbdGVtcDRdLCAgJVt0ZW1wMV0sICAlW21hc2tdICAgICAgIFxuXHQiCisgICAgICAgICJhZGRpdSAgICAgICAgJVtwX2FyZ2JdLCAlW3BfYXJnYl0sIDggICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNocmEucGggICAgICAlW3RlbXA1XSwgICVbdGVtcDVdLCAgNSAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2hyYS5waCAgICAgICVbdGVtcDZdLCAgJVt0ZW1wNl0sICA1ICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWJ1LnFiICAgICAgJVt0ZW1wMl0sICAlW3RlbXA0XSwgICVbdGVtcDVdICAgICAgXG5cdCIKKyAgICAgICAgInN1YnUucWIgICAgICAlW3RlbXAyXSwgICVbdGVtcDJdLCAgJVt0ZW1wNl0gICAgICBcblx0IgorICAgICAgICA6IFtwX2FyZ2JdIismciIocF9hcmdiKSwgW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwKKyAgICAgICAgICBbdGVtcDJdIj0mciIodGVtcDIpLCBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLAorICAgICAgICAgIFt0ZW1wNV0iPSZyIih0ZW1wNSksIFt0ZW1wNl0iPSZyIih0ZW1wNikKKyAgICAgICAgOiBbcnRiXSJyIihydGIpLCBbZ3RiXSJyIihndGIpLCBbbWFza10iciIobWFzaykKKyAgICAgICAgOiAibWVtb3J5IiwgImhpIiwgImxvIgorICAgICAgKTsKKyAgICAgICsraGlzdG9bKHVpbnQ4X3QpKHRlbXAyID4+IDE2KV07CisgICAgICArK2hpc3RvWyh1aW50OF90KXRlbXAyXTsKKyAgICB9CisgICAgaWYgKHRpbGVfd2lkdGggJiAxKSB7CisgICAgICArK2hpc3RvW1RyYW5zZm9ybUNvbG9yQmx1ZShncmVlbl90b19ibHVlLCByZWRfdG9fYmx1ZSwgKnBfYXJnYildOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDhfdCBUcmFuc2Zvcm1Db2xvclJlZCh1aW50OF90IGdyZWVuX3RvX3JlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFyZ2IpIHsKKyAgY29uc3QgdWludDMyX3QgZ3JlZW4gPSBhcmdiID4+IDg7CisgIHVpbnQzMl90IG5ld19yZWQgPSBhcmdiID4+IDE2OworICBuZXdfcmVkIC09IENvbG9yVHJhbnNmb3JtRGVsdGEoZ3JlZW5fdG9fcmVkLCBncmVlbik7CisgIHJldHVybiAobmV3X3JlZCAmIDB4ZmYpOworfQorCitzdGF0aWMgdm9pZCBDb2xsZWN0Q29sb3JSZWRUcmFuc2Zvcm1zX01JUFNkc3BSMihjb25zdCB1aW50MzJfdCogYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGlsZV93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aWxlX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBncmVlbl90b19yZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGlzdG9bXSkgeworICBjb25zdCBpbnQgZ3RyID0gKGdyZWVuX3RvX3JlZCA8PCAxNikgfCAoZ3JlZW5fdG9fcmVkICYgMHhmZmZmKTsKKyAgd2hpbGUgKHRpbGVfaGVpZ2h0LS0gPiAwKSB7CisgICAgaW50IHg7CisgICAgY29uc3QgdWludDMyX3QqIHBfYXJnYiA9IGFyZ2I7CisgICAgYXJnYiArPSBzdHJpZGU7CisgICAgZm9yICh4ID0gMDsgeCA8ICh0aWxlX3dpZHRoID4+IDEpOyArK3gpIHsKKyAgICAgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQ7CisgICAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgImx3ICAgICAgICAgICAlW3RlbXAwXSwgIDAoJVtwX2FyZ2JdKSAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICAgICAgICVbdGVtcDFdLCAgNCglW3BfYXJnYl0pICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwcmVjcnEucGgudyAgJVt0ZW1wNF0sICAlW3RlbXAwXSwgICVbdGVtcDFdICAgICAgXG5cdCIKKyAgICAgICAgImlucyAgICAgICAgICAlW3RlbXAxXSwgICVbdGVtcDBdLCAgMTYsICAgIDE2ICAgICBcblx0IgorICAgICAgICAic2hyYS5waCAgICAgICVbdGVtcDNdLCAgJVt0ZW1wMV0sICA4ICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWwucGggICAgICAgJVt0ZW1wMl0sICAlW3RlbXAzXSwgICVbZ3RyXSAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZGl1ICAgICAgICAlW3BfYXJnYl0sICVbcF9hcmdiXSwgOCAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2hyYS5waCAgICAgICVbdGVtcDJdLCAgJVt0ZW1wMl0sICA1ICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWJ1LnFiICAgICAgJVt0ZW1wMl0sICAlW3RlbXA0XSwgICVbdGVtcDJdICAgICAgXG5cdCIKKyAgICAgICAgOiBbcF9hcmdiXSIrJnIiKHBfYXJnYiksIFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksCisgICAgICAgICAgW3RlbXAyXSI9JnIiKHRlbXAyKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KQorICAgICAgICA6IFtndHJdInIiKGd0cikKKyAgICAgICAgOiAibWVtb3J5IiwgImhpIiwgImxvIgorICAgICAgKTsKKyAgICAgICsraGlzdG9bKHVpbnQ4X3QpKHRlbXAyID4+IDE2KV07CisgICAgICArK2hpc3RvWyh1aW50OF90KXRlbXAyXTsKKyAgICB9CisgICAgaWYgKHRpbGVfd2lkdGggJiAxKSB7CisgICAgICArK2hpc3RvW1RyYW5zZm9ybUNvbG9yUmVkKGdyZWVuX3RvX3JlZCwgKnBfYXJnYildOworICAgIH0KKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgVlA4TEVuY0RzcEluaXRNSVBTZHNwUjIodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBWUDhMRW5jRHNwSW5pdE1JUFNkc3BSMih2b2lkKSB7CisgIFZQOExTdWJ0cmFjdEdyZWVuRnJvbUJsdWVBbmRSZWQgPSBTdWJ0cmFjdEdyZWVuRnJvbUJsdWVBbmRSZWRfTUlQU2RzcFIyOworICBWUDhMVHJhbnNmb3JtQ29sb3IgPSBUcmFuc2Zvcm1Db2xvcl9NSVBTZHNwUjI7CisgIFZQOExDb2xsZWN0Q29sb3JCbHVlVHJhbnNmb3JtcyA9IENvbGxlY3RDb2xvckJsdWVUcmFuc2Zvcm1zX01JUFNkc3BSMjsKKyAgVlA4TENvbGxlY3RDb2xvclJlZFRyYW5zZm9ybXMgPSBDb2xsZWN0Q29sb3JSZWRUcmFuc2Zvcm1zX01JUFNkc3BSMjsKK30KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9NSVBTX0RTUF9SMgorCitXRUJQX0RTUF9JTklUX1NUVUIoVlA4TEVuY0RzcEluaXRNSVBTZHNwUjIpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfTUlQU19EU1BfUjIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbG9zc2xlc3NfZW5jX21zYS5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9sb3NzbGVzc19lbmNfbXNhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAwZGRkZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbG9zc2xlc3NfZW5jX21zYS5jCkBAIC0wLDAgKzEsMTQ4IEBACisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gTVNBIHZhcmlhbnQgb2YgSW1hZ2UgdHJhbnNmb3JtIG1ldGhvZHMgZm9yIGxvc3NsZXNzIGVuY29kZXIuCisvLworLy8gQXV0aG9yczogUHJhc2hhbnQgUGF0aWwgKFByYXNoYW50LlBhdGlsQGltZ3RlYy5jb20pCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NU0EpCisKKyNpbmNsdWRlICJzcmMvZHNwL2xvc3NsZXNzLmgiCisjaW5jbHVkZSAic3JjL2RzcC9tc2FfbWFjcm8uaCIKKworI2RlZmluZSBUUkFOU0ZPUk1fQ09MT1JfOChzcmMwLCBzcmMxLCBkc3QwLCBkc3QxLCBjMCwgYzEsIG1hc2swLCBtYXNrMSkgZG8geyAgXAorICB2OGkxNiBnMCwgZzEsIHQwLCB0MSwgdDIsIHQzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2NGkzMiB0NCwgdDU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBWU0hGX0IyX1NIKHNyYzAsIHNyYzAsIHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMCwgZzAsIGcxKTsgICAgICAgICAgICAgICAgICAgXAorICBET1RQX1NCMl9TSChnMCwgZzEsIGMwLCBjMCwgdDAsIHQxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBTUkFJX0gyX1NIKHQwLCB0MSwgNSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0MCA9IF9fbXNhX3N1YnZfaCgodjhpMTYpc3JjMCwgdDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0MSA9IF9fbXNhX3N1YnZfaCgodjhpMTYpc3JjMSwgdDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0NCA9IF9fbXNhX3NybGlfdygodjRpMzIpc3JjMCwgMTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0NSA9IF9fbXNhX3NybGlfdygodjRpMzIpc3JjMSwgMTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBET1RQX1NCMl9TSCh0NCwgdDUsIGMxLCBjMSwgdDIsIHQzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBTUkFJX0gyX1NIKHQyLCB0MywgNSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBTVUIyKHQwLCB0MiwgdDEsIHQzLCB0MCwgdDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBWU0hGX0IyX1VCKHNyYzAsIHQwLCBzcmMxLCB0MSwgbWFzazEsIG1hc2sxLCBkc3QwLCBkc3QxKTsgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBUUkFOU0ZPUk1fQ09MT1JfNChzcmMsIGRzdCwgYzAsIGMxLCBtYXNrMCwgbWFzazEpIGRvIHsgIFwKKyAgY29uc3QgdjE2aTggZzAgPSBWU0hGX1NCKHNyYywgc3JjLCBtYXNrMCk7ICAgICAgICAgICAgICAgICAgICBcCisgIHY4aTE2IHQwID0gX19tc2FfZG90cF9zX2goYzAsIGcwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2OGkxNiB0MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdjRpMzIgdDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHQwID0gU1JBSV9IKHQwLCA1KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0MCA9IF9fbXNhX3N1YnZfaCgodjhpMTYpc3JjLCB0MCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdDIgPSBfX21zYV9zcmxpX3coKHY0aTMyKXNyYywgMTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHQxID0gX19tc2FfZG90cF9zX2goYzEsICh2MTZpOCl0Mik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0MSA9IFNSQUlfSCh0MSwgNSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdDAgPSB0MCAtIHQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRzdCA9IFZTSEZfVUIoc3JjLCB0MCwgbWFzazEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgVHJhbnNmb3JtQ29sb3JfTVNBKGNvbnN0IFZQOExNdWx0aXBsaWVycyogY29uc3QgbSwgdWludDMyX3QqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMpIHsKKyAgdjE2dTggc3JjMCwgZHN0MDsKKyAgY29uc3QgdjE2aTggZzJiciA9ICh2MTZpOClfX21zYV9maWxsX3cobS0+Z3JlZW5fdG9fYmx1ZV8gfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobS0+Z3JlZW5fdG9fcmVkXyA8PCAxNikpOworICBjb25zdCB2MTZpOCByMmIgPSAodjE2aTgpX19tc2FfZmlsbF93KG0tPnJlZF90b19ibHVlXyk7CisgIGNvbnN0IHYxNnU4IG1hc2swID0geyAxLCAyNTUsIDEsIDI1NSwgNSwgMjU1LCA1LCAyNTUsIDksIDI1NSwgOSwgMjU1LAorICAgICAgICAgICAgICAgICAgICAgICAgMTMsIDI1NSwgMTMsIDI1NSB9OworICBjb25zdCB2MTZ1OCBtYXNrMSA9IHsgMTYsIDEsIDE4LCAzLCAyMCwgNSwgMjIsIDcsIDI0LCA5LCAyNiwgMTEsCisgICAgICAgICAgICAgICAgICAgICAgICAyOCwgMTMsIDMwLCAxNSB9OworCisgIHdoaWxlIChudW1fcGl4ZWxzID49IDgpIHsKKyAgICB2MTZ1OCBzcmMxLCBkc3QxOworICAgIExEX1VCMihkYXRhLCA0LCBzcmMwLCBzcmMxKTsKKyAgICBUUkFOU0ZPUk1fQ09MT1JfOChzcmMwLCBzcmMxLCBkc3QwLCBkc3QxLCBnMmJyLCByMmIsIG1hc2swLCBtYXNrMSk7CisgICAgU1RfVUIyKGRzdDAsIGRzdDEsIGRhdGEsIDQpOworICAgIGRhdGEgKz0gODsKKyAgICBudW1fcGl4ZWxzIC09IDg7CisgIH0KKyAgaWYgKG51bV9waXhlbHMgPiAwKSB7CisgICAgaWYgKG51bV9waXhlbHMgPj0gNCkgeworICAgICAgc3JjMCA9IExEX1VCKGRhdGEpOworICAgICAgVFJBTlNGT1JNX0NPTE9SXzQoc3JjMCwgZHN0MCwgZzJiciwgcjJiLCBtYXNrMCwgbWFzazEpOworICAgICAgU1RfVUIoZHN0MCwgZGF0YSk7CisgICAgICBkYXRhICs9IDQ7CisgICAgICBudW1fcGl4ZWxzIC09IDQ7CisgICAgfQorICAgIGlmIChudW1fcGl4ZWxzID4gMCkgeworICAgICAgc3JjMCA9IExEX1VCKGRhdGEpOworICAgICAgVFJBTlNGT1JNX0NPTE9SXzQoc3JjMCwgZHN0MCwgZzJiciwgcjJiLCBtYXNrMCwgbWFzazEpOworICAgICAgaWYgKG51bV9waXhlbHMgPT0gMykgeworICAgICAgICBjb25zdCB1aW50NjRfdCBwaXhfZCA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NClkc3QwLCAwKTsKKyAgICAgICAgY29uc3QgdWludDMyX3QgcGl4X3cgPSBfX21zYV9jb3B5X3NfdygodjRpMzIpZHN0MCwgMik7CisgICAgICAgIFNEKHBpeF9kLCBkYXRhICsgMCk7CisgICAgICAgIFNXKHBpeF93LCBkYXRhICsgMik7CisgICAgICB9IGVsc2UgaWYgKG51bV9waXhlbHMgPT0gMikgeworICAgICAgICBjb25zdCB1aW50NjRfdCBwaXhfZCA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NClkc3QwLCAwKTsKKyAgICAgICAgU0QocGl4X2QsIGRhdGEpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgdWludDMyX3QgcGl4X3cgPSBfX21zYV9jb3B5X3NfdygodjRpMzIpZHN0MCwgMCk7CisgICAgICAgIFNXKHBpeF93LCBkYXRhKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgU3VidHJhY3RHcmVlbkZyb21CbHVlQW5kUmVkX01TQSh1aW50MzJfdCogYXJnYl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscykgeworICBpbnQgaTsKKyAgdWludDhfdCogcHRlbXBfZGF0YSA9ICh1aW50OF90KilhcmdiX2RhdGE7CisgIHYxNnU4IHNyYzAsIGRzdDAsIHRtcDA7CisgIGNvbnN0IHYxNnU4IG1hc2sgPSB7IDEsIDI1NSwgMSwgMjU1LCA1LCAyNTUsIDUsIDI1NSwgOSwgMjU1LCA5LCAyNTUsCisgICAgICAgICAgICAgICAgICAgICAgIDEzLCAyNTUsIDEzLCAyNTUgfTsKKworICB3aGlsZSAobnVtX3BpeGVscyA+PSA4KSB7CisgICAgdjE2dTggc3JjMSwgZHN0MSwgdG1wMTsKKyAgICBMRF9VQjIocHRlbXBfZGF0YSwgMTYsIHNyYzAsIHNyYzEpOworICAgIFZTSEZfQjJfVUIoc3JjMCwgc3JjMSwgc3JjMSwgc3JjMCwgbWFzaywgbWFzaywgdG1wMCwgdG1wMSk7CisgICAgU1VCMihzcmMwLCB0bXAwLCBzcmMxLCB0bXAxLCBkc3QwLCBkc3QxKTsKKyAgICBTVF9VQjIoZHN0MCwgZHN0MSwgcHRlbXBfZGF0YSwgMTYpOworICAgIHB0ZW1wX2RhdGEgKz0gOCAqIDQ7CisgICAgbnVtX3BpeGVscyAtPSA4OworICB9CisgIGlmIChudW1fcGl4ZWxzID4gMCkgeworICAgIGlmIChudW1fcGl4ZWxzID49IDQpIHsKKyAgICAgIHNyYzAgPSBMRF9VQihwdGVtcF9kYXRhKTsKKyAgICAgIHRtcDAgPSBWU0hGX1VCKHNyYzAsIHNyYzAsIG1hc2spOworICAgICAgZHN0MCA9IHNyYzAgLSB0bXAwOworICAgICAgU1RfVUIoZHN0MCwgcHRlbXBfZGF0YSk7CisgICAgICBwdGVtcF9kYXRhICs9IDQgKiA0OworICAgICAgbnVtX3BpeGVscyAtPSA0OworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BpeGVsczsgaSsrKSB7CisgICAgICBjb25zdCB1aW50OF90IGIgPSBwdGVtcF9kYXRhWzBdOworICAgICAgY29uc3QgdWludDhfdCBnID0gcHRlbXBfZGF0YVsxXTsKKyAgICAgIGNvbnN0IHVpbnQ4X3QgciA9IHB0ZW1wX2RhdGFbMl07CisgICAgICBwdGVtcF9kYXRhWzBdID0gKGIgLSBnKSAmIDB4ZmY7CisgICAgICBwdGVtcF9kYXRhWzJdID0gKHIgLSBnKSAmIDB4ZmY7CisgICAgICBwdGVtcF9kYXRhICs9IDQ7CisgICAgfQorICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBWUDhMRW5jRHNwSW5pdE1TQSh2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFZQOExFbmNEc3BJbml0TVNBKHZvaWQpIHsKKyAgVlA4TFN1YnRyYWN0R3JlZW5Gcm9tQmx1ZUFuZFJlZCA9IFN1YnRyYWN0R3JlZW5Gcm9tQmx1ZUFuZFJlZF9NU0E7CisgIFZQOExUcmFuc2Zvcm1Db2xvciA9IFRyYW5zZm9ybUNvbG9yX01TQTsKK30KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9NU0EKKworV0VCUF9EU1BfSU5JVF9TVFVCKFZQOExFbmNEc3BJbml0TVNBKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX01TQQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9sb3NzbGVzc19lbmNfbmVvbi5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9sb3NzbGVzc19lbmNfbmVvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjN2I3M2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2xvc3NsZXNzX2VuY19uZW9uLmMKQEAgLTAsMCArMSwxNDQgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBORU9OIHZhcmlhbnQgb2YgbWV0aG9kcyBmb3IgbG9zc2xlc3MgZW5jb2RlcgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9ORU9OKQorCisjaW5jbHVkZSA8YXJtX25lb24uaD4KKworI2luY2x1ZGUgInNyYy9kc3AvbG9zc2xlc3MuaCIKKyNpbmNsdWRlICJzcmMvZHNwL25lb24uaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFN1YnRyYWN0LUdyZWVuIFRyYW5zZm9ybQorCisvLyB2dGJsP191OCBhcmUgbWFya2VkIHVuYXZhaWxhYmxlIGZvciBpT1MgYXJtNjQgd2l0aCBYY29kZSA8IDYuMywgdXNlCisvLyBub24tc3RhbmRhcmQgdmVyc2lvbnMgdGhlcmUuCisjaWYgZGVmaW5lZChfX0FQUExFX18pICYmIGRlZmluZWQoX19hYXJjaDY0X18pICYmIFwKKyAgICBkZWZpbmVkKF9fYXBwbGVfYnVpbGRfdmVyc2lvbl9fKSAmJiAoX19hcHBsZV9idWlsZF92ZXJzaW9uX188IDYwMjAwMzcpCisjZGVmaW5lIFVTRV9WVEJMUQorI2VuZGlmCisKKyNpZmRlZiBVU0VfVlRCTFEKKy8vIDI1NSA9IGJ5dGUgd2lsbCBiZSB6ZXJvZWQKK3N0YXRpYyBjb25zdCB1aW50OF90IGtHcmVlblNodWZmbGVbMTZdID0geworICAxLCAyNTUsIDEsIDI1NSwgNSwgMjU1LCA1LCAyNTUsIDksIDI1NSwgOSwgMjU1LCAxMywgMjU1LCAxMywgMjU1Cit9OworCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDh4MTZfdCBEb0dyZWVuU2h1ZmZsZV9ORU9OKGNvbnN0IHVpbnQ4eDE2X3QgYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDh4MTZfdCBzaHVmZmxlKSB7CisgIHJldHVybiB2Y29tYmluZV91OCh2dGJsMXFfdTgoYXJnYiwgdmdldF9sb3dfdTgoc2h1ZmZsZSkpLAorICAgICAgICAgICAgICAgICAgICAgdnRibDFxX3U4KGFyZ2IsIHZnZXRfaGlnaF91OChzaHVmZmxlKSkpOworfQorI2Vsc2UgIC8vICFVU0VfVlRCTFEKKy8vIDI1NSA9IGJ5dGUgd2lsbCBiZSB6ZXJvZWQKK3N0YXRpYyBjb25zdCB1aW50OF90IGtHcmVlblNodWZmbGVbOF0gPSB7IDEsIDI1NSwgMSwgMjU1LCA1LCAyNTUsIDUsIDI1NSAgfTsKKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ4eDE2X3QgRG9HcmVlblNodWZmbGVfTkVPTihjb25zdCB1aW50OHgxNl90IGFyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4eDhfdCBzaHVmZmxlKSB7CisgIHJldHVybiB2Y29tYmluZV91OCh2dGJsMV91OCh2Z2V0X2xvd191OChhcmdiKSwgc2h1ZmZsZSksCisgICAgICAgICAgICAgICAgICAgICB2dGJsMV91OCh2Z2V0X2hpZ2hfdTgoYXJnYiksIHNodWZmbGUpKTsKK30KKyNlbmRpZiAgLy8gVVNFX1ZUQkxRCisKK3N0YXRpYyB2b2lkIFN1YnRyYWN0R3JlZW5Gcm9tQmx1ZUFuZFJlZF9ORU9OKHVpbnQzMl90KiBhcmdiX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscykgeworICBjb25zdCB1aW50MzJfdCogY29uc3QgZW5kID0gYXJnYl9kYXRhICsgKG51bV9waXhlbHMgJiB+Myk7CisjaWZkZWYgVVNFX1ZUQkxRCisgIGNvbnN0IHVpbnQ4eDE2X3Qgc2h1ZmZsZSA9IHZsZDFxX3U4KGtHcmVlblNodWZmbGUpOworI2Vsc2UKKyAgY29uc3QgdWludDh4OF90IHNodWZmbGUgPSB2bGQxX3U4KGtHcmVlblNodWZmbGUpOworI2VuZGlmCisgIGZvciAoOyBhcmdiX2RhdGEgPCBlbmQ7IGFyZ2JfZGF0YSArPSA0KSB7CisgICAgY29uc3QgdWludDh4MTZfdCBhcmdiID0gdmxkMXFfdTgoKHVpbnQ4X3QqKWFyZ2JfZGF0YSk7CisgICAgY29uc3QgdWludDh4MTZfdCBncmVlbnMgPSBEb0dyZWVuU2h1ZmZsZV9ORU9OKGFyZ2IsIHNodWZmbGUpOworICAgIHZzdDFxX3U4KCh1aW50OF90KilhcmdiX2RhdGEsIHZzdWJxX3U4KGFyZ2IsIGdyZWVucykpOworICB9CisgIC8vIGZhbGx0aHJvdWdoIGFuZCBmaW5pc2ggb2ZmIHdpdGggcGxhaW4tQworICBWUDhMU3VidHJhY3RHcmVlbkZyb21CbHVlQW5kUmVkX0MoYXJnYl9kYXRhLCBudW1fcGl4ZWxzICYgMyk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb2xvciBUcmFuc2Zvcm0KKworc3RhdGljIHZvaWQgVHJhbnNmb3JtQ29sb3JfTkVPTihjb25zdCBWUDhMTXVsdGlwbGllcnMqIGNvbnN0IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBhcmdiX2RhdGEsIGludCBudW1fcGl4ZWxzKSB7CisgIC8vIHNpZ24tZXh0ZW5kZWQgbXVsdGlwbHlpbmcgY29uc3RhbnRzLCBwcmUtc2hpZnRlZCBieSA2LgorI2RlZmluZSBDU1QoWCkgICgoKGludDE2X3QpKG0tPlggPDwgOCkpID4+IDYpCisgIGNvbnN0IGludDE2X3QgcmJbOF0gPSB7CisgICAgQ1NUKGdyZWVuX3RvX2JsdWVfKSwgQ1NUKGdyZWVuX3RvX3JlZF8pLAorICAgIENTVChncmVlbl90b19ibHVlXyksIENTVChncmVlbl90b19yZWRfKSwKKyAgICBDU1QoZ3JlZW5fdG9fYmx1ZV8pLCBDU1QoZ3JlZW5fdG9fcmVkXyksCisgICAgQ1NUKGdyZWVuX3RvX2JsdWVfKSwgQ1NUKGdyZWVuX3RvX3JlZF8pCisgIH07CisgIGNvbnN0IGludDE2eDhfdCBtdWx0c19yYiA9IHZsZDFxX3MxNihyYik7CisgIGNvbnN0IGludDE2X3QgYjJbOF0gPSB7CisgICAgMCwgQ1NUKHJlZF90b19ibHVlXyksIDAsIENTVChyZWRfdG9fYmx1ZV8pLAorICAgIDAsIENTVChyZWRfdG9fYmx1ZV8pLCAwLCBDU1QocmVkX3RvX2JsdWVfKSwKKyAgfTsKKyAgY29uc3QgaW50MTZ4OF90IG11bHRzX2IyID0gdmxkMXFfczE2KGIyKTsKKyN1bmRlZiBDU1QKKyNpZmRlZiBVU0VfVlRCTFEKKyAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga2cwZzBbMTZdID0geworICAgIDI1NSwgMSwgMjU1LCAxLCAyNTUsIDUsIDI1NSwgNSwgMjU1LCA5LCAyNTUsIDksIDI1NSwgMTMsIDI1NSwgMTMKKyAgfTsKKyAgY29uc3QgdWludDh4MTZfdCBzaHVmZmxlID0gdmxkMXFfdTgoa2cwZzApOworI2Vsc2UKKyAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgazBnMGdbOF0gPSB7IDI1NSwgMSwgMjU1LCAxLCAyNTUsIDUsIDI1NSwgNSB9OworICBjb25zdCB1aW50OHg4X3Qgc2h1ZmZsZSA9IHZsZDFfdTgoazBnMGcpOworI2VuZGlmCisgIGNvbnN0IHVpbnQzMng0X3QgbWFza19yYiA9IHZkdXBxX25fdTMyKDB4MDBmZjAwZmZ1KTsgIC8vIHJlZC1ibHVlIG1hc2tzCisgIGludCBpOworICBmb3IgKGkgPSAwOyBpICsgNCA8PSBudW1fcGl4ZWxzOyBpICs9IDQpIHsKKyAgICBjb25zdCB1aW50OHgxNl90IGluID0gdmxkMXFfdTgoKHVpbnQ4X3QqKShhcmdiX2RhdGEgKyBpKSk7CisgICAgLy8gMCBnIDAgZworICAgIGNvbnN0IHVpbnQ4eDE2X3QgZ3JlZW5zID0gRG9HcmVlblNodWZmbGVfTkVPTihpbiwgc2h1ZmZsZSk7CisgICAgLy8geCBkciAgeCBkYjEKKyAgICBjb25zdCBpbnQxNng4X3QgQSA9IHZxZG11bGhxX3MxNih2cmVpbnRlcnByZXRxX3MxNl91OChncmVlbnMpLCBtdWx0c19yYik7CisgICAgLy8gciAwICAgYiAgIDAKKyAgICBjb25zdCBpbnQxNng4X3QgQiA9IHZzaGxxX25fczE2KHZyZWludGVycHJldHFfczE2X3U4KGluKSwgOCk7CisgICAgLy8geCBkYjIgMCAgIDAKKyAgICBjb25zdCBpbnQxNng4X3QgQyA9IHZxZG11bGhxX3MxNihCLCBtdWx0c19iMik7CisgICAgLy8gMCAwICAgeCBkYjIKKyAgICBjb25zdCB1aW50MzJ4NF90IEQgPSB2c2hycV9uX3UzMih2cmVpbnRlcnByZXRxX3UzMl9zMTYoQyksIDE2KTsKKyAgICAvLyB4IGRyICB4ICBkYgorICAgIGNvbnN0IGludDh4MTZfdCBFID0gdmFkZHFfczgodnJlaW50ZXJwcmV0cV9zOF91MzIoRCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cmVpbnRlcnByZXRxX3M4X3MxNihBKSk7CisgICAgLy8gMCBkciAgMCAgZGIKKyAgICBjb25zdCB1aW50MzJ4NF90IEYgPSB2YW5kcV91MzIodnJlaW50ZXJwcmV0cV91MzJfczgoRSksIG1hc2tfcmIpOworICAgIGNvbnN0IGludDh4MTZfdCBvdXQgPSB2c3VicV9zOCh2cmVpbnRlcnByZXRxX3M4X3U4KGluKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnJlaW50ZXJwcmV0cV9zOF91MzIoRikpOworICAgIHZzdDFxX3M4KChpbnQ4X3QqKShhcmdiX2RhdGEgKyBpKSwgb3V0KTsKKyAgfQorICAvLyBmYWxsdGhyb3VnaCBhbmQgZmluaXNoIG9mZiB3aXRoIHBsYWluLUMKKyAgVlA4TFRyYW5zZm9ybUNvbG9yX0MobSwgYXJnYl9kYXRhICsgaSwgbnVtX3BpeGVscyAtIGkpOworfQorCisjdW5kZWYgVVNFX1ZUQkxRCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBWUDhMRW5jRHNwSW5pdE5FT04odm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBWUDhMRW5jRHNwSW5pdE5FT04odm9pZCkgeworICBWUDhMU3VidHJhY3RHcmVlbkZyb21CbHVlQW5kUmVkID0gU3VidHJhY3RHcmVlbkZyb21CbHVlQW5kUmVkX05FT047CisgIFZQOExUcmFuc2Zvcm1Db2xvciA9IFRyYW5zZm9ybUNvbG9yX05FT047Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfTkVPTgorCitXRUJQX0RTUF9JTklUX1NUVUIoVlA4TEVuY0RzcEluaXRORU9OKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX05FT04KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbG9zc2xlc3NfZW5jX3NzZTIuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbG9zc2xlc3NfZW5jX3NzZTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODRhOTkwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9sb3NzbGVzc19lbmNfc3NlMi5jCkBAIC0wLDAgKzEsNzA1IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU1NFMiB2YXJpYW50IG9mIG1ldGhvZHMgZm9yIGxvc3NsZXNzIGVuY29kZXIKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFMikKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxlbW1pbnRyaW4uaD4KKyNpbmNsdWRlICJzcmMvZHNwL2xvc3NsZXNzLmgiCisjaW5jbHVkZSAic3JjL2RzcC9jb21tb25fc3NlMi5oIgorI2luY2x1ZGUgInNyYy9kc3AvbG9zc2xlc3NfY29tbW9uLmgiCisKKy8vIEZvciBzaWduLWV4dGVuZGVkIG11bHRpcGx5aW5nIGNvbnN0YW50cywgcHJlLXNoaWZ0ZWQgYnkgNToKKyNkZWZpbmUgQ1NUXzViKFgpICAoKChpbnQxNl90KSgodWludDE2X3QpKFgpIDw8IDgpKSA+PiA1KQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU3VidHJhY3QtR3JlZW4gVHJhbnNmb3JtCisKK3N0YXRpYyB2b2lkIFN1YnRyYWN0R3JlZW5Gcm9tQmx1ZUFuZFJlZF9TU0UyKHVpbnQzMl90KiBhcmdiX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscykgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSArIDQgPD0gbnVtX3BpeGVsczsgaSArPSA0KSB7CisgICAgY29uc3QgX19tMTI4aSBpbiA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJmFyZ2JfZGF0YVtpXSk7IC8vIGFyZ2IKKyAgICBjb25zdCBfX20xMjhpIEEgPSBfbW1fc3JsaV9lcGkxNihpbiwgOCk7ICAgICAvLyAwIGEgMCBnCisgICAgY29uc3QgX19tMTI4aSBCID0gX21tX3NodWZmbGVsb19lcGkxNihBLCBfTU1fU0hVRkZMRSgyLCAyLCAwLCAwKSk7CisgICAgY29uc3QgX19tMTI4aSBDID0gX21tX3NodWZmbGVoaV9lcGkxNihCLCBfTU1fU0hVRkZMRSgyLCAyLCAwLCAwKSk7ICAvLyAwZzBnCisgICAgY29uc3QgX19tMTI4aSBvdXQgPSBfbW1fc3ViX2VwaTgoaW4sIEMpOworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZhcmdiX2RhdGFbaV0sIG91dCk7CisgIH0KKyAgLy8gZmFsbHRocm91Z2ggYW5kIGZpbmlzaCBvZmYgd2l0aCBwbGFpbi1DCisgIGlmIChpICE9IG51bV9waXhlbHMpIHsKKyAgICBWUDhMU3VidHJhY3RHcmVlbkZyb21CbHVlQW5kUmVkX0MoYXJnYl9kYXRhICsgaSwgbnVtX3BpeGVscyAtIGkpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb2xvciBUcmFuc2Zvcm0KKworI2RlZmluZSBNS19DU1RfMTYoSEksIExPKSBcCisgIF9tbV9zZXQxX2VwaTMyKChpbnQpKCgodWludDMyX3QpKEhJKSA8PCAxNikgfCAoKExPKSAmIDB4ZmZmZikpKQorCitzdGF0aWMgdm9pZCBUcmFuc2Zvcm1Db2xvcl9TU0UyKGNvbnN0IFZQOExNdWx0aXBsaWVycyogY29uc3QgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGFyZ2JfZGF0YSwgaW50IG51bV9waXhlbHMpIHsKKyAgY29uc3QgX19tMTI4aSBtdWx0c19yYiA9IE1LX0NTVF8xNihDU1RfNWIobS0+Z3JlZW5fdG9fcmVkXyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NUXzViKG0tPmdyZWVuX3RvX2JsdWVfKSk7CisgIGNvbnN0IF9fbTEyOGkgbXVsdHNfYjIgPSBNS19DU1RfMTYoQ1NUXzViKG0tPnJlZF90b19ibHVlXyksIDApOworICBjb25zdCBfX20xMjhpIG1hc2tfYWcgPSBfbW1fc2V0MV9lcGkzMigweGZmMDBmZjAwKTsgIC8vIGFscGhhLWdyZWVuIG1hc2tzCisgIGNvbnN0IF9fbTEyOGkgbWFza19yYiA9IF9tbV9zZXQxX2VwaTMyKDB4MDBmZjAwZmYpOyAgLy8gcmVkLWJsdWUgbWFza3MKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgKyA0IDw9IG51bV9waXhlbHM7IGkgKz0gNCkgeworICAgIGNvbnN0IF9fbTEyOGkgaW4gPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZhcmdiX2RhdGFbaV0pOyAvLyBhcmdiCisgICAgY29uc3QgX19tMTI4aSBBID0gX21tX2FuZF9zaTEyOChpbiwgbWFza19hZyk7ICAgICAvLyBhICAgMCAgIGcgICAwCisgICAgY29uc3QgX19tMTI4aSBCID0gX21tX3NodWZmbGVsb19lcGkxNihBLCBfTU1fU0hVRkZMRSgyLCAyLCAwLCAwKSk7CisgICAgY29uc3QgX19tMTI4aSBDID0gX21tX3NodWZmbGVoaV9lcGkxNihCLCBfTU1fU0hVRkZMRSgyLCAyLCAwLCAwKSk7ICAvLyBnMGcwCisgICAgY29uc3QgX19tMTI4aSBEID0gX21tX211bGhpX2VwaTE2KEMsIG11bHRzX3JiKTsgICAgLy8geCBkciAgeCBkYjEKKyAgICBjb25zdCBfX20xMjhpIEUgPSBfbW1fc2xsaV9lcGkxNihpbiwgOCk7ICAgICAgICAgICAvLyByIDAgICBiICAgMAorICAgIGNvbnN0IF9fbTEyOGkgRiA9IF9tbV9tdWxoaV9lcGkxNihFLCBtdWx0c19iMik7ICAgIC8vIHggZGIyIDAgICAwCisgICAgY29uc3QgX19tMTI4aSBHID0gX21tX3NybGlfZXBpMzIoRiwgMTYpOyAgICAgICAgICAgLy8gMCAwICAgeCBkYjIKKyAgICBjb25zdCBfX20xMjhpIEggPSBfbW1fYWRkX2VwaTgoRywgRCk7ICAgICAgICAgICAgICAvLyB4IGRyICB4ICBkYgorICAgIGNvbnN0IF9fbTEyOGkgSSA9IF9tbV9hbmRfc2kxMjgoSCwgbWFza19yYik7ICAgICAgIC8vIDAgZHIgIDAgIGRiCisgICAgY29uc3QgX19tMTI4aSBvdXQgPSBfbW1fc3ViX2VwaTgoaW4sIEkpOworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZhcmdiX2RhdGFbaV0sIG91dCk7CisgIH0KKyAgLy8gZmFsbHRocm91Z2ggYW5kIGZpbmlzaCBvZmYgd2l0aCBwbGFpbi1DCisgIGlmIChpICE9IG51bV9waXhlbHMpIHsKKyAgICBWUDhMVHJhbnNmb3JtQ29sb3JfQyhtLCBhcmdiX2RhdGEgKyBpLCBudW1fcGl4ZWxzIC0gaSk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgU1BBTiA4CitzdGF0aWMgdm9pZCBDb2xsZWN0Q29sb3JCbHVlVHJhbnNmb3Jtc19TU0UyKGNvbnN0IHVpbnQzMl90KiBhcmdiLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGlsZV93aWR0aCwgaW50IHRpbGVfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3JlZW5fdG9fYmx1ZSwgaW50IHJlZF90b19ibHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGlzdG9bXSkgeworICBjb25zdCBfX20xMjhpIG11bHRzX3IgPSBNS19DU1RfMTYoQ1NUXzViKHJlZF90b19ibHVlKSwgMCk7CisgIGNvbnN0IF9fbTEyOGkgbXVsdHNfZyA9IE1LX0NTVF8xNigwLCBDU1RfNWIoZ3JlZW5fdG9fYmx1ZSkpOworICBjb25zdCBfX20xMjhpIG1hc2tfZyA9IF9tbV9zZXQxX2VwaTMyKDB4MDBmZjAwKTsgIC8vIGdyZWVuIG1hc2sKKyAgY29uc3QgX19tMTI4aSBtYXNrX2IgPSBfbW1fc2V0MV9lcGkzMigweDAwMDBmZik7ICAvLyBibHVlIG1hc2sKKyAgaW50IHk7CisgIGZvciAoeSA9IDA7IHkgPCB0aWxlX2hlaWdodDsgKyt5KSB7CisgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IHNyYyA9IGFyZ2IgKyB5ICogc3RyaWRlOworICAgIGludCBpLCB4OworICAgIGZvciAoeCA9IDA7IHggKyBTUEFOIDw9IHRpbGVfd2lkdGg7IHggKz0gU1BBTikgeworICAgICAgdWludDE2X3QgdmFsdWVzW1NQQU5dOworICAgICAgY29uc3QgX19tMTI4aSBpbjAgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZzcmNbeCArICAgICAgICAwXSk7CisgICAgICBjb25zdCBfX20xMjhpIGluMSA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJnNyY1t4ICsgU1BBTiAvIDJdKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgQTAgPSBfbW1fc2xsaV9lcGkxNihpbjAsIDgpOyAgICAgICAgLy8gciAwICB8IGIgMAorICAgICAgY29uc3QgX19tMTI4aSBBMSA9IF9tbV9zbGxpX2VwaTE2KGluMSwgOCk7CisgICAgICBjb25zdCBfX20xMjhpIEIwID0gX21tX2FuZF9zaTEyOChpbjAsIG1hc2tfZyk7ICAgIC8vIDAgMCAgfCBnIDAKKyAgICAgIGNvbnN0IF9fbTEyOGkgQjEgPSBfbW1fYW5kX3NpMTI4KGluMSwgbWFza19nKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgQzAgPSBfbW1fbXVsaGlfZXBpMTYoQTAsIG11bHRzX3IpOyAgLy8geCBkYiB8IDAgMAorICAgICAgY29uc3QgX19tMTI4aSBDMSA9IF9tbV9tdWxoaV9lcGkxNihBMSwgbXVsdHNfcik7CisgICAgICBjb25zdCBfX20xMjhpIEQwID0gX21tX211bGhpX2VwaTE2KEIwLCBtdWx0c19nKTsgIC8vIDAgMCAgfCB4IGRiCisgICAgICBjb25zdCBfX20xMjhpIEQxID0gX21tX211bGhpX2VwaTE2KEIxLCBtdWx0c19nKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgRTAgPSBfbW1fc3ViX2VwaTgoaW4wLCBEMCk7ICAgICAgICAgLy8geCB4ICB8IHggYicKKyAgICAgIGNvbnN0IF9fbTEyOGkgRTEgPSBfbW1fc3ViX2VwaTgoaW4xLCBEMSk7CisgICAgICBjb25zdCBfX20xMjhpIEYwID0gX21tX3NybGlfZXBpMzIoQzAsIDE2KTsgICAgICAgIC8vIDAgMCAgfCB4IGRiCisgICAgICBjb25zdCBfX20xMjhpIEYxID0gX21tX3NybGlfZXBpMzIoQzEsIDE2KTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgRzAgPSBfbW1fc3ViX2VwaTgoRTAsIEYwKTsgICAgICAgICAgLy8gMCAwICB8IHggYicKKyAgICAgIGNvbnN0IF9fbTEyOGkgRzEgPSBfbW1fc3ViX2VwaTgoRTEsIEYxKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgSDAgPSBfbW1fYW5kX3NpMTI4KEcwLCBtYXNrX2IpOyAgICAgLy8gMCAwICB8IDAgYgorICAgICAgY29uc3QgX19tMTI4aSBIMSA9IF9tbV9hbmRfc2kxMjgoRzEsIG1hc2tfYik7CisgICAgICBjb25zdCBfX20xMjhpIEkgPSBfbW1fcGFja3NfZXBpMzIoSDAsIEgxKTsgICAgICAgIC8vIDAgYicgfCAwIGInCisgICAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKil2YWx1ZXMsIEkpOworICAgICAgZm9yIChpID0gMDsgaSA8IFNQQU47ICsraSkgKytoaXN0b1t2YWx1ZXNbaV1dOworICAgIH0KKyAgfQorICB7CisgICAgY29uc3QgaW50IGxlZnRfb3ZlciA9IHRpbGVfd2lkdGggJiAoU1BBTiAtIDEpOworICAgIGlmIChsZWZ0X292ZXIgPiAwKSB7CisgICAgICBWUDhMQ29sbGVjdENvbG9yQmx1ZVRyYW5zZm9ybXNfQyhhcmdiICsgdGlsZV93aWR0aCAtIGxlZnRfb3Zlciwgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdF9vdmVyLCB0aWxlX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZWVuX3RvX2JsdWUsIHJlZF90b19ibHVlLCBoaXN0byk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIENvbGxlY3RDb2xvclJlZFRyYW5zZm9ybXNfU1NFMihjb25zdCB1aW50MzJfdCogYXJnYiwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGlsZV93aWR0aCwgaW50IHRpbGVfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBncmVlbl90b19yZWQsIGludCBoaXN0b1tdKSB7CisgIGNvbnN0IF9fbTEyOGkgbXVsdHNfZyA9IE1LX0NTVF8xNigwLCBDU1RfNWIoZ3JlZW5fdG9fcmVkKSk7CisgIGNvbnN0IF9fbTEyOGkgbWFza19nID0gX21tX3NldDFfZXBpMzIoMHgwMGZmMDApOyAgLy8gZ3JlZW4gbWFzaworICBjb25zdCBfX20xMjhpIG1hc2sgPSBfbW1fc2V0MV9lcGkzMigweGZmKTsKKworICBpbnQgeTsKKyAgZm9yICh5ID0gMDsgeSA8IHRpbGVfaGVpZ2h0OyArK3kpIHsKKyAgICBjb25zdCB1aW50MzJfdCogY29uc3Qgc3JjID0gYXJnYiArIHkgKiBzdHJpZGU7CisgICAgaW50IGksIHg7CisgICAgZm9yICh4ID0gMDsgeCArIFNQQU4gPD0gdGlsZV93aWR0aDsgeCArPSBTUEFOKSB7CisgICAgICB1aW50MTZfdCB2YWx1ZXNbU1BBTl07CisgICAgICBjb25zdCBfX20xMjhpIGluMCA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJnNyY1t4ICsgICAgICAgIDBdKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgaW4xID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmc3JjW3ggKyBTUEFOIC8gMl0pOworICAgICAgY29uc3QgX19tMTI4aSBBMCA9IF9tbV9hbmRfc2kxMjgoaW4wLCBtYXNrX2cpOyAgICAvLyAwIDAgIHwgZyAwCisgICAgICBjb25zdCBfX20xMjhpIEExID0gX21tX2FuZF9zaTEyOChpbjEsIG1hc2tfZyk7CisgICAgICBjb25zdCBfX20xMjhpIEIwID0gX21tX3NybGlfZXBpMzIoaW4wLCAxNik7ICAgICAgIC8vIDAgMCAgfCB4IHIKKyAgICAgIGNvbnN0IF9fbTEyOGkgQjEgPSBfbW1fc3JsaV9lcGkzMihpbjEsIDE2KTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgQzAgPSBfbW1fbXVsaGlfZXBpMTYoQTAsIG11bHRzX2cpOyAgLy8gMCAwICB8IHggZHIKKyAgICAgIGNvbnN0IF9fbTEyOGkgQzEgPSBfbW1fbXVsaGlfZXBpMTYoQTEsIG11bHRzX2cpOworICAgICAgY29uc3QgX19tMTI4aSBFMCA9IF9tbV9zdWJfZXBpOChCMCwgQzApOyAgICAgICAgICAvLyB4IHggIHwgeCByJworICAgICAgY29uc3QgX19tMTI4aSBFMSA9IF9tbV9zdWJfZXBpOChCMSwgQzEpOworICAgICAgY29uc3QgX19tMTI4aSBGMCA9IF9tbV9hbmRfc2kxMjgoRTAsIG1hc2spOyAgICAgICAvLyAwIDAgIHwgMCByJworICAgICAgY29uc3QgX19tMTI4aSBGMSA9IF9tbV9hbmRfc2kxMjgoRTEsIG1hc2spOworICAgICAgY29uc3QgX19tMTI4aSBJID0gX21tX3BhY2tzX2VwaTMyKEYwLCBGMSk7CisgICAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKil2YWx1ZXMsIEkpOworICAgICAgZm9yIChpID0gMDsgaSA8IFNQQU47ICsraSkgKytoaXN0b1t2YWx1ZXNbaV1dOworICAgIH0KKyAgfQorICB7CisgICAgY29uc3QgaW50IGxlZnRfb3ZlciA9IHRpbGVfd2lkdGggJiAoU1BBTiAtIDEpOworICAgIGlmIChsZWZ0X292ZXIgPiAwKSB7CisgICAgICBWUDhMQ29sbGVjdENvbG9yUmVkVHJhbnNmb3Jtc19DKGFyZ2IgKyB0aWxlX3dpZHRoIC0gbGVmdF9vdmVyLCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRfb3ZlciwgdGlsZV9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZWVuX3RvX3JlZCwgaGlzdG8pOworICAgIH0KKyAgfQorfQorI3VuZGVmIFNQQU4KKyN1bmRlZiBNS19DU1RfMTYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBMSU5FX1NJWkUgMTYgICAgLy8gOCBvciAxNgorc3RhdGljIHZvaWQgQWRkVmVjdG9yX1NTRTIoY29uc3QgdWludDMyX3QqIGEsIGNvbnN0IHVpbnQzMl90KiBiLCB1aW50MzJfdCogb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUpIHsKKyAgaW50IGk7CisgIGFzc2VydChzaXplICUgTElORV9TSVpFID09IDApOworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSArPSBMSU5FX1NJWkUpIHsKKyAgICBjb25zdCBfX20xMjhpIGEwID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmYVtpICsgIDBdKTsKKyAgICBjb25zdCBfX20xMjhpIGExID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmYVtpICsgIDRdKTsKKyNpZiAoTElORV9TSVpFID09IDE2KQorICAgIGNvbnN0IF9fbTEyOGkgYTIgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZhW2kgKyAgOF0pOworICAgIGNvbnN0IF9fbTEyOGkgYTMgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZhW2kgKyAxMl0pOworI2VuZGlmCisgICAgY29uc3QgX19tMTI4aSBiMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmJbaSArICAwXSk7CisgICAgY29uc3QgX19tMTI4aSBiMSA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmJbaSArICA0XSk7CisjaWYgKExJTkVfU0laRSA9PSAxNikKKyAgICBjb25zdCBfX20xMjhpIGIyID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmYltpICsgIDhdKTsKKyAgICBjb25zdCBfX20xMjhpIGIzID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmYltpICsgMTJdKTsKKyNlbmRpZgorICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbaSArICAwXSwgX21tX2FkZF9lcGkzMihhMCwgYjApKTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmb3V0W2kgKyAgNF0sIF9tbV9hZGRfZXBpMzIoYTEsIGIxKSk7CisjaWYgKExJTkVfU0laRSA9PSAxNikKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmb3V0W2kgKyAgOF0sIF9tbV9hZGRfZXBpMzIoYTIsIGIyKSk7CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJm91dFtpICsgMTJdLCBfbW1fYWRkX2VwaTMyKGEzLCBiMykpOworI2VuZGlmCisgIH0KK30KKworc3RhdGljIHZvaWQgQWRkVmVjdG9yRXFfU1NFMihjb25zdCB1aW50MzJfdCogYSwgdWludDMyX3QqIG91dCwgaW50IHNpemUpIHsKKyAgaW50IGk7CisgIGFzc2VydChzaXplICUgTElORV9TSVpFID09IDApOworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSArPSBMSU5FX1NJWkUpIHsKKyAgICBjb25zdCBfX20xMjhpIGEwID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmYVtpICsgIDBdKTsKKyAgICBjb25zdCBfX20xMjhpIGExID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmYVtpICsgIDRdKTsKKyNpZiAoTElORV9TSVpFID09IDE2KQorICAgIGNvbnN0IF9fbTEyOGkgYTIgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZhW2kgKyAgOF0pOworICAgIGNvbnN0IF9fbTEyOGkgYTMgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZhW2kgKyAxMl0pOworI2VuZGlmCisgICAgY29uc3QgX19tMTI4aSBiMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJm91dFtpICsgIDBdKTsKKyAgICBjb25zdCBfX20xMjhpIGIxID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmb3V0W2kgKyAgNF0pOworI2lmIChMSU5FX1NJWkUgPT0gMTYpCisgICAgY29uc3QgX19tMTI4aSBiMiA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJm91dFtpICsgIDhdKTsKKyAgICBjb25zdCBfX20xMjhpIGIzID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmb3V0W2kgKyAxMl0pOworI2VuZGlmCisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJm91dFtpICsgIDBdLCBfbW1fYWRkX2VwaTMyKGEwLCBiMCkpOworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbaSArICA0XSwgX21tX2FkZF9lcGkzMihhMSwgYjEpKTsKKyNpZiAoTElORV9TSVpFID09IDE2KQorICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbaSArICA4XSwgX21tX2FkZF9lcGkzMihhMiwgYjIpKTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmb3V0W2kgKyAxMl0sIF9tbV9hZGRfZXBpMzIoYTMsIGIzKSk7CisjZW5kaWYKKyAgfQorfQorI3VuZGVmIExJTkVfU0laRQorCisvLyBOb3RlIHdlIGFyZSBhZGRpbmcgdWludDMyX3QncyBhcyAqc2lnbmVkKiBpbnQzMidzICh1c2luZyBfbW1fYWRkX2VwaTMyKS4gQnV0CisvLyB0aGF0J3Mgb2sgc2luY2UgdGhlIGhpc3RvZ3JhbSB2YWx1ZXMgYXJlIGxlc3MgdGhhbiAxPDwyOCAobWF4IHBpY3R1cmUgc2l6ZSkuCitzdGF0aWMgdm9pZCBIaXN0b2dyYW1BZGRfU1NFMihjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TEhpc3RvZ3JhbSogY29uc3QgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExIaXN0b2dyYW0qIGNvbnN0IG91dCkgeworICBpbnQgaTsKKyAgY29uc3QgaW50IGxpdGVyYWxfc2l6ZSA9IFZQOExIaXN0b2dyYW1OdW1Db2RlcyhhLT5wYWxldHRlX2NvZGVfYml0c18pOworICBhc3NlcnQoYS0+cGFsZXR0ZV9jb2RlX2JpdHNfID09IGItPnBhbGV0dGVfY29kZV9iaXRzXyk7CisgIGlmIChiICE9IG91dCkgeworICAgIEFkZFZlY3Rvcl9TU0UyKGEtPmxpdGVyYWxfLCBiLT5saXRlcmFsXywgb3V0LT5saXRlcmFsXywgTlVNX0xJVEVSQUxfQ09ERVMpOworICAgIEFkZFZlY3Rvcl9TU0UyKGEtPnJlZF8sIGItPnJlZF8sIG91dC0+cmVkXywgTlVNX0xJVEVSQUxfQ09ERVMpOworICAgIEFkZFZlY3Rvcl9TU0UyKGEtPmJsdWVfLCBiLT5ibHVlXywgb3V0LT5ibHVlXywgTlVNX0xJVEVSQUxfQ09ERVMpOworICAgIEFkZFZlY3Rvcl9TU0UyKGEtPmFscGhhXywgYi0+YWxwaGFfLCBvdXQtPmFscGhhXywgTlVNX0xJVEVSQUxfQ09ERVMpOworICB9IGVsc2UgeworICAgIEFkZFZlY3RvckVxX1NTRTIoYS0+bGl0ZXJhbF8sIG91dC0+bGl0ZXJhbF8sIE5VTV9MSVRFUkFMX0NPREVTKTsKKyAgICBBZGRWZWN0b3JFcV9TU0UyKGEtPnJlZF8sIG91dC0+cmVkXywgTlVNX0xJVEVSQUxfQ09ERVMpOworICAgIEFkZFZlY3RvckVxX1NTRTIoYS0+Ymx1ZV8sIG91dC0+Ymx1ZV8sIE5VTV9MSVRFUkFMX0NPREVTKTsKKyAgICBBZGRWZWN0b3JFcV9TU0UyKGEtPmFscGhhXywgb3V0LT5hbHBoYV8sIE5VTV9MSVRFUkFMX0NPREVTKTsKKyAgfQorICBmb3IgKGkgPSBOVU1fTElURVJBTF9DT0RFUzsgaSA8IGxpdGVyYWxfc2l6ZTsgKytpKSB7CisgICAgb3V0LT5saXRlcmFsX1tpXSA9IGEtPmxpdGVyYWxfW2ldICsgYi0+bGl0ZXJhbF9baV07CisgIH0KKyAgZm9yIChpID0gMDsgaSA8IE5VTV9ESVNUQU5DRV9DT0RFUzsgKytpKSB7CisgICAgb3V0LT5kaXN0YW5jZV9baV0gPSBhLT5kaXN0YW5jZV9baV0gKyBiLT5kaXN0YW5jZV9baV07CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJvcHkKKworLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIFggb3IgWSBjb250cmlidXRpb24gaXMgd29ydGggY29tcHV0aW5nIGFuZCBhZGRpbmcuCisvLyBVc2VkIGluIGxvb3AgdW5yb2xsaW5nLgorI2RlZmluZSBBTkFMWVpFX1hfT1JfWSh4X29yX3ksIGopICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCh4X29yX3kpW2kgKyAoaildICE9IDApIHJldHZhbCAtPSBWUDhMRmFzdFNMb2cyKCh4X29yX3kpW2kgKyAoaildKTsgXAorICB9IHdoaWxlICgwKQorCisvLyBDaGVja3Mgd2hldGhlciB0aGUgWCArIFkgY29udHJpYnV0aW9uIGlzIHdvcnRoIGNvbXB1dGluZyBhbmQgYWRkaW5nLgorLy8gVXNlZCBpbiBsb29wIHVucm9sbGluZy4KKyNkZWZpbmUgQU5BTFlaRV9YWShqKSAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAodG1wW2pdICE9IDApIHsgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHZhbCAtPSBWUDhMRmFzdFNMb2cyKHRtcFtqXSk7IFwKKyAgICAgIEFOQUxZWkVfWF9PUl9ZKFgsIGopOyAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworc3RhdGljIGZsb2F0IENvbWJpbmVkU2hhbm5vbkVudHJvcHlfU1NFMihjb25zdCBpbnQgWFsyNTZdLCBjb25zdCBpbnQgWVsyNTZdKSB7CisgIGludCBpOworICBkb3VibGUgcmV0dmFsID0gMC47CisgIGludCBzdW1YLCBzdW1YWTsKKyAgaW50MzJfdCB0bXBbNF07CisgIF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIC8vIFN1bXMgdXAgWCArIFksIDQgaW50cyBhdCBhIHRpbWUgKGFuZCB3aWxsIG1lcmdlIGl0IGF0IHRoZSBlbmQgZm9yIHN1bVhZKS4KKyAgX19tMTI4aSBzdW1YWV8xMjggPSB6ZXJvOworICBfX20xMjhpIHN1bVhfMTI4ID0gemVybzsKKworICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpICs9IDQpIHsKKyAgICBjb25zdCBfX20xMjhpIHggPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShYICsgaSkpOworICAgIGNvbnN0IF9fbTEyOGkgeSA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKFkgKyBpKSk7CisKKyAgICAvLyBDaGVjayBpZiBhbnkgWCBpcyBub24temVybzogdGhpcyBhY3R1YWxseSBwcm92aWRlcyBhIHNwZWVkdXAgYXMgWCBpcworICAgIC8vIHVzdWFsbHkgc3BhcnNlLgorICAgIGlmIChfbW1fbW92ZW1hc2tfZXBpOChfbW1fY21wZXFfZXBpMzIoeCwgemVybykpICE9IDB4RkZGRikgeworICAgICAgY29uc3QgX19tMTI4aSB4eV8xMjggPSBfbW1fYWRkX2VwaTMyKHgsIHkpOworICAgICAgc3VtWFlfMTI4ID0gX21tX2FkZF9lcGkzMihzdW1YWV8xMjgsIHh5XzEyOCk7CisKKyAgICAgIHN1bVhfMTI4ID0gX21tX2FkZF9lcGkzMihzdW1YXzEyOCwgeCk7CisKKyAgICAgIC8vIEFuYWx5emUgdGhlIGRpZmZlcmVudCBYICsgWS4KKyAgICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKXRtcCwgeHlfMTI4KTsKKworICAgICAgQU5BTFlaRV9YWSgwKTsKKyAgICAgIEFOQUxZWkVfWFkoMSk7CisgICAgICBBTkFMWVpFX1hZKDIpOworICAgICAgQU5BTFlaRV9YWSgzKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gWCBpcyBmdWxseSAwLCBzbyBvbmx5IGRlYWwgd2l0aCBZLgorICAgICAgc3VtWFlfMTI4ID0gX21tX2FkZF9lcGkzMihzdW1YWV8xMjgsIHkpOworCisgICAgICBBTkFMWVpFX1hfT1JfWShZLCAwKTsKKyAgICAgIEFOQUxZWkVfWF9PUl9ZKFksIDEpOworICAgICAgQU5BTFlaRV9YX09SX1koWSwgMik7CisgICAgICBBTkFMWVpFX1hfT1JfWShZLCAzKTsKKyAgICB9CisgIH0KKworICAvLyBTdW0gdXAgc3VtWF8xMjggdG8gZ2V0IHN1bVguCisgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKXRtcCwgc3VtWF8xMjgpOworICBzdW1YID0gdG1wWzNdICsgdG1wWzJdICsgdG1wWzFdICsgdG1wWzBdOworCisgIC8vIFN1bSB1cCBzdW1YWV8xMjggdG8gZ2V0IHN1bVhZLgorICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKil0bXAsIHN1bVhZXzEyOCk7CisgIHN1bVhZID0gdG1wWzNdICsgdG1wWzJdICsgdG1wWzFdICsgdG1wWzBdOworCisgIHJldHZhbCArPSBWUDhMRmFzdFNMb2cyKHN1bVgpICsgVlA4TEZhc3RTTG9nMihzdW1YWSk7CisgIHJldHVybiAoZmxvYXQpcmV0dmFsOworfQorI3VuZGVmIEFOQUxZWkVfWF9PUl9ZCisjdW5kZWYgQU5BTFlaRV9YWQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50IFZlY3Rvck1pc21hdGNoX1NTRTIoY29uc3QgdWludDMyX3QqIGNvbnN0IGFycmF5MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgYXJyYXkyLCBpbnQgbGVuZ3RoKSB7CisgIGludCBtYXRjaF9sZW47CisKKyAgaWYgKGxlbmd0aCA+PSAxMikgeworICAgIF9fbTEyOGkgQTAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZhcnJheTFbMF0pOworICAgIF9fbTEyOGkgQTEgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZhcnJheTJbMF0pOworICAgIG1hdGNoX2xlbiA9IDA7CisgICAgZG8geworICAgICAgLy8gTG9vcCB1bnJvbGxpbmcgYW5kIGVhcmx5IGxvYWQgYm90aCBwcm92aWRlIGEgc3BlZWR1cCBvZiAxMCUgZm9yIHRoZQorICAgICAgLy8gY3VycmVudCBmdW5jdGlvbi4gQWxzbywgbWF4X2xpbWl0IGNhbiBiZSBNQVhfTEVOR1RIPTQwOTYgYXQgbW9zdC4KKyAgICAgIGNvbnN0IF9fbTEyOGkgY21wQSA9IF9tbV9jbXBlcV9lcGkzMihBMCwgQTEpOworICAgICAgY29uc3QgX19tMTI4aSBCMCA9CisgICAgICAgICAgX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmYXJyYXkxW21hdGNoX2xlbiArIDRdKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgQjEgPQorICAgICAgICAgIF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmFycmF5MlttYXRjaF9sZW4gKyA0XSk7CisgICAgICBpZiAoX21tX21vdmVtYXNrX2VwaTgoY21wQSkgIT0gMHhmZmZmKSBicmVhazsKKyAgICAgIG1hdGNoX2xlbiArPSA0OworCisgICAgICB7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgY21wQiA9IF9tbV9jbXBlcV9lcGkzMihCMCwgQjEpOworICAgICAgICBBMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmFycmF5MVttYXRjaF9sZW4gKyA0XSk7CisgICAgICAgIEExID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmYXJyYXkyW21hdGNoX2xlbiArIDRdKTsKKyAgICAgICAgaWYgKF9tbV9tb3ZlbWFza19lcGk4KGNtcEIpICE9IDB4ZmZmZikgYnJlYWs7CisgICAgICAgIG1hdGNoX2xlbiArPSA0OworICAgICAgfQorICAgIH0gd2hpbGUgKG1hdGNoX2xlbiArIDEyIDwgbGVuZ3RoKTsKKyAgfSBlbHNlIHsKKyAgICBtYXRjaF9sZW4gPSAwOworICAgIC8vIFVucm9sbCB0aGUgcG90ZW50aWFsIGZpcnN0IHR3byBsb29wcy4KKyAgICBpZiAobGVuZ3RoID49IDQgJiYKKyAgICAgICAgX21tX21vdmVtYXNrX2VwaTgoX21tX2NtcGVxX2VwaTMyKAorICAgICAgICAgICAgX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmYXJyYXkxWzBdKSwKKyAgICAgICAgICAgIF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmFycmF5MlswXSkpKSA9PSAweGZmZmYpIHsKKyAgICAgIG1hdGNoX2xlbiA9IDQ7CisgICAgICBpZiAobGVuZ3RoID49IDggJiYKKyAgICAgICAgICBfbW1fbW92ZW1hc2tfZXBpOChfbW1fY21wZXFfZXBpMzIoCisgICAgICAgICAgICAgIF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmFycmF5MVs0XSksCisgICAgICAgICAgICAgIF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmFycmF5Mls0XSkpKSA9PSAweGZmZmYpIHsKKyAgICAgICAgbWF0Y2hfbGVuID0gODsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICB3aGlsZSAobWF0Y2hfbGVuIDwgbGVuZ3RoICYmIGFycmF5MVttYXRjaF9sZW5dID09IGFycmF5MlttYXRjaF9sZW5dKSB7CisgICAgKyttYXRjaF9sZW47CisgIH0KKyAgcmV0dXJuIG1hdGNoX2xlbjsKK30KKworLy8gQnVuZGxlcyBtdWx0aXBsZSAoMSwgMiwgNCBvciA4KSBwaXhlbHMgaW50byBhIHNpbmdsZSBwaXhlbC4KK3N0YXRpYyB2b2lkIEJ1bmRsZUNvbG9yTWFwX1NTRTIoY29uc3QgdWludDhfdCogY29uc3Qgcm93LCBpbnQgd2lkdGgsIGludCB4Yml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGRzdCkgeworICBpbnQgeDsKKyAgYXNzZXJ0KHhiaXRzID49IDApOworICBhc3NlcnQoeGJpdHMgPD0gMyk7CisgIHN3aXRjaCAoeGJpdHMpIHsKKyAgICBjYXNlIDA6IHsKKyAgICAgIGNvbnN0IF9fbTEyOGkgZmYgPSBfbW1fc2V0MV9lcGkxNigweGZmMDApOworICAgICAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgICAgIC8vIFN0b3JlIDB4ZmYwMDAwMDAgfCAocm93W3hdIDw8IDgpLgorICAgICAgZm9yICh4ID0gMDsgeCArIDE2IDw9IHdpZHRoOyB4ICs9IDE2LCBkc3QgKz0gMTYpIHsKKyAgICAgICAgY29uc3QgX19tMTI4aSBpbiA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnJvd1t4XSk7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgaW5fbG8gPSBfbW1fdW5wYWNrbG9fZXBpOCh6ZXJvLCBpbik7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgZHN0MCA9IF9tbV91bnBhY2tsb19lcGkxNihpbl9sbywgZmYpOworICAgICAgICBjb25zdCBfX20xMjhpIGRzdDEgPSBfbW1fdW5wYWNraGlfZXBpMTYoaW5fbG8sIGZmKTsKKyAgICAgICAgY29uc3QgX19tMTI4aSBpbl9oaSA9IF9tbV91bnBhY2toaV9lcGk4KHplcm8sIGluKTsKKyAgICAgICAgY29uc3QgX19tMTI4aSBkc3QyID0gX21tX3VucGFja2xvX2VwaTE2KGluX2hpLCBmZik7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgZHN0MyA9IF9tbV91bnBhY2toaV9lcGkxNihpbl9oaSwgZmYpOworICAgICAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmZHN0WzBdLCBkc3QwKTsKKyAgICAgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJmRzdFs0XSwgZHN0MSk7CisgICAgICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZkc3RbOF0sIGRzdDIpOworICAgICAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmZHN0WzEyXSwgZHN0Myk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAxOiB7CisgICAgICBjb25zdCBfX20xMjhpIGZmID0gX21tX3NldDFfZXBpMTYoMHhmZjAwKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgbXVsID0gX21tX3NldDFfZXBpMTYoMHgxMTApOworICAgICAgZm9yICh4ID0gMDsgeCArIDE2IDw9IHdpZHRoOyB4ICs9IDE2LCBkc3QgKz0gOCkgeworICAgICAgICAvLyAwYTBiIHwgKHdoZXJlIGEvYiBhcmUgNCBiaXRzKS4KKyAgICAgICAgY29uc3QgX19tMTI4aSBpbiA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnJvd1t4XSk7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgdG1wID0gX21tX211bGxvX2VwaTE2KGluLCBtdWwpOyAgLy8gYWJhMAorICAgICAgICBjb25zdCBfX20xMjhpIHBhY2sgPSBfbW1fYW5kX3NpMTI4KHRtcCwgZmYpOyAgIC8vIGFiMDAKKyAgICAgICAgY29uc3QgX19tMTI4aSBkc3QwID0gX21tX3VucGFja2xvX2VwaTE2KHBhY2ssIGZmKTsKKyAgICAgICAgY29uc3QgX19tMTI4aSBkc3QxID0gX21tX3VucGFja2hpX2VwaTE2KHBhY2ssIGZmKTsKKyAgICAgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJmRzdFswXSwgZHN0MCk7CisgICAgICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZkc3RbNF0sIGRzdDEpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgMjogeworICAgICAgY29uc3QgX19tMTI4aSBtYXNrX29yID0gX21tX3NldDFfZXBpMzIoMHhmZjAwMDAwMCk7CisgICAgICBjb25zdCBfX20xMjhpIG11bF9jc3QgPSBfbW1fc2V0MV9lcGkxNigweDAxMDQpOworICAgICAgY29uc3QgX19tMTI4aSBtYXNrX211bCA9IF9tbV9zZXQxX2VwaTE2KDB4MGYwMCk7CisgICAgICBmb3IgKHggPSAwOyB4ICsgMTYgPD0gd2lkdGg7IHggKz0gMTYsIGRzdCArPSA0KSB7CisgICAgICAgIC8vIDAwMGEwMDBiMDAwYzAwMGQgfCAod2hlcmUgYS9iL2MvZCBhcmUgMiBiaXRzKS4KKyAgICAgICAgY29uc3QgX19tMTI4aSBpbiA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnJvd1t4XSk7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgbXVsID0gX21tX211bGxvX2VwaTE2KGluLCBtdWxfY3N0KTsgIC8vIDAwYWIwMGIwMDBjZDAwZDAKKyAgICAgICAgY29uc3QgX19tMTI4aSB0bXAgPSBfbW1fYW5kX3NpMTI4KG11bCwgbWFza19tdWwpOyAgLy8gMDBhYjAwMDAwMGNkMDAwMAorICAgICAgICBjb25zdCBfX20xMjhpIHNoaWZ0ID0gX21tX3NybGlfZXBpMzIodG1wLCAxMik7ICAgICAvLyAwMDAwMDAwMGFiMDAwMDAwCisgICAgICAgIGNvbnN0IF9fbTEyOGkgcGFjayA9IF9tbV9vcl9zaTEyOChzaGlmdCwgdG1wKTsgICAgIC8vIDAwMDAwMDAwYWJjZDAwMDAKKyAgICAgICAgLy8gQ29udmVydCB0byAweGZmMDAqKjAwLgorICAgICAgICBjb25zdCBfX20xMjhpIHJlcyA9IF9tbV9vcl9zaTEyOChwYWNrLCBtYXNrX29yKTsKKyAgICAgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopZHN0LCByZXMpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6IHsKKyAgICAgIGFzc2VydCh4Yml0cyA9PSAzKTsKKyAgICAgIGZvciAoeCA9IDA7IHggKyAxNiA8PSB3aWR0aDsgeCArPSAxNiwgZHN0ICs9IDIpIHsKKyAgICAgICAgLy8gMDAwMDAwMGEwMDAwMDAwMGIuLi4gfCAod2hlcmUgYS9iIGFyZSAxIGJpdCkuCisgICAgICAgIGNvbnN0IF9fbTEyOGkgaW4gPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZyb3dbeF0pOworICAgICAgICBjb25zdCBfX20xMjhpIHNoaWZ0ID0gX21tX3NsbGlfZXBpNjQoaW4sIDcpOworICAgICAgICBjb25zdCB1aW50MzJfdCBtb3ZlID0gX21tX21vdmVtYXNrX2VwaTgoc2hpZnQpOworICAgICAgICBkc3RbMF0gPSAweGZmMDAwMDAwIHwgKChtb3ZlICYgMHhmZikgPDwgOCk7CisgICAgICAgIGRzdFsxXSA9IDB4ZmYwMDAwMDAgfCAobW92ZSAmIDB4ZmYwMCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKHggIT0gd2lkdGgpIHsKKyAgICBWUDhMQnVuZGxlQ29sb3JNYXBfQyhyb3cgKyB4LCB3aWR0aCAtIHgsIHhiaXRzLCBkc3QpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBCYXRjaCB2ZXJzaW9uIG9mIFByZWRpY3RvciBUcmFuc2Zvcm0gc3VidHJhY3Rpb24KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgQXZlcmFnZTJfbTEyOGkoY29uc3QgX19tMTI4aSogY29uc3QgYTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBhMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IGF2ZykgeworICAvLyAoYSArIGIpID4+IDEgPSAoKGEgKyBiICsgMSkgPj4gMSkgLSAoKGEgXiBiKSAmIDEpCisgIGNvbnN0IF9fbTEyOGkgb25lcyA9IF9tbV9zZXQxX2VwaTgoMSk7CisgIGNvbnN0IF9fbTEyOGkgYXZnMSA9IF9tbV9hdmdfZXB1OCgqYTAsICphMSk7CisgIGNvbnN0IF9fbTEyOGkgb25lID0gX21tX2FuZF9zaTEyOChfbW1feG9yX3NpMTI4KCphMCwgKmExKSwgb25lcyk7CisgICphdmcgPSBfbW1fc3ViX2VwaTgoYXZnMSwgb25lKTsKK30KKworLy8gUHJlZGljdG9yMDogQVJHQl9CTEFDSy4KK3N0YXRpYyB2b2lkIFByZWRpY3RvclN1YjBfU1NFMihjb25zdCB1aW50MzJfdCogaW4sIGNvbnN0IHVpbnQzMl90KiB1cHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDMyX3QqIG91dCkgeworICBpbnQgaTsKKyAgY29uc3QgX19tMTI4aSBibGFjayA9IF9tbV9zZXQxX2VwaTMyKEFSR0JfQkxBQ0spOworICBmb3IgKGkgPSAwOyBpICsgNCA8PSBudW1fcGl4ZWxzOyBpICs9IDQpIHsKKyAgICBjb25zdCBfX20xMjhpIHNyYyA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmluW2ldKTsKKyAgICBjb25zdCBfX20xMjhpIHJlcyA9IF9tbV9zdWJfZXBpOChzcmMsIGJsYWNrKTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmb3V0W2ldLCByZXMpOworICB9CisgIGlmIChpICE9IG51bV9waXhlbHMpIHsKKyAgICBWUDhMUHJlZGljdG9yc1N1Yl9DWzBdKGluICsgaSwgdXBwZXIgKyBpLCBudW1fcGl4ZWxzIC0gaSwgb3V0ICsgaSk7CisgIH0KK30KKworI2RlZmluZSBHRU5FUkFURV9QUkVESUNUT1JfMShYLCBJTikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgUHJlZGljdG9yU3ViIyNYIyNfU1NFMihjb25zdCB1aW50MzJfdCogaW4sIGNvbnN0IHVpbnQzMl90KiB1cHBlciwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDMyX3QqIG91dCkgeyAgICAgICAgICAgXAorICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKGkgPSAwOyBpICsgNCA8PSBudW1fcGl4ZWxzOyBpICs9IDQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IF9fbTEyOGkgc3JjID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmaW5baV0pOyAgICAgICAgICAgICAgXAorICAgIGNvbnN0IF9fbTEyOGkgcHJlZCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJihJTikpOyAgICAgICAgICAgICAgXAorICAgIGNvbnN0IF9fbTEyOGkgcmVzID0gX21tX3N1Yl9lcGk4KHNyYywgcHJlZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbaV0sIHJlcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoaSAhPSBudW1fcGl4ZWxzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFZQOExQcmVkaWN0b3JzU3ViX0NbKFgpXShpbiArIGksIHVwcGVyICsgaSwgbnVtX3BpeGVscyAtIGksIG91dCArIGkpOyAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitHRU5FUkFURV9QUkVESUNUT1JfMSgxLCBpbltpIC0gMV0pICAgICAgIC8vIFByZWRpY3RvcjE6IEwKK0dFTkVSQVRFX1BSRURJQ1RPUl8xKDIsIHVwcGVyW2ldKSAgICAgICAgLy8gUHJlZGljdG9yMjogVAorR0VORVJBVEVfUFJFRElDVE9SXzEoMywgdXBwZXJbaSArIDFdKSAgICAvLyBQcmVkaWN0b3IzOiBUUgorR0VORVJBVEVfUFJFRElDVE9SXzEoNCwgdXBwZXJbaSAtIDFdKSAgICAvLyBQcmVkaWN0b3I0OiBUTAorI3VuZGVmIEdFTkVSQVRFX1BSRURJQ1RPUl8xCisKKy8vIFByZWRpY3RvcjU6IGF2ZzIoYXZnMihMLCBUUiksIFQpCitzdGF0aWMgdm9pZCBQcmVkaWN0b3JTdWI1X1NTRTIoY29uc3QgdWludDMyX3QqIGluLCBjb25zdCB1aW50MzJfdCogdXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQzMl90KiBvdXQpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgKyA0IDw9IG51bV9waXhlbHM7IGkgKz0gNCkgeworICAgIGNvbnN0IF9fbTEyOGkgTCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmluW2kgLSAxXSk7CisgICAgY29uc3QgX19tMTI4aSBUID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmdXBwZXJbaV0pOworICAgIGNvbnN0IF9fbTEyOGkgVFIgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZ1cHBlcltpICsgMV0pOworICAgIGNvbnN0IF9fbTEyOGkgc3JjID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmaW5baV0pOworICAgIF9fbTEyOGkgYXZnLCBwcmVkLCByZXM7CisgICAgQXZlcmFnZTJfbTEyOGkoJkwsICZUUiwgJmF2Zyk7CisgICAgQXZlcmFnZTJfbTEyOGkoJmF2ZywgJlQsICZwcmVkKTsKKyAgICByZXMgPSBfbW1fc3ViX2VwaTgoc3JjLCBwcmVkKTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmb3V0W2ldLCByZXMpOworICB9CisgIGlmIChpICE9IG51bV9waXhlbHMpIHsKKyAgICBWUDhMUHJlZGljdG9yc1N1Yl9DWzVdKGluICsgaSwgdXBwZXIgKyBpLCBudW1fcGl4ZWxzIC0gaSwgb3V0ICsgaSk7CisgIH0KK30KKworI2RlZmluZSBHRU5FUkFURV9QUkVESUNUT1JfMihYLCBBLCBCKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgUHJlZGljdG9yU3ViIyNYIyNfU1NFMihjb25zdCB1aW50MzJfdCogaW4sIGNvbnN0IHVpbnQzMl90KiB1cHBlciwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDMyX3QqIG91dCkgeyAgICAgICAgICAgXAorICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKGkgPSAwOyBpICsgNCA8PSBudW1fcGl4ZWxzOyBpICs9IDQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IF9fbTEyOGkgdEEgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSYoQSkpOyAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IF9fbTEyOGkgdEIgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSYoQikpOyAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IF9fbTEyOGkgc3JjID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmaW5baV0pOyAgICAgICAgICAgICAgXAorICAgIF9fbTEyOGkgcHJlZCwgcmVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEF2ZXJhZ2UyX20xMjhpKCZ0QSwgJnRCLCAmcHJlZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJlcyA9IF9tbV9zdWJfZXBpOChzcmMsIHByZWQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbaV0sIHJlcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoaSAhPSBudW1fcGl4ZWxzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFZQOExQcmVkaWN0b3JzU3ViX0NbKFgpXShpbiArIGksIHVwcGVyICsgaSwgbnVtX3BpeGVscyAtIGksIG91dCArIGkpOyAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitHRU5FUkFURV9QUkVESUNUT1JfMig2LCBpbltpIC0gMV0sIHVwcGVyW2kgLSAxXSkgICAvLyBQcmVkaWN0b3I2OiBhdmcoTCwgVEwpCitHRU5FUkFURV9QUkVESUNUT1JfMig3LCBpbltpIC0gMV0sIHVwcGVyW2ldKSAgICAgICAvLyBQcmVkaWN0b3I3OiBhdmcoTCwgVCkKK0dFTkVSQVRFX1BSRURJQ1RPUl8yKDgsIHVwcGVyW2kgLSAxXSwgdXBwZXJbaV0pICAgIC8vIFByZWRpY3Rvcjg6IGF2ZyhUTCwgVCkKK0dFTkVSQVRFX1BSRURJQ1RPUl8yKDksIHVwcGVyW2ldLCB1cHBlcltpICsgMV0pICAgIC8vIFByZWRpY3Rvcjk6IGF2ZXJhZ2UoVCwgVFIpCisjdW5kZWYgR0VORVJBVEVfUFJFRElDVE9SXzIKKworLy8gUHJlZGljdG9yMTA6IGF2ZyhhdmcoTCxUTCksIGF2ZyhULCBUUikpLgorc3RhdGljIHZvaWQgUHJlZGljdG9yU3ViMTBfU1NFMihjb25zdCB1aW50MzJfdCogaW4sIGNvbnN0IHVpbnQzMl90KiB1cHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQzMl90KiBvdXQpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgKyA0IDw9IG51bV9waXhlbHM7IGkgKz0gNCkgeworICAgIGNvbnN0IF9fbTEyOGkgTCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmluW2kgLSAxXSk7CisgICAgY29uc3QgX19tMTI4aSBzcmMgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZpbltpXSk7CisgICAgY29uc3QgX19tMTI4aSBUTCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnVwcGVyW2kgLSAxXSk7CisgICAgY29uc3QgX19tMTI4aSBUID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmdXBwZXJbaV0pOworICAgIGNvbnN0IF9fbTEyOGkgVFIgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZ1cHBlcltpICsgMV0pOworICAgIF9fbTEyOGkgYXZnVFRSLCBhdmdMVEwsIGF2ZywgcmVzOworICAgIEF2ZXJhZ2UyX20xMjhpKCZULCAmVFIsICZhdmdUVFIpOworICAgIEF2ZXJhZ2UyX20xMjhpKCZMLCAmVEwsICZhdmdMVEwpOworICAgIEF2ZXJhZ2UyX20xMjhpKCZhdmdUVFIsICZhdmdMVEwsICZhdmcpOworICAgIHJlcyA9IF9tbV9zdWJfZXBpOChzcmMsIGF2Zyk7CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJm91dFtpXSwgcmVzKTsKKyAgfQorICBpZiAoaSAhPSBudW1fcGl4ZWxzKSB7CisgICAgVlA4TFByZWRpY3RvcnNTdWJfQ1sxMF0oaW4gKyBpLCB1cHBlciArIGksIG51bV9waXhlbHMgLSBpLCBvdXQgKyBpKTsKKyAgfQorfQorCisvLyBQcmVkaWN0b3IxMTogc2VsZWN0Lgorc3RhdGljIHZvaWQgR2V0U3VtQWJzRGlmZjMyX1NTRTIoY29uc3QgX19tMTI4aSogY29uc3QgQSwgY29uc3QgX19tMTI4aSogY29uc3QgQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IG91dCkgeworICAvLyBXZSBjYW4gdW5wYWNrIHdpdGggYW55IHZhbHVlIG9uIHRoZSB1cHBlciAzMiBiaXRzLCBwcm92aWRlZCBpdCdzIHRoZSBzYW1lCisgIC8vIG9uIGJvdGggb3BlcmFuZHMgKHRvIHRoYXQgdGhlaXIgc3VtIG9mIGFicyBkaWZmIGlzIHplcm8pLiBIZXJlIHdlIHVzZSAqQS4KKyAgY29uc3QgX19tMTI4aSBBX2xvID0gX21tX3VucGFja2xvX2VwaTMyKCpBLCAqQSk7CisgIGNvbnN0IF9fbTEyOGkgQl9sbyA9IF9tbV91bnBhY2tsb19lcGkzMigqQiwgKkEpOworICBjb25zdCBfX20xMjhpIEFfaGkgPSBfbW1fdW5wYWNraGlfZXBpMzIoKkEsICpBKTsKKyAgY29uc3QgX19tMTI4aSBCX2hpID0gX21tX3VucGFja2hpX2VwaTMyKCpCLCAqQSk7CisgIGNvbnN0IF9fbTEyOGkgc19sbyA9IF9tbV9zYWRfZXB1OChBX2xvLCBCX2xvKTsKKyAgY29uc3QgX19tMTI4aSBzX2hpID0gX21tX3NhZF9lcHU4KEFfaGksIEJfaGkpOworICAqb3V0ID0gX21tX3BhY2tzX2VwaTMyKHNfbG8sIHNfaGkpOworfQorCitzdGF0aWMgdm9pZCBQcmVkaWN0b3JTdWIxMV9TU0UyKGNvbnN0IHVpbnQzMl90KiBpbiwgY29uc3QgdWludDMyX3QqIHVwcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDMyX3QqIG91dCkgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSArIDQgPD0gbnVtX3BpeGVsczsgaSArPSA0KSB7CisgICAgY29uc3QgX19tMTI4aSBMID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmaW5baSAtIDFdKTsKKyAgICBjb25zdCBfX20xMjhpIFQgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZ1cHBlcltpXSk7CisgICAgY29uc3QgX19tMTI4aSBUTCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnVwcGVyW2kgLSAxXSk7CisgICAgY29uc3QgX19tMTI4aSBzcmMgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZpbltpXSk7CisgICAgX19tMTI4aSBwYSwgcGI7CisgICAgR2V0U3VtQWJzRGlmZjMyX1NTRTIoJlQsICZUTCwgJnBhKTsgICAvLyBwYSA9IHN1bSB8VC1UTHwKKyAgICBHZXRTdW1BYnNEaWZmMzJfU1NFMigmTCwgJlRMLCAmcGIpOyAgIC8vIHBiID0gc3VtIHxMLVRMfAorICAgIHsKKyAgICAgIGNvbnN0IF9fbTEyOGkgbWFzayA9IF9tbV9jbXBndF9lcGkzMihwYiwgcGEpOworICAgICAgY29uc3QgX19tMTI4aSBBID0gX21tX2FuZF9zaTEyOChtYXNrLCBMKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgQiA9IF9tbV9hbmRub3Rfc2kxMjgobWFzaywgVCk7CisgICAgICBjb25zdCBfX20xMjhpIHByZWQgPSBfbW1fb3Jfc2kxMjgoQSwgQik7ICAgIC8vIHByZWQgPSAoTCA+IFQpPyBMIDogVAorICAgICAgY29uc3QgX19tMTI4aSByZXMgPSBfbW1fc3ViX2VwaTgoc3JjLCBwcmVkKTsKKyAgICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbaV0sIHJlcyk7CisgICAgfQorICB9CisgIGlmIChpICE9IG51bV9waXhlbHMpIHsKKyAgICBWUDhMUHJlZGljdG9yc1N1Yl9DWzExXShpbiArIGksIHVwcGVyICsgaSwgbnVtX3BpeGVscyAtIGksIG91dCArIGkpOworICB9Cit9CisKKy8vIFByZWRpY3RvcjEyOiBDbGFtcGVkU3ViU3VidHJhY3RGdWxsLgorc3RhdGljIHZvaWQgUHJlZGljdG9yU3ViMTJfU1NFMihjb25zdCB1aW50MzJfdCogaW4sIGNvbnN0IHVpbnQzMl90KiB1cHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQzMl90KiBvdXQpIHsKKyAgaW50IGk7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGZvciAoaSA9IDA7IGkgKyA0IDw9IG51bV9waXhlbHM7IGkgKz0gNCkgeworICAgIGNvbnN0IF9fbTEyOGkgc3JjID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmaW5baV0pOworICAgIGNvbnN0IF9fbTEyOGkgTCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmluW2kgLSAxXSk7CisgICAgY29uc3QgX19tMTI4aSBMX2xvID0gX21tX3VucGFja2xvX2VwaTgoTCwgemVybyk7CisgICAgY29uc3QgX19tMTI4aSBMX2hpID0gX21tX3VucGFja2hpX2VwaTgoTCwgemVybyk7CisgICAgY29uc3QgX19tMTI4aSBUID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmdXBwZXJbaV0pOworICAgIGNvbnN0IF9fbTEyOGkgVF9sbyA9IF9tbV91bnBhY2tsb19lcGk4KFQsIHplcm8pOworICAgIGNvbnN0IF9fbTEyOGkgVF9oaSA9IF9tbV91bnBhY2toaV9lcGk4KFQsIHplcm8pOworICAgIGNvbnN0IF9fbTEyOGkgVEwgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZ1cHBlcltpIC0gMV0pOworICAgIGNvbnN0IF9fbTEyOGkgVExfbG8gPSBfbW1fdW5wYWNrbG9fZXBpOChUTCwgemVybyk7CisgICAgY29uc3QgX19tMTI4aSBUTF9oaSA9IF9tbV91bnBhY2toaV9lcGk4KFRMLCB6ZXJvKTsKKyAgICBjb25zdCBfX20xMjhpIGRpZmZfbG8gPSBfbW1fc3ViX2VwaTE2KFRfbG8sIFRMX2xvKTsKKyAgICBjb25zdCBfX20xMjhpIGRpZmZfaGkgPSBfbW1fc3ViX2VwaTE2KFRfaGksIFRMX2hpKTsKKyAgICBjb25zdCBfX20xMjhpIHByZWRfbG8gPSBfbW1fYWRkX2VwaTE2KExfbG8sIGRpZmZfbG8pOworICAgIGNvbnN0IF9fbTEyOGkgcHJlZF9oaSA9IF9tbV9hZGRfZXBpMTYoTF9oaSwgZGlmZl9oaSk7CisgICAgY29uc3QgX19tMTI4aSBwcmVkID0gX21tX3BhY2t1c19lcGkxNihwcmVkX2xvLCBwcmVkX2hpKTsKKyAgICBjb25zdCBfX20xMjhpIHJlcyA9IF9tbV9zdWJfZXBpOChzcmMsIHByZWQpOworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbaV0sIHJlcyk7CisgIH0KKyAgaWYgKGkgIT0gbnVtX3BpeGVscykgeworICAgIFZQOExQcmVkaWN0b3JzU3ViX0NbMTJdKGluICsgaSwgdXBwZXIgKyBpLCBudW1fcGl4ZWxzIC0gaSwgb3V0ICsgaSk7CisgIH0KK30KKworLy8gUHJlZGljdG9yczEzOiBDbGFtcGVkQWRkU3VidHJhY3RIYWxmCitzdGF0aWMgdm9pZCBQcmVkaWN0b3JTdWIxM19TU0UyKGNvbnN0IHVpbnQzMl90KiBpbiwgY29uc3QgdWludDMyX3QqIHVwcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDMyX3QqIG91dCkgeworICBpbnQgaTsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgZm9yIChpID0gMDsgaSArIDIgPD0gbnVtX3BpeGVsczsgaSArPSAyKSB7CisgICAgLy8gd2UgY2FuIG9ubHkgcHJvY2VzcyB0d28gcGl4ZWxzIGF0IGEgdGltZQorICAgIGNvbnN0IF9fbTEyOGkgTCA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmluW2kgLSAxXSk7CisgICAgY29uc3QgX19tMTI4aSBzcmMgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZpbltpXSk7CisgICAgY29uc3QgX19tMTI4aSBUID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmdXBwZXJbaV0pOworICAgIGNvbnN0IF9fbTEyOGkgVEwgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZ1cHBlcltpIC0gMV0pOworICAgIGNvbnN0IF9fbTEyOGkgTF9sbyA9IF9tbV91bnBhY2tsb19lcGk4KEwsIHplcm8pOworICAgIGNvbnN0IF9fbTEyOGkgVF9sbyA9IF9tbV91bnBhY2tsb19lcGk4KFQsIHplcm8pOworICAgIGNvbnN0IF9fbTEyOGkgVExfbG8gPSBfbW1fdW5wYWNrbG9fZXBpOChUTCwgemVybyk7CisgICAgY29uc3QgX19tMTI4aSBzdW0gPSBfbW1fYWRkX2VwaTE2KFRfbG8sIExfbG8pOworICAgIGNvbnN0IF9fbTEyOGkgYXZnID0gX21tX3NybGlfZXBpMTYoc3VtLCAxKTsKKyAgICBjb25zdCBfX20xMjhpIEExID0gX21tX3N1Yl9lcGkxNihhdmcsIFRMX2xvKTsKKyAgICBjb25zdCBfX20xMjhpIGJpdF9maXggPSBfbW1fY21wZ3RfZXBpMTYoVExfbG8sIGF2Zyk7CisgICAgY29uc3QgX19tMTI4aSBBMiA9IF9tbV9zdWJfZXBpMTYoQTEsIGJpdF9maXgpOworICAgIGNvbnN0IF9fbTEyOGkgQTMgPSBfbW1fc3JhaV9lcGkxNihBMiwgMSk7CisgICAgY29uc3QgX19tMTI4aSBBNCA9IF9tbV9hZGRfZXBpMTYoYXZnLCBBMyk7CisgICAgY29uc3QgX19tMTI4aSBwcmVkID0gX21tX3BhY2t1c19lcGkxNihBNCwgQTQpOworICAgIGNvbnN0IF9fbTEyOGkgcmVzID0gX21tX3N1Yl9lcGk4KHNyYywgcHJlZCk7CisgICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopJm91dFtpXSwgcmVzKTsKKyAgfQorICBpZiAoaSAhPSBudW1fcGl4ZWxzKSB7CisgICAgVlA4TFByZWRpY3RvcnNTdWJfQ1sxM10oaW4gKyBpLCB1cHBlciArIGksIG51bV9waXhlbHMgLSBpLCBvdXQgKyBpKTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgVlA4TEVuY0RzcEluaXRTU0UyKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgVlA4TEVuY0RzcEluaXRTU0UyKHZvaWQpIHsKKyAgVlA4TFN1YnRyYWN0R3JlZW5Gcm9tQmx1ZUFuZFJlZCA9IFN1YnRyYWN0R3JlZW5Gcm9tQmx1ZUFuZFJlZF9TU0UyOworICBWUDhMVHJhbnNmb3JtQ29sb3IgPSBUcmFuc2Zvcm1Db2xvcl9TU0UyOworICBWUDhMQ29sbGVjdENvbG9yQmx1ZVRyYW5zZm9ybXMgPSBDb2xsZWN0Q29sb3JCbHVlVHJhbnNmb3Jtc19TU0UyOworICBWUDhMQ29sbGVjdENvbG9yUmVkVHJhbnNmb3JtcyA9IENvbGxlY3RDb2xvclJlZFRyYW5zZm9ybXNfU1NFMjsKKyAgVlA4TEhpc3RvZ3JhbUFkZCA9IEhpc3RvZ3JhbUFkZF9TU0UyOworICBWUDhMQ29tYmluZWRTaGFubm9uRW50cm9weSA9IENvbWJpbmVkU2hhbm5vbkVudHJvcHlfU1NFMjsKKyAgVlA4TFZlY3Rvck1pc21hdGNoID0gVmVjdG9yTWlzbWF0Y2hfU1NFMjsKKyAgVlA4TEJ1bmRsZUNvbG9yTWFwID0gQnVuZGxlQ29sb3JNYXBfU1NFMjsKKworICBWUDhMUHJlZGljdG9yc1N1YlswXSA9IFByZWRpY3RvclN1YjBfU1NFMjsKKyAgVlA4TFByZWRpY3RvcnNTdWJbMV0gPSBQcmVkaWN0b3JTdWIxX1NTRTI7CisgIFZQOExQcmVkaWN0b3JzU3ViWzJdID0gUHJlZGljdG9yU3ViMl9TU0UyOworICBWUDhMUHJlZGljdG9yc1N1YlszXSA9IFByZWRpY3RvclN1YjNfU1NFMjsKKyAgVlA4TFByZWRpY3RvcnNTdWJbNF0gPSBQcmVkaWN0b3JTdWI0X1NTRTI7CisgIFZQOExQcmVkaWN0b3JzU3ViWzVdID0gUHJlZGljdG9yU3ViNV9TU0UyOworICBWUDhMUHJlZGljdG9yc1N1Yls2XSA9IFByZWRpY3RvclN1YjZfU1NFMjsKKyAgVlA4TFByZWRpY3RvcnNTdWJbN10gPSBQcmVkaWN0b3JTdWI3X1NTRTI7CisgIFZQOExQcmVkaWN0b3JzU3ViWzhdID0gUHJlZGljdG9yU3ViOF9TU0UyOworICBWUDhMUHJlZGljdG9yc1N1Yls5XSA9IFByZWRpY3RvclN1YjlfU1NFMjsKKyAgVlA4TFByZWRpY3RvcnNTdWJbMTBdID0gUHJlZGljdG9yU3ViMTBfU1NFMjsKKyAgVlA4TFByZWRpY3RvcnNTdWJbMTFdID0gUHJlZGljdG9yU3ViMTFfU1NFMjsKKyAgVlA4TFByZWRpY3RvcnNTdWJbMTJdID0gUHJlZGljdG9yU3ViMTJfU1NFMjsKKyAgVlA4TFByZWRpY3RvcnNTdWJbMTNdID0gUHJlZGljdG9yU3ViMTNfU1NFMjsKKyAgVlA4TFByZWRpY3RvcnNTdWJbMTRdID0gUHJlZGljdG9yU3ViMF9TU0UyOyAgLy8gPC0gcGFkZGluZyBzZWN1cml0eSBzZW50aW5lbHMKKyAgVlA4TFByZWRpY3RvcnNTdWJbMTVdID0gUHJlZGljdG9yU3ViMF9TU0UyOworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX1NTRTIKKworV0VCUF9EU1BfSU5JVF9TVFVCKFZQOExFbmNEc3BJbml0U1NFMikKKworI2VuZGlmICAvLyBXRUJQX1VTRV9TU0UyCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2xvc3NsZXNzX2VuY19zc2U0MS5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9sb3NzbGVzc19lbmNfc3NlNDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTEyYTcxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9sb3NzbGVzc19lbmNfc3NlNDEuYwpAQCAtMCwwICsxLDE0OCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFNTRTQuMSB2YXJpYW50IG9mIG1ldGhvZHMgZm9yIGxvc3NsZXNzIGVuY29kZXIKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFNDEpCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c21taW50cmluLmg+CisjaW5jbHVkZSAic3JjL2RzcC9sb3NzbGVzcy5oIgorCisvLyBGb3Igc2lnbi1leHRlbmRlZCBtdWx0aXBseWluZyBjb25zdGFudHMsIHByZS1zaGlmdGVkIGJ5IDU6CisjZGVmaW5lIENTVF81YihYKSAgKCgoaW50MTZfdCkoKHVpbnQxNl90KShYKSA8PCA4KSkgPj4gNSkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFN1YnRyYWN0LUdyZWVuIFRyYW5zZm9ybQorCitzdGF0aWMgdm9pZCBTdWJ0cmFjdEdyZWVuRnJvbUJsdWVBbmRSZWRfU1NFNDEodWludDMyX3QqIGFyZ2JfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscykgeworICBpbnQgaTsKKyAgY29uc3QgX19tMTI4aSBrQ3N0U2h1ZmZsZSA9IF9tbV9zZXRfZXBpOCgtMSwgMTMsIC0xLCAxMywgLTEsIDksIC0xLCA5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCAgNSwgLTEsICA1LCAtMSwgMSwgLTEsIDEpOworICBmb3IgKGkgPSAwOyBpICsgNCA8PSBudW1fcGl4ZWxzOyBpICs9IDQpIHsKKyAgICBjb25zdCBfX20xMjhpIGluID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmYXJnYl9kYXRhW2ldKTsKKyAgICBjb25zdCBfX20xMjhpIGluXzBnMGcgPSBfbW1fc2h1ZmZsZV9lcGk4KGluLCBrQ3N0U2h1ZmZsZSk7CisgICAgY29uc3QgX19tMTI4aSBvdXQgPSBfbW1fc3ViX2VwaTgoaW4sIGluXzBnMGcpOworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZhcmdiX2RhdGFbaV0sIG91dCk7CisgIH0KKyAgLy8gZmFsbHRocm91Z2ggYW5kIGZpbmlzaCBvZmYgd2l0aCBwbGFpbi1DCisgIGlmIChpICE9IG51bV9waXhlbHMpIHsKKyAgICBWUDhMU3VidHJhY3RHcmVlbkZyb21CbHVlQW5kUmVkX0MoYXJnYl9kYXRhICsgaSwgbnVtX3BpeGVscyAtIGkpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb2xvciBUcmFuc2Zvcm0KKworI2RlZmluZSBTUEFOIDgKK3N0YXRpYyB2b2lkIENvbGxlY3RDb2xvckJsdWVUcmFuc2Zvcm1zX1NTRTQxKGNvbnN0IHVpbnQzMl90KiBhcmdiLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbGVfd2lkdGgsIGludCB0aWxlX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBncmVlbl90b19ibHVlLCBpbnQgcmVkX3RvX2JsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGlzdG9bXSkgeworICBjb25zdCBfX20xMjhpIG11bHRzX3IgPSBfbW1fc2V0MV9lcGkxNihDU1RfNWIocmVkX3RvX2JsdWUpKTsKKyAgY29uc3QgX19tMTI4aSBtdWx0c19nID0gX21tX3NldDFfZXBpMTYoQ1NUXzViKGdyZWVuX3RvX2JsdWUpKTsKKyAgY29uc3QgX19tMTI4aSBtYXNrX2cgPSBfbW1fc2V0MV9lcGkxNigweGZmMDApOyAgIC8vIGdyZWVuIG1hc2sKKyAgY29uc3QgX19tMTI4aSBtYXNrX2diID0gX21tX3NldDFfZXBpMzIoMHhmZmZmKTsgIC8vIGdyZWVuL2JsdWUgbWFzaworICBjb25zdCBfX20xMjhpIG1hc2tfYiA9IF9tbV9zZXQxX2VwaTE2KDB4MDBmZik7ICAgLy8gYmx1ZSBtYXNrCisgIGNvbnN0IF9fbTEyOGkgc2h1ZmZsZXJfbG8gPSBfbW1fc2V0cl9lcGk4KC0xLCAyLCAtMSwgNiwgLTEsIDEwLCAtMSwgMTQsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSk7CisgIGNvbnN0IF9fbTEyOGkgc2h1ZmZsZXJfaGkgPSBfbW1fc2V0cl9lcGk4KC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIC0xLCA2LCAtMSwgMTAsIC0xLCAxNCk7CisgIGludCB5OworICBmb3IgKHkgPSAwOyB5IDwgdGlsZV9oZWlnaHQ7ICsreSkgeworICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBzcmMgPSBhcmdiICsgeSAqIHN0cmlkZTsKKyAgICBpbnQgaSwgeDsKKyAgICBmb3IgKHggPSAwOyB4ICsgU1BBTiA8PSB0aWxlX3dpZHRoOyB4ICs9IFNQQU4pIHsKKyAgICAgIHVpbnQxNl90IHZhbHVlc1tTUEFOXTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgaW4wID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmc3JjW3ggKyAwXSk7CisgICAgICBjb25zdCBfX20xMjhpIGluMSA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJnNyY1t4ICsgU1BBTiAvIDJdKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgcjAgPSBfbW1fc2h1ZmZsZV9lcGk4KGluMCwgc2h1ZmZsZXJfbG8pOworICAgICAgY29uc3QgX19tMTI4aSByMSA9IF9tbV9zaHVmZmxlX2VwaTgoaW4xLCBzaHVmZmxlcl9oaSk7CisgICAgICBjb25zdCBfX20xMjhpIHIgPSBfbW1fb3Jfc2kxMjgocjAsIHIxKTsgICAgICAgICAvLyByIDAKKyAgICAgIGNvbnN0IF9fbTEyOGkgZ2IwID0gX21tX2FuZF9zaTEyOChpbjAsIG1hc2tfZ2IpOworICAgICAgY29uc3QgX19tMTI4aSBnYjEgPSBfbW1fYW5kX3NpMTI4KGluMSwgbWFza19nYik7CisgICAgICBjb25zdCBfX20xMjhpIGdiID0gX21tX3BhY2t1c19lcGkzMihnYjAsIGdiMSk7ICAvLyBnIGIKKyAgICAgIGNvbnN0IF9fbTEyOGkgZyA9IF9tbV9hbmRfc2kxMjgoZ2IsIG1hc2tfZyk7ICAgIC8vIGcgMAorICAgICAgY29uc3QgX19tMTI4aSBBID0gX21tX211bGhpX2VwaTE2KHIsIG11bHRzX3IpOyAgLy8geCBkYnIKKyAgICAgIGNvbnN0IF9fbTEyOGkgQiA9IF9tbV9tdWxoaV9lcGkxNihnLCBtdWx0c19nKTsgIC8vIHggZGJnCisgICAgICBjb25zdCBfX20xMjhpIEMgPSBfbW1fc3ViX2VwaTgoZ2IsIEIpOyAgICAgICAgICAvLyB4IGInCisgICAgICBjb25zdCBfX20xMjhpIEQgPSBfbW1fc3ViX2VwaTgoQywgQSk7ICAgICAgICAgICAvLyB4IGInJworICAgICAgY29uc3QgX19tMTI4aSBFID0gX21tX2FuZF9zaTEyOChELCBtYXNrX2IpOyAgICAgLy8gMCBiJycKKyAgICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKXZhbHVlcywgRSk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgU1BBTjsgKytpKSArK2hpc3RvW3ZhbHVlc1tpXV07CisgICAgfQorICB9CisgIHsKKyAgICBjb25zdCBpbnQgbGVmdF9vdmVyID0gdGlsZV93aWR0aCAmIChTUEFOIC0gMSk7CisgICAgaWYgKGxlZnRfb3ZlciA+IDApIHsKKyAgICAgIFZQOExDb2xsZWN0Q29sb3JCbHVlVHJhbnNmb3Jtc19DKGFyZ2IgKyB0aWxlX3dpZHRoIC0gbGVmdF9vdmVyLCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0X292ZXIsIHRpbGVfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZW5fdG9fYmx1ZSwgcmVkX3RvX2JsdWUsIGhpc3RvKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgQ29sbGVjdENvbG9yUmVkVHJhbnNmb3Jtc19TU0U0MShjb25zdCB1aW50MzJfdCogYXJnYiwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbGVfd2lkdGgsIGludCB0aWxlX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdyZWVuX3RvX3JlZCwgaW50IGhpc3RvW10pIHsKKyAgY29uc3QgX19tMTI4aSBtdWx0c19nID0gX21tX3NldDFfZXBpMTYoQ1NUXzViKGdyZWVuX3RvX3JlZCkpOworICBjb25zdCBfX20xMjhpIG1hc2tfZyA9IF9tbV9zZXQxX2VwaTMyKDB4MDBmZjAwKTsgIC8vIGdyZWVuIG1hc2sKKyAgY29uc3QgX19tMTI4aSBtYXNrID0gX21tX3NldDFfZXBpMTYoMHhmZik7CisKKyAgaW50IHk7CisgIGZvciAoeSA9IDA7IHkgPCB0aWxlX2hlaWdodDsgKyt5KSB7CisgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IHNyYyA9IGFyZ2IgKyB5ICogc3RyaWRlOworICAgIGludCBpLCB4OworICAgIGZvciAoeCA9IDA7IHggKyBTUEFOIDw9IHRpbGVfd2lkdGg7IHggKz0gU1BBTikgeworICAgICAgdWludDE2X3QgdmFsdWVzW1NQQU5dOworICAgICAgY29uc3QgX19tMTI4aSBpbjAgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZzcmNbeCArIDBdKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgaW4xID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmc3JjW3ggKyBTUEFOIC8gMl0pOworICAgICAgY29uc3QgX19tMTI4aSBnMCA9IF9tbV9hbmRfc2kxMjgoaW4wLCBtYXNrX2cpOyAgLy8gMCAwICB8IGcgMAorICAgICAgY29uc3QgX19tMTI4aSBnMSA9IF9tbV9hbmRfc2kxMjgoaW4xLCBtYXNrX2cpOworICAgICAgY29uc3QgX19tMTI4aSBnID0gX21tX3BhY2t1c19lcGkzMihnMCwgZzEpOyAgICAgLy8gZyAwCisgICAgICBjb25zdCBfX20xMjhpIEEwID0gX21tX3NybGlfZXBpMzIoaW4wLCAxNik7ICAgICAvLyAwIDAgIHwgeCByCisgICAgICBjb25zdCBfX20xMjhpIEExID0gX21tX3NybGlfZXBpMzIoaW4xLCAxNik7CisgICAgICBjb25zdCBfX20xMjhpIEEgPSBfbW1fcGFja3VzX2VwaTMyKEEwLCBBMSk7ICAgICAvLyB4IHIKKyAgICAgIGNvbnN0IF9fbTEyOGkgQiA9IF9tbV9tdWxoaV9lcGkxNihnLCBtdWx0c19nKTsgIC8vIHggZHIKKyAgICAgIGNvbnN0IF9fbTEyOGkgQyA9IF9tbV9zdWJfZXBpOChBLCBCKTsgICAgICAgICAgIC8vIHggcicKKyAgICAgIGNvbnN0IF9fbTEyOGkgRCA9IF9tbV9hbmRfc2kxMjgoQywgbWFzayk7ICAgICAgIC8vIDAgcicKKyAgICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKXZhbHVlcywgRCk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgU1BBTjsgKytpKSArK2hpc3RvW3ZhbHVlc1tpXV07CisgICAgfQorICB9CisgIHsKKyAgICBjb25zdCBpbnQgbGVmdF9vdmVyID0gdGlsZV93aWR0aCAmIChTUEFOIC0gMSk7CisgICAgaWYgKGxlZnRfb3ZlciA+IDApIHsKKyAgICAgIFZQOExDb2xsZWN0Q29sb3JSZWRUcmFuc2Zvcm1zX0MoYXJnYiArIHRpbGVfd2lkdGggLSBsZWZ0X292ZXIsIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdF9vdmVyLCB0aWxlX2hlaWdodCwgZ3JlZW5fdG9fcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaXN0byk7CisgICAgfQorICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBWUDhMRW5jRHNwSW5pdFNTRTQxKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgVlA4TEVuY0RzcEluaXRTU0U0MSh2b2lkKSB7CisgIFZQOExTdWJ0cmFjdEdyZWVuRnJvbUJsdWVBbmRSZWQgPSBTdWJ0cmFjdEdyZWVuRnJvbUJsdWVBbmRSZWRfU1NFNDE7CisgIFZQOExDb2xsZWN0Q29sb3JCbHVlVHJhbnNmb3JtcyA9IENvbGxlY3RDb2xvckJsdWVUcmFuc2Zvcm1zX1NTRTQxOworICBWUDhMQ29sbGVjdENvbG9yUmVkVHJhbnNmb3JtcyA9IENvbGxlY3RDb2xvclJlZFRyYW5zZm9ybXNfU1NFNDE7Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfU1NFNDEKKworV0VCUF9EU1BfSU5JVF9TVFVCKFZQOExFbmNEc3BJbml0U1NFNDEpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfU1NFNDEKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbG9zc2xlc3NfbWlwc19kc3BfcjIuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbG9zc2xlc3NfbWlwc19kc3BfcjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODg4ODU0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9sb3NzbGVzc19taXBzX2RzcF9yMi5jCkBAIC0wLDAgKzEsNjk2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gSW1hZ2UgdHJhbnNmb3JtcyBhbmQgY29sb3Igc3BhY2UgY29udmVyc2lvbiBtZXRob2RzIGZvciBsb3NzbGVzcyBkZWNvZGVyLgorLy8KKy8vIEF1dGhvcihzKTogIERqb3JkamUgUGVzdXQgICAgKGRqb3JkamUucGVzdXRAaW1ndGVjLmNvbSkKKy8vICAgICAgICAgICAgIEpvdmFuIFplbGluY2V2aWMgKGpvdmFuLnplbGluY2V2aWNAaW1ndGVjLmNvbSkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFNfRFNQX1IyKQorCisjaW5jbHVkZSAic3JjL2RzcC9sb3NzbGVzcy5oIgorI2luY2x1ZGUgInNyYy9kc3AvbG9zc2xlc3NfY29tbW9uLmgiCisKKyNkZWZpbmUgTUFQX0NPTE9SX0ZVTkNTKEZVTkNfTkFNRSwgVFlQRSwgR0VUX0lOREVYLCBHRVRfVkFMVUUpICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBGVU5DX05BTUUoY29uc3QgVFlQRSogc3JjLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBjb2xvcl9tYXAsICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBUWVBFKiBkc3QsIGludCB5X3N0YXJ0LCBpbnQgeV9lbmQsICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnQgeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yICh5ID0geV9zdGFydDsgeSA8IHlfZW5kOyArK3kpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoeCA9IDA7IHggPCAod2lkdGggPj4gMik7ICsreCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGludCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBfX2FzbV9fIHZvbGF0aWxlICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIi5pZmMgICAgICAgICIgI1RZUEUgIiwgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImxidSAgICAgICAlW3RtcDFdLCAgMCglW3NyY10pICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJsYnUgICAgICAgJVt0bXAyXSwgIDEoJVtzcmNdKSAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAibGJ1ICAgICAgICVbdG1wM10sICAyKCVbc3JjXSkgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImxidSAgICAgICAlW3RtcDRdLCAgMyglW3NyY10pICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJhZGRpdSAgICAgJVtzcmNdLCAgICVbc3JjXSwgICAgICA0ICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgIi5lbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICIuaWZjICAgICAgICAiICNUWVBFICIsICB1aW50MzJfdCAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJsdyAgICAgICAgJVt0bXAxXSwgIDAoJVtzcmNdKSAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAibHcgICAgICAgICVbdG1wMl0sICA0KCVbc3JjXSkgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImx3ICAgICAgICAlW3RtcDNdLCAgOCglW3NyY10pICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJsdyAgICAgICAgJVt0bXA0XSwgIDEyKCVbc3JjXSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAiZXh0ICAgICAgICVbdG1wMV0sICAlW3RtcDFdLCAgICAgOCwgICAgICAgIDggICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImV4dCAgICAgICAlW3RtcDJdLCAgJVt0bXAyXSwgICAgIDgsICAgICAgICA4ICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJleHQgICAgICAgJVt0bXAzXSwgICVbdG1wM10sICAgICA4LCAgICAgICAgOCAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAiZXh0ICAgICAgICVbdG1wNF0sICAlW3RtcDRdLCAgICAgOCwgICAgICAgIDggICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImFkZGl1ICAgICAlW3NyY10sICAgJVtzcmNdLCAgICAgIDE2ICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiLmVuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAic2xsICAgICAgICVbdG1wMV0sICAlW3RtcDFdLCAgICAgMiAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInNsbCAgICAgICAlW3RtcDJdLCAgJVt0bXAyXSwgICAgIDIgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJzbGwgICAgICAgJVt0bXAzXSwgICVbdG1wM10sICAgICAyICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAic2xsICAgICAgICVbdG1wNF0sICAlW3RtcDRdLCAgICAgMiAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImx3eCAgICAgICAlW3RtcDFdLCAgJVt0bXAxXSglW2NvbG9yX21hcF0pICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJsd3ggICAgICAgJVt0bXAyXSwgICVbdG1wMl0oJVtjb2xvcl9tYXBdKSAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAibHd4ICAgICAgICVbdG1wM10sICAlW3RtcDNdKCVbY29sb3JfbWFwXSkgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImx3eCAgICAgICAlW3RtcDRdLCAgJVt0bXA0XSglW2NvbG9yX21hcF0pICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiLmlmYyAgICAgICAgIiAjVFlQRSAiLCAgdWludDhfdCAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAiZXh0ICAgICAgICVbdG1wMV0sICAlW3RtcDFdLCAgICAgOCwgICAgICAgIDggICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImV4dCAgICAgICAlW3RtcDJdLCAgJVt0bXAyXSwgICAgIDgsICAgICAgICA4ICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJleHQgICAgICAgJVt0bXAzXSwgICVbdG1wM10sICAgICA4LCAgICAgICAgOCAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAiZXh0ICAgICAgICVbdG1wNF0sICAlW3RtcDRdLCAgICAgOCwgICAgICAgIDggICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInNiICAgICAgICAlW3RtcDFdLCAgMCglW2RzdF0pICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJzYiAgICAgICAgJVt0bXAyXSwgIDEoJVtkc3RdKSAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAic2IgICAgICAgICVbdG1wM10sICAyKCVbZHN0XSkgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInNiICAgICAgICAlW3RtcDRdLCAgMyglW2RzdF0pICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJhZGRpdSAgICAgJVtkc3RdLCAgICVbZHN0XSwgICAgICA0ICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgIi5lbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICIuaWZjICAgICAgICAiICNUWVBFICIsICB1aW50MzJfdCAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJzdyAgICAgICAgJVt0bXAxXSwgIDAoJVtkc3RdKSAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAic3cgICAgICAgICVbdG1wMl0sICA0KCVbZHN0XSkgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInN3ICAgICAgICAlW3RtcDNdLCAgOCglW2RzdF0pICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJzdyAgICAgICAgJVt0bXA0XSwgIDEyKCVbZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAiYWRkaXUgICAgICVbZHN0XSwgICAlW2RzdF0sICAgICAgMTYgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICIuZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgIDogW3RtcDFdIj0mciIodG1wMSksIFt0bXAyXSI9JnIiKHRtcDIpLCBbdG1wM10iPSZyIih0bXAzKSwgICAgICAgICAgICAgXAorICAgICAgICAgIFt0bXA0XSI9JnIiKHRtcDQpLCBbc3JjXSIrJnIiKHNyYyksIFtkc3RdIityIihkc3QpICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgOiBbY29sb3JfbWFwXSJyIihjb2xvcl9tYXApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIDogIm1lbW9yeSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yICh4ID0gMDsgeCA8ICh3aWR0aCAmIDMpOyArK3gpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKmRzdCsrID0gR0VUX1ZBTFVFKGNvbG9yX21hcFtHRVRfSU5ERVgoKnNyYysrKV0pOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitNQVBfQ09MT1JfRlVOQ1MoTWFwQVJHQl9NSVBTZHNwUjIsIHVpbnQzMl90LCBWUDhHZXRBUkdCSW5kZXgsIFZQOEdldEFSR0JWYWx1ZSkKK01BUF9DT0xPUl9GVU5DUyhNYXBBbHBoYV9NSVBTZHNwUjIsIHVpbnQ4X3QsIFZQOEdldEFscGhhSW5kZXgsIFZQOEdldEFscGhhVmFsdWUpCisKKyN1bmRlZiBNQVBfQ09MT1JfRlVOQ1MKKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IENsYW1wZWRBZGRTdWJ0cmFjdEZ1bGwodWludDMyX3QgYzAsIHVpbnQzMl90IGMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYzIpIHsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDU7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICJwcmVjZXUucGgucWJyICAgJVt0ZW1wMV0sICAgJVtjMF0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYmwgICAlW3RlbXAyXSwgICAlW2MwXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFiciAgICVbdGVtcDNdLCAgICVbYzFdICAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJsICAgJVt0ZW1wNF0sICAgJVtjMV0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYnIgICAlW3RlbXA1XSwgICAlW2MyXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFibCAgICVbdGVtcDBdLCAgICVbYzJdICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzdWJxLnBoICAgICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wM10sICAgJVt0ZW1wNV0gIFxuXHQiCisgICAgInN1YnEucGggICAgICAgICAlW3RlbXA0XSwgICAlW3RlbXA0XSwgICAlW3RlbXAwXSAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgICVbdGVtcDFdLCAgICVbdGVtcDFdLCAgICVbdGVtcDNdICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgJVt0ZW1wNF0gIFxuXHQiCisgICAgInNobGxfcy5waCAgICAgICAlW3RlbXAxXSwgICAlW3RlbXAxXSwgICA3ICAgICAgICAgXG5cdCIKKyAgICAic2hsbF9zLnBoICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgIDcgICAgICAgICBcblx0IgorICAgICJwcmVjcnF1X3MucWIucGggJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgJVt0ZW1wMV0gIFxuXHQiCisgICAgOiBbdGVtcDBdIj1yIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpCisgICAgOiBbYzBdInIiKGMwKSwgW2MxXSJyIihjMSksIFtjMl0iciIoYzIpCisgICAgOiAibWVtb3J5IgorICApOworICByZXR1cm4gdGVtcDI7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBDbGFtcGVkQWRkU3VidHJhY3RIYWxmKHVpbnQzMl90IGMwLCB1aW50MzJfdCBjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGMyKSB7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1OworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAiYWRkdWgucWIgICAgICAgICAlW3RlbXA1XSwgICAlW2MwXSwgICAgICAlW2MxXSAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJyICAgICVbdGVtcDNdLCAgICVbYzJdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYnIgICAgJVt0ZW1wMV0sICAgJVt0ZW1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFibCAgICAlW3RlbXAyXSwgICAlW3RlbXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJsICAgICVbdGVtcDRdLCAgICVbYzJdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnEucGggICAgICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wMV0sICAgJVt0ZW1wM10gICAgXG5cdCIKKyAgICAic3VicS5waCAgICAgICAgICAlW3RlbXA0XSwgICAlW3RlbXAyXSwgICAlW3RlbXA0XSAgICBcblx0IgorICAgICJzaHJsLnBoICAgICAgICAgICVbdGVtcDVdLCAgICVbdGVtcDNdLCAgIDE1ICAgICAgICAgIFxuXHQiCisgICAgInNocmwucGggICAgICAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wNF0sICAgMTUgICAgICAgICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgICAlW3RlbXAzXSwgICAlW3RlbXAzXSwgICAlW3RlbXA1XSAgICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgICVbdGVtcDRdLCAgICVbdGVtcDBdLCAgICVbdGVtcDRdICAgIFxuXHQiCisgICAgInNocmEucGggICAgICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wM10sICAgMSAgICAgICAgICAgXG5cdCIKKyAgICAic2hyYS5waCAgICAgICAgICAlW3RlbXA0XSwgICAlW3RlbXA0XSwgICAxICAgICAgICAgICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgICVbdGVtcDFdLCAgICVbdGVtcDFdLCAgICVbdGVtcDNdICAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgJVt0ZW1wNF0gICAgXG5cdCIKKyAgICAic2hsbF9zLnBoICAgICAgICAlW3RlbXAxXSwgICAlW3RlbXAxXSwgICA3ICAgICAgICAgICBcblx0IgorICAgICJzaGxsX3MucGggICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgIDcgICAgICAgICAgIFxuXHQiCisgICAgInByZWNycXVfcy5xYi5waCAgJVt0ZW1wMV0sICAgJVt0ZW1wMl0sICAgJVt0ZW1wMV0gICAgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPXIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPXIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KQorICAgIDogW2MwXSJyIihjMCksIFtjMV0iciIoYzEpLCBbYzJdInIiKGMyKQorICAgIDogIm1lbW9yeSIKKyAgKTsKKyAgcmV0dXJuIHRlbXAxOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgU2VsZWN0KHVpbnQzMl90IGEsIHVpbnQzMl90IGIsIHVpbnQzMl90IGMpIHsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDU7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICJjbXBnZHUubHQucWIgJVt0ZW1wMV0sICVbY10sICAgICAlW2JdICAgICAgICAgICAgIFxuXHQiCisgICAgInBpY2sucWIgICAgICAlW3RlbXAxXSwgJVtiXSwgICAgICVbY10gICAgICAgICAgICAgXG5cdCIKKyAgICAicGljay5xYiAgICAgICVbdGVtcDJdLCAlW2NdLCAgICAgJVtiXSAgICAgICAgICAgICBcblx0IgorICAgICJjbXBnZHUubHQucWIgJVt0ZW1wNF0sICVbY10sICAgICAlW2FdICAgICAgICAgICAgIFxuXHQiCisgICAgInBpY2sucWIgICAgICAlW3RlbXA0XSwgJVthXSwgICAgICVbY10gICAgICAgICAgICAgXG5cdCIKKyAgICAicGljay5xYiAgICAgICVbdGVtcDVdLCAlW2NdLCAgICAgJVthXSAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1LnFiICAgICAgJVt0ZW1wM10sICVbdGVtcDFdLCAlW3RlbXAyXSAgICAgICAgIFxuXHQiCisgICAgInN1YnUucWIgICAgICAlW3RlbXAwXSwgJVt0ZW1wNF0sICVbdGVtcDVdICAgICAgICAgXG5cdCIKKyAgICAicmFkZHUudy5xYiAgICVbdGVtcDNdLCAlW3RlbXAzXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJyYWRkdS53LnFiICAgJVt0ZW1wMF0sICVbdGVtcDBdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAgICAlW3RlbXAzXSwgJVt0ZW1wM10sICVbdGVtcDBdICAgICAgICAgXG5cdCIKKyAgICAic2x0aSAgICAgICAgICVbdGVtcDBdLCAlW3RlbXAzXSwgMHgxICAgICAgICAgICAgICBcblx0IgorICAgICJtb3Z6ICAgICAgICAgJVthXSwgICAgICVbYl0sICAgICAlW3RlbXAwXSAgICAgICAgIFxuXHQiCisgICAgOiBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLCBbdGVtcDNdIj0mciIodGVtcDMpLAorICAgICAgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwgW3RlbXAwXSI9JnIiKHRlbXAwKSwKKyAgICAgIFthXSIrJnIiKGEpCisgICAgOiBbYl0iciIoYiksIFtjXSJyIihjKQorICApOworICByZXR1cm4gYTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IEF2ZXJhZ2UyKHVpbnQzMl90IGEwLCB1aW50MzJfdCBhMSkgeworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAiYWRkdWgucWIgICAgJVthMF0sICVbYTBdLCAlW2ExXSAgICAgICBcblx0IgorICAgIDogW2EwXSIrciIoYTApCisgICAgOiBbYTFdInIiKGExKQorICApOworICByZXR1cm4gYTA7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBBdmVyYWdlMyh1aW50MzJfdCBhMCwgdWludDMyX3QgYTEsIHVpbnQzMl90IGEyKSB7CisgIHJldHVybiBBdmVyYWdlMihBdmVyYWdlMihhMCwgYTIpLCBhMSk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBBdmVyYWdlNCh1aW50MzJfdCBhMCwgdWludDMyX3QgYTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYTIsIHVpbnQzMl90IGEzKSB7CisgIHJldHVybiBBdmVyYWdlMihBdmVyYWdlMihhMCwgYTEpLCBBdmVyYWdlMihhMiwgYTMpKTsKK30KKworc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjVfTUlQU2RzcFIyKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgcmV0dXJuIEF2ZXJhZ2UzKGxlZnQsIHRvcFswXSwgdG9wWzFdKTsKK30KKworc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjZfTUlQU2RzcFIyKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgcmV0dXJuIEF2ZXJhZ2UyKGxlZnQsIHRvcFstMV0pOworfQorCitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yN19NSVBTZHNwUjIodWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICByZXR1cm4gQXZlcmFnZTIobGVmdCwgdG9wWzBdKTsKK30KKworc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjhfTUlQU2RzcFIyKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgKHZvaWQpbGVmdDsKKyAgcmV0dXJuIEF2ZXJhZ2UyKHRvcFstMV0sIHRvcFswXSk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3I5X01JUFNkc3BSMih1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgICh2b2lkKWxlZnQ7CisgIHJldHVybiBBdmVyYWdlMih0b3BbMF0sIHRvcFsxXSk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3IxMF9NSVBTZHNwUjIodWludDMyX3QgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICByZXR1cm4gQXZlcmFnZTQobGVmdCwgdG9wWy0xXSwgdG9wWzBdLCB0b3BbMV0pOworfQorCitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yMTFfTUlQU2RzcFIyKHVpbnQzMl90IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgcmV0dXJuIFNlbGVjdCh0b3BbMF0sIGxlZnQsIHRvcFstMV0pOworfQorCitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yMTJfTUlQU2RzcFIyKHVpbnQzMl90IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgcmV0dXJuIENsYW1wZWRBZGRTdWJ0cmFjdEZ1bGwobGVmdCwgdG9wWzBdLCB0b3BbLTFdKTsKK30KKworc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjEzX01JUFNkc3BSMih1aW50MzJfdCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgIHJldHVybiBDbGFtcGVkQWRkU3VidHJhY3RIYWxmKGxlZnQsIHRvcFswXSwgdG9wWy0xXSk7Cit9CisKKy8vIEFkZCBncmVlbiB0byBibHVlIGFuZCByZWQgY2hhbm5lbHMgKGkuZS4gcGVyZm9ybSB0aGUgaW52ZXJzZSB0cmFuc2Zvcm0gb2YKKy8vICdzdWJ0cmFjdCBncmVlbicpLgorc3RhdGljIHZvaWQgQWRkR3JlZW5Ub0JsdWVBbmRSZWRfTUlQU2RzcFIyKGNvbnN0IHVpbnQzMl90KiBzcmMsIGludCBudW1fcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkc3QpIHsKKyAgdWludDMyX3QgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3OworICBjb25zdCB1aW50MzJfdCogY29uc3QgcF9sb29wMV9lbmQgPSBzcmMgKyAobnVtX3BpeGVscyAmIH4zKTsKKyAgY29uc3QgdWludDMyX3QqIGNvbnN0IHBfbG9vcDJfZW5kID0gc3JjICsgbnVtX3BpeGVsczsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgIi5zZXQgICAgICAgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIi5zZXQgICAgICAgbm9yZW9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcSAgICAgICAgJVtzcmNdLCAgICAgICAgICAlW3BfbG9vcDFfZW5kXSwgICAgIDNmICAgICAgIFxuXHQiCisgICAgIiBub3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICIwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAgICAgJVt0ZW1wMF0sICAgICAgICAwKCVbc3JjXSkgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAgICAgJVt0ZW1wMV0sICAgICAgICA0KCVbc3JjXSkgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAgICAgJVt0ZW1wMl0sICAgICAgICA4KCVbc3JjXSkgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAgICAgJVt0ZW1wM10sICAgICAgICAxMiglW3NyY10pICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImV4dCAgICAgICAgJVt0ZW1wNF0sICAgICAgICAlW3RlbXAwXSwgICAgICAgICAgIDgsICAgIDggIFxuXHQiCisgICAgImV4dCAgICAgICAgJVt0ZW1wNV0sICAgICAgICAlW3RlbXAxXSwgICAgICAgICAgIDgsICAgIDggIFxuXHQiCisgICAgImV4dCAgICAgICAgJVt0ZW1wNl0sICAgICAgICAlW3RlbXAyXSwgICAgICAgICAgIDgsICAgIDggIFxuXHQiCisgICAgImV4dCAgICAgICAgJVt0ZW1wN10sICAgICAgICAlW3RlbXAzXSwgICAgICAgICAgIDgsICAgIDggIFxuXHQiCisgICAgImFkZGl1ICAgICAgJVtzcmNdLCAgICAgICAgICAlW3NyY10sICAgICAgICAgICAgIDE2ICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAgICAgJVtkc3RdLCAgICAgICAgICAlW2RzdF0sICAgICAgICAgICAgIDE2ICAgICAgIFxuXHQiCisgICAgInJlcGx2LnBoICAgJVt0ZW1wNF0sICAgICAgICAlW3RlbXA0XSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInJlcGx2LnBoICAgJVt0ZW1wNV0sICAgICAgICAlW3RlbXA1XSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInJlcGx2LnBoICAgJVt0ZW1wNl0sICAgICAgICAlW3RlbXA2XSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInJlcGx2LnBoICAgJVt0ZW1wN10sICAgICAgICAlW3RlbXA3XSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUucWIgICAgJVt0ZW1wMF0sICAgICAgICAlW3RlbXAwXSwgICAgICAgICAgICVbdGVtcDRdIFxuXHQiCisgICAgImFkZHUucWIgICAgJVt0ZW1wMV0sICAgICAgICAlW3RlbXAxXSwgICAgICAgICAgICVbdGVtcDVdIFxuXHQiCisgICAgImFkZHUucWIgICAgJVt0ZW1wMl0sICAgICAgICAlW3RlbXAyXSwgICAgICAgICAgICVbdGVtcDZdIFxuXHQiCisgICAgImFkZHUucWIgICAgJVt0ZW1wM10sICAgICAgICAlW3RlbXAzXSwgICAgICAgICAgICVbdGVtcDddIFxuXHQiCisgICAgInN3ICAgICAgICAgJVt0ZW1wMF0sICAgICAgICAtMTYoJVtkc3RdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInN3ICAgICAgICAgJVt0ZW1wMV0sICAgICAgICAtMTIoJVtkc3RdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInN3ICAgICAgICAgJVt0ZW1wMl0sICAgICAgICAtOCglW2RzdF0pICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJuZSAgICAgICAgJVtzcmNdLCAgICAgICAgICAlW3BfbG9vcDFfZW5kXSwgICAgIDBiICAgICAgIFxuXHQiCisgICAgIiBzdyAgICAgICAgJVt0ZW1wM10sICAgICAgICAtNCglW2RzdF0pICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICIzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcSAgICAgICAgJVtzcmNdLCAgICAgICAgICAlW3BfbG9vcDJfZW5kXSwgICAgIDJmICAgICAgIFxuXHQiCisgICAgIiBub3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAgICAgJVt0ZW1wMF0sICAgICAgICAwKCVbc3JjXSkgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAgICAgJVtzcmNdLCAgICAgICAgICAlW3NyY10sICAgICAgICAgICAgIDQgICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAgICAgJVtkc3RdLCAgICAgICAgICAlW2RzdF0sICAgICAgICAgICAgIDQgICAgICAgIFxuXHQiCisgICAgImV4dCAgICAgICAgJVt0ZW1wNF0sICAgICAgICAlW3RlbXAwXSwgICAgICAgICAgIDgsICAgIDggIFxuXHQiCisgICAgInJlcGx2LnBoICAgJVt0ZW1wNF0sICAgICAgICAlW3RlbXA0XSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUucWIgICAgJVt0ZW1wMF0sICAgICAgICAlW3RlbXAwXSwgICAgICAgICAgICVbdGVtcDRdIFxuXHQiCisgICAgImJuZSAgICAgICAgJVtzcmNdLCAgICAgICAgICAlW3BfbG9vcDJfZW5kXSwgICAgIDFiICAgICAgIFxuXHQiCisgICAgIiBzdyAgICAgICAgJVt0ZW1wMF0sICAgICAgICAtNCglW2RzdF0pICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIi5zZXQgICAgICAgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgOiBbZHN0XSIrJnIiKGRzdCksIFtzcmNdIismciIoc3JjKSwgW3RlbXAwXSI9JnIiKHRlbXAwKSwKKyAgICAgIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksIFt0ZW1wM10iPSZyIih0ZW1wMyksCisgICAgICBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLCBbdGVtcDZdIj0mciIodGVtcDYpLAorICAgICAgW3RlbXA3XSI9JnIiKHRlbXA3KQorICAgIDogW3BfbG9vcDFfZW5kXSJyIihwX2xvb3AxX2VuZCksIFtwX2xvb3AyX2VuZF0iciIocF9sb29wMl9lbmQpCisgICAgOiAibWVtb3J5IgorICApOworfQorCitzdGF0aWMgdm9pZCBUcmFuc2Zvcm1Db2xvckludmVyc2VfTUlQU2RzcFIyKGNvbnN0IFZQOExNdWx0aXBsaWVycyogY29uc3QgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIHNyYywgaW50IG51bV9waXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkc3QpIHsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDU7CisgIHVpbnQzMl90IGFyZ2IsIGFyZ2IxLCBuZXdfcmVkOworICBjb25zdCB1aW50MzJfdCBHX3RvX1IgPSBtLT5ncmVlbl90b19yZWRfOworICBjb25zdCB1aW50MzJfdCBHX3RvX0IgPSBtLT5ncmVlbl90b19ibHVlXzsKKyAgY29uc3QgdWludDMyX3QgUl90b19CID0gbS0+cmVkX3RvX2JsdWVfOworICBjb25zdCB1aW50MzJfdCogY29uc3QgcF9sb29wX2VuZCA9IHNyYyArIChudW1fcGl4ZWxzICYgfjEpOworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAiLnNldCAgICAgICAgICAgIHB1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIuc2V0ICAgICAgICAgICAgbm9yZW9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcSAgICAgICAgICAgICAlW3NyY10sICAgICAgICVbcF9sb29wX2VuZF0sICAxZiAgICAgICAgXG5cdCIKKyAgICAiIG5vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJyZXBsdi5waCAgICAgICAgJVt0ZW1wMF0sICAgICAlW0dfdG9fUl0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInJlcGx2LnBoICAgICAgICAlW3RlbXAxXSwgICAgICVbR190b19CXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicmVwbHYucGggICAgICAgICVbdGVtcDJdLCAgICAgJVtSX3RvX0JdICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgJVt0ZW1wMF0sICAgICAlW3RlbXAwXSwgICAgICAgOCAgICAgICAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICAlW3RlbXAxXSwgICAgICVbdGVtcDFdLCAgICAgICA4ICAgICAgICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgICVbdGVtcDJdLCAgICAgJVt0ZW1wMl0sICAgICAgIDggICAgICAgICBcblx0IgorICAgICJzaHJhLnBoICAgICAgICAgJVt0ZW1wMF0sICAgICAlW3RlbXAwXSwgICAgICAgOCAgICAgICAgIFxuXHQiCisgICAgInNocmEucGggICAgICAgICAlW3RlbXAxXSwgICAgICVbdGVtcDFdLCAgICAgICA4ICAgICAgICAgXG5cdCIKKyAgICAic2hyYS5waCAgICAgICAgICVbdGVtcDJdLCAgICAgJVt0ZW1wMl0sICAgICAgIDggICAgICAgICBcblx0IgorICAiMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAgICAgICAgICAlW2FyZ2JdLCAgICAgIDAoJVtzcmNdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAgICAgICVbYXJnYjFdLCAgICAgNCglW3NyY10pICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzdyAgICAgICAgICAgICAgJVthcmdiXSwgICAgICAwKCVbZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInN3ICAgICAgICAgICAgICAlW2FyZ2IxXSwgICAgIDQoJVtkc3RdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICAgICAgICVbc3JjXSwgICAgICAgJVtzcmNdLCAgICAgICAgIDggICAgICAgICBcblx0IgorICAgICJhZGRpdSAgICAgICAgICAgJVtkc3RdLCAgICAgICAlW2RzdF0sICAgICAgICAgOCAgICAgICAgIFxuXHQiCisgICAgInByZWNycS5xYi5waCAgICAlW3RlbXAzXSwgICAgICVbYXJnYl0sICAgICAgICAlW2FyZ2IxXSAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFicmEgICVbdGVtcDNdLCAgICAgJVt0ZW1wM10gICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgJVt0ZW1wM10sICAgICAlW3RlbXAzXSwgICAgICAgOCAgICAgICAgIFxuXHQiCisgICAgInNocmEucGggICAgICAgICAlW3RlbXAzXSwgICAgICVbdGVtcDNdLCAgICAgICA4ICAgICAgICAgXG5cdCIKKyAgICAibXVsLnBoICAgICAgICAgICVbdGVtcDVdLCAgICAgJVt0ZW1wM10sICAgICAgICVbdGVtcDBdICBcblx0IgorICAgICJtdWwucGggICAgICAgICAgJVt0ZW1wM10sICAgICAlW3RlbXAzXSwgICAgICAgJVt0ZW1wMV0gIFxuXHQiCisgICAgInByZWNycS5waC53ICAgICAlW25ld19yZWRdLCAgICVbYXJnYl0sICAgICAgICAlW2FyZ2IxXSAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICAgICVbYXJnYjFdLCAgICAgJVthcmdiXSwgICAgICAgIDE2LCAgIDE2ICBcblx0IgorICAgICJzaHJhLnBoICAgICAgICAgJVt0ZW1wNV0sICAgICAlW3RlbXA1XSwgICAgICAgNSAgICAgICAgIFxuXHQiCisgICAgInNocmEucGggICAgICAgICAlW3RlbXAzXSwgICAgICVbdGVtcDNdLCAgICAgICA1ICAgICAgICAgXG5cdCIKKyAgICAiYWRkdS5waCAgICAgICAgICVbbmV3X3JlZF0sICAgJVtuZXdfcmVkXSwgICAgICVbdGVtcDVdICBcblx0IgorICAgICJhZGR1LnBoICAgICAgICAgJVthcmdiMV0sICAgICAlW2FyZ2IxXSwgICAgICAgJVt0ZW1wM10gIFxuXHQiCisgICAgInByZWNldS5waC5xYnJhICAlW3RlbXA1XSwgICAgICVbbmV3X3JlZF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgICVbdGVtcDRdLCAgICAgJVt0ZW1wNV0sICAgICAgIDggICAgICAgICBcblx0IgorICAgICJzaHJhLnBoICAgICAgICAgJVt0ZW1wNF0sICAgICAlW3RlbXA0XSwgICAgICAgOCAgICAgICAgIFxuXHQiCisgICAgIm11bC5waCAgICAgICAgICAlW3RlbXA0XSwgICAgICVbdGVtcDRdLCAgICAgICAlW3RlbXAyXSAgXG5cdCIKKyAgICAic2IgICAgICAgICAgICAgICVbdGVtcDVdLCAgICAgLTIoJVtkc3RdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAgICAgICAgJVt0ZW1wNV0sICAgICAlW3RlbXA1XSwgICAgICAgMTYgICAgICAgIFxuXHQiCisgICAgInNocmEucGggICAgICAgICAlW3RlbXA0XSwgICAgICVbdGVtcDRdLCAgICAgICA1ICAgICAgICAgXG5cdCIKKyAgICAiYWRkdS5waCAgICAgICAgICVbYXJnYjFdLCAgICAgJVthcmdiMV0sICAgICAgICVbdGVtcDRdICBcblx0IgorICAgICJwcmVjZXUucGgucWJyYSAgJVt0ZW1wM10sICAgICAlW2FyZ2IxXSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNiICAgICAgICAgICAgICAlW3RlbXA1XSwgICAgIC02KCVbZHN0XSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2IgICAgICAgICAgICAgICVbdGVtcDNdLCAgICAgLTQoJVtkc3RdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAgICAgICAgJVt0ZW1wM10sICAgICAlW3RlbXAzXSwgICAgICAgMTYgICAgICAgIFxuXHQiCisgICAgImJuZSAgICAgICAgICAgICAlW3NyY10sICAgICAgICVbcF9sb29wX2VuZF0sICAwYiAgICAgICAgXG5cdCIKKyAgICAiIHNiICAgICAgICAgICAgICVbdGVtcDNdLCAgICAgLTgoJVtkc3RdKSAgICAgICAgICAgICAgICBcblx0IgorICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIi5zZXQgICAgICAgICAgICBwb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLAorICAgICAgW25ld19yZWRdIj0mciIobmV3X3JlZCksIFthcmdiXSI9JnIiKGFyZ2IpLAorICAgICAgW2FyZ2IxXSI9JnIiKGFyZ2IxKSwgW2RzdF0iKyZyIihkc3QpLCBbc3JjXSIrJnIiKHNyYykKKyAgICA6IFtHX3RvX1JdInIiKEdfdG9fUiksIFtSX3RvX0JdInIiKFJfdG9fQiksCisgICAgICBbR190b19CXSJyIihHX3RvX0IpLCBbcF9sb29wX2VuZF0iciIocF9sb29wX2VuZCkKKyAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iCisgICk7CisKKyAgLy8gRmFsbC1iYWNrIHRvIEMtdmVyc2lvbiBmb3IgbGVmdC1vdmVycy4KKyAgaWYgKG51bV9waXhlbHMgJiAxKSBWUDhMVHJhbnNmb3JtQ29sb3JJbnZlcnNlX0MobSwgc3JjLCAxLCBkc3QpOworfQorCitzdGF0aWMgdm9pZCBDb252ZXJ0QkdSQVRvUkdCX01JUFNkc3BSMihjb25zdCB1aW50MzJfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQ4X3QqIGRzdCkgeworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDM7CisgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBwX2xvb3AxX2VuZCA9IHNyYyArIChudW1fcGl4ZWxzICYgfjMpOworICBjb25zdCB1aW50MzJfdCogY29uc3QgcF9sb29wMl9lbmQgPSBzcmMgKyBudW1fcGl4ZWxzOworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAiLnNldCAgICAgICBwdXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiLnNldCAgICAgICBub3Jlb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxICAgICAgICAlW3NyY10sICAgICAgJVtwX2xvb3AxX2VuZF0sICAgIDNmICAgICAgICAgXG5cdCIKKyAgICAiIG5vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgIjA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAlW3RlbXAzXSwgICAgMTIoJVtzcmNdKSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAlW3RlbXAyXSwgICAgOCglW3NyY10pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAlW3RlbXAxXSwgICAgNCglW3NyY10pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAlW3RlbXAwXSwgICAgMCglW3NyY10pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wMl0sICAgICAgICAgIDI0LCAgIDggICAgXG5cdCIKKyAgICAic2xsICAgICAgICAlW3RlbXAyXSwgICAgJVt0ZW1wMl0sICAgICAgICAgIDggICAgICAgICAgXG5cdCIKKyAgICAicm90ciAgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wM10sICAgICAgICAgIDE2ICAgICAgICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAlW3RlbXAyXSwgICAgJVt0ZW1wMV0sICAgICAgICAgIDAsICAgIDE2ICAgXG5cdCIKKyAgICAic2xsICAgICAgICAlW3RlbXAxXSwgICAgJVt0ZW1wMV0sICAgICAgICAgIDggICAgICAgICAgXG5cdCIKKyAgICAid3NiaCAgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wM10gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmFsaWduICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMV0sICAgICAgICAgIDEgICAgICAgICAgXG5cdCIKKyAgICAid3NiaCAgICAgICAlW3RlbXAyXSwgICAgJVt0ZW1wMl0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAid3NiaCAgICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAlW3RlbXAzXSwgICAgOCglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicm90ciAgICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMF0sICAgICAgICAgIDE2ICAgICAgICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAlW3RlbXAyXSwgICAgNCglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICAlW3NyY10sICAgICAgJVtzcmNdLCAgICAgICAgICAgIDE2ICAgICAgICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAlW3RlbXAwXSwgICAgMCglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYm5lICAgICAgICAlW3NyY10sICAgICAgJVtwX2xvb3AxX2VuZF0sICAgIDBiICAgICAgICAgXG5cdCIKKyAgICAiIGFkZGl1ICAgICAlW2RzdF0sICAgICAgJVtkc3RdLCAgICAgICAgICAgIDEyICAgICAgICAgXG5cdCIKKyAgIjM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxICAgICAgICAlW3NyY10sICAgICAgJVtwX2xvb3AyX2VuZF0sICAgIDJmICAgICAgICAgXG5cdCIKKyAgICAiIG5vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAlW3RlbXAwXSwgICAgMCglW3NyY10pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICAlW3NyY10sICAgICAgJVtzcmNdLCAgICAgICAgICAgIDQgICAgICAgICAgXG5cdCIKKyAgICAid3NiaCAgICAgICAlW3RlbXAxXSwgICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICAlW2RzdF0sICAgICAgJVtkc3RdLCAgICAgICAgICAgIDMgICAgICAgICAgXG5cdCIKKyAgICAidXNoICAgICAgICAlW3RlbXAxXSwgICAgLTIoJVtkc3RdKSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMF0sICAgICAgICAgIDE2ICAgICAgICAgXG5cdCIKKyAgICAiYm5lICAgICAgICAlW3NyY10sICAgICAgJVtwX2xvb3AyX2VuZF0sICAgIDFiICAgICAgICAgXG5cdCIKKyAgICAiIHNiICAgICAgICAlW3RlbXAwXSwgICAgLTMoJVtkc3RdKSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiLnNldCAgICAgICBwb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbZHN0XSIrJnIiKGRzdCksIFtzcmNdIismciIoc3JjKQorICAgIDogW3BfbG9vcDFfZW5kXSJyIihwX2xvb3AxX2VuZCksIFtwX2xvb3AyX2VuZF0iciIocF9sb29wMl9lbmQpCisgICAgOiAibWVtb3J5IgorICApOworfQorCitzdGF0aWMgdm9pZCBDb252ZXJ0QkdSQVRvUkdCQV9NSVBTZHNwUjIoY29uc3QgdWludDMyX3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDhfdCogZHN0KSB7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMzsKKyAgY29uc3QgdWludDMyX3QqIGNvbnN0IHBfbG9vcDFfZW5kID0gc3JjICsgKG51bV9waXhlbHMgJiB+Myk7CisgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBwX2xvb3AyX2VuZCA9IHNyYyArIG51bV9waXhlbHM7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICIuc2V0ICAgICAgIHB1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIuc2V0ICAgICAgIG5vcmVvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXEgICAgICAgICVbc3JjXSwgICAgICAlW3BfbG9vcDFfZW5kXSwgICAgM2YgICAgICAgICBcblx0IgorICAgICIgbm9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAiMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgICAgICVbdGVtcDBdLCAgICAwKCVbc3JjXSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgICAgICVbdGVtcDFdLCAgICA0KCVbc3JjXSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgICAgICVbdGVtcDJdLCAgICA4KCVbc3JjXSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgICAgICVbdGVtcDNdLCAgICAxMiglW3NyY10pICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ3c2JoICAgICAgICVbdGVtcDBdLCAgICAlW3RlbXAwXSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ3c2JoICAgICAgICVbdGVtcDFdLCAgICAlW3RlbXAxXSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ3c2JoICAgICAgICVbdGVtcDJdLCAgICAlW3RlbXAyXSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ3c2JoICAgICAgICVbdGVtcDNdLCAgICAlW3RlbXAzXSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGRpdSAgICAgICVbc3JjXSwgICAgICAlW3NyY10sICAgICAgICAgICAgMTYgICAgICAgICBcblx0IgorICAgICJiYWxpZ24gICAgICVbdGVtcDBdLCAgICAlW3RlbXAwXSwgICAgICAgICAgMSAgICAgICAgICBcblx0IgorICAgICJiYWxpZ24gICAgICVbdGVtcDFdLCAgICAlW3RlbXAxXSwgICAgICAgICAgMSAgICAgICAgICBcblx0IgorICAgICJiYWxpZ24gICAgICVbdGVtcDJdLCAgICAlW3RlbXAyXSwgICAgICAgICAgMSAgICAgICAgICBcblx0IgorICAgICJiYWxpZ24gICAgICVbdGVtcDNdLCAgICAlW3RlbXAzXSwgICAgICAgICAgMSAgICAgICAgICBcblx0IgorICAgICJ1c3cgICAgICAgICVbdGVtcDBdLCAgICAwKCVbZHN0XSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ1c3cgICAgICAgICVbdGVtcDFdLCAgICA0KCVbZHN0XSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ1c3cgICAgICAgICVbdGVtcDJdLCAgICA4KCVbZHN0XSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ1c3cgICAgICAgICVbdGVtcDNdLCAgICAxMiglW2RzdF0pICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJibmUgICAgICAgICVbc3JjXSwgICAgICAlW3BfbG9vcDFfZW5kXSwgICAgMGIgICAgICAgICBcblx0IgorICAgICIgYWRkaXUgICAgICVbZHN0XSwgICAgICAlW2RzdF0sICAgICAgICAgICAgMTYgICAgICAgICBcblx0IgorICAiMzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXEgICAgICAgICVbc3JjXSwgICAgICAlW3BfbG9vcDJfZW5kXSwgICAgMmYgICAgICAgICBcblx0IgorICAgICIgbm9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgICAgICVbdGVtcDBdLCAgICAwKCVbc3JjXSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ3c2JoICAgICAgICVbdGVtcDBdLCAgICAlW3RlbXAwXSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGRpdSAgICAgICVbc3JjXSwgICAgICAlW3NyY10sICAgICAgICAgICAgNCAgICAgICAgICBcblx0IgorICAgICJiYWxpZ24gICAgICVbdGVtcDBdLCAgICAlW3RlbXAwXSwgICAgICAgICAgMSAgICAgICAgICBcblx0IgorICAgICJ1c3cgICAgICAgICVbdGVtcDBdLCAgICAwKCVbZHN0XSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJibmUgICAgICAgICVbc3JjXSwgICAgICAlW3BfbG9vcDJfZW5kXSwgICAgMWIgICAgICAgICBcblx0IgorICAgICIgYWRkaXUgICAgICVbZHN0XSwgICAgICAlW2RzdF0sICAgICAgICAgICAgNCAgICAgICAgICBcblx0IgorICAiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIuc2V0ICAgICAgIHBvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFtkc3RdIismciIoZHN0KSwgW3NyY10iKyZyIihzcmMpCisgICAgOiBbcF9sb29wMV9lbmRdInIiKHBfbG9vcDFfZW5kKSwgW3BfbG9vcDJfZW5kXSJyIihwX2xvb3AyX2VuZCkKKyAgICA6ICJtZW1vcnkiCisgICk7Cit9CisKK3N0YXRpYyB2b2lkIENvbnZlcnRCR1JBVG9SR0JBNDQ0NF9NSVBTZHNwUjIoY29uc3QgdWludDMyX3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQ4X3QqIGRzdCkgeworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNTsKKyAgY29uc3QgdWludDMyX3QqIGNvbnN0IHBfbG9vcDFfZW5kID0gc3JjICsgKG51bV9waXhlbHMgJiB+Myk7CisgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBwX2xvb3AyX2VuZCA9IHNyYyArIG51bV9waXhlbHM7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICIuc2V0ICAgICAgICAgICBwdXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiLnNldCAgICAgICAgICAgbm9yZW9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcSAgICAgICAgICAgICVbc3JjXSwgICAgICAlW3BfbG9vcDFfZW5kXSwgICAgM2YgICAgICAgICBcblx0IgorICAgICIgbm9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgIjA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAgICAgICAgICVbdGVtcDBdLCAgICAwKCVbc3JjXSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgICAgICAgICAlW3RlbXAxXSwgICAgNCglW3NyY10pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAgICAgJVt0ZW1wMl0sICAgIDgoJVtzcmNdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAgICAgICAgICVbdGVtcDNdLCAgICAxMiglW3NyY10pICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJleHQgICAgICAgICAgICAlW3RlbXA0XSwgICAgJVt0ZW1wMF0sICAgICAgICAgIDI4LCAgIDQgICAgXG5cdCIKKyAgICAiZXh0ICAgICAgICAgICAgJVt0ZW1wNV0sICAgICVbdGVtcDBdLCAgICAgICAgICAxMiwgICA0ICAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAgICVbdGVtcDBdLCAgICAlW3RlbXA0XSwgICAgICAgICAgMCwgICAgNCAgICBcblx0IgorICAgICJleHQgICAgICAgICAgICAlW3RlbXA0XSwgICAgJVt0ZW1wMV0sICAgICAgICAgIDI4LCAgIDQgICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDVdLCAgICAgICAgICAxNiwgICA0ICAgIFxuXHQiCisgICAgImV4dCAgICAgICAgICAgICVbdGVtcDVdLCAgICAlW3RlbXAxXSwgICAgICAgICAgMTIsICAgNCAgICBcblx0IgorICAgICJpbnMgICAgICAgICAgICAlW3RlbXAxXSwgICAgJVt0ZW1wNF0sICAgICAgICAgIDAsICAgIDQgICAgXG5cdCIKKyAgICAiZXh0ICAgICAgICAgICAgJVt0ZW1wNF0sICAgICVbdGVtcDJdLCAgICAgICAgICAyOCwgICA0ICAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAgICVbdGVtcDFdLCAgICAlW3RlbXA1XSwgICAgICAgICAgMTYsICAgNCAgICBcblx0IgorICAgICJleHQgICAgICAgICAgICAlW3RlbXA1XSwgICAgJVt0ZW1wMl0sICAgICAgICAgIDEyLCAgIDQgICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICAgJVt0ZW1wMl0sICAgICVbdGVtcDRdLCAgICAgICAgICAwLCAgICA0ICAgIFxuXHQiCisgICAgImV4dCAgICAgICAgICAgICVbdGVtcDRdLCAgICAlW3RlbXAzXSwgICAgICAgICAgMjgsICAgNCAgICBcblx0IgorICAgICJpbnMgICAgICAgICAgICAlW3RlbXAyXSwgICAgJVt0ZW1wNV0sICAgICAgICAgIDE2LCAgIDQgICAgXG5cdCIKKyAgICAiZXh0ICAgICAgICAgICAgJVt0ZW1wNV0sICAgICVbdGVtcDNdLCAgICAgICAgICAxMiwgICA0ICAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAgICVbdGVtcDNdLCAgICAlW3RlbXA0XSwgICAgICAgICAgMCwgICAgNCAgICBcblx0IgorICAgICJwcmVjci5xYi5waCAgICAlW3RlbXAxXSwgICAgJVt0ZW1wMV0sICAgICAgICAgICVbdGVtcDBdICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDVdLCAgICAgICAgICAxNiwgICA0ICAgIFxuXHQiCisgICAgImFkZGl1ICAgICAgICAgICVbc3JjXSwgICAgICAlW3NyY10sICAgICAgICAgICAgMTYgICAgICAgICBcblx0IgorICAgICJwcmVjci5xYi5waCAgICAlW3RlbXAzXSwgICAgJVt0ZW1wM10sICAgICAgICAgICVbdGVtcDJdICAgXG5cdCIKKyNpZiAoV0VCUF9TV0FQXzE2QklUX0NTUCA9PSAxKQorICAgICJ1c3cgICAgICAgICAgICAlW3RlbXAxXSwgICAgMCglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgJVt0ZW1wM10sICAgIDQoJVtkc3RdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisjZWxzZQorICAgICJ3c2JoICAgICAgICAgICAlW3RlbXAxXSwgICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAid3NiaCAgICAgICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDNdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICVbdGVtcDFdLCAgICAwKCVbZHN0XSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAlW3RlbXAzXSwgICAgNCglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyNlbmRpZgorICAgICJibmUgICAgICAgICAgICAlW3NyY10sICAgICAgJVtwX2xvb3AxX2VuZF0sICAgIDBiICAgICAgICAgXG5cdCIKKyAgICAiIGFkZGl1ICAgICAgICAgJVtkc3RdLCAgICAgICVbZHN0XSwgICAgICAgICAgICA4ICAgICAgICAgIFxuXHQiCisgICIzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXEgICAgICAgICAgICAlW3NyY10sICAgICAgJVtwX2xvb3AyX2VuZF0sICAgIDJmICAgICAgICAgXG5cdCIKKyAgICAiIG5vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgICAgICAgICAlW3RlbXAwXSwgICAgMCglW3NyY10pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiZXh0ICAgICAgICAgICAgJVt0ZW1wNF0sICAgICVbdGVtcDBdLCAgICAgICAgICAyOCwgICA0ICAgIFxuXHQiCisgICAgImV4dCAgICAgICAgICAgICVbdGVtcDVdLCAgICAlW3RlbXAwXSwgICAgICAgICAgMTIsICAgNCAgICBcblx0IgorICAgICJpbnMgICAgICAgICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wNF0sICAgICAgICAgIDAsICAgIDQgICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDVdLCAgICAgICAgICAxNiwgICA0ICAgIFxuXHQiCisgICAgImFkZGl1ICAgICAgICAgICVbc3JjXSwgICAgICAlW3NyY10sICAgICAgICAgICAgNCAgICAgICAgICBcblx0IgorICAgICJwcmVjci5xYi5waCAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMF0sICAgICAgICAgICVbdGVtcDBdICAgXG5cdCIKKyNpZiAoV0VCUF9TV0FQXzE2QklUX0NTUCA9PSAxKQorICAgICJ1c2ggICAgICAgICAgICAlW3RlbXAwXSwgICAgMCglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyNlbHNlCisgICAgIndzYmggICAgICAgICAgICVbdGVtcDBdLCAgICAlW3RlbXAwXSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ1c2ggICAgICAgICAgICAlW3RlbXAwXSwgICAgMCglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyNlbmRpZgorICAgICJibmUgICAgICAgICAgICAlW3NyY10sICAgICAgJVtwX2xvb3AyX2VuZF0sICAgIDFiICAgICAgICAgXG5cdCIKKyAgICAiIGFkZGl1ICAgICAgICAgJVtkc3RdLCAgICAgICVbZHN0XSwgICAgICAgICAgICAyICAgICAgICAgIFxuXHQiCisgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIuc2V0ICAgICAgICAgICBwb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLAorICAgICAgW2RzdF0iKyZyIihkc3QpLCBbc3JjXSIrJnIiKHNyYykKKyAgICA6IFtwX2xvb3AxX2VuZF0iciIocF9sb29wMV9lbmQpLCBbcF9sb29wMl9lbmRdInIiKHBfbG9vcDJfZW5kKQorICAgIDogIm1lbW9yeSIKKyAgKTsKK30KKworc3RhdGljIHZvaWQgQ29udmVydEJHUkFUb1JHQjU2NV9NSVBTZHNwUjIoY29uc3QgdWludDMyX3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50OF90KiBkc3QpIHsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDU7CisgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBwX2xvb3AxX2VuZCA9IHNyYyArIChudW1fcGl4ZWxzICYgfjMpOworICBjb25zdCB1aW50MzJfdCogY29uc3QgcF9sb29wMl9lbmQgPSBzcmMgKyBudW1fcGl4ZWxzOworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAiLnNldCAgICAgICAgICAgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIi5zZXQgICAgICAgICAgIG5vcmVvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXEgICAgICAgICAgICAlW3NyY10sICAgICAgJVtwX2xvb3AxX2VuZF0sICAgIDNmICAgICAgICAgXG5cdCIKKyAgICAiIG5vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICIwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgICAgICAgICAlW3RlbXAwXSwgICAgMCglW3NyY10pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAgICAgJVt0ZW1wMV0sICAgIDQoJVtzcmNdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAgICAgICAgICVbdGVtcDJdLCAgICA4KCVbc3JjXSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgICAgICAgICAlW3RlbXAzXSwgICAgMTIoJVtzcmNdKSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiZXh0ICAgICAgICAgICAgJVt0ZW1wNF0sICAgICVbdGVtcDBdLCAgICAgICAgICA4LCAgICAxNiAgIFxuXHQiCisgICAgImV4dCAgICAgICAgICAgICVbdGVtcDVdLCAgICAlW3RlbXAwXSwgICAgICAgICAgNSwgICAgMTEgICBcblx0IgorICAgICJleHQgICAgICAgICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMF0sICAgICAgICAgIDMsICAgIDUgICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICAgJVt0ZW1wNF0sICAgICVbdGVtcDVdLCAgICAgICAgICAwLCAgICAxMSAgIFxuXHQiCisgICAgImV4dCAgICAgICAgICAgICVbdGVtcDVdLCAgICAlW3RlbXAxXSwgICAgICAgICAgNSwgICAgMTEgICBcblx0IgorICAgICJpbnMgICAgICAgICAgICAlW3RlbXA0XSwgICAgJVt0ZW1wMF0sICAgICAgICAgIDAsICAgIDUgICAgXG5cdCIKKyAgICAiZXh0ICAgICAgICAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDFdLCAgICAgICAgICA4LCAgICAxNiAgIFxuXHQiCisgICAgImV4dCAgICAgICAgICAgICVbdGVtcDFdLCAgICAlW3RlbXAxXSwgICAgICAgICAgMywgICAgNSAgICBcblx0IgorICAgICJpbnMgICAgICAgICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wNV0sICAgICAgICAgIDAsICAgIDExICAgXG5cdCIKKyAgICAiZXh0ICAgICAgICAgICAgJVt0ZW1wNV0sICAgICVbdGVtcDJdLCAgICAgICAgICA1LCAgICAxMSAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAgICVbdGVtcDBdLCAgICAlW3RlbXAxXSwgICAgICAgICAgMCwgICAgNSAgICBcblx0IgorICAgICJleHQgICAgICAgICAgICAlW3RlbXAxXSwgICAgJVt0ZW1wMl0sICAgICAgICAgIDgsICAgIDE2ICAgXG5cdCIKKyAgICAiZXh0ICAgICAgICAgICAgJVt0ZW1wMl0sICAgICVbdGVtcDJdLCAgICAgICAgICAzLCAgICA1ICAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAgICVbdGVtcDFdLCAgICAlW3RlbXA1XSwgICAgICAgICAgMCwgICAgMTEgICBcblx0IgorICAgICJleHQgICAgICAgICAgICAlW3RlbXA1XSwgICAgJVt0ZW1wM10sICAgICAgICAgIDUsICAgIDExICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICAgJVt0ZW1wMV0sICAgICVbdGVtcDJdLCAgICAgICAgICAwLCAgICA1ICAgIFxuXHQiCisgICAgImV4dCAgICAgICAgICAgICVbdGVtcDJdLCAgICAlW3RlbXAzXSwgICAgICAgICAgOCwgICAgMTYgICBcblx0IgorICAgICJleHQgICAgICAgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wM10sICAgICAgICAgIDMsICAgIDUgICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICAgJVt0ZW1wMl0sICAgICVbdGVtcDVdLCAgICAgICAgICAwLCAgICAxMSAgIFxuXHQiCisgICAgImFwcGVuZCAgICAgICAgICVbdGVtcDBdLCAgICAlW3RlbXA0XSwgICAgICAgICAgMTYgICAgICAgICBcblx0IgorICAgICJpbnMgICAgICAgICAgICAlW3RlbXAyXSwgICAgJVt0ZW1wM10sICAgICAgICAgIDAsICAgIDUgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICAgICAgJVtzcmNdLCAgICAgICVbc3JjXSwgICAgICAgICAgICAxNiAgICAgICAgIFxuXHQiCisgICAgImFwcGVuZCAgICAgICAgICVbdGVtcDJdLCAgICAlW3RlbXAxXSwgICAgICAgICAgMTYgICAgICAgICBcblx0IgorI2lmIChXRUJQX1NXQVBfMTZCSVRfQ1NQID09IDEpCisgICAgInVzdyAgICAgICAgICAgICVbdGVtcDBdLCAgICAwKCVbZHN0XSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAlW3RlbXAyXSwgICAgNCglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyNlbHNlCisgICAgIndzYmggICAgICAgICAgICVbdGVtcDBdLCAgICAlW3RlbXAwXSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ3c2JoICAgICAgICAgICAlW3RlbXAyXSwgICAgJVt0ZW1wMl0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgJVt0ZW1wMF0sICAgIDAoJVtkc3RdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICVbdGVtcDJdLCAgICA0KCVbZHN0XSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorI2VuZGlmCisgICAgImJuZSAgICAgICAgICAgICVbc3JjXSwgICAgICAlW3BfbG9vcDFfZW5kXSwgICAgMGIgICAgICAgICBcblx0IgorICAgICIgYWRkaXUgICAgICAgICAlW2RzdF0sICAgICAgJVtkc3RdLCAgICAgICAgICAgIDggICAgICAgICAgXG5cdCIKKyAgIjM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcSAgICAgICAgICAgICVbc3JjXSwgICAgICAlW3BfbG9vcDJfZW5kXSwgICAgMmYgICAgICAgICBcblx0IgorICAgICIgbm9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAgICAgICAgICVbdGVtcDBdLCAgICAwKCVbc3JjXSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJleHQgICAgICAgICAgICAlW3RlbXA0XSwgICAgJVt0ZW1wMF0sICAgICAgICAgIDgsICAgIDE2ICAgXG5cdCIKKyAgICAiZXh0ICAgICAgICAgICAgJVt0ZW1wNV0sICAgICVbdGVtcDBdLCAgICAgICAgICA1LCAgICAxMSAgIFxuXHQiCisgICAgImV4dCAgICAgICAgICAgICVbdGVtcDBdLCAgICAlW3RlbXAwXSwgICAgICAgICAgMywgICAgNSAgICBcblx0IgorICAgICJpbnMgICAgICAgICAgICAlW3RlbXA0XSwgICAgJVt0ZW1wNV0sICAgICAgICAgIDAsICAgIDExICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICAgICAgJVtzcmNdLCAgICAgICVbc3JjXSwgICAgICAgICAgICA0ICAgICAgICAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAgICVbdGVtcDRdLCAgICAlW3RlbXAwXSwgICAgICAgICAgMCwgICAgNSAgICBcblx0IgorI2lmIChXRUJQX1NXQVBfMTZCSVRfQ1NQID09IDEpCisgICAgInVzaCAgICAgICAgICAgICVbdGVtcDRdLCAgICAwKCVbZHN0XSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorI2Vsc2UKKyAgICAid3NiaCAgICAgICAgICAgJVt0ZW1wNF0sICAgICVbdGVtcDRdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInVzaCAgICAgICAgICAgICVbdGVtcDRdLCAgICAwKCVbZHN0XSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorI2VuZGlmCisgICAgImJuZSAgICAgICAgICAgICVbc3JjXSwgICAgICAlW3BfbG9vcDJfZW5kXSwgICAgMWIgICAgICAgICBcblx0IgorICAgICIgYWRkaXUgICAgICAgICAlW2RzdF0sICAgICAgJVtkc3RdLCAgICAgICAgICAgIDIgICAgICAgICAgXG5cdCIKKyAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIi5zZXQgICAgICAgICAgIHBvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksCisgICAgICBbZHN0XSIrJnIiKGRzdCksIFtzcmNdIismciIoc3JjKQorICAgIDogW3BfbG9vcDFfZW5kXSJyIihwX2xvb3AxX2VuZCksIFtwX2xvb3AyX2VuZF0iciIocF9sb29wMl9lbmQpCisgICAgOiAibWVtb3J5IgorICApOworfQorCitzdGF0aWMgdm9pZCBDb252ZXJ0QkdSQVRvQkdSX01JUFNkc3BSMihjb25zdCB1aW50MzJfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQ4X3QqIGRzdCkgeworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDM7CisgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBwX2xvb3AxX2VuZCA9IHNyYyArIChudW1fcGl4ZWxzICYgfjMpOworICBjb25zdCB1aW50MzJfdCogY29uc3QgcF9sb29wMl9lbmQgPSBzcmMgKyBudW1fcGl4ZWxzOworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAiLnNldCAgICAgICBwdXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIuc2V0ICAgICAgIG5vcmVvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcSAgICAgICAgJVtzcmNdLCAgICAgICVbcF9sb29wMV9lbmRdLCAgICAzZiAgICAgICAgICAgXG5cdCIKKyAgICAiIG5vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAiMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAgICAgJVt0ZW1wMF0sICAgIDAoJVtzcmNdKSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAlW3RlbXAxXSwgICAgNCglW3NyY10pICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgICAgICVbdGVtcDJdLCAgICA4KCVbc3JjXSkgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAgICAgJVt0ZW1wM10sICAgIDEyKCVbc3JjXSkgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMV0sICAgICAgICAgIDI0LCAgICA4ICAgICBcblx0IgorICAgICJzcmEgICAgICAgICVbdGVtcDFdLCAgICAlW3RlbXAxXSwgICAgICAgICAgOCAgICAgICAgICAgIFxuXHQiCisgICAgImlucyAgICAgICAgJVt0ZW1wMV0sICAgICVbdGVtcDJdLCAgICAgICAgICAxNiwgICAgMTYgICAgXG5cdCIKKyAgICAic2xsICAgICAgICAlW3RlbXAyXSwgICAgJVt0ZW1wMl0sICAgICAgICAgIDggICAgICAgICAgICBcblx0IgorICAgICJiYWxpZ24gICAgICVbdGVtcDNdLCAgICAlW3RlbXAyXSwgICAgICAgICAgMSAgICAgICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAgICAgJVtzcmNdLCAgICAgICVbc3JjXSwgICAgICAgICAgICAxNiAgICAgICAgICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAlW3RlbXAwXSwgICAgMCglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ1c3cgICAgICAgICVbdGVtcDFdLCAgICA0KCVbZHN0XSkgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInVzdyAgICAgICAgJVt0ZW1wM10sICAgIDgoJVtkc3RdKSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYm5lICAgICAgICAlW3NyY10sICAgICAgJVtwX2xvb3AxX2VuZF0sICAgIDBiICAgICAgICAgICBcblx0IgorICAgICIgYWRkaXUgICAgICVbZHN0XSwgICAgICAlW2RzdF0sICAgICAgICAgICAgMTIgICAgICAgICAgIFxuXHQiCisgICIzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxICAgICAgICAlW3NyY10sICAgICAgJVtwX2xvb3AyX2VuZF0sICAgIDJmICAgICAgICAgICBcblx0IgorICAgICIgbm9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAlW3RlbXAwXSwgICAgMCglW3NyY10pICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGRpdSAgICAgICVbc3JjXSwgICAgICAlW3NyY10sICAgICAgICAgICAgNCAgICAgICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAgICAgJVtkc3RdLCAgICAgICVbZHN0XSwgICAgICAgICAgICAzICAgICAgICAgICAgXG5cdCIKKyAgICAidXNoICAgICAgICAlW3RlbXAwXSwgICAgLTMoJVtkc3RdKSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAgICVbdGVtcDBdLCAgICAlW3RlbXAwXSwgICAgICAgICAgMTYgICAgICAgICAgIFxuXHQiCisgICAgImJuZSAgICAgICAgJVtzcmNdLCAgICAgICVbcF9sb29wMl9lbmRdLCAgICAxYiAgICAgICAgICAgXG5cdCIKKyAgICAiIHNiICAgICAgICAlW3RlbXAwXSwgICAgLTEoJVtkc3RdKSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIi5zZXQgICAgICAgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbZHN0XSIrJnIiKGRzdCksIFtzcmNdIismciIoc3JjKQorICAgIDogW3BfbG9vcDFfZW5kXSJyIihwX2xvb3AxX2VuZCksIFtwX2xvb3AyX2VuZF0iciIocF9sb29wMl9lbmQpCisgICAgOiAibWVtb3J5IgorICApOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgVlA4TERzcEluaXRNSVBTZHNwUjIodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBWUDhMRHNwSW5pdE1JUFNkc3BSMih2b2lkKSB7CisgIFZQOExNYXBDb2xvcjMyYiA9IE1hcEFSR0JfTUlQU2RzcFIyOworICBWUDhMTWFwQ29sb3I4YiA9IE1hcEFscGhhX01JUFNkc3BSMjsKKworICBWUDhMUHJlZGljdG9yc1s1XSA9IFByZWRpY3RvcjVfTUlQU2RzcFIyOworICBWUDhMUHJlZGljdG9yc1s2XSA9IFByZWRpY3RvcjZfTUlQU2RzcFIyOworICBWUDhMUHJlZGljdG9yc1s3XSA9IFByZWRpY3RvcjdfTUlQU2RzcFIyOworICBWUDhMUHJlZGljdG9yc1s4XSA9IFByZWRpY3RvcjhfTUlQU2RzcFIyOworICBWUDhMUHJlZGljdG9yc1s5XSA9IFByZWRpY3RvcjlfTUlQU2RzcFIyOworICBWUDhMUHJlZGljdG9yc1sxMF0gPSBQcmVkaWN0b3IxMF9NSVBTZHNwUjI7CisgIFZQOExQcmVkaWN0b3JzWzExXSA9IFByZWRpY3RvcjExX01JUFNkc3BSMjsKKyAgVlA4TFByZWRpY3RvcnNbMTJdID0gUHJlZGljdG9yMTJfTUlQU2RzcFIyOworICBWUDhMUHJlZGljdG9yc1sxM10gPSBQcmVkaWN0b3IxM19NSVBTZHNwUjI7CisKKyAgVlA4TEFkZEdyZWVuVG9CbHVlQW5kUmVkID0gQWRkR3JlZW5Ub0JsdWVBbmRSZWRfTUlQU2RzcFIyOworICBWUDhMVHJhbnNmb3JtQ29sb3JJbnZlcnNlID0gVHJhbnNmb3JtQ29sb3JJbnZlcnNlX01JUFNkc3BSMjsKKworICBWUDhMQ29udmVydEJHUkFUb1JHQiA9IENvbnZlcnRCR1JBVG9SR0JfTUlQU2RzcFIyOworICBWUDhMQ29udmVydEJHUkFUb1JHQkEgPSBDb252ZXJ0QkdSQVRvUkdCQV9NSVBTZHNwUjI7CisgIFZQOExDb252ZXJ0QkdSQVRvUkdCQTQ0NDQgPSBDb252ZXJ0QkdSQVRvUkdCQTQ0NDRfTUlQU2RzcFIyOworICBWUDhMQ29udmVydEJHUkFUb1JHQjU2NSA9IENvbnZlcnRCR1JBVG9SR0I1NjVfTUlQU2RzcFIyOworICBWUDhMQ29udmVydEJHUkFUb0JHUiA9IENvbnZlcnRCR1JBVG9CR1JfTUlQU2RzcFIyOworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX01JUFNfRFNQX1IyCisKK1dFQlBfRFNQX0lOSVRfU1RVQihWUDhMRHNwSW5pdE1JUFNkc3BSMikKKworI2VuZGlmICAvLyBXRUJQX1VTRV9NSVBTX0RTUF9SMgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9sb3NzbGVzc19tc2EuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbG9zc2xlc3NfbXNhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY1NDcyMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbG9zc2xlc3NfbXNhLmMKQEAgLTAsMCArMSwzNTYgQEAKKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBNU0EgdmFyaWFudCBvZiBtZXRob2RzIGZvciBsb3NzbGVzcyBkZWNvZGVyCisvLworLy8gQXV0aG9yOiBQcmFzaGFudCBQYXRpbCAocHJhc2hhbnQucGF0aWxAaW1ndGVjLmNvbSkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01TQSkKKworI2luY2x1ZGUgInNyYy9kc3AvbG9zc2xlc3MuaCIKKyNpbmNsdWRlICJzcmMvZHNwL21zYV9tYWNyby5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29sb3JzcGFjZSBjb252ZXJzaW9uIGZ1bmN0aW9ucworCisjZGVmaW5lIENPTlZFUlQxNl9CR1JBX1hYWChwc3JjLCBwZHN0LCBtMCwgbTEsIG0yKSBkbyB7ICAgIFwKKyAgdjE2dTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgZHN0MCwgZHN0MSwgZHN0MjsgICAgICAgICAgXAorICBMRF9VQjQocHNyYywgMTYsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOyAgICAgICAgICAgICAgICBcCisgIFZTSEZfQjJfVUIoc3JjMCwgc3JjMSwgc3JjMSwgc3JjMiwgbTAsIG0xLCBkc3QwLCBkc3QxKTsgIFwKKyAgZHN0MiA9IFZTSEZfVUIoc3JjMiwgc3JjMywgbTIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBTVF9VQjIoZHN0MCwgZHN0MSwgcGRzdCwgMTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFNUX1VCKGRzdDIsIHBkc3QgKyAzMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQ09OVkVSVDEyX0JHUkFfWFhYKHBzcmMsIHBkc3QsIG0wLCBtMSwgbTIpIGRvIHsgICAgXAorICB1aW50MzJfdCBwaXhfdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHYxNnU4IHNyYzAsIHNyYzEsIHNyYzIsIGRzdDAsIGRzdDEsIGRzdDI7ICAgICAgICAgICAgICAgIFwKKyAgTERfVUIzKHBzcmMsIDE2LCBzcmMwLCBzcmMxLCBzcmMyKTsgICAgICAgICAgICAgICAgICAgICAgXAorICBWU0hGX0IyX1VCKHNyYzAsIHNyYzEsIHNyYzEsIHNyYzIsIG0wLCBtMSwgZHN0MCwgZHN0MSk7ICBcCisgIGRzdDIgPSBWU0hGX1VCKHNyYzIsIHNyYzIsIG0yKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU1RfVUIyKGRzdDAsIGRzdDEsIHBkc3QsIDE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBwaXhfdyA9IF9fbXNhX2NvcHlfc193KCh2NGkzMilkc3QyLCAwKTsgICAgICAgICAgICAgICAgICBcCisgIFNXKHBpeF93LCBwZHN0ICsgMzIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQ09OVkVSVDhfQkdSQV9YWFgocHNyYywgcGRzdCwgbTAsIG0xKSBkbyB7ICAgICAgICAgXAorICB1aW50NjRfdCBwaXhfZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHYxNnU4IHNyYzAsIHNyYzEsIHNyYzIgPSB7IDAgfSwgZHN0MCwgZHN0MTsgICAgICAgICAgICAgIFwKKyAgTERfVUIyKHBzcmMsIDE2LCBzcmMwLCBzcmMxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBWU0hGX0IyX1VCKHNyYzAsIHNyYzEsIHNyYzEsIHNyYzIsIG0wLCBtMSwgZHN0MCwgZHN0MSk7ICBcCisgIFNUX1VCKGRzdDAsIHBkc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcGl4X2QgPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpZHN0MSwgMCk7ICAgICAgICAgICAgICAgICAgXAorICBTRChwaXhfZCwgcGRzdCArIDE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIENPTlZFUlQ0X0JHUkFfWFhYKHBzcmMsIHBkc3QsIG0pIGRvIHsgICAgICAgXAorICBjb25zdCB2MTZ1OCBzcmMwID0gTERfVUIocHNyYyk7ICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdjE2dTggZHN0MCA9IFZTSEZfVUIoc3JjMCwgc3JjMCwgbSk7ICAgICAgICBcCisgIHVpbnQ2NF90IHBpeF9kID0gX19tc2FfY29weV9zX2QoKHYyaTY0KWRzdDAsIDApOyAgXAorICB1aW50MzJfdCBwaXhfdyA9IF9fbXNhX2NvcHlfc193KCh2NGkzMilkc3QwLCAyKTsgIFwKKyAgU0QocGl4X2QsIHBkc3QgKyAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFNXKHBpeF93LCBwZHN0ICsgOCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDT05WRVJUMV9CR1JBX0JHUihwc3JjLCBwZHN0KSBkbyB7ICBcCisgIGNvbnN0IGludDMyX3QgYiA9IChwc3JjKVswXTsgICAgICAgICAgICAgIFwKKyAgY29uc3QgaW50MzJfdCBnID0gKHBzcmMpWzFdOyAgICAgICAgICAgICAgXAorICBjb25zdCBpbnQzMl90IHIgPSAocHNyYylbMl07ICAgICAgICAgICAgICBcCisgIChwZHN0KVswXSA9IGI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKHBkc3QpWzFdID0gZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAocGRzdClbMl0gPSByOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIENPTlZFUlQxX0JHUkFfUkdCKHBzcmMsIHBkc3QpIGRvIHsgIFwKKyAgY29uc3QgaW50MzJfdCBiID0gKHBzcmMpWzBdOyAgICAgICAgICAgICAgXAorICBjb25zdCBpbnQzMl90IGcgPSAocHNyYylbMV07ICAgICAgICAgICAgICBcCisgIGNvbnN0IGludDMyX3QgciA9IChwc3JjKVsyXTsgICAgICAgICAgICAgIFwKKyAgKHBkc3QpWzBdID0gcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAocGRzdClbMV0gPSBnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChwZHN0KVsyXSA9IGI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgVFJBTlNGT1JNX0NPTE9SX0lOVkVSU0VfOChzcmMwLCBzcmMxLCBkc3QwLCBkc3QxLCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMwLCBjMSwgbWFzazAsIG1hc2sxKSBkbyB7ICBcCisgIHY4aTE2IGcwLCBnMSwgdDAsIHQxLCB0MiwgdDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdjRpMzIgdDQsIHQ1OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBWU0hGX0IyX1NIKHNyYzAsIHNyYzAsIHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMCwgZzAsIGcxKTsgICBcCisgIERPVFBfU0IyX1NIKGcwLCBnMSwgYzAsIGMwLCB0MCwgdDEpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU1JBSV9IMl9TSCh0MCwgdDEsIDUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0MCA9IF9fbXNhX2FkZHZfaCh0MCwgKHY4aTE2KXNyYzApOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHQxID0gX19tc2FfYWRkdl9oKHQxLCAodjhpMTYpc3JjMSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdDQgPSBfX21zYV9zcmxpX3coKHY0aTMyKXQwLCAxNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0NSA9IF9fbXNhX3NybGlfdygodjRpMzIpdDEsIDE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIERPVFBfU0IyX1NIKHQ0LCB0NSwgYzEsIGMxLCB0MiwgdDMpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU1JBSV9IMl9TSCh0MiwgdDMsIDUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBREQyKHQwLCB0MiwgdDEsIHQzLCB0MCwgdDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFZTSEZfQjJfVUIoc3JjMCwgdDAsIHNyYzEsIHQxLCBtYXNrMSwgbWFzazEsIGRzdDAsIGRzdDEpOyAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgVFJBTlNGT1JNX0NPTE9SX0lOVkVSU0VfNChzcmMsIGRzdCwgYzAsIGMxLCBtYXNrMCwgbWFzazEpIGRvIHsgIFwKKyAgY29uc3QgdjE2aTggZzAgPSBWU0hGX1NCKHNyYywgc3JjLCBtYXNrMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdjhpMTYgdDAgPSBfX21zYV9kb3RwX3NfaChjMCwgZzApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdjhpMTYgdDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdjRpMzIgdDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdDAgPSBTUkFJX0godDAsIDUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdDAgPSBfX21zYV9hZGR2X2godDAsICh2OGkxNilzcmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdDIgPSBfX21zYV9zcmxpX3coKHY0aTMyKXQwLCAxNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdDEgPSBfX21zYV9kb3RwX3NfaChjMSwgKHYxNmk4KXQyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdDEgPSBTUkFJX0godDEsIDUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdDAgPSB0MCArIHQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZHN0ID0gVlNIRl9VQihzcmMsIHQwLCBtYXNrMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIENvbnZlcnRCR1JBVG9SR0JBX01TQShjb25zdCB1aW50MzJfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50OF90KiBkc3QpIHsKKyAgaW50IGk7CisgIGNvbnN0IHVpbnQ4X3QqIHB0ZW1wX3NyYyA9IChjb25zdCB1aW50OF90KilzcmM7CisgIHVpbnQ4X3QqIHB0ZW1wX2RzdCA9ICh1aW50OF90Kilkc3Q7CisgIHYxNnU4IHNyYzAsIGRzdDA7CisgIGNvbnN0IHYxNnU4IG1hc2sgPSB7IDIsIDEsIDAsIDMsIDYsIDUsIDQsIDcsIDEwLCA5LCA4LCAxMSwgMTQsIDEzLCAxMiwgMTUgfTsKKworICB3aGlsZSAobnVtX3BpeGVscyA+PSA4KSB7CisgICAgdjE2dTggc3JjMSwgZHN0MTsKKyAgICBMRF9VQjIocHRlbXBfc3JjLCAxNiwgc3JjMCwgc3JjMSk7CisgICAgVlNIRl9CMl9VQihzcmMwLCBzcmMwLCBzcmMxLCBzcmMxLCBtYXNrLCBtYXNrLCBkc3QwLCBkc3QxKTsKKyAgICBTVF9VQjIoZHN0MCwgZHN0MSwgcHRlbXBfZHN0LCAxNik7CisgICAgcHRlbXBfc3JjICs9IDMyOworICAgIHB0ZW1wX2RzdCArPSAzMjsKKyAgICBudW1fcGl4ZWxzIC09IDg7CisgIH0KKyAgaWYgKG51bV9waXhlbHMgPiAwKSB7CisgICAgaWYgKG51bV9waXhlbHMgPj0gNCkgeworICAgICAgc3JjMCA9IExEX1VCKHB0ZW1wX3NyYyk7CisgICAgICBkc3QwID0gVlNIRl9VQihzcmMwLCBzcmMwLCBtYXNrKTsKKyAgICAgIFNUX1VCKGRzdDAsIHB0ZW1wX2RzdCk7CisgICAgICBwdGVtcF9zcmMgKz0gMTY7CisgICAgICBwdGVtcF9kc3QgKz0gMTY7CisgICAgICBudW1fcGl4ZWxzIC09IDQ7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcGl4ZWxzOyBpKyspIHsKKyAgICAgIGNvbnN0IHVpbnQ4X3QgYiA9IHB0ZW1wX3NyY1syXTsKKyAgICAgIGNvbnN0IHVpbnQ4X3QgZyA9IHB0ZW1wX3NyY1sxXTsKKyAgICAgIGNvbnN0IHVpbnQ4X3QgciA9IHB0ZW1wX3NyY1swXTsKKyAgICAgIGNvbnN0IHVpbnQ4X3QgYSA9IHB0ZW1wX3NyY1szXTsKKyAgICAgIHB0ZW1wX2RzdFswXSA9IGI7CisgICAgICBwdGVtcF9kc3RbMV0gPSBnOworICAgICAgcHRlbXBfZHN0WzJdID0gcjsKKyAgICAgIHB0ZW1wX2RzdFszXSA9IGE7CisgICAgICBwdGVtcF9zcmMgKz0gNDsKKyAgICAgIHB0ZW1wX2RzdCArPSA0OworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBDb252ZXJ0QkdSQVRvQkdSX01TQShjb25zdCB1aW50MzJfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQ4X3QqIGRzdCkgeworICBjb25zdCB1aW50OF90KiBwdGVtcF9zcmMgPSAoY29uc3QgdWludDhfdCopc3JjOworICB1aW50OF90KiBwdGVtcF9kc3QgPSAodWludDhfdCopZHN0OworICBjb25zdCB2MTZ1OCBtYXNrMCA9IHsgMCwgMSwgMiwgNCwgNSwgNiwgOCwgOSwgMTAsIDEyLCAxMywgMTQsCisgICAgICAgICAgICAgICAgICAgICAgICAxNiwgMTcsIDE4LCAyMCB9OworICBjb25zdCB2MTZ1OCBtYXNrMSA9IHsgNSwgNiwgOCwgOSwgMTAsIDEyLCAxMywgMTQsIDE2LCAxNywgMTgsIDIwLAorICAgICAgICAgICAgICAgICAgICAgICAgMjEsIDIyLCAyNCwgMjUgfTsKKyAgY29uc3QgdjE2dTggbWFzazIgPSB7IDEwLCAxMiwgMTMsIDE0LCAxNiwgMTcsIDE4LCAyMCwgMjEsIDIyLCAyNCwgMjUsCisgICAgICAgICAgICAgICAgICAgICAgICAyNiwgMjgsIDI5LCAzMCB9OworCisgIHdoaWxlIChudW1fcGl4ZWxzID49IDE2KSB7CisgICAgQ09OVkVSVDE2X0JHUkFfWFhYKHB0ZW1wX3NyYywgcHRlbXBfZHN0LCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICBwdGVtcF9zcmMgKz0gNjQ7CisgICAgcHRlbXBfZHN0ICs9IDQ4OworICAgIG51bV9waXhlbHMgLT0gMTY7CisgIH0KKyAgaWYgKG51bV9waXhlbHMgPiAwKSB7CisgICAgaWYgKG51bV9waXhlbHMgPj0gMTIpIHsKKyAgICAgIENPTlZFUlQxMl9CR1JBX1hYWChwdGVtcF9zcmMsIHB0ZW1wX2RzdCwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgICBwdGVtcF9zcmMgKz0gNDg7CisgICAgICBwdGVtcF9kc3QgKz0gMzY7CisgICAgICBudW1fcGl4ZWxzIC09IDEyOworICAgIH0gZWxzZSBpZiAobnVtX3BpeGVscyA+PSA4KSB7CisgICAgICBDT05WRVJUOF9CR1JBX1hYWChwdGVtcF9zcmMsIHB0ZW1wX2RzdCwgbWFzazAsIG1hc2sxKTsKKyAgICAgIHB0ZW1wX3NyYyArPSAzMjsKKyAgICAgIHB0ZW1wX2RzdCArPSAyNDsKKyAgICAgIG51bV9waXhlbHMgLT0gODsKKyAgICB9IGVsc2UgaWYgKG51bV9waXhlbHMgPj0gNCkgeworICAgICAgQ09OVkVSVDRfQkdSQV9YWFgocHRlbXBfc3JjLCBwdGVtcF9kc3QsIG1hc2swKTsKKyAgICAgIHB0ZW1wX3NyYyArPSAxNjsKKyAgICAgIHB0ZW1wX2RzdCArPSAxMjsKKyAgICAgIG51bV9waXhlbHMgLT0gNDsKKyAgICB9CisgICAgaWYgKG51bV9waXhlbHMgPT0gMykgeworICAgICAgQ09OVkVSVDFfQkdSQV9CR1IocHRlbXBfc3JjICsgMCwgcHRlbXBfZHN0ICsgMCk7CisgICAgICBDT05WRVJUMV9CR1JBX0JHUihwdGVtcF9zcmMgKyA0LCBwdGVtcF9kc3QgKyAzKTsKKyAgICAgIENPTlZFUlQxX0JHUkFfQkdSKHB0ZW1wX3NyYyArIDgsIHB0ZW1wX2RzdCArIDYpOworICAgIH0gZWxzZSBpZiAobnVtX3BpeGVscyA9PSAyKSB7CisgICAgICBDT05WRVJUMV9CR1JBX0JHUihwdGVtcF9zcmMgKyAwLCBwdGVtcF9kc3QgKyAwKTsKKyAgICAgIENPTlZFUlQxX0JHUkFfQkdSKHB0ZW1wX3NyYyArIDQsIHB0ZW1wX2RzdCArIDMpOworICAgIH0gZWxzZSBpZiAobnVtX3BpeGVscyA9PSAxKSB7CisgICAgICBDT05WRVJUMV9CR1JBX0JHUihwdGVtcF9zcmMsIHB0ZW1wX2RzdCk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIENvbnZlcnRCR1JBVG9SR0JfTVNBKGNvbnN0IHVpbnQzMl90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDhfdCogZHN0KSB7CisgIGNvbnN0IHVpbnQ4X3QqIHB0ZW1wX3NyYyA9IChjb25zdCB1aW50OF90KilzcmM7CisgIHVpbnQ4X3QqIHB0ZW1wX2RzdCA9ICh1aW50OF90Kilkc3Q7CisgIGNvbnN0IHYxNnU4IG1hc2swID0geyAyLCAxLCAwLCA2LCA1LCA0LCAxMCwgOSwgOCwgMTQsIDEzLCAxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDE4LCAxNywgMTYsIDIyIH07CisgIGNvbnN0IHYxNnU4IG1hc2sxID0geyA1LCA0LCAxMCwgOSwgOCwgMTQsIDEzLCAxMiwgMTgsIDE3LCAxNiwgMjIsCisgICAgICAgICAgICAgICAgICAgICAgICAyMSwgMjAsIDI2LCAyNSB9OworICBjb25zdCB2MTZ1OCBtYXNrMiA9IHsgOCwgMTQsIDEzLCAxMiwgMTgsIDE3LCAxNiwgMjIsIDIxLCAyMCwgMjYsIDI1LAorICAgICAgICAgICAgICAgICAgICAgICAgMjQsIDMwLCAyOSwgMjggfTsKKworICB3aGlsZSAobnVtX3BpeGVscyA+PSAxNikgeworICAgIENPTlZFUlQxNl9CR1JBX1hYWChwdGVtcF9zcmMsIHB0ZW1wX2RzdCwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgcHRlbXBfc3JjICs9IDY0OworICAgIHB0ZW1wX2RzdCArPSA0ODsKKyAgICBudW1fcGl4ZWxzIC09IDE2OworICB9CisgIGlmIChudW1fcGl4ZWxzKSB7CisgICAgaWYgKG51bV9waXhlbHMgPj0gMTIpIHsKKyAgICAgIENPTlZFUlQxMl9CR1JBX1hYWChwdGVtcF9zcmMsIHB0ZW1wX2RzdCwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgICBwdGVtcF9zcmMgKz0gNDg7CisgICAgICBwdGVtcF9kc3QgKz0gMzY7CisgICAgICBudW1fcGl4ZWxzIC09IDEyOworICAgIH0gZWxzZSBpZiAobnVtX3BpeGVscyA+PSA4KSB7CisgICAgICBDT05WRVJUOF9CR1JBX1hYWChwdGVtcF9zcmMsIHB0ZW1wX2RzdCwgbWFzazAsIG1hc2sxKTsKKyAgICAgIHB0ZW1wX3NyYyArPSAzMjsKKyAgICAgIHB0ZW1wX2RzdCArPSAyNDsKKyAgICAgIG51bV9waXhlbHMgLT0gODsKKyAgICB9IGVsc2UgaWYgKG51bV9waXhlbHMgPj0gNCkgeworICAgICAgQ09OVkVSVDRfQkdSQV9YWFgocHRlbXBfc3JjLCBwdGVtcF9kc3QsIG1hc2swKTsKKyAgICAgIHB0ZW1wX3NyYyArPSAxNjsKKyAgICAgIHB0ZW1wX2RzdCArPSAxMjsKKyAgICAgIG51bV9waXhlbHMgLT0gNDsKKyAgICB9CisgICAgaWYgKG51bV9waXhlbHMgPT0gMykgeworICAgICAgQ09OVkVSVDFfQkdSQV9SR0IocHRlbXBfc3JjICsgMCwgcHRlbXBfZHN0ICsgMCk7CisgICAgICBDT05WRVJUMV9CR1JBX1JHQihwdGVtcF9zcmMgKyA0LCBwdGVtcF9kc3QgKyAzKTsKKyAgICAgIENPTlZFUlQxX0JHUkFfUkdCKHB0ZW1wX3NyYyArIDgsIHB0ZW1wX2RzdCArIDYpOworICAgIH0gZWxzZSBpZiAobnVtX3BpeGVscyA9PSAyKSB7CisgICAgICBDT05WRVJUMV9CR1JBX1JHQihwdGVtcF9zcmMgKyAwLCBwdGVtcF9kc3QgKyAwKTsKKyAgICAgIENPTlZFUlQxX0JHUkFfUkdCKHB0ZW1wX3NyYyArIDQsIHB0ZW1wX2RzdCArIDMpOworICAgIH0gZWxzZSBpZiAobnVtX3BpeGVscyA9PSAxKSB7CisgICAgICBDT05WRVJUMV9CR1JBX1JHQihwdGVtcF9zcmMsIHB0ZW1wX2RzdCk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIEFkZEdyZWVuVG9CbHVlQW5kUmVkX01TQShjb25zdCB1aW50MzJfdCogY29uc3Qgc3JjLCBpbnQgbnVtX3BpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZHN0KSB7CisgIGludCBpOworICBjb25zdCB1aW50OF90KiBpbiA9IChjb25zdCB1aW50OF90KilzcmM7CisgIHVpbnQ4X3QqIG91dCA9ICh1aW50OF90Kilkc3Q7CisgIHYxNnU4IHNyYzAsIGRzdDAsIHRtcDA7CisgIGNvbnN0IHYxNnU4IG1hc2sgPSB7IDEsIDI1NSwgMSwgMjU1LCA1LCAyNTUsIDUsIDI1NSwgOSwgMjU1LCA5LCAyNTUsCisgICAgICAgICAgICAgICAgICAgICAgIDEzLCAyNTUsIDEzLCAyNTUgfTsKKworICB3aGlsZSAobnVtX3BpeGVscyA+PSA4KSB7CisgICAgdjE2dTggc3JjMSwgZHN0MSwgdG1wMTsKKyAgICBMRF9VQjIoaW4sIDE2LCBzcmMwLCBzcmMxKTsKKyAgICBWU0hGX0IyX1VCKHNyYzAsIHNyYzEsIHNyYzEsIHNyYzAsIG1hc2ssIG1hc2ssIHRtcDAsIHRtcDEpOworICAgIEFERDIoc3JjMCwgdG1wMCwgc3JjMSwgdG1wMSwgZHN0MCwgZHN0MSk7CisgICAgU1RfVUIyKGRzdDAsIGRzdDEsIG91dCwgMTYpOworICAgIGluICs9IDMyOworICAgIG91dCArPSAzMjsKKyAgICBudW1fcGl4ZWxzIC09IDg7CisgIH0KKyAgaWYgKG51bV9waXhlbHMgPiAwKSB7CisgICAgaWYgKG51bV9waXhlbHMgPj0gNCkgeworICAgICAgc3JjMCA9IExEX1VCKGluKTsKKyAgICAgIHRtcDAgPSBWU0hGX1VCKHNyYzAsIHNyYzAsIG1hc2spOworICAgICAgZHN0MCA9IHNyYzAgKyB0bXAwOworICAgICAgU1RfVUIoZHN0MCwgb3V0KTsKKyAgICAgIGluICs9IDE2OworICAgICAgb3V0ICs9IDE2OworICAgICAgbnVtX3BpeGVscyAtPSA0OworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BpeGVsczsgaSsrKSB7CisgICAgICBjb25zdCB1aW50OF90IGIgPSBpblswXTsKKyAgICAgIGNvbnN0IHVpbnQ4X3QgZyA9IGluWzFdOworICAgICAgY29uc3QgdWludDhfdCByID0gaW5bMl07CisgICAgICBvdXRbMF0gPSAoYiArIGcpICYgMHhmZjsKKyAgICAgIG91dFsxXSA9IGc7CisgICAgICBvdXRbMl0gPSAociArIGcpICYgMHhmZjsKKyAgICAgIG91dFs0XSA9IGluWzRdOworICAgICAgb3V0ICs9IDQ7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIFRyYW5zZm9ybUNvbG9ySW52ZXJzZV9NU0EoY29uc3QgVlA4TE11bHRpcGxpZXJzKiBjb25zdCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogc3JjLCBpbnQgbnVtX3BpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGRzdCkgeworICB2MTZ1OCBzcmMwLCBkc3QwOworICBjb25zdCB2MTZpOCBnMmJyID0gKHYxNmk4KV9fbXNhX2ZpbGxfdyhtLT5ncmVlbl90b19ibHVlXyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtLT5ncmVlbl90b19yZWRfIDw8IDE2KSk7CisgIGNvbnN0IHYxNmk4IHIyYiA9ICh2MTZpOClfX21zYV9maWxsX3cobS0+cmVkX3RvX2JsdWVfKTsKKyAgY29uc3QgdjE2dTggbWFzazAgPSB7IDEsIDI1NSwgMSwgMjU1LCA1LCAyNTUsIDUsIDI1NSwgOSwgMjU1LCA5LCAyNTUsCisgICAgICAgICAgICAgICAgICAgICAgICAxMywgMjU1LCAxMywgMjU1IH07CisgIGNvbnN0IHYxNnU4IG1hc2sxID0geyAxNiwgMSwgMTgsIDMsIDIwLCA1LCAyMiwgNywgMjQsIDksIDI2LCAxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDI4LCAxMywgMzAsIDE1IH07CisKKyAgd2hpbGUgKG51bV9waXhlbHMgPj0gOCkgeworICAgIHYxNnU4IHNyYzEsIGRzdDE7CisgICAgTERfVUIyKHNyYywgNCwgc3JjMCwgc3JjMSk7CisgICAgVFJBTlNGT1JNX0NPTE9SX0lOVkVSU0VfOChzcmMwLCBzcmMxLCBkc3QwLCBkc3QxLCBnMmJyLCByMmIsIG1hc2swLCBtYXNrMSk7CisgICAgU1RfVUIyKGRzdDAsIGRzdDEsIGRzdCwgNCk7CisgICAgc3JjICs9IDg7CisgICAgZHN0ICs9IDg7CisgICAgbnVtX3BpeGVscyAtPSA4OworICB9CisgIGlmIChudW1fcGl4ZWxzID4gMCkgeworICAgIGlmIChudW1fcGl4ZWxzID49IDQpIHsKKyAgICAgIHNyYzAgPSBMRF9VQihzcmMpOworICAgICAgVFJBTlNGT1JNX0NPTE9SX0lOVkVSU0VfNChzcmMwLCBkc3QwLCBnMmJyLCByMmIsIG1hc2swLCBtYXNrMSk7CisgICAgICBTVF9VQihkc3QwLCBkc3QpOworICAgICAgc3JjICs9IDQ7CisgICAgICBkc3QgKz0gNDsKKyAgICAgIG51bV9waXhlbHMgLT0gNDsKKyAgICB9CisgICAgaWYgKG51bV9waXhlbHMgPiAwKSB7CisgICAgICBzcmMwID0gTERfVUIoc3JjKTsKKyAgICAgIFRSQU5TRk9STV9DT0xPUl9JTlZFUlNFXzQoc3JjMCwgZHN0MCwgZzJiciwgcjJiLCBtYXNrMCwgbWFzazEpOworICAgICAgaWYgKG51bV9waXhlbHMgPT0gMykgeworICAgICAgICBjb25zdCB1aW50NjRfdCBwaXhfZCA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NClkc3QwLCAwKTsKKyAgICAgICAgY29uc3QgdWludDMyX3QgcGl4X3cgPSBfX21zYV9jb3B5X3NfdygodjRpMzIpZHN0MCwgMik7CisgICAgICAgIFNEKHBpeF9kLCBkc3QgKyAwKTsKKyAgICAgICAgU1cocGl4X3csIGRzdCArIDIpOworICAgICAgfSBlbHNlIGlmIChudW1fcGl4ZWxzID09IDIpIHsKKyAgICAgICAgY29uc3QgdWludDY0X3QgcGl4X2QgPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpZHN0MCwgMCk7CisgICAgICAgIFNEKHBpeF9kLCBkc3QpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgdWludDMyX3QgcGl4X3cgPSBfX21zYV9jb3B5X3NfdygodjRpMzIpZHN0MCwgMCk7CisgICAgICAgIFNXKHBpeF93LCBkc3QpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgVlA4TERzcEluaXRNU0Eodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBWUDhMRHNwSW5pdE1TQSh2b2lkKSB7CisgIFZQOExDb252ZXJ0QkdSQVRvUkdCQSA9IENvbnZlcnRCR1JBVG9SR0JBX01TQTsKKyAgVlA4TENvbnZlcnRCR1JBVG9CR1IgPSBDb252ZXJ0QkdSQVRvQkdSX01TQTsKKyAgVlA4TENvbnZlcnRCR1JBVG9SR0IgPSBDb252ZXJ0QkdSQVRvUkdCX01TQTsKKworICBWUDhMQWRkR3JlZW5Ub0JsdWVBbmRSZWQgPSBBZGRHcmVlblRvQmx1ZUFuZFJlZF9NU0E7CisgIFZQOExUcmFuc2Zvcm1Db2xvckludmVyc2UgPSBUcmFuc2Zvcm1Db2xvckludmVyc2VfTVNBOworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX01TQQorCitXRUJQX0RTUF9JTklUX1NUVUIoVlA4TERzcEluaXRNU0EpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfTVNBCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2xvc3NsZXNzX25lb24uYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbG9zc2xlc3NfbmVvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YTFiNmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2xvc3NsZXNzX25lb24uYwpAQCAtMCwwICsxLDY0MSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIE5FT04gdmFyaWFudCBvZiBtZXRob2RzIGZvciBsb3NzbGVzcyBkZWNvZGVyCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX05FT04pCisKKyNpbmNsdWRlIDxhcm1fbmVvbi5oPgorCisjaW5jbHVkZSAic3JjL2RzcC9sb3NzbGVzcy5oIgorI2luY2x1ZGUgInNyYy9kc3AvbmVvbi5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29sb3JzcGFjZSBjb252ZXJzaW9uIGZ1bmN0aW9ucworCisjaWYgIWRlZmluZWQoV09SS19BUk9VTkRfR0NDKQorLy8gZ2NjIDQuNi4wIGhhZCBzb21lIHRyb3VibGUgKE5ESy1yOSkgd2l0aCB0aGlzIGNvZGUuIFdlIG9ubHkgdXNlIGl0IGZvcgorLy8gZ2NjLTQuOC54IGF0IGxlYXN0Lgorc3RhdGljIHZvaWQgQ29udmVydEJHUkFUb1JHQkFfTkVPTihjb25zdCB1aW50MzJfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDhfdCogZHN0KSB7CisgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBlbmQgPSBzcmMgKyAobnVtX3BpeGVscyAmIH4xNSk7CisgIGZvciAoOyBzcmMgPCBlbmQ7IHNyYyArPSAxNikgeworICAgIHVpbnQ4eDE2eDRfdCBwaXhlbCA9IHZsZDRxX3U4KCh1aW50OF90KilzcmMpOworICAgIC8vIHN3YXAgQiBhbmQgUi4gKFZTV1AgZDAsZDIgaGFzIG5vIGludHJpbnNpY3MgZXF1aXZhbGVudCEpCisgICAgY29uc3QgdWludDh4MTZfdCB0bXAgPSBwaXhlbC52YWxbMF07CisgICAgcGl4ZWwudmFsWzBdID0gcGl4ZWwudmFsWzJdOworICAgIHBpeGVsLnZhbFsyXSA9IHRtcDsKKyAgICB2c3Q0cV91OChkc3QsIHBpeGVsKTsKKyAgICBkc3QgKz0gNjQ7CisgIH0KKyAgVlA4TENvbnZlcnRCR1JBVG9SR0JBX0Moc3JjLCBudW1fcGl4ZWxzICYgMTUsIGRzdCk7ICAvLyBsZWZ0LW92ZXJzCit9CisKK3N0YXRpYyB2b2lkIENvbnZlcnRCR1JBVG9CR1JfTkVPTihjb25zdCB1aW50MzJfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50OF90KiBkc3QpIHsKKyAgY29uc3QgdWludDMyX3QqIGNvbnN0IGVuZCA9IHNyYyArIChudW1fcGl4ZWxzICYgfjE1KTsKKyAgZm9yICg7IHNyYyA8IGVuZDsgc3JjICs9IDE2KSB7CisgICAgY29uc3QgdWludDh4MTZ4NF90IHBpeGVsID0gdmxkNHFfdTgoKHVpbnQ4X3QqKXNyYyk7CisgICAgY29uc3QgdWludDh4MTZ4M190IHRtcCA9IHsgeyBwaXhlbC52YWxbMF0sIHBpeGVsLnZhbFsxXSwgcGl4ZWwudmFsWzJdIH0gfTsKKyAgICB2c3QzcV91OChkc3QsIHRtcCk7CisgICAgZHN0ICs9IDQ4OworICB9CisgIFZQOExDb252ZXJ0QkdSQVRvQkdSX0Moc3JjLCBudW1fcGl4ZWxzICYgMTUsIGRzdCk7ICAvLyBsZWZ0LW92ZXJzCit9CisKK3N0YXRpYyB2b2lkIENvbnZlcnRCR1JBVG9SR0JfTkVPTihjb25zdCB1aW50MzJfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50OF90KiBkc3QpIHsKKyAgY29uc3QgdWludDMyX3QqIGNvbnN0IGVuZCA9IHNyYyArIChudW1fcGl4ZWxzICYgfjE1KTsKKyAgZm9yICg7IHNyYyA8IGVuZDsgc3JjICs9IDE2KSB7CisgICAgY29uc3QgdWludDh4MTZ4NF90IHBpeGVsID0gdmxkNHFfdTgoKHVpbnQ4X3QqKXNyYyk7CisgICAgY29uc3QgdWludDh4MTZ4M190IHRtcCA9IHsgeyBwaXhlbC52YWxbMl0sIHBpeGVsLnZhbFsxXSwgcGl4ZWwudmFsWzBdIH0gfTsKKyAgICB2c3QzcV91OChkc3QsIHRtcCk7CisgICAgZHN0ICs9IDQ4OworICB9CisgIFZQOExDb252ZXJ0QkdSQVRvUkdCX0Moc3JjLCBudW1fcGl4ZWxzICYgMTUsIGRzdCk7ICAvLyBsZWZ0LW92ZXJzCit9CisKKyNlbHNlICAvLyBXT1JLX0FST1VORF9HQ0MKKworLy8gZ2NjLTQuNi4wIGZhbGxiYWNrCisKK3N0YXRpYyBjb25zdCB1aW50OF90IGtSR0JBU2h1ZmZsZVs4XSA9IHsgMiwgMSwgMCwgMywgNiwgNSwgNCwgNyB9OworCitzdGF0aWMgdm9pZCBDb252ZXJ0QkdSQVRvUkdCQV9ORU9OKGNvbnN0IHVpbnQzMl90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50OF90KiBkc3QpIHsKKyAgY29uc3QgdWludDMyX3QqIGNvbnN0IGVuZCA9IHNyYyArIChudW1fcGl4ZWxzICYgfjEpOworICBjb25zdCB1aW50OHg4X3Qgc2h1ZmZsZSA9IHZsZDFfdTgoa1JHQkFTaHVmZmxlKTsKKyAgZm9yICg7IHNyYyA8IGVuZDsgc3JjICs9IDIpIHsKKyAgICBjb25zdCB1aW50OHg4X3QgcGl4ZWxzID0gdmxkMV91OCgodWludDhfdCopc3JjKTsKKyAgICB2c3QxX3U4KGRzdCwgdnRibDFfdTgocGl4ZWxzLCBzaHVmZmxlKSk7CisgICAgZHN0ICs9IDg7CisgIH0KKyAgVlA4TENvbnZlcnRCR1JBVG9SR0JBX0Moc3JjLCBudW1fcGl4ZWxzICYgMSwgZHN0KTsgIC8vIGxlZnQtb3ZlcnMKK30KKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0JHUlNodWZmbGVbM11bOF0gPSB7CisgIHsgIDAsICAxLCAgMiwgIDQsICA1LCAgNiwgIDgsICA5IH0sCisgIHsgMTAsIDEyLCAxMywgMTQsIDE2LCAxNywgMTgsIDIwIH0sCisgIHsgMjEsIDIyLCAyNCwgMjUsIDI2LCAyOCwgMjksIDMwIH0KK307CisKK3N0YXRpYyB2b2lkIENvbnZlcnRCR1JBVG9CR1JfTkVPTihjb25zdCB1aW50MzJfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50OF90KiBkc3QpIHsKKyAgY29uc3QgdWludDMyX3QqIGNvbnN0IGVuZCA9IHNyYyArIChudW1fcGl4ZWxzICYgfjcpOworICBjb25zdCB1aW50OHg4X3Qgc2h1ZmZsZTAgPSB2bGQxX3U4KGtCR1JTaHVmZmxlWzBdKTsKKyAgY29uc3QgdWludDh4OF90IHNodWZmbGUxID0gdmxkMV91OChrQkdSU2h1ZmZsZVsxXSk7CisgIGNvbnN0IHVpbnQ4eDhfdCBzaHVmZmxlMiA9IHZsZDFfdTgoa0JHUlNodWZmbGVbMl0pOworICBmb3IgKDsgc3JjIDwgZW5kOyBzcmMgKz0gOCkgeworICAgIHVpbnQ4eDh4NF90IHBpeGVsczsKKyAgICBJTklUX1ZFQ1RPUjQocGl4ZWxzLAorICAgICAgICAgICAgICAgICB2bGQxX3U4KChjb25zdCB1aW50OF90Kikoc3JjICsgMCkpLAorICAgICAgICAgICAgICAgICB2bGQxX3U4KChjb25zdCB1aW50OF90Kikoc3JjICsgMikpLAorICAgICAgICAgICAgICAgICB2bGQxX3U4KChjb25zdCB1aW50OF90Kikoc3JjICsgNCkpLAorICAgICAgICAgICAgICAgICB2bGQxX3U4KChjb25zdCB1aW50OF90Kikoc3JjICsgNikpKTsKKyAgICB2c3QxX3U4KGRzdCArICAwLCB2dGJsNF91OChwaXhlbHMsIHNodWZmbGUwKSk7CisgICAgdnN0MV91OChkc3QgKyAgOCwgdnRibDRfdTgocGl4ZWxzLCBzaHVmZmxlMSkpOworICAgIHZzdDFfdTgoZHN0ICsgMTYsIHZ0Ymw0X3U4KHBpeGVscywgc2h1ZmZsZTIpKTsKKyAgICBkc3QgKz0gOCAqIDM7CisgIH0KKyAgVlA4TENvbnZlcnRCR1JBVG9CR1JfQyhzcmMsIG51bV9waXhlbHMgJiA3LCBkc3QpOyAgLy8gbGVmdC1vdmVycworfQorCitzdGF0aWMgY29uc3QgdWludDhfdCBrUkdCU2h1ZmZsZVszXVs4XSA9IHsKKyAgeyAgMiwgIDEsICAwLCAgNiwgIDUsICA0LCAxMCwgIDkgfSwKKyAgeyAgOCwgMTQsIDEzLCAxMiwgMTgsIDE3LCAxNiwgMjIgfSwKKyAgeyAyMSwgMjAsIDI2LCAyNSwgMjQsIDMwLCAyOSwgMjggfQorfTsKKworc3RhdGljIHZvaWQgQ29udmVydEJHUkFUb1JHQl9ORU9OKGNvbnN0IHVpbnQzMl90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQ4X3QqIGRzdCkgeworICBjb25zdCB1aW50MzJfdCogY29uc3QgZW5kID0gc3JjICsgKG51bV9waXhlbHMgJiB+Nyk7CisgIGNvbnN0IHVpbnQ4eDhfdCBzaHVmZmxlMCA9IHZsZDFfdTgoa1JHQlNodWZmbGVbMF0pOworICBjb25zdCB1aW50OHg4X3Qgc2h1ZmZsZTEgPSB2bGQxX3U4KGtSR0JTaHVmZmxlWzFdKTsKKyAgY29uc3QgdWludDh4OF90IHNodWZmbGUyID0gdmxkMV91OChrUkdCU2h1ZmZsZVsyXSk7CisgIGZvciAoOyBzcmMgPCBlbmQ7IHNyYyArPSA4KSB7CisgICAgdWludDh4OHg0X3QgcGl4ZWxzOworICAgIElOSVRfVkVDVE9SNChwaXhlbHMsCisgICAgICAgICAgICAgICAgIHZsZDFfdTgoKGNvbnN0IHVpbnQ4X3QqKShzcmMgKyAwKSksCisgICAgICAgICAgICAgICAgIHZsZDFfdTgoKGNvbnN0IHVpbnQ4X3QqKShzcmMgKyAyKSksCisgICAgICAgICAgICAgICAgIHZsZDFfdTgoKGNvbnN0IHVpbnQ4X3QqKShzcmMgKyA0KSksCisgICAgICAgICAgICAgICAgIHZsZDFfdTgoKGNvbnN0IHVpbnQ4X3QqKShzcmMgKyA2KSkpOworICAgIHZzdDFfdTgoZHN0ICsgIDAsIHZ0Ymw0X3U4KHBpeGVscywgc2h1ZmZsZTApKTsKKyAgICB2c3QxX3U4KGRzdCArICA4LCB2dGJsNF91OChwaXhlbHMsIHNodWZmbGUxKSk7CisgICAgdnN0MV91OChkc3QgKyAxNiwgdnRibDRfdTgocGl4ZWxzLCBzaHVmZmxlMikpOworICAgIGRzdCArPSA4ICogMzsKKyAgfQorICBWUDhMQ29udmVydEJHUkFUb1JHQl9DKHNyYywgbnVtX3BpeGVscyAmIDcsIGRzdCk7ICAvLyBsZWZ0LW92ZXJzCit9CisKKyNlbmRpZiAgIC8vICFXT1JLX0FST1VORF9HQ0MKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFByZWRpY3RvciBUcmFuc2Zvcm0KKworI2RlZmluZSBMT0FEX1UzMl9BU19VOChJTikgdnJlaW50ZXJwcmV0X3U4X3UzMih2ZHVwX25fdTMyKChJTikpKQorI2RlZmluZSBMT0FEX1UzMlBfQVNfVTgoSU4pIHZyZWludGVycHJldF91OF91MzIodmxkMV91MzIoKElOKSkpCisjZGVmaW5lIExPQURRX1UzMl9BU19VOChJTikgdnJlaW50ZXJwcmV0cV91OF91MzIodmR1cHFfbl91MzIoKElOKSkpCisjZGVmaW5lIExPQURRX1UzMlBfQVNfVTgoSU4pIHZyZWludGVycHJldHFfdThfdTMyKHZsZDFxX3UzMigoSU4pKSkKKyNkZWZpbmUgR0VUX1U4X0FTX1UzMihJTikgdmdldF9sYW5lX3UzMih2cmVpbnRlcnByZXRfdTMyX3U4KChJTikpLCAwKTsKKyNkZWZpbmUgR0VUUV9VOF9BU19VMzIoSU4pIHZnZXRxX2xhbmVfdTMyKHZyZWludGVycHJldHFfdTMyX3U4KChJTikpLCAwKTsKKyNkZWZpbmUgU1RPUkVRX1U4X0FTX1UzMlAoT1VULCBJTikgdnN0MXFfdTMyKChPVVQpLCB2cmVpbnRlcnByZXRxX3UzMl91OCgoSU4pKSk7CisjZGVmaW5lIFJPVEFURTMyX0xFRlQoTCkgdmV4dHFfdTgoKEwpLCAoTCksIDEyKSAgICAvLyBEfEN8QnxBIC0+IEN8QnxBfEQKKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ4eDhfdCBBdmVyYWdlMl91OF9ORU9OKHVpbnQzMl90IGEwLCB1aW50MzJfdCBhMSkgeworICBjb25zdCB1aW50OHg4X3QgQTAgPSBMT0FEX1UzMl9BU19VOChhMCk7CisgIGNvbnN0IHVpbnQ4eDhfdCBBMSA9IExPQURfVTMyX0FTX1U4KGExKTsKKyAgcmV0dXJuIHZoYWRkX3U4KEEwLCBBMSk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBDbGFtcGVkQWRkU3VidHJhY3RIYWxmX05FT04odWludDMyX3QgYzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjMikgeworICBjb25zdCB1aW50OHg4X3QgYXZnID0gQXZlcmFnZTJfdThfTkVPTihjMCwgYzEpOworICAvLyBSZW1vdmUgb25lIHRvIGMyIHdoZW4gYmlnZ2VyIHRoYW4gYXZnLgorICBjb25zdCB1aW50OHg4X3QgQzIgPSBMT0FEX1UzMl9BU19VOChjMik7CisgIGNvbnN0IHVpbnQ4eDhfdCBjbXAgPSB2Y2d0X3U4KEMyLCBhdmcpOworICBjb25zdCB1aW50OHg4X3QgQzJfMSA9IHZhZGRfdTgoQzIsIGNtcCk7CisgIC8vIENvbXB1dGUgaGFsZiBvZiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGF2ZyBhbmQgYzIuCisgIGNvbnN0IGludDh4OF90IGRpZmZfYXZnID0gdnJlaW50ZXJwcmV0X3M4X3U4KHZoc3ViX3U4KGF2ZywgQzJfMSkpOworICAvLyBDb21wdXRlIHRoZSBzdW0gd2l0aCBhdmcgYW5kIHNhdHVyYXRlLgorICBjb25zdCBpbnQxNng4X3QgYXZnXzE2ID0gdnJlaW50ZXJwcmV0cV9zMTZfdTE2KHZtb3ZsX3U4KGF2ZykpOworICBjb25zdCB1aW50OHg4X3QgcmVzID0gdnFtb3Z1bl9zMTYodmFkZHdfczgoYXZnXzE2LCBkaWZmX2F2ZykpOworICBjb25zdCB1aW50MzJfdCBvdXRwdXQgPSBHRVRfVThfQVNfVTMyKHJlcyk7CisgIHJldHVybiBvdXRwdXQ7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBBdmVyYWdlMl9ORU9OKHVpbnQzMl90IGEwLCB1aW50MzJfdCBhMSkgeworICBjb25zdCB1aW50OHg4X3QgYXZnX3U4eDggPSBBdmVyYWdlMl91OF9ORU9OKGEwLCBhMSk7CisgIGNvbnN0IHVpbnQzMl90IGF2ZyA9IEdFVF9VOF9BU19VMzIoYXZnX3U4eDgpOworICByZXR1cm4gYXZnOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQXZlcmFnZTNfTkVPTih1aW50MzJfdCBhMCwgdWludDMyX3QgYTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhMikgeworICBjb25zdCB1aW50OHg4X3QgYXZnMCA9IEF2ZXJhZ2UyX3U4X05FT04oYTAsIGEyKTsKKyAgY29uc3QgdWludDh4OF90IEExID0gTE9BRF9VMzJfQVNfVTgoYTEpOworICBjb25zdCB1aW50MzJfdCBhdmcgPSBHRVRfVThfQVNfVTMyKHZoYWRkX3U4KGF2ZzAsIEExKSk7CisgIHJldHVybiBhdmc7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3I1X05FT04odWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICByZXR1cm4gQXZlcmFnZTNfTkVPTihsZWZ0LCB0b3BbMF0sIHRvcFsxXSk7Cit9CitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yNl9ORU9OKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgcmV0dXJuIEF2ZXJhZ2UyX05FT04obGVmdCwgdG9wWy0xXSk7Cit9CitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yN19ORU9OKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgcmV0dXJuIEF2ZXJhZ2UyX05FT04obGVmdCwgdG9wWzBdKTsKK30KK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3IxM19ORU9OKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgcmV0dXJuIENsYW1wZWRBZGRTdWJ0cmFjdEhhbGZfTkVPTihsZWZ0LCB0b3BbMF0sIHRvcFstMV0pOworfQorCisvLyBCYXRjaCB2ZXJzaW9ucyBvZiB0aG9zZSBmdW5jdGlvbnMuCisKKy8vIFByZWRpY3RvcjA6IEFSR0JfQkxBQ0suCitzdGF0aWMgdm9pZCBQcmVkaWN0b3JBZGQwX05FT04oY29uc3QgdWludDMyX3QqIGluLCBjb25zdCB1aW50MzJfdCogdXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQzMl90KiBvdXQpIHsKKyAgaW50IGk7CisgIGNvbnN0IHVpbnQ4eDE2X3QgYmxhY2sgPSB2cmVpbnRlcnByZXRxX3U4X3UzMih2ZHVwcV9uX3UzMihBUkdCX0JMQUNLKSk7CisgIGZvciAoaSA9IDA7IGkgKyA0IDw9IG51bV9waXhlbHM7IGkgKz0gNCkgeworICAgIGNvbnN0IHVpbnQ4eDE2X3Qgc3JjID0gTE9BRFFfVTMyUF9BU19VOCgmaW5baV0pOworICAgIGNvbnN0IHVpbnQ4eDE2X3QgcmVzID0gdmFkZHFfdTgoc3JjLCBibGFjayk7CisgICAgU1RPUkVRX1U4X0FTX1UzMlAoJm91dFtpXSwgcmVzKTsKKyAgfQorICBWUDhMUHJlZGljdG9yc0FkZF9DWzBdKGluICsgaSwgdXBwZXIgKyBpLCBudW1fcGl4ZWxzIC0gaSwgb3V0ICsgaSk7Cit9CisKKy8vIFByZWRpY3RvcjE6IGxlZnQuCitzdGF0aWMgdm9pZCBQcmVkaWN0b3JBZGQxX05FT04oY29uc3QgdWludDMyX3QqIGluLCBjb25zdCB1aW50MzJfdCogdXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQzMl90KiBvdXQpIHsKKyAgaW50IGk7CisgIGNvbnN0IHVpbnQ4eDE2X3QgemVybyA9IExPQURRX1UzMl9BU19VOCgwKTsKKyAgZm9yIChpID0gMDsgaSArIDQgPD0gbnVtX3BpeGVsczsgaSArPSA0KSB7CisgICAgLy8gYSB8IGIgfCBjIHwgZAorICAgIGNvbnN0IHVpbnQ4eDE2X3Qgc3JjID0gTE9BRFFfVTMyUF9BU19VOCgmaW5baV0pOworICAgIC8vIDAgfCBhIHwgYiB8IGMKKyAgICBjb25zdCB1aW50OHgxNl90IHNoaWZ0MCA9IHZleHRxX3U4KHplcm8sIHNyYywgMTIpOworICAgIC8vIGEgfCBhICsgYiB8IGIgKyBjIHwgYyArIGQKKyAgICBjb25zdCB1aW50OHgxNl90IHN1bTAgPSB2YWRkcV91OChzcmMsIHNoaWZ0MCk7CisgICAgLy8gMCB8IDAgfCBhIHwgYSArIGIKKyAgICBjb25zdCB1aW50OHgxNl90IHNoaWZ0MSA9IHZleHRxX3U4KHplcm8sIHN1bTAsIDgpOworICAgIC8vIGEgfCBhICsgYiB8IGEgKyBiICsgYyB8IGEgKyBiICsgYyArIGQKKyAgICBjb25zdCB1aW50OHgxNl90IHN1bTEgPSB2YWRkcV91OChzdW0wLCBzaGlmdDEpOworICAgIGNvbnN0IHVpbnQ4eDE2X3QgcHJldiA9IExPQURRX1UzMl9BU19VOChvdXRbaSAtIDFdKTsKKyAgICBjb25zdCB1aW50OHgxNl90IHJlcyA9IHZhZGRxX3U4KHN1bTEsIHByZXYpOworICAgIFNUT1JFUV9VOF9BU19VMzJQKCZvdXRbaV0sIHJlcyk7CisgIH0KKyAgVlA4TFByZWRpY3RvcnNBZGRfQ1sxXShpbiArIGksIHVwcGVyICsgaSwgbnVtX3BpeGVscyAtIGksIG91dCArIGkpOworfQorCisvLyBNYWNybyB0aGF0IGFkZHMgMzItYml0IGludGVnZXJzIGZyb20gSU4gdXNpbmcgbW9kIDI1NiBhcml0aG1ldGljCisvLyBwZXIgOCBiaXQgY2hhbm5lbC4KKyNkZWZpbmUgR0VORVJBVEVfUFJFRElDVE9SXzEoWCwgSU4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgUHJlZGljdG9yQWRkIyNYIyNfTkVPTihjb25zdCB1aW50MzJfdCogaW4sICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiB1cHBlciwgaW50IG51bV9waXhlbHMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIG91dCkgeyAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZvciAoaSA9IDA7IGkgKyA0IDw9IG51bV9waXhlbHM7IGkgKz0gNCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB1aW50OHgxNl90IHNyYyA9IExPQURRX1UzMlBfQVNfVTgoJmluW2ldKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVpbnQ4eDE2X3Qgb3RoZXIgPSBMT0FEUV9VMzJQX0FTX1U4KCYoSU4pKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDh4MTZfdCByZXMgPSB2YWRkcV91OChzcmMsIG90aGVyKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTVE9SRVFfVThfQVNfVTMyUCgmb3V0W2ldLCByZXMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFZQOExQcmVkaWN0b3JzQWRkX0NbKFgpXShpbiArIGksIHVwcGVyICsgaSwgbnVtX3BpeGVscyAtIGksIG91dCArIGkpOyAgIFwKK30KKy8vIFByZWRpY3RvcjI6IFRvcC4KK0dFTkVSQVRFX1BSRURJQ1RPUl8xKDIsIHVwcGVyW2ldKQorLy8gUHJlZGljdG9yMzogVG9wLXJpZ2h0LgorR0VORVJBVEVfUFJFRElDVE9SXzEoMywgdXBwZXJbaSArIDFdKQorLy8gUHJlZGljdG9yNDogVG9wLWxlZnQuCitHRU5FUkFURV9QUkVESUNUT1JfMSg0LCB1cHBlcltpIC0gMV0pCisjdW5kZWYgR0VORVJBVEVfUFJFRElDVE9SXzEKKworLy8gUHJlZGljdG9yNTogYXZlcmFnZShhdmVyYWdlKGxlZnQsIFRSKSwgVCkKKyNkZWZpbmUgRE9fUFJFRDUoTEFORSkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQ4eDE2X3QgYXZnTFRSID0gdmhhZGRxX3U4KEwsIFRSKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50OHgxNl90IGF2ZyA9IHZoYWRkcV91OChhdmdMVFIsIFQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDh4MTZfdCByZXMgPSB2YWRkcV91OChhdmcsIHNyYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZzdDFxX2xhbmVfdTMyKCZvdXRbaSArIChMQU5FKV0sIHZyZWludGVycHJldHFfdTMyX3U4KHJlcyksIChMQU5FKSk7ICAgXAorICBMID0gUk9UQVRFMzJfTEVGVChyZXMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIFByZWRpY3RvckFkZDVfTkVPTihjb25zdCB1aW50MzJfdCogaW4sIGNvbnN0IHVpbnQzMl90KiB1cHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDMyX3QqIG91dCkgeworICBpbnQgaTsKKyAgdWludDh4MTZfdCBMID0gTE9BRFFfVTMyX0FTX1U4KG91dFstMV0pOworICBmb3IgKGkgPSAwOyBpICsgNCA8PSBudW1fcGl4ZWxzOyBpICs9IDQpIHsKKyAgICBjb25zdCB1aW50OHgxNl90IHNyYyA9IExPQURRX1UzMlBfQVNfVTgoJmluW2ldKTsKKyAgICBjb25zdCB1aW50OHgxNl90IFQgPSBMT0FEUV9VMzJQX0FTX1U4KCZ1cHBlcltpICsgMF0pOworICAgIGNvbnN0IHVpbnQ4eDE2X3QgVFIgPSBMT0FEUV9VMzJQX0FTX1U4KCZ1cHBlcltpICsgMV0pOworICAgIERPX1BSRUQ1KDApOworICAgIERPX1BSRUQ1KDEpOworICAgIERPX1BSRUQ1KDIpOworICAgIERPX1BSRUQ1KDMpOworICB9CisgIFZQOExQcmVkaWN0b3JzQWRkX0NbNV0oaW4gKyBpLCB1cHBlciArIGksIG51bV9waXhlbHMgLSBpLCBvdXQgKyBpKTsKK30KKyN1bmRlZiBET19QUkVENQorCisjZGVmaW5lIERPX1BSRUQ2NyhMQU5FKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50OHgxNl90IGF2ZyA9IHZoYWRkcV91OChMLCB0b3ApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDh4MTZfdCByZXMgPSB2YWRkcV91OChhdmcsIHNyYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZzdDFxX2xhbmVfdTMyKCZvdXRbaSArIChMQU5FKV0sIHZyZWludGVycHJldHFfdTMyX3U4KHJlcyksIChMQU5FKSk7ICAgXAorICBMID0gUk9UQVRFMzJfTEVGVChyZXMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKy8vIFByZWRpY3RvcjY6IGF2ZXJhZ2UobGVmdCwgVEwpCitzdGF0aWMgdm9pZCBQcmVkaWN0b3JBZGQ2X05FT04oY29uc3QgdWludDMyX3QqIGluLCBjb25zdCB1aW50MzJfdCogdXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQzMl90KiBvdXQpIHsKKyAgaW50IGk7CisgIHVpbnQ4eDE2X3QgTCA9IExPQURRX1UzMl9BU19VOChvdXRbLTFdKTsKKyAgZm9yIChpID0gMDsgaSArIDQgPD0gbnVtX3BpeGVsczsgaSArPSA0KSB7CisgICAgY29uc3QgdWludDh4MTZfdCBzcmMgPSBMT0FEUV9VMzJQX0FTX1U4KCZpbltpXSk7CisgICAgY29uc3QgdWludDh4MTZfdCB0b3AgPSBMT0FEUV9VMzJQX0FTX1U4KCZ1cHBlcltpIC0gMV0pOworICAgIERPX1BSRUQ2NygwKTsKKyAgICBET19QUkVENjcoMSk7CisgICAgRE9fUFJFRDY3KDIpOworICAgIERPX1BSRUQ2NygzKTsKKyAgfQorICBWUDhMUHJlZGljdG9yc0FkZF9DWzZdKGluICsgaSwgdXBwZXIgKyBpLCBudW1fcGl4ZWxzIC0gaSwgb3V0ICsgaSk7Cit9CisKKy8vIFByZWRpY3Rvcjc6IGF2ZXJhZ2UobGVmdCwgVCkKK3N0YXRpYyB2b2lkIFByZWRpY3RvckFkZDdfTkVPTihjb25zdCB1aW50MzJfdCogaW4sIGNvbnN0IHVpbnQzMl90KiB1cHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDMyX3QqIG91dCkgeworICBpbnQgaTsKKyAgdWludDh4MTZfdCBMID0gTE9BRFFfVTMyX0FTX1U4KG91dFstMV0pOworICBmb3IgKGkgPSAwOyBpICsgNCA8PSBudW1fcGl4ZWxzOyBpICs9IDQpIHsKKyAgICBjb25zdCB1aW50OHgxNl90IHNyYyA9IExPQURRX1UzMlBfQVNfVTgoJmluW2ldKTsKKyAgICBjb25zdCB1aW50OHgxNl90IHRvcCA9IExPQURRX1UzMlBfQVNfVTgoJnVwcGVyW2ldKTsKKyAgICBET19QUkVENjcoMCk7CisgICAgRE9fUFJFRDY3KDEpOworICAgIERPX1BSRUQ2NygyKTsKKyAgICBET19QUkVENjcoMyk7CisgIH0KKyAgVlA4TFByZWRpY3RvcnNBZGRfQ1s3XShpbiArIGksIHVwcGVyICsgaSwgbnVtX3BpeGVscyAtIGksIG91dCArIGkpOworfQorI3VuZGVmIERPX1BSRUQ2NworCisjZGVmaW5lIEdFTkVSQVRFX1BSRURJQ1RPUl8yKFgsIElOKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIFByZWRpY3RvckFkZCMjWCMjX05FT04oY29uc3QgdWludDMyX3QqIGluLCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogdXBwZXIsIGludCBudW1fcGl4ZWxzLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBvdXQpIHsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKGkgPSAwOyBpICsgNCA8PSBudW1fcGl4ZWxzOyBpICs9IDQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDh4MTZfdCBzcmMgPSBMT0FEUV9VMzJQX0FTX1U4KCZpbltpXSk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB1aW50OHgxNl90IFRvdGhlciA9IExPQURRX1UzMlBfQVNfVTgoJihJTikpOyAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVpbnQ4eDE2X3QgVCA9IExPQURRX1UzMlBfQVNfVTgoJnVwcGVyW2ldKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDh4MTZfdCBhdmcgPSB2aGFkZHFfdTgoVCwgVG90aGVyKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB1aW50OHgxNl90IHJlcyA9IHZhZGRxX3U4KGF2Zywgc3JjKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNUT1JFUV9VOF9BU19VMzJQKCZvdXRbaV0sIHJlcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVlA4TFByZWRpY3RvcnNBZGRfQ1soWCldKGluICsgaSwgdXBwZXIgKyBpLCBudW1fcGl4ZWxzIC0gaSwgb3V0ICsgaSk7ICAgXAorfQorLy8gUHJlZGljdG9yODogYXZlcmFnZSBUTCBULgorR0VORVJBVEVfUFJFRElDVE9SXzIoOCwgdXBwZXJbaSAtIDFdKQorLy8gUHJlZGljdG9yOTogYXZlcmFnZSBUIFRSLgorR0VORVJBVEVfUFJFRElDVE9SXzIoOSwgdXBwZXJbaSArIDFdKQorI3VuZGVmIEdFTkVSQVRFX1BSRURJQ1RPUl8yCisKKy8vIFByZWRpY3RvcjEwOiBhdmVyYWdlIG9mIChhdmVyYWdlIG9mIChMLFRMKSwgYXZlcmFnZSBvZiAoVCwgVFIpKS4KKyNkZWZpbmUgRE9fUFJFRDEwKExBTkUpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQ4eDE2X3QgYXZnTFRMID0gdmhhZGRxX3U4KEwsIFRMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50OHgxNl90IGF2ZyA9IHZoYWRkcV91OChhdmdUVFIsIGF2Z0xUTCk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDh4MTZfdCByZXMgPSB2YWRkcV91OChhdmcsIHNyYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZzdDFxX2xhbmVfdTMyKCZvdXRbaSArIChMQU5FKV0sIHZyZWludGVycHJldHFfdTMyX3U4KHJlcyksIChMQU5FKSk7ICAgXAorICBMID0gUk9UQVRFMzJfTEVGVChyZXMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIFByZWRpY3RvckFkZDEwX05FT04oY29uc3QgdWludDMyX3QqIGluLCBjb25zdCB1aW50MzJfdCogdXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50MzJfdCogb3V0KSB7CisgIGludCBpOworICB1aW50OHgxNl90IEwgPSBMT0FEUV9VMzJfQVNfVTgob3V0Wy0xXSk7CisgIGZvciAoaSA9IDA7IGkgKyA0IDw9IG51bV9waXhlbHM7IGkgKz0gNCkgeworICAgIGNvbnN0IHVpbnQ4eDE2X3Qgc3JjID0gTE9BRFFfVTMyUF9BU19VOCgmaW5baV0pOworICAgIGNvbnN0IHVpbnQ4eDE2X3QgVEwgPSBMT0FEUV9VMzJQX0FTX1U4KCZ1cHBlcltpIC0gMV0pOworICAgIGNvbnN0IHVpbnQ4eDE2X3QgVCA9IExPQURRX1UzMlBfQVNfVTgoJnVwcGVyW2ldKTsKKyAgICBjb25zdCB1aW50OHgxNl90IFRSID0gTE9BRFFfVTMyUF9BU19VOCgmdXBwZXJbaSArIDFdKTsKKyAgICBjb25zdCB1aW50OHgxNl90IGF2Z1RUUiA9IHZoYWRkcV91OChULCBUUik7CisgICAgRE9fUFJFRDEwKDApOworICAgIERPX1BSRUQxMCgxKTsKKyAgICBET19QUkVEMTAoMik7CisgICAgRE9fUFJFRDEwKDMpOworICB9CisgIFZQOExQcmVkaWN0b3JzQWRkX0NbMTBdKGluICsgaSwgdXBwZXIgKyBpLCBudW1fcGl4ZWxzIC0gaSwgb3V0ICsgaSk7Cit9CisjdW5kZWYgRE9fUFJFRDEwCisKKy8vIFByZWRpY3RvcjExOiBzZWxlY3QuCisjZGVmaW5lIERPX1BSRUQxMShMQU5FKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50OHgxNl90IHN1bUxpbiA9IHZhZGRxX3U4KEwsIHNyYyk7ICAvKiBpbiArIEwgKi8gICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDh4MTZfdCBwTFRMID0gdmFiZHFfdTgoTCwgVEwpOyAgLyogfEwgLSBUTHwgKi8gICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQxNng4X3Qgc3VtX0xUTCA9IHZwYWRkbHFfdTgocExUTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50MzJ4NF90IHBhID0gdnBhZGRscV91MTYoc3VtX0xUTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDMyeDRfdCBtYXNrID0gdmNsZXFfdTMyKHBhLCBwYik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQ4eDE2X3QgcmVzID0gdmJzbHFfdTgodnJlaW50ZXJwcmV0cV91OF91MzIobWFzayksIHN1bVRpbiwgc3VtTGluKTsgXAorICB2c3QxcV9sYW5lX3UzMigmb3V0W2kgKyAoTEFORSldLCB2cmVpbnRlcnByZXRxX3UzMl91OChyZXMpLCAoTEFORSkpOyAgICAgICAgIFwKKyAgTCA9IFJPVEFURTMyX0xFRlQocmVzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBQcmVkaWN0b3JBZGQxMV9ORU9OKGNvbnN0IHVpbnQzMl90KiBpbiwgY29uc3QgdWludDMyX3QqIHVwcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDMyX3QqIG91dCkgeworICBpbnQgaTsKKyAgdWludDh4MTZfdCBMID0gTE9BRFFfVTMyX0FTX1U4KG91dFstMV0pOworICBmb3IgKGkgPSAwOyBpICsgNCA8PSBudW1fcGl4ZWxzOyBpICs9IDQpIHsKKyAgICBjb25zdCB1aW50OHgxNl90IFQgPSBMT0FEUV9VMzJQX0FTX1U4KCZ1cHBlcltpXSk7CisgICAgY29uc3QgdWludDh4MTZfdCBUTCA9IExPQURRX1UzMlBfQVNfVTgoJnVwcGVyW2kgLSAxXSk7CisgICAgY29uc3QgdWludDh4MTZfdCBwVFRMID0gdmFiZHFfdTgoVCwgVEwpOyAgIC8vIHxUIC0gVEx8CisgICAgY29uc3QgdWludDE2eDhfdCBzdW1fVFRMID0gdnBhZGRscV91OChwVFRMKTsKKyAgICBjb25zdCB1aW50MzJ4NF90IHBiID0gdnBhZGRscV91MTYoc3VtX1RUTCk7CisgICAgY29uc3QgdWludDh4MTZfdCBzcmMgPSBMT0FEUV9VMzJQX0FTX1U4KCZpbltpXSk7CisgICAgY29uc3QgdWludDh4MTZfdCBzdW1UaW4gPSB2YWRkcV91OChULCBzcmMpOyAgIC8vIGluICsgVAorICAgIERPX1BSRUQxMSgwKTsKKyAgICBET19QUkVEMTEoMSk7CisgICAgRE9fUFJFRDExKDIpOworICAgIERPX1BSRUQxMSgzKTsKKyAgfQorICBWUDhMUHJlZGljdG9yc0FkZF9DWzExXShpbiArIGksIHVwcGVyICsgaSwgbnVtX3BpeGVscyAtIGksIG91dCArIGkpOworfQorI3VuZGVmIERPX1BSRUQxMQorCisvLyBQcmVkaWN0b3IxMjogQ2xhbXBlZEFkZFN1YnRyYWN0RnVsbC4KKyNkZWZpbmUgRE9fUFJFRDEyKERJRkYsIExBTkUpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQ4eDhfdCBwcmVkID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdnFtb3Z1bl9zMTYodmFkZHFfczE2KHZyZWludGVycHJldHFfczE2X3UxNihMKSwgKERJRkYpKSk7ICAgICAgICAgIFwKKyAgY29uc3QgdWludDh4OF90IHJlcyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB2YWRkX3U4KHByZWQsIChMQU5FIDw9IDEpID8gdmdldF9sb3dfdTgoc3JjKSA6IHZnZXRfaGlnaF91OChzcmMpKTsgXAorICBjb25zdCB1aW50MTZ4OF90IHJlczE2ID0gdm1vdmxfdTgocmVzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdnN0MV9sYW5lX3UzMigmb3V0W2kgKyAoTEFORSldLCB2cmVpbnRlcnByZXRfdTMyX3U4KHJlcyksIChMQU5FKSAmIDEpOyBcCisgIC8qIHJvdGF0ZSBpbiB0aGUgbGVmdCBwcmVkaWN0b3IgZm9yIG5leHQgaXRlcmF0aW9uICovICAgICAgICAgICAgICAgICAgXAorICBMID0gdmV4dHFfdTE2KHJlczE2LCByZXMxNiwgNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIFByZWRpY3RvckFkZDEyX05FT04oY29uc3QgdWludDMyX3QqIGluLCBjb25zdCB1aW50MzJfdCogdXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50MzJfdCogb3V0KSB7CisgIGludCBpOworICB1aW50MTZ4OF90IEwgPSB2bW92bF91OChMT0FEX1UzMl9BU19VOChvdXRbLTFdKSk7CisgIGZvciAoaSA9IDA7IGkgKyA0IDw9IG51bV9waXhlbHM7IGkgKz0gNCkgeworICAgIC8vIGxvYWQgZm91ciBwaXhlbHMgb2Ygc291cmNlCisgICAgY29uc3QgdWludDh4MTZfdCBzcmMgPSBMT0FEUV9VMzJQX0FTX1U4KCZpbltpXSk7CisgICAgLy8gcHJlY29tcHV0ZSB0aGUgZGlmZmVyZW5jZSBUIC0gVEwgb25jZSBmb3IgYWxsLCBzdG9yZWQgYXMgczE2CisgICAgY29uc3QgdWludDh4MTZfdCBUTCA9IExPQURRX1UzMlBfQVNfVTgoJnVwcGVyW2kgLSAxXSk7CisgICAgY29uc3QgdWludDh4MTZfdCBUID0gTE9BRFFfVTMyUF9BU19VOCgmdXBwZXJbaV0pOworICAgIGNvbnN0IGludDE2eDhfdCBkaWZmX2xvID0KKyAgICAgICAgdnJlaW50ZXJwcmV0cV9zMTZfdTE2KHZzdWJsX3U4KHZnZXRfbG93X3U4KFQpLCB2Z2V0X2xvd191OChUTCkpKTsKKyAgICBjb25zdCBpbnQxNng4X3QgZGlmZl9oaSA9CisgICAgICAgIHZyZWludGVycHJldHFfczE2X3UxNih2c3VibF91OCh2Z2V0X2hpZ2hfdTgoVCksIHZnZXRfaGlnaF91OChUTCkpKTsKKyAgICAvLyBsb29wIG92ZXIgdGhlIGZvdXIgcmVjb25zdHJ1Y3RlZCBwaXhlbHMKKyAgICBET19QUkVEMTIoZGlmZl9sbywgMCk7CisgICAgRE9fUFJFRDEyKGRpZmZfbG8sIDEpOworICAgIERPX1BSRUQxMihkaWZmX2hpLCAyKTsKKyAgICBET19QUkVEMTIoZGlmZl9oaSwgMyk7CisgIH0KKyAgVlA4TFByZWRpY3RvcnNBZGRfQ1sxMl0oaW4gKyBpLCB1cHBlciArIGksIG51bV9waXhlbHMgLSBpLCBvdXQgKyBpKTsKK30KKyN1bmRlZiBET19QUkVEMTIKKworLy8gUHJlZGljdG9yMTM6IENsYW1wZWRBZGRTdWJ0cmFjdEhhbGYKKyNkZWZpbmUgRE9fUFJFRDEzKExBTkUsIExPV19PUl9ISSkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQ4eDE2X3QgYXZnID0gdmhhZGRxX3U4KEwsIFQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50OHgxNl90IGNtcCA9IHZjZ3RxX3U4KFRMLCBhdmcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDh4MTZfdCBUTF8xID0gdmFkZHFfdTgoVEwsIGNtcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIC8qIENvbXB1dGUgaGFsZiBvZiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGF2ZyBhbmQgVEwnLiAqLyAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBpbnQ4eDhfdCBkaWZmX2F2ZyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHZyZWludGVycHJldF9zOF91OChMT1dfT1JfSEkodmhzdWJxX3U4KGF2ZywgVExfMSkpKTsgICAgICAgICAgICAgICAgICAgICBcCisgIC8qIENvbXB1dGUgdGhlIHN1bSB3aXRoIGF2ZyBhbmQgc2F0dXJhdGUuICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBpbnQxNng4X3QgYXZnXzE2ID0gdnJlaW50ZXJwcmV0cV9zMTZfdTE2KHZtb3ZsX3U4KExPV19PUl9ISShhdmcpKSk7ICAgIFwKKyAgY29uc3QgdWludDh4OF90IGRlbHRhID0gdnFtb3Z1bl9zMTYodmFkZHdfczgoYXZnXzE2LCBkaWZmX2F2ZykpOyAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQ4eDhfdCByZXMgPSB2YWRkX3U4KExPV19PUl9ISShzcmMpLCBkZWx0YSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50OHgxNl90IHJlczIgPSB2Y29tYmluZV91OChyZXMsIHJlcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdnN0MV9sYW5lX3UzMigmb3V0W2kgKyAoTEFORSldLCB2cmVpbnRlcnByZXRfdTMyX3U4KHJlcyksIChMQU5FKSAmIDEpOyAgICAgICBcCisgIEwgPSBST1RBVEUzMl9MRUZUKHJlczIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgUHJlZGljdG9yQWRkMTNfTkVPTihjb25zdCB1aW50MzJfdCogaW4sIGNvbnN0IHVpbnQzMl90KiB1cHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQzMl90KiBvdXQpIHsKKyAgaW50IGk7CisgIHVpbnQ4eDE2X3QgTCA9IExPQURRX1UzMl9BU19VOChvdXRbLTFdKTsKKyAgZm9yIChpID0gMDsgaSArIDQgPD0gbnVtX3BpeGVsczsgaSArPSA0KSB7CisgICAgY29uc3QgdWludDh4MTZfdCBzcmMgPSBMT0FEUV9VMzJQX0FTX1U4KCZpbltpXSk7CisgICAgY29uc3QgdWludDh4MTZfdCBUID0gTE9BRFFfVTMyUF9BU19VOCgmdXBwZXJbaV0pOworICAgIGNvbnN0IHVpbnQ4eDE2X3QgVEwgPSBMT0FEUV9VMzJQX0FTX1U4KCZ1cHBlcltpIC0gMV0pOworICAgIERPX1BSRUQxMygwLCB2Z2V0X2xvd191OCk7CisgICAgRE9fUFJFRDEzKDEsIHZnZXRfbG93X3U4KTsKKyAgICBET19QUkVEMTMoMiwgdmdldF9oaWdoX3U4KTsKKyAgICBET19QUkVEMTMoMywgdmdldF9oaWdoX3U4KTsKKyAgfQorICBWUDhMUHJlZGljdG9yc0FkZF9DWzEzXShpbiArIGksIHVwcGVyICsgaSwgbnVtX3BpeGVscyAtIGksIG91dCArIGkpOworfQorI3VuZGVmIERPX1BSRUQxMworCisjdW5kZWYgTE9BRF9VMzJfQVNfVTgKKyN1bmRlZiBMT0FEX1UzMlBfQVNfVTgKKyN1bmRlZiBMT0FEUV9VMzJfQVNfVTgKKyN1bmRlZiBMT0FEUV9VMzJQX0FTX1U4CisjdW5kZWYgR0VUX1U4X0FTX1UzMgorI3VuZGVmIEdFVFFfVThfQVNfVTMyCisjdW5kZWYgU1RPUkVRX1U4X0FTX1UzMlAKKyN1bmRlZiBST1RBVEUzMl9MRUZUCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTdWJ0cmFjdC1HcmVlbiBUcmFuc2Zvcm0KKworLy8gdnRibD9fdTggYXJlIG1hcmtlZCB1bmF2YWlsYWJsZSBmb3IgaU9TIGFybTY0IHdpdGggWGNvZGUgPCA2LjMsIHVzZQorLy8gbm9uLXN0YW5kYXJkIHZlcnNpb25zIHRoZXJlLgorI2lmIGRlZmluZWQoX19BUFBMRV9fKSAmJiBkZWZpbmVkKF9fYWFyY2g2NF9fKSAmJiBcCisgICAgZGVmaW5lZChfX2FwcGxlX2J1aWxkX3ZlcnNpb25fXykgJiYgKF9fYXBwbGVfYnVpbGRfdmVyc2lvbl9fPCA2MDIwMDM3KQorI2RlZmluZSBVU0VfVlRCTFEKKyNlbmRpZgorCisjaWZkZWYgVVNFX1ZUQkxRCisvLyAyNTUgPSBieXRlIHdpbGwgYmUgemVyb2VkCitzdGF0aWMgY29uc3QgdWludDhfdCBrR3JlZW5TaHVmZmxlWzE2XSA9IHsKKyAgMSwgMjU1LCAxLCAyNTUsIDUsIDI1NSwgNSwgMjU1LCA5LCAyNTUsIDksIDI1NSwgMTMsIDI1NSwgMTMsIDI1NQorfTsKKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ4eDE2X3QgRG9HcmVlblNodWZmbGVfTkVPTihjb25zdCB1aW50OHgxNl90IGFyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4eDE2X3Qgc2h1ZmZsZSkgeworICByZXR1cm4gdmNvbWJpbmVfdTgodnRibDFxX3U4KGFyZ2IsIHZnZXRfbG93X3U4KHNodWZmbGUpKSwKKyAgICAgICAgICAgICAgICAgICAgIHZ0YmwxcV91OChhcmdiLCB2Z2V0X2hpZ2hfdTgoc2h1ZmZsZSkpKTsKK30KKyNlbHNlICAvLyAhVVNFX1ZUQkxRCisvLyAyNTUgPSBieXRlIHdpbGwgYmUgemVyb2VkCitzdGF0aWMgY29uc3QgdWludDhfdCBrR3JlZW5TaHVmZmxlWzhdID0geyAxLCAyNTUsIDEsIDI1NSwgNSwgMjU1LCA1LCAyNTUgIH07CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50OHgxNl90IERvR3JlZW5TaHVmZmxlX05FT04oY29uc3QgdWludDh4MTZfdCBhcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OHg4X3Qgc2h1ZmZsZSkgeworICByZXR1cm4gdmNvbWJpbmVfdTgodnRibDFfdTgodmdldF9sb3dfdTgoYXJnYiksIHNodWZmbGUpLAorICAgICAgICAgICAgICAgICAgICAgdnRibDFfdTgodmdldF9oaWdoX3U4KGFyZ2IpLCBzaHVmZmxlKSk7Cit9CisjZW5kaWYgIC8vIFVTRV9WVEJMUQorCitzdGF0aWMgdm9pZCBBZGRHcmVlblRvQmx1ZUFuZFJlZF9ORU9OKGNvbnN0IHVpbnQzMl90KiBzcmMsIGludCBudW1fcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZHN0KSB7CisgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBlbmQgPSBzcmMgKyAobnVtX3BpeGVscyAmIH4zKTsKKyNpZmRlZiBVU0VfVlRCTFEKKyAgY29uc3QgdWludDh4MTZfdCBzaHVmZmxlID0gdmxkMXFfdTgoa0dyZWVuU2h1ZmZsZSk7CisjZWxzZQorICBjb25zdCB1aW50OHg4X3Qgc2h1ZmZsZSA9IHZsZDFfdTgoa0dyZWVuU2h1ZmZsZSk7CisjZW5kaWYKKyAgZm9yICg7IHNyYyA8IGVuZDsgc3JjICs9IDQsIGRzdCArPSA0KSB7CisgICAgY29uc3QgdWludDh4MTZfdCBhcmdiID0gdmxkMXFfdTgoKGNvbnN0IHVpbnQ4X3QqKXNyYyk7CisgICAgY29uc3QgdWludDh4MTZfdCBncmVlbnMgPSBEb0dyZWVuU2h1ZmZsZV9ORU9OKGFyZ2IsIHNodWZmbGUpOworICAgIHZzdDFxX3U4KCh1aW50OF90Kilkc3QsIHZhZGRxX3U4KGFyZ2IsIGdyZWVucykpOworICB9CisgIC8vIGZhbGx0aHJvdWdoIGFuZCBmaW5pc2ggb2ZmIHdpdGggcGxhaW4tQworICBWUDhMQWRkR3JlZW5Ub0JsdWVBbmRSZWRfQyhzcmMsIG51bV9waXhlbHMgJiAzLCBkc3QpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29sb3IgVHJhbnNmb3JtCisKK3N0YXRpYyB2b2lkIFRyYW5zZm9ybUNvbG9ySW52ZXJzZV9ORU9OKGNvbnN0IFZQOExNdWx0aXBsaWVycyogY29uc3QgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDMyX3QqIGRzdCkgeworLy8gc2lnbi1leHRlbmRlZCBtdWx0aXBseWluZyBjb25zdGFudHMsIHByZS1zaGlmdGVkIGJ5IDYuCisjZGVmaW5lIENTVChYKSAgKCgoaW50MTZfdCkobS0+WCA8PCA4KSkgPj4gNikKKyAgY29uc3QgaW50MTZfdCByYls4XSA9IHsKKyAgICBDU1QoZ3JlZW5fdG9fYmx1ZV8pLCBDU1QoZ3JlZW5fdG9fcmVkXyksCisgICAgQ1NUKGdyZWVuX3RvX2JsdWVfKSwgQ1NUKGdyZWVuX3RvX3JlZF8pLAorICAgIENTVChncmVlbl90b19ibHVlXyksIENTVChncmVlbl90b19yZWRfKSwKKyAgICBDU1QoZ3JlZW5fdG9fYmx1ZV8pLCBDU1QoZ3JlZW5fdG9fcmVkXykKKyAgfTsKKyAgY29uc3QgaW50MTZ4OF90IG11bHRzX3JiID0gdmxkMXFfczE2KHJiKTsKKyAgY29uc3QgaW50MTZfdCBiMls4XSA9IHsKKyAgICAwLCBDU1QocmVkX3RvX2JsdWVfKSwgMCwgQ1NUKHJlZF90b19ibHVlXyksCisgICAgMCwgQ1NUKHJlZF90b19ibHVlXyksIDAsIENTVChyZWRfdG9fYmx1ZV8pLAorICB9OworICBjb25zdCBpbnQxNng4X3QgbXVsdHNfYjIgPSB2bGQxcV9zMTYoYjIpOworI3VuZGVmIENTVAorI2lmZGVmIFVTRV9WVEJMUQorICBzdGF0aWMgY29uc3QgdWludDhfdCBrZzBnMFsxNl0gPSB7CisgICAgMjU1LCAxLCAyNTUsIDEsIDI1NSwgNSwgMjU1LCA1LCAyNTUsIDksIDI1NSwgOSwgMjU1LCAxMywgMjU1LCAxMworICB9OworICBjb25zdCB1aW50OHgxNl90IHNodWZmbGUgPSB2bGQxcV91OChrZzBnMCk7CisjZWxzZQorICBzdGF0aWMgY29uc3QgdWludDhfdCBrMGcwZ1s4XSA9IHsgMjU1LCAxLCAyNTUsIDEsIDI1NSwgNSwgMjU1LCA1IH07CisgIGNvbnN0IHVpbnQ4eDhfdCBzaHVmZmxlID0gdmxkMV91OChrMGcwZyk7CisjZW5kaWYKKyAgY29uc3QgdWludDMyeDRfdCBtYXNrX2FnID0gdmR1cHFfbl91MzIoMHhmZjAwZmYwMHUpOworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSArIDQgPD0gbnVtX3BpeGVsczsgaSArPSA0KSB7CisgICAgY29uc3QgdWludDh4MTZfdCBpbiA9IHZsZDFxX3U4KChjb25zdCB1aW50OF90Kikoc3JjICsgaSkpOworICAgIGNvbnN0IHVpbnQzMng0X3QgYTBnMCA9IHZhbmRxX3UzMih2cmVpbnRlcnByZXRxX3UzMl91OChpbiksIG1hc2tfYWcpOworICAgIC8vIDAgZyAwIGcKKyAgICBjb25zdCB1aW50OHgxNl90IGdyZWVucyA9IERvR3JlZW5TaHVmZmxlX05FT04oaW4sIHNodWZmbGUpOworICAgIC8vIHggZHIgIHggZGIxCisgICAgY29uc3QgaW50MTZ4OF90IEEgPSB2cWRtdWxocV9zMTYodnJlaW50ZXJwcmV0cV9zMTZfdTgoZ3JlZW5zKSwgbXVsdHNfcmIpOworICAgIC8vIHggcicgIHggICBiJworICAgIGNvbnN0IGludDh4MTZfdCBCID0gdmFkZHFfczgodnJlaW50ZXJwcmV0cV9zOF91OChpbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cmVpbnRlcnByZXRxX3M4X3MxNihBKSk7CisgICAgLy8gcicgMCAgIGInIDAKKyAgICBjb25zdCBpbnQxNng4X3QgQyA9IHZzaGxxX25fczE2KHZyZWludGVycHJldHFfczE2X3M4KEIpLCA4KTsKKyAgICAvLyB4IGRiMiAgMCAgMAorICAgIGNvbnN0IGludDE2eDhfdCBEID0gdnFkbXVsaHFfczE2KEMsIG11bHRzX2IyKTsKKyAgICAvLyAwICB4IGRiMiAgMAorICAgIGNvbnN0IHVpbnQzMng0X3QgRSA9IHZzaHJxX25fdTMyKHZyZWludGVycHJldHFfdTMyX3MxNihEKSwgOCk7CisgICAgLy8gcicgeCAgYicnIDAKKyAgICBjb25zdCBpbnQ4eDE2X3QgRiA9IHZhZGRxX3M4KHZyZWludGVycHJldHFfczhfdTMyKEUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnJlaW50ZXJwcmV0cV9zOF9zMTYoQykpOworICAgIC8vIDAgIHInICAwICBiJycKKyAgICBjb25zdCB1aW50MTZ4OF90IEcgPSB2c2hycV9uX3UxNih2cmVpbnRlcnByZXRxX3UxNl9zOChGKSwgOCk7CisgICAgY29uc3QgdWludDMyeDRfdCBvdXQgPSB2b3JycV91MzIodnJlaW50ZXJwcmV0cV91MzJfdTE2KEcpLCBhMGcwKTsKKyAgICB2c3QxcV91MzIoZHN0ICsgaSwgb3V0KTsKKyAgfQorICAvLyBGYWxsLWJhY2sgdG8gQy12ZXJzaW9uIGZvciBsZWZ0LW92ZXJzLgorICBWUDhMVHJhbnNmb3JtQ29sb3JJbnZlcnNlX0MobSwgc3JjICsgaSwgbnVtX3BpeGVscyAtIGksIGRzdCArIGkpOworfQorCisjdW5kZWYgVVNFX1ZUQkxRCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBWUDhMRHNwSW5pdE5FT04odm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBWUDhMRHNwSW5pdE5FT04odm9pZCkgeworICBWUDhMUHJlZGljdG9yc1s1XSA9IFByZWRpY3RvcjVfTkVPTjsKKyAgVlA4TFByZWRpY3RvcnNbNl0gPSBQcmVkaWN0b3I2X05FT047CisgIFZQOExQcmVkaWN0b3JzWzddID0gUHJlZGljdG9yN19ORU9OOworICBWUDhMUHJlZGljdG9yc1sxM10gPSBQcmVkaWN0b3IxM19ORU9OOworCisgIFZQOExQcmVkaWN0b3JzQWRkWzBdID0gUHJlZGljdG9yQWRkMF9ORU9OOworICBWUDhMUHJlZGljdG9yc0FkZFsxXSA9IFByZWRpY3RvckFkZDFfTkVPTjsKKyAgVlA4TFByZWRpY3RvcnNBZGRbMl0gPSBQcmVkaWN0b3JBZGQyX05FT047CisgIFZQOExQcmVkaWN0b3JzQWRkWzNdID0gUHJlZGljdG9yQWRkM19ORU9OOworICBWUDhMUHJlZGljdG9yc0FkZFs0XSA9IFByZWRpY3RvckFkZDRfTkVPTjsKKyAgVlA4TFByZWRpY3RvcnNBZGRbNV0gPSBQcmVkaWN0b3JBZGQ1X05FT047CisgIFZQOExQcmVkaWN0b3JzQWRkWzZdID0gUHJlZGljdG9yQWRkNl9ORU9OOworICBWUDhMUHJlZGljdG9yc0FkZFs3XSA9IFByZWRpY3RvckFkZDdfTkVPTjsKKyAgVlA4TFByZWRpY3RvcnNBZGRbOF0gPSBQcmVkaWN0b3JBZGQ4X05FT047CisgIFZQOExQcmVkaWN0b3JzQWRkWzldID0gUHJlZGljdG9yQWRkOV9ORU9OOworICBWUDhMUHJlZGljdG9yc0FkZFsxMF0gPSBQcmVkaWN0b3JBZGQxMF9ORU9OOworICBWUDhMUHJlZGljdG9yc0FkZFsxMV0gPSBQcmVkaWN0b3JBZGQxMV9ORU9OOworICBWUDhMUHJlZGljdG9yc0FkZFsxMl0gPSBQcmVkaWN0b3JBZGQxMl9ORU9OOworICBWUDhMUHJlZGljdG9yc0FkZFsxM10gPSBQcmVkaWN0b3JBZGQxM19ORU9OOworCisgIFZQOExDb252ZXJ0QkdSQVRvUkdCQSA9IENvbnZlcnRCR1JBVG9SR0JBX05FT047CisgIFZQOExDb252ZXJ0QkdSQVRvQkdSID0gQ29udmVydEJHUkFUb0JHUl9ORU9OOworICBWUDhMQ29udmVydEJHUkFUb1JHQiA9IENvbnZlcnRCR1JBVG9SR0JfTkVPTjsKKworICBWUDhMQWRkR3JlZW5Ub0JsdWVBbmRSZWQgPSBBZGRHcmVlblRvQmx1ZUFuZFJlZF9ORU9OOworICBWUDhMVHJhbnNmb3JtQ29sb3JJbnZlcnNlID0gVHJhbnNmb3JtQ29sb3JJbnZlcnNlX05FT047Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfTkVPTgorCitXRUJQX0RTUF9JTklUX1NUVUIoVlA4TERzcEluaXRORU9OKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX05FT04KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbG9zc2xlc3Nfc3NlMi5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9sb3NzbGVzc19zc2UyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdkNzU3NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbG9zc2xlc3Nfc3NlMi5jCkBAIC0wLDAgKzEsNzA3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU1NFMiB2YXJpYW50IG9mIG1ldGhvZHMgZm9yIGxvc3NsZXNzIGRlY29kZXIKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFMikKKworI2luY2x1ZGUgInNyYy9kc3AvY29tbW9uX3NzZTIuaCIKKyNpbmNsdWRlICJzcmMvZHNwL2xvc3NsZXNzLmgiCisjaW5jbHVkZSAic3JjL2RzcC9sb3NzbGVzc19jb21tb24uaCIKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxlbW1pbnRyaW4uaD4KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFByZWRpY3RvciBUcmFuc2Zvcm0KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IENsYW1wZWRBZGRTdWJ0cmFjdEZ1bGxfU1NFMih1aW50MzJfdCBjMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGMyKSB7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGNvbnN0IF9fbTEyOGkgQzAgPSBfbW1fdW5wYWNrbG9fZXBpOChfbW1fY3Z0c2kzMl9zaTEyOChjMCksIHplcm8pOworICBjb25zdCBfX20xMjhpIEMxID0gX21tX3VucGFja2xvX2VwaTgoX21tX2N2dHNpMzJfc2kxMjgoYzEpLCB6ZXJvKTsKKyAgY29uc3QgX19tMTI4aSBDMiA9IF9tbV91bnBhY2tsb19lcGk4KF9tbV9jdnRzaTMyX3NpMTI4KGMyKSwgemVybyk7CisgIGNvbnN0IF9fbTEyOGkgVjEgPSBfbW1fYWRkX2VwaTE2KEMwLCBDMSk7CisgIGNvbnN0IF9fbTEyOGkgVjIgPSBfbW1fc3ViX2VwaTE2KFYxLCBDMik7CisgIGNvbnN0IF9fbTEyOGkgYiA9IF9tbV9wYWNrdXNfZXBpMTYoVjIsIFYyKTsKKyAgY29uc3QgdWludDMyX3Qgb3V0cHV0ID0gX21tX2N2dHNpMTI4X3NpMzIoYik7CisgIHJldHVybiBvdXRwdXQ7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBDbGFtcGVkQWRkU3VidHJhY3RIYWxmX1NTRTIodWludDMyX3QgYzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjMikgeworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBjb25zdCBfX20xMjhpIEMwID0gX21tX3VucGFja2xvX2VwaTgoX21tX2N2dHNpMzJfc2kxMjgoYzApLCB6ZXJvKTsKKyAgY29uc3QgX19tMTI4aSBDMSA9IF9tbV91bnBhY2tsb19lcGk4KF9tbV9jdnRzaTMyX3NpMTI4KGMxKSwgemVybyk7CisgIGNvbnN0IF9fbTEyOGkgQjAgPSBfbW1fdW5wYWNrbG9fZXBpOChfbW1fY3Z0c2kzMl9zaTEyOChjMiksIHplcm8pOworICBjb25zdCBfX20xMjhpIGF2ZyA9IF9tbV9hZGRfZXBpMTYoQzEsIEMwKTsKKyAgY29uc3QgX19tMTI4aSBBMCA9IF9tbV9zcmxpX2VwaTE2KGF2ZywgMSk7CisgIGNvbnN0IF9fbTEyOGkgQTEgPSBfbW1fc3ViX2VwaTE2KEEwLCBCMCk7CisgIGNvbnN0IF9fbTEyOGkgQmd0QSA9IF9tbV9jbXBndF9lcGkxNihCMCwgQTApOworICBjb25zdCBfX20xMjhpIEEyID0gX21tX3N1Yl9lcGkxNihBMSwgQmd0QSk7CisgIGNvbnN0IF9fbTEyOGkgQTMgPSBfbW1fc3JhaV9lcGkxNihBMiwgMSk7CisgIGNvbnN0IF9fbTEyOGkgQTQgPSBfbW1fYWRkX2VwaTE2KEEwLCBBMyk7CisgIGNvbnN0IF9fbTEyOGkgQTUgPSBfbW1fcGFja3VzX2VwaTE2KEE0LCBBNCk7CisgIGNvbnN0IHVpbnQzMl90IG91dHB1dCA9IF9tbV9jdnRzaTEyOF9zaTMyKEE1KTsKKyAgcmV0dXJuIG91dHB1dDsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IFNlbGVjdF9TU0UyKHVpbnQzMl90IGEsIHVpbnQzMl90IGIsIHVpbnQzMl90IGMpIHsKKyAgaW50IHBhX21pbnVzX3BiOworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBjb25zdCBfX20xMjhpIEEwID0gX21tX2N2dHNpMzJfc2kxMjgoYSk7CisgIGNvbnN0IF9fbTEyOGkgQjAgPSBfbW1fY3Z0c2kzMl9zaTEyOChiKTsKKyAgY29uc3QgX19tMTI4aSBDMCA9IF9tbV9jdnRzaTMyX3NpMTI4KGMpOworICBjb25zdCBfX20xMjhpIEFDMCA9IF9tbV9zdWJzX2VwdTgoQTAsIEMwKTsKKyAgY29uc3QgX19tMTI4aSBDQTAgPSBfbW1fc3Vic19lcHU4KEMwLCBBMCk7CisgIGNvbnN0IF9fbTEyOGkgQkMwID0gX21tX3N1YnNfZXB1OChCMCwgQzApOworICBjb25zdCBfX20xMjhpIENCMCA9IF9tbV9zdWJzX2VwdTgoQzAsIEIwKTsKKyAgY29uc3QgX19tMTI4aSBBQyA9IF9tbV9vcl9zaTEyOChBQzAsIENBMCk7CisgIGNvbnN0IF9fbTEyOGkgQkMgPSBfbW1fb3Jfc2kxMjgoQkMwLCBDQjApOworICBjb25zdCBfX20xMjhpIHBhID0gX21tX3VucGFja2xvX2VwaTgoQUMsIHplcm8pOyAgLy8gfGEgLSBjfAorICBjb25zdCBfX20xMjhpIHBiID0gX21tX3VucGFja2xvX2VwaTgoQkMsIHplcm8pOyAgLy8gfGIgLSBjfAorICBjb25zdCBfX20xMjhpIGRpZmYgPSBfbW1fc3ViX2VwaTE2KHBiLCBwYSk7CisgIHsKKyAgICBpbnQxNl90IG91dFs4XTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKilvdXQsIGRpZmYpOworICAgIHBhX21pbnVzX3BiID0gb3V0WzBdICsgb3V0WzFdICsgb3V0WzJdICsgb3V0WzNdOworICB9CisgIHJldHVybiAocGFfbWludXNfcGIgPD0gMCkgPyBhIDogYjsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgQXZlcmFnZTJfbTEyOGkoY29uc3QgX19tMTI4aSogY29uc3QgYTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBhMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IGF2ZykgeworICAvLyAoYSArIGIpID4+IDEgPSAoKGEgKyBiICsgMSkgPj4gMSkgLSAoKGEgXiBiKSAmIDEpCisgIGNvbnN0IF9fbTEyOGkgb25lcyA9IF9tbV9zZXQxX2VwaTgoMSk7CisgIGNvbnN0IF9fbTEyOGkgYXZnMSA9IF9tbV9hdmdfZXB1OCgqYTAsICphMSk7CisgIGNvbnN0IF9fbTEyOGkgb25lID0gX21tX2FuZF9zaTEyOChfbW1feG9yX3NpMTI4KCphMCwgKmExKSwgb25lcyk7CisgICphdmcgPSBfbW1fc3ViX2VwaTgoYXZnMSwgb25lKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgQXZlcmFnZTJfdWludDMyX1NTRTIoY29uc3QgdWludDMyX3QgYTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBhMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IGF2ZykgeworICAvLyAoYSArIGIpID4+IDEgPSAoKGEgKyBiICsgMSkgPj4gMSkgLSAoKGEgXiBiKSAmIDEpCisgIGNvbnN0IF9fbTEyOGkgb25lcyA9IF9tbV9zZXQxX2VwaTgoMSk7CisgIGNvbnN0IF9fbTEyOGkgQTAgPSBfbW1fY3Z0c2kzMl9zaTEyOChhMCk7CisgIGNvbnN0IF9fbTEyOGkgQTEgPSBfbW1fY3Z0c2kzMl9zaTEyOChhMSk7CisgIGNvbnN0IF9fbTEyOGkgYXZnMSA9IF9tbV9hdmdfZXB1OChBMCwgQTEpOworICBjb25zdCBfX20xMjhpIG9uZSA9IF9tbV9hbmRfc2kxMjgoX21tX3hvcl9zaTEyOChBMCwgQTEpLCBvbmVzKTsKKyAgKmF2ZyA9IF9tbV9zdWJfZXBpOChhdmcxLCBvbmUpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgX19tMTI4aSBBdmVyYWdlMl91aW50MzJfMTZfU1NFMih1aW50MzJfdCBhMCwgdWludDMyX3QgYTEpIHsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgY29uc3QgX19tMTI4aSBBMCA9IF9tbV91bnBhY2tsb19lcGk4KF9tbV9jdnRzaTMyX3NpMTI4KGEwKSwgemVybyk7CisgIGNvbnN0IF9fbTEyOGkgQTEgPSBfbW1fdW5wYWNrbG9fZXBpOChfbW1fY3Z0c2kzMl9zaTEyOChhMSksIHplcm8pOworICBjb25zdCBfX20xMjhpIHN1bSA9IF9tbV9hZGRfZXBpMTYoQTEsIEEwKTsKKyAgcmV0dXJuIF9tbV9zcmxpX2VwaTE2KHN1bSwgMSk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBBdmVyYWdlMl9TU0UyKHVpbnQzMl90IGEwLCB1aW50MzJfdCBhMSkgeworICBfX20xMjhpIG91dHB1dDsKKyAgQXZlcmFnZTJfdWludDMyX1NTRTIoYTAsIGExLCAmb3V0cHV0KTsKKyAgcmV0dXJuIF9tbV9jdnRzaTEyOF9zaTMyKG91dHB1dCk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBBdmVyYWdlM19TU0UyKHVpbnQzMl90IGEwLCB1aW50MzJfdCBhMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGEyKSB7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGNvbnN0IF9fbTEyOGkgYXZnMSA9IEF2ZXJhZ2UyX3VpbnQzMl8xNl9TU0UyKGEwLCBhMik7CisgIGNvbnN0IF9fbTEyOGkgQTEgPSBfbW1fdW5wYWNrbG9fZXBpOChfbW1fY3Z0c2kzMl9zaTEyOChhMSksIHplcm8pOworICBjb25zdCBfX20xMjhpIHN1bSA9IF9tbV9hZGRfZXBpMTYoYXZnMSwgQTEpOworICBjb25zdCBfX20xMjhpIGF2ZzIgPSBfbW1fc3JsaV9lcGkxNihzdW0sIDEpOworICBjb25zdCBfX20xMjhpIEEyID0gX21tX3BhY2t1c19lcGkxNihhdmcyLCBhdmcyKTsKKyAgY29uc3QgdWludDMyX3Qgb3V0cHV0ID0gX21tX2N2dHNpMTI4X3NpMzIoQTIpOworICByZXR1cm4gb3V0cHV0OworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQXZlcmFnZTRfU1NFMih1aW50MzJfdCBhMCwgdWludDMyX3QgYTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhMiwgdWludDMyX3QgYTMpIHsKKyAgY29uc3QgX19tMTI4aSBhdmcxID0gQXZlcmFnZTJfdWludDMyXzE2X1NTRTIoYTAsIGExKTsKKyAgY29uc3QgX19tMTI4aSBhdmcyID0gQXZlcmFnZTJfdWludDMyXzE2X1NTRTIoYTIsIGEzKTsKKyAgY29uc3QgX19tMTI4aSBzdW0gPSBfbW1fYWRkX2VwaTE2KGF2ZzIsIGF2ZzEpOworICBjb25zdCBfX20xMjhpIGF2ZzMgPSBfbW1fc3JsaV9lcGkxNihzdW0sIDEpOworICBjb25zdCBfX20xMjhpIEEwID0gX21tX3BhY2t1c19lcGkxNihhdmczLCBhdmczKTsKKyAgY29uc3QgdWludDMyX3Qgb3V0cHV0ID0gX21tX2N2dHNpMTI4X3NpMzIoQTApOworICByZXR1cm4gb3V0cHV0OworfQorCitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yNV9TU0UyKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgY29uc3QgdWludDMyX3QgcHJlZCA9IEF2ZXJhZ2UzX1NTRTIobGVmdCwgdG9wWzBdLCB0b3BbMV0pOworICByZXR1cm4gcHJlZDsKK30KK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3I2X1NTRTIodWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICBjb25zdCB1aW50MzJfdCBwcmVkID0gQXZlcmFnZTJfU1NFMihsZWZ0LCB0b3BbLTFdKTsKKyAgcmV0dXJuIHByZWQ7Cit9CitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yN19TU0UyKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgY29uc3QgdWludDMyX3QgcHJlZCA9IEF2ZXJhZ2UyX1NTRTIobGVmdCwgdG9wWzBdKTsKKyAgcmV0dXJuIHByZWQ7Cit9CitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yOF9TU0UyKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgY29uc3QgdWludDMyX3QgcHJlZCA9IEF2ZXJhZ2UyX1NTRTIodG9wWy0xXSwgdG9wWzBdKTsKKyAgKHZvaWQpbGVmdDsKKyAgcmV0dXJuIHByZWQ7Cit9CitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yOV9TU0UyKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgY29uc3QgdWludDMyX3QgcHJlZCA9IEF2ZXJhZ2UyX1NTRTIodG9wWzBdLCB0b3BbMV0pOworICAodm9pZClsZWZ0OworICByZXR1cm4gcHJlZDsKK30KK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3IxMF9TU0UyKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgY29uc3QgdWludDMyX3QgcHJlZCA9IEF2ZXJhZ2U0X1NTRTIobGVmdCwgdG9wWy0xXSwgdG9wWzBdLCB0b3BbMV0pOworICByZXR1cm4gcHJlZDsKK30KK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3IxMV9TU0UyKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgY29uc3QgdWludDMyX3QgcHJlZCA9IFNlbGVjdF9TU0UyKHRvcFswXSwgbGVmdCwgdG9wWy0xXSk7CisgIHJldHVybiBwcmVkOworfQorc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjEyX1NTRTIodWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICBjb25zdCB1aW50MzJfdCBwcmVkID0gQ2xhbXBlZEFkZFN1YnRyYWN0RnVsbF9TU0UyKGxlZnQsIHRvcFswXSwgdG9wWy0xXSk7CisgIHJldHVybiBwcmVkOworfQorc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjEzX1NTRTIodWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICBjb25zdCB1aW50MzJfdCBwcmVkID0gQ2xhbXBlZEFkZFN1YnRyYWN0SGFsZl9TU0UyKGxlZnQsIHRvcFswXSwgdG9wWy0xXSk7CisgIHJldHVybiBwcmVkOworfQorCisvLyBCYXRjaCB2ZXJzaW9ucyBvZiB0aG9zZSBmdW5jdGlvbnMuCisKKy8vIFByZWRpY3RvcjA6IEFSR0JfQkxBQ0suCitzdGF0aWMgdm9pZCBQcmVkaWN0b3JBZGQwX1NTRTIoY29uc3QgdWludDMyX3QqIGluLCBjb25zdCB1aW50MzJfdCogdXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQzMl90KiBvdXQpIHsKKyAgaW50IGk7CisgIGNvbnN0IF9fbTEyOGkgYmxhY2sgPSBfbW1fc2V0MV9lcGkzMihBUkdCX0JMQUNLKTsKKyAgZm9yIChpID0gMDsgaSArIDQgPD0gbnVtX3BpeGVsczsgaSArPSA0KSB7CisgICAgY29uc3QgX19tMTI4aSBzcmMgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZpbltpXSk7CisgICAgY29uc3QgX19tMTI4aSByZXMgPSBfbW1fYWRkX2VwaTgoc3JjLCBibGFjayk7CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJm91dFtpXSwgcmVzKTsKKyAgfQorICBpZiAoaSAhPSBudW1fcGl4ZWxzKSB7CisgICAgVlA4TFByZWRpY3RvcnNBZGRfQ1swXShpbiArIGksIHVwcGVyICsgaSwgbnVtX3BpeGVscyAtIGksIG91dCArIGkpOworICB9Cit9CisKKy8vIFByZWRpY3RvcjE6IGxlZnQuCitzdGF0aWMgdm9pZCBQcmVkaWN0b3JBZGQxX1NTRTIoY29uc3QgdWludDMyX3QqIGluLCBjb25zdCB1aW50MzJfdCogdXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQzMl90KiBvdXQpIHsKKyAgaW50IGk7CisgIF9fbTEyOGkgcHJldiA9IF9tbV9zZXQxX2VwaTMyKG91dFstMV0pOworICBmb3IgKGkgPSAwOyBpICsgNCA8PSBudW1fcGl4ZWxzOyBpICs9IDQpIHsKKyAgICAvLyBhIHwgYiB8IGMgfCBkCisgICAgY29uc3QgX19tMTI4aSBzcmMgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZpbltpXSk7CisgICAgLy8gMCB8IGEgfCBiIHwgYworICAgIGNvbnN0IF9fbTEyOGkgc2hpZnQwID0gX21tX3NsbGlfc2kxMjgoc3JjLCA0KTsKKyAgICAvLyBhIHwgYSArIGIgfCBiICsgYyB8IGMgKyBkCisgICAgY29uc3QgX19tMTI4aSBzdW0wID0gX21tX2FkZF9lcGk4KHNyYywgc2hpZnQwKTsKKyAgICAvLyAwIHwgMCB8IGEgfCBhICsgYgorICAgIGNvbnN0IF9fbTEyOGkgc2hpZnQxID0gX21tX3NsbGlfc2kxMjgoc3VtMCwgOCk7CisgICAgLy8gYSB8IGEgKyBiIHwgYSArIGIgKyBjIHwgYSArIGIgKyBjICsgZAorICAgIGNvbnN0IF9fbTEyOGkgc3VtMSA9IF9tbV9hZGRfZXBpOChzdW0wLCBzaGlmdDEpOworICAgIGNvbnN0IF9fbTEyOGkgcmVzID0gX21tX2FkZF9lcGk4KHN1bTEsIHByZXYpOworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbaV0sIHJlcyk7CisgICAgLy8gcmVwbGljYXRlIHByZXYgb3V0cHV0IG9uIHRoZSBmb3VyIGxhbmVzCisgICAgcHJldiA9IF9tbV9zaHVmZmxlX2VwaTMyKHJlcywgKDMgPDwgMCkgfCAoMyA8PCAyKSB8ICgzIDw8IDQpIHwgKDMgPDwgNikpOworICB9CisgIGlmIChpICE9IG51bV9waXhlbHMpIHsKKyAgICBWUDhMUHJlZGljdG9yc0FkZF9DWzFdKGluICsgaSwgdXBwZXIgKyBpLCBudW1fcGl4ZWxzIC0gaSwgb3V0ICsgaSk7CisgIH0KK30KKworLy8gTWFjcm8gdGhhdCBhZGRzIDMyLWJpdCBpbnRlZ2VycyBmcm9tIElOIHVzaW5nIG1vZCAyNTYgYXJpdGhtZXRpYworLy8gcGVyIDggYml0IGNoYW5uZWwuCisjZGVmaW5lIEdFTkVSQVRFX1BSRURJQ1RPUl8xKFgsIElOKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBQcmVkaWN0b3JBZGQjI1gjI19TU0UyKGNvbnN0IHVpbnQzMl90KiBpbiwgY29uc3QgdWludDMyX3QqIHVwcGVyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQzMl90KiBvdXQpIHsgICAgICAgICAgICBcCisgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZvciAoaSA9IDA7IGkgKyA0IDw9IG51bV9waXhlbHM7IGkgKz0gNCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgX19tMTI4aSBzcmMgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZpbltpXSk7ICAgICAgICAgICAgICBcCisgICAgY29uc3QgX19tMTI4aSBvdGhlciA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJihJTikpOyAgICAgICAgICAgICBcCisgICAgY29uc3QgX19tMTI4aSByZXMgPSBfbW1fYWRkX2VwaTgoc3JjLCBvdGhlcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJm91dFtpXSwgcmVzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChpICE9IG51bV9waXhlbHMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVlA4TFByZWRpY3RvcnNBZGRfQ1soWCldKGluICsgaSwgdXBwZXIgKyBpLCBudW1fcGl4ZWxzIC0gaSwgb3V0ICsgaSk7ICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vIFByZWRpY3RvcjI6IFRvcC4KK0dFTkVSQVRFX1BSRURJQ1RPUl8xKDIsIHVwcGVyW2ldKQorLy8gUHJlZGljdG9yMzogVG9wLXJpZ2h0LgorR0VORVJBVEVfUFJFRElDVE9SXzEoMywgdXBwZXJbaSArIDFdKQorLy8gUHJlZGljdG9yNDogVG9wLWxlZnQuCitHRU5FUkFURV9QUkVESUNUT1JfMSg0LCB1cHBlcltpIC0gMV0pCisjdW5kZWYgR0VORVJBVEVfUFJFRElDVE9SXzEKKworLy8gRHVlIHRvIGF2ZXJhZ2VzIHdpdGggaW50ZWdlcnMsIHZhbHVlcyBjYW5ub3QgYmUgYWNjdW11bGF0ZWQgaW4gcGFyYWxsZWwgZm9yCisvLyBwcmVkaWN0b3JzIDUgdG8gNy4KK0dFTkVSQVRFX1BSRURJQ1RPUl9BREQoUHJlZGljdG9yNV9TU0UyLCBQcmVkaWN0b3JBZGQ1X1NTRTIpCitHRU5FUkFURV9QUkVESUNUT1JfQUREKFByZWRpY3RvcjZfU1NFMiwgUHJlZGljdG9yQWRkNl9TU0UyKQorR0VORVJBVEVfUFJFRElDVE9SX0FERChQcmVkaWN0b3I3X1NTRTIsIFByZWRpY3RvckFkZDdfU1NFMikKKworI2RlZmluZSBHRU5FUkFURV9QUkVESUNUT1JfMihYLCBJTikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgUHJlZGljdG9yQWRkIyNYIyNfU1NFMihjb25zdCB1aW50MzJfdCogaW4sIGNvbnN0IHVpbnQzMl90KiB1cHBlciwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDMyX3QqIG91dCkgeyAgICAgICAgICAgXAorICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKGkgPSAwOyBpICsgNCA8PSBudW1fcGl4ZWxzOyBpICs9IDQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IF9fbTEyOGkgVG90aGVyID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmKElOKSk7ICAgICAgICAgICAgXAorICAgIGNvbnN0IF9fbTEyOGkgVCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnVwcGVyW2ldKTsgICAgICAgICAgICAgXAorICAgIGNvbnN0IF9fbTEyOGkgc3JjID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmaW5baV0pOyAgICAgICAgICAgICAgXAorICAgIF9fbTEyOGkgYXZnLCByZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEF2ZXJhZ2UyX20xMjhpKCZULCAmVG90aGVyLCAmYXZnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJlcyA9IF9tbV9hZGRfZXBpOChhdmcsIHNyYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbaV0sIHJlcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoaSAhPSBudW1fcGl4ZWxzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFZQOExQcmVkaWN0b3JzQWRkX0NbKFgpXShpbiArIGksIHVwcGVyICsgaSwgbnVtX3BpeGVscyAtIGksIG91dCArIGkpOyAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorLy8gUHJlZGljdG9yODogYXZlcmFnZSBUTCBULgorR0VORVJBVEVfUFJFRElDVE9SXzIoOCwgdXBwZXJbaSAtIDFdKQorLy8gUHJlZGljdG9yOTogYXZlcmFnZSBUIFRSLgorR0VORVJBVEVfUFJFRElDVE9SXzIoOSwgdXBwZXJbaSArIDFdKQorI3VuZGVmIEdFTkVSQVRFX1BSRURJQ1RPUl8yCisKKy8vIFByZWRpY3RvcjEwOiBhdmVyYWdlIG9mIChhdmVyYWdlIG9mIChMLFRMKSwgYXZlcmFnZSBvZiAoVCwgVFIpKS4KKyNkZWZpbmUgRE9fUFJFRDEwKE9VVCkgZG8geyAgICAgICAgICAgICAgIFwKKyAgX19tMTI4aSBhdmdMVEwsIGF2ZzsgICAgICAgICAgICAgICAgICAgIFwKKyAgQXZlcmFnZTJfbTEyOGkoJkwsICZUTCwgJmF2Z0xUTCk7ICAgICAgIFwKKyAgQXZlcmFnZTJfbTEyOGkoJmF2Z1RUUiwgJmF2Z0xUTCwgJmF2Zyk7IFwKKyAgTCA9IF9tbV9hZGRfZXBpOChhdmcsIHNyYyk7ICAgICAgICAgICAgIFwKKyAgb3V0W2kgKyAoT1VUKV0gPSBfbW1fY3Z0c2kxMjhfc2kzMihMKTsgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgRE9fUFJFRDEwX1NISUZUIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAvKiBSb3RhdGUgdGhlIHByZS1jb21wdXRlZCB2YWx1ZXMgZm9yIHRoZSBuZXh0IGl0ZXJhdGlvbi4qLyBcCisgIGF2Z1RUUiA9IF9tbV9zcmxpX3NpMTI4KGF2Z1RUUiwgNCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVEwgPSBfbW1fc3JsaV9zaTEyOChUTCwgNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzcmMgPSBfbW1fc3JsaV9zaTEyOChzcmMsIDQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBQcmVkaWN0b3JBZGQxMF9TU0UyKGNvbnN0IHVpbnQzMl90KiBpbiwgY29uc3QgdWludDMyX3QqIHVwcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDMyX3QqIG91dCkgeworICBpbnQgaTsKKyAgX19tMTI4aSBMID0gX21tX2N2dHNpMzJfc2kxMjgob3V0Wy0xXSk7CisgIGZvciAoaSA9IDA7IGkgKyA0IDw9IG51bV9waXhlbHM7IGkgKz0gNCkgeworICAgIF9fbTEyOGkgc3JjID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmaW5baV0pOworICAgIF9fbTEyOGkgVEwgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZ1cHBlcltpIC0gMV0pOworICAgIGNvbnN0IF9fbTEyOGkgVCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnVwcGVyW2ldKTsKKyAgICBjb25zdCBfX20xMjhpIFRSID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmdXBwZXJbaSArIDFdKTsKKyAgICBfX20xMjhpIGF2Z1RUUjsKKyAgICBBdmVyYWdlMl9tMTI4aSgmVCwgJlRSLCAmYXZnVFRSKTsKKyAgICBET19QUkVEMTAoMCk7CisgICAgRE9fUFJFRDEwX1NISUZUOworICAgIERPX1BSRUQxMCgxKTsKKyAgICBET19QUkVEMTBfU0hJRlQ7CisgICAgRE9fUFJFRDEwKDIpOworICAgIERPX1BSRUQxMF9TSElGVDsKKyAgICBET19QUkVEMTAoMyk7CisgIH0KKyAgaWYgKGkgIT0gbnVtX3BpeGVscykgeworICAgIFZQOExQcmVkaWN0b3JzQWRkX0NbMTBdKGluICsgaSwgdXBwZXIgKyBpLCBudW1fcGl4ZWxzIC0gaSwgb3V0ICsgaSk7CisgIH0KK30KKyN1bmRlZiBET19QUkVEMTAKKyN1bmRlZiBET19QUkVEMTBfU0hJRlQKKworLy8gUHJlZGljdG9yMTE6IHNlbGVjdC4KKyNkZWZpbmUgRE9fUFJFRDExKE9VVCkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIExfbG8gPSBfbW1fdW5wYWNrbG9fZXBpMzIoTCwgVCk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgVExfbG8gPSBfbW1fdW5wYWNrbG9fZXBpMzIoVEwsIFQpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBwYiA9IF9tbV9zYWRfZXB1OChMX2xvLCBUTF9sbyk7IC8qIHBiID0gc3VtIHxMLVRMfCovICAgXAorICBjb25zdCBfX20xMjhpIG1hc2sgPSBfbW1fY21wZ3RfZXBpMzIocGIsIHBhKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgQSA9IF9tbV9hbmRfc2kxMjgobWFzaywgTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBCID0gX21tX2FuZG5vdF9zaTEyOChtYXNrLCBUKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIHByZWQgPSBfbW1fb3Jfc2kxMjgoQSwgQik7IC8qIHByZWQgPSAocGEgPiBiKT8gTCA6IFQqLyBcCisgIEwgPSBfbW1fYWRkX2VwaTgoc3JjLCBwcmVkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgb3V0W2kgKyAoT1VUKV0gPSBfbW1fY3Z0c2kxMjhfc2kzMihMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBET19QUkVEMTFfU0hJRlQgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAvKiBTaGlmdCB0aGUgcHJlLWNvbXB1dGVkIHZhbHVlIGZvciB0aGUgbmV4dCBpdGVyYXRpb24uKi8gXAorICBUID0gX21tX3NybGlfc2kxMjgoVCwgNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUTCA9IF9tbV9zcmxpX3NpMTI4KFRMLCA0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzcmMgPSBfbW1fc3JsaV9zaTEyOChzcmMsIDQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBwYSA9IF9tbV9zcmxpX3NpMTI4KHBhLCA0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgUHJlZGljdG9yQWRkMTFfU1NFMihjb25zdCB1aW50MzJfdCogaW4sIGNvbnN0IHVpbnQzMl90KiB1cHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQzMl90KiBvdXQpIHsKKyAgaW50IGk7CisgIF9fbTEyOGkgcGE7CisgIF9fbTEyOGkgTCA9IF9tbV9jdnRzaTMyX3NpMTI4KG91dFstMV0pOworICBmb3IgKGkgPSAwOyBpICsgNCA8PSBudW1fcGl4ZWxzOyBpICs9IDQpIHsKKyAgICBfX20xMjhpIFQgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZ1cHBlcltpXSk7CisgICAgX19tMTI4aSBUTCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnVwcGVyW2kgLSAxXSk7CisgICAgX19tMTI4aSBzcmMgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZpbltpXSk7CisgICAgeworICAgICAgLy8gV2UgY2FuIHVucGFjayB3aXRoIGFueSB2YWx1ZSBvbiB0aGUgdXBwZXIgMzIgYml0cywgcHJvdmlkZWQgaXQncyB0aGUKKyAgICAgIC8vIHNhbWUgb24gYm90aCBvcGVyYW5kcyAoc28gdGhhdCB0aGVpciBzdW0gb2YgYWJzIGRpZmYgaXMgemVybykuIEhlcmUgd2UKKyAgICAgIC8vIHVzZSBULgorICAgICAgY29uc3QgX19tMTI4aSBUX2xvID0gX21tX3VucGFja2xvX2VwaTMyKFQsIFQpOworICAgICAgY29uc3QgX19tMTI4aSBUTF9sbyA9IF9tbV91bnBhY2tsb19lcGkzMihUTCwgVCk7CisgICAgICBjb25zdCBfX20xMjhpIFRfaGkgPSBfbW1fdW5wYWNraGlfZXBpMzIoVCwgVCk7CisgICAgICBjb25zdCBfX20xMjhpIFRMX2hpID0gX21tX3VucGFja2hpX2VwaTMyKFRMLCBUKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgc19sbyA9IF9tbV9zYWRfZXB1OChUX2xvLCBUTF9sbyk7CisgICAgICBjb25zdCBfX20xMjhpIHNfaGkgPSBfbW1fc2FkX2VwdTgoVF9oaSwgVExfaGkpOworICAgICAgcGEgPSBfbW1fcGFja3NfZXBpMzIoc19sbywgc19oaSk7ICAvLyBwYSA9IHN1bSB8VC1UTHwKKyAgICB9CisgICAgRE9fUFJFRDExKDApOworICAgIERPX1BSRUQxMV9TSElGVDsKKyAgICBET19QUkVEMTEoMSk7CisgICAgRE9fUFJFRDExX1NISUZUOworICAgIERPX1BSRUQxMSgyKTsKKyAgICBET19QUkVEMTFfU0hJRlQ7CisgICAgRE9fUFJFRDExKDMpOworICB9CisgIGlmIChpICE9IG51bV9waXhlbHMpIHsKKyAgICBWUDhMUHJlZGljdG9yc0FkZF9DWzExXShpbiArIGksIHVwcGVyICsgaSwgbnVtX3BpeGVscyAtIGksIG91dCArIGkpOworICB9Cit9CisjdW5kZWYgRE9fUFJFRDExCisjdW5kZWYgRE9fUFJFRDExX1NISUZUCisKKy8vIFByZWRpY3RvcjEyOiBDbGFtcGVkQWRkU3VidHJhY3RGdWxsLgorI2RlZmluZSBET19QUkVEMTIoRElGRiwgTEFORSwgT1VUKSBkbyB7ICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIGFsbCA9IF9tbV9hZGRfZXBpMTYoTCwgKERJRkYpKTsgICAgXAorICBjb25zdCBfX20xMjhpIGFsbHMgPSBfbW1fcGFja3VzX2VwaTE2KGFsbCwgYWxsKTsgXAorICBjb25zdCBfX20xMjhpIHJlcyA9IF9tbV9hZGRfZXBpOChzcmMsIGFsbHMpOyAgICAgXAorICBvdXRbaSArIChPVVQpXSA9IF9tbV9jdnRzaTEyOF9zaTMyKHJlcyk7ICAgICAgICAgXAorICBMID0gX21tX3VucGFja2xvX2VwaTgocmVzLCB6ZXJvKTsgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBET19QUkVEMTJfU0hJRlQoRElGRiwgTEFORSkgZG8geyAgICAgICAgICAgICAgICAgICAgXAorICAvKiBTaGlmdCB0aGUgcHJlLWNvbXB1dGVkIHZhbHVlIGZvciB0aGUgbmV4dCBpdGVyYXRpb24uKi8gXAorICBpZiAoKExBTkUpID09IDApIChESUZGKSA9IF9tbV9zcmxpX3NpMTI4KChESUZGKSwgOCk7ICAgICAgXAorICBzcmMgPSBfbW1fc3JsaV9zaTEyOChzcmMsIDQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgUHJlZGljdG9yQWRkMTJfU1NFMihjb25zdCB1aW50MzJfdCogaW4sIGNvbnN0IHVpbnQzMl90KiB1cHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQzMl90KiBvdXQpIHsKKyAgaW50IGk7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGNvbnN0IF9fbTEyOGkgTDggPSBfbW1fY3Z0c2kzMl9zaTEyOChvdXRbLTFdKTsKKyAgX19tMTI4aSBMID0gX21tX3VucGFja2xvX2VwaTgoTDgsIHplcm8pOworICBmb3IgKGkgPSAwOyBpICsgNCA8PSBudW1fcGl4ZWxzOyBpICs9IDQpIHsKKyAgICAvLyBMb2FkIDQgcGl4ZWxzIGF0IGEgdGltZS4KKyAgICBfX20xMjhpIHNyYyA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmluW2ldKTsKKyAgICBjb25zdCBfX20xMjhpIFQgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZ1cHBlcltpXSk7CisgICAgY29uc3QgX19tMTI4aSBUX2xvID0gX21tX3VucGFja2xvX2VwaTgoVCwgemVybyk7CisgICAgY29uc3QgX19tMTI4aSBUX2hpID0gX21tX3VucGFja2hpX2VwaTgoVCwgemVybyk7CisgICAgY29uc3QgX19tMTI4aSBUTCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnVwcGVyW2kgLSAxXSk7CisgICAgY29uc3QgX19tMTI4aSBUTF9sbyA9IF9tbV91bnBhY2tsb19lcGk4KFRMLCB6ZXJvKTsKKyAgICBjb25zdCBfX20xMjhpIFRMX2hpID0gX21tX3VucGFja2hpX2VwaTgoVEwsIHplcm8pOworICAgIF9fbTEyOGkgZGlmZl9sbyA9IF9tbV9zdWJfZXBpMTYoVF9sbywgVExfbG8pOworICAgIF9fbTEyOGkgZGlmZl9oaSA9IF9tbV9zdWJfZXBpMTYoVF9oaSwgVExfaGkpOworICAgIERPX1BSRUQxMihkaWZmX2xvLCAwLCAwKTsKKyAgICBET19QUkVEMTJfU0hJRlQoZGlmZl9sbywgMCk7CisgICAgRE9fUFJFRDEyKGRpZmZfbG8sIDEsIDEpOworICAgIERPX1BSRUQxMl9TSElGVChkaWZmX2xvLCAxKTsKKyAgICBET19QUkVEMTIoZGlmZl9oaSwgMCwgMik7CisgICAgRE9fUFJFRDEyX1NISUZUKGRpZmZfaGksIDApOworICAgIERPX1BSRUQxMihkaWZmX2hpLCAxLCAzKTsKKyAgfQorICBpZiAoaSAhPSBudW1fcGl4ZWxzKSB7CisgICAgVlA4TFByZWRpY3RvcnNBZGRfQ1sxMl0oaW4gKyBpLCB1cHBlciArIGksIG51bV9waXhlbHMgLSBpLCBvdXQgKyBpKTsKKyAgfQorfQorI3VuZGVmIERPX1BSRUQxMgorI3VuZGVmIERPX1BSRUQxMl9TSElGVAorCisvLyBEdWUgdG8gYXZlcmFnZXMgd2l0aCBpbnRlZ2VycywgdmFsdWVzIGNhbm5vdCBiZSBhY2N1bXVsYXRlZCBpbiBwYXJhbGxlbCBmb3IKKy8vIHByZWRpY3RvcnMgMTMuCitHRU5FUkFURV9QUkVESUNUT1JfQUREKFByZWRpY3RvcjEzX1NTRTIsIFByZWRpY3RvckFkZDEzX1NTRTIpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTdWJ0cmFjdC1HcmVlbiBUcmFuc2Zvcm0KKworc3RhdGljIHZvaWQgQWRkR3JlZW5Ub0JsdWVBbmRSZWRfU1NFMihjb25zdCB1aW50MzJfdCogY29uc3Qgc3JjLCBpbnQgbnVtX3BpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGRzdCkgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSArIDQgPD0gbnVtX3BpeGVsczsgaSArPSA0KSB7CisgICAgY29uc3QgX19tMTI4aSBpbiA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnNyY1tpXSk7IC8vIGFyZ2IKKyAgICBjb25zdCBfX20xMjhpIEEgPSBfbW1fc3JsaV9lcGkxNihpbiwgOCk7ICAgICAvLyAwIGEgMCBnCisgICAgY29uc3QgX19tMTI4aSBCID0gX21tX3NodWZmbGVsb19lcGkxNihBLCBfTU1fU0hVRkZMRSgyLCAyLCAwLCAwKSk7CisgICAgY29uc3QgX19tMTI4aSBDID0gX21tX3NodWZmbGVoaV9lcGkxNihCLCBfTU1fU0hVRkZMRSgyLCAyLCAwLCAwKSk7ICAvLyAwZzBnCisgICAgY29uc3QgX19tMTI4aSBvdXQgPSBfbW1fYWRkX2VwaTgoaW4sIEMpOworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZkc3RbaV0sIG91dCk7CisgIH0KKyAgLy8gZmFsbHRocm91Z2ggYW5kIGZpbmlzaCBvZmYgd2l0aCBwbGFpbi1DCisgIGlmIChpICE9IG51bV9waXhlbHMpIHsKKyAgICBWUDhMQWRkR3JlZW5Ub0JsdWVBbmRSZWRfQyhzcmMgKyBpLCBudW1fcGl4ZWxzIC0gaSwgZHN0ICsgaSk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvbG9yIFRyYW5zZm9ybQorCitzdGF0aWMgdm9pZCBUcmFuc2Zvcm1Db2xvckludmVyc2VfU1NFMihjb25zdCBWUDhMTXVsdGlwbGllcnMqIGNvbnN0IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3Qgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQzMl90KiBkc3QpIHsKKy8vIHNpZ24tZXh0ZW5kZWQgbXVsdGlwbHlpbmcgY29uc3RhbnRzLCBwcmUtc2hpZnRlZCBieSA1LgorI2RlZmluZSBDU1QoWCkgICgoKGludDE2X3QpKG0tPlggPDwgOCkpID4+IDUpICAgLy8gc2lnbi1leHRlbmQKKyNkZWZpbmUgTUtfQ1NUXzE2KEhJLCBMTykgXAorICBfbW1fc2V0MV9lcGkzMigoaW50KSgoKHVpbnQzMl90KShISSkgPDwgMTYpIHwgKChMTykgJiAweGZmZmYpKSkKKyAgY29uc3QgX19tMTI4aSBtdWx0c19yYiA9IE1LX0NTVF8xNihDU1QoZ3JlZW5fdG9fcmVkXyksIENTVChncmVlbl90b19ibHVlXykpOworICBjb25zdCBfX20xMjhpIG11bHRzX2IyID0gTUtfQ1NUXzE2KENTVChyZWRfdG9fYmx1ZV8pLCAwKTsKKyN1bmRlZiBNS19DU1RfMTYKKyN1bmRlZiBDU1QKKyAgY29uc3QgX19tMTI4aSBtYXNrX2FnID0gX21tX3NldDFfZXBpMzIoMHhmZjAwZmYwMCk7ICAvLyBhbHBoYS1ncmVlbiBtYXNrcworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSArIDQgPD0gbnVtX3BpeGVsczsgaSArPSA0KSB7CisgICAgY29uc3QgX19tMTI4aSBpbiA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnNyY1tpXSk7IC8vIGFyZ2IKKyAgICBjb25zdCBfX20xMjhpIEEgPSBfbW1fYW5kX3NpMTI4KGluLCBtYXNrX2FnKTsgICAgIC8vIGEgICAwICAgZyAgIDAKKyAgICBjb25zdCBfX20xMjhpIEIgPSBfbW1fc2h1ZmZsZWxvX2VwaTE2KEEsIF9NTV9TSFVGRkxFKDIsIDIsIDAsIDApKTsKKyAgICBjb25zdCBfX20xMjhpIEMgPSBfbW1fc2h1ZmZsZWhpX2VwaTE2KEIsIF9NTV9TSFVGRkxFKDIsIDIsIDAsIDApKTsgIC8vIGcwZzAKKyAgICBjb25zdCBfX20xMjhpIEQgPSBfbW1fbXVsaGlfZXBpMTYoQywgbXVsdHNfcmIpOyAgICAvLyB4IGRyICB4IGRiMQorICAgIGNvbnN0IF9fbTEyOGkgRSA9IF9tbV9hZGRfZXBpOChpbiwgRCk7ICAgICAgICAgICAgIC8vIHggcicgIHggICBiJworICAgIGNvbnN0IF9fbTEyOGkgRiA9IF9tbV9zbGxpX2VwaTE2KEUsIDgpOyAgICAgICAgICAgIC8vIHInIDAgICBiJyAwCisgICAgY29uc3QgX19tMTI4aSBHID0gX21tX211bGhpX2VwaTE2KEYsIG11bHRzX2IyKTsgICAgLy8geCBkYjIgIDAgIDAKKyAgICBjb25zdCBfX20xMjhpIEggPSBfbW1fc3JsaV9lcGkzMihHLCA4KTsgICAgICAgICAgICAvLyAwICB4IGRiMiAgMAorICAgIGNvbnN0IF9fbTEyOGkgSSA9IF9tbV9hZGRfZXBpOChILCBGKTsgICAgICAgICAgICAgIC8vIHInIHggIGInJyAwCisgICAgY29uc3QgX19tMTI4aSBKID0gX21tX3NybGlfZXBpMTYoSSwgOCk7ICAgICAgICAgICAgLy8gMCAgcicgIDAgIGInJworICAgIGNvbnN0IF9fbTEyOGkgb3V0ID0gX21tX29yX3NpMTI4KEosIEEpOworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZkc3RbaV0sIG91dCk7CisgIH0KKyAgLy8gRmFsbC1iYWNrIHRvIEMtdmVyc2lvbiBmb3IgbGVmdC1vdmVycy4KKyAgaWYgKGkgIT0gbnVtX3BpeGVscykgeworICAgIFZQOExUcmFuc2Zvcm1Db2xvckludmVyc2VfQyhtLCBzcmMgKyBpLCBudW1fcGl4ZWxzIC0gaSwgZHN0ICsgaSk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvbG9yLXNwYWNlIGNvbnZlcnNpb24gZnVuY3Rpb25zCisKK3N0YXRpYyB2b2lkIENvbnZlcnRCR1JBVG9SR0JfU1NFMihjb25zdCB1aW50MzJfdCogc3JjLCBpbnQgbnVtX3BpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QpIHsKKyAgY29uc3QgX19tMTI4aSogaW4gPSAoY29uc3QgX19tMTI4aSopc3JjOworICBfX20xMjhpKiBvdXQgPSAoX19tMTI4aSopZHN0OworCisgIHdoaWxlIChudW1fcGl4ZWxzID49IDMyKSB7CisgICAgLy8gTG9hZCB0aGUgQkdSQSBidWZmZXJzLgorICAgIF9fbTEyOGkgaW4wID0gX21tX2xvYWR1X3NpMTI4KGluICsgMCk7CisgICAgX19tMTI4aSBpbjEgPSBfbW1fbG9hZHVfc2kxMjgoaW4gKyAxKTsKKyAgICBfX20xMjhpIGluMiA9IF9tbV9sb2FkdV9zaTEyOChpbiArIDIpOworICAgIF9fbTEyOGkgaW4zID0gX21tX2xvYWR1X3NpMTI4KGluICsgMyk7CisgICAgX19tMTI4aSBpbjQgPSBfbW1fbG9hZHVfc2kxMjgoaW4gKyA0KTsKKyAgICBfX20xMjhpIGluNSA9IF9tbV9sb2FkdV9zaTEyOChpbiArIDUpOworICAgIF9fbTEyOGkgaW42ID0gX21tX2xvYWR1X3NpMTI4KGluICsgNik7CisgICAgX19tMTI4aSBpbjcgPSBfbW1fbG9hZHVfc2kxMjgoaW4gKyA3KTsKKyAgICBWUDhMMzJiVG9QbGFuYXJfU1NFMigmaW4wLCAmaW4xLCAmaW4yLCAmaW4zKTsKKyAgICBWUDhMMzJiVG9QbGFuYXJfU1NFMigmaW40LCAmaW41LCAmaW42LCAmaW43KTsKKyAgICAvLyBBdCB0aGlzIHBvaW50cywgaW4xL2luNSBjb250YWlucyByZWQgb25seSwgaW4yL2luNiBncmVlbiBvbmx5IC4uLgorICAgIC8vIFBhY2sgdGhlIGNvbG9ycyBpbiAyNGIgUkdCLgorICAgIFZQOFBsYW5hclRvMjRiX1NTRTIoJmluMSwgJmluNSwgJmluMiwgJmluNiwgJmluMywgJmluNyk7CisgICAgX21tX3N0b3JldV9zaTEyOChvdXQgKyAwLCBpbjEpOworICAgIF9tbV9zdG9yZXVfc2kxMjgob3V0ICsgMSwgaW41KTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KG91dCArIDIsIGluMik7CisgICAgX21tX3N0b3JldV9zaTEyOChvdXQgKyAzLCBpbjYpOworICAgIF9tbV9zdG9yZXVfc2kxMjgob3V0ICsgNCwgaW4zKTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KG91dCArIDUsIGluNyk7CisgICAgaW4gKz0gODsKKyAgICBvdXQgKz0gNjsKKyAgICBudW1fcGl4ZWxzIC09IDMyOworICB9CisgIC8vIGxlZnQtb3ZlcnMKKyAgaWYgKG51bV9waXhlbHMgPiAwKSB7CisgICAgVlA4TENvbnZlcnRCR1JBVG9SR0JfQygoY29uc3QgdWludDMyX3QqKWluLCBudW1fcGl4ZWxzLCAodWludDhfdCopb3V0KTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBDb252ZXJ0QkdSQVRvUkdCQV9TU0UyKGNvbnN0IHVpbnQzMl90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50OF90KiBkc3QpIHsKKyAgY29uc3QgX19tMTI4aSByZWRfYmx1ZV9tYXNrID0gX21tX3NldDFfZXBpMzIoMHgwMGZmMDBmZnUpOworICBjb25zdCBfX20xMjhpKiBpbiA9IChjb25zdCBfX20xMjhpKilzcmM7CisgIF9fbTEyOGkqIG91dCA9IChfX20xMjhpKilkc3Q7CisgIHdoaWxlIChudW1fcGl4ZWxzID49IDgpIHsKKyAgICBjb25zdCBfX20xMjhpIEExID0gX21tX2xvYWR1X3NpMTI4KGluKyspOworICAgIGNvbnN0IF9fbTEyOGkgQTIgPSBfbW1fbG9hZHVfc2kxMjgoaW4rKyk7CisgICAgY29uc3QgX19tMTI4aSBCMSA9IF9tbV9hbmRfc2kxMjgoQTEsIHJlZF9ibHVlX21hc2spOyAgICAgLy8gUiAwIEIgMAorICAgIGNvbnN0IF9fbTEyOGkgQjIgPSBfbW1fYW5kX3NpMTI4KEEyLCByZWRfYmx1ZV9tYXNrKTsgICAgIC8vIFIgMCBCIDAKKyAgICBjb25zdCBfX20xMjhpIEMxID0gX21tX2FuZG5vdF9zaTEyOChyZWRfYmx1ZV9tYXNrLCBBMSk7ICAvLyAwIEcgMCBBCisgICAgY29uc3QgX19tMTI4aSBDMiA9IF9tbV9hbmRub3Rfc2kxMjgocmVkX2JsdWVfbWFzaywgQTIpOyAgLy8gMCBHIDAgQQorICAgIGNvbnN0IF9fbTEyOGkgRDEgPSBfbW1fc2h1ZmZsZWxvX2VwaTE2KEIxLCBfTU1fU0hVRkZMRSgyLCAzLCAwLCAxKSk7CisgICAgY29uc3QgX19tMTI4aSBEMiA9IF9tbV9zaHVmZmxlbG9fZXBpMTYoQjIsIF9NTV9TSFVGRkxFKDIsIDMsIDAsIDEpKTsKKyAgICBjb25zdCBfX20xMjhpIEUxID0gX21tX3NodWZmbGVoaV9lcGkxNihEMSwgX01NX1NIVUZGTEUoMiwgMywgMCwgMSkpOworICAgIGNvbnN0IF9fbTEyOGkgRTIgPSBfbW1fc2h1ZmZsZWhpX2VwaTE2KEQyLCBfTU1fU0hVRkZMRSgyLCAzLCAwLCAxKSk7CisgICAgY29uc3QgX19tMTI4aSBGMSA9IF9tbV9vcl9zaTEyOChFMSwgQzEpOworICAgIGNvbnN0IF9fbTEyOGkgRjIgPSBfbW1fb3Jfc2kxMjgoRTIsIEMyKTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KG91dCsrLCBGMSk7CisgICAgX21tX3N0b3JldV9zaTEyOChvdXQrKywgRjIpOworICAgIG51bV9waXhlbHMgLT0gODsKKyAgfQorICAvLyBsZWZ0LW92ZXJzCisgIGlmIChudW1fcGl4ZWxzID4gMCkgeworICAgIFZQOExDb252ZXJ0QkdSQVRvUkdCQV9DKChjb25zdCB1aW50MzJfdCopaW4sIG51bV9waXhlbHMsICh1aW50OF90KilvdXQpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIENvbnZlcnRCR1JBVG9SR0JBNDQ0NF9TU0UyKGNvbnN0IHVpbnQzMl90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDhfdCogZHN0KSB7CisgIGNvbnN0IF9fbTEyOGkgbWFza18weDBmID0gX21tX3NldDFfZXBpOCgweDBmKTsKKyAgY29uc3QgX19tMTI4aSBtYXNrXzB4ZjAgPSBfbW1fc2V0MV9lcGk4KDB4ZjApOworICBjb25zdCBfX20xMjhpKiBpbiA9IChjb25zdCBfX20xMjhpKilzcmM7CisgIF9fbTEyOGkqIG91dCA9IChfX20xMjhpKilkc3Q7CisgIHdoaWxlIChudW1fcGl4ZWxzID49IDgpIHsKKyAgICBjb25zdCBfX20xMjhpIGJncmEwID0gX21tX2xvYWR1X3NpMTI4KGluKyspOyAgICAgLy8gYmdyYTB8YmdyYTF8YmdyYTJ8YmdyYTMKKyAgICBjb25zdCBfX20xMjhpIGJncmE0ID0gX21tX2xvYWR1X3NpMTI4KGluKyspOyAgICAgLy8gYmdyYTR8YmdyYTV8YmdyYTZ8YmdyYTcKKyAgICBjb25zdCBfX20xMjhpIHYwbCA9IF9tbV91bnBhY2tsb19lcGk4KGJncmEwLCBiZ3JhNCk7ICAvLyBiMGI0ZzBnNHIwcjRhMGE0Li4uCisgICAgY29uc3QgX19tMTI4aSB2MGggPSBfbW1fdW5wYWNraGlfZXBpOChiZ3JhMCwgYmdyYTQpOyAgLy8gYjJiNmcyZzZyMnI2YTJhNi4uLgorICAgIGNvbnN0IF9fbTEyOGkgdjFsID0gX21tX3VucGFja2xvX2VwaTgodjBsLCB2MGgpOyAgICAvLyBiMGIyYjRiNmcwZzJnNGc2Li4uCisgICAgY29uc3QgX19tMTI4aSB2MWggPSBfbW1fdW5wYWNraGlfZXBpOCh2MGwsIHYwaCk7ICAgIC8vIGIxYjNiNWI3ZzFnM2c1ZzcuLi4KKyAgICBjb25zdCBfX20xMjhpIHYybCA9IF9tbV91bnBhY2tsb19lcGk4KHYxbCwgdjFoKTsgICAgLy8gYjAuLi5iNyB8IGcwLi4uZzcKKyAgICBjb25zdCBfX20xMjhpIHYyaCA9IF9tbV91bnBhY2toaV9lcGk4KHYxbCwgdjFoKTsgICAgLy8gcjAuLi5yNyB8IGEwLi4uYTcKKyAgICBjb25zdCBfX20xMjhpIGdhMCA9IF9tbV91bnBhY2toaV9lcGk2NCh2MmwsIHYyaCk7ICAgLy8gZzAuLi5nNyB8IGEwLi4uYTcKKyAgICBjb25zdCBfX20xMjhpIHJiMCA9IF9tbV91bnBhY2tsb19lcGk2NCh2MmgsIHYybCk7ICAgLy8gcjAuLi5yNyB8IGIwLi4uYjcKKyAgICBjb25zdCBfX20xMjhpIGdhMSA9IF9tbV9zcmxpX2VwaTE2KGdhMCwgNCk7ICAgICAgICAgLy8gZzAtfGcxLXwuLi58YTYtfGE3LQorICAgIGNvbnN0IF9fbTEyOGkgcmIxID0gX21tX2FuZF9zaTEyOChyYjAsIG1hc2tfMHhmMCk7ICAvLyAtcjB8LXIxfC4uLnwtYjZ8LWE3CisgICAgY29uc3QgX19tMTI4aSBnYTIgPSBfbW1fYW5kX3NpMTI4KGdhMSwgbWFza18weDBmKTsgIC8vIGcwLXxnMS18Li4ufGE2LXxhNy0KKyAgICBjb25zdCBfX20xMjhpIHJnYmEwID0gX21tX29yX3NpMTI4KGdhMiwgcmIxKTsgICAgICAgLy8gcmcwLi5yZzcgfCBiYTAuLmJhNworICAgIGNvbnN0IF9fbTEyOGkgcmdiYTEgPSBfbW1fc3JsaV9zaTEyOChyZ2JhMCwgOCk7ICAgICAvLyBiYTAuLmJhNyB8IDAKKyNpZiAoV0VCUF9TV0FQXzE2QklUX0NTUCA9PSAxKQorICAgIGNvbnN0IF9fbTEyOGkgcmdiYSA9IF9tbV91bnBhY2tsb19lcGk4KHJnYmExLCByZ2JhMCk7ICAvLyBiYXJnMC4uLmJhcmc3CisjZWxzZQorICAgIGNvbnN0IF9fbTEyOGkgcmdiYSA9IF9tbV91bnBhY2tsb19lcGk4KHJnYmEwLCByZ2JhMSk7ICAvLyByZ2JhMC4uLnJnYmE3CisjZW5kaWYKKyAgICBfbW1fc3RvcmV1X3NpMTI4KG91dCsrLCByZ2JhKTsKKyAgICBudW1fcGl4ZWxzIC09IDg7CisgIH0KKyAgLy8gbGVmdC1vdmVycworICBpZiAobnVtX3BpeGVscyA+IDApIHsKKyAgICBWUDhMQ29udmVydEJHUkFUb1JHQkE0NDQ0X0MoKGNvbnN0IHVpbnQzMl90KilpbiwgbnVtX3BpeGVscywgKHVpbnQ4X3QqKW91dCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgQ29udmVydEJHUkFUb1JHQjU2NV9TU0UyKGNvbnN0IHVpbnQzMl90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQ4X3QqIGRzdCkgeworICBjb25zdCBfX20xMjhpIG1hc2tfMHhlMCA9IF9tbV9zZXQxX2VwaTgoMHhlMCk7CisgIGNvbnN0IF9fbTEyOGkgbWFza18weGY4ID0gX21tX3NldDFfZXBpOCgweGY4KTsKKyAgY29uc3QgX19tMTI4aSBtYXNrXzB4MDcgPSBfbW1fc2V0MV9lcGk4KDB4MDcpOworICBjb25zdCBfX20xMjhpKiBpbiA9IChjb25zdCBfX20xMjhpKilzcmM7CisgIF9fbTEyOGkqIG91dCA9IChfX20xMjhpKilkc3Q7CisgIHdoaWxlIChudW1fcGl4ZWxzID49IDgpIHsKKyAgICBjb25zdCBfX20xMjhpIGJncmEwID0gX21tX2xvYWR1X3NpMTI4KGluKyspOyAgICAgLy8gYmdyYTB8YmdyYTF8YmdyYTJ8YmdyYTMKKyAgICBjb25zdCBfX20xMjhpIGJncmE0ID0gX21tX2xvYWR1X3NpMTI4KGluKyspOyAgICAgLy8gYmdyYTR8YmdyYTV8YmdyYTZ8YmdyYTcKKyAgICBjb25zdCBfX20xMjhpIHYwbCA9IF9tbV91bnBhY2tsb19lcGk4KGJncmEwLCBiZ3JhNCk7ICAvLyBiMGI0ZzBnNHIwcjRhMGE0Li4uCisgICAgY29uc3QgX19tMTI4aSB2MGggPSBfbW1fdW5wYWNraGlfZXBpOChiZ3JhMCwgYmdyYTQpOyAgLy8gYjJiNmcyZzZyMnI2YTJhNi4uLgorICAgIGNvbnN0IF9fbTEyOGkgdjFsID0gX21tX3VucGFja2xvX2VwaTgodjBsLCB2MGgpOyAgICAgIC8vIGIwYjJiNGI2ZzBnMmc0ZzYuLi4KKyAgICBjb25zdCBfX20xMjhpIHYxaCA9IF9tbV91bnBhY2toaV9lcGk4KHYwbCwgdjBoKTsgICAgICAvLyBiMWIzYjViN2cxZzNnNWc3Li4uCisgICAgY29uc3QgX19tMTI4aSB2MmwgPSBfbW1fdW5wYWNrbG9fZXBpOCh2MWwsIHYxaCk7ICAgICAgLy8gYjAuLi5iNyB8IGcwLi4uZzcKKyAgICBjb25zdCBfX20xMjhpIHYyaCA9IF9tbV91bnBhY2toaV9lcGk4KHYxbCwgdjFoKTsgICAgICAvLyByMC4uLnI3IHwgYTAuLi5hNworICAgIGNvbnN0IF9fbTEyOGkgZ2EwID0gX21tX3VucGFja2hpX2VwaTY0KHYybCwgdjJoKTsgICAgIC8vIGcwLi4uZzcgfCBhMC4uLmE3CisgICAgY29uc3QgX19tMTI4aSByYjAgPSBfbW1fdW5wYWNrbG9fZXBpNjQodjJoLCB2MmwpOyAgICAgLy8gcjAuLi5yNyB8IGIwLi4uYjcKKyAgICBjb25zdCBfX20xMjhpIHJiMSA9IF9tbV9hbmRfc2kxMjgocmIwLCBtYXNrXzB4ZjgpOyAgICAvLyAtcjAuLi1yN3wtYjAuLi1iNworICAgIGNvbnN0IF9fbTEyOGkgZ19sbzEgPSBfbW1fc3JsaV9lcGkxNihnYTAsIDUpOworICAgIGNvbnN0IF9fbTEyOGkgZ19sbzIgPSBfbW1fYW5kX3NpMTI4KGdfbG8xLCBtYXNrXzB4MDcpOyAgLy8gZzAtLi4uZzctfHh4ICgzYikKKyAgICBjb25zdCBfX20xMjhpIGdfaGkxID0gX21tX3NsbGlfZXBpMTYoZ2EwLCAzKTsKKyAgICBjb25zdCBfX20xMjhpIGdfaGkyID0gX21tX2FuZF9zaTEyOChnX2hpMSwgbWFza18weGUwKTsgIC8vIC1nMC4uLi1nN3x4eCAoM2IpCisgICAgY29uc3QgX19tMTI4aSBiMCA9IF9tbV9zcmxpX3NpMTI4KHJiMSwgOCk7ICAgICAgICAgICAgICAvLyAtYjAuLi4tYjd8MAorICAgIGNvbnN0IF9fbTEyOGkgcmcxID0gX21tX29yX3NpMTI4KHJiMSwgZ19sbzIpOyAgICAgICAgICAgLy8gZ3IwLi4uZ3I3fHh4CisgICAgY29uc3QgX19tMTI4aSBiMSA9IF9tbV9zcmxpX2VwaTE2KGIwLCAzKTsKKyAgICBjb25zdCBfX20xMjhpIGdiMSA9IF9tbV9vcl9zaTEyOChiMSwgZ19oaTIpOyAgICAgICAgICAgIC8vIGJnMC4uLmJnN3x4eAorI2lmIChXRUJQX1NXQVBfMTZCSVRfQ1NQID09IDEpCisgICAgY29uc3QgX19tMTI4aSByZ2JhID0gX21tX3VucGFja2xvX2VwaTgoZ2IxLCByZzEpOyAgICAgLy8gcmdnYjAuLi5yZ2diNworI2Vsc2UKKyAgICBjb25zdCBfX20xMjhpIHJnYmEgPSBfbW1fdW5wYWNrbG9fZXBpOChyZzEsIGdiMSk7ICAgICAvLyBiZ3JiMC4uLmJncmI3CisjZW5kaWYKKyAgICBfbW1fc3RvcmV1X3NpMTI4KG91dCsrLCByZ2JhKTsKKyAgICBudW1fcGl4ZWxzIC09IDg7CisgIH0KKyAgLy8gbGVmdC1vdmVycworICBpZiAobnVtX3BpeGVscyA+IDApIHsKKyAgICBWUDhMQ29udmVydEJHUkFUb1JHQjU2NV9DKChjb25zdCB1aW50MzJfdCopaW4sIG51bV9waXhlbHMsICh1aW50OF90KilvdXQpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIENvbnZlcnRCR1JBVG9CR1JfU1NFMihjb25zdCB1aW50MzJfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50OF90KiBkc3QpIHsKKyAgY29uc3QgX19tMTI4aSBtYXNrX2wgPSBfbW1fc2V0X2VwaTMyKDAsIDB4MDBmZmZmZmYsIDAsIDB4MDBmZmZmZmYpOworICBjb25zdCBfX20xMjhpIG1hc2tfaCA9IF9tbV9zZXRfZXBpMzIoMHgwMGZmZmZmZiwgMCwgMHgwMGZmZmZmZiwgMCk7CisgIGNvbnN0IF9fbTEyOGkqIGluID0gKGNvbnN0IF9fbTEyOGkqKXNyYzsKKyAgY29uc3QgdWludDhfdCogY29uc3QgZW5kID0gZHN0ICsgbnVtX3BpeGVscyAqIDM7CisgIC8vIHRoZSBsYXN0IHN0b3JlbF9lcGk2NCBiZWxvdyB3cml0ZXMgOCBieXRlcyBzdGFydGluZyBhdCBvZmZzZXQgMTgKKyAgd2hpbGUgKGRzdCArIDI2IDw9IGVuZCkgeworICAgIGNvbnN0IF9fbTEyOGkgYmdyYTAgPSBfbW1fbG9hZHVfc2kxMjgoaW4rKyk7ICAgICAvLyBiZ3JhMHxiZ3JhMXxiZ3JhMnxiZ3JhMworICAgIGNvbnN0IF9fbTEyOGkgYmdyYTQgPSBfbW1fbG9hZHVfc2kxMjgoaW4rKyk7ICAgICAvLyBiZ3JhNHxiZ3JhNXxiZ3JhNnxiZ3JhNworICAgIGNvbnN0IF9fbTEyOGkgYTBsID0gX21tX2FuZF9zaTEyOChiZ3JhMCwgbWFza19sKTsgICAvLyBiZ3IwfDB8YmdyMHwwCisgICAgY29uc3QgX19tMTI4aSBhNGwgPSBfbW1fYW5kX3NpMTI4KGJncmE0LCBtYXNrX2wpOyAgIC8vIGJncjB8MHxiZ3IwfDAKKyAgICBjb25zdCBfX20xMjhpIGEwaCA9IF9tbV9hbmRfc2kxMjgoYmdyYTAsIG1hc2tfaCk7ICAgLy8gMHxiZ3IwfDB8YmdyMAorICAgIGNvbnN0IF9fbTEyOGkgYTRoID0gX21tX2FuZF9zaTEyOChiZ3JhNCwgbWFza19oKTsgICAvLyAwfGJncjB8MHxiZ3IwCisgICAgY29uc3QgX19tMTI4aSBiMGggPSBfbW1fc3JsaV9lcGk2NChhMGgsIDgpOyAgICAgICAgIC8vIDAwMGJ8Z3IwMHwwMDBifGdyMDAKKyAgICBjb25zdCBfX20xMjhpIGI0aCA9IF9tbV9zcmxpX2VwaTY0KGE0aCwgOCk7ICAgICAgICAgLy8gMDAwYnxncjAwfDAwMGJ8Z3IwMAorICAgIGNvbnN0IF9fbTEyOGkgYzAgPSBfbW1fb3Jfc2kxMjgoYTBsLCBiMGgpOyAgICAgICAgICAvLyByZ2JyZ2IwMHxyZ2JyZ2IwMAorICAgIGNvbnN0IF9fbTEyOGkgYzQgPSBfbW1fb3Jfc2kxMjgoYTRsLCBiNGgpOyAgICAgICAgICAvLyByZ2JyZ2IwMHxyZ2JyZ2IwMAorICAgIGNvbnN0IF9fbTEyOGkgYzIgPSBfbW1fc3JsaV9zaTEyOChjMCwgOCk7CisgICAgY29uc3QgX19tMTI4aSBjNiA9IF9tbV9zcmxpX3NpMTI4KGM0LCA4KTsKKyAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikoZHN0ICsgICAwKSwgYzApOworICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKShkc3QgKyAgIDYpLCBjMik7CisgICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopKGRzdCArICAxMiksIGM0KTsKKyAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikoZHN0ICsgIDE4KSwgYzYpOworICAgIGRzdCArPSAyNDsKKyAgICBudW1fcGl4ZWxzIC09IDg7CisgIH0KKyAgLy8gbGVmdC1vdmVycworICBpZiAobnVtX3BpeGVscyA+IDApIHsKKyAgICBWUDhMQ29udmVydEJHUkFUb0JHUl9DKChjb25zdCB1aW50MzJfdCopaW4sIG51bV9waXhlbHMsIGRzdCk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFZQOExEc3BJbml0U1NFMih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFZQOExEc3BJbml0U1NFMih2b2lkKSB7CisgIFZQOExQcmVkaWN0b3JzWzVdID0gUHJlZGljdG9yNV9TU0UyOworICBWUDhMUHJlZGljdG9yc1s2XSA9IFByZWRpY3RvcjZfU1NFMjsKKyAgVlA4TFByZWRpY3RvcnNbN10gPSBQcmVkaWN0b3I3X1NTRTI7CisgIFZQOExQcmVkaWN0b3JzWzhdID0gUHJlZGljdG9yOF9TU0UyOworICBWUDhMUHJlZGljdG9yc1s5XSA9IFByZWRpY3RvcjlfU1NFMjsKKyAgVlA4TFByZWRpY3RvcnNbMTBdID0gUHJlZGljdG9yMTBfU1NFMjsKKyAgVlA4TFByZWRpY3RvcnNbMTFdID0gUHJlZGljdG9yMTFfU1NFMjsKKyAgVlA4TFByZWRpY3RvcnNbMTJdID0gUHJlZGljdG9yMTJfU1NFMjsKKyAgVlA4TFByZWRpY3RvcnNbMTNdID0gUHJlZGljdG9yMTNfU1NFMjsKKworICBWUDhMUHJlZGljdG9yc0FkZFswXSA9IFByZWRpY3RvckFkZDBfU1NFMjsKKyAgVlA4TFByZWRpY3RvcnNBZGRbMV0gPSBQcmVkaWN0b3JBZGQxX1NTRTI7CisgIFZQOExQcmVkaWN0b3JzQWRkWzJdID0gUHJlZGljdG9yQWRkMl9TU0UyOworICBWUDhMUHJlZGljdG9yc0FkZFszXSA9IFByZWRpY3RvckFkZDNfU1NFMjsKKyAgVlA4TFByZWRpY3RvcnNBZGRbNF0gPSBQcmVkaWN0b3JBZGQ0X1NTRTI7CisgIFZQOExQcmVkaWN0b3JzQWRkWzVdID0gUHJlZGljdG9yQWRkNV9TU0UyOworICBWUDhMUHJlZGljdG9yc0FkZFs2XSA9IFByZWRpY3RvckFkZDZfU1NFMjsKKyAgVlA4TFByZWRpY3RvcnNBZGRbN10gPSBQcmVkaWN0b3JBZGQ3X1NTRTI7CisgIFZQOExQcmVkaWN0b3JzQWRkWzhdID0gUHJlZGljdG9yQWRkOF9TU0UyOworICBWUDhMUHJlZGljdG9yc0FkZFs5XSA9IFByZWRpY3RvckFkZDlfU1NFMjsKKyAgVlA4TFByZWRpY3RvcnNBZGRbMTBdID0gUHJlZGljdG9yQWRkMTBfU1NFMjsKKyAgVlA4TFByZWRpY3RvcnNBZGRbMTFdID0gUHJlZGljdG9yQWRkMTFfU1NFMjsKKyAgVlA4TFByZWRpY3RvcnNBZGRbMTJdID0gUHJlZGljdG9yQWRkMTJfU1NFMjsKKyAgVlA4TFByZWRpY3RvcnNBZGRbMTNdID0gUHJlZGljdG9yQWRkMTNfU1NFMjsKKworICBWUDhMQWRkR3JlZW5Ub0JsdWVBbmRSZWQgPSBBZGRHcmVlblRvQmx1ZUFuZFJlZF9TU0UyOworICBWUDhMVHJhbnNmb3JtQ29sb3JJbnZlcnNlID0gVHJhbnNmb3JtQ29sb3JJbnZlcnNlX1NTRTI7CisKKyAgVlA4TENvbnZlcnRCR1JBVG9SR0IgPSBDb252ZXJ0QkdSQVRvUkdCX1NTRTI7CisgIFZQOExDb252ZXJ0QkdSQVRvUkdCQSA9IENvbnZlcnRCR1JBVG9SR0JBX1NTRTI7CisgIFZQOExDb252ZXJ0QkdSQVRvUkdCQTQ0NDQgPSBDb252ZXJ0QkdSQVRvUkdCQTQ0NDRfU1NFMjsKKyAgVlA4TENvbnZlcnRCR1JBVG9SR0I1NjUgPSBDb252ZXJ0QkdSQVRvUkdCNTY1X1NTRTI7CisgIFZQOExDb252ZXJ0QkdSQVRvQkdSID0gQ29udmVydEJHUkFUb0JHUl9TU0UyOworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX1NTRTIKKworV0VCUF9EU1BfSU5JVF9TVFVCKFZQOExEc3BJbml0U1NFMikKKworI2VuZGlmICAvLyBXRUJQX1VTRV9TU0UyCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL21pcHNfbWFjcm8uaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbWlwc19tYWNyby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0YWJhOWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL21pcHNfbWFjcm8uaApAQCAtMCwwICsxLDIwMCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIE1JUFMgY29tbW9uIG1hY3JvcworCisjaWZuZGVmIFdFQlBfRFNQX01JUFNfTUFDUk9fSF8KKyNkZWZpbmUgV0VCUF9EU1BfTUlQU19NQUNST19IXworCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX0FORFJPSURfXykgJiYgTE9DQUxfR0NDX1ZFUlNJT04gPT0gMHg0MDkKKyNkZWZpbmUgV09SS19BUk9VTkRfR0NDCisjZW5kaWYKKworI2RlZmluZSBTVFIocykgI3MKKyNkZWZpbmUgWFNUUihzKSBTVFIocykKKworLy8gTzBbMzEuLjE2IHwgMTUuLjBdID0gSTBbMzEuLjE2IHwgMTUuLjBdICsgSTFbMzEuLjE2IHwgMTUuLjBdCisvLyBPMVszMS4uMTYgfCAxNS4uMF0gPSBJMFszMS4uMTYgfCAxNS4uMF0gLSBJMVszMS4uMTYgfCAxNS4uMF0KKy8vIE8gLSBvdXRwdXQKKy8vIEkgLSBpbnB1dCAobWFjcm8gZG9lc24ndCBjaGFuZ2UgaXQpCisjZGVmaW5lIEFERF9TVUJfSEFMVkVTKE8wLCBPMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICBJMCwgSTEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgImFkZHEucGggICAgICAgICAgJVsiICNPMCAiXSwgICAlWyIgI0kwICJdLCAgJVsiICNJMSAiXSAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJzdWJxLnBoICAgICAgICAgICVbIiAjTzEgIl0sICAgJVsiICNJMCAiXSwgICVbIiAjSTEgIl0gICAgICAgICAgIFxuXHQiCisKKy8vIE8gLSBvdXRwdXQKKy8vIEkgLSBpbnB1dCAobWFjcm8gZG9lc24ndCBjaGFuZ2UgaXQpCisvLyBJWzAvMV0gLSBvZmZzZXQgaW4gYnl0ZXMKKyNkZWZpbmUgTE9BRF9JTl9YMihPMCwgTzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgSTAsIEkxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAibGggICAgICAgICAgICAgICAlWyIgI08wICJdLCAgICIgI0kwICIoJVtpbl0pICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgImxoICAgICAgICAgICAgICAgJVsiICNPMSAiXSwgICAiICNJMSAiKCVbaW5dKSAgICAgICAgICAgICAgICAgIFxuXHQiCisKKy8vIEkwIC0gbG9jYXRpb24KKy8vIEkxLi5JOSAtIG9mZnNldHMgaW4gYnl0ZXMKKyNkZWZpbmUgTE9BRF9XSVRIX09GRlNFVF9YNChPMCwgTzEsIE8yLCBPMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSTAsIEkxLCBJMiwgSTMsIEk0LCBJNSwgSTYsIEk3LCBJOCwgSTkpICAgICAgICAgICAgXAorICAidWx3ICAgICVbIiAjTzAgIl0sICAgICIgI0kxICIrIiBYU1RSKEk5KSAiKiIgI0k1ICIoJVsiICNJMCAiXSkgICAgICAgXG5cdCIgIFwKKyAgInVsdyAgICAlWyIgI08xICJdLCAgICAiICNJMiAiKyIgWFNUUihJOSkgIioiICNJNiAiKCVbIiAjSTAgIl0pICAgICAgIFxuXHQiICBcCisgICJ1bHcgICAgJVsiICNPMiAiXSwgICAgIiAjSTMgIisiIFhTVFIoSTkpICIqIiAjSTcgIiglWyIgI0kwICJdKSAgICAgICBcblx0IiAgXAorICAidWx3ICAgICVbIiAjTzMgIl0sICAgICIgI0k0ICIrIiBYU1RSKEk5KSAiKiIgI0k4ICIoJVsiICNJMCAiXSkgICAgICAgXG5cdCIKKworLy8gTyAtIG91dHB1dAorLy8gSU8gLSBpbnB1dC9vdXRwdXQKKy8vIEkgLSBpbnB1dCAobWFjcm8gZG9lc24ndCBjaGFuZ2UgaXQpCisjZGVmaW5lIE1VTF9TSElGVF9TVU0oTzAsIE8xLCBPMiwgTzMsIE80LCBPNSwgTzYsIE83LCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIElPMCwgSU8xLCBJTzIsIElPMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBJMCwgSTEsIEkyLCBJMywgSTQsIEk1LCBJNiwgSTcpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJtdWwgICAgICAgICAgICAgICVbIiAjTzAgIl0sICAgJVsiICNJMCAiXSwgICAlW2tDMl0gICAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAibXVsICAgICAgICAgICAgICAlWyIgI08xICJdLCAgICVbIiAjSTAgIl0sICAgJVtrQzFdICAgICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgIm11bCAgICAgICAgICAgICAgJVsiICNPMiAiXSwgICAlWyIgI0kxICJdLCAgICVba0MyXSAgICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICJtdWwgICAgICAgICAgICAgICVbIiAjTzMgIl0sICAgJVsiICNJMSAiXSwgICAlW2tDMV0gICAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAibXVsICAgICAgICAgICAgICAlWyIgI080ICJdLCAgICVbIiAjSTIgIl0sICAgJVtrQzJdICAgICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgIm11bCAgICAgICAgICAgICAgJVsiICNPNSAiXSwgICAlWyIgI0kyICJdLCAgICVba0MxXSAgICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICJtdWwgICAgICAgICAgICAgICVbIiAjTzYgIl0sICAgJVsiICNJMyAiXSwgICAlW2tDMl0gICAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAibXVsICAgICAgICAgICAgICAlWyIgI083ICJdLCAgICVbIiAjSTMgIl0sICAgJVtrQzFdICAgICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgInNyYSAgICAgICAgICAgICAgJVsiICNPMCAiXSwgICAlWyIgI08wICJdLCAgIDE2ICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICJzcmEgICAgICAgICAgICAgICVbIiAjTzEgIl0sICAgJVsiICNPMSAiXSwgICAxNiAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAic3JhICAgICAgICAgICAgICAlWyIgI08yICJdLCAgICVbIiAjTzIgIl0sICAgMTYgICAgICAgICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgInNyYSAgICAgICAgICAgICAgJVsiICNPMyAiXSwgICAlWyIgI08zICJdLCAgIDE2ICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICJzcmEgICAgICAgICAgICAgICVbIiAjTzQgIl0sICAgJVsiICNPNCAiXSwgICAxNiAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAic3JhICAgICAgICAgICAgICAlWyIgI081ICJdLCAgICVbIiAjTzUgIl0sICAgMTYgICAgICAgICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgInNyYSAgICAgICAgICAgICAgJVsiICNPNiAiXSwgICAlWyIgI082ICJdLCAgIDE2ICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICJzcmEgICAgICAgICAgICAgICVbIiAjTzcgIl0sICAgJVsiICNPNyAiXSwgICAxNiAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAiYWRkdSAgICAgICAgICAgICAlWyIgI0lPMCAiXSwgICVbIiAjSU8wICJdLCAgJVsiICNJNCAiXSAgICBcblx0IiAgICAgICAgICAgIFwKKyAgImFkZHUgICAgICAgICAgICAgJVsiICNJTzEgIl0sICAlWyIgI0lPMSAiXSwgICVbIiAjSTUgIl0gICAgXG5cdCIgICAgICAgICAgICBcCisgICJzdWJ1ICAgICAgICAgICAgICVbIiAjSU8yICJdLCAgJVsiICNJTzIgIl0sICAlWyIgI0k2ICJdICAgIFxuXHQiICAgICAgICAgICAgXAorICAic3VidSAgICAgICAgICAgICAlWyIgI0lPMyAiXSwgICVbIiAjSU8zICJdLCAgJVsiICNJNyAiXSAgICBcblx0IgorCisvLyBPIC0gb3V0cHV0CisvLyBJIC0gaW5wdXQgKG1hY3JvIGRvZXNuJ3QgY2hhbmdlIGl0KQorI2RlZmluZSBJTlNFUlRfSEFMRl9YMihPMCwgTzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgSTAsIEkxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJpbnMgICAgICAgICAgICAgICVbIiAjTzAgIl0sICAgJVsiICNJMCAiXSwgMTYsICAgIDE2ICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAiaW5zICAgICAgICAgICAgICAlWyIgI08xICJdLCAgICVbIiAjSTEgIl0sIDE2LCAgICAxNiAgICAgICAgICAgXG5cdCIKKworLy8gTyAtIG91dHB1dAorLy8gSSAtIGlucHV0IChtYWNybyBkb2Vzbid0IGNoYW5nZSBpdCkKKyNkZWZpbmUgU1JBXzE2KE8wLCBPMSwgTzIsIE8zLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICBJMCwgSTEsIEkyLCBJMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAic3JhICAgICAgICAgICAgICAlWyIgI08wICJdLCAgJVsiICNJMCAiXSwgIDE2ICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgInNyYSAgICAgICAgICAgICAgJVsiICNPMSAiXSwgICVbIiAjSTEgIl0sICAxNiAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJzcmEgICAgICAgICAgICAgICVbIiAjTzIgIl0sICAlWyIgI0kyICJdLCAgMTYgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAic3JhICAgICAgICAgICAgICAlWyIgI08zICJdLCAgJVsiICNJMyAiXSwgIDE2ICAgICAgICAgICAgICAgICAgXG5cdCIKKworLy8gdGVtcDBbMzEuLjE2IHwgMTUuLjBdID0gdGVtcDhbMzEuLjE2IHwgMTUuLjBdICsgdGVtcDEyWzMxLi4xNiB8IDE1Li4wXQorLy8gdGVtcDFbMzEuLjE2IHwgMTUuLjBdID0gdGVtcDhbMzEuLjE2IHwgMTUuLjBdIC0gdGVtcDEyWzMxLi4xNiB8IDE1Li4wXQorLy8gdGVtcDBbMzEuLjE2IHwgMTUuLjBdID0gdGVtcDBbMzEuLjE2ID4+IDMgfCAxNS4uMCA+PiAzXQorLy8gdGVtcDFbMzEuLjE2IHwgMTUuLjBdID0gdGVtcDFbMzEuLjE2ID4+IDMgfCAxNS4uMCA+PiAzXQorLy8gTyAtIG91dHB1dAorLy8gSSAtIGlucHV0IChtYWNybyBkb2Vzbid0IGNoYW5nZSBpdCkKKyNkZWZpbmUgU0hJRlRfUl9TVU1fWDIoTzAsIE8xLCBPMiwgTzMsIE80LCBPNSwgTzYsIE83LCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgIEkwLCBJMSwgSTIsIEkzLCBJNCwgSTUsIEk2LCBJNykgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYWRkcS5waCAgICAgICAgICAlWyIgI08wICJdLCAgICVbIiAjSTAgIl0sICAgJVsiICNJNCAiXSAgICBcblx0IiAgICAgICAgICAgIFwKKyAgInN1YnEucGggICAgICAgICAgJVsiICNPMSAiXSwgICAlWyIgI0kwICJdLCAgICVbIiAjSTQgIl0gICAgXG5cdCIgICAgICAgICAgICBcCisgICJhZGRxLnBoICAgICAgICAgICVbIiAjTzIgIl0sICAgJVsiICNJMSAiXSwgICAlWyIgI0k1ICJdICAgIFxuXHQiICAgICAgICAgICAgXAorICAic3VicS5waCAgICAgICAgICAlWyIgI08zICJdLCAgICVbIiAjSTEgIl0sICAgJVsiICNJNSAiXSAgICBcblx0IiAgICAgICAgICAgIFwKKyAgImFkZHEucGggICAgICAgICAgJVsiICNPNCAiXSwgICAlWyIgI0kyICJdLCAgICVbIiAjSTYgIl0gICAgXG5cdCIgICAgICAgICAgICBcCisgICJzdWJxLnBoICAgICAgICAgICVbIiAjTzUgIl0sICAgJVsiICNJMiAiXSwgICAlWyIgI0k2ICJdICAgIFxuXHQiICAgICAgICAgICAgXAorICAiYWRkcS5waCAgICAgICAgICAlWyIgI082ICJdLCAgICVbIiAjSTMgIl0sICAgJVsiICNJNyAiXSAgICBcblx0IiAgICAgICAgICAgIFwKKyAgInN1YnEucGggICAgICAgICAgJVsiICNPNyAiXSwgICAlWyIgI0kzICJdLCAgICVbIiAjSTcgIl0gICAgXG5cdCIgICAgICAgICAgICBcCisgICJzaHJhLnBoICAgICAgICAgICVbIiAjTzAgIl0sICAgJVsiICNPMCAiXSwgICAzICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAic2hyYS5waCAgICAgICAgICAlWyIgI08xICJdLCAgICVbIiAjTzEgIl0sICAgMyAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgInNocmEucGggICAgICAgICAgJVsiICNPMiAiXSwgICAlWyIgI08yICJdLCAgIDMgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICJzaHJhLnBoICAgICAgICAgICVbIiAjTzMgIl0sICAgJVsiICNPMyAiXSwgICAzICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAic2hyYS5waCAgICAgICAgICAlWyIgI080ICJdLCAgICVbIiAjTzQgIl0sICAgMyAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgInNocmEucGggICAgICAgICAgJVsiICNPNSAiXSwgICAlWyIgI081ICJdLCAgIDMgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICJzaHJhLnBoICAgICAgICAgICVbIiAjTzYgIl0sICAgJVsiICNPNiAiXSwgICAzICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAic2hyYS5waCAgICAgICAgICAlWyIgI083ICJdLCAgICVbIiAjTzcgIl0sICAgMyAgICAgICAgICAgICBcblx0IgorCisvLyBwcmVjcnEucGgudyB0ZW1wMCwgdGVtcDgsIHRlbXAyCisvLyAgIHRlbXAwID0gdGVtcDhbMzEuLjE2XSB8IHRlbXAyWzMxLi4xNl0KKy8vIGlucyB0ZW1wMiwgdGVtcDgsIDE2LCAxNgorLy8gICB0ZW1wMiA9IHRlbXA4WzMxLi4xNl0gfCB0ZW1wMlsxNS4uMF0KKy8vIE8gLSBvdXRwdXQKKy8vIElPIC0gaW5wdXQvb3V0cHV0CisvLyBJIC0gaW5wdXQgKG1hY3JvIGRvZXNuJ3QgY2hhbmdlIGl0KQorI2RlZmluZSBQQUNLXzJfSEFMVkVTX1RPX1dPUkQoTzAsIE8xLCBPMiwgTzMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElPMCwgSU8xLCBJTzIsIElPMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJMCwgSTEsIEkyLCBJMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAicHJlY3JxLnBoLncgICAgICAlWyIgI08wICJdLCAgICAlWyIgI0kwICJdLCAgJVsiICNJTzAgIl0gICAgICAgXG5cdCIgICAgICAgIFwKKyAgInByZWNycS5waC53ICAgICAgJVsiICNPMSAiXSwgICAgJVsiICNJMSAiXSwgICVbIiAjSU8xICJdICAgICAgIFxuXHQiICAgICAgICBcCisgICJpbnMgICAgICAgICAgICAgICVbIiAjSU8wICJdLCAgICVbIiAjSTAgIl0sICAxNiwgICAgMTYgICAgICAgICBcblx0IiAgICAgICAgXAorICAiaW5zICAgICAgICAgICAgICAlWyIgI0lPMSAiXSwgICAlWyIgI0kxICJdLCAgMTYsICAgIDE2ICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgInByZWNycS5waC53ICAgICAgJVsiICNPMiAiXSwgICAgJVsiICNJMiAiXSwgICVbIiAjSU8yICJdICAgICAgIFxuXHQiICAgICAgICBcCisgICJwcmVjcnEucGgudyAgICAgICVbIiAjTzMgIl0sICAgICVbIiAjSTMgIl0sICAlWyIgI0lPMyAiXSAgICAgICBcblx0IiAgICAgICAgXAorICAiaW5zICAgICAgICAgICAgICAlWyIgI0lPMiAiXSwgICAlWyIgI0kyICJdLCAgMTYsICAgIDE2ICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgImlucyAgICAgICAgICAgICAgJVsiICNJTzMgIl0sICAgJVsiICNJMyAiXSwgIDE2LCAgICAxNiAgICAgICAgIFxuXHQiCisKKy8vIHByZWNldS5waC5xYnIgdGVtcDAsIHRlbXA4CisvLyAgIHRlbXAwID0gMCB8IDAgfCB0ZW1wOFsyMy4uMTZdIHwgdGVtcDhbNy4uMF0KKy8vIHByZWNldS5waC5xYmwgdGVtcDEsIHRlbXA4CisvLyAgIHRlbXAxID0gdGVtcDhbMjMuLjE2XSB8IHRlbXA4WzcuLjBdIHwgMCB8IDAKKy8vIE8gLSBvdXRwdXQKKy8vIEkgLSBpbnB1dCAobWFjcm8gZG9lc24ndCBjaGFuZ2UgaXQpCisjZGVmaW5lIENPTlZFUlRfMl9CWVRFU19UT19IQUxGKE8wLCBPMSwgTzIsIE8zLCBPNCwgTzUsIE82LCBPNywgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJMCwgSTEsIEkyLCBJMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgInByZWNldS5waC5xYnIgICAgJVsiICNPMCAiXSwgICAlWyIgI0kwICJdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJwcmVjZXUucGgucWJsICAgICVbIiAjTzEgIl0sICAgJVsiICNJMCAiXSAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAicHJlY2V1LnBoLnFiciAgICAlWyIgI08yICJdLCAgICVbIiAjSTEgIl0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgInByZWNldS5waC5xYmwgICAgJVsiICNPMyAiXSwgICAlWyIgI0kxICJdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJwcmVjZXUucGgucWJyICAgICVbIiAjTzQgIl0sICAgJVsiICNJMiAiXSAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAicHJlY2V1LnBoLnFibCAgICAlWyIgI081ICJdLCAgICVbIiAjSTIgIl0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgInByZWNldS5waC5xYnIgICAgJVsiICNPNiAiXSwgICAlWyIgI0kzICJdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJwcmVjZXUucGgucWJsICAgICVbIiAjTzcgIl0sICAgJVsiICNJMyAiXSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisvLyB0ZW1wMFszMS4uMTYgfCAxNS4uMF0gPSB0ZW1wMFszMS4uMTYgfCAxNS4uMF0gKyB0ZW1wOFszMS4uMTYgfCAxNS4uMF0KKy8vIHRlbXAwWzMxLi4xNiB8IDE1Li4wXSA9IHRlbXAwWzMxLi4xNiA8PChzKSA3IHwgMTUuLjAgPDwocykgN10KKy8vIHRlbXAxLi50ZW1wNyBzYW1lIGFzIHRlbXAwCisvLyBwcmVjcnF1X3MucWIucGggdGVtcDAsIHRlbXAxLCB0ZW1wMDoKKy8vICAgdGVtcDAgPSB0ZW1wMVszMS4uMjRdIHwgdGVtcDFbMTUuLjhdIHwgdGVtcDBbMzEuLjI0XSB8IHRlbXAwWzE1Li44XQorLy8gc3RvcmUgdGVtcDAgdG8gZHN0CisvLyBJTyAtIGlucHV0L291dHB1dAorLy8gSSAtIGlucHV0IChtYWNybyBkb2Vzbid0IGNoYW5nZSBpdCkKKyNkZWZpbmUgU1RPUkVfU0FUX1NVTV9YMihJTzAsIElPMSwgSU8yLCBJTzMsIElPNCwgSU81LCBJTzYsIElPNywgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgSTAsIEkxLCBJMiwgSTMsIEk0LCBJNSwgSTYsIEk3LCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEk4LCBJOSwgSTEwLCBJMTEsIEkxMiwgSTEzKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgImFkZHEucGggICAgICAgICAgJVsiICNJTzAgIl0sICAlWyIgI0lPMCAiXSwgICVbIiAjSTAgIl0gICAgICAgICAgXG5cdCIgICAgICBcCisgICJhZGRxLnBoICAgICAgICAgICVbIiAjSU8xICJdLCAgJVsiICNJTzEgIl0sICAlWyIgI0kxICJdICAgICAgICAgIFxuXHQiICAgICAgXAorICAiYWRkcS5waCAgICAgICAgICAlWyIgI0lPMiAiXSwgICVbIiAjSU8yICJdLCAgJVsiICNJMiAiXSAgICAgICAgICBcblx0IiAgICAgIFwKKyAgImFkZHEucGggICAgICAgICAgJVsiICNJTzMgIl0sICAlWyIgI0lPMyAiXSwgICVbIiAjSTMgIl0gICAgICAgICAgXG5cdCIgICAgICBcCisgICJhZGRxLnBoICAgICAgICAgICVbIiAjSU80ICJdLCAgJVsiICNJTzQgIl0sICAlWyIgI0k0ICJdICAgICAgICAgIFxuXHQiICAgICAgXAorICAiYWRkcS5waCAgICAgICAgICAlWyIgI0lPNSAiXSwgICVbIiAjSU81ICJdLCAgJVsiICNJNSAiXSAgICAgICAgICBcblx0IiAgICAgIFwKKyAgImFkZHEucGggICAgICAgICAgJVsiICNJTzYgIl0sICAlWyIgI0lPNiAiXSwgICVbIiAjSTYgIl0gICAgICAgICAgXG5cdCIgICAgICBcCisgICJhZGRxLnBoICAgICAgICAgICVbIiAjSU83ICJdLCAgJVsiICNJTzcgIl0sICAlWyIgI0k3ICJdICAgICAgICAgIFxuXHQiICAgICAgXAorICAic2hsbF9zLnBoICAgICAgICAlWyIgI0lPMCAiXSwgICVbIiAjSU8wICJdLCAgNyAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgInNobGxfcy5waCAgICAgICAgJVsiICNJTzEgIl0sICAlWyIgI0lPMSAiXSwgIDcgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJzaGxsX3MucGggICAgICAgICVbIiAjSU8yICJdLCAgJVsiICNJTzIgIl0sICA3ICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAic2hsbF9zLnBoICAgICAgICAlWyIgI0lPMyAiXSwgICVbIiAjSU8zICJdLCAgNyAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgInNobGxfcy5waCAgICAgICAgJVsiICNJTzQgIl0sICAlWyIgI0lPNCAiXSwgIDcgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJzaGxsX3MucGggICAgICAgICVbIiAjSU81ICJdLCAgJVsiICNJTzUgIl0sICA3ICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAic2hsbF9zLnBoICAgICAgICAlWyIgI0lPNiAiXSwgICVbIiAjSU82ICJdLCAgNyAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgInNobGxfcy5waCAgICAgICAgJVsiICNJTzcgIl0sICAlWyIgI0lPNyAiXSwgIDcgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJwcmVjcnF1X3MucWIucGggICVbIiAjSU8wICJdLCAgJVsiICNJTzEgIl0sICAlWyIgI0lPMCAiXSAgICAgICAgIFxuXHQiICAgICAgXAorICAicHJlY3JxdV9zLnFiLnBoICAlWyIgI0lPMiAiXSwgICVbIiAjSU8zICJdLCAgJVsiICNJTzIgIl0gICAgICAgICBcblx0IiAgICAgIFwKKyAgInByZWNycXVfcy5xYi5waCAgJVsiICNJTzQgIl0sICAlWyIgI0lPNSAiXSwgICVbIiAjSU80ICJdICAgICAgICAgXG5cdCIgICAgICBcCisgICJwcmVjcnF1X3MucWIucGggICVbIiAjSU82ICJdLCAgJVsiICNJTzcgIl0sICAlWyIgI0lPNiAiXSAgICAgICAgIFxuXHQiICAgICAgXAorICAidXN3ICAgICAgICAgICAgICAlWyIgI0lPMCAiXSwgICIgWFNUUihJMTMpICIqIiAjSTkgIiglWyIgI0k4ICJdKSAgIFxuXHQiICAgIFwKKyAgInVzdyAgICAgICAgICAgICAgJVsiICNJTzIgIl0sICAiIFhTVFIoSTEzKSAiKiIgI0kxMCAiKCVbIiAjSTggIl0pICBcblx0IiAgICBcCisgICJ1c3cgICAgICAgICAgICAgICVbIiAjSU80ICJdLCAgIiBYU1RSKEkxMykgIioiICNJMTEgIiglWyIgI0k4ICJdKSAgXG5cdCIgICAgXAorICAidXN3ICAgICAgICAgICAgICAlWyIgI0lPNiAiXSwgICIgWFNUUihJMTMpICIqIiAjSTEyICIoJVsiICNJOCAiXSkgIFxuXHQiCisKKyNkZWZpbmUgT1VUUFVUX0VBUkxZX0NMT0JCRVJfUkVHU18xMCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDogW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSwgICAgICAgICAgICAgXAorICAgIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksIFt0ZW1wNl0iPSZyIih0ZW1wNiksICAgICAgICAgICAgIFwKKyAgICBbdGVtcDddIj0mciIodGVtcDcpLCBbdGVtcDhdIj0mciIodGVtcDgpLCBbdGVtcDldIj0mciIodGVtcDkpLCAgICAgICAgICAgICBcCisgICAgW3RlbXAxMF0iPSZyIih0ZW1wMTApCisKKyNkZWZpbmUgT1VUUFVUX0VBUkxZX0NMT0JCRVJfUkVHU18xOCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIE9VVFBVVF9FQVJMWV9DTE9CQkVSX1JFR1NfMTAoKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBbdGVtcDExXSI9JnIiKHRlbXAxMSksIFt0ZW1wMTJdIj0mciIodGVtcDEyKSwgW3RlbXAxM10iPSZyIih0ZW1wMTMpLCAgICAgICAgIFwKKyAgW3RlbXAxNF0iPSZyIih0ZW1wMTQpLCBbdGVtcDE1XSI9JnIiKHRlbXAxNSksIFt0ZW1wMTZdIj0mciIodGVtcDE2KSwgICAgICAgICBcCisgIFt0ZW1wMTddIj0mciIodGVtcDE3KSwgW3RlbXAxOF0iPSZyIih0ZW1wMTgpCisKKyNlbmRpZiAgLy8gV0VCUF9EU1BfTUlQU19NQUNST19IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9tc2FfbWFjcm8uaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbXNhX21hY3JvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZhY2RhNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbXNhX21hY3JvLmgKQEAgLTAsMCArMSwxMzkyIEBACisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gTVNBIGNvbW1vbiBtYWNyb3MKKy8vCisvLyBBdXRob3Iocyk6ICBQcmFzaGFudCBQYXRpbCAgIChwcmFzaGFudC5wYXRpbEBpbWd0ZWMuY29tKQorCisjaWZuZGVmIFdFQlBfRFNQX01TQV9NQUNST19IXworI2RlZmluZSBXRUJQX0RTUF9NU0FfTUFDUk9fSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPG1zYS5oPgorCisjaWYgZGVmaW5lZChfX2NsYW5nX18pCisgICNkZWZpbmUgQ0xBTkdfQlVJTEQKKyNlbmRpZgorCisjaWZkZWYgQ0xBTkdfQlVJTEQKKyAgI2RlZmluZSBBTFBIQVZBTCAgKC0xKQorICAjZGVmaW5lIEFERFZJX0goYSwgYikgIF9fbXNhX2FkZHZpX2goKHY4aTE2KWEsIGIpCisgICNkZWZpbmUgQUREVklfVyhhLCBiKSAgX19tc2FfYWRkdmlfdygodjRpMzIpYSwgYikKKyAgI2RlZmluZSBTUkFJX0IoYSwgYikgIF9fbXNhX3NyYWlfYigodjE2aTgpYSwgYikKKyAgI2RlZmluZSBTUkFJX0goYSwgYikgIF9fbXNhX3NyYWlfaCgodjhpMTYpYSwgYikKKyAgI2RlZmluZSBTUkFJX1coYSwgYikgIF9fbXNhX3NyYWlfdygodjRpMzIpYSwgYikKKyAgI2RlZmluZSBTUkxJX0goYSwgYikgIF9fbXNhX3NybGlfaCgodjhpMTYpYSwgYikKKyAgI2RlZmluZSBTTExJX0IoYSwgYikgIF9fbXNhX3NsbGlfYigodjRpMzIpYSwgYikKKyAgI2RlZmluZSBBTkRJX0IoYSwgYikgIF9fbXNhX2FuZGlfYigodjE2dTgpYSwgYikKKyAgI2RlZmluZSBPUklfQihhLCBiKSAgIF9fbXNhX29yaV9iKCh2MTZ1OClhLCBiKQorI2Vsc2UKKyAgI2RlZmluZSBBTFBIQVZBTCAgKDB4ZmYpCisgICNkZWZpbmUgQUREVklfSChhLCBiKSAgKGEgKyBiKQorICAjZGVmaW5lIEFERFZJX1coYSwgYikgIChhICsgYikKKyAgI2RlZmluZSBTUkFJX0IoYSwgYikgIChhID4+IGIpCisgICNkZWZpbmUgU1JBSV9IKGEsIGIpICAoYSA+PiBiKQorICAjZGVmaW5lIFNSQUlfVyhhLCBiKSAgKGEgPj4gYikKKyAgI2RlZmluZSBTUkxJX0goYSwgYikgIChhIDw8IGIpCisgICNkZWZpbmUgU0xMSV9CKGEsIGIpICAoYSA8PCBiKQorICAjZGVmaW5lIEFORElfQihhLCBiKSAgKGEgJiBiKQorICAjZGVmaW5lIE9SSV9CKGEsIGIpICAgKGEgfCBiKQorI2VuZGlmCisKKyNkZWZpbmUgTERfQihSVFlQRSwgcHNyYykgKigoUlRZUEUqKShwc3JjKSkKKyNkZWZpbmUgTERfVUIoLi4uKSBMRF9CKHYxNnU4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTERfU0IoLi4uKSBMRF9CKHYxNmk4LCBfX1ZBX0FSR1NfXykKKworI2RlZmluZSBMRF9IKFJUWVBFLCBwc3JjKSAqKChSVFlQRSopKHBzcmMpKQorI2RlZmluZSBMRF9VSCguLi4pIExEX0godjh1MTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBMRF9TSCguLi4pIExEX0godjhpMTYsIF9fVkFfQVJHU19fKQorCisjZGVmaW5lIExEX1coUlRZUEUsIHBzcmMpICooKFJUWVBFKikocHNyYykpCisjZGVmaW5lIExEX1VXKC4uLikgTERfVyh2NHUzMiwgX19WQV9BUkdTX18pCisjZGVmaW5lIExEX1NXKC4uLikgTERfVyh2NGkzMiwgX19WQV9BUkdTX18pCisKKyNkZWZpbmUgU1RfQihSVFlQRSwgaW4sIHBkc3QpICooKFJUWVBFKikocGRzdCkpID0gaW4KKyNkZWZpbmUgU1RfVUIoLi4uKSBTVF9CKHYxNnU4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgU1RfU0IoLi4uKSBTVF9CKHYxNmk4LCBfX1ZBX0FSR1NfXykKKworI2RlZmluZSBTVF9IKFJUWVBFLCBpbiwgcGRzdCkgKigoUlRZUEUqKShwZHN0KSkgPSBpbgorI2RlZmluZSBTVF9VSCguLi4pIFNUX0godjh1MTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBTVF9TSCguLi4pIFNUX0godjhpMTYsIF9fVkFfQVJHU19fKQorCisjZGVmaW5lIFNUX1coUlRZUEUsIGluLCBwZHN0KSAqKChSVFlQRSopKHBkc3QpKSA9IGluCisjZGVmaW5lIFNUX1VXKC4uLikgU1RfVyh2NHUzMiwgX19WQV9BUkdTX18pCisjZGVmaW5lIFNUX1NXKC4uLikgU1RfVyh2NGkzMiwgX19WQV9BUkdTX18pCisKKyNkZWZpbmUgTVNBX0xPQURfRlVOQyhUWVBFLCBJTlNUUiwgRlVOQ19OQU1FKSAgICAgICAgICAgICBcCisgIHN0YXRpYyBpbmxpbmUgVFlQRSBGVU5DX05BTUUoY29uc3Qgdm9pZCogY29uc3QgcHNyYykgeyAgXAorICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHBzcmNfbSA9IChjb25zdCB1aW50OF90Kilwc3JjOyAgIFwKKyAgICBUWVBFIHZhbF9tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXNtIHZvbGF0aWxlICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIiIgI0lOU1RSICIgJVt2YWxfbV0sICVbcHNyY19tXSAgXG5cdCIgICAgICAgICAgICAgIFwKKyAgICAgIDogW3ZhbF9tXSAiPXIiICh2YWxfbSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICA6IFtwc3JjX21dICJtIiAoKnBzcmNfbSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiB2YWxfbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisjZGVmaW5lIE1TQV9MT0FEKHBzcmMsIEZVTkNfTkFNRSkgIEZVTkNfTkFNRShwc3JjKQorCisjZGVmaW5lIE1TQV9TVE9SRV9GVU5DKFRZUEUsIElOU1RSLCBGVU5DX05BTUUpICAgICAgICAgICAgICAgXAorICBzdGF0aWMgaW5saW5lIHZvaWQgRlVOQ19OQU1FKFRZUEUgdmFsLCB2b2lkKiBjb25zdCBwZHN0KSB7IFwKKyAgICB1aW50OF90KiBjb25zdCBwZHN0X20gPSAodWludDhfdCopcGRzdDsgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSB2YWxfbSA9IHZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFzbSB2b2xhdGlsZSAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICIgIiAjSU5TVFIgIiAgJVt2YWxfbV0sICAlW3Bkc3RfbV0gIFxuXHQiICAgICAgICAgICAgICBcCisgICAgICA6IFtwZHN0X21dICI9bSIgKCpwZHN0X20pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgOiBbdmFsX21dICJyIiAodmFsX20pKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisjZGVmaW5lIE1TQV9TVE9SRSh2YWwsIHBkc3QsIEZVTkNfTkFNRSkgIEZVTkNfTkFNRSh2YWwsIHBkc3QpCisKKyNpZiAoX19taXBzX2lzYV9yZXYgPj0gNikKKyAgTVNBX0xPQURfRlVOQyh1aW50MTZfdCwgbGgsIG1zYV9saCk7CisgICNkZWZpbmUgTEgocHNyYykgIE1TQV9MT0FEKHBzcmMsIG1zYV9saCkKKyAgTVNBX0xPQURfRlVOQyh1aW50MzJfdCwgbHcsIG1zYV9sdyk7CisgICNkZWZpbmUgTFcocHNyYykgIE1TQV9MT0FEKHBzcmMsIG1zYV9sdykKKyAgI2lmIChfX21pcHMgPT0gNjQpCisgICAgTVNBX0xPQURfRlVOQyh1aW50NjRfdCwgbGQsIG1zYV9sZCk7CisgICAgI2RlZmluZSBMRChwc3JjKSAgTVNBX0xPQUQocHNyYywgbXNhX2xkKQorICAjZWxzZSAgLy8gIShfX21pcHMgPT0gNjQpCisgICAgI2RlZmluZSBMRChwc3JjKSAgKCgoKHVpbnQ2NF90KU1TQV9MT0FEKHBzcmMgKyA0LCBtc2FfbHcpKSA8PCAzMikgfCBcCisgICAgICAgICAgICAgICAgICAgICAgIE1TQV9MT0FEKHBzcmMsIG1zYV9sdykpCisgICNlbmRpZiAgLy8gKF9fbWlwcyA9PSA2NCkKKworICBNU0FfU1RPUkVfRlVOQyh1aW50MTZfdCwgc2gsIG1zYV9zaCk7CisgICNkZWZpbmUgU0godmFsLCBwZHN0KSAgTVNBX1NUT1JFKHZhbCwgcGRzdCwgbXNhX3NoKQorICBNU0FfU1RPUkVfRlVOQyh1aW50MzJfdCwgc3csIG1zYV9zdyk7CisgICNkZWZpbmUgU1codmFsLCBwZHN0KSAgTVNBX1NUT1JFKHZhbCwgcGRzdCwgbXNhX3N3KQorICBNU0FfU1RPUkVfRlVOQyh1aW50NjRfdCwgc2QsIG1zYV9zZCk7CisgICNkZWZpbmUgU0QodmFsLCBwZHN0KSAgTVNBX1NUT1JFKHZhbCwgcGRzdCwgbXNhX3NkKQorI2Vsc2UgIC8vICEoX19taXBzX2lzYV9yZXYgPj0gNikKKyAgTVNBX0xPQURfRlVOQyh1aW50MTZfdCwgdWxoLCBtc2FfdWxoKTsKKyAgI2RlZmluZSBMSChwc3JjKSAgTVNBX0xPQUQocHNyYywgbXNhX3VsaCkKKyAgTVNBX0xPQURfRlVOQyh1aW50MzJfdCwgdWx3LCBtc2FfdWx3KTsKKyAgI2RlZmluZSBMVyhwc3JjKSAgTVNBX0xPQUQocHNyYywgbXNhX3VsdykKKyAgI2lmIChfX21pcHMgPT0gNjQpCisgICAgTVNBX0xPQURfRlVOQyh1aW50NjRfdCwgdWxkLCBtc2FfdWxkKTsKKyAgICAjZGVmaW5lIExEKHBzcmMpICBNU0FfTE9BRChwc3JjLCBtc2FfdWxkKQorICAjZWxzZSAgLy8gIShfX21pcHMgPT0gNjQpCisgICAgI2RlZmluZSBMRChwc3JjKSAgKCgoKHVpbnQ2NF90KU1TQV9MT0FEKHBzcmMgKyA0LCBtc2FfdWx3KSkgPDwgMzIpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgTVNBX0xPQUQocHNyYywgbXNhX3VsdykpCisgICNlbmRpZiAgLy8gKF9fbWlwcyA9PSA2NCkKKworICBNU0FfU1RPUkVfRlVOQyh1aW50MTZfdCwgdXNoLCBtc2FfdXNoKTsKKyAgI2RlZmluZSBTSCh2YWwsIHBkc3QpICBNU0FfU1RPUkUodmFsLCBwZHN0LCBtc2FfdXNoKQorICBNU0FfU1RPUkVfRlVOQyh1aW50MzJfdCwgdXN3LCBtc2FfdXN3KTsKKyAgI2RlZmluZSBTVyh2YWwsIHBkc3QpICBNU0FfU1RPUkUodmFsLCBwZHN0LCBtc2FfdXN3KQorICAjZGVmaW5lIFNEKHZhbCwgcGRzdCkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQ4X3QqIGNvbnN0IHBkc3Rfc2RfbSA9ICh1aW50OF90KikocGRzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVpbnQzMl90IHZhbDBfbSA9ICh1aW50MzJfdCkodmFsICYgMHgwMDAwMDAwMEZGRkZGRkZGKTsgICAgICAgICAgXAorICAgIGNvbnN0IHVpbnQzMl90IHZhbDFfbSA9ICh1aW50MzJfdCkoKHZhbCA+PiAzMikgJiAweDAwMDAwMDAwRkZGRkZGRkYpOyAgXAorICAgIFNXKHZhbDBfbSwgcGRzdF9zZF9tKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNXKHZhbDFfbSwgcGRzdF9zZF9tICsgNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorI2VuZGlmICAvLyAoX19taXBzX2lzYV9yZXYgPj0gNikKKworLyogRGVzY3JpcHRpb24gOiBMb2FkIDQgd29yZHMgd2l0aCBzdHJpZGUKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIHBzcmMsIHN0cmlkZQorICogICAgICAgICAgICAgICBPdXRwdXRzIC0gb3V0MCwgb3V0MSwgb3V0Miwgb3V0MworICogRGV0YWlscyAgICAgOiBMb2FkIHdvcmQgaW4gJ291dDAnIGZyb20gKHBzcmMpCisgKiAgICAgICAgICAgICAgIExvYWQgd29yZCBpbiAnb3V0MScgZnJvbSAocHNyYyArIHN0cmlkZSkKKyAqICAgICAgICAgICAgICAgTG9hZCB3b3JkIGluICdvdXQyJyBmcm9tIChwc3JjICsgMiAqIHN0cmlkZSkKKyAqICAgICAgICAgICAgICAgTG9hZCB3b3JkIGluICdvdXQzJyBmcm9tIChwc3JjICsgMyAqIHN0cmlkZSkKKyAqLworI2RlZmluZSBMVzQocHNyYywgc3RyaWRlLCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKSBkbyB7ICBcCisgIGNvbnN0IHVpbnQ4X3QqIHB0bXAgPSAoY29uc3QgdWludDhfdCopcHNyYzsgICAgICAgICAgIFwKKyAgb3V0MCA9IExXKHB0bXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBwdG1wICs9IHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG91dDEgPSBMVyhwdG1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHRtcCArPSBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBvdXQyID0gTFcocHRtcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHB0bXAgKz0gc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgb3V0MyA9IExXKHB0bXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworLyogRGVzY3JpcHRpb24gOiBTdG9yZSB3b3JkcyB3aXRoIHN0cmlkZQorICogQXJndW1lbnRzICAgOiBJbnB1dHMgLSBpbjAsIGluMSwgaW4yLCBpbjMsIHBkc3QsIHN0cmlkZQorICogRGV0YWlscyAgICAgOiBTdG9yZSB3b3JkIGZyb20gJ2luMCcgdG8gKHBkc3QpCisgKiAgICAgICAgICAgICAgIFN0b3JlIHdvcmQgZnJvbSAnaW4xJyB0byAocGRzdCArIHN0cmlkZSkKKyAqICAgICAgICAgICAgICAgU3RvcmUgd29yZCBmcm9tICdpbjInIHRvIChwZHN0ICsgMiAqIHN0cmlkZSkKKyAqICAgICAgICAgICAgICAgU3RvcmUgd29yZCBmcm9tICdpbjMnIHRvIChwZHN0ICsgMyAqIHN0cmlkZSkKKyAqLworI2RlZmluZSBTVzQoaW4wLCBpbjEsIGluMiwgaW4zLCBwZHN0LCBzdHJpZGUpIGRvIHsgIFwKKyAgdWludDhfdCogcHRtcCA9ICh1aW50OF90KilwZHN0OyAgICAgICAgICAgICAgICAgICBcCisgIFNXKGluMCwgcHRtcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBwdG1wICs9IHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU1coaW4xLCBwdG1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHB0bXAgKz0gc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBTVyhpbjIsIHB0bXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHRtcCArPSBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFNXKGluMywgcHRtcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBTVzMoaW4wLCBpbjEsIGluMiwgcGRzdCwgc3RyaWRlKSBkbyB7ICBcCisgIHVpbnQ4X3QqIHB0bXAgPSAodWludDhfdCopcGRzdDsgICAgICAgICAgICAgIFwKKyAgU1coaW4wLCBwdG1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBwdG1wICs9IHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFNXKGluMSwgcHRtcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHRtcCArPSBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBTVyhpbjIsIHB0bXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFNXMihpbjAsIGluMSwgcGRzdCwgc3RyaWRlKSBkbyB7ICBcCisgIHVpbnQ4X3QqIHB0bXAgPSAodWludDhfdCopcGRzdDsgICAgICAgICBcCisgIFNXKGluMCwgcHRtcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHB0bXAgKz0gc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFNXKGluMSwgcHRtcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisvKiBEZXNjcmlwdGlvbiA6IFN0b3JlIDQgZG91YmxlIHdvcmRzIHdpdGggc3RyaWRlCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAtIGluMCwgaW4xLCBpbjIsIGluMywgcGRzdCwgc3RyaWRlCisgKiBEZXRhaWxzICAgICA6IFN0b3JlIGRvdWJsZSB3b3JkIGZyb20gJ2luMCcgdG8gKHBkc3QpCisgKiAgICAgICAgICAgICAgIFN0b3JlIGRvdWJsZSB3b3JkIGZyb20gJ2luMScgdG8gKHBkc3QgKyBzdHJpZGUpCisgKiAgICAgICAgICAgICAgIFN0b3JlIGRvdWJsZSB3b3JkIGZyb20gJ2luMicgdG8gKHBkc3QgKyAyICogc3RyaWRlKQorICogICAgICAgICAgICAgICBTdG9yZSBkb3VibGUgd29yZCBmcm9tICdpbjMnIHRvIChwZHN0ICsgMyAqIHN0cmlkZSkKKyAqLworI2RlZmluZSBTRDQoaW4wLCBpbjEsIGluMiwgaW4zLCBwZHN0LCBzdHJpZGUpIGRvIHsgIFwKKyAgdWludDhfdCogcHRtcCA9ICh1aW50OF90KilwZHN0OyAgICAgICAgICAgICAgICAgICBcCisgIFNEKGluMCwgcHRtcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBwdG1wICs9IHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU0QoaW4xLCBwdG1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHB0bXAgKz0gc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBTRChpbjIsIHB0bXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHRtcCArPSBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFNEKGluMywgcHRtcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworLyogRGVzY3JpcHRpb24gOiBMb2FkIHZlY3RvcnMgd2l0aCAxNiBieXRlIGVsZW1lbnRzIHdpdGggc3RyaWRlCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAgLSBwc3JjLCBzdHJpZGUKKyAqICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEKKyAqICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBhcyBwZXIgUlRZUEUKKyAqIERldGFpbHMgICAgIDogTG9hZCAxNiBieXRlIGVsZW1lbnRzIGluICdvdXQwJyBmcm9tIChwc3JjKQorICogICAgICAgICAgICAgICBMb2FkIDE2IGJ5dGUgZWxlbWVudHMgaW4gJ291dDEnIGZyb20gKHBzcmMgKyBzdHJpZGUpCisgKi8KKyNkZWZpbmUgTERfQjIoUlRZUEUsIHBzcmMsIHN0cmlkZSwgb3V0MCwgb3V0MSkgZG8geyAgXAorICBvdXQwID0gTERfQihSVFlQRSwgcHNyYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG91dDEgPSBMRF9CKFJUWVBFLCBwc3JjICsgc3RyaWRlKTsgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIExEX1VCMiguLi4pIExEX0IyKHYxNnU4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTERfU0IyKC4uLikgTERfQjIodjE2aTgsIF9fVkFfQVJHU19fKQorCisjZGVmaW5lIExEX0IzKFJUWVBFLCBwc3JjLCBzdHJpZGUsIG91dDAsIG91dDEsIG91dDIpIGRvIHsgIFwKKyAgTERfQjIoUlRZUEUsIHBzcmMsIHN0cmlkZSwgb3V0MCwgb3V0MSk7ICAgICAgICAgICAgICAgICAgXAorICBvdXQyID0gTERfQihSVFlQRSwgcHNyYyArIDIgKiBzdHJpZGUpOyAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBMRF9VQjMoLi4uKSBMRF9CMyh2MTZ1OCwgX19WQV9BUkdTX18pCisjZGVmaW5lIExEX1NCMyguLi4pIExEX0IzKHYxNmk4LCBfX1ZBX0FSR1NfXykKKworI2RlZmluZSBMRF9CNChSVFlQRSwgcHNyYywgc3RyaWRlLCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKSBkbyB7ICBcCisgIExEX0IyKFJUWVBFLCBwc3JjLCBzdHJpZGUsIG91dDAsIG91dDEpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgTERfQjIoUlRZUEUsIHBzcmMgKyAyICogc3RyaWRlICwgc3RyaWRlLCBvdXQyLCBvdXQzKTsgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgTERfVUI0KC4uLikgTERfQjQodjE2dTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBMRF9TQjQoLi4uKSBMRF9CNCh2MTZpOCwgX19WQV9BUkdTX18pCisKKyNkZWZpbmUgTERfQjgoUlRZUEUsIHBzcmMsIHN0cmlkZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBvdXQ0LCBvdXQ1LCBvdXQ2LCBvdXQ3KSBkbyB7ICBcCisgIExEX0I0KFJUWVBFLCBwc3JjLCBzdHJpZGUsIG91dDAsIG91dDEsIG91dDIsIG91dDMpOyAgICAgICAgICAgICAgIFwKKyAgTERfQjQoUlRZUEUsIHBzcmMgKyA0ICogc3RyaWRlLCBzdHJpZGUsIG91dDQsIG91dDUsIG91dDYsIG91dDcpOyAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgTERfVUI4KC4uLikgTERfQjgodjE2dTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBMRF9TQjgoLi4uKSBMRF9COCh2MTZpOCwgX19WQV9BUkdTX18pCisKKy8qIERlc2NyaXB0aW9uIDogTG9hZCB2ZWN0b3JzIHdpdGggOCBoYWxmd29yZCBlbGVtZW50cyB3aXRoIHN0cmlkZQorICogQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gcHNyYywgc3RyaWRlCisgKiAgICAgICAgICAgICAgIE91dHB1dHMgLSBvdXQwLCBvdXQxCisgKiBEZXRhaWxzICAgICA6IExvYWQgOCBoYWxmd29yZCBlbGVtZW50cyBpbiAnb3V0MCcgZnJvbSAocHNyYykKKyAqICAgICAgICAgICAgICAgTG9hZCA4IGhhbGZ3b3JkIGVsZW1lbnRzIGluICdvdXQxJyBmcm9tIChwc3JjICsgc3RyaWRlKQorICovCisjZGVmaW5lIExEX0gyKFJUWVBFLCBwc3JjLCBzdHJpZGUsIG91dDAsIG91dDEpIGRvIHsgIFwKKyAgb3V0MCA9IExEX0goUlRZUEUsIHBzcmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBvdXQxID0gTERfSChSVFlQRSwgcHNyYyArIHN0cmlkZSk7ICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBMRF9VSDIoLi4uKSBMRF9IMih2OHUxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIExEX1NIMiguLi4pIExEX0gyKHY4aTE2LCBfX1ZBX0FSR1NfXykKKworLyogRGVzY3JpcHRpb24gOiBMb2FkIHZlY3RvcnMgd2l0aCA0IHdvcmQgZWxlbWVudHMgd2l0aCBzdHJpZGUKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIHBzcmMsIHN0cmlkZQorICogICAgICAgICAgICAgICBPdXRwdXRzIC0gb3V0MCwgb3V0MSwgb3V0Miwgb3V0MworICogRGV0YWlscyAgICAgOiBMb2FkIDQgd29yZCBlbGVtZW50cyBpbiAnb3V0MCcgZnJvbSAocHNyYyArIDAgKiBzdHJpZGUpCisgKiAgICAgICAgICAgICAgIExvYWQgNCB3b3JkIGVsZW1lbnRzIGluICdvdXQxJyBmcm9tIChwc3JjICsgMSAqIHN0cmlkZSkKKyAqICAgICAgICAgICAgICAgTG9hZCA0IHdvcmQgZWxlbWVudHMgaW4gJ291dDInIGZyb20gKHBzcmMgKyAyICogc3RyaWRlKQorICogICAgICAgICAgICAgICBMb2FkIDQgd29yZCBlbGVtZW50cyBpbiAnb3V0MycgZnJvbSAocHNyYyArIDMgKiBzdHJpZGUpCisgKi8KKyNkZWZpbmUgTERfVzIoUlRZUEUsIHBzcmMsIHN0cmlkZSwgb3V0MCwgb3V0MSkgZG8geyAgXAorICBvdXQwID0gTERfVyhSVFlQRSwgcHNyYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG91dDEgPSBMRF9XKFJUWVBFLCBwc3JjICsgc3RyaWRlKTsgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIExEX1VXMiguLi4pIExEX1cyKHY0dTMyLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTERfU1cyKC4uLikgTERfVzIodjRpMzIsIF9fVkFfQVJHU19fKQorCisjZGVmaW5lIExEX1czKFJUWVBFLCBwc3JjLCBzdHJpZGUsIG91dDAsIG91dDEsIG91dDIpIGRvIHsgIFwKKyAgTERfVzIoUlRZUEUsIHBzcmMsIHN0cmlkZSwgb3V0MCwgb3V0MSk7ICAgICAgICAgICAgICAgICAgXAorICBvdXQyID0gTERfVyhSVFlQRSwgcHNyYyArIDIgKiBzdHJpZGUpOyAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBMRF9VVzMoLi4uKSBMRF9XMyh2NHUzMiwgX19WQV9BUkdTX18pCisjZGVmaW5lIExEX1NXMyguLi4pIExEX1czKHY0aTMyLCBfX1ZBX0FSR1NfXykKKworI2RlZmluZSBMRF9XNChSVFlQRSwgcHNyYywgc3RyaWRlLCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKSBkbyB7ICBcCisgIExEX1cyKFJUWVBFLCBwc3JjLCBzdHJpZGUsIG91dDAsIG91dDEpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgTERfVzIoUlRZUEUsIHBzcmMgKyAyICogc3RyaWRlLCBzdHJpZGUsIG91dDIsIG91dDMpOyAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgTERfVVc0KC4uLikgTERfVzQodjR1MzIsIF9fVkFfQVJHU19fKQorI2RlZmluZSBMRF9TVzQoLi4uKSBMRF9XNCh2NGkzMiwgX19WQV9BUkdTX18pCisKKy8qIERlc2NyaXB0aW9uIDogU3RvcmUgdmVjdG9ycyBvZiAxNiBieXRlIGVsZW1lbnRzIHdpdGggc3RyaWRlCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAtIGluMCwgaW4xLCBwZHN0LCBzdHJpZGUKKyAqIERldGFpbHMgICAgIDogU3RvcmUgMTYgYnl0ZSBlbGVtZW50cyBmcm9tICdpbjAnIHRvIChwZHN0KQorICogICAgICAgICAgICAgICBTdG9yZSAxNiBieXRlIGVsZW1lbnRzIGZyb20gJ2luMScgdG8gKHBkc3QgKyBzdHJpZGUpCisgKi8KKyNkZWZpbmUgU1RfQjIoUlRZUEUsIGluMCwgaW4xLCBwZHN0LCBzdHJpZGUpIGRvIHsgIFwKKyAgU1RfQihSVFlQRSwgaW4wLCBwZHN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU1RfQihSVFlQRSwgaW4xLCBwZHN0ICsgc3RyaWRlKTsgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIFNUX1VCMiguLi4pIFNUX0IyKHYxNnU4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgU1RfU0IyKC4uLikgU1RfQjIodjE2aTgsIF9fVkFfQVJHU19fKQorCisjZGVmaW5lIFNUX0I0KFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsIHBkc3QsIHN0cmlkZSkgZG8geyAgXAorICBTVF9CMihSVFlQRSwgaW4wLCBpbjEsIHBkc3QsIHN0cmlkZSk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU1RfQjIoUlRZUEUsIGluMiwgaW4zLCBwZHN0ICsgMiAqIHN0cmlkZSwgc3RyaWRlKTsgICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBTVF9VQjQoLi4uKSBTVF9CNCh2MTZ1OCwgX19WQV9BUkdTX18pCisjZGVmaW5lIFNUX1NCNCguLi4pIFNUX0I0KHYxNmk4LCBfX1ZBX0FSR1NfXykKKworI2RlZmluZSBTVF9COChSVFlQRSwgaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSwgaW42LCBpbjcsICAgIFwKKyAgICAgICAgICAgICAgcGRzdCwgc3RyaWRlKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFNUX0I0KFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsIHBkc3QsIHN0cmlkZSk7ICAgICAgICAgICAgICAgXAorICBTVF9CNChSVFlQRSwgaW40LCBpbjUsIGluNiwgaW43LCBwZHN0ICsgNCAqIHN0cmlkZSwgc3RyaWRlKTsgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIFNUX1VCOCguLi4pIFNUX0I4KHYxNnU4LCBfX1ZBX0FSR1NfXykKKworLyogRGVzY3JpcHRpb24gOiBTdG9yZSB2ZWN0b3JzIG9mIDQgd29yZCBlbGVtZW50cyB3aXRoIHN0cmlkZQorICogQXJndW1lbnRzICAgOiBJbnB1dHMgLSBpbjAsIGluMSwgaW4yLCBpbjMsIHBkc3QsIHN0cmlkZQorICogRGV0YWlscyAgICAgOiBTdG9yZSA0IHdvcmQgZWxlbWVudHMgZnJvbSAnaW4wJyB0byAocGRzdCArIDAgKiBzdHJpZGUpCisgKiAgICAgICAgICAgICAgIFN0b3JlIDQgd29yZCBlbGVtZW50cyBmcm9tICdpbjEnIHRvIChwZHN0ICsgMSAqIHN0cmlkZSkKKyAqICAgICAgICAgICAgICAgU3RvcmUgNCB3b3JkIGVsZW1lbnRzIGZyb20gJ2luMicgdG8gKHBkc3QgKyAyICogc3RyaWRlKQorICogICAgICAgICAgICAgICBTdG9yZSA0IHdvcmQgZWxlbWVudHMgZnJvbSAnaW4zJyB0byAocGRzdCArIDMgKiBzdHJpZGUpCisgKi8KKyNkZWZpbmUgU1RfVzIoUlRZUEUsIGluMCwgaW4xLCBwZHN0LCBzdHJpZGUpIGRvIHsgIFwKKyAgU1RfVyhSVFlQRSwgaW4wLCBwZHN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU1RfVyhSVFlQRSwgaW4xLCBwZHN0ICsgc3RyaWRlKTsgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIFNUX1VXMiguLi4pIFNUX1cyKHY0dTMyLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgU1RfU1cyKC4uLikgU1RfVzIodjRpMzIsIF9fVkFfQVJHU19fKQorCisjZGVmaW5lIFNUX1czKFJUWVBFLCBpbjAsIGluMSwgaW4yLCBwZHN0LCBzdHJpZGUpIGRvIHsgIFwKKyAgU1RfVzIoUlRZUEUsIGluMCwgaW4xLCBwZHN0LCBzdHJpZGUpOyAgICAgICAgICAgICAgICAgXAorICBTVF9XKFJUWVBFLCBpbjIsIHBkc3QgKyAyICogc3RyaWRlKTsgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBTVF9VVzMoLi4uKSBTVF9XMyh2NHUzMiwgX19WQV9BUkdTX18pCisjZGVmaW5lIFNUX1NXMyguLi4pIFNUX1czKHY0aTMyLCBfX1ZBX0FSR1NfXykKKworI2RlZmluZSBTVF9XNChSVFlQRSwgaW4wLCBpbjEsIGluMiwgaW4zLCBwZHN0LCBzdHJpZGUpIGRvIHsgIFwKKyAgU1RfVzIoUlRZUEUsIGluMCwgaW4xLCBwZHN0LCBzdHJpZGUpOyAgICAgICAgICAgICAgICAgICAgICBcCisgIFNUX1cyKFJUWVBFLCBpbjIsIGluMywgcGRzdCArIDIgKiBzdHJpZGUsIHN0cmlkZSk7ICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgU1RfVVc0KC4uLikgU1RfVzQodjR1MzIsIF9fVkFfQVJHU19fKQorI2RlZmluZSBTVF9TVzQoLi4uKSBTVF9XNCh2NGkzMiwgX19WQV9BUkdTX18pCisKKy8qIERlc2NyaXB0aW9uIDogU3RvcmUgdmVjdG9ycyBvZiA4IGhhbGZ3b3JkIGVsZW1lbnRzIHdpdGggc3RyaWRlCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAtIGluMCwgaW4xLCBwZHN0LCBzdHJpZGUKKyAqIERldGFpbHMgICAgIDogU3RvcmUgOCBoYWxmd29yZCBlbGVtZW50cyBmcm9tICdpbjAnIHRvIChwZHN0KQorICogICAgICAgICAgICAgICBTdG9yZSA4IGhhbGZ3b3JkIGVsZW1lbnRzIGZyb20gJ2luMScgdG8gKHBkc3QgKyBzdHJpZGUpCisgKi8KKyNkZWZpbmUgU1RfSDIoUlRZUEUsIGluMCwgaW4xLCBwZHN0LCBzdHJpZGUpIGRvIHsgIFwKKyAgU1RfSChSVFlQRSwgaW4wLCBwZHN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU1RfSChSVFlQRSwgaW4xLCBwZHN0ICsgc3RyaWRlKTsgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIFNUX1VIMiguLi4pIFNUX0gyKHY4dTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgU1RfU0gyKC4uLikgU1RfSDIodjhpMTYsIF9fVkFfQVJHU19fKQorCisvKiBEZXNjcmlwdGlvbiA6IFN0b3JlIDJ4NCBieXRlIGJsb2NrIHRvIGRlc3RpbmF0aW9uIG1lbW9yeSBmcm9tIGlucHV0IHZlY3RvcgorICogQXJndW1lbnRzICAgOiBJbnB1dHMgLSBpbiwgc3RpZHgsIHBkc3QsIHN0cmlkZQorICogRGV0YWlscyAgICAgOiBJbmRleCAnc3RpZHgnIGhhbGZ3b3JkIGVsZW1lbnQgZnJvbSAnaW4nIHZlY3RvciBpcyBjb3BpZWQgdG8KKyAqICAgICAgICAgICAgICAgdGhlIEdQIHJlZ2lzdGVyIGFuZCBzdG9yZWQgdG8gKHBkc3QpCisgKiAgICAgICAgICAgICAgIEluZGV4ICdzdGlkeCsxJyBoYWxmd29yZCBlbGVtZW50IGZyb20gJ2luJyB2ZWN0b3IgaXMgY29waWVkIHRvCisgKiAgICAgICAgICAgICAgIHRoZSBHUCByZWdpc3RlciBhbmQgc3RvcmVkIHRvIChwZHN0ICsgc3RyaWRlKQorICogICAgICAgICAgICAgICBJbmRleCAnc3RpZHgrMicgaGFsZndvcmQgZWxlbWVudCBmcm9tICdpbicgdmVjdG9yIGlzIGNvcGllZCB0bworICogICAgICAgICAgICAgICB0aGUgR1AgcmVnaXN0ZXIgYW5kIHN0b3JlZCB0byAocGRzdCArIDIgKiBzdHJpZGUpCisgKiAgICAgICAgICAgICAgIEluZGV4ICdzdGlkeCszJyBoYWxmd29yZCBlbGVtZW50IGZyb20gJ2luJyB2ZWN0b3IgaXMgY29waWVkIHRvCisgKiAgICAgICAgICAgICAgIHRoZSBHUCByZWdpc3RlciBhbmQgc3RvcmVkIHRvIChwZHN0ICsgMyAqIHN0cmlkZSkKKyAqLworI2RlZmluZSBTVDJ4NF9VQihpbiwgc3RpZHgsIHBkc3QsIHN0cmlkZSkgZG8geyAgICAgICAgICAgICAgICAgICBcCisgIHVpbnQ4X3QqIHBibGtfMng0X20gPSAodWludDhfdCopcGRzdDsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDE2X3Qgb3V0MF9tID0gX19tc2FfY29weV9zX2goKHY4aTE2KWluLCBzdGlkeCk7ICAgICAgXAorICBjb25zdCB1aW50MTZfdCBvdXQxX20gPSBfX21zYV9jb3B5X3NfaCgodjhpMTYpaW4sIHN0aWR4ICsgMSk7ICBcCisgIGNvbnN0IHVpbnQxNl90IG91dDJfbSA9IF9fbXNhX2NvcHlfc19oKCh2OGkxNilpbiwgc3RpZHggKyAyKTsgIFwKKyAgY29uc3QgdWludDE2X3Qgb3V0M19tID0gX19tc2FfY29weV9zX2goKHY4aTE2KWluLCBzdGlkeCArIDMpOyAgXAorICBTSChvdXQwX20sIHBibGtfMng0X20pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHBibGtfMng0X20gKz0gc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU0gob3V0MV9tLCBwYmxrXzJ4NF9tKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBwYmxrXzJ4NF9tICs9IHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFNIKG91dDJfbSwgcGJsa18yeDRfbSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcGJsa18yeDRfbSArPSBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBTSChvdXQzX20sIHBibGtfMng0X20pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisvKiBEZXNjcmlwdGlvbiA6IFN0b3JlIDR4NCBieXRlIGJsb2NrIHRvIGRlc3RpbmF0aW9uIG1lbW9yeSBmcm9tIGlucHV0IHZlY3RvcgorICogQXJndW1lbnRzICAgOiBJbnB1dHMgLSBpbjAsIGluMSwgcGRzdCwgc3RyaWRlCisgKiBEZXRhaWxzICAgICA6ICdJZHgwJyB3b3JkIGVsZW1lbnQgZnJvbSBpbnB1dCB2ZWN0b3IgJ2luMCcgaXMgY29waWVkIHRvIHRoZQorICogICAgICAgICAgICAgICBHUCByZWdpc3RlciBhbmQgc3RvcmVkIHRvIChwZHN0KQorICogICAgICAgICAgICAgICAnSWR4MScgd29yZCBlbGVtZW50IGZyb20gaW5wdXQgdmVjdG9yICdpbjAnIGlzIGNvcGllZCB0byB0aGUKKyAqICAgICAgICAgICAgICAgR1AgcmVnaXN0ZXIgYW5kIHN0b3JlZCB0byAocGRzdCArIHN0cmlkZSkKKyAqICAgICAgICAgICAgICAgJ0lkeDInIHdvcmQgZWxlbWVudCBmcm9tIGlucHV0IHZlY3RvciAnaW4wJyBpcyBjb3BpZWQgdG8gdGhlCisgKiAgICAgICAgICAgICAgIEdQIHJlZ2lzdGVyIGFuZCBzdG9yZWQgdG8gKHBkc3QgKyAyICogc3RyaWRlKQorICogICAgICAgICAgICAgICAnSWR4Mycgd29yZCBlbGVtZW50IGZyb20gaW5wdXQgdmVjdG9yICdpbjAnIGlzIGNvcGllZCB0byB0aGUKKyAqICAgICAgICAgICAgICAgR1AgcmVnaXN0ZXIgYW5kIHN0b3JlZCB0byAocGRzdCArIDMgKiBzdHJpZGUpCisgKi8KKyNkZWZpbmUgU1Q0eDRfVUIoaW4wLCBpbjEsIGlkeDAsIGlkeDEsIGlkeDIsIGlkeDMsIHBkc3QsIHN0cmlkZSkgZG8geyAgXAorICB1aW50OF90KiBjb25zdCBwYmxrXzR4NF9tID0gKHVpbnQ4X3QqKXBkc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQzMl90IG91dDBfbSA9IF9fbXNhX2NvcHlfc193KCh2NGkzMilpbjAsIGlkeDApOyAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDMyX3Qgb3V0MV9tID0gX19tc2FfY29weV9zX3coKHY0aTMyKWluMCwgaWR4MSk7ICAgICAgICAgICAgXAorICBjb25zdCB1aW50MzJfdCBvdXQyX20gPSBfX21zYV9jb3B5X3NfdygodjRpMzIpaW4xLCBpZHgyKTsgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQzMl90IG91dDNfbSA9IF9fbXNhX2NvcHlfc193KCh2NGkzMilpbjEsIGlkeDMpOyAgICAgICAgICAgIFwKKyAgU1c0KG91dDBfbSwgb3V0MV9tLCBvdXQyX20sIG91dDNfbSwgcGJsa180eDRfbSwgc3RyaWRlKTsgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBTVDR4OF9VQihpbjAsIGluMSwgcGRzdCwgc3RyaWRlKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgXAorICB1aW50OF90KiBjb25zdCBwYmxrXzR4OCA9ICh1aW50OF90KilwZHN0OyAgICAgICAgICAgICAgICAgICAgICAgXAorICBTVDR4NF9VQihpbjAsIGluMCwgMCwgMSwgMiwgMywgcGJsa180eDgsIHN0cmlkZSk7ICAgICAgICAgICAgICAgXAorICBTVDR4NF9VQihpbjEsIGluMSwgMCwgMSwgMiwgMywgcGJsa180eDggKyA0ICogc3RyaWRlLCBzdHJpZGUpOyAgXAorfSB3aGlsZSAoMCkKKworLyogRGVzY3JpcHRpb24gOiBJbW1lZGlhdGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHNsaWRlCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAgLSBpbjAsIGluMSwgc2xpZGVfdmFsCisgKiAgICAgICAgICAgICAgIE91dHB1dHMgLSBvdXQKKyAqICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBhcyBwZXIgUlRZUEUKKyAqIERldGFpbHMgICAgIDogQnl0ZSBlbGVtZW50cyBmcm9tICdpbjEnIHZlY3RvciBhcmUgc2xpZCBpbnRvICdpbjAnIGJ5CisgKiAgICAgICAgICAgICAgIHZhbHVlIHNwZWNpZmllZCBpbiB0aGUgJ3NsaWRlX3ZhbCcKKyAqLworI2RlZmluZSBTTERJX0IoUlRZUEUsIGluMCwgaW4xLCBzbGlkZV92YWwpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKFJUWVBFKV9fbXNhX3NsZGlfYigodjE2aTgpaW4wLCAodjE2aTgpaW4xLCBzbGlkZV92YWwpICBcCisKKyNkZWZpbmUgU0xESV9VQiguLi4pIFNMRElfQih2MTZ1OCwgX19WQV9BUkdTX18pCisjZGVmaW5lIFNMRElfU0IoLi4uKSBTTERJX0IodjE2aTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBTTERJX1NIKC4uLikgU0xESV9CKHY4aTE2LCBfX1ZBX0FSR1NfXykKKworLyogRGVzY3JpcHRpb24gOiBTaHVmZmxlIGJ5dGUgdmVjdG9yIGVsZW1lbnRzIGFzIHBlciBtYXNrIHZlY3RvcgorICogQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4wLCBpbjEsIGluMiwgaW4zLCBtYXNrMCwgbWFzazEKKyAqICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEKKyAqICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBhcyBwZXIgUlRZUEUKKyAqIERldGFpbHMgICAgIDogQnl0ZSBlbGVtZW50cyBmcm9tICdpbjAnICYgJ2luMScgYXJlIGNvcGllZCBzZWxlY3RpdmVseSB0bworICogICAgICAgICAgICAgICAnb3V0MCcgYXMgcGVyIGNvbnRyb2wgdmVjdG9yICdtYXNrMCcKKyAqLworI2RlZmluZSBWU0hGX0IoUlRZUEUsIGluMCwgaW4xLCBtYXNrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKFJUWVBFKV9fbXNhX3ZzaGZfYigodjE2aTgpbWFzaywgKHYxNmk4KWluMSwgKHYxNmk4KWluMCkKKworI2RlZmluZSBWU0hGX1VCKC4uLikgVlNIRl9CKHYxNnU4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgVlNIRl9TQiguLi4pIFZTSEZfQih2MTZpOCwgX19WQV9BUkdTX18pCisjZGVmaW5lIFZTSEZfVUgoLi4uKSBWU0hGX0Iodjh1MTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBWU0hGX1NIKC4uLikgVlNIRl9CKHY4aTE2LCBfX1ZBX0FSR1NfXykKKworI2RlZmluZSBWU0hGX0IyKFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsIG1hc2swLCBtYXNrMSwgb3V0MCwgb3V0MSkgZG8geyAgXAorICBvdXQwID0gVlNIRl9CKFJUWVBFLCBpbjAsIGluMSwgbWFzazApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBvdXQxID0gVlNIRl9CKFJUWVBFLCBpbjIsIGluMywgbWFzazEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgVlNIRl9CMl9VQiguLi4pIFZTSEZfQjIodjE2dTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBWU0hGX0IyX1NCKC4uLikgVlNIRl9CMih2MTZpOCwgX19WQV9BUkdTX18pCisjZGVmaW5lIFZTSEZfQjJfVUgoLi4uKSBWU0hGX0IyKHY4dTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgVlNIRl9CMl9TSCguLi4pIFZTSEZfQjIodjhpMTYsIF9fVkFfQVJHU19fKQorCisvKiBEZXNjcmlwdGlvbiA6IFNodWZmbGUgaGFsZndvcmQgdmVjdG9yIGVsZW1lbnRzIGFzIHBlciBtYXNrIHZlY3RvcgorICogQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4wLCBpbjEsIGluMiwgaW4zLCBtYXNrMCwgbWFzazEKKyAqICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEKKyAqICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBhcyBwZXIgUlRZUEUKKyAqIERldGFpbHMgICAgIDogaGFsZndvcmQgZWxlbWVudHMgZnJvbSAnaW4wJyAmICdpbjEnIGFyZSBjb3BpZWQgc2VsZWN0aXZlbHkgdG8KKyAqICAgICAgICAgICAgICAgJ291dDAnIGFzIHBlciBjb250cm9sIHZlY3RvciAnbWFzazAnCisgKi8KKyNkZWZpbmUgVlNIRl9IMihSVFlQRSwgaW4wLCBpbjEsIGluMiwgaW4zLCBtYXNrMCwgbWFzazEsIG91dDAsIG91dDEpIGRvIHsgIFwKKyAgb3V0MCA9IChSVFlQRSlfX21zYV92c2hmX2goKHY4aTE2KW1hc2swLCAodjhpMTYpaW4xLCAodjhpMTYpaW4wKTsgICAgICAgIFwKKyAgb3V0MSA9IChSVFlQRSlfX21zYV92c2hmX2goKHY4aTE2KW1hc2sxLCAodjhpMTYpaW4zLCAodjhpMTYpaW4yKTsgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIFZTSEZfSDJfVUgoLi4uKSBWU0hGX0gyKHY4dTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgVlNIRl9IMl9TSCguLi4pIFZTSEZfSDIodjhpMTYsIF9fVkFfQVJHU19fKQorCisvKiBEZXNjcmlwdGlvbiA6IERvdCBwcm9kdWN0IG9mIGJ5dGUgdmVjdG9yIGVsZW1lbnRzCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAgLSBtdWx0MCwgbXVsdDEsIGNuc3QwLCBjbnN0MQorICogICAgICAgICAgICAgICBPdXRwdXRzIC0gb3V0MCwgb3V0MQorICogICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIGFzIHBlciBSVFlQRQorICogRGV0YWlscyAgICAgOiBTaWduZWQgYnl0ZSBlbGVtZW50cyBmcm9tICdtdWx0MCcgYXJlIG11bHRpcGxpZWQgd2l0aAorICogICAgICAgICAgICAgICBzaWduZWQgYnl0ZSBlbGVtZW50cyBmcm9tICdjbnN0MCcgcHJvZHVjaW5nIGEgcmVzdWx0CisgKiAgICAgICAgICAgICAgIHR3aWNlIHRoZSBzaXplIG9mIGlucHV0IGkuZS4gc2lnbmVkIGhhbGZ3b3JkLgorICogICAgICAgICAgICAgICBUaGUgbXVsdGlwbGljYXRpb24gcmVzdWx0IG9mIGFkamFjZW50IG9kZC1ldmVuIGVsZW1lbnRzCisgKiAgICAgICAgICAgICAgIGFyZSBhZGRlZCB0b2dldGhlciBhbmQgd3JpdHRlbiB0byB0aGUgJ291dDAnIHZlY3RvcgorKi8KKyNkZWZpbmUgRE9UUF9TQjIoUlRZUEUsIG11bHQwLCBtdWx0MSwgY25zdDAsIGNuc3QxLCBvdXQwLCBvdXQxKSBkbyB7ICBcCisgIG91dDAgPSAoUlRZUEUpX19tc2FfZG90cF9zX2goKHYxNmk4KW11bHQwLCAodjE2aTgpY25zdDApOyAgICAgICAgICAgXAorICBvdXQxID0gKFJUWVBFKV9fbXNhX2RvdHBfc19oKCh2MTZpOCltdWx0MSwgKHYxNmk4KWNuc3QxKTsgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIERPVFBfU0IyX1NIKC4uLikgRE9UUF9TQjIodjhpMTYsIF9fVkFfQVJHU19fKQorCisvKiBEZXNjcmlwdGlvbiA6IERvdCBwcm9kdWN0IG9mIGhhbGZ3b3JkIHZlY3RvciBlbGVtZW50cworICogQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gbXVsdDAsIG11bHQxLCBjbnN0MCwgY25zdDEKKyAqICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEKKyAqICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBhcyBwZXIgUlRZUEUKKyAqIERldGFpbHMgICAgIDogU2lnbmVkIGhhbGZ3b3JkIGVsZW1lbnRzIGZyb20gJ211bHQwJyBhcmUgbXVsdGlwbGllZCB3aXRoCisgKiAgICAgICAgICAgICAgIHNpZ25lZCBoYWxmd29yZCBlbGVtZW50cyBmcm9tICdjbnN0MCcgcHJvZHVjaW5nIGEgcmVzdWx0CisgKiAgICAgICAgICAgICAgIHR3aWNlIHRoZSBzaXplIG9mIGlucHV0IGkuZS4gc2lnbmVkIHdvcmQuCisgKiAgICAgICAgICAgICAgIFRoZSBtdWx0aXBsaWNhdGlvbiByZXN1bHQgb2YgYWRqYWNlbnQgb2RkLWV2ZW4gZWxlbWVudHMKKyAqICAgICAgICAgICAgICAgYXJlIGFkZGVkIHRvZ2V0aGVyIGFuZCB3cml0dGVuIHRvIHRoZSAnb3V0MCcgdmVjdG9yCisgKi8KKyNkZWZpbmUgRE9UUF9TSDIoUlRZUEUsIG11bHQwLCBtdWx0MSwgY25zdDAsIGNuc3QxLCBvdXQwLCBvdXQxKSBkbyB7ICBcCisgIG91dDAgPSAoUlRZUEUpX19tc2FfZG90cF9zX3coKHY4aTE2KW11bHQwLCAodjhpMTYpY25zdDApOyAgICAgICAgICAgXAorICBvdXQxID0gKFJUWVBFKV9fbXNhX2RvdHBfc193KCh2OGkxNiltdWx0MSwgKHY4aTE2KWNuc3QxKTsgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIERPVFBfU0gyX1NXKC4uLikgRE9UUF9TSDIodjRpMzIsIF9fVkFfQVJHU19fKQorCisvKiBEZXNjcmlwdGlvbiA6IERvdCBwcm9kdWN0IG9mIHVuc2lnbmVkIHdvcmQgdmVjdG9yIGVsZW1lbnRzCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAgLSBtdWx0MCwgbXVsdDEsIGNuc3QwLCBjbnN0MQorICogICAgICAgICAgICAgICBPdXRwdXRzIC0gb3V0MCwgb3V0MQorICogICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIGFzIHBlciBSVFlQRQorICogRGV0YWlscyAgICAgOiBVbnNpZ25lZCB3b3JkIGVsZW1lbnRzIGZyb20gJ211bHQwJyBhcmUgbXVsdGlwbGllZCB3aXRoCisgKiAgICAgICAgICAgICAgIHVuc2lnbmVkIHdvcmQgZWxlbWVudHMgZnJvbSAnY25zdDAnIHByb2R1Y2luZyBhIHJlc3VsdAorICogICAgICAgICAgICAgICB0d2ljZSB0aGUgc2l6ZSBvZiBpbnB1dCBpLmUuIHVuc2lnbmVkIGRvdWJsZSB3b3JkLgorICogICAgICAgICAgICAgICBUaGUgbXVsdGlwbGljYXRpb24gcmVzdWx0IG9mIGFkamFjZW50IG9kZC1ldmVuIGVsZW1lbnRzCisgKiAgICAgICAgICAgICAgIGFyZSBhZGRlZCB0b2dldGhlciBhbmQgd3JpdHRlbiB0byB0aGUgJ291dDAnIHZlY3RvcgorICovCisjZGVmaW5lIERPVFBfVVcyKFJUWVBFLCBtdWx0MCwgbXVsdDEsIGNuc3QwLCBjbnN0MSwgb3V0MCwgb3V0MSkgZG8geyAgXAorICBvdXQwID0gKFJUWVBFKV9fbXNhX2RvdHBfdV9kKCh2NHUzMiltdWx0MCwgKHY0dTMyKWNuc3QwKTsgICAgICAgICAgIFwKKyAgb3V0MSA9IChSVFlQRSlfX21zYV9kb3RwX3VfZCgodjR1MzIpbXVsdDEsICh2NHUzMiljbnN0MSk7ICAgICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBET1RQX1VXMl9VRCguLi4pIERPVFBfVVcyKHYydTY0LCBfX1ZBX0FSR1NfXykKKworLyogRGVzY3JpcHRpb24gOiBEb3QgcHJvZHVjdCAmIGFkZGl0aW9uIG9mIGhhbGZ3b3JkIHZlY3RvciBlbGVtZW50cworICogQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gbXVsdDAsIG11bHQxLCBjbnN0MCwgY25zdDEKKyAqICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEKKyAqICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBhcyBwZXIgUlRZUEUKKyAqIERldGFpbHMgICAgIDogU2lnbmVkIGhhbGZ3b3JkIGVsZW1lbnRzIGZyb20gJ211bHQwJyBhcmUgbXVsdGlwbGllZCB3aXRoCisgKiAgICAgICAgICAgICAgIHNpZ25lZCBoYWxmd29yZCBlbGVtZW50cyBmcm9tICdjbnN0MCcgcHJvZHVjaW5nIGEgcmVzdWx0CisgKiAgICAgICAgICAgICAgIHR3aWNlIHRoZSBzaXplIG9mIGlucHV0IGkuZS4gc2lnbmVkIHdvcmQuCisgKiAgICAgICAgICAgICAgIFRoZSBtdWx0aXBsaWNhdGlvbiByZXN1bHQgb2YgYWRqYWNlbnQgb2RkLWV2ZW4gZWxlbWVudHMKKyAqICAgICAgICAgICAgICAgYXJlIGFkZGVkIHRvIHRoZSAnb3V0MCcgdmVjdG9yCisgKi8KKyNkZWZpbmUgRFBBRERfU0gyKFJUWVBFLCBtdWx0MCwgbXVsdDEsIGNuc3QwLCBjbnN0MSwgb3V0MCwgb3V0MSkgZG8geyAgICAgIFwKKyAgb3V0MCA9IChSVFlQRSlfX21zYV9kcGFkZF9zX3coKHY0aTMyKW91dDAsICh2OGkxNiltdWx0MCwgKHY4aTE2KWNuc3QwKTsgIFwKKyAgb3V0MSA9IChSVFlQRSlfX21zYV9kcGFkZF9zX3coKHY0aTMyKW91dDEsICh2OGkxNiltdWx0MSwgKHY4aTE2KWNuc3QxKTsgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIERQQUREX1NIMl9TVyguLi4pIERQQUREX1NIMih2NGkzMiwgX19WQV9BUkdTX18pCisKKy8qIERlc2NyaXB0aW9uIDogQ2xpcHMgYWxsIHNpZ25lZCBoYWxmd29yZCBlbGVtZW50cyBvZiBpbnB1dCB2ZWN0b3IKKyAqICAgICAgICAgICAgICAgYmV0d2VlbiAwICYgMjU1CisgKiBBcmd1bWVudHMgICA6IElucHV0L291dHB1dCAgLSB2YWwKKyAqICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBzaWduZWQgaGFsZndvcmQKKyAqLworI2RlZmluZSBDTElQX1NIXzBfMjU1KHZhbCkgZG8geyAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHY4aTE2IG1heF9tID0gX19tc2FfbGRpX2goMjU1KTsgICAgICAgICAgIFwKKyAgdmFsID0gX19tc2FfbWF4aV9zX2goKHY4aTE2KXZhbCwgMCk7ICAgICAgICAgICAgXAorICB2YWwgPSBfX21zYV9taW5fc19oKG1heF9tLCAodjhpMTYpdmFsKTsgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIENMSVBfU0gyXzBfMjU1KGluMCwgaW4xKSBkbyB7ICBcCisgIENMSVBfU0hfMF8yNTUoaW4wKTsgICAgICAgICAgICAgICAgICBcCisgIENMSVBfU0hfMF8yNTUoaW4xKTsgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIENMSVBfU0g0XzBfMjU1KGluMCwgaW4xLCBpbjIsIGluMykgZG8geyAgXAorICBDTElQX1NIMl8wXzI1NShpbjAsIGluMSk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQ0xJUF9TSDJfMF8yNTUoaW4yLCBpbjMpOyAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisvKiBEZXNjcmlwdGlvbiA6IENsaXBzIGFsbCB1bnNpZ25lZCBoYWxmd29yZCBlbGVtZW50cyBvZiBpbnB1dCB2ZWN0b3IKKyAqICAgICAgICAgICAgICAgYmV0d2VlbiAwICYgMjU1CisgKiBBcmd1bWVudHMgICA6IElucHV0ICAtIGluCisgKiAgICAgICAgICAgICAgIE91dHB1dCAtIG91dF9tCisgKiAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gdW5zaWduZWQgaGFsZndvcmQKKyAqLworI2RlZmluZSBDTElQX1VIXzBfMjU1KGluKSBkbyB7ICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHY4dTE2IG1heF9tID0gKHY4dTE2KV9fbXNhX2xkaV9oKDI1NSk7ICAgIFwKKyAgaW4gPSBfX21zYV9tYXhpX3VfaCgodjh1MTYpIGluLCAwKTsgICAgICAgICAgICAgXAorICBpbiA9IF9fbXNhX21pbl91X2goKHY4dTE2KSBtYXhfbSwgKHY4dTE2KSBpbik7ICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIENMSVBfVUgyXzBfMjU1KGluMCwgaW4xKSBkbyB7ICBcCisgIENMSVBfVUhfMF8yNTUoaW4wKTsgICAgICAgICAgICAgICAgICBcCisgIENMSVBfVUhfMF8yNTUoaW4xKTsgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisvKiBEZXNjcmlwdGlvbiA6IENsaXBzIGFsbCBzaWduZWQgd29yZCBlbGVtZW50cyBvZiBpbnB1dCB2ZWN0b3IKKyAqICAgICAgICAgICAgICAgYmV0d2VlbiAwICYgMjU1CisgKiBBcmd1bWVudHMgICA6IElucHV0L291dHB1dCAgLSB2YWwKKyAqICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBzaWduZWQgd29yZAorICovCisjZGVmaW5lIENMSVBfU1dfMF8yNTUodmFsKSBkbyB7ICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdjRpMzIgbWF4X20gPSBfX21zYV9sZGlfdygyNTUpOyAgICAgICAgICAgXAorICB2YWwgPSBfX21zYV9tYXhpX3NfdygodjRpMzIpdmFsLCAwKTsgICAgICAgICAgICBcCisgIHZhbCA9IF9fbXNhX21pbl9zX3cobWF4X20sICh2NGkzMil2YWwpOyAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQ0xJUF9TVzRfMF8yNTUoaW4wLCBpbjEsIGluMiwgaW4zKSBkbyB7ICAgXAorICBDTElQX1NXXzBfMjU1KGluMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIENMSVBfU1dfMF8yNTUoaW4xKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQ0xJUF9TV18wXzI1NShpbjIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBDTElQX1NXXzBfMjU1KGluMyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisvKiBEZXNjcmlwdGlvbiA6IEhvcml6b250YWwgYWRkaXRpb24gb2YgNCBzaWduZWQgd29yZCBlbGVtZW50cyBvZiBpbnB1dCB2ZWN0b3IKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXQgIC0gaW4gICAgICAgKHNpZ25lZCB3b3JkIHZlY3RvcikKKyAqICAgICAgICAgICAgICAgT3V0cHV0IC0gc3VtX20gICAgKGkzMiBzdW0pCisgKiAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gc2lnbmVkIHdvcmQgKEdQKQorICogRGV0YWlscyAgICAgOiA0IHNpZ25lZCB3b3JkIGVsZW1lbnRzIG9mICdpbicgdmVjdG9yIGFyZSBhZGRlZCB0b2dldGhlciBhbmQKKyAqICAgICAgICAgICAgICAgdGhlIHJlc3VsdGluZyBpbnRlZ2VyIHN1bSBpcyByZXR1cm5lZAorICovCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50MzJfdCBmdW5jX2hhZGRfc3dfczMyKHY0aTMyIGluKSB7CisgIGNvbnN0IHYyaTY0IHJlczBfbSA9IF9fbXNhX2hhZGRfc19kKCh2NGkzMilpbiwgKHY0aTMyKWluKTsKKyAgY29uc3QgdjJpNjQgcmVzMV9tID0gX19tc2Ffc3BsYXRpX2QocmVzMF9tLCAxKTsKKyAgY29uc3QgdjJpNjQgb3V0ID0gcmVzMF9tICsgcmVzMV9tOworICBpbnQzMl90IHN1bV9tID0gX19tc2FfY29weV9zX3coKHY0aTMyKW91dCwgMCk7CisgIHJldHVybiBzdW1fbTsKK30KKyNkZWZpbmUgSEFERF9TV19TMzIoaW4pIGZ1bmNfaGFkZF9zd19zMzIoaW4pCisKKy8qIERlc2NyaXB0aW9uIDogSG9yaXpvbnRhbCBhZGRpdGlvbiBvZiA4IHNpZ25lZCBoYWxmd29yZCBlbGVtZW50cworICogQXJndW1lbnRzICAgOiBJbnB1dCAgLSBpbiAgICAgICAoc2lnbmVkIGhhbGZ3b3JkIHZlY3RvcikKKyAqICAgICAgICAgICAgICAgT3V0cHV0IC0gc3VtX20gICAgKHMzMiBzdW0pCisgKiAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gc2lnbmVkIHdvcmQKKyAqIERldGFpbHMgICAgIDogOCBzaWduZWQgaGFsZndvcmQgZWxlbWVudHMgb2YgaW5wdXQgdmVjdG9yIGFyZSBhZGRlZAorICogICAgICAgICAgICAgICB0b2dldGhlciBhbmQgdGhlIHJlc3VsdGluZyBpbnRlZ2VyIHN1bSBpcyByZXR1cm5lZAorICovCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50MzJfdCBmdW5jX2hhZGRfc2hfczMyKHY4aTE2IGluKSB7CisgIGNvbnN0IHY0aTMyIHJlcyA9IF9fbXNhX2hhZGRfc193KGluLCBpbik7CisgIGNvbnN0IHYyaTY0IHJlczAgPSBfX21zYV9oYWRkX3NfZChyZXMsIHJlcyk7CisgIGNvbnN0IHYyaTY0IHJlczEgPSBfX21zYV9zcGxhdGlfZChyZXMwLCAxKTsKKyAgY29uc3QgdjJpNjQgcmVzMiA9IHJlczAgKyByZXMxOworICBjb25zdCBpbnQzMl90IHN1bV9tID0gX19tc2FfY29weV9zX3coKHY0aTMyKXJlczIsIDApOworICByZXR1cm4gc3VtX207Cit9CisjZGVmaW5lIEhBRERfU0hfUzMyKGluKSBmdW5jX2hhZGRfc2hfczMyKGluKQorCisvKiBEZXNjcmlwdGlvbiA6IEhvcml6b250YWwgYWRkaXRpb24gb2YgOCB1bnNpZ25lZCBoYWxmd29yZCBlbGVtZW50cworICogQXJndW1lbnRzICAgOiBJbnB1dCAgLSBpbiAgICAgICAodW5zaWduZWQgaGFsZndvcmQgdmVjdG9yKQorICogICAgICAgICAgICAgICBPdXRwdXQgLSBzdW1fbSAgICAodTMyIHN1bSkKKyAqICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSB1bnNpZ25lZCB3b3JkCisgKiBEZXRhaWxzICAgICA6IDggdW5zaWduZWQgaGFsZndvcmQgZWxlbWVudHMgb2YgaW5wdXQgdmVjdG9yIGFyZSBhZGRlZAorICogICAgICAgICAgICAgICB0b2dldGhlciBhbmQgdGhlIHJlc3VsdGluZyBpbnRlZ2VyIHN1bSBpcyByZXR1cm5lZAorICovCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgZnVuY19oYWRkX3VoX3UzMih2OHUxNiBpbikgeworICB1aW50MzJfdCBzdW1fbTsKKyAgY29uc3QgdjR1MzIgcmVzX20gPSBfX21zYV9oYWRkX3VfdyhpbiwgaW4pOworICB2MnU2NCByZXMwX20gPSBfX21zYV9oYWRkX3VfZChyZXNfbSwgcmVzX20pOworICB2MnU2NCByZXMxX20gPSAodjJ1NjQpX19tc2Ffc3BsYXRpX2QoKHYyaTY0KXJlczBfbSwgMSk7CisgIHJlczBfbSA9IHJlczBfbSArIHJlczFfbTsKKyAgc3VtX20gPSBfX21zYV9jb3B5X3NfdygodjRpMzIpcmVzMF9tLCAwKTsKKyAgcmV0dXJuIHN1bV9tOworfQorI2RlZmluZSBIQUREX1VIX1UzMihpbikgZnVuY19oYWRkX3VoX3UzMihpbikKKworLyogRGVzY3JpcHRpb24gOiBIb3Jpem9udGFsIGFkZGl0aW9uIG9mIHNpZ25lZCBoYWxmIHdvcmQgdmVjdG9yIGVsZW1lbnRzCisgICBBcmd1bWVudHMgICA6IElucHV0cyAgLSBpbjAsIGluMQorICAgICAgICAgICAgICAgICBPdXRwdXRzIC0gb3V0MCwgb3V0MQorICAgICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIGFzIHBlciBSVFlQRQorICAgRGV0YWlscyAgICAgOiBFYWNoIHNpZ25lZCBvZGQgaGFsZiB3b3JkIGVsZW1lbnQgZnJvbSAnaW4wJyBpcyBhZGRlZCB0bworICAgICAgICAgICAgICAgICBldmVuIHNpZ25lZCBoYWxmIHdvcmQgZWxlbWVudCBmcm9tICdpbjAnIChwYWlyd2lzZSkgYW5kIHRoZQorICAgICAgICAgICAgICAgICBoYWxmd29yZCByZXN1bHQgaXMgd3JpdHRlbiBpbiAnb3V0MCcKKyovCisjZGVmaW5lIEhBRERfU0gyKFJUWVBFLCBpbjAsIGluMSwgb3V0MCwgb3V0MSkgZG8geyAgICAgICBcCisgIG91dDAgPSAoUlRZUEUpX19tc2FfaGFkZF9zX3coKHY4aTE2KWluMCwgKHY4aTE2KWluMCk7ICBcCisgIG91dDEgPSAoUlRZUEUpX19tc2FfaGFkZF9zX3coKHY4aTE2KWluMSwgKHY4aTE2KWluMSk7ICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBIQUREX1NIMl9TVyguLi4pIEhBRERfU0gyKHY0aTMyLCBfX1ZBX0FSR1NfXykKKworI2RlZmluZSBIQUREX1NINChSVFlQRSwgaW4wLCBpbjEsIGluMiwgaW4zLCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKSBkbyB7ICBcCisgIEhBRERfU0gyKFJUWVBFLCBpbjAsIGluMSwgb3V0MCwgb3V0MSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSEFERF9TSDIoUlRZUEUsIGluMiwgaW4zLCBvdXQyLCBvdXQzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgSEFERF9TSDRfU1coLi4uKSBIQUREX1NINCh2NGkzMiwgX19WQV9BUkdTX18pCisKKy8qIERlc2NyaXB0aW9uIDogSG9yaXpvbnRhbCBzdWJ0cmFjdGlvbiBvZiB1bnNpZ25lZCBieXRlIHZlY3RvciBlbGVtZW50cworICogQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4wLCBpbjEKKyAqICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEKKyAqICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBhcyBwZXIgUlRZUEUKKyAqIERldGFpbHMgICAgIDogRWFjaCB1bnNpZ25lZCBvZGQgYnl0ZSBlbGVtZW50IGZyb20gJ2luMCcgaXMgc3VidHJhY3RlZCBmcm9tCisgKiAgICAgICAgICAgICAgIGV2ZW4gdW5zaWduZWQgYnl0ZSBlbGVtZW50IGZyb20gJ2luMCcgKHBhaXJ3aXNlKSBhbmQgdGhlCisgKiAgICAgICAgICAgICAgIGhhbGZ3b3JkIHJlc3VsdCBpcyB3cml0dGVuIHRvICdvdXQwJworICovCisjZGVmaW5lIEhTVUJfVUIyKFJUWVBFLCBpbjAsIGluMSwgb3V0MCwgb3V0MSkgZG8geyAgICAgICBcCisgIG91dDAgPSAoUlRZUEUpX19tc2FfaHN1Yl91X2goKHYxNnU4KWluMCwgKHYxNnU4KWluMCk7ICBcCisgIG91dDEgPSAoUlRZUEUpX19tc2FfaHN1Yl91X2goKHYxNnU4KWluMSwgKHYxNnU4KWluMSk7ICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBIU1VCX1VCMl9VSCguLi4pIEhTVUJfVUIyKHY4dTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSFNVQl9VQjJfU0goLi4uKSBIU1VCX1VCMih2OGkxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIEhTVUJfVUIyX1NXKC4uLikgSFNVQl9VQjIodjRpMzIsIF9fVkFfQVJHU19fKQorCisvKiBEZXNjcmlwdGlvbiA6IFNldCBlbGVtZW50IG4gaW5wdXQgdmVjdG9yIHRvIEdQUiB2YWx1ZQorICogQXJndW1lbnRzICAgOiBJbnB1dHMgLSBpbjAsIGluMSwgaW4yLCBpbjMKKyAqICAgICAgICAgICAgICAgT3V0cHV0IC0gb3V0CisgKiAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gYXMgcGVyIFJUWVBFCisgKiBEZXRhaWxzICAgICA6IFNldCBlbGVtZW50IDAgaW4gdmVjdG9yICdvdXQnIHRvIHZhbHVlIHNwZWNpZmllZCBpbiAnaW4wJworICovCisjZGVmaW5lIElOU0VSVF9XMihSVFlQRSwgaW4wLCBpbjEsIG91dCkgZG8geyAgICAgICAgXAorICBvdXQgPSAoUlRZUEUpX19tc2FfaW5zZXJ0X3coKHY0aTMyKW91dCwgMCwgaW4wKTsgIFwKKyAgb3V0ID0gKFJUWVBFKV9fbXNhX2luc2VydF93KCh2NGkzMilvdXQsIDEsIGluMSk7ICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBJTlNFUlRfVzJfVUIoLi4uKSBJTlNFUlRfVzIodjE2dTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTlNFUlRfVzJfU0IoLi4uKSBJTlNFUlRfVzIodjE2aTgsIF9fVkFfQVJHU19fKQorCisjZGVmaW5lIElOU0VSVF9XNChSVFlQRSwgaW4wLCBpbjEsIGluMiwgaW4zLCBvdXQpIGRvIHsgIFwKKyAgb3V0ID0gKFJUWVBFKV9fbXNhX2luc2VydF93KCh2NGkzMilvdXQsIDAsIGluMCk7ICAgICAgXAorICBvdXQgPSAoUlRZUEUpX19tc2FfaW5zZXJ0X3coKHY0aTMyKW91dCwgMSwgaW4xKTsgICAgICBcCisgIG91dCA9IChSVFlQRSlfX21zYV9pbnNlcnRfdygodjRpMzIpb3V0LCAyLCBpbjIpOyAgICAgIFwKKyAgb3V0ID0gKFJUWVBFKV9fbXNhX2luc2VydF93KCh2NGkzMilvdXQsIDMsIGluMyk7ICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgSU5TRVJUX1c0X1VCKC4uLikgSU5TRVJUX1c0KHYxNnU4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSU5TRVJUX1c0X1NCKC4uLikgSU5TRVJUX1c0KHYxNmk4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSU5TRVJUX1c0X1NXKC4uLikgSU5TRVJUX1c0KHY0aTMyLCBfX1ZBX0FSR1NfXykKKworLyogRGVzY3JpcHRpb24gOiBTZXQgZWxlbWVudCBuIG9mIGRvdWJsZSB3b3JkIGlucHV0IHZlY3RvciB0byBHUFIgdmFsdWUKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzIC0gaW4wLCBpbjEKKyAqICAgICAgICAgICAgICAgT3V0cHV0IC0gb3V0CisgKiAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gYXMgcGVyIFJUWVBFCisgKiBEZXRhaWxzICAgICA6IFNldCBlbGVtZW50IDAgaW4gdmVjdG9yICdvdXQnIHRvIEdQUiB2YWx1ZSBzcGVjaWZpZWQgaW4gJ2luMCcKKyAqICAgICAgICAgICAgICAgU2V0IGVsZW1lbnQgMSBpbiB2ZWN0b3IgJ291dCcgdG8gR1BSIHZhbHVlIHNwZWNpZmllZCBpbiAnaW4xJworICovCisjZGVmaW5lIElOU0VSVF9EMihSVFlQRSwgaW4wLCBpbjEsIG91dCkgZG8geyAgICAgICAgXAorICBvdXQgPSAoUlRZUEUpX19tc2FfaW5zZXJ0X2QoKHYyaTY0KW91dCwgMCwgaW4wKTsgIFwKKyAgb3V0ID0gKFJUWVBFKV9fbXNhX2luc2VydF9kKCh2Mmk2NClvdXQsIDEsIGluMSk7ICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBJTlNFUlRfRDJfVUIoLi4uKSBJTlNFUlRfRDIodjE2dTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTlNFUlRfRDJfU0IoLi4uKSBJTlNFUlRfRDIodjE2aTgsIF9fVkFfQVJHU19fKQorCisvKiBEZXNjcmlwdGlvbiA6IEludGVybGVhdmUgZXZlbiBieXRlIGVsZW1lbnRzIGZyb20gdmVjdG9ycworICogQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4wLCBpbjEsIGluMiwgaW4zCisgKiAgICAgICAgICAgICAgIE91dHB1dHMgLSBvdXQwLCBvdXQxCisgKiAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gYXMgcGVyIFJUWVBFCisgKiBEZXRhaWxzICAgICA6IEV2ZW4gYnl0ZSBlbGVtZW50cyBvZiAnaW4wJyBhbmQgJ2luMScgYXJlIGludGVybGVhdmVkCisgKiAgICAgICAgICAgICAgIGFuZCB3cml0dGVuIHRvICdvdXQwJworICovCisjZGVmaW5lIElMVkVWX0IyKFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsIG91dDAsIG91dDEpIGRvIHsgIFwKKyAgb3V0MCA9IChSVFlQRSlfX21zYV9pbHZldl9iKCh2MTZpOClpbjEsICh2MTZpOClpbjApOyAgICAgICAgXAorICBvdXQxID0gKFJUWVBFKV9fbXNhX2lsdmV2X2IoKHYxNmk4KWluMywgKHYxNmk4KWluMik7ICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBJTFZFVl9CMl9VQiguLi4pIElMVkVWX0IyKHYxNnU4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWRVZfQjJfU0IoLi4uKSBJTFZFVl9CMih2MTZpOCwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVkVWX0IyX1VIKC4uLikgSUxWRVZfQjIodjh1MTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZFVl9CMl9TSCguLi4pIElMVkVWX0IyKHY4aTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWRVZfQjJfU0QoLi4uKSBJTFZFVl9CMih2Mmk2NCwgX19WQV9BUkdTX18pCisKKy8qIERlc2NyaXB0aW9uIDogSW50ZXJsZWF2ZSBvZGQgYnl0ZSBlbGVtZW50cyBmcm9tIHZlY3RvcnMKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIGluMCwgaW4xLCBpbjIsIGluMworICogICAgICAgICAgICAgICBPdXRwdXRzIC0gb3V0MCwgb3V0MQorICogICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIGFzIHBlciBSVFlQRQorICogRGV0YWlscyAgICAgOiBPZGQgYnl0ZSBlbGVtZW50cyBvZiAnaW4wJyBhbmQgJ2luMScgYXJlIGludGVybGVhdmVkCisgKiAgICAgICAgICAgICAgIGFuZCB3cml0dGVuIHRvICdvdXQwJworICovCisjZGVmaW5lIElMVk9EX0IyKFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsIG91dDAsIG91dDEpIGRvIHsgIFwKKyAgb3V0MCA9IChSVFlQRSlfX21zYV9pbHZvZF9iKCh2MTZpOClpbjEsICh2MTZpOClpbjApOyAgICAgICAgXAorICBvdXQxID0gKFJUWVBFKV9fbXNhX2lsdm9kX2IoKHYxNmk4KWluMywgKHYxNmk4KWluMik7ICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBJTFZPRF9CMl9VQiguLi4pIElMVk9EX0IyKHYxNnU4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWT0RfQjJfU0IoLi4uKSBJTFZPRF9CMih2MTZpOCwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVk9EX0IyX1VIKC4uLikgSUxWT0RfQjIodjh1MTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZPRF9CMl9TSCguLi4pIElMVk9EX0IyKHY4aTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWT0RfQjJfU0QoLi4uKSBJTFZPRF9CMih2Mmk2NCwgX19WQV9BUkdTX18pCisKKy8qIERlc2NyaXB0aW9uIDogSW50ZXJsZWF2ZSBldmVuIGhhbGZ3b3JkIGVsZW1lbnRzIGZyb20gdmVjdG9ycworICogQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4wLCBpbjEsIGluMiwgaW4zCisgKiAgICAgICAgICAgICAgIE91dHB1dHMgLSBvdXQwLCBvdXQxCisgKiAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gYXMgcGVyIFJUWVBFCisgKiBEZXRhaWxzICAgICA6IEV2ZW4gaGFsZndvcmQgZWxlbWVudHMgb2YgJ2luMCcgYW5kICdpbjEnIGFyZSBpbnRlcmxlYXZlZAorICogICAgICAgICAgICAgICBhbmQgd3JpdHRlbiB0byAnb3V0MCcKKyAqLworI2RlZmluZSBJTFZFVl9IMihSVFlQRSwgaW4wLCBpbjEsIGluMiwgaW4zLCBvdXQwLCBvdXQxKSBkbyB7ICBcCisgIG91dDAgPSAoUlRZUEUpX19tc2FfaWx2ZXZfaCgodjhpMTYpaW4xLCAodjhpMTYpaW4wKTsgICAgICAgIFwKKyAgb3V0MSA9IChSVFlQRSlfX21zYV9pbHZldl9oKCh2OGkxNilpbjMsICh2OGkxNilpbjIpOyAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgSUxWRVZfSDJfVUIoLi4uKSBJTFZFVl9IMih2MTZ1OCwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVkVWX0gyX1VIKC4uLikgSUxWRVZfSDIodjh1MTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZFVl9IMl9TSCguLi4pIElMVkVWX0gyKHY4aTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWRVZfSDJfU1coLi4uKSBJTFZFVl9IMih2NGkzMiwgX19WQV9BUkdTX18pCisKKy8qIERlc2NyaXB0aW9uIDogSW50ZXJsZWF2ZSBvZGQgaGFsZndvcmQgZWxlbWVudHMgZnJvbSB2ZWN0b3JzCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAgLSBpbjAsIGluMSwgaW4yLCBpbjMKKyAqICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEKKyAqICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBhcyBwZXIgUlRZUEUKKyAqIERldGFpbHMgICAgIDogT2RkIGhhbGZ3b3JkIGVsZW1lbnRzIG9mICdpbjAnIGFuZCAnaW4xJyBhcmUgaW50ZXJsZWF2ZWQKKyAqICAgICAgICAgICAgICAgYW5kIHdyaXR0ZW4gdG8gJ291dDAnCisgKi8KKyNkZWZpbmUgSUxWT0RfSDIoUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgb3V0MCwgb3V0MSkgZG8geyAgXAorICBvdXQwID0gKFJUWVBFKV9fbXNhX2lsdm9kX2goKHY4aTE2KWluMSwgKHY4aTE2KWluMCk7ICAgICAgICBcCisgIG91dDEgPSAoUlRZUEUpX19tc2FfaWx2b2RfaCgodjhpMTYpaW4zLCAodjhpMTYpaW4yKTsgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIElMVk9EX0gyX1VCKC4uLikgSUxWT0RfSDIodjE2dTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZPRF9IMl9VSCguLi4pIElMVk9EX0gyKHY4dTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWT0RfSDJfU0goLi4uKSBJTFZPRF9IMih2OGkxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVk9EX0gyX1NXKC4uLikgSUxWT0RfSDIodjRpMzIsIF9fVkFfQVJHU19fKQorCisvKiBEZXNjcmlwdGlvbiA6IEludGVybGVhdmUgZXZlbiB3b3JkIGVsZW1lbnRzIGZyb20gdmVjdG9ycworICogQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4wLCBpbjEsIGluMiwgaW4zCisgKiAgICAgICAgICAgICAgIE91dHB1dHMgLSBvdXQwLCBvdXQxCisgKiAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gYXMgcGVyIFJUWVBFCisgKiBEZXRhaWxzICAgICA6IEV2ZW4gd29yZCBlbGVtZW50cyBvZiAnaW4wJyBhbmQgJ2luMScgYXJlIGludGVybGVhdmVkCisgKiAgICAgICAgICAgICAgIGFuZCB3cml0dGVuIHRvICdvdXQwJworICovCisjZGVmaW5lIElMVkVWX1cyKFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsIG91dDAsIG91dDEpIGRvIHsgIFwKKyAgb3V0MCA9IChSVFlQRSlfX21zYV9pbHZldl93KCh2NGkzMilpbjEsICh2NGkzMilpbjApOyAgICAgICAgXAorICBvdXQxID0gKFJUWVBFKV9fbXNhX2lsdmV2X3coKHY0aTMyKWluMywgKHY0aTMyKWluMik7ICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBJTFZFVl9XMl9VQiguLi4pIElMVkVWX1cyKHYxNnU4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWRVZfVzJfU0IoLi4uKSBJTFZFVl9XMih2MTZpOCwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVkVWX1cyX1VIKC4uLikgSUxWRVZfVzIodjh1MTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZFVl9XMl9TRCguLi4pIElMVkVWX1cyKHYyaTY0LCBfX1ZBX0FSR1NfXykKKworLyogRGVzY3JpcHRpb24gOiBJbnRlcmxlYXZlIGV2ZW4tb2RkIHdvcmQgZWxlbWVudHMgZnJvbSB2ZWN0b3JzCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAgLSBpbjAsIGluMSwgaW4yLCBpbjMKKyAqICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEKKyAqICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBhcyBwZXIgUlRZUEUKKyAqIERldGFpbHMgICAgIDogRXZlbiB3b3JkIGVsZW1lbnRzIG9mICdpbjAnIGFuZCAnaW4xJyBhcmUgaW50ZXJsZWF2ZWQKKyAqICAgICAgICAgICAgICAgYW5kIHdyaXR0ZW4gdG8gJ291dDAnCisgKiAgICAgICAgICAgICAgIE9kZCB3b3JkIGVsZW1lbnRzIG9mICdpbjInIGFuZCAnaW4zJyBhcmUgaW50ZXJsZWF2ZWQKKyAqICAgICAgICAgICAgICAgYW5kIHdyaXR0ZW4gdG8gJ291dDEnCisgKi8KKyNkZWZpbmUgSUxWRVZPRF9XMihSVFlQRSwgaW4wLCBpbjEsIGluMiwgaW4zLCBvdXQwLCBvdXQxKSBkbyB7ICBcCisgIG91dDAgPSAoUlRZUEUpX19tc2FfaWx2ZXZfdygodjRpMzIpaW4xLCAodjRpMzIpaW4wKTsgICAgICAgICAgXAorICBvdXQxID0gKFJUWVBFKV9fbXNhX2lsdm9kX3coKHY0aTMyKWluMywgKHY0aTMyKWluMik7ICAgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIElMVkVWT0RfVzJfVUIoLi4uKSBJTFZFVk9EX1cyKHYxNnU4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWRVZPRF9XMl9VSCguLi4pIElMVkVWT0RfVzIodjh1MTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZFVk9EX1cyX1NIKC4uLikgSUxWRVZPRF9XMih2OGkxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVkVWT0RfVzJfU1coLi4uKSBJTFZFVk9EX1cyKHY0aTMyLCBfX1ZBX0FSR1NfXykKKworLyogRGVzY3JpcHRpb24gOiBJbnRlcmxlYXZlIGV2ZW4tb2RkIGhhbGYtd29yZCBlbGVtZW50cyBmcm9tIHZlY3RvcnMKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIGluMCwgaW4xLCBpbjIsIGluMworICogICAgICAgICAgICAgICBPdXRwdXRzIC0gb3V0MCwgb3V0MQorICogICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIGFzIHBlciBSVFlQRQorICogRGV0YWlscyAgICAgOiBFdmVuIGhhbGYtd29yZCBlbGVtZW50cyBvZiAnaW4wJyBhbmQgJ2luMScgYXJlIGludGVybGVhdmVkCisgKiAgICAgICAgICAgICAgIGFuZCB3cml0dGVuIHRvICdvdXQwJworICogICAgICAgICAgICAgICBPZGQgaGFsZi13b3JkIGVsZW1lbnRzIG9mICdpbjInIGFuZCAnaW4zJyBhcmUgaW50ZXJsZWF2ZWQKKyAqICAgICAgICAgICAgICAgYW5kIHdyaXR0ZW4gdG8gJ291dDEnCisgKi8KKyNkZWZpbmUgSUxWRVZPRF9IMihSVFlQRSwgaW4wLCBpbjEsIGluMiwgaW4zLCBvdXQwLCBvdXQxKSBkbyB7ICBcCisgIG91dDAgPSAoUlRZUEUpX19tc2FfaWx2ZXZfaCgodjhpMTYpaW4xLCAodjhpMTYpaW4wKTsgICAgICAgICAgXAorICBvdXQxID0gKFJUWVBFKV9fbXNhX2lsdm9kX2goKHY4aTE2KWluMywgKHY4aTE2KWluMik7ICAgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIElMVkVWT0RfSDJfVUIoLi4uKSBJTFZFVk9EX0gyKHYxNnU4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWRVZPRF9IMl9VSCguLi4pIElMVkVWT0RfSDIodjh1MTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZFVk9EX0gyX1NIKC4uLikgSUxWRVZPRF9IMih2OGkxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVkVWT0RfSDJfU1coLi4uKSBJTFZFVk9EX0gyKHY0aTMyLCBfX1ZBX0FSR1NfXykKKworLyogRGVzY3JpcHRpb24gOiBJbnRlcmxlYXZlIGV2ZW4gZG91YmxlIHdvcmQgZWxlbWVudHMgZnJvbSB2ZWN0b3JzCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAgLSBpbjAsIGluMSwgaW4yLCBpbjMKKyAqICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEKKyAqICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBhcyBwZXIgUlRZUEUKKyAqIERldGFpbHMgICAgIDogRXZlbiBkb3VibGUgd29yZCBlbGVtZW50cyBvZiAnaW4wJyBhbmQgJ2luMScgYXJlIGludGVybGVhdmVkCisgKiAgICAgICAgICAgICAgIGFuZCB3cml0dGVuIHRvICdvdXQwJworICovCisjZGVmaW5lIElMVkVWX0QyKFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsIG91dDAsIG91dDEpIGRvIHsgIFwKKyAgb3V0MCA9IChSVFlQRSlfX21zYV9pbHZldl9kKCh2Mmk2NClpbjEsICh2Mmk2NClpbjApOyAgICAgICAgXAorICBvdXQxID0gKFJUWVBFKV9fbXNhX2lsdmV2X2QoKHYyaTY0KWluMywgKHYyaTY0KWluMik7ICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBJTFZFVl9EMl9VQiguLi4pIElMVkVWX0QyKHYxNnU4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWRVZfRDJfU0IoLi4uKSBJTFZFVl9EMih2MTZpOCwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVkVWX0QyX1NXKC4uLikgSUxWRVZfRDIodjRpMzIsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZFVl9EMl9TRCguLi4pIElMVkVWX0QyKHYyaTY0LCBfX1ZBX0FSR1NfXykKKworLyogRGVzY3JpcHRpb24gOiBJbnRlcmxlYXZlIGxlZnQgaGFsZiBvZiBieXRlIGVsZW1lbnRzIGZyb20gdmVjdG9ycworICogQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4wLCBpbjEsIGluMiwgaW4zCisgKiAgICAgICAgICAgICAgIE91dHB1dHMgLSBvdXQwLCBvdXQxCisgKiAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gYXMgcGVyIFJUWVBFCisgKiBEZXRhaWxzICAgICA6IExlZnQgaGFsZiBvZiBieXRlIGVsZW1lbnRzIG9mICdpbjAnIGFuZCAnaW4xJyBhcmUgaW50ZXJsZWF2ZWQKKyAqICAgICAgICAgICAgICAgYW5kIHdyaXR0ZW4gdG8gJ291dDAnLgorICovCisjZGVmaW5lIElMVkxfQjIoUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgb3V0MCwgb3V0MSkgZG8geyAgXAorICBvdXQwID0gKFJUWVBFKV9fbXNhX2lsdmxfYigodjE2aTgpaW4wLCAodjE2aTgpaW4xKTsgICAgICAgIFwKKyAgb3V0MSA9IChSVFlQRSlfX21zYV9pbHZsX2IoKHYxNmk4KWluMiwgKHYxNmk4KWluMyk7ICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBJTFZMX0IyX1VCKC4uLikgSUxWTF9CMih2MTZ1OCwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVkxfQjJfU0IoLi4uKSBJTFZMX0IyKHYxNmk4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWTF9CMl9VSCguLi4pIElMVkxfQjIodjh1MTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZMX0IyX1NIKC4uLikgSUxWTF9CMih2OGkxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVkxfQjJfU1coLi4uKSBJTFZMX0IyKHY0aTMyLCBfX1ZBX0FSR1NfXykKKworLyogRGVzY3JpcHRpb24gOiBJbnRlcmxlYXZlIHJpZ2h0IGhhbGYgb2YgYnl0ZSBlbGVtZW50cyBmcm9tIHZlY3RvcnMKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIGluMCwgaW4xLCBpbjIsIGluMworICogICAgICAgICAgICAgICBPdXRwdXRzIC0gb3V0MCwgb3V0MQorICogICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIGFzIHBlciBSVFlQRQorICogRGV0YWlscyAgICAgOiBSaWdodCBoYWxmIG9mIGJ5dGUgZWxlbWVudHMgb2YgJ2luMCcgYW5kICdpbjEnIGFyZSBpbnRlcmxlYXZlZAorICogICAgICAgICAgICAgICBhbmQgd3JpdHRlbiB0byBvdXQwLgorICovCisjZGVmaW5lIElMVlJfQjIoUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgb3V0MCwgb3V0MSkgZG8geyAgXAorICBvdXQwID0gKFJUWVBFKV9fbXNhX2lsdnJfYigodjE2aTgpaW4wLCAodjE2aTgpaW4xKTsgICAgICAgIFwKKyAgb3V0MSA9IChSVFlQRSlfX21zYV9pbHZyX2IoKHYxNmk4KWluMiwgKHYxNmk4KWluMyk7ICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBJTFZSX0IyX1VCKC4uLikgSUxWUl9CMih2MTZ1OCwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVlJfQjJfU0IoLi4uKSBJTFZSX0IyKHYxNmk4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWUl9CMl9VSCguLi4pIElMVlJfQjIodjh1MTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZSX0IyX1NIKC4uLikgSUxWUl9CMih2OGkxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVlJfQjJfU1coLi4uKSBJTFZSX0IyKHY0aTMyLCBfX1ZBX0FSR1NfXykKKworI2RlZmluZSBJTFZSX0I0KFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBpbjYsIGluNywgIFwKKyAgICAgICAgICAgICAgICBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKSBkbyB7ICAgICAgICAgICAgICAgICAgICBcCisgIElMVlJfQjIoUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgb3V0MCwgb3V0MSk7ICAgICAgICAgICAgICAgXAorICBJTFZSX0IyKFJUWVBFLCBpbjQsIGluNSwgaW42LCBpbjcsIG91dDIsIG91dDMpOyAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIElMVlJfQjRfVUIoLi4uKSBJTFZSX0I0KHYxNnU4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWUl9CNF9TQiguLi4pIElMVlJfQjQodjE2aTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZSX0I0X1VIKC4uLikgSUxWUl9CNCh2OHUxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVlJfQjRfU0goLi4uKSBJTFZSX0I0KHY4aTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWUl9CNF9TVyguLi4pIElMVlJfQjQodjRpMzIsIF9fVkFfQVJHU19fKQorCisvKiBEZXNjcmlwdGlvbiA6IEludGVybGVhdmUgcmlnaHQgaGFsZiBvZiBoYWxmd29yZCBlbGVtZW50cyBmcm9tIHZlY3RvcnMKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIGluMCwgaW4xLCBpbjIsIGluMworICogICAgICAgICAgICAgICBPdXRwdXRzIC0gb3V0MCwgb3V0MQorICogICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIGFzIHBlciBSVFlQRQorICogRGV0YWlscyAgICAgOiBSaWdodCBoYWxmIG9mIGhhbGZ3b3JkIGVsZW1lbnRzIG9mICdpbjAnIGFuZCAnaW4xJyBhcmUKKyAqICAgICAgICAgICAgICAgaW50ZXJsZWF2ZWQgYW5kIHdyaXR0ZW4gdG8gJ291dDAnLgorICovCisjZGVmaW5lIElMVlJfSDIoUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgb3V0MCwgb3V0MSkgZG8geyAgXAorICBvdXQwID0gKFJUWVBFKV9fbXNhX2lsdnJfaCgodjhpMTYpaW4wLCAodjhpMTYpaW4xKTsgICAgICAgIFwKKyAgb3V0MSA9IChSVFlQRSlfX21zYV9pbHZyX2goKHY4aTE2KWluMiwgKHY4aTE2KWluMyk7ICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBJTFZSX0gyX1VCKC4uLikgSUxWUl9IMih2MTZ1OCwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVlJfSDJfU0goLi4uKSBJTFZSX0gyKHY4aTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWUl9IMl9TVyguLi4pIElMVlJfSDIodjRpMzIsIF9fVkFfQVJHU19fKQorCisjZGVmaW5lIElMVlJfSDQoUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgaW40LCBpbjUsIGluNiwgaW43LCAgXAorICAgICAgICAgICAgICAgIG91dDAsIG91dDEsIG91dDIsIG91dDMpIGRvIHsgICAgICAgICAgICAgICAgICAgIFwKKyAgSUxWUl9IMihSVFlQRSwgaW4wLCBpbjEsIGluMiwgaW4zLCBvdXQwLCBvdXQxKTsgICAgICAgICAgICAgICBcCisgIElMVlJfSDIoUlRZUEUsIGluNCwgaW41LCBpbjYsIGluNywgb3V0Miwgb3V0Myk7ICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgSUxWUl9INF9VQiguLi4pIElMVlJfSDQodjE2dTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZSX0g0X1NIKC4uLikgSUxWUl9INCh2OGkxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVlJfSDRfU1coLi4uKSBJTFZSX0g0KHY0aTMyLCBfX1ZBX0FSR1NfXykKKworLyogRGVzY3JpcHRpb24gOiBJbnRlcmxlYXZlIHJpZ2h0IGhhbGYgb2YgZG91YmxlIHdvcmQgZWxlbWVudHMgZnJvbSB2ZWN0b3JzCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAgLSBpbjAsIGluMSwgaW4yLCBpbjMKKyAqICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEKKyAqICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBhcyBwZXIgUlRZUEUKKyAqIERldGFpbHMgICAgIDogUmlnaHQgaGFsZiBvZiBkb3VibGUgd29yZCBlbGVtZW50cyBvZiAnaW4wJyBhbmQgJ2luMScgYXJlCisgKiAgICAgICAgICAgICAgIGludGVybGVhdmVkIGFuZCB3cml0dGVuIHRvICdvdXQwJy4KKyAqLworI2RlZmluZSBJTFZSX0QyKFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsIG91dDAsIG91dDEpIGRvIHsgIFwKKyAgb3V0MCA9IChSVFlQRSlfX21zYV9pbHZyX2QoKHYyaTY0KWluMCwgKHYyaTY0KWluMSk7ICAgICAgICBcCisgIG91dDEgPSAoUlRZUEUpX19tc2FfaWx2cl9kKCh2Mmk2NClpbjIsICh2Mmk2NClpbjMpOyAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgSUxWUl9EMl9VQiguLi4pIElMVlJfRDIodjE2dTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZSX0QyX1NCKC4uLikgSUxWUl9EMih2MTZpOCwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVlJfRDJfU0goLi4uKSBJTFZSX0QyKHY4aTE2LCBfX1ZBX0FSR1NfXykKKworI2RlZmluZSBJTFZSX0Q0KFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBpbjYsIGluNywgIFwKKyAgICAgICAgICAgICAgICBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKSBkbyB7ICAgICAgICAgICAgICAgICAgICBcCisgIElMVlJfRDIoUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgb3V0MCwgb3V0MSk7ICAgICAgICAgICAgICAgXAorICBJTFZSX0QyKFJUWVBFLCBpbjQsIGluNSwgaW42LCBpbjcsIG91dDIsIG91dDMpOyAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIElMVlJfRDRfU0IoLi4uKSBJTFZSX0Q0KHYxNmk4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWUl9ENF9VQiguLi4pIElMVlJfRDQodjE2dTgsIF9fVkFfQVJHU19fKQorCisvKiBEZXNjcmlwdGlvbiA6IEludGVybGVhdmUgYm90aCBsZWZ0IGFuZCByaWdodCBoYWxmIG9mIGlucHV0IHZlY3RvcnMKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIGluMCwgaW4xCisgKiAgICAgICAgICAgICAgIE91dHB1dHMgLSBvdXQwLCBvdXQxCisgKiAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gYXMgcGVyIFJUWVBFCisgKiBEZXRhaWxzICAgICA6IFJpZ2h0IGhhbGYgb2YgYnl0ZSBlbGVtZW50cyBmcm9tICdpbjAnIGFuZCAnaW4xJyBhcmUKKyAqICAgICAgICAgICAgICAgaW50ZXJsZWF2ZWQgYW5kIHdyaXR0ZW4gdG8gJ291dDAnCisgKi8KKyNkZWZpbmUgSUxWUkxfQjIoUlRZUEUsIGluMCwgaW4xLCBvdXQwLCBvdXQxKSBkbyB7ICAgICBcCisgIG91dDAgPSAoUlRZUEUpX19tc2FfaWx2cl9iKCh2MTZpOClpbjAsICh2MTZpOClpbjEpOyAgXAorICBvdXQxID0gKFJUWVBFKV9fbXNhX2lsdmxfYigodjE2aTgpaW4wLCAodjE2aTgpaW4xKTsgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIElMVlJMX0IyX1VCKC4uLikgSUxWUkxfQjIodjE2dTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZSTF9CMl9TQiguLi4pIElMVlJMX0IyKHYxNmk4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWUkxfQjJfVUgoLi4uKSBJTFZSTF9CMih2OHUxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVlJMX0IyX1NIKC4uLikgSUxWUkxfQjIodjhpMTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZSTF9CMl9TVyguLi4pIElMVlJMX0IyKHY0aTMyLCBfX1ZBX0FSR1NfXykKKworI2RlZmluZSBJTFZSTF9IMihSVFlQRSwgaW4wLCBpbjEsIG91dDAsIG91dDEpIGRvIHsgICAgIFwKKyAgb3V0MCA9IChSVFlQRSlfX21zYV9pbHZyX2goKHY4aTE2KWluMCwgKHY4aTE2KWluMSk7ICBcCisgIG91dDEgPSAoUlRZUEUpX19tc2FfaWx2bF9oKCh2OGkxNilpbjAsICh2OGkxNilpbjEpOyAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgSUxWUkxfSDJfVUIoLi4uKSBJTFZSTF9IMih2MTZ1OCwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVlJMX0gyX1NCKC4uLikgSUxWUkxfSDIodjE2aTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZSTF9IMl9TSCguLi4pIElMVlJMX0gyKHY4aTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWUkxfSDJfU1coLi4uKSBJTFZSTF9IMih2NGkzMiwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVlJMX0gyX1VXKC4uLikgSUxWUkxfSDIodjR1MzIsIF9fVkFfQVJHU19fKQorCisjZGVmaW5lIElMVlJMX1cyKFJUWVBFLCBpbjAsIGluMSwgb3V0MCwgb3V0MSkgZG8geyAgICAgXAorICBvdXQwID0gKFJUWVBFKV9fbXNhX2lsdnJfdygodjRpMzIpaW4wLCAodjRpMzIpaW4xKTsgIFwKKyAgb3V0MSA9IChSVFlQRSlfX21zYV9pbHZsX3coKHY0aTMyKWluMCwgKHY0aTMyKWluMSk7ICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBJTFZSTF9XMl9VQiguLi4pIElMVlJMX1cyKHYxNnU4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWUkxfVzJfU0goLi4uKSBJTFZSTF9XMih2OGkxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVlJMX1cyX1NXKC4uLikgSUxWUkxfVzIodjRpMzIsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZSTF9XMl9VVyguLi4pIElMVlJMX1cyKHY0dTMyLCBfX1ZBX0FSR1NfXykKKworLyogRGVzY3JpcHRpb24gOiBQYWNrIGV2ZW4gYnl0ZSBlbGVtZW50cyBvZiB2ZWN0b3IgcGFpcnMKKyAqICBBcmd1bWVudHMgICA6IElucHV0cyAgLSBpbjAsIGluMSwgaW4yLCBpbjMKKyAqICAgICAgICAgICAgICAgIE91dHB1dHMgLSBvdXQwLCBvdXQxCisgKiAgICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIGFzIHBlciBSVFlQRQorICogIERldGFpbHMgICAgIDogRXZlbiBieXRlIGVsZW1lbnRzIG9mICdpbjAnIGFyZSBjb3BpZWQgdG8gdGhlIGxlZnQgaGFsZiBvZgorICogICAgICAgICAgICAgICAgJ291dDAnICYgZXZlbiBieXRlIGVsZW1lbnRzIG9mICdpbjEnIGFyZSBjb3BpZWQgdG8gdGhlIHJpZ2h0CisgKiAgICAgICAgICAgICAgICBoYWxmIG9mICdvdXQwJy4KKyAqLworI2RlZmluZSBQQ0tFVl9CMihSVFlQRSwgaW4wLCBpbjEsIGluMiwgaW4zLCBvdXQwLCBvdXQxKSBkbyB7ICBcCisgIG91dDAgPSAoUlRZUEUpX19tc2FfcGNrZXZfYigodjE2aTgpaW4wLCAodjE2aTgpaW4xKTsgICAgICAgIFwKKyAgb3V0MSA9IChSVFlQRSlfX21zYV9wY2tldl9iKCh2MTZpOClpbjIsICh2MTZpOClpbjMpOyAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgUENLRVZfQjJfU0IoLi4uKSBQQ0tFVl9CMih2MTZpOCwgX19WQV9BUkdTX18pCisjZGVmaW5lIFBDS0VWX0IyX1VCKC4uLikgUENLRVZfQjIodjE2dTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBQQ0tFVl9CMl9TSCguLi4pIFBDS0VWX0IyKHY4aTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgUENLRVZfQjJfU1coLi4uKSBQQ0tFVl9CMih2NGkzMiwgX19WQV9BUkdTX18pCisKKyNkZWZpbmUgUENLRVZfQjQoUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgaW40LCBpbjUsIGluNiwgaW43LCAgXAorICAgICAgICAgICAgICAgICBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKSBkbyB7ICAgICAgICAgICAgICAgICAgICBcCisgIFBDS0VWX0IyKFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsIG91dDAsIG91dDEpOyAgICAgICAgICAgICAgIFwKKyAgUENLRVZfQjIoUlRZUEUsIGluNCwgaW41LCBpbjYsIGluNywgb3V0Miwgb3V0Myk7ICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgUENLRVZfQjRfU0IoLi4uKSBQQ0tFVl9CNCh2MTZpOCwgX19WQV9BUkdTX18pCisjZGVmaW5lIFBDS0VWX0I0X1VCKC4uLikgUENLRVZfQjQodjE2dTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBQQ0tFVl9CNF9TSCguLi4pIFBDS0VWX0I0KHY4aTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgUENLRVZfQjRfU1coLi4uKSBQQ0tFVl9CNCh2NGkzMiwgX19WQV9BUkdTX18pCisKKy8qIERlc2NyaXB0aW9uIDogUGFjayBldmVuIGhhbGZ3b3JkIGVsZW1lbnRzIG9mIHZlY3RvciBwYWlycworICogQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4wLCBpbjEsIGluMiwgaW4zCisgKiAgICAgICAgICAgICAgIE91dHB1dHMgLSBvdXQwLCBvdXQxCisgKiAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gYXMgcGVyIFJUWVBFCisgKiBEZXRhaWxzICAgICA6IEV2ZW4gaGFsZndvcmQgZWxlbWVudHMgb2YgJ2luMCcgYXJlIGNvcGllZCB0byB0aGUgbGVmdCBoYWxmIG9mCisgKiAgICAgICAgICAgICAgICdvdXQwJyAmIGV2ZW4gaGFsZndvcmQgZWxlbWVudHMgb2YgJ2luMScgYXJlIGNvcGllZCB0byB0aGUKKyAqICAgICAgICAgICAgICAgcmlnaHQgaGFsZiBvZiAnb3V0MCcuCisgKi8KKyNkZWZpbmUgUENLRVZfSDIoUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgb3V0MCwgb3V0MSkgZG8geyAgXAorICBvdXQwID0gKFJUWVBFKV9fbXNhX3Bja2V2X2goKHY4aTE2KWluMCwgKHY4aTE2KWluMSk7ICAgICAgICBcCisgIG91dDEgPSAoUlRZUEUpX19tc2FfcGNrZXZfaCgodjhpMTYpaW4yLCAodjhpMTYpaW4zKTsgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIFBDS0VWX0gyX1VIKC4uLikgUENLRVZfSDIodjh1MTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBQQ0tFVl9IMl9TSCguLi4pIFBDS0VWX0gyKHY4aTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgUENLRVZfSDJfU1coLi4uKSBQQ0tFVl9IMih2NGkzMiwgX19WQV9BUkdTX18pCisjZGVmaW5lIFBDS0VWX0gyX1VXKC4uLikgUENLRVZfSDIodjR1MzIsIF9fVkFfQVJHU19fKQorCisvKiBEZXNjcmlwdGlvbiA6IFBhY2sgZXZlbiB3b3JkIGVsZW1lbnRzIG9mIHZlY3RvciBwYWlycworICogQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4wLCBpbjEsIGluMiwgaW4zCisgKiAgICAgICAgICAgICAgIE91dHB1dHMgLSBvdXQwLCBvdXQxCisgKiAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gYXMgcGVyIFJUWVBFCisgKiBEZXRhaWxzICAgICA6IEV2ZW4gd29yZCBlbGVtZW50cyBvZiAnaW4wJyBhcmUgY29waWVkIHRvIHRoZSBsZWZ0IGhhbGYgb2YKKyAqICAgICAgICAgICAgICAgJ291dDAnICYgZXZlbiB3b3JkIGVsZW1lbnRzIG9mICdpbjEnIGFyZSBjb3BpZWQgdG8gdGhlCisgKiAgICAgICAgICAgICAgIHJpZ2h0IGhhbGYgb2YgJ291dDAnLgorICovCisjZGVmaW5lIFBDS0VWX1cyKFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsIG91dDAsIG91dDEpIGRvIHsgIFwKKyAgb3V0MCA9IChSVFlQRSlfX21zYV9wY2tldl93KCh2NGkzMilpbjAsICh2NGkzMilpbjEpOyAgICAgICAgXAorICBvdXQxID0gKFJUWVBFKV9fbXNhX3Bja2V2X3coKHY0aTMyKWluMiwgKHY0aTMyKWluMyk7ICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBQQ0tFVl9XMl9VSCguLi4pIFBDS0VWX1cyKHY4dTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgUENLRVZfVzJfU0goLi4uKSBQQ0tFVl9XMih2OGkxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIFBDS0VWX1cyX1NXKC4uLikgUENLRVZfVzIodjRpMzIsIF9fVkFfQVJHU19fKQorI2RlZmluZSBQQ0tFVl9XMl9VVyguLi4pIFBDS0VWX1cyKHY0dTMyLCBfX1ZBX0FSR1NfXykKKworLyogRGVzY3JpcHRpb24gOiBQYWNrIG9kZCBoYWxmd29yZCBlbGVtZW50cyBvZiB2ZWN0b3IgcGFpcnMKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIGluMCwgaW4xLCBpbjIsIGluMworICogICAgICAgICAgICAgICBPdXRwdXRzIC0gb3V0MCwgb3V0MQorICogICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIGFzIHBlciBSVFlQRQorICogRGV0YWlscyAgICAgOiBPZGQgaGFsZndvcmQgZWxlbWVudHMgb2YgJ2luMCcgYXJlIGNvcGllZCB0byB0aGUgbGVmdCBoYWxmIG9mCisgKiAgICAgICAgICAgICAgICdvdXQwJyAmIG9kZCBoYWxmd29yZCBlbGVtZW50cyBvZiAnaW4xJyBhcmUgY29waWVkIHRvIHRoZQorICogICAgICAgICAgICAgICByaWdodCBoYWxmIG9mICdvdXQwJy4KKyAqLworI2RlZmluZSBQQ0tPRF9IMihSVFlQRSwgaW4wLCBpbjEsIGluMiwgaW4zLCBvdXQwLCBvdXQxKSBkbyB7ICBcCisgIG91dDAgPSAoUlRZUEUpX19tc2FfcGNrb2RfaCgodjhpMTYpaW4wLCAodjhpMTYpaW4xKTsgICAgICAgIFwKKyAgb3V0MSA9IChSVFlQRSlfX21zYV9wY2tvZF9oKCh2OGkxNilpbjIsICh2OGkxNilpbjMpOyAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgUENLT0RfSDJfVUgoLi4uKSBQQ0tPRF9IMih2OHUxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIFBDS09EX0gyX1NIKC4uLikgUENLT0RfSDIodjhpMTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBQQ0tPRF9IMl9TVyguLi4pIFBDS09EX0gyKHY0aTMyLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgUENLT0RfSDJfVVcoLi4uKSBQQ0tPRF9IMih2NHUzMiwgX19WQV9BUkdTX18pCisKKy8qIERlc2NyaXB0aW9uIDogQXJpdGhtZXRpYyBpbW1lZGlhdGUgc2hpZnQgcmlnaHQgYWxsIGVsZW1lbnRzIG9mIHdvcmQgdmVjdG9yCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAgLSBpbjAsIGluMSwgc2hpZnQKKyAqICAgICAgICAgICAgICAgT3V0cHV0cyAtIGluIHBsYWNlIG9wZXJhdGlvbgorICogICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIGFzIHBlciBpbnB1dCB2ZWN0b3IgUlRZUEUKKyAqIERldGFpbHMgICAgIDogRWFjaCBlbGVtZW50IG9mIHZlY3RvciAnaW4wJyBpcyByaWdodCBzaGlmdGVkIGJ5ICdzaGlmdCcgYW5kCisgKiAgICAgICAgICAgICAgIHRoZSByZXN1bHQgaXMgd3JpdHRlbiBpbi1wbGFjZS4gJ3NoaWZ0JyBpcyBhIEdQIHZhcmlhYmxlLgorICovCisjZGVmaW5lIFNSQUlfVzIoUlRZUEUsIGluMCwgaW4xLCBzaGlmdF92YWwpIGRvIHsgIFwKKyAgaW4wID0gKFJUWVBFKVNSQUlfVyhpbjAsIHNoaWZ0X3ZhbCk7ICAgICAgICAgICAgXAorICBpbjEgPSAoUlRZUEUpU1JBSV9XKGluMSwgc2hpZnRfdmFsKTsgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBTUkFJX1cyX1NXKC4uLikgU1JBSV9XMih2NGkzMiwgX19WQV9BUkdTX18pCisjZGVmaW5lIFNSQUlfVzJfVVcoLi4uKSBTUkFJX1cyKHY0dTMyLCBfX1ZBX0FSR1NfXykKKworI2RlZmluZSBTUkFJX1c0KFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsIHNoaWZ0X3ZhbCkgZG8geyAgXAorICBTUkFJX1cyKFJUWVBFLCBpbjAsIGluMSwgc2hpZnRfdmFsKTsgICAgICAgICAgICAgICAgICAgICAgXAorICBTUkFJX1cyKFJUWVBFLCBpbjIsIGluMywgc2hpZnRfdmFsKTsgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgU1JBSV9XNF9TVyguLi4pIFNSQUlfVzQodjRpMzIsIF9fVkFfQVJHU19fKQorI2RlZmluZSBTUkFJX1c0X1VXKC4uLikgU1JBSV9XNCh2NHUzMiwgX19WQV9BUkdTX18pCisKKy8qIERlc2NyaXB0aW9uIDogQXJpdGhtZXRpYyBzaGlmdCByaWdodCBhbGwgZWxlbWVudHMgb2YgaGFsZi13b3JkIHZlY3RvcgorICogQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4wLCBpbjEsIHNoaWZ0CisgKiAgICAgICAgICAgICAgIE91dHB1dHMgLSBpbiBwbGFjZSBvcGVyYXRpb24KKyAqICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBhcyBwZXIgaW5wdXQgdmVjdG9yIFJUWVBFCisgKiBEZXRhaWxzICAgICA6IEVhY2ggZWxlbWVudCBvZiB2ZWN0b3IgJ2luMCcgaXMgcmlnaHQgc2hpZnRlZCBieSAnc2hpZnQnIGFuZAorICogICAgICAgICAgICAgICB0aGUgcmVzdWx0IGlzIHdyaXR0ZW4gaW4tcGxhY2UuICdzaGlmdCcgaXMgYSBHUCB2YXJpYWJsZS4KKyAqLworI2RlZmluZSBTUkFJX0gyKFJUWVBFLCBpbjAsIGluMSwgc2hpZnRfdmFsKSBkbyB7ICBcCisgIGluMCA9IChSVFlQRSlTUkFJX0goaW4wLCBzaGlmdF92YWwpOyAgICAgICAgICAgIFwKKyAgaW4xID0gKFJUWVBFKVNSQUlfSChpbjEsIHNoaWZ0X3ZhbCk7ICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgU1JBSV9IMl9TSCguLi4pIFNSQUlfSDIodjhpMTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBTUkFJX0gyX1VIKC4uLikgU1JBSV9IMih2OHUxNiwgX19WQV9BUkdTX18pCisKKy8qIERlc2NyaXB0aW9uIDogQXJpdGhtZXRpYyByb3VuZGVkIHNoaWZ0IHJpZ2h0IGFsbCBlbGVtZW50cyBvZiB3b3JkIHZlY3RvcgorICogQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4wLCBpbjEsIHNoaWZ0CisgKiAgICAgICAgICAgICAgIE91dHB1dHMgLSBpbiBwbGFjZSBvcGVyYXRpb24KKyAqICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBhcyBwZXIgaW5wdXQgdmVjdG9yIFJUWVBFCisgKiBEZXRhaWxzICAgICA6IEVhY2ggZWxlbWVudCBvZiB2ZWN0b3IgJ2luMCcgaXMgcmlnaHQgc2hpZnRlZCBieSAnc2hpZnQnIGFuZAorICogICAgICAgICAgICAgICB0aGUgcmVzdWx0IGlzIHdyaXR0ZW4gaW4tcGxhY2UuICdzaGlmdCcgaXMgYSBHUCB2YXJpYWJsZS4KKyAqLworI2RlZmluZSBTUkFSSV9XMihSVFlQRSwgaW4wLCBpbjEsIHNoaWZ0KSBkbyB7ICAgICBcCisgIGluMCA9IChSVFlQRSlfX21zYV9zcmFyaV93KCh2NGkzMilpbjAsIHNoaWZ0KTsgIFwKKyAgaW4xID0gKFJUWVBFKV9fbXNhX3NyYXJpX3coKHY0aTMyKWluMSwgc2hpZnQpOyAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgU1JBUklfVzJfU1coLi4uKSBTUkFSSV9XMih2NGkzMiwgX19WQV9BUkdTX18pCisKKyNkZWZpbmUgU1JBUklfVzQoUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgc2hpZnQpIGRvIHsgIFwKKyAgU1JBUklfVzIoUlRZUEUsIGluMCwgaW4xLCBzaGlmdCk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU1JBUklfVzIoUlRZUEUsIGluMiwgaW4zLCBzaGlmdCk7ICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIFNSQVJJX1c0X1NIKC4uLikgU1JBUklfVzQodjhpMTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBTUkFSSV9XNF9VVyguLi4pIFNSQVJJX1c0KHY0dTMyLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgU1JBUklfVzRfU1coLi4uKSBTUkFSSV9XNCh2NGkzMiwgX19WQV9BUkdTX18pCisKKy8qIERlc2NyaXB0aW9uIDogU2hpZnQgcmlnaHQgYXJpdGhtZXRpYyByb3VuZGVkIGRvdWJsZSB3b3JkcworICogQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4wLCBpbjEsIHNoaWZ0CisgKiAgICAgICAgICAgICAgIE91dHB1dHMgLSBpbiBwbGFjZSBvcGVyYXRpb24KKyAqICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBhcyBwZXIgUlRZUEUKKyAqIERldGFpbHMgICAgIDogRWFjaCBlbGVtZW50IG9mIHZlY3RvciAnaW4wJyBpcyBzaGlmdGVkIHJpZ2h0IGFyaXRobWV0aWNhbGx5IGJ5CisgKiAgICAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IGluIHRoZSB2ZWN0b3IKKyAqICAgICAgICAgICAgICAgJ3NoaWZ0Jy4gVGhlIGxhc3QgZGlzY2FyZGVkIGJpdCBpcyBhZGRlZCB0byBzaGlmdGVkIHZhbHVlIGZvcgorICogICAgICAgICAgICAgICByb3VuZGluZyBhbmQgdGhlIHJlc3VsdCBpcyB3cml0dGVuIGluLXBsYWNlLgorICogICAgICAgICAgICAgICAnc2hpZnQnIGlzIGEgdmVjdG9yLgorICovCisjZGVmaW5lIFNSQVJfRDIoUlRZUEUsIGluMCwgaW4xLCBzaGlmdCkgZG8geyAgICAgICAgICAgIFwKKyAgaW4wID0gKFJUWVBFKV9fbXNhX3NyYXJfZCgodjJpNjQpaW4wLCAodjJpNjQpc2hpZnQpOyAgXAorICBpbjEgPSAoUlRZUEUpX19tc2Ffc3Jhcl9kKCh2Mmk2NClpbjEsICh2Mmk2NClzaGlmdCk7ICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBTUkFSX0QyX1NXKC4uLikgU1JBUl9EMih2NGkzMiwgX19WQV9BUkdTX18pCisjZGVmaW5lIFNSQVJfRDJfU0QoLi4uKSBTUkFSX0QyKHYyaTY0LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgU1JBUl9EMl9VRCguLi4pIFNSQVJfRDIodjJ1NjQsIF9fVkFfQVJHU19fKQorCisjZGVmaW5lIFNSQVJfRDQoUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgc2hpZnQpIGRvIHsgIFwKKyAgU1JBUl9EMihSVFlQRSwgaW4wLCBpbjEsIHNoaWZ0KTsgICAgICAgICAgICAgICAgICAgICAgXAorICBTUkFSX0QyKFJUWVBFLCBpbjIsIGluMywgc2hpZnQpOyAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBTUkFSX0Q0X1NEKC4uLikgU1JBUl9ENCh2Mmk2NCwgX19WQV9BUkdTX18pCisjZGVmaW5lIFNSQVJfRDRfVUQoLi4uKSBTUkFSX0Q0KHYydTY0LCBfX1ZBX0FSR1NfXykKKworLyogRGVzY3JpcHRpb24gOiBBZGRpdGlvbiBvZiAyIHBhaXJzIG9mIGhhbGYtd29yZCB2ZWN0b3JzCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAgLSBpbjAsIGluMSwgaW4yLCBpbjMKKyAqICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEKKyAqIERldGFpbHMgICAgIDogRWFjaCBlbGVtZW50IGluICdpbjAnIGlzIGFkZGVkIHRvICdpbjEnIGFuZCByZXN1bHQgaXMgd3JpdHRlbgorICogICAgICAgICAgICAgICB0byAnb3V0MCcuCisgKi8KKyNkZWZpbmUgQUREVklfSDIoUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgb3V0MCwgb3V0MSkgZG8geyAgXAorICBvdXQwID0gKFJUWVBFKUFERFZJX0goaW4wLCBpbjEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG91dDEgPSAoUlRZUEUpQUREVklfSChpbjIsIGluMyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIEFERFZJX0gyX1NIKC4uLikgQUREVklfSDIodjhpMTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBBRERWSV9IMl9VSCguLi4pIEFERFZJX0gyKHY4dTE2LCBfX1ZBX0FSR1NfXykKKworLyogRGVzY3JpcHRpb24gOiBBZGRpdGlvbiBvZiAyIHBhaXJzIG9mIHdvcmQgdmVjdG9ycworICogQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4wLCBpbjEsIGluMiwgaW4zCisgKiAgICAgICAgICAgICAgIE91dHB1dHMgLSBvdXQwLCBvdXQxCisgKiBEZXRhaWxzICAgICA6IEVhY2ggZWxlbWVudCBpbiAnaW4wJyBpcyBhZGRlZCB0byAnaW4xJyBhbmQgcmVzdWx0IGlzIHdyaXR0ZW4KKyAqICAgICAgICAgICAgICAgdG8gJ291dDAnLgorICovCisjZGVmaW5lIEFERFZJX1cyKFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsIG91dDAsIG91dDEpIGRvIHsgIFwKKyAgb3V0MCA9IChSVFlQRSlBRERWSV9XKGluMCwgaW4xKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBvdXQxID0gKFJUWVBFKUFERFZJX1coaW4yLCBpbjMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBBRERWSV9XMl9TVyguLi4pIEFERFZJX1cyKHY0aTMyLCBfX1ZBX0FSR1NfXykKKworLyogRGVzY3JpcHRpb24gOiBGaWxsIDIgcGFpcnMgb2Ygd29yZCB2ZWN0b3JzIHdpdGggR1AgcmVnaXN0ZXJzCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAgLSBpbjAsIGluMQorICogICAgICAgICAgICAgICBPdXRwdXRzIC0gb3V0MCwgb3V0MQorICogRGV0YWlscyAgICAgOiBHUCByZWdpc3RlciBpbjAgaXMgcmVwbGljYXRlZCBpbiBlYWNoIHdvcmQgZWxlbWVudCBvZiBvdXQwCisgKiAgICAgICAgICAgICAgIEdQIHJlZ2lzdGVyIGluMSBpcyByZXBsaWNhdGVkIGluIGVhY2ggd29yZCBlbGVtZW50IG9mIG91dDEKKyAqLworI2RlZmluZSBGSUxMX1cyKFJUWVBFLCBpbjAsIGluMSwgb3V0MCwgb3V0MSkgZG8geyAgXAorICBvdXQwID0gKFJUWVBFKV9fbXNhX2ZpbGxfdyhpbjApOyAgICAgICAgICAgICAgICAgXAorICBvdXQxID0gKFJUWVBFKV9fbXNhX2ZpbGxfdyhpbjEpOyAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgRklMTF9XMl9TVyguLi4pIEZJTExfVzIodjRpMzIsIF9fVkFfQVJHU19fKQorCisvKiBEZXNjcmlwdGlvbiA6IEFkZGl0aW9uIG9mIDIgcGFpcnMgb2YgdmVjdG9ycworICogQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4wLCBpbjEsIGluMiwgaW4zCisgKiAgICAgICAgICAgICAgIE91dHB1dHMgLSBvdXQwLCBvdXQxCisgKiBEZXRhaWxzICAgICA6IEVhY2ggZWxlbWVudCBpbiAnaW4wJyBpcyBhZGRlZCB0byAnaW4xJyBhbmQgcmVzdWx0IGlzIHdyaXR0ZW4KKyAqICAgICAgICAgICAgICAgdG8gJ291dDAnLgorICovCisjZGVmaW5lIEFERDIoaW4wLCBpbjEsIGluMiwgaW4zLCBvdXQwLCBvdXQxKSBkbyB7ICBcCisgIG91dDAgPSBpbjAgKyBpbjE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG91dDEgPSBpbjIgKyBpbjM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEFERDQoaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSwgaW42LCBpbjcsICBcCisgICAgICAgICAgICAgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MykgZG8geyAgICAgICAgICAgICBcCisgIEFERDIoaW4wLCBpbjEsIGluMiwgaW4zLCBvdXQwLCBvdXQxKTsgICAgICAgICAgICAgICBcCisgIEFERDIoaW40LCBpbjUsIGluNiwgaW43LCBvdXQyLCBvdXQzKTsgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisvKiBEZXNjcmlwdGlvbiA6IFN1YnRyYWN0aW9uIG9mIDIgcGFpcnMgb2YgdmVjdG9ycworICogQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4wLCBpbjEsIGluMiwgaW4zCisgKiAgICAgICAgICAgICAgIE91dHB1dHMgLSBvdXQwLCBvdXQxCisgKiBEZXRhaWxzICAgICA6IEVhY2ggZWxlbWVudCBpbiAnaW4xJyBpcyBzdWJ0cmFjdGVkIGZyb20gJ2luMCcgYW5kIHJlc3VsdCBpcworICogICAgICAgICAgICAgICB3cml0dGVuIHRvICdvdXQwJy4KKyAqLworI2RlZmluZSBTVUIyKGluMCwgaW4xLCBpbjIsIGluMywgb3V0MCwgb3V0MSkgZG8geyAgXAorICBvdXQwID0gaW4wIC0gaW4xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBvdXQxID0gaW4yIC0gaW4zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBTVUIzKGluMCwgaW4xLCBpbjIsIGluMywgaW40LCBpbjUsIG91dDAsIG91dDEsIG91dDIpIGRvIHsgIFwKKyAgb3V0MCA9IGluMCAtIGluMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG91dDEgPSBpbjIgLSBpbjM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBvdXQyID0gaW40IC0gaW41OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgU1VCNChpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBpbjYsIGluNywgIFwKKyAgICAgICAgICAgICBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKSBkbyB7ICAgICAgICAgICAgIFwKKyAgb3V0MCA9IGluMCAtIGluMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgb3V0MSA9IGluMiAtIGluMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgb3V0MiA9IGluNCAtIGluNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgb3V0MyA9IGluNiAtIGluNzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKy8qIERlc2NyaXB0aW9uIDogQWRkaXRpb24gLSBTdWJ0cmFjdGlvbiBvZiBpbnB1dCB2ZWN0b3JzCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAgLSBpbjAsIGluMQorICogICAgICAgICAgICAgICBPdXRwdXRzIC0gb3V0MCwgb3V0MQorICogRGV0YWlscyAgICAgOiBFYWNoIGVsZW1lbnQgaW4gJ2luMScgaXMgYWRkZWQgdG8gJ2luMCcgYW5kIHJlc3VsdCBpcworICogICAgICAgICAgICAgICB3cml0dGVuIHRvICdvdXQwJy4KKyAqICAgICAgICAgICAgICAgRWFjaCBlbGVtZW50IGluICdpbjEnIGlzIHN1YnRyYWN0ZWQgZnJvbSAnaW4wJyBhbmQgcmVzdWx0IGlzCisgKiAgICAgICAgICAgICAgIHdyaXR0ZW4gdG8gJ291dDEnLgorICovCisjZGVmaW5lIEFERFNVQjIoaW4wLCBpbjEsIG91dDAsIG91dDEpIGRvIHsgIFwKKyAgb3V0MCA9IGluMCArIGluMTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBvdXQxID0gaW4wIC0gaW4xOyAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisvKiBEZXNjcmlwdGlvbiA6IE11bHRpcGxpY2F0aW9uIG9mIHBhaXJzIG9mIHZlY3RvcnMKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIGluMCwgaW4xLCBpbjIsIGluMworICogICAgICAgICAgICAgICBPdXRwdXRzIC0gb3V0MCwgb3V0MQorICogRGV0YWlscyAgICAgOiBFYWNoIGVsZW1lbnQgZnJvbSAnaW4wJyBpcyBtdWx0aXBsaWVkIHdpdGggZWxlbWVudHMgZnJvbSAnaW4xJworICogICAgICAgICAgICAgICBhbmQgdGhlIHJlc3VsdCBpcyB3cml0dGVuIHRvICdvdXQwJworICovCisjZGVmaW5lIE1VTDIoaW4wLCBpbjEsIGluMiwgaW4zLCBvdXQwLCBvdXQxKSBkbyB7ICBcCisgIG91dDAgPSBpbjAgKiBpbjE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG91dDEgPSBpbjIgKiBpbjM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIE1VTDQoaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSwgaW42LCBpbjcsICBcCisgICAgICAgICAgICAgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MykgZG8geyAgICAgICAgICAgICBcCisgIE1VTDIoaW4wLCBpbjEsIGluMiwgaW4zLCBvdXQwLCBvdXQxKTsgICAgICAgICAgICAgICBcCisgIE1VTDIoaW40LCBpbjUsIGluNiwgaW43LCBvdXQyLCBvdXQzKTsgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisvKiBEZXNjcmlwdGlvbiA6IFNpZ24gZXh0ZW5kIGhhbGZ3b3JkIGVsZW1lbnRzIGZyb20gcmlnaHQgaGFsZiBvZiB0aGUgdmVjdG9yCisgKiBBcmd1bWVudHMgICA6IElucHV0ICAtIGluICAgIChoYWxmd29yZCB2ZWN0b3IpCisgKiAgICAgICAgICAgICAgIE91dHB1dCAtIG91dCAgIChzaWduIGV4dGVuZGVkIHdvcmQgdmVjdG9yKQorICogICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIHNpZ25lZCB3b3JkCisgKiBEZXRhaWxzICAgICA6IFNpZ24gYml0IG9mIGhhbGZ3b3JkIGVsZW1lbnRzIGZyb20gaW5wdXQgdmVjdG9yICdpbicgaXMKKyAqICAgICAgICAgICAgICAgZXh0cmFjdGVkIGFuZCBpbnRlcmxlYXZlZCB3aXRoIHNhbWUgdmVjdG9yICdpbjAnIHRvIGdlbmVyYXRlCisgKiAgICAgICAgICAgICAgIDQgd29yZCBlbGVtZW50cyBrZWVwaW5nIHNpZ24gaW50YWN0CisgKi8KKyNkZWZpbmUgVU5QQ0tfUl9TSF9TVyhpbiwgb3V0KSBkbyB7ICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdjhpMTYgc2lnbl9tID0gX19tc2FfY2x0aV9zX2goKHY4aTE2KWluLCAwKTsgIFwKKyAgb3V0ID0gKHY0aTMyKV9fbXNhX2lsdnJfaChzaWduX20sICh2OGkxNilpbik7ICAgICAgIFwKK30gd2hpbGUgKDApCisKKy8qIERlc2NyaXB0aW9uIDogU2lnbiBleHRlbmQgaGFsZndvcmQgZWxlbWVudHMgZnJvbSBpbnB1dCB2ZWN0b3IgYW5kIHJldHVybgorICogICAgICAgICAgICAgICB0aGUgcmVzdWx0IGluIHBhaXIgb2YgdmVjdG9ycworICogQXJndW1lbnRzICAgOiBJbnB1dCAgIC0gaW4gICAgICAgICAgICAoaGFsZndvcmQgdmVjdG9yKQorICogICAgICAgICAgICAgICBPdXRwdXRzIC0gb3V0MCwgb3V0MSAgIChzaWduIGV4dGVuZGVkIHdvcmQgdmVjdG9ycykKKyAqICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBzaWduZWQgd29yZAorICogRGV0YWlscyAgICAgOiBTaWduIGJpdCBvZiBoYWxmd29yZCBlbGVtZW50cyBmcm9tIGlucHV0IHZlY3RvciAnaW4nIGlzCisgKiAgICAgICAgICAgICAgIGV4dHJhY3RlZCBhbmQgaW50ZXJsZWF2ZWQgcmlnaHQgd2l0aCBzYW1lIHZlY3RvciAnaW4wJyB0bworICogICAgICAgICAgICAgICBnZW5lcmF0ZSA0IHNpZ25lZCB3b3JkIGVsZW1lbnRzIGluICdvdXQwJworICogICAgICAgICAgICAgICBUaGVuIGludGVybGVhdmVkIGxlZnQgd2l0aCBzYW1lIHZlY3RvciAnaW4wJyB0bworICogICAgICAgICAgICAgICBnZW5lcmF0ZSA0IHNpZ25lZCB3b3JkIGVsZW1lbnRzIGluICdvdXQxJworICovCisjZGVmaW5lIFVOUENLX1NIX1NXKGluLCBvdXQwLCBvdXQxKSBkbyB7ICAgICAgICAgICAgICBcCisgIGNvbnN0IHY4aTE2IHRtcF9tID0gX19tc2FfY2x0aV9zX2goKHY4aTE2KWluLCAwKTsgICBcCisgIElMVlJMX0gyX1NXKHRtcF9tLCBpbiwgb3V0MCwgb3V0MSk7ICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisvKiBEZXNjcmlwdGlvbiA6IEJ1dHRlcmZseSBvZiA0IGlucHV0IHZlY3RvcnMKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIGluMCwgaW4xLCBpbjIsIGluMworICogICAgICAgICAgICAgICBPdXRwdXRzIC0gb3V0MCwgb3V0MSwgb3V0Miwgb3V0MworICogRGV0YWlscyAgICAgOiBCdXR0ZXJmbHkgb3BlcmF0aW9uCisgKi8KKyNkZWZpbmUgQlVUVEVSRkxZXzQoaW4wLCBpbjEsIGluMiwgaW4zLCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKSBkbyB7ICBcCisgIG91dDAgPSBpbjAgKyBpbjM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBvdXQxID0gaW4xICsgaW4yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgb3V0MiA9IGluMSAtIGluMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG91dDMgPSBpbjAgLSBpbjM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworLyogRGVzY3JpcHRpb24gOiBUcmFuc3Bvc2UgMTZ4NCBibG9jayBpbnRvIDR4MTYgd2l0aCBieXRlIGVsZW1lbnRzIGluIHZlY3RvcnMKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIGluMCwgaW4xLCBpbjIsIGluMywgaW40LCBpbjUsIGluNiwgaW43LAorICogICAgICAgICAgICAgICAgICAgICAgICAgaW44LCBpbjksIGluMTAsIGluMTEsIGluMTIsIGluMTMsIGluMTQsIGluMTUKKyAqICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEsIG91dDIsIG91dDMKKyAqICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSB1bnNpZ25lZCBieXRlCisgKi8KKyNkZWZpbmUgVFJBTlNQT1NFMTZ4NF9VQl9VQihpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBpbjYsIGluNywgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbjgsIGluOSwgaW4xMCwgaW4xMSwgaW4xMiwgaW4xMywgaW4xNCwgaW4xNSwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKSBkbyB7ICAgICAgICAgICAgICAgICAgIFwKKyAgdjJpNjQgdG1wMF9tLCB0bXAxX20sIHRtcDJfbSwgdG1wM19tLCB0bXA0X20sIHRtcDVfbTsgICAgICAgICAgICAgICAgICAgIFwKKyAgSUxWRVZfVzJfU0QoaW4wLCBpbjQsIGluOCwgaW4xMiwgdG1wMl9tLCB0bXAzX20pOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSUxWRVZfVzJfU0QoaW4xLCBpbjUsIGluOSwgaW4xMywgdG1wMF9tLCB0bXAxX20pOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSUxWRVZfRDJfVUIodG1wMl9tLCB0bXAzX20sIHRtcDBfbSwgdG1wMV9tLCBvdXQxLCBvdXQzKTsgICAgICAgICAgICAgICAgIFwKKyAgSUxWRVZfVzJfU0QoaW4yLCBpbjYsIGluMTAsIGluMTQsIHRtcDRfbSwgdG1wNV9tKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSUxWRVZfVzJfU0QoaW4zLCBpbjcsIGluMTEsIGluMTUsIHRtcDBfbSwgdG1wMV9tKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSUxWRVZfRDJfU0QodG1wNF9tLCB0bXA1X20sIHRtcDBfbSwgdG1wMV9tLCB0bXAyX20sIHRtcDNfbSk7ICAgICAgICAgICAgIFwKKyAgSUxWRVZfQjJfU0Qob3V0MSwgb3V0MywgdG1wMl9tLCB0bXAzX20sIHRtcDBfbSwgdG1wMV9tKTsgICAgICAgICAgICAgICAgIFwKKyAgSUxWRVZPRF9IMl9VQih0bXAwX20sIHRtcDFfbSwgdG1wMF9tLCB0bXAxX20sIG91dDAsIG91dDIpOyAgICAgICAgICAgICAgIFwKKyAgSUxWT0RfQjJfU0Qob3V0MSwgb3V0MywgdG1wMl9tLCB0bXAzX20sIHRtcDBfbSwgdG1wMV9tKTsgICAgICAgICAgICAgICAgIFwKKyAgSUxWRVZPRF9IMl9VQih0bXAwX20sIHRtcDFfbSwgdG1wMF9tLCB0bXAxX20sIG91dDEsIG91dDMpOyAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKy8qIERlc2NyaXB0aW9uIDogVHJhbnNwb3NlIDE2eDggYmxvY2sgaW50byA4eDE2IHdpdGggYnl0ZSBlbGVtZW50cyBpbiB2ZWN0b3JzCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAgLSBpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBpbjYsIGluNywKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGluOCwgaW45LCBpbjEwLCBpbjExLCBpbjEyLCBpbjEzLCBpbjE0LCBpbjE1CisgKiAgICAgICAgICAgICAgIE91dHB1dHMgLSBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBvdXQ0LCBvdXQ1LCBvdXQ2LCBvdXQ3CisgKiAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gdW5zaWduZWQgYnl0ZQorICovCisjZGVmaW5lIFRSQU5TUE9TRTE2eDhfVUJfVUIoaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSwgaW42LCBpbjcsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW44LCBpbjksIGluMTAsIGluMTEsIGluMTIsIGluMTMsIGluMTQsIGluMTUsICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0MCwgb3V0MSwgb3V0Miwgb3V0Mywgb3V0NCwgb3V0NSwgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Niwgb3V0NykgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHY4aTE2IHRtcDBfbSwgdG1wMV9tLCB0bXA0X20sIHRtcDVfbSwgdG1wNl9tLCB0bXA3X207ICAgICAgICAgICAgICAgICAgICBcCisgIHY0aTMyIHRtcDJfbSwgdG1wM19tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElMVkVWX0QyX1VCKGluMCwgaW44LCBpbjEsIGluOSwgb3V0Nywgb3V0Nik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElMVkVWX0QyX1VCKGluMiwgaW4xMCwgaW4zLCBpbjExLCBvdXQ1LCBvdXQ0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElMVkVWX0QyX1VCKGluNCwgaW4xMiwgaW41LCBpbjEzLCBvdXQzLCBvdXQyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElMVkVWX0QyX1VCKGluNiwgaW4xNCwgaW43LCBpbjE1LCBvdXQxLCBvdXQwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElMVkVWX0IyX1NIKG91dDcsIG91dDYsIG91dDUsIG91dDQsIHRtcDBfbSwgdG1wMV9tKTsgICAgICAgICAgICAgICAgICAgICBcCisgIElMVk9EX0IyX1NIKG91dDcsIG91dDYsIG91dDUsIG91dDQsIHRtcDRfbSwgdG1wNV9tKTsgICAgICAgICAgICAgICAgICAgICBcCisgIElMVkVWX0IyX1VCKG91dDMsIG91dDIsIG91dDEsIG91dDAsIG91dDUsIG91dDcpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElMVk9EX0IyX1NIKG91dDMsIG91dDIsIG91dDEsIG91dDAsIHRtcDZfbSwgdG1wN19tKTsgICAgICAgICAgICAgICAgICAgICBcCisgIElMVkVWX0gyX1NXKHRtcDBfbSwgdG1wMV9tLCBvdXQ1LCBvdXQ3LCB0bXAyX20sIHRtcDNfbSk7ICAgICAgICAgICAgICAgICBcCisgIElMVkVWT0RfVzJfVUIodG1wMl9tLCB0bXAzX20sIHRtcDJfbSwgdG1wM19tLCBvdXQwLCBvdXQ0KTsgICAgICAgICAgICAgICBcCisgIElMVk9EX0gyX1NXKHRtcDBfbSwgdG1wMV9tLCBvdXQ1LCBvdXQ3LCB0bXAyX20sIHRtcDNfbSk7ICAgICAgICAgICAgICAgICBcCisgIElMVkVWT0RfVzJfVUIodG1wMl9tLCB0bXAzX20sIHRtcDJfbSwgdG1wM19tLCBvdXQyLCBvdXQ2KTsgICAgICAgICAgICAgICBcCisgIElMVkVWX0gyX1NXKHRtcDRfbSwgdG1wNV9tLCB0bXA2X20sIHRtcDdfbSwgdG1wMl9tLCB0bXAzX20pOyAgICAgICAgICAgICBcCisgIElMVkVWT0RfVzJfVUIodG1wMl9tLCB0bXAzX20sIHRtcDJfbSwgdG1wM19tLCBvdXQxLCBvdXQ1KTsgICAgICAgICAgICAgICBcCisgIElMVk9EX0gyX1NXKHRtcDRfbSwgdG1wNV9tLCB0bXA2X20sIHRtcDdfbSwgdG1wMl9tLCB0bXAzX20pOyAgICAgICAgICAgICBcCisgIElMVkVWT0RfVzJfVUIodG1wMl9tLCB0bXAzX20sIHRtcDJfbSwgdG1wM19tLCBvdXQzLCBvdXQ3KTsgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisvKiBEZXNjcmlwdGlvbiA6IFRyYW5zcG9zZSA0eDQgYmxvY2sgd2l0aCB3b3JkIGVsZW1lbnRzIGluIHZlY3RvcnMKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIGluMCwgaW4xLCBpbjIsIGluMworICogICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEsIG91dDIsIG91dDMKKyAqICAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gYXMgcGVyIFJUWVBFCisgKi8KKyNkZWZpbmUgVFJBTlNQT1NFNHg0X1coUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHY0aTMyIHMwX20sIHMxX20sIHMyX20sIHMzX207ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSUxWUkxfVzJfU1coaW4xLCBpbjAsIHMwX20sIHMxX20pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTFZSTF9XMl9TVyhpbjMsIGluMiwgczJfbSwgczNfbSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG91dDAgPSAoUlRZUEUpX19tc2FfaWx2cl9kKCh2Mmk2NClzMl9tLCAodjJpNjQpczBfbSk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgb3V0MSA9IChSVFlQRSlfX21zYV9pbHZsX2QoKHYyaTY0KXMyX20sICh2Mmk2NClzMF9tKTsgICAgICAgICAgICAgICAgICAgICAgXAorICBvdXQyID0gKFJUWVBFKV9fbXNhX2lsdnJfZCgodjJpNjQpczNfbSwgKHYyaTY0KXMxX20pOyAgICAgICAgICAgICAgICAgICAgICBcCisgIG91dDMgPSAoUlRZUEUpX19tc2FfaWx2bF9kKCh2Mmk2NClzM19tLCAodjJpNjQpczFfbSk7ICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIFRSQU5TUE9TRTR4NF9TV19TVyguLi4pIFRSQU5TUE9TRTR4NF9XKHY0aTMyLCBfX1ZBX0FSR1NfXykKKworLyogRGVzY3JpcHRpb24gOiBBZGQgYmxvY2sgNHg0CisgKiBBcmd1bWVudHMgICA6IElucHV0cyAtIGluMCwgaW4xLCBpbjIsIGluMywgcGRzdCwgc3RyaWRlCisgKiBEZXRhaWxzICAgICA6IExlYXN0IHNpZ25pZmljYW50IDQgYnl0ZXMgZnJvbSBlYWNoIGlucHV0IHZlY3RvciBhcmUgYWRkZWQgdG8KKyAqICAgICAgICAgICAgICAgdGhlIGRlc3RpbmF0aW9uIGJ5dGVzLCBjbGlwcGVkIGJldHdlZW4gMC0yNTUgYW5kIHN0b3JlZC4KKyAqLworI2RlZmluZSBBRERCTEtfU1Q0eDRfVUIoaW4wLCBpbjEsIGluMiwgaW4zLCBwZHN0LCBzdHJpZGUpIGRvIHsgIFwKKyAgdWludDMyX3Qgc3JjMF9tLCBzcmMxX20sIHNyYzJfbSwgc3JjM19tOyAgICAgICAgICAgICAgICAgICAgICBcCisgIHY4aTE2IGlucDBfbSwgaW5wMV9tLCByZXMwX20sIHJlczFfbTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2MTZpOCBkc3QwX20gPSB7IDAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdjE2aTggZHN0MV9tID0geyAwIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHYxNmk4IHplcm9fbSA9IHsgMCB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTFZSX0QyX1NIKGluMSwgaW4wLCBpbjMsIGluMiwgaW5wMF9tLCBpbnAxX20pOyAgICAgICAgICAgICAgIFwKKyAgTFc0KHBkc3QsIHN0cmlkZSwgc3JjMF9tLCBzcmMxX20sIHNyYzJfbSwgc3JjM19tKTsgICAgICAgICAgICBcCisgIElOU0VSVF9XMl9TQihzcmMwX20sIHNyYzFfbSwgZHN0MF9tKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTlNFUlRfVzJfU0Ioc3JjMl9tLCBzcmMzX20sIGRzdDFfbSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSUxWUl9CMl9TSCh6ZXJvX20sIGRzdDBfbSwgemVyb19tLCBkc3QxX20sIHJlczBfbSwgcmVzMV9tKTsgICBcCisgIEFERDIocmVzMF9tLCBpbnAwX20sIHJlczFfbSwgaW5wMV9tLCByZXMwX20sIHJlczFfbSk7ICAgICAgICAgXAorICBDTElQX1NIMl8wXzI1NShyZXMwX20sIHJlczFfbSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgUENLRVZfQjJfU0IocmVzMF9tLCByZXMwX20sIHJlczFfbSwgcmVzMV9tLCBkc3QwX20sIGRzdDFfbSk7ICBcCisgIFNUNHg0X1VCKGRzdDBfbSwgZHN0MV9tLCAwLCAxLCAwLCAxLCBwZHN0LCBzdHJpZGUpOyAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworLyogRGVzY3JpcHRpb24gOiBQYWNrIGV2ZW4gYnl0ZSBlbGVtZW50cywgZXh0cmFjdCAwICYgMiBpbmRleCB3b3JkcyBmcm9tIHBhaXIKKyAqICAgICAgICAgICAgICAgb2YgcmVzdWx0cyBhbmQgc3RvcmUgNCB3b3JkcyBpbiBkZXN0aW5hdGlvbiBtZW1vcnkgYXMgcGVyCisgKiAgICAgICAgICAgICAgIHN0cmlkZQorICogQXJndW1lbnRzICAgOiBJbnB1dHMgLSBpbjAsIGluMSwgaW4yLCBpbjMsIHBkc3QsIHN0cmlkZQorICovCisjZGVmaW5lIFBDS0VWX1NUNHg0X1VCKGluMCwgaW4xLCBpbjIsIGluMywgcGRzdCwgc3RyaWRlKSBkbyB7ICBcCisgIHYxNmk4IHRtcDBfbSwgdG1wMV9tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFBDS0VWX0IyX1NCKGluMSwgaW4wLCBpbjMsIGluMiwgdG1wMF9tLCB0bXAxX20pOyAgICAgICAgICAgICBcCisgIFNUNHg0X1VCKHRtcDBfbSwgdG1wMV9tLCAwLCAyLCAwLCAyLCBwZHN0LCBzdHJpZGUpOyAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisvKiBEZXNjcmlwdGlvbiA6IGF2ZXJhZ2Ugd2l0aCByb3VuZGluZyAoaW4wICsgaW4xICsgMSkgLyAyLgorICogQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4wLCBpbjEsIGluMiwgaW4zLAorICogICAgICAgICAgICAgICBPdXRwdXRzIC0gb3V0MCwgb3V0MQorICogICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIGFzIHBlciBSVFlQRQorICogRGV0YWlscyAgICAgOiBFYWNoIHVuc2lnbmVkIGJ5dGUgZWxlbWVudCBmcm9tICdpbjAnIHZlY3RvciBpcyBhZGRlZCB3aXRoCisgKiAgICAgICAgICAgICAgIGVhY2ggdW5zaWduZWQgYnl0ZSBlbGVtZW50IGZyb20gJ2luMScgdmVjdG9yLiBUaGVuIHRoZSBhdmVyYWdlCisgKiAgICAgICAgICAgICAgIHdpdGggcm91bmRpbmcgaXMgY2FsY3VsYXRlZCBhbmQgd3JpdHRlbiB0byAnb3V0MCcKKyAqLworI2RlZmluZSBBVkVSX1VCMihSVFlQRSwgaW4wLCBpbjEsIGluMiwgaW4zLCBvdXQwLCBvdXQxKSBkbyB7ICBcCisgIG91dDAgPSAoUlRZUEUpX19tc2FfYXZlcl91X2IoKHYxNnU4KWluMCwgKHYxNnU4KWluMSk7ICAgICAgIFwKKyAgb3V0MSA9IChSVFlQRSlfX21zYV9hdmVyX3VfYigodjE2dTgpaW4yLCAodjE2dTgpaW4zKTsgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgQVZFUl9VQjJfVUIoLi4uKSBBVkVSX1VCMih2MTZ1OCwgX19WQV9BUkdTX18pCisKKyNlbmRpZiAgLyogV0VCUF9EU1BfTVNBX01BQ1JPX0hfICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL25lb24uaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbmVvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMWRlYTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL25lb24uaApAQCAtMCwwICsxLDEwMSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICBORU9OIGNvbW1vbiBjb2RlLgorCisjaWZuZGVmIFdFQlBfRFNQX05FT05fSF8KKyNkZWZpbmUgV0VCUF9EU1BfTkVPTl9IXworCisjaW5jbHVkZSA8YXJtX25lb24uaD4KKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKy8vIFJpZ2h0IG5vdywgc29tZSBpbnRyaW5zaWNzIGZ1bmN0aW9ucyBzZWVtIHNsb3dlciwgc28gd2UgZGlzYWJsZSB0aGVtCisvLyBldmVyeXdoZXJlIGV4Y2VwdCBuZXdlciBjbGFuZy9nY2Mgb3IgYWFyY2g2NCB3aGVyZSB0aGUgaW5saW5lIGFzc2VtYmx5IGlzCisvLyBpbmNvbXBhdGlibGUuCisjaWYgTE9DQUxfQ0xBTkdfUFJFUkVRKDMsOCkgfHwgTE9DQUxfR0NDX1BSRVJFUSg0LDkpIHx8IGRlZmluZWQoX19hYXJjaDY0X18pCisjZGVmaW5lIFdFQlBfVVNFX0lOVFJJTlNJQ1MgICAvLyB1c2UgaW50cmluc2ljcyB3aGVuIHBvc3NpYmxlCisjZW5kaWYKKworI2RlZmluZSBJTklUX1ZFQ1RPUjIodiwgYSwgYikgZG8geyAgXAorICB2LnZhbFswXSA9IGE7ICAgICAgICAgICAgICAgICAgICAgXAorICB2LnZhbFsxXSA9IGI7ICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBJTklUX1ZFQ1RPUjModiwgYSwgYiwgYykgZG8geyAgXAorICB2LnZhbFswXSA9IGE7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2LnZhbFsxXSA9IGI7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2LnZhbFsyXSA9IGM7ICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBJTklUX1ZFQ1RPUjQodiwgYSwgYiwgYywgZCkgZG8geyAgXAorICB2LnZhbFswXSA9IGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2LnZhbFsxXSA9IGI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2LnZhbFsyXSA9IGM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2LnZhbFszXSA9IGQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworLy8gaWYgdXNpbmcgaW50cmluc2ljcywgdGhpcyBmbGFnIGF2b2lkcyBzb21lIGZ1bmN0aW9ucyB0aGF0IG1ha2UgZ2NjLTQuNi4zCisvLyBjcmFzaCAoImludGVybmFsIGNvbXBpbGVyIGVycm9yOiBpbiBpbW1lZF9kb3VibGVfY29uc3QsIGF0IGVtaXQtcnRsLiIpLgorLy8gKHByb2JhYmx5IHNpbWlsYXIgdG8gZ2NjLmdudS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTQ4MTgzKQorI2lmICEoTE9DQUxfQ0xBTkdfUFJFUkVRKDMsOCkgfHwgTE9DQUxfR0NDX1BSRVJFUSg0LDgpIHx8IGRlZmluZWQoX19hYXJjaDY0X18pKQorI2RlZmluZSBXT1JLX0FST1VORF9HQ0MKKyNlbmRpZgorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50MzJ4NHg0X3QgVHJhbnNwb3NlNHg0X05FT04oY29uc3QgaW50MzJ4NHg0X3Qgcm93cykgeworICB1aW50NjR4MngyX3Qgcm93MDEsIHJvdzIzOworCisgIHJvdzAxLnZhbFswXSA9IHZyZWludGVycHJldHFfdTY0X3MzMihyb3dzLnZhbFswXSk7CisgIHJvdzAxLnZhbFsxXSA9IHZyZWludGVycHJldHFfdTY0X3MzMihyb3dzLnZhbFsxXSk7CisgIHJvdzIzLnZhbFswXSA9IHZyZWludGVycHJldHFfdTY0X3MzMihyb3dzLnZhbFsyXSk7CisgIHJvdzIzLnZhbFsxXSA9IHZyZWludGVycHJldHFfdTY0X3MzMihyb3dzLnZhbFszXSk7CisgIC8vIFRyYW5zcG9zZSA2NC1iaXQgdmFsdWVzICh0aGVyZSdzIG5vIHZzd3AgZXF1aXZhbGVudCkKKyAgeworICAgIGNvbnN0IHVpbnQ2NHgxX3Qgcm93MGggPSB2Z2V0X2hpZ2hfdTY0KHJvdzAxLnZhbFswXSk7CisgICAgY29uc3QgdWludDY0eDFfdCByb3cybCA9IHZnZXRfbG93X3U2NChyb3cyMy52YWxbMF0pOworICAgIGNvbnN0IHVpbnQ2NHgxX3Qgcm93MWggPSB2Z2V0X2hpZ2hfdTY0KHJvdzAxLnZhbFsxXSk7CisgICAgY29uc3QgdWludDY0eDFfdCByb3czbCA9IHZnZXRfbG93X3U2NChyb3cyMy52YWxbMV0pOworICAgIHJvdzAxLnZhbFswXSA9IHZjb21iaW5lX3U2NCh2Z2V0X2xvd191NjQocm93MDEudmFsWzBdKSwgcm93MmwpOworICAgIHJvdzIzLnZhbFswXSA9IHZjb21iaW5lX3U2NChyb3cwaCwgdmdldF9oaWdoX3U2NChyb3cyMy52YWxbMF0pKTsKKyAgICByb3cwMS52YWxbMV0gPSB2Y29tYmluZV91NjQodmdldF9sb3dfdTY0KHJvdzAxLnZhbFsxXSksIHJvdzNsKTsKKyAgICByb3cyMy52YWxbMV0gPSB2Y29tYmluZV91NjQocm93MWgsIHZnZXRfaGlnaF91NjQocm93MjMudmFsWzFdKSk7CisgIH0KKyAgeworICAgIGNvbnN0IGludDMyeDR4Ml90IG91dDAxID0gdnRybnFfczMyKHZyZWludGVycHJldHFfczMyX3U2NChyb3cwMS52YWxbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZyZWludGVycHJldHFfczMyX3U2NChyb3cwMS52YWxbMV0pKTsKKyAgICBjb25zdCBpbnQzMng0eDJfdCBvdXQyMyA9IHZ0cm5xX3MzMih2cmVpbnRlcnByZXRxX3MzMl91NjQocm93MjMudmFsWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cmVpbnRlcnByZXRxX3MzMl91NjQocm93MjMudmFsWzFdKSk7CisgICAgaW50MzJ4NHg0X3Qgb3V0OworICAgIG91dC52YWxbMF0gPSBvdXQwMS52YWxbMF07CisgICAgb3V0LnZhbFsxXSA9IG91dDAxLnZhbFsxXTsKKyAgICBvdXQudmFsWzJdID0gb3V0MjMudmFsWzBdOworICAgIG91dC52YWxbM10gPSBvdXQyMy52YWxbMV07CisgICAgcmV0dXJuIG91dDsKKyAgfQorfQorCisjaWYgMCAgICAgLy8gVXNlZnVsIGRlYnVnIG1hY3JvLgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjZGVmaW5lIFBSSU5UX1JFRyhSRUcsIFNJWkUpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBwcmludGYoIiVzIFx0WyVkXTogMHgiLCAjUkVHLCBTSVpFKTsgICAgICAgICAgICAgICAgICBcCisgIGlmIChTSVpFID09IDgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90IF90bXBbOF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZzdDFfdTgoX3RtcCwgKFJFRykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpID0gMDsgaSA8IDg7ICsraSkgcHJpbnRmKCIlLjJ4ICIsIF90bXBbaV0pOyAgIFwKKyAgfSBlbHNlIGlmIChTSVpFID09IDE2KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQxNl90IF90bXBbNF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdnN0MV91MTYoX3RtcCwgKFJFRykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSBwcmludGYoIiUuNHggIiwgX3RtcFtpXSk7ICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHByaW50ZigiXG4iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisjZW5kaWYKKworI2VuZGlmICAvLyBXRUJQX0RTUF9ORU9OX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3Jlc2NhbGVyLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3Jlc2NhbGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQzZTE0MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvcmVzY2FsZXIuYwpAQCAtMCwwICsxLDI1NiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFJlc2NhbGluZyBmdW5jdGlvbnMKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vYXNzZXJ0X3BvZW0uaCIKKyNlbHNlCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZW5kaWYKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL3Jlc2NhbGVyX3V0aWxzLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbXBsZW1lbnRhdGlvbnMgb2YgY3JpdGljYWwgZnVuY3Rpb25zIEltcG9ydFJvdyAvIEV4cG9ydFJvdworCisjZGVmaW5lIFJPVU5ERVIgKFdFQlBfUkVTQ0FMRVJfT05FID4+IDEpCisjZGVmaW5lIE1VTFRfRklYKHgsIHkpICgoKHVpbnQ2NF90KSh4KSAqICh5KSArIFJPVU5ERVIpID4+IFdFQlBfUkVTQ0FMRVJfUkZJWCkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJvdyBpbXBvcnQKKwordm9pZCBXZWJQUmVzY2FsZXJJbXBvcnRSb3dFeHBhbmRfQyhXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjKSB7CisgIGNvbnN0IGludCB4X3N0cmlkZSA9IHdyay0+bnVtX2NoYW5uZWxzOworICBjb25zdCBpbnQgeF9vdXRfbWF4ID0gd3JrLT5kc3Rfd2lkdGggKiB3cmstPm51bV9jaGFubmVsczsKKyAgaW50IGNoYW5uZWw7CisgIGFzc2VydCghV2ViUFJlc2NhbGVySW5wdXREb25lKHdyaykpOworICBhc3NlcnQod3JrLT54X2V4cGFuZCk7CisgIGZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCB4X3N0cmlkZTsgKytjaGFubmVsKSB7CisgICAgaW50IHhfaW4gPSBjaGFubmVsOworICAgIGludCB4X291dCA9IGNoYW5uZWw7CisgICAgLy8gc2ltcGxlIGJpbGluZWFyIGludGVycG9sYXRpb24KKyAgICBpbnQgYWNjdW0gPSB3cmstPnhfYWRkOworICAgIGludCBsZWZ0ID0gc3JjW3hfaW5dOworICAgIGludCByaWdodCA9ICh3cmstPnNyY193aWR0aCA+IDEpID8gc3JjW3hfaW4gKyB4X3N0cmlkZV0gOiBsZWZ0OworICAgIHhfaW4gKz0geF9zdHJpZGU7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgIHdyay0+ZnJvd1t4X291dF0gPSByaWdodCAqIHdyay0+eF9hZGQgKyAobGVmdCAtIHJpZ2h0KSAqIGFjY3VtOworICAgICAgeF9vdXQgKz0geF9zdHJpZGU7CisgICAgICBpZiAoeF9vdXQgPj0geF9vdXRfbWF4KSBicmVhazsKKyAgICAgIGFjY3VtIC09IHdyay0+eF9zdWI7CisgICAgICBpZiAoYWNjdW0gPCAwKSB7CisgICAgICAgIGxlZnQgPSByaWdodDsKKyAgICAgICAgeF9pbiArPSB4X3N0cmlkZTsKKyAgICAgICAgYXNzZXJ0KHhfaW4gPCB3cmstPnNyY193aWR0aCAqIHhfc3RyaWRlKTsKKyAgICAgICAgcmlnaHQgPSBzcmNbeF9pbl07CisgICAgICAgIGFjY3VtICs9IHdyay0+eF9hZGQ7CisgICAgICB9CisgICAgfQorICAgIGFzc2VydCh3cmstPnhfc3ViID09IDAgLyogPC0gc3BlY2lhbCBjYXNlIGZvciBzcmNfd2lkdGg9MSAqLyB8fCBhY2N1bSA9PSAwKTsKKyAgfQorfQorCit2b2lkIFdlYlBSZXNjYWxlckltcG9ydFJvd1Nocmlua19DKFdlYlBSZXNjYWxlciogY29uc3Qgd3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmMpIHsKKyAgY29uc3QgaW50IHhfc3RyaWRlID0gd3JrLT5udW1fY2hhbm5lbHM7CisgIGNvbnN0IGludCB4X291dF9tYXggPSB3cmstPmRzdF93aWR0aCAqIHdyay0+bnVtX2NoYW5uZWxzOworICBpbnQgY2hhbm5lbDsKKyAgYXNzZXJ0KCFXZWJQUmVzY2FsZXJJbnB1dERvbmUod3JrKSk7CisgIGFzc2VydCghd3JrLT54X2V4cGFuZCk7CisgIGZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCB4X3N0cmlkZTsgKytjaGFubmVsKSB7CisgICAgaW50IHhfaW4gPSBjaGFubmVsOworICAgIGludCB4X291dCA9IGNoYW5uZWw7CisgICAgdWludDMyX3Qgc3VtID0gMDsKKyAgICBpbnQgYWNjdW0gPSAwOworICAgIHdoaWxlICh4X291dCA8IHhfb3V0X21heCkgeworICAgICAgdWludDMyX3QgYmFzZSA9IDA7CisgICAgICBhY2N1bSArPSB3cmstPnhfYWRkOworICAgICAgd2hpbGUgKGFjY3VtID4gMCkgeworICAgICAgICBhY2N1bSAtPSB3cmstPnhfc3ViOworICAgICAgICBhc3NlcnQoeF9pbiA8IHdyay0+c3JjX3dpZHRoICogeF9zdHJpZGUpOworICAgICAgICBiYXNlID0gc3JjW3hfaW5dOworICAgICAgICBzdW0gKz0gYmFzZTsKKyAgICAgICAgeF9pbiArPSB4X3N0cmlkZTsKKyAgICAgIH0KKyAgICAgIHsgICAgICAgIC8vIEVtaXQgbmV4dCBob3Jpem9udGFsIHBpeGVsLgorICAgICAgICBjb25zdCByZXNjYWxlcl90IGZyYWMgPSBiYXNlICogKC1hY2N1bSk7CisgICAgICAgIHdyay0+ZnJvd1t4X291dF0gPSBzdW0gKiB3cmstPnhfc3ViIC0gZnJhYzsKKyAgICAgICAgLy8gZnJlc2ggZnJhY3Rpb25hbCBzdGFydCBmb3IgbmV4dCBwaXhlbAorICAgICAgICBzdW0gPSAoaW50KU1VTFRfRklYKGZyYWMsIHdyay0+Znhfc2NhbGUpOworICAgICAgfQorICAgICAgeF9vdXQgKz0geF9zdHJpZGU7CisgICAgfQorICAgIGFzc2VydChhY2N1bSA9PSAwKTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUm93IGV4cG9ydAorCit2b2lkIFdlYlBSZXNjYWxlckV4cG9ydFJvd0V4cGFuZF9DKFdlYlBSZXNjYWxlciogY29uc3Qgd3JrKSB7CisgIGludCB4X291dDsKKyAgdWludDhfdCogY29uc3QgZHN0ID0gd3JrLT5kc3Q7CisgIHJlc2NhbGVyX3QqIGNvbnN0IGlyb3cgPSB3cmstPmlyb3c7CisgIGNvbnN0IGludCB4X291dF9tYXggPSB3cmstPmRzdF93aWR0aCAqIHdyay0+bnVtX2NoYW5uZWxzOworICBjb25zdCByZXNjYWxlcl90KiBjb25zdCBmcm93ID0gd3JrLT5mcm93OworICBhc3NlcnQoIVdlYlBSZXNjYWxlck91dHB1dERvbmUod3JrKSk7CisgIGFzc2VydCh3cmstPnlfYWNjdW0gPD0gMCk7CisgIGFzc2VydCh3cmstPnlfZXhwYW5kKTsKKyAgYXNzZXJ0KHdyay0+eV9zdWIgIT0gMCk7CisgIGlmICh3cmstPnlfYWNjdW0gPT0gMCkgeworICAgIGZvciAoeF9vdXQgPSAwOyB4X291dCA8IHhfb3V0X21heDsgKyt4X291dCkgeworICAgICAgY29uc3QgdWludDMyX3QgSiA9IGZyb3dbeF9vdXRdOworICAgICAgY29uc3QgaW50IHYgPSAoaW50KU1VTFRfRklYKEosIHdyay0+Znlfc2NhbGUpOworICAgICAgYXNzZXJ0KHYgPj0gMCAmJiB2IDw9IDI1NSk7CisgICAgICBkc3RbeF9vdXRdID0gdjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgY29uc3QgdWludDMyX3QgQiA9IFdFQlBfUkVTQ0FMRVJfRlJBQygtd3JrLT55X2FjY3VtLCB3cmstPnlfc3ViKTsKKyAgICBjb25zdCB1aW50MzJfdCBBID0gKHVpbnQzMl90KShXRUJQX1JFU0NBTEVSX09ORSAtIEIpOworICAgIGZvciAoeF9vdXQgPSAwOyB4X291dCA8IHhfb3V0X21heDsgKyt4X291dCkgeworICAgICAgY29uc3QgdWludDY0X3QgSSA9ICh1aW50NjRfdClBICogZnJvd1t4X291dF0KKyAgICAgICAgICAgICAgICAgICAgICAgKyAodWludDY0X3QpQiAqIGlyb3dbeF9vdXRdOworICAgICAgY29uc3QgdWludDMyX3QgSiA9ICh1aW50MzJfdCkoKEkgKyBST1VOREVSKSA+PiBXRUJQX1JFU0NBTEVSX1JGSVgpOworICAgICAgY29uc3QgaW50IHYgPSAoaW50KU1VTFRfRklYKEosIHdyay0+Znlfc2NhbGUpOworICAgICAgYXNzZXJ0KHYgPj0gMCAmJiB2IDw9IDI1NSk7CisgICAgICBkc3RbeF9vdXRdID0gdjsKKyAgICB9CisgIH0KK30KKwordm9pZCBXZWJQUmVzY2FsZXJFeHBvcnRSb3dTaHJpbmtfQyhXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaykgeworICBpbnQgeF9vdXQ7CisgIHVpbnQ4X3QqIGNvbnN0IGRzdCA9IHdyay0+ZHN0OworICByZXNjYWxlcl90KiBjb25zdCBpcm93ID0gd3JrLT5pcm93OworICBjb25zdCBpbnQgeF9vdXRfbWF4ID0gd3JrLT5kc3Rfd2lkdGggKiB3cmstPm51bV9jaGFubmVsczsKKyAgY29uc3QgcmVzY2FsZXJfdCogY29uc3QgZnJvdyA9IHdyay0+ZnJvdzsKKyAgY29uc3QgdWludDMyX3QgeXNjYWxlID0gd3JrLT5meV9zY2FsZSAqICgtd3JrLT55X2FjY3VtKTsKKyAgYXNzZXJ0KCFXZWJQUmVzY2FsZXJPdXRwdXREb25lKHdyaykpOworICBhc3NlcnQod3JrLT55X2FjY3VtIDw9IDApOworICBhc3NlcnQoIXdyay0+eV9leHBhbmQpOworICBpZiAoeXNjYWxlKSB7CisgICAgZm9yICh4X291dCA9IDA7IHhfb3V0IDwgeF9vdXRfbWF4OyArK3hfb3V0KSB7CisgICAgICBjb25zdCB1aW50MzJfdCBmcmFjID0gKHVpbnQzMl90KU1VTFRfRklYKGZyb3dbeF9vdXRdLCB5c2NhbGUpOworICAgICAgY29uc3QgaW50IHYgPSAoaW50KU1VTFRfRklYKGlyb3dbeF9vdXRdIC0gZnJhYywgd3JrLT5meHlfc2NhbGUpOworICAgICAgYXNzZXJ0KHYgPj0gMCAmJiB2IDw9IDI1NSk7CisgICAgICBkc3RbeF9vdXRdID0gdjsKKyAgICAgIGlyb3dbeF9vdXRdID0gZnJhYzsgICAvLyBuZXcgZnJhY3Rpb25hbCBzdGFydAorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKHhfb3V0ID0gMDsgeF9vdXQgPCB4X291dF9tYXg7ICsreF9vdXQpIHsKKyAgICAgIGNvbnN0IGludCB2ID0gKGludClNVUxUX0ZJWChpcm93W3hfb3V0XSwgd3JrLT5meHlfc2NhbGUpOworICAgICAgYXNzZXJ0KHYgPj0gMCAmJiB2IDw9IDI1NSk7CisgICAgICBkc3RbeF9vdXRdID0gdjsKKyAgICAgIGlyb3dbeF9vdXRdID0gMDsKKyAgICB9CisgIH0KK30KKworI3VuZGVmIE1VTFRfRklYCisjdW5kZWYgUk9VTkRFUgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWFpbiBlbnRyeSBjYWxscworCit2b2lkIFdlYlBSZXNjYWxlckltcG9ydFJvdyhXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaywgY29uc3QgdWludDhfdCogc3JjKSB7CisgIGFzc2VydCghV2ViUFJlc2NhbGVySW5wdXREb25lKHdyaykpOworICBpZiAoIXdyay0+eF9leHBhbmQpIHsKKyAgICBXZWJQUmVzY2FsZXJJbXBvcnRSb3dTaHJpbmsod3JrLCBzcmMpOworICB9IGVsc2UgeworICAgIFdlYlBSZXNjYWxlckltcG9ydFJvd0V4cGFuZCh3cmssIHNyYyk7CisgIH0KK30KKwordm9pZCBXZWJQUmVzY2FsZXJFeHBvcnRSb3coV2ViUFJlc2NhbGVyKiBjb25zdCB3cmspIHsKKyAgaWYgKHdyay0+eV9hY2N1bSA8PSAwKSB7CisgICAgYXNzZXJ0KCFXZWJQUmVzY2FsZXJPdXRwdXREb25lKHdyaykpOworICAgIGlmICh3cmstPnlfZXhwYW5kKSB7CisgICAgICBXZWJQUmVzY2FsZXJFeHBvcnRSb3dFeHBhbmQod3JrKTsKKyAgICB9IGVsc2UgaWYgKHdyay0+Znh5X3NjYWxlKSB7CisgICAgICBXZWJQUmVzY2FsZXJFeHBvcnRSb3dTaHJpbmsod3JrKTsKKyAgICB9IGVsc2UgeyAgLy8gc3BlY2lhbCBjYXNlCisgICAgICBpbnQgaTsKKyAgICAgIGFzc2VydCh3cmstPnNyY19oZWlnaHQgPT0gd3JrLT5kc3RfaGVpZ2h0ICYmIHdyay0+eF9hZGQgPT0gMSk7CisgICAgICBhc3NlcnQod3JrLT5zcmNfd2lkdGggPT0gMSAmJiB3cmstPmRzdF93aWR0aCA8PSAyKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCB3cmstPm51bV9jaGFubmVscyAqIHdyay0+ZHN0X3dpZHRoOyArK2kpIHsKKyAgICAgICAgd3JrLT5kc3RbaV0gPSB3cmstPmlyb3dbaV07CisgICAgICAgIHdyay0+aXJvd1tpXSA9IDA7CisgICAgICB9CisgICAgfQorICAgIHdyay0+eV9hY2N1bSArPSB3cmstPnlfYWRkOworICAgIHdyay0+ZHN0ICs9IHdyay0+ZHN0X3N0cmlkZTsKKyAgICArK3dyay0+ZHN0X3k7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2ViUFJlc2NhbGVySW1wb3J0Um93RnVuYyBXZWJQUmVzY2FsZXJJbXBvcnRSb3dFeHBhbmQ7CitXZWJQUmVzY2FsZXJJbXBvcnRSb3dGdW5jIFdlYlBSZXNjYWxlckltcG9ydFJvd1NocmluazsKKworV2ViUFJlc2NhbGVyRXhwb3J0Um93RnVuYyBXZWJQUmVzY2FsZXJFeHBvcnRSb3dFeHBhbmQ7CitXZWJQUmVzY2FsZXJFeHBvcnRSb3dGdW5jIFdlYlBSZXNjYWxlckV4cG9ydFJvd1NocmluazsKKworZXh0ZXJuIHZvaWQgV2ViUFJlc2NhbGVyRHNwSW5pdFNTRTIodm9pZCk7CitleHRlcm4gdm9pZCBXZWJQUmVzY2FsZXJEc3BJbml0TUlQUzMyKHZvaWQpOworZXh0ZXJuIHZvaWQgV2ViUFJlc2NhbGVyRHNwSW5pdE1JUFNkc3BSMih2b2lkKTsKK2V4dGVybiB2b2lkIFdlYlBSZXNjYWxlckRzcEluaXRNU0Eodm9pZCk7CitleHRlcm4gdm9pZCBXZWJQUmVzY2FsZXJEc3BJbml0TkVPTih2b2lkKTsKKworV0VCUF9EU1BfSU5JVF9GVU5DKFdlYlBSZXNjYWxlckRzcEluaXQpIHsKKyNpZiAhZGVmaW5lZChXRUJQX1JFRFVDRV9TSVpFKQorI2lmICFXRUJQX05FT05fT01JVF9DX0NPREUKKyAgV2ViUFJlc2NhbGVyRXhwb3J0Um93RXhwYW5kID0gV2ViUFJlc2NhbGVyRXhwb3J0Um93RXhwYW5kX0M7CisgIFdlYlBSZXNjYWxlckV4cG9ydFJvd1NocmluayA9IFdlYlBSZXNjYWxlckV4cG9ydFJvd1Nocmlua19DOworI2VuZGlmCisKKyAgV2ViUFJlc2NhbGVySW1wb3J0Um93RXhwYW5kID0gV2ViUFJlc2NhbGVySW1wb3J0Um93RXhwYW5kX0M7CisgIFdlYlBSZXNjYWxlckltcG9ydFJvd1NocmluayA9IFdlYlBSZXNjYWxlckltcG9ydFJvd1Nocmlua19DOworCisgIGlmIChWUDhHZXRDUFVJbmZvICE9IE5VTEwpIHsKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTIpCisgICAgaWYgKFZQOEdldENQVUluZm8oa1NTRTIpKSB7CisgICAgICBXZWJQUmVzY2FsZXJEc3BJbml0U1NFMigpOworICAgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQUzMyKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtNSVBTMzIpKSB7CisgICAgICBXZWJQUmVzY2FsZXJEc3BJbml0TUlQUzMyKCk7CisgICAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTX0RTUF9SMikKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrTUlQU2RzcFIyKSkgeworICAgICAgV2ViUFJlc2NhbGVyRHNwSW5pdE1JUFNkc3BSMigpOworICAgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoV0VCUF9VU0VfTVNBKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtNU0EpKSB7CisgICAgICBXZWJQUmVzY2FsZXJEc3BJbml0TVNBKCk7CisgICAgfQorI2VuZGlmCisgIH0KKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTkVPTikKKyAgaWYgKFdFQlBfTkVPTl9PTUlUX0NfQ09ERSB8fAorICAgICAgKFZQOEdldENQVUluZm8gIT0gTlVMTCAmJiBWUDhHZXRDUFVJbmZvKGtORU9OKSkpIHsKKyAgICBXZWJQUmVzY2FsZXJEc3BJbml0TkVPTigpOworICB9CisjZW5kaWYKKworICBhc3NlcnQoV2ViUFJlc2NhbGVyRXhwb3J0Um93RXhwYW5kICE9IE5VTEwpOworICBhc3NlcnQoV2ViUFJlc2NhbGVyRXhwb3J0Um93U2hyaW5rICE9IE5VTEwpOworICBhc3NlcnQoV2ViUFJlc2NhbGVySW1wb3J0Um93RXhwYW5kICE9IE5VTEwpOworICBhc3NlcnQoV2ViUFJlc2NhbGVySW1wb3J0Um93U2hyaW5rICE9IE5VTEwpOworI2VuZGlmICAgLy8gV0VCUF9SRURVQ0VfU0laRQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9yZXNjYWxlcl9taXBzMzIuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvcmVzY2FsZXJfbWlwczMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQyZjdlNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvcmVzY2FsZXJfbWlwczMyLmMKQEAgLTAsMCArMSwyOTMgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBNSVBTIHZlcnNpb24gb2YgcmVzY2FsaW5nIGZ1bmN0aW9ucworLy8KKy8vIEF1dGhvcihzKTogRGpvcmRqZSBQZXN1dCAoZGpvcmRqZS5wZXN1dEBpbWd0ZWMuY29tKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQUzMyKSAmJiAhZGVmaW5lZChXRUJQX1JFRFVDRV9TSVpFKQorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSAic3JjL3V0aWxzL3Jlc2NhbGVyX3V0aWxzLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSb3cgaW1wb3J0CisKK3N0YXRpYyB2b2lkIEltcG9ydFJvd1Nocmlua19NSVBTMzIoV2ViUFJlc2NhbGVyKiBjb25zdCB3cmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyYykgeworICBjb25zdCBpbnQgeF9zdHJpZGUgPSB3cmstPm51bV9jaGFubmVsczsKKyAgY29uc3QgaW50IHhfb3V0X21heCA9IHdyay0+ZHN0X3dpZHRoICogd3JrLT5udW1fY2hhbm5lbHM7CisgIGNvbnN0IGludCBmeF9zY2FsZSA9IHdyay0+Znhfc2NhbGU7CisgIGNvbnN0IGludCB4X2FkZCA9IHdyay0+eF9hZGQ7CisgIGNvbnN0IGludCB4X3N1YiA9IHdyay0+eF9zdWI7CisgIGNvbnN0IGludCB4X3N0cmlkZTEgPSB4X3N0cmlkZSA8PCAyOworICBpbnQgY2hhbm5lbDsKKyAgYXNzZXJ0KCF3cmstPnhfZXhwYW5kKTsKKyAgYXNzZXJ0KCFXZWJQUmVzY2FsZXJJbnB1dERvbmUod3JrKSk7CisKKyAgZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IHhfc3RyaWRlOyArK2NoYW5uZWwpIHsKKyAgICBjb25zdCB1aW50OF90KiBzcmMxID0gc3JjICsgY2hhbm5lbDsKKyAgICByZXNjYWxlcl90KiBmcm93ID0gd3JrLT5mcm93ICsgY2hhbm5lbDsKKyAgICBpbnQgdGVtcDEsIHRlbXAyLCB0ZW1wMzsKKyAgICBpbnQgYmFzZSwgZnJhYywgc3VtOworICAgIGludCBhY2N1bSwgYWNjdW0xOworICAgIGludCBsb29wX2MgPSB4X291dF9tYXggLSBjaGFubmVsOworCisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAibGkgICAgICVbdGVtcDFdLCAgIDB4ODAwMCAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJsaSAgICAgJVt0ZW1wMl0sICAgMHgxMDAwMCAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgImxpICAgICAlW3N1bV0sICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAibGkgICAgICVbYWNjdW1dLCAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgImFkZHUgICAlW2FjY3VtXSwgICAlW2FjY3VtXSwgICAlW3hfYWRkXSAgICAgIFxuXHQiCisgICAgICAibGkgICAgICVbYmFzZV0sICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJibGV6ICAgJVthY2N1bV0sICAgM2YgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAibGJ1ICAgICVbYmFzZV0sICAgIDAoJVtzcmMxXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJzdWJ1ICAgJVthY2N1bV0sICAgJVthY2N1bV0sICAgJVt4X3N1Yl0gICAgICBcblx0IgorICAgICAgImFkZHUgICAlW3NyYzFdLCAgICAlW3NyYzFdLCAgICAlW3hfc3RyaWRlXSAgIFxuXHQiCisgICAgICAiYWRkdSAgICVbc3VtXSwgICAgICVbc3VtXSwgICAgICVbYmFzZV0gICAgICAgXG5cdCIKKyAgICAgICJiZ3R6ICAgJVthY2N1bV0sICAgMmIgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAibmVndSAgICVbYWNjdW0xXSwgICVbYWNjdW1dICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJtdWwgICAgJVtmcmFjXSwgICAgJVtiYXNlXSwgICAgJVthY2N1bTFdICAgICBcblx0IgorICAgICAgIm11bCAgICAlW3RlbXAzXSwgICAlW3N1bV0sICAgICAlW3hfc3ViXSAgICAgIFxuXHQiCisgICAgICAic3VidSAgICVbbG9vcF9jXSwgICVbbG9vcF9jXSwgICVbeF9zdHJpZGVdICAgXG5cdCIKKyAgICAgICJtdWx0ICAgJVt0ZW1wMV0sICAgJVt0ZW1wMl0gICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgIm1hZGR1ICAlW2ZyYWNdLCAgICAlW2Z4X3NjYWxlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAibWZoaSAgICVbc3VtXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJzdWJ1ICAgJVt0ZW1wM10sICAgJVt0ZW1wM10sICAgJVtmcmFjXSAgICAgICBcblx0IgorICAgICAgInN3ICAgICAlW3RlbXAzXSwgICAwKCVbZnJvd10pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAiYWRkdSAgICVbZnJvd10sICAgICVbZnJvd10sICAgICVbeF9zdHJpZGUxXSAgXG5cdCIKKyAgICAgICJiZ3R6ICAgJVtsb29wX2NdLCAgMWIgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgOiBbYWNjdW1dIj0mciIoYWNjdW0pLCBbc3JjMV0iK3IiKHNyYzEpLCBbdGVtcDNdIj0mciIodGVtcDMpLAorICAgICAgICBbc3VtXSI9JnIiKHN1bSksIFtiYXNlXSI9JnIiKGJhc2UpLCBbZnJhY10iPSZyIihmcmFjKSwKKyAgICAgICAgW2Zyb3ddIityIihmcm93KSwgW2FjY3VtMV0iPSZyIihhY2N1bTEpLAorICAgICAgICBbdGVtcDJdIj0mciIodGVtcDIpLCBbdGVtcDFdIj0mciIodGVtcDEpCisgICAgICA6IFt4X3N0cmlkZV0iciIoeF9zdHJpZGUpLCBbZnhfc2NhbGVdInIiKGZ4X3NjYWxlKSwKKyAgICAgICAgW3hfc3ViXSJyIih4X3N1YiksIFt4X2FkZF0iciIoeF9hZGQpLAorICAgICAgICBbbG9vcF9jXSJyIihsb29wX2MpLCBbeF9zdHJpZGUxXSJyIih4X3N0cmlkZTEpCisgICAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iCisgICAgKTsKKyAgICBhc3NlcnQoYWNjdW0gPT0gMCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgSW1wb3J0Um93RXhwYW5kX01JUFMzMihXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjKSB7CisgIGNvbnN0IGludCB4X3N0cmlkZSA9IHdyay0+bnVtX2NoYW5uZWxzOworICBjb25zdCBpbnQgeF9vdXRfbWF4ID0gd3JrLT5kc3Rfd2lkdGggKiB3cmstPm51bV9jaGFubmVsczsKKyAgY29uc3QgaW50IHhfYWRkID0gd3JrLT54X2FkZDsKKyAgY29uc3QgaW50IHhfc3ViID0gd3JrLT54X3N1YjsKKyAgY29uc3QgaW50IHNyY193aWR0aCA9IHdyay0+c3JjX3dpZHRoOworICBjb25zdCBpbnQgeF9zdHJpZGUxID0geF9zdHJpZGUgPDwgMjsKKyAgaW50IGNoYW5uZWw7CisgIGFzc2VydCh3cmstPnhfZXhwYW5kKTsKKyAgYXNzZXJ0KCFXZWJQUmVzY2FsZXJJbnB1dERvbmUod3JrKSk7CisKKyAgZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IHhfc3RyaWRlOyArK2NoYW5uZWwpIHsKKyAgICBjb25zdCB1aW50OF90KiBzcmMxID0gc3JjICsgY2hhbm5lbDsKKyAgICByZXNjYWxlcl90KiBmcm93ID0gd3JrLT5mcm93ICsgY2hhbm5lbDsKKyAgICBpbnQgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQ7CisgICAgaW50IGZyYWM7CisgICAgaW50IGFjY3VtOworICAgIGludCB4X291dCA9IGNoYW5uZWw7CisKKyAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICJhZGRpdSAgJVt0ZW1wM10sICAgJVtzcmNfd2lkdGhdLCAtMSAgICAgICAgICAgIFxuXHQiCisgICAgICAibGJ1ICAgICVbdGVtcDJdLCAgIDAoJVtzcmMxXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgImFkZHUgICAlW3NyYzFdLCAgICAlW3NyYzFdLCAgICAgICVbeF9zdHJpZGVdICAgXG5cdCIKKyAgICAgICJiZ3R6ICAgJVt0ZW1wM10sICAgMGYgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAiYWRkaXUgICVbdGVtcDFdLCAgICVbdGVtcDJdLCAgICAgMCAgICAgICAgICAgICBcblx0IgorICAgICAgImIgICAgICAzZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAibGJ1ICAgICVbdGVtcDFdLCAgIDAoJVtzcmMxXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJhZGRpdSAgJVthY2N1bV0sICAgJVt4X2FkZF0sICAgICAwICAgICAgICAgICAgIFxuXHQiCisgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgInN1YnUgICAlW3RlbXAzXSwgICAlW3RlbXAyXSwgICAgICVbdGVtcDFdICAgICAgXG5cdCIKKyAgICAgICJtdWwgICAgJVt0ZW1wM10sICAgJVt0ZW1wM10sICAgICAlW2FjY3VtXSAgICAgIFxuXHQiCisgICAgICAibXVsICAgICVbdGVtcDRdLCAgICVbdGVtcDFdLCAgICAgJVt4X2FkZF0gICAgICBcblx0IgorICAgICAgImFkZHUgICAlW3RlbXAzXSwgICAlW3RlbXA0XSwgICAgICVbdGVtcDNdICAgICAgXG5cdCIKKyAgICAgICJzdyAgICAgJVt0ZW1wM10sICAgMCglW2Zyb3ddKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAiYWRkdSAgICVbZnJvd10sICAgICVbZnJvd10sICAgICAgJVt4X3N0cmlkZTFdICBcblx0IgorICAgICAgImFkZHUgICAlW3hfb3V0XSwgICAlW3hfb3V0XSwgICAgICVbeF9zdHJpZGVdICAgXG5cdCIKKyAgICAgICJzdWJ1ICAgJVt0ZW1wM10sICAgJVt4X291dF0sICAgICAlW3hfb3V0X21heF0gIFxuXHQiCisgICAgICAiYmdleiAgICVbdGVtcDNdLCAgIDJmICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgInN1YnUgICAlW2FjY3VtXSwgICAlW2FjY3VtXSwgICAgICVbeF9zdWJdICAgICAgXG5cdCIKKyAgICAgICJiZ2V6ICAgJVthY2N1bV0sICAgNGYgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAiYWRkaXUgICVbdGVtcDJdLCAgICVbdGVtcDFdLCAgICAgMCAgICAgICAgICAgICBcblx0IgorICAgICAgImFkZHUgICAlW3NyYzFdLCAgICAlW3NyYzFdLCAgICAgICVbeF9zdHJpZGVdICAgXG5cdCIKKyAgICAgICJsYnUgICAgJVt0ZW1wMV0sICAgMCglW3NyYzFdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAiYWRkdSAgICVbYWNjdW1dLCAgICVbYWNjdW1dLCAgICAgJVt4X2FkZF0gICAgICBcblx0IgorICAgICI0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJiICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgOiBbc3JjMV0iK3IiKHNyYzEpLCBbYWNjdW1dIj0mciIoYWNjdW0pLCBbdGVtcDFdIj0mciIodGVtcDEpLAorICAgICAgICBbdGVtcDJdIj0mciIodGVtcDIpLCBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLAorICAgICAgICBbeF9vdXRdIityIih4X291dCksIFtmcmFjXSI9JnIiKGZyYWMpLCBbZnJvd10iK3IiKGZyb3cpCisgICAgICA6IFt4X3N0cmlkZV0iciIoeF9zdHJpZGUpLCBbeF9hZGRdInIiKHhfYWRkKSwgW3hfc3ViXSJyIih4X3N1YiksCisgICAgICAgIFt4X3N0cmlkZTFdInIiKHhfc3RyaWRlMSksIFtzcmNfd2lkdGhdInIiKHNyY193aWR0aCksCisgICAgICAgIFt4X291dF9tYXhdInIiKHhfb3V0X21heCkKKyAgICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIKKyAgICApOworICAgIGFzc2VydCh3cmstPnhfc3ViID09IDAgLyogPC0gc3BlY2lhbCBjYXNlIGZvciBzcmNfd2lkdGg9MSAqLyB8fCBhY2N1bSA9PSAwKTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUm93IGV4cG9ydAorCitzdGF0aWMgdm9pZCBFeHBvcnRSb3dFeHBhbmRfTUlQUzMyKFdlYlBSZXNjYWxlciogY29uc3Qgd3JrKSB7CisgIHVpbnQ4X3QqIGRzdCA9IHdyay0+ZHN0OworICByZXNjYWxlcl90KiBpcm93ID0gd3JrLT5pcm93OworICBjb25zdCBpbnQgeF9vdXRfbWF4ID0gd3JrLT5kc3Rfd2lkdGggKiB3cmstPm51bV9jaGFubmVsczsKKyAgY29uc3QgcmVzY2FsZXJfdCogZnJvdyA9IHdyay0+ZnJvdzsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgbG9vcF9lbmQ7CisgIGNvbnN0IGludCB0ZW1wMiA9IChpbnQpd3JrLT5meV9zY2FsZTsKKyAgY29uc3QgaW50IHRlbXA2ID0geF9vdXRfbWF4IDw8IDI7CisgIGFzc2VydCghV2ViUFJlc2NhbGVyT3V0cHV0RG9uZSh3cmspKTsKKyAgYXNzZXJ0KHdyay0+eV9hY2N1bSA8PSAwKTsKKyAgYXNzZXJ0KHdyay0+eV9leHBhbmQpOworICBhc3NlcnQod3JrLT55X3N1YiAhPSAwKTsKKyAgaWYgKHdyay0+eV9hY2N1bSA9PSAwKSB7CisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAibGkgICAgICAgJVt0ZW1wM10sICAgIDB4MTAwMDAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAibGkgICAgICAgJVt0ZW1wNF0sICAgIDB4ODAwMCAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAiYWRkdSAgICAgJVtsb29wX2VuZF0sICVbZnJvd10sICAgICAlW3RlbXA2XSAgICAgIFxuXHQiCisgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAibHcgICAgICAgJVt0ZW1wMF0sICAgIDAoJVtmcm93XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAiYWRkaXUgICAgJVtkc3RdLCAgICAgICVbZHN0XSwgICAgICAxICAgICAgICAgICAgIFxuXHQiCisgICAgICAiYWRkaXUgICAgJVtmcm93XSwgICAgICVbZnJvd10sICAgICA0ICAgICAgICAgICAgIFxuXHQiCisgICAgICAibXVsdCAgICAgJVt0ZW1wM10sICAgICVbdGVtcDRdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAibWFkZHUgICAgJVt0ZW1wMF0sICAgICVbdGVtcDJdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAibWZoaSAgICAgJVt0ZW1wNV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAic2IgICAgICAgJVt0ZW1wNV0sICAgIC0xKCVbZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAiYm5lICAgICAgJVtmcm93XSwgICAgICVbbG9vcF9lbmRdLCAxYiAgICAgICAgICAgIFxuXHQiCisgICAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wM10iPSZyIih0ZW1wMyksCisgICAgICAgIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksIFtmcm93XSIrciIoZnJvdyksCisgICAgICAgIFtkc3RdIityIihkc3QpLCBbbG9vcF9lbmRdIj0mciIobG9vcF9lbmQpCisgICAgICA6IFt0ZW1wMl0iciIodGVtcDIpLCBbdGVtcDZdInIiKHRlbXA2KQorICAgICAgOiAibWVtb3J5IiwgImhpIiwgImxvIgorICAgICk7CisgIH0gZWxzZSB7CisgICAgY29uc3QgdWludDMyX3QgQiA9IFdFQlBfUkVTQ0FMRVJfRlJBQygtd3JrLT55X2FjY3VtLCB3cmstPnlfc3ViKTsKKyAgICBjb25zdCB1aW50MzJfdCBBID0gKHVpbnQzMl90KShXRUJQX1JFU0NBTEVSX09ORSAtIEIpOworICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgImxpICAgICAgICVbdGVtcDNdLCAgICAweDEwMDAwICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgImxpICAgICAgICVbdGVtcDRdLCAgICAweDgwMDAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgImFkZHUgICAgICVbbG9vcF9lbmRdLCAlW2Zyb3ddLCAgICAgJVt0ZW1wNl0gICAgICBcblx0IgorICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgImx3ICAgICAgICVbdGVtcDBdLCAgICAwKCVbZnJvd10pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgImx3ICAgICAgICVbdGVtcDFdLCAgICAwKCVbaXJvd10pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgImFkZGl1ICAgICVbZHN0XSwgICAgICAlW2RzdF0sICAgICAgMSAgICAgICAgICAgICBcblx0IgorICAgICAgIm11bHQgICAgICVbdGVtcDNdLCAgICAlW3RlbXA0XSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgIm1hZGR1ICAgICVbQV0sICAgICAgICAlW3RlbXAwXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgIm1hZGR1ICAgICVbQl0sICAgICAgICAlW3RlbXAxXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgImFkZGl1ICAgICVbZnJvd10sICAgICAlW2Zyb3ddLCAgICAgNCAgICAgICAgICAgICBcblx0IgorICAgICAgImFkZGl1ICAgICVbaXJvd10sICAgICAlW2lyb3ddLCAgICAgNCAgICAgICAgICAgICBcblx0IgorICAgICAgIm1maGkgICAgICVbdGVtcDVdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgIm11bHQgICAgICVbdGVtcDNdLCAgICAlW3RlbXA0XSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgIm1hZGR1ICAgICVbdGVtcDVdLCAgICAlW3RlbXAyXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgIm1maGkgICAgICVbdGVtcDVdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgInNiICAgICAgICVbdGVtcDVdLCAgICAtMSglW2RzdF0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgImJuZSAgICAgICVbZnJvd10sICAgICAlW2xvb3BfZW5kXSwgMWIgICAgICAgICAgICBcblx0IgorICAgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDNdIj0mciIodGVtcDMpLAorICAgICAgICBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLCBbZnJvd10iK3IiKGZyb3cpLAorICAgICAgICBbaXJvd10iK3IiKGlyb3cpLCBbZHN0XSIrciIoZHN0KSwgW2xvb3BfZW5kXSI9JnIiKGxvb3BfZW5kKQorICAgICAgOiBbdGVtcDJdInIiKHRlbXAyKSwgW3RlbXA2XSJyIih0ZW1wNiksIFtBXSJyIihBKSwgW0JdInIiKEIpCisgICAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iCisgICAgKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBFeHBvcnRSb3dTaHJpbmtfTUlQUzMyKFdlYlBSZXNjYWxlciogY29uc3Qgd3JrKSB7CisgIGNvbnN0IGludCB4X291dF9tYXggPSB3cmstPmRzdF93aWR0aCAqIHdyay0+bnVtX2NoYW5uZWxzOworICB1aW50OF90KiBkc3QgPSB3cmstPmRzdDsKKyAgcmVzY2FsZXJfdCogaXJvdyA9IHdyay0+aXJvdzsKKyAgY29uc3QgcmVzY2FsZXJfdCogZnJvdyA9IHdyay0+ZnJvdzsKKyAgY29uc3QgaW50IHlzY2FsZSA9IHdyay0+Znlfc2NhbGUgKiAoLXdyay0+eV9hY2N1bSk7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIGxvb3BfZW5kOworICBjb25zdCBpbnQgdGVtcDIgPSAoaW50KXdyay0+Znh5X3NjYWxlOworICBjb25zdCBpbnQgdGVtcDYgPSB4X291dF9tYXggPDwgMjsKKworICBhc3NlcnQoIVdlYlBSZXNjYWxlck91dHB1dERvbmUod3JrKSk7CisgIGFzc2VydCh3cmstPnlfYWNjdW0gPD0gMCk7CisgIGFzc2VydCghd3JrLT55X2V4cGFuZCk7CisgIGFzc2VydCh3cmstPmZ4eV9zY2FsZSAhPSAwKTsKKyAgaWYgKHlzY2FsZSkgeworICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgImxpICAgICAgICVbdGVtcDNdLCAgICAweDEwMDAwICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgImxpICAgICAgICVbdGVtcDRdLCAgICAweDgwMDAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgImFkZHUgICAgICVbbG9vcF9lbmRdLCAlW2Zyb3ddLCAgICAgJVt0ZW1wNl0gICAgICBcblx0IgorICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgImx3ICAgICAgICVbdGVtcDBdLCAgICAwKCVbZnJvd10pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgIm11bHQgICAgICVbdGVtcDNdLCAgICAlW3RlbXA0XSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgImFkZGl1ICAgICVbZnJvd10sICAgICAlW2Zyb3ddLCAgICAgNCAgICAgICAgICAgICBcblx0IgorICAgICAgIm1hZGR1ICAgICVbdGVtcDBdLCAgICAlW3lzY2FsZV0gICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgIm1maGkgICAgICVbdGVtcDFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgImx3ICAgICAgICVbdGVtcDBdLCAgICAwKCVbaXJvd10pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgImFkZGl1ICAgICVbZHN0XSwgICAgICAlW2RzdF0sICAgICAgMSAgICAgICAgICAgICBcblx0IgorICAgICAgImFkZGl1ICAgICVbaXJvd10sICAgICAlW2lyb3ddLCAgICAgNCAgICAgICAgICAgICBcblx0IgorICAgICAgInN1YnUgICAgICVbdGVtcDBdLCAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMV0gICAgICBcblx0IgorICAgICAgIm11bHQgICAgICVbdGVtcDNdLCAgICAlW3RlbXA0XSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgIm1hZGR1ICAgICVbdGVtcDBdLCAgICAlW3RlbXAyXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgIm1maGkgICAgICVbdGVtcDVdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgInN3ICAgICAgICVbdGVtcDFdLCAgICAtNCglW2lyb3ddKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgInNiICAgICAgICVbdGVtcDVdLCAgICAtMSglW2RzdF0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgImJuZSAgICAgICVbZnJvd10sICAgICAlW2xvb3BfZW5kXSwgMWIgICAgICAgICAgICBcblx0IgorICAgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDNdIj0mciIodGVtcDMpLAorICAgICAgICBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLCBbZnJvd10iK3IiKGZyb3cpLAorICAgICAgICBbaXJvd10iK3IiKGlyb3cpLCBbZHN0XSIrciIoZHN0KSwgW2xvb3BfZW5kXSI9JnIiKGxvb3BfZW5kKQorICAgICAgOiBbdGVtcDJdInIiKHRlbXAyKSwgW3lzY2FsZV0iciIoeXNjYWxlKSwgW3RlbXA2XSJyIih0ZW1wNikKKyAgICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIKKyAgICApOworICB9IGVsc2UgeworICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgImxpICAgICAgICVbdGVtcDNdLCAgICAweDEwMDAwICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgImxpICAgICAgICVbdGVtcDRdLCAgICAweDgwMDAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgImFkZHUgICAgICVbbG9vcF9lbmRdLCAlW2lyb3ddLCAgICAgJVt0ZW1wNl0gICAgICBcblx0IgorICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgImx3ICAgICAgICVbdGVtcDBdLCAgICAwKCVbaXJvd10pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgImFkZGl1ICAgICVbZHN0XSwgICAgICAlW2RzdF0sICAgICAgMSAgICAgICAgICAgICBcblx0IgorICAgICAgImFkZGl1ICAgICVbaXJvd10sICAgICAlW2lyb3ddLCAgICAgNCAgICAgICAgICAgICBcblx0IgorICAgICAgIm11bHQgICAgICVbdGVtcDNdLCAgICAlW3RlbXA0XSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgIm1hZGR1ICAgICVbdGVtcDBdLCAgICAlW3RlbXAyXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgIm1maGkgICAgICVbdGVtcDVdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgInN3ICAgICAgICR6ZXJvLCAgICAgICAtNCglW2lyb3ddKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgInNiICAgICAgICVbdGVtcDVdLCAgICAtMSglW2RzdF0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgImJuZSAgICAgICVbaXJvd10sICAgICAlW2xvb3BfZW5kXSwgMWIgICAgICAgICAgICBcblx0IgorICAgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDNdIj0mciIodGVtcDMpLAorICAgICAgICBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLCBbaXJvd10iK3IiKGlyb3cpLAorICAgICAgICBbZHN0XSIrciIoZHN0KSwgW2xvb3BfZW5kXSI9JnIiKGxvb3BfZW5kKQorICAgICAgOiBbdGVtcDJdInIiKHRlbXAyKSwgW3RlbXA2XSJyIih0ZW1wNikKKyAgICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIKKyAgICApOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBXZWJQUmVzY2FsZXJEc3BJbml0TUlQUzMyKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgV2ViUFJlc2NhbGVyRHNwSW5pdE1JUFMzMih2b2lkKSB7CisgIFdlYlBSZXNjYWxlckltcG9ydFJvd0V4cGFuZCA9IEltcG9ydFJvd0V4cGFuZF9NSVBTMzI7CisgIFdlYlBSZXNjYWxlckltcG9ydFJvd1NocmluayA9IEltcG9ydFJvd1Nocmlua19NSVBTMzI7CisgIFdlYlBSZXNjYWxlckV4cG9ydFJvd0V4cGFuZCA9IEV4cG9ydFJvd0V4cGFuZF9NSVBTMzI7CisgIFdlYlBSZXNjYWxlckV4cG9ydFJvd1NocmluayA9IEV4cG9ydFJvd1Nocmlua19NSVBTMzI7Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfTUlQUzMyCisKK1dFQlBfRFNQX0lOSVRfU1RVQihXZWJQUmVzY2FsZXJEc3BJbml0TUlQUzMyKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX01JUFMzMgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9yZXNjYWxlcl9taXBzX2RzcF9yMi5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9yZXNjYWxlcl9taXBzX2RzcF9yMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3OGFhYzEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3Jlc2NhbGVyX21pcHNfZHNwX3IyLmMKQEAgLTAsMCArMSwzMTQgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBNSVBTIHZlcnNpb24gb2YgcmVzY2FsaW5nIGZ1bmN0aW9ucworLy8KKy8vIEF1dGhvcihzKTogRGpvcmRqZSBQZXN1dCAoZGpvcmRqZS5wZXN1dEBpbWd0ZWMuY29tKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQU19EU1BfUjIpICYmICFkZWZpbmVkKFdFQlBfUkVEVUNFX1NJWkUpCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlICJzcmMvdXRpbHMvcmVzY2FsZXJfdXRpbHMuaCIKKworI2RlZmluZSBST1VOREVSIChXRUJQX1JFU0NBTEVSX09ORSA+PiAxKQorI2RlZmluZSBNVUxUX0ZJWCh4LCB5KSAoKCh1aW50NjRfdCkoeCkgKiAoeSkgKyBST1VOREVSKSA+PiBXRUJQX1JFU0NBTEVSX1JGSVgpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSb3cgZXhwb3J0CisKK3N0YXRpYyB2b2lkIEV4cG9ydFJvd1Nocmlua19NSVBTZHNwUjIoV2ViUFJlc2NhbGVyKiBjb25zdCB3cmspIHsKKyAgaW50IGk7CisgIGNvbnN0IGludCB4X291dF9tYXggPSB3cmstPmRzdF93aWR0aCAqIHdyay0+bnVtX2NoYW5uZWxzOworICB1aW50OF90KiBkc3QgPSB3cmstPmRzdDsKKyAgcmVzY2FsZXJfdCogaXJvdyA9IHdyay0+aXJvdzsKKyAgY29uc3QgcmVzY2FsZXJfdCogZnJvdyA9IHdyay0+ZnJvdzsKKyAgY29uc3QgaW50IHlzY2FsZSA9IHdyay0+Znlfc2NhbGUgKiAoLXdyay0+eV9hY2N1bSk7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCBsb29wX2VuZDsKKyAgY29uc3QgaW50IHRlbXA3ID0gKGludCl3cmstPmZ4eV9zY2FsZTsKKyAgY29uc3QgaW50IHRlbXA2ID0gKHhfb3V0X21heCAmIH4weDMpIDw8IDI7CisgIGFzc2VydCghV2ViUFJlc2NhbGVyT3V0cHV0RG9uZSh3cmspKTsKKyAgYXNzZXJ0KHdyay0+eV9hY2N1bSA8PSAwKTsKKyAgYXNzZXJ0KCF3cmstPnlfZXhwYW5kKTsKKyAgYXNzZXJ0KHdyay0+Znh5X3NjYWxlICE9IDApOworICBpZiAoeXNjYWxlKSB7CisgICAgaWYgKHhfb3V0X21heCA+PSA0KSB7CisgICAgICBpbnQgdGVtcDgsIHRlbXA5LCB0ZW1wMTAsIHRlbXAxMTsKKyAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAibGkgICAgICAgJVt0ZW1wM10sICAgIDB4MTAwMDAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsaSAgICAgICAlW3RlbXA0XSwgICAgMHg4MDAwICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZHUgICAgICVbbG9vcF9lbmRdLCAlW2Zyb3ddLCAgICAgJVt0ZW1wNl0gICAgICBcblx0IgorICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgICAlW3RlbXAwXSwgICAgMCglW2Zyb3ddKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAgICVbdGVtcDFdLCAgICA0KCVbZnJvd10pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICAgJVt0ZW1wMl0sICAgIDgoJVtmcm93XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgICAlW3RlbXA1XSwgICAgMTIoJVtmcm93XSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAgICRhYzAsICAgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wNF0gICAgICBcblx0IgorICAgICAgICAibWFkZHUgICAgJGFjMCwgICAgICAgICVbdGVtcDBdLCAgICAlW3lzY2FsZV0gICAgIFxuXHQiCisgICAgICAgICJtdWx0ICAgICAkYWMxLCAgICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDRdICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGR1ICAgICRhYzEsICAgICAgICAlW3RlbXAxXSwgICAgJVt5c2NhbGVdICAgICBcblx0IgorICAgICAgICAibXVsdCAgICAgJGFjMiwgICAgICAgICVbdGVtcDNdLCAgICAlW3RlbXA0XSAgICAgIFxuXHQiCisgICAgICAgICJtYWRkdSAgICAkYWMyLCAgICAgICAgJVt0ZW1wMl0sICAgICVbeXNjYWxlXSAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAgICRhYzMsICAgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wNF0gICAgICBcblx0IgorICAgICAgICAibWFkZHUgICAgJGFjMywgICAgICAgICVbdGVtcDVdLCAgICAlW3lzY2FsZV0gICAgIFxuXHQiCisgICAgICAgICJhZGRpdSAgICAlW2Zyb3ddLCAgICAgJVtmcm93XSwgICAgIDE2ICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAgICVbdGVtcDBdLCAgICAkYWMwICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZoaSAgICAgJVt0ZW1wMV0sICAgICRhYzEgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtZmhpICAgICAlW3RlbXAyXSwgICAgJGFjMiAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAgICVbdGVtcDVdLCAgICAkYWMzICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICAgJVt0ZW1wOF0sICAgIDAoJVtpcm93XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgICAlW3RlbXA5XSwgICAgNCglW2lyb3ddKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAgICVbdGVtcDEwXSwgICA4KCVbaXJvd10pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICAgJVt0ZW1wMTFdLCAgIDEyKCVbaXJvd10pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGRpdSAgICAlW2RzdF0sICAgICAgJVtkc3RdLCAgICAgIDQgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZGl1ICAgICVbaXJvd10sICAgICAlW2lyb3ddLCAgICAgMTYgICAgICAgICAgICBcblx0IgorICAgICAgICAic3VidSAgICAgJVt0ZW1wOF0sICAgICVbdGVtcDhdLCAgICAlW3RlbXAwXSAgICAgIFxuXHQiCisgICAgICAgICJzdWJ1ICAgICAlW3RlbXA5XSwgICAgJVt0ZW1wOV0sICAgICVbdGVtcDFdICAgICAgXG5cdCIKKyAgICAgICAgInN1YnUgICAgICVbdGVtcDEwXSwgICAlW3RlbXAxMF0sICAgJVt0ZW1wMl0gICAgICBcblx0IgorICAgICAgICAic3VidSAgICAgJVt0ZW1wMTFdLCAgICVbdGVtcDExXSwgICAlW3RlbXA1XSAgICAgIFxuXHQiCisgICAgICAgICJtdWx0ICAgICAkYWMwLCAgICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDRdICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGR1ICAgICRhYzAsICAgICAgICAlW3RlbXA4XSwgICAgJVt0ZW1wN10gICAgICBcblx0IgorICAgICAgICAibXVsdCAgICAgJGFjMSwgICAgICAgICVbdGVtcDNdLCAgICAlW3RlbXA0XSAgICAgIFxuXHQiCisgICAgICAgICJtYWRkdSAgICAkYWMxLCAgICAgICAgJVt0ZW1wOV0sICAgICVbdGVtcDddICAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAgICRhYzIsICAgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wNF0gICAgICBcblx0IgorICAgICAgICAibWFkZHUgICAgJGFjMiwgICAgICAgICVbdGVtcDEwXSwgICAlW3RlbXA3XSAgICAgIFxuXHQiCisgICAgICAgICJtdWx0ICAgICAkYWMzLCAgICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDRdICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGR1ICAgICRhYzMsICAgICAgICAlW3RlbXAxMV0sICAgJVt0ZW1wN10gICAgICBcblx0IgorICAgICAgICAibWZoaSAgICAgJVt0ZW1wOF0sICAgICRhYzAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtZmhpICAgICAlW3RlbXA5XSwgICAgJGFjMSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAgICVbdGVtcDEwXSwgICAkYWMyICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZoaSAgICAgJVt0ZW1wMTFdLCAgICRhYzMgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdyAgICAgICAlW3RlbXAwXSwgICAgLTE2KCVbaXJvd10pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ICAgICAgICVbdGVtcDFdLCAgICAtMTIoJVtpcm93XSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3cgICAgICAgJVt0ZW1wMl0sICAgIC04KCVbaXJvd10pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdyAgICAgICAlW3RlbXA1XSwgICAgLTQoJVtpcm93XSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNiICAgICAgICVbdGVtcDhdLCAgICAtNCglW2RzdF0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2IgICAgICAgJVt0ZW1wOV0sICAgIC0zKCVbZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzYiAgICAgICAlW3RlbXAxMF0sICAgLTIoJVtkc3RdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNiICAgICAgICVbdGVtcDExXSwgICAtMSglW2RzdF0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYm5lICAgICAgJVtmcm93XSwgICAgICVbbG9vcF9lbmRdLCAxYiAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSwKKyAgICAgICAgICBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLCBbZnJvd10iK3IiKGZyb3cpLAorICAgICAgICAgIFtpcm93XSIrciIoaXJvdyksIFtkc3RdIityIihkc3QpLCBbbG9vcF9lbmRdIj0mciIobG9vcF9lbmQpLAorICAgICAgICAgIFt0ZW1wOF0iPSZyIih0ZW1wOCksIFt0ZW1wOV0iPSZyIih0ZW1wOSksIFt0ZW1wMTBdIj0mciIodGVtcDEwKSwKKyAgICAgICAgICBbdGVtcDExXSI9JnIiKHRlbXAxMSksIFt0ZW1wMl0iPSZyIih0ZW1wMikKKyAgICAgICAgOiBbdGVtcDddInIiKHRlbXA3KSwgW3lzY2FsZV0iciIoeXNjYWxlKSwgW3RlbXA2XSJyIih0ZW1wNikKKyAgICAgICAgOiAibWVtb3J5IiwgImhpIiwgImxvIiwgIiRhYzFoaSIsICIkYWMxbG8iLAorICAgICAgICAgICIkYWMyaGkiLCAiJGFjMmxvIiwgIiRhYzNoaSIsICIkYWMzbG8iCisgICAgICApOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgKHhfb3V0X21heCAmIDB4Myk7ICsraSkgeworICAgICAgY29uc3QgdWludDMyX3QgZnJhYyA9ICh1aW50MzJfdClNVUxUX0ZJWCgqZnJvdysrLCB5c2NhbGUpOworICAgICAgY29uc3QgaW50IHYgPSAoaW50KU1VTFRfRklYKCppcm93IC0gZnJhYywgd3JrLT5meHlfc2NhbGUpOworICAgICAgYXNzZXJ0KHYgPj0gMCAmJiB2IDw9IDI1NSk7CisgICAgICAqZHN0KysgPSB2OworICAgICAgKmlyb3crKyA9IGZyYWM7ICAgLy8gbmV3IGZyYWN0aW9uYWwgc3RhcnQKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKHhfb3V0X21heCA+PSA0KSB7CisgICAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgImxpICAgICAgICVbdGVtcDNdLCAgICAweDEwMDAwICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGkgICAgICAgJVt0ZW1wNF0sICAgIDB4ODAwMCAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGR1ICAgICAlW2xvb3BfZW5kXSwgJVtpcm93XSwgICAgICVbdGVtcDZdICAgICAgXG5cdCIKKyAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICAgJVt0ZW1wMF0sICAgIDAoJVtpcm93XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgICAlW3RlbXAxXSwgICAgNCglW2lyb3ddKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAgICVbdGVtcDJdLCAgICA4KCVbaXJvd10pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICAgJVt0ZW1wNV0sICAgIDEyKCVbaXJvd10pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGRpdSAgICAlW2RzdF0sICAgICAgJVtkc3RdLCAgICAgIDQgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZGl1ICAgICVbaXJvd10sICAgICAlW2lyb3ddLCAgICAgMTYgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsdCAgICAgJGFjMCwgICAgICAgICVbdGVtcDNdLCAgICAlW3RlbXA0XSAgICAgIFxuXHQiCisgICAgICAgICJtYWRkdSAgICAkYWMwLCAgICAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDddICAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAgICRhYzEsICAgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wNF0gICAgICBcblx0IgorICAgICAgICAibWFkZHUgICAgJGFjMSwgICAgICAgICVbdGVtcDFdLCAgICAlW3RlbXA3XSAgICAgIFxuXHQiCisgICAgICAgICJtdWx0ICAgICAkYWMyLCAgICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDRdICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGR1ICAgICRhYzIsICAgICAgICAlW3RlbXAyXSwgICAgJVt0ZW1wN10gICAgICBcblx0IgorICAgICAgICAibXVsdCAgICAgJGFjMywgICAgICAgICVbdGVtcDNdLCAgICAlW3RlbXA0XSAgICAgIFxuXHQiCisgICAgICAgICJtYWRkdSAgICAkYWMzLCAgICAgICAgJVt0ZW1wNV0sICAgICVbdGVtcDddICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAgICVbdGVtcDBdLCAgICAkYWMwICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZoaSAgICAgJVt0ZW1wMV0sICAgICRhYzEgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtZmhpICAgICAlW3RlbXAyXSwgICAgJGFjMiAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAgICVbdGVtcDVdLCAgICAkYWMzICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3cgICAgICAgJHplcm8sICAgICAgIC0xNiglW2lyb3ddKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdyAgICAgICAkemVybywgICAgICAgLTEyKCVbaXJvd10pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ICAgICAgICR6ZXJvLCAgICAgICAtOCglW2lyb3ddKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3cgICAgICAgJHplcm8sICAgICAgIC00KCVbaXJvd10pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzYiAgICAgICAlW3RlbXAwXSwgICAgLTQoJVtkc3RdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNiICAgICAgICVbdGVtcDFdLCAgICAtMyglW2RzdF0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2IgICAgICAgJVt0ZW1wMl0sICAgIC0yKCVbZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzYiAgICAgICAlW3RlbXA1XSwgICAgLTEoJVtkc3RdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImJuZSAgICAgICVbaXJvd10sICAgICAlW2xvb3BfZW5kXSwgMWIgICAgICAgICAgICBcblx0IgorICAgICAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wM10iPSZyIih0ZW1wMyksCisgICAgICAgICAgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwgW2lyb3ddIityIihpcm93KSwKKyAgICAgICAgICBbZHN0XSIrciIoZHN0KSwgW2xvb3BfZW5kXSI9JnIiKGxvb3BfZW5kKSwgW3RlbXAyXSI9JnIiKHRlbXAyKQorICAgICAgICA6IFt0ZW1wN10iciIodGVtcDcpLCBbdGVtcDZdInIiKHRlbXA2KQorICAgICAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iLCAiJGFjMWhpIiwgIiRhYzFsbyIsCisgICAgICAgICAgIiRhYzJoaSIsICIkYWMybG8iLCAiJGFjM2hpIiwgIiRhYzNsbyIKKyAgICAgICk7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCAoeF9vdXRfbWF4ICYgMHgzKTsgKytpKSB7CisgICAgICBjb25zdCBpbnQgdiA9IChpbnQpTVVMVF9GSVgoKmlyb3csIHdyay0+Znh5X3NjYWxlKTsKKyAgICAgIGFzc2VydCh2ID49IDAgJiYgdiA8PSAyNTUpOworICAgICAgKmRzdCsrID0gdjsKKyAgICAgICppcm93KysgPSAwOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBFeHBvcnRSb3dFeHBhbmRfTUlQU2RzcFIyKFdlYlBSZXNjYWxlciogY29uc3Qgd3JrKSB7CisgIGludCBpOworICB1aW50OF90KiBkc3QgPSB3cmstPmRzdDsKKyAgcmVzY2FsZXJfdCogaXJvdyA9IHdyay0+aXJvdzsKKyAgY29uc3QgaW50IHhfb3V0X21heCA9IHdyay0+ZHN0X3dpZHRoICogd3JrLT5udW1fY2hhbm5lbHM7CisgIGNvbnN0IHJlc2NhbGVyX3QqIGZyb3cgPSB3cmstPmZyb3c7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCBsb29wX2VuZDsKKyAgY29uc3QgaW50IHRlbXA2ID0gKHhfb3V0X21heCAmIH4weDMpIDw8IDI7CisgIGNvbnN0IGludCB0ZW1wNyA9IChpbnQpd3JrLT5meV9zY2FsZTsKKyAgYXNzZXJ0KCFXZWJQUmVzY2FsZXJPdXRwdXREb25lKHdyaykpOworICBhc3NlcnQod3JrLT55X2FjY3VtIDw9IDApOworICBhc3NlcnQod3JrLT55X2V4cGFuZCk7CisgIGFzc2VydCh3cmstPnlfc3ViICE9IDApOworICBpZiAod3JrLT55X2FjY3VtID09IDApIHsKKyAgICBpZiAoeF9vdXRfbWF4ID49IDQpIHsKKyAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAibGkgICAgICAgJVt0ZW1wNF0sICAgIDB4MTAwMDAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsaSAgICAgICAlW3RlbXA1XSwgICAgMHg4MDAwICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZHUgICAgICVbbG9vcF9lbmRdLCAlW2Zyb3ddLCAgICAgJVt0ZW1wNl0gICAgICBcblx0IgorICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgICAlW3RlbXAwXSwgICAgMCglW2Zyb3ddKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAgICVbdGVtcDFdLCAgICA0KCVbZnJvd10pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICAgJVt0ZW1wMl0sICAgIDgoJVtmcm93XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgICAlW3RlbXAzXSwgICAgMTIoJVtmcm93XSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZGl1ICAgICVbZHN0XSwgICAgICAlW2RzdF0sICAgICAgNCAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkaXUgICAgJVtmcm93XSwgICAgICVbZnJvd10sICAgICAxNiAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWx0ICAgICAkYWMwLCAgICAgICAgJVt0ZW1wNF0sICAgICVbdGVtcDVdICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGR1ICAgICRhYzAsICAgICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wN10gICAgICBcblx0IgorICAgICAgICAibXVsdCAgICAgJGFjMSwgICAgICAgICVbdGVtcDRdLCAgICAlW3RlbXA1XSAgICAgIFxuXHQiCisgICAgICAgICJtYWRkdSAgICAkYWMxLCAgICAgICAgJVt0ZW1wMV0sICAgICVbdGVtcDddICAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAgICRhYzIsICAgICAgICAlW3RlbXA0XSwgICAgJVt0ZW1wNV0gICAgICBcblx0IgorICAgICAgICAibWFkZHUgICAgJGFjMiwgICAgICAgICVbdGVtcDJdLCAgICAlW3RlbXA3XSAgICAgIFxuXHQiCisgICAgICAgICJtdWx0ICAgICAkYWMzLCAgICAgICAgJVt0ZW1wNF0sICAgICVbdGVtcDVdICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGR1ICAgICRhYzMsICAgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wN10gICAgICBcblx0IgorICAgICAgICAibWZoaSAgICAgJVt0ZW1wMF0sICAgICRhYzAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtZmhpICAgICAlW3RlbXAxXSwgICAgJGFjMSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAgICVbdGVtcDJdLCAgICAkYWMyICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZoaSAgICAgJVt0ZW1wM10sICAgICRhYzMgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzYiAgICAgICAlW3RlbXAwXSwgICAgLTQoJVtkc3RdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNiICAgICAgICVbdGVtcDFdLCAgICAtMyglW2RzdF0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2IgICAgICAgJVt0ZW1wMl0sICAgIC0yKCVbZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzYiAgICAgICAlW3RlbXAzXSwgICAgLTEoJVtkc3RdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImJuZSAgICAgICVbZnJvd10sICAgICAlW2xvb3BfZW5kXSwgMWIgICAgICAgICAgICBcblx0IgorICAgICAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wM10iPSZyIih0ZW1wMyksCisgICAgICAgICAgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwgW2Zyb3ddIityIihmcm93KSwKKyAgICAgICAgICBbZHN0XSIrciIoZHN0KSwgW2xvb3BfZW5kXSI9JnIiKGxvb3BfZW5kKSwgW3RlbXAyXSI9JnIiKHRlbXAyKQorICAgICAgICA6IFt0ZW1wN10iciIodGVtcDcpLCBbdGVtcDZdInIiKHRlbXA2KQorICAgICAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iLCAiJGFjMWhpIiwgIiRhYzFsbyIsCisgICAgICAgICAgIiRhYzJoaSIsICIkYWMybG8iLCAiJGFjM2hpIiwgIiRhYzNsbyIKKyAgICAgICk7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCAoeF9vdXRfbWF4ICYgMHgzKTsgKytpKSB7CisgICAgICBjb25zdCB1aW50MzJfdCBKID0gKmZyb3crKzsKKyAgICAgIGNvbnN0IGludCB2ID0gKGludClNVUxUX0ZJWChKLCB3cmstPmZ5X3NjYWxlKTsKKyAgICAgIGFzc2VydCh2ID49IDAgJiYgdiA8PSAyNTUpOworICAgICAgKmRzdCsrID0gdjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgY29uc3QgdWludDMyX3QgQiA9IFdFQlBfUkVTQ0FMRVJfRlJBQygtd3JrLT55X2FjY3VtLCB3cmstPnlfc3ViKTsKKyAgICBjb25zdCB1aW50MzJfdCBBID0gKHVpbnQzMl90KShXRUJQX1JFU0NBTEVSX09ORSAtIEIpOworICAgIGlmICh4X291dF9tYXggPj0gNCkgeworICAgICAgaW50IHRlbXA4LCB0ZW1wOSwgdGVtcDEwLCB0ZW1wMTE7CisgICAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgImxpICAgICAgICVbdGVtcDhdLCAgICAweDEwMDAwICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGkgICAgICAgJVt0ZW1wOV0sICAgIDB4ODAwMCAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGR1ICAgICAlW2xvb3BfZW5kXSwgJVtmcm93XSwgICAgICVbdGVtcDZdICAgICAgXG5cdCIKKyAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICAgJVt0ZW1wMF0sICAgIDAoJVtmcm93XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgICAlW3RlbXAxXSwgICAgNCglW2Zyb3ddKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAgICVbdGVtcDJdLCAgICA4KCVbZnJvd10pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICAgJVt0ZW1wM10sICAgIDEyKCVbZnJvd10pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgICAlW3RlbXA0XSwgICAgMCglW2lyb3ddKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAgICVbdGVtcDVdLCAgICA0KCVbaXJvd10pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICAgJVt0ZW1wMTBdLCAgIDgoJVtpcm93XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgICAlW3RlbXAxMV0sICAgMTIoJVtpcm93XSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZGl1ICAgICVbZHN0XSwgICAgICAlW2RzdF0sICAgICAgNCAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsdCAgICAgJGFjMCwgICAgICAgICVbdGVtcDhdLCAgICAlW3RlbXA5XSAgICAgIFxuXHQiCisgICAgICAgICJtYWRkdSAgICAkYWMwLCAgICAgICAgJVtBXSwgICAgICAgICVbdGVtcDBdICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGR1ICAgICRhYzAsICAgICAgICAlW0JdLCAgICAgICAgJVt0ZW1wNF0gICAgICBcblx0IgorICAgICAgICAibXVsdCAgICAgJGFjMSwgICAgICAgICVbdGVtcDhdLCAgICAlW3RlbXA5XSAgICAgIFxuXHQiCisgICAgICAgICJtYWRkdSAgICAkYWMxLCAgICAgICAgJVtBXSwgICAgICAgICVbdGVtcDFdICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGR1ICAgICRhYzEsICAgICAgICAlW0JdLCAgICAgICAgJVt0ZW1wNV0gICAgICBcblx0IgorICAgICAgICAibXVsdCAgICAgJGFjMiwgICAgICAgICVbdGVtcDhdLCAgICAlW3RlbXA5XSAgICAgIFxuXHQiCisgICAgICAgICJtYWRkdSAgICAkYWMyLCAgICAgICAgJVtBXSwgICAgICAgICVbdGVtcDJdICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGR1ICAgICRhYzIsICAgICAgICAlW0JdLCAgICAgICAgJVt0ZW1wMTBdICAgICBcblx0IgorICAgICAgICAibXVsdCAgICAgJGFjMywgICAgICAgICVbdGVtcDhdLCAgICAlW3RlbXA5XSAgICAgIFxuXHQiCisgICAgICAgICJtYWRkdSAgICAkYWMzLCAgICAgICAgJVtBXSwgICAgICAgICVbdGVtcDNdICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGR1ICAgICRhYzMsICAgICAgICAlW0JdLCAgICAgICAgJVt0ZW1wMTFdICAgICBcblx0IgorICAgICAgICAiYWRkaXUgICAgJVtmcm93XSwgICAgICVbZnJvd10sICAgICAxNiAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGRpdSAgICAlW2lyb3ddLCAgICAgJVtpcm93XSwgICAgIDE2ICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAgICVbdGVtcDBdLCAgICAkYWMwICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZoaSAgICAgJVt0ZW1wMV0sICAgICRhYzEgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtZmhpICAgICAlW3RlbXAyXSwgICAgJGFjMiAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAgICVbdGVtcDNdLCAgICAkYWMzICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsdCAgICAgJGFjMCwgICAgICAgICVbdGVtcDhdLCAgICAlW3RlbXA5XSAgICAgIFxuXHQiCisgICAgICAgICJtYWRkdSAgICAkYWMwLCAgICAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDddICAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAgICRhYzEsICAgICAgICAlW3RlbXA4XSwgICAgJVt0ZW1wOV0gICAgICBcblx0IgorICAgICAgICAibWFkZHUgICAgJGFjMSwgICAgICAgICVbdGVtcDFdLCAgICAlW3RlbXA3XSAgICAgIFxuXHQiCisgICAgICAgICJtdWx0ICAgICAkYWMyLCAgICAgICAgJVt0ZW1wOF0sICAgICVbdGVtcDldICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGR1ICAgICRhYzIsICAgICAgICAlW3RlbXAyXSwgICAgJVt0ZW1wN10gICAgICBcblx0IgorICAgICAgICAibXVsdCAgICAgJGFjMywgICAgICAgICVbdGVtcDhdLCAgICAlW3RlbXA5XSAgICAgIFxuXHQiCisgICAgICAgICJtYWRkdSAgICAkYWMzLCAgICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDddICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAgICVbdGVtcDBdLCAgICAkYWMwICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZoaSAgICAgJVt0ZW1wMV0sICAgICRhYzEgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtZmhpICAgICAlW3RlbXAyXSwgICAgJGFjMiAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAgICVbdGVtcDNdLCAgICAkYWMzICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2IgICAgICAgJVt0ZW1wMF0sICAgIC00KCVbZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzYiAgICAgICAlW3RlbXAxXSwgICAgLTMoJVtkc3RdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNiICAgICAgICVbdGVtcDJdLCAgICAtMiglW2RzdF0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2IgICAgICAgJVt0ZW1wM10sICAgIC0xKCVbZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJibmUgICAgICAlW2Zyb3ddLCAgICAgJVtsb29wX2VuZF0sIDFiICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDNdIj0mciIodGVtcDMpLAorICAgICAgICAgIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksIFtmcm93XSIrciIoZnJvdyksCisgICAgICAgICAgW2lyb3ddIityIihpcm93KSwgW2RzdF0iK3IiKGRzdCksIFtsb29wX2VuZF0iPSZyIihsb29wX2VuZCksCisgICAgICAgICAgW3RlbXA4XSI9JnIiKHRlbXA4KSwgW3RlbXA5XSI9JnIiKHRlbXA5KSwgW3RlbXAxMF0iPSZyIih0ZW1wMTApLAorICAgICAgICAgIFt0ZW1wMTFdIj0mciIodGVtcDExKSwgW3RlbXAyXSI9JnIiKHRlbXAyKQorICAgICAgICA6IFt0ZW1wN10iciIodGVtcDcpLCBbdGVtcDZdInIiKHRlbXA2KSwgW0FdInIiKEEpLCBbQl0iciIoQikKKyAgICAgICAgOiAibWVtb3J5IiwgImhpIiwgImxvIiwgIiRhYzFoaSIsICIkYWMxbG8iLAorICAgICAgICAgICIkYWMyaGkiLCAiJGFjMmxvIiwgIiRhYzNoaSIsICIkYWMzbG8iCisgICAgICApOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgKHhfb3V0X21heCAmIDB4Myk7ICsraSkgeworICAgICAgY29uc3QgdWludDY0X3QgSSA9ICh1aW50NjRfdClBICogKmZyb3crKworICAgICAgICAgICAgICAgICAgICAgICArICh1aW50NjRfdClCICogKmlyb3crKzsKKyAgICAgIGNvbnN0IHVpbnQzMl90IEogPSAodWludDMyX3QpKChJICsgUk9VTkRFUikgPj4gV0VCUF9SRVNDQUxFUl9SRklYKTsKKyAgICAgIGNvbnN0IGludCB2ID0gKGludClNVUxUX0ZJWChKLCB3cmstPmZ5X3NjYWxlKTsKKyAgICAgIGFzc2VydCh2ID49IDAgJiYgdiA8PSAyNTUpOworICAgICAgKmRzdCsrID0gdjsKKyAgICB9CisgIH0KK30KKworI3VuZGVmIE1VTFRfRklYCisjdW5kZWYgUk9VTkRFUgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgV2ViUFJlc2NhbGVyRHNwSW5pdE1JUFNkc3BSMih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFdlYlBSZXNjYWxlckRzcEluaXRNSVBTZHNwUjIodm9pZCkgeworICBXZWJQUmVzY2FsZXJFeHBvcnRSb3dFeHBhbmQgPSBFeHBvcnRSb3dFeHBhbmRfTUlQU2RzcFIyOworICBXZWJQUmVzY2FsZXJFeHBvcnRSb3dTaHJpbmsgPSBFeHBvcnRSb3dTaHJpbmtfTUlQU2RzcFIyOworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX01JUFNfRFNQX1IyCisKK1dFQlBfRFNQX0lOSVRfU1RVQihXZWJQUmVzY2FsZXJEc3BJbml0TUlQU2RzcFIyKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX01JUFNfRFNQX1IyCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3Jlc2NhbGVyX21zYS5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9yZXNjYWxlcl9tc2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2JjOTlmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9yZXNjYWxlcl9tc2EuYwpAQCAtMCwwICsxLDQ0NCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIE1TQSB2ZXJzaW9uIG9mIHJlc2NhbGluZyBmdW5jdGlvbnMKKy8vCisvLyBBdXRob3I6IFByYXNoYW50IFBhdGlsIChwcmFzaGFudC5wYXRpbEBpbWd0ZWMuY29tKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTVNBKSAmJiAhZGVmaW5lZChXRUJQX1JFRFVDRV9TSVpFKQorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlICJzcmMvdXRpbHMvcmVzY2FsZXJfdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvZHNwL21zYV9tYWNyby5oIgorCisjZGVmaW5lIFJPVU5ERVIgKFdFQlBfUkVTQ0FMRVJfT05FID4+IDEpCisjZGVmaW5lIE1VTFRfRklYKHgsIHkpICgoKHVpbnQ2NF90KSh4KSAqICh5KSArIFJPVU5ERVIpID4+IFdFQlBfUkVTQ0FMRVJfUkZJWCkKKworI2RlZmluZSBDQUxDX01VTFRfRklYXzE2KGluMCwgaW4xLCBpbjIsIGluMywgc2NhbGUsIHNoaWZ0LCBkc3QpIGRvIHsgIFwKKyAgdjR1MzIgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHYxNnU4IHQwLCB0MSwgdDIsIHQzLCB0NCwgdDU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2MnU2NCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSUxWUkxfVzJfVVcoemVybywgaW4wLCB0bXAwLCB0bXAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElMVlJMX1cyX1VXKHplcm8sIGluMSwgdG1wMiwgdG1wMyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBET1RQX1VXMl9VRCh0bXAwLCB0bXAxLCBzY2FsZSwgc2NhbGUsIG91dDAsIG91dDEpOyAgICAgICAgICAgICAgICAgIFwKKyAgRE9UUF9VVzJfVUQodG1wMiwgdG1wMywgc2NhbGUsIHNjYWxlLCBvdXQyLCBvdXQzKTsgICAgICAgICAgICAgICAgICBcCisgIFNSQVJfRDRfVUQob3V0MCwgb3V0MSwgb3V0Miwgb3V0Mywgc2hpZnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBQQ0tFVl9CMl9VQihvdXQxLCBvdXQwLCBvdXQzLCBvdXQyLCB0MCwgdDEpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSUxWUkxfVzJfVVcoemVybywgaW4yLCB0bXAwLCB0bXAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElMVlJMX1cyX1VXKHplcm8sIGluMywgdG1wMiwgdG1wMyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBET1RQX1VXMl9VRCh0bXAwLCB0bXAxLCBzY2FsZSwgc2NhbGUsIG91dDAsIG91dDEpOyAgICAgICAgICAgICAgICAgIFwKKyAgRE9UUF9VVzJfVUQodG1wMiwgdG1wMywgc2NhbGUsIHNjYWxlLCBvdXQyLCBvdXQzKTsgICAgICAgICAgICAgICAgICBcCisgIFNSQVJfRDRfVUQob3V0MCwgb3V0MSwgb3V0Miwgb3V0Mywgc2hpZnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBQQ0tFVl9CMl9VQihvdXQxLCBvdXQwLCBvdXQzLCBvdXQyLCB0MiwgdDMpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgUENLRVZfQjJfVUIodDEsIHQwLCB0MywgdDIsIHQ0LCB0NSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRzdCA9ICh2MTZ1OClfX21zYV9wY2tldl9iKCh2MTZpOCl0NSwgKHYxNmk4KXQ0KTsgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDQUxDX01VTFRfRklYXzQoaW4wLCBzY2FsZSwgc2hpZnQsIGRzdCkgZG8geyAgXAorICB2NHUzMiB0bXAwLCB0bXAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2MTZpOCB0MCwgdDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2MnU2NCBvdXQwLCBvdXQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTFZSTF9XMl9VVyh6ZXJvLCBpbjAsIHRtcDAsIHRtcDEpOyAgICAgICAgICAgICAgICAgXAorICBET1RQX1VXMl9VRCh0bXAwLCB0bXAxLCBzY2FsZSwgc2NhbGUsIG91dDAsIG91dDEpOyAgXAorICBTUkFSX0QyX1VEKG91dDAsIG91dDEsIHNoaWZ0KTsgICAgICAgICAgICAgICAgICAgICAgXAorICB0MCA9IF9fbXNhX3Bja2V2X2IoKHYxNmk4KW91dDEsICh2MTZpOClvdXQwKTsgICAgICAgXAorICB0MSA9IF9fbXNhX3Bja2V2X2IodDAsIHQwKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0MCA9IF9fbXNhX3Bja2V2X2IodDEsIHQxKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkc3QgPSBfX21zYV9jb3B5X3NfdygodjRpMzIpdDAsIDApOyAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDQUxDX01VTFRfRklYMV8xNihpbjAsIGluMSwgaW4yLCBpbjMsIGZ5c2NhbGUsIHNoaWZ0LCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKSBkbyB7ICAgICAgICAgXAorICB2NHUzMiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2MnU2NCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTFZSTF9XMl9VVyh6ZXJvLCBpbjAsIHRtcDAsIHRtcDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTFZSTF9XMl9VVyh6ZXJvLCBpbjEsIHRtcDIsIHRtcDMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBET1RQX1VXMl9VRCh0bXAwLCB0bXAxLCBmeXNjYWxlLCBmeXNjYWxlLCBvdXQwLCBvdXQxKTsgICAgICAgXAorICBET1RQX1VXMl9VRCh0bXAyLCB0bXAzLCBmeXNjYWxlLCBmeXNjYWxlLCBvdXQyLCBvdXQzKTsgICAgICAgXAorICBTUkFSX0Q0X1VEKG91dDAsIG91dDEsIG91dDIsIG91dDMsIHNoaWZ0KTsgICAgICAgICAgICAgICAgICAgXAorICBQQ0tFVl9XMl9VVyhvdXQxLCBvdXQwLCBvdXQzLCBvdXQyLCBkc3QwLCBkc3QxKTsgICAgICAgICAgICAgXAorICBJTFZSTF9XMl9VVyh6ZXJvLCBpbjIsIHRtcDAsIHRtcDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTFZSTF9XMl9VVyh6ZXJvLCBpbjMsIHRtcDIsIHRtcDMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBET1RQX1VXMl9VRCh0bXAwLCB0bXAxLCBmeXNjYWxlLCBmeXNjYWxlLCBvdXQwLCBvdXQxKTsgICAgICAgXAorICBET1RQX1VXMl9VRCh0bXAyLCB0bXAzLCBmeXNjYWxlLCBmeXNjYWxlLCBvdXQyLCBvdXQzKTsgICAgICAgXAorICBTUkFSX0Q0X1VEKG91dDAsIG91dDEsIG91dDIsIG91dDMsIHNoaWZ0KTsgICAgICAgICAgICAgICAgICAgXAorICBQQ0tFVl9XMl9VVyhvdXQxLCBvdXQwLCBvdXQzLCBvdXQyLCBkc3QyLCBkc3QzKTsgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDQUxDX01VTFRfRklYMV80KGluMCwgc2NhbGUsIHNoaWZ0LCBkc3QpIGRvIHsgICAgXAorICB2NHUzMiB0bXAwLCB0bXAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2MnU2NCBvdXQwLCBvdXQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTFZSTF9XMl9VVyh6ZXJvLCBpbjAsIHRtcDAsIHRtcDEpOyAgICAgICAgICAgICAgICAgICAgXAorICBET1RQX1VXMl9VRCh0bXAwLCB0bXAxLCBzY2FsZSwgc2NhbGUsIG91dDAsIG91dDEpOyAgICAgXAorICBTUkFSX0QyX1VEKG91dDAsIG91dDEsIHNoaWZ0KTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkc3QgPSAodjR1MzIpX19tc2FfcGNrZXZfdygodjRpMzIpb3V0MSwgKHY0aTMyKW91dDApOyAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDQUxDX01VTFRfRklYMl8xNihpbjAsIGluMSwgaW4yLCBpbjMsIG11bHQsIHNjYWxlLCBzaGlmdCwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MSkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHY0dTMyIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2MnU2NCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSUxWUkxfVzJfVVcoaW4wLCBpbjIsIHRtcDAsIHRtcDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElMVlJMX1cyX1VXKGluMSwgaW4zLCB0bXAyLCB0bXAzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBET1RQX1VXMl9VRCh0bXAwLCB0bXAxLCBtdWx0LCBtdWx0LCBvdXQwLCBvdXQxKTsgICAgICAgICAgICAgICAgIFwKKyAgRE9UUF9VVzJfVUQodG1wMiwgdG1wMywgbXVsdCwgbXVsdCwgb3V0Miwgb3V0Myk7ICAgICAgICAgICAgICAgICBcCisgIFNSQVJfRDRfVUQob3V0MCwgb3V0MSwgb3V0Miwgb3V0Mywgc2hpZnQpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICBET1RQX1VXMl9VRChvdXQwLCBvdXQxLCBzY2FsZSwgc2NhbGUsIG91dDAsIG91dDEpOyAgICAgICAgICAgICAgIFwKKyAgRE9UUF9VVzJfVUQob3V0Miwgb3V0Mywgc2NhbGUsIHNjYWxlLCBvdXQyLCBvdXQzKTsgICAgICAgICAgICAgICBcCisgIFNSQVJfRDRfVUQob3V0MCwgb3V0MSwgb3V0Miwgb3V0Mywgc2hpZnQpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICBQQ0tFVl9CMl9VQihvdXQxLCBvdXQwLCBvdXQzLCBvdXQyLCBkc3QwLCBkc3QxKTsgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQ0FMQ19NVUxUX0ZJWDJfNChpbjAsIGluMSwgbXVsdCwgc2NhbGUsIHNoaWZ0LCBkc3QpIGRvIHsgIFwKKyAgdjR1MzIgdG1wMCwgdG1wMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdjJ1NjQgb3V0MCwgb3V0MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdjE2aTggdDAsIHQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSUxWUkxfVzJfVVcoaW4wLCBpbjEsIHRtcDAsIHRtcDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRE9UUF9VVzJfVUQodG1wMCwgdG1wMSwgbXVsdCwgbXVsdCwgb3V0MCwgb3V0MSk7ICAgICAgICAgICAgICAgIFwKKyAgU1JBUl9EMl9VRChvdXQwLCBvdXQxLCBzaGlmdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRE9UUF9VVzJfVUQob3V0MCwgb3V0MSwgc2NhbGUsIHNjYWxlLCBvdXQwLCBvdXQxKTsgICAgICAgICAgICAgIFwKKyAgU1JBUl9EMl9VRChvdXQwLCBvdXQxLCBzaGlmdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdDAgPSBfX21zYV9wY2tldl9iKCh2MTZpOClvdXQxLCAodjE2aTgpb3V0MCk7ICAgICAgICAgICAgICAgICAgIFwKKyAgdDEgPSBfX21zYV9wY2tldl9iKHQwLCB0MCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdDAgPSBfX21zYV9wY2tldl9iKHQxLCB0MSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZHN0ID0gX19tc2FfY29weV9zX3coKHY0aTMyKXQwLCAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEV4cG9ydFJvd0V4cGFuZF8wKGNvbnN0IHVpbnQzMl90KiBmcm93LCB1aW50OF90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUFJlc2NhbGVyKiBjb25zdCB3cmspIHsKKyAgY29uc3QgdjR1MzIgc2NhbGUgPSAodjR1MzIpX19tc2FfZmlsbF93KHdyay0+Znlfc2NhbGUpOworICBjb25zdCB2NHUzMiBzaGlmdCA9ICh2NHUzMilfX21zYV9maWxsX3coV0VCUF9SRVNDQUxFUl9SRklYKTsKKyAgY29uc3QgdjRpMzIgemVybyA9IHsgMCB9OworCisgIHdoaWxlIChsZW5ndGggPj0gMTYpIHsKKyAgICB2NHUzMiBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzOworICAgIHYxNnU4IG91dDsKKyAgICBMRF9VVzQoZnJvdywgNCwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7CisgICAgQ0FMQ19NVUxUX0ZJWF8xNihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzY2FsZSwgc2hpZnQsIG91dCk7CisgICAgU1RfVUIob3V0LCBkc3QpOworICAgIGxlbmd0aCAtPSAxNjsKKyAgICBmcm93ICAgKz0gMTY7CisgICAgZHN0ICAgICs9IDE2OworICB9CisgIGlmIChsZW5ndGggPiAwKSB7CisgICAgaW50IHhfb3V0OworICAgIGlmIChsZW5ndGggPj0gMTIpIHsKKyAgICAgIHVpbnQzMl90IHZhbDBfbSwgdmFsMV9tLCB2YWwyX207CisgICAgICB2NHUzMiBzcmMwLCBzcmMxLCBzcmMyOworICAgICAgTERfVVczKGZyb3csIDQsIHNyYzAsIHNyYzEsIHNyYzIpOworICAgICAgQ0FMQ19NVUxUX0ZJWF80KHNyYzAsIHNjYWxlLCBzaGlmdCwgdmFsMF9tKTsKKyAgICAgIENBTENfTVVMVF9GSVhfNChzcmMxLCBzY2FsZSwgc2hpZnQsIHZhbDFfbSk7CisgICAgICBDQUxDX01VTFRfRklYXzQoc3JjMiwgc2NhbGUsIHNoaWZ0LCB2YWwyX20pOworICAgICAgU1czKHZhbDBfbSwgdmFsMV9tLCB2YWwyX20sIGRzdCwgNCk7CisgICAgICBsZW5ndGggLT0gMTI7CisgICAgICBmcm93ICAgKz0gMTI7CisgICAgICBkc3QgICAgKz0gMTI7CisgICAgfSBlbHNlIGlmIChsZW5ndGggPj0gOCkgeworICAgICAgdWludDMyX3QgdmFsMF9tLCB2YWwxX207CisgICAgICB2NHUzMiBzcmMwLCBzcmMxOworICAgICAgTERfVVcyKGZyb3csIDQsIHNyYzAsIHNyYzEpOworICAgICAgQ0FMQ19NVUxUX0ZJWF80KHNyYzAsIHNjYWxlLCBzaGlmdCwgdmFsMF9tKTsKKyAgICAgIENBTENfTVVMVF9GSVhfNChzcmMxLCBzY2FsZSwgc2hpZnQsIHZhbDFfbSk7CisgICAgICBTVzIodmFsMF9tLCB2YWwxX20sIGRzdCwgNCk7CisgICAgICBsZW5ndGggLT0gODsKKyAgICAgIGZyb3cgICArPSA4OworICAgICAgZHN0ICAgICs9IDg7CisgICAgfSBlbHNlIGlmIChsZW5ndGggPj0gNCkgeworICAgICAgdWludDMyX3QgdmFsMF9tOworICAgICAgY29uc3QgdjR1MzIgc3JjMCA9IExEX1VXKGZyb3cpOworICAgICAgQ0FMQ19NVUxUX0ZJWF80KHNyYzAsIHNjYWxlLCBzaGlmdCwgdmFsMF9tKTsKKyAgICAgIFNXKHZhbDBfbSwgZHN0KTsKKyAgICAgIGxlbmd0aCAtPSA0OworICAgICAgZnJvdyAgICs9IDQ7CisgICAgICBkc3QgICAgKz0gNDsKKyAgICB9CisgICAgZm9yICh4X291dCA9IDA7IHhfb3V0IDwgbGVuZ3RoOyArK3hfb3V0KSB7CisgICAgICBjb25zdCB1aW50MzJfdCBKID0gZnJvd1t4X291dF07CisgICAgICBjb25zdCBpbnQgdiA9IChpbnQpTVVMVF9GSVgoSiwgd3JrLT5meV9zY2FsZSk7CisgICAgICBhc3NlcnQodiA+PSAwICYmIHYgPD0gMjU1KTsKKyAgICAgIGRzdFt4X291dF0gPSB2OworICAgIH0KKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBFeHBvcnRSb3dFeHBhbmRfMShjb25zdCB1aW50MzJfdCogZnJvdywgdWludDMyX3QqIGlyb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaykgeworICBjb25zdCB1aW50MzJfdCBCID0gV0VCUF9SRVNDQUxFUl9GUkFDKC13cmstPnlfYWNjdW0sIHdyay0+eV9zdWIpOworICBjb25zdCB1aW50MzJfdCBBID0gKHVpbnQzMl90KShXRUJQX1JFU0NBTEVSX09ORSAtIEIpOworICBjb25zdCB2NGkzMiBCMSA9IF9fbXNhX2ZpbGxfdyhCKTsKKyAgY29uc3QgdjRpMzIgQTEgPSBfX21zYV9maWxsX3coQSk7CisgIGNvbnN0IHY0aTMyIEFCID0gX19tc2FfaWx2cl93KEExLCBCMSk7CisgIGNvbnN0IHY0dTMyIHNjYWxlID0gKHY0dTMyKV9fbXNhX2ZpbGxfdyh3cmstPmZ5X3NjYWxlKTsKKyAgY29uc3QgdjR1MzIgc2hpZnQgPSAodjR1MzIpX19tc2FfZmlsbF93KFdFQlBfUkVTQ0FMRVJfUkZJWCk7CisKKyAgd2hpbGUgKGxlbmd0aCA+PSAxNikgeworICAgIHY0dTMyIGZyb3cwLCBmcm93MSwgZnJvdzIsIGZyb3czLCBpcm93MCwgaXJvdzEsIGlyb3cyLCBpcm93MzsKKyAgICB2MTZ1OCB0MCwgdDEsIHQyLCB0MywgdDQsIHQ1OworICAgIExEX1VXNChmcm93LCA0LCBmcm93MCwgZnJvdzEsIGZyb3cyLCBmcm93Myk7CisgICAgTERfVVc0KGlyb3csIDQsIGlyb3cwLCBpcm93MSwgaXJvdzIsIGlyb3czKTsKKyAgICBDQUxDX01VTFRfRklYMl8xNihmcm93MCwgZnJvdzEsIGlyb3cwLCBpcm93MSwgQUIsIHNjYWxlLCBzaGlmdCwgdDAsIHQxKTsKKyAgICBDQUxDX01VTFRfRklYMl8xNihmcm93MiwgZnJvdzMsIGlyb3cyLCBpcm93MywgQUIsIHNjYWxlLCBzaGlmdCwgdDIsIHQzKTsKKyAgICBQQ0tFVl9CMl9VQih0MSwgdDAsIHQzLCB0MiwgdDQsIHQ1KTsKKyAgICB0MCA9ICh2MTZ1OClfX21zYV9wY2tldl9iKCh2MTZpOCl0NSwgKHYxNmk4KXQ0KTsKKyAgICBTVF9VQih0MCwgZHN0KTsKKyAgICBmcm93ICAgKz0gMTY7CisgICAgaXJvdyAgICs9IDE2OworICAgIGRzdCAgICArPSAxNjsKKyAgICBsZW5ndGggLT0gMTY7CisgIH0KKyAgaWYgKGxlbmd0aCA+IDApIHsKKyAgICBpbnQgeF9vdXQ7CisgICAgaWYgKGxlbmd0aCA+PSAxMikgeworICAgICAgdWludDMyX3QgdmFsMF9tLCB2YWwxX20sIHZhbDJfbTsKKyAgICAgIHY0dTMyIGZyb3cwLCBmcm93MSwgZnJvdzIsIGlyb3cwLCBpcm93MSwgaXJvdzI7CisgICAgICBMRF9VVzMoZnJvdywgNCwgZnJvdzAsIGZyb3cxLCBmcm93Mik7CisgICAgICBMRF9VVzMoaXJvdywgNCwgaXJvdzAsIGlyb3cxLCBpcm93Mik7CisgICAgICBDQUxDX01VTFRfRklYMl80KGZyb3cwLCBpcm93MCwgQUIsIHNjYWxlLCBzaGlmdCwgdmFsMF9tKTsKKyAgICAgIENBTENfTVVMVF9GSVgyXzQoZnJvdzEsIGlyb3cxLCBBQiwgc2NhbGUsIHNoaWZ0LCB2YWwxX20pOworICAgICAgQ0FMQ19NVUxUX0ZJWDJfNChmcm93MiwgaXJvdzIsIEFCLCBzY2FsZSwgc2hpZnQsIHZhbDJfbSk7CisgICAgICBTVzModmFsMF9tLCB2YWwxX20sIHZhbDJfbSwgZHN0LCA0KTsKKyAgICAgIGZyb3cgICArPSAxMjsKKyAgICAgIGlyb3cgICArPSAxMjsKKyAgICAgIGRzdCAgICArPSAxMjsKKyAgICAgIGxlbmd0aCAtPSAxMjsKKyAgICB9IGVsc2UgaWYgKGxlbmd0aCA+PSA4KSB7CisgICAgICB1aW50MzJfdCB2YWwwX20sIHZhbDFfbTsKKyAgICAgIHY0dTMyIGZyb3cwLCBmcm93MSwgaXJvdzAsIGlyb3cxOworICAgICAgTERfVVcyKGZyb3csIDQsIGZyb3cwLCBmcm93MSk7CisgICAgICBMRF9VVzIoaXJvdywgNCwgaXJvdzAsIGlyb3cxKTsKKyAgICAgIENBTENfTVVMVF9GSVgyXzQoZnJvdzAsIGlyb3cwLCBBQiwgc2NhbGUsIHNoaWZ0LCB2YWwwX20pOworICAgICAgQ0FMQ19NVUxUX0ZJWDJfNChmcm93MSwgaXJvdzEsIEFCLCBzY2FsZSwgc2hpZnQsIHZhbDFfbSk7CisgICAgICBTVzIodmFsMF9tLCB2YWwxX20sIGRzdCwgNCk7CisgICAgICBmcm93ICAgKz0gNDsKKyAgICAgIGlyb3cgICArPSA0OworICAgICAgZHN0ICAgICs9IDQ7CisgICAgICBsZW5ndGggLT0gNDsKKyAgICB9IGVsc2UgaWYgKGxlbmd0aCA+PSA0KSB7CisgICAgICB1aW50MzJfdCB2YWwwX207CisgICAgICBjb25zdCB2NHUzMiBmcm93MCA9IExEX1VXKGZyb3cgKyAwKTsKKyAgICAgIGNvbnN0IHY0dTMyIGlyb3cwID0gTERfVVcoaXJvdyArIDApOworICAgICAgQ0FMQ19NVUxUX0ZJWDJfNChmcm93MCwgaXJvdzAsIEFCLCBzY2FsZSwgc2hpZnQsIHZhbDBfbSk7CisgICAgICBTVyh2YWwwX20sIGRzdCk7CisgICAgICBmcm93ICAgKz0gNDsKKyAgICAgIGlyb3cgICArPSA0OworICAgICAgZHN0ICAgICs9IDQ7CisgICAgICBsZW5ndGggLT0gNDsKKyAgICB9CisgICAgZm9yICh4X291dCA9IDA7IHhfb3V0IDwgbGVuZ3RoOyArK3hfb3V0KSB7CisgICAgICBjb25zdCB1aW50NjRfdCBJID0gKHVpbnQ2NF90KUEgKiBmcm93W3hfb3V0XQorICAgICAgICAgICAgICAgICAgICAgICArICh1aW50NjRfdClCICogaXJvd1t4X291dF07CisgICAgICBjb25zdCB1aW50MzJfdCBKID0gKHVpbnQzMl90KSgoSSArIFJPVU5ERVIpID4+IFdFQlBfUkVTQ0FMRVJfUkZJWCk7CisgICAgICBjb25zdCBpbnQgdiA9IChpbnQpTVVMVF9GSVgoSiwgd3JrLT5meV9zY2FsZSk7CisgICAgICBhc3NlcnQodiA+PSAwICYmIHYgPD0gMjU1KTsKKyAgICAgIGRzdFt4X291dF0gPSB2OworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBSZXNjYWxlckV4cG9ydFJvd0V4cGFuZF9NSVBTZHNwUjIoV2ViUFJlc2NhbGVyKiBjb25zdCB3cmspIHsKKyAgdWludDhfdCogZHN0ID0gd3JrLT5kc3Q7CisgIHJlc2NhbGVyX3QqIGlyb3cgPSB3cmstPmlyb3c7CisgIGNvbnN0IGludCB4X291dF9tYXggPSB3cmstPmRzdF93aWR0aCAqIHdyay0+bnVtX2NoYW5uZWxzOworICBjb25zdCByZXNjYWxlcl90KiBmcm93ID0gd3JrLT5mcm93OworICBhc3NlcnQoIVdlYlBSZXNjYWxlck91dHB1dERvbmUod3JrKSk7CisgIGFzc2VydCh3cmstPnlfYWNjdW0gPD0gMCk7CisgIGFzc2VydCh3cmstPnlfZXhwYW5kKTsKKyAgYXNzZXJ0KHdyay0+eV9zdWIgIT0gMCk7CisgIGlmICh3cmstPnlfYWNjdW0gPT0gMCkgeworICAgIEV4cG9ydFJvd0V4cGFuZF8wKGZyb3csIGRzdCwgeF9vdXRfbWF4LCB3cmspOworICB9IGVsc2UgeworICAgIEV4cG9ydFJvd0V4cGFuZF8xKGZyb3csIGlyb3csIGRzdCwgeF9vdXRfbWF4LCB3cmspOworICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEV4cG9ydFJvd1Nocmlua18wKGNvbnN0IHVpbnQzMl90KiBmcm93LCB1aW50MzJfdCogaXJvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHlzY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBSZXNjYWxlciogY29uc3Qgd3JrKSB7CisgIGNvbnN0IHY0dTMyIHlfc2NhbGUgPSAodjR1MzIpX19tc2FfZmlsbF93KHlzY2FsZSk7CisgIGNvbnN0IHY0dTMyIGZ4eXNjYWxlID0gKHY0dTMyKV9fbXNhX2ZpbGxfdyh3cmstPmZ4eV9zY2FsZSk7CisgIGNvbnN0IHY0dTMyIHNoaWZ0dmFsID0gKHY0dTMyKV9fbXNhX2ZpbGxfdyhXRUJQX1JFU0NBTEVSX1JGSVgpOworICBjb25zdCB2NGkzMiB6ZXJvID0geyAwIH07CisKKyAgd2hpbGUgKGxlbmd0aCA+PSAxNikgeworICAgIHY0dTMyIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIGZyYWMwLCBmcmFjMSwgZnJhYzIsIGZyYWMzOworICAgIHYxNnU4IG91dDsKKyAgICBMRF9VVzQoZnJvdywgNCwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7CisgICAgQ0FMQ19NVUxUX0ZJWDFfMTYoc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgeV9zY2FsZSwgc2hpZnR2YWwsCisgICAgICAgICAgICAgICAgICAgICAgZnJhYzAsIGZyYWMxLCBmcmFjMiwgZnJhYzMpOworICAgIExEX1VXNChpcm93LCA0LCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKKyAgICBTVUI0KHNyYzAsIGZyYWMwLCBzcmMxLCBmcmFjMSwgc3JjMiwgZnJhYzIsIHNyYzMsIGZyYWMzLAorICAgICAgICAgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7CisgICAgQ0FMQ19NVUxUX0ZJWF8xNihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBmeHlzY2FsZSwgc2hpZnR2YWwsIG91dCk7CisgICAgU1RfVUIob3V0LCBkc3QpOworICAgIFNUX1VXNChmcmFjMCwgZnJhYzEsIGZyYWMyLCBmcmFjMywgaXJvdywgNCk7CisgICAgZnJvdyAgICs9IDE2OworICAgIGlyb3cgICArPSAxNjsKKyAgICBkc3QgICAgKz0gMTY7CisgICAgbGVuZ3RoIC09IDE2OworICB9CisgIGlmIChsZW5ndGggPiAwKSB7CisgICAgaW50IHhfb3V0OworICAgIGlmIChsZW5ndGggPj0gMTIpIHsKKyAgICAgIHVpbnQzMl90IHZhbDBfbSwgdmFsMV9tLCB2YWwyX207CisgICAgICB2NHUzMiBzcmMwLCBzcmMxLCBzcmMyLCBmcmFjMCwgZnJhYzEsIGZyYWMyOworICAgICAgTERfVVczKGZyb3csIDQsIHNyYzAsIHNyYzEsIHNyYzIpOworICAgICAgQ0FMQ19NVUxUX0ZJWDFfNChzcmMwLCB5X3NjYWxlLCBzaGlmdHZhbCwgZnJhYzApOworICAgICAgQ0FMQ19NVUxUX0ZJWDFfNChzcmMxLCB5X3NjYWxlLCBzaGlmdHZhbCwgZnJhYzEpOworICAgICAgQ0FMQ19NVUxUX0ZJWDFfNChzcmMyLCB5X3NjYWxlLCBzaGlmdHZhbCwgZnJhYzIpOworICAgICAgTERfVVczKGlyb3csIDQsIHNyYzAsIHNyYzEsIHNyYzIpOworICAgICAgU1VCMyhzcmMwLCBmcmFjMCwgc3JjMSwgZnJhYzEsIHNyYzIsIGZyYWMyLCBzcmMwLCBzcmMxLCBzcmMyKTsKKyAgICAgIENBTENfTVVMVF9GSVhfNChzcmMwLCBmeHlzY2FsZSwgc2hpZnR2YWwsIHZhbDBfbSk7CisgICAgICBDQUxDX01VTFRfRklYXzQoc3JjMSwgZnh5c2NhbGUsIHNoaWZ0dmFsLCB2YWwxX20pOworICAgICAgQ0FMQ19NVUxUX0ZJWF80KHNyYzIsIGZ4eXNjYWxlLCBzaGlmdHZhbCwgdmFsMl9tKTsKKyAgICAgIFNXMyh2YWwwX20sIHZhbDFfbSwgdmFsMl9tLCBkc3QsIDQpOworICAgICAgU1RfVVczKGZyYWMwLCBmcmFjMSwgZnJhYzIsIGlyb3csIDQpOworICAgICAgZnJvdyAgICs9IDEyOworICAgICAgaXJvdyAgICs9IDEyOworICAgICAgZHN0ICAgICs9IDEyOworICAgICAgbGVuZ3RoIC09IDEyOworICAgIH0gZWxzZSBpZiAobGVuZ3RoID49IDgpIHsKKyAgICAgIHVpbnQzMl90IHZhbDBfbSwgdmFsMV9tOworICAgICAgdjR1MzIgc3JjMCwgc3JjMSwgZnJhYzAsIGZyYWMxOworICAgICAgTERfVVcyKGZyb3csIDQsIHNyYzAsIHNyYzEpOworICAgICAgQ0FMQ19NVUxUX0ZJWDFfNChzcmMwLCB5X3NjYWxlLCBzaGlmdHZhbCwgZnJhYzApOworICAgICAgQ0FMQ19NVUxUX0ZJWDFfNChzcmMxLCB5X3NjYWxlLCBzaGlmdHZhbCwgZnJhYzEpOworICAgICAgTERfVVcyKGlyb3csIDQsIHNyYzAsIHNyYzEpOworICAgICAgU1VCMihzcmMwLCBmcmFjMCwgc3JjMSwgZnJhYzEsIHNyYzAsIHNyYzEpOworICAgICAgQ0FMQ19NVUxUX0ZJWF80KHNyYzAsIGZ4eXNjYWxlLCBzaGlmdHZhbCwgdmFsMF9tKTsKKyAgICAgIENBTENfTVVMVF9GSVhfNChzcmMxLCBmeHlzY2FsZSwgc2hpZnR2YWwsIHZhbDFfbSk7CisgICAgICBTVzIodmFsMF9tLCB2YWwxX20sIGRzdCwgNCk7CisgICAgICBTVF9VVzIoZnJhYzAsIGZyYWMxLCBpcm93LCA0KTsKKyAgICAgIGZyb3cgICArPSA4OworICAgICAgaXJvdyAgICs9IDg7CisgICAgICBkc3QgICAgKz0gODsKKyAgICAgIGxlbmd0aCAtPSA4OworICAgIH0gZWxzZSBpZiAobGVuZ3RoID49IDQpIHsKKyAgICAgIHVpbnQzMl90IHZhbDBfbTsKKyAgICAgIHY0dTMyIGZyYWMwOworICAgICAgdjR1MzIgc3JjMCA9IExEX1VXKGZyb3cpOworICAgICAgQ0FMQ19NVUxUX0ZJWDFfNChzcmMwLCB5X3NjYWxlLCBzaGlmdHZhbCwgZnJhYzApOworICAgICAgc3JjMCA9IExEX1VXKGlyb3cpOworICAgICAgc3JjMCA9IHNyYzAgLSBmcmFjMDsKKyAgICAgIENBTENfTVVMVF9GSVhfNChzcmMwLCBmeHlzY2FsZSwgc2hpZnR2YWwsIHZhbDBfbSk7CisgICAgICBTVyh2YWwwX20sIGRzdCk7CisgICAgICBTVF9VVyhmcmFjMCwgaXJvdyk7CisgICAgICBmcm93ICAgKz0gNDsKKyAgICAgIGlyb3cgICArPSA0OworICAgICAgZHN0ICAgICs9IDQ7CisgICAgICBsZW5ndGggLT0gNDsKKyAgICB9CisgICAgZm9yICh4X291dCA9IDA7IHhfb3V0IDwgbGVuZ3RoOyArK3hfb3V0KSB7CisgICAgICBjb25zdCB1aW50MzJfdCBmcmFjID0gKHVpbnQzMl90KU1VTFRfRklYKGZyb3dbeF9vdXRdLCB5c2NhbGUpOworICAgICAgY29uc3QgaW50IHYgPSAoaW50KU1VTFRfRklYKGlyb3dbeF9vdXRdIC0gZnJhYywgd3JrLT5meHlfc2NhbGUpOworICAgICAgYXNzZXJ0KHYgPj0gMCAmJiB2IDw9IDI1NSk7CisgICAgICBkc3RbeF9vdXRdID0gdjsKKyAgICAgIGlyb3dbeF9vdXRdID0gZnJhYzsKKyAgICB9CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRXhwb3J0Um93U2hyaW5rXzEodWludDMyX3QqIGlyb3csIHVpbnQ4X3QqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaykgeworICBjb25zdCB2NHUzMiBzY2FsZSA9ICh2NHUzMilfX21zYV9maWxsX3cod3JrLT5meHlfc2NhbGUpOworICBjb25zdCB2NHUzMiBzaGlmdCA9ICh2NHUzMilfX21zYV9maWxsX3coV0VCUF9SRVNDQUxFUl9SRklYKTsKKyAgY29uc3QgdjRpMzIgemVybyA9IHsgMCB9OworCisgIHdoaWxlIChsZW5ndGggPj0gMTYpIHsKKyAgICB2NHUzMiBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzOworICAgIHYxNnU4IGRzdDA7CisgICAgTERfVVc0KGlyb3csIDQsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOworICAgIENBTENfTVVMVF9GSVhfMTYoc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc2NhbGUsIHNoaWZ0LCBkc3QwKTsKKyAgICBTVF9VQihkc3QwLCBkc3QpOworICAgIFNUX1NXNCh6ZXJvLCB6ZXJvLCB6ZXJvLCB6ZXJvLCBpcm93LCA0KTsKKyAgICBsZW5ndGggLT0gMTY7CisgICAgaXJvdyAgICs9IDE2OworICAgIGRzdCAgICArPSAxNjsKKyAgfQorICBpZiAobGVuZ3RoID4gMCkgeworICAgIGludCB4X291dDsKKyAgICBpZiAobGVuZ3RoID49IDEyKSB7CisgICAgICB1aW50MzJfdCB2YWwwX20sIHZhbDFfbSwgdmFsMl9tOworICAgICAgdjR1MzIgc3JjMCwgc3JjMSwgc3JjMjsKKyAgICAgIExEX1VXMyhpcm93LCA0LCBzcmMwLCBzcmMxLCBzcmMyKTsKKyAgICAgIENBTENfTVVMVF9GSVhfNChzcmMwLCBzY2FsZSwgc2hpZnQsIHZhbDBfbSk7CisgICAgICBDQUxDX01VTFRfRklYXzQoc3JjMSwgc2NhbGUsIHNoaWZ0LCB2YWwxX20pOworICAgICAgQ0FMQ19NVUxUX0ZJWF80KHNyYzIsIHNjYWxlLCBzaGlmdCwgdmFsMl9tKTsKKyAgICAgIFNXMyh2YWwwX20sIHZhbDFfbSwgdmFsMl9tLCBkc3QsIDQpOworICAgICAgU1RfU1czKHplcm8sIHplcm8sIHplcm8sIGlyb3csIDQpOworICAgICAgbGVuZ3RoIC09IDEyOworICAgICAgaXJvdyAgICs9IDEyOworICAgICAgZHN0ICAgICs9IDEyOworICAgIH0gZWxzZSBpZiAobGVuZ3RoID49IDgpIHsKKyAgICAgIHVpbnQzMl90IHZhbDBfbSwgdmFsMV9tOworICAgICAgdjR1MzIgc3JjMCwgc3JjMTsKKyAgICAgIExEX1VXMihpcm93LCA0LCBzcmMwLCBzcmMxKTsKKyAgICAgIENBTENfTVVMVF9GSVhfNChzcmMwLCBzY2FsZSwgc2hpZnQsIHZhbDBfbSk7CisgICAgICBDQUxDX01VTFRfRklYXzQoc3JjMSwgc2NhbGUsIHNoaWZ0LCB2YWwxX20pOworICAgICAgU1cyKHZhbDBfbSwgdmFsMV9tLCBkc3QsIDQpOworICAgICAgU1RfU1cyKHplcm8sIHplcm8sIGlyb3csIDQpOworICAgICAgbGVuZ3RoIC09IDg7CisgICAgICBpcm93ICAgKz0gODsKKyAgICAgIGRzdCAgICArPSA4OworICAgIH0gZWxzZSBpZiAobGVuZ3RoID49IDQpIHsKKyAgICAgIHVpbnQzMl90IHZhbDBfbTsKKyAgICAgIGNvbnN0IHY0dTMyIHNyYzAgPSBMRF9VVyhpcm93ICsgMCk7CisgICAgICBDQUxDX01VTFRfRklYXzQoc3JjMCwgc2NhbGUsIHNoaWZ0LCB2YWwwX20pOworICAgICAgU1codmFsMF9tLCBkc3QpOworICAgICAgU1RfU1coemVybywgaXJvdyk7CisgICAgICBsZW5ndGggLT0gNDsKKyAgICAgIGlyb3cgICArPSA0OworICAgICAgZHN0ICAgICs9IDQ7CisgICAgfQorICAgIGZvciAoeF9vdXQgPSAwOyB4X291dCA8IGxlbmd0aDsgKyt4X291dCkgeworICAgICAgY29uc3QgaW50IHYgPSAoaW50KU1VTFRfRklYKGlyb3dbeF9vdXRdLCB3cmstPmZ4eV9zY2FsZSk7CisgICAgICBhc3NlcnQodiA+PSAwICYmIHYgPD0gMjU1KTsKKyAgICAgIGRzdFt4X291dF0gPSB2OworICAgICAgaXJvd1t4X291dF0gPSAwOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBSZXNjYWxlckV4cG9ydFJvd1Nocmlua19NSVBTZHNwUjIoV2ViUFJlc2NhbGVyKiBjb25zdCB3cmspIHsKKyAgdWludDhfdCogZHN0ID0gd3JrLT5kc3Q7CisgIHJlc2NhbGVyX3QqIGlyb3cgPSB3cmstPmlyb3c7CisgIGNvbnN0IGludCB4X291dF9tYXggPSB3cmstPmRzdF93aWR0aCAqIHdyay0+bnVtX2NoYW5uZWxzOworICBjb25zdCByZXNjYWxlcl90KiBmcm93ID0gd3JrLT5mcm93OworICBjb25zdCB1aW50MzJfdCB5c2NhbGUgPSB3cmstPmZ5X3NjYWxlICogKC13cmstPnlfYWNjdW0pOworICBhc3NlcnQoIVdlYlBSZXNjYWxlck91dHB1dERvbmUod3JrKSk7CisgIGFzc2VydCh3cmstPnlfYWNjdW0gPD0gMCk7CisgIGFzc2VydCghd3JrLT55X2V4cGFuZCk7CisgIGlmICh5c2NhbGUpIHsKKyAgICBFeHBvcnRSb3dTaHJpbmtfMChmcm93LCBpcm93LCBkc3QsIHhfb3V0X21heCwgeXNjYWxlLCB3cmspOworICB9IGVsc2UgeworICAgIEV4cG9ydFJvd1Nocmlua18xKGlyb3csIGRzdCwgeF9vdXRfbWF4LCB3cmspOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBXZWJQUmVzY2FsZXJEc3BJbml0TVNBKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgV2ViUFJlc2NhbGVyRHNwSW5pdE1TQSh2b2lkKSB7CisgIFdlYlBSZXNjYWxlckV4cG9ydFJvd0V4cGFuZCA9IFJlc2NhbGVyRXhwb3J0Um93RXhwYW5kX01JUFNkc3BSMjsKKyAgV2ViUFJlc2NhbGVyRXhwb3J0Um93U2hyaW5rID0gUmVzY2FsZXJFeHBvcnRSb3dTaHJpbmtfTUlQU2RzcFIyOworfQorCisjZWxzZSAgICAgLy8gIVdFQlBfVVNFX01TQQorCitXRUJQX0RTUF9JTklUX1NUVUIoV2ViUFJlc2NhbGVyRHNwSW5pdE1TQSkKKworI2VuZGlmICAgIC8vIFdFQlBfVVNFX01TQQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9yZXNjYWxlcl9uZW9uLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3Jlc2NhbGVyX25lb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWZmOWZiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9yZXNjYWxlcl9uZW9uLmMKQEAgLTAsMCArMSwxODYgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBORU9OIHZlcnNpb24gb2YgcmVzY2FsaW5nIGZ1bmN0aW9ucworLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9ORU9OKSAmJiAhZGVmaW5lZChXRUJQX1JFRFVDRV9TSVpFKQorCisjaW5jbHVkZSA8YXJtX25lb24uaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlICJzcmMvZHNwL25lb24uaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvcmVzY2FsZXJfdXRpbHMuaCIKKworI2RlZmluZSBST1VOREVSIChXRUJQX1JFU0NBTEVSX09ORSA+PiAxKQorI2RlZmluZSBNVUxUX0ZJWF9DKHgsIHkpICgoKHVpbnQ2NF90KSh4KSAqICh5KSArIFJPVU5ERVIpID4+IFdFQlBfUkVTQ0FMRVJfUkZJWCkKKworI2RlZmluZSBMT0FEXzMyeDQoU1JDLCBEU1QpIGNvbnN0IHVpbnQzMng0X3QgRFNUID0gdmxkMXFfdTMyKChTUkMpKQorI2RlZmluZSBMT0FEXzMyeDgoU1JDLCBEU1QwLCBEU1QxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBMT0FEXzMyeDQoU1JDICsgMCwgRFNUMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTE9BRF8zMng0KFNSQyArIDQsIERTVDEpCisKKyNkZWZpbmUgU1RPUkVfMzJ4OChTUkMwLCBTUkMxLCBEU1QpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdnN0MXFfdTMyKChEU1QpICsgMCwgU1JDMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZzdDFxX3UzMigoRFNUKSArIDQsIFNSQzEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApOworCisjaWYgKFdFQlBfUkVTQ0FMRVJfUkZJWCA9PSAzMikKKyNkZWZpbmUgTUFLRV9IQUxGX0NTVChDKSB2ZHVwcV9uX3MzMigoaW50MzJfdCkoKEMpID4+IDEpKQorI2RlZmluZSBNVUxUX0ZJWChBLCBCKSAvKiBub3RlOiBCIGlzIGFjdHVhbHkgc2NhbGU+PjEuIFNlZSBNQUtFX0hBTEZfQ1NUICovIFwKKyAgICB2cmVpbnRlcnByZXRxX3UzMl9zMzIodnFyZG11bGhxX3MzMih2cmVpbnRlcnByZXRxX3MzMl91MzIoKEEpKSwgKEIpKSkKKyNlbHNlCisjZXJyb3IgIk1VTFRfRklYL1dFQlBfUkVTQ0FMRVJfUkZJWCBuZWVkIHNvbWUgbW9yZSB3b3JrIgorI2VuZGlmCisKK3N0YXRpYyB1aW50MzJ4NF90IEludGVycG9sYXRlX05FT04oY29uc3QgcmVzY2FsZXJfdCogY29uc3QgZnJvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzY2FsZXJfdCogY29uc3QgaXJvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQSwgdWludDMyX3QgQikgeworICBMT0FEXzMyeDQoZnJvdywgQTApOworICBMT0FEXzMyeDQoaXJvdywgQjApOworICBjb25zdCB1aW50NjR4Ml90IEMwID0gdm11bGxfbl91MzIodmdldF9sb3dfdTMyKEEwKSwgQSk7CisgIGNvbnN0IHVpbnQ2NHgyX3QgQzEgPSB2bXVsbF9uX3UzMih2Z2V0X2hpZ2hfdTMyKEEwKSwgQSk7CisgIGNvbnN0IHVpbnQ2NHgyX3QgRDAgPSB2bWxhbF9uX3UzMihDMCwgdmdldF9sb3dfdTMyKEIwKSwgQik7CisgIGNvbnN0IHVpbnQ2NHgyX3QgRDEgPSB2bWxhbF9uX3UzMihDMSwgdmdldF9oaWdoX3UzMihCMCksIEIpOworICBjb25zdCB1aW50MzJ4NF90IEUgPSB2Y29tYmluZV91MzIoCisgICAgICB2cnNocm5fbl91NjQoRDAsIFdFQlBfUkVTQ0FMRVJfUkZJWCksCisgICAgICB2cnNocm5fbl91NjQoRDEsIFdFQlBfUkVTQ0FMRVJfUkZJWCkpOworICByZXR1cm4gRTsKK30KKworc3RhdGljIHZvaWQgUmVzY2FsZXJFeHBvcnRSb3dFeHBhbmRfTkVPTihXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaykgeworICBpbnQgeF9vdXQ7CisgIHVpbnQ4X3QqIGNvbnN0IGRzdCA9IHdyay0+ZHN0OworICByZXNjYWxlcl90KiBjb25zdCBpcm93ID0gd3JrLT5pcm93OworICBjb25zdCBpbnQgeF9vdXRfbWF4ID0gd3JrLT5kc3Rfd2lkdGggKiB3cmstPm51bV9jaGFubmVsczsKKyAgY29uc3QgaW50IG1heF9zcGFuID0geF9vdXRfbWF4ICYgfjc7CisgIGNvbnN0IHJlc2NhbGVyX3QqIGNvbnN0IGZyb3cgPSB3cmstPmZyb3c7CisgIGNvbnN0IHVpbnQzMl90IGZ5X3NjYWxlID0gd3JrLT5meV9zY2FsZTsKKyAgY29uc3QgaW50MzJ4NF90IGZ5X3NjYWxlX2hhbGYgPSBNQUtFX0hBTEZfQ1NUKGZ5X3NjYWxlKTsKKyAgYXNzZXJ0KCFXZWJQUmVzY2FsZXJPdXRwdXREb25lKHdyaykpOworICBhc3NlcnQod3JrLT55X2FjY3VtIDw9IDApOworICBhc3NlcnQod3JrLT55X2V4cGFuZCk7CisgIGFzc2VydCh3cmstPnlfc3ViICE9IDApOworICBpZiAod3JrLT55X2FjY3VtID09IDApIHsKKyAgICBmb3IgKHhfb3V0ID0gMDsgeF9vdXQgPCBtYXhfc3BhbjsgeF9vdXQgKz0gOCkgeworICAgICAgTE9BRF8zMng0KGZyb3cgKyB4X291dCArIDAsIEEwKTsKKyAgICAgIExPQURfMzJ4NChmcm93ICsgeF9vdXQgKyA0LCBBMSk7CisgICAgICBjb25zdCB1aW50MzJ4NF90IEIwID0gTVVMVF9GSVgoQTAsIGZ5X3NjYWxlX2hhbGYpOworICAgICAgY29uc3QgdWludDMyeDRfdCBCMSA9IE1VTFRfRklYKEExLCBmeV9zY2FsZV9oYWxmKTsKKyAgICAgIGNvbnN0IHVpbnQxNng0X3QgQzAgPSB2bW92bl91MzIoQjApOworICAgICAgY29uc3QgdWludDE2eDRfdCBDMSA9IHZtb3ZuX3UzMihCMSk7CisgICAgICBjb25zdCB1aW50OHg4X3QgRCA9IHZtb3ZuX3UxNih2Y29tYmluZV91MTYoQzAsIEMxKSk7CisgICAgICB2c3QxX3U4KGRzdCArIHhfb3V0LCBEKTsKKyAgICB9CisgICAgZm9yICg7IHhfb3V0IDwgeF9vdXRfbWF4OyArK3hfb3V0KSB7CisgICAgICBjb25zdCB1aW50MzJfdCBKID0gZnJvd1t4X291dF07CisgICAgICBjb25zdCBpbnQgdiA9IChpbnQpTVVMVF9GSVhfQyhKLCBmeV9zY2FsZSk7CisgICAgICBhc3NlcnQodiA+PSAwICYmIHYgPD0gMjU1KTsKKyAgICAgIGRzdFt4X291dF0gPSB2OworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBjb25zdCB1aW50MzJfdCBCID0gV0VCUF9SRVNDQUxFUl9GUkFDKC13cmstPnlfYWNjdW0sIHdyay0+eV9zdWIpOworICAgIGNvbnN0IHVpbnQzMl90IEEgPSAodWludDMyX3QpKFdFQlBfUkVTQ0FMRVJfT05FIC0gQik7CisgICAgZm9yICh4X291dCA9IDA7IHhfb3V0IDwgbWF4X3NwYW47IHhfb3V0ICs9IDgpIHsKKyAgICAgIGNvbnN0IHVpbnQzMng0X3QgQzAgPQorICAgICAgICAgIEludGVycG9sYXRlX05FT04oZnJvdyArIHhfb3V0ICsgMCwgaXJvdyArIHhfb3V0ICsgMCwgQSwgQik7CisgICAgICBjb25zdCB1aW50MzJ4NF90IEMxID0KKyAgICAgICAgICBJbnRlcnBvbGF0ZV9ORU9OKGZyb3cgKyB4X291dCArIDQsIGlyb3cgKyB4X291dCArIDQsIEEsIEIpOworICAgICAgY29uc3QgdWludDMyeDRfdCBEMCA9IE1VTFRfRklYKEMwLCBmeV9zY2FsZV9oYWxmKTsKKyAgICAgIGNvbnN0IHVpbnQzMng0X3QgRDEgPSBNVUxUX0ZJWChDMSwgZnlfc2NhbGVfaGFsZik7CisgICAgICBjb25zdCB1aW50MTZ4NF90IEUwID0gdm1vdm5fdTMyKEQwKTsKKyAgICAgIGNvbnN0IHVpbnQxNng0X3QgRTEgPSB2bW92bl91MzIoRDEpOworICAgICAgY29uc3QgdWludDh4OF90IEYgPSB2bW92bl91MTYodmNvbWJpbmVfdTE2KEUwLCBFMSkpOworICAgICAgdnN0MV91OChkc3QgKyB4X291dCwgRik7CisgICAgfQorICAgIGZvciAoOyB4X291dCA8IHhfb3V0X21heDsgKyt4X291dCkgeworICAgICAgY29uc3QgdWludDY0X3QgSSA9ICh1aW50NjRfdClBICogZnJvd1t4X291dF0KKyAgICAgICAgICAgICAgICAgICAgICAgKyAodWludDY0X3QpQiAqIGlyb3dbeF9vdXRdOworICAgICAgY29uc3QgdWludDMyX3QgSiA9ICh1aW50MzJfdCkoKEkgKyBST1VOREVSKSA+PiBXRUJQX1JFU0NBTEVSX1JGSVgpOworICAgICAgY29uc3QgaW50IHYgPSAoaW50KU1VTFRfRklYX0MoSiwgZnlfc2NhbGUpOworICAgICAgYXNzZXJ0KHYgPj0gMCAmJiB2IDw9IDI1NSk7CisgICAgICBkc3RbeF9vdXRdID0gdjsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgUmVzY2FsZXJFeHBvcnRSb3dTaHJpbmtfTkVPTihXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaykgeworICBpbnQgeF9vdXQ7CisgIHVpbnQ4X3QqIGNvbnN0IGRzdCA9IHdyay0+ZHN0OworICByZXNjYWxlcl90KiBjb25zdCBpcm93ID0gd3JrLT5pcm93OworICBjb25zdCBpbnQgeF9vdXRfbWF4ID0gd3JrLT5kc3Rfd2lkdGggKiB3cmstPm51bV9jaGFubmVsczsKKyAgY29uc3QgaW50IG1heF9zcGFuID0geF9vdXRfbWF4ICYgfjc7CisgIGNvbnN0IHJlc2NhbGVyX3QqIGNvbnN0IGZyb3cgPSB3cmstPmZyb3c7CisgIGNvbnN0IHVpbnQzMl90IHlzY2FsZSA9IHdyay0+Znlfc2NhbGUgKiAoLXdyay0+eV9hY2N1bSk7CisgIGNvbnN0IHVpbnQzMl90IGZ4eV9zY2FsZSA9IHdyay0+Znh5X3NjYWxlOworICBjb25zdCB1aW50MzJ4NF90IHplcm8gPSB2ZHVwcV9uX3UzMigwKTsKKyAgY29uc3QgaW50MzJ4NF90IHlzY2FsZV9oYWxmID0gTUFLRV9IQUxGX0NTVCh5c2NhbGUpOworICBjb25zdCBpbnQzMng0X3QgZnh5X3NjYWxlX2hhbGYgPSBNQUtFX0hBTEZfQ1NUKGZ4eV9zY2FsZSk7CisgIGFzc2VydCghV2ViUFJlc2NhbGVyT3V0cHV0RG9uZSh3cmspKTsKKyAgYXNzZXJ0KHdyay0+eV9hY2N1bSA8PSAwKTsKKyAgYXNzZXJ0KCF3cmstPnlfZXhwYW5kKTsKKyAgaWYgKHlzY2FsZSkgeworICAgIGZvciAoeF9vdXQgPSAwOyB4X291dCA8IG1heF9zcGFuOyB4X291dCArPSA4KSB7CisgICAgICBMT0FEXzMyeDgoZnJvdyArIHhfb3V0LCBpbjAsIGluMSk7CisgICAgICBMT0FEXzMyeDgoaXJvdyArIHhfb3V0LCBpbjIsIGluMyk7CisgICAgICBjb25zdCB1aW50MzJ4NF90IEEwID0gTVVMVF9GSVgoaW4wLCB5c2NhbGVfaGFsZik7CisgICAgICBjb25zdCB1aW50MzJ4NF90IEExID0gTVVMVF9GSVgoaW4xLCB5c2NhbGVfaGFsZik7CisgICAgICBjb25zdCB1aW50MzJ4NF90IEIwID0gdnFzdWJxX3UzMihpbjIsIEEwKTsKKyAgICAgIGNvbnN0IHVpbnQzMng0X3QgQjEgPSB2cXN1YnFfdTMyKGluMywgQTEpOworICAgICAgY29uc3QgdWludDMyeDRfdCBDMCA9IE1VTFRfRklYKEIwLCBmeHlfc2NhbGVfaGFsZik7CisgICAgICBjb25zdCB1aW50MzJ4NF90IEMxID0gTVVMVF9GSVgoQjEsIGZ4eV9zY2FsZV9oYWxmKTsKKyAgICAgIGNvbnN0IHVpbnQxNng0X3QgRDAgPSB2bW92bl91MzIoQzApOworICAgICAgY29uc3QgdWludDE2eDRfdCBEMSA9IHZtb3ZuX3UzMihDMSk7CisgICAgICBjb25zdCB1aW50OHg4X3QgRSA9IHZtb3ZuX3UxNih2Y29tYmluZV91MTYoRDAsIEQxKSk7CisgICAgICB2c3QxX3U4KGRzdCArIHhfb3V0LCBFKTsKKyAgICAgIFNUT1JFXzMyeDgoQTAsIEExLCBpcm93ICsgeF9vdXQpOworICAgIH0KKyAgICBmb3IgKDsgeF9vdXQgPCB4X291dF9tYXg7ICsreF9vdXQpIHsKKyAgICAgIGNvbnN0IHVpbnQzMl90IGZyYWMgPSAodWludDMyX3QpTVVMVF9GSVhfQyhmcm93W3hfb3V0XSwgeXNjYWxlKTsKKyAgICAgIGNvbnN0IGludCB2ID0gKGludClNVUxUX0ZJWF9DKGlyb3dbeF9vdXRdIC0gZnJhYywgd3JrLT5meHlfc2NhbGUpOworICAgICAgYXNzZXJ0KHYgPj0gMCAmJiB2IDw9IDI1NSk7CisgICAgICBkc3RbeF9vdXRdID0gdjsKKyAgICAgIGlyb3dbeF9vdXRdID0gZnJhYzsgICAvLyBuZXcgZnJhY3Rpb25hbCBzdGFydAorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKHhfb3V0ID0gMDsgeF9vdXQgPCBtYXhfc3BhbjsgeF9vdXQgKz0gOCkgeworICAgICAgTE9BRF8zMng4KGlyb3cgKyB4X291dCwgaW4wLCBpbjEpOworICAgICAgY29uc3QgdWludDMyeDRfdCBBMCA9IE1VTFRfRklYKGluMCwgZnh5X3NjYWxlX2hhbGYpOworICAgICAgY29uc3QgdWludDMyeDRfdCBBMSA9IE1VTFRfRklYKGluMSwgZnh5X3NjYWxlX2hhbGYpOworICAgICAgY29uc3QgdWludDE2eDRfdCBCMCA9IHZtb3ZuX3UzMihBMCk7CisgICAgICBjb25zdCB1aW50MTZ4NF90IEIxID0gdm1vdm5fdTMyKEExKTsKKyAgICAgIGNvbnN0IHVpbnQ4eDhfdCBDID0gdm1vdm5fdTE2KHZjb21iaW5lX3UxNihCMCwgQjEpKTsKKyAgICAgIHZzdDFfdTgoZHN0ICsgeF9vdXQsIEMpOworICAgICAgU1RPUkVfMzJ4OCh6ZXJvLCB6ZXJvLCBpcm93ICsgeF9vdXQpOworICAgIH0KKyAgICBmb3IgKDsgeF9vdXQgPCB4X291dF9tYXg7ICsreF9vdXQpIHsKKyAgICAgIGNvbnN0IGludCB2ID0gKGludClNVUxUX0ZJWF9DKGlyb3dbeF9vdXRdLCBmeHlfc2NhbGUpOworICAgICAgYXNzZXJ0KHYgPj0gMCAmJiB2IDw9IDI1NSk7CisgICAgICBkc3RbeF9vdXRdID0gdjsKKyAgICAgIGlyb3dbeF9vdXRdID0gMDsKKyAgICB9CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZXh0ZXJuIHZvaWQgV2ViUFJlc2NhbGVyRHNwSW5pdE5FT04odm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBXZWJQUmVzY2FsZXJEc3BJbml0TkVPTih2b2lkKSB7CisgIFdlYlBSZXNjYWxlckV4cG9ydFJvd0V4cGFuZCA9IFJlc2NhbGVyRXhwb3J0Um93RXhwYW5kX05FT047CisgIFdlYlBSZXNjYWxlckV4cG9ydFJvd1NocmluayA9IFJlc2NhbGVyRXhwb3J0Um93U2hyaW5rX05FT047Cit9CisKKyNlbHNlICAgICAvLyAhV0VCUF9VU0VfTkVPTgorCitXRUJQX0RTUF9JTklUX1NUVUIoV2ViUFJlc2NhbGVyRHNwSW5pdE5FT04pCisKKyNlbmRpZiAgICAvLyBXRUJQX1VTRV9ORU9OCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3Jlc2NhbGVyX3NzZTIuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvcmVzY2FsZXJfc3NlMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YzUwZGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3Jlc2NhbGVyX3NzZTIuYwpAQCAtMCwwICsxLDM3MyBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFNTRTIgUmVzY2FsaW5nIGZ1bmN0aW9ucworLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0UyKSAmJiAhZGVmaW5lZChXRUJQX1JFRFVDRV9TSVpFKQorI2luY2x1ZGUgPGVtbWludHJpbi5oPgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSAic3JjL3V0aWxzL3Jlc2NhbGVyX3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL3V0aWxzLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbXBsZW1lbnRhdGlvbnMgb2YgY3JpdGljYWwgZnVuY3Rpb25zIEltcG9ydFJvdyAvIEV4cG9ydFJvdworCisjZGVmaW5lIFJPVU5ERVIgKFdFQlBfUkVTQ0FMRVJfT05FID4+IDEpCisjZGVmaW5lIE1VTFRfRklYKHgsIHkpICgoKHVpbnQ2NF90KSh4KSAqICh5KSArIFJPVU5ERVIpID4+IFdFQlBfUkVTQ0FMRVJfUkZJWCkKKworLy8gaW5wdXQ6IDggYnl0ZXMgQUJDREVGR0ggLT4gb3V0cHV0OiBBMEUwQjBGMEMwRzBEMEgwCitzdGF0aWMgdm9pZCBMb2FkVHdvUGl4ZWxzX1NTRTIoY29uc3QgdWludDhfdCogY29uc3Qgc3JjLCBfX20xMjhpKiBvdXQpIHsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgY29uc3QgX19tMTI4aSBBID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikoc3JjKSk7ICAvLyBBQkNERUZHSAorICBjb25zdCBfX20xMjhpIEIgPSBfbW1fdW5wYWNrbG9fZXBpOChBLCB6ZXJvKTsgICAgICAgICAgICAgIC8vIEEwQjBDMEQwRTBGMEcwSDAKKyAgY29uc3QgX19tMTI4aSBDID0gX21tX3NybGlfc2kxMjgoQiwgOCk7ICAgICAgICAgICAgICAgICAgICAvLyBFMEYwRzBIMAorICAqb3V0ID0gX21tX3VucGFja2xvX2VwaTE2KEIsIEMpOworfQorCisvLyBpbnB1dDogOCBieXRlcyBBQkNERUZHSCAtPiBvdXRwdXQ6IEEwQjBDMEQwRTBGMEcwSDAKK3N0YXRpYyB2b2lkIExvYWRFaWdodFBpeGVsc19TU0UyKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHNyYywgX19tMTI4aSogb3V0KSB7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGNvbnN0IF9fbTEyOGkgQSA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopKHNyYykpOyAgLy8gQUJDREVGR0gKKyAgKm91dCA9IF9tbV91bnBhY2tsb19lcGk4KEEsIHplcm8pOworfQorCitzdGF0aWMgdm9pZCBSZXNjYWxlckltcG9ydFJvd0V4cGFuZF9TU0UyKFdlYlBSZXNjYWxlciogY29uc3Qgd3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmMpIHsKKyAgcmVzY2FsZXJfdCogZnJvdyA9IHdyay0+ZnJvdzsKKyAgY29uc3QgcmVzY2FsZXJfdCogY29uc3QgZnJvd19lbmQgPSBmcm93ICsgd3JrLT5kc3Rfd2lkdGggKiB3cmstPm51bV9jaGFubmVsczsKKyAgY29uc3QgaW50IHhfYWRkID0gd3JrLT54X2FkZDsKKyAgaW50IGFjY3VtID0geF9hZGQ7CisgIF9fbTEyOGkgY3VyX3BpeGVsczsKKworICAvLyBTU0UyIGltcGxlbWVudGF0aW9uIG9ubHkgd29ya3Mgd2l0aCAxNmIgc2lnbmVkIGFyaXRobWV0aWMgYXQgbWF4LgorICBpZiAod3JrLT5zcmNfd2lkdGggPCA4IHx8IGFjY3VtID49ICgxIDw8IDE1KSkgeworICAgIFdlYlBSZXNjYWxlckltcG9ydFJvd0V4cGFuZF9DKHdyaywgc3JjKTsKKyAgICByZXR1cm47CisgIH0KKworICBhc3NlcnQoIVdlYlBSZXNjYWxlcklucHV0RG9uZSh3cmspKTsKKyAgYXNzZXJ0KHdyay0+eF9leHBhbmQpOworICBpZiAod3JrLT5udW1fY2hhbm5lbHMgPT0gNCkgeworICAgIExvYWRUd29QaXhlbHNfU1NFMihzcmMsICZjdXJfcGl4ZWxzKTsKKyAgICBzcmMgKz0gNDsKKyAgICB3aGlsZSAoMSkgeworICAgICAgY29uc3QgX19tMTI4aSBtdWx0ID0gX21tX3NldDFfZXBpMzIoKCh4X2FkZCAtIGFjY3VtKSA8PCAxNikgfCBhY2N1bSk7CisgICAgICBjb25zdCBfX20xMjhpIG91dCA9IF9tbV9tYWRkX2VwaTE2KGN1cl9waXhlbHMsIG11bHQpOworICAgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopZnJvdywgb3V0KTsKKyAgICAgIGZyb3cgKz0gNDsKKyAgICAgIGlmIChmcm93ID49IGZyb3dfZW5kKSBicmVhazsKKyAgICAgIGFjY3VtIC09IHdyay0+eF9zdWI7CisgICAgICBpZiAoYWNjdW0gPCAwKSB7CisgICAgICAgIExvYWRUd29QaXhlbHNfU1NFMihzcmMsICZjdXJfcGl4ZWxzKTsKKyAgICAgICAgc3JjICs9IDQ7CisgICAgICAgIGFjY3VtICs9IHhfYWRkOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpbnQgbGVmdDsKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCBzcmNfbGltaXQgPSBzcmMgKyB3cmstPnNyY193aWR0aCAtIDg7CisgICAgTG9hZEVpZ2h0UGl4ZWxzX1NTRTIoc3JjLCAmY3VyX3BpeGVscyk7CisgICAgc3JjICs9IDc7CisgICAgbGVmdCA9IDc7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgIGNvbnN0IF9fbTEyOGkgbXVsdCA9IF9tbV9jdnRzaTMyX3NpMTI4KCgoeF9hZGQgLSBhY2N1bSkgPDwgMTYpIHwgYWNjdW0pOworICAgICAgY29uc3QgX19tMTI4aSBvdXQgPSBfbW1fbWFkZF9lcGkxNihjdXJfcGl4ZWxzLCBtdWx0KTsKKyAgICAgIGFzc2VydChzaXplb2YoKmZyb3cpID09IHNpemVvZih1aW50MzJfdCkpOworICAgICAgV2ViUFVpbnQzMlRvTWVtKCh1aW50OF90Kilmcm93LCBfbW1fY3Z0c2kxMjhfc2kzMihvdXQpKTsKKyAgICAgIGZyb3cgKz0gMTsKKyAgICAgIGlmIChmcm93ID49IGZyb3dfZW5kKSBicmVhazsKKyAgICAgIGFjY3VtIC09IHdyay0+eF9zdWI7CisgICAgICBpZiAoYWNjdW0gPCAwKSB7CisgICAgICAgIGlmICgtLWxlZnQpIHsKKyAgICAgICAgICBjdXJfcGl4ZWxzID0gX21tX3NybGlfc2kxMjgoY3VyX3BpeGVscywgMik7CisgICAgICAgIH0gZWxzZSBpZiAoc3JjIDw9IHNyY19saW1pdCkgeworICAgICAgICAgIExvYWRFaWdodFBpeGVsc19TU0UyKHNyYywgJmN1cl9waXhlbHMpOworICAgICAgICAgIHNyYyArPSA3OworICAgICAgICAgIGxlZnQgPSA3OworICAgICAgICB9IGVsc2UgeyAgIC8vIHRhaWwKKyAgICAgICAgICBjdXJfcGl4ZWxzID0gX21tX3NybGlfc2kxMjgoY3VyX3BpeGVscywgMik7CisgICAgICAgICAgY3VyX3BpeGVscyA9IF9tbV9pbnNlcnRfZXBpMTYoY3VyX3BpeGVscywgc3JjWzFdLCAxKTsKKyAgICAgICAgICBzcmMgKz0gMTsKKyAgICAgICAgICBsZWZ0ID0gMTsKKyAgICAgICAgfQorICAgICAgICBhY2N1bSArPSB4X2FkZDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgYXNzZXJ0KGFjY3VtID09IDApOworfQorCitzdGF0aWMgdm9pZCBSZXNjYWxlckltcG9ydFJvd1Nocmlua19TU0UyKFdlYlBSZXNjYWxlciogY29uc3Qgd3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmMpIHsKKyAgY29uc3QgaW50IHhfc3ViID0gd3JrLT54X3N1YjsKKyAgaW50IGFjY3VtID0gMDsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgY29uc3QgX19tMTI4aSBtdWx0MCA9IF9tbV9zZXQxX2VwaTE2KHhfc3ViKTsKKyAgY29uc3QgX19tMTI4aSBtdWx0MSA9IF9tbV9zZXQxX2VwaTMyKHdyay0+Znhfc2NhbGUpOworICBjb25zdCBfX20xMjhpIHJvdW5kZXIgPSBfbW1fc2V0X2VwaTMyKDAsIFJPVU5ERVIsIDAsIFJPVU5ERVIpOworICBfX20xMjhpIHN1bSA9IHplcm87CisgIHJlc2NhbGVyX3QqIGZyb3cgPSB3cmstPmZyb3c7CisgIGNvbnN0IHJlc2NhbGVyX3QqIGNvbnN0IGZyb3dfZW5kID0gd3JrLT5mcm93ICsgNCAqIHdyay0+ZHN0X3dpZHRoOworCisgIGlmICh3cmstPm51bV9jaGFubmVscyAhPSA0IHx8IHdyay0+eF9hZGQgPiAoeF9zdWIgPDwgNykpIHsKKyAgICBXZWJQUmVzY2FsZXJJbXBvcnRSb3dTaHJpbmtfQyh3cmssIHNyYyk7CisgICAgcmV0dXJuOworICB9CisgIGFzc2VydCghV2ViUFJlc2NhbGVySW5wdXREb25lKHdyaykpOworICBhc3NlcnQoIXdyay0+eF9leHBhbmQpOworCisgIGZvciAoOyBmcm93IDwgZnJvd19lbmQ7IGZyb3cgKz0gNCkgeworICAgIF9fbTEyOGkgYmFzZSA9IHplcm87CisgICAgYWNjdW0gKz0gd3JrLT54X2FkZDsKKyAgICB3aGlsZSAoYWNjdW0gPiAwKSB7CisgICAgICBjb25zdCBfX20xMjhpIEEgPSBfbW1fY3Z0c2kzMl9zaTEyOChXZWJQTWVtVG9VaW50MzIoc3JjKSk7CisgICAgICBzcmMgKz0gNDsKKyAgICAgIGJhc2UgPSBfbW1fdW5wYWNrbG9fZXBpOChBLCB6ZXJvKTsKKyAgICAgIC8vIFRvIGF2b2lkIG92ZXJmbG93LCB3ZSBuZWVkOiBiYXNlICogeF9hZGQgLyB4X3N1YiA8IDMyNzY4CisgICAgICAvLyA9PiB4X2FkZCA8IHhfc3ViIDw8IDcuIFRoYXQncyBhIDEvMTI4IHJlZHVjdGlvbiByYXRpbyBsaW1pdC4KKyAgICAgIHN1bSA9IF9tbV9hZGRfZXBpMTYoc3VtLCBiYXNlKTsKKyAgICAgIGFjY3VtIC09IHhfc3ViOworICAgIH0KKyAgICB7ICAgIC8vIEVtaXQgbmV4dCBob3Jpem9udGFsIHBpeGVsLgorICAgICAgY29uc3QgX19tMTI4aSBtdWx0ID0gX21tX3NldDFfZXBpMTYoLWFjY3VtKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgZnJhYzAgPSBfbW1fbXVsbG9fZXBpMTYoYmFzZSwgbXVsdCk7ICAvLyAxNmIgeCAxNmIgLT4gMzJiCisgICAgICBjb25zdCBfX20xMjhpIGZyYWMxID0gX21tX211bGhpX2VwdTE2KGJhc2UsIG11bHQpOworICAgICAgY29uc3QgX19tMTI4aSBmcmFjID0gX21tX3VucGFja2xvX2VwaTE2KGZyYWMwLCBmcmFjMSk7ICAvLyBmcmFjIGlzIDMyYgorICAgICAgY29uc3QgX19tMTI4aSBBMCA9IF9tbV9tdWxsb19lcGkxNihzdW0sIG11bHQwKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgQTEgPSBfbW1fbXVsaGlfZXB1MTYoc3VtLCBtdWx0MCk7CisgICAgICBjb25zdCBfX20xMjhpIEIwID0gX21tX3VucGFja2xvX2VwaTE2KEEwLCBBMSk7ICAgICAgLy8gc3VtICogeF9zdWIKKyAgICAgIGNvbnN0IF9fbTEyOGkgZnJvd19vdXQgPSBfbW1fc3ViX2VwaTMyKEIwLCBmcmFjKTsgICAvLyBzdW0gKiB4X3N1YiAtIGZyYWMKKyAgICAgIGNvbnN0IF9fbTEyOGkgRDAgPSBfbW1fc3JsaV9lcGk2NChmcmFjLCAzMik7CisgICAgICBjb25zdCBfX20xMjhpIEQxID0gX21tX211bF9lcHUzMihmcmFjLCBtdWx0MSk7ICAgICAgLy8gMzJiIHggMTZiIC0+IDY0YgorICAgICAgY29uc3QgX19tMTI4aSBEMiA9IF9tbV9tdWxfZXB1MzIoRDAsIG11bHQxKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgRTEgPSBfbW1fYWRkX2VwaTY0KEQxLCByb3VuZGVyKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgRTIgPSBfbW1fYWRkX2VwaTY0KEQyLCByb3VuZGVyKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgRjEgPSBfbW1fc2h1ZmZsZV9lcGkzMihFMSwgMSB8ICgzIDw8IDIpKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgRjIgPSBfbW1fc2h1ZmZsZV9lcGkzMihFMiwgMSB8ICgzIDw8IDIpKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgRyA9IF9tbV91bnBhY2tsb19lcGkzMihGMSwgRjIpOworICAgICAgc3VtID0gX21tX3BhY2tzX2VwaTMyKEcsIHplcm8pOworICAgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopZnJvdywgZnJvd19vdXQpOworICAgIH0KKyAgfQorICBhc3NlcnQoYWNjdW0gPT0gMCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSb3cgZXhwb3J0CisKKy8vIGxvYWQgKnNyYyBhcyBlcGk2NCwgbXVsdGlwbHkgYnkgbXVsdCBhbmQgc3RvcmUgcmVzdWx0IGluIFtvdXQwIC4uLiBvdXQzXQorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgTG9hZERpc3BhdGNoQW5kTXVsdF9TU0UyKGNvbnN0IHJlc2NhbGVyX3QqIGNvbnN0IHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBtdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IG91dDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3Qgb3V0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBvdXQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IG91dDMpIHsKKyAgY29uc3QgX19tMTI4aSBBMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKHNyYyArIDApKTsKKyAgY29uc3QgX19tMTI4aSBBMSA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKHNyYyArIDQpKTsKKyAgY29uc3QgX19tMTI4aSBBMiA9IF9tbV9zcmxpX2VwaTY0KEEwLCAzMik7CisgIGNvbnN0IF9fbTEyOGkgQTMgPSBfbW1fc3JsaV9lcGk2NChBMSwgMzIpOworICBpZiAobXVsdCAhPSBOVUxMKSB7CisgICAgKm91dDAgPSBfbW1fbXVsX2VwdTMyKEEwLCAqbXVsdCk7CisgICAgKm91dDEgPSBfbW1fbXVsX2VwdTMyKEExLCAqbXVsdCk7CisgICAgKm91dDIgPSBfbW1fbXVsX2VwdTMyKEEyLCAqbXVsdCk7CisgICAgKm91dDMgPSBfbW1fbXVsX2VwdTMyKEEzLCAqbXVsdCk7CisgIH0gZWxzZSB7CisgICAgKm91dDAgPSBBMDsKKyAgICAqb3V0MSA9IEExOworICAgICpvdXQyID0gQTI7CisgICAgKm91dDMgPSBBMzsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBQcm9jZXNzUm93X1NTRTIoY29uc3QgX19tMTI4aSogY29uc3QgQTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgQTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgQTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgQTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgbXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBkc3QpIHsKKyAgY29uc3QgX19tMTI4aSByb3VuZGVyID0gX21tX3NldF9lcGkzMigwLCBST1VOREVSLCAwLCBST1VOREVSKTsKKyAgY29uc3QgX19tMTI4aSBtYXNrID0gX21tX3NldF9lcGkzMigweGZmZmZmZmZmdSwgMCwgMHhmZmZmZmZmZnUsIDApOworICBjb25zdCBfX20xMjhpIEIwID0gX21tX211bF9lcHUzMigqQTAsICptdWx0KTsKKyAgY29uc3QgX19tMTI4aSBCMSA9IF9tbV9tdWxfZXB1MzIoKkExLCAqbXVsdCk7CisgIGNvbnN0IF9fbTEyOGkgQjIgPSBfbW1fbXVsX2VwdTMyKCpBMiwgKm11bHQpOworICBjb25zdCBfX20xMjhpIEIzID0gX21tX211bF9lcHUzMigqQTMsICptdWx0KTsKKyAgY29uc3QgX19tMTI4aSBDMCA9IF9tbV9hZGRfZXBpNjQoQjAsIHJvdW5kZXIpOworICBjb25zdCBfX20xMjhpIEMxID0gX21tX2FkZF9lcGk2NChCMSwgcm91bmRlcik7CisgIGNvbnN0IF9fbTEyOGkgQzIgPSBfbW1fYWRkX2VwaTY0KEIyLCByb3VuZGVyKTsKKyAgY29uc3QgX19tMTI4aSBDMyA9IF9tbV9hZGRfZXBpNjQoQjMsIHJvdW5kZXIpOworICBjb25zdCBfX20xMjhpIEQwID0gX21tX3NybGlfZXBpNjQoQzAsIFdFQlBfUkVTQ0FMRVJfUkZJWCk7CisgIGNvbnN0IF9fbTEyOGkgRDEgPSBfbW1fc3JsaV9lcGk2NChDMSwgV0VCUF9SRVNDQUxFUl9SRklYKTsKKyNpZiAoV0VCUF9SRVNDQUxFUl9SRklYIDwgMzIpCisgIGNvbnN0IF9fbTEyOGkgRDIgPQorICAgICAgX21tX2FuZF9zaTEyOChfbW1fc2xsaV9lcGk2NChDMiwgMzIgLSBXRUJQX1JFU0NBTEVSX1JGSVgpLCBtYXNrKTsKKyAgY29uc3QgX19tMTI4aSBEMyA9CisgICAgICBfbW1fYW5kX3NpMTI4KF9tbV9zbGxpX2VwaTY0KEMzLCAzMiAtIFdFQlBfUkVTQ0FMRVJfUkZJWCksIG1hc2spOworI2Vsc2UKKyAgY29uc3QgX19tMTI4aSBEMiA9IF9tbV9hbmRfc2kxMjgoQzIsIG1hc2spOworICBjb25zdCBfX20xMjhpIEQzID0gX21tX2FuZF9zaTEyOChDMywgbWFzayk7CisjZW5kaWYKKyAgY29uc3QgX19tMTI4aSBFMCA9IF9tbV9vcl9zaTEyOChEMCwgRDIpOworICBjb25zdCBfX20xMjhpIEUxID0gX21tX29yX3NpMTI4KEQxLCBEMyk7CisgIGNvbnN0IF9fbTEyOGkgRiA9IF9tbV9wYWNrc19lcGkzMihFMCwgRTEpOworICBjb25zdCBfX20xMjhpIEcgPSBfbW1fcGFja3VzX2VwaTE2KEYsIEYpOworICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKilkc3QsIEcpOworfQorCitzdGF0aWMgdm9pZCBSZXNjYWxlckV4cG9ydFJvd0V4cGFuZF9TU0UyKFdlYlBSZXNjYWxlciogY29uc3Qgd3JrKSB7CisgIGludCB4X291dDsKKyAgdWludDhfdCogY29uc3QgZHN0ID0gd3JrLT5kc3Q7CisgIHJlc2NhbGVyX3QqIGNvbnN0IGlyb3cgPSB3cmstPmlyb3c7CisgIGNvbnN0IGludCB4X291dF9tYXggPSB3cmstPmRzdF93aWR0aCAqIHdyay0+bnVtX2NoYW5uZWxzOworICBjb25zdCByZXNjYWxlcl90KiBjb25zdCBmcm93ID0gd3JrLT5mcm93OworICBjb25zdCBfX20xMjhpIG11bHQgPSBfbW1fc2V0X2VwaTMyKDAsIHdyay0+Znlfc2NhbGUsIDAsIHdyay0+Znlfc2NhbGUpOworCisgIGFzc2VydCghV2ViUFJlc2NhbGVyT3V0cHV0RG9uZSh3cmspKTsKKyAgYXNzZXJ0KHdyay0+eV9hY2N1bSA8PSAwICYmIHdyay0+eV9zdWIgKyB3cmstPnlfYWNjdW0gPj0gMCk7CisgIGFzc2VydCh3cmstPnlfZXhwYW5kKTsKKyAgaWYgKHdyay0+eV9hY2N1bSA9PSAwKSB7CisgICAgZm9yICh4X291dCA9IDA7IHhfb3V0ICsgOCA8PSB4X291dF9tYXg7IHhfb3V0ICs9IDgpIHsKKyAgICAgIF9fbTEyOGkgQTAsIEExLCBBMiwgQTM7CisgICAgICBMb2FkRGlzcGF0Y2hBbmRNdWx0X1NTRTIoZnJvdyArIHhfb3V0LCBOVUxMLCAmQTAsICZBMSwgJkEyLCAmQTMpOworICAgICAgUHJvY2Vzc1Jvd19TU0UyKCZBMCwgJkExLCAmQTIsICZBMywgJm11bHQsIGRzdCArIHhfb3V0KTsKKyAgICB9CisgICAgZm9yICg7IHhfb3V0IDwgeF9vdXRfbWF4OyArK3hfb3V0KSB7CisgICAgICBjb25zdCB1aW50MzJfdCBKID0gZnJvd1t4X291dF07CisgICAgICBjb25zdCBpbnQgdiA9IChpbnQpTVVMVF9GSVgoSiwgd3JrLT5meV9zY2FsZSk7CisgICAgICBhc3NlcnQodiA+PSAwICYmIHYgPD0gMjU1KTsKKyAgICAgIGRzdFt4X291dF0gPSB2OworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBjb25zdCB1aW50MzJfdCBCID0gV0VCUF9SRVNDQUxFUl9GUkFDKC13cmstPnlfYWNjdW0sIHdyay0+eV9zdWIpOworICAgIGNvbnN0IHVpbnQzMl90IEEgPSAodWludDMyX3QpKFdFQlBfUkVTQ0FMRVJfT05FIC0gQik7CisgICAgY29uc3QgX19tMTI4aSBtQSA9IF9tbV9zZXRfZXBpMzIoMCwgQSwgMCwgQSk7CisgICAgY29uc3QgX19tMTI4aSBtQiA9IF9tbV9zZXRfZXBpMzIoMCwgQiwgMCwgQik7CisgICAgY29uc3QgX19tMTI4aSByb3VuZGVyID0gX21tX3NldF9lcGkzMigwLCBST1VOREVSLCAwLCBST1VOREVSKTsKKyAgICBmb3IgKHhfb3V0ID0gMDsgeF9vdXQgKyA4IDw9IHhfb3V0X21heDsgeF9vdXQgKz0gOCkgeworICAgICAgX19tMTI4aSBBMCwgQTEsIEEyLCBBMywgQjAsIEIxLCBCMiwgQjM7CisgICAgICBMb2FkRGlzcGF0Y2hBbmRNdWx0X1NTRTIoZnJvdyArIHhfb3V0LCAmbUEsICZBMCwgJkExLCAmQTIsICZBMyk7CisgICAgICBMb2FkRGlzcGF0Y2hBbmRNdWx0X1NTRTIoaXJvdyArIHhfb3V0LCAmbUIsICZCMCwgJkIxLCAmQjIsICZCMyk7CisgICAgICB7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgQzAgPSBfbW1fYWRkX2VwaTY0KEEwLCBCMCk7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgQzEgPSBfbW1fYWRkX2VwaTY0KEExLCBCMSk7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgQzIgPSBfbW1fYWRkX2VwaTY0KEEyLCBCMik7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgQzMgPSBfbW1fYWRkX2VwaTY0KEEzLCBCMyk7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgRDAgPSBfbW1fYWRkX2VwaTY0KEMwLCByb3VuZGVyKTsKKyAgICAgICAgY29uc3QgX19tMTI4aSBEMSA9IF9tbV9hZGRfZXBpNjQoQzEsIHJvdW5kZXIpOworICAgICAgICBjb25zdCBfX20xMjhpIEQyID0gX21tX2FkZF9lcGk2NChDMiwgcm91bmRlcik7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgRDMgPSBfbW1fYWRkX2VwaTY0KEMzLCByb3VuZGVyKTsKKyAgICAgICAgY29uc3QgX19tMTI4aSBFMCA9IF9tbV9zcmxpX2VwaTY0KEQwLCBXRUJQX1JFU0NBTEVSX1JGSVgpOworICAgICAgICBjb25zdCBfX20xMjhpIEUxID0gX21tX3NybGlfZXBpNjQoRDEsIFdFQlBfUkVTQ0FMRVJfUkZJWCk7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgRTIgPSBfbW1fc3JsaV9lcGk2NChEMiwgV0VCUF9SRVNDQUxFUl9SRklYKTsKKyAgICAgICAgY29uc3QgX19tMTI4aSBFMyA9IF9tbV9zcmxpX2VwaTY0KEQzLCBXRUJQX1JFU0NBTEVSX1JGSVgpOworICAgICAgICBQcm9jZXNzUm93X1NTRTIoJkUwLCAmRTEsICZFMiwgJkUzLCAmbXVsdCwgZHN0ICsgeF9vdXQpOworICAgICAgfQorICAgIH0KKyAgICBmb3IgKDsgeF9vdXQgPCB4X291dF9tYXg7ICsreF9vdXQpIHsKKyAgICAgIGNvbnN0IHVpbnQ2NF90IEkgPSAodWludDY0X3QpQSAqIGZyb3dbeF9vdXRdCisgICAgICAgICAgICAgICAgICAgICAgICsgKHVpbnQ2NF90KUIgKiBpcm93W3hfb3V0XTsKKyAgICAgIGNvbnN0IHVpbnQzMl90IEogPSAodWludDMyX3QpKChJICsgUk9VTkRFUikgPj4gV0VCUF9SRVNDQUxFUl9SRklYKTsKKyAgICAgIGNvbnN0IGludCB2ID0gKGludClNVUxUX0ZJWChKLCB3cmstPmZ5X3NjYWxlKTsKKyAgICAgIGFzc2VydCh2ID49IDAgJiYgdiA8PSAyNTUpOworICAgICAgZHN0W3hfb3V0XSA9IHY7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIFJlc2NhbGVyRXhwb3J0Um93U2hyaW5rX1NTRTIoV2ViUFJlc2NhbGVyKiBjb25zdCB3cmspIHsKKyAgaW50IHhfb3V0OworICB1aW50OF90KiBjb25zdCBkc3QgPSB3cmstPmRzdDsKKyAgcmVzY2FsZXJfdCogY29uc3QgaXJvdyA9IHdyay0+aXJvdzsKKyAgY29uc3QgaW50IHhfb3V0X21heCA9IHdyay0+ZHN0X3dpZHRoICogd3JrLT5udW1fY2hhbm5lbHM7CisgIGNvbnN0IHJlc2NhbGVyX3QqIGNvbnN0IGZyb3cgPSB3cmstPmZyb3c7CisgIGNvbnN0IHVpbnQzMl90IHlzY2FsZSA9IHdyay0+Znlfc2NhbGUgKiAoLXdyay0+eV9hY2N1bSk7CisgIGFzc2VydCghV2ViUFJlc2NhbGVyT3V0cHV0RG9uZSh3cmspKTsKKyAgYXNzZXJ0KHdyay0+eV9hY2N1bSA8PSAwKTsKKyAgYXNzZXJ0KCF3cmstPnlfZXhwYW5kKTsKKyAgaWYgKHlzY2FsZSkgeworICAgIGNvbnN0IGludCBzY2FsZV94eSA9IHdyay0+Znh5X3NjYWxlOworICAgIGNvbnN0IF9fbTEyOGkgbXVsdF94eSA9IF9tbV9zZXRfZXBpMzIoMCwgc2NhbGVfeHksIDAsIHNjYWxlX3h5KTsKKyAgICBjb25zdCBfX20xMjhpIG11bHRfeSA9IF9tbV9zZXRfZXBpMzIoMCwgeXNjYWxlLCAwLCB5c2NhbGUpOworICAgIGNvbnN0IF9fbTEyOGkgcm91bmRlciA9IF9tbV9zZXRfZXBpMzIoMCwgUk9VTkRFUiwgMCwgUk9VTkRFUik7CisgICAgZm9yICh4X291dCA9IDA7IHhfb3V0ICsgOCA8PSB4X291dF9tYXg7IHhfb3V0ICs9IDgpIHsKKyAgICAgIF9fbTEyOGkgQTAsIEExLCBBMiwgQTMsIEIwLCBCMSwgQjIsIEIzOworICAgICAgTG9hZERpc3BhdGNoQW5kTXVsdF9TU0UyKGlyb3cgKyB4X291dCwgTlVMTCwgJkEwLCAmQTEsICZBMiwgJkEzKTsKKyAgICAgIExvYWREaXNwYXRjaEFuZE11bHRfU1NFMihmcm93ICsgeF9vdXQsICZtdWx0X3ksICZCMCwgJkIxLCAmQjIsICZCMyk7CisgICAgICB7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgQzAgPSBfbW1fYWRkX2VwaTY0KEIwLCByb3VuZGVyKTsKKyAgICAgICAgY29uc3QgX19tMTI4aSBDMSA9IF9tbV9hZGRfZXBpNjQoQjEsIHJvdW5kZXIpOworICAgICAgICBjb25zdCBfX20xMjhpIEMyID0gX21tX2FkZF9lcGk2NChCMiwgcm91bmRlcik7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgQzMgPSBfbW1fYWRkX2VwaTY0KEIzLCByb3VuZGVyKTsKKyAgICAgICAgY29uc3QgX19tMTI4aSBEMCA9IF9tbV9zcmxpX2VwaTY0KEMwLCBXRUJQX1JFU0NBTEVSX1JGSVgpOyAgIC8vID0gZnJhYworICAgICAgICBjb25zdCBfX20xMjhpIEQxID0gX21tX3NybGlfZXBpNjQoQzEsIFdFQlBfUkVTQ0FMRVJfUkZJWCk7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgRDIgPSBfbW1fc3JsaV9lcGk2NChDMiwgV0VCUF9SRVNDQUxFUl9SRklYKTsKKyAgICAgICAgY29uc3QgX19tMTI4aSBEMyA9IF9tbV9zcmxpX2VwaTY0KEMzLCBXRUJQX1JFU0NBTEVSX1JGSVgpOworICAgICAgICBjb25zdCBfX20xMjhpIEUwID0gX21tX3N1Yl9lcGk2NChBMCwgRDApOyAgIC8vIGlyb3dbeF0gLSBmcmFjCisgICAgICAgIGNvbnN0IF9fbTEyOGkgRTEgPSBfbW1fc3ViX2VwaTY0KEExLCBEMSk7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgRTIgPSBfbW1fc3ViX2VwaTY0KEEyLCBEMik7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgRTMgPSBfbW1fc3ViX2VwaTY0KEEzLCBEMyk7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgRjIgPSBfbW1fc2xsaV9lcGk2NChEMiwgMzIpOworICAgICAgICBjb25zdCBfX20xMjhpIEYzID0gX21tX3NsbGlfZXBpNjQoRDMsIDMyKTsKKyAgICAgICAgY29uc3QgX19tMTI4aSBHMCA9IF9tbV9vcl9zaTEyOChEMCwgRjIpOworICAgICAgICBjb25zdCBfX20xMjhpIEcxID0gX21tX29yX3NpMTI4KEQxLCBGMyk7CisgICAgICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKShpcm93ICsgeF9vdXQgKyAwKSwgRzApOworICAgICAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikoaXJvdyArIHhfb3V0ICsgNCksIEcxKTsKKyAgICAgICAgUHJvY2Vzc1Jvd19TU0UyKCZFMCwgJkUxLCAmRTIsICZFMywgJm11bHRfeHksIGRzdCArIHhfb3V0KTsKKyAgICAgIH0KKyAgICB9CisgICAgZm9yICg7IHhfb3V0IDwgeF9vdXRfbWF4OyArK3hfb3V0KSB7CisgICAgICBjb25zdCB1aW50MzJfdCBmcmFjID0gKGludClNVUxUX0ZJWChmcm93W3hfb3V0XSwgeXNjYWxlKTsKKyAgICAgIGNvbnN0IGludCB2ID0gKGludClNVUxUX0ZJWChpcm93W3hfb3V0XSAtIGZyYWMsIHdyay0+Znh5X3NjYWxlKTsKKyAgICAgIGFzc2VydCh2ID49IDAgJiYgdiA8PSAyNTUpOworICAgICAgZHN0W3hfb3V0XSA9IHY7CisgICAgICBpcm93W3hfb3V0XSA9IGZyYWM7ICAgLy8gbmV3IGZyYWN0aW9uYWwgc3RhcnQKKyAgICB9CisgIH0gZWxzZSB7CisgICAgY29uc3QgdWludDMyX3Qgc2NhbGUgPSB3cmstPmZ4eV9zY2FsZTsKKyAgICBjb25zdCBfX20xMjhpIG11bHQgPSBfbW1fc2V0X2VwaTMyKDAsIHNjYWxlLCAwLCBzY2FsZSk7CisgICAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgICBmb3IgKHhfb3V0ID0gMDsgeF9vdXQgKyA4IDw9IHhfb3V0X21heDsgeF9vdXQgKz0gOCkgeworICAgICAgX19tMTI4aSBBMCwgQTEsIEEyLCBBMzsKKyAgICAgIExvYWREaXNwYXRjaEFuZE11bHRfU1NFMihpcm93ICsgeF9vdXQsIE5VTEwsICZBMCwgJkExLCAmQTIsICZBMyk7CisgICAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikoaXJvdyArIHhfb3V0ICsgMCksIHplcm8pOworICAgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopKGlyb3cgKyB4X291dCArIDQpLCB6ZXJvKTsKKyAgICAgIFByb2Nlc3NSb3dfU1NFMigmQTAsICZBMSwgJkEyLCAmQTMsICZtdWx0LCBkc3QgKyB4X291dCk7CisgICAgfQorICAgIGZvciAoOyB4X291dCA8IHhfb3V0X21heDsgKyt4X291dCkgeworICAgICAgY29uc3QgaW50IHYgPSAoaW50KU1VTFRfRklYKGlyb3dbeF9vdXRdLCBzY2FsZSk7CisgICAgICBhc3NlcnQodiA+PSAwICYmIHYgPD0gMjU1KTsKKyAgICAgIGRzdFt4X291dF0gPSB2OworICAgICAgaXJvd1t4X291dF0gPSAwOworICAgIH0KKyAgfQorfQorCisjdW5kZWYgTVVMVF9GSVgKKyN1bmRlZiBST1VOREVSCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2V4dGVybiB2b2lkIFdlYlBSZXNjYWxlckRzcEluaXRTU0UyKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgV2ViUFJlc2NhbGVyRHNwSW5pdFNTRTIodm9pZCkgeworICBXZWJQUmVzY2FsZXJJbXBvcnRSb3dFeHBhbmQgPSBSZXNjYWxlckltcG9ydFJvd0V4cGFuZF9TU0UyOworICBXZWJQUmVzY2FsZXJJbXBvcnRSb3dTaHJpbmsgPSBSZXNjYWxlckltcG9ydFJvd1Nocmlua19TU0UyOworICBXZWJQUmVzY2FsZXJFeHBvcnRSb3dFeHBhbmQgPSBSZXNjYWxlckV4cG9ydFJvd0V4cGFuZF9TU0UyOworICBXZWJQUmVzY2FsZXJFeHBvcnRSb3dTaHJpbmsgPSBSZXNjYWxlckV4cG9ydFJvd1Nocmlua19TU0UyOworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX1NTRTIKKworV0VCUF9EU1BfSU5JVF9TVFVCKFdlYlBSZXNjYWxlckRzcEluaXRTU0UyKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX1NTRTIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3Avc3NpbS5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9zc2ltLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg5Y2U4MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3Avc3NpbS5jCkBAIC0wLDAgKzEsMTU5IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gZGlzdG9ydGlvbiBjYWxjdWxhdGlvbgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4gIC8vIGZvciBhYnMoKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX1NJWkUpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTU0lNIC8gUFNOUgorCisvLyBoYXQtc2hhcGVkIGZpbHRlci4gU3VtIG9mIGNvZWZmaWNpZW50cyBpcyBlcXVhbCB0byAxNi4KK3N0YXRpYyBjb25zdCB1aW50MzJfdCBrV2VpZ2h0WzIgKiBWUDhfU1NJTV9LRVJORUwgKyAxXSA9IHsKKyAgMSwgMiwgMywgNCwgMywgMiwgMQorfTsKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBrV2VpZ2h0U3VtID0gMTYgKiAxNjsgICAvLyBzdW17a1dlaWdodH1eMgorCitzdGF0aWMgV0VCUF9JTkxJTkUgZG91YmxlIFNTSU1DYWxjdWxhdGlvbigKKyAgICBjb25zdCBWUDhEaXN0b1N0YXRzKiBjb25zdCBzdGF0cywgdWludDMyX3QgTiAgLypudW0gc2FtcGxlcyovKSB7CisgIGNvbnN0IHVpbnQzMl90IHcyID0gIE4gKiBOOworICBjb25zdCB1aW50MzJfdCBDMSA9IDIwICogdzI7CisgIGNvbnN0IHVpbnQzMl90IEMyID0gNjAgKiB3MjsKKyAgY29uc3QgdWludDMyX3QgQzMgPSA4ICogOCAqIHcyOyAgIC8vICdkYXJrJyBsaW1pdCB+PSA2CisgIGNvbnN0IHVpbnQ2NF90IHhteG0gPSAodWludDY0X3Qpc3RhdHMtPnhtICogc3RhdHMtPnhtOworICBjb25zdCB1aW50NjRfdCB5bXltID0gKHVpbnQ2NF90KXN0YXRzLT55bSAqIHN0YXRzLT55bTsKKyAgaWYgKHhteG0gKyB5bXltID49IEMzKSB7CisgICAgY29uc3QgaW50NjRfdCB4bXltID0gKGludDY0X3Qpc3RhdHMtPnhtICogc3RhdHMtPnltOworICAgIGNvbnN0IGludDY0X3Qgc3h5ID0gKGludDY0X3Qpc3RhdHMtPnh5bSAqIE4gLSB4bXltOyAgICAvLyBjYW4gYmUgbmVnYXRpdmUKKyAgICBjb25zdCB1aW50NjRfdCBzeHggPSAodWludDY0X3Qpc3RhdHMtPnh4bSAqIE4gLSB4bXhtOworICAgIGNvbnN0IHVpbnQ2NF90IHN5eSA9ICh1aW50NjRfdClzdGF0cy0+eXltICogTiAtIHlteW07CisgICAgLy8gd2UgZGVzY2FsZSBieSA4IHRvIHByZXZlbnQgb3ZlcmZsb3cgZHVyaW5nIHRoZSBmbnVtL2ZkZW4gbXVsdGlwbHkuCisgICAgY29uc3QgdWludDY0X3QgbnVtX1MgPSAoMiAqICh1aW50NjRfdCkoc3h5IDwgMCA/IDAgOiBzeHkpICsgQzIpID4+IDg7CisgICAgY29uc3QgdWludDY0X3QgZGVuX1MgPSAoc3h4ICsgc3l5ICsgQzIpID4+IDg7CisgICAgY29uc3QgdWludDY0X3QgZm51bSA9ICgyICogeG15bSArIEMxKSAqIG51bV9TOworICAgIGNvbnN0IHVpbnQ2NF90IGZkZW4gPSAoeG14bSArIHlteW0gKyBDMSkgKiBkZW5fUzsKKyAgICBjb25zdCBkb3VibGUgciA9IChkb3VibGUpZm51bSAvIGZkZW47CisgICAgYXNzZXJ0KHIgPj0gMC4gJiYgciA8PSAxLjApOworICAgIHJldHVybiByOworICB9CisgIHJldHVybiAxLjsgICAvLyBhcmVhIGlzIHRvbyBkYXJrIHRvIGNvbnRyaWJ1dGUgbWVhbmluZ2Z1bGx5Cit9CisKK2RvdWJsZSBWUDhTU0lNRnJvbVN0YXRzKGNvbnN0IFZQOERpc3RvU3RhdHMqIGNvbnN0IHN0YXRzKSB7CisgIHJldHVybiBTU0lNQ2FsY3VsYXRpb24oc3RhdHMsIGtXZWlnaHRTdW0pOworfQorCitkb3VibGUgVlA4U1NJTUZyb21TdGF0c0NsaXBwZWQoY29uc3QgVlA4RGlzdG9TdGF0cyogY29uc3Qgc3RhdHMpIHsKKyAgcmV0dXJuIFNTSU1DYWxjdWxhdGlvbihzdGF0cywgc3RhdHMtPncpOworfQorCitzdGF0aWMgZG91YmxlIFNTSU1HZXRDbGlwcGVkX0MoY29uc3QgdWludDhfdCogc3JjMSwgaW50IHN0cmlkZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjMiwgaW50IHN0cmlkZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhvLCBpbnQgeW8sIGludCBXLCBpbnQgSCkgeworICBWUDhEaXN0b1N0YXRzIHN0YXRzID0geyAwLCAwLCAwLCAwLCAwLCAwIH07CisgIGNvbnN0IGludCB5bWluID0gKHlvIC0gVlA4X1NTSU1fS0VSTkVMIDwgMCkgPyAwIDogeW8gLSBWUDhfU1NJTV9LRVJORUw7CisgIGNvbnN0IGludCB5bWF4ID0gKHlvICsgVlA4X1NTSU1fS0VSTkVMID4gSCAtIDEpID8gSCAtIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB5byArIFZQOF9TU0lNX0tFUk5FTDsKKyAgY29uc3QgaW50IHhtaW4gPSAoeG8gLSBWUDhfU1NJTV9LRVJORUwgPCAwKSA/IDAgOiB4byAtIFZQOF9TU0lNX0tFUk5FTDsKKyAgY29uc3QgaW50IHhtYXggPSAoeG8gKyBWUDhfU1NJTV9LRVJORUwgPiBXIC0gMSkgPyBXIC0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHhvICsgVlA4X1NTSU1fS0VSTkVMOworICBpbnQgeCwgeTsKKyAgc3JjMSArPSB5bWluICogc3RyaWRlMTsKKyAgc3JjMiArPSB5bWluICogc3RyaWRlMjsKKyAgZm9yICh5ID0geW1pbjsgeSA8PSB5bWF4OyArK3ksIHNyYzEgKz0gc3RyaWRlMSwgc3JjMiArPSBzdHJpZGUyKSB7CisgICAgZm9yICh4ID0geG1pbjsgeCA8PSB4bWF4OyArK3gpIHsKKyAgICAgIGNvbnN0IHVpbnQzMl90IHcgPSBrV2VpZ2h0W1ZQOF9TU0lNX0tFUk5FTCArIHggLSB4b10KKyAgICAgICAgICAgICAgICAgICAgICAgKiBrV2VpZ2h0W1ZQOF9TU0lNX0tFUk5FTCArIHkgLSB5b107CisgICAgICBjb25zdCB1aW50MzJfdCBzMSA9IHNyYzFbeF07CisgICAgICBjb25zdCB1aW50MzJfdCBzMiA9IHNyYzJbeF07CisgICAgICBzdGF0cy53ICAgKz0gdzsKKyAgICAgIHN0YXRzLnhtICArPSB3ICogczE7CisgICAgICBzdGF0cy55bSAgKz0gdyAqIHMyOworICAgICAgc3RhdHMueHhtICs9IHcgKiBzMSAqIHMxOworICAgICAgc3RhdHMueHltICs9IHcgKiBzMSAqIHMyOworICAgICAgc3RhdHMueXltICs9IHcgKiBzMiAqIHMyOworICAgIH0KKyAgfQorICByZXR1cm4gVlA4U1NJTUZyb21TdGF0c0NsaXBwZWQoJnN0YXRzKTsKK30KKworc3RhdGljIGRvdWJsZSBTU0lNR2V0X0MoY29uc3QgdWludDhfdCogc3JjMSwgaW50IHN0cmlkZTEsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmMyLCBpbnQgc3RyaWRlMikgeworICBWUDhEaXN0b1N0YXRzIHN0YXRzID0geyAwLCAwLCAwLCAwLCAwLCAwIH07CisgIGludCB4LCB5OworICBmb3IgKHkgPSAwOyB5IDw9IDIgKiBWUDhfU1NJTV9LRVJORUw7ICsreSwgc3JjMSArPSBzdHJpZGUxLCBzcmMyICs9IHN0cmlkZTIpIHsKKyAgICBmb3IgKHggPSAwOyB4IDw9IDIgKiBWUDhfU1NJTV9LRVJORUw7ICsreCkgeworICAgICAgY29uc3QgdWludDMyX3QgdyA9IGtXZWlnaHRbeF0gKiBrV2VpZ2h0W3ldOworICAgICAgY29uc3QgdWludDMyX3QgczEgPSBzcmMxW3hdOworICAgICAgY29uc3QgdWludDMyX3QgczIgPSBzcmMyW3hdOworICAgICAgc3RhdHMueG0gICs9IHcgKiBzMTsKKyAgICAgIHN0YXRzLnltICArPSB3ICogczI7CisgICAgICBzdGF0cy54eG0gKz0gdyAqIHMxICogczE7CisgICAgICBzdGF0cy54eW0gKz0gdyAqIHMxICogczI7CisgICAgICBzdGF0cy55eW0gKz0gdyAqIHMyICogczI7CisgICAgfQorICB9CisgIHJldHVybiBWUDhTU0lNRnJvbVN0YXRzKCZzdGF0cyk7Cit9CisKKyNlbmRpZiAgLy8gIWRlZmluZWQoV0VCUF9SRURVQ0VfU0laRSkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmICFkZWZpbmVkKFdFQlBfRElTQUJMRV9TVEFUUykKK3N0YXRpYyB1aW50MzJfdCBBY2N1bXVsYXRlU1NFX0MoY29uc3QgdWludDhfdCogc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjMiwgaW50IGxlbikgeworICBpbnQgaTsKKyAgdWludDMyX3Qgc3NlMiA9IDA7CisgIGFzc2VydChsZW4gPD0gNjU1MzUpOyAgLy8gdG8gZW5zdXJlIHRoYXQgYWNjdW11bGF0aW9uIGZpdHMgd2l0aGluIHVpbnQzMl90CisgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkgeworICAgIGNvbnN0IGludDMyX3QgZGlmZiA9IHNyYzFbaV0gLSBzcmMyW2ldOworICAgIHNzZTIgKz0gZGlmZiAqIGRpZmY7CisgIH0KKyAgcmV0dXJuIHNzZTI7Cit9CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX1NJWkUpCitWUDhTU0lNR2V0RnVuYyBWUDhTU0lNR2V0OworVlA4U1NJTUdldENsaXBwZWRGdW5jIFZQOFNTSU1HZXRDbGlwcGVkOworI2VuZGlmCisjaWYgIWRlZmluZWQoV0VCUF9ESVNBQkxFX1NUQVRTKQorVlA4QWNjdW11bGF0ZVNTRUZ1bmMgVlA4QWNjdW11bGF0ZVNTRTsKKyNlbmRpZgorCitleHRlcm4gdm9pZCBWUDhTU0lNRHNwSW5pdFNTRTIodm9pZCk7CisKK1dFQlBfRFNQX0lOSVRfRlVOQyhWUDhTU0lNRHNwSW5pdCkgeworI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX1NJWkUpCisgIFZQOFNTSU1HZXRDbGlwcGVkID0gU1NJTUdldENsaXBwZWRfQzsKKyAgVlA4U1NJTUdldCA9IFNTSU1HZXRfQzsKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoV0VCUF9ESVNBQkxFX1NUQVRTKQorICBWUDhBY2N1bXVsYXRlU1NFID0gQWNjdW11bGF0ZVNTRV9DOworI2VuZGlmCisKKyAgaWYgKFZQOEdldENQVUluZm8gIT0gTlVMTCkgeworI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFMikKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrU1NFMikpIHsKKyAgICAgIFZQOFNTSU1Ec3BJbml0U1NFMigpOworICAgIH0KKyNlbmRpZgorICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3NzaW1fc3NlMi5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9zc2ltX3NzZTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGNiMGViCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9zc2ltX3NzZTIuYwpAQCAtMCwwICsxLDE2NSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFNTRTIgdmVyc2lvbiBvZiBkaXN0b3J0aW9uIGNhbGN1bGF0aW9uCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTIpCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxlbW1pbnRyaW4uaD4KKworI2luY2x1ZGUgInNyYy9kc3AvY29tbW9uX3NzZTIuaCIKKworI2lmICFkZWZpbmVkKFdFQlBfRElTQUJMRV9TVEFUUykKKworLy8gSGVscGVyIGZ1bmN0aW9uCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBTdWJ0cmFjdEFuZFNxdWFyZV9TU0UyKGNvbnN0IF9fbTEyOGkgYSwgY29uc3QgX19tMTI4aSBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBzdW0pIHsKKyAgLy8gdGFrZSBhYnMoYS1iKSBpbiA4YgorICBjb25zdCBfX20xMjhpIGFfYiA9IF9tbV9zdWJzX2VwdTgoYSwgYik7CisgIGNvbnN0IF9fbTEyOGkgYl9hID0gX21tX3N1YnNfZXB1OChiLCBhKTsKKyAgY29uc3QgX19tMTI4aSBhYnNfYV9iID0gX21tX29yX3NpMTI4KGFfYiwgYl9hKTsKKyAgLy8gemVyby1leHRlbmQgdG8gMTZiCisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGNvbnN0IF9fbTEyOGkgQzAgPSBfbW1fdW5wYWNrbG9fZXBpOChhYnNfYV9iLCB6ZXJvKTsKKyAgY29uc3QgX19tMTI4aSBDMSA9IF9tbV91bnBhY2toaV9lcGk4KGFic19hX2IsIHplcm8pOworICAvLyBtdWx0aXBseSB3aXRoIHNlbGYKKyAgY29uc3QgX19tMTI4aSBzdW0xID0gX21tX21hZGRfZXBpMTYoQzAsIEMwKTsKKyAgY29uc3QgX19tMTI4aSBzdW0yID0gX21tX21hZGRfZXBpMTYoQzEsIEMxKTsKKyAgKnN1bSA9IF9tbV9hZGRfZXBpMzIoc3VtMSwgc3VtMik7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTU0lNIC8gUFNOUiBlbnRyeSBwb2ludAorCitzdGF0aWMgdWludDMyX3QgQWNjdW11bGF0ZVNTRV9TU0UyKGNvbnN0IHVpbnQ4X3QqIHNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyYzIsIGludCBsZW4pIHsKKyAgaW50IGkgPSAwOworICB1aW50MzJfdCBzc2UyID0gMDsKKyAgaWYgKGxlbiA+PSAxNikgeworICAgIGNvbnN0IGludCBsaW1pdCA9IGxlbiAtIDMyOworICAgIGludDMyX3QgdG1wWzRdOworICAgIF9fbTEyOGkgc3VtMTsKKyAgICBfX20xMjhpIHN1bSA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgICAgX19tMTI4aSBhMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnNyYzFbaV0pOworICAgIF9fbTEyOGkgYjAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZzcmMyW2ldKTsKKyAgICBpICs9IDE2OworICAgIHdoaWxlIChpIDw9IGxpbWl0KSB7CisgICAgICBjb25zdCBfX20xMjhpIGExID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmc3JjMVtpXSk7CisgICAgICBjb25zdCBfX20xMjhpIGIxID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmc3JjMltpXSk7CisgICAgICBfX20xMjhpIHN1bTI7CisgICAgICBpICs9IDE2OworICAgICAgU3VidHJhY3RBbmRTcXVhcmVfU1NFMihhMCwgYjAsICZzdW0xKTsKKyAgICAgIHN1bSA9IF9tbV9hZGRfZXBpMzIoc3VtLCBzdW0xKTsKKyAgICAgIGEwID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmc3JjMVtpXSk7CisgICAgICBiMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnNyYzJbaV0pOworICAgICAgaSArPSAxNjsKKyAgICAgIFN1YnRyYWN0QW5kU3F1YXJlX1NTRTIoYTEsIGIxLCAmc3VtMik7CisgICAgICBzdW0gPSBfbW1fYWRkX2VwaTMyKHN1bSwgc3VtMik7CisgICAgfQorICAgIFN1YnRyYWN0QW5kU3F1YXJlX1NTRTIoYTAsIGIwLCAmc3VtMSk7CisgICAgc3VtID0gX21tX2FkZF9lcGkzMihzdW0sIHN1bTEpOworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKXRtcCwgc3VtKTsKKyAgICBzc2UyICs9ICh0bXBbM10gKyB0bXBbMl0gKyB0bXBbMV0gKyB0bXBbMF0pOworICB9CisKKyAgZm9yICg7IGkgPCBsZW47ICsraSkgeworICAgIGNvbnN0IGludDMyX3QgZGlmZiA9IHNyYzFbaV0gLSBzcmMyW2ldOworICAgIHNzZTIgKz0gZGlmZiAqIGRpZmY7CisgIH0KKyAgcmV0dXJuIHNzZTI7Cit9CisjZW5kaWYgIC8vICFkZWZpbmVkKFdFQlBfRElTQUJMRV9TVEFUUykKKworI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX1NJWkUpCisKK3N0YXRpYyB1aW50MzJfdCBIb3Jpem9udGFsQWRkMTZiX1NTRTIoY29uc3QgX19tMTI4aSogY29uc3QgbSkgeworICB1aW50MTZfdCB0bXBbOF07CisgIGNvbnN0IF9fbTEyOGkgYSA9IF9tbV9zcmxpX3NpMTI4KCptLCA4KTsKKyAgY29uc3QgX19tMTI4aSBiID0gX21tX2FkZF9lcGkxNigqbSwgYSk7CisgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKXRtcCwgYik7CisgIHJldHVybiAodWludDMyX3QpdG1wWzNdICsgdG1wWzJdICsgdG1wWzFdICsgdG1wWzBdOworfQorCitzdGF0aWMgdWludDMyX3QgSG9yaXpvbnRhbEFkZDMyYl9TU0UyKGNvbnN0IF9fbTEyOGkqIGNvbnN0IG0pIHsKKyAgY29uc3QgX19tMTI4aSBhID0gX21tX3NybGlfc2kxMjgoKm0sIDgpOworICBjb25zdCBfX20xMjhpIGIgPSBfbW1fYWRkX2VwaTMyKCptLCBhKTsKKyAgY29uc3QgX19tMTI4aSBjID0gX21tX2FkZF9lcGkzMihiLCBfbW1fc3JsaV9zaTEyOChiLCA0KSk7CisgIHJldHVybiAodWludDMyX3QpX21tX2N2dHNpMTI4X3NpMzIoYyk7Cit9CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBrV2VpZ2h0W10gPSB7IDEsIDIsIDMsIDQsIDMsIDIsIDEsIDAgfTsKKworI2RlZmluZSBBQ0NVTVVMQVRFX1JPVyhXRUlHSFQpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAvKiBjb21wdXRlIHJvdyB3ZWlnaHQgKFd4ICogV3kpICovICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIFd5ID0gX21tX3NldDFfZXBpMTYoKFdFSUdIVCkpOyAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIFcgPSBfbW1fbXVsbG9fZXBpMTYoV3gsIFd5KTsgICAgICAgICAgICAgICAgXAorICAvKiBwcm9jZXNzIDggYnl0ZXMgYXQgYSB0aW1lICg3IGJ5dGVzLCBhY3R1YWxseSkgKi8gICAgICAgXAorICBjb25zdCBfX20xMjhpIGEwID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKilzcmMxKTsgXAorICBjb25zdCBfX20xMjhpIGIwID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKilzcmMyKTsgXAorICAvKiBjb252ZXJ0IHRvIDE2YiBhbmQgbXVsdGlwbHkgYnkgd2VpZ2h0ICovICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIGExID0gX21tX3VucGFja2xvX2VwaTgoYTAsIHplcm8pOyAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIGIxID0gX21tX3VucGFja2xvX2VwaTgoYjAsIHplcm8pOyAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIHdhMSA9IF9tbV9tdWxsb19lcGkxNihhMSwgVyk7ICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIHdiMSA9IF9tbV9tdWxsb19lcGkxNihiMSwgVyk7ICAgICAgICAgICAgICAgXAorICAvKiBhY2N1bXVsYXRlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB4bSAgPSBfbW1fYWRkX2VwaTE2KHhtLCB3YTEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB5bSAgPSBfbW1fYWRkX2VwaTE2KHltLCB3YjEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB4eG0gPSBfbW1fYWRkX2VwaTMyKHh4bSwgX21tX21hZGRfZXBpMTYoYTEsIHdhMSkpOyAgICAgICAgXAorICB4eW0gPSBfbW1fYWRkX2VwaTMyKHh5bSwgX21tX21hZGRfZXBpMTYoYTEsIHdiMSkpOyAgICAgICAgXAorICB5eW0gPSBfbW1fYWRkX2VwaTMyKHl5bSwgX21tX21hZGRfZXBpMTYoYjEsIHdiMSkpOyAgICAgICAgXAorICBzcmMxICs9IHN0cmlkZTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzcmMyICs9IHN0cmlkZTI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIGRvdWJsZSBTU0lNR2V0X1NTRTIoY29uc3QgdWludDhfdCogc3JjMSwgaW50IHN0cmlkZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmMyLCBpbnQgc3RyaWRlMikgeworICBWUDhEaXN0b1N0YXRzIHN0YXRzOworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBfX20xMjhpIHhtID0gemVybywgeW0gPSB6ZXJvOyAgICAgICAgICAgICAgICAvLyAxNmIgYWNjdW1zCisgIF9fbTEyOGkgeHhtID0gemVybywgeXltID0gemVybywgeHltID0gemVybzsgIC8vIDMyYiBhY2N1bQorICBjb25zdCBfX20xMjhpIFd4ID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKilrV2VpZ2h0KTsKKyAgYXNzZXJ0KDIgKiBWUDhfU1NJTV9LRVJORUwgKyAxID09IDcpOworICBBQ0NVTVVMQVRFX1JPVygxKTsKKyAgQUNDVU1VTEFURV9ST1coMik7CisgIEFDQ1VNVUxBVEVfUk9XKDMpOworICBBQ0NVTVVMQVRFX1JPVyg0KTsKKyAgQUNDVU1VTEFURV9ST1coMyk7CisgIEFDQ1VNVUxBVEVfUk9XKDIpOworICBBQ0NVTVVMQVRFX1JPVygxKTsKKyAgc3RhdHMueG0gID0gSG9yaXpvbnRhbEFkZDE2Yl9TU0UyKCZ4bSk7CisgIHN0YXRzLnltICA9IEhvcml6b250YWxBZGQxNmJfU1NFMigmeW0pOworICBzdGF0cy54eG0gPSBIb3Jpem9udGFsQWRkMzJiX1NTRTIoJnh4bSk7CisgIHN0YXRzLnh5bSA9IEhvcml6b250YWxBZGQzMmJfU1NFMigmeHltKTsKKyAgc3RhdHMueXltID0gSG9yaXpvbnRhbEFkZDMyYl9TU0UyKCZ5eW0pOworICByZXR1cm4gVlA4U1NJTUZyb21TdGF0cygmc3RhdHMpOworfQorCisjZW5kaWYgIC8vICFkZWZpbmVkKFdFQlBfUkVEVUNFX1NJWkUpCisKK2V4dGVybiB2b2lkIFZQOFNTSU1Ec3BJbml0U1NFMih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFZQOFNTSU1Ec3BJbml0U1NFMih2b2lkKSB7CisjaWYgIWRlZmluZWQoV0VCUF9ESVNBQkxFX1NUQVRTKQorICBWUDhBY2N1bXVsYXRlU1NFID0gQWNjdW11bGF0ZVNTRV9TU0UyOworI2VuZGlmCisjaWYgIWRlZmluZWQoV0VCUF9SRURVQ0VfU0laRSkKKyAgVlA4U1NJTUdldCA9IFNTSU1HZXRfU1NFMjsKKyNlbmRpZgorfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX1NTRTIKKworV0VCUF9EU1BfSU5JVF9TVFVCKFZQOFNTSU1Ec3BJbml0U1NFMikKKworI2VuZGlmICAvLyBXRUJQX1VTRV9TU0UyCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3Vwc2FtcGxpbmcuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvdXBzYW1wbGluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNjBkYTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3Vwc2FtcGxpbmcuYwpAQCAtMCwwICsxLDMyNyBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFlVViB0byBSR0IgdXBzYW1wbGluZyBmdW5jdGlvbnMuCisvLworLy8gQXV0aG9yOiBzb21uYXRoQGdvb2dsZS5jb20gKFNvbW5hdGggQmFuZXJqZWUpCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorI2luY2x1ZGUgInNyYy9kc3AveXV2LmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZhbmN5IHVwc2FtcGxlcgorCisjaWZkZWYgRkFOQ1lfVVBTQU1QTElORworCisvLyBGYW5jeSB1cHNhbXBsaW5nIGZ1bmN0aW9ucyB0byBjb252ZXJ0IFlVViB0byBSR0IKK1dlYlBVcHNhbXBsZUxpbmVQYWlyRnVuYyBXZWJQVXBzYW1wbGVyc1tNT0RFX0xBU1RdOworCisvLyBHaXZlbiBzYW1wbGVzIGxhaWQgb3V0IGluIGEgc3F1YXJlIGFzOgorLy8gIFthIGJdCisvLyAgW2MgZF0KKy8vIHdlIGludGVycG9sYXRlIHUvdiBhczoKKy8vICAoWzkqYSArIDMqYiArIDMqYyArICAgZCAgICAzKmEgKyA5KmIgKyAzKmMgKyAgIGRdICsgWzggOF0pIC8gMTYKKy8vICAoWzMqYSArICAgYiArIDkqYyArIDMqZCAgICAgIGEgKyAzKmIgKyAzKmMgKyA5KmRdICAgWzggOF0pIC8gMTYKKworLy8gV2UgcHJvY2VzcyB1IGFuZCB2IHRvZ2V0aGVyIHN0YXNoZWQgaW50byAzMmJpdCAoMTZiaXQgZWFjaCkuCisjZGVmaW5lIExPQURfVVYodSwgdikgKCh1KSB8ICgodikgPDwgMTYpKQorCisjZGVmaW5lIFVQU0FNUExFX0ZVTkMoRlVOQ19OQU1FLCBGVU5DLCBYU1RFUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgRlVOQ19OQU1FKGNvbnN0IHVpbnQ4X3QqIHRvcF95LCBjb25zdCB1aW50OF90KiBib3R0b21feSwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3BfdSwgY29uc3QgdWludDhfdCogdG9wX3YsICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY3VyX3UsIGNvbnN0IHVpbnQ4X3QqIGN1cl92LCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHRvcF9kc3QsIHVpbnQ4X3QqIGJvdHRvbV9kc3QsIGludCBsZW4pIHsgICAgICAgIFwKKyAgaW50IHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IGludCBsYXN0X3BpeGVsX3BhaXIgPSAobGVuIC0gMSkgPj4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1aW50MzJfdCB0bF91diA9IExPQURfVVYodG9wX3VbMF0sIHRvcF92WzBdKTsgICAvKiB0b3AtbGVmdCBzYW1wbGUgKi8gICAgICAgIFwKKyAgdWludDMyX3QgbF91diAgPSBMT0FEX1VWKGN1cl91WzBdLCBjdXJfdlswXSk7ICAgLyogbGVmdC1zYW1wbGUgKi8gICAgICAgICAgICBcCisgIGFzc2VydCh0b3BfeSAhPSBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB1aW50MzJfdCB1djAgPSAoMyAqIHRsX3V2ICsgbF91diArIDB4MDAwMjAwMDJ1KSA+PiAyOyAgICAgICAgICAgICAgICBcCisgICAgRlVOQyh0b3BfeVswXSwgdXYwICYgMHhmZiwgKHV2MCA+PiAxNiksIHRvcF9kc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGJvdHRvbV95ICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDMyX3QgdXYwID0gKDMgKiBsX3V2ICsgdGxfdXYgKyAweDAwMDIwMDAydSkgPj4gMjsgICAgICAgICAgICAgICAgXAorICAgIEZVTkMoYm90dG9tX3lbMF0sIHV2MCAmIDB4ZmYsICh1djAgPj4gMTYpLCBib3R0b21fZHN0KTsgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZvciAoeCA9IDE7IHggPD0gbGFzdF9waXhlbF9wYWlyOyArK3gpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVpbnQzMl90IHRfdXYgPSBMT0FEX1VWKHRvcF91W3hdLCB0b3Bfdlt4XSk7ICAvKiB0b3Agc2FtcGxlICovICAgICAgIFwKKyAgICBjb25zdCB1aW50MzJfdCB1diAgID0gTE9BRF9VVihjdXJfdVt4XSwgY3VyX3ZbeF0pOyAgLyogc2FtcGxlICovICAgICAgICAgICBcCisgICAgLyogcHJlY29tcHV0ZSBpbnZhcmlhbnQgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCBmaXJzdCBhbmQgc2Vjb25kIGRpYWdvbmFscyovXAorICAgIGNvbnN0IHVpbnQzMl90IGF2ZyA9IHRsX3V2ICsgdF91diArIGxfdXYgKyB1diArIDB4MDAwODAwMDh1OyAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB1aW50MzJfdCBkaWFnXzEyID0gKGF2ZyArIDIgKiAodF91diArIGxfdXYpKSA+PiAzOyAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDMyX3QgZGlhZ18wMyA9IChhdmcgKyAyICogKHRsX3V2ICsgdXYpKSA+PiAzOyAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IHVpbnQzMl90IHV2MCA9IChkaWFnXzEyICsgdGxfdXYpID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCB1aW50MzJfdCB1djEgPSAoZGlhZ18wMyArIHRfdXYpID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgRlVOQyh0b3BfeVsyICogeCAtIDFdLCB1djAgJiAweGZmLCAodXYwID4+IDE2KSwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgdG9wX2RzdCArICgyICogeCAtIDEpICogKFhTVEVQKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBGVU5DKHRvcF95WzIgKiB4IC0gMF0sIHV2MSAmIDB4ZmYsICh1djEgPj4gMTYpLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICB0b3BfZHN0ICsgKDIgKiB4IC0gMCkgKiAoWFNURVApKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGJvdHRvbV95ICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY29uc3QgdWludDMyX3QgdXYwID0gKGRpYWdfMDMgKyBsX3V2KSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IHVpbnQzMl90IHV2MSA9IChkaWFnXzEyICsgdXYpID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBGVU5DKGJvdHRvbV95WzIgKiB4IC0gMV0sIHV2MCAmIDB4ZmYsICh1djAgPj4gMTYpLCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBib3R0b21fZHN0ICsgKDIgKiB4IC0gMSkgKiAoWFNURVApKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEZVTkMoYm90dG9tX3lbMiAqIHggKyAwXSwgdXYxICYgMHhmZiwgKHV2MSA+PiAxNiksICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIGJvdHRvbV9kc3QgKyAoMiAqIHggKyAwKSAqIChYU1RFUCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0bF91diA9IHRfdXY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbF91diA9IHV2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKCEobGVuICYgMSkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY29uc3QgdWludDMyX3QgdXYwID0gKDMgKiB0bF91diArIGxfdXYgKyAweDAwMDIwMDAydSkgPj4gMjsgICAgICAgICAgICAgIFwKKyAgICAgIEZVTkModG9wX3lbbGVuIC0gMV0sIHV2MCAmIDB4ZmYsICh1djAgPj4gMTYpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIHRvcF9kc3QgKyAobGVuIC0gMSkgKiAoWFNURVApKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoYm90dG9tX3kgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCB1aW50MzJfdCB1djAgPSAoMyAqIGxfdXYgKyB0bF91diArIDB4MDAwMjAwMDJ1KSA+PiAyOyAgICAgICAgICAgICAgXAorICAgICAgRlVOQyhib3R0b21feVtsZW4gLSAxXSwgdXYwICYgMHhmZiwgKHV2MCA+PiAxNiksICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgYm90dG9tX2RzdCArIChsZW4gLSAxKSAqIChYU1RFUCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLy8gQWxsIHZhcmlhbnRzIGltcGxlbWVudGVkLgorI2lmICFXRUJQX05FT05fT01JVF9DX0NPREUKK1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVSZ2JhTGluZVBhaXJfQywgVlA4WXV2VG9SZ2JhLCA0KQorVVBTQU1QTEVfRlVOQyhVcHNhbXBsZUJncmFMaW5lUGFpcl9DLCBWUDhZdXZUb0JncmEsIDQpCisjaWYgIWRlZmluZWQoV0VCUF9SRURVQ0VfQ1NQKQorVVBTQU1QTEVfRlVOQyhVcHNhbXBsZUFyZ2JMaW5lUGFpcl9DLCBWUDhZdXZUb0FyZ2IsIDQpCitVUFNBTVBMRV9GVU5DKFVwc2FtcGxlUmdiTGluZVBhaXJfQywgIFZQOFl1dlRvUmdiLCAgMykKK1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVCZ3JMaW5lUGFpcl9DLCAgVlA4WXV2VG9CZ3IsICAzKQorVVBTQU1QTEVfRlVOQyhVcHNhbXBsZVJnYmE0NDQ0TGluZVBhaXJfQywgVlA4WXV2VG9SZ2JhNDQ0NCwgMikKK1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVSZ2I1NjVMaW5lUGFpcl9DLCAgVlA4WXV2VG9SZ2I1NjUsICAyKQorI2Vsc2UKK3N0YXRpYyB2b2lkIEVtcHR5VXBzYW1wbGVGdW5jKGNvbnN0IHVpbnQ4X3QqIHRvcF95LCBjb25zdCB1aW50OF90KiBib3R0b21feSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcF91LCBjb25zdCB1aW50OF90KiB0b3BfdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGN1cl91LCBjb25zdCB1aW50OF90KiBjdXJfdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHRvcF9kc3QsIHVpbnQ4X3QqIGJvdHRvbV9kc3QsIGludCBsZW4pIHsKKyAgKHZvaWQpdG9wX3k7CisgICh2b2lkKWJvdHRvbV95OworICAodm9pZCl0b3BfdTsKKyAgKHZvaWQpdG9wX3Y7CisgICh2b2lkKWN1cl91OworICAodm9pZCljdXJfdjsKKyAgKHZvaWQpdG9wX2RzdDsKKyAgKHZvaWQpYm90dG9tX2RzdDsKKyAgKHZvaWQpbGVuOworICBhc3NlcnQoMCk7ICAgLy8gQ09MT1JTUEFDRSBTVVBQT1JUIE5PVCBDT01QSUxFRAorfQorI2RlZmluZSBVcHNhbXBsZUFyZ2JMaW5lUGFpcl9DIEVtcHR5VXBzYW1wbGVGdW5jCisjZGVmaW5lIFVwc2FtcGxlUmdiTGluZVBhaXJfQyBFbXB0eVVwc2FtcGxlRnVuYworI2RlZmluZSBVcHNhbXBsZUJnckxpbmVQYWlyX0MgRW1wdHlVcHNhbXBsZUZ1bmMKKyNkZWZpbmUgVXBzYW1wbGVSZ2JhNDQ0NExpbmVQYWlyX0MgRW1wdHlVcHNhbXBsZUZ1bmMKKyNkZWZpbmUgVXBzYW1wbGVSZ2I1NjVMaW5lUGFpcl9DIEVtcHR5VXBzYW1wbGVGdW5jCisjZW5kaWYgICAvLyBXRUJQX1JFRFVDRV9DU1AKKworI2VuZGlmCisKKyN1bmRlZiBMT0FEX1VWCisjdW5kZWYgVVBTQU1QTEVfRlVOQworCisjZW5kaWYgIC8vIEZBTkNZX1VQU0FNUExJTkcKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmICFkZWZpbmVkKEZBTkNZX1VQU0FNUExJTkcpCisjZGVmaW5lIERVQUxfU0FNUExFX0ZVTkMoRlVOQ19OQU1FLCBGVU5DKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgRlVOQ19OQU1FKGNvbnN0IHVpbnQ4X3QqIHRvcF95LCBjb25zdCB1aW50OF90KiBib3RfeSwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3BfdSwgY29uc3QgdWludDhfdCogdG9wX3YsICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogYm90X3UsIGNvbnN0IHVpbnQ4X3QqIGJvdF92LCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHRvcF9kc3QsIHVpbnQ4X3QqIGJvdF9kc3QsIGludCBsZW4pIHsgICAgICAgICAgIFwKKyAgY29uc3QgaW50IGhhbGZfbGVuID0gbGVuID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludCB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBhc3NlcnQodG9wX2RzdCAhPSBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yICh4ID0gMDsgeCA8IGhhbGZfbGVuOyArK3gpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgRlVOQyh0b3BfeVsyICogeCArIDBdLCB0b3BfdVt4XSwgdG9wX3ZbeF0sIHRvcF9kc3QgKyA4ICogeCArIDApOyAgICAgICAgIFwKKyAgICAgIEZVTkModG9wX3lbMiAqIHggKyAxXSwgdG9wX3VbeF0sIHRvcF92W3hdLCB0b3BfZHN0ICsgOCAqIHggKyA0KTsgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChsZW4gJiAxKSBGVU5DKHRvcF95WzIgKiB4ICsgMF0sIHRvcF91W3hdLCB0b3Bfdlt4XSwgdG9wX2RzdCArIDggKiB4KTsgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChib3RfZHN0ICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoeCA9IDA7IHggPCBoYWxmX2xlbjsgKyt4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEZVTkMoYm90X3lbMiAqIHggKyAwXSwgYm90X3VbeF0sIGJvdF92W3hdLCBib3RfZHN0ICsgOCAqIHggKyAwKTsgICAgICAgICBcCisgICAgICBGVU5DKGJvdF95WzIgKiB4ICsgMV0sIGJvdF91W3hdLCBib3Rfdlt4XSwgYm90X2RzdCArIDggKiB4ICsgNCk7ICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAobGVuICYgMSkgRlVOQyhib3RfeVsyICogeCArIDBdLCBib3RfdVt4XSwgYm90X3ZbeF0sIGJvdF9kc3QgKyA4ICogeCk7ICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitEVUFMX1NBTVBMRV9GVU5DKER1YWxMaW5lU2FtcGxlckJHUkEsIFZQOFl1dlRvQmdyYSkKK0RVQUxfU0FNUExFX0ZVTkMoRHVhbExpbmVTYW1wbGVyQVJHQiwgVlA4WXV2VG9BcmdiKQorI3VuZGVmIERVQUxfU0FNUExFX0ZVTkMKKworI2VuZGlmICAvLyAhRkFOQ1lfVVBTQU1QTElORworCitXZWJQVXBzYW1wbGVMaW5lUGFpckZ1bmMgV2ViUEdldExpbmVQYWlyQ29udmVydGVyKGludCBhbHBoYV9pc19sYXN0KSB7CisgIFdlYlBJbml0VXBzYW1wbGVycygpOworI2lmZGVmIEZBTkNZX1VQU0FNUExJTkcKKyAgcmV0dXJuIFdlYlBVcHNhbXBsZXJzW2FscGhhX2lzX2xhc3QgPyBNT0RFX0JHUkEgOiBNT0RFX0FSR0JdOworI2Vsc2UKKyAgcmV0dXJuIChhbHBoYV9pc19sYXN0ID8gRHVhbExpbmVTYW1wbGVyQkdSQSA6IER1YWxMaW5lU2FtcGxlckFSR0IpOworI2VuZGlmCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBZVVY0NDQgY29udmVydGVyCisKKyNkZWZpbmUgWVVWNDQ0X0ZVTkMoRlVOQ19OQU1FLCBGVU5DLCBYU1RFUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitleHRlcm4gdm9pZCBGVU5DX05BTUUoY29uc3QgdWludDhfdCogeSwgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwgICAgXAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGxlbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3ZvaWQgRlVOQ19OQU1FKGNvbnN0IHVpbnQ4X3QqIHksIGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsICAgICAgICAgICBcCisgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBsZW4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSBGVU5DKHlbaV0sIHVbaV0sIHZbaV0sICZkc3RbaSAqIChYU1RFUCldKTsgICAgICAgICBcCit9CisKK1lVVjQ0NF9GVU5DKFdlYlBZdXY0NDRUb1JnYmFfQywgICAgIFZQOFl1dlRvUmdiYSwgNCkKK1lVVjQ0NF9GVU5DKFdlYlBZdXY0NDRUb0JncmFfQywgICAgIFZQOFl1dlRvQmdyYSwgNCkKKyNpZiAhZGVmaW5lZChXRUJQX1JFRFVDRV9DU1ApCitZVVY0NDRfRlVOQyhXZWJQWXV2NDQ0VG9SZ2JfQywgICAgICBWUDhZdXZUb1JnYiwgIDMpCitZVVY0NDRfRlVOQyhXZWJQWXV2NDQ0VG9CZ3JfQywgICAgICBWUDhZdXZUb0JnciwgIDMpCitZVVY0NDRfRlVOQyhXZWJQWXV2NDQ0VG9BcmdiX0MsICAgICBWUDhZdXZUb0FyZ2IsIDQpCitZVVY0NDRfRlVOQyhXZWJQWXV2NDQ0VG9SZ2JhNDQ0NF9DLCBWUDhZdXZUb1JnYmE0NDQ0LCAyKQorWVVWNDQ0X0ZVTkMoV2ViUFl1djQ0NFRvUmdiNTY1X0MsICAgVlA4WXV2VG9SZ2I1NjUsIDIpCisjZWxzZQorc3RhdGljIHZvaWQgRW1wdHlZdXY0NDRGdW5jKGNvbnN0IHVpbnQ4X3QqIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBsZW4pIHsKKyAgKHZvaWQpeTsKKyAgKHZvaWQpdTsKKyAgKHZvaWQpdjsKKyAgKHZvaWQpZHN0OworICAodm9pZClsZW47Cit9CisjZGVmaW5lIFdlYlBZdXY0NDRUb1JnYl9DIEVtcHR5WXV2NDQ0RnVuYworI2RlZmluZSBXZWJQWXV2NDQ0VG9CZ3JfQyBFbXB0eVl1djQ0NEZ1bmMKKyNkZWZpbmUgV2ViUFl1djQ0NFRvQXJnYl9DIEVtcHR5WXV2NDQ0RnVuYworI2RlZmluZSBXZWJQWXV2NDQ0VG9SZ2JhNDQ0NF9DIEVtcHR5WXV2NDQ0RnVuYworI2RlZmluZSBXZWJQWXV2NDQ0VG9SZ2I1NjVfQyBFbXB0eVl1djQ0NEZ1bmMKKyNlbmRpZiAgIC8vIFdFQlBfUkVEVUNFX0NTUAorCisjdW5kZWYgWVVWNDQ0X0ZVTkMKKworV2ViUFlVVjQ0NENvbnZlcnRlciBXZWJQWVVWNDQ0Q29udmVydGVyc1tNT0RFX0xBU1RdOworCitleHRlcm4gdm9pZCBXZWJQSW5pdFlVVjQ0NENvbnZlcnRlcnNNSVBTZHNwUjIodm9pZCk7CitleHRlcm4gdm9pZCBXZWJQSW5pdFlVVjQ0NENvbnZlcnRlcnNTU0UyKHZvaWQpOworZXh0ZXJuIHZvaWQgV2ViUEluaXRZVVY0NDRDb252ZXJ0ZXJzU1NFNDEodm9pZCk7CisKK1dFQlBfRFNQX0lOSVRfRlVOQyhXZWJQSW5pdFlVVjQ0NENvbnZlcnRlcnMpIHsKKyAgV2ViUFlVVjQ0NENvbnZlcnRlcnNbTU9ERV9SR0JBXSAgICAgID0gV2ViUFl1djQ0NFRvUmdiYV9DOworICBXZWJQWVVWNDQ0Q29udmVydGVyc1tNT0RFX0JHUkFdICAgICAgPSBXZWJQWXV2NDQ0VG9CZ3JhX0M7CisgIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW01PREVfUkdCXSAgICAgICA9IFdlYlBZdXY0NDRUb1JnYl9DOworICBXZWJQWVVWNDQ0Q29udmVydGVyc1tNT0RFX0JHUl0gICAgICAgPSBXZWJQWXV2NDQ0VG9CZ3JfQzsKKyAgV2ViUFlVVjQ0NENvbnZlcnRlcnNbTU9ERV9BUkdCXSAgICAgID0gV2ViUFl1djQ0NFRvQXJnYl9DOworICBXZWJQWVVWNDQ0Q29udmVydGVyc1tNT0RFX1JHQkFfNDQ0NF0gPSBXZWJQWXV2NDQ0VG9SZ2JhNDQ0NF9DOworICBXZWJQWVVWNDQ0Q29udmVydGVyc1tNT0RFX1JHQl81NjVdICAgPSBXZWJQWXV2NDQ0VG9SZ2I1NjVfQzsKKyAgV2ViUFlVVjQ0NENvbnZlcnRlcnNbTU9ERV9yZ2JBXSAgICAgID0gV2ViUFl1djQ0NFRvUmdiYV9DOworICBXZWJQWVVWNDQ0Q29udmVydGVyc1tNT0RFX2JnckFdICAgICAgPSBXZWJQWXV2NDQ0VG9CZ3JhX0M7CisgIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW01PREVfQXJnYl0gICAgICA9IFdlYlBZdXY0NDRUb0FyZ2JfQzsKKyAgV2ViUFlVVjQ0NENvbnZlcnRlcnNbTU9ERV9yZ2JBXzQ0NDRdID0gV2ViUFl1djQ0NFRvUmdiYTQ0NDRfQzsKKworICBpZiAoVlA4R2V0Q1BVSW5mbyAhPSBOVUxMKSB7CisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0UyKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtTU0UyKSkgeworICAgICAgV2ViUEluaXRZVVY0NDRDb252ZXJ0ZXJzU1NFMigpOworICAgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFNDEpCisgICAgaWYgKFZQOEdldENQVUluZm8oa1NTRTRfMSkpIHsKKyAgICAgIFdlYlBJbml0WVVWNDQ0Q29udmVydGVyc1NTRTQxKCk7CisgICAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTX0RTUF9SMikKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrTUlQU2RzcFIyKSkgeworICAgICAgV2ViUEluaXRZVVY0NDRDb252ZXJ0ZXJzTUlQU2RzcFIyKCk7CisgICAgfQorI2VuZGlmCisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1haW4gY2FsbHMKKworZXh0ZXJuIHZvaWQgV2ViUEluaXRVcHNhbXBsZXJzU1NFMih2b2lkKTsKK2V4dGVybiB2b2lkIFdlYlBJbml0VXBzYW1wbGVyc1NTRTQxKHZvaWQpOworZXh0ZXJuIHZvaWQgV2ViUEluaXRVcHNhbXBsZXJzTkVPTih2b2lkKTsKK2V4dGVybiB2b2lkIFdlYlBJbml0VXBzYW1wbGVyc01JUFNkc3BSMih2b2lkKTsKK2V4dGVybiB2b2lkIFdlYlBJbml0VXBzYW1wbGVyc01TQSh2b2lkKTsKKworV0VCUF9EU1BfSU5JVF9GVU5DKFdlYlBJbml0VXBzYW1wbGVycykgeworI2lmZGVmIEZBTkNZX1VQU0FNUExJTkcKKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCisgIFdlYlBVcHNhbXBsZXJzW01PREVfUkdCQV0gICAgICA9IFVwc2FtcGxlUmdiYUxpbmVQYWlyX0M7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfQkdSQV0gICAgICA9IFVwc2FtcGxlQmdyYUxpbmVQYWlyX0M7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfcmdiQV0gICAgICA9IFVwc2FtcGxlUmdiYUxpbmVQYWlyX0M7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfYmdyQV0gICAgICA9IFVwc2FtcGxlQmdyYUxpbmVQYWlyX0M7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfUkdCXSAgICAgICA9IFVwc2FtcGxlUmdiTGluZVBhaXJfQzsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9CR1JdICAgICAgID0gVXBzYW1wbGVCZ3JMaW5lUGFpcl9DOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX0FSR0JdICAgICAgPSBVcHNhbXBsZUFyZ2JMaW5lUGFpcl9DOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX1JHQkFfNDQ0NF0gPSBVcHNhbXBsZVJnYmE0NDQ0TGluZVBhaXJfQzsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9SR0JfNTY1XSAgID0gVXBzYW1wbGVSZ2I1NjVMaW5lUGFpcl9DOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX0FyZ2JdICAgICAgPSBVcHNhbXBsZUFyZ2JMaW5lUGFpcl9DOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX3JnYkFfNDQ0NF0gPSBVcHNhbXBsZVJnYmE0NDQ0TGluZVBhaXJfQzsKKyNlbmRpZgorCisgIC8vIElmIGRlZmluZWQsIHVzZSBDUFVJbmZvKCkgdG8gb3ZlcndyaXRlIHNvbWUgcG9pbnRlcnMgd2l0aCBmYXN0ZXIgdmVyc2lvbnMuCisgIGlmIChWUDhHZXRDUFVJbmZvICE9IE5VTEwpIHsKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTIpCisgICAgaWYgKFZQOEdldENQVUluZm8oa1NTRTIpKSB7CisgICAgICBXZWJQSW5pdFVwc2FtcGxlcnNTU0UyKCk7CisgICAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0U0MSkKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrU1NFNF8xKSkgeworICAgICAgV2ViUEluaXRVcHNhbXBsZXJzU1NFNDEoKTsKKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFNfRFNQX1IyKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtNSVBTZHNwUjIpKSB7CisgICAgICBXZWJQSW5pdFVwc2FtcGxlcnNNSVBTZHNwUjIoKTsKKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01TQSkKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrTVNBKSkgeworICAgICAgV2ViUEluaXRVcHNhbXBsZXJzTVNBKCk7CisgICAgfQorI2VuZGlmCisgIH0KKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTkVPTikKKyAgaWYgKFdFQlBfTkVPTl9PTUlUX0NfQ09ERSB8fAorICAgICAgKFZQOEdldENQVUluZm8gIT0gTlVMTCAmJiBWUDhHZXRDUFVJbmZvKGtORU9OKSkpIHsKKyAgICBXZWJQSW5pdFVwc2FtcGxlcnNORU9OKCk7CisgIH0KKyNlbmRpZgorCisgIGFzc2VydChXZWJQVXBzYW1wbGVyc1tNT0RFX1JHQkFdICE9IE5VTEwpOworICBhc3NlcnQoV2ViUFVwc2FtcGxlcnNbTU9ERV9CR1JBXSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFdlYlBVcHNhbXBsZXJzW01PREVfcmdiQV0gIT0gTlVMTCk7CisgIGFzc2VydChXZWJQVXBzYW1wbGVyc1tNT0RFX2JnckFdICE9IE5VTEwpOworI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX0NTUCkgfHwgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorICBhc3NlcnQoV2ViUFVwc2FtcGxlcnNbTU9ERV9SR0JdICE9IE5VTEwpOworICBhc3NlcnQoV2ViUFVwc2FtcGxlcnNbTU9ERV9CR1JdICE9IE5VTEwpOworICBhc3NlcnQoV2ViUFVwc2FtcGxlcnNbTU9ERV9BUkdCXSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFdlYlBVcHNhbXBsZXJzW01PREVfUkdCQV80NDQ0XSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFdlYlBVcHNhbXBsZXJzW01PREVfUkdCXzU2NV0gIT0gTlVMTCk7CisgIGFzc2VydChXZWJQVXBzYW1wbGVyc1tNT0RFX0FyZ2JdICE9IE5VTEwpOworICBhc3NlcnQoV2ViUFVwc2FtcGxlcnNbTU9ERV9yZ2JBXzQ0NDRdICE9IE5VTEwpOworI2VuZGlmCisKKyNlbmRpZiAgLy8gRkFOQ1lfVVBTQU1QTElORworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC91cHNhbXBsaW5nX21pcHNfZHNwX3IyLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3Vwc2FtcGxpbmdfbWlwc19kc3BfcjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGQ0OTlkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC91cHNhbXBsaW5nX21pcHNfZHNwX3IyLmMKQEAgLTAsMCArMSwyOTEgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBZVVYgdG8gUkdCIHVwc2FtcGxpbmcgZnVuY3Rpb25zLgorLy8KKy8vIEF1dGhvcihzKTogQnJhbmltaXIgVmFzaWMgKGJyYW5pbWlyLnZhc2ljQGltZ3RlYy5jb20pCisvLyAgICAgICAgICAgIERqb3JkamUgUGVzdXQgIChkam9yZGplLnBlc3V0QGltZ3RlYy5jb20pCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTX0RTUF9SMikKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgInNyYy9kc3AveXV2LmgiCisKKyNkZWZpbmUgWVVWX1RPX1JHQihZLCBVLCBWLCBSLCBHLCBCKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IHQxID0gTXVsdEhpKFksIDE5MDc3KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCB0MiA9IE11bHRIaShWLCAxMzMyMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBSID0gTXVsdEhpKFYsIDI2MTQ5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRyA9IE11bHRIaShVLCA2NDE5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEIgPSBNdWx0SGkoVSwgMzMwNTApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBSID0gdDEgKyBSOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRyA9IHQxIC0gRzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEIgPSB0MSArIEI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBSID0gUiAtIDE0MjM0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRyA9IEcgLSB0MiArIDg3MDg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEIgPSBCIC0gMTc2ODU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2FzbV9fIHZvbGF0aWxlICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAic2hsbF9zLncgICAgICAgICAlWyIgI1IgIl0sICAgICAgJVsiICNSICJdLCAgICAgICAgMTcgICAgICAgICBcblx0IiAgICAgXAorICAgICAgInNobGxfcy53ICAgICAgICAgJVsiICNHICJdLCAgICAgICVbIiAjRyAiXSwgICAgICAgIDE3ICAgICAgICAgXG5cdCIgICAgIFwKKyAgICAgICJzaGxsX3MudyAgICAgICAgICVbIiAjQiAiXSwgICAgICAlWyIgI0IgIl0sICAgICAgICAxNyAgICAgICAgIFxuXHQiICAgICBcCisgICAgICAicHJlY3JxdV9zLnFiLnBoICAlWyIgI1IgIl0sICAgICAgJVsiICNSICJdLCAgICAgICAgJHplcm8gICAgICBcblx0IiAgICAgXAorICAgICAgInByZWNycXVfcy5xYi5waCAgJVsiICNHICJdLCAgICAgICVbIiAjRyAiXSwgICAgICAgICR6ZXJvICAgICAgXG5cdCIgICAgIFwKKyAgICAgICJwcmVjcnF1X3MucWIucGggICVbIiAjQiAiXSwgICAgICAlWyIgI0IgIl0sICAgICAgICAkemVybyAgICAgIFxuXHQiICAgICBcCisgICAgICAic3JsICAgICAgICAgICAgICAlWyIgI1IgIl0sICAgICAgJVsiICNSICJdLCAgICAgICAgMjQgICAgICAgICBcblx0IiAgICAgXAorICAgICAgInNybCAgICAgICAgICAgICAgJVsiICNHICJdLCAgICAgICVbIiAjRyAiXSwgICAgICAgIDI0ICAgICAgICAgXG5cdCIgICAgIFwKKyAgICAgICJzcmwgICAgICAgICAgICAgICVbIiAjQiAiXSwgICAgICAlWyIgI0IgIl0sICAgICAgICAyNCAgICAgICAgIFxuXHQiICAgICBcCisgICAgICA6IFtSXSIrciIoUiksIFtHXSIrciIoRyksIFtCXSIrciIoQikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNpZiAhZGVmaW5lZChXRUJQX1JFRFVDRV9DU1ApCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBZdXZUb1JnYihpbnQgeSwgaW50IHUsIGludCB2LCB1aW50OF90KiBjb25zdCByZ2IpIHsKKyAgaW50IHIsIGcsIGI7CisgIFlVVl9UT19SR0IoeSwgdSwgdiwgciwgZywgYik7CisgIHJnYlswXSA9IHI7CisgIHJnYlsxXSA9IGc7CisgIHJnYlsyXSA9IGI7Cit9CitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBZdXZUb0JncihpbnQgeSwgaW50IHUsIGludCB2LCB1aW50OF90KiBjb25zdCBiZ3IpIHsKKyAgaW50IHIsIGcsIGI7CisgIFlVVl9UT19SR0IoeSwgdSwgdiwgciwgZywgYik7CisgIGJnclswXSA9IGI7CisgIGJnclsxXSA9IGc7CisgIGJnclsyXSA9IHI7Cit9CitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBZdXZUb1JnYjU2NShpbnQgeSwgaW50IHUsIGludCB2LCB1aW50OF90KiBjb25zdCByZ2IpIHsKKyAgaW50IHIsIGcsIGI7CisgIFlVVl9UT19SR0IoeSwgdSwgdiwgciwgZywgYik7CisgIHsKKyAgICBjb25zdCBpbnQgcmcgPSAociAmIDB4ZjgpIHwgKGcgPj4gNSk7CisgICAgY29uc3QgaW50IGdiID0gKChnIDw8IDMpICYgMHhlMCkgfCAoYiA+PiAzKTsKKyNpZiAoV0VCUF9TV0FQXzE2QklUX0NTUCA9PSAxKQorICAgIHJnYlswXSA9IGdiOworICAgIHJnYlsxXSA9IHJnOworI2Vsc2UKKyAgICByZ2JbMF0gPSByZzsKKyAgICByZ2JbMV0gPSBnYjsKKyNlbmRpZgorICB9Cit9CitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBZdXZUb1JnYmE0NDQ0KGludCB5LCBpbnQgdSwgaW50IHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IGFyZ2IpIHsKKyAgaW50IHIsIGcsIGI7CisgIFlVVl9UT19SR0IoeSwgdSwgdiwgciwgZywgYik7CisgIHsKKyAgICBjb25zdCBpbnQgcmcgPSAociAmIDB4ZjApIHwgKGcgPj4gNCk7CisgICAgY29uc3QgaW50IGJhID0gKGIgJiAweGYwKSB8IDB4MGY7ICAgICAvLyBvdmVyd3JpdGUgdGhlIGxvd2VyIDQgYml0cworI2lmIChXRUJQX1NXQVBfMTZCSVRfQ1NQID09IDEpCisgICAgYXJnYlswXSA9IGJhOworICAgIGFyZ2JbMV0gPSByZzsKKyNlbHNlCisgICAgYXJnYlswXSA9IHJnOworICAgIGFyZ2JbMV0gPSBiYTsKKyNlbmRpZgorICAgfQorfQorI2VuZGlmICAgLy8gV0VCUF9SRURVQ0VfQ1NQCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEFscGhhIGhhbmRsaW5nIHZhcmlhbnRzCisKKyNpZiAhZGVmaW5lZChXRUJQX1JFRFVDRV9DU1ApCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBZdXZUb0FyZ2IodWludDhfdCB5LCB1aW50OF90IHUsIHVpbnQ4X3QgdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBhcmdiKSB7CisgIGludCByLCBnLCBiOworICBZVVZfVE9fUkdCKHksIHUsIHYsIHIsIGcsIGIpOworICBhcmdiWzBdID0gMHhmZjsKKyAgYXJnYlsxXSA9IHI7CisgIGFyZ2JbMl0gPSBnOworICBhcmdiWzNdID0gYjsKK30KKyNlbmRpZiAgIC8vIFdFQlBfUkVEVUNFX0NTUAorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgWXV2VG9CZ3JhKHVpbnQ4X3QgeSwgdWludDhfdCB1LCB1aW50OF90IHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgYmdyYSkgeworICBpbnQgciwgZywgYjsKKyAgWVVWX1RPX1JHQih5LCB1LCB2LCByLCBnLCBiKTsKKyAgYmdyYVswXSA9IGI7CisgIGJncmFbMV0gPSBnOworICBiZ3JhWzJdID0gcjsKKyAgYmdyYVszXSA9IDB4ZmY7Cit9CitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBZdXZUb1JnYmEodWludDhfdCB5LCB1aW50OF90IHUsIHVpbnQ4X3QgdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCByZ2JhKSB7CisgIGludCByLCBnLCBiOworICBZVVZfVE9fUkdCKHksIHUsIHYsIHIsIGcsIGIpOworICByZ2JhWzBdID0gcjsKKyAgcmdiYVsxXSA9IGc7CisgIHJnYmFbMl0gPSBiOworICByZ2JhWzNdID0gMHhmZjsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZhbmN5IHVwc2FtcGxlcgorCisjaWZkZWYgRkFOQ1lfVVBTQU1QTElORworCisvLyBHaXZlbiBzYW1wbGVzIGxhaWQgb3V0IGluIGEgc3F1YXJlIGFzOgorLy8gIFthIGJdCisvLyAgW2MgZF0KKy8vIHdlIGludGVycG9sYXRlIHUvdiBhczoKKy8vICAoWzkqYSArIDMqYiArIDMqYyArICAgZCAgICAzKmEgKyA5KmIgKyAzKmMgKyAgIGRdICsgWzggOF0pIC8gMTYKKy8vICAoWzMqYSArICAgYiArIDkqYyArIDMqZCAgICAgIGEgKyAzKmIgKyAzKmMgKyA5KmRdICAgWzggOF0pIC8gMTYKKworLy8gV2UgcHJvY2VzcyB1IGFuZCB2IHRvZ2V0aGVyIHN0YXNoZWQgaW50byAzMmJpdCAoMTZiaXQgZWFjaCkuCisjZGVmaW5lIExPQURfVVYodSwgdikgKCh1KSB8ICgodikgPDwgMTYpKQorCisjZGVmaW5lIFVQU0FNUExFX0ZVTkMoRlVOQ19OQU1FLCBGVU5DLCBYU1RFUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgRlVOQ19OQU1FKGNvbnN0IHVpbnQ4X3QqIHRvcF95LCBjb25zdCB1aW50OF90KiBib3R0b21feSwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3BfdSwgY29uc3QgdWludDhfdCogdG9wX3YsICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY3VyX3UsIGNvbnN0IHVpbnQ4X3QqIGN1cl92LCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHRvcF9kc3QsIHVpbnQ4X3QqIGJvdHRvbV9kc3QsIGludCBsZW4pIHsgICAgICAgIFwKKyAgaW50IHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IGludCBsYXN0X3BpeGVsX3BhaXIgPSAobGVuIC0gMSkgPj4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1aW50MzJfdCB0bF91diA9IExPQURfVVYodG9wX3VbMF0sIHRvcF92WzBdKTsgICAvKiB0b3AtbGVmdCBzYW1wbGUgKi8gICAgICAgIFwKKyAgdWludDMyX3QgbF91diAgPSBMT0FEX1VWKGN1cl91WzBdLCBjdXJfdlswXSk7ICAgLyogbGVmdC1zYW1wbGUgKi8gICAgICAgICAgICBcCisgIGFzc2VydCh0b3BfeSAhPSBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB1aW50MzJfdCB1djAgPSAoMyAqIHRsX3V2ICsgbF91diArIDB4MDAwMjAwMDJ1KSA+PiAyOyAgICAgICAgICAgICAgICBcCisgICAgRlVOQyh0b3BfeVswXSwgdXYwICYgMHhmZiwgKHV2MCA+PiAxNiksIHRvcF9kc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGJvdHRvbV95ICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDMyX3QgdXYwID0gKDMgKiBsX3V2ICsgdGxfdXYgKyAweDAwMDIwMDAydSkgPj4gMjsgICAgICAgICAgICAgICAgXAorICAgIEZVTkMoYm90dG9tX3lbMF0sIHV2MCAmIDB4ZmYsICh1djAgPj4gMTYpLCBib3R0b21fZHN0KTsgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZvciAoeCA9IDE7IHggPD0gbGFzdF9waXhlbF9wYWlyOyArK3gpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVpbnQzMl90IHRfdXYgPSBMT0FEX1VWKHRvcF91W3hdLCB0b3Bfdlt4XSk7ICAvKiB0b3Agc2FtcGxlICovICAgICAgIFwKKyAgICBjb25zdCB1aW50MzJfdCB1diAgID0gTE9BRF9VVihjdXJfdVt4XSwgY3VyX3ZbeF0pOyAgLyogc2FtcGxlICovICAgICAgICAgICBcCisgICAgLyogcHJlY29tcHV0ZSBpbnZhcmlhbnQgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCBmaXJzdCBhbmQgc2Vjb25kIGRpYWdvbmFscyovXAorICAgIGNvbnN0IHVpbnQzMl90IGF2ZyA9IHRsX3V2ICsgdF91diArIGxfdXYgKyB1diArIDB4MDAwODAwMDh1OyAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB1aW50MzJfdCBkaWFnXzEyID0gKGF2ZyArIDIgKiAodF91diArIGxfdXYpKSA+PiAzOyAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDMyX3QgZGlhZ18wMyA9IChhdmcgKyAyICogKHRsX3V2ICsgdXYpKSA+PiAzOyAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IHVpbnQzMl90IHV2MCA9IChkaWFnXzEyICsgdGxfdXYpID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCB1aW50MzJfdCB1djEgPSAoZGlhZ18wMyArIHRfdXYpID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgRlVOQyh0b3BfeVsyICogeCAtIDFdLCB1djAgJiAweGZmLCAodXYwID4+IDE2KSwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgdG9wX2RzdCArICgyICogeCAtIDEpICogWFNURVApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBGVU5DKHRvcF95WzIgKiB4IC0gMF0sIHV2MSAmIDB4ZmYsICh1djEgPj4gMTYpLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICB0b3BfZHN0ICsgKDIgKiB4IC0gMCkgKiBYU1RFUCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGJvdHRvbV95ICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY29uc3QgdWludDMyX3QgdXYwID0gKGRpYWdfMDMgKyBsX3V2KSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IHVpbnQzMl90IHV2MSA9IChkaWFnXzEyICsgdXYpID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBGVU5DKGJvdHRvbV95WzIgKiB4IC0gMV0sIHV2MCAmIDB4ZmYsICh1djAgPj4gMTYpLCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBib3R0b21fZHN0ICsgKDIgKiB4IC0gMSkgKiBYU1RFUCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEZVTkMoYm90dG9tX3lbMiAqIHggKyAwXSwgdXYxICYgMHhmZiwgKHV2MSA+PiAxNiksICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIGJvdHRvbV9kc3QgKyAoMiAqIHggKyAwKSAqIFhTVEVQKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0bF91diA9IHRfdXY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbF91diA9IHV2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKCEobGVuICYgMSkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY29uc3QgdWludDMyX3QgdXYwID0gKDMgKiB0bF91diArIGxfdXYgKyAweDAwMDIwMDAydSkgPj4gMjsgICAgICAgICAgICAgIFwKKyAgICAgIEZVTkModG9wX3lbbGVuIC0gMV0sIHV2MCAmIDB4ZmYsICh1djAgPj4gMTYpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIHRvcF9kc3QgKyAobGVuIC0gMSkgKiBYU1RFUCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoYm90dG9tX3kgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCB1aW50MzJfdCB1djAgPSAoMyAqIGxfdXYgKyB0bF91diArIDB4MDAwMjAwMDJ1KSA+PiAyOyAgICAgICAgICAgICAgXAorICAgICAgRlVOQyhib3R0b21feVtsZW4gLSAxXSwgdXYwICYgMHhmZiwgKHV2MCA+PiAxNiksICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgYm90dG9tX2RzdCArIChsZW4gLSAxKSAqIFhTVEVQKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLy8gQWxsIHZhcmlhbnRzIGltcGxlbWVudGVkLgorVVBTQU1QTEVfRlVOQyhVcHNhbXBsZVJnYmFMaW5lUGFpciwgICAgIFl1dlRvUmdiYSwgICAgIDQpCitVUFNBTVBMRV9GVU5DKFVwc2FtcGxlQmdyYUxpbmVQYWlyLCAgICAgWXV2VG9CZ3JhLCAgICAgNCkKKyNpZiAhZGVmaW5lZChXRUJQX1JFRFVDRV9DU1ApCitVUFNBTVBMRV9GVU5DKFVwc2FtcGxlUmdiTGluZVBhaXIsICAgICAgWXV2VG9SZ2IsICAgICAgMykKK1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVCZ3JMaW5lUGFpciwgICAgICBZdXZUb0JnciwgICAgICAzKQorVVBTQU1QTEVfRlVOQyhVcHNhbXBsZUFyZ2JMaW5lUGFpciwgICAgIFl1dlRvQXJnYiwgICAgIDQpCitVUFNBTVBMRV9GVU5DKFVwc2FtcGxlUmdiYTQ0NDRMaW5lUGFpciwgWXV2VG9SZ2JhNDQ0NCwgMikKK1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVSZ2I1NjVMaW5lUGFpciwgICBZdXZUb1JnYjU2NSwgICAyKQorI2VuZGlmICAgLy8gV0VCUF9SRURVQ0VfQ1NQCisKKyN1bmRlZiBMT0FEX1VWCisjdW5kZWYgVVBTQU1QTEVfRlVOQworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgV2ViUEluaXRVcHNhbXBsZXJzTUlQU2RzcFIyKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgV2ViUEluaXRVcHNhbXBsZXJzTUlQU2RzcFIyKHZvaWQpIHsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9SR0JBXSAgICAgID0gVXBzYW1wbGVSZ2JhTGluZVBhaXI7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfQkdSQV0gICAgICA9IFVwc2FtcGxlQmdyYUxpbmVQYWlyOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX3JnYkFdICAgICAgPSBVcHNhbXBsZVJnYmFMaW5lUGFpcjsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9iZ3JBXSAgICAgID0gVXBzYW1wbGVCZ3JhTGluZVBhaXI7CisjaWYgIWRlZmluZWQoV0VCUF9SRURVQ0VfQ1NQKQorICBXZWJQVXBzYW1wbGVyc1tNT0RFX1JHQl0gICAgICAgPSBVcHNhbXBsZVJnYkxpbmVQYWlyOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX0JHUl0gICAgICAgPSBVcHNhbXBsZUJnckxpbmVQYWlyOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX0FSR0JdICAgICAgPSBVcHNhbXBsZUFyZ2JMaW5lUGFpcjsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9SR0JBXzQ0NDRdID0gVXBzYW1wbGVSZ2JhNDQ0NExpbmVQYWlyOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX1JHQl81NjVdICAgPSBVcHNhbXBsZVJnYjU2NUxpbmVQYWlyOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX0FyZ2JdICAgICAgPSBVcHNhbXBsZUFyZ2JMaW5lUGFpcjsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9yZ2JBXzQ0NDRdID0gVXBzYW1wbGVSZ2JhNDQ0NExpbmVQYWlyOworI2VuZGlmICAgLy8gV0VCUF9SRURVQ0VfQ1NQCit9CisKKyNlbmRpZiAgLy8gRkFOQ1lfVVBTQU1QTElORworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gWVVWNDQ0IGNvbnZlcnRlcgorCisjZGVmaW5lIFlVVjQ0NF9GVU5DKEZVTkNfTkFNRSwgRlVOQywgWFNURVApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgRlVOQ19OQU1FKGNvbnN0IHVpbnQ4X3QqIHksIGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBsZW4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIEZVTkMoeVtpXSwgdVtpXSwgdltpXSwgJmRzdFtpICogWFNURVBdKTsgICAgICAgICAgIFwKK30KKworWVVWNDQ0X0ZVTkMoWXV2NDQ0VG9SZ2JhLCAgICAgWXV2VG9SZ2JhLCAgICAgNCkKK1lVVjQ0NF9GVU5DKFl1djQ0NFRvQmdyYSwgICAgIFl1dlRvQmdyYSwgICAgIDQpCisjaWYgIWRlZmluZWQoV0VCUF9SRURVQ0VfQ1NQKQorWVVWNDQ0X0ZVTkMoWXV2NDQ0VG9SZ2IsICAgICAgWXV2VG9SZ2IsICAgICAgMykKK1lVVjQ0NF9GVU5DKFl1djQ0NFRvQmdyLCAgICAgIFl1dlRvQmdyLCAgICAgIDMpCitZVVY0NDRfRlVOQyhZdXY0NDRUb0FyZ2IsICAgICBZdXZUb0FyZ2IsICAgICA0KQorWVVWNDQ0X0ZVTkMoWXV2NDQ0VG9SZ2JhNDQ0NCwgWXV2VG9SZ2JhNDQ0NCwgMikKK1lVVjQ0NF9GVU5DKFl1djQ0NFRvUmdiNTY1LCAgIFl1dlRvUmdiNTY1LCAgIDIpCisjZW5kaWYgICAvLyBXRUJQX1JFRFVDRV9DU1AKKworI3VuZGVmIFlVVjQ0NF9GVU5DCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBXZWJQSW5pdFlVVjQ0NENvbnZlcnRlcnNNSVBTZHNwUjIodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBXZWJQSW5pdFlVVjQ0NENvbnZlcnRlcnNNSVBTZHNwUjIodm9pZCkgeworICBXZWJQWVVWNDQ0Q29udmVydGVyc1tNT0RFX1JHQkFdICAgICAgPSBZdXY0NDRUb1JnYmE7CisgIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW01PREVfQkdSQV0gICAgICA9IFl1djQ0NFRvQmdyYTsKKyAgV2ViUFlVVjQ0NENvbnZlcnRlcnNbTU9ERV9yZ2JBXSAgICAgID0gWXV2NDQ0VG9SZ2JhOworICBXZWJQWVVWNDQ0Q29udmVydGVyc1tNT0RFX2JnckFdICAgICAgPSBZdXY0NDRUb0JncmE7CisjaWYgIWRlZmluZWQoV0VCUF9SRURVQ0VfQ1NQKQorICBXZWJQWVVWNDQ0Q29udmVydGVyc1tNT0RFX1JHQl0gICAgICAgPSBZdXY0NDRUb1JnYjsKKyAgV2ViUFlVVjQ0NENvbnZlcnRlcnNbTU9ERV9CR1JdICAgICAgID0gWXV2NDQ0VG9CZ3I7CisgIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW01PREVfQVJHQl0gICAgICA9IFl1djQ0NFRvQXJnYjsKKyAgV2ViUFlVVjQ0NENvbnZlcnRlcnNbTU9ERV9SR0JBXzQ0NDRdID0gWXV2NDQ0VG9SZ2JhNDQ0NDsKKyAgV2ViUFlVVjQ0NENvbnZlcnRlcnNbTU9ERV9SR0JfNTY1XSAgID0gWXV2NDQ0VG9SZ2I1NjU7CisgIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW01PREVfQXJnYl0gICAgICA9IFl1djQ0NFRvQXJnYjsKKyAgV2ViUFlVVjQ0NENvbnZlcnRlcnNbTU9ERV9yZ2JBXzQ0NDRdID0gWXV2NDQ0VG9SZ2JhNDQ0NDsKKyNlbmRpZiAgIC8vIFdFQlBfUkVEVUNFX0NTUAorfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX01JUFNfRFNQX1IyCisKK1dFQlBfRFNQX0lOSVRfU1RVQihXZWJQSW5pdFlVVjQ0NENvbnZlcnRlcnNNSVBTZHNwUjIpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfTUlQU19EU1BfUjIKKworI2lmICEoZGVmaW5lZChGQU5DWV9VUFNBTVBMSU5HKSAmJiBkZWZpbmVkKFdFQlBfVVNFX01JUFNfRFNQX1IyKSkKK1dFQlBfRFNQX0lOSVRfU1RVQihXZWJQSW5pdFVwc2FtcGxlcnNNSVBTZHNwUjIpCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvdXBzYW1wbGluZ19tc2EuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvdXBzYW1wbGluZ19tc2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWJmNGRiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC91cHNhbXBsaW5nX21zYS5jCkBAIC0wLDAgKzEsNjkyIEBACisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gTVNBIHZlcnNpb24gb2YgWVVWIHRvIFJHQiB1cHNhbXBsaW5nIGZ1bmN0aW9ucy4KKy8vCisvLyBBdXRob3I6IFByYXNoYW50IFBhdGlsIChwcmFzaGFudC5wYXRpbEBpbWd0ZWMuY29tKQorCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RyaW5nX3BvZW0uaCIKKyNlbHNlCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NU0EpCisKKyNpbmNsdWRlICJzcmMvZHNwL21zYV9tYWNyby5oIgorI2luY2x1ZGUgInNyYy9kc3AveXV2LmgiCisKKyNpZmRlZiBGQU5DWV9VUFNBTVBMSU5HCisKKyNkZWZpbmUgSUxWUl9VVzIoaW4sIG91dDAsIG91dDEpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB2OGkxNiB0MCA9ICh2OGkxNilfX21zYV9pbHZyX2IoKHYxNmk4KXplcm8sICh2MTZpOClpbik7ICBcCisgIG91dDAgPSAodjR1MzIpX19tc2FfaWx2cl9oKCh2OGkxNil6ZXJvLCB0MCk7ICAgICAgICAgICAgICAgICAgIFwKKyAgb3V0MSA9ICh2NHUzMilfX21zYV9pbHZsX2goKHY4aTE2KXplcm8sIHQwKTsgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBJTFZSTF9VVzQoaW4sIG91dDAsIG91dDEsIG91dDIsIG91dDMpIGRvIHsgIFwKKyAgdjE2dTggdDAsIHQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElMVlJMX0IyX1VCKHplcm8sIGluLCB0MCwgdDEpOyAgICAgICAgICAgICAgICAgICAgXAorICBJTFZSTF9IMl9VVyh6ZXJvLCB0MCwgb3V0MCwgb3V0MSk7ICAgICAgICAgICAgICAgIFwKKyAgSUxWUkxfSDJfVVcoemVybywgdDEsIG91dDIsIG91dDMpOyAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIE1VTFRISV8xNihpbjAsIGluMSwgaW4yLCBpbjMsIGNuc3QsIG91dDAsIG91dDEpIGRvIHsgICBcCisgIGNvbnN0IHY0aTMyIGNvbnN0MCA9ICh2NGkzMilfX21zYV9maWxsX3coY25zdCAqIDI1Nik7ICAgICAgICBcCisgIHY0dTMyIHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIE1VTDQoaW4wLCBjb25zdDAsIGluMSwgY29uc3QwLCBpbjIsIGNvbnN0MCwgaW4zLCBjb25zdDAsICAgICBcCisgICAgICAgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFBDS09EX0gyX1VIKHRlbXAxLCB0ZW1wMCwgdGVtcDMsIHRlbXAyLCBvdXQwLCBvdXQxKTsgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIE1VTFRISV84KGluMCwgaW4xLCBjbnN0LCBvdXQwKSBkbyB7ICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHY0aTMyIGNvbnN0MCA9ICh2NGkzMilfX21zYV9maWxsX3coY25zdCAqIDI1Nik7ICAgICBcCisgIHY0dTMyIHRlbXAwLCB0ZW1wMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIE1VTDIoaW4wLCBjb25zdDAsIGluMSwgY29uc3QwLCB0ZW1wMCwgdGVtcDEpOyAgICAgICAgICAgICBcCisgIG91dDAgPSAodjh1MTYpX19tc2FfcGNrb2RfaCgodjhpMTYpdGVtcDEsICh2OGkxNil0ZW1wMCk7ICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIENBTENfUjE2KHkwLCB5MSwgdjAsIHYxLCBkc3QpIGRvIHsgICAgICAgICAgICAgICAgXAorICBjb25zdCB2OGkxNiBjb25zdF9hID0gKHY4aTE2KV9fbXNhX2ZpbGxfaCgxNDIzNCk7ICAgICAgIFwKKyAgY29uc3QgdjhpMTYgYTAgPSBfX21zYV9hZGRzX3NfaCgodjhpMTYpeTAsICh2OGkxNil2MCk7ICBcCisgIGNvbnN0IHY4aTE2IGExID0gX19tc2FfYWRkc19zX2goKHY4aTE2KXkxLCAodjhpMTYpdjEpOyAgXAorICB2OGkxNiBiMCA9IF9fbXNhX3N1YnNfc19oKGEwLCBjb25zdF9hKTsgICAgICAgICAgICAgICAgIFwKKyAgdjhpMTYgYjEgPSBfX21zYV9zdWJzX3NfaChhMSwgY29uc3RfYSk7ICAgICAgICAgICAgICAgICBcCisgIFNSQUlfSDJfU0goYjAsIGIxLCA2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBDTElQX1NIMl8wXzI1NShiMCwgYjEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZHN0ID0gKHYxNnU4KV9fbXNhX3Bja2V2X2IoKHYxNmk4KWIxLCAodjE2aTgpYjApOyAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIENBTENfUjgoeTAsIHYwLCBkc3QpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB2OGkxNiBjb25zdF9hID0gKHY4aTE2KV9fbXNhX2ZpbGxfaCgxNDIzNCk7ICAgICAgIFwKKyAgY29uc3QgdjhpMTYgYTAgPSBfX21zYV9hZGRzX3NfaCgodjhpMTYpeTAsICh2OGkxNil2MCk7ICBcCisgIHY4aTE2IGIwID0gX19tc2Ffc3Vic19zX2goYTAsIGNvbnN0X2EpOyAgICAgICAgICAgICAgICAgXAorICBiMCA9IFNSQUlfSChiMCwgNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQ0xJUF9TSF8wXzI1NShiMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRzdCA9ICh2MTZ1OClfX21zYV9wY2tldl9iKCh2MTZpOCliMCwgKHYxNmk4KWIwKTsgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDQUxDX0cxNih5MCwgeTEsIHUwLCB1MSwgdjAsIHYxLCBkc3QpIGRvIHsgICBcCisgIGNvbnN0IHY4aTE2IGNvbnN0X2EgPSAodjhpMTYpX19tc2FfZmlsbF9oKDg3MDgpOyAgIFwKKyAgdjhpMTYgYTAgPSBfX21zYV9zdWJzX3NfaCgodjhpMTYpeTAsICh2OGkxNil1MCk7ICAgXAorICB2OGkxNiBhMSA9IF9fbXNhX3N1YnNfc19oKCh2OGkxNil5MSwgKHY4aTE2KXUxKTsgICBcCisgIGNvbnN0IHY4aTE2IGIwID0gX19tc2Ffc3Vic19zX2goYTAsICh2OGkxNil2MCk7ICAgIFwKKyAgY29uc3QgdjhpMTYgYjEgPSBfX21zYV9zdWJzX3NfaChhMSwgKHY4aTE2KXYxKTsgICAgXAorICBhMCA9IF9fbXNhX2FkZHNfc19oKGIwLCBjb25zdF9hKTsgICAgICAgICAgICAgICAgICBcCisgIGExID0gX19tc2FfYWRkc19zX2goYjEsIGNvbnN0X2EpOyAgICAgICAgICAgICAgICAgIFwKKyAgU1JBSV9IMl9TSChhMCwgYTEsIDYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBDTElQX1NIMl8wXzI1NShhMCwgYTEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRzdCA9ICh2MTZ1OClfX21zYV9wY2tldl9iKCh2MTZpOClhMSwgKHYxNmk4KWEwKTsgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQ0FMQ19HOCh5MCwgdTAsIHYwLCBkc3QpIGRvIHsgICAgICAgICAgICAgICAgXAorICBjb25zdCB2OGkxNiBjb25zdF9hID0gKHY4aTE2KV9fbXNhX2ZpbGxfaCg4NzA4KTsgICBcCisgIHY4aTE2IGEwID0gX19tc2Ffc3Vic19zX2goKHY4aTE2KXkwLCAodjhpMTYpdTApOyAgIFwKKyAgY29uc3QgdjhpMTYgYjAgPSBfX21zYV9zdWJzX3NfaChhMCwgKHY4aTE2KXYwKTsgICAgXAorICBhMCA9IF9fbXNhX2FkZHNfc19oKGIwLCBjb25zdF9hKTsgICAgICAgICAgICAgICAgICBcCisgIGEwID0gU1JBSV9IKGEwLCA2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQ0xJUF9TSF8wXzI1NShhMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkc3QgPSAodjE2dTgpX19tc2FfcGNrZXZfYigodjE2aTgpYTAsICh2MTZpOClhMCk7ICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIENBTENfQjE2KHkwLCB5MSwgdTAsIHUxLCBkc3QpIGRvIHsgICAgICAgICAgIFwKKyAgY29uc3Qgdjh1MTYgY29uc3RfYSA9ICh2OHUxNilfX21zYV9maWxsX2goMTc2ODUpOyAgXAorICBjb25zdCB2OHUxNiBhMCA9IF9fbXNhX2FkZHNfdV9oKCh2OHUxNil5MCwgdTApOyAgICBcCisgIGNvbnN0IHY4dTE2IGExID0gX19tc2FfYWRkc191X2goKHY4dTE2KXkxLCB1MSk7ICAgIFwKKyAgdjh1MTYgYjAgPSBfX21zYV9zdWJzX3VfaChhMCwgY29uc3RfYSk7ICAgICAgICAgICAgXAorICB2OHUxNiBiMSA9IF9fbXNhX3N1YnNfdV9oKGExLCBjb25zdF9hKTsgICAgICAgICAgICBcCisgIFNSQUlfSDJfVUgoYjAsIGIxLCA2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQ0xJUF9VSDJfMF8yNTUoYjAsIGIxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkc3QgPSAodjE2dTgpX19tc2FfcGNrZXZfYigodjE2aTgpYjEsICh2MTZpOCliMCk7ICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIENBTENfQjgoeTAsIHUwLCBkc3QpIGRvIHsgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3Qgdjh1MTYgY29uc3RfYSA9ICh2OHUxNilfX21zYV9maWxsX2goMTc2ODUpOyAgXAorICBjb25zdCB2OHUxNiBhMCA9IF9fbXNhX2FkZHNfdV9oKCh2OHUxNil5MCwgdTApOyAgICBcCisgIHY4dTE2IGIwID0gX19tc2Ffc3Vic191X2goYTAsIGNvbnN0X2EpOyAgICAgICAgICAgIFwKKyAgYjAgPSBTUkFJX0goYjAsIDYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBDTElQX1VIXzBfMjU1KGIwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRzdCA9ICh2MTZ1OClfX21zYV9wY2tldl9iKCh2MTZpOCliMCwgKHYxNmk4KWIwKTsgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQ0FMQ19SR0IxNih5LCB1LCB2LCBSLCBHLCBCKSBkbyB7ICAgIFwKKyAgY29uc3QgdjE2dTggemVybyA9IHsgMCB9OyAgICAgICAgICAgICAgICAgIFwKKyAgdjh1MTYgeTAsIHkxLCB1MCwgdTEsIHYwLCB2MTsgICAgICAgICAgICAgIFwKKyAgdjR1MzIgcDAsIHAxLCBwMiwgcDM7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdjE2dTggaW5feSA9IExEX1VCKHkpOyAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdjE2dTggaW5fdSA9IExEX1VCKHUpOyAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdjE2dTggaW5fdiA9IExEX1VCKHYpOyAgICAgICAgICAgICAgIFwKKyAgSUxWUkxfVVc0KGluX3ksIHAwLCBwMSwgcDIsIHAzKTsgICAgICAgICAgIFwKKyAgTVVMVEhJXzE2KHAwLCBwMSwgcDIsIHAzLCAxOTA3NywgeTAsIHkxKTsgIFwKKyAgSUxWUkxfVVc0KGluX3YsIHAwLCBwMSwgcDIsIHAzKTsgICAgICAgICAgIFwKKyAgTVVMVEhJXzE2KHAwLCBwMSwgcDIsIHAzLCAyNjE0OSwgdjAsIHYxKTsgIFwKKyAgQ0FMQ19SMTYoeTAsIHkxLCB2MCwgdjEsIFIpOyAgICAgICAgICAgICAgIFwKKyAgTVVMVEhJXzE2KHAwLCBwMSwgcDIsIHAzLCAxMzMyMCwgdjAsIHYxKTsgIFwKKyAgSUxWUkxfVVc0KGluX3UsIHAwLCBwMSwgcDIsIHAzKTsgICAgICAgICAgIFwKKyAgTVVMVEhJXzE2KHAwLCBwMSwgcDIsIHAzLCA2NDE5LCB1MCwgdTEpOyAgIFwKKyAgQ0FMQ19HMTYoeTAsIHkxLCB1MCwgdTEsIHYwLCB2MSwgRyk7ICAgICAgIFwKKyAgTVVMVEhJXzE2KHAwLCBwMSwgcDIsIHAzLCAzMzA1MCwgdTAsIHUxKTsgIFwKKyAgQ0FMQ19CMTYoeTAsIHkxLCB1MCwgdTEsIEIpOyAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQ0FMQ19SR0I4KHksIHUsIHYsIFIsIEcsIEIpIGRvIHsgIFwKKyAgY29uc3QgdjE2dTggemVybyA9IHsgMCB9OyAgICAgICAgICAgICAgIFwKKyAgdjh1MTYgeTAsIHUwLCB2MDsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdjR1MzIgcDAsIHAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdjE2dTggaW5feSA9IExEX1VCKHkpOyAgICAgICAgICAgIFwKKyAgY29uc3QgdjE2dTggaW5fdSA9IExEX1VCKHUpOyAgICAgICAgICAgIFwKKyAgY29uc3QgdjE2dTggaW5fdiA9IExEX1VCKHYpOyAgICAgICAgICAgIFwKKyAgSUxWUl9VVzIoaW5feSwgcDAsIHAxKTsgICAgICAgICAgICAgICAgIFwKKyAgTVVMVEhJXzgocDAsIHAxLCAxOTA3NywgeTApOyAgICAgICAgICAgIFwKKyAgSUxWUl9VVzIoaW5fdiwgcDAsIHAxKTsgICAgICAgICAgICAgICAgIFwKKyAgTVVMVEhJXzgocDAsIHAxLCAyNjE0OSwgdjApOyAgICAgICAgICAgIFwKKyAgQ0FMQ19SOCh5MCwgdjAsIFIpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgTVVMVEhJXzgocDAsIHAxLCAxMzMyMCwgdjApOyAgICAgICAgICAgIFwKKyAgSUxWUl9VVzIoaW5fdSwgcDAsIHAxKTsgICAgICAgICAgICAgICAgIFwKKyAgTVVMVEhJXzgocDAsIHAxLCA2NDE5LCB1MCk7ICAgICAgICAgICAgIFwKKyAgQ0FMQ19HOCh5MCwgdTAsIHYwLCBHKTsgICAgICAgICAgICAgICAgIFwKKyAgTVVMVEhJXzgocDAsIHAxLCAzMzA1MCwgdTApOyAgICAgICAgICAgIFwKKyAgQ0FMQ19COCh5MCwgdTAsIEIpOyAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgU1RPUkUxNl8zKGEwLCBhMSwgYTIsIGRzdCkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB2MTZ1OCBtYXNrMCA9IHsgMCwgMSwgMTYsIDIsIDMsIDE3LCA0LCA1LCAxOCwgNiwgNywgMTksICBcCisgICAgICAgICAgICAgICAgICAgICAgICA4LCA5LCAyMCwgMTAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdjE2dTggbWFzazEgPSB7IDAsIDIxLCAxLCAyLCAyMiwgMywgNCwgMjMsIDUsIDYsIDI0LCA3LCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgOCwgMjUsIDksIDEwIH07ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHYxNnU4IG1hc2syID0geyAyNiwgMCwgMSwgMjcsIDIsIDMsIDI4LCA0LCA1LCAyOSwgNiwgNywgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIDMwLCA4LCA5LCAzMSB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2MTZ1OCBvdXQwLCBvdXQxLCBvdXQyLCB0bXAwLCB0bXAxLCB0bXAyOyAgICAgICAgICAgICAgICAgICAgICBcCisgIElMVlJMX0IyX1VCKGExLCBhMCwgdG1wMCwgdG1wMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgb3V0MCA9IFZTSEZfVUIodG1wMCwgYTIsIG1hc2swKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0bXAyID0gU0xESV9VQih0bXAxLCB0bXAwLCAxMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG91dDEgPSBWU0hGX1VCKHRtcDIsIGEyLCBtYXNrMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdG1wMiA9IFNMRElfVUIodG1wMSwgdG1wMSwgNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBvdXQyID0gVlNIRl9VQih0bXAyLCBhMiwgbWFzazIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFNUX1VCKG91dDAsIGRzdCArICAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU1RfVUIob3V0MSwgZHN0ICsgMTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBTVF9VQihvdXQyLCBkc3QgKyAzMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFNUT1JFOF8zKGEwLCBhMSwgYTIsIGRzdCkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnQ2NF90IG91dF9tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdjE2dTggbWFzazAgPSB7IDAsIDEsIDE2LCAyLCAzLCAxNywgNCwgNSwgMTgsIDYsIDcsIDE5LCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICA4LCA5LCAyMCwgMTAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB2MTZ1OCBtYXNrMSA9IHsgMTEsIDIxLCAxMiwgMTMsIDIyLCAxNCwgMTUsIDIzLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH07ICBcCisgIGNvbnN0IHYxNnU4IHRtcDAgPSAodjE2dTgpX19tc2FfaWx2cl9iKCh2MTZpOClhMSwgKHYxNmk4KWEwKTsgICAgXAorICB2MTZ1OCBvdXQwLCBvdXQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVlNIRl9CMl9VQih0bXAwLCBhMiwgdG1wMCwgYTIsIG1hc2swLCBtYXNrMSwgb3V0MCwgb3V0MSk7ICAgICAgICBcCisgIFNUX1VCKG91dDAsIGRzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBvdXRfbSA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NClvdXQxLCAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU0Qob3V0X20sIGRzdCArIDE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFNUT1JFMTZfNChhMCwgYTEsIGEyLCBhMywgZHN0KSBkbyB7ICBcCisgIHYxNnU4IHRtcDAsIHRtcDEsIHRtcDIsIHRtcDM7ICAgICAgICAgICAgICBcCisgIHYxNnU4IG91dDAsIG91dDEsIG91dDIsIG91dDM7ICAgICAgICAgICAgICBcCisgIElMVlJMX0IyX1VCKGExLCBhMCwgdG1wMCwgdG1wMSk7ICAgICAgICAgICBcCisgIElMVlJMX0IyX1VCKGEzLCBhMiwgdG1wMiwgdG1wMyk7ICAgICAgICAgICBcCisgIElMVlJMX0gyX1VCKHRtcDIsIHRtcDAsIG91dDAsIG91dDEpOyAgICAgICBcCisgIElMVlJMX0gyX1VCKHRtcDMsIHRtcDEsIG91dDIsIG91dDMpOyAgICAgICBcCisgIFNUX1VCKG91dDAsIGRzdCArICAwKTsgICAgICAgICAgICAgICAgICAgICBcCisgIFNUX1VCKG91dDEsIGRzdCArIDE2KTsgICAgICAgICAgICAgICAgICAgICBcCisgIFNUX1VCKG91dDIsIGRzdCArIDMyKTsgICAgICAgICAgICAgICAgICAgICBcCisgIFNUX1VCKG91dDMsIGRzdCArIDQ4KTsgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFNUT1JFOF80KGEwLCBhMSwgYTIsIGEzLCBkc3QpIGRvIHsgIFwKKyAgdjE2dTggdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsgICAgICAgICAgICAgXAorICBJTFZSX0IyX1VCKGExLCBhMCwgYTMsIGEyLCB0bXAwLCB0bXAxKTsgICBcCisgIElMVlJMX0gyX1VCKHRtcDEsIHRtcDAsIHRtcDIsIHRtcDMpOyAgICAgIFwKKyAgU1RfVUIodG1wMiwgZHN0ICsgIDApOyAgICAgICAgICAgICAgICAgICAgXAorICBTVF9VQih0bXAzLCBkc3QgKyAxNik7ICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFNUT1JFMl8xNihhMCwgYTEsIGRzdCkgZG8geyAgXAorICB2MTZ1OCBvdXQwLCBvdXQxOyAgICAgICAgICAgICAgICAgIFwKKyAgSUxWUkxfQjJfVUIoYTEsIGEwLCBvdXQwLCBvdXQxKTsgICBcCisgIFNUX1VCKG91dDAsIGRzdCArICAwKTsgICAgICAgICAgICAgXAorICBTVF9VQihvdXQxLCBkc3QgKyAxNik7ICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgU1RPUkUyXzgoYTAsIGExLCBkc3QpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB2MTZ1OCBvdXQwID0gKHYxNnU4KV9fbXNhX2lsdnJfYigodjE2aTgpYTEsICh2MTZpOClhMCk7ICBcCisgIFNUX1VCKG91dDAsIGRzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQ0FMQ19SR0JBNDQ0NCh5LCB1LCB2LCBvdXQwLCBvdXQxLCBOLCBkc3QpIGRvIHsgIFwKKyAgQ0FMQ19SR0IjI04oeSwgdSwgdiwgUiwgRywgQik7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdG1wMCA9IEFORElfQihSLCAweGYwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdG1wMSA9IFNSQUlfQihHLCA0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgUkcgPSB0bXAwIHwgdG1wMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdG1wMCA9IEFORElfQihCLCAweGYwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQkEgPSBPUklfQih0bXAwLCAweDBmKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU1RPUkUyXyMjTihvdXQwLCBvdXQxLCBkc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQ0FMQ19SR0I1NjUoeSwgdSwgdiwgb3V0MCwgb3V0MSwgTiwgZHN0KSBkbyB7ICBcCisgIENBTENfUkdCIyNOKHksIHUsIHYsIFIsIEcsIEIpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICB0bXAwID0gQU5ESV9CKFIsIDB4ZjgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdG1wMSA9IFNSQUlfQihHLCA1KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFJHID0gdG1wMCB8IHRtcDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0bXAwID0gU0xMSV9CKEcsIDMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdG1wMSA9IEFORElfQih0bXAwLCAweGUwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRtcDAgPSBTUkFJX0IoQiwgMyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBHQiA9IHRtcDAgfCB0bXAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU1RPUkUyXyMjTihvdXQwLCBvdXQxLCBkc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IENsaXA4KGludCB2KSB7CisgIHJldHVybiB2IDwgMCA/IDAgOiB2ID4gMjU1ID8gMjU1IDogdjsKK30KKworc3RhdGljIHZvaWQgWXV2VG9SZ2IoaW50IHksIGludCB1LCBpbnQgdiwgdWludDhfdCogY29uc3QgcmdiKSB7CisgIGNvbnN0IGludCB5MSA9IE11bHRIaSh5LCAxOTA3Nyk7CisgIGNvbnN0IGludCByMSA9IHkxICsgTXVsdEhpKHYsIDI2MTQ5KSAtIDE0MjM0OworICBjb25zdCBpbnQgZzEgPSB5MSAtIE11bHRIaSh1LCA2NDE5KSAtIE11bHRIaSh2LCAxMzMyMCkgKyA4NzA4OworICBjb25zdCBpbnQgYjEgPSB5MSArIE11bHRIaSh1LCAzMzA1MCkgLSAxNzY4NTsKKyAgcmdiWzBdID0gQ2xpcDgocjEgPj4gNik7CisgIHJnYlsxXSA9IENsaXA4KGcxID4+IDYpOworICByZ2JbMl0gPSBDbGlwOChiMSA+PiA2KTsKK30KKworc3RhdGljIHZvaWQgWXV2VG9CZ3IoaW50IHksIGludCB1LCBpbnQgdiwgdWludDhfdCogY29uc3QgYmdyKSB7CisgIGNvbnN0IGludCB5MSA9IE11bHRIaSh5LCAxOTA3Nyk7CisgIGNvbnN0IGludCByMSA9IHkxICsgTXVsdEhpKHYsIDI2MTQ5KSAtIDE0MjM0OworICBjb25zdCBpbnQgZzEgPSB5MSAtIE11bHRIaSh1LCA2NDE5KSAtIE11bHRIaSh2LCAxMzMyMCkgKyA4NzA4OworICBjb25zdCBpbnQgYjEgPSB5MSArIE11bHRIaSh1LCAzMzA1MCkgLSAxNzY4NTsKKyAgYmdyWzBdID0gQ2xpcDgoYjEgPj4gNik7CisgIGJnclsxXSA9IENsaXA4KGcxID4+IDYpOworICBiZ3JbMl0gPSBDbGlwOChyMSA+PiA2KTsKK30KKworI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX0NTUCkKK3N0YXRpYyB2b2lkIFl1dlRvUmdiNTY1KGludCB5LCBpbnQgdSwgaW50IHYsIHVpbnQ4X3QqIGNvbnN0IHJnYikgeworICBjb25zdCBpbnQgeTEgPSBNdWx0SGkoeSwgMTkwNzcpOworICBjb25zdCBpbnQgcjEgPSB5MSArIE11bHRIaSh2LCAyNjE0OSkgLSAxNDIzNDsKKyAgY29uc3QgaW50IGcxID0geTEgLSBNdWx0SGkodSwgNjQxOSkgLSBNdWx0SGkodiwgMTMzMjApICsgODcwODsKKyAgY29uc3QgaW50IGIxID0geTEgKyBNdWx0SGkodSwgMzMwNTApIC0gMTc2ODU7CisgIGNvbnN0IGludCByID0gQ2xpcDgocjEgPj4gNik7CisgIGNvbnN0IGludCBnID0gQ2xpcDgoZzEgPj4gNik7CisgIGNvbnN0IGludCBiID0gQ2xpcDgoYjEgPj4gNik7CisgIGNvbnN0IGludCByZyA9IChyICYgMHhmOCkgfCAoZyA+PiA1KTsKKyAgY29uc3QgaW50IGdiID0gKChnIDw8IDMpICYgMHhlMCkgfCAoYiA+PiAzKTsKKyNpZiAoV0VCUF9TV0FQXzE2QklUX0NTUCA9PSAxKQorICByZ2JbMF0gPSBnYjsKKyAgcmdiWzFdID0gcmc7CisjZWxzZQorICByZ2JbMF0gPSByZzsKKyAgcmdiWzFdID0gZ2I7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgWXV2VG9SZ2JhNDQ0NChpbnQgeSwgaW50IHUsIGludCB2LCB1aW50OF90KiBjb25zdCBhcmdiKSB7CisgIGNvbnN0IGludCB5MSA9IE11bHRIaSh5LCAxOTA3Nyk7CisgIGNvbnN0IGludCByMSA9IHkxICsgTXVsdEhpKHYsIDI2MTQ5KSAtIDE0MjM0OworICBjb25zdCBpbnQgZzEgPSB5MSAtIE11bHRIaSh1LCA2NDE5KSAtIE11bHRIaSh2LCAxMzMyMCkgKyA4NzA4OworICBjb25zdCBpbnQgYjEgPSB5MSArIE11bHRIaSh1LCAzMzA1MCkgLSAxNzY4NTsKKyAgY29uc3QgaW50IHIgPSBDbGlwOChyMSA+PiA2KTsKKyAgY29uc3QgaW50IGcgPSBDbGlwOChnMSA+PiA2KTsKKyAgY29uc3QgaW50IGIgPSBDbGlwOChiMSA+PiA2KTsKKyAgY29uc3QgaW50IHJnID0gKHIgJiAweGYwKSB8IChnID4+IDQpOworICBjb25zdCBpbnQgYmEgPSAoYiAmIDB4ZjApIHwgMHgwZjsgICAgIC8vIG92ZXJ3cml0ZSB0aGUgbG93ZXIgNCBiaXRzCisjaWYgKFdFQlBfU1dBUF8xNkJJVF9DU1AgPT0gMSkKKyAgYXJnYlswXSA9IGJhOworICBhcmdiWzFdID0gcmc7CisjZWxzZQorICBhcmdiWzBdID0gcmc7CisgIGFyZ2JbMV0gPSBiYTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBZdXZUb0FyZ2IodWludDhfdCB5LCB1aW50OF90IHUsIHVpbnQ4X3QgdiwgdWludDhfdCogY29uc3QgYXJnYikgeworICBhcmdiWzBdID0gMHhmZjsKKyAgWXV2VG9SZ2IoeSwgdSwgdiwgYXJnYiArIDEpOworfQorI2VuZGlmICAvLyBXRUJQX1JFRFVDRV9DU1AKKworc3RhdGljIHZvaWQgWXV2VG9CZ3JhKHVpbnQ4X3QgeSwgdWludDhfdCB1LCB1aW50OF90IHYsIHVpbnQ4X3QqIGNvbnN0IGJncmEpIHsKKyAgWXV2VG9CZ3IoeSwgdSwgdiwgYmdyYSk7CisgIGJncmFbM10gPSAweGZmOworfQorCitzdGF0aWMgdm9pZCBZdXZUb1JnYmEodWludDhfdCB5LCB1aW50OF90IHUsIHVpbnQ4X3QgdiwgdWludDhfdCogY29uc3QgcmdiYSkgeworICBZdXZUb1JnYih5LCB1LCB2LCByZ2JhKTsKKyAgcmdiYVszXSA9IDB4ZmY7Cit9CisKKyNpZiAhZGVmaW5lZChXRUJQX1JFRFVDRV9DU1ApCitzdGF0aWMgdm9pZCBZdXZUb1JnYkxpbmUoY29uc3QgdWludDhfdCogeSwgY29uc3QgdWludDhfdCogdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB2LCB1aW50OF90KiBkc3QsIGludCBsZW5ndGgpIHsKKyAgdjE2dTggUiwgRywgQjsKKyAgd2hpbGUgKGxlbmd0aCA+PSAxNikgeworICAgIENBTENfUkdCMTYoeSwgdSwgdiwgUiwgRywgQik7CisgICAgU1RPUkUxNl8zKFIsIEcsIEIsIGRzdCk7CisgICAgeSAgICAgICs9IDE2OworICAgIHUgICAgICArPSAxNjsKKyAgICB2ICAgICAgKz0gMTY7CisgICAgZHN0ICAgICs9IDE2ICogMzsKKyAgICBsZW5ndGggLT0gMTY7CisgIH0KKyAgaWYgKGxlbmd0aCA+IDgpIHsKKyAgICB1aW50OF90IHRlbXBbMyAqIDE2XSA9IHsgMCB9OworICAgIG1lbWNweSh0ZW1wLCB5LCBsZW5ndGggKiBzaXplb2YoKnRlbXApKTsKKyAgICBDQUxDX1JHQjE2KHRlbXAsIHUsIHYsIFIsIEcsIEIpOworICAgIFNUT1JFMTZfMyhSLCBHLCBCLCB0ZW1wKTsKKyAgICBtZW1jcHkoZHN0LCB0ZW1wLCBsZW5ndGggKiAzICogc2l6ZW9mKCpkc3QpKTsKKyAgfSBlbHNlIGlmIChsZW5ndGggPiAwKSB7CisgICAgdWludDhfdCB0ZW1wWzMgKiA4XSA9IHsgMCB9OworICAgIG1lbWNweSh0ZW1wLCB5LCBsZW5ndGggKiBzaXplb2YoKnRlbXApKTsKKyAgICBDQUxDX1JHQjgodGVtcCwgdSwgdiwgUiwgRywgQik7CisgICAgU1RPUkU4XzMoUiwgRywgQiwgdGVtcCk7CisgICAgbWVtY3B5KGRzdCwgdGVtcCwgbGVuZ3RoICogMyAqIHNpemVvZigqZHN0KSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgWXV2VG9CZ3JMaW5lKGNvbnN0IHVpbnQ4X3QqIHksIGNvbnN0IHVpbnQ4X3QqIHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdiwgdWludDhfdCogZHN0LCBpbnQgbGVuZ3RoKSB7CisgIHYxNnU4IFIsIEcsIEI7CisgIHdoaWxlIChsZW5ndGggPj0gMTYpIHsKKyAgICBDQUxDX1JHQjE2KHksIHUsIHYsIFIsIEcsIEIpOworICAgIFNUT1JFMTZfMyhCLCBHLCBSLCBkc3QpOworICAgIHkgICAgICArPSAxNjsKKyAgICB1ICAgICAgKz0gMTY7CisgICAgdiAgICAgICs9IDE2OworICAgIGRzdCAgICArPSAxNiAqIDM7CisgICAgbGVuZ3RoIC09IDE2OworICB9CisgIGlmIChsZW5ndGggPiA4KSB7CisgICAgdWludDhfdCB0ZW1wWzMgKiAxNl0gPSB7IDAgfTsKKyAgICBtZW1jcHkodGVtcCwgeSwgbGVuZ3RoICogc2l6ZW9mKCp0ZW1wKSk7CisgICAgQ0FMQ19SR0IxNih0ZW1wLCB1LCB2LCBSLCBHLCBCKTsKKyAgICBTVE9SRTE2XzMoQiwgRywgUiwgdGVtcCk7CisgICAgbWVtY3B5KGRzdCwgdGVtcCwgbGVuZ3RoICogMyAqIHNpemVvZigqZHN0KSk7CisgIH0gZWxzZSBpZiAobGVuZ3RoID4gMCkgeworICAgIHVpbnQ4X3QgdGVtcFszICogOF0gPSB7IDAgfTsKKyAgICBtZW1jcHkodGVtcCwgeSwgbGVuZ3RoICogc2l6ZW9mKCp0ZW1wKSk7CisgICAgQ0FMQ19SR0I4KHRlbXAsIHUsIHYsIFIsIEcsIEIpOworICAgIFNUT1JFOF8zKEIsIEcsIFIsIHRlbXApOworICAgIG1lbWNweShkc3QsIHRlbXAsIGxlbmd0aCAqIDMgKiBzaXplb2YoKmRzdCkpOworICB9Cit9CisjZW5kaWYgIC8vIFdFQlBfUkVEVUNFX0NTUAorCitzdGF0aWMgdm9pZCBZdXZUb1JnYmFMaW5lKGNvbnN0IHVpbnQ4X3QqIHksIGNvbnN0IHVpbnQ4X3QqIHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHYsIHVpbnQ4X3QqIGRzdCwgaW50IGxlbmd0aCkgeworICB2MTZ1OCBSLCBHLCBCOworICBjb25zdCB2MTZ1OCBBID0gKHYxNnU4KV9fbXNhX2xkaV9iKEFMUEhBVkFMKTsKKyAgd2hpbGUgKGxlbmd0aCA+PSAxNikgeworICAgIENBTENfUkdCMTYoeSwgdSwgdiwgUiwgRywgQik7CisgICAgU1RPUkUxNl80KFIsIEcsIEIsIEEsIGRzdCk7CisgICAgeSAgICAgICs9IDE2OworICAgIHUgICAgICArPSAxNjsKKyAgICB2ICAgICAgKz0gMTY7CisgICAgZHN0ICAgICs9IDE2ICogNDsKKyAgICBsZW5ndGggLT0gMTY7CisgIH0KKyAgaWYgKGxlbmd0aCA+IDgpIHsKKyAgICB1aW50OF90IHRlbXBbNCAqIDE2XSA9IHsgMCB9OworICAgIG1lbWNweSh0ZW1wLCB5LCBsZW5ndGggKiBzaXplb2YoKnRlbXApKTsKKyAgICBDQUxDX1JHQjE2KCZ0ZW1wWzBdLCB1LCB2LCBSLCBHLCBCKTsKKyAgICBTVE9SRTE2XzQoUiwgRywgQiwgQSwgdGVtcCk7CisgICAgbWVtY3B5KGRzdCwgdGVtcCwgbGVuZ3RoICogNCAqIHNpemVvZigqZHN0KSk7CisgIH0gZWxzZSBpZiAobGVuZ3RoID4gMCkgeworICAgIHVpbnQ4X3QgdGVtcFs0ICogOF0gPSB7IDAgfTsKKyAgICBtZW1jcHkodGVtcCwgeSwgbGVuZ3RoICogc2l6ZW9mKCp0ZW1wKSk7CisgICAgQ0FMQ19SR0I4KHRlbXAsIHUsIHYsIFIsIEcsIEIpOworICAgIFNUT1JFOF80KFIsIEcsIEIsIEEsIHRlbXApOworICAgIG1lbWNweShkc3QsIHRlbXAsIGxlbmd0aCAqIDQgKiBzaXplb2YoKmRzdCkpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFl1dlRvQmdyYUxpbmUoY29uc3QgdWludDhfdCogeSwgY29uc3QgdWludDhfdCogdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdiwgdWludDhfdCogZHN0LCBpbnQgbGVuZ3RoKSB7CisgIHYxNnU4IFIsIEcsIEI7CisgIGNvbnN0IHYxNnU4IEEgPSAodjE2dTgpX19tc2FfbGRpX2IoQUxQSEFWQUwpOworICB3aGlsZSAobGVuZ3RoID49IDE2KSB7CisgICAgQ0FMQ19SR0IxNih5LCB1LCB2LCBSLCBHLCBCKTsKKyAgICBTVE9SRTE2XzQoQiwgRywgUiwgQSwgZHN0KTsKKyAgICB5ICAgICAgKz0gMTY7CisgICAgdSAgICAgICs9IDE2OworICAgIHYgICAgICArPSAxNjsKKyAgICBkc3QgICAgKz0gMTYgKiA0OworICAgIGxlbmd0aCAtPSAxNjsKKyAgfQorICBpZiAobGVuZ3RoID4gOCkgeworICAgIHVpbnQ4X3QgdGVtcFs0ICogMTZdID0geyAwIH07CisgICAgbWVtY3B5KHRlbXAsIHksIGxlbmd0aCAqIHNpemVvZigqdGVtcCkpOworICAgIENBTENfUkdCMTYodGVtcCwgdSwgdiwgUiwgRywgQik7CisgICAgU1RPUkUxNl80KEIsIEcsIFIsIEEsIHRlbXApOworICAgIG1lbWNweShkc3QsIHRlbXAsIGxlbmd0aCAqIDQgKiBzaXplb2YoKmRzdCkpOworICB9IGVsc2UgaWYgKGxlbmd0aCA+IDApIHsKKyAgICB1aW50OF90IHRlbXBbNCAqIDhdID0geyAwIH07CisgICAgbWVtY3B5KHRlbXAsIHksIGxlbmd0aCAqIHNpemVvZigqdGVtcCkpOworICAgIENBTENfUkdCOCh0ZW1wLCB1LCB2LCBSLCBHLCBCKTsKKyAgICBTVE9SRThfNChCLCBHLCBSLCBBLCB0ZW1wKTsKKyAgICBtZW1jcHkoZHN0LCB0ZW1wLCBsZW5ndGggKiA0ICogc2l6ZW9mKCpkc3QpKTsKKyAgfQorfQorCisjaWYgIWRlZmluZWQoV0VCUF9SRURVQ0VfQ1NQKQorc3RhdGljIHZvaWQgWXV2VG9BcmdiTGluZShjb25zdCB1aW50OF90KiB5LCBjb25zdCB1aW50OF90KiB1LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB2LCB1aW50OF90KiBkc3QsIGludCBsZW5ndGgpIHsKKyAgdjE2dTggUiwgRywgQjsKKyAgY29uc3QgdjE2dTggQSA9ICh2MTZ1OClfX21zYV9sZGlfYihBTFBIQVZBTCk7CisgIHdoaWxlIChsZW5ndGggPj0gMTYpIHsKKyAgICBDQUxDX1JHQjE2KHksIHUsIHYsIFIsIEcsIEIpOworICAgIFNUT1JFMTZfNChBLCBSLCBHLCBCLCBkc3QpOworICAgIHkgICAgICArPSAxNjsKKyAgICB1ICAgICAgKz0gMTY7CisgICAgdiAgICAgICs9IDE2OworICAgIGRzdCAgICArPSAxNiAqIDQ7CisgICAgbGVuZ3RoIC09IDE2OworICB9CisgIGlmIChsZW5ndGggPiA4KSB7CisgICAgdWludDhfdCB0ZW1wWzQgKiAxNl0gPSB7IDAgfTsKKyAgICBtZW1jcHkodGVtcCwgeSwgbGVuZ3RoICogc2l6ZW9mKCp0ZW1wKSk7CisgICAgQ0FMQ19SR0IxNih0ZW1wLCB1LCB2LCBSLCBHLCBCKTsKKyAgICBTVE9SRTE2XzQoQSwgUiwgRywgQiwgdGVtcCk7CisgICAgbWVtY3B5KGRzdCwgdGVtcCwgbGVuZ3RoICogNCAqIHNpemVvZigqZHN0KSk7CisgIH0gZWxzZSBpZiAobGVuZ3RoID4gMCkgeworICAgIHVpbnQ4X3QgdGVtcFs0ICogOF0gPSB7IDAgfTsKKyAgICBtZW1jcHkodGVtcCwgeSwgbGVuZ3RoICogc2l6ZW9mKCp0ZW1wKSk7CisgICAgQ0FMQ19SR0I4KHRlbXAsIHUsIHYsIFIsIEcsIEIpOworICAgIFNUT1JFOF80KEEsIFIsIEcsIEIsIHRlbXApOworICAgIG1lbWNweShkc3QsIHRlbXAsIGxlbmd0aCAqIDQgKiBzaXplb2YoKmRzdCkpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFl1dlRvUmdiYTQ0NDRMaW5lKGNvbnN0IHVpbnQ4X3QqIHksIGNvbnN0IHVpbnQ4X3QqIHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB2LCB1aW50OF90KiBkc3QsIGludCBsZW5ndGgpIHsKKyAgdjE2dTggUiwgRywgQiwgUkcsIEJBLCB0bXAwLCB0bXAxOworICB3aGlsZSAobGVuZ3RoID49IDE2KSB7CisjaWYgKFdFQlBfU1dBUF8xNkJJVF9DU1AgPT0gMSkKKyAgICBDQUxDX1JHQkE0NDQ0KHksIHUsIHYsIEJBLCBSRywgMTYsIGRzdCk7CisjZWxzZQorICAgIENBTENfUkdCQTQ0NDQoeSwgdSwgdiwgUkcsIEJBLCAxNiwgZHN0KTsKKyNlbmRpZgorICAgIHkgICAgICArPSAxNjsKKyAgICB1ICAgICAgKz0gMTY7CisgICAgdiAgICAgICs9IDE2OworICAgIGRzdCAgICArPSAxNiAqIDI7CisgICAgbGVuZ3RoIC09IDE2OworICB9CisgIGlmIChsZW5ndGggPiA4KSB7CisgICAgdWludDhfdCB0ZW1wWzIgKiAxNl0gPSB7IDAgfTsKKyAgICBtZW1jcHkodGVtcCwgeSwgbGVuZ3RoICogc2l6ZW9mKCp0ZW1wKSk7CisjaWYgKFdFQlBfU1dBUF8xNkJJVF9DU1AgPT0gMSkKKyAgICBDQUxDX1JHQkE0NDQ0KHRlbXAsIHUsIHYsIEJBLCBSRywgMTYsIHRlbXApOworI2Vsc2UKKyAgICBDQUxDX1JHQkE0NDQ0KHRlbXAsIHUsIHYsIFJHLCBCQSwgMTYsIHRlbXApOworI2VuZGlmCisgICAgbWVtY3B5KGRzdCwgdGVtcCwgbGVuZ3RoICogMiAqIHNpemVvZigqZHN0KSk7CisgIH0gZWxzZSBpZiAobGVuZ3RoID4gMCkgeworICAgIHVpbnQ4X3QgdGVtcFsyICogOF0gPSB7IDAgfTsKKyAgICBtZW1jcHkodGVtcCwgeSwgbGVuZ3RoICogc2l6ZW9mKCp0ZW1wKSk7CisjaWYgKFdFQlBfU1dBUF8xNkJJVF9DU1AgPT0gMSkKKyAgICBDQUxDX1JHQkE0NDQ0KHRlbXAsIHUsIHYsIEJBLCBSRywgOCwgdGVtcCk7CisjZWxzZQorICAgIENBTENfUkdCQTQ0NDQodGVtcCwgdSwgdiwgUkcsIEJBLCA4LCB0ZW1wKTsKKyNlbmRpZgorICAgIG1lbWNweShkc3QsIHRlbXAsIGxlbmd0aCAqIDIgKiBzaXplb2YoKmRzdCkpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFl1dlRvUmdiNTY1TGluZShjb25zdCB1aW50OF90KiB5LCBjb25zdCB1aW50OF90KiB1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHYsIHVpbnQ4X3QqIGRzdCwgaW50IGxlbmd0aCkgeworICB2MTZ1OCBSLCBHLCBCLCBSRywgR0IsIHRtcDAsIHRtcDE7CisgIHdoaWxlIChsZW5ndGggPj0gMTYpIHsKKyNpZiAoV0VCUF9TV0FQXzE2QklUX0NTUCA9PSAxKQorICAgIENBTENfUkdCNTY1KHksIHUsIHYsIEdCLCBSRywgMTYsIGRzdCk7CisjZWxzZQorICAgIENBTENfUkdCNTY1KHksIHUsIHYsIFJHLCBHQiwgMTYsIGRzdCk7CisjZW5kaWYKKyAgICB5ICAgICAgKz0gMTY7CisgICAgdSAgICAgICs9IDE2OworICAgIHYgICAgICArPSAxNjsKKyAgICBkc3QgICAgKz0gMTYgKiAyOworICAgIGxlbmd0aCAtPSAxNjsKKyAgfQorICBpZiAobGVuZ3RoID4gOCkgeworICAgIHVpbnQ4X3QgdGVtcFsyICogMTZdID0geyAwIH07CisgICAgbWVtY3B5KHRlbXAsIHksIGxlbmd0aCAqIHNpemVvZigqdGVtcCkpOworI2lmIChXRUJQX1NXQVBfMTZCSVRfQ1NQID09IDEpCisgICAgQ0FMQ19SR0I1NjUodGVtcCwgdSwgdiwgR0IsIFJHLCAxNiwgdGVtcCk7CisjZWxzZQorICAgIENBTENfUkdCNTY1KHRlbXAsIHUsIHYsIFJHLCBHQiwgMTYsIHRlbXApOworI2VuZGlmCisgICAgbWVtY3B5KGRzdCwgdGVtcCwgbGVuZ3RoICogMiAqIHNpemVvZigqZHN0KSk7CisgIH0gZWxzZSBpZiAobGVuZ3RoID4gMCkgeworICAgIHVpbnQ4X3QgdGVtcFsyICogOF0gPSB7IDAgfTsKKyAgICBtZW1jcHkodGVtcCwgeSwgbGVuZ3RoICogc2l6ZW9mKCp0ZW1wKSk7CisjaWYgKFdFQlBfU1dBUF8xNkJJVF9DU1AgPT0gMSkKKyAgICBDQUxDX1JHQjU2NSh0ZW1wLCB1LCB2LCBHQiwgUkcsIDgsIHRlbXApOworI2Vsc2UKKyAgICBDQUxDX1JHQjU2NSh0ZW1wLCB1LCB2LCBSRywgR0IsIDgsIHRlbXApOworI2VuZGlmCisgICAgbWVtY3B5KGRzdCwgdGVtcCwgbGVuZ3RoICogMiAqIHNpemVvZigqZHN0KSk7CisgIH0KK30KKyNlbmRpZiAgLy8gV0VCUF9SRURVQ0VfQ1NQCisKKyNkZWZpbmUgVVBTQU1QTEVfMzJQSVhFTFMoYSwgYiwgYywgZCkgZG8geyAgICBcCisgIHYxNnU4IHMgPSBfX21zYV9hdmVyX3VfYihhLCBkKTsgICAgICAgICAgICAgXAorICB2MTZ1OCB0ID0gX19tc2FfYXZlcl91X2IoYiwgYyk7ICAgICAgICAgICAgIFwKKyAgY29uc3QgdjE2dTggc3QgPSBzIF4gdDsgICAgICAgICAgICAgICAgICAgICBcCisgIHYxNnU4IGFkID0gYSBeIGQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2MTZ1OCBiYyA9IGIgXiBjOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdjE2dTggdDAgPSBhZCB8IGJjOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHYxNnU4IHQxID0gdDAgfCBzdDsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2MTZ1OCB0MiA9IEFORElfQih0MSwgMSk7ICAgICAgICAgICAgICAgICAgIFwKKyAgdjE2dTggdDMgPSBfX21zYV9hdmVyX3VfYihzLCB0KTsgICAgICAgICAgICBcCisgIGNvbnN0IHYxNnU4IGsgPSB0MyAtIHQyOyAgICAgICAgICAgICAgICAgICAgXAorICB2MTZ1OCBkaWFnMSwgZGlhZzI7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQVZFUl9VQjJfVUIodCwgaywgcywgaywgdDAsIHQxKTsgICAgICAgICAgICBcCisgIGJjID0gYmMgJiBzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBhZCA9IGFkICYgc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdCA9IHQgXiBrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHMgPSBzIF4gazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0MiA9IGJjIHwgdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdDMgPSBhZCB8IHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHQyID0gQU5ESV9CKHQyLCAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0MyA9IEFORElfQih0MywgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU1VCMih0MCwgdDIsIHQxLCB0MywgZGlhZzEsIGRpYWcyKTsgICAgICAgICBcCisgIEFWRVJfVUIyX1VCKGEsIGRpYWcxLCBiLCBkaWFnMiwgdDAsIHQxKTsgICAgXAorICBJTFZSTF9CMl9VQih0MSwgdDAsIGEsIGIpOyAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKHBib3RfeSAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQVZFUl9VQjJfVUIoYywgZGlhZzIsIGQsIGRpYWcxLCB0MCwgdDEpOyAgXAorICAgIElMVlJMX0IyX1VCKHQxLCB0MCwgYywgZCk7ICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFVQU0FNUExFX0ZVTkMoRlVOQ19OQU1FLCBGVU5DLCBYU1RFUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgRlVOQ19OQU1FKGNvbnN0IHVpbnQ4X3QqIHRvcF95LCBjb25zdCB1aW50OF90KiBib3RfeSwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3BfdSwgY29uc3QgdWludDhfdCogdG9wX3YsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY3VyX3UsIGNvbnN0IHVpbnQ4X3QqIGN1cl92LCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHRvcF9kc3QsIHVpbnQ4X3QqIGJvdF9kc3QsIGludCBsZW4pICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludCBzaXplID0gKGxlbiAtIDEpID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1aW50OF90IHRlbXBfdVs2NF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdWludDhfdCB0ZW1wX3ZbNjRdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQzMl90IHRsX3V2ID0gKCh0b3BfdVswXSkgfCAoKHRvcF92WzBdKSA8PCAxNikpOyAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50MzJfdCBsX3V2ID0gKChjdXJfdVswXSkgfCAoKGN1cl92WzBdKSA8PCAxNikpOyAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDMyX3QgdXYwID0gKDMgKiB0bF91diArIGxfdXYgKyAweDAwMDIwMDAydSkgPj4gMjsgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQ4X3QqIHB0b3BfeSA9ICZ0b3BfeVsxXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1aW50OF90ICpwdG9wX2RzdCA9IHRvcF9kc3QgKyBYU1RFUDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDhfdCogcGJvdF95ID0gJmJvdF95WzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVpbnQ4X3QgKnBib3RfZHN0ID0gYm90X2RzdCArIFhTVEVQOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRlVOQyh0b3BfeVswXSwgdXYwICYgMHhmZiwgKHV2MCA+PiAxNiksIHRvcF9kc3QpOyAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChib3RfeSAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVpbnQzMl90IHV2MSA9ICgzICogbF91diArIHRsX3V2ICsgMHgwMDAyMDAwMnUpID4+IDI7ICAgICAgICAgIFwKKyAgICBGVU5DKGJvdF95WzBdLCB1djEgJiAweGZmLCAodXYxID4+IDE2KSwgYm90X2RzdCk7ICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB3aGlsZSAoc2l6ZSA+PSAxNikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2MTZ1OCB0dTAsIHR1MSwgdHYwLCB0djEsIGN1MCwgY3UxLCBjdjAsIGN2MTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTERfVUIyKHRvcF91LCAxLCB0dTAsIHR1MSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIExEX1VCMihjdXJfdSwgMSwgY3UwLCBjdTEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBMRF9VQjIodG9wX3YsIDEsIHR2MCwgdHYxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTERfVUIyKGN1cl92LCAxLCBjdjAsIGN2MSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFVQU0FNUExFXzMyUElYRUxTKHR1MCwgdHUxLCBjdTAsIGN1MSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBVUFNBTVBMRV8zMlBJWEVMUyh0djAsIHR2MSwgY3YwLCBjdjEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgU1RfVUI0KHR1MCwgdHUxLCBjdTAsIGN1MSwgJnRlbXBfdVswXSwgMTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNUX1VCNCh0djAsIHR2MSwgY3YwLCBjdjEsICZ0ZW1wX3ZbMF0sIDE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGVU5DIyNMaW5lKHB0b3BfeSwgJnRlbXBfdVsgMF0sICZ0ZW1wX3ZbMF0sIHB0b3BfZHN0LCAzMik7ICAgICAgICAgICBcCisgICAgaWYgKGJvdF95ICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgRlVOQyMjTGluZShwYm90X3ksICZ0ZW1wX3VbMzJdLCAmdGVtcF92WzMyXSwgcGJvdF9kc3QsIDMyKTsgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHRvcF95ICAgKz0gMzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHBib3RfeSAgICs9IDMyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwdG9wX2RzdCArPSBYU1RFUCAqIDMyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcGJvdF9kc3QgKz0gWFNURVAgKiAzMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRvcF91ICAgICs9IDE2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0b3BfdiAgICArPSAxNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY3VyX3UgICAgKz0gMTY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGN1cl92ICAgICs9IDE2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzaXplICAgICAtPSAxNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoc2l6ZSA+IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2MTZ1OCB0dTAsIHR1MSwgdHYwLCB0djEsIGN1MCwgY3UxLCBjdjAsIGN2MTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWVtY3B5KCZ0ZW1wX3VbIDBdLCB0b3BfdSwgMTcgKiBzaXplb2YodWludDhfdCkpOyAgICAgICAgICAgICAgICAgICAgXAorICAgIG1lbWNweSgmdGVtcF91WzMyXSwgY3VyX3UsIDE3ICogc2l6ZW9mKHVpbnQ4X3QpKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtZW1jcHkoJnRlbXBfdlsgMF0sIHRvcF92LCAxNyAqIHNpemVvZih1aW50OF90KSk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgbWVtY3B5KCZ0ZW1wX3ZbMzJdLCBjdXJfdiwgMTcgKiBzaXplb2YodWludDhfdCkpOyAgICAgICAgICAgICAgICAgICAgXAorICAgIExEX1VCMigmdGVtcF91WyAwXSwgMSwgdHUwLCB0dTEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBMRF9VQjIoJnRlbXBfdVszMl0sIDEsIGN1MCwgY3UxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTERfVUIyKCZ0ZW1wX3ZbIDBdLCAxLCB0djAsIHR2MSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIExEX1VCMigmdGVtcF92WzMyXSwgMSwgY3YwLCBjdjEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBVUFNBTVBMRV8zMlBJWEVMUyh0dTAsIHR1MSwgY3UwLCBjdTEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVVBTQU1QTEVfMzJQSVhFTFModHYwLCB0djEsIGN2MCwgY3YxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNUX1VCNCh0dTAsIHR1MSwgY3UwLCBjdTEsICZ0ZW1wX3VbMF0sIDE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTVF9VQjQodHYwLCB0djEsIGN2MCwgY3YxLCAmdGVtcF92WzBdLCAxNik7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRlVOQyMjTGluZShwdG9wX3ksICZ0ZW1wX3VbIDBdLCAmdGVtcF92WzBdLCBwdG9wX2RzdCwgc2l6ZSAqIDIpOyAgICAgXAorICAgIGlmIChib3RfeSAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEZVTkMjI0xpbmUocGJvdF95LCAmdGVtcF91WzMyXSwgJnRlbXBfdlszMl0sIHBib3RfZHN0LCBzaXplICogMik7ICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRvcF91ICs9IHNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0b3BfdiArPSBzaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY3VyX3UgKz0gc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGN1cl92ICs9IHNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmICghKGxlbiAmIDEpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVpbnQzMl90IHQwID0gKCh0b3BfdVswXSkgfCAoKHRvcF92WzBdKSA8PCAxNikpOyAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB1aW50MzJfdCBjMCAgPSAoKGN1cl91WzBdKSB8ICgoY3VyX3ZbMF0pIDw8IDE2KSk7ICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDMyX3QgdG1wMCA9ICgzICogdDAgKyBjMCArIDB4MDAwMjAwMDJ1KSA+PiAyOyAgICAgICAgICAgICAgXAorICAgIEZVTkModG9wX3lbbGVuIC0gMV0sIHRtcDAgJiAweGZmLCAodG1wMCA+PiAxNiksICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB0b3BfZHN0ICsgKGxlbiAtIDEpICogWFNURVApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGJvdF95ICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY29uc3QgdWludDMyX3QgdG1wMSA9ICgzICogYzAgKyB0MCArIDB4MDAwMjAwMDJ1KSA+PiAyOyAgICAgICAgICAgIFwKKyAgICAgIEZVTkMoYm90X3lbbGVuIC0gMV0sIHRtcDEgJiAweGZmLCAodG1wMSA+PiAxNiksICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIGJvdF9kc3QgKyAobGVuIC0gMSkgKiBYU1RFUCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVSZ2JhTGluZVBhaXIsICAgICBZdXZUb1JnYmEsICAgICA0KQorVVBTQU1QTEVfRlVOQyhVcHNhbXBsZUJncmFMaW5lUGFpciwgICAgIFl1dlRvQmdyYSwgICAgIDQpCisjaWYgIWRlZmluZWQoV0VCUF9SRURVQ0VfQ1NQKQorVVBTQU1QTEVfRlVOQyhVcHNhbXBsZVJnYkxpbmVQYWlyLCAgICAgIFl1dlRvUmdiLCAgICAgIDMpCitVUFNBTVBMRV9GVU5DKFVwc2FtcGxlQmdyTGluZVBhaXIsICAgICAgWXV2VG9CZ3IsICAgICAgMykKK1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVBcmdiTGluZVBhaXIsICAgICBZdXZUb0FyZ2IsICAgICA0KQorVVBTQU1QTEVfRlVOQyhVcHNhbXBsZVJnYmE0NDQ0TGluZVBhaXIsIFl1dlRvUmdiYTQ0NDQsIDIpCitVUFNBTVBMRV9GVU5DKFVwc2FtcGxlUmdiNTY1TGluZVBhaXIsICAgWXV2VG9SZ2I1NjUsICAgMikKKyNlbmRpZiAgIC8vIFdFQlBfUkVEVUNFX0NTUAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIFdlYlBVcHNhbXBsZUxpbmVQYWlyRnVuYyBXZWJQVXBzYW1wbGVyc1svKiBNT0RFX0xBU1QgKi9dOworCitleHRlcm4gdm9pZCBXZWJQSW5pdFVwc2FtcGxlcnNNU0Eodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBXZWJQSW5pdFVwc2FtcGxlcnNNU0Eodm9pZCkgeworICBXZWJQVXBzYW1wbGVyc1tNT0RFX1JHQkFdICAgICAgPSBVcHNhbXBsZVJnYmFMaW5lUGFpcjsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9CR1JBXSAgICAgID0gVXBzYW1wbGVCZ3JhTGluZVBhaXI7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfcmdiQV0gICAgICA9IFVwc2FtcGxlUmdiYUxpbmVQYWlyOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX2JnckFdICAgICAgPSBVcHNhbXBsZUJncmFMaW5lUGFpcjsKKyNpZiAhZGVmaW5lZChXRUJQX1JFRFVDRV9DU1ApCisgIFdlYlBVcHNhbXBsZXJzW01PREVfUkdCXSAgICAgICA9IFVwc2FtcGxlUmdiTGluZVBhaXI7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfQkdSXSAgICAgICA9IFVwc2FtcGxlQmdyTGluZVBhaXI7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfQVJHQl0gICAgICA9IFVwc2FtcGxlQXJnYkxpbmVQYWlyOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX0FyZ2JdICAgICAgPSBVcHNhbXBsZUFyZ2JMaW5lUGFpcjsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9SR0JfNTY1XSAgID0gVXBzYW1wbGVSZ2I1NjVMaW5lUGFpcjsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9SR0JBXzQ0NDRdID0gVXBzYW1wbGVSZ2JhNDQ0NExpbmVQYWlyOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX3JnYkFfNDQ0NF0gPSBVcHNhbXBsZVJnYmE0NDQ0TGluZVBhaXI7CisjZW5kaWYgICAvLyBXRUJQX1JFRFVDRV9DU1AKK30KKworI2VuZGlmICAvLyBGQU5DWV9VUFNBTVBMSU5HCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfTVNBCisKKyNpZiAhKGRlZmluZWQoRkFOQ1lfVVBTQU1QTElORykgJiYgZGVmaW5lZChXRUJQX1VTRV9NU0EpKQorV0VCUF9EU1BfSU5JVF9TVFVCKFdlYlBJbml0VXBzYW1wbGVyc01TQSkKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC91cHNhbXBsaW5nX25lb24uYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvdXBzYW1wbGluZ19uZW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYwNWJhYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvdXBzYW1wbGluZ19uZW9uLmMKQEAgLTAsMCArMSwyOTEgQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBORU9OIHZlcnNpb24gb2YgWVVWIHRvIFJHQiB1cHNhbXBsaW5nIGZ1bmN0aW9ucy4KKy8vCisvLyBBdXRob3I6IG1hbnNAbWFuc3IuY29tIChNYW5zIFJ1bGxnYXJkKQorLy8gQmFzZWQgb24gU1NFIGNvZGUgYnk6IHNvbW5hdGhAZ29vZ2xlLmNvbSAoU29tbmF0aCBCYW5lcmplZSkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX05FT04pCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9hc3NlcnRfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0cmluZ19wb2VtLmgiCisjZWxzZQorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhcm1fbmVvbi5oPgorI2luY2x1ZGUgInNyYy9kc3AvbmVvbi5oIgorI2luY2x1ZGUgInNyYy9kc3AveXV2LmgiCisKKyNpZmRlZiBGQU5DWV9VUFNBTVBMSU5HCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFUvViB1cHNhbXBsaW5nCisKKy8vIExvYWRzIDkgcGl4ZWxzIGVhY2ggZnJvbSByb3dzIHIxIGFuZCByMiBhbmQgZ2VuZXJhdGVzIDE2IHBpeGVscy4KKyNkZWZpbmUgVVBTQU1QTEVfMTZQSVhFTFMocjEsIHIyLCBvdXQpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDh4OF90IGEgPSB2bGQxX3U4KHIxICsgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDh4OF90IGIgPSB2bGQxX3U4KHIxICsgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDh4OF90IGMgPSB2bGQxX3U4KHIyICsgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDh4OF90IGQgPSB2bGQxX3U4KHIyICsgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgLyogYSArIGIgKyBjICsgZCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDE2eDhfdCBhZCA9IHZhZGRsX3U4KGEsICBkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDE2eDhfdCBiYyA9IHZhZGRsX3U4KGIsICBjKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDE2eDhfdCBhYmNkID0gdmFkZHFfdTE2KGFkLCBiYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgLyogM2EgKyAgYiArICBjICsgM2QgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDE2eDhfdCBhbCA9IHZhZGRxX3UxNihhYmNkLCB2c2hscV9uX3UxNihhZCwgMSkpOyAgICAgICAgICAgIFwKKyAgLyogIGEgKyAzYiArIDNjICsgIGQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDE2eDhfdCBibCA9IHZhZGRxX3UxNihhYmNkLCB2c2hscV9uX3UxNihiYywgMSkpOyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDh4OF90IGRpYWcyID0gdnNocm5fbl91MTYoYWwsIDMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDh4OF90IGRpYWcxID0gdnNocm5fbl91MTYoYmwsIDMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDh4OF90IEEgPSB2cmhhZGRfdTgoYSwgZGlhZzEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDh4OF90IEIgPSB2cmhhZGRfdTgoYiwgZGlhZzIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDh4OF90IEMgPSB2cmhhZGRfdTgoYywgZGlhZzIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDh4OF90IEQgPSB2cmhhZGRfdTgoZCwgZGlhZzEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdWludDh4OHgyX3QgQV9CLCBDX0Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSU5JVF9WRUNUT1IyKEFfQiwgQSwgQik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSU5JVF9WRUNUT1IyKENfRCwgQywgRCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdnN0Ml91OChvdXQgKyAgMCwgQV9CKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdnN0Ml91OChvdXQgKyAzMiwgQ19EKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKy8vIFR1cm4gdGhlIG1hY3JvIGludG8gYSBmdW5jdGlvbiBmb3IgcmVkdWNpbmcgY29kZS1zaXplIHdoZW4gbm9uLWNyaXRpY2FsCitzdGF0aWMgdm9pZCBVcHNhbXBsZTE2UGl4ZWxzX05FT04oY29uc3QgdWludDhfdCAqcjEsIGNvbnN0IHVpbnQ4X3QgKnIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKm91dCkgeworICBVUFNBTVBMRV8xNlBJWEVMUyhyMSwgcjIsIG91dCk7Cit9CisKKyNkZWZpbmUgVVBTQU1QTEVfTEFTVF9CTE9DSyh0YiwgYmIsIG51bV9waXhlbHMsIG91dCkgeyAgICAgICAgICAgICAgICAgIFwKKyAgdWludDhfdCByMVs5XSwgcjJbOV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbWVtY3B5KHIxLCAodGIpLCAobnVtX3BpeGVscykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbWVtY3B5KHIyLCAoYmIpLCAobnVtX3BpeGVscykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgLyogcmVwbGljYXRlIGxhc3QgYnl0ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbWVtc2V0KHIxICsgKG51bV9waXhlbHMpLCByMVsobnVtX3BpeGVscykgLSAxXSwgOSAtIChudW1fcGl4ZWxzKSk7ICAgIFwKKyAgbWVtc2V0KHIyICsgKG51bV9waXhlbHMpLCByMlsobnVtX3BpeGVscykgLSAxXSwgOSAtIChudW1fcGl4ZWxzKSk7ICAgIFwKKyAgVXBzYW1wbGUxNlBpeGVsc19ORU9OKHIxLCByMiwgb3V0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gWVVWLT5SR0IgY29udmVyc2lvbgorCisvLyBub3RlOiB3ZSByZXByZXNlbnQgdGhlIDMzMDUwIGxhcmdlIGNvbnN0YW50IGFzIDMyNzY4ICsgMjgyCitzdGF0aWMgY29uc3QgaW50MTZfdCBrQ29lZmZzMVs0XSA9IHsgMTkwNzcsIDI2MTQ5LCA2NDE5LCAxMzMyMCB9OworCisjZGVmaW5lIHYyNTUgdmR1cF9uX3U4KDI1NSkKKworI2RlZmluZSBTVE9SRV9SZ2Iob3V0LCByLCBnLCBiKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1aW50OHg4eDNfdCByX2dfYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTklUX1ZFQ1RPUjMocl9nX2IsIHIsIGcsIGIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2c3QzX3U4KG91dCwgcl9nX2IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBTVE9SRV9CZ3Iob3V0LCByLCBnLCBiKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1aW50OHg4eDNfdCBiX2dfcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTklUX1ZFQ1RPUjMoYl9nX3IsIGIsIGcsIHIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2c3QzX3U4KG91dCwgYl9nX3IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBTVE9SRV9SZ2JhKG91dCwgciwgZywgYikgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1aW50OHg4eDRfdCByX2dfYl92MjU1OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTklUX1ZFQ1RPUjQocl9nX2JfdjI1NSwgciwgZywgYiwgdjI1NSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2c3Q0X3U4KG91dCwgcl9nX2JfdjI1NSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBTVE9SRV9CZ3JhKG91dCwgciwgZywgYikgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1aW50OHg4eDRfdCBiX2dfcl92MjU1OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTklUX1ZFQ1RPUjQoYl9nX3JfdjI1NSwgYiwgZywgciwgdjI1NSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2c3Q0X3U4KG91dCwgYl9nX3JfdjI1NSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBTVE9SRV9BcmdiKG91dCwgciwgZywgYikgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1aW50OHg4eDRfdCB2MjU1X3JfZ19iOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTklUX1ZFQ1RPUjQodjI1NV9yX2dfYiwgdjI1NSwgciwgZywgYik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2c3Q0X3U4KG91dCwgdjI1NV9yX2dfYik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2lmICFkZWZpbmVkKFdFQlBfU1dBUF8xNkJJVF9DU1ApCisjZGVmaW5lIFpJUF9VOChsbywgaGkpIHZ6aXBfdTgoKGxvKSwgKGhpKSkKKyNlbHNlCisjZGVmaW5lIFpJUF9VOChsbywgaGkpIHZ6aXBfdTgoKGhpKSwgKGxvKSkKKyNlbmRpZgorCisjZGVmaW5lIFNUT1JFX1JnYmE0NDQ0KG91dCwgciwgZywgYikgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQ4eDhfdCByZyA9IHZzcmlfbl91OChyLCBnLCA0KTsgICAgICAvKiBzaGlmdCBnLCBpbnNlcnQgciAqLyBcCisgIGNvbnN0IHVpbnQ4eDhfdCBiYSA9IHZzcmlfbl91OChiLCB2MjU1LCA0KTsgICAvKiBzaGlmdCBhLCBpbnNlcnQgYiAqLyBcCisgIGNvbnN0IHVpbnQ4eDh4Ml90IHJnYmE0NDQ0ID0gWklQX1U4KHJnLCBiYSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZzdDFxX3U4KG91dCwgdmNvbWJpbmVfdTgocmdiYTQ0NDQudmFsWzBdLCByZ2JhNDQ0NC52YWxbMV0pKTsgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFNUT1JFX1JnYjU2NShvdXQsIHIsIGcsIGIpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQ4eDhfdCByZyA9IHZzcmlfbl91OChyLCBnLCA1KTsgICAvKiBzaGlmdCBnIGFuZCBpbnNlcnQgciAqLyBcCisgIGNvbnN0IHVpbnQ4eDhfdCBnMSA9IHZzaGxfbl91OChnLCAzKTsgICAgICAvKiBwcmUtc2hpZnQgZzogM2JpdHMgKi8gICBcCisgIGNvbnN0IHVpbnQ4eDhfdCBnYiA9IHZzcmlfbl91OChnMSwgYiwgMyk7ICAvKiBzaGlmdCBiIGFuZCBpbnNlcnQgZyAqLyBcCisgIGNvbnN0IHVpbnQ4eDh4Ml90IHJnYjU2NSA9IFpJUF9VOChyZywgZ2IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZzdDFxX3U4KG91dCwgdmNvbWJpbmVfdTgocmdiNTY1LnZhbFswXSwgcmdiNTY1LnZhbFsxXSkpOyAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIENPTlZFUlQ4KEZNVCwgWFNURVAsIE4sIHNyY195LCBzcmNfdXYsIG91dCwgY3VyX3gpIGRvIHsgICAgICAgICBcCisgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZvciAoaSA9IDA7IGkgPCBOOyBpICs9IDgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IG9mZiA9ICgoY3VyX3gpICsgaSkgKiBYU1RFUDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDh4OF90IHkgID0gdmxkMV91OCgoc3JjX3kpICsgKGN1cl94KSAgKyBpKTsgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDh4OF90IHUgID0gdmxkMV91OCgoc3JjX3V2KSArIGkgKyAgMCk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDh4OF90IHYgID0gdmxkMV91OCgoc3JjX3V2KSArIGkgKyAxNik7ICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50MTZ4OF90IFkwID0gdnJlaW50ZXJwcmV0cV9zMTZfdTE2KHZzaGxsX25fdTgoeSwgNykpOyAgICAgICBcCisgICAgY29uc3QgaW50MTZ4OF90IFUwID0gdnJlaW50ZXJwcmV0cV9zMTZfdTE2KHZzaGxsX25fdTgodSwgNykpOyAgICAgICBcCisgICAgY29uc3QgaW50MTZ4OF90IFYwID0gdnJlaW50ZXJwcmV0cV9zMTZfdTE2KHZzaGxsX25fdTgodiwgNykpOyAgICAgICBcCisgICAgY29uc3QgaW50MTZ4OF90IFkxID0gdnFkbXVsaHFfbGFuZV9zMTYoWTAsIGNvZWZmMSwgMCk7ICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50MTZ4OF90IFIwID0gdnFkbXVsaHFfbGFuZV9zMTYoVjAsIGNvZWZmMSwgMSk7ICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50MTZ4OF90IEcwID0gdnFkbXVsaHFfbGFuZV9zMTYoVTAsIGNvZWZmMSwgMik7ICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50MTZ4OF90IEcxID0gdnFkbXVsaHFfbGFuZV9zMTYoVjAsIGNvZWZmMSwgMyk7ICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50MTZ4OF90IEIwID0gdnFkbXVsaHFfbl9zMTYoVTAsIDI4Mik7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50MTZ4OF90IFIxID0gdnFhZGRxX3MxNihZMSwgUl9Sb3VuZGVyKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50MTZ4OF90IEcyID0gdnFhZGRxX3MxNihZMSwgR19Sb3VuZGVyKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50MTZ4OF90IEIxID0gdnFhZGRxX3MxNihZMSwgQl9Sb3VuZGVyKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50MTZ4OF90IFIyID0gdnFhZGRxX3MxNihSMCwgUjEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50MTZ4OF90IEczID0gdnFhZGRxX3MxNihHMCwgRzEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50MTZ4OF90IEIyID0gdnFhZGRxX3MxNihCMCwgQjEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50MTZ4OF90IEc0ID0gdnFzdWJxX3MxNihHMiwgRzMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50MTZ4OF90IEIzID0gdnFhZGRxX3MxNihCMiwgVTApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDh4OF90IFIgPSB2cXNocnVuX25fczE2KFIyLCBZVVZfRklYMik7ICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDh4OF90IEcgPSB2cXNocnVuX25fczE2KEc0LCBZVVZfRklYMik7ICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDh4OF90IEIgPSB2cXNocnVuX25fczE2KEIzLCBZVVZfRklYMik7ICAgICAgICAgICAgICAgICAgICBcCisgICAgU1RPUkVfICMjIEZNVChvdXQgKyBvZmYsIFIsIEcsIEIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIENPTlZFUlQxKEZVTkMsIFhTVEVQLCBOLCBzcmNfeSwgc3JjX3V2LCByZ2IsIGN1cl94KSB7ICAgICAgICAgICBcCisgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZvciAoaSA9IDA7IGkgPCBOOyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IG9mZiA9ICgoY3VyX3gpICsgaSkgKiBYU1RFUDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IHkgPSBzcmNfeVsoY3VyX3gpICsgaV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IHUgPSAoc3JjX3V2KVtpXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IHYgPSAoc3JjX3V2KVtpICsgMTZdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRlVOQyh5LCB1LCB2LCByZ2IgKyBvZmYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ09OVkVSVDJSR0JfOChGTVQsIFhTVEVQLCB0b3BfeSwgYm90dG9tX3ksIHV2LCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICB0b3BfZHN0LCBib3R0b21fZHN0LCBjdXJfeCwgbGVuKSB7ICAgICAgICAgICAgICAgIFwKKyAgQ09OVkVSVDgoRk1ULCBYU1RFUCwgbGVuLCB0b3BfeSwgdXYsIHRvcF9kc3QsIGN1cl94KTsgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGJvdHRvbV95ICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDT05WRVJUOChGTVQsIFhTVEVQLCBsZW4sIGJvdHRvbV95LCAodXYpICsgMzIsIGJvdHRvbV9kc3QsIGN1cl94KTsgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDT05WRVJUMlJHQl8xKEZVTkMsIFhTVEVQLCB0b3BfeSwgYm90dG9tX3ksIHV2LCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIHRvcF9kc3QsIGJvdHRvbV9kc3QsIGN1cl94LCBsZW4pIHsgICAgICAgICAgICAgICAgXAorICBDT05WRVJUMShGVU5DLCBYU1RFUCwgbGVuLCB0b3BfeSwgdXYsIHRvcF9kc3QsIGN1cl94KTsgICAgICAgICAgICAgICAgXAorICBpZiAoYm90dG9tX3kgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIENPTlZFUlQxKEZVTkMsIFhTVEVQLCBsZW4sIGJvdHRvbV95LCAodXYpICsgMzIsIGJvdHRvbV9kc3QsIGN1cl94KTsgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIE5FT05fVVBTQU1QTEVfRlVOQyhGVU5DX05BTUUsIEZNVCwgWFNURVApICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBGVU5DX05BTUUoY29uc3QgdWludDhfdCAqdG9wX3ksIGNvbnN0IHVpbnQ4X3QgKmJvdHRvbV95LCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqdG9wX3UsIGNvbnN0IHVpbnQ4X3QgKnRvcF92LCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqY3VyX3UsIGNvbnN0IHVpbnQ4X3QgKmN1cl92LCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqdG9wX2RzdCwgdWludDhfdCAqYm90dG9tX2RzdCwgaW50IGxlbikgeyBcCisgIGludCBibG9jazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIC8qIDE2IGJ5dGUgYWxpZ25lZCBhcnJheSB0byBjYWNoZSByZWNvbnN0cnVjdGVkIHUgYW5kIHYgKi8gICAgICAgICAgICBcCisgIHVpbnQ4X3QgdXZfYnVmWzIgKiAzMiArIDE1XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVpbnQ4X3QgKmNvbnN0IHJfdXYgPSAodWludDhfdCopKCh1aW50cHRyX3QpKHV2X2J1ZiArIDE1KSAmIH4xNSk7ICAgICBcCisgIGNvbnN0IGludCB1dl9sZW4gPSAobGVuICsgMSkgPj4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIC8qIDkgcGl4ZWxzIG11c3QgYmUgcmVhZC1hYmxlIGZvciBlYWNoIGJsb2NrICovICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IGludCBudW1fYmxvY2tzID0gKHV2X2xlbiAtIDEpID4+IDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IGludCBsZWZ0b3ZlciA9IHV2X2xlbiAtIG51bV9ibG9ja3MgKiA4OyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IGludCBsYXN0X3BvcyA9IDEgKyAxNiAqIG51bV9ibG9ja3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IGludCB1X2RpYWcgPSAoKHRvcF91WzBdICsgY3VyX3VbMF0pID4+IDEpICsgMTsgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IGludCB2X2RpYWcgPSAoKHRvcF92WzBdICsgY3VyX3ZbMF0pID4+IDEpICsgMTsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IGludDE2eDRfdCBjb2VmZjEgPSB2bGQxX3MxNihrQ29lZmZzMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IGludDE2eDhfdCBSX1JvdW5kZXIgPSB2ZHVwcV9uX3MxNigtMTQyMzQpOyAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IGludDE2eDhfdCBHX1JvdW5kZXIgPSB2ZHVwcV9uX3MxNig4NzA4KTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IGludDE2eDhfdCBCX1JvdW5kZXIgPSB2ZHVwcV9uX3MxNigtMTc2ODUpOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIC8qIFRyZWF0IHRoZSBmaXJzdCBwaXhlbCBpbiByZWd1bGFyIHdheSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGFzc2VydCh0b3BfeSAhPSBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IHUwID0gKHRvcF91WzBdICsgdV9kaWFnKSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IHYwID0gKHRvcF92WzBdICsgdl9kaWFnKSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVlA4WXV2VG8gIyMgRk1UKHRvcF95WzBdLCB1MCwgdjAsIHRvcF9kc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChib3R0b21feSAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IHUwID0gKGN1cl91WzBdICsgdV9kaWFnKSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IHYwID0gKGN1cl92WzBdICsgdl9kaWFnKSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVlA4WXV2VG8gIyMgRk1UKGJvdHRvbV95WzBdLCB1MCwgdjAsIGJvdHRvbV9kc3QpOyAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZvciAoYmxvY2sgPSAwOyBibG9jayA8IG51bV9ibG9ja3M7ICsrYmxvY2spIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVVBTQU1QTEVfMTZQSVhFTFModG9wX3UsIGN1cl91LCByX3V2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVVBTQU1QTEVfMTZQSVhFTFModG9wX3YsIGN1cl92LCByX3V2ICsgMTYpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ09OVkVSVDJSR0JfOChGTVQsIFhTVEVQLCB0b3BfeSwgYm90dG9tX3ksIHJfdXYsICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICB0b3BfZHN0LCBib3R0b21fZHN0LCAxNiAqIGJsb2NrICsgMSwgMTYpOyAgICAgICAgICAgICBcCisgICAgdG9wX3UgKz0gODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY3VyX3UgKz0gODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdG9wX3YgKz0gODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY3VyX3YgKz0gODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFVQU0FNUExFX0xBU1RfQkxPQ0sodG9wX3UsIGN1cl91LCBsZWZ0b3Zlciwgcl91dik7ICAgICAgICAgICAgICAgICAgICBcCisgIFVQU0FNUExFX0xBU1RfQkxPQ0sodG9wX3YsIGN1cl92LCBsZWZ0b3Zlciwgcl91diArIDE2KTsgICAgICAgICAgICAgICBcCisgIENPTlZFUlQyUkdCXzEoVlA4WXV2VG8gIyMgRk1ULCBYU1RFUCwgdG9wX3ksIGJvdHRvbV95LCByX3V2LCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgdG9wX2RzdCwgYm90dG9tX2RzdCwgbGFzdF9wb3MsIGxlbiAtIGxhc3RfcG9zKTsgICAgICAgICBcCit9CisKKy8vIE5FT04gdmFyaWFudHMgb2YgdGhlIGZhbmN5IHVwc2FtcGxlci4KK05FT05fVVBTQU1QTEVfRlVOQyhVcHNhbXBsZVJnYmFMaW5lUGFpcl9ORU9OLCBSZ2JhLCA0KQorTkVPTl9VUFNBTVBMRV9GVU5DKFVwc2FtcGxlQmdyYUxpbmVQYWlyX05FT04sIEJncmEsIDQpCisjaWYgIWRlZmluZWQoV0VCUF9SRURVQ0VfQ1NQKQorTkVPTl9VUFNBTVBMRV9GVU5DKFVwc2FtcGxlUmdiTGluZVBhaXJfTkVPTiwgIFJnYiwgIDMpCitORU9OX1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVCZ3JMaW5lUGFpcl9ORU9OLCAgQmdyLCAgMykKK05FT05fVVBTQU1QTEVfRlVOQyhVcHNhbXBsZUFyZ2JMaW5lUGFpcl9ORU9OLCBBcmdiLCA0KQorTkVPTl9VUFNBTVBMRV9GVU5DKFVwc2FtcGxlUmdiYTQ0NDRMaW5lUGFpcl9ORU9OLCBSZ2JhNDQ0NCwgMikKK05FT05fVVBTQU1QTEVfRlVOQyhVcHNhbXBsZVJnYjU2NUxpbmVQYWlyX05FT04sIFJnYjU2NSwgMikKKyNlbmRpZiAgIC8vIFdFQlBfUkVEVUNFX0NTUAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIFdlYlBVcHNhbXBsZUxpbmVQYWlyRnVuYyBXZWJQVXBzYW1wbGVyc1svKiBNT0RFX0xBU1QgKi9dOworCitleHRlcm4gdm9pZCBXZWJQSW5pdFVwc2FtcGxlcnNORU9OKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgV2ViUEluaXRVcHNhbXBsZXJzTkVPTih2b2lkKSB7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfUkdCQV0gPSBVcHNhbXBsZVJnYmFMaW5lUGFpcl9ORU9OOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX0JHUkFdID0gVXBzYW1wbGVCZ3JhTGluZVBhaXJfTkVPTjsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9yZ2JBXSA9IFVwc2FtcGxlUmdiYUxpbmVQYWlyX05FT047CisgIFdlYlBVcHNhbXBsZXJzW01PREVfYmdyQV0gPSBVcHNhbXBsZUJncmFMaW5lUGFpcl9ORU9OOworI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX0NTUCkKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9SR0JdICA9IFVwc2FtcGxlUmdiTGluZVBhaXJfTkVPTjsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9CR1JdICA9IFVwc2FtcGxlQmdyTGluZVBhaXJfTkVPTjsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9BUkdCXSA9IFVwc2FtcGxlQXJnYkxpbmVQYWlyX05FT047CisgIFdlYlBVcHNhbXBsZXJzW01PREVfQXJnYl0gPSBVcHNhbXBsZUFyZ2JMaW5lUGFpcl9ORU9OOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX1JHQl81NjVdID0gVXBzYW1wbGVSZ2I1NjVMaW5lUGFpcl9ORU9OOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX1JHQkFfNDQ0NF0gPSBVcHNhbXBsZVJnYmE0NDQ0TGluZVBhaXJfTkVPTjsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9yZ2JBXzQ0NDRdID0gVXBzYW1wbGVSZ2JhNDQ0NExpbmVQYWlyX05FT047CisjZW5kaWYgICAvLyBXRUJQX1JFRFVDRV9DU1AKK30KKworI2VuZGlmICAvLyBGQU5DWV9VUFNBTVBMSU5HCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfTkVPTgorCisjaWYgIShkZWZpbmVkKEZBTkNZX1VQU0FNUExJTkcpICYmIGRlZmluZWQoV0VCUF9VU0VfTkVPTikpCitXRUJQX0RTUF9JTklUX1NUVUIoV2ViUEluaXRVcHNhbXBsZXJzTkVPTikKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC91cHNhbXBsaW5nX3NzZTIuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvdXBzYW1wbGluZ19zc2UyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVhMzc0NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvdXBzYW1wbGluZ19zc2UyLmMKQEAgLTAsMCArMSwyNzMgQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBTU0UyIHZlcnNpb24gb2YgWVVWIHRvIFJHQiB1cHNhbXBsaW5nIGZ1bmN0aW9ucy4KKy8vCisvLyBBdXRob3I6IHNvbW5hdGhAZ29vZ2xlLmNvbSAoU29tbmF0aCBCYW5lcmplZSkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTIpCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9hc3NlcnRfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0cmluZ19wb2VtLmgiCisjZWxzZQorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxlbW1pbnRyaW4uaD4KKyNpbmNsdWRlICJzcmMvZHNwL3l1di5oIgorCisjaWZkZWYgRkFOQ1lfVVBTQU1QTElORworCisvLyBXZSBjb21wdXRlICg5KmEgKyAzKmIgKyAzKmMgKyBkICsgOCkgLyAxNiBhcyBmb2xsb3dzCisvLyB1ID0gKDkqYSArIDMqYiArIDMqYyArIGQgKyA4KSAvIDE2CisvLyAgID0gKGEgKyAoYSArIDMqYiArIDMqYyArIGQpIC8gOCArIDEpIC8gMgorLy8gICA9IChhICsgbSArIDEpIC8gMgorLy8gd2hlcmUgbSA9IChhICsgMypiICsgMypjICsgZCkgLyA4CisvLyAgICAgICAgID0gKChhICsgYiArIGMgKyBkKSAvIDIgKyBiICsgYykgLyA0CisvLworLy8gTGV0J3Mgc2F5ICBrID0gKGEgKyBiICsgYyArIGQpIC8gNC4KKy8vIFdlIGNhbiBjb21wdXRlIGsgYXMKKy8vIGsgPSAocyArIHQgKyAxKSAvIDIgLSAoKGFeZCkgfCAoYl5jKSB8IChzXnQpKSAmIDEKKy8vIHdoZXJlIHMgPSAoYSArIGQgKyAxKSAvIDIgYW5kIHQgPSAoYiArIGMgKyAxKSAvIDIKKy8vCisvLyBUaGVuIG0gY2FuIGJlIHdyaXR0ZW4gYXMKKy8vIG0gPSAoayArIHQgKyAxKSAvIDIgLSAoKChiXmMpICYgKHNedCkpIHwgKGtedCkpICYgMQorCisvLyBDb21wdXRlcyBvdXQgPSAoayArIGluICsgMSkgLyAyIC0gKChpaiAmIChzXnQpKSB8IChrXmluKSkgJiAxCisjZGVmaW5lIEdFVF9NKGlqLCBpbiwgb3V0KSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIHRtcDAgPSBfbW1fYXZnX2VwdTgoaywgKGluKSk7ICAgICAvKiAoayArIGluICsgMSkgLyAyICovICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSB0bXAxID0gX21tX2FuZF9zaTEyOCgoaWopLCBzdCk7ICAgLyogKGlqKSAmIChzXnQpICovICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgdG1wMiA9IF9tbV94b3Jfc2kxMjgoaywgKGluKSk7ICAgIC8qIChrXmluKSAqLyAgICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIHRtcDMgPSBfbW1fb3Jfc2kxMjgodG1wMSwgdG1wMik7ICAvKiAoKGlqKSAmIChzXnQpKSB8IChrXmluKSAqL1wKKyAgY29uc3QgX19tMTI4aSB0bXA0ID0gX21tX2FuZF9zaTEyOCh0bXAzLCBvbmUpOyAgLyogJiAxIC0+IGxzYl9jb3JyZWN0aW9uICovICBcCisgIChvdXQpID0gX21tX3N1Yl9lcGk4KHRtcDAsIHRtcDQpOyAgICAvKiAoayArIGluICsgMSkgLyAyIC0gbHNiX2NvcnJlY3Rpb24gKi8gXAorfSB3aGlsZSAoMCkKKworLy8gcGFjayBhbmQgc3RvcmUgdHdvIGFsdGVybmF0aW5nIHBpeGVsIHJvd3MKKyNkZWZpbmUgUEFDS19BTkRfU1RPUkUoYSwgYiwgZGEsIGRiLCBvdXQpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgdF9hID0gX21tX2F2Z19lcHU4KGEsIGRhKTsgIC8qICg5YSArIDNiICsgM2MgKyAgZCArIDgpIC8gMTYgKi8gXAorICBjb25zdCBfX20xMjhpIHRfYiA9IF9tbV9hdmdfZXB1OChiLCBkYik7ICAvKiAoM2EgKyA5YiArICBjICsgM2QgKyA4KSAvIDE2ICovIFwKKyAgY29uc3QgX19tMTI4aSB0XzEgPSBfbW1fdW5wYWNrbG9fZXBpOCh0X2EsIHRfYik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgdF8yID0gX21tX3VucGFja2hpX2VwaTgodF9hLCB0X2IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfbW1fc3RvcmVfc2kxMjgoKChfX20xMjhpKikob3V0KSkgKyAwLCB0XzEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX21tX3N0b3JlX3NpMTI4KCgoX19tMTI4aSopKG91dCkpICsgMSwgdF8yKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisvLyBMb2FkcyAxNyBwaXhlbHMgZWFjaCBmcm9tIHJvd3MgcjEgYW5kIHIyIGFuZCBnZW5lcmF0ZXMgMzIgcGl4ZWxzLgorI2RlZmluZSBVUFNBTVBMRV8zMlBJWEVMUyhyMSwgcjIsIG91dCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBvbmUgPSBfbW1fc2V0MV9lcGk4KDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgYSA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJihyMSlbMF0pOyAgICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIGIgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSYocjEpWzFdKTsgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBjID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmKHIyKVswXSk7ICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgZCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJihyMilbMV0pOyAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBzID0gX21tX2F2Z19lcHU4KGEsIGQpOyAgICAgICAgLyogcyA9IChhICsgZCArIDEpIC8gMiAqLyAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgdCA9IF9tbV9hdmdfZXB1OChiLCBjKTsgICAgICAgIC8qIHQgPSAoYiArIGMgKyAxKSAvIDIgKi8gICAgICAgXAorICBjb25zdCBfX20xMjhpIHN0ID0gX21tX3hvcl9zaTEyOChzLCB0KTsgICAgICAvKiBzdCA9IHNedCAqLyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgYWQgPSBfbW1feG9yX3NpMTI4KGEsIGQpOyAgICAgIC8qIGFkID0gYV5kICovICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIGJjID0gX21tX3hvcl9zaTEyOChiLCBjKTsgICAgICAvKiBiYyA9IGJeYyAqLyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgdDEgPSBfbW1fb3Jfc2kxMjgoYWQsIGJjKTsgICAgIC8qIChhXmQpIHwgKGJeYykgKi8gICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIHQyID0gX21tX29yX3NpMTI4KHQxLCBzdCk7ICAgICAvKiAoYV5kKSB8IChiXmMpIHwgKHNedCkgKi8gICAgIFwKKyAgY29uc3QgX19tMTI4aSB0MyA9IF9tbV9hbmRfc2kxMjgodDIsIG9uZSk7ICAgLyogKGFeZCkgfCAoYl5jKSB8IChzXnQpICYgMSAqLyBcCisgIGNvbnN0IF9fbTEyOGkgdDQgPSBfbW1fYXZnX2VwdTgocywgdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIGsgPSBfbW1fc3ViX2VwaTgodDQsIHQzKTsgICAgICAvKiBrID0gKGEgKyBiICsgYyArIGQpIC8gNCAqLyAgIFwKKyAgX19tMTI4aSBkaWFnMSwgZGlhZzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBHRVRfTShiYywgdCwgZGlhZzEpOyAgICAgICAgICAgICAgICAgIC8qIGRpYWcxID0gKGEgKyAzYiArIDNjICsgZCkgLyA4ICovICAgIFwKKyAgR0VUX00oYWQsIHMsIGRpYWcyKTsgICAgICAgICAgICAgICAgICAvKiBkaWFnMiA9ICgzYSArIGIgKyBjICsgM2QpIC8gOCAqLyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAvKiBwYWNrIHRoZSBhbHRlcm5hdGUgcGl4ZWxzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgUEFDS19BTkRfU1RPUkUoYSwgYiwgZGlhZzEsIGRpYWcyLCAob3V0KSArICAgICAgMCk7ICAvKiBzdG9yZSB0b3AgKi8gICAgICAgICBcCisgIFBBQ0tfQU5EX1NUT1JFKGMsIGQsIGRpYWcyLCBkaWFnMSwgKG91dCkgKyAyICogMzIpOyAgLyogc3RvcmUgYm90dG9tICovICAgICAgXAorfQorCisvLyBUdXJuIHRoZSBtYWNybyBpbnRvIGEgZnVuY3Rpb24gZm9yIHJlZHVjaW5nIGNvZGUtc2l6ZSB3aGVuIG5vbi1jcml0aWNhbAorc3RhdGljIHZvaWQgVXBzYW1wbGUzMlBpeGVsc19TU0UyKGNvbnN0IHVpbnQ4X3QgcjFbXSwgY29uc3QgdWludDhfdCByMltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IG91dCkgeworICBVUFNBTVBMRV8zMlBJWEVMUyhyMSwgcjIsIG91dCk7Cit9CisKKyNkZWZpbmUgVVBTQU1QTEVfTEFTVF9CTE9DSyh0YiwgYmIsIG51bV9waXhlbHMsIG91dCkgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVpbnQ4X3QgcjFbMTddLCByMlsxN107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBtZW1jcHkocjEsICh0YiksIChudW1fcGl4ZWxzKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbWVtY3B5KHIyLCAoYmIpLCAobnVtX3BpeGVscykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIC8qIHJlcGxpY2F0ZSBsYXN0IGJ5dGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBtZW1zZXQocjEgKyAobnVtX3BpeGVscyksIHIxWyhudW1fcGl4ZWxzKSAtIDFdLCAxNyAtIChudW1fcGl4ZWxzKSk7ICAgICAgICAgIFwKKyAgbWVtc2V0KHIyICsgKG51bV9waXhlbHMpLCByMlsobnVtX3BpeGVscykgLSAxXSwgMTcgLSAobnVtX3BpeGVscykpOyAgICAgICAgICBcCisgIC8qIHVzaW5nIHRoZSBzaGFyZWQgZnVuY3Rpb24gaW5zdGVhZCBvZiB0aGUgbWFjcm8gc2F2ZXMgfjNrIGNvZGUgc2l6ZSAqLyAgICAgXAorICBVcHNhbXBsZTMyUGl4ZWxzX1NTRTIocjEsIHIyLCBvdXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDT05WRVJUMlJHQl8zMihGVU5DLCBYU1RFUCwgdG9wX3ksIGJvdHRvbV95LCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgdG9wX2RzdCwgYm90dG9tX2RzdCwgY3VyX3gpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZVTkMjIzMyX1NTRTIoKHRvcF95KSArIChjdXJfeCksIHJfdSwgcl92LCAodG9wX2RzdCkgKyAoY3VyX3gpICogKFhTVEVQKSk7ICAgXAorICBpZiAoKGJvdHRvbV95KSAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGVU5DIyMzMl9TU0UyKChib3R0b21feSkgKyAoY3VyX3gpLCByX3UgKyA2NCwgcl92ICsgNjQsICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAoYm90dG9tX2RzdCkgKyAoY3VyX3gpICogKFhTVEVQKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgU1NFMl9VUFNBTVBMRV9GVU5DKEZVTkNfTkFNRSwgRlVOQywgWFNURVApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBGVU5DX05BTUUoY29uc3QgdWludDhfdCogdG9wX3ksIGNvbnN0IHVpbnQ4X3QqIGJvdHRvbV95LCAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcF91LCBjb25zdCB1aW50OF90KiB0b3BfdiwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjdXJfdSwgY29uc3QgdWludDhfdCogY3VyX3YsICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdG9wX2RzdCwgdWludDhfdCogYm90dG9tX2RzdCwgaW50IGxlbikgeyAgICAgICAgXAorICBpbnQgdXZfcG9zLCBwb3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgLyogMTZieXRlLWFsaWduZWQgYXJyYXkgdG8gY2FjaGUgcmVjb25zdHJ1Y3RlZCB1IGFuZCB2ICovICAgICAgICAgICAgICAgICAgICBcCisgIHVpbnQ4X3QgdXZfYnVmWzE0ICogMzIgKyAxNV0gPSB7IDAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1aW50OF90KiBjb25zdCByX3UgPSAodWludDhfdCopKCh1aW50cHRyX3QpKHV2X2J1ZiArIDE1KSAmIH4xNSk7ICAgICAgICAgICAgIFwKKyAgdWludDhfdCogY29uc3Qgcl92ID0gcl91ICsgMzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBhc3NlcnQodG9wX3kgIT0gTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgIC8qIFRyZWF0IHRoZSBmaXJzdCBwaXhlbCBpbiByZWd1bGFyIHdheSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IHVfZGlhZyA9ICgodG9wX3VbMF0gKyBjdXJfdVswXSkgPj4gMSkgKyAxOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCB2X2RpYWcgPSAoKHRvcF92WzBdICsgY3VyX3ZbMF0pID4+IDEpICsgMTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgdTBfdCA9ICh0b3BfdVswXSArIHVfZGlhZykgPj4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IHYwX3QgPSAodG9wX3ZbMF0gKyB2X2RpYWcpID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZVTkModG9wX3lbMF0sIHUwX3QsIHYwX3QsIHRvcF9kc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoYm90dG9tX3kgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCBpbnQgdTBfYiA9IChjdXJfdVswXSArIHVfZGlhZykgPj4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY29uc3QgaW50IHYwX2IgPSAoY3VyX3ZbMF0gKyB2X2RpYWcpID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEZVTkMoYm90dG9tX3lbMF0sIHUwX2IsIHYwX2IsIGJvdHRvbV9kc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgLyogRm9yIFVQU0FNUExFXzMyUElYRUxTLCAxNyB1L3YgdmFsdWVzIG11c3QgYmUgcmVhZC1hYmxlIGZvciBlYWNoIGJsb2NrICovICBcCisgIGZvciAocG9zID0gMSwgdXZfcG9zID0gMDsgcG9zICsgMzIgKyAxIDw9IGxlbjsgcG9zICs9IDMyLCB1dl9wb3MgKz0gMTYpIHsgICAgXAorICAgIFVQU0FNUExFXzMyUElYRUxTKHRvcF91ICsgdXZfcG9zLCBjdXJfdSArIHV2X3Bvcywgcl91KTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBVUFNBTVBMRV8zMlBJWEVMUyh0b3BfdiArIHV2X3BvcywgY3VyX3YgKyB1dl9wb3MsIHJfdik7ICAgICAgICAgICAgICAgICAgICBcCisgICAgQ09OVkVSVDJSR0JfMzIoRlVOQywgWFNURVAsIHRvcF95LCBib3R0b21feSwgdG9wX2RzdCwgYm90dG9tX2RzdCwgcG9zKTsgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGxlbiA+IDEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IGxlZnRfb3ZlciA9ICgobGVuICsgMSkgPj4gMSkgLSAocG9zID4+IDEpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQ4X3QqIGNvbnN0IHRtcF90b3BfZHN0ID0gcl91ICsgNCAqIDMyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90KiBjb25zdCB0bXBfYm90dG9tX2RzdCA9IHRtcF90b3BfZHN0ICsgNCAqIDMyOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCogY29uc3QgdG1wX3RvcCA9IHRtcF9ib3R0b21fZHN0ICsgNCAqIDMyOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQ4X3QqIGNvbnN0IHRtcF9ib3R0b20gPSAoYm90dG9tX3kgPT0gTlVMTCkgPyBOVUxMIDogdG1wX3RvcCArIDMyOyAgICAgIFwKKyAgICBhc3NlcnQobGVmdF9vdmVyID4gMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVVBTQU1QTEVfTEFTVF9CTE9DSyh0b3BfdSArIHV2X3BvcywgY3VyX3UgKyB1dl9wb3MsIGxlZnRfb3Zlciwgcl91KTsgICAgICAgXAorICAgIFVQU0FNUExFX0xBU1RfQkxPQ0sodG9wX3YgKyB1dl9wb3MsIGN1cl92ICsgdXZfcG9zLCBsZWZ0X292ZXIsIHJfdik7ICAgICAgIFwKKyAgICBtZW1jcHkodG1wX3RvcCwgdG9wX3kgKyBwb3MsIGxlbiAtIHBvcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGJvdHRvbV95ICE9IE5VTEwpIG1lbWNweSh0bXBfYm90dG9tLCBib3R0b21feSArIHBvcywgbGVuIC0gcG9zKTsgICAgICAgXAorICAgIENPTlZFUlQyUkdCXzMyKEZVTkMsIFhTVEVQLCB0bXBfdG9wLCB0bXBfYm90dG9tLCB0bXBfdG9wX2RzdCwgICAgICAgICAgICAgIFwKKyAgICAgICAgIHRtcF9ib3R0b21fZHN0LCAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWVtY3B5KHRvcF9kc3QgKyBwb3MgKiAoWFNURVApLCB0bXBfdG9wX2RzdCwgKGxlbiAtIHBvcykgKiAoWFNURVApKTsgICAgICAgXAorICAgIGlmIChib3R0b21feSAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIG1lbWNweShib3R0b21fZHN0ICsgcG9zICogKFhTVEVQKSwgdG1wX2JvdHRvbV9kc3QsICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgKGxlbiAtIHBvcykgKiAoWFNURVApKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vIFNTRTIgdmFyaWFudHMgb2YgdGhlIGZhbmN5IHVwc2FtcGxlci4KK1NTRTJfVVBTQU1QTEVfRlVOQyhVcHNhbXBsZVJnYmFMaW5lUGFpcl9TU0UyLCBWUDhZdXZUb1JnYmEsIDQpCitTU0UyX1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVCZ3JhTGluZVBhaXJfU1NFMiwgVlA4WXV2VG9CZ3JhLCA0KQorCisjaWYgIWRlZmluZWQoV0VCUF9SRURVQ0VfQ1NQKQorU1NFMl9VUFNBTVBMRV9GVU5DKFVwc2FtcGxlUmdiTGluZVBhaXJfU1NFMiwgIFZQOFl1dlRvUmdiLCAgMykKK1NTRTJfVVBTQU1QTEVfRlVOQyhVcHNhbXBsZUJnckxpbmVQYWlyX1NTRTIsICBWUDhZdXZUb0JnciwgIDMpCitTU0UyX1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVBcmdiTGluZVBhaXJfU1NFMiwgVlA4WXV2VG9BcmdiLCA0KQorU1NFMl9VUFNBTVBMRV9GVU5DKFVwc2FtcGxlUmdiYTQ0NDRMaW5lUGFpcl9TU0UyLCBWUDhZdXZUb1JnYmE0NDQ0LCAyKQorU1NFMl9VUFNBTVBMRV9GVU5DKFVwc2FtcGxlUmdiNTY1TGluZVBhaXJfU1NFMiwgVlA4WXV2VG9SZ2I1NjUsIDIpCisjZW5kaWYgICAvLyBXRUJQX1JFRFVDRV9DU1AKKworI3VuZGVmIEdFVF9NCisjdW5kZWYgUEFDS19BTkRfU1RPUkUKKyN1bmRlZiBVUFNBTVBMRV8zMlBJWEVMUworI3VuZGVmIFVQU0FNUExFX0xBU1RfQkxPQ0sKKyN1bmRlZiBDT05WRVJUMlJHQgorI3VuZGVmIENPTlZFUlQyUkdCXzMyCisjdW5kZWYgU1NFMl9VUFNBTVBMRV9GVU5DCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gV2ViUFVwc2FtcGxlTGluZVBhaXJGdW5jIFdlYlBVcHNhbXBsZXJzWy8qIE1PREVfTEFTVCAqL107CisKK2V4dGVybiB2b2lkIFdlYlBJbml0VXBzYW1wbGVyc1NTRTIodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBXZWJQSW5pdFVwc2FtcGxlcnNTU0UyKHZvaWQpIHsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9SR0JBXSA9IFVwc2FtcGxlUmdiYUxpbmVQYWlyX1NTRTI7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfQkdSQV0gPSBVcHNhbXBsZUJncmFMaW5lUGFpcl9TU0UyOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX3JnYkFdID0gVXBzYW1wbGVSZ2JhTGluZVBhaXJfU1NFMjsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9iZ3JBXSA9IFVwc2FtcGxlQmdyYUxpbmVQYWlyX1NTRTI7CisjaWYgIWRlZmluZWQoV0VCUF9SRURVQ0VfQ1NQKQorICBXZWJQVXBzYW1wbGVyc1tNT0RFX1JHQl0gID0gVXBzYW1wbGVSZ2JMaW5lUGFpcl9TU0UyOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX0JHUl0gID0gVXBzYW1wbGVCZ3JMaW5lUGFpcl9TU0UyOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX0FSR0JdID0gVXBzYW1wbGVBcmdiTGluZVBhaXJfU1NFMjsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9BcmdiXSA9IFVwc2FtcGxlQXJnYkxpbmVQYWlyX1NTRTI7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfUkdCXzU2NV0gPSBVcHNhbXBsZVJnYjU2NUxpbmVQYWlyX1NTRTI7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfUkdCQV80NDQ0XSA9IFVwc2FtcGxlUmdiYTQ0NDRMaW5lUGFpcl9TU0UyOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX3JnYkFfNDQ0NF0gPSBVcHNhbXBsZVJnYmE0NDQ0TGluZVBhaXJfU1NFMjsKKyNlbmRpZiAgIC8vIFdFQlBfUkVEVUNFX0NTUAorfQorCisjZW5kaWYgIC8vIEZBTkNZX1VQU0FNUExJTkcKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZXh0ZXJuIFdlYlBZVVY0NDRDb252ZXJ0ZXIgV2ViUFlVVjQ0NENvbnZlcnRlcnNbLyogTU9ERV9MQVNUICovXTsKK2V4dGVybiB2b2lkIFdlYlBJbml0WVVWNDQ0Q29udmVydGVyc1NTRTIodm9pZCk7CisKKyNkZWZpbmUgWVVWNDQ0X0ZVTkMoRlVOQ19OQU1FLCBDQUxMLCBDQUxMX0MsIFhTVEVQKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitleHRlcm4gdm9pZCBDQUxMX0MoY29uc3QgdWludDhfdCogeSwgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwgICAgICAgXAorICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGxlbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIEZVTkNfTkFNRShjb25zdCB1aW50OF90KiB5LCBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgbGVuKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgaW50IG1heF9sZW4gPSBsZW4gJiB+MzE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZvciAoaSA9IDA7IGkgPCBtYXhfbGVuOyBpICs9IDMyKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIENBTEwoeSArIGksIHUgKyBpLCB2ICsgaSwgZHN0ICsgaSAqIChYU1RFUCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChpIDwgbGVuKSB7ICAvKiBDLWZhbGxiYWNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIENBTExfQyh5ICsgaSwgdSArIGksIHYgKyBpLCBkc3QgKyBpICogKFhTVEVQKSwgbGVuIC0gaSk7ICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK1lVVjQ0NF9GVU5DKFl1djQ0NFRvUmdiYV9TU0UyLCBWUDhZdXZUb1JnYmEzMl9TU0UyLCBXZWJQWXV2NDQ0VG9SZ2JhX0MsIDQpOworWVVWNDQ0X0ZVTkMoWXV2NDQ0VG9CZ3JhX1NTRTIsIFZQOFl1dlRvQmdyYTMyX1NTRTIsIFdlYlBZdXY0NDRUb0JncmFfQywgNCk7CisjaWYgIWRlZmluZWQoV0VCUF9SRURVQ0VfQ1NQKQorWVVWNDQ0X0ZVTkMoWXV2NDQ0VG9SZ2JfU1NFMiwgVlA4WXV2VG9SZ2IzMl9TU0UyLCBXZWJQWXV2NDQ0VG9SZ2JfQywgMyk7CitZVVY0NDRfRlVOQyhZdXY0NDRUb0Jncl9TU0UyLCBWUDhZdXZUb0JncjMyX1NTRTIsIFdlYlBZdXY0NDRUb0Jncl9DLCAzKTsKK1lVVjQ0NF9GVU5DKFl1djQ0NFRvQXJnYl9TU0UyLCBWUDhZdXZUb0FyZ2IzMl9TU0UyLCBXZWJQWXV2NDQ0VG9BcmdiX0MsIDQpCitZVVY0NDRfRlVOQyhZdXY0NDRUb1JnYmE0NDQ0X1NTRTIsIFZQOFl1dlRvUmdiYTQ0NDQzMl9TU0UyLCBcCisgICAgICAgICAgICBXZWJQWXV2NDQ0VG9SZ2JhNDQ0NF9DLCAyKQorWVVWNDQ0X0ZVTkMoWXV2NDQ0VG9SZ2I1NjVfU1NFMiwgVlA4WXV2VG9SZ2I1NjUzMl9TU0UyLCBXZWJQWXV2NDQ0VG9SZ2I1NjVfQywgMikKKyNlbmRpZiAgIC8vIFdFQlBfUkVEVUNFX0NTUAorCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgV2ViUEluaXRZVVY0NDRDb252ZXJ0ZXJzU1NFMih2b2lkKSB7CisgIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW01PREVfUkdCQV0gICAgICA9IFl1djQ0NFRvUmdiYV9TU0UyOworICBXZWJQWVVWNDQ0Q29udmVydGVyc1tNT0RFX0JHUkFdICAgICAgPSBZdXY0NDRUb0JncmFfU1NFMjsKKyAgV2ViUFlVVjQ0NENvbnZlcnRlcnNbTU9ERV9yZ2JBXSAgICAgID0gWXV2NDQ0VG9SZ2JhX1NTRTI7CisgIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW01PREVfYmdyQV0gICAgICA9IFl1djQ0NFRvQmdyYV9TU0UyOworI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX0NTUCkKKyAgV2ViUFlVVjQ0NENvbnZlcnRlcnNbTU9ERV9SR0JdICAgICAgID0gWXV2NDQ0VG9SZ2JfU1NFMjsKKyAgV2ViUFlVVjQ0NENvbnZlcnRlcnNbTU9ERV9CR1JdICAgICAgID0gWXV2NDQ0VG9CZ3JfU1NFMjsKKyAgV2ViUFlVVjQ0NENvbnZlcnRlcnNbTU9ERV9BUkdCXSAgICAgID0gWXV2NDQ0VG9BcmdiX1NTRTI7CisgIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW01PREVfUkdCQV80NDQ0XSA9IFl1djQ0NFRvUmdiYTQ0NDRfU1NFMjsKKyAgV2ViUFlVVjQ0NENvbnZlcnRlcnNbTU9ERV9SR0JfNTY1XSAgID0gWXV2NDQ0VG9SZ2I1NjVfU1NFMjsKKyAgV2ViUFlVVjQ0NENvbnZlcnRlcnNbTU9ERV9BcmdiXSAgICAgID0gWXV2NDQ0VG9BcmdiX1NTRTI7CisgIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW01PREVfcmdiQV80NDQ0XSA9IFl1djQ0NFRvUmdiYTQ0NDRfU1NFMjsKKyNlbmRpZiAgIC8vIFdFQlBfUkVEVUNFX0NTUAorfQorCisjZWxzZQorCitXRUJQX0RTUF9JTklUX1NUVUIoV2ViUEluaXRZVVY0NDRDb252ZXJ0ZXJzU1NFMikKKworI2VuZGlmICAvLyBXRUJQX1VTRV9TU0UyCisKKyNpZiAhKGRlZmluZWQoRkFOQ1lfVVBTQU1QTElORykgJiYgZGVmaW5lZChXRUJQX1VTRV9TU0UyKSkKK1dFQlBfRFNQX0lOSVRfU1RVQihXZWJQSW5pdFVwc2FtcGxlcnNTU0UyKQorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3Vwc2FtcGxpbmdfc3NlNDEuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvdXBzYW1wbGluZ19zc2U0MS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmYzRkZTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3Vwc2FtcGxpbmdfc3NlNDEuYwpAQCAtMCwwICsxLDI0NCBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFNTRTQxIHZlcnNpb24gb2YgWVVWIHRvIFJHQiB1cHNhbXBsaW5nIGZ1bmN0aW9ucy4KKy8vCisvLyBBdXRob3I6IHNvbW5hdGhAZ29vZ2xlLmNvbSAoU29tbmF0aCBCYW5lcmplZSkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTQxKQorCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vYXNzZXJ0X3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdfcG9lbS5oIgorI2Vsc2UKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHNtbWludHJpbi5oPgorI2luY2x1ZGUgInNyYy9kc3AveXV2LmgiCisKKyNpZmRlZiBGQU5DWV9VUFNBTVBMSU5HCisKKyNpZiAhZGVmaW5lZChXRUJQX1JFRFVDRV9DU1ApCisKKy8vIFdlIGNvbXB1dGUgKDkqYSArIDMqYiArIDMqYyArIGQgKyA4KSAvIDE2IGFzIGZvbGxvd3MKKy8vIHUgPSAoOSphICsgMypiICsgMypjICsgZCArIDgpIC8gMTYKKy8vICAgPSAoYSArIChhICsgMypiICsgMypjICsgZCkgLyA4ICsgMSkgLyAyCisvLyAgID0gKGEgKyBtICsgMSkgLyAyCisvLyB3aGVyZSBtID0gKGEgKyAzKmIgKyAzKmMgKyBkKSAvIDgKKy8vICAgICAgICAgPSAoKGEgKyBiICsgYyArIGQpIC8gMiArIGIgKyBjKSAvIDQKKy8vCisvLyBMZXQncyBzYXkgIGsgPSAoYSArIGIgKyBjICsgZCkgLyA0LgorLy8gV2UgY2FuIGNvbXB1dGUgayBhcworLy8gayA9IChzICsgdCArIDEpIC8gMiAtICgoYV5kKSB8IChiXmMpIHwgKHNedCkpICYgMQorLy8gd2hlcmUgcyA9IChhICsgZCArIDEpIC8gMiBhbmQgdCA9IChiICsgYyArIDEpIC8gMgorLy8KKy8vIFRoZW4gbSBjYW4gYmUgd3JpdHRlbiBhcworLy8gbSA9IChrICsgdCArIDEpIC8gMiAtICgoKGJeYykgJiAoc150KSkgfCAoa150KSkgJiAxCisKKy8vIENvbXB1dGVzIG91dCA9IChrICsgaW4gKyAxKSAvIDIgLSAoKGlqICYgKHNedCkpIHwgKGteaW4pKSAmIDEKKyNkZWZpbmUgR0VUX00oaWosIGluLCBvdXQpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgdG1wMCA9IF9tbV9hdmdfZXB1OChrLCAoaW4pKTsgICAgIC8qIChrICsgaW4gKyAxKSAvIDIgKi8gICAgICAgXAorICBjb25zdCBfX20xMjhpIHRtcDEgPSBfbW1fYW5kX3NpMTI4KChpaiksIHN0KTsgICAvKiAoaWopICYgKHNedCkgKi8gICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSB0bXAyID0gX21tX3hvcl9zaTEyOChrLCAoaW4pKTsgICAgLyogKGteaW4pICovICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgdG1wMyA9IF9tbV9vcl9zaTEyOCh0bXAxLCB0bXAyKTsgIC8qICgoaWopICYgKHNedCkpIHwgKGteaW4pICovXAorICBjb25zdCBfX20xMjhpIHRtcDQgPSBfbW1fYW5kX3NpMTI4KHRtcDMsIG9uZSk7ICAvKiAmIDEgLT4gbHNiX2NvcnJlY3Rpb24gKi8gIFwKKyAgKG91dCkgPSBfbW1fc3ViX2VwaTgodG1wMCwgdG1wNCk7ICAgIC8qIChrICsgaW4gKyAxKSAvIDIgLSBsc2JfY29ycmVjdGlvbiAqLyBcCit9IHdoaWxlICgwKQorCisvLyBwYWNrIGFuZCBzdG9yZSB0d28gYWx0ZXJuYXRpbmcgcGl4ZWwgcm93cworI2RlZmluZSBQQUNLX0FORF9TVE9SRShhLCBiLCBkYSwgZGIsIG91dCkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSB0X2EgPSBfbW1fYXZnX2VwdTgoYSwgZGEpOyAgLyogKDlhICsgM2IgKyAzYyArICBkICsgOCkgLyAxNiAqLyBcCisgIGNvbnN0IF9fbTEyOGkgdF9iID0gX21tX2F2Z19lcHU4KGIsIGRiKTsgIC8qICgzYSArIDliICsgIGMgKyAzZCArIDgpIC8gMTYgKi8gXAorICBjb25zdCBfX20xMjhpIHRfMSA9IF9tbV91bnBhY2tsb19lcGk4KHRfYSwgdF9iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSB0XzIgPSBfbW1fdW5wYWNraGlfZXBpOCh0X2EsIHRfYik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9tbV9zdG9yZV9zaTEyOCgoKF9fbTEyOGkqKShvdXQpKSArIDAsIHRfMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfbW1fc3RvcmVfc2kxMjgoKChfX20xMjhpKikob3V0KSkgKyAxLCB0XzIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKy8vIExvYWRzIDE3IHBpeGVscyBlYWNoIGZyb20gcm93cyByMSBhbmQgcjIgYW5kIGdlbmVyYXRlcyAzMiBwaXhlbHMuCisjZGVmaW5lIFVQU0FNUExFXzMyUElYRUxTKHIxLCByMiwgb3V0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIG9uZSA9IF9tbV9zZXQxX2VwaTgoMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBhID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmKHIxKVswXSk7ICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgYiA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJihyMSlbMV0pOyAgICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIGMgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSYocjIpWzBdKTsgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBkID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmKHIyKVsxXSk7ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIHMgPSBfbW1fYXZnX2VwdTgoYSwgZCk7ICAgICAgICAvKiBzID0gKGEgKyBkICsgMSkgLyAyICovICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSB0ID0gX21tX2F2Z19lcHU4KGIsIGMpOyAgICAgICAgLyogdCA9IChiICsgYyArIDEpIC8gMiAqLyAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgc3QgPSBfbW1feG9yX3NpMTI4KHMsIHQpOyAgICAgIC8qIHN0ID0gc150ICovICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBhZCA9IF9tbV94b3Jfc2kxMjgoYSwgZCk7ICAgICAgLyogYWQgPSBhXmQgKi8gICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgYmMgPSBfbW1feG9yX3NpMTI4KGIsIGMpOyAgICAgIC8qIGJjID0gYl5jICovICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSB0MSA9IF9tbV9vcl9zaTEyOChhZCwgYmMpOyAgICAgLyogKGFeZCkgfCAoYl5jKSAqLyAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgdDIgPSBfbW1fb3Jfc2kxMjgodDEsIHN0KTsgICAgIC8qIChhXmQpIHwgKGJeYykgfCAoc150KSAqLyAgICAgXAorICBjb25zdCBfX20xMjhpIHQzID0gX21tX2FuZF9zaTEyOCh0Miwgb25lKTsgICAvKiAoYV5kKSB8IChiXmMpIHwgKHNedCkgJiAxICovIFwKKyAgY29uc3QgX19tMTI4aSB0NCA9IF9tbV9hdmdfZXB1OChzLCB0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgayA9IF9tbV9zdWJfZXBpOCh0NCwgdDMpOyAgICAgIC8qIGsgPSAoYSArIGIgKyBjICsgZCkgLyA0ICovICAgXAorICBfX20xMjhpIGRpYWcxLCBkaWFnMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEdFVF9NKGJjLCB0LCBkaWFnMSk7ICAgICAgICAgICAgICAgICAgLyogZGlhZzEgPSAoYSArIDNiICsgM2MgKyBkKSAvIDggKi8gICAgXAorICBHRVRfTShhZCwgcywgZGlhZzIpOyAgICAgICAgICAgICAgICAgIC8qIGRpYWcyID0gKDNhICsgYiArIGMgKyAzZCkgLyA4ICovICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIC8qIHBhY2sgdGhlIGFsdGVybmF0ZSBwaXhlbHMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBQQUNLX0FORF9TVE9SRShhLCBiLCBkaWFnMSwgZGlhZzIsIChvdXQpICsgICAgICAwKTsgIC8qIHN0b3JlIHRvcCAqLyAgICAgICAgIFwKKyAgUEFDS19BTkRfU1RPUkUoYywgZCwgZGlhZzIsIGRpYWcxLCAob3V0KSArIDIgKiAzMik7ICAvKiBzdG9yZSBib3R0b20gKi8gICAgICBcCit9CisKKy8vIFR1cm4gdGhlIG1hY3JvIGludG8gYSBmdW5jdGlvbiBmb3IgcmVkdWNpbmcgY29kZS1zaXplIHdoZW4gbm9uLWNyaXRpY2FsCitzdGF0aWMgdm9pZCBVcHNhbXBsZTMyUGl4ZWxzX1NTRTQxKGNvbnN0IHVpbnQ4X3QgcjFbXSwgY29uc3QgdWludDhfdCByMltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IG91dCkgeworICBVUFNBTVBMRV8zMlBJWEVMUyhyMSwgcjIsIG91dCk7Cit9CisKKyNkZWZpbmUgVVBTQU1QTEVfTEFTVF9CTE9DSyh0YiwgYmIsIG51bV9waXhlbHMsIG91dCkgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVpbnQ4X3QgcjFbMTddLCByMlsxN107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBtZW1jcHkocjEsICh0YiksIChudW1fcGl4ZWxzKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbWVtY3B5KHIyLCAoYmIpLCAobnVtX3BpeGVscykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIC8qIHJlcGxpY2F0ZSBsYXN0IGJ5dGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBtZW1zZXQocjEgKyAobnVtX3BpeGVscyksIHIxWyhudW1fcGl4ZWxzKSAtIDFdLCAxNyAtIChudW1fcGl4ZWxzKSk7ICAgICAgICAgIFwKKyAgbWVtc2V0KHIyICsgKG51bV9waXhlbHMpLCByMlsobnVtX3BpeGVscykgLSAxXSwgMTcgLSAobnVtX3BpeGVscykpOyAgICAgICAgICBcCisgIC8qIHVzaW5nIHRoZSBzaGFyZWQgZnVuY3Rpb24gaW5zdGVhZCBvZiB0aGUgbWFjcm8gc2F2ZXMgfjNrIGNvZGUgc2l6ZSAqLyAgICAgXAorICBVcHNhbXBsZTMyUGl4ZWxzX1NTRTQxKHIxLCByMiwgb3V0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDT05WRVJUMlJHQl8zMihGVU5DLCBYU1RFUCwgdG9wX3ksIGJvdHRvbV95LCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgdG9wX2RzdCwgYm90dG9tX2RzdCwgY3VyX3gpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZVTkMjIzMyX1NTRTQxKCh0b3BfeSkgKyAoY3VyX3gpLCByX3UsIHJfdiwgKHRvcF9kc3QpICsgKGN1cl94KSAqIChYU1RFUCkpOyAgXAorICBpZiAoKGJvdHRvbV95KSAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGVU5DIyMzMl9TU0U0MSgoYm90dG9tX3kpICsgKGN1cl94KSwgcl91ICsgNjQsIHJfdiArIDY0LCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAoYm90dG9tX2RzdCkgKyAoY3VyX3gpICogKFhTVEVQKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgU1NFNF9VUFNBTVBMRV9GVU5DKEZVTkNfTkFNRSwgRlVOQywgWFNURVApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBGVU5DX05BTUUoY29uc3QgdWludDhfdCogdG9wX3ksIGNvbnN0IHVpbnQ4X3QqIGJvdHRvbV95LCAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcF91LCBjb25zdCB1aW50OF90KiB0b3BfdiwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjdXJfdSwgY29uc3QgdWludDhfdCogY3VyX3YsICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdG9wX2RzdCwgdWludDhfdCogYm90dG9tX2RzdCwgaW50IGxlbikgeyAgICAgICAgXAorICBpbnQgdXZfcG9zLCBwb3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgLyogMTZieXRlLWFsaWduZWQgYXJyYXkgdG8gY2FjaGUgcmVjb25zdHJ1Y3RlZCB1IGFuZCB2ICovICAgICAgICAgICAgICAgICAgICBcCisgIHVpbnQ4X3QgdXZfYnVmWzE0ICogMzIgKyAxNV0gPSB7IDAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1aW50OF90KiBjb25zdCByX3UgPSAodWludDhfdCopKCh1aW50cHRyX3QpKHV2X2J1ZiArIDE1KSAmIH4xNSk7ICAgICAgICAgICAgIFwKKyAgdWludDhfdCogY29uc3Qgcl92ID0gcl91ICsgMzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBhc3NlcnQodG9wX3kgIT0gTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgIC8qIFRyZWF0IHRoZSBmaXJzdCBwaXhlbCBpbiByZWd1bGFyIHdheSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IHVfZGlhZyA9ICgodG9wX3VbMF0gKyBjdXJfdVswXSkgPj4gMSkgKyAxOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCB2X2RpYWcgPSAoKHRvcF92WzBdICsgY3VyX3ZbMF0pID4+IDEpICsgMTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgdTBfdCA9ICh0b3BfdVswXSArIHVfZGlhZykgPj4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IHYwX3QgPSAodG9wX3ZbMF0gKyB2X2RpYWcpID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZVTkModG9wX3lbMF0sIHUwX3QsIHYwX3QsIHRvcF9kc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoYm90dG9tX3kgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCBpbnQgdTBfYiA9IChjdXJfdVswXSArIHVfZGlhZykgPj4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY29uc3QgaW50IHYwX2IgPSAoY3VyX3ZbMF0gKyB2X2RpYWcpID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEZVTkMoYm90dG9tX3lbMF0sIHUwX2IsIHYwX2IsIGJvdHRvbV9kc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgLyogRm9yIFVQU0FNUExFXzMyUElYRUxTLCAxNyB1L3YgdmFsdWVzIG11c3QgYmUgcmVhZC1hYmxlIGZvciBlYWNoIGJsb2NrICovICBcCisgIGZvciAocG9zID0gMSwgdXZfcG9zID0gMDsgcG9zICsgMzIgKyAxIDw9IGxlbjsgcG9zICs9IDMyLCB1dl9wb3MgKz0gMTYpIHsgICAgXAorICAgIFVQU0FNUExFXzMyUElYRUxTKHRvcF91ICsgdXZfcG9zLCBjdXJfdSArIHV2X3Bvcywgcl91KTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBVUFNBTVBMRV8zMlBJWEVMUyh0b3BfdiArIHV2X3BvcywgY3VyX3YgKyB1dl9wb3MsIHJfdik7ICAgICAgICAgICAgICAgICAgICBcCisgICAgQ09OVkVSVDJSR0JfMzIoRlVOQywgWFNURVAsIHRvcF95LCBib3R0b21feSwgdG9wX2RzdCwgYm90dG9tX2RzdCwgcG9zKTsgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGxlbiA+IDEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IGxlZnRfb3ZlciA9ICgobGVuICsgMSkgPj4gMSkgLSAocG9zID4+IDEpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQ4X3QqIGNvbnN0IHRtcF90b3BfZHN0ID0gcl91ICsgNCAqIDMyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90KiBjb25zdCB0bXBfYm90dG9tX2RzdCA9IHRtcF90b3BfZHN0ICsgNCAqIDMyOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCogY29uc3QgdG1wX3RvcCA9IHRtcF9ib3R0b21fZHN0ICsgNCAqIDMyOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQ4X3QqIGNvbnN0IHRtcF9ib3R0b20gPSAoYm90dG9tX3kgPT0gTlVMTCkgPyBOVUxMIDogdG1wX3RvcCArIDMyOyAgICAgIFwKKyAgICBhc3NlcnQobGVmdF9vdmVyID4gMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVVBTQU1QTEVfTEFTVF9CTE9DSyh0b3BfdSArIHV2X3BvcywgY3VyX3UgKyB1dl9wb3MsIGxlZnRfb3Zlciwgcl91KTsgICAgICAgXAorICAgIFVQU0FNUExFX0xBU1RfQkxPQ0sodG9wX3YgKyB1dl9wb3MsIGN1cl92ICsgdXZfcG9zLCBsZWZ0X292ZXIsIHJfdik7ICAgICAgIFwKKyAgICBtZW1jcHkodG1wX3RvcCwgdG9wX3kgKyBwb3MsIGxlbiAtIHBvcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGJvdHRvbV95ICE9IE5VTEwpIG1lbWNweSh0bXBfYm90dG9tLCBib3R0b21feSArIHBvcywgbGVuIC0gcG9zKTsgICAgICAgXAorICAgIENPTlZFUlQyUkdCXzMyKEZVTkMsIFhTVEVQLCB0bXBfdG9wLCB0bXBfYm90dG9tLCB0bXBfdG9wX2RzdCwgICAgICAgICAgICAgIFwKKyAgICAgICAgIHRtcF9ib3R0b21fZHN0LCAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWVtY3B5KHRvcF9kc3QgKyBwb3MgKiAoWFNURVApLCB0bXBfdG9wX2RzdCwgKGxlbiAtIHBvcykgKiAoWFNURVApKTsgICAgICAgXAorICAgIGlmIChib3R0b21feSAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIG1lbWNweShib3R0b21fZHN0ICsgcG9zICogKFhTVEVQKSwgdG1wX2JvdHRvbV9kc3QsICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgKGxlbiAtIHBvcykgKiAoWFNURVApKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vIFNTRTQgdmFyaWFudHMgb2YgdGhlIGZhbmN5IHVwc2FtcGxlci4KK1NTRTRfVVBTQU1QTEVfRlVOQyhVcHNhbXBsZVJnYkxpbmVQYWlyX1NTRTQxLCAgVlA4WXV2VG9SZ2IsICAzKQorU1NFNF9VUFNBTVBMRV9GVU5DKFVwc2FtcGxlQmdyTGluZVBhaXJfU1NFNDEsICBWUDhZdXZUb0JnciwgIDMpCisKKyN1bmRlZiBHRVRfTQorI3VuZGVmIFBBQ0tfQU5EX1NUT1JFCisjdW5kZWYgVVBTQU1QTEVfMzJQSVhFTFMKKyN1bmRlZiBVUFNBTVBMRV9MQVNUX0JMT0NLCisjdW5kZWYgQ09OVkVSVDJSR0IKKyN1bmRlZiBDT05WRVJUMlJHQl8zMgorI3VuZGVmIFNTRTRfVVBTQU1QTEVfRlVOQworCisjZW5kaWYgICAvLyBXRUJQX1JFRFVDRV9DU1AKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiBXZWJQVXBzYW1wbGVMaW5lUGFpckZ1bmMgV2ViUFVwc2FtcGxlcnNbLyogTU9ERV9MQVNUICovXTsKKworZXh0ZXJuIHZvaWQgV2ViUEluaXRVcHNhbXBsZXJzU1NFNDEodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBXZWJQSW5pdFVwc2FtcGxlcnNTU0U0MSh2b2lkKSB7CisjaWYgIWRlZmluZWQoV0VCUF9SRURVQ0VfQ1NQKQorICBXZWJQVXBzYW1wbGVyc1tNT0RFX1JHQl0gID0gVXBzYW1wbGVSZ2JMaW5lUGFpcl9TU0U0MTsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9CR1JdICA9IFVwc2FtcGxlQmdyTGluZVBhaXJfU1NFNDE7CisjZW5kaWYgICAvLyBXRUJQX1JFRFVDRV9DU1AKK30KKworI2VuZGlmICAvLyBGQU5DWV9VUFNBTVBMSU5HCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2V4dGVybiBXZWJQWVVWNDQ0Q29udmVydGVyIFdlYlBZVVY0NDRDb252ZXJ0ZXJzWy8qIE1PREVfTEFTVCAqL107CitleHRlcm4gdm9pZCBXZWJQSW5pdFlVVjQ0NENvbnZlcnRlcnNTU0U0MSh2b2lkKTsKKworI2RlZmluZSBZVVY0NDRfRlVOQyhGVU5DX05BTUUsIENBTEwsIENBTExfQywgWFNURVApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2V4dGVybiB2b2lkIENBTExfQyhjb25zdCB1aW50OF90KiB5LCBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgbGVuKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgRlVOQ19OQU1FKGNvbnN0IHVpbnQ4X3QqIHksIGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBsZW4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBpbnQgbWF4X2xlbiA9IGxlbiAmIH4zMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yIChpID0gMDsgaSA8IG1heF9sZW47IGkgKz0gMzIpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ0FMTCh5ICsgaSwgdSArIGksIHYgKyBpLCBkc3QgKyBpICogKFhTVEVQKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGkgPCBsZW4pIHsgIC8qIEMtZmFsbGJhY2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ0FMTF9DKHkgKyBpLCB1ICsgaSwgdiArIGksIGRzdCArIGkgKiAoWFNURVApLCBsZW4gLSBpKTsgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX0NTUCkKK1lVVjQ0NF9GVU5DKFl1djQ0NFRvUmdiX1NTRTQxLCBWUDhZdXZUb1JnYjMyX1NTRTQxLCBXZWJQWXV2NDQ0VG9SZ2JfQywgMyk7CitZVVY0NDRfRlVOQyhZdXY0NDRUb0Jncl9TU0U0MSwgVlA4WXV2VG9CZ3IzMl9TU0U0MSwgV2ViUFl1djQ0NFRvQmdyX0MsIDMpOworI2VuZGlmICAvLyBXRUJQX1JFRFVDRV9DU1AKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFdlYlBJbml0WVVWNDQ0Q29udmVydGVyc1NTRTQxKHZvaWQpIHsKKyNpZiAhZGVmaW5lZChXRUJQX1JFRFVDRV9DU1ApCisgIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW01PREVfUkdCXSAgICAgICA9IFl1djQ0NFRvUmdiX1NTRTQxOworICBXZWJQWVVWNDQ0Q29udmVydGVyc1tNT0RFX0JHUl0gICAgICAgPSBZdXY0NDRUb0Jncl9TU0U0MTsKKyNlbmRpZiAgIC8vIFdFQlBfUkVEVUNFX0NTUAorfQorCisjZWxzZQorCitXRUJQX0RTUF9JTklUX1NUVUIoV2ViUEluaXRZVVY0NDRDb252ZXJ0ZXJzU1NFNDEpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfU1NFNDEKKworI2lmICEoZGVmaW5lZChGQU5DWV9VUFNBTVBMSU5HKSAmJiBkZWZpbmVkKFdFQlBfVVNFX1NTRTQxKSkKK1dFQlBfRFNQX0lOSVRfU1RVQihXZWJQSW5pdFVwc2FtcGxlcnNTU0U0MSkKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC95dXYuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AveXV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU2N2FhYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AveXV2LmMKQEAgLTAsMCArMSwzMTYgQEAKKy8vIENvcHlyaWdodCAyMDEwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBZVVYtPlJHQiBjb252ZXJzaW9uIGZ1bmN0aW9ucworLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpbmNsdWRlICJzcmMvZHNwL3l1di5oIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFBsYWluLUMgdmVyc2lvbgorCisjZGVmaW5lIFJPV19GVU5DKEZVTkNfTkFNRSwgRlVOQywgWFNURVApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgRlVOQ19OQU1FKGNvbnN0IHVpbnQ4X3QqIHksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgbGVuKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50OF90KiBjb25zdCBlbmQgPSBkc3QgKyAobGVuICYgfjEpICogKFhTVEVQKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgd2hpbGUgKGRzdCAhPSBlbmQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRlVOQyh5WzBdLCB1WzBdLCB2WzBdLCBkc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZVTkMoeVsxXSwgdVswXSwgdlswXSwgZHN0ICsgKFhTVEVQKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB5ICs9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKyt1OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICsrdjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3QgKz0gMiAqIChYU1RFUCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAobGVuICYgMSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGVU5DKHlbMF0sIHVbMF0sIHZbMF0sIGRzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworLy8gQWxsIHZhcmlhbnRzIGltcGxlbWVudGVkLgorUk9XX0ZVTkMoWXV2VG9SZ2JSb3csICAgICAgVlA4WXV2VG9SZ2IsICAzKQorUk9XX0ZVTkMoWXV2VG9CZ3JSb3csICAgICAgVlA4WXV2VG9CZ3IsICAzKQorUk9XX0ZVTkMoWXV2VG9SZ2JhUm93LCAgICAgVlA4WXV2VG9SZ2JhLCA0KQorUk9XX0ZVTkMoWXV2VG9CZ3JhUm93LCAgICAgVlA4WXV2VG9CZ3JhLCA0KQorUk9XX0ZVTkMoWXV2VG9BcmdiUm93LCAgICAgVlA4WXV2VG9BcmdiLCA0KQorUk9XX0ZVTkMoWXV2VG9SZ2JhNDQ0NFJvdywgVlA4WXV2VG9SZ2JhNDQ0NCwgMikKK1JPV19GVU5DKFl1dlRvUmdiNTY1Um93LCAgIFZQOFl1dlRvUmdiNTY1LCAyKQorCisjdW5kZWYgUk9XX0ZVTkMKKworLy8gTWFpbiBjYWxsIGZvciBwcm9jZXNzaW5nIGEgcGxhbmUgd2l0aCBhIFdlYlBTYW1wbGVyUm93RnVuYyBmdW5jdGlvbjoKK3ZvaWQgV2ViUFNhbXBsZXJQcm9jZXNzUGxhbmUoY29uc3QgdWludDhfdCogeSwgaW50IHlfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LCBpbnQgdXZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIFdlYlBTYW1wbGVyUm93RnVuYyBmdW5jKSB7CisgIGludCBqOworICBmb3IgKGogPSAwOyBqIDwgaGVpZ2h0OyArK2opIHsKKyAgICBmdW5jKHksIHUsIHYsIGRzdCwgd2lkdGgpOworICAgIHkgKz0geV9zdHJpZGU7CisgICAgaWYgKGogJiAxKSB7CisgICAgICB1ICs9IHV2X3N0cmlkZTsKKyAgICAgIHYgKz0gdXZfc3RyaWRlOworICAgIH0KKyAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNYWluIGNhbGwKKworV2ViUFNhbXBsZXJSb3dGdW5jIFdlYlBTYW1wbGVyc1tNT0RFX0xBU1RdOworCitleHRlcm4gdm9pZCBXZWJQSW5pdFNhbXBsZXJzU1NFMih2b2lkKTsKK2V4dGVybiB2b2lkIFdlYlBJbml0U2FtcGxlcnNTU0U0MSh2b2lkKTsKK2V4dGVybiB2b2lkIFdlYlBJbml0U2FtcGxlcnNNSVBTMzIodm9pZCk7CitleHRlcm4gdm9pZCBXZWJQSW5pdFNhbXBsZXJzTUlQU2RzcFIyKHZvaWQpOworCitXRUJQX0RTUF9JTklUX0ZVTkMoV2ViUEluaXRTYW1wbGVycykgeworICBXZWJQU2FtcGxlcnNbTU9ERV9SR0JdICAgICAgID0gWXV2VG9SZ2JSb3c7CisgIFdlYlBTYW1wbGVyc1tNT0RFX1JHQkFdICAgICAgPSBZdXZUb1JnYmFSb3c7CisgIFdlYlBTYW1wbGVyc1tNT0RFX0JHUl0gICAgICAgPSBZdXZUb0JnclJvdzsKKyAgV2ViUFNhbXBsZXJzW01PREVfQkdSQV0gICAgICA9IFl1dlRvQmdyYVJvdzsKKyAgV2ViUFNhbXBsZXJzW01PREVfQVJHQl0gICAgICA9IFl1dlRvQXJnYlJvdzsKKyAgV2ViUFNhbXBsZXJzW01PREVfUkdCQV80NDQ0XSA9IFl1dlRvUmdiYTQ0NDRSb3c7CisgIFdlYlBTYW1wbGVyc1tNT0RFX1JHQl81NjVdICAgPSBZdXZUb1JnYjU2NVJvdzsKKyAgV2ViUFNhbXBsZXJzW01PREVfcmdiQV0gICAgICA9IFl1dlRvUmdiYVJvdzsKKyAgV2ViUFNhbXBsZXJzW01PREVfYmdyQV0gICAgICA9IFl1dlRvQmdyYVJvdzsKKyAgV2ViUFNhbXBsZXJzW01PREVfQXJnYl0gICAgICA9IFl1dlRvQXJnYlJvdzsKKyAgV2ViUFNhbXBsZXJzW01PREVfcmdiQV80NDQ0XSA9IFl1dlRvUmdiYTQ0NDRSb3c7CisKKyAgLy8gSWYgZGVmaW5lZCwgdXNlIENQVUluZm8oKSB0byBvdmVyd3JpdGUgc29tZSBwb2ludGVycyB3aXRoIGZhc3RlciB2ZXJzaW9ucy4KKyAgaWYgKFZQOEdldENQVUluZm8gIT0gTlVMTCkgeworI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFMikKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrU1NFMikpIHsKKyAgICAgIFdlYlBJbml0U2FtcGxlcnNTU0UyKCk7CisgICAgfQorI2VuZGlmICAvLyBXRUJQX1VTRV9TU0UyCisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0U0MSkKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrU1NFNF8xKSkgeworICAgICAgV2ViUEluaXRTYW1wbGVyc1NTRTQxKCk7CisgICAgfQorI2VuZGlmICAvLyBXRUJQX1VTRV9TU0U0MQorI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQUzMyKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtNSVBTMzIpKSB7CisgICAgICBXZWJQSW5pdFNhbXBsZXJzTUlQUzMyKCk7CisgICAgfQorI2VuZGlmICAvLyBXRUJQX1VTRV9NSVBTMzIKKyNpZiAhZGVmaW5lZChTVEFSQk9BUkQpCisgICAgLy8gVW5mb3J0dW5hdGVseSwgb24gYXQgbGVhc3Qgb25lIFN0YXJib2FyZCBNSVBTIHBsYXRmb3JtIHRoZSBNSVBTIERTUCAocjIpCisgICAgLy8gY29kZSB3YXMgZm91bmQgdG8gcHJvZHVjZSBlcnJvbmVvdXMgcmVzdWx0cyAobW9zdCBwaXhlbHMgZW5kIHVwIGVpdGhlcgorICAgIC8vIHdoaXRlIG9yIHB1cnBsZSkuICBJdCBpcyBkaXNhYmxlZCBmb3Igbm93IG91dCBvZiBsYWNrIG9mIHRpbWUgYW5kCisgICAgLy8gcHJpb3JpdHkgZm9yIGludmVzdGlnYXRpb24sIGJ1dCBpZiBhZGRpdGlvbmFsIHBlcmZvcm1hbmNlIGlzIHJlcXVpcmVkLAorICAgIC8vIHRoZSBpc3N1ZSBzaG91bGQgYmUgaW52ZXN0aWdhdGVkIGFuZCBmaXhlZCBwcm9wZXJseS4KKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQU19EU1BfUjIpCisgICAgaWYgKFZQOEdldENQVUluZm8oa01JUFNkc3BSMikpIHsKKyAgICAgIFdlYlBJbml0U2FtcGxlcnNNSVBTZHNwUjIoKTsKKyAgICB9CisjZW5kaWYgIC8vIFdFQlBfVVNFX01JUFNfRFNQX1IyCisjZW5kaWYKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBUkdCIC0+IFlVViBjb252ZXJ0ZXJzCisKK3N0YXRpYyB2b2lkIENvbnZlcnRBUkdCVG9ZX0MoY29uc3QgdWludDMyX3QqIGFyZ2IsIHVpbnQ4X3QqIHksIGludCB3aWR0aCkgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyArK2kpIHsKKyAgICBjb25zdCB1aW50MzJfdCBwID0gYXJnYltpXTsKKyAgICB5W2ldID0gVlA4UkdCVG9ZKChwID4+IDE2KSAmIDB4ZmYsIChwID4+IDgpICYgMHhmZiwgKHAgPj4gIDApICYgMHhmZiwKKyAgICAgICAgICAgICAgICAgICAgIFlVVl9IQUxGKTsKKyAgfQorfQorCit2b2lkIFdlYlBDb252ZXJ0QVJHQlRvVVZfQyhjb25zdCB1aW50MzJfdCogYXJnYiwgdWludDhfdCogdSwgdWludDhfdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfd2lkdGgsIGludCBkb19zdG9yZSkgeworICAvLyBObyByb3VuZGluZy4gTGFzdCBwaXhlbCBpcyBkZWFsdCB3aXRoIHNlcGFyYXRlbHkuCisgIGNvbnN0IGludCB1dl93aWR0aCA9IHNyY193aWR0aCA+PiAxOworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IHV2X3dpZHRoOyArK2kpIHsKKyAgICBjb25zdCB1aW50MzJfdCB2MCA9IGFyZ2JbMiAqIGkgKyAwXTsKKyAgICBjb25zdCB1aW50MzJfdCB2MSA9IGFyZ2JbMiAqIGkgKyAxXTsKKyAgICAvLyBWUDhSR0JUb1UvViBleHBlY3RzIGZvdXIgYWNjdW11bGF0ZWQgcGl4ZWxzLiBIZW5jZSB3ZSBuZWVkIHRvCisgICAgLy8gc2NhbGUgci9nL2IgdmFsdWUgYnkgYSBmYWN0b3IgMi4gV2UganVzdCBzaGlmdCB2MC92MSBvbmUgYml0IGxlc3MuCisgICAgY29uc3QgaW50IHIgPSAoKHYwID4+IDE1KSAmIDB4MWZlKSArICgodjEgPj4gMTUpICYgMHgxZmUpOworICAgIGNvbnN0IGludCBnID0gKCh2MCA+PiAgNykgJiAweDFmZSkgKyAoKHYxID4+ICA3KSAmIDB4MWZlKTsKKyAgICBjb25zdCBpbnQgYiA9ICgodjAgPDwgIDEpICYgMHgxZmUpICsgKCh2MSA8PCAgMSkgJiAweDFmZSk7CisgICAgY29uc3QgaW50IHRtcF91ID0gVlA4UkdCVG9VKHIsIGcsIGIsIFlVVl9IQUxGIDw8IDIpOworICAgIGNvbnN0IGludCB0bXBfdiA9IFZQOFJHQlRvVihyLCBnLCBiLCBZVVZfSEFMRiA8PCAyKTsKKyAgICBpZiAoZG9fc3RvcmUpIHsKKyAgICAgIHVbaV0gPSB0bXBfdTsKKyAgICAgIHZbaV0gPSB0bXBfdjsKKyAgICB9IGVsc2UgeworICAgICAgLy8gQXBwcm94aW1hdGVkIGF2ZXJhZ2Utb2YtZm91ci4gQnV0IGl0J3MgYW4gYWNjZXB0YWJsZSBkaWZmLgorICAgICAgdVtpXSA9ICh1W2ldICsgdG1wX3UgKyAxKSA+PiAxOworICAgICAgdltpXSA9ICh2W2ldICsgdG1wX3YgKyAxKSA+PiAxOworICAgIH0KKyAgfQorICBpZiAoc3JjX3dpZHRoICYgMSkgeyAgICAgICAvLyBsYXN0IHBpeGVsCisgICAgY29uc3QgdWludDMyX3QgdjAgPSBhcmdiWzIgKiBpICsgMF07CisgICAgY29uc3QgaW50IHIgPSAodjAgPj4gMTQpICYgMHgzZmM7CisgICAgY29uc3QgaW50IGcgPSAodjAgPj4gIDYpICYgMHgzZmM7CisgICAgY29uc3QgaW50IGIgPSAodjAgPDwgIDIpICYgMHgzZmM7CisgICAgY29uc3QgaW50IHRtcF91ID0gVlA4UkdCVG9VKHIsIGcsIGIsIFlVVl9IQUxGIDw8IDIpOworICAgIGNvbnN0IGludCB0bXBfdiA9IFZQOFJHQlRvVihyLCBnLCBiLCBZVVZfSEFMRiA8PCAyKTsKKyAgICBpZiAoZG9fc3RvcmUpIHsKKyAgICAgIHVbaV0gPSB0bXBfdTsKKyAgICAgIHZbaV0gPSB0bXBfdjsKKyAgICB9IGVsc2UgeworICAgICAgdVtpXSA9ICh1W2ldICsgdG1wX3UgKyAxKSA+PiAxOworICAgICAgdltpXSA9ICh2W2ldICsgdG1wX3YgKyAxKSA+PiAxOworICAgIH0KKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIENvbnZlcnRSR0IyNFRvWV9DKGNvbnN0IHVpbnQ4X3QqIHJnYiwgdWludDhfdCogeSwgaW50IHdpZHRoKSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7ICsraSwgcmdiICs9IDMpIHsKKyAgICB5W2ldID0gVlA4UkdCVG9ZKHJnYlswXSwgcmdiWzFdLCByZ2JbMl0sIFlVVl9IQUxGKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBDb252ZXJ0QkdSMjRUb1lfQyhjb25zdCB1aW50OF90KiBiZ3IsIHVpbnQ4X3QqIHksIGludCB3aWR0aCkgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyArK2ksIGJnciArPSAzKSB7CisgICAgeVtpXSA9IFZQOFJHQlRvWShiZ3JbMl0sIGJnclsxXSwgYmdyWzBdLCBZVVZfSEFMRik7CisgIH0KK30KKwordm9pZCBXZWJQQ29udmVydFJHQkEzMlRvVVZfQyhjb25zdCB1aW50MTZfdCogcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB1LCB1aW50OF90KiB2LCBpbnQgd2lkdGgpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSArPSAxLCByZ2IgKz0gNCkgeworICAgIGNvbnN0IGludCByID0gcmdiWzBdLCBnID0gcmdiWzFdLCBiID0gcmdiWzJdOworICAgIHVbaV0gPSBWUDhSR0JUb1UociwgZywgYiwgWVVWX0hBTEYgPDwgMik7CisgICAgdltpXSA9IFZQOFJHQlRvVihyLCBnLCBiLCBZVVZfSEFMRiA8PCAyKTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCisjZGVmaW5lIE1BWF9ZICgoMSA8PCAxMCkgLSAxKSAgICAvLyAxMGIgcHJlY2lzaW9uIG92ZXIgMTZiLWFyaXRobWV0aWMKK3N0YXRpYyB1aW50MTZfdCBjbGlwX3koaW50IHYpIHsKKyAgcmV0dXJuICh2IDwgMCkgPyAwIDogKHYgPiBNQVhfWSkgPyBNQVhfWSA6ICh1aW50MTZfdCl2OworfQorCitzdGF0aWMgdWludDY0X3QgU2hhcnBZVVZVcGRhdGVZX0MoY29uc3QgdWludDE2X3QqIHJlZiwgY29uc3QgdWludDE2X3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogZHN0LCBpbnQgbGVuKSB7CisgIHVpbnQ2NF90IGRpZmYgPSAwOworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7CisgICAgY29uc3QgaW50IGRpZmZfeSA9IHJlZltpXSAtIHNyY1tpXTsKKyAgICBjb25zdCBpbnQgbmV3X3kgPSAoaW50KWRzdFtpXSArIGRpZmZfeTsKKyAgICBkc3RbaV0gPSBjbGlwX3kobmV3X3kpOworICAgIGRpZmYgKz0gKHVpbnQ2NF90KWFicyhkaWZmX3kpOworICB9CisgIHJldHVybiBkaWZmOworfQorCitzdGF0aWMgdm9pZCBTaGFycFlVVlVwZGF0ZVJHQl9DKGNvbnN0IGludDE2X3QqIHJlZiwgY29uc3QgaW50MTZfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90KiBkc3QsIGludCBsZW4pIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkgeworICAgIGNvbnN0IGludCBkaWZmX3V2ID0gcmVmW2ldIC0gc3JjW2ldOworICAgIGRzdFtpXSArPSBkaWZmX3V2OworICB9Cit9CisKK3N0YXRpYyB2b2lkIFNoYXJwWVVWRmlsdGVyUm93X0MoY29uc3QgaW50MTZfdCogQSwgY29uc3QgaW50MTZfdCogQiwgaW50IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QqIGJlc3RfeSwgdWludDE2X3QqIG91dCkgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpLCArK0EsICsrQikgeworICAgIGNvbnN0IGludCB2MCA9IChBWzBdICogOSArIEFbMV0gKiAzICsgQlswXSAqIDMgKyBCWzFdICsgOCkgPj4gNDsKKyAgICBjb25zdCBpbnQgdjEgPSAoQVsxXSAqIDkgKyBBWzBdICogMyArIEJbMV0gKiAzICsgQlswXSArIDgpID4+IDQ7CisgICAgb3V0WzIgKiBpICsgMF0gPSBjbGlwX3koYmVzdF95WzIgKiBpICsgMF0gKyB2MCk7CisgICAgb3V0WzIgKiBpICsgMV0gPSBjbGlwX3koYmVzdF95WzIgKiBpICsgMV0gKyB2MSk7CisgIH0KK30KKyNlbmRpZiAgLy8gIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorCisjdW5kZWYgTUFYX1kKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkICgqV2ViUENvbnZlcnRSR0IyNFRvWSkoY29uc3QgdWludDhfdCogcmdiLCB1aW50OF90KiB5LCBpbnQgd2lkdGgpOwordm9pZCAoKldlYlBDb252ZXJ0QkdSMjRUb1kpKGNvbnN0IHVpbnQ4X3QqIGJnciwgdWludDhfdCogeSwgaW50IHdpZHRoKTsKK3ZvaWQgKCpXZWJQQ29udmVydFJHQkEzMlRvVVYpKGNvbnN0IHVpbnQxNl90KiByZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB1LCB1aW50OF90KiB2LCBpbnQgd2lkdGgpOworCit2b2lkICgqV2ViUENvbnZlcnRBUkdCVG9ZKShjb25zdCB1aW50MzJfdCogYXJnYiwgdWludDhfdCogeSwgaW50IHdpZHRoKTsKK3ZvaWQgKCpXZWJQQ29udmVydEFSR0JUb1VWKShjb25zdCB1aW50MzJfdCogYXJnYiwgdWludDhfdCogdSwgdWludDhfdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3dpZHRoLCBpbnQgZG9fc3RvcmUpOworCit1aW50NjRfdCAoKldlYlBTaGFycFlVVlVwZGF0ZVkpKGNvbnN0IHVpbnQxNl90KiByZWYsIGNvbnN0IHVpbnQxNl90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBkc3QsIGludCBsZW4pOwordm9pZCAoKldlYlBTaGFycFlVVlVwZGF0ZVJHQikoY29uc3QgaW50MTZfdCogcmVmLCBjb25zdCBpbnQxNl90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90KiBkc3QsIGludCBsZW4pOwordm9pZCAoKldlYlBTaGFycFlVVkZpbHRlclJvdykoY29uc3QgaW50MTZfdCogQSwgY29uc3QgaW50MTZfdCogQiwgaW50IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90KiBiZXN0X3ksIHVpbnQxNl90KiBvdXQpOworCitleHRlcm4gdm9pZCBXZWJQSW5pdENvbnZlcnRBUkdCVG9ZVVZTU0UyKHZvaWQpOworZXh0ZXJuIHZvaWQgV2ViUEluaXRDb252ZXJ0QVJHQlRvWVVWU1NFNDEodm9pZCk7CitleHRlcm4gdm9pZCBXZWJQSW5pdENvbnZlcnRBUkdCVG9ZVVZORU9OKHZvaWQpOworZXh0ZXJuIHZvaWQgV2ViUEluaXRTaGFycFlVVlNTRTIodm9pZCk7CitleHRlcm4gdm9pZCBXZWJQSW5pdFNoYXJwWVVWTkVPTih2b2lkKTsKKworV0VCUF9EU1BfSU5JVF9GVU5DKFdlYlBJbml0Q29udmVydEFSR0JUb1lVVikgeworICBXZWJQQ29udmVydEFSR0JUb1kgPSBDb252ZXJ0QVJHQlRvWV9DOworICBXZWJQQ29udmVydEFSR0JUb1VWID0gV2ViUENvbnZlcnRBUkdCVG9VVl9DOworCisgIFdlYlBDb252ZXJ0UkdCMjRUb1kgPSBDb252ZXJ0UkdCMjRUb1lfQzsKKyAgV2ViUENvbnZlcnRCR1IyNFRvWSA9IENvbnZlcnRCR1IyNFRvWV9DOworCisgIFdlYlBDb252ZXJ0UkdCQTMyVG9VViA9IFdlYlBDb252ZXJ0UkdCQTMyVG9VVl9DOworCisjaWYgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorICBXZWJQU2hhcnBZVVZVcGRhdGVZID0gU2hhcnBZVVZVcGRhdGVZX0M7CisgIFdlYlBTaGFycFlVVlVwZGF0ZVJHQiA9IFNoYXJwWVVWVXBkYXRlUkdCX0M7CisgIFdlYlBTaGFycFlVVkZpbHRlclJvdyA9IFNoYXJwWVVWRmlsdGVyUm93X0M7CisjZW5kaWYKKworICBpZiAoVlA4R2V0Q1BVSW5mbyAhPSBOVUxMKSB7CisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0UyKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtTU0UyKSkgeworICAgICAgV2ViUEluaXRDb252ZXJ0QVJHQlRvWVVWU1NFMigpOworICAgICAgV2ViUEluaXRTaGFycFlVVlNTRTIoKTsKKyAgICB9CisjZW5kaWYgIC8vIFdFQlBfVVNFX1NTRTIKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTQxKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtTU0U0XzEpKSB7CisgICAgICBXZWJQSW5pdENvbnZlcnRBUkdCVG9ZVVZTU0U0MSgpOworICAgIH0KKyNlbmRpZiAgLy8gV0VCUF9VU0VfU1NFNDEKKyAgfQorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9ORU9OKQorICBpZiAoV0VCUF9ORU9OX09NSVRfQ19DT0RFIHx8CisgICAgICAoVlA4R2V0Q1BVSW5mbyAhPSBOVUxMICYmIFZQOEdldENQVUluZm8oa05FT04pKSkgeworICAgIFdlYlBJbml0Q29udmVydEFSR0JUb1lVVk5FT04oKTsKKyAgICBXZWJQSW5pdFNoYXJwWVVWTkVPTigpOworICB9CisjZW5kaWYgIC8vIFdFQlBfVVNFX05FT04KKworICBhc3NlcnQoV2ViUENvbnZlcnRBUkdCVG9ZICE9IE5VTEwpOworICBhc3NlcnQoV2ViUENvbnZlcnRBUkdCVG9VViAhPSBOVUxMKTsKKyAgYXNzZXJ0KFdlYlBDb252ZXJ0UkdCMjRUb1kgIT0gTlVMTCk7CisgIGFzc2VydChXZWJQQ29udmVydEJHUjI0VG9ZICE9IE5VTEwpOworICBhc3NlcnQoV2ViUENvbnZlcnRSR0JBMzJUb1VWICE9IE5VTEwpOworICBhc3NlcnQoV2ViUFNoYXJwWVVWVXBkYXRlWSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFdlYlBTaGFycFlVVlVwZGF0ZVJHQiAhPSBOVUxMKTsKKyAgYXNzZXJ0KFdlYlBTaGFycFlVVkZpbHRlclJvdyAhPSBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AveXV2LmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3l1di5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNzg3MjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3l1di5oCkBAIC0wLDAgKzEsMjEwIEBACisvLyBDb3B5cmlnaHQgMjAxMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gaW5saW5lIFlVVjwtPlJHQiBjb252ZXJzaW9uIGZ1bmN0aW9uCisvLworLy8gVGhlIGV4YWN0IG5hbWluZyBpcyBZJ0NiQ3IsIGZvbGxvd2luZyB0aGUgSVRVLVIgQlQuNjAxIHN0YW5kYXJkLgorLy8gTW9yZSBpbmZvcm1hdGlvbiBhdDogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9ZQ2JDcgorLy8gWSA9IDAuMjU2OSAqIFIgKyAwLjUwNDQgKiBHICsgMC4wOTc5ICogQiArIDE2CisvLyBVID0gLTAuMTQ4MyAqIFIgLSAwLjI5MTEgKiBHICsgMC40Mzk0ICogQiArIDEyOAorLy8gViA9IDAuNDM5NCAqIFIgLSAwLjM2NzkgKiBHIC0gMC4wNzE1ICogQiArIDEyOAorLy8gV2UgdXNlIDE2Yml0IGZpeGVkIHBvaW50IG9wZXJhdGlvbnMgZm9yIFJHQi0+WVVWIGNvbnZlcnNpb24gKFlVVl9GSVgpLgorLy8KKy8vIEZvciB0aGUgWSdDYkNyIHRvIFJHQiBjb252ZXJzaW9uLCB0aGUgQlQuNjAxIHNwZWNpZmljYXRpb24gcmVhZHM6CisvLyAgIFIgPSAxLjE2NCAqIChZLTE2KSArIDEuNTk2ICogKFYtMTI4KQorLy8gICBHID0gMS4xNjQgKiAoWS0xNikgLSAwLjgxMyAqIChWLTEyOCkgLSAwLjM5MSAqIChVLTEyOCkKKy8vICAgQiA9IDEuMTY0ICogKFktMTYpICAgICAgICAgICAgICAgICAgICsgMi4wMTggKiAoVS0xMjgpCisvLyB3aGVyZSBZIGlzIGluIHRoZSBbMTYsMjM1XSByYW5nZSwgYW5kIFUvViBpbiB0aGUgWzE2LDI0MF0gcmFuZ2UuCisvLworLy8gVGhlIGZpeGVkLXBvaW50IGltcGxlbWVudGF0aW9uIHVzZWQgaGVyZSBpczoKKy8vICBSID0gKDE5MDc3IC4geSAgICAgICAgICAgICArIDI2MTQ5IC4gdiAtIDE0MjM0KSA+PiA2CisvLyAgRyA9ICgxOTA3NyAuIHkgLSAgNjQxOSAuIHUgLSAxMzMyMCAuIHYgKyAgODcwOCkgPj4gNgorLy8gIEIgPSAoMTkwNzcgLiB5ICsgMzMwNTAgLiB1ICAgICAgICAgICAgIC0gMTc2ODUpID4+IDYKKy8vIHdoZXJlIHRoZSAnLicgb3BlcmF0b3IgaXMgdGhlIG11bGhpX2VwdTE2IHZhcmlhbnQ6CisvLyAgIGEgLiBiID0gKChhIDw8IDgpICogYikgPj4gMTYKKy8vIHRoYXQgcHJlc2VydmVzIDggYml0cyBvZiBmcmFjdGlvbmFsIHByZWNpc2lvbiBiZWZvcmUgZmluYWwgZGVzY2FsaW5nLgorCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaWZuZGVmIFdFQlBfRFNQX1lVVl9IXworI2RlZmluZSBXRUJQX0RTUF9ZVVZfSF8KKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisjaW5jbHVkZSAic3JjL2RlYy92cDhfZGVjLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBZVVYgLT4gUkdCIGNvbnZlcnNpb24KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitlbnVtIHsKKyAgWVVWX0ZJWCA9IDE2LCAgICAgICAgICAgICAgICAgICAgLy8gZml4ZWQtcG9pbnQgcHJlY2lzaW9uIGZvciBSR0ItPllVVgorICBZVVZfSEFMRiA9IDEgPDwgKFlVVl9GSVggLSAxKSwKKworICBZVVZfRklYMiA9IDYsICAgICAgICAgICAgICAgICAgIC8vIGZpeGVkLXBvaW50IHByZWNpc2lvbiBmb3IgWVVWLT5SR0IKKyAgWVVWX01BU0syID0gKDI1NiA8PCBZVVZfRklYMikgLSAxCit9OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gc2xvd2VyIG9uIHg4NiBieSB+Ny04JSwgYnV0IGJpdC1leGFjdCB3aXRoIHRoZSBTU0UyL05FT04gdmVyc2lvbgorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IE11bHRIaShpbnQgdiwgaW50IGNvZWZmKSB7ICAgLy8gX21tX211bGhpX2VwdTE2IGVtdWxhdGlvbgorICByZXR1cm4gKHYgKiBjb2VmZikgPj4gODsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhDbGlwOChpbnQgdikgeworICByZXR1cm4gKCh2ICYgfllVVl9NQVNLMikgPT0gMCkgPyAodiA+PiBZVVZfRklYMikgOiAodiA8IDApID8gMCA6IDI1NTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhZVVZUb1IoaW50IHksIGludCB2KSB7CisgIHJldHVybiBWUDhDbGlwOChNdWx0SGkoeSwgMTkwNzcpICsgTXVsdEhpKHYsIDI2MTQ5KSAtIDE0MjM0KTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhZVVZUb0coaW50IHksIGludCB1LCBpbnQgdikgeworICByZXR1cm4gVlA4Q2xpcDgoTXVsdEhpKHksIDE5MDc3KSAtIE11bHRIaSh1LCA2NDE5KSAtIE11bHRIaSh2LCAxMzMyMCkgKyA4NzA4KTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhZVVZUb0IoaW50IHksIGludCB1KSB7CisgIHJldHVybiBWUDhDbGlwOChNdWx0SGkoeSwgMTkwNzcpICsgTXVsdEhpKHUsIDMzMDUwKSAtIDE3Njg1KTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVlA4WXV2VG9SZ2IoaW50IHksIGludCB1LCBpbnQgdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IHJnYikgeworICByZ2JbMF0gPSBWUDhZVVZUb1IoeSwgdik7CisgIHJnYlsxXSA9IFZQOFlVVlRvRyh5LCB1LCB2KTsKKyAgcmdiWzJdID0gVlA4WVVWVG9CKHksIHUpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWUDhZdXZUb0JncihpbnQgeSwgaW50IHUsIGludCB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgYmdyKSB7CisgIGJnclswXSA9IFZQOFlVVlRvQih5LCB1KTsKKyAgYmdyWzFdID0gVlA4WVVWVG9HKHksIHUsIHYpOworICBiZ3JbMl0gPSBWUDhZVVZUb1IoeSwgdik7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZQOFl1dlRvUmdiNTY1KGludCB5LCBpbnQgdSwgaW50IHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCByZ2IpIHsKKyAgY29uc3QgaW50IHIgPSBWUDhZVVZUb1IoeSwgdik7ICAgICAgLy8gNSB1c2FibGUgYml0cworICBjb25zdCBpbnQgZyA9IFZQOFlVVlRvRyh5LCB1LCB2KTsgICAvLyA2IHVzYWJsZSBiaXRzCisgIGNvbnN0IGludCBiID0gVlA4WVVWVG9CKHksIHUpOyAgICAgIC8vIDUgdXNhYmxlIGJpdHMKKyAgY29uc3QgaW50IHJnID0gKHIgJiAweGY4KSB8IChnID4+IDUpOworICBjb25zdCBpbnQgZ2IgPSAoKGcgPDwgMykgJiAweGUwKSB8IChiID4+IDMpOworI2lmIChXRUJQX1NXQVBfMTZCSVRfQ1NQID09IDEpCisgIHJnYlswXSA9IGdiOworICByZ2JbMV0gPSByZzsKKyNlbHNlCisgIHJnYlswXSA9IHJnOworICByZ2JbMV0gPSBnYjsKKyNlbmRpZgorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWUDhZdXZUb1JnYmE0NDQ0KGludCB5LCBpbnQgdSwgaW50IHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IGFyZ2IpIHsKKyAgY29uc3QgaW50IHIgPSBWUDhZVVZUb1IoeSwgdik7ICAgICAgICAvLyA0IHVzYWJsZSBiaXRzCisgIGNvbnN0IGludCBnID0gVlA4WVVWVG9HKHksIHUsIHYpOyAgICAgLy8gNCB1c2FibGUgYml0cworICBjb25zdCBpbnQgYiA9IFZQOFlVVlRvQih5LCB1KTsgICAgICAgIC8vIDQgdXNhYmxlIGJpdHMKKyAgY29uc3QgaW50IHJnID0gKHIgJiAweGYwKSB8IChnID4+IDQpOworICBjb25zdCBpbnQgYmEgPSAoYiAmIDB4ZjApIHwgMHgwZjsgICAgIC8vIG92ZXJ3cml0ZSB0aGUgbG93ZXIgNCBiaXRzCisjaWYgKFdFQlBfU1dBUF8xNkJJVF9DU1AgPT0gMSkKKyAgYXJnYlswXSA9IGJhOworICBhcmdiWzFdID0gcmc7CisjZWxzZQorICBhcmdiWzBdID0gcmc7CisgIGFyZ2JbMV0gPSBiYTsKKyNlbmRpZgorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBbHBoYSBoYW5kbGluZyB2YXJpYW50cworCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWUDhZdXZUb0FyZ2IodWludDhfdCB5LCB1aW50OF90IHUsIHVpbnQ4X3QgdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBhcmdiKSB7CisgIGFyZ2JbMF0gPSAweGZmOworICBWUDhZdXZUb1JnYih5LCB1LCB2LCBhcmdiICsgMSk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZQOFl1dlRvQmdyYSh1aW50OF90IHksIHVpbnQ4X3QgdSwgdWludDhfdCB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IGJncmEpIHsKKyAgVlA4WXV2VG9CZ3IoeSwgdSwgdiwgYmdyYSk7CisgIGJncmFbM10gPSAweGZmOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWUDhZdXZUb1JnYmEodWludDhfdCB5LCB1aW50OF90IHUsIHVpbnQ4X3QgdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCByZ2JhKSB7CisgIFZQOFl1dlRvUmdiKHksIHUsIHYsIHJnYmEpOworICByZ2JhWzNdID0gMHhmZjsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU1NFMiBleHRyYSBmdW5jdGlvbnMgKG1vc3RseSBmb3IgdXBzYW1wbGluZ19zc2UyLmMpCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTIpCisKKy8vIFByb2Nlc3MgMzIgcGl4ZWxzIGFuZCBzdG9yZSB0aGUgcmVzdWx0ICgxNmIsIDI0YiBvciAzMmIgcGVyIHBpeGVsKSBpbiAqZHN0Lgordm9pZCBWUDhZdXZUb1JnYmEzMl9TU0UyKGNvbnN0IHVpbnQ4X3QqIHksIGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0KTsKK3ZvaWQgVlA4WXV2VG9SZ2IzMl9TU0UyKGNvbnN0IHVpbnQ4X3QqIHksIGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QpOwordm9pZCBWUDhZdXZUb0JncmEzMl9TU0UyKGNvbnN0IHVpbnQ4X3QqIHksIGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0KTsKK3ZvaWQgVlA4WXV2VG9CZ3IzMl9TU0UyKGNvbnN0IHVpbnQ4X3QqIHksIGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QpOwordm9pZCBWUDhZdXZUb0FyZ2IzMl9TU0UyKGNvbnN0IHVpbnQ4X3QqIHksIGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0KTsKK3ZvaWQgVlA4WXV2VG9SZ2JhNDQ0NDMyX1NTRTIoY29uc3QgdWludDhfdCogeSwgY29uc3QgdWludDhfdCogdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdiwgdWludDhfdCogZHN0KTsKK3ZvaWQgVlA4WXV2VG9SZ2I1NjUzMl9TU0UyKGNvbnN0IHVpbnQ4X3QqIHksIGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QpOworCisjZW5kaWYgICAgLy8gV0VCUF9VU0VfU1NFMgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTU0U0MSBleHRyYSBmdW5jdGlvbnMgKG1vc3RseSBmb3IgdXBzYW1wbGluZ19zc2U0MS5jKQorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0U0MSkKKworLy8gUHJvY2VzcyAzMiBwaXhlbHMgYW5kIHN0b3JlIHRoZSByZXN1bHQgKDE2YiwgMjRiIG9yIDMyYiBwZXIgcGl4ZWwpIGluICpkc3QuCit2b2lkIFZQOFl1dlRvUmdiMzJfU1NFNDEoY29uc3QgdWludDhfdCogeSwgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QpOwordm9pZCBWUDhZdXZUb0JncjMyX1NTRTQxKGNvbnN0IHVpbnQ4X3QqIHksIGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0KTsKKworI2VuZGlmICAgIC8vIFdFQlBfVVNFX1NTRTQxCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSR0IgLT4gWVVWIGNvbnZlcnNpb24KKworLy8gU3R1YiBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgY2FsbGVkIHdpdGggdmFyaW91cyByb3VuZGluZyB2YWx1ZXM6CitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOENsaXBVVihpbnQgdXYsIGludCByb3VuZGluZykgeworICB1diA9ICh1diArIHJvdW5kaW5nICsgKDEyOCA8PCAoWVVWX0ZJWCArIDIpKSkgPj4gKFlVVl9GSVggKyAyKTsKKyAgcmV0dXJuICgodXYgJiB+MHhmZikgPT0gMCkgPyB1diA6ICh1diA8IDApID8gMCA6IDI1NTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhSR0JUb1koaW50IHIsIGludCBnLCBpbnQgYiwgaW50IHJvdW5kaW5nKSB7CisgIGNvbnN0IGludCBsdW1hID0gMTY4MzkgKiByICsgMzMwNTkgKiBnICsgNjQyMCAqIGI7CisgIHJldHVybiAobHVtYSArIHJvdW5kaW5nICsgKDE2IDw8IFlVVl9GSVgpKSA+PiBZVVZfRklYOyAgLy8gbm8gbmVlZCB0byBjbGlwCit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4UkdCVG9VKGludCByLCBpbnQgZywgaW50IGIsIGludCByb3VuZGluZykgeworICBjb25zdCBpbnQgdSA9IC05NzE5ICogciAtIDE5MDgxICogZyArIDI4ODAwICogYjsKKyAgcmV0dXJuIFZQOENsaXBVVih1LCByb3VuZGluZyk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4UkdCVG9WKGludCByLCBpbnQgZywgaW50IGIsIGludCByb3VuZGluZykgeworICBjb25zdCBpbnQgdiA9ICsyODgwMCAqIHIgLSAyNDExNiAqIGcgLSA0Njg0ICogYjsKKyAgcmV0dXJuIFZQOENsaXBVVih2LCByb3VuZGluZyk7Cit9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvKiBXRUJQX0RTUF9ZVVZfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AveXV2X21pcHMzMi5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC95dXZfbWlwczMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQwYTg4NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AveXV2X21pcHMzMi5jCkBAIC0wLDAgKzEsMTAzIEBACisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gTUlQUyB2ZXJzaW9uIG9mIFlVViB0byBSR0IgdXBzYW1wbGluZyBmdW5jdGlvbnMuCisvLworLy8gQXV0aG9yKHMpOiAgRGpvcmRqZSBQZXN1dCAgICAoZGpvcmRqZS5wZXN1dEBpbWd0ZWMuY29tKQorLy8gICAgICAgICAgICAgSm92YW4gWmVsaW5jZXZpYyAoam92YW4uemVsaW5jZXZpY0BpbWd0ZWMuY29tKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQUzMyKQorCisjaW5jbHVkZSAic3JjL2RzcC95dXYuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHNpbXBsZSBwb2ludC1zYW1wbGluZworCisjZGVmaW5lIFJPV19GVU5DKEZVTkNfTkFNRSwgWFNURVAsIFIsIEcsIEIsIEEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgRlVOQ19OQU1FKGNvbnN0IHVpbnQ4X3QqIHksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgbGVuKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnQgaSwgciwgZywgYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZvciAoaSA9IDA7IGkgPCAobGVuID4+IDEpOyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXAxID0gTXVsdEhpKHZbMF0sIDI2MTQ5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wMyA9IE11bHRIaSh2WzBdLCAxMzMyMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcDIgPSBNdWx0SGkodVswXSwgNjQxOSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXA0ID0gTXVsdEhpKHVbMF0sIDMzMDUwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wMCA9IE11bHRIaSh5WzBdLCAxOTA3Nyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcDEgLT0gMTQyMzQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXAzIC09IDg3MDg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wMiArPSB0ZW1wMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcDQgLT0gMTc2ODU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHIgPSBWUDhDbGlwOCh0ZW1wMCArIHRlbXAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnID0gVlA4Q2xpcDgodGVtcDAgLSB0ZW1wMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYiA9IFZQOENsaXA4KHRlbXAwICsgdGVtcDQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXAwID0gTXVsdEhpKHlbMV0sIDE5MDc3KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3RbUl0gPSByOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0W0ddID0gZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdFtCXSA9IGI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoQSkgZHN0W0FdID0gMHhmZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgciA9IFZQOENsaXA4KHRlbXAwICsgdGVtcDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGcgPSBWUDhDbGlwOCh0ZW1wMCAtIHRlbXAyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBiID0gVlA4Q2xpcDgodGVtcDAgKyB0ZW1wNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0W1IgKyBYU1RFUF0gPSByOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdFtHICsgWFNURVBdID0gZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3RbQiArIFhTVEVQXSA9IGI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKEEpIGRzdFtBICsgWFNURVBdID0gMHhmZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHkgKz0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICArK3U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKyt2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdCArPSAyICogWFNURVA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChsZW4gJiAxKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXAxID0gTXVsdEhpKHZbMF0sIDI2MTQ5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wMyA9IE11bHRIaSh2WzBdLCAxMzMyMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcDIgPSBNdWx0SGkodVswXSwgNjQxOSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXA0ID0gTXVsdEhpKHVbMF0sIDMzMDUwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wMCA9IE11bHRIaSh5WzBdLCAxOTA3Nyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcDEgLT0gMTQyMzQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXAzIC09IDg3MDg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wMiArPSB0ZW1wMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcDQgLT0gMTc2ODU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHIgPSBWUDhDbGlwOCh0ZW1wMCArIHRlbXAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnID0gVlA4Q2xpcDgodGVtcDAgLSB0ZW1wMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYiA9IFZQOENsaXA4KHRlbXAwICsgdGVtcDQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdFtSXSA9IHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3RbR10gPSBnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0W0JdID0gYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChBKSBkc3RbQV0gPSAweGZmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK1JPV19GVU5DKFl1dlRvUmdiUm93X01JUFMzMiwgICAgICAzLCAwLCAxLCAyLCAwKQorUk9XX0ZVTkMoWXV2VG9SZ2JhUm93X01JUFMzMiwgICAgIDQsIDAsIDEsIDIsIDMpCitST1dfRlVOQyhZdXZUb0JnclJvd19NSVBTMzIsICAgICAgMywgMiwgMSwgMCwgMCkKK1JPV19GVU5DKFl1dlRvQmdyYVJvd19NSVBTMzIsICAgICA0LCAyLCAxLCAwLCAzKQorCisjdW5kZWYgUk9XX0ZVTkMKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFdlYlBJbml0U2FtcGxlcnNNSVBTMzIodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBXZWJQSW5pdFNhbXBsZXJzTUlQUzMyKHZvaWQpIHsKKyAgV2ViUFNhbXBsZXJzW01PREVfUkdCXSAgPSBZdXZUb1JnYlJvd19NSVBTMzI7CisgIFdlYlBTYW1wbGVyc1tNT0RFX1JHQkFdID0gWXV2VG9SZ2JhUm93X01JUFMzMjsKKyAgV2ViUFNhbXBsZXJzW01PREVfQkdSXSAgPSBZdXZUb0JnclJvd19NSVBTMzI7CisgIFdlYlBTYW1wbGVyc1tNT0RFX0JHUkFdID0gWXV2VG9CZ3JhUm93X01JUFMzMjsKK30KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9NSVBTMzIKKworV0VCUF9EU1BfSU5JVF9TVFVCKFdlYlBJbml0U2FtcGxlcnNNSVBTMzIpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfTUlQUzMyCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3l1dl9taXBzX2RzcF9yMi5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC95dXZfbWlwc19kc3BfcjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzhhZmNjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC95dXZfbWlwc19kc3BfcjIuYwpAQCAtMCwwICsxLDEzNCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIE1JUFMgRFNQcjIgdmVyc2lvbiBvZiBZVVYgdG8gUkdCIHVwc2FtcGxpbmcgZnVuY3Rpb25zLgorLy8KKy8vIEF1dGhvcihzKTogIEJyYW5pbWlyIFZhc2ljIChicmFuaW1pci52YXNpY0BpbWd0ZWMuY29tKQorLy8gICAgICAgICAgICAgRGpvcmRqZSBQZXN1dCAgKGRqb3JkamUucGVzdXRAaW1ndGVjLmNvbSkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFNfRFNQX1IyKQorCisjaW5jbHVkZSAic3JjL2RzcC95dXYuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHNpbXBsZSBwb2ludC1zYW1wbGluZworCisjZGVmaW5lIFJPV19GVU5DX1BBUlRfMSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAibGJ1ICAgICAgICAgICAgICAlW3RlbXAzXSwgICAwKCVbdl0pICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgImxidSAgICAgICAgICAgICAgJVt0ZW1wNF0sICAgMCglW3VdKSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJsYnUgICAgICAgICAgICAgICVbdGVtcDBdLCAgIDAoJVt5XSkgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibXVsICAgICAgICAgICAgICAlW3RlbXAxXSwgICAlW3RfY29uXzFdLCAgICAgJVt0ZW1wM10gICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgIm11bCAgICAgICAgICAgICAgJVt0ZW1wM10sICAgJVt0X2Nvbl8yXSwgICAgICVbdGVtcDNdICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJtdWwgICAgICAgICAgICAgICVbdGVtcDJdLCAgICVbdF9jb25fM10sICAgICAlW3RlbXA0XSAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibXVsICAgICAgICAgICAgICAlW3RlbXA0XSwgICAlW3RfY29uXzRdLCAgICAgJVt0ZW1wNF0gICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgIm11bCAgICAgICAgICAgICAgJVt0ZW1wMF0sICAgJVt0X2Nvbl81XSwgICAgICVbdGVtcDBdICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJzdWJ1ICAgICAgICAgICAgICVbdGVtcDFdLCAgICVbdGVtcDFdLCAgICAgICAlW3RfY29uXzZdICAgICAgXG5cdCIgICAgICAgICAgXAorICAic3VidSAgICAgICAgICAgICAlW3RlbXAzXSwgICAlW3RlbXAzXSwgICAgICAgJVt0X2Nvbl83XSAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgImFkZHUgICAgICAgICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgICAgICVbdGVtcDNdICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJzdWJ1ICAgICAgICAgICAgICVbdGVtcDRdLCAgICVbdGVtcDRdLCAgICAgICAlW3RfY29uXzhdICAgICAgXG5cdCIgICAgICAgICAgXAorCisjZGVmaW5lIFJPV19GVU5DX1BBUlRfMihSLCBHLCBCLCBLKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYWRkdSAgICAgICAgICAgICAlW3RlbXA1XSwgICAlW3RlbXAwXSwgICAgICAgJVt0ZW1wMV0gICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgInN1YnUgICAgICAgICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wMF0sICAgICAgICVbdGVtcDJdICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJhZGR1ICAgICAgICAgICAgICVbdGVtcDddLCAgICVbdGVtcDBdLCAgICAgICAlW3RlbXA0XSAgICAgICAgXG5cdCIgICAgICAgICAgXAorIi5pZiAiICNLICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgImxidSAgICAgICAgICAgICAgJVt0ZW1wMF0sICAgMSglW3ldKSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisiLmVuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic2hsbF9zLncgICAgICAgICAlW3RlbXA1XSwgICAlW3RlbXA1XSwgICAgICAgMTcgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgInNobGxfcy53ICAgICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wNl0sICAgICAgIDE3ICAgICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisiLmlmICIgI0sgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibXVsICAgICAgICAgICAgICAlW3RlbXAwXSwgICAlW3RfY29uXzVdLCAgICAgJVt0ZW1wMF0gICAgICAgIFxuXHQiICAgICAgICAgIFwKKyIuZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJzaGxsX3MudyAgICAgICAgICVbdGVtcDddLCAgICVbdGVtcDddLCAgICAgICAxNyAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAicHJlY3JxdV9zLnFiLnBoICAlW3RlbXA1XSwgICAlW3RlbXA1XSwgICAgICAgJHplcm8gICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgInByZWNycXVfcy5xYi5waCAgJVt0ZW1wNl0sICAgJVt0ZW1wNl0sICAgICAgICR6ZXJvICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJwcmVjcnF1X3MucWIucGggICVbdGVtcDddLCAgICVbdGVtcDddLCAgICAgICAkemVybyAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic3JsICAgICAgICAgICAgICAlW3RlbXA1XSwgICAlW3RlbXA1XSwgICAgICAgMjQgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgInNybCAgICAgICAgICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wNl0sICAgICAgIDI0ICAgICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJzcmwgICAgICAgICAgICAgICVbdGVtcDddLCAgICVbdGVtcDddLCAgICAgICAyNCAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic2IgICAgICAgICAgICAgICAlW3RlbXA1XSwgICAiICNSICIoJVtkc3RdKSAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgInNiICAgICAgICAgICAgICAgJVt0ZW1wNl0sICAgIiAjRyAiKCVbZHN0XSkgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJzYiAgICAgICAgICAgICAgICVbdGVtcDddLCAgICIgI0IgIiglW2RzdF0pICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorCisjZGVmaW5lIEFTTV9DTE9CQkVSX0xJU1QoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksICAgICAgICAgICAgIFwKKyAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLCAgICAgICAgICAgICBcCisgICAgW3RlbXA2XSI9JnIiKHRlbXA2KSwgW3RlbXA3XSI9JnIiKHRlbXA3KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICA6IFt0X2Nvbl8xXSJyIih0X2Nvbl8xKSwgW3RfY29uXzJdInIiKHRfY29uXzIpLCBbdF9jb25fM10iciIodF9jb25fMyksICAgICAgIFwKKyAgICBbdF9jb25fNF0iciIodF9jb25fNCksIFt0X2Nvbl81XSJyIih0X2Nvbl81KSwgW3RfY29uXzZdInIiKHRfY29uXzYpLCAgICAgICBcCisgICAgW3VdInIiKHUpLCBbdl0iciIodiksIFt5XSJyIih5KSwgW2RzdF0iciIoZHN0KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFt0X2Nvbl83XSJyIih0X2Nvbl83KSwgW3RfY29uXzhdInIiKHRfY29uXzgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgOiAibWVtb3J5IiwgImhpIiwgImxvIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisKKyNkZWZpbmUgUk9XX0ZVTkMoRlVOQ19OQU1FLCBYU1RFUCwgUiwgRywgQiwgQSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBGVU5DX05BTUUoY29uc3QgdWludDhfdCogeSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBsZW4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1aW50MzJfdCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNiwgdGVtcDc7ICAgICAgICAgICAgIFwKKyAgY29uc3QgaW50IHRfY29uXzEgPSAyNjE0OTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IGludCB0X2Nvbl8yID0gMTMzMjA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBpbnQgdF9jb25fMyA9IDY0MTk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgaW50IHRfY29uXzQgPSAzMzA1MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IGludCB0X2Nvbl81ID0gMTkwNzc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBpbnQgdF9jb25fNiA9IDE0MjM0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgaW50IHRfY29uXzcgPSA4NzA4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IGludCB0X2Nvbl84ID0gMTc2ODU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKGkgPSAwOyBpIDwgKGxlbiA+PiAxKTsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2FzbV9fIHZvbGF0aWxlICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBST1dfRlVOQ19QQVJUXzEoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgUk9XX0ZVTkNfUEFSVF8yKFIsIEcsIEIsIDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFJPV19GVU5DX1BBUlRfMihSICsgWFNURVAsIEcgKyBYU1RFUCwgQiArIFhTVEVQLCAwKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBBU01fQ0xPQkJFUl9MSVNUKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoQSkgZHN0W0FdID0gZHN0W0EgKyBYU1RFUF0gPSAweGZmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeSArPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICsrdTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICArK3Y7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0ICs9IDIgKiBYU1RFUDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGxlbiAmIDEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19hc21fXyB2b2xhdGlsZSAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgUk9XX0ZVTkNfUEFSVF8xKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFJPV19GVU5DX1BBUlRfMihSLCBHLCBCLCAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBBU01fQ0xPQkJFUl9MSVNUKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoQSkgZHN0W0FdID0gMHhmZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitST1dfRlVOQyhZdXZUb1JnYlJvd19NSVBTZHNwUjIsICAgICAgMywgMCwgMSwgMiwgMCkKK1JPV19GVU5DKFl1dlRvUmdiYVJvd19NSVBTZHNwUjIsICAgICA0LCAwLCAxLCAyLCAzKQorUk9XX0ZVTkMoWXV2VG9CZ3JSb3dfTUlQU2RzcFIyLCAgICAgIDMsIDIsIDEsIDAsIDApCitST1dfRlVOQyhZdXZUb0JncmFSb3dfTUlQU2RzcFIyLCAgICAgNCwgMiwgMSwgMCwgMykKKworI3VuZGVmIFJPV19GVU5DCisjdW5kZWYgQVNNX0NMT0JCRVJfTElTVAorI3VuZGVmIFJPV19GVU5DX1BBUlRfMgorI3VuZGVmIFJPV19GVU5DX1BBUlRfMQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgV2ViUEluaXRTYW1wbGVyc01JUFNkc3BSMih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFdlYlBJbml0U2FtcGxlcnNNSVBTZHNwUjIodm9pZCkgeworICBXZWJQU2FtcGxlcnNbTU9ERV9SR0JdICA9IFl1dlRvUmdiUm93X01JUFNkc3BSMjsKKyAgV2ViUFNhbXBsZXJzW01PREVfUkdCQV0gPSBZdXZUb1JnYmFSb3dfTUlQU2RzcFIyOworICBXZWJQU2FtcGxlcnNbTU9ERV9CR1JdICA9IFl1dlRvQmdyUm93X01JUFNkc3BSMjsKKyAgV2ViUFNhbXBsZXJzW01PREVfQkdSQV0gPSBZdXZUb0JncmFSb3dfTUlQU2RzcFIyOworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX01JUFNfRFNQX1IyCisKK1dFQlBfRFNQX0lOSVRfU1RVQihXZWJQSW5pdFNhbXBsZXJzTUlQU2RzcFIyKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX01JUFNfRFNQX1IyCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3l1dl9uZW9uLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3l1dl9uZW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM0ZDYwMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AveXV2X25lb24uYwpAQCAtMCwwICsxLDI4OCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFlVVi0+UkdCIGNvbnZlcnNpb24gZnVuY3Rpb25zCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgInNyYy9kc3AveXV2LmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX05FT04pCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgInNyYy9kc3AvbmVvbi5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB1aW50OHg4X3QgQ29udmVydFJHQlRvWV9ORU9OKGNvbnN0IHVpbnQ4eDhfdCBSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDh4OF90IEcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OHg4X3QgQikgeworICBjb25zdCB1aW50MTZ4OF90IHIgPSB2bW92bF91OChSKTsKKyAgY29uc3QgdWludDE2eDhfdCBnID0gdm1vdmxfdTgoRyk7CisgIGNvbnN0IHVpbnQxNng4X3QgYiA9IHZtb3ZsX3U4KEIpOworICBjb25zdCB1aW50MTZ4NF90IHJfbG8gPSB2Z2V0X2xvd191MTYocik7CisgIGNvbnN0IHVpbnQxNng0X3Qgcl9oaSA9IHZnZXRfaGlnaF91MTYocik7CisgIGNvbnN0IHVpbnQxNng0X3QgZ19sbyA9IHZnZXRfbG93X3UxNihnKTsKKyAgY29uc3QgdWludDE2eDRfdCBnX2hpID0gdmdldF9oaWdoX3UxNihnKTsKKyAgY29uc3QgdWludDE2eDRfdCBiX2xvID0gdmdldF9sb3dfdTE2KGIpOworICBjb25zdCB1aW50MTZ4NF90IGJfaGkgPSB2Z2V0X2hpZ2hfdTE2KGIpOworICBjb25zdCB1aW50MzJ4NF90IHRtcDBfbG8gPSB2bXVsbF9uX3UxNiggICAgICAgICByX2xvLCAxNjgzOXUpOworICBjb25zdCB1aW50MzJ4NF90IHRtcDBfaGkgPSB2bXVsbF9uX3UxNiggICAgICAgICByX2hpLCAxNjgzOXUpOworICBjb25zdCB1aW50MzJ4NF90IHRtcDFfbG8gPSB2bWxhbF9uX3UxNih0bXAwX2xvLCBnX2xvLCAzMzA1OXUpOworICBjb25zdCB1aW50MzJ4NF90IHRtcDFfaGkgPSB2bWxhbF9uX3UxNih0bXAwX2hpLCBnX2hpLCAzMzA1OXUpOworICBjb25zdCB1aW50MzJ4NF90IHRtcDJfbG8gPSB2bWxhbF9uX3UxNih0bXAxX2xvLCBiX2xvLCA2NDIwdSk7CisgIGNvbnN0IHVpbnQzMng0X3QgdG1wMl9oaSA9IHZtbGFsX25fdTE2KHRtcDFfaGksIGJfaGksIDY0MjB1KTsKKyAgY29uc3QgdWludDE2eDhfdCBZMSA9IHZjb21iaW5lX3UxNih2cnNocm5fbl91MzIodG1wMl9sbywgMTYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZyc2hybl9uX3UzMih0bXAyX2hpLCAxNikpOworICBjb25zdCB1aW50MTZ4OF90IFkyID0gdmFkZHFfdTE2KFkxLCB2ZHVwcV9uX3UxNigxNikpOworICByZXR1cm4gdnFtb3ZuX3UxNihZMik7Cit9CisKK3N0YXRpYyB2b2lkIENvbnZlcnRSR0IyNFRvWV9ORU9OKGNvbnN0IHVpbnQ4X3QqIHJnYiwgdWludDhfdCogeSwgaW50IHdpZHRoKSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpICsgOCA8PSB3aWR0aDsgaSArPSA4LCByZ2IgKz0gMyAqIDgpIHsKKyAgICBjb25zdCB1aW50OHg4eDNfdCBSR0IgPSB2bGQzX3U4KHJnYik7CisgICAgY29uc3QgdWludDh4OF90IFkgPSBDb252ZXJ0UkdCVG9ZX05FT04oUkdCLnZhbFswXSwgUkdCLnZhbFsxXSwgUkdCLnZhbFsyXSk7CisgICAgdnN0MV91OCh5ICsgaSwgWSk7CisgIH0KKyAgZm9yICg7IGkgPCB3aWR0aDsgKytpLCByZ2IgKz0gMykgeyAgIC8vIGxlZnQtb3ZlcgorICAgIHlbaV0gPSBWUDhSR0JUb1kocmdiWzBdLCByZ2JbMV0sIHJnYlsyXSwgWVVWX0hBTEYpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIENvbnZlcnRCR1IyNFRvWV9ORU9OKGNvbnN0IHVpbnQ4X3QqIGJnciwgdWludDhfdCogeSwgaW50IHdpZHRoKSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpICsgOCA8PSB3aWR0aDsgaSArPSA4LCBiZ3IgKz0gMyAqIDgpIHsKKyAgICBjb25zdCB1aW50OHg4eDNfdCBCR1IgPSB2bGQzX3U4KGJncik7CisgICAgY29uc3QgdWludDh4OF90IFkgPSBDb252ZXJ0UkdCVG9ZX05FT04oQkdSLnZhbFsyXSwgQkdSLnZhbFsxXSwgQkdSLnZhbFswXSk7CisgICAgdnN0MV91OCh5ICsgaSwgWSk7CisgIH0KKyAgZm9yICg7IGkgPCB3aWR0aDsgKytpLCBiZ3IgKz0gMykgeyAgLy8gbGVmdC1vdmVyCisgICAgeVtpXSA9IFZQOFJHQlRvWShiZ3JbMl0sIGJnclsxXSwgYmdyWzBdLCBZVVZfSEFMRik7CisgIH0KK30KKworc3RhdGljIHZvaWQgQ29udmVydEFSR0JUb1lfTkVPTihjb25zdCB1aW50MzJfdCogYXJnYiwgdWludDhfdCogeSwgaW50IHdpZHRoKSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpICsgOCA8PSB3aWR0aDsgaSArPSA4KSB7CisgICAgY29uc3QgdWludDh4OHg0X3QgUkdCID0gdmxkNF91OCgoY29uc3QgdWludDhfdCopJmFyZ2JbaV0pOworICAgIGNvbnN0IHVpbnQ4eDhfdCBZID0gQ29udmVydFJHQlRvWV9ORU9OKFJHQi52YWxbMl0sIFJHQi52YWxbMV0sIFJHQi52YWxbMF0pOworICAgIHZzdDFfdTgoeSArIGksIFkpOworICB9CisgIGZvciAoOyBpIDwgd2lkdGg7ICsraSkgeyAgIC8vIGxlZnQtb3ZlcgorICAgIGNvbnN0IHVpbnQzMl90IHAgPSBhcmdiW2ldOworICAgIHlbaV0gPSBWUDhSR0JUb1koKHAgPj4gMTYpICYgMHhmZiwgKHAgPj4gOCkgJiAweGZmLCAocCA+PiAgMCkgJiAweGZmLAorICAgICAgICAgICAgICAgICAgICAgWVVWX0hBTEYpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gY29tcHV0ZXM6IERTVF9zMTYgPSBbKEMwICogciArIEMxICogZyArIEMyICogYikgPj4gMTZdICsgQ1NUCisjZGVmaW5lIE1VTFRJUExZXzE2Yl9QUkVBTUJMRShyLCBnLCBiKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgaW50MTZ4NF90IHJfbG8gPSB2cmVpbnRlcnByZXRfczE2X3UxNih2Z2V0X2xvd191MTYocikpOyAgXAorICBjb25zdCBpbnQxNng0X3Qgcl9oaSA9IHZyZWludGVycHJldF9zMTZfdTE2KHZnZXRfaGlnaF91MTYocikpOyBcCisgIGNvbnN0IGludDE2eDRfdCBnX2xvID0gdnJlaW50ZXJwcmV0X3MxNl91MTYodmdldF9sb3dfdTE2KGcpKTsgIFwKKyAgY29uc3QgaW50MTZ4NF90IGdfaGkgPSB2cmVpbnRlcnByZXRfczE2X3UxNih2Z2V0X2hpZ2hfdTE2KGcpKTsgXAorICBjb25zdCBpbnQxNng0X3QgYl9sbyA9IHZyZWludGVycHJldF9zMTZfdTE2KHZnZXRfbG93X3UxNihiKSk7ICBcCisgIGNvbnN0IGludDE2eDRfdCBiX2hpID0gdnJlaW50ZXJwcmV0X3MxNl91MTYodmdldF9oaWdoX3UxNihiKSkKKworI2RlZmluZSBNVUxUSVBMWV8xNmIoQzAsIEMxLCBDMiwgQ1NULCBEU1RfczE2KSBkbyB7ICAgICAgICAgICAgICBcCisgIGNvbnN0IGludDMyeDRfdCB0bXAwX2xvID0gdm11bGxfbl9zMTYoICAgICAgICAgcl9sbywgQzApOyAgICAgIFwKKyAgY29uc3QgaW50MzJ4NF90IHRtcDBfaGkgPSB2bXVsbF9uX3MxNiggICAgICAgICByX2hpLCBDMCk7ICAgICAgXAorICBjb25zdCBpbnQzMng0X3QgdG1wMV9sbyA9IHZtbGFsX25fczE2KHRtcDBfbG8sIGdfbG8sIEMxKTsgICAgICBcCisgIGNvbnN0IGludDMyeDRfdCB0bXAxX2hpID0gdm1sYWxfbl9zMTYodG1wMF9oaSwgZ19oaSwgQzEpOyAgICAgIFwKKyAgY29uc3QgaW50MzJ4NF90IHRtcDJfbG8gPSB2bWxhbF9uX3MxNih0bXAxX2xvLCBiX2xvLCBDMik7ICAgICAgXAorICBjb25zdCBpbnQzMng0X3QgdG1wMl9oaSA9IHZtbGFsX25fczE2KHRtcDFfaGksIGJfaGksIEMyKTsgICAgICBcCisgIGNvbnN0IGludDE2eDhfdCB0bXAzID0gdmNvbWJpbmVfczE2KHZzaHJuX25fczMyKHRtcDJfbG8sIDE2KSwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnNocm5fbl9zMzIodG1wMl9oaSwgMTYpKTsgXAorICBEU1RfczE2ID0gdmFkZHFfczE2KHRtcDMsIHZkdXBxX25fczE2KENTVCkpOyAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisvLyBUaGlzIG5lZWRzIHRvIGJlIGEgbWFjcm8sIHNpbmNlICgxMjggPDwgU0hJRlQpIG5lZWRzIHRvIGJlIGFuIGltbWVkaWF0ZS4KKyNkZWZpbmUgQ09OVkVSVF9SR0JfVE9fVVYociwgZywgYiwgU0hJRlQsIFVfRFNULCBWX0RTVCkgZG8geyAgICAgXAorICBNVUxUSVBMWV8xNmJfUFJFQU1CTEUociwgZywgYik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIE1VTFRJUExZXzE2YigtOTcxOSwgLTE5MDgxLCAyODgwMCwgMTI4IDw8IFNISUZULCBVX0RTVCk7ICAgICAgIFwKKyAgTVVMVElQTFlfMTZiKDI4ODAwLCAtMjQxMTYsIC00Njg0LCAxMjggPDwgU0hJRlQsIFZfRFNUKTsgICAgICAgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgQ29udmVydFJHQkEzMlRvVVZfTkVPTihjb25zdCB1aW50MTZfdCogcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB1LCB1aW50OF90KiB2LCBpbnQgd2lkdGgpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgKyA4IDw9IHdpZHRoOyBpICs9IDgsIHJnYiArPSA0ICogOCkgeworICAgIGNvbnN0IHVpbnQxNng4eDRfdCBSR0IgPSB2bGQ0cV91MTYoKGNvbnN0IHVpbnQxNl90KilyZ2IpOworICAgIGludDE2eDhfdCBVLCBWOworICAgIENPTlZFUlRfUkdCX1RPX1VWKFJHQi52YWxbMF0sIFJHQi52YWxbMV0sIFJHQi52YWxbMl0sIDIsIFUsIFYpOworICAgIHZzdDFfdTgodSArIGksIHZxcnNocnVuX25fczE2KFUsIDIpKTsKKyAgICB2c3QxX3U4KHYgKyBpLCB2cXJzaHJ1bl9uX3MxNihWLCAyKSk7CisgIH0KKyAgZm9yICg7IGkgPCB3aWR0aDsgaSArPSAxLCByZ2IgKz0gNCkgeworICAgIGNvbnN0IGludCByID0gcmdiWzBdLCBnID0gcmdiWzFdLCBiID0gcmdiWzJdOworICAgIHVbaV0gPSBWUDhSR0JUb1UociwgZywgYiwgWVVWX0hBTEYgPDwgMik7CisgICAgdltpXSA9IFZQOFJHQlRvVihyLCBnLCBiLCBZVVZfSEFMRiA8PCAyKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBDb252ZXJ0QVJHQlRvVVZfTkVPTihjb25zdCB1aW50MzJfdCogYXJnYiwgdWludDhfdCogdSwgdWludDhfdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfd2lkdGgsIGludCBkb19zdG9yZSkgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSArIDE2IDw9IHNyY193aWR0aDsgaSArPSAxNiwgdSArPSA4LCB2ICs9IDgpIHsKKyAgICBjb25zdCB1aW50OHgxNng0X3QgUkdCID0gdmxkNHFfdTgoKGNvbnN0IHVpbnQ4X3QqKSZhcmdiW2ldKTsKKyAgICBjb25zdCB1aW50MTZ4OF90IFIgPSB2cGFkZGxxX3U4KFJHQi52YWxbMl0pOyAgLy8gcGFpci13aXNlIGFkZHMKKyAgICBjb25zdCB1aW50MTZ4OF90IEcgPSB2cGFkZGxxX3U4KFJHQi52YWxbMV0pOworICAgIGNvbnN0IHVpbnQxNng4X3QgQiA9IHZwYWRkbHFfdTgoUkdCLnZhbFswXSk7CisgICAgaW50MTZ4OF90IFVfdG1wLCBWX3RtcDsKKyAgICBDT05WRVJUX1JHQl9UT19VVihSLCBHLCBCLCAxLCBVX3RtcCwgVl90bXApOworICAgIHsKKyAgICAgIGNvbnN0IHVpbnQ4eDhfdCBVID0gdnFyc2hydW5fbl9zMTYoVV90bXAsIDEpOworICAgICAgY29uc3QgdWludDh4OF90IFYgPSB2cXJzaHJ1bl9uX3MxNihWX3RtcCwgMSk7CisgICAgICBpZiAoZG9fc3RvcmUpIHsKKyAgICAgICAgdnN0MV91OCh1LCBVKTsKKyAgICAgICAgdnN0MV91OCh2LCBWKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IHVpbnQ4eDhfdCBwcmV2X3UgPSB2bGQxX3U4KHUpOworICAgICAgICBjb25zdCB1aW50OHg4X3QgcHJldl92ID0gdmxkMV91OCh2KTsKKyAgICAgICAgdnN0MV91OCh1LCB2cmhhZGRfdTgoVSwgcHJldl91KSk7CisgICAgICAgIHZzdDFfdTgodiwgdnJoYWRkX3U4KFYsIHByZXZfdikpOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoaSA8IHNyY193aWR0aCkgeyAgLy8gbGVmdC1vdmVyCisgICAgV2ViUENvbnZlcnRBUkdCVG9VVl9DKGFyZ2IgKyBpLCB1LCB2LCBzcmNfd2lkdGggLSBpLCBkb19zdG9yZSk7CisgIH0KK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitleHRlcm4gdm9pZCBXZWJQSW5pdENvbnZlcnRBUkdCVG9ZVVZORU9OKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgV2ViUEluaXRDb252ZXJ0QVJHQlRvWVVWTkVPTih2b2lkKSB7CisgIFdlYlBDb252ZXJ0UkdCMjRUb1kgPSBDb252ZXJ0UkdCMjRUb1lfTkVPTjsKKyAgV2ViUENvbnZlcnRCR1IyNFRvWSA9IENvbnZlcnRCR1IyNFRvWV9ORU9OOworICBXZWJQQ29udmVydEFSR0JUb1kgPSBDb252ZXJ0QVJHQlRvWV9ORU9OOworICBXZWJQQ29udmVydEFSR0JUb1VWID0gQ29udmVydEFSR0JUb1VWX05FT047CisgIFdlYlBDb252ZXJ0UkdCQTMyVG9VViA9IENvbnZlcnRSR0JBMzJUb1VWX05FT047Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgTUFYX1kgKCgxIDw8IDEwKSAtIDEpICAgIC8vIDEwYiBwcmVjaXNpb24gb3ZlciAxNmItYXJpdGhtZXRpYworc3RhdGljIHVpbnQxNl90IGNsaXBfeV9ORU9OKGludCB2KSB7CisgIHJldHVybiAodiA8IDApID8gMCA6ICh2ID4gTUFYX1kpID8gTUFYX1kgOiAodWludDE2X3QpdjsKK30KKworc3RhdGljIHVpbnQ2NF90IFNoYXJwWVVWVXBkYXRlWV9ORU9OKGNvbnN0IHVpbnQxNl90KiByZWYsIGNvbnN0IHVpbnQxNl90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIGRzdCwgaW50IGxlbikgeworICBpbnQgaTsKKyAgY29uc3QgaW50MTZ4OF90IHplcm8gPSB2ZHVwcV9uX3MxNigwKTsKKyAgY29uc3QgaW50MTZ4OF90IG1heCA9IHZkdXBxX25fczE2KE1BWF9ZKTsKKyAgdWludDY0eDJfdCBzdW0gPSB2ZHVwcV9uX3U2NCgwKTsKKyAgdWludDY0X3QgZGlmZjsKKworICBmb3IgKGkgPSAwOyBpICsgOCA8PSBsZW47IGkgKz0gOCkgeworICAgIGNvbnN0IGludDE2eDhfdCBBID0gdnJlaW50ZXJwcmV0cV9zMTZfdTE2KHZsZDFxX3UxNihyZWYgKyBpKSk7CisgICAgY29uc3QgaW50MTZ4OF90IEIgPSB2cmVpbnRlcnByZXRxX3MxNl91MTYodmxkMXFfdTE2KHNyYyArIGkpKTsKKyAgICBjb25zdCBpbnQxNng4X3QgQyA9IHZyZWludGVycHJldHFfczE2X3UxNih2bGQxcV91MTYoZHN0ICsgaSkpOworICAgIGNvbnN0IGludDE2eDhfdCBEID0gdnN1YnFfczE2KEEsIEIpOyAgICAgICAvLyBkaWZmX3kKKyAgICBjb25zdCBpbnQxNng4X3QgRiA9IHZhZGRxX3MxNihDLCBEKTsgICAgICAgLy8gbmV3X3kKKyAgICBjb25zdCB1aW50MTZ4OF90IEggPQorICAgICAgICB2cmVpbnRlcnByZXRxX3UxNl9zMTYodm1heHFfczE2KHZtaW5xX3MxNihGLCBtYXgpLCB6ZXJvKSk7CisgICAgY29uc3QgaW50MTZ4OF90IEkgPSB2YWJzcV9zMTYoRCk7ICAgICAgICAgIC8vIGFicyhkaWZmX3kpCisgICAgdnN0MXFfdTE2KGRzdCArIGksIEgpOworICAgIHN1bSA9IHZwYWRhbHFfdTMyKHN1bSwgdnBhZGRscV91MTYodnJlaW50ZXJwcmV0cV91MTZfczE2KEkpKSk7CisgIH0KKyAgZGlmZiA9IHZnZXRxX2xhbmVfdTY0KHN1bSwgMCkgKyB2Z2V0cV9sYW5lX3U2NChzdW0sIDEpOworICBmb3IgKDsgaSA8IGxlbjsgKytpKSB7CisgICAgY29uc3QgaW50IGRpZmZfeSA9IHJlZltpXSAtIHNyY1tpXTsKKyAgICBjb25zdCBpbnQgbmV3X3kgPSAoaW50KShkc3RbaV0pICsgZGlmZl95OworICAgIGRzdFtpXSA9IGNsaXBfeV9ORU9OKG5ld195KTsKKyAgICBkaWZmICs9ICh1aW50NjRfdCkoYWJzKGRpZmZfeSkpOworICB9CisgIHJldHVybiBkaWZmOworfQorCitzdGF0aWMgdm9pZCBTaGFycFlVVlVwZGF0ZVJHQl9ORU9OKGNvbnN0IGludDE2X3QqIHJlZiwgY29uc3QgaW50MTZfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90KiBkc3QsIGludCBsZW4pIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgKyA4IDw9IGxlbjsgaSArPSA4KSB7CisgICAgY29uc3QgaW50MTZ4OF90IEEgPSB2bGQxcV9zMTYocmVmICsgaSk7CisgICAgY29uc3QgaW50MTZ4OF90IEIgPSB2bGQxcV9zMTYoc3JjICsgaSk7CisgICAgY29uc3QgaW50MTZ4OF90IEMgPSB2bGQxcV9zMTYoZHN0ICsgaSk7CisgICAgY29uc3QgaW50MTZ4OF90IEQgPSB2c3VicV9zMTYoQSwgQik7ICAgLy8gZGlmZl91dgorICAgIGNvbnN0IGludDE2eDhfdCBFID0gdmFkZHFfczE2KEMsIEQpOyAgIC8vIG5ld191dgorICAgIHZzdDFxX3MxNihkc3QgKyBpLCBFKTsKKyAgfQorICBmb3IgKDsgaSA8IGxlbjsgKytpKSB7CisgICAgY29uc3QgaW50IGRpZmZfdXYgPSByZWZbaV0gLSBzcmNbaV07CisgICAgZHN0W2ldICs9IGRpZmZfdXY7CisgIH0KK30KKworc3RhdGljIHZvaWQgU2hhcnBZVVZGaWx0ZXJSb3dfTkVPTihjb25zdCBpbnQxNl90KiBBLCBjb25zdCBpbnQxNl90KiBCLCBpbnQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCogYmVzdF95LCB1aW50MTZfdCogb3V0KSB7CisgIGludCBpOworICBjb25zdCBpbnQxNng4X3QgbWF4ID0gdmR1cHFfbl9zMTYoTUFYX1kpOworICBjb25zdCBpbnQxNng4X3QgemVybyA9IHZkdXBxX25fczE2KDApOworICBmb3IgKGkgPSAwOyBpICsgOCA8PSBsZW47IGkgKz0gOCkgeworICAgIGNvbnN0IGludDE2eDhfdCBhMCA9IHZsZDFxX3MxNihBICsgaSArIDApOworICAgIGNvbnN0IGludDE2eDhfdCBhMSA9IHZsZDFxX3MxNihBICsgaSArIDEpOworICAgIGNvbnN0IGludDE2eDhfdCBiMCA9IHZsZDFxX3MxNihCICsgaSArIDApOworICAgIGNvbnN0IGludDE2eDhfdCBiMSA9IHZsZDFxX3MxNihCICsgaSArIDEpOworICAgIGNvbnN0IGludDE2eDhfdCBhMGIxID0gdmFkZHFfczE2KGEwLCBiMSk7CisgICAgY29uc3QgaW50MTZ4OF90IGExYjAgPSB2YWRkcV9zMTYoYTEsIGIwKTsKKyAgICBjb25zdCBpbnQxNng4X3QgYTBhMWIwYjEgPSB2YWRkcV9zMTYoYTBiMSwgYTFiMCk7ICAvLyBBMCtBMStCMCtCMQorICAgIGNvbnN0IGludDE2eDhfdCBhMGIxXzIgPSB2YWRkcV9zMTYoYTBiMSwgYTBiMSk7ICAgIC8vIDIqKEEwK0IxKQorICAgIGNvbnN0IGludDE2eDhfdCBhMWIwXzIgPSB2YWRkcV9zMTYoYTFiMCwgYTFiMCk7ICAgIC8vIDIqKEExK0IwKQorICAgIGNvbnN0IGludDE2eDhfdCBjMCA9IHZzaHJxX25fczE2KHZhZGRxX3MxNihhMGIxXzIsIGEwYTFiMGIxKSwgMyk7CisgICAgY29uc3QgaW50MTZ4OF90IGMxID0gdnNocnFfbl9zMTYodmFkZHFfczE2KGExYjBfMiwgYTBhMWIwYjEpLCAzKTsKKyAgICBjb25zdCBpbnQxNng4X3QgZDAgPSB2YWRkcV9zMTYoYzEsIGEwKTsKKyAgICBjb25zdCBpbnQxNng4X3QgZDEgPSB2YWRkcV9zMTYoYzAsIGExKTsKKyAgICBjb25zdCBpbnQxNng4X3QgZTAgPSB2cnNocnFfbl9zMTYoZDAsIDEpOworICAgIGNvbnN0IGludDE2eDhfdCBlMSA9IHZyc2hycV9uX3MxNihkMSwgMSk7CisgICAgY29uc3QgaW50MTZ4OHgyX3QgZiA9IHZ6aXBxX3MxNihlMCwgZTEpOworICAgIGNvbnN0IGludDE2eDhfdCBnMCA9IHZyZWludGVycHJldHFfczE2X3UxNih2bGQxcV91MTYoYmVzdF95ICsgMiAqIGkgKyAwKSk7CisgICAgY29uc3QgaW50MTZ4OF90IGcxID0gdnJlaW50ZXJwcmV0cV9zMTZfdTE2KHZsZDFxX3UxNihiZXN0X3kgKyAyICogaSArIDgpKTsKKyAgICBjb25zdCBpbnQxNng4X3QgaDAgPSB2YWRkcV9zMTYoZzAsIGYudmFsWzBdKTsKKyAgICBjb25zdCBpbnQxNng4X3QgaDEgPSB2YWRkcV9zMTYoZzEsIGYudmFsWzFdKTsKKyAgICBjb25zdCBpbnQxNng4X3QgaTAgPSB2bWF4cV9zMTYodm1pbnFfczE2KGgwLCBtYXgpLCB6ZXJvKTsKKyAgICBjb25zdCBpbnQxNng4X3QgaTEgPSB2bWF4cV9zMTYodm1pbnFfczE2KGgxLCBtYXgpLCB6ZXJvKTsKKyAgICB2c3QxcV91MTYob3V0ICsgMiAqIGkgKyAwLCB2cmVpbnRlcnByZXRxX3UxNl9zMTYoaTApKTsKKyAgICB2c3QxcV91MTYob3V0ICsgMiAqIGkgKyA4LCB2cmVpbnRlcnByZXRxX3UxNl9zMTYoaTEpKTsKKyAgfQorICBmb3IgKDsgaSA8IGxlbjsgKytpKSB7CisgICAgY29uc3QgaW50IGEwYjEgPSBBW2kgKyAwXSArIEJbaSArIDFdOworICAgIGNvbnN0IGludCBhMWIwID0gQVtpICsgMV0gKyBCW2kgKyAwXTsKKyAgICBjb25zdCBpbnQgYTBhMWIwYjEgPSBhMGIxICsgYTFiMCArIDg7CisgICAgY29uc3QgaW50IHYwID0gKDggKiBBW2kgKyAwXSArIDIgKiBhMWIwICsgYTBhMWIwYjEpID4+IDQ7CisgICAgY29uc3QgaW50IHYxID0gKDggKiBBW2kgKyAxXSArIDIgKiBhMGIxICsgYTBhMWIwYjEpID4+IDQ7CisgICAgb3V0WzIgKiBpICsgMF0gPSBjbGlwX3lfTkVPTihiZXN0X3lbMiAqIGkgKyAwXSArIHYwKTsKKyAgICBvdXRbMiAqIGkgKyAxXSA9IGNsaXBfeV9ORU9OKGJlc3RfeVsyICogaSArIDFdICsgdjEpOworICB9Cit9CisjdW5kZWYgTUFYX1kKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZXh0ZXJuIHZvaWQgV2ViUEluaXRTaGFycFlVVk5FT04odm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBXZWJQSW5pdFNoYXJwWVVWTkVPTih2b2lkKSB7CisgIFdlYlBTaGFycFlVVlVwZGF0ZVkgPSBTaGFycFlVVlVwZGF0ZVlfTkVPTjsKKyAgV2ViUFNoYXJwWVVWVXBkYXRlUkdCID0gU2hhcnBZVVZVcGRhdGVSR0JfTkVPTjsKKyAgV2ViUFNoYXJwWVVWRmlsdGVyUm93ID0gU2hhcnBZVVZGaWx0ZXJSb3dfTkVPTjsKK30KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9ORU9OCisKK1dFQlBfRFNQX0lOSVRfU1RVQihXZWJQSW5pdENvbnZlcnRBUkdCVG9ZVVZORU9OKQorV0VCUF9EU1BfSU5JVF9TVFVCKFdlYlBJbml0U2hhcnBZVVZORU9OKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX05FT04KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AveXV2X3NzZTIuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AveXV2X3NzZTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWE0OGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC95dXZfc3NlMi5jCkBAIC0wLDAgKzEsODc0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gWVVWLT5SR0IgY29udmVyc2lvbiBmdW5jdGlvbnMKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSAic3JjL2RzcC95dXYuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFMikKKworI2luY2x1ZGUgInNyYy9kc3AvY29tbW9uX3NzZTIuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlbW1pbnRyaW4uaD4KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29udmVydCBzcGFucyBvZiAzMiBwaXhlbHMgdG8gdmFyaW91cyBSR0IgZm9ybWF0cyBmb3IgdGhlIGZhbmN5IHVwc2FtcGxlci4KKworLy8gVGhlc2UgY29uc3RhbnRzIGFyZSAxNGIgZml4ZWQtcG9pbnQgdmVyc2lvbiBvZiBJVFUtUiBCVC42MDEgY29uc3RhbnRzLgorLy8gUiA9ICgxOTA3NyAqIHkgICAgICAgICAgICAgKyAyNjE0OSAqIHYgLSAxNDIzNCkgPj4gNgorLy8gRyA9ICgxOTA3NyAqIHkgLSAgNjQxOSAqIHUgLSAxMzMyMCAqIHYgKyAgODcwOCkgPj4gNgorLy8gQiA9ICgxOTA3NyAqIHkgKyAzMzA1MCAqIHUgICAgICAgICAgICAgLSAxNzY4NSkgPj4gNgorc3RhdGljIHZvaWQgQ29udmVydFlVVjQ0NFRvUkdCX1NTRTIoY29uc3QgX19tMTI4aSogY29uc3QgWTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBVMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IFYwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IEcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBCKSB7CisgIGNvbnN0IF9fbTEyOGkgazE5MDc3ID0gX21tX3NldDFfZXBpMTYoMTkwNzcpOworICBjb25zdCBfX20xMjhpIGsyNjE0OSA9IF9tbV9zZXQxX2VwaTE2KDI2MTQ5KTsKKyAgY29uc3QgX19tMTI4aSBrMTQyMzQgPSBfbW1fc2V0MV9lcGkxNigxNDIzNCk7CisgIC8vIDMzMDUwIGRvZXNuJ3QgZml0IGluIGEgc2lnbmVkIHNob3J0OiBvbmx5IHVzZSB0aGlzIHdpdGggdW5zaWduZWQgYXJpdGhtZXRpYworICBjb25zdCBfX20xMjhpIGszMzA1MCA9IF9tbV9zZXQxX2VwaTE2KChzaG9ydCkzMzA1MCk7CisgIGNvbnN0IF9fbTEyOGkgazE3Njg1ID0gX21tX3NldDFfZXBpMTYoMTc2ODUpOworICBjb25zdCBfX20xMjhpIGs2NDE5ICA9IF9tbV9zZXQxX2VwaTE2KDY0MTkpOworICBjb25zdCBfX20xMjhpIGsxMzMyMCA9IF9tbV9zZXQxX2VwaTE2KDEzMzIwKTsKKyAgY29uc3QgX19tMTI4aSBrODcwOCAgPSBfbW1fc2V0MV9lcGkxNig4NzA4KTsKKworICBjb25zdCBfX20xMjhpIFkxID0gX21tX211bGhpX2VwdTE2KCpZMCwgazE5MDc3KTsKKworICBjb25zdCBfX20xMjhpIFIwID0gX21tX211bGhpX2VwdTE2KCpWMCwgazI2MTQ5KTsKKyAgY29uc3QgX19tMTI4aSBSMSA9IF9tbV9zdWJfZXBpMTYoWTEsIGsxNDIzNCk7CisgIGNvbnN0IF9fbTEyOGkgUjIgPSBfbW1fYWRkX2VwaTE2KFIxLCBSMCk7CisKKyAgY29uc3QgX19tMTI4aSBHMCA9IF9tbV9tdWxoaV9lcHUxNigqVTAsIGs2NDE5KTsKKyAgY29uc3QgX19tMTI4aSBHMSA9IF9tbV9tdWxoaV9lcHUxNigqVjAsIGsxMzMyMCk7CisgIGNvbnN0IF9fbTEyOGkgRzIgPSBfbW1fYWRkX2VwaTE2KFkxLCBrODcwOCk7CisgIGNvbnN0IF9fbTEyOGkgRzMgPSBfbW1fYWRkX2VwaTE2KEcwLCBHMSk7CisgIGNvbnN0IF9fbTEyOGkgRzQgPSBfbW1fc3ViX2VwaTE2KEcyLCBHMyk7CisKKyAgLy8gYmUgY2FyZWZ1bCB3aXRoIHRoZSBzYXR1cmF0ZWQgKnVuc2lnbmVkKiBhcml0aG1ldGljIGhlcmUhCisgIGNvbnN0IF9fbTEyOGkgQjAgPSBfbW1fbXVsaGlfZXB1MTYoKlUwLCBrMzMwNTApOworICBjb25zdCBfX20xMjhpIEIxID0gX21tX2FkZHNfZXB1MTYoQjAsIFkxKTsKKyAgY29uc3QgX19tMTI4aSBCMiA9IF9tbV9zdWJzX2VwdTE2KEIxLCBrMTc2ODUpOworCisgIC8vIHVzZSBsb2dpY2FsIHNoaWZ0IGZvciBCMiwgd2hpY2ggY2FuIGJlIGxhcmdlciB0aGFuIDMyNzY3CisgICpSID0gX21tX3NyYWlfZXBpMTYoUjIsIDYpOyAgIC8vIHJhbmdlOiBbLTE0MjM0LCAzMDgxNV0KKyAgKkcgPSBfbW1fc3JhaV9lcGkxNihHNCwgNik7ICAgLy8gcmFuZ2U6IFstMTA5NTMsIDI3NzEwXQorICAqQiA9IF9tbV9zcmxpX2VwaTE2KEIyLCA2KTsgICAvLyByYW5nZTogWzAsIDM0MjM4XQorfQorCisvLyBMb2FkIHRoZSBieXRlcyBpbnRvIHRoZSAqdXBwZXIqIHBhcnQgb2YgMTZiIHdvcmRzLiBUaGF0J3MgIjw8IDgiLCBiYXNpY2FsbHkuCitzdGF0aWMgV0VCUF9JTkxJTkUgX19tMTI4aSBMb2FkX0hJXzE2X1NTRTIoY29uc3QgdWludDhfdCogc3JjKSB7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIHJldHVybiBfbW1fdW5wYWNrbG9fZXBpOCh6ZXJvLCBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKXNyYykpOworfQorCisvLyBMb2FkIGFuZCByZXBsaWNhdGUgdGhlIFUvViBzYW1wbGVzCitzdGF0aWMgV0VCUF9JTkxJTkUgX19tMTI4aSBMb2FkX1VWX0hJXzhfU1NFMihjb25zdCB1aW50OF90KiBzcmMpIHsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgY29uc3QgX19tMTI4aSB0bXAwID0gX21tX2N2dHNpMzJfc2kxMjgoKihjb25zdCB1aW50MzJfdCopc3JjKTsKKyAgY29uc3QgX19tMTI4aSB0bXAxID0gX21tX3VucGFja2xvX2VwaTgoemVybywgdG1wMCk7CisgIHJldHVybiBfbW1fdW5wYWNrbG9fZXBpMTYodG1wMSwgdG1wMSk7ICAgLy8gcmVwbGljYXRlIHNhbXBsZXMKK30KKworLy8gQ29udmVydCAzMiBzYW1wbGVzIG9mIFlVVjQ0NCB0byBSL0cvQgorc3RhdGljIHZvaWQgWVVWNDQ0VG9SR0JfU1NFMihjb25zdCB1aW50OF90KiBjb25zdCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCB1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBSLCBfX20xMjhpKiBjb25zdCBHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBCKSB7CisgIGNvbnN0IF9fbTEyOGkgWTAgPSBMb2FkX0hJXzE2X1NTRTIoeSksIFUwID0gTG9hZF9ISV8xNl9TU0UyKHUpLAorICAgICAgICAgICAgICAgIFYwID0gTG9hZF9ISV8xNl9TU0UyKHYpOworICBDb252ZXJ0WVVWNDQ0VG9SR0JfU1NFMigmWTAsICZVMCwgJlYwLCBSLCBHLCBCKTsKK30KKworLy8gQ29udmVydCAzMiBzYW1wbGVzIG9mIFlVVjQyMCB0byBSL0cvQgorc3RhdGljIHZvaWQgWVVWNDIwVG9SR0JfU1NFMihjb25zdCB1aW50OF90KiBjb25zdCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCB1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBSLCBfX20xMjhpKiBjb25zdCBHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBCKSB7CisgIGNvbnN0IF9fbTEyOGkgWTAgPSBMb2FkX0hJXzE2X1NTRTIoeSksIFUwID0gTG9hZF9VVl9ISV84X1NTRTIodSksCisgICAgICAgICAgICAgICAgVjAgPSBMb2FkX1VWX0hJXzhfU1NFMih2KTsKKyAgQ29udmVydFlVVjQ0NFRvUkdCX1NTRTIoJlkwLCAmVTAsICZWMCwgUiwgRywgQik7Cit9CisKKy8vIFBhY2sgUi9HL0IvQSByZXN1bHRzIGludG8gMzJiIG91dHB1dC4KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFBhY2tBbmRTdG9yZTRfU1NFMihjb25zdCBfX20xMjhpKiBjb25zdCBSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IEcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IGRzdCkgeworICBjb25zdCBfX20xMjhpIHJiID0gX21tX3BhY2t1c19lcGkxNigqUiwgKkIpOworICBjb25zdCBfX20xMjhpIGdhID0gX21tX3BhY2t1c19lcGkxNigqRywgKkEpOworICBjb25zdCBfX20xMjhpIHJnID0gX21tX3VucGFja2xvX2VwaTgocmIsIGdhKTsKKyAgY29uc3QgX19tMTI4aSBiYSA9IF9tbV91bnBhY2toaV9lcGk4KHJiLCBnYSk7CisgIGNvbnN0IF9fbTEyOGkgUkdCQV9sbyA9IF9tbV91bnBhY2tsb19lcGkxNihyZywgYmEpOworICBjb25zdCBfX20xMjhpIFJHQkFfaGkgPSBfbW1fdW5wYWNraGlfZXBpMTYocmcsIGJhKTsKKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopKGRzdCArICAwKSwgUkdCQV9sbyk7CisgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKShkc3QgKyAxNiksIFJHQkFfaGkpOworfQorCisvLyBQYWNrIFIvRy9CL0EgcmVzdWx0cyBpbnRvIDE2YiBvdXRwdXQuCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBQYWNrQW5kU3RvcmU0NDQ0X1NTRTIoY29uc3QgX19tMTI4aSogY29uc3QgUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBkc3QpIHsKKyNpZiAoV0VCUF9TV0FQXzE2QklUX0NTUCA9PSAwKQorICBjb25zdCBfX20xMjhpIHJnMCA9IF9tbV9wYWNrdXNfZXBpMTYoKlIsICpHKTsKKyAgY29uc3QgX19tMTI4aSBiYTAgPSBfbW1fcGFja3VzX2VwaTE2KCpCLCAqQSk7CisjZWxzZQorICBjb25zdCBfX20xMjhpIHJnMCA9IF9tbV9wYWNrdXNfZXBpMTYoKkIsICpBKTsKKyAgY29uc3QgX19tMTI4aSBiYTAgPSBfbW1fcGFja3VzX2VwaTE2KCpSLCAqRyk7CisjZW5kaWYKKyAgY29uc3QgX19tMTI4aSBtYXNrXzB4ZjAgPSBfbW1fc2V0MV9lcGk4KDB4ZjApOworICBjb25zdCBfX20xMjhpIHJiMSA9IF9tbV91bnBhY2tsb19lcGk4KHJnMCwgYmEwKTsgIC8vIHJicmJyYnJicmIuLi4KKyAgY29uc3QgX19tMTI4aSBnYTEgPSBfbW1fdW5wYWNraGlfZXBpOChyZzAsIGJhMCk7ICAvLyBnYWdhZ2FnYWdhLi4uCisgIGNvbnN0IF9fbTEyOGkgcmIyID0gX21tX2FuZF9zaTEyOChyYjEsIG1hc2tfMHhmMCk7CisgIGNvbnN0IF9fbTEyOGkgZ2EyID0gX21tX3NybGlfZXBpMTYoX21tX2FuZF9zaTEyOChnYTEsIG1hc2tfMHhmMCksIDQpOworICBjb25zdCBfX20xMjhpIHJnYmE0NDQ0ID0gX21tX29yX3NpMTI4KHJiMiwgZ2EyKTsKKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopZHN0LCByZ2JhNDQ0NCk7Cit9CisKKy8vIFBhY2sgUi9HL0IgcmVzdWx0cyBpbnRvIDE2YiBvdXRwdXQuCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBQYWNrQW5kU3RvcmU1NjVfU1NFMihjb25zdCBfX20xMjhpKiBjb25zdCBSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBkc3QpIHsKKyAgY29uc3QgX19tMTI4aSByMCA9IF9tbV9wYWNrdXNfZXBpMTYoKlIsICpSKTsKKyAgY29uc3QgX19tMTI4aSBnMCA9IF9tbV9wYWNrdXNfZXBpMTYoKkcsICpHKTsKKyAgY29uc3QgX19tMTI4aSBiMCA9IF9tbV9wYWNrdXNfZXBpMTYoKkIsICpCKTsKKyAgY29uc3QgX19tMTI4aSByMSA9IF9tbV9hbmRfc2kxMjgocjAsIF9tbV9zZXQxX2VwaTgoMHhmOCkpOworICBjb25zdCBfX20xMjhpIGIxID0gX21tX2FuZF9zaTEyOChfbW1fc3JsaV9lcGkxNihiMCwgMyksIF9tbV9zZXQxX2VwaTgoMHgxZikpOworICBjb25zdCBfX20xMjhpIGcxID0gX21tX3NybGlfZXBpMTYoX21tX2FuZF9zaTEyOChnMCwgX21tX3NldDFfZXBpOCgweGUwKSksIDUpOworICBjb25zdCBfX20xMjhpIGcyID0gX21tX3NsbGlfZXBpMTYoX21tX2FuZF9zaTEyOChnMCwgX21tX3NldDFfZXBpOCgweDFjKSksIDMpOworICBjb25zdCBfX20xMjhpIHJnID0gX21tX29yX3NpMTI4KHIxLCBnMSk7CisgIGNvbnN0IF9fbTEyOGkgZ2IgPSBfbW1fb3Jfc2kxMjgoZzIsIGIxKTsKKyNpZiAoV0VCUF9TV0FQXzE2QklUX0NTUCA9PSAwKQorICBjb25zdCBfX20xMjhpIHJnYjU2NSA9IF9tbV91bnBhY2tsb19lcGk4KHJnLCBnYik7CisjZWxzZQorICBjb25zdCBfX20xMjhpIHJnYjU2NSA9IF9tbV91bnBhY2tsb19lcGk4KGdiLCByZyk7CisjZW5kaWYKKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopZHN0LCByZ2I1NjUpOworfQorCisvLyBQYWNrIHRoZSBwbGFuYXIgYnVmZmVycworLy8gcnJyci4uLiBycnJyLi4uIGdnZ2cuLi4gZ2dnZy4uLiBiYmJiLi4uIGJiYmIuLi4uCisvLyB0cmlwbGV0IGJ5IHRyaXBsZXQgaW4gdGhlIG91dHB1dCBidWZmZXIgcmdiIGFzIHJnYnJnYnJnYnJnYiAuLi4KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFBsYW5hclRvMjRiX1NTRTIoX19tMTI4aSogY29uc3QgaW4wLCBfX20xMjhpKiBjb25zdCBpbjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IGluMiwgX19tMTI4aSogY29uc3QgaW4zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBpbjQsIF9fbTEyOGkqIGNvbnN0IGluNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgcmdiKSB7CisgIC8vIFRoZSBpbnB1dCBpcyA2IHJlZ2lzdGVycyBvZiBzaXh0ZWVuIDhiIGJ1dCBmb3IgdGhlIHNha2Ugb2YgZXhwbGFuYXRpb24sCisgIC8vIGxldCdzIHRha2UgNiByZWdpc3RlcnMgb2YgZm91ciA4YiB2YWx1ZXMuCisgIC8vIFRvIHBhY2ssIHdlIHdpbGwga2VlcCB0YWtpbmcgb25lIGV2ZXJ5IHR3byA4YiBpbnRlZ2VyIGFuZCBtb3ZlIGl0CisgIC8vIGFyb3VuZCBhcyBmb2xsb3dzOgorICAvLyBJbnB1dDoKKyAgLy8gICByMHIxcjJyMyB8IHI0cjVyNnI3IHwgZzBnMWcyZzMgfCBnNGc1ZzZnNyB8IGIwYjFiMmIzIHwgYjRiNWI2YjcKKyAgLy8gU3BsaXQgdGhlIDYgcmVnaXN0ZXJzIGluIHR3byBzZXRzIG9mIDMgcmVnaXN0ZXJzOiB0aGUgZmlyc3Qgc2V0IGFzIHRoZSBldmVuCisgIC8vIDhiIGJ5dGVzLCB0aGUgc2Vjb25kIHRoZSBvZGQgb25lczoKKyAgLy8gICByMHIycjRyNiB8IGcwZzJnNGc2IHwgYjBiMmI0YjYgfCByMXIzcjVyNyB8IGcxZzNnNWc3IHwgYjFiM2I1YjcKKyAgLy8gUmVwZWF0IHRoZSBzYW1lIHBlcm11dGF0aW9ucyB0d2ljZSBtb3JlOgorICAvLyAgIHIwcjRnMGc0IHwgYjBiNHIxcjUgfCBnMWc1YjFiNSB8IHIycjZnMmc2IHwgYjJiNnIzcjcgfCBnM2c3YjNiNworICAvLyAgIHIwZzBiMHIxIHwgZzFiMXIyZzIgfCBiMnIzZzNiMyB8IHI0ZzRiNHI1IHwgZzViNXI2ZzYgfCBiNnI3ZzdiNworICBWUDhQbGFuYXJUbzI0Yl9TU0UyKGluMCwgaW4xLCBpbjIsIGluMywgaW40LCBpbjUpOworCisgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKShyZ2IgKyAgMCksICppbjApOworICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikocmdiICsgMTYpLCAqaW4xKTsKKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopKHJnYiArIDMyKSwgKmluMik7CisgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKShyZ2IgKyA0OCksICppbjMpOworICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikocmdiICsgNjQpLCAqaW40KTsKKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopKHJnYiArIDgwKSwgKmluNSk7Cit9CisKK3ZvaWQgVlA4WXV2VG9SZ2JhMzJfU1NFMihjb25zdCB1aW50OF90KiB5LCBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCkgeworICBjb25zdCBfX20xMjhpIGtBbHBoYSA9IF9tbV9zZXQxX2VwaTE2KDI1NSk7CisgIGludCBuOworICBmb3IgKG4gPSAwOyBuIDwgMzI7IG4gKz0gOCwgZHN0ICs9IDMyKSB7CisgICAgX19tMTI4aSBSLCBHLCBCOworICAgIFlVVjQ0NFRvUkdCX1NTRTIoeSArIG4sIHUgKyBuLCB2ICsgbiwgJlIsICZHLCAmQik7CisgICAgUGFja0FuZFN0b3JlNF9TU0UyKCZSLCAmRywgJkIsICZrQWxwaGEsIGRzdCk7CisgIH0KK30KKwordm9pZCBWUDhZdXZUb0JncmEzMl9TU0UyKGNvbnN0IHVpbnQ4X3QqIHksIGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0KSB7CisgIGNvbnN0IF9fbTEyOGkga0FscGhhID0gX21tX3NldDFfZXBpMTYoMjU1KTsKKyAgaW50IG47CisgIGZvciAobiA9IDA7IG4gPCAzMjsgbiArPSA4LCBkc3QgKz0gMzIpIHsKKyAgICBfX20xMjhpIFIsIEcsIEI7CisgICAgWVVWNDQ0VG9SR0JfU1NFMih5ICsgbiwgdSArIG4sIHYgKyBuLCAmUiwgJkcsICZCKTsKKyAgICBQYWNrQW5kU3RvcmU0X1NTRTIoJkIsICZHLCAmUiwgJmtBbHBoYSwgZHN0KTsKKyAgfQorfQorCit2b2lkIFZQOFl1dlRvQXJnYjMyX1NTRTIoY29uc3QgdWludDhfdCogeSwgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QpIHsKKyAgY29uc3QgX19tMTI4aSBrQWxwaGEgPSBfbW1fc2V0MV9lcGkxNigyNTUpOworICBpbnQgbjsKKyAgZm9yIChuID0gMDsgbiA8IDMyOyBuICs9IDgsIGRzdCArPSAzMikgeworICAgIF9fbTEyOGkgUiwgRywgQjsKKyAgICBZVVY0NDRUb1JHQl9TU0UyKHkgKyBuLCB1ICsgbiwgdiArIG4sICZSLCAmRywgJkIpOworICAgIFBhY2tBbmRTdG9yZTRfU1NFMigma0FscGhhLCAmUiwgJkcsICZCLCBkc3QpOworICB9Cit9CisKK3ZvaWQgVlA4WXV2VG9SZ2JhNDQ0NDMyX1NTRTIoY29uc3QgdWludDhfdCogeSwgY29uc3QgdWludDhfdCogdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdiwgdWludDhfdCogZHN0KSB7CisgIGNvbnN0IF9fbTEyOGkga0FscGhhID0gX21tX3NldDFfZXBpMTYoMjU1KTsKKyAgaW50IG47CisgIGZvciAobiA9IDA7IG4gPCAzMjsgbiArPSA4LCBkc3QgKz0gMTYpIHsKKyAgICBfX20xMjhpIFIsIEcsIEI7CisgICAgWVVWNDQ0VG9SR0JfU1NFMih5ICsgbiwgdSArIG4sIHYgKyBuLCAmUiwgJkcsICZCKTsKKyAgICBQYWNrQW5kU3RvcmU0NDQ0X1NTRTIoJlIsICZHLCAmQiwgJmtBbHBoYSwgZHN0KTsKKyAgfQorfQorCit2b2lkIFZQOFl1dlRvUmdiNTY1MzJfU1NFMihjb25zdCB1aW50OF90KiB5LCBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0KSB7CisgIGludCBuOworICBmb3IgKG4gPSAwOyBuIDwgMzI7IG4gKz0gOCwgZHN0ICs9IDE2KSB7CisgICAgX19tMTI4aSBSLCBHLCBCOworICAgIFlVVjQ0NFRvUkdCX1NTRTIoeSArIG4sIHUgKyBuLCB2ICsgbiwgJlIsICZHLCAmQik7CisgICAgUGFja0FuZFN0b3JlNTY1X1NTRTIoJlIsICZHLCAmQiwgZHN0KTsKKyAgfQorfQorCit2b2lkIFZQOFl1dlRvUmdiMzJfU1NFMihjb25zdCB1aW50OF90KiB5LCBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0KSB7CisgIF9fbTEyOGkgUjAsIFIxLCBSMiwgUjMsIEcwLCBHMSwgRzIsIEczLCBCMCwgQjEsIEIyLCBCMzsKKyAgX19tMTI4aSByZ2IwLCByZ2IxLCByZ2IyLCByZ2IzLCByZ2I0LCByZ2I1OworCisgIFlVVjQ0NFRvUkdCX1NTRTIoeSArIDAsIHUgKyAwLCB2ICsgMCwgJlIwLCAmRzAsICZCMCk7CisgIFlVVjQ0NFRvUkdCX1NTRTIoeSArIDgsIHUgKyA4LCB2ICsgOCwgJlIxLCAmRzEsICZCMSk7CisgIFlVVjQ0NFRvUkdCX1NTRTIoeSArIDE2LCB1ICsgMTYsIHYgKyAxNiwgJlIyLCAmRzIsICZCMik7CisgIFlVVjQ0NFRvUkdCX1NTRTIoeSArIDI0LCB1ICsgMjQsIHYgKyAyNCwgJlIzLCAmRzMsICZCMyk7CisKKyAgLy8gQ2FzdCB0byA4YiBhbmQgc3RvcmUgYXMgUlJSUkdHR0dCQkJCLgorICByZ2IwID0gX21tX3BhY2t1c19lcGkxNihSMCwgUjEpOworICByZ2IxID0gX21tX3BhY2t1c19lcGkxNihSMiwgUjMpOworICByZ2IyID0gX21tX3BhY2t1c19lcGkxNihHMCwgRzEpOworICByZ2IzID0gX21tX3BhY2t1c19lcGkxNihHMiwgRzMpOworICByZ2I0ID0gX21tX3BhY2t1c19lcGkxNihCMCwgQjEpOworICByZ2I1ID0gX21tX3BhY2t1c19lcGkxNihCMiwgQjMpOworCisgIC8vIFBhY2sgYXMgUkdCUkdCUkdCUkdCLgorICBQbGFuYXJUbzI0Yl9TU0UyKCZyZ2IwLCAmcmdiMSwgJnJnYjIsICZyZ2IzLCAmcmdiNCwgJnJnYjUsIGRzdCk7Cit9CisKK3ZvaWQgVlA4WXV2VG9CZ3IzMl9TU0UyKGNvbnN0IHVpbnQ4X3QqIHksIGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QpIHsKKyAgX19tMTI4aSBSMCwgUjEsIFIyLCBSMywgRzAsIEcxLCBHMiwgRzMsIEIwLCBCMSwgQjIsIEIzOworICBfX20xMjhpIGJncjAsIGJncjEsIGJncjIsIGJncjMsIGJncjQsIGJncjU7CisKKyAgWVVWNDQ0VG9SR0JfU1NFMih5ICsgIDAsIHUgKyAgMCwgdiArICAwLCAmUjAsICZHMCwgJkIwKTsKKyAgWVVWNDQ0VG9SR0JfU1NFMih5ICsgIDgsIHUgKyAgOCwgdiArICA4LCAmUjEsICZHMSwgJkIxKTsKKyAgWVVWNDQ0VG9SR0JfU1NFMih5ICsgMTYsIHUgKyAxNiwgdiArIDE2LCAmUjIsICZHMiwgJkIyKTsKKyAgWVVWNDQ0VG9SR0JfU1NFMih5ICsgMjQsIHUgKyAyNCwgdiArIDI0LCAmUjMsICZHMywgJkIzKTsKKworICAvLyBDYXN0IHRvIDhiIGFuZCBzdG9yZSBhcyBCQkJCR0dHR1JSUlIuCisgIGJncjAgPSBfbW1fcGFja3VzX2VwaTE2KEIwLCBCMSk7CisgIGJncjEgPSBfbW1fcGFja3VzX2VwaTE2KEIyLCBCMyk7CisgIGJncjIgPSBfbW1fcGFja3VzX2VwaTE2KEcwLCBHMSk7CisgIGJncjMgPSBfbW1fcGFja3VzX2VwaTE2KEcyLCBHMyk7CisgIGJncjQgPSBfbW1fcGFja3VzX2VwaTE2KFIwLCBSMSk7CisgIGJncjU9IF9tbV9wYWNrdXNfZXBpMTYoUjIsIFIzKTsKKworICAvLyBQYWNrIGFzIEJHUkJHUkJHUkJHUi4KKyAgUGxhbmFyVG8yNGJfU1NFMigmYmdyMCwgJmJncjEsICZiZ3IyLCAmYmdyMywgJmJncjQsICZiZ3I1LCBkc3QpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBcmJpdHJhcnktbGVuZ3RoIHJvdyBjb252ZXJzaW9uIGZ1bmN0aW9ucworCitzdGF0aWMgdm9pZCBZdXZUb1JnYmFSb3dfU1NFMihjb25zdCB1aW50OF90KiB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGxlbikgeworICBjb25zdCBfX20xMjhpIGtBbHBoYSA9IF9tbV9zZXQxX2VwaTE2KDI1NSk7CisgIGludCBuOworICBmb3IgKG4gPSAwOyBuICsgOCA8PSBsZW47IG4gKz0gOCwgZHN0ICs9IDMyKSB7CisgICAgX19tMTI4aSBSLCBHLCBCOworICAgIFlVVjQyMFRvUkdCX1NTRTIoeSwgdSwgdiwgJlIsICZHLCAmQik7CisgICAgUGFja0FuZFN0b3JlNF9TU0UyKCZSLCAmRywgJkIsICZrQWxwaGEsIGRzdCk7CisgICAgeSArPSA4OworICAgIHUgKz0gNDsKKyAgICB2ICs9IDQ7CisgIH0KKyAgZm9yICg7IG4gPCBsZW47ICsrbikgeyAgIC8vIEZpbmlzaCBvZmYKKyAgICBWUDhZdXZUb1JnYmEoeVswXSwgdVswXSwgdlswXSwgZHN0KTsKKyAgICBkc3QgKz0gNDsKKyAgICB5ICs9IDE7CisgICAgdSArPSAobiAmIDEpOworICAgIHYgKz0gKG4gJiAxKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBZdXZUb0JncmFSb3dfU1NFMihjb25zdCB1aW50OF90KiB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGxlbikgeworICBjb25zdCBfX20xMjhpIGtBbHBoYSA9IF9tbV9zZXQxX2VwaTE2KDI1NSk7CisgIGludCBuOworICBmb3IgKG4gPSAwOyBuICsgOCA8PSBsZW47IG4gKz0gOCwgZHN0ICs9IDMyKSB7CisgICAgX19tMTI4aSBSLCBHLCBCOworICAgIFlVVjQyMFRvUkdCX1NTRTIoeSwgdSwgdiwgJlIsICZHLCAmQik7CisgICAgUGFja0FuZFN0b3JlNF9TU0UyKCZCLCAmRywgJlIsICZrQWxwaGEsIGRzdCk7CisgICAgeSArPSA4OworICAgIHUgKz0gNDsKKyAgICB2ICs9IDQ7CisgIH0KKyAgZm9yICg7IG4gPCBsZW47ICsrbikgeyAgIC8vIEZpbmlzaCBvZmYKKyAgICBWUDhZdXZUb0JncmEoeVswXSwgdVswXSwgdlswXSwgZHN0KTsKKyAgICBkc3QgKz0gNDsKKyAgICB5ICs9IDE7CisgICAgdSArPSAobiAmIDEpOworICAgIHYgKz0gKG4gJiAxKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBZdXZUb0FyZ2JSb3dfU1NFMihjb25zdCB1aW50OF90KiB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGxlbikgeworICBjb25zdCBfX20xMjhpIGtBbHBoYSA9IF9tbV9zZXQxX2VwaTE2KDI1NSk7CisgIGludCBuOworICBmb3IgKG4gPSAwOyBuICsgOCA8PSBsZW47IG4gKz0gOCwgZHN0ICs9IDMyKSB7CisgICAgX19tMTI4aSBSLCBHLCBCOworICAgIFlVVjQyMFRvUkdCX1NTRTIoeSwgdSwgdiwgJlIsICZHLCAmQik7CisgICAgUGFja0FuZFN0b3JlNF9TU0UyKCZrQWxwaGEsICZSLCAmRywgJkIsIGRzdCk7CisgICAgeSArPSA4OworICAgIHUgKz0gNDsKKyAgICB2ICs9IDQ7CisgIH0KKyAgZm9yICg7IG4gPCBsZW47ICsrbikgeyAgIC8vIEZpbmlzaCBvZmYKKyAgICBWUDhZdXZUb0FyZ2IoeVswXSwgdVswXSwgdlswXSwgZHN0KTsKKyAgICBkc3QgKz0gNDsKKyAgICB5ICs9IDE7CisgICAgdSArPSAobiAmIDEpOworICAgIHYgKz0gKG4gJiAxKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBZdXZUb1JnYlJvd19TU0UyKGNvbnN0IHVpbnQ4X3QqIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGxlbikgeworICBpbnQgbjsKKyAgZm9yIChuID0gMDsgbiArIDMyIDw9IGxlbjsgbiArPSAzMiwgZHN0ICs9IDMyICogMykgeworICAgIF9fbTEyOGkgUjAsIFIxLCBSMiwgUjMsIEcwLCBHMSwgRzIsIEczLCBCMCwgQjEsIEIyLCBCMzsKKyAgICBfX20xMjhpIHJnYjAsIHJnYjEsIHJnYjIsIHJnYjMsIHJnYjQsIHJnYjU7CisKKyAgICBZVVY0MjBUb1JHQl9TU0UyKHkgKyAgMCwgdSArICAwLCB2ICsgIDAsICZSMCwgJkcwLCAmQjApOworICAgIFlVVjQyMFRvUkdCX1NTRTIoeSArICA4LCB1ICsgIDQsIHYgKyAgNCwgJlIxLCAmRzEsICZCMSk7CisgICAgWVVWNDIwVG9SR0JfU1NFMih5ICsgMTYsIHUgKyAgOCwgdiArICA4LCAmUjIsICZHMiwgJkIyKTsKKyAgICBZVVY0MjBUb1JHQl9TU0UyKHkgKyAyNCwgdSArIDEyLCB2ICsgMTIsICZSMywgJkczLCAmQjMpOworCisgICAgLy8gQ2FzdCB0byA4YiBhbmQgc3RvcmUgYXMgUlJSUkdHR0dCQkJCLgorICAgIHJnYjAgPSBfbW1fcGFja3VzX2VwaTE2KFIwLCBSMSk7CisgICAgcmdiMSA9IF9tbV9wYWNrdXNfZXBpMTYoUjIsIFIzKTsKKyAgICByZ2IyID0gX21tX3BhY2t1c19lcGkxNihHMCwgRzEpOworICAgIHJnYjMgPSBfbW1fcGFja3VzX2VwaTE2KEcyLCBHMyk7CisgICAgcmdiNCA9IF9tbV9wYWNrdXNfZXBpMTYoQjAsIEIxKTsKKyAgICByZ2I1ID0gX21tX3BhY2t1c19lcGkxNihCMiwgQjMpOworCisgICAgLy8gUGFjayBhcyBSR0JSR0JSR0JSR0IuCisgICAgUGxhbmFyVG8yNGJfU1NFMigmcmdiMCwgJnJnYjEsICZyZ2IyLCAmcmdiMywgJnJnYjQsICZyZ2I1LCBkc3QpOworCisgICAgeSArPSAzMjsKKyAgICB1ICs9IDE2OworICAgIHYgKz0gMTY7CisgIH0KKyAgZm9yICg7IG4gPCBsZW47ICsrbikgeyAgIC8vIEZpbmlzaCBvZmYKKyAgICBWUDhZdXZUb1JnYih5WzBdLCB1WzBdLCB2WzBdLCBkc3QpOworICAgIGRzdCArPSAzOworICAgIHkgKz0gMTsKKyAgICB1ICs9IChuICYgMSk7CisgICAgdiArPSAobiAmIDEpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFl1dlRvQmdyUm93X1NTRTIoY29uc3QgdWludDhfdCogeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgbGVuKSB7CisgIGludCBuOworICBmb3IgKG4gPSAwOyBuICsgMzIgPD0gbGVuOyBuICs9IDMyLCBkc3QgKz0gMzIgKiAzKSB7CisgICAgX19tMTI4aSBSMCwgUjEsIFIyLCBSMywgRzAsIEcxLCBHMiwgRzMsIEIwLCBCMSwgQjIsIEIzOworICAgIF9fbTEyOGkgYmdyMCwgYmdyMSwgYmdyMiwgYmdyMywgYmdyNCwgYmdyNTsKKworICAgIFlVVjQyMFRvUkdCX1NTRTIoeSArICAwLCB1ICsgIDAsIHYgKyAgMCwgJlIwLCAmRzAsICZCMCk7CisgICAgWVVWNDIwVG9SR0JfU1NFMih5ICsgIDgsIHUgKyAgNCwgdiArICA0LCAmUjEsICZHMSwgJkIxKTsKKyAgICBZVVY0MjBUb1JHQl9TU0UyKHkgKyAxNiwgdSArICA4LCB2ICsgIDgsICZSMiwgJkcyLCAmQjIpOworICAgIFlVVjQyMFRvUkdCX1NTRTIoeSArIDI0LCB1ICsgMTIsIHYgKyAxMiwgJlIzLCAmRzMsICZCMyk7CisKKyAgICAvLyBDYXN0IHRvIDhiIGFuZCBzdG9yZSBhcyBCQkJCR0dHR1JSUlIuCisgICAgYmdyMCA9IF9tbV9wYWNrdXNfZXBpMTYoQjAsIEIxKTsKKyAgICBiZ3IxID0gX21tX3BhY2t1c19lcGkxNihCMiwgQjMpOworICAgIGJncjIgPSBfbW1fcGFja3VzX2VwaTE2KEcwLCBHMSk7CisgICAgYmdyMyA9IF9tbV9wYWNrdXNfZXBpMTYoRzIsIEczKTsKKyAgICBiZ3I0ID0gX21tX3BhY2t1c19lcGkxNihSMCwgUjEpOworICAgIGJncjUgPSBfbW1fcGFja3VzX2VwaTE2KFIyLCBSMyk7CisKKyAgICAvLyBQYWNrIGFzIEJHUkJHUkJHUkJHUi4KKyAgICBQbGFuYXJUbzI0Yl9TU0UyKCZiZ3IwLCAmYmdyMSwgJmJncjIsICZiZ3IzLCAmYmdyNCwgJmJncjUsIGRzdCk7CisKKyAgICB5ICs9IDMyOworICAgIHUgKz0gMTY7CisgICAgdiArPSAxNjsKKyAgfQorICBmb3IgKDsgbiA8IGxlbjsgKytuKSB7ICAgLy8gRmluaXNoIG9mZgorICAgIFZQOFl1dlRvQmdyKHlbMF0sIHVbMF0sIHZbMF0sIGRzdCk7CisgICAgZHN0ICs9IDM7CisgICAgeSArPSAxOworICAgIHUgKz0gKG4gJiAxKTsKKyAgICB2ICs9IChuICYgMSk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFdlYlBJbml0U2FtcGxlcnNTU0UyKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgV2ViUEluaXRTYW1wbGVyc1NTRTIodm9pZCkgeworICBXZWJQU2FtcGxlcnNbTU9ERV9SR0JdICA9IFl1dlRvUmdiUm93X1NTRTI7CisgIFdlYlBTYW1wbGVyc1tNT0RFX1JHQkFdID0gWXV2VG9SZ2JhUm93X1NTRTI7CisgIFdlYlBTYW1wbGVyc1tNT0RFX0JHUl0gID0gWXV2VG9CZ3JSb3dfU1NFMjsKKyAgV2ViUFNhbXBsZXJzW01PREVfQkdSQV0gPSBZdXZUb0JncmFSb3dfU1NFMjsKKyAgV2ViUFNhbXBsZXJzW01PREVfQVJHQl0gPSBZdXZUb0FyZ2JSb3dfU1NFMjsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJHQjI0LzMyIC0+IFlVViBjb252ZXJ0ZXJzCisKKy8vIExvYWQgZWlnaHQgMTZiLXdvcmRzIGZyb20gKnNyYy4KKyNkZWZpbmUgTE9BRF8xNihzcmMpIF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKHNyYykpCisvLyBTdG9yZSBlaXRoZXIgMTZiLXdvcmRzIGludG8gKmRzdAorI2RlZmluZSBTVE9SRV8xNihWLCBkc3QpIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKShkc3QpLCAoVikpCisKKy8vIEZ1bmN0aW9uIHRoYXQgaW5zZXJ0cyBhIHZhbHVlIG9mIHRoZSBzZWNvbmQgaGFsZiBvZiB0aGUgaW4gYnVmZmVyIGluIGJldHdlZW4KKy8vIGV2ZXJ5IHR3byBjaGFyIG9mIHRoZSBmaXJzdCBoYWxmLgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUkdCMjRQYWNrZWRUb1BsYW5hckhlbHBlcl9TU0UyKAorICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IGluIC8qaW5bNl0qLywgX19tMTI4aSogY29uc3Qgb3V0IC8qb3V0WzZdKi8pIHsKKyAgb3V0WzBdID0gX21tX3VucGFja2xvX2VwaTgoaW5bMF0sIGluWzNdKTsKKyAgb3V0WzFdID0gX21tX3VucGFja2hpX2VwaTgoaW5bMF0sIGluWzNdKTsKKyAgb3V0WzJdID0gX21tX3VucGFja2xvX2VwaTgoaW5bMV0sIGluWzRdKTsKKyAgb3V0WzNdID0gX21tX3VucGFja2hpX2VwaTgoaW5bMV0sIGluWzRdKTsKKyAgb3V0WzRdID0gX21tX3VucGFja2xvX2VwaTgoaW5bMl0sIGluWzVdKTsKKyAgb3V0WzVdID0gX21tX3VucGFja2hpX2VwaTgoaW5bMl0sIGluWzVdKTsKK30KKworLy8gVW5wYWNrIHRoZSA4YiBpbnB1dCByZ2JyZ2JyZ2JyZ2IgLi4uIGFzIGNvbnRpZ3VvdXMgcmVnaXN0ZXJzOgorLy8gcnJyci4uLiBycnJyLi4uIGdnZ2cuLi4gZ2dnZy4uLiBiYmJiLi4uIGJiYmIuLi4uCisvLyBTaW1pbGFyIHRvIFBsYW5hclRvMjRiSGVscGVyKCksIGJ1dCBpbiByZXZlcnNlIG9yZGVyLgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUkdCMjRQYWNrZWRUb1BsYW5hcl9TU0UyKAorICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHJnYiwgX19tMTI4aSogY29uc3Qgb3V0IC8qb3V0WzZdKi8pIHsKKyAgX19tMTI4aSB0bXBbNl07CisgIHRtcFswXSA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKHJnYiArICAwKSk7CisgIHRtcFsxXSA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKHJnYiArIDE2KSk7CisgIHRtcFsyXSA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKHJnYiArIDMyKSk7CisgIHRtcFszXSA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKHJnYiArIDQ4KSk7CisgIHRtcFs0XSA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKHJnYiArIDY0KSk7CisgIHRtcFs1XSA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKHJnYiArIDgwKSk7CisKKyAgUkdCMjRQYWNrZWRUb1BsYW5hckhlbHBlcl9TU0UyKHRtcCwgb3V0KTsKKyAgUkdCMjRQYWNrZWRUb1BsYW5hckhlbHBlcl9TU0UyKG91dCwgdG1wKTsKKyAgUkdCMjRQYWNrZWRUb1BsYW5hckhlbHBlcl9TU0UyKHRtcCwgb3V0KTsKKyAgUkdCMjRQYWNrZWRUb1BsYW5hckhlbHBlcl9TU0UyKG91dCwgdG1wKTsKKyAgUkdCMjRQYWNrZWRUb1BsYW5hckhlbHBlcl9TU0UyKHRtcCwgb3V0KTsKK30KKworLy8gQ29udmVydCA4IHBhY2tlZCBBUkdCIHRvIHJbXSwgZ1tdLCBiW10KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFJHQjMyUGFja2VkVG9QbGFuYXJfU1NFMihjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCByZ2IgLyppbls2XSovKSB7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIF9fbTEyOGkgYTAgPSBMT0FEXzE2KGFyZ2IgKyAwKTsKKyAgX19tMTI4aSBhMSA9IExPQURfMTYoYXJnYiArIDQpOworICBfX20xMjhpIGEyID0gTE9BRF8xNihhcmdiICsgOCk7CisgIF9fbTEyOGkgYTMgPSBMT0FEXzE2KGFyZ2IgKyAxMik7CisgIFZQOEwzMmJUb1BsYW5hcl9TU0UyKCZhMCwgJmExLCAmYTIsICZhMyk7CisgIHJnYlswXSA9IF9tbV91bnBhY2tsb19lcGk4KGExLCB6ZXJvKTsKKyAgcmdiWzFdID0gX21tX3VucGFja2hpX2VwaTgoYTEsIHplcm8pOworICByZ2JbMl0gPSBfbW1fdW5wYWNrbG9fZXBpOChhMiwgemVybyk7CisgIHJnYlszXSA9IF9tbV91bnBhY2toaV9lcGk4KGEyLCB6ZXJvKTsKKyAgcmdiWzRdID0gX21tX3VucGFja2xvX2VwaTgoYTMsIHplcm8pOworICByZ2JbNV0gPSBfbW1fdW5wYWNraGlfZXBpOChhMywgemVybyk7Cit9CisKKy8vIFRoaXMgbWFjcm8gY29tcHV0ZXMgKFJHICogTVVMVF9SRyArIEdCICogTVVMVF9HQiArIFJPVU5ERVIpID4+IERFU0NBTEVfRklYCisvLyBJdCdzIGEgbWFjcm8gYW5kIG5vdCBhIGZ1bmN0aW9uIGJlY2F1c2Ugd2UgbmVlZCB0byB1c2UgaW1tZWRpYXRlIHZhbHVlcyB3aXRoCisvLyBzcmFpX2VwaTMyLCBlLmcuCisjZGVmaW5lIFRSQU5TRk9STShSR19MTywgUkdfSEksIEdCX0xPLCBHQl9ISSwgTVVMVF9SRywgTVVMVF9HQiwgXAorICAgICAgICAgICAgICAgICAgUk9VTkRFUiwgREVTQ0FMRV9GSVgsIE9VVCkgZG8geyAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBWMF9sbyA9IF9tbV9tYWRkX2VwaTE2KFJHX0xPLCBNVUxUX1JHKTsgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgVjBfaGkgPSBfbW1fbWFkZF9lcGkxNihSR19ISSwgTVVMVF9SRyk7ICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIFYxX2xvID0gX21tX21hZGRfZXBpMTYoR0JfTE8sIE1VTFRfR0IpOyAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBWMV9oaSA9IF9tbV9tYWRkX2VwaTE2KEdCX0hJLCBNVUxUX0dCKTsgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgVjJfbG8gPSBfbW1fYWRkX2VwaTMyKFYwX2xvLCBWMV9sbyk7ICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIFYyX2hpID0gX21tX2FkZF9lcGkzMihWMF9oaSwgVjFfaGkpOyAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBWM19sbyA9IF9tbV9hZGRfZXBpMzIoVjJfbG8sIFJPVU5ERVIpOyAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgVjNfaGkgPSBfbW1fYWRkX2VwaTMyKFYyX2hpLCBST1VOREVSKTsgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIFY1X2xvID0gX21tX3NyYWlfZXBpMzIoVjNfbG8sIERFU0NBTEVfRklYKTsgICAgIFwKKyAgY29uc3QgX19tMTI4aSBWNV9oaSA9IF9tbV9zcmFpX2VwaTMyKFYzX2hpLCBERVNDQUxFX0ZJWCk7ICAgICBcCisgIChPVVQpID0gX21tX3BhY2tzX2VwaTMyKFY1X2xvLCBWNV9oaSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBNS19DU1RfMTYoQSwgQikgX21tX3NldF9lcGkxNigoQiksIChBKSwgKEIpLCAoQSksIChCKSwgKEEpLCAoQiksIChBKSkKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIENvbnZlcnRSR0JUb1lfU1NFMihjb25zdCBfX20xMjhpKiBjb25zdCBSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IEcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBZKSB7CisgIGNvbnN0IF9fbTEyOGkga1JHX3kgPSBNS19DU1RfMTYoMTY4MzksIDMzMDU5IC0gMTYzODQpOworICBjb25zdCBfX20xMjhpIGtHQl95ID0gTUtfQ1NUXzE2KDE2Mzg0LCA2NDIwKTsKKyAgY29uc3QgX19tMTI4aSBrSEFMRl9ZID0gX21tX3NldDFfZXBpMzIoKDE2IDw8IFlVVl9GSVgpICsgWVVWX0hBTEYpOworCisgIGNvbnN0IF9fbTEyOGkgUkdfbG8gPSBfbW1fdW5wYWNrbG9fZXBpMTYoKlIsICpHKTsKKyAgY29uc3QgX19tMTI4aSBSR19oaSA9IF9tbV91bnBhY2toaV9lcGkxNigqUiwgKkcpOworICBjb25zdCBfX20xMjhpIEdCX2xvID0gX21tX3VucGFja2xvX2VwaTE2KCpHLCAqQik7CisgIGNvbnN0IF9fbTEyOGkgR0JfaGkgPSBfbW1fdW5wYWNraGlfZXBpMTYoKkcsICpCKTsKKyAgVFJBTlNGT1JNKFJHX2xvLCBSR19oaSwgR0JfbG8sIEdCX2hpLCBrUkdfeSwga0dCX3ksIGtIQUxGX1ksIFlVVl9GSVgsICpZKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgQ29udmVydFJHQlRvVVZfU1NFMihjb25zdCBfX20xMjhpKiBjb25zdCBSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBVLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBWKSB7CisgIGNvbnN0IF9fbTEyOGkga1JHX3UgPSBNS19DU1RfMTYoLTk3MTksIC0xOTA4MSk7CisgIGNvbnN0IF9fbTEyOGkga0dCX3UgPSBNS19DU1RfMTYoMCwgMjg4MDApOworICBjb25zdCBfX20xMjhpIGtSR192ID0gTUtfQ1NUXzE2KDI4ODAwLCAwKTsKKyAgY29uc3QgX19tMTI4aSBrR0JfdiA9IE1LX0NTVF8xNigtMjQxMTYsIC00Njg0KTsKKyAgY29uc3QgX19tMTI4aSBrSEFMRl9VViA9IF9tbV9zZXQxX2VwaTMyKCgoMTI4IDw8IFlVVl9GSVgpICsgWVVWX0hBTEYpIDw8IDIpOworCisgIGNvbnN0IF9fbTEyOGkgUkdfbG8gPSBfbW1fdW5wYWNrbG9fZXBpMTYoKlIsICpHKTsKKyAgY29uc3QgX19tMTI4aSBSR19oaSA9IF9tbV91bnBhY2toaV9lcGkxNigqUiwgKkcpOworICBjb25zdCBfX20xMjhpIEdCX2xvID0gX21tX3VucGFja2xvX2VwaTE2KCpHLCAqQik7CisgIGNvbnN0IF9fbTEyOGkgR0JfaGkgPSBfbW1fdW5wYWNraGlfZXBpMTYoKkcsICpCKTsKKyAgVFJBTlNGT1JNKFJHX2xvLCBSR19oaSwgR0JfbG8sIEdCX2hpLCBrUkdfdSwga0dCX3UsCisgICAgICAgICAgICBrSEFMRl9VViwgWVVWX0ZJWCArIDIsICpVKTsKKyAgVFJBTlNGT1JNKFJHX2xvLCBSR19oaSwgR0JfbG8sIEdCX2hpLCBrUkdfdiwga0dCX3YsCisgICAgICAgICAgICBrSEFMRl9VViwgWVVWX0ZJWCArIDIsICpWKTsKK30KKworI3VuZGVmIE1LX0NTVF8xNgorI3VuZGVmIFRSQU5TRk9STQorCitzdGF0aWMgdm9pZCBDb252ZXJ0UkdCMjRUb1lfU1NFMihjb25zdCB1aW50OF90KiByZ2IsIHVpbnQ4X3QqIHksIGludCB3aWR0aCkgeworICBjb25zdCBpbnQgbWF4X3dpZHRoID0gd2lkdGggJiB+MzE7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgbWF4X3dpZHRoOyByZ2IgKz0gMyAqIDE2ICogMikgeworICAgIF9fbTEyOGkgcmdiX3BsYW5lWzZdOworICAgIGludCBqOworCisgICAgUkdCMjRQYWNrZWRUb1BsYW5hcl9TU0UyKHJnYiwgcmdiX3BsYW5lKTsKKworICAgIGZvciAoaiA9IDA7IGogPCAyOyArK2osIGkgKz0gMTYpIHsKKyAgICAgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgICAgICBfX20xMjhpIHIsIGcsIGIsIFkwLCBZMTsKKworICAgICAgLy8gQ29udmVydCB0byAxNi1iaXQgWS4KKyAgICAgIHIgPSBfbW1fdW5wYWNrbG9fZXBpOChyZ2JfcGxhbmVbMCArIGpdLCB6ZXJvKTsKKyAgICAgIGcgPSBfbW1fdW5wYWNrbG9fZXBpOChyZ2JfcGxhbmVbMiArIGpdLCB6ZXJvKTsKKyAgICAgIGIgPSBfbW1fdW5wYWNrbG9fZXBpOChyZ2JfcGxhbmVbNCArIGpdLCB6ZXJvKTsKKyAgICAgIENvbnZlcnRSR0JUb1lfU1NFMigmciwgJmcsICZiLCAmWTApOworCisgICAgICAvLyBDb252ZXJ0IHRvIDE2LWJpdCBZLgorICAgICAgciA9IF9tbV91bnBhY2toaV9lcGk4KHJnYl9wbGFuZVswICsgal0sIHplcm8pOworICAgICAgZyA9IF9tbV91bnBhY2toaV9lcGk4KHJnYl9wbGFuZVsyICsgal0sIHplcm8pOworICAgICAgYiA9IF9tbV91bnBhY2toaV9lcGk4KHJnYl9wbGFuZVs0ICsgal0sIHplcm8pOworICAgICAgQ29udmVydFJHQlRvWV9TU0UyKCZyLCAmZywgJmIsICZZMSk7CisKKyAgICAgIC8vIENhc3QgdG8gOC1iaXQgYW5kIHN0b3JlLgorICAgICAgU1RPUkVfMTYoX21tX3BhY2t1c19lcGkxNihZMCwgWTEpLCB5ICsgaSk7CisgICAgfQorICB9CisgIGZvciAoOyBpIDwgd2lkdGg7ICsraSwgcmdiICs9IDMpIHsgICAvLyBsZWZ0LW92ZXIKKyAgICB5W2ldID0gVlA4UkdCVG9ZKHJnYlswXSwgcmdiWzFdLCByZ2JbMl0sIFlVVl9IQUxGKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBDb252ZXJ0QkdSMjRUb1lfU1NFMihjb25zdCB1aW50OF90KiBiZ3IsIHVpbnQ4X3QqIHksIGludCB3aWR0aCkgeworICBjb25zdCBpbnQgbWF4X3dpZHRoID0gd2lkdGggJiB+MzE7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgbWF4X3dpZHRoOyBiZ3IgKz0gMyAqIDE2ICogMikgeworICAgIF9fbTEyOGkgYmdyX3BsYW5lWzZdOworICAgIGludCBqOworCisgICAgUkdCMjRQYWNrZWRUb1BsYW5hcl9TU0UyKGJnciwgYmdyX3BsYW5lKTsKKworICAgIGZvciAoaiA9IDA7IGogPCAyOyArK2osIGkgKz0gMTYpIHsKKyAgICAgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgICAgICBfX20xMjhpIHIsIGcsIGIsIFkwLCBZMTsKKworICAgICAgLy8gQ29udmVydCB0byAxNi1iaXQgWS4KKyAgICAgIGIgPSBfbW1fdW5wYWNrbG9fZXBpOChiZ3JfcGxhbmVbMCArIGpdLCB6ZXJvKTsKKyAgICAgIGcgPSBfbW1fdW5wYWNrbG9fZXBpOChiZ3JfcGxhbmVbMiArIGpdLCB6ZXJvKTsKKyAgICAgIHIgPSBfbW1fdW5wYWNrbG9fZXBpOChiZ3JfcGxhbmVbNCArIGpdLCB6ZXJvKTsKKyAgICAgIENvbnZlcnRSR0JUb1lfU1NFMigmciwgJmcsICZiLCAmWTApOworCisgICAgICAvLyBDb252ZXJ0IHRvIDE2LWJpdCBZLgorICAgICAgYiA9IF9tbV91bnBhY2toaV9lcGk4KGJncl9wbGFuZVswICsgal0sIHplcm8pOworICAgICAgZyA9IF9tbV91bnBhY2toaV9lcGk4KGJncl9wbGFuZVsyICsgal0sIHplcm8pOworICAgICAgciA9IF9tbV91bnBhY2toaV9lcGk4KGJncl9wbGFuZVs0ICsgal0sIHplcm8pOworICAgICAgQ29udmVydFJHQlRvWV9TU0UyKCZyLCAmZywgJmIsICZZMSk7CisKKyAgICAgIC8vIENhc3QgdG8gOC1iaXQgYW5kIHN0b3JlLgorICAgICAgU1RPUkVfMTYoX21tX3BhY2t1c19lcGkxNihZMCwgWTEpLCB5ICsgaSk7CisgICAgfQorICB9CisgIGZvciAoOyBpIDwgd2lkdGg7ICsraSwgYmdyICs9IDMpIHsgIC8vIGxlZnQtb3ZlcgorICAgIHlbaV0gPSBWUDhSR0JUb1koYmdyWzJdLCBiZ3JbMV0sIGJnclswXSwgWVVWX0hBTEYpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIENvbnZlcnRBUkdCVG9ZX1NTRTIoY29uc3QgdWludDMyX3QqIGFyZ2IsIHVpbnQ4X3QqIHksIGludCB3aWR0aCkgeworICBjb25zdCBpbnQgbWF4X3dpZHRoID0gd2lkdGggJiB+MTU7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgbWF4X3dpZHRoOyBpICs9IDE2KSB7CisgICAgX19tMTI4aSBZMCwgWTEsIHJnYls2XTsKKyAgICBSR0IzMlBhY2tlZFRvUGxhbmFyX1NTRTIoJmFyZ2JbaV0sIHJnYik7CisgICAgQ29udmVydFJHQlRvWV9TU0UyKCZyZ2JbMF0sICZyZ2JbMl0sICZyZ2JbNF0sICZZMCk7CisgICAgQ29udmVydFJHQlRvWV9TU0UyKCZyZ2JbMV0sICZyZ2JbM10sICZyZ2JbNV0sICZZMSk7CisgICAgU1RPUkVfMTYoX21tX3BhY2t1c19lcGkxNihZMCwgWTEpLCB5ICsgaSk7CisgIH0KKyAgZm9yICg7IGkgPCB3aWR0aDsgKytpKSB7ICAgLy8gbGVmdC1vdmVyCisgICAgY29uc3QgdWludDMyX3QgcCA9IGFyZ2JbaV07CisgICAgeVtpXSA9IFZQOFJHQlRvWSgocCA+PiAxNikgJiAweGZmLCAocCA+PiA4KSAmIDB4ZmYsIChwID4+ICAwKSAmIDB4ZmYsCisgICAgICAgICAgICAgICAgICAgICBZVVZfSEFMRik7CisgIH0KK30KKworLy8gSG9yaXpvbnRhbCBhZGQgKGRvdWJsZWQpIG9mIHR3byAxNmIgdmFsdWVzLCByZXN1bHQgaXMgMTZiLgorLy8gaW46IEEgfCBCIHwgQyB8IEQgfCAuLi4gLT4gb3V0OiAyKihBK0IpIHwgMiooQytEKSB8IC4uLgorc3RhdGljIHZvaWQgSG9yaXpvbnRhbEFkZFBhY2tfU1NFMihjb25zdCBfX20xMjhpKiBjb25zdCBBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBvdXQpIHsKKyAgY29uc3QgX19tMTI4aSBrMiA9IF9tbV9zZXQxX2VwaTE2KDIpOworICBjb25zdCBfX20xMjhpIEMgPSBfbW1fbWFkZF9lcGkxNigqQSwgazIpOworICBjb25zdCBfX20xMjhpIEQgPSBfbW1fbWFkZF9lcGkxNigqQiwgazIpOworICAqb3V0ID0gX21tX3BhY2tzX2VwaTMyKEMsIEQpOworfQorCitzdGF0aWMgdm9pZCBDb252ZXJ0QVJHQlRvVVZfU1NFMihjb25zdCB1aW50MzJfdCogYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3dpZHRoLCBpbnQgZG9fc3RvcmUpIHsKKyAgY29uc3QgaW50IG1heF93aWR0aCA9IHNyY193aWR0aCAmIH4zMTsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBtYXhfd2lkdGg7IGkgKz0gMzIsIHUgKz0gMTYsIHYgKz0gMTYpIHsKKyAgICBfX20xMjhpIHJnYls2XSwgVTAsIFYwLCBVMSwgVjE7CisgICAgUkdCMzJQYWNrZWRUb1BsYW5hcl9TU0UyKCZhcmdiW2ldLCByZ2IpOworICAgIEhvcml6b250YWxBZGRQYWNrX1NTRTIoJnJnYlswXSwgJnJnYlsxXSwgJnJnYlswXSk7CisgICAgSG9yaXpvbnRhbEFkZFBhY2tfU1NFMigmcmdiWzJdLCAmcmdiWzNdLCAmcmdiWzJdKTsKKyAgICBIb3Jpem9udGFsQWRkUGFja19TU0UyKCZyZ2JbNF0sICZyZ2JbNV0sICZyZ2JbNF0pOworICAgIENvbnZlcnRSR0JUb1VWX1NTRTIoJnJnYlswXSwgJnJnYlsyXSwgJnJnYls0XSwgJlUwLCAmVjApOworCisgICAgUkdCMzJQYWNrZWRUb1BsYW5hcl9TU0UyKCZhcmdiW2kgKyAxNl0sIHJnYik7CisgICAgSG9yaXpvbnRhbEFkZFBhY2tfU1NFMigmcmdiWzBdLCAmcmdiWzFdLCAmcmdiWzBdKTsKKyAgICBIb3Jpem9udGFsQWRkUGFja19TU0UyKCZyZ2JbMl0sICZyZ2JbM10sICZyZ2JbMl0pOworICAgIEhvcml6b250YWxBZGRQYWNrX1NTRTIoJnJnYls0XSwgJnJnYls1XSwgJnJnYls0XSk7CisgICAgQ29udmVydFJHQlRvVVZfU1NFMigmcmdiWzBdLCAmcmdiWzJdLCAmcmdiWzRdLCAmVTEsICZWMSk7CisKKyAgICBVMCA9IF9tbV9wYWNrdXNfZXBpMTYoVTAsIFUxKTsKKyAgICBWMCA9IF9tbV9wYWNrdXNfZXBpMTYoVjAsIFYxKTsKKyAgICBpZiAoIWRvX3N0b3JlKSB7CisgICAgICBjb25zdCBfX20xMjhpIHByZXZfdSA9IExPQURfMTYodSk7CisgICAgICBjb25zdCBfX20xMjhpIHByZXZfdiA9IExPQURfMTYodik7CisgICAgICBVMCA9IF9tbV9hdmdfZXB1OChVMCwgcHJldl91KTsKKyAgICAgIFYwID0gX21tX2F2Z19lcHU4KFYwLCBwcmV2X3YpOworICAgIH0KKyAgICBTVE9SRV8xNihVMCwgdSk7CisgICAgU1RPUkVfMTYoVjAsIHYpOworICB9CisgIGlmIChpIDwgc3JjX3dpZHRoKSB7ICAvLyBsZWZ0LW92ZXIKKyAgICBXZWJQQ29udmVydEFSR0JUb1VWX0MoYXJnYiArIGksIHUsIHYsIHNyY193aWR0aCAtIGksIGRvX3N0b3JlKTsKKyAgfQorfQorCisvLyBDb252ZXJ0IDE2IHBhY2tlZCBBUkdCIDE2Yi12YWx1ZXMgdG8gcltdLCBnW10sIGJbXQorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUkdCQTMyUGFja2VkVG9QbGFuYXJfMTZiX1NTRTIoCisgICAgY29uc3QgdWludDE2X3QqIGNvbnN0IHJnYngsCisgICAgX19tMTI4aSogY29uc3QgciwgX19tMTI4aSogY29uc3QgZywgX19tMTI4aSogY29uc3QgYikgeworICBjb25zdCBfX20xMjhpIGluMCA9IExPQURfMTYocmdieCArICAwKTsgIC8vIHIwIHwgZzAgfCBiMCB8eHwgcjEgfCBnMSB8IGIxIHx4CisgIGNvbnN0IF9fbTEyOGkgaW4xID0gTE9BRF8xNihyZ2J4ICsgIDgpOyAgLy8gcjIgfCBnMiB8IGIyIHx4fCByMyB8IGczIHwgYjMgfHgKKyAgY29uc3QgX19tMTI4aSBpbjIgPSBMT0FEXzE2KHJnYnggKyAxNik7ICAvLyByNCB8IC4uLgorICBjb25zdCBfX20xMjhpIGluMyA9IExPQURfMTYocmdieCArIDI0KTsgIC8vIHI2IHwgLi4uCisgIC8vIGNvbHVtbi13aXNlIHRyYW5zcG9zZQorICBjb25zdCBfX20xMjhpIEEwID0gX21tX3VucGFja2xvX2VwaTE2KGluMCwgaW4xKTsKKyAgY29uc3QgX19tMTI4aSBBMSA9IF9tbV91bnBhY2toaV9lcGkxNihpbjAsIGluMSk7CisgIGNvbnN0IF9fbTEyOGkgQTIgPSBfbW1fdW5wYWNrbG9fZXBpMTYoaW4yLCBpbjMpOworICBjb25zdCBfX20xMjhpIEEzID0gX21tX3VucGFja2hpX2VwaTE2KGluMiwgaW4zKTsKKyAgY29uc3QgX19tMTI4aSBCMCA9IF9tbV91bnBhY2tsb19lcGkxNihBMCwgQTEpOyAgLy8gcjAgcjEgcjIgcjMgfCBnMCBnMSAuLgorICBjb25zdCBfX20xMjhpIEIxID0gX21tX3VucGFja2hpX2VwaTE2KEEwLCBBMSk7ICAvLyBiMCBiMSBiMiBiMyB8IHggeCB4IHgKKyAgY29uc3QgX19tMTI4aSBCMiA9IF9tbV91bnBhY2tsb19lcGkxNihBMiwgQTMpOyAgLy8gcjQgcjUgcjYgcjcgfCBnNCBnNSAuLgorICBjb25zdCBfX20xMjhpIEIzID0gX21tX3VucGFja2hpX2VwaTE2KEEyLCBBMyk7ICAvLyBiNCBiNSBiNiBiNyB8IHggeCB4IHgKKyAgKnIgPSBfbW1fdW5wYWNrbG9fZXBpNjQoQjAsIEIyKTsKKyAgKmcgPSBfbW1fdW5wYWNraGlfZXBpNjQoQjAsIEIyKTsKKyAgKmIgPSBfbW1fdW5wYWNrbG9fZXBpNjQoQjEsIEIzKTsKK30KKworc3RhdGljIHZvaWQgQ29udmVydFJHQkEzMlRvVVZfU1NFMihjb25zdCB1aW50MTZfdCogcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB1LCB1aW50OF90KiB2LCBpbnQgd2lkdGgpIHsKKyAgY29uc3QgaW50IG1heF93aWR0aCA9IHdpZHRoICYgfjE1OworICBjb25zdCB1aW50MTZfdCogY29uc3QgbGFzdF9yZ2IgPSByZ2IgKyA0ICogbWF4X3dpZHRoOworICB3aGlsZSAocmdiIDwgbGFzdF9yZ2IpIHsKKyAgICBfX20xMjhpIHIsIGcsIGIsIFUwLCBWMCwgVTEsIFYxOworICAgIFJHQkEzMlBhY2tlZFRvUGxhbmFyXzE2Yl9TU0UyKHJnYiArICAwLCAmciwgJmcsICZiKTsKKyAgICBDb252ZXJ0UkdCVG9VVl9TU0UyKCZyLCAmZywgJmIsICZVMCwgJlYwKTsKKyAgICBSR0JBMzJQYWNrZWRUb1BsYW5hcl8xNmJfU1NFMihyZ2IgKyAzMiwgJnIsICZnLCAmYik7CisgICAgQ29udmVydFJHQlRvVVZfU1NFMigmciwgJmcsICZiLCAmVTEsICZWMSk7CisgICAgU1RPUkVfMTYoX21tX3BhY2t1c19lcGkxNihVMCwgVTEpLCB1KTsKKyAgICBTVE9SRV8xNihfbW1fcGFja3VzX2VwaTE2KFYwLCBWMSksIHYpOworICAgIHUgKz0gMTY7CisgICAgdiArPSAxNjsKKyAgICByZ2IgKz0gMiAqIDMyOworICB9CisgIGlmIChtYXhfd2lkdGggPCB3aWR0aCkgeyAgLy8gbGVmdC1vdmVyCisgICAgV2ViUENvbnZlcnRSR0JBMzJUb1VWX0MocmdiLCB1LCB2LCB3aWR0aCAtIG1heF93aWR0aCk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZXh0ZXJuIHZvaWQgV2ViUEluaXRDb252ZXJ0QVJHQlRvWVVWU1NFMih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFdlYlBJbml0Q29udmVydEFSR0JUb1lVVlNTRTIodm9pZCkgeworICBXZWJQQ29udmVydEFSR0JUb1kgPSBDb252ZXJ0QVJHQlRvWV9TU0UyOworICBXZWJQQ29udmVydEFSR0JUb1VWID0gQ29udmVydEFSR0JUb1VWX1NTRTI7CisKKyAgV2ViUENvbnZlcnRSR0IyNFRvWSA9IENvbnZlcnRSR0IyNFRvWV9TU0UyOworICBXZWJQQ29udmVydEJHUjI0VG9ZID0gQ29udmVydEJHUjI0VG9ZX1NTRTI7CisKKyAgV2ViUENvbnZlcnRSR0JBMzJUb1VWID0gQ29udmVydFJHQkEzMlRvVVZfU1NFMjsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBNQVhfWSAoKDEgPDwgMTApIC0gMSkgICAgLy8gMTBiIHByZWNpc2lvbiBvdmVyIDE2Yi1hcml0aG1ldGljCitzdGF0aWMgdWludDE2X3QgY2xpcF95KGludCB2KSB7CisgIHJldHVybiAodiA8IDApID8gMCA6ICh2ID4gTUFYX1kpID8gTUFYX1kgOiAodWludDE2X3QpdjsKK30KKworc3RhdGljIHVpbnQ2NF90IFNoYXJwWVVWVXBkYXRlWV9TU0UyKGNvbnN0IHVpbnQxNl90KiByZWYsIGNvbnN0IHVpbnQxNl90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIGRzdCwgaW50IGxlbikgeworICB1aW50NjRfdCBkaWZmID0gMDsKKyAgdWludDMyX3QgdG1wWzRdOworICBpbnQgaTsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgY29uc3QgX19tMTI4aSBtYXggPSBfbW1fc2V0MV9lcGkxNihNQVhfWSk7CisgIGNvbnN0IF9fbTEyOGkgb25lID0gX21tX3NldDFfZXBpMTYoMSk7CisgIF9fbTEyOGkgc3VtID0gemVybzsKKworICBmb3IgKGkgPSAwOyBpICsgOCA8PSBsZW47IGkgKz0gOCkgeworICAgIGNvbnN0IF9fbTEyOGkgQSA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKHJlZiArIGkpKTsKKyAgICBjb25zdCBfX20xMjhpIEIgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShzcmMgKyBpKSk7CisgICAgY29uc3QgX19tMTI4aSBDID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikoZHN0ICsgaSkpOworICAgIGNvbnN0IF9fbTEyOGkgRCA9IF9tbV9zdWJfZXBpMTYoQSwgQik7ICAgICAgIC8vIGRpZmZfeQorICAgIGNvbnN0IF9fbTEyOGkgRSA9IF9tbV9jbXBndF9lcGkxNih6ZXJvLCBEKTsgIC8vIHNpZ24gKC0xIG9yIDApCisgICAgY29uc3QgX19tMTI4aSBGID0gX21tX2FkZF9lcGkxNihDLCBEKTsgICAgICAgLy8gbmV3X3kKKyAgICBjb25zdCBfX20xMjhpIEcgPSBfbW1fb3Jfc2kxMjgoRSwgb25lKTsgICAgICAvLyAtMSBvciAxCisgICAgY29uc3QgX19tMTI4aSBIID0gX21tX21heF9lcGkxNihfbW1fbWluX2VwaTE2KEYsIG1heCksIHplcm8pOworICAgIGNvbnN0IF9fbTEyOGkgSSA9IF9tbV9tYWRkX2VwaTE2KEQsIEcpOyAgICAgIC8vIHN1bShhYnMoLi4uKSkKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikoZHN0ICsgaSksIEgpOworICAgIHN1bSA9IF9tbV9hZGRfZXBpMzIoc3VtLCBJKTsKKyAgfQorICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKil0bXAsIHN1bSk7CisgIGRpZmYgPSB0bXBbM10gKyB0bXBbMl0gKyB0bXBbMV0gKyB0bXBbMF07CisgIGZvciAoOyBpIDwgbGVuOyArK2kpIHsKKyAgICBjb25zdCBpbnQgZGlmZl95ID0gcmVmW2ldIC0gc3JjW2ldOworICAgIGNvbnN0IGludCBuZXdfeSA9IChpbnQpZHN0W2ldICsgZGlmZl95OworICAgIGRzdFtpXSA9IGNsaXBfeShuZXdfeSk7CisgICAgZGlmZiArPSAodWludDY0X3QpYWJzKGRpZmZfeSk7CisgIH0KKyAgcmV0dXJuIGRpZmY7Cit9CisKK3N0YXRpYyB2b2lkIFNoYXJwWVVWVXBkYXRlUkdCX1NTRTIoY29uc3QgaW50MTZfdCogcmVmLCBjb25zdCBpbnQxNl90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QqIGRzdCwgaW50IGxlbikgeworICBpbnQgaSA9IDA7CisgIGZvciAoaSA9IDA7IGkgKyA4IDw9IGxlbjsgaSArPSA4KSB7CisgICAgY29uc3QgX19tMTI4aSBBID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikocmVmICsgaSkpOworICAgIGNvbnN0IF9fbTEyOGkgQiA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKHNyYyArIGkpKTsKKyAgICBjb25zdCBfX20xMjhpIEMgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShkc3QgKyBpKSk7CisgICAgY29uc3QgX19tMTI4aSBEID0gX21tX3N1Yl9lcGkxNihBLCBCKTsgICAvLyBkaWZmX3V2CisgICAgY29uc3QgX19tMTI4aSBFID0gX21tX2FkZF9lcGkxNihDLCBEKTsgICAvLyBuZXdfdXYKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikoZHN0ICsgaSksIEUpOworICB9CisgIGZvciAoOyBpIDwgbGVuOyArK2kpIHsKKyAgICBjb25zdCBpbnQgZGlmZl91diA9IHJlZltpXSAtIHNyY1tpXTsKKyAgICBkc3RbaV0gKz0gZGlmZl91djsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBTaGFycFlVVkZpbHRlclJvd19TU0UyKGNvbnN0IGludDE2X3QqIEEsIGNvbnN0IGludDE2X3QqIEIsIGludCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90KiBiZXN0X3ksIHVpbnQxNl90KiBvdXQpIHsKKyAgaW50IGk7CisgIGNvbnN0IF9fbTEyOGkga0NzdDggPSBfbW1fc2V0MV9lcGkxNig4KTsKKyAgY29uc3QgX19tMTI4aSBtYXggPSBfbW1fc2V0MV9lcGkxNihNQVhfWSk7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGZvciAoaSA9IDA7IGkgKyA4IDw9IGxlbjsgaSArPSA4KSB7CisgICAgY29uc3QgX19tMTI4aSBhMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKEEgKyBpICsgMCkpOworICAgIGNvbnN0IF9fbTEyOGkgYTEgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShBICsgaSArIDEpKTsKKyAgICBjb25zdCBfX20xMjhpIGIwID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikoQiArIGkgKyAwKSk7CisgICAgY29uc3QgX19tMTI4aSBiMSA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKEIgKyBpICsgMSkpOworICAgIGNvbnN0IF9fbTEyOGkgYTBiMSA9IF9tbV9hZGRfZXBpMTYoYTAsIGIxKTsKKyAgICBjb25zdCBfX20xMjhpIGExYjAgPSBfbW1fYWRkX2VwaTE2KGExLCBiMCk7CisgICAgY29uc3QgX19tMTI4aSBhMGExYjBiMSA9IF9tbV9hZGRfZXBpMTYoYTBiMSwgYTFiMCk7ICAvLyBBMCtBMStCMCtCMQorICAgIGNvbnN0IF9fbTEyOGkgYTBhMWIwYjFfOCA9IF9tbV9hZGRfZXBpMTYoYTBhMWIwYjEsIGtDc3Q4KTsKKyAgICBjb25zdCBfX20xMjhpIGEwYjFfMiA9IF9tbV9hZGRfZXBpMTYoYTBiMSwgYTBiMSk7ICAgIC8vIDIqKEEwK0IxKQorICAgIGNvbnN0IF9fbTEyOGkgYTFiMF8yID0gX21tX2FkZF9lcGkxNihhMWIwLCBhMWIwKTsgICAgLy8gMiooQTErQjApCisgICAgY29uc3QgX19tMTI4aSBjMCA9IF9tbV9zcmFpX2VwaTE2KF9tbV9hZGRfZXBpMTYoYTBiMV8yLCBhMGExYjBiMV84KSwgMyk7CisgICAgY29uc3QgX19tMTI4aSBjMSA9IF9tbV9zcmFpX2VwaTE2KF9tbV9hZGRfZXBpMTYoYTFiMF8yLCBhMGExYjBiMV84KSwgMyk7CisgICAgY29uc3QgX19tMTI4aSBkMCA9IF9tbV9hZGRfZXBpMTYoYzEsIGEwKTsKKyAgICBjb25zdCBfX20xMjhpIGQxID0gX21tX2FkZF9lcGkxNihjMCwgYTEpOworICAgIGNvbnN0IF9fbTEyOGkgZTAgPSBfbW1fc3JhaV9lcGkxNihkMCwgMSk7CisgICAgY29uc3QgX19tMTI4aSBlMSA9IF9tbV9zcmFpX2VwaTE2KGQxLCAxKTsKKyAgICBjb25zdCBfX20xMjhpIGYwID0gX21tX3VucGFja2xvX2VwaTE2KGUwLCBlMSk7CisgICAgY29uc3QgX19tMTI4aSBmMSA9IF9tbV91bnBhY2toaV9lcGkxNihlMCwgZTEpOworICAgIGNvbnN0IF9fbTEyOGkgZzAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShiZXN0X3kgKyAyICogaSArIDApKTsKKyAgICBjb25zdCBfX20xMjhpIGcxID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikoYmVzdF95ICsgMiAqIGkgKyA4KSk7CisgICAgY29uc3QgX19tMTI4aSBoMCA9IF9tbV9hZGRfZXBpMTYoZzAsIGYwKTsKKyAgICBjb25zdCBfX20xMjhpIGgxID0gX21tX2FkZF9lcGkxNihnMSwgZjEpOworICAgIGNvbnN0IF9fbTEyOGkgaTAgPSBfbW1fbWF4X2VwaTE2KF9tbV9taW5fZXBpMTYoaDAsIG1heCksIHplcm8pOworICAgIGNvbnN0IF9fbTEyOGkgaTEgPSBfbW1fbWF4X2VwaTE2KF9tbV9taW5fZXBpMTYoaDEsIG1heCksIHplcm8pOworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKShvdXQgKyAyICogaSArIDApLCBpMCk7CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopKG91dCArIDIgKiBpICsgOCksIGkxKTsKKyAgfQorICBmb3IgKDsgaSA8IGxlbjsgKytpKSB7CisgICAgLy8gICAoOSAqIEEwICsgMyAqIEExICsgMyAqIEIwICsgQjEgKyA4KSA+PiA0ID0KKyAgICAvLyA9ICg4ICogQTAgKyAyICogKEExICsgQjApICsgKEEwICsgQTEgKyBCMCArIEIxICsgOCkpID4+IDQKKyAgICAvLyBXZSByZXVzZSB0aGUgY29tbW9uIHN1Yi1leHByZXNzaW9ucy4KKyAgICBjb25zdCBpbnQgYTBiMSA9IEFbaSArIDBdICsgQltpICsgMV07CisgICAgY29uc3QgaW50IGExYjAgPSBBW2kgKyAxXSArIEJbaSArIDBdOworICAgIGNvbnN0IGludCBhMGExYjBiMSA9IGEwYjEgKyBhMWIwICsgODsKKyAgICBjb25zdCBpbnQgdjAgPSAoOCAqIEFbaSArIDBdICsgMiAqIGExYjAgKyBhMGExYjBiMSkgPj4gNDsKKyAgICBjb25zdCBpbnQgdjEgPSAoOCAqIEFbaSArIDFdICsgMiAqIGEwYjEgKyBhMGExYjBiMSkgPj4gNDsKKyAgICBvdXRbMiAqIGkgKyAwXSA9IGNsaXBfeShiZXN0X3lbMiAqIGkgKyAwXSArIHYwKTsKKyAgICBvdXRbMiAqIGkgKyAxXSA9IGNsaXBfeShiZXN0X3lbMiAqIGkgKyAxXSArIHYxKTsKKyAgfQorfQorCisjdW5kZWYgTUFYX1kKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZXh0ZXJuIHZvaWQgV2ViUEluaXRTaGFycFlVVlNTRTIodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBXZWJQSW5pdFNoYXJwWVVWU1NFMih2b2lkKSB7CisgIFdlYlBTaGFycFlVVlVwZGF0ZVkgPSBTaGFycFlVVlVwZGF0ZVlfU1NFMjsKKyAgV2ViUFNoYXJwWVVWVXBkYXRlUkdCID0gU2hhcnBZVVZVcGRhdGVSR0JfU1NFMjsKKyAgV2ViUFNoYXJwWVVWRmlsdGVyUm93ID0gU2hhcnBZVVZGaWx0ZXJSb3dfU1NFMjsKK30KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9TU0UyCisKK1dFQlBfRFNQX0lOSVRfU1RVQihXZWJQSW5pdFNhbXBsZXJzU1NFMikKK1dFQlBfRFNQX0lOSVRfU1RVQihXZWJQSW5pdENvbnZlcnRBUkdCVG9ZVVZTU0UyKQorV0VCUF9EU1BfSU5JVF9TVFVCKFdlYlBJbml0U2hhcnBZVVZTU0UyKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX1NTRTIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AveXV2X3NzZTQxLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3l1dl9zc2U0MS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3OWQxZjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3l1dl9zc2U0MS5jCkBAIC0wLDAgKzEsNjEzIEBACisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gWVVWLT5SR0IgY29udmVyc2lvbiBmdW5jdGlvbnMKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSAic3JjL2RzcC95dXYuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFNDEpCisKKyNpbmNsdWRlICJzcmMvZHNwL2NvbW1vbl9zc2U0MS5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHNtbWludHJpbi5oPgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb252ZXJ0IHNwYW5zIG9mIDMyIHBpeGVscyB0byB2YXJpb3VzIFJHQiBmb3JtYXRzIGZvciB0aGUgZmFuY3kgdXBzYW1wbGVyLgorCisvLyBUaGVzZSBjb25zdGFudHMgYXJlIDE0YiBmaXhlZC1wb2ludCB2ZXJzaW9uIG9mIElUVS1SIEJULjYwMSBjb25zdGFudHMuCisvLyBSID0gKDE5MDc3ICogeSAgICAgICAgICAgICArIDI2MTQ5ICogdiAtIDE0MjM0KSA+PiA2CisvLyBHID0gKDE5MDc3ICogeSAtICA2NDE5ICogdSAtIDEzMzIwICogdiArICA4NzA4KSA+PiA2CisvLyBCID0gKDE5MDc3ICogeSArIDMzMDUwICogdSAgICAgICAgICAgICAtIDE3Njg1KSA+PiA2CitzdGF0aWMgdm9pZCBDb252ZXJ0WVVWNDQ0VG9SR0JfU1NFNDEoY29uc3QgX19tMTI4aSogY29uc3QgWTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgVTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgVjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IEIpIHsKKyAgY29uc3QgX19tMTI4aSBrMTkwNzcgPSBfbW1fc2V0MV9lcGkxNigxOTA3Nyk7CisgIGNvbnN0IF9fbTEyOGkgazI2MTQ5ID0gX21tX3NldDFfZXBpMTYoMjYxNDkpOworICBjb25zdCBfX20xMjhpIGsxNDIzNCA9IF9tbV9zZXQxX2VwaTE2KDE0MjM0KTsKKyAgLy8gMzMwNTAgZG9lc24ndCBmaXQgaW4gYSBzaWduZWQgc2hvcnQ6IG9ubHkgdXNlIHRoaXMgd2l0aCB1bnNpZ25lZCBhcml0aG1ldGljCisgIGNvbnN0IF9fbTEyOGkgazMzMDUwID0gX21tX3NldDFfZXBpMTYoKHNob3J0KTMzMDUwKTsKKyAgY29uc3QgX19tMTI4aSBrMTc2ODUgPSBfbW1fc2V0MV9lcGkxNigxNzY4NSk7CisgIGNvbnN0IF9fbTEyOGkgazY0MTkgID0gX21tX3NldDFfZXBpMTYoNjQxOSk7CisgIGNvbnN0IF9fbTEyOGkgazEzMzIwID0gX21tX3NldDFfZXBpMTYoMTMzMjApOworICBjb25zdCBfX20xMjhpIGs4NzA4ICA9IF9tbV9zZXQxX2VwaTE2KDg3MDgpOworCisgIGNvbnN0IF9fbTEyOGkgWTEgPSBfbW1fbXVsaGlfZXB1MTYoKlkwLCBrMTkwNzcpOworCisgIGNvbnN0IF9fbTEyOGkgUjAgPSBfbW1fbXVsaGlfZXB1MTYoKlYwLCBrMjYxNDkpOworICBjb25zdCBfX20xMjhpIFIxID0gX21tX3N1Yl9lcGkxNihZMSwgazE0MjM0KTsKKyAgY29uc3QgX19tMTI4aSBSMiA9IF9tbV9hZGRfZXBpMTYoUjEsIFIwKTsKKworICBjb25zdCBfX20xMjhpIEcwID0gX21tX211bGhpX2VwdTE2KCpVMCwgazY0MTkpOworICBjb25zdCBfX20xMjhpIEcxID0gX21tX211bGhpX2VwdTE2KCpWMCwgazEzMzIwKTsKKyAgY29uc3QgX19tMTI4aSBHMiA9IF9tbV9hZGRfZXBpMTYoWTEsIGs4NzA4KTsKKyAgY29uc3QgX19tMTI4aSBHMyA9IF9tbV9hZGRfZXBpMTYoRzAsIEcxKTsKKyAgY29uc3QgX19tMTI4aSBHNCA9IF9tbV9zdWJfZXBpMTYoRzIsIEczKTsKKworICAvLyBiZSBjYXJlZnVsIHdpdGggdGhlIHNhdHVyYXRlZCAqdW5zaWduZWQqIGFyaXRobWV0aWMgaGVyZSEKKyAgY29uc3QgX19tMTI4aSBCMCA9IF9tbV9tdWxoaV9lcHUxNigqVTAsIGszMzA1MCk7CisgIGNvbnN0IF9fbTEyOGkgQjEgPSBfbW1fYWRkc19lcHUxNihCMCwgWTEpOworICBjb25zdCBfX20xMjhpIEIyID0gX21tX3N1YnNfZXB1MTYoQjEsIGsxNzY4NSk7CisKKyAgLy8gdXNlIGxvZ2ljYWwgc2hpZnQgZm9yIEIyLCB3aGljaCBjYW4gYmUgbGFyZ2VyIHRoYW4gMzI3NjcKKyAgKlIgPSBfbW1fc3JhaV9lcGkxNihSMiwgNik7ICAgLy8gcmFuZ2U6IFstMTQyMzQsIDMwODE1XQorICAqRyA9IF9tbV9zcmFpX2VwaTE2KEc0LCA2KTsgICAvLyByYW5nZTogWy0xMDk1MywgMjc3MTBdCisgICpCID0gX21tX3NybGlfZXBpMTYoQjIsIDYpOyAgIC8vIHJhbmdlOiBbMCwgMzQyMzhdCit9CisKKy8vIExvYWQgdGhlIGJ5dGVzIGludG8gdGhlICp1cHBlciogcGFydCBvZiAxNmIgd29yZHMuIFRoYXQncyAiPDwgOCIsIGJhc2ljYWxseS4KK3N0YXRpYyBXRUJQX0lOTElORSBfX20xMjhpIExvYWRfSElfMTZfU1NFNDEoY29uc3QgdWludDhfdCogc3JjKSB7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIHJldHVybiBfbW1fdW5wYWNrbG9fZXBpOCh6ZXJvLCBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKXNyYykpOworfQorCisvLyBMb2FkIGFuZCByZXBsaWNhdGUgdGhlIFUvViBzYW1wbGVzCitzdGF0aWMgV0VCUF9JTkxJTkUgX19tMTI4aSBMb2FkX1VWX0hJXzhfU1NFNDEoY29uc3QgdWludDhfdCogc3JjKSB7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGNvbnN0IF9fbTEyOGkgdG1wMCA9IF9tbV9jdnRzaTMyX3NpMTI4KCooY29uc3QgdWludDMyX3QqKXNyYyk7CisgIGNvbnN0IF9fbTEyOGkgdG1wMSA9IF9tbV91bnBhY2tsb19lcGk4KHplcm8sIHRtcDApOworICByZXR1cm4gX21tX3VucGFja2xvX2VwaTE2KHRtcDEsIHRtcDEpOyAgIC8vIHJlcGxpY2F0ZSBzYW1wbGVzCit9CisKKy8vIENvbnZlcnQgMzIgc2FtcGxlcyBvZiBZVVY0NDQgdG8gUi9HL0IKK3N0YXRpYyB2b2lkIFlVVjQ0NFRvUkdCX1NTRTQxKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCB1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IFIsIF9fbTEyOGkqIGNvbnN0IEcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBCKSB7CisgIGNvbnN0IF9fbTEyOGkgWTAgPSBMb2FkX0hJXzE2X1NTRTQxKHkpLCBVMCA9IExvYWRfSElfMTZfU1NFNDEodSksCisgICAgICAgICAgICAgICAgVjAgPSBMb2FkX0hJXzE2X1NTRTQxKHYpOworICBDb252ZXJ0WVVWNDQ0VG9SR0JfU1NFNDEoJlkwLCAmVTAsICZWMCwgUiwgRywgQik7Cit9CisKKy8vIENvbnZlcnQgMzIgc2FtcGxlcyBvZiBZVVY0MjAgdG8gUi9HL0IKK3N0YXRpYyB2b2lkIFlVVjQyMFRvUkdCX1NTRTQxKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCB1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IFIsIF9fbTEyOGkqIGNvbnN0IEcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBCKSB7CisgIGNvbnN0IF9fbTEyOGkgWTAgPSBMb2FkX0hJXzE2X1NTRTQxKHkpLCBVMCA9IExvYWRfVVZfSElfOF9TU0U0MSh1KSwKKyAgICAgICAgICAgICAgICBWMCA9IExvYWRfVVZfSElfOF9TU0U0MSh2KTsKKyAgQ29udmVydFlVVjQ0NFRvUkdCX1NTRTQxKCZZMCwgJlUwLCAmVjAsIFIsIEcsIEIpOworfQorCisvLyBQYWNrIHRoZSBwbGFuYXIgYnVmZmVycworLy8gcnJyci4uLiBycnJyLi4uIGdnZ2cuLi4gZ2dnZy4uLiBiYmJiLi4uIGJiYmIuLi4uCisvLyB0cmlwbGV0IGJ5IHRyaXBsZXQgaW4gdGhlIG91dHB1dCBidWZmZXIgcmdiIGFzIHJnYnJnYnJnYnJnYiAuLi4KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFBsYW5hclRvMjRiX1NTRTQxKAorICAgIF9fbTEyOGkqIGNvbnN0IGluMCwgX19tMTI4aSogY29uc3QgaW4xLCBfX20xMjhpKiBjb25zdCBpbjIsCisgICAgX19tMTI4aSogY29uc3QgaW4zLCBfX20xMjhpKiBjb25zdCBpbjQsIF9fbTEyOGkqIGNvbnN0IGluNSwKKyAgICB1aW50OF90KiBjb25zdCByZ2IpIHsKKyAgLy8gVGhlIGlucHV0IGlzIDYgcmVnaXN0ZXJzIG9mIHNpeHRlZW4gOGIgYnV0IGZvciB0aGUgc2FrZSBvZiBleHBsYW5hdGlvbiwKKyAgLy8gbGV0J3MgdGFrZSA2IHJlZ2lzdGVycyBvZiBmb3VyIDhiIHZhbHVlcy4KKyAgLy8gVG8gcGFjaywgd2Ugd2lsbCBrZWVwIHRha2luZyBvbmUgZXZlcnkgdHdvIDhiIGludGVnZXIgYW5kIG1vdmUgaXQKKyAgLy8gYXJvdW5kIGFzIGZvbGxvd3M6CisgIC8vIElucHV0OgorICAvLyAgIHIwcjFyMnIzIHwgcjRyNXI2cjcgfCBnMGcxZzJnMyB8IGc0ZzVnNmc3IHwgYjBiMWIyYjMgfCBiNGI1YjZiNworICAvLyBTcGxpdCB0aGUgNiByZWdpc3RlcnMgaW4gdHdvIHNldHMgb2YgMyByZWdpc3RlcnM6IHRoZSBmaXJzdCBzZXQgYXMgdGhlIGV2ZW4KKyAgLy8gOGIgYnl0ZXMsIHRoZSBzZWNvbmQgdGhlIG9kZCBvbmVzOgorICAvLyAgIHIwcjJyNHI2IHwgZzBnMmc0ZzYgfCBiMGIyYjRiNiB8IHIxcjNyNXI3IHwgZzFnM2c1ZzcgfCBiMWIzYjViNworICAvLyBSZXBlYXQgdGhlIHNhbWUgcGVybXV0YXRpb25zIHR3aWNlIG1vcmU6CisgIC8vICAgcjByNGcwZzQgfCBiMGI0cjFyNSB8IGcxZzViMWI1IHwgcjJyNmcyZzYgfCBiMmI2cjNyNyB8IGczZzdiM2I3CisgIC8vICAgcjBnMGIwcjEgfCBnMWIxcjJnMiB8IGIycjNnM2IzIHwgcjRnNGI0cjUgfCBnNWI1cjZnNiB8IGI2cjdnN2I3CisgIFZQOFBsYW5hclRvMjRiX1NTRTQxKGluMCwgaW4xLCBpbjIsIGluMywgaW40LCBpbjUpOworCisgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKShyZ2IgKyAgMCksICppbjApOworICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikocmdiICsgMTYpLCAqaW4xKTsKKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopKHJnYiArIDMyKSwgKmluMik7CisgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKShyZ2IgKyA0OCksICppbjMpOworICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikocmdiICsgNjQpLCAqaW40KTsKKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopKHJnYiArIDgwKSwgKmluNSk7Cit9CisKK3ZvaWQgVlA4WXV2VG9SZ2IzMl9TU0U0MShjb25zdCB1aW50OF90KiB5LCBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCkgeworICBfX20xMjhpIFIwLCBSMSwgUjIsIFIzLCBHMCwgRzEsIEcyLCBHMywgQjAsIEIxLCBCMiwgQjM7CisgIF9fbTEyOGkgcmdiMCwgcmdiMSwgcmdiMiwgcmdiMywgcmdiNCwgcmdiNTsKKworICBZVVY0NDRUb1JHQl9TU0U0MSh5ICsgMCwgdSArIDAsIHYgKyAwLCAmUjAsICZHMCwgJkIwKTsKKyAgWVVWNDQ0VG9SR0JfU1NFNDEoeSArIDgsIHUgKyA4LCB2ICsgOCwgJlIxLCAmRzEsICZCMSk7CisgIFlVVjQ0NFRvUkdCX1NTRTQxKHkgKyAxNiwgdSArIDE2LCB2ICsgMTYsICZSMiwgJkcyLCAmQjIpOworICBZVVY0NDRUb1JHQl9TU0U0MSh5ICsgMjQsIHUgKyAyNCwgdiArIDI0LCAmUjMsICZHMywgJkIzKTsKKworICAvLyBDYXN0IHRvIDhiIGFuZCBzdG9yZSBhcyBSUlJSR0dHR0JCQkIuCisgIHJnYjAgPSBfbW1fcGFja3VzX2VwaTE2KFIwLCBSMSk7CisgIHJnYjEgPSBfbW1fcGFja3VzX2VwaTE2KFIyLCBSMyk7CisgIHJnYjIgPSBfbW1fcGFja3VzX2VwaTE2KEcwLCBHMSk7CisgIHJnYjMgPSBfbW1fcGFja3VzX2VwaTE2KEcyLCBHMyk7CisgIHJnYjQgPSBfbW1fcGFja3VzX2VwaTE2KEIwLCBCMSk7CisgIHJnYjUgPSBfbW1fcGFja3VzX2VwaTE2KEIyLCBCMyk7CisKKyAgLy8gUGFjayBhcyBSR0JSR0JSR0JSR0IuCisgIFBsYW5hclRvMjRiX1NTRTQxKCZyZ2IwLCAmcmdiMSwgJnJnYjIsICZyZ2IzLCAmcmdiNCwgJnJnYjUsIGRzdCk7Cit9CisKK3ZvaWQgVlA4WXV2VG9CZ3IzMl9TU0U0MShjb25zdCB1aW50OF90KiB5LCBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCkgeworICBfX20xMjhpIFIwLCBSMSwgUjIsIFIzLCBHMCwgRzEsIEcyLCBHMywgQjAsIEIxLCBCMiwgQjM7CisgIF9fbTEyOGkgYmdyMCwgYmdyMSwgYmdyMiwgYmdyMywgYmdyNCwgYmdyNTsKKworICBZVVY0NDRUb1JHQl9TU0U0MSh5ICsgIDAsIHUgKyAgMCwgdiArICAwLCAmUjAsICZHMCwgJkIwKTsKKyAgWVVWNDQ0VG9SR0JfU1NFNDEoeSArICA4LCB1ICsgIDgsIHYgKyAgOCwgJlIxLCAmRzEsICZCMSk7CisgIFlVVjQ0NFRvUkdCX1NTRTQxKHkgKyAxNiwgdSArIDE2LCB2ICsgMTYsICZSMiwgJkcyLCAmQjIpOworICBZVVY0NDRUb1JHQl9TU0U0MSh5ICsgMjQsIHUgKyAyNCwgdiArIDI0LCAmUjMsICZHMywgJkIzKTsKKworICAvLyBDYXN0IHRvIDhiIGFuZCBzdG9yZSBhcyBCQkJCR0dHR1JSUlIuCisgIGJncjAgPSBfbW1fcGFja3VzX2VwaTE2KEIwLCBCMSk7CisgIGJncjEgPSBfbW1fcGFja3VzX2VwaTE2KEIyLCBCMyk7CisgIGJncjIgPSBfbW1fcGFja3VzX2VwaTE2KEcwLCBHMSk7CisgIGJncjMgPSBfbW1fcGFja3VzX2VwaTE2KEcyLCBHMyk7CisgIGJncjQgPSBfbW1fcGFja3VzX2VwaTE2KFIwLCBSMSk7CisgIGJncjU9IF9tbV9wYWNrdXNfZXBpMTYoUjIsIFIzKTsKKworICAvLyBQYWNrIGFzIEJHUkJHUkJHUkJHUi4KKyAgUGxhbmFyVG8yNGJfU1NFNDEoJmJncjAsICZiZ3IxLCAmYmdyMiwgJmJncjMsICZiZ3I0LCAmYmdyNSwgZHN0KTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQXJiaXRyYXJ5LWxlbmd0aCByb3cgY29udmVyc2lvbiBmdW5jdGlvbnMKKworc3RhdGljIHZvaWQgWXV2VG9SZ2JSb3dfU1NFNDEoY29uc3QgdWludDhfdCogeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBsZW4pIHsKKyAgaW50IG47CisgIGZvciAobiA9IDA7IG4gKyAzMiA8PSBsZW47IG4gKz0gMzIsIGRzdCArPSAzMiAqIDMpIHsKKyAgICBfX20xMjhpIFIwLCBSMSwgUjIsIFIzLCBHMCwgRzEsIEcyLCBHMywgQjAsIEIxLCBCMiwgQjM7CisgICAgX19tMTI4aSByZ2IwLCByZ2IxLCByZ2IyLCByZ2IzLCByZ2I0LCByZ2I1OworCisgICAgWVVWNDIwVG9SR0JfU1NFNDEoeSArICAwLCB1ICsgIDAsIHYgKyAgMCwgJlIwLCAmRzAsICZCMCk7CisgICAgWVVWNDIwVG9SR0JfU1NFNDEoeSArICA4LCB1ICsgIDQsIHYgKyAgNCwgJlIxLCAmRzEsICZCMSk7CisgICAgWVVWNDIwVG9SR0JfU1NFNDEoeSArIDE2LCB1ICsgIDgsIHYgKyAgOCwgJlIyLCAmRzIsICZCMik7CisgICAgWVVWNDIwVG9SR0JfU1NFNDEoeSArIDI0LCB1ICsgMTIsIHYgKyAxMiwgJlIzLCAmRzMsICZCMyk7CisKKyAgICAvLyBDYXN0IHRvIDhiIGFuZCBzdG9yZSBhcyBSUlJSR0dHR0JCQkIuCisgICAgcmdiMCA9IF9tbV9wYWNrdXNfZXBpMTYoUjAsIFIxKTsKKyAgICByZ2IxID0gX21tX3BhY2t1c19lcGkxNihSMiwgUjMpOworICAgIHJnYjIgPSBfbW1fcGFja3VzX2VwaTE2KEcwLCBHMSk7CisgICAgcmdiMyA9IF9tbV9wYWNrdXNfZXBpMTYoRzIsIEczKTsKKyAgICByZ2I0ID0gX21tX3BhY2t1c19lcGkxNihCMCwgQjEpOworICAgIHJnYjUgPSBfbW1fcGFja3VzX2VwaTE2KEIyLCBCMyk7CisKKyAgICAvLyBQYWNrIGFzIFJHQlJHQlJHQlJHQi4KKyAgICBQbGFuYXJUbzI0Yl9TU0U0MSgmcmdiMCwgJnJnYjEsICZyZ2IyLCAmcmdiMywgJnJnYjQsICZyZ2I1LCBkc3QpOworCisgICAgeSArPSAzMjsKKyAgICB1ICs9IDE2OworICAgIHYgKz0gMTY7CisgIH0KKyAgZm9yICg7IG4gPCBsZW47ICsrbikgeyAgIC8vIEZpbmlzaCBvZmYKKyAgICBWUDhZdXZUb1JnYih5WzBdLCB1WzBdLCB2WzBdLCBkc3QpOworICAgIGRzdCArPSAzOworICAgIHkgKz0gMTsKKyAgICB1ICs9IChuICYgMSk7CisgICAgdiArPSAobiAmIDEpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFl1dlRvQmdyUm93X1NTRTQxKGNvbnN0IHVpbnQ4X3QqIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgbGVuKSB7CisgIGludCBuOworICBmb3IgKG4gPSAwOyBuICsgMzIgPD0gbGVuOyBuICs9IDMyLCBkc3QgKz0gMzIgKiAzKSB7CisgICAgX19tMTI4aSBSMCwgUjEsIFIyLCBSMywgRzAsIEcxLCBHMiwgRzMsIEIwLCBCMSwgQjIsIEIzOworICAgIF9fbTEyOGkgYmdyMCwgYmdyMSwgYmdyMiwgYmdyMywgYmdyNCwgYmdyNTsKKworICAgIFlVVjQyMFRvUkdCX1NTRTQxKHkgKyAgMCwgdSArICAwLCB2ICsgIDAsICZSMCwgJkcwLCAmQjApOworICAgIFlVVjQyMFRvUkdCX1NTRTQxKHkgKyAgOCwgdSArICA0LCB2ICsgIDQsICZSMSwgJkcxLCAmQjEpOworICAgIFlVVjQyMFRvUkdCX1NTRTQxKHkgKyAxNiwgdSArICA4LCB2ICsgIDgsICZSMiwgJkcyLCAmQjIpOworICAgIFlVVjQyMFRvUkdCX1NTRTQxKHkgKyAyNCwgdSArIDEyLCB2ICsgMTIsICZSMywgJkczLCAmQjMpOworCisgICAgLy8gQ2FzdCB0byA4YiBhbmQgc3RvcmUgYXMgQkJCQkdHR0dSUlJSLgorICAgIGJncjAgPSBfbW1fcGFja3VzX2VwaTE2KEIwLCBCMSk7CisgICAgYmdyMSA9IF9tbV9wYWNrdXNfZXBpMTYoQjIsIEIzKTsKKyAgICBiZ3IyID0gX21tX3BhY2t1c19lcGkxNihHMCwgRzEpOworICAgIGJncjMgPSBfbW1fcGFja3VzX2VwaTE2KEcyLCBHMyk7CisgICAgYmdyNCA9IF9tbV9wYWNrdXNfZXBpMTYoUjAsIFIxKTsKKyAgICBiZ3I1ID0gX21tX3BhY2t1c19lcGkxNihSMiwgUjMpOworCisgICAgLy8gUGFjayBhcyBCR1JCR1JCR1JCR1IuCisgICAgUGxhbmFyVG8yNGJfU1NFNDEoJmJncjAsICZiZ3IxLCAmYmdyMiwgJmJncjMsICZiZ3I0LCAmYmdyNSwgZHN0KTsKKworICAgIHkgKz0gMzI7CisgICAgdSArPSAxNjsKKyAgICB2ICs9IDE2OworICB9CisgIGZvciAoOyBuIDwgbGVuOyArK24pIHsgICAvLyBGaW5pc2ggb2ZmCisgICAgVlA4WXV2VG9CZ3IoeVswXSwgdVswXSwgdlswXSwgZHN0KTsKKyAgICBkc3QgKz0gMzsKKyAgICB5ICs9IDE7CisgICAgdSArPSAobiAmIDEpOworICAgIHYgKz0gKG4gJiAxKTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgV2ViUEluaXRTYW1wbGVyc1NTRTQxKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgV2ViUEluaXRTYW1wbGVyc1NTRTQxKHZvaWQpIHsKKyAgV2ViUFNhbXBsZXJzW01PREVfUkdCXSAgPSBZdXZUb1JnYlJvd19TU0U0MTsKKyAgV2ViUFNhbXBsZXJzW01PREVfQkdSXSAgPSBZdXZUb0JnclJvd19TU0U0MTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJHQjI0LzMyIC0+IFlVViBjb252ZXJ0ZXJzCisKKy8vIExvYWQgZWlnaHQgMTZiLXdvcmRzIGZyb20gKnNyYy4KKyNkZWZpbmUgTE9BRF8xNihzcmMpIF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKHNyYykpCisvLyBTdG9yZSBlaXRoZXIgMTZiLXdvcmRzIGludG8gKmRzdAorI2RlZmluZSBTVE9SRV8xNihWLCBkc3QpIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKShkc3QpLCAoVikpCisKKyNkZWZpbmUgV0VCUF9TU0U0MV9TSFVGRihPVVQpICBkbyB7ICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIHRtcDAgPSBfbW1fc2h1ZmZsZV9lcGk4KEEwLCBzaHVmZjApOyBcCisgIGNvbnN0IF9fbTEyOGkgdG1wMSA9IF9tbV9zaHVmZmxlX2VwaTgoQTEsIHNodWZmMSk7IFwKKyAgY29uc3QgX19tMTI4aSB0bXAyID0gX21tX3NodWZmbGVfZXBpOChBMiwgc2h1ZmYyKTsgXAorICBjb25zdCBfX20xMjhpIHRtcDMgPSBfbW1fc2h1ZmZsZV9lcGk4KEEzLCBzaHVmZjApOyBcCisgIGNvbnN0IF9fbTEyOGkgdG1wNCA9IF9tbV9zaHVmZmxlX2VwaTgoQTQsIHNodWZmMSk7IFwKKyAgY29uc3QgX19tMTI4aSB0bXA1ID0gX21tX3NodWZmbGVfZXBpOChBNSwgc2h1ZmYyKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIC8qIE9SIGV2ZXJ5dGhpbmcgdG8gZ2V0IG9uZSBjaGFubmVsICovICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSB0bXA2ID0gX21tX29yX3NpMTI4KHRtcDAsIHRtcDEpOyAgICAgXAorICBjb25zdCBfX20xMjhpIHRtcDcgPSBfbW1fb3Jfc2kxMjgodG1wMywgdG1wNCk7ICAgICBcCisgIG91dFtPVVQgKyAwXSA9IF9tbV9vcl9zaTEyOCh0bXA2LCB0bXAyKTsgICAgICAgICAgIFwKKyAgb3V0W09VVCArIDFdID0gX21tX29yX3NpMTI4KHRtcDcsIHRtcDUpOyAgICAgICAgICAgXAorfSB3aGlsZSAoMCk7CisKKy8vIFVucGFjayB0aGUgOGIgaW5wdXQgcmdicmdicmdicmdiIC4uLiBhcyBjb250aWd1b3VzIHJlZ2lzdGVyczoKKy8vIHJycnIuLi4gcnJyci4uLiBnZ2dnLi4uIGdnZ2cuLi4gYmJiYi4uLiBiYmJiLi4uLgorLy8gU2ltaWxhciB0byBQbGFuYXJUbzI0YkhlbHBlcigpLCBidXQgaW4gcmV2ZXJzZSBvcmRlci4KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFJHQjI0UGFja2VkVG9QbGFuYXJfU1NFNDEoCisgICAgY29uc3QgdWludDhfdCogY29uc3QgcmdiLCBfX20xMjhpKiBjb25zdCBvdXQgLypvdXRbNl0qLykgeworICBjb25zdCBfX20xMjhpIEEwID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikocmdiICsgIDApKTsKKyAgY29uc3QgX19tMTI4aSBBMSA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKHJnYiArIDE2KSk7CisgIGNvbnN0IF9fbTEyOGkgQTIgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShyZ2IgKyAzMikpOworICBjb25zdCBfX20xMjhpIEEzID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikocmdiICsgNDgpKTsKKyAgY29uc3QgX19tMTI4aSBBNCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKHJnYiArIDY0KSk7CisgIGNvbnN0IF9fbTEyOGkgQTUgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShyZ2IgKyA4MCkpOworCisgIC8vIENvbXB1dGUgUlIuCisgIHsKKyAgICBjb25zdCBfX20xMjhpIHNodWZmMCA9IF9tbV9zZXRfZXBpOCgKKyAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDE1LCAxMiwgOSwgNiwgMywgMCk7CisgICAgY29uc3QgX19tMTI4aSBzaHVmZjEgPSBfbW1fc2V0X2VwaTgoCisgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgMTQsIDExLCA4LCA1LCAyLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKTsKKyAgICBjb25zdCBfX20xMjhpIHNodWZmMiA9IF9tbV9zZXRfZXBpOCgKKyAgICAgICAgMTMsIDEwLCA3LCA0LCAxLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpOworICAgIFdFQlBfU1NFNDFfU0hVRkYoMCkKKyAgfQorICAvLyBDb21wdXRlIEdHLgorICB7CisgICAgY29uc3QgX19tMTI4aSBzaHVmZjAgPSBfbW1fc2V0X2VwaTgoCisgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMTMsIDEwLCA3LCA0LCAxKTsKKyAgICBjb25zdCBfX20xMjhpIHNodWZmMSA9IF9tbV9zZXRfZXBpOCgKKyAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAxNSwgMTIsIDksIDYsIDMsIDAsIC0xLCAtMSwgLTEsIC0xLCAtMSk7CisgICAgY29uc3QgX19tMTI4aSBzaHVmZjIgPSBfbW1fc2V0X2VwaTgoCisgICAgICAgIDE0LCAxMSwgOCwgNSwgMiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKTsKKyAgICBXRUJQX1NTRTQxX1NIVUZGKDIpCisgIH0KKyAgLy8gQ29tcHV0ZSBCQi4KKyAgeworICAgIGNvbnN0IF9fbTEyOGkgc2h1ZmYwID0gX21tX3NldF9lcGk4KAorICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDE0LCAxMSwgOCwgNSwgMik7CisgICAgY29uc3QgX19tMTI4aSBzaHVmZjEgPSBfbW1fc2V0X2VwaTgoCisgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDEzLCAxMCwgNywgNCwgMSwgLTEsIC0xLCAtMSwgLTEsIC0xKTsKKyAgICBjb25zdCBfX20xMjhpIHNodWZmMiA9IF9tbV9zZXRfZXBpOCgKKyAgICAgICAgMTUsIDEyLCA5LCA2LCAzLCAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSk7CisgICAgV0VCUF9TU0U0MV9TSFVGRig0KQorICB9Cit9CisKKyN1bmRlZiBXRUJQX1NTRTQxX1NIVUZGCisKKy8vIENvbnZlcnQgOCBwYWNrZWQgQVJHQiB0byByW10sIGdbXSwgYltdCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBSR0IzMlBhY2tlZFRvUGxhbmFyX1NTRTQxKAorICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLCBfX20xMjhpKiBjb25zdCByZ2IgLyppbls2XSovKSB7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIF9fbTEyOGkgYTAgPSBMT0FEXzE2KGFyZ2IgKyAwKTsKKyAgX19tMTI4aSBhMSA9IExPQURfMTYoYXJnYiArIDQpOworICBfX20xMjhpIGEyID0gTE9BRF8xNihhcmdiICsgOCk7CisgIF9fbTEyOGkgYTMgPSBMT0FEXzE2KGFyZ2IgKyAxMik7CisgIFZQOEwzMmJUb1BsYW5hcl9TU0U0MSgmYTAsICZhMSwgJmEyLCAmYTMpOworICByZ2JbMF0gPSBfbW1fdW5wYWNrbG9fZXBpOChhMSwgemVybyk7CisgIHJnYlsxXSA9IF9tbV91bnBhY2toaV9lcGk4KGExLCB6ZXJvKTsKKyAgcmdiWzJdID0gX21tX3VucGFja2xvX2VwaTgoYTIsIHplcm8pOworICByZ2JbM10gPSBfbW1fdW5wYWNraGlfZXBpOChhMiwgemVybyk7CisgIHJnYls0XSA9IF9tbV91bnBhY2tsb19lcGk4KGEzLCB6ZXJvKTsKKyAgcmdiWzVdID0gX21tX3VucGFja2hpX2VwaTgoYTMsIHplcm8pOworfQorCisvLyBUaGlzIG1hY3JvIGNvbXB1dGVzIChSRyAqIE1VTFRfUkcgKyBHQiAqIE1VTFRfR0IgKyBST1VOREVSKSA+PiBERVNDQUxFX0ZJWAorLy8gSXQncyBhIG1hY3JvIGFuZCBub3QgYSBmdW5jdGlvbiBiZWNhdXNlIHdlIG5lZWQgdG8gdXNlIGltbWVkaWF0ZSB2YWx1ZXMgd2l0aAorLy8gc3JhaV9lcGkzMiwgZS5nLgorI2RlZmluZSBUUkFOU0ZPUk0oUkdfTE8sIFJHX0hJLCBHQl9MTywgR0JfSEksIE1VTFRfUkcsIE1VTFRfR0IsIFwKKyAgICAgICAgICAgICAgICAgIFJPVU5ERVIsIERFU0NBTEVfRklYLCBPVVQpIGRvIHsgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgVjBfbG8gPSBfbW1fbWFkZF9lcGkxNihSR19MTywgTVVMVF9SRyk7ICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIFYwX2hpID0gX21tX21hZGRfZXBpMTYoUkdfSEksIE1VTFRfUkcpOyAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBWMV9sbyA9IF9tbV9tYWRkX2VwaTE2KEdCX0xPLCBNVUxUX0dCKTsgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgVjFfaGkgPSBfbW1fbWFkZF9lcGkxNihHQl9ISSwgTVVMVF9HQik7ICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIFYyX2xvID0gX21tX2FkZF9lcGkzMihWMF9sbywgVjFfbG8pOyAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBWMl9oaSA9IF9tbV9hZGRfZXBpMzIoVjBfaGksIFYxX2hpKTsgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgVjNfbG8gPSBfbW1fYWRkX2VwaTMyKFYyX2xvLCBST1VOREVSKTsgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIFYzX2hpID0gX21tX2FkZF9lcGkzMihWMl9oaSwgUk9VTkRFUik7ICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBWNV9sbyA9IF9tbV9zcmFpX2VwaTMyKFYzX2xvLCBERVNDQUxFX0ZJWCk7ICAgICBcCisgIGNvbnN0IF9fbTEyOGkgVjVfaGkgPSBfbW1fc3JhaV9lcGkzMihWM19oaSwgREVTQ0FMRV9GSVgpOyAgICAgXAorICAoT1VUKSA9IF9tbV9wYWNrc19lcGkzMihWNV9sbywgVjVfaGkpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgTUtfQ1NUXzE2KEEsIEIpIF9tbV9zZXRfZXBpMTYoKEIpLCAoQSksIChCKSwgKEEpLCAoQiksIChBKSwgKEIpLCAoQSkpCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBDb252ZXJ0UkdCVG9ZX1NTRTQxKGNvbnN0IF9fbTEyOGkqIGNvbnN0IFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IEcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IFkpIHsKKyAgY29uc3QgX19tMTI4aSBrUkdfeSA9IE1LX0NTVF8xNigxNjgzOSwgMzMwNTkgLSAxNjM4NCk7CisgIGNvbnN0IF9fbTEyOGkga0dCX3kgPSBNS19DU1RfMTYoMTYzODQsIDY0MjApOworICBjb25zdCBfX20xMjhpIGtIQUxGX1kgPSBfbW1fc2V0MV9lcGkzMigoMTYgPDwgWVVWX0ZJWCkgKyBZVVZfSEFMRik7CisKKyAgY29uc3QgX19tMTI4aSBSR19sbyA9IF9tbV91bnBhY2tsb19lcGkxNigqUiwgKkcpOworICBjb25zdCBfX20xMjhpIFJHX2hpID0gX21tX3VucGFja2hpX2VwaTE2KCpSLCAqRyk7CisgIGNvbnN0IF9fbTEyOGkgR0JfbG8gPSBfbW1fdW5wYWNrbG9fZXBpMTYoKkcsICpCKTsKKyAgY29uc3QgX19tMTI4aSBHQl9oaSA9IF9tbV91bnBhY2toaV9lcGkxNigqRywgKkIpOworICBUUkFOU0ZPUk0oUkdfbG8sIFJHX2hpLCBHQl9sbywgR0JfaGksIGtSR195LCBrR0JfeSwga0hBTEZfWSwgWVVWX0ZJWCwgKlkpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBDb252ZXJ0UkdCVG9VVl9TU0U0MShjb25zdCBfX20xMjhpKiBjb25zdCBSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBVLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgVikgeworICBjb25zdCBfX20xMjhpIGtSR191ID0gTUtfQ1NUXzE2KC05NzE5LCAtMTkwODEpOworICBjb25zdCBfX20xMjhpIGtHQl91ID0gTUtfQ1NUXzE2KDAsIDI4ODAwKTsKKyAgY29uc3QgX19tMTI4aSBrUkdfdiA9IE1LX0NTVF8xNigyODgwMCwgMCk7CisgIGNvbnN0IF9fbTEyOGkga0dCX3YgPSBNS19DU1RfMTYoLTI0MTE2LCAtNDY4NCk7CisgIGNvbnN0IF9fbTEyOGkga0hBTEZfVVYgPSBfbW1fc2V0MV9lcGkzMigoKDEyOCA8PCBZVVZfRklYKSArIFlVVl9IQUxGKSA8PCAyKTsKKworICBjb25zdCBfX20xMjhpIFJHX2xvID0gX21tX3VucGFja2xvX2VwaTE2KCpSLCAqRyk7CisgIGNvbnN0IF9fbTEyOGkgUkdfaGkgPSBfbW1fdW5wYWNraGlfZXBpMTYoKlIsICpHKTsKKyAgY29uc3QgX19tMTI4aSBHQl9sbyA9IF9tbV91bnBhY2tsb19lcGkxNigqRywgKkIpOworICBjb25zdCBfX20xMjhpIEdCX2hpID0gX21tX3VucGFja2hpX2VwaTE2KCpHLCAqQik7CisgIFRSQU5TRk9STShSR19sbywgUkdfaGksIEdCX2xvLCBHQl9oaSwga1JHX3UsIGtHQl91LAorICAgICAgICAgICAga0hBTEZfVVYsIFlVVl9GSVggKyAyLCAqVSk7CisgIFRSQU5TRk9STShSR19sbywgUkdfaGksIEdCX2xvLCBHQl9oaSwga1JHX3YsIGtHQl92LAorICAgICAgICAgICAga0hBTEZfVVYsIFlVVl9GSVggKyAyLCAqVik7Cit9CisKKyN1bmRlZiBNS19DU1RfMTYKKyN1bmRlZiBUUkFOU0ZPUk0KKworc3RhdGljIHZvaWQgQ29udmVydFJHQjI0VG9ZX1NTRTQxKGNvbnN0IHVpbnQ4X3QqIHJnYiwgdWludDhfdCogeSwgaW50IHdpZHRoKSB7CisgIGNvbnN0IGludCBtYXhfd2lkdGggPSB3aWR0aCAmIH4zMTsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBtYXhfd2lkdGg7IHJnYiArPSAzICogMTYgKiAyKSB7CisgICAgX19tMTI4aSByZ2JfcGxhbmVbNl07CisgICAgaW50IGo7CisKKyAgICBSR0IyNFBhY2tlZFRvUGxhbmFyX1NTRTQxKHJnYiwgcmdiX3BsYW5lKTsKKworICAgIGZvciAoaiA9IDA7IGogPCAyOyArK2osIGkgKz0gMTYpIHsKKyAgICAgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgICAgICBfX20xMjhpIHIsIGcsIGIsIFkwLCBZMTsKKworICAgICAgLy8gQ29udmVydCB0byAxNi1iaXQgWS4KKyAgICAgIHIgPSBfbW1fdW5wYWNrbG9fZXBpOChyZ2JfcGxhbmVbMCArIGpdLCB6ZXJvKTsKKyAgICAgIGcgPSBfbW1fdW5wYWNrbG9fZXBpOChyZ2JfcGxhbmVbMiArIGpdLCB6ZXJvKTsKKyAgICAgIGIgPSBfbW1fdW5wYWNrbG9fZXBpOChyZ2JfcGxhbmVbNCArIGpdLCB6ZXJvKTsKKyAgICAgIENvbnZlcnRSR0JUb1lfU1NFNDEoJnIsICZnLCAmYiwgJlkwKTsKKworICAgICAgLy8gQ29udmVydCB0byAxNi1iaXQgWS4KKyAgICAgIHIgPSBfbW1fdW5wYWNraGlfZXBpOChyZ2JfcGxhbmVbMCArIGpdLCB6ZXJvKTsKKyAgICAgIGcgPSBfbW1fdW5wYWNraGlfZXBpOChyZ2JfcGxhbmVbMiArIGpdLCB6ZXJvKTsKKyAgICAgIGIgPSBfbW1fdW5wYWNraGlfZXBpOChyZ2JfcGxhbmVbNCArIGpdLCB6ZXJvKTsKKyAgICAgIENvbnZlcnRSR0JUb1lfU1NFNDEoJnIsICZnLCAmYiwgJlkxKTsKKworICAgICAgLy8gQ2FzdCB0byA4LWJpdCBhbmQgc3RvcmUuCisgICAgICBTVE9SRV8xNihfbW1fcGFja3VzX2VwaTE2KFkwLCBZMSksIHkgKyBpKTsKKyAgICB9CisgIH0KKyAgZm9yICg7IGkgPCB3aWR0aDsgKytpLCByZ2IgKz0gMykgeyAgIC8vIGxlZnQtb3ZlcgorICAgIHlbaV0gPSBWUDhSR0JUb1kocmdiWzBdLCByZ2JbMV0sIHJnYlsyXSwgWVVWX0hBTEYpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIENvbnZlcnRCR1IyNFRvWV9TU0U0MShjb25zdCB1aW50OF90KiBiZ3IsIHVpbnQ4X3QqIHksIGludCB3aWR0aCkgeworICBjb25zdCBpbnQgbWF4X3dpZHRoID0gd2lkdGggJiB+MzE7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgbWF4X3dpZHRoOyBiZ3IgKz0gMyAqIDE2ICogMikgeworICAgIF9fbTEyOGkgYmdyX3BsYW5lWzZdOworICAgIGludCBqOworCisgICAgUkdCMjRQYWNrZWRUb1BsYW5hcl9TU0U0MShiZ3IsIGJncl9wbGFuZSk7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgMjsgKytqLCBpICs9IDE2KSB7CisgICAgICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICAgICAgX19tMTI4aSByLCBnLCBiLCBZMCwgWTE7CisKKyAgICAgIC8vIENvbnZlcnQgdG8gMTYtYml0IFkuCisgICAgICBiID0gX21tX3VucGFja2xvX2VwaTgoYmdyX3BsYW5lWzAgKyBqXSwgemVybyk7CisgICAgICBnID0gX21tX3VucGFja2xvX2VwaTgoYmdyX3BsYW5lWzIgKyBqXSwgemVybyk7CisgICAgICByID0gX21tX3VucGFja2xvX2VwaTgoYmdyX3BsYW5lWzQgKyBqXSwgemVybyk7CisgICAgICBDb252ZXJ0UkdCVG9ZX1NTRTQxKCZyLCAmZywgJmIsICZZMCk7CisKKyAgICAgIC8vIENvbnZlcnQgdG8gMTYtYml0IFkuCisgICAgICBiID0gX21tX3VucGFja2hpX2VwaTgoYmdyX3BsYW5lWzAgKyBqXSwgemVybyk7CisgICAgICBnID0gX21tX3VucGFja2hpX2VwaTgoYmdyX3BsYW5lWzIgKyBqXSwgemVybyk7CisgICAgICByID0gX21tX3VucGFja2hpX2VwaTgoYmdyX3BsYW5lWzQgKyBqXSwgemVybyk7CisgICAgICBDb252ZXJ0UkdCVG9ZX1NTRTQxKCZyLCAmZywgJmIsICZZMSk7CisKKyAgICAgIC8vIENhc3QgdG8gOC1iaXQgYW5kIHN0b3JlLgorICAgICAgU1RPUkVfMTYoX21tX3BhY2t1c19lcGkxNihZMCwgWTEpLCB5ICsgaSk7CisgICAgfQorICB9CisgIGZvciAoOyBpIDwgd2lkdGg7ICsraSwgYmdyICs9IDMpIHsgIC8vIGxlZnQtb3ZlcgorICAgIHlbaV0gPSBWUDhSR0JUb1koYmdyWzJdLCBiZ3JbMV0sIGJnclswXSwgWVVWX0hBTEYpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIENvbnZlcnRBUkdCVG9ZX1NTRTQxKGNvbnN0IHVpbnQzMl90KiBhcmdiLCB1aW50OF90KiB5LCBpbnQgd2lkdGgpIHsKKyAgY29uc3QgaW50IG1heF93aWR0aCA9IHdpZHRoICYgfjE1OworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IG1heF93aWR0aDsgaSArPSAxNikgeworICAgIF9fbTEyOGkgWTAsIFkxLCByZ2JbNl07CisgICAgUkdCMzJQYWNrZWRUb1BsYW5hcl9TU0U0MSgmYXJnYltpXSwgcmdiKTsKKyAgICBDb252ZXJ0UkdCVG9ZX1NTRTQxKCZyZ2JbMF0sICZyZ2JbMl0sICZyZ2JbNF0sICZZMCk7CisgICAgQ29udmVydFJHQlRvWV9TU0U0MSgmcmdiWzFdLCAmcmdiWzNdLCAmcmdiWzVdLCAmWTEpOworICAgIFNUT1JFXzE2KF9tbV9wYWNrdXNfZXBpMTYoWTAsIFkxKSwgeSArIGkpOworICB9CisgIGZvciAoOyBpIDwgd2lkdGg7ICsraSkgeyAgIC8vIGxlZnQtb3ZlcgorICAgIGNvbnN0IHVpbnQzMl90IHAgPSBhcmdiW2ldOworICAgIHlbaV0gPSBWUDhSR0JUb1koKHAgPj4gMTYpICYgMHhmZiwgKHAgPj4gOCkgJiAweGZmLCAocCA+PiAgMCkgJiAweGZmLAorICAgICAgICAgICAgICAgICAgICAgWVVWX0hBTEYpOworICB9Cit9CisKKy8vIEhvcml6b250YWwgYWRkIChkb3VibGVkKSBvZiB0d28gMTZiIHZhbHVlcywgcmVzdWx0IGlzIDE2Yi4KKy8vIGluOiBBIHwgQiB8IEMgfCBEIHwgLi4uIC0+IG91dDogMiooQStCKSB8IDIqKEMrRCkgfCAuLi4KK3N0YXRpYyB2b2lkIEhvcml6b250YWxBZGRQYWNrX1NTRTQxKGNvbnN0IF9fbTEyOGkqIGNvbnN0IEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3Qgb3V0KSB7CisgIGNvbnN0IF9fbTEyOGkgazIgPSBfbW1fc2V0MV9lcGkxNigyKTsKKyAgY29uc3QgX19tMTI4aSBDID0gX21tX21hZGRfZXBpMTYoKkEsIGsyKTsKKyAgY29uc3QgX19tMTI4aSBEID0gX21tX21hZGRfZXBpMTYoKkIsIGsyKTsKKyAgKm91dCA9IF9tbV9wYWNrc19lcGkzMihDLCBEKTsKK30KKworc3RhdGljIHZvaWQgQ29udmVydEFSR0JUb1VWX1NTRTQxKGNvbnN0IHVpbnQzMl90KiBhcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY193aWR0aCwgaW50IGRvX3N0b3JlKSB7CisgIGNvbnN0IGludCBtYXhfd2lkdGggPSBzcmNfd2lkdGggJiB+MzE7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgbWF4X3dpZHRoOyBpICs9IDMyLCB1ICs9IDE2LCB2ICs9IDE2KSB7CisgICAgX19tMTI4aSByZ2JbNl0sIFUwLCBWMCwgVTEsIFYxOworICAgIFJHQjMyUGFja2VkVG9QbGFuYXJfU1NFNDEoJmFyZ2JbaV0sIHJnYik7CisgICAgSG9yaXpvbnRhbEFkZFBhY2tfU1NFNDEoJnJnYlswXSwgJnJnYlsxXSwgJnJnYlswXSk7CisgICAgSG9yaXpvbnRhbEFkZFBhY2tfU1NFNDEoJnJnYlsyXSwgJnJnYlszXSwgJnJnYlsyXSk7CisgICAgSG9yaXpvbnRhbEFkZFBhY2tfU1NFNDEoJnJnYls0XSwgJnJnYls1XSwgJnJnYls0XSk7CisgICAgQ29udmVydFJHQlRvVVZfU1NFNDEoJnJnYlswXSwgJnJnYlsyXSwgJnJnYls0XSwgJlUwLCAmVjApOworCisgICAgUkdCMzJQYWNrZWRUb1BsYW5hcl9TU0U0MSgmYXJnYltpICsgMTZdLCByZ2IpOworICAgIEhvcml6b250YWxBZGRQYWNrX1NTRTQxKCZyZ2JbMF0sICZyZ2JbMV0sICZyZ2JbMF0pOworICAgIEhvcml6b250YWxBZGRQYWNrX1NTRTQxKCZyZ2JbMl0sICZyZ2JbM10sICZyZ2JbMl0pOworICAgIEhvcml6b250YWxBZGRQYWNrX1NTRTQxKCZyZ2JbNF0sICZyZ2JbNV0sICZyZ2JbNF0pOworICAgIENvbnZlcnRSR0JUb1VWX1NTRTQxKCZyZ2JbMF0sICZyZ2JbMl0sICZyZ2JbNF0sICZVMSwgJlYxKTsKKworICAgIFUwID0gX21tX3BhY2t1c19lcGkxNihVMCwgVTEpOworICAgIFYwID0gX21tX3BhY2t1c19lcGkxNihWMCwgVjEpOworICAgIGlmICghZG9fc3RvcmUpIHsKKyAgICAgIGNvbnN0IF9fbTEyOGkgcHJldl91ID0gTE9BRF8xNih1KTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgcHJldl92ID0gTE9BRF8xNih2KTsKKyAgICAgIFUwID0gX21tX2F2Z19lcHU4KFUwLCBwcmV2X3UpOworICAgICAgVjAgPSBfbW1fYXZnX2VwdTgoVjAsIHByZXZfdik7CisgICAgfQorICAgIFNUT1JFXzE2KFUwLCB1KTsKKyAgICBTVE9SRV8xNihWMCwgdik7CisgIH0KKyAgaWYgKGkgPCBzcmNfd2lkdGgpIHsgIC8vIGxlZnQtb3ZlcgorICAgIFdlYlBDb252ZXJ0QVJHQlRvVVZfQyhhcmdiICsgaSwgdSwgdiwgc3JjX3dpZHRoIC0gaSwgZG9fc3RvcmUpOworICB9Cit9CisKKy8vIENvbnZlcnQgMTYgcGFja2VkIEFSR0IgMTZiLXZhbHVlcyB0byByW10sIGdbXSwgYltdCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBSR0JBMzJQYWNrZWRUb1BsYW5hcl8xNmJfU1NFNDEoCisgICAgY29uc3QgdWludDE2X3QqIGNvbnN0IHJnYngsCisgICAgX19tMTI4aSogY29uc3QgciwgX19tMTI4aSogY29uc3QgZywgX19tMTI4aSogY29uc3QgYikgeworICBjb25zdCBfX20xMjhpIGluMCA9IExPQURfMTYocmdieCArICAwKTsgIC8vIHIwIHwgZzAgfCBiMCB8eHwgcjEgfCBnMSB8IGIxIHx4CisgIGNvbnN0IF9fbTEyOGkgaW4xID0gTE9BRF8xNihyZ2J4ICsgIDgpOyAgLy8gcjIgfCBnMiB8IGIyIHx4fCByMyB8IGczIHwgYjMgfHgKKyAgY29uc3QgX19tMTI4aSBpbjIgPSBMT0FEXzE2KHJnYnggKyAxNik7ICAvLyByNCB8IC4uLgorICBjb25zdCBfX20xMjhpIGluMyA9IExPQURfMTYocmdieCArIDI0KTsgIC8vIHI2IHwgLi4uCisgIC8vIGFhcnJnZ2JiIGFzIDE2LWJpdC4KKyAgY29uc3QgX19tMTI4aSBzaHVmZjAgPQorICAgICAgX21tX3NldF9lcGk4KC0xLCAtMSwgLTEsIC0xLCAxMywgMTIsIDUsIDQsIDExLCAxMCwgMywgMiwgOSwgOCwgMSwgMCk7CisgIGNvbnN0IF9fbTEyOGkgc2h1ZmYxID0KKyAgICAgIF9tbV9zZXRfZXBpOCgxMywgMTIsIDUsIDQsIC0xLCAtMSwgLTEsIC0xLCAxMSwgMTAsIDMsIDIsIDksIDgsIDEsIDApOworICBjb25zdCBfX20xMjhpIEEwID0gX21tX3NodWZmbGVfZXBpOChpbjAsIHNodWZmMCk7CisgIGNvbnN0IF9fbTEyOGkgQTEgPSBfbW1fc2h1ZmZsZV9lcGk4KGluMSwgc2h1ZmYxKTsKKyAgY29uc3QgX19tMTI4aSBBMiA9IF9tbV9zaHVmZmxlX2VwaTgoaW4yLCBzaHVmZjApOworICBjb25zdCBfX20xMjhpIEEzID0gX21tX3NodWZmbGVfZXBpOChpbjMsIHNodWZmMSk7CisgIC8vIFIwUjFHMEcxCisgIC8vIEIwQjEqKioqCisgIC8vIFIyUjNHMkczCisgIC8vIEIyQjMqKioqCisgIC8vIChPUiBpcyB1c2VkIHRvIGZyZWUgcG9ydCA1IGZvciB0aGUgdW5wYWNrKQorICBjb25zdCBfX20xMjhpIEIwID0gX21tX3VucGFja2xvX2VwaTMyKEEwLCBBMSk7CisgIGNvbnN0IF9fbTEyOGkgQjEgPSBfbW1fb3Jfc2kxMjgoQTAsIEExKTsKKyAgY29uc3QgX19tMTI4aSBCMiA9IF9tbV91bnBhY2tsb19lcGkzMihBMiwgQTMpOworICBjb25zdCBfX20xMjhpIEIzID0gX21tX29yX3NpMTI4KEEyLCBBMyk7CisgIC8vIEdhdGhlciB0aGUgY2hhbm5lbHMuCisgICpyID0gX21tX3VucGFja2xvX2VwaTY0KEIwLCBCMik7CisgICpnID0gX21tX3VucGFja2hpX2VwaTY0KEIwLCBCMik7CisgICpiID0gX21tX3VucGFja2hpX2VwaTY0KEIxLCBCMyk7Cit9CisKK3N0YXRpYyB2b2lkIENvbnZlcnRSR0JBMzJUb1VWX1NTRTQxKGNvbnN0IHVpbnQxNl90KiByZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB1LCB1aW50OF90KiB2LCBpbnQgd2lkdGgpIHsKKyAgY29uc3QgaW50IG1heF93aWR0aCA9IHdpZHRoICYgfjE1OworICBjb25zdCB1aW50MTZfdCogY29uc3QgbGFzdF9yZ2IgPSByZ2IgKyA0ICogbWF4X3dpZHRoOworICB3aGlsZSAocmdiIDwgbGFzdF9yZ2IpIHsKKyAgICBfX20xMjhpIHIsIGcsIGIsIFUwLCBWMCwgVTEsIFYxOworICAgIFJHQkEzMlBhY2tlZFRvUGxhbmFyXzE2Yl9TU0U0MShyZ2IgKyAgMCwgJnIsICZnLCAmYik7CisgICAgQ29udmVydFJHQlRvVVZfU1NFNDEoJnIsICZnLCAmYiwgJlUwLCAmVjApOworICAgIFJHQkEzMlBhY2tlZFRvUGxhbmFyXzE2Yl9TU0U0MShyZ2IgKyAzMiwgJnIsICZnLCAmYik7CisgICAgQ29udmVydFJHQlRvVVZfU1NFNDEoJnIsICZnLCAmYiwgJlUxLCAmVjEpOworICAgIFNUT1JFXzE2KF9tbV9wYWNrdXNfZXBpMTYoVTAsIFUxKSwgdSk7CisgICAgU1RPUkVfMTYoX21tX3BhY2t1c19lcGkxNihWMCwgVjEpLCB2KTsKKyAgICB1ICs9IDE2OworICAgIHYgKz0gMTY7CisgICAgcmdiICs9IDIgKiAzMjsKKyAgfQorICBpZiAobWF4X3dpZHRoIDwgd2lkdGgpIHsgIC8vIGxlZnQtb3ZlcgorICAgIFdlYlBDb252ZXJ0UkdCQTMyVG9VVl9DKHJnYiwgdSwgdiwgd2lkdGggLSBtYXhfd2lkdGgpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2V4dGVybiB2b2lkIFdlYlBJbml0Q29udmVydEFSR0JUb1lVVlNTRTQxKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgV2ViUEluaXRDb252ZXJ0QVJHQlRvWVVWU1NFNDEodm9pZCkgeworICBXZWJQQ29udmVydEFSR0JUb1kgPSBDb252ZXJ0QVJHQlRvWV9TU0U0MTsKKyAgV2ViUENvbnZlcnRBUkdCVG9VViA9IENvbnZlcnRBUkdCVG9VVl9TU0U0MTsKKworICBXZWJQQ29udmVydFJHQjI0VG9ZID0gQ29udmVydFJHQjI0VG9ZX1NTRTQxOworICBXZWJQQ29udmVydEJHUjI0VG9ZID0gQ29udmVydEJHUjI0VG9ZX1NTRTQxOworCisgIFdlYlBDb252ZXJ0UkdCQTMyVG9VViA9IENvbnZlcnRSR0JBMzJUb1VWX1NTRTQxOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX1NTRTQxCisKK1dFQlBfRFNQX0lOSVRfU1RVQihXZWJQSW5pdFNhbXBsZXJzU1NFNDEpCitXRUJQX0RTUF9JTklUX1NUVUIoV2ViUEluaXRDb252ZXJ0QVJHQlRvWVVWU1NFNDEpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfU1NFNDEKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvTWFrZWZpbGUuYW0gYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZDUyMjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDIgQEAKK0FNX0NQUEZMQUdTICs9IC1JJCh0b3BfYnVpbGRkaXIpIC1JJCh0b3Bfc3JjZGlyKQorbm9pbnN0X0xUTElCUkFSSUVTID0gbGlid2VicGVuY29kZS5sYQorCitsaWJ3ZWJwZW5jb2RlX2xhX1NPVVJDRVMgPQorbGlid2VicGVuY29kZV9sYV9TT1VSQ0VTICs9IGFscGhhX2VuYy5jCitsaWJ3ZWJwZW5jb2RlX2xhX1NPVVJDRVMgKz0gYW5hbHlzaXNfZW5jLmMKK2xpYndlYnBlbmNvZGVfbGFfU09VUkNFUyArPSBiYWNrd2FyZF9yZWZlcmVuY2VzX2Nvc3RfZW5jLmMKK2xpYndlYnBlbmNvZGVfbGFfU09VUkNFUyArPSBiYWNrd2FyZF9yZWZlcmVuY2VzX2VuYy5jCitsaWJ3ZWJwZW5jb2RlX2xhX1NPVVJDRVMgKz0gYmFja3dhcmRfcmVmZXJlbmNlc19lbmMuaAorbGlid2VicGVuY29kZV9sYV9TT1VSQ0VTICs9IGNvbmZpZ19lbmMuYworbGlid2VicGVuY29kZV9sYV9TT1VSQ0VTICs9IGNvc3RfZW5jLmMKK2xpYndlYnBlbmNvZGVfbGFfU09VUkNFUyArPSBjb3N0X2VuYy5oCitsaWJ3ZWJwZW5jb2RlX2xhX1NPVVJDRVMgKz0gZmlsdGVyX2VuYy5jCitsaWJ3ZWJwZW5jb2RlX2xhX1NPVVJDRVMgKz0gZnJhbWVfZW5jLmMKK2xpYndlYnBlbmNvZGVfbGFfU09VUkNFUyArPSBoaXN0b2dyYW1fZW5jLmMKK2xpYndlYnBlbmNvZGVfbGFfU09VUkNFUyArPSBoaXN0b2dyYW1fZW5jLmgKK2xpYndlYnBlbmNvZGVfbGFfU09VUkNFUyArPSBpdGVyYXRvcl9lbmMuYworbGlid2VicGVuY29kZV9sYV9TT1VSQ0VTICs9IG5lYXJfbG9zc2xlc3NfZW5jLmMKK2xpYndlYnBlbmNvZGVfbGFfU09VUkNFUyArPSBwaWN0dXJlX2VuYy5jCitsaWJ3ZWJwZW5jb2RlX2xhX1NPVVJDRVMgKz0gcGljdHVyZV9jc3BfZW5jLmMKK2xpYndlYnBlbmNvZGVfbGFfU09VUkNFUyArPSBwaWN0dXJlX3BzbnJfZW5jLmMKK2xpYndlYnBlbmNvZGVfbGFfU09VUkNFUyArPSBwaWN0dXJlX3Jlc2NhbGVfZW5jLmMKK2xpYndlYnBlbmNvZGVfbGFfU09VUkNFUyArPSBwaWN0dXJlX3Rvb2xzX2VuYy5jCitsaWJ3ZWJwZW5jb2RlX2xhX1NPVVJDRVMgKz0gcHJlZGljdG9yX2VuYy5jCitsaWJ3ZWJwZW5jb2RlX2xhX1NPVVJDRVMgKz0gcXVhbnRfZW5jLmMKK2xpYndlYnBlbmNvZGVfbGFfU09VUkNFUyArPSBzeW50YXhfZW5jLmMKK2xpYndlYnBlbmNvZGVfbGFfU09VUkNFUyArPSB0b2tlbl9lbmMuYworbGlid2VicGVuY29kZV9sYV9TT1VSQ0VTICs9IHRyZWVfZW5jLmMKK2xpYndlYnBlbmNvZGVfbGFfU09VUkNFUyArPSB2cDhpX2VuYy5oCitsaWJ3ZWJwZW5jb2RlX2xhX1NPVVJDRVMgKz0gdnA4bF9lbmMuYworbGlid2VicGVuY29kZV9sYV9TT1VSQ0VTICs9IHZwOGxpX2VuYy5oCitsaWJ3ZWJwZW5jb2RlX2xhX1NPVVJDRVMgKz0gd2VicF9lbmMuYworCitsaWJ3ZWJwZW5jb2RlaW5jbHVkZV9IRUFERVJTID0KK2xpYndlYnBlbmNvZGVpbmNsdWRlX0hFQURFUlMgKz0gLi4vd2VicC9lbmNvZGUuaAorbGlid2VicGVuY29kZWluY2x1ZGVfSEVBREVSUyArPSAuLi93ZWJwL3R5cGVzLmgKK25vaW5zdF9IRUFERVJTID0KK25vaW5zdF9IRUFERVJTICs9IC4uL3dlYnAvZm9ybWF0X2NvbnN0YW50cy5oCisKK2xpYndlYnBlbmNvZGVfbGFfTERGTEFHUyA9IC1sbQorbGlid2VicGVuY29kZV9sYV9DUFBGTEFHUyA9ICQoQU1fQ1BQRkxBR1MpCitsaWJ3ZWJwZW5jb2RlaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvd2VicApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9hbHBoYV9lbmMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvYWxwaGFfZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNlOWNhOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvYWxwaGFfZW5jLmMKQEAgLTAsMCArMSw0NDMgQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBBbHBoYS1wbGFuZSBjb21wcmVzc2lvbi4KKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJzcmMvZW5jL3ZwOGlfZW5jLmgiCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvZmlsdGVyc191dGlscy5oIgorI2luY2x1ZGUgInNyYy91dGlscy9xdWFudF9sZXZlbHNfdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvd2VicC9mb3JtYXRfY29uc3RhbnRzLmgiCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbmNvZGVzIHRoZSBnaXZlbiBhbHBoYSBkYXRhIHZpYSBzcGVjaWZpZWQgY29tcHJlc3Npb24gbWV0aG9kICdtZXRob2QnLgorLy8gVGhlIHByZS1wcm9jZXNzaW5nIChxdWFudGl6YXRpb24pIGlzIHBlcmZvcm1lZCBpZiAncXVhbGl0eScgaXMgbGVzcyB0aGFuIDEwMC4KKy8vIEZvciBzdWNoIGNhc2VzLCB0aGUgZW5jb2RpbmcgaXMgbG9zc3kuIFRoZSB2YWxpZCByYW5nZSBpcyBbMCwgMTAwXSBmb3IKKy8vICdxdWFsaXR5JyBhbmQgWzAsIDFdIGZvciAnbWV0aG9kJzoKKy8vICAgJ21ldGhvZCA9IDAnIC0gTm8gY29tcHJlc3Npb247CisvLyAgICdtZXRob2QgPSAxJyAtIFVzZSBsb3NzbGVzcyBjb2RlciBvbiB0aGUgYWxwaGEgcGxhbmUgb25seQorLy8gJ2ZpbHRlcicgdmFsdWVzIFswLCA0XSBjb3JyZXNwb25kIHRvIHByZWRpY3Rpb24gbW9kZXMgbm9uZSwgaG9yaXpvbnRhbCwKKy8vIHZlcnRpY2FsICYgZ3JhZGllbnQgZmlsdGVycy4gVGhlIHByZWRpY3Rpb24gbW9kZSA0IHdpbGwgdHJ5IGFsbCB0aGUKKy8vIHByZWRpY3Rpb24gbW9kZXMgMCB0byAzIGFuZCBwaWNrIHRoZSBiZXN0IG9uZS4KKy8vICdlZmZvcnRfbGV2ZWwnOiBzcGVjaWZpZXMgaG93IG11Y2ggZWZmb3J0IG11c3QgYmUgc3BlbnQgdG8gdHJ5IGFuZCByZWR1Y2UKKy8vICB0aGUgY29tcHJlc3NlZCBvdXRwdXQgc2l6ZS4gSW4gcmFuZ2UgMCAocXVpY2spIHRvIDYgKHNsb3cpLgorLy8KKy8vICdvdXRwdXQnIGNvcnJlc3BvbmRzIHRvIHRoZSBidWZmZXIgY29udGFpbmluZyBjb21wcmVzc2VkIGFscGhhIGRhdGEuCisvLyAgICAgICAgICBUaGlzIGJ1ZmZlciBpcyBhbGxvY2F0ZWQgYnkgdGhpcyBtZXRob2QgYW5kIGNhbGxlciBzaG91bGQgY2FsbAorLy8gICAgICAgICAgV2ViUFNhZmVGcmVlKCpvdXRwdXQpIHdoZW4gZG9uZS4KKy8vICdvdXRwdXRfc2l6ZScgY29ycmVzcG9uZHMgdG8gc2l6ZSBvZiB0aGlzIGNvbXByZXNzZWQgYWxwaGEgYnVmZmVyLgorLy8KKy8vIFJldHVybnMgMSBvbiBzdWNjZXNzZnVsbHkgZW5jb2RpbmcgdGhlIGFscGhhIGFuZAorLy8gICAgICAgICAwIGlmIGVpdGhlcjoKKy8vICAgICAgICAgICBpbnZhbGlkIHF1YWxpdHkgb3IgbWV0aG9kLCBvcgorLy8gICAgICAgICAgIG1lbW9yeSBhbGxvY2F0aW9uIGZvciB0aGUgY29tcHJlc3NlZCBkYXRhIGZhaWxzLgorCisjaW5jbHVkZSAic3JjL2VuYy92cDhsaV9lbmMuaCIKKworc3RhdGljIGludCBFbmNvZGVMb3NzbGVzcyhjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlZmZvcnRfbGV2ZWwsICAvLyBpbiBbMC4uNl0gcmFuZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVzZV9xdWFsaXR5XzEwMCwgVlA4TEJpdFdyaXRlciogY29uc3QgYncsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBBdXhTdGF0cyogY29uc3Qgc3RhdHMpIHsKKyAgaW50IG9rID0gMDsKKyAgV2ViUENvbmZpZyBjb25maWc7CisgIFdlYlBQaWN0dXJlIHBpY3R1cmU7CisKKyAgV2ViUFBpY3R1cmVJbml0KCZwaWN0dXJlKTsKKyAgcGljdHVyZS53aWR0aCA9IHdpZHRoOworICBwaWN0dXJlLmhlaWdodCA9IGhlaWdodDsKKyAgcGljdHVyZS51c2VfYXJnYiA9IDE7CisgIHBpY3R1cmUuc3RhdHMgPSBzdGF0czsKKyAgaWYgKCFXZWJQUGljdHVyZUFsbG9jKCZwaWN0dXJlKSkgcmV0dXJuIDA7CisKKyAgLy8gVHJhbnNmZXIgdGhlIGFscGhhIHZhbHVlcyB0byB0aGUgZ3JlZW4gY2hhbm5lbC4KKyAgV2ViUERpc3BhdGNoQWxwaGFUb0dyZWVuKGRhdGEsIHdpZHRoLCBwaWN0dXJlLndpZHRoLCBwaWN0dXJlLmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUuYXJnYiwgcGljdHVyZS5hcmdiX3N0cmlkZSk7CisKKyAgV2ViUENvbmZpZ0luaXQoJmNvbmZpZyk7CisgIGNvbmZpZy5sb3NzbGVzcyA9IDE7CisgIC8vIEVuYWJsZSBleGFjdCwgb3IgaXQgd291bGQgYWx0ZXIgUkdCIHZhbHVlcyBvZiB0cmFuc3BhcmVudCBhbHBoYSwgd2hpY2ggaXMKKyAgLy8gbm9ybWFsbHkgT0sgYnV0IG5vdCBoZXJlIHNpbmNlIHdlIGFyZSBub3QgZW5jb2RpbmcgdGhlIGlucHV0IGltYWdlIGJ1dCAgYW4KKyAgLy8gaW50ZXJuYWwgZW5jb2RpbmctcmVsYXRlZCBpbWFnZSBjb250YWluaW5nIG5lY2Vzc2FyeSBleGFjdCBpbmZvcm1hdGlvbiBpbgorICAvLyBSR0IgY2hhbm5lbHMuCisgIGNvbmZpZy5leGFjdCA9IDE7CisgIGNvbmZpZy5tZXRob2QgPSBlZmZvcnRfbGV2ZWw7ICAvLyBpbXBhY3QgaXMgdmVyeSBzbWFsbAorICAvLyBTZXQgYSBsb3cgZGVmYXVsdCBxdWFsaXR5IGZvciBlbmNvZGluZyBhbHBoYS4gRW5zdXJlIHRoYXQgQWxwaGEgcXVhbGl0eSBhdAorICAvLyBsb3dlciBtZXRob2RzICgzIGFuZCBiZWxvdykgaXMgbGVzcyB0aGFuIHRoZSB0aHJlc2hvbGQgZm9yIHRyaWdnZXJpbmcKKyAgLy8gY29zdGx5ICdCYWNrd2FyZFJlZmVyZW5jZXNUcmFjZUJhY2t3YXJkcycuCisgIC8vIElmIHRoZSBhbHBoYSBxdWFsaXR5IGlzIHNldCB0byAxMDAgYW5kIHRoZSBtZXRob2QgdG8gNiwgYWxsb3cgZm9yIGEgaGlnaAorICAvLyBsb3NzbGVzcyBxdWFsaXR5IHRvIHRyaWdnZXIgdGhlIGNydW5jaGVyLgorICBjb25maWcucXVhbGl0eSA9CisgICAgICAodXNlX3F1YWxpdHlfMTAwICYmIGVmZm9ydF9sZXZlbCA9PSA2KSA/IDEwMCA6IDguZiAqIGVmZm9ydF9sZXZlbDsKKyAgYXNzZXJ0KGNvbmZpZy5xdWFsaXR5ID49IDAgJiYgY29uZmlnLnF1YWxpdHkgPD0gMTAwLmYpOworCisgIC8vIFRPRE8odXJ2YW5nKTogVGVtcG9yYXJ5IGZpeCB0byBhdm9pZCBnZW5lcmF0aW5nIGltYWdlcyB0aGF0IHRyaWdnZXIKKyAgLy8gYSBkZWNvZGVyIGJ1ZyByZWxhdGVkIHRvIGFscGhhIHdpdGggY29sb3IgY2FjaGUuCisgIC8vIFNlZTogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC93ZWJwL2lzc3Vlcy9kZXRhaWw/aWQ9MjM5CisgIC8vIE5lZWQgdG8gcmUtZW5hYmxlIHRoaXMgbGF0ZXIuCisgIG9rID0gKFZQOExFbmNvZGVTdHJlYW0oJmNvbmZpZywgJnBpY3R1cmUsIGJ3LCAwIC8qdXNlX2NhY2hlKi8pID09IFZQOF9FTkNfT0spOworICBXZWJQUGljdHVyZUZyZWUoJnBpY3R1cmUpOworICBvayA9IG9rICYmICFidy0+ZXJyb3JfOworICBpZiAoIW9rKSB7CisgICAgVlA4TEJpdFdyaXRlcldpcGVPdXQoYncpOworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiAxOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBTbWFsbCBzdHJ1Y3QgdG8gaG9sZCB0aGUgcmVzdWx0IG9mIGEgZmlsdGVyIG1vZGUgY29tcHJlc3Npb24gYXR0ZW1wdC4KK3R5cGVkZWYgc3RydWN0IHsKKyAgc2l6ZV90IHNjb3JlOworICBWUDhCaXRXcml0ZXIgYnc7CisgIFdlYlBBdXhTdGF0cyBzdGF0czsKK30gRmlsdGVyVHJpYWw7CisKKy8vIFRoaXMgZnVuY3Rpb24gYWx3YXlzIHJldHVybnMgYW4gaW5pdGlhbGl6ZWQgJ2J3JyBvYmplY3QsIGV2ZW4gdXBvbiBlcnJvci4KK3N0YXRpYyBpbnQgRW5jb2RlQWxwaGFJbnRlcm5hbChjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1ldGhvZCwgaW50IGZpbHRlciwgaW50IHJlZHVjZV9sZXZlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVmZm9ydF9sZXZlbCwgIC8vIGluIFswLi42XSByYW5nZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IHRtcF9hbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWx0ZXJUcmlhbCogcmVzdWx0KSB7CisgIGludCBvayA9IDA7CisgIGNvbnN0IHVpbnQ4X3QqIGFscGhhX3NyYzsKKyAgV2ViUEZpbHRlckZ1bmMgZmlsdGVyX2Z1bmM7CisgIHVpbnQ4X3QgaGVhZGVyOworICBjb25zdCBzaXplX3QgZGF0YV9zaXplID0gd2lkdGggKiBoZWlnaHQ7CisgIGNvbnN0IHVpbnQ4X3QqIG91dHB1dCA9IE5VTEw7CisgIHNpemVfdCBvdXRwdXRfc2l6ZSA9IDA7CisgIFZQOExCaXRXcml0ZXIgdG1wX2J3OworCisgIGFzc2VydCgodWludDY0X3QpZGF0YV9zaXplID09ICh1aW50NjRfdCl3aWR0aCAqIGhlaWdodCk7ICAvLyBhcyBwZXIgc3BlYworICBhc3NlcnQoZmlsdGVyID49IDAgJiYgZmlsdGVyIDwgV0VCUF9GSUxURVJfTEFTVCk7CisgIGFzc2VydChtZXRob2QgPj0gQUxQSEFfTk9fQ09NUFJFU1NJT04pOworICBhc3NlcnQobWV0aG9kIDw9IEFMUEhBX0xPU1NMRVNTX0NPTVBSRVNTSU9OKTsKKyAgYXNzZXJ0KHNpemVvZihoZWFkZXIpID09IEFMUEhBX0hFQURFUl9MRU4pOworCisgIGZpbHRlcl9mdW5jID0gV2ViUEZpbHRlcnNbZmlsdGVyXTsKKyAgaWYgKGZpbHRlcl9mdW5jICE9IE5VTEwpIHsKKyAgICBmaWx0ZXJfZnVuYyhkYXRhLCB3aWR0aCwgaGVpZ2h0LCB3aWR0aCwgdG1wX2FscGhhKTsKKyAgICBhbHBoYV9zcmMgPSB0bXBfYWxwaGE7CisgIH0gIGVsc2UgeworICAgIGFscGhhX3NyYyA9IGRhdGE7CisgIH0KKworICBpZiAobWV0aG9kICE9IEFMUEhBX05PX0NPTVBSRVNTSU9OKSB7CisgICAgb2sgPSBWUDhMQml0V3JpdGVySW5pdCgmdG1wX2J3LCBkYXRhX3NpemUgPj4gMyk7CisgICAgb2sgPSBvayAmJiBFbmNvZGVMb3NzbGVzcyhhbHBoYV9zcmMsIHdpZHRoLCBoZWlnaHQsIGVmZm9ydF9sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFyZWR1Y2VfbGV2ZWxzLCAmdG1wX2J3LCAmcmVzdWx0LT5zdGF0cyk7CisgICAgaWYgKG9rKSB7CisgICAgICBvdXRwdXQgPSBWUDhMQml0V3JpdGVyRmluaXNoKCZ0bXBfYncpOworICAgICAgb3V0cHV0X3NpemUgPSBWUDhMQml0V3JpdGVyTnVtQnl0ZXMoJnRtcF9idyk7CisgICAgICBpZiAob3V0cHV0X3NpemUgPiBkYXRhX3NpemUpIHsKKyAgICAgICAgLy8gY29tcHJlc3NlZCBzaXplIGlzIGxhcmdlciB0aGFuIHNvdXJjZSEgUmV2ZXJ0IHRvIHVuY29tcHJlc3NlZCBtb2RlLgorICAgICAgICBtZXRob2QgPSBBTFBIQV9OT19DT01QUkVTU0lPTjsKKyAgICAgICAgVlA4TEJpdFdyaXRlcldpcGVPdXQoJnRtcF9idyk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIFZQOExCaXRXcml0ZXJXaXBlT3V0KCZ0bXBfYncpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisKKyAgaWYgKG1ldGhvZCA9PSBBTFBIQV9OT19DT01QUkVTU0lPTikgeworICAgIG91dHB1dCA9IGFscGhhX3NyYzsKKyAgICBvdXRwdXRfc2l6ZSA9IGRhdGFfc2l6ZTsKKyAgICBvayA9IDE7CisgIH0KKworICAvLyBFbWl0IGZpbmFsIHJlc3VsdC4KKyAgaGVhZGVyID0gbWV0aG9kIHwgKGZpbHRlciA8PCAyKTsKKyAgaWYgKHJlZHVjZV9sZXZlbHMpIGhlYWRlciB8PSBBTFBIQV9QUkVQUk9DRVNTRURfTEVWRUxTIDw8IDQ7CisKKyAgVlA4Qml0V3JpdGVySW5pdCgmcmVzdWx0LT5idywgQUxQSEFfSEVBREVSX0xFTiArIG91dHB1dF9zaXplKTsKKyAgb2sgPSBvayAmJiBWUDhCaXRXcml0ZXJBcHBlbmQoJnJlc3VsdC0+YncsICZoZWFkZXIsIEFMUEhBX0hFQURFUl9MRU4pOworICBvayA9IG9rICYmIFZQOEJpdFdyaXRlckFwcGVuZCgmcmVzdWx0LT5idywgb3V0cHV0LCBvdXRwdXRfc2l6ZSk7CisKKyAgaWYgKG1ldGhvZCAhPSBBTFBIQV9OT19DT01QUkVTU0lPTikgeworICAgIFZQOExCaXRXcml0ZXJXaXBlT3V0KCZ0bXBfYncpOworICB9CisgIG9rID0gb2sgJiYgIXJlc3VsdC0+YncuZXJyb3JfOworICByZXN1bHQtPnNjb3JlID0gVlA4Qml0V3JpdGVyU2l6ZSgmcmVzdWx0LT5idyk7CisgIHJldHVybiBvazsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGludCBHZXROdW1Db2xvcnMoY29uc3QgdWludDhfdCogZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSkgeworICBpbnQgajsKKyAgaW50IGNvbG9ycyA9IDA7CisgIHVpbnQ4X3QgY29sb3JbMjU2XSA9IHsgMCB9OworCisgIGZvciAoaiA9IDA7IGogPCBoZWlnaHQ7ICsraikgeworICAgIGludCBpOworICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHAgPSBkYXRhICsgaiAqIHN0cmlkZTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7ICsraSkgeworICAgICAgY29sb3JbcFtpXV0gPSAxOworICAgIH0KKyAgfQorICBmb3IgKGogPSAwOyBqIDwgMjU2OyArK2opIHsKKyAgICBpZiAoY29sb3Jbal0gPiAwKSArK2NvbG9yczsKKyAgfQorICByZXR1cm4gY29sb3JzOworfQorCisjZGVmaW5lIEZJTFRFUl9UUllfTk9ORSAoMSA8PCBXRUJQX0ZJTFRFUl9OT05FKQorI2RlZmluZSBGSUxURVJfVFJZX0FMTCAoKDEgPDwgV0VCUF9GSUxURVJfTEFTVCkgLSAxKQorCisvLyBHaXZlbiB0aGUgaW5wdXQgJ2ZpbHRlcicgb3B0aW9uLCByZXR1cm4gYW4gT1InZCBiaXQtc2V0IG9mIGZpbHRlcnMgdG8gdHJ5Lgorc3RhdGljIHVpbnQzMl90IEdldEZpbHRlck1hcChjb25zdCB1aW50OF90KiBhbHBoYSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsdGVyLCBpbnQgZWZmb3J0X2xldmVsKSB7CisgIHVpbnQzMl90IGJpdF9tYXAgPSAwVTsKKyAgaWYgKGZpbHRlciA9PSBXRUJQX0ZJTFRFUl9GQVNUKSB7CisgICAgLy8gUXVpY2sgZXN0aW1hdGUgb2YgdGhlIGJlc3QgY2FuZGlkYXRlLgorICAgIGludCB0cnlfZmlsdGVyX25vbmUgPSAoZWZmb3J0X2xldmVsID4gMyk7CisgICAgY29uc3QgaW50IGtNaW5Db2xvcnNGb3JGaWx0ZXJOb25lID0gMTY7CisgICAgY29uc3QgaW50IGtNYXhDb2xvcnNGb3JGaWx0ZXJOb25lID0gMTkyOworICAgIGNvbnN0IGludCBudW1fY29sb3JzID0gR2V0TnVtQ29sb3JzKGFscGhhLCB3aWR0aCwgaGVpZ2h0LCB3aWR0aCk7CisgICAgLy8gRm9yIGxvdyBudW1iZXIgb2YgY29sb3JzLCBOT05FIHlpZWxkcyBiZXR0ZXIgY29tcHJlc3Npb24uCisgICAgZmlsdGVyID0gKG51bV9jb2xvcnMgPD0ga01pbkNvbG9yc0ZvckZpbHRlck5vbmUpCisgICAgICAgID8gV0VCUF9GSUxURVJfTk9ORQorICAgICAgICA6IFdlYlBFc3RpbWF0ZUJlc3RGaWx0ZXIoYWxwaGEsIHdpZHRoLCBoZWlnaHQsIHdpZHRoKTsKKyAgICBiaXRfbWFwIHw9IDEgPDwgZmlsdGVyOworICAgIC8vIEZvciBsYXJnZSBudW1iZXIgb2YgY29sb3JzLCB0cnkgRklMVEVSX05PTkUgaW4gYWRkaXRpb24gdG8gdGhlIGJlc3QKKyAgICAvLyBmaWx0ZXIgYXMgd2VsbC4KKyAgICBpZiAodHJ5X2ZpbHRlcl9ub25lIHx8IG51bV9jb2xvcnMgPiBrTWF4Q29sb3JzRm9yRmlsdGVyTm9uZSkgeworICAgICAgYml0X21hcCB8PSBGSUxURVJfVFJZX05PTkU7CisgICAgfQorICB9IGVsc2UgaWYgKGZpbHRlciA9PSBXRUJQX0ZJTFRFUl9OT05FKSB7CisgICAgYml0X21hcCA9IEZJTFRFUl9UUllfTk9ORTsKKyAgfSBlbHNlIHsgIC8vIFdFQlBfRklMVEVSX0JFU1QgLT4gdHJ5IGFsbAorICAgIGJpdF9tYXAgPSBGSUxURVJfVFJZX0FMTDsKKyAgfQorICByZXR1cm4gYml0X21hcDsKK30KKworc3RhdGljIHZvaWQgSW5pdEZpbHRlclRyaWFsKEZpbHRlclRyaWFsKiBjb25zdCBzY29yZSkgeworICBzY29yZS0+c2NvcmUgPSAoc2l6ZV90KX4wVTsKKyAgVlA4Qml0V3JpdGVySW5pdCgmc2NvcmUtPmJ3LCAwKTsKK30KKworc3RhdGljIGludCBBcHBseUZpbHRlcnNBbmRFbmNvZGUoY29uc3QgdWludDhfdCogYWxwaGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkYXRhX3NpemUsIGludCBtZXRob2QsIGludCBmaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVkdWNlX2xldmVscywgaW50IGVmZm9ydF9sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBjb25zdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIGNvbnN0IG91dHB1dF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUEF1eFN0YXRzKiBjb25zdCBzdGF0cykgeworICBpbnQgb2sgPSAxOworICBGaWx0ZXJUcmlhbCBiZXN0OworICB1aW50MzJfdCB0cnlfbWFwID0KKyAgICAgIEdldEZpbHRlck1hcChhbHBoYSwgd2lkdGgsIGhlaWdodCwgZmlsdGVyLCBlZmZvcnRfbGV2ZWwpOworICBJbml0RmlsdGVyVHJpYWwoJmJlc3QpOworCisgIGlmICh0cnlfbWFwICE9IEZJTFRFUl9UUllfTk9ORSkgeworICAgIHVpbnQ4X3QqIGZpbHRlcmVkX2FscGhhID0gICh1aW50OF90KilXZWJQU2FmZU1hbGxvYygxVUxMLCBkYXRhX3NpemUpOworICAgIGlmIChmaWx0ZXJlZF9hbHBoYSA9PSBOVUxMKSByZXR1cm4gMDsKKworICAgIGZvciAoZmlsdGVyID0gV0VCUF9GSUxURVJfTk9ORTsgb2sgJiYgdHJ5X21hcDsgKytmaWx0ZXIsIHRyeV9tYXAgPj49IDEpIHsKKyAgICAgIGlmICh0cnlfbWFwICYgMSkgeworICAgICAgICBGaWx0ZXJUcmlhbCB0cmlhbDsKKyAgICAgICAgb2sgPSBFbmNvZGVBbHBoYUludGVybmFsKGFscGhhLCB3aWR0aCwgaGVpZ2h0LCBtZXRob2QsIGZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZHVjZV9sZXZlbHMsIGVmZm9ydF9sZXZlbCwgZmlsdGVyZWRfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJpYWwpOworICAgICAgICBpZiAob2sgJiYgdHJpYWwuc2NvcmUgPCBiZXN0LnNjb3JlKSB7CisgICAgICAgICAgVlA4Qml0V3JpdGVyV2lwZU91dCgmYmVzdC5idyk7CisgICAgICAgICAgYmVzdCA9IHRyaWFsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFZQOEJpdFdyaXRlcldpcGVPdXQoJnRyaWFsLmJ3KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBXZWJQU2FmZUZyZWUoZmlsdGVyZWRfYWxwaGEpOworICB9IGVsc2UgeworICAgIG9rID0gRW5jb2RlQWxwaGFJbnRlcm5hbChhbHBoYSwgd2lkdGgsIGhlaWdodCwgbWV0aG9kLCBXRUJQX0ZJTFRFUl9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWR1Y2VfbGV2ZWxzLCBlZmZvcnRfbGV2ZWwsIE5VTEwsICZiZXN0KTsKKyAgfQorICBpZiAob2spIHsKKyNpZiAhZGVmaW5lZChXRUJQX0RJU0FCTEVfU1RBVFMpCisgICAgaWYgKHN0YXRzICE9IE5VTEwpIHsKKyAgICAgIHN0YXRzLT5sb3NzbGVzc19mZWF0dXJlcyA9IGJlc3Quc3RhdHMubG9zc2xlc3NfZmVhdHVyZXM7CisgICAgICBzdGF0cy0+aGlzdG9ncmFtX2JpdHMgPSBiZXN0LnN0YXRzLmhpc3RvZ3JhbV9iaXRzOworICAgICAgc3RhdHMtPnRyYW5zZm9ybV9iaXRzID0gYmVzdC5zdGF0cy50cmFuc2Zvcm1fYml0czsKKyAgICAgIHN0YXRzLT5jYWNoZV9iaXRzID0gYmVzdC5zdGF0cy5jYWNoZV9iaXRzOworICAgICAgc3RhdHMtPnBhbGV0dGVfc2l6ZSA9IGJlc3Quc3RhdHMucGFsZXR0ZV9zaXplOworICAgICAgc3RhdHMtPmxvc3NsZXNzX3NpemUgPSBiZXN0LnN0YXRzLmxvc3NsZXNzX3NpemU7CisgICAgICBzdGF0cy0+bG9zc2xlc3NfaGRyX3NpemUgPSBiZXN0LnN0YXRzLmxvc3NsZXNzX2hkcl9zaXplOworICAgICAgc3RhdHMtPmxvc3NsZXNzX2RhdGFfc2l6ZSA9IGJlc3Quc3RhdHMubG9zc2xlc3NfZGF0YV9zaXplOworICAgIH0KKyNlbHNlCisgICAgKHZvaWQpc3RhdHM7CisjZW5kaWYKKyAgICAqb3V0cHV0X3NpemUgPSBWUDhCaXRXcml0ZXJTaXplKCZiZXN0LmJ3KTsKKyAgICAqb3V0cHV0ID0gVlA4Qml0V3JpdGVyQnVmKCZiZXN0LmJ3KTsKKyAgfSBlbHNlIHsKKyAgICBWUDhCaXRXcml0ZXJXaXBlT3V0KCZiZXN0LmJ3KTsKKyAgfQorICByZXR1cm4gb2s7Cit9CisKK3N0YXRpYyBpbnQgRW5jb2RlQWxwaGEoVlA4RW5jb2RlciogY29uc3QgZW5jLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgcXVhbGl0eSwgaW50IG1ldGhvZCwgaW50IGZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGVmZm9ydF9sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIGNvbnN0IG91dHB1dCwgc2l6ZV90KiBjb25zdCBvdXRwdXRfc2l6ZSkgeworICBjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljID0gZW5jLT5waWNfOworICBjb25zdCBpbnQgd2lkdGggPSBwaWMtPndpZHRoOworICBjb25zdCBpbnQgaGVpZ2h0ID0gcGljLT5oZWlnaHQ7CisKKyAgdWludDhfdCogcXVhbnRfYWxwaGEgPSBOVUxMOworICBjb25zdCBzaXplX3QgZGF0YV9zaXplID0gd2lkdGggKiBoZWlnaHQ7CisgIHVpbnQ2NF90IHNzZSA9IDA7CisgIGludCBvayA9IDE7CisgIGNvbnN0IGludCByZWR1Y2VfbGV2ZWxzID0gKHF1YWxpdHkgPCAxMDApOworCisgIC8vIHF1aWNrIHNhbml0eSBjaGVja3MKKyAgYXNzZXJ0KCh1aW50NjRfdClkYXRhX3NpemUgPT0gKHVpbnQ2NF90KXdpZHRoICogaGVpZ2h0KTsgIC8vIGFzIHBlciBzcGVjCisgIGFzc2VydChlbmMgIT0gTlVMTCAmJiBwaWMgIT0gTlVMTCAmJiBwaWMtPmEgIT0gTlVMTCk7CisgIGFzc2VydChvdXRwdXQgIT0gTlVMTCAmJiBvdXRwdXRfc2l6ZSAhPSBOVUxMKTsKKyAgYXNzZXJ0KHdpZHRoID4gMCAmJiBoZWlnaHQgPiAwKTsKKyAgYXNzZXJ0KHBpYy0+YV9zdHJpZGUgPj0gd2lkdGgpOworICBhc3NlcnQoZmlsdGVyID49IFdFQlBfRklMVEVSX05PTkUgJiYgZmlsdGVyIDw9IFdFQlBfRklMVEVSX0ZBU1QpOworCisgIGlmIChxdWFsaXR5IDwgMCB8fCBxdWFsaXR5ID4gMTAwKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAobWV0aG9kIDwgQUxQSEFfTk9fQ09NUFJFU1NJT04gfHwgbWV0aG9kID4gQUxQSEFfTE9TU0xFU1NfQ09NUFJFU1NJT04pIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChtZXRob2QgPT0gQUxQSEFfTk9fQ09NUFJFU1NJT04pIHsKKyAgICAvLyBEb24ndCBmaWx0ZXIsIGFzIGZpbHRlcmluZyB3aWxsIG1ha2Ugbm8gaW1wYWN0IG9uIGNvbXByZXNzZWQgc2l6ZS4KKyAgICBmaWx0ZXIgPSBXRUJQX0ZJTFRFUl9OT05FOworICB9CisKKyAgcXVhbnRfYWxwaGEgPSAodWludDhfdCopV2ViUFNhZmVNYWxsb2MoMVVMTCwgZGF0YV9zaXplKTsKKyAgaWYgKHF1YW50X2FscGhhID09IE5VTEwpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vIEV4dHJhY3QgYWxwaGEgZGF0YSAod2lkdGggeCBoZWlnaHQpIGZyb20gcmF3X2RhdGEgKHN0cmlkZSB4IGhlaWdodCkuCisgIFdlYlBDb3B5UGxhbmUocGljLT5hLCBwaWMtPmFfc3RyaWRlLCBxdWFudF9hbHBoYSwgd2lkdGgsIHdpZHRoLCBoZWlnaHQpOworCisgIGlmIChyZWR1Y2VfbGV2ZWxzKSB7ICAvLyBObyBRdWFudGl6YXRpb24gcmVxdWlyZWQgZm9yICdxdWFsaXR5ID0gMTAwJy4KKyAgICAvLyAxNiBhbHBoYSBsZXZlbHMgZ2l2ZXMgcXVpdGUgYSBsb3cgTVNFIHcuci50IG9yaWdpbmFsIGFscGhhIHBsYW5lIGhlbmNlCisgICAgLy8gbWFwcGVkIHRvIG1vZGVyYXRlIHF1YWxpdHkgNzAuIEhlbmNlIFF1YWxpdHk6WzAsIDcwXSAtPiBMZXZlbHM6WzIsIDE2XQorICAgIC8vIGFuZCBRdWFsaXR5Ol03MCwgMTAwXSAtPiBMZXZlbHM6XTE2LCAyNTZdLgorICAgIGNvbnN0IGludCBhbHBoYV9sZXZlbHMgPSAocXVhbGl0eSA8PSA3MCkgPyAoMiArIHF1YWxpdHkgLyA1KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoMTYgKyAocXVhbGl0eSAtIDcwKSAqIDgpOworICAgIG9rID0gUXVhbnRpemVMZXZlbHMocXVhbnRfYWxwaGEsIHdpZHRoLCBoZWlnaHQsIGFscGhhX2xldmVscywgJnNzZSk7CisgIH0KKworICBpZiAob2spIHsKKyAgICBWUDhGaWx0ZXJzSW5pdCgpOworICAgIG9rID0gQXBwbHlGaWx0ZXJzQW5kRW5jb2RlKHF1YW50X2FscGhhLCB3aWR0aCwgaGVpZ2h0LCBkYXRhX3NpemUsIG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIsIHJlZHVjZV9sZXZlbHMsIGVmZm9ydF9sZXZlbCwgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9zaXplLCBwaWMtPnN0YXRzKTsKKyNpZiAhZGVmaW5lZChXRUJQX0RJU0FCTEVfU1RBVFMpCisgICAgaWYgKHBpYy0+c3RhdHMgIT0gTlVMTCkgeyAgLy8gbmVlZCBzdGF0cz8KKyAgICAgIHBpYy0+c3RhdHMtPmNvZGVkX3NpemUgKz0gKGludCkoKm91dHB1dF9zaXplKTsKKyAgICAgIGVuYy0+c3NlX1szXSA9IHNzZTsKKyAgICB9CisjZW5kaWYKKyAgfQorCisgIFdlYlBTYWZlRnJlZShxdWFudF9hbHBoYSk7CisgIHJldHVybiBvazsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1haW4gY2FsbHMKKworc3RhdGljIGludCBDb21wcmVzc0FscGhhSm9iKHZvaWQqIGFyZzEsIHZvaWQqIGR1bW15KSB7CisgIFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IChWUDhFbmNvZGVyKilhcmcxOworICBjb25zdCBXZWJQQ29uZmlnKiBjb25maWcgPSBlbmMtPmNvbmZpZ187CisgIHVpbnQ4X3QqIGFscGhhX2RhdGEgPSBOVUxMOworICBzaXplX3QgYWxwaGFfc2l6ZSA9IDA7CisgIGNvbnN0IGludCBlZmZvcnRfbGV2ZWwgPSBjb25maWctPm1ldGhvZDsgIC8vIG1hcHMgdG8gWzAuLjZdCisgIGNvbnN0IFdFQlBfRklMVEVSX1RZUEUgZmlsdGVyID0KKyAgICAgIChjb25maWctPmFscGhhX2ZpbHRlcmluZyA9PSAwKSA/IFdFQlBfRklMVEVSX05PTkUgOgorICAgICAgKGNvbmZpZy0+YWxwaGFfZmlsdGVyaW5nID09IDEpID8gV0VCUF9GSUxURVJfRkFTVCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXRUJQX0ZJTFRFUl9CRVNUOworICBpZiAoIUVuY29kZUFscGhhKGVuYywgY29uZmlnLT5hbHBoYV9xdWFsaXR5LCBjb25maWctPmFscGhhX2NvbXByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgIGZpbHRlciwgZWZmb3J0X2xldmVsLCAmYWxwaGFfZGF0YSwgJmFscGhhX3NpemUpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGFscGhhX3NpemUgIT0gKHVpbnQzMl90KWFscGhhX3NpemUpIHsgIC8vIFNhbml0eSBjaGVjay4KKyAgICBXZWJQU2FmZUZyZWUoYWxwaGFfZGF0YSk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgZW5jLT5hbHBoYV9kYXRhX3NpemVfID0gKHVpbnQzMl90KWFscGhhX3NpemU7CisgIGVuYy0+YWxwaGFfZGF0YV8gPSBhbHBoYV9kYXRhOworICAodm9pZClkdW1teTsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgVlA4RW5jSW5pdEFscGhhKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgeworICBXZWJQSW5pdEFscGhhUHJvY2Vzc2luZygpOworICBlbmMtPmhhc19hbHBoYV8gPSBXZWJQUGljdHVyZUhhc1RyYW5zcGFyZW5jeShlbmMtPnBpY18pOworICBlbmMtPmFscGhhX2RhdGFfID0gTlVMTDsKKyAgZW5jLT5hbHBoYV9kYXRhX3NpemVfID0gMDsKKyAgaWYgKGVuYy0+dGhyZWFkX2xldmVsXyA+IDApIHsKKyAgICBXZWJQV29ya2VyKiBjb25zdCB3b3JrZXIgPSAmZW5jLT5hbHBoYV93b3JrZXJfOworICAgIFdlYlBHZXRXb3JrZXJJbnRlcmZhY2UoKS0+SW5pdCh3b3JrZXIpOworICAgIHdvcmtlci0+ZGF0YTEgPSBlbmM7CisgICAgd29ya2VyLT5kYXRhMiA9IE5VTEw7CisgICAgd29ya2VyLT5ob29rID0gQ29tcHJlc3NBbHBoYUpvYjsKKyAgfQorfQorCitpbnQgVlA4RW5jU3RhcnRBbHBoYShWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgaWYgKGVuYy0+aGFzX2FscGhhXykgeworICAgIGlmIChlbmMtPnRocmVhZF9sZXZlbF8gPiAwKSB7CisgICAgICBXZWJQV29ya2VyKiBjb25zdCB3b3JrZXIgPSAmZW5jLT5hbHBoYV93b3JrZXJfOworICAgICAgLy8gTWFrZXMgc3VyZSB3b3JrZXIgaXMgZ29vZCB0byBnby4KKyAgICAgIGlmICghV2ViUEdldFdvcmtlckludGVyZmFjZSgpLT5SZXNldCh3b3JrZXIpKSB7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgV2ViUEdldFdvcmtlckludGVyZmFjZSgpLT5MYXVuY2god29ya2VyKTsKKyAgICAgIHJldHVybiAxOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gQ29tcHJlc3NBbHBoYUpvYihlbmMsIE5VTEwpOyAgIC8vIGp1c3QgZG8gdGhlIGpvYiByaWdodCBhd2F5CisgICAgfQorICB9CisgIHJldHVybiAxOworfQorCitpbnQgVlA4RW5jRmluaXNoQWxwaGEoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7CisgIGlmIChlbmMtPmhhc19hbHBoYV8pIHsKKyAgICBpZiAoZW5jLT50aHJlYWRfbGV2ZWxfID4gMCkgeworICAgICAgV2ViUFdvcmtlciogY29uc3Qgd29ya2VyID0gJmVuYy0+YWxwaGFfd29ya2VyXzsKKyAgICAgIGlmICghV2ViUEdldFdvcmtlckludGVyZmFjZSgpLT5TeW5jKHdvcmtlcikpIHJldHVybiAwOyAgLy8gZXJyb3IKKyAgICB9CisgIH0KKyAgcmV0dXJuIFdlYlBSZXBvcnRQcm9ncmVzcyhlbmMtPnBpY18sIGVuYy0+cGVyY2VudF8gKyAyMCwgJmVuYy0+cGVyY2VudF8pOworfQorCitpbnQgVlA4RW5jRGVsZXRlQWxwaGEoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7CisgIGludCBvayA9IDE7CisgIGlmIChlbmMtPnRocmVhZF9sZXZlbF8gPiAwKSB7CisgICAgV2ViUFdvcmtlciogY29uc3Qgd29ya2VyID0gJmVuYy0+YWxwaGFfd29ya2VyXzsKKyAgICAvLyBmaW5pc2ggYW55dGhpbmcgbGVmdCBpbiBmbGlnaHQKKyAgICBvayA9IFdlYlBHZXRXb3JrZXJJbnRlcmZhY2UoKS0+U3luYyh3b3JrZXIpOworICAgIC8vIHN0aWxsIG5lZWQgdG8gZW5kIHRoZSB3b3JrZXIsIGV2ZW4gaWYgIW9rCisgICAgV2ViUEdldFdvcmtlckludGVyZmFjZSgpLT5FbmQod29ya2VyKTsKKyAgfQorICBXZWJQU2FmZUZyZWUoZW5jLT5hbHBoYV9kYXRhXyk7CisgIGVuYy0+YWxwaGFfZGF0YV8gPSBOVUxMOworICBlbmMtPmFscGhhX2RhdGFfc2l6ZV8gPSAwOworICBlbmMtPmhhc19hbHBoYV8gPSAwOworICByZXR1cm4gb2s7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL2FuYWx5c2lzX2VuYy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9hbmFseXNpc19lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDdmZjdkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9hbmFseXNpc19lbmMuYwpAQCAtMCwwICsxLDUzNSBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIE1hY3JvYmxvY2sgYW5hbHlzaXMKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlICJzcmMvZW5jL3ZwOGlfZW5jLmgiCisjaW5jbHVkZSAic3JjL2VuYy9jb3N0X2VuYy5oIgorI2luY2x1ZGUgInNyYy91dGlscy91dGlscy5oIgorCisjZGVmaW5lIE1BWF9JVEVSU19LX01FQU5TICA2CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTbW9vdGggdGhlIHNlZ21lbnQgbWFwIGJ5IHJlcGxhY2luZyBpc29sYXRlZCBibG9jayBieSB0aGUgbWFqb3JpdHkgb2YgaXRzCisvLyBuZWlnaGJvdXJzLgorCitzdGF0aWMgdm9pZCBTbW9vdGhTZWdtZW50TWFwKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgeworICBpbnQgbiwgeCwgeTsKKyAgY29uc3QgaW50IHcgPSBlbmMtPm1iX3dfOworICBjb25zdCBpbnQgaCA9IGVuYy0+bWJfaF87CisgIGNvbnN0IGludCBtYWpvcml0eV9jbnRfM194XzNfZ3JpZCA9IDU7CisgIHVpbnQ4X3QqIGNvbnN0IHRtcCA9ICh1aW50OF90KilXZWJQU2FmZU1hbGxvYyh3ICogaCwgc2l6ZW9mKCp0bXApKTsKKyAgYXNzZXJ0KCh1aW50NjRfdCkodyAqIGgpID09ICh1aW50NjRfdCl3ICogaCk7ICAgLy8gbm8gb3ZlcmZsb3csIGFzIHBlciBzcGVjCisKKyAgaWYgKHRtcCA9PSBOVUxMKSByZXR1cm47CisgIGZvciAoeSA9IDE7IHkgPCBoIC0gMTsgKyt5KSB7CisgICAgZm9yICh4ID0gMTsgeCA8IHcgLSAxOyArK3gpIHsKKyAgICAgIGludCBjbnRbTlVNX01CX1NFR01FTlRTXSA9IHsgMCB9OworICAgICAgY29uc3QgVlA4TUJJbmZvKiBjb25zdCBtYiA9ICZlbmMtPm1iX2luZm9fW3ggKyB3ICogeV07CisgICAgICBpbnQgbWFqb3JpdHlfc2VnID0gbWItPnNlZ21lbnRfOworICAgICAgLy8gQ2hlY2sgdGhlIDggbmVpZ2hib3VyaW5nIHNlZ21lbnQgdmFsdWVzLgorICAgICAgY250W21iWy13IC0gMV0uc2VnbWVudF9dKys7ICAvLyB0b3AtbGVmdAorICAgICAgY250W21iWy13ICsgMF0uc2VnbWVudF9dKys7ICAvLyB0b3AKKyAgICAgIGNudFttYlstdyArIDFdLnNlZ21lbnRfXSsrOyAgLy8gdG9wLXJpZ2h0CisgICAgICBjbnRbbWJbICAgLSAxXS5zZWdtZW50X10rKzsgIC8vIGxlZnQKKyAgICAgIGNudFttYlsgICArIDFdLnNlZ21lbnRfXSsrOyAgLy8gcmlnaHQKKyAgICAgIGNudFttYlsgdyAtIDFdLnNlZ21lbnRfXSsrOyAgLy8gYm90dG9tLWxlZnQKKyAgICAgIGNudFttYlsgdyArIDBdLnNlZ21lbnRfXSsrOyAgLy8gYm90dG9tCisgICAgICBjbnRbbWJbIHcgKyAxXS5zZWdtZW50X10rKzsgIC8vIGJvdHRvbS1yaWdodAorICAgICAgZm9yIChuID0gMDsgbiA8IE5VTV9NQl9TRUdNRU5UUzsgKytuKSB7CisgICAgICAgIGlmIChjbnRbbl0gPj0gbWFqb3JpdHlfY250XzNfeF8zX2dyaWQpIHsKKyAgICAgICAgICBtYWpvcml0eV9zZWcgPSBuOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICB0bXBbeCArIHkgKiB3XSA9IG1ham9yaXR5X3NlZzsKKyAgICB9CisgIH0KKyAgZm9yICh5ID0gMTsgeSA8IGggLSAxOyArK3kpIHsKKyAgICBmb3IgKHggPSAxOyB4IDwgdyAtIDE7ICsreCkgeworICAgICAgVlA4TUJJbmZvKiBjb25zdCBtYiA9ICZlbmMtPm1iX2luZm9fW3ggKyB3ICogeV07CisgICAgICBtYi0+c2VnbWVudF8gPSB0bXBbeCArIHkgKiB3XTsKKyAgICB9CisgIH0KKyAgV2ViUFNhZmVGcmVlKHRtcCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBzZXQgc2VnbWVudCBzdXNjZXB0aWJpbGl0eSBhbHBoYV8gLyBiZXRhXworCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IGNsaXAoaW50IHYsIGludCBtLCBpbnQgTSkgeworICByZXR1cm4gKHYgPCBtKSA/IG0gOiAodiA+IE0pID8gTSA6IHY7Cit9CisKK3N0YXRpYyB2b2lkIFNldFNlZ21lbnRBbHBoYXMoVlA4RW5jb2RlciogY29uc3QgZW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgY2VudGVyc1tOVU1fTUJfU0VHTUVOVFNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWlkKSB7CisgIGNvbnN0IGludCBuYiA9IGVuYy0+c2VnbWVudF9oZHJfLm51bV9zZWdtZW50c187CisgIGludCBtaW4gPSBjZW50ZXJzWzBdLCBtYXggPSBjZW50ZXJzWzBdOworICBpbnQgbjsKKworICBpZiAobmIgPiAxKSB7CisgICAgZm9yIChuID0gMDsgbiA8IG5iOyArK24pIHsKKyAgICAgIGlmIChtaW4gPiBjZW50ZXJzW25dKSBtaW4gPSBjZW50ZXJzW25dOworICAgICAgaWYgKG1heCA8IGNlbnRlcnNbbl0pIG1heCA9IGNlbnRlcnNbbl07CisgICAgfQorICB9CisgIGlmIChtYXggPT0gbWluKSBtYXggPSBtaW4gKyAxOworICBhc3NlcnQobWlkIDw9IG1heCAmJiBtaWQgPj0gbWluKTsKKyAgZm9yIChuID0gMDsgbiA8IG5iOyArK24pIHsKKyAgICBjb25zdCBpbnQgYWxwaGEgPSAyNTUgKiAoY2VudGVyc1tuXSAtIG1pZCkgLyAobWF4IC0gbWluKTsKKyAgICBjb25zdCBpbnQgYmV0YSA9IDI1NSAqIChjZW50ZXJzW25dIC0gbWluKSAvIChtYXggLSBtaW4pOworICAgIGVuYy0+ZHFtX1tuXS5hbHBoYV8gPSBjbGlwKGFscGhhLCAtMTI3LCAxMjcpOworICAgIGVuYy0+ZHFtX1tuXS5iZXRhXyA9IGNsaXAoYmV0YSwgMCwgMjU1KTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29tcHV0ZSBzdXNjZXB0aWJpbGl0eSBiYXNlZCBvbiBEQ1QtY29lZmYgaGlzdG9ncmFtczoKKy8vIHRoZSBoaWdoZXIsIHRoZSAiZWFzaWVyIiB0aGUgbWFjcm9ibG9jayBpcyB0byBjb21wcmVzcy4KKworI2RlZmluZSBNQVhfQUxQSEEgMjU1ICAgICAgICAgICAgICAgIC8vIDhiIG9mIHByZWNpc2lvbiBmb3Igc3VzY2VwdGliaWxpdGllcy4KKyNkZWZpbmUgQUxQSEFfU0NBTEUgKDIgKiBNQVhfQUxQSEEpICAvLyBzY2FsaW5nIGZhY3RvciBmb3IgYWxwaGEuCisjZGVmaW5lIERFRkFVTFRfQUxQSEEgKC0xKQorI2RlZmluZSBJU19CRVRURVJfQUxQSEEoYWxwaGEsIGJlc3RfYWxwaGEpICgoYWxwaGEpID4gKGJlc3RfYWxwaGEpKQorCitzdGF0aWMgaW50IEZpbmFsQWxwaGFWYWx1ZShpbnQgYWxwaGEpIHsKKyAgYWxwaGEgPSBNQVhfQUxQSEEgLSBhbHBoYTsKKyAgcmV0dXJuIGNsaXAoYWxwaGEsIDAsIE1BWF9BTFBIQSk7Cit9CisKK3N0YXRpYyBpbnQgR2V0QWxwaGEoY29uc3QgVlA4SGlzdG9ncmFtKiBjb25zdCBoaXN0bykgeworICAvLyAnYWxwaGEnIHdpbGwgbGF0ZXIgYmUgY2xpcHBlZCB0byBbMC4uTUFYX0FMUEhBXSByYW5nZSwgY2xhbXBpbmcgb3V0ZXIKKyAgLy8gdmFsdWVzIHdoaWNoIGhhcHBlbiB0byBiZSBtb3N0bHkgbm9pc2UuIFRoaXMgbGVhdmVzIHRoZSBtYXhpbXVtIHByZWNpc2lvbgorICAvLyBmb3IgaGFuZGxpbmcgdGhlIHVzZWZ1bCBzbWFsbCB2YWx1ZXMgd2hpY2ggY29udHJpYnV0ZSBtb3N0LgorICBjb25zdCBpbnQgbWF4X3ZhbHVlID0gaGlzdG8tPm1heF92YWx1ZTsKKyAgY29uc3QgaW50IGxhc3Rfbm9uX3plcm8gPSBoaXN0by0+bGFzdF9ub25femVybzsKKyAgY29uc3QgaW50IGFscGhhID0KKyAgICAgIChtYXhfdmFsdWUgPiAxKSA/IEFMUEhBX1NDQUxFICogbGFzdF9ub25femVybyAvIG1heF92YWx1ZSA6IDA7CisgIHJldHVybiBhbHBoYTsKK30KKworc3RhdGljIHZvaWQgSW5pdEhpc3RvZ3JhbShWUDhIaXN0b2dyYW0qIGNvbnN0IGhpc3RvKSB7CisgIGhpc3RvLT5tYXhfdmFsdWUgPSAwOworICBoaXN0by0+bGFzdF9ub25femVybyA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIE1lcmdlSGlzdG9ncmFtcyhjb25zdCBWUDhIaXN0b2dyYW0qIGNvbnN0IGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEhpc3RvZ3JhbSogY29uc3Qgb3V0KSB7CisgIGlmIChpbi0+bWF4X3ZhbHVlID4gb3V0LT5tYXhfdmFsdWUpIHsKKyAgICBvdXQtPm1heF92YWx1ZSA9IGluLT5tYXhfdmFsdWU7CisgIH0KKyAgaWYgKGluLT5sYXN0X25vbl96ZXJvID4gb3V0LT5sYXN0X25vbl96ZXJvKSB7CisgICAgb3V0LT5sYXN0X25vbl96ZXJvID0gaW4tPmxhc3Rfbm9uX3plcm87CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFNpbXBsaWZpZWQgay1NZWFucywgdG8gYXNzaWduIE5iIHNlZ21lbnRzIGJhc2VkIG9uIGFscGhhLWhpc3RvZ3JhbQorCitzdGF0aWMgdm9pZCBBc3NpZ25TZWdtZW50cyhWUDhFbmNvZGVyKiBjb25zdCBlbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYWxwaGFzW01BWF9BTFBIQSArIDFdKSB7CisgIC8vICdudW1fc2VnbWVudHNfJyBpcyBwcmV2aW91c2x5IHZhbGlkYXRlZCBhbmQgPD0gTlVNX01CX1NFR01FTlRTLCBidXQgYW4KKyAgLy8gZXhwbGljaXQgY2hlY2sgaXMgbmVlZGVkIHRvIGF2b2lkIHNwdXJpb3VzIHdhcm5pbmcgYWJvdXQgJ24gKyAxJyBleGNlZWRpbmcKKyAgLy8gYXJyYXkgYm91bmRzIG9mICdjZW50ZXJzJyB3aXRoIHNvbWUgY29tcGlsZXJzIChub3RpY2VkIHdpdGggZ2NjLTQuOSkuCisgIGNvbnN0IGludCBuYiA9IChlbmMtPnNlZ21lbnRfaGRyXy5udW1fc2VnbWVudHNfIDwgTlVNX01CX1NFR01FTlRTKSA/CisgICAgICAgICAgICAgICAgIGVuYy0+c2VnbWVudF9oZHJfLm51bV9zZWdtZW50c18gOiBOVU1fTUJfU0VHTUVOVFM7CisgIGludCBjZW50ZXJzW05VTV9NQl9TRUdNRU5UU107CisgIGludCB3ZWlnaHRlZF9hdmVyYWdlID0gMDsKKyAgaW50IG1hcFtNQVhfQUxQSEEgKyAxXTsKKyAgaW50IGEsIG4sIGs7CisgIGludCBtaW5fYSA9IDAsIG1heF9hID0gTUFYX0FMUEhBLCByYW5nZV9hOworICAvLyAnaW50JyB0eXBlIGlzIG9rIGZvciBoaXN0bywgYW5kIHdvbid0IG92ZXJmbG93CisgIGludCBhY2N1bVtOVU1fTUJfU0VHTUVOVFNdLCBkaXN0X2FjY3VtW05VTV9NQl9TRUdNRU5UU107CisKKyAgYXNzZXJ0KG5iID49IDEpOworICBhc3NlcnQobmIgPD0gTlVNX01CX1NFR01FTlRTKTsKKworICAvLyBicmFja2V0IHRoZSBpbnB1dAorICBmb3IgKG4gPSAwOyBuIDw9IE1BWF9BTFBIQSAmJiBhbHBoYXNbbl0gPT0gMDsgKytuKSB7fQorICBtaW5fYSA9IG47CisgIGZvciAobiA9IE1BWF9BTFBIQTsgbiA+IG1pbl9hICYmIGFscGhhc1tuXSA9PSAwOyAtLW4pIHt9CisgIG1heF9hID0gbjsKKyAgcmFuZ2VfYSA9IG1heF9hIC0gbWluX2E7CisKKyAgLy8gU3ByZWFkIGluaXRpYWwgY2VudGVycyBldmVubHkKKyAgZm9yIChrID0gMCwgbiA9IDE7IGsgPCBuYjsgKytrLCBuICs9IDIpIHsKKyAgICBhc3NlcnQobiA8IDIgKiBuYik7CisgICAgY2VudGVyc1trXSA9IG1pbl9hICsgKG4gKiByYW5nZV9hKSAvICgyICogbmIpOworICB9CisKKyAgZm9yIChrID0gMDsgayA8IE1BWF9JVEVSU19LX01FQU5TOyArK2spIHsgICAgIC8vIGZldyBpdGVycyBhcmUgZW5vdWdoCisgICAgaW50IHRvdGFsX3dlaWdodDsKKyAgICBpbnQgZGlzcGxhY2VkOworICAgIC8vIFJlc2V0IHN0YXRzCisgICAgZm9yIChuID0gMDsgbiA8IG5iOyArK24pIHsKKyAgICAgIGFjY3VtW25dID0gMDsKKyAgICAgIGRpc3RfYWNjdW1bbl0gPSAwOworICAgIH0KKyAgICAvLyBBc3NpZ24gbmVhcmVzdCBjZW50ZXIgZm9yIGVhY2ggJ2EnCisgICAgbiA9IDA7ICAgIC8vIHRyYWNrIHRoZSBuZWFyZXN0IGNlbnRlciBmb3IgY3VycmVudCAnYScKKyAgICBmb3IgKGEgPSBtaW5fYTsgYSA8PSBtYXhfYTsgKythKSB7CisgICAgICBpZiAoYWxwaGFzW2FdKSB7CisgICAgICAgIHdoaWxlIChuICsgMSA8IG5iICYmIGFicyhhIC0gY2VudGVyc1tuICsgMV0pIDwgYWJzKGEgLSBjZW50ZXJzW25dKSkgeworICAgICAgICAgIG4rKzsKKyAgICAgICAgfQorICAgICAgICBtYXBbYV0gPSBuOworICAgICAgICAvLyBhY2N1bXVsYXRlIGNvbnRyaWJ1dGlvbiBpbnRvIGJlc3QgY2VudHJvaWQKKyAgICAgICAgZGlzdF9hY2N1bVtuXSArPSBhICogYWxwaGFzW2FdOworICAgICAgICBhY2N1bVtuXSArPSBhbHBoYXNbYV07CisgICAgICB9CisgICAgfQorICAgIC8vIEFsbCBwb2ludCBhcmUgY2xhc3NpZmllZC4gTW92ZSB0aGUgY2VudHJvaWRzIHRvIHRoZQorICAgIC8vIGNlbnRlciBvZiB0aGVpciByZXNwZWN0aXZlIGNsb3VkLgorICAgIGRpc3BsYWNlZCA9IDA7CisgICAgd2VpZ2h0ZWRfYXZlcmFnZSA9IDA7CisgICAgdG90YWxfd2VpZ2h0ID0gMDsKKyAgICBmb3IgKG4gPSAwOyBuIDwgbmI7ICsrbikgeworICAgICAgaWYgKGFjY3VtW25dKSB7CisgICAgICAgIGNvbnN0IGludCBuZXdfY2VudGVyID0gKGRpc3RfYWNjdW1bbl0gKyBhY2N1bVtuXSAvIDIpIC8gYWNjdW1bbl07CisgICAgICAgIGRpc3BsYWNlZCArPSBhYnMoY2VudGVyc1tuXSAtIG5ld19jZW50ZXIpOworICAgICAgICBjZW50ZXJzW25dID0gbmV3X2NlbnRlcjsKKyAgICAgICAgd2VpZ2h0ZWRfYXZlcmFnZSArPSBuZXdfY2VudGVyICogYWNjdW1bbl07CisgICAgICAgIHRvdGFsX3dlaWdodCArPSBhY2N1bVtuXTsKKyAgICAgIH0KKyAgICB9CisgICAgd2VpZ2h0ZWRfYXZlcmFnZSA9ICh3ZWlnaHRlZF9hdmVyYWdlICsgdG90YWxfd2VpZ2h0IC8gMikgLyB0b3RhbF93ZWlnaHQ7CisgICAgaWYgKGRpc3BsYWNlZCA8IDUpIGJyZWFrOyAgIC8vIG5vIG5lZWQgdG8ga2VlcCBvbiBsb29waW5nLi4uCisgIH0KKworICAvLyBNYXAgZWFjaCBvcmlnaW5hbCB2YWx1ZSB0byB0aGUgY2xvc2VzdCBjZW50cm9pZAorICBmb3IgKG4gPSAwOyBuIDwgZW5jLT5tYl93XyAqIGVuYy0+bWJfaF87ICsrbikgeworICAgIFZQOE1CSW5mbyogY29uc3QgbWIgPSAmZW5jLT5tYl9pbmZvX1tuXTsKKyAgICBjb25zdCBpbnQgYWxwaGEgPSBtYi0+YWxwaGFfOworICAgIG1iLT5zZWdtZW50XyA9IG1hcFthbHBoYV07CisgICAgbWItPmFscGhhXyA9IGNlbnRlcnNbbWFwW2FscGhhXV07ICAvLyBmb3IgdGhlIHJlY29yZC4KKyAgfQorCisgIGlmIChuYiA+IDEpIHsKKyAgICBjb25zdCBpbnQgc21vb3RoID0gKGVuYy0+Y29uZmlnXy0+cHJlcHJvY2Vzc2luZyAmIDEpOworICAgIGlmIChzbW9vdGgpIFNtb290aFNlZ21lbnRNYXAoZW5jKTsKKyAgfQorCisgIFNldFNlZ21lbnRBbHBoYXMoZW5jLCBjZW50ZXJzLCB3ZWlnaHRlZF9hdmVyYWdlKTsgIC8vIHBpY2sgc29tZSBhbHBoYXMuCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNYWNyb2Jsb2NrIGFuYWx5c2lzOiBjb2xsZWN0IGhpc3RvZ3JhbSBmb3IgZWFjaCBtb2RlLCBkZWR1Y2UgdGhlIG1heGltYWwKKy8vIHN1c2NlcHRpYmlsaXR5IGFuZCBzZXQgYmVzdCBtb2RlcyBmb3IgdGhpcyBtYWNyb2Jsb2NrLgorLy8gU2VnbWVudCBhc3NpZ25tZW50IGlzIGRvbmUgbGF0ZXIuCisKKy8vIE51bWJlciBvZiBtb2RlcyB0byBpbnNwZWN0IGZvciBhbHBoYV8gZXZhbHVhdGlvbi4gV2UgZG9uJ3QgbmVlZCB0byB0ZXN0IGFsbAorLy8gdGhlIHBvc3NpYmxlIG1vZGVzIGR1cmluZyB0aGUgYW5hbHlzaXMgcGhhc2U6IHdlIHJpc2sgZmFsbGluZyBpbnRvIGEgbG9jYWwKKy8vIG9wdGltdW0sIG9yIGJlIHN1YmplY3QgdG8gYm91bmRhcnkgZWZmZWN0CisjZGVmaW5lIE1BWF9JTlRSQTE2X01PREUgMgorI2RlZmluZSBNQVhfSU5UUkE0X01PREUgIDIKKyNkZWZpbmUgTUFYX1VWX01PREUgICAgICAyCisKK3N0YXRpYyBpbnQgTUJBbmFseXplQmVzdEludHJhMTZNb2RlKFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCkgeworICBjb25zdCBpbnQgbWF4X21vZGUgPSBNQVhfSU5UUkExNl9NT0RFOworICBpbnQgbW9kZTsKKyAgaW50IGJlc3RfYWxwaGEgPSBERUZBVUxUX0FMUEhBOworICBpbnQgYmVzdF9tb2RlID0gMDsKKworICBWUDhNYWtlTHVtYTE2UHJlZHMoaXQpOworICBmb3IgKG1vZGUgPSAwOyBtb2RlIDwgbWF4X21vZGU7ICsrbW9kZSkgeworICAgIFZQOEhpc3RvZ3JhbSBoaXN0bzsKKyAgICBpbnQgYWxwaGE7CisKKyAgICBJbml0SGlzdG9ncmFtKCZoaXN0byk7CisgICAgVlA4Q29sbGVjdEhpc3RvZ3JhbShpdC0+eXV2X2luXyArIFlfT0ZGX0VOQywKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0LT55dXZfcF8gKyBWUDhJMTZNb2RlT2Zmc2V0c1ttb2RlXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDE2LCAmaGlzdG8pOworICAgIGFscGhhID0gR2V0QWxwaGEoJmhpc3RvKTsKKyAgICBpZiAoSVNfQkVUVEVSX0FMUEhBKGFscGhhLCBiZXN0X2FscGhhKSkgeworICAgICAgYmVzdF9hbHBoYSA9IGFscGhhOworICAgICAgYmVzdF9tb2RlID0gbW9kZTsKKyAgICB9CisgIH0KKyAgVlA4U2V0SW50cmExNk1vZGUoaXQsIGJlc3RfbW9kZSk7CisgIHJldHVybiBiZXN0X2FscGhhOworfQorCitzdGF0aWMgaW50IEZhc3RNQkFuYWx5emUoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KSB7CisgIC8vIEVtcGlyaWNhbCBjdXQtb2ZmIHZhbHVlLCBzaG91bGQgYmUgYXJvdW5kIDE2ICh+PWJsb2NrIHNpemUpLiBXZSB1c2UgdGhlCisgIC8vIFs4LTE3XSByYW5nZSBhbmQgZmF2b3IgaW50cmE0IGF0IGhpZ2ggcXVhbGl0eSwgaW50cmExNiBmb3IgbG93IHF1YWxpdHkuCisgIGNvbnN0IGludCBxID0gKGludClpdC0+ZW5jXy0+Y29uZmlnXy0+cXVhbGl0eTsKKyAgY29uc3QgdWludDMyX3Qga1RocmVzaG9sZCA9IDggKyAoMTcgLSA4KSAqIHEgLyAxMDA7CisgIGludCBrOworICB1aW50MzJfdCBkY1sxNl0sIG0sIG0yOworICBmb3IgKGsgPSAwOyBrIDwgMTY7IGsgKz0gNCkgeworICAgIFZQOE1lYW4xNng0KGl0LT55dXZfaW5fICsgWV9PRkZfRU5DICsgayAqIEJQUywgJmRjW2tdKTsKKyAgfQorICBmb3IgKG0gPSAwLCBtMiA9IDAsIGsgPSAwOyBrIDwgMTY7ICsraykgeworICAgIG0gKz0gZGNba107CisgICAgbTIgKz0gZGNba10gKiBkY1trXTsKKyAgfQorICBpZiAoa1RocmVzaG9sZCAqIG0yIDwgbSAqIG0pIHsKKyAgICBWUDhTZXRJbnRyYTE2TW9kZShpdCwgMCk7ICAgLy8gREMxNgorICB9IGVsc2UgeworICAgIGNvbnN0IHVpbnQ4X3QgbW9kZXNbMTZdID0geyAwIH07ICAvLyBEQzQKKyAgICBWUDhTZXRJbnRyYTRNb2RlKGl0LCBtb2Rlcyk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgTUJBbmFseXplQmVzdEludHJhNE1vZGUoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmVzdF9hbHBoYSkgeworICB1aW50OF90IG1vZGVzWzE2XTsKKyAgY29uc3QgaW50IG1heF9tb2RlID0gTUFYX0lOVFJBNF9NT0RFOworICBpbnQgaTRfYWxwaGE7CisgIFZQOEhpc3RvZ3JhbSB0b3RhbF9oaXN0bzsKKyAgaW50IGN1cl9oaXN0byA9IDA7CisgIEluaXRIaXN0b2dyYW0oJnRvdGFsX2hpc3RvKTsKKworICBWUDhJdGVyYXRvclN0YXJ0STQoaXQpOworICBkbyB7CisgICAgaW50IG1vZGU7CisgICAgaW50IGJlc3RfbW9kZV9hbHBoYSA9IERFRkFVTFRfQUxQSEE7CisgICAgVlA4SGlzdG9ncmFtIGhpc3Rvc1syXTsKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCBzcmMgPSBpdC0+eXV2X2luXyArIFlfT0ZGX0VOQyArIFZQOFNjYW5baXQtPmk0X107CisKKyAgICBWUDhNYWtlSW50cmE0UHJlZHMoaXQpOworICAgIGZvciAobW9kZSA9IDA7IG1vZGUgPCBtYXhfbW9kZTsgKyttb2RlKSB7CisgICAgICBpbnQgYWxwaGE7CisKKyAgICAgIEluaXRIaXN0b2dyYW0oJmhpc3Rvc1tjdXJfaGlzdG9dKTsKKyAgICAgIFZQOENvbGxlY3RIaXN0b2dyYW0oc3JjLCBpdC0+eXV2X3BfICsgVlA4STRNb2RlT2Zmc2V0c1ttb2RlXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgJmhpc3Rvc1tjdXJfaGlzdG9dKTsKKyAgICAgIGFscGhhID0gR2V0QWxwaGEoJmhpc3Rvc1tjdXJfaGlzdG9dKTsKKyAgICAgIGlmIChJU19CRVRURVJfQUxQSEEoYWxwaGEsIGJlc3RfbW9kZV9hbHBoYSkpIHsKKyAgICAgICAgYmVzdF9tb2RlX2FscGhhID0gYWxwaGE7CisgICAgICAgIG1vZGVzW2l0LT5pNF9dID0gbW9kZTsKKyAgICAgICAgY3VyX2hpc3RvIF49IDE7ICAgLy8ga2VlcCB0cmFjayBvZiBiZXN0IGhpc3RvIHNvIGZhci4KKyAgICAgIH0KKyAgICB9CisgICAgLy8gYWNjdW11bGF0ZSBiZXN0IGhpc3RvZ3JhbQorICAgIE1lcmdlSGlzdG9ncmFtcygmaGlzdG9zW2N1cl9oaXN0byBeIDFdLCAmdG90YWxfaGlzdG8pOworICAgIC8vIE5vdGU6IHdlIHJldXNlIHRoZSBvcmlnaW5hbCBzYW1wbGVzIGZvciBwcmVkaWN0b3JzCisgIH0gd2hpbGUgKFZQOEl0ZXJhdG9yUm90YXRlSTQoaXQsIGl0LT55dXZfaW5fICsgWV9PRkZfRU5DKSk7CisKKyAgaTRfYWxwaGEgPSBHZXRBbHBoYSgmdG90YWxfaGlzdG8pOworICBpZiAoSVNfQkVUVEVSX0FMUEhBKGk0X2FscGhhLCBiZXN0X2FscGhhKSkgeworICAgIFZQOFNldEludHJhNE1vZGUoaXQsIG1vZGVzKTsKKyAgICBiZXN0X2FscGhhID0gaTRfYWxwaGE7CisgIH0KKyAgcmV0dXJuIGJlc3RfYWxwaGE7Cit9CisKK3N0YXRpYyBpbnQgTUJBbmFseXplQmVzdFVWTW9kZShWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKKyAgaW50IGJlc3RfYWxwaGEgPSBERUZBVUxUX0FMUEhBOworICBpbnQgc21hbGxlc3RfYWxwaGEgPSAwOworICBpbnQgYmVzdF9tb2RlID0gMDsKKyAgY29uc3QgaW50IG1heF9tb2RlID0gTUFYX1VWX01PREU7CisgIGludCBtb2RlOworCisgIFZQOE1ha2VDaHJvbWE4UHJlZHMoaXQpOworICBmb3IgKG1vZGUgPSAwOyBtb2RlIDwgbWF4X21vZGU7ICsrbW9kZSkgeworICAgIFZQOEhpc3RvZ3JhbSBoaXN0bzsKKyAgICBpbnQgYWxwaGE7CisgICAgSW5pdEhpc3RvZ3JhbSgmaGlzdG8pOworICAgIFZQOENvbGxlY3RIaXN0b2dyYW0oaXQtPnl1dl9pbl8gKyBVX09GRl9FTkMsCisgICAgICAgICAgICAgICAgICAgICAgICBpdC0+eXV2X3BfICsgVlA4VVZNb2RlT2Zmc2V0c1ttb2RlXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDE2LCAxNiArIDQgKyA0LCAmaGlzdG8pOworICAgIGFscGhhID0gR2V0QWxwaGEoJmhpc3RvKTsKKyAgICBpZiAoSVNfQkVUVEVSX0FMUEhBKGFscGhhLCBiZXN0X2FscGhhKSkgeworICAgICAgYmVzdF9hbHBoYSA9IGFscGhhOworICAgIH0KKyAgICAvLyBUaGUgYmVzdCBwcmVkaWN0aW9uIG1vZGUgdGVuZHMgdG8gYmUgdGhlIG9uZSB3aXRoIHRoZSBzbWFsbGVzdCBhbHBoYS4KKyAgICBpZiAobW9kZSA9PSAwIHx8IGFscGhhIDwgc21hbGxlc3RfYWxwaGEpIHsKKyAgICAgIHNtYWxsZXN0X2FscGhhID0gYWxwaGE7CisgICAgICBiZXN0X21vZGUgPSBtb2RlOworICAgIH0KKyAgfQorICBWUDhTZXRJbnRyYVVWTW9kZShpdCwgYmVzdF9tb2RlKTsKKyAgcmV0dXJuIGJlc3RfYWxwaGE7Cit9CisKK3N0YXRpYyB2b2lkIE1CQW5hbHl6ZShWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhc1tNQVhfQUxQSEEgKyAxXSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGFscGhhLCBpbnQqIGNvbnN0IHV2X2FscGhhKSB7CisgIGNvbnN0IFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOworICBpbnQgYmVzdF9hbHBoYSwgYmVzdF91dl9hbHBoYTsKKworICBWUDhTZXRJbnRyYTE2TW9kZShpdCwgMCk7ICAvLyBkZWZhdWx0OiBJbnRyYTE2LCBEQ19QUkVECisgIFZQOFNldFNraXAoaXQsIDApOyAgICAgICAgIC8vIG5vdCBza2lwcGVkCisgIFZQOFNldFNlZ21lbnQoaXQsIDApOyAgICAgIC8vIGRlZmF1bHQgc2VnbWVudCwgc3BlYy13aXNlLgorCisgIGlmIChlbmMtPm1ldGhvZF8gPD0gMSkgeworICAgIGJlc3RfYWxwaGEgPSBGYXN0TUJBbmFseXplKGl0KTsKKyAgfSBlbHNlIHsKKyAgICBiZXN0X2FscGhhID0gTUJBbmFseXplQmVzdEludHJhMTZNb2RlKGl0KTsKKyAgICBpZiAoZW5jLT5tZXRob2RfID49IDUpIHsKKyAgICAgIC8vIFdlIGdvIGFuZCBtYWtlIGEgZmFzdCBkZWNpc2lvbiBmb3IgaW50cmE0L2ludHJhMTYuCisgICAgICAvLyBJdCdzIHVzdWFsbHkgbm90IGEgZ29vZCBhbmQgZGVmaW5pdGl2ZSBwaWNrLCBidXQgaGVscHMgc2VlZGluZyB0aGUKKyAgICAgIC8vIHN0YXRzIGFib3V0IGxldmVsIGJpdC1jb3N0LgorICAgICAgLy8gVE9ETyhza2FsKTogaW1wcm92ZSBjcml0ZXJpb24uCisgICAgICBiZXN0X2FscGhhID0gTUJBbmFseXplQmVzdEludHJhNE1vZGUoaXQsIGJlc3RfYWxwaGEpOworICAgIH0KKyAgfQorICBiZXN0X3V2X2FscGhhID0gTUJBbmFseXplQmVzdFVWTW9kZShpdCk7CisKKyAgLy8gRmluYWwgc3VzY2VwdGliaWxpdHkgbWl4CisgIGJlc3RfYWxwaGEgPSAoMyAqIGJlc3RfYWxwaGEgKyBiZXN0X3V2X2FscGhhICsgMikgPj4gMjsKKyAgYmVzdF9hbHBoYSA9IEZpbmFsQWxwaGFWYWx1ZShiZXN0X2FscGhhKTsKKyAgYWxwaGFzW2Jlc3RfYWxwaGFdKys7CisgIGl0LT5tYl8tPmFscGhhXyA9IGJlc3RfYWxwaGE7ICAgLy8gZm9yIGxhdGVyIHJlbWFwcGluZy4KKworICAvLyBBY2N1bXVsYXRlIGZvciBsYXRlciBjb21wbGV4aXR5IGFuYWx5c2lzLgorICAqYWxwaGEgKz0gYmVzdF9hbHBoYTsgICAvLyBtaXhlZCBzdXNjZXB0aWJpbGl0eSAobm90IGp1c3QgbHVtYSkKKyAgKnV2X2FscGhhICs9IGJlc3RfdXZfYWxwaGE7Cit9CisKK3N0YXRpYyB2b2lkIERlZmF1bHRNQkluZm8oVlA4TUJJbmZvKiBjb25zdCBtYikgeworICBtYi0+dHlwZV8gPSAxOyAgICAgLy8gSTE2eDE2CisgIG1iLT51dl9tb2RlXyA9IDA7CisgIG1iLT5za2lwXyA9IDA7ICAgICAvLyBub3Qgc2tpcHBlZAorICBtYi0+c2VnbWVudF8gPSAwOyAgLy8gZGVmYXVsdCBzZWdtZW50CisgIG1iLT5hbHBoYV8gPSAwOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWFpbiBhbmFseXNpcyBsb29wOgorLy8gQ29sbGVjdCBhbGwgc3VzY2VwdGliaWxpdGllcyBmb3IgZWFjaCBtYWNyb2Jsb2NrIGFuZCByZWNvcmQgdGhlaXIKKy8vIGRpc3RyaWJ1dGlvbiBpbiBhbHBoYXNbXS4gU2VnbWVudHMgaXMgYXNzaWduZWQgYS1wb3N0ZXJpb3JpLCBiYXNlZCBvbgorLy8gdGhpcyBoaXN0b2dyYW0uCisvLyBXZSBhbHNvIHBpY2sgYW4gaW50cmExNiBwcmVkaWN0aW9uIG1vZGUsIHdoaWNoIHNob3VsZG4ndCBiZSBjb25zaWRlcmVkCisvLyBmaW5hbCBleGNlcHQgZm9yIGZhc3QtZW5jb2RlIHNldHRpbmdzLiBXZSBjYW4gYWxzbyBwaWNrIHNvbWUgaW50cmE0IG1vZGVzCisvLyBhbmQgZGVjaWRlIGludHJhNC9pbnRyYTE2LCBidXQgdGhhdCdzIHVzdWFsbHkgYWxtb3N0IGFsd2F5cyBhIGJhZCBjaG9pY2UgYXQKKy8vIHRoaXMgc3RhZ2UuCisKK3N0YXRpYyB2b2lkIFJlc2V0QWxsTUJJbmZvKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgeworICBpbnQgbjsKKyAgZm9yIChuID0gMDsgbiA8IGVuYy0+bWJfd18gKiBlbmMtPm1iX2hfOyArK24pIHsKKyAgICBEZWZhdWx0TUJJbmZvKCZlbmMtPm1iX2luZm9fW25dKTsKKyAgfQorICAvLyBEZWZhdWx0IHN1c2NlcHRpYmlsaXRpZXMuCisgIGVuYy0+ZHFtX1swXS5hbHBoYV8gPSAwOworICBlbmMtPmRxbV9bMF0uYmV0YV8gPSAwOworICAvLyBOb3RlOiB3ZSBjYW4ndCBjb21wdXRlIHRoaXMgYWxwaGFfIC8gdXZfYWxwaGFfIC0+IHNldCB0byBkZWZhdWx0IHZhbHVlLgorICBlbmMtPmFscGhhXyA9IDA7CisgIGVuYy0+dXZfYWxwaGFfID0gMDsKKyAgV2ViUFJlcG9ydFByb2dyZXNzKGVuYy0+cGljXywgZW5jLT5wZXJjZW50XyArIDIwLCAmZW5jLT5wZXJjZW50Xyk7Cit9CisKKy8vIHN0cnVjdCB1c2VkIHRvIGNvbGxlY3Qgam9iIHJlc3VsdAordHlwZWRlZiBzdHJ1Y3QgeworICBXZWJQV29ya2VyIHdvcmtlcjsKKyAgaW50IGFscGhhc1tNQVhfQUxQSEEgKyAxXTsKKyAgaW50IGFscGhhLCB1dl9hbHBoYTsKKyAgVlA4RW5jSXRlcmF0b3IgaXQ7CisgIGludCBkZWx0YV9wcm9ncmVzczsKK30gU2VnbWVudEpvYjsKKworLy8gbWFpbiB3b3JrIGNhbGwKK3N0YXRpYyBpbnQgRG9TZWdtZW50c0pvYih2b2lkKiBhcmcxLCB2b2lkKiBhcmcyKSB7CisgIFNlZ21lbnRKb2IqIGNvbnN0IGpvYiA9IChTZWdtZW50Sm9iKilhcmcxOworICBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQgPSAoVlA4RW5jSXRlcmF0b3IqKWFyZzI7CisgIGludCBvayA9IDE7CisgIGlmICghVlA4SXRlcmF0b3JJc0RvbmUoaXQpKSB7CisgICAgdWludDhfdCB0bXBbMzIgKyBXRUJQX0FMSUdOX0NTVF07CisgICAgdWludDhfdCogY29uc3Qgc2NyYXRjaCA9ICh1aW50OF90KilXRUJQX0FMSUdOKHRtcCk7CisgICAgZG8geworICAgICAgLy8gTGV0J3MgcHJldGVuZCB3ZSBoYXZlIHBlcmZlY3QgbG9zc2xlc3MgcmVjb25zdHJ1Y3Rpb24uCisgICAgICBWUDhJdGVyYXRvckltcG9ydChpdCwgc2NyYXRjaCk7CisgICAgICBNQkFuYWx5emUoaXQsIGpvYi0+YWxwaGFzLCAmam9iLT5hbHBoYSwgJmpvYi0+dXZfYWxwaGEpOworICAgICAgb2sgPSBWUDhJdGVyYXRvclByb2dyZXNzKGl0LCBqb2ItPmRlbHRhX3Byb2dyZXNzKTsKKyAgICB9IHdoaWxlIChvayAmJiBWUDhJdGVyYXRvck5leHQoaXQpKTsKKyAgfQorICByZXR1cm4gb2s7Cit9CisKK3N0YXRpYyB2b2lkIE1lcmdlSm9icyhjb25zdCBTZWdtZW50Sm9iKiBjb25zdCBzcmMsIFNlZ21lbnRKb2IqIGNvbnN0IGRzdCkgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8PSBNQVhfQUxQSEE7ICsraSkgZHN0LT5hbHBoYXNbaV0gKz0gc3JjLT5hbHBoYXNbaV07CisgIGRzdC0+YWxwaGEgKz0gc3JjLT5hbHBoYTsKKyAgZHN0LT51dl9hbHBoYSArPSBzcmMtPnV2X2FscGhhOworfQorCisvLyBpbml0aWFsaXplIHRoZSBqb2Igc3RydWN0IHdpdGggc29tZSBUT0RPcworc3RhdGljIHZvaWQgSW5pdFNlZ21lbnRKb2IoVlA4RW5jb2RlciogY29uc3QgZW5jLCBTZWdtZW50Sm9iKiBjb25zdCBqb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfcm93LCBpbnQgZW5kX3JvdykgeworICBXZWJQR2V0V29ya2VySW50ZXJmYWNlKCktPkluaXQoJmpvYi0+d29ya2VyKTsKKyAgam9iLT53b3JrZXIuZGF0YTEgPSBqb2I7CisgIGpvYi0+d29ya2VyLmRhdGEyID0gJmpvYi0+aXQ7CisgIGpvYi0+d29ya2VyLmhvb2sgPSBEb1NlZ21lbnRzSm9iOworICBWUDhJdGVyYXRvckluaXQoZW5jLCAmam9iLT5pdCk7CisgIFZQOEl0ZXJhdG9yU2V0Um93KCZqb2ItPml0LCBzdGFydF9yb3cpOworICBWUDhJdGVyYXRvclNldENvdW50RG93bigmam9iLT5pdCwgKGVuZF9yb3cgLSBzdGFydF9yb3cpICogZW5jLT5tYl93Xyk7CisgIG1lbXNldChqb2ItPmFscGhhcywgMCwgc2l6ZW9mKGpvYi0+YWxwaGFzKSk7CisgIGpvYi0+YWxwaGEgPSAwOworICBqb2ItPnV2X2FscGhhID0gMDsKKyAgLy8gb25seSBvbmUgb2YgYm90aCBqb2JzIGNhbiByZWNvcmQgdGhlIHByb2dyZXNzLCBzaW5jZSB3ZSBkb24ndAorICAvLyBleHBlY3QgdGhlIHVzZXIncyBob29rIHRvIGJlIG11bHRpLXRocmVhZCBzYWZlCisgIGpvYi0+ZGVsdGFfcHJvZ3Jlc3MgPSAoc3RhcnRfcm93ID09IDApID8gMjAgOiAwOworfQorCisvLyBtYWluIGVudHJ5IHBvaW50CitpbnQgVlA4RW5jQW5hbHl6ZShWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgaW50IG9rID0gMTsKKyAgY29uc3QgaW50IGRvX3NlZ21lbnRzID0KKyAgICAgIGVuYy0+Y29uZmlnXy0+ZW11bGF0ZV9qcGVnX3NpemUgfHwgICAvLyBXZSBuZWVkIHRoZSBjb21wbGV4aXR5IGV2YWx1YXRpb24uCisgICAgICAoZW5jLT5zZWdtZW50X2hkcl8ubnVtX3NlZ21lbnRzXyA+IDEpIHx8CisgICAgICAoZW5jLT5tZXRob2RfIDw9IDEpOyAgLy8gZm9yIG1ldGhvZCAwIC0gMSwgd2UgbmVlZCBwcmVkc19bXSB0byBiZSBmaWxsZWQuCisgIGlmIChkb19zZWdtZW50cykgeworICAgIGNvbnN0IGludCBsYXN0X3JvdyA9IGVuYy0+bWJfaF87CisgICAgLy8gV2UgZ2l2ZSBhIGxpdHRsZSBtb3JlIHRoYW4gYSBoYWxmIHdvcmsgdG8gdGhlIG1haW4gdGhyZWFkLgorICAgIGNvbnN0IGludCBzcGxpdF9yb3cgPSAoOSAqIGxhc3Rfcm93ICsgMTUpID4+IDQ7CisgICAgY29uc3QgaW50IHRvdGFsX21iID0gbGFzdF9yb3cgKiBlbmMtPm1iX3dfOworI2lmZGVmIFdFQlBfVVNFX1RIUkVBRAorICAgIGNvbnN0IGludCBrTWluU3BsaXRSb3cgPSAyOyAgLy8gbWluaW1hbCByb3dzIG5lZWRlZCBmb3IgbXQgdG8gYmUgd29ydGggaXQKKyAgICBjb25zdCBpbnQgZG9fbXQgPSAoZW5jLT50aHJlYWRfbGV2ZWxfID4gMCkgJiYgKHNwbGl0X3JvdyA+PSBrTWluU3BsaXRSb3cpOworI2Vsc2UKKyAgICBjb25zdCBpbnQgZG9fbXQgPSAwOworI2VuZGlmCisgICAgY29uc3QgV2ViUFdvcmtlckludGVyZmFjZSogY29uc3Qgd29ya2VyX2ludGVyZmFjZSA9CisgICAgICAgIFdlYlBHZXRXb3JrZXJJbnRlcmZhY2UoKTsKKyAgICBTZWdtZW50Sm9iIG1haW5fam9iOworICAgIGlmIChkb19tdCkgeworICAgICAgU2VnbWVudEpvYiBzaWRlX2pvYjsKKyAgICAgIC8vIE5vdGUgdGhlIHVzZSBvZiAnJicgaW5zdGVhZCBvZiAnJiYnIGJlY2F1c2Ugd2UgbXVzdCBjYWxsIHRoZSBmdW5jdGlvbnMKKyAgICAgIC8vIG5vIG1hdHRlciB3aGF0LgorICAgICAgSW5pdFNlZ21lbnRKb2IoZW5jLCAmbWFpbl9qb2IsIDAsIHNwbGl0X3Jvdyk7CisgICAgICBJbml0U2VnbWVudEpvYihlbmMsICZzaWRlX2pvYiwgc3BsaXRfcm93LCBsYXN0X3Jvdyk7CisgICAgICAvLyB3ZSBkb24ndCBuZWVkIHRvIGNhbGwgUmVzZXQoKSBvbiBtYWluX2pvYi53b3JrZXIsIHNpbmNlIHdlJ3JlIGNhbGxpbmcKKyAgICAgIC8vIFdlYlBXb3JrZXJFeGVjdXRlKCkgb24gaXQKKyAgICAgIG9rICY9IHdvcmtlcl9pbnRlcmZhY2UtPlJlc2V0KCZzaWRlX2pvYi53b3JrZXIpOworICAgICAgLy8gbGF1bmNoIHRoZSB0d28gam9icyBpbiBwYXJhbGxlbAorICAgICAgaWYgKG9rKSB7CisgICAgICAgIHdvcmtlcl9pbnRlcmZhY2UtPkxhdW5jaCgmc2lkZV9qb2Iud29ya2VyKTsKKyAgICAgICAgd29ya2VyX2ludGVyZmFjZS0+RXhlY3V0ZSgmbWFpbl9qb2Iud29ya2VyKTsKKyAgICAgICAgb2sgJj0gd29ya2VyX2ludGVyZmFjZS0+U3luYygmc2lkZV9qb2Iud29ya2VyKTsKKyAgICAgICAgb2sgJj0gd29ya2VyX2ludGVyZmFjZS0+U3luYygmbWFpbl9qb2Iud29ya2VyKTsKKyAgICAgIH0KKyAgICAgIHdvcmtlcl9pbnRlcmZhY2UtPkVuZCgmc2lkZV9qb2Iud29ya2VyKTsKKyAgICAgIGlmIChvaykgTWVyZ2VKb2JzKCZzaWRlX2pvYiwgJm1haW5fam9iKTsgIC8vIG1lcmdlIHJlc3VsdHMgdG9nZXRoZXIKKyAgICB9IGVsc2UgeworICAgICAgLy8gRXZlbiBmb3Igc2luZ2xlLXRocmVhZCBjYXNlLCB3ZSB1c2UgdGhlIGdlbmVyaWMgV29ya2VyIHRvb2xzLgorICAgICAgSW5pdFNlZ21lbnRKb2IoZW5jLCAmbWFpbl9qb2IsIDAsIGxhc3Rfcm93KTsKKyAgICAgIHdvcmtlcl9pbnRlcmZhY2UtPkV4ZWN1dGUoJm1haW5fam9iLndvcmtlcik7CisgICAgICBvayAmPSB3b3JrZXJfaW50ZXJmYWNlLT5TeW5jKCZtYWluX2pvYi53b3JrZXIpOworICAgIH0KKyAgICB3b3JrZXJfaW50ZXJmYWNlLT5FbmQoJm1haW5fam9iLndvcmtlcik7CisgICAgaWYgKG9rKSB7CisgICAgICBlbmMtPmFscGhhXyA9IG1haW5fam9iLmFscGhhIC8gdG90YWxfbWI7CisgICAgICBlbmMtPnV2X2FscGhhXyA9IG1haW5fam9iLnV2X2FscGhhIC8gdG90YWxfbWI7CisgICAgICBBc3NpZ25TZWdtZW50cyhlbmMsIG1haW5fam9iLmFscGhhcyk7CisgICAgfQorICB9IGVsc2UgeyAgIC8vIFVzZSBvbmx5IG9uZSBkZWZhdWx0IHNlZ21lbnQuCisgICAgUmVzZXRBbGxNQkluZm8oZW5jKTsKKyAgfQorICByZXR1cm4gb2s7Cit9CisKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvYmFja3dhcmRfcmVmZXJlbmNlc19jb3N0X2VuYy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9iYWNrd2FyZF9yZWZlcmVuY2VzX2Nvc3RfZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE3NTQ5NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvYmFja3dhcmRfcmVmZXJlbmNlc19jb3N0X2VuYy5jCkBAIC0wLDAgKzEsNzkwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gSW1wcm92ZXMgYSBnaXZlbiBzZXQgb2YgYmFja3dhcmQgcmVmZXJlbmNlcyBieSBhbmFseXppbmcgaXRzIGJpdCBjb3N0LgorLy8gVGhlIGFsZ29yaXRobSBpcyBzaW1pbGFyIHRvIHRoZSBab3BmbGkgY29tcHJlc3Npb24gYWxnb3JpdGhtIGJ1dCB0YWlsb3JlZCB0bworLy8gaW1hZ2VzLgorLy8KKy8vIEF1dGhvcjogVmluY2VudCBSYWJhdWQgKHZyYWJhdWRAZ29vZ2xlLmNvbSkKKy8vCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgInNyYy9lbmMvYmFja3dhcmRfcmVmZXJlbmNlc19lbmMuaCIKKyNpbmNsdWRlICJzcmMvZW5jL2hpc3RvZ3JhbV9lbmMuaCIKKyNpbmNsdWRlICJzcmMvZHNwL2xvc3NsZXNzX2NvbW1vbi5oIgorI2luY2x1ZGUgInNyYy91dGlscy9jb2xvcl9jYWNoZV91dGlscy5oIgorI2luY2x1ZGUgInNyYy91dGlscy91dGlscy5oIgorCisjZGVmaW5lIFZBTFVFU19JTl9CWVRFIDI1NgorCitleHRlcm4gdm9pZCBWUDhMQ2xlYXJCYWNrd2FyZFJlZnMoVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcyk7CitleHRlcm4gaW50IFZQOExEaXN0YW5jZVRvUGxhbmVDb2RlKGludCB4c2l6ZSwgaW50IGRpc3QpOworZXh0ZXJuIHZvaWQgVlA4TEJhY2t3YXJkUmVmc0N1cnNvckFkZChWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQaXhPckNvcHkgdik7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgZG91YmxlIGFscGhhX1tWQUxVRVNfSU5fQllURV07CisgIGRvdWJsZSByZWRfW1ZBTFVFU19JTl9CWVRFXTsKKyAgZG91YmxlIGJsdWVfW1ZBTFVFU19JTl9CWVRFXTsKKyAgZG91YmxlIGRpc3RhbmNlX1tOVU1fRElTVEFOQ0VfQ09ERVNdOworICBkb3VibGUqIGxpdGVyYWxfOworfSBDb3N0TW9kZWw7CisKK3N0YXRpYyB2b2lkIENvbnZlcnRQb3B1bGF0aW9uQ291bnRUYWJsZVRvQml0RXN0aW1hdGVzKAorICAgIGludCBudW1fc3ltYm9scywgY29uc3QgdWludDMyX3QgcG9wdWxhdGlvbl9jb3VudHNbXSwgZG91YmxlIG91dHB1dFtdKSB7CisgIHVpbnQzMl90IHN1bSA9IDA7CisgIGludCBub256ZXJvcyA9IDA7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgbnVtX3N5bWJvbHM7ICsraSkgeworICAgIHN1bSArPSBwb3B1bGF0aW9uX2NvdW50c1tpXTsKKyAgICBpZiAocG9wdWxhdGlvbl9jb3VudHNbaV0gPiAwKSB7CisgICAgICArK25vbnplcm9zOworICAgIH0KKyAgfQorICBpZiAobm9uemVyb3MgPD0gMSkgeworICAgIG1lbXNldChvdXRwdXQsIDAsIG51bV9zeW1ib2xzICogc2l6ZW9mKCpvdXRwdXQpKTsKKyAgfSBlbHNlIHsKKyAgICBjb25zdCBkb3VibGUgbG9nc3VtID0gVlA4TEZhc3RMb2cyKHN1bSk7CisgICAgZm9yIChpID0gMDsgaSA8IG51bV9zeW1ib2xzOyArK2kpIHsKKyAgICAgIG91dHB1dFtpXSA9IGxvZ3N1bSAtIFZQOExGYXN0TG9nMihwb3B1bGF0aW9uX2NvdW50c1tpXSk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyBpbnQgQ29zdE1vZGVsQnVpbGQoQ29zdE1vZGVsKiBjb25zdCBtLCBpbnQgeHNpemUsIGludCBjYWNoZV9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzKSB7CisgIGludCBvayA9IDA7CisgIFZQOExSZWZzQ3Vyc29yIGMgPSBWUDhMUmVmc0N1cnNvckluaXQocmVmcyk7CisgIFZQOExIaXN0b2dyYW0qIGNvbnN0IGhpc3RvID0gVlA4TEFsbG9jYXRlSGlzdG9ncmFtKGNhY2hlX2JpdHMpOworICBpZiAoaGlzdG8gPT0gTlVMTCkgZ290byBFcnJvcjsKKworICAvLyBUaGUgZm9sbG93aW5nIGNvZGUgaXMgc2ltaWxhciB0byBWUDhMSGlzdG9ncmFtQ3JlYXRlIGJ1dCBjb252ZXJ0cyB0aGUKKyAgLy8gZGlzdGFuY2UgdG8gcGxhbmUgY29kZS4KKyAgVlA4TEhpc3RvZ3JhbUluaXQoaGlzdG8sIGNhY2hlX2JpdHMpOworICB3aGlsZSAoVlA4TFJlZnNDdXJzb3JPaygmYykpIHsKKyAgICBWUDhMSGlzdG9ncmFtQWRkU2luZ2xlUGl4T3JDb3B5KGhpc3RvLCBjLmN1cl9wb3MsIFZQOExEaXN0YW5jZVRvUGxhbmVDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHNpemUpOworICAgIFZQOExSZWZzQ3Vyc29yTmV4dCgmYyk7CisgIH0KKworICBDb252ZXJ0UG9wdWxhdGlvbkNvdW50VGFibGVUb0JpdEVzdGltYXRlcygKKyAgICAgIFZQOExIaXN0b2dyYW1OdW1Db2RlcyhoaXN0by0+cGFsZXR0ZV9jb2RlX2JpdHNfKSwKKyAgICAgIGhpc3RvLT5saXRlcmFsXywgbS0+bGl0ZXJhbF8pOworICBDb252ZXJ0UG9wdWxhdGlvbkNvdW50VGFibGVUb0JpdEVzdGltYXRlcygKKyAgICAgIFZBTFVFU19JTl9CWVRFLCBoaXN0by0+cmVkXywgbS0+cmVkXyk7CisgIENvbnZlcnRQb3B1bGF0aW9uQ291bnRUYWJsZVRvQml0RXN0aW1hdGVzKAorICAgICAgVkFMVUVTX0lOX0JZVEUsIGhpc3RvLT5ibHVlXywgbS0+Ymx1ZV8pOworICBDb252ZXJ0UG9wdWxhdGlvbkNvdW50VGFibGVUb0JpdEVzdGltYXRlcygKKyAgICAgIFZBTFVFU19JTl9CWVRFLCBoaXN0by0+YWxwaGFfLCBtLT5hbHBoYV8pOworICBDb252ZXJ0UG9wdWxhdGlvbkNvdW50VGFibGVUb0JpdEVzdGltYXRlcygKKyAgICAgIE5VTV9ESVNUQU5DRV9DT0RFUywgaGlzdG8tPmRpc3RhbmNlXywgbS0+ZGlzdGFuY2VfKTsKKyAgb2sgPSAxOworCisgRXJyb3I6CisgIFZQOExGcmVlSGlzdG9ncmFtKGhpc3RvKTsKKyAgcmV0dXJuIG9rOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgZG91YmxlIEdldExpdGVyYWxDb3N0KGNvbnN0IENvc3RNb2RlbCogY29uc3QgbSwgdWludDMyX3QgdikgeworICByZXR1cm4gbS0+YWxwaGFfW3YgPj4gMjRdICsKKyAgICAgICAgIG0tPnJlZF9bKHYgPj4gMTYpICYgMHhmZl0gKworICAgICAgICAgbS0+bGl0ZXJhbF9bKHYgPj4gOCkgJiAweGZmXSArCisgICAgICAgICBtLT5ibHVlX1t2ICYgMHhmZl07Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBkb3VibGUgR2V0Q2FjaGVDb3N0KGNvbnN0IENvc3RNb2RlbCogY29uc3QgbSwgdWludDMyX3QgaWR4KSB7CisgIGNvbnN0IGludCBsaXRlcmFsX2lkeCA9IFZBTFVFU19JTl9CWVRFICsgTlVNX0xFTkdUSF9DT0RFUyArIGlkeDsKKyAgcmV0dXJuIG0tPmxpdGVyYWxfW2xpdGVyYWxfaWR4XTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGRvdWJsZSBHZXRMZW5ndGhDb3N0KGNvbnN0IENvc3RNb2RlbCogY29uc3QgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsZW5ndGgpIHsKKyAgaW50IGNvZGUsIGV4dHJhX2JpdHM7CisgIFZQOExQcmVmaXhFbmNvZGVCaXRzKGxlbmd0aCwgJmNvZGUsICZleHRyYV9iaXRzKTsKKyAgcmV0dXJuIG0tPmxpdGVyYWxfW1ZBTFVFU19JTl9CWVRFICsgY29kZV0gKyBleHRyYV9iaXRzOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgZG91YmxlIEdldERpc3RhbmNlQ29zdChjb25zdCBDb3N0TW9kZWwqIGNvbnN0IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkaXN0YW5jZSkgeworICBpbnQgY29kZSwgZXh0cmFfYml0czsKKyAgVlA4TFByZWZpeEVuY29kZUJpdHMoZGlzdGFuY2UsICZjb2RlLCAmZXh0cmFfYml0cyk7CisgIHJldHVybiBtLT5kaXN0YW5jZV9bY29kZV0gKyBleHRyYV9iaXRzOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBBZGRTaW5nbGVMaXRlcmFsV2l0aENvc3RNb2RlbCgKKyAgICBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwgVlA4TENvbG9yQ2FjaGUqIGNvbnN0IGhhc2hlcnMsCisgICAgY29uc3QgQ29zdE1vZGVsKiBjb25zdCBjb3N0X21vZGVsLCBpbnQgaWR4LCBpbnQgdXNlX2NvbG9yX2NhY2hlLAorICAgIGZsb2F0IHByZXZfY29zdCwgZmxvYXQqIGNvbnN0IGNvc3QsIHVpbnQxNl90KiBjb25zdCBkaXN0X2FycmF5KSB7CisgIGRvdWJsZSBjb3N0X3ZhbCA9IHByZXZfY29zdDsKKyAgY29uc3QgdWludDMyX3QgY29sb3IgPSBhcmdiW2lkeF07CisgIGNvbnN0IGludCBpeCA9IHVzZV9jb2xvcl9jYWNoZSA/IFZQOExDb2xvckNhY2hlQ29udGFpbnMoaGFzaGVycywgY29sb3IpIDogLTE7CisgIGlmIChpeCA+PSAwKSB7CisgICAgLy8gdXNlX2NvbG9yX2NhY2hlIGlzIHRydWUgYW5kIGhhc2hlcnMgY29udGFpbnMgY29sb3IKKyAgICBjb25zdCBkb3VibGUgbXVsMCA9IDAuNjg7CisgICAgY29zdF92YWwgKz0gR2V0Q2FjaGVDb3N0KGNvc3RfbW9kZWwsIGl4KSAqIG11bDA7CisgIH0gZWxzZSB7CisgICAgY29uc3QgZG91YmxlIG11bDEgPSAwLjgyOworICAgIGlmICh1c2VfY29sb3JfY2FjaGUpIFZQOExDb2xvckNhY2hlSW5zZXJ0KGhhc2hlcnMsIGNvbG9yKTsKKyAgICBjb3N0X3ZhbCArPSBHZXRMaXRlcmFsQ29zdChjb3N0X21vZGVsLCBjb2xvcikgKiBtdWwxOworICB9CisgIGlmIChjb3N0W2lkeF0gPiBjb3N0X3ZhbCkgeworICAgIGNvc3RbaWR4XSA9IChmbG9hdCljb3N0X3ZhbDsKKyAgICBkaXN0X2FycmF5W2lkeF0gPSAxOyAgLy8gb25seSBvbmUgaXMgaW5zZXJ0ZWQuCisgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvc3RNYW5hZ2VyIGFuZCBpbnRlcnZhbCBoYW5kbGluZworCisvLyBFbXBpcmljYWwgdmFsdWUgdG8gYXZvaWQgaGlnaCBtZW1vcnkgY29uc3VtcHRpb24gYnV0IGdvb2QgZm9yIHBlcmZvcm1hbmNlLgorI2RlZmluZSBDT1NUX0NBQ0hFX0lOVEVSVkFMX1NJWkVfTUFYIDUwMAorCisvLyBUbyBwZXJmb3JtIGJhY2t3YXJkIHJlZmVyZW5jZSBldmVyeSBwaXhlbCBhdCBpbmRleCBpbmRleF8gaXMgY29uc2lkZXJlZCBhbmQKKy8vIHRoZSBjb3N0IGZvciB0aGUgTUFYX0xFTkdUSCBmb2xsb3dpbmcgcGl4ZWxzIGNvbXB1dGVkLiBUaG9zZSBmb2xsb3dpbmcgcGl4ZWxzCisvLyBhdCBpbmRleCBpbmRleF8gKyBrIChrIGZyb20gMCB0byBNQVhfTEVOR1RIKSBoYXZlIGEgY29zdCBvZjoKKy8vICAgICBjb3N0XyA9IGRpc3RhbmNlIGNvc3QgYXQgaW5kZXggKyBHZXRMZW5ndGhDb3N0KGNvc3RfbW9kZWwsIGspCisvLyBhbmQgdGhlIG1pbmltdW0gdmFsdWUgaXMga2VwdC4gR2V0TGVuZ3RoQ29zdChjb3N0X21vZGVsLCBrKSBpcyBjYWNoZWQgaW4gYW4KKy8vIGFycmF5IG9mIHNpemUgTUFYX0xFTkdUSC4KKy8vIEluc3RlYWQgb2YgcGVyZm9ybWluZyBNQVhfTEVOR1RIIGNvbXBhcmlzb25zIHBlciBwaXhlbCwgd2Uga2VlcCB0cmFjayBvZiB0aGUKKy8vIG1pbmltYWwgdmFsdWVzIHVzaW5nIGludGVydmFscyBvZiBjb25zdGFudCBjb3N0LgorLy8gQW4gaW50ZXJ2YWwgaXMgZGVmaW5lZCBieSB0aGUgaW5kZXhfIG9mIHRoZSBwaXhlbCB0aGF0IGdlbmVyYXRlZCBpdCBhbmQKKy8vIGlzIG9ubHkgdXNlZnVsIGluIGEgcmFuZ2Ugb2YgaW5kaWNlcyBmcm9tIHN0YXJ0XyB0byBlbmRfIChleGNsdXNpdmUpLCBpLmUuCisvLyBpdCBjb250YWlucyB0aGUgbWluaW11bSB2YWx1ZSBmb3IgcGl4ZWxzIGJldHdlZW4gc3RhcnRfIGFuZCBlbmRfLgorLy8gSW50ZXJ2YWxzIGFyZSBzdG9yZWQgaW4gYSBsaW5rZWQgbGlzdCBhbmQgb3JkZXJlZCBieSBzdGFydF8uIFdoZW4gYSBuZXcKKy8vIGludGVydmFsIGhhcyBhIGJldHRlciB2YWx1ZSwgb2xkIGludGVydmFscyBhcmUgc3BsaXQgb3IgcmVtb3ZlZC4gVGhlcmUgYXJlCisvLyB0aGVyZWZvcmUgbm8gb3ZlcmxhcHBpbmcgaW50ZXJ2YWxzLgordHlwZWRlZiBzdHJ1Y3QgQ29zdEludGVydmFsIENvc3RJbnRlcnZhbDsKK3N0cnVjdCBDb3N0SW50ZXJ2YWwgeworICBmbG9hdCBjb3N0XzsKKyAgaW50IHN0YXJ0XzsKKyAgaW50IGVuZF87CisgIGludCBpbmRleF87CisgIENvc3RJbnRlcnZhbCogcHJldmlvdXNfOworICBDb3N0SW50ZXJ2YWwqIG5leHRfOworfTsKKworLy8gVGhlIEdldExlbmd0aENvc3QoY29zdF9tb2RlbCwgaykgYXJlIGNhY2hlZCBpbiBhIENvc3RDYWNoZUludGVydmFsLgordHlwZWRlZiBzdHJ1Y3QgeworICBkb3VibGUgY29zdF87CisgIGludCBzdGFydF87CisgIGludCBlbmRfOyAgICAgICAvLyBFeGNsdXNpdmUuCit9IENvc3RDYWNoZUludGVydmFsOworCisvLyBUaGlzIHN0cnVjdHVyZSBpcyBpbiBjaGFyZ2Ugb2YgbWFuYWdpbmcgaW50ZXJ2YWxzIGFuZCBjb3N0cy4KKy8vIEl0IGNhY2hlcyB0aGUgZGlmZmVyZW50IENvc3RDYWNoZUludGVydmFsLCBjYWNoZXMgdGhlIGRpZmZlcmVudAorLy8gR2V0TGVuZ3RoQ29zdChjb3N0X21vZGVsLCBrKSBpbiBjb3N0X2NhY2hlXyBhbmQgdGhlIENvc3RJbnRlcnZhbCdzICh3aG9zZQorLy8gY291bnRfIGlzIGxpbWl0ZWQgYnkgQ09TVF9DQUNIRV9JTlRFUlZBTF9TSVpFX01BWCkuCisjZGVmaW5lIENPU1RfTUFOQUdFUl9NQVhfRlJFRV9MSVNUIDEwCit0eXBlZGVmIHN0cnVjdCB7CisgIENvc3RJbnRlcnZhbCogaGVhZF87CisgIGludCBjb3VudF87ICAvLyBUaGUgbnVtYmVyIG9mIHN0b3JlZCBpbnRlcnZhbHMuCisgIENvc3RDYWNoZUludGVydmFsKiBjYWNoZV9pbnRlcnZhbHNfOworICBzaXplX3QgY2FjaGVfaW50ZXJ2YWxzX3NpemVfOworICBkb3VibGUgY29zdF9jYWNoZV9bTUFYX0xFTkdUSF07ICAvLyBDb250YWlucyB0aGUgR2V0TGVuZ3RoQ29zdChjb3N0X21vZGVsLCBrKS4KKyAgZmxvYXQqIGNvc3RzXzsKKyAgdWludDE2X3QqIGRpc3RfYXJyYXlfOworICAvLyBNb3N0IG9mIHRoZSB0aW1lLCB3ZSBvbmx5IG5lZWQgZmV3IGludGVydmFscyAtPiB1c2UgYSBmcmVlLWxpc3QsIHRvIGF2b2lkCisgIC8vIGZyYWdtZW50YXRpb24gd2l0aCBzbWFsbCBhbGxvY3MgaW4gbW9zdCBjb21tb24gY2FzZXMuCisgIENvc3RJbnRlcnZhbCBpbnRlcnZhbHNfW0NPU1RfTUFOQUdFUl9NQVhfRlJFRV9MSVNUXTsKKyAgQ29zdEludGVydmFsKiBmcmVlX2ludGVydmFsc187CisgIC8vIFRoZXNlIGFyZSByZWd1bGFybHkgbWFsbG9jJ2QgcmVtYWlucy4gVGhpcyBsaXN0IGNhbid0IGdyb3cgbGFyZ2VyIHRoYW4gdGhhbgorICAvLyBzaXplIENPU1RfQ0FDSEVfSU5URVJWQUxfU0laRV9NQVggLSBDT1NUX01BTkFHRVJfTUFYX0ZSRUVfTElTVCwgbm90ZS4KKyAgQ29zdEludGVydmFsKiByZWN5Y2xlZF9pbnRlcnZhbHNfOworfSBDb3N0TWFuYWdlcjsKKworc3RhdGljIHZvaWQgQ29zdEludGVydmFsQWRkVG9GcmVlTGlzdChDb3N0TWFuYWdlciogY29uc3QgbWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29zdEludGVydmFsKiBjb25zdCBpbnRlcnZhbCkgeworICBpbnRlcnZhbC0+bmV4dF8gPSBtYW5hZ2VyLT5mcmVlX2ludGVydmFsc187CisgIG1hbmFnZXItPmZyZWVfaW50ZXJ2YWxzXyA9IGludGVydmFsOworfQorCitzdGF0aWMgaW50IENvc3RJbnRlcnZhbElzSW5GcmVlTGlzdChjb25zdCBDb3N0TWFuYWdlciogY29uc3QgbWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvc3RJbnRlcnZhbCogY29uc3QgaW50ZXJ2YWwpIHsKKyAgcmV0dXJuIChpbnRlcnZhbCA+PSAmbWFuYWdlci0+aW50ZXJ2YWxzX1swXSAmJgorICAgICAgICAgIGludGVydmFsIDw9ICZtYW5hZ2VyLT5pbnRlcnZhbHNfW0NPU1RfTUFOQUdFUl9NQVhfRlJFRV9MSVNUIC0gMV0pOworfQorCitzdGF0aWMgdm9pZCBDb3N0TWFuYWdlckluaXRGcmVlTGlzdChDb3N0TWFuYWdlciogY29uc3QgbWFuYWdlcikgeworICBpbnQgaTsKKyAgbWFuYWdlci0+ZnJlZV9pbnRlcnZhbHNfID0gTlVMTDsKKyAgZm9yIChpID0gMDsgaSA8IENPU1RfTUFOQUdFUl9NQVhfRlJFRV9MSVNUOyArK2kpIHsKKyAgICBDb3N0SW50ZXJ2YWxBZGRUb0ZyZWVMaXN0KG1hbmFnZXIsICZtYW5hZ2VyLT5pbnRlcnZhbHNfW2ldKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBEZWxldGVJbnRlcnZhbExpc3QoQ29zdE1hbmFnZXIqIGNvbnN0IG1hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29zdEludGVydmFsKiBpbnRlcnZhbCkgeworICB3aGlsZSAoaW50ZXJ2YWwgIT0gTlVMTCkgeworICAgIGNvbnN0IENvc3RJbnRlcnZhbCogY29uc3QgbmV4dCA9IGludGVydmFsLT5uZXh0XzsKKyAgICBpZiAoIUNvc3RJbnRlcnZhbElzSW5GcmVlTGlzdChtYW5hZ2VyLCBpbnRlcnZhbCkpIHsKKyAgICAgIFdlYlBTYWZlRnJlZSgodm9pZCopaW50ZXJ2YWwpOworICAgIH0gIC8vIGVsc2U6IGRvIG5vdGhpbmcKKyAgICBpbnRlcnZhbCA9IG5leHQ7CisgIH0KK30KKworc3RhdGljIHZvaWQgQ29zdE1hbmFnZXJDbGVhcihDb3N0TWFuYWdlciogY29uc3QgbWFuYWdlcikgeworICBpZiAobWFuYWdlciA9PSBOVUxMKSByZXR1cm47CisKKyAgV2ViUFNhZmVGcmVlKG1hbmFnZXItPmNvc3RzXyk7CisgIFdlYlBTYWZlRnJlZShtYW5hZ2VyLT5jYWNoZV9pbnRlcnZhbHNfKTsKKworICAvLyBDbGVhciB0aGUgaW50ZXJ2YWwgbGlzdHMuCisgIERlbGV0ZUludGVydmFsTGlzdChtYW5hZ2VyLCBtYW5hZ2VyLT5oZWFkXyk7CisgIG1hbmFnZXItPmhlYWRfID0gTlVMTDsKKyAgRGVsZXRlSW50ZXJ2YWxMaXN0KG1hbmFnZXIsIG1hbmFnZXItPnJlY3ljbGVkX2ludGVydmFsc18pOworICBtYW5hZ2VyLT5yZWN5Y2xlZF9pbnRlcnZhbHNfID0gTlVMTDsKKworICAvLyBSZXNldCBwb2ludGVycywgY291bnRfIGFuZCBjYWNoZV9pbnRlcnZhbHNfc2l6ZV8uCisgIG1lbXNldChtYW5hZ2VyLCAwLCBzaXplb2YoKm1hbmFnZXIpKTsKKyAgQ29zdE1hbmFnZXJJbml0RnJlZUxpc3QobWFuYWdlcik7Cit9CisKK3N0YXRpYyBpbnQgQ29zdE1hbmFnZXJJbml0KENvc3RNYW5hZ2VyKiBjb25zdCBtYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIGNvbnN0IGRpc3RfYXJyYXksIGludCBwaXhfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb3N0TW9kZWwqIGNvbnN0IGNvc3RfbW9kZWwpIHsKKyAgaW50IGk7CisgIGNvbnN0IGludCBjb3N0X2NhY2hlX3NpemUgPSAocGl4X2NvdW50ID4gTUFYX0xFTkdUSCkgPyBNQVhfTEVOR1RIIDogcGl4X2NvdW50OworCisgIG1hbmFnZXItPmNvc3RzXyA9IE5VTEw7CisgIG1hbmFnZXItPmNhY2hlX2ludGVydmFsc18gPSBOVUxMOworICBtYW5hZ2VyLT5oZWFkXyA9IE5VTEw7CisgIG1hbmFnZXItPnJlY3ljbGVkX2ludGVydmFsc18gPSBOVUxMOworICBtYW5hZ2VyLT5jb3VudF8gPSAwOworICBtYW5hZ2VyLT5kaXN0X2FycmF5XyA9IGRpc3RfYXJyYXk7CisgIENvc3RNYW5hZ2VySW5pdEZyZWVMaXN0KG1hbmFnZXIpOworCisgIC8vIEZpbGwgaW4gdGhlIGNvc3RfY2FjaGVfLgorICBtYW5hZ2VyLT5jYWNoZV9pbnRlcnZhbHNfc2l6ZV8gPSAxOworICBtYW5hZ2VyLT5jb3N0X2NhY2hlX1swXSA9IEdldExlbmd0aENvc3QoY29zdF9tb2RlbCwgMCk7CisgIGZvciAoaSA9IDE7IGkgPCBjb3N0X2NhY2hlX3NpemU7ICsraSkgeworICAgIG1hbmFnZXItPmNvc3RfY2FjaGVfW2ldID0gR2V0TGVuZ3RoQ29zdChjb3N0X21vZGVsLCBpKTsKKyAgICAvLyBHZXQgdGhlIG51bWJlciBvZiBib3VuZCBpbnRlcnZhbHMuCisgICAgaWYgKG1hbmFnZXItPmNvc3RfY2FjaGVfW2ldICE9IG1hbmFnZXItPmNvc3RfY2FjaGVfW2kgLSAxXSkgeworICAgICAgKyttYW5hZ2VyLT5jYWNoZV9pbnRlcnZhbHNfc2l6ZV87CisgICAgfQorICB9CisKKyAgLy8gV2l0aCB0aGUgY3VycmVudCBjb3N0IG1vZGVsLCB3ZSB1c3VhbGx5IGhhdmUgYmVsb3cgMjAgaW50ZXJ2YWxzLgorICAvLyBUaGUgd29yc3QgY2FzZSBzY2VuYXJpbyB3aXRoIGEgY29zdCBtb2RlbCB3b3VsZCBiZSBpZiBldmVyeSBsZW5ndGggaGFzIGEKKyAgLy8gZGlmZmVyZW50IGNvc3QsIGhlbmNlIE1BWF9MRU5HVEggYnV0IHRoYXQgaXMgaW1wb3NzaWJsZSB3aXRoIHRoZSBjdXJyZW50CisgIC8vIGltcGxlbWVudGF0aW9uIHRoYXQgc3BpcmFscyBhcm91bmQgYSBwaXhlbC4KKyAgYXNzZXJ0KG1hbmFnZXItPmNhY2hlX2ludGVydmFsc19zaXplXyA8PSBNQVhfTEVOR1RIKTsKKyAgbWFuYWdlci0+Y2FjaGVfaW50ZXJ2YWxzXyA9IChDb3N0Q2FjaGVJbnRlcnZhbCopV2ViUFNhZmVNYWxsb2MoCisgICAgICBtYW5hZ2VyLT5jYWNoZV9pbnRlcnZhbHNfc2l6ZV8sIHNpemVvZigqbWFuYWdlci0+Y2FjaGVfaW50ZXJ2YWxzXykpOworICBpZiAobWFuYWdlci0+Y2FjaGVfaW50ZXJ2YWxzXyA9PSBOVUxMKSB7CisgICAgQ29zdE1hbmFnZXJDbGVhcihtYW5hZ2VyKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vIEZpbGwgaW4gdGhlIGNhY2hlX2ludGVydmFsc18uCisgIHsKKyAgICBDb3N0Q2FjaGVJbnRlcnZhbCogY3VyID0gbWFuYWdlci0+Y2FjaGVfaW50ZXJ2YWxzXzsKKworICAgIC8vIENvbnNlY3V0aXZlIHZhbHVlcyBpbiBjb3N0X2NhY2hlXyBhcmUgY29tcGFyZWQgYW5kIGlmIGEgYmlnIGVub3VnaAorICAgIC8vIGRpZmZlcmVuY2UgaXMgZm91bmQsIGEgbmV3IGludGVydmFsIGlzIGNyZWF0ZWQgYW5kIGJvdW5kZWQuCisgICAgY3VyLT5zdGFydF8gPSAwOworICAgIGN1ci0+ZW5kXyA9IDE7CisgICAgY3VyLT5jb3N0XyA9IG1hbmFnZXItPmNvc3RfY2FjaGVfWzBdOworICAgIGZvciAoaSA9IDE7IGkgPCBjb3N0X2NhY2hlX3NpemU7ICsraSkgeworICAgICAgY29uc3QgZG91YmxlIGNvc3RfdmFsID0gbWFuYWdlci0+Y29zdF9jYWNoZV9baV07CisgICAgICBpZiAoY29zdF92YWwgIT0gY3VyLT5jb3N0XykgeworICAgICAgICArK2N1cjsKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSBhbiBpbnRlcnZhbC4KKyAgICAgICAgY3VyLT5zdGFydF8gPSBpOworICAgICAgICBjdXItPmNvc3RfID0gY29zdF92YWw7CisgICAgICB9CisgICAgICBjdXItPmVuZF8gPSBpICsgMTsKKyAgICB9CisgIH0KKworICBtYW5hZ2VyLT5jb3N0c18gPSAoZmxvYXQqKVdlYlBTYWZlTWFsbG9jKHBpeF9jb3VudCwgc2l6ZW9mKCptYW5hZ2VyLT5jb3N0c18pKTsKKyAgaWYgKG1hbmFnZXItPmNvc3RzXyA9PSBOVUxMKSB7CisgICAgQ29zdE1hbmFnZXJDbGVhcihtYW5hZ2VyKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICAvLyBTZXQgdGhlIGluaXRpYWwgY29zdHNfIGhpZ2ggZm9yIGV2ZXJ5IHBpeGVsIGFzIHdlIHdpbGwga2VlcCB0aGUgbWluaW11bS4KKyAgZm9yIChpID0gMDsgaSA8IHBpeF9jb3VudDsgKytpKSBtYW5hZ2VyLT5jb3N0c19baV0gPSAxZTM4ZjsKKworICByZXR1cm4gMTsKK30KKworLy8gR2l2ZW4gdGhlIGNvc3QgYW5kIHRoZSBwb3NpdGlvbiB0aGF0IGRlZmluZSBhbiBpbnRlcnZhbCwgdXBkYXRlIHRoZSBjb3N0IGF0CisvLyBwaXhlbCAnaScgaWYgaXQgaXMgc21hbGxlciB0aGFuIHRoZSBwcmV2aW91c2x5IGNvbXB1dGVkIHZhbHVlLgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVXBkYXRlQ29zdChDb3N0TWFuYWdlciogY29uc3QgbWFuYWdlciwgaW50IGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3NpdGlvbiwgZmxvYXQgY29zdCkgeworICBjb25zdCBpbnQgayA9IGkgLSBwb3NpdGlvbjsKKyAgYXNzZXJ0KGsgPj0gMCAmJiBrIDwgTUFYX0xFTkdUSCk7CisKKyAgaWYgKG1hbmFnZXItPmNvc3RzX1tpXSA+IGNvc3QpIHsKKyAgICBtYW5hZ2VyLT5jb3N0c19baV0gPSBjb3N0OworICAgIG1hbmFnZXItPmRpc3RfYXJyYXlfW2ldID0gayArIDE7CisgIH0KK30KKworLy8gR2l2ZW4gdGhlIGNvc3QgYW5kIHRoZSBwb3NpdGlvbiB0aGF0IGRlZmluZSBhbiBpbnRlcnZhbCwgdXBkYXRlIHRoZSBjb3N0IGZvcgorLy8gYWxsIHRoZSBwaXhlbHMgYmV0d2VlbiAnc3RhcnQnIGFuZCAnZW5kJyBleGNsdWRlZC4KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFVwZGF0ZUNvc3RQZXJJbnRlcnZhbChDb3N0TWFuYWdlciogY29uc3QgbWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsIGludCBlbmQsIGludCBwb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBjb3N0KSB7CisgIGludCBpOworICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSBVcGRhdGVDb3N0KG1hbmFnZXIsIGksIHBvc2l0aW9uLCBjb3N0KTsKK30KKworLy8gR2l2ZW4gdHdvIGludGVydmFscywgbWFrZSAncHJldicgYmUgdGhlIHByZXZpb3VzIG9uZSBvZiAnbmV4dCcgaW4gJ21hbmFnZXInLgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgQ29ubmVjdEludGVydmFscyhDb3N0TWFuYWdlciogY29uc3QgbWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29zdEludGVydmFsKiBjb25zdCBwcmV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3N0SW50ZXJ2YWwqIGNvbnN0IG5leHQpIHsKKyAgaWYgKHByZXYgIT0gTlVMTCkgeworICAgIHByZXYtPm5leHRfID0gbmV4dDsKKyAgfSBlbHNlIHsKKyAgICBtYW5hZ2VyLT5oZWFkXyA9IG5leHQ7CisgIH0KKworICBpZiAobmV4dCAhPSBOVUxMKSBuZXh0LT5wcmV2aW91c18gPSBwcmV2OworfQorCisvLyBQb3AgYW4gaW50ZXJ2YWwgaW4gdGhlIG1hbmFnZXIuCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBQb3BJbnRlcnZhbChDb3N0TWFuYWdlciogY29uc3QgbWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvc3RJbnRlcnZhbCogY29uc3QgaW50ZXJ2YWwpIHsKKyAgaWYgKGludGVydmFsID09IE5VTEwpIHJldHVybjsKKworICBDb25uZWN0SW50ZXJ2YWxzKG1hbmFnZXIsIGludGVydmFsLT5wcmV2aW91c18sIGludGVydmFsLT5uZXh0Xyk7CisgIGlmIChDb3N0SW50ZXJ2YWxJc0luRnJlZUxpc3QobWFuYWdlciwgaW50ZXJ2YWwpKSB7CisgICAgQ29zdEludGVydmFsQWRkVG9GcmVlTGlzdChtYW5hZ2VyLCBpbnRlcnZhbCk7CisgIH0gZWxzZSB7ICAvLyByZWN5Y2xlIHJlZ3VsYXJseSBtYWxsb2MnZCBpbnRlcnZhbHMgdG9vCisgICAgaW50ZXJ2YWwtPm5leHRfID0gbWFuYWdlci0+cmVjeWNsZWRfaW50ZXJ2YWxzXzsKKyAgICBtYW5hZ2VyLT5yZWN5Y2xlZF9pbnRlcnZhbHNfID0gaW50ZXJ2YWw7CisgIH0KKyAgLS1tYW5hZ2VyLT5jb3VudF87CisgIGFzc2VydChtYW5hZ2VyLT5jb3VudF8gPj0gMCk7Cit9CisKKy8vIFVwZGF0ZSB0aGUgY29zdCBhdCBpbmRleCBpIGJ5IGdvaW5nIG92ZXIgYWxsIHRoZSBzdG9yZWQgaW50ZXJ2YWxzIHRoYXQKKy8vIG92ZXJsYXAgd2l0aCBpLgorLy8gSWYgJ2RvX2NsZWFuX2ludGVydmFscycgaXMgc2V0IHRvIHNvbWV0aGluZyBkaWZmZXJlbnQgdGhhbiAwLCBpbnRlcnZhbHMgdGhhdAorLy8gZW5kIGJlZm9yZSAnaScgd2lsbCBiZSBwb3BwZWQuCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBVcGRhdGVDb3N0QXRJbmRleChDb3N0TWFuYWdlciogY29uc3QgbWFuYWdlciwgaW50IGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZG9fY2xlYW5faW50ZXJ2YWxzKSB7CisgIENvc3RJbnRlcnZhbCogY3VycmVudCA9IG1hbmFnZXItPmhlYWRfOworCisgIHdoaWxlIChjdXJyZW50ICE9IE5VTEwgJiYgY3VycmVudC0+c3RhcnRfIDw9IGkpIHsKKyAgICBDb3N0SW50ZXJ2YWwqIGNvbnN0IG5leHQgPSBjdXJyZW50LT5uZXh0XzsKKyAgICBpZiAoY3VycmVudC0+ZW5kXyA8PSBpKSB7CisgICAgICBpZiAoZG9fY2xlYW5faW50ZXJ2YWxzKSB7CisgICAgICAgIC8vIFdlIGhhdmUgYW4gb3V0ZGF0ZWQgaW50ZXJ2YWwsIHJlbW92ZSBpdC4KKyAgICAgICAgUG9wSW50ZXJ2YWwobWFuYWdlciwgY3VycmVudCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIFVwZGF0ZUNvc3QobWFuYWdlciwgaSwgY3VycmVudC0+aW5kZXhfLCBjdXJyZW50LT5jb3N0Xyk7CisgICAgfQorICAgIGN1cnJlbnQgPSBuZXh0OworICB9Cit9CisKKy8vIEdpdmVuIGEgY3VycmVudCBvcnBoYW4gaW50ZXJ2YWwgYW5kIGl0cyBwcmV2aW91cyBpbnRlcnZhbCwgYmVmb3JlCisvLyBpdCB3YXMgb3JwaGFuZWQgKHdoaWNoIGNhbiBiZSBOVUxMKSwgc2V0IGl0IGF0IHRoZSByaWdodCBwbGFjZSBpbiB0aGUgbGlzdAorLy8gb2YgaW50ZXJ2YWxzIHVzaW5nIHRoZSBzdGFydF8gb3JkZXJpbmcgYW5kIHRoZSBwcmV2aW91cyBpbnRlcnZhbCBhcyBhIGhpbnQuCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBQb3NpdGlvbk9ycGhhbkludGVydmFsKENvc3RNYW5hZ2VyKiBjb25zdCBtYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3N0SW50ZXJ2YWwqIGNvbnN0IGN1cnJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvc3RJbnRlcnZhbCogcHJldmlvdXMpIHsKKyAgYXNzZXJ0KGN1cnJlbnQgIT0gTlVMTCk7CisKKyAgaWYgKHByZXZpb3VzID09IE5VTEwpIHByZXZpb3VzID0gbWFuYWdlci0+aGVhZF87CisgIHdoaWxlIChwcmV2aW91cyAhPSBOVUxMICYmIGN1cnJlbnQtPnN0YXJ0XyA8IHByZXZpb3VzLT5zdGFydF8pIHsKKyAgICBwcmV2aW91cyA9IHByZXZpb3VzLT5wcmV2aW91c187CisgIH0KKyAgd2hpbGUgKHByZXZpb3VzICE9IE5VTEwgJiYgcHJldmlvdXMtPm5leHRfICE9IE5VTEwgJiYKKyAgICAgICAgIHByZXZpb3VzLT5uZXh0Xy0+c3RhcnRfIDwgY3VycmVudC0+c3RhcnRfKSB7CisgICAgcHJldmlvdXMgPSBwcmV2aW91cy0+bmV4dF87CisgIH0KKworICBpZiAocHJldmlvdXMgIT0gTlVMTCkgeworICAgIENvbm5lY3RJbnRlcnZhbHMobWFuYWdlciwgY3VycmVudCwgcHJldmlvdXMtPm5leHRfKTsKKyAgfSBlbHNlIHsKKyAgICBDb25uZWN0SW50ZXJ2YWxzKG1hbmFnZXIsIGN1cnJlbnQsIG1hbmFnZXItPmhlYWRfKTsKKyAgfQorICBDb25uZWN0SW50ZXJ2YWxzKG1hbmFnZXIsIHByZXZpb3VzLCBjdXJyZW50KTsKK30KKworLy8gSW5zZXJ0IGFuIGludGVydmFsIGluIHRoZSBsaXN0IGNvbnRhaW5lZCBpbiB0aGUgbWFuYWdlciBieSBzdGFydGluZyBhdAorLy8gaW50ZXJ2YWxfaW4gYXMgYSBoaW50LiBUaGUgaW50ZXJ2YWxzIGFyZSBzb3J0ZWQgYnkgc3RhcnRfIHZhbHVlLgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgSW5zZXJ0SW50ZXJ2YWwoQ29zdE1hbmFnZXIqIGNvbnN0IG1hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3N0SW50ZXJ2YWwqIGNvbnN0IGludGVydmFsX2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgY29zdCwgaW50IHBvc2l0aW9uLCBpbnQgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW5kKSB7CisgIENvc3RJbnRlcnZhbCogaW50ZXJ2YWxfbmV3OworCisgIGlmIChzdGFydCA+PSBlbmQpIHJldHVybjsKKyAgaWYgKG1hbmFnZXItPmNvdW50XyA+PSBDT1NUX0NBQ0hFX0lOVEVSVkFMX1NJWkVfTUFYKSB7CisgICAgLy8gU2VyaWFsaXplIHRoZSBpbnRlcnZhbCBpZiB3ZSBjYW5ub3Qgc3RvcmUgaXQuCisgICAgVXBkYXRlQ29zdFBlckludGVydmFsKG1hbmFnZXIsIHN0YXJ0LCBlbmQsIHBvc2l0aW9uLCBjb3N0KTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKG1hbmFnZXItPmZyZWVfaW50ZXJ2YWxzXyAhPSBOVUxMKSB7CisgICAgaW50ZXJ2YWxfbmV3ID0gbWFuYWdlci0+ZnJlZV9pbnRlcnZhbHNfOworICAgIG1hbmFnZXItPmZyZWVfaW50ZXJ2YWxzXyA9IGludGVydmFsX25ldy0+bmV4dF87CisgIH0gZWxzZSBpZiAobWFuYWdlci0+cmVjeWNsZWRfaW50ZXJ2YWxzXyAhPSBOVUxMKSB7CisgICAgaW50ZXJ2YWxfbmV3ID0gbWFuYWdlci0+cmVjeWNsZWRfaW50ZXJ2YWxzXzsKKyAgICBtYW5hZ2VyLT5yZWN5Y2xlZF9pbnRlcnZhbHNfID0gaW50ZXJ2YWxfbmV3LT5uZXh0XzsKKyAgfSBlbHNlIHsgIC8vIG1hbGxvYyBmb3IgZ29vZAorICAgIGludGVydmFsX25ldyA9IChDb3N0SW50ZXJ2YWwqKVdlYlBTYWZlTWFsbG9jKDEsIHNpemVvZigqaW50ZXJ2YWxfbmV3KSk7CisgICAgaWYgKGludGVydmFsX25ldyA9PSBOVUxMKSB7CisgICAgICAvLyBXcml0ZSBkb3duIHRoZSBpbnRlcnZhbCBpZiB3ZSBjYW5ub3QgY3JlYXRlIGl0LgorICAgICAgVXBkYXRlQ29zdFBlckludGVydmFsKG1hbmFnZXIsIHN0YXJ0LCBlbmQsIHBvc2l0aW9uLCBjb3N0KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICBpbnRlcnZhbF9uZXctPmNvc3RfID0gY29zdDsKKyAgaW50ZXJ2YWxfbmV3LT5pbmRleF8gPSBwb3NpdGlvbjsKKyAgaW50ZXJ2YWxfbmV3LT5zdGFydF8gPSBzdGFydDsKKyAgaW50ZXJ2YWxfbmV3LT5lbmRfID0gZW5kOworICBQb3NpdGlvbk9ycGhhbkludGVydmFsKG1hbmFnZXIsIGludGVydmFsX25ldywgaW50ZXJ2YWxfaW4pOworCisgICsrbWFuYWdlci0+Y291bnRfOworfQorCisvLyBHaXZlbiBhIG5ldyBjb3N0IGludGVydmFsIGRlZmluZWQgYnkgaXRzIHN0YXJ0IGF0IHBvc2l0aW9uLCBpdHMgbGVuZ3RoIHZhbHVlCisvLyBhbmQgZGlzdGFuY2VfY29zdCwgYWRkIGl0cyBjb250cmlidXRpb25zIHRvIHRoZSBwcmV2aW91cyBpbnRlcnZhbHMgYW5kIGNvc3RzLgorLy8gSWYgaGFuZGxpbmcgdGhlIGludGVydmFsIG9yIG9uZSBvZiBpdHMgc3ViaW50ZXJ2YWxzIGJlY29tZXMgdG8gaGVhdnksIGl0cworLy8gY29udHJpYnV0aW9uIGlzIGFkZGVkIHRvIHRoZSBjb3N0cyByaWdodCBhd2F5Lgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUHVzaEludGVydmFsKENvc3RNYW5hZ2VyKiBjb25zdCBtYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkaXN0YW5jZV9jb3N0LCBpbnQgcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbikgeworICBzaXplX3QgaTsKKyAgQ29zdEludGVydmFsKiBpbnRlcnZhbCA9IG1hbmFnZXItPmhlYWRfOworICBDb3N0SW50ZXJ2YWwqIGludGVydmFsX25leHQ7CisgIGNvbnN0IENvc3RDYWNoZUludGVydmFsKiBjb25zdCBjb3N0X2NhY2hlX2ludGVydmFscyA9CisgICAgICBtYW5hZ2VyLT5jYWNoZV9pbnRlcnZhbHNfOworICAvLyBJZiB0aGUgaW50ZXJ2YWwgaXMgc21hbGwgZW5vdWdoLCBubyBuZWVkIHRvIGRlYWwgd2l0aCB0aGUgaGVhdnkKKyAgLy8gaW50ZXJ2YWwgbG9naWMsIGp1c3Qgc2VyaWFsaXplIGl0IHJpZ2h0IGF3YXkuIFRoaXMgY29uc3RhbnQgaXMgZW1waXJpY2FsLgorICBjb25zdCBpbnQga1NraXBEaXN0YW5jZSA9IDEwOworCisgIGlmIChsZW4gPCBrU2tpcERpc3RhbmNlKSB7CisgICAgaW50IGo7CisgICAgZm9yIChqID0gcG9zaXRpb247IGogPCBwb3NpdGlvbiArIGxlbjsgKytqKSB7CisgICAgICBjb25zdCBpbnQgayA9IGogLSBwb3NpdGlvbjsKKyAgICAgIGZsb2F0IGNvc3RfdG1wOworICAgICAgYXNzZXJ0KGsgPj0gMCAmJiBrIDwgTUFYX0xFTkdUSCk7CisgICAgICBjb3N0X3RtcCA9IChmbG9hdCkoZGlzdGFuY2VfY29zdCArIG1hbmFnZXItPmNvc3RfY2FjaGVfW2tdKTsKKworICAgICAgaWYgKG1hbmFnZXItPmNvc3RzX1tqXSA+IGNvc3RfdG1wKSB7CisgICAgICAgIG1hbmFnZXItPmNvc3RzX1tqXSA9IGNvc3RfdG1wOworICAgICAgICBtYW5hZ2VyLT5kaXN0X2FycmF5X1tqXSA9IGsgKyAxOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm47CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgbWFuYWdlci0+Y2FjaGVfaW50ZXJ2YWxzX3NpemVfICYmCisgICAgICAgICAgICAgIGNvc3RfY2FjaGVfaW50ZXJ2YWxzW2ldLnN0YXJ0XyA8IGxlbjsKKyAgICAgICArK2kpIHsKKyAgICAvLyBEZWZpbmUgdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgaXRoIGludGVydmFsIHdpdGggdGhlIG5ldyBvbmUuCisgICAgaW50IHN0YXJ0ID0gcG9zaXRpb24gKyBjb3N0X2NhY2hlX2ludGVydmFsc1tpXS5zdGFydF87CisgICAgY29uc3QgaW50IGVuZCA9IHBvc2l0aW9uICsgKGNvc3RfY2FjaGVfaW50ZXJ2YWxzW2ldLmVuZF8gPiBsZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNvc3RfY2FjaGVfaW50ZXJ2YWxzW2ldLmVuZF8pOworICAgIGNvbnN0IGZsb2F0IGNvc3QgPSAoZmxvYXQpKGRpc3RhbmNlX2Nvc3QgKyBjb3N0X2NhY2hlX2ludGVydmFsc1tpXS5jb3N0Xyk7CisKKyAgICBmb3IgKDsgaW50ZXJ2YWwgIT0gTlVMTCAmJiBpbnRlcnZhbC0+c3RhcnRfIDwgZW5kOworICAgICAgICAgaW50ZXJ2YWwgPSBpbnRlcnZhbF9uZXh0KSB7CisgICAgICBpbnRlcnZhbF9uZXh0ID0gaW50ZXJ2YWwtPm5leHRfOworCisgICAgICAvLyBNYWtlIHN1cmUgd2UgaGF2ZSBzb21lIG92ZXJsYXAKKyAgICAgIGlmIChzdGFydCA+PSBpbnRlcnZhbC0+ZW5kXykgY29udGludWU7CisKKyAgICAgIGlmIChjb3N0ID49IGludGVydmFsLT5jb3N0XykgeworICAgICAgICAvLyBXaGVuIGludGVydmFscyBhcmUgcmVwcmVzZW50ZWQsIHRoZSBsb3dlciwgdGhlIGJldHRlci4KKyAgICAgICAgLy8gWyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipbCisgICAgICAgIC8vIHN0YXJ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAvLyAgICAgICAgICAgICAgICAgICBbLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVsKKyAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgaW50ZXJ2YWwtPnN0YXJ0XyAgICAgICBpbnRlcnZhbC0+ZW5kXworICAgICAgICAvLyBJZiB3ZSBhcmUgd29yc2UgdGhhbiB3aGF0IHdlIGFscmVhZHkgaGF2ZSwgYWRkIHdoYXRldmVyIHdlIGhhdmUgc28KKyAgICAgICAgLy8gZmFyIHVwIHRvIGludGVydmFsLgorICAgICAgICBjb25zdCBpbnQgc3RhcnRfbmV3ID0gaW50ZXJ2YWwtPmVuZF87CisgICAgICAgIEluc2VydEludGVydmFsKG1hbmFnZXIsIGludGVydmFsLCBjb3N0LCBwb3NpdGlvbiwgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgIGludGVydmFsLT5zdGFydF8pOworICAgICAgICBzdGFydCA9IHN0YXJ0X25ldzsKKyAgICAgICAgaWYgKHN0YXJ0ID49IGVuZCkgYnJlYWs7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZiAoc3RhcnQgPD0gaW50ZXJ2YWwtPnN0YXJ0XykgeworICAgICAgICBpZiAoaW50ZXJ2YWwtPmVuZF8gPD0gZW5kKSB7CisgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgWy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bCisgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgaW50ZXJ2YWwtPnN0YXJ0XyAgICAgICBpbnRlcnZhbC0+ZW5kXworICAgICAgICAgIC8vIFsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlsKKyAgICAgICAgICAvLyBzdGFydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgLy8gV2UgY2FuIHNhZmVseSByZW1vdmUgdGhlIG9sZCBpbnRlcnZhbCBhcyBpdCBpcyBmdWxseSBpbmNsdWRlZC4KKyAgICAgICAgICBQb3BJbnRlcnZhbChtYW5hZ2VyLCBpbnRlcnZhbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gICAgICAgICAgICAgIFstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bCisgICAgICAgICAgLy8gICAgICAgICAgICAgIGludGVydmFsLT5zdGFydF8gICAgICAgIGludGVydmFsLT5lbmRfCisgICAgICAgICAgLy8gWyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqWworICAgICAgICAgIC8vIHN0YXJ0ICAgICAgICAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICBpbnRlcnZhbC0+c3RhcnRfID0gZW5kOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoZW5kIDwgaW50ZXJ2YWwtPmVuZF8pIHsKKyAgICAgICAgICAvLyBbLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bCisgICAgICAgICAgLy8gaW50ZXJ2YWwtPnN0YXJ0XyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnZhbC0+ZW5kXworICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgWyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqWworICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgc3RhcnQgICAgICAgICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgIC8vIFdlIGhhdmUgdG8gc3BsaXQgdGhlIG9sZCBpbnRlcnZhbCBhcyBpdCBmdWxseSBjb250YWlucyB0aGUgbmV3IG9uZS4KKyAgICAgICAgICBjb25zdCBpbnQgZW5kX29yaWdpbmFsID0gaW50ZXJ2YWwtPmVuZF87CisgICAgICAgICAgaW50ZXJ2YWwtPmVuZF8gPSBzdGFydDsKKyAgICAgICAgICBJbnNlcnRJbnRlcnZhbChtYW5hZ2VyLCBpbnRlcnZhbCwgaW50ZXJ2YWwtPmNvc3RfLCBpbnRlcnZhbC0+aW5kZXhfLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwgZW5kX29yaWdpbmFsKTsKKyAgICAgICAgICBpbnRlcnZhbCA9IGludGVydmFsLT5uZXh0XzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBbLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tWworICAgICAgICAgIC8vIGludGVydmFsLT5zdGFydF8gICAgICAgIGludGVydmFsLT5lbmRfCisgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICBbKioqKioqKioqKioqKioqKioqKioqKioqKioqKipbCisgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICBzdGFydCAgICAgICAgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgaW50ZXJ2YWwtPmVuZF8gPSBzdGFydDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAvLyBJbnNlcnQgdGhlIHJlbWFpbmluZyBpbnRlcnZhbCBmcm9tIHN0YXJ0IHRvIGVuZC4KKyAgICBJbnNlcnRJbnRlcnZhbChtYW5hZ2VyLCBpbnRlcnZhbCwgY29zdCwgcG9zaXRpb24sIHN0YXJ0LCBlbmQpOworICB9Cit9CisKK3N0YXRpYyBpbnQgQmFja3dhcmRSZWZlcmVuY2VzSGFzaENoYWluRGlzdGFuY2VPbmx5KAorICAgIGludCB4c2l6ZSwgaW50IHlzaXplLCBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwgaW50IGNhY2hlX2JpdHMsCisgICAgY29uc3QgVlA4TEhhc2hDaGFpbiogY29uc3QgaGFzaF9jaGFpbiwgY29uc3QgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcywKKyAgICB1aW50MTZfdCogY29uc3QgZGlzdF9hcnJheSkgeworICBpbnQgaTsKKyAgaW50IG9rID0gMDsKKyAgaW50IGNjX2luaXQgPSAwOworICBjb25zdCBpbnQgcGl4X2NvdW50ID0geHNpemUgKiB5c2l6ZTsKKyAgY29uc3QgaW50IHVzZV9jb2xvcl9jYWNoZSA9IChjYWNoZV9iaXRzID4gMCk7CisgIGNvbnN0IHNpemVfdCBsaXRlcmFsX2FycmF5X3NpemUgPQorICAgICAgc2l6ZW9mKGRvdWJsZSkgKiAoTlVNX0xJVEVSQUxfQ09ERVMgKyBOVU1fTEVOR1RIX0NPREVTICsKKyAgICAgICAgICAgICAgICAgICAgICAgICgoY2FjaGVfYml0cyA+IDApID8gKDEgPDwgY2FjaGVfYml0cykgOiAwKSk7CisgIGNvbnN0IHNpemVfdCBjb3N0X21vZGVsX3NpemUgPSBzaXplb2YoQ29zdE1vZGVsKSArIGxpdGVyYWxfYXJyYXlfc2l6ZTsKKyAgQ29zdE1vZGVsKiBjb25zdCBjb3N0X21vZGVsID0KKyAgICAgIChDb3N0TW9kZWwqKVdlYlBTYWZlQ2FsbG9jKDFVTEwsIGNvc3RfbW9kZWxfc2l6ZSk7CisgIFZQOExDb2xvckNhY2hlIGhhc2hlcnM7CisgIENvc3RNYW5hZ2VyKiBjb3N0X21hbmFnZXIgPQorICAgICAgKENvc3RNYW5hZ2VyKilXZWJQU2FmZU1hbGxvYygxVUxMLCBzaXplb2YoKmNvc3RfbWFuYWdlcikpOworICBpbnQgb2Zmc2V0X3ByZXYgPSAtMSwgbGVuX3ByZXYgPSAtMTsKKyAgZG91YmxlIG9mZnNldF9jb3N0ID0gLTE7CisgIGludCBmaXJzdF9vZmZzZXRfaXNfY29uc3RhbnQgPSAtMTsgIC8vIGluaXRpYWxpemVkIHdpdGggJ2ltcG9zc2libGUnIHZhbHVlCisgIGludCByZWFjaCA9IDA7CisKKyAgaWYgKGNvc3RfbW9kZWwgPT0gTlVMTCB8fCBjb3N0X21hbmFnZXIgPT0gTlVMTCkgZ290byBFcnJvcjsKKworICBjb3N0X21vZGVsLT5saXRlcmFsXyA9IChkb3VibGUqKShjb3N0X21vZGVsICsgMSk7CisgIGlmICh1c2VfY29sb3JfY2FjaGUpIHsKKyAgICBjY19pbml0ID0gVlA4TENvbG9yQ2FjaGVJbml0KCZoYXNoZXJzLCBjYWNoZV9iaXRzKTsKKyAgICBpZiAoIWNjX2luaXQpIGdvdG8gRXJyb3I7CisgIH0KKworICBpZiAoIUNvc3RNb2RlbEJ1aWxkKGNvc3RfbW9kZWwsIHhzaXplLCBjYWNoZV9iaXRzLCByZWZzKSkgeworICAgIGdvdG8gRXJyb3I7CisgIH0KKworICBpZiAoIUNvc3RNYW5hZ2VySW5pdChjb3N0X21hbmFnZXIsIGRpc3RfYXJyYXksIHBpeF9jb3VudCwgY29zdF9tb2RlbCkpIHsKKyAgICBnb3RvIEVycm9yOworICB9CisKKyAgLy8gV2UgbG9vcCBvbmUgcGl4ZWwgYXQgYSB0aW1lLCBidXQgc3RvcmUgYWxsIGN1cnJlbnRseSBiZXN0IHBvaW50cyB0bworICAvLyBub24tcHJvY2Vzc2VkIGxvY2F0aW9ucyBmcm9tIHRoaXMgcG9pbnQuCisgIGRpc3RfYXJyYXlbMF0gPSAwOworICAvLyBBZGQgZmlyc3QgcGl4ZWwgYXMgbGl0ZXJhbC4KKyAgQWRkU2luZ2xlTGl0ZXJhbFdpdGhDb3N0TW9kZWwoYXJnYiwgJmhhc2hlcnMsIGNvc3RfbW9kZWwsIDAsIHVzZV9jb2xvcl9jYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC5mLCBjb3N0X21hbmFnZXItPmNvc3RzXywgZGlzdF9hcnJheSk7CisKKyAgZm9yIChpID0gMTsgaSA8IHBpeF9jb3VudDsgKytpKSB7CisgICAgY29uc3QgZmxvYXQgcHJldl9jb3N0ID0gY29zdF9tYW5hZ2VyLT5jb3N0c19baSAtIDFdOworICAgIGludCBvZmZzZXQsIGxlbjsKKyAgICBWUDhMSGFzaENoYWluRmluZENvcHkoaGFzaF9jaGFpbiwgaSwgJm9mZnNldCwgJmxlbik7CisKKyAgICAvLyBUcnkgYWRkaW5nIHRoZSBwaXhlbCBhcyBhIGxpdGVyYWwuCisgICAgQWRkU2luZ2xlTGl0ZXJhbFdpdGhDb3N0TW9kZWwoYXJnYiwgJmhhc2hlcnMsIGNvc3RfbW9kZWwsIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlX2NvbG9yX2NhY2hlLCBwcmV2X2Nvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zdF9tYW5hZ2VyLT5jb3N0c18sIGRpc3RfYXJyYXkpOworCisgICAgLy8gSWYgd2UgYXJlIGRlYWxpbmcgd2l0aCBhIG5vbi1saXRlcmFsLgorICAgIGlmIChsZW4gPj0gMikgeworICAgICAgaWYgKG9mZnNldCAhPSBvZmZzZXRfcHJldikgeworICAgICAgICBjb25zdCBpbnQgY29kZSA9IFZQOExEaXN0YW5jZVRvUGxhbmVDb2RlKHhzaXplLCBvZmZzZXQpOworICAgICAgICBvZmZzZXRfY29zdCA9IEdldERpc3RhbmNlQ29zdChjb3N0X21vZGVsLCBjb2RlKTsKKyAgICAgICAgZmlyc3Rfb2Zmc2V0X2lzX2NvbnN0YW50ID0gMTsKKyAgICAgICAgUHVzaEludGVydmFsKGNvc3RfbWFuYWdlciwgcHJldl9jb3N0ICsgb2Zmc2V0X2Nvc3QsIGksIGxlbik7CisgICAgICB9IGVsc2UgeworICAgICAgICBhc3NlcnQob2Zmc2V0X2Nvc3QgPj0gMCk7CisgICAgICAgIGFzc2VydChsZW5fcHJldiA+PSAwKTsKKyAgICAgICAgYXNzZXJ0KGZpcnN0X29mZnNldF9pc19jb25zdGFudCA9PSAwIHx8IGZpcnN0X29mZnNldF9pc19jb25zdGFudCA9PSAxKTsKKyAgICAgICAgLy8gSW5zdGVhZCBvZiBjb25zaWRlcmluZyBhbGwgY29udHJpYnV0aW9ucyBmcm9tIGEgcGl4ZWwgaSBieSBjYWxsaW5nOgorICAgICAgICAvLyAgICAgICAgIFB1c2hJbnRlcnZhbChjb3N0X21hbmFnZXIsIHByZXZfY29zdCArIG9mZnNldF9jb3N0LCBpLCBsZW4pOworICAgICAgICAvLyB3ZSBvcHRpbWl6ZSB0aGVzZSBjb250cmlidXRpb25zIGluIGNhc2Ugb2Zmc2V0X2Nvc3Qgc3RheXMgdGhlIHNhbWUKKyAgICAgICAgLy8gZm9yIGNvbnNlY3V0aXZlIHBpeGVscy4gVGhpcyBkZXNjcmliZXMgYSBzZXQgb2YgcGl4ZWxzIHNpbWlsYXIgdG8gYQorICAgICAgICAvLyBwcmV2aW91cyBzZXQgKGUuZy4gY29uc3RhbnQgY29sb3IgcmVnaW9ucykuCisgICAgICAgIGlmIChmaXJzdF9vZmZzZXRfaXNfY29uc3RhbnQpIHsKKyAgICAgICAgICByZWFjaCA9IGkgLSAxICsgbGVuX3ByZXYgLSAxOworICAgICAgICAgIGZpcnN0X29mZnNldF9pc19jb25zdGFudCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaSArIGxlbiAtIDEgPiByZWFjaCkgeworICAgICAgICAgIC8vIFdlIGNhbiBvbmx5IGJlIGdvIGZ1cnRoZXIgd2l0aCB0aGUgc2FtZSBvZmZzZXQgaWYgdGhlIHByZXZpb3VzCisgICAgICAgICAgLy8gbGVuZ3RoIHdhcyBtYXhlZCwgaGVuY2UgbGVuX3ByZXYgPT0gbGVuID09IE1BWF9MRU5HVEguCisgICAgICAgICAgLy8gVE9ETyh2cmFiYXVkKSwgYnVtcCBpIHRvIHRoZSBlbmQgcmlnaHQgYXdheSAoaW5zZXJ0IGNhY2hlIGFuZAorICAgICAgICAgIC8vIHVwZGF0ZSBjb3N0KS4KKyAgICAgICAgICAvLyBUT0RPKHZyYWJhdWQpLCBjaGVjayBpZiBvbmUgb2YgdGhlIHBvaW50cyBpbiBiZXR3ZWVuIGRvZXMgbm90IGhhdmUKKyAgICAgICAgICAvLyBhIGxvd2VyIGNvc3QuCisgICAgICAgICAgLy8gQWxyZWFkeSBjb25zaWRlciB0aGUgcGl4ZWwgYXQgInJlYWNoIiB0byBhZGQgaW50ZXJ2YWxzIHRoYXQgYXJlCisgICAgICAgICAgLy8gYmV0dGVyIHRoYW4gd2hhdGV2ZXIgd2UgYWRkLgorICAgICAgICAgIGludCBvZmZzZXRfaiwgbGVuX2ogPSAwOworICAgICAgICAgIGludCBqOworICAgICAgICAgIGFzc2VydChsZW4gPT0gTUFYX0xFTkdUSCB8fCBsZW4gPT0gcGl4X2NvdW50IC0gaSk7CisgICAgICAgICAgLy8gRmlndXJlIG91dCB0aGUgbGFzdCBjb25zZWN1dGl2ZSBwaXhlbCB3aXRoaW4gW2ksIHJlYWNoICsgMV0gd2l0aAorICAgICAgICAgIC8vIHRoZSBzYW1lIG9mZnNldC4KKyAgICAgICAgICBmb3IgKGogPSBpOyBqIDw9IHJlYWNoOyArK2opIHsKKyAgICAgICAgICAgIFZQOExIYXNoQ2hhaW5GaW5kQ29weShoYXNoX2NoYWluLCBqICsgMSwgJm9mZnNldF9qLCAmbGVuX2opOworICAgICAgICAgICAgaWYgKG9mZnNldF9qICE9IG9mZnNldCkgeworICAgICAgICAgICAgICBWUDhMSGFzaENoYWluRmluZENvcHkoaGFzaF9jaGFpbiwgaiwgJm9mZnNldF9qLCAmbGVuX2opOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgLy8gVXBkYXRlIHRoZSBjb3N0IGF0IGogLSAxIGFuZCBqLgorICAgICAgICAgIFVwZGF0ZUNvc3RBdEluZGV4KGNvc3RfbWFuYWdlciwgaiAtIDEsIDApOworICAgICAgICAgIFVwZGF0ZUNvc3RBdEluZGV4KGNvc3RfbWFuYWdlciwgaiwgMCk7CisKKyAgICAgICAgICBQdXNoSW50ZXJ2YWwoY29zdF9tYW5hZ2VyLCBjb3N0X21hbmFnZXItPmNvc3RzX1tqIC0gMV0gKyBvZmZzZXRfY29zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgaiwgbGVuX2opOworICAgICAgICAgIHJlYWNoID0gaiArIGxlbl9qIC0gMTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIFVwZGF0ZUNvc3RBdEluZGV4KGNvc3RfbWFuYWdlciwgaSwgMSk7CisgICAgb2Zmc2V0X3ByZXYgPSBvZmZzZXQ7CisgICAgbGVuX3ByZXYgPSBsZW47CisgIH0KKworICBvayA9ICFyZWZzLT5lcnJvcl87CitFcnJvcjoKKyAgaWYgKGNjX2luaXQpIFZQOExDb2xvckNhY2hlQ2xlYXIoJmhhc2hlcnMpOworICBDb3N0TWFuYWdlckNsZWFyKGNvc3RfbWFuYWdlcik7CisgIFdlYlBTYWZlRnJlZShjb3N0X21vZGVsKTsKKyAgV2ViUFNhZmVGcmVlKGNvc3RfbWFuYWdlcik7CisgIHJldHVybiBvazsKK30KKworLy8gV2UgcGFjayB0aGUgcGF0aCBhdCB0aGUgZW5kIG9mICpkaXN0X2FycmF5IGFuZCByZXR1cm4KKy8vIGEgcG9pbnRlciB0byB0aGlzIHBhcnQgb2YgdGhlIGFycmF5LiBFeGFtcGxlOgorLy8gZGlzdF9hcnJheSA9IFsxeDJ4eDN4Ml0gPT4gcGFja2VkIFsxeDJ4MTIzMl0sIGNob3Nlbl9wYXRoID0gWzEyMzJdCitzdGF0aWMgdm9pZCBUcmFjZUJhY2t3YXJkcyh1aW50MTZfdCogY29uc3QgZGlzdF9hcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXN0X2FycmF5X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCoqIGNvbnN0IGNob3Nlbl9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBjaG9zZW5fcGF0aF9zaXplKSB7CisgIHVpbnQxNl90KiBwYXRoID0gZGlzdF9hcnJheSArIGRpc3RfYXJyYXlfc2l6ZTsKKyAgdWludDE2X3QqIGN1ciA9IGRpc3RfYXJyYXkgKyBkaXN0X2FycmF5X3NpemUgLSAxOworICB3aGlsZSAoY3VyID49IGRpc3RfYXJyYXkpIHsKKyAgICBjb25zdCBpbnQgayA9ICpjdXI7CisgICAgLS1wYXRoOworICAgICpwYXRoID0gazsKKyAgICBjdXIgLT0gazsKKyAgfQorICAqY2hvc2VuX3BhdGggPSBwYXRoOworICAqY2hvc2VuX3BhdGhfc2l6ZSA9IChpbnQpKGRpc3RfYXJyYXkgKyBkaXN0X2FycmF5X3NpemUgLSBwYXRoKTsKK30KKworc3RhdGljIGludCBCYWNrd2FyZFJlZmVyZW5jZXNIYXNoQ2hhaW5Gb2xsb3dDaG9zZW5QYXRoKAorICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLCBpbnQgY2FjaGVfYml0cywKKyAgICBjb25zdCB1aW50MTZfdCogY29uc3QgY2hvc2VuX3BhdGgsIGludCBjaG9zZW5fcGF0aF9zaXplLAorICAgIGNvbnN0IFZQOExIYXNoQ2hhaW4qIGNvbnN0IGhhc2hfY2hhaW4sIFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMpIHsKKyAgY29uc3QgaW50IHVzZV9jb2xvcl9jYWNoZSA9IChjYWNoZV9iaXRzID4gMCk7CisgIGludCBpeDsKKyAgaW50IGkgPSAwOworICBpbnQgb2sgPSAwOworICBpbnQgY2NfaW5pdCA9IDA7CisgIFZQOExDb2xvckNhY2hlIGhhc2hlcnM7CisKKyAgaWYgKHVzZV9jb2xvcl9jYWNoZSkgeworICAgIGNjX2luaXQgPSBWUDhMQ29sb3JDYWNoZUluaXQoJmhhc2hlcnMsIGNhY2hlX2JpdHMpOworICAgIGlmICghY2NfaW5pdCkgZ290byBFcnJvcjsKKyAgfQorCisgIFZQOExDbGVhckJhY2t3YXJkUmVmcyhyZWZzKTsKKyAgZm9yIChpeCA9IDA7IGl4IDwgY2hvc2VuX3BhdGhfc2l6ZTsgKytpeCkgeworICAgIGNvbnN0IGludCBsZW4gPSBjaG9zZW5fcGF0aFtpeF07CisgICAgaWYgKGxlbiAhPSAxKSB7CisgICAgICBpbnQgazsKKyAgICAgIGNvbnN0IGludCBvZmZzZXQgPSBWUDhMSGFzaENoYWluRmluZE9mZnNldChoYXNoX2NoYWluLCBpKTsKKyAgICAgIFZQOExCYWNrd2FyZFJlZnNDdXJzb3JBZGQocmVmcywgUGl4T3JDb3B5Q3JlYXRlQ29weShvZmZzZXQsIGxlbikpOworICAgICAgaWYgKHVzZV9jb2xvcl9jYWNoZSkgeworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbGVuOyArK2spIHsKKyAgICAgICAgICBWUDhMQ29sb3JDYWNoZUluc2VydCgmaGFzaGVycywgYXJnYltpICsga10pOworICAgICAgICB9CisgICAgICB9CisgICAgICBpICs9IGxlbjsKKyAgICB9IGVsc2UgeworICAgICAgUGl4T3JDb3B5IHY7CisgICAgICBjb25zdCBpbnQgaWR4ID0KKyAgICAgICAgICB1c2VfY29sb3JfY2FjaGUgPyBWUDhMQ29sb3JDYWNoZUNvbnRhaW5zKCZoYXNoZXJzLCBhcmdiW2ldKSA6IC0xOworICAgICAgaWYgKGlkeCA+PSAwKSB7CisgICAgICAgIC8vIHVzZV9jb2xvcl9jYWNoZSBpcyB0cnVlIGFuZCBoYXNoZXJzIGNvbnRhaW5zIGFyZ2JbaV0KKyAgICAgICAgLy8gcHVzaCBwaXhlbCBhcyBhIGNvbG9yIGNhY2hlIGluZGV4CisgICAgICAgIHYgPSBQaXhPckNvcHlDcmVhdGVDYWNoZUlkeChpZHgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHVzZV9jb2xvcl9jYWNoZSkgVlA4TENvbG9yQ2FjaGVJbnNlcnQoJmhhc2hlcnMsIGFyZ2JbaV0pOworICAgICAgICB2ID0gUGl4T3JDb3B5Q3JlYXRlTGl0ZXJhbChhcmdiW2ldKTsKKyAgICAgIH0KKyAgICAgIFZQOExCYWNrd2FyZFJlZnNDdXJzb3JBZGQocmVmcywgdik7CisgICAgICArK2k7CisgICAgfQorICB9CisgIG9rID0gIXJlZnMtPmVycm9yXzsKKyBFcnJvcjoKKyAgaWYgKGNjX2luaXQpIFZQOExDb2xvckNhY2hlQ2xlYXIoJmhhc2hlcnMpOworICByZXR1cm4gb2s7Cit9CisKKy8vIFJldHVybnMgMSBvbiBzdWNjZXNzLgorZXh0ZXJuIGludCBWUDhMQmFja3dhcmRSZWZlcmVuY2VzVHJhY2VCYWNrd2FyZHMoCisgICAgaW50IHhzaXplLCBpbnQgeXNpemUsIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLCBpbnQgY2FjaGVfYml0cywKKyAgICBjb25zdCBWUDhMSGFzaENoYWluKiBjb25zdCBoYXNoX2NoYWluLAorICAgIGNvbnN0IFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnNfc3JjLCBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzX2RzdCk7CitpbnQgVlA4TEJhY2t3YXJkUmVmZXJlbmNlc1RyYWNlQmFja3dhcmRzKGludCB4c2l6ZSwgaW50IHlzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhY2hlX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOExIYXNoQ2hhaW4qIGNvbnN0IGhhc2hfY2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnNfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzX2RzdCkgeworICBpbnQgb2sgPSAwOworICBjb25zdCBpbnQgZGlzdF9hcnJheV9zaXplID0geHNpemUgKiB5c2l6ZTsKKyAgdWludDE2X3QqIGNob3Nlbl9wYXRoID0gTlVMTDsKKyAgaW50IGNob3Nlbl9wYXRoX3NpemUgPSAwOworICB1aW50MTZfdCogZGlzdF9hcnJheSA9CisgICAgICAodWludDE2X3QqKVdlYlBTYWZlTWFsbG9jKGRpc3RfYXJyYXlfc2l6ZSwgc2l6ZW9mKCpkaXN0X2FycmF5KSk7CisKKyAgaWYgKGRpc3RfYXJyYXkgPT0gTlVMTCkgZ290byBFcnJvcjsKKworICBpZiAoIUJhY2t3YXJkUmVmZXJlbmNlc0hhc2hDaGFpbkRpc3RhbmNlT25seSgKKyAgICAgICAgICB4c2l6ZSwgeXNpemUsIGFyZ2IsIGNhY2hlX2JpdHMsIGhhc2hfY2hhaW4sIHJlZnNfc3JjLCBkaXN0X2FycmF5KSkgeworICAgIGdvdG8gRXJyb3I7CisgIH0KKyAgVHJhY2VCYWNrd2FyZHMoZGlzdF9hcnJheSwgZGlzdF9hcnJheV9zaXplLCAmY2hvc2VuX3BhdGgsICZjaG9zZW5fcGF0aF9zaXplKTsKKyAgaWYgKCFCYWNrd2FyZFJlZmVyZW5jZXNIYXNoQ2hhaW5Gb2xsb3dDaG9zZW5QYXRoKAorICAgICAgICAgIGFyZ2IsIGNhY2hlX2JpdHMsIGNob3Nlbl9wYXRoLCBjaG9zZW5fcGF0aF9zaXplLCBoYXNoX2NoYWluLAorICAgICAgICAgIHJlZnNfZHN0KSkgeworICAgIGdvdG8gRXJyb3I7CisgIH0KKyAgb2sgPSAxOworIEVycm9yOgorICBXZWJQU2FmZUZyZWUoZGlzdF9hcnJheSk7CisgIHJldHVybiBvazsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvYmFja3dhcmRfcmVmZXJlbmNlc19lbmMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvYmFja3dhcmRfcmVmZXJlbmNlc19lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTIzMDE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9iYWNrd2FyZF9yZWZlcmVuY2VzX2VuYy5jCkBAIC0wLDAgKzEsOTQzIEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQXV0aG9yOiBKeXJraSBBbGFrdWlqYWxhIChqeXJraUBnb29nbGUuY29tKQorLy8KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgInNyYy9lbmMvYmFja3dhcmRfcmVmZXJlbmNlc19lbmMuaCIKKyNpbmNsdWRlICJzcmMvZW5jL2hpc3RvZ3JhbV9lbmMuaCIKKyNpbmNsdWRlICJzcmMvZHNwL2xvc3NsZXNzLmgiCisjaW5jbHVkZSAic3JjL2RzcC9sb3NzbGVzc19jb21tb24uaCIKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorI2luY2x1ZGUgInNyYy91dGlscy9jb2xvcl9jYWNoZV91dGlscy5oIgorI2luY2x1ZGUgInNyYy91dGlscy91dGlscy5oIgorCisjZGVmaW5lIE1JTl9CTE9DS19TSVpFIDI1NiAgLy8gbWluaW11bSBibG9jayBzaXplIGZvciBiYWNrd2FyZCByZWZlcmVuY2VzCisKKyNkZWZpbmUgTUFYX0VOVFJPUFkgICAgKDFlMzBmKQorCisvLyAxTSB3aW5kb3cgKDRNIGJ5dGVzKSBtaW51cyAxMjAgc3BlY2lhbCBjb2RlcyBmb3Igc2hvcnQgZGlzdGFuY2VzLgorI2RlZmluZSBXSU5ET1dfU0laRSAoKDEgPDwgV0lORE9XX1NJWkVfQklUUykgLSAxMjApCisKKy8vIE1pbmltdW0gbnVtYmVyIG9mIHBpeGVscyBmb3Igd2hpY2ggaXQgaXMgY2hlYXBlciB0byBlbmNvZGUgYQorLy8gZGlzdGFuY2UgKyBsZW5ndGggaW5zdGVhZCBvZiBlYWNoIHBpeGVsIGFzIGEgbGl0ZXJhbC4KKyNkZWZpbmUgTUlOX0xFTkdUSCA0CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBjb25zdCB1aW50OF90IHBsYW5lX3RvX2NvZGVfbHV0WzEyOF0gPSB7CisgOTYsICAgNzMsICA1NSwgIDM5LCAgMjMsICAxMywgICA1LCAgMSwgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAorIDEwMSwgIDc4LCAgNTgsICA0MiwgIDI2LCAgMTYsICAgOCwgIDIsICAgIDAsICAgMywgIDksICAgMTcsICAyNywgIDQzLCAgNTksICA3OSwKKyAxMDIsICA4NiwgIDYyLCAgNDYsICAzMiwgIDIwLCAgMTAsICA2LCAgICA0LCAgIDcsICAxMSwgIDIxLCAgMzMsICA0NywgIDYzLCAgODcsCisgMTA1LCAgOTAsICA3MCwgIDUyLCAgMzcsICAyOCwgIDE4LCAgMTQsICAxMiwgIDE1LCAgMTksICAyOSwgIDM4LCAgNTMsICA3MSwgIDkxLAorIDExMCwgIDk5LCAgODIsICA2NiwgIDQ4LCAgMzUsICAzMCwgIDI0LCAgMjIsICAyNSwgIDMxLCAgMzYsICA0OSwgIDY3LCAgODMsIDEwMCwKKyAxMTUsIDEwOCwgIDk0LCAgNzYsICA2NCwgIDUwLCAgNDQsICA0MCwgIDM0LCAgNDEsICA0NSwgIDUxLCAgNjUsICA3NywgIDk1LCAxMDksCisgMTE4LCAxMTMsIDEwMywgIDkyLCAgODAsICA2OCwgIDYwLCAgNTYsICA1NCwgIDU3LCAgNjEsICA2OSwgIDgxLCAgOTMsIDEwNCwgMTE0LAorIDExOSwgMTE2LCAxMTEsIDEwNiwgIDk3LCAgODgsICA4NCwgIDc0LCAgNzIsICA3NSwgIDg1LCAgODksICA5OCwgMTA3LCAxMTIsIDExNworfTsKKworZXh0ZXJuIGludCBWUDhMRGlzdGFuY2VUb1BsYW5lQ29kZShpbnQgeHNpemUsIGludCBkaXN0KTsKK2ludCBWUDhMRGlzdGFuY2VUb1BsYW5lQ29kZShpbnQgeHNpemUsIGludCBkaXN0KSB7CisgIGNvbnN0IGludCB5b2Zmc2V0ID0gZGlzdCAvIHhzaXplOworICBjb25zdCBpbnQgeG9mZnNldCA9IGRpc3QgLSB5b2Zmc2V0ICogeHNpemU7CisgIGlmICh4b2Zmc2V0IDw9IDggJiYgeW9mZnNldCA8IDgpIHsKKyAgICByZXR1cm4gcGxhbmVfdG9fY29kZV9sdXRbeW9mZnNldCAqIDE2ICsgOCAtIHhvZmZzZXRdICsgMTsKKyAgfSBlbHNlIGlmICh4b2Zmc2V0ID4geHNpemUgLSA4ICYmIHlvZmZzZXQgPCA3KSB7CisgICAgcmV0dXJuIHBsYW5lX3RvX2NvZGVfbHV0Wyh5b2Zmc2V0ICsgMSkgKiAxNiArIDggKyAoeHNpemUgLSB4b2Zmc2V0KV0gKyAxOworICB9CisgIHJldHVybiBkaXN0ICsgMTIwOworfQorCisvLyBSZXR1cm5zIHRoZSBleGFjdCBpbmRleCB3aGVyZSBhcnJheTEgYW5kIGFycmF5MiBhcmUgZGlmZmVyZW50LiBGb3IgYW4gaW5kZXgKKy8vIGluZmVyaW9yIG9yIGVxdWFsIHRvIGJlc3RfbGVuX21hdGNoLCB0aGUgcmV0dXJuIHZhbHVlIGp1c3QgaGFzIHRvIGJlIHN0cmljdGx5CisvLyBpbmZlcmlvciB0byBiZXN0X2xlbl9tYXRjaC4gVGhlIGN1cnJlbnQgYmVoYXZpb3IgaXMgdG8gcmV0dXJuIDAgaWYgdGhpcyBpbmRleAorLy8gaXMgYmVzdF9sZW5fbWF0Y2gsIGFuZCB0aGUgaW5kZXggaXRzZWxmIG90aGVyd2lzZS4KKy8vIElmIG5vIHR3byBlbGVtZW50cyBhcmUgdGhlIHNhbWUsIGl0IHJldHVybnMgbWF4X2xpbWl0Lgorc3RhdGljIFdFQlBfSU5MSU5FIGludCBGaW5kTWF0Y2hMZW5ndGgoY29uc3QgdWludDMyX3QqIGNvbnN0IGFycmF5MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcnJheTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmVzdF9sZW5fbWF0Y2gsIGludCBtYXhfbGltaXQpIHsKKyAgLy8gQmVmb3JlICdleHBlbnNpdmUnIGxpbmVhciBtYXRjaCwgY2hlY2sgaWYgdGhlIHR3byBhcnJheXMgbWF0Y2ggYXQgdGhlCisgIC8vIGN1cnJlbnQgYmVzdCBsZW5ndGggaW5kZXguCisgIGlmIChhcnJheTFbYmVzdF9sZW5fbWF0Y2hdICE9IGFycmF5MltiZXN0X2xlbl9tYXRjaF0pIHJldHVybiAwOworCisgIHJldHVybiBWUDhMVmVjdG9yTWlzbWF0Y2goYXJyYXkxLCBhcnJheTIsIG1heF9saW1pdCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgVlA4TEJhY2t3YXJkUmVmcworCitzdHJ1Y3QgUGl4T3JDb3B5QmxvY2sgeworICBQaXhPckNvcHlCbG9jayogbmV4dF87ICAgLy8gbmV4dCBibG9jayAob3IgTlVMTCkKKyAgUGl4T3JDb3B5KiBzdGFydF87ICAgICAgIC8vIGRhdGEgc3RhcnQKKyAgaW50IHNpemVfOyAgICAgICAgICAgICAgIC8vIGN1cnJlbnRseSB1c2VkIHNpemUKK307CisKK2V4dGVybiB2b2lkIFZQOExDbGVhckJhY2t3YXJkUmVmcyhWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzKTsKK3ZvaWQgVlA4TENsZWFyQmFja3dhcmRSZWZzKFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMpIHsKKyAgYXNzZXJ0KHJlZnMgIT0gTlVMTCk7CisgIGlmIChyZWZzLT50YWlsXyAhPSBOVUxMKSB7CisgICAgKnJlZnMtPnRhaWxfID0gcmVmcy0+ZnJlZV9ibG9ja3NfOyAgLy8gcmVjeWNsZSBhbGwgYmxvY2tzIGF0IG9uY2UKKyAgfQorICByZWZzLT5mcmVlX2Jsb2Nrc18gPSByZWZzLT5yZWZzXzsKKyAgcmVmcy0+dGFpbF8gPSAmcmVmcy0+cmVmc187CisgIHJlZnMtPmxhc3RfYmxvY2tfID0gTlVMTDsKKyAgcmVmcy0+cmVmc18gPSBOVUxMOworfQorCit2b2lkIFZQOExCYWNrd2FyZFJlZnNDbGVhcihWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzKSB7CisgIGFzc2VydChyZWZzICE9IE5VTEwpOworICBWUDhMQ2xlYXJCYWNrd2FyZFJlZnMocmVmcyk7CisgIHdoaWxlIChyZWZzLT5mcmVlX2Jsb2Nrc18gIT0gTlVMTCkgeworICAgIFBpeE9yQ29weUJsb2NrKiBjb25zdCBuZXh0ID0gcmVmcy0+ZnJlZV9ibG9ja3NfLT5uZXh0XzsKKyAgICBXZWJQU2FmZUZyZWUocmVmcy0+ZnJlZV9ibG9ja3NfKTsKKyAgICByZWZzLT5mcmVlX2Jsb2Nrc18gPSBuZXh0OworICB9Cit9CisKK3ZvaWQgVlA4TEJhY2t3YXJkUmVmc0luaXQoVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcywgaW50IGJsb2NrX3NpemUpIHsKKyAgYXNzZXJ0KHJlZnMgIT0gTlVMTCk7CisgIG1lbXNldChyZWZzLCAwLCBzaXplb2YoKnJlZnMpKTsKKyAgcmVmcy0+dGFpbF8gPSAmcmVmcy0+cmVmc187CisgIHJlZnMtPmJsb2NrX3NpemVfID0KKyAgICAgIChibG9ja19zaXplIDwgTUlOX0JMT0NLX1NJWkUpID8gTUlOX0JMT0NLX1NJWkUgOiBibG9ja19zaXplOworfQorCitWUDhMUmVmc0N1cnNvciBWUDhMUmVmc0N1cnNvckluaXQoY29uc3QgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcykgeworICBWUDhMUmVmc0N1cnNvciBjOworICBjLmN1cl9ibG9ja18gPSByZWZzLT5yZWZzXzsKKyAgaWYgKHJlZnMtPnJlZnNfICE9IE5VTEwpIHsKKyAgICBjLmN1cl9wb3MgPSBjLmN1cl9ibG9ja18tPnN0YXJ0XzsKKyAgICBjLmxhc3RfcG9zXyA9IGMuY3VyX3BvcyArIGMuY3VyX2Jsb2NrXy0+c2l6ZV87CisgIH0gZWxzZSB7CisgICAgYy5jdXJfcG9zID0gTlVMTDsKKyAgICBjLmxhc3RfcG9zXyA9IE5VTEw7CisgIH0KKyAgcmV0dXJuIGM7Cit9CisKK3ZvaWQgVlA4TFJlZnNDdXJzb3JOZXh0QmxvY2soVlA4TFJlZnNDdXJzb3IqIGNvbnN0IGMpIHsKKyAgUGl4T3JDb3B5QmxvY2sqIGNvbnN0IGIgPSBjLT5jdXJfYmxvY2tfLT5uZXh0XzsKKyAgYy0+Y3VyX3BvcyA9IChiID09IE5VTEwpID8gTlVMTCA6IGItPnN0YXJ0XzsKKyAgYy0+bGFzdF9wb3NfID0gKGIgPT0gTlVMTCkgPyBOVUxMIDogYi0+c3RhcnRfICsgYi0+c2l6ZV87CisgIGMtPmN1cl9ibG9ja18gPSBiOworfQorCisvLyBDcmVhdGUgYSBuZXcgYmxvY2ssIGVpdGhlciBmcm9tIHRoZSBmcmVlIGxpc3Qgb3IgYWxsb2NhdGVkCitzdGF0aWMgUGl4T3JDb3B5QmxvY2sqIEJhY2t3YXJkUmVmc05ld0Jsb2NrKFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMpIHsKKyAgUGl4T3JDb3B5QmxvY2sqIGIgPSByZWZzLT5mcmVlX2Jsb2Nrc187CisgIGlmIChiID09IE5VTEwpIHsgICAvLyBhbGxvY2F0ZSBuZXcgbWVtb3J5IGNodW5rCisgICAgY29uc3Qgc2l6ZV90IHRvdGFsX3NpemUgPQorICAgICAgICBzaXplb2YoKmIpICsgcmVmcy0+YmxvY2tfc2l6ZV8gKiBzaXplb2YoKmItPnN0YXJ0Xyk7CisgICAgYiA9IChQaXhPckNvcHlCbG9jayopV2ViUFNhZmVNYWxsb2MoMVVMTCwgdG90YWxfc2l6ZSk7CisgICAgaWYgKGIgPT0gTlVMTCkgeworICAgICAgcmVmcy0+ZXJyb3JfIHw9IDE7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgYi0+c3RhcnRfID0gKFBpeE9yQ29weSopKCh1aW50OF90KiliICsgc2l6ZW9mKCpiKSk7ICAvLyBub3QgYWx3YXlzIGFsaWduZWQKKyAgfSBlbHNlIHsgIC8vIHJlY3ljbGUgZnJvbSBmcmVlLWxpc3QKKyAgICByZWZzLT5mcmVlX2Jsb2Nrc18gPSBiLT5uZXh0XzsKKyAgfQorICAqcmVmcy0+dGFpbF8gPSBiOworICByZWZzLT50YWlsXyA9ICZiLT5uZXh0XzsKKyAgcmVmcy0+bGFzdF9ibG9ja18gPSBiOworICBiLT5uZXh0XyA9IE5VTEw7CisgIGItPnNpemVfID0gMDsKKyAgcmV0dXJuIGI7Cit9CisKK2V4dGVybiB2b2lkIFZQOExCYWNrd2FyZFJlZnNDdXJzb3JBZGQoVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGl4T3JDb3B5IHYpOwordm9pZCBWUDhMQmFja3dhcmRSZWZzQ3Vyc29yQWRkKFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGl4T3JDb3B5IHYpIHsKKyAgUGl4T3JDb3B5QmxvY2sqIGIgPSByZWZzLT5sYXN0X2Jsb2NrXzsKKyAgaWYgKGIgPT0gTlVMTCB8fCBiLT5zaXplXyA9PSByZWZzLT5ibG9ja19zaXplXykgeworICAgIGIgPSBCYWNrd2FyZFJlZnNOZXdCbG9jayhyZWZzKTsKKyAgICBpZiAoYiA9PSBOVUxMKSByZXR1cm47ICAgLy8gcmVmcy0+ZXJyb3JfIGlzIHNldAorICB9CisgIGItPnN0YXJ0X1tiLT5zaXplXysrXSA9IHY7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIYXNoIGNoYWlucworCitpbnQgVlA4TEhhc2hDaGFpbkluaXQoVlA4TEhhc2hDaGFpbiogY29uc3QgcCwgaW50IHNpemUpIHsKKyAgYXNzZXJ0KHAtPnNpemVfID09IDApOworICBhc3NlcnQocC0+b2Zmc2V0X2xlbmd0aF8gPT0gTlVMTCk7CisgIGFzc2VydChzaXplID4gMCk7CisgIHAtPm9mZnNldF9sZW5ndGhfID0KKyAgICAgICh1aW50MzJfdCopV2ViUFNhZmVNYWxsb2Moc2l6ZSwgc2l6ZW9mKCpwLT5vZmZzZXRfbGVuZ3RoXykpOworICBpZiAocC0+b2Zmc2V0X2xlbmd0aF8gPT0gTlVMTCkgcmV0dXJuIDA7CisgIHAtPnNpemVfID0gc2l6ZTsKKworICByZXR1cm4gMTsKK30KKwordm9pZCBWUDhMSGFzaENoYWluQ2xlYXIoVlA4TEhhc2hDaGFpbiogY29uc3QgcCkgeworICBhc3NlcnQocCAhPSBOVUxMKTsKKyAgV2ViUFNhZmVGcmVlKHAtPm9mZnNldF9sZW5ndGhfKTsKKworICBwLT5zaXplXyA9IDA7CisgIHAtPm9mZnNldF9sZW5ndGhfID0gTlVMTDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBIQVNIX01VTFRJUExJRVJfSEkgKDB4YzZhNGE3OTNVTEwpCisjZGVmaW5lIEhBU0hfTVVMVElQTElFUl9MTyAoMHg1YmQxZTk5NlVMTCkKKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IEdldFBpeFBhaXJIYXNoNjQoY29uc3QgdWludDMyX3QqIGNvbnN0IGFyZ2IpIHsKKyAgdWludDMyX3Qga2V5OworICBrZXkgID0gKGFyZ2JbMV0gKiBIQVNIX01VTFRJUExJRVJfSEkpICYgMHhmZmZmZmZmZnU7CisgIGtleSArPSAoYXJnYlswXSAqIEhBU0hfTVVMVElQTElFUl9MTykgJiAweGZmZmZmZmZmdTsKKyAga2V5ID0ga2V5ID4+ICgzMiAtIEhBU0hfQklUUyk7CisgIHJldHVybiBrZXk7Cit9CisKKy8vIFJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGhhc2ggY2hhaW4gbG9va3VwcyB0byBkbyBmb3IgYQorLy8gZ2l2ZW4gY29tcHJlc3Npb24gcXVhbGl0eS4gUmV0dXJuIHZhbHVlIGluIHJhbmdlIFs4LCA4Nl0uCitzdGF0aWMgaW50IEdldE1heEl0ZXJzRm9yUXVhbGl0eShpbnQgcXVhbGl0eSkgeworICByZXR1cm4gOCArIChxdWFsaXR5ICogcXVhbGl0eSkgLyAxMjg7Cit9CisKK3N0YXRpYyBpbnQgR2V0V2luZG93U2l6ZUZvckhhc2hDaGFpbihpbnQgcXVhbGl0eSwgaW50IHhzaXplKSB7CisgIGNvbnN0IGludCBtYXhfd2luZG93X3NpemUgPSAocXVhbGl0eSA+IDc1KSA/IFdJTkRPV19TSVpFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAocXVhbGl0eSA+IDUwKSA/ICh4c2l6ZSA8PCA4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKHF1YWxpdHkgPiAyNSkgPyAoeHNpemUgPDwgNikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICh4c2l6ZSA8PCA0KTsKKyAgYXNzZXJ0KHhzaXplID4gMCk7CisgIHJldHVybiAobWF4X3dpbmRvd19zaXplID4gV0lORE9XX1NJWkUpID8gV0lORE9XX1NJWkUgOiBtYXhfd2luZG93X3NpemU7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgTWF4RmluZENvcHlMZW5ndGgoaW50IGxlbikgeworICByZXR1cm4gKGxlbiA8IE1BWF9MRU5HVEgpID8gbGVuIDogTUFYX0xFTkdUSDsKK30KKworaW50IFZQOExIYXNoQ2hhaW5GaWxsKFZQOExIYXNoQ2hhaW4qIGNvbnN0IHAsIGludCBxdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLCBpbnQgeHNpemUsIGludCB5c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgbG93X2VmZm9ydCkgeworICBjb25zdCBpbnQgc2l6ZSA9IHhzaXplICogeXNpemU7CisgIGNvbnN0IGludCBpdGVyX21heCA9IEdldE1heEl0ZXJzRm9yUXVhbGl0eShxdWFsaXR5KTsKKyAgY29uc3QgdWludDMyX3Qgd2luZG93X3NpemUgPSBHZXRXaW5kb3dTaXplRm9ySGFzaENoYWluKHF1YWxpdHksIHhzaXplKTsKKyAgaW50IHBvczsKKyAgaW50IGFyZ2JfY29tcDsKKyAgdWludDMyX3QgYmFzZV9wb3NpdGlvbjsKKyAgaW50MzJfdCogaGFzaF90b19maXJzdF9pbmRleDsKKyAgLy8gVGVtcG9yYXJpbHkgdXNlIHRoZSBwLT5vZmZzZXRfbGVuZ3RoXyBhcyBhIGhhc2ggY2hhaW4uCisgIGludDMyX3QqIGNoYWluID0gKGludDMyX3QqKXAtPm9mZnNldF9sZW5ndGhfOworICBhc3NlcnQoc2l6ZSA+IDApOworICBhc3NlcnQocC0+c2l6ZV8gIT0gMCk7CisgIGFzc2VydChwLT5vZmZzZXRfbGVuZ3RoXyAhPSBOVUxMKTsKKworICBpZiAoc2l6ZSA8PSAyKSB7CisgICAgcC0+b2Zmc2V0X2xlbmd0aF9bMF0gPSBwLT5vZmZzZXRfbGVuZ3RoX1tzaXplIC0gMV0gPSAwOworICAgIHJldHVybiAxOworICB9CisKKyAgaGFzaF90b19maXJzdF9pbmRleCA9CisgICAgICAoaW50MzJfdCopV2ViUFNhZmVNYWxsb2MoSEFTSF9TSVpFLCBzaXplb2YoKmhhc2hfdG9fZmlyc3RfaW5kZXgpKTsKKyAgaWYgKGhhc2hfdG9fZmlyc3RfaW5kZXggPT0gTlVMTCkgcmV0dXJuIDA7CisKKyAgLy8gU2V0IHRoZSBpbnQzMl90IGFycmF5IHRvIC0xLgorICBtZW1zZXQoaGFzaF90b19maXJzdF9pbmRleCwgMHhmZiwgSEFTSF9TSVpFICogc2l6ZW9mKCpoYXNoX3RvX2ZpcnN0X2luZGV4KSk7CisgIC8vIEZpbGwgdGhlIGNoYWluIGxpbmtpbmcgcGl4ZWxzIHdpdGggdGhlIHNhbWUgaGFzaC4KKyAgYXJnYl9jb21wID0gKGFyZ2JbMF0gPT0gYXJnYlsxXSk7CisgIGZvciAocG9zID0gMDsgcG9zIDwgc2l6ZSAtIDI7KSB7CisgICAgdWludDMyX3QgaGFzaF9jb2RlOworICAgIGNvbnN0IGludCBhcmdiX2NvbXBfbmV4dCA9IChhcmdiW3BvcyArIDFdID09IGFyZ2JbcG9zICsgMl0pOworICAgIGlmIChhcmdiX2NvbXAgJiYgYXJnYl9jb21wX25leHQpIHsKKyAgICAgIC8vIENvbnNlY3V0aXZlIHBpeGVscyB3aXRoIHRoZSBzYW1lIGNvbG9yIHdpbGwgc2hhcmUgdGhlIHNhbWUgaGFzaC4KKyAgICAgIC8vIFdlIHRoZXJlZm9yZSB1c2UgYSBkaWZmZXJlbnQgaGFzaDogdGhlIGNvbG9yIGFuZCBpdHMgcmVwZXRpdGlvbgorICAgICAgLy8gbGVuZ3RoLgorICAgICAgdWludDMyX3QgdG1wWzJdOworICAgICAgdWludDMyX3QgbGVuID0gMTsKKyAgICAgIHRtcFswXSA9IGFyZ2JbcG9zXTsKKyAgICAgIC8vIEZpZ3VyZSBvdXQgaG93IGZhciB0aGUgcGl4ZWxzIGFyZSB0aGUgc2FtZS4KKyAgICAgIC8vIFRoZSBsYXN0IHBpeGVsIGhhcyBhIGRpZmZlcmVudCA2NCBiaXQgaGFzaCwgYXMgaXRzIG5leHQgcGl4ZWwgZG9lcworICAgICAgLy8gbm90IGhhdmUgdGhlIHNhbWUgY29sb3IsIHNvIHdlIGp1c3QgbmVlZCB0byBnZXQgdG8gdGhlIGxhc3QgcGl4ZWwgZXF1YWwKKyAgICAgIC8vIHRvIGl0cyBmb2xsb3dlci4KKyAgICAgIHdoaWxlIChwb3MgKyAoaW50KWxlbiArIDIgPCBzaXplICYmIGFyZ2JbcG9zICsgbGVuICsgMl0gPT0gYXJnYltwb3NdKSB7CisgICAgICAgICsrbGVuOworICAgICAgfQorICAgICAgaWYgKGxlbiA+IE1BWF9MRU5HVEgpIHsKKyAgICAgICAgLy8gU2tpcCB0aGUgcGl4ZWxzIHRoYXQgbWF0Y2ggZm9yIGRpc3RhbmNlPTEgYW5kIGxlbmd0aD5NQVhfTEVOR1RICisgICAgICAgIC8vIGJlY2F1c2UgdGhleSBhcmUgbGlua2VkIHRvIHRoZWlyIHByZWRlY2Vzc29yIGFuZCB3ZSBhdXRvbWF0aWNhbGx5CisgICAgICAgIC8vIGNoZWNrIHRoYXQgaW4gdGhlIG1haW4gZm9yIGxvb3AgYmVsb3cuIFNraXBwaW5nIG1lYW5zIHNldHRpbmcgbm8KKyAgICAgICAgLy8gcHJlZGVjZXNzb3IgaW4gdGhlIGNoYWluLCBoZW5jZSAtMS4KKyAgICAgICAgbWVtc2V0KGNoYWluICsgcG9zLCAweGZmLCAobGVuIC0gTUFYX0xFTkdUSCkgKiBzaXplb2YoKmNoYWluKSk7CisgICAgICAgIHBvcyArPSBsZW4gLSBNQVhfTEVOR1RIOworICAgICAgICBsZW4gPSBNQVhfTEVOR1RIOworICAgICAgfQorICAgICAgLy8gUHJvY2VzcyB0aGUgcmVzdCBvZiB0aGUgaGFzaCBjaGFpbi4KKyAgICAgIHdoaWxlIChsZW4pIHsKKyAgICAgICAgdG1wWzFdID0gbGVuLS07CisgICAgICAgIGhhc2hfY29kZSA9IEdldFBpeFBhaXJIYXNoNjQodG1wKTsKKyAgICAgICAgY2hhaW5bcG9zXSA9IGhhc2hfdG9fZmlyc3RfaW5kZXhbaGFzaF9jb2RlXTsKKyAgICAgICAgaGFzaF90b19maXJzdF9pbmRleFtoYXNoX2NvZGVdID0gcG9zKys7CisgICAgICB9CisgICAgICBhcmdiX2NvbXAgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAvLyBKdXN0IG1vdmUgb25lIHBpeGVsIGZvcndhcmQuCisgICAgICBoYXNoX2NvZGUgPSBHZXRQaXhQYWlySGFzaDY0KGFyZ2IgKyBwb3MpOworICAgICAgY2hhaW5bcG9zXSA9IGhhc2hfdG9fZmlyc3RfaW5kZXhbaGFzaF9jb2RlXTsKKyAgICAgIGhhc2hfdG9fZmlyc3RfaW5kZXhbaGFzaF9jb2RlXSA9IHBvcysrOworICAgICAgYXJnYl9jb21wID0gYXJnYl9jb21wX25leHQ7CisgICAgfQorICB9CisgIC8vIFByb2Nlc3MgdGhlIHBlbnVsdGltYXRlIHBpeGVsLgorICBjaGFpbltwb3NdID0gaGFzaF90b19maXJzdF9pbmRleFtHZXRQaXhQYWlySGFzaDY0KGFyZ2IgKyBwb3MpXTsKKworICBXZWJQU2FmZUZyZWUoaGFzaF90b19maXJzdF9pbmRleCk7CisKKyAgLy8gRmluZCB0aGUgYmVzdCBtYXRjaCBpbnRlcnZhbCBhdCBlYWNoIHBpeGVsLCBkZWZpbmVkIGJ5IGFuIG9mZnNldCB0byB0aGUKKyAgLy8gcGl4ZWwgYW5kIGEgbGVuZ3RoLiBUaGUgcmlnaHQtbW9zdCBwaXhlbCBjYW5ub3QgbWF0Y2ggYW55dGhpbmcgdG8gdGhlIHJpZ2h0CisgIC8vIChoZW5jZSBhIGJlc3QgbGVuZ3RoIG9mIDApIGFuZCB0aGUgbGVmdC1tb3N0IHBpeGVsIG5vdGhpbmcgdG8gdGhlIGxlZnQKKyAgLy8gKGhlbmNlIGFuIG9mZnNldCBvZiAwKS4KKyAgYXNzZXJ0KHNpemUgPiAyKTsKKyAgcC0+b2Zmc2V0X2xlbmd0aF9bMF0gPSBwLT5vZmZzZXRfbGVuZ3RoX1tzaXplIC0gMV0gPSAwOworICBmb3IgKGJhc2VfcG9zaXRpb24gPSBzaXplIC0gMjsgYmFzZV9wb3NpdGlvbiA+IDA7KSB7CisgICAgY29uc3QgaW50IG1heF9sZW4gPSBNYXhGaW5kQ29weUxlbmd0aChzaXplIC0gMSAtIGJhc2VfcG9zaXRpb24pOworICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiX3N0YXJ0ID0gYXJnYiArIGJhc2VfcG9zaXRpb247CisgICAgaW50IGl0ZXIgPSBpdGVyX21heDsKKyAgICBpbnQgYmVzdF9sZW5ndGggPSAwOworICAgIHVpbnQzMl90IGJlc3RfZGlzdGFuY2UgPSAwOworICAgIHVpbnQzMl90IGJlc3RfYXJnYjsKKyAgICBjb25zdCBpbnQgbWluX3BvcyA9CisgICAgICAgIChiYXNlX3Bvc2l0aW9uID4gd2luZG93X3NpemUpID8gYmFzZV9wb3NpdGlvbiAtIHdpbmRvd19zaXplIDogMDsKKyAgICBjb25zdCBpbnQgbGVuZ3RoX21heCA9IChtYXhfbGVuIDwgMjU2KSA/IG1heF9sZW4gOiAyNTY7CisgICAgdWludDMyX3QgbWF4X2Jhc2VfcG9zaXRpb247CisKKyAgICBwb3MgPSBjaGFpbltiYXNlX3Bvc2l0aW9uXTsKKyAgICBpZiAoIWxvd19lZmZvcnQpIHsKKyAgICAgIGludCBjdXJyX2xlbmd0aDsKKyAgICAgIC8vIEhldXJpc3RpYzogdXNlIHRoZSBjb21wYXJpc29uIHdpdGggdGhlIGFib3ZlIGxpbmUgYXMgYW4gaW5pdGlhbGl6YXRpb24uCisgICAgICBpZiAoYmFzZV9wb3NpdGlvbiA+PSAodWludDMyX3QpeHNpemUpIHsKKyAgICAgICAgY3Vycl9sZW5ndGggPSBGaW5kTWF0Y2hMZW5ndGgoYXJnYl9zdGFydCAtIHhzaXplLCBhcmdiX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0X2xlbmd0aCwgbWF4X2xlbik7CisgICAgICAgIGlmIChjdXJyX2xlbmd0aCA+IGJlc3RfbGVuZ3RoKSB7CisgICAgICAgICAgYmVzdF9sZW5ndGggPSBjdXJyX2xlbmd0aDsKKyAgICAgICAgICBiZXN0X2Rpc3RhbmNlID0geHNpemU7CisgICAgICAgIH0KKyAgICAgICAgLS1pdGVyOworICAgICAgfQorICAgICAgLy8gSGV1cmlzdGljOiBjb21wYXJlIHRvIHRoZSBwcmV2aW91cyBwaXhlbC4KKyAgICAgIGN1cnJfbGVuZ3RoID0KKyAgICAgICAgICBGaW5kTWF0Y2hMZW5ndGgoYXJnYl9zdGFydCAtIDEsIGFyZ2Jfc3RhcnQsIGJlc3RfbGVuZ3RoLCBtYXhfbGVuKTsKKyAgICAgIGlmIChjdXJyX2xlbmd0aCA+IGJlc3RfbGVuZ3RoKSB7CisgICAgICAgIGJlc3RfbGVuZ3RoID0gY3Vycl9sZW5ndGg7CisgICAgICAgIGJlc3RfZGlzdGFuY2UgPSAxOworICAgICAgfQorICAgICAgLS1pdGVyOworICAgICAgLy8gU2tpcCB0aGUgZm9yIGxvb3AgaWYgd2UgYWxyZWFkeSBoYXZlIHRoZSBtYXhpbXVtLgorICAgICAgaWYgKGJlc3RfbGVuZ3RoID09IE1BWF9MRU5HVEgpIHBvcyA9IG1pbl9wb3MgLSAxOworICAgIH0KKyAgICBiZXN0X2FyZ2IgPSBhcmdiX3N0YXJ0W2Jlc3RfbGVuZ3RoXTsKKworICAgIGZvciAoOyBwb3MgPj0gbWluX3BvcyAmJiAtLWl0ZXI7IHBvcyA9IGNoYWluW3Bvc10pIHsKKyAgICAgIGludCBjdXJyX2xlbmd0aDsKKyAgICAgIGFzc2VydChiYXNlX3Bvc2l0aW9uID4gKHVpbnQzMl90KXBvcyk7CisKKyAgICAgIGlmIChhcmdiW3BvcyArIGJlc3RfbGVuZ3RoXSAhPSBiZXN0X2FyZ2IpIGNvbnRpbnVlOworCisgICAgICBjdXJyX2xlbmd0aCA9IFZQOExWZWN0b3JNaXNtYXRjaChhcmdiICsgcG9zLCBhcmdiX3N0YXJ0LCBtYXhfbGVuKTsKKyAgICAgIGlmIChiZXN0X2xlbmd0aCA8IGN1cnJfbGVuZ3RoKSB7CisgICAgICAgIGJlc3RfbGVuZ3RoID0gY3Vycl9sZW5ndGg7CisgICAgICAgIGJlc3RfZGlzdGFuY2UgPSBiYXNlX3Bvc2l0aW9uIC0gcG9zOworICAgICAgICBiZXN0X2FyZ2IgPSBhcmdiX3N0YXJ0W2Jlc3RfbGVuZ3RoXTsKKyAgICAgICAgLy8gU3RvcCBpZiB3ZSBoYXZlIHJlYWNoZWQgYSBnb29kIGVub3VnaCBsZW5ndGguCisgICAgICAgIGlmIChiZXN0X2xlbmd0aCA+PSBsZW5ndGhfbWF4KSBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgLy8gV2UgaGF2ZSB0aGUgYmVzdCBtYXRjaCBidXQgaW4gY2FzZSB0aGUgdHdvIGludGVydmFscyBjb250aW51ZSBtYXRjaGluZworICAgIC8vIHRvIHRoZSBsZWZ0LCB3ZSBoYXZlIHRoZSBiZXN0IG1hdGNoZXMgZm9yIHRoZSBsZWZ0LWV4dGVuZGVkIHBpeGVscy4KKyAgICBtYXhfYmFzZV9wb3NpdGlvbiA9IGJhc2VfcG9zaXRpb247CisgICAgd2hpbGUgKDEpIHsKKyAgICAgIGFzc2VydChiZXN0X2xlbmd0aCA8PSBNQVhfTEVOR1RIKTsKKyAgICAgIGFzc2VydChiZXN0X2Rpc3RhbmNlIDw9IFdJTkRPV19TSVpFKTsKKyAgICAgIHAtPm9mZnNldF9sZW5ndGhfW2Jhc2VfcG9zaXRpb25dID0KKyAgICAgICAgICAoYmVzdF9kaXN0YW5jZSA8PCBNQVhfTEVOR1RIX0JJVFMpIHwgKHVpbnQzMl90KWJlc3RfbGVuZ3RoOworICAgICAgLS1iYXNlX3Bvc2l0aW9uOworICAgICAgLy8gU3RvcCBpZiB3ZSBkb24ndCBoYXZlIGEgbWF0Y2ggb3IgaWYgd2UgYXJlIG91dCBvZiBib3VuZHMuCisgICAgICBpZiAoYmVzdF9kaXN0YW5jZSA9PSAwIHx8IGJhc2VfcG9zaXRpb24gPT0gMCkgYnJlYWs7CisgICAgICAvLyBTdG9wIGlmIHdlIGNhbm5vdCBleHRlbmQgdGhlIG1hdGNoaW5nIGludGVydmFscyB0byB0aGUgbGVmdC4KKyAgICAgIGlmIChiYXNlX3Bvc2l0aW9uIDwgYmVzdF9kaXN0YW5jZSB8fAorICAgICAgICAgIGFyZ2JbYmFzZV9wb3NpdGlvbiAtIGJlc3RfZGlzdGFuY2VdICE9IGFyZ2JbYmFzZV9wb3NpdGlvbl0pIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAvLyBTdG9wIGlmIHdlIGFyZSBtYXRjaGluZyBhdCBpdHMgbGltaXQgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBhIGNsb3NlcgorICAgICAgLy8gbWF0Y2hpbmcgaW50ZXJ2YWwgd2l0aCB0aGUgc2FtZSBtYXhpbXVtIGxlbmd0aC4gVGhlbiBhZ2FpbiwgaWYgdGhlCisgICAgICAvLyBtYXRjaGluZyBpbnRlcnZhbCBpcyBhcyBjbG9zZSBhcyBwb3NzaWJsZSAoYmVzdF9kaXN0YW5jZSA9PSAxKSwgd2Ugd2lsbAorICAgICAgLy8gbmV2ZXIgZmluZCBhbnl0aGluZyBiZXR0ZXIgc28gbGV0J3MgY29udGludWUuCisgICAgICBpZiAoYmVzdF9sZW5ndGggPT0gTUFYX0xFTkdUSCAmJiBiZXN0X2Rpc3RhbmNlICE9IDEgJiYKKyAgICAgICAgICBiYXNlX3Bvc2l0aW9uICsgTUFYX0xFTkdUSCA8IG1heF9iYXNlX3Bvc2l0aW9uKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKGJlc3RfbGVuZ3RoIDwgTUFYX0xFTkdUSCkgeworICAgICAgICArK2Jlc3RfbGVuZ3RoOworICAgICAgICBtYXhfYmFzZV9wb3NpdGlvbiA9IGJhc2VfcG9zaXRpb247CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBBZGRTaW5nbGVMaXRlcmFsKHVpbnQzMl90IHBpeGVsLCBpbnQgdXNlX2NvbG9yX2NhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQ29sb3JDYWNoZSogY29uc3QgaGFzaGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcykgeworICBQaXhPckNvcHkgdjsKKyAgaWYgKHVzZV9jb2xvcl9jYWNoZSkgeworICAgIGNvbnN0IHVpbnQzMl90IGtleSA9IFZQOExDb2xvckNhY2hlR2V0SW5kZXgoaGFzaGVycywgcGl4ZWwpOworICAgIGlmIChWUDhMQ29sb3JDYWNoZUxvb2t1cChoYXNoZXJzLCBrZXkpID09IHBpeGVsKSB7CisgICAgICB2ID0gUGl4T3JDb3B5Q3JlYXRlQ2FjaGVJZHgoa2V5KTsKKyAgICB9IGVsc2UgeworICAgICAgdiA9IFBpeE9yQ29weUNyZWF0ZUxpdGVyYWwocGl4ZWwpOworICAgICAgVlA4TENvbG9yQ2FjaGVTZXQoaGFzaGVycywga2V5LCBwaXhlbCk7CisgICAgfQorICB9IGVsc2UgeworICAgIHYgPSBQaXhPckNvcHlDcmVhdGVMaXRlcmFsKHBpeGVsKTsKKyAgfQorICBWUDhMQmFja3dhcmRSZWZzQ3Vyc29yQWRkKHJlZnMsIHYpOworfQorCitzdGF0aWMgaW50IEJhY2t3YXJkUmVmZXJlbmNlc1JsZShpbnQgeHNpemUsIGludCB5c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhY2hlX2JpdHMsIFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMpIHsKKyAgY29uc3QgaW50IHBpeF9jb3VudCA9IHhzaXplICogeXNpemU7CisgIGludCBpLCBrOworICBjb25zdCBpbnQgdXNlX2NvbG9yX2NhY2hlID0gKGNhY2hlX2JpdHMgPiAwKTsKKyAgVlA4TENvbG9yQ2FjaGUgaGFzaGVyczsKKworICBpZiAodXNlX2NvbG9yX2NhY2hlICYmICFWUDhMQ29sb3JDYWNoZUluaXQoJmhhc2hlcnMsIGNhY2hlX2JpdHMpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgVlA4TENsZWFyQmFja3dhcmRSZWZzKHJlZnMpOworICAvLyBBZGQgZmlyc3QgcGl4ZWwgYXMgbGl0ZXJhbC4KKyAgQWRkU2luZ2xlTGl0ZXJhbChhcmdiWzBdLCB1c2VfY29sb3JfY2FjaGUsICZoYXNoZXJzLCByZWZzKTsKKyAgaSA9IDE7CisgIHdoaWxlIChpIDwgcGl4X2NvdW50KSB7CisgICAgY29uc3QgaW50IG1heF9sZW4gPSBNYXhGaW5kQ29weUxlbmd0aChwaXhfY291bnQgLSBpKTsKKyAgICBjb25zdCBpbnQgcmxlX2xlbiA9IEZpbmRNYXRjaExlbmd0aChhcmdiICsgaSwgYXJnYiArIGkgLSAxLCAwLCBtYXhfbGVuKTsKKyAgICBjb25zdCBpbnQgcHJldl9yb3dfbGVuID0gKGkgPCB4c2l6ZSkgPyAwIDoKKyAgICAgICAgRmluZE1hdGNoTGVuZ3RoKGFyZ2IgKyBpLCBhcmdiICsgaSAtIHhzaXplLCAwLCBtYXhfbGVuKTsKKyAgICBpZiAocmxlX2xlbiA+PSBwcmV2X3Jvd19sZW4gJiYgcmxlX2xlbiA+PSBNSU5fTEVOR1RIKSB7CisgICAgICBWUDhMQmFja3dhcmRSZWZzQ3Vyc29yQWRkKHJlZnMsIFBpeE9yQ29weUNyZWF0ZUNvcHkoMSwgcmxlX2xlbikpOworICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0byB1cGRhdGUgdGhlIGNvbG9yIGNhY2hlIGhlcmUgc2luY2UgaXQgaXMgYWx3YXlzIHRoZQorICAgICAgLy8gc2FtZSBwaXhlbCBiZWluZyBjb3BpZWQsIGFuZCB0aGF0IGRvZXMgbm90IGNoYW5nZSB0aGUgY29sb3IgY2FjaGUKKyAgICAgIC8vIHN0YXRlLgorICAgICAgaSArPSBybGVfbGVuOworICAgIH0gZWxzZSBpZiAocHJldl9yb3dfbGVuID49IE1JTl9MRU5HVEgpIHsKKyAgICAgIFZQOExCYWNrd2FyZFJlZnNDdXJzb3JBZGQocmVmcywgUGl4T3JDb3B5Q3JlYXRlQ29weSh4c2l6ZSwgcHJldl9yb3dfbGVuKSk7CisgICAgICBpZiAodXNlX2NvbG9yX2NhY2hlKSB7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCBwcmV2X3Jvd19sZW47ICsraykgeworICAgICAgICAgIFZQOExDb2xvckNhY2hlSW5zZXJ0KCZoYXNoZXJzLCBhcmdiW2kgKyBrXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGkgKz0gcHJldl9yb3dfbGVuOworICAgIH0gZWxzZSB7CisgICAgICBBZGRTaW5nbGVMaXRlcmFsKGFyZ2JbaV0sIHVzZV9jb2xvcl9jYWNoZSwgJmhhc2hlcnMsIHJlZnMpOworICAgICAgaSsrOworICAgIH0KKyAgfQorICBpZiAodXNlX2NvbG9yX2NhY2hlKSBWUDhMQ29sb3JDYWNoZUNsZWFyKCZoYXNoZXJzKTsKKyAgcmV0dXJuICFyZWZzLT5lcnJvcl87Cit9CisKK3N0YXRpYyBpbnQgQmFja3dhcmRSZWZlcmVuY2VzTHo3NyhpbnQgeHNpemUsIGludCB5c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwgaW50IGNhY2hlX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TEhhc2hDaGFpbiogY29uc3QgaGFzaF9jaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzKSB7CisgIGludCBpOworICBpbnQgaV9sYXN0X2NoZWNrID0gLTE7CisgIGludCBvayA9IDA7CisgIGludCBjY19pbml0ID0gMDsKKyAgY29uc3QgaW50IHVzZV9jb2xvcl9jYWNoZSA9IChjYWNoZV9iaXRzID4gMCk7CisgIGNvbnN0IGludCBwaXhfY291bnQgPSB4c2l6ZSAqIHlzaXplOworICBWUDhMQ29sb3JDYWNoZSBoYXNoZXJzOworCisgIGlmICh1c2VfY29sb3JfY2FjaGUpIHsKKyAgICBjY19pbml0ID0gVlA4TENvbG9yQ2FjaGVJbml0KCZoYXNoZXJzLCBjYWNoZV9iaXRzKTsKKyAgICBpZiAoIWNjX2luaXQpIGdvdG8gRXJyb3I7CisgIH0KKyAgVlA4TENsZWFyQmFja3dhcmRSZWZzKHJlZnMpOworICBmb3IgKGkgPSAwOyBpIDwgcGl4X2NvdW50OykgeworICAgIC8vIEFsdGVybmF0aXZlIzE6IENvZGUgdGhlIHBpeGVscyBzdGFydGluZyBhdCAnaScgdXNpbmcgYmFja3dhcmQgcmVmZXJlbmNlLgorICAgIGludCBvZmZzZXQgPSAwOworICAgIGludCBsZW4gPSAwOworICAgIGludCBqOworICAgIFZQOExIYXNoQ2hhaW5GaW5kQ29weShoYXNoX2NoYWluLCBpLCAmb2Zmc2V0LCAmbGVuKTsKKyAgICBpZiAobGVuID49IE1JTl9MRU5HVEgpIHsKKyAgICAgIGNvbnN0IGludCBsZW5faW5pID0gbGVuOworICAgICAgaW50IG1heF9yZWFjaCA9IDA7CisgICAgICBjb25zdCBpbnQgal9tYXggPQorICAgICAgICAgIChpICsgbGVuX2luaSA+PSBwaXhfY291bnQpID8gcGl4X2NvdW50IC0gMSA6IGkgKyBsZW5faW5pOworICAgICAgLy8gT25seSBzdGFydCBmcm9tIHdoYXQgd2UgaGF2ZSBub3QgY2hlY2tlZCBhbHJlYWR5LgorICAgICAgaV9sYXN0X2NoZWNrID0gKGkgPiBpX2xhc3RfY2hlY2spID8gaSA6IGlfbGFzdF9jaGVjazsKKyAgICAgIC8vIFdlIGtub3cgdGhlIGJlc3QgbWF0Y2ggZm9yIHRoZSBjdXJyZW50IHBpeGVsIGJ1dCB3ZSB0cnkgdG8gZmluZCB0aGUKKyAgICAgIC8vIGJlc3QgbWF0Y2hlcyBmb3IgdGhlIGN1cnJlbnQgcGl4ZWwgQU5EIHRoZSBuZXh0IG9uZSBjb21iaW5lZC4KKyAgICAgIC8vIFRoZSBuYWl2ZSBtZXRob2Qgd291bGQgdXNlIHRoZSBpbnRlcnZhbHM6CisgICAgICAvLyBbaSxpK2xlbikgKyBbaStsZW4sIGxlbmd0aCBvZiBiZXN0IG1hdGNoIGF0IGkrbGVuKQorICAgICAgLy8gd2hpbGUgd2UgY2hlY2sgaWYgd2UgY2FuIHVzZToKKyAgICAgIC8vIFtpLGopICh3aGVyZSBqPD1pK2xlbikgKyBbaiwgbGVuZ3RoIG9mIGJlc3QgbWF0Y2ggYXQgaikKKyAgICAgIGZvciAoaiA9IGlfbGFzdF9jaGVjayArIDE7IGogPD0gal9tYXg7ICsraikgeworICAgICAgICBjb25zdCBpbnQgbGVuX2ogPSBWUDhMSGFzaENoYWluRmluZExlbmd0aChoYXNoX2NoYWluLCBqKTsKKyAgICAgICAgY29uc3QgaW50IHJlYWNoID0KKyAgICAgICAgICAgIGogKyAobGVuX2ogPj0gTUlOX0xFTkdUSCA/IGxlbl9qIDogMSk7ICAvLyAxIGZvciBzaW5nbGUgbGl0ZXJhbC4KKyAgICAgICAgaWYgKHJlYWNoID4gbWF4X3JlYWNoKSB7CisgICAgICAgICAgbGVuID0gaiAtIGk7CisgICAgICAgICAgbWF4X3JlYWNoID0gcmVhY2g7CisgICAgICAgICAgaWYgKG1heF9yZWFjaCA+PSBwaXhfY291bnQpIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGxlbiA9IDE7CisgICAgfQorICAgIC8vIEdvIHdpdGggbGl0ZXJhbCBvciBiYWNrd2FyZCByZWZlcmVuY2UuCisgICAgYXNzZXJ0KGxlbiA+IDApOworICAgIGlmIChsZW4gPT0gMSkgeworICAgICAgQWRkU2luZ2xlTGl0ZXJhbChhcmdiW2ldLCB1c2VfY29sb3JfY2FjaGUsICZoYXNoZXJzLCByZWZzKTsKKyAgICB9IGVsc2UgeworICAgICAgVlA4TEJhY2t3YXJkUmVmc0N1cnNvckFkZChyZWZzLCBQaXhPckNvcHlDcmVhdGVDb3B5KG9mZnNldCwgbGVuKSk7CisgICAgICBpZiAodXNlX2NvbG9yX2NhY2hlKSB7CisgICAgICAgIGZvciAoaiA9IGk7IGogPCBpICsgbGVuOyArK2opIFZQOExDb2xvckNhY2hlSW5zZXJ0KCZoYXNoZXJzLCBhcmdiW2pdKTsKKyAgICAgIH0KKyAgICB9CisgICAgaSArPSBsZW47CisgIH0KKworICBvayA9ICFyZWZzLT5lcnJvcl87CisgRXJyb3I6CisgIGlmIChjY19pbml0KSBWUDhMQ29sb3JDYWNoZUNsZWFyKCZoYXNoZXJzKTsKKyAgcmV0dXJuIG9rOworfQorCisvLyBDb21wdXRlIGFuIExaNzcgYnkgZm9yY2luZyBtYXRjaGVzIHRvIGhhcHBlbiB3aXRoaW4gYSBnaXZlbiBkaXN0YW5jZSBjb3N0LgorLy8gV2UgdGhlcmVmb3JlIGxpbWl0IHRoZSBhbGdvcml0aG0gdG8gdGhlIGxvd2VzdCAzMiB2YWx1ZXMgaW4gdGhlIFBsYW5lQ29kZQorLy8gZGVmaW5pdGlvbi4KKyNkZWZpbmUgV0lORE9XX09GRlNFVFNfU0laRV9NQVggMzIKK3N0YXRpYyBpbnQgQmFja3dhcmRSZWZlcmVuY2VzTHo3N0JveChpbnQgeHNpemUsIGludCB5c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwgaW50IGNhY2hlX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TEhhc2hDaGFpbiogY29uc3QgaGFzaF9jaGFpbl9iZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExIYXNoQ2hhaW4qIGhhc2hfY2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcykgeworICBpbnQgaTsKKyAgY29uc3QgaW50IHBpeF9jb3VudCA9IHhzaXplICogeXNpemU7CisgIHVpbnQxNl90KiBjb3VudHM7CisgIGludCB3aW5kb3dfb2Zmc2V0c1tXSU5ET1dfT0ZGU0VUU19TSVpFX01BWF0gPSB7MH07CisgIGludCB3aW5kb3dfb2Zmc2V0c19uZXdbV0lORE9XX09GRlNFVFNfU0laRV9NQVhdID0gezB9OworICBpbnQgd2luZG93X29mZnNldHNfc2l6ZSA9IDA7CisgIGludCB3aW5kb3dfb2Zmc2V0c19uZXdfc2l6ZSA9IDA7CisgIHVpbnQxNl90KiBjb25zdCBjb3VudHNfaW5pID0KKyAgICAgICh1aW50MTZfdCopV2ViUFNhZmVNYWxsb2MoeHNpemUgKiB5c2l6ZSwgc2l6ZW9mKCpjb3VudHNfaW5pKSk7CisgIGludCBiZXN0X29mZnNldF9wcmV2ID0gLTEsIGJlc3RfbGVuZ3RoX3ByZXYgPSAtMTsKKyAgaWYgKGNvdW50c19pbmkgPT0gTlVMTCkgcmV0dXJuIDA7CisKKyAgLy8gY291bnRzW2ldIGNvdW50cyBob3cgbWFueSB0aW1lcyBhIHBpeGVsIGlzIHJlcGVhdGVkIHN0YXJ0aW5nIGF0IHBvc2l0aW9uIGkuCisgIGkgPSBwaXhfY291bnQgLSAyOworICBjb3VudHMgPSBjb3VudHNfaW5pICsgaTsKKyAgY291bnRzWzFdID0gMTsKKyAgZm9yICg7IGkgPj0gMDsgLS1pLCAtLWNvdW50cykgeworICAgIGlmIChhcmdiW2ldID09IGFyZ2JbaSArIDFdKSB7CisgICAgICAvLyBNYXggb3V0IHRoZSBjb3VudHMgdG8gTUFYX0xFTkdUSC4KKyAgICAgIGNvdW50c1swXSA9IGNvdW50c1sxXSArIChjb3VudHNbMV0gIT0gTUFYX0xFTkdUSCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGNvdW50c1swXSA9IDE7CisgICAgfQorICB9CisKKyAgLy8gRmlndXJlIG91dCB0aGUgd2luZG93IG9mZnNldHMgYXJvdW5kIGEgcGl4ZWwuIFRoZXkgYXJlIHN0b3JlZCBpbiBhCisgIC8vIHNwaXJhbGluZyBvcmRlciBhcm91bmQgdGhlIHBpeGVsIGFzIGRlZmluZWQgYnkgVlA4TERpc3RhbmNlVG9QbGFuZUNvZGUuCisgIHsKKyAgICBpbnQgeCwgeTsKKyAgICBmb3IgKHkgPSAwOyB5IDw9IDY7ICsreSkgeworICAgICAgZm9yICh4ID0gLTY7IHggPD0gNjsgKyt4KSB7CisgICAgICAgIGNvbnN0IGludCBvZmZzZXQgPSB5ICogeHNpemUgKyB4OworICAgICAgICBpbnQgcGxhbmVfY29kZTsKKyAgICAgICAgLy8gSWdub3JlIG9mZnNldHMgdGhhdCBicmluZyB1cyBhZnRlciB0aGUgcGl4ZWwuCisgICAgICAgIGlmIChvZmZzZXQgPD0gMCkgY29udGludWU7CisgICAgICAgIHBsYW5lX2NvZGUgPSBWUDhMRGlzdGFuY2VUb1BsYW5lQ29kZSh4c2l6ZSwgb2Zmc2V0KSAtIDE7CisgICAgICAgIGlmIChwbGFuZV9jb2RlID49IFdJTkRPV19PRkZTRVRTX1NJWkVfTUFYKSBjb250aW51ZTsKKyAgICAgICAgd2luZG93X29mZnNldHNbcGxhbmVfY29kZV0gPSBvZmZzZXQ7CisgICAgICB9CisgICAgfQorICAgIC8vIEZvciBuYXJyb3cgaW1hZ2VzLCBub3QgYWxsIHBsYW5lIGNvZGVzIGFyZSByZWFjaGVkLCBzbyByZW1vdmUgdGhvc2UuCisgICAgZm9yIChpID0gMDsgaSA8IFdJTkRPV19PRkZTRVRTX1NJWkVfTUFYOyArK2kpIHsKKyAgICAgIGlmICh3aW5kb3dfb2Zmc2V0c1tpXSA9PSAwKSBjb250aW51ZTsKKyAgICAgIHdpbmRvd19vZmZzZXRzW3dpbmRvd19vZmZzZXRzX3NpemUrK10gPSB3aW5kb3dfb2Zmc2V0c1tpXTsKKyAgICB9CisgICAgLy8gR2l2ZW4gYSBwaXhlbCBQLCBmaW5kIHRoZSBvZmZzZXRzIHRoYXQgcmVhY2ggcGl4ZWxzIHVucmVhY2hhYmxlIGZyb20gUC0xCisgICAgLy8gd2l0aCBhbnkgb2YgdGhlIG9mZnNldHMgaW4gd2luZG93X29mZnNldHNbXS4KKyAgICBmb3IgKGkgPSAwOyBpIDwgd2luZG93X29mZnNldHNfc2l6ZTsgKytpKSB7CisgICAgICBpbnQgajsKKyAgICAgIGludCBpc19yZWFjaGFibGUgPSAwOworICAgICAgZm9yIChqID0gMDsgaiA8IHdpbmRvd19vZmZzZXRzX3NpemUgJiYgIWlzX3JlYWNoYWJsZTsgKytqKSB7CisgICAgICAgIGlzX3JlYWNoYWJsZSB8PSAod2luZG93X29mZnNldHNbaV0gPT0gd2luZG93X29mZnNldHNbal0gKyAxKTsKKyAgICAgIH0KKyAgICAgIGlmICghaXNfcmVhY2hhYmxlKSB7CisgICAgICAgIHdpbmRvd19vZmZzZXRzX25ld1t3aW5kb3dfb2Zmc2V0c19uZXdfc2l6ZV0gPSB3aW5kb3dfb2Zmc2V0c1tpXTsKKyAgICAgICAgKyt3aW5kb3dfb2Zmc2V0c19uZXdfc2l6ZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBoYXNoX2NoYWluLT5vZmZzZXRfbGVuZ3RoX1swXSA9IDA7CisgIGZvciAoaSA9IDE7IGkgPCBwaXhfY291bnQ7ICsraSkgeworICAgIGludCBpbmQ7CisgICAgaW50IGJlc3RfbGVuZ3RoID0gVlA4TEhhc2hDaGFpbkZpbmRMZW5ndGgoaGFzaF9jaGFpbl9iZXN0LCBpKTsKKyAgICBpbnQgYmVzdF9vZmZzZXQ7CisgICAgaW50IGRvX2NvbXB1dGUgPSAxOworCisgICAgaWYgKGJlc3RfbGVuZ3RoID49IE1BWF9MRU5HVEgpIHsKKyAgICAgIC8vIERvIG5vdCByZWNvbXB1dGUgdGhlIGJlc3QgbWF0Y2ggaWYgd2UgYWxyZWFkeSBoYXZlIGEgbWF4aW1hbCBvbmUgaW4gdGhlCisgICAgICAvLyB3aW5kb3cuCisgICAgICBiZXN0X29mZnNldCA9IFZQOExIYXNoQ2hhaW5GaW5kT2Zmc2V0KGhhc2hfY2hhaW5fYmVzdCwgaSk7CisgICAgICBmb3IgKGluZCA9IDA7IGluZCA8IHdpbmRvd19vZmZzZXRzX3NpemU7ICsraW5kKSB7CisgICAgICAgIGlmIChiZXN0X29mZnNldCA9PSB3aW5kb3dfb2Zmc2V0c1tpbmRdKSB7CisgICAgICAgICAgZG9fY29tcHV0ZSA9IDA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGRvX2NvbXB1dGUpIHsKKyAgICAgIC8vIEZpZ3VyZSBvdXQgaWYgd2Ugc2hvdWxkIHVzZSB0aGUgb2Zmc2V0L2xlbmd0aCBmcm9tIHRoZSBwcmV2aW91cyBwaXhlbAorICAgICAgLy8gYXMgYW4gaW5pdGlhbCBndWVzcyBhbmQgdGhlcmVmb3JlIG9ubHkgaW5zcGVjdCB0aGUgb2Zmc2V0cyBpbgorICAgICAgLy8gd2luZG93X29mZnNldHNfbmV3W10uCisgICAgICBjb25zdCBpbnQgdXNlX3ByZXYgPQorICAgICAgICAgIChiZXN0X2xlbmd0aF9wcmV2ID4gMSkgJiYgKGJlc3RfbGVuZ3RoX3ByZXYgPCBNQVhfTEVOR1RIKTsKKyAgICAgIGNvbnN0IGludCBudW1faW5kID0KKyAgICAgICAgICB1c2VfcHJldiA/IHdpbmRvd19vZmZzZXRzX25ld19zaXplIDogd2luZG93X29mZnNldHNfc2l6ZTsKKyAgICAgIGJlc3RfbGVuZ3RoID0gdXNlX3ByZXYgPyBiZXN0X2xlbmd0aF9wcmV2IC0gMSA6IDA7CisgICAgICBiZXN0X29mZnNldCA9IHVzZV9wcmV2ID8gYmVzdF9vZmZzZXRfcHJldiA6IDA7CisgICAgICAvLyBGaW5kIHRoZSBsb25nZXN0IG1hdGNoIGluIGEgd2luZG93IGFyb3VuZCB0aGUgcGl4ZWwuCisgICAgICBmb3IgKGluZCA9IDA7IGluZCA8IG51bV9pbmQ7ICsraW5kKSB7CisgICAgICAgIGludCBjdXJyX2xlbmd0aCA9IDA7CisgICAgICAgIGludCBqID0gaTsKKyAgICAgICAgaW50IGpfb2Zmc2V0ID0KKyAgICAgICAgICAgIHVzZV9wcmV2ID8gaSAtIHdpbmRvd19vZmZzZXRzX25ld1tpbmRdIDogaSAtIHdpbmRvd19vZmZzZXRzW2luZF07CisgICAgICAgIGlmIChqX29mZnNldCA8IDAgfHwgYXJnYltqX29mZnNldF0gIT0gYXJnYltpXSkgY29udGludWU7CisgICAgICAgIC8vIFRoZSBsb25nZXN0IG1hdGNoIGlzIHRoZSBzdW0gb2YgaG93IG1hbnkgdGltZXMgZWFjaCBwaXhlbCBpcworICAgICAgICAvLyByZXBlYXRlZC4KKyAgICAgICAgZG8geworICAgICAgICAgIGNvbnN0IGludCBjb3VudHNfal9vZmZzZXQgPSBjb3VudHNfaW5pW2pfb2Zmc2V0XTsKKyAgICAgICAgICBjb25zdCBpbnQgY291bnRzX2ogPSBjb3VudHNfaW5pW2pdOworICAgICAgICAgIGlmIChjb3VudHNfal9vZmZzZXQgIT0gY291bnRzX2opIHsKKyAgICAgICAgICAgIGN1cnJfbGVuZ3RoICs9CisgICAgICAgICAgICAgICAgKGNvdW50c19qX29mZnNldCA8IGNvdW50c19qKSA/IGNvdW50c19qX29mZnNldCA6IGNvdW50c19qOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIC8vIFRoZSBzYW1lIGNvbG9yIGlzIHJlcGVhdGVkIGNvdW50c19wb3MgdGltZXMgYXQgal9vZmZzZXQgYW5kIGouCisgICAgICAgICAgY3Vycl9sZW5ndGggKz0gY291bnRzX2pfb2Zmc2V0OworICAgICAgICAgIGpfb2Zmc2V0ICs9IGNvdW50c19qX29mZnNldDsKKyAgICAgICAgICBqICs9IGNvdW50c19qX29mZnNldDsKKyAgICAgICAgfSB3aGlsZSAoY3Vycl9sZW5ndGggPD0gTUFYX0xFTkdUSCAmJiBqIDwgcGl4X2NvdW50ICYmCisgICAgICAgICAgICAgICAgIGFyZ2Jbal9vZmZzZXRdID09IGFyZ2Jbal0pOworICAgICAgICBpZiAoYmVzdF9sZW5ndGggPCBjdXJyX2xlbmd0aCkgeworICAgICAgICAgIGJlc3Rfb2Zmc2V0ID0KKyAgICAgICAgICAgICAgdXNlX3ByZXYgPyB3aW5kb3dfb2Zmc2V0c19uZXdbaW5kXSA6IHdpbmRvd19vZmZzZXRzW2luZF07CisgICAgICAgICAgaWYgKGN1cnJfbGVuZ3RoID49IE1BWF9MRU5HVEgpIHsKKyAgICAgICAgICAgIGJlc3RfbGVuZ3RoID0gTUFYX0xFTkdUSDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBiZXN0X2xlbmd0aCA9IGN1cnJfbGVuZ3RoOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGFzc2VydChpICsgYmVzdF9sZW5ndGggPD0gcGl4X2NvdW50KTsKKyAgICBhc3NlcnQoYmVzdF9sZW5ndGggPD0gTUFYX0xFTkdUSCk7CisgICAgaWYgKGJlc3RfbGVuZ3RoIDw9IE1JTl9MRU5HVEgpIHsKKyAgICAgIGhhc2hfY2hhaW4tPm9mZnNldF9sZW5ndGhfW2ldID0gMDsKKyAgICAgIGJlc3Rfb2Zmc2V0X3ByZXYgPSAwOworICAgICAgYmVzdF9sZW5ndGhfcHJldiA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIGhhc2hfY2hhaW4tPm9mZnNldF9sZW5ndGhfW2ldID0KKyAgICAgICAgICAoYmVzdF9vZmZzZXQgPDwgTUFYX0xFTkdUSF9CSVRTKSB8ICh1aW50MzJfdCliZXN0X2xlbmd0aDsKKyAgICAgIGJlc3Rfb2Zmc2V0X3ByZXYgPSBiZXN0X29mZnNldDsKKyAgICAgIGJlc3RfbGVuZ3RoX3ByZXYgPSBiZXN0X2xlbmd0aDsKKyAgICB9CisgIH0KKyAgaGFzaF9jaGFpbi0+b2Zmc2V0X2xlbmd0aF9bMF0gPSAwOworICBXZWJQU2FmZUZyZWUoY291bnRzX2luaSk7CisKKyAgcmV0dXJuIEJhY2t3YXJkUmVmZXJlbmNlc0x6NzcoeHNpemUsIHlzaXplLCBhcmdiLCBjYWNoZV9iaXRzLCBoYXNoX2NoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZzKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgQmFja3dhcmRSZWZlcmVuY2VzMkRMb2NhbGl0eShpbnQgeHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMpIHsKKyAgVlA4TFJlZnNDdXJzb3IgYyA9IFZQOExSZWZzQ3Vyc29ySW5pdChyZWZzKTsKKyAgd2hpbGUgKFZQOExSZWZzQ3Vyc29yT2soJmMpKSB7CisgICAgaWYgKFBpeE9yQ29weUlzQ29weShjLmN1cl9wb3MpKSB7CisgICAgICBjb25zdCBpbnQgZGlzdCA9IGMuY3VyX3Bvcy0+YXJnYl9vcl9kaXN0YW5jZTsKKyAgICAgIGNvbnN0IGludCB0cmFuc2Zvcm1lZF9kaXN0ID0gVlA4TERpc3RhbmNlVG9QbGFuZUNvZGUoeHNpemUsIGRpc3QpOworICAgICAgYy5jdXJfcG9zLT5hcmdiX29yX2Rpc3RhbmNlID0gdHJhbnNmb3JtZWRfZGlzdDsKKyAgICB9CisgICAgVlA4TFJlZnNDdXJzb3JOZXh0KCZjKTsKKyAgfQorfQorCisvLyBFdmFsdWF0ZSBvcHRpbWFsIGNhY2hlIGJpdHMgZm9yIHRoZSBsb2NhbCBjb2xvciBjYWNoZS4KKy8vIFRoZSBpbnB1dCAqYmVzdF9jYWNoZV9iaXRzIHNldHMgdGhlIG1heGltdW0gY2FjaGUgYml0cyB0byB1c2UgKHBhc3NpbmcgMAorLy8gaW1wbGllcyBkaXNhYmxpbmcgdGhlIGxvY2FsIGNvbG9yIGNhY2hlKS4gVGhlIGxvY2FsIGNvbG9yIGNhY2hlIGlzIGFsc28KKy8vIGRpc2FibGVkIGZvciB0aGUgbG93ZXIgKDw9IDI1KSBxdWFsaXR5LgorLy8gUmV0dXJucyAwIGluIGNhc2Ugb2YgbWVtb3J5IGVycm9yLgorc3RhdGljIGludCBDYWxjdWxhdGVCZXN0Q2FjaGVTaXplKGNvbnN0IHVpbnQzMl90KiBhcmdiLCBpbnQgcXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgYmVzdF9jYWNoZV9iaXRzKSB7CisgIGludCBpOworICBjb25zdCBpbnQgY2FjaGVfYml0c19tYXggPSAocXVhbGl0eSA8PSAyNSkgPyAwIDogKmJlc3RfY2FjaGVfYml0czsKKyAgZG91YmxlIGVudHJvcHlfbWluID0gTUFYX0VOVFJPUFk7CisgIGludCBjY19pbml0W01BWF9DT0xPUl9DQUNIRV9CSVRTICsgMV0gPSB7IDAgfTsKKyAgVlA4TENvbG9yQ2FjaGUgaGFzaGVyc1tNQVhfQ09MT1JfQ0FDSEVfQklUUyArIDFdOworICBWUDhMUmVmc0N1cnNvciBjID0gVlA4TFJlZnNDdXJzb3JJbml0KHJlZnMpOworICBWUDhMSGlzdG9ncmFtKiBoaXN0b3NbTUFYX0NPTE9SX0NBQ0hFX0JJVFMgKyAxXSA9IHsgTlVMTCB9OworICBpbnQgb2sgPSAwOworCisgIGFzc2VydChjYWNoZV9iaXRzX21heCA+PSAwICYmIGNhY2hlX2JpdHNfbWF4IDw9IE1BWF9DT0xPUl9DQUNIRV9CSVRTKTsKKworICBpZiAoY2FjaGVfYml0c19tYXggPT0gMCkgeworICAgICpiZXN0X2NhY2hlX2JpdHMgPSAwOworICAgIC8vIExvY2FsIGNvbG9yIGNhY2hlIGlzIGRpc2FibGVkLgorICAgIHJldHVybiAxOworICB9CisKKyAgLy8gQWxsb2NhdGUgZGF0YS4KKyAgZm9yIChpID0gMDsgaSA8PSBjYWNoZV9iaXRzX21heDsgKytpKSB7CisgICAgaGlzdG9zW2ldID0gVlA4TEFsbG9jYXRlSGlzdG9ncmFtKGkpOworICAgIGlmIChoaXN0b3NbaV0gPT0gTlVMTCkgZ290byBFcnJvcjsKKyAgICBpZiAoaSA9PSAwKSBjb250aW51ZTsKKyAgICBjY19pbml0W2ldID0gVlA4TENvbG9yQ2FjaGVJbml0KCZoYXNoZXJzW2ldLCBpKTsKKyAgICBpZiAoIWNjX2luaXRbaV0pIGdvdG8gRXJyb3I7CisgIH0KKworICAvLyBGaW5kIHRoZSBjYWNoZV9iaXRzIGdpdmluZyB0aGUgbG93ZXN0IGVudHJvcHkuIFRoZSBzZWFyY2ggaXMgZG9uZSBpbiBhCisgIC8vIGJydXRlLWZvcmNlIHdheSBhcyB0aGUgZnVuY3Rpb24gKGVudHJvcHkgdy5yLnQgY2FjaGVfYml0cykgY2FuIGJlCisgIC8vIGFueXRoaW5nIGluIHByYWN0aWNlLgorICB3aGlsZSAoVlA4TFJlZnNDdXJzb3JPaygmYykpIHsKKyAgICBjb25zdCBQaXhPckNvcHkqIGNvbnN0IHYgPSBjLmN1cl9wb3M7CisgICAgaWYgKFBpeE9yQ29weUlzTGl0ZXJhbCh2KSkgeworICAgICAgY29uc3QgdWludDMyX3QgcGl4ID0gKmFyZ2IrKzsKKyAgICAgIGNvbnN0IHVpbnQzMl90IGEgPSAocGl4ID4+IDI0KSAmIDB4ZmY7CisgICAgICBjb25zdCB1aW50MzJfdCByID0gKHBpeCA+PiAxNikgJiAweGZmOworICAgICAgY29uc3QgdWludDMyX3QgZyA9IChwaXggPj4gIDgpICYgMHhmZjsKKyAgICAgIGNvbnN0IHVpbnQzMl90IGIgPSAocGl4ID4+ICAwKSAmIDB4ZmY7CisgICAgICAvLyBUaGUga2V5cyBvZiB0aGUgY2FjaGVzIGNhbiBiZSBkZXJpdmVkIGZyb20gdGhlIGxvbmdlc3Qgb25lLgorICAgICAgaW50IGtleSA9IFZQOExIYXNoUGl4KHBpeCwgMzIgLSBjYWNoZV9iaXRzX21heCk7CisgICAgICAvLyBEbyBub3QgdXNlIHRoZSBjb2xvciBjYWNoZSBmb3IgY2FjaGVfYml0cyA9IDAuCisgICAgICArK2hpc3Rvc1swXS0+Ymx1ZV9bYl07CisgICAgICArK2hpc3Rvc1swXS0+bGl0ZXJhbF9bZ107CisgICAgICArK2hpc3Rvc1swXS0+cmVkX1tyXTsKKyAgICAgICsraGlzdG9zWzBdLT5hbHBoYV9bYV07CisgICAgICAvLyBEZWFsIHdpdGggY2FjaGVfYml0cyA+IDAuCisgICAgICBmb3IgKGkgPSBjYWNoZV9iaXRzX21heDsgaSA+PSAxOyAtLWksIGtleSA+Pj0gMSkgeworICAgICAgICBpZiAoVlA4TENvbG9yQ2FjaGVMb29rdXAoJmhhc2hlcnNbaV0sIGtleSkgPT0gcGl4KSB7CisgICAgICAgICAgKytoaXN0b3NbaV0tPmxpdGVyYWxfW05VTV9MSVRFUkFMX0NPREVTICsgTlVNX0xFTkdUSF9DT0RFUyArIGtleV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgVlA4TENvbG9yQ2FjaGVTZXQoJmhhc2hlcnNbaV0sIGtleSwgcGl4KTsKKyAgICAgICAgICArK2hpc3Rvc1tpXS0+Ymx1ZV9bYl07CisgICAgICAgICAgKytoaXN0b3NbaV0tPmxpdGVyYWxfW2ddOworICAgICAgICAgICsraGlzdG9zW2ldLT5yZWRfW3JdOworICAgICAgICAgICsraGlzdG9zW2ldLT5hbHBoYV9bYV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLy8gV2Ugc2hvdWxkIGNvbXB1dGUgdGhlIGNvbnRyaWJ1dGlvbiBvZiB0aGUgKGRpc3RhbmNlLGxlbmd0aCkKKyAgICAgIC8vIGhpc3RvZ3JhbXMgYnV0IHRob3NlIGFyZSB0aGUgc2FtZSBpbmRlcGVuZGVudGx5IGZyb20gdGhlIGNhY2hlIHNpemUuCisgICAgICAvLyBBcyB0aG9zZSBjb25zdGFudCBjb250cmlidXRpb25zIGFyZSBpbiB0aGUgZW5kIGFkZGVkIHRvIHRoZSBvdGhlcgorICAgICAgLy8gaGlzdG9ncmFtIGNvbnRyaWJ1dGlvbnMsIHdlIGNhbiBzYWZlbHkgaWdub3JlIHRoZW0uCisgICAgICBpbnQgbGVuID0gUGl4T3JDb3B5TGVuZ3RoKHYpOworICAgICAgdWludDMyX3QgYXJnYl9wcmV2ID0gKmFyZ2IgXiAweGZmZmZmZmZmdTsKKyAgICAgIC8vIFVwZGF0ZSB0aGUgY29sb3IgY2FjaGVzLgorICAgICAgZG8geworICAgICAgICBpZiAoKmFyZ2IgIT0gYXJnYl9wcmV2KSB7CisgICAgICAgICAgLy8gRWZmaWNpZW5jeTogaW5zZXJ0IG9ubHkgaWYgdGhlIGNvbG9yIGNoYW5nZXMuCisgICAgICAgICAgaW50IGtleSA9IFZQOExIYXNoUGl4KCphcmdiLCAzMiAtIGNhY2hlX2JpdHNfbWF4KTsKKyAgICAgICAgICBmb3IgKGkgPSBjYWNoZV9iaXRzX21heDsgaSA+PSAxOyAtLWksIGtleSA+Pj0gMSkgeworICAgICAgICAgICAgaGFzaGVyc1tpXS5jb2xvcnNfW2tleV0gPSAqYXJnYjsKKyAgICAgICAgICB9CisgICAgICAgICAgYXJnYl9wcmV2ID0gKmFyZ2I7CisgICAgICAgIH0KKyAgICAgICAgYXJnYisrOworICAgICAgfSB3aGlsZSAoLS1sZW4gIT0gMCk7CisgICAgfQorICAgIFZQOExSZWZzQ3Vyc29yTmV4dCgmYyk7CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDw9IGNhY2hlX2JpdHNfbWF4OyArK2kpIHsKKyAgICBjb25zdCBkb3VibGUgZW50cm9weSA9IFZQOExIaXN0b2dyYW1Fc3RpbWF0ZUJpdHMoaGlzdG9zW2ldKTsKKyAgICBpZiAoaSA9PSAwIHx8IGVudHJvcHkgPCBlbnRyb3B5X21pbikgeworICAgICAgZW50cm9weV9taW4gPSBlbnRyb3B5OworICAgICAgKmJlc3RfY2FjaGVfYml0cyA9IGk7CisgICAgfQorICB9CisgIG9rID0gMTsKK0Vycm9yOgorICBmb3IgKGkgPSAwOyBpIDw9IGNhY2hlX2JpdHNfbWF4OyArK2kpIHsKKyAgICBpZiAoY2NfaW5pdFtpXSkgVlA4TENvbG9yQ2FjaGVDbGVhcigmaGFzaGVyc1tpXSk7CisgICAgVlA4TEZyZWVIaXN0b2dyYW0oaGlzdG9zW2ldKTsKKyAgfQorICByZXR1cm4gb2s7Cit9CisKKy8vIFVwZGF0ZSAoaW4tcGxhY2UpIGJhY2t3YXJkIHJlZmVyZW5jZXMgZm9yIHNwZWNpZmllZCBjYWNoZV9iaXRzLgorc3RhdGljIGludCBCYWNrd2FyZFJlZnNXaXRoTG9jYWxDYWNoZShjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhY2hlX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMpIHsKKyAgaW50IHBpeGVsX2luZGV4ID0gMDsKKyAgVlA4TENvbG9yQ2FjaGUgaGFzaGVyczsKKyAgVlA4TFJlZnNDdXJzb3IgYyA9IFZQOExSZWZzQ3Vyc29ySW5pdChyZWZzKTsKKyAgaWYgKCFWUDhMQ29sb3JDYWNoZUluaXQoJmhhc2hlcnMsIGNhY2hlX2JpdHMpKSByZXR1cm4gMDsKKworICB3aGlsZSAoVlA4TFJlZnNDdXJzb3JPaygmYykpIHsKKyAgICBQaXhPckNvcHkqIGNvbnN0IHYgPSBjLmN1cl9wb3M7CisgICAgaWYgKFBpeE9yQ29weUlzTGl0ZXJhbCh2KSkgeworICAgICAgY29uc3QgdWludDMyX3QgYXJnYl9saXRlcmFsID0gdi0+YXJnYl9vcl9kaXN0YW5jZTsKKyAgICAgIGNvbnN0IGludCBpeCA9IFZQOExDb2xvckNhY2hlQ29udGFpbnMoJmhhc2hlcnMsIGFyZ2JfbGl0ZXJhbCk7CisgICAgICBpZiAoaXggPj0gMCkgeworICAgICAgICAvLyBoYXNoZXJzIGNvbnRhaW5zIGFyZ2JfbGl0ZXJhbAorICAgICAgICAqdiA9IFBpeE9yQ29weUNyZWF0ZUNhY2hlSWR4KGl4KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFZQOExDb2xvckNhY2hlSW5zZXJ0KCZoYXNoZXJzLCBhcmdiX2xpdGVyYWwpOworICAgICAgfQorICAgICAgKytwaXhlbF9pbmRleDsKKyAgICB9IGVsc2UgeworICAgICAgLy8gcmVmcyB3YXMgY3JlYXRlZCB3aXRob3V0IGxvY2FsIGNhY2hlLCBzbyBpdCBjYW4gbm90IGhhdmUgY2FjaGUgaW5kZXhlcy4KKyAgICAgIGludCBrOworICAgICAgYXNzZXJ0KFBpeE9yQ29weUlzQ29weSh2KSk7CisgICAgICBmb3IgKGsgPSAwOyBrIDwgdi0+bGVuOyArK2spIHsKKyAgICAgICAgVlA4TENvbG9yQ2FjaGVJbnNlcnQoJmhhc2hlcnMsIGFyZ2JbcGl4ZWxfaW5kZXgrK10pOworICAgICAgfQorICAgIH0KKyAgICBWUDhMUmVmc0N1cnNvck5leHQoJmMpOworICB9CisgIFZQOExDb2xvckNhY2hlQ2xlYXIoJmhhc2hlcnMpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIFZQOExCYWNrd2FyZFJlZnMqIEdldEJhY2t3YXJkUmVmZXJlbmNlc0xvd0VmZm9ydCgKKyAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLAorICAgIGludCogY29uc3QgY2FjaGVfYml0cywgY29uc3QgVlA4TEhhc2hDaGFpbiogY29uc3QgaGFzaF9jaGFpbiwKKyAgICBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzX2x6NzcpIHsKKyAgKmNhY2hlX2JpdHMgPSAwOworICBpZiAoIUJhY2t3YXJkUmVmZXJlbmNlc0x6Nzcod2lkdGgsIGhlaWdodCwgYXJnYiwgMCwgaGFzaF9jaGFpbiwgcmVmc19sejc3KSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIEJhY2t3YXJkUmVmZXJlbmNlczJETG9jYWxpdHkod2lkdGgsIHJlZnNfbHo3Nyk7CisgIHJldHVybiByZWZzX2x6Nzc7Cit9CisKK2V4dGVybiBpbnQgVlA4TEJhY2t3YXJkUmVmZXJlbmNlc1RyYWNlQmFja3dhcmRzKAorICAgIGludCB4c2l6ZSwgaW50IHlzaXplLCBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwgaW50IGNhY2hlX2JpdHMsCisgICAgY29uc3QgVlA4TEhhc2hDaGFpbiogY29uc3QgaGFzaF9jaGFpbiwKKyAgICBjb25zdCBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzX3NyYywgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmc19kc3QpOworc3RhdGljIFZQOExCYWNrd2FyZFJlZnMqIEdldEJhY2t3YXJkUmVmZXJlbmNlcygKKyAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLCBpbnQgcXVhbGl0eSwKKyAgICBpbnQgbHo3N190eXBlc190b190cnksIGludCogY29uc3QgY2FjaGVfYml0cywKKyAgICBjb25zdCBWUDhMSGFzaENoYWluKiBjb25zdCBoYXNoX2NoYWluLCBWUDhMQmFja3dhcmRSZWZzKiBiZXN0LAorICAgIFZQOExCYWNrd2FyZFJlZnMqIHdvcnN0KSB7CisgIGNvbnN0IGludCBjYWNoZV9iaXRzX2luaXRpYWwgPSAqY2FjaGVfYml0czsKKyAgZG91YmxlIGJpdF9jb3N0X2Jlc3QgPSAtMTsKKyAgVlA4TEhpc3RvZ3JhbSogaGlzdG8gPSBOVUxMOworICBpbnQgbHo3N190eXBlLCBsejc3X3R5cGVfYmVzdCA9IDA7CisgIFZQOExIYXNoQ2hhaW4gaGFzaF9jaGFpbl9ib3g7CisgIG1lbXNldCgmaGFzaF9jaGFpbl9ib3gsIDAsIHNpemVvZihoYXNoX2NoYWluX2JveCkpOworCisgIGhpc3RvID0gVlA4TEFsbG9jYXRlSGlzdG9ncmFtKE1BWF9DT0xPUl9DQUNIRV9CSVRTKTsKKyAgaWYgKGhpc3RvID09IE5VTEwpIGdvdG8gRXJyb3I7CisKKyAgZm9yIChsejc3X3R5cGUgPSAxOyBsejc3X3R5cGVzX3RvX3RyeTsKKyAgICAgICBsejc3X3R5cGVzX3RvX3RyeSAmPSB+bHo3N190eXBlLCBsejc3X3R5cGUgPDw9IDEpIHsKKyAgICBpbnQgcmVzID0gMDsKKyAgICBkb3VibGUgYml0X2Nvc3Q7CisgICAgaW50IGNhY2hlX2JpdHNfdG1wID0gY2FjaGVfYml0c19pbml0aWFsOworICAgIGlmICgobHo3N190eXBlc190b190cnkgJiBsejc3X3R5cGUpID09IDApIGNvbnRpbnVlOworICAgIHN3aXRjaCAobHo3N190eXBlKSB7CisgICAgICBjYXNlIGtMWjc3UkxFOgorICAgICAgICByZXMgPSBCYWNrd2FyZFJlZmVyZW5jZXNSbGUod2lkdGgsIGhlaWdodCwgYXJnYiwgMCwgd29yc3QpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2Uga0xaNzdTdGFuZGFyZDoKKyAgICAgICAgLy8gQ29tcHV0ZSBMWjc3IHdpdGggbm8gY2FjaGUgKDAgYml0cyksIGFzIHRoZSBpZGVhbCBMWjc3IHdpdGggYSBjb2xvcgorICAgICAgICAvLyBjYWNoZSBpcyBub3QgdGhhdCBkaWZmZXJlbnQgaW4gcHJhY3RpY2UuCisgICAgICAgIHJlcyA9IEJhY2t3YXJkUmVmZXJlbmNlc0x6Nzcod2lkdGgsIGhlaWdodCwgYXJnYiwgMCwgaGFzaF9jaGFpbiwgd29yc3QpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2Uga0xaNzdCb3g6CisgICAgICAgIGlmICghVlA4TEhhc2hDaGFpbkluaXQoJmhhc2hfY2hhaW5fYm94LCB3aWR0aCAqIGhlaWdodCkpIGdvdG8gRXJyb3I7CisgICAgICAgIHJlcyA9IEJhY2t3YXJkUmVmZXJlbmNlc0x6NzdCb3god2lkdGgsIGhlaWdodCwgYXJnYiwgMCwgaGFzaF9jaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGFzaF9jaGFpbl9ib3gsIHdvcnN0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBhc3NlcnQoMCk7CisgICAgfQorICAgIGlmICghcmVzKSBnb3RvIEVycm9yOworCisgICAgLy8gTmV4dCwgdHJ5IHdpdGggYSBjb2xvciBjYWNoZSBhbmQgdXBkYXRlIHRoZSByZWZlcmVuY2VzLgorICAgIGlmICghQ2FsY3VsYXRlQmVzdENhY2hlU2l6ZShhcmdiLCBxdWFsaXR5LCB3b3JzdCwgJmNhY2hlX2JpdHNfdG1wKSkgeworICAgICAgZ290byBFcnJvcjsKKyAgICB9CisgICAgaWYgKGNhY2hlX2JpdHNfdG1wID4gMCkgeworICAgICAgaWYgKCFCYWNrd2FyZFJlZnNXaXRoTG9jYWxDYWNoZShhcmdiLCBjYWNoZV9iaXRzX3RtcCwgd29yc3QpKSB7CisgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICB9CisgICAgfQorCisgICAgLy8gS2VlcCB0aGUgYmVzdCBiYWNrd2FyZCByZWZlcmVuY2VzLgorICAgIFZQOExIaXN0b2dyYW1DcmVhdGUoaGlzdG8sIHdvcnN0LCBjYWNoZV9iaXRzX3RtcCk7CisgICAgYml0X2Nvc3QgPSBWUDhMSGlzdG9ncmFtRXN0aW1hdGVCaXRzKGhpc3RvKTsKKyAgICBpZiAobHo3N190eXBlX2Jlc3QgPT0gMCB8fCBiaXRfY29zdCA8IGJpdF9jb3N0X2Jlc3QpIHsKKyAgICAgIFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHRtcCA9IHdvcnN0OworICAgICAgd29yc3QgPSBiZXN0OworICAgICAgYmVzdCA9IHRtcDsKKyAgICAgIGJpdF9jb3N0X2Jlc3QgPSBiaXRfY29zdDsKKyAgICAgICpjYWNoZV9iaXRzID0gY2FjaGVfYml0c190bXA7CisgICAgICBsejc3X3R5cGVfYmVzdCA9IGx6NzdfdHlwZTsKKyAgICB9CisgIH0KKyAgYXNzZXJ0KGx6NzdfdHlwZV9iZXN0ID4gMCk7CisKKyAgLy8gSW1wcm92ZSBvbiBzaW1wbGUgTFo3NyBidXQgb25seSBmb3IgaGlnaCBxdWFsaXR5IChUcmFjZUJhY2t3YXJkcyBpcworICAvLyBjb3N0bHkpLgorICBpZiAoKGx6NzdfdHlwZV9iZXN0ID09IGtMWjc3U3RhbmRhcmQgfHwgbHo3N190eXBlX2Jlc3QgPT0ga0xaNzdCb3gpICYmCisgICAgICBxdWFsaXR5ID49IDI1KSB7CisgICAgY29uc3QgVlA4TEhhc2hDaGFpbiogY29uc3QgaGFzaF9jaGFpbl90bXAgPQorICAgICAgICAobHo3N190eXBlX2Jlc3QgPT0ga0xaNzdTdGFuZGFyZCkgPyBoYXNoX2NoYWluIDogJmhhc2hfY2hhaW5fYm94OworICAgIGlmIChWUDhMQmFja3dhcmRSZWZlcmVuY2VzVHJhY2VCYWNrd2FyZHMod2lkdGgsIGhlaWdodCwgYXJnYiwgKmNhY2hlX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoX2NoYWluX3RtcCwgYmVzdCwgd29yc3QpKSB7CisgICAgICBkb3VibGUgYml0X2Nvc3RfdHJhY2U7CisgICAgICBWUDhMSGlzdG9ncmFtQ3JlYXRlKGhpc3RvLCB3b3JzdCwgKmNhY2hlX2JpdHMpOworICAgICAgYml0X2Nvc3RfdHJhY2UgPSBWUDhMSGlzdG9ncmFtRXN0aW1hdGVCaXRzKGhpc3RvKTsKKyAgICAgIGlmIChiaXRfY29zdF90cmFjZSA8IGJpdF9jb3N0X2Jlc3QpIGJlc3QgPSB3b3JzdDsKKyAgICB9CisgIH0KKworICBCYWNrd2FyZFJlZmVyZW5jZXMyRExvY2FsaXR5KHdpZHRoLCBiZXN0KTsKKworRXJyb3I6CisgIFZQOExIYXNoQ2hhaW5DbGVhcigmaGFzaF9jaGFpbl9ib3gpOworICBWUDhMRnJlZUhpc3RvZ3JhbShoaXN0byk7CisgIHJldHVybiBiZXN0OworfQorCitWUDhMQmFja3dhcmRSZWZzKiBWUDhMR2V0QmFja3dhcmRSZWZlcmVuY2VzKAorICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgY29uc3QgdWludDMyX3QqIGNvbnN0IGFyZ2IsIGludCBxdWFsaXR5LAorICAgIGludCBsb3dfZWZmb3J0LCBpbnQgbHo3N190eXBlc190b190cnksIGludCogY29uc3QgY2FjaGVfYml0cywKKyAgICBjb25zdCBWUDhMSGFzaENoYWluKiBjb25zdCBoYXNoX2NoYWluLCBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzX3RtcDEsCisgICAgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmc190bXAyKSB7CisgIGlmIChsb3dfZWZmb3J0KSB7CisgICAgcmV0dXJuIEdldEJhY2t3YXJkUmVmZXJlbmNlc0xvd0VmZm9ydCh3aWR0aCwgaGVpZ2h0LCBhcmdiLCBjYWNoZV9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaF9jaGFpbiwgcmVmc190bXAxKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gR2V0QmFja3dhcmRSZWZlcmVuY2VzKHdpZHRoLCBoZWlnaHQsIGFyZ2IsIHF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsejc3X3R5cGVzX3RvX3RyeSwgY2FjaGVfYml0cywgaGFzaF9jaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnNfdG1wMSwgcmVmc190bXAyKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9iYWNrd2FyZF9yZWZlcmVuY2VzX2VuYy5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9iYWNrd2FyZF9yZWZlcmVuY2VzX2VuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMjZmYWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL2JhY2t3YXJkX3JlZmVyZW5jZXNfZW5jLmgKQEAgLTAsMCArMSwyMzggQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBBdXRob3I6IEp5cmtpIEFsYWt1aWphbGEgKGp5cmtpQGdvb2dsZS5jb20pCisvLworCisjaWZuZGVmIFdFQlBfRU5DX0JBQ0tXQVJEX1JFRkVSRU5DRVNfRU5DX0hfCisjZGVmaW5lIFdFQlBfRU5DX0JBQ0tXQVJEX1JFRkVSRU5DRVNfRU5DX0hfCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCisjZWxzZQorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisjaW5jbHVkZSAic3JjL3dlYnAvdHlwZXMuaCIKKyNpbmNsdWRlICJzcmMvd2VicC9mb3JtYXRfY29uc3RhbnRzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLy8gVGhlIG1heGltdW0gYWxsb3dlZCBsaW1pdCBpcyAxMS4KKyNkZWZpbmUgTUFYX0NPTE9SX0NBQ0hFX0JJVFMgMTAKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFBpeE9yQ29weQorCitlbnVtIE1vZGUgeworICBrTGl0ZXJhbCwKKyAga0NhY2hlSWR4LAorICBrQ29weSwKKyAga05vbmUKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgLy8gbW9kZSBhcyB1aW50OF90IHRvIG1ha2UgdGhlIG1lbW9yeSBsYXlvdXQgdG8gYmUgZXhhY3RseSA4IGJ5dGVzLgorICB1aW50OF90IG1vZGU7CisgIHVpbnQxNl90IGxlbjsKKyAgdWludDMyX3QgYXJnYl9vcl9kaXN0YW5jZTsKK30gUGl4T3JDb3B5OworCitzdGF0aWMgV0VCUF9JTkxJTkUgUGl4T3JDb3B5IFBpeE9yQ29weUNyZWF0ZUNvcHkodWludDMyX3QgZGlzdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuKSB7CisgIFBpeE9yQ29weSByZXR2YWw7CisgIHJldHZhbC5tb2RlID0ga0NvcHk7CisgIHJldHZhbC5hcmdiX29yX2Rpc3RhbmNlID0gZGlzdGFuY2U7CisgIHJldHZhbC5sZW4gPSBsZW47CisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBQaXhPckNvcHkgUGl4T3JDb3B5Q3JlYXRlQ2FjaGVJZHgoaW50IGlkeCkgeworICBQaXhPckNvcHkgcmV0dmFsOworICBTQl9EQ0hFQ0soaWR4ID49IDApOworICBTQl9EQ0hFQ0soaWR4IDwgKDEgPDwgTUFYX0NPTE9SX0NBQ0hFX0JJVFMpKTsKKyAgcmV0dmFsLm1vZGUgPSBrQ2FjaGVJZHg7CisgIHJldHZhbC5hcmdiX29yX2Rpc3RhbmNlID0gaWR4OworICByZXR2YWwubGVuID0gMTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIFBpeE9yQ29weSBQaXhPckNvcHlDcmVhdGVMaXRlcmFsKHVpbnQzMl90IGFyZ2IpIHsKKyAgUGl4T3JDb3B5IHJldHZhbDsKKyAgcmV0dmFsLm1vZGUgPSBrTGl0ZXJhbDsKKyAgcmV0dmFsLmFyZ2Jfb3JfZGlzdGFuY2UgPSBhcmdiOworICByZXR2YWwubGVuID0gMTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBQaXhPckNvcHlJc0xpdGVyYWwoY29uc3QgUGl4T3JDb3B5KiBjb25zdCBwKSB7CisgIHJldHVybiAocC0+bW9kZSA9PSBrTGl0ZXJhbCk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgUGl4T3JDb3B5SXNDYWNoZUlkeChjb25zdCBQaXhPckNvcHkqIGNvbnN0IHApIHsKKyAgcmV0dXJuIChwLT5tb2RlID09IGtDYWNoZUlkeCk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgUGl4T3JDb3B5SXNDb3B5KGNvbnN0IFBpeE9yQ29weSogY29uc3QgcCkgeworICByZXR1cm4gKHAtPm1vZGUgPT0ga0NvcHkpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgUGl4T3JDb3B5TGl0ZXJhbChjb25zdCBQaXhPckNvcHkqIGNvbnN0IHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29tcG9uZW50KSB7CisgIFNCX0RDSEVDSyhwLT5tb2RlID09IGtMaXRlcmFsKTsKKyAgcmV0dXJuIChwLT5hcmdiX29yX2Rpc3RhbmNlID4+IChjb21wb25lbnQgKiA4KSkgJiAweGZmOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgUGl4T3JDb3B5TGVuZ3RoKGNvbnN0IFBpeE9yQ29weSogY29uc3QgcCkgeworICByZXR1cm4gcC0+bGVuOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgUGl4T3JDb3B5Q2FjaGVJZHgoY29uc3QgUGl4T3JDb3B5KiBjb25zdCBwKSB7CisgIFNCX0RDSEVDSyhwLT5tb2RlID09IGtDYWNoZUlkeCk7CisgIFNCX0RDSEVDSyhwLT5hcmdiX29yX2Rpc3RhbmNlIDwgKDFVIDw8IE1BWF9DT0xPUl9DQUNIRV9CSVRTKSk7CisgIHJldHVybiBwLT5hcmdiX29yX2Rpc3RhbmNlOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgUGl4T3JDb3B5RGlzdGFuY2UoY29uc3QgUGl4T3JDb3B5KiBjb25zdCBwKSB7CisgIFNCX0RDSEVDSyhwLT5tb2RlID09IGtDb3B5KTsKKyAgcmV0dXJuIHAtPmFyZ2Jfb3JfZGlzdGFuY2U7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWUDhMSGFzaENoYWluCisKKyNkZWZpbmUgSEFTSF9CSVRTIDE4CisjZGVmaW5lIEhBU0hfU0laRSAoMSA8PCBIQVNIX0JJVFMpCisKKy8vIElmIHlvdSBjaGFuZ2UgdGhpcywgeW91IG5lZWQgTUFYX0xFTkdUSF9CSVRTICsgV0lORE9XX1NJWkVfQklUUyA8PSAzMiBhcyBpdAorLy8gaXMgdXNlZCBpbiBWUDhMSGFzaENoYWluLgorI2RlZmluZSBNQVhfTEVOR1RIX0JJVFMgMTIKKyNkZWZpbmUgV0lORE9XX1NJWkVfQklUUyAyMAorLy8gV2Ugd2FudCB0aGUgbWF4IHZhbHVlIHRvIGJlIGF0dGFpbmFibGUgYW5kIHN0b3JlZCBpbiBNQVhfTEVOR1RIX0JJVFMgYml0cy4KKyNkZWZpbmUgTUFYX0xFTkdUSCAoKDEgPDwgTUFYX0xFTkdUSF9CSVRTKSAtIDEpCisjaWYgTUFYX0xFTkdUSF9CSVRTICsgV0lORE9XX1NJWkVfQklUUyA+IDMyCisjZXJyb3IgIk1BWF9MRU5HVEhfQklUUyArIFdJTkRPV19TSVpFX0JJVFMgPiAzMiIKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBWUDhMSGFzaENoYWluIFZQOExIYXNoQ2hhaW47CitzdHJ1Y3QgVlA4TEhhc2hDaGFpbiB7CisgIC8vIFRoZSAyMCBtb3N0IHNpZ25pZmljYW50IGJpdHMgY29udGFpbiB0aGUgb2Zmc2V0IGF0IHdoaWNoIHRoZSBiZXN0IG1hdGNoCisgIC8vIGlzIGZvdW5kLiBUaGVzZSAyMCBiaXRzIGFyZSB0aGUgbGltaXQgZGVmaW5lZCBieSBHZXRXaW5kb3dTaXplRm9ySGFzaENoYWluCisgIC8vICh0aHJvdWdoIFdJTkRPV19TSVpFID0gMTw8MjApLgorICAvLyBUaGUgbG93ZXIgMTIgYml0cyBjb250YWluIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoLiBUaGUgMTIgYml0IGxpbWl0IGlzCisgIC8vIGRlZmluZWQgaW4gTWF4RmluZENvcHlMZW5ndGggd2l0aCBNQVhfTEVOR1RIPTQwOTYuCisgIHVpbnQzMl90KiBvZmZzZXRfbGVuZ3RoXzsKKyAgLy8gVGhpcyBpcyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBoYXNoX2NoYWluIHRoYXQgY2FuIGJlIGNvbnN0cnVjdGVkLgorICAvLyBUeXBpY2FsbHkgdGhpcyBpcyB0aGUgcGl4ZWwgY291bnQgKHdpZHRoIHggaGVpZ2h0KSBmb3IgYSBnaXZlbiBpbWFnZS4KKyAgaW50IHNpemVfOworfTsKKworLy8gTXVzdCBiZSBjYWxsZWQgZmlyc3QsIHRvIHNldCBzaXplLgoraW50IFZQOExIYXNoQ2hhaW5Jbml0KFZQOExIYXNoQ2hhaW4qIGNvbnN0IHAsIGludCBzaXplKTsKKy8vIFByZS1jb21wdXRlIHRoZSBiZXN0IG1hdGNoZXMgZm9yIGFyZ2IuCitpbnQgVlA4TEhhc2hDaGFpbkZpbGwoVlA4TEhhc2hDaGFpbiogY29uc3QgcCwgaW50IHF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGFyZ2IsIGludCB4c2l6ZSwgaW50IHlzaXplLAorICAgICAgICAgICAgICAgICAgICAgIGludCBsb3dfZWZmb3J0KTsKK3ZvaWQgVlA4TEhhc2hDaGFpbkNsZWFyKFZQOExIYXNoQ2hhaW4qIGNvbnN0IHApOyAgLy8gcmVsZWFzZSBtZW1vcnkKKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhMSGFzaENoYWluRmluZE9mZnNldChjb25zdCBWUDhMSGFzaENoYWluKiBjb25zdCBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYmFzZV9wb3NpdGlvbikgeworICByZXR1cm4gcC0+b2Zmc2V0X2xlbmd0aF9bYmFzZV9wb3NpdGlvbl0gPj4gTUFYX0xFTkdUSF9CSVRTOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOExIYXNoQ2hhaW5GaW5kTGVuZ3RoKGNvbnN0IFZQOExIYXNoQ2hhaW4qIGNvbnN0IHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBiYXNlX3Bvc2l0aW9uKSB7CisgIHJldHVybiBwLT5vZmZzZXRfbGVuZ3RoX1tiYXNlX3Bvc2l0aW9uXSAmICgoMVUgPDwgTUFYX0xFTkdUSF9CSVRTKSAtIDEpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWUDhMSGFzaENoYWluRmluZENvcHkoY29uc3QgVlA4TEhhc2hDaGFpbiogY29uc3QgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmFzZV9wb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IG9mZnNldF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBsZW5ndGhfcHRyKSB7CisgICpvZmZzZXRfcHRyID0gVlA4TEhhc2hDaGFpbkZpbmRPZmZzZXQocCwgYmFzZV9wb3NpdGlvbik7CisgICpsZW5ndGhfcHRyID0gVlA4TEhhc2hDaGFpbkZpbmRMZW5ndGgocCwgYmFzZV9wb3NpdGlvbik7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWUDhMQmFja3dhcmRSZWZzIChibG9jay1iYXNlZCBiYWNrd2FyZC1yZWZlcmVuY2VzIHN0b3JhZ2UpCisKKy8vIG1heGltdW0gbnVtYmVyIG9mIHJlZmVyZW5jZSBibG9ja3MgdGhlIGltYWdlIHdpbGwgYmUgc2VnbWVudGVkIGludG8KKyNkZWZpbmUgTUFYX1JFRlNfQkxPQ0tfUEVSX0lNQUdFIDE2CisKK3R5cGVkZWYgc3RydWN0IFBpeE9yQ29weUJsb2NrIFBpeE9yQ29weUJsb2NrOyAgIC8vIGZvcndhcmQgZGVjbGFyYXRpb24KK3R5cGVkZWYgc3RydWN0IFZQOExCYWNrd2FyZFJlZnMgVlA4TEJhY2t3YXJkUmVmczsKKworLy8gQ29udGFpbmVyIGZvciBibG9ja3MgY2hhaW4KK3N0cnVjdCBWUDhMQmFja3dhcmRSZWZzIHsKKyAgaW50IGJsb2NrX3NpemVfOyAgICAgICAgICAgICAgIC8vIGNvbW1vbiBibG9jay1zaXplCisgIGludCBlcnJvcl87ICAgICAgICAgICAgICAgICAgICAvLyBzZXQgdG8gdHJ1ZSBpZiBzb21lIG1lbW9yeSBlcnJvciBvY2N1cnJlZAorICBQaXhPckNvcHlCbG9jayogcmVmc187ICAgICAgICAgLy8gbGlzdCBvZiBjdXJyZW50bHkgdXNlZCBibG9ja3MKKyAgUGl4T3JDb3B5QmxvY2sqKiB0YWlsXzsgICAgICAgIC8vIGZvciBsaXN0IHJlY3ljbGluZworICBQaXhPckNvcHlCbG9jayogZnJlZV9ibG9ja3NfOyAgLy8gZnJlZS1saXN0CisgIFBpeE9yQ29weUJsb2NrKiBsYXN0X2Jsb2NrXzsgICAvLyB1c2VkIGZvciBhZGRpbmcgbmV3IHJlZnMgKGludGVybmFsKQorfTsKKworLy8gSW5pdGlhbGl6ZSB0aGUgb2JqZWN0LiAnYmxvY2tfc2l6ZScgaXMgdGhlIGNvbW1vbiBibG9jayBzaXplIHRvIHN0b3JlCisvLyByZWZlcmVuY2VzICh0eXBpY2FsbHksIHdpZHRoICogaGVpZ2h0IC8gTUFYX1JFRlNfQkxPQ0tfUEVSX0lNQUdFKS4KK3ZvaWQgVlA4TEJhY2t3YXJkUmVmc0luaXQoVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcywgaW50IGJsb2NrX3NpemUpOworLy8gUmVsZWFzZSBtZW1vcnkgZm9yIGJhY2t3YXJkIHJlZmVyZW5jZXMuCit2b2lkIFZQOExCYWNrd2FyZFJlZnNDbGVhcihWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzKTsKKworLy8gQ3Vyc29yIGZvciBpdGVyYXRpbmcgb24gcmVmZXJlbmNlcyBjb250ZW50Cit0eXBlZGVmIHN0cnVjdCB7CisgIC8vIHB1YmxpYzoKKyAgUGl4T3JDb3B5KiBjdXJfcG9zOyAgICAgICAgICAgLy8gY3VycmVudCBwb3NpdGlvbgorICAvLyBwcml2YXRlOgorICBQaXhPckNvcHlCbG9jayogY3VyX2Jsb2NrXzsgICAvLyBjdXJyZW50IGJsb2NrIGluIHRoZSByZWZzIGxpc3QKKyAgY29uc3QgUGl4T3JDb3B5KiBsYXN0X3Bvc187ICAgLy8gc2VudGluZWwgZm9yIHN3aXRjaGluZyB0byBuZXh0IGJsb2NrCit9IFZQOExSZWZzQ3Vyc29yOworCisvLyBSZXR1cm5zIGEgY3Vyc29yIHBvc2l0aW9uZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVmZXJlbmNlcyBsaXN0LgorVlA4TFJlZnNDdXJzb3IgVlA4TFJlZnNDdXJzb3JJbml0KGNvbnN0IFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMpOworLy8gUmV0dXJucyB0cnVlIGlmIGN1cnNvciBpcyBwb2ludGluZyBhdCBhIHZhbGlkIHBvc2l0aW9uLgorc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhMUmVmc0N1cnNvck9rKGNvbnN0IFZQOExSZWZzQ3Vyc29yKiBjb25zdCBjKSB7CisgIHJldHVybiAoYy0+Y3VyX3BvcyAhPSBOVUxMKTsKK30KKy8vIE1vdmUgdG8gbmV4dCBibG9jayBvZiByZWZlcmVuY2VzLiBJbnRlcm5hbCwgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS4KK3ZvaWQgVlA4TFJlZnNDdXJzb3JOZXh0QmxvY2soVlA4TFJlZnNDdXJzb3IqIGNvbnN0IGMpOworLy8gTW92ZSB0byBuZXh0IHBvc2l0aW9uLCBvciBOVUxMLiBTaG91bGQgbm90IGJlIGNhbGxlZCBpZiAhVlA4TFJlZnNDdXJzb3JPaygpLgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVlA4TFJlZnNDdXJzb3JOZXh0KFZQOExSZWZzQ3Vyc29yKiBjb25zdCBjKSB7CisgIFNCX0RDSEVDSyhjICE9IE5VTEwpOworICBTQl9EQ0hFQ0soVlA4TFJlZnNDdXJzb3JPayhjKSk7CisgIGlmICgrK2MtPmN1cl9wb3MgPT0gYy0+bGFzdF9wb3NfKSBWUDhMUmVmc0N1cnNvck5leHRCbG9jayhjKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1haW4gZW50cnkgcG9pbnRzCisKK2VudW0gVlA4TExaNzdUeXBlIHsKKyAga0xaNzdTdGFuZGFyZCA9IDEsCisgIGtMWjc3UkxFID0gMiwKKyAga0xaNzdCb3ggPSA0Cit9OworCisvLyBFdmFsdWF0ZXMgYmVzdCBwb3NzaWJsZSBiYWNrd2FyZCByZWZlcmVuY2VzIGZvciBzcGVjaWZpZWQgcXVhbGl0eS4KKy8vIFRoZSBpbnB1dCBjYWNoZV9iaXRzIHRvICdWUDhMR2V0QmFja3dhcmRSZWZlcmVuY2VzJyBzZXRzIHRoZSBtYXhpbXVtIGNhY2hlCisvLyBiaXRzIHRvIHVzZSAocGFzc2luZyAwIGltcGxpZXMgZGlzYWJsaW5nIHRoZSBsb2NhbCBjb2xvciBjYWNoZSkuCisvLyBUaGUgb3B0aW1hbCBjYWNoZSBiaXRzIGlzIGV2YWx1YXRlZCBhbmQgc2V0IGZvciB0aGUgKmNhY2hlX2JpdHMgcGFyYW1ldGVyLgorLy8gVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgcG9pbnRlciB0byB0aGUgYmVzdCBvZiB0aGUgdHdvIGJhY2t3YXJkIHJlZnMgdml6LAorLy8gcmVmc1swXSBvciByZWZzWzFdLgorVlA4TEJhY2t3YXJkUmVmcyogVlA4TEdldEJhY2t3YXJkUmVmZXJlbmNlcygKKyAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLCBpbnQgcXVhbGl0eSwKKyAgICBpbnQgbG93X2VmZm9ydCwgaW50IGx6NzdfdHlwZXNfdG9fdHJ5LCBpbnQqIGNvbnN0IGNhY2hlX2JpdHMsCisgICAgY29uc3QgVlA4TEhhc2hDaGFpbiogY29uc3QgaGFzaF9jaGFpbiwgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmc190bXAxLAorICAgIFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnNfdG1wMik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAgLy8gV0VCUF9FTkNfQkFDS1dBUkRfUkVGRVJFTkNFU19FTkNfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvY29uZmlnX2VuYy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9jb25maWdfZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ0ODI4OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvY29uZmlnX2VuYy5jCkBAIC0wLDAgKzEsMTUyIEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQ29kaW5nIHRvb2xzIGNvbmZpZ3VyYXRpb24KKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgInNyYy93ZWJwL2NvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvd2VicC9lbmNvZGUuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFdlYlBDb25maWcKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBXZWJQQ29uZmlnSW5pdEludGVybmFsKFdlYlBDb25maWcqIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBQcmVzZXQgcHJlc2V0LCBmbG9hdCBxdWFsaXR5LCBpbnQgdmVyc2lvbikgeworICBpZiAoV0VCUF9BQklfSVNfSU5DT01QQVRJQkxFKHZlcnNpb24sIFdFQlBfRU5DT0RFUl9BQklfVkVSU0lPTikpIHsKKyAgICByZXR1cm4gMDsgICAvLyBjYWxsZXIvc3lzdGVtIHZlcnNpb24gbWlzbWF0Y2ghCisgIH0KKyAgaWYgKGNvbmZpZyA9PSBOVUxMKSByZXR1cm4gMDsKKworICBjb25maWctPnF1YWxpdHkgPSBxdWFsaXR5OworICBjb25maWctPnRhcmdldF9zaXplID0gMDsKKyAgY29uZmlnLT50YXJnZXRfUFNOUiA9IDAuOworICBjb25maWctPm1ldGhvZCA9IDQ7CisgIGNvbmZpZy0+c25zX3N0cmVuZ3RoID0gNTA7CisgIGNvbmZpZy0+ZmlsdGVyX3N0cmVuZ3RoID0gNjA7ICAgLy8gbWlkLWZpbHRlcmluZworICBjb25maWctPmZpbHRlcl9zaGFycG5lc3MgPSAwOworICBjb25maWctPmZpbHRlcl90eXBlID0gMTsgICAgICAgIC8vIGRlZmF1bHQ6IHN0cm9uZyAoc28gVS9WIGlzIGZpbHRlcmVkIHRvbykKKyAgY29uZmlnLT5wYXJ0aXRpb25zID0gMDsKKyAgY29uZmlnLT5zZWdtZW50cyA9IDQ7CisgIGNvbmZpZy0+cGFzcyA9IDE7CisgIGNvbmZpZy0+c2hvd19jb21wcmVzc2VkID0gMDsKKyAgY29uZmlnLT5wcmVwcm9jZXNzaW5nID0gMDsKKyAgY29uZmlnLT5hdXRvZmlsdGVyID0gMDsKKyAgY29uZmlnLT5wYXJ0aXRpb25fbGltaXQgPSAwOworICBjb25maWctPmFscGhhX2NvbXByZXNzaW9uID0gMTsKKyAgY29uZmlnLT5hbHBoYV9maWx0ZXJpbmcgPSAxOworICBjb25maWctPmFscGhhX3F1YWxpdHkgPSAxMDA7CisgIGNvbmZpZy0+bG9zc2xlc3MgPSAwOworICBjb25maWctPmV4YWN0ID0gMDsKKyAgY29uZmlnLT5pbWFnZV9oaW50ID0gV0VCUF9ISU5UX0RFRkFVTFQ7CisgIGNvbmZpZy0+ZW11bGF0ZV9qcGVnX3NpemUgPSAwOworICBjb25maWctPnRocmVhZF9sZXZlbCA9IDA7CisgIGNvbmZpZy0+bG93X21lbW9yeSA9IDA7CisgIGNvbmZpZy0+bmVhcl9sb3NzbGVzcyA9IDEwMDsKKyAgY29uZmlnLT51c2VfZGVsdGFfcGFsZXR0ZSA9IDA7CisgIGNvbmZpZy0+dXNlX3NoYXJwX3l1diA9IDA7CisKKyAgLy8gVE9ETyhza2FsKTogdHVuZS4KKyAgc3dpdGNoIChwcmVzZXQpIHsKKyAgICBjYXNlIFdFQlBfUFJFU0VUX1BJQ1RVUkU6CisgICAgICBjb25maWctPnNuc19zdHJlbmd0aCA9IDgwOworICAgICAgY29uZmlnLT5maWx0ZXJfc2hhcnBuZXNzID0gNDsKKyAgICAgIGNvbmZpZy0+ZmlsdGVyX3N0cmVuZ3RoID0gMzU7CisgICAgICBjb25maWctPnByZXByb2Nlc3NpbmcgJj0gfjI7ICAgLy8gbm8gZGl0aGVyaW5nCisgICAgICBicmVhazsKKyAgICBjYXNlIFdFQlBfUFJFU0VUX1BIT1RPOgorICAgICAgY29uZmlnLT5zbnNfc3RyZW5ndGggPSA4MDsKKyAgICAgIGNvbmZpZy0+ZmlsdGVyX3NoYXJwbmVzcyA9IDM7CisgICAgICBjb25maWctPmZpbHRlcl9zdHJlbmd0aCA9IDMwOworICAgICAgY29uZmlnLT5wcmVwcm9jZXNzaW5nIHw9IDI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFdFQlBfUFJFU0VUX0RSQVdJTkc6CisgICAgICBjb25maWctPnNuc19zdHJlbmd0aCA9IDI1OworICAgICAgY29uZmlnLT5maWx0ZXJfc2hhcnBuZXNzID0gNjsKKyAgICAgIGNvbmZpZy0+ZmlsdGVyX3N0cmVuZ3RoID0gMTA7CisgICAgICBicmVhazsKKyAgICBjYXNlIFdFQlBfUFJFU0VUX0lDT046CisgICAgICBjb25maWctPnNuc19zdHJlbmd0aCA9IDA7CisgICAgICBjb25maWctPmZpbHRlcl9zdHJlbmd0aCA9IDA7ICAgLy8gZGlzYWJsZSBmaWx0ZXJpbmcgdG8gcmV0YWluIHNoYXJwbmVzcworICAgICAgY29uZmlnLT5wcmVwcm9jZXNzaW5nICY9IH4yOyAgIC8vIG5vIGRpdGhlcmluZworICAgICAgYnJlYWs7CisgICAgY2FzZSBXRUJQX1BSRVNFVF9URVhUOgorICAgICAgY29uZmlnLT5zbnNfc3RyZW5ndGggPSAwOworICAgICAgY29uZmlnLT5maWx0ZXJfc3RyZW5ndGggPSAwOyAgIC8vIGRpc2FibGUgZmlsdGVyaW5nIHRvIHJldGFpbiBzaGFycG5lc3MKKyAgICAgIGNvbmZpZy0+cHJlcHJvY2Vzc2luZyAmPSB+MjsgICAvLyBubyBkaXRoZXJpbmcKKyAgICAgIGNvbmZpZy0+c2VnbWVudHMgPSAyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBXRUJQX1BSRVNFVF9ERUZBVUxUOgorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gV2ViUFZhbGlkYXRlQ29uZmlnKGNvbmZpZyk7Cit9CisKK2ludCBXZWJQVmFsaWRhdGVDb25maWcoY29uc3QgV2ViUENvbmZpZyogY29uZmlnKSB7CisgIGlmIChjb25maWcgPT0gTlVMTCkgcmV0dXJuIDA7CisgIGlmIChjb25maWctPnF1YWxpdHkgPCAwIHx8IGNvbmZpZy0+cXVhbGl0eSA+IDEwMCkgcmV0dXJuIDA7CisgIGlmIChjb25maWctPnRhcmdldF9zaXplIDwgMCkgcmV0dXJuIDA7CisgIGlmIChjb25maWctPnRhcmdldF9QU05SIDwgMCkgcmV0dXJuIDA7CisgIGlmIChjb25maWctPm1ldGhvZCA8IDAgfHwgY29uZmlnLT5tZXRob2QgPiA2KSByZXR1cm4gMDsKKyAgaWYgKGNvbmZpZy0+c2VnbWVudHMgPCAxIHx8IGNvbmZpZy0+c2VnbWVudHMgPiA0KSByZXR1cm4gMDsKKyAgaWYgKGNvbmZpZy0+c25zX3N0cmVuZ3RoIDwgMCB8fCBjb25maWctPnNuc19zdHJlbmd0aCA+IDEwMCkgcmV0dXJuIDA7CisgIGlmIChjb25maWctPmZpbHRlcl9zdHJlbmd0aCA8IDAgfHwgY29uZmlnLT5maWx0ZXJfc3RyZW5ndGggPiAxMDApIHJldHVybiAwOworICBpZiAoY29uZmlnLT5maWx0ZXJfc2hhcnBuZXNzIDwgMCB8fCBjb25maWctPmZpbHRlcl9zaGFycG5lc3MgPiA3KSByZXR1cm4gMDsKKyAgaWYgKGNvbmZpZy0+ZmlsdGVyX3R5cGUgPCAwIHx8IGNvbmZpZy0+ZmlsdGVyX3R5cGUgPiAxKSByZXR1cm4gMDsKKyAgaWYgKGNvbmZpZy0+YXV0b2ZpbHRlciA8IDAgfHwgY29uZmlnLT5hdXRvZmlsdGVyID4gMSkgcmV0dXJuIDA7CisgIGlmIChjb25maWctPnBhc3MgPCAxIHx8IGNvbmZpZy0+cGFzcyA+IDEwKSByZXR1cm4gMDsKKyAgaWYgKGNvbmZpZy0+c2hvd19jb21wcmVzc2VkIDwgMCB8fCBjb25maWctPnNob3dfY29tcHJlc3NlZCA+IDEpIHJldHVybiAwOworICBpZiAoY29uZmlnLT5wcmVwcm9jZXNzaW5nIDwgMCB8fCBjb25maWctPnByZXByb2Nlc3NpbmcgPiA3KSByZXR1cm4gMDsKKyAgaWYgKGNvbmZpZy0+cGFydGl0aW9ucyA8IDAgfHwgY29uZmlnLT5wYXJ0aXRpb25zID4gMykgcmV0dXJuIDA7CisgIGlmIChjb25maWctPnBhcnRpdGlvbl9saW1pdCA8IDAgfHwgY29uZmlnLT5wYXJ0aXRpb25fbGltaXQgPiAxMDApIHJldHVybiAwOworICBpZiAoY29uZmlnLT5hbHBoYV9jb21wcmVzc2lvbiA8IDApIHJldHVybiAwOworICBpZiAoY29uZmlnLT5hbHBoYV9maWx0ZXJpbmcgPCAwKSByZXR1cm4gMDsKKyAgaWYgKGNvbmZpZy0+YWxwaGFfcXVhbGl0eSA8IDAgfHwgY29uZmlnLT5hbHBoYV9xdWFsaXR5ID4gMTAwKSByZXR1cm4gMDsKKyAgaWYgKGNvbmZpZy0+bG9zc2xlc3MgPCAwIHx8IGNvbmZpZy0+bG9zc2xlc3MgPiAxKSByZXR1cm4gMDsKKyAgaWYgKGNvbmZpZy0+bmVhcl9sb3NzbGVzcyA8IDAgfHwgY29uZmlnLT5uZWFyX2xvc3NsZXNzID4gMTAwKSByZXR1cm4gMDsKKyAgaWYgKGNvbmZpZy0+aW1hZ2VfaGludCA+PSBXRUJQX0hJTlRfTEFTVCkgcmV0dXJuIDA7CisgIGlmIChjb25maWctPmVtdWxhdGVfanBlZ19zaXplIDwgMCB8fCBjb25maWctPmVtdWxhdGVfanBlZ19zaXplID4gMSkgcmV0dXJuIDA7CisgIGlmIChjb25maWctPnRocmVhZF9sZXZlbCA8IDAgfHwgY29uZmlnLT50aHJlYWRfbGV2ZWwgPiAxKSByZXR1cm4gMDsKKyAgaWYgKGNvbmZpZy0+bG93X21lbW9yeSA8IDAgfHwgY29uZmlnLT5sb3dfbWVtb3J5ID4gMSkgcmV0dXJuIDA7CisgIGlmIChjb25maWctPmV4YWN0IDwgMCB8fCBjb25maWctPmV4YWN0ID4gMSkgcmV0dXJuIDA7CisgIGlmIChjb25maWctPnVzZV9kZWx0YV9wYWxldHRlIDwgMCB8fCBjb25maWctPnVzZV9kZWx0YV9wYWxldHRlID4gMSkgeworICAgIHJldHVybiAwOworICB9CisgIGlmIChjb25maWctPnVzZV9zaGFycF95dXYgPCAwIHx8IGNvbmZpZy0+dXNlX3NoYXJwX3l1diA+IDEpIHJldHVybiAwOworCisgIHJldHVybiAxOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIE1BWF9MRVZFTCA5CisKKy8vIE1hcHBpbmcgYmV0d2VlbiAteiBsZXZlbCBhbmQgLW0gLyAtcSBwYXJhbWV0ZXIgc2V0dGluZ3MuCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgdWludDhfdCBtZXRob2RfOworICB1aW50OF90IHF1YWxpdHlfOworfSBrTG9zc2xlc3NQcmVzZXRzW01BWF9MRVZFTCArIDFdID0geworICB7IDAsICAwIH0sIHsgMSwgMjAgfSwgeyAyLCAyNSB9LCB7IDMsIDMwIH0sIHsgMywgNTAgfSwKKyAgeyA0LCA1MCB9LCB7IDQsIDc1IH0sIHsgNCwgOTAgfSwgeyA1LCA5MCB9LCB7IDYsIDEwMCB9Cit9OworCitpbnQgV2ViUENvbmZpZ0xvc3NsZXNzUHJlc2V0KFdlYlBDb25maWcqIGNvbmZpZywgaW50IGxldmVsKSB7CisgIGlmIChjb25maWcgPT0gTlVMTCB8fCBsZXZlbCA8IDAgfHwgbGV2ZWwgPiBNQVhfTEVWRUwpIHJldHVybiAwOworICBjb25maWctPmxvc3NsZXNzID0gMTsKKyAgY29uZmlnLT5tZXRob2QgPSBrTG9zc2xlc3NQcmVzZXRzW2xldmVsXS5tZXRob2RfOworICBjb25maWctPnF1YWxpdHkgPSBrTG9zc2xlc3NQcmVzZXRzW2xldmVsXS5xdWFsaXR5XzsKKyAgcmV0dXJuIDE7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL2Nvc3RfZW5jLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL2Nvc3RfZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU3N2MxMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvY29zdF9lbmMuYwpAQCAtMCwwICsxLDM0NiBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIENvc3QgdGFibGVzIGZvciBsZXZlbCBhbmQgbW9kZXMKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RkbGliX3BvZW0uaCIKKyNlbmRpZgorCisjaW5jbHVkZSAic3JjL2VuYy9jb3N0X2VuYy5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTGV2ZWwgY29zdCB0YWJsZXMKKworLy8gRm9yIGVhY2ggZ2l2ZW4gbGV2ZWwsIHRoZSBmb2xsb3dpbmcgdGFibGUgZ2l2ZXMgdGhlIHBhdHRlcm4gb2YgY29udGV4dHMgdG8KKy8vIHVzZSBmb3IgY29kaW5nIGl0IChpbiBbXVswXSkgYXMgd2VsbCBhcyB0aGUgYml0IHZhbHVlIHRvIHVzZSBmb3IgZWFjaAorLy8gY29udGV4dCAoaW4gW11bMV0pLgorY29uc3QgdWludDE2X3QgVlA4TGV2ZWxDb2Rlc1tNQVhfVkFSSUFCTEVfTEVWRUxdWzJdID0geworICAgICAgICAgICAgICAgICAgezB4MDAxLCAweDAwMH0sIHsweDAwNywgMHgwMDF9LCB7MHgwMGYsIDB4MDA1fSwKKyAgezB4MDBmLCAweDAwZH0sIHsweDAzMywgMHgwMDN9LCB7MHgwMzMsIDB4MDAzfSwgezB4MDMzLCAweDAyM30sCisgIHsweDAzMywgMHgwMjN9LCB7MHgwMzMsIDB4MDIzfSwgezB4MDMzLCAweDAyM30sIHsweDBkMywgMHgwMTN9LAorICB7MHgwZDMsIDB4MDEzfSwgezB4MGQzLCAweDAxM30sIHsweDBkMywgMHgwMTN9LCB7MHgwZDMsIDB4MDEzfSwKKyAgezB4MGQzLCAweDAxM30sIHsweDBkMywgMHgwMTN9LCB7MHgwZDMsIDB4MDEzfSwgezB4MGQzLCAweDA5M30sCisgIHsweDBkMywgMHgwOTN9LCB7MHgwZDMsIDB4MDkzfSwgezB4MGQzLCAweDA5M30sIHsweDBkMywgMHgwOTN9LAorICB7MHgwZDMsIDB4MDkzfSwgezB4MGQzLCAweDA5M30sIHsweDBkMywgMHgwOTN9LCB7MHgwZDMsIDB4MDkzfSwKKyAgezB4MGQzLCAweDA5M30sIHsweDBkMywgMHgwOTN9LCB7MHgwZDMsIDB4MDkzfSwgezB4MGQzLCAweDA5M30sCisgIHsweDBkMywgMHgwOTN9LCB7MHgwZDMsIDB4MDkzfSwgezB4MGQzLCAweDA5M30sIHsweDE1MywgMHgwNTN9LAorICB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwKKyAgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sCisgIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LAorICB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwKKyAgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sCisgIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LAorICB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwKKyAgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDE1M30KK307CisKK3N0YXRpYyBpbnQgVmFyaWFibGVMZXZlbENvc3QoaW50IGxldmVsLCBjb25zdCB1aW50OF90IHByb2Jhc1tOVU1fUFJPQkFTXSkgeworICBpbnQgcGF0dGVybiA9IFZQOExldmVsQ29kZXNbbGV2ZWwgLSAxXVswXTsKKyAgaW50IGJpdHMgPSBWUDhMZXZlbENvZGVzW2xldmVsIC0gMV1bMV07CisgIGludCBjb3N0ID0gMDsKKyAgaW50IGk7CisgIGZvciAoaSA9IDI7IHBhdHRlcm47ICsraSkgeworICAgIGlmIChwYXR0ZXJuICYgMSkgeworICAgICAgY29zdCArPSBWUDhCaXRDb3N0KGJpdHMgJiAxLCBwcm9iYXNbaV0pOworICAgIH0KKyAgICBiaXRzID4+PSAxOworICAgIHBhdHRlcm4gPj49IDE7CisgIH0KKyAgcmV0dXJuIGNvc3Q7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQcmUtY2FsYyBsZXZlbCBjb3N0cyBvbmNlIGZvciBhbGwKKwordm9pZCBWUDhDYWxjdWxhdGVMZXZlbENvc3RzKFZQOEVuY1Byb2JhKiBjb25zdCBwcm9iYSkgeworICBpbnQgY3R5cGUsIGJhbmQsIGN0eDsKKworICBpZiAoIXByb2JhLT5kaXJ0eV8pIHJldHVybjsgIC8vIG5vdGhpbmcgdG8gZG8uCisKKyAgZm9yIChjdHlwZSA9IDA7IGN0eXBlIDwgTlVNX1RZUEVTOyArK2N0eXBlKSB7CisgICAgaW50IG47CisgICAgZm9yIChiYW5kID0gMDsgYmFuZCA8IE5VTV9CQU5EUzsgKytiYW5kKSB7CisgICAgICBmb3IgKGN0eCA9IDA7IGN0eCA8IE5VTV9DVFg7ICsrY3R4KSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHAgPSBwcm9iYS0+Y29lZmZzX1tjdHlwZV1bYmFuZF1bY3R4XTsKKyAgICAgICAgdWludDE2X3QqIGNvbnN0IHRhYmxlID0gcHJvYmEtPmxldmVsX2Nvc3RfW2N0eXBlXVtiYW5kXVtjdHhdOworICAgICAgICBjb25zdCBpbnQgY29zdDAgPSAoY3R4ID4gMCkgPyBWUDhCaXRDb3N0KDEsIHBbMF0pIDogMDsKKyAgICAgICAgY29uc3QgaW50IGNvc3RfYmFzZSA9IFZQOEJpdENvc3QoMSwgcFsxXSkgKyBjb3N0MDsKKyAgICAgICAgaW50IHY7CisgICAgICAgIHRhYmxlWzBdID0gVlA4Qml0Q29zdCgwLCBwWzFdKSArIGNvc3QwOworICAgICAgICBmb3IgKHYgPSAxOyB2IDw9IE1BWF9WQVJJQUJMRV9MRVZFTDsgKyt2KSB7CisgICAgICAgICAgdGFibGVbdl0gPSBjb3N0X2Jhc2UgKyBWYXJpYWJsZUxldmVsQ29zdCh2LCBwKTsKKyAgICAgICAgfQorICAgICAgICAvLyBTdGFydGluZyBhdCBsZXZlbCA2NyBhbmQgdXAsIHRoZSB2YXJpYWJsZSBwYXJ0IG9mIHRoZSBjb3N0IGlzCisgICAgICAgIC8vIGFjdHVhbGx5IGNvbnN0YW50LgorICAgICAgfQorICAgIH0KKyAgICBmb3IgKG4gPSAwOyBuIDwgMTY7ICsrbikgeyAgICAvLyByZXBsaWNhdGUgYmFuZHMuIFdlIGRvbid0IG5lZWQgdG8gc2VudGluZWwuCisgICAgICBmb3IgKGN0eCA9IDA7IGN0eCA8IE5VTV9DVFg7ICsrY3R4KSB7CisgICAgICAgIHByb2JhLT5yZW1hcHBlZF9jb3N0c19bY3R5cGVdW25dW2N0eF0gPQorICAgICAgICAgICAgcHJvYmEtPmxldmVsX2Nvc3RfW2N0eXBlXVtWUDhFbmNCYW5kc1tuXV1bY3R4XTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcHJvYmEtPmRpcnR5XyA9IDA7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNb2RlIGNvc3QgdGFibGVzLgorCisvLyBUaGVzZSBhcmUgdGhlIGZpeGVkIHByb2JhYmlsaXRpZXMgKGluIHRoZSBjb2RpbmcgdHJlZXMpIHR1cm5lZCBpbnRvIGJpdC1jb3N0CisvLyBieSBjYWxsaW5nIFZQOEJpdENvc3QoKS4KK2NvbnN0IHVpbnQxNl90IFZQOEZpeGVkQ29zdHNVVls0XSA9IHsgMzAyLCA5ODQsIDQzOSwgNjQyIH07CisvLyBub3RlOiB0aGVzZSB2YWx1ZXMgaW5jbHVkZSB0aGUgZml4ZWQgVlA4Qml0Q29zdCgxLCAxNDUpIG1vZGUgc2VsZWN0aW9uIGNvc3QuCitjb25zdCB1aW50MTZfdCBWUDhGaXhlZENvc3RzSTE2WzRdID0geyA2NjMsIDkxOSwgODcyLCA5MTkgfTsKK2NvbnN0IHVpbnQxNl90IFZQOEZpeGVkQ29zdHNJNFtOVU1fQk1PREVTXVtOVU1fQk1PREVTXVtOVU1fQk1PREVTXSA9IHsKKyAgeyB7ICAgNDAsIDExNTEsIDE3MjMsIDE4NzQsIDIxMDMsIDIwMTksIDE2MjgsIDE3NzcsIDIyMjYsIDIxMzcgfSwKKyAgICB7ICAxOTIsICA0NjksIDEyOTYsIDEzMDgsIDE4NDksIDE3OTQsIDE3ODEsIDE3MDMsIDE3MTMsIDE1MjIgfSwKKyAgICB7ICAxNDIsICA5MTAsICA3NjIsIDE2ODQsIDE4NDksIDE1NzYsIDE0NjAsIDEzMDUsIDE4MDEsIDE2NTcgfSwKKyAgICB7ICA1NTksICA2NDEsIDEzNzAsICA0MjEsIDExODIsIDE1NjksIDE2MTIsIDE3MjUsICA4NjMsIDEwMDcgfSwKKyAgICB7ICAyOTksIDEwNTksIDEyNTYsIDExMDgsICA2MzYsIDEwNjgsIDE1ODEsIDE4ODMsICA4NjksIDExNDIgfSwKKyAgICB7ICAyNzcsIDExMTEsICA3MDcsIDEzNjIsIDEwODksICA2NzIsIDE2MDMsIDE1NDEsIDE1NDUsIDEyOTEgfSwKKyAgICB7ICAyMTQsICA3ODEsIDE2MDksIDEzMDMsIDE2MzIsIDIyMjksICA3MjYsIDE1NjAsIDE3MTMsICA5MTggfSwKKyAgICB7ICAxNTIsIDEwMzcsIDEwNDYsIDE3NTksIDE5ODMsIDIxNzQsIDEzNTgsICA3NDIsIDE3NDAsIDEzOTAgfSwKKyAgICB7ICA1MTIsIDEwNDYsIDE0MjAsICA3NTMsICA3NTIsIDEyOTcsIDE0ODYsIDE2MTMsICA0NjAsIDEyMDcgfSwKKyAgICB7ICA0MjQsICA4MjcsIDEzNjIsICA3MTksIDE0NjIsIDEyMDIsIDExOTksIDE0NzYsIDExOTksICA1MzggfSB9LAorICB7IHsgIDI0MCwgIDQwMiwgMTEzNCwgMTQ5MSwgMTY1OSwgMTUwNSwgMTUxNywgMTU1NSwgMTk3OSwgMjA5OSB9LAorICAgIHsgIDQ2NywgIDI0MiwgIDk2MCwgMTIzMiwgMTcxNCwgMTYyMCwgMTgzNCwgMTU3MCwgMTY3NiwgMTM5MSB9LAorICAgIHsgIDUwMCwgIDQ1NSwgIDQ2MywgMTUwNywgMTY5OSwgMTI4MiwgMTU2NCwgIDk4MiwgMjExNCwgMjExNCB9LAorICAgIHsgIDY3MiwgIDY0MywgMTM3MiwgIDMzMSwgMTU4OSwgMTY2NywgMTQ1MywgMTkzOCwgIDk5NiwgIDg3NiB9LAorICAgIHsgIDQ1OCwgIDc4MywgMTAzNywgIDkxMSwgIDczOCwgIDk2OCwgMTE2NSwgMTUxOCwgIDg1OSwgMTAzMyB9LAorICAgIHsgIDUwNCwgIDgxNSwgIDUwNCwgMTEzOSwgMTIxOSwgIDcxOSwgMTUwNiwgMTA4NSwgMTI2OCwgMTI2OCB9LAorICAgIHsgIDMzMywgIDYzMCwgMTQ0NSwgMTIzOSwgMTg4MywgMzY3MiwgIDc5OSwgMTU0OCwgMTg2NSwgIDU5OCB9LAorICAgIHsgIDM5OSwgIDY0NCwgIDc0NiwgMTM0MiwgMTg1NiwgMTM1MCwgMTQ5MywgIDYxMywgMTg1NSwgMTAxNSB9LAorICAgIHsgIDYyMiwgIDc0OSwgMTIwNSwgIDYwOCwgMTA2NiwgMTQwOCwgMTI5MCwgMTQwNiwgIDU0NiwgIDk3MSB9LAorICAgIHsgIDUwMCwgIDc1MywgMTA0MSwgIDY2OCwgMTIzMCwgMTYxNywgMTI5NywgMTQyNSwgMTM4MywgIDUyMyB9IH0sCisgIHsgeyAgMzk0LCAgNTUzLCAgNTIzLCAxNTAyLCAxNTM2LCAgOTgxLCAxNjA4LCAxMTQyLCAxNjY2LCAyMTgxIH0sCisgICAgeyAgNjU1LCAgNDMwLCAgMzc1LCAxNDExLCAxODYxLCAxMjIwLCAxNjc3LCAxMTM1LCAxOTc4LCAxNTUzIH0sCisgICAgeyAgNjkwLCAgNjQwLCAgMjQ1LCAxOTU0LCAyMDcwLCAxMTk0LCAxNTI4LCAgOTgyLCAxOTcyLCAyMjMyIH0sCisgICAgeyAgNTU5LCAgODM0LCAgNzQxLCAgODY3LCAxMTMxLCAgOTgwLCAxMjI1LCAgODUyLCAxMDkyLCAgNzg0IH0sCisgICAgeyAgNjkwLCAgODc1LCAgNTE2LCAgOTU5LCAgNjczLCAgODk0LCAxMDU2LCAxMTkwLCAxNTI4LCAxMTI2IH0sCisgICAgeyAgNzQwLCAgOTUxLCAgMzg0LCAxMjc3LCAxMTc3LCAgNDkyLCAxNTc5LCAxMTU1LCAxODQ2LCAxNTEzIH0sCisgICAgeyAgMzIzLCAgNzc1LCAxMDYyLCAxNzc2LCAzMDYyLCAxMjc0LCAgODEzLCAxMTg4LCAxMzcyLCAgNjU1IH0sCisgICAgeyAgNDg4LCAgOTcxLCAgNDg0LCAxNzY3LCAxNTE1LCAxNzc1LCAxMTE1LCAgNTAzLCAxNTM5LCAxNDYxIH0sCisgICAgeyAgNzQwLCAxMDA2LCAgOTk4LCAgNzA5LCAgODUxLCAxMjMwLCAxMzM3LCAgNzg4LCAgNzQxLCAgNzIxIH0sCisgICAgeyAgNTIyLCAxMDczLCAgNTczLCAxMDQ1LCAxMzQ2LCAgODg3LCAxMDQ2LCAxMTQ2LCAxMjAzLCAgNjk3IH0gfSwKKyAgeyB7ICAxMDUsICA4NjQsIDE0NDIsIDEwMDksIDE5MzQsIDE4NDAsIDE1MTksIDE5MjAsIDE2NzMsIDE1NzkgfSwKKyAgICB7ICA1MzQsICAzMDUsIDExOTMsICA2ODMsIDEzODgsIDIxNjQsIDE4MDIsIDE4OTQsIDEyNjQsIDExNzAgfSwKKyAgICB7ICAzMDUsICA1MTgsICA4NzcsIDExMDgsIDE0MjYsIDMyMTUsIDE0MjUsIDEwNjQsIDEzMjAsIDEyNDIgfSwKKyAgICB7ICA2ODMsICA3MzIsIDE5MjcsICAyNTcsIDE0OTMsIDIwNDgsIDE4NTgsIDE1NTIsIDEwNTUsICA5NDcgfSwKKyAgICB7ICAzOTQsICA4MTQsIDEwMjQsICA2NjAsICA5NTksIDE1NTYsIDEyODIsIDEyODksICA4OTMsIDEwNDcgfSwKKyAgICB7ICA1MjgsICA2MTUsICA5OTYsICA5NDAsIDEyMDEsICA2MzUsIDEwOTQsIDI1MTUsICA4MDMsIDEzNTggfSwKKyAgICB7ICAzNDcsICA2MTQsIDE2MDksIDExODcsIDMxMzMsIDEzNDUsIDEwMDcsIDEzMzksIDEwMTcsICA2NjcgfSwKKyAgICB7ICAyMTgsICA3NDAsICA4NzgsIDE2MDUsIDM2NTAsIDM2NTAsIDEzNDUsICA3NTgsIDEzNTcsIDE2MTcgfSwKKyAgICB7ICA2NzIsICA3NTAsIDE1NDEsICA1NTgsIDEyNTcsIDE1OTksIDE4NzAsIDIxMzUsICA0MDIsIDEwODcgfSwKKyAgICB7ICA1OTIsICA2ODQsIDExNjEsICA0MzAsIDEwOTIsIDE0OTcsIDE0NzUsIDE0ODksIDEwOTUsICA4MjIgfSB9LAorICB7IHsgIDIyOCwgMTA1NiwgMTA1OSwgMTM2OCwgIDc1MiwgIDk4MiwgMTUxMiwgMTUxOCwgIDk4NywgMTc4MiB9LAorICAgIHsgIDQ5NCwgIDUxNCwgIDgxOCwgIDk0MiwgIDk2NSwgIDg5MiwgMTYxMCwgMTM1NiwgMTA0OCwgMTM2MyB9LAorICAgIHsgIDUxMiwgIDY0OCwgIDU5MSwgMTA0MiwgIDc2MSwgIDk5MSwgMTE5NiwgMTQ1NCwgMTMwOSwgMTQ2MyB9LAorICAgIHsgIDY4MywgIDc0OSwgMTA0MywgIDY3NiwgIDg0MSwgMTM5NiwgMTEzMywgMTEzOCwgIDY1NCwgIDkzOSB9LAorICAgIHsgIDYyMiwgMTEwMSwgMTEyNiwgIDk5NCwgIDM2MSwgMTA3NywgMTIwMywgMTMxOCwgIDg3NywgMTIxOSB9LAorICAgIHsgIDYzMSwgMTA2OCwgIDg1NywgMTY1MCwgIDY1MSwgIDQ3NywgMTY1MCwgMTQxOSwgIDgyOCwgMTE3MCB9LAorICAgIHsgIDU1NSwgIDcyNywgMTA2OCwgMTMzNSwgMzEyNywgMTMzOSwgIDgyMCwgMTMzMSwgMTA3NywgIDQyOSB9LAorICAgIHsgIDUwNCwgIDg3OSwgIDYyNCwgMTM5OCwgIDg4OSwgIDg4OSwgMTM5MiwgIDgwOCwgIDg5MSwgMTQwNiB9LAorICAgIHsgIDY4MywgMTYwMiwgMTI4OSwgIDk3NywgIDU3OCwgIDk4MywgMTI4MCwgMTcwOCwgIDQwNiwgMTEyMiB9LAorICAgIHsgIDM5OSwgIDg2NSwgMTQzMywgMTA3MCwgMTA3MiwgIDc2NCwgIDk2OCwgMTQ3NywgMTIyMywgIDY3OCB9IH0sCisgIHsgeyAgMzMzLCAgNzYwLCAgOTM1LCAxNjM4LCAxMDEwLCAgNTI5LCAxNjQ2LCAxNDEwLCAxNDcyLCAyMjE5IH0sCisgICAgeyAgNTEyLCAgNDk0LCAgNzUwLCAxMTYwLCAxMjE1LCAgNjEwLCAxODcwLCAxODY4LCAxNjI4LCAxMTY5IH0sCisgICAgeyAgNTcyLCAgNjQ2LCAgNDkyLCAxOTM0LCAxMjA4LCAgNjAzLCAxNTgwLCAxMDk5LCAxMzk4LCAxOTk1IH0sCisgICAgeyAgNzg2LCAgNzg5LCAgOTQyLCAgNTgxLCAxMDE4LCAgOTUxLCAxNTk5LCAxMjA3LCAgNzMxLCAgNzY4IH0sCisgICAgeyAgNjkwLCAxMDE1LCAgNjcyLCAxMDc4LCAgNTgyLCAgNTA0LCAxNjkzLCAxNDM4LCAxMTA4LCAyODk3IH0sCisgICAgeyAgNzY4LCAxMjY3LCAgNTcxLCAyMDA1LCAxMjQzLCAgMjQ0LCAyODgxLCAxMzgwLCAxNzg2LCAxNDUzIH0sCisgICAgeyAgNDUyLCAgODk5LCAxMjkzLCAgOTAzLCAxMzExLCAzMTAwLCAgNDY1LCAxMzExLCAxMzE5LCAgODEzIH0sCisgICAgeyAgMzk0LCAgOTI3LCAgOTQyLCAxMTAzLCAxMzU4LCAxMTA0LCAgOTQ2LCAgNTkzLCAxMzYzLCAxMTA5IH0sCisgICAgeyAgNTU5LCAxMDA1LCAxMDA3LCAxMDE2LCAgNjU4LCAxMTczLCAxMDIxLCAxMTY0LCAgNjIzLCAxMDI4IH0sCisgICAgeyAgNTY0LCAgNzk2LCAgNjMyLCAxMDA1LCAxMDE0LCAgODYzLCAyMzE2LCAxMjY4LCAgOTM4LCAgNzY0IH0gfSwKKyAgeyB7ICAyNjYsICA2MDYsIDEwOTgsIDEyMjgsIDE0OTcsIDEyNDMsICA5NDgsIDEwMzAsIDE3MzQsIDE0NjEgfSwKKyAgICB7ICAzNjYsICA1ODUsICA5MDEsIDEwNjAsIDE0MDcsIDEyNDcsICA4NzYsIDExMzQsIDE2MjAsIDEwNTQgfSwKKyAgICB7ICA0NTIsICA1NjUsICA1NDIsIDE3MjksIDE0NzksIDE0NzksIDEwMTYsICA4ODYsIDI5MzgsIDExNTAgfSwKKyAgICB7ICA1NTUsIDEwODgsIDE1MzMsICA5NTAsIDEzNTQsICA4OTUsICA4MzQsIDEwMTksIDEwMjEsICA0OTYgfSwKKyAgICB7ICA3MDQsICA4MTUsIDExOTMsICA5NzEsICA5NzMsICA2NDAsIDEyMTcsIDIyMTQsICA4MzIsICA1NzggfSwKKyAgICB7ICA2NzIsIDEyNDUsICA1NzksICA4NzEsICA4NzUsICA3NzQsICA4NzIsIDEyNzMsIDEwMjcsICA5NDkgfSwKKyAgICB7ICAyOTYsIDExMzQsIDIwNTAsIDE3ODQsIDE2MzYsIDM0MjUsICA0NDIsIDE1NTAsIDIwNzYsICA3MjIgfSwKKyAgICB7ICAzNDIsICA5ODIsIDEyNTksIDE4NDYsIDE4NDgsIDE4NDgsICA2MjIsICA1NjgsIDE4NDcsIDEwNTIgfSwKKyAgICB7ICA1NTUsIDEwNjQsIDEzMDQsICA4MjgsICA3NDYsIDEzNDMsIDEwNzUsIDEzMjksIDEwNzgsICA0OTQgfSwKKyAgICB7ICAyODgsIDExNjcsIDEyODUsIDExNzQsIDE2MzksIDE2MzksICA4MzMsIDIyNTQsIDEzMDQsICA1MDkgfSB9LAorICB7IHsgIDM0MiwgIDcxOSwgIDc2NywgMTg2NiwgMTc1NywgMTI3MCwgMTI0NiwgIDU1MCwgMTc0NiwgMjE1MSB9LAorICAgIHsgIDQ4MywgIDY1MywgIDY5NCwgMTUwOSwgMTQ1OSwgMTQxMCwgMTIxOCwgIDUwNywgMTkxNCwgMTI2NiB9LAorICAgIHsgIDQ4OCwgIDc1NywgIDQ0NywgMjk3OSwgMTgxMywgMTI2OCwgMTY1NCwgIDUzOSwgMTg0OSwgMjEwOSB9LAorICAgIHsgIDUyMiwgMTA5NywgMTA4NSwgIDg1MSwgMTM2NSwgMTExMSwgIDg1MSwgIDkwMSwgIDk2MSwgIDYwNSB9LAorICAgIHsgIDcwOSwgIDcxNiwgIDg0MSwgIDcyOCwgIDczNiwgIDk0NSwgIDk0MSwgIDg2MiwgMjg0NSwgMTA1NyB9LAorICAgIHsgIDUxMiwgMTMyMywgIDUwMCwgMTMzNiwgMTA4MywgIDY4MSwgMTM0MiwgIDcxNywgMTYwNCwgMTM1MCB9LAorICAgIHsgIDQ1MiwgMTE1NSwgMTM3MiwgMTkwMCwgMTUwMSwgMzI5MCwgIDMxMSwgIDk0NCwgMTkxOSwgIDkyMiB9LAorICAgIHsgIDQwMywgMTUyMCwgIDk3NywgMjEzMiwgMTczMywgMzUyMiwgMTA3NiwgIDI3NiwgMzMzNSwgMTU0NyB9LAorICAgIHsgIDU1OSwgMTM3NCwgMTEwMSwgIDYxNSwgIDY3MywgMjQ2MiwgIDk3NCwgIDc5NSwgIDk4NCwgIDk4NCB9LAorICAgIHsgIDU0NywgMTEyMiwgMTA2MiwgIDgxMiwgMTQxMCwgIDk1MSwgMTE0MCwgIDYyMiwgMTI2OCwgIDY1MSB9IH0sCisgIHsgeyAgMTY1LCAgOTgyLCAxMjM1LCAgOTM4LCAxMzM0LCAxMzY2LCAxNjU5LCAxNTc4LCAgOTY0LCAxNjEyIH0sCisgICAgeyAgNTkyLCAgNDIyLCAgOTI1LCAgODQ3LCAxMTM5LCAxMTEyLCAxMzg3LCAyMDM2LCAgODYxLCAxMDQxIH0sCisgICAgeyAgNDAzLCAgODM3LCAgNzMyLCAgNzcwLCAgOTQxLCAxNjU4LCAxMjUwLCAgODA5LCAxNDA3LCAxNDA3IH0sCisgICAgeyAgODk2LCAgODc0LCAxMDcxLCAgMzgxLCAxNTY4LCAxNzIyLCAxNDM3LCAyMTkyLCAgNDgwLCAxMDM1IH0sCisgICAgeyAgNjQwLCAxMDk4LCAxMDEyLCAxMDMyLCAgNjg0LCAxMzgyLCAxNTgxLCAyMTA2LCAgNDE2LCAgODY1IH0sCisgICAgeyAgNTU5LCAxMDA1LCAgODE5LCAgOTE0LCAgNzEwLCAgNzcwLCAxNDE4LCAgOTIwLCAgODM4LCAxNDM1IH0sCisgICAgeyAgNDE1LCAxMjU4LCAxMjQ1LCAgODcwLCAxMjc4LCAzMDY3LCAgNzcwLCAxMDIxLCAxMjg3LCAgNTIyIH0sCisgICAgeyAgNDA2LCAgOTkwLCAgNjAxLCAxMDA5LCAxMjY1LCAxMjY1LCAxMjY3LCAgNzU5LCAxMDE3LCAxMjc3IH0sCisgICAgeyAgOTY4LCAxMTgyLCAxMzI5LCAgNzg4LCAxMDMyLCAxMjkyLCAxNzA1LCAxNzE0LCAgMjAzLCAxNDAzIH0sCisgICAgeyAgNzMyLCAgODc3LCAxMjc5LCAgNDcxLCAgOTAxLCAxMTYxLCAxNTQ1LCAxMjk0LCAgNzU1LCAgNzU1IH0gfSwKKyAgeyB7ICAxMTEsICA5MzEsIDEzNzgsIDExODUsIDE5MzMsIDE2NDgsIDExNDgsIDE3MTQsIDE4NzMsIDEzMDcgfSwKKyAgICB7ICA0MDYsICA0MTQsIDEwMzAsIDEwMjMsIDE5MTAsIDE0MDQsIDEzMTMsIDE2NDcsIDE1MDksICA3OTMgfSwKKyAgICB7ICAzNDIsICA2NDAsICA1NzUsIDEwODgsIDEyNDEsIDEzNDksIDExNjEsIDEzNTAsIDE3NTYsIDE1MDIgfSwKKyAgICB7ICA1NTksICA3NjYsIDExODUsICAzNTcsIDE2ODIsIDE0MjgsIDEzMjksIDE4OTcsIDEyMTksICA4MDIgfSwKKyAgICB7ICA0NzMsICA5MDksIDExNjQsICA3NzEsICA3MTksIDI1MDgsIDE0MjcsIDE0MzIsICA3MjIsICA3ODIgfSwKKyAgICB7ICAzNDIsICA4OTIsICA3ODUsIDExNDUsIDExNTAsICA3OTQsIDEyOTYsIDE1NTAsICA5NzMsIDEwNTcgfSwKKyAgICB7ICAyMDgsIDEwMzYsIDEzMjYsIDEzNDMsIDE2MDYsIDMzOTUsICA4MTUsIDE0NTUsIDE2MTgsICA3MTIgfSwKKyAgICB7ICAyMjgsICA5MjgsICA4OTAsIDEwNDYsIDM0OTksIDE3MTEsICA5OTQsICA4MjksIDE3MjAsIDEzMTggfSwKKyAgICB7ICA3NjgsICA3MjQsIDEwNTgsICA2MzYsICA5OTEsIDEwNzUsIDEzMTksIDEzMjQsICA2MTYsICA4MjUgfSwKKyAgICB7ICAzMDUsIDExNjcsIDEzNTgsICA4OTksIDE1ODcsIDE1ODcsICA5ODcsIDE5ODgsIDEzMzIsICA1MDEgfSB9Cit9OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gaGVscGVyIGZ1bmN0aW9ucyBmb3IgcmVzaWR1YWxzIHN0cnVjdCBWUDhSZXNpZHVhbC4KKwordm9pZCBWUDhJbml0UmVzaWR1YWwoaW50IGZpcnN0LCBpbnQgY29lZmZfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIFZQOEVuY29kZXIqIGNvbnN0IGVuYywgVlA4UmVzaWR1YWwqIGNvbnN0IHJlcykgeworICByZXMtPmNvZWZmX3R5cGUgPSBjb2VmZl90eXBlOworICByZXMtPnByb2IgID0gZW5jLT5wcm9iYV8uY29lZmZzX1tjb2VmZl90eXBlXTsKKyAgcmVzLT5zdGF0cyA9IGVuYy0+cHJvYmFfLnN0YXRzX1tjb2VmZl90eXBlXTsKKyAgcmVzLT5jb3N0cyA9IGVuYy0+cHJvYmFfLnJlbWFwcGVkX2Nvc3RzX1tjb2VmZl90eXBlXTsKKyAgcmVzLT5maXJzdCA9IGZpcnN0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTW9kZSBjb3N0cworCitpbnQgVlA4R2V0Q29zdEx1bWE0KFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgY29uc3QgaW50MTZfdCBsZXZlbHNbMTZdKSB7CisgIGNvbnN0IGludCB4ID0gKGl0LT5pNF8gJiAzKSwgeSA9IChpdC0+aTRfID4+IDIpOworICBWUDhSZXNpZHVhbCByZXM7CisgIFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOworICBpbnQgUiA9IDA7CisgIGludCBjdHg7CisKKyAgVlA4SW5pdFJlc2lkdWFsKDAsIDMsIGVuYywgJnJlcyk7CisgIGN0eCA9IGl0LT50b3BfbnpfW3hdICsgaXQtPmxlZnRfbnpfW3ldOworICBWUDhTZXRSZXNpZHVhbENvZWZmcyhsZXZlbHMsICZyZXMpOworICBSICs9IFZQOEdldFJlc2lkdWFsQ29zdChjdHgsICZyZXMpOworICByZXR1cm4gUjsKK30KKworaW50IFZQOEdldENvc3RMdW1hMTYoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBjb25zdCBWUDhNb2RlU2NvcmUqIGNvbnN0IHJkKSB7CisgIFZQOFJlc2lkdWFsIHJlczsKKyAgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187CisgIGludCB4LCB5OworICBpbnQgUiA9IDA7CisKKyAgVlA4SXRlcmF0b3JOelRvQnl0ZXMoaXQpOyAgIC8vIHJlLWltcG9ydCB0aGUgbm9uLXplcm8gY29udGV4dAorCisgIC8vIERDCisgIFZQOEluaXRSZXNpZHVhbCgwLCAxLCBlbmMsICZyZXMpOworICBWUDhTZXRSZXNpZHVhbENvZWZmcyhyZC0+eV9kY19sZXZlbHMsICZyZXMpOworICBSICs9IFZQOEdldFJlc2lkdWFsQ29zdChpdC0+dG9wX256X1s4XSArIGl0LT5sZWZ0X256X1s4XSwgJnJlcyk7CisKKyAgLy8gQUMKKyAgVlA4SW5pdFJlc2lkdWFsKDEsIDAsIGVuYywgJnJlcyk7CisgIGZvciAoeSA9IDA7IHkgPCA0OyArK3kpIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgNDsgKyt4KSB7CisgICAgICBjb25zdCBpbnQgY3R4ID0gaXQtPnRvcF9uel9beF0gKyBpdC0+bGVmdF9uel9beV07CisgICAgICBWUDhTZXRSZXNpZHVhbENvZWZmcyhyZC0+eV9hY19sZXZlbHNbeCArIHkgKiA0XSwgJnJlcyk7CisgICAgICBSICs9IFZQOEdldFJlc2lkdWFsQ29zdChjdHgsICZyZXMpOworICAgICAgaXQtPnRvcF9uel9beF0gPSBpdC0+bGVmdF9uel9beV0gPSAocmVzLmxhc3QgPj0gMCk7CisgICAgfQorICB9CisgIHJldHVybiBSOworfQorCitpbnQgVlA4R2V0Q29zdFVWKFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgY29uc3QgVlA4TW9kZVNjb3JlKiBjb25zdCByZCkgeworICBWUDhSZXNpZHVhbCByZXM7CisgIFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOworICBpbnQgY2gsIHgsIHk7CisgIGludCBSID0gMDsKKworICBWUDhJdGVyYXRvck56VG9CeXRlcyhpdCk7ICAvLyByZS1pbXBvcnQgdGhlIG5vbi16ZXJvIGNvbnRleHQKKworICBWUDhJbml0UmVzaWR1YWwoMCwgMiwgZW5jLCAmcmVzKTsKKyAgZm9yIChjaCA9IDA7IGNoIDw9IDI7IGNoICs9IDIpIHsKKyAgICBmb3IgKHkgPSAwOyB5IDwgMjsgKyt5KSB7CisgICAgICBmb3IgKHggPSAwOyB4IDwgMjsgKyt4KSB7CisgICAgICAgIGNvbnN0IGludCBjdHggPSBpdC0+dG9wX256X1s0ICsgY2ggKyB4XSArIGl0LT5sZWZ0X256X1s0ICsgY2ggKyB5XTsKKyAgICAgICAgVlA4U2V0UmVzaWR1YWxDb2VmZnMocmQtPnV2X2xldmVsc1tjaCAqIDIgKyB4ICsgeSAqIDJdLCAmcmVzKTsKKyAgICAgICAgUiArPSBWUDhHZXRSZXNpZHVhbENvc3QoY3R4LCAmcmVzKTsKKyAgICAgICAgaXQtPnRvcF9uel9bNCArIGNoICsgeF0gPSBpdC0+bGVmdF9uel9bNCArIGNoICsgeV0gPSAocmVzLmxhc3QgPj0gMCk7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBSOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSZWNvcmRpbmcgb2YgdG9rZW4gcHJvYmFiaWxpdGllcy4KKworLy8gV2Uga2VlcCB0aGUgdGFibGUtZnJlZSB2YXJpYW50IGFyb3VuZCBmb3IgcmVmZXJlbmNlLCBpbiBjYXNlLgorI2RlZmluZSBVU0VfTEVWRUxfQ09ERV9UQUJMRQorCisvLyBTaW11bGF0ZSBibG9jayBjb2RpbmcsIGJ1dCBvbmx5IHJlY29yZCBzdGF0aXN0aWNzLgorLy8gTm90ZTogbm8gbmVlZCB0byByZWNvcmQgdGhlIGZpeGVkIHByb2Jhcy4KK2ludCBWUDhSZWNvcmRDb2VmZnMoaW50IGN0eCwgY29uc3QgVlA4UmVzaWR1YWwqIGNvbnN0IHJlcykgeworICBpbnQgbiA9IHJlcy0+Zmlyc3Q7CisgIC8vIHNob3VsZCBiZSBzdGF0c1tWUDhFbmNCYW5kc1tuXV0sIGJ1dCBpdCdzIGVxdWl2YWxlbnQgZm9yIG49MCBvciAxCisgIHByb2JhX3QqIHMgPSByZXMtPnN0YXRzW25dW2N0eF07CisgIGlmIChyZXMtPmxhc3QgIDwgMCkgeworICAgIFZQOFJlY29yZFN0YXRzKDAsIHMgKyAwKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICB3aGlsZSAobiA8PSByZXMtPmxhc3QpIHsKKyAgICBpbnQgdjsKKyAgICBWUDhSZWNvcmRTdGF0cygxLCBzICsgMCk7ICAvLyBvcmRlciBvZiByZWNvcmQgZG9lc24ndCBtYXR0ZXIKKyAgICB3aGlsZSAoKHYgPSByZXMtPmNvZWZmc1tuKytdKSA9PSAwKSB7CisgICAgICBWUDhSZWNvcmRTdGF0cygwLCBzICsgMSk7CisgICAgICBzID0gcmVzLT5zdGF0c1tWUDhFbmNCYW5kc1tuXV1bMF07CisgICAgfQorICAgIFZQOFJlY29yZFN0YXRzKDEsIHMgKyAxKTsKKyAgICBpZiAoIVZQOFJlY29yZFN0YXRzKDJ1IDwgKHVuc2lnbmVkIGludCkodiArIDEpLCBzICsgMikpIHsgIC8vIHYgPSAtMSBvciAxCisgICAgICBzID0gcmVzLT5zdGF0c1tWUDhFbmNCYW5kc1tuXV1bMV07CisgICAgfSBlbHNlIHsKKyAgICAgIHYgPSBhYnModik7CisjaWYgIWRlZmluZWQoVVNFX0xFVkVMX0NPREVfVEFCTEUpCisgICAgICBpZiAoIVZQOFJlY29yZFN0YXRzKHYgPiA0LCBzICsgMykpIHsKKyAgICAgICAgaWYgKFZQOFJlY29yZFN0YXRzKHYgIT0gMiwgcyArIDQpKQorICAgICAgICAgIFZQOFJlY29yZFN0YXRzKHYgPT0gNCwgcyArIDUpOworICAgICAgfSBlbHNlIGlmICghVlA4UmVjb3JkU3RhdHModiA+IDEwLCBzICsgNikpIHsKKyAgICAgICAgVlA4UmVjb3JkU3RhdHModiA+IDYsIHMgKyA3KTsKKyAgICAgIH0gZWxzZSBpZiAoIVZQOFJlY29yZFN0YXRzKCh2ID49IDMgKyAoOCA8PCAyKSksIHMgKyA4KSkgeworICAgICAgICBWUDhSZWNvcmRTdGF0cygodiA+PSAzICsgKDggPDwgMSkpLCBzICsgOSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBWUDhSZWNvcmRTdGF0cygodiA+PSAzICsgKDggPDwgMykpLCBzICsgMTApOworICAgICAgfQorI2Vsc2UKKyAgICAgIGlmICh2ID4gTUFYX1ZBUklBQkxFX0xFVkVMKSB7CisgICAgICAgIHYgPSBNQVhfVkFSSUFCTEVfTEVWRUw7CisgICAgICB9CisKKyAgICAgIHsKKyAgICAgICAgY29uc3QgaW50IGJpdHMgPSBWUDhMZXZlbENvZGVzW3YgLSAxXVsxXTsKKyAgICAgICAgaW50IHBhdHRlcm4gPSBWUDhMZXZlbENvZGVzW3YgLSAxXVswXTsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaSA9IDA7IChwYXR0ZXJuID4+PSAxKSAhPSAwOyArK2kpIHsKKyAgICAgICAgICBjb25zdCBpbnQgbWFzayA9IDIgPDwgaTsKKyAgICAgICAgICBpZiAocGF0dGVybiAmIDEpIFZQOFJlY29yZFN0YXRzKCEhKGJpdHMgJiBtYXNrKSwgcyArIDMgKyBpKTsKKyAgICAgICAgfQorICAgICAgfQorI2VuZGlmCisgICAgICBzID0gcmVzLT5zdGF0c1tWUDhFbmNCYW5kc1tuXV1bMl07CisgICAgfQorICB9CisgIGlmIChuIDwgMTYpIFZQOFJlY29yZFN0YXRzKDAsIHMgKyAwKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL2Nvc3RfZW5jLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL2Nvc3RfZW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVkMmQ4MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvY29zdF9lbmMuaApAQCAtMCwwICsxLDg3IEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQ29zdCB0YWJsZXMgZm9yIGxldmVsIGFuZCBtb2Rlcy4KKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaWZuZGVmIFdFQlBfRU5DX0NPU1RfRU5DX0hfCisjZGVmaW5lIFdFQlBfRU5DX0NPU1RfRU5DX0hfCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCisjZWxzZQorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvZW5jL3ZwOGlfZW5jLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLy8gT24tdGhlLWZseSBpbmZvIGFib3V0IHRoZSBjdXJyZW50IHNldCBvZiByZXNpZHVhbHMuIEhhbmR5IHRvIGF2b2lkCisvLyBwYXNzaW5nIHppbGxpb25zIG9mIHBhcmFtcy4KK3R5cGVkZWYgc3RydWN0IFZQOFJlc2lkdWFsIFZQOFJlc2lkdWFsOworc3RydWN0IFZQOFJlc2lkdWFsIHsKKyAgaW50IGZpcnN0OworICBpbnQgbGFzdDsKKyAgY29uc3QgaW50MTZfdCogY29lZmZzOworCisgIGludCBjb2VmZl90eXBlOworICBQcm9iYUFycmF5KiAgIHByb2I7CisgIFN0YXRzQXJyYXkqICAgc3RhdHM7CisgIENvc3RBcnJheVB0ciAgY29zdHM7Cit9OworCit2b2lkIFZQOEluaXRSZXNpZHVhbChpbnQgZmlyc3QsIGludCBjb2VmZl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgVlA4RW5jb2RlciogY29uc3QgZW5jLCBWUDhSZXNpZHVhbCogY29uc3QgcmVzKTsKKworaW50IFZQOFJlY29yZENvZWZmcyhpbnQgY3R4LCBjb25zdCBWUDhSZXNpZHVhbCogY29uc3QgcmVzKTsKKworLy8gUmVjb3JkIHByb2JhIGNvbnRleHQgdXNlZC4KK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4UmVjb3JkU3RhdHMoaW50IGJpdCwgcHJvYmFfdCogY29uc3Qgc3RhdHMpIHsKKyAgcHJvYmFfdCBwID0gKnN0YXRzOworICAvLyBBbiBvdmVyZmxvdyBpcyBpbmJvdW5kLiBOb3RlIHdlIGhhbmRsZSB0aGlzIGF0IDB4ZmZmZTAwMDB1IGluc3RlYWQgb2YKKyAgLy8gMHhmZmZmMDAwMHUgdG8gbWFrZSBzdXJlIHAgKyAxdSBkb2VzIG5vdCBvdmVyZmxvdy4KKyAgaWYgKHAgPj0gMHhmZmZlMDAwMHUpIHsKKyAgICBwID0gKChwICsgMXUpID4+IDEpICYgMHg3ZmZmN2ZmZnU7ICAvLyAtPiBkaXZpZGUgdGhlIHN0YXRzIGJ5IDIuCisgIH0KKyAgLy8gcmVjb3JkIGJpdCBjb3VudCAobG93ZXIgMTYgYml0cykgYW5kIGluY3JlbWVudCB0b3RhbCBjb3VudCAodXBwZXIgMTYgYml0cykuCisgIHAgKz0gMHgwMDAxMDAwMHUgKyBiaXQ7CisgICpzdGF0cyA9IHA7CisgIHJldHVybiBiaXQ7Cit9CisKKy8vIENvc3Qgb2YgY29kaW5nIG9uZSBldmVudCB3aXRoIHByb2JhYmlsaXR5ICdwcm9iYScuCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOEJpdENvc3QoaW50IGJpdCwgdWludDhfdCBwcm9iYSkgeworICByZXR1cm4gIWJpdCA/IFZQOEVudHJvcHlDb3N0W3Byb2JhXSA6IFZQOEVudHJvcHlDb3N0WzI1NSAtIHByb2JhXTsKK30KKworLy8gTGV2ZWwgY29zdCBjYWxjdWxhdGlvbnMKK2V4dGVybiBjb25zdCB1aW50MTZfdCBWUDhMZXZlbENvZGVzW01BWF9WQVJJQUJMRV9MRVZFTF1bMl07Cit2b2lkIFZQOENhbGN1bGF0ZUxldmVsQ29zdHMoVlA4RW5jUHJvYmEqIGNvbnN0IHByb2JhKTsKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4TGV2ZWxDb3N0KGNvbnN0IHVpbnQxNl90KiBjb25zdCB0YWJsZSwgaW50IGxldmVsKSB7CisgIHJldHVybiBWUDhMZXZlbEZpeGVkQ29zdHNbbGV2ZWxdCisgICAgICAgKyB0YWJsZVsobGV2ZWwgPiBNQVhfVkFSSUFCTEVfTEVWRUwpID8gTUFYX1ZBUklBQkxFX0xFVkVMIDogbGV2ZWxdOworfQorCisvLyBNb2RlIGNvc3RzCitleHRlcm4gY29uc3QgdWludDE2X3QgVlA4Rml4ZWRDb3N0c1VWWzRdOworZXh0ZXJuIGNvbnN0IHVpbnQxNl90IFZQOEZpeGVkQ29zdHNJMTZbNF07CitleHRlcm4gY29uc3QgdWludDE2X3QgVlA4Rml4ZWRDb3N0c0k0W05VTV9CTU9ERVNdW05VTV9CTU9ERVNdW05VTV9CTU9ERVNdOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30gICAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLyogV0VCUF9FTkNfQ09TVF9FTkNfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvZmlsdGVyX2VuYy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9maWx0ZXJfZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE5ODIxNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvZmlsdGVyX2VuYy5jCkBAIC0wLDAgKzEsMjQwIEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU2VsZWN0aW5nIGZpbHRlciBsZXZlbAorLy8KKy8vIEF1dGhvcjogc29tbmF0aEBnb29nbGUuY29tIChTb21uYXRoIEJhbmVyamVlKQorCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vYXNzZXJ0X3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdfcG9lbS5oIgorI2Vsc2UKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorI2luY2x1ZGUgInNyYy9lbmMvdnA4aV9lbmMuaCIKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisvLyBUaGlzIHRhYmxlIGdpdmVzLCBmb3IgYSBnaXZlbiBzaGFycG5lc3MsIHRoZSBmaWx0ZXJpbmcgc3RyZW5ndGggdG8gYmUKKy8vIHVzZWQgKGF0IGxlYXN0KSBpbiBvcmRlciB0byBmaWx0ZXIgYSBnaXZlbiBlZGdlIHN0ZXAgZGVsdGEuCisvLyBUaGlzIGlzIGNvbnN0cnVjdGVkIGJ5IGJydXRlIGZvcmNlIGluc3BlY3Rpb246IGZvciBhbGwgZGVsdGEsIHdlIGl0ZXJhdGUKKy8vIG92ZXIgYWxsIHBvc3NpYmxlIGZpbHRlcmluZyBzdHJlbmd0aCAvIHRocmVzaCB1bnRpbCBuZWVkc19maWx0ZXIoKSByZXR1cm5zCisvLyB0cnVlLgorI2RlZmluZSBNQVhfREVMVEFfU0laRSA2NAorc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0xldmVsc0Zyb21EZWx0YVs4XVtNQVhfREVMVEFfU0laRV0gPSB7CisgIHsgMCwgICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsCisgICAgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsCisgICAgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LCA0MCwgNDEsIDQyLCA0MywgNDQsIDQ1LCA0NiwgNDcsCisgICAgNDgsIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjMgfSwKKyAgeyAwLCAgMSwgIDIsICAzLCAgNSwgIDYsICA3LCAgOCwgIDksIDExLCAxMiwgMTMsIDE0LCAxNSwgMTcsIDE4LAorICAgIDIwLCAyMSwgMjMsIDI0LCAyNiwgMjcsIDI5LCAzMCwgMzIsIDMzLCAzNSwgMzYsIDM4LCAzOSwgNDEsIDQyLAorICAgIDQ0LCA0NSwgNDcsIDQ4LCA1MCwgNTEsIDUzLCA1NCwgNTYsIDU3LCA1OSwgNjAsIDYyLCA2MywgNjMsIDYzLAorICAgIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzIH0sCisgIHsgIDAsICAxLCAgMiwgIDMsICA1LCAgNiwgIDcsICA4LCAgOSwgMTEsIDEyLCAxMywgMTQsIDE2LCAxNywgMTksCisgICAgMjAsIDIyLCAyMywgMjUsIDI2LCAyOCwgMjksIDMxLCAzMiwgMzQsIDM1LCAzNywgMzgsIDQwLCA0MSwgNDMsCisgICAgNDQsIDQ2LCA0NywgNDksIDUwLCA1MiwgNTMsIDU1LCA1NiwgNTgsIDU5LCA2MSwgNjIsIDYzLCA2MywgNjMsCisgICAgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMgfSwKKyAgeyAgMCwgIDEsICAyLCAgMywgIDUsICA2LCAgNywgIDgsICA5LCAxMSwgMTIsIDEzLCAxNSwgMTYsIDE4LCAxOSwKKyAgICAyMSwgMjIsIDI0LCAyNSwgMjcsIDI4LCAzMCwgMzEsIDMzLCAzNCwgMzYsIDM3LCAzOSwgNDAsIDQyLCA0MywKKyAgICA0NSwgNDYsIDQ4LCA0OSwgNTEsIDUyLCA1NCwgNTUsIDU3LCA1OCwgNjAsIDYxLCA2MywgNjMsIDYzLCA2MywKKyAgICA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MyB9LAorICB7ICAwLCAgMSwgIDIsICAzLCAgNSwgIDYsICA3LCAgOCwgIDksIDExLCAxMiwgMTQsIDE1LCAxNywgMTgsIDIwLAorICAgIDIxLCAyMywgMjQsIDI2LCAyNywgMjksIDMwLCAzMiwgMzMsIDM1LCAzNiwgMzgsIDM5LCA0MSwgNDIsIDQ0LAorICAgIDQ1LCA0NywgNDgsIDUwLCA1MSwgNTMsIDU0LCA1NiwgNTcsIDU5LCA2MCwgNjIsIDYzLCA2MywgNjMsIDYzLAorICAgIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzIH0sCisgIHsgIDAsICAxLCAgMiwgIDQsICA1LCAgNywgIDgsICA5LCAxMSwgMTIsIDEzLCAxNSwgMTYsIDE3LCAxOSwgMjAsCisgICAgMjIsIDIzLCAyNSwgMjYsIDI4LCAyOSwgMzEsIDMyLCAzNCwgMzUsIDM3LCAzOCwgNDAsIDQxLCA0MywgNDQsCisgICAgNDYsIDQ3LCA0OSwgNTAsIDUyLCA1MywgNTUsIDU2LCA1OCwgNTksIDYxLCA2MiwgNjMsIDYzLCA2MywgNjMsCisgICAgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMgfSwKKyAgeyAgMCwgIDEsICAyLCAgNCwgIDUsICA3LCAgOCwgIDksIDExLCAxMiwgMTMsIDE1LCAxNiwgMTgsIDE5LCAyMSwKKyAgICAyMiwgMjQsIDI1LCAyNywgMjgsIDMwLCAzMSwgMzMsIDM0LCAzNiwgMzcsIDM5LCA0MCwgNDIsIDQzLCA0NSwKKyAgICA0NiwgNDgsIDQ5LCA1MSwgNTIsIDU0LCA1NSwgNTcsIDU4LCA2MCwgNjEsIDYzLCA2MywgNjMsIDYzLCA2MywKKyAgICA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MyB9LAorICB7ICAwLCAgMSwgIDIsICA0LCAgNSwgIDcsICA4LCAgOSwgMTEsIDEyLCAxNCwgMTUsIDE3LCAxOCwgMjAsIDIxLAorICAgIDIzLCAyNCwgMjYsIDI3LCAyOSwgMzAsIDMyLCAzMywgMzUsIDM2LCAzOCwgMzksIDQxLCA0MiwgNDQsIDQ1LAorICAgIDQ3LCA0OCwgNTAsIDUxLCA1MywgNTQsIDU2LCA1NywgNTksIDYwLCA2MiwgNjMsIDYzLCA2MywgNjMsIDYzLAorICAgIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzIH0KK307CisKK2ludCBWUDhGaWx0ZXJTdHJlbmd0aEZyb21EZWx0YShpbnQgc2hhcnBuZXNzLCBpbnQgZGVsdGEpIHsKKyAgY29uc3QgaW50IHBvcyA9IChkZWx0YSA8IE1BWF9ERUxUQV9TSVpFKSA/IGRlbHRhIDogTUFYX0RFTFRBX1NJWkUgLSAxOworICBhc3NlcnQoc2hhcnBuZXNzID49IDAgJiYgc2hhcnBuZXNzIDw9IDcpOworICByZXR1cm4ga0xldmVsc0Zyb21EZWx0YVtzaGFycG5lc3NdW3Bvc107Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQYXJhZ3JhcGggMTUuNDogY29tcHV0ZSB0aGUgaW5uZXItZWRnZSBmaWx0ZXJpbmcgc3RyZW5ndGgKKworI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX1NJWkUpCisKK3N0YXRpYyBpbnQgR2V0SUxldmVsKGludCBzaGFycG5lc3MsIGludCBsZXZlbCkgeworICBpZiAoc2hhcnBuZXNzID4gMCkgeworICAgIGlmIChzaGFycG5lc3MgPiA0KSB7CisgICAgICBsZXZlbCA+Pj0gMjsKKyAgICB9IGVsc2UgeworICAgICAgbGV2ZWwgPj49IDE7CisgICAgfQorICAgIGlmIChsZXZlbCA+IDkgLSBzaGFycG5lc3MpIHsKKyAgICAgIGxldmVsID0gOSAtIHNoYXJwbmVzczsKKyAgICB9CisgIH0KKyAgaWYgKGxldmVsIDwgMSkgbGV2ZWwgPSAxOworICByZXR1cm4gbGV2ZWw7Cit9CisKK3N0YXRpYyB2b2lkIERvRmlsdGVyKGNvbnN0IFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgaW50IGxldmVsKSB7CisgIGNvbnN0IFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOworICBjb25zdCBpbnQgaWxldmVsID0gR2V0SUxldmVsKGVuYy0+Y29uZmlnXy0+ZmlsdGVyX3NoYXJwbmVzcywgbGV2ZWwpOworICBjb25zdCBpbnQgbGltaXQgPSAyICogbGV2ZWwgKyBpbGV2ZWw7CisKKyAgdWludDhfdCogY29uc3QgeV9kc3QgPSBpdC0+eXV2X291dDJfICsgWV9PRkZfRU5DOworICB1aW50OF90KiBjb25zdCB1X2RzdCA9IGl0LT55dXZfb3V0Ml8gKyBVX09GRl9FTkM7CisgIHVpbnQ4X3QqIGNvbnN0IHZfZHN0ID0gaXQtPnl1dl9vdXQyXyArIFZfT0ZGX0VOQzsKKworICAvLyBjb3B5IGN1cnJlbnQgYmxvY2sgdG8geXV2X291dDJfCisgIG1lbWNweSh5X2RzdCwgaXQtPnl1dl9vdXRfLCBZVVZfU0laRV9FTkMgKiBzaXplb2YodWludDhfdCkpOworCisgIGlmIChlbmMtPmZpbHRlcl9oZHJfLnNpbXBsZV8gPT0gMSkgeyAgIC8vIHNpbXBsZQorICAgIFZQOFNpbXBsZUhGaWx0ZXIxNmkoeV9kc3QsIEJQUywgbGltaXQpOworICAgIFZQOFNpbXBsZVZGaWx0ZXIxNmkoeV9kc3QsIEJQUywgbGltaXQpOworICB9IGVsc2UgeyAgICAvLyBjb21wbGV4CisgICAgY29uc3QgaW50IGhldl90aHJlc2ggPSAobGV2ZWwgPj0gNDApID8gMiA6IChsZXZlbCA+PSAxNSkgPyAxIDogMDsKKyAgICBWUDhIRmlsdGVyMTZpKHlfZHN0LCBCUFMsIGxpbWl0LCBpbGV2ZWwsIGhldl90aHJlc2gpOworICAgIFZQOEhGaWx0ZXI4aSh1X2RzdCwgdl9kc3QsIEJQUywgbGltaXQsIGlsZXZlbCwgaGV2X3RocmVzaCk7CisgICAgVlA4VkZpbHRlcjE2aSh5X2RzdCwgQlBTLCBsaW1pdCwgaWxldmVsLCBoZXZfdGhyZXNoKTsKKyAgICBWUDhWRmlsdGVyOGkodV9kc3QsIHZfZHN0LCBCUFMsIGxpbWl0LCBpbGV2ZWwsIGhldl90aHJlc2gpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTU0lNIG1ldHJpYyBmb3Igb25lIG1hY3JvYmxvY2sKKworc3RhdGljIGRvdWJsZSBHZXRNQlNTSU0oY29uc3QgdWludDhfdCogeXV2MSwgY29uc3QgdWludDhfdCogeXV2MikgeworICBpbnQgeCwgeTsKKyAgZG91YmxlIHN1bSA9IDAuOworCisgIC8vIGNvbXB1dGUgU1NJTSBpbiBhIDEwIHggMTAgd2luZG93CisgIGZvciAoeSA9IFZQOF9TU0lNX0tFUk5FTDsgeSA8IDE2IC0gVlA4X1NTSU1fS0VSTkVMOyB5KyspIHsKKyAgICBmb3IgKHggPSBWUDhfU1NJTV9LRVJORUw7IHggPCAxNiAtIFZQOF9TU0lNX0tFUk5FTDsgeCsrKSB7CisgICAgICBzdW0gKz0gVlA4U1NJTUdldENsaXBwZWQoeXV2MSArIFlfT0ZGX0VOQywgQlBTLCB5dXYyICsgWV9PRkZfRU5DLCBCUFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwgeSwgMTYsIDE2KTsKKyAgICB9CisgIH0KKyAgZm9yICh4ID0gMTsgeCA8IDc7IHgrKykgeworICAgIGZvciAoeSA9IDE7IHkgPCA3OyB5KyspIHsKKyAgICAgIHN1bSArPSBWUDhTU0lNR2V0Q2xpcHBlZCh5dXYxICsgVV9PRkZfRU5DLCBCUFMsIHl1djIgKyBVX09GRl9FTkMsIEJQUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LCB5LCA4LCA4KTsKKyAgICAgIHN1bSArPSBWUDhTU0lNR2V0Q2xpcHBlZCh5dXYxICsgVl9PRkZfRU5DLCBCUFMsIHl1djIgKyBWX09GRl9FTkMsIEJQUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LCB5LCA4LCA4KTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHN1bTsKK30KKworI2VuZGlmICAvLyAhZGVmaW5lZChXRUJQX1JFRFVDRV9TSVpFKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRXhwb3NlZCBBUElzOiBFbmNvZGVyIHNob3VsZCBjYWxsIHRoZSBmb2xsb3dpbmcgMyBmdW5jdGlvbnMgdG8gYWRqdXN0CisvLyBsb29wIGZpbHRlciBzdHJlbmd0aAorCit2b2lkIFZQOEluaXRGaWx0ZXIoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KSB7CisjaWYgIWRlZmluZWQoV0VCUF9SRURVQ0VfU0laRSkKKyAgaWYgKGl0LT5sZl9zdGF0c18gIT0gTlVMTCkgeworICAgIGludCBzLCBpOworICAgIGZvciAocyA9IDA7IHMgPCBOVU1fTUJfU0VHTUVOVFM7IHMrKykgeworICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9MRl9MRVZFTFM7IGkrKykgeworICAgICAgICAoKml0LT5sZl9zdGF0c18pW3NdW2ldID0gMDsKKyAgICAgIH0KKyAgICB9CisgICAgVlA4U1NJTURzcEluaXQoKTsKKyAgfQorI2Vsc2UKKyAgKHZvaWQpaXQ7CisjZW5kaWYKK30KKwordm9pZCBWUDhTdG9yZUZpbHRlclN0YXRzKFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCkgeworI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX1NJWkUpCisgIGludCBkOworICBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKKyAgY29uc3QgaW50IHMgPSBpdC0+bWJfLT5zZWdtZW50XzsKKyAgY29uc3QgaW50IGxldmVsMCA9IGVuYy0+ZHFtX1tzXS5mc3RyZW5ndGhfOworCisgIC8vIGV4cGxvcmUgKy8tcXVhbnQgcmFuZ2Ugb2YgdmFsdWVzIGFyb3VuZCBsZXZlbDAKKyAgY29uc3QgaW50IGRlbHRhX21pbiA9IC1lbmMtPmRxbV9bc10ucXVhbnRfOworICBjb25zdCBpbnQgZGVsdGFfbWF4ID0gZW5jLT5kcW1fW3NdLnF1YW50XzsKKyAgY29uc3QgaW50IHN0ZXBfc2l6ZSA9IChkZWx0YV9tYXggLSBkZWx0YV9taW4gPj0gNCkgPyA0IDogMTsKKworICBpZiAoaXQtPmxmX3N0YXRzXyA9PSBOVUxMKSByZXR1cm47CisKKyAgLy8gTk9URTogQ3VycmVudGx5IHdlIGFyZSBhcHBseWluZyBmaWx0ZXIgb25seSBhY3Jvc3MgdGhlIHN1YmxvY2sgZWRnZXMKKyAgLy8gVGhlcmUgYXJlIHR3byByZWFzb25zIGZvciB0aGF0LgorICAvLyAxLiBBcHBseWluZyBmaWx0ZXIgb24gbWFjcm8gYmxvY2sgZWRnZXMgd2lsbCBjaGFuZ2UgdGhlIHBpeGVscyBpbgorICAvLyB0aGUgbGVmdCBhbmQgdG9wIG1hY3JvIGJsb2Nrcy4gVGhhdCB3aWxsIGJlIGhhcmQgdG8gcmVzdG9yZQorICAvLyAyLiBNYWNybyBCbG9ja3Mgb24gdGhlIGJvdHRvbSBhbmQgcmlnaHQgYXJlIG5vdCB5ZXQgY29tcHJlc3NlZC4gU28gd2UKKyAgLy8gY2Fubm90IGFwcGx5IGZpbHRlciBvbiB0aGUgcmlnaHQgYW5kIGJvdHRvbSBtYWNybyBibG9jayBlZGdlcy4KKyAgaWYgKGl0LT5tYl8tPnR5cGVfID09IDEgJiYgaXQtPm1iXy0+c2tpcF8pIHJldHVybjsKKworICAvLyBBbHdheXMgdHJ5IGZpbHRlciBsZXZlbCAgemVybworICAoKml0LT5sZl9zdGF0c18pW3NdWzBdICs9IEdldE1CU1NJTShpdC0+eXV2X2luXywgaXQtPnl1dl9vdXRfKTsKKworICBmb3IgKGQgPSBkZWx0YV9taW47IGQgPD0gZGVsdGFfbWF4OyBkICs9IHN0ZXBfc2l6ZSkgeworICAgIGNvbnN0IGludCBsZXZlbCA9IGxldmVsMCArIGQ7CisgICAgaWYgKGxldmVsIDw9IDAgfHwgbGV2ZWwgPj0gTUFYX0xGX0xFVkVMUykgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIERvRmlsdGVyKGl0LCBsZXZlbCk7CisgICAgKCppdC0+bGZfc3RhdHNfKVtzXVtsZXZlbF0gKz0gR2V0TUJTU0lNKGl0LT55dXZfaW5fLCBpdC0+eXV2X291dDJfKTsKKyAgfQorI2Vsc2UgIC8vIGRlZmluZWQoV0VCUF9SRURVQ0VfU0laRSkKKyAgKHZvaWQpaXQ7CisjZW5kaWYgIC8vICFkZWZpbmVkKFdFQlBfUkVEVUNFX1NJWkUpCit9CisKK3ZvaWQgVlA4QWRqdXN0RmlsdGVyU3RyZW5ndGgoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KSB7CisgIFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOworI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX1NJWkUpCisgIGlmIChpdC0+bGZfc3RhdHNfICE9IE5VTEwpIHsKKyAgICBpbnQgczsKKyAgICBmb3IgKHMgPSAwOyBzIDwgTlVNX01CX1NFR01FTlRTOyBzKyspIHsKKyAgICAgIGludCBpLCBiZXN0X2xldmVsID0gMDsKKyAgICAgIC8vIEltcHJvdmVtZW50IG92ZXIgZmlsdGVyIGxldmVsIDAgc2hvdWxkIGJlIGF0IGxlYXN0IDFlLTUgKHJlbGF0aXZlbHkpCisgICAgICBkb3VibGUgYmVzdF92ID0gMS4wMDAwMSAqICgqaXQtPmxmX3N0YXRzXylbc11bMF07CisgICAgICBmb3IgKGkgPSAxOyBpIDwgTUFYX0xGX0xFVkVMUzsgaSsrKSB7CisgICAgICAgIGNvbnN0IGRvdWJsZSB2ID0gKCppdC0+bGZfc3RhdHNfKVtzXVtpXTsKKyAgICAgICAgaWYgKHYgPiBiZXN0X3YpIHsKKyAgICAgICAgICBiZXN0X3YgPSB2OworICAgICAgICAgIGJlc3RfbGV2ZWwgPSBpOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbmMtPmRxbV9bc10uZnN0cmVuZ3RoXyA9IGJlc3RfbGV2ZWw7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorI2VuZGlmICAvLyAhZGVmaW5lZChXRUJQX1JFRFVDRV9TSVpFKQorICBpZiAoZW5jLT5jb25maWdfLT5maWx0ZXJfc3RyZW5ndGggPiAwKSB7CisgICAgaW50IG1heF9sZXZlbCA9IDA7CisgICAgaW50IHM7CisgICAgZm9yIChzID0gMDsgcyA8IE5VTV9NQl9TRUdNRU5UUzsgcysrKSB7CisgICAgICBWUDhTZWdtZW50SW5mbyogY29uc3QgZHFtID0gJmVuYy0+ZHFtX1tzXTsKKyAgICAgIC8vIHRoaXMgJz4+IDMnIGFjY291bnRzIGZvciBzb21lIGludmVyc2UgV0hUIHNjYWxpbmcKKyAgICAgIGNvbnN0IGludCBkZWx0YSA9IChkcW0tPm1heF9lZGdlXyAqIGRxbS0+eTJfLnFfWzFdKSA+PiAzOworICAgICAgY29uc3QgaW50IGxldmVsID0KKyAgICAgICAgICBWUDhGaWx0ZXJTdHJlbmd0aEZyb21EZWx0YShlbmMtPmZpbHRlcl9oZHJfLnNoYXJwbmVzc18sIGRlbHRhKTsKKyAgICAgIGlmIChsZXZlbCA+IGRxbS0+ZnN0cmVuZ3RoXykgeworICAgICAgICBkcW0tPmZzdHJlbmd0aF8gPSBsZXZlbDsKKyAgICAgIH0KKyAgICAgIGlmIChtYXhfbGV2ZWwgPCBkcW0tPmZzdHJlbmd0aF8pIHsKKyAgICAgICAgbWF4X2xldmVsID0gZHFtLT5mc3RyZW5ndGhfOworICAgICAgfQorICAgIH0KKyAgICBlbmMtPmZpbHRlcl9oZHJfLmxldmVsXyA9IG1heF9sZXZlbDsKKyAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9mcmFtZV9lbmMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvZnJhbWVfZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM3NjNiZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvZnJhbWVfZW5jLmMKQEAgLTAsMCArMSw4OTYgQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIGZyYW1lIGNvZGluZyBhbmQgYW5hbHlzaXMKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vYXNzZXJ0X3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9tYXRoX3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdfcG9lbS5oIgorI2Vsc2UKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjZW5kaWYKKworI2luY2x1ZGUgInNyYy9lbmMvY29zdF9lbmMuaCIKKyNpbmNsdWRlICJzcmMvZW5jL3ZwOGlfZW5jLmgiCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKyNpbmNsdWRlICJzcmMvd2VicC9mb3JtYXRfY29uc3RhbnRzLmgiICAvLyBSSUZGIGNvbnN0YW50cworCisjZGVmaW5lIFNFR01FTlRfVklTVSAwCisjZGVmaW5lIERFQlVHX1NFQVJDSCAwICAgIC8vIHVzZWZ1bCB0byB0cmFjayBzZWFyY2ggY29udmVyZ2VuY2UKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG11bHRpLXBhc3MgY29udmVyZ2VuY2UKKworI2RlZmluZSBIRUFERVJfU0laRV9FU1RJTUFURSAoUklGRl9IRUFERVJfU0laRSArIENIVU5LX0hFQURFUl9TSVpFICsgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOF9GUkFNRV9IRUFERVJfU0laRSkKKyNkZWZpbmUgRFFfTElNSVQgMC40ICAvLyBjb252ZXJnZW5jZSBpcyBjb25zaWRlcmVkIHJlYWNoZWQgaWYgZHEgPCBEUV9MSU1JVAorLy8gd2UgYWxsb3cgMmsgb2YgZXh0cmEgaGVhZC1yb29tIGluIFBBUlRJVElPTjAgbGltaXQuCisjZGVmaW5lIFBBUlRJVElPTjBfU0laRV9MSU1JVCAoKFZQOF9NQVhfUEFSVElUSU9OMF9TSVpFIC0gMjA0OFVMTCkgPDwgMTEpCisKK3R5cGVkZWYgc3RydWN0IHsgIC8vIHN0cnVjdCBmb3Igb3JnYW5pemluZyBjb252ZXJnZW5jZSBpbiBlaXRoZXIgc2l6ZSBvciBQU05SCisgIGludCBpc19maXJzdDsKKyAgZmxvYXQgZHE7CisgIGZsb2F0IHEsIGxhc3RfcTsKKyAgZG91YmxlIHZhbHVlLCBsYXN0X3ZhbHVlOyAgIC8vIFBTTlIgb3Igc2l6ZQorICBkb3VibGUgdGFyZ2V0OworICBpbnQgZG9fc2l6ZV9zZWFyY2g7Cit9IFBhc3NTdGF0czsKKworc3RhdGljIGludCBJbml0UGFzc1N0YXRzKGNvbnN0IFZQOEVuY29kZXIqIGNvbnN0IGVuYywgUGFzc1N0YXRzKiBjb25zdCBzKSB7CisgIGNvbnN0IHVpbnQ2NF90IHRhcmdldF9zaXplID0gKHVpbnQ2NF90KWVuYy0+Y29uZmlnXy0+dGFyZ2V0X3NpemU7CisgIGNvbnN0IGludCBkb19zaXplX3NlYXJjaCA9ICh0YXJnZXRfc2l6ZSAhPSAwKTsKKyAgY29uc3QgZmxvYXQgdGFyZ2V0X1BTTlIgPSBlbmMtPmNvbmZpZ18tPnRhcmdldF9QU05SOworCisgIHMtPmlzX2ZpcnN0ID0gMTsKKyAgcy0+ZHEgPSAxMC5mOworICBzLT5xID0gcy0+bGFzdF9xID0gZW5jLT5jb25maWdfLT5xdWFsaXR5OworICBzLT50YXJnZXQgPSBkb19zaXplX3NlYXJjaCA/IChkb3VibGUpdGFyZ2V0X3NpemUKKyAgICAgICAgICAgIDogKHRhcmdldF9QU05SID4gMC4pID8gdGFyZ2V0X1BTTlIKKyAgICAgICAgICAgIDogNDAuOyAgIC8vIGRlZmF1bHQsIGp1c3QgaW4gY2FzZQorICBzLT52YWx1ZSA9IHMtPmxhc3RfdmFsdWUgPSAwLjsKKyAgcy0+ZG9fc2l6ZV9zZWFyY2ggPSBkb19zaXplX3NlYXJjaDsKKyAgcmV0dXJuIGRvX3NpemVfc2VhcmNoOworfQorCitzdGF0aWMgZmxvYXQgQ2xhbXAoZmxvYXQgdiwgZmxvYXQgbWluLCBmbG9hdCBtYXgpIHsKKyAgcmV0dXJuICh2IDwgbWluKSA/IG1pbiA6ICh2ID4gbWF4KSA/IG1heCA6IHY7Cit9CisKK3N0YXRpYyBmbG9hdCBDb21wdXRlTmV4dFEoUGFzc1N0YXRzKiBjb25zdCBzKSB7CisgIGZsb2F0IGRxOworICBpZiAocy0+aXNfZmlyc3QpIHsKKyAgICBkcSA9IChzLT52YWx1ZSA+IHMtPnRhcmdldCkgPyAtcy0+ZHEgOiBzLT5kcTsKKyAgICBzLT5pc19maXJzdCA9IDA7CisgIH0gZWxzZSBpZiAocy0+dmFsdWUgIT0gcy0+bGFzdF92YWx1ZSkgeworICAgIGNvbnN0IGRvdWJsZSBzbG9wZSA9IChzLT50YXJnZXQgLSBzLT52YWx1ZSkgLyAocy0+bGFzdF92YWx1ZSAtIHMtPnZhbHVlKTsKKyAgICBkcSA9IChmbG9hdCkoc2xvcGUgKiAocy0+bGFzdF9xIC0gcy0+cSkpOworICB9IGVsc2UgeworICAgIGRxID0gMC47ICAvLyB3ZSdyZSBkb25lPyEKKyAgfQorICAvLyBMaW1pdCB2YXJpYWJsZSB0byBhdm9pZCBsYXJnZSBzd2luZ3MuCisgIHMtPmRxID0gQ2xhbXAoZHEsIC0zMC5mLCAzMC5mKTsKKyAgcy0+bGFzdF9xID0gcy0+cTsKKyAgcy0+bGFzdF92YWx1ZSA9IHMtPnZhbHVlOworICBzLT5xID0gQ2xhbXAocy0+cSArIHMtPmRxLCAwLmYsIDEwMC5mKTsKKyAgcmV0dXJuIHMtPnE7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUYWJsZXMgZm9yIGxldmVsIGNvZGluZworCitjb25zdCB1aW50OF90IFZQOENhdDNbXSA9IHsgMTczLCAxNDgsIDE0MCB9OworY29uc3QgdWludDhfdCBWUDhDYXQ0W10gPSB7IDE3NiwgMTU1LCAxNDAsIDEzNSB9OworY29uc3QgdWludDhfdCBWUDhDYXQ1W10gPSB7IDE4MCwgMTU3LCAxNDEsIDEzNCwgMTMwIH07Citjb25zdCB1aW50OF90IFZQOENhdDZbXSA9CisgICAgeyAyNTQsIDI1NCwgMjQzLCAyMzAsIDE5NiwgMTc3LCAxNTMsIDE0MCwgMTMzLCAxMzAsIDEyOSB9OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUmVzZXQgdGhlIHN0YXRpc3RpY3MgYWJvdXQ6IG51bWJlciBvZiBza2lwcywgdG9rZW4gcHJvYmEsIGxldmVsIGNvc3QsLi4uCisKK3N0YXRpYyB2b2lkIFJlc2V0U3RhdHMoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7CisgIFZQOEVuY1Byb2JhKiBjb25zdCBwcm9iYSA9ICZlbmMtPnByb2JhXzsKKyAgVlA4Q2FsY3VsYXRlTGV2ZWxDb3N0cyhwcm9iYSk7CisgIHByb2JhLT5uYl9za2lwXyA9IDA7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTa2lwIGRlY2lzaW9uIHByb2JhYmlsaXR5CisKKyNkZWZpbmUgU0tJUF9QUk9CQV9USFJFU0hPTEQgMjUwICAvLyB2YWx1ZSBiZWxvdyB3aGljaCB1c2luZyBza2lwX3Byb2JhIGlzIE9LLgorCitzdGF0aWMgaW50IENhbGNTa2lwUHJvYmEodWludDY0X3QgbmIsIHVpbnQ2NF90IHRvdGFsKSB7CisgIHJldHVybiAoaW50KSh0b3RhbCA/ICh0b3RhbCAtIG5iKSAqIDI1NSAvIHRvdGFsIDogMjU1KTsKK30KKworLy8gUmV0dXJucyB0aGUgYml0LWNvc3QgZm9yIGNvZGluZyB0aGUgc2tpcCBwcm9iYWJpbGl0eS4KK3N0YXRpYyBpbnQgRmluYWxpemVTa2lwUHJvYmEoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7CisgIFZQOEVuY1Byb2JhKiBjb25zdCBwcm9iYSA9ICZlbmMtPnByb2JhXzsKKyAgY29uc3QgaW50IG5iX21icyA9IGVuYy0+bWJfd18gKiBlbmMtPm1iX2hfOworICBjb25zdCBpbnQgbmJfZXZlbnRzID0gcHJvYmEtPm5iX3NraXBfOworICBpbnQgc2l6ZTsKKyAgcHJvYmEtPnNraXBfcHJvYmFfID0gQ2FsY1NraXBQcm9iYShuYl9ldmVudHMsIG5iX21icyk7CisgIHByb2JhLT51c2Vfc2tpcF9wcm9iYV8gPSAocHJvYmEtPnNraXBfcHJvYmFfIDwgU0tJUF9QUk9CQV9USFJFU0hPTEQpOworICBzaXplID0gMjU2OyAgIC8vICd1c2Vfc2tpcF9wcm9iYScgYml0CisgIGlmIChwcm9iYS0+dXNlX3NraXBfcHJvYmFfKSB7CisgICAgc2l6ZSArPSAgbmJfZXZlbnRzICogVlA4Qml0Q29zdCgxLCBwcm9iYS0+c2tpcF9wcm9iYV8pCisgICAgICAgICArIChuYl9tYnMgLSBuYl9ldmVudHMpICogVlA4Qml0Q29zdCgwLCBwcm9iYS0+c2tpcF9wcm9iYV8pOworICAgIHNpemUgKz0gOCAqIDI1NjsgICAvLyBjb3N0IG9mIHNpZ25hbGluZyB0aGUgc2tpcF9wcm9iYV8gaXRzZWxmLgorICB9CisgIHJldHVybiBzaXplOworfQorCisvLyBDb2xsZWN0IHN0YXRpc3RpY3MgYW5kIGRlZHVjZSBwcm9iYWJpbGl0aWVzIGZvciBuZXh0IGNvZGluZyBwYXNzLgorLy8gUmV0dXJuIHRoZSB0b3RhbCBiaXQtY29zdCBmb3IgY29kaW5nIHRoZSBwcm9iYWJpbGl0eSB1cGRhdGVzLgorc3RhdGljIGludCBDYWxjVG9rZW5Qcm9iYShpbnQgbmIsIGludCB0b3RhbCkgeworICBhc3NlcnQobmIgPD0gdG90YWwpOworICByZXR1cm4gbmIgPyAoMjU1IC0gbmIgKiAyNTUgLyB0b3RhbCkgOiAyNTU7Cit9CisKKy8vIENvc3Qgb2YgY29kaW5nICduYicgMSdzIGFuZCAndG90YWwtbmInIDAncyB1c2luZyAncHJvYmEnIHByb2JhYmlsaXR5Lgorc3RhdGljIGludCBCcmFuY2hDb3N0KGludCBuYiwgaW50IHRvdGFsLCBpbnQgcHJvYmEpIHsKKyAgcmV0dXJuIG5iICogVlA4Qml0Q29zdCgxLCBwcm9iYSkgKyAodG90YWwgLSBuYikgKiBWUDhCaXRDb3N0KDAsIHByb2JhKTsKK30KKworc3RhdGljIHZvaWQgUmVzZXRUb2tlblN0YXRzKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgeworICBWUDhFbmNQcm9iYSogY29uc3QgcHJvYmEgPSAmZW5jLT5wcm9iYV87CisgIG1lbXNldChwcm9iYS0+c3RhdHNfLCAwLCBzaXplb2YocHJvYmEtPnN0YXRzXykpOworfQorCitzdGF0aWMgaW50IEZpbmFsaXplVG9rZW5Qcm9iYXMoVlA4RW5jUHJvYmEqIGNvbnN0IHByb2JhKSB7CisgIGludCBoYXNfY2hhbmdlZCA9IDA7CisgIGludCBzaXplID0gMDsKKyAgaW50IHQsIGIsIGMsIHA7CisgIGZvciAodCA9IDA7IHQgPCBOVU1fVFlQRVM7ICsrdCkgeworICAgIGZvciAoYiA9IDA7IGIgPCBOVU1fQkFORFM7ICsrYikgeworICAgICAgZm9yIChjID0gMDsgYyA8IE5VTV9DVFg7ICsrYykgeworICAgICAgICBmb3IgKHAgPSAwOyBwIDwgTlVNX1BST0JBUzsgKytwKSB7CisgICAgICAgICAgY29uc3QgcHJvYmFfdCBzdGF0cyA9IHByb2JhLT5zdGF0c19bdF1bYl1bY11bcF07CisgICAgICAgICAgY29uc3QgaW50IG5iID0gKHN0YXRzID4+IDApICYgMHhmZmZmOworICAgICAgICAgIGNvbnN0IGludCB0b3RhbCA9IChzdGF0cyA+PiAxNikgJiAweGZmZmY7CisgICAgICAgICAgY29uc3QgaW50IHVwZGF0ZV9wcm9iYSA9IFZQOENvZWZmc1VwZGF0ZVByb2JhW3RdW2JdW2NdW3BdOworICAgICAgICAgIGNvbnN0IGludCBvbGRfcCA9IFZQOENvZWZmc1Byb2JhMFt0XVtiXVtjXVtwXTsKKyAgICAgICAgICBjb25zdCBpbnQgbmV3X3AgPSBDYWxjVG9rZW5Qcm9iYShuYiwgdG90YWwpOworICAgICAgICAgIGNvbnN0IGludCBvbGRfY29zdCA9IEJyYW5jaENvc3QobmIsIHRvdGFsLCBvbGRfcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBWUDhCaXRDb3N0KDAsIHVwZGF0ZV9wcm9iYSk7CisgICAgICAgICAgY29uc3QgaW50IG5ld19jb3N0ID0gQnJhbmNoQ29zdChuYiwgdG90YWwsIG5ld19wKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFZQOEJpdENvc3QoMSwgdXBkYXRlX3Byb2JhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDggKiAyNTY7CisgICAgICAgICAgY29uc3QgaW50IHVzZV9uZXdfcCA9IChvbGRfY29zdCA+IG5ld19jb3N0KTsKKyAgICAgICAgICBzaXplICs9IFZQOEJpdENvc3QodXNlX25ld19wLCB1cGRhdGVfcHJvYmEpOworICAgICAgICAgIGlmICh1c2VfbmV3X3ApIHsgIC8vIG9ubHkgdXNlIHByb2JhIHRoYXQgc2VlbSBtZWFuaW5nZnVsIGVub3VnaC4KKyAgICAgICAgICAgIHByb2JhLT5jb2VmZnNfW3RdW2JdW2NdW3BdID0gbmV3X3A7CisgICAgICAgICAgICBoYXNfY2hhbmdlZCB8PSAobmV3X3AgIT0gb2xkX3ApOworICAgICAgICAgICAgc2l6ZSArPSA4ICogMjU2OworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcm9iYS0+Y29lZmZzX1t0XVtiXVtjXVtwXSA9IG9sZF9wOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBwcm9iYS0+ZGlydHlfID0gaGFzX2NoYW5nZWQ7CisgIHJldHVybiBzaXplOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRmluYWxpemUgU2VnbWVudCBwcm9iYWJpbGl0eSBiYXNlZCBvbiB0aGUgY29kaW5nIHRyZWUKKworc3RhdGljIGludCBHZXRQcm9iYShpbnQgYSwgaW50IGIpIHsKKyAgY29uc3QgaW50IHRvdGFsID0gYSArIGI7CisgIHJldHVybiAodG90YWwgPT0gMCkgPyAyNTUgICAgIC8vIHRoYXQncyB0aGUgZGVmYXVsdCBwcm9iYWJpbGl0eS4KKyAgICAgICAgICAgICAgICAgICAgICA6ICgyNTUgKiBhICsgdG90YWwgLyAyKSAvIHRvdGFsOyAgLy8gcm91bmRlZCBwcm9iYQorfQorCitzdGF0aWMgdm9pZCBSZXNldFNlZ21lbnRzKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgeworICBpbnQgbjsKKyAgZm9yIChuID0gMDsgbiA8IGVuYy0+bWJfd18gKiBlbmMtPm1iX2hfOyArK24pIHsKKyAgICBlbmMtPm1iX2luZm9fW25dLnNlZ21lbnRfID0gMDsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBTZXRTZWdtZW50UHJvYmFzKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgeworICBpbnQgcFtOVU1fTUJfU0VHTUVOVFNdID0geyAwIH07CisgIGludCBuOworCisgIGZvciAobiA9IDA7IG4gPCBlbmMtPm1iX3dfICogZW5jLT5tYl9oXzsgKytuKSB7CisgICAgY29uc3QgVlA4TUJJbmZvKiBjb25zdCBtYiA9ICZlbmMtPm1iX2luZm9fW25dOworICAgICsrcFttYi0+c2VnbWVudF9dOworICB9CisjaWYgIWRlZmluZWQoV0VCUF9ESVNBQkxFX1NUQVRTKQorICBpZiAoZW5jLT5waWNfLT5zdGF0cyAhPSBOVUxMKSB7CisgICAgZm9yIChuID0gMDsgbiA8IE5VTV9NQl9TRUdNRU5UUzsgKytuKSB7CisgICAgICBlbmMtPnBpY18tPnN0YXRzLT5zZWdtZW50X3NpemVbbl0gPSBwW25dOworICAgIH0KKyAgfQorI2VuZGlmCisgIGlmIChlbmMtPnNlZ21lbnRfaGRyXy5udW1fc2VnbWVudHNfID4gMSkgeworICAgIHVpbnQ4X3QqIGNvbnN0IHByb2JhcyA9IGVuYy0+cHJvYmFfLnNlZ21lbnRzXzsKKyAgICBwcm9iYXNbMF0gPSBHZXRQcm9iYShwWzBdICsgcFsxXSwgcFsyXSArIHBbM10pOworICAgIHByb2Jhc1sxXSA9IEdldFByb2JhKHBbMF0sIHBbMV0pOworICAgIHByb2Jhc1syXSA9IEdldFByb2JhKHBbMl0sIHBbM10pOworCisgICAgZW5jLT5zZWdtZW50X2hkcl8udXBkYXRlX21hcF8gPQorICAgICAgICAocHJvYmFzWzBdICE9IDI1NSkgfHwgKHByb2Jhc1sxXSAhPSAyNTUpIHx8IChwcm9iYXNbMl0gIT0gMjU1KTsKKyAgICBpZiAoIWVuYy0+c2VnbWVudF9oZHJfLnVwZGF0ZV9tYXBfKSBSZXNldFNlZ21lbnRzKGVuYyk7CisgICAgZW5jLT5zZWdtZW50X2hkcl8uc2l6ZV8gPQorICAgICAgICBwWzBdICogKFZQOEJpdENvc3QoMCwgcHJvYmFzWzBdKSArIFZQOEJpdENvc3QoMCwgcHJvYmFzWzFdKSkgKworICAgICAgICBwWzFdICogKFZQOEJpdENvc3QoMCwgcHJvYmFzWzBdKSArIFZQOEJpdENvc3QoMSwgcHJvYmFzWzFdKSkgKworICAgICAgICBwWzJdICogKFZQOEJpdENvc3QoMSwgcHJvYmFzWzBdKSArIFZQOEJpdENvc3QoMCwgcHJvYmFzWzJdKSkgKworICAgICAgICBwWzNdICogKFZQOEJpdENvc3QoMSwgcHJvYmFzWzBdKSArIFZQOEJpdENvc3QoMSwgcHJvYmFzWzJdKSk7CisgIH0gZWxzZSB7CisgICAgZW5jLT5zZWdtZW50X2hkcl8udXBkYXRlX21hcF8gPSAwOworICAgIGVuYy0+c2VnbWVudF9oZHJfLnNpemVfID0gMDsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29lZmZpY2llbnQgY29kaW5nCisKK3N0YXRpYyBpbnQgUHV0Q29lZmZzKFZQOEJpdFdyaXRlciogY29uc3QgYncsIGludCBjdHgsIGNvbnN0IFZQOFJlc2lkdWFsKiByZXMpIHsKKyAgaW50IG4gPSByZXMtPmZpcnN0OworICAvLyBzaG91bGQgYmUgcHJvYltWUDhFbmNCYW5kc1tuXV0sIGJ1dCBpdCdzIGVxdWl2YWxlbnQgZm9yIG49MCBvciAxCisgIGNvbnN0IHVpbnQ4X3QqIHAgPSByZXMtPnByb2Jbbl1bY3R4XTsKKyAgaWYgKCFWUDhQdXRCaXQoYncsIHJlcy0+bGFzdCA+PSAwLCBwWzBdKSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgd2hpbGUgKG4gPCAxNikgeworICAgIGNvbnN0IGludCBjID0gcmVzLT5jb2VmZnNbbisrXTsKKyAgICBjb25zdCBpbnQgc2lnbiA9IGMgPCAwOworICAgIGludCB2ID0gc2lnbiA/IC1jIDogYzsKKyAgICBpZiAoIVZQOFB1dEJpdChidywgdiAhPSAwLCBwWzFdKSkgeworICAgICAgcCA9IHJlcy0+cHJvYltWUDhFbmNCYW5kc1tuXV1bMF07CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKCFWUDhQdXRCaXQoYncsIHYgPiAxLCBwWzJdKSkgeworICAgICAgcCA9IHJlcy0+cHJvYltWUDhFbmNCYW5kc1tuXV1bMV07CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICghVlA4UHV0Qml0KGJ3LCB2ID4gNCwgcFszXSkpIHsKKyAgICAgICAgaWYgKFZQOFB1dEJpdChidywgdiAhPSAyLCBwWzRdKSkgeworICAgICAgICAgIFZQOFB1dEJpdChidywgdiA9PSA0LCBwWzVdKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmICghVlA4UHV0Qml0KGJ3LCB2ID4gMTAsIHBbNl0pKSB7CisgICAgICAgIGlmICghVlA4UHV0Qml0KGJ3LCB2ID4gNiwgcFs3XSkpIHsKKyAgICAgICAgICBWUDhQdXRCaXQoYncsIHYgPT0gNiwgMTU5KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBWUDhQdXRCaXQoYncsIHYgPj0gOSwgMTY1KTsKKyAgICAgICAgICBWUDhQdXRCaXQoYncsICEodiAmIDEpLCAxNDUpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnQgbWFzazsKKyAgICAgICAgY29uc3QgdWludDhfdCogdGFiOworICAgICAgICBpZiAodiA8IDMgKyAoOCA8PCAxKSkgeyAgICAgICAgICAvLyBWUDhDYXQzICAoM2IpCisgICAgICAgICAgVlA4UHV0Qml0KGJ3LCAwLCBwWzhdKTsKKyAgICAgICAgICBWUDhQdXRCaXQoYncsIDAsIHBbOV0pOworICAgICAgICAgIHYgLT0gMyArICg4IDw8IDApOworICAgICAgICAgIG1hc2sgPSAxIDw8IDI7CisgICAgICAgICAgdGFiID0gVlA4Q2F0MzsKKyAgICAgICAgfSBlbHNlIGlmICh2IDwgMyArICg4IDw8IDIpKSB7ICAgLy8gVlA4Q2F0NCAgKDRiKQorICAgICAgICAgIFZQOFB1dEJpdChidywgMCwgcFs4XSk7CisgICAgICAgICAgVlA4UHV0Qml0KGJ3LCAxLCBwWzldKTsKKyAgICAgICAgICB2IC09IDMgKyAoOCA8PCAxKTsKKyAgICAgICAgICBtYXNrID0gMSA8PCAzOworICAgICAgICAgIHRhYiA9IFZQOENhdDQ7CisgICAgICAgIH0gZWxzZSBpZiAodiA8IDMgKyAoOCA8PCAzKSkgeyAgIC8vIFZQOENhdDUgICg1YikKKyAgICAgICAgICBWUDhQdXRCaXQoYncsIDEsIHBbOF0pOworICAgICAgICAgIFZQOFB1dEJpdChidywgMCwgcFsxMF0pOworICAgICAgICAgIHYgLT0gMyArICg4IDw8IDIpOworICAgICAgICAgIG1hc2sgPSAxIDw8IDQ7CisgICAgICAgICAgdGFiID0gVlA4Q2F0NTsKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVlA4Q2F0NiAoMTFiKQorICAgICAgICAgIFZQOFB1dEJpdChidywgMSwgcFs4XSk7CisgICAgICAgICAgVlA4UHV0Qml0KGJ3LCAxLCBwWzEwXSk7CisgICAgICAgICAgdiAtPSAzICsgKDggPDwgMyk7CisgICAgICAgICAgbWFzayA9IDEgPDwgMTA7CisgICAgICAgICAgdGFiID0gVlA4Q2F0NjsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAobWFzaykgeworICAgICAgICAgIFZQOFB1dEJpdChidywgISEodiAmIG1hc2spLCAqdGFiKyspOworICAgICAgICAgIG1hc2sgPj49IDE7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHAgPSByZXMtPnByb2JbVlA4RW5jQmFuZHNbbl1dWzJdOworICAgIH0KKyAgICBWUDhQdXRCaXRVbmlmb3JtKGJ3LCBzaWduKTsKKyAgICBpZiAobiA9PSAxNiB8fCAhVlA4UHV0Qml0KGJ3LCBuIDw9IHJlcy0+bGFzdCwgcFswXSkpIHsKKyAgICAgIHJldHVybiAxOyAgIC8vIEVPQgorICAgIH0KKyAgfQorICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgQ29kZVJlc2lkdWFscyhWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LCBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOE1vZGVTY29yZSogY29uc3QgcmQpIHsKKyAgaW50IHgsIHksIGNoOworICBWUDhSZXNpZHVhbCByZXM7CisgIHVpbnQ2NF90IHBvczEsIHBvczIsIHBvczM7CisgIGNvbnN0IGludCBpMTYgPSAoaXQtPm1iXy0+dHlwZV8gPT0gMSk7CisgIGNvbnN0IGludCBzZWdtZW50ID0gaXQtPm1iXy0+c2VnbWVudF87CisgIFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOworCisgIFZQOEl0ZXJhdG9yTnpUb0J5dGVzKGl0KTsKKworICBwb3MxID0gVlA4Qml0V3JpdGVyUG9zKGJ3KTsKKyAgaWYgKGkxNikgeworICAgIFZQOEluaXRSZXNpZHVhbCgwLCAxLCBlbmMsICZyZXMpOworICAgIFZQOFNldFJlc2lkdWFsQ29lZmZzKHJkLT55X2RjX2xldmVscywgJnJlcyk7CisgICAgaXQtPnRvcF9uel9bOF0gPSBpdC0+bGVmdF9uel9bOF0gPQorICAgICAgUHV0Q29lZmZzKGJ3LCBpdC0+dG9wX256X1s4XSArIGl0LT5sZWZ0X256X1s4XSwgJnJlcyk7CisgICAgVlA4SW5pdFJlc2lkdWFsKDEsIDAsIGVuYywgJnJlcyk7CisgIH0gZWxzZSB7CisgICAgVlA4SW5pdFJlc2lkdWFsKDAsIDMsIGVuYywgJnJlcyk7CisgIH0KKworICAvLyBsdW1hLUFDCisgIGZvciAoeSA9IDA7IHkgPCA0OyArK3kpIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgNDsgKyt4KSB7CisgICAgICBjb25zdCBpbnQgY3R4ID0gaXQtPnRvcF9uel9beF0gKyBpdC0+bGVmdF9uel9beV07CisgICAgICBWUDhTZXRSZXNpZHVhbENvZWZmcyhyZC0+eV9hY19sZXZlbHNbeCArIHkgKiA0XSwgJnJlcyk7CisgICAgICBpdC0+dG9wX256X1t4XSA9IGl0LT5sZWZ0X256X1t5XSA9IFB1dENvZWZmcyhidywgY3R4LCAmcmVzKTsKKyAgICB9CisgIH0KKyAgcG9zMiA9IFZQOEJpdFdyaXRlclBvcyhidyk7CisKKyAgLy8gVS9WCisgIFZQOEluaXRSZXNpZHVhbCgwLCAyLCBlbmMsICZyZXMpOworICBmb3IgKGNoID0gMDsgY2ggPD0gMjsgY2ggKz0gMikgeworICAgIGZvciAoeSA9IDA7IHkgPCAyOyArK3kpIHsKKyAgICAgIGZvciAoeCA9IDA7IHggPCAyOyArK3gpIHsKKyAgICAgICAgY29uc3QgaW50IGN0eCA9IGl0LT50b3BfbnpfWzQgKyBjaCArIHhdICsgaXQtPmxlZnRfbnpfWzQgKyBjaCArIHldOworICAgICAgICBWUDhTZXRSZXNpZHVhbENvZWZmcyhyZC0+dXZfbGV2ZWxzW2NoICogMiArIHggKyB5ICogMl0sICZyZXMpOworICAgICAgICBpdC0+dG9wX256X1s0ICsgY2ggKyB4XSA9IGl0LT5sZWZ0X256X1s0ICsgY2ggKyB5XSA9CisgICAgICAgICAgICBQdXRDb2VmZnMoYncsIGN0eCwgJnJlcyk7CisgICAgICB9CisgICAgfQorICB9CisgIHBvczMgPSBWUDhCaXRXcml0ZXJQb3MoYncpOworICBpdC0+bHVtYV9iaXRzXyA9IHBvczIgLSBwb3MxOworICBpdC0+dXZfYml0c18gPSBwb3MzIC0gcG9zMjsKKyAgaXQtPmJpdF9jb3VudF9bc2VnbWVudF1baTE2XSArPSBpdC0+bHVtYV9iaXRzXzsKKyAgaXQtPmJpdF9jb3VudF9bc2VnbWVudF1bMl0gKz0gaXQtPnV2X2JpdHNfOworICBWUDhJdGVyYXRvckJ5dGVzVG9OeihpdCk7Cit9CisKKy8vIFNhbWUgYXMgQ29kZVJlc2lkdWFscywgYnV0IGRvZXNuJ3QgYWN0dWFsbHkgd3JpdGUgYW55dGhpbmcuCisvLyBJbnN0ZWFkLCBpdCBqdXN0IHJlY29yZHMgdGhlIGV2ZW50IGRpc3RyaWJ1dGlvbi4KK3N0YXRpYyB2b2lkIFJlY29yZFJlc2lkdWFscyhWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TW9kZVNjb3JlKiBjb25zdCByZCkgeworICBpbnQgeCwgeSwgY2g7CisgIFZQOFJlc2lkdWFsIHJlczsKKyAgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187CisKKyAgVlA4SXRlcmF0b3JOelRvQnl0ZXMoaXQpOworCisgIGlmIChpdC0+bWJfLT50eXBlXyA9PSAxKSB7ICAgLy8gaTE2eDE2CisgICAgVlA4SW5pdFJlc2lkdWFsKDAsIDEsIGVuYywgJnJlcyk7CisgICAgVlA4U2V0UmVzaWR1YWxDb2VmZnMocmQtPnlfZGNfbGV2ZWxzLCAmcmVzKTsKKyAgICBpdC0+dG9wX256X1s4XSA9IGl0LT5sZWZ0X256X1s4XSA9CisgICAgICBWUDhSZWNvcmRDb2VmZnMoaXQtPnRvcF9uel9bOF0gKyBpdC0+bGVmdF9uel9bOF0sICZyZXMpOworICAgIFZQOEluaXRSZXNpZHVhbCgxLCAwLCBlbmMsICZyZXMpOworICB9IGVsc2UgeworICAgIFZQOEluaXRSZXNpZHVhbCgwLCAzLCBlbmMsICZyZXMpOworICB9CisKKyAgLy8gbHVtYS1BQworICBmb3IgKHkgPSAwOyB5IDwgNDsgKyt5KSB7CisgICAgZm9yICh4ID0gMDsgeCA8IDQ7ICsreCkgeworICAgICAgY29uc3QgaW50IGN0eCA9IGl0LT50b3BfbnpfW3hdICsgaXQtPmxlZnRfbnpfW3ldOworICAgICAgVlA4U2V0UmVzaWR1YWxDb2VmZnMocmQtPnlfYWNfbGV2ZWxzW3ggKyB5ICogNF0sICZyZXMpOworICAgICAgaXQtPnRvcF9uel9beF0gPSBpdC0+bGVmdF9uel9beV0gPSBWUDhSZWNvcmRDb2VmZnMoY3R4LCAmcmVzKTsKKyAgICB9CisgIH0KKworICAvLyBVL1YKKyAgVlA4SW5pdFJlc2lkdWFsKDAsIDIsIGVuYywgJnJlcyk7CisgIGZvciAoY2ggPSAwOyBjaCA8PSAyOyBjaCArPSAyKSB7CisgICAgZm9yICh5ID0gMDsgeSA8IDI7ICsreSkgeworICAgICAgZm9yICh4ID0gMDsgeCA8IDI7ICsreCkgeworICAgICAgICBjb25zdCBpbnQgY3R4ID0gaXQtPnRvcF9uel9bNCArIGNoICsgeF0gKyBpdC0+bGVmdF9uel9bNCArIGNoICsgeV07CisgICAgICAgIFZQOFNldFJlc2lkdWFsQ29lZmZzKHJkLT51dl9sZXZlbHNbY2ggKiAyICsgeCArIHkgKiAyXSwgJnJlcyk7CisgICAgICAgIGl0LT50b3BfbnpfWzQgKyBjaCArIHhdID0gaXQtPmxlZnRfbnpfWzQgKyBjaCArIHldID0KKyAgICAgICAgICAgIFZQOFJlY29yZENvZWZmcyhjdHgsICZyZXMpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIFZQOEl0ZXJhdG9yQnl0ZXNUb056KGl0KTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRva2VuIGJ1ZmZlcgorCisjaWYgIWRlZmluZWQoRElTQUJMRV9UT0tFTl9CVUZGRVIpCisKK3N0YXRpYyBpbnQgUmVjb3JkVG9rZW5zKFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgY29uc3QgVlA4TW9kZVNjb3JlKiBjb25zdCByZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZQOFRCdWZmZXIqIGNvbnN0IHRva2VucykgeworICBpbnQgeCwgeSwgY2g7CisgIFZQOFJlc2lkdWFsIHJlczsKKyAgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187CisKKyAgVlA4SXRlcmF0b3JOelRvQnl0ZXMoaXQpOworICBpZiAoaXQtPm1iXy0+dHlwZV8gPT0gMSkgeyAgIC8vIGkxNngxNgorICAgIGNvbnN0IGludCBjdHggPSBpdC0+dG9wX256X1s4XSArIGl0LT5sZWZ0X256X1s4XTsKKyAgICBWUDhJbml0UmVzaWR1YWwoMCwgMSwgZW5jLCAmcmVzKTsKKyAgICBWUDhTZXRSZXNpZHVhbENvZWZmcyhyZC0+eV9kY19sZXZlbHMsICZyZXMpOworICAgIGl0LT50b3BfbnpfWzhdID0gaXQtPmxlZnRfbnpfWzhdID0KKyAgICAgICAgVlA4UmVjb3JkQ29lZmZUb2tlbnMoY3R4LCAmcmVzLCB0b2tlbnMpOworICAgIFZQOEluaXRSZXNpZHVhbCgxLCAwLCBlbmMsICZyZXMpOworICB9IGVsc2UgeworICAgIFZQOEluaXRSZXNpZHVhbCgwLCAzLCBlbmMsICZyZXMpOworICB9CisKKyAgLy8gbHVtYS1BQworICBmb3IgKHkgPSAwOyB5IDwgNDsgKyt5KSB7CisgICAgZm9yICh4ID0gMDsgeCA8IDQ7ICsreCkgeworICAgICAgY29uc3QgaW50IGN0eCA9IGl0LT50b3BfbnpfW3hdICsgaXQtPmxlZnRfbnpfW3ldOworICAgICAgVlA4U2V0UmVzaWR1YWxDb2VmZnMocmQtPnlfYWNfbGV2ZWxzW3ggKyB5ICogNF0sICZyZXMpOworICAgICAgaXQtPnRvcF9uel9beF0gPSBpdC0+bGVmdF9uel9beV0gPQorICAgICAgICAgIFZQOFJlY29yZENvZWZmVG9rZW5zKGN0eCwgJnJlcywgdG9rZW5zKTsKKyAgICB9CisgIH0KKworICAvLyBVL1YKKyAgVlA4SW5pdFJlc2lkdWFsKDAsIDIsIGVuYywgJnJlcyk7CisgIGZvciAoY2ggPSAwOyBjaCA8PSAyOyBjaCArPSAyKSB7CisgICAgZm9yICh5ID0gMDsgeSA8IDI7ICsreSkgeworICAgICAgZm9yICh4ID0gMDsgeCA8IDI7ICsreCkgeworICAgICAgICBjb25zdCBpbnQgY3R4ID0gaXQtPnRvcF9uel9bNCArIGNoICsgeF0gKyBpdC0+bGVmdF9uel9bNCArIGNoICsgeV07CisgICAgICAgIFZQOFNldFJlc2lkdWFsQ29lZmZzKHJkLT51dl9sZXZlbHNbY2ggKiAyICsgeCArIHkgKiAyXSwgJnJlcyk7CisgICAgICAgIGl0LT50b3BfbnpfWzQgKyBjaCArIHhdID0gaXQtPmxlZnRfbnpfWzQgKyBjaCArIHldID0KKyAgICAgICAgICAgIFZQOFJlY29yZENvZWZmVG9rZW5zKGN0eCwgJnJlcywgdG9rZW5zKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgVlA4SXRlcmF0b3JCeXRlc1RvTnooaXQpOworICByZXR1cm4gIXRva2Vucy0+ZXJyb3JfOworfQorCisjZW5kaWYgICAgLy8gIURJU0FCTEVfVE9LRU5fQlVGRkVSCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFeHRyYUluZm8gbWFwIC8gRGVidWcgZnVuY3Rpb24KKworI2lmICFkZWZpbmVkKFdFQlBfRElTQUJMRV9TVEFUUykKKworI2lmIFNFR01FTlRfVklTVQorc3RhdGljIHZvaWQgU2V0QmxvY2sodWludDhfdCogcCwgaW50IHZhbHVlLCBpbnQgc2l6ZSkgeworICBpbnQgeTsKKyAgZm9yICh5ID0gMDsgeSA8IHNpemU7ICsreSkgeworICAgIG1lbXNldChwLCB2YWx1ZSwgc2l6ZSk7CisgICAgcCArPSBCUFM7CisgIH0KK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBSZXNldFNTRShWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgZW5jLT5zc2VfWzBdID0gMDsKKyAgZW5jLT5zc2VfWzFdID0gMDsKKyAgZW5jLT5zc2VfWzJdID0gMDsKKyAgLy8gTm90ZTogZW5jLT5zc2VfWzNdIGlzIG1hbmFnZWQgYnkgYWxwaGEuYworICBlbmMtPnNzZV9jb3VudF8gPSAwOworfQorCitzdGF0aWMgdm9pZCBTdG9yZVNTRShjb25zdCBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKKyAgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGluID0gaXQtPnl1dl9pbl87CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IG91dCA9IGl0LT55dXZfb3V0XzsKKyAgLy8gTm90ZTogbm90IHRvdGFsbHkgYWNjdXJhdGUgYXQgYm91bmRhcnkuIEFuZCBkb2Vzbid0IGluY2x1ZGUgaW4tbG9vcCBmaWx0ZXIuCisgIGVuYy0+c3NlX1swXSArPSBWUDhTU0UxNngxNihpbiArIFlfT0ZGX0VOQywgb3V0ICsgWV9PRkZfRU5DKTsKKyAgZW5jLT5zc2VfWzFdICs9IFZQOFNTRTh4OChpbiArIFVfT0ZGX0VOQywgb3V0ICsgVV9PRkZfRU5DKTsKKyAgZW5jLT5zc2VfWzJdICs9IFZQOFNTRTh4OChpbiArIFZfT0ZGX0VOQywgb3V0ICsgVl9PRkZfRU5DKTsKKyAgZW5jLT5zc2VfY291bnRfICs9IDE2ICogMTY7Cit9CisKK3N0YXRpYyB2b2lkIFN0b3JlU2lkZUluZm8oY29uc3QgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KSB7CisgIFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOworICBjb25zdCBWUDhNQkluZm8qIGNvbnN0IG1iID0gaXQtPm1iXzsKKyAgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYyA9IGVuYy0+cGljXzsKKworICBpZiAocGljLT5zdGF0cyAhPSBOVUxMKSB7CisgICAgU3RvcmVTU0UoaXQpOworICAgIGVuYy0+YmxvY2tfY291bnRfWzBdICs9IChtYi0+dHlwZV8gPT0gMCk7CisgICAgZW5jLT5ibG9ja19jb3VudF9bMV0gKz0gKG1iLT50eXBlXyA9PSAxKTsKKyAgICBlbmMtPmJsb2NrX2NvdW50X1syXSArPSAobWItPnNraXBfICE9IDApOworICB9CisKKyAgaWYgKHBpYy0+ZXh0cmFfaW5mbyAhPSBOVUxMKSB7CisgICAgdWludDhfdCogY29uc3QgaW5mbyA9ICZwaWMtPmV4dHJhX2luZm9baXQtPnhfICsgaXQtPnlfICogZW5jLT5tYl93X107CisgICAgc3dpdGNoIChwaWMtPmV4dHJhX2luZm9fdHlwZSkgeworICAgICAgY2FzZSAxOiAqaW5mbyA9IG1iLT50eXBlXzsgYnJlYWs7CisgICAgICBjYXNlIDI6ICppbmZvID0gbWItPnNlZ21lbnRfOyBicmVhazsKKyAgICAgIGNhc2UgMzogKmluZm8gPSBlbmMtPmRxbV9bbWItPnNlZ21lbnRfXS5xdWFudF87IGJyZWFrOworICAgICAgY2FzZSA0OiAqaW5mbyA9IChtYi0+dHlwZV8gPT0gMSkgPyBpdC0+cHJlZHNfWzBdIDogMHhmZjsgYnJlYWs7CisgICAgICBjYXNlIDU6ICppbmZvID0gbWItPnV2X21vZGVfOyBicmVhazsKKyAgICAgIGNhc2UgNjogeworICAgICAgICBjb25zdCBpbnQgYiA9IChpbnQpKChpdC0+bHVtYV9iaXRzXyArIGl0LT51dl9iaXRzXyArIDcpID4+IDMpOworICAgICAgICAqaW5mbyA9IChiID4gMjU1KSA/IDI1NSA6IGI7IGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSA3OiAqaW5mbyA9IG1iLT5hbHBoYV87IGJyZWFrOworICAgICAgZGVmYXVsdDogKmluZm8gPSAwOyBicmVhazsKKyAgICB9CisgIH0KKyNpZiBTRUdNRU5UX1ZJU1UgIC8vIHZpc3VhbGl6ZSBzZWdtZW50cyBhbmQgcHJlZGljdGlvbiBtb2RlcworICBTZXRCbG9jayhpdC0+eXV2X291dF8gKyBZX09GRl9FTkMsIG1iLT5zZWdtZW50XyAqIDY0LCAxNik7CisgIFNldEJsb2NrKGl0LT55dXZfb3V0XyArIFVfT0ZGX0VOQywgaXQtPnByZWRzX1swXSAqIDY0LCA4KTsKKyAgU2V0QmxvY2soaXQtPnl1dl9vdXRfICsgVl9PRkZfRU5DLCBtYi0+dXZfbW9kZV8gKiA2NCwgOCk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgUmVzZXRTaWRlSW5mbyhjb25zdCBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKKyAgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187CisgIFdlYlBQaWN0dXJlKiBjb25zdCBwaWMgPSBlbmMtPnBpY187CisgIGlmIChwaWMtPnN0YXRzICE9IE5VTEwpIHsKKyAgICBtZW1zZXQoZW5jLT5ibG9ja19jb3VudF8sIDAsIHNpemVvZihlbmMtPmJsb2NrX2NvdW50XykpOworICB9CisgIFJlc2V0U1NFKGVuYyk7Cit9CisjZWxzZSAgLy8gZGVmaW5lZChXRUJQX0RJU0FCTEVfU1RBVFMpCitzdGF0aWMgdm9pZCBSZXNldFNTRShWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgKHZvaWQpZW5jOworfQorc3RhdGljIHZvaWQgU3RvcmVTaWRlSW5mbyhjb25zdCBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKKyAgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187CisgIFdlYlBQaWN0dXJlKiBjb25zdCBwaWMgPSBlbmMtPnBpY187CisgIGlmIChwaWMtPmV4dHJhX2luZm8gIT0gTlVMTCkgeworICAgIGlmIChpdC0+eF8gPT0gMCAmJiBpdC0+eV8gPT0gMCkgeyAgIC8vIG9ubHkgZG8gaXQgb25jZSwgYXQgc3RhcnQKKyAgICAgIG1lbXNldChwaWMtPmV4dHJhX2luZm8sIDAsCisgICAgICAgICAgICAgZW5jLT5tYl93XyAqIGVuYy0+bWJfaF8gKiBzaXplb2YoKnBpYy0+ZXh0cmFfaW5mbykpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBSZXNldFNpZGVJbmZvKGNvbnN0IFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCkgeworICAodm9pZClpdDsKK30KKyNlbmRpZiAgLy8gIWRlZmluZWQoV0VCUF9ESVNBQkxFX1NUQVRTKQorCitzdGF0aWMgZG91YmxlIEdldFBTTlIodWludDY0X3QgbXNlLCB1aW50NjRfdCBzaXplKSB7CisgIHJldHVybiAobXNlID4gMCAmJiBzaXplID4gMCkgPyAxMC4gKiBsb2cxMCgyNTUuICogMjU1LiAqIHNpemUgLyBtc2UpIDogOTk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgU3RhdExvb3AoKTogb25seSBjb2xsZWN0IHN0YXRpc3RpY3MgKG51bWJlciBvZiBza2lwcywgdG9rZW4gdXNhZ2UsIC4uLikuCisvLyAgVGhpcyBpcyB1c2VkIGZvciBkZWNpZGluZyBvcHRpbWFsIHByb2JhYmlsaXRpZXMuIEl0IGFsc28gbW9kaWZpZXMgdGhlCisvLyAgcXVhbnRpemVyIHZhbHVlIGlmIHNvbWUgdGFyZ2V0IChzaXplLCBQU05SKSB3YXMgc3BlY2lmaWVkLgorCitzdGF0aWMgdm9pZCBTZXRMb29wUGFyYW1zKFZQOEVuY29kZXIqIGNvbnN0IGVuYywgZmxvYXQgcSkgeworICAvLyBNYWtlIHN1cmUgdGhlIHF1YWxpdHkgcGFyYW1ldGVyIGlzIGluc2lkZSB2YWxpZCBib3VuZHMKKyAgcSA9IENsYW1wKHEsIDAuZiwgMTAwLmYpOworCisgIFZQOFNldFNlZ21lbnRQYXJhbXMoZW5jLCBxKTsgICAgICAvLyBzZXR1cCBzZWdtZW50IHF1YW50aXphdGlvbnMgYW5kIGZpbHRlcnMKKyAgU2V0U2VnbWVudFByb2JhcyhlbmMpOyAgICAgICAgICAgIC8vIGNvbXB1dGUgc2VnbWVudCBwcm9iYWJpbGl0aWVzCisKKyAgUmVzZXRTdGF0cyhlbmMpOworICBSZXNldFNTRShlbmMpOworfQorCitzdGF0aWMgdWludDY0X3QgT25lU3RhdFBhc3MoVlA4RW5jb2RlciogY29uc3QgZW5jLCBWUDhSRExldmVsIHJkX29wdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmJfbWJzLCBpbnQgcGVyY2VudF9kZWx0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXNzU3RhdHMqIGNvbnN0IHMpIHsKKyAgVlA4RW5jSXRlcmF0b3IgaXQ7CisgIHVpbnQ2NF90IHNpemUgPSAwOworICB1aW50NjRfdCBzaXplX3AwID0gMDsKKyAgdWludDY0X3QgZGlzdG9ydGlvbiA9IDA7CisgIGNvbnN0IHVpbnQ2NF90IHBpeGVsX2NvdW50ID0gbmJfbWJzICogMzg0OworCisgIFZQOEl0ZXJhdG9ySW5pdChlbmMsICZpdCk7CisgIFNldExvb3BQYXJhbXMoZW5jLCBzLT5xKTsKKyAgZG8geworICAgIFZQOE1vZGVTY29yZSBpbmZvOworICAgIFZQOEl0ZXJhdG9ySW1wb3J0KCZpdCwgTlVMTCk7CisgICAgaWYgKFZQOERlY2ltYXRlKCZpdCwgJmluZm8sIHJkX29wdCkpIHsKKyAgICAgIC8vIEp1c3QgcmVjb3JkIHRoZSBudW1iZXIgb2Ygc2tpcHMgYW5kIGFjdCBsaWtlIHNraXBfcHJvYmEgaXMgbm90IHVzZWQuCisgICAgICArK2VuYy0+cHJvYmFfLm5iX3NraXBfOworICAgIH0KKyAgICBSZWNvcmRSZXNpZHVhbHMoJml0LCAmaW5mbyk7CisgICAgc2l6ZSArPSBpbmZvLlIgKyBpbmZvLkg7CisgICAgc2l6ZV9wMCArPSBpbmZvLkg7CisgICAgZGlzdG9ydGlvbiArPSBpbmZvLkQ7CisgICAgaWYgKHBlcmNlbnRfZGVsdGEgJiYgIVZQOEl0ZXJhdG9yUHJvZ3Jlc3MoJml0LCBwZXJjZW50X2RlbHRhKSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIFZQOEl0ZXJhdG9yU2F2ZUJvdW5kYXJ5KCZpdCk7CisgIH0gd2hpbGUgKFZQOEl0ZXJhdG9yTmV4dCgmaXQpICYmIC0tbmJfbWJzID4gMCk7CisKKyAgc2l6ZV9wMCArPSBlbmMtPnNlZ21lbnRfaGRyXy5zaXplXzsKKyAgaWYgKHMtPmRvX3NpemVfc2VhcmNoKSB7CisgICAgc2l6ZSArPSBGaW5hbGl6ZVNraXBQcm9iYShlbmMpOworICAgIHNpemUgKz0gRmluYWxpemVUb2tlblByb2JhcygmZW5jLT5wcm9iYV8pOworICAgIHNpemUgPSAoKHNpemUgKyBzaXplX3AwICsgMTAyNCkgPj4gMTEpICsgSEVBREVSX1NJWkVfRVNUSU1BVEU7CisgICAgcy0+dmFsdWUgPSAoZG91YmxlKXNpemU7CisgIH0gZWxzZSB7CisgICAgcy0+dmFsdWUgPSBHZXRQU05SKGRpc3RvcnRpb24sIHBpeGVsX2NvdW50KTsKKyAgfQorICByZXR1cm4gc2l6ZV9wMDsKK30KKworc3RhdGljIGludCBTdGF0TG9vcChWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgY29uc3QgaW50IG1ldGhvZCA9IGVuYy0+bWV0aG9kXzsKKyAgY29uc3QgaW50IGRvX3NlYXJjaCA9IGVuYy0+ZG9fc2VhcmNoXzsKKyAgY29uc3QgaW50IGZhc3RfcHJvYmUgPSAoKG1ldGhvZCA9PSAwIHx8IG1ldGhvZCA9PSAzKSAmJiAhZG9fc2VhcmNoKTsKKyAgaW50IG51bV9wYXNzX2xlZnQgPSBlbmMtPmNvbmZpZ18tPnBhc3M7CisgIGNvbnN0IGludCB0YXNrX3BlcmNlbnQgPSAyMDsKKyAgY29uc3QgaW50IHBlcmNlbnRfcGVyX3Bhc3MgPQorICAgICAgKHRhc2tfcGVyY2VudCArIG51bV9wYXNzX2xlZnQgLyAyKSAvIG51bV9wYXNzX2xlZnQ7CisgIGNvbnN0IGludCBmaW5hbF9wZXJjZW50ID0gZW5jLT5wZXJjZW50XyArIHRhc2tfcGVyY2VudDsKKyAgY29uc3QgVlA4UkRMZXZlbCByZF9vcHQgPQorICAgICAgKG1ldGhvZCA+PSAzIHx8IGRvX3NlYXJjaCkgPyBSRF9PUFRfQkFTSUMgOiBSRF9PUFRfTk9ORTsKKyAgaW50IG5iX21icyA9IGVuYy0+bWJfd18gKiBlbmMtPm1iX2hfOworICBQYXNzU3RhdHMgc3RhdHM7CisKKyAgSW5pdFBhc3NTdGF0cyhlbmMsICZzdGF0cyk7CisgIFJlc2V0VG9rZW5TdGF0cyhlbmMpOworCisgIC8vIEZhc3QgbW9kZTogcXVpY2sgYW5hbHlzaXMgcGFzcyBvdmVyIGZldyBtYnMuIEJldHRlciB0aGFuIG5vdGhpbmcuCisgIGlmIChmYXN0X3Byb2JlKSB7CisgICAgaWYgKG1ldGhvZCA9PSAzKSB7ICAvLyB3ZSBuZWVkIG1vcmUgc3RhdHMgZm9yIG1ldGhvZCAzIHRvIGJlIHJlbGlhYmxlLgorICAgICAgbmJfbWJzID0gKG5iX21icyA+IDIwMCkgPyBuYl9tYnMgPj4gMSA6IDEwMDsKKyAgICB9IGVsc2UgeworICAgICAgbmJfbWJzID0gKG5iX21icyA+IDIwMCkgPyBuYl9tYnMgPj4gMiA6IDUwOworICAgIH0KKyAgfQorCisgIHdoaWxlIChudW1fcGFzc19sZWZ0LS0gPiAwKSB7CisgICAgY29uc3QgaW50IGlzX2xhc3RfcGFzcyA9IChmYWJzKHN0YXRzLmRxKSA8PSBEUV9MSU1JVCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG51bV9wYXNzX2xlZnQgPT0gMCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVuYy0+bWF4X2k0X2hlYWRlcl9iaXRzXyA9PSAwKTsKKyAgICBjb25zdCB1aW50NjRfdCBzaXplX3AwID0KKyAgICAgICAgT25lU3RhdFBhc3MoZW5jLCByZF9vcHQsIG5iX21icywgcGVyY2VudF9wZXJfcGFzcywgJnN0YXRzKTsKKyAgICBpZiAoc2l6ZV9wMCA9PSAwKSByZXR1cm4gMDsKKyNpZiAoREVCVUdfU0VBUkNIID4gMCkKKyAgICBwcmludGYoIiMlZCB2YWx1ZTolLjFsZiAtPiAlLjFsZiAgIHE6JS4yZiAtPiAlLjJmXG4iLAorICAgICAgICAgICBudW1fcGFzc19sZWZ0LCBzdGF0cy5sYXN0X3ZhbHVlLCBzdGF0cy52YWx1ZSwgc3RhdHMubGFzdF9xLCBzdGF0cy5xKTsKKyNlbmRpZgorICAgIGlmIChlbmMtPm1heF9pNF9oZWFkZXJfYml0c18gPiAwICYmIHNpemVfcDAgPiBQQVJUSVRJT04wX1NJWkVfTElNSVQpIHsKKyAgICAgICsrbnVtX3Bhc3NfbGVmdDsKKyAgICAgIGVuYy0+bWF4X2k0X2hlYWRlcl9iaXRzXyA+Pj0gMTsgIC8vIHN0cmVuZ3RoZW4gaGVhZGVyIGJpdCBsaW1pdGF0aW9uLi4uCisgICAgICBjb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi5hbmQgc3RhcnQgb3ZlcgorICAgIH0KKyAgICBpZiAoaXNfbGFzdF9wYXNzKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgLy8gSWYgbm8gdGFyZ2V0IHNpemU6IGp1c3QgZG8gc2V2ZXJhbCBwYXNzIHdpdGhvdXQgY2hhbmdpbmcgJ3EnCisgICAgaWYgKGRvX3NlYXJjaCkgeworICAgICAgQ29tcHV0ZU5leHRRKCZzdGF0cyk7CisgICAgICBpZiAoZmFicyhzdGF0cy5kcSkgPD0gRFFfTElNSVQpIGJyZWFrOworICAgIH0KKyAgfQorICBpZiAoIWRvX3NlYXJjaCB8fCAhc3RhdHMuZG9fc2l6ZV9zZWFyY2gpIHsKKyAgICAvLyBOZWVkIHRvIGZpbmFsaXplIHByb2JhcyBub3csIHNpbmNlIGl0IHdhc24ndCBkb25lIGR1cmluZyB0aGUgc2VhcmNoLgorICAgIEZpbmFsaXplU2tpcFByb2JhKGVuYyk7CisgICAgRmluYWxpemVUb2tlblByb2JhcygmZW5jLT5wcm9iYV8pOworICB9CisgIFZQOENhbGN1bGF0ZUxldmVsQ29zdHMoJmVuYy0+cHJvYmFfKTsgIC8vIGZpbmFsaXplIGNvc3RzCisgIHJldHVybiBXZWJQUmVwb3J0UHJvZ3Jlc3MoZW5jLT5waWNfLCBmaW5hbF9wZXJjZW50LCAmZW5jLT5wZXJjZW50Xyk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNYWluIGxvb3BzCisvLworCitzdGF0aWMgY29uc3QgdWludDhfdCBrQXZlcmFnZUJ5dGVzUGVyTUJbOF0gPSB7IDUwLCAyNCwgMTYsIDksIDcsIDUsIDMsIDIgfTsKKworc3RhdGljIGludCBQcmVMb29wSW5pdGlhbGl6ZShWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgaW50IHA7CisgIGludCBvayA9IDE7CisgIGNvbnN0IGludCBhdmVyYWdlX2J5dGVzX3Blcl9NQiA9IGtBdmVyYWdlQnl0ZXNQZXJNQltlbmMtPmJhc2VfcXVhbnRfID4+IDRdOworICBjb25zdCBpbnQgYnl0ZXNfcGVyX3BhcnRzID0KKyAgICAgIGVuYy0+bWJfd18gKiBlbmMtPm1iX2hfICogYXZlcmFnZV9ieXRlc19wZXJfTUIgLyBlbmMtPm51bV9wYXJ0c187CisgIC8vIEluaXRpYWxpemUgdGhlIGJpdC13cml0ZXJzCisgIGZvciAocCA9IDA7IG9rICYmIHAgPCBlbmMtPm51bV9wYXJ0c187ICsrcCkgeworICAgIG9rID0gVlA4Qml0V3JpdGVySW5pdChlbmMtPnBhcnRzXyArIHAsIGJ5dGVzX3Blcl9wYXJ0cyk7CisgIH0KKyAgaWYgKCFvaykgeworICAgIFZQOEVuY0ZyZWVCaXRXcml0ZXJzKGVuYyk7ICAvLyBtYWxsb2MgZXJyb3Igb2NjdXJyZWQKKyAgICBXZWJQRW5jb2RpbmdTZXRFcnJvcihlbmMtPnBpY18sIFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWSk7CisgIH0KKyAgcmV0dXJuIG9rOworfQorCitzdGF0aWMgaW50IFBvc3RMb29wRmluYWxpemUoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBpbnQgb2spIHsKKyAgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187CisgIGlmIChvaykgeyAgICAgIC8vIEZpbmFsaXplIHRoZSBwYXJ0aXRpb25zLCBjaGVjayBmb3IgZXh0cmEgZXJyb3JzLgorICAgIGludCBwOworICAgIGZvciAocCA9IDA7IHAgPCBlbmMtPm51bV9wYXJ0c187ICsrcCkgeworICAgICAgVlA4Qml0V3JpdGVyRmluaXNoKGVuYy0+cGFydHNfICsgcCk7CisgICAgICBvayAmPSAhZW5jLT5wYXJ0c19bcF0uZXJyb3JfOworICAgIH0KKyAgfQorCisgIGlmIChvaykgeyAgICAgIC8vIEFsbCBnb29kLiBGaW5pc2ggdXAuCisjaWYgIWRlZmluZWQoV0VCUF9ESVNBQkxFX1NUQVRTKQorICAgIGlmIChlbmMtPnBpY18tPnN0YXRzICE9IE5VTEwpIHsgIC8vIGZpbmFsaXplIGJ5dGUgY291bnRlcnMuLi4KKyAgICAgIGludCBpLCBzOworICAgICAgZm9yIChpID0gMDsgaSA8PSAyOyArK2kpIHsKKyAgICAgICAgZm9yIChzID0gMDsgcyA8IE5VTV9NQl9TRUdNRU5UUzsgKytzKSB7CisgICAgICAgICAgZW5jLT5yZXNpZHVhbF9ieXRlc19baV1bc10gPSAoaW50KSgoaXQtPmJpdF9jb3VudF9bc11baV0gKyA3KSA+PiAzKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyNlbmRpZgorICAgIFZQOEFkanVzdEZpbHRlclN0cmVuZ3RoKGl0KTsgICAgIC8vIC4uLmFuZCBzdG9yZSBmaWx0ZXIgc3RhdHMuCisgIH0gZWxzZSB7CisgICAgLy8gU29tZXRoaW5nIGJhZCBoYXBwZW5lZCAtPiBuZWVkIHRvIGRvIHNvbWUgbWVtb3J5IGNsZWFudXAuCisgICAgVlA4RW5jRnJlZUJpdFdyaXRlcnMoZW5jKTsKKyAgfQorICByZXR1cm4gb2s7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgVlA4RW5jTG9vcCgpOiBkb2VzIHRoZSBmaW5hbCBiaXRzdHJlYW0gY29kaW5nLgorCitzdGF0aWMgdm9pZCBSZXNldEFmdGVyU2tpcChWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKKyAgaWYgKGl0LT5tYl8tPnR5cGVfID09IDEpIHsKKyAgICAqaXQtPm56XyA9IDA7ICAvLyByZXNldCBhbGwgcHJlZGljdG9ycworICAgIGl0LT5sZWZ0X256X1s4XSA9IDA7CisgIH0gZWxzZSB7CisgICAgKml0LT5uel8gJj0gKDEgPDwgMjQpOyAgLy8gcHJlc2VydmUgdGhlIGRjX256IGJpdAorICB9Cit9CisKK2ludCBWUDhFbmNMb29wKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgeworICBWUDhFbmNJdGVyYXRvciBpdDsKKyAgaW50IG9rID0gUHJlTG9vcEluaXRpYWxpemUoZW5jKTsKKyAgaWYgKCFvaykgcmV0dXJuIDA7CisKKyAgU3RhdExvb3AoZW5jKTsgIC8vIHN0YXRzLWNvbGxlY3Rpb24gbG9vcAorCisgIFZQOEl0ZXJhdG9ySW5pdChlbmMsICZpdCk7CisgIFZQOEluaXRGaWx0ZXIoJml0KTsKKyAgZG8geworICAgIFZQOE1vZGVTY29yZSBpbmZvOworICAgIGNvbnN0IGludCBkb250X3VzZV9za2lwID0gIWVuYy0+cHJvYmFfLnVzZV9za2lwX3Byb2JhXzsKKyAgICBjb25zdCBWUDhSRExldmVsIHJkX29wdCA9IGVuYy0+cmRfb3B0X2xldmVsXzsKKworICAgIFZQOEl0ZXJhdG9ySW1wb3J0KCZpdCwgTlVMTCk7CisgICAgLy8gV2FybmluZyEgb3JkZXIgaXMgaW1wb3J0YW50OiBmaXJzdCBjYWxsIFZQOERlY2ltYXRlKCkgYW5kCisgICAgLy8gKnRoZW4qIGRlY2lkZSBob3cgdG8gY29kZSB0aGUgc2tpcCBkZWNpc2lvbiBpZiB0aGVyZSdzIG9uZS4KKyAgICBpZiAoIVZQOERlY2ltYXRlKCZpdCwgJmluZm8sIHJkX29wdCkgfHwgZG9udF91c2Vfc2tpcCkgeworICAgICAgQ29kZVJlc2lkdWFscyhpdC5id18sICZpdCwgJmluZm8pOworICAgIH0gZWxzZSB7ICAgLy8gcmVzZXQgcHJlZGljdG9ycyBhZnRlciBhIHNraXAKKyAgICAgIFJlc2V0QWZ0ZXJTa2lwKCZpdCk7CisgICAgfQorICAgIFN0b3JlU2lkZUluZm8oJml0KTsKKyAgICBWUDhTdG9yZUZpbHRlclN0YXRzKCZpdCk7CisgICAgVlA4SXRlcmF0b3JFeHBvcnQoJml0KTsKKyAgICBvayA9IFZQOEl0ZXJhdG9yUHJvZ3Jlc3MoJml0LCAyMCk7CisgICAgVlA4SXRlcmF0b3JTYXZlQm91bmRhcnkoJml0KTsKKyAgfSB3aGlsZSAob2sgJiYgVlA4SXRlcmF0b3JOZXh0KCZpdCkpOworCisgIHJldHVybiBQb3N0TG9vcEZpbmFsaXplKCZpdCwgb2spOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU2luZ2xlIHBhc3MgdXNpbmcgVG9rZW4gQnVmZmVyLgorCisjaWYgIWRlZmluZWQoRElTQUJMRV9UT0tFTl9CVUZGRVIpCisKKyNkZWZpbmUgTUlOX0NPVU5UIDk2ICAvLyBtaW5pbXVtIG51bWJlciBvZiBtYWNyb2Jsb2NrcyBiZWZvcmUgdXBkYXRpbmcgc3RhdHMKKworaW50IFZQOEVuY1Rva2VuTG9vcChWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgLy8gUm91Z2hseSByZWZyZXNoIHRoZSBwcm9iYSBlaWdodCB0aW1lcyBwZXIgcGFzcworICBpbnQgbWF4X2NvdW50ID0gKGVuYy0+bWJfd18gKiBlbmMtPm1iX2hfKSA+PiAzOworICBpbnQgbnVtX3Bhc3NfbGVmdCA9IGVuYy0+Y29uZmlnXy0+cGFzczsKKyAgY29uc3QgaW50IGRvX3NlYXJjaCA9IGVuYy0+ZG9fc2VhcmNoXzsKKyAgVlA4RW5jSXRlcmF0b3IgaXQ7CisgIFZQOEVuY1Byb2JhKiBjb25zdCBwcm9iYSA9ICZlbmMtPnByb2JhXzsKKyAgY29uc3QgVlA4UkRMZXZlbCByZF9vcHQgPSBlbmMtPnJkX29wdF9sZXZlbF87CisgIGNvbnN0IHVpbnQ2NF90IHBpeGVsX2NvdW50ID0gZW5jLT5tYl93XyAqIGVuYy0+bWJfaF8gKiAzODQ7CisgIFBhc3NTdGF0cyBzdGF0czsKKyAgaW50IG9rOworCisgIEluaXRQYXNzU3RhdHMoZW5jLCAmc3RhdHMpOworICBvayA9IFByZUxvb3BJbml0aWFsaXplKGVuYyk7CisgIGlmICghb2spIHJldHVybiAwOworCisgIGlmIChtYXhfY291bnQgPCBNSU5fQ09VTlQpIG1heF9jb3VudCA9IE1JTl9DT1VOVDsKKworICBhc3NlcnQoZW5jLT5udW1fcGFydHNfID09IDEpOworICBhc3NlcnQoZW5jLT51c2VfdG9rZW5zXyk7CisgIGFzc2VydChwcm9iYS0+dXNlX3NraXBfcHJvYmFfID09IDApOworICBhc3NlcnQocmRfb3B0ID49IFJEX09QVF9CQVNJQyk7ICAgLy8gb3RoZXJ3aXNlLCB0b2tlbi1idWZmZXIgd29uJ3QgYmUgdXNlZnVsCisgIGFzc2VydChudW1fcGFzc19sZWZ0ID4gMCk7CisKKyAgd2hpbGUgKG9rICYmIG51bV9wYXNzX2xlZnQtLSA+IDApIHsKKyAgICBjb25zdCBpbnQgaXNfbGFzdF9wYXNzID0gKGZhYnMoc3RhdHMuZHEpIDw9IERRX0xJTUlUKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnVtX3Bhc3NfbGVmdCA9PSAwKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZW5jLT5tYXhfaTRfaGVhZGVyX2JpdHNfID09IDApOworICAgIHVpbnQ2NF90IHNpemVfcDAgPSAwOworICAgIHVpbnQ2NF90IGRpc3RvcnRpb24gPSAwOworICAgIGludCBjbnQgPSBtYXhfY291bnQ7CisgICAgVlA4SXRlcmF0b3JJbml0KGVuYywgJml0KTsKKyAgICBTZXRMb29wUGFyYW1zKGVuYywgc3RhdHMucSk7CisgICAgaWYgKGlzX2xhc3RfcGFzcykgeworICAgICAgUmVzZXRUb2tlblN0YXRzKGVuYyk7CisgICAgICBWUDhJbml0RmlsdGVyKCZpdCk7ICAvLyBkb24ndCBjb2xsZWN0IHN0YXRzIHVudGlsIGxhc3QgcGFzcyAodG9vIGNvc3RseSkKKyAgICB9CisgICAgVlA4VEJ1ZmZlckNsZWFyKCZlbmMtPnRva2Vuc18pOworICAgIGRvIHsKKyAgICAgIFZQOE1vZGVTY29yZSBpbmZvOworICAgICAgVlA4SXRlcmF0b3JJbXBvcnQoJml0LCBOVUxMKTsKKyAgICAgIGlmICgtLWNudCA8IDApIHsKKyAgICAgICAgRmluYWxpemVUb2tlblByb2Jhcyhwcm9iYSk7CisgICAgICAgIFZQOENhbGN1bGF0ZUxldmVsQ29zdHMocHJvYmEpOyAgLy8gcmVmcmVzaCBjb3N0IHRhYmxlcyBmb3IgcmQtb3B0CisgICAgICAgIGNudCA9IG1heF9jb3VudDsKKyAgICAgIH0KKyAgICAgIFZQOERlY2ltYXRlKCZpdCwgJmluZm8sIHJkX29wdCk7CisgICAgICBvayA9IFJlY29yZFRva2VucygmaXQsICZpbmZvLCAmZW5jLT50b2tlbnNfKTsKKyAgICAgIGlmICghb2spIHsKKyAgICAgICAgV2ViUEVuY29kaW5nU2V0RXJyb3IoZW5jLT5waWNfLCBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHNpemVfcDAgKz0gaW5mby5IOworICAgICAgZGlzdG9ydGlvbiArPSBpbmZvLkQ7CisgICAgICBpZiAoaXNfbGFzdF9wYXNzKSB7CisgICAgICAgIFN0b3JlU2lkZUluZm8oJml0KTsKKyAgICAgICAgVlA4U3RvcmVGaWx0ZXJTdGF0cygmaXQpOworICAgICAgICBWUDhJdGVyYXRvckV4cG9ydCgmaXQpOworICAgICAgICBvayA9IFZQOEl0ZXJhdG9yUHJvZ3Jlc3MoJml0LCAyMCk7CisgICAgICB9CisgICAgICBWUDhJdGVyYXRvclNhdmVCb3VuZGFyeSgmaXQpOworICAgIH0gd2hpbGUgKG9rICYmIFZQOEl0ZXJhdG9yTmV4dCgmaXQpKTsKKyAgICBpZiAoIW9rKSBicmVhazsKKworICAgIHNpemVfcDAgKz0gZW5jLT5zZWdtZW50X2hkcl8uc2l6ZV87CisgICAgaWYgKHN0YXRzLmRvX3NpemVfc2VhcmNoKSB7CisgICAgICB1aW50NjRfdCBzaXplID0gRmluYWxpemVUb2tlblByb2JhcygmZW5jLT5wcm9iYV8pOworICAgICAgc2l6ZSArPSBWUDhFc3RpbWF0ZVRva2VuU2l6ZSgmZW5jLT50b2tlbnNfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCopcHJvYmEtPmNvZWZmc18pOworICAgICAgc2l6ZSA9IChzaXplICsgc2l6ZV9wMCArIDEwMjQpID4+IDExOyAgLy8gLT4gc2l6ZSBpbiBieXRlcworICAgICAgc2l6ZSArPSBIRUFERVJfU0laRV9FU1RJTUFURTsKKyAgICAgIHN0YXRzLnZhbHVlID0gKGRvdWJsZSlzaXplOworICAgIH0gZWxzZSB7ICAvLyBjb21wdXRlIGFuZCBzdG9yZSBQU05SCisgICAgICBzdGF0cy52YWx1ZSA9IEdldFBTTlIoZGlzdG9ydGlvbiwgcGl4ZWxfY291bnQpOworICAgIH0KKworI2lmIChERUJVR19TRUFSQ0ggPiAwKQorICAgIHByaW50ZigiIyUyZCBtZXRyaWM6JS4xbGYgLT4gJS4xbGYgICBsYXN0X3E9JS4ybGYgcT0lLjJsZiBkcT0lLjJsZlxuIiwKKyAgICAgICAgICAgbnVtX3Bhc3NfbGVmdCwgc3RhdHMubGFzdF92YWx1ZSwgc3RhdHMudmFsdWUsCisgICAgICAgICAgIHN0YXRzLmxhc3RfcSwgc3RhdHMucSwgc3RhdHMuZHEpOworI2VuZGlmCisgICAgaWYgKGVuYy0+bWF4X2k0X2hlYWRlcl9iaXRzXyA+IDAgJiYgc2l6ZV9wMCA+IFBBUlRJVElPTjBfU0laRV9MSU1JVCkgeworICAgICAgKytudW1fcGFzc19sZWZ0OworICAgICAgZW5jLT5tYXhfaTRfaGVhZGVyX2JpdHNfID4+PSAxOyAgLy8gc3RyZW5ndGhlbiBoZWFkZXIgYml0IGxpbWl0YXRpb24uLi4KKyAgICAgIGlmIChpc19sYXN0X3Bhc3MpIHsKKyAgICAgICAgUmVzZXRTaWRlSW5mbygmaXQpOworICAgICAgfQorICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4uYW5kIHN0YXJ0IG92ZXIKKyAgICB9CisgICAgaWYgKGlzX2xhc3RfcGFzcykgeworICAgICAgYnJlYWs7ICAgLy8gZG9uZQorICAgIH0KKyAgICBpZiAoZG9fc2VhcmNoKSB7CisgICAgICBDb21wdXRlTmV4dFEoJnN0YXRzKTsgIC8vIEFkanVzdCBxCisgICAgfQorICB9CisgIGlmIChvaykgeworICAgIGlmICghc3RhdHMuZG9fc2l6ZV9zZWFyY2gpIHsKKyAgICAgIEZpbmFsaXplVG9rZW5Qcm9iYXMoJmVuYy0+cHJvYmFfKTsKKyAgICB9CisgICAgb2sgPSBWUDhFbWl0VG9rZW5zKCZlbmMtPnRva2Vuc18sIGVuYy0+cGFydHNfICsgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QqKXByb2JhLT5jb2VmZnNfLCAxKTsKKyAgfQorICBvayA9IG9rICYmIFdlYlBSZXBvcnRQcm9ncmVzcyhlbmMtPnBpY18sIGVuYy0+cGVyY2VudF8gKyAyMCwgJmVuYy0+cGVyY2VudF8pOworICByZXR1cm4gUG9zdExvb3BGaW5hbGl6ZSgmaXQsIG9rKTsKK30KKworI2Vsc2UKKworaW50IFZQOEVuY1Rva2VuTG9vcChWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgKHZvaWQpZW5jOworICByZXR1cm4gMDsgICAvLyB3ZSBzaG91bGRuJ3QgYmUgaGVyZS4KK30KKworI2VuZGlmICAgIC8vIERJU0FCTEVfVE9LRU5fQlVGRkVSCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL2hpc3RvZ3JhbV9lbmMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvaGlzdG9ncmFtX2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MmVmNmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL2hpc3RvZ3JhbV9lbmMuYwpAQCAtMCwwICsxLDEwNDMgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBBdXRob3I6IEp5cmtpIEFsYWt1aWphbGEgKGp5cmtpQGdvb2dsZS5jb20pCisvLworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJzcmMvd2VicC9jb25maWcuaCIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vYXNzZXJ0X3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9tYXRoX3BvZW0uaCIKKyNlbHNlCisjaW5jbHVkZSA8bWF0aC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvZW5jL2JhY2t3YXJkX3JlZmVyZW5jZXNfZW5jLmgiCisjaW5jbHVkZSAic3JjL2VuYy9oaXN0b2dyYW1fZW5jLmgiCisjaW5jbHVkZSAic3JjL2RzcC9sb3NzbGVzcy5oIgorI2luY2x1ZGUgInNyYy9kc3AvbG9zc2xlc3NfY29tbW9uLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL3V0aWxzLmgiCisKKyNkZWZpbmUgTUFYX0NPU1QgMS5lMzgKKworLy8gTnVtYmVyIG9mIHBhcnRpdGlvbnMgZm9yIHRoZSB0aHJlZSBkb21pbmFudCAobGl0ZXJhbCwgcmVkIGFuZCBibHVlKSBzeW1ib2wKKy8vIGNvc3RzLgorI2RlZmluZSBOVU1fUEFSVElUSU9OUyA0CisvLyBUaGUgc2l6ZSBvZiB0aGUgYmluLWhhc2ggY29ycmVzcG9uZGluZyB0byB0aGUgdGhyZWUgZG9taW5hbnQgY29zdHMuCisjZGVmaW5lIEJJTl9TSVpFIChOVU1fUEFSVElUSU9OUyAqIE5VTV9QQVJUSVRJT05TICogTlVNX1BBUlRJVElPTlMpCisvLyBNYXhpbXVtIG51bWJlciBvZiBoaXN0b2dyYW1zIGFsbG93ZWQgaW4gZ3JlZWR5IGNvbWJpbmluZyBhbGdvcml0aG0uCisjZGVmaW5lIE1BWF9ISVNUT19HUkVFRFkgMTAwCisKK3N0YXRpYyB2b2lkIEhpc3RvZ3JhbUNsZWFyKFZQOExIaXN0b2dyYW0qIGNvbnN0IHApIHsKKyAgdWludDMyX3QqIGNvbnN0IGxpdGVyYWwgPSBwLT5saXRlcmFsXzsKKyAgY29uc3QgaW50IGNhY2hlX2JpdHMgPSBwLT5wYWxldHRlX2NvZGVfYml0c187CisgIGNvbnN0IGludCBoaXN0b19zaXplID0gVlA4TEdldEhpc3RvZ3JhbVNpemUoY2FjaGVfYml0cyk7CisgIG1lbXNldChwLCAwLCBoaXN0b19zaXplKTsKKyAgcC0+cGFsZXR0ZV9jb2RlX2JpdHNfID0gY2FjaGVfYml0czsKKyAgcC0+bGl0ZXJhbF8gPSBsaXRlcmFsOworfQorCisvLyBTd2FwIHR3byBoaXN0b2dyYW0gcG9pbnRlcnMuCitzdGF0aWMgdm9pZCBIaXN0b2dyYW1Td2FwKFZQOExIaXN0b2dyYW0qKiBjb25zdCBBLCBWUDhMSGlzdG9ncmFtKiogY29uc3QgQikgeworICBWUDhMSGlzdG9ncmFtKiBjb25zdCB0bXAgPSAqQTsKKyAgKkEgPSAqQjsKKyAgKkIgPSB0bXA7Cit9CisKK3N0YXRpYyB2b2lkIEhpc3RvZ3JhbUNvcHkoY29uc3QgVlA4TEhpc3RvZ3JhbSogY29uc3Qgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMSGlzdG9ncmFtKiBjb25zdCBkc3QpIHsKKyAgdWludDMyX3QqIGNvbnN0IGRzdF9saXRlcmFsID0gZHN0LT5saXRlcmFsXzsKKyAgY29uc3QgaW50IGRzdF9jYWNoZV9iaXRzID0gZHN0LT5wYWxldHRlX2NvZGVfYml0c187CisgIGNvbnN0IGludCBoaXN0b19zaXplID0gVlA4TEdldEhpc3RvZ3JhbVNpemUoZHN0X2NhY2hlX2JpdHMpOworICBhc3NlcnQoc3JjLT5wYWxldHRlX2NvZGVfYml0c18gPT0gZHN0X2NhY2hlX2JpdHMpOworICBtZW1jcHkoZHN0LCBzcmMsIGhpc3RvX3NpemUpOworICBkc3QtPmxpdGVyYWxfID0gZHN0X2xpdGVyYWw7Cit9CisKK2ludCBWUDhMR2V0SGlzdG9ncmFtU2l6ZShpbnQgY2FjaGVfYml0cykgeworICBjb25zdCBpbnQgbGl0ZXJhbF9zaXplID0gVlA4TEhpc3RvZ3JhbU51bUNvZGVzKGNhY2hlX2JpdHMpOworICBjb25zdCBzaXplX3QgdG90YWxfc2l6ZSA9IHNpemVvZihWUDhMSGlzdG9ncmFtKSArIHNpemVvZihpbnQpICogbGl0ZXJhbF9zaXplOworICBhc3NlcnQodG90YWxfc2l6ZSA8PSAoc2l6ZV90KTB4N2ZmZmZmZmYpOworICByZXR1cm4gKGludCl0b3RhbF9zaXplOworfQorCit2b2lkIFZQOExGcmVlSGlzdG9ncmFtKFZQOExIaXN0b2dyYW0qIGNvbnN0IGhpc3RvKSB7CisgIFdlYlBTYWZlRnJlZShoaXN0byk7Cit9CisKK3ZvaWQgVlA4TEZyZWVIaXN0b2dyYW1TZXQoVlA4TEhpc3RvZ3JhbVNldCogY29uc3QgaGlzdG8pIHsKKyAgV2ViUFNhZmVGcmVlKGhpc3RvKTsKK30KKwordm9pZCBWUDhMSGlzdG9ncmFtU3RvcmVSZWZzKGNvbnN0IFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEhpc3RvZ3JhbSogY29uc3QgaGlzdG8pIHsKKyAgVlA4TFJlZnNDdXJzb3IgYyA9IFZQOExSZWZzQ3Vyc29ySW5pdChyZWZzKTsKKyAgd2hpbGUgKFZQOExSZWZzQ3Vyc29yT2soJmMpKSB7CisgICAgVlA4TEhpc3RvZ3JhbUFkZFNpbmdsZVBpeE9yQ29weShoaXN0bywgYy5jdXJfcG9zLCBOVUxMLCAwKTsKKyAgICBWUDhMUmVmc0N1cnNvck5leHQoJmMpOworICB9Cit9CisKK3ZvaWQgVlA4TEhpc3RvZ3JhbUNyZWF0ZShWUDhMSGlzdG9ncmFtKiBjb25zdCBwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhbGV0dGVfY29kZV9iaXRzKSB7CisgIGlmIChwYWxldHRlX2NvZGVfYml0cyA+PSAwKSB7CisgICAgcC0+cGFsZXR0ZV9jb2RlX2JpdHNfID0gcGFsZXR0ZV9jb2RlX2JpdHM7CisgIH0KKyAgSGlzdG9ncmFtQ2xlYXIocCk7CisgIFZQOExIaXN0b2dyYW1TdG9yZVJlZnMocmVmcywgcCk7Cit9CisKK3ZvaWQgVlA4TEhpc3RvZ3JhbUluaXQoVlA4TEhpc3RvZ3JhbSogY29uc3QgcCwgaW50IHBhbGV0dGVfY29kZV9iaXRzKSB7CisgIHAtPnBhbGV0dGVfY29kZV9iaXRzXyA9IHBhbGV0dGVfY29kZV9iaXRzOworICBIaXN0b2dyYW1DbGVhcihwKTsKK30KKworVlA4TEhpc3RvZ3JhbSogVlA4TEFsbG9jYXRlSGlzdG9ncmFtKGludCBjYWNoZV9iaXRzKSB7CisgIFZQOExIaXN0b2dyYW0qIGhpc3RvID0gTlVMTDsKKyAgY29uc3QgaW50IHRvdGFsX3NpemUgPSBWUDhMR2V0SGlzdG9ncmFtU2l6ZShjYWNoZV9iaXRzKTsKKyAgdWludDhfdCogY29uc3QgbWVtb3J5ID0gKHVpbnQ4X3QqKVdlYlBTYWZlTWFsbG9jKHRvdGFsX3NpemUsIHNpemVvZigqbWVtb3J5KSk7CisgIGlmIChtZW1vcnkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgIGhpc3RvID0gKFZQOExIaXN0b2dyYW0qKW1lbW9yeTsKKyAgLy8gbGl0ZXJhbF8gd29uJ3QgbmVjZXNzYXJ5IGJlIGFsaWduZWQuCisgIGhpc3RvLT5saXRlcmFsXyA9ICh1aW50MzJfdCopKG1lbW9yeSArIHNpemVvZihWUDhMSGlzdG9ncmFtKSk7CisgIFZQOExIaXN0b2dyYW1Jbml0KGhpc3RvLCBjYWNoZV9iaXRzKTsKKyAgcmV0dXJuIGhpc3RvOworfQorCitWUDhMSGlzdG9ncmFtU2V0KiBWUDhMQWxsb2NhdGVIaXN0b2dyYW1TZXQoaW50IHNpemUsIGludCBjYWNoZV9iaXRzKSB7CisgIGludCBpOworICBWUDhMSGlzdG9ncmFtU2V0KiBzZXQ7CisgIGNvbnN0IGludCBoaXN0b19zaXplID0gVlA4TEdldEhpc3RvZ3JhbVNpemUoY2FjaGVfYml0cyk7CisgIGNvbnN0IHNpemVfdCB0b3RhbF9zaXplID0KKyAgICAgIHNpemVvZigqc2V0KSArIHNpemUgKiAoc2l6ZW9mKCpzZXQtPmhpc3RvZ3JhbXMpICsKKyAgICAgIGhpc3RvX3NpemUgKyBXRUJQX0FMSUdOX0NTVCk7CisgIHVpbnQ4X3QqIG1lbW9yeSA9ICh1aW50OF90KilXZWJQU2FmZU1hbGxvYyh0b3RhbF9zaXplLCBzaXplb2YoKm1lbW9yeSkpOworICBpZiAobWVtb3J5ID09IE5VTEwpIHJldHVybiBOVUxMOworCisgIHNldCA9IChWUDhMSGlzdG9ncmFtU2V0KiltZW1vcnk7CisgIG1lbW9yeSArPSBzaXplb2YoKnNldCk7CisgIHNldC0+aGlzdG9ncmFtcyA9IChWUDhMSGlzdG9ncmFtKiopbWVtb3J5OworICBtZW1vcnkgKz0gc2l6ZSAqIHNpemVvZigqc2V0LT5oaXN0b2dyYW1zKTsKKyAgc2V0LT5tYXhfc2l6ZSA9IHNpemU7CisgIHNldC0+c2l6ZSA9IHNpemU7CisgIGZvciAoaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICBtZW1vcnkgPSAodWludDhfdCopV0VCUF9BTElHTihtZW1vcnkpOworICAgIHNldC0+aGlzdG9ncmFtc1tpXSA9IChWUDhMSGlzdG9ncmFtKiltZW1vcnk7CisgICAgLy8gbGl0ZXJhbF8gd29uJ3QgbmVjZXNzYXJ5IGJlIGFsaWduZWQuCisgICAgc2V0LT5oaXN0b2dyYW1zW2ldLT5saXRlcmFsXyA9ICh1aW50MzJfdCopKG1lbW9yeSArIHNpemVvZihWUDhMSGlzdG9ncmFtKSk7CisgICAgVlA4TEhpc3RvZ3JhbUluaXQoc2V0LT5oaXN0b2dyYW1zW2ldLCBjYWNoZV9iaXRzKTsKKyAgICBtZW1vcnkgKz0gaGlzdG9fc2l6ZTsKKyAgfQorICByZXR1cm4gc2V0OworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFZQOExIaXN0b2dyYW1BZGRTaW5nbGVQaXhPckNvcHkoVlA4TEhpc3RvZ3JhbSogY29uc3QgaGlzdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGl4T3JDb3B5KiBjb25zdCB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAoKmNvbnN0IGRpc3RhbmNlX21vZGlmaWVyKShpbnQsIGludCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpc3RhbmNlX21vZGlmaWVyX2FyZzApIHsKKyAgaWYgKFBpeE9yQ29weUlzTGl0ZXJhbCh2KSkgeworICAgICsraGlzdG8tPmFscGhhX1tQaXhPckNvcHlMaXRlcmFsKHYsIDMpXTsKKyAgICArK2hpc3RvLT5yZWRfW1BpeE9yQ29weUxpdGVyYWwodiwgMildOworICAgICsraGlzdG8tPmxpdGVyYWxfW1BpeE9yQ29weUxpdGVyYWwodiwgMSldOworICAgICsraGlzdG8tPmJsdWVfW1BpeE9yQ29weUxpdGVyYWwodiwgMCldOworICB9IGVsc2UgaWYgKFBpeE9yQ29weUlzQ2FjaGVJZHgodikpIHsKKyAgICBjb25zdCBpbnQgbGl0ZXJhbF9peCA9CisgICAgICAgIE5VTV9MSVRFUkFMX0NPREVTICsgTlVNX0xFTkdUSF9DT0RFUyArIFBpeE9yQ29weUNhY2hlSWR4KHYpOworICAgICsraGlzdG8tPmxpdGVyYWxfW2xpdGVyYWxfaXhdOworICB9IGVsc2UgeworICAgIGludCBjb2RlLCBleHRyYV9iaXRzOworICAgIFZQOExQcmVmaXhFbmNvZGVCaXRzKFBpeE9yQ29weUxlbmd0aCh2KSwgJmNvZGUsICZleHRyYV9iaXRzKTsKKyAgICArK2hpc3RvLT5saXRlcmFsX1tOVU1fTElURVJBTF9DT0RFUyArIGNvZGVdOworICAgIGlmIChkaXN0YW5jZV9tb2RpZmllciA9PSBOVUxMKSB7CisgICAgICBWUDhMUHJlZml4RW5jb2RlQml0cyhQaXhPckNvcHlEaXN0YW5jZSh2KSwgJmNvZGUsICZleHRyYV9iaXRzKTsKKyAgICB9IGVsc2UgeworICAgICAgVlA4TFByZWZpeEVuY29kZUJpdHMoCisgICAgICAgICAgZGlzdGFuY2VfbW9kaWZpZXIoZGlzdGFuY2VfbW9kaWZpZXJfYXJnMCwgUGl4T3JDb3B5RGlzdGFuY2UodikpLAorICAgICAgICAgICZjb2RlLCAmZXh0cmFfYml0cyk7CisgICAgfQorICAgICsraGlzdG8tPmRpc3RhbmNlX1tjb2RlXTsKKyAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cm9weS1yZWxhdGVkIGZ1bmN0aW9ucy4KKworc3RhdGljIFdFQlBfSU5MSU5FIGRvdWJsZSBCaXRzRW50cm9weVJlZmluZShjb25zdCBWUDhMQml0RW50cm9weSogZW50cm9weSkgeworICBkb3VibGUgbWl4OworICBpZiAoZW50cm9weS0+bm9uemVyb3MgPCA1KSB7CisgICAgaWYgKGVudHJvcHktPm5vbnplcm9zIDw9IDEpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAvLyBUd28gc3ltYm9scywgdGhleSB3aWxsIGJlIDAgYW5kIDEgaW4gYSBIdWZmbWFuIGNvZGUuCisgICAgLy8gTGV0J3MgbWl4IGluIGEgYml0IG9mIGVudHJvcHkgdG8gZmF2b3IgZ29vZCBjbHVzdGVyaW5nIHdoZW4KKyAgICAvLyBkaXN0cmlidXRpb25zIG9mIHRoZXNlIGFyZSBjb21iaW5lZC4KKyAgICBpZiAoZW50cm9weS0+bm9uemVyb3MgPT0gMikgeworICAgICAgcmV0dXJuIDAuOTkgKiBlbnRyb3B5LT5zdW0gKyAwLjAxICogZW50cm9weS0+ZW50cm9weTsKKyAgICB9CisgICAgLy8gTm8gbWF0dGVyIHdoYXQgdGhlIGVudHJvcHkgc2F5cywgd2UgY2Fubm90IGJlIGJldHRlciB0aGFuIG1pbl9saW1pdAorICAgIC8vIHdpdGggSHVmZm1hbiBjb2RpbmcuIEkgYW0gbWl4aW5nIGEgYml0IG9mIGVudHJvcHkgaW50byB0aGUKKyAgICAvLyBtaW5fbGltaXQgc2luY2UgaXQgcHJvZHVjZXMgbXVjaCBiZXR0ZXIgKH4wLjUgJSkgY29tcHJlc3Npb24gcmVzdWx0cworICAgIC8vIHBlcmhhcHMgYmVjYXVzZSBvZiBiZXR0ZXIgZW50cm9weSBjbHVzdGVyaW5nLgorICAgIGlmIChlbnRyb3B5LT5ub256ZXJvcyA9PSAzKSB7CisgICAgICBtaXggPSAwLjk1OworICAgIH0gZWxzZSB7CisgICAgICBtaXggPSAwLjc7ICAvLyBub256ZXJvcyA9PSA0LgorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBtaXggPSAwLjYyNzsKKyAgfQorCisgIHsKKyAgICBkb3VibGUgbWluX2xpbWl0ID0gMiAqIGVudHJvcHktPnN1bSAtIGVudHJvcHktPm1heF92YWw7CisgICAgbWluX2xpbWl0ID0gbWl4ICogbWluX2xpbWl0ICsgKDEuMCAtIG1peCkgKiBlbnRyb3B5LT5lbnRyb3B5OworICAgIHJldHVybiAoZW50cm9weS0+ZW50cm9weSA8IG1pbl9saW1pdCkgPyBtaW5fbGltaXQgOiBlbnRyb3B5LT5lbnRyb3B5OworICB9Cit9CisKK2RvdWJsZSBWUDhMQml0c0VudHJvcHkoY29uc3QgdWludDMyX3QqIGNvbnN0IGFycmF5LCBpbnQgbikgeworICBWUDhMQml0RW50cm9weSBlbnRyb3B5OworICBWUDhMQml0c0VudHJvcHlVbnJlZmluZWQoYXJyYXksIG4sICZlbnRyb3B5KTsKKworICByZXR1cm4gQml0c0VudHJvcHlSZWZpbmUoJmVudHJvcHkpOworfQorCitzdGF0aWMgZG91YmxlIEluaXRpYWxIdWZmbWFuQ29zdCh2b2lkKSB7CisgIC8vIFNtYWxsIGJpYXMgYmVjYXVzZSBIdWZmbWFuIGNvZGUgbGVuZ3RoIGlzIHR5cGljYWxseSBub3Qgc3RvcmVkIGluCisgIC8vIGZ1bGwgbGVuZ3RoLgorICBzdGF0aWMgY29uc3QgaW50IGtIdWZmbWFuQ29kZU9mSHVmZm1hbkNvZGVTaXplID0gQ09ERV9MRU5HVEhfQ09ERVMgKiAzOworICBzdGF0aWMgY29uc3QgZG91YmxlIGtTbWFsbEJpYXMgPSA5LjE7CisgIHJldHVybiBrSHVmZm1hbkNvZGVPZkh1ZmZtYW5Db2RlU2l6ZSAtIGtTbWFsbEJpYXM7Cit9CisKKy8vIEZpbmFsaXplIHRoZSBIdWZmbWFuIGNvc3QgYmFzZWQgb24gc3RyZWFrIG51bWJlcnMgYW5kIGxlbmd0aCB0eXBlICg8MyBvciA+PTMpCitzdGF0aWMgZG91YmxlIEZpbmFsSHVmZm1hbkNvc3QoY29uc3QgVlA4TFN0cmVha3MqIGNvbnN0IHN0YXRzKSB7CisgIC8vIFRoZSBjb25zdGFudHMgaW4gdGhpcyBmdW5jdGlvbiBhcmUgZXhwZXJpbWVudGFsIGFuZCBnb3Qgcm91bmRlZCBmcm9tCisgIC8vIHRoZWlyIG9yaWdpbmFsIHZhbHVlcyBpbiAxLzggd2hlbiBzd2l0Y2hlZCB0byAxLzEwMjQuCisgIGRvdWJsZSByZXR2YWwgPSBJbml0aWFsSHVmZm1hbkNvc3QoKTsKKyAgLy8gU2Vjb25kIGNvZWZmaWNpZW50OiBNYW55IHplcm9zIGluIHRoZSBoaXN0b2dyYW0gYXJlIGNvdmVyZWQgZWZmaWNpZW50bHkKKyAgLy8gYnkgYSBydW4tbGVuZ3RoIGVuY29kZS4gT3JpZ2luYWxseSAyLzguCisgIHJldHZhbCArPSBzdGF0cy0+Y291bnRzWzBdICogMS41NjI1ICsgMC4yMzQzNzUgKiBzdGF0cy0+c3RyZWFrc1swXVsxXTsKKyAgLy8gU2Vjb25kIGNvZWZmaWNpZW50OiBDb25zdGFudCB2YWx1ZXMgYXJlIGVuY29kZWQgbGVzcyBlZmZpY2llbnRseSwgYnV0IHN0aWxsCisgIC8vIFJMRSdlZC4gT3JpZ2luYWxseSA2LzguCisgIHJldHZhbCArPSBzdGF0cy0+Y291bnRzWzFdICogMi41NzgxMjUgKyAwLjcwMzEyNSAqIHN0YXRzLT5zdHJlYWtzWzFdWzFdOworICAvLyAwcyBhcmUgdXN1YWxseSBlbmNvZGVkIG1vcmUgZWZmaWNpZW50bHkgdGhhbiBub24tMHMuCisgIC8vIE9yaWdpbmFsbHkgMTUvOC4KKyAgcmV0dmFsICs9IDEuNzk2ODc1ICogc3RhdHMtPnN0cmVha3NbMF1bMF07CisgIC8vIE9yaWdpbmFsbHkgMjYvOC4KKyAgcmV0dmFsICs9IDMuMjgxMjUgKiBzdGF0cy0+c3RyZWFrc1sxXVswXTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLy8gR2V0IHRoZSBzeW1ib2wgZW50cm9weSBmb3IgdGhlIGRpc3RyaWJ1dGlvbiAncG9wdWxhdGlvbicuCisvLyBTZXQgJ3RyaXZpYWxfc3ltJywgaWYgdGhlcmUncyBvbmx5IG9uZSBzeW1ib2wgcHJlc2VudCBpbiB0aGUgZGlzdHJpYnV0aW9uLgorc3RhdGljIGRvdWJsZSBQb3B1bGF0aW9uQ29zdChjb25zdCB1aW50MzJfdCogY29uc3QgcG9wdWxhdGlvbiwgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGNvbnN0IHRyaXZpYWxfc3ltKSB7CisgIFZQOExCaXRFbnRyb3B5IGJpdF9lbnRyb3B5OworICBWUDhMU3RyZWFrcyBzdGF0czsKKyAgVlA4TEdldEVudHJvcHlVbnJlZmluZWQocG9wdWxhdGlvbiwgbGVuZ3RoLCAmYml0X2VudHJvcHksICZzdGF0cyk7CisgIGlmICh0cml2aWFsX3N5bSAhPSBOVUxMKSB7CisgICAgKnRyaXZpYWxfc3ltID0gKGJpdF9lbnRyb3B5Lm5vbnplcm9zID09IDEpID8gYml0X2VudHJvcHkubm9uemVyb19jb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogVlA4TF9OT05fVFJJVklBTF9TWU07CisgIH0KKworICByZXR1cm4gQml0c0VudHJvcHlSZWZpbmUoJmJpdF9lbnRyb3B5KSArIEZpbmFsSHVmZm1hbkNvc3QoJnN0YXRzKTsKK30KKworLy8gdHJpdmlhbF9hdF9lbmQgaXMgMSBpZiB0aGUgdHdvIGhpc3RvZ3JhbXMgb25seSBoYXZlIG9uZSBlbGVtZW50IHRoYXQgaXMKKy8vIG5vbi16ZXJvOiBib3RoIHRoZSB6ZXJvLXRoIG9uZSwgb3IgYm90aCB0aGUgbGFzdCBvbmUuCitzdGF0aWMgV0VCUF9JTkxJTkUgZG91YmxlIEdldENvbWJpbmVkRW50cm9weShjb25zdCB1aW50MzJfdCogY29uc3QgWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCwgaW50IHRyaXZpYWxfYXRfZW5kKSB7CisgIFZQOExTdHJlYWtzIHN0YXRzOworICBpZiAodHJpdmlhbF9hdF9lbmQpIHsKKyAgICAvLyBUaGlzIGNvbmZpZ3VyYXRpb24gaXMgZHVlIHRvIHBhbGV0dGl6YXRpb24gdGhhdCB0cmFuc2Zvcm1zIGFuIGluZGV4ZWQKKyAgICAvLyBwaXhlbCBpbnRvIDB4ZmYwMDAwMDAgfCAocGl4ZWwgPDwgOCkgaW4gVlA4TEJ1bmRsZUNvbG9yTWFwLgorICAgIC8vIEJpdHNFbnRyb3B5UmVmaW5lIGlzIDAgZm9yIGhpc3RvZ3JhbXMgd2l0aCBvbmx5IG9uZSBub24temVybyB2YWx1ZS4KKyAgICAvLyBPbmx5IEZpbmFsSHVmZm1hbkNvc3QgbmVlZHMgdG8gYmUgZXZhbHVhdGVkLgorICAgIG1lbXNldCgmc3RhdHMsIDAsIHNpemVvZihzdGF0cykpOworICAgIC8vIERlYWwgd2l0aCB0aGUgbm9uLXplcm8gdmFsdWUgYXQgaW5kZXggMCBvciBsZW5ndGgtMS4KKyAgICBzdGF0cy5zdHJlYWtzWzFdWzBdICs9IDE7CisgICAgLy8gRGVhbCB3aXRoIHRoZSBmb2xsb3dpbmcvcHJldmlvdXMgemVybyBzdHJlYWsuCisgICAgc3RhdHMuY291bnRzWzBdICs9IDE7CisgICAgc3RhdHMuc3RyZWFrc1swXVsxXSArPSBsZW5ndGggLSAxOworICAgIHJldHVybiBGaW5hbEh1ZmZtYW5Db3N0KCZzdGF0cyk7CisgIH0gZWxzZSB7CisgICAgVlA4TEJpdEVudHJvcHkgYml0X2VudHJvcHk7CisgICAgVlA4TEdldENvbWJpbmVkRW50cm9weVVucmVmaW5lZChYLCBZLCBsZW5ndGgsICZiaXRfZW50cm9weSwgJnN0YXRzKTsKKworICAgIHJldHVybiBCaXRzRW50cm9weVJlZmluZSgmYml0X2VudHJvcHkpICsgRmluYWxIdWZmbWFuQ29zdCgmc3RhdHMpOworICB9Cit9CisKKy8vIEVzdGltYXRlcyB0aGUgRW50cm9weSArIEh1ZmZtYW4gKyBvdGhlciBibG9jayBvdmVyaGVhZCBzaXplIGNvc3QuCitkb3VibGUgVlA4TEhpc3RvZ3JhbUVzdGltYXRlQml0cyhjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBwKSB7CisgIHJldHVybgorICAgICAgUG9wdWxhdGlvbkNvc3QoCisgICAgICAgICAgcC0+bGl0ZXJhbF8sIFZQOExIaXN0b2dyYW1OdW1Db2RlcyhwLT5wYWxldHRlX2NvZGVfYml0c18pLCBOVUxMKQorICAgICAgKyBQb3B1bGF0aW9uQ29zdChwLT5yZWRfLCBOVU1fTElURVJBTF9DT0RFUywgTlVMTCkKKyAgICAgICsgUG9wdWxhdGlvbkNvc3QocC0+Ymx1ZV8sIE5VTV9MSVRFUkFMX0NPREVTLCBOVUxMKQorICAgICAgKyBQb3B1bGF0aW9uQ29zdChwLT5hbHBoYV8sIE5VTV9MSVRFUkFMX0NPREVTLCBOVUxMKQorICAgICAgKyBQb3B1bGF0aW9uQ29zdChwLT5kaXN0YW5jZV8sIE5VTV9ESVNUQU5DRV9DT0RFUywgTlVMTCkKKyAgICAgICsgVlA4TEV4dHJhQ29zdChwLT5saXRlcmFsXyArIE5VTV9MSVRFUkFMX0NPREVTLCBOVU1fTEVOR1RIX0NPREVTKQorICAgICAgKyBWUDhMRXh0cmFDb3N0KHAtPmRpc3RhbmNlXywgTlVNX0RJU1RBTkNFX0NPREVTKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZhcmlvdXMgaGlzdG9ncmFtIGNvbWJpbmUvY29zdC1ldmFsIGZ1bmN0aW9ucworCitzdGF0aWMgaW50IEdldENvbWJpbmVkSGlzdG9ncmFtRW50cm9weShjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TEhpc3RvZ3JhbSogY29uc3QgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBjb3N0X3RocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogY29zdCkgeworICBjb25zdCBpbnQgcGFsZXR0ZV9jb2RlX2JpdHMgPSBhLT5wYWxldHRlX2NvZGVfYml0c187CisgIGludCB0cml2aWFsX2F0X2VuZCA9IDA7CisgIGFzc2VydChhLT5wYWxldHRlX2NvZGVfYml0c18gPT0gYi0+cGFsZXR0ZV9jb2RlX2JpdHNfKTsKKyAgKmNvc3QgKz0gR2V0Q29tYmluZWRFbnRyb3B5KGEtPmxpdGVyYWxfLCBiLT5saXRlcmFsXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExIaXN0b2dyYW1OdW1Db2RlcyhwYWxldHRlX2NvZGVfYml0cyksIDApOworICAqY29zdCArPSBWUDhMRXh0cmFDb3N0Q29tYmluZWQoYS0+bGl0ZXJhbF8gKyBOVU1fTElURVJBTF9DT0RFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGItPmxpdGVyYWxfICsgTlVNX0xJVEVSQUxfQ09ERVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVU1fTEVOR1RIX0NPREVTKTsKKyAgaWYgKCpjb3N0ID4gY29zdF90aHJlc2hvbGQpIHJldHVybiAwOworCisgIGlmIChhLT50cml2aWFsX3N5bWJvbF8gIT0gVlA4TF9OT05fVFJJVklBTF9TWU0gJiYKKyAgICAgIGEtPnRyaXZpYWxfc3ltYm9sXyA9PSBiLT50cml2aWFsX3N5bWJvbF8pIHsKKyAgICAvLyBBLCBSIGFuZCBCIGFyZSBhbGwgMCBvciAweGZmLgorICAgIGNvbnN0IHVpbnQzMl90IGNvbG9yX2EgPSAoYS0+dHJpdmlhbF9zeW1ib2xfID4+IDI0KSAmIDB4ZmY7CisgICAgY29uc3QgdWludDMyX3QgY29sb3JfciA9IChhLT50cml2aWFsX3N5bWJvbF8gPj4gMTYpICYgMHhmZjsKKyAgICBjb25zdCB1aW50MzJfdCBjb2xvcl9iID0gKGEtPnRyaXZpYWxfc3ltYm9sXyA+PiAwKSAmIDB4ZmY7CisgICAgaWYgKChjb2xvcl9hID09IDAgfHwgY29sb3JfYSA9PSAweGZmKSAmJgorICAgICAgICAoY29sb3JfciA9PSAwIHx8IGNvbG9yX3IgPT0gMHhmZikgJiYKKyAgICAgICAgKGNvbG9yX2IgPT0gMCB8fCBjb2xvcl9iID09IDB4ZmYpKSB7CisgICAgICB0cml2aWFsX2F0X2VuZCA9IDE7CisgICAgfQorICB9CisKKyAgKmNvc3QgKz0KKyAgICAgIEdldENvbWJpbmVkRW50cm9weShhLT5yZWRfLCBiLT5yZWRfLCBOVU1fTElURVJBTF9DT0RFUywgdHJpdmlhbF9hdF9lbmQpOworICBpZiAoKmNvc3QgPiBjb3N0X3RocmVzaG9sZCkgcmV0dXJuIDA7CisKKyAgKmNvc3QgKz0KKyAgICAgIEdldENvbWJpbmVkRW50cm9weShhLT5ibHVlXywgYi0+Ymx1ZV8sIE5VTV9MSVRFUkFMX0NPREVTLCB0cml2aWFsX2F0X2VuZCk7CisgIGlmICgqY29zdCA+IGNvc3RfdGhyZXNob2xkKSByZXR1cm4gMDsKKworICAqY29zdCArPSBHZXRDb21iaW5lZEVudHJvcHkoYS0+YWxwaGFfLCBiLT5hbHBoYV8sIE5VTV9MSVRFUkFMX0NPREVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpdmlhbF9hdF9lbmQpOworICBpZiAoKmNvc3QgPiBjb3N0X3RocmVzaG9sZCkgcmV0dXJuIDA7CisKKyAgKmNvc3QgKz0KKyAgICAgIEdldENvbWJpbmVkRW50cm9weShhLT5kaXN0YW5jZV8sIGItPmRpc3RhbmNlXywgTlVNX0RJU1RBTkNFX0NPREVTLCAwKTsKKyAgKmNvc3QgKz0KKyAgICAgIFZQOExFeHRyYUNvc3RDb21iaW5lZChhLT5kaXN0YW5jZV8sIGItPmRpc3RhbmNlXywgTlVNX0RJU1RBTkNFX0NPREVTKTsKKyAgaWYgKCpjb3N0ID4gY29zdF90aHJlc2hvbGQpIHJldHVybiAwOworCisgIHJldHVybiAxOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBIaXN0b2dyYW1BZGQoY29uc3QgVlA4TEhpc3RvZ3JhbSogY29uc3QgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExIaXN0b2dyYW0qIGNvbnN0IG91dCkgeworICBWUDhMSGlzdG9ncmFtQWRkKGEsIGIsIG91dCk7CisgIG91dC0+dHJpdmlhbF9zeW1ib2xfID0gKGEtPnRyaXZpYWxfc3ltYm9sXyA9PSBiLT50cml2aWFsX3N5bWJvbF8pCisgICAgICAgICAgICAgICAgICAgICAgID8gYS0+dHJpdmlhbF9zeW1ib2xfCisgICAgICAgICAgICAgICAgICAgICAgIDogVlA4TF9OT05fVFJJVklBTF9TWU07Cit9CisKKy8vIFBlcmZvcm1zIG91dCA9IGEgKyBiLCBjb21wdXRpbmcgdGhlIGNvc3QgQyhhK2IpIC0gQyhhKSAtIEMoYikgd2hpbGUgY29tcGFyaW5nCisvLyB0byB0aGUgdGhyZXNob2xkIHZhbHVlICdjb3N0X3RocmVzaG9sZCcuIFRoZSBzY29yZSByZXR1cm5lZCBpcworLy8gIFNjb3JlID0gQyhhK2IpIC0gQyhhKSAtIEMoYiksIHdoZXJlIEMoYSkgKyBDKGIpIGlzIGtub3duIGFuZCBmaXhlZC4KKy8vIFNpbmNlIHRoZSBwcmV2aW91cyBzY29yZSBwYXNzZWQgaXMgJ2Nvc3RfdGhyZXNob2xkJywgd2Ugb25seSBuZWVkIHRvIGNvbXBhcmUKKy8vIHRoZSBwYXJ0aWFsIGNvc3QgYWdhaW5zdCAnY29zdF90aHJlc2hvbGQgKyBDKGEpICsgQyhiKScgdG8gcG9zc2libHkgYmFpbC1vdXQKKy8vIGVhcmx5Lgorc3RhdGljIGRvdWJsZSBIaXN0b2dyYW1BZGRFdmFsKGNvbnN0IFZQOExIaXN0b2dyYW0qIGNvbnN0IGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TEhpc3RvZ3JhbSogY29uc3QgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMSGlzdG9ncmFtKiBjb25zdCBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGNvc3RfdGhyZXNob2xkKSB7CisgIGRvdWJsZSBjb3N0ID0gMDsKKyAgY29uc3QgZG91YmxlIHN1bV9jb3N0ID0gYS0+Yml0X2Nvc3RfICsgYi0+Yml0X2Nvc3RfOworICBjb3N0X3RocmVzaG9sZCArPSBzdW1fY29zdDsKKworICBpZiAoR2V0Q29tYmluZWRIaXN0b2dyYW1FbnRyb3B5KGEsIGIsIGNvc3RfdGhyZXNob2xkLCAmY29zdCkpIHsKKyAgICBIaXN0b2dyYW1BZGQoYSwgYiwgb3V0KTsKKyAgICBvdXQtPmJpdF9jb3N0XyA9IGNvc3Q7CisgICAgb3V0LT5wYWxldHRlX2NvZGVfYml0c18gPSBhLT5wYWxldHRlX2NvZGVfYml0c187CisgIH0KKworICByZXR1cm4gY29zdCAtIHN1bV9jb3N0OworfQorCisvLyBTYW1lIGFzIEhpc3RvZ3JhbUFkZEV2YWwoKSwgZXhjZXB0IHRoYXQgdGhlIHJlc3VsdGluZyBoaXN0b2dyYW0KKy8vIGlzIG5vdCBzdG9yZWQuIE9ubHkgdGhlIGNvc3QgQyhhK2IpIC0gQyhhKSBpcyBldmFsdWF0ZWQuIFdlIG9taXQKKy8vIHRoZSB0ZXJtIEMoYikgd2hpY2ggaXMgY29uc3RhbnQgb3ZlciBhbGwgdGhlIGV2YWx1YXRpb25zLgorc3RhdGljIGRvdWJsZSBIaXN0b2dyYW1BZGRUaHJlc2goY29uc3QgVlA4TEhpc3RvZ3JhbSogY29uc3QgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOExIaXN0b2dyYW0qIGNvbnN0IGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgY29zdF90aHJlc2hvbGQpIHsKKyAgZG91YmxlIGNvc3QgPSAtYS0+Yml0X2Nvc3RfOworICBHZXRDb21iaW5lZEhpc3RvZ3JhbUVudHJvcHkoYSwgYiwgY29zdF90aHJlc2hvbGQsICZjb3N0KTsKKyAgcmV0dXJuIGNvc3Q7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRoZSBzdHJ1Y3R1cmUgdG8ga2VlcCB0cmFjayBvZiBjb3N0IHJhbmdlIGZvciB0aGUgdGhyZWUgZG9taW5hbnQgZW50cm9weQorLy8gc3ltYm9scy4KKy8vIFRPRE8oc2thbCk6IEV2YWx1YXRlIGlmIGZsb2F0IGNhbiBiZSB1c2VkIGhlcmUgaW5zdGVhZCBvZiBkb3VibGUgZm9yCisvLyByZXByZXNlbnRpbmcgdGhlIGVudHJvcHkgY29zdHMuCit0eXBlZGVmIHN0cnVjdCB7CisgIGRvdWJsZSBsaXRlcmFsX21heF87CisgIGRvdWJsZSBsaXRlcmFsX21pbl87CisgIGRvdWJsZSByZWRfbWF4XzsKKyAgZG91YmxlIHJlZF9taW5fOworICBkb3VibGUgYmx1ZV9tYXhfOworICBkb3VibGUgYmx1ZV9taW5fOworfSBEb21pbmFudENvc3RSYW5nZTsKKworc3RhdGljIHZvaWQgRG9taW5hbnRDb3N0UmFuZ2VJbml0KERvbWluYW50Q29zdFJhbmdlKiBjb25zdCBjKSB7CisgIGMtPmxpdGVyYWxfbWF4XyA9IDAuOworICBjLT5saXRlcmFsX21pbl8gPSBNQVhfQ09TVDsKKyAgYy0+cmVkX21heF8gPSAwLjsKKyAgYy0+cmVkX21pbl8gPSBNQVhfQ09TVDsKKyAgYy0+Ymx1ZV9tYXhfID0gMC47CisgIGMtPmJsdWVfbWluXyA9IE1BWF9DT1NUOworfQorCitzdGF0aWMgdm9pZCBVcGRhdGVEb21pbmFudENvc3RSYW5nZSgKKyAgICBjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBoLCBEb21pbmFudENvc3RSYW5nZSogY29uc3QgYykgeworICBpZiAoYy0+bGl0ZXJhbF9tYXhfIDwgaC0+bGl0ZXJhbF9jb3N0XykgYy0+bGl0ZXJhbF9tYXhfID0gaC0+bGl0ZXJhbF9jb3N0XzsKKyAgaWYgKGMtPmxpdGVyYWxfbWluXyA+IGgtPmxpdGVyYWxfY29zdF8pIGMtPmxpdGVyYWxfbWluXyA9IGgtPmxpdGVyYWxfY29zdF87CisgIGlmIChjLT5yZWRfbWF4XyA8IGgtPnJlZF9jb3N0XykgYy0+cmVkX21heF8gPSBoLT5yZWRfY29zdF87CisgIGlmIChjLT5yZWRfbWluXyA+IGgtPnJlZF9jb3N0XykgYy0+cmVkX21pbl8gPSBoLT5yZWRfY29zdF87CisgIGlmIChjLT5ibHVlX21heF8gPCBoLT5ibHVlX2Nvc3RfKSBjLT5ibHVlX21heF8gPSBoLT5ibHVlX2Nvc3RfOworICBpZiAoYy0+Ymx1ZV9taW5fID4gaC0+Ymx1ZV9jb3N0XykgYy0+Ymx1ZV9taW5fID0gaC0+Ymx1ZV9jb3N0XzsKK30KKworc3RhdGljIHZvaWQgVXBkYXRlSGlzdG9ncmFtQ29zdChWUDhMSGlzdG9ncmFtKiBjb25zdCBoKSB7CisgIHVpbnQzMl90IGFscGhhX3N5bSwgcmVkX3N5bSwgYmx1ZV9zeW07CisgIGNvbnN0IGRvdWJsZSBhbHBoYV9jb3N0ID0KKyAgICAgIFBvcHVsYXRpb25Db3N0KGgtPmFscGhhXywgTlVNX0xJVEVSQUxfQ09ERVMsICZhbHBoYV9zeW0pOworICBjb25zdCBkb3VibGUgZGlzdGFuY2VfY29zdCA9CisgICAgICBQb3B1bGF0aW9uQ29zdChoLT5kaXN0YW5jZV8sIE5VTV9ESVNUQU5DRV9DT0RFUywgTlVMTCkgKworICAgICAgVlA4TEV4dHJhQ29zdChoLT5kaXN0YW5jZV8sIE5VTV9ESVNUQU5DRV9DT0RFUyk7CisgIGNvbnN0IGludCBudW1fY29kZXMgPSBWUDhMSGlzdG9ncmFtTnVtQ29kZXMoaC0+cGFsZXR0ZV9jb2RlX2JpdHNfKTsKKyAgaC0+bGl0ZXJhbF9jb3N0XyA9IFBvcHVsYXRpb25Db3N0KGgtPmxpdGVyYWxfLCBudW1fY29kZXMsIE5VTEwpICsKKyAgICAgICAgICAgICAgICAgICAgIFZQOExFeHRyYUNvc3QoaC0+bGl0ZXJhbF8gKyBOVU1fTElURVJBTF9DT0RFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVNX0xFTkdUSF9DT0RFUyk7CisgIGgtPnJlZF9jb3N0XyA9IFBvcHVsYXRpb25Db3N0KGgtPnJlZF8sIE5VTV9MSVRFUkFMX0NPREVTLCAmcmVkX3N5bSk7CisgIGgtPmJsdWVfY29zdF8gPSBQb3B1bGF0aW9uQ29zdChoLT5ibHVlXywgTlVNX0xJVEVSQUxfQ09ERVMsICZibHVlX3N5bSk7CisgIGgtPmJpdF9jb3N0XyA9IGgtPmxpdGVyYWxfY29zdF8gKyBoLT5yZWRfY29zdF8gKyBoLT5ibHVlX2Nvc3RfICsKKyAgICAgICAgICAgICAgICAgYWxwaGFfY29zdCArIGRpc3RhbmNlX2Nvc3Q7CisgIGlmICgoYWxwaGFfc3ltIHwgcmVkX3N5bSB8IGJsdWVfc3ltKSA9PSBWUDhMX05PTl9UUklWSUFMX1NZTSkgeworICAgIGgtPnRyaXZpYWxfc3ltYm9sXyA9IFZQOExfTk9OX1RSSVZJQUxfU1lNOworICB9IGVsc2UgeworICAgIGgtPnRyaXZpYWxfc3ltYm9sXyA9CisgICAgICAgICgodWludDMyX3QpYWxwaGFfc3ltIDw8IDI0KSB8IChyZWRfc3ltIDw8IDE2KSB8IChibHVlX3N5bSA8PCAwKTsKKyAgfQorfQorCitzdGF0aWMgaW50IEdldEJpbklkRm9yRW50cm9weShkb3VibGUgbWluLCBkb3VibGUgbWF4LCBkb3VibGUgdmFsKSB7CisgIGNvbnN0IGRvdWJsZSByYW5nZSA9IG1heCAtIG1pbjsKKyAgaWYgKHJhbmdlID4gMC4pIHsKKyAgICBjb25zdCBkb3VibGUgZGVsdGEgPSB2YWwgLSBtaW47CisgICAgcmV0dXJuIChpbnQpKChOVU1fUEFSVElUSU9OUyAtIDFlLTYpICogZGVsdGEgLyByYW5nZSk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIDA7CisgIH0KK30KKworc3RhdGljIGludCBHZXRIaXN0b0JpbkluZGV4KGNvbnN0IFZQOExIaXN0b2dyYW0qIGNvbnN0IGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRG9taW5hbnRDb3N0UmFuZ2UqIGNvbnN0IGMsIGludCBsb3dfZWZmb3J0KSB7CisgIGludCBiaW5faWQgPSBHZXRCaW5JZEZvckVudHJvcHkoYy0+bGl0ZXJhbF9taW5fLCBjLT5saXRlcmFsX21heF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+bGl0ZXJhbF9jb3N0Xyk7CisgIGFzc2VydChiaW5faWQgPCBOVU1fUEFSVElUSU9OUyk7CisgIGlmICghbG93X2VmZm9ydCkgeworICAgIGJpbl9pZCA9IGJpbl9pZCAqIE5VTV9QQVJUSVRJT05TCisgICAgICAgICAgICsgR2V0QmluSWRGb3JFbnRyb3B5KGMtPnJlZF9taW5fLCBjLT5yZWRfbWF4XywgaC0+cmVkX2Nvc3RfKTsKKyAgICBiaW5faWQgPSBiaW5faWQgKiBOVU1fUEFSVElUSU9OUworICAgICAgICAgICArIEdldEJpbklkRm9yRW50cm9weShjLT5ibHVlX21pbl8sIGMtPmJsdWVfbWF4XywgaC0+Ymx1ZV9jb3N0Xyk7CisgICAgYXNzZXJ0KGJpbl9pZCA8IEJJTl9TSVpFKTsKKyAgfQorICByZXR1cm4gYmluX2lkOworfQorCisvLyBDb25zdHJ1Y3QgdGhlIGhpc3RvZ3JhbXMgZnJvbSBiYWNrd2FyZCByZWZlcmVuY2VzLgorc3RhdGljIHZvaWQgSGlzdG9ncmFtQnVpbGQoCisgICAgaW50IHhzaXplLCBpbnQgaGlzdG9fYml0cywgY29uc3QgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgYmFja3dhcmRfcmVmcywKKyAgICBWUDhMSGlzdG9ncmFtU2V0KiBjb25zdCBpbWFnZV9oaXN0bykgeworICBpbnQgeCA9IDAsIHkgPSAwOworICBjb25zdCBpbnQgaGlzdG9feHNpemUgPSBWUDhMU3ViU2FtcGxlU2l6ZSh4c2l6ZSwgaGlzdG9fYml0cyk7CisgIFZQOExIaXN0b2dyYW0qKiBjb25zdCBoaXN0b2dyYW1zID0gaW1hZ2VfaGlzdG8tPmhpc3RvZ3JhbXM7CisgIFZQOExSZWZzQ3Vyc29yIGMgPSBWUDhMUmVmc0N1cnNvckluaXQoYmFja3dhcmRfcmVmcyk7CisgIGFzc2VydChoaXN0b19iaXRzID4gMCk7CisgIHdoaWxlIChWUDhMUmVmc0N1cnNvck9rKCZjKSkgeworICAgIGNvbnN0IFBpeE9yQ29weSogY29uc3QgdiA9IGMuY3VyX3BvczsKKyAgICBjb25zdCBpbnQgaXggPSAoeSA+PiBoaXN0b19iaXRzKSAqIGhpc3RvX3hzaXplICsgKHggPj4gaGlzdG9fYml0cyk7CisgICAgVlA4TEhpc3RvZ3JhbUFkZFNpbmdsZVBpeE9yQ29weShoaXN0b2dyYW1zW2l4XSwgdiwgTlVMTCwgMCk7CisgICAgeCArPSBQaXhPckNvcHlMZW5ndGgodik7CisgICAgd2hpbGUgKHggPj0geHNpemUpIHsKKyAgICAgIHggLT0geHNpemU7CisgICAgICArK3k7CisgICAgfQorICAgIFZQOExSZWZzQ3Vyc29yTmV4dCgmYyk7CisgIH0KK30KKworLy8gQ29waWVzIHRoZSBoaXN0b2dyYW1zIGFuZCBjb21wdXRlcyBpdHMgYml0X2Nvc3QuCitzdGF0aWMgdm9pZCBIaXN0b2dyYW1Db3B5QW5kQW5hbHl6ZSgKKyAgICBWUDhMSGlzdG9ncmFtU2V0KiBjb25zdCBvcmlnX2hpc3RvLCBWUDhMSGlzdG9ncmFtU2V0KiBjb25zdCBpbWFnZV9oaXN0bykgeworICBpbnQgaTsKKyAgY29uc3QgaW50IGhpc3RvX3NpemUgPSBvcmlnX2hpc3RvLT5zaXplOworICBWUDhMSGlzdG9ncmFtKiogY29uc3Qgb3JpZ19oaXN0b2dyYW1zID0gb3JpZ19oaXN0by0+aGlzdG9ncmFtczsKKyAgVlA4TEhpc3RvZ3JhbSoqIGNvbnN0IGhpc3RvZ3JhbXMgPSBpbWFnZV9oaXN0by0+aGlzdG9ncmFtczsKKyAgZm9yIChpID0gMDsgaSA8IGhpc3RvX3NpemU7ICsraSkgeworICAgIFZQOExIaXN0b2dyYW0qIGNvbnN0IGhpc3RvID0gb3JpZ19oaXN0b2dyYW1zW2ldOworICAgIFVwZGF0ZUhpc3RvZ3JhbUNvc3QoaGlzdG8pOworICAgIC8vIENvcHkgaGlzdG9ncmFtcyBmcm9tIG9yaWdfaGlzdG9bXSB0byBpbWFnZV9oaXN0b1tdLgorICAgIEhpc3RvZ3JhbUNvcHkoaGlzdG8sIGhpc3RvZ3JhbXNbaV0pOworICB9Cit9CisKKy8vIFBhcnRpdGlvbiBoaXN0b2dyYW1zIHRvIGRpZmZlcmVudCBlbnRyb3B5IGJpbnMgZm9yIHRocmVlIGRvbWluYW50IChsaXRlcmFsLAorLy8gcmVkIGFuZCBibHVlKSBzeW1ib2wgY29zdHMgYW5kIGNvbXB1dGUgdGhlIGhpc3RvZ3JhbSBhZ2dyZWdhdGUgYml0X2Nvc3QuCitzdGF0aWMgdm9pZCBIaXN0b2dyYW1BbmFseXplRW50cm9weUJpbihWUDhMSGlzdG9ncmFtU2V0KiBjb25zdCBpbWFnZV9oaXN0bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBjb25zdCBiaW5fbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxvd19lZmZvcnQpIHsKKyAgaW50IGk7CisgIFZQOExIaXN0b2dyYW0qKiBjb25zdCBoaXN0b2dyYW1zID0gaW1hZ2VfaGlzdG8tPmhpc3RvZ3JhbXM7CisgIGNvbnN0IGludCBoaXN0b19zaXplID0gaW1hZ2VfaGlzdG8tPnNpemU7CisgIERvbWluYW50Q29zdFJhbmdlIGNvc3RfcmFuZ2U7CisgIERvbWluYW50Q29zdFJhbmdlSW5pdCgmY29zdF9yYW5nZSk7CisKKyAgLy8gQW5hbHl6ZSB0aGUgZG9taW5hbnQgKGxpdGVyYWwsIHJlZCBhbmQgYmx1ZSkgZW50cm9weSBjb3N0cy4KKyAgZm9yIChpID0gMDsgaSA8IGhpc3RvX3NpemU7ICsraSkgeworICAgIFVwZGF0ZURvbWluYW50Q29zdFJhbmdlKGhpc3RvZ3JhbXNbaV0sICZjb3N0X3JhbmdlKTsKKyAgfQorCisgIC8vIGJpbi1oYXNoIGhpc3RvZ3JhbXMgb24gdGhyZWUgb2YgdGhlIGRvbWluYW50IChsaXRlcmFsLCByZWQgYW5kIGJsdWUpCisgIC8vIHN5bWJvbCBjb3N0cyBhbmQgc3RvcmUgdGhlIHJlc3VsdGluZyBiaW5faWQgZm9yIGVhY2ggaGlzdG9ncmFtLgorICBmb3IgKGkgPSAwOyBpIDwgaGlzdG9fc2l6ZTsgKytpKSB7CisgICAgYmluX21hcFtpXSA9IEdldEhpc3RvQmluSW5kZXgoaGlzdG9ncmFtc1tpXSwgJmNvc3RfcmFuZ2UsIGxvd19lZmZvcnQpOworICB9Cit9CisKKy8vIENvbXBhY3QgaW1hZ2VfaGlzdG9bXSBieSBtZXJnaW5nIHNvbWUgaGlzdG9ncmFtcyB3aXRoIHNhbWUgYmluX2lkIHRvZ2V0aGVyIGlmCisvLyBpdCdzIGFkdmFudGFnZW91cy4KK3N0YXRpYyB2b2lkIEhpc3RvZ3JhbUNvbWJpbmVFbnRyb3B5QmluKFZQOExIaXN0b2dyYW1TZXQqIGNvbnN0IGltYWdlX2hpc3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEhpc3RvZ3JhbSogY3VyX2NvbWJvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QqIGNvbnN0IGJpbl9tYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmluX21hcF9zaXplLCBpbnQgbnVtX2JpbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgY29tYmluZV9jb3N0X2ZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb3dfZWZmb3J0KSB7CisgIFZQOExIaXN0b2dyYW0qKiBjb25zdCBoaXN0b2dyYW1zID0gaW1hZ2VfaGlzdG8tPmhpc3RvZ3JhbXM7CisgIGludCBpZHg7CisgIC8vIFdvcmsgaW4tcGxhY2U6IHByb2Nlc3NlZCBoaXN0b2dyYW1zIGFyZSBwdXQgYXQgdGhlIGJlZ2lubmluZyBvZgorICAvLyBpbWFnZV9oaXN0b1tdLiBBdCB0aGUgZW5kLCB3ZSBqdXN0IGhhdmUgdG8gdHJ1bmNhdGUgdGhlIGFycmF5LgorICBpbnQgc2l6ZSA9IDA7CisgIHN0cnVjdCB7CisgICAgaW50MTZfdCBmaXJzdDsgICAgLy8gcG9zaXRpb24gb2YgdGhlIGhpc3RvZ3JhbSB0aGF0IGFjY3VtdWxhdGVzIGFsbAorICAgICAgICAgICAgICAgICAgICAgIC8vIGhpc3RvZ3JhbXMgd2l0aCB0aGUgc2FtZSBiaW5faWQKKyAgICB1aW50MTZfdCBudW1fY29tYmluZV9mYWlsdXJlczsgICAvLyBudW1iZXIgb2YgY29tYmluZSBmYWlsdXJlcyBwZXIgYmluX2lkCisgIH0gYmluX2luZm9bQklOX1NJWkVdOworCisgIGFzc2VydChudW1fYmlucyA8PSBCSU5fU0laRSk7CisgIGZvciAoaWR4ID0gMDsgaWR4IDwgbnVtX2JpbnM7ICsraWR4KSB7CisgICAgYmluX2luZm9baWR4XS5maXJzdCA9IC0xOworICAgIGJpbl9pbmZvW2lkeF0ubnVtX2NvbWJpbmVfZmFpbHVyZXMgPSAwOworICB9CisKKyAgZm9yIChpZHggPSAwOyBpZHggPCBiaW5fbWFwX3NpemU7ICsraWR4KSB7CisgICAgY29uc3QgaW50IGJpbl9pZCA9IGJpbl9tYXBbaWR4XTsKKyAgICBjb25zdCBpbnQgZmlyc3QgPSBiaW5faW5mb1tiaW5faWRdLmZpcnN0OworICAgIGFzc2VydChzaXplIDw9IGlkeCk7CisgICAgaWYgKGZpcnN0ID09IC0xKSB7CisgICAgICAvLyBqdXN0IG1vdmUgaGlzdG9ncmFtICNpZHggdG8gaXRzIGZpbmFsIHBvc2l0aW9uCisgICAgICBoaXN0b2dyYW1zW3NpemVdID0gaGlzdG9ncmFtc1tpZHhdOworICAgICAgYmluX2luZm9bYmluX2lkXS5maXJzdCA9IHNpemUrKzsKKyAgICB9IGVsc2UgaWYgKGxvd19lZmZvcnQpIHsKKyAgICAgIEhpc3RvZ3JhbUFkZChoaXN0b2dyYW1zW2lkeF0sIGhpc3RvZ3JhbXNbZmlyc3RdLCBoaXN0b2dyYW1zW2ZpcnN0XSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIHRyeSB0byBtZXJnZSAjaWR4IGludG8gI2ZpcnN0IChib3RoIHNoYXJlIHRoZSBzYW1lIGJpbl9pZCkKKyAgICAgIGNvbnN0IGRvdWJsZSBiaXRfY29zdCA9IGhpc3RvZ3JhbXNbaWR4XS0+Yml0X2Nvc3RfOworICAgICAgY29uc3QgZG91YmxlIGJpdF9jb3N0X3RocmVzaCA9IC1iaXRfY29zdCAqIGNvbWJpbmVfY29zdF9mYWN0b3I7CisgICAgICBjb25zdCBkb3VibGUgY3Vycl9jb3N0X2RpZmYgPQorICAgICAgICAgIEhpc3RvZ3JhbUFkZEV2YWwoaGlzdG9ncmFtc1tmaXJzdF0sIGhpc3RvZ3JhbXNbaWR4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9jb21ibywgYml0X2Nvc3RfdGhyZXNoKTsKKyAgICAgIGlmIChjdXJyX2Nvc3RfZGlmZiA8IGJpdF9jb3N0X3RocmVzaCkgeworICAgICAgICAvLyBUcnkgdG8gbWVyZ2UgdHdvIGhpc3RvZ3JhbXMgb25seSBpZiB0aGUgY29tYm8gaXMgYSB0cml2aWFsIG9uZSBvcgorICAgICAgICAvLyB0aGUgdHdvIGNhbmRpZGF0ZSBoaXN0b2dyYW1zIGFyZSBhbHJlYWR5IG5vbi10cml2aWFsLgorICAgICAgICAvLyBGb3Igc29tZSBpbWFnZXMsICd0cnlfY29tYmluZScgdHVybnMgb3V0IHRvIGJlIGZhbHNlIGZvciBhIGxvdCBvZgorICAgICAgICAvLyBoaXN0b2dyYW0gcGFpcnMuIEluIHRoYXQgY2FzZSwgd2UgZmFsbGJhY2sgdG8gY29tYmluaW5nCisgICAgICAgIC8vIGhpc3RvZ3JhbXMgYXMgdXN1YWwgdG8gYXZvaWQgaW5jcmVhc2luZyB0aGUgaGVhZGVyIHNpemUuCisgICAgICAgIGNvbnN0IGludCB0cnlfY29tYmluZSA9CisgICAgICAgICAgICAoY3VyX2NvbWJvLT50cml2aWFsX3N5bWJvbF8gIT0gVlA4TF9OT05fVFJJVklBTF9TWU0pIHx8CisgICAgICAgICAgICAoKGhpc3RvZ3JhbXNbaWR4XS0+dHJpdmlhbF9zeW1ib2xfID09IFZQOExfTk9OX1RSSVZJQUxfU1lNKSAmJgorICAgICAgICAgICAgIChoaXN0b2dyYW1zW2ZpcnN0XS0+dHJpdmlhbF9zeW1ib2xfID09IFZQOExfTk9OX1RSSVZJQUxfU1lNKSk7CisgICAgICAgIGNvbnN0IGludCBtYXhfY29tYmluZV9mYWlsdXJlcyA9IDMyOworICAgICAgICBpZiAodHJ5X2NvbWJpbmUgfHwKKyAgICAgICAgICAgIGJpbl9pbmZvW2Jpbl9pZF0ubnVtX2NvbWJpbmVfZmFpbHVyZXMgPj0gbWF4X2NvbWJpbmVfZmFpbHVyZXMpIHsKKyAgICAgICAgICAvLyBtb3ZlIHRoZSAoYmV0dGVyKSBtZXJnZWQgaGlzdG9ncmFtIHRvIGl0cyBmaW5hbCBzbG90CisgICAgICAgICAgSGlzdG9ncmFtU3dhcCgmY3VyX2NvbWJvLCAmaGlzdG9ncmFtc1tmaXJzdF0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGhpc3RvZ3JhbXNbc2l6ZSsrXSA9IGhpc3RvZ3JhbXNbaWR4XTsKKyAgICAgICAgICArK2Jpbl9pbmZvW2Jpbl9pZF0ubnVtX2NvbWJpbmVfZmFpbHVyZXM7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGhpc3RvZ3JhbXNbc2l6ZSsrXSA9IGhpc3RvZ3JhbXNbaWR4XTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaW1hZ2VfaGlzdG8tPnNpemUgPSBzaXplOworICBpZiAobG93X2VmZm9ydCkgeworICAgIC8vIGZvciBsb3dfZWZmb3J0IGNhc2UsIHVwZGF0ZSB0aGUgZmluYWwgY29zdCB3aGVuIGV2ZXJ5dGhpbmcgaXMgbWVyZ2VkCisgICAgZm9yIChpZHggPSAwOyBpZHggPCBzaXplOyArK2lkeCkgeworICAgICAgVXBkYXRlSGlzdG9ncmFtQ29zdChoaXN0b2dyYW1zW2lkeF0pOworICAgIH0KKyAgfQorfQorCisvLyBJbXBsZW1lbnQgYSBMZWhtZXIgcmFuZG9tIG51bWJlciBnZW5lcmF0b3Igd2l0aCBhIG11bHRpcGxpY2F0aXZlIGNvbnN0YW50IG9mCisvLyA0ODI3MSBhbmQgYSBtb2R1bG8gY29uc3RhbnQgb2YgMl4zMSAtIDEuCitzdGF0aWMgdWludDMyX3QgTXlSYW5kKHVpbnQzMl90KiBjb25zdCBzZWVkKSB7CisgICpzZWVkID0gKHVpbnQzMl90KSgoKHVpbnQ2NF90KSgqc2VlZCkgKiA0ODI3MXUpICUgMjE0NzQ4MzY0N3UpOworICBhc3NlcnQoKnNlZWQgPiAwKTsKKyAgcmV0dXJuICpzZWVkOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGlzdG9ncmFtIHBhaXJzIHByaW9yaXR5IHF1ZXVlCisKKy8vIFBhaXIgb2YgaGlzdG9ncmFtcy4gTmVnYXRpdmUgaWR4MSB2YWx1ZSBtZWFucyB0aGF0IHBhaXIgaXMgb3V0LW9mLWRhdGUuCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCBpZHgxOworICBpbnQgaWR4MjsKKyAgZG91YmxlIGNvc3RfZGlmZjsKKyAgZG91YmxlIGNvc3RfY29tYm87Cit9IEhpc3RvZ3JhbVBhaXI7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgSGlzdG9ncmFtUGFpciogcXVldWU7CisgIGludCBzaXplOworICBpbnQgbWF4X3NpemU7Cit9IEhpc3RvUXVldWU7CisKK3N0YXRpYyBpbnQgSGlzdG9RdWV1ZUluaXQoSGlzdG9RdWV1ZSogY29uc3QgaGlzdG9fcXVldWUsIGNvbnN0IGludCBtYXhfaW5kZXgpIHsKKyAgaGlzdG9fcXVldWUtPnNpemUgPSAwOworICAvLyBtYXhfaW5kZXheMiBmb3IgdGhlIHF1ZXVlIHNpemUgaXMgc2FmZS4gSWYgeW91IGxvb2sgYXQKKyAgLy8gSGlzdG9ncmFtQ29tYmluZUdyZWVkeSwgYW5kIGltYWdpbmUgdGhhdCBVcGRhdGVRdWV1ZUZyb250IGFsd2F5cyBwdXNoZXMKKyAgLy8gZGF0YSB0byB0aGUgcXVldWUsIHlvdSBpbnNlcnQgYXQgbW9zdDoKKyAgLy8gLSBtYXhfaW5kZXgqKG1heF9pbmRleC0xKS8yICh0aGUgZmlyc3QgdHdvIGZvciBsb29wcykKKyAgLy8gLSBtYXhfaW5kZXggLSAxIGluIHRoZSBsYXN0IGZvciBsb29wIGF0IHRoZSBmaXJzdCBpdGVyYXRpb24gb2YgdGhlIHdoaWxlCisgIC8vICAgbG9vcCwgbWF4X2luZGV4IC0gMiBhdCB0aGUgc2Vjb25kIGl0ZXJhdGlvbiAuLi4gdGhlcmVmb3JlCisgIC8vICAgbWF4X2luZGV4KihtYXhfaW5kZXgtMSkvMiBvdmVyYWxsIHRvbworICBoaXN0b19xdWV1ZS0+bWF4X3NpemUgPSBtYXhfaW5kZXggKiBtYXhfaW5kZXg7CisgIC8vIFdlIGFsbG9jYXRlIG1heF9zaXplICsgMSBiZWNhdXNlIHRoZSBsYXN0IGVsZW1lbnQgYXQgaW5kZXggInNpemUiIGlzCisgIC8vIHVzZWQgYXMgdGVtcG9yYXJ5IGRhdGEgKGFuZCBpdCBjb3VsZCBiZSB1cCB0byBtYXhfc2l6ZSkuCisgIGhpc3RvX3F1ZXVlLT5xdWV1ZSA9IChIaXN0b2dyYW1QYWlyKilXZWJQU2FmZU1hbGxvYygKKyAgICAgIGhpc3RvX3F1ZXVlLT5tYXhfc2l6ZSArIDEsIHNpemVvZigqaGlzdG9fcXVldWUtPnF1ZXVlKSk7CisgIHJldHVybiBoaXN0b19xdWV1ZS0+cXVldWUgIT0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgSGlzdG9RdWV1ZUNsZWFyKEhpc3RvUXVldWUqIGNvbnN0IGhpc3RvX3F1ZXVlKSB7CisgIGFzc2VydChoaXN0b19xdWV1ZSAhPSBOVUxMKTsKKyAgV2ViUFNhZmVGcmVlKGhpc3RvX3F1ZXVlLT5xdWV1ZSk7CisgIGhpc3RvX3F1ZXVlLT5zaXplID0gMDsKKyAgaGlzdG9fcXVldWUtPm1heF9zaXplID0gMDsKK30KKworLy8gUG9wIGEgc3BlY2lmaWMgcGFpciBpbiB0aGUgcXVldWUgYnkgcmVwbGFjaW5nIGl0IHdpdGggdGhlIGxhc3Qgb25lCisvLyBhbmQgc2hyaW5raW5nIHRoZSBxdWV1ZS4KK3N0YXRpYyB2b2lkIEhpc3RvUXVldWVQb3BQYWlyKEhpc3RvUXVldWUqIGNvbnN0IGhpc3RvX3F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlzdG9ncmFtUGFpciogY29uc3QgcGFpcikgeworICBhc3NlcnQocGFpciA+PSBoaXN0b19xdWV1ZS0+cXVldWUgJiYKKyAgICAgICAgIHBhaXIgPCAoaGlzdG9fcXVldWUtPnF1ZXVlICsgaGlzdG9fcXVldWUtPnNpemUpKTsKKyAgYXNzZXJ0KGhpc3RvX3F1ZXVlLT5zaXplID4gMCk7CisgICpwYWlyID0gaGlzdG9fcXVldWUtPnF1ZXVlW2hpc3RvX3F1ZXVlLT5zaXplIC0gMV07CisgIC0taGlzdG9fcXVldWUtPnNpemU7Cit9CisKKy8vIENoZWNrIHdoZXRoZXIgYSBwYWlyIGluIHRoZSBxdWV1ZSBzaG91bGQgYmUgdXBkYXRlZCBhcyBoZWFkIG9yIG5vdC4KK3N0YXRpYyB2b2lkIEhpc3RvUXVldWVVcGRhdGVIZWFkKEhpc3RvUXVldWUqIGNvbnN0IGhpc3RvX3F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlzdG9ncmFtUGFpciogY29uc3QgcGFpcikgeworICBhc3NlcnQocGFpci0+Y29zdF9kaWZmIDwgMC4pOworICBhc3NlcnQocGFpciA+PSBoaXN0b19xdWV1ZS0+cXVldWUgJiYKKyAgICAgICAgIHBhaXIgPCAoaGlzdG9fcXVldWUtPnF1ZXVlICsgaGlzdG9fcXVldWUtPnNpemUpKTsKKyAgYXNzZXJ0KGhpc3RvX3F1ZXVlLT5zaXplID4gMCk7CisgIGlmIChwYWlyLT5jb3N0X2RpZmYgPCBoaXN0b19xdWV1ZS0+cXVldWVbMF0uY29zdF9kaWZmKSB7CisgICAgLy8gUmVwbGFjZSB0aGUgYmVzdCBwYWlyLgorICAgIGNvbnN0IEhpc3RvZ3JhbVBhaXIgdG1wID0gaGlzdG9fcXVldWUtPnF1ZXVlWzBdOworICAgIGhpc3RvX3F1ZXVlLT5xdWV1ZVswXSA9ICpwYWlyOworICAgICpwYWlyID0gdG1wOworICB9Cit9CisKKy8vIENyZWF0ZSBhIHBhaXIgZnJvbSBpbmRpY2VzICJpZHgxIiBhbmQgImlkeDIiIHByb3ZpZGVkIGl0cyBjb3N0CisvLyBpcyBpbmZlcmlvciB0byAidGhyZXNob2xkIiwgYSBuZWdhdGl2ZSBlbnRyb3B5LgorLy8gSXQgcmV0dXJucyB0aGUgY29zdCBvZiB0aGUgcGFpciwgb3IgMC4gaWYgaXQgc3VwZXJpb3IgdG8gdGhyZXNob2xkLgorc3RhdGljIGRvdWJsZSBIaXN0b1F1ZXVlUHVzaChIaXN0b1F1ZXVlKiBjb25zdCBoaXN0b19xdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEhpc3RvZ3JhbSoqIGNvbnN0IGhpc3RvZ3JhbXMsIGludCBpZHgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWR4MiwgZG91YmxlIHRocmVzaG9sZCkgeworICBjb25zdCBWUDhMSGlzdG9ncmFtKiBoMTsKKyAgY29uc3QgVlA4TEhpc3RvZ3JhbSogaDI7CisgIEhpc3RvZ3JhbVBhaXIgcGFpcjsKKyAgZG91YmxlIHN1bV9jb3N0OworCisgIGFzc2VydCh0aHJlc2hvbGQgPD0gMC4pOworICBpZiAoaWR4MSA+IGlkeDIpIHsKKyAgICBjb25zdCBpbnQgdG1wID0gaWR4MjsKKyAgICBpZHgyID0gaWR4MTsKKyAgICBpZHgxID0gdG1wOworICB9CisgIHBhaXIuaWR4MSA9IGlkeDE7CisgIHBhaXIuaWR4MiA9IGlkeDI7CisgIGgxID0gaGlzdG9ncmFtc1tpZHgxXTsKKyAgaDIgPSBoaXN0b2dyYW1zW2lkeDJdOworICBzdW1fY29zdCA9IGgxLT5iaXRfY29zdF8gKyBoMi0+Yml0X2Nvc3RfOworICBwYWlyLmNvc3RfY29tYm8gPSAwLjsKKyAgR2V0Q29tYmluZWRIaXN0b2dyYW1FbnRyb3B5KGgxLCBoMiwgc3VtX2Nvc3QgKyB0aHJlc2hvbGQsICZwYWlyLmNvc3RfY29tYm8pOworICBwYWlyLmNvc3RfZGlmZiA9IHBhaXIuY29zdF9jb21ibyAtIHN1bV9jb3N0OworCisgIC8vIERvIG5vdCBldmVuIGNvbnNpZGVyIHRoZSBwYWlyIGlmIGl0IGRvZXMgbm90IGltcHJvdmUgdGhlIGVudHJvcHkuCisgIGlmIChwYWlyLmNvc3RfZGlmZiA+PSB0aHJlc2hvbGQpIHJldHVybiAwLjsKKworICAvLyBXZSBjYW5ub3QgYWRkIG1vcmUgZWxlbWVudHMgdGhhbiB0aGUgY2FwYWNpdHkuCisgIGFzc2VydChoaXN0b19xdWV1ZS0+c2l6ZSA8IGhpc3RvX3F1ZXVlLT5tYXhfc2l6ZSk7CisgIGhpc3RvX3F1ZXVlLT5xdWV1ZVtoaXN0b19xdWV1ZS0+c2l6ZSsrXSA9IHBhaXI7CisgIEhpc3RvUXVldWVVcGRhdGVIZWFkKGhpc3RvX3F1ZXVlLCAmaGlzdG9fcXVldWUtPnF1ZXVlW2hpc3RvX3F1ZXVlLT5zaXplIC0gMV0pOworCisgIHJldHVybiBwYWlyLmNvc3RfZGlmZjsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gQ29tYmluZXMgaGlzdG9ncmFtcyBieSBjb250aW51b3VzbHkgY2hvb3NpbmcgdGhlIG9uZSB3aXRoIHRoZSBoaWdoZXN0IGNvc3QKKy8vIHJlZHVjdGlvbi4KK3N0YXRpYyBpbnQgSGlzdG9ncmFtQ29tYmluZUdyZWVkeShWUDhMSGlzdG9ncmFtU2V0KiBjb25zdCBpbWFnZV9oaXN0bykgeworICBpbnQgb2sgPSAwOworICBpbnQgaW1hZ2VfaGlzdG9fc2l6ZSA9IGltYWdlX2hpc3RvLT5zaXplOworICBpbnQgaSwgajsKKyAgVlA4TEhpc3RvZ3JhbSoqIGNvbnN0IGhpc3RvZ3JhbXMgPSBpbWFnZV9oaXN0by0+aGlzdG9ncmFtczsKKyAgLy8gSW5kZXhlcyBvZiByZW1haW5pbmcgaGlzdG9ncmFtcy4KKyAgaW50KiBjb25zdCBjbHVzdGVycyA9CisgICAgICAoaW50KilXZWJQU2FmZU1hbGxvYyhpbWFnZV9oaXN0b19zaXplLCBzaXplb2YoKmNsdXN0ZXJzKSk7CisgIC8vIFByaW9yaXR5IHF1ZXVlIG9mIGhpc3RvZ3JhbSBwYWlycy4KKyAgSGlzdG9RdWV1ZSBoaXN0b19xdWV1ZTsKKworICBpZiAoIUhpc3RvUXVldWVJbml0KCZoaXN0b19xdWV1ZSwgaW1hZ2VfaGlzdG9fc2l6ZSkgfHwgY2x1c3RlcnMgPT0gTlVMTCkgeworICAgIGdvdG8gRW5kOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IGltYWdlX2hpc3RvX3NpemU7ICsraSkgeworICAgIC8vIEluaXRpYWxpemUgY2x1c3RlcnMgaW5kZXhlcy4KKyAgICBjbHVzdGVyc1tpXSA9IGk7CisgICAgZm9yIChqID0gaSArIDE7IGogPCBpbWFnZV9oaXN0b19zaXplOyArK2opIHsKKyAgICAgIC8vIEluaXRpYWxpemUgcG9zaXRpb25zIGFycmF5LgorICAgICAgSGlzdG9RdWV1ZVB1c2goJmhpc3RvX3F1ZXVlLCBoaXN0b2dyYW1zLCBpLCBqLCAwLik7CisgICAgfQorICB9CisKKyAgd2hpbGUgKGltYWdlX2hpc3RvX3NpemUgPiAxICYmIGhpc3RvX3F1ZXVlLnNpemUgPiAwKSB7CisgICAgY29uc3QgaW50IGlkeDEgPSBoaXN0b19xdWV1ZS5xdWV1ZVswXS5pZHgxOworICAgIGNvbnN0IGludCBpZHgyID0gaGlzdG9fcXVldWUucXVldWVbMF0uaWR4MjsKKyAgICBIaXN0b2dyYW1BZGQoaGlzdG9ncmFtc1tpZHgyXSwgaGlzdG9ncmFtc1tpZHgxXSwgaGlzdG9ncmFtc1tpZHgxXSk7CisgICAgaGlzdG9ncmFtc1tpZHgxXS0+Yml0X2Nvc3RfID0gaGlzdG9fcXVldWUucXVldWVbMF0uY29zdF9jb21ibzsKKyAgICAvLyBSZW1vdmUgbWVyZ2VkIGhpc3RvZ3JhbS4KKyAgICBmb3IgKGkgPSAwOyBpICsgMSA8IGltYWdlX2hpc3RvX3NpemU7ICsraSkgeworICAgICAgaWYgKGNsdXN0ZXJzW2ldID49IGlkeDIpIHsKKyAgICAgICAgY2x1c3RlcnNbaV0gPSBjbHVzdGVyc1tpICsgMV07CisgICAgICB9CisgICAgfQorICAgIC0taW1hZ2VfaGlzdG9fc2l6ZTsKKworICAgIC8vIFJlbW92ZSBwYWlycyBpbnRlcnNlY3RpbmcgdGhlIGp1c3QgY29tYmluZWQgYmVzdCBwYWlyLgorICAgIGZvciAoaSA9IDA7IGkgPCBoaXN0b19xdWV1ZS5zaXplOykgeworICAgICAgSGlzdG9ncmFtUGFpciogY29uc3QgcCA9IGhpc3RvX3F1ZXVlLnF1ZXVlICsgaTsKKyAgICAgIGlmIChwLT5pZHgxID09IGlkeDEgfHwgcC0+aWR4MiA9PSBpZHgxIHx8CisgICAgICAgICAgcC0+aWR4MSA9PSBpZHgyIHx8IHAtPmlkeDIgPT0gaWR4MikgeworICAgICAgICBIaXN0b1F1ZXVlUG9wUGFpcigmaGlzdG9fcXVldWUsIHApOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgSGlzdG9RdWV1ZVVwZGF0ZUhlYWQoJmhpc3RvX3F1ZXVlLCBwKTsKKyAgICAgICAgKytpOworICAgICAgfQorICAgIH0KKworICAgIC8vIFB1c2ggbmV3IHBhaXJzIGZvcm1lZCB3aXRoIGNvbWJpbmVkIGhpc3RvZ3JhbSB0byB0aGUgcXVldWUuCisgICAgZm9yIChpID0gMDsgaSA8IGltYWdlX2hpc3RvX3NpemU7ICsraSkgeworICAgICAgaWYgKGNsdXN0ZXJzW2ldICE9IGlkeDEpIHsKKyAgICAgICAgSGlzdG9RdWV1ZVB1c2goJmhpc3RvX3F1ZXVlLCBoaXN0b2dyYW1zLCBpZHgxLCBjbHVzdGVyc1tpXSwgMC4pOworICAgICAgfQorICAgIH0KKyAgfQorICAvLyBNb3ZlIHJlbWFpbmluZyBoaXN0b2dyYW1zIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5LgorICBmb3IgKGkgPSAwOyBpIDwgaW1hZ2VfaGlzdG9fc2l6ZTsgKytpKSB7CisgICAgaWYgKGkgIT0gY2x1c3RlcnNbaV0pIHsgIC8vIHN3YXAgdGhlIHR3byBoaXN0b2dyYW1zCisgICAgICBIaXN0b2dyYW1Td2FwKCZoaXN0b2dyYW1zW2ldLCAmaGlzdG9ncmFtc1tjbHVzdGVyc1tpXV0pOworICAgIH0KKyAgfQorCisgIGltYWdlX2hpc3RvLT5zaXplID0gaW1hZ2VfaGlzdG9fc2l6ZTsKKyAgb2sgPSAxOworCisgRW5kOgorICBXZWJQU2FmZUZyZWUoY2x1c3RlcnMpOworICBIaXN0b1F1ZXVlQ2xlYXIoJmhpc3RvX3F1ZXVlKTsKKyAgcmV0dXJuIG9rOworfQorCisvLyBQZXJmb3JtIGhpc3RvZ3JhbSBhZ2dyZWdhdGlvbiB1c2luZyBhIHN0b2NoYXN0aWMgYXBwcm9hY2guCisvLyAnZG9fZ3JlZWR5JyBpcyBzZXQgdG8gMSBpZiBhIGdyZWVkeSBhcHByb2FjaCBuZWVkcyB0byBiZSBwZXJmb3JtZWQKKy8vIGFmdGVyd2FyZHMsIDAgb3RoZXJ3aXNlLgorc3RhdGljIGludCBIaXN0b2dyYW1Db21iaW5lU3RvY2hhc3RpYyhWUDhMSGlzdG9ncmFtU2V0KiBjb25zdCBpbWFnZV9oaXN0bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1pbl9jbHVzdGVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgZG9fZ3JlZWR5KSB7CisgIGludCBpdGVyOworICB1aW50MzJfdCBzZWVkID0gMTsKKyAgaW50IHRyaWVzX3dpdGhfbm9fc3VjY2VzcyA9IDA7CisgIGludCBpbWFnZV9oaXN0b19zaXplID0gaW1hZ2VfaGlzdG8tPnNpemU7CisgIGNvbnN0IGludCBvdXRlcl9pdGVycyA9IGltYWdlX2hpc3RvX3NpemU7CisgIGNvbnN0IGludCBudW1fdHJpZXNfbm9fc3VjY2VzcyA9IG91dGVyX2l0ZXJzIC8gMjsKKyAgVlA4TEhpc3RvZ3JhbSoqIGNvbnN0IGhpc3RvZ3JhbXMgPSBpbWFnZV9oaXN0by0+aGlzdG9ncmFtczsKKyAgLy8gUHJpb3JpdHkgcXVldWUgb2YgaGlzdG9ncmFtIHBhaXJzLiBJdHMgc2l6ZSBvZiAia0Nvc3RIZWFwU2l6ZVNxcnQiXjIKKyAgLy8gaW1wYWN0cyB0aGUgcXVhbGl0eSBvZiB0aGUgY29tcHJlc3Npb24gYW5kIHRoZSBzcGVlZDogdGhlIHNtYWxsZXIgdGhlCisgIC8vIGZhc3RlciBidXQgdGhlIHdvcnNlIGZvciB0aGUgY29tcHJlc3Npb24uCisgIEhpc3RvUXVldWUgaGlzdG9fcXVldWU7CisgIGNvbnN0IGludCBrSGlzdG9RdWV1ZVNpemVTcXJ0ID0gMzsKKyAgaW50IG9rID0gMDsKKworICBpZiAoIUhpc3RvUXVldWVJbml0KCZoaXN0b19xdWV1ZSwga0hpc3RvUXVldWVTaXplU3FydCkpIHsKKyAgICBnb3RvIEVuZDsKKyAgfQorICAvLyBDb2xsYXBzZSBzaW1pbGFyIGhpc3RvZ3JhbXMgaW4gJ2ltYWdlX2hpc3RvJy4KKyAgKyttaW5fY2x1c3Rlcl9zaXplOworICBmb3IgKGl0ZXIgPSAwOyBpdGVyIDwgb3V0ZXJfaXRlcnMgJiYgaW1hZ2VfaGlzdG9fc2l6ZSA+PSBtaW5fY2x1c3Rlcl9zaXplICYmCisgICAgICAgICAgICAgICAgICsrdHJpZXNfd2l0aF9ub19zdWNjZXNzIDwgbnVtX3RyaWVzX25vX3N1Y2Nlc3M7CisgICAgICAgKytpdGVyKSB7CisgICAgZG91YmxlIGJlc3RfY29zdCA9CisgICAgICAgIChoaXN0b19xdWV1ZS5zaXplID09IDApID8gMC4gOiBoaXN0b19xdWV1ZS5xdWV1ZVswXS5jb3N0X2RpZmY7CisgICAgaW50IGJlc3RfaWR4MSA9IC0xLCBiZXN0X2lkeDIgPSAxOworICAgIGludCBqOworICAgIGNvbnN0IHVpbnQzMl90IHJhbmRfcmFuZ2UgPSAoaW1hZ2VfaGlzdG9fc2l6ZSAtIDEpICogaW1hZ2VfaGlzdG9fc2l6ZTsKKyAgICAvLyBpbWFnZV9oaXN0b19zaXplIC8gMiB3YXMgY2hvc2VuIGVtcGlyaWNhbGx5LiBMZXNzIG1lYW5zIGZhc3RlciBidXQgd29yc2UKKyAgICAvLyBjb21wcmVzc2lvbi4KKyAgICBjb25zdCBpbnQgbnVtX3RyaWVzID0gaW1hZ2VfaGlzdG9fc2l6ZSAvIDI7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgbnVtX3RyaWVzOyArK2opIHsKKyAgICAgIGRvdWJsZSBjdXJyX2Nvc3Q7CisgICAgICAvLyBDaG9vc2UgdHdvIGRpZmZlcmVudCBoaXN0b2dyYW1zIGF0IHJhbmRvbSBhbmQgdHJ5IHRvIGNvbWJpbmUgdGhlbS4KKyAgICAgIGNvbnN0IHVpbnQzMl90IHRtcCA9IE15UmFuZCgmc2VlZCkgJSByYW5kX3JhbmdlOworICAgICAgY29uc3QgdWludDMyX3QgaWR4MSA9IHRtcCAvIChpbWFnZV9oaXN0b19zaXplIC0gMSk7CisgICAgICB1aW50MzJfdCBpZHgyID0gdG1wICUgKGltYWdlX2hpc3RvX3NpemUgLSAxKTsKKyAgICAgIGlmIChpZHgyID49IGlkeDEpICsraWR4MjsKKworICAgICAgLy8gQ2FsY3VsYXRlIGNvc3QgcmVkdWN0aW9uIG9uIGNvbWJpbmF0aW9uLgorICAgICAgY3Vycl9jb3N0ID0KKyAgICAgICAgICBIaXN0b1F1ZXVlUHVzaCgmaGlzdG9fcXVldWUsIGhpc3RvZ3JhbXMsIGlkeDEsIGlkeDIsIGJlc3RfY29zdCk7CisgICAgICBpZiAoY3Vycl9jb3N0IDwgMCkgeyAgLy8gZm91bmQgYSBiZXR0ZXIgcGFpcj8KKyAgICAgICAgYmVzdF9jb3N0ID0gY3Vycl9jb3N0OworICAgICAgICAvLyBFbXB0eSB0aGUgcXVldWUgaWYgd2UgcmVhY2hlZCBmdWxsIGNhcGFjaXR5LgorICAgICAgICBpZiAoaGlzdG9fcXVldWUuc2l6ZSA9PSBoaXN0b19xdWV1ZS5tYXhfc2l6ZSkgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGlmIChoaXN0b19xdWV1ZS5zaXplID09IDApIGNvbnRpbnVlOworCisgICAgLy8gTWVyZ2UgdGhlIHR3byBiZXN0IGhpc3RvZ3JhbXMuCisgICAgYmVzdF9pZHgxID0gaGlzdG9fcXVldWUucXVldWVbMF0uaWR4MTsKKyAgICBiZXN0X2lkeDIgPSBoaXN0b19xdWV1ZS5xdWV1ZVswXS5pZHgyOworICAgIGFzc2VydChiZXN0X2lkeDEgPCBiZXN0X2lkeDIpOworICAgIEhpc3RvZ3JhbUFkZEV2YWwoaGlzdG9ncmFtc1tiZXN0X2lkeDFdLCBoaXN0b2dyYW1zW2Jlc3RfaWR4Ml0sCisgICAgICAgICAgICAgICAgICAgICBoaXN0b2dyYW1zW2Jlc3RfaWR4MV0sIDApOworICAgIC8vIFN3YXAgdGhlIGJlc3RfaWR4MiBoaXN0b2dyYW0gd2l0aCB0aGUgbGFzdCBvbmUgKHdoaWNoIGlzIG5vdyB1bnVzZWQpLgorICAgIC0taW1hZ2VfaGlzdG9fc2l6ZTsKKyAgICBpZiAoYmVzdF9pZHgyICE9IGltYWdlX2hpc3RvX3NpemUpIHsKKyAgICAgIEhpc3RvZ3JhbVN3YXAoJmhpc3RvZ3JhbXNbaW1hZ2VfaGlzdG9fc2l6ZV0sICZoaXN0b2dyYW1zW2Jlc3RfaWR4Ml0pOworICAgIH0KKyAgICBoaXN0b2dyYW1zW2ltYWdlX2hpc3RvX3NpemVdID0gTlVMTDsKKyAgICAvLyBQYXJzZSB0aGUgcXVldWUgYW5kIHVwZGF0ZSBlYWNoIHBhaXIgdGhhdCBkZWFscyB3aXRoIGJlc3RfaWR4MSwKKyAgICAvLyBiZXN0X2lkeDIgb3IgaW1hZ2VfaGlzdG9fc2l6ZS4KKyAgICBmb3IgKGogPSAwOyBqIDwgaGlzdG9fcXVldWUuc2l6ZTspIHsKKyAgICAgIEhpc3RvZ3JhbVBhaXIqIGNvbnN0IHAgPSBoaXN0b19xdWV1ZS5xdWV1ZSArIGo7CisgICAgICBjb25zdCBpbnQgaXNfaWR4MV9iZXN0ID0gcC0+aWR4MSA9PSBiZXN0X2lkeDEgfHwgcC0+aWR4MSA9PSBiZXN0X2lkeDI7CisgICAgICBjb25zdCBpbnQgaXNfaWR4Ml9iZXN0ID0gcC0+aWR4MiA9PSBiZXN0X2lkeDEgfHwgcC0+aWR4MiA9PSBiZXN0X2lkeDI7CisgICAgICBpbnQgZG9fZXZhbCA9IDA7CisgICAgICAvLyBUaGUgZnJvbnQgcGFpciBjb3VsZCBoYXZlIGJlZW4gZHVwbGljYXRlZCBieSBhIHJhbmRvbSBwaWNrIHNvCisgICAgICAvLyBjaGVjayBmb3IgaXQgYWxsIHRoZSB0aW1lIG5ldmVydGhlbGVzcy4KKyAgICAgIGlmIChpc19pZHgxX2Jlc3QgJiYgaXNfaWR4Ml9iZXN0KSB7CisgICAgICAgIEhpc3RvUXVldWVQb3BQYWlyKCZoaXN0b19xdWV1ZSwgcCk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgLy8gQW55IHBhaXIgY29udGFpbmluZyBvbmUgb2YgdGhlIHR3byBiZXN0IGluZGljZXMgc2hvdWxkIG9ubHkgcmVmZXIgdG8KKyAgICAgIC8vIGJlc3RfaWR4MS4gSXRzIGNvc3Qgc2hvdWxkIGFsc28gYmUgdXBkYXRlZC4KKyAgICAgIGlmIChpc19pZHgxX2Jlc3QpIHsKKyAgICAgICAgcC0+aWR4MSA9IGJlc3RfaWR4MTsKKyAgICAgICAgZG9fZXZhbCA9IDE7CisgICAgICB9IGVsc2UgaWYgKGlzX2lkeDJfYmVzdCkgeworICAgICAgICBwLT5pZHgyID0gYmVzdF9pZHgxOworICAgICAgICBkb19ldmFsID0gMTsKKyAgICAgIH0KKyAgICAgIGlmIChwLT5pZHgyID09IGltYWdlX2hpc3RvX3NpemUpIHsKKyAgICAgICAgLy8gTm8gbmVlZCB0byByZS1ldmFsdWF0ZSBoZXJlIGFzIGl0IGRvZXMgbm90IGludm9sdmUgYSBwYWlyCisgICAgICAgIC8vIGNvbnRhaW5pbmcgYmVzdF9pZHgxIG9yIGJlc3RfaWR4Mi4KKyAgICAgICAgcC0+aWR4MiA9IGJlc3RfaWR4MjsKKyAgICAgIH0KKyAgICAgIGFzc2VydChwLT5pZHgyIDwgaW1hZ2VfaGlzdG9fc2l6ZSk7CisgICAgICAvLyBNYWtlIHN1cmUgdGhlIGluZGV4IG9yZGVyIGlzIHJlc3BlY3RlZC4KKyAgICAgIGlmIChwLT5pZHgxID4gcC0+aWR4MikgeworICAgICAgICBjb25zdCBpbnQgdG1wID0gcC0+aWR4MjsKKyAgICAgICAgcC0+aWR4MiA9IHAtPmlkeDE7CisgICAgICAgIHAtPmlkeDEgPSB0bXA7CisgICAgICB9CisgICAgICBpZiAoZG9fZXZhbCkgeworICAgICAgICAvLyBSZS1ldmFsdWF0ZSB0aGUgY29zdCBvZiBhbiB1cGRhdGVkIHBhaXIuCisgICAgICAgIEdldENvbWJpbmVkSGlzdG9ncmFtRW50cm9weShoaXN0b2dyYW1zW3AtPmlkeDFdLCBoaXN0b2dyYW1zW3AtPmlkeDJdLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnAtPmNvc3RfZGlmZik7CisgICAgICAgIGlmIChwLT5jb3N0X2RpZmYgPj0gMC4pIHsKKyAgICAgICAgICBIaXN0b1F1ZXVlUG9wUGFpcigmaGlzdG9fcXVldWUsIHApOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICBIaXN0b1F1ZXVlVXBkYXRlSGVhZCgmaGlzdG9fcXVldWUsIHApOworICAgICAgKytqOworICAgIH0KKworICAgIHRyaWVzX3dpdGhfbm9fc3VjY2VzcyA9IDA7CisgIH0KKyAgaW1hZ2VfaGlzdG8tPnNpemUgPSBpbWFnZV9oaXN0b19zaXplOworICAqZG9fZ3JlZWR5ID0gKGltYWdlX2hpc3RvLT5zaXplIDw9IG1pbl9jbHVzdGVyX3NpemUpOworICBvayA9IDE7CisKK0VuZDoKKyAgSGlzdG9RdWV1ZUNsZWFyKCZoaXN0b19xdWV1ZSk7CisgIHJldHVybiBvazsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhpc3RvZ3JhbSByZWZpbmVtZW50CisKKy8vIEZpbmQgdGhlIGJlc3QgJ291dCcgaGlzdG9ncmFtIGZvciBlYWNoIG9mIHRoZSAnaW4nIGhpc3RvZ3JhbXMuCisvLyBOb3RlOiB3ZSBhc3N1bWUgdGhhdCBvdXRbXS0+Yml0X2Nvc3RfIGlzIGFscmVhZHkgdXAtdG8tZGF0ZS4KK3N0YXRpYyB2b2lkIEhpc3RvZ3JhbVJlbWFwKGNvbnN0IFZQOExIaXN0b2dyYW1TZXQqIGNvbnN0IGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TEhpc3RvZ3JhbVNldCogY29uc3Qgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIGNvbnN0IHN5bWJvbHMpIHsKKyAgaW50IGk7CisgIFZQOExIaXN0b2dyYW0qKiBjb25zdCBpbl9oaXN0byA9IGluLT5oaXN0b2dyYW1zOworICBWUDhMSGlzdG9ncmFtKiogY29uc3Qgb3V0X2hpc3RvID0gb3V0LT5oaXN0b2dyYW1zOworICBjb25zdCBpbnQgaW5fc2l6ZSA9IGluLT5zaXplOworICBjb25zdCBpbnQgb3V0X3NpemUgPSBvdXQtPnNpemU7CisgIGlmIChvdXRfc2l6ZSA+IDEpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaW5fc2l6ZTsgKytpKSB7CisgICAgICBpbnQgYmVzdF9vdXQgPSAwOworICAgICAgZG91YmxlIGJlc3RfYml0cyA9IE1BWF9DT1NUOworICAgICAgaW50IGs7CisgICAgICBmb3IgKGsgPSAwOyBrIDwgb3V0X3NpemU7ICsraykgeworICAgICAgICBjb25zdCBkb3VibGUgY3VyX2JpdHMgPQorICAgICAgICAgICAgSGlzdG9ncmFtQWRkVGhyZXNoKG91dF9oaXN0b1trXSwgaW5faGlzdG9baV0sIGJlc3RfYml0cyk7CisgICAgICAgIGlmIChrID09IDAgfHwgY3VyX2JpdHMgPCBiZXN0X2JpdHMpIHsKKyAgICAgICAgICBiZXN0X2JpdHMgPSBjdXJfYml0czsKKyAgICAgICAgICBiZXN0X291dCA9IGs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHN5bWJvbHNbaV0gPSBiZXN0X291dDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgYXNzZXJ0KG91dF9zaXplID09IDEpOworICAgIGZvciAoaSA9IDA7IGkgPCBpbl9zaXplOyArK2kpIHsKKyAgICAgIHN5bWJvbHNbaV0gPSAwOworICAgIH0KKyAgfQorCisgIC8vIFJlY29tcHV0ZSBlYWNoIG91dCBiYXNlZCBvbiByYXcgYW5kIHN5bWJvbHMuCisgIGZvciAoaSA9IDA7IGkgPCBvdXRfc2l6ZTsgKytpKSB7CisgICAgSGlzdG9ncmFtQ2xlYXIob3V0X2hpc3RvW2ldKTsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBpbl9zaXplOyArK2kpIHsKKyAgICBjb25zdCBpbnQgaWR4ID0gc3ltYm9sc1tpXTsKKyAgICBIaXN0b2dyYW1BZGQoaW5faGlzdG9baV0sIG91dF9oaXN0b1tpZHhdLCBvdXRfaGlzdG9baWR4XSk7CisgIH0KK30KKworc3RhdGljIGRvdWJsZSBHZXRDb21iaW5lQ29zdEZhY3RvcihpbnQgaGlzdG9fc2l6ZSwgaW50IHF1YWxpdHkpIHsKKyAgZG91YmxlIGNvbWJpbmVfY29zdF9mYWN0b3IgPSAwLjE2OworICBpZiAocXVhbGl0eSA8IDkwKSB7CisgICAgaWYgKGhpc3RvX3NpemUgPiAyNTYpIGNvbWJpbmVfY29zdF9mYWN0b3IgLz0gMi47CisgICAgaWYgKGhpc3RvX3NpemUgPiA1MTIpIGNvbWJpbmVfY29zdF9mYWN0b3IgLz0gMi47CisgICAgaWYgKGhpc3RvX3NpemUgPiAxMDI0KSBjb21iaW5lX2Nvc3RfZmFjdG9yIC89IDIuOworICAgIGlmIChxdWFsaXR5IDw9IDUwKSBjb21iaW5lX2Nvc3RfZmFjdG9yIC89IDIuOworICB9CisgIHJldHVybiBjb21iaW5lX2Nvc3RfZmFjdG9yOworfQorCitpbnQgVlA4TEdldEhpc3RvSW1hZ2VTeW1ib2xzKGludCB4c2l6ZSwgaW50IHlzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcXVhbGl0eSwgaW50IGxvd19lZmZvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoaXN0b19iaXRzLCBpbnQgY2FjaGVfYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEhpc3RvZ3JhbVNldCogY29uc3QgaW1hZ2VfaGlzdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExIaXN0b2dyYW0qIGNvbnN0IHRtcF9oaXN0bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIGNvbnN0IGhpc3RvZ3JhbV9zeW1ib2xzKSB7CisgIGludCBvayA9IDA7CisgIGNvbnN0IGludCBoaXN0b194c2l6ZSA9IGhpc3RvX2JpdHMgPyBWUDhMU3ViU2FtcGxlU2l6ZSh4c2l6ZSwgaGlzdG9fYml0cykgOiAxOworICBjb25zdCBpbnQgaGlzdG9feXNpemUgPSBoaXN0b19iaXRzID8gVlA4TFN1YlNhbXBsZVNpemUoeXNpemUsIGhpc3RvX2JpdHMpIDogMTsKKyAgY29uc3QgaW50IGltYWdlX2hpc3RvX3Jhd19zaXplID0gaGlzdG9feHNpemUgKiBoaXN0b195c2l6ZTsKKyAgVlA4TEhpc3RvZ3JhbVNldCogY29uc3Qgb3JpZ19oaXN0byA9CisgICAgICBWUDhMQWxsb2NhdGVIaXN0b2dyYW1TZXQoaW1hZ2VfaGlzdG9fcmF3X3NpemUsIGNhY2hlX2JpdHMpOworICAvLyBEb24ndCBhdHRlbXB0IGxpbmVhciBiaW4tcGFydGl0aW9uIGhldXJpc3RpYyBmb3IKKyAgLy8gaGlzdG9ncmFtcyBvZiBzbWFsbCBzaXplcyAoYXMgYmluX21hcCB3aWxsIGJlIHZlcnkgc3BhcnNlKSBhbmQKKyAgLy8gbWF4aW11bSBxdWFsaXR5IHE9PTEwMCAodG8gcHJlc2VydmUgdGhlIGNvbXByZXNzaW9uIGdhaW5zIGF0IHRoYXQgbGV2ZWwpLgorICBjb25zdCBpbnQgZW50cm9weV9jb21iaW5lX251bV9iaW5zID0gbG93X2VmZm9ydCA/IE5VTV9QQVJUSVRJT05TIDogQklOX1NJWkU7CisgIGNvbnN0IGludCBlbnRyb3B5X2NvbWJpbmUgPQorICAgICAgKG9yaWdfaGlzdG8tPnNpemUgPiBlbnRyb3B5X2NvbWJpbmVfbnVtX2JpbnMgKiAyKSAmJiAocXVhbGl0eSA8IDEwMCk7CisKKyAgaWYgKG9yaWdfaGlzdG8gPT0gTlVMTCkgZ290byBFcnJvcjsKKworICAvLyBDb25zdHJ1Y3QgdGhlIGhpc3RvZ3JhbXMgZnJvbSBiYWNrd2FyZCByZWZlcmVuY2VzLgorICBIaXN0b2dyYW1CdWlsZCh4c2l6ZSwgaGlzdG9fYml0cywgcmVmcywgb3JpZ19oaXN0byk7CisgIC8vIENvcGllcyB0aGUgaGlzdG9ncmFtcyBhbmQgY29tcHV0ZXMgaXRzIGJpdF9jb3N0LgorICBIaXN0b2dyYW1Db3B5QW5kQW5hbHl6ZShvcmlnX2hpc3RvLCBpbWFnZV9oaXN0byk7CisKKyAgaWYgKGVudHJvcHlfY29tYmluZSkgeworICAgIGNvbnN0IGludCBiaW5fbWFwX3NpemUgPSBvcmlnX2hpc3RvLT5zaXplOworICAgIC8vIFJldXNlIGhpc3RvZ3JhbV9zeW1ib2xzIHN0b3JhZ2UuIEJ5IGRlZmluaXRpb24sIGl0J3MgZ3VhcmFudGVlZCB0byBiZSBvay4KKyAgICB1aW50MTZfdCogY29uc3QgYmluX21hcCA9IGhpc3RvZ3JhbV9zeW1ib2xzOworICAgIGNvbnN0IGRvdWJsZSBjb21iaW5lX2Nvc3RfZmFjdG9yID0KKyAgICAgICAgR2V0Q29tYmluZUNvc3RGYWN0b3IoaW1hZ2VfaGlzdG9fcmF3X3NpemUsIHF1YWxpdHkpOworCisgICAgSGlzdG9ncmFtQW5hbHl6ZUVudHJvcHlCaW4ob3JpZ19oaXN0bywgYmluX21hcCwgbG93X2VmZm9ydCk7CisgICAgLy8gQ29sbGFwc2UgaGlzdG9ncmFtcyB3aXRoIHNpbWlsYXIgZW50cm9weS4KKyAgICBIaXN0b2dyYW1Db21iaW5lRW50cm9weUJpbihpbWFnZV9oaXN0bywgdG1wX2hpc3RvLCBiaW5fbWFwLCBiaW5fbWFwX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cm9weV9jb21iaW5lX251bV9iaW5zLCBjb21iaW5lX2Nvc3RfZmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd19lZmZvcnQpOworICB9CisKKyAgLy8gRG9uJ3QgY29tYmluZSB0aGUgaGlzdG9ncmFtcyB1c2luZyBzdG9jaGFzdGljIGFuZCBncmVlZHkgaGV1cmlzdGljcyBmb3IKKyAgLy8gbG93LWVmZm9ydCBjb21wcmVzc2lvbiBtb2RlLgorICBpZiAoIWxvd19lZmZvcnQgfHwgIWVudHJvcHlfY29tYmluZSkgeworICAgIGNvbnN0IGZsb2F0IHggPSBxdWFsaXR5IC8gMTAwLmY7CisgICAgLy8gY3ViaWMgcmFtcCBiZXR3ZWVuIDEgYW5kIE1BWF9ISVNUT19HUkVFRFk6CisgICAgY29uc3QgaW50IHRocmVzaG9sZF9zaXplID0gKGludCkoMSArICh4ICogeCAqIHgpICogKE1BWF9ISVNUT19HUkVFRFkgLSAxKSk7CisgICAgaW50IGRvX2dyZWVkeTsKKyAgICBpZiAoIUhpc3RvZ3JhbUNvbWJpbmVTdG9jaGFzdGljKGltYWdlX2hpc3RvLCB0aHJlc2hvbGRfc2l6ZSwgJmRvX2dyZWVkeSkpIHsKKyAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorICAgIGlmIChkb19ncmVlZHkgJiYgIUhpc3RvZ3JhbUNvbWJpbmVHcmVlZHkoaW1hZ2VfaGlzdG8pKSB7CisgICAgICBnb3RvIEVycm9yOworICAgIH0KKyAgfQorCisgIC8vIFRPRE8odnJhYmF1ZCk6IE9wdGltaXplIEhpc3RvZ3JhbVJlbWFwIGZvciBsb3ctZWZmb3J0IGNvbXByZXNzaW9uIG1vZGUuCisgIC8vIEZpbmQgdGhlIG9wdGltYWwgbWFwIGZyb20gb3JpZ2luYWwgaGlzdG9ncmFtcyB0byB0aGUgZmluYWwgb25lcy4KKyAgSGlzdG9ncmFtUmVtYXAob3JpZ19oaXN0bywgaW1hZ2VfaGlzdG8sIGhpc3RvZ3JhbV9zeW1ib2xzKTsKKworICBvayA9IDE7CisKKyBFcnJvcjoKKyAgVlA4TEZyZWVIaXN0b2dyYW1TZXQob3JpZ19oaXN0byk7CisgIHJldHVybiBvazsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvaGlzdG9ncmFtX2VuYy5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9oaXN0b2dyYW1fZW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY5ZjQ4ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvaGlzdG9ncmFtX2VuYy5oCkBAIC0wLDAgKzEsMTI2IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQXV0aG9yOiBKeXJraSBBbGFrdWlqYWxhIChqeXJraUBnb29nbGUuY29tKQorLy8KKy8vIE1vZGVscyB0aGUgaGlzdG9ncmFtcyBvZiBsaXRlcmFsIGFuZCBkaXN0YW5jZSBjb2Rlcy4KKworI2lmbmRlZiBXRUJQX0VOQ19ISVNUT0dSQU1fRU5DX0hfCisjZGVmaW5lIFdFQlBfRU5DX0hJU1RPR1JBTV9FTkNfSF8KKworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0cmluZ19wb2VtLmgiCisjZWxzZQorI2luY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvZW5jL2JhY2t3YXJkX3JlZmVyZW5jZXNfZW5jLmgiCisjaW5jbHVkZSAic3JjL3dlYnAvZm9ybWF0X2NvbnN0YW50cy5oIgorI2luY2x1ZGUgInNyYy93ZWJwL3R5cGVzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLy8gTm90IGEgdHJpdmlhbCBsaXRlcmFsIHN5bWJvbC4KKyNkZWZpbmUgVlA4TF9OT05fVFJJVklBTF9TWU0gKDB4ZmZmZmZmZmYpCisKKy8vIEEgc2ltcGxlIGNvbnRhaW5lciBmb3IgaGlzdG9ncmFtcyBvZiBkYXRhLgordHlwZWRlZiBzdHJ1Y3QgeworICAvLyBsaXRlcmFsXyBjb250YWlucyBncmVlbiBsaXRlcmFsLCBwYWxldHRlLWNvZGUgYW5kCisgIC8vIGNvcHktbGVuZ3RoLXByZWZpeCBoaXN0b2dyYW0KKyAgdWludDMyX3QqIGxpdGVyYWxfOyAgICAgICAgIC8vIFBvaW50ZXIgdG8gdGhlIGFsbG9jYXRlZCBidWZmZXIgZm9yIGxpdGVyYWwuCisgIHVpbnQzMl90IHJlZF9bTlVNX0xJVEVSQUxfQ09ERVNdOworICB1aW50MzJfdCBibHVlX1tOVU1fTElURVJBTF9DT0RFU107CisgIHVpbnQzMl90IGFscGhhX1tOVU1fTElURVJBTF9DT0RFU107CisgIC8vIEJhY2t3YXJkIHJlZmVyZW5jZSBwcmVmaXgtY29kZSBoaXN0b2dyYW0uCisgIHVpbnQzMl90IGRpc3RhbmNlX1tOVU1fRElTVEFOQ0VfQ09ERVNdOworICBpbnQgcGFsZXR0ZV9jb2RlX2JpdHNfOworICB1aW50MzJfdCB0cml2aWFsX3N5bWJvbF87ICAvLyBUcnVlLCBpZiBoaXN0b2dyYW1zIGZvciBSZWQsIEJsdWUgJiBBbHBoYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsaXRlcmFsIHN5bWJvbHMgYXJlIHNpbmdsZSB2YWx1ZWQuCisgIGRvdWJsZSBiaXRfY29zdF87ICAgICAgICAgIC8vIGNhY2hlZCB2YWx1ZSBvZiBiaXQgY29zdC4KKyAgZG91YmxlIGxpdGVyYWxfY29zdF87ICAgICAgLy8gQ2FjaGVkIHZhbHVlcyBvZiBkb21pbmFudCBlbnRyb3B5IGNvc3RzOgorICBkb3VibGUgcmVkX2Nvc3RfOyAgICAgICAgICAvLyBsaXRlcmFsLCByZWQgJiBibHVlLgorICBkb3VibGUgYmx1ZV9jb3N0XzsKK30gVlA4TEhpc3RvZ3JhbTsKKworLy8gQ29sbGVjdGlvbiBvZiBoaXN0b2dyYW1zIHdpdGggZml4ZWQgY2FwYWNpdHksIGFsbG9jYXRlZCBhcyBvbmUKKy8vIGJpZyBtZW1vcnkgY2h1bmsuIENhbiBiZSBkZXN0cm95ZWQgYnkgY2FsbGluZyBXZWJQU2FmZUZyZWUoKS4KK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50IHNpemU7ICAgICAgICAgLy8gbnVtYmVyIG9mIHNsb3RzIGN1cnJlbnRseSBpbiB1c2UKKyAgaW50IG1heF9zaXplOyAgICAgLy8gbWF4aW11bSBjYXBhY2l0eQorICBWUDhMSGlzdG9ncmFtKiogaGlzdG9ncmFtczsKK30gVlA4TEhpc3RvZ3JhbVNldDsKKworLy8gQ3JlYXRlIHRoZSBoaXN0b2dyYW0uCisvLworLy8gVGhlIGlucHV0IGRhdGEgaXMgdGhlIFBpeE9yQ29weSBkYXRhLCB3aGljaCBtb2RlbHMgdGhlIGxpdGVyYWxzLCBzdG9wCisvLyBjb2RlcyBhbmQgYmFja3dhcmQgcmVmZXJlbmNlcyAoYm90aCBkaXN0YW5jZXMgYW5kIGxlbmd0aHMpLiAgQWxzbzogaWYKKy8vIHBhbGV0dGVfY29kZV9iaXRzIGlzID49IDAsIGluaXRpYWxpemUgdGhlIGhpc3RvZ3JhbSB3aXRoIHRoaXMgdmFsdWUuCit2b2lkIFZQOExIaXN0b2dyYW1DcmVhdGUoVlA4TEhpc3RvZ3JhbSogY29uc3QgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYWxldHRlX2NvZGVfYml0cyk7CisKKy8vIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgaGlzdG9ncmFtIGZvciBhIGdpdmVuIHBhbGV0dGVfY29kZV9iaXRzLgoraW50IFZQOExHZXRIaXN0b2dyYW1TaXplKGludCBwYWxldHRlX2NvZGVfYml0cyk7CisKKy8vIFNldCB0aGUgcGFsZXR0ZV9jb2RlX2JpdHMgYW5kIHJlc2V0IHRoZSBzdGF0cy4KK3ZvaWQgVlA4TEhpc3RvZ3JhbUluaXQoVlA4TEhpc3RvZ3JhbSogY29uc3QgcCwgaW50IHBhbGV0dGVfY29kZV9iaXRzKTsKKworLy8gQ29sbGVjdCBhbGwgdGhlIHJlZmVyZW5jZXMgaW50byBhIGhpc3RvZ3JhbSAod2l0aG91dCByZXNldCkKK3ZvaWQgVlA4TEhpc3RvZ3JhbVN0b3JlUmVmcyhjb25zdCBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExIaXN0b2dyYW0qIGNvbnN0IGhpc3RvKTsKKworLy8gRnJlZSB0aGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIGhpc3RvZ3JhbS4KK3ZvaWQgVlA4TEZyZWVIaXN0b2dyYW0oVlA4TEhpc3RvZ3JhbSogY29uc3QgaGlzdG8pOworCisvLyBGcmVlIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgaGlzdG9ncmFtIHNldC4KK3ZvaWQgVlA4TEZyZWVIaXN0b2dyYW1TZXQoVlA4TEhpc3RvZ3JhbVNldCogY29uc3QgaGlzdG8pOworCisvLyBBbGxvY2F0ZSBhbiBhcnJheSBvZiBwb2ludGVyIHRvIGhpc3RvZ3JhbXMsIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQKKy8vIHVzaW5nICdjYWNoZV9iaXRzJy4gUmV0dXJuIE5VTEwgaW4gY2FzZSBvZiBtZW1vcnkgZXJyb3IuCitWUDhMSGlzdG9ncmFtU2V0KiBWUDhMQWxsb2NhdGVIaXN0b2dyYW1TZXQoaW50IHNpemUsIGludCBjYWNoZV9iaXRzKTsKKworLy8gQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgaGlzdG9ncmFtIG9iamVjdCB3aXRoIHNwZWNpZmllZCAnY2FjaGVfYml0cycuCisvLyBSZXR1cm5zIE5VTEwgaW4gY2FzZSBvZiBtZW1vcnkgZXJyb3IuCisvLyBTcGVjaWFsIGNhc2Ugb2YgVlA4TEFsbG9jYXRlSGlzdG9ncmFtU2V0LCB3aXRoIHNpemUgZXF1YWxzIDEuCitWUDhMSGlzdG9ncmFtKiBWUDhMQWxsb2NhdGVIaXN0b2dyYW0oaW50IGNhY2hlX2JpdHMpOworCisvLyBBY2N1bXVsYXRlIGEgdG9rZW4gJ3YnIGludG8gYSBoaXN0b2dyYW0uCit2b2lkIFZQOExIaXN0b2dyYW1BZGRTaW5nbGVQaXhPckNvcHkoVlA4TEhpc3RvZ3JhbSogY29uc3QgaGlzdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGl4T3JDb3B5KiBjb25zdCB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAoKmNvbnN0IGRpc3RhbmNlX21vZGlmaWVyKShpbnQsIGludCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpc3RhbmNlX21vZGlmaWVyX2FyZzApOworCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOExIaXN0b2dyYW1OdW1Db2RlcyhpbnQgcGFsZXR0ZV9jb2RlX2JpdHMpIHsKKyAgcmV0dXJuIE5VTV9MSVRFUkFMX0NPREVTICsgTlVNX0xFTkdUSF9DT0RFUyArCisgICAgICAoKHBhbGV0dGVfY29kZV9iaXRzID4gMCkgPyAoMSA8PCBwYWxldHRlX2NvZGVfYml0cykgOiAwKTsKK30KKworLy8gQnVpbGRzIHRoZSBoaXN0b2dyYW0gaW1hZ2UuCitpbnQgVlA4TEdldEhpc3RvSW1hZ2VTeW1ib2xzKGludCB4c2l6ZSwgaW50IHlzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcXVhbGl0eSwgaW50IGxvd19lZmZvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoaXN0b2dyYW1fYml0cywgaW50IGNhY2hlX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExIaXN0b2dyYW1TZXQqIGNvbnN0IGltYWdlX2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMSGlzdG9ncmFtKiBjb25zdCB0bXBfaGlzdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBjb25zdCBoaXN0b2dyYW1fc3ltYm9scyk7CisKKy8vIFJldHVybnMgdGhlIGVudHJvcHkgZm9yIHRoZSBzeW1ib2xzIGluIHRoZSBpbnB1dCBhcnJheS4KK2RvdWJsZSBWUDhMQml0c0VudHJvcHkoY29uc3QgdWludDMyX3QqIGNvbnN0IGFycmF5LCBpbnQgbik7CisKKy8vIEVzdGltYXRlIGhvdyBtYW55IGJpdHMgdGhlIGNvbWJpbmVkIGVudHJvcHkgb2YgbGl0ZXJhbHMgYW5kIGRpc3RhbmNlCisvLyBhcHByb3hpbWF0ZWx5IG1hcHMgdG8uCitkb3VibGUgVlA4TEhpc3RvZ3JhbUVzdGltYXRlQml0cyhjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBwKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmICAvLyBXRUJQX0VOQ19ISVNUT0dSQU1fRU5DX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL2l0ZXJhdG9yX2VuYy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9pdGVyYXRvcl9lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGY5Y2IwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9pdGVyYXRvcl9lbmMuYwpAQCAtMCwwICsxLDQ2MyBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFZQOEl0ZXJhdG9yOiBibG9jayBpdGVyYXRvcgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdfcG9lbS5oIgorI2Vsc2UKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAic3JjL2VuYy92cDhpX2VuYy5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVlA4SXRlcmF0b3IKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIEluaXRMZWZ0KFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCkgeworICBpdC0+eV9sZWZ0X1stMV0gPSBpdC0+dV9sZWZ0X1stMV0gPSBpdC0+dl9sZWZ0X1stMV0gPQorICAgICAgKGl0LT55XyA+IDApID8gMTI5IDogMTI3OworICBtZW1zZXQoaXQtPnlfbGVmdF8sIDEyOSwgMTYpOworICBtZW1zZXQoaXQtPnVfbGVmdF8sIDEyOSwgOCk7CisgIG1lbXNldChpdC0+dl9sZWZ0XywgMTI5LCA4KTsKKyAgaXQtPmxlZnRfbnpfWzhdID0gMDsKKyAgaWYgKGl0LT50b3BfZGVycl8gIT0gTlVMTCkgeworICAgIG1lbXNldCgmaXQtPmxlZnRfZGVycl8sIDAsIHNpemVvZihpdC0+bGVmdF9kZXJyXykpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIEluaXRUb3AoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KSB7CisgIGNvbnN0IFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOworICBjb25zdCBzaXplX3QgdG9wX3NpemUgPSBlbmMtPm1iX3dfICogMTY7CisgIG1lbXNldChlbmMtPnlfdG9wXywgMTI3LCAyICogdG9wX3NpemUpOworICBtZW1zZXQoZW5jLT5uel8sIDAsIGVuYy0+bWJfd18gKiBzaXplb2YoKmVuYy0+bnpfKSk7CisgIGlmIChlbmMtPnRvcF9kZXJyXyAhPSBOVUxMKSB7CisgICAgbWVtc2V0KGVuYy0+dG9wX2RlcnJfLCAwLCBlbmMtPm1iX3dfICogc2l6ZW9mKCplbmMtPnRvcF9kZXJyXykpOworICB9Cit9CisKK3ZvaWQgVlA4SXRlcmF0b3JTZXRSb3coVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBpbnQgeSkgeworICBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKKyAgaXQtPnhfID0gMDsKKyAgaXQtPnlfID0geTsKKyAgaXQtPmJ3XyA9ICZlbmMtPnBhcnRzX1t5ICYgKGVuYy0+bnVtX3BhcnRzXyAtIDEpXTsKKyAgaXQtPnByZWRzXyA9IGVuYy0+cHJlZHNfICsgeSAqIDQgKiBlbmMtPnByZWRzX3dfOworICBpdC0+bnpfID0gZW5jLT5uel87CisgIGl0LT5tYl8gPSBlbmMtPm1iX2luZm9fICsgeSAqIGVuYy0+bWJfd187CisgIGl0LT55X3RvcF8gPSBlbmMtPnlfdG9wXzsKKyAgaXQtPnV2X3RvcF8gPSBlbmMtPnV2X3RvcF87CisgIEluaXRMZWZ0KGl0KTsKK30KKwordm9pZCBWUDhJdGVyYXRvclJlc2V0KFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCkgeworICBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKKyAgVlA4SXRlcmF0b3JTZXRSb3coaXQsIDApOworICBWUDhJdGVyYXRvclNldENvdW50RG93bihpdCwgZW5jLT5tYl93XyAqIGVuYy0+bWJfaF8pOyAgLy8gZGVmYXVsdAorICBJbml0VG9wKGl0KTsKKyAgbWVtc2V0KGl0LT5iaXRfY291bnRfLCAwLCBzaXplb2YoaXQtPmJpdF9jb3VudF8pKTsKKyAgaXQtPmRvX3RyZWxsaXNfID0gMDsKK30KKwordm9pZCBWUDhJdGVyYXRvclNldENvdW50RG93bihWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsIGludCBjb3VudF9kb3duKSB7CisgIGl0LT5jb3VudF9kb3duXyA9IGl0LT5jb3VudF9kb3duMF8gPSBjb3VudF9kb3duOworfQorCitpbnQgVlA4SXRlcmF0b3JJc0RvbmUoY29uc3QgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KSB7CisgIHJldHVybiAoaXQtPmNvdW50X2Rvd25fIDw9IDApOworfQorCit2b2lkIFZQOEl0ZXJhdG9ySW5pdChWUDhFbmNvZGVyKiBjb25zdCBlbmMsIFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCkgeworICBpdC0+ZW5jXyA9IGVuYzsKKyAgaXQtPnl1dl9pbl8gICA9ICh1aW50OF90KilXRUJQX0FMSUdOKGl0LT55dXZfbWVtXyk7CisgIGl0LT55dXZfb3V0XyAgPSBpdC0+eXV2X2luXyArIFlVVl9TSVpFX0VOQzsKKyAgaXQtPnl1dl9vdXQyXyA9IGl0LT55dXZfb3V0XyArIFlVVl9TSVpFX0VOQzsKKyAgaXQtPnl1dl9wXyAgICA9IGl0LT55dXZfb3V0Ml8gKyBZVVZfU0laRV9FTkM7CisgIGl0LT5sZl9zdGF0c18gPSBlbmMtPmxmX3N0YXRzXzsKKyAgaXQtPnBlcmNlbnQwXyA9IGVuYy0+cGVyY2VudF87CisgIGl0LT55X2xlZnRfID0gKHVpbnQ4X3QqKVdFQlBfQUxJR04oaXQtPnl1dl9sZWZ0X21lbV8gKyAxKTsKKyAgaXQtPnVfbGVmdF8gPSBpdC0+eV9sZWZ0XyArIDE2ICsgMTY7CisgIGl0LT52X2xlZnRfID0gaXQtPnVfbGVmdF8gKyAxNjsKKyAgaXQtPnRvcF9kZXJyXyA9IGVuYy0+dG9wX2RlcnJfOworICBWUDhJdGVyYXRvclJlc2V0KGl0KTsKK30KKworaW50IFZQOEl0ZXJhdG9yUHJvZ3Jlc3MoY29uc3QgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBpbnQgZGVsdGEpIHsKKyAgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187CisgIGlmIChkZWx0YSAmJiBlbmMtPnBpY18tPnByb2dyZXNzX2hvb2sgIT0gTlVMTCkgeworICAgIGNvbnN0IGludCBkb25lID0gaXQtPmNvdW50X2Rvd24wXyAtIGl0LT5jb3VudF9kb3duXzsKKyAgICBjb25zdCBpbnQgcGVyY2VudCA9IChpdC0+Y291bnRfZG93bjBfIDw9IDApCisgICAgICAgICAgICAgICAgICAgICAgPyBpdC0+cGVyY2VudDBfCisgICAgICAgICAgICAgICAgICAgICAgOiBpdC0+cGVyY2VudDBfICsgZGVsdGEgKiBkb25lIC8gaXQtPmNvdW50X2Rvd24wXzsKKyAgICByZXR1cm4gV2ViUFJlcG9ydFByb2dyZXNzKGVuYy0+cGljXywgcGVyY2VudCwgJmVuYy0+cGVyY2VudF8pOworICB9CisgIHJldHVybiAxOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW1wb3J0IHRoZSBzb3VyY2Ugc2FtcGxlcyBpbnRvIHRoZSBjYWNoZS4gVGFrZXMgY2FyZSBvZiByZXBsaWNhdGluZworLy8gYm91bmRhcnkgcGl4ZWxzIGlmIG5lY2Vzc2FyeS4KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBNaW5TaXplKGludCBhLCBpbnQgYikgeyByZXR1cm4gKGEgPCBiKSA/IGEgOiBiOyB9CisKK3N0YXRpYyB2b2lkIEltcG9ydEJsb2NrKGNvbnN0IHVpbnQ4X3QqIHNyYywgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCB3LCBpbnQgaCwgaW50IHNpemUpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBoOyArK2kpIHsKKyAgICBtZW1jcHkoZHN0LCBzcmMsIHcpOworICAgIGlmICh3IDwgc2l6ZSkgeworICAgICAgbWVtc2V0KGRzdCArIHcsIGRzdFt3IC0gMV0sIHNpemUgLSB3KTsKKyAgICB9CisgICAgZHN0ICs9IEJQUzsKKyAgICBzcmMgKz0gc3JjX3N0cmlkZTsKKyAgfQorICBmb3IgKGkgPSBoOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgbWVtY3B5KGRzdCwgZHN0IC0gQlBTLCBzaXplKTsKKyAgICBkc3QgKz0gQlBTOworICB9Cit9CisKK3N0YXRpYyB2b2lkIEltcG9ydExpbmUoY29uc3QgdWludDhfdCogc3JjLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgbGVuLCBpbnQgdG90YWxfbGVuKSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2ksIHNyYyArPSBzcmNfc3RyaWRlKSBkc3RbaV0gPSAqc3JjOworICBmb3IgKDsgaSA8IHRvdGFsX2xlbjsgKytpKSBkc3RbaV0gPSBkc3RbbGVuIC0gMV07Cit9CisKK3ZvaWQgVlA4SXRlcmF0b3JJbXBvcnQoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCB1aW50OF90KiB0bXBfMzIpIHsKKyAgY29uc3QgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187CisgIGNvbnN0IGludCB4ID0gaXQtPnhfLCB5ID0gaXQtPnlfOworICBjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljID0gZW5jLT5waWNfOworICBjb25zdCB1aW50OF90KiBjb25zdCB5c3JjID0gcGljLT55ICsgKHkgKiBwaWMtPnlfc3RyaWRlICArIHgpICogMTY7CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHVzcmMgPSBwaWMtPnUgKyAoeSAqIHBpYy0+dXZfc3RyaWRlICsgeCkgKiA4OworICBjb25zdCB1aW50OF90KiBjb25zdCB2c3JjID0gcGljLT52ICsgKHkgKiBwaWMtPnV2X3N0cmlkZSArIHgpICogODsKKyAgY29uc3QgaW50IHcgPSBNaW5TaXplKHBpYy0+d2lkdGggLSB4ICogMTYsIDE2KTsKKyAgY29uc3QgaW50IGggPSBNaW5TaXplKHBpYy0+aGVpZ2h0IC0geSAqIDE2LCAxNik7CisgIGNvbnN0IGludCB1dl93ID0gKHcgKyAxKSA+PiAxOworICBjb25zdCBpbnQgdXZfaCA9IChoICsgMSkgPj4gMTsKKworICBJbXBvcnRCbG9jayh5c3JjLCBwaWMtPnlfc3RyaWRlLCAgaXQtPnl1dl9pbl8gKyBZX09GRl9FTkMsIHcsIGgsIDE2KTsKKyAgSW1wb3J0QmxvY2sodXNyYywgcGljLT51dl9zdHJpZGUsIGl0LT55dXZfaW5fICsgVV9PRkZfRU5DLCB1dl93LCB1dl9oLCA4KTsKKyAgSW1wb3J0QmxvY2sodnNyYywgcGljLT51dl9zdHJpZGUsIGl0LT55dXZfaW5fICsgVl9PRkZfRU5DLCB1dl93LCB1dl9oLCA4KTsKKworICBpZiAodG1wXzMyID09IE5VTEwpIHJldHVybjsKKworICAvLyBJbXBvcnQgc291cmNlICh1bmNvbXByZXNzZWQpIHNhbXBsZXMgaW50byBib3VuZGFyeS4KKyAgaWYgKHggPT0gMCkgeworICAgIEluaXRMZWZ0KGl0KTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoeSA9PSAwKSB7CisgICAgICBpdC0+eV9sZWZ0X1stMV0gPSBpdC0+dV9sZWZ0X1stMV0gPSBpdC0+dl9sZWZ0X1stMV0gPSAxMjc7CisgICAgfSBlbHNlIHsKKyAgICAgIGl0LT55X2xlZnRfWy0xXSA9IHlzcmNbLSAxIC0gcGljLT55X3N0cmlkZV07CisgICAgICBpdC0+dV9sZWZ0X1stMV0gPSB1c3JjWy0gMSAtIHBpYy0+dXZfc3RyaWRlXTsKKyAgICAgIGl0LT52X2xlZnRfWy0xXSA9IHZzcmNbLSAxIC0gcGljLT51dl9zdHJpZGVdOworICAgIH0KKyAgICBJbXBvcnRMaW5lKHlzcmMgLSAxLCBwaWMtPnlfc3RyaWRlLCAgaXQtPnlfbGVmdF8sIGgsICAgMTYpOworICAgIEltcG9ydExpbmUodXNyYyAtIDEsIHBpYy0+dXZfc3RyaWRlLCBpdC0+dV9sZWZ0XywgdXZfaCwgOCk7CisgICAgSW1wb3J0TGluZSh2c3JjIC0gMSwgcGljLT51dl9zdHJpZGUsIGl0LT52X2xlZnRfLCB1dl9oLCA4KTsKKyAgfQorCisgIGl0LT55X3RvcF8gID0gdG1wXzMyICsgMDsKKyAgaXQtPnV2X3RvcF8gPSB0bXBfMzIgKyAxNjsKKyAgaWYgKHkgPT0gMCkgeworICAgIG1lbXNldCh0bXBfMzIsIDEyNywgMzIgKiBzaXplb2YoKnRtcF8zMikpOworICB9IGVsc2UgeworICAgIEltcG9ydExpbmUoeXNyYyAtIHBpYy0+eV9zdHJpZGUsICAxLCB0bXBfMzIsICAgICAgICAgIHcsICAgMTYpOworICAgIEltcG9ydExpbmUodXNyYyAtIHBpYy0+dXZfc3RyaWRlLCAxLCB0bXBfMzIgKyAxNiwgICAgIHV2X3csIDgpOworICAgIEltcG9ydExpbmUodnNyYyAtIHBpYy0+dXZfc3RyaWRlLCAxLCB0bXBfMzIgKyAxNiArIDgsIHV2X3csIDgpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb3B5IGJhY2sgdGhlIGNvbXByZXNzZWQgc2FtcGxlcyBpbnRvIHVzZXIgc3BhY2UgaWYgcmVxdWVzdGVkLgorCitzdGF0aWMgdm9pZCBFeHBvcnRCbG9jayhjb25zdCB1aW50OF90KiBzcmMsIHVpbnQ4X3QqIGRzdCwgaW50IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpIHsKKyAgd2hpbGUgKGgtLSA+IDApIHsKKyAgICBtZW1jcHkoZHN0LCBzcmMsIHcpOworICAgIGRzdCArPSBkc3Rfc3RyaWRlOworICAgIHNyYyArPSBCUFM7CisgIH0KK30KKwordm9pZCBWUDhJdGVyYXRvckV4cG9ydChjb25zdCBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKKyAgY29uc3QgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187CisgIGlmIChlbmMtPmNvbmZpZ18tPnNob3dfY29tcHJlc3NlZCkgeworICAgIGNvbnN0IGludCB4ID0gaXQtPnhfLCB5ID0gaXQtPnlfOworICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHlzcmMgPSBpdC0+eXV2X291dF8gKyBZX09GRl9FTkM7CisgICAgY29uc3QgdWludDhfdCogY29uc3QgdXNyYyA9IGl0LT55dXZfb3V0XyArIFVfT0ZGX0VOQzsKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCB2c3JjID0gaXQtPnl1dl9vdXRfICsgVl9PRkZfRU5DOworICAgIGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMgPSBlbmMtPnBpY187CisgICAgdWludDhfdCogY29uc3QgeWRzdCA9IHBpYy0+eSArICh5ICogcGljLT55X3N0cmlkZSArIHgpICogMTY7CisgICAgdWludDhfdCogY29uc3QgdWRzdCA9IHBpYy0+dSArICh5ICogcGljLT51dl9zdHJpZGUgKyB4KSAqIDg7CisgICAgdWludDhfdCogY29uc3QgdmRzdCA9IHBpYy0+diArICh5ICogcGljLT51dl9zdHJpZGUgKyB4KSAqIDg7CisgICAgaW50IHcgPSAocGljLT53aWR0aCAtIHggKiAxNik7CisgICAgaW50IGggPSAocGljLT5oZWlnaHQgLSB5ICogMTYpOworCisgICAgaWYgKHcgPiAxNikgdyA9IDE2OworICAgIGlmIChoID4gMTYpIGggPSAxNjsKKworICAgIC8vIEx1bWEgcGxhbmUKKyAgICBFeHBvcnRCbG9jayh5c3JjLCB5ZHN0LCBwaWMtPnlfc3RyaWRlLCB3LCBoKTsKKworICAgIHsgICAvLyBVL1YgcGxhbmVzCisgICAgICBjb25zdCBpbnQgdXZfdyA9ICh3ICsgMSkgPj4gMTsKKyAgICAgIGNvbnN0IGludCB1dl9oID0gKGggKyAxKSA+PiAxOworICAgICAgRXhwb3J0QmxvY2sodXNyYywgdWRzdCwgcGljLT51dl9zdHJpZGUsIHV2X3csIHV2X2gpOworICAgICAgRXhwb3J0QmxvY2sodnNyYywgdmRzdCwgcGljLT51dl9zdHJpZGUsIHV2X3csIHV2X2gpOworICAgIH0KKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTm9uLXplcm8gY29udGV4dHMgc2V0dXAvdGVhcmRvd24KKworLy8gTnogYml0czoKKy8vICAwICAxICAyICAzICBZCisvLyAgNCAgNSAgNiAgNworLy8gIDggIDkgMTAgMTEKKy8vIDEyIDEzIDE0IDE1CisvLyAxNiAxNyAgICAgICAgVQorLy8gMTggMTkKKy8vIDIwIDIxICAgICAgICBWCisvLyAyMiAyMworLy8gMjQgICAgICAgICAgIERDLWludHJhMTYKKworLy8gQ29udmVydCBwYWNrZWQgY29udGV4dCB0byBieXRlIGFycmF5CisjZGVmaW5lIEJJVChueiwgbikgKCEhKChueikgJiAoMSA8PCAobikpKSkKKwordm9pZCBWUDhJdGVyYXRvck56VG9CeXRlcyhWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKKyAgY29uc3QgaW50IHRueiA9IGl0LT5uel9bMF0sIGxueiA9IGl0LT5uel9bLTFdOworICBpbnQqIGNvbnN0IHRvcF9ueiA9IGl0LT50b3BfbnpfOworICBpbnQqIGNvbnN0IGxlZnRfbnogPSBpdC0+bGVmdF9uel87CisKKyAgLy8gVG9wLVkKKyAgdG9wX256WzBdID0gQklUKHRueiwgMTIpOworICB0b3BfbnpbMV0gPSBCSVQodG56LCAxMyk7CisgIHRvcF9uelsyXSA9IEJJVCh0bnosIDE0KTsKKyAgdG9wX256WzNdID0gQklUKHRueiwgMTUpOworICAvLyBUb3AtVQorICB0b3BfbnpbNF0gPSBCSVQodG56LCAxOCk7CisgIHRvcF9uels1XSA9IEJJVCh0bnosIDE5KTsKKyAgLy8gVG9wLVYKKyAgdG9wX256WzZdID0gQklUKHRueiwgMjIpOworICB0b3BfbnpbN10gPSBCSVQodG56LCAyMyk7CisgIC8vIERDCisgIHRvcF9uels4XSA9IEJJVCh0bnosIDI0KTsKKworICAvLyBsZWZ0LVkKKyAgbGVmdF9uelswXSA9IEJJVChsbnosICAzKTsKKyAgbGVmdF9uelsxXSA9IEJJVChsbnosICA3KTsKKyAgbGVmdF9uelsyXSA9IEJJVChsbnosIDExKTsKKyAgbGVmdF9uelszXSA9IEJJVChsbnosIDE1KTsKKyAgLy8gbGVmdC1VCisgIGxlZnRfbnpbNF0gPSBCSVQobG56LCAxNyk7CisgIGxlZnRfbnpbNV0gPSBCSVQobG56LCAxOSk7CisgIC8vIGxlZnQtVgorICBsZWZ0X256WzZdID0gQklUKGxueiwgMjEpOworICBsZWZ0X256WzddID0gQklUKGxueiwgMjMpOworICAvLyBsZWZ0LURDIGlzIHNwZWNpYWwsIGl0ZXJhdGVkIHNlcGFyYXRlbHkKK30KKwordm9pZCBWUDhJdGVyYXRvckJ5dGVzVG9OeihWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKKyAgdWludDMyX3QgbnogPSAwOworICBjb25zdCBpbnQqIGNvbnN0IHRvcF9ueiA9IGl0LT50b3BfbnpfOworICBjb25zdCBpbnQqIGNvbnN0IGxlZnRfbnogPSBpdC0+bGVmdF9uel87CisgIC8vIHRvcAorICBueiB8PSAodG9wX256WzBdIDw8IDEyKSB8ICh0b3BfbnpbMV0gPDwgMTMpOworICBueiB8PSAodG9wX256WzJdIDw8IDE0KSB8ICh0b3BfbnpbM10gPDwgMTUpOworICBueiB8PSAodG9wX256WzRdIDw8IDE4KSB8ICh0b3BfbnpbNV0gPDwgMTkpOworICBueiB8PSAodG9wX256WzZdIDw8IDIyKSB8ICh0b3BfbnpbN10gPDwgMjMpOworICBueiB8PSAodG9wX256WzhdIDw8IDI0KTsgIC8vIHdlIHByb3BhZ2F0ZSB0aGUgX3RvcF8gYml0LCBlc3AuIGZvciBpbnRyYTQKKyAgLy8gbGVmdAorICBueiB8PSAobGVmdF9uelswXSA8PCAzKSB8IChsZWZ0X256WzFdIDw8IDcpOworICBueiB8PSAobGVmdF9uelsyXSA8PCAxMSk7CisgIG56IHw9IChsZWZ0X256WzRdIDw8IDE3KSB8IChsZWZ0X256WzZdIDw8IDIxKTsKKworICAqaXQtPm56XyA9IG56OworfQorCisjdW5kZWYgQklUCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBZHZhbmNlIHRvIHRoZSBuZXh0IHBvc2l0aW9uLCBkb2luZyB0aGUgYm9va2tlZXBpbmcuCisKK3ZvaWQgVlA4SXRlcmF0b3JTYXZlQm91bmRhcnkoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KSB7CisgIFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOworICBjb25zdCBpbnQgeCA9IGl0LT54XywgeSA9IGl0LT55XzsKKyAgY29uc3QgdWludDhfdCogY29uc3QgeXNyYyA9IGl0LT55dXZfb3V0XyArIFlfT0ZGX0VOQzsKKyAgY29uc3QgdWludDhfdCogY29uc3QgdXZzcmMgPSBpdC0+eXV2X291dF8gKyBVX09GRl9FTkM7CisgIGlmICh4IDwgZW5jLT5tYl93XyAtIDEpIHsgICAvLyBsZWZ0CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIHsKKyAgICAgIGl0LT55X2xlZnRfW2ldID0geXNyY1sxNSArIGkgKiBCUFNdOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgKytpKSB7CisgICAgICBpdC0+dV9sZWZ0X1tpXSA9IHV2c3JjWzcgKyBpICogQlBTXTsKKyAgICAgIGl0LT52X2xlZnRfW2ldID0gdXZzcmNbMTUgKyBpICogQlBTXTsKKyAgICB9CisgICAgLy8gdG9wLWxlZnQgKGJlZm9yZSAndG9wJyEpCisgICAgaXQtPnlfbGVmdF9bLTFdID0gaXQtPnlfdG9wX1sxNV07CisgICAgaXQtPnVfbGVmdF9bLTFdID0gaXQtPnV2X3RvcF9bMCArIDddOworICAgIGl0LT52X2xlZnRfWy0xXSA9IGl0LT51dl90b3BfWzggKyA3XTsKKyAgfQorICBpZiAoeSA8IGVuYy0+bWJfaF8gLSAxKSB7ICAvLyB0b3AKKyAgICBtZW1jcHkoaXQtPnlfdG9wXywgeXNyYyArIDE1ICogQlBTLCAxNik7CisgICAgbWVtY3B5KGl0LT51dl90b3BfLCB1dnNyYyArIDcgKiBCUFMsIDggKyA4KTsKKyAgfQorfQorCitpbnQgVlA4SXRlcmF0b3JOZXh0KFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCkgeworICBpZiAoKytpdC0+eF8gPT0gaXQtPmVuY18tPm1iX3dfKSB7CisgICAgVlA4SXRlcmF0b3JTZXRSb3coaXQsICsraXQtPnlfKTsKKyAgfSBlbHNlIHsKKyAgICBpdC0+cHJlZHNfICs9IDQ7CisgICAgaXQtPm1iXyArPSAxOworICAgIGl0LT5uel8gKz0gMTsKKyAgICBpdC0+eV90b3BfICs9IDE2OworICAgIGl0LT51dl90b3BfICs9IDE2OworICB9CisgIHJldHVybiAoMCA8IC0taXQtPmNvdW50X2Rvd25fKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhlbHBlciBmdW5jdGlvbiB0byBzZXQgbW9kZSBwcm9wZXJ0aWVzCisKK3ZvaWQgVlA4U2V0SW50cmExNk1vZGUoY29uc3QgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBpbnQgbW9kZSkgeworICB1aW50OF90KiBwcmVkcyA9IGl0LT5wcmVkc187CisgIGludCB5OworICBmb3IgKHkgPSAwOyB5IDwgNDsgKyt5KSB7CisgICAgbWVtc2V0KHByZWRzLCBtb2RlLCA0KTsKKyAgICBwcmVkcyArPSBpdC0+ZW5jXy0+cHJlZHNfd187CisgIH0KKyAgaXQtPm1iXy0+dHlwZV8gPSAxOworfQorCit2b2lkIFZQOFNldEludHJhNE1vZGUoY29uc3QgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBjb25zdCB1aW50OF90KiBtb2RlcykgeworICB1aW50OF90KiBwcmVkcyA9IGl0LT5wcmVkc187CisgIGludCB5OworICBmb3IgKHkgPSA0OyB5ID4gMDsgLS15KSB7CisgICAgbWVtY3B5KHByZWRzLCBtb2RlcywgNCAqIHNpemVvZigqbW9kZXMpKTsKKyAgICBwcmVkcyArPSBpdC0+ZW5jXy0+cHJlZHNfd187CisgICAgbW9kZXMgKz0gNDsKKyAgfQorICBpdC0+bWJfLT50eXBlXyA9IDA7Cit9CisKK3ZvaWQgVlA4U2V0SW50cmFVVk1vZGUoY29uc3QgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBpbnQgbW9kZSkgeworICBpdC0+bWJfLT51dl9tb2RlXyA9IG1vZGU7Cit9CisKK3ZvaWQgVlA4U2V0U2tpcChjb25zdCBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsIGludCBza2lwKSB7CisgIGl0LT5tYl8tPnNraXBfID0gc2tpcDsKK30KKwordm9pZCBWUDhTZXRTZWdtZW50KGNvbnN0IFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgaW50IHNlZ21lbnQpIHsKKyAgaXQtPm1iXy0+c2VnbWVudF8gPSBzZWdtZW50OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW50cmE0eDQgc3ViLWJsb2NrcyBpdGVyYXRpb24KKy8vCisvLyAgV2Ugc3RvcmUgYW5kIHVwZGF0ZSB0aGUgYm91bmRhcnkgc2FtcGxlcyBpbnRvIGFuIGFycmF5IG9mIDM3IHBpeGVscy4gVGhleQorLy8gIGFyZSB1cGRhdGVkIGFzIHdlIGl0ZXJhdGUgYW5kIHJlY29uc3RydWN0cyBlYWNoIGludHJhNHg0IGJsb2NrcyBpbiB0dXJuLgorLy8gIFRoZSBwb3NpdGlvbiBvZiB0aGUgc2FtcGxlcyBoYXMgdGhlIGZvbGxvd2luZyBzbmFrZSBwYXR0ZXJuOgorLy8KKy8vIDE2fDE3IDE4IDE5IDIwfDIxIDIyIDIzIDI0fDI1IDI2IDI3IDI4fDI5IDMwIDMxIDMyfDMzIDM0IDM1IDM2ICA8LSBUb3AtcmlnaHQKKy8vIC0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKworLy8gMTV8ICAgICAgICAgMTl8ICAgICAgICAgMjN8ICAgICAgICAgMjd8ICAgICAgICAgMzF8CisvLyAxNHwgICAgICAgICAxOHwgICAgICAgICAyMnwgICAgICAgICAyNnwgICAgICAgICAzMHwKKy8vIDEzfCAgICAgICAgIDE3fCAgICAgICAgIDIxfCAgICAgICAgIDI1fCAgICAgICAgIDI5fAorLy8gMTJ8MTMgMTQgMTUgMTZ8MTcgMTggMTkgMjB8MjEgMjIgMjMgMjR8MjUgMjYgMjcgMjh8CisvLyAtLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsKKy8vIDExfCAgICAgICAgIDE1fCAgICAgICAgIDE5fCAgICAgICAgIDIzfCAgICAgICAgIDI3fAorLy8gMTB8ICAgICAgICAgMTR8ICAgICAgICAgMTh8ICAgICAgICAgMjJ8ICAgICAgICAgMjZ8CisvLyAgOXwgICAgICAgICAxM3wgICAgICAgICAxN3wgICAgICAgICAyMXwgICAgICAgICAyNXwKKy8vICA4fCA5IDEwIDExIDEyfDEzIDE0IDE1IDE2fDE3IDE4IDE5IDIwfDIxIDIyIDIzIDI0fAorLy8gLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rCisvLyAgN3wgICAgICAgICAxMXwgICAgICAgICAxNXwgICAgICAgICAxOXwgICAgICAgICAyM3wKKy8vICA2fCAgICAgICAgIDEwfCAgICAgICAgIDE0fCAgICAgICAgIDE4fCAgICAgICAgIDIyfAorLy8gIDV8ICAgICAgICAgIDl8ICAgICAgICAgMTN8ICAgICAgICAgMTd8ICAgICAgICAgMjF8CisvLyAgNHwgNSAgNiAgNyAgOHwgOSAxMCAxMSAxMnwxMyAxNCAxNSAxNnwxNyAxOCAxOSAyMHwKKy8vIC0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKworLy8gIDN8ICAgICAgICAgIDd8ICAgICAgICAgMTF8ICAgICAgICAgMTV8ICAgICAgICAgMTl8CisvLyAgMnwgICAgICAgICAgNnwgICAgICAgICAxMHwgICAgICAgICAxNHwgICAgICAgICAxOHwKKy8vICAxfCAgICAgICAgICA1fCAgICAgICAgICA5fCAgICAgICAgIDEzfCAgICAgICAgIDE3fAorLy8gIDB8IDEgIDIgIDMgIDR8IDUgIDYgIDcgIDh8IDkgMTAgMTEgMTJ8MTMgMTQgMTUgMTZ8CisvLyAtLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsKKworLy8gQXJyYXkgdG8gcmVjb3JkIHRoZSBwb3NpdGlvbiBvZiB0aGUgdG9wIHNhbXBsZSB0byBwYXNzIHRvIHRoZSBwcmVkaWN0aW9uCisvLyBmdW5jdGlvbnMgaW4gZHNwLmMuCitzdGF0aWMgY29uc3QgdWludDhfdCBWUDhUb3BMZWZ0STRbMTZdID0geworICAxNywgMjEsIDI1LCAyOSwKKyAgMTMsIDE3LCAyMSwgMjUsCisgIDksICAxMywgMTcsIDIxLAorICA1LCAgIDksIDEzLCAxNworfTsKKwordm9pZCBWUDhJdGVyYXRvclN0YXJ0STQoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KSB7CisgIGNvbnN0IFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOworICBpbnQgaTsKKworICBpdC0+aTRfID0gMDsgICAgLy8gZmlyc3QgNHg0IHN1Yi1ibG9jaworICBpdC0+aTRfdG9wXyA9IGl0LT5pNF9ib3VuZGFyeV8gKyBWUDhUb3BMZWZ0STRbMF07CisKKyAgLy8gSW1wb3J0IHRoZSBib3VuZGFyeSBzYW1wbGVzCisgIGZvciAoaSA9IDA7IGkgPCAxNzsgKytpKSB7ICAgIC8vIGxlZnQKKyAgICBpdC0+aTRfYm91bmRhcnlfW2ldID0gaXQtPnlfbGVmdF9bMTUgLSBpXTsKKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgeyAgICAvLyB0b3AKKyAgICBpdC0+aTRfYm91bmRhcnlfWzE3ICsgaV0gPSBpdC0+eV90b3BfW2ldOworICB9CisgIC8vIHRvcC1yaWdodCBzYW1wbGVzIGhhdmUgYSBzcGVjaWFsIGNhc2Ugb24gdGhlIGZhciByaWdodCBvZiB0aGUgcGljdHVyZQorICBpZiAoaXQtPnhfIDwgZW5jLT5tYl93XyAtIDEpIHsKKyAgICBmb3IgKGkgPSAxNjsgaSA8IDE2ICsgNDsgKytpKSB7CisgICAgICBpdC0+aTRfYm91bmRhcnlfWzE3ICsgaV0gPSBpdC0+eV90b3BfW2ldOworICAgIH0KKyAgfSBlbHNlIHsgICAgLy8gZWxzZSwgcmVwbGljYXRlIHRoZSBsYXN0IHZhbGlkIHBpeGVsIGZvdXIgdGltZXMKKyAgICBmb3IgKGkgPSAxNjsgaSA8IDE2ICsgNDsgKytpKSB7CisgICAgICBpdC0+aTRfYm91bmRhcnlfWzE3ICsgaV0gPSBpdC0+aTRfYm91bmRhcnlfWzE3ICsgMTVdOworICAgIH0KKyAgfQorICBWUDhJdGVyYXRvck56VG9CeXRlcyhpdCk7ICAvLyBpbXBvcnQgdGhlIG5vbi16ZXJvIGNvbnRleHQKK30KKworaW50IFZQOEl0ZXJhdG9yUm90YXRlSTQoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgeXV2X291dCkgeworICBjb25zdCB1aW50OF90KiBjb25zdCBibGsgPSB5dXZfb3V0ICsgVlA4U2NhbltpdC0+aTRfXTsKKyAgdWludDhfdCogY29uc3QgdG9wID0gaXQtPmk0X3RvcF87CisgIGludCBpOworCisgIC8vIFVwZGF0ZSB0aGUgY2FjaGUgd2l0aCA3IGZyZXNoIHNhbXBsZXMKKyAgZm9yIChpID0gMDsgaSA8PSAzOyArK2kpIHsKKyAgICB0b3BbLTQgKyBpXSA9IGJsa1tpICsgMyAqIEJQU107ICAgLy8gc3RvcmUgZnV0dXJlIHRvcCBzYW1wbGVzCisgIH0KKyAgaWYgKChpdC0+aTRfICYgMykgIT0gMykgeyAgLy8gaWYgbm90IG9uIHRoZSByaWdodCBzdWItYmxvY2tzICMzLCAjNywgIzExLCAjMTUKKyAgICBmb3IgKGkgPSAwOyBpIDw9IDI7ICsraSkgeyAgICAgICAgLy8gc3RvcmUgZnV0dXJlIGxlZnQgc2FtcGxlcworICAgICAgdG9wW2ldID0gYmxrWzMgKyAoMiAtIGkpICogQlBTXTsKKyAgICB9CisgIH0gZWxzZSB7ICAvLyBlbHNlIHJlcGxpY2F0ZSB0b3AtcmlnaHQgc2FtcGxlcywgYXMgc2F5cyB0aGUgc3BlY3MuCisgICAgZm9yIChpID0gMDsgaSA8PSAzOyArK2kpIHsKKyAgICAgIHRvcFtpXSA9IHRvcFtpICsgNF07CisgICAgfQorICB9CisgIC8vIG1vdmUgcG9pbnRlcnMgdG8gbmV4dCBzdWItYmxvY2sKKyAgKytpdC0+aTRfOworICBpZiAoaXQtPmk0XyA9PSAxNikgeyAgICAvLyB3ZSdyZSBkb25lCisgICAgcmV0dXJuIDA7CisgIH0KKworICBpdC0+aTRfdG9wXyA9IGl0LT5pNF9ib3VuZGFyeV8gKyBWUDhUb3BMZWZ0STRbaXQtPmk0X107CisgIHJldHVybiAxOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9uZWFyX2xvc3NsZXNzX2VuYy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9uZWFyX2xvc3NsZXNzX2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NDk0NjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL25lYXJfbG9zc2xlc3NfZW5jLmMKQEAgLTAsMCArMSwxNTYgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBOZWFyLWxvc3NsZXNzIGltYWdlIHByZXByb2Nlc3NpbmcgYWRqdXN0cyBwaXhlbCB2YWx1ZXMgdG8gaGVscAorLy8gY29tcHJlc3NpYmlsaXR5IHdpdGggYSBndWFyYW50ZWUgb2YgbWF4aW11bSBkZXZpYXRpb24gYmV0d2VlbiBvcmlnaW5hbCBhbmQKKy8vIHJlc3VsdGluZyBwaXhlbCB2YWx1ZXMuCisvLworLy8gQXV0aG9yOiBKeXJraSBBbGFrdWlqYWxhIChqeXJraUBnb29nbGUuY29tKQorLy8gQ29udmVydGVkIHRvIEMgYnkgQWxla3NhbmRlciBLcmFtYXJ6IChha3JhbWFyekBnb29nbGUuY29tKQorCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vYXNzZXJ0X3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdGRsaWJfcG9lbS5oIgorI2Vsc2UKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAic3JjL2RzcC9sb3NzbGVzc19jb21tb24uaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvZW5jL3ZwOGxpX2VuYy5oIgorCisjaWYgKFdFQlBfTkVBUl9MT1NTTEVTUyA9PSAxKQorCisjZGVmaW5lIE1JTl9ESU1fRk9SX05FQVJfTE9TU0xFU1MgNjQKKyNkZWZpbmUgTUFYX0xJTUlUX0JJVFMgICAgICAgICAgICAgNQorCisvLyBRdWFudGl6ZXMgdGhlIHZhbHVlIHVwIG9yIGRvd24gdG8gYSBtdWx0aXBsZSBvZiAxPDxiaXRzIChvciB0byAyNTUpLAorLy8gY2hvb3NpbmcgdGhlIGNsb3NlciBvbmUsIHJlc29sdmluZyB0aWVzIHVzaW5nIGJhbmtlcnMnIHJvdW5kaW5nLgorc3RhdGljIHVpbnQzMl90IEZpbmRDbG9zZXN0RGlzY3JldGl6ZWQodWludDMyX3QgYSwgaW50IGJpdHMpIHsKKyAgY29uc3QgdWludDMyX3QgbWFzayA9ICgxdSA8PCBiaXRzKSAtIDE7CisgIGNvbnN0IHVpbnQzMl90IGJpYXNlZCA9IGEgKyAobWFzayA+PiAxKSArICgoYSA+PiBiaXRzKSAmIDEpOworICBhc3NlcnQoYml0cyA+IDApOworICBpZiAoYmlhc2VkID4gMHhmZikgcmV0dXJuIDB4ZmY7CisgIHJldHVybiBiaWFzZWQgJiB+bWFzazsKK30KKworLy8gQXBwbGllcyBGaW5kQ2xvc2VzdERpc2NyZXRpemVkIHRvIGFsbCBjaGFubmVscyBvZiBwaXhlbC4KK3N0YXRpYyB1aW50MzJfdCBDbG9zZXN0RGlzY3JldGl6ZWRBcmdiKHVpbnQzMl90IGEsIGludCBiaXRzKSB7CisgIHJldHVybgorICAgICAgKEZpbmRDbG9zZXN0RGlzY3JldGl6ZWQoYSA+PiAyNCwgYml0cykgPDwgMjQpIHwKKyAgICAgIChGaW5kQ2xvc2VzdERpc2NyZXRpemVkKChhID4+IDE2KSAmIDB4ZmYsIGJpdHMpIDw8IDE2KSB8CisgICAgICAoRmluZENsb3Nlc3REaXNjcmV0aXplZCgoYSA+PiA4KSAmIDB4ZmYsIGJpdHMpIDw8IDgpIHwKKyAgICAgIChGaW5kQ2xvc2VzdERpc2NyZXRpemVkKGEgJiAweGZmLCBiaXRzKSk7Cit9CisKKy8vIENoZWNrcyBpZiBkaXN0YW5jZSBiZXR3ZWVuIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCB2YWx1ZXMgb2YgcGl4ZWxzIGEgYW5kIGIKKy8vIGlzIHdpdGhpbiB0aGUgZ2l2ZW4gbGltaXQuCitzdGF0aWMgaW50IElzTmVhcih1aW50MzJfdCBhLCB1aW50MzJfdCBiLCBpbnQgbGltaXQpIHsKKyAgaW50IGs7CisgIGZvciAoayA9IDA7IGsgPCA0OyArK2spIHsKKyAgICBjb25zdCBpbnQgZGVsdGEgPQorICAgICAgICAoaW50KSgoYSA+PiAoayAqIDgpKSAmIDB4ZmYpIC0gKGludCkoKGIgPj4gKGsgKiA4KSkgJiAweGZmKTsKKyAgICBpZiAoZGVsdGEgPj0gbGltaXQgfHwgZGVsdGEgPD0gLWxpbWl0KSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgSXNTbW9vdGgoY29uc3QgdWludDMyX3QqIGNvbnN0IHByZXZfcm93LAorICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgY3Vycl9yb3csCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBuZXh0X3JvdywKKyAgICAgICAgICAgICAgICAgICAgaW50IGl4LCBpbnQgbGltaXQpIHsKKyAgLy8gQ2hlY2sgdGhhdCBhbGwgcGl4ZWxzIGluIDQtY29ubmVjdGVkIG5laWdoYm9yaG9vZCBhcmUgc21vb3RoLgorICByZXR1cm4gKElzTmVhcihjdXJyX3Jvd1tpeF0sIGN1cnJfcm93W2l4IC0gMV0sIGxpbWl0KSAmJgorICAgICAgICAgIElzTmVhcihjdXJyX3Jvd1tpeF0sIGN1cnJfcm93W2l4ICsgMV0sIGxpbWl0KSAmJgorICAgICAgICAgIElzTmVhcihjdXJyX3Jvd1tpeF0sIHByZXZfcm93W2l4XSwgbGltaXQpICYmCisgICAgICAgICAgSXNOZWFyKGN1cnJfcm93W2l4XSwgbmV4dF9yb3dbaXhdLCBsaW1pdCkpOworfQorCisvLyBBZGp1c3RzIHBpeGVsIHZhbHVlcyBvZiBpbWFnZSB3aXRoIGdpdmVuIG1heGltdW0gZXJyb3IuCitzdGF0aWMgdm9pZCBOZWFyTG9zc2xlc3MoaW50IHhzaXplLCBpbnQgeXNpemUsIGNvbnN0IHVpbnQzMl90KiBhcmdiX3NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgbGltaXRfYml0cywgdWludDMyX3QqIGNvcHlfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBhcmdiX2RzdCkgeworICBpbnQgeCwgeTsKKyAgY29uc3QgaW50IGxpbWl0ID0gMSA8PCBsaW1pdF9iaXRzOworICB1aW50MzJfdCogcHJldl9yb3cgPSBjb3B5X2J1ZmZlcjsKKyAgdWludDMyX3QqIGN1cnJfcm93ID0gcHJldl9yb3cgKyB4c2l6ZTsKKyAgdWludDMyX3QqIG5leHRfcm93ID0gY3Vycl9yb3cgKyB4c2l6ZTsKKyAgbWVtY3B5KGN1cnJfcm93LCBhcmdiX3NyYywgeHNpemUgKiBzaXplb2YoYXJnYl9zcmNbMF0pKTsKKyAgbWVtY3B5KG5leHRfcm93LCBhcmdiX3NyYyArIHN0cmlkZSwgeHNpemUgKiBzaXplb2YoYXJnYl9zcmNbMF0pKTsKKworICBmb3IgKHkgPSAwOyB5IDwgeXNpemU7ICsreSwgYXJnYl9zcmMgKz0gc3RyaWRlLCBhcmdiX2RzdCArPSB4c2l6ZSkgeworICAgIGlmICh5ID09IDAgfHwgeSA9PSB5c2l6ZSAtIDEpIHsKKyAgICAgIG1lbWNweShhcmdiX2RzdCwgYXJnYl9zcmMsIHhzaXplICogc2l6ZW9mKGFyZ2Jfc3JjWzBdKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIG1lbWNweShuZXh0X3JvdywgYXJnYl9zcmMgKyBzdHJpZGUsIHhzaXplICogc2l6ZW9mKGFyZ2Jfc3JjWzBdKSk7CisgICAgICBhcmdiX2RzdFswXSA9IGFyZ2Jfc3JjWzBdOworICAgICAgYXJnYl9kc3RbeHNpemUgLSAxXSA9IGFyZ2Jfc3JjW3hzaXplIC0gMV07CisgICAgICBmb3IgKHggPSAxOyB4IDwgeHNpemUgLSAxOyArK3gpIHsKKyAgICAgICAgaWYgKElzU21vb3RoKHByZXZfcm93LCBjdXJyX3JvdywgbmV4dF9yb3csIHgsIGxpbWl0KSkgeworICAgICAgICAgIGFyZ2JfZHN0W3hdID0gY3Vycl9yb3dbeF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYXJnYl9kc3RbeF0gPSBDbG9zZXN0RGlzY3JldGl6ZWRBcmdiKGN1cnJfcm93W3hdLCBsaW1pdF9iaXRzKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICB7CisgICAgICAvLyBUaHJlZS13YXkgc3dhcC4KKyAgICAgIHVpbnQzMl90KiBjb25zdCB0ZW1wID0gcHJldl9yb3c7CisgICAgICBwcmV2X3JvdyA9IGN1cnJfcm93OworICAgICAgY3Vycl9yb3cgPSBuZXh0X3JvdzsKKyAgICAgIG5leHRfcm93ID0gdGVtcDsKKyAgICB9CisgIH0KK30KKworaW50IFZQOEFwcGx5TmVhckxvc3NsZXNzKGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWN0dXJlLCBpbnQgcXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogY29uc3QgYXJnYl9kc3QpIHsKKyAgaW50IGk7CisgIGNvbnN0IGludCB4c2l6ZSA9IHBpY3R1cmUtPndpZHRoOworICBjb25zdCBpbnQgeXNpemUgPSBwaWN0dXJlLT5oZWlnaHQ7CisgIGNvbnN0IGludCBzdHJpZGUgPSBwaWN0dXJlLT5hcmdiX3N0cmlkZTsKKyAgdWludDMyX3QqIGNvbnN0IGNvcHlfYnVmZmVyID0KKyAgICAgICh1aW50MzJfdCopV2ViUFNhZmVNYWxsb2MoeHNpemUgKiAzLCBzaXplb2YoKmNvcHlfYnVmZmVyKSk7CisgIGNvbnN0IGludCBsaW1pdF9iaXRzID0gVlA4TE5lYXJMb3NzbGVzc0JpdHMocXVhbGl0eSk7CisgIGFzc2VydChhcmdiX2RzdCAhPSBOVUxMKTsKKyAgYXNzZXJ0KGxpbWl0X2JpdHMgPiAwKTsKKyAgYXNzZXJ0KGxpbWl0X2JpdHMgPD0gTUFYX0xJTUlUX0JJVFMpOworICBpZiAoY29weV9idWZmZXIgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisgIC8vIEZvciBzbWFsbCBpY29uIGltYWdlcywgZG9uJ3QgYXR0ZW1wdCB0byBhcHBseSBuZWFyLWxvc3NsZXNzIGNvbXByZXNzaW9uLgorICBpZiAoKHhzaXplIDwgTUlOX0RJTV9GT1JfTkVBUl9MT1NTTEVTUyAmJgorICAgICAgIHlzaXplIDwgTUlOX0RJTV9GT1JfTkVBUl9MT1NTTEVTUykgfHwKKyAgICAgIHlzaXplIDwgMykgeworICAgIGZvciAoaSA9IDA7IGkgPCB5c2l6ZTsgKytpKSB7CisgICAgICBtZW1jcHkoYXJnYl9kc3QgKyBpICogeHNpemUsIHBpY3R1cmUtPmFyZ2IgKyBpICogcGljdHVyZS0+YXJnYl9zdHJpZGUsCisgICAgICAgICAgICAgeHNpemUgKiBzaXplb2YoKmFyZ2JfZHN0KSk7CisgICAgfQorICAgIFdlYlBTYWZlRnJlZShjb3B5X2J1ZmZlcik7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBOZWFyTG9zc2xlc3MoeHNpemUsIHlzaXplLCBwaWN0dXJlLT5hcmdiLCBzdHJpZGUsIGxpbWl0X2JpdHMsIGNvcHlfYnVmZmVyLAorICAgICAgICAgICAgICAgYXJnYl9kc3QpOworICBmb3IgKGkgPSBsaW1pdF9iaXRzIC0gMTsgaSAhPSAwOyAtLWkpIHsKKyAgICBOZWFyTG9zc2xlc3MoeHNpemUsIHlzaXplLCBhcmdiX2RzdCwgeHNpemUsIGksIGNvcHlfYnVmZmVyLCBhcmdiX2RzdCk7CisgIH0KKyAgV2ViUFNhZmVGcmVlKGNvcHlfYnVmZmVyKTsKKyAgcmV0dXJuIDE7Cit9CisjZWxzZSAgLy8gKFdFQlBfTkVBUl9MT1NTTEVTUyA9PSAxKQorCisvLyBEZWZpbmUgYSBzdHViIHRvIHN1cHByZXNzIGNvbXBpbGVyIHdhcm5pbmdzLgorZXh0ZXJuIHZvaWQgVlA4TE5lYXJMb3NzbGVzc1N0dWIodm9pZCk7Cit2b2lkIFZQOExOZWFyTG9zc2xlc3NTdHViKHZvaWQpIHt9CisKKyNlbmRpZiAgLy8gKFdFQlBfTkVBUl9MT1NTTEVTUyA9PSAxKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9waWN0dXJlX2NzcF9lbmMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvcGljdHVyZV9jc3BfZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFhNDYxOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvcGljdHVyZV9jc3BfZW5jLmMKQEAgLTAsMCArMSwxMjEyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gV2ViUFBpY3R1cmUgdXRpbHMgZm9yIGNvbG9yc3BhY2UgY29udmVyc2lvbgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9hc3NlcnRfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL21hdGhfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0ZGxpYl9wb2VtLmgiCisjZWxzZQorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNlbmRpZgorCisjaW5jbHVkZSAic3JjL2VuYy92cDhpX2VuYy5oIgorI2luY2x1ZGUgInNyYy91dGlscy9yYW5kb21fdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorI2luY2x1ZGUgInNyYy9kc3AvbG9zc2xlc3MuaCIKKyNpbmNsdWRlICJzcmMvZHNwL3l1di5oIgorCisvLyBVbmNvbW1lbnQgdG8gZGlzYWJsZSBnYW1tYS1jb21wcmVzc2lvbiBkdXJpbmcgUkdCLT5VL1YgYXZlcmFnaW5nCisjZGVmaW5lIFVTRV9HQU1NQV9DT01QUkVTU0lPTgorCisvLyBJZiBkZWZpbmVkLCB1c2UgdGFibGUgdG8gY29tcHV0ZSB4IC8gYWxwaGEuCisjZGVmaW5lIFVTRV9JTlZFUlNFX0FMUEhBX1RBQkxFCisKKyNpZmRlZiBXT1JEU19CSUdFTkRJQU4KKyNkZWZpbmUgQUxQSEFfT0ZGU0VUIDAgICAvLyB1aW50MzJfdCAweGZmMDAwMDAwIGlzIDB4ZmYsMDAsMDAsMDAgaW4gbWVtb3J5CisjZWxzZQorI2RlZmluZSBBTFBIQV9PRkZTRVQgMyAgIC8vIHVpbnQzMl90IDB4ZmYwMDAwMDAgaXMgMHgwMCwwMCwwMCxmZiBpbiBtZW1vcnkKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRGV0ZWN0aW9uIG9mIG5vbi10cml2aWFsIHRyYW5zcGFyZW5jeQorCisvLyBSZXR1cm5zIHRydWUgaWYgYWxwaGFbXSBoYXMgbm9uLTB4ZmYgdmFsdWVzLgorc3RhdGljIGludCBDaGVja05vbk9wYXF1ZShjb25zdCB1aW50OF90KiBhbHBoYSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeF9zdGVwLCBpbnQgeV9zdGVwKSB7CisgIGlmIChhbHBoYSA9PSBOVUxMKSByZXR1cm4gMDsKKyAgV2ViUEluaXRBbHBoYVByb2Nlc3NpbmcoKTsKKyAgaWYgKHhfc3RlcCA9PSAxKSB7CisgICAgZm9yICg7IGhlaWdodC0tID4gMDsgYWxwaGEgKz0geV9zdGVwKSB7CisgICAgICBpZiAoV2ViUEhhc0FscGhhOGIoYWxwaGEsIHdpZHRoKSkgcmV0dXJuIDE7CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAoOyBoZWlnaHQtLSA+IDA7IGFscGhhICs9IHlfc3RlcCkgeworICAgICAgaWYgKFdlYlBIYXNBbHBoYTMyYihhbHBoYSwgd2lkdGgpKSByZXR1cm4gMTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vIENoZWNraW5nIGZvciB0aGUgcHJlc2VuY2Ugb2Ygbm9uLW9wYXF1ZSBhbHBoYS4KK2ludCBXZWJQUGljdHVyZUhhc1RyYW5zcGFyZW5jeShjb25zdCBXZWJQUGljdHVyZSogcGljdHVyZSkgeworICBpZiAocGljdHVyZSA9PSBOVUxMKSByZXR1cm4gMDsKKyAgaWYgKCFwaWN0dXJlLT51c2VfYXJnYikgeworICAgIHJldHVybiBDaGVja05vbk9wYXF1ZShwaWN0dXJlLT5hLCBwaWN0dXJlLT53aWR0aCwgcGljdHVyZS0+aGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBwaWN0dXJlLT5hX3N0cmlkZSk7CisgIH0gZWxzZSB7CisgICAgY29uc3QgaW50IGFscGhhX29mZnNldCA9IEFMUEhBX09GRlNFVDsKKyAgICByZXR1cm4gQ2hlY2tOb25PcGFxdWUoKGNvbnN0IHVpbnQ4X3QqKXBpY3R1cmUtPmFyZ2IgKyBhbHBoYV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUtPndpZHRoLCBwaWN0dXJlLT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDQsIHBpY3R1cmUtPmFyZ2Jfc3RyaWRlICogc2l6ZW9mKCpwaWN0dXJlLT5hcmdiKSk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb2RlIGZvciBnYW1tYSBjb3JyZWN0aW9uCisKKyNpZiBkZWZpbmVkKFVTRV9HQU1NQV9DT01QUkVTU0lPTikKKworLy8gZ2FtbWEtY29tcGVuc2F0ZXMgbG9zcyBvZiByZXNvbHV0aW9uIGR1cmluZyBjaHJvbWEgc3Vic2FtcGxpbmcKKyNkZWZpbmUga0dhbW1hIDAuODAgICAgICAvLyBmb3Igbm93IHdlIHVzZSBhIGRpZmZlcmVudCBnYW1tYSB2YWx1ZSB0aGFuIGtHYW1tYUYKKyNkZWZpbmUga0dhbW1hRml4IDEyICAgICAvLyBmaXhlZC1wb2ludCBwcmVjaXNpb24gZm9yIGxpbmVhciB2YWx1ZXMKKyNkZWZpbmUga0dhbW1hU2NhbGUgKCgxIDw8IGtHYW1tYUZpeCkgLSAxKQorI2RlZmluZSBrR2FtbWFUYWJGaXggNyAgIC8vIGZpeGVkLXBvaW50IGZyYWN0aW9uYWwgYml0cyBwcmVjaXNpb24KKyNkZWZpbmUga0dhbW1hVGFiU2NhbGUgKDEgPDwga0dhbW1hVGFiRml4KQorI2RlZmluZSBrR2FtbWFUYWJSb3VuZGVyIChrR2FtbWFUYWJTY2FsZSA+PiAxKQorI2RlZmluZSBrR2FtbWFUYWJTaXplICgxIDw8IChrR2FtbWFGaXggLSBrR2FtbWFUYWJGaXgpKQorCitzdGF0aWMgaW50IGtMaW5lYXJUb0dhbW1hVGFiW2tHYW1tYVRhYlNpemUgKyAxXTsKK3N0YXRpYyB1aW50MTZfdCBrR2FtbWFUb0xpbmVhclRhYlsyNTZdOworc3RhdGljIHZvbGF0aWxlIGludCBrR2FtbWFUYWJsZXNPayA9IDA7CisKK3N0YXRpYyBXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgSW5pdEdhbW1hVGFibGVzKHZvaWQpIHsKKyAgaWYgKCFrR2FtbWFUYWJsZXNPaykgeworICAgIGludCB2OworICAgIGNvbnN0IGRvdWJsZSBzY2FsZSA9IChkb3VibGUpKDEgPDwga0dhbW1hVGFiRml4KSAvIGtHYW1tYVNjYWxlOworICAgIGNvbnN0IGRvdWJsZSBub3JtID0gMS4gLyAyNTUuOworICAgIGZvciAodiA9IDA7IHYgPD0gMjU1OyArK3YpIHsKKyAgICAgIGtHYW1tYVRvTGluZWFyVGFiW3ZdID0KKyAgICAgICAgICAodWludDE2X3QpKHBvdyhub3JtICogdiwga0dhbW1hKSAqIGtHYW1tYVNjYWxlICsgLjUpOworICAgIH0KKyAgICBmb3IgKHYgPSAwOyB2IDw9IGtHYW1tYVRhYlNpemU7ICsrdikgeworICAgICAga0xpbmVhclRvR2FtbWFUYWJbdl0gPSAoaW50KSgyNTUuICogcG93KHNjYWxlICogdiwgMS4gLyBrR2FtbWEpICsgLjUpOworICAgIH0KKyAgICBrR2FtbWFUYWJsZXNPayA9IDE7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IEdhbW1hVG9MaW5lYXIodWludDhfdCB2KSB7CisgIHJldHVybiBrR2FtbWFUb0xpbmVhclRhYlt2XTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBJbnRlcnBvbGF0ZShpbnQgdikgeworICBjb25zdCBpbnQgdGFiX3BvcyA9IHYgPj4gKGtHYW1tYVRhYkZpeCArIDIpOyAgICAvLyBpbnRlZ2VyIHBhcnQKKyAgY29uc3QgaW50IHggPSB2ICYgKChrR2FtbWFUYWJTY2FsZSA8PCAyKSAtIDEpOyAgLy8gZnJhY3Rpb25hbCBwYXJ0CisgIGNvbnN0IGludCB2MCA9IGtMaW5lYXJUb0dhbW1hVGFiW3RhYl9wb3NdOworICBjb25zdCBpbnQgdjEgPSBrTGluZWFyVG9HYW1tYVRhYlt0YWJfcG9zICsgMV07CisgIGNvbnN0IGludCB5ID0gdjEgKiB4ICsgdjAgKiAoKGtHYW1tYVRhYlNjYWxlIDw8IDIpIC0geCk7ICAgLy8gaW50ZXJwb2xhdGUKKyAgYXNzZXJ0KHRhYl9wb3MgKyAxIDwga0dhbW1hVGFiU2l6ZSArIDEpOworICByZXR1cm4geTsKK30KKworLy8gQ29udmVydCBhIGxpbmVhciB2YWx1ZSAndicgdG8gWVVWX0ZJWCsyIGZpeGVkLXBvaW50IHByZWNpc2lvbgorLy8gVS9WIHZhbHVlLCBzdWl0YWJsZSBmb3IgUkdCVG9VL1YgY2FsbHMuCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IExpbmVhclRvR2FtbWEodWludDMyX3QgYmFzZV92YWx1ZSwgaW50IHNoaWZ0KSB7CisgIGNvbnN0IGludCB5ID0gSW50ZXJwb2xhdGUoYmFzZV92YWx1ZSA8PCBzaGlmdCk7ICAgLy8gZmluYWwgdXBsaWZ0ZWQgdmFsdWUKKyAgcmV0dXJuICh5ICsga0dhbW1hVGFiUm91bmRlcikgPj4ga0dhbW1hVGFiRml4OyAgICAvLyBkZXNjYWxlCit9CisKKyNlbHNlCisKK3N0YXRpYyB2b2lkIEluaXRHYW1tYVRhYmxlcyh2b2lkKSB7fQorc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IEdhbW1hVG9MaW5lYXIodWludDhfdCB2KSB7IHJldHVybiB2OyB9CitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IExpbmVhclRvR2FtbWEodWludDMyX3QgYmFzZV92YWx1ZSwgaW50IHNoaWZ0KSB7CisgIHJldHVybiAoaW50KShiYXNlX3ZhbHVlIDw8IHNoaWZ0KTsKK30KKworI2VuZGlmICAgIC8vIFVTRV9HQU1NQV9DT01QUkVTU0lPTgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUkdCIC0+IFlVViBjb252ZXJzaW9uCisKK3N0YXRpYyBpbnQgUkdCVG9ZKGludCByLCBpbnQgZywgaW50IGIsIFZQOFJhbmRvbSogY29uc3QgcmcpIHsKKyAgcmV0dXJuIChyZyA9PSBOVUxMKSA/IFZQOFJHQlRvWShyLCBnLCBiLCBZVVZfSEFMRikKKyAgICAgICAgICAgICAgICAgICAgICA6IFZQOFJHQlRvWShyLCBnLCBiLCBWUDhSYW5kb21CaXRzKHJnLCBZVVZfRklYKSk7Cit9CisKK3N0YXRpYyBpbnQgUkdCVG9VKGludCByLCBpbnQgZywgaW50IGIsIFZQOFJhbmRvbSogY29uc3QgcmcpIHsKKyAgcmV0dXJuIChyZyA9PSBOVUxMKSA/IFZQOFJHQlRvVShyLCBnLCBiLCBZVVZfSEFMRiA8PCAyKQorICAgICAgICAgICAgICAgICAgICAgIDogVlA4UkdCVG9VKHIsIGcsIGIsIFZQOFJhbmRvbUJpdHMocmcsIFlVVl9GSVggKyAyKSk7Cit9CisKK3N0YXRpYyBpbnQgUkdCVG9WKGludCByLCBpbnQgZywgaW50IGIsIFZQOFJhbmRvbSogY29uc3QgcmcpIHsKKyAgcmV0dXJuIChyZyA9PSBOVUxMKSA/IFZQOFJHQlRvVihyLCBnLCBiLCBZVVZfSEFMRiA8PCAyKQorICAgICAgICAgICAgICAgICAgICAgIDogVlA4UkdCVG9WKHIsIGcsIGIsIFZQOFJhbmRvbUJpdHMocmcsIFlVVl9GSVggKyAyKSk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTaGFycCBSR0ItPllVViBjb252ZXJzaW9uCisKK3N0YXRpYyBjb25zdCBpbnQga051bUl0ZXJhdGlvbnMgPSA0Oworc3RhdGljIGNvbnN0IGludCBrTWluRGltZW5zaW9uSXRlcmF0aXZlQ29udmVyc2lvbiA9IDQ7CisKKy8vIFdlIGNvdWxkIHVzZSBTRklYPTAgYW5kIG9ubHkgdWludDhfdCBmb3IgZml4ZWRfeV90LCBidXQgaXQgcHJvZHVjZXMgc29tZQorLy8gYmFuZGluZyBzb21ldGltZXMuIEJldHRlciB1c2UgZXh0cmEgcHJlY2lzaW9uLgorI2RlZmluZSBTRklYIDIgICAgICAgICAgICAgICAgLy8gZml4ZWQtcG9pbnQgcHJlY2lzaW9uIG9mIFJHQiBhbmQgWS9XCit0eXBlZGVmIGludDE2X3QgZml4ZWRfdDsgICAgICAvLyBzaWduZWQgdHlwZSB3aXRoIGV4dHJhIFNGSVggcHJlY2lzaW9uIGZvciBVVgordHlwZWRlZiB1aW50MTZfdCBmaXhlZF95X3Q7ICAgLy8gdW5zaWduZWQgdHlwZSB3aXRoIGV4dHJhIFNGSVggcHJlY2lzaW9uIGZvciBXCisKKyNkZWZpbmUgU0hBTEYgKDEgPDwgU0ZJWCA+PiAxKQorI2RlZmluZSBNQVhfWV9UICgoMjU2IDw8IFNGSVgpIC0gMSkKKyNkZWZpbmUgU1JPVU5ERVIgKDEgPDwgKFlVVl9GSVggKyBTRklYIC0gMSkpCisKKyNpZiBkZWZpbmVkKFVTRV9HQU1NQV9DT01QUkVTU0lPTikKKworLy8gV2UgdXNlIHRhYmxlcyBvZiBkaWZmZXJlbnQgc2l6ZSBhbmQgcHJlY2lzaW9uIGZvciB0aGUgUmVjNzA5IC8gQlQyMDIwCisvLyB0cmFuc2ZlciBmdW5jdGlvbi4KKyNkZWZpbmUga0dhbW1hRiAoMS4vMC40NSkKK3N0YXRpYyB1aW50MzJfdCBrTGluZWFyVG9HYW1tYVRhYlNba0dhbW1hVGFiU2l6ZSArIDJdOworI2RlZmluZSBHQU1NQV9UT19MSU5FQVJfQklUUyAxNAorc3RhdGljIHVpbnQzMl90IGtHYW1tYVRvTGluZWFyVGFiU1tNQVhfWV9UICsgMV07ICAgLy8gc2l6ZSBzY2FsZXMgd2l0aCBZX0ZJWAorc3RhdGljIHZvbGF0aWxlIGludCBrR2FtbWFUYWJsZXNTT2sgPSAwOworCitzdGF0aWMgV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIEluaXRHYW1tYVRhYmxlc1Modm9pZCkgeworICBhc3NlcnQoMiAqIEdBTU1BX1RPX0xJTkVBUl9CSVRTIDwgMzIpOyAgLy8gd2UgdXNlIHVpbnQzMl90IGludGVybWVkaWF0ZSB2YWx1ZXMKKyAgaWYgKCFrR2FtbWFUYWJsZXNTT2spIHsKKyAgICBpbnQgdjsKKyAgICBjb25zdCBkb3VibGUgbm9ybSA9IDEuIC8gTUFYX1lfVDsKKyAgICBjb25zdCBkb3VibGUgc2NhbGUgPSAxLiAvIGtHYW1tYVRhYlNpemU7CisgICAgY29uc3QgZG91YmxlIGEgPSAwLjA5OTI5NjgyNjgwOTQ0OworICAgIGNvbnN0IGRvdWJsZSB0aHJlc2ggPSAwLjAxODA1Mzk2ODUxMDgwNzsKKyAgICBjb25zdCBkb3VibGUgZmluYWxfc2NhbGUgPSAxIDw8IEdBTU1BX1RPX0xJTkVBUl9CSVRTOworICAgIGZvciAodiA9IDA7IHYgPD0gTUFYX1lfVDsgKyt2KSB7CisgICAgICBjb25zdCBkb3VibGUgZyA9IG5vcm0gKiB2OworICAgICAgZG91YmxlIHZhbHVlOworICAgICAgaWYgKGcgPD0gdGhyZXNoICogNC41KSB7CisgICAgICAgIHZhbHVlID0gZyAvIDQuNTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IGRvdWJsZSBhX3JlYyA9IDEuIC8gKDEuICsgYSk7CisgICAgICAgIHZhbHVlID0gcG93KGFfcmVjICogKGcgKyBhKSwga0dhbW1hRik7CisgICAgICB9CisgICAgICBrR2FtbWFUb0xpbmVhclRhYlNbdl0gPSAodWludDMyX3QpKHZhbHVlICogZmluYWxfc2NhbGUgKyAuNSk7CisgICAgfQorICAgIGZvciAodiA9IDA7IHYgPD0ga0dhbW1hVGFiU2l6ZTsgKyt2KSB7CisgICAgICBjb25zdCBkb3VibGUgZyA9IHNjYWxlICogdjsKKyAgICAgIGRvdWJsZSB2YWx1ZTsKKyAgICAgIGlmIChnIDw9IHRocmVzaCkgeworICAgICAgICB2YWx1ZSA9IDQuNSAqIGc7CisgICAgICB9IGVsc2UgeworICAgICAgICB2YWx1ZSA9ICgxLiArIGEpICogcG93KGcsIDEuIC8ga0dhbW1hRikgLSBhOworICAgICAgfQorICAgICAgLy8gd2UgYWxyZWFkeSBpbmNvcnBvcmF0ZSB0aGUgMS8yIHJvdW5kaW5nIGNvbnN0YW50IGhlcmUKKyAgICAgIGtMaW5lYXJUb0dhbW1hVGFiU1t2XSA9CisgICAgICAgICAgKHVpbnQzMl90KShNQVhfWV9UICogdmFsdWUpICsgKDEgPDwgR0FNTUFfVE9fTElORUFSX0JJVFMgPj4gMSk7CisgICAgfQorICAgIC8vIHRvIHByZXZlbnQgc21hbGwgcm91bmRpbmcgZXJyb3JzIHRvIGNhdXNlIHJlYWQtb3ZlcmZsb3c6CisgICAga0xpbmVhclRvR2FtbWFUYWJTW2tHYW1tYVRhYlNpemUgKyAxXSA9IGtMaW5lYXJUb0dhbW1hVGFiU1trR2FtbWFUYWJTaXplXTsKKyAgICBrR2FtbWFUYWJsZXNTT2sgPSAxOworICB9Cit9CisKKy8vIHJldHVybiB2YWx1ZSBoYXMgYSBmaXhlZC1wb2ludCBwcmVjaXNpb24gb2YgR0FNTUFfVE9fTElORUFSX0JJVFMKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBHYW1tYVRvTGluZWFyUyhpbnQgdikgeworICByZXR1cm4ga0dhbW1hVG9MaW5lYXJUYWJTW3ZdOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgTGluZWFyVG9HYW1tYVModWludDMyX3QgdmFsdWUpIHsKKyAgLy8gJ3ZhbHVlJyBpcyBpbiBHQU1NQV9UT19MSU5FQVJfQklUUyBmcmFjdGlvbmFsIHByZWNpc2lvbgorICBjb25zdCB1aW50MzJfdCB2ID0gdmFsdWUgKiBrR2FtbWFUYWJTaXplOworICBjb25zdCB1aW50MzJfdCB0YWJfcG9zID0gdiA+PiBHQU1NQV9UT19MSU5FQVJfQklUUzsKKyAgLy8gZnJhY3Rpb25hbCBwYXJ0LCBpbiBHQU1NQV9UT19MSU5FQVJfQklUUyBmaXhlZC1wb2ludCBwcmVjaXNpb24KKyAgY29uc3QgdWludDMyX3QgeCA9IHYgLSAodGFiX3BvcyA8PCBHQU1NQV9UT19MSU5FQVJfQklUUyk7ICAvLyBmcmFjdGlvbmFsIHBhcnQKKyAgLy8gdjAgLyB2MSBhcmUgaW4gR0FNTUFfVE9fTElORUFSX0JJVFMgZml4ZWQtcG9pbnQgcHJlY2lzaW9uIChyYW5nZSBbMC4uMV0pCisgIGNvbnN0IHVpbnQzMl90IHYwID0ga0xpbmVhclRvR2FtbWFUYWJTW3RhYl9wb3MgKyAwXTsKKyAgY29uc3QgdWludDMyX3QgdjEgPSBrTGluZWFyVG9HYW1tYVRhYlNbdGFiX3BvcyArIDFdOworICAvLyBGaW5hbCBpbnRlcnBvbGF0aW9uLiBOb3RlIHRoYXQgcm91bmRpbmcgaXMgYWxyZWFkeSBpbmNsdWRlZC4KKyAgY29uc3QgdWludDMyX3QgdjIgPSAodjEgLSB2MCkgKiB4OyAgICAvLyBub3RlOiB2MSA+PSB2MC4KKyAgY29uc3QgdWludDMyX3QgcmVzdWx0ID0gdjAgKyAodjIgPj4gR0FNTUFfVE9fTElORUFSX0JJVFMpOworICByZXR1cm4gcmVzdWx0OworfQorCisjZWxzZQorCitzdGF0aWMgdm9pZCBJbml0R2FtbWFUYWJsZXNTKHZvaWQpIHt9CitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgR2FtbWFUb0xpbmVhclMoaW50IHYpIHsKKyAgcmV0dXJuICh2IDw8IEdBTU1BX1RPX0xJTkVBUl9CSVRTKSAvIE1BWF9ZX1Q7Cit9CitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgTGluZWFyVG9HYW1tYVModWludDMyX3QgdmFsdWUpIHsKKyAgcmV0dXJuIChNQVhfWV9UICogdmFsdWUpID4+IEdBTU1BX1RPX0xJTkVBUl9CSVRTOworfQorCisjZW5kaWYgICAgLy8gVVNFX0dBTU1BX0NPTVBSRVNTSU9OCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB1aW50OF90IGNsaXBfOGIoZml4ZWRfdCB2KSB7CisgIHJldHVybiAoISh2ICYgfjB4ZmYpKSA/ICh1aW50OF90KXYgOiAodiA8IDApID8gMHUgOiAyNTV1OworfQorCitzdGF0aWMgZml4ZWRfeV90IGNsaXBfeShpbnQgeSkgeworICByZXR1cm4gKCEoeSAmIH5NQVhfWV9UKSkgPyAoZml4ZWRfeV90KXkgOiAoeSA8IDApID8gMCA6IE1BWF9ZX1Q7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBpbnQgUkdCVG9HcmF5KGludCByLCBpbnQgZywgaW50IGIpIHsKKyAgY29uc3QgaW50IGx1bWEgPSAxMzkzMyAqIHIgKyA0Njg3MSAqIGcgKyA0NzMyICogYiArIFlVVl9IQUxGOworICByZXR1cm4gKGx1bWEgPj4gWVVWX0ZJWCk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBTY2FsZURvd24oaW50IGEsIGludCBiLCBpbnQgYywgaW50IGQpIHsKKyAgY29uc3QgdWludDMyX3QgQSA9IEdhbW1hVG9MaW5lYXJTKGEpOworICBjb25zdCB1aW50MzJfdCBCID0gR2FtbWFUb0xpbmVhclMoYik7CisgIGNvbnN0IHVpbnQzMl90IEMgPSBHYW1tYVRvTGluZWFyUyhjKTsKKyAgY29uc3QgdWludDMyX3QgRCA9IEdhbW1hVG9MaW5lYXJTKGQpOworICByZXR1cm4gTGluZWFyVG9HYW1tYVMoKEEgKyBCICsgQyArIEQgKyAyKSA+PiAyKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVXBkYXRlVyhjb25zdCBmaXhlZF95X3QqIHNyYywgZml4ZWRfeV90KiBkc3QsIGludCB3KSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgdzsgKytpKSB7CisgICAgY29uc3QgdWludDMyX3QgUiA9IEdhbW1hVG9MaW5lYXJTKHNyY1swICogdyArIGldKTsKKyAgICBjb25zdCB1aW50MzJfdCBHID0gR2FtbWFUb0xpbmVhclMoc3JjWzEgKiB3ICsgaV0pOworICAgIGNvbnN0IHVpbnQzMl90IEIgPSBHYW1tYVRvTGluZWFyUyhzcmNbMiAqIHcgKyBpXSk7CisgICAgY29uc3QgdWludDMyX3QgWSA9IFJHQlRvR3JheShSLCBHLCBCKTsKKyAgICBkc3RbaV0gPSAoZml4ZWRfeV90KUxpbmVhclRvR2FtbWFTKFkpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFVwZGF0ZUNocm9tYShjb25zdCBmaXhlZF95X3QqIHNyYzEsIGNvbnN0IGZpeGVkX3lfdCogc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF90KiBkc3QsIGludCB1dl93KSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgdXZfdzsgKytpKSB7CisgICAgY29uc3QgaW50IHIgPSBTY2FsZURvd24oc3JjMVswICogdXZfdyArIDBdLCBzcmMxWzAgKiB1dl93ICsgMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMlswICogdXZfdyArIDBdLCBzcmMyWzAgKiB1dl93ICsgMV0pOworICAgIGNvbnN0IGludCBnID0gU2NhbGVEb3duKHNyYzFbMiAqIHV2X3cgKyAwXSwgc3JjMVsyICogdXZfdyArIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzJbMiAqIHV2X3cgKyAwXSwgc3JjMlsyICogdXZfdyArIDFdKTsKKyAgICBjb25zdCBpbnQgYiA9IFNjYWxlRG93bihzcmMxWzQgKiB1dl93ICsgMF0sIHNyYzFbNCAqIHV2X3cgKyAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMyWzQgKiB1dl93ICsgMF0sIHNyYzJbNCAqIHV2X3cgKyAxXSk7CisgICAgY29uc3QgaW50IFcgPSBSR0JUb0dyYXkociwgZywgYik7CisgICAgZHN0WzAgKiB1dl93XSA9IChmaXhlZF90KShyIC0gVyk7CisgICAgZHN0WzEgKiB1dl93XSA9IChmaXhlZF90KShnIC0gVyk7CisgICAgZHN0WzIgKiB1dl93XSA9IChmaXhlZF90KShiIC0gVyk7CisgICAgZHN0ICArPSAxOworICAgIHNyYzEgKz0gMjsKKyAgICBzcmMyICs9IDI7CisgIH0KK30KKworc3RhdGljIHZvaWQgU3RvcmVHcmF5KGNvbnN0IGZpeGVkX3lfdCogcmdiLCBmaXhlZF95X3QqIHksIGludCB3KSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgdzsgKytpKSB7CisgICAgeVtpXSA9IFJHQlRvR3JheShyZ2JbMCAqIHcgKyBpXSwgcmdiWzEgKiB3ICsgaV0sIHJnYlsyICogdyArIGldKTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgV0VCUF9JTkxJTkUgZml4ZWRfeV90IEZpbHRlcjIoaW50IEEsIGludCBCLCBpbnQgVzApIHsKKyAgY29uc3QgaW50IHYwID0gKEEgKiAzICsgQiArIDIpID4+IDI7CisgIHJldHVybiBjbGlwX3kodjAgKyBXMCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBXRUJQX0lOTElORSBmaXhlZF95X3QgVXBMaWZ0KHVpbnQ4X3QgYSkgeyAgLy8gOGJpdCAtPiBTRklYCisgIHJldHVybiAoKGZpeGVkX3lfdClhIDw8IFNGSVgpIHwgU0hBTEY7Cit9CisKK3N0YXRpYyB2b2lkIEltcG9ydE9uZVJvdyhjb25zdCB1aW50OF90KiBjb25zdCByX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBnX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBiX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGljX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkX3lfdCogY29uc3QgZHN0KSB7CisgIGludCBpOworICBjb25zdCBpbnQgdyA9IChwaWNfd2lkdGggKyAxKSAmIH4xOworICBmb3IgKGkgPSAwOyBpIDwgcGljX3dpZHRoOyArK2kpIHsKKyAgICBjb25zdCBpbnQgb2ZmID0gaSAqIHN0ZXA7CisgICAgZHN0W2kgKyAwICogd10gPSBVcExpZnQocl9wdHJbb2ZmXSk7CisgICAgZHN0W2kgKyAxICogd10gPSBVcExpZnQoZ19wdHJbb2ZmXSk7CisgICAgZHN0W2kgKyAyICogd10gPSBVcExpZnQoYl9wdHJbb2ZmXSk7CisgIH0KKyAgaWYgKHBpY193aWR0aCAmIDEpIHsgIC8vIHJlcGxpY2F0ZSByaWdodG1vc3QgcGl4ZWwKKyAgICBkc3RbcGljX3dpZHRoICsgMCAqIHddID0gZHN0W3BpY193aWR0aCArIDAgKiB3IC0gMV07CisgICAgZHN0W3BpY193aWR0aCArIDEgKiB3XSA9IGRzdFtwaWNfd2lkdGggKyAxICogdyAtIDFdOworICAgIGRzdFtwaWNfd2lkdGggKyAyICogd10gPSBkc3RbcGljX3dpZHRoICsgMiAqIHcgLSAxXTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBJbnRlcnBvbGF0ZVR3b1Jvd3MoY29uc3QgZml4ZWRfeV90KiBjb25zdCBiZXN0X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZml4ZWRfdCogcHJldl91diwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaXhlZF90KiBjdXJfdXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZml4ZWRfdCogbmV4dF91diwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF95X3QqIG91dDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRfeV90KiBvdXQyKSB7CisgIGNvbnN0IGludCB1dl93ID0gdyA+PiAxOworICBjb25zdCBpbnQgbGVuID0gKHcgLSAxKSA+PiAxOyAgIC8vIGxlbmd0aCB0byBmaWx0ZXIKKyAgaW50IGsgPSAzOworICB3aGlsZSAoay0tID4gMCkgeyAgIC8vIHByb2Nlc3MgZWFjaCBSL0cvQiBzZWdtZW50cyBpbiB0dXJuCisgICAgLy8gc3BlY2lhbCBib3VuZGFyeSBjYXNlIGZvciBpPT0wCisgICAgb3V0MVswXSA9IEZpbHRlcjIoY3VyX3V2WzBdLCBwcmV2X3V2WzBdLCBiZXN0X3lbMF0pOworICAgIG91dDJbMF0gPSBGaWx0ZXIyKGN1cl91dlswXSwgbmV4dF91dlswXSwgYmVzdF95W3ddKTsKKworICAgIFdlYlBTaGFycFlVVkZpbHRlclJvdyhjdXJfdXYsIHByZXZfdXYsIGxlbiwgYmVzdF95ICsgMCArIDEsIG91dDEgKyAxKTsKKyAgICBXZWJQU2hhcnBZVVZGaWx0ZXJSb3coY3VyX3V2LCBuZXh0X3V2LCBsZW4sIGJlc3RfeSArIHcgKyAxLCBvdXQyICsgMSk7CisKKyAgICAvLyBzcGVjaWFsIGJvdW5kYXJ5IGNhc2UgZm9yIGkgPT0gdyAtIDEgd2hlbiB3IGlzIGV2ZW4KKyAgICBpZiAoISh3ICYgMSkpIHsKKyAgICAgIG91dDFbdyAtIDFdID0gRmlsdGVyMihjdXJfdXZbdXZfdyAtIDFdLCBwcmV2X3V2W3V2X3cgLSAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0X3lbdyAtIDEgKyAwXSk7CisgICAgICBvdXQyW3cgLSAxXSA9IEZpbHRlcjIoY3VyX3V2W3V2X3cgLSAxXSwgbmV4dF91dlt1dl93IC0gMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF95W3cgLSAxICsgd10pOworICAgIH0KKyAgICBvdXQxICs9IHc7CisgICAgb3V0MiArPSB3OworICAgIHByZXZfdXYgKz0gdXZfdzsKKyAgICBjdXJfdXYgICs9IHV2X3c7CisgICAgbmV4dF91diArPSB1dl93OworICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50OF90IENvbnZlcnRSR0JUb1koaW50IHIsIGludCBnLCBpbnQgYikgeworICBjb25zdCBpbnQgbHVtYSA9IDE2ODM5ICogciArIDMzMDU5ICogZyArIDY0MjAgKiBiICsgU1JPVU5ERVI7CisgIHJldHVybiBjbGlwXzhiKDE2ICsgKGx1bWEgPj4gKFlVVl9GSVggKyBTRklYKSkpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDhfdCBDb252ZXJ0UkdCVG9VKGludCByLCBpbnQgZywgaW50IGIpIHsKKyAgY29uc3QgaW50IHUgPSAgLTk3MTkgKiByIC0gMTkwODEgKiBnICsgMjg4MDAgKiBiICsgU1JPVU5ERVI7CisgIHJldHVybiBjbGlwXzhiKDEyOCArICh1ID4+IChZVVZfRklYICsgU0ZJWCkpKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ4X3QgQ29udmVydFJHQlRvVihpbnQgciwgaW50IGcsIGludCBiKSB7CisgIGNvbnN0IGludCB2ID0gKzI4ODAwICogciAtIDI0MTE2ICogZyAtICA0Njg0ICogYiArIFNST1VOREVSOworICByZXR1cm4gY2xpcF84YigxMjggKyAodiA+PiAoWVVWX0ZJWCArIFNGSVgpKSk7Cit9CisKK3N0YXRpYyBpbnQgQ29udmVydFdSR0JUb1lVVihjb25zdCBmaXhlZF95X3QqIGJlc3RfeSwgY29uc3QgZml4ZWRfdCogYmVzdF91diwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSkgeworICBpbnQgaSwgajsKKyAgdWludDhfdCogZHN0X3kgPSBwaWN0dXJlLT55OworICB1aW50OF90KiBkc3RfdSA9IHBpY3R1cmUtPnU7CisgIHVpbnQ4X3QqIGRzdF92ID0gcGljdHVyZS0+djsKKyAgY29uc3QgZml4ZWRfdCogY29uc3QgYmVzdF91dl9iYXNlID0gYmVzdF91djsKKyAgY29uc3QgaW50IHcgPSAocGljdHVyZS0+d2lkdGggKyAxKSAmIH4xOworICBjb25zdCBpbnQgaCA9IChwaWN0dXJlLT5oZWlnaHQgKyAxKSAmIH4xOworICBjb25zdCBpbnQgdXZfdyA9IHcgPj4gMTsKKyAgY29uc3QgaW50IHV2X2ggPSBoID4+IDE7CisgIGZvciAoYmVzdF91diA9IGJlc3RfdXZfYmFzZSwgaiA9IDA7IGogPCBwaWN0dXJlLT5oZWlnaHQ7ICsraikgeworICAgIGZvciAoaSA9IDA7IGkgPCBwaWN0dXJlLT53aWR0aDsgKytpKSB7CisgICAgICBjb25zdCBpbnQgb2ZmID0gKGkgPj4gMSk7CisgICAgICBjb25zdCBpbnQgVyA9IGJlc3RfeVtpXTsKKyAgICAgIGNvbnN0IGludCByID0gYmVzdF91dltvZmYgKyAwICogdXZfd10gKyBXOworICAgICAgY29uc3QgaW50IGcgPSBiZXN0X3V2W29mZiArIDEgKiB1dl93XSArIFc7CisgICAgICBjb25zdCBpbnQgYiA9IGJlc3RfdXZbb2ZmICsgMiAqIHV2X3ddICsgVzsKKyAgICAgIGRzdF95W2ldID0gQ29udmVydFJHQlRvWShyLCBnLCBiKTsKKyAgICB9CisgICAgYmVzdF95ICs9IHc7CisgICAgYmVzdF91diArPSAoaiAmIDEpICogMyAqIHV2X3c7CisgICAgZHN0X3kgKz0gcGljdHVyZS0+eV9zdHJpZGU7CisgIH0KKyAgZm9yIChiZXN0X3V2ID0gYmVzdF91dl9iYXNlLCBqID0gMDsgaiA8IHV2X2g7ICsraikgeworICAgIGZvciAoaSA9IDA7IGkgPCB1dl93OyArK2kpIHsKKyAgICAgIGNvbnN0IGludCBvZmYgPSBpOworICAgICAgY29uc3QgaW50IHIgPSBiZXN0X3V2W29mZiArIDAgKiB1dl93XTsKKyAgICAgIGNvbnN0IGludCBnID0gYmVzdF91dltvZmYgKyAxICogdXZfd107CisgICAgICBjb25zdCBpbnQgYiA9IGJlc3RfdXZbb2ZmICsgMiAqIHV2X3ddOworICAgICAgZHN0X3VbaV0gPSBDb252ZXJ0UkdCVG9VKHIsIGcsIGIpOworICAgICAgZHN0X3ZbaV0gPSBDb252ZXJ0UkdCVG9WKHIsIGcsIGIpOworICAgIH0KKyAgICBiZXN0X3V2ICs9IDMgKiB1dl93OworICAgIGRzdF91ICs9IHBpY3R1cmUtPnV2X3N0cmlkZTsKKyAgICBkc3RfdiArPSBwaWN0dXJlLT51dl9zdHJpZGU7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNYWluIGZ1bmN0aW9uCisKKyNkZWZpbmUgU0FGRV9BTExPQyhXLCBILCBUKSAoKFQqKVdlYlBTYWZlTWFsbG9jKChXKSAqIChIKSwgc2l6ZW9mKFQpKSkKKworc3RhdGljIGludCBQcmVwcm9jZXNzQVJHQihjb25zdCB1aW50OF90KiByX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogZ19wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGJfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RlcCwgaW50IHJnYl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBQaWN0dXJlKiBjb25zdCBwaWN0dXJlKSB7CisgIC8vIHdlIGV4cGFuZCB0aGUgcmlnaHQvYm90dG9tIGJvcmRlciBpZiBuZWVkZWQKKyAgY29uc3QgaW50IHcgPSAocGljdHVyZS0+d2lkdGggKyAxKSAmIH4xOworICBjb25zdCBpbnQgaCA9IChwaWN0dXJlLT5oZWlnaHQgKyAxKSAmIH4xOworICBjb25zdCBpbnQgdXZfdyA9IHcgPj4gMTsKKyAgY29uc3QgaW50IHV2X2ggPSBoID4+IDE7CisgIHVpbnQ2NF90IHByZXZfZGlmZl95X3N1bSA9IH4wOworICBpbnQgaiwgaXRlcjsKKworICAvLyBUT0RPKHNrYWwpOiBhbGxvY2F0ZSBvbmUgYmlnIG1lbW9yeSBjaHVuay4gQnV0IGZvciBub3csIGl0J3MgZWFzaWVyCisgIC8vIGZvciB2YWxncmluZCBkZWJ1Z2dpbmcgdG8gaGF2ZSBzZXZlcmFsIGNodW5rcy4KKyAgZml4ZWRfeV90KiBjb25zdCB0bXBfYnVmZmVyID0gU0FGRV9BTExPQyh3ICogMywgMiwgZml4ZWRfeV90KTsgICAvLyBzY3JhdGNoCisgIGZpeGVkX3lfdCogY29uc3QgYmVzdF95X2Jhc2UgPSBTQUZFX0FMTE9DKHcsIGgsIGZpeGVkX3lfdCk7CisgIGZpeGVkX3lfdCogY29uc3QgdGFyZ2V0X3lfYmFzZSA9IFNBRkVfQUxMT0ModywgaCwgZml4ZWRfeV90KTsKKyAgZml4ZWRfeV90KiBjb25zdCBiZXN0X3JnYl95ID0gU0FGRV9BTExPQyh3LCAyLCBmaXhlZF95X3QpOworICBmaXhlZF90KiBjb25zdCBiZXN0X3V2X2Jhc2UgPSBTQUZFX0FMTE9DKHV2X3cgKiAzLCB1dl9oLCBmaXhlZF90KTsKKyAgZml4ZWRfdCogY29uc3QgdGFyZ2V0X3V2X2Jhc2UgPSBTQUZFX0FMTE9DKHV2X3cgKiAzLCB1dl9oLCBmaXhlZF90KTsKKyAgZml4ZWRfdCogY29uc3QgYmVzdF9yZ2JfdXYgPSBTQUZFX0FMTE9DKHV2X3cgKiAzLCAxLCBmaXhlZF90KTsKKyAgZml4ZWRfeV90KiBiZXN0X3kgPSBiZXN0X3lfYmFzZTsKKyAgZml4ZWRfeV90KiB0YXJnZXRfeSA9IHRhcmdldF95X2Jhc2U7CisgIGZpeGVkX3QqIGJlc3RfdXYgPSBiZXN0X3V2X2Jhc2U7CisgIGZpeGVkX3QqIHRhcmdldF91diA9IHRhcmdldF91dl9iYXNlOworICBjb25zdCB1aW50NjRfdCBkaWZmX3lfdGhyZXNob2xkID0gKHVpbnQ2NF90KSgzLjAgKiB3ICogaCk7CisgIGludCBvazsKKworICBpZiAoYmVzdF95X2Jhc2UgPT0gTlVMTCB8fCBiZXN0X3V2X2Jhc2UgPT0gTlVMTCB8fAorICAgICAgdGFyZ2V0X3lfYmFzZSA9PSBOVUxMIHx8IHRhcmdldF91dl9iYXNlID09IE5VTEwgfHwKKyAgICAgIGJlc3RfcmdiX3kgPT0gTlVMTCB8fCBiZXN0X3JnYl91diA9PSBOVUxMIHx8CisgICAgICB0bXBfYnVmZmVyID09IE5VTEwpIHsKKyAgICBvayA9IFdlYlBFbmNvZGluZ1NldEVycm9yKHBpY3R1cmUsIFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWSk7CisgICAgZ290byBFbmQ7CisgIH0KKyAgYXNzZXJ0KHBpY3R1cmUtPndpZHRoID49IGtNaW5EaW1lbnNpb25JdGVyYXRpdmVDb252ZXJzaW9uKTsKKyAgYXNzZXJ0KHBpY3R1cmUtPmhlaWdodCA+PSBrTWluRGltZW5zaW9uSXRlcmF0aXZlQ29udmVyc2lvbik7CisKKyAgV2ViUEluaXRDb252ZXJ0QVJHQlRvWVVWKCk7CisKKyAgLy8gSW1wb3J0IFJHQiBzYW1wbGVzIHRvIFcvUkdCIHJlcHJlc2VudGF0aW9uLgorICBmb3IgKGogPSAwOyBqIDwgcGljdHVyZS0+aGVpZ2h0OyBqICs9IDIpIHsKKyAgICBjb25zdCBpbnQgaXNfbGFzdF9yb3cgPSAoaiA9PSBwaWN0dXJlLT5oZWlnaHQgLSAxKTsKKyAgICBmaXhlZF95X3QqIGNvbnN0IHNyYzEgPSB0bXBfYnVmZmVyICsgMCAqIHc7CisgICAgZml4ZWRfeV90KiBjb25zdCBzcmMyID0gdG1wX2J1ZmZlciArIDMgKiB3OworCisgICAgLy8gcHJlcGFyZSB0d28gcm93cyBvZiBpbnB1dAorICAgIEltcG9ydE9uZVJvdyhyX3B0ciwgZ19wdHIsIGJfcHRyLCBzdGVwLCBwaWN0dXJlLT53aWR0aCwgc3JjMSk7CisgICAgaWYgKCFpc19sYXN0X3JvdykgeworICAgICAgSW1wb3J0T25lUm93KHJfcHRyICsgcmdiX3N0cmlkZSwgZ19wdHIgKyByZ2Jfc3RyaWRlLCBiX3B0ciArIHJnYl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgc3RlcCwgcGljdHVyZS0+d2lkdGgsIHNyYzIpOworICAgIH0gZWxzZSB7CisgICAgICBtZW1jcHkoc3JjMiwgc3JjMSwgMyAqIHcgKiBzaXplb2YoKnNyYzIpKTsKKyAgICB9CisgICAgU3RvcmVHcmF5KHNyYzEsIGJlc3RfeSArIDAsIHcpOworICAgIFN0b3JlR3JheShzcmMyLCBiZXN0X3kgKyB3LCB3KTsKKworICAgIFVwZGF0ZVcoc3JjMSwgdGFyZ2V0X3ksIHcpOworICAgIFVwZGF0ZVcoc3JjMiwgdGFyZ2V0X3kgKyB3LCB3KTsKKyAgICBVcGRhdGVDaHJvbWEoc3JjMSwgc3JjMiwgdGFyZ2V0X3V2LCB1dl93KTsKKyAgICBtZW1jcHkoYmVzdF91diwgdGFyZ2V0X3V2LCAzICogdXZfdyAqIHNpemVvZigqYmVzdF91dikpOworICAgIGJlc3RfeSArPSAyICogdzsKKyAgICBiZXN0X3V2ICs9IDMgKiB1dl93OworICAgIHRhcmdldF95ICs9IDIgKiB3OworICAgIHRhcmdldF91diArPSAzICogdXZfdzsKKyAgICByX3B0ciArPSAyICogcmdiX3N0cmlkZTsKKyAgICBnX3B0ciArPSAyICogcmdiX3N0cmlkZTsKKyAgICBiX3B0ciArPSAyICogcmdiX3N0cmlkZTsKKyAgfQorCisgIC8vIEl0ZXJhdGUgYW5kIHJlc29sdmUgY2xpcHBpbmcgY29uZmxpY3RzLgorICBmb3IgKGl0ZXIgPSAwOyBpdGVyIDwga051bUl0ZXJhdGlvbnM7ICsraXRlcikgeworICAgIGNvbnN0IGZpeGVkX3QqIGN1cl91diA9IGJlc3RfdXZfYmFzZTsKKyAgICBjb25zdCBmaXhlZF90KiBwcmV2X3V2ID0gYmVzdF91dl9iYXNlOworICAgIHVpbnQ2NF90IGRpZmZfeV9zdW0gPSAwOworCisgICAgYmVzdF95ID0gYmVzdF95X2Jhc2U7CisgICAgYmVzdF91diA9IGJlc3RfdXZfYmFzZTsKKyAgICB0YXJnZXRfeSA9IHRhcmdldF95X2Jhc2U7CisgICAgdGFyZ2V0X3V2ID0gdGFyZ2V0X3V2X2Jhc2U7CisgICAgZm9yIChqID0gMDsgaiA8IGg7IGogKz0gMikgeworICAgICAgZml4ZWRfeV90KiBjb25zdCBzcmMxID0gdG1wX2J1ZmZlciArIDAgKiB3OworICAgICAgZml4ZWRfeV90KiBjb25zdCBzcmMyID0gdG1wX2J1ZmZlciArIDMgKiB3OworICAgICAgeworICAgICAgICBjb25zdCBmaXhlZF90KiBjb25zdCBuZXh0X3V2ID0gY3VyX3V2ICsgKChqIDwgaCAtIDIpID8gMyAqIHV2X3cgOiAwKTsKKyAgICAgICAgSW50ZXJwb2xhdGVUd29Sb3dzKGJlc3RfeSwgcHJldl91diwgY3VyX3V2LCBuZXh0X3V2LCB3LCBzcmMxLCBzcmMyKTsKKyAgICAgICAgcHJldl91diA9IGN1cl91djsKKyAgICAgICAgY3VyX3V2ID0gbmV4dF91djsKKyAgICAgIH0KKworICAgICAgVXBkYXRlVyhzcmMxLCBiZXN0X3JnYl95ICsgMCAqIHcsIHcpOworICAgICAgVXBkYXRlVyhzcmMyLCBiZXN0X3JnYl95ICsgMSAqIHcsIHcpOworICAgICAgVXBkYXRlQ2hyb21hKHNyYzEsIHNyYzIsIGJlc3RfcmdiX3V2LCB1dl93KTsKKworICAgICAgLy8gdXBkYXRlIHR3byByb3dzIG9mIFkgYW5kIG9uZSByb3cgb2YgUkdCCisgICAgICBkaWZmX3lfc3VtICs9IFdlYlBTaGFycFlVVlVwZGF0ZVkodGFyZ2V0X3ksIGJlc3RfcmdiX3ksIGJlc3RfeSwgMiAqIHcpOworICAgICAgV2ViUFNoYXJwWVVWVXBkYXRlUkdCKHRhcmdldF91diwgYmVzdF9yZ2JfdXYsIGJlc3RfdXYsIDMgKiB1dl93KTsKKworICAgICAgYmVzdF95ICs9IDIgKiB3OworICAgICAgYmVzdF91diArPSAzICogdXZfdzsKKyAgICAgIHRhcmdldF95ICs9IDIgKiB3OworICAgICAgdGFyZ2V0X3V2ICs9IDMgKiB1dl93OworICAgIH0KKyAgICAvLyB0ZXN0IGV4aXQgY29uZGl0aW9uCisgICAgaWYgKGl0ZXIgPiAwKSB7CisgICAgICBpZiAoZGlmZl95X3N1bSA8IGRpZmZfeV90aHJlc2hvbGQpIGJyZWFrOworICAgICAgaWYgKGRpZmZfeV9zdW0gPiBwcmV2X2RpZmZfeV9zdW0pIGJyZWFrOworICAgIH0KKyAgICBwcmV2X2RpZmZfeV9zdW0gPSBkaWZmX3lfc3VtOworICB9CisgIC8vIGZpbmFsIHJlY29uc3RydWN0aW9uCisgIG9rID0gQ29udmVydFdSR0JUb1lVVihiZXN0X3lfYmFzZSwgYmVzdF91dl9iYXNlLCBwaWN0dXJlKTsKKworIEVuZDoKKyAgV2ViUFNhZmVGcmVlKGJlc3RfeV9iYXNlKTsKKyAgV2ViUFNhZmVGcmVlKGJlc3RfdXZfYmFzZSk7CisgIFdlYlBTYWZlRnJlZSh0YXJnZXRfeV9iYXNlKTsKKyAgV2ViUFNhZmVGcmVlKHRhcmdldF91dl9iYXNlKTsKKyAgV2ViUFNhZmVGcmVlKGJlc3RfcmdiX3kpOworICBXZWJQU2FmZUZyZWUoYmVzdF9yZ2JfdXYpOworICBXZWJQU2FmZUZyZWUodG1wX2J1ZmZlcik7CisgIHJldHVybiBvazsKK30KKyN1bmRlZiBTQUZFX0FMTE9DCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAiRmFzdCIgcmVndWxhciBSR0ItPllVVgorCisjZGVmaW5lIFNVTTQocHRyLCBzdGVwKSBMaW5lYXJUb0dhbW1hKCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHYW1tYVRvTGluZWFyKChwdHIpWzBdKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEdhbW1hVG9MaW5lYXIoKHB0cilbKHN0ZXApXSkgKyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR2FtbWFUb0xpbmVhcigocHRyKVtyZ2Jfc3RyaWRlXSkgKyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHYW1tYVRvTGluZWFyKChwdHIpW3JnYl9zdHJpZGUgKyAoc3RlcCldKSwgMCkgICAgICAgICAgXAorCisjZGVmaW5lIFNVTTIocHRyKSBcCisgICAgTGluZWFyVG9HYW1tYShHYW1tYVRvTGluZWFyKChwdHIpWzBdKSArIEdhbW1hVG9MaW5lYXIoKHB0cilbcmdiX3N0cmlkZV0pLCAxKQorCisjZGVmaW5lIFNVTTJBTFBIQShwdHIpICgocHRyKVswXSArIChwdHIpW3JnYl9zdHJpZGVdKQorI2RlZmluZSBTVU00QUxQSEEocHRyKSAoU1VNMkFMUEhBKHB0cikgKyBTVU0yQUxQSEEoKHB0cikgKyA0KSkKKworI2lmIGRlZmluZWQoVVNFX0lOVkVSU0VfQUxQSEFfVEFCTEUpCisKK3N0YXRpYyBjb25zdCBpbnQga0FscGhhRml4ID0gMTk7CisvLyBGb2xsb3dpbmcgdGFibGUgaXMgKDEgPDwga0FscGhhRml4KSAvIGEuIFRoZSAodiAqIGtJbnZBbHBoYVthXSkgPj4ga0FscGhhRml4CisvLyBmb3JtdWxhIGlzIHRoZW4gZXF1YWwgdG8gdiAvIGEgaW4gbW9zdCAoOTkuNiUpIGNhc2VzLiBOb3RlIHRoYXQgdGhpcyB0YWJsZQorLy8gYW5kIGNvbnN0YW50IGFyZSBhZGp1c3RlZCB2ZXJ5IHRpZ2h0bHkgdG8gZml0IDMyYiBhcml0aG1ldGljLgorLy8gSW4gcGFydGljdWxhciwgdGhleSB1c2UgdGhlIGZhY3QgdGhhdCB0aGUgb3BlcmFuZHMgZm9yICd2IC8gYScgYXJlIGFjdHVhbGx5CisvLyBkZXJpdmVkIGFzIHYgPSAoYTAucDAgKyBhMS5wMSArIGEyLnAyICsgYTMucDMpIGFuZCBhID0gYTAgKyBhMSArIGEyICsgYTMKKy8vIHdpdGggYWkgaW4gWzAuLjI1NV0gYW5kIHBpIGluIFswLi4xPDxrR2FtbWFGaXgpLiBUaGUgY29uc3RyYWludCB0byBhdm9pZAorLy8gb3ZlcmZsb3cgaXM6IGtHYW1tYUZpeCArIGtBbHBoYUZpeCA8PSAzMS4KK3N0YXRpYyBjb25zdCB1aW50MzJfdCBrSW52QWxwaGFbNCAqIDB4ZmYgKyAxXSA9IHsKKyAgMCwgIC8qIGFscGhhID0gMCAqLworICA1MjQyODgsIDI2MjE0NCwgMTc0NzYyLCAxMzEwNzIsIDEwNDg1NywgODczODEsIDc0ODk4LCA2NTUzNiwKKyAgNTgyNTQsIDUyNDI4LCA0NzY2MiwgNDM2OTAsIDQwMzI5LCAzNzQ0OSwgMzQ5NTIsIDMyNzY4LAorICAzMDg0MCwgMjkxMjcsIDI3NTk0LCAyNjIxNCwgMjQ5NjYsIDIzODMxLCAyMjc5NSwgMjE4NDUsCisgIDIwOTcxLCAyMDE2NCwgMTk0MTgsIDE4NzI0LCAxODA3OCwgMTc0NzYsIDE2OTEyLCAxNjM4NCwKKyAgMTU4ODcsIDE1NDIwLCAxNDk3OSwgMTQ1NjMsIDE0MTY5LCAxMzc5NywgMTM0NDMsIDEzMTA3LAorICAxMjc4NywgMTI0ODMsIDEyMTkyLCAxMTkxNSwgMTE2NTAsIDExMzk3LCAxMTE1NSwgMTA5MjIsCisgIDEwNjk5LCAxMDQ4NSwgMTAyODAsIDEwMDgyLCA5ODkyLCA5NzA5LCA5NTMyLCA5MzYyLAorICA5MTk4LCA5MDM5LCA4ODg2LCA4NzM4LCA4NTk0LCA4NDU2LCA4MzIyLCA4MTkyLAorICA4MDY1LCA3OTQzLCA3ODI1LCA3NzEwLCA3NTk4LCA3NDg5LCA3Mzg0LCA3MjgxLAorICA3MTgyLCA3MDg0LCA2OTkwLCA2ODk4LCA2ODA4LCA2NzIxLCA2NjM2LCA2NTUzLAorICA2NDcyLCA2MzkzLCA2MzE2LCA2MjQxLCA2MTY4LCA2MDk2LCA2MDI2LCA1OTU3LAorICA1ODkwLCA1ODI1LCA1NzYxLCA1Njk4LCA1NjM3LCA1NTc3LCA1NTE4LCA1NDYxLAorICA1NDA1LCA1MzQ5LCA1Mjk1LCA1MjQyLCA1MTkwLCA1MTQwLCA1MDkwLCA1MDQxLAorICA0OTkzLCA0OTQ2LCA0ODk5LCA0ODU0LCA0ODA5LCA0NzY2LCA0NzIzLCA0NjgxLAorICA0NjM5LCA0NTk5LCA0NTU5LCA0NTE5LCA0NDgxLCA0NDQzLCA0NDA1LCA0MzY5LAorICA0MzMyLCA0Mjk3LCA0MjYyLCA0MjI4LCA0MTk0LCA0MTYxLCA0MTI4LCA0MDk2LAorICA0MDY0LCA0MDMyLCA0MDAyLCAzOTcxLCAzOTQyLCAzOTEyLCAzODgzLCAzODU1LAorICAzODI2LCAzNzk5LCAzNzcxLCAzNzQ0LCAzNzE4LCAzNjkyLCAzNjY2LCAzNjQwLAorICAzNjE1LCAzNTkxLCAzNTY2LCAzNTQyLCAzNTE4LCAzNDk1LCAzNDcyLCAzNDQ5LAorICAzNDI2LCAzNDA0LCAzMzgyLCAzMzYwLCAzMzM5LCAzMzE4LCAzMjk3LCAzMjc2LAorICAzMjU2LCAzMjM2LCAzMjE2LCAzMTk2LCAzMTc3LCAzMTU4LCAzMTM5LCAzMTIwLAorICAzMTAyLCAzMDg0LCAzMDY2LCAzMDQ4LCAzMDMwLCAzMDEzLCAyOTk1LCAyOTc4LAorICAyOTYyLCAyOTQ1LCAyOTI4LCAyOTEyLCAyODk2LCAyODgwLCAyODY0LCAyODQ5LAorICAyODMzLCAyODE4LCAyODAzLCAyNzg4LCAyNzc0LCAyNzU5LCAyNzQ0LCAyNzMwLAorICAyNzE2LCAyNzAyLCAyNjg4LCAyNjc0LCAyNjYxLCAyNjQ3LCAyNjM0LCAyNjIxLAorICAyNjA4LCAyNTk1LCAyNTgyLCAyNTcwLCAyNTU3LCAyNTQ1LCAyNTMyLCAyNTIwLAorICAyNTA4LCAyNDk2LCAyNDg0LCAyNDczLCAyNDYxLCAyNDQ5LCAyNDM4LCAyNDI3LAorICAyNDE2LCAyNDA0LCAyMzk0LCAyMzgzLCAyMzcyLCAyMzYxLCAyMzUxLCAyMzQwLAorICAyMzMwLCAyMzE5LCAyMzA5LCAyMjk5LCAyMjg5LCAyMjc5LCAyMjY5LCAyMjU5LAorICAyMjUwLCAyMjQwLCAyMjMxLCAyMjIxLCAyMjEyLCAyMjAyLCAyMTkzLCAyMTg0LAorICAyMTc1LCAyMTY2LCAyMTU3LCAyMTQ4LCAyMTM5LCAyMTMxLCAyMTIyLCAyMTE0LAorICAyMTA1LCAyMDk3LCAyMDg4LCAyMDgwLCAyMDcyLCAyMDY0LCAyMDU2LCAyMDQ4LAorICAyMDQwLCAyMDMyLCAyMDI0LCAyMDE2LCAyMDA4LCAyMDAxLCAxOTkzLCAxOTg1LAorICAxOTc4LCAxOTcxLCAxOTYzLCAxOTU2LCAxOTQ5LCAxOTQxLCAxOTM0LCAxOTI3LAorICAxOTIwLCAxOTEzLCAxOTA2LCAxODk5LCAxODkyLCAxODg1LCAxODc5LCAxODcyLAorICAxODY1LCAxODU5LCAxODUyLCAxODQ2LCAxODM5LCAxODMzLCAxODI2LCAxODIwLAorICAxODE0LCAxODA3LCAxODAxLCAxNzk1LCAxNzg5LCAxNzgzLCAxNzc3LCAxNzcxLAorICAxNzY1LCAxNzU5LCAxNzUzLCAxNzQ3LCAxNzQxLCAxNzM2LCAxNzMwLCAxNzI0LAorICAxNzE4LCAxNzEzLCAxNzA3LCAxNzAyLCAxNjk2LCAxNjkxLCAxNjg1LCAxNjgwLAorICAxNjc1LCAxNjY5LCAxNjY0LCAxNjU5LCAxNjUzLCAxNjQ4LCAxNjQzLCAxNjM4LAorICAxNjMzLCAxNjI4LCAxNjIzLCAxNjE4LCAxNjEzLCAxNjA4LCAxNjAzLCAxNTk4LAorICAxNTkzLCAxNTg4LCAxNTgzLCAxNTc5LCAxNTc0LCAxNTY5LCAxNTY1LCAxNTYwLAorICAxNTU1LCAxNTUxLCAxNTQ2LCAxNTQyLCAxNTM3LCAxNTMzLCAxNTI4LCAxNTI0LAorICAxNTE5LCAxNTE1LCAxNTEwLCAxNTA2LCAxNTAyLCAxNDk3LCAxNDkzLCAxNDg5LAorICAxNDg1LCAxNDgxLCAxNDc2LCAxNDcyLCAxNDY4LCAxNDY0LCAxNDYwLCAxNDU2LAorICAxNDUyLCAxNDQ4LCAxNDQ0LCAxNDQwLCAxNDM2LCAxNDMyLCAxNDI4LCAxNDI0LAorICAxNDIwLCAxNDE2LCAxNDEzLCAxNDA5LCAxNDA1LCAxNDAxLCAxMzk4LCAxMzk0LAorICAxMzkwLCAxMzg3LCAxMzgzLCAxMzc5LCAxMzc2LCAxMzcyLCAxMzY4LCAxMzY1LAorICAxMzYxLCAxMzU4LCAxMzU0LCAxMzUxLCAxMzQ3LCAxMzQ0LCAxMzQwLCAxMzM3LAorICAxMzM0LCAxMzMwLCAxMzI3LCAxMzIzLCAxMzIwLCAxMzE3LCAxMzE0LCAxMzEwLAorICAxMzA3LCAxMzA0LCAxMzAwLCAxMjk3LCAxMjk0LCAxMjkxLCAxMjg4LCAxMjg1LAorICAxMjgxLCAxMjc4LCAxMjc1LCAxMjcyLCAxMjY5LCAxMjY2LCAxMjYzLCAxMjYwLAorICAxMjU3LCAxMjU0LCAxMjUxLCAxMjQ4LCAxMjQ1LCAxMjQyLCAxMjM5LCAxMjM2LAorICAxMjMzLCAxMjMwLCAxMjI3LCAxMjI0LCAxMjIyLCAxMjE5LCAxMjE2LCAxMjEzLAorICAxMjEwLCAxMjA4LCAxMjA1LCAxMjAyLCAxMTk5LCAxMTk3LCAxMTk0LCAxMTkxLAorICAxMTg4LCAxMTg2LCAxMTgzLCAxMTgwLCAxMTc4LCAxMTc1LCAxMTcyLCAxMTcwLAorICAxMTY3LCAxMTY1LCAxMTYyLCAxMTU5LCAxMTU3LCAxMTU0LCAxMTUyLCAxMTQ5LAorICAxMTQ3LCAxMTQ0LCAxMTQyLCAxMTM5LCAxMTM3LCAxMTM0LCAxMTMyLCAxMTI5LAorICAxMTI3LCAxMTI1LCAxMTIyLCAxMTIwLCAxMTE3LCAxMTE1LCAxMTEzLCAxMTEwLAorICAxMTA4LCAxMTA2LCAxMTAzLCAxMTAxLCAxMDk5LCAxMDk2LCAxMDk0LCAxMDkyLAorICAxMDg5LCAxMDg3LCAxMDg1LCAxMDgzLCAxMDgxLCAxMDc4LCAxMDc2LCAxMDc0LAorICAxMDcyLCAxMDY5LCAxMDY3LCAxMDY1LCAxMDYzLCAxMDYxLCAxMDU5LCAxMDU3LAorICAxMDU0LCAxMDUyLCAxMDUwLCAxMDQ4LCAxMDQ2LCAxMDQ0LCAxMDQyLCAxMDQwLAorICAxMDM4LCAxMDM2LCAxMDM0LCAxMDMyLCAxMDMwLCAxMDI4LCAxMDI2LCAxMDI0LAorICAxMDIyLCAxMDIwLCAxMDE4LCAxMDE2LCAxMDE0LCAxMDEyLCAxMDEwLCAxMDA4LAorICAxMDA2LCAxMDA0LCAxMDAyLCAxMDAwLCA5OTgsIDk5NiwgOTk0LCA5OTIsCisgIDk5MSwgOTg5LCA5ODcsIDk4NSwgOTgzLCA5ODEsIDk3OSwgOTc4LAorICA5NzYsIDk3NCwgOTcyLCA5NzAsIDk2OSwgOTY3LCA5NjUsIDk2MywKKyAgOTYxLCA5NjAsIDk1OCwgOTU2LCA5NTQsIDk1MywgOTUxLCA5NDksCisgIDk0OCwgOTQ2LCA5NDQsIDk0MiwgOTQxLCA5MzksIDkzNywgOTM2LAorICA5MzQsIDkzMiwgOTMxLCA5MjksIDkyNywgOTI2LCA5MjQsIDkyMywKKyAgOTIxLCA5MTksIDkxOCwgOTE2LCA5MTQsIDkxMywgOTExLCA5MTAsCisgIDkwOCwgOTA3LCA5MDUsIDkwMywgOTAyLCA5MDAsIDg5OSwgODk3LAorICA4OTYsIDg5NCwgODkzLCA4OTEsIDg5MCwgODg4LCA4ODcsIDg4NSwKKyAgODg0LCA4ODIsIDg4MSwgODc5LCA4NzgsIDg3NiwgODc1LCA4NzMsCisgIDg3MiwgODcwLCA4NjksIDg2OCwgODY2LCA4NjUsIDg2MywgODYyLAorICA4NjAsIDg1OSwgODU4LCA4NTYsIDg1NSwgODUzLCA4NTIsIDg1MSwKKyAgODQ5LCA4NDgsIDg0NiwgODQ1LCA4NDQsIDg0MiwgODQxLCA4NDAsCisgIDgzOCwgODM3LCA4MzYsIDgzNCwgODMzLCA4MzIsIDgzMCwgODI5LAorICA4MjgsIDgyNiwgODI1LCA4MjQsIDgyMywgODIxLCA4MjAsIDgxOSwKKyAgODE3LCA4MTYsIDgxNSwgODE0LCA4MTIsIDgxMSwgODEwLCA4MDksCisgIDgwNywgODA2LCA4MDUsIDgwNCwgODAyLCA4MDEsIDgwMCwgNzk5LAorICA3OTgsIDc5NiwgNzk1LCA3OTQsIDc5MywgNzkxLCA3OTAsIDc4OSwKKyAgNzg4LCA3ODcsIDc4NiwgNzg0LCA3ODMsIDc4MiwgNzgxLCA3ODAsCisgIDc3OSwgNzc3LCA3NzYsIDc3NSwgNzc0LCA3NzMsIDc3MiwgNzcxLAorICA3NjksIDc2OCwgNzY3LCA3NjYsIDc2NSwgNzY0LCA3NjMsIDc2MiwKKyAgNzYwLCA3NTksIDc1OCwgNzU3LCA3NTYsIDc1NSwgNzU0LCA3NTMsCisgIDc1MiwgNzUxLCA3NTAsIDc0OCwgNzQ3LCA3NDYsIDc0NSwgNzQ0LAorICA3NDMsIDc0MiwgNzQxLCA3NDAsIDczOSwgNzM4LCA3MzcsIDczNiwKKyAgNzM1LCA3MzQsIDczMywgNzMyLCA3MzEsIDczMCwgNzI5LCA3MjgsCisgIDcyNywgNzI2LCA3MjUsIDcyNCwgNzIzLCA3MjIsIDcyMSwgNzIwLAorICA3MTksIDcxOCwgNzE3LCA3MTYsIDcxNSwgNzE0LCA3MTMsIDcxMiwKKyAgNzExLCA3MTAsIDcwOSwgNzA4LCA3MDcsIDcwNiwgNzA1LCA3MDQsCisgIDcwMywgNzAyLCA3MDEsIDcwMCwgNjk5LCA2OTksIDY5OCwgNjk3LAorICA2OTYsIDY5NSwgNjk0LCA2OTMsIDY5MiwgNjkxLCA2OTAsIDY4OSwKKyAgNjg4LCA2ODgsIDY4NywgNjg2LCA2ODUsIDY4NCwgNjgzLCA2ODIsCisgIDY4MSwgNjgwLCA2ODAsIDY3OSwgNjc4LCA2NzcsIDY3NiwgNjc1LAorICA2NzQsIDY3MywgNjczLCA2NzIsIDY3MSwgNjcwLCA2NjksIDY2OCwKKyAgNjY3LCA2NjcsIDY2NiwgNjY1LCA2NjQsIDY2MywgNjYyLCA2NjEsCisgIDY2MSwgNjYwLCA2NTksIDY1OCwgNjU3LCA2NTcsIDY1NiwgNjU1LAorICA2NTQsIDY1MywgNjUyLCA2NTIsIDY1MSwgNjUwLCA2NDksIDY0OCwKKyAgNjQ4LCA2NDcsIDY0NiwgNjQ1LCA2NDQsIDY0NCwgNjQzLCA2NDIsCisgIDY0MSwgNjQwLCA2NDAsIDYzOSwgNjM4LCA2MzcsIDYzNywgNjM2LAorICA2MzUsIDYzNCwgNjMzLCA2MzMsIDYzMiwgNjMxLCA2MzAsIDYzMCwKKyAgNjI5LCA2MjgsIDYyNywgNjI3LCA2MjYsIDYyNSwgNjI0LCA2MjQsCisgIDYyMywgNjIyLCA2MjEsIDYyMSwgNjIwLCA2MTksIDYxOCwgNjE4LAorICA2MTcsIDYxNiwgNjE2LCA2MTUsIDYxNCwgNjEzLCA2MTMsIDYxMiwKKyAgNjExLCA2MTEsIDYxMCwgNjA5LCA2MDgsIDYwOCwgNjA3LCA2MDYsCisgIDYwNiwgNjA1LCA2MDQsIDYwNCwgNjAzLCA2MDIsIDYwMSwgNjAxLAorICA2MDAsIDU5OSwgNTk5LCA1OTgsIDU5NywgNTk3LCA1OTYsIDU5NSwKKyAgNTk1LCA1OTQsIDU5MywgNTkzLCA1OTIsIDU5MSwgNTkxLCA1OTAsCisgIDU4OSwgNTg5LCA1ODgsIDU4NywgNTg3LCA1ODYsIDU4NSwgNTg1LAorICA1ODQsIDU4MywgNTgzLCA1ODIsIDU4MSwgNTgxLCA1ODAsIDU3OSwKKyAgNTc5LCA1NzgsIDU3OCwgNTc3LCA1NzYsIDU3NiwgNTc1LCA1NzQsCisgIDU3NCwgNTczLCA1NzIsIDU3MiwgNTcxLCA1NzEsIDU3MCwgNTY5LAorICA1NjksIDU2OCwgNTY4LCA1NjcsIDU2NiwgNTY2LCA1NjUsIDU2NCwKKyAgNTY0LCA1NjMsIDU2MywgNTYyLCA1NjEsIDU2MSwgNTYwLCA1NjAsCisgIDU1OSwgNTU4LCA1NTgsIDU1NywgNTU3LCA1NTYsIDU1NSwgNTU1LAorICA1NTQsIDU1NCwgNTUzLCA1NTMsIDU1MiwgNTUxLCA1NTEsIDU1MCwKKyAgNTUwLCA1NDksIDU0OCwgNTQ4LCA1NDcsIDU0NywgNTQ2LCA1NDYsCisgIDU0NSwgNTQ0LCA1NDQsIDU0MywgNTQzLCA1NDIsIDU0MiwgNTQxLAorICA1NDEsIDU0MCwgNTM5LCA1MzksIDUzOCwgNTM4LCA1MzcsIDUzNywKKyAgNTM2LCA1MzYsIDUzNSwgNTM0LCA1MzQsIDUzMywgNTMzLCA1MzIsCisgIDUzMiwgNTMxLCA1MzEsIDUzMCwgNTMwLCA1MjksIDUyOSwgNTI4LAorICA1MjcsIDUyNywgNTI2LCA1MjYsIDUyNSwgNTI1LCA1MjQsIDUyNCwKKyAgNTIzLCA1MjMsIDUyMiwgNTIyLCA1MjEsIDUyMSwgNTIwLCA1MjAsCisgIDUxOSwgNTE5LCA1MTgsIDUxOCwgNTE3LCA1MTcsIDUxNiwgNTE2LAorICA1MTUsIDUxNSwgNTE0LCA1MTQKK307CisKKy8vIE5vdGUgdGhhdCBMaW5lYXJUb0dhbW1hKCkgZXhwZWN0cyB0aGUgdmFsdWVzIHRvIGJlIHByZW11bHRpcGxpZWQgYnkgNCwKKy8vIHNvIHdlIGluY29ycG9yYXRlIHRoaXMgZmFjdG9yIDQgaW5zaWRlIHRoZSBESVZJREVfQllfQUxQSEEgbWFjcm8gZGlyZWN0bHkuCisjZGVmaW5lIERJVklERV9CWV9BTFBIQShzdW0sIGEpICAoKChzdW0pICoga0ludkFscGhhWyhhKV0pID4+IChrQWxwaGFGaXggLSAyKSkKKworI2Vsc2UKKworI2RlZmluZSBESVZJREVfQllfQUxQSEEoc3VtLCBhKSAoNCAqIChzdW0pIC8gKGEpKQorCisjZW5kaWYgIC8vIFVTRV9JTlZFUlNFX0FMUEhBX1RBQkxFCisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgTGluZWFyVG9HYW1tYVdlaWdodGVkKGNvbnN0IHVpbnQ4X3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGFfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdG90YWxfYSwgaW50IHN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmdiX3N0cmlkZSkgeworICBjb25zdCB1aW50MzJfdCBzdW0gPQorICAgICAgYV9wdHJbMF0gKiBHYW1tYVRvTGluZWFyKHNyY1swXSkgKworICAgICAgYV9wdHJbc3RlcF0gKiBHYW1tYVRvTGluZWFyKHNyY1tzdGVwXSkgKworICAgICAgYV9wdHJbcmdiX3N0cmlkZV0gKiBHYW1tYVRvTGluZWFyKHNyY1tyZ2Jfc3RyaWRlXSkgKworICAgICAgYV9wdHJbcmdiX3N0cmlkZSArIHN0ZXBdICogR2FtbWFUb0xpbmVhcihzcmNbcmdiX3N0cmlkZSArIHN0ZXBdKTsKKyAgYXNzZXJ0KHRvdGFsX2EgPiAwICYmIHRvdGFsX2EgPD0gNCAqIDB4ZmYpOworI2lmIGRlZmluZWQoVVNFX0lOVkVSU0VfQUxQSEFfVEFCTEUpCisgIGFzc2VydCgodWludDY0X3Qpc3VtICoga0ludkFscGhhW3RvdGFsX2FdIDwgKCh1aW50NjRfdCkxIDw8IDMyKSk7CisjZW5kaWYKKyAgcmV0dXJuIExpbmVhclRvR2FtbWEoRElWSURFX0JZX0FMUEhBKHN1bSwgdG90YWxfYSksIDApOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBDb252ZXJ0Um93VG9ZKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHJfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBnX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgYl9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBkc3RfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhSYW5kb20qIGNvbnN0IHJnKSB7CisgIGludCBpLCBqOworICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IHdpZHRoOyBpICs9IDEsIGogKz0gc3RlcCkgeworICAgIGRzdF95W2ldID0gUkdCVG9ZKHJfcHRyW2pdLCBnX3B0cltqXSwgYl9wdHJbal0sIHJnKTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBBY2N1bXVsYXRlUkdCQShjb25zdCB1aW50OF90KiBjb25zdCByX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGdfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgYl9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBhX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZ2Jfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIGRzdCwgaW50IHdpZHRoKSB7CisgIGludCBpLCBqOworICAvLyB3ZSBsb29wIG92ZXIgMngyIGJsb2NrcyBhbmQgcHJvZHVjZSBvbmUgUi9HL0IvQSB2YWx1ZSBmb3IgZWFjaC4KKyAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCAod2lkdGggPj4gMSk7IGkgKz0gMSwgaiArPSAyICogNCwgZHN0ICs9IDQpIHsKKyAgICBjb25zdCB1aW50MzJfdCBhID0gU1VNNEFMUEhBKGFfcHRyICsgaik7CisgICAgaW50IHIsIGcsIGI7CisgICAgaWYgKGEgPT0gNCAqIDB4ZmYgfHwgYSA9PSAwKSB7CisgICAgICByID0gU1VNNChyX3B0ciArIGosIDQpOworICAgICAgZyA9IFNVTTQoZ19wdHIgKyBqLCA0KTsKKyAgICAgIGIgPSBTVU00KGJfcHRyICsgaiwgNCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHIgPSBMaW5lYXJUb0dhbW1hV2VpZ2h0ZWQocl9wdHIgKyBqLCBhX3B0ciArIGosIGEsIDQsIHJnYl9zdHJpZGUpOworICAgICAgZyA9IExpbmVhclRvR2FtbWFXZWlnaHRlZChnX3B0ciArIGosIGFfcHRyICsgaiwgYSwgNCwgcmdiX3N0cmlkZSk7CisgICAgICBiID0gTGluZWFyVG9HYW1tYVdlaWdodGVkKGJfcHRyICsgaiwgYV9wdHIgKyBqLCBhLCA0LCByZ2Jfc3RyaWRlKTsKKyAgICB9CisgICAgZHN0WzBdID0gcjsKKyAgICBkc3RbMV0gPSBnOworICAgIGRzdFsyXSA9IGI7CisgICAgZHN0WzNdID0gYTsKKyAgfQorICBpZiAod2lkdGggJiAxKSB7CisgICAgY29uc3QgdWludDMyX3QgYSA9IDJ1ICogU1VNMkFMUEhBKGFfcHRyICsgaik7CisgICAgaW50IHIsIGcsIGI7CisgICAgaWYgKGEgPT0gNCAqIDB4ZmYgfHwgYSA9PSAwKSB7CisgICAgICByID0gU1VNMihyX3B0ciArIGopOworICAgICAgZyA9IFNVTTIoZ19wdHIgKyBqKTsKKyAgICAgIGIgPSBTVU0yKGJfcHRyICsgaik7CisgICAgfSBlbHNlIHsKKyAgICAgIHIgPSBMaW5lYXJUb0dhbW1hV2VpZ2h0ZWQocl9wdHIgKyBqLCBhX3B0ciArIGosIGEsIDAsIHJnYl9zdHJpZGUpOworICAgICAgZyA9IExpbmVhclRvR2FtbWFXZWlnaHRlZChnX3B0ciArIGosIGFfcHRyICsgaiwgYSwgMCwgcmdiX3N0cmlkZSk7CisgICAgICBiID0gTGluZWFyVG9HYW1tYVdlaWdodGVkKGJfcHRyICsgaiwgYV9wdHIgKyBqLCBhLCAwLCByZ2Jfc3RyaWRlKTsKKyAgICB9CisgICAgZHN0WzBdID0gcjsKKyAgICBkc3RbMV0gPSBnOworICAgIGRzdFsyXSA9IGI7CisgICAgZHN0WzNdID0gYTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBBY2N1bXVsYXRlUkdCKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHJfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBnX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgYl9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGVwLCBpbnQgcmdiX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIGRzdCwgaW50IHdpZHRoKSB7CisgIGludCBpLCBqOworICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8ICh3aWR0aCA+PiAxKTsgaSArPSAxLCBqICs9IDIgKiBzdGVwLCBkc3QgKz0gNCkgeworICAgIGRzdFswXSA9IFNVTTQocl9wdHIgKyBqLCBzdGVwKTsKKyAgICBkc3RbMV0gPSBTVU00KGdfcHRyICsgaiwgc3RlcCk7CisgICAgZHN0WzJdID0gU1VNNChiX3B0ciArIGosIHN0ZXApOworICB9CisgIGlmICh3aWR0aCAmIDEpIHsKKyAgICBkc3RbMF0gPSBTVU0yKHJfcHRyICsgaik7CisgICAgZHN0WzFdID0gU1VNMihnX3B0ciArIGopOworICAgIGRzdFsyXSA9IFNVTTIoYl9wdHIgKyBqKTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBDb252ZXJ0Um93c1RvVVYoY29uc3QgdWludDE2X3QqIHJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBkc3RfdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBkc3RfdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4UmFuZG9tKiBjb25zdCByZykgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpICs9IDEsIHJnYiArPSA0KSB7CisgICAgY29uc3QgaW50IHIgPSByZ2JbMF0sIGcgPSByZ2JbMV0sIGIgPSByZ2JbMl07CisgICAgZHN0X3VbaV0gPSBSR0JUb1UociwgZywgYiwgcmcpOworICAgIGRzdF92W2ldID0gUkdCVG9WKHIsIGcsIGIsIHJnKTsKKyAgfQorfQorCitzdGF0aWMgaW50IEltcG9ydFlVVkFGcm9tUkdCQShjb25zdCB1aW50OF90KiByX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGdfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogYl9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBhX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGVwLCAgICAgICAgIC8vIGJ5dGVzIHBlciBwaXhlbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJnYl9zdHJpZGUsICAgLy8gYnl0ZXMgcGVyIHNjYW5saW5lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBkaXRoZXJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXNlX2l0ZXJhdGl2ZV9jb252ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUpIHsKKyAgaW50IHk7CisgIGNvbnN0IGludCB3aWR0aCA9IHBpY3R1cmUtPndpZHRoOworICBjb25zdCBpbnQgaGVpZ2h0ID0gcGljdHVyZS0+aGVpZ2h0OworICBjb25zdCBpbnQgaGFzX2FscGhhID0gQ2hlY2tOb25PcGFxdWUoYV9wdHIsIHdpZHRoLCBoZWlnaHQsIHN0ZXAsIHJnYl9zdHJpZGUpOworICBjb25zdCBpbnQgaXNfcmdiID0gKHJfcHRyIDwgYl9wdHIpOyAgLy8gb3RoZXJ3aXNlIGl0J3MgYmdyCisKKyAgcGljdHVyZS0+Y29sb3JzcGFjZSA9IGhhc19hbHBoYSA/IFdFQlBfWVVWNDIwQSA6IFdFQlBfWVVWNDIwOworICBwaWN0dXJlLT51c2VfYXJnYiA9IDA7CisKKyAgLy8gZGlzYWJsZSBzbWFydCBjb252ZXJzaW9uIGlmIHNvdXJjZSBpcyB0b28gc21hbGwgKG92ZXJraWxsKS4KKyAgaWYgKHdpZHRoIDwga01pbkRpbWVuc2lvbkl0ZXJhdGl2ZUNvbnZlcnNpb24gfHwKKyAgICAgIGhlaWdodCA8IGtNaW5EaW1lbnNpb25JdGVyYXRpdmVDb252ZXJzaW9uKSB7CisgICAgdXNlX2l0ZXJhdGl2ZV9jb252ZXJzaW9uID0gMDsKKyAgfQorCisgIGlmICghV2ViUFBpY3R1cmVBbGxvY1lVVkEocGljdHVyZSwgd2lkdGgsIGhlaWdodCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoaGFzX2FscGhhKSB7CisgICAgYXNzZXJ0KHN0ZXAgPT0gNCk7CisjaWYgZGVmaW5lZChVU0VfR0FNTUFfQ09NUFJFU1NJT04pICYmIGRlZmluZWQoVVNFX0lOVkVSU0VfQUxQSEFfVEFCTEUpCisgICAgYXNzZXJ0KGtBbHBoYUZpeCArIGtHYW1tYUZpeCA8PSAzMSk7CisjZW5kaWYKKyAgfQorCisgIGlmICh1c2VfaXRlcmF0aXZlX2NvbnZlcnNpb24pIHsKKyAgICBJbml0R2FtbWFUYWJsZXNTKCk7CisgICAgaWYgKCFQcmVwcm9jZXNzQVJHQihyX3B0ciwgZ19wdHIsIGJfcHRyLCBzdGVwLCByZ2Jfc3RyaWRlLCBwaWN0dXJlKSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChoYXNfYWxwaGEpIHsKKyAgICAgIFdlYlBFeHRyYWN0QWxwaGEoYV9wdHIsIHJnYl9zdHJpZGUsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUtPmEsIHBpY3R1cmUtPmFfc3RyaWRlKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgY29uc3QgaW50IHV2X3dpZHRoID0gKHdpZHRoICsgMSkgPj4gMTsKKyAgICBpbnQgdXNlX2RzcCA9IChzdGVwID09IDMpOyAgLy8gdXNlIHNwZWNpYWwgZnVuY3Rpb24gaW4gdGhpcyBjYXNlCisgICAgLy8gdGVtcG9yYXJ5IHN0b3JhZ2UgZm9yIGFjY3VtdWxhdGVkIFIvRy9CIHZhbHVlcyBkdXJpbmcgY29udmVyc2lvbiB0byBVL1YKKyAgICB1aW50MTZfdCogY29uc3QgdG1wX3JnYiA9CisgICAgICAgICh1aW50MTZfdCopV2ViUFNhZmVNYWxsb2MoNCAqIHV2X3dpZHRoLCBzaXplb2YoKnRtcF9yZ2IpKTsKKyAgICB1aW50OF90KiBkc3RfeSA9IHBpY3R1cmUtPnk7CisgICAgdWludDhfdCogZHN0X3UgPSBwaWN0dXJlLT51OworICAgIHVpbnQ4X3QqIGRzdF92ID0gcGljdHVyZS0+djsKKyAgICB1aW50OF90KiBkc3RfYSA9IHBpY3R1cmUtPmE7CisKKyAgICBWUDhSYW5kb20gYmFzZV9yZzsKKyAgICBWUDhSYW5kb20qIHJnID0gTlVMTDsKKyAgICBpZiAoZGl0aGVyaW5nID4gMC4pIHsKKyAgICAgIFZQOEluaXRSYW5kb20oJmJhc2VfcmcsIGRpdGhlcmluZyk7CisgICAgICByZyA9ICZiYXNlX3JnOworICAgICAgdXNlX2RzcCA9IDA7ICAgLy8gY2FuJ3QgdXNlIGRzcCBpbiB0aGlzIGNhc2UKKyAgICB9CisgICAgV2ViUEluaXRDb252ZXJ0QVJHQlRvWVVWKCk7CisgICAgSW5pdEdhbW1hVGFibGVzKCk7CisKKyAgICBpZiAodG1wX3JnYiA9PSBOVUxMKSByZXR1cm4gMDsgIC8vIG1hbGxvYyBlcnJvcgorCisgICAgLy8gRG93bnNhbXBsZSBZL1UvViBwbGFuZXMsIHR3byByb3dzIGF0IGEgdGltZQorICAgIGZvciAoeSA9IDA7IHkgPCAoaGVpZ2h0ID4+IDEpOyArK3kpIHsKKyAgICAgIGludCByb3dzX2hhdmVfYWxwaGEgPSBoYXNfYWxwaGE7CisgICAgICBpZiAodXNlX2RzcCkgeworICAgICAgICBpZiAoaXNfcmdiKSB7CisgICAgICAgICAgV2ViUENvbnZlcnRSR0IyNFRvWShyX3B0ciwgZHN0X3ksIHdpZHRoKTsKKyAgICAgICAgICBXZWJQQ29udmVydFJHQjI0VG9ZKHJfcHRyICsgcmdiX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF95ICsgcGljdHVyZS0+eV9zdHJpZGUsIHdpZHRoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBXZWJQQ29udmVydEJHUjI0VG9ZKGJfcHRyLCBkc3RfeSwgd2lkdGgpOworICAgICAgICAgIFdlYlBDb252ZXJ0QkdSMjRUb1koYl9wdHIgKyByZ2Jfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3kgKyBwaWN0dXJlLT55X3N0cmlkZSwgd2lkdGgpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBDb252ZXJ0Um93VG9ZKHJfcHRyLCBnX3B0ciwgYl9wdHIsIHN0ZXAsIGRzdF95LCB3aWR0aCwgcmcpOworICAgICAgICBDb252ZXJ0Um93VG9ZKHJfcHRyICsgcmdiX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICBnX3B0ciArIHJnYl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgYl9wdHIgKyByZ2Jfc3RyaWRlLCBzdGVwLAorICAgICAgICAgICAgICAgICAgICAgIGRzdF95ICsgcGljdHVyZS0+eV9zdHJpZGUsIHdpZHRoLCByZyk7CisgICAgICB9CisgICAgICBkc3RfeSArPSAyICogcGljdHVyZS0+eV9zdHJpZGU7CisgICAgICBpZiAoaGFzX2FscGhhKSB7CisgICAgICAgIHJvd3NfaGF2ZV9hbHBoYSAmPSAhV2ViUEV4dHJhY3RBbHBoYShhX3B0ciwgcmdiX3N0cmlkZSwgd2lkdGgsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfYSwgcGljdHVyZS0+YV9zdHJpZGUpOworICAgICAgICBkc3RfYSArPSAyICogcGljdHVyZS0+YV9zdHJpZGU7CisgICAgICB9CisgICAgICAvLyBDb2xsZWN0IGF2ZXJhZ2VkIFIvRy9CKC9BKQorICAgICAgaWYgKCFyb3dzX2hhdmVfYWxwaGEpIHsKKyAgICAgICAgQWNjdW11bGF0ZVJHQihyX3B0ciwgZ19wdHIsIGJfcHRyLCBzdGVwLCByZ2Jfc3RyaWRlLCB0bXBfcmdiLCB3aWR0aCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBBY2N1bXVsYXRlUkdCQShyX3B0ciwgZ19wdHIsIGJfcHRyLCBhX3B0ciwgcmdiX3N0cmlkZSwgdG1wX3JnYiwgd2lkdGgpOworICAgICAgfQorICAgICAgLy8gQ29udmVydCB0byBVL1YKKyAgICAgIGlmIChyZyA9PSBOVUxMKSB7CisgICAgICAgIFdlYlBDb252ZXJ0UkdCQTMyVG9VVih0bXBfcmdiLCBkc3RfdSwgZHN0X3YsIHV2X3dpZHRoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIENvbnZlcnRSb3dzVG9VVih0bXBfcmdiLCBkc3RfdSwgZHN0X3YsIHV2X3dpZHRoLCByZyk7CisgICAgICB9CisgICAgICBkc3RfdSArPSBwaWN0dXJlLT51dl9zdHJpZGU7CisgICAgICBkc3RfdiArPSBwaWN0dXJlLT51dl9zdHJpZGU7CisgICAgICByX3B0ciArPSAyICogcmdiX3N0cmlkZTsKKyAgICAgIGJfcHRyICs9IDIgKiByZ2Jfc3RyaWRlOworICAgICAgZ19wdHIgKz0gMiAqIHJnYl9zdHJpZGU7CisgICAgICBpZiAoaGFzX2FscGhhKSBhX3B0ciArPSAyICogcmdiX3N0cmlkZTsKKyAgICB9CisgICAgaWYgKGhlaWdodCAmIDEpIHsgICAgLy8gZXh0cmEgbGFzdCByb3cKKyAgICAgIGludCByb3dfaGFzX2FscGhhID0gaGFzX2FscGhhOworICAgICAgaWYgKHVzZV9kc3ApIHsKKyAgICAgICAgaWYgKHJfcHRyIDwgYl9wdHIpIHsKKyAgICAgICAgICBXZWJQQ29udmVydFJHQjI0VG9ZKHJfcHRyLCBkc3RfeSwgd2lkdGgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFdlYlBDb252ZXJ0QkdSMjRUb1koYl9wdHIsIGRzdF95LCB3aWR0aCk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIENvbnZlcnRSb3dUb1kocl9wdHIsIGdfcHRyLCBiX3B0ciwgc3RlcCwgZHN0X3ksIHdpZHRoLCByZyk7CisgICAgICB9CisgICAgICBpZiAocm93X2hhc19hbHBoYSkgeworICAgICAgICByb3dfaGFzX2FscGhhICY9ICFXZWJQRXh0cmFjdEFscGhhKGFfcHRyLCAwLCB3aWR0aCwgMSwgZHN0X2EsIDApOworICAgICAgfQorICAgICAgLy8gQ29sbGVjdCBhdmVyYWdlZCBSL0cvQigvQSkKKyAgICAgIGlmICghcm93X2hhc19hbHBoYSkgeworICAgICAgICAvLyBDb2xsZWN0IGF2ZXJhZ2VkIFIvRy9CCisgICAgICAgIEFjY3VtdWxhdGVSR0Iocl9wdHIsIGdfcHRyLCBiX3B0ciwgc3RlcCwgLyogcmdiX3N0cmlkZSA9ICovIDAsCisgICAgICAgICAgICAgICAgICAgICAgdG1wX3JnYiwgd2lkdGgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQWNjdW11bGF0ZVJHQkEocl9wdHIsIGdfcHRyLCBiX3B0ciwgYV9wdHIsIC8qIHJnYl9zdHJpZGUgPSAqLyAwLAorICAgICAgICAgICAgICAgICAgICAgICB0bXBfcmdiLCB3aWR0aCk7CisgICAgICB9CisgICAgICBpZiAocmcgPT0gTlVMTCkgeworICAgICAgICBXZWJQQ29udmVydFJHQkEzMlRvVVYodG1wX3JnYiwgZHN0X3UsIGRzdF92LCB1dl93aWR0aCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBDb252ZXJ0Um93c1RvVVYodG1wX3JnYiwgZHN0X3UsIGRzdF92LCB1dl93aWR0aCwgcmcpOworICAgICAgfQorICAgIH0KKyAgICBXZWJQU2FmZUZyZWUodG1wX3JnYik7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKyN1bmRlZiBTVU00CisjdW5kZWYgU1VNMgorI3VuZGVmIFNVTTRBTFBIQQorI3VuZGVmIFNVTTJBTFBIQQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY2FsbCBmb3IgQVJHQi0+WVVWQSBjb252ZXJzaW9uCisKK3N0YXRpYyBpbnQgUGljdHVyZUFSR0JUb1lVVkEoV2ViUFBpY3R1cmUqIHBpY3R1cmUsIFdlYlBFbmNDU1AgY29sb3JzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZGl0aGVyaW5nLCBpbnQgdXNlX2l0ZXJhdGl2ZV9jb252ZXJzaW9uKSB7CisgIGlmIChwaWN0dXJlID09IE5VTEwpIHJldHVybiAwOworICBpZiAocGljdHVyZS0+YXJnYiA9PSBOVUxMKSB7CisgICAgcmV0dXJuIFdlYlBFbmNvZGluZ1NldEVycm9yKHBpY3R1cmUsIFZQOF9FTkNfRVJST1JfTlVMTF9QQVJBTUVURVIpOworICB9IGVsc2UgaWYgKChjb2xvcnNwYWNlICYgV0VCUF9DU1BfVVZfTUFTSykgIT0gV0VCUF9ZVVY0MjApIHsKKyAgICByZXR1cm4gV2ViUEVuY29kaW5nU2V0RXJyb3IocGljdHVyZSwgVlA4X0VOQ19FUlJPUl9JTlZBTElEX0NPTkZJR1VSQVRJT04pOworICB9IGVsc2UgeworICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGFyZ2IgPSAoY29uc3QgdWludDhfdCopcGljdHVyZS0+YXJnYjsKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCBhID0gYXJnYiArICgwIF4gQUxQSEFfT0ZGU0VUKTsKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCByID0gYXJnYiArICgxIF4gQUxQSEFfT0ZGU0VUKTsKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCBnID0gYXJnYiArICgyIF4gQUxQSEFfT0ZGU0VUKTsKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCBiID0gYXJnYiArICgzIF4gQUxQSEFfT0ZGU0VUKTsKKworICAgIHBpY3R1cmUtPmNvbG9yc3BhY2UgPSBXRUJQX1lVVjQyMDsKKyAgICByZXR1cm4gSW1wb3J0WVVWQUZyb21SR0JBKHIsIGcsIGIsIGEsIDQsIDQgKiBwaWN0dXJlLT5hcmdiX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdGhlcmluZywgdXNlX2l0ZXJhdGl2ZV9jb252ZXJzaW9uLCBwaWN0dXJlKTsKKyAgfQorfQorCitpbnQgV2ViUFBpY3R1cmVBUkdCVG9ZVVZBRGl0aGVyZWQoV2ViUFBpY3R1cmUqIHBpY3R1cmUsIFdlYlBFbmNDU1AgY29sb3JzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBkaXRoZXJpbmcpIHsKKyAgcmV0dXJuIFBpY3R1cmVBUkdCVG9ZVVZBKHBpY3R1cmUsIGNvbG9yc3BhY2UsIGRpdGhlcmluZywgMCk7Cit9CisKK2ludCBXZWJQUGljdHVyZUFSR0JUb1lVVkEoV2ViUFBpY3R1cmUqIHBpY3R1cmUsIFdlYlBFbmNDU1AgY29sb3JzcGFjZSkgeworICByZXR1cm4gUGljdHVyZUFSR0JUb1lVVkEocGljdHVyZSwgY29sb3JzcGFjZSwgMC5mLCAwKTsKK30KKworaW50IFdlYlBQaWN0dXJlU2hhcnBBUkdCVG9ZVVZBKFdlYlBQaWN0dXJlKiBwaWN0dXJlKSB7CisgIHJldHVybiBQaWN0dXJlQVJHQlRvWVVWQShwaWN0dXJlLCBXRUJQX1lVVjQyMCwgMC5mLCAxKTsKK30KKy8vIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CitpbnQgV2ViUFBpY3R1cmVTbWFydEFSR0JUb1lVVkEoV2ViUFBpY3R1cmUqIHBpY3R1cmUpIHsKKyAgcmV0dXJuIFdlYlBQaWN0dXJlU2hhcnBBUkdCVG9ZVVZBKHBpY3R1cmUpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY2FsbCBmb3IgWVVWQSAtPiBBUkdCIGNvbnZlcnNpb24KKworaW50IFdlYlBQaWN0dXJlWVVWQVRvQVJHQihXZWJQUGljdHVyZSogcGljdHVyZSkgeworICBpZiAocGljdHVyZSA9PSBOVUxMKSByZXR1cm4gMDsKKyAgaWYgKHBpY3R1cmUtPnkgPT0gTlVMTCB8fCBwaWN0dXJlLT51ID09IE5VTEwgfHwgcGljdHVyZS0+diA9PSBOVUxMKSB7CisgICAgcmV0dXJuIFdlYlBFbmNvZGluZ1NldEVycm9yKHBpY3R1cmUsIFZQOF9FTkNfRVJST1JfTlVMTF9QQVJBTUVURVIpOworICB9CisgIGlmICgocGljdHVyZS0+Y29sb3JzcGFjZSAmIFdFQlBfQ1NQX0FMUEhBX0JJVCkgJiYgcGljdHVyZS0+YSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIFdlYlBFbmNvZGluZ1NldEVycm9yKHBpY3R1cmUsIFZQOF9FTkNfRVJST1JfTlVMTF9QQVJBTUVURVIpOworICB9CisgIGlmICgocGljdHVyZS0+Y29sb3JzcGFjZSAmIFdFQlBfQ1NQX1VWX01BU0spICE9IFdFQlBfWVVWNDIwKSB7CisgICAgcmV0dXJuIFdlYlBFbmNvZGluZ1NldEVycm9yKHBpY3R1cmUsIFZQOF9FTkNfRVJST1JfSU5WQUxJRF9DT05GSUdVUkFUSU9OKTsKKyAgfQorICAvLyBBbGxvY2F0ZSBhIG5ldyBhcmdiIGJ1ZmZlciAoZGlzY2FyZGluZyB0aGUgcHJldmlvdXMgb25lKS4KKyAgaWYgKCFXZWJQUGljdHVyZUFsbG9jQVJHQihwaWN0dXJlLCBwaWN0dXJlLT53aWR0aCwgcGljdHVyZS0+aGVpZ2h0KSkgcmV0dXJuIDA7CisgIHBpY3R1cmUtPnVzZV9hcmdiID0gMTsKKworICAvLyBDb252ZXJ0CisgIHsKKyAgICBpbnQgeTsKKyAgICBjb25zdCBpbnQgd2lkdGggPSBwaWN0dXJlLT53aWR0aDsKKyAgICBjb25zdCBpbnQgaGVpZ2h0ID0gcGljdHVyZS0+aGVpZ2h0OworICAgIGNvbnN0IGludCBhcmdiX3N0cmlkZSA9IDQgKiBwaWN0dXJlLT5hcmdiX3N0cmlkZTsKKyAgICB1aW50OF90KiBkc3QgPSAodWludDhfdCopcGljdHVyZS0+YXJnYjsKKyAgICBjb25zdCB1aW50OF90ICpjdXJfdSA9IHBpY3R1cmUtPnUsICpjdXJfdiA9IHBpY3R1cmUtPnYsICpjdXJfeSA9IHBpY3R1cmUtPnk7CisgICAgV2ViUFVwc2FtcGxlTGluZVBhaXJGdW5jIHVwc2FtcGxlID0KKyAgICAgICAgV2ViUEdldExpbmVQYWlyQ29udmVydGVyKEFMUEhBX09GRlNFVCA+IDApOworCisgICAgLy8gRmlyc3Qgcm93LCB3aXRoIHJlcGxpY2F0ZWQgdG9wIHNhbXBsZXMuCisgICAgdXBzYW1wbGUoY3VyX3ksIE5VTEwsIGN1cl91LCBjdXJfdiwgY3VyX3UsIGN1cl92LCBkc3QsIE5VTEwsIHdpZHRoKTsKKyAgICBjdXJfeSArPSBwaWN0dXJlLT55X3N0cmlkZTsKKyAgICBkc3QgKz0gYXJnYl9zdHJpZGU7CisgICAgLy8gQ2VudGVyIHJvd3MuCisgICAgZm9yICh5ID0gMTsgeSArIDEgPCBoZWlnaHQ7IHkgKz0gMikgeworICAgICAgY29uc3QgdWludDhfdCogY29uc3QgdG9wX3UgPSBjdXJfdTsKKyAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHRvcF92ID0gY3VyX3Y7CisgICAgICBjdXJfdSArPSBwaWN0dXJlLT51dl9zdHJpZGU7CisgICAgICBjdXJfdiArPSBwaWN0dXJlLT51dl9zdHJpZGU7CisgICAgICB1cHNhbXBsZShjdXJfeSwgY3VyX3kgKyBwaWN0dXJlLT55X3N0cmlkZSwgdG9wX3UsIHRvcF92LCBjdXJfdSwgY3VyX3YsCisgICAgICAgICAgICAgICBkc3QsIGRzdCArIGFyZ2Jfc3RyaWRlLCB3aWR0aCk7CisgICAgICBjdXJfeSArPSAyICogcGljdHVyZS0+eV9zdHJpZGU7CisgICAgICBkc3QgKz0gMiAqIGFyZ2Jfc3RyaWRlOworICAgIH0KKyAgICAvLyBMYXN0IHJvdyAoaWYgbmVlZGVkKSwgd2l0aCByZXBsaWNhdGVkIGJvdHRvbSBzYW1wbGVzLgorICAgIGlmIChoZWlnaHQgPiAxICYmICEoaGVpZ2h0ICYgMSkpIHsKKyAgICAgIHVwc2FtcGxlKGN1cl95LCBOVUxMLCBjdXJfdSwgY3VyX3YsIGN1cl91LCBjdXJfdiwgZHN0LCBOVUxMLCB3aWR0aCk7CisgICAgfQorICAgIC8vIEluc2VydCBhbHBoYSB2YWx1ZXMgaWYgbmVlZGVkLCBpbiByZXBsYWNlbWVudCBmb3IgdGhlIGRlZmF1bHQgMHhmZiBvbmVzLgorICAgIGlmIChwaWN0dXJlLT5jb2xvcnNwYWNlICYgV0VCUF9DU1BfQUxQSEFfQklUKSB7CisgICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKKyAgICAgICAgdWludDMyX3QqIGNvbnN0IGFyZ2JfZHN0ID0gcGljdHVyZS0+YXJnYiArIHkgKiBwaWN0dXJlLT5hcmdiX3N0cmlkZTsKKyAgICAgICAgY29uc3QgdWludDhfdCogY29uc3Qgc3JjID0gcGljdHVyZS0+YSArIHkgKiBwaWN0dXJlLT5hX3N0cmlkZTsKKyAgICAgICAgaW50IHg7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7CisgICAgICAgICAgYXJnYl9kc3RbeF0gPSAoYXJnYl9kc3RbeF0gJiAweDAwZmZmZmZmdSkgfCAoKHVpbnQzMl90KXNyY1t4XSA8PCAyNCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBhdXRvbWF0aWMgaW1wb3J0IC8gY29udmVyc2lvbgorCitzdGF0aWMgaW50IEltcG9ydChXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHJnYiwgaW50IHJnYl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICBpbnQgc3RlcCwgaW50IHN3YXBfcmIsIGludCBpbXBvcnRfYWxwaGEpIHsKKyAgaW50IHk7CisgIC8vIHN3YXBfcmIgLT4gYixnLHIsYSAsICFzd2FwX3JiIC0+IHIsZyxiLGEKKyAgY29uc3QgdWludDhfdCogcl9wdHIgPSByZ2IgKyAoc3dhcF9yYiA/IDIgOiAwKTsKKyAgY29uc3QgdWludDhfdCogZ19wdHIgPSByZ2IgKyAxOworICBjb25zdCB1aW50OF90KiBiX3B0ciA9IHJnYiArIChzd2FwX3JiID8gMCA6IDIpOworICBjb25zdCBpbnQgd2lkdGggPSBwaWN0dXJlLT53aWR0aDsKKyAgY29uc3QgaW50IGhlaWdodCA9IHBpY3R1cmUtPmhlaWdodDsKKworICBpZiAoIXBpY3R1cmUtPnVzZV9hcmdiKSB7CisgICAgY29uc3QgdWludDhfdCogYV9wdHIgPSBpbXBvcnRfYWxwaGEgPyByZ2IgKyAzIDogTlVMTDsKKyAgICByZXR1cm4gSW1wb3J0WVVWQUZyb21SR0JBKHJfcHRyLCBnX3B0ciwgYl9wdHIsIGFfcHRyLCBzdGVwLCByZ2Jfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC5mIC8qIG5vIGRpdGhlcmluZyAqLywgMCwgcGljdHVyZSk7CisgIH0KKyAgaWYgKCFXZWJQUGljdHVyZUFsbG9jKHBpY3R1cmUpKSByZXR1cm4gMDsKKworICBWUDhMRHNwSW5pdCgpOworICBXZWJQSW5pdEFscGhhUHJvY2Vzc2luZygpOworCisgIGlmIChpbXBvcnRfYWxwaGEpIHsKKyAgICAvLyBkc3RbXSBieXRlIG9yZGVyIGlzIHthLHIsZyxifSBmb3IgYmlnLWVuZGlhbiwge2IsZyxyLGF9IGZvciBsaXR0bGUgZW5kaWFuCisgICAgdWludDMyX3QqIGRzdCA9IHBpY3R1cmUtPmFyZ2I7CisgICAgY29uc3QgaW50IGRvX2NvcHkgPSAoQUxQSEFfT0ZGU0VUID09IDMpICYmIHN3YXBfcmI7CisgICAgYXNzZXJ0KHN0ZXAgPT0gNCk7CisgICAgaWYgKGRvX2NvcHkpIHsKKyAgICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgeworICAgICAgICBtZW1jcHkoZHN0LCByZ2IsIHdpZHRoICogNCk7CisgICAgICAgIHJnYiArPSByZ2Jfc3RyaWRlOworICAgICAgICBkc3QgKz0gcGljdHVyZS0+YXJnYl9zdHJpZGU7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgeworI2lmZGVmIFdPUkRTX0JJR0VORElBTgorICAgICAgICAvLyBCR1JBIG9yIFJHQkEgaW5wdXQgb3JkZXIuCisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGFfcHRyID0gcmdiICsgMzsKKyAgICAgICAgV2ViUFBhY2tBUkdCKGFfcHRyLCByX3B0ciwgZ19wdHIsIGJfcHRyLCB3aWR0aCwgZHN0KTsKKyAgICAgICAgcl9wdHIgKz0gcmdiX3N0cmlkZTsKKyAgICAgICAgZ19wdHIgKz0gcmdiX3N0cmlkZTsKKyAgICAgICAgYl9wdHIgKz0gcmdiX3N0cmlkZTsKKyNlbHNlCisgICAgICAgIC8vIFJHQkEgaW5wdXQgb3JkZXIuIE5lZWQgdG8gc3dhcCBSIGFuZCBCLgorICAgICAgICBWUDhMQ29udmVydEJHUkFUb1JHQkEoKGNvbnN0IHVpbnQzMl90KilyZ2IsIHdpZHRoLCAodWludDhfdCopZHN0KTsKKyNlbmRpZgorICAgICAgICByZ2IgKz0gcmdiX3N0cmlkZTsKKyAgICAgICAgZHN0ICs9IHBpY3R1cmUtPmFyZ2Jfc3RyaWRlOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICB1aW50MzJfdCogZHN0ID0gcGljdHVyZS0+YXJnYjsKKyAgICBhc3NlcnQoc3RlcCA+PSAzKTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKKyAgICAgIFdlYlBQYWNrUkdCKHJfcHRyLCBnX3B0ciwgYl9wdHIsIHdpZHRoLCBzdGVwLCBkc3QpOworICAgICAgcl9wdHIgKz0gcmdiX3N0cmlkZTsKKyAgICAgIGdfcHRyICs9IHJnYl9zdHJpZGU7CisgICAgICBiX3B0ciArPSByZ2Jfc3RyaWRlOworICAgICAgZHN0ICs9IHBpY3R1cmUtPmFyZ2Jfc3RyaWRlOworICAgIH0KKyAgfQorICByZXR1cm4gMTsKK30KKworLy8gUHVibGljIEFQSQorCisjaWYgIWRlZmluZWQoV0VCUF9SRURVQ0VfQ1NQKQorCitpbnQgV2ViUFBpY3R1cmVJbXBvcnRCR1IoV2ViUFBpY3R1cmUqIHBpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcmdiLCBpbnQgcmdiX3N0cmlkZSkgeworICByZXR1cm4gKHBpY3R1cmUgIT0gTlVMTCAmJiByZ2IgIT0gTlVMTCkKKyAgICAgICAgICAgICA/IEltcG9ydChwaWN0dXJlLCByZ2IsIHJnYl9zdHJpZGUsIDMsIDEsIDApCisgICAgICAgICAgICAgOiAwOworfQorCitpbnQgV2ViUFBpY3R1cmVJbXBvcnRCR1JBKFdlYlBQaWN0dXJlKiBwaWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiByZ2JhLCBpbnQgcmdiYV9zdHJpZGUpIHsKKyAgcmV0dXJuIChwaWN0dXJlICE9IE5VTEwgJiYgcmdiYSAhPSBOVUxMKQorICAgICAgICAgICAgID8gSW1wb3J0KHBpY3R1cmUsIHJnYmEsIHJnYmFfc3RyaWRlLCA0LCAxLCAxKQorICAgICAgICAgICAgIDogMDsKK30KKworCitpbnQgV2ViUFBpY3R1cmVJbXBvcnRCR1JYKFdlYlBQaWN0dXJlKiBwaWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiByZ2JhLCBpbnQgcmdiYV9zdHJpZGUpIHsKKyAgcmV0dXJuIChwaWN0dXJlICE9IE5VTEwgJiYgcmdiYSAhPSBOVUxMKQorICAgICAgICAgICAgID8gSW1wb3J0KHBpY3R1cmUsIHJnYmEsIHJnYmFfc3RyaWRlLCA0LCAxLCAwKQorICAgICAgICAgICAgIDogMDsKK30KKworI2VuZGlmICAgLy8gV0VCUF9SRURVQ0VfQ1NQCisKK2ludCBXZWJQUGljdHVyZUltcG9ydFJHQihXZWJQUGljdHVyZSogcGljdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiByZ2IsIGludCByZ2Jfc3RyaWRlKSB7CisgIHJldHVybiAocGljdHVyZSAhPSBOVUxMICYmIHJnYiAhPSBOVUxMKQorICAgICAgICAgICAgID8gSW1wb3J0KHBpY3R1cmUsIHJnYiwgcmdiX3N0cmlkZSwgMywgMCwgMCkKKyAgICAgICAgICAgICA6IDA7Cit9CisKK2ludCBXZWJQUGljdHVyZUltcG9ydFJHQkEoV2ViUFBpY3R1cmUqIHBpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHJnYmEsIGludCByZ2JhX3N0cmlkZSkgeworICByZXR1cm4gKHBpY3R1cmUgIT0gTlVMTCAmJiByZ2JhICE9IE5VTEwpCisgICAgICAgICAgICAgPyBJbXBvcnQocGljdHVyZSwgcmdiYSwgcmdiYV9zdHJpZGUsIDQsIDAsIDEpCisgICAgICAgICAgICAgOiAwOworfQorCitpbnQgV2ViUFBpY3R1cmVJbXBvcnRSR0JYKFdlYlBQaWN0dXJlKiBwaWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiByZ2JhLCBpbnQgcmdiYV9zdHJpZGUpIHsKKyAgcmV0dXJuIChwaWN0dXJlICE9IE5VTEwgJiYgcmdiYSAhPSBOVUxMKQorICAgICAgICAgICAgID8gSW1wb3J0KHBpY3R1cmUsIHJnYmEsIHJnYmFfc3RyaWRlLCA0LCAwLCAwKQorICAgICAgICAgICAgIDogMDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvcGljdHVyZV9lbmMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvcGljdHVyZV9lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGFmYmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9waWN0dXJlX2VuYy5jCkBAIC0wLDAgKzEsMzAyIEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gV2ViUFBpY3R1cmUgY2xhc3MgYmFzaXMKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vYXNzZXJ0X3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdGRsaWJfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0cmluZ19wb2VtLmgiCisjZWxzZQorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvZW5jL3ZwOGlfZW5jLmgiCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFdlYlBQaWN0dXJlCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50IER1bW15V3JpdGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWN0dXJlKSB7CisgIC8vIFRoZSBmb2xsb3dpbmcgYXJlIHRvIHByZXZlbnQgJ3VudXNlZCB2YXJpYWJsZScgZXJyb3IgbWVzc2FnZS4KKyAgKHZvaWQpZGF0YTsKKyAgKHZvaWQpZGF0YV9zaXplOworICAodm9pZClwaWN0dXJlOworICByZXR1cm4gMTsKK30KKworaW50IFdlYlBQaWN0dXJlSW5pdEludGVybmFsKFdlYlBQaWN0dXJlKiBwaWN0dXJlLCBpbnQgdmVyc2lvbikgeworICBpZiAoV0VCUF9BQklfSVNfSU5DT01QQVRJQkxFKHZlcnNpb24sIFdFQlBfRU5DT0RFUl9BQklfVkVSU0lPTikpIHsKKyAgICByZXR1cm4gMDsgICAvLyBjYWxsZXIvc3lzdGVtIHZlcnNpb24gbWlzbWF0Y2ghCisgIH0KKyAgaWYgKHBpY3R1cmUgIT0gTlVMTCkgeworICAgIG1lbXNldChwaWN0dXJlLCAwLCBzaXplb2YoKnBpY3R1cmUpKTsKKyAgICBwaWN0dXJlLT53cml0ZXIgPSBEdW1teVdyaXRlcjsKKyAgICBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWN0dXJlLCBWUDhfRU5DX09LKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgV2ViUFBpY3R1cmVSZXNldEJ1ZmZlckFSR0IoV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUpIHsKKyAgcGljdHVyZS0+bWVtb3J5X2FyZ2JfID0gTlVMTDsKKyAgcGljdHVyZS0+YXJnYiA9IE5VTEw7CisgIHBpY3R1cmUtPmFyZ2Jfc3RyaWRlID0gMDsKK30KKworc3RhdGljIHZvaWQgV2ViUFBpY3R1cmVSZXNldEJ1ZmZlcllVVkEoV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUpIHsKKyAgcGljdHVyZS0+bWVtb3J5XyA9IE5VTEw7CisgIHBpY3R1cmUtPnkgPSBwaWN0dXJlLT51ID0gcGljdHVyZS0+diA9IHBpY3R1cmUtPmEgPSBOVUxMOworICBwaWN0dXJlLT55X3N0cmlkZSA9IHBpY3R1cmUtPnV2X3N0cmlkZSA9IDA7CisgIHBpY3R1cmUtPmFfc3RyaWRlID0gMDsKK30KKwordm9pZCBXZWJQUGljdHVyZVJlc2V0QnVmZmVycyhXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSkgeworICBXZWJQUGljdHVyZVJlc2V0QnVmZmVyQVJHQihwaWN0dXJlKTsKKyAgV2ViUFBpY3R1cmVSZXNldEJ1ZmZlcllVVkEocGljdHVyZSk7Cit9CisKK2ludCBXZWJQUGljdHVyZUFsbG9jQVJHQihXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgIHZvaWQqIG1lbW9yeTsKKyAgY29uc3QgdWludDY0X3QgYXJnYl9zaXplID0gKHVpbnQ2NF90KXdpZHRoICogaGVpZ2h0OworCisgIGFzc2VydChwaWN0dXJlICE9IE5VTEwpOworCisgIFdlYlBTYWZlRnJlZShwaWN0dXJlLT5tZW1vcnlfYXJnYl8pOworICBXZWJQUGljdHVyZVJlc2V0QnVmZmVyQVJHQihwaWN0dXJlKTsKKworICBpZiAod2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCkgeworICAgIHJldHVybiBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWN0dXJlLCBWUDhfRU5DX0VSUk9SX0JBRF9ESU1FTlNJT04pOworICB9CisgIC8vIGFsbG9jYXRlIGEgbmV3IGJ1ZmZlci4KKyAgbWVtb3J5ID0gV2ViUFNhZmVNYWxsb2MoYXJnYl9zaXplICsgV0VCUF9BTElHTl9DU1QsIHNpemVvZigqcGljdHVyZS0+YXJnYikpOworICBpZiAobWVtb3J5ID09IE5VTEwpIHsKKyAgICByZXR1cm4gV2ViUEVuY29kaW5nU2V0RXJyb3IocGljdHVyZSwgVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZKTsKKyAgfQorICBwaWN0dXJlLT5tZW1vcnlfYXJnYl8gPSBtZW1vcnk7CisgIHBpY3R1cmUtPmFyZ2IgPSAodWludDMyX3QqKVdFQlBfQUxJR04obWVtb3J5KTsKKyAgcGljdHVyZS0+YXJnYl9zdHJpZGUgPSB3aWR0aDsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBXZWJQUGljdHVyZUFsbG9jWVVWQShXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgIGNvbnN0IFdlYlBFbmNDU1AgdXZfY3NwID0KKyAgICAgIChXZWJQRW5jQ1NQKSgoaW50KXBpY3R1cmUtPmNvbG9yc3BhY2UgJiBXRUJQX0NTUF9VVl9NQVNLKTsKKyAgY29uc3QgaW50IGhhc19hbHBoYSA9IChpbnQpcGljdHVyZS0+Y29sb3JzcGFjZSAmIFdFQlBfQ1NQX0FMUEhBX0JJVDsKKyAgY29uc3QgaW50IHlfc3RyaWRlID0gd2lkdGg7CisgIGNvbnN0IGludCB1dl93aWR0aCA9IChpbnQpKCgoaW50NjRfdCl3aWR0aCArIDEpID4+IDEpOworICBjb25zdCBpbnQgdXZfaGVpZ2h0ID0gKGludCkoKChpbnQ2NF90KWhlaWdodCArIDEpID4+IDEpOworICBjb25zdCBpbnQgdXZfc3RyaWRlID0gdXZfd2lkdGg7CisgIGludCBhX3dpZHRoLCBhX3N0cmlkZTsKKyAgdWludDY0X3QgeV9zaXplLCB1dl9zaXplLCBhX3NpemUsIHRvdGFsX3NpemU7CisgIHVpbnQ4X3QqIG1lbTsKKworICBhc3NlcnQocGljdHVyZSAhPSBOVUxMKTsKKworICBXZWJQU2FmZUZyZWUocGljdHVyZS0+bWVtb3J5Xyk7CisgIFdlYlBQaWN0dXJlUmVzZXRCdWZmZXJZVVZBKHBpY3R1cmUpOworCisgIGlmICh1dl9jc3AgIT0gV0VCUF9ZVVY0MjApIHsKKyAgICByZXR1cm4gV2ViUEVuY29kaW5nU2V0RXJyb3IocGljdHVyZSwgVlA4X0VOQ19FUlJPUl9JTlZBTElEX0NPTkZJR1VSQVRJT04pOworICB9CisKKyAgLy8gYWxwaGEKKyAgYV93aWR0aCA9IGhhc19hbHBoYSA/IHdpZHRoIDogMDsKKyAgYV9zdHJpZGUgPSBhX3dpZHRoOworICB5X3NpemUgPSAodWludDY0X3QpeV9zdHJpZGUgKiBoZWlnaHQ7CisgIHV2X3NpemUgPSAodWludDY0X3QpdXZfc3RyaWRlICogdXZfaGVpZ2h0OworICBhX3NpemUgPSAgKHVpbnQ2NF90KWFfc3RyaWRlICogaGVpZ2h0OworCisgIHRvdGFsX3NpemUgPSB5X3NpemUgKyBhX3NpemUgKyAyICogdXZfc2l6ZTsKKworICAvLyBTZWN1cml0eSBhbmQgdmFsaWRhdGlvbiBjaGVja3MKKyAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDAgfHwgICAgICAgICAgIC8vIGx1bWEvYWxwaGEgcGFyYW0gZXJyb3IKKyAgICAgIHV2X3dpZHRoIDw9IDAgfHwgdXZfaGVpZ2h0IDw9IDApIHsgICAgIC8vIHUvdiBwYXJhbSBlcnJvcgorICAgIHJldHVybiBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWN0dXJlLCBWUDhfRU5DX0VSUk9SX0JBRF9ESU1FTlNJT04pOworICB9CisgIC8vIGFsbG9jYXRlIGEgbmV3IGJ1ZmZlci4KKyAgbWVtID0gKHVpbnQ4X3QqKVdlYlBTYWZlTWFsbG9jKHRvdGFsX3NpemUsIHNpemVvZigqbWVtKSk7CisgIGlmIChtZW0gPT0gTlVMTCkgeworICAgIHJldHVybiBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWN0dXJlLCBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlkpOworICB9CisKKyAgLy8gRnJvbSBub3cgb24sIHdlJ3JlIGluIHRoZSBjbGVhciwgd2UgY2FuIG5vIGxvbmdlciBmYWlsLi4uCisgIHBpY3R1cmUtPm1lbW9yeV8gPSAodm9pZCopbWVtOworICBwaWN0dXJlLT55X3N0cmlkZSAgPSB5X3N0cmlkZTsKKyAgcGljdHVyZS0+dXZfc3RyaWRlID0gdXZfc3RyaWRlOworICBwaWN0dXJlLT5hX3N0cmlkZSAgPSBhX3N0cmlkZTsKKworICAvLyBUT0RPKHNrYWwpOiB3ZSBjb3VsZCBhbGlnbiB0aGUgeS91L3YgcGxhbmVzIGFuZCBhZGp1c3Qgc3RyaWRlLgorICBwaWN0dXJlLT55ID0gbWVtOworICBtZW0gKz0geV9zaXplOworCisgIHBpY3R1cmUtPnUgPSBtZW07CisgIG1lbSArPSB1dl9zaXplOworICBwaWN0dXJlLT52ID0gbWVtOworICBtZW0gKz0gdXZfc2l6ZTsKKworICBpZiAoYV9zaXplID4gMCkgeworICAgIHBpY3R1cmUtPmEgPSBtZW07CisgICAgbWVtICs9IGFfc2l6ZTsKKyAgfQorICAodm9pZCltZW07ICAvLyBtYWtlcyB0aGUgc3RhdGljIGFuYWx5emVyIGhhcHB5CisgIHJldHVybiAxOworfQorCitpbnQgV2ViUFBpY3R1cmVBbGxvYyhXZWJQUGljdHVyZSogcGljdHVyZSkgeworICBpZiAocGljdHVyZSAhPSBOVUxMKSB7CisgICAgY29uc3QgaW50IHdpZHRoID0gcGljdHVyZS0+d2lkdGg7CisgICAgY29uc3QgaW50IGhlaWdodCA9IHBpY3R1cmUtPmhlaWdodDsKKworICAgIFdlYlBQaWN0dXJlRnJlZShwaWN0dXJlKTsgICAvLyBlcmFzZSBwcmV2aW91cyBidWZmZXIKKworICAgIGlmICghcGljdHVyZS0+dXNlX2FyZ2IpIHsKKyAgICAgIHJldHVybiBXZWJQUGljdHVyZUFsbG9jWVVWQShwaWN0dXJlLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIFdlYlBQaWN0dXJlQWxsb2NBUkdCKHBpY3R1cmUsIHdpZHRoLCBoZWlnaHQpOworICAgIH0KKyAgfQorICByZXR1cm4gMTsKK30KKwordm9pZCBXZWJQUGljdHVyZUZyZWUoV2ViUFBpY3R1cmUqIHBpY3R1cmUpIHsKKyAgaWYgKHBpY3R1cmUgIT0gTlVMTCkgeworICAgIFdlYlBTYWZlRnJlZShwaWN0dXJlLT5tZW1vcnlfKTsKKyAgICBXZWJQU2FmZUZyZWUocGljdHVyZS0+bWVtb3J5X2FyZ2JfKTsKKyAgICBXZWJQUGljdHVyZVJlc2V0QnVmZmVycyhwaWN0dXJlKTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gV2ViUE1lbW9yeVdyaXRlcjogV3JpdGUtdG8tbWVtb3J5CisKK3ZvaWQgV2ViUE1lbW9yeVdyaXRlckluaXQoV2ViUE1lbW9yeVdyaXRlciogd3JpdGVyKSB7CisgIHdyaXRlci0+bWVtID0gTlVMTDsKKyAgd3JpdGVyLT5zaXplID0gMDsKKyAgd3JpdGVyLT5tYXhfc2l6ZSA9IDA7Cit9CisKK2ludCBXZWJQTWVtb3J5V3JpdGUoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUFBpY3R1cmUqIHBpY3R1cmUpIHsKKyAgV2ViUE1lbW9yeVdyaXRlciogY29uc3QgdyA9IChXZWJQTWVtb3J5V3JpdGVyKilwaWN0dXJlLT5jdXN0b21fcHRyOworICB1aW50NjRfdCBuZXh0X3NpemU7CisgIGlmICh3ID09IE5VTEwpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorICBuZXh0X3NpemUgPSAodWludDY0X3Qpdy0+c2l6ZSArIGRhdGFfc2l6ZTsKKyAgaWYgKG5leHRfc2l6ZSA+IHctPm1heF9zaXplKSB7CisgICAgdWludDhfdCogbmV3X21lbTsKKyAgICB1aW50NjRfdCBuZXh0X21heF9zaXplID0gMlVMTCAqIHctPm1heF9zaXplOworICAgIGlmIChuZXh0X21heF9zaXplIDwgbmV4dF9zaXplKSBuZXh0X21heF9zaXplID0gbmV4dF9zaXplOworICAgIGlmIChuZXh0X21heF9zaXplIDwgODE5MlVMTCkgbmV4dF9tYXhfc2l6ZSA9IDgxOTJVTEw7CisgICAgbmV3X21lbSA9ICh1aW50OF90KilXZWJQU2FmZU1hbGxvYyhuZXh0X21heF9zaXplLCAxKTsKKyAgICBpZiAobmV3X21lbSA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKHctPnNpemUgPiAwKSB7CisgICAgICBtZW1jcHkobmV3X21lbSwgdy0+bWVtLCB3LT5zaXplKTsKKyAgICB9CisgICAgV2ViUFNhZmVGcmVlKHctPm1lbSk7CisgICAgdy0+bWVtID0gbmV3X21lbTsKKyAgICAvLyBkb3duLWNhc3QgaXMgb2ssIHRoYW5rcyB0byBXZWJQU2FmZU1hbGxvYworICAgIHctPm1heF9zaXplID0gKHNpemVfdCluZXh0X21heF9zaXplOworICB9CisgIGlmIChkYXRhX3NpemUgPiAwKSB7CisgICAgbWVtY3B5KHctPm1lbSArIHctPnNpemUsIGRhdGEsIGRhdGFfc2l6ZSk7CisgICAgdy0+c2l6ZSArPSBkYXRhX3NpemU7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgV2ViUE1lbW9yeVdyaXRlckNsZWFyKFdlYlBNZW1vcnlXcml0ZXIqIHdyaXRlcikgeworICBpZiAod3JpdGVyICE9IE5VTEwpIHsKKyAgICBXZWJQU2FmZUZyZWUod3JpdGVyLT5tZW0pOworICAgIHdyaXRlci0+bWVtID0gTlVMTDsKKyAgICB3cml0ZXItPnNpemUgPSAwOworICAgIHdyaXRlci0+bWF4X3NpemUgPSAwOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTaW1wbGVzdCBoaWdoLWxldmVsIGNhbGxzOgorCit0eXBlZGVmIGludCAoKkltcG9ydGVyKShXZWJQUGljdHVyZSogY29uc3QsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0LCBpbnQpOworCitzdGF0aWMgc2l6ZV90IEVuY29kZShjb25zdCB1aW50OF90KiByZ2JhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICBJbXBvcnRlciBpbXBvcnQsIGZsb2F0IHF1YWxpdHlfZmFjdG9yLCBpbnQgbG9zc2xlc3MsCisgICAgICAgICAgICAgICAgICAgICB1aW50OF90Kiogb3V0cHV0KSB7CisgIFdlYlBQaWN0dXJlIHBpYzsKKyAgV2ViUENvbmZpZyBjb25maWc7CisgIFdlYlBNZW1vcnlXcml0ZXIgd3J0OworICBpbnQgb2s7CisKKyAgaWYgKG91dHB1dCA9PSBOVUxMKSByZXR1cm4gMDsKKworICBpZiAoIVdlYlBDb25maWdQcmVzZXQoJmNvbmZpZywgV0VCUF9QUkVTRVRfREVGQVVMVCwgcXVhbGl0eV9mYWN0b3IpIHx8CisgICAgICAhV2ViUFBpY3R1cmVJbml0KCZwaWMpKSB7CisgICAgcmV0dXJuIDA7ICAvLyBzaG91bGRuJ3QgaGFwcGVuLCBleGNlcHQgaWYgc3lzdGVtIGluc3RhbGxhdGlvbiBpcyBicm9rZW4KKyAgfQorCisgIGNvbmZpZy5sb3NzbGVzcyA9ICEhbG9zc2xlc3M7CisgIHBpYy51c2VfYXJnYiA9ICEhbG9zc2xlc3M7CisgIHBpYy53aWR0aCA9IHdpZHRoOworICBwaWMuaGVpZ2h0ID0gaGVpZ2h0OworICBwaWMud3JpdGVyID0gV2ViUE1lbW9yeVdyaXRlOworICBwaWMuY3VzdG9tX3B0ciA9ICZ3cnQ7CisgIFdlYlBNZW1vcnlXcml0ZXJJbml0KCZ3cnQpOworCisgIG9rID0gaW1wb3J0KCZwaWMsIHJnYmEsIHN0cmlkZSkgJiYgV2ViUEVuY29kZSgmY29uZmlnLCAmcGljKTsKKyAgV2ViUFBpY3R1cmVGcmVlKCZwaWMpOworICBpZiAoIW9rKSB7CisgICAgV2ViUE1lbW9yeVdyaXRlckNsZWFyKCZ3cnQpOworICAgICpvdXRwdXQgPSBOVUxMOworICAgIHJldHVybiAwOworICB9CisgICpvdXRwdXQgPSB3cnQubWVtOworICByZXR1cm4gd3J0LnNpemU7Cit9CisKKyNkZWZpbmUgRU5DT0RFX0ZVTkMoTkFNRSwgSU1QT1JURVIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3NpemVfdCBOQU1FKGNvbnN0IHVpbnQ4X3QqIGluLCBpbnQgdywgaW50IGgsIGludCBicHMsIGZsb2F0IHEsICAgICAgICAgIFwKKyAgICAgICAgICAgIHVpbnQ4X3QqKiBvdXQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcmV0dXJuIEVuY29kZShpbiwgdywgaCwgYnBzLCBJTVBPUlRFUiwgcSwgMCwgb3V0KTsgICAgICAgICAgICAgICAgICAgIFwKK30KKworRU5DT0RFX0ZVTkMoV2ViUEVuY29kZVJHQiwgV2ViUFBpY3R1cmVJbXBvcnRSR0IpCitFTkNPREVfRlVOQyhXZWJQRW5jb2RlUkdCQSwgV2ViUFBpY3R1cmVJbXBvcnRSR0JBKQorI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX0NTUCkKK0VOQ09ERV9GVU5DKFdlYlBFbmNvZGVCR1IsIFdlYlBQaWN0dXJlSW1wb3J0QkdSKQorRU5DT0RFX0ZVTkMoV2ViUEVuY29kZUJHUkEsIFdlYlBQaWN0dXJlSW1wb3J0QkdSQSkKKyNlbmRpZiAgLy8gV0VCUF9SRURVQ0VfQ1NQCisKKyN1bmRlZiBFTkNPREVfRlVOQworCisjZGVmaW5lIExPU1NMRVNTX0RFRkFVTFRfUVVBTElUWSA3MC4KKyNkZWZpbmUgTE9TU0xFU1NfRU5DT0RFX0ZVTkMoTkFNRSwgSU1QT1JURVIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc2l6ZV90IE5BTUUoY29uc3QgdWludDhfdCogaW4sIGludCB3LCBpbnQgaCwgaW50IGJwcywgdWludDhfdCoqIG91dCkgeyAgICAgICBcCisgIHJldHVybiBFbmNvZGUoaW4sIHcsIGgsIGJwcywgSU1QT1JURVIsIExPU1NMRVNTX0RFRkFVTFRfUVVBTElUWSwgMSwgb3V0KTsgIFwKK30KKworTE9TU0xFU1NfRU5DT0RFX0ZVTkMoV2ViUEVuY29kZUxvc3NsZXNzUkdCLCBXZWJQUGljdHVyZUltcG9ydFJHQikKK0xPU1NMRVNTX0VOQ09ERV9GVU5DKFdlYlBFbmNvZGVMb3NzbGVzc1JHQkEsIFdlYlBQaWN0dXJlSW1wb3J0UkdCQSkKKyNpZiAhZGVmaW5lZChXRUJQX1JFRFVDRV9DU1ApCitMT1NTTEVTU19FTkNPREVfRlVOQyhXZWJQRW5jb2RlTG9zc2xlc3NCR1IsIFdlYlBQaWN0dXJlSW1wb3J0QkdSKQorTE9TU0xFU1NfRU5DT0RFX0ZVTkMoV2ViUEVuY29kZUxvc3NsZXNzQkdSQSwgV2ViUFBpY3R1cmVJbXBvcnRCR1JBKQorI2VuZGlmICAvLyBXRUJQX1JFRFVDRV9DU1AKKworI3VuZGVmIExPU1NMRVNTX0VOQ09ERV9GVU5DCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL3BpY3R1cmVfcHNucl9lbmMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvcGljdHVyZV9wc25yX2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMmYwYmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL3BpY3R1cmVfcHNucl9lbmMuYwpAQCAtMCwwICsxLDI1OCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFdlYlBQaWN0dXJlIHRvb2xzIGZvciBtZWFzdXJpbmcgZGlzdG9ydGlvbgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpbmNsdWRlICJzcmMvd2VicC9lbmNvZGUuaCIKKworI2lmICEoZGVmaW5lZChXRUJQX0RJU0FCTEVfU1RBVFMpIHx8IGRlZmluZWQoV0VCUF9SRURVQ0VfU0laRSkpCisKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorI2luY2x1ZGUgInNyYy9lbmMvdnA4aV9lbmMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKKwordHlwZWRlZiBkb3VibGUgKCpBY2N1bXVsYXRlRnVuYykoY29uc3QgdWludDhfdCogc3JjLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHJlZiwgaW50IHJlZl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwtbWluIGRpc3RvcnRpb24KKy8vCisvLyBGb3IgZXZlcnkgcGl4ZWwgaW4gdGhlICpyZWZlcmVuY2UqIHBpY3R1cmUsIHdlIHNlYXJjaCBmb3IgdGhlIGxvY2FsIGJlc3QKKy8vIG1hdGNoIGluIHRoZSBjb21wcmVzc2VkIGltYWdlLiBUaGlzIGlzIG5vdCBhIHN5bW1ldHJpY2FsIG1lYXN1cmUuCisKKyNkZWZpbmUgUkFESVVTIDIgIC8vIHNlYXJjaCByYWRpdXMuIFNob3VsZG4ndCBiZSB0b28gbGFyZ2UuCisKK3N0YXRpYyBkb3VibGUgQWNjdW11bGF0ZUxTSU0oY29uc3QgdWludDhfdCogc3JjLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcmVmLCBpbnQgcmVmX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKSB7CisgIGludCB4LCB5OworICBkb3VibGUgdG90YWxfc3NlID0gMC47CisgIGZvciAoeSA9IDA7IHkgPCBoOyArK3kpIHsKKyAgICBjb25zdCBpbnQgeV8wID0gKHkgLSBSQURJVVMgPCAwKSA/IDAgOiB5IC0gUkFESVVTOworICAgIGNvbnN0IGludCB5XzEgPSAoeSArIFJBRElVUyArIDEgPj0gaCkgPyBoIDogeSArIFJBRElVUyArIDE7CisgICAgZm9yICh4ID0gMDsgeCA8IHc7ICsreCkgeworICAgICAgY29uc3QgaW50IHhfMCA9ICh4IC0gUkFESVVTIDwgMCkgPyAwIDogeCAtIFJBRElVUzsKKyAgICAgIGNvbnN0IGludCB4XzEgPSAoeCArIFJBRElVUyArIDEgPj0gdykgPyB3IDogeCArIFJBRElVUyArIDE7CisgICAgICBkb3VibGUgYmVzdF9zc2UgPSAyNTUuICogMjU1LjsKKyAgICAgIGNvbnN0IGRvdWJsZSB2YWx1ZSA9IChkb3VibGUpcmVmW3kgKiByZWZfc3RyaWRlICsgeF07CisgICAgICBpbnQgaSwgajsKKyAgICAgIGZvciAoaiA9IHlfMDsgaiA8IHlfMTsgKytqKSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHMgPSBzcmMgKyBqICogc3JjX3N0cmlkZTsKKyAgICAgICAgZm9yIChpID0geF8wOyBpIDwgeF8xOyArK2kpIHsKKyAgICAgICAgICBjb25zdCBkb3VibGUgZGlmZiA9IHNbaV0gLSB2YWx1ZTsKKyAgICAgICAgICBjb25zdCBkb3VibGUgc3NlID0gZGlmZiAqIGRpZmY7CisgICAgICAgICAgaWYgKHNzZSA8IGJlc3Rfc3NlKSBiZXN0X3NzZSA9IHNzZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgdG90YWxfc3NlICs9IGJlc3Rfc3NlOworICAgIH0KKyAgfQorICByZXR1cm4gdG90YWxfc3NlOworfQorI3VuZGVmIFJBRElVUworCitzdGF0aWMgZG91YmxlIEFjY3VtdWxhdGVTU0UoY29uc3QgdWludDhfdCogc3JjLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiByZWYsIGludCByZWZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkgeworICBpbnQgeTsKKyAgZG91YmxlIHRvdGFsX3NzZSA9IDAuOworICBmb3IgKHkgPSAwOyB5IDwgaDsgKyt5KSB7CisgICAgdG90YWxfc3NlICs9IFZQOEFjY3VtdWxhdGVTU0Uoc3JjLCByZWYsIHcpOworICAgIHNyYyArPSBzcmNfc3RyaWRlOworICAgIHJlZiArPSByZWZfc3RyaWRlOworICB9CisgIHJldHVybiB0b3RhbF9zc2U7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBkb3VibGUgQWNjdW11bGF0ZVNTSU0oY29uc3QgdWludDhfdCogc3JjLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcmVmLCBpbnQgcmVmX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKSB7CisgIGNvbnN0IGludCB3MCA9ICh3IDwgVlA4X1NTSU1fS0VSTkVMKSA/IHcgOiBWUDhfU1NJTV9LRVJORUw7CisgIGNvbnN0IGludCB3MSA9IHcgLSBWUDhfU1NJTV9LRVJORUwgLSAxOworICBjb25zdCBpbnQgaDAgPSAoaCA8IFZQOF9TU0lNX0tFUk5FTCkgPyBoIDogVlA4X1NTSU1fS0VSTkVMOworICBjb25zdCBpbnQgaDEgPSBoIC0gVlA4X1NTSU1fS0VSTkVMIC0gMTsKKyAgaW50IHgsIHk7CisgIGRvdWJsZSBzdW0gPSAwLjsKKyAgZm9yICh5ID0gMDsgeSA8IGgwOyArK3kpIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgdzsgKyt4KSB7CisgICAgICBzdW0gKz0gVlA4U1NJTUdldENsaXBwZWQoc3JjLCBzcmNfc3RyaWRlLCByZWYsIHJlZl9zdHJpZGUsIHgsIHksIHcsIGgpOworICAgIH0KKyAgfQorICBmb3IgKDsgeSA8IGgxOyArK3kpIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgdzA7ICsreCkgeworICAgICAgc3VtICs9IFZQOFNTSU1HZXRDbGlwcGVkKHNyYywgc3JjX3N0cmlkZSwgcmVmLCByZWZfc3RyaWRlLCB4LCB5LCB3LCBoKTsKKyAgICB9CisgICAgZm9yICg7IHggPCB3MTsgKyt4KSB7CisgICAgICBjb25zdCBpbnQgb2ZmMSA9IHggLSBWUDhfU1NJTV9LRVJORUwgKyAoeSAtIFZQOF9TU0lNX0tFUk5FTCkgKiBzcmNfc3RyaWRlOworICAgICAgY29uc3QgaW50IG9mZjIgPSB4IC0gVlA4X1NTSU1fS0VSTkVMICsgKHkgLSBWUDhfU1NJTV9LRVJORUwpICogcmVmX3N0cmlkZTsKKyAgICAgIHN1bSArPSBWUDhTU0lNR2V0KHNyYyArIG9mZjEsIHNyY19zdHJpZGUsIHJlZiArIG9mZjIsIHJlZl9zdHJpZGUpOworICAgIH0KKyAgICBmb3IgKDsgeCA8IHc7ICsreCkgeworICAgICAgc3VtICs9IFZQOFNTSU1HZXRDbGlwcGVkKHNyYywgc3JjX3N0cmlkZSwgcmVmLCByZWZfc3RyaWRlLCB4LCB5LCB3LCBoKTsKKyAgICB9CisgIH0KKyAgZm9yICg7IHkgPCBoOyArK3kpIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgdzsgKyt4KSB7CisgICAgICBzdW0gKz0gVlA4U1NJTUdldENsaXBwZWQoc3JjLCBzcmNfc3RyaWRlLCByZWYsIHJlZl9zdHJpZGUsIHgsIHksIHcsIGgpOworICAgIH0KKyAgfQorICByZXR1cm4gc3VtOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRGlzdG9ydGlvbgorCisvLyBNYXggdmFsdWUgcmV0dXJuZWQgaW4gY2FzZSBvZiBleGFjdCBzaW1pbGFyaXR5Lgorc3RhdGljIGNvbnN0IGRvdWJsZSBrTWluRGlzdG9ydGlvbl9kQiA9IDk5LjsKKworc3RhdGljIGRvdWJsZSBHZXRQU05SKGRvdWJsZSB2LCBkb3VibGUgc2l6ZSkgeworICByZXR1cm4gKHYgPiAwLiAmJiBzaXplID4gMC4pID8gLTQuMzQyOTQ0OCAqIGxvZyh2IC8gKHNpemUgKiAyNTUgKiAyNTUuKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGtNaW5EaXN0b3J0aW9uX2RCOworfQorCitzdGF0aWMgZG91YmxlIEdldExvZ1NTSU0oZG91YmxlIHYsIGRvdWJsZSBzaXplKSB7CisgIHYgPSAoc2l6ZSA+IDAuKSA/IHYgLyBzaXplIDogMS47CisgIHJldHVybiAodiA8IDEuKSA/IC0xMC4wICogbG9nMTAoMS4gLSB2KSA6IGtNaW5EaXN0b3J0aW9uX2RCOworfQorCitpbnQgV2ViUFBsYW5lRGlzdG9ydGlvbihjb25zdCB1aW50OF90KiBzcmMsIHNpemVfdCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcmVmLCBzaXplX3QgcmVmX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgc2l6ZV90IHhfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlLCBmbG9hdCogZGlzdG9ydGlvbiwgZmxvYXQqIHJlc3VsdCkgeworICB1aW50OF90KiBhbGxvY2F0ZWQgPSBOVUxMOworICBjb25zdCBBY2N1bXVsYXRlRnVuYyBtZXRyaWMgPSAodHlwZSA9PSAwKSA/IEFjY3VtdWxhdGVTU0UgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHlwZSA9PSAxKSA/IEFjY3VtdWxhdGVTU0lNIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY2N1bXVsYXRlTFNJTTsKKyAgaWYgKHNyYyA9PSBOVUxMIHx8IHJlZiA9PSBOVUxMIHx8CisgICAgICBzcmNfc3RyaWRlIDwgeF9zdGVwICogd2lkdGggfHwgcmVmX3N0cmlkZSA8IHhfc3RlcCAqIHdpZHRoIHx8CisgICAgICByZXN1bHQgPT0gTlVMTCB8fCBkaXN0b3J0aW9uID09IE5VTEwpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIFZQOFNTSU1Ec3BJbml0KCk7CisgIGlmICh4X3N0ZXAgIT0gMSkgeyAgIC8vIGV4dHJhY3QgYSBwYWNrZWQgcGxhbmUgaWYgbmVlZGVkCisgICAgaW50IHgsIHk7CisgICAgdWludDhfdCogdG1wMTsKKyAgICB1aW50OF90KiB0bXAyOworICAgIGFsbG9jYXRlZCA9CisgICAgICAgICh1aW50OF90KilXZWJQU2FmZU1hbGxvYygyVUxMICogd2lkdGggKiBoZWlnaHQsIHNpemVvZigqYWxsb2NhdGVkKSk7CisgICAgaWYgKGFsbG9jYXRlZCA9PSBOVUxMKSByZXR1cm4gMDsKKyAgICB0bXAxID0gYWxsb2NhdGVkOworICAgIHRtcDIgPSB0bXAxICsgKHNpemVfdCl3aWR0aCAqIGhlaWdodDsKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKKyAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7CisgICAgICAgIHRtcDFbeCArIHkgKiB3aWR0aF0gPSBzcmNbeCAqIHhfc3RlcCArIHkgKiBzcmNfc3RyaWRlXTsKKyAgICAgICAgdG1wMlt4ICsgeSAqIHdpZHRoXSA9IHJlZlt4ICogeF9zdGVwICsgeSAqIHJlZl9zdHJpZGVdOworICAgICAgfQorICAgIH0KKyAgICBzcmMgPSB0bXAxOworICAgIHJlZiA9IHRtcDI7CisgIH0KKyAgKmRpc3RvcnRpb24gPSAoZmxvYXQpbWV0cmljKHNyYywgd2lkdGgsIHJlZiwgd2lkdGgsIHdpZHRoLCBoZWlnaHQpOworICBXZWJQU2FmZUZyZWUoYWxsb2NhdGVkKTsKKworICAqcmVzdWx0ID0gKHR5cGUgPT0gMSkgPyAoZmxvYXQpR2V0TG9nU1NJTSgqZGlzdG9ydGlvbiwgKGRvdWJsZSl3aWR0aCAqIGhlaWdodCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDogKGZsb2F0KUdldFBTTlIoKmRpc3RvcnRpb24sIChkb3VibGUpd2lkdGggKiBoZWlnaHQpOworICByZXR1cm4gMTsKK30KKworI2lmZGVmIFdPUkRTX0JJR0VORElBTgorI2RlZmluZSBCTFVFX09GRlNFVCAzICAgLy8gdWludDMyX3QgMHgwMDAwMDBmZiBpcyAweDAwLDAwLDAwLGZmIGluIG1lbW9yeQorI2Vsc2UKKyNkZWZpbmUgQkxVRV9PRkZTRVQgMCAgIC8vIHVpbnQzMl90IDB4MDAwMDAwZmYgaXMgMHhmZiwwMCwwMCwwMCBpbiBtZW1vcnkKKyNlbmRpZgorCitpbnQgV2ViUFBpY3R1cmVEaXN0b3J0aW9uKGNvbnN0IFdlYlBQaWN0dXJlKiBzcmMsIGNvbnN0IFdlYlBQaWN0dXJlKiByZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlLCBmbG9hdCByZXN1bHRzWzVdKSB7CisgIGludCB3LCBoLCBjOworICBpbnQgb2sgPSAwOworICBXZWJQUGljdHVyZSBwMCwgcDE7CisgIGRvdWJsZSB0b3RhbF9zaXplID0gMC4sIHRvdGFsX2Rpc3RvcnRpb24gPSAwLjsKKyAgaWYgKHNyYyA9PSBOVUxMIHx8IHJlZiA9PSBOVUxMIHx8CisgICAgICBzcmMtPndpZHRoICE9IHJlZi0+d2lkdGggfHwgc3JjLT5oZWlnaHQgIT0gcmVmLT5oZWlnaHQgfHwKKyAgICAgIHJlc3VsdHMgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgVlA4U1NJTURzcEluaXQoKTsKKyAgaWYgKCFXZWJQUGljdHVyZUluaXQoJnAwKSB8fCAhV2ViUFBpY3R1cmVJbml0KCZwMSkpIHJldHVybiAwOworICB3ID0gc3JjLT53aWR0aDsKKyAgaCA9IHNyYy0+aGVpZ2h0OworICBpZiAoIVdlYlBQaWN0dXJlVmlldyhzcmMsIDAsIDAsIHcsIGgsICZwMCkpIGdvdG8gRXJyb3I7CisgIGlmICghV2ViUFBpY3R1cmVWaWV3KHJlZiwgMCwgMCwgdywgaCwgJnAxKSkgZ290byBFcnJvcjsKKworICAvLyBXZSBhbHdheXMgbWVhc3VyZSBkaXN0b3J0aW9uIGluIEFSR0Igc3BhY2UuCisgIGlmIChwMC51c2VfYXJnYiA9PSAwICYmICFXZWJQUGljdHVyZVlVVkFUb0FSR0IoJnAwKSkgZ290byBFcnJvcjsKKyAgaWYgKHAxLnVzZV9hcmdiID09IDAgJiYgIVdlYlBQaWN0dXJlWVVWQVRvQVJHQigmcDEpKSBnb3RvIEVycm9yOworICBmb3IgKGMgPSAwOyBjIDwgNDsgKytjKSB7CisgICAgZmxvYXQgZGlzdG9ydGlvbjsKKyAgICBjb25zdCBzaXplX3Qgc3RyaWRlMCA9IDQgKiAoc2l6ZV90KXAwLmFyZ2Jfc3RyaWRlOworICAgIGNvbnN0IHNpemVfdCBzdHJpZGUxID0gNCAqIChzaXplX3QpcDEuYXJnYl9zdHJpZGU7CisgICAgLy8gcmVzdWx0cyBhcmUgcmVwb3J0ZWQgYXMgQkdSQQorICAgIGNvbnN0IGludCBvZmZzZXQgPSBjIF4gQkxVRV9PRkZTRVQ7CisgICAgaWYgKCFXZWJQUGxhbmVEaXN0b3J0aW9uKChjb25zdCB1aW50OF90KilwMC5hcmdiICsgb2Zmc2V0LCBzdHJpZGUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCopcDEuYXJnYiArIG9mZnNldCwgc3RyaWRlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdywgaCwgNCwgdHlwZSwgJmRpc3RvcnRpb24sIHJlc3VsdHMgKyBjKSkgeworICAgICAgZ290byBFcnJvcjsKKyAgICB9CisgICAgdG90YWxfZGlzdG9ydGlvbiArPSBkaXN0b3J0aW9uOworICAgIHRvdGFsX3NpemUgKz0gdyAqIGg7CisgIH0KKworICByZXN1bHRzWzRdID0gKHR5cGUgPT0gMSkgPyAoZmxvYXQpR2V0TG9nU1NJTSh0b3RhbF9kaXN0b3J0aW9uLCB0b3RhbF9zaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoZmxvYXQpR2V0UFNOUih0b3RhbF9kaXN0b3J0aW9uLCB0b3RhbF9zaXplKTsKKyAgb2sgPSAxOworCisgRXJyb3I6CisgIFdlYlBQaWN0dXJlRnJlZSgmcDApOworICBXZWJQUGljdHVyZUZyZWUoJnAxKTsKKyAgcmV0dXJuIG9rOworfQorCisjdW5kZWYgQkxVRV9PRkZTRVQKKworI2Vsc2UgIC8vIGRlZmluZWQoV0VCUF9ESVNBQkxFX1NUQVRTKQoraW50IFdlYlBQbGFuZURpc3RvcnRpb24oY29uc3QgdWludDhfdCogc3JjLCBzaXplX3Qgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHJlZiwgc2l6ZV90IHJlZl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIHNpemVfdCB4X3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSwgZmxvYXQqIGRpc3RvcnRpb24sIGZsb2F0KiByZXN1bHQpIHsKKyAgKHZvaWQpc3JjOworICAodm9pZClzcmNfc3RyaWRlOworICAodm9pZClyZWY7CisgICh2b2lkKXJlZl9zdHJpZGU7CisgICh2b2lkKXdpZHRoOworICAodm9pZCloZWlnaHQ7CisgICh2b2lkKXhfc3RlcDsKKyAgKHZvaWQpdHlwZTsKKyAgaWYgKGRpc3RvcnRpb24gPT0gTlVMTCB8fCByZXN1bHQgPT0gTlVMTCkgcmV0dXJuIDA7CisgICpkaXN0b3J0aW9uID0gMC5mOworICAqcmVzdWx0ID0gMC5mOworICByZXR1cm4gMTsKK30KKworaW50IFdlYlBQaWN0dXJlRGlzdG9ydGlvbihjb25zdCBXZWJQUGljdHVyZSogc3JjLCBjb25zdCBXZWJQUGljdHVyZSogcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSwgZmxvYXQgcmVzdWx0c1s1XSkgeworICBpbnQgaTsKKyAgKHZvaWQpc3JjOworICAodm9pZClyZWY7CisgICh2b2lkKXR5cGU7CisgIGlmIChyZXN1bHRzID09IE5VTEwpIHJldHVybiAwOworICBmb3IgKGkgPSAwOyBpIDwgNTsgKytpKSByZXN1bHRzW2ldID0gMC5mOworICByZXR1cm4gMTsKK30KKworI2VuZGlmICAvLyAhZGVmaW5lZChXRUJQX0RJU0FCTEVfU1RBVFMpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL3BpY3R1cmVfcmVzY2FsZV9lbmMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvcGljdHVyZV9yZXNjYWxlX2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4YTZhZTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL3BpY3R1cmVfcmVzY2FsZV9lbmMuYwpAQCAtMCwwICsxLDMwOSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFdlYlBQaWN0dXJlIHRvb2xzOiBjb3B5LCBjcm9wLCByZXNjYWxpbmcgYW5kIHZpZXcuCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgInNyYy93ZWJwL2VuY29kZS5oIgorCisjaWYgIWRlZmluZWQoV0VCUF9SRURVQ0VfU0laRSkKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAic3JjL2VuYy92cDhpX2VuYy5oIgorI2luY2x1ZGUgInNyYy91dGlscy9yZXNjYWxlcl91dGlscy5oIgorI2luY2x1ZGUgInNyYy91dGlscy91dGlscy5oIgorCisjZGVmaW5lIEhBTFZFKHgpICgoKHgpICsgMSkgPj4gMSkKKworLy8gR3JhYiB0aGUgJ3NwZWNzJyAod3JpdGVyLCAqb3BhcXVlLCB3aWR0aCwgaGVpZ2h0Li4uKSBmcm9tICdzcmMnIGFuZCBjb3B5IHRoZW0KKy8vIGludG8gJ2RzdCcuIE1hcmsgJ2RzdCcgYXMgbm90IG93bmluZyBhbnkgbWVtb3J5Lgorc3RhdGljIHZvaWQgUGljdHVyZUdyYWJTcGVjcyhjb25zdCBXZWJQUGljdHVyZSogY29uc3Qgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQUGljdHVyZSogY29uc3QgZHN0KSB7CisgIGFzc2VydChzcmMgIT0gTlVMTCAmJiBkc3QgIT0gTlVMTCk7CisgICpkc3QgPSAqc3JjOworICBXZWJQUGljdHVyZVJlc2V0QnVmZmVycyhkc3QpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBBZGp1c3QgdG9wLWxlZnQgY29ybmVyIHRvIGNocm9tYSBzYW1wbGUgcG9zaXRpb24uCitzdGF0aWMgdm9pZCBTbmFwVG9wTGVmdFBvc2l0aW9uKGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgbGVmdCwgaW50KiBjb25zdCB0b3ApIHsKKyAgaWYgKCFwaWMtPnVzZV9hcmdiKSB7CisgICAgKmxlZnQgJj0gfjE7CisgICAgKnRvcCAmPSB+MTsKKyAgfQorfQorCisvLyBBZGp1c3QgdG9wLWxlZnQgY29ybmVyIGFuZCB2ZXJpZnkgdGhhdCB0aGUgc3ViLXJlY3RhbmdsZSBpcyB2YWxpZC4KK3N0YXRpYyBpbnQgQWRqdXN0QW5kQ2hlY2tSZWN0YW5nbGUoY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBsZWZ0LCBpbnQqIGNvbnN0IHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgIFNuYXBUb3BMZWZ0UG9zaXRpb24ocGljLCBsZWZ0LCB0b3ApOworICBpZiAoKCpsZWZ0KSA8IDAgfHwgKCp0b3ApIDwgMCkgcmV0dXJuIDA7CisgIGlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKSByZXR1cm4gMDsKKyAgaWYgKCgqbGVmdCkgKyB3aWR0aCA+IHBpYy0+d2lkdGgpIHJldHVybiAwOworICBpZiAoKCp0b3ApICsgaGVpZ2h0ID4gcGljLT5oZWlnaHQpIHJldHVybiAwOworICByZXR1cm4gMTsKK30KKworaW50IFdlYlBQaWN0dXJlQ29weShjb25zdCBXZWJQUGljdHVyZSogc3JjLCBXZWJQUGljdHVyZSogZHN0KSB7CisgIGlmIChzcmMgPT0gTlVMTCB8fCBkc3QgPT0gTlVMTCkgcmV0dXJuIDA7CisgIGlmIChzcmMgPT0gZHN0KSByZXR1cm4gMTsKKworICBQaWN0dXJlR3JhYlNwZWNzKHNyYywgZHN0KTsKKyAgaWYgKCFXZWJQUGljdHVyZUFsbG9jKGRzdCkpIHJldHVybiAwOworCisgIGlmICghc3JjLT51c2VfYXJnYikgeworICAgIFdlYlBDb3B5UGxhbmUoc3JjLT55LCBzcmMtPnlfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgZHN0LT55LCBkc3QtPnlfc3RyaWRlLCBkc3QtPndpZHRoLCBkc3QtPmhlaWdodCk7CisgICAgV2ViUENvcHlQbGFuZShzcmMtPnUsIHNyYy0+dXZfc3RyaWRlLCBkc3QtPnUsIGRzdC0+dXZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgSEFMVkUoZHN0LT53aWR0aCksIEhBTFZFKGRzdC0+aGVpZ2h0KSk7CisgICAgV2ViUENvcHlQbGFuZShzcmMtPnYsIHNyYy0+dXZfc3RyaWRlLCBkc3QtPnYsIGRzdC0+dXZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgSEFMVkUoZHN0LT53aWR0aCksIEhBTFZFKGRzdC0+aGVpZ2h0KSk7CisgICAgaWYgKGRzdC0+YSAhPSBOVUxMKSAgeworICAgICAgV2ViUENvcHlQbGFuZShzcmMtPmEsIHNyYy0+YV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgIGRzdC0+YSwgZHN0LT5hX3N0cmlkZSwgZHN0LT53aWR0aCwgZHN0LT5oZWlnaHQpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBXZWJQQ29weVBsYW5lKChjb25zdCB1aW50OF90KilzcmMtPmFyZ2IsIDQgKiBzcmMtPmFyZ2Jfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QqKWRzdC0+YXJnYiwgNCAqIGRzdC0+YXJnYl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICA0ICogZHN0LT53aWR0aCwgZHN0LT5oZWlnaHQpOworICB9CisgIHJldHVybiAxOworfQorCitpbnQgV2ViUFBpY3R1cmVJc1ZpZXcoY29uc3QgV2ViUFBpY3R1cmUqIHBpY3R1cmUpIHsKKyAgaWYgKHBpY3R1cmUgPT0gTlVMTCkgcmV0dXJuIDA7CisgIGlmIChwaWN0dXJlLT51c2VfYXJnYikgeworICAgIHJldHVybiAocGljdHVyZS0+bWVtb3J5X2FyZ2JfID09IE5VTEwpOworICB9CisgIHJldHVybiAocGljdHVyZS0+bWVtb3J5XyA9PSBOVUxMKTsKK30KKworaW50IFdlYlBQaWN0dXJlVmlldyhjb25zdCBXZWJQUGljdHVyZSogc3JjLAorICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICBXZWJQUGljdHVyZSogZHN0KSB7CisgIGlmIChzcmMgPT0gTlVMTCB8fCBkc3QgPT0gTlVMTCkgcmV0dXJuIDA7CisKKyAgLy8gdmVyaWZ5IHJlY3RhbmdsZSBwb3NpdGlvbi4KKyAgaWYgKCFBZGp1c3RBbmRDaGVja1JlY3RhbmdsZShzcmMsICZsZWZ0LCAmdG9wLCB3aWR0aCwgaGVpZ2h0KSkgcmV0dXJuIDA7CisKKyAgaWYgKHNyYyAhPSBkc3QpIHsgIC8vIGJld2FyZSBvZiBhbGlhc2luZyEgV2UgZG9uJ3Qgd2FudCB0byBsZWFrICdtZW1vcnlfJy4KKyAgICBQaWN0dXJlR3JhYlNwZWNzKHNyYywgZHN0KTsKKyAgfQorICBkc3QtPndpZHRoID0gd2lkdGg7CisgIGRzdC0+aGVpZ2h0ID0gaGVpZ2h0OworICBpZiAoIXNyYy0+dXNlX2FyZ2IpIHsKKyAgICBkc3QtPnkgPSBzcmMtPnkgKyB0b3AgKiBzcmMtPnlfc3RyaWRlICsgbGVmdDsKKyAgICBkc3QtPnUgPSBzcmMtPnUgKyAodG9wID4+IDEpICogc3JjLT51dl9zdHJpZGUgKyAobGVmdCA+PiAxKTsKKyAgICBkc3QtPnYgPSBzcmMtPnYgKyAodG9wID4+IDEpICogc3JjLT51dl9zdHJpZGUgKyAobGVmdCA+PiAxKTsKKyAgICBkc3QtPnlfc3RyaWRlID0gc3JjLT55X3N0cmlkZTsKKyAgICBkc3QtPnV2X3N0cmlkZSA9IHNyYy0+dXZfc3RyaWRlOworICAgIGlmIChzcmMtPmEgIT0gTlVMTCkgeworICAgICAgZHN0LT5hID0gc3JjLT5hICsgdG9wICogc3JjLT5hX3N0cmlkZSArIGxlZnQ7CisgICAgICBkc3QtPmFfc3RyaWRlID0gc3JjLT5hX3N0cmlkZTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZHN0LT5hcmdiID0gc3JjLT5hcmdiICsgdG9wICogc3JjLT5hcmdiX3N0cmlkZSArIGxlZnQ7CisgICAgZHN0LT5hcmdiX3N0cmlkZSA9IHNyYy0+YXJnYl9zdHJpZGU7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQaWN0dXJlIGNyb3BwaW5nCisKK2ludCBXZWJQUGljdHVyZUNyb3AoV2ViUFBpY3R1cmUqIHBpYywKKyAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsIGludCB0b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICBXZWJQUGljdHVyZSB0bXA7CisKKyAgaWYgKHBpYyA9PSBOVUxMKSByZXR1cm4gMDsKKyAgaWYgKCFBZGp1c3RBbmRDaGVja1JlY3RhbmdsZShwaWMsICZsZWZ0LCAmdG9wLCB3aWR0aCwgaGVpZ2h0KSkgcmV0dXJuIDA7CisKKyAgUGljdHVyZUdyYWJTcGVjcyhwaWMsICZ0bXApOworICB0bXAud2lkdGggPSB3aWR0aDsKKyAgdG1wLmhlaWdodCA9IGhlaWdodDsKKyAgaWYgKCFXZWJQUGljdHVyZUFsbG9jKCZ0bXApKSByZXR1cm4gMDsKKworICBpZiAoIXBpYy0+dXNlX2FyZ2IpIHsKKyAgICBjb25zdCBpbnQgeV9vZmZzZXQgPSB0b3AgKiBwaWMtPnlfc3RyaWRlICsgbGVmdDsKKyAgICBjb25zdCBpbnQgdXZfb2Zmc2V0ID0gKHRvcCAvIDIpICogcGljLT51dl9zdHJpZGUgKyBsZWZ0IC8gMjsKKyAgICBXZWJQQ29weVBsYW5lKHBpYy0+eSArIHlfb2Zmc2V0LCBwaWMtPnlfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgdG1wLnksIHRtcC55X3N0cmlkZSwgd2lkdGgsIGhlaWdodCk7CisgICAgV2ViUENvcHlQbGFuZShwaWMtPnUgKyB1dl9vZmZzZXQsIHBpYy0+dXZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgdG1wLnUsIHRtcC51dl9zdHJpZGUsIEhBTFZFKHdpZHRoKSwgSEFMVkUoaGVpZ2h0KSk7CisgICAgV2ViUENvcHlQbGFuZShwaWMtPnYgKyB1dl9vZmZzZXQsIHBpYy0+dXZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgdG1wLnYsIHRtcC51dl9zdHJpZGUsIEhBTFZFKHdpZHRoKSwgSEFMVkUoaGVpZ2h0KSk7CisKKyAgICBpZiAodG1wLmEgIT0gTlVMTCkgeworICAgICAgY29uc3QgaW50IGFfb2Zmc2V0ID0gdG9wICogcGljLT5hX3N0cmlkZSArIGxlZnQ7CisgICAgICBXZWJQQ29weVBsYW5lKHBpYy0+YSArIGFfb2Zmc2V0LCBwaWMtPmFfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICB0bXAuYSwgdG1wLmFfc3RyaWRlLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgY29uc3QgdWludDhfdCogY29uc3Qgc3JjID0KKyAgICAgICAgKGNvbnN0IHVpbnQ4X3QqKShwaWMtPmFyZ2IgKyB0b3AgKiBwaWMtPmFyZ2Jfc3RyaWRlICsgbGVmdCk7CisgICAgV2ViUENvcHlQbGFuZShzcmMsIHBpYy0+YXJnYl9zdHJpZGUgKiA0LCAodWludDhfdCopdG1wLmFyZ2IsCisgICAgICAgICAgICAgICAgICB0bXAuYXJnYl9zdHJpZGUgKiA0LCB3aWR0aCAqIDQsIGhlaWdodCk7CisgIH0KKyAgV2ViUFBpY3R1cmVGcmVlKHBpYyk7CisgICpwaWMgPSB0bXA7CisgIHJldHVybiAxOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU2ltcGxlIHBpY3R1cmUgcmVzY2FsZXIKKworc3RhdGljIHZvaWQgUmVzY2FsZVBsYW5lKGNvbnN0IHVpbnQ4X3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3dpZHRoLCBpbnQgc3JjX2hlaWdodCwgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3Rfd2lkdGgsIGludCBkc3RfaGVpZ2h0LCBpbnQgZHN0X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXNjYWxlcl90KiBjb25zdCB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fY2hhbm5lbHMpIHsKKyAgV2ViUFJlc2NhbGVyIHJlc2NhbGVyOworICBpbnQgeSA9IDA7CisgIFdlYlBSZXNjYWxlckluaXQoJnJlc2NhbGVyLCBzcmNfd2lkdGgsIHNyY19oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgZHN0LCBkc3Rfd2lkdGgsIGRzdF9oZWlnaHQsIGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgbnVtX2NoYW5uZWxzLCB3b3JrKTsKKyAgd2hpbGUgKHkgPCBzcmNfaGVpZ2h0KSB7CisgICAgeSArPSBXZWJQUmVzY2FsZXJJbXBvcnQoJnJlc2NhbGVyLCBzcmNfaGVpZ2h0IC0geSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMgKyB5ICogc3JjX3N0cmlkZSwgc3JjX3N0cmlkZSk7CisgICAgV2ViUFJlc2NhbGVyRXhwb3J0KCZyZXNjYWxlcik7CisgIH0KK30KKworc3RhdGljIHZvaWQgQWxwaGFNdWx0aXBseUFSR0IoV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywgaW50IGludmVyc2UpIHsKKyAgYXNzZXJ0KHBpYy0+YXJnYiAhPSBOVUxMKTsKKyAgV2ViUE11bHRBUkdCUm93cygodWludDhfdCopcGljLT5hcmdiLCBwaWMtPmFyZ2Jfc3RyaWRlICogc2l6ZW9mKCpwaWMtPmFyZ2IpLAorICAgICAgICAgICAgICAgICAgIHBpYy0+d2lkdGgsIHBpYy0+aGVpZ2h0LCBpbnZlcnNlKTsKK30KKworc3RhdGljIHZvaWQgQWxwaGFNdWx0aXBseVkoV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywgaW50IGludmVyc2UpIHsKKyAgaWYgKHBpYy0+YSAhPSBOVUxMKSB7CisgICAgV2ViUE11bHRSb3dzKHBpYy0+eSwgcGljLT55X3N0cmlkZSwgcGljLT5hLCBwaWMtPmFfc3RyaWRlLAorICAgICAgICAgICAgICAgICBwaWMtPndpZHRoLCBwaWMtPmhlaWdodCwgaW52ZXJzZSk7CisgIH0KK30KKworaW50IFdlYlBQaWN0dXJlUmVzY2FsZShXZWJQUGljdHVyZSogcGljLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgV2ViUFBpY3R1cmUgdG1wOworICBpbnQgcHJldl93aWR0aCwgcHJldl9oZWlnaHQ7CisgIHJlc2NhbGVyX3QqIHdvcms7CisKKyAgaWYgKHBpYyA9PSBOVUxMKSByZXR1cm4gMDsKKyAgcHJldl93aWR0aCA9IHBpYy0+d2lkdGg7CisgIHByZXZfaGVpZ2h0ID0gcGljLT5oZWlnaHQ7CisgIGlmICghV2ViUFJlc2NhbGVyR2V0U2NhbGVkRGltZW5zaW9ucygKKyAgICAgICAgICBwcmV2X3dpZHRoLCBwcmV2X2hlaWdodCwgJndpZHRoLCAmaGVpZ2h0KSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgUGljdHVyZUdyYWJTcGVjcyhwaWMsICZ0bXApOworICB0bXAud2lkdGggPSB3aWR0aDsKKyAgdG1wLmhlaWdodCA9IGhlaWdodDsKKyAgaWYgKCFXZWJQUGljdHVyZUFsbG9jKCZ0bXApKSByZXR1cm4gMDsKKworICBpZiAoIXBpYy0+dXNlX2FyZ2IpIHsKKyAgICB3b3JrID0gKHJlc2NhbGVyX3QqKVdlYlBTYWZlTWFsbG9jKDJVTEwgKiB3aWR0aCwgc2l6ZW9mKCp3b3JrKSk7CisgICAgaWYgKHdvcmsgPT0gTlVMTCkgeworICAgICAgV2ViUFBpY3R1cmVGcmVlKCZ0bXApOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIC8vIElmIHByZXNlbnQsIHdlIG5lZWQgdG8gcmVzY2FsZSBhbHBoYSBmaXJzdCAoZm9yIEFscGhhTXVsdGlwbHlZKS4KKyAgICBpZiAocGljLT5hICE9IE5VTEwpIHsKKyAgICAgIFdlYlBJbml0QWxwaGFQcm9jZXNzaW5nKCk7CisgICAgICBSZXNjYWxlUGxhbmUocGljLT5hLCBwcmV2X3dpZHRoLCBwcmV2X2hlaWdodCwgcGljLT5hX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICB0bXAuYSwgd2lkdGgsIGhlaWdodCwgdG1wLmFfc3RyaWRlLCB3b3JrLCAxKTsKKyAgICB9CisKKyAgICAvLyBXZSB0YWtlIHRyYW5zcGFyZW5jeSBpbnRvIGFjY291bnQgb24gdGhlIGx1bWEgcGxhbmUgb25seS4gVGhhdCdzIG5vdAorICAgIC8vIHRvdGFsbHkgZXhhY3QgYmxlbmRpbmcsIGJ1dCBzdGlsbCBpcyBhIGdvb2QgYXBwcm94aW1hdGlvbi4KKyAgICBBbHBoYU11bHRpcGx5WShwaWMsIDApOworICAgIFJlc2NhbGVQbGFuZShwaWMtPnksIHByZXZfd2lkdGgsIHByZXZfaGVpZ2h0LCBwaWMtPnlfc3RyaWRlLAorICAgICAgICAgICAgICAgICB0bXAueSwgd2lkdGgsIGhlaWdodCwgdG1wLnlfc3RyaWRlLCB3b3JrLCAxKTsKKyAgICBBbHBoYU11bHRpcGx5WSgmdG1wLCAxKTsKKworICAgIFJlc2NhbGVQbGFuZShwaWMtPnUsCisgICAgICAgICAgICAgICAgIEhBTFZFKHByZXZfd2lkdGgpLCBIQUxWRShwcmV2X2hlaWdodCksIHBpYy0+dXZfc3RyaWRlLAorICAgICAgICAgICAgICAgICB0bXAudSwKKyAgICAgICAgICAgICAgICAgSEFMVkUod2lkdGgpLCBIQUxWRShoZWlnaHQpLCB0bXAudXZfc3RyaWRlLCB3b3JrLCAxKTsKKyAgICBSZXNjYWxlUGxhbmUocGljLT52LAorICAgICAgICAgICAgICAgICBIQUxWRShwcmV2X3dpZHRoKSwgSEFMVkUocHJldl9oZWlnaHQpLCBwaWMtPnV2X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgdG1wLnYsCisgICAgICAgICAgICAgICAgIEhBTFZFKHdpZHRoKSwgSEFMVkUoaGVpZ2h0KSwgdG1wLnV2X3N0cmlkZSwgd29yaywgMSk7CisgIH0gZWxzZSB7CisgICAgd29yayA9IChyZXNjYWxlcl90KilXZWJQU2FmZU1hbGxvYygyVUxMICogd2lkdGggKiA0LCBzaXplb2YoKndvcmspKTsKKyAgICBpZiAod29yayA9PSBOVUxMKSB7CisgICAgICBXZWJQUGljdHVyZUZyZWUoJnRtcCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgLy8gSW4gb3JkZXIgdG8gY29ycmVjdGx5IGludGVycG9sYXRlIGNvbG9ycywgd2UgbmVlZCB0byBhcHBseSB0aGUgYWxwaGEKKyAgICAvLyB3ZWlnaHRpbmcgZmlyc3QgKGJsYWNrLW1hdHRpbmcpLCBzY2FsZSB0aGUgUkdCIHZhbHVlcywgYW5kIHJlbW92ZQorICAgIC8vIHRoZSBwcmVtdWx0aXBsaWNhdGlvbiBhZnRlcndhcmQgKHdoaWxlIHByZXNlcnZpbmcgdGhlIGFscGhhIGNoYW5uZWwpLgorICAgIFdlYlBJbml0QWxwaGFQcm9jZXNzaW5nKCk7CisgICAgQWxwaGFNdWx0aXBseUFSR0IocGljLCAwKTsKKyAgICBSZXNjYWxlUGxhbmUoKGNvbnN0IHVpbnQ4X3QqKXBpYy0+YXJnYiwgcHJldl93aWR0aCwgcHJldl9oZWlnaHQsCisgICAgICAgICAgICAgICAgIHBpYy0+YXJnYl9zdHJpZGUgKiA0LAorICAgICAgICAgICAgICAgICAodWludDhfdCopdG1wLmFyZ2IsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgIHRtcC5hcmdiX3N0cmlkZSAqIDQsCisgICAgICAgICAgICAgICAgIHdvcmssIDQpOworICAgIEFscGhhTXVsdGlwbHlBUkdCKCZ0bXAsIDEpOworICB9CisgIFdlYlBQaWN0dXJlRnJlZShwaWMpOworICBXZWJQU2FmZUZyZWUod29yayk7CisgICpwaWMgPSB0bXA7CisgIHJldHVybiAxOworfQorCisjZWxzZSAgLy8gZGVmaW5lZChXRUJQX1JFRFVDRV9TSVpFKQorCitpbnQgV2ViUFBpY3R1cmVDb3B5KGNvbnN0IFdlYlBQaWN0dXJlKiBzcmMsIFdlYlBQaWN0dXJlKiBkc3QpIHsKKyAgKHZvaWQpc3JjOworICAodm9pZClkc3Q7CisgIHJldHVybiAwOworfQorCitpbnQgV2ViUFBpY3R1cmVJc1ZpZXcoY29uc3QgV2ViUFBpY3R1cmUqIHBpY3R1cmUpIHsKKyAgKHZvaWQpcGljdHVyZTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBXZWJQUGljdHVyZVZpZXcoY29uc3QgV2ViUFBpY3R1cmUqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsIGludCB0b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgV2ViUFBpY3R1cmUqIGRzdCkgeworICAodm9pZClzcmM7CisgICh2b2lkKWxlZnQ7CisgICh2b2lkKXRvcDsKKyAgKHZvaWQpd2lkdGg7CisgICh2b2lkKWhlaWdodDsKKyAgKHZvaWQpZHN0OworICByZXR1cm4gMDsKK30KKworaW50IFdlYlBQaWN0dXJlQ3JvcChXZWJQUGljdHVyZSogcGljLAorICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICh2b2lkKXBpYzsKKyAgKHZvaWQpbGVmdDsKKyAgKHZvaWQpdG9wOworICAodm9pZCl3aWR0aDsKKyAgKHZvaWQpaGVpZ2h0OworICByZXR1cm4gMDsKK30KKworaW50IFdlYlBQaWN0dXJlUmVzY2FsZShXZWJQUGljdHVyZSogcGljLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgKHZvaWQpcGljOworICAodm9pZCl3aWR0aDsKKyAgKHZvaWQpaGVpZ2h0OworICByZXR1cm4gMDsKK30KKyNlbmRpZiAgLy8gIWRlZmluZWQoV0VCUF9SRURVQ0VfU0laRSkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvcGljdHVyZV90b29sc19lbmMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvcGljdHVyZV90b29sc19lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWRjNmNhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9waWN0dXJlX3Rvb2xzX2VuYy5jCkBAIC0wLDAgKzEsMjc4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gV2ViUFBpY3R1cmUgdG9vbHM6IGFscGhhIGhhbmRsaW5nLCBldGMuCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL2Fzc2VydF9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RyaW5nX3BvZW0uaCIKKyNlbHNlCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZW5kaWYKKworI2luY2x1ZGUgInNyYy9lbmMvdnA4aV9lbmMuaCIKKyNpbmNsdWRlICJzcmMvZHNwL3l1di5oIgorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgTWFrZUFSR0IzMihpbnQgciwgaW50IGcsIGludCBiKSB7CisgIHJldHVybiAoMHhmZjAwMDAwMHUgfCAociA8PCAxNikgfCAoZyA8PCA4KSB8IGIpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGVscGVyOiBjbGVhbiB1cCBmdWxseSB0cmFuc3BhcmVudCBhcmVhIHRvIGhlbHAgY29tcHJlc3NpYmlsaXR5LgorCisjZGVmaW5lIFNJWkUgOAorI2RlZmluZSBTSVpFMiAoU0laRSAvIDIpCitzdGF0aWMgaW50IElzVHJhbnNwYXJlbnRBUkdCQXJlYShjb25zdCB1aW50MzJfdCogcHRyLCBpbnQgc3RyaWRlLCBpbnQgc2l6ZSkgeworICBpbnQgeSwgeDsKKyAgZm9yICh5ID0gMDsgeSA8IHNpemU7ICsreSkgeworICAgIGZvciAoeCA9IDA7IHggPCBzaXplOyArK3gpIHsKKyAgICAgIGlmIChwdHJbeF0gJiAweGZmMDAwMDAwdSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICB9CisgICAgcHRyICs9IHN0cmlkZTsKKyAgfQorICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgRmxhdHRlbih1aW50OF90KiBwdHIsIGludCB2LCBpbnQgc3RyaWRlLCBpbnQgc2l6ZSkgeworICBpbnQgeTsKKyAgZm9yICh5ID0gMDsgeSA8IHNpemU7ICsreSkgeworICAgIG1lbXNldChwdHIsIHYsIHNpemUpOworICAgIHB0ciArPSBzdHJpZGU7CisgIH0KK30KKworc3RhdGljIHZvaWQgRmxhdHRlbkFSR0IodWludDMyX3QqIHB0ciwgdWludDMyX3QgdiwgaW50IHN0cmlkZSwgaW50IHNpemUpIHsKKyAgaW50IHgsIHk7CisgIGZvciAoeSA9IDA7IHkgPCBzaXplOyArK3kpIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgc2l6ZTsgKyt4KSBwdHJbeF0gPSB2OworICAgIHB0ciArPSBzdHJpZGU7CisgIH0KK30KKworLy8gU21vb3RoZW4gdGhlIGx1bWEgY29tcG9uZW50cyBvZiB0cmFuc3BhcmVudCBwaXhlbHMuIFJldHVybiB0cnVlIGlmIHRoZSB3aG9sZQorLy8gYmxvY2sgaXMgdHJhbnNwYXJlbnQuCitzdGF0aWMgaW50IFNtb290aGVuQmxvY2soY29uc3QgdWludDhfdCogYV9wdHIsIGludCBhX3N0cmlkZSwgdWludDhfdCogeV9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfc3RyaWRlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgaW50IHN1bSA9IDAsIGNvdW50ID0gMDsKKyAgaW50IHgsIHk7CisgIGNvbnN0IHVpbnQ4X3QqIGFscGhhX3B0ciA9IGFfcHRyOworICB1aW50OF90KiBsdW1hX3B0ciA9IHlfcHRyOworICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7ICsreCkgeworICAgICAgaWYgKGFscGhhX3B0clt4XSAhPSAwKSB7CisgICAgICAgICsrY291bnQ7CisgICAgICAgIHN1bSArPSBsdW1hX3B0clt4XTsKKyAgICAgIH0KKyAgICB9CisgICAgYWxwaGFfcHRyICs9IGFfc3RyaWRlOworICAgIGx1bWFfcHRyICs9IHlfc3RyaWRlOworICB9CisgIGlmIChjb3VudCA+IDAgJiYgY291bnQgPCB3aWR0aCAqIGhlaWdodCkgeworICAgIGNvbnN0IHVpbnQ4X3QgYXZnX3U4ID0gKHVpbnQ4X3QpKHN1bSAvIGNvdW50KTsKKyAgICBhbHBoYV9wdHIgPSBhX3B0cjsKKyAgICBsdW1hX3B0ciA9IHlfcHRyOworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgeworICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKKyAgICAgICAgaWYgKGFscGhhX3B0clt4XSA9PSAwKSBsdW1hX3B0clt4XSA9IGF2Z191ODsKKyAgICAgIH0KKyAgICAgIGFscGhhX3B0ciArPSBhX3N0cmlkZTsKKyAgICAgIGx1bWFfcHRyICs9IHlfc3RyaWRlOworICAgIH0KKyAgfQorICByZXR1cm4gKGNvdW50ID09IDApOworfQorCit2b2lkIFdlYlBDbGVhbnVwVHJhbnNwYXJlbnRBcmVhKFdlYlBQaWN0dXJlKiBwaWMpIHsKKyAgaW50IHgsIHksIHcsIGg7CisgIGlmIChwaWMgPT0gTlVMTCkgcmV0dXJuOworICB3ID0gcGljLT53aWR0aCAvIFNJWkU7CisgIGggPSBwaWMtPmhlaWdodCAvIFNJWkU7CisKKyAgLy8gbm90ZTogd2UgaWdub3JlIHRoZSBsZWZ0LW92ZXJzIG9uIHJpZ2h0L2JvdHRvbSwgZXhjZXB0IGZvciBTbW9vdGhlbkJsb2NrKCkuCisgIGlmIChwaWMtPnVzZV9hcmdiKSB7CisgICAgdWludDMyX3QgYXJnYl92YWx1ZSA9IDA7CisgICAgZm9yICh5ID0gMDsgeSA8IGg7ICsreSkgeworICAgICAgaW50IG5lZWRfcmVzZXQgPSAxOworICAgICAgZm9yICh4ID0gMDsgeCA8IHc7ICsreCkgeworICAgICAgICBjb25zdCBpbnQgb2ZmID0gKHkgKiBwaWMtPmFyZ2Jfc3RyaWRlICsgeCkgKiBTSVpFOworICAgICAgICBpZiAoSXNUcmFuc3BhcmVudEFSR0JBcmVhKHBpYy0+YXJnYiArIG9mZiwgcGljLT5hcmdiX3N0cmlkZSwgU0laRSkpIHsKKyAgICAgICAgICBpZiAobmVlZF9yZXNldCkgeworICAgICAgICAgICAgYXJnYl92YWx1ZSA9IHBpYy0+YXJnYltvZmZdOworICAgICAgICAgICAgbmVlZF9yZXNldCA9IDA7CisgICAgICAgICAgfQorICAgICAgICAgIEZsYXR0ZW5BUkdCKHBpYy0+YXJnYiArIG9mZiwgYXJnYl92YWx1ZSwgcGljLT5hcmdiX3N0cmlkZSwgU0laRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbmVlZF9yZXNldCA9IDE7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgY29uc3QgaW50IHdpZHRoID0gcGljLT53aWR0aDsKKyAgICBjb25zdCBpbnQgaGVpZ2h0ID0gcGljLT5oZWlnaHQ7CisgICAgY29uc3QgaW50IHlfc3RyaWRlID0gcGljLT55X3N0cmlkZTsKKyAgICBjb25zdCBpbnQgdXZfc3RyaWRlID0gcGljLT51dl9zdHJpZGU7CisgICAgY29uc3QgaW50IGFfc3RyaWRlID0gcGljLT5hX3N0cmlkZTsKKyAgICB1aW50OF90KiB5X3B0ciA9IHBpYy0+eTsKKyAgICB1aW50OF90KiB1X3B0ciA9IHBpYy0+dTsKKyAgICB1aW50OF90KiB2X3B0ciA9IHBpYy0+djsKKyAgICBjb25zdCB1aW50OF90KiBhX3B0ciA9IHBpYy0+YTsKKyAgICBpbnQgdmFsdWVzWzNdID0geyAwIH07CisgICAgaWYgKGFfcHRyID09IE5VTEwgfHwgeV9wdHIgPT0gTlVMTCB8fCB1X3B0ciA9PSBOVUxMIHx8IHZfcHRyID09IE5VTEwpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgZm9yICh5ID0gMDsgeSArIFNJWkUgPD0gaGVpZ2h0OyB5ICs9IFNJWkUpIHsKKyAgICAgIGludCBuZWVkX3Jlc2V0ID0gMTsKKyAgICAgIGZvciAoeCA9IDA7IHggKyBTSVpFIDw9IHdpZHRoOyB4ICs9IFNJWkUpIHsKKyAgICAgICAgaWYgKFNtb290aGVuQmxvY2soYV9wdHIgKyB4LCBhX3N0cmlkZSwgeV9wdHIgKyB4LCB5X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0laRSwgU0laRSkpIHsKKyAgICAgICAgICBpZiAobmVlZF9yZXNldCkgeworICAgICAgICAgICAgdmFsdWVzWzBdID0geV9wdHJbeF07CisgICAgICAgICAgICB2YWx1ZXNbMV0gPSB1X3B0clt4ID4+IDFdOworICAgICAgICAgICAgdmFsdWVzWzJdID0gdl9wdHJbeCA+PiAxXTsKKyAgICAgICAgICAgIG5lZWRfcmVzZXQgPSAwOworICAgICAgICAgIH0KKyAgICAgICAgICBGbGF0dGVuKHlfcHRyICsgeCwgICAgICAgIHZhbHVlc1swXSwgeV9zdHJpZGUsICBTSVpFKTsKKyAgICAgICAgICBGbGF0dGVuKHVfcHRyICsgKHggPj4gMSksIHZhbHVlc1sxXSwgdXZfc3RyaWRlLCBTSVpFMik7CisgICAgICAgICAgRmxhdHRlbih2X3B0ciArICh4ID4+IDEpLCB2YWx1ZXNbMl0sIHV2X3N0cmlkZSwgU0laRTIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG5lZWRfcmVzZXQgPSAxOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoeCA8IHdpZHRoKSB7CisgICAgICAgIFNtb290aGVuQmxvY2soYV9wdHIgKyB4LCBhX3N0cmlkZSwgeV9wdHIgKyB4LCB5X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICB3aWR0aCAtIHgsIFNJWkUpOworICAgICAgfQorICAgICAgYV9wdHIgKz0gU0laRSAqIGFfc3RyaWRlOworICAgICAgeV9wdHIgKz0gU0laRSAqIHlfc3RyaWRlOworICAgICAgdV9wdHIgKz0gU0laRTIgKiB1dl9zdHJpZGU7CisgICAgICB2X3B0ciArPSBTSVpFMiAqIHV2X3N0cmlkZTsKKyAgICB9CisgICAgaWYgKHkgPCBoZWlnaHQpIHsKKyAgICAgIGNvbnN0IGludCBzdWJfaGVpZ2h0ID0gaGVpZ2h0IC0geTsKKyAgICAgIGZvciAoeCA9IDA7IHggKyBTSVpFIDw9IHdpZHRoOyB4ICs9IFNJWkUpIHsKKyAgICAgICAgU21vb3RoZW5CbG9jayhhX3B0ciArIHgsIGFfc3RyaWRlLCB5X3B0ciArIHgsIHlfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgIFNJWkUsIHN1Yl9oZWlnaHQpOworICAgICAgfQorICAgICAgaWYgKHggPCB3aWR0aCkgeworICAgICAgICBTbW9vdGhlbkJsb2NrKGFfcHRyICsgeCwgYV9zdHJpZGUsIHlfcHRyICsgeCwgeV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgd2lkdGggLSB4LCBzdWJfaGVpZ2h0KTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworI3VuZGVmIFNJWkUKKyN1bmRlZiBTSVpFMgorCit2b2lkIFdlYlBDbGVhbnVwVHJhbnNwYXJlbnRBcmVhTG9zc2xlc3MoV2ViUFBpY3R1cmUqIGNvbnN0IHBpYykgeworICBpbnQgeCwgeSwgdywgaDsKKyAgdWludDMyX3QqIGFyZ2I7CisgIGFzc2VydChwaWMgIT0gTlVMTCAmJiBwaWMtPnVzZV9hcmdiKTsKKyAgdyA9IHBpYy0+d2lkdGg7CisgIGggPSBwaWMtPmhlaWdodDsKKyAgYXJnYiA9IHBpYy0+YXJnYjsKKworICBmb3IgKHkgPSAwOyB5IDwgaDsgKyt5KSB7CisgICAgZm9yICh4ID0gMDsgeCA8IHc7ICsreCkgeworICAgICAgaWYgKChhcmdiW3hdICYgMHhmZjAwMDAwMCkgPT0gMCkgeworICAgICAgICBhcmdiW3hdID0gMHgwMDAwMDAwMDsKKyAgICAgIH0KKyAgICB9CisgICAgYXJnYiArPSBwaWMtPmFyZ2Jfc3RyaWRlOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBCbGVuZCBjb2xvciBhbmQgcmVtb3ZlIHRyYW5zcGFyZW5jeSBpbmZvCisKKyNkZWZpbmUgQkxFTkQoVjAsIFYxLCBBTFBIQSkgXAorICAgICgoKChWMCkgKiAoMjU1IC0gKEFMUEhBKSkgKyAoVjEpICogKEFMUEhBKSkgKiAweDEwMSArIDI1NikgPj4gMTYpCisjZGVmaW5lIEJMRU5EXzEwQklUKFYwLCBWMSwgQUxQSEEpIFwKKyAgICAoKCgoVjApICogKDEwMjAgLSAoQUxQSEEpKSArIChWMSkgKiAoQUxQSEEpKSAqIDB4MTAxICsgMTAyNCkgPj4gMTgpCisKK3ZvaWQgV2ViUEJsZW5kQWxwaGEoV2ViUFBpY3R1cmUqIHBpYywgdWludDMyX3QgYmFja2dyb3VuZF9yZ2IpIHsKKyAgY29uc3QgaW50IHJlZCA9IChiYWNrZ3JvdW5kX3JnYiA+PiAxNikgJiAweGZmOworICBjb25zdCBpbnQgZ3JlZW4gPSAoYmFja2dyb3VuZF9yZ2IgPj4gOCkgJiAweGZmOworICBjb25zdCBpbnQgYmx1ZSA9IChiYWNrZ3JvdW5kX3JnYiA+PiAwKSAmIDB4ZmY7CisgIGludCB4LCB5OworICBpZiAocGljID09IE5VTEwpIHJldHVybjsKKyAgaWYgKCFwaWMtPnVzZV9hcmdiKSB7CisgICAgY29uc3QgaW50IHV2X3dpZHRoID0gKHBpYy0+d2lkdGggPj4gMSk7ICAvLyBvbWl0IGxhc3QgcGl4ZWwgZHVyaW5nIHUvdiBsb29wCisgICAgY29uc3QgaW50IFkwID0gVlA4UkdCVG9ZKHJlZCwgZ3JlZW4sIGJsdWUsIFlVVl9IQUxGKTsKKyAgICAvLyBWUDhSR0JUb1UvViBleHBlY3RzIHRoZSB1L3YgdmFsdWVzIHN1bW1lZCBvdmVyIGZvdXIgcGl4ZWxzCisgICAgY29uc3QgaW50IFUwID0gVlA4UkdCVG9VKDQgKiByZWQsIDQgKiBncmVlbiwgNCAqIGJsdWUsIDQgKiBZVVZfSEFMRik7CisgICAgY29uc3QgaW50IFYwID0gVlA4UkdCVG9WKDQgKiByZWQsIDQgKiBncmVlbiwgNCAqIGJsdWUsIDQgKiBZVVZfSEFMRik7CisgICAgY29uc3QgaW50IGhhc19hbHBoYSA9IHBpYy0+Y29sb3JzcGFjZSAmIFdFQlBfQ1NQX0FMUEhBX0JJVDsKKyAgICBpZiAoIWhhc19hbHBoYSB8fCBwaWMtPmEgPT0gTlVMTCkgcmV0dXJuOyAgICAvLyBub3RoaW5nIHRvIGRvCisgICAgZm9yICh5ID0gMDsgeSA8IHBpYy0+aGVpZ2h0OyArK3kpIHsKKyAgICAgIC8vIEx1bWEgYmxlbmRpbmcKKyAgICAgIHVpbnQ4X3QqIGNvbnN0IHlfcHRyID0gcGljLT55ICsgeSAqIHBpYy0+eV9zdHJpZGU7CisgICAgICB1aW50OF90KiBjb25zdCBhX3B0ciA9IHBpYy0+YSArIHkgKiBwaWMtPmFfc3RyaWRlOworICAgICAgZm9yICh4ID0gMDsgeCA8IHBpYy0+d2lkdGg7ICsreCkgeworICAgICAgICBjb25zdCBpbnQgYWxwaGEgPSBhX3B0clt4XTsKKyAgICAgICAgaWYgKGFscGhhIDwgMHhmZikgeworICAgICAgICAgIHlfcHRyW3hdID0gQkxFTkQoWTAsIHlfcHRyW3hdLCBhX3B0clt4XSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8vIENocm9tYSBibGVuZGluZyBldmVyeSBldmVuIGxpbmUKKyAgICAgIGlmICgoeSAmIDEpID09IDApIHsKKyAgICAgICAgdWludDhfdCogY29uc3QgdSA9IHBpYy0+dSArICh5ID4+IDEpICogcGljLT51dl9zdHJpZGU7CisgICAgICAgIHVpbnQ4X3QqIGNvbnN0IHYgPSBwaWMtPnYgKyAoeSA+PiAxKSAqIHBpYy0+dXZfc3RyaWRlOworICAgICAgICB1aW50OF90KiBjb25zdCBhX3B0cjIgPQorICAgICAgICAgICAgKHkgKyAxID09IHBpYy0+aGVpZ2h0KSA/IGFfcHRyIDogYV9wdHIgKyBwaWMtPmFfc3RyaWRlOworICAgICAgICBmb3IgKHggPSAwOyB4IDwgdXZfd2lkdGg7ICsreCkgeworICAgICAgICAgIC8vIEF2ZXJhZ2UgZm91ciBhbHBoYSB2YWx1ZXMgaW50byBhIHNpbmdsZSBibGVuZGluZyB3ZWlnaHQuCisgICAgICAgICAgLy8gVE9ETyhza2FsKTogbWlnaHQgbGVhZCB0byB2aXNpYmxlIGNvbnRvdXJpbmcuIENhbiB3ZSBkbyBiZXR0ZXI/CisgICAgICAgICAgY29uc3QgaW50IGFscGhhID0KKyAgICAgICAgICAgICAgYV9wdHJbMiAqIHggKyAwXSArIGFfcHRyWzIgKiB4ICsgMV0gKworICAgICAgICAgICAgICBhX3B0cjJbMiAqIHggKyAwXSArIGFfcHRyMlsyICogeCArIDFdOworICAgICAgICAgIHVbeF0gPSBCTEVORF8xMEJJVChVMCwgdVt4XSwgYWxwaGEpOworICAgICAgICAgIHZbeF0gPSBCTEVORF8xMEJJVChWMCwgdlt4XSwgYWxwaGEpOworICAgICAgICB9CisgICAgICAgIGlmIChwaWMtPndpZHRoICYgMSkgeyAgIC8vIHJpZ2h0bW9zdCBwaXhlbAorICAgICAgICAgIGNvbnN0IGludCBhbHBoYSA9IDIgKiAoYV9wdHJbMiAqIHggKyAwXSArIGFfcHRyMlsyICogeCArIDBdKTsKKyAgICAgICAgICB1W3hdID0gQkxFTkRfMTBCSVQoVTAsIHVbeF0sIGFscGhhKTsKKyAgICAgICAgICB2W3hdID0gQkxFTkRfMTBCSVQoVjAsIHZbeF0sIGFscGhhKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgbWVtc2V0KGFfcHRyLCAweGZmLCBwaWMtPndpZHRoKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdWludDMyX3QqIGFyZ2IgPSBwaWMtPmFyZ2I7CisgICAgY29uc3QgdWludDMyX3QgYmFja2dyb3VuZCA9IE1ha2VBUkdCMzIocmVkLCBncmVlbiwgYmx1ZSk7CisgICAgZm9yICh5ID0gMDsgeSA8IHBpYy0+aGVpZ2h0OyArK3kpIHsKKyAgICAgIGZvciAoeCA9IDA7IHggPCBwaWMtPndpZHRoOyArK3gpIHsKKyAgICAgICAgY29uc3QgaW50IGFscGhhID0gKGFyZ2JbeF0gPj4gMjQpICYgMHhmZjsKKyAgICAgICAgaWYgKGFscGhhICE9IDB4ZmYpIHsKKyAgICAgICAgICBpZiAoYWxwaGEgPiAwKSB7CisgICAgICAgICAgICBpbnQgciA9IChhcmdiW3hdID4+IDE2KSAmIDB4ZmY7CisgICAgICAgICAgICBpbnQgZyA9IChhcmdiW3hdID4+ICA4KSAmIDB4ZmY7CisgICAgICAgICAgICBpbnQgYiA9IChhcmdiW3hdID4+ICAwKSAmIDB4ZmY7CisgICAgICAgICAgICByID0gQkxFTkQocmVkLCByLCBhbHBoYSk7CisgICAgICAgICAgICBnID0gQkxFTkQoZ3JlZW4sIGcsIGFscGhhKTsKKyAgICAgICAgICAgIGIgPSBCTEVORChibHVlLCBiLCBhbHBoYSk7CisgICAgICAgICAgICBhcmdiW3hdID0gTWFrZUFSR0IzMihyLCBnLCBiKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXJnYlt4XSA9IGJhY2tncm91bmQ7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBhcmdiICs9IHBpYy0+YXJnYl9zdHJpZGU7CisgICAgfQorICB9Cit9CisKKyN1bmRlZiBCTEVORAorI3VuZGVmIEJMRU5EXzEwQklUCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL3ByZWRpY3Rvcl9lbmMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvcHJlZGljdG9yX2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2OWNkZWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL3ByZWRpY3Rvcl9lbmMuYwpAQCAtMCwwICsxLDc3NiBAQAorLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEltYWdlIHRyYW5zZm9ybSBtZXRob2RzIGZvciBsb3NzbGVzcyBlbmNvZGVyLgorLy8KKy8vIEF1dGhvcnM6IFZpa2FzIEFyb3JhICh2aWthYXMuYXJvcmFAZ21haWwuY29tKQorLy8gICAgICAgICAgSnlya2kgQWxha3VpamFsYSAoanlya2lAZ29vZ2xlLmNvbSkKKy8vICAgICAgICAgIFVydmFuZyBKb3NoaSAodXJ2YW5nQGdvb2dsZS5jb20pCisvLyAgICAgICAgICBWaW5jZW50IFJhYmF1ZCAodnJhYmF1ZEBnb29nbGUuY29tKQorCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vYXNzZXJ0X3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdGRsaWJfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0cmluZ19wb2VtLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInNyYy9kc3AvbG9zc2xlc3MuaCIKKyNpbmNsdWRlICJzcmMvZHNwL2xvc3NsZXNzX2NvbW1vbi5oIgorI2luY2x1ZGUgInNyYy9lbmMvdnA4bGlfZW5jLmgiCisKKyNkZWZpbmUgTUFYX0RJRkZfQ09TVCAoMWUzMGYpCisKK3N0YXRpYyBjb25zdCBmbG9hdCBrU3BhdGlhbFByZWRpY3RvckJpYXMgPSAxNS5mOworc3RhdGljIGNvbnN0IGludCBrUHJlZExvd0VmZm9ydCA9IDExOworc3RhdGljIGNvbnN0IHVpbnQzMl90IGtNYXNrQWxwaGEgPSAweGZmMDAwMDAwOworCisvLyBNb3N0bHkgdXNlZCB0byByZWR1Y2UgY29kZSBzaXplICsgcmVhZGFiaWxpdHkKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgR2V0TWluKGludCBhLCBpbnQgYikgeyByZXR1cm4gKGEgPiBiKSA/IGIgOiBhOyB9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNZXRob2RzIHRvIGNhbGN1bGF0ZSBFbnRyb3B5IChTaGFubm9uKS4KKworc3RhdGljIGZsb2F0IFByZWRpY3Rpb25Db3N0U3BhdGlhbChjb25zdCBpbnQgY291bnRzWzI1Nl0sIGludCB3ZWlnaHRfMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGV4cF92YWwpIHsKKyAgY29uc3QgaW50IHNpZ25pZmljYW50X3N5bWJvbHMgPSAyNTYgPj4gNDsKKyAgY29uc3QgZG91YmxlIGV4cF9kZWNheV9mYWN0b3IgPSAwLjY7CisgIGRvdWJsZSBiaXRzID0gd2VpZ2h0XzAgKiBjb3VudHNbMF07CisgIGludCBpOworICBmb3IgKGkgPSAxOyBpIDwgc2lnbmlmaWNhbnRfc3ltYm9sczsgKytpKSB7CisgICAgYml0cyArPSBleHBfdmFsICogKGNvdW50c1tpXSArIGNvdW50c1syNTYgLSBpXSk7CisgICAgZXhwX3ZhbCAqPSBleHBfZGVjYXlfZmFjdG9yOworICB9CisgIHJldHVybiAoZmxvYXQpKC0wLjEgKiBiaXRzKTsKK30KKworc3RhdGljIGZsb2F0IFByZWRpY3Rpb25Db3N0U3BhdGlhbEhpc3RvZ3JhbShjb25zdCBpbnQgYWNjdW11bGF0ZWRbNF1bMjU2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHRpbGVbNF1bMjU2XSkgeworICBpbnQgaTsKKyAgZG91YmxlIHJldHZhbCA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICBjb25zdCBkb3VibGUga0V4cFZhbHVlID0gMC45NDsKKyAgICByZXR2YWwgKz0gUHJlZGljdGlvbkNvc3RTcGF0aWFsKHRpbGVbaV0sIDEsIGtFeHBWYWx1ZSk7CisgICAgcmV0dmFsICs9IFZQOExDb21iaW5lZFNoYW5ub25FbnRyb3B5KHRpbGVbaV0sIGFjY3VtdWxhdGVkW2ldKTsKKyAgfQorICByZXR1cm4gKGZsb2F0KXJldHZhbDsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVXBkYXRlSGlzdG8oaW50IGhpc3RvX2FyZ2JbNF1bMjU2XSwgdWludDMyX3QgYXJnYikgeworICArK2hpc3RvX2FyZ2JbMF1bYXJnYiA+PiAyNF07CisgICsraGlzdG9fYXJnYlsxXVsoYXJnYiA+PiAxNikgJiAweGZmXTsKKyAgKytoaXN0b19hcmdiWzJdWyhhcmdiID4+IDgpICYgMHhmZl07CisgICsraGlzdG9fYXJnYlszXVthcmdiICYgMHhmZl07Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTcGF0aWFsIHRyYW5zZm9ybSBmdW5jdGlvbnMuCisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFByZWRpY3RCYXRjaChpbnQgbW9kZSwgaW50IHhfc3RhcnQsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCBjb25zdCB1aW50MzJfdCogY3VycmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogdXBwZXIsIHVpbnQzMl90KiBvdXQpIHsKKyAgaWYgKHhfc3RhcnQgPT0gMCkgeworICAgIGlmICh5ID09IDApIHsKKyAgICAgIC8vIEFSR0JfQkxBQ0suCisgICAgICBWUDhMUHJlZGljdG9yc1N1YlswXShjdXJyZW50LCBOVUxMLCAxLCBvdXQpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBUb3Agb25lLgorICAgICAgVlA4TFByZWRpY3RvcnNTdWJbMl0oY3VycmVudCwgdXBwZXIsIDEsIG91dCk7CisgICAgfQorICAgICsreF9zdGFydDsKKyAgICArK291dDsKKyAgICAtLW51bV9waXhlbHM7CisgIH0KKyAgaWYgKHkgPT0gMCkgeworICAgIC8vIExlZnQgb25lLgorICAgIFZQOExQcmVkaWN0b3JzU3ViWzFdKGN1cnJlbnQgKyB4X3N0YXJ0LCBOVUxMLCBudW1fcGl4ZWxzLCBvdXQpOworICB9IGVsc2UgeworICAgIFZQOExQcmVkaWN0b3JzU3ViW21vZGVdKGN1cnJlbnQgKyB4X3N0YXJ0LCB1cHBlciArIHhfc3RhcnQsIG51bV9waXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0KTsKKyAgfQorfQorCisjaWYgKFdFQlBfTkVBUl9MT1NTTEVTUyA9PSAxKQorc3RhdGljIFdFQlBfSU5MSU5FIGludCBHZXRNYXgoaW50IGEsIGludCBiKSB7IHJldHVybiAoYSA8IGIpID8gYiA6IGE7IH0KKworc3RhdGljIGludCBNYXhEaWZmQmV0d2VlblBpeGVscyh1aW50MzJfdCBwMSwgdWludDMyX3QgcDIpIHsKKyAgY29uc3QgaW50IGRpZmZfYSA9IGFicygoaW50KShwMSA+PiAyNCkgLSAoaW50KShwMiA+PiAyNCkpOworICBjb25zdCBpbnQgZGlmZl9yID0gYWJzKChpbnQpKChwMSA+PiAxNikgJiAweGZmKSAtIChpbnQpKChwMiA+PiAxNikgJiAweGZmKSk7CisgIGNvbnN0IGludCBkaWZmX2cgPSBhYnMoKGludCkoKHAxID4+IDgpICYgMHhmZikgLSAoaW50KSgocDIgPj4gOCkgJiAweGZmKSk7CisgIGNvbnN0IGludCBkaWZmX2IgPSBhYnMoKGludCkocDEgJiAweGZmKSAtIChpbnQpKHAyICYgMHhmZikpOworICByZXR1cm4gR2V0TWF4KEdldE1heChkaWZmX2EsIGRpZmZfciksIEdldE1heChkaWZmX2csIGRpZmZfYikpOworfQorCitzdGF0aWMgaW50IE1heERpZmZBcm91bmRQaXhlbCh1aW50MzJfdCBjdXJyZW50LCB1aW50MzJfdCB1cCwgdWludDMyX3QgZG93biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxlZnQsIHVpbnQzMl90IHJpZ2h0KSB7CisgIGNvbnN0IGludCBkaWZmX3VwID0gTWF4RGlmZkJldHdlZW5QaXhlbHMoY3VycmVudCwgdXApOworICBjb25zdCBpbnQgZGlmZl9kb3duID0gTWF4RGlmZkJldHdlZW5QaXhlbHMoY3VycmVudCwgZG93bik7CisgIGNvbnN0IGludCBkaWZmX2xlZnQgPSBNYXhEaWZmQmV0d2VlblBpeGVscyhjdXJyZW50LCBsZWZ0KTsKKyAgY29uc3QgaW50IGRpZmZfcmlnaHQgPSBNYXhEaWZmQmV0d2VlblBpeGVscyhjdXJyZW50LCByaWdodCk7CisgIHJldHVybiBHZXRNYXgoR2V0TWF4KGRpZmZfdXAsIGRpZmZfZG93biksIEdldE1heChkaWZmX2xlZnQsIGRpZmZfcmlnaHQpKTsKK30KKworc3RhdGljIHVpbnQzMl90IEFkZEdyZWVuVG9CbHVlQW5kUmVkKHVpbnQzMl90IGFyZ2IpIHsKKyAgY29uc3QgdWludDMyX3QgZ3JlZW4gPSAoYXJnYiA+PiA4KSAmIDB4ZmY7CisgIHVpbnQzMl90IHJlZF9ibHVlID0gYXJnYiAmIDB4MDBmZjAwZmZ1OworICByZWRfYmx1ZSArPSAoZ3JlZW4gPDwgMTYpIHwgZ3JlZW47CisgIHJlZF9ibHVlICY9IDB4MDBmZjAwZmZ1OworICByZXR1cm4gKGFyZ2IgJiAweGZmMDBmZjAwdSkgfCByZWRfYmx1ZTsKK30KKworc3RhdGljIHZvaWQgTWF4RGlmZnNGb3JSb3coaW50IHdpZHRoLCBpbnQgc3RyaWRlLCBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IG1heF9kaWZmcywgaW50IHVzZWRfc3VidHJhY3RfZ3JlZW4pIHsKKyAgdWludDMyX3QgY3VycmVudCwgdXAsIGRvd24sIGxlZnQsIHJpZ2h0OworICBpbnQgeDsKKyAgaWYgKHdpZHRoIDw9IDIpIHJldHVybjsKKyAgY3VycmVudCA9IGFyZ2JbMF07CisgIHJpZ2h0ID0gYXJnYlsxXTsKKyAgaWYgKHVzZWRfc3VidHJhY3RfZ3JlZW4pIHsKKyAgICBjdXJyZW50ID0gQWRkR3JlZW5Ub0JsdWVBbmRSZWQoY3VycmVudCk7CisgICAgcmlnaHQgPSBBZGRHcmVlblRvQmx1ZUFuZFJlZChyaWdodCk7CisgIH0KKyAgLy8gbWF4X2RpZmZzWzBdIGFuZCBtYXhfZGlmZnNbd2lkdGggLSAxXSBhcmUgbmV2ZXIgdXNlZC4KKyAgZm9yICh4ID0gMTsgeCA8IHdpZHRoIC0gMTsgKyt4KSB7CisgICAgdXAgPSBhcmdiWy1zdHJpZGUgKyB4XTsKKyAgICBkb3duID0gYXJnYltzdHJpZGUgKyB4XTsKKyAgICBsZWZ0ID0gY3VycmVudDsKKyAgICBjdXJyZW50ID0gcmlnaHQ7CisgICAgcmlnaHQgPSBhcmdiW3ggKyAxXTsKKyAgICBpZiAodXNlZF9zdWJ0cmFjdF9ncmVlbikgeworICAgICAgdXAgPSBBZGRHcmVlblRvQmx1ZUFuZFJlZCh1cCk7CisgICAgICBkb3duID0gQWRkR3JlZW5Ub0JsdWVBbmRSZWQoZG93bik7CisgICAgICByaWdodCA9IEFkZEdyZWVuVG9CbHVlQW5kUmVkKHJpZ2h0KTsKKyAgICB9CisgICAgbWF4X2RpZmZzW3hdID0gTWF4RGlmZkFyb3VuZFBpeGVsKGN1cnJlbnQsIHVwLCBkb3duLCBsZWZ0LCByaWdodCk7CisgIH0KK30KKworLy8gUXVhbnRpemUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgYWN0dWFsIGNvbXBvbmVudCB2YWx1ZSBhbmQgaXRzIHByZWRpY3Rpb24KKy8vIHRvIGEgbXVsdGlwbGUgb2YgcXVhbnRpemF0aW9uLCB3b3JraW5nIG1vZHVsbyAyNTYsIHRha2luZyBjYXJlIG5vdCB0byBjcm9zcworLy8gYSBib3VuZGFyeSAoaW5jbHVzaXZlIHVwcGVyIGxpbWl0KS4KK3N0YXRpYyB1aW50OF90IE5lYXJMb3NzbGVzc0NvbXBvbmVudCh1aW50OF90IHZhbHVlLCB1aW50OF90IHByZWRpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBib3VuZGFyeSwgaW50IHF1YW50aXphdGlvbikgeworICBjb25zdCBpbnQgcmVzaWR1YWwgPSAodmFsdWUgLSBwcmVkaWN0KSAmIDB4ZmY7CisgIGNvbnN0IGludCBib3VuZGFyeV9yZXNpZHVhbCA9IChib3VuZGFyeSAtIHByZWRpY3QpICYgMHhmZjsKKyAgY29uc3QgaW50IGxvd2VyID0gcmVzaWR1YWwgJiB+KHF1YW50aXphdGlvbiAtIDEpOworICBjb25zdCBpbnQgdXBwZXIgPSBsb3dlciArIHF1YW50aXphdGlvbjsKKyAgLy8gUmVzb2x2ZSB0aWVzIHRvd2FyZHMgYSB2YWx1ZSBjbG9zZXIgdG8gdGhlIHByZWRpY3Rpb24gKGkuZS4gdG93YXJkcyBsb3dlcgorICAvLyBpZiB2YWx1ZSBjb21lcyBhZnRlciBwcmVkaWN0aW9uIGFuZCB0b3dhcmRzIHVwcGVyIG90aGVyd2lzZSkuCisgIGNvbnN0IGludCBiaWFzID0gKChib3VuZGFyeSAtIHZhbHVlKSAmIDB4ZmYpIDwgYm91bmRhcnlfcmVzaWR1YWw7CisgIGlmIChyZXNpZHVhbCAtIGxvd2VyIDwgdXBwZXIgLSByZXNpZHVhbCArIGJpYXMpIHsKKyAgICAvLyBsb3dlciBpcyBjbG9zZXIgdG8gcmVzaWR1YWwgdGhhbiB1cHBlci4KKyAgICBpZiAocmVzaWR1YWwgPiBib3VuZGFyeV9yZXNpZHVhbCAmJiBsb3dlciA8PSBib3VuZGFyeV9yZXNpZHVhbCkgeworICAgICAgLy8gSGFsdmUgcXVhbnRpemF0aW9uIHN0ZXAgdG8gYXZvaWQgY3Jvc3NpbmcgYm91bmRhcnkuIFRoaXMgbWlkcG9pbnQgaXMKKyAgICAgIC8vIG9uIHRoZSBzYW1lIHNpZGUgb2YgYm91bmRhcnkgYXMgcmVzaWR1YWwgYmVjYXVzZSBtaWRwb2ludCA+PSByZXNpZHVhbAorICAgICAgLy8gKHNpbmNlIGxvd2VyIGlzIGNsb3NlciB0aGFuIHVwcGVyKSBhbmQgcmVzaWR1YWwgaXMgYWJvdmUgdGhlIGJvdW5kYXJ5LgorICAgICAgcmV0dXJuIGxvd2VyICsgKHF1YW50aXphdGlvbiA+PiAxKTsKKyAgICB9CisgICAgcmV0dXJuIGxvd2VyOworICB9IGVsc2UgeworICAgIC8vIHVwcGVyIGlzIGNsb3NlciB0byByZXNpZHVhbCB0aGFuIGxvd2VyLgorICAgIGlmIChyZXNpZHVhbCA8PSBib3VuZGFyeV9yZXNpZHVhbCAmJiB1cHBlciA+IGJvdW5kYXJ5X3Jlc2lkdWFsKSB7CisgICAgICAvLyBIYWx2ZSBxdWFudGl6YXRpb24gc3RlcCB0byBhdm9pZCBjcm9zc2luZyBib3VuZGFyeS4gVGhpcyBtaWRwb2ludCBpcworICAgICAgLy8gb24gdGhlIHNhbWUgc2lkZSBvZiBib3VuZGFyeSBhcyByZXNpZHVhbCBiZWNhdXNlIG1pZHBvaW50IDw9IHJlc2lkdWFsCisgICAgICAvLyAoc2luY2UgdXBwZXIgaXMgY2xvc2VyIHRoYW4gbG93ZXIpIGFuZCByZXNpZHVhbCBpcyBiZWxvdyB0aGUgYm91bmRhcnkuCisgICAgICByZXR1cm4gbG93ZXIgKyAocXVhbnRpemF0aW9uID4+IDEpOworICAgIH0KKyAgICByZXR1cm4gdXBwZXIgJiAweGZmOworICB9Cit9CisKKy8vIFF1YW50aXplIGV2ZXJ5IGNvbXBvbmVudCBvZiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBhY3R1YWwgcGl4ZWwgdmFsdWUgYW5kCisvLyBpdHMgcHJlZGljdGlvbiB0byBhIG11bHRpcGxlIG9mIGEgcXVhbnRpemF0aW9uIChhIHBvd2VyIG9mIDIsIG5vdCBsYXJnZXIgdGhhbgorLy8gbWF4X3F1YW50aXphdGlvbiB3aGljaCBpcyBhIHBvd2VyIG9mIDIsIHNtYWxsZXIgdGhhbiBtYXhfZGlmZikuIFRha2UgY2FyZSBpZgorLy8gdmFsdWUgYW5kIHByZWRpY3QgaGF2ZSB1bmRlcmdvbmUgc3VidHJhY3QgZ3JlZW4sIHdoaWNoIG1lYW5zIHRoYXQgcmVkIGFuZAorLy8gYmx1ZSBhcmUgcmVwcmVzZW50ZWQgYXMgb2Zmc2V0cyBmcm9tIGdyZWVuLgorI2RlZmluZSBORUFSX0xPU1NMRVNTX0RJRkYoYSwgYikgKHVpbnQ4X3QpKCgoKGludCkoYSkgLSAoaW50KShiKSkpICYgMHhmZikKK3N0YXRpYyB1aW50MzJfdCBOZWFyTG9zc2xlc3ModWludDMyX3QgdmFsdWUsIHVpbnQzMl90IHByZWRpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhfcXVhbnRpemF0aW9uLCBpbnQgbWF4X2RpZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1c2VkX3N1YnRyYWN0X2dyZWVuKSB7CisgIGludCBxdWFudGl6YXRpb247CisgIHVpbnQ4X3QgbmV3X2dyZWVuID0gMDsKKyAgdWludDhfdCBncmVlbl9kaWZmID0gMDsKKyAgdWludDhfdCBhLCByLCBnLCBiOworICBpZiAobWF4X2RpZmYgPD0gMikgeworICAgIHJldHVybiBWUDhMU3ViUGl4ZWxzKHZhbHVlLCBwcmVkaWN0KTsKKyAgfQorICBxdWFudGl6YXRpb24gPSBtYXhfcXVhbnRpemF0aW9uOworICB3aGlsZSAocXVhbnRpemF0aW9uID49IG1heF9kaWZmKSB7CisgICAgcXVhbnRpemF0aW9uID4+PSAxOworICB9CisgIGlmICgodmFsdWUgPj4gMjQpID09IDAgfHwgKHZhbHVlID4+IDI0KSA9PSAweGZmKSB7CisgICAgLy8gUHJlc2VydmUgdHJhbnNwYXJlbmN5IG9mIGZ1bGx5IHRyYW5zcGFyZW50IG9yIGZ1bGx5IG9wYXF1ZSBwaXhlbHMuCisgICAgYSA9IE5FQVJfTE9TU0xFU1NfRElGRih2YWx1ZSA+PiAyNCwgcHJlZGljdCA+PiAyNCk7CisgIH0gZWxzZSB7CisgICAgYSA9IE5lYXJMb3NzbGVzc0NvbXBvbmVudCh2YWx1ZSA+PiAyNCwgcHJlZGljdCA+PiAyNCwgMHhmZiwgcXVhbnRpemF0aW9uKTsKKyAgfQorICBnID0gTmVhckxvc3NsZXNzQ29tcG9uZW50KCh2YWx1ZSA+PiA4KSAmIDB4ZmYsIChwcmVkaWN0ID4+IDgpICYgMHhmZiwgMHhmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudGl6YXRpb24pOworICBpZiAodXNlZF9zdWJ0cmFjdF9ncmVlbikgeworICAgIC8vIFRoZSBncmVlbiBvZmZzZXQgd2lsbCBiZSBhZGRlZCB0byByZWQgYW5kIGJsdWUgY29tcG9uZW50cyBkdXJpbmcgZGVjb2RpbmcKKyAgICAvLyB0byBvYnRhaW4gdGhlIGFjdHVhbCByZWQgYW5kIGJsdWUgdmFsdWVzLgorICAgIG5ld19ncmVlbiA9ICgocHJlZGljdCA+PiA4KSArIGcpICYgMHhmZjsKKyAgICAvLyBUaGUgYW1vdW50IGJ5IHdoaWNoIGdyZWVuIGhhcyBiZWVuIGFkanVzdGVkIGR1cmluZyBxdWFudGl6YXRpb24uIEl0IGlzCisgICAgLy8gc3VidHJhY3RlZCBmcm9tIHJlZCBhbmQgYmx1ZSBmb3IgY29tcGVuc2F0aW9uLCB0byBhdm9pZCBhY2N1bXVsYXRpbmcgdHdvCisgICAgLy8gcXVhbnRpemF0aW9uIGVycm9ycyBpbiB0aGVtLgorICAgIGdyZWVuX2RpZmYgPSBORUFSX0xPU1NMRVNTX0RJRkYobmV3X2dyZWVuLCB2YWx1ZSA+PiA4KTsKKyAgfQorICByID0gTmVhckxvc3NsZXNzQ29tcG9uZW50KE5FQVJfTE9TU0xFU1NfRElGRih2YWx1ZSA+PiAxNiwgZ3JlZW5fZGlmZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByZWRpY3QgPj4gMTYpICYgMHhmZiwgMHhmZiAtIG5ld19ncmVlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudGl6YXRpb24pOworICBiID0gTmVhckxvc3NsZXNzQ29tcG9uZW50KE5FQVJfTE9TU0xFU1NfRElGRih2YWx1ZSwgZ3JlZW5fZGlmZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdCAmIDB4ZmYsIDB4ZmYgLSBuZXdfZ3JlZW4sIHF1YW50aXphdGlvbik7CisgIHJldHVybiAoKHVpbnQzMl90KWEgPDwgMjQpIHwgKCh1aW50MzJfdClyIDw8IDE2KSB8ICgodWludDMyX3QpZyA8PCA4KSB8IGI7Cit9CisjdW5kZWYgTkVBUl9MT1NTTEVTU19ESUZGCisjZW5kaWYgIC8vIChXRUJQX05FQVJfTE9TU0xFU1MgPT0gMSkKKworLy8gU3RvcmVzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHBpeGVsIGFuZCBpdHMgcHJlZGljdGlvbiBpbiAib3V0Ii4KKy8vIEluIGNhc2Ugb2YgYSBsb3NzeSBlbmNvZGluZywgdXBkYXRlcyB0aGUgc291cmNlIGltYWdlIHRvIGF2b2lkIHByb3BhZ2F0aW5nCisvLyB0aGUgZGV2aWF0aW9uIGZ1cnRoZXIgdG8gcGl4ZWxzIHdoaWNoIGRlcGVuZCBvbiB0aGUgY3VycmVudCBwaXhlbCBmb3IgdGhlaXIKKy8vIHByZWRpY3Rpb25zLgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgR2V0UmVzaWR1YWwoCisgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCB1aW50MzJfdCogY29uc3QgdXBwZXJfcm93LAorICAgIHVpbnQzMl90KiBjb25zdCBjdXJyZW50X3JvdywgY29uc3QgdWludDhfdCogY29uc3QgbWF4X2RpZmZzLCBpbnQgbW9kZSwKKyAgICBpbnQgeF9zdGFydCwgaW50IHhfZW5kLCBpbnQgeSwgaW50IG1heF9xdWFudGl6YXRpb24sIGludCBleGFjdCwKKyAgICBpbnQgdXNlZF9zdWJ0cmFjdF9ncmVlbiwgdWludDMyX3QqIGNvbnN0IG91dCkgeworICBpZiAoZXhhY3QpIHsKKyAgICBQcmVkaWN0QmF0Y2gobW9kZSwgeF9zdGFydCwgeSwgeF9lbmQgLSB4X3N0YXJ0LCBjdXJyZW50X3JvdywgdXBwZXJfcm93LAorICAgICAgICAgICAgICAgICBvdXQpOworICB9IGVsc2UgeworICAgIGNvbnN0IFZQOExQcmVkaWN0b3JGdW5jIHByZWRfZnVuYyA9IFZQOExQcmVkaWN0b3JzW21vZGVdOworICAgIGludCB4OworICAgIGZvciAoeCA9IHhfc3RhcnQ7IHggPCB4X2VuZDsgKyt4KSB7CisgICAgICB1aW50MzJfdCBwcmVkaWN0OworICAgICAgdWludDMyX3QgcmVzaWR1YWw7CisgICAgICBpZiAoeSA9PSAwKSB7CisgICAgICAgIHByZWRpY3QgPSAoeCA9PSAwKSA/IEFSR0JfQkxBQ0sgOiBjdXJyZW50X3Jvd1t4IC0gMV07ICAvLyBMZWZ0LgorICAgICAgfSBlbHNlIGlmICh4ID09IDApIHsKKyAgICAgICAgcHJlZGljdCA9IHVwcGVyX3Jvd1t4XTsgIC8vIFRvcC4KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByZWRpY3QgPSBwcmVkX2Z1bmMoY3VycmVudF9yb3dbeCAtIDFdLCB1cHBlcl9yb3cgKyB4KTsKKyAgICAgIH0KKyNpZiAoV0VCUF9ORUFSX0xPU1NMRVNTID09IDEpCisgICAgICBpZiAobWF4X3F1YW50aXphdGlvbiA9PSAxIHx8IG1vZGUgPT0gMCB8fCB5ID09IDAgfHwgeSA9PSBoZWlnaHQgLSAxIHx8CisgICAgICAgICAgeCA9PSAwIHx8IHggPT0gd2lkdGggLSAxKSB7CisgICAgICAgIHJlc2lkdWFsID0gVlA4TFN1YlBpeGVscyhjdXJyZW50X3Jvd1t4XSwgcHJlZGljdCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXNpZHVhbCA9IE5lYXJMb3NzbGVzcyhjdXJyZW50X3Jvd1t4XSwgcHJlZGljdCwgbWF4X3F1YW50aXphdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2RpZmZzW3hdLCB1c2VkX3N1YnRyYWN0X2dyZWVuKTsKKyAgICAgICAgLy8gVXBkYXRlIHRoZSBzb3VyY2UgaW1hZ2UuCisgICAgICAgIGN1cnJlbnRfcm93W3hdID0gVlA4TEFkZFBpeGVscyhwcmVkaWN0LCByZXNpZHVhbCk7CisgICAgICAgIC8vIHggaXMgbmV2ZXIgMCBoZXJlIHNvIHdlIGRvIG5vdCBuZWVkIHRvIHVwZGF0ZSB1cHBlcl9yb3cgbGlrZSBiZWxvdy4KKyAgICAgIH0KKyNlbHNlCisgICAgICAodm9pZCltYXhfZGlmZnM7CisgICAgICAodm9pZCloZWlnaHQ7CisgICAgICAodm9pZCltYXhfcXVhbnRpemF0aW9uOworICAgICAgKHZvaWQpdXNlZF9zdWJ0cmFjdF9ncmVlbjsKKyAgICAgIHJlc2lkdWFsID0gVlA4TFN1YlBpeGVscyhjdXJyZW50X3Jvd1t4XSwgcHJlZGljdCk7CisjZW5kaWYKKyAgICAgIGlmICgoY3VycmVudF9yb3dbeF0gJiBrTWFza0FscGhhKSA9PSAwKSB7CisgICAgICAgIC8vIElmIGFscGhhIGlzIDAsIGNsZWFudXAgUkdCLiBXZSBjYW4gY2hvb3NlIHRoZSBSR0IgdmFsdWVzIG9mIHRoZQorICAgICAgICAvLyByZXNpZHVhbCBmb3IgYmVzdCBjb21wcmVzc2lvbi4gVGhlIHByZWRpY3Rpb24gb2YgYWxwaGEgaXRzZWxmIGNhbiBiZQorICAgICAgICAvLyBub24temVybyBhbmQgbXVzdCBiZSBrZXB0IHRob3VnaC4gV2UgY2hvb3NlIFJHQiBvZiB0aGUgcmVzaWR1YWwgdG8gYmUKKyAgICAgICAgLy8gMC4KKyAgICAgICAgcmVzaWR1YWwgJj0ga01hc2tBbHBoYTsKKyAgICAgICAgLy8gVXBkYXRlIHRoZSBzb3VyY2UgaW1hZ2UuCisgICAgICAgIGN1cnJlbnRfcm93W3hdID0gcHJlZGljdCAmIH5rTWFza0FscGhhOworICAgICAgICAvLyBUaGUgcHJlZGljdGlvbiBmb3IgdGhlIHJpZ2h0bW9zdCBwaXhlbCBpbiBhIHJvdyB1c2VzIHRoZSBsZWZ0bW9zdAorICAgICAgICAvLyBwaXhlbAorICAgICAgICAvLyBpbiB0aGF0IHJvdyBhcyBpdHMgdG9wLXJpZ2h0IGNvbnRleHQgcGl4ZWwuIEhlbmNlIGlmIHdlIGNoYW5nZSB0aGUKKyAgICAgICAgLy8gbGVmdG1vc3QgcGl4ZWwgb2YgY3VycmVudF9yb3csIHRoZSBjb3JyZXNwb25kaW5nIGNoYW5nZSBtdXN0IGJlCisgICAgICAgIC8vIGFwcGxpZWQKKyAgICAgICAgLy8gdG8gdXBwZXJfcm93IGFzIHdlbGwgd2hlcmUgdG9wLXJpZ2h0IGNvbnRleHQgaXMgYmVpbmcgcmVhZCBmcm9tLgorICAgICAgICBpZiAoeCA9PSAwICYmIHkgIT0gMCkgdXBwZXJfcm93W3dpZHRoXSA9IGN1cnJlbnRfcm93WzBdOworICAgICAgfQorICAgICAgb3V0W3ggLSB4X3N0YXJ0XSA9IHJlc2lkdWFsOworICAgIH0KKyAgfQorfQorCisvLyBSZXR1cm5zIGJlc3QgcHJlZGljdG9yIGFuZCB1cGRhdGVzIHRoZSBhY2N1bXVsYXRlZCBoaXN0b2dyYW0uCisvLyBJZiBtYXhfcXVhbnRpemF0aW9uID4gMSwgYXNzdW1lcyB0aGF0IG5lYXIgbG9zc2xlc3MgcHJvY2Vzc2luZyB3aWxsIGJlCisvLyBhcHBsaWVkLCBxdWFudGl6aW5nIHJlc2lkdWFscyB0byBtdWx0aXBsZXMgb2YgcXVhbnRpemF0aW9uIGxldmVscyB1cCB0bworLy8gbWF4X3F1YW50aXphdGlvbiAodGhlIGFjdHVhbCBxdWFudGl6YXRpb24gbGV2ZWwgZGVwZW5kcyBvbiBzbW9vdGhuZXNzIG5lYXIKKy8vIHRoZSBnaXZlbiBwaXhlbCkuCitzdGF0aWMgaW50IEdldEJlc3RQcmVkaWN0b3JGb3JUaWxlKGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbGVfeCwgaW50IHRpbGVfeSwgaW50IGJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY2N1bXVsYXRlZFs0XVsyNTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogY29uc3QgYXJnYl9zY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heF9xdWFudGl6YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBleGFjdCwgaW50IHVzZWRfc3VidHJhY3RfZ3JlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBtb2RlcykgeworICBjb25zdCBpbnQga051bVByZWRNb2RlcyA9IDE0OworICBjb25zdCBpbnQgc3RhcnRfeCA9IHRpbGVfeCA8PCBiaXRzOworICBjb25zdCBpbnQgc3RhcnRfeSA9IHRpbGVfeSA8PCBiaXRzOworICBjb25zdCBpbnQgdGlsZV9zaXplID0gMSA8PCBiaXRzOworICBjb25zdCBpbnQgbWF4X3kgPSBHZXRNaW4odGlsZV9zaXplLCBoZWlnaHQgLSBzdGFydF95KTsKKyAgY29uc3QgaW50IG1heF94ID0gR2V0TWluKHRpbGVfc2l6ZSwgd2lkdGggLSBzdGFydF94KTsKKyAgLy8gV2hldGhlciB0aGVyZSBleGlzdCBjb2x1bW5zIGp1c3Qgb3V0c2lkZSB0aGUgdGlsZS4KKyAgY29uc3QgaW50IGhhdmVfbGVmdCA9IChzdGFydF94ID4gMCk7CisgIC8vIFBvc2l0aW9uIGFuZCBzaXplIG9mIHRoZSBzdHJpcCBjb3ZlcmluZyB0aGUgdGlsZSBhbmQgYWRqYWNlbnQgY29sdW1ucyBpZgorICAvLyB0aGV5IGV4aXN0LgorICBjb25zdCBpbnQgY29udGV4dF9zdGFydF94ID0gc3RhcnRfeCAtIGhhdmVfbGVmdDsKKyNpZiAoV0VCUF9ORUFSX0xPU1NMRVNTID09IDEpCisgIGNvbnN0IGludCBjb250ZXh0X3dpZHRoID0gbWF4X3ggKyBoYXZlX2xlZnQgKyAobWF4X3ggPCB3aWR0aCAtIHN0YXJ0X3gpOworI2VuZGlmCisgIGNvbnN0IGludCB0aWxlc19wZXJfcm93ID0gVlA4TFN1YlNhbXBsZVNpemUod2lkdGgsIGJpdHMpOworICAvLyBQcmVkaWN0aW9uIG1vZGVzIG9mIHRoZSBsZWZ0IGFuZCBhYm92ZSBuZWlnaGJvciB0aWxlcy4KKyAgY29uc3QgaW50IGxlZnRfbW9kZSA9ICh0aWxlX3ggPiAwKSA/CisgICAgICAobW9kZXNbdGlsZV95ICogdGlsZXNfcGVyX3JvdyArIHRpbGVfeCAtIDFdID4+IDgpICYgMHhmZiA6IDB4ZmY7CisgIGNvbnN0IGludCBhYm92ZV9tb2RlID0gKHRpbGVfeSA+IDApID8KKyAgICAgIChtb2Rlc1sodGlsZV95IC0gMSkgKiB0aWxlc19wZXJfcm93ICsgdGlsZV94XSA+PiA4KSAmIDB4ZmYgOiAweGZmOworICAvLyBUaGUgd2lkdGggb2YgdXBwZXJfcm93IGFuZCBjdXJyZW50X3JvdyBpcyBvbmUgcGl4ZWwgbGFyZ2VyIHRoYW4gaW1hZ2Ugd2lkdGgKKyAgLy8gdG8gYWxsb3cgdGhlIHRvcCByaWdodCBwaXhlbCB0byBwb2ludCB0byB0aGUgbGVmdG1vc3QgcGl4ZWwgb2YgdGhlIG5leHQgcm93CisgIC8vIHdoZW4gYXQgdGhlIHJpZ2h0IGVkZ2UuCisgIHVpbnQzMl90KiB1cHBlcl9yb3cgPSBhcmdiX3NjcmF0Y2g7CisgIHVpbnQzMl90KiBjdXJyZW50X3JvdyA9IHVwcGVyX3JvdyArIHdpZHRoICsgMTsKKyAgdWludDhfdCogY29uc3QgbWF4X2RpZmZzID0gKHVpbnQ4X3QqKShjdXJyZW50X3JvdyArIHdpZHRoICsgMSk7CisgIGZsb2F0IGJlc3RfZGlmZiA9IE1BWF9ESUZGX0NPU1Q7CisgIGludCBiZXN0X21vZGUgPSAwOworICBpbnQgbW9kZTsKKyAgaW50IGhpc3RvX3N0YWNrXzFbNF1bMjU2XTsKKyAgaW50IGhpc3RvX3N0YWNrXzJbNF1bMjU2XTsKKyAgLy8gTmVlZCBwb2ludGVycyB0byBiZSBhYmxlIHRvIHN3YXAgYXJyYXlzLgorICBpbnQgKCpoaXN0b19hcmdiKVsyNTZdID0gaGlzdG9fc3RhY2tfMTsKKyAgaW50ICgqYmVzdF9oaXN0bylbMjU2XSA9IGhpc3RvX3N0YWNrXzI7CisgIGludCBpLCBqOworICB1aW50MzJfdCByZXNpZHVhbHNbMSA8PCBNQVhfVFJBTlNGT1JNX0JJVFNdOworICBhc3NlcnQoYml0cyA8PSBNQVhfVFJBTlNGT1JNX0JJVFMpOworICBhc3NlcnQobWF4X3ggPD0gKDEgPDwgTUFYX1RSQU5TRk9STV9CSVRTKSk7CisKKyAgZm9yIChtb2RlID0gMDsgbW9kZSA8IGtOdW1QcmVkTW9kZXM7ICsrbW9kZSkgeworICAgIGZsb2F0IGN1cl9kaWZmOworICAgIGludCByZWxhdGl2ZV95OworICAgIG1lbXNldChoaXN0b19hcmdiLCAwLCBzaXplb2YoaGlzdG9fc3RhY2tfMSkpOworICAgIGlmIChzdGFydF95ID4gMCkgeworICAgICAgLy8gUmVhZCB0aGUgcm93IGFib3ZlIHRoZSB0aWxlIHdoaWNoIHdpbGwgYmVjb21lIHRoZSBmaXJzdCB1cHBlcl9yb3cuCisgICAgICAvLyBJbmNsdWRlIGEgcGl4ZWwgdG8gdGhlIGxlZnQgaWYgaXQgZXhpc3RzOyBpbmNsdWRlIGEgcGl4ZWwgdG8gdGhlIHJpZ2h0CisgICAgICAvLyBpbiBhbGwgY2FzZXMgKHdyYXBwaW5nIHRvIHRoZSBsZWZ0bW9zdCBwaXhlbCBvZiB0aGUgbmV4dCByb3cgaWYgaXQgZG9lcworICAgICAgLy8gbm90IGV4aXN0KS4KKyAgICAgIG1lbWNweShjdXJyZW50X3JvdyArIGNvbnRleHRfc3RhcnRfeCwKKyAgICAgICAgICAgICBhcmdiICsgKHN0YXJ0X3kgLSAxKSAqIHdpZHRoICsgY29udGV4dF9zdGFydF94LAorICAgICAgICAgICAgIHNpemVvZigqYXJnYikgKiAobWF4X3ggKyBoYXZlX2xlZnQgKyAxKSk7CisgICAgfQorICAgIGZvciAocmVsYXRpdmVfeSA9IDA7IHJlbGF0aXZlX3kgPCBtYXhfeTsgKytyZWxhdGl2ZV95KSB7CisgICAgICBjb25zdCBpbnQgeSA9IHN0YXJ0X3kgKyByZWxhdGl2ZV95OworICAgICAgaW50IHJlbGF0aXZlX3g7CisgICAgICB1aW50MzJfdCogdG1wID0gdXBwZXJfcm93OworICAgICAgdXBwZXJfcm93ID0gY3VycmVudF9yb3c7CisgICAgICBjdXJyZW50X3JvdyA9IHRtcDsKKyAgICAgIC8vIFJlYWQgY3VycmVudF9yb3cuIEluY2x1ZGUgYSBwaXhlbCB0byB0aGUgbGVmdCBpZiBpdCBleGlzdHM7IGluY2x1ZGUgYQorICAgICAgLy8gcGl4ZWwgdG8gdGhlIHJpZ2h0IGluIGFsbCBjYXNlcyBleGNlcHQgYXQgdGhlIGJvdHRvbSByaWdodCBjb3JuZXIgb2YKKyAgICAgIC8vIHRoZSBpbWFnZSAod3JhcHBpbmcgdG8gdGhlIGxlZnRtb3N0IHBpeGVsIG9mIHRoZSBuZXh0IHJvdyBpZiBpdCBkb2VzCisgICAgICAvLyBub3QgZXhpc3QgaW4gdGhlIGN1cnJlbnQgcm93KS4KKyAgICAgIG1lbWNweShjdXJyZW50X3JvdyArIGNvbnRleHRfc3RhcnRfeCwKKyAgICAgICAgICAgICBhcmdiICsgeSAqIHdpZHRoICsgY29udGV4dF9zdGFydF94LAorICAgICAgICAgICAgIHNpemVvZigqYXJnYikgKiAobWF4X3ggKyBoYXZlX2xlZnQgKyAoeSArIDEgPCBoZWlnaHQpKSk7CisjaWYgKFdFQlBfTkVBUl9MT1NTTEVTUyA9PSAxKQorICAgICAgaWYgKG1heF9xdWFudGl6YXRpb24gPiAxICYmIHkgPj0gMSAmJiB5ICsgMSA8IGhlaWdodCkgeworICAgICAgICBNYXhEaWZmc0ZvclJvdyhjb250ZXh0X3dpZHRoLCB3aWR0aCwgYXJnYiArIHkgKiB3aWR0aCArIGNvbnRleHRfc3RhcnRfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgbWF4X2RpZmZzICsgY29udGV4dF9zdGFydF94LCB1c2VkX3N1YnRyYWN0X2dyZWVuKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICBHZXRSZXNpZHVhbCh3aWR0aCwgaGVpZ2h0LCB1cHBlcl9yb3csIGN1cnJlbnRfcm93LCBtYXhfZGlmZnMsIG1vZGUsCisgICAgICAgICAgICAgICAgICBzdGFydF94LCBzdGFydF94ICsgbWF4X3gsIHksIG1heF9xdWFudGl6YXRpb24sIGV4YWN0LAorICAgICAgICAgICAgICAgICAgdXNlZF9zdWJ0cmFjdF9ncmVlbiwgcmVzaWR1YWxzKTsKKyAgICAgIGZvciAocmVsYXRpdmVfeCA9IDA7IHJlbGF0aXZlX3ggPCBtYXhfeDsgKytyZWxhdGl2ZV94KSB7CisgICAgICAgIFVwZGF0ZUhpc3RvKGhpc3RvX2FyZ2IsIHJlc2lkdWFsc1tyZWxhdGl2ZV94XSk7CisgICAgICB9CisgICAgfQorICAgIGN1cl9kaWZmID0gUHJlZGljdGlvbkNvc3RTcGF0aWFsSGlzdG9ncmFtKAorICAgICAgICAoY29uc3QgaW50ICgqKVsyNTZdKWFjY3VtdWxhdGVkLCAoY29uc3QgaW50ICgqKVsyNTZdKWhpc3RvX2FyZ2IpOworICAgIC8vIEZhdm9yIGtlZXBpbmcgdGhlIGFyZWFzIGxvY2FsbHkgc2ltaWxhci4KKyAgICBpZiAobW9kZSA9PSBsZWZ0X21vZGUpIGN1cl9kaWZmIC09IGtTcGF0aWFsUHJlZGljdG9yQmlhczsKKyAgICBpZiAobW9kZSA9PSBhYm92ZV9tb2RlKSBjdXJfZGlmZiAtPSBrU3BhdGlhbFByZWRpY3RvckJpYXM7CisKKyAgICBpZiAoY3VyX2RpZmYgPCBiZXN0X2RpZmYpIHsKKyAgICAgIGludCAoKnRtcClbMjU2XSA9IGhpc3RvX2FyZ2I7CisgICAgICBoaXN0b19hcmdiID0gYmVzdF9oaXN0bzsKKyAgICAgIGJlc3RfaGlzdG8gPSB0bXA7CisgICAgICBiZXN0X2RpZmYgPSBjdXJfZGlmZjsKKyAgICAgIGJlc3RfbW9kZSA9IG1vZGU7CisgICAgfQorICB9CisKKyAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgIGZvciAoaiA9IDA7IGogPCAyNTY7IGorKykgeworICAgICAgYWNjdW11bGF0ZWRbaV1bal0gKz0gYmVzdF9oaXN0b1tpXVtqXTsKKyAgICB9CisgIH0KKworICByZXR1cm4gYmVzdF9tb2RlOworfQorCisvLyBDb252ZXJ0cyBwaXhlbHMgb2YgdGhlIGltYWdlIHRvIHJlc2lkdWFscyB3aXRoIHJlc3BlY3QgdG8gcHJlZGljdGlvbnMuCisvLyBJZiBtYXhfcXVhbnRpemF0aW9uID4gMSwgYXBwbGllcyBuZWFyIGxvc3NsZXNzIHByb2Nlc3NpbmcsIHF1YW50aXppbmcKKy8vIHJlc2lkdWFscyB0byBtdWx0aXBsZXMgb2YgcXVhbnRpemF0aW9uIGxldmVscyB1cCB0byBtYXhfcXVhbnRpemF0aW9uCisvLyAodGhlIGFjdHVhbCBxdWFudGl6YXRpb24gbGV2ZWwgZGVwZW5kcyBvbiBzbW9vdGhuZXNzIG5lYXIgdGhlIGdpdmVuIHBpeGVsKS4KK3N0YXRpYyB2b2lkIENvcHlJbWFnZVdpdGhQcmVkaWN0aW9uKGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRzLCB1aW50MzJfdCogY29uc3QgbW9kZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogY29uc3QgYXJnYl9zY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGNvbnN0IGFyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG93X2VmZm9ydCwgaW50IG1heF9xdWFudGl6YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXhhY3QsIGludCB1c2VkX3N1YnRyYWN0X2dyZWVuKSB7CisgIGNvbnN0IGludCB0aWxlc19wZXJfcm93ID0gVlA4TFN1YlNhbXBsZVNpemUod2lkdGgsIGJpdHMpOworICAvLyBUaGUgd2lkdGggb2YgdXBwZXJfcm93IGFuZCBjdXJyZW50X3JvdyBpcyBvbmUgcGl4ZWwgbGFyZ2VyIHRoYW4gaW1hZ2Ugd2lkdGgKKyAgLy8gdG8gYWxsb3cgdGhlIHRvcCByaWdodCBwaXhlbCB0byBwb2ludCB0byB0aGUgbGVmdG1vc3QgcGl4ZWwgb2YgdGhlIG5leHQgcm93CisgIC8vIHdoZW4gYXQgdGhlIHJpZ2h0IGVkZ2UuCisgIHVpbnQzMl90KiB1cHBlcl9yb3cgPSBhcmdiX3NjcmF0Y2g7CisgIHVpbnQzMl90KiBjdXJyZW50X3JvdyA9IHVwcGVyX3JvdyArIHdpZHRoICsgMTsKKyAgdWludDhfdCogY3VycmVudF9tYXhfZGlmZnMgPSAodWludDhfdCopKGN1cnJlbnRfcm93ICsgd2lkdGggKyAxKTsKKyNpZiAoV0VCUF9ORUFSX0xPU1NMRVNTID09IDEpCisgIHVpbnQ4X3QqIGxvd2VyX21heF9kaWZmcyA9IGN1cnJlbnRfbWF4X2RpZmZzICsgd2lkdGg7CisjZW5kaWYKKyAgaW50IHk7CisKKyAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CisgICAgaW50IHg7CisgICAgdWludDMyX3QqIGNvbnN0IHRtcDMyID0gdXBwZXJfcm93OworICAgIHVwcGVyX3JvdyA9IGN1cnJlbnRfcm93OworICAgIGN1cnJlbnRfcm93ID0gdG1wMzI7CisgICAgbWVtY3B5KGN1cnJlbnRfcm93LCBhcmdiICsgeSAqIHdpZHRoLAorICAgICAgICAgICBzaXplb2YoKmFyZ2IpICogKHdpZHRoICsgKHkgKyAxIDwgaGVpZ2h0KSkpOworCisgICAgaWYgKGxvd19lZmZvcnQpIHsKKyAgICAgIFByZWRpY3RCYXRjaChrUHJlZExvd0VmZm9ydCwgMCwgeSwgd2lkdGgsIGN1cnJlbnRfcm93LCB1cHBlcl9yb3csCisgICAgICAgICAgICAgICAgICAgYXJnYiArIHkgKiB3aWR0aCk7CisgICAgfSBlbHNlIHsKKyNpZiAoV0VCUF9ORUFSX0xPU1NMRVNTID09IDEpCisgICAgICBpZiAobWF4X3F1YW50aXphdGlvbiA+IDEpIHsKKyAgICAgICAgLy8gQ29tcHV0ZSBtYXhfZGlmZnMgZm9yIHRoZSBsb3dlciByb3cgbm93LCBiZWNhdXNlIHRoYXQgbmVlZHMgdGhlCisgICAgICAgIC8vIGNvbnRlbnRzIG9mIGFyZ2IgZm9yIHRoZSBjdXJyZW50IHJvdywgd2hpY2ggd2Ugd2lsbCBvdmVyd3JpdGUgd2l0aAorICAgICAgICAvLyByZXNpZHVhbHMgYmVmb3JlIHByb2NlZWRpbmcgd2l0aCB0aGUgbmV4dCByb3cuCisgICAgICAgIHVpbnQ4X3QqIGNvbnN0IHRtcDggPSBjdXJyZW50X21heF9kaWZmczsKKyAgICAgICAgY3VycmVudF9tYXhfZGlmZnMgPSBsb3dlcl9tYXhfZGlmZnM7CisgICAgICAgIGxvd2VyX21heF9kaWZmcyA9IHRtcDg7CisgICAgICAgIGlmICh5ICsgMiA8IGhlaWdodCkgeworICAgICAgICAgIE1heERpZmZzRm9yUm93KHdpZHRoLCB3aWR0aCwgYXJnYiArICh5ICsgMSkgKiB3aWR0aCwgbG93ZXJfbWF4X2RpZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWRfc3VidHJhY3RfZ3JlZW4pOworICAgICAgICB9CisgICAgICB9CisjZW5kaWYKKyAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDspIHsKKyAgICAgICAgY29uc3QgaW50IG1vZGUgPQorICAgICAgICAgICAgKG1vZGVzWyh5ID4+IGJpdHMpICogdGlsZXNfcGVyX3JvdyArICh4ID4+IGJpdHMpXSA+PiA4KSAmIDB4ZmY7CisgICAgICAgIGludCB4X2VuZCA9IHggKyAoMSA8PCBiaXRzKTsKKyAgICAgICAgaWYgKHhfZW5kID4gd2lkdGgpIHhfZW5kID0gd2lkdGg7CisgICAgICAgIEdldFJlc2lkdWFsKHdpZHRoLCBoZWlnaHQsIHVwcGVyX3JvdywgY3VycmVudF9yb3csIGN1cnJlbnRfbWF4X2RpZmZzLAorICAgICAgICAgICAgICAgICAgICBtb2RlLCB4LCB4X2VuZCwgeSwgbWF4X3F1YW50aXphdGlvbiwgZXhhY3QsCisgICAgICAgICAgICAgICAgICAgIHVzZWRfc3VidHJhY3RfZ3JlZW4sIGFyZ2IgKyB5ICogd2lkdGggKyB4KTsKKyAgICAgICAgeCA9IHhfZW5kOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisvLyBGaW5kcyB0aGUgYmVzdCBwcmVkaWN0b3IgZm9yIGVhY2ggdGlsZSwgYW5kIGNvbnZlcnRzIHRoZSBpbWFnZSB0byByZXNpZHVhbHMKKy8vIHdpdGggcmVzcGVjdCB0byBwcmVkaWN0aW9ucy4gSWYgbmVhcl9sb3NzbGVzc19xdWFsaXR5IDwgMTAwLCBhcHBsaWVzCisvLyBuZWFyIGxvc3NsZXNzIHByb2Nlc3NpbmcsIHNoYXZpbmcgb2ZmIG1vcmUgYml0cyBvZiByZXNpZHVhbHMgZm9yIGxvd2VyCisvLyBxdWFsaXRpZXMuCit2b2lkIFZQOExSZXNpZHVhbEltYWdlKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJpdHMsIGludCBsb3dfZWZmb3J0LAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogY29uc3QgYXJnYiwgdWludDMyX3QqIGNvbnN0IGFyZ2Jfc2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGNvbnN0IGltYWdlLCBpbnQgbmVhcl9sb3NzbGVzc19xdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXhhY3QsIGludCB1c2VkX3N1YnRyYWN0X2dyZWVuKSB7CisgIGNvbnN0IGludCB0aWxlc19wZXJfcm93ID0gVlA4TFN1YlNhbXBsZVNpemUod2lkdGgsIGJpdHMpOworICBjb25zdCBpbnQgdGlsZXNfcGVyX2NvbCA9IFZQOExTdWJTYW1wbGVTaXplKGhlaWdodCwgYml0cyk7CisgIGludCB0aWxlX3k7CisgIGludCBoaXN0b1s0XVsyNTZdOworICBjb25zdCBpbnQgbWF4X3F1YW50aXphdGlvbiA9IDEgPDwgVlA4TE5lYXJMb3NzbGVzc0JpdHMobmVhcl9sb3NzbGVzc19xdWFsaXR5KTsKKyAgaWYgKGxvd19lZmZvcnQpIHsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgdGlsZXNfcGVyX3JvdyAqIHRpbGVzX3Blcl9jb2w7ICsraSkgeworICAgICAgaW1hZ2VbaV0gPSBBUkdCX0JMQUNLIHwgKGtQcmVkTG93RWZmb3J0IDw8IDgpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBtZW1zZXQoaGlzdG8sIDAsIHNpemVvZihoaXN0bykpOworICAgIGZvciAodGlsZV95ID0gMDsgdGlsZV95IDwgdGlsZXNfcGVyX2NvbDsgKyt0aWxlX3kpIHsKKyAgICAgIGludCB0aWxlX3g7CisgICAgICBmb3IgKHRpbGVfeCA9IDA7IHRpbGVfeCA8IHRpbGVzX3Blcl9yb3c7ICsrdGlsZV94KSB7CisgICAgICAgIGNvbnN0IGludCBwcmVkID0gR2V0QmVzdFByZWRpY3RvckZvclRpbGUod2lkdGgsIGhlaWdodCwgdGlsZV94LCB0aWxlX3ksCisgICAgICAgICAgICBiaXRzLCBoaXN0bywgYXJnYl9zY3JhdGNoLCBhcmdiLCBtYXhfcXVhbnRpemF0aW9uLCBleGFjdCwKKyAgICAgICAgICAgIHVzZWRfc3VidHJhY3RfZ3JlZW4sIGltYWdlKTsKKyAgICAgICAgaW1hZ2VbdGlsZV95ICogdGlsZXNfcGVyX3JvdyArIHRpbGVfeF0gPSBBUkdCX0JMQUNLIHwgKHByZWQgPDwgOCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgQ29weUltYWdlV2l0aFByZWRpY3Rpb24od2lkdGgsIGhlaWdodCwgYml0cywgaW1hZ2UsIGFyZ2Jfc2NyYXRjaCwgYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbG93X2VmZm9ydCwgbWF4X3F1YW50aXphdGlvbiwgZXhhY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWRfc3VidHJhY3RfZ3JlZW4pOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29sb3IgdHJhbnNmb3JtIGZ1bmN0aW9ucy4KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgTXVsdGlwbGllcnNDbGVhcihWUDhMTXVsdGlwbGllcnMqIGNvbnN0IG0pIHsKKyAgbS0+Z3JlZW5fdG9fcmVkXyA9IDA7CisgIG0tPmdyZWVuX3RvX2JsdWVfID0gMDsKKyAgbS0+cmVkX3RvX2JsdWVfID0gMDsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgQ29sb3JDb2RlVG9NdWx0aXBsaWVycyh1aW50MzJfdCBjb2xvcl9jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMTXVsdGlwbGllcnMqIGNvbnN0IG0pIHsKKyAgbS0+Z3JlZW5fdG9fcmVkXyAgPSAoY29sb3JfY29kZSA+PiAgMCkgJiAweGZmOworICBtLT5ncmVlbl90b19ibHVlXyA9IChjb2xvcl9jb2RlID4+ICA4KSAmIDB4ZmY7CisgIG0tPnJlZF90b19ibHVlXyAgID0gKGNvbG9yX2NvZGUgPj4gMTYpICYgMHhmZjsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IE11bHRpcGxpZXJzVG9Db2xvckNvZGUoCisgICAgY29uc3QgVlA4TE11bHRpcGxpZXJzKiBjb25zdCBtKSB7CisgIHJldHVybiAweGZmMDAwMDAwdSB8CisgICAgICAgICAoKHVpbnQzMl90KShtLT5yZWRfdG9fYmx1ZV8pIDw8IDE2KSB8CisgICAgICAgICAoKHVpbnQzMl90KShtLT5ncmVlbl90b19ibHVlXykgPDwgOCkgfAorICAgICAgICAgbS0+Z3JlZW5fdG9fcmVkXzsKK30KKworc3RhdGljIGZsb2F0IFByZWRpY3Rpb25Db3N0Q3Jvc3NDb2xvcihjb25zdCBpbnQgYWNjdW11bGF0ZWRbMjU2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGNvdW50c1syNTZdKSB7CisgIC8vIEZhdm9yIGxvdyBlbnRyb3B5LCBsb2NhbGx5IGFuZCBnbG9iYWxseS4KKyAgLy8gRmF2b3Igc21hbGwgYWJzb2x1dGUgdmFsdWVzIGZvciBQcmVkaWN0aW9uQ29zdFNwYXRpYWwKKyAgc3RhdGljIGNvbnN0IGRvdWJsZSBrRXhwVmFsdWUgPSAyLjQ7CisgIHJldHVybiBWUDhMQ29tYmluZWRTaGFubm9uRW50cm9weShjb3VudHMsIGFjY3VtdWxhdGVkKSArCisgICAgICAgICBQcmVkaWN0aW9uQ29zdFNwYXRpYWwoY291bnRzLCAzLCBrRXhwVmFsdWUpOworfQorCitzdGF0aWMgZmxvYXQgR2V0UHJlZGljdGlvbkNvc3RDcm9zc0NvbG9yUmVkKAorICAgIGNvbnN0IHVpbnQzMl90KiBhcmdiLCBpbnQgc3RyaWRlLCBpbnQgdGlsZV93aWR0aCwgaW50IHRpbGVfaGVpZ2h0LAorICAgIFZQOExNdWx0aXBsaWVycyBwcmV2X3gsIFZQOExNdWx0aXBsaWVycyBwcmV2X3ksIGludCBncmVlbl90b19yZWQsCisgICAgY29uc3QgaW50IGFjY3VtdWxhdGVkX3JlZF9oaXN0b1syNTZdKSB7CisgIGludCBoaXN0b1syNTZdID0geyAwIH07CisgIGZsb2F0IGN1cl9kaWZmOworCisgIFZQOExDb2xsZWN0Q29sb3JSZWRUcmFuc2Zvcm1zKGFyZ2IsIHN0cmlkZSwgdGlsZV93aWR0aCwgdGlsZV9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZWVuX3RvX3JlZCwgaGlzdG8pOworCisgIGN1cl9kaWZmID0gUHJlZGljdGlvbkNvc3RDcm9zc0NvbG9yKGFjY3VtdWxhdGVkX3JlZF9oaXN0bywgaGlzdG8pOworICBpZiAoKHVpbnQ4X3QpZ3JlZW5fdG9fcmVkID09IHByZXZfeC5ncmVlbl90b19yZWRfKSB7CisgICAgY3VyX2RpZmYgLT0gMzsgIC8vIGZhdm9yIGtlZXBpbmcgdGhlIGFyZWFzIGxvY2FsbHkgc2ltaWxhcgorICB9CisgIGlmICgodWludDhfdClncmVlbl90b19yZWQgPT0gcHJldl95LmdyZWVuX3RvX3JlZF8pIHsKKyAgICBjdXJfZGlmZiAtPSAzOyAgLy8gZmF2b3Iga2VlcGluZyB0aGUgYXJlYXMgbG9jYWxseSBzaW1pbGFyCisgIH0KKyAgaWYgKGdyZWVuX3RvX3JlZCA9PSAwKSB7CisgICAgY3VyX2RpZmYgLT0gMzsKKyAgfQorICByZXR1cm4gY3VyX2RpZmY7Cit9CisKK3N0YXRpYyB2b2lkIEdldEJlc3RHcmVlblRvUmVkKAorICAgIGNvbnN0IHVpbnQzMl90KiBhcmdiLCBpbnQgc3RyaWRlLCBpbnQgdGlsZV93aWR0aCwgaW50IHRpbGVfaGVpZ2h0LAorICAgIFZQOExNdWx0aXBsaWVycyBwcmV2X3gsIFZQOExNdWx0aXBsaWVycyBwcmV2X3ksIGludCBxdWFsaXR5LAorICAgIGNvbnN0IGludCBhY2N1bXVsYXRlZF9yZWRfaGlzdG9bMjU2XSwgVlA4TE11bHRpcGxpZXJzKiBjb25zdCBiZXN0X3R4KSB7CisgIGNvbnN0IGludCBrTWF4SXRlcnMgPSA0ICsgKCg3ICogcXVhbGl0eSkgPj4gOCk7ICAvLyBpbiByYW5nZSBbNC4uNl0KKyAgaW50IGdyZWVuX3RvX3JlZF9iZXN0ID0gMDsKKyAgaW50IGl0ZXIsIG9mZnNldDsKKyAgZmxvYXQgYmVzdF9kaWZmID0gR2V0UHJlZGljdGlvbkNvc3RDcm9zc0NvbG9yUmVkKAorICAgICAgYXJnYiwgc3RyaWRlLCB0aWxlX3dpZHRoLCB0aWxlX2hlaWdodCwgcHJldl94LCBwcmV2X3ksCisgICAgICBncmVlbl90b19yZWRfYmVzdCwgYWNjdW11bGF0ZWRfcmVkX2hpc3RvKTsKKyAgZm9yIChpdGVyID0gMDsgaXRlciA8IGtNYXhJdGVyczsgKytpdGVyKSB7CisgICAgLy8gQ29sb3JUcmFuc2Zvcm1EZWx0YSBpcyBhIDMuNSBiaXQgZml4ZWQgcG9pbnQsIHNvIDMyIGlzIGVxdWFsIHRvCisgICAgLy8gb25lIGluIGNvbG9yIGNvbXB1dGF0aW9uLiBIYXZpbmcgaW5pdGlhbCBkZWx0YSBoZXJlIGFzIDEgaXMgc3VmZmljaWVudAorICAgIC8vIHRvIGV4cGxvcmUgdGhlIHJhbmdlIG9mICgtMiwgMikuCisgICAgY29uc3QgaW50IGRlbHRhID0gMzIgPj4gaXRlcjsKKyAgICAvLyBUcnkgYSBuZWdhdGl2ZSBhbmQgYSBwb3NpdGl2ZSBkZWx0YSBmcm9tIHRoZSBiZXN0IGtub3duIHZhbHVlLgorICAgIGZvciAob2Zmc2V0ID0gLWRlbHRhOyBvZmZzZXQgPD0gZGVsdGE7IG9mZnNldCArPSAyICogZGVsdGEpIHsKKyAgICAgIGNvbnN0IGludCBncmVlbl90b19yZWRfY3VyID0gb2Zmc2V0ICsgZ3JlZW5fdG9fcmVkX2Jlc3Q7CisgICAgICBjb25zdCBmbG9hdCBjdXJfZGlmZiA9IEdldFByZWRpY3Rpb25Db3N0Q3Jvc3NDb2xvclJlZCgKKyAgICAgICAgICBhcmdiLCBzdHJpZGUsIHRpbGVfd2lkdGgsIHRpbGVfaGVpZ2h0LCBwcmV2X3gsIHByZXZfeSwKKyAgICAgICAgICBncmVlbl90b19yZWRfY3VyLCBhY2N1bXVsYXRlZF9yZWRfaGlzdG8pOworICAgICAgaWYgKGN1cl9kaWZmIDwgYmVzdF9kaWZmKSB7CisgICAgICAgIGJlc3RfZGlmZiA9IGN1cl9kaWZmOworICAgICAgICBncmVlbl90b19yZWRfYmVzdCA9IGdyZWVuX3RvX3JlZF9jdXI7CisgICAgICB9CisgICAgfQorICB9CisgIGJlc3RfdHgtPmdyZWVuX3RvX3JlZF8gPSBncmVlbl90b19yZWRfYmVzdDsKK30KKworc3RhdGljIGZsb2F0IEdldFByZWRpY3Rpb25Db3N0Q3Jvc3NDb2xvckJsdWUoCisgICAgY29uc3QgdWludDMyX3QqIGFyZ2IsIGludCBzdHJpZGUsIGludCB0aWxlX3dpZHRoLCBpbnQgdGlsZV9oZWlnaHQsCisgICAgVlA4TE11bHRpcGxpZXJzIHByZXZfeCwgVlA4TE11bHRpcGxpZXJzIHByZXZfeSwKKyAgICBpbnQgZ3JlZW5fdG9fYmx1ZSwgaW50IHJlZF90b19ibHVlLCBjb25zdCBpbnQgYWNjdW11bGF0ZWRfYmx1ZV9oaXN0b1syNTZdKSB7CisgIGludCBoaXN0b1syNTZdID0geyAwIH07CisgIGZsb2F0IGN1cl9kaWZmOworCisgIFZQOExDb2xsZWN0Q29sb3JCbHVlVHJhbnNmb3JtcyhhcmdiLCBzdHJpZGUsIHRpbGVfd2lkdGgsIHRpbGVfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZW5fdG9fYmx1ZSwgcmVkX3RvX2JsdWUsIGhpc3RvKTsKKworICBjdXJfZGlmZiA9IFByZWRpY3Rpb25Db3N0Q3Jvc3NDb2xvcihhY2N1bXVsYXRlZF9ibHVlX2hpc3RvLCBoaXN0byk7CisgIGlmICgodWludDhfdClncmVlbl90b19ibHVlID09IHByZXZfeC5ncmVlbl90b19ibHVlXykgeworICAgIGN1cl9kaWZmIC09IDM7ICAvLyBmYXZvciBrZWVwaW5nIHRoZSBhcmVhcyBsb2NhbGx5IHNpbWlsYXIKKyAgfQorICBpZiAoKHVpbnQ4X3QpZ3JlZW5fdG9fYmx1ZSA9PSBwcmV2X3kuZ3JlZW5fdG9fYmx1ZV8pIHsKKyAgICBjdXJfZGlmZiAtPSAzOyAgLy8gZmF2b3Iga2VlcGluZyB0aGUgYXJlYXMgbG9jYWxseSBzaW1pbGFyCisgIH0KKyAgaWYgKCh1aW50OF90KXJlZF90b19ibHVlID09IHByZXZfeC5yZWRfdG9fYmx1ZV8pIHsKKyAgICBjdXJfZGlmZiAtPSAzOyAgLy8gZmF2b3Iga2VlcGluZyB0aGUgYXJlYXMgbG9jYWxseSBzaW1pbGFyCisgIH0KKyAgaWYgKCh1aW50OF90KXJlZF90b19ibHVlID09IHByZXZfeS5yZWRfdG9fYmx1ZV8pIHsKKyAgICBjdXJfZGlmZiAtPSAzOyAgLy8gZmF2b3Iga2VlcGluZyB0aGUgYXJlYXMgbG9jYWxseSBzaW1pbGFyCisgIH0KKyAgaWYgKGdyZWVuX3RvX2JsdWUgPT0gMCkgeworICAgIGN1cl9kaWZmIC09IDM7CisgIH0KKyAgaWYgKHJlZF90b19ibHVlID09IDApIHsKKyAgICBjdXJfZGlmZiAtPSAzOworICB9CisgIHJldHVybiBjdXJfZGlmZjsKK30KKworI2RlZmluZSBrR3JlZW5SZWRUb0JsdWVOdW1BeGlzIDgKKyNkZWZpbmUga0dyZWVuUmVkVG9CbHVlTWF4SXRlcnMgNworc3RhdGljIHZvaWQgR2V0QmVzdEdyZWVuUmVkVG9CbHVlKAorICAgIGNvbnN0IHVpbnQzMl90KiBhcmdiLCBpbnQgc3RyaWRlLCBpbnQgdGlsZV93aWR0aCwgaW50IHRpbGVfaGVpZ2h0LAorICAgIFZQOExNdWx0aXBsaWVycyBwcmV2X3gsIFZQOExNdWx0aXBsaWVycyBwcmV2X3ksIGludCBxdWFsaXR5LAorICAgIGNvbnN0IGludCBhY2N1bXVsYXRlZF9ibHVlX2hpc3RvWzI1Nl0sCisgICAgVlA4TE11bHRpcGxpZXJzKiBjb25zdCBiZXN0X3R4KSB7CisgIGNvbnN0IGludDhfdCBvZmZzZXRba0dyZWVuUmVkVG9CbHVlTnVtQXhpc11bMl0gPQorICAgICAge3swLCAtMX0sIHswLCAxfSwgey0xLCAwfSwgezEsIDB9LCB7LTEsIC0xfSwgey0xLCAxfSwgezEsIC0xfSwgezEsIDF9fTsKKyAgY29uc3QgaW50OF90IGRlbHRhX2x1dFtrR3JlZW5SZWRUb0JsdWVNYXhJdGVyc10gPSB7IDE2LCAxNiwgOCwgNCwgMiwgMiwgMiB9OworICBjb25zdCBpbnQgaXRlcnMgPQorICAgICAgKHF1YWxpdHkgPCAyNSkgPyAxIDogKHF1YWxpdHkgPiA1MCkgPyBrR3JlZW5SZWRUb0JsdWVNYXhJdGVycyA6IDQ7CisgIGludCBncmVlbl90b19ibHVlX2Jlc3QgPSAwOworICBpbnQgcmVkX3RvX2JsdWVfYmVzdCA9IDA7CisgIGludCBpdGVyOworICAvLyBJbml0aWFsIHZhbHVlIGF0IG9yaWdpbjoKKyAgZmxvYXQgYmVzdF9kaWZmID0gR2V0UHJlZGljdGlvbkNvc3RDcm9zc0NvbG9yQmx1ZSgKKyAgICAgIGFyZ2IsIHN0cmlkZSwgdGlsZV93aWR0aCwgdGlsZV9oZWlnaHQsIHByZXZfeCwgcHJldl95LAorICAgICAgZ3JlZW5fdG9fYmx1ZV9iZXN0LCByZWRfdG9fYmx1ZV9iZXN0LCBhY2N1bXVsYXRlZF9ibHVlX2hpc3RvKTsKKyAgZm9yIChpdGVyID0gMDsgaXRlciA8IGl0ZXJzOyArK2l0ZXIpIHsKKyAgICBjb25zdCBpbnQgZGVsdGEgPSBkZWx0YV9sdXRbaXRlcl07CisgICAgaW50IGF4aXM7CisgICAgZm9yIChheGlzID0gMDsgYXhpcyA8IGtHcmVlblJlZFRvQmx1ZU51bUF4aXM7ICsrYXhpcykgeworICAgICAgY29uc3QgaW50IGdyZWVuX3RvX2JsdWVfY3VyID0KKyAgICAgICAgICBvZmZzZXRbYXhpc11bMF0gKiBkZWx0YSArIGdyZWVuX3RvX2JsdWVfYmVzdDsKKyAgICAgIGNvbnN0IGludCByZWRfdG9fYmx1ZV9jdXIgPSBvZmZzZXRbYXhpc11bMV0gKiBkZWx0YSArIHJlZF90b19ibHVlX2Jlc3Q7CisgICAgICBjb25zdCBmbG9hdCBjdXJfZGlmZiA9IEdldFByZWRpY3Rpb25Db3N0Q3Jvc3NDb2xvckJsdWUoCisgICAgICAgICAgYXJnYiwgc3RyaWRlLCB0aWxlX3dpZHRoLCB0aWxlX2hlaWdodCwgcHJldl94LCBwcmV2X3ksCisgICAgICAgICAgZ3JlZW5fdG9fYmx1ZV9jdXIsIHJlZF90b19ibHVlX2N1ciwgYWNjdW11bGF0ZWRfYmx1ZV9oaXN0byk7CisgICAgICBpZiAoY3VyX2RpZmYgPCBiZXN0X2RpZmYpIHsKKyAgICAgICAgYmVzdF9kaWZmID0gY3VyX2RpZmY7CisgICAgICAgIGdyZWVuX3RvX2JsdWVfYmVzdCA9IGdyZWVuX3RvX2JsdWVfY3VyOworICAgICAgICByZWRfdG9fYmx1ZV9iZXN0ID0gcmVkX3RvX2JsdWVfY3VyOworICAgICAgfQorICAgICAgaWYgKHF1YWxpdHkgPCAyNSAmJiBpdGVyID09IDQpIHsKKyAgICAgICAgLy8gT25seSBheGlzIGFsaWduZWQgZGlmZnMgZm9yIGxvd2VyIHF1YWxpdHkuCisgICAgICAgIGJyZWFrOyAgLy8gbmV4dCBpdGVyLgorICAgICAgfQorICAgIH0KKyAgICBpZiAoZGVsdGEgPT0gMiAmJiBncmVlbl90b19ibHVlX2Jlc3QgPT0gMCAmJiByZWRfdG9fYmx1ZV9iZXN0ID09IDApIHsKKyAgICAgIC8vIEZ1cnRoZXIgaXRlcmF0aW9ucyB3b3VsZCBub3QgaGVscC4KKyAgICAgIGJyZWFrOyAgLy8gb3V0IG9mIGl0ZXItbG9vcC4KKyAgICB9CisgIH0KKyAgYmVzdF90eC0+Z3JlZW5fdG9fYmx1ZV8gPSBncmVlbl90b19ibHVlX2Jlc3Q7CisgIGJlc3RfdHgtPnJlZF90b19ibHVlXyA9IHJlZF90b19ibHVlX2Jlc3Q7Cit9CisjdW5kZWYga0dyZWVuUmVkVG9CbHVlTWF4SXRlcnMKKyN1bmRlZiBrR3JlZW5SZWRUb0JsdWVOdW1BeGlzCisKK3N0YXRpYyBWUDhMTXVsdGlwbGllcnMgR2V0QmVzdENvbG9yVHJhbnNmb3JtRm9yVGlsZSgKKyAgICBpbnQgdGlsZV94LCBpbnQgdGlsZV95LCBpbnQgYml0cywKKyAgICBWUDhMTXVsdGlwbGllcnMgcHJldl94LAorICAgIFZQOExNdWx0aXBsaWVycyBwcmV2X3ksCisgICAgaW50IHF1YWxpdHksIGludCB4c2l6ZSwgaW50IHlzaXplLAorICAgIGNvbnN0IGludCBhY2N1bXVsYXRlZF9yZWRfaGlzdG9bMjU2XSwKKyAgICBjb25zdCBpbnQgYWNjdW11bGF0ZWRfYmx1ZV9oaXN0b1syNTZdLAorICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiKSB7CisgIGNvbnN0IGludCBtYXhfdGlsZV9zaXplID0gMSA8PCBiaXRzOworICBjb25zdCBpbnQgdGlsZV95X29mZnNldCA9IHRpbGVfeSAqIG1heF90aWxlX3NpemU7CisgIGNvbnN0IGludCB0aWxlX3hfb2Zmc2V0ID0gdGlsZV94ICogbWF4X3RpbGVfc2l6ZTsKKyAgY29uc3QgaW50IGFsbF94X21heCA9IEdldE1pbih0aWxlX3hfb2Zmc2V0ICsgbWF4X3RpbGVfc2l6ZSwgeHNpemUpOworICBjb25zdCBpbnQgYWxsX3lfbWF4ID0gR2V0TWluKHRpbGVfeV9vZmZzZXQgKyBtYXhfdGlsZV9zaXplLCB5c2l6ZSk7CisgIGNvbnN0IGludCB0aWxlX3dpZHRoID0gYWxsX3hfbWF4IC0gdGlsZV94X29mZnNldDsKKyAgY29uc3QgaW50IHRpbGVfaGVpZ2h0ID0gYWxsX3lfbWF4IC0gdGlsZV95X29mZnNldDsKKyAgY29uc3QgdWludDMyX3QqIGNvbnN0IHRpbGVfYXJnYiA9IGFyZ2IgKyB0aWxlX3lfb2Zmc2V0ICogeHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRpbGVfeF9vZmZzZXQ7CisgIFZQOExNdWx0aXBsaWVycyBiZXN0X3R4OworICBNdWx0aXBsaWVyc0NsZWFyKCZiZXN0X3R4KTsKKworICBHZXRCZXN0R3JlZW5Ub1JlZCh0aWxlX2FyZ2IsIHhzaXplLCB0aWxlX3dpZHRoLCB0aWxlX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgcHJldl94LCBwcmV2X3ksIHF1YWxpdHksIGFjY3VtdWxhdGVkX3JlZF9oaXN0bywgJmJlc3RfdHgpOworICBHZXRCZXN0R3JlZW5SZWRUb0JsdWUodGlsZV9hcmdiLCB4c2l6ZSwgdGlsZV93aWR0aCwgdGlsZV9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X3gsIHByZXZfeSwgcXVhbGl0eSwgYWNjdW11bGF0ZWRfYmx1ZV9oaXN0bywKKyAgICAgICAgICAgICAgICAgICAgICAgICZiZXN0X3R4KTsKKyAgcmV0dXJuIGJlc3RfdHg7Cit9CisKK3N0YXRpYyB2b2lkIENvcHlUaWxlV2l0aENvbG9yVHJhbnNmb3JtKGludCB4c2l6ZSwgaW50IHlzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbGVfeCwgaW50IHRpbGVfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhfdGlsZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TE11bHRpcGxpZXJzIGNvbG9yX3RyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBhcmdiKSB7CisgIGNvbnN0IGludCB4c2NhbiA9IEdldE1pbihtYXhfdGlsZV9zaXplLCB4c2l6ZSAtIHRpbGVfeCk7CisgIGludCB5c2NhbiA9IEdldE1pbihtYXhfdGlsZV9zaXplLCB5c2l6ZSAtIHRpbGVfeSk7CisgIGFyZ2IgKz0gdGlsZV95ICogeHNpemUgKyB0aWxlX3g7CisgIHdoaWxlICh5c2Nhbi0tID4gMCkgeworICAgIFZQOExUcmFuc2Zvcm1Db2xvcigmY29sb3JfdHJhbnNmb3JtLCBhcmdiLCB4c2Nhbik7CisgICAgYXJnYiArPSB4c2l6ZTsKKyAgfQorfQorCit2b2lkIFZQOExDb2xvclNwYWNlVHJhbnNmb3JtKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJpdHMsIGludCBxdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogY29uc3QgYXJnYiwgdWludDMyX3QqIGltYWdlKSB7CisgIGNvbnN0IGludCBtYXhfdGlsZV9zaXplID0gMSA8PCBiaXRzOworICBjb25zdCBpbnQgdGlsZV94c2l6ZSA9IFZQOExTdWJTYW1wbGVTaXplKHdpZHRoLCBiaXRzKTsKKyAgY29uc3QgaW50IHRpbGVfeXNpemUgPSBWUDhMU3ViU2FtcGxlU2l6ZShoZWlnaHQsIGJpdHMpOworICBpbnQgYWNjdW11bGF0ZWRfcmVkX2hpc3RvWzI1Nl0gPSB7IDAgfTsKKyAgaW50IGFjY3VtdWxhdGVkX2JsdWVfaGlzdG9bMjU2XSA9IHsgMCB9OworICBpbnQgdGlsZV94LCB0aWxlX3k7CisgIFZQOExNdWx0aXBsaWVycyBwcmV2X3gsIHByZXZfeTsKKyAgTXVsdGlwbGllcnNDbGVhcigmcHJldl95KTsKKyAgTXVsdGlwbGllcnNDbGVhcigmcHJldl94KTsKKyAgZm9yICh0aWxlX3kgPSAwOyB0aWxlX3kgPCB0aWxlX3lzaXplOyArK3RpbGVfeSkgeworICAgIGZvciAodGlsZV94ID0gMDsgdGlsZV94IDwgdGlsZV94c2l6ZTsgKyt0aWxlX3gpIHsKKyAgICAgIGludCB5OworICAgICAgY29uc3QgaW50IHRpbGVfeF9vZmZzZXQgPSB0aWxlX3ggKiBtYXhfdGlsZV9zaXplOworICAgICAgY29uc3QgaW50IHRpbGVfeV9vZmZzZXQgPSB0aWxlX3kgKiBtYXhfdGlsZV9zaXplOworICAgICAgY29uc3QgaW50IGFsbF94X21heCA9IEdldE1pbih0aWxlX3hfb2Zmc2V0ICsgbWF4X3RpbGVfc2l6ZSwgd2lkdGgpOworICAgICAgY29uc3QgaW50IGFsbF95X21heCA9IEdldE1pbih0aWxlX3lfb2Zmc2V0ICsgbWF4X3RpbGVfc2l6ZSwgaGVpZ2h0KTsKKyAgICAgIGNvbnN0IGludCBvZmZzZXQgPSB0aWxlX3kgKiB0aWxlX3hzaXplICsgdGlsZV94OworICAgICAgaWYgKHRpbGVfeSAhPSAwKSB7CisgICAgICAgIENvbG9yQ29kZVRvTXVsdGlwbGllcnMoaW1hZ2Vbb2Zmc2V0IC0gdGlsZV94c2l6ZV0sICZwcmV2X3kpOworICAgICAgfQorICAgICAgcHJldl94ID0gR2V0QmVzdENvbG9yVHJhbnNmb3JtRm9yVGlsZSh0aWxlX3gsIHRpbGVfeSwgYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldl94LCBwcmV2X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHksIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkX3JlZF9oaXN0bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjdW11bGF0ZWRfYmx1ZV9oaXN0bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnYik7CisgICAgICBpbWFnZVtvZmZzZXRdID0gTXVsdGlwbGllcnNUb0NvbG9yQ29kZSgmcHJldl94KTsKKyAgICAgIENvcHlUaWxlV2l0aENvbG9yVHJhbnNmb3JtKHdpZHRoLCBoZWlnaHQsIHRpbGVfeF9vZmZzZXQsIHRpbGVfeV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfdGlsZV9zaXplLCBwcmV2X3gsIGFyZ2IpOworCisgICAgICAvLyBHYXRoZXIgYWNjdW11bGF0ZWQgaGlzdG9ncmFtIGRhdGEuCisgICAgICBmb3IgKHkgPSB0aWxlX3lfb2Zmc2V0OyB5IDwgYWxsX3lfbWF4OyArK3kpIHsKKyAgICAgICAgaW50IGl4ID0geSAqIHdpZHRoICsgdGlsZV94X29mZnNldDsKKyAgICAgICAgY29uc3QgaW50IGl4X2VuZCA9IGl4ICsgYWxsX3hfbWF4IC0gdGlsZV94X29mZnNldDsKKyAgICAgICAgZm9yICg7IGl4IDwgaXhfZW5kOyArK2l4KSB7CisgICAgICAgICAgY29uc3QgdWludDMyX3QgcGl4ID0gYXJnYltpeF07CisgICAgICAgICAgaWYgKGl4ID49IDIgJiYKKyAgICAgICAgICAgICAgcGl4ID09IGFyZ2JbaXggLSAyXSAmJgorICAgICAgICAgICAgICBwaXggPT0gYXJnYltpeCAtIDFdKSB7CisgICAgICAgICAgICBjb250aW51ZTsgIC8vIHJlcGVhdGVkIHBpeGVscyBhcmUgaGFuZGxlZCBieSBiYWNrd2FyZCByZWZlcmVuY2VzCisgICAgICAgICAgfQorICAgICAgICAgIGlmIChpeCA+PSB3aWR0aCArIDIgJiYKKyAgICAgICAgICAgICAgYXJnYltpeCAtIDJdID09IGFyZ2JbaXggLSB3aWR0aCAtIDJdICYmCisgICAgICAgICAgICAgIGFyZ2JbaXggLSAxXSA9PSBhcmdiW2l4IC0gd2lkdGggLSAxXSAmJgorICAgICAgICAgICAgICBwaXggPT0gYXJnYltpeCAtIHdpZHRoXSkgeworICAgICAgICAgICAgY29udGludWU7ICAvLyByZXBlYXRlZCBwaXhlbHMgYXJlIGhhbmRsZWQgYnkgYmFja3dhcmQgcmVmZXJlbmNlcworICAgICAgICAgIH0KKyAgICAgICAgICArK2FjY3VtdWxhdGVkX3JlZF9oaXN0b1socGl4ID4+IDE2KSAmIDB4ZmZdOworICAgICAgICAgICsrYWNjdW11bGF0ZWRfYmx1ZV9oaXN0b1socGl4ID4+IDApICYgMHhmZl07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvcXVhbnRfZW5jLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL3F1YW50X2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMWZkNGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL3F1YW50X2VuYy5jCkBAIC0wLDAgKzEsMTM3NyBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgUXVhbnRpemF0aW9uCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL2Fzc2VydF9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vbWF0aF9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RkbGliX3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdfcG9lbS5oIgorI2Vsc2UKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+ICAvLyBmb3IgYWJzKCkKKyNlbmRpZgorCisjaW5jbHVkZSAic3JjL2VuYy92cDhpX2VuYy5oIgorI2luY2x1ZGUgInNyYy9lbmMvY29zdF9lbmMuaCIKKworI2RlZmluZSBET19UUkVMTElTX0k0ICAxCisjZGVmaW5lIERPX1RSRUxMSVNfSTE2IDEgICAvLyBub3QgYSBodWdlIGdhaW4sIGJ1dCBvayBhdCBsb3cgYml0cmF0ZS4KKyNkZWZpbmUgRE9fVFJFTExJU19VViAgMCAgIC8vIGRpc2FibGUgdHJlbGxpcyBmb3IgVVYuIFJpc2t5LiBOb3Qgd29ydGguCisjZGVmaW5lIFVTRV9URElTVE8gMQorCisjZGVmaW5lIE1JRF9BTFBIQSA2NCAgICAgIC8vIG5ldXRyYWwgdmFsdWUgZm9yIHN1c2NlcHRpYmlsaXR5CisjZGVmaW5lIE1JTl9BTFBIQSAzMCAgICAgIC8vIGxvd2VzdCB1c2FibGUgdmFsdWUgZm9yIHN1c2NlcHRpYmlsaXR5CisjZGVmaW5lIE1BWF9BTFBIQSAxMDAgICAgIC8vIGhpZ2hlciBtZWFuaW5nZnVsIHZhbHVlIGZvciBzdXNjZXB0aWJpbGl0eQorCisjZGVmaW5lIFNOU19UT19EUSAwLjkgICAgIC8vIFNjYWxpbmcgY29uc3RhbnQgYmV0d2VlbiB0aGUgc25zIHZhbHVlIGFuZCB0aGUgUVAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG93ZXItbGF3IG1vZHVsYXRpb24uIE11c3QgYmUgc3RyaWN0bHkgbGVzcyB0aGFuIDEuCisKKy8vIG51bWJlciBvZiBub24temVybyBjb2VmZnMgYmVsb3cgd2hpY2ggd2UgY29uc2lkZXIgdGhlIGJsb2NrIHZlcnkgZmxhdAorLy8gKGFuZCBhcHBseSBhIHBlbmFsdHkgdG8gY29tcGxleCBwcmVkaWN0aW9ucykKKyNkZWZpbmUgRkxBVE5FU1NfTElNSVRfSTE2IDEwICAgICAgLy8gSTE2IG1vZGUKKyNkZWZpbmUgRkxBVE5FU1NfTElNSVRfSTQgIDMgICAgICAgLy8gSTQgbW9kZQorI2RlZmluZSBGTEFUTkVTU19MSU1JVF9VViAgMiAgICAgICAvLyBVViBtb2RlCisjZGVmaW5lIEZMQVRORVNTX1BFTkFMVFkgICAxNDAgICAgIC8vIHJvdWdobHkgfjFiaXQgcGVyIGJsb2NrCisKKyNkZWZpbmUgTVVMVF84QihhLCBiKSAoKChhKSAqIChiKSArIDEyOCkgPj4gOCkKKworI2RlZmluZSBSRF9ESVNUT19NVUxUICAgICAgMjU2ICAvLyBkaXN0b3J0aW9uIG11bHRpcGxpZXIgKGVxdWl2YWxlbnQgb2YgbGFtYmRhKQorCisvLyAjZGVmaW5lIERFQlVHX0JMT0NLCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiBkZWZpbmVkKERFQlVHX0JMT0NLKQorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworc3RhdGljIHZvaWQgUHJpbnRCbG9ja0luZm8oY29uc3QgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TW9kZVNjb3JlKiBjb25zdCByZCkgeworICBpbnQgaSwgajsKKyAgY29uc3QgaW50IGlzX2kxNiA9IChpdC0+bWJfLT50eXBlXyA9PSAxKTsKKyAgY29uc3QgdWludDhfdCogY29uc3QgeV9pbiA9IGl0LT55dXZfaW5fICsgWV9PRkZfRU5DOworICBjb25zdCB1aW50OF90KiBjb25zdCB5X291dCA9IGl0LT55dXZfb3V0XyArIFlfT0ZGX0VOQzsKKyAgY29uc3QgdWludDhfdCogY29uc3QgdXZfaW4gPSBpdC0+eXV2X2luXyArIFVfT0ZGX0VOQzsKKyAgY29uc3QgdWludDhfdCogY29uc3QgdXZfb3V0ID0gaXQtPnl1dl9vdXRfICsgVV9PRkZfRU5DOworICBwcmludGYoIlNPVVJDRSAvIE9VVFBVVCAvIEFCUyBERUxUQVxuIik7CisgIGZvciAoaiA9IDA7IGogPCAxNjsgKytqKSB7CisgICAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIHByaW50ZigiJTNkICIsIHlfaW5baSArIGogKiBCUFNdKTsKKyAgICBwcmludGYoIiAgICAgIik7CisgICAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIHByaW50ZigiJTNkICIsIHlfb3V0W2kgKyBqICogQlBTXSk7CisgICAgcHJpbnRmKCIgICAgICIpOworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSB7CisgICAgICBwcmludGYoIiUxZCAiLCBhYnMoeV9pbltpICsgaiAqIEJQU10gLSB5X291dFtpICsgaiAqIEJQU10pKTsKKyAgICB9CisgICAgcHJpbnRmKCJcbiIpOworICB9CisgIHByaW50ZigiXG4iKTsgICAvLyBuZXdsaW5lIGJlZm9yZSB0aGUgVS9WIGJsb2NrCisgIGZvciAoaiA9IDA7IGogPCA4OyArK2opIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgKytpKSBwcmludGYoIiUzZCAiLCB1dl9pbltpICsgaiAqIEJQU10pOworICAgIHByaW50ZigiICIpOworICAgIGZvciAoaSA9IDg7IGkgPCAxNjsgKytpKSBwcmludGYoIiUzZCAiLCB1dl9pbltpICsgaiAqIEJQU10pOworICAgIHByaW50ZigiICAgICIpOworICAgIGZvciAoaSA9IDA7IGkgPCA4OyArK2kpIHByaW50ZigiJTNkICIsIHV2X291dFtpICsgaiAqIEJQU10pOworICAgIHByaW50ZigiICIpOworICAgIGZvciAoaSA9IDg7IGkgPCAxNjsgKytpKSBwcmludGYoIiUzZCAiLCB1dl9vdXRbaSArIGogKiBCUFNdKTsKKyAgICBwcmludGYoIiAgICIpOworICAgIGZvciAoaSA9IDA7IGkgPCA4OyArK2kpIHsKKyAgICAgIHByaW50ZigiJTFkICIsIGFicyh1dl9vdXRbaSArIGogKiBCUFNdIC0gdXZfaW5baSArIGogKiBCUFNdKSk7CisgICAgfQorICAgIHByaW50ZigiICIpOworICAgIGZvciAoaSA9IDg7IGkgPCAxNjsgKytpKSB7CisgICAgICBwcmludGYoIiUxZCAiLCBhYnModXZfb3V0W2kgKyBqICogQlBTXSAtIHV2X2luW2kgKyBqICogQlBTXSkpOworICAgIH0KKyAgICBwcmludGYoIlxuIik7CisgIH0KKyAgcHJpbnRmKCJcbkQ6JWQgU0Q6JWQgUjolZCBIOiVkIG56OjB4JXggc2NvcmU6JWRcbiIsCisgICAgKGludClyZC0+RCwgKGludClyZC0+U0QsIChpbnQpcmQtPlIsIChpbnQpcmQtPkgsIChpbnQpcmQtPm56LAorICAgIChpbnQpcmQtPnNjb3JlKTsKKyAgaWYgKGlzX2kxNikgeworICAgIHByaW50ZigiTW9kZTogJWRcbiIsIHJkLT5tb2RlX2kxNik7CisgICAgcHJpbnRmKCJ5X2RjX2xldmVsczoiKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgcHJpbnRmKCIlM2QgIiwgcmQtPnlfZGNfbGV2ZWxzW2ldKTsKKyAgICBwcmludGYoIlxuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJNb2Rlc1sxNl06ICIpOworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSBwcmludGYoIiVkICIsIHJkLT5tb2Rlc19pNFtpXSk7CisgICAgcHJpbnRmKCJcbiIpOworICB9CisgIHByaW50ZigieV9hY19sZXZlbHM6XG4iKTsKKyAgZm9yIChqID0gMDsgaiA8IDE2OyArK2opIHsKKyAgICBmb3IgKGkgPSBpc19pMTYgPyAxIDogMDsgaSA8IDE2OyArK2kpIHsKKyAgICAgIHByaW50ZigiJTRkICIsIHJkLT55X2FjX2xldmVsc1tqXVtpXSk7CisgICAgfQorICAgIHByaW50ZigiXG4iKTsKKyAgfQorICBwcmludGYoIlxuIik7CisgIHByaW50ZigidXZfbGV2ZWxzIChtb2RlPSVkKTpcbiIsIHJkLT5tb2RlX3V2KTsKKyAgZm9yIChqID0gMDsgaiA8IDg7ICsraikgeworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSB7CisgICAgICBwcmludGYoIiU0ZCAiLCByZC0+dXZfbGV2ZWxzW2pdW2ldKTsKKyAgICB9CisgICAgcHJpbnRmKCJcbiIpOworICB9Cit9CisKKyNlbmRpZiAgIC8vIERFQlVHX0JMT0NLCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgY2xpcChpbnQgdiwgaW50IG0sIGludCBNKSB7CisgIHJldHVybiB2IDwgbSA/IG0gOiB2ID4gTSA/IE0gOiB2OworfQorCitzdGF0aWMgY29uc3QgdWludDhfdCBrWmlnemFnWzE2XSA9IHsKKyAgMCwgMSwgNCwgOCwgNSwgMiwgMywgNiwgOSwgMTIsIDEzLCAxMCwgNywgMTEsIDE0LCAxNQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0RjVGFibGVbMTI4XSA9IHsKKyAgNCwgICAgIDUsICAgNiwgICA3LCAgIDgsICAgOSwgIDEwLCAgMTAsCisgIDExLCAgIDEyLCAgMTMsICAxNCwgIDE1LCAgMTYsICAxNywgIDE3LAorICAxOCwgICAxOSwgIDIwLCAgMjAsICAyMSwgIDIxLCAgMjIsICAyMiwKKyAgMjMsICAgMjMsICAyNCwgIDI1LCAgMjUsICAyNiwgIDI3LCAgMjgsCisgIDI5LCAgIDMwLCAgMzEsICAzMiwgIDMzLCAgMzQsICAzNSwgIDM2LAorICAzNywgICAzNywgIDM4LCAgMzksICA0MCwgIDQxLCAgNDIsICA0MywKKyAgNDQsICAgNDUsICA0NiwgIDQ2LCAgNDcsICA0OCwgIDQ5LCAgNTAsCisgIDUxLCAgIDUyLCAgNTMsICA1NCwgIDU1LCAgNTYsICA1NywgIDU4LAorICA1OSwgICA2MCwgIDYxLCAgNjIsICA2MywgIDY0LCAgNjUsICA2NiwKKyAgNjcsICAgNjgsICA2OSwgIDcwLCAgNzEsICA3MiwgIDczLCAgNzQsCisgIDc1LCAgIDc2LCAgNzYsICA3NywgIDc4LCAgNzksICA4MCwgIDgxLAorICA4MiwgICA4MywgIDg0LCAgODUsICA4NiwgIDg3LCAgODgsICA4OSwKKyAgOTEsICAgOTMsICA5NSwgIDk2LCAgOTgsIDEwMCwgMTAxLCAxMDIsCisgIDEwNCwgMTA2LCAxMDgsIDExMCwgMTEyLCAxMTQsIDExNiwgMTE4LAorICAxMjIsIDEyNCwgMTI2LCAxMjgsIDEzMCwgMTMyLCAxMzQsIDEzNiwKKyAgMTM4LCAxNDAsIDE0MywgMTQ1LCAxNDgsIDE1MSwgMTU0LCAxNTcKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBrQWNUYWJsZVsxMjhdID0geworICA0LCAgICAgNSwgICA2LCAgIDcsICAgOCwgICA5LCAgMTAsICAxMSwKKyAgMTIsICAgMTMsICAxNCwgIDE1LCAgMTYsICAxNywgIDE4LCAgMTksCisgIDIwLCAgIDIxLCAgMjIsICAyMywgIDI0LCAgMjUsICAyNiwgIDI3LAorICAyOCwgICAyOSwgIDMwLCAgMzEsICAzMiwgIDMzLCAgMzQsICAzNSwKKyAgMzYsICAgMzcsICAzOCwgIDM5LCAgNDAsICA0MSwgIDQyLCAgNDMsCisgIDQ0LCAgIDQ1LCAgNDYsICA0NywgIDQ4LCAgNDksICA1MCwgIDUxLAorICA1MiwgICA1MywgIDU0LCAgNTUsICA1NiwgIDU3LCAgNTgsICA2MCwKKyAgNjIsICAgNjQsICA2NiwgIDY4LCAgNzAsICA3MiwgIDc0LCAgNzYsCisgIDc4LCAgIDgwLCAgODIsICA4NCwgIDg2LCAgODgsICA5MCwgIDkyLAorICA5NCwgICA5NiwgIDk4LCAxMDAsIDEwMiwgMTA0LCAxMDYsIDEwOCwKKyAgMTEwLCAxMTIsIDExNCwgMTE2LCAxMTksIDEyMiwgMTI1LCAxMjgsCisgIDEzMSwgMTM0LCAxMzcsIDE0MCwgMTQzLCAxNDYsIDE0OSwgMTUyLAorICAxNTUsIDE1OCwgMTYxLCAxNjQsIDE2NywgMTcwLCAxNzMsIDE3NywKKyAgMTgxLCAxODUsIDE4OSwgMTkzLCAxOTcsIDIwMSwgMjA1LCAyMDksCisgIDIxMywgMjE3LCAyMjEsIDIyNSwgMjI5LCAyMzQsIDIzOSwgMjQ1LAorICAyNDksIDI1NCwgMjU5LCAyNjQsIDI2OSwgMjc0LCAyNzksIDI4NAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGtBY1RhYmxlMlsxMjhdID0geworICA4LCAgICAgOCwgICA5LCAgMTAsICAxMiwgIDEzLCAgMTUsICAxNywKKyAgMTgsICAgMjAsICAyMSwgIDIzLCAgMjQsICAyNiwgIDI3LCAgMjksCisgIDMxLCAgIDMyLCAgMzQsICAzNSwgIDM3LCAgMzgsICA0MCwgIDQxLAorICA0MywgICA0NCwgIDQ2LCAgNDgsICA0OSwgIDUxLCAgNTIsICA1NCwKKyAgNTUsICAgNTcsICA1OCwgIDYwLCAgNjIsICA2MywgIDY1LCAgNjYsCisgIDY4LCAgIDY5LCAgNzEsICA3MiwgIDc0LCAgNzUsICA3NywgIDc5LAorICA4MCwgICA4MiwgIDgzLCAgODUsICA4NiwgIDg4LCAgODksICA5MywKKyAgOTYsICAgOTksIDEwMiwgMTA1LCAxMDgsIDExMSwgMTE0LCAxMTcsCisgIDEyMCwgMTI0LCAxMjcsIDEzMCwgMTMzLCAxMzYsIDEzOSwgMTQyLAorICAxNDUsIDE0OCwgMTUxLCAxNTUsIDE1OCwgMTYxLCAxNjQsIDE2NywKKyAgMTcwLCAxNzMsIDE3NiwgMTc5LCAxODQsIDE4OSwgMTkzLCAxOTgsCisgIDIwMywgMjA3LCAyMTIsIDIxNywgMjIxLCAyMjYsIDIzMCwgMjM1LAorICAyNDAsIDI0NCwgMjQ5LCAyNTQsIDI1OCwgMjYzLCAyNjgsIDI3NCwKKyAgMjgwLCAyODYsIDI5MiwgMjk5LCAzMDUsIDMxMSwgMzE3LCAzMjMsCisgIDMzMCwgMzM2LCAzNDIsIDM0OCwgMzU0LCAzNjIsIDM3MCwgMzc5LAorICAzODUsIDM5MywgNDAxLCA0MDksIDQxNiwgNDI0LCA0MzIsIDQ0MAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0JpYXNNYXRyaWNlc1szXVsyXSA9IHsgIC8vIFtsdW1hLWFjLGx1bWEtZGMsY2hyb21hXVtkYyxhY10KKyAgeyA5NiwgMTEwIH0sIHsgOTYsIDEwOCB9LCB7IDExMCwgMTE1IH0KK307CisKKy8vIFNoYXJwZW5pbmcgYnkgKHNsaWdodGx5KSByYWlzaW5nIHRoZSBoaS1mcmVxdWVuY3kgY29lZmZzLgorLy8gSGFjay1pc2ggYnV0IGhlbHBmdWwgZm9yIG1pZC1iaXRyYXRlIHJhbmdlLiBVc2Ugd2l0aCBjYXJlLgorI2RlZmluZSBTSEFSUEVOX0JJVFMgMTEgIC8vIG51bWJlciBvZiBkZXNjYWxpbmcgYml0cyBmb3Igc2hhcnBlbmluZyBiaWFzCitzdGF0aWMgY29uc3QgdWludDhfdCBrRnJlcVNoYXJwZW5pbmdbMTZdID0geworICAwLCAgMzAsIDYwLCA5MCwKKyAgMzAsIDYwLCA5MCwgOTAsCisgIDYwLCA5MCwgOTAsIDkwLAorICA5MCwgOTAsIDkwLCA5MAorfTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEluaXRpYWxpemUgcXVhbnRpemF0aW9uIHBhcmFtZXRlcnMgaW4gVlA4TWF0cml4CisKKy8vIFJldHVybnMgdGhlIGF2ZXJhZ2UgcXVhbnRpemVyCitzdGF0aWMgaW50IEV4cGFuZE1hdHJpeChWUDhNYXRyaXgqIGNvbnN0IG0sIGludCB0eXBlKSB7CisgIGludCBpLCBzdW07CisgIGZvciAoaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICBjb25zdCBpbnQgaXNfYWNfY29lZmYgPSAoaSA+IDApOworICAgIGNvbnN0IGludCBiaWFzID0ga0JpYXNNYXRyaWNlc1t0eXBlXVtpc19hY19jb2VmZl07CisgICAgbS0+aXFfW2ldID0gKDEgPDwgUUZJWCkgLyBtLT5xX1tpXTsKKyAgICBtLT5iaWFzX1tpXSA9IEJJQVMoYmlhcyk7CisgICAgLy8genRocmVzaF8gaXMgdGhlIGV4YWN0IHZhbHVlIHN1Y2ggdGhhdCBRVUFOVERJVihjb2VmZiwgaVEsIEIpIGlzOgorICAgIC8vICAgKiB6ZXJvIGlmIGNvZWZmIDw9IHp0aHJlc2gKKyAgICAvLyAgICogbm9uLXplcm8gaWYgY29lZmYgPiB6dGhyZXNoCisgICAgbS0+enRocmVzaF9baV0gPSAoKDEgPDwgUUZJWCkgLSAxIC0gbS0+Ymlhc19baV0pIC8gbS0+aXFfW2ldOworICB9CisgIGZvciAoaSA9IDI7IGkgPCAxNjsgKytpKSB7CisgICAgbS0+cV9baV0gPSBtLT5xX1sxXTsKKyAgICBtLT5pcV9baV0gPSBtLT5pcV9bMV07CisgICAgbS0+Ymlhc19baV0gPSBtLT5iaWFzX1sxXTsKKyAgICBtLT56dGhyZXNoX1tpXSA9IG0tPnp0aHJlc2hfWzFdOworICB9CisgIGZvciAoc3VtID0gMCwgaSA9IDA7IGkgPCAxNjsgKytpKSB7CisgICAgaWYgKHR5cGUgPT0gMCkgeyAgLy8gd2Ugb25seSB1c2Ugc2hhcnBlbmluZyBmb3IgQUMgbHVtYSBjb2VmZnMKKyAgICAgIG0tPnNoYXJwZW5fW2ldID0gKGtGcmVxU2hhcnBlbmluZ1tpXSAqIG0tPnFfW2ldKSA+PiBTSEFSUEVOX0JJVFM7CisgICAgfSBlbHNlIHsKKyAgICAgIG0tPnNoYXJwZW5fW2ldID0gMDsKKyAgICB9CisgICAgc3VtICs9IG0tPnFfW2ldOworICB9CisgIHJldHVybiAoc3VtICsgOCkgPj4gNDsKK30KKworc3RhdGljIHZvaWQgQ2hlY2tMYW1iZGFWYWx1ZShpbnQqIGNvbnN0IHYpIHsgaWYgKCp2IDwgMSkgKnYgPSAxOyB9CisKK3N0YXRpYyB2b2lkIFNldHVwTWF0cmljZXMoVlA4RW5jb2RlciogZW5jKSB7CisgIGludCBpOworICBjb25zdCBpbnQgdGxhbWJkYV9zY2FsZSA9CisgICAgKGVuYy0+bWV0aG9kXyA+PSA0KSA/IGVuYy0+Y29uZmlnXy0+c25zX3N0cmVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICA6IDA7CisgIGNvbnN0IGludCBudW1fc2VnbWVudHMgPSBlbmMtPnNlZ21lbnRfaGRyXy5udW1fc2VnbWVudHNfOworICBmb3IgKGkgPSAwOyBpIDwgbnVtX3NlZ21lbnRzOyArK2kpIHsKKyAgICBWUDhTZWdtZW50SW5mbyogY29uc3QgbSA9ICZlbmMtPmRxbV9baV07CisgICAgY29uc3QgaW50IHEgPSBtLT5xdWFudF87CisgICAgaW50IHFfaTQsIHFfaTE2LCBxX3V2OworICAgIG0tPnkxXy5xX1swXSA9IGtEY1RhYmxlW2NsaXAocSArIGVuYy0+ZHFfeTFfZGNfLCAwLCAxMjcpXTsKKyAgICBtLT55MV8ucV9bMV0gPSBrQWNUYWJsZVtjbGlwKHEsICAgICAgICAgICAgICAgICAgMCwgMTI3KV07CisKKyAgICBtLT55Ml8ucV9bMF0gPSBrRGNUYWJsZVsgY2xpcChxICsgZW5jLT5kcV95Ml9kY18sIDAsIDEyNyldICogMjsKKyAgICBtLT55Ml8ucV9bMV0gPSBrQWNUYWJsZTJbY2xpcChxICsgZW5jLT5kcV95Ml9hY18sIDAsIDEyNyldOworCisgICAgbS0+dXZfLnFfWzBdID0ga0RjVGFibGVbY2xpcChxICsgZW5jLT5kcV91dl9kY18sIDAsIDExNyldOworICAgIG0tPnV2Xy5xX1sxXSA9IGtBY1RhYmxlW2NsaXAocSArIGVuYy0+ZHFfdXZfYWNfLCAwLCAxMjcpXTsKKworICAgIHFfaTQgID0gRXhwYW5kTWF0cml4KCZtLT55MV8sIDApOworICAgIHFfaTE2ID0gRXhwYW5kTWF0cml4KCZtLT55Ml8sIDEpOworICAgIHFfdXYgID0gRXhwYW5kTWF0cml4KCZtLT51dl8sIDIpOworCisgICAgbS0+bGFtYmRhX2k0XyAgICAgICAgICA9ICgzICogcV9pNCAqIHFfaTQpID4+IDc7CisgICAgbS0+bGFtYmRhX2kxNl8gICAgICAgICA9ICgzICogcV9pMTYgKiBxX2kxNik7CisgICAgbS0+bGFtYmRhX3V2XyAgICAgICAgICA9ICgzICogcV91diAqIHFfdXYpID4+IDY7CisgICAgbS0+bGFtYmRhX21vZGVfICAgICAgICA9ICgxICogcV9pNCAqIHFfaTQpID4+IDc7CisgICAgbS0+bGFtYmRhX3RyZWxsaXNfaTRfICA9ICg3ICogcV9pNCAqIHFfaTQpID4+IDM7CisgICAgbS0+bGFtYmRhX3RyZWxsaXNfaTE2XyA9IChxX2kxNiAqIHFfaTE2KSA+PiAyOworICAgIG0tPmxhbWJkYV90cmVsbGlzX3V2XyAgPSAocV91diAqIHFfdXYpIDw8IDE7CisgICAgbS0+dGxhbWJkYV8gICAgICAgICAgICA9ICh0bGFtYmRhX3NjYWxlICogcV9pNCkgPj4gNTsKKworICAgIC8vIG5vbmUgb2YgdGhlc2UgY29uc3RhbnRzIHNob3VsZCBiZSA8IDEKKyAgICBDaGVja0xhbWJkYVZhbHVlKCZtLT5sYW1iZGFfaTRfKTsKKyAgICBDaGVja0xhbWJkYVZhbHVlKCZtLT5sYW1iZGFfaTE2Xyk7CisgICAgQ2hlY2tMYW1iZGFWYWx1ZSgmbS0+bGFtYmRhX3V2Xyk7CisgICAgQ2hlY2tMYW1iZGFWYWx1ZSgmbS0+bGFtYmRhX21vZGVfKTsKKyAgICBDaGVja0xhbWJkYVZhbHVlKCZtLT5sYW1iZGFfdHJlbGxpc19pNF8pOworICAgIENoZWNrTGFtYmRhVmFsdWUoJm0tPmxhbWJkYV90cmVsbGlzX2kxNl8pOworICAgIENoZWNrTGFtYmRhVmFsdWUoJm0tPmxhbWJkYV90cmVsbGlzX3V2Xyk7CisgICAgQ2hlY2tMYW1iZGFWYWx1ZSgmbS0+dGxhbWJkYV8pOworCisgICAgbS0+bWluX2Rpc3RvXyA9IDIwICogbS0+eTFfLnFfWzBdOyAgIC8vIHF1YW50aXphdGlvbi1hd2FyZSBtaW4gZGlzdG8KKyAgICBtLT5tYXhfZWRnZV8gID0gMDsKKworICAgIG0tPmk0X3BlbmFsdHlfID0gMTAwMCAqIHFfaTQgKiBxX2k0OworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbml0aWFsaXplIGZpbHRlcmluZyBwYXJhbWV0ZXJzCisKKy8vIFZlcnkgc21hbGwgZmlsdGVyLXN0cmVuZ3RoIHZhbHVlcyBoYXZlIGNsb3NlIHRvIG5vIHZpc3VhbCBlZmZlY3QuIFNvIHdlIGNhbgorLy8gc2F2ZSBhIGxpdHRsZSBkZWNvZGluZy1DUFUgYnkgdHVybmluZyBmaWx0ZXJpbmcgb2ZmIGZvciB0aGVzZS4KKyNkZWZpbmUgRlNUUkVOR1RIX0NVVE9GRiAyCisKK3N0YXRpYyB2b2lkIFNldHVwRmlsdGVyU3RyZW5ndGgoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7CisgIGludCBpOworICAvLyBsZXZlbDAgaXMgaW4gWzAuLjUwMF0uIFVzaW5nICctZiA1MCcgYXMgZmlsdGVyX3N0cmVuZ3RoIGlzIG1pZC1maWx0ZXJpbmcuCisgIGNvbnN0IGludCBsZXZlbDAgPSA1ICogZW5jLT5jb25maWdfLT5maWx0ZXJfc3RyZW5ndGg7CisgIGZvciAoaSA9IDA7IGkgPCBOVU1fTUJfU0VHTUVOVFM7ICsraSkgeworICAgIFZQOFNlZ21lbnRJbmZvKiBjb25zdCBtID0gJmVuYy0+ZHFtX1tpXTsKKyAgICAvLyBXZSBmb2N1cyBvbiB0aGUgcXVhbnRpemF0aW9uIG9mIEFDIGNvZWZmcy4KKyAgICBjb25zdCBpbnQgcXN0ZXAgPSBrQWNUYWJsZVtjbGlwKG0tPnF1YW50XywgMCwgMTI3KV0gPj4gMjsKKyAgICBjb25zdCBpbnQgYmFzZV9zdHJlbmd0aCA9CisgICAgICAgIFZQOEZpbHRlclN0cmVuZ3RoRnJvbURlbHRhKGVuYy0+ZmlsdGVyX2hkcl8uc2hhcnBuZXNzXywgcXN0ZXApOworICAgIC8vIFNlZ21lbnRzIHdpdGggbG93ZXIgY29tcGxleGl0eSAoJ2JldGEnKSB3aWxsIGJlIGxlc3MgZmlsdGVyZWQuCisgICAgY29uc3QgaW50IGYgPSBiYXNlX3N0cmVuZ3RoICogbGV2ZWwwIC8gKDI1NiArIG0tPmJldGFfKTsKKyAgICBtLT5mc3RyZW5ndGhfID0gKGYgPCBGU1RSRU5HVEhfQ1VUT0ZGKSA/IDAgOiAoZiA+IDYzKSA/IDYzIDogZjsKKyAgfQorICAvLyBXZSByZWNvcmQgdGhlIGluaXRpYWwgc3RyZW5ndGggKG1haW5seSBmb3IgdGhlIGNhc2Ugb2YgMS1zZWdtZW50IG9ubHkpLgorICBlbmMtPmZpbHRlcl9oZHJfLmxldmVsXyA9IGVuYy0+ZHFtX1swXS5mc3RyZW5ndGhfOworICBlbmMtPmZpbHRlcl9oZHJfLnNpbXBsZV8gPSAoZW5jLT5jb25maWdfLT5maWx0ZXJfdHlwZSA9PSAwKTsKKyAgZW5jLT5maWx0ZXJfaGRyXy5zaGFycG5lc3NfID0gZW5jLT5jb25maWdfLT5maWx0ZXJfc2hhcnBuZXNzOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBOb3RlOiBpZiB5b3UgY2hhbmdlIHRoZSB2YWx1ZXMgYmVsb3csIHJlbWVtYmVyIHRoYXQgdGhlIG1heCByYW5nZQorLy8gYWxsb3dlZCBieSB0aGUgc3ludGF4IGZvciBEUV9VViBpcyBbLTE2LDE2XS4KKyNkZWZpbmUgTUFYX0RRX1VWICg2KQorI2RlZmluZSBNSU5fRFFfVVYgKC00KQorCisvLyBXZSB3YW50IHRvIGVtdWxhdGUganBlZy1saWtlIGJlaGF2aW91ciB3aGVyZSB0aGUgZXhwZWN0ZWQgImdvb2QiIHF1YWxpdHkKKy8vIGlzIGFyb3VuZCBxPTc1LiBJbnRlcm5hbGx5LCBvdXIgImdvb2QiIG1pZGRsZSBpcyBhcm91bmQgYz01MC4gU28gd2UKKy8vIG1hcCBhY2NvcmRpbmdseSB1c2luZyBsaW5lYXIgcGllY2Utd2lzZSBmdW5jdGlvbgorc3RhdGljIGRvdWJsZSBRdWFsaXR5VG9Db21wcmVzc2lvbihkb3VibGUgYykgeworICBjb25zdCBkb3VibGUgbGluZWFyX2MgPSAoYyA8IDAuNzUpID8gYyAqICgyLiAvIDMuKSA6IDIuICogYyAtIDEuOworICAvLyBUaGUgZmlsZSBzaXplIHJvdWdobHkgc2NhbGVzIGFzIHBvdyhxdWFudGl6ZXIsIDMuKS4gQWN0dWFsbHksIHRoZQorICAvLyBleHBvbmVudCBpcyBzb21ld2hlcmUgYmV0d2VlbiAyLjggYW5kIDMuMiwgYnV0IHdlJ3JlIG1vc3RseSBpbnRlcmVzdGVkCisgIC8vIGluIHRoZSBtaWQtcXVhbnQgcmFuZ2UuIFNvIHdlIHNjYWxlIHRoZSBjb21wcmVzc2liaWxpdHkgaW52ZXJzZWx5IHRvCisgIC8vIHRoaXMgcG93ZXItbGF3OiBxdWFudCB+PSBjb21wcmVzc2lvbiBeIDEvMy4gVGhpcyBsYXcgaG9sZHMgd2VsbCBmb3IKKyAgLy8gbG93IHF1YW50LiBGaW5lciBtb2RlbGluZyBmb3IgaGlnaC1xdWFudCB3b3VsZCBtYWtlIHVzZSBvZiBrQWNUYWJsZVtdCisgIC8vIG1vcmUgZXhwbGljaXRseS4KKyAgY29uc3QgZG91YmxlIHYgPSBwb3cobGluZWFyX2MsIDEgLyAzLik7CisgIHJldHVybiB2OworfQorCitzdGF0aWMgZG91YmxlIFF1YWxpdHlUb0pQRUdDb21wcmVzc2lvbihkb3VibGUgYywgZG91YmxlIGFscGhhKSB7CisgIC8vIFdlIG1hcCB0aGUgY29tcGxleGl0eSAnYWxwaGEnIGFuZCBxdWFsaXR5IHNldHRpbmcgJ2MnIHRvIGEgY29tcHJlc3Npb24KKyAgLy8gZXhwb25lbnQgZW1waXJpY2FsbHkgbWF0Y2hlZCB0byB0aGUgY29tcHJlc3Npb24gY3VydmUgb2YgbGlianBlZzZiLgorICAvLyBPbiBhdmVyYWdlLCB0aGUgV2ViUCBvdXRwdXQgc2l6ZSB3aWxsIGJlIHJvdWdobHkgc2ltaWxhciB0byB0aGF0IG9mIGEKKyAgLy8gSlBFRyBmaWxlIGNvbXByZXNzZWQgd2l0aCBzYW1lIHF1YWxpdHkgZmFjdG9yLgorICBjb25zdCBkb3VibGUgYW1pbiA9IDAuMzA7CisgIGNvbnN0IGRvdWJsZSBhbWF4ID0gMC44NTsKKyAgY29uc3QgZG91YmxlIGV4cF9taW4gPSAwLjQ7CisgIGNvbnN0IGRvdWJsZSBleHBfbWF4ID0gMC45OworICBjb25zdCBkb3VibGUgc2xvcGUgPSAoZXhwX21pbiAtIGV4cF9tYXgpIC8gKGFtYXggLSBhbWluKTsKKyAgLy8gTGluZWFybHkgaW50ZXJwb2xhdGUgJ2V4cG4nIGZyb20gZXhwX21pbiB0byBleHBfbWF4CisgIC8vIGluIHRoZSBbYW1pbiwgYW1heF0gcmFuZ2UuCisgIGNvbnN0IGRvdWJsZSBleHBuID0gKGFscGhhID4gYW1heCkgPyBleHBfbWluCisgICAgICAgICAgICAgICAgICAgIDogKGFscGhhIDwgYW1pbikgPyBleHBfbWF4CisgICAgICAgICAgICAgICAgICAgIDogZXhwX21heCArIHNsb3BlICogKGFscGhhIC0gYW1pbik7CisgIGNvbnN0IGRvdWJsZSB2ID0gcG93KGMsIGV4cG4pOworICByZXR1cm4gdjsKK30KKworc3RhdGljIGludCBTZWdtZW50c0FyZUVxdWl2YWxlbnQoY29uc3QgVlA4U2VnbWVudEluZm8qIGNvbnN0IFMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4U2VnbWVudEluZm8qIGNvbnN0IFMyKSB7CisgIHJldHVybiAoUzEtPnF1YW50XyA9PSBTMi0+cXVhbnRfKSAmJiAoUzEtPmZzdHJlbmd0aF8gPT0gUzItPmZzdHJlbmd0aF8pOworfQorCitzdGF0aWMgdm9pZCBTaW1wbGlmeVNlZ21lbnRzKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgeworICBpbnQgbWFwW05VTV9NQl9TRUdNRU5UU10gPSB7IDAsIDEsIDIsIDMgfTsKKyAgLy8gJ251bV9zZWdtZW50c18nIGlzIHByZXZpb3VzbHkgdmFsaWRhdGVkIGFuZCA8PSBOVU1fTUJfU0VHTUVOVFMsIGJ1dCBhbgorICAvLyBleHBsaWNpdCBjaGVjayBpcyBuZWVkZWQgdG8gYXZvaWQgYSBzcHVyaW91cyB3YXJuaW5nIGFib3V0ICdpJyBleGNlZWRpbmcKKyAgLy8gYXJyYXkgYm91bmRzIG9mICdkcW1fJyB3aXRoIHNvbWUgY29tcGlsZXJzIChub3RpY2VkIHdpdGggZ2NjLTQuOSkuCisgIGNvbnN0IGludCBudW1fc2VnbWVudHMgPSAoZW5jLT5zZWdtZW50X2hkcl8ubnVtX3NlZ21lbnRzXyA8IE5VTV9NQl9TRUdNRU5UUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGVuYy0+c2VnbWVudF9oZHJfLm51bV9zZWdtZW50c18KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE5VTV9NQl9TRUdNRU5UUzsKKyAgaW50IG51bV9maW5hbF9zZWdtZW50cyA9IDE7CisgIGludCBzMSwgczI7CisgIGZvciAoczEgPSAxOyBzMSA8IG51bV9zZWdtZW50czsgKytzMSkgeyAgICAvLyBmaW5kIHNpbWlsYXIgc2VnbWVudHMKKyAgICBjb25zdCBWUDhTZWdtZW50SW5mbyogY29uc3QgUzEgPSAmZW5jLT5kcW1fW3MxXTsKKyAgICBpbnQgZm91bmQgPSAwOworICAgIC8vIGNoZWNrIGlmIHdlIGFscmVhZHkgaGF2ZSBzaW1pbGFyIHNlZ21lbnQKKyAgICBmb3IgKHMyID0gMDsgczIgPCBudW1fZmluYWxfc2VnbWVudHM7ICsrczIpIHsKKyAgICAgIGNvbnN0IFZQOFNlZ21lbnRJbmZvKiBjb25zdCBTMiA9ICZlbmMtPmRxbV9bczJdOworICAgICAgaWYgKFNlZ21lbnRzQXJlRXF1aXZhbGVudChTMSwgUzIpKSB7CisgICAgICAgIGZvdW5kID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIG1hcFtzMV0gPSBzMjsKKyAgICBpZiAoIWZvdW5kKSB7CisgICAgICBpZiAobnVtX2ZpbmFsX3NlZ21lbnRzICE9IHMxKSB7CisgICAgICAgIGVuYy0+ZHFtX1tudW1fZmluYWxfc2VnbWVudHNdID0gZW5jLT5kcW1fW3MxXTsKKyAgICAgIH0KKyAgICAgICsrbnVtX2ZpbmFsX3NlZ21lbnRzOworICAgIH0KKyAgfQorICBpZiAobnVtX2ZpbmFsX3NlZ21lbnRzIDwgbnVtX3NlZ21lbnRzKSB7ICAvLyBSZW1hcAorICAgIGludCBpID0gZW5jLT5tYl93XyAqIGVuYy0+bWJfaF87CisgICAgd2hpbGUgKGktLSA+IDApIGVuYy0+bWJfaW5mb19baV0uc2VnbWVudF8gPSBtYXBbZW5jLT5tYl9pbmZvX1tpXS5zZWdtZW50X107CisgICAgZW5jLT5zZWdtZW50X2hkcl8ubnVtX3NlZ21lbnRzXyA9IG51bV9maW5hbF9zZWdtZW50czsKKyAgICAvLyBSZXBsaWNhdGUgdGhlIHRyYWlsaW5nIHNlZ21lbnQgaW5mb3MgKGl0J3MgbW9zdGx5IGNvc21ldGljcykKKyAgICBmb3IgKGkgPSBudW1fZmluYWxfc2VnbWVudHM7IGkgPCBudW1fc2VnbWVudHM7ICsraSkgeworICAgICAgZW5jLT5kcW1fW2ldID0gZW5jLT5kcW1fW251bV9maW5hbF9zZWdtZW50cyAtIDFdOworICAgIH0KKyAgfQorfQorCit2b2lkIFZQOFNldFNlZ21lbnRQYXJhbXMoVlA4RW5jb2RlciogY29uc3QgZW5jLCBmbG9hdCBxdWFsaXR5KSB7CisgIGludCBpOworICBpbnQgZHFfdXZfYWMsIGRxX3V2X2RjOworICBjb25zdCBpbnQgbnVtX3NlZ21lbnRzID0gZW5jLT5zZWdtZW50X2hkcl8ubnVtX3NlZ21lbnRzXzsKKyAgY29uc3QgZG91YmxlIGFtcCA9IFNOU19UT19EUSAqIGVuYy0+Y29uZmlnXy0+c25zX3N0cmVuZ3RoIC8gMTAwLiAvIDEyOC47CisgIGNvbnN0IGRvdWJsZSBRID0gcXVhbGl0eSAvIDEwMC47CisgIGNvbnN0IGRvdWJsZSBjX2Jhc2UgPSBlbmMtPmNvbmZpZ18tPmVtdWxhdGVfanBlZ19zaXplID8KKyAgICAgIFF1YWxpdHlUb0pQRUdDb21wcmVzc2lvbihRLCBlbmMtPmFscGhhXyAvIDI1NS4pIDoKKyAgICAgIFF1YWxpdHlUb0NvbXByZXNzaW9uKFEpOworICBmb3IgKGkgPSAwOyBpIDwgbnVtX3NlZ21lbnRzOyArK2kpIHsKKyAgICAvLyBXZSBtb2R1bGF0ZSB0aGUgYmFzZSBjb2VmZmljaWVudCB0byBhY2NvbW1vZGF0ZSBmb3IgdGhlIHF1YW50aXphdGlvbgorICAgIC8vIHN1c2NlcHRpYmlsaXR5IGFuZCBhbGxvdyBkZW5zZXIgc2VnbWVudHMgdG8gYmUgcXVhbnRpemVkIG1vcmUuCisgICAgY29uc3QgZG91YmxlIGV4cG4gPSAxLiAtIGFtcCAqIGVuYy0+ZHFtX1tpXS5hbHBoYV87CisgICAgY29uc3QgZG91YmxlIGMgPSBwb3coY19iYXNlLCBleHBuKTsKKyAgICBjb25zdCBpbnQgcSA9IChpbnQpKDEyNy4gKiAoMS4gLSBjKSk7CisgICAgYXNzZXJ0KGV4cG4gPiAwLik7CisgICAgZW5jLT5kcW1fW2ldLnF1YW50XyA9IGNsaXAocSwgMCwgMTI3KTsKKyAgfQorCisgIC8vIHB1cmVseSBpbmRpY2F0aXZlIGluIHRoZSBiaXRzdHJlYW0gKGV4Y2VwdCBmb3IgdGhlIDEtc2VnbWVudCBjYXNlKQorICBlbmMtPmJhc2VfcXVhbnRfID0gZW5jLT5kcW1fWzBdLnF1YW50XzsKKworICAvLyBmaWxsLWluIHZhbHVlcyBmb3IgdGhlIHVudXNlZCBzZWdtZW50cyAocmVxdWlyZWQgYnkgdGhlIHN5bnRheCkKKyAgZm9yIChpID0gbnVtX3NlZ21lbnRzOyBpIDwgTlVNX01CX1NFR01FTlRTOyArK2kpIHsKKyAgICBlbmMtPmRxbV9baV0ucXVhbnRfID0gZW5jLT5iYXNlX3F1YW50XzsKKyAgfQorCisgIC8vIHV2X2FscGhhXyBpcyBub3JtYWxseSBzcHJlYWQgYXJvdW5kIH42MC4gVGhlIHVzZWZ1bCByYW5nZSBpcworICAvLyB0eXBpY2FsbHkgfjMwIChxdWl0ZSBiYWQpIHRvIH4xMDAgKG9rIHRvIGRlY2ltYXRlIFVWIG1vcmUpLgorICAvLyBXZSBtYXAgaXQgdG8gdGhlIHNhZmUgbWF4aW1hbCByYW5nZSBvZiBNQVgvTUlOX0RRX1VWIGZvciBkcV91di4KKyAgZHFfdXZfYWMgPSAoZW5jLT51dl9hbHBoYV8gLSBNSURfQUxQSEEpICogKE1BWF9EUV9VViAtIE1JTl9EUV9VVikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKE1BWF9BTFBIQSAtIE1JTl9BTFBIQSk7CisgIC8vIHdlIHJlc2NhbGUgYnkgdGhlIHVzZXItZGVmaW5lZCBzdHJlbmd0aCBvZiBhZGFwdGF0aW9uCisgIGRxX3V2X2FjID0gZHFfdXZfYWMgKiBlbmMtPmNvbmZpZ18tPnNuc19zdHJlbmd0aCAvIDEwMDsKKyAgLy8gYW5kIG1ha2UgaXQgc2FmZS4KKyAgZHFfdXZfYWMgPSBjbGlwKGRxX3V2X2FjLCBNSU5fRFFfVVYsIE1BWF9EUV9VVik7CisgIC8vIFdlIGFsc28gYm9vc3QgdGhlIGRjLXV2LXF1YW50IGEgbGl0dGxlLCBiYXNlZCBvbiBzbnMtc3RyZW5ndGgsIHNpbmNlCisgIC8vIFUvViBjaGFubmVscyBhcmUgcXVpdGUgbW9yZSByZWFjdGl2ZSB0byBoaWdoIHF1YW50cyAoZmxhdCBEQy1ibG9ja3MKKyAgLy8gdGVuZCB0byBhcHBlYXIsIGFuZCBhcmUgdW5wbGVhc2FudCkuCisgIGRxX3V2X2RjID0gLTQgKiBlbmMtPmNvbmZpZ18tPnNuc19zdHJlbmd0aCAvIDEwMDsKKyAgZHFfdXZfZGMgPSBjbGlwKGRxX3V2X2RjLCAtMTUsIDE1KTsgICAvLyA0Yml0LXNpZ25lZCBtYXggYWxsb3dlZAorCisgIGVuYy0+ZHFfeTFfZGNfID0gMDsgICAgICAgLy8gVE9ETyhza2FsKTogZHEtbHVtCisgIGVuYy0+ZHFfeTJfZGNfID0gMDsKKyAgZW5jLT5kcV95Ml9hY18gPSAwOworICBlbmMtPmRxX3V2X2RjXyA9IGRxX3V2X2RjOworICBlbmMtPmRxX3V2X2FjXyA9IGRxX3V2X2FjOworCisgIFNldHVwRmlsdGVyU3RyZW5ndGgoZW5jKTsgICAvLyBpbml0aWFsaXplIHNlZ21lbnRzJyBmaWx0ZXJpbmcsIGV2ZW50dWFsbHkKKworICBpZiAobnVtX3NlZ21lbnRzID4gMSkgU2ltcGxpZnlTZWdtZW50cyhlbmMpOworCisgIFNldHVwTWF0cmljZXMoZW5jKTsgICAgICAgICAvLyBmaW5hbGl6ZSBxdWFudGl6YXRpb24gbWF0cmljZXMKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZvcm0gdGhlIHByZWRpY3Rpb25zIGluIGNhY2hlCisKKy8vIE11c3QgYmUgb3JkZXJlZCB1c2luZyB7RENfUFJFRCwgVE1fUFJFRCwgVl9QUkVELCBIX1BSRUR9IGFzIGluZGV4Citjb25zdCB1aW50MTZfdCBWUDhJMTZNb2RlT2Zmc2V0c1s0XSA9IHsgSTE2REMxNiwgSTE2VE0xNiwgSTE2VkUxNiwgSTE2SEUxNiB9OworY29uc3QgdWludDE2X3QgVlA4VVZNb2RlT2Zmc2V0c1s0XSA9IHsgQzhEQzgsIEM4VE04LCBDOFZFOCwgQzhIRTggfTsKKworLy8gTXVzdCBiZSBpbmRleGVkIHVzaW5nIHtCX0RDX1BSRUQgLT4gQl9IVV9QUkVEfSBhcyBpbmRleAorY29uc3QgdWludDE2X3QgVlA4STRNb2RlT2Zmc2V0c1tOVU1fQk1PREVTXSA9IHsKKyAgSTREQzQsIEk0VE00LCBJNFZFNCwgSTRIRTQsIEk0UkQ0LCBJNFZSNCwgSTRMRDQsIEk0Vkw0LCBJNEhENCwgSTRIVTQKK307CisKK3ZvaWQgVlA4TWFrZUx1bWExNlByZWRzKGNvbnN0IFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCkgeworICBjb25zdCB1aW50OF90KiBjb25zdCBsZWZ0ID0gaXQtPnhfID8gaXQtPnlfbGVmdF8gOiBOVUxMOworICBjb25zdCB1aW50OF90KiBjb25zdCB0b3AgPSBpdC0+eV8gPyBpdC0+eV90b3BfIDogTlVMTDsKKyAgVlA4RW5jUHJlZEx1bWExNihpdC0+eXV2X3BfLCBsZWZ0LCB0b3ApOworfQorCit2b2lkIFZQOE1ha2VDaHJvbWE4UHJlZHMoY29uc3QgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KSB7CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGxlZnQgPSBpdC0+eF8gPyBpdC0+dV9sZWZ0XyA6IE5VTEw7CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHRvcCA9IGl0LT55XyA/IGl0LT51dl90b3BfIDogTlVMTDsKKyAgVlA4RW5jUHJlZENocm9tYTgoaXQtPnl1dl9wXywgbGVmdCwgdG9wKTsKK30KKwordm9pZCBWUDhNYWtlSW50cmE0UHJlZHMoY29uc3QgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KSB7CisgIFZQOEVuY1ByZWRMdW1hNChpdC0+eXV2X3BfLCBpdC0+aTRfdG9wXyk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBRdWFudGl6ZQorCisvLyBMYXlvdXQ6CisvLyArLS0tLSstLS0tKworLy8gfFlZWVl8VVVWVnwgMAorLy8gfFlZWVl8VVVWVnwgNAorLy8gfFlZWVl8Li4uLnwgOAorLy8gfFlZWVl8Li4uLnwgMTIKKy8vICstLS0tKy0tLS0rCisKK2NvbnN0IHVpbnQxNl90IFZQOFNjYW5bMTZdID0geyAgLy8gTHVtYQorICAwICsgIDAgKiBCUFMsICA0ICsgIDAgKiBCUFMsIDggKyAgMCAqIEJQUywgMTIgKyAgMCAqIEJQUywKKyAgMCArICA0ICogQlBTLCAgNCArICA0ICogQlBTLCA4ICsgIDQgKiBCUFMsIDEyICsgIDQgKiBCUFMsCisgIDAgKyAgOCAqIEJQUywgIDQgKyAgOCAqIEJQUywgOCArICA4ICogQlBTLCAxMiArICA4ICogQlBTLAorICAwICsgMTIgKiBCUFMsICA0ICsgMTIgKiBCUFMsIDggKyAxMiAqIEJQUywgMTIgKyAxMiAqIEJQUywKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBWUDhTY2FuVVZbNCArIDRdID0geworICAwICsgMCAqIEJQUywgICA0ICsgMCAqIEJQUywgMCArIDQgKiBCUFMsICA0ICsgNCAqIEJQUywgICAgLy8gVQorICA4ICsgMCAqIEJQUywgIDEyICsgMCAqIEJQUywgOCArIDQgKiBCUFMsIDEyICsgNCAqIEJQUyAgICAgLy8gVgorfTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERpc3RvcnRpb24gbWVhc3VyZW1lbnQKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGtXZWlnaHRZWzE2XSA9IHsKKyAgMzgsIDMyLCAyMCwgOSwgMzIsIDI4LCAxNywgNywgMjAsIDE3LCAxMCwgNCwgOSwgNywgNCwgMgorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGtXZWlnaHRUcmVsbGlzWzE2XSA9IHsKKyNpZiBVU0VfVERJU1RPID09IDAKKyAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYKKyNlbHNlCisgIDMwLCAyNywgMTksIDExLAorICAyNywgMjQsIDE3LCAxMCwKKyAgMTksIDE3LCAxMiwgIDgsCisgIDExLCAxMCwgIDgsICA2CisjZW5kaWYKK307CisKKy8vIEluaXQvQ29weSB0aGUgY29tbW9uIGZpZWxkcyBpbiBzY29yZS4KK3N0YXRpYyB2b2lkIEluaXRTY29yZShWUDhNb2RlU2NvcmUqIGNvbnN0IHJkKSB7CisgIHJkLT5EICA9IDA7CisgIHJkLT5TRCA9IDA7CisgIHJkLT5SICA9IDA7CisgIHJkLT5IICA9IDA7CisgIHJkLT5ueiA9IDA7CisgIHJkLT5zY29yZSA9IE1BWF9DT1NUOworfQorCitzdGF0aWMgdm9pZCBDb3B5U2NvcmUoVlA4TW9kZVNjb3JlKiBjb25zdCBkc3QsIGNvbnN0IFZQOE1vZGVTY29yZSogY29uc3Qgc3JjKSB7CisgIGRzdC0+RCAgPSBzcmMtPkQ7CisgIGRzdC0+U0QgPSBzcmMtPlNEOworICBkc3QtPlIgID0gc3JjLT5SOworICBkc3QtPkggID0gc3JjLT5IOworICBkc3QtPm56ID0gc3JjLT5uejsgICAgICAvLyBub3RlIHRoYXQgbnogaXMgbm90IGFjY3VtdWxhdGVkLCBidXQganVzdCBjb3BpZWQuCisgIGRzdC0+c2NvcmUgPSBzcmMtPnNjb3JlOworfQorCitzdGF0aWMgdm9pZCBBZGRTY29yZShWUDhNb2RlU2NvcmUqIGNvbnN0IGRzdCwgY29uc3QgVlA4TW9kZVNjb3JlKiBjb25zdCBzcmMpIHsKKyAgZHN0LT5EICArPSBzcmMtPkQ7CisgIGRzdC0+U0QgKz0gc3JjLT5TRDsKKyAgZHN0LT5SICArPSBzcmMtPlI7CisgIGRzdC0+SCAgKz0gc3JjLT5IOworICBkc3QtPm56IHw9IHNyYy0+bno7ICAgICAvLyBoZXJlLCBuZXcgbnogYml0cyBhcmUgYWNjdW11bGF0ZWQuCisgIGRzdC0+c2NvcmUgKz0gc3JjLT5zY29yZTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFBlcmZvcm1zIHRyZWxsaXMtb3B0aW1pemVkIHF1YW50aXphdGlvbi4KKworLy8gVHJlbGxpcyBub2RlCit0eXBlZGVmIHN0cnVjdCB7CisgIGludDhfdCBwcmV2OyAgICAgICAgICAgIC8vIGJlc3QgcHJldmlvdXMgbm9kZQorICBpbnQ4X3Qgc2lnbjsgICAgICAgICAgICAvLyBzaWduIG9mIGNvZWZmX2kKKyAgaW50MTZfdCBsZXZlbDsgICAgICAgICAgLy8gbGV2ZWwKK30gTm9kZTsKKworLy8gU2NvcmUgc3RhdGUKK3R5cGVkZWYgc3RydWN0IHsKKyAgc2NvcmVfdCBzY29yZTsgICAgICAgICAgLy8gcGFydGlhbCBSRCBzY29yZQorICBjb25zdCB1aW50MTZfdCogY29zdHM7ICAvLyBzaG9ydGN1dCB0byBjb3N0IHRhYmxlcworfSBTY29yZVN0YXRlOworCisvLyBJZiBhIGNvZWZmaWNpZW50IHdhcyBxdWFudGl6ZWQgdG8gYSB2YWx1ZSBRICh1c2luZyBhIG5ldXRyYWwgYmlhcyksCisvLyB3ZSB0ZXN0IGFsbCBhbHRlcm5hdGUgcG9zc2liaWxpdGllcyBiZXR3ZWVuIFtRLU1JTl9ERUxUQSwgUStNQVhfREVMVEFdCisvLyBXZSBkb24ndCB0ZXN0IG5lZ2F0aXZlIHZhbHVlcyB0aG91Z2guCisjZGVmaW5lIE1JTl9ERUxUQSAwICAgLy8gaG93IG11Y2ggbG93ZXIgbGV2ZWwgdG8gdHJ5CisjZGVmaW5lIE1BWF9ERUxUQSAxICAgLy8gaG93IG11Y2ggaGlnaGVyCisjZGVmaW5lIE5VTV9OT0RFUyAoTUlOX0RFTFRBICsgMSArIE1BWF9ERUxUQSkKKyNkZWZpbmUgTk9ERShuLCBsKSAobm9kZXNbKG4pXVsobCkgKyBNSU5fREVMVEFdKQorI2RlZmluZSBTQ09SRV9TVEFURShuLCBsKSAoc2NvcmVfc3RhdGVzW25dWyhsKSArIE1JTl9ERUxUQV0pCisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFNldFJEU2NvcmUoaW50IGxhbWJkYSwgVlA4TW9kZVNjb3JlKiBjb25zdCByZCkgeworICByZC0+c2NvcmUgPSAocmQtPlIgKyByZC0+SCkgKiBsYW1iZGEgKyBSRF9ESVNUT19NVUxUICogKHJkLT5EICsgcmQtPlNEKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHNjb3JlX3QgUkRTY29yZVRyZWxsaXMoaW50IGxhbWJkYSwgc2NvcmVfdCByYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcmVfdCBkaXN0b3J0aW9uKSB7CisgIHJldHVybiByYXRlICogbGFtYmRhICsgUkRfRElTVE9fTVVMVCAqIGRpc3RvcnRpb247Cit9CisKK3N0YXRpYyBpbnQgVHJlbGxpc1F1YW50aXplQmxvY2soY29uc3QgVlA4RW5jb2RlciogY29uc3QgZW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IGluWzE2XSwgaW50MTZfdCBvdXRbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY3R4MCwgaW50IGNvZWZmX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOE1hdHJpeCogY29uc3QgbXR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGFtYmRhKSB7CisgIGNvbnN0IFByb2JhQXJyYXkqIGNvbnN0IHByb2JhcyA9IGVuYy0+cHJvYmFfLmNvZWZmc19bY29lZmZfdHlwZV07CisgIENvc3RBcnJheVB0ciBjb25zdCBjb3N0cyA9CisgICAgICAoQ29zdEFycmF5UHRyKWVuYy0+cHJvYmFfLnJlbWFwcGVkX2Nvc3RzX1tjb2VmZl90eXBlXTsKKyAgY29uc3QgaW50IGZpcnN0ID0gKGNvZWZmX3R5cGUgPT0gMCkgPyAxIDogMDsKKyAgTm9kZSBub2Rlc1sxNl1bTlVNX05PREVTXTsKKyAgU2NvcmVTdGF0ZSBzY29yZV9zdGF0ZXNbMl1bTlVNX05PREVTXTsKKyAgU2NvcmVTdGF0ZSogc3NfY3VyID0gJlNDT1JFX1NUQVRFKDAsIE1JTl9ERUxUQSk7CisgIFNjb3JlU3RhdGUqIHNzX3ByZXYgPSAmU0NPUkVfU1RBVEUoMSwgTUlOX0RFTFRBKTsKKyAgaW50IGJlc3RfcGF0aFszXSA9IHstMSwgLTEsIC0xfTsgICAvLyBzdG9yZSBiZXN0LWxhc3QvYmVzdC1sZXZlbC9iZXN0LXByZXZpb3VzCisgIHNjb3JlX3QgYmVzdF9zY29yZTsKKyAgaW50IG4sIG0sIHAsIGxhc3Q7CisKKyAgeworICAgIHNjb3JlX3QgY29zdDsKKyAgICBjb25zdCBpbnQgdGhyZXNoID0gbXR4LT5xX1sxXSAqIG10eC0+cV9bMV0gLyA0OworICAgIGNvbnN0IGludCBsYXN0X3Byb2JhID0gcHJvYmFzW1ZQOEVuY0JhbmRzW2ZpcnN0XV1bY3R4MF1bMF07CisKKyAgICAvLyBjb21wdXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgbGFzdCBpbnRlcmVzdGluZyBjb2VmZmljaWVudAorICAgIGxhc3QgPSBmaXJzdCAtIDE7CisgICAgZm9yIChuID0gMTU7IG4gPj0gZmlyc3Q7IC0tbikgeworICAgICAgY29uc3QgaW50IGogPSBrWmlnemFnW25dOworICAgICAgY29uc3QgaW50IGVyciA9IGluW2pdICogaW5bal07CisgICAgICBpZiAoZXJyID4gdGhyZXNoKSB7CisgICAgICAgIGxhc3QgPSBuOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgLy8gd2UgZG9uJ3QgbmVlZCB0byBnbyBpbnNwZWN0IHVwIHRvIG4gPSAxNiBjb2VmZnMuIFdlIGNhbiBqdXN0IGdvIHVwCisgICAgLy8gdG8gbGFzdCArIDEgKGluY2x1c2l2ZSkgd2l0aG91dCBsb3NpbmcgbXVjaC4KKyAgICBpZiAobGFzdCA8IDE1KSArK2xhc3Q7CisKKyAgICAvLyBjb21wdXRlICdza2lwJyBzY29yZS4gVGhpcyBpcyB0aGUgbWF4IHNjb3JlIG9uZSBjYW4gZG8uCisgICAgY29zdCA9IFZQOEJpdENvc3QoMCwgbGFzdF9wcm9iYSk7CisgICAgYmVzdF9zY29yZSA9IFJEU2NvcmVUcmVsbGlzKGxhbWJkYSwgY29zdCwgMCk7CisKKyAgICAvLyBpbml0aWFsaXplIHNvdXJjZSBub2RlLgorICAgIGZvciAobSA9IC1NSU5fREVMVEE7IG0gPD0gTUFYX0RFTFRBOyArK20pIHsKKyAgICAgIGNvbnN0IHNjb3JlX3QgcmF0ZSA9IChjdHgwID09IDApID8gVlA4Qml0Q29zdCgxLCBsYXN0X3Byb2JhKSA6IDA7CisgICAgICBzc19jdXJbbV0uc2NvcmUgPSBSRFNjb3JlVHJlbGxpcyhsYW1iZGEsIHJhdGUsIDApOworICAgICAgc3NfY3VyW21dLmNvc3RzID0gY29zdHNbZmlyc3RdW2N0eDBdOworICAgIH0KKyAgfQorCisgIC8vIHRyYXZlcnNlIHRyZWxsaXMuCisgIGZvciAobiA9IGZpcnN0OyBuIDw9IGxhc3Q7ICsrbikgeworICAgIGNvbnN0IGludCBqID0ga1ppZ3phZ1tuXTsKKyAgICBjb25zdCB1aW50MzJfdCBRICA9IG10eC0+cV9bal07CisgICAgY29uc3QgdWludDMyX3QgaVEgPSBtdHgtPmlxX1tqXTsKKyAgICBjb25zdCB1aW50MzJfdCBCID0gQklBUygweDAwKTsgICAgIC8vIG5ldXRyYWwgYmlhcworICAgIC8vIG5vdGU6IGl0J3MgaW1wb3J0YW50IHRvIHRha2Ugc2lnbiBvZiB0aGUgX29yaWdpbmFsXyBjb2VmZiwKKyAgICAvLyBzbyB3ZSBkb24ndCBoYXZlIHRvIGNvbnNpZGVyIGxldmVsIDwgMCBhZnRlcndhcmQuCisgICAgY29uc3QgaW50IHNpZ24gPSAoaW5bal0gPCAwKTsKKyAgICBjb25zdCB1aW50MzJfdCBjb2VmZjAgPSAoc2lnbiA/IC1pbltqXSA6IGluW2pdKSArIG10eC0+c2hhcnBlbl9bal07CisgICAgaW50IGxldmVsMCA9IFFVQU5URElWKGNvZWZmMCwgaVEsIEIpOworICAgIGludCB0aHJlc2hfbGV2ZWwgPSBRVUFOVERJVihjb2VmZjAsIGlRLCBCSUFTKDB4ODApKTsKKyAgICBpZiAodGhyZXNoX2xldmVsID4gTUFYX0xFVkVMKSB0aHJlc2hfbGV2ZWwgPSBNQVhfTEVWRUw7CisgICAgaWYgKGxldmVsMCA+IE1BWF9MRVZFTCkgbGV2ZWwwID0gTUFYX0xFVkVMOworCisgICAgeyAgIC8vIFN3YXAgY3VycmVudCBhbmQgcHJldmlvdXMgc2NvcmUgc3RhdGVzCisgICAgICBTY29yZVN0YXRlKiBjb25zdCB0bXAgPSBzc19jdXI7CisgICAgICBzc19jdXIgPSBzc19wcmV2OworICAgICAgc3NfcHJldiA9IHRtcDsKKyAgICB9CisKKyAgICAvLyB0ZXN0IGFsbCBhbHRlcm5hdGUgbGV2ZWwgdmFsdWVzIGFyb3VuZCBsZXZlbDAuCisgICAgZm9yIChtID0gLU1JTl9ERUxUQTsgbSA8PSBNQVhfREVMVEE7ICsrbSkgeworICAgICAgTm9kZSogY29uc3QgY3VyID0gJk5PREUobiwgbSk7CisgICAgICBpbnQgbGV2ZWwgPSBsZXZlbDAgKyBtOworICAgICAgY29uc3QgaW50IGN0eCA9IChsZXZlbCA+IDIpID8gMiA6IGxldmVsOworICAgICAgY29uc3QgaW50IGJhbmQgPSBWUDhFbmNCYW5kc1tuICsgMV07CisgICAgICBzY29yZV90IGJhc2Vfc2NvcmU7CisgICAgICBzY29yZV90IGJlc3RfY3VyX3Njb3JlID0gTUFYX0NPU1Q7CisgICAgICBpbnQgYmVzdF9wcmV2ID0gMDsgICAvLyBkZWZhdWx0LCBpbiBjYXNlCisKKyAgICAgIHNzX2N1clttXS5zY29yZSA9IE1BWF9DT1NUOworICAgICAgc3NfY3VyW21dLmNvc3RzID0gY29zdHNbbiArIDFdW2N0eF07CisgICAgICBpZiAobGV2ZWwgPCAwIHx8IGxldmVsID4gdGhyZXNoX2xldmVsKSB7CisgICAgICAgIC8vIE5vZGUgaXMgZGVhZC4KKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIHsKKyAgICAgICAgLy8gQ29tcHV0ZSBkZWx0YV9lcnJvciA9IGhvdyBtdWNoIGNvZGluZyB0aGlzIGxldmVsIHdpbGwKKyAgICAgICAgLy8gc3VidHJhY3QgdG8gbWF4X2Vycm9yIGFzIGRpc3RvcnRpb24uCisgICAgICAgIC8vIEhlcmUsIGRpc3RvcnRpb24gPSBzdW0gb2YgKHxjb2VmZl9pfCAtIGxldmVsX2kgKiBRX2kpXjIKKyAgICAgICAgY29uc3QgaW50IG5ld19lcnJvciA9IGNvZWZmMCAtIGxldmVsICogUTsKKyAgICAgICAgY29uc3QgaW50IGRlbHRhX2Vycm9yID0KKyAgICAgICAgICAgIGtXZWlnaHRUcmVsbGlzW2pdICogKG5ld19lcnJvciAqIG5ld19lcnJvciAtIGNvZWZmMCAqIGNvZWZmMCk7CisgICAgICAgIGJhc2Vfc2NvcmUgPSBSRFNjb3JlVHJlbGxpcyhsYW1iZGEsIDAsIGRlbHRhX2Vycm9yKTsKKyAgICAgIH0KKworICAgICAgLy8gSW5zcGVjdCBhbGwgcG9zc2libGUgbm9uLWRlYWQgcHJlZGVjZXNzb3JzLiBSZXRhaW4gb25seSB0aGUgYmVzdCBvbmUuCisgICAgICBmb3IgKHAgPSAtTUlOX0RFTFRBOyBwIDw9IE1BWF9ERUxUQTsgKytwKSB7CisgICAgICAgIC8vIERlYWQgbm9kZXMgKHdpdGggc3NfcHJldltwXS5zY29yZSA+PSBNQVhfQ09TVCkgYXJlIGF1dG9tYXRpY2FsbHkKKyAgICAgICAgLy8gZWxpbWluYXRlZCBzaW5jZSB0aGVpciBzY29yZSBjYW4ndCBiZSBiZXR0ZXIgdGhhbiB0aGUgY3VycmVudCBiZXN0LgorICAgICAgICBjb25zdCBzY29yZV90IGNvc3QgPSBWUDhMZXZlbENvc3Qoc3NfcHJldltwXS5jb3N0cywgbGV2ZWwpOworICAgICAgICAvLyBFeGFtaW5lIG5vZGUgYXNzdW1pbmcgaXQncyBhIG5vbi10ZXJtaW5hbCBvbmUuCisgICAgICAgIGNvbnN0IHNjb3JlX3Qgc2NvcmUgPQorICAgICAgICAgICAgYmFzZV9zY29yZSArIHNzX3ByZXZbcF0uc2NvcmUgKyBSRFNjb3JlVHJlbGxpcyhsYW1iZGEsIGNvc3QsIDApOworICAgICAgICBpZiAoc2NvcmUgPCBiZXN0X2N1cl9zY29yZSkgeworICAgICAgICAgIGJlc3RfY3VyX3Njb3JlID0gc2NvcmU7CisgICAgICAgICAgYmVzdF9wcmV2ID0gcDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLy8gU3RvcmUgYmVzdCBmaW5kaW5nIGluIGN1cnJlbnQgbm9kZS4KKyAgICAgIGN1ci0+c2lnbiA9IHNpZ247CisgICAgICBjdXItPmxldmVsID0gbGV2ZWw7CisgICAgICBjdXItPnByZXYgPSBiZXN0X3ByZXY7CisgICAgICBzc19jdXJbbV0uc2NvcmUgPSBiZXN0X2N1cl9zY29yZTsKKworICAgICAgLy8gTm93LCByZWNvcmQgYmVzdCB0ZXJtaW5hbCBub2RlIChhbmQgdGh1cyBiZXN0IGVudHJ5IGluIHRoZSBncmFwaCkuCisgICAgICBpZiAobGV2ZWwgIT0gMCkgeworICAgICAgICBjb25zdCBzY29yZV90IGxhc3RfcG9zX2Nvc3QgPQorICAgICAgICAgICAgKG4gPCAxNSkgPyBWUDhCaXRDb3N0KDAsIHByb2Jhc1tiYW5kXVtjdHhdWzBdKSA6IDA7CisgICAgICAgIGNvbnN0IHNjb3JlX3QgbGFzdF9wb3Nfc2NvcmUgPSBSRFNjb3JlVHJlbGxpcyhsYW1iZGEsIGxhc3RfcG9zX2Nvc3QsIDApOworICAgICAgICBjb25zdCBzY29yZV90IHNjb3JlID0gYmVzdF9jdXJfc2NvcmUgKyBsYXN0X3Bvc19zY29yZTsKKyAgICAgICAgaWYgKHNjb3JlIDwgYmVzdF9zY29yZSkgeworICAgICAgICAgIGJlc3Rfc2NvcmUgPSBzY29yZTsKKyAgICAgICAgICBiZXN0X3BhdGhbMF0gPSBuOyAgICAgICAgICAgICAgICAgICAgIC8vIGJlc3QgZW9iIHBvc2l0aW9uCisgICAgICAgICAgYmVzdF9wYXRoWzFdID0gbTsgICAgICAgICAgICAgICAgICAgICAvLyBiZXN0IG5vZGUgaW5kZXgKKyAgICAgICAgICBiZXN0X3BhdGhbMl0gPSBiZXN0X3ByZXY7ICAgICAgICAgICAgIC8vIGJlc3QgcHJlZGVjZXNzb3IKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIEZyZXNoIHN0YXJ0CisgIG1lbXNldChpbiArIGZpcnN0LCAwLCAoMTYgLSBmaXJzdCkgKiBzaXplb2YoKmluKSk7CisgIG1lbXNldChvdXQgKyBmaXJzdCwgMCwgKDE2IC0gZmlyc3QpICogc2l6ZW9mKCpvdXQpKTsKKyAgaWYgKGJlc3RfcGF0aFswXSA9PSAtMSkgeworICAgIHJldHVybiAwOyAgIC8vIHNraXAhCisgIH0KKworICB7CisgICAgLy8gVW53aW5kIHRoZSBiZXN0IHBhdGguCisgICAgLy8gTm90ZTogYmVzdC1wcmV2IG9uIHRlcm1pbmFsIG5vZGUgaXMgbm90IG5lY2Vzc2FyaWx5IGVxdWFsIHRvIHRoZQorICAgIC8vIGJlc3RfcHJldiBmb3Igbm9uLXRlcm1pbmFsLiBTbyB3ZSBwYXRjaCBiZXN0X3BhdGhbMl0gaW4uCisgICAgaW50IG56ID0gMDsKKyAgICBpbnQgYmVzdF9ub2RlID0gYmVzdF9wYXRoWzFdOworICAgIG4gPSBiZXN0X3BhdGhbMF07CisgICAgTk9ERShuLCBiZXN0X25vZGUpLnByZXYgPSBiZXN0X3BhdGhbMl07ICAgLy8gZm9yY2UgYmVzdC1wcmV2IGZvciB0ZXJtaW5hbAorCisgICAgZm9yICg7IG4gPj0gZmlyc3Q7IC0tbikgeworICAgICAgY29uc3QgTm9kZSogY29uc3Qgbm9kZSA9ICZOT0RFKG4sIGJlc3Rfbm9kZSk7CisgICAgICBjb25zdCBpbnQgaiA9IGtaaWd6YWdbbl07CisgICAgICBvdXRbbl0gPSBub2RlLT5zaWduID8gLW5vZGUtPmxldmVsIDogbm9kZS0+bGV2ZWw7CisgICAgICBueiB8PSBub2RlLT5sZXZlbDsKKyAgICAgIGluW2pdID0gb3V0W25dICogbXR4LT5xX1tqXTsKKyAgICAgIGJlc3Rfbm9kZSA9IG5vZGUtPnByZXY7CisgICAgfQorICAgIHJldHVybiAobnogIT0gMCk7CisgIH0KK30KKworI3VuZGVmIE5PREUKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFBlcmZvcm1zOiBkaWZmZXJlbmNlLCB0cmFuc2Zvcm0sIHF1YW50aXplLCBiYWNrLXRyYW5zZm9ybSwgYWRkCisvLyBhbGwgYXQgb25jZS4gT3V0cHV0IGlzIHRoZSByZWNvbnN0cnVjdGVkIGJsb2NrIGluICp5dXZfb3V0LCBhbmQgdGhlCisvLyBxdWFudGl6ZWQgbGV2ZWxzIGluICpsZXZlbHMuCisKK3N0YXRpYyBpbnQgUmVjb25zdHJ1Y3RJbnRyYTE2KFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOE1vZGVTY29yZSogY29uc3QgcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCB5dXZfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGUpIHsKKyAgY29uc3QgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHJlZiA9IGl0LT55dXZfcF8gKyBWUDhJMTZNb2RlT2Zmc2V0c1ttb2RlXTsKKyAgY29uc3QgdWludDhfdCogY29uc3Qgc3JjID0gaXQtPnl1dl9pbl8gKyBZX09GRl9FTkM7CisgIGNvbnN0IFZQOFNlZ21lbnRJbmZvKiBjb25zdCBkcW0gPSAmZW5jLT5kcW1fW2l0LT5tYl8tPnNlZ21lbnRfXTsKKyAgaW50IG56ID0gMDsKKyAgaW50IG47CisgIGludDE2X3QgdG1wWzE2XVsxNl0sIGRjX3RtcFsxNl07CisKKyAgZm9yIChuID0gMDsgbiA8IDE2OyBuICs9IDIpIHsKKyAgICBWUDhGVHJhbnNmb3JtMihzcmMgKyBWUDhTY2FuW25dLCByZWYgKyBWUDhTY2FuW25dLCB0bXBbbl0pOworICB9CisgIFZQOEZUcmFuc2Zvcm1XSFQodG1wWzBdLCBkY190bXApOworICBueiB8PSBWUDhFbmNRdWFudGl6ZUJsb2NrV0hUKGRjX3RtcCwgcmQtPnlfZGNfbGV2ZWxzLCAmZHFtLT55Ml8pIDw8IDI0OworCisgIGlmIChET19UUkVMTElTX0kxNiAmJiBpdC0+ZG9fdHJlbGxpc18pIHsKKyAgICBpbnQgeCwgeTsKKyAgICBWUDhJdGVyYXRvck56VG9CeXRlcyhpdCk7CisgICAgZm9yICh5ID0gMCwgbiA9IDA7IHkgPCA0OyArK3kpIHsKKyAgICAgIGZvciAoeCA9IDA7IHggPCA0OyArK3gsICsrbikgeworICAgICAgICBjb25zdCBpbnQgY3R4ID0gaXQtPnRvcF9uel9beF0gKyBpdC0+bGVmdF9uel9beV07CisgICAgICAgIGNvbnN0IGludCBub25femVybyA9CisgICAgICAgICAgICBUcmVsbGlzUXVhbnRpemVCbG9jayhlbmMsIHRtcFtuXSwgcmQtPnlfYWNfbGV2ZWxzW25dLCBjdHgsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHFtLT55MV8sIGRxbS0+bGFtYmRhX3RyZWxsaXNfaTE2Xyk7CisgICAgICAgIGl0LT50b3BfbnpfW3hdID0gaXQtPmxlZnRfbnpfW3ldID0gbm9uX3plcm87CisgICAgICAgIHJkLT55X2FjX2xldmVsc1tuXVswXSA9IDA7CisgICAgICAgIG56IHw9IG5vbl96ZXJvIDw8IG47CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAobiA9IDA7IG4gPCAxNjsgbiArPSAyKSB7CisgICAgICAvLyBaZXJvLW91dCB0aGUgZmlyc3QgY29lZmYsIHNvIHRoYXQ6IGEpIG56IGlzIGNvcnJlY3QgYmVsb3csIGFuZAorICAgICAgLy8gYikgZmluZGluZyAnbGFzdCcgbm9uLXplcm8gY29lZmZzIGluIFNldFJlc2lkdWFsQ29lZmZzKCkgaXMgc2ltcGxpZmllZC4KKyAgICAgIHRtcFtuXVswXSA9IHRtcFtuICsgMV1bMF0gPSAwOworICAgICAgbnogfD0gVlA4RW5jUXVhbnRpemUyQmxvY2tzKHRtcFtuXSwgcmQtPnlfYWNfbGV2ZWxzW25dLCAmZHFtLT55MV8pIDw8IG47CisgICAgICBhc3NlcnQocmQtPnlfYWNfbGV2ZWxzW24gKyAwXVswXSA9PSAwKTsKKyAgICAgIGFzc2VydChyZC0+eV9hY19sZXZlbHNbbiArIDFdWzBdID09IDApOworICAgIH0KKyAgfQorCisgIC8vIFRyYW5zZm9ybSBiYWNrCisgIFZQOFRyYW5zZm9ybVdIVChkY190bXAsIHRtcFswXSk7CisgIGZvciAobiA9IDA7IG4gPCAxNjsgbiArPSAyKSB7CisgICAgVlA4SVRyYW5zZm9ybShyZWYgKyBWUDhTY2FuW25dLCB0bXBbbl0sIHl1dl9vdXQgKyBWUDhTY2FuW25dLCAxKTsKKyAgfQorCisgIHJldHVybiBuejsKK30KKworc3RhdGljIGludCBSZWNvbnN0cnVjdEludHJhNChWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgbGV2ZWxzWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3Qgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCB5dXZfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kZSkgeworICBjb25zdCBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKKyAgY29uc3QgdWludDhfdCogY29uc3QgcmVmID0gaXQtPnl1dl9wXyArIFZQOEk0TW9kZU9mZnNldHNbbW9kZV07CisgIGNvbnN0IFZQOFNlZ21lbnRJbmZvKiBjb25zdCBkcW0gPSAmZW5jLT5kcW1fW2l0LT5tYl8tPnNlZ21lbnRfXTsKKyAgaW50IG56ID0gMDsKKyAgaW50MTZfdCB0bXBbMTZdOworCisgIFZQOEZUcmFuc2Zvcm0oc3JjLCByZWYsIHRtcCk7CisgIGlmIChET19UUkVMTElTX0k0ICYmIGl0LT5kb190cmVsbGlzXykgeworICAgIGNvbnN0IGludCB4ID0gaXQtPmk0XyAmIDMsIHkgPSBpdC0+aTRfID4+IDI7CisgICAgY29uc3QgaW50IGN0eCA9IGl0LT50b3BfbnpfW3hdICsgaXQtPmxlZnRfbnpfW3ldOworICAgIG56ID0gVHJlbGxpc1F1YW50aXplQmxvY2soZW5jLCB0bXAsIGxldmVscywgY3R4LCAzLCAmZHFtLT55MV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcW0tPmxhbWJkYV90cmVsbGlzX2k0Xyk7CisgIH0gZWxzZSB7CisgICAgbnogPSBWUDhFbmNRdWFudGl6ZUJsb2NrKHRtcCwgbGV2ZWxzLCAmZHFtLT55MV8pOworICB9CisgIFZQOElUcmFuc2Zvcm0ocmVmLCB0bXAsIHl1dl9vdXQsIDApOworICByZXR1cm4gbno7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEQy1lcnJvciBkaWZmdXNpb24KKworLy8gRGlmZnVzaW9uIHdlaWdodHMuIFdlIHVuZGVyLWNvcnJlY3QgYSBiaXQgKDE1LzE2dGggb2YgdGhlIGVycm9yIGlzIGFjdHVhbGx5CisvLyBkaWZmdXNlZCkgdG8gYXZvaWQgJ3JhaW5ib3cnIGNoZXNzYm9hcmQgcGF0dGVybiBvZiBibG9ja3MgYXQgcX49MC4KKyNkZWZpbmUgQzEgNyAgICAvLyBmcmFjdGlvbiBvZiBlcnJvciBzZW50IHRvIHRoZSA0eDQgYmxvY2sgYmVsb3cKKyNkZWZpbmUgQzIgOCAgICAvLyBmcmFjdGlvbiBvZiBlcnJvciBzZW50IHRvIHRoZSA0eDQgYmxvY2sgb24gdGhlIHJpZ2h0CisjZGVmaW5lIERTSElGVCA0CisjZGVmaW5lIERTQ0FMRSAxICAgLy8gc3RvcmFnZSBkZXNjYWxpbmcsIG5lZWRlZCB0byBtYWtlIHRoZSBlcnJvciBmaXQgaW50OF90CisKKy8vIFF1YW50aXplIGFzIHVzdWFsLCBidXQgYWxzbyBjb21wdXRlIGFuZCByZXR1cm4gdGhlIHF1YW50aXphdGlvbiBlcnJvci4KKy8vIEVycm9yIGlzIGFscmVhZHkgZGl2aWRlZCBieSBEU0hJRlQuCitzdGF0aWMgaW50IFF1YW50aXplU2luZ2xlKGludDE2X3QqIGNvbnN0IHYsIGNvbnN0IFZQOE1hdHJpeCogY29uc3QgbXR4KSB7CisgIGludCBWID0gKnY7CisgIGNvbnN0IGludCBzaWduID0gKFYgPCAwKTsKKyAgaWYgKHNpZ24pIFYgPSAtVjsKKyAgaWYgKFYgPiAoaW50KW10eC0+enRocmVzaF9bMF0pIHsKKyAgICBjb25zdCBpbnQgcVYgPSBRVUFOVERJVihWLCBtdHgtPmlxX1swXSwgbXR4LT5iaWFzX1swXSkgKiBtdHgtPnFfWzBdOworICAgIGNvbnN0IGludCBlcnIgPSAoViAtIHFWKTsKKyAgICAqdiA9IHNpZ24gPyAtcVYgOiBxVjsKKyAgICByZXR1cm4gKHNpZ24gPyAtZXJyIDogZXJyKSA+PiBEU0NBTEU7CisgIH0KKyAgKnYgPSAwOworICByZXR1cm4gKHNpZ24gPyAtViA6IFYpID4+IERTQ0FMRTsKK30KKworc3RhdGljIHZvaWQgQ29ycmVjdERDVmFsdWVzKGNvbnN0IFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhNYXRyaXgqIGNvbnN0IG10eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IHRtcFtdWzE2XSwgVlA4TW9kZVNjb3JlKiBjb25zdCByZCkgeworICAvLyAgICAgICAgIHwgdG9wWzBdIHwgdG9wWzFdCisgIC8vIC0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLQorICAvLyBsZWZ0WzBdIHwgdG1wWzBdICAgdG1wWzFdICA8LT4gICBlcnIwIGVycjEKKyAgLy8gbGVmdFsxXSB8IHRtcFsyXSAgIHRtcFszXSAgICAgICAgZXJyMiBlcnIzCisgIC8vCisgIC8vIEZpbmFsIGVycm9ycyB7ZXJyMSxlcnIyLGVycjN9IGFyZSBwcmVzZXJ2ZWQgYW5kIGxhdGVyIHJlc3RvcmVkCisgIC8vIGFzIHRvcFtdL2xlZnRbXSBvbiB0aGUgbmV4dCBibG9jay4KKyAgaW50IGNoOworICBmb3IgKGNoID0gMDsgY2ggPD0gMTsgKytjaCkgeworICAgIGNvbnN0IGludDhfdCogY29uc3QgdG9wID0gaXQtPnRvcF9kZXJyX1tpdC0+eF9dW2NoXTsKKyAgICBjb25zdCBpbnQ4X3QqIGNvbnN0IGxlZnQgPSBpdC0+bGVmdF9kZXJyX1tjaF07CisgICAgaW50MTZfdCAoKiBjb25zdCBjKVsxNl0gPSAmdG1wW2NoICogNF07CisgICAgaW50IGVycjAsIGVycjEsIGVycjIsIGVycjM7CisgICAgY1swXVswXSArPSAoQzEgKiB0b3BbMF0gKyBDMiAqIGxlZnRbMF0pID4+IChEU0hJRlQgLSBEU0NBTEUpOworICAgIGVycjAgPSBRdWFudGl6ZVNpbmdsZSgmY1swXVswXSwgbXR4KTsKKyAgICBjWzFdWzBdICs9IChDMSAqIHRvcFsxXSArIEMyICogZXJyMCkgPj4gKERTSElGVCAtIERTQ0FMRSk7CisgICAgZXJyMSA9IFF1YW50aXplU2luZ2xlKCZjWzFdWzBdLCBtdHgpOworICAgIGNbMl1bMF0gKz0gKEMxICogZXJyMCArIEMyICogbGVmdFsxXSkgPj4gKERTSElGVCAtIERTQ0FMRSk7CisgICAgZXJyMiA9IFF1YW50aXplU2luZ2xlKCZjWzJdWzBdLCBtdHgpOworICAgIGNbM11bMF0gKz0gKEMxICogZXJyMSArIEMyICogZXJyMikgPj4gKERTSElGVCAtIERTQ0FMRSk7CisgICAgZXJyMyA9IFF1YW50aXplU2luZ2xlKCZjWzNdWzBdLCBtdHgpOworICAgIC8vIGVycm9yICdlcnInIGlzIGJvdW5kZWQgYnkgbXR4LT5xX1swXSB3aGljaCBpcyAxMzIgYXQgbWF4LiBIZW5jZQorICAgIC8vIGVyciA+PiBEU0NBTEUgd2lsbCBmaXQgaW4gYW4gaW50OF90IHR5cGUgaWYgRFNDQUxFPj0xLgorICAgIGFzc2VydChhYnMoZXJyMSkgPD0gMTI3ICYmIGFicyhlcnIyKSA8PSAxMjcgJiYgYWJzKGVycjMpIDw9IDEyNyk7CisgICAgcmQtPmRlcnJbY2hdWzBdID0gKGludDhfdCllcnIxOworICAgIHJkLT5kZXJyW2NoXVsxXSA9IChpbnQ4X3QpZXJyMjsKKyAgICByZC0+ZGVycltjaF1bMl0gPSAoaW50OF90KWVycjM7CisgIH0KK30KKworc3RhdGljIHZvaWQgU3RvcmVEaWZmdXNpb25FcnJvcnMoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TW9kZVNjb3JlKiBjb25zdCByZCkgeworICBpbnQgY2g7CisgIGZvciAoY2ggPSAwOyBjaCA8PSAxOyArK2NoKSB7CisgICAgaW50OF90KiBjb25zdCB0b3AgPSBpdC0+dG9wX2RlcnJfW2l0LT54X11bY2hdOworICAgIGludDhfdCogY29uc3QgbGVmdCA9IGl0LT5sZWZ0X2RlcnJfW2NoXTsKKyAgICBsZWZ0WzBdID0gcmQtPmRlcnJbY2hdWzBdOyAgICAgICAgICAgIC8vIHJlc3RvcmUgZXJyMQorICAgIGxlZnRbMV0gPSAzICogcmQtPmRlcnJbY2hdWzJdID4+IDI7ICAgLy8gICAgIC4uLiAzLzR0aCBvZiBlcnIzCisgICAgdG9wWzBdICA9IHJkLT5kZXJyW2NoXVsxXTsgICAgICAgICAgICAvLyAgICAgLi4uIGVycjIKKyAgICB0b3BbMV0gID0gcmQtPmRlcnJbY2hdWzJdIC0gbGVmdFsxXTsgIC8vICAgICAuLi4gMS80dGggb2YgZXJyMy4KKyAgfQorfQorCisjdW5kZWYgQzEKKyN1bmRlZiBDMgorI3VuZGVmIERTSElGVAorI3VuZGVmIERTQ0FMRQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50IFJlY29uc3RydWN0VVYoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBWUDhNb2RlU2NvcmUqIGNvbnN0IHJkLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IHl1dl9vdXQsIGludCBtb2RlKSB7CisgIGNvbnN0IFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOworICBjb25zdCB1aW50OF90KiBjb25zdCByZWYgPSBpdC0+eXV2X3BfICsgVlA4VVZNb2RlT2Zmc2V0c1ttb2RlXTsKKyAgY29uc3QgdWludDhfdCogY29uc3Qgc3JjID0gaXQtPnl1dl9pbl8gKyBVX09GRl9FTkM7CisgIGNvbnN0IFZQOFNlZ21lbnRJbmZvKiBjb25zdCBkcW0gPSAmZW5jLT5kcW1fW2l0LT5tYl8tPnNlZ21lbnRfXTsKKyAgaW50IG56ID0gMDsKKyAgaW50IG47CisgIGludDE2X3QgdG1wWzhdWzE2XTsKKworICBmb3IgKG4gPSAwOyBuIDwgODsgbiArPSAyKSB7CisgICAgVlA4RlRyYW5zZm9ybTIoc3JjICsgVlA4U2NhblVWW25dLCByZWYgKyBWUDhTY2FuVVZbbl0sIHRtcFtuXSk7CisgIH0KKyAgaWYgKGl0LT50b3BfZGVycl8gIT0gTlVMTCkgQ29ycmVjdERDVmFsdWVzKGl0LCAmZHFtLT51dl8sIHRtcCwgcmQpOworCisgIGlmIChET19UUkVMTElTX1VWICYmIGl0LT5kb190cmVsbGlzXykgeworICAgIGludCBjaCwgeCwgeTsKKyAgICBmb3IgKGNoID0gMCwgbiA9IDA7IGNoIDw9IDI7IGNoICs9IDIpIHsKKyAgICAgIGZvciAoeSA9IDA7IHkgPCAyOyArK3kpIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDI7ICsreCwgKytuKSB7CisgICAgICAgICAgY29uc3QgaW50IGN0eCA9IGl0LT50b3BfbnpfWzQgKyBjaCArIHhdICsgaXQtPmxlZnRfbnpfWzQgKyBjaCArIHldOworICAgICAgICAgIGNvbnN0IGludCBub25femVybyA9CisgICAgICAgICAgICAgIFRyZWxsaXNRdWFudGl6ZUJsb2NrKGVuYywgdG1wW25dLCByZC0+dXZfbGV2ZWxzW25dLCBjdHgsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkcW0tPnV2XywgZHFtLT5sYW1iZGFfdHJlbGxpc191dl8pOworICAgICAgICAgIGl0LT50b3BfbnpfWzQgKyBjaCArIHhdID0gaXQtPmxlZnRfbnpfWzQgKyBjaCArIHldID0gbm9uX3plcm87CisgICAgICAgICAgbnogfD0gbm9uX3plcm8gPDwgbjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKG4gPSAwOyBuIDwgODsgbiArPSAyKSB7CisgICAgICBueiB8PSBWUDhFbmNRdWFudGl6ZTJCbG9ja3ModG1wW25dLCByZC0+dXZfbGV2ZWxzW25dLCAmZHFtLT51dl8pIDw8IG47CisgICAgfQorICB9CisKKyAgZm9yIChuID0gMDsgbiA8IDg7IG4gKz0gMikgeworICAgIFZQOElUcmFuc2Zvcm0ocmVmICsgVlA4U2NhblVWW25dLCB0bXBbbl0sIHl1dl9vdXQgKyBWUDhTY2FuVVZbbl0sIDEpOworICB9CisgIHJldHVybiAobnogPDwgMTYpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUkQtb3B0IGRlY2lzaW9uLiBSZWNvbnN0cnVjdCBlYWNoIG1vZGVzLCBldmFsdWUgZGlzdG9ydGlvbiBhbmQgYml0LWNvc3QuCisvLyBQaWNrIHRoZSBtb2RlIGlzIGxvd2VyIFJELWNvc3QgPSBSYXRlICsgbGFtYmRhICogRGlzdG9ydGlvbi4KKworc3RhdGljIHZvaWQgU3RvcmVNYXhEZWx0YShWUDhTZWdtZW50SW5mbyogY29uc3QgZHFtLCBjb25zdCBpbnQxNl90IERDc1sxNl0pIHsKKyAgLy8gV2UgbG9vayBhdCB0aGUgZmlyc3QgdGhyZWUgQUMgY29lZmZpY2llbnRzIHRvIGRldGVybWluZSB3aGF0IGlzIHRoZSBhdmVyYWdlCisgIC8vIGRlbHRhIGJldHdlZW4gZWFjaCBzdWItNHg0IGJsb2NrLgorICBjb25zdCBpbnQgdjAgPSBhYnMoRENzWzFdKTsKKyAgY29uc3QgaW50IHYxID0gYWJzKERDc1syXSk7CisgIGNvbnN0IGludCB2MiA9IGFicyhEQ3NbNF0pOworICBpbnQgbWF4X3YgPSAodjEgPiB2MCkgPyB2MSA6IHYwOworICBtYXhfdiA9ICh2MiA+IG1heF92KSA/IHYyIDogbWF4X3Y7CisgIGlmIChtYXhfdiA+IGRxbS0+bWF4X2VkZ2VfKSBkcW0tPm1heF9lZGdlXyA9IG1heF92OworfQorCitzdGF0aWMgdm9pZCBTd2FwTW9kZVNjb3JlKFZQOE1vZGVTY29yZSoqIGEsIFZQOE1vZGVTY29yZSoqIGIpIHsKKyAgVlA4TW9kZVNjb3JlKiBjb25zdCB0bXAgPSAqYTsKKyAgKmEgPSAqYjsKKyAgKmIgPSB0bXA7Cit9CisKK3N0YXRpYyB2b2lkIFN3YXBQdHIodWludDhfdCoqIGEsIHVpbnQ4X3QqKiBiKSB7CisgIHVpbnQ4X3QqIGNvbnN0IHRtcCA9ICphOworICAqYSA9ICpiOworICAqYiA9IHRtcDsKK30KKworc3RhdGljIHZvaWQgU3dhcE91dChWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKKyAgU3dhcFB0cigmaXQtPnl1dl9vdXRfLCAmaXQtPnl1dl9vdXQyXyk7Cit9CisKK3N0YXRpYyBzY29yZV90IElzRmxhdChjb25zdCBpbnQxNl90KiBsZXZlbHMsIGludCBudW1fYmxvY2tzLCBzY29yZV90IHRocmVzaCkgeworICBzY29yZV90IHNjb3JlID0gMDsKKyAgd2hpbGUgKG51bV9ibG9ja3MtLSA+IDApIHsgICAgICAvLyBUT0RPKHNrYWwpOiByZWZpbmUgcG9zaXRpb25hbCBzY29yaW5nPworICAgIGludCBpOworICAgIGZvciAoaSA9IDE7IGkgPCAxNjsgKytpKSB7ICAgIC8vIG9taXQgREMsIHdlJ3JlIG9ubHkgaW50ZXJlc3RlZCBpbiBBQworICAgICAgc2NvcmUgKz0gKGxldmVsc1tpXSAhPSAwKTsKKyAgICAgIGlmIChzY29yZSA+IHRocmVzaCkgcmV0dXJuIDA7CisgICAgfQorICAgIGxldmVscyArPSAxNjsKKyAgfQorICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgUGlja0Jlc3RJbnRyYTE2KFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgVlA4TW9kZVNjb3JlKiByZCkgeworICBjb25zdCBpbnQga051bUJsb2NrcyA9IDE2OworICBWUDhTZWdtZW50SW5mbyogY29uc3QgZHFtID0gJml0LT5lbmNfLT5kcW1fW2l0LT5tYl8tPnNlZ21lbnRfXTsKKyAgY29uc3QgaW50IGxhbWJkYSA9IGRxbS0+bGFtYmRhX2kxNl87CisgIGNvbnN0IGludCB0bGFtYmRhID0gZHFtLT50bGFtYmRhXzsKKyAgY29uc3QgdWludDhfdCogY29uc3Qgc3JjID0gaXQtPnl1dl9pbl8gKyBZX09GRl9FTkM7CisgIFZQOE1vZGVTY29yZSByZF90bXA7CisgIFZQOE1vZGVTY29yZSogcmRfY3VyID0gJnJkX3RtcDsKKyAgVlA4TW9kZVNjb3JlKiByZF9iZXN0ID0gcmQ7CisgIGludCBtb2RlOworCisgIHJkLT5tb2RlX2kxNiA9IC0xOworICBmb3IgKG1vZGUgPSAwOyBtb2RlIDwgTlVNX1BSRURfTU9ERVM7ICsrbW9kZSkgeworICAgIHVpbnQ4X3QqIGNvbnN0IHRtcF9kc3QgPSBpdC0+eXV2X291dDJfICsgWV9PRkZfRU5DOyAgLy8gc2NyYXRjaCBidWZmZXIKKyAgICByZF9jdXItPm1vZGVfaTE2ID0gbW9kZTsKKworICAgIC8vIFJlY29uc3RydWN0CisgICAgcmRfY3VyLT5ueiA9IFJlY29uc3RydWN0SW50cmExNihpdCwgcmRfY3VyLCB0bXBfZHN0LCBtb2RlKTsKKworICAgIC8vIE1lYXN1cmUgUkQtc2NvcmUKKyAgICByZF9jdXItPkQgPSBWUDhTU0UxNngxNihzcmMsIHRtcF9kc3QpOworICAgIHJkX2N1ci0+U0QgPQorICAgICAgICB0bGFtYmRhID8gTVVMVF84Qih0bGFtYmRhLCBWUDhURGlzdG8xNngxNihzcmMsIHRtcF9kc3QsIGtXZWlnaHRZKSkgOiAwOworICAgIHJkX2N1ci0+SCA9IFZQOEZpeGVkQ29zdHNJMTZbbW9kZV07CisgICAgcmRfY3VyLT5SID0gVlA4R2V0Q29zdEx1bWExNihpdCwgcmRfY3VyKTsKKyAgICBpZiAobW9kZSA+IDAgJiYKKyAgICAgICAgSXNGbGF0KHJkX2N1ci0+eV9hY19sZXZlbHNbMF0sIGtOdW1CbG9ja3MsIEZMQVRORVNTX0xJTUlUX0kxNikpIHsKKyAgICAgIC8vIHBlbmFsdHkgdG8gYXZvaWQgZmxhdCBhcmVhIHRvIGJlIG1pc3ByZWRpY3RlZCBieSBjb21wbGV4IG1vZGUKKyAgICAgIHJkX2N1ci0+UiArPSBGTEFUTkVTU19QRU5BTFRZICoga051bUJsb2NrczsKKyAgICB9CisKKyAgICAvLyBTaW5jZSB3ZSBhbHdheXMgZXhhbWluZSBJbnRyYTE2IGZpcnN0LCB3ZSBjYW4gb3ZlcndyaXRlICpyZCBkaXJlY3RseS4KKyAgICBTZXRSRFNjb3JlKGxhbWJkYSwgcmRfY3VyKTsKKyAgICBpZiAobW9kZSA9PSAwIHx8IHJkX2N1ci0+c2NvcmUgPCByZF9iZXN0LT5zY29yZSkgeworICAgICAgU3dhcE1vZGVTY29yZSgmcmRfY3VyLCAmcmRfYmVzdCk7CisgICAgICBTd2FwT3V0KGl0KTsKKyAgICB9CisgIH0KKyAgaWYgKHJkX2Jlc3QgIT0gcmQpIHsKKyAgICBtZW1jcHkocmQsIHJkX2Jlc3QsIHNpemVvZigqcmQpKTsKKyAgfQorICBTZXRSRFNjb3JlKGRxbS0+bGFtYmRhX21vZGVfLCByZCk7ICAgLy8gZmluYWxpemUgc2NvcmUgZm9yIG1vZGUgZGVjaXNpb24uCisgIFZQOFNldEludHJhMTZNb2RlKGl0LCByZC0+bW9kZV9pMTYpOworCisgIC8vIHdlIGhhdmUgYSBibG9ja3kgbWFjcm9ibG9jayAob25seSBEQ3MgYXJlIG5vbi16ZXJvKSB3aXRoIGZhaXJseSBoaWdoCisgIC8vIGRpc3RvcnRpb24sIHJlY29yZCBtYXggZGVsdGEgc28gd2UgY2FuIGxhdGVyIGFkanVzdCB0aGUgbWluaW1hbCBmaWx0ZXJpbmcKKyAgLy8gc3RyZW5ndGggbmVlZGVkIHRvIHNtb290aCB0aGVzZSBibG9ja3Mgb3V0LgorICBpZiAoKHJkLT5ueiAmIDB4MTAwZmZmZikgPT0gMHgxMDAwMDAwICYmIHJkLT5EID4gZHFtLT5taW5fZGlzdG9fKSB7CisgICAgU3RvcmVNYXhEZWx0YShkcW0sIHJkLT55X2RjX2xldmVscyk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gcmV0dXJuIHRoZSBjb3N0IGFycmF5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN1cnJvdW5kaW5nIHByZWRpY3Rpb24gbW9kZXMuCitzdGF0aWMgY29uc3QgdWludDE2X3QqIEdldENvc3RNb2RlSTQoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgbW9kZXNbMTZdKSB7CisgIGNvbnN0IGludCBwcmVkc193ID0gaXQtPmVuY18tPnByZWRzX3dfOworICBjb25zdCBpbnQgeCA9IChpdC0+aTRfICYgMyksIHkgPSBpdC0+aTRfID4+IDI7CisgIGNvbnN0IGludCBsZWZ0ID0gKHggPT0gMCkgPyBpdC0+cHJlZHNfW3kgKiBwcmVkc193IC0gMV0gOiBtb2Rlc1tpdC0+aTRfIC0gMV07CisgIGNvbnN0IGludCB0b3AgPSAoeSA9PSAwKSA/IGl0LT5wcmVkc19bLXByZWRzX3cgKyB4XSA6IG1vZGVzW2l0LT5pNF8gLSA0XTsKKyAgcmV0dXJuIFZQOEZpeGVkQ29zdHNJNFt0b3BdW2xlZnRdOworfQorCitzdGF0aWMgaW50IFBpY2tCZXN0SW50cmE0KFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgVlA4TW9kZVNjb3JlKiBjb25zdCByZCkgeworICBjb25zdCBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKKyAgY29uc3QgVlA4U2VnbWVudEluZm8qIGNvbnN0IGRxbSA9ICZlbmMtPmRxbV9baXQtPm1iXy0+c2VnbWVudF9dOworICBjb25zdCBpbnQgbGFtYmRhID0gZHFtLT5sYW1iZGFfaTRfOworICBjb25zdCBpbnQgdGxhbWJkYSA9IGRxbS0+dGxhbWJkYV87CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHNyYzAgPSBpdC0+eXV2X2luXyArIFlfT0ZGX0VOQzsKKyAgdWludDhfdCogY29uc3QgYmVzdF9ibG9ja3MgPSBpdC0+eXV2X291dDJfICsgWV9PRkZfRU5DOworICBpbnQgdG90YWxfaGVhZGVyX2JpdHMgPSAwOworICBWUDhNb2RlU2NvcmUgcmRfYmVzdDsKKworICBpZiAoZW5jLT5tYXhfaTRfaGVhZGVyX2JpdHNfID09IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIEluaXRTY29yZSgmcmRfYmVzdCk7CisgIHJkX2Jlc3QuSCA9IDIxMTsgIC8vICcyMTEnIGlzIHRoZSB2YWx1ZSBvZiBWUDhCaXRDb3N0KDAsIDE0NSkKKyAgU2V0UkRTY29yZShkcW0tPmxhbWJkYV9tb2RlXywgJnJkX2Jlc3QpOworICBWUDhJdGVyYXRvclN0YXJ0STQoaXQpOworICBkbyB7CisgICAgY29uc3QgaW50IGtOdW1CbG9ja3MgPSAxOworICAgIFZQOE1vZGVTY29yZSByZF9pNDsKKyAgICBpbnQgbW9kZTsKKyAgICBpbnQgYmVzdF9tb2RlID0gLTE7CisgICAgY29uc3QgdWludDhfdCogY29uc3Qgc3JjID0gc3JjMCArIFZQOFNjYW5baXQtPmk0X107CisgICAgY29uc3QgdWludDE2X3QqIGNvbnN0IG1vZGVfY29zdHMgPSBHZXRDb3N0TW9kZUk0KGl0LCByZC0+bW9kZXNfaTQpOworICAgIHVpbnQ4X3QqIGJlc3RfYmxvY2sgPSBiZXN0X2Jsb2NrcyArIFZQOFNjYW5baXQtPmk0X107CisgICAgdWludDhfdCogdG1wX2RzdCA9IGl0LT55dXZfcF8gKyBJNFRNUDsgICAgLy8gc2NyYXRjaCBidWZmZXIuCisKKyAgICBJbml0U2NvcmUoJnJkX2k0KTsKKyAgICBWUDhNYWtlSW50cmE0UHJlZHMoaXQpOworICAgIGZvciAobW9kZSA9IDA7IG1vZGUgPCBOVU1fQk1PREVTOyArK21vZGUpIHsKKyAgICAgIFZQOE1vZGVTY29yZSByZF90bXA7CisgICAgICBpbnQxNl90IHRtcF9sZXZlbHNbMTZdOworCisgICAgICAvLyBSZWNvbnN0cnVjdAorICAgICAgcmRfdG1wLm56ID0KKyAgICAgICAgICBSZWNvbnN0cnVjdEludHJhNChpdCwgdG1wX2xldmVscywgc3JjLCB0bXBfZHN0LCBtb2RlKSA8PCBpdC0+aTRfOworCisgICAgICAvLyBDb21wdXRlIFJELXNjb3JlCisgICAgICByZF90bXAuRCA9IFZQOFNTRTR4NChzcmMsIHRtcF9kc3QpOworICAgICAgcmRfdG1wLlNEID0KKyAgICAgICAgICB0bGFtYmRhID8gTVVMVF84Qih0bGFtYmRhLCBWUDhURGlzdG80eDQoc3JjLCB0bXBfZHN0LCBrV2VpZ2h0WSkpCisgICAgICAgICAgICAgICAgICA6IDA7CisgICAgICByZF90bXAuSCA9IG1vZGVfY29zdHNbbW9kZV07CisKKyAgICAgIC8vIEFkZCBmbGF0bmVzcyBwZW5hbHR5CisgICAgICBpZiAobW9kZSA+IDAgJiYgSXNGbGF0KHRtcF9sZXZlbHMsIGtOdW1CbG9ja3MsIEZMQVRORVNTX0xJTUlUX0k0KSkgeworICAgICAgICByZF90bXAuUiA9IEZMQVRORVNTX1BFTkFMVFkgKiBrTnVtQmxvY2tzOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmRfdG1wLlIgPSAwOworICAgICAgfQorCisgICAgICAvLyBlYXJseS1vdXQgY2hlY2sKKyAgICAgIFNldFJEU2NvcmUobGFtYmRhLCAmcmRfdG1wKTsKKyAgICAgIGlmIChiZXN0X21vZGUgPj0gMCAmJiByZF90bXAuc2NvcmUgPj0gcmRfaTQuc2NvcmUpIGNvbnRpbnVlOworCisgICAgICAvLyBmaW5pc2ggY29tcHV0aW5nIHNjb3JlCisgICAgICByZF90bXAuUiArPSBWUDhHZXRDb3N0THVtYTQoaXQsIHRtcF9sZXZlbHMpOworICAgICAgU2V0UkRTY29yZShsYW1iZGEsICZyZF90bXApOworCisgICAgICBpZiAoYmVzdF9tb2RlIDwgMCB8fCByZF90bXAuc2NvcmUgPCByZF9pNC5zY29yZSkgeworICAgICAgICBDb3B5U2NvcmUoJnJkX2k0LCAmcmRfdG1wKTsKKyAgICAgICAgYmVzdF9tb2RlID0gbW9kZTsKKyAgICAgICAgU3dhcFB0cigmdG1wX2RzdCwgJmJlc3RfYmxvY2spOworICAgICAgICBtZW1jcHkocmRfYmVzdC55X2FjX2xldmVsc1tpdC0+aTRfXSwgdG1wX2xldmVscywKKyAgICAgICAgICAgICAgIHNpemVvZihyZF9iZXN0LnlfYWNfbGV2ZWxzW2l0LT5pNF9dKSk7CisgICAgICB9CisgICAgfQorICAgIFNldFJEU2NvcmUoZHFtLT5sYW1iZGFfbW9kZV8sICZyZF9pNCk7CisgICAgQWRkU2NvcmUoJnJkX2Jlc3QsICZyZF9pNCk7CisgICAgaWYgKHJkX2Jlc3Quc2NvcmUgPj0gcmQtPnNjb3JlKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgdG90YWxfaGVhZGVyX2JpdHMgKz0gKGludClyZF9pNC5IOyAgIC8vIDwtIGVxdWFsIHRvIG1vZGVfY29zdHNbYmVzdF9tb2RlXTsKKyAgICBpZiAodG90YWxfaGVhZGVyX2JpdHMgPiBlbmMtPm1heF9pNF9oZWFkZXJfYml0c18pIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAvLyBDb3B5IHNlbGVjdGVkIHNhbXBsZXMgaWYgbm90IGluIHRoZSByaWdodCBwbGFjZSBhbHJlYWR5LgorICAgIGlmIChiZXN0X2Jsb2NrICE9IGJlc3RfYmxvY2tzICsgVlA4U2NhbltpdC0+aTRfXSkgeworICAgICAgVlA4Q29weTR4NChiZXN0X2Jsb2NrLCBiZXN0X2Jsb2NrcyArIFZQOFNjYW5baXQtPmk0X10pOworICAgIH0KKyAgICByZC0+bW9kZXNfaTRbaXQtPmk0X10gPSBiZXN0X21vZGU7CisgICAgaXQtPnRvcF9uel9baXQtPmk0XyAmIDNdID0gaXQtPmxlZnRfbnpfW2l0LT5pNF8gPj4gMl0gPSAocmRfaTQubnogPyAxIDogMCk7CisgIH0gd2hpbGUgKFZQOEl0ZXJhdG9yUm90YXRlSTQoaXQsIGJlc3RfYmxvY2tzKSk7CisKKyAgLy8gZmluYWxpemUgc3RhdGUKKyAgQ29weVNjb3JlKHJkLCAmcmRfYmVzdCk7CisgIFZQOFNldEludHJhNE1vZGUoaXQsIHJkLT5tb2Rlc19pNCk7CisgIFN3YXBPdXQoaXQpOworICBtZW1jcHkocmQtPnlfYWNfbGV2ZWxzLCByZF9iZXN0LnlfYWNfbGV2ZWxzLCBzaXplb2YocmQtPnlfYWNfbGV2ZWxzKSk7CisgIHJldHVybiAxOyAgIC8vIHNlbGVjdCBpbnRyYTR4NCBvdmVyIGludHJhMTZ4MTYKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgUGlja0Jlc3RVVihWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsIFZQOE1vZGVTY29yZSogY29uc3QgcmQpIHsKKyAgY29uc3QgaW50IGtOdW1CbG9ja3MgPSA4OworICBjb25zdCBWUDhTZWdtZW50SW5mbyogY29uc3QgZHFtID0gJml0LT5lbmNfLT5kcW1fW2l0LT5tYl8tPnNlZ21lbnRfXTsKKyAgY29uc3QgaW50IGxhbWJkYSA9IGRxbS0+bGFtYmRhX3V2XzsKKyAgY29uc3QgdWludDhfdCogY29uc3Qgc3JjID0gaXQtPnl1dl9pbl8gKyBVX09GRl9FTkM7CisgIHVpbnQ4X3QqIHRtcF9kc3QgPSBpdC0+eXV2X291dDJfICsgVV9PRkZfRU5DOyAgLy8gc2NyYXRjaCBidWZmZXIKKyAgdWludDhfdCogZHN0MCA9IGl0LT55dXZfb3V0XyArIFVfT0ZGX0VOQzsKKyAgdWludDhfdCogZHN0ID0gZHN0MDsKKyAgVlA4TW9kZVNjb3JlIHJkX2Jlc3Q7CisgIGludCBtb2RlOworCisgIHJkLT5tb2RlX3V2ID0gLTE7CisgIEluaXRTY29yZSgmcmRfYmVzdCk7CisgIGZvciAobW9kZSA9IDA7IG1vZGUgPCBOVU1fUFJFRF9NT0RFUzsgKyttb2RlKSB7CisgICAgVlA4TW9kZVNjb3JlIHJkX3V2OworCisgICAgLy8gUmVjb25zdHJ1Y3QKKyAgICByZF91di5ueiA9IFJlY29uc3RydWN0VVYoaXQsICZyZF91diwgdG1wX2RzdCwgbW9kZSk7CisKKyAgICAvLyBDb21wdXRlIFJELXNjb3JlCisgICAgcmRfdXYuRCAgPSBWUDhTU0UxNng4KHNyYywgdG1wX2RzdCk7CisgICAgcmRfdXYuU0QgPSAwOyAgICAvLyBub3QgY2FsbGluZyBURGlzdG8gaGVyZTogaXQgdGVuZHMgdG8gZmxhdHRlbiBhcmVhcy4KKyAgICByZF91di5IICA9IFZQOEZpeGVkQ29zdHNVVlttb2RlXTsKKyAgICByZF91di5SICA9IFZQOEdldENvc3RVVihpdCwgJnJkX3V2KTsKKyAgICBpZiAobW9kZSA+IDAgJiYgSXNGbGF0KHJkX3V2LnV2X2xldmVsc1swXSwga051bUJsb2NrcywgRkxBVE5FU1NfTElNSVRfVVYpKSB7CisgICAgICByZF91di5SICs9IEZMQVRORVNTX1BFTkFMVFkgKiBrTnVtQmxvY2tzOworICAgIH0KKworICAgIFNldFJEU2NvcmUobGFtYmRhLCAmcmRfdXYpOworICAgIGlmIChtb2RlID09IDAgfHwgcmRfdXYuc2NvcmUgPCByZF9iZXN0LnNjb3JlKSB7CisgICAgICBDb3B5U2NvcmUoJnJkX2Jlc3QsICZyZF91dik7CisgICAgICByZC0+bW9kZV91diA9IG1vZGU7CisgICAgICBtZW1jcHkocmQtPnV2X2xldmVscywgcmRfdXYudXZfbGV2ZWxzLCBzaXplb2YocmQtPnV2X2xldmVscykpOworICAgICAgaWYgKGl0LT50b3BfZGVycl8gIT0gTlVMTCkgeworICAgICAgICBtZW1jcHkocmQtPmRlcnIsIHJkX3V2LmRlcnIsIHNpemVvZihyZF91di5kZXJyKSk7CisgICAgICB9CisgICAgICBTd2FwUHRyKCZkc3QsICZ0bXBfZHN0KTsKKyAgICB9CisgIH0KKyAgVlA4U2V0SW50cmFVVk1vZGUoaXQsIHJkLT5tb2RlX3V2KTsKKyAgQWRkU2NvcmUocmQsICZyZF9iZXN0KTsKKyAgaWYgKGRzdCAhPSBkc3QwKSB7ICAgLy8gY29weSAxNng4IGJsb2NrIGlmIG5lZWRlZAorICAgIFZQOENvcHkxNng4KGRzdCwgZHN0MCk7CisgIH0KKyAgaWYgKGl0LT50b3BfZGVycl8gIT0gTlVMTCkgeyAgLy8gc3RvcmUgZGlmZnVzaW9uIGVycm9ycyBmb3IgbmV4dCBibG9jaworICAgIFN0b3JlRGlmZnVzaW9uRXJyb3JzKGl0LCByZCk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZpbmFsIHJlY29uc3RydWN0aW9uIGFuZCBxdWFudGl6YXRpb24uCisKK3N0YXRpYyB2b2lkIFNpbXBsZVF1YW50aXplKFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgVlA4TW9kZVNjb3JlKiBjb25zdCByZCkgeworICBjb25zdCBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKKyAgY29uc3QgaW50IGlzX2kxNiA9IChpdC0+bWJfLT50eXBlXyA9PSAxKTsKKyAgaW50IG56ID0gMDsKKworICBpZiAoaXNfaTE2KSB7CisgICAgbnogPSBSZWNvbnN0cnVjdEludHJhMTYoaXQsIHJkLCBpdC0+eXV2X291dF8gKyBZX09GRl9FTkMsIGl0LT5wcmVkc19bMF0pOworICB9IGVsc2UgeworICAgIFZQOEl0ZXJhdG9yU3RhcnRJNChpdCk7CisgICAgZG8geworICAgICAgY29uc3QgaW50IG1vZGUgPQorICAgICAgICAgIGl0LT5wcmVkc19bKGl0LT5pNF8gJiAzKSArIChpdC0+aTRfID4+IDIpICogZW5jLT5wcmVkc193X107CisgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBzcmMgPSBpdC0+eXV2X2luXyArIFlfT0ZGX0VOQyArIFZQOFNjYW5baXQtPmk0X107CisgICAgICB1aW50OF90KiBjb25zdCBkc3QgPSBpdC0+eXV2X291dF8gKyBZX09GRl9FTkMgKyBWUDhTY2FuW2l0LT5pNF9dOworICAgICAgVlA4TWFrZUludHJhNFByZWRzKGl0KTsKKyAgICAgIG56IHw9IFJlY29uc3RydWN0SW50cmE0KGl0LCByZC0+eV9hY19sZXZlbHNbaXQtPmk0X10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMsIGRzdCwgbW9kZSkgPDwgaXQtPmk0XzsKKyAgICB9IHdoaWxlIChWUDhJdGVyYXRvclJvdGF0ZUk0KGl0LCBpdC0+eXV2X291dF8gKyBZX09GRl9FTkMpKTsKKyAgfQorCisgIG56IHw9IFJlY29uc3RydWN0VVYoaXQsIHJkLCBpdC0+eXV2X291dF8gKyBVX09GRl9FTkMsIGl0LT5tYl8tPnV2X21vZGVfKTsKKyAgcmQtPm56ID0gbno7Cit9CisKKy8vIFJlZmluZSBpbnRyYTE2L2ludHJhNCBzdWItbW9kZXMgYmFzZWQgb24gZGlzdG9ydGlvbiBvbmx5IChub3QgcmF0ZSkuCitzdGF0aWMgdm9pZCBSZWZpbmVVc2luZ0Rpc3RvcnRpb24oVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cnlfYm90aF9tb2RlcywgaW50IHJlZmluZV91dl9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOE1vZGVTY29yZSogY29uc3QgcmQpIHsKKyAgc2NvcmVfdCBiZXN0X3Njb3JlID0gTUFYX0NPU1Q7CisgIGludCBueiA9IDA7CisgIGludCBtb2RlOworICBpbnQgaXNfaTE2ID0gdHJ5X2JvdGhfbW9kZXMgfHwgKGl0LT5tYl8tPnR5cGVfID09IDEpOworCisgIGNvbnN0IFZQOFNlZ21lbnRJbmZvKiBjb25zdCBkcW0gPSAmaXQtPmVuY18tPmRxbV9baXQtPm1iXy0+c2VnbWVudF9dOworICAvLyBTb21lIGVtcGlyaWMgY29uc3RhbnRzLCBvZiBhcHByb3hpbWF0ZSBvcmRlciBvZiBtYWduaXR1ZGUuCisgIGNvbnN0IGludCBsYW1iZGFfZF9pMTYgPSAxMDY7CisgIGNvbnN0IGludCBsYW1iZGFfZF9pNCA9IDExOworICBjb25zdCBpbnQgbGFtYmRhX2RfdXYgPSAxMjA7CisgIHNjb3JlX3Qgc2NvcmVfaTQgPSBkcW0tPmk0X3BlbmFsdHlfOworICBzY29yZV90IGk0X2JpdF9zdW0gPSAwOworICBjb25zdCBzY29yZV90IGJpdF9saW1pdCA9IHRyeV9ib3RoX21vZGVzID8gaXQtPmVuY18tPm1iX2hlYWRlcl9saW1pdF8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE1BWF9DT1NUOyAgLy8gbm8gZWFybHktb3V0IGFsbG93ZWQKKworICBpZiAoaXNfaTE2KSB7ICAgLy8gRmlyc3QsIGV2YWx1YXRlIEludHJhMTYgZGlzdG9ydGlvbgorICAgIGludCBiZXN0X21vZGUgPSAtMTsKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCBzcmMgPSBpdC0+eXV2X2luXyArIFlfT0ZGX0VOQzsKKyAgICBmb3IgKG1vZGUgPSAwOyBtb2RlIDwgTlVNX1BSRURfTU9ERVM7ICsrbW9kZSkgeworICAgICAgY29uc3QgdWludDhfdCogY29uc3QgcmVmID0gaXQtPnl1dl9wXyArIFZQOEkxNk1vZGVPZmZzZXRzW21vZGVdOworICAgICAgY29uc3Qgc2NvcmVfdCBzY29yZSA9IChzY29yZV90KVZQOFNTRTE2eDE2KHNyYywgcmVmKSAqIFJEX0RJU1RPX01VTFQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKyBWUDhGaXhlZENvc3RzSTE2W21vZGVdICogbGFtYmRhX2RfaTE2OworICAgICAgaWYgKG1vZGUgPiAwICYmIFZQOEZpeGVkQ29zdHNJMTZbbW9kZV0gPiBiaXRfbGltaXQpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoc2NvcmUgPCBiZXN0X3Njb3JlKSB7CisgICAgICAgIGJlc3RfbW9kZSA9IG1vZGU7CisgICAgICAgIGJlc3Rfc2NvcmUgPSBzY29yZTsKKyAgICAgIH0KKyAgICB9CisgICAgVlA4U2V0SW50cmExNk1vZGUoaXQsIGJlc3RfbW9kZSk7CisgICAgLy8gd2UnbGwgcmVjb25zdHJ1Y3QgbGF0ZXIsIGlmIGkxNiBtb2RlIGFjdHVhbGx5IGdldHMgc2VsZWN0ZWQKKyAgfQorCisgIC8vIE5leHQsIGV2YWx1YXRlIEludHJhNAorICBpZiAodHJ5X2JvdGhfbW9kZXMgfHwgIWlzX2kxNikgeworICAgIC8vIFdlIGRvbid0IGV2YWx1YXRlIHRoZSByYXRlIGhlcmUsIGJ1dCBqdXN0IGFjY291bnQgZm9yIGl0IHRocm91Z2ggYQorICAgIC8vIGNvbnN0YW50IHBlbmFsdHkgKGk0IG1vZGUgdXN1YWxseSBuZWVkcyBtb3JlIGJpdHMgY29tcGFyZWQgdG8gaTE2KS4KKyAgICBpc19pMTYgPSAwOworICAgIFZQOEl0ZXJhdG9yU3RhcnRJNChpdCk7CisgICAgZG8geworICAgICAgaW50IGJlc3RfaTRfbW9kZSA9IC0xOworICAgICAgc2NvcmVfdCBiZXN0X2k0X3Njb3JlID0gTUFYX0NPU1Q7CisgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBzcmMgPSBpdC0+eXV2X2luXyArIFlfT0ZGX0VOQyArIFZQOFNjYW5baXQtPmk0X107CisgICAgICBjb25zdCB1aW50MTZfdCogY29uc3QgbW9kZV9jb3N0cyA9IEdldENvc3RNb2RlSTQoaXQsIHJkLT5tb2Rlc19pNCk7CisKKyAgICAgIFZQOE1ha2VJbnRyYTRQcmVkcyhpdCk7CisgICAgICBmb3IgKG1vZGUgPSAwOyBtb2RlIDwgTlVNX0JNT0RFUzsgKyttb2RlKSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHJlZiA9IGl0LT55dXZfcF8gKyBWUDhJNE1vZGVPZmZzZXRzW21vZGVdOworICAgICAgICBjb25zdCBzY29yZV90IHNjb3JlID0gVlA4U1NFNHg0KHNyYywgcmVmKSAqIFJEX0RJU1RPX01VTFQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1vZGVfY29zdHNbbW9kZV0gKiBsYW1iZGFfZF9pNDsKKyAgICAgICAgaWYgKHNjb3JlIDwgYmVzdF9pNF9zY29yZSkgeworICAgICAgICAgIGJlc3RfaTRfbW9kZSA9IG1vZGU7CisgICAgICAgICAgYmVzdF9pNF9zY29yZSA9IHNjb3JlOworICAgICAgICB9CisgICAgICB9CisgICAgICBpNF9iaXRfc3VtICs9IG1vZGVfY29zdHNbYmVzdF9pNF9tb2RlXTsKKyAgICAgIHJkLT5tb2Rlc19pNFtpdC0+aTRfXSA9IGJlc3RfaTRfbW9kZTsKKyAgICAgIHNjb3JlX2k0ICs9IGJlc3RfaTRfc2NvcmU7CisgICAgICBpZiAoc2NvcmVfaTQgPj0gYmVzdF9zY29yZSB8fCBpNF9iaXRfc3VtID4gYml0X2xpbWl0KSB7CisgICAgICAgIC8vIEludHJhNCB3b24ndCBiZSBiZXR0ZXIgdGhhbiBJbnRyYTE2LiBCYWlsIG91dCBhbmQgcGljayBJbnRyYTE2LgorICAgICAgICBpc19pMTYgPSAxOworICAgICAgICBicmVhazsKKyAgICAgIH0gZWxzZSB7ICAvLyByZWNvbnN0cnVjdCBwYXJ0aWFsIGJsb2NrIGluc2lkZSB5dXZfb3V0Ml8gYnVmZmVyCisgICAgICAgIHVpbnQ4X3QqIGNvbnN0IHRtcF9kc3QgPSBpdC0+eXV2X291dDJfICsgWV9PRkZfRU5DICsgVlA4U2NhbltpdC0+aTRfXTsKKyAgICAgICAgbnogfD0gUmVjb25zdHJ1Y3RJbnRyYTQoaXQsIHJkLT55X2FjX2xldmVsc1tpdC0+aTRfXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLCB0bXBfZHN0LCBiZXN0X2k0X21vZGUpIDw8IGl0LT5pNF87CisgICAgICB9CisgICAgfSB3aGlsZSAoVlA4SXRlcmF0b3JSb3RhdGVJNChpdCwgaXQtPnl1dl9vdXQyXyArIFlfT0ZGX0VOQykpOworICB9CisKKyAgLy8gRmluYWwgcmVjb25zdHJ1Y3Rpb24sIGRlcGVuZGluZyBvbiB3aGljaCBtb2RlIGlzIHNlbGVjdGVkLgorICBpZiAoIWlzX2kxNikgeworICAgIFZQOFNldEludHJhNE1vZGUoaXQsIHJkLT5tb2Rlc19pNCk7CisgICAgU3dhcE91dChpdCk7CisgICAgYmVzdF9zY29yZSA9IHNjb3JlX2k0OworICB9IGVsc2UgeworICAgIG56ID0gUmVjb25zdHJ1Y3RJbnRyYTE2KGl0LCByZCwgaXQtPnl1dl9vdXRfICsgWV9PRkZfRU5DLCBpdC0+cHJlZHNfWzBdKTsKKyAgfQorCisgIC8vIC4uLiBhbmQgVVYhCisgIGlmIChyZWZpbmVfdXZfbW9kZSkgeworICAgIGludCBiZXN0X21vZGUgPSAtMTsKKyAgICBzY29yZV90IGJlc3RfdXZfc2NvcmUgPSBNQVhfQ09TVDsKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCBzcmMgPSBpdC0+eXV2X2luXyArIFVfT0ZGX0VOQzsKKyAgICBmb3IgKG1vZGUgPSAwOyBtb2RlIDwgTlVNX1BSRURfTU9ERVM7ICsrbW9kZSkgeworICAgICAgY29uc3QgdWludDhfdCogY29uc3QgcmVmID0gaXQtPnl1dl9wXyArIFZQOFVWTW9kZU9mZnNldHNbbW9kZV07CisgICAgICBjb25zdCBzY29yZV90IHNjb3JlID0gVlA4U1NFMTZ4OChzcmMsIHJlZikgKiBSRF9ESVNUT19NVUxUCisgICAgICAgICAgICAgICAgICAgICAgICAgICsgVlA4Rml4ZWRDb3N0c1VWW21vZGVdICogbGFtYmRhX2RfdXY7CisgICAgICBpZiAoc2NvcmUgPCBiZXN0X3V2X3Njb3JlKSB7CisgICAgICAgIGJlc3RfbW9kZSA9IG1vZGU7CisgICAgICAgIGJlc3RfdXZfc2NvcmUgPSBzY29yZTsKKyAgICAgIH0KKyAgICB9CisgICAgVlA4U2V0SW50cmFVVk1vZGUoaXQsIGJlc3RfbW9kZSk7CisgIH0KKyAgbnogfD0gUmVjb25zdHJ1Y3RVVihpdCwgcmQsIGl0LT55dXZfb3V0XyArIFVfT0ZGX0VOQywgaXQtPm1iXy0+dXZfbW9kZV8pOworCisgIHJkLT5ueiA9IG56OworICByZC0+c2NvcmUgPSBiZXN0X3Njb3JlOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworaW50IFZQOERlY2ltYXRlKFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgVlA4TW9kZVNjb3JlKiBjb25zdCByZCwKKyAgICAgICAgICAgICAgICBWUDhSRExldmVsIHJkX29wdCkgeworICBpbnQgaXNfc2tpcHBlZDsKKyAgY29uc3QgaW50IG1ldGhvZCA9IGl0LT5lbmNfLT5tZXRob2RfOworCisgIEluaXRTY29yZShyZCk7CisKKyAgLy8gV2UgY2FuIHBlcmZvcm0gcHJlZGljdGlvbnMgZm9yIEx1bWExNngxNiBhbmQgQ2hyb21hOHg4IGFscmVhZHkuCisgIC8vIEx1bWE0eDQgcHJlZGljdGlvbnMgbmVlZHMgdG8gYmUgZG9uZSBhcy13ZS1nby4KKyAgVlA4TWFrZUx1bWExNlByZWRzKGl0KTsKKyAgVlA4TWFrZUNocm9tYThQcmVkcyhpdCk7CisKKyAgaWYgKHJkX29wdCA+IFJEX09QVF9OT05FKSB7CisgICAgaXQtPmRvX3RyZWxsaXNfID0gKHJkX29wdCA+PSBSRF9PUFRfVFJFTExJU19BTEwpOworICAgIFBpY2tCZXN0SW50cmExNihpdCwgcmQpOworICAgIGlmIChtZXRob2QgPj0gMikgeworICAgICAgUGlja0Jlc3RJbnRyYTQoaXQsIHJkKTsKKyAgICB9CisgICAgUGlja0Jlc3RVVihpdCwgcmQpOworICAgIGlmIChyZF9vcHQgPT0gUkRfT1BUX1RSRUxMSVMpIHsgICAvLyBmaW5pc2ggb2ZmIHdpdGggdHJlbGxpcy1vcHRpbSBub3cKKyAgICAgIGl0LT5kb190cmVsbGlzXyA9IDE7CisgICAgICBTaW1wbGVRdWFudGl6ZShpdCwgcmQpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvLyBBdCB0aGlzIHBvaW50IHdlIGhhdmUgaGV1cmlzdGljYWxseSBkZWNpZGVkIGludHJhMTYgLyBpbnRyYTQuCisgICAgLy8gRm9yIG1ldGhvZCA+PSAyLCBwaWNrIHRoZSBiZXN0IGludHJhNC9pbnRyYTE2IGJhc2VkIG9uIFNTRSAofnRhZCBzbG93ZXIpLgorICAgIC8vIEZvciBtZXRob2QgPD0gMSwgd2UgZG9uJ3QgcmUtZXhhbWluZSB0aGUgZGVjaXNpb24gYnV0IGp1c3QgZ28gYWhlYWQgd2l0aAorICAgIC8vIHF1YW50aXphdGlvbi9yZWNvbnN0cnVjdGlvbi4KKyAgICBSZWZpbmVVc2luZ0Rpc3RvcnRpb24oaXQsIChtZXRob2QgPj0gMiksIChtZXRob2QgPj0gMSksIHJkKTsKKyAgfQorICBpc19za2lwcGVkID0gKHJkLT5ueiA9PSAwKTsKKyAgVlA4U2V0U2tpcChpdCwgaXNfc2tpcHBlZCk7CisgIHJldHVybiBpc19za2lwcGVkOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9zeW50YXhfZW5jLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL3N5bnRheF9lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWU1YTZjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9zeW50YXhfZW5jLmMKQEAgLTAsMCArMSwzODggQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBIZWFkZXIgc3ludGF4IHdyaXRpbmcKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvd2VicC9mb3JtYXRfY29uc3RhbnRzLmgiICAvLyBSSUZGIGNvbnN0YW50cworI2luY2x1ZGUgInNyYy93ZWJwL211eF90eXBlcy5oIiAgICAgICAgIC8vIEFMUEhBX0ZMQUcKKyNpbmNsdWRlICJzcmMvZW5jL3ZwOGlfZW5jLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIZWxwZXIgZnVuY3Rpb25zCisKK3N0YXRpYyBpbnQgSXNWUDhYTmVlZGVkKGNvbnN0IFZQOEVuY29kZXIqIGNvbnN0IGVuYykgeworICByZXR1cm4gISFlbmMtPmhhc19hbHBoYV87ICAvLyBDdXJyZW50bHkgdGhlIG9ubHkgY2FzZSB3aGVuIFZQOFggaXMgbmVlZGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGNvdWxkIGNoYW5nZSBpbiB0aGUgZnV0dXJlLgorfQorCitzdGF0aWMgaW50IFB1dFBhZGRpbmdCeXRlKGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMpIHsKKyAgY29uc3QgdWludDhfdCBwYWRfYnl0ZVsxXSA9IHsgMCB9OworICByZXR1cm4gISFwaWMtPndyaXRlcihwYWRfYnl0ZSwgMSwgcGljKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFdyaXRlcnMgZm9yIGhlYWRlcidzIHZhcmlvdXMgcGllY2VzIChpbiBvcmRlciBvZiBhcHBlYXJhbmNlKQorCitzdGF0aWMgV2ViUEVuY29kaW5nRXJyb3IgUHV0UklGRkhlYWRlcihjb25zdCBWUDhFbmNvZGVyKiBjb25zdCBlbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcmlmZl9zaXplKSB7CisgIGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMgPSBlbmMtPnBpY187CisgIHVpbnQ4X3QgcmlmZltSSUZGX0hFQURFUl9TSVpFXSA9IHsKKyAgICAnUicsICdJJywgJ0YnLCAnRicsIDAsIDAsIDAsIDAsICdXJywgJ0UnLCAnQicsICdQJworICB9OworICBhc3NlcnQocmlmZl9zaXplID09ICh1aW50MzJfdClyaWZmX3NpemUpOworICBQdXRMRTMyKHJpZmYgKyBUQUdfU0laRSwgKHVpbnQzMl90KXJpZmZfc2l6ZSk7CisgIGlmICghcGljLT53cml0ZXIocmlmZiwgc2l6ZW9mKHJpZmYpLCBwaWMpKSB7CisgICAgcmV0dXJuIFZQOF9FTkNfRVJST1JfQkFEX1dSSVRFOworICB9CisgIHJldHVybiBWUDhfRU5DX09LOworfQorCitzdGF0aWMgV2ViUEVuY29kaW5nRXJyb3IgUHV0VlA4WEhlYWRlcihjb25zdCBWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYyA9IGVuYy0+cGljXzsKKyAgdWludDhfdCB2cDh4W0NIVU5LX0hFQURFUl9TSVpFICsgVlA4WF9DSFVOS19TSVpFXSA9IHsKKyAgICAnVicsICdQJywgJzgnLCAnWCcKKyAgfTsKKyAgdWludDMyX3QgZmxhZ3MgPSAwOworCisgIGFzc2VydChJc1ZQOFhOZWVkZWQoZW5jKSk7CisgIGFzc2VydChwaWMtPndpZHRoID49IDEgJiYgcGljLT5oZWlnaHQgPj0gMSk7CisgIGFzc2VydChwaWMtPndpZHRoIDw9IE1BWF9DQU5WQVNfU0laRSAmJiBwaWMtPmhlaWdodCA8PSBNQVhfQ0FOVkFTX1NJWkUpOworCisgIGlmIChlbmMtPmhhc19hbHBoYV8pIHsKKyAgICBmbGFncyB8PSBBTFBIQV9GTEFHOworICB9CisKKyAgUHV0TEUzMih2cDh4ICsgVEFHX1NJWkUsICAgICAgICAgICAgICBWUDhYX0NIVU5LX1NJWkUpOworICBQdXRMRTMyKHZwOHggKyBDSFVOS19IRUFERVJfU0laRSwgICAgIGZsYWdzKTsKKyAgUHV0TEUyNCh2cDh4ICsgQ0hVTktfSEVBREVSX1NJWkUgKyA0LCBwaWMtPndpZHRoIC0gMSk7CisgIFB1dExFMjQodnA4eCArIENIVU5LX0hFQURFUl9TSVpFICsgNywgcGljLT5oZWlnaHQgLSAxKTsKKyAgaWYgKCFwaWMtPndyaXRlcih2cDh4LCBzaXplb2YodnA4eCksIHBpYykpIHsKKyAgICByZXR1cm4gVlA4X0VOQ19FUlJPUl9CQURfV1JJVEU7CisgIH0KKyAgcmV0dXJuIFZQOF9FTkNfT0s7Cit9CisKK3N0YXRpYyBXZWJQRW5jb2RpbmdFcnJvciBQdXRBbHBoYUNodW5rKGNvbnN0IFZQOEVuY29kZXIqIGNvbnN0IGVuYykgeworICBjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljID0gZW5jLT5waWNfOworICB1aW50OF90IGFscGhhX2NodW5rX2hkcltDSFVOS19IRUFERVJfU0laRV0gPSB7CisgICAgJ0EnLCAnTCcsICdQJywgJ0gnCisgIH07CisKKyAgYXNzZXJ0KGVuYy0+aGFzX2FscGhhXyk7CisKKyAgLy8gQWxwaGEgY2h1bmsgaGVhZGVyLgorICBQdXRMRTMyKGFscGhhX2NodW5rX2hkciArIFRBR19TSVpFLCBlbmMtPmFscGhhX2RhdGFfc2l6ZV8pOworICBpZiAoIXBpYy0+d3JpdGVyKGFscGhhX2NodW5rX2hkciwgc2l6ZW9mKGFscGhhX2NodW5rX2hkciksIHBpYykpIHsKKyAgICByZXR1cm4gVlA4X0VOQ19FUlJPUl9CQURfV1JJVEU7CisgIH0KKworICAvLyBBbHBoYSBjaHVuayBkYXRhLgorICBpZiAoIXBpYy0+d3JpdGVyKGVuYy0+YWxwaGFfZGF0YV8sIGVuYy0+YWxwaGFfZGF0YV9zaXplXywgcGljKSkgeworICAgIHJldHVybiBWUDhfRU5DX0VSUk9SX0JBRF9XUklURTsKKyAgfQorCisgIC8vIFBhZGRpbmcuCisgIGlmICgoZW5jLT5hbHBoYV9kYXRhX3NpemVfICYgMSkgJiYgIVB1dFBhZGRpbmdCeXRlKHBpYykpIHsKKyAgICByZXR1cm4gVlA4X0VOQ19FUlJPUl9CQURfV1JJVEU7CisgIH0KKyAgcmV0dXJuIFZQOF9FTkNfT0s7Cit9CisKK3N0YXRpYyBXZWJQRW5jb2RpbmdFcnJvciBQdXRWUDhIZWFkZXIoY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZwOF9zaXplKSB7CisgIHVpbnQ4X3QgdnA4X2NodW5rX2hkcltDSFVOS19IRUFERVJfU0laRV0gPSB7CisgICAgJ1YnLCAnUCcsICc4JywgJyAnCisgIH07CisgIGFzc2VydCh2cDhfc2l6ZSA9PSAodWludDMyX3QpdnA4X3NpemUpOworICBQdXRMRTMyKHZwOF9jaHVua19oZHIgKyBUQUdfU0laRSwgKHVpbnQzMl90KXZwOF9zaXplKTsKKyAgaWYgKCFwaWMtPndyaXRlcih2cDhfY2h1bmtfaGRyLCBzaXplb2YodnA4X2NodW5rX2hkciksIHBpYykpIHsKKyAgICByZXR1cm4gVlA4X0VOQ19FUlJPUl9CQURfV1JJVEU7CisgIH0KKyAgcmV0dXJuIFZQOF9FTkNfT0s7Cit9CisKK3N0YXRpYyBXZWJQRW5jb2RpbmdFcnJvciBQdXRWUDhGcmFtZUhlYWRlcihjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcm9maWxlLCBzaXplX3Qgc2l6ZTApIHsKKyAgdWludDhfdCB2cDhfZnJtX2hkcltWUDhfRlJBTUVfSEVBREVSX1NJWkVdOworICB1aW50MzJfdCBiaXRzOworCisgIGlmIChzaXplMCA+PSBWUDhfTUFYX1BBUlRJVElPTjBfU0laRSkgeyAgLy8gcGFydGl0aW9uICMwIGlzIHRvbyBiaWcgdG8gZml0CisgICAgcmV0dXJuIFZQOF9FTkNfRVJST1JfUEFSVElUSU9OMF9PVkVSRkxPVzsKKyAgfQorCisgIC8vIFBhcmFncmFwaCA5LjEuCisgIGJpdHMgPSAwICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtleWZyYW1lICgxYikKKyAgICAgICB8IChwcm9maWxlIDw8IDEpICAgICAgICAgICAgLy8gcHJvZmlsZSAoM2IpCisgICAgICAgfCAoMSA8PCA0KSAgICAgICAgICAgICAgICAgIC8vIHZpc2libGUgKDFiKQorICAgICAgIHwgKCh1aW50MzJfdClzaXplMCA8PCA1KTsgICAvLyBwYXJ0aXRpb24gbGVuZ3RoICgxOWIpCisgIHZwOF9mcm1faGRyWzBdID0gKGJpdHMgPj4gIDApICYgMHhmZjsKKyAgdnA4X2ZybV9oZHJbMV0gPSAoYml0cyA+PiAgOCkgJiAweGZmOworICB2cDhfZnJtX2hkclsyXSA9IChiaXRzID4+IDE2KSAmIDB4ZmY7CisgIC8vIHNpZ25hdHVyZQorICB2cDhfZnJtX2hkclszXSA9IChWUDhfU0lHTkFUVVJFID4+IDE2KSAmIDB4ZmY7CisgIHZwOF9mcm1faGRyWzRdID0gKFZQOF9TSUdOQVRVUkUgPj4gIDgpICYgMHhmZjsKKyAgdnA4X2ZybV9oZHJbNV0gPSAoVlA4X1NJR05BVFVSRSA+PiAgMCkgJiAweGZmOworICAvLyBkaW1lbnNpb25zCisgIHZwOF9mcm1faGRyWzZdID0gcGljLT53aWR0aCAmIDB4ZmY7CisgIHZwOF9mcm1faGRyWzddID0gcGljLT53aWR0aCA+PiA4OworICB2cDhfZnJtX2hkcls4XSA9IHBpYy0+aGVpZ2h0ICYgMHhmZjsKKyAgdnA4X2ZybV9oZHJbOV0gPSBwaWMtPmhlaWdodCA+PiA4OworCisgIGlmICghcGljLT53cml0ZXIodnA4X2ZybV9oZHIsIHNpemVvZih2cDhfZnJtX2hkciksIHBpYykpIHsKKyAgICByZXR1cm4gVlA4X0VOQ19FUlJPUl9CQURfV1JJVEU7CisgIH0KKyAgcmV0dXJuIFZQOF9FTkNfT0s7Cit9CisKKy8vIFdlYlAgSGVhZGVycy4KK3N0YXRpYyBpbnQgUHV0V2ViUEhlYWRlcnMoY29uc3QgVlA4RW5jb2RlciogY29uc3QgZW5jLCBzaXplX3Qgc2l6ZTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2cDhfc2l6ZSwgc2l6ZV90IHJpZmZfc2l6ZSkgeworICBXZWJQUGljdHVyZSogY29uc3QgcGljID0gZW5jLT5waWNfOworICBXZWJQRW5jb2RpbmdFcnJvciBlcnIgPSBWUDhfRU5DX09LOworCisgIC8vIFJJRkYgaGVhZGVyLgorICBlcnIgPSBQdXRSSUZGSGVhZGVyKGVuYywgcmlmZl9zaXplKTsKKyAgaWYgKGVyciAhPSBWUDhfRU5DX09LKSBnb3RvIEVycm9yOworCisgIC8vIFZQOFguCisgIGlmIChJc1ZQOFhOZWVkZWQoZW5jKSkgeworICAgIGVyciA9IFB1dFZQOFhIZWFkZXIoZW5jKTsKKyAgICBpZiAoZXJyICE9IFZQOF9FTkNfT0spIGdvdG8gRXJyb3I7CisgIH0KKworICAvLyBBbHBoYS4KKyAgaWYgKGVuYy0+aGFzX2FscGhhXykgeworICAgIGVyciA9IFB1dEFscGhhQ2h1bmsoZW5jKTsKKyAgICBpZiAoZXJyICE9IFZQOF9FTkNfT0spIGdvdG8gRXJyb3I7CisgIH0KKworICAvLyBWUDggaGVhZGVyLgorICBlcnIgPSBQdXRWUDhIZWFkZXIocGljLCB2cDhfc2l6ZSk7CisgIGlmIChlcnIgIT0gVlA4X0VOQ19PSykgZ290byBFcnJvcjsKKworICAvLyBWUDggZnJhbWUgaGVhZGVyLgorICBlcnIgPSBQdXRWUDhGcmFtZUhlYWRlcihwaWMsIGVuYy0+cHJvZmlsZV8sIHNpemUwKTsKKyAgaWYgKGVyciAhPSBWUDhfRU5DX09LKSBnb3RvIEVycm9yOworCisgIC8vIEFsbCBPSy4KKyAgcmV0dXJuIDE7CisKKyAgLy8gRXJyb3IuCisgRXJyb3I6CisgIHJldHVybiBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWMsIGVycik7Cit9CisKKy8vIFNlZ21lbnRhdGlvbiBoZWFkZXIKK3N0YXRpYyB2b2lkIFB1dFNlZ21lbnRIZWFkZXIoVlA4Qml0V3JpdGVyKiBjb25zdCBidywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4RW5jb2RlciogY29uc3QgZW5jKSB7CisgIGNvbnN0IFZQOEVuY1NlZ21lbnRIZWFkZXIqIGNvbnN0IGhkciA9ICZlbmMtPnNlZ21lbnRfaGRyXzsKKyAgY29uc3QgVlA4RW5jUHJvYmEqIGNvbnN0IHByb2JhID0gJmVuYy0+cHJvYmFfOworICBpZiAoVlA4UHV0Qml0VW5pZm9ybShidywgKGhkci0+bnVtX3NlZ21lbnRzXyA+IDEpKSkgeworICAgIC8vIFdlIGFsd2F5cyAndXBkYXRlJyB0aGUgcXVhbnQgYW5kIGZpbHRlciBzdHJlbmd0aCB2YWx1ZXMKKyAgICBjb25zdCBpbnQgdXBkYXRlX2RhdGEgPSAxOworICAgIGludCBzOworICAgIFZQOFB1dEJpdFVuaWZvcm0oYncsIGhkci0+dXBkYXRlX21hcF8pOworICAgIGlmIChWUDhQdXRCaXRVbmlmb3JtKGJ3LCB1cGRhdGVfZGF0YSkpIHsKKyAgICAgIC8vIHdlIGFsd2F5cyB1c2UgYWJzb2x1dGUgdmFsdWVzLCBub3QgcmVsYXRpdmUgb25lcworICAgICAgVlA4UHV0Qml0VW5pZm9ybShidywgMSk7ICAgLy8gKHNlZ21lbnRfZmVhdHVyZV9tb2RlID0gMS4gUGFyYWdyYXBoIDkuMy4pCisgICAgICBmb3IgKHMgPSAwOyBzIDwgTlVNX01CX1NFR01FTlRTOyArK3MpIHsKKyAgICAgICAgVlA4UHV0U2lnbmVkQml0cyhidywgZW5jLT5kcW1fW3NdLnF1YW50XywgNyk7CisgICAgICB9CisgICAgICBmb3IgKHMgPSAwOyBzIDwgTlVNX01CX1NFR01FTlRTOyArK3MpIHsKKyAgICAgICAgVlA4UHV0U2lnbmVkQml0cyhidywgZW5jLT5kcW1fW3NdLmZzdHJlbmd0aF8sIDYpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoaGRyLT51cGRhdGVfbWFwXykgeworICAgICAgZm9yIChzID0gMDsgcyA8IDM7ICsrcykgeworICAgICAgICBpZiAoVlA4UHV0Qml0VW5pZm9ybShidywgKHByb2JhLT5zZWdtZW50c19bc10gIT0gMjU1dSkpKSB7CisgICAgICAgICAgVlA4UHV0Qml0cyhidywgcHJvYmEtPnNlZ21lbnRzX1tzXSwgOCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLy8gRmlsdGVyaW5nIHBhcmFtZXRlcnMgaGVhZGVyCitzdGF0aWMgdm9pZCBQdXRGaWx0ZXJIZWFkZXIoVlA4Qml0V3JpdGVyKiBjb25zdCBidywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhFbmNGaWx0ZXJIZWFkZXIqIGNvbnN0IGhkcikgeworICBjb25zdCBpbnQgdXNlX2xmX2RlbHRhID0gKGhkci0+aTR4NF9sZl9kZWx0YV8gIT0gMCk7CisgIFZQOFB1dEJpdFVuaWZvcm0oYncsIGhkci0+c2ltcGxlXyk7CisgIFZQOFB1dEJpdHMoYncsIGhkci0+bGV2ZWxfLCA2KTsKKyAgVlA4UHV0Qml0cyhidywgaGRyLT5zaGFycG5lc3NfLCAzKTsKKyAgaWYgKFZQOFB1dEJpdFVuaWZvcm0oYncsIHVzZV9sZl9kZWx0YSkpIHsKKyAgICAvLyAnMCcgaXMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGk0eDRfbGZfZGVsdGFfIGF0IGZyYW1lICMwLgorICAgIGNvbnN0IGludCBuZWVkX3VwZGF0ZSA9IChoZHItPmk0eDRfbGZfZGVsdGFfICE9IDApOworICAgIGlmIChWUDhQdXRCaXRVbmlmb3JtKGJ3LCBuZWVkX3VwZGF0ZSkpIHsKKyAgICAgIC8vIHdlIGRvbid0IHVzZSByZWZfbGZfZGVsdGEgPT4gZW1pdCBmb3VyIDAgYml0cworICAgICAgVlA4UHV0Qml0cyhidywgMCwgNCk7CisgICAgICAvLyB3ZSB1c2UgbW9kZV9sZl9kZWx0YSBmb3IgaTR4NAorICAgICAgVlA4UHV0U2lnbmVkQml0cyhidywgaGRyLT5pNHg0X2xmX2RlbHRhXywgNik7CisgICAgICBWUDhQdXRCaXRzKGJ3LCAwLCAzKTsgICAgLy8gYWxsIG90aGVycyB1bnVzZWQKKyAgICB9CisgIH0KK30KKworLy8gTm9taW5hbCBxdWFudGl6YXRpb24gcGFyYW1ldGVycworc3RhdGljIHZvaWQgUHV0UXVhbnQoVlA4Qml0V3JpdGVyKiBjb25zdCBidywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOEVuY29kZXIqIGNvbnN0IGVuYykgeworICBWUDhQdXRCaXRzKGJ3LCBlbmMtPmJhc2VfcXVhbnRfLCA3KTsKKyAgVlA4UHV0U2lnbmVkQml0cyhidywgZW5jLT5kcV95MV9kY18sIDQpOworICBWUDhQdXRTaWduZWRCaXRzKGJ3LCBlbmMtPmRxX3kyX2RjXywgNCk7CisgIFZQOFB1dFNpZ25lZEJpdHMoYncsIGVuYy0+ZHFfeTJfYWNfLCA0KTsKKyAgVlA4UHV0U2lnbmVkQml0cyhidywgZW5jLT5kcV91dl9kY18sIDQpOworICBWUDhQdXRTaWduZWRCaXRzKGJ3LCBlbmMtPmRxX3V2X2FjXywgNCk7Cit9CisKKy8vIFBhcnRpdGlvbiBzaXplcworc3RhdGljIGludCBFbWl0UGFydGl0aW9uc1NpemUoY29uc3QgVlA4RW5jb2RlciogY29uc3QgZW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYykgeworICB1aW50OF90IGJ1ZlszICogKE1BWF9OVU1fUEFSVElUSU9OUyAtIDEpXTsKKyAgaW50IHA7CisgIGZvciAocCA9IDA7IHAgPCBlbmMtPm51bV9wYXJ0c18gLSAxOyArK3ApIHsKKyAgICBjb25zdCBzaXplX3QgcGFydF9zaXplID0gVlA4Qml0V3JpdGVyU2l6ZShlbmMtPnBhcnRzXyArIHApOworICAgIGlmIChwYXJ0X3NpemUgPj0gVlA4X01BWF9QQVJUSVRJT05fU0laRSkgeworICAgICAgcmV0dXJuIFdlYlBFbmNvZGluZ1NldEVycm9yKHBpYywgVlA4X0VOQ19FUlJPUl9QQVJUSVRJT05fT1ZFUkZMT1cpOworICAgIH0KKyAgICBidWZbMyAqIHAgKyAwXSA9IChwYXJ0X3NpemUgPj4gIDApICYgMHhmZjsKKyAgICBidWZbMyAqIHAgKyAxXSA9IChwYXJ0X3NpemUgPj4gIDgpICYgMHhmZjsKKyAgICBidWZbMyAqIHAgKyAyXSA9IChwYXJ0X3NpemUgPj4gMTYpICYgMHhmZjsKKyAgfQorICByZXR1cm4gcCA/IHBpYy0+d3JpdGVyKGJ1ZiwgMyAqIHAsIHBpYykgOiAxOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50IEdlbmVyYXRlUGFydGl0aW9uMChWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgVlA4Qml0V3JpdGVyKiBjb25zdCBidyA9ICZlbmMtPmJ3XzsKKyAgY29uc3QgaW50IG1iX3NpemUgPSBlbmMtPm1iX3dfICogZW5jLT5tYl9oXzsKKyAgdWludDY0X3QgcG9zMSwgcG9zMiwgcG9zMzsKKworICBwb3MxID0gVlA4Qml0V3JpdGVyUG9zKGJ3KTsKKyAgaWYgKCFWUDhCaXRXcml0ZXJJbml0KGJ3LCBtYl9zaXplICogNyAvIDgpKSB7ICAgICAgICAvLyB+NyBiaXRzIHBlciBtYWNyb2Jsb2NrCisgICAgcmV0dXJuIFdlYlBFbmNvZGluZ1NldEVycm9yKGVuYy0+cGljXywgVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZKTsKKyAgfQorICBWUDhQdXRCaXRVbmlmb3JtKGJ3LCAwKTsgICAvLyBjb2xvcnNwYWNlCisgIFZQOFB1dEJpdFVuaWZvcm0oYncsIDApOyAgIC8vIGNsYW1wIHR5cGUKKworICBQdXRTZWdtZW50SGVhZGVyKGJ3LCBlbmMpOworICBQdXRGaWx0ZXJIZWFkZXIoYncsICZlbmMtPmZpbHRlcl9oZHJfKTsKKyAgVlA4UHV0Qml0cyhidywgZW5jLT5udW1fcGFydHNfID09IDggPyAzIDoKKyAgICAgICAgICAgICAgICAgZW5jLT5udW1fcGFydHNfID09IDQgPyAyIDoKKyAgICAgICAgICAgICAgICAgZW5jLT5udW1fcGFydHNfID09IDIgPyAxIDogMCwgMik7CisgIFB1dFF1YW50KGJ3LCBlbmMpOworICBWUDhQdXRCaXRVbmlmb3JtKGJ3LCAwKTsgICAvLyBubyBwcm9iYSB1cGRhdGUKKyAgVlA4V3JpdGVQcm9iYXMoYncsICZlbmMtPnByb2JhXyk7CisgIHBvczIgPSBWUDhCaXRXcml0ZXJQb3MoYncpOworICBWUDhDb2RlSW50cmFNb2RlcyhlbmMpOworICBWUDhCaXRXcml0ZXJGaW5pc2goYncpOworCisgIHBvczMgPSBWUDhCaXRXcml0ZXJQb3MoYncpOworCisjaWYgIWRlZmluZWQoV0VCUF9ESVNBQkxFX1NUQVRTKQorICBpZiAoZW5jLT5waWNfLT5zdGF0cykgeworICAgIGVuYy0+cGljXy0+c3RhdHMtPmhlYWRlcl9ieXRlc1swXSA9IChpbnQpKChwb3MyIC0gcG9zMSArIDcpID4+IDMpOworICAgIGVuYy0+cGljXy0+c3RhdHMtPmhlYWRlcl9ieXRlc1sxXSA9IChpbnQpKChwb3MzIC0gcG9zMiArIDcpID4+IDMpOworICAgIGVuYy0+cGljXy0+c3RhdHMtPmFscGhhX2RhdGFfc2l6ZSA9IChpbnQpZW5jLT5hbHBoYV9kYXRhX3NpemVfOworICB9CisjZWxzZQorICAodm9pZClwb3MxOworICAodm9pZClwb3MyOworICAodm9pZClwb3MzOworI2VuZGlmCisgIGlmIChidy0+ZXJyb3JfKSB7CisgICAgcmV0dXJuIFdlYlBFbmNvZGluZ1NldEVycm9yKGVuYy0+cGljXywgVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZKTsKKyAgfQorICByZXR1cm4gMTsKK30KKwordm9pZCBWUDhFbmNGcmVlQml0V3JpdGVycyhWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgaW50IHA7CisgIFZQOEJpdFdyaXRlcldpcGVPdXQoJmVuYy0+YndfKTsKKyAgZm9yIChwID0gMDsgcCA8IGVuYy0+bnVtX3BhcnRzXzsgKytwKSB7CisgICAgVlA4Qml0V3JpdGVyV2lwZU91dChlbmMtPnBhcnRzXyArIHApOworICB9Cit9CisKK2ludCBWUDhFbmNXcml0ZShWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYyA9IGVuYy0+cGljXzsKKyAgVlA4Qml0V3JpdGVyKiBjb25zdCBidyA9ICZlbmMtPmJ3XzsKKyAgY29uc3QgaW50IHRhc2tfcGVyY2VudCA9IDE5OworICBjb25zdCBpbnQgcGVyY2VudF9wZXJfcGFydCA9IHRhc2tfcGVyY2VudCAvIGVuYy0+bnVtX3BhcnRzXzsKKyAgY29uc3QgaW50IGZpbmFsX3BlcmNlbnQgPSBlbmMtPnBlcmNlbnRfICsgdGFza19wZXJjZW50OworICBpbnQgb2sgPSAwOworICBzaXplX3QgdnA4X3NpemUsIHBhZCwgcmlmZl9zaXplOworICBpbnQgcDsKKworICAvLyBQYXJ0aXRpb24gIzAgd2l0aCBoZWFkZXIgYW5kIHBhcnRpdGlvbiBzaXplcworICBvayA9IEdlbmVyYXRlUGFydGl0aW9uMChlbmMpOworICBpZiAoIW9rKSByZXR1cm4gMDsKKworICAvLyBDb21wdXRlIFZQOCBzaXplCisgIHZwOF9zaXplID0gVlA4X0ZSQU1FX0hFQURFUl9TSVpFICsKKyAgICAgICAgICAgICBWUDhCaXRXcml0ZXJTaXplKGJ3KSArCisgICAgICAgICAgICAgMyAqIChlbmMtPm51bV9wYXJ0c18gLSAxKTsKKyAgZm9yIChwID0gMDsgcCA8IGVuYy0+bnVtX3BhcnRzXzsgKytwKSB7CisgICAgdnA4X3NpemUgKz0gVlA4Qml0V3JpdGVyU2l6ZShlbmMtPnBhcnRzXyArIHApOworICB9CisgIHBhZCA9IHZwOF9zaXplICYgMTsKKyAgdnA4X3NpemUgKz0gcGFkOworCisgIC8vIENvbXB1dGUgUklGRiBzaXplCisgIC8vIEF0IHRoZSBtaW5pbXVtIGl0IGlzOiAiV0VCUFZQOCBubm5uIiArIFZQOCBkYXRhIHNpemUuCisgIHJpZmZfc2l6ZSA9IFRBR19TSVpFICsgQ0hVTktfSEVBREVSX1NJWkUgKyB2cDhfc2l6ZTsKKyAgaWYgKElzVlA4WE5lZWRlZChlbmMpKSB7ICAvLyBBZGQgc2l6ZSBmb3I6IFZQOFggaGVhZGVyICsgZGF0YS4KKyAgICByaWZmX3NpemUgKz0gQ0hVTktfSEVBREVSX1NJWkUgKyBWUDhYX0NIVU5LX1NJWkU7CisgIH0KKyAgaWYgKGVuYy0+aGFzX2FscGhhXykgeyAgLy8gQWRkIHNpemUgZm9yOiBBTFBIIGhlYWRlciArIGRhdGEuCisgICAgY29uc3QgdWludDMyX3QgcGFkZGVkX2FscGhhX3NpemUgPSBlbmMtPmFscGhhX2RhdGFfc2l6ZV8gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVuYy0+YWxwaGFfZGF0YV9zaXplXyAmIDEpOworICAgIHJpZmZfc2l6ZSArPSBDSFVOS19IRUFERVJfU0laRSArIHBhZGRlZF9hbHBoYV9zaXplOworICB9CisgIC8vIFNhbml0eSBjaGVjay4KKyAgaWYgKHJpZmZfc2l6ZSA+IDB4ZmZmZmZmZmVVKSB7CisgICAgcmV0dXJuIFdlYlBFbmNvZGluZ1NldEVycm9yKHBpYywgVlA4X0VOQ19FUlJPUl9GSUxFX1RPT19CSUcpOworICB9CisKKyAgLy8gRW1pdCBoZWFkZXJzIGFuZCBwYXJ0aXRpb24gIzAKKyAgeworICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHBhcnQwID0gVlA4Qml0V3JpdGVyQnVmKGJ3KTsKKyAgICBjb25zdCBzaXplX3Qgc2l6ZTAgPSBWUDhCaXRXcml0ZXJTaXplKGJ3KTsKKyAgICBvayA9IG9rICYmIFB1dFdlYlBIZWFkZXJzKGVuYywgc2l6ZTAsIHZwOF9zaXplLCByaWZmX3NpemUpCisgICAgICAgICAgICAmJiBwaWMtPndyaXRlcihwYXJ0MCwgc2l6ZTAsIHBpYykKKyAgICAgICAgICAgICYmIEVtaXRQYXJ0aXRpb25zU2l6ZShlbmMsIHBpYyk7CisgICAgVlA4Qml0V3JpdGVyV2lwZU91dChidyk7ICAgIC8vIHdpbGwgZnJlZSB0aGUgaW50ZXJuYWwgYnVmZmVyLgorICB9CisKKyAgLy8gVG9rZW4gcGFydGl0aW9ucworICBmb3IgKHAgPSAwOyBwIDwgZW5jLT5udW1fcGFydHNfOyArK3ApIHsKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCBidWYgPSBWUDhCaXRXcml0ZXJCdWYoZW5jLT5wYXJ0c18gKyBwKTsKKyAgICBjb25zdCBzaXplX3Qgc2l6ZSA9IFZQOEJpdFdyaXRlclNpemUoZW5jLT5wYXJ0c18gKyBwKTsKKyAgICBpZiAoc2l6ZSkgb2sgPSBvayAmJiBwaWMtPndyaXRlcihidWYsIHNpemUsIHBpYyk7CisgICAgVlA4Qml0V3JpdGVyV2lwZU91dChlbmMtPnBhcnRzXyArIHApOyAgICAvLyB3aWxsIGZyZWUgdGhlIGludGVybmFsIGJ1ZmZlci4KKyAgICBvayA9IG9rICYmIFdlYlBSZXBvcnRQcm9ncmVzcyhwaWMsIGVuYy0+cGVyY2VudF8gKyBwZXJjZW50X3Blcl9wYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmMtPnBlcmNlbnRfKTsKKyAgfQorCisgIC8vIFBhZGRpbmcgYnl0ZQorICBpZiAob2sgJiYgcGFkKSB7CisgICAgb2sgPSBQdXRQYWRkaW5nQnl0ZShwaWMpOworICB9CisKKyAgZW5jLT5jb2RlZF9zaXplXyA9IChpbnQpKENIVU5LX0hFQURFUl9TSVpFICsgcmlmZl9zaXplKTsKKyAgb2sgPSBvayAmJiBXZWJQUmVwb3J0UHJvZ3Jlc3MocGljLCBmaW5hbF9wZXJjZW50LCAmZW5jLT5wZXJjZW50Xyk7CisgIHJldHVybiBvazsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy90b2tlbl9lbmMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvdG9rZW5fZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIyNjI0NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvdG9rZW5fZW5jLmMKQEAgLTAsMCArMSwyNjggQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBQYWdpbmF0ZWQgdG9rZW4gYnVmZmVyCisvLworLy8gIEEgJ3Rva2VuJyBpcyBhIGJpdCB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggYSBwcm9iYWJpbGl0eSwgZWl0aGVyIGZpeGVkCisvLyBvciBhIGxhdGVyLXRvLWJlLWRldGVybWluZWQgYWZ0ZXIgc3RhdGlzdGljcyBoYXZlIGJlZW4gY29sbGVjdGVkLgorLy8gRm9yIGR5bmFtaWMgcHJvYmFiaWxpdHksIHdlIGp1c3QgcmVjb3JkIHRoZSBzbG90IGlkIChpZHgpIGZvciB0aGUgcHJvYmFiaWxpdHkKKy8vIHZhbHVlIGluIHRoZSBmaW5hbCBwcm9iYWJpbGl0eSBhcnJheSAodWludDhfdCogcHJvYmFzIGluIFZQOEVtaXRUb2tlbnMpLgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9hc3NlcnRfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0ZGxpYl9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RyaW5nX3BvZW0uaCIKKyNlbHNlCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYKKworI2luY2x1ZGUgInNyYy9lbmMvY29zdF9lbmMuaCIKKyNpbmNsdWRlICJzcmMvZW5jL3ZwOGlfZW5jLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL3V0aWxzLmgiCisKKyNpZiAhZGVmaW5lZChESVNBQkxFX1RPS0VOX0JVRkZFUikKKworLy8gd2UgdXNlIHBhZ2VzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIG1lbWNweSgpCisjZGVmaW5lIE1JTl9QQUdFX1NJWkUgODE5MiAgICAgICAgICAvLyBtaW5pbXVtIG51bWJlciBvZiB0b2tlbiBwZXIgcGFnZQorI2RlZmluZSBGSVhFRF9QUk9CQV9CSVQgKDF1IDw8IDE0KQorCit0eXBlZGVmIHVpbnQxNl90IHRva2VuX3Q7ICAvLyBiaXQgIzE1OiBiaXQgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdCAjMTQ6IGZsYWdzIGZvciBjb25zdGFudCBwcm9iYSBvciBpZHgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdHMgIzAuLjEzOiBzbG90IG9yIGNvbnN0YW50IHByb2JhCitzdHJ1Y3QgVlA4VG9rZW5zIHsKKyAgVlA4VG9rZW5zKiBuZXh0XzsgICAgICAgIC8vIHBvaW50ZXIgdG8gbmV4dCBwYWdlCit9OworLy8gVG9rZW4gZGF0YSBpcyBsb2NhdGVkIGluIG1lbW9yeSBqdXN0IGFmdGVyIHRoZSBuZXh0XyBmaWVsZC4KKy8vIFRoaXMgbWFjcm8gaXMgdXNlZCB0byByZXR1cm4gdGhlaXIgYWRkcmVzcyBhbmQgaGlkZSB0aGUgdHJpY2suCisjZGVmaW5lIFRPS0VOX0RBVEEocCkgKChjb25zdCB0b2tlbl90KikmKHApWzFdKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFZQOFRCdWZmZXJJbml0KFZQOFRCdWZmZXIqIGNvbnN0IGIsIGludCBwYWdlX3NpemUpIHsKKyAgYi0+dG9rZW5zXyA9IE5VTEw7CisgIGItPnBhZ2VzXyA9IE5VTEw7CisgIGItPmxhc3RfcGFnZV8gPSAmYi0+cGFnZXNfOworICBiLT5sZWZ0XyA9IDA7CisgIGItPnBhZ2Vfc2l6ZV8gPSAocGFnZV9zaXplIDwgTUlOX1BBR0VfU0laRSkgPyBNSU5fUEFHRV9TSVpFIDogcGFnZV9zaXplOworICBiLT5lcnJvcl8gPSAwOworfQorCit2b2lkIFZQOFRCdWZmZXJDbGVhcihWUDhUQnVmZmVyKiBjb25zdCBiKSB7CisgIGlmIChiICE9IE5VTEwpIHsKKyAgICBWUDhUb2tlbnMqIHAgPSBiLT5wYWdlc187CisgICAgd2hpbGUgKHAgIT0gTlVMTCkgeworICAgICAgVlA4VG9rZW5zKiBjb25zdCBuZXh0ID0gcC0+bmV4dF87CisgICAgICBXZWJQU2FmZUZyZWUocCk7CisgICAgICBwID0gbmV4dDsKKyAgICB9CisgICAgVlA4VEJ1ZmZlckluaXQoYiwgYi0+cGFnZV9zaXplXyk7CisgIH0KK30KKworc3RhdGljIGludCBUQnVmZmVyTmV3UGFnZShWUDhUQnVmZmVyKiBjb25zdCBiKSB7CisgIFZQOFRva2VucyogcGFnZSA9IE5VTEw7CisgIGlmICghYi0+ZXJyb3JfKSB7CisgICAgY29uc3Qgc2l6ZV90IHNpemUgPSBzaXplb2YoKnBhZ2UpICsgYi0+cGFnZV9zaXplXyAqIHNpemVvZih0b2tlbl90KTsKKyAgICBwYWdlID0gKFZQOFRva2VucyopV2ViUFNhZmVNYWxsb2MoMVVMTCwgc2l6ZSk7CisgIH0KKyAgaWYgKHBhZ2UgPT0gTlVMTCkgeworICAgIGItPmVycm9yXyA9IDE7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcGFnZS0+bmV4dF8gPSBOVUxMOworCisgICpiLT5sYXN0X3BhZ2VfID0gcGFnZTsKKyAgYi0+bGFzdF9wYWdlXyA9ICZwYWdlLT5uZXh0XzsKKyAgYi0+bGVmdF8gPSBiLT5wYWdlX3NpemVfOworICBiLT50b2tlbnNfID0gKHRva2VuX3QqKVRPS0VOX0RBVEEocGFnZSk7CisgIHJldHVybiAxOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIFRPS0VOX0lEKHQsIGIsIGN0eCkgXAorICAgIChOVU1fUFJPQkFTICogKChjdHgpICsgTlVNX0NUWCAqICgoYikgKyBOVU1fQkFORFMgKiAodCkpKSkKKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IEFkZFRva2VuKFZQOFRCdWZmZXIqIGNvbnN0IGIsIHVpbnQzMl90IGJpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcm9iYV9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYmFfdCogY29uc3Qgc3RhdHMpIHsKKyAgYXNzZXJ0KHByb2JhX2lkeCA8IEZJWEVEX1BST0JBX0JJVCk7CisgIGFzc2VydChiaXQgPD0gMSk7CisgIGlmIChiLT5sZWZ0XyA+IDAgfHwgVEJ1ZmZlck5ld1BhZ2UoYikpIHsKKyAgICBjb25zdCBpbnQgc2xvdCA9IC0tYi0+bGVmdF87CisgICAgYi0+dG9rZW5zX1tzbG90XSA9IChiaXQgPDwgMTUpIHwgcHJvYmFfaWR4OworICB9CisgIFZQOFJlY29yZFN0YXRzKGJpdCwgc3RhdHMpOworICByZXR1cm4gYml0OworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBBZGRDb25zdGFudFRva2VuKFZQOFRCdWZmZXIqIGNvbnN0IGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJpdCwgdWludDMyX3QgcHJvYmEpIHsKKyAgYXNzZXJ0KHByb2JhIDwgMjU2KTsKKyAgYXNzZXJ0KGJpdCA8PSAxKTsKKyAgaWYgKGItPmxlZnRfID4gMCB8fCBUQnVmZmVyTmV3UGFnZShiKSkgeworICAgIGNvbnN0IGludCBzbG90ID0gLS1iLT5sZWZ0XzsKKyAgICBiLT50b2tlbnNfW3Nsb3RdID0gKGJpdCA8PCAxNSkgfCBGSVhFRF9QUk9CQV9CSVQgfCBwcm9iYTsKKyAgfQorfQorCitpbnQgVlA4UmVjb3JkQ29lZmZUb2tlbnMoaW50IGN0eCwgY29uc3Qgc3RydWN0IFZQOFJlc2lkdWFsKiBjb25zdCByZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgVlA4VEJ1ZmZlciogY29uc3QgdG9rZW5zKSB7CisgIGNvbnN0IGludDE2X3QqIGNvbnN0IGNvZWZmcyA9IHJlcy0+Y29lZmZzOworICBjb25zdCBpbnQgY29lZmZfdHlwZSA9IHJlcy0+Y29lZmZfdHlwZTsKKyAgY29uc3QgaW50IGxhc3QgPSByZXMtPmxhc3Q7CisgIGludCBuID0gcmVzLT5maXJzdDsKKyAgdWludDMyX3QgYmFzZV9pZCA9IFRPS0VOX0lEKGNvZWZmX3R5cGUsIG4sIGN0eCk7CisgIC8vIHNob3VsZCBiZSBzdGF0c1tWUDhFbmNCYW5kc1tuXV0sIGJ1dCBpdCdzIGVxdWl2YWxlbnQgZm9yIG49MCBvciAxCisgIHByb2JhX3QqIHMgPSByZXMtPnN0YXRzW25dW2N0eF07CisgIGlmICghQWRkVG9rZW4odG9rZW5zLCBsYXN0ID49IDAsIGJhc2VfaWQgKyAwLCBzICsgMCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHdoaWxlIChuIDwgMTYpIHsKKyAgICBjb25zdCBpbnQgYyA9IGNvZWZmc1tuKytdOworICAgIGNvbnN0IGludCBzaWduID0gYyA8IDA7CisgICAgY29uc3QgdWludDMyX3QgdiA9IHNpZ24gPyAtYyA6IGM7CisgICAgaWYgKCFBZGRUb2tlbih0b2tlbnMsIHYgIT0gMCwgYmFzZV9pZCArIDEsIHMgKyAxKSkgeworICAgICAgYmFzZV9pZCA9IFRPS0VOX0lEKGNvZWZmX3R5cGUsIFZQOEVuY0JhbmRzW25dLCAwKTsgIC8vIGN0eD0wCisgICAgICBzID0gcmVzLT5zdGF0c1tWUDhFbmNCYW5kc1tuXV1bMF07CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKCFBZGRUb2tlbih0b2tlbnMsIHYgPiAxLCBiYXNlX2lkICsgMiwgcyArIDIpKSB7CisgICAgICBiYXNlX2lkID0gVE9LRU5fSUQoY29lZmZfdHlwZSwgVlA4RW5jQmFuZHNbbl0sIDEpOyAgLy8gY3R4PTEKKyAgICAgIHMgPSByZXMtPnN0YXRzW1ZQOEVuY0JhbmRzW25dXVsxXTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKCFBZGRUb2tlbih0b2tlbnMsIHYgPiA0LCBiYXNlX2lkICsgMywgcyArIDMpKSB7CisgICAgICAgIGlmIChBZGRUb2tlbih0b2tlbnMsIHYgIT0gMiwgYmFzZV9pZCArIDQsIHMgKyA0KSkgeworICAgICAgICAgIEFkZFRva2VuKHRva2VucywgdiA9PSA0LCBiYXNlX2lkICsgNSwgcyArIDUpOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKCFBZGRUb2tlbih0b2tlbnMsIHYgPiAxMCwgYmFzZV9pZCArIDYsIHMgKyA2KSkgeworICAgICAgICBpZiAoIUFkZFRva2VuKHRva2VucywgdiA+IDYsIGJhc2VfaWQgKyA3LCBzICsgNykpIHsKKyAgICAgICAgICBBZGRDb25zdGFudFRva2VuKHRva2VucywgdiA9PSA2LCAxNTkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEFkZENvbnN0YW50VG9rZW4odG9rZW5zLCB2ID49IDksIDE2NSk7CisgICAgICAgICAgQWRkQ29uc3RhbnRUb2tlbih0b2tlbnMsICEodiAmIDEpLCAxNDUpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnQgbWFzazsKKyAgICAgICAgY29uc3QgdWludDhfdCogdGFiOworICAgICAgICB1aW50MzJfdCByZXNpZHVlID0gdiAtIDM7CisgICAgICAgIGlmIChyZXNpZHVlIDwgKDggPDwgMSkpIHsgICAgICAgICAgLy8gVlA4Q2F0MyAgKDNiKQorICAgICAgICAgIEFkZFRva2VuKHRva2VucywgMCwgYmFzZV9pZCArIDgsIHMgKyA4KTsKKyAgICAgICAgICBBZGRUb2tlbih0b2tlbnMsIDAsIGJhc2VfaWQgKyA5LCBzICsgOSk7CisgICAgICAgICAgcmVzaWR1ZSAtPSAoOCA8PCAwKTsKKyAgICAgICAgICBtYXNrID0gMSA8PCAyOworICAgICAgICAgIHRhYiA9IFZQOENhdDM7CisgICAgICAgIH0gZWxzZSBpZiAocmVzaWR1ZSA8ICg4IDw8IDIpKSB7ICAgLy8gVlA4Q2F0NCAgKDRiKQorICAgICAgICAgIEFkZFRva2VuKHRva2VucywgMCwgYmFzZV9pZCArIDgsIHMgKyA4KTsKKyAgICAgICAgICBBZGRUb2tlbih0b2tlbnMsIDEsIGJhc2VfaWQgKyA5LCBzICsgOSk7CisgICAgICAgICAgcmVzaWR1ZSAtPSAoOCA8PCAxKTsKKyAgICAgICAgICBtYXNrID0gMSA8PCAzOworICAgICAgICAgIHRhYiA9IFZQOENhdDQ7CisgICAgICAgIH0gZWxzZSBpZiAocmVzaWR1ZSA8ICg4IDw8IDMpKSB7ICAgLy8gVlA4Q2F0NSAgKDViKQorICAgICAgICAgIEFkZFRva2VuKHRva2VucywgMSwgYmFzZV9pZCArIDgsIHMgKyA4KTsKKyAgICAgICAgICBBZGRUb2tlbih0b2tlbnMsIDAsIGJhc2VfaWQgKyAxMCwgcyArIDkpOworICAgICAgICAgIHJlc2lkdWUgLT0gKDggPDwgMik7CisgICAgICAgICAgbWFzayA9IDEgPDwgNDsKKyAgICAgICAgICB0YWIgPSBWUDhDYXQ1OworICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBWUDhDYXQ2ICgxMWIpCisgICAgICAgICAgQWRkVG9rZW4odG9rZW5zLCAxLCBiYXNlX2lkICsgOCwgcyArIDgpOworICAgICAgICAgIEFkZFRva2VuKHRva2VucywgMSwgYmFzZV9pZCArIDEwLCBzICsgOSk7CisgICAgICAgICAgcmVzaWR1ZSAtPSAoOCA8PCAzKTsKKyAgICAgICAgICBtYXNrID0gMSA8PCAxMDsKKyAgICAgICAgICB0YWIgPSBWUDhDYXQ2OworICAgICAgICB9CisgICAgICAgIHdoaWxlIChtYXNrKSB7CisgICAgICAgICAgQWRkQ29uc3RhbnRUb2tlbih0b2tlbnMsICEhKHJlc2lkdWUgJiBtYXNrKSwgKnRhYisrKTsKKyAgICAgICAgICBtYXNrID4+PSAxOworICAgICAgICB9CisgICAgICB9CisgICAgICBiYXNlX2lkID0gVE9LRU5fSUQoY29lZmZfdHlwZSwgVlA4RW5jQmFuZHNbbl0sIDIpOyAgLy8gY3R4PTIKKyAgICAgIHMgPSByZXMtPnN0YXRzW1ZQOEVuY0JhbmRzW25dXVsyXTsKKyAgICB9CisgICAgQWRkQ29uc3RhbnRUb2tlbih0b2tlbnMsIHNpZ24sIDEyOCk7CisgICAgaWYgKG4gPT0gMTYgfHwgIUFkZFRva2VuKHRva2VucywgbiA8PSBsYXN0LCBiYXNlX2lkICsgMCwgcyArIDApKSB7CisgICAgICByZXR1cm4gMTsgICAvLyBFT0IKKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKyN1bmRlZiBUT0tFTl9JRAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRmluYWwgY29kaW5nIHBhc3MsIHdpdGgga25vd24gcHJvYmFiaWxpdGllcworCitpbnQgVlA4RW1pdFRva2VucyhWUDhUQnVmZmVyKiBjb25zdCBiLCBWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LAorICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgcHJvYmFzLCBpbnQgZmluYWxfcGFzcykgeworICBjb25zdCBWUDhUb2tlbnMqIHAgPSBiLT5wYWdlc187CisgIGFzc2VydCghYi0+ZXJyb3JfKTsKKyAgd2hpbGUgKHAgIT0gTlVMTCkgeworICAgIGNvbnN0IFZQOFRva2VucyogY29uc3QgbmV4dCA9IHAtPm5leHRfOworICAgIGNvbnN0IGludCBOID0gKG5leHQgPT0gTlVMTCkgPyBiLT5sZWZ0XyA6IDA7CisgICAgaW50IG4gPSBiLT5wYWdlX3NpemVfOworICAgIGNvbnN0IHRva2VuX3QqIGNvbnN0IHRva2VucyA9IFRPS0VOX0RBVEEocCk7CisgICAgd2hpbGUgKG4tLSA+IE4pIHsKKyAgICAgIGNvbnN0IHRva2VuX3QgdG9rZW4gPSB0b2tlbnNbbl07CisgICAgICBjb25zdCBpbnQgYml0ID0gKHRva2VuID4+IDE1KSAmIDE7CisgICAgICBpZiAodG9rZW4gJiBGSVhFRF9QUk9CQV9CSVQpIHsKKyAgICAgICAgVlA4UHV0Qml0KGJ3LCBiaXQsIHRva2VuICYgMHhmZnUpOyAgLy8gY29uc3RhbnQgcHJvYmEKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFZQOFB1dEJpdChidywgYml0LCBwcm9iYXNbdG9rZW4gJiAweDNmZmZ1XSk7CisgICAgICB9CisgICAgfQorICAgIGlmIChmaW5hbF9wYXNzKSBXZWJQU2FmZUZyZWUoKHZvaWQqKXApOworICAgIHAgPSBuZXh0OworICB9CisgIGlmIChmaW5hbF9wYXNzKSBiLT5wYWdlc18gPSBOVUxMOworICByZXR1cm4gMTsKK30KKworLy8gU2l6ZSBlc3RpbWF0aW9uCitzaXplX3QgVlA4RXN0aW1hdGVUb2tlblNpemUoVlA4VEJ1ZmZlciogY29uc3QgYiwgY29uc3QgdWludDhfdCogY29uc3QgcHJvYmFzKSB7CisgIHNpemVfdCBzaXplID0gMDsKKyAgY29uc3QgVlA4VG9rZW5zKiBwID0gYi0+cGFnZXNfOworICBhc3NlcnQoIWItPmVycm9yXyk7CisgIHdoaWxlIChwICE9IE5VTEwpIHsKKyAgICBjb25zdCBWUDhUb2tlbnMqIGNvbnN0IG5leHQgPSBwLT5uZXh0XzsKKyAgICBjb25zdCBpbnQgTiA9IChuZXh0ID09IE5VTEwpID8gYi0+bGVmdF8gOiAwOworICAgIGludCBuID0gYi0+cGFnZV9zaXplXzsKKyAgICBjb25zdCB0b2tlbl90KiBjb25zdCB0b2tlbnMgPSBUT0tFTl9EQVRBKHApOworICAgIHdoaWxlIChuLS0gPiBOKSB7CisgICAgICBjb25zdCB0b2tlbl90IHRva2VuID0gdG9rZW5zW25dOworICAgICAgY29uc3QgaW50IGJpdCA9IHRva2VuICYgKDEgPDwgMTUpOworICAgICAgaWYgKHRva2VuICYgRklYRURfUFJPQkFfQklUKSB7CisgICAgICAgIHNpemUgKz0gVlA4Qml0Q29zdChiaXQsIHRva2VuICYgMHhmZnUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2l6ZSArPSBWUDhCaXRDb3N0KGJpdCwgcHJvYmFzW3Rva2VuICYgMHgzZmZmdV0pOworICAgICAgfQorICAgIH0KKyAgICBwID0gbmV4dDsKKyAgfQorICByZXR1cm4gc2l6ZTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2Vsc2UgICAgIC8vIERJU0FCTEVfVE9LRU5fQlVGRkVSCisKK3ZvaWQgVlA4VEJ1ZmZlckluaXQoVlA4VEJ1ZmZlciogY29uc3QgYiwgaW50IHBhZ2Vfc2l6ZSkgeworICAodm9pZCliOworICAodm9pZClwYWdlX3NpemU7Cit9Cit2b2lkIFZQOFRCdWZmZXJDbGVhcihWUDhUQnVmZmVyKiBjb25zdCBiKSB7CisgICh2b2lkKWI7Cit9CisKKyNlbmRpZiAgICAvLyAhRElTQUJMRV9UT0tFTl9CVUZGRVIKKwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy90cmVlX2VuYy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy90cmVlX2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYjA1NDMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL3RyZWVfZW5jLmMKQEAgLTAsMCArMSw1MDggQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBDb2Rpbmcgb2YgdG9rZW4gcHJvYmFiaWxpdGllcywgaW50cmEgbW9kZXMgYW5kIHNlZ21lbnRzLgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdfcG9lbS5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvZW5jL3ZwOGlfZW5jLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEZWZhdWx0IHByb2JhYmlsaXRpZXMKKworLy8gUGFyYWdyYXBoIDEzLjUKK2NvbnN0IHVpbnQ4X3QKKyAgVlA4Q29lZmZzUHJvYmEwW05VTV9UWVBFU11bTlVNX0JBTkRTXVtOVU1fQ1RYXVtOVU1fUFJPQkFTXSA9IHsKKyAgeyB7IHsgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfQorICAgIH0sCisgICAgeyB7IDI1MywgMTM2LCAyNTQsIDI1NSwgMjI4LCAyMTksIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDE4OSwgMTI5LCAyNDIsIDI1NSwgMjI3LCAyMTMsIDI1NSwgMjE5LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDEwNiwgMTI2LCAyMjcsIDI1MiwgMjE0LCAyMDksIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4IH0KKyAgICB9LAorICAgIHsgeyAxLCA5OCwgMjQ4LCAyNTUsIDIzNiwgMjI2LCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAxODEsIDEzMywgMjM4LCAyNTQsIDIyMSwgMjM0LCAyNTUsIDE1NCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyA3OCwgMTM0LCAyMDIsIDI0NywgMTk4LCAxODAsIDI1NSwgMjE5LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgfSwKKyAgICB7IHsgMSwgMTg1LCAyNDksIDI1NSwgMjQzLCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDE4NCwgMTUwLCAyNDcsIDI1NSwgMjM2LCAyMjQsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDc3LCAxMTAsIDIxNiwgMjU1LCAyMzYsIDIzMCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICB9LAorICAgIHsgeyAxLCAxMDEsIDI1MSwgMjU1LCAyNDEsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMTcwLCAxMzksIDI0MSwgMjUyLCAyMzYsIDIwOSwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMzcsIDExNiwgMTk2LCAyNDMsIDIyOCwgMjU1LCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCB9CisgICAgfSwKKyAgICB7IHsgMSwgMjA0LCAyNTQsIDI1NSwgMjQ1LCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDIwNywgMTYwLCAyNTAsIDI1NSwgMjM4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDEwMiwgMTAzLCAyMzEsIDI1NSwgMjExLCAxNzEsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0KKyAgICB9LAorICAgIHsgeyAxLCAxNTIsIDI1MiwgMjU1LCAyNDAsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMTc3LCAxMzUsIDI0MywgMjU1LCAyMzQsIDIyNSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgODAsIDEyOSwgMjExLCAyNTUsIDE5NCwgMjI0LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9CisgICAgfSwKKyAgICB7IHsgMSwgMSwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAyNDYsIDEsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfQorICAgIH0KKyAgfSwKKyAgeyB7IHsgMTk4LCAzNSwgMjM3LCAyMjMsIDE5MywgMTg3LCAxNjIsIDE2MCwgMTQ1LCAxNTUsIDYyIH0sCisgICAgICB7IDEzMSwgNDUsIDE5OCwgMjIxLCAxNzIsIDE3NiwgMjIwLCAxNTcsIDI1MiwgMjIxLCAxIH0sCisgICAgICB7IDY4LCA0NywgMTQ2LCAyMDgsIDE0OSwgMTY3LCAyMjEsIDE2MiwgMjU1LCAyMjMsIDEyOCB9CisgICAgfSwKKyAgICB7IHsgMSwgMTQ5LCAyNDEsIDI1NSwgMjIxLCAyMjQsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDE4NCwgMTQxLCAyMzQsIDI1MywgMjIyLCAyMjAsIDI1NSwgMTk5LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDgxLCA5OSwgMTgxLCAyNDIsIDE3NiwgMTkwLCAyNDksIDIwMiwgMjU1LCAyNTUsIDEyOCB9CisgICAgfSwKKyAgICB7IHsgMSwgMTI5LCAyMzIsIDI1MywgMjE0LCAxOTcsIDI0MiwgMTk2LCAyNTUsIDI1NSwgMTI4IH0sCisgICAgICB7IDk5LCAxMjEsIDIxMCwgMjUwLCAyMDEsIDE5OCwgMjU1LCAyMDIsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMjMsIDkxLCAxNjMsIDI0MiwgMTcwLCAxODcsIDI0NywgMjEwLCAyNTUsIDI1NSwgMTI4IH0KKyAgICB9LAorICAgIHsgeyAxLCAyMDAsIDI0NiwgMjU1LCAyMzQsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMTA5LCAxNzgsIDI0MSwgMjU1LCAyMzEsIDI0NSwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgNDQsIDEzMCwgMjAxLCAyNTMsIDIwNSwgMTkyLCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCB9CisgICAgfSwKKyAgICB7IHsgMSwgMTMyLCAyMzksIDI1MSwgMjE5LCAyMDksIDI1NSwgMTY1LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDk0LCAxMzYsIDIyNSwgMjUxLCAyMTgsIDE5MCwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMjIsIDEwMCwgMTc0LCAyNDUsIDE4NiwgMTYxLCAyNTUsIDE5OSwgMTI4LCAxMjgsIDEyOCB9CisgICAgfSwKKyAgICB7IHsgMSwgMTgyLCAyNDksIDI1NSwgMjMyLCAyMzUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDEyNCwgMTQzLCAyNDEsIDI1NSwgMjI3LCAyMzQsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDM1LCA3NywgMTgxLCAyNTEsIDE5MywgMjExLCAyNTUsIDIwNSwgMTI4LCAxMjgsIDEyOCB9CisgICAgfSwKKyAgICB7IHsgMSwgMTU3LCAyNDcsIDI1NSwgMjM2LCAyMzEsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDEyMSwgMTQxLCAyMzUsIDI1NSwgMjI1LCAyMjcsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDQ1LCA5OSwgMTg4LCAyNTEsIDE5NSwgMjE3LCAyNTUsIDIyNCwgMTI4LCAxMjgsIDEyOCB9CisgICAgfSwKKyAgICB7IHsgMSwgMSwgMjUxLCAyNTUsIDIxMywgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAyMDMsIDEsIDI0OCwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMTM3LCAxLCAxNzcsIDI1NSwgMjI0LCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0KKyAgICB9CisgIH0sCisgIHsgeyB7IDI1MywgOSwgMjQ4LCAyNTEsIDIwNywgMjA4LCAyNTUsIDE5MiwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAxNzUsIDEzLCAyMjQsIDI0MywgMTkzLCAxODUsIDI0OSwgMTk4LCAyNTUsIDI1NSwgMTI4IH0sCisgICAgICB7IDczLCAxNywgMTcxLCAyMjEsIDE2MSwgMTc5LCAyMzYsIDE2NywgMjU1LCAyMzQsIDEyOCB9CisgICAgfSwKKyAgICB7IHsgMSwgOTUsIDI0NywgMjUzLCAyMTIsIDE4MywgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMjM5LCA5MCwgMjQ0LCAyNTAsIDIxMSwgMjA5LCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAxNTUsIDc3LCAxOTUsIDI0OCwgMTg4LCAxOTUsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4IH0KKyAgICB9LAorICAgIHsgeyAxLCAyNCwgMjM5LCAyNTEsIDIxOCwgMjE5LCAyNTUsIDIwNSwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAyMDEsIDUxLCAyMTksIDI1NSwgMTk2LCAxODYsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDY5LCA0NiwgMTkwLCAyMzksIDIwMSwgMjE4LCAyNTUsIDIyOCwgMTI4LCAxMjgsIDEyOCB9CisgICAgfSwKKyAgICB7IHsgMSwgMTkxLCAyNTEsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDIyMywgMTY1LCAyNDksIDI1NSwgMjEzLCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDE0MSwgMTI0LCAyNDgsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0KKyAgICB9LAorICAgIHsgeyAxLCAxNiwgMjQ4LCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAxOTAsIDM2LCAyMzAsIDI1NSwgMjM2LCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDE0OSwgMSwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9CisgICAgfSwKKyAgICB7IHsgMSwgMjI2LCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDI0NywgMTkyLCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDI0MCwgMTI4LCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0KKyAgICB9LAorICAgIHsgeyAxLCAxMzQsIDI1MiwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMjEzLCA2MiwgMjUwLCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyA1NSwgOTMsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfQorICAgIH0sCisgICAgeyB7IDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0KKyAgICB9CisgIH0sCisgIHsgeyB7IDIwMiwgMjQsIDIxMywgMjM1LCAxODYsIDE5MSwgMjIwLCAxNjAsIDI0MCwgMTc1LCAyNTUgfSwKKyAgICAgIHsgMTI2LCAzOCwgMTgyLCAyMzIsIDE2OSwgMTg0LCAyMjgsIDE3NCwgMjU1LCAxODcsIDEyOCB9LAorICAgICAgeyA2MSwgNDYsIDEzOCwgMjE5LCAxNTEsIDE3OCwgMjQwLCAxNzAsIDI1NSwgMjE2LCAxMjggfQorICAgIH0sCisgICAgeyB7IDEsIDExMiwgMjMwLCAyNTAsIDE5OSwgMTkxLCAyNDcsIDE1OSwgMjU1LCAyNTUsIDEyOCB9LAorICAgICAgeyAxNjYsIDEwOSwgMjI4LCAyNTIsIDIxMSwgMjE1LCAyNTUsIDE3NCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAzOSwgNzcsIDE2MiwgMjMyLCAxNzIsIDE4MCwgMjQ1LCAxNzgsIDI1NSwgMjU1LCAxMjggfQorICAgIH0sCisgICAgeyB7IDEsIDUyLCAyMjAsIDI0NiwgMTk4LCAxOTksIDI0OSwgMjIwLCAyNTUsIDI1NSwgMTI4IH0sCisgICAgICB7IDEyNCwgNzQsIDE5MSwgMjQzLCAxODMsIDE5MywgMjUwLCAyMjEsIDI1NSwgMjU1LCAxMjggfSwKKyAgICAgIHsgMjQsIDcxLCAxMzAsIDIxOSwgMTU0LCAxNzAsIDI0MywgMTgyLCAyNTUsIDI1NSwgMTI4IH0KKyAgICB9LAorICAgIHsgeyAxLCAxODIsIDIyNSwgMjQ5LCAyMTksIDI0MCwgMjU1LCAyMjQsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMTQ5LCAxNTAsIDIyNiwgMjUyLCAyMTYsIDIwNSwgMjU1LCAxNzEsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMjgsIDEwOCwgMTcwLCAyNDIsIDE4MywgMTk0LCAyNTQsIDIyMywgMjU1LCAyNTUsIDEyOCB9CisgICAgfSwKKyAgICB7IHsgMSwgODEsIDIzMCwgMjUyLCAyMDQsIDIwMywgMjU1LCAxOTIsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMTIzLCAxMDIsIDIwOSwgMjQ3LCAxODgsIDE5NiwgMjU1LCAyMzMsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMjAsIDk1LCAxNTMsIDI0MywgMTY0LCAxNzMsIDI1NSwgMjAzLCAxMjgsIDEyOCwgMTI4IH0KKyAgICB9LAorICAgIHsgeyAxLCAyMjIsIDI0OCwgMjU1LCAyMTYsIDIxMywgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMTY4LCAxNzUsIDI0NiwgMjUyLCAyMzUsIDIwNSwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgNDcsIDExNiwgMjE1LCAyNTUsIDIxMSwgMjEyLCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCB9CisgICAgfSwKKyAgICB7IHsgMSwgMTIxLCAyMzYsIDI1MywgMjEyLCAyMTQsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDE0MSwgODQsIDIxMywgMjUyLCAyMDEsIDIwMiwgMjU1LCAyMTksIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgNDIsIDgwLCAxNjAsIDI0MCwgMTYyLCAxODUsIDI1NSwgMjA1LCAxMjgsIDEyOCwgMTI4IH0KKyAgICB9LAorICAgIHsgeyAxLCAxLCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDI0NCwgMSwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAyMzgsIDEsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfQorICAgIH0KKyAgfQorfTsKKwordm9pZCBWUDhEZWZhdWx0UHJvYmFzKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgeworICBWUDhFbmNQcm9iYSogY29uc3QgcHJvYmFzID0gJmVuYy0+cHJvYmFfOworICBwcm9iYXMtPnVzZV9za2lwX3Byb2JhXyA9IDA7CisgIG1lbXNldChwcm9iYXMtPnNlZ21lbnRzXywgMjU1dSwgc2l6ZW9mKHByb2Jhcy0+c2VnbWVudHNfKSk7CisgIG1lbWNweShwcm9iYXMtPmNvZWZmc18sIFZQOENvZWZmc1Byb2JhMCwgc2l6ZW9mKFZQOENvZWZmc1Byb2JhMCkpOworICAvLyBOb3RlOiB3ZSBjb3VsZCBoYXJkLWNvZGUgdGhlIGxldmVsX2Nvc3RzXyBjb3JyZXNwb25kaW5nIHRvIFZQOENvZWZmc1Byb2JhMCwKKyAgLy8gYnV0IHRoYXQncyB+MTFrIG9mIHN0YXRpYyBkYXRhLiBCZXR0ZXIgY2FsbCBWUDhDYWxjdWxhdGVMZXZlbENvc3RzKCkgbGF0ZXIuCisgIHByb2Jhcy0+ZGlydHlfID0gMTsKK30KKworLy8gUGFyYWdyYXBoIDExLjUuICA5MDBieXRlcy4KK3N0YXRpYyBjb25zdCB1aW50OF90IGtCTW9kZXNQcm9iYVtOVU1fQk1PREVTXVtOVU1fQk1PREVTXVtOVU1fQk1PREVTIC0gMV0gPSB7CisgIHsgeyAyMzEsIDEyMCwgNDgsIDg5LCAxMTUsIDExMywgMTIwLCAxNTIsIDExMiB9LAorICAgIHsgMTUyLCAxNzksIDY0LCAxMjYsIDE3MCwgMTE4LCA0NiwgNzAsIDk1IH0sCisgICAgeyAxNzUsIDY5LCAxNDMsIDgwLCA4NSwgODIsIDcyLCAxNTUsIDEwMyB9LAorICAgIHsgNTYsIDU4LCAxMCwgMTcxLCAyMTgsIDE4OSwgMTcsIDEzLCAxNTIgfSwKKyAgICB7IDExNCwgMjYsIDE3LCAxNjMsIDQ0LCAxOTUsIDIxLCAxMCwgMTczIH0sCisgICAgeyAxMjEsIDI0LCA4MCwgMTk1LCAyNiwgNjIsIDQ0LCA2NCwgODUgfSwKKyAgICB7IDE0NCwgNzEsIDEwLCAzOCwgMTcxLCAyMTMsIDE0NCwgMzQsIDI2IH0sCisgICAgeyAxNzAsIDQ2LCA1NSwgMTksIDEzNiwgMTYwLCAzMywgMjA2LCA3MSB9LAorICAgIHsgNjMsIDIwLCA4LCAxMTQsIDExNCwgMjA4LCAxMiwgOSwgMjI2IH0sCisgICAgeyA4MSwgNDAsIDExLCA5NiwgMTgyLCA4NCwgMjksIDE2LCAzNiB9IH0sCisgIHsgeyAxMzQsIDE4MywgODksIDEzNywgOTgsIDEwMSwgMTA2LCAxNjUsIDE0OCB9LAorICAgIHsgNzIsIDE4NywgMTAwLCAxMzAsIDE1NywgMTExLCAzMiwgNzUsIDgwIH0sCisgICAgeyA2NiwgMTAyLCAxNjcsIDk5LCA3NCwgNjIsIDQwLCAyMzQsIDEyOCB9LAorICAgIHsgNDEsIDUzLCA5LCAxNzgsIDI0MSwgMTQxLCAyNiwgOCwgMTA3IH0sCisgICAgeyA3NCwgNDMsIDI2LCAxNDYsIDczLCAxNjYsIDQ5LCAyMywgMTU3IH0sCisgICAgeyA2NSwgMzgsIDEwNSwgMTYwLCA1MSwgNTIsIDMxLCAxMTUsIDEyOCB9LAorICAgIHsgMTA0LCA3OSwgMTIsIDI3LCAyMTcsIDI1NSwgODcsIDE3LCA3IH0sCisgICAgeyA4NywgNjgsIDcxLCA0NCwgMTE0LCA1MSwgMTUsIDE4NiwgMjMgfSwKKyAgICB7IDQ3LCA0MSwgMTQsIDExMCwgMTgyLCAxODMsIDIxLCAxNywgMTk0IH0sCisgICAgeyA2NiwgNDUsIDI1LCAxMDIsIDE5NywgMTg5LCAyMywgMTgsIDIyIH0gfSwKKyAgeyB7IDg4LCA4OCwgMTQ3LCAxNTAsIDQyLCA0NiwgNDUsIDE5NiwgMjA1IH0sCisgICAgeyA0MywgOTcsIDE4MywgMTE3LCA4NSwgMzgsIDM1LCAxNzksIDYxIH0sCisgICAgeyAzOSwgNTMsIDIwMCwgODcsIDI2LCAyMSwgNDMsIDIzMiwgMTcxIH0sCisgICAgeyA1NiwgMzQsIDUxLCAxMDQsIDExNCwgMTAyLCAyOSwgOTMsIDc3IH0sCisgICAgeyAzOSwgMjgsIDg1LCAxNzEsIDU4LCAxNjUsIDkwLCA5OCwgNjQgfSwKKyAgICB7IDM0LCAyMiwgMTE2LCAyMDYsIDIzLCAzNCwgNDMsIDE2NiwgNzMgfSwKKyAgICB7IDEwNywgNTQsIDMyLCAyNiwgNTEsIDEsIDgxLCA0MywgMzEgfSwKKyAgICB7IDY4LCAyNSwgMTA2LCAyMiwgNjQsIDE3MSwgMzYsIDIyNSwgMTE0IH0sCisgICAgeyAzNCwgMTksIDIxLCAxMDIsIDEzMiwgMTg4LCAxNiwgNzYsIDEyNCB9LAorICAgIHsgNjIsIDE4LCA3OCwgOTUsIDg1LCA1NywgNTAsIDQ4LCA1MSB9IH0sCisgIHsgeyAxOTMsIDEwMSwgMzUsIDE1OSwgMjE1LCAxMTEsIDg5LCA0NiwgMTExIH0sCisgICAgeyA2MCwgMTQ4LCAzMSwgMTcyLCAyMTksIDIyOCwgMjEsIDE4LCAxMTEgfSwKKyAgICB7IDExMiwgMTEzLCA3NywgODUsIDE3OSwgMjU1LCAzOCwgMTIwLCAxMTQgfSwKKyAgICB7IDQwLCA0MiwgMSwgMTk2LCAyNDUsIDIwOSwgMTAsIDI1LCAxMDkgfSwKKyAgICB7IDg4LCA0MywgMjksIDE0MCwgMTY2LCAyMTMsIDM3LCA0MywgMTU0IH0sCisgICAgeyA2MSwgNjMsIDMwLCAxNTUsIDY3LCA0NSwgNjgsIDEsIDIwOSB9LAorICAgIHsgMTAwLCA4MCwgOCwgNDMsIDE1NCwgMSwgNTEsIDI2LCA3MSB9LAorICAgIHsgMTQyLCA3OCwgNzgsIDE2LCAyNTUsIDEyOCwgMzQsIDE5NywgMTcxIH0sCisgICAgeyA0MSwgNDAsIDUsIDEwMiwgMjExLCAxODMsIDQsIDEsIDIyMSB9LAorICAgIHsgNTEsIDUwLCAxNywgMTY4LCAyMDksIDE5MiwgMjMsIDI1LCA4MiB9IH0sCisgIHsgeyAxMzgsIDMxLCAzNiwgMTcxLCAyNywgMTY2LCAzOCwgNDQsIDIyOSB9LAorICAgIHsgNjcsIDg3LCA1OCwgMTY5LCA4MiwgMTE1LCAyNiwgNTksIDE3OSB9LAorICAgIHsgNjMsIDU5LCA5MCwgMTgwLCA1OSwgMTY2LCA5MywgNzMsIDE1NCB9LAorICAgIHsgNDAsIDQwLCAyMSwgMTE2LCAxNDMsIDIwOSwgMzQsIDM5LCAxNzUgfSwKKyAgICB7IDQ3LCAxNSwgMTYsIDE4MywgMzQsIDIyMywgNDksIDQ1LCAxODMgfSwKKyAgICB7IDQ2LCAxNywgMzMsIDE4MywgNiwgOTgsIDE1LCAzMiwgMTgzIH0sCisgICAgeyA1NywgNDYsIDIyLCAyNCwgMTI4LCAxLCA1NCwgMTcsIDM3IH0sCisgICAgeyA2NSwgMzIsIDczLCAxMTUsIDI4LCAxMjgsIDIzLCAxMjgsIDIwNSB9LAorICAgIHsgNDAsIDMsIDksIDExNSwgNTEsIDE5MiwgMTgsIDYsIDIyMyB9LAorICAgIHsgODcsIDM3LCA5LCAxMTUsIDU5LCA3NywgNjQsIDIxLCA0NyB9IH0sCisgIHsgeyAxMDQsIDU1LCA0NCwgMjE4LCA5LCA1NCwgNTMsIDEzMCwgMjI2IH0sCisgICAgeyA2NCwgOTAsIDcwLCAyMDUsIDQwLCA0MSwgMjMsIDI2LCA1NyB9LAorICAgIHsgNTQsIDU3LCAxMTIsIDE4NCwgNSwgNDEsIDM4LCAxNjYsIDIxMyB9LAorICAgIHsgMzAsIDM0LCAyNiwgMTMzLCAxNTIsIDExNiwgMTAsIDMyLCAxMzQgfSwKKyAgICB7IDM5LCAxOSwgNTMsIDIyMSwgMjYsIDExNCwgMzIsIDczLCAyNTUgfSwKKyAgICB7IDMxLCA5LCA2NSwgMjM0LCAyLCAxNSwgMSwgMTE4LCA3MyB9LAorICAgIHsgNzUsIDMyLCAxMiwgNTEsIDE5MiwgMjU1LCAxNjAsIDQzLCA1MSB9LAorICAgIHsgODgsIDMxLCAzNSwgNjcsIDEwMiwgODUsIDU1LCAxODYsIDg1IH0sCisgICAgeyA1NiwgMjEsIDIzLCAxMTEsIDU5LCAyMDUsIDQ1LCAzNywgMTkyIH0sCisgICAgeyA1NSwgMzgsIDcwLCAxMjQsIDczLCAxMDIsIDEsIDM0LCA5OCB9IH0sCisgIHsgeyAxMjUsIDk4LCA0MiwgODgsIDEwNCwgODUsIDExNywgMTc1LCA4MiB9LAorICAgIHsgOTUsIDg0LCA1MywgODksIDEyOCwgMTAwLCAxMTMsIDEwMSwgNDUgfSwKKyAgICB7IDc1LCA3OSwgMTIzLCA0NywgNTEsIDEyOCwgODEsIDE3MSwgMSB9LAorICAgIHsgNTcsIDE3LCA1LCA3MSwgMTAyLCA1NywgNTMsIDQxLCA0OSB9LAorICAgIHsgMzgsIDMzLCAxMywgMTIxLCA1NywgNzMsIDI2LCAxLCA4NSB9LAorICAgIHsgNDEsIDEwLCA2NywgMTM4LCA3NywgMTEwLCA5MCwgNDcsIDExNCB9LAorICAgIHsgMTE1LCAyMSwgMiwgMTAsIDEwMiwgMjU1LCAxNjYsIDIzLCA2IH0sCisgICAgeyAxMDEsIDI5LCAxNiwgMTAsIDg1LCAxMjgsIDEwMSwgMTk2LCAyNiB9LAorICAgIHsgNTcsIDE4LCAxMCwgMTAyLCAxMDIsIDIxMywgMzQsIDIwLCA0MyB9LAorICAgIHsgMTE3LCAyMCwgMTUsIDM2LCAxNjMsIDEyOCwgNjgsIDEsIDI2IH0gfSwKKyAgeyB7IDEwMiwgNjEsIDcxLCAzNywgMzQsIDUzLCAzMSwgMjQzLCAxOTIgfSwKKyAgICB7IDY5LCA2MCwgNzEsIDM4LCA3MywgMTE5LCAyOCwgMjIyLCAzNyB9LAorICAgIHsgNjgsIDQ1LCAxMjgsIDM0LCAxLCA0NywgMTEsIDI0NSwgMTcxIH0sCisgICAgeyA2MiwgMTcsIDE5LCA3MCwgMTQ2LCA4NSwgNTUsIDYyLCA3MCB9LAorICAgIHsgMzcsIDQzLCAzNywgMTU0LCAxMDAsIDE2MywgODUsIDE2MCwgMSB9LAorICAgIHsgNjMsIDksIDkyLCAxMzYsIDI4LCA2NCwgMzIsIDIwMSwgODUgfSwKKyAgICB7IDc1LCAxNSwgOSwgOSwgNjQsIDI1NSwgMTg0LCAxMTksIDE2IH0sCisgICAgeyA4NiwgNiwgMjgsIDUsIDY0LCAyNTUsIDI1LCAyNDgsIDEgfSwKKyAgICB7IDU2LCA4LCAxNywgMTMyLCAxMzcsIDI1NSwgNTUsIDExNiwgMTI4IH0sCisgICAgeyA1OCwgMTUsIDIwLCA4MiwgMTM1LCA1NywgMjYsIDEyMSwgNDAgfSB9LAorICB7IHsgMTY0LCA1MCwgMzEsIDEzNywgMTU0LCAxMzMsIDI1LCAzNSwgMjE4IH0sCisgICAgeyA1MSwgMTAzLCA0NCwgMTMxLCAxMzEsIDEyMywgMzEsIDYsIDE1OCB9LAorICAgIHsgODYsIDQwLCA2NCwgMTM1LCAxNDgsIDIyNCwgNDUsIDE4MywgMTI4IH0sCisgICAgeyAyMiwgMjYsIDE3LCAxMzEsIDI0MCwgMTU0LCAxNCwgMSwgMjA5IH0sCisgICAgeyA0NSwgMTYsIDIxLCA5MSwgNjQsIDIyMiwgNywgMSwgMTk3IH0sCisgICAgeyA1NiwgMjEsIDM5LCAxNTUsIDYwLCAxMzgsIDIzLCAxMDIsIDIxMyB9LAorICAgIHsgODMsIDEyLCAxMywgNTQsIDE5MiwgMjU1LCA2OCwgNDcsIDI4IH0sCisgICAgeyA4NSwgMjYsIDg1LCA4NSwgMTI4LCAxMjgsIDMyLCAxNDYsIDE3MSB9LAorICAgIHsgMTgsIDExLCA3LCA2MywgMTQ0LCAxNzEsIDQsIDQsIDI0NiB9LAorICAgIHsgMzUsIDI3LCAxMCwgMTQ2LCAxNzQsIDE3MSwgMTIsIDI2LCAxMjggfSB9LAorICB7IHsgMTkwLCA4MCwgMzUsIDk5LCAxODAsIDgwLCAxMjYsIDU0LCA0NSB9LAorICAgIHsgODUsIDEyNiwgNDcsIDg3LCAxNzYsIDUxLCA0MSwgMjAsIDMyIH0sCisgICAgeyAxMDEsIDc1LCAxMjgsIDEzOSwgMTE4LCAxNDYsIDExNiwgMTI4LCA4NSB9LAorICAgIHsgNTYsIDQxLCAxNSwgMTc2LCAyMzYsIDg1LCAzNywgOSwgNjIgfSwKKyAgICB7IDcxLCAzMCwgMTcsIDExOSwgMTE4LCAyNTUsIDE3LCAxOCwgMTM4IH0sCisgICAgeyAxMDEsIDM4LCA2MCwgMTM4LCA1NSwgNzAsIDQzLCAyNiwgMTQyIH0sCisgICAgeyAxNDYsIDM2LCAxOSwgMzAsIDE3MSwgMjU1LCA5NywgMjcsIDIwIH0sCisgICAgeyAxMzgsIDQ1LCA2MSwgNjIsIDIxOSwgMSwgODEsIDE4OCwgNjQgfSwKKyAgICB7IDMyLCA0MSwgMjAsIDExNywgMTUxLCAxNDIsIDIwLCAyMSwgMTYzIH0sCisgICAgeyAxMTIsIDE5LCAxMiwgNjEsIDE5NSwgMTI4LCA0OCwgNCwgMjQgfSB9Cit9OworCitzdGF0aWMgaW50IFB1dEk0TW9kZShWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LCBpbnQgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHByb2IpIHsKKyAgaWYgKFZQOFB1dEJpdChidywgbW9kZSAhPSBCX0RDX1BSRUQsIHByb2JbMF0pKSB7CisgICAgaWYgKFZQOFB1dEJpdChidywgbW9kZSAhPSBCX1RNX1BSRUQsIHByb2JbMV0pKSB7CisgICAgICBpZiAoVlA4UHV0Qml0KGJ3LCBtb2RlICE9IEJfVkVfUFJFRCwgcHJvYlsyXSkpIHsKKyAgICAgICAgaWYgKCFWUDhQdXRCaXQoYncsIG1vZGUgPj0gQl9MRF9QUkVELCBwcm9iWzNdKSkgeworICAgICAgICAgIGlmIChWUDhQdXRCaXQoYncsIG1vZGUgIT0gQl9IRV9QUkVELCBwcm9iWzRdKSkgeworICAgICAgICAgICAgVlA4UHV0Qml0KGJ3LCBtb2RlICE9IEJfUkRfUFJFRCwgcHJvYls1XSk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChWUDhQdXRCaXQoYncsIG1vZGUgIT0gQl9MRF9QUkVELCBwcm9iWzZdKSkgeworICAgICAgICAgICAgaWYgKFZQOFB1dEJpdChidywgbW9kZSAhPSBCX1ZMX1BSRUQsIHByb2JbN10pKSB7CisgICAgICAgICAgICAgIFZQOFB1dEJpdChidywgbW9kZSAhPSBCX0hEX1BSRUQsIHByb2JbOF0pOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gbW9kZTsKK30KKworc3RhdGljIHZvaWQgUHV0STE2TW9kZShWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LCBpbnQgbW9kZSkgeworICBpZiAoVlA4UHV0Qml0KGJ3LCAobW9kZSA9PSBUTV9QUkVEIHx8IG1vZGUgPT0gSF9QUkVEKSwgMTU2KSkgeworICAgIFZQOFB1dEJpdChidywgbW9kZSA9PSBUTV9QUkVELCAxMjgpOyAgICAvLyBUTSBvciBIRQorICB9IGVsc2UgeworICAgIFZQOFB1dEJpdChidywgbW9kZSA9PSBWX1BSRUQsIDE2Myk7ICAgICAvLyBWRSBvciBEQworICB9Cit9CisKK3N0YXRpYyB2b2lkIFB1dFVWTW9kZShWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LCBpbnQgdXZfbW9kZSkgeworICBpZiAoVlA4UHV0Qml0KGJ3LCB1dl9tb2RlICE9IERDX1BSRUQsIDE0MikpIHsKKyAgICBpZiAoVlA4UHV0Qml0KGJ3LCB1dl9tb2RlICE9IFZfUFJFRCwgMTE0KSkgeworICAgICAgVlA4UHV0Qml0KGJ3LCB1dl9tb2RlICE9IEhfUFJFRCwgMTgzKTsgICAgLy8gZWxzZTogVE1fUFJFRAorICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBQdXRTZWdtZW50KFZQOEJpdFdyaXRlciogY29uc3QgYncsIGludCBzLCBjb25zdCB1aW50OF90KiBwKSB7CisgIGlmIChWUDhQdXRCaXQoYncsIHMgPj0gMiwgcFswXSkpIHAgKz0gMTsKKyAgVlA4UHV0Qml0KGJ3LCBzICYgMSwgcFsxXSk7Cit9CisKK3ZvaWQgVlA4Q29kZUludHJhTW9kZXMoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7CisgIFZQOEJpdFdyaXRlciogY29uc3QgYncgPSAmZW5jLT5id187CisgIFZQOEVuY0l0ZXJhdG9yIGl0OworICBWUDhJdGVyYXRvckluaXQoZW5jLCAmaXQpOworICBkbyB7CisgICAgY29uc3QgVlA4TUJJbmZvKiBjb25zdCBtYiA9IGl0Lm1iXzsKKyAgICBjb25zdCB1aW50OF90KiBwcmVkcyA9IGl0LnByZWRzXzsKKyAgICBpZiAoZW5jLT5zZWdtZW50X2hkcl8udXBkYXRlX21hcF8pIHsKKyAgICAgIFB1dFNlZ21lbnQoYncsIG1iLT5zZWdtZW50XywgZW5jLT5wcm9iYV8uc2VnbWVudHNfKTsKKyAgICB9CisgICAgaWYgKGVuYy0+cHJvYmFfLnVzZV9za2lwX3Byb2JhXykgeworICAgICAgVlA4UHV0Qml0KGJ3LCBtYi0+c2tpcF8sIGVuYy0+cHJvYmFfLnNraXBfcHJvYmFfKTsKKyAgICB9CisgICAgaWYgKFZQOFB1dEJpdChidywgKG1iLT50eXBlXyAhPSAwKSwgMTQ1KSkgeyAgLy8gaTE2eDE2CisgICAgICBQdXRJMTZNb2RlKGJ3LCBwcmVkc1swXSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbnN0IGludCBwcmVkc193ID0gZW5jLT5wcmVkc193XzsKKyAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcF9wcmVkID0gcHJlZHMgLSBwcmVkc193OworICAgICAgaW50IHgsIHk7CisgICAgICBmb3IgKHkgPSAwOyB5IDwgNDsgKyt5KSB7CisgICAgICAgIGludCBsZWZ0ID0gcHJlZHNbLTFdOworICAgICAgICBmb3IgKHggPSAwOyB4IDwgNDsgKyt4KSB7CisgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgcHJvYmFzID0ga0JNb2Rlc1Byb2JhW3RvcF9wcmVkW3hdXVtsZWZ0XTsKKyAgICAgICAgICBsZWZ0ID0gUHV0STRNb2RlKGJ3LCBwcmVkc1t4XSwgcHJvYmFzKTsKKyAgICAgICAgfQorICAgICAgICB0b3BfcHJlZCA9IHByZWRzOworICAgICAgICBwcmVkcyArPSBwcmVkc193OworICAgICAgfQorICAgIH0KKyAgICBQdXRVVk1vZGUoYncsIG1iLT51dl9tb2RlXyk7CisgIH0gd2hpbGUgKFZQOEl0ZXJhdG9yTmV4dCgmaXQpKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFBhcmFncmFwaCAxMworCitjb25zdCB1aW50OF90CisgICAgVlA4Q29lZmZzVXBkYXRlUHJvYmFbTlVNX1RZUEVTXVtOVU1fQkFORFNdW05VTV9DVFhdW05VTV9QUk9CQVNdID0geworICB7IHsgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9CisgICAgfSwKKyAgICB7IHsgMTc2LCAyNDYsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjIzLCAyNDEsIDI1MiwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjQ5LCAyNTMsIDI1MywgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQorICAgIH0sCisgICAgeyB7IDI1NSwgMjQ0LCAyNTIsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDIzNCwgMjU0LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1MywgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KKyAgICB9LAorICAgIHsgeyAyNTUsIDI0NiwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyMzksIDI1MywgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTQsIDI1NSwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9CisgICAgfSwKKyAgICB7IHsgMjU1LCAyNDgsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjUxLCAyNTUsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQorICAgIH0sCisgICAgeyB7IDI1NSwgMjUzLCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1MSwgMjU0LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1NCwgMjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KKyAgICB9LAorICAgIHsgeyAyNTUsIDI1NCwgMjUzLCAyNTUsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTAsIDI1NSwgMjU0LCAyNTUsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9CisgICAgfSwKKyAgICB7IHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQorICAgIH0KKyAgfSwKKyAgeyB7IHsgMjE3LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjI1LCAyNTIsIDI0MSwgMjUzLCAyNTUsIDI1NSwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjM0LCAyNTAsIDI0MSwgMjUwLCAyNTMsIDI1NSwgMjUzLCAyNTQsIDI1NSwgMjU1LCAyNTUgfQorICAgIH0sCisgICAgeyB7IDI1NSwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDIyMywgMjU0LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDIzOCwgMjUzLCAyNTQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KKyAgICB9LAorICAgIHsgeyAyNTUsIDI0OCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNDksIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9CisgICAgfSwKKyAgICB7IHsgMjU1LCAyNTMsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjQ3LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQorICAgIH0sCisgICAgeyB7IDI1NSwgMjUzLCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1MiwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KKyAgICB9LAorICAgIHsgeyAyNTUsIDI1NCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTMsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9CisgICAgfSwKKyAgICB7IHsgMjU1LCAyNTQsIDI1MywgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjUwLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQorICAgIH0sCisgICAgeyB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KKyAgICB9CisgIH0sCisgIHsgeyB7IDE4NiwgMjUxLCAyNTAsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDIzNCwgMjUxLCAyNDQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1MSwgMjUxLCAyNDMsIDI1MywgMjU0LCAyNTUsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KKyAgICB9LAorICAgIHsgeyAyNTUsIDI1MywgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyMzYsIDI1MywgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTEsIDI1MywgMjUzLCAyNTQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9CisgICAgfSwKKyAgICB7IHsgMjU1LCAyNTQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjU0LCAyNTQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQorICAgIH0sCisgICAgeyB7IDI1NSwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1NCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KKyAgICB9LAorICAgIHsgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9CisgICAgfSwKKyAgICB7IHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQorICAgIH0sCisgICAgeyB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KKyAgICB9LAorICAgIHsgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9CisgICAgfQorICB9LAorICB7IHsgeyAyNDgsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTAsIDI1NCwgMjUyLCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNDgsIDI1NCwgMjQ5LCAyNTMsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9CisgICAgfSwKKyAgICB7IHsgMjU1LCAyNTMsIDI1MywgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjQ2LCAyNTMsIDI1MywgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjUyLCAyNTQsIDI1MSwgMjU0LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQorICAgIH0sCisgICAgeyB7IDI1NSwgMjU0LCAyNTIsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI0OCwgMjU0LCAyNTMsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1MywgMjU1LCAyNTQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KKyAgICB9LAorICAgIHsgeyAyNTUsIDI1MSwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNDUsIDI1MSwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTMsIDI1MywgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9CisgICAgfSwKKyAgICB7IHsgMjU1LCAyNTEsIDI1MywgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjUyLCAyNTMsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQorICAgIH0sCisgICAgeyB7IDI1NSwgMjUyLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI0OSwgMjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1NSwgMjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KKyAgICB9LAorICAgIHsgeyAyNTUsIDI1NSwgMjUzLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTAsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9CisgICAgfSwKKyAgICB7IHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQorICAgIH0KKyAgfQorfTsKKwordm9pZCBWUDhXcml0ZVByb2JhcyhWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LCBjb25zdCBWUDhFbmNQcm9iYSogY29uc3QgcHJvYmFzKSB7CisgIGludCB0LCBiLCBjLCBwOworICBmb3IgKHQgPSAwOyB0IDwgTlVNX1RZUEVTOyArK3QpIHsKKyAgICBmb3IgKGIgPSAwOyBiIDwgTlVNX0JBTkRTOyArK2IpIHsKKyAgICAgIGZvciAoYyA9IDA7IGMgPCBOVU1fQ1RYOyArK2MpIHsKKyAgICAgICAgZm9yIChwID0gMDsgcCA8IE5VTV9QUk9CQVM7ICsrcCkgeworICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgcDAgPSBwcm9iYXMtPmNvZWZmc19bdF1bYl1bY11bcF07CisgICAgICAgICAgY29uc3QgaW50IHVwZGF0ZSA9IChwMCAhPSBWUDhDb2VmZnNQcm9iYTBbdF1bYl1bY11bcF0pOworICAgICAgICAgIGlmIChWUDhQdXRCaXQoYncsIHVwZGF0ZSwgVlA4Q29lZmZzVXBkYXRlUHJvYmFbdF1bYl1bY11bcF0pKSB7CisgICAgICAgICAgICBWUDhQdXRCaXRzKGJ3LCBwMCwgOCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChWUDhQdXRCaXRVbmlmb3JtKGJ3LCBwcm9iYXMtPnVzZV9za2lwX3Byb2JhXykpIHsKKyAgICBWUDhQdXRCaXRzKGJ3LCBwcm9iYXMtPnNraXBfcHJvYmFfLCA4KTsKKyAgfQorfQorCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL3ZwOGlfZW5jLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL3ZwOGlfZW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRkYmZhNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvdnA4aV9lbmMuaApAQCAtMCwwICsxLDUyMCBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgV2ViUCBlbmNvZGVyOiBpbnRlcm5hbCBoZWFkZXIuCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2lmbmRlZiBXRUJQX0VOQ19WUDhJX0VOQ19IXworI2RlZmluZSBXRUJQX0VOQ19WUDhJX0VOQ19IXworCisjaWYgIWRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgPHN0cmluZy5oPiAgICAgLy8gZm9yIG1lbWNweSgpCisjZW5kaWYKKyNpbmNsdWRlICJzcmMvZGVjL2NvbW1vbl9kZWMuaCIKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorI2luY2x1ZGUgInNyYy91dGlscy9iaXRfd3JpdGVyX3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL3RocmVhZF91dGlscy5oIgorI2luY2x1ZGUgInNyYy91dGlscy91dGlscy5oIgorI2luY2x1ZGUgInNyYy93ZWJwL2VuY29kZS5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWYXJpb3VzIGRlZmluZXMgYW5kIGVudW1zCisKKy8vIHZlcnNpb24gbnVtYmVycworI2RlZmluZSBFTkNfTUFKX1ZFUlNJT04gMQorI2RlZmluZSBFTkNfTUlOX1ZFUlNJT04gMAorI2RlZmluZSBFTkNfUkVWX1ZFUlNJT04gMAorCitlbnVtIHsgTUFYX0xGX0xFVkVMUyA9IDY0LCAgICAgICAvLyBNYXhpbXVtIGxvb3AgZmlsdGVyIGxldmVsCisgICAgICAgTUFYX1ZBUklBQkxFX0xFVkVMID0gNjcsICAvLyBsYXN0IChpbmNsdXNpdmUpIGxldmVsIHdpdGggdmFyaWFibGUgY29zdAorICAgICAgIE1BWF9MRVZFTCA9IDIwNDcgICAgICAgICAgLy8gbWF4IGxldmVsIChub3RlOiBtYXggY29kYWJsZSBpcyAyMDQ3ICsgNjcpCisgICAgIH07CisKK3R5cGVkZWYgZW51bSB7ICAgLy8gUmF0ZS1kaXN0b3J0aW9uIG9wdGltaXphdGlvbiBsZXZlbHMKKyAgUkRfT1BUX05PTkUgICAgICAgID0gMCwgIC8vIG5vIHJkLW9wdAorICBSRF9PUFRfQkFTSUMgICAgICAgPSAxLCAgLy8gYmFzaWMgc2NvcmluZyAobm8gdHJlbGxpcykKKyAgUkRfT1BUX1RSRUxMSVMgICAgID0gMiwgIC8vIHBlcmZvcm0gdHJlbGxpcy1xdWFudCBvbiB0aGUgZmluYWwgZGVjaXNpb24gb25seQorICBSRF9PUFRfVFJFTExJU19BTEwgPSAzICAgLy8gdHJlbGxpcy1xdWFudCBmb3IgZXZlcnkgc2NvcmluZyAobXVjaCBzbG93ZXIpCit9IFZQOFJETGV2ZWw7CisKKy8vIFlVVi1jYWNoZSBwYXJhbWV0ZXJzLiBDYWNoZSBpcyAzMi1ieXRlcyB3aWRlICg9IG9uZSBjYWNoZWxpbmUpLgorLy8gVGhlIG9yaWdpbmFsIG9yIHJlY29uc3RydWN0ZWQgc2FtcGxlcyBjYW4gYmUgYWNjZXNzZWQgdXNpbmcgVlA4U2NhbltdLgorLy8gVGhlIHByZWRpY3RlZCBibG9ja3MgY2FuIGJlIGFjY2Vzc2VkIHVzaW5nIG9mZnNldHMgdG8geXV2X3BfIGFuZAorLy8gdGhlIGFycmF5cyBWUDgqTW9kZU9mZnNldHNbXS4KKy8vICogWVVWIFNhbXBsZXMgYXJlYSAoeXV2X2luXy95dXZfb3V0Xy95dXZfb3V0Ml8pCisvLyAgIChzZWUgVlA4U2NhbltdIGZvciBhY2Nlc3NpbmcgdGhlIGJsb2NrcywgYWxvbmcgd2l0aAorLy8gICBZX09GRl9FTkMvVV9PRkZfRU5DL1ZfT0ZGX0VOQyk6CisvLyAgICAgICAgICAgICArLS0tLSstLS0tKworLy8gIFlfT0ZGX0VOQyAgfFlZWVl8VVVWVnwKKy8vICBVX09GRl9FTkMgIHxZWVlZfFVVVlZ8CisvLyAgVl9PRkZfRU5DICB8WVlZWXwuLi4ufCA8LSAyNSUgd2FzdGVkIFUvViBhcmVhCisvLyAgICAgICAgICAgICB8WVlZWXwuLi4ufAorLy8gICAgICAgICAgICAgKy0tLS0rLS0tLSsKKy8vICogUHJlZGljdGlvbiBhcmVhICgneXV2X3BfJywgc2l6ZSA9IFBSRURfU0laRV9FTkMpCisvLyAgIEludHJhMTYgcHJlZGljdGlvbnMgKDE2eDE2IGJsb2NrIGVhY2gsIHR3byBwZXIgcm93KToKKy8vICAgICAgICAgfEkxNkRDMTZ8STE2VE0xNnwKKy8vICAgICAgICAgfEkxNlZFMTZ8STE2SEUxNnwKKy8vICAgQ2hyb21hIFUvViBwcmVkaWN0aW9ucyAoMTZ4OCBibG9jayBlYWNoLCB0d28gcGVyIHJvdyk6CisvLyAgICAgICAgIHxDOERDOHxDOFRNOHwKKy8vICAgICAgICAgfEM4VkU4fEM4SEU4fAorLy8gICBJbnRyYSA0eDQgcHJlZGljdGlvbnMgKDR4NCBibG9jayBlYWNoKQorLy8gICAgICAgICB8STREQzQgSTRUTTQgSTRWRTQgSTRIRTR8STRSRDQgSTRWUjQgSTRMRDQgSTRWTDR8CisvLyAgICAgICAgIHxJNEhENCBJNEhVNCBJNFRNUCAuLi4uLnwuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLnwgPC0gfjMxJSB3YXN0ZWQKKyNkZWZpbmUgWVVWX1NJWkVfRU5DIChCUFMgKiAxNikKKyNkZWZpbmUgUFJFRF9TSVpFX0VOQyAoMzIgKiBCUFMgKyAxNiAqIEJQUyArIDggKiBCUFMpICAgLy8gSTE2K0Nocm9tYStJNCBwcmVkcworI2RlZmluZSBZX09GRl9FTkMgICAgKDApCisjZGVmaW5lIFVfT0ZGX0VOQyAgICAoMTYpCisjZGVmaW5lIFZfT0ZGX0VOQyAgICAoMTYgKyA4KQorCitleHRlcm4gY29uc3QgdWludDE2X3QgVlA4U2NhblsxNl07CitleHRlcm4gY29uc3QgdWludDE2X3QgVlA4VVZNb2RlT2Zmc2V0c1s0XTsKK2V4dGVybiBjb25zdCB1aW50MTZfdCBWUDhJMTZNb2RlT2Zmc2V0c1s0XTsKK2V4dGVybiBjb25zdCB1aW50MTZfdCBWUDhJNE1vZGVPZmZzZXRzW05VTV9CTU9ERVNdOworCisvLyBMYXlvdXQgb2YgcHJlZGljdGlvbiBibG9ja3MKKy8vIGludHJhIDE2eDE2CisjZGVmaW5lIEkxNkRDMTYgKDAgKiAxNiAqIEJQUykKKyNkZWZpbmUgSTE2VE0xNiAoSTE2REMxNiArIDE2KQorI2RlZmluZSBJMTZWRTE2ICgxICogMTYgKiBCUFMpCisjZGVmaW5lIEkxNkhFMTYgKEkxNlZFMTYgKyAxNikKKy8vIGNocm9tYSA4eDgsIHR3byBVL1YgYmxvY2tzIHNpZGUgYnkgc2lkZSAoaGVuY2U6IDE2eDggZWFjaCkKKyNkZWZpbmUgQzhEQzggKDIgKiAxNiAqIEJQUykKKyNkZWZpbmUgQzhUTTggKEM4REM4ICsgMSAqIDE2KQorI2RlZmluZSBDOFZFOCAoMiAqIDE2ICogQlBTICsgOCAqIEJQUykKKyNkZWZpbmUgQzhIRTggKEM4VkU4ICsgMSAqIDE2KQorLy8gaW50cmEgNHg0CisjZGVmaW5lIEk0REM0ICgzICogMTYgKiBCUFMgKyAgMCkKKyNkZWZpbmUgSTRUTTQgKEk0REM0ICsgIDQpCisjZGVmaW5lIEk0VkU0IChJNERDNCArICA4KQorI2RlZmluZSBJNEhFNCAoSTREQzQgKyAxMikKKyNkZWZpbmUgSTRSRDQgKEk0REM0ICsgMTYpCisjZGVmaW5lIEk0VlI0IChJNERDNCArIDIwKQorI2RlZmluZSBJNExENCAoSTREQzQgKyAyNCkKKyNkZWZpbmUgSTRWTDQgKEk0REM0ICsgMjgpCisjZGVmaW5lIEk0SEQ0ICgzICogMTYgKiBCUFMgKyA0ICogQlBTKQorI2RlZmluZSBJNEhVNCAoSTRIRDQgKyA0KQorI2RlZmluZSBJNFRNUCAoSTRIRDQgKyA4KQorCit0eXBlZGVmIGludDY0X3Qgc2NvcmVfdDsgICAgIC8vIHR5cGUgdXNlZCBmb3Igc2NvcmVzLCByYXRlLCBkaXN0b3J0aW9uCisvLyBOb3RlIHRoYXQgTUFYX0NPU1QgaXMgbm90IHRoZSBtYXhpbXVtIGFsbG93ZWQgYnkgc2l6ZW9mKHNjb3JlX3QpLAorLy8gaW4gb3JkZXIgdG8gYWxsb3cgb3ZlcmZsb3dpbmcgY29tcHV0YXRpb25zLgorI2RlZmluZSBNQVhfQ09TVCAoKHNjb3JlX3QpMHg3ZmZmZmZmZmZmZmZmZkxMKQorCisjZGVmaW5lIFFGSVggMTcKKyNkZWZpbmUgQklBUyhiKSAgKChiKSA8PCAoUUZJWCAtIDgpKQorLy8gRnVuIGZhY3Q6IHRoaXMgaXMgdGhlIF9vbmx5XyBsaW5lIHdoZXJlIHdlJ3JlIGFjdHVhbGx5IGJlaW5nIGxvc3N5IGFuZAorLy8gZGlzY2FyZGluZyBiaXRzLgorc3RhdGljIFdFQlBfSU5MSU5FIGludCBRVUFOVERJVih1aW50MzJfdCBuLCB1aW50MzJfdCBpUSwgdWludDMyX3QgQikgeworICByZXR1cm4gKGludCkoKG4gKiBpUSArIEIpID4+IFFGSVgpOworfQorCisvLyBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZyB0byByZW1vdmUgdG9rZW4tYnVmZmVyIGNvZGU6CisvLyAjZGVmaW5lIERJU0FCTEVfVE9LRU5fQlVGRkVSCisKKy8vIHF1YWxpdHkgYmVsb3cgd2hpY2ggZXJyb3ItZGlmZnVzaW9uIGlzIGVuYWJsZWQKKyNkZWZpbmUgRVJST1JfRElGRlVTSU9OX1FVQUxJVFkgOTgKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhlYWRlcnMKKwordHlwZWRlZiB1aW50MzJfdCBwcm9iYV90OyAgIC8vIDE2YiArIDE2YgordHlwZWRlZiB1aW50OF90IFByb2JhQXJyYXlbTlVNX0NUWF1bTlVNX1BST0JBU107Cit0eXBlZGVmIHByb2JhX3QgU3RhdHNBcnJheVtOVU1fQ1RYXVtOVU1fUFJPQkFTXTsKK3R5cGVkZWYgdWludDE2X3QgQ29zdEFycmF5W05VTV9DVFhdW01BWF9WQVJJQUJMRV9MRVZFTCArIDFdOwordHlwZWRlZiBjb25zdCB1aW50MTZfdCogKCpDb3N0QXJyYXlQdHIpW05VTV9DVFhdOyAgIC8vIGZvciBlYXN5IGNhc3RpbmcKK3R5cGVkZWYgY29uc3QgdWludDE2X3QqIENvc3RBcnJheU1hcFsxNl1bTlVNX0NUWF07Cit0eXBlZGVmIGRvdWJsZSBMRlN0YXRzW05VTV9NQl9TRUdNRU5UU11bTUFYX0xGX0xFVkVMU107ICAvLyBmaWx0ZXIgc3RhdHMKKwordHlwZWRlZiBzdHJ1Y3QgVlA4RW5jb2RlciBWUDhFbmNvZGVyOworCisvLyBzZWdtZW50IGZlYXR1cmVzCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCBudW1fc2VnbWVudHNfOyAgICAgIC8vIEFjdHVhbCBudW1iZXIgb2Ygc2VnbWVudHMuIDEgc2VnbWVudCBvbmx5ID0gdW51c2VkLgorICBpbnQgdXBkYXRlX21hcF87ICAgICAgICAvLyB3aGV0aGVyIHRvIHVwZGF0ZSB0aGUgc2VnbWVudCBtYXAgb3Igbm90LgorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtdXN0IGJlIDAgaWYgdGhlcmUncyBvbmx5IDEgc2VnbWVudC4KKyAgaW50IHNpemVfOyAgICAgICAgICAgICAgLy8gYml0LWNvc3QgZm9yIHRyYW5zbWl0dGluZyB0aGUgc2VnbWVudCBtYXAKK30gVlA4RW5jU2VnbWVudEhlYWRlcjsKKworLy8gU3RydWN0IGNvbGxlY3RpbmcgYWxsIGZyYW1lLXBlcnNpc3RlbnQgcHJvYmFiaWxpdGllcy4KK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDhfdCBzZWdtZW50c19bM107ICAgICAvLyBwcm9iYWJpbGl0aWVzIGZvciBzZWdtZW50IHRyZWUKKyAgdWludDhfdCBza2lwX3Byb2JhXzsgICAgICAvLyBmaW5hbCBwcm9iYWJpbGl0eSBvZiBiZWluZyBza2lwcGVkLgorICBQcm9iYUFycmF5IGNvZWZmc19bTlVNX1RZUEVTXVtOVU1fQkFORFNdOyAgICAgIC8vIDEwNTYgYnl0ZXMKKyAgU3RhdHNBcnJheSBzdGF0c19bTlVNX1RZUEVTXVtOVU1fQkFORFNdOyAgICAgICAvLyA0MjI0IGJ5dGVzCisgIENvc3RBcnJheSBsZXZlbF9jb3N0X1tOVU1fVFlQRVNdW05VTV9CQU5EU107ICAgLy8gMTMwNTYgYnl0ZXMKKyAgQ29zdEFycmF5TWFwIHJlbWFwcGVkX2Nvc3RzX1tOVU1fVFlQRVNdOyAgICAgICAvLyAxNTM2IGJ5dGVzCisgIGludCBkaXJ0eV87ICAgICAgICAgICAgICAgLy8gaWYgdHJ1ZSwgbmVlZCB0byBjYWxsIFZQOENhbGN1bGF0ZUxldmVsQ29zdHMoKQorICBpbnQgdXNlX3NraXBfcHJvYmFfOyAgICAgIC8vIE5vdGU6IHdlIGFsd2F5cyB1c2Ugc2tpcF9wcm9iYSBmb3Igbm93LgorICBpbnQgbmJfc2tpcF87ICAgICAgICAgICAgIC8vIG51bWJlciBvZiBza2lwcGVkIGJsb2NrcworfSBWUDhFbmNQcm9iYTsKKworLy8gRmlsdGVyIHBhcmFtZXRlcnMuIE5vdCBhY3R1YWxseSB1c2VkIGluIHRoZSBjb2RlICh3ZSBkb24ndCBwZXJmb3JtCisvLyB0aGUgaW4tbG9vcCBmaWx0ZXJpbmcpLCBidXQgZmlsbGVkIGZyb20gdXNlcidzIGNvbmZpZwordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQgc2ltcGxlXzsgICAgICAgICAgICAgLy8gZmlsdGVyaW5nIHR5cGU6IDA9Y29tcGxleCwgMT1zaW1wbGUKKyAgaW50IGxldmVsXzsgICAgICAgICAgICAgIC8vIGJhc2UgZmlsdGVyIGxldmVsIFswLi42M10KKyAgaW50IHNoYXJwbmVzc187ICAgICAgICAgIC8vIFswLi43XQorICBpbnQgaTR4NF9sZl9kZWx0YV87ICAgICAgLy8gZGVsdGEgZmlsdGVyIGxldmVsIGZvciBpNHg0IHJlbGF0aXZlIHRvIGkxNngxNgorfSBWUDhFbmNGaWx0ZXJIZWFkZXI7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbmZvcm1hdGlvbnMgYWJvdXQgdGhlIG1hY3JvYmxvY2tzLgorCit0eXBlZGVmIHN0cnVjdCB7CisgIC8vIGJsb2NrIHR5cGUKKyAgdW5zaWduZWQgaW50IHR5cGVfOjI7ICAgICAvLyAwPWk0eDQsIDE9aTE2eDE2CisgIHVuc2lnbmVkIGludCB1dl9tb2RlXzoyOworICB1bnNpZ25lZCBpbnQgc2tpcF86MTsKKyAgdW5zaWduZWQgaW50IHNlZ21lbnRfOjI7CisgIHVpbnQ4X3QgYWxwaGFfOyAgICAgIC8vIHF1YW50aXphdGlvbi1zdXNjZXB0aWJpbGl0eQorfSBWUDhNQkluZm87CisKK3R5cGVkZWYgc3RydWN0IFZQOE1hdHJpeCB7CisgIHVpbnQxNl90IHFfWzE2XTsgICAgICAgIC8vIHF1YW50aXplciBzdGVwcworICB1aW50MTZfdCBpcV9bMTZdOyAgICAgICAvLyByZWNpcHJvY2FscywgZml4ZWQgcG9pbnQuCisgIHVpbnQzMl90IGJpYXNfWzE2XTsgICAgIC8vIHJvdW5kaW5nIGJpYXMKKyAgdWludDMyX3QgenRocmVzaF9bMTZdOyAgLy8gdmFsdWUgYmVsb3cgd2hpY2ggYSBjb2VmZmljaWVudCBpcyB6ZXJvZWQKKyAgdWludDE2X3Qgc2hhcnBlbl9bMTZdOyAgLy8gZnJlcXVlbmN5IGJvb3N0ZXJzIGZvciBzbGlnaHQgc2hhcnBlbmluZworfSBWUDhNYXRyaXg7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgVlA4TWF0cml4IHkxXywgeTJfLCB1dl87ICAvLyBxdWFudGl6YXRpb24gbWF0cmljZXMKKyAgaW50IGFscGhhXzsgICAgICAvLyBxdWFudC1zdXNjZXB0aWJpbGl0eSwgcmFuZ2UgWy0xMjcsMTI3XS4gWmVybyBpcyBuZXV0cmFsLgorICAgICAgICAgICAgICAgICAgIC8vIExvd2VyIHZhbHVlcyBpbmRpY2F0ZSBhIGxvd2VyIHJpc2sgb2YgYmx1cnJpbmVzcy4KKyAgaW50IGJldGFfOyAgICAgICAvLyBmaWx0ZXItc3VzY2VwdGliaWxpdHksIHJhbmdlIFswLDI1NV0uCisgIGludCBxdWFudF87ICAgICAgLy8gZmluYWwgc2VnbWVudCBxdWFudGl6ZXIuCisgIGludCBmc3RyZW5ndGhfOyAgLy8gZmluYWwgaW4tbG9vcCBmaWx0ZXJpbmcgc3RyZW5ndGgKKyAgaW50IG1heF9lZGdlXzsgICAvLyBtYXggZWRnZSBkZWx0YSAoZm9yIGZpbHRlcmluZyBzdHJlbmd0aCkKKyAgaW50IG1pbl9kaXN0b187ICAvLyBtaW5pbXVtIGRpc3RvcnRpb24gcmVxdWlyZWQgdG8gdHJpZ2dlciBmaWx0ZXJpbmcgcmVjb3JkCisgIC8vIHJlYWN0aXZpdGllcworICBpbnQgbGFtYmRhX2kxNl8sIGxhbWJkYV9pNF8sIGxhbWJkYV91dl87CisgIGludCBsYW1iZGFfbW9kZV8sIGxhbWJkYV90cmVsbGlzXywgdGxhbWJkYV87CisgIGludCBsYW1iZGFfdHJlbGxpc19pMTZfLCBsYW1iZGFfdHJlbGxpc19pNF8sIGxhbWJkYV90cmVsbGlzX3V2XzsKKworICAvLyBsYW1iZGEgdmFsdWVzIGZvciBkaXN0b3J0aW9uLWJhc2VkIGV2YWx1YXRpb24KKyAgc2NvcmVfdCBpNF9wZW5hbHR5XzsgICAvLyBwZW5hbHR5IGZvciB1c2luZyBJbnRyYTQKK30gVlA4U2VnbWVudEluZm87CisKK3R5cGVkZWYgaW50OF90IERFcnJvclsyIC8qIHUvdiAqL11bMiAvKiB0b3Agb3IgbGVmdCAqL107CisKKy8vIEhhbmR5IHRyYW5zaWVudCBzdHJ1Y3QgdG8gYWNjdW11bGF0ZSBzY29yZSBhbmQgaW5mbyBkdXJpbmcgUkQtb3B0aW1pemF0aW9uCisvLyBhbmQgbW9kZSBldmFsdWF0aW9uLgordHlwZWRlZiBzdHJ1Y3QgeworICBzY29yZV90IEQsIFNEOyAgICAgICAgICAgICAgLy8gRGlzdG9ydGlvbiwgc3BlY3RyYWwgZGlzdG9ydGlvbgorICBzY29yZV90IEgsIFIsIHNjb3JlOyAgICAgICAgLy8gaGVhZGVyIGJpdHMsIHJhdGUsIHNjb3JlLgorICBpbnQxNl90IHlfZGNfbGV2ZWxzWzE2XTsgICAgLy8gUXVhbnRpemVkIGxldmVscyBmb3IgbHVtYS1EQywgbHVtYS1BQywgY2hyb21hLgorICBpbnQxNl90IHlfYWNfbGV2ZWxzWzE2XVsxNl07CisgIGludDE2X3QgdXZfbGV2ZWxzWzQgKyA0XVsxNl07CisgIGludCBtb2RlX2kxNjsgICAgICAgICAgICAgICAvLyBtb2RlIG51bWJlciBmb3IgaW50cmExNiBwcmVkaWN0aW9uCisgIHVpbnQ4X3QgbW9kZXNfaTRbMTZdOyAgICAgICAvLyBtb2RlIG51bWJlcnMgZm9yIGludHJhNCBwcmVkaWN0aW9ucworICBpbnQgbW9kZV91djsgICAgICAgICAgICAgICAgLy8gbW9kZSBudW1iZXIgb2YgY2hyb21hIHByZWRpY3Rpb24KKyAgdWludDMyX3Qgbno7ICAgICAgICAgICAgICAgIC8vIG5vbi16ZXJvIGJsb2NrcworICBpbnQ4X3QgZGVyclsyXVszXTsgICAgICAgICAgLy8gREMgZGlmZnVzaW9uIGVycm9ycyBmb3IgVS9WIGZvciBibG9ja3MgIzEvMi8zCit9IFZQOE1vZGVTY29yZTsKKworLy8gSXRlcmF0b3Igc3RydWN0dXJlIHRvIGl0ZXJhdGUgdGhyb3VnaCBtYWNyb2Jsb2NrcywgcG9pbnRpbmcgdG8gdGhlCisvLyByaWdodCBuZWlnaGJvdXJpbmcgZGF0YSAoc2FtcGxlcywgcHJlZGljdGlvbnMsIGNvbnRleHRzLCAuLi4pCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCB4XywgeV87ICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgbWFjcm9ibG9jaworICB1aW50OF90KiAgICAgIHl1dl9pbl87ICAgICAgICAgICAvLyBpbnB1dCBzYW1wbGVzCisgIHVpbnQ4X3QqICAgICAgeXV2X291dF87ICAgICAgICAgIC8vIG91dHB1dCBzYW1wbGVzCisgIHVpbnQ4X3QqICAgICAgeXV2X291dDJfOyAgICAgICAgIC8vIHNlY29uZGFyeSBidWZmZXIgc3dhcHBlZCB3aXRoIHl1dl9vdXRfLgorICB1aW50OF90KiAgICAgIHl1dl9wXzsgICAgICAgICAgICAvLyBzY3JhdGNoIGJ1ZmZlciBmb3IgcHJlZGljdGlvbgorICBWUDhFbmNvZGVyKiAgIGVuY187ICAgICAgICAgICAgICAvLyBiYWNrLXBvaW50ZXIKKyAgVlA4TUJJbmZvKiAgICBtYl87ICAgICAgICAgICAgICAgLy8gY3VycmVudCBtYWNyb2Jsb2NrCisgIFZQOEJpdFdyaXRlciogYndfOyAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgYml0LXdyaXRlcgorICB1aW50OF90KiAgICAgIHByZWRzXzsgICAgICAgICAgICAvLyBpbnRyYSBtb2RlIHByZWRpY3RvcnMgKDR4NCBibG9ja3MpCisgIHVpbnQzMl90KiAgICAgbnpfOyAgICAgICAgICAgICAgIC8vIG5vbi16ZXJvIHBhdHRlcm4KKyAgdWludDhfdCAgICAgICBpNF9ib3VuZGFyeV9bMzddOyAgLy8gMzIrNSBib3VuZGFyeSBzYW1wbGVzIG5lZWRlZCBieSBpbnRyYTR4NAorICB1aW50OF90KiAgICAgIGk0X3RvcF87ICAgICAgICAgICAvLyBwb2ludGVyIHRvIHRoZSBjdXJyZW50IHRvcCBib3VuZGFyeSBzYW1wbGUKKyAgaW50ICAgICAgICAgICBpNF87ICAgICAgICAgICAgICAgLy8gY3VycmVudCBpbnRyYTR4NCBtb2RlIGJlaW5nIHRlc3RlZAorICBpbnQgICAgICAgICAgIHRvcF9uel9bOV07ICAgICAgICAvLyB0b3Atbm9uLXplcm8gY29udGV4dC4KKyAgaW50ICAgICAgICAgICBsZWZ0X256X1s5XTsgICAgICAgLy8gbGVmdC1ub24temVyby4gbGVmdF9uels4XSBpcyBpbmRlcGVuZGVudC4KKyAgdWludDY0X3QgICAgICBiaXRfY291bnRfWzRdWzNdOyAgLy8gYml0IGNvdW50ZXJzIGZvciBjb2RlZCBsZXZlbHMuCisgIHVpbnQ2NF90ICAgICAgbHVtYV9iaXRzXzsgICAgICAgIC8vIG1hY3JvYmxvY2sgYml0LWNvc3QgZm9yIGx1bWEKKyAgdWludDY0X3QgICAgICB1dl9iaXRzXzsgICAgICAgICAgLy8gbWFjcm9ibG9jayBiaXQtY29zdCBmb3IgY2hyb21hCisgIExGU3RhdHMqICAgICAgbGZfc3RhdHNfOyAgICAgICAgIC8vIGZpbHRlciBzdGF0cyAoYm9ycm93ZWQgZnJvbSBlbmNfKQorICBpbnQgICAgICAgICAgIGRvX3RyZWxsaXNfOyAgICAgICAvLyBpZiB0cnVlLCBwZXJmb3JtIGV4dHJhIGxldmVsIG9wdGltaXNhdGlvbgorICBpbnQgICAgICAgICAgIGNvdW50X2Rvd25fOyAgICAgICAvLyBudW1iZXIgb2YgbWIgc3RpbGwgdG8gYmUgcHJvY2Vzc2VkCisgIGludCAgICAgICAgICAgY291bnRfZG93bjBfOyAgICAgIC8vIHN0YXJ0aW5nIGNvdW50ZXIgdmFsdWUgKGZvciBwcm9ncmVzcykKKyAgaW50ICAgICAgICAgICBwZXJjZW50MF87ICAgICAgICAgLy8gc2F2ZWQgaW5pdGlhbCBwcm9ncmVzcyBwZXJjZW50CisKKyAgREVycm9yICAgICAgICBsZWZ0X2RlcnJfOyAgICAgICAgLy8gbGVmdCBlcnJvciBkaWZmdXNpb24gKHUvdikKKyAgREVycm9yICAgICAgICp0b3BfZGVycl87ICAgICAgICAgLy8gdG9wIGRpZmZ1c2lvbiBlcnJvciAtIE5VTEwgaWYgZGlzYWJsZWQKKworICB1aW50OF90KiB5X2xlZnRfOyAgICAvLyBsZWZ0IGx1bWEgc2FtcGxlcyAoYWRkcmVzc2FibGUgZnJvbSBpbmRleCAtMSB0byAxNSkuCisgIHVpbnQ4X3QqIHVfbGVmdF87ICAgIC8vIGxlZnQgdSBzYW1wbGVzIChhZGRyZXNzYWJsZSBmcm9tIGluZGV4IC0xIHRvIDcpCisgIHVpbnQ4X3QqIHZfbGVmdF87ICAgIC8vIGxlZnQgdiBzYW1wbGVzIChhZGRyZXNzYWJsZSBmcm9tIGluZGV4IC0xIHRvIDcpCisKKyAgdWludDhfdCogeV90b3BfOyAgICAgLy8gdG9wIGx1bWEgc2FtcGxlcyBhdCBwb3NpdGlvbiAneF8nCisgIHVpbnQ4X3QqIHV2X3RvcF87ICAgIC8vIHRvcCB1L3Ygc2FtcGxlcyBhdCBwb3NpdGlvbiAneF8nLCBwYWNrZWQgYXMgMTYgYnl0ZXMKKworICAvLyBtZW1vcnkgZm9yIHN0b3JpbmcgeS91L3ZfbGVmdF8KKyAgdWludDhfdCB5dXZfbGVmdF9tZW1fWzE3ICsgMTYgKyAxNiArIDggKyBXRUJQX0FMSUdOX0NTVF07CisgIC8vIG1lbW9yeSBmb3IgeXV2XyoKKyAgdWludDhfdCB5dXZfbWVtX1szICogWVVWX1NJWkVfRU5DICsgUFJFRF9TSVpFX0VOQyArIFdFQlBfQUxJR05fQ1NUXTsKK30gVlA4RW5jSXRlcmF0b3I7CisKKyAgLy8gaW4gaXRlcmF0b3IuYworLy8gbXVzdCBiZSBjYWxsZWQgZmlyc3QKK3ZvaWQgVlA4SXRlcmF0b3JJbml0KFZQOEVuY29kZXIqIGNvbnN0IGVuYywgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KTsKKy8vIHJlc3RhcnQgYSBzY2FuCit2b2lkIFZQOEl0ZXJhdG9yUmVzZXQoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KTsKKy8vIHJlc2V0IGl0ZXJhdG9yIHBvc2l0aW9uIHRvIHJvdyAneScKK3ZvaWQgVlA4SXRlcmF0b3JTZXRSb3coVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBpbnQgeSk7CisvLyBzZXQgY291bnQgZG93biAoPW51bWJlciBvZiBpdGVyYXRpb25zIHRvIGdvKQordm9pZCBWUDhJdGVyYXRvclNldENvdW50RG93bihWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsIGludCBjb3VudF9kb3duKTsKKy8vIHJldHVybiB0cnVlIGlmIGl0ZXJhdGlvbiBpcyBmaW5pc2hlZAoraW50IFZQOEl0ZXJhdG9ySXNEb25lKGNvbnN0IFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCk7CisvLyBJbXBvcnQgdW5jb21wcmVzc2VkIHNhbXBsZXMgZnJvbSBzb3VyY2UuCisvLyBJZiB0bXBfMzIgaXMgbm90IE5VTEwsIGltcG9ydCBib3VuZGFyeSBzYW1wbGVzIHRvby4KKy8vIHRtcF8zMiBpcyBhIDMyLWJ5dGVzIHNjcmF0Y2ggYnVmZmVyIHRoYXQgbXVzdCBiZSBhbGlnbmVkIGluIG1lbW9yeS4KK3ZvaWQgVlA4SXRlcmF0b3JJbXBvcnQoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCB1aW50OF90KiB0bXBfMzIpOworLy8gZXhwb3J0IGRlY2ltYXRlZCBzYW1wbGVzCit2b2lkIFZQOEl0ZXJhdG9yRXhwb3J0KGNvbnN0IFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCk7CisvLyBnbyB0byBuZXh0IG1hY3JvYmxvY2suIFJldHVybnMgZmFsc2UgaWYgbm90IGZpbmlzaGVkLgoraW50IFZQOEl0ZXJhdG9yTmV4dChWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpOworLy8gc2F2ZSB0aGUgeXV2X291dF8gYm91bmRhcnkgdmFsdWVzIHRvIHRvcF8vbGVmdF8gYXJyYXlzIGZvciBuZXh0IGl0ZXJhdGlvbnMuCit2b2lkIFZQOEl0ZXJhdG9yU2F2ZUJvdW5kYXJ5KFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCk7CisvLyBSZXBvcnQgcHJvZ3Jlc3Npb24gYmFzZWQgb24gbWFjcm9ibG9jayByb3dzLiBSZXR1cm4gMCBmb3IgdXNlci1hYm9ydCByZXF1ZXN0LgoraW50IFZQOEl0ZXJhdG9yUHJvZ3Jlc3MoY29uc3QgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbmFsX2RlbHRhX3BlcmNlbnQpOworLy8gSW50cmE0eDQgaXRlcmF0aW9ucwordm9pZCBWUDhJdGVyYXRvclN0YXJ0STQoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KTsKKy8vIHJldHVybnMgdHJ1ZSBpZiBub3QgZG9uZS4KK2ludCBWUDhJdGVyYXRvclJvdGF0ZUk0KFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHl1dl9vdXQpOworCisvLyBOb24temVybyBjb250ZXh0IHNldHVwL3RlYXJkb3duCit2b2lkIFZQOEl0ZXJhdG9yTnpUb0J5dGVzKFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCk7Cit2b2lkIFZQOEl0ZXJhdG9yQnl0ZXNUb056KFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCk7CisKKy8vIEhlbHBlciBmdW5jdGlvbnMgdG8gc2V0IG1vZGUgcHJvcGVydGllcwordm9pZCBWUDhTZXRJbnRyYTE2TW9kZShjb25zdCBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsIGludCBtb2RlKTsKK3ZvaWQgVlA4U2V0SW50cmE0TW9kZShjb25zdCBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsIGNvbnN0IHVpbnQ4X3QqIG1vZGVzKTsKK3ZvaWQgVlA4U2V0SW50cmFVVk1vZGUoY29uc3QgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBpbnQgbW9kZSk7Cit2b2lkIFZQOFNldFNraXAoY29uc3QgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBpbnQgc2tpcCk7Cit2b2lkIFZQOFNldFNlZ21lbnQoY29uc3QgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBpbnQgc2VnbWVudCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQYWdpbmF0ZWQgdG9rZW4gYnVmZmVyCisKK3R5cGVkZWYgc3RydWN0IFZQOFRva2VucyBWUDhUb2tlbnM7ICAvLyBzdHJ1Y3QgZGV0YWlscyBpbiB0b2tlbi5jCisKK3R5cGVkZWYgc3RydWN0IHsKKyNpZiAhZGVmaW5lZChESVNBQkxFX1RPS0VOX0JVRkZFUikKKyAgVlA4VG9rZW5zKiBwYWdlc187ICAgICAgICAvLyBmaXJzdCBwYWdlCisgIFZQOFRva2VucyoqIGxhc3RfcGFnZV87ICAgLy8gbGFzdCBwYWdlCisgIHVpbnQxNl90KiB0b2tlbnNfOyAgICAgICAgLy8gc2V0IHRvICgqbGFzdF9wYWdlXyktPnRva2Vuc18KKyAgaW50IGxlZnRfOyAgICAgICAgICAgICAgICAvLyBob3cgbWFueSBmcmVlIHRva2VucyBsZWZ0IGJlZm9yZSB0aGUgcGFnZSBpcyBmdWxsCisgIGludCBwYWdlX3NpemVfOyAgICAgICAgICAgLy8gbnVtYmVyIG9mIHRva2VucyBwZXIgcGFnZQorI2VuZGlmCisgIGludCBlcnJvcl87ICAgICAgICAgLy8gdHJ1ZSBpbiBjYXNlIG9mIG1hbGxvYyBlcnJvcgorfSBWUDhUQnVmZmVyOworCisvLyBpbml0aWFsaXplIGFuIGVtcHR5IGJ1ZmZlcgordm9pZCBWUDhUQnVmZmVySW5pdChWUDhUQnVmZmVyKiBjb25zdCBiLCBpbnQgcGFnZV9zaXplKTsKK3ZvaWQgVlA4VEJ1ZmZlckNsZWFyKFZQOFRCdWZmZXIqIGNvbnN0IGIpOyAgIC8vIGRlLWFsbG9jYXRlIHBhZ2VzIG1lbW9yeQorCisjaWYgIWRlZmluZWQoRElTQUJMRV9UT0tFTl9CVUZGRVIpCisKKy8vIEZpbmFsaXplcyBiaXRzdHJlYW0gd2hlbiBwcm9iYWJpbGl0aWVzIGFyZSBrbm93bi4KKy8vIERlbGV0ZXMgdGhlIGFsbG9jYXRlZCB0b2tlbiBtZW1vcnkgaWYgZmluYWxfcGFzcyBpcyB0cnVlLgoraW50IFZQOEVtaXRUb2tlbnMoVlA4VEJ1ZmZlciogY29uc3QgYiwgVlA4Qml0V3JpdGVyKiBjb25zdCBidywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHByb2JhcywgaW50IGZpbmFsX3Bhc3MpOworCisvLyByZWNvcmQgdGhlIGNvZGluZyBvZiBjb2VmZmljaWVudHMgd2l0aG91dCBrbm93aW5nIHRoZSBwcm9iYWJpbGl0aWVzIHlldAoraW50IFZQOFJlY29yZENvZWZmVG9rZW5zKGludCBjdHgsIGNvbnN0IHN0cnVjdCBWUDhSZXNpZHVhbCogY29uc3QgcmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFZQOFRCdWZmZXIqIGNvbnN0IHRva2Vucyk7CisKKy8vIEVzdGltYXRlIHRoZSBmaW5hbCBjb2RlZCBzaXplIGdpdmVuIGEgc2V0IG9mICdwcm9iYXMnLgorc2l6ZV90IFZQOEVzdGltYXRlVG9rZW5TaXplKFZQOFRCdWZmZXIqIGNvbnN0IGIsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHByb2Jhcyk7CisKKyNlbmRpZiAgLy8gIURJU0FCTEVfVE9LRU5fQlVGRkVSCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWUDhFbmNvZGVyCisKK3N0cnVjdCBWUDhFbmNvZGVyIHsKKyAgY29uc3QgV2ViUENvbmZpZyogY29uZmlnXzsgICAgLy8gdXNlciBjb25maWd1cmF0aW9uIGFuZCBwYXJhbWV0ZXJzCisgIFdlYlBQaWN0dXJlKiBwaWNfOyAgICAgICAgICAgIC8vIGlucHV0IC8gb3V0cHV0IHBpY3R1cmUKKworICAvLyBoZWFkZXJzCisgIFZQOEVuY0ZpbHRlckhlYWRlciAgIGZpbHRlcl9oZHJfOyAgICAgLy8gZmlsdGVyaW5nIGluZm9ybWF0aW9uCisgIFZQOEVuY1NlZ21lbnRIZWFkZXIgIHNlZ21lbnRfaGRyXzsgICAgLy8gc2VnbWVudCBpbmZvcm1hdGlvbgorCisgIGludCBwcm9maWxlXzsgICAgICAgICAgICAgICAgICAgICAgLy8gVlA4J3MgcHJvZmlsZSwgZGVkdWNlZCBmcm9tIENvbmZpZy4KKworICAvLyBkaW1lbnNpb24sIGluIG1hY3JvYmxvY2sgdW5pdHMuCisgIGludCBtYl93XywgbWJfaF87CisgIGludCBwcmVkc193XzsgICAvLyBzdHJpZGUgb2YgdGhlICpwcmVkc18gcHJlZGljdGlvbiBwbGFuZSAoPTQqbWJfdyArIDEpCisKKyAgLy8gbnVtYmVyIG9mIHBhcnRpdGlvbnMgKDEsIDIsIDQgb3IgOCA9IE1BWF9OVU1fUEFSVElUSU9OUykKKyAgaW50IG51bV9wYXJ0c187CisKKyAgLy8gcGVyLXBhcnRpdGlvbiBib29sZWFuIGRlY29kZXJzLgorICBWUDhCaXRXcml0ZXIgYndfOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXJ0MAorICBWUDhCaXRXcml0ZXIgcGFydHNfW01BWF9OVU1fUEFSVElUSU9OU107ICAvLyB0b2tlbiBwYXJ0aXRpb25zCisgIFZQOFRCdWZmZXIgdG9rZW5zXzsgICAgICAgICAgICAgICAgICAgICAgIC8vIHRva2VuIGJ1ZmZlcgorCisgIGludCBwZXJjZW50XzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBwcm9ncmVzcworCisgIC8vIHRyYW5zcGFyZW5jeSBibG9iCisgIGludCBoYXNfYWxwaGFfOworICB1aW50OF90KiBhbHBoYV9kYXRhXzsgICAgICAgLy8gbm9uLU5VTEwgaWYgdHJhbnNwYXJlbmN5IGlzIHByZXNlbnQKKyAgdWludDMyX3QgYWxwaGFfZGF0YV9zaXplXzsKKyAgV2ViUFdvcmtlciBhbHBoYV93b3JrZXJfOworCisgIC8vIHF1YW50aXphdGlvbiBpbmZvIChvbmUgc2V0IG9mIERDL0FDIGRlcXVhbnQgZmFjdG9yIHBlciBzZWdtZW50KQorICBWUDhTZWdtZW50SW5mbyBkcW1fW05VTV9NQl9TRUdNRU5UU107CisgIGludCBiYXNlX3F1YW50XzsgICAgICAgICAgICAgICAgIC8vIG5vbWluYWwgcXVhbnRpemVyIHZhbHVlLiBPbmx5IHVzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHJlbGF0aXZlIGNvZGluZyBvZiBzZWdtZW50cycgcXVhbnQuCisgIGludCBhbHBoYV87ICAgICAgICAgICAgICAgICAgICAgIC8vIGdsb2JhbCBzdXNjZXB0aWJpbGl0eSAoPD0+IGNvbXBsZXhpdHkpCisgIGludCB1dl9hbHBoYV87ICAgICAgICAgICAgICAgICAgIC8vIFUvViBxdWFudGl6YXRpb24gc3VzY2VwdGliaWxpdHkKKyAgLy8gZ2xvYmFsIG9mZnNldCBvZiBxdWFudGl6ZXJzLCBzaGFyZWQgYnkgYWxsIHNlZ21lbnRzCisgIGludCBkcV95MV9kY187CisgIGludCBkcV95Ml9kY18sIGRxX3kyX2FjXzsKKyAgaW50IGRxX3V2X2RjXywgZHFfdXZfYWNfOworCisgIC8vIHByb2JhYmlsaXRpZXMgYW5kIHN0YXRpc3RpY3MKKyAgVlA4RW5jUHJvYmEgcHJvYmFfOworICB1aW50NjRfdCAgICBzc2VfWzRdOyAgICAgIC8vIHN1bSBvZiBZL1UvVi9BIHNxdWFyZWQgZXJyb3JzIGZvciBhbGwgbWFjcm9ibG9ja3MKKyAgdWludDY0X3QgICAgc3NlX2NvdW50XzsgICAvLyBwaXhlbCBjb3VudCBmb3IgdGhlIHNzZV9bXSBzdGF0cworICBpbnQgICAgICAgICBjb2RlZF9zaXplXzsKKyAgaW50ICAgICAgICAgcmVzaWR1YWxfYnl0ZXNfWzNdWzRdOworICBpbnQgICAgICAgICBibG9ja19jb3VudF9bM107CisKKyAgLy8gcXVhbGl0eS9zcGVlZCBzZXR0aW5ncworICBpbnQgbWV0aG9kXzsgICAgICAgICAgICAgICAvLyAwPWZhc3Rlc3QsIDY9YmVzdC9zbG93ZXN0LgorICBWUDhSRExldmVsIHJkX29wdF9sZXZlbF87ICAvLyBEZWR1Y2VkIGZyb20gbWV0aG9kXy4KKyAgaW50IG1heF9pNF9oZWFkZXJfYml0c187ICAgLy8gcGFydGl0aW9uICMwIHNhZmVuZXNzIGZhY3RvcgorICBpbnQgbWJfaGVhZGVyX2xpbWl0XzsgICAgICAvLyByb3VnaCBsaW1pdCBmb3IgaGVhZGVyIGJpdHMgcGVyIE1CCisgIGludCB0aHJlYWRfbGV2ZWxfOyAgICAgICAgIC8vIGRlcml2ZWQgZnJvbSBjb25maWctPnRocmVhZF9sZXZlbAorICBpbnQgZG9fc2VhcmNoXzsgICAgICAgICAgICAvLyBkZXJpdmVkIGZyb20gY29uZmlnLT50YXJnZXRfWFhYCisgIGludCB1c2VfdG9rZW5zXzsgICAgICAgICAgIC8vIGlmIHRydWUsIHVzZSB0b2tlbiBidWZmZXIKKworICAvLyBNZW1vcnkKKyAgVlA4TUJJbmZvKiBtYl9pbmZvXzsgICAvLyBjb250ZXh0dWFsIG1hY3JvYmxvY2sgaW5mb3MgKG1iX3dfICsgMSkKKyAgdWludDhfdCogICBwcmVkc187ICAgICAvLyBwcmVkaWN0aW9ucyBtb2RlczogKDQqbWJfdysxKSAqICg0Km1iX2grMSkKKyAgdWludDMyX3QqICBuel87ICAgICAgICAvLyBub24temVybyBiaXQgY29udGV4dDogbWJfdysxCisgIHVpbnQ4X3QqICAgeV90b3BfOyAgICAgLy8gdG9wIGx1bWEgc2FtcGxlcy4KKyAgdWludDhfdCogICB1dl90b3BfOyAgICAvLyB0b3AgdS92IHNhbXBsZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVSBhbmQgViBhcmUgcGFja2VkIGludG8gMTYgYnl0ZXMgKDggVSArIDggVikKKyAgTEZTdGF0cyogICBsZl9zdGF0c187ICAvLyBhdXRvZmlsdGVyIHN0YXRzIChpZiBOVUxMLCBhdXRvZmlsdGVyIGlzIG9mZikKKyAgREVycm9yKiAgICB0b3BfZGVycl87ICAvLyBkaWZmdXNpb24gZXJyb3IgKE5VTEwgaWYgZGlzYWJsZWQpCit9OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gaW50ZXJuYWwgZnVuY3Rpb25zLiBOb3QgcHVibGljLgorCisgIC8vIGluIHRyZWUuYworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgVlA4Q29lZmZzUHJvYmEwW05VTV9UWVBFU11bTlVNX0JBTkRTXVtOVU1fQ1RYXVtOVU1fUFJPQkFTXTsKK2V4dGVybiBjb25zdCB1aW50OF90CisgICAgVlA4Q29lZmZzVXBkYXRlUHJvYmFbTlVNX1RZUEVTXVtOVU1fQkFORFNdW05VTV9DVFhdW05VTV9QUk9CQVNdOworLy8gUmVzZXQgdGhlIHRva2VuIHByb2JhYmlsaXRpZXMgdG8gdGhlaXIgaW5pdGlhbCAoZGVmYXVsdCkgdmFsdWVzCit2b2lkIFZQOERlZmF1bHRQcm9iYXMoVlA4RW5jb2RlciogY29uc3QgZW5jKTsKKy8vIFdyaXRlIHRoZSB0b2tlbiBwcm9iYWJpbGl0aWVzCit2b2lkIFZQOFdyaXRlUHJvYmFzKFZQOEJpdFdyaXRlciogY29uc3QgYncsIGNvbnN0IFZQOEVuY1Byb2JhKiBjb25zdCBwcm9iYXMpOworLy8gV3JpdGVzIHRoZSBwYXJ0aXRpb24gIzAgbW9kZXMgKHRoYXQgaXM6IGFsbCBpbnRyYSBtb2RlcykKK3ZvaWQgVlA4Q29kZUludHJhTW9kZXMoVlA4RW5jb2RlciogY29uc3QgZW5jKTsKKworICAvLyBpbiBzeW50YXguYworLy8gR2VuZXJhdGVzIHRoZSBmaW5hbCBiaXRzdHJlYW0gYnkgY29kaW5nIHRoZSBwYXJ0aXRpb24wIGFuZCBoZWFkZXJzLAorLy8gYW5kIGFwcGVuZGluZyBhbiBhc3NlbWJseSBvZiBhbGwgdGhlIHByZS1jb2RlZCB0b2tlbiBwYXJ0aXRpb25zLgorLy8gUmV0dXJuIHRydWUgaWYgZXZlcnl0aGluZyBpcyBvay4KK2ludCBWUDhFbmNXcml0ZShWUDhFbmNvZGVyKiBjb25zdCBlbmMpOworLy8gUmVsZWFzZSBtZW1vcnkgYWxsb2NhdGVkIGZvciBiaXQtd3JpdGluZyBpbiBWUDhFbmNMb29wICYgc2VxLgordm9pZCBWUDhFbmNGcmVlQml0V3JpdGVycyhWUDhFbmNvZGVyKiBjb25zdCBlbmMpOworCisgIC8vIGluIGZyYW1lLmMKK2V4dGVybiBjb25zdCB1aW50OF90IFZQOENhdDNbXTsKK2V4dGVybiBjb25zdCB1aW50OF90IFZQOENhdDRbXTsKK2V4dGVybiBjb25zdCB1aW50OF90IFZQOENhdDVbXTsKK2V4dGVybiBjb25zdCB1aW50OF90IFZQOENhdDZbXTsKKworLy8gRm9ybSBhbGwgdGhlIGZvdXIgSW50cmExNngxNiBwcmVkaWN0aW9ucyBpbiB0aGUgeXV2X3BfIGNhY2hlCit2b2lkIFZQOE1ha2VMdW1hMTZQcmVkcyhjb25zdCBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpOworLy8gRm9ybSBhbGwgdGhlIGZvdXIgQ2hyb21hOHg4IHByZWRpY3Rpb25zIGluIHRoZSB5dXZfcF8gY2FjaGUKK3ZvaWQgVlA4TWFrZUNocm9tYThQcmVkcyhjb25zdCBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpOworLy8gRm9ybSBhbGwgdGhlIHRlbiBJbnRyYTR4NCBwcmVkaWN0aW9ucyBpbiB0aGUgeXV2X3BfIGNhY2hlCisvLyBmb3IgdGhlIDR4NCBibG9jayBpdC0+aTRfCit2b2lkIFZQOE1ha2VJbnRyYTRQcmVkcyhjb25zdCBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpOworLy8gUmF0ZSBjYWxjdWxhdGlvbgoraW50IFZQOEdldENvc3RMdW1hMTYoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBjb25zdCBWUDhNb2RlU2NvcmUqIGNvbnN0IHJkKTsKK2ludCBWUDhHZXRDb3N0THVtYTQoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBjb25zdCBpbnQxNl90IGxldmVsc1sxNl0pOworaW50IFZQOEdldENvc3RVVihWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsIGNvbnN0IFZQOE1vZGVTY29yZSogY29uc3QgcmQpOworLy8gTWFpbiBjb2RpbmcgY2FsbHMKK2ludCBWUDhFbmNMb29wKFZQOEVuY29kZXIqIGNvbnN0IGVuYyk7CitpbnQgVlA4RW5jVG9rZW5Mb29wKFZQOEVuY29kZXIqIGNvbnN0IGVuYyk7CisKKyAgLy8gaW4gd2VicGVuYy5jCisvLyBBc3NpZ24gYW4gZXJyb3IgY29kZSB0byBhIHBpY3R1cmUuIFJldHVybiBmYWxzZSBmb3IgY29udmVuaWVuY2UuCitpbnQgV2ViUEVuY29kaW5nU2V0RXJyb3IoY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywgV2ViUEVuY29kaW5nRXJyb3IgZXJyb3IpOworaW50IFdlYlBSZXBvcnRQcm9ncmVzcyhjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGVyY2VudCwgaW50KiBjb25zdCBwZXJjZW50X3N0b3JlKTsKKworICAvLyBpbiBhbmFseXNpcy5jCisvLyBNYWluIGFuYWx5c2lzIGxvb3AuIERlY2lkZXMgdGhlIHNlZ21lbnRhdGlvbnMgYW5kIGNvbXBsZXhpdHkuCisvLyBBc3NpZ25zIGEgZmlyc3QgZ3Vlc3MgZm9yIEludHJhMTYgYW5kIHV2bW9kZV8gcHJlZGljdGlvbiBtb2Rlcy4KK2ludCBWUDhFbmNBbmFseXplKFZQOEVuY29kZXIqIGNvbnN0IGVuYyk7CisKKyAgLy8gaW4gcXVhbnQuYworLy8gU2V0cyB1cCBzZWdtZW50J3MgcXVhbnRpemF0aW9uIHZhbHVlcywgYmFzZV9xdWFudF8gYW5kIGZpbHRlciBzdHJlbmd0aHMuCit2b2lkIFZQOFNldFNlZ21lbnRQYXJhbXMoVlA4RW5jb2RlciogY29uc3QgZW5jLCBmbG9hdCBxdWFsaXR5KTsKKy8vIFBpY2sgYmVzdCBtb2RlcyBhbmQgZmlsbHMgdGhlIGxldmVscy4gUmV0dXJucyB0cnVlIGlmIHNraXBwZWQuCitpbnQgVlA4RGVjaW1hdGUoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBWUDhNb2RlU2NvcmUqIGNvbnN0IHJkLAorICAgICAgICAgICAgICAgIFZQOFJETGV2ZWwgcmRfb3B0KTsKKworICAvLyBpbiBhbHBoYS5jCit2b2lkIFZQOEVuY0luaXRBbHBoYShWUDhFbmNvZGVyKiBjb25zdCBlbmMpOyAgICAvLyBpbml0aWFsaXplIGFscGhhIGNvbXByZXNzaW9uCitpbnQgVlA4RW5jU3RhcnRBbHBoYShWUDhFbmNvZGVyKiBjb25zdCBlbmMpOyAgICAvLyBzdGFydCBhbHBoYSBjb2RpbmcgcHJvY2VzcworaW50IFZQOEVuY0ZpbmlzaEFscGhhKFZQOEVuY29kZXIqIGNvbnN0IGVuYyk7ICAgLy8gZmluYWxpemUgY29tcHJlc3NlZCBkYXRhCitpbnQgVlA4RW5jRGVsZXRlQWxwaGEoVlA4RW5jb2RlciogY29uc3QgZW5jKTsgICAvLyBkZWxldGUgY29tcHJlc3NlZCBkYXRhCisKKy8vIGF1dG9maWx0ZXIKK3ZvaWQgVlA4SW5pdEZpbHRlcihWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpOwordm9pZCBWUDhTdG9yZUZpbHRlclN0YXRzKFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCk7Cit2b2lkIFZQOEFkanVzdEZpbHRlclN0cmVuZ3RoKFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCk7CisKKy8vIHJldHVybnMgdGhlIGFwcHJveGltYXRlIGZpbHRlcmluZyBzdHJlbmd0aCBuZWVkZWQgdG8gc21vb3RoIGEgZWRnZQorLy8gc3RlcCBvZiAnZGVsdGEnLCBnaXZlbiBhIHNoYXJwbmVzcyBwYXJhbWV0ZXIgJ3NoYXJwbmVzcycuCitpbnQgVlA4RmlsdGVyU3RyZW5ndGhGcm9tRGVsdGEoaW50IHNoYXJwbmVzcywgaW50IGRlbHRhKTsKKworICAvLyBtaXNjIHV0aWxzIGZvciBwaWN0dXJlXyouYzoKKworLy8gUmVtb3ZlIHJlZmVyZW5jZSB0byB0aGUgQVJHQi9ZVVZBIGJ1ZmZlciAoZG9lc24ndCBmcmVlIGFueXRoaW5nKS4KK3ZvaWQgV2ViUFBpY3R1cmVSZXNldEJ1ZmZlcnMoV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUpOworCisvLyBBbGxvY2F0ZXMgQVJHQiBidWZmZXIgb2YgZ2l2ZW4gZGltZW5zaW9uIChwcmV2aW91cyBvbmUgaXMgYWx3YXlzIGZyZWUnZCkuCisvLyBQcmVzZXJ2ZXMgdGhlIFlVVihBKSBidWZmZXIuIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiBlcnJvciAoaW52YWxpZCBwYXJhbSwKKy8vIG91dC1vZi1tZW1vcnkpLgoraW50IFdlYlBQaWN0dXJlQWxsb2NBUkdCKFdlYlBQaWN0dXJlKiBjb25zdCBwaWN0dXJlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworCisvLyBBbGxvY2F0ZXMgWVVWQSBidWZmZXIgb2YgZ2l2ZW4gZGltZW5zaW9uIChwcmV2aW91cyBvbmUgaXMgYWx3YXlzIGZyZWUnZCkuCisvLyBVc2VzIHBpY3R1cmUtPmNzcCB0byBkZXRlcm1pbmUgd2hldGhlciBhbiBhbHBoYSBidWZmZXIgaXMgbmVlZGVkLgorLy8gUHJlc2VydmVzIHRoZSBBUkdCIGJ1ZmZlci4KKy8vIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiBlcnJvciAoaW52YWxpZCBwYXJhbSwgb3V0LW9mLW1lbW9yeSkuCitpbnQgV2ViUFBpY3R1cmVBbGxvY1lVVkEoV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUsIGludCB3aWR0aCwgaW50IGhlaWdodCk7CisKKy8vIENsZWFuLXVwIHRoZSBSR0Igc2FtcGxlcyB1bmRlciBmdWxseSB0cmFuc3BhcmVudCBhcmVhLCB0byBoZWxwIGxvc3NsZXNzCisvLyBjb21wcmVzc2liaWxpdHkgKG5vIGd1YXJhbnRlZSwgdGhvdWdoKS4gQXNzdW1lcyB0aGF0IHBpYy0+dXNlX2FyZ2IgaXMgdHJ1ZS4KK3ZvaWQgV2ViUENsZWFudXBUcmFuc3BhcmVudEFyZWFMb3NzbGVzcyhXZWJQUGljdHVyZSogY29uc3QgcGljKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8qIFdFQlBfRU5DX1ZQOElfRU5DX0hfICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL3ZwOGxfZW5jLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL3ZwOGxfZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDlmYTczMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvdnA4bF9lbmMuYwpAQCAtMCwwICsxLDE5MTUgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBtYWluIGVudHJ5IGZvciB0aGUgbG9zc2xlc3MgZW5jb2Rlci4KKy8vCisvLyBBdXRob3I6IFZpa2FzIEFyb3JhICh2aWthYXMuYXJvcmFAZ21haWwuY29tKQorLy8KKworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL2Fzc2VydF9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RkbGliX3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdfcG9lbS5oIgorI2Vsc2UKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAic3JjL2VuYy9iYWNrd2FyZF9yZWZlcmVuY2VzX2VuYy5oIgorI2luY2x1ZGUgInNyYy9lbmMvaGlzdG9ncmFtX2VuYy5oIgorI2luY2x1ZGUgInNyYy9lbmMvdnA4aV9lbmMuaCIKKyNpbmNsdWRlICJzcmMvZW5jL3ZwOGxpX2VuYy5oIgorI2luY2x1ZGUgInNyYy9kc3AvbG9zc2xlc3MuaCIKKyNpbmNsdWRlICJzcmMvZHNwL2xvc3NsZXNzX2NvbW1vbi5oIgorI2luY2x1ZGUgInNyYy91dGlscy9iaXRfd3JpdGVyX3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL2h1ZmZtYW5fZW5jb2RlX3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL3dlYnAvZm9ybWF0X2NvbnN0YW50cy5oIgorCisvLyBNYXhpbXVtIG51bWJlciBvZiBoaXN0b2dyYW0gaW1hZ2VzIChzdWItYmxvY2tzKS4KKyNkZWZpbmUgTUFYX0hVRkZfSU1BR0VfU0laRSAgICAgICAyNjAwCisKKy8vIFBhbGV0dGUgcmVvcmRlcmluZyBmb3Igc21hbGxlciBzdW0gb2YgZGVsdGFzIChhbmQgZm9yIHNtYWxsZXIgc3RvcmFnZSkuCisKK3N0YXRpYyBpbnQgUGFsZXR0ZUNvbXBhcmVDb2xvcnNGb3JRc29ydChjb25zdCB2b2lkKiBwMSwgY29uc3Qgdm9pZCogcDIpIHsKKyAgY29uc3QgdWludDMyX3QgYSA9IFdlYlBNZW1Ub1VpbnQzMigodWludDhfdCopcDEpOworICBjb25zdCB1aW50MzJfdCBiID0gV2ViUE1lbVRvVWludDMyKCh1aW50OF90KilwMik7CisgIGFzc2VydChhICE9IGIpOworICByZXR1cm4gKGEgPCBiKSA/IC0xIDogMTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IFBhbGV0dGVDb21wb25lbnREaXN0YW5jZSh1aW50MzJfdCB2KSB7CisgIHJldHVybiAodiA8PSAxMjgpID8gdiA6ICgyNTYgLSB2KTsKK30KKworLy8gQ29tcHV0ZXMgYSB2YWx1ZSB0aGF0IGlzIHJlbGF0ZWQgdG8gdGhlIGVudHJvcHkgY3JlYXRlZCBieSB0aGUKKy8vIHBhbGV0dGUgZW50cnkgZGlmZi4KKy8vCisvLyBOb3RlIHRoYXQgdGhlIGxhc3QgJiAweGZmIGlzIGEgbm8tb3BlcmF0aW9uIGluIHRoZSBuZXh0IHN0YXRlbWVudCwgYnV0CisvLyByZW1vdmVkIGJ5IG1vc3QgY29tcGlsZXJzIGFuZCBpcyBoZXJlIG9ubHkgZm9yIHJlZ3VsYXJpdHkgb2YgdGhlIGNvZGUuCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgUGFsZXR0ZUNvbG9yRGlzdGFuY2UodWludDMyX3QgY29sMSwgdWludDMyX3QgY29sMikgeworICBjb25zdCB1aW50MzJfdCBkaWZmID0gVlA4TFN1YlBpeGVscyhjb2wxLCBjb2wyKTsKKyAgY29uc3QgaW50IGtNb3JlV2VpZ2h0Rm9yUkdCVGhhbkZvckFscGhhID0gOTsKKyAgdWludDMyX3Qgc2NvcmU7CisgIHNjb3JlID0gIFBhbGV0dGVDb21wb25lbnREaXN0YW5jZSgoZGlmZiA+PiAgMCkgJiAweGZmKTsKKyAgc2NvcmUgKz0gUGFsZXR0ZUNvbXBvbmVudERpc3RhbmNlKChkaWZmID4+ICA4KSAmIDB4ZmYpOworICBzY29yZSArPSBQYWxldHRlQ29tcG9uZW50RGlzdGFuY2UoKGRpZmYgPj4gMTYpICYgMHhmZik7CisgIHNjb3JlICo9IGtNb3JlV2VpZ2h0Rm9yUkdCVGhhbkZvckFscGhhOworICBzY29yZSArPSBQYWxldHRlQ29tcG9uZW50RGlzdGFuY2UoKGRpZmYgPj4gMjQpICYgMHhmZik7CisgIHJldHVybiBzY29yZTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgU3dhcENvbG9yKHVpbnQzMl90KiBjb25zdCBjb2wxLCB1aW50MzJfdCogY29uc3QgY29sMikgeworICBjb25zdCB1aW50MzJfdCB0bXAgPSAqY29sMTsKKyAgKmNvbDEgPSAqY29sMjsKKyAgKmNvbDIgPSB0bXA7Cit9CisKK3N0YXRpYyB2b2lkIEdyZWVkeU1pbmltaXplRGVsdGFzKHVpbnQzMl90IHBhbGV0dGVbXSwgaW50IG51bV9jb2xvcnMpIHsKKyAgLy8gRmluZCBncmVlZGlseSBhbHdheXMgdGhlIGNsb3Nlc3QgY29sb3Igb2YgdGhlIHByZWRpY3RlZCBjb2xvciB0byBtaW5pbWl6ZQorICAvLyBkZWx0YXMgaW4gdGhlIHBhbGV0dGUuIFRoaXMgcmVkdWNlcyBzdG9yYWdlIG5lZWRzIHNpbmNlIHRoZQorICAvLyBwYWxldHRlIGlzIHN0b3JlZCB3aXRoIGRlbHRhIGVuY29kaW5nLgorICB1aW50MzJfdCBwcmVkaWN0ID0gMHgwMDAwMDAwMDsKKyAgaW50IGksIGs7CisgIGZvciAoaSA9IDA7IGkgPCBudW1fY29sb3JzOyArK2kpIHsKKyAgICBpbnQgYmVzdF9peCA9IGk7CisgICAgdWludDMyX3QgYmVzdF9zY29yZSA9IH4wVTsKKyAgICBmb3IgKGsgPSBpOyBrIDwgbnVtX2NvbG9yczsgKytrKSB7CisgICAgICBjb25zdCB1aW50MzJfdCBjdXJfc2NvcmUgPSBQYWxldHRlQ29sb3JEaXN0YW5jZShwYWxldHRlW2tdLCBwcmVkaWN0KTsKKyAgICAgIGlmIChiZXN0X3Njb3JlID4gY3VyX3Njb3JlKSB7CisgICAgICAgIGJlc3Rfc2NvcmUgPSBjdXJfc2NvcmU7CisgICAgICAgIGJlc3RfaXggPSBrOworICAgICAgfQorICAgIH0KKyAgICBTd2FwQ29sb3IoJnBhbGV0dGVbYmVzdF9peF0sICZwYWxldHRlW2ldKTsKKyAgICBwcmVkaWN0ID0gcGFsZXR0ZVtpXTsKKyAgfQorfQorCisvLyBUaGUgcGFsZXR0ZSBoYXMgYmVlbiBzb3J0ZWQgYnkgYWxwaGEuIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIHRoZSBvdGhlcgorLy8gY29tcG9uZW50cyBvZiB0aGUgcGFsZXR0ZSBoYXZlIGEgbW9ub3RvbmljIGRldmVsb3BtZW50IHdpdGggcmVnYXJkcyB0bworLy8gcG9zaXRpb24gaW4gdGhlIHBhbGV0dGUuIElmIGFsbCBoYXZlIG1vbm90b25pYyBkZXZlbG9wbWVudCwgdGhlcmUgaXMKKy8vIG5vIGJlbmVmaXQgdG8gcmUtb3JnYW5pemUgdGhlbSBncmVlZGlseS4gQSBtb25vdG9uaWMgZGV2ZWxvcG1lbnQKKy8vIHdvdWxkIGJlIHNwb3R0ZWQgaW4gZ3JlZW4tb25seSBzaXR1YXRpb25zIChsaWtlIGxvc3N5IGFscGhhKSBvciBncmF5LXNjYWxlCisvLyBpbWFnZXMuCitzdGF0aWMgaW50IFBhbGV0dGVIYXNOb25Nb25vdG9ub3VzRGVsdGFzKHVpbnQzMl90IHBhbGV0dGVbXSwgaW50IG51bV9jb2xvcnMpIHsKKyAgdWludDMyX3QgcHJlZGljdCA9IDB4MDAwMDAwOworICBpbnQgaTsKKyAgdWludDhfdCBzaWduX2ZvdW5kID0gMHgwMDsKKyAgZm9yIChpID0gMDsgaSA8IG51bV9jb2xvcnM7ICsraSkgeworICAgIGNvbnN0IHVpbnQzMl90IGRpZmYgPSBWUDhMU3ViUGl4ZWxzKHBhbGV0dGVbaV0sIHByZWRpY3QpOworICAgIGNvbnN0IHVpbnQ4X3QgcmQgPSAoZGlmZiA+PiAxNikgJiAweGZmOworICAgIGNvbnN0IHVpbnQ4X3QgZ2QgPSAoZGlmZiA+PiAgOCkgJiAweGZmOworICAgIGNvbnN0IHVpbnQ4X3QgYmQgPSAoZGlmZiA+PiAgMCkgJiAweGZmOworICAgIGlmIChyZCAhPSAweDAwKSB7CisgICAgICBzaWduX2ZvdW5kIHw9IChyZCA8IDB4ODApID8gMSA6IDI7CisgICAgfQorICAgIGlmIChnZCAhPSAweDAwKSB7CisgICAgICBzaWduX2ZvdW5kIHw9IChnZCA8IDB4ODApID8gOCA6IDE2OworICAgIH0KKyAgICBpZiAoYmQgIT0gMHgwMCkgeworICAgICAgc2lnbl9mb3VuZCB8PSAoYmQgPCAweDgwKSA/IDY0IDogMTI4OworICAgIH0KKyAgICBwcmVkaWN0ID0gcGFsZXR0ZVtpXTsKKyAgfQorICByZXR1cm4gKHNpZ25fZm91bmQgJiAoc2lnbl9mb3VuZCA8PCAxKSkgIT0gMDsgIC8vIHR3byBjb25zZXF1ZW50IHNpZ25zLgorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUGFsZXR0ZQorCisvLyBJZiBudW1iZXIgb2YgY29sb3JzIGluIHRoZSBpbWFnZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gTUFYX1BBTEVUVEVfU0laRSwKKy8vIGNyZWF0ZXMgYSBwYWxldHRlIGFuZCByZXR1cm5zIHRydWUsIGVsc2UgcmV0dXJucyBmYWxzZS4KK3N0YXRpYyBpbnQgQW5hbHl6ZUFuZENyZWF0ZVBhbGV0dGUoY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxvd19lZmZvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBhbGV0dGVbTUFYX1BBTEVUVEVfU0laRV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgcGFsZXR0ZV9zaXplKSB7CisgIGNvbnN0IGludCBudW1fY29sb3JzID0gV2ViUEdldENvbG9yUGFsZXR0ZShwaWMsIHBhbGV0dGUpOworICBpZiAobnVtX2NvbG9ycyA+IE1BWF9QQUxFVFRFX1NJWkUpIHsKKyAgICAqcGFsZXR0ZV9zaXplID0gMDsKKyAgICByZXR1cm4gMDsKKyAgfQorICAqcGFsZXR0ZV9zaXplID0gbnVtX2NvbG9yczsKKyAgcXNvcnQocGFsZXR0ZSwgbnVtX2NvbG9ycywgc2l6ZW9mKCpwYWxldHRlKSwgUGFsZXR0ZUNvbXBhcmVDb2xvcnNGb3JRc29ydCk7CisgIGlmICghbG93X2VmZm9ydCAmJiBQYWxldHRlSGFzTm9uTW9ub3Rvbm91c0RlbHRhcyhwYWxldHRlLCBudW1fY29sb3JzKSkgeworICAgIEdyZWVkeU1pbmltaXplRGVsdGFzKHBhbGV0dGUsIG51bV9jb2xvcnMpOworICB9CisgIHJldHVybiAxOworfQorCisvLyBUaGVzZSBmaXZlIG1vZGVzIGFyZSBldmFsdWF0ZWQgYW5kIHRoZWlyIHJlc3BlY3RpdmUgZW50cm9weSBpcyBjb21wdXRlZC4KK3R5cGVkZWYgZW51bSB7CisgIGtEaXJlY3QgPSAwLAorICBrU3BhdGlhbCA9IDEsCisgIGtTdWJHcmVlbiA9IDIsCisgIGtTcGF0aWFsU3ViR3JlZW4gPSAzLAorICBrUGFsZXR0ZSA9IDQsCisgIGtOdW1FbnRyb3B5SXggPSA1Cit9IEVudHJvcHlJeDsKKwordHlwZWRlZiBlbnVtIHsKKyAga0hpc3RvQWxwaGEgPSAwLAorICBrSGlzdG9BbHBoYVByZWQsCisgIGtIaXN0b0dyZWVuLAorICBrSGlzdG9HcmVlblByZWQsCisgIGtIaXN0b1JlZCwKKyAga0hpc3RvUmVkUHJlZCwKKyAga0hpc3RvQmx1ZSwKKyAga0hpc3RvQmx1ZVByZWQsCisgIGtIaXN0b1JlZFN1YkdyZWVuLAorICBrSGlzdG9SZWRQcmVkU3ViR3JlZW4sCisgIGtIaXN0b0JsdWVTdWJHcmVlbiwKKyAga0hpc3RvQmx1ZVByZWRTdWJHcmVlbiwKKyAga0hpc3RvUGFsZXR0ZSwKKyAga0hpc3RvVG90YWwgIC8vIE11c3QgYmUgbGFzdC4KK30gSGlzdG9JeDsKKworc3RhdGljIHZvaWQgQWRkU2luZ2xlU3ViR3JlZW4oaW50IHAsIHVpbnQzMl90KiBjb25zdCByLCB1aW50MzJfdCogY29uc3QgYikgeworICBjb25zdCBpbnQgZ3JlZW4gPSBwID4+IDg7ICAvLyBUaGUgdXBwZXIgYml0cyBhcmUgbWFza2VkIGF3YXkgbGF0ZXIuCisgICsrclsoKHAgPj4gMTYpIC0gZ3JlZW4pICYgMHhmZl07CisgICsrYlsoKHAgPj4gIDApIC0gZ3JlZW4pICYgMHhmZl07Cit9CisKK3N0YXRpYyB2b2lkIEFkZFNpbmdsZSh1aW50MzJfdCBwLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBjb25zdCBhLCB1aW50MzJfdCogY29uc3QgciwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogY29uc3QgZywgdWludDMyX3QqIGNvbnN0IGIpIHsKKyAgKythWyhwID4+IDI0KSAmIDB4ZmZdOworICArK3JbKHAgPj4gMTYpICYgMHhmZl07CisgICsrZ1socCA+PiAgOCkgJiAweGZmXTsKKyAgKytiWyhwID4+ICAwKSAmIDB4ZmZdOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgSGFzaFBpeCh1aW50MzJfdCBwaXgpIHsKKyAgLy8gTm90ZSB0aGF0IG1hc2tpbmcgd2l0aCAweGZmZmZmZmZmdSBpcyBmb3IgcHJldmVudGluZyBhbgorICAvLyAndW5zaWduZWQgaW50IG92ZXJmbG93JyB3YXJuaW5nLiBEb2Vzbid0IGltcGFjdCB0aGUgY29tcGlsZWQgY29kZS4KKyAgcmV0dXJuICgoKCh1aW50NjRfdClwaXggKyAocGl4ID4+IDE5KSkgKiAweDM5YzVmYmE3dWxsKSAmIDB4ZmZmZmZmZmZ1KSA+PiAyNDsKK30KKworc3RhdGljIGludCBBbmFseXplRW50cm9weShjb25zdCB1aW50MzJfdCogYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYXJnYl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1c2VfcGFsZXR0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhbGV0dGVfc2l6ZSwgaW50IHRyYW5zZm9ybV9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBFbnRyb3B5SXgqIGNvbnN0IG1pbl9lbnRyb3B5X2l4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IHJlZF9hbmRfYmx1ZV9hbHdheXNfemVybykgeworICAvLyBBbGxvY2F0ZSBoaXN0b2dyYW0gc2V0IHdpdGggY2FjaGVfYml0cyA9IDAuCisgIHVpbnQzMl90KiBoaXN0bzsKKworICBpZiAodXNlX3BhbGV0dGUgJiYgcGFsZXR0ZV9zaXplIDw9IDE2KSB7CisgICAgLy8gSW4gdGhlIGNhc2Ugb2Ygc21hbGwgcGFsZXR0ZXMsIHdlIHBhY2sgMiwgNCBvciA4IHBpeGVscyB0b2dldGhlci4gSW4KKyAgICAvLyBwcmFjdGljZSwgc21hbGwgcGFsZXR0ZXMgYXJlIGJldHRlciB0aGFuIGFueSBvdGhlciB0cmFuc2Zvcm0uCisgICAgKm1pbl9lbnRyb3B5X2l4ID0ga1BhbGV0dGU7CisgICAgKnJlZF9hbmRfYmx1ZV9hbHdheXNfemVybyA9IDE7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaGlzdG8gPSAodWludDMyX3QqKVdlYlBTYWZlQ2FsbG9jKGtIaXN0b1RvdGFsLCBzaXplb2YoKmhpc3RvKSAqIDI1Nik7CisgIGlmIChoaXN0byAhPSBOVUxMKSB7CisgICAgaW50IGksIHgsIHk7CisgICAgY29uc3QgdWludDMyX3QqIHByZXZfcm93ID0gTlVMTDsKKyAgICBjb25zdCB1aW50MzJfdCogY3Vycl9yb3cgPSBhcmdiOworICAgIHVpbnQzMl90IHBpeF9wcmV2ID0gYXJnYlswXTsgIC8vIFNraXAgdGhlIGZpcnN0IHBpeGVsLgorICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgeworICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKKyAgICAgICAgY29uc3QgdWludDMyX3QgcGl4ID0gY3Vycl9yb3dbeF07CisgICAgICAgIGNvbnN0IHVpbnQzMl90IHBpeF9kaWZmID0gVlA4TFN1YlBpeGVscyhwaXgsIHBpeF9wcmV2KTsKKyAgICAgICAgcGl4X3ByZXYgPSBwaXg7CisgICAgICAgIGlmICgocGl4X2RpZmYgPT0gMCkgfHwgKHByZXZfcm93ICE9IE5VTEwgJiYgcGl4ID09IHByZXZfcm93W3hdKSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIEFkZFNpbmdsZShwaXgsCisgICAgICAgICAgICAgICAgICAmaGlzdG9ba0hpc3RvQWxwaGEgKiAyNTZdLAorICAgICAgICAgICAgICAgICAgJmhpc3RvW2tIaXN0b1JlZCAqIDI1Nl0sCisgICAgICAgICAgICAgICAgICAmaGlzdG9ba0hpc3RvR3JlZW4gKiAyNTZdLAorICAgICAgICAgICAgICAgICAgJmhpc3RvW2tIaXN0b0JsdWUgKiAyNTZdKTsKKyAgICAgICAgQWRkU2luZ2xlKHBpeF9kaWZmLAorICAgICAgICAgICAgICAgICAgJmhpc3RvW2tIaXN0b0FscGhhUHJlZCAqIDI1Nl0sCisgICAgICAgICAgICAgICAgICAmaGlzdG9ba0hpc3RvUmVkUHJlZCAqIDI1Nl0sCisgICAgICAgICAgICAgICAgICAmaGlzdG9ba0hpc3RvR3JlZW5QcmVkICogMjU2XSwKKyAgICAgICAgICAgICAgICAgICZoaXN0b1trSGlzdG9CbHVlUHJlZCAqIDI1Nl0pOworICAgICAgICBBZGRTaW5nbGVTdWJHcmVlbihwaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoaXN0b1trSGlzdG9SZWRTdWJHcmVlbiAqIDI1Nl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoaXN0b1trSGlzdG9CbHVlU3ViR3JlZW4gKiAyNTZdKTsKKyAgICAgICAgQWRkU2luZ2xlU3ViR3JlZW4ocGl4X2RpZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoaXN0b1trSGlzdG9SZWRQcmVkU3ViR3JlZW4gKiAyNTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGlzdG9ba0hpc3RvQmx1ZVByZWRTdWJHcmVlbiAqIDI1Nl0pOworICAgICAgICB7CisgICAgICAgICAgLy8gQXBwcm94aW1hdGUgdGhlIHBhbGV0dGUgYnkgdGhlIGVudHJvcHkgb2YgdGhlIG11bHRpcGxpY2F0aXZlIGhhc2guCisgICAgICAgICAgY29uc3QgdWludDMyX3QgaGFzaCA9IEhhc2hQaXgocGl4KTsKKyAgICAgICAgICArK2hpc3RvW2tIaXN0b1BhbGV0dGUgKiAyNTYgKyBoYXNoXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcHJldl9yb3cgPSBjdXJyX3JvdzsKKyAgICAgIGN1cnJfcm93ICs9IGFyZ2Jfc3RyaWRlOworICAgIH0KKyAgICB7CisgICAgICBkb3VibGUgZW50cm9weV9jb21wW2tIaXN0b1RvdGFsXTsKKyAgICAgIGRvdWJsZSBlbnRyb3B5W2tOdW1FbnRyb3B5SXhdOworICAgICAgaW50IGs7CisgICAgICBpbnQgbGFzdF9tb2RlX3RvX2FuYWx5emUgPSB1c2VfcGFsZXR0ZSA/IGtQYWxldHRlIDoga1NwYXRpYWxTdWJHcmVlbjsKKyAgICAgIGludCBqOworICAgICAgLy8gTGV0J3MgYWRkIG9uZSB6ZXJvIHRvIHRoZSBwcmVkaWN0ZWQgaGlzdG9ncmFtcy4gVGhlIHplcm9zIGFyZSByZW1vdmVkCisgICAgICAvLyB0b28gZWZmaWNpZW50bHkgYnkgdGhlIHBpeF9kaWZmID09IDAgY29tcGFyaXNvbiwgYXQgbGVhc3Qgb25lIG9mIHRoZQorICAgICAgLy8gemVyb3MgaXMgbGlrZWx5IHRvIGV4aXN0LgorICAgICAgKytoaXN0b1trSGlzdG9SZWRQcmVkU3ViR3JlZW4gKiAyNTZdOworICAgICAgKytoaXN0b1trSGlzdG9CbHVlUHJlZFN1YkdyZWVuICogMjU2XTsKKyAgICAgICsraGlzdG9ba0hpc3RvUmVkUHJlZCAqIDI1Nl07CisgICAgICArK2hpc3RvW2tIaXN0b0dyZWVuUHJlZCAqIDI1Nl07CisgICAgICArK2hpc3RvW2tIaXN0b0JsdWVQcmVkICogMjU2XTsKKyAgICAgICsraGlzdG9ba0hpc3RvQWxwaGFQcmVkICogMjU2XTsKKworICAgICAgZm9yIChqID0gMDsgaiA8IGtIaXN0b1RvdGFsOyArK2opIHsKKyAgICAgICAgZW50cm9weV9jb21wW2pdID0gVlA4TEJpdHNFbnRyb3B5KCZoaXN0b1tqICogMjU2XSwgMjU2KTsKKyAgICAgIH0KKyAgICAgIGVudHJvcHlba0RpcmVjdF0gPSBlbnRyb3B5X2NvbXBba0hpc3RvQWxwaGFdICsKKyAgICAgICAgICBlbnRyb3B5X2NvbXBba0hpc3RvUmVkXSArCisgICAgICAgICAgZW50cm9weV9jb21wW2tIaXN0b0dyZWVuXSArCisgICAgICAgICAgZW50cm9weV9jb21wW2tIaXN0b0JsdWVdOworICAgICAgZW50cm9weVtrU3BhdGlhbF0gPSBlbnRyb3B5X2NvbXBba0hpc3RvQWxwaGFQcmVkXSArCisgICAgICAgICAgZW50cm9weV9jb21wW2tIaXN0b1JlZFByZWRdICsKKyAgICAgICAgICBlbnRyb3B5X2NvbXBba0hpc3RvR3JlZW5QcmVkXSArCisgICAgICAgICAgZW50cm9weV9jb21wW2tIaXN0b0JsdWVQcmVkXTsKKyAgICAgIGVudHJvcHlba1N1YkdyZWVuXSA9IGVudHJvcHlfY29tcFtrSGlzdG9BbHBoYV0gKworICAgICAgICAgIGVudHJvcHlfY29tcFtrSGlzdG9SZWRTdWJHcmVlbl0gKworICAgICAgICAgIGVudHJvcHlfY29tcFtrSGlzdG9HcmVlbl0gKworICAgICAgICAgIGVudHJvcHlfY29tcFtrSGlzdG9CbHVlU3ViR3JlZW5dOworICAgICAgZW50cm9weVtrU3BhdGlhbFN1YkdyZWVuXSA9IGVudHJvcHlfY29tcFtrSGlzdG9BbHBoYVByZWRdICsKKyAgICAgICAgICBlbnRyb3B5X2NvbXBba0hpc3RvUmVkUHJlZFN1YkdyZWVuXSArCisgICAgICAgICAgZW50cm9weV9jb21wW2tIaXN0b0dyZWVuUHJlZF0gKworICAgICAgICAgIGVudHJvcHlfY29tcFtrSGlzdG9CbHVlUHJlZFN1YkdyZWVuXTsKKyAgICAgIGVudHJvcHlba1BhbGV0dGVdID0gZW50cm9weV9jb21wW2tIaXN0b1BhbGV0dGVdOworCisgICAgICAvLyBXaGVuIGluY2x1ZGluZyB0cmFuc2Zvcm1zLCB0aGVyZSBpcyBhbiBvdmVyaGVhZCBpbiBiaXRzIGZyb20KKyAgICAgIC8vIHN0b3JpbmcgdGhlbS4gVGhpcyBvdmVyaGVhZCBpcyBzbWFsbCBidXQgbWF0dGVycyBmb3Igc21hbGwgaW1hZ2VzLgorICAgICAgLy8gRm9yIHNwYXRpYWwsIHRoZXJlIGFyZSAxNCB0cmFuc2Zvcm1hdGlvbnMuCisgICAgICBlbnRyb3B5W2tTcGF0aWFsXSArPSBWUDhMU3ViU2FtcGxlU2l6ZSh3aWR0aCwgdHJhbnNmb3JtX2JpdHMpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExTdWJTYW1wbGVTaXplKGhlaWdodCwgdHJhbnNmb3JtX2JpdHMpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExGYXN0TG9nMigxNCk7CisgICAgICAvLyBGb3IgY29sb3IgdHJhbnNmb3JtczogMjQgYXMgb25seSAzIGNoYW5uZWxzIGFyZSBjb25zaWRlcmVkIGluIGEKKyAgICAgIC8vIENvbG9yVHJhbnNmb3JtRWxlbWVudC4KKyAgICAgIGVudHJvcHlba1NwYXRpYWxTdWJHcmVlbl0gKz0gVlA4TFN1YlNhbXBsZVNpemUod2lkdGgsIHRyYW5zZm9ybV9iaXRzKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExTdWJTYW1wbGVTaXplKGhlaWdodCwgdHJhbnNmb3JtX2JpdHMpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEZhc3RMb2cyKDI0KTsKKyAgICAgIC8vIEZvciBwYWxldHRlcywgYWRkIHRoZSBjb3N0IG9mIHN0b3JpbmcgdGhlIHBhbGV0dGUuCisgICAgICAvLyBXZSBlbXBpcmljYWxseSBlc3RpbWF0ZSB0aGUgY29zdCBvZiBhIGNvbXByZXNzZWQgZW50cnkgYXMgOCBiaXRzLgorICAgICAgLy8gVGhlIHBhbGV0dGUgaXMgZGlmZmVyZW50aWFsLWNvZGVkIHdoZW4gY29tcHJlc3NlZCBoZW5jZSBhIG11Y2gKKyAgICAgIC8vIGxvd2VyIGNvc3QgdGhhbiBzaXplb2YodWludDMyX3QpKjguCisgICAgICBlbnRyb3B5W2tQYWxldHRlXSArPSBwYWxldHRlX3NpemUgKiA4OworCisgICAgICAqbWluX2VudHJvcHlfaXggPSBrRGlyZWN0OworICAgICAgZm9yIChrID0ga0RpcmVjdCArIDE7IGsgPD0gbGFzdF9tb2RlX3RvX2FuYWx5emU7ICsraykgeworICAgICAgICBpZiAoZW50cm9weVsqbWluX2VudHJvcHlfaXhdID4gZW50cm9weVtrXSkgeworICAgICAgICAgICptaW5fZW50cm9weV9peCA9IChFbnRyb3B5SXgpazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYXNzZXJ0KChpbnQpKm1pbl9lbnRyb3B5X2l4IDw9IGxhc3RfbW9kZV90b19hbmFseXplKTsKKyAgICAgICpyZWRfYW5kX2JsdWVfYWx3YXlzX3plcm8gPSAxOworICAgICAgLy8gTGV0J3MgY2hlY2sgaWYgdGhlIGhpc3RvZ3JhbSBvZiB0aGUgY2hvc2VuIGVudHJvcHkgbW9kZSBoYXMKKyAgICAgIC8vIG5vbi16ZXJvIHJlZCBhbmQgYmx1ZSB2YWx1ZXMuIElmIGFsbCBhcmUgemVybywgd2UgY2FuIGxhdGVyIHNraXAKKyAgICAgIC8vIHRoZSBjcm9zcyBjb2xvciBvcHRpbWl6YXRpb24uCisgICAgICB7CisgICAgICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtIaXN0b1BhaXJzWzVdWzJdID0geworICAgICAgICAgIHsga0hpc3RvUmVkLCBrSGlzdG9CbHVlIH0sCisgICAgICAgICAgeyBrSGlzdG9SZWRQcmVkLCBrSGlzdG9CbHVlUHJlZCB9LAorICAgICAgICAgIHsga0hpc3RvUmVkU3ViR3JlZW4sIGtIaXN0b0JsdWVTdWJHcmVlbiB9LAorICAgICAgICAgIHsga0hpc3RvUmVkUHJlZFN1YkdyZWVuLCBrSGlzdG9CbHVlUHJlZFN1YkdyZWVuIH0sCisgICAgICAgICAgeyBrSGlzdG9SZWQsIGtIaXN0b0JsdWUgfQorICAgICAgICB9OworICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgcmVkX2hpc3RvID0KKyAgICAgICAgICAgICZoaXN0b1syNTYgKiBrSGlzdG9QYWlyc1sqbWluX2VudHJvcHlfaXhdWzBdXTsKKyAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGJsdWVfaGlzdG8gPQorICAgICAgICAgICAgJmhpc3RvWzI1NiAqIGtIaXN0b1BhaXJzWyptaW5fZW50cm9weV9peF1bMV1dOworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgMjU2OyArK2kpIHsKKyAgICAgICAgICBpZiAoKHJlZF9oaXN0b1tpXSB8IGJsdWVfaGlzdG9baV0pICE9IDApIHsKKyAgICAgICAgICAgICpyZWRfYW5kX2JsdWVfYWx3YXlzX3plcm8gPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIFdlYlBTYWZlRnJlZShoaXN0byk7CisgICAgcmV0dXJuIDE7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIDA7CisgIH0KK30KKworc3RhdGljIGludCBHZXRIaXN0b0JpdHMoaW50IG1ldGhvZCwgaW50IHVzZV9wYWxldHRlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgLy8gTWFrZSB0aWxlIHNpemUgYSBmdW5jdGlvbiBvZiBlbmNvZGluZyBtZXRob2QgKFJhbmdlOiAwIHRvIDYpLgorICBpbnQgaGlzdG9fYml0cyA9ICh1c2VfcGFsZXR0ZSA/IDkgOiA3KSAtIG1ldGhvZDsKKyAgd2hpbGUgKDEpIHsKKyAgICBjb25zdCBpbnQgaHVmZl9pbWFnZV9zaXplID0gVlA4TFN1YlNhbXBsZVNpemUod2lkdGgsIGhpc3RvX2JpdHMpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TFN1YlNhbXBsZVNpemUoaGVpZ2h0LCBoaXN0b19iaXRzKTsKKyAgICBpZiAoaHVmZl9pbWFnZV9zaXplIDw9IE1BWF9IVUZGX0lNQUdFX1NJWkUpIGJyZWFrOworICAgICsraGlzdG9fYml0czsKKyAgfQorICByZXR1cm4gKGhpc3RvX2JpdHMgPCBNSU5fSFVGRk1BTl9CSVRTKSA/IE1JTl9IVUZGTUFOX0JJVFMgOgorICAgICAgICAgKGhpc3RvX2JpdHMgPiBNQVhfSFVGRk1BTl9CSVRTKSA/IE1BWF9IVUZGTUFOX0JJVFMgOiBoaXN0b19iaXRzOworfQorCitzdGF0aWMgaW50IEdldFRyYW5zZm9ybUJpdHMoaW50IG1ldGhvZCwgaW50IGhpc3RvX2JpdHMpIHsKKyAgY29uc3QgaW50IG1heF90cmFuc2Zvcm1fYml0cyA9IChtZXRob2QgPCA0KSA/IDYgOiAobWV0aG9kID4gNCkgPyA0IDogNTsKKyAgY29uc3QgaW50IHJlcyA9CisgICAgICAoaGlzdG9fYml0cyA+IG1heF90cmFuc2Zvcm1fYml0cykgPyBtYXhfdHJhbnNmb3JtX2JpdHMgOiBoaXN0b19iaXRzOworICBhc3NlcnQocmVzIDw9IE1BWF9UUkFOU0ZPUk1fQklUUyk7CisgIHJldHVybiByZXM7Cit9CisKKy8vIFNldCBvZiBwYXJhbWV0ZXJzIHRvIGJlIHVzZWQgaW4gZWFjaCBpdGVyYXRpb24gb2YgdGhlIGNydW5jaGVyLgorI2RlZmluZSBDUlVOQ0hfQ09ORklHU19MWjc3X01BWCAyCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCBlbnRyb3B5X2lkeF87CisgIGludCBsejc3c190eXBlc190b190cnlfW0NSVU5DSF9DT05GSUdTX0xaNzdfTUFYXTsKKyAgaW50IGx6NzdzX3R5cGVzX3RvX3RyeV9zaXplXzsKK30gQ3J1bmNoQ29uZmlnOworCisjZGVmaW5lIENSVU5DSF9DT05GSUdTX01BWCBrTnVtRW50cm9weUl4CisKK3N0YXRpYyBpbnQgRW5jb2RlckFuYWx5emUoVlA4TEVuY29kZXIqIGNvbnN0IGVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ3J1bmNoQ29uZmlnIGNydW5jaF9jb25maWdzW0NSVU5DSF9DT05GSUdTX01BWF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgY3J1bmNoX2NvbmZpZ3Nfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCByZWRfYW5kX2JsdWVfYWx3YXlzX3plcm8pIHsKKyAgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYyA9IGVuYy0+cGljXzsKKyAgY29uc3QgaW50IHdpZHRoID0gcGljLT53aWR0aDsKKyAgY29uc3QgaW50IGhlaWdodCA9IHBpYy0+aGVpZ2h0OworICBjb25zdCBXZWJQQ29uZmlnKiBjb25zdCBjb25maWcgPSBlbmMtPmNvbmZpZ187CisgIGNvbnN0IGludCBtZXRob2QgPSBjb25maWctPm1ldGhvZDsKKyAgY29uc3QgaW50IGxvd19lZmZvcnQgPSAoY29uZmlnLT5tZXRob2QgPT0gMCk7CisgIGludCBpOworICBpbnQgdXNlX3BhbGV0dGU7CisgIGludCBuX2x6NzdzOworICBhc3NlcnQocGljICE9IE5VTEwgJiYgcGljLT5hcmdiICE9IE5VTEwpOworCisgIHVzZV9wYWxldHRlID0KKyAgICAgIEFuYWx5emVBbmRDcmVhdGVQYWxldHRlKHBpYywgbG93X2VmZm9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYy0+cGFsZXR0ZV8sICZlbmMtPnBhbGV0dGVfc2l6ZV8pOworCisgIC8vIEVtcGlyaWNhbCBiaXQgc2l6ZXMuCisgIGVuYy0+aGlzdG9fYml0c18gPSBHZXRIaXN0b0JpdHMobWV0aG9kLCB1c2VfcGFsZXR0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWMtPndpZHRoLCBwaWMtPmhlaWdodCk7CisgIGVuYy0+dHJhbnNmb3JtX2JpdHNfID0gR2V0VHJhbnNmb3JtQml0cyhtZXRob2QsIGVuYy0+aGlzdG9fYml0c18pOworCisgIGlmIChsb3dfZWZmb3J0KSB7CisgICAgLy8gQW5hbHl6ZUVudHJvcHkgaXMgc29tZXdoYXQgc2xvdy4KKyAgICBjcnVuY2hfY29uZmlnc1swXS5lbnRyb3B5X2lkeF8gPSB1c2VfcGFsZXR0ZSA/IGtQYWxldHRlIDoga1NwYXRpYWxTdWJHcmVlbjsKKyAgICBuX2x6NzdzID0gMTsKKyAgICAqY3J1bmNoX2NvbmZpZ3Nfc2l6ZSA9IDE7CisgIH0gZWxzZSB7CisgICAgRW50cm9weUl4IG1pbl9lbnRyb3B5X2l4OworICAgIC8vIFRyeSBvdXQgbXVsdGlwbGUgTFo3NyBvbiBpbWFnZXMgd2l0aCBmZXcgY29sb3JzLgorICAgIG5fbHo3N3MgPSAoZW5jLT5wYWxldHRlX3NpemVfID4gMCAmJiBlbmMtPnBhbGV0dGVfc2l6ZV8gPD0gMTYpID8gMiA6IDE7CisgICAgaWYgKCFBbmFseXplRW50cm9weShwaWMtPmFyZ2IsIHdpZHRoLCBoZWlnaHQsIHBpYy0+YXJnYl9zdHJpZGUsIHVzZV9wYWxldHRlLAorICAgICAgICAgICAgICAgICAgICAgICAgZW5jLT5wYWxldHRlX3NpemVfLCBlbmMtPnRyYW5zZm9ybV9iaXRzXywKKyAgICAgICAgICAgICAgICAgICAgICAgICZtaW5fZW50cm9weV9peCwgcmVkX2FuZF9ibHVlX2Fsd2F5c196ZXJvKSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChtZXRob2QgPT0gNiAmJiBjb25maWctPnF1YWxpdHkgPT0gMTAwKSB7CisgICAgICAvLyBHbyBicnV0ZSBmb3JjZSBvbiBhbGwgdHJhbnNmb3Jtcy4KKyAgICAgICpjcnVuY2hfY29uZmlnc19zaXplID0gMDsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBrTnVtRW50cm9weUl4OyArK2kpIHsKKyAgICAgICAgaWYgKGkgIT0ga1BhbGV0dGUgfHwgdXNlX3BhbGV0dGUpIHsKKyAgICAgICAgICBhc3NlcnQoKmNydW5jaF9jb25maWdzX3NpemUgPCBDUlVOQ0hfQ09ORklHU19NQVgpOworICAgICAgICAgIGNydW5jaF9jb25maWdzWygqY3J1bmNoX2NvbmZpZ3Nfc2l6ZSkrK10uZW50cm9weV9pZHhfID0gaTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvLyBPbmx5IGNob29zZSB0aGUgZ3Vlc3NlZCBiZXN0IHRyYW5zZm9ybS4KKyAgICAgICpjcnVuY2hfY29uZmlnc19zaXplID0gMTsKKyAgICAgIGNydW5jaF9jb25maWdzWzBdLmVudHJvcHlfaWR4XyA9IG1pbl9lbnRyb3B5X2l4OworICAgIH0KKyAgfQorICAvLyBGaWxsIGluIHRoZSBkaWZmZXJlbnQgTFo3N3MuCisgIGFzc2VydChuX2x6NzdzIDw9IENSVU5DSF9DT05GSUdTX0xaNzdfTUFYKTsKKyAgZm9yIChpID0gMDsgaSA8ICpjcnVuY2hfY29uZmlnc19zaXplOyArK2kpIHsKKyAgICBpbnQgajsKKyAgICBmb3IgKGogPSAwOyBqIDwgbl9sejc3czsgKytqKSB7CisgICAgICBjcnVuY2hfY29uZmlnc1tpXS5sejc3c190eXBlc190b190cnlfW2pdID0KKyAgICAgICAgICAoaiA9PSAwKSA/IGtMWjc3U3RhbmRhcmQgfCBrTFo3N1JMRSA6IGtMWjc3Qm94OworICAgIH0KKyAgICBjcnVuY2hfY29uZmlnc1tpXS5sejc3c190eXBlc190b190cnlfc2l6ZV8gPSBuX2x6NzdzOworICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IEVuY29kZXJJbml0KFZQOExFbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYyA9IGVuYy0+cGljXzsKKyAgY29uc3QgaW50IHdpZHRoID0gcGljLT53aWR0aDsKKyAgY29uc3QgaW50IGhlaWdodCA9IHBpYy0+aGVpZ2h0OworICBjb25zdCBpbnQgcGl4X2NudCA9IHdpZHRoICogaGVpZ2h0OworICAvLyB3ZSByb3VuZCB0aGUgYmxvY2sgc2l6ZSB1cCwgc28gd2UncmUgZ3VhcmFudGVlZCB0byBoYXZlCisgIC8vIGF0IG1vc3QgTUFYX1JFRlNfQkxPQ0tfUEVSX0lNQUdFIGJsb2NrcyB1c2VkOgorICBjb25zdCBpbnQgcmVmc19ibG9ja19zaXplID0gKHBpeF9jbnQgLSAxKSAvIE1BWF9SRUZTX0JMT0NLX1BFUl9JTUFHRSArIDE7CisgIGludCBpOworICBpZiAoIVZQOExIYXNoQ2hhaW5Jbml0KCZlbmMtPmhhc2hfY2hhaW5fLCBwaXhfY250KSkgcmV0dXJuIDA7CisKKyAgZm9yIChpID0gMDsgaSA8IDM7ICsraSkgVlA4TEJhY2t3YXJkUmVmc0luaXQoJmVuYy0+cmVmc19baV0sIHJlZnNfYmxvY2tfc2l6ZSk7CisKKyAgcmV0dXJuIDE7Cit9CisKKy8vIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiBtZW1vcnkgZXJyb3IuCitzdGF0aWMgaW50IEdldEh1ZmZCaXRMZW5ndGhzQW5kQ29kZXMoCisgICAgY29uc3QgVlA4TEhpc3RvZ3JhbVNldCogY29uc3QgaGlzdG9ncmFtX2ltYWdlLAorICAgIEh1ZmZtYW5UcmVlQ29kZSogY29uc3QgaHVmZm1hbl9jb2RlcykgeworICBpbnQgaSwgazsKKyAgaW50IG9rID0gMDsKKyAgdWludDY0X3QgdG90YWxfbGVuZ3RoX3NpemUgPSAwOworICB1aW50OF90KiBtZW1fYnVmID0gTlVMTDsKKyAgY29uc3QgaW50IGhpc3RvZ3JhbV9pbWFnZV9zaXplID0gaGlzdG9ncmFtX2ltYWdlLT5zaXplOworICBpbnQgbWF4X251bV9zeW1ib2xzID0gMDsKKyAgdWludDhfdCogYnVmX3JsZSA9IE5VTEw7CisgIEh1ZmZtYW5UcmVlKiBodWZmX3RyZWUgPSBOVUxMOworCisgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgaGlzdG9ncmFtcyBhbmQgZ2V0IHRoZSBhZ2dyZWdhdGUgbnVtYmVyIG9mIGNvZGVzIHVzZWQuCisgIGZvciAoaSA9IDA7IGkgPCBoaXN0b2dyYW1faW1hZ2Vfc2l6ZTsgKytpKSB7CisgICAgY29uc3QgVlA4TEhpc3RvZ3JhbSogY29uc3QgaGlzdG8gPSBoaXN0b2dyYW1faW1hZ2UtPmhpc3RvZ3JhbXNbaV07CisgICAgSHVmZm1hblRyZWVDb2RlKiBjb25zdCBjb2RlcyA9ICZodWZmbWFuX2NvZGVzWzUgKiBpXTsKKyAgICBmb3IgKGsgPSAwOyBrIDwgNTsgKytrKSB7CisgICAgICBjb25zdCBpbnQgbnVtX3N5bWJvbHMgPQorICAgICAgICAgIChrID09IDApID8gVlA4TEhpc3RvZ3JhbU51bUNvZGVzKGhpc3RvLT5wYWxldHRlX2NvZGVfYml0c18pIDoKKyAgICAgICAgICAoayA9PSA0KSA/IE5VTV9ESVNUQU5DRV9DT0RFUyA6IDI1NjsKKyAgICAgIGNvZGVzW2tdLm51bV9zeW1ib2xzID0gbnVtX3N5bWJvbHM7CisgICAgICB0b3RhbF9sZW5ndGhfc2l6ZSArPSBudW1fc3ltYm9sczsKKyAgICB9CisgIH0KKworICAvLyBBbGxvY2F0ZSBhbmQgU2V0IEh1ZmZtYW4gY29kZXMuCisgIHsKKyAgICB1aW50MTZfdCogY29kZXM7CisgICAgdWludDhfdCogbGVuZ3RoczsKKyAgICBtZW1fYnVmID0gKHVpbnQ4X3QqKVdlYlBTYWZlQ2FsbG9jKHRvdGFsX2xlbmd0aF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpsZW5ndGhzKSArIHNpemVvZigqY29kZXMpKTsKKyAgICBpZiAobWVtX2J1ZiA9PSBOVUxMKSBnb3RvIEVuZDsKKworICAgIGNvZGVzID0gKHVpbnQxNl90KiltZW1fYnVmOworICAgIGxlbmd0aHMgPSAodWludDhfdCopJmNvZGVzW3RvdGFsX2xlbmd0aF9zaXplXTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNSAqIGhpc3RvZ3JhbV9pbWFnZV9zaXplOyArK2kpIHsKKyAgICAgIGNvbnN0IGludCBiaXRfbGVuZ3RoID0gaHVmZm1hbl9jb2Rlc1tpXS5udW1fc3ltYm9sczsKKyAgICAgIGh1ZmZtYW5fY29kZXNbaV0uY29kZXMgPSBjb2RlczsKKyAgICAgIGh1ZmZtYW5fY29kZXNbaV0uY29kZV9sZW5ndGhzID0gbGVuZ3RoczsKKyAgICAgIGNvZGVzICs9IGJpdF9sZW5ndGg7CisgICAgICBsZW5ndGhzICs9IGJpdF9sZW5ndGg7CisgICAgICBpZiAobWF4X251bV9zeW1ib2xzIDwgYml0X2xlbmd0aCkgeworICAgICAgICBtYXhfbnVtX3N5bWJvbHMgPSBiaXRfbGVuZ3RoOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGJ1Zl9ybGUgPSAodWludDhfdCopV2ViUFNhZmVNYWxsb2MoMVVMTCwgbWF4X251bV9zeW1ib2xzKTsKKyAgaHVmZl90cmVlID0gKEh1ZmZtYW5UcmVlKilXZWJQU2FmZU1hbGxvYygzVUxMICogbWF4X251bV9zeW1ib2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqaHVmZl90cmVlKSk7CisgIGlmIChidWZfcmxlID09IE5VTEwgfHwgaHVmZl90cmVlID09IE5VTEwpIGdvdG8gRW5kOworCisgIC8vIENyZWF0ZSBIdWZmbWFuIHRyZWVzLgorICBmb3IgKGkgPSAwOyBpIDwgaGlzdG9ncmFtX2ltYWdlX3NpemU7ICsraSkgeworICAgIEh1ZmZtYW5UcmVlQ29kZSogY29uc3QgY29kZXMgPSAmaHVmZm1hbl9jb2Rlc1s1ICogaV07CisgICAgVlA4TEhpc3RvZ3JhbSogY29uc3QgaGlzdG8gPSBoaXN0b2dyYW1faW1hZ2UtPmhpc3RvZ3JhbXNbaV07CisgICAgVlA4TENyZWF0ZUh1ZmZtYW5UcmVlKGhpc3RvLT5saXRlcmFsXywgMTUsIGJ1Zl9ybGUsIGh1ZmZfdHJlZSwgY29kZXMgKyAwKTsKKyAgICBWUDhMQ3JlYXRlSHVmZm1hblRyZWUoaGlzdG8tPnJlZF8sIDE1LCBidWZfcmxlLCBodWZmX3RyZWUsIGNvZGVzICsgMSk7CisgICAgVlA4TENyZWF0ZUh1ZmZtYW5UcmVlKGhpc3RvLT5ibHVlXywgMTUsIGJ1Zl9ybGUsIGh1ZmZfdHJlZSwgY29kZXMgKyAyKTsKKyAgICBWUDhMQ3JlYXRlSHVmZm1hblRyZWUoaGlzdG8tPmFscGhhXywgMTUsIGJ1Zl9ybGUsIGh1ZmZfdHJlZSwgY29kZXMgKyAzKTsKKyAgICBWUDhMQ3JlYXRlSHVmZm1hblRyZWUoaGlzdG8tPmRpc3RhbmNlXywgMTUsIGJ1Zl9ybGUsIGh1ZmZfdHJlZSwgY29kZXMgKyA0KTsKKyAgfQorICBvayA9IDE7CisgRW5kOgorICBXZWJQU2FmZUZyZWUoaHVmZl90cmVlKTsKKyAgV2ViUFNhZmVGcmVlKGJ1Zl9ybGUpOworICBpZiAoIW9rKSB7CisgICAgV2ViUFNhZmVGcmVlKG1lbV9idWYpOworICAgIG1lbXNldChodWZmbWFuX2NvZGVzLCAwLCA1ICogaGlzdG9ncmFtX2ltYWdlX3NpemUgKiBzaXplb2YoKmh1ZmZtYW5fY29kZXMpKTsKKyAgfQorICByZXR1cm4gb2s7Cit9CisKK3N0YXRpYyB2b2lkIFN0b3JlSHVmZm1hblRyZWVPZkh1ZmZtYW5UcmVlVG9CaXRNYXNrKAorICAgIFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LCBjb25zdCB1aW50OF90KiBjb2RlX2xlbmd0aF9iaXRkZXB0aCkgeworICAvLyBSRkMgMTk1MSB3aWxsIGNhbG0geW91IGRvd24gaWYgeW91IGFyZSB3b3JyaWVkIGFib3V0IHRoaXMgZnVubnkgc2VxdWVuY2UuCisgIC8vIFRoaXMgc2VxdWVuY2UgaXMgdHVuZWQgZnJvbSB0aGF0LCBidXQgbW9yZSB3ZWlnaHRlZCBmb3IgbG93ZXIgc3ltYm9sIGNvdW50LAorICAvLyBhbmQgbW9yZSBzcGlraW5nIGhpc3RvZ3JhbXMuCisgIHN0YXRpYyBjb25zdCB1aW50OF90IGtTdG9yYWdlT3JkZXJbQ09ERV9MRU5HVEhfQ09ERVNdID0geworICAgIDE3LCAxOCwgMCwgMSwgMiwgMywgNCwgNSwgMTYsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUKKyAgfTsKKyAgaW50IGk7CisgIC8vIFRocm93IGF3YXkgdHJhaWxpbmcgemVyb3M6CisgIGludCBjb2Rlc190b19zdG9yZSA9IENPREVfTEVOR1RIX0NPREVTOworICBmb3IgKDsgY29kZXNfdG9fc3RvcmUgPiA0OyAtLWNvZGVzX3RvX3N0b3JlKSB7CisgICAgaWYgKGNvZGVfbGVuZ3RoX2JpdGRlcHRoW2tTdG9yYWdlT3JkZXJbY29kZXNfdG9fc3RvcmUgLSAxXV0gIT0gMCkgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIFZQOExQdXRCaXRzKGJ3LCBjb2Rlc190b19zdG9yZSAtIDQsIDQpOworICBmb3IgKGkgPSAwOyBpIDwgY29kZXNfdG9fc3RvcmU7ICsraSkgeworICAgIFZQOExQdXRCaXRzKGJ3LCBjb2RlX2xlbmd0aF9iaXRkZXB0aFtrU3RvcmFnZU9yZGVyW2ldXSwgMyk7CisgIH0KK30KKworc3RhdGljIHZvaWQgQ2xlYXJIdWZmbWFuVHJlZUlmT25seU9uZVN5bWJvbCgKKyAgICBIdWZmbWFuVHJlZUNvZGUqIGNvbnN0IGh1ZmZtYW5fY29kZSkgeworICBpbnQgazsKKyAgaW50IGNvdW50ID0gMDsKKyAgZm9yIChrID0gMDsgayA8IGh1ZmZtYW5fY29kZS0+bnVtX3N5bWJvbHM7ICsraykgeworICAgIGlmIChodWZmbWFuX2NvZGUtPmNvZGVfbGVuZ3Roc1trXSAhPSAwKSB7CisgICAgICArK2NvdW50OworICAgICAgaWYgKGNvdW50ID4gMSkgcmV0dXJuOworICAgIH0KKyAgfQorICBmb3IgKGsgPSAwOyBrIDwgaHVmZm1hbl9jb2RlLT5udW1fc3ltYm9sczsgKytrKSB7CisgICAgaHVmZm1hbl9jb2RlLT5jb2RlX2xlbmd0aHNba10gPSAwOworICAgIGh1ZmZtYW5fY29kZS0+Y29kZXNba10gPSAwOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFN0b3JlSHVmZm1hblRyZWVUb0JpdE1hc2soCisgICAgVlA4TEJpdFdyaXRlciogY29uc3QgYncsCisgICAgY29uc3QgSHVmZm1hblRyZWVUb2tlbiogY29uc3QgdG9rZW5zLCBjb25zdCBpbnQgbnVtX3Rva2VucywKKyAgICBjb25zdCBIdWZmbWFuVHJlZUNvZGUqIGNvbnN0IGh1ZmZtYW5fY29kZSkgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IG51bV90b2tlbnM7ICsraSkgeworICAgIGNvbnN0IGludCBpeCA9IHRva2Vuc1tpXS5jb2RlOworICAgIGNvbnN0IGludCBleHRyYV9iaXRzID0gdG9rZW5zW2ldLmV4dHJhX2JpdHM7CisgICAgVlA4TFB1dEJpdHMoYncsIGh1ZmZtYW5fY29kZS0+Y29kZXNbaXhdLCBodWZmbWFuX2NvZGUtPmNvZGVfbGVuZ3Roc1tpeF0pOworICAgIHN3aXRjaCAoaXgpIHsKKyAgICAgIGNhc2UgMTY6CisgICAgICAgIFZQOExQdXRCaXRzKGJ3LCBleHRyYV9iaXRzLCAyKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDE3OgorICAgICAgICBWUDhMUHV0Qml0cyhidywgZXh0cmFfYml0cywgMyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxODoKKyAgICAgICAgVlA4TFB1dEJpdHMoYncsIGV4dHJhX2JpdHMsIDcpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworLy8gJ2h1ZmZfdHJlZScgYW5kICd0b2tlbnMnIGFyZSBwcmUtYWxsb2FjdGVkIGJ1ZmZlcnMuCitzdGF0aWMgdm9pZCBTdG9yZUZ1bGxIdWZmbWFuQ29kZShWUDhMQml0V3JpdGVyKiBjb25zdCBidywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UcmVlKiBjb25zdCBodWZmX3RyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVHJlZVRva2VuKiBjb25zdCB0b2tlbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBIdWZmbWFuVHJlZUNvZGUqIGNvbnN0IHRyZWUpIHsKKyAgdWludDhfdCBjb2RlX2xlbmd0aF9iaXRkZXB0aFtDT0RFX0xFTkdUSF9DT0RFU10gPSB7IDAgfTsKKyAgdWludDE2X3QgY29kZV9sZW5ndGhfYml0ZGVwdGhfc3ltYm9sc1tDT0RFX0xFTkdUSF9DT0RFU10gPSB7IDAgfTsKKyAgY29uc3QgaW50IG1heF90b2tlbnMgPSB0cmVlLT5udW1fc3ltYm9sczsKKyAgaW50IG51bV90b2tlbnM7CisgIEh1ZmZtYW5UcmVlQ29kZSBodWZmbWFuX2NvZGU7CisgIGh1ZmZtYW5fY29kZS5udW1fc3ltYm9scyA9IENPREVfTEVOR1RIX0NPREVTOworICBodWZmbWFuX2NvZGUuY29kZV9sZW5ndGhzID0gY29kZV9sZW5ndGhfYml0ZGVwdGg7CisgIGh1ZmZtYW5fY29kZS5jb2RlcyA9IGNvZGVfbGVuZ3RoX2JpdGRlcHRoX3N5bWJvbHM7CisKKyAgVlA4TFB1dEJpdHMoYncsIDAsIDEpOworICBudW1fdG9rZW5zID0gVlA4TENyZWF0ZUNvbXByZXNzZWRIdWZmbWFuVHJlZSh0cmVlLCB0b2tlbnMsIG1heF90b2tlbnMpOworICB7CisgICAgdWludDMyX3QgaGlzdG9ncmFtW0NPREVfTEVOR1RIX0NPREVTXSA9IHsgMCB9OworICAgIHVpbnQ4X3QgYnVmX3JsZVtDT0RFX0xFTkdUSF9DT0RFU10gPSB7IDAgfTsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3Rva2VuczsgKytpKSB7CisgICAgICArK2hpc3RvZ3JhbVt0b2tlbnNbaV0uY29kZV07CisgICAgfQorCisgICAgVlA4TENyZWF0ZUh1ZmZtYW5UcmVlKGhpc3RvZ3JhbSwgNywgYnVmX3JsZSwgaHVmZl90cmVlLCAmaHVmZm1hbl9jb2RlKTsKKyAgfQorCisgIFN0b3JlSHVmZm1hblRyZWVPZkh1ZmZtYW5UcmVlVG9CaXRNYXNrKGJ3LCBjb2RlX2xlbmd0aF9iaXRkZXB0aCk7CisgIENsZWFySHVmZm1hblRyZWVJZk9ubHlPbmVTeW1ib2woJmh1ZmZtYW5fY29kZSk7CisgIHsKKyAgICBpbnQgdHJhaWxpbmdfemVyb19iaXRzID0gMDsKKyAgICBpbnQgdHJpbW1lZF9sZW5ndGggPSBudW1fdG9rZW5zOworICAgIGludCB3cml0ZV90cmltbWVkX2xlbmd0aDsKKyAgICBpbnQgbGVuZ3RoOworICAgIGludCBpID0gbnVtX3Rva2VuczsKKyAgICB3aGlsZSAoaS0tID4gMCkgeworICAgICAgY29uc3QgaW50IGl4ID0gdG9rZW5zW2ldLmNvZGU7CisgICAgICBpZiAoaXggPT0gMCB8fCBpeCA9PSAxNyB8fCBpeCA9PSAxOCkgeworICAgICAgICAtLXRyaW1tZWRfbGVuZ3RoOyAgIC8vIGRpc2NvdW50IHRyYWlsaW5nIHplcm9zCisgICAgICAgIHRyYWlsaW5nX3plcm9fYml0cyArPSBjb2RlX2xlbmd0aF9iaXRkZXB0aFtpeF07CisgICAgICAgIGlmIChpeCA9PSAxNykgeworICAgICAgICAgIHRyYWlsaW5nX3plcm9fYml0cyArPSAzOworICAgICAgICB9IGVsc2UgaWYgKGl4ID09IDE4KSB7CisgICAgICAgICAgdHJhaWxpbmdfemVyb19iaXRzICs9IDc7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICB3cml0ZV90cmltbWVkX2xlbmd0aCA9ICh0cmltbWVkX2xlbmd0aCA+IDEgJiYgdHJhaWxpbmdfemVyb19iaXRzID4gMTIpOworICAgIGxlbmd0aCA9IHdyaXRlX3RyaW1tZWRfbGVuZ3RoID8gdHJpbW1lZF9sZW5ndGggOiBudW1fdG9rZW5zOworICAgIFZQOExQdXRCaXRzKGJ3LCB3cml0ZV90cmltbWVkX2xlbmd0aCwgMSk7CisgICAgaWYgKHdyaXRlX3RyaW1tZWRfbGVuZ3RoKSB7CisgICAgICBpZiAodHJpbW1lZF9sZW5ndGggPT0gMikgeworICAgICAgICBWUDhMUHV0Qml0cyhidywgMCwgMyArIDIpOyAgICAgLy8gbmJpdHBhaXJzPTEsIHRyaW1tZWRfbGVuZ3RoPTIKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IGludCBuYml0cyA9IEJpdHNMb2cyRmxvb3IodHJpbW1lZF9sZW5ndGggLSAyKTsKKyAgICAgICAgY29uc3QgaW50IG5iaXRwYWlycyA9IG5iaXRzIC8gMiArIDE7CisgICAgICAgIGFzc2VydCh0cmltbWVkX2xlbmd0aCA+IDIpOworICAgICAgICBhc3NlcnQobmJpdHBhaXJzIC0gMSA8IDgpOworICAgICAgICBWUDhMUHV0Qml0cyhidywgbmJpdHBhaXJzIC0gMSwgMyk7CisgICAgICAgIFZQOExQdXRCaXRzKGJ3LCB0cmltbWVkX2xlbmd0aCAtIDIsIG5iaXRwYWlycyAqIDIpOworICAgICAgfQorICAgIH0KKyAgICBTdG9yZUh1ZmZtYW5UcmVlVG9CaXRNYXNrKGJ3LCB0b2tlbnMsIGxlbmd0aCwgJmh1ZmZtYW5fY29kZSk7CisgIH0KK30KKworLy8gJ2h1ZmZfdHJlZScgYW5kICd0b2tlbnMnIGFyZSBwcmUtYWxsb2FjdGVkIGJ1ZmZlcnMuCitzdGF0aWMgdm9pZCBTdG9yZUh1ZmZtYW5Db2RlKFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVHJlZSogY29uc3QgaHVmZl90cmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVHJlZVRva2VuKiBjb25zdCB0b2tlbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEh1ZmZtYW5UcmVlQ29kZSogY29uc3QgaHVmZm1hbl9jb2RlKSB7CisgIGludCBpOworICBpbnQgY291bnQgPSAwOworICBpbnQgc3ltYm9sc1syXSA9IHsgMCwgMCB9OworICBjb25zdCBpbnQga01heEJpdHMgPSA4OworICBjb25zdCBpbnQga01heFN5bWJvbCA9IDEgPDwga01heEJpdHM7CisKKyAgLy8gQ2hlY2sgd2hldGhlciBpdCdzIGEgc21hbGwgdHJlZS4KKyAgZm9yIChpID0gMDsgaSA8IGh1ZmZtYW5fY29kZS0+bnVtX3N5bWJvbHMgJiYgY291bnQgPCAzOyArK2kpIHsKKyAgICBpZiAoaHVmZm1hbl9jb2RlLT5jb2RlX2xlbmd0aHNbaV0gIT0gMCkgeworICAgICAgaWYgKGNvdW50IDwgMikgc3ltYm9sc1tjb3VudF0gPSBpOworICAgICAgKytjb3VudDsKKyAgICB9CisgIH0KKworICBpZiAoY291bnQgPT0gMCkgeyAgIC8vIGVtaXQgbWluaW1hbCB0cmVlIGZvciBlbXB0eSBjYXNlcworICAgIC8vIGJpdHM6IHNtYWxsIHRyZWUgbWFya2VyOiAxLCBjb3VudC0xOiAwLCBsYXJnZSA4LWJpdCBjb2RlOiAwLCBjb2RlOiAwCisgICAgVlA4TFB1dEJpdHMoYncsIDB4MDEsIDQpOworICB9IGVsc2UgaWYgKGNvdW50IDw9IDIgJiYgc3ltYm9sc1swXSA8IGtNYXhTeW1ib2wgJiYgc3ltYm9sc1sxXSA8IGtNYXhTeW1ib2wpIHsKKyAgICBWUDhMUHV0Qml0cyhidywgMSwgMSk7ICAvLyBTbWFsbCB0cmVlIG1hcmtlciB0byBlbmNvZGUgMSBvciAyIHN5bWJvbHMuCisgICAgVlA4TFB1dEJpdHMoYncsIGNvdW50IC0gMSwgMSk7CisgICAgaWYgKHN5bWJvbHNbMF0gPD0gMSkgeworICAgICAgVlA4TFB1dEJpdHMoYncsIDAsIDEpOyAgLy8gQ29kZSBiaXQgZm9yIHNtYWxsICgxIGJpdCkgc3ltYm9sIHZhbHVlLgorICAgICAgVlA4TFB1dEJpdHMoYncsIHN5bWJvbHNbMF0sIDEpOworICAgIH0gZWxzZSB7CisgICAgICBWUDhMUHV0Qml0cyhidywgMSwgMSk7CisgICAgICBWUDhMUHV0Qml0cyhidywgc3ltYm9sc1swXSwgOCk7CisgICAgfQorICAgIGlmIChjb3VudCA9PSAyKSB7CisgICAgICBWUDhMUHV0Qml0cyhidywgc3ltYm9sc1sxXSwgOCk7CisgICAgfQorICB9IGVsc2UgeworICAgIFN0b3JlRnVsbEh1ZmZtYW5Db2RlKGJ3LCBodWZmX3RyZWUsIHRva2VucywgaHVmZm1hbl9jb2RlKTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBXcml0ZUh1ZmZtYW5Db2RlKFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBIdWZmbWFuVHJlZUNvZGUqIGNvbnN0IGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2RlX2luZGV4KSB7CisgIGNvbnN0IGludCBkZXB0aCA9IGNvZGUtPmNvZGVfbGVuZ3Roc1tjb2RlX2luZGV4XTsKKyAgY29uc3QgaW50IHN5bWJvbCA9IGNvZGUtPmNvZGVzW2NvZGVfaW5kZXhdOworICBWUDhMUHV0Qml0cyhidywgc3ltYm9sLCBkZXB0aCk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFdyaXRlSHVmZm1hbkNvZGVXaXRoRXh0cmFCaXRzKAorICAgIFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LAorICAgIGNvbnN0IEh1ZmZtYW5UcmVlQ29kZSogY29uc3QgY29kZSwKKyAgICBpbnQgY29kZV9pbmRleCwKKyAgICBpbnQgYml0cywKKyAgICBpbnQgbl9iaXRzKSB7CisgIGNvbnN0IGludCBkZXB0aCA9IGNvZGUtPmNvZGVfbGVuZ3Roc1tjb2RlX2luZGV4XTsKKyAgY29uc3QgaW50IHN5bWJvbCA9IGNvZGUtPmNvZGVzW2NvZGVfaW5kZXhdOworICBWUDhMUHV0Qml0cyhidywgKGJpdHMgPDwgZGVwdGgpIHwgc3ltYm9sLCBkZXB0aCArIG5fYml0cyk7Cit9CisKK3N0YXRpYyBXZWJQRW5jb2RpbmdFcnJvciBTdG9yZUltYWdlVG9CaXRNYXNrKAorICAgIFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LCBpbnQgd2lkdGgsIGludCBoaXN0b19iaXRzLAorICAgIGNvbnN0IFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMsCisgICAgY29uc3QgdWludDE2X3QqIGhpc3RvZ3JhbV9zeW1ib2xzLAorICAgIGNvbnN0IEh1ZmZtYW5UcmVlQ29kZSogY29uc3QgaHVmZm1hbl9jb2RlcykgeworICBjb25zdCBpbnQgaGlzdG9feHNpemUgPSBoaXN0b19iaXRzID8gVlA4TFN1YlNhbXBsZVNpemUod2lkdGgsIGhpc3RvX2JpdHMpIDogMTsKKyAgY29uc3QgaW50IHRpbGVfbWFzayA9IChoaXN0b19iaXRzID09IDApID8gMCA6IC0oMSA8PCBoaXN0b19iaXRzKTsKKyAgLy8geCBhbmQgeSB0cmFjZSB0aGUgcG9zaXRpb24gaW4gdGhlIGltYWdlLgorICBpbnQgeCA9IDA7CisgIGludCB5ID0gMDsKKyAgaW50IHRpbGVfeCA9IHggJiB0aWxlX21hc2s7CisgIGludCB0aWxlX3kgPSB5ICYgdGlsZV9tYXNrOworICBpbnQgaGlzdG9ncmFtX2l4ID0gaGlzdG9ncmFtX3N5bWJvbHNbMF07CisgIGNvbnN0IEh1ZmZtYW5UcmVlQ29kZSogY29kZXMgPSBodWZmbWFuX2NvZGVzICsgNSAqIGhpc3RvZ3JhbV9peDsKKyAgVlA4TFJlZnNDdXJzb3IgYyA9IFZQOExSZWZzQ3Vyc29ySW5pdChyZWZzKTsKKyAgd2hpbGUgKFZQOExSZWZzQ3Vyc29yT2soJmMpKSB7CisgICAgY29uc3QgUGl4T3JDb3B5KiBjb25zdCB2ID0gYy5jdXJfcG9zOworICAgIGlmICgodGlsZV94ICE9ICh4ICYgdGlsZV9tYXNrKSkgfHwgKHRpbGVfeSAhPSAoeSAmIHRpbGVfbWFzaykpKSB7CisgICAgICB0aWxlX3ggPSB4ICYgdGlsZV9tYXNrOworICAgICAgdGlsZV95ID0geSAmIHRpbGVfbWFzazsKKyAgICAgIGhpc3RvZ3JhbV9peCA9IGhpc3RvZ3JhbV9zeW1ib2xzWyh5ID4+IGhpc3RvX2JpdHMpICogaGlzdG9feHNpemUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHggPj4gaGlzdG9fYml0cyldOworICAgICAgY29kZXMgPSBodWZmbWFuX2NvZGVzICsgNSAqIGhpc3RvZ3JhbV9peDsKKyAgICB9CisgICAgaWYgKFBpeE9yQ29weUlzTGl0ZXJhbCh2KSkgeworICAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qgb3JkZXJbXSA9IHsgMSwgMiwgMCwgMyB9OworICAgICAgaW50IGs7CisgICAgICBmb3IgKGsgPSAwOyBrIDwgNDsgKytrKSB7CisgICAgICAgIGNvbnN0IGludCBjb2RlID0gUGl4T3JDb3B5TGl0ZXJhbCh2LCBvcmRlcltrXSk7CisgICAgICAgIFdyaXRlSHVmZm1hbkNvZGUoYncsIGNvZGVzICsgaywgY29kZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChQaXhPckNvcHlJc0NhY2hlSWR4KHYpKSB7CisgICAgICBjb25zdCBpbnQgY29kZSA9IFBpeE9yQ29weUNhY2hlSWR4KHYpOworICAgICAgY29uc3QgaW50IGxpdGVyYWxfaXggPSAyNTYgKyBOVU1fTEVOR1RIX0NPREVTICsgY29kZTsKKyAgICAgIFdyaXRlSHVmZm1hbkNvZGUoYncsIGNvZGVzLCBsaXRlcmFsX2l4KTsKKyAgICB9IGVsc2UgeworICAgICAgaW50IGJpdHMsIG5fYml0czsKKyAgICAgIGludCBjb2RlOworCisgICAgICBjb25zdCBpbnQgZGlzdGFuY2UgPSBQaXhPckNvcHlEaXN0YW5jZSh2KTsKKyAgICAgIFZQOExQcmVmaXhFbmNvZGUodi0+bGVuLCAmY29kZSwgJm5fYml0cywgJmJpdHMpOworICAgICAgV3JpdGVIdWZmbWFuQ29kZVdpdGhFeHRyYUJpdHMoYncsIGNvZGVzLCAyNTYgKyBjb2RlLCBiaXRzLCBuX2JpdHMpOworCisgICAgICAvLyBEb24ndCB3cml0ZSB0aGUgZGlzdGFuY2Ugd2l0aCB0aGUgZXh0cmEgYml0cyBjb2RlIHNpbmNlCisgICAgICAvLyB0aGUgZGlzdGFuY2UgY2FuIGJlIHVwIHRvIDE4IGJpdHMgb2YgZXh0cmEgYml0cywgYW5kIHRoZSBwcmVmaXgKKyAgICAgIC8vIDE1IGJpdHMsIHRvdGFsaW5nIHRvIDMzLCBhbmQgb3VyIFB1dEJpdHMgb25seSBzdXBwb3J0cyB1cCB0byAzMiBiaXRzLgorICAgICAgVlA4TFByZWZpeEVuY29kZShkaXN0YW5jZSwgJmNvZGUsICZuX2JpdHMsICZiaXRzKTsKKyAgICAgIFdyaXRlSHVmZm1hbkNvZGUoYncsIGNvZGVzICsgNCwgY29kZSk7CisgICAgICBWUDhMUHV0Qml0cyhidywgYml0cywgbl9iaXRzKTsKKyAgICB9CisgICAgeCArPSBQaXhPckNvcHlMZW5ndGgodik7CisgICAgd2hpbGUgKHggPj0gd2lkdGgpIHsKKyAgICAgIHggLT0gd2lkdGg7CisgICAgICArK3k7CisgICAgfQorICAgIFZQOExSZWZzQ3Vyc29yTmV4dCgmYyk7CisgIH0KKyAgcmV0dXJuIGJ3LT5lcnJvcl8gPyBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlkgOiBWUDhfRU5DX09LOworfQorCisvLyBTcGVjaWFsIGNhc2Ugb2YgRW5jb2RlSW1hZ2VJbnRlcm5hbCgpIGZvciBjYWNoZS1iaXRzPTAsIGhpc3RvX2JpdHM9MzEKK3N0YXRpYyBXZWJQRW5jb2RpbmdFcnJvciBFbmNvZGVJbWFnZU5vSHVmZm1hbihWUDhMQml0V3JpdGVyKiBjb25zdCBidywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMSGFzaENoYWluKiBjb25zdCBoYXNoX2NoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnNfdG1wMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzX3RtcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBxdWFsaXR5LCBpbnQgbG93X2VmZm9ydCkgeworICBpbnQgaTsKKyAgaW50IG1heF90b2tlbnMgPSAwOworICBXZWJQRW5jb2RpbmdFcnJvciBlcnIgPSBWUDhfRU5DX09LOworICBWUDhMQmFja3dhcmRSZWZzKiByZWZzOworICBIdWZmbWFuVHJlZVRva2VuKiB0b2tlbnMgPSBOVUxMOworICBIdWZmbWFuVHJlZUNvZGUgaHVmZm1hbl9jb2Rlc1s1XSA9IHsgeyAwLCBOVUxMLCBOVUxMIH0gfTsKKyAgY29uc3QgdWludDE2X3QgaGlzdG9ncmFtX3N5bWJvbHNbMV0gPSB7IDAgfTsgICAgLy8gb25seSBvbmUgdHJlZSwgb25lIHN5bWJvbAorICBpbnQgY2FjaGVfYml0cyA9IDA7CisgIFZQOExIaXN0b2dyYW1TZXQqIGhpc3RvZ3JhbV9pbWFnZSA9IE5VTEw7CisgIEh1ZmZtYW5UcmVlKiBjb25zdCBodWZmX3RyZWUgPSAoSHVmZm1hblRyZWUqKVdlYlBTYWZlTWFsbG9jKAorICAgICAgICAzVUxMICogQ09ERV9MRU5HVEhfQ09ERVMsIHNpemVvZigqaHVmZl90cmVlKSk7CisgIGlmIChodWZmX3RyZWUgPT0gTlVMTCkgeworICAgIGVyciA9IFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWTsKKyAgICBnb3RvIEVycm9yOworICB9CisKKyAgLy8gQ2FsY3VsYXRlIGJhY2t3YXJkIHJlZmVyZW5jZXMgZnJvbSBBUkdCIGltYWdlLgorICBpZiAoIVZQOExIYXNoQ2hhaW5GaWxsKGhhc2hfY2hhaW4sIHF1YWxpdHksIGFyZ2IsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgbG93X2VmZm9ydCkpIHsKKyAgICBlcnIgPSBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlk7CisgICAgZ290byBFcnJvcjsKKyAgfQorICByZWZzID0gVlA4TEdldEJhY2t3YXJkUmVmZXJlbmNlcyh3aWR0aCwgaGVpZ2h0LCBhcmdiLCBxdWFsaXR5LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrTFo3N1N0YW5kYXJkIHwga0xaNzdSTEUsICZjYWNoZV9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoX2NoYWluLCByZWZzX3RtcDEsIHJlZnNfdG1wMik7CisgIGlmIChyZWZzID09IE5VTEwpIHsKKyAgICBlcnIgPSBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlk7CisgICAgZ290byBFcnJvcjsKKyAgfQorICBoaXN0b2dyYW1faW1hZ2UgPSBWUDhMQWxsb2NhdGVIaXN0b2dyYW1TZXQoMSwgY2FjaGVfYml0cyk7CisgIGlmIChoaXN0b2dyYW1faW1hZ2UgPT0gTlVMTCkgeworICAgIGVyciA9IFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWTsKKyAgICBnb3RvIEVycm9yOworICB9CisKKyAgLy8gQnVpbGQgaGlzdG9ncmFtIGltYWdlIGFuZCBzeW1ib2xzIGZyb20gYmFja3dhcmQgcmVmZXJlbmNlcy4KKyAgVlA4TEhpc3RvZ3JhbVN0b3JlUmVmcyhyZWZzLCBoaXN0b2dyYW1faW1hZ2UtPmhpc3RvZ3JhbXNbMF0pOworCisgIC8vIENyZWF0ZSBIdWZmbWFuIGJpdCBsZW5ndGhzIGFuZCBjb2RlcyBmb3IgZWFjaCBoaXN0b2dyYW0gaW1hZ2UuCisgIGFzc2VydChoaXN0b2dyYW1faW1hZ2UtPnNpemUgPT0gMSk7CisgIGlmICghR2V0SHVmZkJpdExlbmd0aHNBbmRDb2RlcyhoaXN0b2dyYW1faW1hZ2UsIGh1ZmZtYW5fY29kZXMpKSB7CisgICAgZXJyID0gVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZOworICAgIGdvdG8gRXJyb3I7CisgIH0KKworICAvLyBObyBjb2xvciBjYWNoZSwgbm8gSHVmZm1hbiBpbWFnZS4KKyAgVlA4TFB1dEJpdHMoYncsIDAsIDEpOworCisgIC8vIEZpbmQgbWF4aW11bSBudW1iZXIgb2Ygc3ltYm9scyBmb3IgdGhlIGh1ZmZtYW4gdHJlZS1zZXQuCisgIGZvciAoaSA9IDA7IGkgPCA1OyArK2kpIHsKKyAgICBIdWZmbWFuVHJlZUNvZGUqIGNvbnN0IGNvZGVzID0gJmh1ZmZtYW5fY29kZXNbaV07CisgICAgaWYgKG1heF90b2tlbnMgPCBjb2Rlcy0+bnVtX3N5bWJvbHMpIHsKKyAgICAgIG1heF90b2tlbnMgPSBjb2Rlcy0+bnVtX3N5bWJvbHM7CisgICAgfQorICB9CisKKyAgdG9rZW5zID0gKEh1ZmZtYW5UcmVlVG9rZW4qKVdlYlBTYWZlTWFsbG9jKG1heF90b2tlbnMsIHNpemVvZigqdG9rZW5zKSk7CisgIGlmICh0b2tlbnMgPT0gTlVMTCkgeworICAgIGVyciA9IFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWTsKKyAgICBnb3RvIEVycm9yOworICB9CisKKyAgLy8gU3RvcmUgSHVmZm1hbiBjb2Rlcy4KKyAgZm9yIChpID0gMDsgaSA8IDU7ICsraSkgeworICAgIEh1ZmZtYW5UcmVlQ29kZSogY29uc3QgY29kZXMgPSAmaHVmZm1hbl9jb2Rlc1tpXTsKKyAgICBTdG9yZUh1ZmZtYW5Db2RlKGJ3LCBodWZmX3RyZWUsIHRva2VucywgY29kZXMpOworICAgIENsZWFySHVmZm1hblRyZWVJZk9ubHlPbmVTeW1ib2woY29kZXMpOworICB9CisKKyAgLy8gU3RvcmUgYWN0dWFsIGxpdGVyYWxzLgorICBlcnIgPSBTdG9yZUltYWdlVG9CaXRNYXNrKGJ3LCB3aWR0aCwgMCwgcmVmcywgaGlzdG9ncmFtX3N5bWJvbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHVmZm1hbl9jb2Rlcyk7CisKKyBFcnJvcjoKKyAgV2ViUFNhZmVGcmVlKHRva2Vucyk7CisgIFdlYlBTYWZlRnJlZShodWZmX3RyZWUpOworICBWUDhMRnJlZUhpc3RvZ3JhbVNldChoaXN0b2dyYW1faW1hZ2UpOworICBXZWJQU2FmZUZyZWUoaHVmZm1hbl9jb2Rlc1swXS5jb2Rlcyk7CisgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBXZWJQRW5jb2RpbmdFcnJvciBFbmNvZGVJbWFnZUludGVybmFsKAorICAgIFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LCBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwKKyAgICBWUDhMSGFzaENoYWluKiBjb25zdCBoYXNoX2NoYWluLCBWUDhMQmFja3dhcmRSZWZzIHJlZnNfYXJyYXlbM10sIGludCB3aWR0aCwKKyAgICBpbnQgaGVpZ2h0LCBpbnQgcXVhbGl0eSwgaW50IGxvd19lZmZvcnQsIGludCB1c2VfY2FjaGUsCisgICAgY29uc3QgQ3J1bmNoQ29uZmlnKiBjb25zdCBjb25maWcsIGludCogY2FjaGVfYml0cywgaW50IGhpc3RvZ3JhbV9iaXRzLAorICAgIHNpemVfdCBpbml0X2J5dGVfcG9zaXRpb24sIGludCogY29uc3QgaGRyX3NpemUsIGludCogY29uc3QgZGF0YV9zaXplKSB7CisgIFdlYlBFbmNvZGluZ0Vycm9yIGVyciA9IFZQOF9FTkNfT0s7CisgIGNvbnN0IHVpbnQzMl90IGhpc3RvZ3JhbV9pbWFnZV94eXNpemUgPQorICAgICAgVlA4TFN1YlNhbXBsZVNpemUod2lkdGgsIGhpc3RvZ3JhbV9iaXRzKSAqCisgICAgICBWUDhMU3ViU2FtcGxlU2l6ZShoZWlnaHQsIGhpc3RvZ3JhbV9iaXRzKTsKKyAgVlA4TEhpc3RvZ3JhbVNldCogaGlzdG9ncmFtX2ltYWdlID0gTlVMTDsKKyAgVlA4TEhpc3RvZ3JhbSogdG1wX2hpc3RvID0gTlVMTDsKKyAgaW50IGhpc3RvZ3JhbV9pbWFnZV9zaXplID0gMDsKKyAgc2l6ZV90IGJpdF9hcnJheV9zaXplID0gMDsKKyAgSHVmZm1hblRyZWUqIGNvbnN0IGh1ZmZfdHJlZSA9IChIdWZmbWFuVHJlZSopV2ViUFNhZmVNYWxsb2MoCisgICAgICAzVUxMICogQ09ERV9MRU5HVEhfQ09ERVMsIHNpemVvZigqaHVmZl90cmVlKSk7CisgIEh1ZmZtYW5UcmVlVG9rZW4qIHRva2VucyA9IE5VTEw7CisgIEh1ZmZtYW5UcmVlQ29kZSogaHVmZm1hbl9jb2RlcyA9IE5VTEw7CisgIFZQOExCYWNrd2FyZFJlZnMqIHJlZnNfYmVzdDsKKyAgVlA4TEJhY2t3YXJkUmVmcyogcmVmc190bXA7CisgIHVpbnQxNl90KiBjb25zdCBoaXN0b2dyYW1fc3ltYm9scyA9CisgICAgICAodWludDE2X3QqKVdlYlBTYWZlTWFsbG9jKGhpc3RvZ3JhbV9pbWFnZV94eXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqaGlzdG9ncmFtX3N5bWJvbHMpKTsKKyAgaW50IGx6NzdzX2lkeDsKKyAgVlA4TEJpdFdyaXRlciBid19pbml0ID0gKmJ3LCBid19iZXN0OworICBpbnQgaGRyX3NpemVfdG1wOworICBhc3NlcnQoaGlzdG9ncmFtX2JpdHMgPj0gTUlOX0hVRkZNQU5fQklUUyk7CisgIGFzc2VydChoaXN0b2dyYW1fYml0cyA8PSBNQVhfSFVGRk1BTl9CSVRTKTsKKyAgYXNzZXJ0KGhkcl9zaXplICE9IE5VTEwpOworICBhc3NlcnQoZGF0YV9zaXplICE9IE5VTEwpOworCisgIGlmIChoaXN0b2dyYW1fc3ltYm9scyA9PSBOVUxMKSB7CisgICAgZXJyID0gVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZOworICAgIGdvdG8gRXJyb3I7CisgIH0KKworICBpZiAodXNlX2NhY2hlKSB7CisgICAgLy8gSWYgdGhlIHZhbHVlIGlzIGRpZmZlcmVudCBmcm9tIHplcm8sIGl0IGhhcyBiZWVuIHNldCBkdXJpbmcgdGhlCisgICAgLy8gcGFsZXR0ZSBhbmFseXNpcy4KKyAgICBpZiAoKmNhY2hlX2JpdHMgPT0gMCkgKmNhY2hlX2JpdHMgPSBNQVhfQ09MT1JfQ0FDSEVfQklUUzsKKyAgfSBlbHNlIHsKKyAgICAqY2FjaGVfYml0cyA9IDA7CisgIH0KKyAgLy8gJ2Jlc3RfcmVmcycgaXMgdGhlIHJlZmVyZW5jZSB0byB0aGUgYmVzdCBiYWNrd2FyZCByZWZzIGFuZCBwb2ludHMgdG8gb25lCisgIC8vIG9mIHJlZnNfYXJyYXlbMF0gb3IgcmVmc19hcnJheVsxXS4KKyAgLy8gQ2FsY3VsYXRlIGJhY2t3YXJkIHJlZmVyZW5jZXMgZnJvbSBBUkdCIGltYWdlLgorICBpZiAoaHVmZl90cmVlID09IE5VTEwgfHwKKyAgICAgICFWUDhMSGFzaENoYWluRmlsbChoYXNoX2NoYWluLCBxdWFsaXR5LCBhcmdiLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxvd19lZmZvcnQpIHx8CisgICAgICAhVlA4TEJpdFdyaXRlckluaXQoJmJ3X2Jlc3QsIDApIHx8CisgICAgICAoY29uZmlnLT5sejc3c190eXBlc190b190cnlfc2l6ZV8gPiAxICYmCisgICAgICAgIVZQOExCaXRXcml0ZXJDbG9uZShidywgJmJ3X2Jlc3QpKSkgeworICAgIGVyciA9IFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWTsKKyAgICBnb3RvIEVycm9yOworICB9CisgIGZvciAobHo3N3NfaWR4ID0gMDsgbHo3N3NfaWR4IDwgY29uZmlnLT5sejc3c190eXBlc190b190cnlfc2l6ZV87CisgICAgICAgKytsejc3c19pZHgpIHsKKyAgICByZWZzX2Jlc3QgPSBWUDhMR2V0QmFja3dhcmRSZWZlcmVuY2VzKAorICAgICAgICB3aWR0aCwgaGVpZ2h0LCBhcmdiLCBxdWFsaXR5LCBsb3dfZWZmb3J0LAorICAgICAgICBjb25maWctPmx6NzdzX3R5cGVzX3RvX3RyeV9bbHo3N3NfaWR4XSwgY2FjaGVfYml0cywgaGFzaF9jaGFpbiwKKyAgICAgICAgJnJlZnNfYXJyYXlbMF0sICZyZWZzX2FycmF5WzFdKTsKKyAgICBpZiAocmVmc19iZXN0ID09IE5VTEwpIHsKKyAgICAgIGVyciA9IFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWTsKKyAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorICAgIC8vIEtlZXAgdGhlIGJlc3QgcmVmZXJlbmNlcyBhc2lkZSBhbmQgdXNlIHRoZSBvdGhlciBlbGVtZW50IGZyb20gdGhlIGZpcnN0CisgICAgLy8gdHdvIGFzIGEgdGVtcG9yYXJ5IGZvciBsYXRlciB1c2FnZS4KKyAgICByZWZzX3RtcCA9ICZyZWZzX2FycmF5W3JlZnNfYmVzdCA9PSAmcmVmc19hcnJheVswXSA/IDEgOiAwXTsKKworICAgIGhpc3RvZ3JhbV9pbWFnZSA9CisgICAgICAgIFZQOExBbGxvY2F0ZUhpc3RvZ3JhbVNldChoaXN0b2dyYW1faW1hZ2VfeHlzaXplLCAqY2FjaGVfYml0cyk7CisgICAgdG1wX2hpc3RvID0gVlA4TEFsbG9jYXRlSGlzdG9ncmFtKCpjYWNoZV9iaXRzKTsKKyAgICBpZiAoaGlzdG9ncmFtX2ltYWdlID09IE5VTEwgfHwgdG1wX2hpc3RvID09IE5VTEwpIHsKKyAgICAgIGVyciA9IFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWTsKKyAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorCisgICAgLy8gQnVpbGQgaGlzdG9ncmFtIGltYWdlIGFuZCBzeW1ib2xzIGZyb20gYmFja3dhcmQgcmVmZXJlbmNlcy4KKyAgICBpZiAoIVZQOExHZXRIaXN0b0ltYWdlU3ltYm9scyh3aWR0aCwgaGVpZ2h0LCByZWZzX2Jlc3QsIHF1YWxpdHksIGxvd19lZmZvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlzdG9ncmFtX2JpdHMsICpjYWNoZV9iaXRzLCBoaXN0b2dyYW1faW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wX2hpc3RvLCBoaXN0b2dyYW1fc3ltYm9scykpIHsKKyAgICAgIGVyciA9IFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWTsKKyAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorICAgIC8vIENyZWF0ZSBIdWZmbWFuIGJpdCBsZW5ndGhzIGFuZCBjb2RlcyBmb3IgZWFjaCBoaXN0b2dyYW0gaW1hZ2UuCisgICAgaGlzdG9ncmFtX2ltYWdlX3NpemUgPSBoaXN0b2dyYW1faW1hZ2UtPnNpemU7CisgICAgYml0X2FycmF5X3NpemUgPSA1ICogaGlzdG9ncmFtX2ltYWdlX3NpemU7CisgICAgaHVmZm1hbl9jb2RlcyA9IChIdWZmbWFuVHJlZUNvZGUqKVdlYlBTYWZlQ2FsbG9jKGJpdF9hcnJheV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKmh1ZmZtYW5fY29kZXMpKTsKKyAgICAvLyBOb3RlOiBzb21lIGhpc3RvZ3JhbV9pbWFnZSBlbnRyaWVzIG1heSBwb2ludCB0byB0bXBfaGlzdG9zW10sIHNvIHRoZQorICAgIC8vIGxhdHRlciBuZWVkIHRvIG91dGxpdmUgdGhlIGZvbGxvd2luZyBjYWxsIHRvIEdldEh1ZmZCaXRMZW5ndGhzQW5kQ29kZXMoKS4KKyAgICBpZiAoaHVmZm1hbl9jb2RlcyA9PSBOVUxMIHx8CisgICAgICAgICFHZXRIdWZmQml0TGVuZ3Roc0FuZENvZGVzKGhpc3RvZ3JhbV9pbWFnZSwgaHVmZm1hbl9jb2RlcykpIHsKKyAgICAgIGVyciA9IFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWTsKKyAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorICAgIC8vIEZyZWUgY29tYmluZWQgaGlzdG9ncmFtcy4KKyAgICBWUDhMRnJlZUhpc3RvZ3JhbVNldChoaXN0b2dyYW1faW1hZ2UpOworICAgIGhpc3RvZ3JhbV9pbWFnZSA9IE5VTEw7CisKKyAgICAvLyBGcmVlIHNjcmF0Y2ggaGlzdG9ncmFtcy4KKyAgICBWUDhMRnJlZUhpc3RvZ3JhbSh0bXBfaGlzdG8pOworICAgIHRtcF9oaXN0byA9IE5VTEw7CisKKyAgICAvLyBDb2xvciBDYWNoZSBwYXJhbWV0ZXJzLgorICAgIGlmICgqY2FjaGVfYml0cyA+IDApIHsKKyAgICAgIFZQOExQdXRCaXRzKGJ3LCAxLCAxKTsKKyAgICAgIFZQOExQdXRCaXRzKGJ3LCAqY2FjaGVfYml0cywgNCk7CisgICAgfSBlbHNlIHsKKyAgICAgIFZQOExQdXRCaXRzKGJ3LCAwLCAxKTsKKyAgICB9CisKKyAgICAvLyBIdWZmbWFuIGltYWdlICsgbWV0YSBodWZmbWFuLgorICAgIHsKKyAgICAgIGNvbnN0IGludCB3cml0ZV9oaXN0b2dyYW1faW1hZ2UgPSAoaGlzdG9ncmFtX2ltYWdlX3NpemUgPiAxKTsKKyAgICAgIFZQOExQdXRCaXRzKGJ3LCB3cml0ZV9oaXN0b2dyYW1faW1hZ2UsIDEpOworICAgICAgaWYgKHdyaXRlX2hpc3RvZ3JhbV9pbWFnZSkgeworICAgICAgICB1aW50MzJfdCogY29uc3QgaGlzdG9ncmFtX2FyZ2IgPQorICAgICAgICAgICAgKHVpbnQzMl90KilXZWJQU2FmZU1hbGxvYyhoaXN0b2dyYW1faW1hZ2VfeHlzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKmhpc3RvZ3JhbV9hcmdiKSk7CisgICAgICAgIGludCBtYXhfaW5kZXggPSAwOworICAgICAgICB1aW50MzJfdCBpOworICAgICAgICBpZiAoaGlzdG9ncmFtX2FyZ2IgPT0gTlVMTCkgeworICAgICAgICAgIGVyciA9IFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWTsKKyAgICAgICAgICBnb3RvIEVycm9yOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoaXN0b2dyYW1faW1hZ2VfeHlzaXplOyArK2kpIHsKKyAgICAgICAgICBjb25zdCBpbnQgc3ltYm9sX2luZGV4ID0gaGlzdG9ncmFtX3N5bWJvbHNbaV0gJiAweGZmZmY7CisgICAgICAgICAgaGlzdG9ncmFtX2FyZ2JbaV0gPSAoc3ltYm9sX2luZGV4IDw8IDgpOworICAgICAgICAgIGlmIChzeW1ib2xfaW5kZXggPj0gbWF4X2luZGV4KSB7CisgICAgICAgICAgICBtYXhfaW5kZXggPSBzeW1ib2xfaW5kZXggKyAxOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBoaXN0b2dyYW1faW1hZ2Vfc2l6ZSA9IG1heF9pbmRleDsKKworICAgICAgICBWUDhMUHV0Qml0cyhidywgaGlzdG9ncmFtX2JpdHMgLSAyLCAzKTsKKyAgICAgICAgZXJyID0gRW5jb2RlSW1hZ2VOb0h1ZmZtYW4oCisgICAgICAgICAgICBidywgaGlzdG9ncmFtX2FyZ2IsIGhhc2hfY2hhaW4sIHJlZnNfdG1wLCAmcmVmc19hcnJheVsyXSwKKyAgICAgICAgICAgIFZQOExTdWJTYW1wbGVTaXplKHdpZHRoLCBoaXN0b2dyYW1fYml0cyksCisgICAgICAgICAgICBWUDhMU3ViU2FtcGxlU2l6ZShoZWlnaHQsIGhpc3RvZ3JhbV9iaXRzKSwgcXVhbGl0eSwgbG93X2VmZm9ydCk7CisgICAgICAgIFdlYlBTYWZlRnJlZShoaXN0b2dyYW1fYXJnYik7CisgICAgICAgIGlmIChlcnIgIT0gVlA4X0VOQ19PSykgZ290byBFcnJvcjsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTdG9yZSBIdWZmbWFuIGNvZGVzLgorICAgIHsKKyAgICAgIGludCBpOworICAgICAgaW50IG1heF90b2tlbnMgPSAwOworICAgICAgLy8gRmluZCBtYXhpbXVtIG51bWJlciBvZiBzeW1ib2xzIGZvciB0aGUgaHVmZm1hbiB0cmVlLXNldC4KKyAgICAgIGZvciAoaSA9IDA7IGkgPCA1ICogaGlzdG9ncmFtX2ltYWdlX3NpemU7ICsraSkgeworICAgICAgICBIdWZmbWFuVHJlZUNvZGUqIGNvbnN0IGNvZGVzID0gJmh1ZmZtYW5fY29kZXNbaV07CisgICAgICAgIGlmIChtYXhfdG9rZW5zIDwgY29kZXMtPm51bV9zeW1ib2xzKSB7CisgICAgICAgICAgbWF4X3Rva2VucyA9IGNvZGVzLT5udW1fc3ltYm9sczsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgdG9rZW5zID0gKEh1ZmZtYW5UcmVlVG9rZW4qKVdlYlBTYWZlTWFsbG9jKG1heF90b2tlbnMsIHNpemVvZigqdG9rZW5zKSk7CisgICAgICBpZiAodG9rZW5zID09IE5VTEwpIHsKKyAgICAgICAgZXJyID0gVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZOworICAgICAgICBnb3RvIEVycm9yOworICAgICAgfQorICAgICAgZm9yIChpID0gMDsgaSA8IDUgKiBoaXN0b2dyYW1faW1hZ2Vfc2l6ZTsgKytpKSB7CisgICAgICAgIEh1ZmZtYW5UcmVlQ29kZSogY29uc3QgY29kZXMgPSAmaHVmZm1hbl9jb2Rlc1tpXTsKKyAgICAgICAgU3RvcmVIdWZmbWFuQ29kZShidywgaHVmZl90cmVlLCB0b2tlbnMsIGNvZGVzKTsKKyAgICAgICAgQ2xlYXJIdWZmbWFuVHJlZUlmT25seU9uZVN5bWJvbChjb2Rlcyk7CisgICAgICB9CisgICAgfQorICAgIC8vIFN0b3JlIGFjdHVhbCBsaXRlcmFscy4KKyAgICBoZHJfc2l6ZV90bXAgPSAoaW50KShWUDhMQml0V3JpdGVyTnVtQnl0ZXMoYncpIC0gaW5pdF9ieXRlX3Bvc2l0aW9uKTsKKyAgICBlcnIgPSBTdG9yZUltYWdlVG9CaXRNYXNrKGJ3LCB3aWR0aCwgaGlzdG9ncmFtX2JpdHMsIHJlZnNfYmVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpc3RvZ3JhbV9zeW1ib2xzLCBodWZmbWFuX2NvZGVzKTsKKyAgICAvLyBLZWVwIHRyYWNrIG9mIHRoZSBzbWFsbGVzdCBpbWFnZSBzbyBmYXIuCisgICAgaWYgKGx6NzdzX2lkeCA9PSAwIHx8CisgICAgICAgIFZQOExCaXRXcml0ZXJOdW1CeXRlcyhidykgPCBWUDhMQml0V3JpdGVyTnVtQnl0ZXMoJmJ3X2Jlc3QpKSB7CisgICAgICAqaGRyX3NpemUgPSBoZHJfc2l6ZV90bXA7CisgICAgICAqZGF0YV9zaXplID0KKyAgICAgICAgICAoaW50KShWUDhMQml0V3JpdGVyTnVtQnl0ZXMoYncpIC0gaW5pdF9ieXRlX3Bvc2l0aW9uIC0gKmhkcl9zaXplKTsKKyAgICAgIFZQOExCaXRXcml0ZXJTd2FwKGJ3LCAmYndfYmVzdCk7CisgICAgfQorICAgIC8vIFJlc2V0IHRoZSBiaXQgd3JpdGVyIGZvciB0aGUgZm9sbG93aW5nIGl0ZXJhdGlvbiBpZiBhbnkuCisgICAgaWYgKGNvbmZpZy0+bHo3N3NfdHlwZXNfdG9fdHJ5X3NpemVfID4gMSkgVlA4TEJpdFdyaXRlclJlc2V0KCZid19pbml0LCBidyk7CisgICAgV2ViUFNhZmVGcmVlKHRva2Vucyk7CisgICAgdG9rZW5zID0gTlVMTDsKKyAgICBpZiAoaHVmZm1hbl9jb2RlcyAhPSBOVUxMKSB7CisgICAgICBXZWJQU2FmZUZyZWUoaHVmZm1hbl9jb2Rlcy0+Y29kZXMpOworICAgICAgV2ViUFNhZmVGcmVlKGh1ZmZtYW5fY29kZXMpOworICAgICAgaHVmZm1hbl9jb2RlcyA9IE5VTEw7CisgICAgfQorICB9CisgIFZQOExCaXRXcml0ZXJTd2FwKGJ3LCAmYndfYmVzdCk7CisKKyBFcnJvcjoKKyAgV2ViUFNhZmVGcmVlKHRva2Vucyk7CisgIFdlYlBTYWZlRnJlZShodWZmX3RyZWUpOworICBWUDhMRnJlZUhpc3RvZ3JhbVNldChoaXN0b2dyYW1faW1hZ2UpOworICBWUDhMRnJlZUhpc3RvZ3JhbSh0bXBfaGlzdG8pOworICBpZiAoaHVmZm1hbl9jb2RlcyAhPSBOVUxMKSB7CisgICAgV2ViUFNhZmVGcmVlKGh1ZmZtYW5fY29kZXMtPmNvZGVzKTsKKyAgICBXZWJQU2FmZUZyZWUoaHVmZm1hbl9jb2Rlcyk7CisgIH0KKyAgV2ViUFNhZmVGcmVlKGhpc3RvZ3JhbV9zeW1ib2xzKTsKKyAgVlA4TEJpdFdyaXRlcldpcGVPdXQoJmJ3X2Jlc3QpOworICByZXR1cm4gZXJyOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVHJhbnNmb3JtcworCitzdGF0aWMgdm9pZCBBcHBseVN1YnRyYWN0R3JlZW4oVlA4TEVuY29kZXIqIGNvbnN0IGVuYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3KSB7CisgIFZQOExQdXRCaXRzKGJ3LCBUUkFOU0ZPUk1fUFJFU0VOVCwgMSk7CisgIFZQOExQdXRCaXRzKGJ3LCBTVUJUUkFDVF9HUkVFTiwgMik7CisgIFZQOExTdWJ0cmFjdEdyZWVuRnJvbUJsdWVBbmRSZWQoZW5jLT5hcmdiXywgd2lkdGggKiBoZWlnaHQpOworfQorCitzdGF0aWMgV2ViUEVuY29kaW5nRXJyb3IgQXBwbHlQcmVkaWN0RmlsdGVyKGNvbnN0IFZQOExFbmNvZGVyKiBjb25zdCBlbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHF1YWxpdHksIGludCBsb3dfZWZmb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXNlZF9zdWJ0cmFjdF9ncmVlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEJpdFdyaXRlciogY29uc3QgYncpIHsKKyAgY29uc3QgaW50IHByZWRfYml0cyA9IGVuYy0+dHJhbnNmb3JtX2JpdHNfOworICBjb25zdCBpbnQgdHJhbnNmb3JtX3dpZHRoID0gVlA4TFN1YlNhbXBsZVNpemUod2lkdGgsIHByZWRfYml0cyk7CisgIGNvbnN0IGludCB0cmFuc2Zvcm1faGVpZ2h0ID0gVlA4TFN1YlNhbXBsZVNpemUoaGVpZ2h0LCBwcmVkX2JpdHMpOworICAvLyB3ZSBkaXNhYmxlIG5lYXItbG9zc2xlc3MgcXVhbnRpemF0aW9uIGlmIHBhbGV0dGUgaXMgdXNlZC4KKyAgY29uc3QgaW50IG5lYXJfbG9zc2xlc3Nfc3RyZW5ndGggPSBlbmMtPnVzZV9wYWxldHRlXyA/IDEwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGVuYy0+Y29uZmlnXy0+bmVhcl9sb3NzbGVzczsKKworICBWUDhMUmVzaWR1YWxJbWFnZSh3aWR0aCwgaGVpZ2h0LCBwcmVkX2JpdHMsIGxvd19lZmZvcnQsIGVuYy0+YXJnYl8sCisgICAgICAgICAgICAgICAgICAgIGVuYy0+YXJnYl9zY3JhdGNoXywgZW5jLT50cmFuc2Zvcm1fZGF0YV8sCisgICAgICAgICAgICAgICAgICAgIG5lYXJfbG9zc2xlc3Nfc3RyZW5ndGgsIGVuYy0+Y29uZmlnXy0+ZXhhY3QsCisgICAgICAgICAgICAgICAgICAgIHVzZWRfc3VidHJhY3RfZ3JlZW4pOworICBWUDhMUHV0Qml0cyhidywgVFJBTlNGT1JNX1BSRVNFTlQsIDEpOworICBWUDhMUHV0Qml0cyhidywgUFJFRElDVE9SX1RSQU5TRk9STSwgMik7CisgIGFzc2VydChwcmVkX2JpdHMgPj0gMik7CisgIFZQOExQdXRCaXRzKGJ3LCBwcmVkX2JpdHMgLSAyLCAzKTsKKyAgcmV0dXJuIEVuY29kZUltYWdlTm9IdWZmbWFuKAorICAgICAgYncsIGVuYy0+dHJhbnNmb3JtX2RhdGFfLCAoVlA4TEhhc2hDaGFpbiopJmVuYy0+aGFzaF9jaGFpbl8sCisgICAgICAoVlA4TEJhY2t3YXJkUmVmcyopJmVuYy0+cmVmc19bMF0sICAvLyBjYXN0IGNvbnN0IGF3YXkKKyAgICAgIChWUDhMQmFja3dhcmRSZWZzKikmZW5jLT5yZWZzX1sxXSwgdHJhbnNmb3JtX3dpZHRoLCB0cmFuc2Zvcm1faGVpZ2h0LAorICAgICAgcXVhbGl0eSwgbG93X2VmZm9ydCk7Cit9CisKK3N0YXRpYyBXZWJQRW5jb2RpbmdFcnJvciBBcHBseUNyb3NzQ29sb3JGaWx0ZXIoY29uc3QgVlA4TEVuY29kZXIqIGNvbnN0IGVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcXVhbGl0eSwgaW50IGxvd19lZmZvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3KSB7CisgIGNvbnN0IGludCBjY29sb3JfdHJhbnNmb3JtX2JpdHMgPSBlbmMtPnRyYW5zZm9ybV9iaXRzXzsKKyAgY29uc3QgaW50IHRyYW5zZm9ybV93aWR0aCA9IFZQOExTdWJTYW1wbGVTaXplKHdpZHRoLCBjY29sb3JfdHJhbnNmb3JtX2JpdHMpOworICBjb25zdCBpbnQgdHJhbnNmb3JtX2hlaWdodCA9IFZQOExTdWJTYW1wbGVTaXplKGhlaWdodCwgY2NvbG9yX3RyYW5zZm9ybV9iaXRzKTsKKworICBWUDhMQ29sb3JTcGFjZVRyYW5zZm9ybSh3aWR0aCwgaGVpZ2h0LCBjY29sb3JfdHJhbnNmb3JtX2JpdHMsIHF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYy0+YXJnYl8sIGVuYy0+dHJhbnNmb3JtX2RhdGFfKTsKKyAgVlA4TFB1dEJpdHMoYncsIFRSQU5TRk9STV9QUkVTRU5ULCAxKTsKKyAgVlA4TFB1dEJpdHMoYncsIENST1NTX0NPTE9SX1RSQU5TRk9STSwgMik7CisgIGFzc2VydChjY29sb3JfdHJhbnNmb3JtX2JpdHMgPj0gMik7CisgIFZQOExQdXRCaXRzKGJ3LCBjY29sb3JfdHJhbnNmb3JtX2JpdHMgLSAyLCAzKTsKKyAgcmV0dXJuIEVuY29kZUltYWdlTm9IdWZmbWFuKAorICAgICAgYncsIGVuYy0+dHJhbnNmb3JtX2RhdGFfLCAoVlA4TEhhc2hDaGFpbiopJmVuYy0+aGFzaF9jaGFpbl8sCisgICAgICAoVlA4TEJhY2t3YXJkUmVmcyopJmVuYy0+cmVmc19bMF0sICAvLyBjYXN0IGNvbnN0IGF3YXkKKyAgICAgIChWUDhMQmFja3dhcmRSZWZzKikmZW5jLT5yZWZzX1sxXSwgdHJhbnNmb3JtX3dpZHRoLCB0cmFuc2Zvcm1faGVpZ2h0LAorICAgICAgcXVhbGl0eSwgbG93X2VmZm9ydCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBXZWJQRW5jb2RpbmdFcnJvciBXcml0ZVJpZmZIZWFkZXIoY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHJpZmZfc2l6ZSwgc2l6ZV90IHZwOGxfc2l6ZSkgeworICB1aW50OF90IHJpZmZbUklGRl9IRUFERVJfU0laRSArIENIVU5LX0hFQURFUl9TSVpFICsgVlA4TF9TSUdOQVRVUkVfU0laRV0gPSB7CisgICAgJ1InLCAnSScsICdGJywgJ0YnLCAwLCAwLCAwLCAwLCAnVycsICdFJywgJ0InLCAnUCcsCisgICAgJ1YnLCAnUCcsICc4JywgJ0wnLCAwLCAwLCAwLCAwLCBWUDhMX01BR0lDX0JZVEUsCisgIH07CisgIFB1dExFMzIocmlmZiArIFRBR19TSVpFLCAodWludDMyX3QpcmlmZl9zaXplKTsKKyAgUHV0TEUzMihyaWZmICsgUklGRl9IRUFERVJfU0laRSArIFRBR19TSVpFLCAodWludDMyX3QpdnA4bF9zaXplKTsKKyAgaWYgKCFwaWMtPndyaXRlcihyaWZmLCBzaXplb2YocmlmZiksIHBpYykpIHsKKyAgICByZXR1cm4gVlA4X0VOQ19FUlJPUl9CQURfV1JJVEU7CisgIH0KKyAgcmV0dXJuIFZQOF9FTkNfT0s7Cit9CisKK3N0YXRpYyBpbnQgV3JpdGVJbWFnZVNpemUoY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEJpdFdyaXRlciogY29uc3QgYncpIHsKKyAgY29uc3QgaW50IHdpZHRoID0gcGljLT53aWR0aCAtIDE7CisgIGNvbnN0IGludCBoZWlnaHQgPSBwaWMtPmhlaWdodCAtIDE7CisgIGFzc2VydCh3aWR0aCA8IFdFQlBfTUFYX0RJTUVOU0lPTiAmJiBoZWlnaHQgPCBXRUJQX01BWF9ESU1FTlNJT04pOworCisgIFZQOExQdXRCaXRzKGJ3LCB3aWR0aCwgVlA4TF9JTUFHRV9TSVpFX0JJVFMpOworICBWUDhMUHV0Qml0cyhidywgaGVpZ2h0LCBWUDhMX0lNQUdFX1NJWkVfQklUUyk7CisgIHJldHVybiAhYnctPmVycm9yXzsKK30KKworc3RhdGljIGludCBXcml0ZVJlYWxBbHBoYUFuZFZlcnNpb24oVlA4TEJpdFdyaXRlciogY29uc3QgYncsIGludCBoYXNfYWxwaGEpIHsKKyAgVlA4TFB1dEJpdHMoYncsIGhhc19hbHBoYSwgMSk7CisgIFZQOExQdXRCaXRzKGJ3LCBWUDhMX1ZFUlNJT04sIFZQOExfVkVSU0lPTl9CSVRTKTsKKyAgcmV0dXJuICFidy0+ZXJyb3JfOworfQorCitzdGF0aWMgV2ViUEVuY29kaW5nRXJyb3IgV3JpdGVJbWFnZShjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEJpdFdyaXRlciogY29uc3QgYncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIGNvbnN0IGNvZGVkX3NpemUpIHsKKyAgV2ViUEVuY29kaW5nRXJyb3IgZXJyID0gVlA4X0VOQ19PSzsKKyAgY29uc3QgdWludDhfdCogY29uc3Qgd2VicGxsX2RhdGEgPSBWUDhMQml0V3JpdGVyRmluaXNoKGJ3KTsKKyAgY29uc3Qgc2l6ZV90IHdlYnBsbF9zaXplID0gVlA4TEJpdFdyaXRlck51bUJ5dGVzKGJ3KTsKKyAgY29uc3Qgc2l6ZV90IHZwOGxfc2l6ZSA9IFZQOExfU0lHTkFUVVJFX1NJWkUgKyB3ZWJwbGxfc2l6ZTsKKyAgY29uc3Qgc2l6ZV90IHBhZCA9IHZwOGxfc2l6ZSAmIDE7CisgIGNvbnN0IHNpemVfdCByaWZmX3NpemUgPSBUQUdfU0laRSArIENIVU5LX0hFQURFUl9TSVpFICsgdnA4bF9zaXplICsgcGFkOworCisgIGVyciA9IFdyaXRlUmlmZkhlYWRlcihwaWMsIHJpZmZfc2l6ZSwgdnA4bF9zaXplKTsKKyAgaWYgKGVyciAhPSBWUDhfRU5DX09LKSBnb3RvIEVycm9yOworCisgIGlmICghcGljLT53cml0ZXIod2VicGxsX2RhdGEsIHdlYnBsbF9zaXplLCBwaWMpKSB7CisgICAgZXJyID0gVlA4X0VOQ19FUlJPUl9CQURfV1JJVEU7CisgICAgZ290byBFcnJvcjsKKyAgfQorCisgIGlmIChwYWQpIHsKKyAgICBjb25zdCB1aW50OF90IHBhZF9ieXRlWzFdID0geyAwIH07CisgICAgaWYgKCFwaWMtPndyaXRlcihwYWRfYnl0ZSwgMSwgcGljKSkgeworICAgICAgZXJyID0gVlA4X0VOQ19FUlJPUl9CQURfV1JJVEU7CisgICAgICBnb3RvIEVycm9yOworICAgIH0KKyAgfQorICAqY29kZWRfc2l6ZSA9IENIVU5LX0hFQURFUl9TSVpFICsgcmlmZl9zaXplOworICByZXR1cm4gVlA4X0VOQ19PSzsKKworIEVycm9yOgorICByZXR1cm4gZXJyOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBDbGVhclRyYW5zZm9ybUJ1ZmZlcihWUDhMRW5jb2RlciogY29uc3QgZW5jKSB7CisgIFdlYlBTYWZlRnJlZShlbmMtPnRyYW5zZm9ybV9tZW1fKTsKKyAgZW5jLT50cmFuc2Zvcm1fbWVtXyA9IE5VTEw7CisgIGVuYy0+dHJhbnNmb3JtX21lbV9zaXplXyA9IDA7Cit9CisKKy8vIEFsbG9jYXRlcyB0aGUgbWVtb3J5IGZvciBhcmdiIChXIHggSCkgYnVmZmVyLCAyIHJvd3Mgb2YgY29udGV4dCBmb3IKKy8vIHByZWRpY3Rpb24gYW5kIHRyYW5zZm9ybSBkYXRhLgorLy8gRmxhZ3MgaW5mbHVlbmNpbmcgdGhlIG1lbW9yeSBhbGxvY2F0ZWQ6CisvLyAgZW5jLT50cmFuc2Zvcm1fYml0c18KKy8vICBlbmMtPnVzZV9wcmVkaWN0XywgZW5jLT51c2VfY3Jvc3NfY29sb3JfCitzdGF0aWMgV2ViUEVuY29kaW5nRXJyb3IgQWxsb2NhdGVUcmFuc2Zvcm1CdWZmZXIoVlA4TEVuY29kZXIqIGNvbnN0IGVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgV2ViUEVuY29kaW5nRXJyb3IgZXJyID0gVlA4X0VOQ19PSzsKKyAgY29uc3QgdWludDY0X3QgaW1hZ2Vfc2l6ZSA9IHdpZHRoICogaGVpZ2h0OworICAvLyBWUDhMUmVzaWR1YWxJbWFnZSBuZWVkcyByb29tIGZvciAyIHNjYW5saW5lcyBvZiB1aW50MzIgcGl4ZWxzIHdpdGggYW4gZXh0cmEKKyAgLy8gcGl4ZWwgaW4gZWFjaCwgcGx1cyAyIHJlZ3VsYXIgc2NhbmxpbmVzIG9mIGJ5dGVzLgorICAvLyBUT0RPKHNrYWwpOiBDbGVhbiB1cCBieSB1c2luZyBhcml0aG1ldGljIGluIGJ5dGVzIGluc3RlYWQgb2Ygd29yZHMuCisgIGNvbnN0IHVpbnQ2NF90IGFyZ2Jfc2NyYXRjaF9zaXplID0KKyAgICAgIGVuYy0+dXNlX3ByZWRpY3RfCisgICAgICAgICAgPyAod2lkdGggKyAxKSAqIDIgKworICAgICAgICAgICAgKHdpZHRoICogMiArIHNpemVvZih1aW50MzJfdCkgLSAxKSAvIHNpemVvZih1aW50MzJfdCkKKyAgICAgICAgICA6IDA7CisgIGNvbnN0IHVpbnQ2NF90IHRyYW5zZm9ybV9kYXRhX3NpemUgPQorICAgICAgKGVuYy0+dXNlX3ByZWRpY3RfIHx8IGVuYy0+dXNlX2Nyb3NzX2NvbG9yXykKKyAgICAgICAgICA/IFZQOExTdWJTYW1wbGVTaXplKHdpZHRoLCBlbmMtPnRyYW5zZm9ybV9iaXRzXykgKgorICAgICAgICAgICAgICAgIFZQOExTdWJTYW1wbGVTaXplKGhlaWdodCwgZW5jLT50cmFuc2Zvcm1fYml0c18pCisgICAgICAgICAgOiAwOworICBjb25zdCB1aW50NjRfdCBtYXhfYWxpZ25tZW50X2luX3dvcmRzID0KKyAgICAgIChXRUJQX0FMSUdOX0NTVCArIHNpemVvZih1aW50MzJfdCkgLSAxKSAvIHNpemVvZih1aW50MzJfdCk7CisgIGNvbnN0IHVpbnQ2NF90IG1lbV9zaXplID0KKyAgICAgIGltYWdlX3NpemUgKyBtYXhfYWxpZ25tZW50X2luX3dvcmRzICsKKyAgICAgIGFyZ2Jfc2NyYXRjaF9zaXplICsgbWF4X2FsaWdubWVudF9pbl93b3JkcyArCisgICAgICB0cmFuc2Zvcm1fZGF0YV9zaXplOworICB1aW50MzJfdCogbWVtID0gZW5jLT50cmFuc2Zvcm1fbWVtXzsKKyAgaWYgKG1lbSA9PSBOVUxMIHx8IG1lbV9zaXplID4gZW5jLT50cmFuc2Zvcm1fbWVtX3NpemVfKSB7CisgICAgQ2xlYXJUcmFuc2Zvcm1CdWZmZXIoZW5jKTsKKyAgICBtZW0gPSAodWludDMyX3QqKVdlYlBTYWZlTWFsbG9jKG1lbV9zaXplLCBzaXplb2YoKm1lbSkpOworICAgIGlmIChtZW0gPT0gTlVMTCkgeworICAgICAgZXJyID0gVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZOworICAgICAgZ290byBFcnJvcjsKKyAgICB9CisgICAgZW5jLT50cmFuc2Zvcm1fbWVtXyA9IG1lbTsKKyAgICBlbmMtPnRyYW5zZm9ybV9tZW1fc2l6ZV8gPSAoc2l6ZV90KW1lbV9zaXplOworICAgIGVuYy0+YXJnYl9jb250ZW50XyA9IGtFbmNvZGVyTm9uZTsKKyAgfQorICBlbmMtPmFyZ2JfID0gbWVtOworICBtZW0gPSAodWludDMyX3QqKVdFQlBfQUxJR04obWVtICsgaW1hZ2Vfc2l6ZSk7CisgIGVuYy0+YXJnYl9zY3JhdGNoXyA9IG1lbTsKKyAgbWVtID0gKHVpbnQzMl90KilXRUJQX0FMSUdOKG1lbSArIGFyZ2Jfc2NyYXRjaF9zaXplKTsKKyAgZW5jLT50cmFuc2Zvcm1fZGF0YV8gPSBtZW07CisKKyAgZW5jLT5jdXJyZW50X3dpZHRoXyA9IHdpZHRoOworIEVycm9yOgorICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgV2ViUEVuY29kaW5nRXJyb3IgTWFrZUlucHV0SW1hZ2VDb3B5KFZQOExFbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgV2ViUEVuY29kaW5nRXJyb3IgZXJyID0gVlA4X0VOQ19PSzsKKyAgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUgPSBlbmMtPnBpY187CisgIGNvbnN0IGludCB3aWR0aCA9IHBpY3R1cmUtPndpZHRoOworICBjb25zdCBpbnQgaGVpZ2h0ID0gcGljdHVyZS0+aGVpZ2h0OworICBpbnQgeTsKKyAgZXJyID0gQWxsb2NhdGVUcmFuc2Zvcm1CdWZmZXIoZW5jLCB3aWR0aCwgaGVpZ2h0KTsKKyAgaWYgKGVyciAhPSBWUDhfRU5DX09LKSByZXR1cm4gZXJyOworICBpZiAoZW5jLT5hcmdiX2NvbnRlbnRfID09IGtFbmNvZGVyQVJHQikgcmV0dXJuIFZQOF9FTkNfT0s7CisgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgeworICAgIG1lbWNweShlbmMtPmFyZ2JfICsgeSAqIHdpZHRoLAorICAgICAgICAgICBwaWN0dXJlLT5hcmdiICsgeSAqIHBpY3R1cmUtPmFyZ2Jfc3RyaWRlLAorICAgICAgICAgICB3aWR0aCAqIHNpemVvZigqZW5jLT5hcmdiXykpOworICB9CisgIGVuYy0+YXJnYl9jb250ZW50XyA9IGtFbmNvZGVyQVJHQjsKKyAgYXNzZXJ0KGVuYy0+Y3VycmVudF93aWR0aF8gPT0gd2lkdGgpOworICByZXR1cm4gVlA4X0VOQ19PSzsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBTZWFyY2hDb2xvck5vSWR4KGNvbnN0IHVpbnQzMl90IHNvcnRlZFtdLCB1aW50MzJfdCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGkpIHsKKyAgaW50IGxvdyA9IDA7CisgIGlmIChzb3J0ZWRbbG93XSA9PSBjb2xvcikgcmV0dXJuIGxvdzsgIC8vIGxvb3AgaW52YXJpYW50OiBzb3J0ZWRbbG93XSAhPSBjb2xvcgorICB3aGlsZSAoMSkgeworICAgIGNvbnN0IGludCBtaWQgPSAobG93ICsgaGkpID4+IDE7CisgICAgaWYgKHNvcnRlZFttaWRdID09IGNvbG9yKSB7CisgICAgICByZXR1cm4gbWlkOworICAgIH0gZWxzZSBpZiAoc29ydGVkW21pZF0gPCBjb2xvcikgeworICAgICAgbG93ID0gbWlkOworICAgIH0gZWxzZSB7CisgICAgICBoaSA9IG1pZDsKKyAgICB9CisgIH0KK30KKworI2RlZmluZSBBUFBMWV9QQUxFVFRFX0dSRUVEWV9NQVggNAorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgU2VhcmNoQ29sb3JHcmVlZHkoY29uc3QgdWludDMyX3QgcGFsZXR0ZVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYWxldHRlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29sb3IpIHsKKyAgKHZvaWQpcGFsZXR0ZV9zaXplOworICBhc3NlcnQocGFsZXR0ZV9zaXplIDwgQVBQTFlfUEFMRVRURV9HUkVFRFlfTUFYKTsKKyAgYXNzZXJ0KDMgPT0gQVBQTFlfUEFMRVRURV9HUkVFRFlfTUFYIC0gMSk7CisgIGlmIChjb2xvciA9PSBwYWxldHRlWzBdKSByZXR1cm4gMDsKKyAgaWYgKGNvbG9yID09IHBhbGV0dGVbMV0pIHJldHVybiAxOworICBpZiAoY29sb3IgPT0gcGFsZXR0ZVsyXSkgcmV0dXJuIDI7CisgIHJldHVybiAzOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQXBwbHlQYWxldHRlSGFzaDAodWludDMyX3QgY29sb3IpIHsKKyAgLy8gRm9jdXMgb24gdGhlIGdyZWVuIGNvbG9yLgorICByZXR1cm4gKGNvbG9yID4+IDgpICYgMHhmZjsKK30KKworI2RlZmluZSBQQUxFVFRFX0lOVl9TSVpFX0JJVFMgMTEKKyNkZWZpbmUgUEFMRVRURV9JTlZfU0laRSAoMSA8PCBQQUxFVFRFX0lOVl9TSVpFX0JJVFMpCisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBBcHBseVBhbGV0dGVIYXNoMSh1aW50MzJfdCBjb2xvcikgeworICAvLyBGb3JnZXQgYWJvdXQgYWxwaGEuCisgIHJldHVybiAoKHVpbnQzMl90KSgoY29sb3IgJiAweDAwZmZmZmZmdSkgKiA0MjIyMjQ0MDcxdWxsKSkgPj4KKyAgICAgICAgICgzMiAtIFBBTEVUVEVfSU5WX1NJWkVfQklUUyk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBBcHBseVBhbGV0dGVIYXNoMih1aW50MzJfdCBjb2xvcikgeworICAvLyBGb3JnZXQgYWJvdXQgYWxwaGEuCisgIHJldHVybiAoKHVpbnQzMl90KSgoY29sb3IgJiAweDAwZmZmZmZmdSkgKiAoKDF1bGwgPDwgMzEpIC0gMSkpKSA+PgorICAgICAgICAgKDMyIC0gUEFMRVRURV9JTlZfU0laRV9CSVRTKTsKK30KKworLy8gU29ydCBwYWxldHRlIGluIGluY3JlYXNpbmcgb3JkZXIgYW5kIHByZXBhcmUgYW4gaW52ZXJzZSBtYXBwaW5nIGFycmF5Lgorc3RhdGljIHZvaWQgUHJlcGFyZU1hcFRvUGFsZXR0ZShjb25zdCB1aW50MzJfdCBwYWxldHRlW10sIGludCBudW1fY29sb3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzb3J0ZWRbXSwgdWludDMyX3QgaWR4X21hcFtdKSB7CisgIGludCBpOworICBtZW1jcHkoc29ydGVkLCBwYWxldHRlLCBudW1fY29sb3JzICogc2l6ZW9mKCpzb3J0ZWQpKTsKKyAgcXNvcnQoc29ydGVkLCBudW1fY29sb3JzLCBzaXplb2YoKnNvcnRlZCksIFBhbGV0dGVDb21wYXJlQ29sb3JzRm9yUXNvcnQpOworICBmb3IgKGkgPSAwOyBpIDwgbnVtX2NvbG9yczsgKytpKSB7CisgICAgaWR4X21hcFtTZWFyY2hDb2xvck5vSWR4KHNvcnRlZCwgcGFsZXR0ZVtpXSwgbnVtX2NvbG9ycyldID0gaTsKKyAgfQorfQorCisvLyBVc2UgMSBwaXhlbCBjYWNoZSBmb3IgQVJHQiBwaXhlbHMuCisjZGVmaW5lIEFQUExZX1BBTEVUVEVfRk9SKENPTE9SX0lOREVYKSBkbyB7ICAgICAgICAgXAorICB1aW50MzJfdCBwcmV2X3BpeCA9IHBhbGV0dGVbMF07ICAgICAgICAgICAgICAgICAgIFwKKyAgdWludDMyX3QgcHJldl9pZHggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgeyAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IHVpbnQzMl90IHBpeCA9IHNyY1t4XTsgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAocGl4ICE9IHByZXZfcGl4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwcmV2X2lkeCA9IENPTE9SX0lOREVYOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcHJldl9waXggPSBwaXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdG1wX3Jvd1t4XSA9IHByZXZfaWR4OyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVlA4TEJ1bmRsZUNvbG9yTWFwKHRtcF9yb3csIHdpZHRoLCB4Yml0cywgZHN0KTsgXAorICAgIHNyYyArPSBzcmNfc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3QgKz0gZHN0X3N0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworLy8gUmVtYXAgYXJnYiB2YWx1ZXMgaW4gc3JjW10gdG8gcGFja2VkIHBhbGV0dGVzIGVudHJpZXMgaW4gZHN0W10KKy8vIHVzaW5nICdyb3cnIGFzIGEgdGVtcG9yYXJ5IGJ1ZmZlciBvZiBzaXplICd3aWR0aCcuCisvLyBXZSBhc3N1bWUgdGhhdCBhbGwgc3JjW10gdmFsdWVzIGhhdmUgYSBjb3JyZXNwb25kaW5nIGVudHJ5IGluIHRoZSBwYWxldHRlLgorLy8gTm90ZTogc3JjW10gY2FuIGJlIHRoZSBzYW1lIGFzIGRzdFtdCitzdGF0aWMgV2ViUEVuY29kaW5nRXJyb3IgQXBwbHlQYWxldHRlKGNvbnN0IHVpbnQzMl90KiBzcmMsIHVpbnQzMl90IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkc3QsIHVpbnQzMl90IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBwYWxldHRlLCBpbnQgcGFsZXR0ZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCB4Yml0cykgeworICAvLyBUT0RPKHNrYWwpOiB0aGlzIHRtcCBidWZmZXIgaXMgbm90IG5lZWRlZCBpZiBWUDhMQnVuZGxlQ29sb3JNYXAoKSBjYW4gYmUKKyAgLy8gbWFkZSB0byB3b3JrIGluLXBsYWNlLgorICB1aW50OF90KiBjb25zdCB0bXBfcm93ID0gKHVpbnQ4X3QqKVdlYlBTYWZlTWFsbG9jKHdpZHRoLCBzaXplb2YoKnRtcF9yb3cpKTsKKyAgaW50IHgsIHk7CisKKyAgaWYgKHRtcF9yb3cgPT0gTlVMTCkgcmV0dXJuIFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWTsKKworICBpZiAocGFsZXR0ZV9zaXplIDwgQVBQTFlfUEFMRVRURV9HUkVFRFlfTUFYKSB7CisgICAgQVBQTFlfUEFMRVRURV9GT1IoU2VhcmNoQ29sb3JHcmVlZHkocGFsZXR0ZSwgcGFsZXR0ZV9zaXplLCBwaXgpKTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgaSwgajsKKyAgICB1aW50MTZfdCBidWZmZXJbUEFMRVRURV9JTlZfU0laRV07CisgICAgdWludDMyX3QgKCpjb25zdCBoYXNoX2Z1bmN0aW9uc1tdKSh1aW50MzJfdCkgPSB7CisgICAgICAgIEFwcGx5UGFsZXR0ZUhhc2gwLCBBcHBseVBhbGV0dGVIYXNoMSwgQXBwbHlQYWxldHRlSGFzaDIKKyAgICB9OworCisgICAgLy8gVHJ5IHRvIGZpbmQgYSBwZXJmZWN0IGhhc2ggZnVuY3Rpb24gYWJsZSB0byBnbyBmcm9tIGEgY29sb3IgdG8gYW4gaW5kZXgKKyAgICAvLyB3aXRoaW4gMSA8PCBQQUxFVFRFX0lOVl9TSVpFX0JJVFMgaW4gb3JkZXIgdG8gYnVpbGQgYSBoYXNoIG1hcCB0byBnbworICAgIC8vIGZyb20gY29sb3IgdG8gaW5kZXggaW4gcGFsZXR0ZS4KKyAgICBmb3IgKGkgPSAwOyBpIDwgMzsgKytpKSB7CisgICAgICBpbnQgdXNlX0xVVCA9IDE7CisgICAgICAvLyBTZXQgZWFjaCBlbGVtZW50IGluIGJ1ZmZlciB0byBtYXggdWludDE2X3QuCisgICAgICBtZW1zZXQoYnVmZmVyLCAweGZmLCBzaXplb2YoYnVmZmVyKSk7CisgICAgICBmb3IgKGogPSAwOyBqIDwgcGFsZXR0ZV9zaXplOyArK2opIHsKKyAgICAgICAgY29uc3QgdWludDMyX3QgaW5kID0gaGFzaF9mdW5jdGlvbnNbaV0ocGFsZXR0ZVtqXSk7CisgICAgICAgIGlmIChidWZmZXJbaW5kXSAhPSAweGZmZmZ1KSB7CisgICAgICAgICAgdXNlX0xVVCA9IDA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYnVmZmVyW2luZF0gPSBqOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAodXNlX0xVVCkgYnJlYWs7CisgICAgfQorCisgICAgaWYgKGkgPT0gMCkgeworICAgICAgQVBQTFlfUEFMRVRURV9GT1IoYnVmZmVyW0FwcGx5UGFsZXR0ZUhhc2gwKHBpeCldKTsKKyAgICB9IGVsc2UgaWYgKGkgPT0gMSkgeworICAgICAgQVBQTFlfUEFMRVRURV9GT1IoYnVmZmVyW0FwcGx5UGFsZXR0ZUhhc2gxKHBpeCldKTsKKyAgICB9IGVsc2UgaWYgKGkgPT0gMikgeworICAgICAgQVBQTFlfUEFMRVRURV9GT1IoYnVmZmVyW0FwcGx5UGFsZXR0ZUhhc2gyKHBpeCldKTsKKyAgICB9IGVsc2UgeworICAgICAgdWludDMyX3QgaWR4X21hcFtNQVhfUEFMRVRURV9TSVpFXTsKKyAgICAgIHVpbnQzMl90IHBhbGV0dGVfc29ydGVkW01BWF9QQUxFVFRFX1NJWkVdOworICAgICAgUHJlcGFyZU1hcFRvUGFsZXR0ZShwYWxldHRlLCBwYWxldHRlX3NpemUsIHBhbGV0dGVfc29ydGVkLCBpZHhfbWFwKTsKKyAgICAgIEFQUExZX1BBTEVUVEVfRk9SKAorICAgICAgICAgIGlkeF9tYXBbU2VhcmNoQ29sb3JOb0lkeChwYWxldHRlX3NvcnRlZCwgcGl4LCBwYWxldHRlX3NpemUpXSk7CisgICAgfQorICB9CisgIFdlYlBTYWZlRnJlZSh0bXBfcm93KTsKKyAgcmV0dXJuIFZQOF9FTkNfT0s7Cit9CisjdW5kZWYgQVBQTFlfUEFMRVRURV9GT1IKKyN1bmRlZiBQQUxFVFRFX0lOVl9TSVpFX0JJVFMKKyN1bmRlZiBQQUxFVFRFX0lOVl9TSVpFCisjdW5kZWYgQVBQTFlfUEFMRVRURV9HUkVFRFlfTUFYCisKKy8vIE5vdGU6IEV4cGVjdHMgImVuYy0+cGFsZXR0ZV8iIHRvIGJlIHNldCBwcm9wZXJseS4KK3N0YXRpYyBXZWJQRW5jb2RpbmdFcnJvciBNYXBJbWFnZUZyb21QYWxldHRlKFZQOExFbmNvZGVyKiBjb25zdCBlbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5fcGxhY2UpIHsKKyAgV2ViUEVuY29kaW5nRXJyb3IgZXJyID0gVlA4X0VOQ19PSzsKKyAgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYyA9IGVuYy0+cGljXzsKKyAgY29uc3QgaW50IHdpZHRoID0gcGljLT53aWR0aDsKKyAgY29uc3QgaW50IGhlaWdodCA9IHBpYy0+aGVpZ2h0OworICBjb25zdCB1aW50MzJfdCogY29uc3QgcGFsZXR0ZSA9IGVuYy0+cGFsZXR0ZV87CisgIGNvbnN0IHVpbnQzMl90KiBzcmMgPSBpbl9wbGFjZSA/IGVuYy0+YXJnYl8gOiBwaWMtPmFyZ2I7CisgIGNvbnN0IGludCBzcmNfc3RyaWRlID0gaW5fcGxhY2UgPyBlbmMtPmN1cnJlbnRfd2lkdGhfIDogcGljLT5hcmdiX3N0cmlkZTsKKyAgY29uc3QgaW50IHBhbGV0dGVfc2l6ZSA9IGVuYy0+cGFsZXR0ZV9zaXplXzsKKyAgaW50IHhiaXRzOworCisgIC8vIFJlcGxhY2UgZWFjaCBpbnB1dCBwaXhlbCBieSBjb3JyZXNwb25kaW5nIHBhbGV0dGUgaW5kZXguCisgIC8vIFRoaXMgaXMgZG9uZSBsaW5lIGJ5IGxpbmUuCisgIGlmIChwYWxldHRlX3NpemUgPD0gNCkgeworICAgIHhiaXRzID0gKHBhbGV0dGVfc2l6ZSA8PSAyKSA/IDMgOiAyOworICB9IGVsc2UgeworICAgIHhiaXRzID0gKHBhbGV0dGVfc2l6ZSA8PSAxNikgPyAxIDogMDsKKyAgfQorCisgIGVyciA9IEFsbG9jYXRlVHJhbnNmb3JtQnVmZmVyKGVuYywgVlA4TFN1YlNhbXBsZVNpemUod2lkdGgsIHhiaXRzKSwgaGVpZ2h0KTsKKyAgaWYgKGVyciAhPSBWUDhfRU5DX09LKSByZXR1cm4gZXJyOworCisgIGVyciA9IEFwcGx5UGFsZXR0ZShzcmMsIHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICBlbmMtPmFyZ2JfLCBlbmMtPmN1cnJlbnRfd2lkdGhfLAorICAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZSwgcGFsZXR0ZV9zaXplLCB3aWR0aCwgaGVpZ2h0LCB4Yml0cyk7CisgIGVuYy0+YXJnYl9jb250ZW50XyA9IGtFbmNvZGVyUGFsZXR0ZTsKKyAgcmV0dXJuIGVycjsKK30KKworLy8gU2F2ZSBwYWxldHRlX1tdIHRvIGJpdHN0cmVhbS4KK3N0YXRpYyBXZWJQRW5jb2RpbmdFcnJvciBFbmNvZGVQYWxldHRlKFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LCBpbnQgbG93X2VmZm9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExFbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgaW50IGk7CisgIHVpbnQzMl90IHRtcF9wYWxldHRlW01BWF9QQUxFVFRFX1NJWkVdOworICBjb25zdCBpbnQgcGFsZXR0ZV9zaXplID0gZW5jLT5wYWxldHRlX3NpemVfOworICBjb25zdCB1aW50MzJfdCogY29uc3QgcGFsZXR0ZSA9IGVuYy0+cGFsZXR0ZV87CisgIFZQOExQdXRCaXRzKGJ3LCBUUkFOU0ZPUk1fUFJFU0VOVCwgMSk7CisgIFZQOExQdXRCaXRzKGJ3LCBDT0xPUl9JTkRFWElOR19UUkFOU0ZPUk0sIDIpOworICBhc3NlcnQocGFsZXR0ZV9zaXplID49IDEgJiYgcGFsZXR0ZV9zaXplIDw9IE1BWF9QQUxFVFRFX1NJWkUpOworICBWUDhMUHV0Qml0cyhidywgcGFsZXR0ZV9zaXplIC0gMSwgOCk7CisgIGZvciAoaSA9IHBhbGV0dGVfc2l6ZSAtIDE7IGkgPj0gMTsgLS1pKSB7CisgICAgdG1wX3BhbGV0dGVbaV0gPSBWUDhMU3ViUGl4ZWxzKHBhbGV0dGVbaV0sIHBhbGV0dGVbaSAtIDFdKTsKKyAgfQorICB0bXBfcGFsZXR0ZVswXSA9IHBhbGV0dGVbMF07CisgIHJldHVybiBFbmNvZGVJbWFnZU5vSHVmZm1hbihidywgdG1wX3BhbGV0dGUsICZlbmMtPmhhc2hfY2hhaW5fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuYy0+cmVmc19bMF0sICZlbmMtPnJlZnNfWzFdLCBwYWxldHRlX3NpemUsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMCAvKiBxdWFsaXR5ICovLCBsb3dfZWZmb3J0KTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZQOExFbmNvZGVyCisKK3N0YXRpYyBWUDhMRW5jb2RlciogVlA4TEVuY29kZXJOZXcoY29uc3QgV2ViUENvbmZpZyogY29uc3QgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSkgeworICBWUDhMRW5jb2RlciogY29uc3QgZW5jID0gKFZQOExFbmNvZGVyKilXZWJQU2FmZUNhbGxvYygxVUxMLCBzaXplb2YoKmVuYykpOworICBpZiAoZW5jID09IE5VTEwpIHsKKyAgICBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWN0dXJlLCBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlkpOworICAgIHJldHVybiBOVUxMOworICB9CisgIGVuYy0+Y29uZmlnXyA9IGNvbmZpZzsKKyAgZW5jLT5waWNfID0gcGljdHVyZTsKKyAgZW5jLT5hcmdiX2NvbnRlbnRfID0ga0VuY29kZXJOb25lOworCisgIFZQOExFbmNEc3BJbml0KCk7CisKKyAgcmV0dXJuIGVuYzsKK30KKworc3RhdGljIHZvaWQgVlA4TEVuY29kZXJEZWxldGUoVlA4TEVuY29kZXIqIGVuYykgeworICBpZiAoZW5jICE9IE5VTEwpIHsKKyAgICBpbnQgaTsKKyAgICBWUDhMSGFzaENoYWluQ2xlYXIoJmVuYy0+aGFzaF9jaGFpbl8pOworICAgIGZvciAoaSA9IDA7IGkgPCAzOyArK2kpIFZQOExCYWNrd2FyZFJlZnNDbGVhcigmZW5jLT5yZWZzX1tpXSk7CisgICAgQ2xlYXJUcmFuc2Zvcm1CdWZmZXIoZW5jKTsKKyAgICBXZWJQU2FmZUZyZWUoZW5jKTsKKyAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWFpbiBjYWxsCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgY29uc3QgV2ViUENvbmZpZyogY29uZmlnXzsKKyAgY29uc3QgV2ViUFBpY3R1cmUqIHBpY3R1cmVfOworICBWUDhMQml0V3JpdGVyKiBid187CisgIFZQOExFbmNvZGVyKiBlbmNfOworICBpbnQgdXNlX2NhY2hlXzsKKyAgQ3J1bmNoQ29uZmlnIGNydW5jaF9jb25maWdzX1tDUlVOQ0hfQ09ORklHU19NQVhdOworICBpbnQgbnVtX2NydW5jaF9jb25maWdzXzsKKyAgaW50IHJlZF9hbmRfYmx1ZV9hbHdheXNfemVyb187CisgIFdlYlBFbmNvZGluZ0Vycm9yIGVycl87CisgIFdlYlBBdXhTdGF0cyogc3RhdHNfOworfSBTdHJlYW1FbmNvZGVDb250ZXh0OworCitzdGF0aWMgaW50IEVuY29kZVN0cmVhbUhvb2sodm9pZCogaW5wdXQsIHZvaWQqIGRhdGEyKSB7CisgIFN0cmVhbUVuY29kZUNvbnRleHQqIGNvbnN0IHBhcmFtcyA9IChTdHJlYW1FbmNvZGVDb250ZXh0KilpbnB1dDsKKyAgY29uc3QgV2ViUENvbmZpZyogY29uc3QgY29uZmlnID0gcGFyYW1zLT5jb25maWdfOworICBjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSA9IHBhcmFtcy0+cGljdHVyZV87CisgIFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3ID0gcGFyYW1zLT5id187CisgIFZQOExFbmNvZGVyKiBjb25zdCBlbmMgPSBwYXJhbXMtPmVuY187CisgIGNvbnN0IGludCB1c2VfY2FjaGUgPSBwYXJhbXMtPnVzZV9jYWNoZV87CisgIGNvbnN0IENydW5jaENvbmZpZyogY29uc3QgY3J1bmNoX2NvbmZpZ3MgPSBwYXJhbXMtPmNydW5jaF9jb25maWdzXzsKKyAgY29uc3QgaW50IG51bV9jcnVuY2hfY29uZmlncyA9IHBhcmFtcy0+bnVtX2NydW5jaF9jb25maWdzXzsKKyAgY29uc3QgaW50IHJlZF9hbmRfYmx1ZV9hbHdheXNfemVybyA9IHBhcmFtcy0+cmVkX2FuZF9ibHVlX2Fsd2F5c196ZXJvXzsKKyNpZiAhZGVmaW5lZChXRUJQX0RJU0FCTEVfU1RBVFMpCisgIFdlYlBBdXhTdGF0cyogY29uc3Qgc3RhdHMgPSBwYXJhbXMtPnN0YXRzXzsKKyNlbmRpZgorICBXZWJQRW5jb2RpbmdFcnJvciBlcnIgPSBWUDhfRU5DX09LOworICBjb25zdCBpbnQgcXVhbGl0eSA9IChpbnQpY29uZmlnLT5xdWFsaXR5OworICBjb25zdCBpbnQgbG93X2VmZm9ydCA9IChjb25maWctPm1ldGhvZCA9PSAwKTsKKyNpZiAoV0VCUF9ORUFSX0xPU1NMRVNTID09IDEpCisgIGNvbnN0IGludCB3aWR0aCA9IHBpY3R1cmUtPndpZHRoOworI2VuZGlmCisgIGNvbnN0IGludCBoZWlnaHQgPSBwaWN0dXJlLT5oZWlnaHQ7CisgIGNvbnN0IHNpemVfdCBieXRlX3Bvc2l0aW9uID0gVlA4TEJpdFdyaXRlck51bUJ5dGVzKGJ3KTsKKyNpZiAoV0VCUF9ORUFSX0xPU1NMRVNTID09IDEpCisgIGludCB1c2VfbmVhcl9sb3NzbGVzcyA9IDA7CisjZW5kaWYKKyAgaW50IGhkcl9zaXplID0gMDsKKyAgaW50IGRhdGFfc2l6ZSA9IDA7CisgIGludCB1c2VfZGVsdGFfcGFsZXR0ZSA9IDA7CisgIGludCBpZHg7CisgIHNpemVfdCBiZXN0X3NpemUgPSAwOworICBWUDhMQml0V3JpdGVyIGJ3X2luaXQgPSAqYncsIGJ3X2Jlc3Q7CisgICh2b2lkKWRhdGEyOworCisgIGlmICghVlA4TEJpdFdyaXRlckluaXQoJmJ3X2Jlc3QsIDApIHx8CisgICAgICAobnVtX2NydW5jaF9jb25maWdzID4gMSAmJiAhVlA4TEJpdFdyaXRlckNsb25lKGJ3LCAmYndfYmVzdCkpKSB7CisgICAgZXJyID0gVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZOworICAgIGdvdG8gRXJyb3I7CisgIH0KKworICBmb3IgKGlkeCA9IDA7IGlkeCA8IG51bV9jcnVuY2hfY29uZmlnczsgKytpZHgpIHsKKyAgICBjb25zdCBpbnQgZW50cm9weV9pZHggPSBjcnVuY2hfY29uZmlnc1tpZHhdLmVudHJvcHlfaWR4XzsKKyAgICBlbmMtPnVzZV9wYWxldHRlXyA9IChlbnRyb3B5X2lkeCA9PSBrUGFsZXR0ZSk7CisgICAgZW5jLT51c2Vfc3VidHJhY3RfZ3JlZW5fID0KKyAgICAgICAgKGVudHJvcHlfaWR4ID09IGtTdWJHcmVlbikgfHwgKGVudHJvcHlfaWR4ID09IGtTcGF0aWFsU3ViR3JlZW4pOworICAgIGVuYy0+dXNlX3ByZWRpY3RfID0KKyAgICAgICAgKGVudHJvcHlfaWR4ID09IGtTcGF0aWFsKSB8fCAoZW50cm9weV9pZHggPT0ga1NwYXRpYWxTdWJHcmVlbik7CisgICAgaWYgKGxvd19lZmZvcnQpIHsKKyAgICAgIGVuYy0+dXNlX2Nyb3NzX2NvbG9yXyA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIGVuYy0+dXNlX2Nyb3NzX2NvbG9yXyA9IHJlZF9hbmRfYmx1ZV9hbHdheXNfemVybyA/IDAgOiBlbmMtPnVzZV9wcmVkaWN0XzsKKyAgICB9CisgICAgLy8gUmVzZXQgYW55IHBhcmFtZXRlciBpbiB0aGUgZW5jb2RlciB0aGF0IGlzIHNldCBpbiB0aGUgcHJldmlvdXMgaXRlcmF0aW9uLgorICAgIGVuYy0+Y2FjaGVfYml0c18gPSAwOworICAgIFZQOExCYWNrd2FyZFJlZnNDbGVhcigmZW5jLT5yZWZzX1swXSk7CisgICAgVlA4TEJhY2t3YXJkUmVmc0NsZWFyKCZlbmMtPnJlZnNfWzFdKTsKKworI2lmIChXRUJQX05FQVJfTE9TU0xFU1MgPT0gMSkKKyAgICAvLyBBcHBseSBuZWFyLWxvc3NsZXNzIHByZXByb2Nlc3NpbmcuCisgICAgdXNlX25lYXJfbG9zc2xlc3MgPSAoY29uZmlnLT5uZWFyX2xvc3NsZXNzIDwgMTAwKSAmJiAhZW5jLT51c2VfcGFsZXR0ZV8gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICFlbmMtPnVzZV9wcmVkaWN0XzsKKyAgICBpZiAodXNlX25lYXJfbG9zc2xlc3MpIHsKKyAgICAgIGVyciA9IEFsbG9jYXRlVHJhbnNmb3JtQnVmZmVyKGVuYywgd2lkdGgsIGhlaWdodCk7CisgICAgICBpZiAoZXJyICE9IFZQOF9FTkNfT0spIGdvdG8gRXJyb3I7CisgICAgICBpZiAoKGVuYy0+YXJnYl9jb250ZW50XyAhPSBrRW5jb2Rlck5lYXJMb3NzbGVzcykgJiYKKyAgICAgICAgICAhVlA4QXBwbHlOZWFyTG9zc2xlc3MocGljdHVyZSwgY29uZmlnLT5uZWFyX2xvc3NsZXNzLCBlbmMtPmFyZ2JfKSkgeworICAgICAgICBlcnIgPSBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlk7CisgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICB9CisgICAgICBlbmMtPmFyZ2JfY29udGVudF8gPSBrRW5jb2Rlck5lYXJMb3NzbGVzczsKKyAgICB9IGVsc2UgeworICAgICAgZW5jLT5hcmdiX2NvbnRlbnRfID0ga0VuY29kZXJOb25lOworICAgIH0KKyNlbHNlCisgICAgZW5jLT5hcmdiX2NvbnRlbnRfID0ga0VuY29kZXJOb25lOworI2VuZGlmCisKKyAgICAvLyBFbmNvZGUgcGFsZXR0ZQorICAgIGlmIChlbmMtPnVzZV9wYWxldHRlXykgeworICAgICAgZXJyID0gRW5jb2RlUGFsZXR0ZShidywgbG93X2VmZm9ydCwgZW5jKTsKKyAgICAgIGlmIChlcnIgIT0gVlA4X0VOQ19PSykgZ290byBFcnJvcjsKKyAgICAgIGVyciA9IE1hcEltYWdlRnJvbVBhbGV0dGUoZW5jLCB1c2VfZGVsdGFfcGFsZXR0ZSk7CisgICAgICBpZiAoZXJyICE9IFZQOF9FTkNfT0spIGdvdG8gRXJyb3I7CisgICAgICAvLyBJZiB1c2luZyBhIGNvbG9yIGNhY2hlLCBkbyBub3QgaGF2ZSBpdCBiaWdnZXIgdGhhbiB0aGUgbnVtYmVyIG9mCisgICAgICAvLyBjb2xvcnMuCisgICAgICBpZiAodXNlX2NhY2hlICYmIGVuYy0+cGFsZXR0ZV9zaXplXyA8ICgxIDw8IE1BWF9DT0xPUl9DQUNIRV9CSVRTKSkgeworICAgICAgICBlbmMtPmNhY2hlX2JpdHNfID0gQml0c0xvZzJGbG9vcihlbmMtPnBhbGV0dGVfc2l6ZV8pICsgMTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCF1c2VfZGVsdGFfcGFsZXR0ZSkgeworICAgICAgLy8gSW4gY2FzZSBpbWFnZSBpcyBub3QgcGFja2VkLgorICAgICAgaWYgKGVuYy0+YXJnYl9jb250ZW50XyAhPSBrRW5jb2Rlck5lYXJMb3NzbGVzcyAmJgorICAgICAgICAgIGVuYy0+YXJnYl9jb250ZW50XyAhPSBrRW5jb2RlclBhbGV0dGUpIHsKKyAgICAgICAgZXJyID0gTWFrZUlucHV0SW1hZ2VDb3B5KGVuYyk7CisgICAgICAgIGlmIChlcnIgIT0gVlA4X0VOQ19PSykgZ290byBFcnJvcjsKKyAgICAgIH0KKworICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIC8vIEFwcGx5IHRyYW5zZm9ybXMgYW5kIHdyaXRlIHRyYW5zZm9ybSBkYXRhLgorCisgICAgICBpZiAoZW5jLT51c2Vfc3VidHJhY3RfZ3JlZW5fKSB7CisgICAgICAgIEFwcGx5U3VidHJhY3RHcmVlbihlbmMsIGVuYy0+Y3VycmVudF93aWR0aF8sIGhlaWdodCwgYncpOworICAgICAgfQorCisgICAgICBpZiAoZW5jLT51c2VfcHJlZGljdF8pIHsKKyAgICAgICAgZXJyID0gQXBwbHlQcmVkaWN0RmlsdGVyKGVuYywgZW5jLT5jdXJyZW50X3dpZHRoXywgaGVpZ2h0LCBxdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93X2VmZm9ydCwgZW5jLT51c2Vfc3VidHJhY3RfZ3JlZW5fLCBidyk7CisgICAgICAgIGlmIChlcnIgIT0gVlA4X0VOQ19PSykgZ290byBFcnJvcjsKKyAgICAgIH0KKworICAgICAgaWYgKGVuYy0+dXNlX2Nyb3NzX2NvbG9yXykgeworICAgICAgICBlcnIgPSBBcHBseUNyb3NzQ29sb3JGaWx0ZXIoZW5jLCBlbmMtPmN1cnJlbnRfd2lkdGhfLCBoZWlnaHQsIHF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dfZWZmb3J0LCBidyk7CisgICAgICAgIGlmIChlcnIgIT0gVlA4X0VOQ19PSykgZ290byBFcnJvcjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBWUDhMUHV0Qml0cyhidywgIVRSQU5TRk9STV9QUkVTRU5ULCAxKTsgIC8vIE5vIG1vcmUgdHJhbnNmb3Jtcy4KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBFbmNvZGUgYW5kIHdyaXRlIHRoZSB0cmFuc2Zvcm1lZCBpbWFnZS4KKyAgICBlcnIgPSBFbmNvZGVJbWFnZUludGVybmFsKGJ3LCBlbmMtPmFyZ2JfLCAmZW5jLT5oYXNoX2NoYWluXywgZW5jLT5yZWZzXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYy0+Y3VycmVudF93aWR0aF8sIGhlaWdodCwgcXVhbGl0eSwgbG93X2VmZm9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZV9jYWNoZSwgJmNydW5jaF9jb25maWdzW2lkeF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jLT5jYWNoZV9iaXRzXywgZW5jLT5oaXN0b19iaXRzXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfcG9zaXRpb24sICZoZHJfc2l6ZSwgJmRhdGFfc2l6ZSk7CisgICAgaWYgKGVyciAhPSBWUDhfRU5DX09LKSBnb3RvIEVycm9yOworCisgICAgLy8gSWYgd2UgYXJlIGJldHRlciB0aGFuIHdoYXQgd2UgYWxyZWFkeSBoYXZlLgorICAgIGlmIChpZHggPT0gMCB8fCBWUDhMQml0V3JpdGVyTnVtQnl0ZXMoYncpIDwgYmVzdF9zaXplKSB7CisgICAgICBiZXN0X3NpemUgPSBWUDhMQml0V3JpdGVyTnVtQnl0ZXMoYncpOworICAgICAgLy8gU3RvcmUgdGhlIEJpdFdyaXRlci4KKyAgICAgIFZQOExCaXRXcml0ZXJTd2FwKGJ3LCAmYndfYmVzdCk7CisjaWYgIWRlZmluZWQoV0VCUF9ESVNBQkxFX1NUQVRTKQorICAgICAgLy8gVXBkYXRlIHRoZSBzdGF0cy4KKyAgICAgIGlmIChzdGF0cyAhPSBOVUxMKSB7CisgICAgICAgIHN0YXRzLT5sb3NzbGVzc19mZWF0dXJlcyA9IDA7CisgICAgICAgIGlmIChlbmMtPnVzZV9wcmVkaWN0Xykgc3RhdHMtPmxvc3NsZXNzX2ZlYXR1cmVzIHw9IDE7CisgICAgICAgIGlmIChlbmMtPnVzZV9jcm9zc19jb2xvcl8pIHN0YXRzLT5sb3NzbGVzc19mZWF0dXJlcyB8PSAyOworICAgICAgICBpZiAoZW5jLT51c2Vfc3VidHJhY3RfZ3JlZW5fKSBzdGF0cy0+bG9zc2xlc3NfZmVhdHVyZXMgfD0gNDsKKyAgICAgICAgaWYgKGVuYy0+dXNlX3BhbGV0dGVfKSBzdGF0cy0+bG9zc2xlc3NfZmVhdHVyZXMgfD0gODsKKyAgICAgICAgc3RhdHMtPmhpc3RvZ3JhbV9iaXRzID0gZW5jLT5oaXN0b19iaXRzXzsKKyAgICAgICAgc3RhdHMtPnRyYW5zZm9ybV9iaXRzID0gZW5jLT50cmFuc2Zvcm1fYml0c187CisgICAgICAgIHN0YXRzLT5jYWNoZV9iaXRzID0gZW5jLT5jYWNoZV9iaXRzXzsKKyAgICAgICAgc3RhdHMtPnBhbGV0dGVfc2l6ZSA9IGVuYy0+cGFsZXR0ZV9zaXplXzsKKyAgICAgICAgc3RhdHMtPmxvc3NsZXNzX3NpemUgPSAoaW50KShiZXN0X3NpemUgLSBieXRlX3Bvc2l0aW9uKTsKKyAgICAgICAgc3RhdHMtPmxvc3NsZXNzX2hkcl9zaXplID0gaGRyX3NpemU7CisgICAgICAgIHN0YXRzLT5sb3NzbGVzc19kYXRhX3NpemUgPSBkYXRhX3NpemU7CisgICAgICB9CisjZW5kaWYKKyAgICB9CisgICAgLy8gUmVzZXQgdGhlIGJpdCB3cml0ZXIgZm9yIHRoZSBmb2xsb3dpbmcgaXRlcmF0aW9uIGlmIGFueS4KKyAgICBpZiAobnVtX2NydW5jaF9jb25maWdzID4gMSkgVlA4TEJpdFdyaXRlclJlc2V0KCZid19pbml0LCBidyk7CisgIH0KKyAgVlA4TEJpdFdyaXRlclN3YXAoJmJ3X2Jlc3QsIGJ3KTsKKworRXJyb3I6CisgIFZQOExCaXRXcml0ZXJXaXBlT3V0KCZid19iZXN0KTsKKyAgcGFyYW1zLT5lcnJfID0gZXJyOworICAvLyBUaGUgaG9vayBzaG91bGQgcmV0dXJuIGZhbHNlIGluIGNhc2Ugb2YgZXJyb3IuCisgIHJldHVybiAoZXJyID09IFZQOF9FTkNfT0spOworfQorCitXZWJQRW5jb2RpbmdFcnJvciBWUDhMRW5jb2RlU3RyZWFtKGNvbnN0IFdlYlBDb25maWcqIGNvbnN0IGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3X21haW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1c2VfY2FjaGUpIHsKKyAgV2ViUEVuY29kaW5nRXJyb3IgZXJyID0gVlA4X0VOQ19PSzsKKyAgVlA4TEVuY29kZXIqIGNvbnN0IGVuY19tYWluID0gVlA4TEVuY29kZXJOZXcoY29uZmlnLCBwaWN0dXJlKTsKKyAgVlA4TEVuY29kZXIqIGVuY19zaWRlID0gTlVMTDsKKyAgQ3J1bmNoQ29uZmlnIGNydW5jaF9jb25maWdzW0NSVU5DSF9DT05GSUdTX01BWF07CisgIGludCBudW1fY3J1bmNoX2NvbmZpZ3NfbWFpbiwgbnVtX2NydW5jaF9jb25maWdzX3NpZGUgPSAwOworICBpbnQgaWR4OworICBpbnQgcmVkX2FuZF9ibHVlX2Fsd2F5c196ZXJvID0gMDsKKyAgV2ViUFdvcmtlciB3b3JrZXJfbWFpbiwgd29ya2VyX3NpZGU7CisgIFN0cmVhbUVuY29kZUNvbnRleHQgcGFyYW1zX21haW4sIHBhcmFtc19zaWRlOworICAvLyBUaGUgbWFpbiB0aHJlYWQgdXNlcyBwaWN0dXJlLT5zdGF0cywgdGhlIHNpZGUgdGhyZWFkIHVzZXMgc3RhdHNfc2lkZS4KKyAgV2ViUEF1eFN0YXRzIHN0YXRzX3NpZGU7CisgIFZQOExCaXRXcml0ZXIgYndfc2lkZTsKKyAgY29uc3QgV2ViUFdvcmtlckludGVyZmFjZSogY29uc3Qgd29ya2VyX2ludGVyZmFjZSA9IFdlYlBHZXRXb3JrZXJJbnRlcmZhY2UoKTsKKyAgaW50IG9rX21haW47CisKKyAgLy8gQW5hbHl6ZSBpbWFnZSAoZW50cm9weSwgbnVtX3BhbGV0dGVzIGV0YykKKyAgaWYgKGVuY19tYWluID09IE5VTEwgfHwKKyAgICAgICFFbmNvZGVyQW5hbHl6ZShlbmNfbWFpbiwgY3J1bmNoX2NvbmZpZ3MsICZudW1fY3J1bmNoX2NvbmZpZ3NfbWFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAmcmVkX2FuZF9ibHVlX2Fsd2F5c196ZXJvKSB8fAorICAgICAgIUVuY29kZXJJbml0KGVuY19tYWluKSB8fCAhVlA4TEJpdFdyaXRlckluaXQoJmJ3X3NpZGUsIDApKSB7CisgICAgZXJyID0gVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZOworICAgIGdvdG8gRXJyb3I7CisgIH0KKworICAvLyBTcGxpdCB0aGUgY29uZmlncyBiZXR3ZWVuIHRoZSBtYWluIGFuZCBzaWRlIHRocmVhZHMgKGlmIGFueSkuCisgIGlmIChjb25maWctPnRocmVhZF9sZXZlbCA+IDApIHsKKyAgICBudW1fY3J1bmNoX2NvbmZpZ3Nfc2lkZSA9IG51bV9jcnVuY2hfY29uZmlnc19tYWluIC8gMjsKKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IG51bV9jcnVuY2hfY29uZmlnc19zaWRlOyArK2lkeCkgeworICAgICAgcGFyYW1zX3NpZGUuY3J1bmNoX2NvbmZpZ3NfW2lkeF0gPQorICAgICAgICAgIGNydW5jaF9jb25maWdzW251bV9jcnVuY2hfY29uZmlnc19tYWluIC0gbnVtX2NydW5jaF9jb25maWdzX3NpZGUgKworICAgICAgICAgICAgICAgICAgICAgICAgIGlkeF07CisgICAgfQorICAgIHBhcmFtc19zaWRlLm51bV9jcnVuY2hfY29uZmlnc18gPSBudW1fY3J1bmNoX2NvbmZpZ3Nfc2lkZTsKKyAgfQorICBudW1fY3J1bmNoX2NvbmZpZ3NfbWFpbiAtPSBudW1fY3J1bmNoX2NvbmZpZ3Nfc2lkZTsKKyAgZm9yIChpZHggPSAwOyBpZHggPCBudW1fY3J1bmNoX2NvbmZpZ3NfbWFpbjsgKytpZHgpIHsKKyAgICBwYXJhbXNfbWFpbi5jcnVuY2hfY29uZmlnc19baWR4XSA9IGNydW5jaF9jb25maWdzW2lkeF07CisgIH0KKyAgcGFyYW1zX21haW4ubnVtX2NydW5jaF9jb25maWdzXyA9IG51bV9jcnVuY2hfY29uZmlnc19tYWluOworCisgIC8vIEZpbGwgaW4gdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSB0aHJlYWQgd29ya2Vycy4KKyAgeworICAgIGNvbnN0IGludCBwYXJhbXNfc2l6ZSA9IChudW1fY3J1bmNoX2NvbmZpZ3Nfc2lkZSA+IDApID8gMiA6IDE7CisgICAgZm9yIChpZHggPSAwOyBpZHggPCBwYXJhbXNfc2l6ZTsgKytpZHgpIHsKKyAgICAgIC8vIENyZWF0ZSB0aGUgcGFyYW1ldGVycyBmb3IgZWFjaCB3b3JrZXIuCisgICAgICBXZWJQV29ya2VyKiBjb25zdCB3b3JrZXIgPSAoaWR4ID09IDApID8gJndvcmtlcl9tYWluIDogJndvcmtlcl9zaWRlOworICAgICAgU3RyZWFtRW5jb2RlQ29udGV4dCogY29uc3QgcGFyYW0gPQorICAgICAgICAgIChpZHggPT0gMCkgPyAmcGFyYW1zX21haW4gOiAmcGFyYW1zX3NpZGU7CisgICAgICBwYXJhbS0+Y29uZmlnXyA9IGNvbmZpZzsKKyAgICAgIHBhcmFtLT5waWN0dXJlXyA9IHBpY3R1cmU7CisgICAgICBwYXJhbS0+dXNlX2NhY2hlXyA9IHVzZV9jYWNoZTsKKyAgICAgIHBhcmFtLT5yZWRfYW5kX2JsdWVfYWx3YXlzX3plcm9fID0gcmVkX2FuZF9ibHVlX2Fsd2F5c196ZXJvOworICAgICAgaWYgKGlkeCA9PSAwKSB7CisgICAgICAgIHBhcmFtLT5zdGF0c18gPSBwaWN0dXJlLT5zdGF0czsKKyAgICAgICAgcGFyYW0tPmJ3XyA9IGJ3X21haW47CisgICAgICAgIHBhcmFtLT5lbmNfID0gZW5jX21haW47CisgICAgICB9IGVsc2UgeworICAgICAgICBwYXJhbS0+c3RhdHNfID0gKHBpY3R1cmUtPnN0YXRzID09IE5VTEwpID8gTlVMTCA6ICZzdGF0c19zaWRlOworICAgICAgICAvLyBDcmVhdGUgYSBzaWRlIGJpdCB3cml0ZXIuCisgICAgICAgIGlmICghVlA4TEJpdFdyaXRlckNsb25lKGJ3X21haW4sICZid19zaWRlKSkgeworICAgICAgICAgIGVyciA9IFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWTsKKyAgICAgICAgICBnb3RvIEVycm9yOworICAgICAgICB9CisgICAgICAgIHBhcmFtLT5id18gPSAmYndfc2lkZTsKKyAgICAgICAgLy8gQ3JlYXRlIGEgc2lkZSBlbmNvZGVyLgorICAgICAgICBlbmNfc2lkZSA9IFZQOExFbmNvZGVyTmV3KGNvbmZpZywgcGljdHVyZSk7CisgICAgICAgIGlmIChlbmNfc2lkZSA9PSBOVUxMIHx8ICFFbmNvZGVySW5pdChlbmNfc2lkZSkpIHsKKyAgICAgICAgICBlcnIgPSBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlk7CisgICAgICAgICAgZ290byBFcnJvcjsKKyAgICAgICAgfQorICAgICAgICAvLyBDb3B5IHRoZSB2YWx1ZXMgdGhhdCB3ZXJlIGNvbXB1dGVkIGZvciB0aGUgbWFpbiBlbmNvZGVyLgorICAgICAgICBlbmNfc2lkZS0+aGlzdG9fYml0c18gPSBlbmNfbWFpbi0+aGlzdG9fYml0c187CisgICAgICAgIGVuY19zaWRlLT50cmFuc2Zvcm1fYml0c18gPSBlbmNfbWFpbi0+dHJhbnNmb3JtX2JpdHNfOworICAgICAgICBlbmNfc2lkZS0+cGFsZXR0ZV9zaXplXyA9IGVuY19tYWluLT5wYWxldHRlX3NpemVfOworICAgICAgICBtZW1jcHkoZW5jX3NpZGUtPnBhbGV0dGVfLCBlbmNfbWFpbi0+cGFsZXR0ZV8sCisgICAgICAgICAgICAgICBzaXplb2YoZW5jX21haW4tPnBhbGV0dGVfKSk7CisgICAgICAgIHBhcmFtLT5lbmNfID0gZW5jX3NpZGU7CisgICAgICB9CisgICAgICAvLyBDcmVhdGUgdGhlIHdvcmtlcnMuCisgICAgICB3b3JrZXJfaW50ZXJmYWNlLT5Jbml0KHdvcmtlcik7CisgICAgICB3b3JrZXItPmRhdGExID0gcGFyYW07CisgICAgICB3b3JrZXItPmRhdGEyID0gTlVMTDsKKyAgICAgIHdvcmtlci0+aG9vayA9IEVuY29kZVN0cmVhbUhvb2s7CisgICAgfQorICB9CisKKyAgLy8gU3RhcnQgdGhlIHNlY29uZCB0aHJlYWQgaWYgbmVlZGVkLgorICBpZiAobnVtX2NydW5jaF9jb25maWdzX3NpZGUgIT0gMCkgeworICAgIGlmICghd29ya2VyX2ludGVyZmFjZS0+UmVzZXQoJndvcmtlcl9zaWRlKSkgeworICAgICAgZXJyID0gVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZOworICAgICAgZ290byBFcnJvcjsKKyAgICB9CisjaWYgIWRlZmluZWQoV0VCUF9ESVNBQkxFX1NUQVRTKQorICAgIC8vIFRoaXMgbGluZSBpcyBoZXJlIGFuZCBub3QgaW4gdGhlIHBhcmFtIGluaXRpYWxpemF0aW9uIGFib3ZlIHRvIHJlbW92ZSBhCisgICAgLy8gQ2xhbmcgc3RhdGljIGFuYWx5emVyIHdhcm5pbmcuCisgICAgaWYgKHBpY3R1cmUtPnN0YXRzICE9IE5VTEwpIHsKKyAgICAgIG1lbWNweSgmc3RhdHNfc2lkZSwgcGljdHVyZS0+c3RhdHMsIHNpemVvZihzdGF0c19zaWRlKSk7CisgICAgfQorI2VuZGlmCisgICAgLy8gVGhpcyBsaW5lIGlzIG9ubHkgdXNlZnVsIHRvIHJlbW92ZSBhIENsYW5nIHN0YXRpYyBhbmFseXplciB3YXJuaW5nLgorICAgIHBhcmFtc19zaWRlLmVycl8gPSBWUDhfRU5DX09LOworICAgIHdvcmtlcl9pbnRlcmZhY2UtPkxhdW5jaCgmd29ya2VyX3NpZGUpOworICB9CisgIC8vIEV4ZWN1dGUgdGhlIG1haW4gdGhyZWFkLgorICB3b3JrZXJfaW50ZXJmYWNlLT5FeGVjdXRlKCZ3b3JrZXJfbWFpbik7CisgIG9rX21haW4gPSB3b3JrZXJfaW50ZXJmYWNlLT5TeW5jKCZ3b3JrZXJfbWFpbik7CisgIHdvcmtlcl9pbnRlcmZhY2UtPkVuZCgmd29ya2VyX21haW4pOworICBpZiAobnVtX2NydW5jaF9jb25maWdzX3NpZGUgIT0gMCkgeworICAgIC8vIFdhaXQgZm9yIHRoZSBzZWNvbmQgdGhyZWFkLgorICAgIGNvbnN0IGludCBva19zaWRlID0gd29ya2VyX2ludGVyZmFjZS0+U3luYygmd29ya2VyX3NpZGUpOworICAgIHdvcmtlcl9pbnRlcmZhY2UtPkVuZCgmd29ya2VyX3NpZGUpOworICAgIGlmICghb2tfbWFpbiB8fCAhb2tfc2lkZSkgeworICAgICAgZXJyID0gb2tfbWFpbiA/IHBhcmFtc19zaWRlLmVycl8gOiBwYXJhbXNfbWFpbi5lcnJfOworICAgICAgZ290byBFcnJvcjsKKyAgICB9CisgICAgaWYgKFZQOExCaXRXcml0ZXJOdW1CeXRlcygmYndfc2lkZSkgPCBWUDhMQml0V3JpdGVyTnVtQnl0ZXMoYndfbWFpbikpIHsKKyAgICAgIFZQOExCaXRXcml0ZXJTd2FwKGJ3X21haW4sICZid19zaWRlKTsKKyNpZiAhZGVmaW5lZChXRUJQX0RJU0FCTEVfU1RBVFMpCisgICAgICBpZiAocGljdHVyZS0+c3RhdHMgIT0gTlVMTCkgeworICAgICAgICBtZW1jcHkocGljdHVyZS0+c3RhdHMsICZzdGF0c19zaWRlLCBzaXplb2YoKnBpY3R1cmUtPnN0YXRzKSk7CisgICAgICB9CisjZW5kaWYKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKCFva19tYWluKSB7CisgICAgICBlcnIgPSBwYXJhbXNfbWFpbi5lcnJfOworICAgICAgZ290byBFcnJvcjsKKyAgICB9CisgIH0KKworRXJyb3I6CisgIFZQOExCaXRXcml0ZXJXaXBlT3V0KCZid19zaWRlKTsKKyAgVlA4TEVuY29kZXJEZWxldGUoZW5jX21haW4pOworICBWUDhMRW5jb2RlckRlbGV0ZShlbmNfc2lkZSk7CisgIHJldHVybiBlcnI7Cit9CisKKyN1bmRlZiBDUlVOQ0hfQ09ORklHU19NQVgKKyN1bmRlZiBDUlVOQ0hfQ09ORklHU19MWjc3X01BWAorCitpbnQgVlA4TEVuY29kZUltYWdlKGNvbnN0IFdlYlBDb25maWcqIGNvbnN0IGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUpIHsKKyAgaW50IHdpZHRoLCBoZWlnaHQ7CisgIGludCBoYXNfYWxwaGE7CisgIHNpemVfdCBjb2RlZF9zaXplOworICBpbnQgcGVyY2VudCA9IDA7CisgIGludCBpbml0aWFsX3NpemU7CisgIFdlYlBFbmNvZGluZ0Vycm9yIGVyciA9IFZQOF9FTkNfT0s7CisgIFZQOExCaXRXcml0ZXIgYnc7CisKKyAgaWYgKHBpY3R1cmUgPT0gTlVMTCkgcmV0dXJuIDA7CisKKyAgaWYgKGNvbmZpZyA9PSBOVUxMIHx8IHBpY3R1cmUtPmFyZ2IgPT0gTlVMTCkgeworICAgIGVyciA9IFZQOF9FTkNfRVJST1JfTlVMTF9QQVJBTUVURVI7CisgICAgV2ViUEVuY29kaW5nU2V0RXJyb3IocGljdHVyZSwgZXJyKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHdpZHRoID0gcGljdHVyZS0+d2lkdGg7CisgIGhlaWdodCA9IHBpY3R1cmUtPmhlaWdodDsKKyAgLy8gSW5pdGlhbGl6ZSBCaXRXcml0ZXIgd2l0aCBzaXplIGNvcnJlc3BvbmRpbmcgdG8gMTYgYnBwIHRvIHBob3RvIGltYWdlcyBhbmQKKyAgLy8gOCBicHAgZm9yIGdyYXBoaWNhbCBpbWFnZXMuCisgIGluaXRpYWxfc2l6ZSA9IChjb25maWctPmltYWdlX2hpbnQgPT0gV0VCUF9ISU5UX0dSQVBIKSA/CisgICAgICB3aWR0aCAqIGhlaWdodCA6IHdpZHRoICogaGVpZ2h0ICogMjsKKyAgaWYgKCFWUDhMQml0V3JpdGVySW5pdCgmYncsIGluaXRpYWxfc2l6ZSkpIHsKKyAgICBlcnIgPSBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlk7CisgICAgZ290byBFcnJvcjsKKyAgfQorCisgIGlmICghV2ViUFJlcG9ydFByb2dyZXNzKHBpY3R1cmUsIDEsICZwZXJjZW50KSkgeworIFVzZXJBYm9ydDoKKyAgICBlcnIgPSBWUDhfRU5DX0VSUk9SX1VTRVJfQUJPUlQ7CisgICAgZ290byBFcnJvcjsKKyAgfQorICAvLyBSZXNldCBzdGF0cyAoZm9yIHB1cmUgbG9zc2xlc3MgY29kaW5nKQorICBpZiAocGljdHVyZS0+c3RhdHMgIT0gTlVMTCkgeworICAgIFdlYlBBdXhTdGF0cyogY29uc3Qgc3RhdHMgPSBwaWN0dXJlLT5zdGF0czsKKyAgICBtZW1zZXQoc3RhdHMsIDAsIHNpemVvZigqc3RhdHMpKTsKKyAgICBzdGF0cy0+UFNOUlswXSA9IDk5LmY7CisgICAgc3RhdHMtPlBTTlJbMV0gPSA5OS5mOworICAgIHN0YXRzLT5QU05SWzJdID0gOTkuZjsKKyAgICBzdGF0cy0+UFNOUlszXSA9IDk5LmY7CisgICAgc3RhdHMtPlBTTlJbNF0gPSA5OS5mOworICB9CisKKyAgLy8gV3JpdGUgaW1hZ2Ugc2l6ZS4KKyAgaWYgKCFXcml0ZUltYWdlU2l6ZShwaWN0dXJlLCAmYncpKSB7CisgICAgZXJyID0gVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZOworICAgIGdvdG8gRXJyb3I7CisgIH0KKworICBoYXNfYWxwaGEgPSBXZWJQUGljdHVyZUhhc1RyYW5zcGFyZW5jeShwaWN0dXJlKTsKKyAgLy8gV3JpdGUgdGhlIG5vbi10cml2aWFsIEFscGhhIGZsYWcgYW5kIGxvc3NsZXNzIHZlcnNpb24uCisgIGlmICghV3JpdGVSZWFsQWxwaGFBbmRWZXJzaW9uKCZidywgaGFzX2FscGhhKSkgeworICAgIGVyciA9IFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWTsKKyAgICBnb3RvIEVycm9yOworICB9CisKKyAgaWYgKCFXZWJQUmVwb3J0UHJvZ3Jlc3MocGljdHVyZSwgNSwgJnBlcmNlbnQpKSBnb3RvIFVzZXJBYm9ydDsKKworICAvLyBFbmNvZGUgbWFpbiBpbWFnZSBzdHJlYW0uCisgIGVyciA9IFZQOExFbmNvZGVTdHJlYW0oY29uZmlnLCBwaWN0dXJlLCAmYncsIDEgLyp1c2VfY2FjaGUqLyk7CisgIGlmIChlcnIgIT0gVlA4X0VOQ19PSykgZ290byBFcnJvcjsKKworICBpZiAoIVdlYlBSZXBvcnRQcm9ncmVzcyhwaWN0dXJlLCA5MCwgJnBlcmNlbnQpKSBnb3RvIFVzZXJBYm9ydDsKKworICAvLyBGaW5pc2ggdGhlIFJJRkYgY2h1bmsuCisgIGVyciA9IFdyaXRlSW1hZ2UocGljdHVyZSwgJmJ3LCAmY29kZWRfc2l6ZSk7CisgIGlmIChlcnIgIT0gVlA4X0VOQ19PSykgZ290byBFcnJvcjsKKworICBpZiAoIVdlYlBSZXBvcnRQcm9ncmVzcyhwaWN0dXJlLCAxMDAsICZwZXJjZW50KSkgZ290byBVc2VyQWJvcnQ7CisKKyNpZiAhZGVmaW5lZChXRUJQX0RJU0FCTEVfU1RBVFMpCisgIC8vIFNhdmUgc2l6ZS4KKyAgaWYgKHBpY3R1cmUtPnN0YXRzICE9IE5VTEwpIHsKKyAgICBwaWN0dXJlLT5zdGF0cy0+Y29kZWRfc2l6ZSArPSAoaW50KWNvZGVkX3NpemU7CisgICAgcGljdHVyZS0+c3RhdHMtPmxvc3NsZXNzX3NpemUgPSAoaW50KWNvZGVkX3NpemU7CisgIH0KKyNlbmRpZgorCisgIGlmIChwaWN0dXJlLT5leHRyYV9pbmZvICE9IE5VTEwpIHsKKyAgICBjb25zdCBpbnQgbWJfdyA9ICh3aWR0aCArIDE1KSA+PiA0OworICAgIGNvbnN0IGludCBtYl9oID0gKGhlaWdodCArIDE1KSA+PiA0OworICAgIG1lbXNldChwaWN0dXJlLT5leHRyYV9pbmZvLCAwLCBtYl93ICogbWJfaCAqIHNpemVvZigqcGljdHVyZS0+ZXh0cmFfaW5mbykpOworICB9CisKKyBFcnJvcjoKKyAgaWYgKGJ3LmVycm9yXykgZXJyID0gVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZOworICBWUDhMQml0V3JpdGVyV2lwZU91dCgmYncpOworICBpZiAoZXJyICE9IFZQOF9FTkNfT0spIHsKKyAgICBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWN0dXJlLCBlcnIpOworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiAxOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy92cDhsaV9lbmMuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvdnA4bGlfZW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk4YTRhMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvdnA4bGlfZW5jLmgKQEAgLTAsMCArMSwxMTggQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBMb3NzbGVzcyBlbmNvZGVyOiBpbnRlcm5hbCBoZWFkZXIuCisvLworLy8gQXV0aG9yOiBWaWthcyBBcm9yYSAodmlrYWFzLmFyb3JhQGdtYWlsLmNvbSkKKworI2lmbmRlZiBXRUJQX0VOQ19WUDhMSV9FTkNfSF8KKyNkZWZpbmUgV0VCUF9FTkNfVlA4TElfRU5DX0hfCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAic3JjL3dlYnAvY29uZmlnLmgiCisjZW5kaWYKKy8vIEVpdGhlciBXRUJQX05FQVJfTE9TU0xFU1MgaXMgZGVmaW5lZCBhcyAwIGluIGNvbmZpZy5oIHdoZW4gY29tcGlsaW5nIHRvCisvLyBkaXNhYmxlIG5lYXItbG9zc2xlc3MsIG9yIGl0IGlzIGVuYWJsZWQgYnkgZGVmYXVsdC4KKyNpZm5kZWYgV0VCUF9ORUFSX0xPU1NMRVNTCisjZGVmaW5lIFdFQlBfTkVBUl9MT1NTTEVTUyAxCisjZW5kaWYKKworI2luY2x1ZGUgInNyYy9lbmMvYmFja3dhcmRfcmVmZXJlbmNlc19lbmMuaCIKKyNpbmNsdWRlICJzcmMvZW5jL2hpc3RvZ3JhbV9lbmMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvYml0X3dyaXRlcl91dGlscy5oIgorI2luY2x1ZGUgInNyYy93ZWJwL2VuY29kZS5oIgorI2luY2x1ZGUgInNyYy93ZWJwL2Zvcm1hdF9jb25zdGFudHMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvLyBtYXhpbXVtIHZhbHVlIG9mIHRyYW5zZm9ybV9iaXRzXyBpbiBWUDhMRW5jb2Rlci4KKyNkZWZpbmUgTUFYX1RSQU5TRk9STV9CSVRTIDYKKwordHlwZWRlZiBlbnVtIHsKKyAga0VuY29kZXJOb25lID0gMCwKKyAga0VuY29kZXJBUkdCLAorICBrRW5jb2Rlck5lYXJMb3NzbGVzcywKKyAga0VuY29kZXJQYWxldHRlCit9IFZQOExFbmNvZGVyQVJHQkNvbnRlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgY29uc3QgV2ViUENvbmZpZyogY29uZmlnXzsgICAgICAvLyB1c2VyIGNvbmZpZ3VyYXRpb24gYW5kIHBhcmFtZXRlcnMKKyAgY29uc3QgV2ViUFBpY3R1cmUqIHBpY187ICAgICAgICAvLyBpbnB1dCBwaWN0dXJlLgorCisgIHVpbnQzMl90KiBhcmdiXzsgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyYW5zZm9ybWVkIGFyZ2IgaW1hZ2UgZGF0YS4KKyAgVlA4TEVuY29kZXJBUkdCQ29udGVudCBhcmdiX2NvbnRlbnRfOyAgLy8gQ29udGVudCB0eXBlIG9mIHRoZSBhcmdiIGJ1ZmZlci4KKyAgdWludDMyX3QqIGFyZ2Jfc2NyYXRjaF87ICAgICAgICAgICAgICAgLy8gU2NyYXRjaCBtZW1vcnkgZm9yIGFyZ2Igcm93cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAodXNlZCBmb3IgcHJlZGljdGlvbikuCisgIHVpbnQzMl90KiB0cmFuc2Zvcm1fZGF0YV87ICAgICAgICAgICAgIC8vIFNjcmF0Y2ggbWVtb3J5IGZvciB0cmFuc2Zvcm0gZGF0YS4KKyAgdWludDMyX3QqIHRyYW5zZm9ybV9tZW1fOyAgICAgICAgICAgICAgLy8gQ3VycmVudGx5IGFsbG9jYXRlZCBtZW1vcnkuCisgIHNpemVfdCAgICB0cmFuc2Zvcm1fbWVtX3NpemVfOyAgICAgICAgIC8vIEN1cnJlbnRseSBhbGxvY2F0ZWQgbWVtb3J5IHNpemUuCisKKyAgaW50ICAgICAgIGN1cnJlbnRfd2lkdGhfOyAgICAgICAvLyBDb3JyZXNwb25kcyB0byBwYWNrZWQgaW1hZ2Ugd2lkdGguCisKKyAgLy8gRW5jb2RpbmcgcGFyYW1ldGVycyBkZXJpdmVkIGZyb20gcXVhbGl0eSBwYXJhbWV0ZXIuCisgIGludCBoaXN0b19iaXRzXzsKKyAgaW50IHRyYW5zZm9ybV9iaXRzXzsgICAgLy8gPD0gTUFYX1RSQU5TRk9STV9CSVRTLgorICBpbnQgY2FjaGVfYml0c187ICAgICAgICAvLyBJZiBlcXVhbCB0byAwLCBkb24ndCB1c2UgY29sb3IgY2FjaGUuCisKKyAgLy8gRW5jb2RpbmcgcGFyYW1ldGVycyBkZXJpdmVkIGZyb20gaW1hZ2UgY2hhcmFjdGVyaXN0aWNzLgorICBpbnQgdXNlX2Nyb3NzX2NvbG9yXzsKKyAgaW50IHVzZV9zdWJ0cmFjdF9ncmVlbl87CisgIGludCB1c2VfcHJlZGljdF87CisgIGludCB1c2VfcGFsZXR0ZV87CisgIGludCBwYWxldHRlX3NpemVfOworICB1aW50MzJfdCBwYWxldHRlX1tNQVhfUEFMRVRURV9TSVpFXTsKKworICAvLyBTb21lICdzY3JhdGNoJyAocG90ZW50aWFsbHkgbGFyZ2UpIG9iamVjdHMuCisgIHN0cnVjdCBWUDhMQmFja3dhcmRSZWZzIHJlZnNfWzNdOyAgLy8gQmFja3dhcmQgUmVmcyBhcnJheSBmb3IgdGVtcG9yYXJpZXMuCisgIFZQOExIYXNoQ2hhaW4gaGFzaF9jaGFpbl87ICAgICAgICAgLy8gSGFzaENoYWluIGRhdGEgZm9yIGNvbnN0cnVjdGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2t3YXJkIHJlZmVyZW5jZXMuCit9IFZQOExFbmNvZGVyOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gaW50ZXJuYWwgZnVuY3Rpb25zLiBOb3QgcHVibGljLgorCisvLyBFbmNvZGVzIHRoZSBwaWN0dXJlLgorLy8gUmV0dXJucyAwIGlmIGNvbmZpZyBvciBwaWN0dXJlIGlzIE5VTEwgb3IgcGljdHVyZSBkb2Vzbid0IGhhdmUgdmFsaWQgYXJnYgorLy8gaW5wdXQuCitpbnQgVlA4TEVuY29kZUltYWdlKGNvbnN0IFdlYlBDb25maWcqIGNvbnN0IGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUpOworCisvLyBFbmNvZGVzIHRoZSBtYWluIGltYWdlIHN0cmVhbSB1c2luZyB0aGUgc3VwcGxpZWQgYml0IHdyaXRlci4KKy8vIElmICd1c2VfY2FjaGUnIGlzIGZhbHNlLCBkaXNhYmxlcyB0aGUgdXNlIG9mIGNvbG9yIGNhY2hlLgorV2ViUEVuY29kaW5nRXJyb3IgVlA4TEVuY29kZVN0cmVhbShjb25zdCBXZWJQQ29uZmlnKiBjb25zdCBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQml0V3JpdGVyKiBjb25zdCBidywgaW50IHVzZV9jYWNoZSk7CisKKyNpZiAoV0VCUF9ORUFSX0xPU1NMRVNTID09IDEpCisvLyBpbiBuZWFyX2xvc3NsZXNzLmMKKy8vIE5lYXIgbG9zc2xlc3MgcHJlcHJvY2Vzc2luZyBpbiBSR0IgY29sb3Itc3BhY2UuCitpbnQgVlA4QXBwbHlOZWFyTG9zc2xlc3MoY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUsIGludCBxdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBjb25zdCBhcmdiX2RzdCk7CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEltYWdlIHRyYW5zZm9ybXMgaW4gcHJlZGljdG9yLmMuCisKK3ZvaWQgVlA4TFJlc2lkdWFsSW1hZ2UoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYml0cywgaW50IGxvd19lZmZvcnQsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBjb25zdCBhcmdiLCB1aW50MzJfdCogY29uc3QgYXJnYl9zY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogY29uc3QgaW1hZ2UsIGludCBuZWFyX2xvc3NsZXNzLCBpbnQgZXhhY3QsCisgICAgICAgICAgICAgICAgICAgICAgIGludCB1c2VkX3N1YnRyYWN0X2dyZWVuKTsKKwordm9pZCBWUDhMQ29sb3JTcGFjZVRyYW5zZm9ybShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBiaXRzLCBpbnQgcXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGNvbnN0IGFyZ2IsIHVpbnQzMl90KiBpbWFnZSk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvKiBXRUJQX0VOQ19WUDhMSV9FTkNfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvd2VicF9lbmMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvd2VicF9lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTU4NjUyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy93ZWJwX2VuYy5jCkBAIC0wLDAgKzEsNDE3IEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gV2ViUCBlbmNvZGVyOiBtYWluIGVudHJ5IHBvaW50CisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL2Fzc2VydF9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vbWF0aF9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RkbGliX3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdfcG9lbS5oIgorI2Vsc2UKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjZW5kaWYKKworI2luY2x1ZGUgInNyYy9lbmMvY29zdF9lbmMuaCIKKyNpbmNsdWRlICJzcmMvZW5jL3ZwOGlfZW5jLmgiCisjaW5jbHVkZSAic3JjL2VuYy92cDhsaV9lbmMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKKworLy8gI2RlZmluZSBQUklOVF9NRU1PUllfSU5GTworCisjaWZkZWYgUFJJTlRfTUVNT1JZX0lORk8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBXZWJQR2V0RW5jb2RlclZlcnNpb24odm9pZCkgeworICByZXR1cm4gKEVOQ19NQUpfVkVSU0lPTiA8PCAxNikgfCAoRU5DX01JTl9WRVJTSU9OIDw8IDgpIHwgRU5DX1JFVl9WRVJTSU9OOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVlA4RW5jb2RlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgUmVzZXRTZWdtZW50SGVhZGVyKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgeworICBWUDhFbmNTZWdtZW50SGVhZGVyKiBjb25zdCBoZHIgPSAmZW5jLT5zZWdtZW50X2hkcl87CisgIGhkci0+bnVtX3NlZ21lbnRzXyA9IGVuYy0+Y29uZmlnXy0+c2VnbWVudHM7CisgIGhkci0+dXBkYXRlX21hcF8gID0gKGhkci0+bnVtX3NlZ21lbnRzXyA+IDEpOworICBoZHItPnNpemVfID0gMDsKK30KKworc3RhdGljIHZvaWQgUmVzZXRGaWx0ZXJIZWFkZXIoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7CisgIFZQOEVuY0ZpbHRlckhlYWRlciogY29uc3QgaGRyID0gJmVuYy0+ZmlsdGVyX2hkcl87CisgIGhkci0+c2ltcGxlXyA9IDE7CisgIGhkci0+bGV2ZWxfID0gMDsKKyAgaGRyLT5zaGFycG5lc3NfID0gMDsKKyAgaGRyLT5pNHg0X2xmX2RlbHRhXyA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIFJlc2V0Qm91bmRhcnlQcmVkaWN0aW9ucyhWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgLy8gaW5pdCBib3VuZGFyeSB2YWx1ZXMgb25jZSBmb3IgYWxsCisgIC8vIE5vdGU6IGFjdHVhbGx5LCBpbml0aWFsaXppbmcgdGhlIHByZWRzX1tdIGlzIG9ubHkgbmVlZGVkIGZvciBpbnRyYTQuCisgIGludCBpOworICB1aW50OF90KiBjb25zdCB0b3AgPSBlbmMtPnByZWRzXyAtIGVuYy0+cHJlZHNfd187CisgIHVpbnQ4X3QqIGNvbnN0IGxlZnQgPSBlbmMtPnByZWRzXyAtIDE7CisgIGZvciAoaSA9IC0xOyBpIDwgNCAqIGVuYy0+bWJfd187ICsraSkgeworICAgIHRvcFtpXSA9IEJfRENfUFJFRDsKKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgNCAqIGVuYy0+bWJfaF87ICsraSkgeworICAgIGxlZnRbaSAqIGVuYy0+cHJlZHNfd19dID0gQl9EQ19QUkVEOworICB9CisgIGVuYy0+bnpfWy0xXSA9IDA7ICAgLy8gY29uc3RhbnQKK30KKworLy8gTWFwcGluZyBmcm9tIGNvbmZpZy0+bWV0aG9kXyB0byBjb2RpbmcgdG9vbHMgdXNlZC4KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rCisvLyAgIE1ldGhvZCAgICAgICAgICB8IDAgfCAxIHwgMiB8IDMgfCg0KXwgNSB8IDYgfAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSsKKy8vIGZhc3QgcHJvYmUgICAgICAgIHwgeCB8ICAgfCAgIHwgeCB8ICAgfCAgIHwgICB8CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKworLy8gZHluYW1pYyBwcm9iYSAgICAgfCB+IHwgeCB8IHggfCB4IHwgeCB8IHggfCB4IHwKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rCisvLyBmYXN0IG1vZGUgYW5hbHlzaXN8W3hdfFt4XXwgICB8ICAgfCB4IHwgeCB8IHggfAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSsKKy8vIGJhc2ljIHJkLW9wdCAgICAgIHwgICB8ICAgfCAgIHwgeCB8IHggfCB4IHwgeCB8CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKworLy8gZGlzdG8tcmVmaW5lIGk0LzE2fCB4IHwgeCB8IHggfCAgIHwgICB8ICAgfCAgIHwKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rCisvLyBkaXN0by1yZWZpbmUgdXYgICB8ICAgfCB4IHwgeCB8ICAgfCAgIHwgICB8ICAgfAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSsKKy8vIHJkLW9wdCBpNC8xNiAgICAgIHwgICB8ICAgfCB+IHwgeCB8IHggfCB4IHwgeCB8CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKworLy8gdG9rZW4gYnVmZmVyIChvcHQpfCAgIHwgICB8ICAgfCB4IHwgeCB8IHggfCB4IHwKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rCisvLyBUcmVsbGlzICAgICAgICAgICB8ICAgfCAgIHwgICB8ICAgfCAgIHwgeCB8RnVsfAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSsKKy8vIGZ1bGwtU05TICAgICAgICAgIHwgICB8ICAgfCAgIHwgICB8IHggfCB4IHwgeCB8CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKworCitzdGF0aWMgdm9pZCBNYXBDb25maWdUb1Rvb2xzKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgeworICBjb25zdCBXZWJQQ29uZmlnKiBjb25zdCBjb25maWcgPSBlbmMtPmNvbmZpZ187CisgIGNvbnN0IGludCBtZXRob2QgPSBjb25maWctPm1ldGhvZDsKKyAgY29uc3QgaW50IGxpbWl0ID0gMTAwIC0gY29uZmlnLT5wYXJ0aXRpb25fbGltaXQ7CisgIGVuYy0+bWV0aG9kXyA9IG1ldGhvZDsKKyAgZW5jLT5yZF9vcHRfbGV2ZWxfID0gKG1ldGhvZCA+PSA2KSA/IFJEX09QVF9UUkVMTElTX0FMTAorICAgICAgICAgICAgICAgICAgICAgOiAobWV0aG9kID49IDUpID8gUkRfT1BUX1RSRUxMSVMKKyAgICAgICAgICAgICAgICAgICAgIDogKG1ldGhvZCA+PSAzKSA/IFJEX09QVF9CQVNJQworICAgICAgICAgICAgICAgICAgICAgOiBSRF9PUFRfTk9ORTsKKyAgZW5jLT5tYXhfaTRfaGVhZGVyX2JpdHNfID0KKyAgICAgIDI1NiAqIDE2ICogMTYgKiAgICAgICAgICAgICAgICAgLy8gdXBwZXIgYm91bmQ6IHVwIHRvIDE2Yml0IHBlciA0eDQgYmxvY2sKKyAgICAgIChsaW1pdCAqIGxpbWl0KSAvICgxMDAgKiAxMDApOyAgLy8gLi4uIG1vZHVsYXRlZCB3aXRoIGEgcXVhZHJhdGljIGN1cnZlLgorCisgIC8vIHBhcnRpdGlvbjAgPSA1MTJrIG1heC4KKyAgZW5jLT5tYl9oZWFkZXJfbGltaXRfID0KKyAgICAgIChzY29yZV90KTI1NiAqIDUxMCAqIDggKiAxMDI0IC8gKGVuYy0+bWJfd18gKiBlbmMtPm1iX2hfKTsKKworICBlbmMtPnRocmVhZF9sZXZlbF8gPSBjb25maWctPnRocmVhZF9sZXZlbDsKKworICBlbmMtPmRvX3NlYXJjaF8gPSAoY29uZmlnLT50YXJnZXRfc2l6ZSA+IDAgfHwgY29uZmlnLT50YXJnZXRfUFNOUiA+IDApOworICBpZiAoIWNvbmZpZy0+bG93X21lbW9yeSkgeworI2lmICFkZWZpbmVkKERJU0FCTEVfVE9LRU5fQlVGRkVSKQorICAgIGVuYy0+dXNlX3Rva2Vuc18gPSAoZW5jLT5yZF9vcHRfbGV2ZWxfID49IFJEX09QVF9CQVNJQyk7ICAvLyBuZWVkIHJkIHN0YXRzCisjZW5kaWYKKyAgICBpZiAoZW5jLT51c2VfdG9rZW5zXykgeworICAgICAgZW5jLT5udW1fcGFydHNfID0gMTsgICAvLyBkb2Vzbid0IHdvcmsgd2l0aCBtdWx0aS1wYXJ0aXRpb24KKyAgICB9CisgIH0KK30KKworLy8gTWVtb3J5IHNjYWxpbmcgd2l0aCBkaW1lbnNpb25zOgorLy8gIG1lbW9yeSAoYnl0ZXMpIH49IDIuMjUgKiB3ICsgMC4wNjI1ICogdyAqIGgKKy8vCisvLyBUeXBpY2FsIG1lbW9yeSBmb290cHJpbnQgKDYxNHg0NDAgcGljdHVyZSkKKy8vICAgICAgICAgICAgICBlbmNvZGVyOiAyMjExMQorLy8gICAgICAgICAgICAgICAgIGluZm86IDQzNjgKKy8vICAgICAgICAgICAgICAgIHByZWRzOiAxNzc0MQorLy8gICAgICAgICAgdG9wIHNhbXBsZXM6IDEyNjMKKy8vICAgICAgICAgICAgIG5vbi16ZXJvOiAxNzUKKy8vICAgICAgICAgICAgIGxmLXN0YXRzOiAwCisvLyAgICAgICAgICAgICAgICB0b3RhbDogNDU2NTgKKy8vIFRyYW5zaWVudCBvYmplY3Qgc2l6ZXM6CisvLyAgICAgICBWUDhFbmNJdGVyYXRvcjogMzM2MAorLy8gICAgICAgICBWUDhNb2RlU2NvcmU6IDg3MgorLy8gICAgICAgVlA4U2VnbWVudEluZm86IDczMgorLy8gICAgICAgICAgVlA4RW5jUHJvYmE6IDE4MzUyCisvLyAgICAgICAgICAgICAgTEZTdGF0czogMjA0OAorLy8gUGljdHVyZSBzaXplICh5dXYpOiA0MTkzMjgKKworc3RhdGljIFZQOEVuY29kZXIqIEluaXRWUDhFbmNvZGVyKGNvbnN0IFdlYlBDb25maWcqIGNvbnN0IGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSkgeworICBWUDhFbmNvZGVyKiBlbmM7CisgIGNvbnN0IGludCB1c2VfZmlsdGVyID0KKyAgICAgIChjb25maWctPmZpbHRlcl9zdHJlbmd0aCA+IDApIHx8IChjb25maWctPmF1dG9maWx0ZXIgPiAwKTsKKyAgY29uc3QgaW50IG1iX3cgPSAocGljdHVyZS0+d2lkdGggKyAxNSkgPj4gNDsKKyAgY29uc3QgaW50IG1iX2ggPSAocGljdHVyZS0+aGVpZ2h0ICsgMTUpID4+IDQ7CisgIGNvbnN0IGludCBwcmVkc193ID0gNCAqIG1iX3cgKyAxOworICBjb25zdCBpbnQgcHJlZHNfaCA9IDQgKiBtYl9oICsgMTsKKyAgY29uc3Qgc2l6ZV90IHByZWRzX3NpemUgPSBwcmVkc193ICogcHJlZHNfaCAqIHNpemVvZigqZW5jLT5wcmVkc18pOworICBjb25zdCBpbnQgdG9wX3N0cmlkZSA9IG1iX3cgKiAxNjsKKyAgY29uc3Qgc2l6ZV90IG56X3NpemUgPSAobWJfdyArIDEpICogc2l6ZW9mKCplbmMtPm56XykgKyBXRUJQX0FMSUdOX0NTVDsKKyAgY29uc3Qgc2l6ZV90IGluZm9fc2l6ZSA9IG1iX3cgKiBtYl9oICogc2l6ZW9mKCplbmMtPm1iX2luZm9fKTsKKyAgY29uc3Qgc2l6ZV90IHNhbXBsZXNfc2l6ZSA9CisgICAgICAyICogdG9wX3N0cmlkZSAqIHNpemVvZigqZW5jLT55X3RvcF8pICAvLyB0b3AtbHVtYS91L3YKKyAgICAgICsgV0VCUF9BTElHTl9DU1Q7ICAgICAgICAgICAgICAgICAgICAgIC8vIGFsaWduIGFsbAorICBjb25zdCBzaXplX3QgbGZfc3RhdHNfc2l6ZSA9CisgICAgICBjb25maWctPmF1dG9maWx0ZXIgPyBzaXplb2YoKmVuYy0+bGZfc3RhdHNfKSArIFdFQlBfQUxJR05fQ1NUIDogMDsKKyAgY29uc3Qgc2l6ZV90IHRvcF9kZXJyX3NpemUgPQorICAgICAgKGNvbmZpZy0+cXVhbGl0eSA8PSBFUlJPUl9ESUZGVVNJT05fUVVBTElUWSB8fCBjb25maWctPnBhc3MgPiAxKSA/CisgICAgICAgICAgbWJfdyAqIHNpemVvZigqZW5jLT50b3BfZGVycl8pIDogMDsKKyAgdWludDhfdCogbWVtOworICBjb25zdCB1aW50NjRfdCBzaXplID0gKHVpbnQ2NF90KXNpemVvZigqZW5jKSAgIC8vIG1haW4gc3RydWN0CisgICAgICAgICAgICAgICAgICAgICAgKyBXRUJQX0FMSUdOX0NTVCAgICAgICAgICAgLy8gY2FjaGUgYWxpZ25tZW50CisgICAgICAgICAgICAgICAgICAgICAgKyBpbmZvX3NpemUgICAgICAgICAgICAgICAgLy8gbW9kZXMgaW5mbworICAgICAgICAgICAgICAgICAgICAgICsgcHJlZHNfc2l6ZSAgICAgICAgICAgICAgIC8vIHByZWRpY3Rpb24gbW9kZXMKKyAgICAgICAgICAgICAgICAgICAgICArIHNhbXBsZXNfc2l6ZSAgICAgICAgICAgICAvLyB0b3AvbGVmdCBzYW1wbGVzCisgICAgICAgICAgICAgICAgICAgICAgKyB0b3BfZGVycl9zaXplICAgICAgICAgICAgLy8gdG9wIGRpZmZ1c2lvbiBlcnJvcgorICAgICAgICAgICAgICAgICAgICAgICsgbnpfc2l6ZSAgICAgICAgICAgICAgICAgIC8vIGNvZWZmIGNvbnRleHQgYml0cworICAgICAgICAgICAgICAgICAgICAgICsgbGZfc3RhdHNfc2l6ZTsgICAgICAgICAgIC8vIGF1dG9maWx0ZXIgc3RhdHMKKworI2lmZGVmIFBSSU5UX01FTU9SWV9JTkZPCisgIHByaW50ZigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworICBwcmludGYoIk1lbW9yeSB1c2VkOlxuIgorICAgICAgICAgIiAgICAgICAgICAgICBlbmNvZGVyOiAlbGRcbiIKKyAgICAgICAgICIgICAgICAgICAgICAgICAgaW5mbzogJWxkXG4iCisgICAgICAgICAiICAgICAgICAgICAgICAgcHJlZHM6ICVsZFxuIgorICAgICAgICAgIiAgICAgICAgIHRvcCBzYW1wbGVzOiAlbGRcbiIKKyAgICAgICAgICIgICAgICAgdG9wIGRpZmZ1c2lvbjogJWxkXG4iCisgICAgICAgICAiICAgICAgICAgICAgbm9uLXplcm86ICVsZFxuIgorICAgICAgICAgIiAgICAgICAgICAgIGxmLXN0YXRzOiAlbGRcbiIKKyAgICAgICAgICIgICAgICAgICAgICAgICB0b3RhbDogJWxkXG4iLAorICAgICAgICAgc2l6ZW9mKCplbmMpICsgV0VCUF9BTElHTl9DU1QsIGluZm9fc2l6ZSwKKyAgICAgICAgIHByZWRzX3NpemUsIHNhbXBsZXNfc2l6ZSwgdG9wX2RlcnJfc2l6ZSwgbnpfc2l6ZSwgbGZfc3RhdHNfc2l6ZSwgc2l6ZSk7CisgIHByaW50ZigiVHJhbnNpZW50IG9iamVjdCBzaXplczpcbiIKKyAgICAgICAgICIgICAgICBWUDhFbmNJdGVyYXRvcjogJWxkXG4iCisgICAgICAgICAiICAgICAgICBWUDhNb2RlU2NvcmU6ICVsZFxuIgorICAgICAgICAgIiAgICAgIFZQOFNlZ21lbnRJbmZvOiAlbGRcbiIKKyAgICAgICAgICIgICAgICAgICBWUDhFbmNQcm9iYTogJWxkXG4iCisgICAgICAgICAiICAgICAgICAgICAgIExGU3RhdHM6ICVsZFxuIiwKKyAgICAgICAgIHNpemVvZihWUDhFbmNJdGVyYXRvciksIHNpemVvZihWUDhNb2RlU2NvcmUpLAorICAgICAgICAgc2l6ZW9mKFZQOFNlZ21lbnRJbmZvKSwgc2l6ZW9mKFZQOEVuY1Byb2JhKSwKKyAgICAgICAgIHNpemVvZihMRlN0YXRzKSk7CisgIHByaW50ZigiUGljdHVyZSBzaXplICh5dXYpOiAlbGRcbiIsCisgICAgICAgICBtYl93ICogbWJfaCAqIDM4NCAqIHNpemVvZih1aW50OF90KSk7CisgIHByaW50ZigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworI2VuZGlmCisgIG1lbSA9ICh1aW50OF90KilXZWJQU2FmZU1hbGxvYyhzaXplLCBzaXplb2YoKm1lbSkpOworICBpZiAobWVtID09IE5VTEwpIHsKKyAgICBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWN0dXJlLCBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlkpOworICAgIHJldHVybiBOVUxMOworICB9CisgIGVuYyA9IChWUDhFbmNvZGVyKiltZW07CisgIG1lbSA9ICh1aW50OF90KilXRUJQX0FMSUdOKG1lbSArIHNpemVvZigqZW5jKSk7CisgIG1lbXNldChlbmMsIDAsIHNpemVvZigqZW5jKSk7CisgIGVuYy0+bnVtX3BhcnRzXyA9IDEgPDwgY29uZmlnLT5wYXJ0aXRpb25zOworICBlbmMtPm1iX3dfID0gbWJfdzsKKyAgZW5jLT5tYl9oXyA9IG1iX2g7CisgIGVuYy0+cHJlZHNfd18gPSBwcmVkc193OworICBlbmMtPm1iX2luZm9fID0gKFZQOE1CSW5mbyopbWVtOworICBtZW0gKz0gaW5mb19zaXplOworICBlbmMtPnByZWRzXyA9IG1lbSArIDEgKyBlbmMtPnByZWRzX3dfOworICBtZW0gKz0gcHJlZHNfc2l6ZTsKKyAgZW5jLT5uel8gPSAxICsgKHVpbnQzMl90KilXRUJQX0FMSUdOKG1lbSk7CisgIG1lbSArPSBuel9zaXplOworICBlbmMtPmxmX3N0YXRzXyA9IGxmX3N0YXRzX3NpemUgPyAoTEZTdGF0cyopV0VCUF9BTElHTihtZW0pIDogTlVMTDsKKyAgbWVtICs9IGxmX3N0YXRzX3NpemU7CisKKyAgLy8gdG9wIHNhbXBsZXMgKGFsbCAxNi1hbGlnbmVkKQorICBtZW0gPSAodWludDhfdCopV0VCUF9BTElHTihtZW0pOworICBlbmMtPnlfdG9wXyA9IG1lbTsKKyAgZW5jLT51dl90b3BfID0gZW5jLT55X3RvcF8gKyB0b3Bfc3RyaWRlOworICBtZW0gKz0gMiAqIHRvcF9zdHJpZGU7CisgIGVuYy0+dG9wX2RlcnJfID0gdG9wX2RlcnJfc2l6ZSA/IChERXJyb3IqKW1lbSA6IE5VTEw7CisgIG1lbSArPSB0b3BfZGVycl9zaXplOworICBhc3NlcnQobWVtIDw9ICh1aW50OF90KillbmMgKyBzaXplKTsKKworICBlbmMtPmNvbmZpZ18gPSBjb25maWc7CisgIGVuYy0+cHJvZmlsZV8gPSB1c2VfZmlsdGVyID8gKChjb25maWctPmZpbHRlcl90eXBlID09IDEpID8gMCA6IDEpIDogMjsKKyAgZW5jLT5waWNfID0gcGljdHVyZTsKKyAgZW5jLT5wZXJjZW50XyA9IDA7CisKKyAgTWFwQ29uZmlnVG9Ub29scyhlbmMpOworICBWUDhFbmNEc3BJbml0KCk7CisgIFZQOERlZmF1bHRQcm9iYXMoZW5jKTsKKyAgUmVzZXRTZWdtZW50SGVhZGVyKGVuYyk7CisgIFJlc2V0RmlsdGVySGVhZGVyKGVuYyk7CisgIFJlc2V0Qm91bmRhcnlQcmVkaWN0aW9ucyhlbmMpOworICBWUDhFbmNEc3BDb3N0SW5pdCgpOworICBWUDhFbmNJbml0QWxwaGEoZW5jKTsKKworICAvLyBsb3dlciBxdWFsaXR5IG1lYW5zIHNtYWxsZXIgb3V0cHV0IC0+IHdlIG1vZHVsYXRlIGEgbGl0dGxlIHRoZSBwYWdlCisgIC8vIHNpemUgYmFzZWQgb24gcXVhbGl0eS4gVGhpcyBpcyBqdXN0IGEgY3J1ZGUgMXJzdC1vcmRlciBwcmVkaWN0aW9uLgorICB7CisgICAgY29uc3QgZmxvYXQgc2NhbGUgPSAxLmYgKyBjb25maWctPnF1YWxpdHkgKiA1LmYgLyAxMDAuZjsgIC8vIGluIFsxLDZdCisgICAgVlA4VEJ1ZmZlckluaXQoJmVuYy0+dG9rZW5zXywgKGludCkobWJfdyAqIG1iX2ggKiA0ICogc2NhbGUpKTsKKyAgfQorICByZXR1cm4gZW5jOworfQorCitzdGF0aWMgaW50IERlbGV0ZVZQOEVuY29kZXIoVlA4RW5jb2RlciogZW5jKSB7CisgIGludCBvayA9IDE7CisgIGlmIChlbmMgIT0gTlVMTCkgeworICAgIG9rID0gVlA4RW5jRGVsZXRlQWxwaGEoZW5jKTsKKyAgICBWUDhUQnVmZmVyQ2xlYXIoJmVuYy0+dG9rZW5zXyk7CisgICAgV2ViUFNhZmVGcmVlKGVuYyk7CisgIH0KKyAgcmV0dXJuIG9rOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgIWRlZmluZWQoV0VCUF9ESVNBQkxFX1NUQVRTKQorc3RhdGljIGRvdWJsZSBHZXRQU05SKHVpbnQ2NF90IGVyciwgdWludDY0X3Qgc2l6ZSkgeworICByZXR1cm4gKGVyciA+IDAgJiYgc2l6ZSA+IDApID8gMTAuICogbG9nMTAoMjU1LiAqIDI1NS4gKiBzaXplIC8gZXJyKSA6IDk5LjsKK30KKworc3RhdGljIHZvaWQgRmluYWxpemVQU05SKGNvbnN0IFZQOEVuY29kZXIqIGNvbnN0IGVuYykgeworICBXZWJQQXV4U3RhdHMqIHN0YXRzID0gZW5jLT5waWNfLT5zdGF0czsKKyAgY29uc3QgdWludDY0X3Qgc2l6ZSA9IGVuYy0+c3NlX2NvdW50XzsKKyAgY29uc3QgdWludDY0X3QqIGNvbnN0IHNzZSA9IGVuYy0+c3NlXzsKKyAgc3RhdHMtPlBTTlJbMF0gPSAoZmxvYXQpR2V0UFNOUihzc2VbMF0sIHNpemUpOworICBzdGF0cy0+UFNOUlsxXSA9IChmbG9hdClHZXRQU05SKHNzZVsxXSwgc2l6ZSAvIDQpOworICBzdGF0cy0+UFNOUlsyXSA9IChmbG9hdClHZXRQU05SKHNzZVsyXSwgc2l6ZSAvIDQpOworICBzdGF0cy0+UFNOUlszXSA9IChmbG9hdClHZXRQU05SKHNzZVswXSArIHNzZVsxXSArIHNzZVsyXSwgc2l6ZSAqIDMgLyAyKTsKKyAgc3RhdHMtPlBTTlJbNF0gPSAoZmxvYXQpR2V0UFNOUihzc2VbM10sIHNpemUpOworfQorI2VuZGlmICAvLyAhZGVmaW5lZChXRUJQX0RJU0FCTEVfU1RBVFMpCisKK3N0YXRpYyB2b2lkIFN0b3JlU3RhdHMoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7CisjaWYgIWRlZmluZWQoV0VCUF9ESVNBQkxFX1NUQVRTKQorICBXZWJQQXV4U3RhdHMqIGNvbnN0IHN0YXRzID0gZW5jLT5waWNfLT5zdGF0czsKKyAgaWYgKHN0YXRzICE9IE5VTEwpIHsKKyAgICBpbnQgaSwgczsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX01CX1NFR01FTlRTOyArK2kpIHsKKyAgICAgIHN0YXRzLT5zZWdtZW50X2xldmVsW2ldID0gZW5jLT5kcW1fW2ldLmZzdHJlbmd0aF87CisgICAgICBzdGF0cy0+c2VnbWVudF9xdWFudFtpXSA9IGVuYy0+ZHFtX1tpXS5xdWFudF87CisgICAgICBmb3IgKHMgPSAwOyBzIDw9IDI7ICsrcykgeworICAgICAgICBzdGF0cy0+cmVzaWR1YWxfYnl0ZXNbc11baV0gPSBlbmMtPnJlc2lkdWFsX2J5dGVzX1tzXVtpXTsKKyAgICAgIH0KKyAgICB9CisgICAgRmluYWxpemVQU05SKGVuYyk7CisgICAgc3RhdHMtPmNvZGVkX3NpemUgPSBlbmMtPmNvZGVkX3NpemVfOworICAgIGZvciAoaSA9IDA7IGkgPCAzOyArK2kpIHsKKyAgICAgIHN0YXRzLT5ibG9ja19jb3VudFtpXSA9IGVuYy0+YmxvY2tfY291bnRfW2ldOworICAgIH0KKyAgfQorI2Vsc2UgIC8vIGRlZmluZWQoV0VCUF9ESVNBQkxFX1NUQVRTKQorICBXZWJQUmVwb3J0UHJvZ3Jlc3MoZW5jLT5waWNfLCAxMDAsICZlbmMtPnBlcmNlbnRfKTsgIC8vIGRvbmUhCisjZW5kaWYgIC8vICFkZWZpbmVkKFdFQlBfRElTQUJMRV9TVEFUUykKK30KKworaW50IFdlYlBFbmNvZGluZ1NldEVycm9yKGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUEVuY29kaW5nRXJyb3IgZXJyb3IpIHsKKyAgYXNzZXJ0KChpbnQpZXJyb3IgPCBWUDhfRU5DX0VSUk9SX0xBU1QpOworICBhc3NlcnQoKGludCllcnJvciA+PSBWUDhfRU5DX09LKTsKKyAgKChXZWJQUGljdHVyZSopcGljKS0+ZXJyb3JfY29kZSA9IGVycm9yOworICByZXR1cm4gMDsKK30KKworaW50IFdlYlBSZXBvcnRQcm9ncmVzcyhjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGVyY2VudCwgaW50KiBjb25zdCBwZXJjZW50X3N0b3JlKSB7CisgIGlmIChwZXJjZW50X3N0b3JlICE9IE5VTEwgJiYgcGVyY2VudCAhPSAqcGVyY2VudF9zdG9yZSkgeworICAgICpwZXJjZW50X3N0b3JlID0gcGVyY2VudDsKKyAgICBpZiAocGljLT5wcm9ncmVzc19ob29rICYmICFwaWMtPnByb2dyZXNzX2hvb2socGVyY2VudCwgcGljKSkgeworICAgICAgLy8gdXNlciBhYm9ydCByZXF1ZXN0ZWQKKyAgICAgIFdlYlBFbmNvZGluZ1NldEVycm9yKHBpYywgVlA4X0VOQ19FUlJPUl9VU0VSX0FCT1JUKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorICByZXR1cm4gMTsgIC8vIG9rCit9CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgV2ViUEVuY29kZShjb25zdCBXZWJQQ29uZmlnKiBjb25maWcsIFdlYlBQaWN0dXJlKiBwaWMpIHsKKyAgaW50IG9rID0gMDsKKyAgaWYgKHBpYyA9PSBOVUxMKSByZXR1cm4gMDsKKworICBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWMsIFZQOF9FTkNfT0spOyAgLy8gYWxsIG9rIHNvIGZhcgorICBpZiAoY29uZmlnID09IE5VTEwpIHsgIC8vIGJhZCBwYXJhbXMKKyAgICByZXR1cm4gV2ViUEVuY29kaW5nU2V0RXJyb3IocGljLCBWUDhfRU5DX0VSUk9SX05VTExfUEFSQU1FVEVSKTsKKyAgfQorICBpZiAoIVdlYlBWYWxpZGF0ZUNvbmZpZyhjb25maWcpKSB7CisgICAgcmV0dXJuIFdlYlBFbmNvZGluZ1NldEVycm9yKHBpYywgVlA4X0VOQ19FUlJPUl9JTlZBTElEX0NPTkZJR1VSQVRJT04pOworICB9CisgIGlmIChwaWMtPndpZHRoIDw9IDAgfHwgcGljLT5oZWlnaHQgPD0gMCkgeworICAgIHJldHVybiBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWMsIFZQOF9FTkNfRVJST1JfQkFEX0RJTUVOU0lPTik7CisgIH0KKyAgaWYgKHBpYy0+d2lkdGggPiBXRUJQX01BWF9ESU1FTlNJT04gfHwgcGljLT5oZWlnaHQgPiBXRUJQX01BWF9ESU1FTlNJT04pIHsKKyAgICByZXR1cm4gV2ViUEVuY29kaW5nU2V0RXJyb3IocGljLCBWUDhfRU5DX0VSUk9SX0JBRF9ESU1FTlNJT04pOworICB9CisKKyAgaWYgKHBpYy0+c3RhdHMgIT0gTlVMTCkgbWVtc2V0KHBpYy0+c3RhdHMsIDAsIHNpemVvZigqcGljLT5zdGF0cykpOworCisgIGlmICghY29uZmlnLT5sb3NzbGVzcykgeworICAgIFZQOEVuY29kZXIqIGVuYyA9IE5VTEw7CisKKyAgICBpZiAocGljLT51c2VfYXJnYiB8fCBwaWMtPnkgPT0gTlVMTCB8fCBwaWMtPnUgPT0gTlVMTCB8fCBwaWMtPnYgPT0gTlVMTCkgeworICAgICAgLy8gTWFrZSBzdXJlIHdlIGhhdmUgWVVWQSBzYW1wbGVzLgorICAgICAgaWYgKGNvbmZpZy0+dXNlX3NoYXJwX3l1diB8fCAoY29uZmlnLT5wcmVwcm9jZXNzaW5nICYgNCkpIHsKKyAgICAgICAgaWYgKCFXZWJQUGljdHVyZVNoYXJwQVJHQlRvWVVWQShwaWMpKSB7CisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZsb2F0IGRpdGhlcmluZyA9IDAuZjsKKyAgICAgICAgaWYgKGNvbmZpZy0+cHJlcHJvY2Vzc2luZyAmIDIpIHsKKyAgICAgICAgICBjb25zdCBmbG9hdCB4ID0gY29uZmlnLT5xdWFsaXR5IC8gMTAwLmY7CisgICAgICAgICAgY29uc3QgZmxvYXQgeDIgPSB4ICogeDsKKyAgICAgICAgICAvLyBzbG93bHkgZGVjcmVhc2luZyBmcm9tIG1heCBkaXRoZXJpbmcgYXQgbG93IHF1YWxpdHkgKHEtPjApCisgICAgICAgICAgLy8gdG8gMC41IGRpdGhlcmluZyBhbXBsaXR1ZGUgYXQgaGlnaCBxdWFsaXR5IChxLT4xMDApCisgICAgICAgICAgZGl0aGVyaW5nID0gMS4wZiArICgwLjVmIC0gMS4wZikgKiB4MiAqIHgyOworICAgICAgICB9CisgICAgICAgIGlmICghV2ViUFBpY3R1cmVBUkdCVG9ZVVZBRGl0aGVyZWQocGljLCBXRUJQX1lVVjQyMCwgZGl0aGVyaW5nKSkgeworICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCFjb25maWctPmV4YWN0KSB7CisgICAgICBXZWJQQ2xlYW51cFRyYW5zcGFyZW50QXJlYShwaWMpOworICAgIH0KKworICAgIGVuYyA9IEluaXRWUDhFbmNvZGVyKGNvbmZpZywgcGljKTsKKyAgICBpZiAoZW5jID09IE5VTEwpIHJldHVybiAwOyAgLy8gcGljLT5lcnJvciBpcyBhbHJlYWR5IHNldC4KKyAgICAvLyBOb3RlOiBlYWNoIG9mIHRoZSB0YXNrcyBiZWxvdyBhY2NvdW50IGZvciAyMCUgaW4gdGhlIHByb2dyZXNzIHJlcG9ydC4KKyAgICBvayA9IFZQOEVuY0FuYWx5emUoZW5jKTsKKworICAgIC8vIEFuYWx5c2lzIGlzIGRvbmUsIHByb2NlZWQgdG8gYWN0dWFsIGNvZGluZy4KKyAgICBvayA9IG9rICYmIFZQOEVuY1N0YXJ0QWxwaGEoZW5jKTsgICAvLyBwb3NzaWJseSBkb25lIGluIHBhcmFsbGVsCisgICAgaWYgKCFlbmMtPnVzZV90b2tlbnNfKSB7CisgICAgICBvayA9IG9rICYmIFZQOEVuY0xvb3AoZW5jKTsKKyAgICB9IGVsc2UgeworICAgICAgb2sgPSBvayAmJiBWUDhFbmNUb2tlbkxvb3AoZW5jKTsKKyAgICB9CisgICAgb2sgPSBvayAmJiBWUDhFbmNGaW5pc2hBbHBoYShlbmMpOworCisgICAgb2sgPSBvayAmJiBWUDhFbmNXcml0ZShlbmMpOworICAgIFN0b3JlU3RhdHMoZW5jKTsKKyAgICBpZiAoIW9rKSB7CisgICAgICBWUDhFbmNGcmVlQml0V3JpdGVycyhlbmMpOworICAgIH0KKyAgICBvayAmPSBEZWxldGVWUDhFbmNvZGVyKGVuYyk7ICAvLyBtdXN0IGFsd2F5cyBiZSBjYWxsZWQsIGV2ZW4gaWYgIW9rCisgIH0gZWxzZSB7CisgICAgLy8gTWFrZSBzdXJlIHdlIGhhdmUgQVJHQiBzYW1wbGVzLgorICAgIGlmIChwaWMtPmFyZ2IgPT0gTlVMTCAmJiAhV2ViUFBpY3R1cmVZVVZBVG9BUkdCKHBpYykpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICghY29uZmlnLT5leGFjdCkgeworICAgICAgV2ViUENsZWFudXBUcmFuc3BhcmVudEFyZWFMb3NzbGVzcyhwaWMpOworICAgIH0KKworICAgIG9rID0gVlA4TEVuY29kZUltYWdlKGNvbmZpZywgcGljKTsgIC8vIFNldHMgcGljLT5lcnJvciBpbiBjYXNlIG9mIHByb2JsZW0uCisgIH0KKworICByZXR1cm4gb2s7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvbGlid2VicC5wYy5pbiBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9saWJ3ZWJwLnBjLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczM2JiNmQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvbGlid2VicC5wYy5pbgpAQCAtMCwwICsxLDExIEBACitwcmVmaXg9QHByZWZpeEAKK2V4ZWNfcHJlZml4PUBleGVjX3ByZWZpeEAKK2xpYmRpcj1AbGliZGlyQAoraW5jbHVkZWRpcj1AaW5jbHVkZWRpckAKKworTmFtZTogbGlid2VicAorRGVzY3JpcHRpb246IExpYnJhcnkgZm9yIHRoZSBXZWJQIGdyYXBoaWNzIGZvcm1hdAorVmVyc2lvbjogQFBBQ0tBR0VfVkVSU0lPTkAKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9CitMaWJzOiAtTCR7bGliZGlyfSAtbHdlYnAKK0xpYnMucHJpdmF0ZTogLWxtIEBQVEhSRUFEX0NGTEFHU0AgQFBUSFJFQURfTElCU0AKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9saWJ3ZWJwLnJjIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2xpYndlYnAucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU1NDEyNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9saWJ3ZWJwLnJjCkBAIC0wLDAgKzEsNDEgQEAKKyNkZWZpbmUgQVBTVFVESU9fUkVBRE9OTFlfU1lNQk9MUworI2luY2x1ZGUgIndpbnJlcy5oIgorI3VuZGVmIEFQU1RVRElPX1JFQURPTkxZX1NZTUJPTFMKKworI2lmICFkZWZpbmVkKEFGWF9SRVNPVVJDRV9ETEwpIHx8IGRlZmluZWQoQUZYX1RBUkdfRU5VKQorTEFOR1VBR0UgTEFOR19FTkdMSVNILCBTVUJMQU5HX0VOR0xJU0hfVVMKKworVlNfVkVSU0lPTl9JTkZPIFZFUlNJT05JTkZPCisgRklMRVZFUlNJT04gMSwwLDAsMAorIFBST0RVQ1RWRVJTSU9OIDEsMCwwLDAKKyBGSUxFRkxBR1NNQVNLIDB4M2ZMCisjaWZkZWYgX0RFQlVHCisgRklMRUZMQUdTIDB4MUwKKyNlbHNlCisgRklMRUZMQUdTIDB4MEwKKyNlbmRpZgorIEZJTEVPUyAweDQwMDA0TAorIEZJTEVUWVBFIDB4MkwKKyBGSUxFU1VCVFlQRSAweDBMCitCRUdJTgorICAgIEJMT0NLICJTdHJpbmdGaWxlSW5mbyIKKyAgICBCRUdJTgorICAgICAgICBCTE9DSyAiMDQwOTA0YjAiCisgICAgICAgIEJFR0lOCisgICAgICAgICAgICBWQUxVRSAiQ29tcGFueU5hbWUiLCAiR29vZ2xlLCBJbmMuIgorICAgICAgICAgICAgVkFMVUUgIkZpbGVEZXNjcmlwdGlvbiIsICJsaWJ3ZWJwIERMTCIKKyAgICAgICAgICAgIFZBTFVFICJGaWxlVmVyc2lvbiIsICIxLjAuMCIKKyAgICAgICAgICAgIFZBTFVFICJJbnRlcm5hbE5hbWUiLCAibGlid2VicC5kbGwiCisgICAgICAgICAgICBWQUxVRSAiTGVnYWxDb3B5cmlnaHQiLCAiQ29weXJpZ2h0IChDKSAyMDE4IgorICAgICAgICAgICAgVkFMVUUgIk9yaWdpbmFsRmlsZW5hbWUiLCAibGlid2VicC5kbGwiCisgICAgICAgICAgICBWQUxVRSAiUHJvZHVjdE5hbWUiLCAiV2ViUCBJbWFnZSBDb2RlYyIKKyAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0VmVyc2lvbiIsICIxLjAuMCIKKyAgICAgICAgRU5ECisgICAgRU5ECisgICAgQkxPQ0sgIlZhckZpbGVJbmZvIgorICAgIEJFR0lOCisgICAgICAgIFZBTFVFICJUcmFuc2xhdGlvbiIsIDB4NDA5LCAxMjAwCisgICAgRU5ECitFTkQKKworI2VuZGlmICAgIC8vIEVuZ2xpc2ggKFVuaXRlZCBTdGF0ZXMpIHJlc291cmNlcwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2xpYndlYnBkZWNvZGVyLnBjLmluIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2xpYndlYnBkZWNvZGVyLnBjLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZjY0N2EKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvbGlid2VicGRlY29kZXIucGMuaW4KQEAgLTAsMCArMSwxMSBAQAorcHJlZml4PUBwcmVmaXhACitleGVjX3ByZWZpeD1AZXhlY19wcmVmaXhACitsaWJkaXI9QGxpYmRpckAKK2luY2x1ZGVkaXI9QGluY2x1ZGVkaXJACisKK05hbWU6IGxpYndlYnBkZWNvZGVyCitEZXNjcmlwdGlvbjogTGlicmFyeSBmb3IgdGhlIFdlYlAgZ3JhcGhpY3MgZm9ybWF0IChkZWNvZGUgb25seSkKK1ZlcnNpb246IEBQQUNLQUdFX1ZFUlNJT05ACitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfQorTGliczogLUwke2xpYmRpcn0gLWx3ZWJwZGVjb2RlcgorTGlicy5wcml2YXRlOiAtbG0gQFBUSFJFQURfQ0ZMQUdTQCBAUFRIUkVBRF9MSUJTQApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2xpYndlYnBkZWNvZGVyLnJjIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2xpYndlYnBkZWNvZGVyLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMmRlZjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvbGlid2VicGRlY29kZXIucmMKQEAgLTAsMCArMSw0MSBAQAorI2RlZmluZSBBUFNUVURJT19SRUFET05MWV9TWU1CT0xTCisjaW5jbHVkZSAid2lucmVzLmgiCisjdW5kZWYgQVBTVFVESU9fUkVBRE9OTFlfU1lNQk9MUworCisjaWYgIWRlZmluZWQoQUZYX1JFU09VUkNFX0RMTCkgfHwgZGVmaW5lZChBRlhfVEFSR19FTlUpCitMQU5HVUFHRSBMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9VUworCitWU19WRVJTSU9OX0lORk8gVkVSU0lPTklORk8KKyBGSUxFVkVSU0lPTiAxLDAsMCwwCisgUFJPRFVDVFZFUlNJT04gMSwwLDAsMAorIEZJTEVGTEFHU01BU0sgMHgzZkwKKyNpZmRlZiBfREVCVUcKKyBGSUxFRkxBR1MgMHgxTAorI2Vsc2UKKyBGSUxFRkxBR1MgMHgwTAorI2VuZGlmCisgRklMRU9TIDB4NDAwMDRMCisgRklMRVRZUEUgMHgyTAorIEZJTEVTVUJUWVBFIDB4MEwKK0JFR0lOCisgICAgQkxPQ0sgIlN0cmluZ0ZpbGVJbmZvIgorICAgIEJFR0lOCisgICAgICAgIEJMT0NLICIwNDA5MDRiMCIKKyAgICAgICAgQkVHSU4KKyAgICAgICAgICAgIFZBTFVFICJDb21wYW55TmFtZSIsICJHb29nbGUsIEluYy4iCisgICAgICAgICAgICBWQUxVRSAiRmlsZURlc2NyaXB0aW9uIiwgImxpYndlYnBkZWNvZGVyIERMTCIKKyAgICAgICAgICAgIFZBTFVFICJGaWxlVmVyc2lvbiIsICIxLjAuMCIKKyAgICAgICAgICAgIFZBTFVFICJJbnRlcm5hbE5hbWUiLCAibGlid2VicGRlY29kZXIuZGxsIgorICAgICAgICAgICAgVkFMVUUgIkxlZ2FsQ29weXJpZ2h0IiwgIkNvcHlyaWdodCAoQykgMjAxOCIKKyAgICAgICAgICAgIFZBTFVFICJPcmlnaW5hbEZpbGVuYW1lIiwgImxpYndlYnBkZWNvZGVyLmRsbCIKKyAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0TmFtZSIsICJXZWJQIEltYWdlIERlY29kZXIiCisgICAgICAgICAgICBWQUxVRSAiUHJvZHVjdFZlcnNpb24iLCAiMS4wLjAiCisgICAgICAgIEVORAorICAgIEVORAorICAgIEJMT0NLICJWYXJGaWxlSW5mbyIKKyAgICBCRUdJTgorICAgICAgICBWQUxVRSAiVHJhbnNsYXRpb24iLCAweDQwOSwgMTIwMAorICAgIEVORAorRU5ECisKKyNlbmRpZiAgICAvLyBFbmdsaXNoIChVbml0ZWQgU3RhdGVzKSByZXNvdXJjZXMKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9tdXgvTWFrZWZpbGUuYW0gYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvbXV4L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0N2JjY2UKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvbXV4L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMjIgQEAKK0FNX0NQUEZMQUdTICs9IC1JJCh0b3BfYnVpbGRkaXIpIC1JJCh0b3Bfc3JjZGlyKQorbGliX0xUTElCUkFSSUVTID0gbGlid2VicG11eC5sYQorCitsaWJ3ZWJwbXV4X2xhX1NPVVJDRVMgPQorbGlid2VicG11eF9sYV9TT1VSQ0VTICs9IGFuaW1fZW5jb2RlLmMKK2xpYndlYnBtdXhfbGFfU09VUkNFUyArPSBhbmltaS5oCitsaWJ3ZWJwbXV4X2xhX1NPVVJDRVMgKz0gbXV4ZWRpdC5jCitsaWJ3ZWJwbXV4X2xhX1NPVVJDRVMgKz0gbXV4aS5oCitsaWJ3ZWJwbXV4X2xhX1NPVVJDRVMgKz0gbXV4aW50ZXJuYWwuYworbGlid2VicG11eF9sYV9TT1VSQ0VTICs9IG11eHJlYWQuYworCitsaWJ3ZWJwbXV4aW5jbHVkZV9IRUFERVJTID0KK2xpYndlYnBtdXhpbmNsdWRlX0hFQURFUlMgKz0gLi4vd2VicC9tdXguaAorbGlid2VicG11eGluY2x1ZGVfSEVBREVSUyArPSAuLi93ZWJwL211eF90eXBlcy5oCitsaWJ3ZWJwbXV4aW5jbHVkZV9IRUFERVJTICs9IC4uL3dlYnAvdHlwZXMuaAorbm9pbnN0X0hFQURFUlMgPQorbm9pbnN0X0hFQURFUlMgKz0gLi4vd2VicC9mb3JtYXRfY29uc3RhbnRzLmgKKworbGlid2VicG11eF9sYV9MSUJBREQgPSAuLi9saWJ3ZWJwLmxhCitsaWJ3ZWJwbXV4X2xhX0xERkxBR1MgPSAtbm8tdW5kZWZpbmVkIC12ZXJzaW9uLWluZm8gMzoyOjAgLWxtCitsaWJ3ZWJwbXV4aW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvd2VicAorcGtnY29uZmlnX0RBVEEgPSBsaWJ3ZWJwbXV4LnBjCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvbXV4L2FuaW1fZW5jb2RlLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvbXV4L2FuaW1fZW5jb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JlOTkwNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9tdXgvYW5pbV9lbmNvZGUuYwpAQCAtMCwwICsxLDE1ODEgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgQW5pbUVuY29kZXIgaW1wbGVtZW50YXRpb24uCisvLworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8bWF0aC5oPiAgICAvLyBmb3IgcG93KCkKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPiAgLy8gZm9yIGFicygpCisKKyNpbmNsdWRlICJzcmMvbXV4L2FuaW1pLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL3dlYnAvZGVjb2RlLmgiCisjaW5jbHVkZSAic3JjL3dlYnAvZW5jb2RlLmgiCisjaW5jbHVkZSAic3JjL3dlYnAvZm9ybWF0X2NvbnN0YW50cy5oIgorI2luY2x1ZGUgInNyYy93ZWJwL211eC5oIgorCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVIgPCAxOTAwCisjZGVmaW5lIHNucHJpbnRmIF9zbnByaW50ZgorI2VuZGlmCisKKyNkZWZpbmUgRVJST1JfU1RSX01BWF9MRU5HVEggMTAwCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbnRlcm5hbCBzdHJ1Y3RzLgorCisvLyBTdG9yZXMgZnJhbWUgcmVjdGFuZ2xlIGRpbWVuc2lvbnMuCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCB4X29mZnNldF8sIHlfb2Zmc2V0Xywgd2lkdGhfLCBoZWlnaHRfOworfSBGcmFtZVJlY3RhbmdsZTsKKworLy8gVXNlZCB0byBzdG9yZSB0d28gY2FuZGlkYXRlcyBvZiBlbmNvZGVkIGRhdGEgZm9yIGFuIGFuaW1hdGlvbiBmcmFtZS4gT25lIG9mCisvLyB0aGUgdHdvIHdpbGwgYmUgY2hvc2VuIGxhdGVyLgordHlwZWRlZiBzdHJ1Y3QgeworICBXZWJQTXV4RnJhbWVJbmZvIHN1Yl9mcmFtZV87ICAvLyBFbmNvZGVkIGZyYW1lIHJlY3RhbmdsZS4KKyAgV2ViUE11eEZyYW1lSW5mbyBrZXlfZnJhbWVfOyAgLy8gRW5jb2RlZCBmcmFtZSBpZiBpdCBpcyBhIGtleS1mcmFtZS4KKyAgaW50IGlzX2tleV9mcmFtZV87ICAgICAgICAgICAgLy8gVHJ1ZSBpZiAna2V5X2ZyYW1lJyBoYXMgYmVlbiBjaG9zZW4uCit9IEVuY29kZWRGcmFtZTsKKworc3RydWN0IFdlYlBBbmltRW5jb2RlciB7CisgIGNvbnN0IGludCBjYW52YXNfd2lkdGhfOyAgICAgICAgICAgICAgICAgIC8vIENhbnZhcyB3aWR0aC4KKyAgY29uc3QgaW50IGNhbnZhc19oZWlnaHRfOyAgICAgICAgICAgICAgICAgLy8gQ2FudmFzIGhlaWdodC4KKyAgY29uc3QgV2ViUEFuaW1FbmNvZGVyT3B0aW9ucyBvcHRpb25zXzsgICAgLy8gR2xvYmFsIGVuY29kaW5nIG9wdGlvbnMuCisKKyAgRnJhbWVSZWN0YW5nbGUgcHJldl9yZWN0XzsgICAgICAgICAgLy8gUHJldmlvdXMgV2ViUCBmcmFtZSByZWN0YW5nbGUuCisgIFdlYlBDb25maWcgbGFzdF9jb25maWdfOyAgICAgICAgICAgIC8vIENhY2hlZCBpbiBjYXNlIGEgcmUtZW5jb2RlIGlzIG5lZWRlZC4KKyAgV2ViUENvbmZpZyBsYXN0X2NvbmZpZ19yZXZlcnNlZF87ICAgLy8gSWYgJ2xhc3RfY29uZmlnXycgdXNlcyBsb3NzbGVzcywgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGNvbmZpZyB1c2VzIGxvc3N5IGFuZCB2aWNlIHZlcnNhOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IHZhbGlkIGlmICdvcHRpb25zXy5hbGxvd19taXhlZCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgdHJ1ZS4KKworICBXZWJQUGljdHVyZSogY3Vycl9jYW52YXNfOyAgICAgICAgICAvLyBPbmx5IHBvaW50ZXI7IHdlIGRvbid0IG93biBtZW1vcnkuCisKKyAgLy8gQ2FudmFzIGJ1ZmZlcnMuCisgIFdlYlBQaWN0dXJlIGN1cnJfY2FudmFzX2NvcHlfOyAgICAgIC8vIFBvc3NpYmx5IG1vZGlmaWVkIGN1cnJlbnQgY2FudmFzLgorICBpbnQgY3Vycl9jYW52YXNfY29weV9tb2RpZmllZF87ICAgICAvLyBUcnVlIGlmIHBpeGVscyBpbiAnY3Vycl9jYW52YXNfY29weV8nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpZmZlciBmcm9tIHRob3NlIGluICdjdXJyX2NhbnZhc18nLgorCisgIFdlYlBQaWN0dXJlIHByZXZfY2FudmFzXzsgICAgICAgICAgIC8vIFByZXZpb3VzIGNhbnZhcy4KKyAgV2ViUFBpY3R1cmUgcHJldl9jYW52YXNfZGlzcG9zZWRfOyAgLy8gUHJldmlvdXMgY2FudmFzIGRpc3Bvc2VkIHRvIGJhY2tncm91bmQuCisKKyAgLy8gRW5jb2RlZCBkYXRhLgorICBFbmNvZGVkRnJhbWUqIGVuY29kZWRfZnJhbWVzXzsgICAgICAvLyBBcnJheSBvZiBlbmNvZGVkIGZyYW1lcy4KKyAgc2l6ZV90IHNpemVfOyAgICAgICAgICAgICAvLyBOdW1iZXIgb2YgYWxsb2NhdGVkIGZyYW1lcy4KKyAgc2l6ZV90IHN0YXJ0XzsgICAgICAgICAgICAvLyBGcmFtZSBzdGFydCBpbmRleC4KKyAgc2l6ZV90IGNvdW50XzsgICAgICAgICAgICAvLyBOdW1iZXIgb2YgdmFsaWQgZnJhbWVzLgorICBzaXplX3QgZmx1c2hfY291bnRfOyAgICAgIC8vIElmID4wLCAnZmx1c2hfY291bnQnIGZyYW1lcyBzdGFydGluZyBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gJ3N0YXJ0JyBhcmUgcmVhZHkgdG8gYmUgYWRkZWQgdG8gbXV4LgorCisgIC8vIGtleS1mcmFtZSByZWxhdGVkLgorICBpbnQ2NF90IGJlc3RfZGVsdGFfOyAgICAgIC8vIG1pbihjYW52YXMgc2l6ZSAtIGZyYW1lIHNpemUpIG92ZXIgdGhlIGZyYW1lcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDYW4gYmUgbmVnYXRpdmUgaW4gY2VydGFpbiBjYXNlcyBkdWUgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cmFuc3BhcmVudCBwaXhlbHMgaW4gYSBmcmFtZS4KKyAgaW50IGtleWZyYW1lXzsgICAgICAgICAgICAvLyBJbmRleCBvZiBzZWxlY3RlZCBrZXktZnJhbWUgcmVsYXRpdmUgdG8gJ3N0YXJ0XycuCisgIGludCBjb3VudF9zaW5jZV9rZXlfZnJhbWVfOyAgICAgLy8gRnJhbWVzIHNlZW4gc2luY2UgdGhlIGxhc3Qga2V5LWZyYW1lLgorCisgIGludCBmaXJzdF90aW1lc3RhbXBfOyAgICAgICAgICAgLy8gVGltZXN0YW1wIG9mIHRoZSBmaXJzdCBmcmFtZS4KKyAgaW50IHByZXZfdGltZXN0YW1wXzsgICAgICAgICAgICAvLyBUaW1lc3RhbXAgb2YgdGhlIGxhc3QgYWRkZWQgZnJhbWUuCisgIGludCBwcmV2X2NhbmRpZGF0ZV91bmRlY2lkZWRfOyAgLy8gVHJ1ZSBpZiBpdCdzIG5vdCB5ZXQgZGVjaWRlZCBpZiBwcmV2aW91cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyYW1lIHdvdWxkIGJlIGEgc3ViLWZyYW1lIG9yIGEga2V5LWZyYW1lLgorCisgIC8vIE1pc2MuCisgIGludCBpc19maXJzdF9mcmFtZV87ICAvLyBUcnVlIGlmIGZpcnN0IGZyYW1lIGlzIHlldCB0byBiZSBhZGRlZC9iZWluZyBhZGRlZC4KKyAgaW50IGdvdF9udWxsX2ZyYW1lXzsgIC8vIFRydWUgaWYgV2ViUEFuaW1FbmNvZGVyQWRkKCkgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggYSBOVUxMIGZyYW1lLgorCisgIHNpemVfdCBpbl9mcmFtZV9jb3VudF87ICAgLy8gTnVtYmVyIG9mIGlucHV0IGZyYW1lcyBwcm9jZXNzZWQgc28gZmFyLgorICBzaXplX3Qgb3V0X2ZyYW1lX2NvdW50XzsgIC8vIE51bWJlciBvZiBmcmFtZXMgYWRkZWQgdG8gbXV4IHNvIGZhci4gVGhpcyBtYXkgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaWZmZXJlbnQgZnJvbSAnaW5fZnJhbWVfY291bnRfJyBkdWUgdG8gbWVyZ2luZy4KKworICBXZWJQTXV4KiBtdXhfOyAgICAgICAgLy8gTXV4ZXIgdG8gYXNzZW1ibGUgdGhlIFdlYlAgYml0c3RyZWFtLgorICBjaGFyIGVycm9yX3N0cl9bRVJST1JfU1RSX01BWF9MRU5HVEhdOyAgLy8gRXJyb3Igc3RyaW5nLiBFbXB0eSBpZiBubyBlcnJvci4KK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBMaWZlIG9mIFdlYlBBbmltRW5jb2RlciBvYmplY3QuCisKKyNkZWZpbmUgREVMVEFfSU5GSU5JVFkgICAgICAoMVVMTCA8PCAzMikKKyNkZWZpbmUgS0VZRlJBTUVfTk9ORSAgICAgICAoLTEpCisKKy8vIFJlc2V0IHRoZSBjb3VudGVycyBpbiB0aGUgV2ViUEFuaW1FbmNvZGVyLgorc3RhdGljIHZvaWQgUmVzZXRDb3VudGVycyhXZWJQQW5pbUVuY29kZXIqIGNvbnN0IGVuYykgeworICBlbmMtPnN0YXJ0XyA9IDA7CisgIGVuYy0+Y291bnRfID0gMDsKKyAgZW5jLT5mbHVzaF9jb3VudF8gPSAwOworICBlbmMtPmJlc3RfZGVsdGFfID0gREVMVEFfSU5GSU5JVFk7CisgIGVuYy0+a2V5ZnJhbWVfID0gS0VZRlJBTUVfTk9ORTsKK30KKworc3RhdGljIHZvaWQgRGlzYWJsZUtleWZyYW1lcyhXZWJQQW5pbUVuY29kZXJPcHRpb25zKiBjb25zdCBlbmNfb3B0aW9ucykgeworICBlbmNfb3B0aW9ucy0+a21heCA9IElOVF9NQVg7CisgIGVuY19vcHRpb25zLT5rbWluID0gZW5jX29wdGlvbnMtPmttYXggLSAxOworfQorCisjZGVmaW5lIE1BWF9DQUNIRURfRlJBTUVTIDMwCisKK3N0YXRpYyB2b2lkIFNhbml0aXplRW5jb2Rlck9wdGlvbnMoV2ViUEFuaW1FbmNvZGVyT3B0aW9ucyogY29uc3QgZW5jX29wdGlvbnMpIHsKKyAgaW50IHByaW50X3dhcm5pbmcgPSBlbmNfb3B0aW9ucy0+dmVyYm9zZTsKKworICBpZiAoZW5jX29wdGlvbnMtPm1pbmltaXplX3NpemUpIHsKKyAgICBEaXNhYmxlS2V5ZnJhbWVzKGVuY19vcHRpb25zKTsKKyAgfQorCisgIGlmIChlbmNfb3B0aW9ucy0+a21heCA9PSAxKSB7ICAvLyBBbGwgZnJhbWVzIHdpbGwgYmUga2V5LWZyYW1lcy4KKyAgICBlbmNfb3B0aW9ucy0+a21pbiA9IDA7CisgICAgZW5jX29wdGlvbnMtPmttYXggPSAwOworICAgIHJldHVybjsKKyAgfSBlbHNlIGlmIChlbmNfb3B0aW9ucy0+a21heCA8PSAwKSB7CisgICAgRGlzYWJsZUtleWZyYW1lcyhlbmNfb3B0aW9ucyk7CisgICAgcHJpbnRfd2FybmluZyA9IDA7CisgIH0KKworICBpZiAoZW5jX29wdGlvbnMtPmttaW4gPj0gZW5jX29wdGlvbnMtPmttYXgpIHsKKyAgICBlbmNfb3B0aW9ucy0+a21pbiA9IGVuY19vcHRpb25zLT5rbWF4IC0gMTsKKyAgICBpZiAocHJpbnRfd2FybmluZykgeworICAgICAgZnByaW50ZihzdGRlcnIsICJXQVJOSU5HOiBTZXR0aW5nIGttaW4gPSAlZCwgc28gdGhhdCBrbWluIDwga21heC5cbiIsCisgICAgICAgICAgICAgIGVuY19vcHRpb25zLT5rbWluKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgY29uc3QgaW50IGttaW5fbGltaXQgPSBlbmNfb3B0aW9ucy0+a21heCAvIDIgKyAxOworICAgIGlmIChlbmNfb3B0aW9ucy0+a21pbiA8IGttaW5fbGltaXQgJiYga21pbl9saW1pdCA8IGVuY19vcHRpb25zLT5rbWF4KSB7CisgICAgICAvLyBUaGlzIGVuc3VyZXMgdGhhdCBlbmMua2V5ZnJhbWUgKyBrbWluID49IGttYXggaXMgYWx3YXlzIHRydWUuIFNvLCB3ZQorICAgICAgLy8gY2FuIGZsdXNoIGFsbCB0aGUgZnJhbWVzIGluIHRoZSAnY291bnRfc2luY2Vfa2V5X2ZyYW1lID09IGttYXgnIGNhc2UuCisgICAgICBlbmNfb3B0aW9ucy0+a21pbiA9IGttaW5fbGltaXQ7CisgICAgICBpZiAocHJpbnRfd2FybmluZykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAiV0FSTklORzogU2V0dGluZyBrbWluID0gJWQsIHNvIHRoYXQga21pbiA+PSBrbWF4IC8gMiArIDEuXG4iLAorICAgICAgICAgICAgICAgIGVuY19vcHRpb25zLT5rbWluKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLy8gTGltaXQgdGhlIG1heCBudW1iZXIgb2YgZnJhbWVzIHRoYXQgYXJlIGFsbG9jYXRlZC4KKyAgaWYgKGVuY19vcHRpb25zLT5rbWF4IC0gZW5jX29wdGlvbnMtPmttaW4gPiBNQVhfQ0FDSEVEX0ZSQU1FUykgeworICAgIGVuY19vcHRpb25zLT5rbWluID0gZW5jX29wdGlvbnMtPmttYXggLSBNQVhfQ0FDSEVEX0ZSQU1FUzsKKyAgICBpZiAocHJpbnRfd2FybmluZykgeworICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICJXQVJOSU5HOiBTZXR0aW5nIGttaW4gPSAlZCwgc28gdGhhdCBrbWF4IC0ga21pbiA8PSAlZC5cbiIsCisgICAgICAgICAgICAgIGVuY19vcHRpb25zLT5rbWluLCBNQVhfQ0FDSEVEX0ZSQU1FUyk7CisgICAgfQorICB9CisgIGFzc2VydChlbmNfb3B0aW9ucy0+a21pbiA8IGVuY19vcHRpb25zLT5rbWF4KTsKK30KKworI3VuZGVmIE1BWF9DQUNIRURfRlJBTUVTCisKK3N0YXRpYyB2b2lkIERlZmF1bHRFbmNvZGVyT3B0aW9ucyhXZWJQQW5pbUVuY29kZXJPcHRpb25zKiBjb25zdCBlbmNfb3B0aW9ucykgeworICBlbmNfb3B0aW9ucy0+YW5pbV9wYXJhbXMubG9vcF9jb3VudCA9IDA7CisgIGVuY19vcHRpb25zLT5hbmltX3BhcmFtcy5iZ2NvbG9yID0gMHhmZmZmZmZmZjsgIC8vIFdoaXRlLgorICBlbmNfb3B0aW9ucy0+bWluaW1pemVfc2l6ZSA9IDA7CisgIERpc2FibGVLZXlmcmFtZXMoZW5jX29wdGlvbnMpOworICBlbmNfb3B0aW9ucy0+YWxsb3dfbWl4ZWQgPSAwOworICBlbmNfb3B0aW9ucy0+dmVyYm9zZSA9IDA7Cit9CisKK2ludCBXZWJQQW5pbUVuY29kZXJPcHRpb25zSW5pdEludGVybmFsKFdlYlBBbmltRW5jb2Rlck9wdGlvbnMqIGVuY19vcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFiaV92ZXJzaW9uKSB7CisgIGlmIChlbmNfb3B0aW9ucyA9PSBOVUxMIHx8CisgICAgICBXRUJQX0FCSV9JU19JTkNPTVBBVElCTEUoYWJpX3ZlcnNpb24sIFdFQlBfTVVYX0FCSV9WRVJTSU9OKSkgeworICAgIHJldHVybiAwOworICB9CisgIERlZmF1bHRFbmNvZGVyT3B0aW9ucyhlbmNfb3B0aW9ucyk7CisgIHJldHVybiAxOworfQorCisvLyBUaGlzIHN0YXJ0aW5nIHZhbHVlIGlzIG1vcmUgZml0IHRvIFdlYlBDbGVhbnVwVHJhbnNwYXJlbnRBcmVhTG9zc2xlc3MoKS4KKyNkZWZpbmUgVFJBTlNQQVJFTlRfQ09MT1IgICAweDAwMDAwMDAwCisKK3N0YXRpYyB2b2lkIENsZWFyUmVjdGFuZ2xlKFdlYlBQaWN0dXJlKiBjb25zdCBwaWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsIGludCB0b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICBpbnQgajsKKyAgZm9yIChqID0gdG9wOyBqIDwgdG9wICsgaGVpZ2h0OyArK2opIHsKKyAgICB1aW50MzJfdCogY29uc3QgZHN0ID0gcGljdHVyZS0+YXJnYiArIGogKiBwaWN0dXJlLT5hcmdiX3N0cmlkZTsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSBsZWZ0OyBpIDwgbGVmdCArIHdpZHRoOyArK2kpIHsKKyAgICAgIGRzdFtpXSA9IFRSQU5TUEFSRU5UX0NPTE9SOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBXZWJQVXRpbENsZWFyUGljKFdlYlBQaWN0dXJlKiBjb25zdCBwaWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGcmFtZVJlY3RhbmdsZSogY29uc3QgcmVjdCkgeworICBpZiAocmVjdCAhPSBOVUxMKSB7CisgICAgQ2xlYXJSZWN0YW5nbGUocGljdHVyZSwgcmVjdC0+eF9vZmZzZXRfLCByZWN0LT55X29mZnNldF8sCisgICAgICAgICAgICAgICAgICAgcmVjdC0+d2lkdGhfLCByZWN0LT5oZWlnaHRfKTsKKyAgfSBlbHNlIHsKKyAgICBDbGVhclJlY3RhbmdsZShwaWN0dXJlLCAwLCAwLCBwaWN0dXJlLT53aWR0aCwgcGljdHVyZS0+aGVpZ2h0KTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBNYXJrTm9FcnJvcihXZWJQQW5pbUVuY29kZXIqIGNvbnN0IGVuYykgeworICBlbmMtPmVycm9yX3N0cl9bMF0gPSAnXDAnOyAgLy8gRW1wdHkgc3RyaW5nLgorfQorCitzdGF0aWMgdm9pZCBNYXJrRXJyb3IoV2ViUEFuaW1FbmNvZGVyKiBjb25zdCBlbmMsIGNvbnN0IGNoYXIqIHN0cikgeworICBpZiAoc25wcmludGYoZW5jLT5lcnJvcl9zdHJfLCBFUlJPUl9TVFJfTUFYX0xFTkdUSCwgIiVzLiIsIHN0cikgPCAwKSB7CisgICAgYXNzZXJ0KDApOyAgLy8gRklYIE1FIQorICB9Cit9CisKK3N0YXRpYyB2b2lkIE1hcmtFcnJvcjIoV2ViUEFuaW1FbmNvZGVyKiBjb25zdCBlbmMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN0ciwgaW50IGVycm9yX2NvZGUpIHsKKyAgaWYgKHNucHJpbnRmKGVuYy0+ZXJyb3Jfc3RyXywgRVJST1JfU1RSX01BWF9MRU5HVEgsICIlczogJWQuIiwgc3RyLAorICAgICAgICAgICAgICAgZXJyb3JfY29kZSkgPCAwKSB7CisgICAgYXNzZXJ0KDApOyAgLy8gRklYIE1FIQorICB9Cit9CisKK1dlYlBBbmltRW5jb2RlciogV2ViUEFuaW1FbmNvZGVyTmV3SW50ZXJuYWwoCisgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBjb25zdCBXZWJQQW5pbUVuY29kZXJPcHRpb25zKiBlbmNfb3B0aW9ucywKKyAgICBpbnQgYWJpX3ZlcnNpb24pIHsKKyAgV2ViUEFuaW1FbmNvZGVyKiBlbmM7CisKKyAgaWYgKFdFQlBfQUJJX0lTX0lOQ09NUEFUSUJMRShhYmlfdmVyc2lvbiwgV0VCUF9NVVhfQUJJX1ZFUlNJT04pKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDAgfHwKKyAgICAgICh3aWR0aCAqICh1aW50NjRfdCloZWlnaHQpID49IE1BWF9JTUFHRV9BUkVBKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBlbmMgPSAoV2ViUEFuaW1FbmNvZGVyKilXZWJQU2FmZUNhbGxvYygxLCBzaXplb2YoKmVuYykpOworICBpZiAoZW5jID09IE5VTEwpIHJldHVybiBOVUxMOworICAvLyBzYW5pdHkgaW5pdHMsIHNvIHdlIGNhbiBjYWxsIFdlYlBBbmltRW5jb2RlckRlbGV0ZSgpOgorICBlbmMtPmVuY29kZWRfZnJhbWVzXyA9IE5VTEw7CisgIGVuYy0+bXV4XyA9IE5VTEw7CisgIE1hcmtOb0Vycm9yKGVuYyk7CisKKyAgLy8gRGltZW5zaW9ucyBhbmQgb3B0aW9ucy4KKyAgKihpbnQqKSZlbmMtPmNhbnZhc193aWR0aF8gPSB3aWR0aDsKKyAgKihpbnQqKSZlbmMtPmNhbnZhc19oZWlnaHRfID0gaGVpZ2h0OworICBpZiAoZW5jX29wdGlvbnMgIT0gTlVMTCkgeworICAgICooV2ViUEFuaW1FbmNvZGVyT3B0aW9ucyopJmVuYy0+b3B0aW9uc18gPSAqZW5jX29wdGlvbnM7CisgICAgU2FuaXRpemVFbmNvZGVyT3B0aW9ucygoV2ViUEFuaW1FbmNvZGVyT3B0aW9ucyopJmVuYy0+b3B0aW9uc18pOworICB9IGVsc2UgeworICAgIERlZmF1bHRFbmNvZGVyT3B0aW9ucygoV2ViUEFuaW1FbmNvZGVyT3B0aW9ucyopJmVuYy0+b3B0aW9uc18pOworICB9CisKKyAgLy8gQ2FudmFzIGJ1ZmZlcnMuCisgIGlmICghV2ViUFBpY3R1cmVJbml0KCZlbmMtPmN1cnJfY2FudmFzX2NvcHlfKSB8fAorICAgICAgIVdlYlBQaWN0dXJlSW5pdCgmZW5jLT5wcmV2X2NhbnZhc18pIHx8CisgICAgICAhV2ViUFBpY3R1cmVJbml0KCZlbmMtPnByZXZfY2FudmFzX2Rpc3Bvc2VkXykpIHsKKyAgICBnb3RvIEVycjsKKyAgfQorICBlbmMtPmN1cnJfY2FudmFzX2NvcHlfLndpZHRoID0gd2lkdGg7CisgIGVuYy0+Y3Vycl9jYW52YXNfY29weV8uaGVpZ2h0ID0gaGVpZ2h0OworICBlbmMtPmN1cnJfY2FudmFzX2NvcHlfLnVzZV9hcmdiID0gMTsKKyAgaWYgKCFXZWJQUGljdHVyZUFsbG9jKCZlbmMtPmN1cnJfY2FudmFzX2NvcHlfKSB8fAorICAgICAgIVdlYlBQaWN0dXJlQ29weSgmZW5jLT5jdXJyX2NhbnZhc19jb3B5XywgJmVuYy0+cHJldl9jYW52YXNfKSB8fAorICAgICAgIVdlYlBQaWN0dXJlQ29weSgmZW5jLT5jdXJyX2NhbnZhc19jb3B5XywgJmVuYy0+cHJldl9jYW52YXNfZGlzcG9zZWRfKSkgeworICAgIGdvdG8gRXJyOworICB9CisgIFdlYlBVdGlsQ2xlYXJQaWMoJmVuYy0+cHJldl9jYW52YXNfLCBOVUxMKTsKKyAgZW5jLT5jdXJyX2NhbnZhc19jb3B5X21vZGlmaWVkXyA9IDE7CisKKyAgLy8gRW5jb2RlZCBmcmFtZXMuCisgIFJlc2V0Q291bnRlcnMoZW5jKTsKKyAgLy8gTm90ZTogb25lIGV4dHJhIHN0b3JhZ2UgaXMgZm9yIHRoZSBwcmV2aW91cyBmcmFtZS4KKyAgZW5jLT5zaXplXyA9IGVuYy0+b3B0aW9uc18ua21heCAtIGVuYy0+b3B0aW9uc18ua21pbiArIDE7CisgIC8vIFdlIG5lZWQgc3BhY2UgZm9yIGF0IGxlYXN0IDIgZnJhbWVzLiBCdXQgd2hlbiBrbWluLCBrbWF4IGFyZSBib3RoIHplcm8sCisgIC8vIGVuYy0+c2l6ZV8gd2lsbCBiZSAxLiBTbyB3ZSBoYW5kbGUgdGhhdCBzcGVjaWFsIGNhc2UgYmVsb3cuCisgIGlmIChlbmMtPnNpemVfIDwgMikgZW5jLT5zaXplXyA9IDI7CisgIGVuYy0+ZW5jb2RlZF9mcmFtZXNfID0KKyAgICAgIChFbmNvZGVkRnJhbWUqKVdlYlBTYWZlQ2FsbG9jKGVuYy0+c2l6ZV8sIHNpemVvZigqZW5jLT5lbmNvZGVkX2ZyYW1lc18pKTsKKyAgaWYgKGVuYy0+ZW5jb2RlZF9mcmFtZXNfID09IE5VTEwpIGdvdG8gRXJyOworCisgIGVuYy0+bXV4XyA9IFdlYlBNdXhOZXcoKTsKKyAgaWYgKGVuYy0+bXV4XyA9PSBOVUxMKSBnb3RvIEVycjsKKworICBlbmMtPmNvdW50X3NpbmNlX2tleV9mcmFtZV8gPSAwOworICBlbmMtPmZpcnN0X3RpbWVzdGFtcF8gPSAwOworICBlbmMtPnByZXZfdGltZXN0YW1wXyA9IDA7CisgIGVuYy0+cHJldl9jYW5kaWRhdGVfdW5kZWNpZGVkXyA9IDA7CisgIGVuYy0+aXNfZmlyc3RfZnJhbWVfID0gMTsKKyAgZW5jLT5nb3RfbnVsbF9mcmFtZV8gPSAwOworCisgIHJldHVybiBlbmM7ICAvLyBBbGwgT0suCisKKyBFcnI6CisgIFdlYlBBbmltRW5jb2RlckRlbGV0ZShlbmMpOworICByZXR1cm4gTlVMTDsKK30KKworLy8gUmVsZWFzZSB0aGUgZGF0YSBjb250YWluZWQgYnkgJ2VuY29kZWRfZnJhbWUnLgorc3RhdGljIHZvaWQgRnJhbWVSZWxlYXNlKEVuY29kZWRGcmFtZSogY29uc3QgZW5jb2RlZF9mcmFtZSkgeworICBpZiAoZW5jb2RlZF9mcmFtZSAhPSBOVUxMKSB7CisgICAgV2ViUERhdGFDbGVhcigmZW5jb2RlZF9mcmFtZS0+c3ViX2ZyYW1lXy5iaXRzdHJlYW0pOworICAgIFdlYlBEYXRhQ2xlYXIoJmVuY29kZWRfZnJhbWUtPmtleV9mcmFtZV8uYml0c3RyZWFtKTsKKyAgICBtZW1zZXQoZW5jb2RlZF9mcmFtZSwgMCwgc2l6ZW9mKCplbmNvZGVkX2ZyYW1lKSk7CisgIH0KK30KKwordm9pZCBXZWJQQW5pbUVuY29kZXJEZWxldGUoV2ViUEFuaW1FbmNvZGVyKiBlbmMpIHsKKyAgaWYgKGVuYyAhPSBOVUxMKSB7CisgICAgV2ViUFBpY3R1cmVGcmVlKCZlbmMtPmN1cnJfY2FudmFzX2NvcHlfKTsKKyAgICBXZWJQUGljdHVyZUZyZWUoJmVuYy0+cHJldl9jYW52YXNfKTsKKyAgICBXZWJQUGljdHVyZUZyZWUoJmVuYy0+cHJldl9jYW52YXNfZGlzcG9zZWRfKTsKKyAgICBpZiAoZW5jLT5lbmNvZGVkX2ZyYW1lc18gIT0gTlVMTCkgeworICAgICAgc2l6ZV90IGk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgZW5jLT5zaXplXzsgKytpKSB7CisgICAgICAgIEZyYW1lUmVsZWFzZSgmZW5jLT5lbmNvZGVkX2ZyYW1lc19baV0pOworICAgICAgfQorICAgICAgV2ViUFNhZmVGcmVlKGVuYy0+ZW5jb2RlZF9mcmFtZXNfKTsKKyAgICB9CisgICAgV2ViUE11eERlbGV0ZShlbmMtPm11eF8pOworICAgIFdlYlBTYWZlRnJlZShlbmMpOworICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGcmFtZSBhZGRpdGlvbi4KKworLy8gUmV0dXJucyBjYWNoZWQgZnJhbWUgYXQgdGhlIGdpdmVuICdwb3NpdGlvbicuCitzdGF0aWMgRW5jb2RlZEZyYW1lKiBHZXRGcmFtZShjb25zdCBXZWJQQW5pbUVuY29kZXIqIGNvbnN0IGVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBwb3NpdGlvbikgeworICBhc3NlcnQoZW5jLT5zdGFydF8gKyBwb3NpdGlvbiA8IGVuYy0+c2l6ZV8pOworICByZXR1cm4gJmVuYy0+ZW5jb2RlZF9mcmFtZXNfW2VuYy0+c3RhcnRfICsgcG9zaXRpb25dOworfQorCit0eXBlZGVmIGludCAoKkNvbXBhcmVQaXhlbHNGdW5jKShjb25zdCB1aW50MzJfdCosIGludCwgY29uc3QgdWludDMyX3QqLCBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQsIGludCk7CisKKy8vIFJldHVybnMgdHJ1ZSBpZiAnbGVuZ3RoJyBudW1iZXIgb2YgcGl4ZWxzIGluICdzcmMnIGFuZCAnZHN0JyBhcmUgZXF1YWwsCisvLyBhc3N1bWluZyB0aGUgZ2l2ZW4gc3RlcCBzaXplcyBiZXR3ZWVuIHBpeGVscy4KKy8vICdtYXhfYWxsb3dlZF9kaWZmJyBpcyB1bnVzZWQgYW5kIG9ubHkgdGhlcmUgdG8gYWxsb3cgZnVuY3Rpb24gcG9pbnRlciB1c2UuCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IENvbXBhcmVQaXhlbHNMb3NzbGVzcyhjb25zdCB1aW50MzJfdCogc3JjLCBpbnQgc3JjX3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogZHN0LCBpbnQgZHN0X3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoLCBpbnQgbWF4X2FsbG93ZWRfZGlmZikgeworICAodm9pZCltYXhfYWxsb3dlZF9kaWZmOworICBhc3NlcnQobGVuZ3RoID4gMCk7CisgIHdoaWxlIChsZW5ndGgtLSA+IDApIHsKKyAgICBpZiAoKnNyYyAhPSAqZHN0KSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgc3JjICs9IHNyY19zdGVwOworICAgIGRzdCArPSBkc3Rfc3RlcDsKKyAgfQorICByZXR1cm4gMTsKK30KKworLy8gSGVscGVyIHRvIGNoZWNrIGlmIGVhY2ggY2hhbm5lbCBpbiAnc3JjJyBhbmQgJ2RzdCcgaXMgYXQgbW9zdCBvZmYgYnkKKy8vICdtYXhfYWxsb3dlZF9kaWZmJy4KK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgUGl4ZWxzQXJlU2ltaWxhcih1aW50MzJfdCBzcmMsIHVpbnQzMl90IGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X2FsbG93ZWRfZGlmZikgeworICBjb25zdCBpbnQgc3JjX2EgPSAoc3JjID4+IDI0KSAmIDB4ZmY7CisgIGNvbnN0IGludCBzcmNfciA9IChzcmMgPj4gMTYpICYgMHhmZjsKKyAgY29uc3QgaW50IHNyY19nID0gKHNyYyA+PiA4KSAmIDB4ZmY7CisgIGNvbnN0IGludCBzcmNfYiA9IChzcmMgPj4gMCkgJiAweGZmOworICBjb25zdCBpbnQgZHN0X2EgPSAoZHN0ID4+IDI0KSAmIDB4ZmY7CisgIGNvbnN0IGludCBkc3RfciA9IChkc3QgPj4gMTYpICYgMHhmZjsKKyAgY29uc3QgaW50IGRzdF9nID0gKGRzdCA+PiA4KSAmIDB4ZmY7CisgIGNvbnN0IGludCBkc3RfYiA9IChkc3QgPj4gMCkgJiAweGZmOworCisgIHJldHVybiAoc3JjX2EgPT0gZHN0X2EpICYmCisgICAgICAgICAoYWJzKHNyY19yIC0gZHN0X3IpICogZHN0X2EgPD0gKG1heF9hbGxvd2VkX2RpZmYgKiAyNTUpKSAmJgorICAgICAgICAgKGFicyhzcmNfZyAtIGRzdF9nKSAqIGRzdF9hIDw9IChtYXhfYWxsb3dlZF9kaWZmICogMjU1KSkgJiYKKyAgICAgICAgIChhYnMoc3JjX2IgLSBkc3RfYikgKiBkc3RfYSA8PSAobWF4X2FsbG93ZWRfZGlmZiAqIDI1NSkpOworfQorCisvLyBSZXR1cm5zIHRydWUgaWYgJ2xlbmd0aCcgbnVtYmVyIG9mIHBpeGVscyBpbiAnc3JjJyBhbmQgJ2RzdCcgYXJlIHdpdGhpbiBhbgorLy8gZXJyb3IgYm91bmQsIGFzc3VtaW5nIHRoZSBnaXZlbiBzdGVwIHNpemVzIGJldHdlZW4gcGl4ZWxzLgorc3RhdGljIFdFQlBfSU5MSU5FIGludCBDb21wYXJlUGl4ZWxzTG9zc3koY29uc3QgdWludDMyX3QqIHNyYywgaW50IHNyY19zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGRzdCwgaW50IGRzdF9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCwgaW50IG1heF9hbGxvd2VkX2RpZmYpIHsKKyAgYXNzZXJ0KGxlbmd0aCA+IDApOworICB3aGlsZSAobGVuZ3RoLS0gPiAwKSB7CisgICAgaWYgKCFQaXhlbHNBcmVTaW1pbGFyKCpzcmMsICpkc3QsIG1heF9hbGxvd2VkX2RpZmYpKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgc3JjICs9IHNyY19zdGVwOworICAgIGRzdCArPSBkc3Rfc3RlcDsKKyAgfQorICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBJc0VtcHR5UmVjdChjb25zdCBGcmFtZVJlY3RhbmdsZSogY29uc3QgcmVjdCkgeworICByZXR1cm4gKHJlY3QtPndpZHRoXyA9PSAwKSB8fCAocmVjdC0+aGVpZ2h0XyA9PSAwKTsKK30KKworc3RhdGljIGludCBRdWFsaXR5VG9NYXhEaWZmKGZsb2F0IHF1YWxpdHkpIHsKKyAgY29uc3QgZG91YmxlIHZhbCA9IHBvdyhxdWFsaXR5IC8gMTAwLiwgMC41KTsKKyAgY29uc3QgZG91YmxlIG1heF9kaWZmID0gMzEgKiAoMSAtIHZhbCkgKyAxICogdmFsOworICByZXR1cm4gKGludCkobWF4X2RpZmYgKyAwLjUpOworfQorCisvLyBBc3N1bWVzIHRoYXQgYW4gaW5pdGlhbCB2YWxpZCBndWVzcyBvZiBjaGFuZ2UgcmVjdGFuZ2xlICdyZWN0JyBpcyBwYXNzZWQuCitzdGF0aWMgdm9pZCBNaW5pbWl6ZUNoYW5nZVJlY3RhbmdsZShjb25zdCBXZWJQUGljdHVyZSogY29uc3Qgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lUmVjdGFuZ2xlKiBjb25zdCByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX2xvc3NsZXNzLCBmbG9hdCBxdWFsaXR5KSB7CisgIGludCBpLCBqOworICBjb25zdCBDb21wYXJlUGl4ZWxzRnVuYyBjb21wYXJlX3BpeGVscyA9CisgICAgICBpc19sb3NzbGVzcyA/IENvbXBhcmVQaXhlbHNMb3NzbGVzcyA6IENvbXBhcmVQaXhlbHNMb3NzeTsKKyAgY29uc3QgaW50IG1heF9hbGxvd2VkX2RpZmZfbG9zc3kgPSBRdWFsaXR5VG9NYXhEaWZmKHF1YWxpdHkpOworICBjb25zdCBpbnQgbWF4X2FsbG93ZWRfZGlmZiA9IGlzX2xvc3NsZXNzID8gMCA6IG1heF9hbGxvd2VkX2RpZmZfbG9zc3k7CisKKyAgLy8gU2FuaXR5IGNoZWNrcy4KKyAgYXNzZXJ0KHNyYy0+d2lkdGggPT0gZHN0LT53aWR0aCAmJiBzcmMtPmhlaWdodCA9PSBkc3QtPmhlaWdodCk7CisgIGFzc2VydChyZWN0LT54X29mZnNldF8gKyByZWN0LT53aWR0aF8gPD0gZHN0LT53aWR0aCk7CisgIGFzc2VydChyZWN0LT55X29mZnNldF8gKyByZWN0LT5oZWlnaHRfIDw9IGRzdC0+aGVpZ2h0KTsKKworICAvLyBMZWZ0IGJvdW5kYXJ5LgorICBmb3IgKGkgPSByZWN0LT54X29mZnNldF87IGkgPCByZWN0LT54X29mZnNldF8gKyByZWN0LT53aWR0aF87ICsraSkgeworICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBzcmNfYXJnYiA9CisgICAgICAgICZzcmMtPmFyZ2JbcmVjdC0+eV9vZmZzZXRfICogc3JjLT5hcmdiX3N0cmlkZSArIGldOworICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBkc3RfYXJnYiA9CisgICAgICAgICZkc3QtPmFyZ2JbcmVjdC0+eV9vZmZzZXRfICogZHN0LT5hcmdiX3N0cmlkZSArIGldOworICAgIGlmIChjb21wYXJlX3BpeGVscyhzcmNfYXJnYiwgc3JjLT5hcmdiX3N0cmlkZSwgZHN0X2FyZ2IsIGRzdC0+YXJnYl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgIHJlY3QtPmhlaWdodF8sIG1heF9hbGxvd2VkX2RpZmYpKSB7CisgICAgICAtLXJlY3QtPndpZHRoXzsgIC8vIFJlZHVuZGFudCBjb2x1bW4uCisgICAgICArK3JlY3QtPnhfb2Zmc2V0XzsKKyAgICB9IGVsc2UgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmIChyZWN0LT53aWR0aF8gPT0gMCkgZ290byBOb0NoYW5nZTsKKworICAvLyBSaWdodCBib3VuZGFyeS4KKyAgZm9yIChpID0gcmVjdC0+eF9vZmZzZXRfICsgcmVjdC0+d2lkdGhfIC0gMTsgaSA+PSByZWN0LT54X29mZnNldF87IC0taSkgeworICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBzcmNfYXJnYiA9CisgICAgICAgICZzcmMtPmFyZ2JbcmVjdC0+eV9vZmZzZXRfICogc3JjLT5hcmdiX3N0cmlkZSArIGldOworICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBkc3RfYXJnYiA9CisgICAgICAgICZkc3QtPmFyZ2JbcmVjdC0+eV9vZmZzZXRfICogZHN0LT5hcmdiX3N0cmlkZSArIGldOworICAgIGlmIChjb21wYXJlX3BpeGVscyhzcmNfYXJnYiwgc3JjLT5hcmdiX3N0cmlkZSwgZHN0X2FyZ2IsIGRzdC0+YXJnYl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgIHJlY3QtPmhlaWdodF8sIG1heF9hbGxvd2VkX2RpZmYpKSB7CisgICAgICAtLXJlY3QtPndpZHRoXzsgIC8vIFJlZHVuZGFudCBjb2x1bW4uCisgICAgfSBlbHNlIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBpZiAocmVjdC0+d2lkdGhfID09IDApIGdvdG8gTm9DaGFuZ2U7CisKKyAgLy8gVG9wIGJvdW5kYXJ5LgorICBmb3IgKGogPSByZWN0LT55X29mZnNldF87IGogPCByZWN0LT55X29mZnNldF8gKyByZWN0LT5oZWlnaHRfOyArK2opIHsKKyAgICBjb25zdCB1aW50MzJfdCogY29uc3Qgc3JjX2FyZ2IgPQorICAgICAgICAmc3JjLT5hcmdiW2ogKiBzcmMtPmFyZ2Jfc3RyaWRlICsgcmVjdC0+eF9vZmZzZXRfXTsKKyAgICBjb25zdCB1aW50MzJfdCogY29uc3QgZHN0X2FyZ2IgPQorICAgICAgICAmZHN0LT5hcmdiW2ogKiBkc3QtPmFyZ2Jfc3RyaWRlICsgcmVjdC0+eF9vZmZzZXRfXTsKKyAgICBpZiAoY29tcGFyZV9waXhlbHMoc3JjX2FyZ2IsIDEsIGRzdF9hcmdiLCAxLCByZWN0LT53aWR0aF8sCisgICAgICAgICAgICAgICAgICAgICAgIG1heF9hbGxvd2VkX2RpZmYpKSB7CisgICAgICAtLXJlY3QtPmhlaWdodF87ICAvLyBSZWR1bmRhbnQgcm93LgorICAgICAgKytyZWN0LT55X29mZnNldF87CisgICAgfSBlbHNlIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBpZiAocmVjdC0+aGVpZ2h0XyA9PSAwKSBnb3RvIE5vQ2hhbmdlOworCisgIC8vIEJvdHRvbSBib3VuZGFyeS4KKyAgZm9yIChqID0gcmVjdC0+eV9vZmZzZXRfICsgcmVjdC0+aGVpZ2h0XyAtIDE7IGogPj0gcmVjdC0+eV9vZmZzZXRfOyAtLWopIHsKKyAgICBjb25zdCB1aW50MzJfdCogY29uc3Qgc3JjX2FyZ2IgPQorICAgICAgICAmc3JjLT5hcmdiW2ogKiBzcmMtPmFyZ2Jfc3RyaWRlICsgcmVjdC0+eF9vZmZzZXRfXTsKKyAgICBjb25zdCB1aW50MzJfdCogY29uc3QgZHN0X2FyZ2IgPQorICAgICAgICAmZHN0LT5hcmdiW2ogKiBkc3QtPmFyZ2Jfc3RyaWRlICsgcmVjdC0+eF9vZmZzZXRfXTsKKyAgICBpZiAoY29tcGFyZV9waXhlbHMoc3JjX2FyZ2IsIDEsIGRzdF9hcmdiLCAxLCByZWN0LT53aWR0aF8sCisgICAgICAgICAgICAgICAgICAgICAgIG1heF9hbGxvd2VkX2RpZmYpKSB7CisgICAgICAtLXJlY3QtPmhlaWdodF87ICAvLyBSZWR1bmRhbnQgcm93LgorICAgIH0gZWxzZSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKHJlY3QtPmhlaWdodF8gPT0gMCkgZ290byBOb0NoYW5nZTsKKworICBpZiAoSXNFbXB0eVJlY3QocmVjdCkpIHsKKyBOb0NoYW5nZToKKyAgICByZWN0LT54X29mZnNldF8gPSAwOworICAgIHJlY3QtPnlfb2Zmc2V0XyA9IDA7CisgICAgcmVjdC0+d2lkdGhfID0gMDsKKyAgICByZWN0LT5oZWlnaHRfID0gMDsKKyAgfQorfQorCisvLyBTbmFwIHJlY3RhbmdsZSB0byBldmVuIG9mZnNldHMgKGFuZCBhZGp1c3QgZGltZW5zaW9ucyBpZiBuZWVkZWQpLgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgU25hcFRvRXZlbk9mZnNldHMoRnJhbWVSZWN0YW5nbGUqIGNvbnN0IHJlY3QpIHsKKyAgcmVjdC0+d2lkdGhfICs9IChyZWN0LT54X29mZnNldF8gJiAxKTsKKyAgcmVjdC0+aGVpZ2h0XyArPSAocmVjdC0+eV9vZmZzZXRfICYgMSk7CisgIHJlY3QtPnhfb2Zmc2V0XyAmPSB+MTsKKyAgcmVjdC0+eV9vZmZzZXRfICY9IH4xOworfQorCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCBzaG91bGRfdHJ5XzsgICAgICAgICAgICAgICAvLyBTaG91bGQgdHJ5IHRoaXMgc2V0IG9mIHBhcmFtZXRlcnMuCisgIGludCBlbXB0eV9yZWN0X2FsbG93ZWRfOyAgICAgICAvLyBGcmFtZSB3aXRoIGVtcHR5IHJlY3RhbmdsZSBjYW4gYmUgc2tpcHBlZC4KKyAgRnJhbWVSZWN0YW5nbGUgcmVjdF9sbF87ICAgICAgIC8vIEZyYW1lIHJlY3RhbmdsZSBmb3IgbG9zc2xlc3MgY29tcHJlc3Npb24uCisgIFdlYlBQaWN0dXJlIHN1Yl9mcmFtZV9sbF87ICAgICAvLyBTdWItZnJhbWUgcGljIGZvciBsb3NzbGVzcyBjb21wcmVzc2lvbi4KKyAgRnJhbWVSZWN0YW5nbGUgcmVjdF9sb3NzeV87ICAgIC8vIEZyYW1lIHJlY3RhbmdsZSBmb3IgbG9zc3kgY29tcHJlc3Npb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb3VsZCBiZSBzbWFsbGVyIHRoYW4gcmVjdF9sbF8gYXMgcGl4ZWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIHNtYWxsIGRpZmZzIGNhbiBiZSBpZ25vcmVkLgorICBXZWJQUGljdHVyZSBzdWJfZnJhbWVfbG9zc3lfOyAgLy8gU3ViLWZyYW1lIHBpYyBmb3IgbG9zc2xlc3MgY29tcHJlc3Npb24uCit9IFN1YkZyYW1lUGFyYW1zOworCitzdGF0aWMgaW50IFN1YkZyYW1lUGFyYW1zSW5pdChTdWJGcmFtZVBhcmFtcyogY29uc3QgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNob3VsZF90cnksIGludCBlbXB0eV9yZWN0X2FsbG93ZWQpIHsKKyAgcGFyYW1zLT5zaG91bGRfdHJ5XyA9IHNob3VsZF90cnk7CisgIHBhcmFtcy0+ZW1wdHlfcmVjdF9hbGxvd2VkXyA9IGVtcHR5X3JlY3RfYWxsb3dlZDsKKyAgaWYgKCFXZWJQUGljdHVyZUluaXQoJnBhcmFtcy0+c3ViX2ZyYW1lX2xsXykgfHwKKyAgICAgICFXZWJQUGljdHVyZUluaXQoJnBhcmFtcy0+c3ViX2ZyYW1lX2xvc3N5XykpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgU3ViRnJhbWVQYXJhbXNGcmVlKFN1YkZyYW1lUGFyYW1zKiBjb25zdCBwYXJhbXMpIHsKKyAgV2ViUFBpY3R1cmVGcmVlKCZwYXJhbXMtPnN1Yl9mcmFtZV9sbF8pOworICBXZWJQUGljdHVyZUZyZWUoJnBhcmFtcy0+c3ViX2ZyYW1lX2xvc3N5Xyk7Cit9CisKKy8vIEdpdmVuIHByZXZpb3VzIGFuZCBjdXJyZW50IGNhbnZhcywgcGlja3MgdGhlIG9wdGltYWwgcmVjdGFuZ2xlIGZvciB0aGUKKy8vIGN1cnJlbnQgZnJhbWUgYmFzZWQgb24gJ2lzX2xvc3NsZXNzJyBhbmQgb3RoZXIgcGFyYW1ldGVycy4gQXNzdW1lcyB0aGF0IHRoZQorLy8gaW5pdGlhbCBndWVzcyAncmVjdCcgaXMgdmFsaWQuCitzdGF0aWMgaW50IEdldFN1YlJlY3QoY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHByZXZfY2FudmFzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBjdXJyX2NhbnZhcywgaW50IGlzX2tleV9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgaXNfZmlyc3RfZnJhbWUsIGludCBlbXB0eV9yZWN0X2FsbG93ZWQsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX2xvc3NsZXNzLCBmbG9hdCBxdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgIEZyYW1lUmVjdGFuZ2xlKiBjb25zdCByZWN0LAorICAgICAgICAgICAgICAgICAgICAgIFdlYlBQaWN0dXJlKiBjb25zdCBzdWJfZnJhbWUpIHsKKyAgaWYgKCFpc19rZXlfZnJhbWUgfHwgaXNfZmlyc3RfZnJhbWUpIHsgIC8vIE9wdGltaXplIGZyYW1lIHJlY3RhbmdsZS4KKyAgICAvLyBOb3RlOiBUaGlzIGJlaGF2ZXMgYXMgZXhwZWN0ZWQgZm9yIGZpcnN0IGZyYW1lLCBhcyAncHJldl9jYW52YXMnIGlzCisgICAgLy8gaW5pdGlhbGl6ZWQgdG8gYSBmdWxseSB0cmFuc3BhcmVudCBjYW52YXMgaW4gdGhlIGJlZ2lubmluZy4KKyAgICBNaW5pbWl6ZUNoYW5nZVJlY3RhbmdsZShwcmV2X2NhbnZhcywgY3Vycl9jYW52YXMsIHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfbG9zc2xlc3MsIHF1YWxpdHkpOworICB9CisKKyAgaWYgKElzRW1wdHlSZWN0KHJlY3QpKSB7CisgICAgaWYgKGVtcHR5X3JlY3RfYWxsb3dlZCkgeyAgLy8gTm8gbmVlZCB0byBnZXQgJ3N1Yl9mcmFtZScuCisgICAgICByZXR1cm4gMTsKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAvLyBGb3JjZSBhIDF4MSByZWN0YW5nbGUuCisgICAgICByZWN0LT53aWR0aF8gPSAxOworICAgICAgcmVjdC0+aGVpZ2h0XyA9IDE7CisgICAgICBhc3NlcnQocmVjdC0+eF9vZmZzZXRfID09IDApOworICAgICAgYXNzZXJ0KHJlY3QtPnlfb2Zmc2V0XyA9PSAwKTsKKyAgICB9CisgIH0KKworICBTbmFwVG9FdmVuT2Zmc2V0cyhyZWN0KTsKKyAgcmV0dXJuIFdlYlBQaWN0dXJlVmlldyhjdXJyX2NhbnZhcywgcmVjdC0+eF9vZmZzZXRfLCByZWN0LT55X29mZnNldF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC0+d2lkdGhfLCByZWN0LT5oZWlnaHRfLCBzdWJfZnJhbWUpOworfQorCisvLyBQaWNrcyBvcHRpbWFsIGZyYW1lIHJlY3RhbmdsZSBmb3IgYm90aCBsb3NzbGVzcyBhbmQgbG9zc3kgY29tcHJlc3Npb24uIFRoZQorLy8gaW5pdGlhbCBndWVzcyBmb3IgZnJhbWUgcmVjdGFuZ2xlcyB3aWxsIGJlIHRoZSBmdWxsIGNhbnZhcy4KK3N0YXRpYyBpbnQgR2V0U3ViUmVjdHMoY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHByZXZfY2FudmFzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQUGljdHVyZSogY29uc3QgY3Vycl9jYW52YXMsIGludCBpc19rZXlfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBpc19maXJzdF9mcmFtZSwgZmxvYXQgcXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgU3ViRnJhbWVQYXJhbXMqIGNvbnN0IHBhcmFtcykgeworICAvLyBMb3NzbGVzcyBmcmFtZSByZWN0YW5nbGUuCisgIHBhcmFtcy0+cmVjdF9sbF8ueF9vZmZzZXRfID0gMDsKKyAgcGFyYW1zLT5yZWN0X2xsXy55X29mZnNldF8gPSAwOworICBwYXJhbXMtPnJlY3RfbGxfLndpZHRoXyA9IGN1cnJfY2FudmFzLT53aWR0aDsKKyAgcGFyYW1zLT5yZWN0X2xsXy5oZWlnaHRfID0gY3Vycl9jYW52YXMtPmhlaWdodDsKKyAgaWYgKCFHZXRTdWJSZWN0KHByZXZfY2FudmFzLCBjdXJyX2NhbnZhcywgaXNfa2V5X2ZyYW1lLCBpc19maXJzdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgIHBhcmFtcy0+ZW1wdHlfcmVjdF9hbGxvd2VkXywgMSwgcXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICZwYXJhbXMtPnJlY3RfbGxfLCAmcGFyYW1zLT5zdWJfZnJhbWVfbGxfKSkgeworICAgIHJldHVybiAwOworICB9CisgIC8vIExvc3N5IGZyYW1lIHJlY3RhbmdsZS4KKyAgcGFyYW1zLT5yZWN0X2xvc3N5XyA9IHBhcmFtcy0+cmVjdF9sbF87ICAvLyBzZWVkIHdpdGggbG9zc2xlc3MgcmVjdC4KKyAgcmV0dXJuIEdldFN1YlJlY3QocHJldl9jYW52YXMsIGN1cnJfY2FudmFzLCBpc19rZXlfZnJhbWUsIGlzX2ZpcnN0X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPmVtcHR5X3JlY3RfYWxsb3dlZF8sIDAsIHF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICZwYXJhbXMtPnJlY3RfbG9zc3lfLCAmcGFyYW1zLT5zdWJfZnJhbWVfbG9zc3lfKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBjbGlwKGludCB2LCBpbnQgbWluX3YsIGludCBtYXhfdikgeworICByZXR1cm4gKHYgPCBtaW5fdikgPyBtaW5fdiA6ICh2ID4gbWF4X3YpID8gbWF4X3YgOiB2OworfQorCitpbnQgV2ViUEFuaW1FbmNvZGVyUmVmaW5lUmVjdCgKKyAgICBjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcHJldl9jYW52YXMsIGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBjdXJyX2NhbnZhcywKKyAgICBpbnQgaXNfbG9zc2xlc3MsIGZsb2F0IHF1YWxpdHksIGludCogY29uc3QgeF9vZmZzZXQsIGludCogY29uc3QgeV9vZmZzZXQsCisgICAgaW50KiBjb25zdCB3aWR0aCwgaW50KiBjb25zdCBoZWlnaHQpIHsKKyAgRnJhbWVSZWN0YW5nbGUgcmVjdDsKKyAgY29uc3QgaW50IHJpZ2h0ID0gY2xpcCgqeF9vZmZzZXQgKyAqd2lkdGgsIDAsIGN1cnJfY2FudmFzLT53aWR0aCk7CisgIGNvbnN0IGludCBsZWZ0ID0gY2xpcCgqeF9vZmZzZXQsIDAsIGN1cnJfY2FudmFzLT53aWR0aCAtIDEpOworICBjb25zdCBpbnQgYm90dG9tID0gY2xpcCgqeV9vZmZzZXQgKyAqaGVpZ2h0LCAwLCBjdXJyX2NhbnZhcy0+aGVpZ2h0KTsKKyAgY29uc3QgaW50IHRvcCA9IGNsaXAoKnlfb2Zmc2V0LCAwLCBjdXJyX2NhbnZhcy0+aGVpZ2h0IC0gMSk7CisgIGlmIChwcmV2X2NhbnZhcyA9PSBOVUxMIHx8IGN1cnJfY2FudmFzID09IE5VTEwgfHwKKyAgICAgIHByZXZfY2FudmFzLT53aWR0aCAhPSBjdXJyX2NhbnZhcy0+d2lkdGggfHwKKyAgICAgIHByZXZfY2FudmFzLT5oZWlnaHQgIT0gY3Vycl9jYW52YXMtPmhlaWdodCB8fAorICAgICAgIXByZXZfY2FudmFzLT51c2VfYXJnYiB8fCAhY3Vycl9jYW52YXMtPnVzZV9hcmdiKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmVjdC54X29mZnNldF8gPSBsZWZ0OworICByZWN0Lnlfb2Zmc2V0XyA9IHRvcDsKKyAgcmVjdC53aWR0aF8gPSBjbGlwKHJpZ2h0IC0gbGVmdCwgMCwgY3Vycl9jYW52YXMtPndpZHRoIC0gcmVjdC54X29mZnNldF8pOworICByZWN0LmhlaWdodF8gPSBjbGlwKGJvdHRvbSAtIHRvcCwgMCwgY3Vycl9jYW52YXMtPmhlaWdodCAtIHJlY3QueV9vZmZzZXRfKTsKKyAgTWluaW1pemVDaGFuZ2VSZWN0YW5nbGUocHJldl9jYW52YXMsIGN1cnJfY2FudmFzLCAmcmVjdCwgaXNfbG9zc2xlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHkpOworICBTbmFwVG9FdmVuT2Zmc2V0cygmcmVjdCk7CisgICp4X29mZnNldCA9IHJlY3QueF9vZmZzZXRfOworICAqeV9vZmZzZXQgPSByZWN0Lnlfb2Zmc2V0XzsKKyAgKndpZHRoID0gcmVjdC53aWR0aF87CisgICpoZWlnaHQgPSByZWN0LmhlaWdodF87CisgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBEaXNwb3NlRnJhbWVSZWN0YW5nbGUoaW50IGRpc3Bvc2VfbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZyYW1lUmVjdGFuZ2xlKiBjb25zdCByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBQaWN0dXJlKiBjb25zdCBjdXJyX2NhbnZhcykgeworICBhc3NlcnQocmVjdCAhPSBOVUxMKTsKKyAgaWYgKGRpc3Bvc2VfbWV0aG9kID09IFdFQlBfTVVYX0RJU1BPU0VfQkFDS0dST1VORCkgeworICAgIFdlYlBVdGlsQ2xlYXJQaWMoY3Vycl9jYW52YXMsIHJlY3QpOworICB9Cit9CisKK3N0YXRpYyB1aW50MzJfdCBSZWN0QXJlYShjb25zdCBGcmFtZVJlY3RhbmdsZSogY29uc3QgcmVjdCkgeworICByZXR1cm4gKHVpbnQzMl90KXJlY3QtPndpZHRoXyAqIHJlY3QtPmhlaWdodF87Cit9CisKK3N0YXRpYyBpbnQgSXNMb3NzbGVzc0JsZW5kaW5nUG9zc2libGUoY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnJhbWVSZWN0YW5nbGUqIGNvbnN0IHJlY3QpIHsKKyAgaW50IGksIGo7CisgIGFzc2VydChzcmMtPndpZHRoID09IGRzdC0+d2lkdGggJiYgc3JjLT5oZWlnaHQgPT0gZHN0LT5oZWlnaHQpOworICBhc3NlcnQocmVjdC0+eF9vZmZzZXRfICsgcmVjdC0+d2lkdGhfIDw9IGRzdC0+d2lkdGgpOworICBhc3NlcnQocmVjdC0+eV9vZmZzZXRfICsgcmVjdC0+aGVpZ2h0XyA8PSBkc3QtPmhlaWdodCk7CisgIGZvciAoaiA9IHJlY3QtPnlfb2Zmc2V0XzsgaiA8IHJlY3QtPnlfb2Zmc2V0XyArIHJlY3QtPmhlaWdodF87ICsraikgeworICAgIGZvciAoaSA9IHJlY3QtPnhfb2Zmc2V0XzsgaSA8IHJlY3QtPnhfb2Zmc2V0XyArIHJlY3QtPndpZHRoXzsgKytpKSB7CisgICAgICBjb25zdCB1aW50MzJfdCBzcmNfcGl4ZWwgPSBzcmMtPmFyZ2JbaiAqIHNyYy0+YXJnYl9zdHJpZGUgKyBpXTsKKyAgICAgIGNvbnN0IHVpbnQzMl90IGRzdF9waXhlbCA9IGRzdC0+YXJnYltqICogZHN0LT5hcmdiX3N0cmlkZSArIGldOworICAgICAgY29uc3QgdWludDMyX3QgZHN0X2FscGhhID0gZHN0X3BpeGVsID4+IDI0OworICAgICAgaWYgKGRzdF9hbHBoYSAhPSAweGZmICYmIHNyY19waXhlbCAhPSBkc3RfcGl4ZWwpIHsKKyAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCBpZiB3ZSB1c2UgYmxlbmRpbmcsIHdlIGNhbid0IGF0dGFpbiB0aGUgZGVzaXJlZAorICAgICAgICAvLyAnZHN0X3BpeGVsJyB2YWx1ZSBmb3IgdGhpcyBwaXhlbC4gU28sIGJsZW5kaW5nIGlzIG5vdCBwb3NzaWJsZS4KKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IElzTG9zc3lCbGVuZGluZ1Bvc3NpYmxlKGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZyYW1lUmVjdGFuZ2xlKiBjb25zdCByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBxdWFsaXR5KSB7CisgIGNvbnN0IGludCBtYXhfYWxsb3dlZF9kaWZmX2xvc3N5ID0gUXVhbGl0eVRvTWF4RGlmZihxdWFsaXR5KTsKKyAgaW50IGksIGo7CisgIGFzc2VydChzcmMtPndpZHRoID09IGRzdC0+d2lkdGggJiYgc3JjLT5oZWlnaHQgPT0gZHN0LT5oZWlnaHQpOworICBhc3NlcnQocmVjdC0+eF9vZmZzZXRfICsgcmVjdC0+d2lkdGhfIDw9IGRzdC0+d2lkdGgpOworICBhc3NlcnQocmVjdC0+eV9vZmZzZXRfICsgcmVjdC0+aGVpZ2h0XyA8PSBkc3QtPmhlaWdodCk7CisgIGZvciAoaiA9IHJlY3QtPnlfb2Zmc2V0XzsgaiA8IHJlY3QtPnlfb2Zmc2V0XyArIHJlY3QtPmhlaWdodF87ICsraikgeworICAgIGZvciAoaSA9IHJlY3QtPnhfb2Zmc2V0XzsgaSA8IHJlY3QtPnhfb2Zmc2V0XyArIHJlY3QtPndpZHRoXzsgKytpKSB7CisgICAgICBjb25zdCB1aW50MzJfdCBzcmNfcGl4ZWwgPSBzcmMtPmFyZ2JbaiAqIHNyYy0+YXJnYl9zdHJpZGUgKyBpXTsKKyAgICAgIGNvbnN0IHVpbnQzMl90IGRzdF9waXhlbCA9IGRzdC0+YXJnYltqICogZHN0LT5hcmdiX3N0cmlkZSArIGldOworICAgICAgY29uc3QgdWludDMyX3QgZHN0X2FscGhhID0gZHN0X3BpeGVsID4+IDI0OworICAgICAgaWYgKGRzdF9hbHBoYSAhPSAweGZmICYmCisgICAgICAgICAgIVBpeGVsc0FyZVNpbWlsYXIoc3JjX3BpeGVsLCBkc3RfcGl4ZWwsIG1heF9hbGxvd2VkX2RpZmZfbG9zc3kpKSB7CisgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgaWYgd2UgdXNlIGJsZW5kaW5nLCB3ZSBjYW4ndCBhdHRhaW4gdGhlIGRlc2lyZWQKKyAgICAgICAgLy8gJ2RzdF9waXhlbCcgdmFsdWUgZm9yIHRoaXMgcGl4ZWwuIFNvLCBibGVuZGluZyBpcyBub3QgcG9zc2libGUuCisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gMTsKK30KKworLy8gRm9yIHBpeGVscyBpbiAncmVjdCcsIHJlcGxhY2UgdGhvc2UgcGl4ZWxzIGluICdkc3QnIHRoYXQgYXJlIHNhbWUgYXMgJ3NyYycgYnkKKy8vIHRyYW5zcGFyZW50IHBpeGVscy4KKy8vIFJldHVybnMgdHJ1ZSBpZiBhdCBsZWFzdCBvbmUgcGl4ZWwgZ2V0cyBtb2RpZmllZC4KK3N0YXRpYyBpbnQgSW5jcmVhc2VUcmFuc3BhcmVuY3koY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnJhbWVSZWN0YW5nbGUqIGNvbnN0IHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBQaWN0dXJlKiBjb25zdCBkc3QpIHsKKyAgaW50IGksIGo7CisgIGludCBtb2RpZmllZCA9IDA7CisgIGFzc2VydChzcmMgIT0gTlVMTCAmJiBkc3QgIT0gTlVMTCAmJiByZWN0ICE9IE5VTEwpOworICBhc3NlcnQoc3JjLT53aWR0aCA9PSBkc3QtPndpZHRoICYmIHNyYy0+aGVpZ2h0ID09IGRzdC0+aGVpZ2h0KTsKKyAgZm9yIChqID0gcmVjdC0+eV9vZmZzZXRfOyBqIDwgcmVjdC0+eV9vZmZzZXRfICsgcmVjdC0+aGVpZ2h0XzsgKytqKSB7CisgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IHBzcmMgPSBzcmMtPmFyZ2IgKyBqICogc3JjLT5hcmdiX3N0cmlkZTsKKyAgICB1aW50MzJfdCogY29uc3QgcGRzdCA9IGRzdC0+YXJnYiArIGogKiBkc3QtPmFyZ2Jfc3RyaWRlOworICAgIGZvciAoaSA9IHJlY3QtPnhfb2Zmc2V0XzsgaSA8IHJlY3QtPnhfb2Zmc2V0XyArIHJlY3QtPndpZHRoXzsgKytpKSB7CisgICAgICBpZiAocHNyY1tpXSA9PSBwZHN0W2ldICYmIHBkc3RbaV0gIT0gVFJBTlNQQVJFTlRfQ09MT1IpIHsKKyAgICAgICAgcGRzdFtpXSA9IFRSQU5TUEFSRU5UX0NPTE9SOworICAgICAgICBtb2RpZmllZCA9IDE7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBtb2RpZmllZDsKK30KKworI3VuZGVmIFRSQU5TUEFSRU5UX0NPTE9SCisKKy8vIFJlcGxhY2Ugc2ltaWxhciBibG9ja3Mgb2YgcGl4ZWxzIGJ5IGEgJ3NlZS10aHJvdWdoJyB0cmFuc3BhcmVudCBibG9jaworLy8gd2l0aCB1bmlmb3JtIGF2ZXJhZ2UgY29sb3IuCisvLyBBc3N1bWVzIGxvc3N5IGNvbXByZXNzaW9uIGlzIGJlaW5nIHVzZWQuCisvLyBSZXR1cm5zIHRydWUgaWYgYXQgbGVhc3Qgb25lIHBpeGVsIGdldHMgbW9kaWZpZWQuCitzdGF0aWMgaW50IEZsYXR0ZW5TaW1pbGFyQmxvY2tzKGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZyYW1lUmVjdGFuZ2xlKiBjb25zdCByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQUGljdHVyZSogY29uc3QgZHN0LCBmbG9hdCBxdWFsaXR5KSB7CisgIGNvbnN0IGludCBtYXhfYWxsb3dlZF9kaWZmX2xvc3N5ID0gUXVhbGl0eVRvTWF4RGlmZihxdWFsaXR5KTsKKyAgaW50IGksIGo7CisgIGludCBtb2RpZmllZCA9IDA7CisgIGNvbnN0IGludCBibG9ja19zaXplID0gODsKKyAgY29uc3QgaW50IHlfc3RhcnQgPSAocmVjdC0+eV9vZmZzZXRfICsgYmxvY2tfc2l6ZSkgJiB+KGJsb2NrX3NpemUgLSAxKTsKKyAgY29uc3QgaW50IHlfZW5kID0gKHJlY3QtPnlfb2Zmc2V0XyArIHJlY3QtPmhlaWdodF8pICYgfihibG9ja19zaXplIC0gMSk7CisgIGNvbnN0IGludCB4X3N0YXJ0ID0gKHJlY3QtPnhfb2Zmc2V0XyArIGJsb2NrX3NpemUpICYgfihibG9ja19zaXplIC0gMSk7CisgIGNvbnN0IGludCB4X2VuZCA9IChyZWN0LT54X29mZnNldF8gKyByZWN0LT53aWR0aF8pICYgfihibG9ja19zaXplIC0gMSk7CisgIGFzc2VydChzcmMgIT0gTlVMTCAmJiBkc3QgIT0gTlVMTCAmJiByZWN0ICE9IE5VTEwpOworICBhc3NlcnQoc3JjLT53aWR0aCA9PSBkc3QtPndpZHRoICYmIHNyYy0+aGVpZ2h0ID09IGRzdC0+aGVpZ2h0KTsKKyAgYXNzZXJ0KChibG9ja19zaXplICYgKGJsb2NrX3NpemUgLSAxKSkgPT0gMCk7ICAvLyBtdXN0IGJlIGEgcG93ZXIgb2YgMgorICAvLyBJdGVyYXRlIG92ZXIgZWFjaCBibG9jayBhbmQgY291bnQgc2ltaWxhciBwaXhlbHMuCisgIGZvciAoaiA9IHlfc3RhcnQ7IGogPCB5X2VuZDsgaiArPSBibG9ja19zaXplKSB7CisgICAgZm9yIChpID0geF9zdGFydDsgaSA8IHhfZW5kOyBpICs9IGJsb2NrX3NpemUpIHsKKyAgICAgIGludCBjbnQgPSAwOworICAgICAgaW50IGF2Z19yID0gMCwgYXZnX2cgPSAwLCBhdmdfYiA9IDA7CisgICAgICBpbnQgeCwgeTsKKyAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBwc3JjID0gc3JjLT5hcmdiICsgaiAqIHNyYy0+YXJnYl9zdHJpZGUgKyBpOworICAgICAgdWludDMyX3QqIGNvbnN0IHBkc3QgPSBkc3QtPmFyZ2IgKyBqICogZHN0LT5hcmdiX3N0cmlkZSArIGk7CisgICAgICBmb3IgKHkgPSAwOyB5IDwgYmxvY2tfc2l6ZTsgKyt5KSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBibG9ja19zaXplOyArK3gpIHsKKyAgICAgICAgICBjb25zdCB1aW50MzJfdCBzcmNfcGl4ZWwgPSBwc3JjW3ggKyB5ICogc3JjLT5hcmdiX3N0cmlkZV07CisgICAgICAgICAgY29uc3QgaW50IGFscGhhID0gc3JjX3BpeGVsID4+IDI0OworICAgICAgICAgIGlmIChhbHBoYSA9PSAweGZmICYmCisgICAgICAgICAgICAgIFBpeGVsc0FyZVNpbWlsYXIoc3JjX3BpeGVsLCBwZHN0W3ggKyB5ICogZHN0LT5hcmdiX3N0cmlkZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2FsbG93ZWRfZGlmZl9sb3NzeSkpIHsKKyAgICAgICAgICAgICsrY250OworICAgICAgICAgICAgYXZnX3IgKz0gKHNyY19waXhlbCA+PiAxNikgJiAweGZmOworICAgICAgICAgICAgYXZnX2cgKz0gKHNyY19waXhlbCA+PiA4KSAmIDB4ZmY7CisgICAgICAgICAgICBhdmdfYiArPSAoc3JjX3BpeGVsID4+IDApICYgMHhmZjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8vIElmIHdlIGhhdmUgYSBmdWxseSBzaW1pbGFyIGJsb2NrLCB3ZSByZXBsYWNlIGl0IHdpdGggYW4KKyAgICAgIC8vIGF2ZXJhZ2UgdHJhbnNwYXJlbnQgYmxvY2suIFRoaXMgY29tcHJlc3NlcyBiZXR0ZXIgaW4gbG9zc3kgbW9kZS4KKyAgICAgIGlmIChjbnQgPT0gYmxvY2tfc2l6ZSAqIGJsb2NrX3NpemUpIHsKKyAgICAgICAgY29uc3QgdWludDMyX3QgY29sb3IgPSAoMHgwMCAgICAgICAgICA8PCAyNCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYXZnX3IgLyBjbnQpIDw8IDE2KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChhdmdfZyAvIGNudCkgPDwgIDgpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGF2Z19iIC8gY250KSA8PCAgMCk7CisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBibG9ja19zaXplOyArK3kpIHsKKyAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgYmxvY2tfc2l6ZTsgKyt4KSB7CisgICAgICAgICAgICBwZHN0W3ggKyB5ICogZHN0LT5hcmdiX3N0cmlkZV0gPSBjb2xvcjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbW9kaWZpZWQgPSAxOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gbW9kaWZpZWQ7Cit9CisKK3N0YXRpYyBpbnQgRW5jb2RlRnJhbWUoY29uc3QgV2ViUENvbmZpZyogY29uc3QgY29uZmlnLCBXZWJQUGljdHVyZSogY29uc3QgcGljLAorICAgICAgICAgICAgICAgICAgICAgICBXZWJQTWVtb3J5V3JpdGVyKiBjb25zdCBtZW1vcnkpIHsKKyAgcGljLT51c2VfYXJnYiA9IDE7CisgIHBpYy0+d3JpdGVyID0gV2ViUE1lbW9yeVdyaXRlOworICBwaWMtPmN1c3RvbV9wdHIgPSBtZW1vcnk7CisgIGlmICghV2ViUEVuY29kZShjb25maWcsIHBpYykpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gMTsKK30KKworLy8gU3RydWN0IHJlcHJlc2VudGluZyBhIGNhbmRpZGF0ZSBlbmNvZGVkIGZyYW1lIGluY2x1ZGluZyBpdHMgbWV0YWRhdGEuCit0eXBlZGVmIHN0cnVjdCB7CisgIFdlYlBNZW1vcnlXcml0ZXIgIG1lbV87CisgIFdlYlBNdXhGcmFtZUluZm8gIGluZm9fOworICBGcmFtZVJlY3RhbmdsZSAgICByZWN0XzsKKyAgaW50ICAgICAgICAgICAgICAgZXZhbHVhdGVfOyAgLy8gVHJ1ZSBpZiB0aGlzIGNhbmRpZGF0ZSBzaG91bGQgYmUgZXZhbHVhdGVkLgorfSBDYW5kaWRhdGU7CisKKy8vIEdlbmVyYXRlcyBhIGNhbmRpZGF0ZSBlbmNvZGVkIGZyYW1lIGdpdmVuIGEgcGljdHVyZSBhbmQgbWV0YWRhdGEuCitzdGF0aWMgV2ViUEVuY29kaW5nRXJyb3IgRW5jb2RlQ2FuZGlkYXRlKFdlYlBQaWN0dXJlKiBjb25zdCBzdWJfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZyYW1lUmVjdGFuZ2xlKiBjb25zdCByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQQ29uZmlnKiBjb25zdCBlbmNvZGVyX2NvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVzZV9ibGVuZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuZGlkYXRlKiBjb25zdCBjYW5kaWRhdGUpIHsKKyAgV2ViUENvbmZpZyBjb25maWcgPSAqZW5jb2Rlcl9jb25maWc7CisgIFdlYlBFbmNvZGluZ0Vycm9yIGVycm9yX2NvZGUgPSBWUDhfRU5DX09LOworICBhc3NlcnQoY2FuZGlkYXRlICE9IE5VTEwpOworICBtZW1zZXQoY2FuZGlkYXRlLCAwLCBzaXplb2YoKmNhbmRpZGF0ZSkpOworCisgIC8vIFNldCBmcmFtZSByZWN0IGFuZCBpbmZvLgorICBjYW5kaWRhdGUtPnJlY3RfID0gKnJlY3Q7CisgIGNhbmRpZGF0ZS0+aW5mb18uaWQgPSBXRUJQX0NIVU5LX0FOTUY7CisgIGNhbmRpZGF0ZS0+aW5mb18ueF9vZmZzZXQgPSByZWN0LT54X29mZnNldF87CisgIGNhbmRpZGF0ZS0+aW5mb18ueV9vZmZzZXQgPSByZWN0LT55X29mZnNldF87CisgIGNhbmRpZGF0ZS0+aW5mb18uZGlzcG9zZV9tZXRob2QgPSBXRUJQX01VWF9ESVNQT1NFX05PTkU7ICAvLyBTZXQgbGF0ZXIuCisgIGNhbmRpZGF0ZS0+aW5mb18uYmxlbmRfbWV0aG9kID0KKyAgICAgIHVzZV9ibGVuZGluZyA/IFdFQlBfTVVYX0JMRU5EIDogV0VCUF9NVVhfTk9fQkxFTkQ7CisgIGNhbmRpZGF0ZS0+aW5mb18uZHVyYXRpb24gPSAwOyAgLy8gU2V0IGluIG5leHQgY2FsbCB0byBXZWJQQW5pbUVuY29kZXJBZGQoKS4KKworICAvLyBFbmNvZGUgcGljdHVyZS4KKyAgV2ViUE1lbW9yeVdyaXRlckluaXQoJmNhbmRpZGF0ZS0+bWVtXyk7CisKKyAgaWYgKCFjb25maWcubG9zc2xlc3MgJiYgdXNlX2JsZW5kaW5nKSB7CisgICAgLy8gRGlzYWJsZSBmaWx0ZXJpbmcgdG8gYXZvaWQgYmxvY2tpbmVzcyBpbiByZWNvbnN0cnVjdGVkIGZyYW1lcyBhdCB0aGUKKyAgICAvLyB0aW1lIG9mIGRlY29kaW5nLgorICAgIGNvbmZpZy5hdXRvZmlsdGVyID0gMDsKKyAgICBjb25maWcuZmlsdGVyX3N0cmVuZ3RoID0gMDsKKyAgfQorICBpZiAoIUVuY29kZUZyYW1lKCZjb25maWcsIHN1Yl9mcmFtZSwgJmNhbmRpZGF0ZS0+bWVtXykpIHsKKyAgICBlcnJvcl9jb2RlID0gc3ViX2ZyYW1lLT5lcnJvcl9jb2RlOworICAgIGdvdG8gRXJyOworICB9CisKKyAgY2FuZGlkYXRlLT5ldmFsdWF0ZV8gPSAxOworICByZXR1cm4gZXJyb3JfY29kZTsKKworIEVycjoKKyAgV2ViUE1lbW9yeVdyaXRlckNsZWFyKCZjYW5kaWRhdGUtPm1lbV8pOworICByZXR1cm4gZXJyb3JfY29kZTsKK30KKworc3RhdGljIHZvaWQgQ29weUN1cnJlbnRDYW52YXMoV2ViUEFuaW1FbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgaWYgKGVuYy0+Y3Vycl9jYW52YXNfY29weV9tb2RpZmllZF8pIHsKKyAgICBXZWJQQ29weVBpeGVscyhlbmMtPmN1cnJfY2FudmFzXywgJmVuYy0+Y3Vycl9jYW52YXNfY29weV8pOworICAgIGVuYy0+Y3Vycl9jYW52YXNfY29weV8ucHJvZ3Jlc3NfaG9vayA9IGVuYy0+Y3Vycl9jYW52YXNfLT5wcm9ncmVzc19ob29rOworICAgIGVuYy0+Y3Vycl9jYW52YXNfY29weV8udXNlcl9kYXRhID0gZW5jLT5jdXJyX2NhbnZhc18tPnVzZXJfZGF0YTsKKyAgICBlbmMtPmN1cnJfY2FudmFzX2NvcHlfbW9kaWZpZWRfID0gMDsKKyAgfQorfQorCitlbnVtIHsKKyAgTExfRElTUF9OT05FID0gMCwKKyAgTExfRElTUF9CRywKKyAgTE9TU1lfRElTUF9OT05FLAorICBMT1NTWV9ESVNQX0JHLAorICBDQU5ESURBVEVfQ09VTlQKK307CisKKyNkZWZpbmUgTUlOX0NPTE9SU19MT1NTWSAgICAgMzEgIC8vIERvbid0IHRyeSBsb3NzeSBiZWxvdyB0aGlzIHRocmVzaG9sZC4KKyNkZWZpbmUgTUFYX0NPTE9SU19MT1NTTEVTUyAxOTQgIC8vIERvbid0IHRyeSBsb3NzbGVzcyBhYm92ZSB0aGlzIHRocmVzaG9sZC4KKworLy8gR2VuZXJhdGVzIGNhbmRpZGF0ZXMgZm9yIGEgZ2l2ZW4gZGlzcG9zZSBtZXRob2QgZ2l2ZW4gcHJlLWZpbGxlZCBzdWItZnJhbWUKKy8vICdwYXJhbXMnLgorc3RhdGljIFdlYlBFbmNvZGluZ0Vycm9yIEdlbmVyYXRlQ2FuZGlkYXRlcygKKyAgICBXZWJQQW5pbUVuY29kZXIqIGNvbnN0IGVuYywgQ2FuZGlkYXRlIGNhbmRpZGF0ZXNbQ0FORElEQVRFX0NPVU5UXSwKKyAgICBXZWJQTXV4QW5pbURpc3Bvc2UgZGlzcG9zZV9tZXRob2QsIGludCBpc19sb3NzbGVzcywgaW50IGlzX2tleV9mcmFtZSwKKyAgICBTdWJGcmFtZVBhcmFtcyogY29uc3QgcGFyYW1zLAorICAgIGNvbnN0IFdlYlBDb25maWcqIGNvbnN0IGNvbmZpZ19sbCwgY29uc3QgV2ViUENvbmZpZyogY29uc3QgY29uZmlnX2xvc3N5KSB7CisgIFdlYlBFbmNvZGluZ0Vycm9yIGVycm9yX2NvZGUgPSBWUDhfRU5DX09LOworICBjb25zdCBpbnQgaXNfZGlzcG9zZV9ub25lID0gKGRpc3Bvc2VfbWV0aG9kID09IFdFQlBfTVVYX0RJU1BPU0VfTk9ORSk7CisgIENhbmRpZGF0ZSogY29uc3QgY2FuZGlkYXRlX2xsID0KKyAgICAgIGlzX2Rpc3Bvc2Vfbm9uZSA/ICZjYW5kaWRhdGVzW0xMX0RJU1BfTk9ORV0gOiAmY2FuZGlkYXRlc1tMTF9ESVNQX0JHXTsKKyAgQ2FuZGlkYXRlKiBjb25zdCBjYW5kaWRhdGVfbG9zc3kgPSBpc19kaXNwb3NlX25vbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICZjYW5kaWRhdGVzW0xPU1NZX0RJU1BfTk9ORV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICZjYW5kaWRhdGVzW0xPU1NZX0RJU1BfQkddOworICBXZWJQUGljdHVyZSogY29uc3QgY3Vycl9jYW52YXMgPSAmZW5jLT5jdXJyX2NhbnZhc19jb3B5XzsKKyAgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHByZXZfY2FudmFzID0KKyAgICAgIGlzX2Rpc3Bvc2Vfbm9uZSA/ICZlbmMtPnByZXZfY2FudmFzXyA6ICZlbmMtPnByZXZfY2FudmFzX2Rpc3Bvc2VkXzsKKyAgaW50IHVzZV9ibGVuZGluZ19sbCwgdXNlX2JsZW5kaW5nX2xvc3N5OworICBpbnQgZXZhbHVhdGVfbGwsIGV2YWx1YXRlX2xvc3N5OworCisgIENvcHlDdXJyZW50Q2FudmFzKGVuYyk7CisgIHVzZV9ibGVuZGluZ19sbCA9CisgICAgICAhaXNfa2V5X2ZyYW1lICYmCisgICAgICBJc0xvc3NsZXNzQmxlbmRpbmdQb3NzaWJsZShwcmV2X2NhbnZhcywgY3Vycl9jYW52YXMsICZwYXJhbXMtPnJlY3RfbGxfKTsKKyAgdXNlX2JsZW5kaW5nX2xvc3N5ID0KKyAgICAgICFpc19rZXlfZnJhbWUgJiYKKyAgICAgIElzTG9zc3lCbGVuZGluZ1Bvc3NpYmxlKHByZXZfY2FudmFzLCBjdXJyX2NhbnZhcywgJnBhcmFtcy0+cmVjdF9sb3NzeV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdfbG9zc3ktPnF1YWxpdHkpOworCisgIC8vIFBpY2sgY2FuZGlkYXRlcyB0byBiZSB0cmllZC4KKyAgaWYgKCFlbmMtPm9wdGlvbnNfLmFsbG93X21peGVkKSB7CisgICAgZXZhbHVhdGVfbGwgPSBpc19sb3NzbGVzczsKKyAgICBldmFsdWF0ZV9sb3NzeSA9ICFpc19sb3NzbGVzczsKKyAgfSBlbHNlIGlmIChlbmMtPm9wdGlvbnNfLm1pbmltaXplX3NpemUpIHsKKyAgICBldmFsdWF0ZV9sbCA9IDE7CisgICAgZXZhbHVhdGVfbG9zc3kgPSAxOworICB9IGVsc2UgeyAgLy8gVXNlIGEgaGV1cmlzdGljIGZvciB0cnlpbmcgbG9zc2xlc3MgYW5kL29yIGxvc3N5IGNvbXByZXNzaW9uLgorICAgIGNvbnN0IGludCBudW1fY29sb3JzID0gV2ViUEdldENvbG9yUGFsZXR0ZSgmcGFyYW1zLT5zdWJfZnJhbWVfbGxfLCBOVUxMKTsKKyAgICBldmFsdWF0ZV9sbCA9IChudW1fY29sb3JzIDwgTUFYX0NPTE9SU19MT1NTTEVTUyk7CisgICAgZXZhbHVhdGVfbG9zc3kgPSAobnVtX2NvbG9ycyA+PSBNSU5fQ09MT1JTX0xPU1NZKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIGNhbmRpZGF0ZXMuCisgIGlmIChldmFsdWF0ZV9sbCkgeworICAgIENvcHlDdXJyZW50Q2FudmFzKGVuYyk7CisgICAgaWYgKHVzZV9ibGVuZGluZ19sbCkgeworICAgICAgZW5jLT5jdXJyX2NhbnZhc19jb3B5X21vZGlmaWVkXyA9CisgICAgICAgICAgSW5jcmVhc2VUcmFuc3BhcmVuY3kocHJldl9jYW52YXMsICZwYXJhbXMtPnJlY3RfbGxfLCBjdXJyX2NhbnZhcyk7CisgICAgfQorICAgIGVycm9yX2NvZGUgPSBFbmNvZGVDYW5kaWRhdGUoJnBhcmFtcy0+c3ViX2ZyYW1lX2xsXywgJnBhcmFtcy0+cmVjdF9sbF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdfbGwsIHVzZV9ibGVuZGluZ19sbCwgY2FuZGlkYXRlX2xsKTsKKyAgICBpZiAoZXJyb3JfY29kZSAhPSBWUDhfRU5DX09LKSByZXR1cm4gZXJyb3JfY29kZTsKKyAgfQorICBpZiAoZXZhbHVhdGVfbG9zc3kpIHsKKyAgICBDb3B5Q3VycmVudENhbnZhcyhlbmMpOworICAgIGlmICh1c2VfYmxlbmRpbmdfbG9zc3kpIHsKKyAgICAgIGVuYy0+Y3Vycl9jYW52YXNfY29weV9tb2RpZmllZF8gPQorICAgICAgICAgIEZsYXR0ZW5TaW1pbGFyQmxvY2tzKHByZXZfY2FudmFzLCAmcGFyYW1zLT5yZWN0X2xvc3N5XywgY3Vycl9jYW52YXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnX2xvc3N5LT5xdWFsaXR5KTsKKyAgICB9CisgICAgZXJyb3JfY29kZSA9CisgICAgICAgIEVuY29kZUNhbmRpZGF0ZSgmcGFyYW1zLT5zdWJfZnJhbWVfbG9zc3lfLCAmcGFyYW1zLT5yZWN0X2xvc3N5XywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ19sb3NzeSwgdXNlX2JsZW5kaW5nX2xvc3N5LCBjYW5kaWRhdGVfbG9zc3kpOworICAgIGlmIChlcnJvcl9jb2RlICE9IFZQOF9FTkNfT0spIHJldHVybiBlcnJvcl9jb2RlOworICAgIGVuYy0+Y3Vycl9jYW52YXNfY29weV9tb2RpZmllZF8gPSAxOworICB9CisgIHJldHVybiBlcnJvcl9jb2RlOworfQorCisjdW5kZWYgTUlOX0NPTE9SU19MT1NTWQorI3VuZGVmIE1BWF9DT0xPUlNfTE9TU0xFU1MKKworc3RhdGljIHZvaWQgR2V0RW5jb2RlZERhdGEoY29uc3QgV2ViUE1lbW9yeVdyaXRlciogY29uc3QgbWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUERhdGEqIGNvbnN0IGVuY29kZWRfZGF0YSkgeworICBlbmNvZGVkX2RhdGEtPmJ5dGVzID0gbWVtb3J5LT5tZW07CisgIGVuY29kZWRfZGF0YS0+c2l6ZSAgPSBtZW1vcnktPnNpemU7Cit9CisKKy8vIFNldHMgZGlzcG9zZSBtZXRob2Qgb2YgdGhlIHByZXZpb3VzIGZyYW1lIHRvIGJlICdkaXNwb3NlX21ldGhvZCcuCitzdGF0aWMgdm9pZCBTZXRQcmV2aW91c0Rpc3Bvc2VNZXRob2QoV2ViUEFuaW1FbmNvZGVyKiBjb25zdCBlbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUE11eEFuaW1EaXNwb3NlIGRpc3Bvc2VfbWV0aG9kKSB7CisgIGNvbnN0IHNpemVfdCBwb3NpdGlvbiA9IGVuYy0+Y291bnRfIC0gMjsKKyAgRW5jb2RlZEZyYW1lKiBjb25zdCBwcmV2X2VuY19mcmFtZSA9IEdldEZyYW1lKGVuYywgcG9zaXRpb24pOworICBhc3NlcnQoZW5jLT5jb3VudF8gPj0gMik7ICAvLyBBcyBjdXJyZW50IGFuZCBwcmV2aW91cyBmcmFtZXMgYXJlIGluIGVuYy4KKworICBpZiAoZW5jLT5wcmV2X2NhbmRpZGF0ZV91bmRlY2lkZWRfKSB7CisgICAgYXNzZXJ0KGRpc3Bvc2VfbWV0aG9kID09IFdFQlBfTVVYX0RJU1BPU0VfTk9ORSk7CisgICAgcHJldl9lbmNfZnJhbWUtPnN1Yl9mcmFtZV8uZGlzcG9zZV9tZXRob2QgPSBkaXNwb3NlX21ldGhvZDsKKyAgICBwcmV2X2VuY19mcmFtZS0+a2V5X2ZyYW1lXy5kaXNwb3NlX21ldGhvZCA9IGRpc3Bvc2VfbWV0aG9kOworICB9IGVsc2UgeworICAgIFdlYlBNdXhGcmFtZUluZm8qIGNvbnN0IHByZXZfaW5mbyA9IHByZXZfZW5jX2ZyYW1lLT5pc19rZXlfZnJhbWVfCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAmcHJldl9lbmNfZnJhbWUtPmtleV9mcmFtZV8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICZwcmV2X2VuY19mcmFtZS0+c3ViX2ZyYW1lXzsKKyAgICBwcmV2X2luZm8tPmRpc3Bvc2VfbWV0aG9kID0gZGlzcG9zZV9tZXRob2Q7CisgIH0KK30KKworc3RhdGljIGludCBJbmNyZWFzZVByZXZpb3VzRHVyYXRpb24oV2ViUEFuaW1FbmNvZGVyKiBjb25zdCBlbmMsIGludCBkdXJhdGlvbikgeworICBjb25zdCBzaXplX3QgcG9zaXRpb24gPSBlbmMtPmNvdW50XyAtIDE7CisgIEVuY29kZWRGcmFtZSogY29uc3QgcHJldl9lbmNfZnJhbWUgPSBHZXRGcmFtZShlbmMsIHBvc2l0aW9uKTsKKyAgaW50IG5ld19kdXJhdGlvbjsKKworICBhc3NlcnQoZW5jLT5jb3VudF8gPj0gMSk7CisgIGFzc2VydChwcmV2X2VuY19mcmFtZS0+c3ViX2ZyYW1lXy5kdXJhdGlvbiA9PQorICAgICAgICAgcHJldl9lbmNfZnJhbWUtPmtleV9mcmFtZV8uZHVyYXRpb24pOworICBhc3NlcnQocHJldl9lbmNfZnJhbWUtPnN1Yl9mcmFtZV8uZHVyYXRpb24gPT0KKyAgICAgICAgIChwcmV2X2VuY19mcmFtZS0+c3ViX2ZyYW1lXy5kdXJhdGlvbiAmIChNQVhfRFVSQVRJT04gLSAxKSkpOworICBhc3NlcnQoZHVyYXRpb24gPT0gKGR1cmF0aW9uICYgKE1BWF9EVVJBVElPTiAtIDEpKSk7CisKKyAgbmV3X2R1cmF0aW9uID0gcHJldl9lbmNfZnJhbWUtPnN1Yl9mcmFtZV8uZHVyYXRpb24gKyBkdXJhdGlvbjsKKyAgaWYgKG5ld19kdXJhdGlvbiA+PSBNQVhfRFVSQVRJT04pIHsgIC8vIFNwZWNpYWwgY2FzZS4KKyAgICAvLyBTZXBhcmF0ZSBvdXQgcHJldmlvdXMgZnJhbWUgZnJvbSBlYXJsaWVyIG1lcmdlZCBmcmFtZXMgdG8gYXZvaWQgb3ZlcmZsb3cuCisgICAgLy8gV2UgYWRkIGEgMXgxIHRyYW5zcGFyZW50IGZyYW1lIGZvciB0aGUgcHJldmlvdXMgZnJhbWUsIHdpdGggYmxlbmRpbmcgb24uCisgICAgY29uc3QgRnJhbWVSZWN0YW5nbGUgcmVjdCA9IHsgMCwgMCwgMSwgMSB9OworICAgIGNvbnN0IHVpbnQ4X3QgbG9zc2xlc3NfMXgxX2J5dGVzW10gPSB7CisgICAgICAweDUyLCAweDQ5LCAweDQ2LCAweDQ2LCAweDE0LCAweDAwLCAweDAwLCAweDAwLCAweDU3LCAweDQ1LCAweDQyLCAweDUwLAorICAgICAgMHg1NiwgMHg1MCwgMHgzOCwgMHg0YywgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyZiwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAgIDB4MTAsIDB4ODgsIDB4ODgsIDB4MDgKKyAgICB9OworICAgIGNvbnN0IFdlYlBEYXRhIGxvc3NsZXNzXzF4MSA9IHsKKyAgICAgICAgbG9zc2xlc3NfMXgxX2J5dGVzLCBzaXplb2YobG9zc2xlc3NfMXgxX2J5dGVzKQorICAgIH07CisgICAgY29uc3QgdWludDhfdCBsb3NzeV8xeDFfYnl0ZXNbXSA9IHsKKyAgICAgIDB4NTIsIDB4NDksIDB4NDYsIDB4NDYsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NTcsIDB4NDUsIDB4NDIsIDB4NTAsCisgICAgICAweDU2LCAweDUwLCAweDM4LCAweDU4LCAweDBhLCAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLAorICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MSwgMHg0YywgMHg1MCwgMHg0OCwgMHgwMiwgMHgwMCwKKyAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NTYsIDB4NTAsIDB4MzgsIDB4MjAsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgICAweDMwLCAweDAxLCAweDAwLCAweDlkLCAweDAxLCAweDJhLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLAorICAgICAgMHgzNCwgMHgyNSwgMHhhNCwgMHgwMCwgMHgwMywgMHg3MCwgMHgwMCwgMHhmZSwgMHhmYiwgMHhmZCwgMHg1MCwgMHgwMAorICAgIH07CisgICAgY29uc3QgV2ViUERhdGEgbG9zc3lfMXgxID0geyBsb3NzeV8xeDFfYnl0ZXMsIHNpemVvZihsb3NzeV8xeDFfYnl0ZXMpIH07CisgICAgY29uc3QgaW50IGNhbl91c2VfbG9zc2xlc3MgPQorICAgICAgICAoZW5jLT5sYXN0X2NvbmZpZ18ubG9zc2xlc3MgfHwgZW5jLT5vcHRpb25zXy5hbGxvd19taXhlZCk7CisgICAgRW5jb2RlZEZyYW1lKiBjb25zdCBjdXJyX2VuY19mcmFtZSA9IEdldEZyYW1lKGVuYywgZW5jLT5jb3VudF8pOworICAgIGN1cnJfZW5jX2ZyYW1lLT5pc19rZXlfZnJhbWVfID0gMDsKKyAgICBjdXJyX2VuY19mcmFtZS0+c3ViX2ZyYW1lXy5pZCA9IFdFQlBfQ0hVTktfQU5NRjsKKyAgICBjdXJyX2VuY19mcmFtZS0+c3ViX2ZyYW1lXy54X29mZnNldCA9IDA7CisgICAgY3Vycl9lbmNfZnJhbWUtPnN1Yl9mcmFtZV8ueV9vZmZzZXQgPSAwOworICAgIGN1cnJfZW5jX2ZyYW1lLT5zdWJfZnJhbWVfLmRpc3Bvc2VfbWV0aG9kID0gV0VCUF9NVVhfRElTUE9TRV9OT05FOworICAgIGN1cnJfZW5jX2ZyYW1lLT5zdWJfZnJhbWVfLmJsZW5kX21ldGhvZCA9IFdFQlBfTVVYX0JMRU5EOworICAgIGN1cnJfZW5jX2ZyYW1lLT5zdWJfZnJhbWVfLmR1cmF0aW9uID0gZHVyYXRpb247CisgICAgaWYgKCFXZWJQRGF0YUNvcHkoY2FuX3VzZV9sb3NzbGVzcyA/ICZsb3NzbGVzc18xeDEgOiAmbG9zc3lfMXgxLAorICAgICAgICAgICAgICAgICAgICAgICZjdXJyX2VuY19mcmFtZS0+c3ViX2ZyYW1lXy5iaXRzdHJlYW0pKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKytlbmMtPmNvdW50XzsKKyAgICArK2VuYy0+Y291bnRfc2luY2Vfa2V5X2ZyYW1lXzsKKyAgICBlbmMtPmZsdXNoX2NvdW50XyA9IGVuYy0+Y291bnRfIC0gMTsKKyAgICBlbmMtPnByZXZfY2FuZGlkYXRlX3VuZGVjaWRlZF8gPSAwOworICAgIGVuYy0+cHJldl9yZWN0XyA9IHJlY3Q7CisgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVndWxhciBjYXNlLgorICAgIC8vIEluY3JlYXNlIGR1cmF0aW9uIG9mIHRoZSBwcmV2aW91cyBmcmFtZSBieSAnZHVyYXRpb24nLgorICAgIHByZXZfZW5jX2ZyYW1lLT5zdWJfZnJhbWVfLmR1cmF0aW9uID0gbmV3X2R1cmF0aW9uOworICAgIHByZXZfZW5jX2ZyYW1lLT5rZXlfZnJhbWVfLmR1cmF0aW9uID0gbmV3X2R1cmF0aW9uOworICB9CisgIHJldHVybiAxOworfQorCisvLyBQaWNrIHRoZSBjYW5kaWRhdGUgZW5jb2RlZCBmcmFtZSB3aXRoIHNtYWxsZXN0IHNpemUgYW5kIHJlbGVhc2Ugb3RoZXIKKy8vIGNhbmRpZGF0ZXMuCisvLyBUT0RPKGxhdGVyKTogUGVyaGFwcyBhIHJvdWdoIFNTSU0vUFNOUiBwcm9kdWNlZCBieSB0aGUgZW5jb2RlciBzaG91bGQKKy8vIGFsc28gYmUgYSBjcml0ZXJpYSwgaW4gYWRkaXRpb24gdG8gc2l6ZXMuCitzdGF0aWMgdm9pZCBQaWNrQmVzdENhbmRpZGF0ZShXZWJQQW5pbUVuY29kZXIqIGNvbnN0IGVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbmRpZGF0ZSogY29uc3QgY2FuZGlkYXRlcywgaW50IGlzX2tleV9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuY29kZWRGcmFtZSogY29uc3QgZW5jb2RlZF9mcmFtZSkgeworICBpbnQgaTsKKyAgaW50IGJlc3RfaWR4ID0gLTE7CisgIHNpemVfdCBiZXN0X3NpemUgPSB+MDsKKyAgZm9yIChpID0gMDsgaSA8IENBTkRJREFURV9DT1VOVDsgKytpKSB7CisgICAgaWYgKGNhbmRpZGF0ZXNbaV0uZXZhbHVhdGVfKSB7CisgICAgICBjb25zdCBzaXplX3QgY2FuZGlkYXRlX3NpemUgPSBjYW5kaWRhdGVzW2ldLm1lbV8uc2l6ZTsKKyAgICAgIGlmIChjYW5kaWRhdGVfc2l6ZSA8IGJlc3Rfc2l6ZSkgeworICAgICAgICBiZXN0X2lkeCA9IGk7CisgICAgICAgIGJlc3Rfc2l6ZSA9IGNhbmRpZGF0ZV9zaXplOworICAgICAgfQorICAgIH0KKyAgfQorICBhc3NlcnQoYmVzdF9pZHggIT0gLTEpOworICBmb3IgKGkgPSAwOyBpIDwgQ0FORElEQVRFX0NPVU5UOyArK2kpIHsKKyAgICBpZiAoY2FuZGlkYXRlc1tpXS5ldmFsdWF0ZV8pIHsKKyAgICAgIGlmIChpID09IGJlc3RfaWR4KSB7CisgICAgICAgIFdlYlBNdXhGcmFtZUluZm8qIGNvbnN0IGRzdCA9IGlzX2tleV9mcmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICZlbmNvZGVkX2ZyYW1lLT5rZXlfZnJhbWVfCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJmVuY29kZWRfZnJhbWUtPnN1Yl9mcmFtZV87CisgICAgICAgICpkc3QgPSBjYW5kaWRhdGVzW2ldLmluZm9fOworICAgICAgICBHZXRFbmNvZGVkRGF0YSgmY2FuZGlkYXRlc1tpXS5tZW1fLCAmZHN0LT5iaXRzdHJlYW0pOworICAgICAgICBpZiAoIWlzX2tleV9mcmFtZSkgeworICAgICAgICAgIC8vIE5vdGU6IFByZXZpb3VzIGRpc3Bvc2UgbWV0aG9kIG9ubHkgbWF0dGVycyBmb3Igbm9uLWtleWZyYW1lcy4KKyAgICAgICAgICAvLyBBbHNvLCB3ZSBkb24ndCB3YW50IHRvIG1vZGlmeSBwcmV2aW91cyBkaXNwb3NlIG1ldGhvZCB0aGF0IHdhcworICAgICAgICAgIC8vIHNlbGVjdGVkIHdoZW4gYSBub24ga2V5LWZyYW1lIHdhcyBhc3N1bWVkLgorICAgICAgICAgIGNvbnN0IFdlYlBNdXhBbmltRGlzcG9zZSBwcmV2X2Rpc3Bvc2VfbWV0aG9kID0KKyAgICAgICAgICAgICAgKGJlc3RfaWR4ID09IExMX0RJU1BfTk9ORSB8fCBiZXN0X2lkeCA9PSBMT1NTWV9ESVNQX05PTkUpCisgICAgICAgICAgICAgICAgICA/IFdFQlBfTVVYX0RJU1BPU0VfTk9ORQorICAgICAgICAgICAgICAgICAgOiBXRUJQX01VWF9ESVNQT1NFX0JBQ0tHUk9VTkQ7CisgICAgICAgICAgU2V0UHJldmlvdXNEaXNwb3NlTWV0aG9kKGVuYywgcHJldl9kaXNwb3NlX21ldGhvZCk7CisgICAgICAgIH0KKyAgICAgICAgZW5jLT5wcmV2X3JlY3RfID0gY2FuZGlkYXRlc1tpXS5yZWN0XzsgIC8vIHNhdmUgZm9yIG5leHQgZnJhbWUuCisgICAgICB9IGVsc2UgeworICAgICAgICBXZWJQTWVtb3J5V3JpdGVyQ2xlYXIoJmNhbmRpZGF0ZXNbaV0ubWVtXyk7CisgICAgICAgIGNhbmRpZGF0ZXNbaV0uZXZhbHVhdGVfID0gMDsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLy8gRGVwZW5kaW5nIG9uIHRoZSBjb25maWd1cmF0aW9uLCB0cmllcyBkaWZmZXJlbnQgY29tcHJlc3Npb25zCisvLyAobG9zc3kvbG9zc2xlc3MpLCBkaXNwb3NlIG1ldGhvZHMsIGJsZW5kaW5nIG1ldGhvZHMgZXRjIHRvIGVuY29kZSB0aGUgY3VycmVudAorLy8gZnJhbWUgYW5kIG91dHB1dHMgdGhlIGJlc3Qgb25lIGluICdlbmNvZGVkX2ZyYW1lJy4KKy8vICdmcmFtZV9za2lwcGVkJyB3aWxsIGJlIHNldCB0byB0cnVlIGlmIHRoaXMgZnJhbWUgc2hvdWxkIGFjdHVhbGx5IGJlIHNraXBwZWQuCitzdGF0aWMgV2ViUEVuY29kaW5nRXJyb3IgU2V0RnJhbWUoV2ViUEFuaW1FbmNvZGVyKiBjb25zdCBlbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUENvbmZpZyogY29uc3QgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpc19rZXlfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5jb2RlZEZyYW1lKiBjb25zdCBlbmNvZGVkX2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgZnJhbWVfc2tpcHBlZCkgeworICBpbnQgaTsKKyAgV2ViUEVuY29kaW5nRXJyb3IgZXJyb3JfY29kZSA9IFZQOF9FTkNfT0s7CisgIGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBjdXJyX2NhbnZhcyA9ICZlbmMtPmN1cnJfY2FudmFzX2NvcHlfOworICBjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcHJldl9jYW52YXMgPSAmZW5jLT5wcmV2X2NhbnZhc187CisgIENhbmRpZGF0ZSBjYW5kaWRhdGVzW0NBTkRJREFURV9DT1VOVF07CisgIGNvbnN0IGludCBpc19sb3NzbGVzcyA9IGNvbmZpZy0+bG9zc2xlc3M7CisgIGNvbnN0IGludCBjb25zaWRlcl9sb3NzbGVzcyA9IGlzX2xvc3NsZXNzIHx8IGVuYy0+b3B0aW9uc18uYWxsb3dfbWl4ZWQ7CisgIGNvbnN0IGludCBjb25zaWRlcl9sb3NzeSA9ICFpc19sb3NzbGVzcyB8fCBlbmMtPm9wdGlvbnNfLmFsbG93X21peGVkOworICBjb25zdCBpbnQgaXNfZmlyc3RfZnJhbWUgPSBlbmMtPmlzX2ZpcnN0X2ZyYW1lXzsKKworICAvLyBGaXJzdCBmcmFtZSBjYW5ub3QgYmUgc2tpcHBlZCBhcyB0aGVyZSBpcyBubyAncHJldmlvdXMgZnJhbWUnIHRvIG1lcmdlIGl0CisgIC8vIHRvLiBTbywgZW1wdHkgcmVjdGFuZ2xlIGlzIG5vdCBhbGxvd2VkIGZvciB0aGUgZmlyc3QgZnJhbWUuCisgIGNvbnN0IGludCBlbXB0eV9yZWN0X2FsbG93ZWRfbm9uZSA9ICFpc19maXJzdF9mcmFtZTsKKworICAvLyBFdmVuIGlmIHRoZXJlIGlzIGV4YWN0IHBpeGVsIG1hdGNoIGJldHdlZW4gJ2Rpc3Bvc2VkIHByZXZpb3VzIGNhbnZhcycgYW5kCisgIC8vICdjdXJyZW50IGNhbnZhcycsIHdlIGNhbid0IHNraXAgY3VycmVudCBmcmFtZSwgYXMgdGhlcmUgbWF5IG5vdCBiZSBleGFjdAorICAvLyBwaXhlbCBtYXRjaCBiZXR3ZWVuICdwcmV2aW91cyBjYW52YXMnIGFuZCAnY3VycmVudCBjYW52YXMnLiBTbywgd2UgZG9uJ3QKKyAgLy8gYWxsb3cgZW1wdHkgcmVjdGFuZ2xlIGluIHRoaXMgY2FzZS4KKyAgY29uc3QgaW50IGVtcHR5X3JlY3RfYWxsb3dlZF9iZyA9IDA7CisKKyAgLy8gSWYgY3VycmVudCBmcmFtZSBpcyBhIGtleS1mcmFtZSwgZGlzcG9zZSBtZXRob2Qgb2YgcHJldmlvdXMgZnJhbWUgZG9lc24ndAorICAvLyBtYXR0ZXIsIHNvIHdlIGRvbid0IHRyeSBkaXNwb3NlIHRvIGJhY2tncm91bmQuCisgIC8vIEFsc28sIGlmIGtleS1mcmFtZSBpbnNlcnRpb24gaXMgb24sIGFuZCBwcmV2aW91cyBmcmFtZSBjb3VsZCBiZSBwaWNrZWQgYXMKKyAgLy8gZWl0aGVyIGEgc3ViLWZyYW1lIG9yIGEga2V5LWZyYW1lLCB0aGVuIHdlIGNhbid0IGJlIHN1cmUgYWJvdXQgd2hhdCBmcmFtZQorICAvLyByZWN0YW5nbGUgd291bGQgYmUgZGlzcG9zZWQuIEluIHRoYXQgY2FzZSB0b28sIHdlIGRvbid0IHRyeSBkaXNwb3NlIHRvCisgIC8vIGJhY2tncm91bmQuCisgIGNvbnN0IGludCBkaXNwb3NlX2JnX3Bvc3NpYmxlID0KKyAgICAgICFpc19rZXlfZnJhbWUgJiYgIWVuYy0+cHJldl9jYW5kaWRhdGVfdW5kZWNpZGVkXzsKKworICBTdWJGcmFtZVBhcmFtcyBkaXNwb3NlX25vbmVfcGFyYW1zOworICBTdWJGcmFtZVBhcmFtcyBkaXNwb3NlX2JnX3BhcmFtczsKKworICBXZWJQQ29uZmlnIGNvbmZpZ19sbCA9ICpjb25maWc7CisgIFdlYlBDb25maWcgY29uZmlnX2xvc3N5ID0gKmNvbmZpZzsKKyAgY29uZmlnX2xsLmxvc3NsZXNzID0gMTsKKyAgY29uZmlnX2xvc3N5Lmxvc3NsZXNzID0gMDsKKyAgZW5jLT5sYXN0X2NvbmZpZ18gPSAqY29uZmlnOworICBlbmMtPmxhc3RfY29uZmlnX3JldmVyc2VkXyA9IGNvbmZpZy0+bG9zc2xlc3MgPyBjb25maWdfbG9zc3kgOiBjb25maWdfbGw7CisgICpmcmFtZV9za2lwcGVkID0gMDsKKworICBpZiAoIVN1YkZyYW1lUGFyYW1zSW5pdCgmZGlzcG9zZV9ub25lX3BhcmFtcywgMSwgZW1wdHlfcmVjdF9hbGxvd2VkX25vbmUpIHx8CisgICAgICAhU3ViRnJhbWVQYXJhbXNJbml0KCZkaXNwb3NlX2JnX3BhcmFtcywgMCwgZW1wdHlfcmVjdF9hbGxvd2VkX2JnKSkgeworICAgIHJldHVybiBWUDhfRU5DX0VSUk9SX0lOVkFMSURfQ09ORklHVVJBVElPTjsKKyAgfQorCisgIG1lbXNldChjYW5kaWRhdGVzLCAwLCBzaXplb2YoY2FuZGlkYXRlcykpOworCisgIC8vIENoYW5nZS1yZWN0YW5nbGUgYXNzdW1pbmcgcHJldmlvdXMgZnJhbWUgd2FzIERJU1BPU0VfTk9ORS4KKyAgaWYgKCFHZXRTdWJSZWN0cyhwcmV2X2NhbnZhcywgY3Vycl9jYW52YXMsIGlzX2tleV9mcmFtZSwgaXNfZmlyc3RfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgY29uZmlnX2xvc3N5LnF1YWxpdHksICZkaXNwb3NlX25vbmVfcGFyYW1zKSkgeworICAgIGVycm9yX2NvZGUgPSBWUDhfRU5DX0VSUk9SX0lOVkFMSURfQ09ORklHVVJBVElPTjsKKyAgICBnb3RvIEVycjsKKyAgfQorCisgIGlmICgoY29uc2lkZXJfbG9zc2xlc3MgJiYgSXNFbXB0eVJlY3QoJmRpc3Bvc2Vfbm9uZV9wYXJhbXMucmVjdF9sbF8pKSB8fAorICAgICAgKGNvbnNpZGVyX2xvc3N5ICYmIElzRW1wdHlSZWN0KCZkaXNwb3NlX25vbmVfcGFyYW1zLnJlY3RfbG9zc3lfKSkpIHsKKyAgICAvLyBEb24ndCBlbmNvZGUgdGhlIGZyYW1lIGF0IGFsbC4gSW5zdGVhZCwgdGhlIGR1cmF0aW9uIG9mIHRoZSBwcmV2aW91cworICAgIC8vIGZyYW1lIHdpbGwgYmUgaW5jcmVhc2VkIGxhdGVyLgorICAgIGFzc2VydChlbXB0eV9yZWN0X2FsbG93ZWRfbm9uZSk7CisgICAgKmZyYW1lX3NraXBwZWQgPSAxOworICAgIGdvdG8gRW5kOworICB9CisKKyAgaWYgKGRpc3Bvc2VfYmdfcG9zc2libGUpIHsKKyAgICAvLyBDaGFuZ2UtcmVjdGFuZ2xlIGFzc3VtaW5nIHByZXZpb3VzIGZyYW1lIHdhcyBESVNQT1NFX0JBQ0tHUk9VTkQuCisgICAgV2ViUFBpY3R1cmUqIGNvbnN0IHByZXZfY2FudmFzX2Rpc3Bvc2VkID0gJmVuYy0+cHJldl9jYW52YXNfZGlzcG9zZWRfOworICAgIFdlYlBDb3B5UGl4ZWxzKHByZXZfY2FudmFzLCBwcmV2X2NhbnZhc19kaXNwb3NlZCk7CisgICAgRGlzcG9zZUZyYW1lUmVjdGFuZ2xlKFdFQlBfTVVYX0RJU1BPU0VfQkFDS0dST1VORCwgJmVuYy0+cHJldl9yZWN0XywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldl9jYW52YXNfZGlzcG9zZWQpOworCisgICAgaWYgKCFHZXRTdWJSZWN0cyhwcmV2X2NhbnZhc19kaXNwb3NlZCwgY3Vycl9jYW52YXMsIGlzX2tleV9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIGlzX2ZpcnN0X2ZyYW1lLCBjb25maWdfbG9zc3kucXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICZkaXNwb3NlX2JnX3BhcmFtcykpIHsKKyAgICAgIGVycm9yX2NvZGUgPSBWUDhfRU5DX0VSUk9SX0lOVkFMSURfQ09ORklHVVJBVElPTjsKKyAgICAgIGdvdG8gRXJyOworICAgIH0KKyAgICBhc3NlcnQoIUlzRW1wdHlSZWN0KCZkaXNwb3NlX2JnX3BhcmFtcy5yZWN0X2xsXykpOworICAgIGFzc2VydCghSXNFbXB0eVJlY3QoJmRpc3Bvc2VfYmdfcGFyYW1zLnJlY3RfbG9zc3lfKSk7CisKKyAgICBpZiAoZW5jLT5vcHRpb25zXy5taW5pbWl6ZV9zaXplKSB7ICAvLyBUcnkgYm90aCBkaXNwb3NlIG1ldGhvZHMuCisgICAgICBkaXNwb3NlX2JnX3BhcmFtcy5zaG91bGRfdHJ5XyA9IDE7CisgICAgICBkaXNwb3NlX25vbmVfcGFyYW1zLnNob3VsZF90cnlfID0gMTsKKyAgICB9IGVsc2UgaWYgKChpc19sb3NzbGVzcyAmJgorICAgICAgICAgICAgICAgIFJlY3RBcmVhKCZkaXNwb3NlX2JnX3BhcmFtcy5yZWN0X2xsXykgPAorICAgICAgICAgICAgICAgICAgICBSZWN0QXJlYSgmZGlzcG9zZV9ub25lX3BhcmFtcy5yZWN0X2xsXykpIHx8CisgICAgICAgICAgICAgICAoIWlzX2xvc3NsZXNzICYmCisgICAgICAgICAgICAgICAgUmVjdEFyZWEoJmRpc3Bvc2VfYmdfcGFyYW1zLnJlY3RfbG9zc3lfKSA8CisgICAgICAgICAgICAgICAgICAgIFJlY3RBcmVhKCZkaXNwb3NlX25vbmVfcGFyYW1zLnJlY3RfbG9zc3lfKSkpIHsKKyAgICAgIGRpc3Bvc2VfYmdfcGFyYW1zLnNob3VsZF90cnlfID0gMTsgIC8vIFBpY2sgRElTUE9TRV9CQUNLR1JPVU5ELgorICAgICAgZGlzcG9zZV9ub25lX3BhcmFtcy5zaG91bGRfdHJ5XyA9IDA7CisgICAgfQorICB9CisKKyAgaWYgKGRpc3Bvc2Vfbm9uZV9wYXJhbXMuc2hvdWxkX3RyeV8pIHsKKyAgICBlcnJvcl9jb2RlID0gR2VuZXJhdGVDYW5kaWRhdGVzKAorICAgICAgICBlbmMsIGNhbmRpZGF0ZXMsIFdFQlBfTVVYX0RJU1BPU0VfTk9ORSwgaXNfbG9zc2xlc3MsIGlzX2tleV9mcmFtZSwKKyAgICAgICAgJmRpc3Bvc2Vfbm9uZV9wYXJhbXMsICZjb25maWdfbGwsICZjb25maWdfbG9zc3kpOworICAgIGlmIChlcnJvcl9jb2RlICE9IFZQOF9FTkNfT0spIGdvdG8gRXJyOworICB9CisKKyAgaWYgKGRpc3Bvc2VfYmdfcGFyYW1zLnNob3VsZF90cnlfKSB7CisgICAgYXNzZXJ0KCFlbmMtPmlzX2ZpcnN0X2ZyYW1lXyk7CisgICAgYXNzZXJ0KGRpc3Bvc2VfYmdfcG9zc2libGUpOworICAgIGVycm9yX2NvZGUgPSBHZW5lcmF0ZUNhbmRpZGF0ZXMoCisgICAgICAgIGVuYywgY2FuZGlkYXRlcywgV0VCUF9NVVhfRElTUE9TRV9CQUNLR1JPVU5ELCBpc19sb3NzbGVzcywgaXNfa2V5X2ZyYW1lLAorICAgICAgICAmZGlzcG9zZV9iZ19wYXJhbXMsICZjb25maWdfbGwsICZjb25maWdfbG9zc3kpOworICAgIGlmIChlcnJvcl9jb2RlICE9IFZQOF9FTkNfT0spIGdvdG8gRXJyOworICB9CisKKyAgUGlja0Jlc3RDYW5kaWRhdGUoZW5jLCBjYW5kaWRhdGVzLCBpc19rZXlfZnJhbWUsIGVuY29kZWRfZnJhbWUpOworCisgIGdvdG8gRW5kOworCisgRXJyOgorICBmb3IgKGkgPSAwOyBpIDwgQ0FORElEQVRFX0NPVU5UOyArK2kpIHsKKyAgICBpZiAoY2FuZGlkYXRlc1tpXS5ldmFsdWF0ZV8pIHsKKyAgICAgIFdlYlBNZW1vcnlXcml0ZXJDbGVhcigmY2FuZGlkYXRlc1tpXS5tZW1fKTsKKyAgICB9CisgIH0KKworIEVuZDoKKyAgU3ViRnJhbWVQYXJhbXNGcmVlKCZkaXNwb3NlX25vbmVfcGFyYW1zKTsKKyAgU3ViRnJhbWVQYXJhbXNGcmVlKCZkaXNwb3NlX2JnX3BhcmFtcyk7CisgIHJldHVybiBlcnJvcl9jb2RlOworfQorCisvLyBDYWxjdWxhdGUgdGhlIHBlbmFsdHkgaW5jdXJyZWQgaWYgd2UgZW5jb2RlIGdpdmVuIGZyYW1lIGFzIGEga2V5IGZyYW1lCisvLyBpbnN0ZWFkIG9mIGEgc3ViLWZyYW1lLgorc3RhdGljIGludDY0X3QgS2V5RnJhbWVQZW5hbHR5KGNvbnN0IEVuY29kZWRGcmFtZSogY29uc3QgZW5jb2RlZF9mcmFtZSkgeworICByZXR1cm4gKChpbnQ2NF90KWVuY29kZWRfZnJhbWUtPmtleV9mcmFtZV8uYml0c3RyZWFtLnNpemUgLQorICAgICAgICAgIGVuY29kZWRfZnJhbWUtPnN1Yl9mcmFtZV8uYml0c3RyZWFtLnNpemUpOworfQorCitzdGF0aWMgaW50IENhY2hlRnJhbWUoV2ViUEFuaW1FbmNvZGVyKiBjb25zdCBlbmMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUENvbmZpZyogY29uc3QgY29uZmlnKSB7CisgIGludCBvayA9IDA7CisgIGludCBmcmFtZV9za2lwcGVkID0gMDsKKyAgV2ViUEVuY29kaW5nRXJyb3IgZXJyb3JfY29kZSA9IFZQOF9FTkNfT0s7CisgIGNvbnN0IHNpemVfdCBwb3NpdGlvbiA9IGVuYy0+Y291bnRfOworICBFbmNvZGVkRnJhbWUqIGNvbnN0IGVuY29kZWRfZnJhbWUgPSBHZXRGcmFtZShlbmMsIHBvc2l0aW9uKTsKKworICArK2VuYy0+Y291bnRfOworCisgIGlmIChlbmMtPmlzX2ZpcnN0X2ZyYW1lXykgeyAgLy8gQWRkIHRoaXMgYXMgYSBrZXktZnJhbWUuCisgICAgZXJyb3JfY29kZSA9IFNldEZyYW1lKGVuYywgY29uZmlnLCAxLCBlbmNvZGVkX2ZyYW1lLCAmZnJhbWVfc2tpcHBlZCk7CisgICAgaWYgKGVycm9yX2NvZGUgIT0gVlA4X0VOQ19PSykgZ290byBFbmQ7CisgICAgYXNzZXJ0KGZyYW1lX3NraXBwZWQgPT0gMCk7ICAvLyBGaXJzdCBmcmFtZSBjYW4ndCBiZSBza2lwcGVkLCBldmVuIGlmIGVtcHR5LgorICAgIGFzc2VydChwb3NpdGlvbiA9PSAwICYmIGVuYy0+Y291bnRfID09IDEpOworICAgIGVuY29kZWRfZnJhbWUtPmlzX2tleV9mcmFtZV8gPSAxOworICAgIGVuYy0+Zmx1c2hfY291bnRfID0gMDsKKyAgICBlbmMtPmNvdW50X3NpbmNlX2tleV9mcmFtZV8gPSAwOworICAgIGVuYy0+cHJldl9jYW5kaWRhdGVfdW5kZWNpZGVkXyA9IDA7CisgIH0gZWxzZSB7CisgICAgKytlbmMtPmNvdW50X3NpbmNlX2tleV9mcmFtZV87CisgICAgaWYgKGVuYy0+Y291bnRfc2luY2Vfa2V5X2ZyYW1lXyA8PSBlbmMtPm9wdGlvbnNfLmttaW4pIHsKKyAgICAgIC8vIEFkZCB0aGlzIGFzIGEgZnJhbWUgcmVjdGFuZ2xlLgorICAgICAgZXJyb3JfY29kZSA9IFNldEZyYW1lKGVuYywgY29uZmlnLCAwLCBlbmNvZGVkX2ZyYW1lLCAmZnJhbWVfc2tpcHBlZCk7CisgICAgICBpZiAoZXJyb3JfY29kZSAhPSBWUDhfRU5DX09LKSBnb3RvIEVuZDsKKyAgICAgIGlmIChmcmFtZV9za2lwcGVkKSBnb3RvIFNraXA7CisgICAgICBlbmNvZGVkX2ZyYW1lLT5pc19rZXlfZnJhbWVfID0gMDsKKyAgICAgIGVuYy0+Zmx1c2hfY291bnRfID0gZW5jLT5jb3VudF8gLSAxOworICAgICAgZW5jLT5wcmV2X2NhbmRpZGF0ZV91bmRlY2lkZWRfID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgaW50NjRfdCBjdXJyX2RlbHRhOworICAgICAgRnJhbWVSZWN0YW5nbGUgcHJldl9yZWN0X2tleSwgcHJldl9yZWN0X3N1YjsKKworICAgICAgLy8gQWRkIHRoaXMgYXMgYSBmcmFtZSByZWN0YW5nbGUgdG8gZW5jLgorICAgICAgZXJyb3JfY29kZSA9IFNldEZyYW1lKGVuYywgY29uZmlnLCAwLCBlbmNvZGVkX2ZyYW1lLCAmZnJhbWVfc2tpcHBlZCk7CisgICAgICBpZiAoZXJyb3JfY29kZSAhPSBWUDhfRU5DX09LKSBnb3RvIEVuZDsKKyAgICAgIGlmIChmcmFtZV9za2lwcGVkKSBnb3RvIFNraXA7CisgICAgICBwcmV2X3JlY3Rfc3ViID0gZW5jLT5wcmV2X3JlY3RfOworCisKKyAgICAgIC8vIEFkZCB0aGlzIGFzIGEga2V5LWZyYW1lIHRvIGVuYywgdG9vLgorICAgICAgZXJyb3JfY29kZSA9IFNldEZyYW1lKGVuYywgY29uZmlnLCAxLCBlbmNvZGVkX2ZyYW1lLCAmZnJhbWVfc2tpcHBlZCk7CisgICAgICBpZiAoZXJyb3JfY29kZSAhPSBWUDhfRU5DX09LKSBnb3RvIEVuZDsKKyAgICAgIGFzc2VydChmcmFtZV9za2lwcGVkID09IDApOyAgLy8gS2V5LWZyYW1lIGNhbm5vdCBiZSBhbiBlbXB0eSByZWN0YW5nbGUuCisgICAgICBwcmV2X3JlY3Rfa2V5ID0gZW5jLT5wcmV2X3JlY3RfOworCisgICAgICAvLyBBbmFseXplIHNpemUgZGlmZmVyZW5jZSBvZiB0aGUgdHdvIHZhcmlhbnRzLgorICAgICAgY3Vycl9kZWx0YSA9IEtleUZyYW1lUGVuYWx0eShlbmNvZGVkX2ZyYW1lKTsKKyAgICAgIGlmIChjdXJyX2RlbHRhIDw9IGVuYy0+YmVzdF9kZWx0YV8pIHsgIC8vIFBpY2sgdGhpcyBhcyB0aGUga2V5LWZyYW1lLgorICAgICAgICBpZiAoZW5jLT5rZXlmcmFtZV8gIT0gS0VZRlJBTUVfTk9ORSkgeworICAgICAgICAgIEVuY29kZWRGcmFtZSogY29uc3Qgb2xkX2tleWZyYW1lID0gR2V0RnJhbWUoZW5jLCBlbmMtPmtleWZyYW1lXyk7CisgICAgICAgICAgYXNzZXJ0KG9sZF9rZXlmcmFtZS0+aXNfa2V5X2ZyYW1lXyk7CisgICAgICAgICAgb2xkX2tleWZyYW1lLT5pc19rZXlfZnJhbWVfID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbmNvZGVkX2ZyYW1lLT5pc19rZXlfZnJhbWVfID0gMTsKKyAgICAgICAgZW5jLT5wcmV2X2NhbmRpZGF0ZV91bmRlY2lkZWRfID0gMTsKKyAgICAgICAgZW5jLT5rZXlmcmFtZV8gPSAoaW50KXBvc2l0aW9uOworICAgICAgICBlbmMtPmJlc3RfZGVsdGFfID0gY3Vycl9kZWx0YTsKKyAgICAgICAgZW5jLT5mbHVzaF9jb3VudF8gPSBlbmMtPmNvdW50XyAtIDE7ICAvLyBXZSBjYW4gZmx1c2ggcHJldmlvdXMgZnJhbWVzLgorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZW5jb2RlZF9mcmFtZS0+aXNfa2V5X2ZyYW1lXyA9IDA7CisgICAgICAgIGVuYy0+cHJldl9jYW5kaWRhdGVfdW5kZWNpZGVkXyA9IDA7CisgICAgICB9CisgICAgICAvLyBOb3RlOiBXZSBuZWVkICc+PScgYmVsb3cgYmVjYXVzZSB3aGVuIGttaW4gYW5kIGttYXggYXJlIGJvdGggemVybywKKyAgICAgIC8vIGNvdW50X3NpbmNlX2tleV9mcmFtZSB3aWxsIGFsd2F5cyBiZSA+IGttYXguCisgICAgICBpZiAoZW5jLT5jb3VudF9zaW5jZV9rZXlfZnJhbWVfID49IGVuYy0+b3B0aW9uc18ua21heCkgeworICAgICAgICBlbmMtPmZsdXNoX2NvdW50XyA9IGVuYy0+Y291bnRfIC0gMTsKKyAgICAgICAgZW5jLT5jb3VudF9zaW5jZV9rZXlfZnJhbWVfID0gMDsKKyAgICAgICAgZW5jLT5rZXlmcmFtZV8gPSBLRVlGUkFNRV9OT05FOworICAgICAgICBlbmMtPmJlc3RfZGVsdGFfID0gREVMVEFfSU5GSU5JVFk7CisgICAgICB9CisgICAgICBpZiAoIWVuYy0+cHJldl9jYW5kaWRhdGVfdW5kZWNpZGVkXykgeworICAgICAgICBlbmMtPnByZXZfcmVjdF8gPQorICAgICAgICAgICAgZW5jb2RlZF9mcmFtZS0+aXNfa2V5X2ZyYW1lXyA/IHByZXZfcmVjdF9rZXkgOiBwcmV2X3JlY3Rfc3ViOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIFVwZGF0ZSBwcmV2aW91cyB0byBwcmV2aW91cyBhbmQgcHJldmlvdXMgY2FudmFzZXMgZm9yIG5leHQgY2FsbC4KKyAgV2ViUENvcHlQaXhlbHMoZW5jLT5jdXJyX2NhbnZhc18sICZlbmMtPnByZXZfY2FudmFzXyk7CisgIGVuYy0+aXNfZmlyc3RfZnJhbWVfID0gMDsKKworIFNraXA6CisgIG9rID0gMTsKKyAgKytlbmMtPmluX2ZyYW1lX2NvdW50XzsKKworIEVuZDoKKyAgaWYgKCFvayB8fCBmcmFtZV9za2lwcGVkKSB7CisgICAgRnJhbWVSZWxlYXNlKGVuY29kZWRfZnJhbWUpOworICAgIC8vIFdlIHJlc2V0IHNvbWUgY291bnRlcnMsIGFzIHRoZSBmcmFtZSBhZGRpdGlvbiBmYWlsZWQvd2FzIHNraXBwZWQuCisgICAgLS1lbmMtPmNvdW50XzsKKyAgICBpZiAoIWVuYy0+aXNfZmlyc3RfZnJhbWVfKSAtLWVuYy0+Y291bnRfc2luY2Vfa2V5X2ZyYW1lXzsKKyAgICBpZiAoIW9rKSB7CisgICAgICBNYXJrRXJyb3IyKGVuYywgIkVSUk9SIGFkZGluZyBmcmFtZS4gV2ViUEVuY29kaW5nRXJyb3IiLCBlcnJvcl9jb2RlKTsKKyAgICB9CisgIH0KKyAgZW5jLT5jdXJyX2NhbnZhc18tPmVycm9yX2NvZGUgPSBlcnJvcl9jb2RlOyAgIC8vIHJlcG9ydCBlcnJvcl9jb2RlCisgIGFzc2VydChvayB8fCBlcnJvcl9jb2RlICE9IFZQOF9FTkNfT0spOworICByZXR1cm4gb2s7Cit9CisKK3N0YXRpYyBpbnQgRmx1c2hGcmFtZXMoV2ViUEFuaW1FbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgd2hpbGUgKGVuYy0+Zmx1c2hfY291bnRfID4gMCkgeworICAgIFdlYlBNdXhFcnJvciBlcnI7CisgICAgRW5jb2RlZEZyYW1lKiBjb25zdCBjdXJyID0gR2V0RnJhbWUoZW5jLCAwKTsKKyAgICBjb25zdCBXZWJQTXV4RnJhbWVJbmZvKiBjb25zdCBpbmZvID0KKyAgICAgICAgY3Vyci0+aXNfa2V5X2ZyYW1lXyA/ICZjdXJyLT5rZXlfZnJhbWVfIDogJmN1cnItPnN1Yl9mcmFtZV87CisgICAgYXNzZXJ0KGVuYy0+bXV4XyAhPSBOVUxMKTsKKyAgICBlcnIgPSBXZWJQTXV4UHVzaEZyYW1lKGVuYy0+bXV4XywgaW5mbywgMSk7CisgICAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgeworICAgICAgTWFya0Vycm9yMihlbmMsICJFUlJPUiBhZGRpbmcgZnJhbWUuIFdlYlBNdXhFcnJvciIsIGVycik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKGVuYy0+b3B0aW9uc18udmVyYm9zZSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJJTkZPOiBBZGRlZCBmcmFtZS4gb2Zmc2V0OiVkLCVkIGRpc3Bvc2U6JWQgYmxlbmQ6JWRcbiIsCisgICAgICAgICAgICAgIGluZm8tPnhfb2Zmc2V0LCBpbmZvLT55X29mZnNldCwgaW5mby0+ZGlzcG9zZV9tZXRob2QsCisgICAgICAgICAgICAgIGluZm8tPmJsZW5kX21ldGhvZCk7CisgICAgfQorICAgICsrZW5jLT5vdXRfZnJhbWVfY291bnRfOworICAgIEZyYW1lUmVsZWFzZShjdXJyKTsKKyAgICArK2VuYy0+c3RhcnRfOworICAgIC0tZW5jLT5mbHVzaF9jb3VudF87CisgICAgLS1lbmMtPmNvdW50XzsKKyAgICBpZiAoZW5jLT5rZXlmcmFtZV8gIT0gS0VZRlJBTUVfTk9ORSkgLS1lbmMtPmtleWZyYW1lXzsKKyAgfQorCisgIGlmIChlbmMtPmNvdW50XyA9PSAxICYmIGVuYy0+c3RhcnRfICE9IDApIHsKKyAgICAvLyBNb3ZlIGVuYy0+c3RhcnQgdG8gaW5kZXggMC4KKyAgICBjb25zdCBpbnQgZW5jX3N0YXJ0X3RtcCA9IChpbnQpZW5jLT5zdGFydF87CisgICAgRW5jb2RlZEZyYW1lIHRlbXAgPSBlbmMtPmVuY29kZWRfZnJhbWVzX1swXTsKKyAgICBlbmMtPmVuY29kZWRfZnJhbWVzX1swXSA9IGVuYy0+ZW5jb2RlZF9mcmFtZXNfW2VuY19zdGFydF90bXBdOworICAgIGVuYy0+ZW5jb2RlZF9mcmFtZXNfW2VuY19zdGFydF90bXBdID0gdGVtcDsKKyAgICBGcmFtZVJlbGVhc2UoJmVuYy0+ZW5jb2RlZF9mcmFtZXNfW2VuY19zdGFydF90bXBdKTsKKyAgICBlbmMtPnN0YXJ0XyA9IDA7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKyN1bmRlZiBERUxUQV9JTkZJTklUWQorI3VuZGVmIEtFWUZSQU1FX05PTkUKKworaW50IFdlYlBBbmltRW5jb2RlckFkZChXZWJQQW5pbUVuY29kZXIqIGVuYywgV2ViUFBpY3R1cmUqIGZyYW1lLCBpbnQgdGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQQ29uZmlnKiBlbmNvZGVyX2NvbmZpZykgeworICBXZWJQQ29uZmlnIGNvbmZpZzsKKyAgaW50IG9rOworCisgIGlmIChlbmMgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisgIE1hcmtOb0Vycm9yKGVuYyk7CisKKyAgaWYgKCFlbmMtPmlzX2ZpcnN0X2ZyYW1lXykgeworICAgIC8vIE1ha2Ugc3VyZSB0aW1lc3RhbXBzIGFyZSBub24tZGVjcmVhc2luZyAoaW50ZWdlciB3cmFwLWFyb3VuZCBpcyBPSykuCisgICAgY29uc3QgdWludDMyX3QgcHJldl9mcmFtZV9kdXJhdGlvbiA9CisgICAgICAgICh1aW50MzJfdCl0aW1lc3RhbXAgLSBlbmMtPnByZXZfdGltZXN0YW1wXzsKKyAgICBpZiAocHJldl9mcmFtZV9kdXJhdGlvbiA+PSBNQVhfRFVSQVRJT04pIHsKKyAgICAgIGlmIChmcmFtZSAhPSBOVUxMKSB7CisgICAgICAgIGZyYW1lLT5lcnJvcl9jb2RlID0gVlA4X0VOQ19FUlJPUl9JTlZBTElEX0NPTkZJR1VSQVRJT047CisgICAgICB9CisgICAgICBNYXJrRXJyb3IoZW5jLCAiRVJST1IgYWRkaW5nIGZyYW1lOiB0aW1lc3RhbXBzIG11c3QgYmUgbm9uLWRlY3JlYXNpbmciKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoIUluY3JlYXNlUHJldmlvdXNEdXJhdGlvbihlbmMsIChpbnQpcHJldl9mcmFtZV9kdXJhdGlvbikpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBlbmMtPmZpcnN0X3RpbWVzdGFtcF8gPSB0aW1lc3RhbXA7CisgIH0KKworICBpZiAoZnJhbWUgPT0gTlVMTCkgeyAgLy8gU3BlY2lhbDogbGFzdCBjYWxsLgorICAgIGVuYy0+Z290X251bGxfZnJhbWVfID0gMTsKKyAgICBlbmMtPnByZXZfdGltZXN0YW1wXyA9IHRpbWVzdGFtcDsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGlmIChmcmFtZS0+d2lkdGggIT0gZW5jLT5jYW52YXNfd2lkdGhfIHx8CisgICAgICBmcmFtZS0+aGVpZ2h0ICE9IGVuYy0+Y2FudmFzX2hlaWdodF8pIHsKKyAgICBmcmFtZS0+ZXJyb3JfY29kZSA9IFZQOF9FTkNfRVJST1JfSU5WQUxJRF9DT05GSUdVUkFUSU9OOworICAgIE1hcmtFcnJvcihlbmMsICJFUlJPUiBhZGRpbmcgZnJhbWU6IEludmFsaWQgZnJhbWUgZGltZW5zaW9ucyIpOworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKCFmcmFtZS0+dXNlX2FyZ2IpIHsgIC8vIENvbnZlcnQgZnJhbWUgZnJvbSBZVVYoQSkgdG8gQVJHQi4KKyAgICBpZiAoZW5jLT5vcHRpb25zXy52ZXJib3NlKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIldBUk5JTkc6IENvbnZlcnRpbmcgZnJhbWUgZnJvbSBZVVYoQSkgdG8gQVJHQiBmb3JtYXQ7ICIKKyAgICAgICAgICAgICAgInRoaXMgaW5jdXJzIGEgc21hbGwgbG9zcy5cbiIpOworICAgIH0KKyAgICBpZiAoIVdlYlBQaWN0dXJlWVVWQVRvQVJHQihmcmFtZSkpIHsKKyAgICAgIE1hcmtFcnJvcihlbmMsICJFUlJPUiBjb252ZXJ0aW5nIGZyYW1lIGZyb20gWVVWKEEpIHRvIEFSR0IiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorCisgIGlmIChlbmNvZGVyX2NvbmZpZyAhPSBOVUxMKSB7CisgICAgaWYgKCFXZWJQVmFsaWRhdGVDb25maWcoZW5jb2Rlcl9jb25maWcpKSB7CisgICAgICBNYXJrRXJyb3IoZW5jLCAiRVJST1IgYWRkaW5nIGZyYW1lOiBJbnZhbGlkIFdlYlBDb25maWciKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBjb25maWcgPSAqZW5jb2Rlcl9jb25maWc7CisgIH0gZWxzZSB7CisgICAgV2ViUENvbmZpZ0luaXQoJmNvbmZpZyk7CisgICAgY29uZmlnLmxvc3NsZXNzID0gMTsKKyAgfQorICBhc3NlcnQoZW5jLT5jdXJyX2NhbnZhc18gPT0gTlVMTCk7CisgIGVuYy0+Y3Vycl9jYW52YXNfID0gZnJhbWU7ICAvLyBTdG9yZSByZWZlcmVuY2UuCisgIGFzc2VydChlbmMtPmN1cnJfY2FudmFzX2NvcHlfbW9kaWZpZWRfID09IDEpOworICBDb3B5Q3VycmVudENhbnZhcyhlbmMpOworCisgIG9rID0gQ2FjaGVGcmFtZShlbmMsICZjb25maWcpICYmIEZsdXNoRnJhbWVzKGVuYyk7CisKKyAgZW5jLT5jdXJyX2NhbnZhc18gPSBOVUxMOworICBlbmMtPmN1cnJfY2FudmFzX2NvcHlfbW9kaWZpZWRfID0gMTsKKyAgaWYgKG9rKSB7CisgICAgZW5jLT5wcmV2X3RpbWVzdGFtcF8gPSB0aW1lc3RhbXA7CisgIH0KKyAgcmV0dXJuIG9rOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQml0c3RyZWFtIGFzc2VtYmx5LgorCitzdGF0aWMgaW50IERlY29kZUZyYW1lT250b0NhbnZhcyhjb25zdCBXZWJQTXV4RnJhbWVJbmZvKiBjb25zdCBmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBQaWN0dXJlKiBjb25zdCBjYW52YXMpIHsKKyAgY29uc3QgV2ViUERhdGEqIGNvbnN0IGltYWdlID0gJmZyYW1lLT5iaXRzdHJlYW07CisgIFdlYlBQaWN0dXJlIHN1Yl9pbWFnZTsKKyAgV2ViUERlY29kZXJDb25maWcgY29uZmlnOworICBXZWJQSW5pdERlY29kZXJDb25maWcoJmNvbmZpZyk7CisgIFdlYlBVdGlsQ2xlYXJQaWMoY2FudmFzLCBOVUxMKTsKKyAgaWYgKFdlYlBHZXRGZWF0dXJlcyhpbWFnZS0+Ynl0ZXMsIGltYWdlLT5zaXplLCAmY29uZmlnLmlucHV0KSAhPQorICAgICAgVlA4X1NUQVRVU19PSykgeworICAgIHJldHVybiAwOworICB9CisgIGlmICghV2ViUFBpY3R1cmVWaWV3KGNhbnZhcywgZnJhbWUtPnhfb2Zmc2V0LCBmcmFtZS0+eV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5pbnB1dC53aWR0aCwgY29uZmlnLmlucHV0LmhlaWdodCwgJnN1Yl9pbWFnZSkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBjb25maWcub3V0cHV0LmlzX2V4dGVybmFsX21lbW9yeSA9IDE7CisgIGNvbmZpZy5vdXRwdXQuY29sb3JzcGFjZSA9IE1PREVfQkdSQTsKKyAgY29uZmlnLm91dHB1dC51LlJHQkEucmdiYSA9ICh1aW50OF90KilzdWJfaW1hZ2UuYXJnYjsKKyAgY29uZmlnLm91dHB1dC51LlJHQkEuc3RyaWRlID0gc3ViX2ltYWdlLmFyZ2Jfc3RyaWRlICogNDsKKyAgY29uZmlnLm91dHB1dC51LlJHQkEuc2l6ZSA9IGNvbmZpZy5vdXRwdXQudS5SR0JBLnN0cmlkZSAqIHN1Yl9pbWFnZS5oZWlnaHQ7CisKKyAgaWYgKFdlYlBEZWNvZGUoaW1hZ2UtPmJ5dGVzLCBpbWFnZS0+c2l6ZSwgJmNvbmZpZykgIT0gVlA4X1NUQVRVU19PSykgeworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IEZyYW1lVG9GdWxsQ2FudmFzKFdlYlBBbmltRW5jb2RlciogY29uc3QgZW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQTXV4RnJhbWVJbmZvKiBjb25zdCBmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUERhdGEqIGNvbnN0IGZ1bGxfaW1hZ2UpIHsKKyAgV2ViUFBpY3R1cmUqIGNvbnN0IGNhbnZhc19idWYgPSAmZW5jLT5jdXJyX2NhbnZhc19jb3B5XzsKKyAgV2ViUE1lbW9yeVdyaXRlciBtZW0xLCBtZW0yOworICBXZWJQTWVtb3J5V3JpdGVySW5pdCgmbWVtMSk7CisgIFdlYlBNZW1vcnlXcml0ZXJJbml0KCZtZW0yKTsKKworICBpZiAoIURlY29kZUZyYW1lT250b0NhbnZhcyhmcmFtZSwgY2FudmFzX2J1ZikpIGdvdG8gRXJyOworICBpZiAoIUVuY29kZUZyYW1lKCZlbmMtPmxhc3RfY29uZmlnXywgY2FudmFzX2J1ZiwgJm1lbTEpKSBnb3RvIEVycjsKKyAgR2V0RW5jb2RlZERhdGEoJm1lbTEsIGZ1bGxfaW1hZ2UpOworCisgIGlmIChlbmMtPm9wdGlvbnNfLmFsbG93X21peGVkKSB7CisgICAgaWYgKCFFbmNvZGVGcmFtZSgmZW5jLT5sYXN0X2NvbmZpZ19yZXZlcnNlZF8sIGNhbnZhc19idWYsICZtZW0yKSkgZ290byBFcnI7CisgICAgaWYgKG1lbTIuc2l6ZSA8IG1lbTEuc2l6ZSkgeworICAgICAgR2V0RW5jb2RlZERhdGEoJm1lbTIsIGZ1bGxfaW1hZ2UpOworICAgICAgV2ViUE1lbW9yeVdyaXRlckNsZWFyKCZtZW0xKTsKKyAgICB9IGVsc2UgeworICAgICAgV2ViUE1lbW9yeVdyaXRlckNsZWFyKCZtZW0yKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7CisKKyBFcnI6CisgIFdlYlBNZW1vcnlXcml0ZXJDbGVhcigmbWVtMSk7CisgIFdlYlBNZW1vcnlXcml0ZXJDbGVhcigmbWVtMik7CisgIHJldHVybiAwOworfQorCisvLyBDb252ZXJ0IGEgc2luZ2xlLWZyYW1lIGFuaW1hdGlvbiB0byBhIG5vbi1hbmltYXRlZCBpbWFnZSBpZiBhcHByb3ByaWF0ZS4KKy8vIFRPRE8odXJ2YW5nKTogQ2FuIHdlIHBpY2sgb25lIG9mIHRoZSB0d28gaGV1cmlzdGljYWxseSAoYmFzZWQgb24gZnJhbWUKKy8vIHJlY3RhbmdsZSBhbmQvb3IgcHJlc2VuY2Ugb2YgYWxwaGEpPworc3RhdGljIFdlYlBNdXhFcnJvciBPcHRpbWl6ZVNpbmdsZUZyYW1lKFdlYlBBbmltRW5jb2RlciogY29uc3QgZW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBEYXRhKiBjb25zdCB3ZWJwX2RhdGEpIHsKKyAgV2ViUE11eEVycm9yIGVyciA9IFdFQlBfTVVYX09LOworICBpbnQgY2FudmFzX3dpZHRoLCBjYW52YXNfaGVpZ2h0OworICBXZWJQTXV4RnJhbWVJbmZvIGZyYW1lOworICBXZWJQRGF0YSBmdWxsX2ltYWdlOworICBXZWJQRGF0YSB3ZWJwX2RhdGEyOworICBXZWJQTXV4KiBjb25zdCBtdXggPSBXZWJQTXV4Q3JlYXRlKHdlYnBfZGF0YSwgMCk7CisgIGlmIChtdXggPT0gTlVMTCkgcmV0dXJuIFdFQlBfTVVYX0JBRF9EQVRBOworICBhc3NlcnQoZW5jLT5vdXRfZnJhbWVfY291bnRfID09IDEpOworICBXZWJQRGF0YUluaXQoJmZyYW1lLmJpdHN0cmVhbSk7CisgIFdlYlBEYXRhSW5pdCgmZnVsbF9pbWFnZSk7CisgIFdlYlBEYXRhSW5pdCgmd2VicF9kYXRhMik7CisKKyAgZXJyID0gV2ViUE11eEdldEZyYW1lKG11eCwgMSwgJmZyYW1lKTsKKyAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgZ290byBFbmQ7CisgIGlmIChmcmFtZS5pZCAhPSBXRUJQX0NIVU5LX0FOTUYpIGdvdG8gRW5kOyAgLy8gTm9uLWFuaW1hdGlvbjogbm90aGluZyB0byBkby4KKyAgZXJyID0gV2ViUE11eEdldENhbnZhc1NpemUobXV4LCAmY2FudmFzX3dpZHRoLCAmY2FudmFzX2hlaWdodCk7CisgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIGdvdG8gRW5kOworICBpZiAoIUZyYW1lVG9GdWxsQ2FudmFzKGVuYywgJmZyYW1lLCAmZnVsbF9pbWFnZSkpIHsKKyAgICBlcnIgPSBXRUJQX01VWF9CQURfREFUQTsKKyAgICBnb3RvIEVuZDsKKyAgfQorICBlcnIgPSBXZWJQTXV4U2V0SW1hZ2UobXV4LCAmZnVsbF9pbWFnZSwgMSk7CisgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIGdvdG8gRW5kOworICBlcnIgPSBXZWJQTXV4QXNzZW1ibGUobXV4LCAmd2VicF9kYXRhMik7CisgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIGdvdG8gRW5kOworCisgIGlmICh3ZWJwX2RhdGEyLnNpemUgPCB3ZWJwX2RhdGEtPnNpemUpIHsgIC8vIFBpY2sgJ3dlYnBfZGF0YTInIGlmIHNtYWxsZXIuCisgICAgV2ViUERhdGFDbGVhcih3ZWJwX2RhdGEpOworICAgICp3ZWJwX2RhdGEgPSB3ZWJwX2RhdGEyOworICAgIFdlYlBEYXRhSW5pdCgmd2VicF9kYXRhMik7CisgIH0KKworIEVuZDoKKyAgV2ViUERhdGFDbGVhcigmZnJhbWUuYml0c3RyZWFtKTsKKyAgV2ViUERhdGFDbGVhcigmZnVsbF9pbWFnZSk7CisgIFdlYlBNdXhEZWxldGUobXV4KTsKKyAgV2ViUERhdGFDbGVhcigmd2VicF9kYXRhMik7CisgIHJldHVybiBlcnI7Cit9CisKK2ludCBXZWJQQW5pbUVuY29kZXJBc3NlbWJsZShXZWJQQW5pbUVuY29kZXIqIGVuYywgV2ViUERhdGEqIHdlYnBfZGF0YSkgeworICBXZWJQTXV4KiBtdXg7CisgIFdlYlBNdXhFcnJvciBlcnI7CisKKyAgaWYgKGVuYyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgTWFya05vRXJyb3IoZW5jKTsKKworICBpZiAod2VicF9kYXRhID09IE5VTEwpIHsKKyAgICBNYXJrRXJyb3IoZW5jLCAiRVJST1IgYXNzZW1ibGluZzogTlVMTCBpbnB1dCIpOworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKGVuYy0+aW5fZnJhbWVfY291bnRfID09IDApIHsKKyAgICBNYXJrRXJyb3IoZW5jLCAiRVJST1I6IE5vIGZyYW1lcyB0byBhc3NlbWJsZSIpOworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKCFlbmMtPmdvdF9udWxsX2ZyYW1lXyAmJiBlbmMtPmluX2ZyYW1lX2NvdW50XyA+IDEgJiYgZW5jLT5jb3VudF8gPiAwKSB7CisgICAgLy8gc2V0IGR1cmF0aW9uIG9mIHRoZSBsYXN0IGZyYW1lIHRvIGJlIGF2ZyBvZiBkdXJhdGlvbnMgb2YgcHJldmlvdXMgZnJhbWVzLgorICAgIGNvbnN0IGRvdWJsZSBkZWx0YV90aW1lID0KKyAgICAgICAgKHVpbnQzMl90KWVuYy0+cHJldl90aW1lc3RhbXBfIC0gZW5jLT5maXJzdF90aW1lc3RhbXBfOworICAgIGNvbnN0IGludCBhdmVyYWdlX2R1cmF0aW9uID0gKGludCkoZGVsdGFfdGltZSAvIChlbmMtPmluX2ZyYW1lX2NvdW50XyAtIDEpKTsKKyAgICBpZiAoIUluY3JlYXNlUHJldmlvdXNEdXJhdGlvbihlbmMsIGF2ZXJhZ2VfZHVyYXRpb24pKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKworICAvLyBGbHVzaCBhbnkgcmVtYWluaW5nIGZyYW1lcy4KKyAgZW5jLT5mbHVzaF9jb3VudF8gPSBlbmMtPmNvdW50XzsKKyAgaWYgKCFGbHVzaEZyYW1lcyhlbmMpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLyBTZXQgZGVmaW5pdGl2ZSBjYW52YXMgc2l6ZS4KKyAgbXV4ID0gZW5jLT5tdXhfOworICBlcnIgPSBXZWJQTXV4U2V0Q2FudmFzU2l6ZShtdXgsIGVuYy0+Y2FudmFzX3dpZHRoXywgZW5jLT5jYW52YXNfaGVpZ2h0Xyk7CisgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIGdvdG8gRXJyOworCisgIGVyciA9IFdlYlBNdXhTZXRBbmltYXRpb25QYXJhbXMobXV4LCAmZW5jLT5vcHRpb25zXy5hbmltX3BhcmFtcyk7CisgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIGdvdG8gRXJyOworCisgIC8vIEFzc2VtYmxlIGludG8gYSBXZWJQIGJpdHN0cmVhbS4KKyAgZXJyID0gV2ViUE11eEFzc2VtYmxlKG11eCwgd2VicF9kYXRhKTsKKyAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgZ290byBFcnI7CisKKyAgaWYgKGVuYy0+b3V0X2ZyYW1lX2NvdW50XyA9PSAxKSB7CisgICAgZXJyID0gT3B0aW1pemVTaW5nbGVGcmFtZShlbmMsIHdlYnBfZGF0YSk7CisgICAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgZ290byBFcnI7CisgIH0KKyAgcmV0dXJuIDE7CisKKyBFcnI6CisgIE1hcmtFcnJvcjIoZW5jLCAiRVJST1IgYXNzZW1ibGluZyBXZWJQIiwgZXJyKTsKKyAgcmV0dXJuIDA7Cit9CisKK2NvbnN0IGNoYXIqIFdlYlBBbmltRW5jb2RlckdldEVycm9yKFdlYlBBbmltRW5jb2RlciogZW5jKSB7CisgIGlmIChlbmMgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgIHJldHVybiBlbmMtPmVycm9yX3N0cl87Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvbXV4L2FuaW1pLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvbXV4L2FuaW1pLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg4OTk1MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9tdXgvYW5pbWkuaApAQCAtMCwwICsxLDQzIEBACisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gSW50ZXJuYWwgaGVhZGVyIGZvciBhbmltYXRpb24gcmVsYXRlZCBmdW5jdGlvbnMuCisvLworLy8gQXV0aG9yOiBIdWkgU3UgKGh1aXN1QGdvb2dsZS5jb20pCisKKyNpZm5kZWYgV0VCUF9NVVhfQU5JTUlfSF8KKyNkZWZpbmUgV0VCUF9NVVhfQU5JTUlfSF8KKworI2luY2x1ZGUgInNyYy93ZWJwL211eC5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8vIFBpY2tzIHRoZSBvcHRpbWFsIHJlY3RhbmdsZSBiZXR3ZWVuIHR3byBwaWN0dXJlcywgc3RhcnRpbmcgd2l0aCBpbml0aWFsCisvLyB2YWx1ZXMgb2Ygb2Zmc2V0cyBhbmQgZGltZW5zaW9ucyB0aGF0IGFyZSBwYXNzZWQgaW4uIFRoZSBpbml0aWFsCisvLyB2YWx1ZXMgd2lsbCBiZSBjbGlwcGVkLCBpZiBuZWNlc3NhcnksIHRvIG1ha2Ugc3VyZSB0aGUgcmVjdGFuZ2xlIGlzCisvLyB3aXRoaW4gdGhlIGNhbnZhcy4gInVzZV9hcmdiIiBtdXN0IGJlIHRydWUgZm9yIGJvdGggcGljdHVyZXMuCisvLyBQYXJhbWV0ZXJzOgorLy8gICBwcmV2X2NhbnZhcywgY3Vycl9jYW52YXMgLSAoaW4pIHR3byBpbnB1dCBwaWN0dXJlcyB0byBjb21wYXJlLgorLy8gICBpc19sb3NzbGVzcywgcXVhbGl0eSAtIChpbikgZW5jb2Rpbmcgc2V0dGluZ3MuCisvLyAgIHhfb2Zmc2V0LCB5X29mZnNldCwgd2lkdGgsIGhlaWdodCAtIChpbi9vdXQpIHJlY3RhbmdsZSBiZXR3ZWVuIHRoZSB0d28KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgcGljdHVyZXMuCisvLyBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcy4KK2ludCBXZWJQQW5pbUVuY29kZXJSZWZpbmVSZWN0KAorICAgIGNvbnN0IHN0cnVjdCBXZWJQUGljdHVyZSogY29uc3QgcHJldl9jYW52YXMsCisgICAgY29uc3Qgc3RydWN0IFdlYlBQaWN0dXJlKiBjb25zdCBjdXJyX2NhbnZhcywKKyAgICBpbnQgaXNfbG9zc2xlc3MsIGZsb2F0IHF1YWxpdHksIGludCogY29uc3QgeF9vZmZzZXQsIGludCogY29uc3QgeV9vZmZzZXQsCisgICAgaW50KiBjb25zdCB3aWR0aCwgaW50KiBjb25zdCBoZWlnaHQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gICAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLyogV0VCUF9NVVhfQU5JTUlfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9tdXgvbGlid2VicG11eC5wYy5pbiBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9tdXgvbGlid2VicG11eC5wYy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTZmYWM3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL211eC9saWJ3ZWJwbXV4LnBjLmluCkBAIC0wLDAgKzEsMTIgQEAKK3ByZWZpeD1AcHJlZml4QAorZXhlY19wcmVmaXg9QGV4ZWNfcHJlZml4QAorbGliZGlyPUBsaWJkaXJACitpbmNsdWRlZGlyPUBpbmNsdWRlZGlyQAorCitOYW1lOiBsaWJ3ZWJwbXV4CitEZXNjcmlwdGlvbjogTGlicmFyeSBmb3IgbWFuaXB1bGF0aW5nIHRoZSBXZWJQIGdyYXBoaWNzIGZvcm1hdCBjb250YWluZXIKK1ZlcnNpb246IEBQQUNLQUdFX1ZFUlNJT05ACitSZXF1aXJlczogbGlid2VicCA+PSAwLjIuMAorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0KK0xpYnM6IC1MJHtsaWJkaXJ9IC1sd2VicG11eAorTGlicy5wcml2YXRlOiAtbG0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9tdXgvbGlid2VicG11eC5yYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9tdXgvbGlid2VicG11eC5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzdkNWY2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL211eC9saWJ3ZWJwbXV4LnJjCkBAIC0wLDAgKzEsNDEgQEAKKyNkZWZpbmUgQVBTVFVESU9fUkVBRE9OTFlfU1lNQk9MUworI2luY2x1ZGUgIndpbnJlcy5oIgorI3VuZGVmIEFQU1RVRElPX1JFQURPTkxZX1NZTUJPTFMKKworI2lmICFkZWZpbmVkKEFGWF9SRVNPVVJDRV9ETEwpIHx8IGRlZmluZWQoQUZYX1RBUkdfRU5VKQorTEFOR1VBR0UgTEFOR19FTkdMSVNILCBTVUJMQU5HX0VOR0xJU0hfVVMKKworVlNfVkVSU0lPTl9JTkZPIFZFUlNJT05JTkZPCisgRklMRVZFUlNJT04gMSwwLDAsMAorIFBST0RVQ1RWRVJTSU9OIDEsMCwwLDAKKyBGSUxFRkxBR1NNQVNLIDB4M2ZMCisjaWZkZWYgX0RFQlVHCisgRklMRUZMQUdTIDB4MUwKKyNlbHNlCisgRklMRUZMQUdTIDB4MEwKKyNlbmRpZgorIEZJTEVPUyAweDQwMDA0TAorIEZJTEVUWVBFIDB4MkwKKyBGSUxFU1VCVFlQRSAweDBMCitCRUdJTgorICAgIEJMT0NLICJTdHJpbmdGaWxlSW5mbyIKKyAgICBCRUdJTgorICAgICAgICBCTE9DSyAiMDQwOTA0YjAiCisgICAgICAgIEJFR0lOCisgICAgICAgICAgICBWQUxVRSAiQ29tcGFueU5hbWUiLCAiR29vZ2xlLCBJbmMuIgorICAgICAgICAgICAgVkFMVUUgIkZpbGVEZXNjcmlwdGlvbiIsICJsaWJ3ZWJwbXV4IERMTCIKKyAgICAgICAgICAgIFZBTFVFICJGaWxlVmVyc2lvbiIsICIxLjAuMCIKKyAgICAgICAgICAgIFZBTFVFICJJbnRlcm5hbE5hbWUiLCAibGlid2VicG11eC5kbGwiCisgICAgICAgICAgICBWQUxVRSAiTGVnYWxDb3B5cmlnaHQiLCAiQ29weXJpZ2h0IChDKSAyMDE4IgorICAgICAgICAgICAgVkFMVUUgIk9yaWdpbmFsRmlsZW5hbWUiLCAibGlid2VicG11eC5kbGwiCisgICAgICAgICAgICBWQUxVRSAiUHJvZHVjdE5hbWUiLCAiV2ViUCBJbWFnZSBNdXhlciIKKyAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0VmVyc2lvbiIsICIxLjAuMCIKKyAgICAgICAgRU5ECisgICAgRU5ECisgICAgQkxPQ0sgIlZhckZpbGVJbmZvIgorICAgIEJFR0lOCisgICAgICAgIFZBTFVFICJUcmFuc2xhdGlvbiIsIDB4NDA5LCAxMjAwCisgICAgRU5ECitFTkQKKworI2VuZGlmICAgIC8vIEVuZ2xpc2ggKFVuaXRlZCBTdGF0ZXMpIHJlc291cmNlcwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL211eC9tdXhlZGl0LmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvbXV4L211eGVkaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTAyN2IzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL211eC9tdXhlZGl0LmMKQEAgLTAsMCArMSw2NTcgQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBTZXQgYW5kIGRlbGV0ZSBBUElzIGZvciBtdXguCisvLworLy8gQXV0aG9yczogVXJ2YW5nICh1cnZhbmdAZ29vZ2xlLmNvbSkKKy8vICAgICAgICAgIFZpa2FzICh2aWthc2FAZ29vZ2xlLmNvbSkKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgInNyYy9tdXgvbXV4aS5oIgorI2luY2x1ZGUgInNyYy91dGlscy91dGlscy5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTGlmZSBvZiBhIG11eCBvYmplY3QuCisKK3N0YXRpYyB2b2lkIE11eEluaXQoV2ViUE11eCogY29uc3QgbXV4KSB7CisgIGFzc2VydChtdXggIT0gTlVMTCk7CisgIG1lbXNldChtdXgsIDAsIHNpemVvZigqbXV4KSk7CisgIG11eC0+Y2FudmFzX3dpZHRoXyA9IDA7ICAgICAvLyBqdXN0IHRvIGJlIGV4cGxpY2l0CisgIG11eC0+Y2FudmFzX2hlaWdodF8gPSAwOworfQorCitXZWJQTXV4KiBXZWJQTmV3SW50ZXJuYWwoaW50IHZlcnNpb24pIHsKKyAgaWYgKFdFQlBfQUJJX0lTX0lOQ09NUEFUSUJMRSh2ZXJzaW9uLCBXRUJQX01VWF9BQklfVkVSU0lPTikpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfSBlbHNlIHsKKyAgICBXZWJQTXV4KiBjb25zdCBtdXggPSAoV2ViUE11eCopV2ViUFNhZmVNYWxsb2MoMVVMTCwgc2l6ZW9mKFdlYlBNdXgpKTsKKyAgICBpZiAobXV4ICE9IE5VTEwpIE11eEluaXQobXV4KTsKKyAgICByZXR1cm4gbXV4OworICB9Cit9CisKKy8vIERlbGV0ZSBhbGwgaW1hZ2VzIGluICd3cGlfbGlzdCcuCitzdGF0aWMgdm9pZCBEZWxldGVBbGxJbWFnZXMoV2ViUE11eEltYWdlKiogY29uc3Qgd3BpX2xpc3QpIHsKKyAgd2hpbGUgKCp3cGlfbGlzdCAhPSBOVUxMKSB7CisgICAgKndwaV9saXN0ID0gTXV4SW1hZ2VEZWxldGUoKndwaV9saXN0KTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBNdXhSZWxlYXNlKFdlYlBNdXgqIGNvbnN0IG11eCkgeworICBhc3NlcnQobXV4ICE9IE5VTEwpOworICBEZWxldGVBbGxJbWFnZXMoJm11eC0+aW1hZ2VzXyk7CisgIENodW5rTGlzdERlbGV0ZSgmbXV4LT52cDh4Xyk7CisgIENodW5rTGlzdERlbGV0ZSgmbXV4LT5pY2NwXyk7CisgIENodW5rTGlzdERlbGV0ZSgmbXV4LT5hbmltXyk7CisgIENodW5rTGlzdERlbGV0ZSgmbXV4LT5leGlmXyk7CisgIENodW5rTGlzdERlbGV0ZSgmbXV4LT54bXBfKTsKKyAgQ2h1bmtMaXN0RGVsZXRlKCZtdXgtPnVua25vd25fKTsKK30KKwordm9pZCBXZWJQTXV4RGVsZXRlKFdlYlBNdXgqIG11eCkgeworICBpZiAobXV4ICE9IE5VTEwpIHsKKyAgICBNdXhSZWxlYXNlKG11eCk7CisgICAgV2ViUFNhZmVGcmVlKG11eCk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhlbHBlciBtZXRob2QocykuCisKKy8vIEhhbmR5IE1BQ1JPLCBtYWtlcyBNdXhTZXQoKSB2ZXJ5IHN5bW1ldHJpYyB0byBNdXhHZXQoKS4KKyNkZWZpbmUgU1dJVENIX0lEX0xJU1QoSU5ERVgsIExJU1QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChpZHggPT0gKElOREVYKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVyciA9IENodW5rQXNzaWduRGF0YSgmY2h1bmssIGRhdGEsIGNvcHlfZGF0YSwgdGFnKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZXJyID09IFdFQlBfTVVYX09LKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBlcnIgPSBDaHVua1NldE50aCgmY2h1bmssIChMSVNUKSwgbnRoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gZXJyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworc3RhdGljIFdlYlBNdXhFcnJvciBNdXhTZXQoV2ViUE11eCogY29uc3QgbXV4LCB1aW50MzJfdCB0YWcsIHVpbnQzMl90IG50aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBEYXRhKiBjb25zdCBkYXRhLCBpbnQgY29weV9kYXRhKSB7CisgIFdlYlBDaHVuayBjaHVuazsKKyAgV2ViUE11eEVycm9yIGVyciA9IFdFQlBfTVVYX05PVF9GT1VORDsKKyAgY29uc3QgQ0hVTktfSU5ERVggaWR4ID0gQ2h1bmtHZXRJbmRleEZyb21UYWcodGFnKTsKKyAgYXNzZXJ0KG11eCAhPSBOVUxMKTsKKyAgYXNzZXJ0KCFJc1dQSShrQ2h1bmtzW2lkeF0uaWQpKTsKKworICBDaHVua0luaXQoJmNodW5rKTsKKyAgU1dJVENIX0lEX0xJU1QoSURYX1ZQOFgsICAgICZtdXgtPnZwOHhfKTsKKyAgU1dJVENIX0lEX0xJU1QoSURYX0lDQ1AsICAgICZtdXgtPmljY3BfKTsKKyAgU1dJVENIX0lEX0xJU1QoSURYX0FOSU0sICAgICZtdXgtPmFuaW1fKTsKKyAgU1dJVENIX0lEX0xJU1QoSURYX0VYSUYsICAgICZtdXgtPmV4aWZfKTsKKyAgU1dJVENIX0lEX0xJU1QoSURYX1hNUCwgICAgICZtdXgtPnhtcF8pOworICBTV0lUQ0hfSURfTElTVChJRFhfVU5LTk9XTiwgJm11eC0+dW5rbm93bl8pOworICByZXR1cm4gZXJyOworfQorI3VuZGVmIFNXSVRDSF9JRF9MSVNUCisKKy8vIENyZWF0ZSBkYXRhIGZvciBmcmFtZSBnaXZlbiBpbWFnZSBkYXRhLCBvZmZzZXRzIGFuZCBkdXJhdGlvbi4KK3N0YXRpYyBXZWJQTXV4RXJyb3IgQ3JlYXRlRnJhbWVEYXRhKAorICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgY29uc3QgV2ViUE11eEZyYW1lSW5mbyogY29uc3QgaW5mbywKKyAgICBXZWJQRGF0YSogY29uc3QgZnJhbWUpIHsKKyAgdWludDhfdCogZnJhbWVfYnl0ZXM7CisgIGNvbnN0IHNpemVfdCBmcmFtZV9zaXplID0ga0NodW5rc1tJRFhfQU5NRl0uc2l6ZTsKKworICBhc3NlcnQod2lkdGggPiAwICYmIGhlaWdodCA+IDAgJiYgaW5mby0+ZHVyYXRpb24gPj0gMCk7CisgIGFzc2VydChpbmZvLT5kaXNwb3NlX21ldGhvZCA9PSAoaW5mby0+ZGlzcG9zZV9tZXRob2QgJiAxKSk7CisgIC8vIE5vdGU6IGFzc2VydGlvbiBvbiB1cHBlciBib3VuZHMgaXMgZG9uZSBpbiBQdXRMRTI0KCkuCisKKyAgZnJhbWVfYnl0ZXMgPSAodWludDhfdCopV2ViUFNhZmVNYWxsb2MoMVVMTCwgZnJhbWVfc2l6ZSk7CisgIGlmIChmcmFtZV9ieXRlcyA9PSBOVUxMKSByZXR1cm4gV0VCUF9NVVhfTUVNT1JZX0VSUk9SOworCisgIFB1dExFMjQoZnJhbWVfYnl0ZXMgKyAwLCBpbmZvLT54X29mZnNldCAvIDIpOworICBQdXRMRTI0KGZyYW1lX2J5dGVzICsgMywgaW5mby0+eV9vZmZzZXQgLyAyKTsKKworICBQdXRMRTI0KGZyYW1lX2J5dGVzICsgNiwgd2lkdGggLSAxKTsKKyAgUHV0TEUyNChmcmFtZV9ieXRlcyArIDksIGhlaWdodCAtIDEpOworICBQdXRMRTI0KGZyYW1lX2J5dGVzICsgMTIsIGluZm8tPmR1cmF0aW9uKTsKKyAgZnJhbWVfYnl0ZXNbMTVdID0KKyAgICAgIChpbmZvLT5ibGVuZF9tZXRob2QgPT0gV0VCUF9NVVhfTk9fQkxFTkQgPyAyIDogMCkgfAorICAgICAgKGluZm8tPmRpc3Bvc2VfbWV0aG9kID09IFdFQlBfTVVYX0RJU1BPU0VfQkFDS0dST1VORCA/IDEgOiAwKTsKKworICBmcmFtZS0+Ynl0ZXMgPSBmcmFtZV9ieXRlczsKKyAgZnJhbWUtPnNpemUgPSBmcmFtZV9zaXplOworICByZXR1cm4gV0VCUF9NVVhfT0s7Cit9CisKKy8vIE91dHB1dHMgaW1hZ2UgZGF0YSBnaXZlbiBhIGJpdHN0cmVhbS4gVGhlIGJpdHN0cmVhbSBjYW4gZWl0aGVyIGJlIGEKKy8vIHNpbmdsZS1pbWFnZSBXZWJQIGZpbGUgb3IgcmF3IFZQOC9WUDhMIGRhdGEuCisvLyBBbHNvIG91dHB1dHMgJ2lzX2xvc3NsZXNzJyB0byBiZSB0cnVlIGlmIHRoZSBnaXZlbiBiaXRzdHJlYW0gaXMgbG9zc2xlc3MuCitzdGF0aWMgV2ViUE11eEVycm9yIEdldEltYWdlRGF0YShjb25zdCBXZWJQRGF0YSogY29uc3QgYml0c3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUERhdGEqIGNvbnN0IGltYWdlLCBXZWJQRGF0YSogY29uc3QgYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGlzX2xvc3NsZXNzKSB7CisgIFdlYlBEYXRhSW5pdChhbHBoYSk7ICAvLyBEZWZhdWx0OiBubyBhbHBoYS4KKyAgaWYgKGJpdHN0cmVhbS0+c2l6ZSA8IFRBR19TSVpFIHx8CisgICAgICBtZW1jbXAoYml0c3RyZWFtLT5ieXRlcywgIlJJRkYiLCBUQUdfU0laRSkpIHsKKyAgICAvLyBJdCBpcyBOT1Qgd2VicCBmaWxlIGRhdGEuIFJldHVybiBpbnB1dCBkYXRhIGFzIGlzLgorICAgICppbWFnZSA9ICpiaXRzdHJlYW07CisgIH0gZWxzZSB7CisgICAgLy8gSXQgaXMgd2VicCBmaWxlIGRhdGEuIEV4dHJhY3QgaW1hZ2UgZGF0YSBmcm9tIGl0LgorICAgIGNvbnN0IFdlYlBNdXhJbWFnZSogd3BpOworICAgIFdlYlBNdXgqIGNvbnN0IG11eCA9IFdlYlBNdXhDcmVhdGUoYml0c3RyZWFtLCAwKTsKKyAgICBpZiAobXV4ID09IE5VTEwpIHJldHVybiBXRUJQX01VWF9CQURfREFUQTsKKyAgICB3cGkgPSBtdXgtPmltYWdlc187CisgICAgYXNzZXJ0KHdwaSAhPSBOVUxMICYmIHdwaS0+aW1nXyAhPSBOVUxMKTsKKyAgICAqaW1hZ2UgPSB3cGktPmltZ18tPmRhdGFfOworICAgIGlmICh3cGktPmFscGhhXyAhPSBOVUxMKSB7CisgICAgICAqYWxwaGEgPSB3cGktPmFscGhhXy0+ZGF0YV87CisgICAgfQorICAgIFdlYlBNdXhEZWxldGUobXV4KTsKKyAgfQorICAqaXNfbG9zc2xlc3MgPSBWUDhMQ2hlY2tTaWduYXR1cmUoaW1hZ2UtPmJ5dGVzLCBpbWFnZS0+c2l6ZSk7CisgIHJldHVybiBXRUJQX01VWF9PSzsKK30KKworc3RhdGljIFdlYlBNdXhFcnJvciBEZWxldGVDaHVua3MoV2ViUENodW5rKiogY2h1bmtfbGlzdCwgdWludDMyX3QgdGFnKSB7CisgIFdlYlBNdXhFcnJvciBlcnIgPSBXRUJQX01VWF9OT1RfRk9VTkQ7CisgIGFzc2VydChjaHVua19saXN0KTsKKyAgd2hpbGUgKCpjaHVua19saXN0KSB7CisgICAgV2ViUENodW5rKiBjb25zdCBjaHVuayA9ICpjaHVua19saXN0OworICAgIGlmIChjaHVuay0+dGFnXyA9PSB0YWcpIHsKKyAgICAgICpjaHVua19saXN0ID0gQ2h1bmtEZWxldGUoY2h1bmspOworICAgICAgZXJyID0gV0VCUF9NVVhfT0s7CisgICAgfSBlbHNlIHsKKyAgICAgIGNodW5rX2xpc3QgPSAmY2h1bmstPm5leHRfOworICAgIH0KKyAgfQorICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgV2ViUE11eEVycm9yIE11eERlbGV0ZUFsbE5hbWVkRGF0YShXZWJQTXV4KiBjb25zdCBtdXgsIHVpbnQzMl90IHRhZykgeworICBjb25zdCBXZWJQQ2h1bmtJZCBpZCA9IENodW5rR2V0SWRGcm9tVGFnKHRhZyk7CisgIGFzc2VydChtdXggIT0gTlVMTCk7CisgIGlmIChJc1dQSShpZCkpIHJldHVybiBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UOworICByZXR1cm4gRGVsZXRlQ2h1bmtzKE11eEdldENodW5rTGlzdEZyb21JZChtdXgsIGlkKSwgdGFnKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFNldCBBUEkocykuCisKK1dlYlBNdXhFcnJvciBXZWJQTXV4U2V0Q2h1bmsoV2ViUE11eCogbXV4LCBjb25zdCBjaGFyIGZvdXJjY1s0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUERhdGEqIGNodW5rX2RhdGEsIGludCBjb3B5X2RhdGEpIHsKKyAgdWludDMyX3QgdGFnOworICBXZWJQTXV4RXJyb3IgZXJyOworICBpZiAobXV4ID09IE5VTEwgfHwgZm91cmNjID09IE5VTEwgfHwgY2h1bmtfZGF0YSA9PSBOVUxMIHx8CisgICAgICBjaHVua19kYXRhLT5ieXRlcyA9PSBOVUxMIHx8IGNodW5rX2RhdGEtPnNpemUgPiBNQVhfQ0hVTktfUEFZTE9BRCkgeworICAgIHJldHVybiBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UOworICB9CisgIHRhZyA9IENodW5rR2V0VGFnRnJvbUZvdXJDQyhmb3VyY2MpOworCisgIC8vIERlbGV0ZSBleGlzdGluZyBjaHVuayhzKSB3aXRoIHRoZSBzYW1lICdmb3VyY2MnLgorICBlcnIgPSBNdXhEZWxldGVBbGxOYW1lZERhdGEobXV4LCB0YWcpOworICBpZiAoZXJyICE9IFdFQlBfTVVYX09LICYmIGVyciAhPSBXRUJQX01VWF9OT1RfRk9VTkQpIHJldHVybiBlcnI7CisKKyAgLy8gQWRkIHRoZSBnaXZlbiBjaHVuay4KKyAgcmV0dXJuIE11eFNldChtdXgsIHRhZywgMSwgY2h1bmtfZGF0YSwgY29weV9kYXRhKTsKK30KKworLy8gQ3JlYXRlcyBhIGNodW5rIGZyb20gZ2l2ZW4gJ2RhdGEnIGFuZCBzZXRzIGl0IGFzIDFzdCBjaHVuayBpbiAnY2h1bmtfbGlzdCcuCitzdGF0aWMgV2ViUE11eEVycm9yIEFkZERhdGFUb0NodW5rTGlzdCgKKyAgICBjb25zdCBXZWJQRGF0YSogY29uc3QgZGF0YSwgaW50IGNvcHlfZGF0YSwgdWludDMyX3QgdGFnLAorICAgIFdlYlBDaHVuayoqIGNodW5rX2xpc3QpIHsKKyAgV2ViUENodW5rIGNodW5rOworICBXZWJQTXV4RXJyb3IgZXJyOworICBDaHVua0luaXQoJmNodW5rKTsKKyAgZXJyID0gQ2h1bmtBc3NpZ25EYXRhKCZjaHVuaywgZGF0YSwgY29weV9kYXRhLCB0YWcpOworICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSBnb3RvIEVycjsKKyAgZXJyID0gQ2h1bmtTZXROdGgoJmNodW5rLCBjaHVua19saXN0LCAxKTsKKyAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgZ290byBFcnI7CisgIHJldHVybiBXRUJQX01VWF9PSzsKKyBFcnI6CisgIENodW5rUmVsZWFzZSgmY2h1bmspOworICByZXR1cm4gZXJyOworfQorCisvLyBFeHRyYWN0cyBpbWFnZSAmIGFscGhhIGRhdGEgZnJvbSB0aGUgZ2l2ZW4gYml0c3RyZWFtIGFuZCB0aGVuIHNldHMgd3BpLmFscGhhXworLy8gYW5kIHdwaS5pbWdfIGFwcHJvcHJpYXRlbHkuCitzdGF0aWMgV2ViUE11eEVycm9yIFNldEFscGhhQW5kSW1hZ2VDaHVua3MoCisgICAgY29uc3QgV2ViUERhdGEqIGNvbnN0IGJpdHN0cmVhbSwgaW50IGNvcHlfZGF0YSwgV2ViUE11eEltYWdlKiBjb25zdCB3cGkpIHsKKyAgaW50IGlzX2xvc3NsZXNzID0gMDsKKyAgV2ViUERhdGEgaW1hZ2UsIGFscGhhOworICBXZWJQTXV4RXJyb3IgZXJyID0gR2V0SW1hZ2VEYXRhKGJpdHN0cmVhbSwgJmltYWdlLCAmYWxwaGEsICZpc19sb3NzbGVzcyk7CisgIGNvbnN0IGludCBpbWFnZV90YWcgPQorICAgICAgaXNfbG9zc2xlc3MgPyBrQ2h1bmtzW0lEWF9WUDhMXS50YWcgOiBrQ2h1bmtzW0lEWF9WUDhdLnRhZzsKKyAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgcmV0dXJuIGVycjsKKyAgaWYgKGFscGhhLmJ5dGVzICE9IE5VTEwpIHsKKyAgICBlcnIgPSBBZGREYXRhVG9DaHVua0xpc3QoJmFscGhhLCBjb3B5X2RhdGEsIGtDaHVua3NbSURYX0FMUEhBXS50YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3cGktPmFscGhhXyk7CisgICAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgcmV0dXJuIGVycjsKKyAgfQorICBlcnIgPSBBZGREYXRhVG9DaHVua0xpc3QoJmltYWdlLCBjb3B5X2RhdGEsIGltYWdlX3RhZywgJndwaS0+aW1nXyk7CisgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIHJldHVybiBlcnI7CisgIHJldHVybiBNdXhJbWFnZUZpbmFsaXplKHdwaSkgPyBXRUJQX01VWF9PSyA6IFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQ7Cit9CisKK1dlYlBNdXhFcnJvciBXZWJQTXV4U2V0SW1hZ2UoV2ViUE11eCogbXV4LCBjb25zdCBXZWJQRGF0YSogYml0c3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29weV9kYXRhKSB7CisgIFdlYlBNdXhJbWFnZSB3cGk7CisgIFdlYlBNdXhFcnJvciBlcnI7CisKKyAgLy8gU2FuaXR5IGNoZWNrcy4KKyAgaWYgKG11eCA9PSBOVUxMIHx8IGJpdHN0cmVhbSA9PSBOVUxMIHx8IGJpdHN0cmVhbS0+Ynl0ZXMgPT0gTlVMTCB8fAorICAgICAgYml0c3RyZWFtLT5zaXplID4gTUFYX0NIVU5LX1BBWUxPQUQpIHsKKyAgICByZXR1cm4gV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVDsKKyAgfQorCisgIGlmIChtdXgtPmltYWdlc18gIT0gTlVMTCkgeworICAgIC8vIE9ubHkgb25lICdzaW1wbGUgaW1hZ2UnIGNhbiBiZSBhZGRlZCBpbiBtdXguIFNvLCByZW1vdmUgcHJlc2VudCBpbWFnZXMuCisgICAgRGVsZXRlQWxsSW1hZ2VzKCZtdXgtPmltYWdlc18pOworICB9CisKKyAgTXV4SW1hZ2VJbml0KCZ3cGkpOworICBlcnIgPSBTZXRBbHBoYUFuZEltYWdlQ2h1bmtzKGJpdHN0cmVhbSwgY29weV9kYXRhLCAmd3BpKTsKKyAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgZ290byBFcnI7CisKKyAgLy8gQWRkIHRoaXMgV2ViUE11eEltYWdlIHRvIG11eC4KKyAgZXJyID0gTXV4SW1hZ2VQdXNoKCZ3cGksICZtdXgtPmltYWdlc18pOworICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSBnb3RvIEVycjsKKworICAvLyBBbGwgaXMgd2VsbC4KKyAgcmV0dXJuIFdFQlBfTVVYX09LOworCisgRXJyOiAgLy8gU29tZXRoaW5nIGJhZCBoYXBwZW5lZC4KKyAgTXV4SW1hZ2VSZWxlYXNlKCZ3cGkpOworICByZXR1cm4gZXJyOworfQorCitXZWJQTXV4RXJyb3IgV2ViUE11eFB1c2hGcmFtZShXZWJQTXV4KiBtdXgsIGNvbnN0IFdlYlBNdXhGcmFtZUluZm8qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29weV9kYXRhKSB7CisgIFdlYlBNdXhJbWFnZSB3cGk7CisgIFdlYlBNdXhFcnJvciBlcnI7CisgIGNvbnN0IFdlYlBEYXRhKiBjb25zdCBiaXRzdHJlYW0gPSAmaW5mby0+Yml0c3RyZWFtOworCisgIC8vIFNhbml0eSBjaGVja3MuCisgIGlmIChtdXggPT0gTlVMTCB8fCBpbmZvID09IE5VTEwpIHJldHVybiBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UOworCisgIGlmIChpbmZvLT5pZCAhPSBXRUJQX0NIVU5LX0FOTUYpIHJldHVybiBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UOworCisgIGlmIChiaXRzdHJlYW0tPmJ5dGVzID09IE5VTEwgfHwgYml0c3RyZWFtLT5zaXplID4gTUFYX0NIVU5LX1BBWUxPQUQpIHsKKyAgICByZXR1cm4gV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVDsKKyAgfQorCisgIGlmIChtdXgtPmltYWdlc18gIT0gTlVMTCkgeworICAgIGNvbnN0IFdlYlBNdXhJbWFnZSogY29uc3QgaW1hZ2UgPSBtdXgtPmltYWdlc187CisgICAgY29uc3QgdWludDMyX3QgaW1hZ2VfaWQgPSAoaW1hZ2UtPmhlYWRlcl8gIT0gTlVMTCkgPworICAgICAgICBDaHVua0dldElkRnJvbVRhZyhpbWFnZS0+aGVhZGVyXy0+dGFnXykgOiBXRUJQX0NIVU5LX0lNQUdFOworICAgIGlmIChpbWFnZV9pZCAhPSBpbmZvLT5pZCkgeworICAgICAgcmV0dXJuIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQ7ICAvLyBDb25mbGljdGluZyBmcmFtZSB0eXBlcy4KKyAgICB9CisgIH0KKworICBNdXhJbWFnZUluaXQoJndwaSk7CisgIGVyciA9IFNldEFscGhhQW5kSW1hZ2VDaHVua3MoYml0c3RyZWFtLCBjb3B5X2RhdGEsICZ3cGkpOworICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSBnb3RvIEVycjsKKyAgYXNzZXJ0KHdwaS5pbWdfICE9IE5VTEwpOyAgLy8gQXMgU2V0QWxwaGFBbmRJbWFnZUNodW5rcygpIHdhcyBzdWNjZXNzZnVsLgorCisgIHsKKyAgICBXZWJQRGF0YSBmcmFtZTsKKyAgICBjb25zdCB1aW50MzJfdCB0YWcgPSBrQ2h1bmtzW0lEWF9BTk1GXS50YWc7CisgICAgV2ViUE11eEZyYW1lSW5mbyB0bXAgPSAqaW5mbzsKKyAgICB0bXAueF9vZmZzZXQgJj0gfjE7ICAvLyBTbmFwIG9mZnNldHMgdG8gZXZlbi4KKyAgICB0bXAueV9vZmZzZXQgJj0gfjE7CisgICAgaWYgKHRtcC54X29mZnNldCA8IDAgfHwgdG1wLnhfb2Zmc2V0ID49IE1BWF9QT1NJVElPTl9PRkZTRVQgfHwKKyAgICAgICAgdG1wLnlfb2Zmc2V0IDwgMCB8fCB0bXAueV9vZmZzZXQgPj0gTUFYX1BPU0lUSU9OX09GRlNFVCB8fAorICAgICAgICAodG1wLmR1cmF0aW9uIDwgMCB8fCB0bXAuZHVyYXRpb24gPj0gTUFYX0RVUkFUSU9OKSB8fAorICAgICAgICB0bXAuZGlzcG9zZV9tZXRob2QgIT0gKHRtcC5kaXNwb3NlX21ldGhvZCAmIDEpKSB7CisgICAgICBlcnIgPSBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UOworICAgICAgZ290byBFcnI7CisgICAgfQorICAgIGVyciA9IENyZWF0ZUZyYW1lRGF0YSh3cGkud2lkdGhfLCB3cGkuaGVpZ2h0XywgJnRtcCwgJmZyYW1lKTsKKyAgICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSBnb3RvIEVycjsKKyAgICAvLyBBZGQgZnJhbWUgY2h1bmsgKHdpdGggY29weV9kYXRhID0gMSkuCisgICAgZXJyID0gQWRkRGF0YVRvQ2h1bmtMaXN0KCZmcmFtZSwgMSwgdGFnLCAmd3BpLmhlYWRlcl8pOworICAgIFdlYlBEYXRhQ2xlYXIoJmZyYW1lKTsgIC8vIGZyYW1lIG93bmVkIGJ5IHdwaS5oZWFkZXJfIG5vdy4KKyAgICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSBnb3RvIEVycjsKKyAgfQorCisgIC8vIEFkZCB0aGlzIFdlYlBNdXhJbWFnZSB0byBtdXguCisgIGVyciA9IE11eEltYWdlUHVzaCgmd3BpLCAmbXV4LT5pbWFnZXNfKTsKKyAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgZ290byBFcnI7CisKKyAgLy8gQWxsIGlzIHdlbGwuCisgIHJldHVybiBXRUJQX01VWF9PSzsKKworIEVycjogIC8vIFNvbWV0aGluZyBiYWQgaGFwcGVuZWQuCisgIE11eEltYWdlUmVsZWFzZSgmd3BpKTsKKyAgcmV0dXJuIGVycjsKK30KKworV2ViUE11eEVycm9yIFdlYlBNdXhTZXRBbmltYXRpb25QYXJhbXMoV2ViUE11eCogbXV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUE11eEFuaW1QYXJhbXMqIHBhcmFtcykgeworICBXZWJQTXV4RXJyb3IgZXJyOworICB1aW50OF90IGRhdGFbQU5JTV9DSFVOS19TSVpFXTsKKyAgY29uc3QgV2ViUERhdGEgYW5pbSA9IHsgZGF0YSwgQU5JTV9DSFVOS19TSVpFIH07CisKKyAgaWYgKG11eCA9PSBOVUxMIHx8IHBhcmFtcyA9PSBOVUxMKSByZXR1cm4gV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVDsKKyAgaWYgKHBhcmFtcy0+bG9vcF9jb3VudCA8IDAgfHwgcGFyYW1zLT5sb29wX2NvdW50ID49IE1BWF9MT09QX0NPVU5UKSB7CisgICAgcmV0dXJuIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQ7CisgIH0KKworICAvLyBEZWxldGUgYW55IGV4aXN0aW5nIEFOSU0gY2h1bmsocykuCisgIGVyciA9IE11eERlbGV0ZUFsbE5hbWVkRGF0YShtdXgsIGtDaHVua3NbSURYX0FOSU1dLnRhZyk7CisgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0sgJiYgZXJyICE9IFdFQlBfTVVYX05PVF9GT1VORCkgcmV0dXJuIGVycjsKKworICAvLyBTZXQgdGhlIGFuaW1hdGlvbiBwYXJhbWV0ZXJzLgorICBQdXRMRTMyKGRhdGEsIHBhcmFtcy0+Ymdjb2xvcik7CisgIFB1dExFMTYoZGF0YSArIDQsIHBhcmFtcy0+bG9vcF9jb3VudCk7CisgIHJldHVybiBNdXhTZXQobXV4LCBrQ2h1bmtzW0lEWF9BTklNXS50YWcsIDEsICZhbmltLCAxKTsKK30KKworV2ViUE11eEVycm9yIFdlYlBNdXhTZXRDYW52YXNTaXplKFdlYlBNdXgqIG11eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgV2ViUE11eEVycm9yIGVycjsKKyAgaWYgKG11eCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQ7CisgIH0KKyAgaWYgKHdpZHRoIDwgMCB8fCBoZWlnaHQgPCAwIHx8CisgICAgICB3aWR0aCA+IE1BWF9DQU5WQVNfU0laRSB8fCBoZWlnaHQgPiBNQVhfQ0FOVkFTX1NJWkUpIHsKKyAgICByZXR1cm4gV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVDsKKyAgfQorICBpZiAod2lkdGggKiAodWludDY0X3QpaGVpZ2h0ID49IE1BWF9JTUFHRV9BUkVBKSB7CisgICAgcmV0dXJuIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQ7CisgIH0KKyAgaWYgKCh3aWR0aCAqIGhlaWdodCkgPT0gMCAmJiAod2lkdGggfCBoZWlnaHQpICE9IDApIHsKKyAgICAvLyBvbmUgb2Ygd2lkdGggLyBoZWlnaHQgaXMgemVybywgYnV0IG5vdCBib3RoIC0+IGludmFsaWQhCisgICAgcmV0dXJuIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQ7CisgIH0KKyAgLy8gSWYgd2UgYWxyZWFkeSBhc3NlbWJsZWQgYSBWUDhYIGNodW5rLCBpbnZhbGlkYXRlIGl0LgorICBlcnIgPSBNdXhEZWxldGVBbGxOYW1lZERhdGEobXV4LCBrQ2h1bmtzW0lEWF9WUDhYXS50YWcpOworICBpZiAoZXJyICE9IFdFQlBfTVVYX09LICYmIGVyciAhPSBXRUJQX01VWF9OT1RfRk9VTkQpIHJldHVybiBlcnI7CisKKyAgbXV4LT5jYW52YXNfd2lkdGhfID0gd2lkdGg7CisgIG11eC0+Y2FudmFzX2hlaWdodF8gPSBoZWlnaHQ7CisgIHJldHVybiBXRUJQX01VWF9PSzsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERlbGV0ZSBBUEkocykuCisKK1dlYlBNdXhFcnJvciBXZWJQTXV4RGVsZXRlQ2h1bmsoV2ViUE11eCogbXV4LCBjb25zdCBjaGFyIGZvdXJjY1s0XSkgeworICBpZiAobXV4ID09IE5VTEwgfHwgZm91cmNjID09IE5VTEwpIHJldHVybiBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UOworICByZXR1cm4gTXV4RGVsZXRlQWxsTmFtZWREYXRhKG11eCwgQ2h1bmtHZXRUYWdGcm9tRm91ckNDKGZvdXJjYykpOworfQorCitXZWJQTXV4RXJyb3IgV2ViUE11eERlbGV0ZUZyYW1lKFdlYlBNdXgqIG11eCwgdWludDMyX3QgbnRoKSB7CisgIGlmIChtdXggPT0gTlVMTCkgcmV0dXJuIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQ7CisgIHJldHVybiBNdXhJbWFnZURlbGV0ZU50aCgmbXV4LT5pbWFnZXNfLCBudGgpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQXNzZW1ibHkgb2YgdGhlIFdlYlAgUklGRiBmaWxlLgorCitzdGF0aWMgV2ViUE11eEVycm9yIEdldEZyYW1lSW5mbygKKyAgICBjb25zdCBXZWJQQ2h1bmsqIGNvbnN0IGZyYW1lX2NodW5rLAorICAgIGludCogY29uc3QgeF9vZmZzZXQsIGludCogY29uc3QgeV9vZmZzZXQsIGludCogY29uc3QgZHVyYXRpb24pIHsKKyAgY29uc3QgV2ViUERhdGEqIGNvbnN0IGRhdGEgPSAmZnJhbWVfY2h1bmstPmRhdGFfOworICBjb25zdCBzaXplX3QgZXhwZWN0ZWRfZGF0YV9zaXplID0gQU5NRl9DSFVOS19TSVpFOworICBhc3NlcnQoZnJhbWVfY2h1bmstPnRhZ18gPT0ga0NodW5rc1tJRFhfQU5NRl0udGFnKTsKKyAgYXNzZXJ0KGZyYW1lX2NodW5rICE9IE5VTEwpOworICBpZiAoZGF0YS0+c2l6ZSAhPSBleHBlY3RlZF9kYXRhX3NpemUpIHJldHVybiBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UOworCisgICp4X29mZnNldCA9IDIgKiBHZXRMRTI0KGRhdGEtPmJ5dGVzICsgMCk7CisgICp5X29mZnNldCA9IDIgKiBHZXRMRTI0KGRhdGEtPmJ5dGVzICsgMyk7CisgICpkdXJhdGlvbiA9IEdldExFMjQoZGF0YS0+Ynl0ZXMgKyAxMik7CisgIHJldHVybiBXRUJQX01VWF9PSzsKK30KKworc3RhdGljIFdlYlBNdXhFcnJvciBHZXRJbWFnZUluZm8oY29uc3QgV2ViUE11eEltYWdlKiBjb25zdCB3cGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IHhfb2Zmc2V0LCBpbnQqIGNvbnN0IHlfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBkdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3Qgd2lkdGgsIGludCogY29uc3QgaGVpZ2h0KSB7CisgIGNvbnN0IFdlYlBDaHVuayogY29uc3QgZnJhbWVfY2h1bmsgPSB3cGktPmhlYWRlcl87CisgIFdlYlBNdXhFcnJvciBlcnI7CisgIGFzc2VydCh3cGkgIT0gTlVMTCk7CisgIGFzc2VydChmcmFtZV9jaHVuayAhPSBOVUxMKTsKKworICAvLyBHZXQgb2Zmc2V0cyBhbmQgZHVyYXRpb24gZnJvbSBBTk1GIGNodW5rLgorICBlcnIgPSBHZXRGcmFtZUluZm8oZnJhbWVfY2h1bmssIHhfb2Zmc2V0LCB5X29mZnNldCwgZHVyYXRpb24pOworICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSByZXR1cm4gZXJyOworCisgIC8vIEdldCB3aWR0aCBhbmQgaGVpZ2h0IGZyb20gVlA4L1ZQOEwgY2h1bmsuCisgIGlmICh3aWR0aCAhPSBOVUxMKSAqd2lkdGggPSB3cGktPndpZHRoXzsKKyAgaWYgKGhlaWdodCAhPSBOVUxMKSAqaGVpZ2h0ID0gd3BpLT5oZWlnaHRfOworICByZXR1cm4gV0VCUF9NVVhfT0s7Cit9CisKKy8vIFJldHVybnMgdGhlIHRpZ2h0ZXN0IGRpbWVuc2lvbiBmb3IgdGhlIGNhbnZhcyBjb25zaWRlcmluZyB0aGUgaW1hZ2UgbGlzdC4KK3N0YXRpYyBXZWJQTXV4RXJyb3IgR2V0QWRqdXN0ZWRDYW52YXNTaXplKGNvbnN0IFdlYlBNdXgqIGNvbnN0IG11eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3Qgd2lkdGgsIGludCogY29uc3QgaGVpZ2h0KSB7CisgIFdlYlBNdXhJbWFnZSogd3BpID0gTlVMTDsKKyAgYXNzZXJ0KG11eCAhPSBOVUxMKTsKKyAgYXNzZXJ0KHdpZHRoICE9IE5VTEwgJiYgaGVpZ2h0ICE9IE5VTEwpOworCisgIHdwaSA9IG11eC0+aW1hZ2VzXzsKKyAgYXNzZXJ0KHdwaSAhPSBOVUxMKTsKKyAgYXNzZXJ0KHdwaS0+aW1nXyAhPSBOVUxMKTsKKworICBpZiAod3BpLT5uZXh0XyAhPSBOVUxMKSB7CisgICAgaW50IG1heF94ID0gMCwgbWF4X3kgPSAwOworICAgIC8vIGlmIHdlIGhhdmUgYSBjaGFpbiBvZiB3cGkncywgaGVhZGVyXyBpcyBuZWNlc3NhcmlseSBzZXQKKyAgICBhc3NlcnQod3BpLT5oZWFkZXJfICE9IE5VTEwpOworICAgIC8vIEFnZ3JlZ2F0ZSB0aGUgYm91bmRpbmcgYm94IGZvciBhbmltYXRpb24gZnJhbWVzLgorICAgIGZvciAoOyB3cGkgIT0gTlVMTDsgd3BpID0gd3BpLT5uZXh0XykgeworICAgICAgaW50IHhfb2Zmc2V0ID0gMCwgeV9vZmZzZXQgPSAwLCBkdXJhdGlvbiA9IDAsIHcgPSAwLCBoID0gMDsKKyAgICAgIGNvbnN0IFdlYlBNdXhFcnJvciBlcnIgPSBHZXRJbWFnZUluZm8od3BpLCAmeF9vZmZzZXQsICZ5X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uLCAmdywgJmgpOworICAgICAgY29uc3QgaW50IG1heF94X3BvcyA9IHhfb2Zmc2V0ICsgdzsKKyAgICAgIGNvbnN0IGludCBtYXhfeV9wb3MgPSB5X29mZnNldCArIGg7CisgICAgICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSByZXR1cm4gZXJyOworICAgICAgYXNzZXJ0KHhfb2Zmc2V0IDwgTUFYX1BPU0lUSU9OX09GRlNFVCk7CisgICAgICBhc3NlcnQoeV9vZmZzZXQgPCBNQVhfUE9TSVRJT05fT0ZGU0VUKTsKKworICAgICAgaWYgKG1heF94X3BvcyA+IG1heF94KSBtYXhfeCA9IG1heF94X3BvczsKKyAgICAgIGlmIChtYXhfeV9wb3MgPiBtYXhfeSkgbWF4X3kgPSBtYXhfeV9wb3M7CisgICAgfQorICAgICp3aWR0aCA9IG1heF94OworICAgICpoZWlnaHQgPSBtYXhfeTsKKyAgfSBlbHNlIHsKKyAgICAvLyBGb3IgYSBzaW5nbGUgaW1hZ2UsIGNhbnZhcyBkaW1lbnNpb25zIGFyZSBzYW1lIGFzIGltYWdlIGRpbWVuc2lvbnMuCisgICAgKndpZHRoID0gd3BpLT53aWR0aF87CisgICAgKmhlaWdodCA9IHdwaS0+aGVpZ2h0XzsKKyAgfQorICByZXR1cm4gV0VCUF9NVVhfT0s7Cit9CisKKy8vIFZQOFggZm9ybWF0OgorLy8gVG90YWwgU2l6ZSA6IDEwLAorLy8gRmxhZ3MgIDogNCBieXRlcywKKy8vIFdpZHRoICA6IDMgYnl0ZXMsCisvLyBIZWlnaHQgOiAzIGJ5dGVzLgorc3RhdGljIFdlYlBNdXhFcnJvciBDcmVhdGVWUDhYQ2h1bmsoV2ViUE11eCogY29uc3QgbXV4KSB7CisgIFdlYlBNdXhFcnJvciBlcnIgPSBXRUJQX01VWF9PSzsKKyAgdWludDMyX3QgZmxhZ3MgPSAwOworICBpbnQgd2lkdGggPSAwOworICBpbnQgaGVpZ2h0ID0gMDsKKyAgdWludDhfdCBkYXRhW1ZQOFhfQ0hVTktfU0laRV07CisgIGNvbnN0IFdlYlBEYXRhIHZwOHggPSB7IGRhdGEsIFZQOFhfQ0hVTktfU0laRSB9OworICBjb25zdCBXZWJQTXV4SW1hZ2UqIGltYWdlcyA9IE5VTEw7CisKKyAgYXNzZXJ0KG11eCAhPSBOVUxMKTsKKyAgaW1hZ2VzID0gbXV4LT5pbWFnZXNfOyAgLy8gRmlyc3QgaW1hZ2UuCisgIGlmIChpbWFnZXMgPT0gTlVMTCB8fCBpbWFnZXMtPmltZ18gPT0gTlVMTCB8fAorICAgICAgaW1hZ2VzLT5pbWdfLT5kYXRhXy5ieXRlcyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQ7CisgIH0KKworICAvLyBJZiBWUDhYIGNodW5rKHMpIGlzKGFyZSkgYWxyZWFkeSBwcmVzZW50LCByZW1vdmUgdGhlbSAoYW5kIGxhdGVyIGFkZCBuZXcKKyAgLy8gVlA4WCBjaHVuayB3aXRoIHVwZGF0ZWQgZmxhZ3MpLgorICBlcnIgPSBNdXhEZWxldGVBbGxOYW1lZERhdGEobXV4LCBrQ2h1bmtzW0lEWF9WUDhYXS50YWcpOworICBpZiAoZXJyICE9IFdFQlBfTVVYX09LICYmIGVyciAhPSBXRUJQX01VWF9OT1RfRk9VTkQpIHJldHVybiBlcnI7CisKKyAgLy8gU2V0IGZsYWdzLgorICBpZiAobXV4LT5pY2NwXyAhPSBOVUxMICYmIG11eC0+aWNjcF8tPmRhdGFfLmJ5dGVzICE9IE5VTEwpIHsKKyAgICBmbGFncyB8PSBJQ0NQX0ZMQUc7CisgIH0KKyAgaWYgKG11eC0+ZXhpZl8gIT0gTlVMTCAmJiBtdXgtPmV4aWZfLT5kYXRhXy5ieXRlcyAhPSBOVUxMKSB7CisgICAgZmxhZ3MgfD0gRVhJRl9GTEFHOworICB9CisgIGlmIChtdXgtPnhtcF8gIT0gTlVMTCAmJiBtdXgtPnhtcF8tPmRhdGFfLmJ5dGVzICE9IE5VTEwpIHsKKyAgICBmbGFncyB8PSBYTVBfRkxBRzsKKyAgfQorICBpZiAoaW1hZ2VzLT5oZWFkZXJfICE9IE5VTEwpIHsKKyAgICBpZiAoaW1hZ2VzLT5oZWFkZXJfLT50YWdfID09IGtDaHVua3NbSURYX0FOTUZdLnRhZykgeworICAgICAgLy8gVGhpcyBpcyBhbiBpbWFnZSB3aXRoIGFuaW1hdGlvbi4KKyAgICAgIGZsYWdzIHw9IEFOSU1BVElPTl9GTEFHOworICAgIH0KKyAgfQorICBpZiAoTXV4SW1hZ2VDb3VudChpbWFnZXMsIFdFQlBfQ0hVTktfQUxQSEEpID4gMCkgeworICAgIGZsYWdzIHw9IEFMUEhBX0ZMQUc7ICAvLyBTb21lIGltYWdlcyBoYXZlIGFuIGFscGhhIGNoYW5uZWwuCisgIH0KKworICBlcnIgPSBHZXRBZGp1c3RlZENhbnZhc1NpemUobXV4LCAmd2lkdGgsICZoZWlnaHQpOworICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSByZXR1cm4gZXJyOworCisgIGlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKSB7CisgICAgcmV0dXJuIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQ7CisgIH0KKyAgaWYgKHdpZHRoID4gTUFYX0NBTlZBU19TSVpFIHx8IGhlaWdodCA+IE1BWF9DQU5WQVNfU0laRSkgeworICAgIHJldHVybiBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UOworICB9CisKKyAgaWYgKG11eC0+Y2FudmFzX3dpZHRoXyAhPSAwIHx8IG11eC0+Y2FudmFzX2hlaWdodF8gIT0gMCkgeworICAgIGlmICh3aWR0aCA+IG11eC0+Y2FudmFzX3dpZHRoXyB8fCBoZWlnaHQgPiBtdXgtPmNhbnZhc19oZWlnaHRfKSB7CisgICAgICByZXR1cm4gV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVDsKKyAgICB9CisgICAgd2lkdGggPSBtdXgtPmNhbnZhc193aWR0aF87CisgICAgaGVpZ2h0ID0gbXV4LT5jYW52YXNfaGVpZ2h0XzsKKyAgfQorCisgIGlmIChmbGFncyA9PSAwICYmIG11eC0+dW5rbm93bl8gPT0gTlVMTCkgeworICAgIC8vIEZvciBzaW1wbGUgZmlsZSBmb3JtYXQsIFZQOFggY2h1bmsgc2hvdWxkIG5vdCBiZSBhZGRlZC4KKyAgICByZXR1cm4gV0VCUF9NVVhfT0s7CisgIH0KKworICBpZiAoTXV4SGFzQWxwaGEoaW1hZ2VzKSkgeworICAgIC8vIFRoaXMgbWVhbnMgc29tZSBmcmFtZXMgZXhwbGljaXRseS9pbXBsaWNpdGx5IGNvbnRhaW4gYWxwaGEuCisgICAgLy8gTm90ZTogVGhpcyAnZmxhZ3MnIHVwZGF0ZSBtdXN0IE5PVCBiZSBkb25lIGZvciBhIGxvc3NsZXNzIGltYWdlCisgICAgLy8gd2l0aG91dCBhIFZQOFggY2h1bmshCisgICAgZmxhZ3MgfD0gQUxQSEFfRkxBRzsKKyAgfQorCisgIFB1dExFMzIoZGF0YSArIDAsIGZsYWdzKTsgICAvLyBWUDhYIGNodW5rIGZsYWdzLgorICBQdXRMRTI0KGRhdGEgKyA0LCB3aWR0aCAtIDEpOyAgIC8vIGNhbnZhcyB3aWR0aC4KKyAgUHV0TEUyNChkYXRhICsgNywgaGVpZ2h0IC0gMSk7ICAvLyBjYW52YXMgaGVpZ2h0LgorCisgIHJldHVybiBNdXhTZXQobXV4LCBrQ2h1bmtzW0lEWF9WUDhYXS50YWcsIDEsICZ2cDh4LCAxKTsKK30KKworLy8gQ2xlYW5zIHVwICdtdXgnIGJ5IHJlbW92aW5nIGFueSB1bm5lY2Vzc2FyeSBjaHVua3MuCitzdGF0aWMgV2ViUE11eEVycm9yIE11eENsZWFudXAoV2ViUE11eCogY29uc3QgbXV4KSB7CisgIGludCBudW1fZnJhbWVzOworICBpbnQgbnVtX2FuaW1fY2h1bmtzOworCisgIC8vIElmIHdlIGhhdmUgYW4gaW1hZ2Ugd2l0aCBhIHNpbmdsZSBmcmFtZSwgYW5kIGl0cyByZWN0YW5nbGUKKyAgLy8gY292ZXJzIHRoZSB3aG9sZSBjYW52YXMsIGNvbnZlcnQgaXQgdG8gYSBub24tYW5pbWF0ZWQgaW1hZ2UKKyAgLy8gKHRvIGF2b2lkIHdyaXRpbmcgQU5NRiBjaHVuayB1bm5lY2Vzc2FyaWx5KS4KKyAgV2ViUE11eEVycm9yIGVyciA9IFdlYlBNdXhOdW1DaHVua3MobXV4LCBrQ2h1bmtzW0lEWF9BTk1GXS5pZCwgJm51bV9mcmFtZXMpOworICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSByZXR1cm4gZXJyOworICBpZiAobnVtX2ZyYW1lcyA9PSAxKSB7CisgICAgV2ViUE11eEltYWdlKiBmcmFtZSA9IE5VTEw7CisgICAgZXJyID0gTXV4SW1hZ2VHZXROdGgoKGNvbnN0IFdlYlBNdXhJbWFnZSoqKSZtdXgtPmltYWdlc18sIDEsICZmcmFtZSk7CisgICAgYXNzZXJ0KGVyciA9PSBXRUJQX01VWF9PSyk7ICAvLyBXZSBrbm93IHRoYXQgb25lIGZyYW1lIGRvZXMgZXhpc3QuCisgICAgYXNzZXJ0KGZyYW1lICE9IE5VTEwpOworICAgIGlmIChmcmFtZS0+aGVhZGVyXyAhPSBOVUxMICYmCisgICAgICAgICgobXV4LT5jYW52YXNfd2lkdGhfID09IDAgJiYgbXV4LT5jYW52YXNfaGVpZ2h0XyA9PSAwKSB8fAorICAgICAgICAgKGZyYW1lLT53aWR0aF8gPT0gbXV4LT5jYW52YXNfd2lkdGhfICYmCisgICAgICAgICAgZnJhbWUtPmhlaWdodF8gPT0gbXV4LT5jYW52YXNfaGVpZ2h0XykpKSB7CisgICAgICBhc3NlcnQoZnJhbWUtPmhlYWRlcl8tPnRhZ18gPT0ga0NodW5rc1tJRFhfQU5NRl0udGFnKTsKKyAgICAgIENodW5rRGVsZXRlKGZyYW1lLT5oZWFkZXJfKTsgIC8vIFJlbW92ZXMgQU5NRiBjaHVuay4KKyAgICAgIGZyYW1lLT5oZWFkZXJfID0gTlVMTDsKKyAgICAgIG51bV9mcmFtZXMgPSAwOworICAgIH0KKyAgfQorICAvLyBSZW1vdmUgQU5JTSBjaHVuayBpZiB0aGlzIGlzIGEgbm9uLWFuaW1hdGVkIGltYWdlLgorICBlcnIgPSBXZWJQTXV4TnVtQ2h1bmtzKG11eCwga0NodW5rc1tJRFhfQU5JTV0uaWQsICZudW1fYW5pbV9jaHVua3MpOworICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSByZXR1cm4gZXJyOworICBpZiAobnVtX2FuaW1fY2h1bmtzID49IDEgJiYgbnVtX2ZyYW1lcyA9PSAwKSB7CisgICAgZXJyID0gTXV4RGVsZXRlQWxsTmFtZWREYXRhKG11eCwga0NodW5rc1tJRFhfQU5JTV0udGFnKTsKKyAgICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSByZXR1cm4gZXJyOworICB9CisgIHJldHVybiBXRUJQX01VWF9PSzsKK30KKworLy8gVG90YWwgc2l6ZSBvZiBhIGxpc3Qgb2YgaW1hZ2VzLgorc3RhdGljIHNpemVfdCBJbWFnZUxpc3REaXNrU2l6ZShjb25zdCBXZWJQTXV4SW1hZ2UqIHdwaV9saXN0KSB7CisgIHNpemVfdCBzaXplID0gMDsKKyAgd2hpbGUgKHdwaV9saXN0ICE9IE5VTEwpIHsKKyAgICBzaXplICs9IE11eEltYWdlRGlza1NpemUod3BpX2xpc3QpOworICAgIHdwaV9saXN0ID0gd3BpX2xpc3QtPm5leHRfOworICB9CisgIHJldHVybiBzaXplOworfQorCisvLyBXcml0ZSBvdXQgdGhlIGdpdmVuIGxpc3Qgb2YgaW1hZ2VzIGludG8gJ2RzdCcuCitzdGF0aWMgdWludDhfdCogSW1hZ2VMaXN0RW1pdChjb25zdCBXZWJQTXV4SW1hZ2UqIHdwaV9saXN0LCB1aW50OF90KiBkc3QpIHsKKyAgd2hpbGUgKHdwaV9saXN0ICE9IE5VTEwpIHsKKyAgICBkc3QgPSBNdXhJbWFnZUVtaXQod3BpX2xpc3QsIGRzdCk7CisgICAgd3BpX2xpc3QgPSB3cGlfbGlzdC0+bmV4dF87CisgIH0KKyAgcmV0dXJuIGRzdDsKK30KKworV2ViUE11eEVycm9yIFdlYlBNdXhBc3NlbWJsZShXZWJQTXV4KiBtdXgsIFdlYlBEYXRhKiBhc3NlbWJsZWRfZGF0YSkgeworICBzaXplX3Qgc2l6ZSA9IDA7CisgIHVpbnQ4X3QqIGRhdGEgPSBOVUxMOworICB1aW50OF90KiBkc3QgPSBOVUxMOworICBXZWJQTXV4RXJyb3IgZXJyOworCisgIGlmIChhc3NlbWJsZWRfZGF0YSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQ7CisgIH0KKyAgLy8gQ2xlYW4gdXAgcmV0dXJuZWQgZGF0YSwgaW4gY2FzZSBzb21ldGhpbmcgZ29lcyB3cm9uZy4KKyAgbWVtc2V0KGFzc2VtYmxlZF9kYXRhLCAwLCBzaXplb2YoKmFzc2VtYmxlZF9kYXRhKSk7CisKKyAgaWYgKG11eCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQ7CisgIH0KKworICAvLyBGaW5hbGl6ZSBtdXguCisgIGVyciA9IE11eENsZWFudXAobXV4KTsKKyAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgcmV0dXJuIGVycjsKKyAgZXJyID0gQ3JlYXRlVlA4WENodW5rKG11eCk7CisgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIHJldHVybiBlcnI7CisKKyAgLy8gQWxsb2NhdGUgZGF0YS4KKyAgc2l6ZSA9IENodW5rTGlzdERpc2tTaXplKG11eC0+dnA4eF8pICsgQ2h1bmtMaXN0RGlza1NpemUobXV4LT5pY2NwXykKKyAgICAgICArIENodW5rTGlzdERpc2tTaXplKG11eC0+YW5pbV8pICsgSW1hZ2VMaXN0RGlza1NpemUobXV4LT5pbWFnZXNfKQorICAgICAgICsgQ2h1bmtMaXN0RGlza1NpemUobXV4LT5leGlmXykgKyBDaHVua0xpc3REaXNrU2l6ZShtdXgtPnhtcF8pCisgICAgICAgKyBDaHVua0xpc3REaXNrU2l6ZShtdXgtPnVua25vd25fKSArIFJJRkZfSEVBREVSX1NJWkU7CisKKyAgZGF0YSA9ICh1aW50OF90KilXZWJQU2FmZU1hbGxvYygxVUxMLCBzaXplKTsKKyAgaWYgKGRhdGEgPT0gTlVMTCkgcmV0dXJuIFdFQlBfTVVYX01FTU9SWV9FUlJPUjsKKworICAvLyBFbWl0IGhlYWRlciAmIGNodW5rcy4KKyAgZHN0ID0gTXV4RW1pdFJpZmZIZWFkZXIoZGF0YSwgc2l6ZSk7CisgIGRzdCA9IENodW5rTGlzdEVtaXQobXV4LT52cDh4XywgZHN0KTsKKyAgZHN0ID0gQ2h1bmtMaXN0RW1pdChtdXgtPmljY3BfLCBkc3QpOworICBkc3QgPSBDaHVua0xpc3RFbWl0KG11eC0+YW5pbV8sIGRzdCk7CisgIGRzdCA9IEltYWdlTGlzdEVtaXQobXV4LT5pbWFnZXNfLCBkc3QpOworICBkc3QgPSBDaHVua0xpc3RFbWl0KG11eC0+ZXhpZl8sIGRzdCk7CisgIGRzdCA9IENodW5rTGlzdEVtaXQobXV4LT54bXBfLCBkc3QpOworICBkc3QgPSBDaHVua0xpc3RFbWl0KG11eC0+dW5rbm93bl8sIGRzdCk7CisgIGFzc2VydChkc3QgPT0gZGF0YSArIHNpemUpOworCisgIC8vIFZhbGlkYXRlIG11eC4KKyAgZXJyID0gTXV4VmFsaWRhdGUobXV4KTsKKyAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgeworICAgIFdlYlBTYWZlRnJlZShkYXRhKTsKKyAgICBkYXRhID0gTlVMTDsKKyAgICBzaXplID0gMDsKKyAgfQorCisgIC8vIEZpbmFsaXplIGRhdGEuCisgIGFzc2VtYmxlZF9kYXRhLT5ieXRlcyA9IGRhdGE7CisgIGFzc2VtYmxlZF9kYXRhLT5zaXplID0gc2l6ZTsKKworICByZXR1cm4gZXJyOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL211eC9tdXhpLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvbXV4L211eGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWUxZTk3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL211eC9tdXhpLmgKQEAgLTAsMCArMSwyMzAgQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBJbnRlcm5hbCBoZWFkZXIgZm9yIG11eCBsaWJyYXJ5LgorLy8KKy8vIEF1dGhvcjogVXJ2YW5nICh1cnZhbmdAZ29vZ2xlLmNvbSkKKworI2lmbmRlZiBXRUJQX01VWF9NVVhJX0hfCisjZGVmaW5lIFdFQlBfTVVYX01VWElfSF8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgInNyYy9kZWMvdnA4aV9kZWMuaCIKKyNpbmNsdWRlICJzcmMvZGVjL3ZwOGxpX2RlYy5oIgorI2luY2x1ZGUgInNyYy93ZWJwL211eC5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEZWZpbmVzIGFuZCBjb25zdGFudHMuCisKKyNkZWZpbmUgTVVYX01BSl9WRVJTSU9OIDEKKyNkZWZpbmUgTVVYX01JTl9WRVJTSU9OIDAKKyNkZWZpbmUgTVVYX1JFVl9WRVJTSU9OIDAKKworLy8gQ2h1bmsgb2JqZWN0LgordHlwZWRlZiBzdHJ1Y3QgV2ViUENodW5rIFdlYlBDaHVuazsKK3N0cnVjdCBXZWJQQ2h1bmsgeworICB1aW50MzJfdCAgICAgICAgdGFnXzsKKyAgaW50ICAgICAgICAgICAgIG93bmVyXzsgIC8vIFRydWUgaWYgKmRhdGFfIG1lbW9yeSBpcyBvd25lZCBpbnRlcm5hbGx5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVlA4WCwgQU5JTSwgYW5kIG90aGVyIGludGVybmFsbHkgY3JlYXRlZCBjaHVua3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpa2UgQU5NRiBhcmUgYWx3YXlzIG93bmVkLgorICBXZWJQRGF0YSAgICAgICAgZGF0YV87CisgIFdlYlBDaHVuayogICAgICBuZXh0XzsKK307CisKKy8vIE11eEltYWdlIG9iamVjdC4gU3RvcmUgYSBmdWxsIFdlYlAgaW1hZ2UgKGluY2x1ZGluZyBBTk1GIGNodW5rLCBBTFBICisvLyBjaHVuayBhbmQgVlA4L1ZQOEwgY2h1bmspLAordHlwZWRlZiBzdHJ1Y3QgV2ViUE11eEltYWdlIFdlYlBNdXhJbWFnZTsKK3N0cnVjdCBXZWJQTXV4SW1hZ2UgeworICBXZWJQQ2h1bmsqICBoZWFkZXJfOyAgICAgIC8vIENvcnJlc3BvbmRzIHRvIFdFQlBfQ0hVTktfQU5NRi4KKyAgV2ViUENodW5rKiAgYWxwaGFfOyAgICAgICAvLyBDb3JyZXNwb25kcyB0byBXRUJQX0NIVU5LX0FMUEhBLgorICBXZWJQQ2h1bmsqICBpbWdfOyAgICAgICAgIC8vIENvcnJlc3BvbmRzIHRvIFdFQlBfQ0hVTktfSU1BR0UuCisgIFdlYlBDaHVuayogIHVua25vd25fOyAgICAgLy8gQ29ycmVzcG9uZHMgdG8gV0VCUF9DSFVOS19VTktOT1dOLgorICBpbnQgICAgICAgICB3aWR0aF87CisgIGludCAgICAgICAgIGhlaWdodF87CisgIGludCAgICAgICAgIGhhc19hbHBoYV87ICAgLy8gVGhyb3VnaCBBTFBIIGNodW5rIG9yIGFzIHBhcnQgb2YgVlA4TC4KKyAgaW50ICAgICAgICAgaXNfcGFydGlhbF87ICAvLyBUcnVlIGlmIG9ubHkgc29tZSBvZiB0aGUgY2h1bmtzIGFyZSBmaWxsZWQuCisgIFdlYlBNdXhJbWFnZSogbmV4dF87Cit9OworCisvLyBNYWluIG11eCBvYmplY3QuIFN0b3JlcyBkYXRhIGNodW5rcy4KK3N0cnVjdCBXZWJQTXV4IHsKKyAgV2ViUE11eEltYWdlKiAgIGltYWdlc187CisgIFdlYlBDaHVuayogICAgICBpY2NwXzsKKyAgV2ViUENodW5rKiAgICAgIGV4aWZfOworICBXZWJQQ2h1bmsqICAgICAgeG1wXzsKKyAgV2ViUENodW5rKiAgICAgIGFuaW1fOworICBXZWJQQ2h1bmsqICAgICAgdnA4eF87CisKKyAgV2ViUENodW5rKiAgICAgIHVua25vd25fOworICBpbnQgICAgICAgICAgICAgY2FudmFzX3dpZHRoXzsKKyAgaW50ICAgICAgICAgICAgIGNhbnZhc19oZWlnaHRfOworfTsKKworLy8gQ0hVTktfSU5ERVggZW51bTogdXNlZCBmb3IgaW5kZXhpbmcgd2l0aGluICdrQ2h1bmtzJyAoZGVmaW5lZCBiZWxvdykgb25seS4KKy8vIE5vdGU6IHRoZSByZWFzb24gZm9yIGhhdmluZyB0d28gZW51bXMgKCdXZWJQQ2h1bmtJZCcgYW5kICdDSFVOS19JTkRFWCcpIGlzIHRvCisvLyBhbGxvdyB0d28gZGlmZmVyZW50IGNodW5rcyB0byBoYXZlIHRoZSBzYW1lIGlkIChlLmcuIFdlYlBDaHVua0lkCisvLyAnV0VCUF9DSFVOS19JTUFHRScgY2FuIGNvcnJlc3BvbmQgdG8gQ0hVTktfSU5ERVggJ0lEWF9WUDgnIG9yICdJRFhfVlA4TCcpLgordHlwZWRlZiBlbnVtIHsKKyAgSURYX1ZQOFggPSAwLAorICBJRFhfSUNDUCwKKyAgSURYX0FOSU0sCisgIElEWF9BTk1GLAorICBJRFhfQUxQSEEsCisgIElEWF9WUDgsCisgIElEWF9WUDhMLAorICBJRFhfRVhJRiwKKyAgSURYX1hNUCwKKyAgSURYX1VOS05PV04sCisKKyAgSURYX05JTCwKKyAgSURYX0xBU1RfQ0hVTksKK30gQ0hVTktfSU5ERVg7CisKKyNkZWZpbmUgTklMX1RBRyAweDAwMDAwMDAwdSAgLy8gVG8gc2lnbmFsIHZvaWQgY2h1bmsuCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QgICAgICB0YWc7CisgIFdlYlBDaHVua0lkICAgaWQ7CisgIHVpbnQzMl90ICAgICAgc2l6ZTsKK30gQ2h1bmtJbmZvOworCitleHRlcm4gY29uc3QgQ2h1bmtJbmZvIGtDaHVua3NbSURYX0xBU1RfQ0hVTktdOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ2h1bmsgb2JqZWN0IG1hbmFnZW1lbnQuCisKKy8vIEluaXRpYWxpemUuCit2b2lkIENodW5rSW5pdChXZWJQQ2h1bmsqIGNvbnN0IGNodW5rKTsKKworLy8gR2V0IGNodW5rIGluZGV4IGZyb20gY2h1bmsgdGFnLiBSZXR1cm5zIElEWF9VTktOT1dOIGlmIG5vdCBmb3VuZC4KK0NIVU5LX0lOREVYIENodW5rR2V0SW5kZXhGcm9tVGFnKHVpbnQzMl90IHRhZyk7CisKKy8vIEdldCBjaHVuayBpZCBmcm9tIGNodW5rIHRhZy4gUmV0dXJucyBXRUJQX0NIVU5LX1VOS05PV04gaWYgbm90IGZvdW5kLgorV2ViUENodW5rSWQgQ2h1bmtHZXRJZEZyb21UYWcodWludDMyX3QgdGFnKTsKKworLy8gQ29udmVydCBhIGZvdXJjYyBzdHJpbmcgdG8gYSB0YWcuCit1aW50MzJfdCBDaHVua0dldFRhZ0Zyb21Gb3VyQ0MoY29uc3QgY2hhciBmb3VyY2NbNF0pOworCisvLyBHZXQgY2h1bmsgaW5kZXggZnJvbSBmb3VyY2MuIFJldHVybnMgSURYX1VOS05PV04gaWYgZ2l2ZW4gZm91cmNjIGlzIHVua25vd24uCitDSFVOS19JTkRFWCBDaHVua0dldEluZGV4RnJvbUZvdXJDQyhjb25zdCBjaGFyIGZvdXJjY1s0XSk7CisKKy8vIFNlYXJjaCBmb3IgbnRoIGNodW5rIHdpdGggZ2l2ZW4gJ3RhZycgaW4gdGhlIGNodW5rIGxpc3QuCisvLyBudGggPSAwIG1lYW5zICJsYXN0IG9mIHRoZSBsaXN0Ii4KK1dlYlBDaHVuayogQ2h1bmtTZWFyY2hMaXN0KFdlYlBDaHVuayogZmlyc3QsIHVpbnQzMl90IG50aCwgdWludDMyX3QgdGFnKTsKKworLy8gRmlsbCB0aGUgY2h1bmsgd2l0aCB0aGUgZ2l2ZW4gZGF0YS4KK1dlYlBNdXhFcnJvciBDaHVua0Fzc2lnbkRhdGEoV2ViUENodW5rKiBjaHVuaywgY29uc3QgV2ViUERhdGEqIGNvbnN0IGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3B5X2RhdGEsIHVpbnQzMl90IHRhZyk7CisKKy8vIFNldHMgJ2NodW5rJyBhdCBudGggcG9zaXRpb24gaW4gdGhlICdjaHVua19saXN0Jy4KKy8vIG50aCA9IDAgaGFzIHRoZSBzcGVjaWFsIG1lYW5pbmcgImxhc3Qgb2YgdGhlIGxpc3QiLgorLy8gT24gc3VjY2VzcyBvd25lcnNoaXAgaXMgdHJhbnNmZXJyZWQgZnJvbSAnY2h1bmsnIHRvIHRoZSAnY2h1bmtfbGlzdCcuCitXZWJQTXV4RXJyb3IgQ2h1bmtTZXROdGgoV2ViUENodW5rKiBjaHVuaywgV2ViUENodW5rKiogY2h1bmtfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBudGgpOworCisvLyBSZWxlYXNlcyBjaHVuayBhbmQgcmV0dXJucyBjaHVuay0+bmV4dF8uCitXZWJQQ2h1bmsqIENodW5rUmVsZWFzZShXZWJQQ2h1bmsqIGNvbnN0IGNodW5rKTsKKworLy8gRGVsZXRlcyBnaXZlbiBjaHVuayAmIHJldHVybnMgY2h1bmstPm5leHRfLgorV2ViUENodW5rKiBDaHVua0RlbGV0ZShXZWJQQ2h1bmsqIGNvbnN0IGNodW5rKTsKKworLy8gRGVsZXRlcyBhbGwgY2h1bmtzIGluIHRoZSBnaXZlbiBjaHVuayBsaXN0Lgordm9pZCBDaHVua0xpc3REZWxldGUoV2ViUENodW5rKiogY29uc3QgY2h1bmtfbGlzdCk7CisKKy8vIFJldHVybnMgc2l6ZSBvZiB0aGUgY2h1bmsgaW5jbHVkaW5nIGNodW5rIGhlYWRlciBhbmQgcGFkZGluZyBieXRlIChpZiBhbnkpLgorc3RhdGljIFdFQlBfSU5MSU5FIHNpemVfdCBTaXplV2l0aFBhZGRpbmcoc2l6ZV90IGNodW5rX3NpemUpIHsKKyAgcmV0dXJuIENIVU5LX0hFQURFUl9TSVpFICsgKChjaHVua19zaXplICsgMSkgJiB+MVUpOworfQorCisvLyBTaXplIG9mIGEgY2h1bmsgaW5jbHVkaW5nIGhlYWRlciBhbmQgcGFkZGluZy4KK3N0YXRpYyBXRUJQX0lOTElORSBzaXplX3QgQ2h1bmtEaXNrU2l6ZShjb25zdCBXZWJQQ2h1bmsqIGNodW5rKSB7CisgIGNvbnN0IHNpemVfdCBkYXRhX3NpemUgPSBjaHVuay0+ZGF0YV8uc2l6ZTsKKyAgU0JfRENIRUNLKGRhdGFfc2l6ZSA8IE1BWF9DSFVOS19QQVlMT0FEKTsKKyAgcmV0dXJuIFNpemVXaXRoUGFkZGluZyhkYXRhX3NpemUpOworfQorCisvLyBUb3RhbCBzaXplIG9mIGEgbGlzdCBvZiBjaHVua3MuCitzaXplX3QgQ2h1bmtMaXN0RGlza1NpemUoY29uc3QgV2ViUENodW5rKiBjaHVua19saXN0KTsKKworLy8gV3JpdGUgb3V0IHRoZSBnaXZlbiBsaXN0IG9mIGNodW5rcyBpbnRvICdkc3QnLgordWludDhfdCogQ2h1bmtMaXN0RW1pdChjb25zdCBXZWJQQ2h1bmsqIGNodW5rX2xpc3QsIHVpbnQ4X3QqIGRzdCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNdXhJbWFnZSBvYmplY3QgbWFuYWdlbWVudC4KKworLy8gSW5pdGlhbGl6ZS4KK3ZvaWQgTXV4SW1hZ2VJbml0KFdlYlBNdXhJbWFnZSogY29uc3Qgd3BpKTsKKworLy8gUmVsZWFzZXMgaW1hZ2UgJ3dwaScgYW5kIHJldHVybnMgd3BpLT5uZXh0LgorV2ViUE11eEltYWdlKiBNdXhJbWFnZVJlbGVhc2UoV2ViUE11eEltYWdlKiBjb25zdCB3cGkpOworCisvLyBEZWxldGUgaW1hZ2UgJ3dwaScgYW5kIHJldHVybiB0aGUgbmV4dCBpbWFnZSBpbiB0aGUgbGlzdCBvciBOVUxMLgorLy8gJ3dwaScgY2FuIGJlIE5VTEwuCitXZWJQTXV4SW1hZ2UqIE11eEltYWdlRGVsZXRlKFdlYlBNdXhJbWFnZSogY29uc3Qgd3BpKTsKKworLy8gQ291bnQgbnVtYmVyIG9mIGltYWdlcyBtYXRjaGluZyB0aGUgZ2l2ZW4gdGFnIGlkIGluIHRoZSAnd3BpX2xpc3QnLgorLy8gSWYgaWQgPT0gV0VCUF9DSFVOS19OSUwsIGFsbCBpbWFnZXMgd2lsbCBiZSBtYXRjaGVkLgoraW50IE11eEltYWdlQ291bnQoY29uc3QgV2ViUE11eEltYWdlKiB3cGlfbGlzdCwgV2ViUENodW5rSWQgaWQpOworCisvLyBVcGRhdGUgd2lkdGgvaGVpZ2h0L2hhc19hbHBoYSBpbmZvIGZyb20gY2h1bmtzIHdpdGhpbiB3cGkuCisvLyBBbHNvIHJlbW92ZSBBTFBIIGNodW5rIGlmIG5vdCBuZWVkZWQuCitpbnQgTXV4SW1hZ2VGaW5hbGl6ZShXZWJQTXV4SW1hZ2UqIGNvbnN0IHdwaSk7CisKKy8vIENoZWNrIGlmIGdpdmVuIElEIGNvcnJlc3BvbmRzIHRvIGFuIGltYWdlIHJlbGF0ZWQgY2h1bmsuCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IElzV1BJKFdlYlBDaHVua0lkIGlkKSB7CisgIHN3aXRjaCAoaWQpIHsKKyAgICBjYXNlIFdFQlBfQ0hVTktfQU5NRjoKKyAgICBjYXNlIFdFQlBfQ0hVTktfQUxQSEE6CisgICAgY2FzZSBXRUJQX0NIVU5LX0lNQUdFOiAgcmV0dXJuIDE7CisgICAgZGVmYXVsdDogICAgICAgIHJldHVybiAwOworICB9Cit9CisKKy8vIFB1c2hlcyAnd3BpJyBhdCB0aGUgZW5kIG9mICd3cGlfbGlzdCcuCitXZWJQTXV4RXJyb3IgTXV4SW1hZ2VQdXNoKGNvbnN0IFdlYlBNdXhJbWFnZSogd3BpLCBXZWJQTXV4SW1hZ2UqKiB3cGlfbGlzdCk7CisKKy8vIERlbGV0ZSBudGggaW1hZ2UgaW4gdGhlIGltYWdlIGxpc3QuCitXZWJQTXV4RXJyb3IgTXV4SW1hZ2VEZWxldGVOdGgoV2ViUE11eEltYWdlKiogd3BpX2xpc3QsIHVpbnQzMl90IG50aCk7CisKKy8vIEdldCBudGggaW1hZ2UgaW4gdGhlIGltYWdlIGxpc3QuCitXZWJQTXV4RXJyb3IgTXV4SW1hZ2VHZXROdGgoY29uc3QgV2ViUE11eEltYWdlKiogd3BpX2xpc3QsIHVpbnQzMl90IG50aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQTXV4SW1hZ2UqKiB3cGkpOworCisvLyBUb3RhbCBzaXplIG9mIHRoZSBnaXZlbiBpbWFnZS4KK3NpemVfdCBNdXhJbWFnZURpc2tTaXplKGNvbnN0IFdlYlBNdXhJbWFnZSogY29uc3Qgd3BpKTsKKworLy8gV3JpdGUgb3V0IHRoZSBnaXZlbiBpbWFnZSBpbnRvICdkc3QnLgordWludDhfdCogTXV4SW1hZ2VFbWl0KGNvbnN0IFdlYlBNdXhJbWFnZSogY29uc3Qgd3BpLCB1aW50OF90KiBkc3QpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGVscGVyIG1ldGhvZHMgZm9yIG11eC4KKworLy8gQ2hlY2tzIGlmIHRoZSBnaXZlbiBpbWFnZSBsaXN0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBpbWFnZSB3aXRoIGFscGhhLgoraW50IE11eEhhc0FscGhhKGNvbnN0IFdlYlBNdXhJbWFnZSogaW1hZ2VzKTsKKworLy8gV3JpdGUgb3V0IFJJRkYgaGVhZGVyIGludG8gJ2RhdGEnLCBnaXZlbiB0b3RhbCBkYXRhIHNpemUgJ3NpemUnLgordWludDhfdCogTXV4RW1pdFJpZmZIZWFkZXIodWludDhfdCogY29uc3QgZGF0YSwgc2l6ZV90IHNpemUpOworCisvLyBSZXR1cm5zIHRoZSBsaXN0IHdoZXJlIGNodW5rIHdpdGggZ2l2ZW4gSUQgaXMgdG8gYmUgaW5zZXJ0ZWQgaW4gbXV4LgorV2ViUENodW5rKiogTXV4R2V0Q2h1bmtMaXN0RnJvbUlkKGNvbnN0IFdlYlBNdXgqIG11eCwgV2ViUENodW5rSWQgaWQpOworCisvLyBWYWxpZGF0ZXMgdGhlIGdpdmVuIG11eCBvYmplY3QuCitXZWJQTXV4RXJyb3IgTXV4VmFsaWRhdGUoY29uc3QgV2ViUE11eCogY29uc3QgbXV4KTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8qIFdFQlBfTVVYX01VWElfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9tdXgvbXV4aW50ZXJuYWwuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9tdXgvbXV4aW50ZXJuYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDEyMjJjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL211eC9tdXhpbnRlcm5hbC5jCkBAIC0wLDAgKzEsNTU2IEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gSW50ZXJuYWwgb2JqZWN0cyBhbmQgdXRpbHMgZm9yIG11eC4KKy8vCisvLyBBdXRob3JzOiBVcnZhbmcgKHVydmFuZ0Bnb29nbGUuY29tKQorLy8gICAgICAgICAgVmlrYXMgKHZpa2FzYUBnb29nbGUuY29tKQorCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vYXNzZXJ0X3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdfcG9lbS5oIgorI2Vsc2UKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorI2luY2x1ZGUgInNyYy9tdXgvbXV4aS5oIgorI2luY2x1ZGUgInNyYy91dGlscy91dGlscy5oIgorCisjZGVmaW5lIFVOREVGSU5FRF9DSFVOS19TSVpFICgodWludDMyX3QpKC0xKSkKKworY29uc3QgQ2h1bmtJbmZvIGtDaHVua3NbXSA9IHsKKyAgeyBNS0ZPVVJDQygnVicsICdQJywgJzgnLCAnWCcpLCAgV0VCUF9DSFVOS19WUDhYLCAgICBWUDhYX0NIVU5LX1NJWkUgfSwKKyAgeyBNS0ZPVVJDQygnSScsICdDJywgJ0MnLCAnUCcpLCAgV0VCUF9DSFVOS19JQ0NQLCAgICBVTkRFRklORURfQ0hVTktfU0laRSB9LAorICB7IE1LRk9VUkNDKCdBJywgJ04nLCAnSScsICdNJyksICBXRUJQX0NIVU5LX0FOSU0sICAgIEFOSU1fQ0hVTktfU0laRSB9LAorICB7IE1LRk9VUkNDKCdBJywgJ04nLCAnTScsICdGJyksICBXRUJQX0NIVU5LX0FOTUYsICAgIEFOTUZfQ0hVTktfU0laRSB9LAorICB7IE1LRk9VUkNDKCdBJywgJ0wnLCAnUCcsICdIJyksICBXRUJQX0NIVU5LX0FMUEhBLCAgIFVOREVGSU5FRF9DSFVOS19TSVpFIH0sCisgIHsgTUtGT1VSQ0MoJ1YnLCAnUCcsICc4JywgJyAnKSwgIFdFQlBfQ0hVTktfSU1BR0UsICAgVU5ERUZJTkVEX0NIVU5LX1NJWkUgfSwKKyAgeyBNS0ZPVVJDQygnVicsICdQJywgJzgnLCAnTCcpLCAgV0VCUF9DSFVOS19JTUFHRSwgICBVTkRFRklORURfQ0hVTktfU0laRSB9LAorICB7IE1LRk9VUkNDKCdFJywgJ1gnLCAnSScsICdGJyksICBXRUJQX0NIVU5LX0VYSUYsICAgIFVOREVGSU5FRF9DSFVOS19TSVpFIH0sCisgIHsgTUtGT1VSQ0MoJ1gnLCAnTScsICdQJywgJyAnKSwgIFdFQlBfQ0hVTktfWE1QLCAgICAgVU5ERUZJTkVEX0NIVU5LX1NJWkUgfSwKKyAgeyBOSUxfVEFHLCAgICAgICAgICAgICAgICAgICAgICAgV0VCUF9DSFVOS19VTktOT1dOLCBVTkRFRklORURfQ0hVTktfU0laRSB9LAorCisgIHsgTklMX1RBRywgICAgICAgICAgICAgICAgICAgICAgIFdFQlBfQ0hVTktfTklMLCAgICAgVU5ERUZJTkVEX0NIVU5LX1NJWkUgfQorfTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IFdlYlBHZXRNdXhWZXJzaW9uKHZvaWQpIHsKKyAgcmV0dXJuIChNVVhfTUFKX1ZFUlNJT04gPDwgMTYpIHwgKE1VWF9NSU5fVkVSU0lPTiA8PCA4KSB8IE1VWF9SRVZfVkVSU0lPTjsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIExpZmUgb2YgYSBjaHVuayBvYmplY3QuCisKK3ZvaWQgQ2h1bmtJbml0KFdlYlBDaHVuayogY29uc3QgY2h1bmspIHsKKyAgYXNzZXJ0KGNodW5rKTsKKyAgbWVtc2V0KGNodW5rLCAwLCBzaXplb2YoKmNodW5rKSk7CisgIGNodW5rLT50YWdfID0gTklMX1RBRzsKK30KKworV2ViUENodW5rKiBDaHVua1JlbGVhc2UoV2ViUENodW5rKiBjb25zdCBjaHVuaykgeworICBXZWJQQ2h1bmsqIG5leHQ7CisgIGlmIChjaHVuayA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgaWYgKGNodW5rLT5vd25lcl8pIHsKKyAgICBXZWJQRGF0YUNsZWFyKCZjaHVuay0+ZGF0YV8pOworICB9CisgIG5leHQgPSBjaHVuay0+bmV4dF87CisgIENodW5rSW5pdChjaHVuayk7CisgIHJldHVybiBuZXh0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ2h1bmsgbWlzYyBtZXRob2RzLgorCitDSFVOS19JTkRFWCBDaHVua0dldEluZGV4RnJvbVRhZyh1aW50MzJfdCB0YWcpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGtDaHVua3NbaV0udGFnICE9IE5JTF9UQUc7ICsraSkgeworICAgIGlmICh0YWcgPT0ga0NodW5rc1tpXS50YWcpIHJldHVybiAoQ0hVTktfSU5ERVgpaTsKKyAgfQorICByZXR1cm4gSURYX1VOS05PV047Cit9CisKK1dlYlBDaHVua0lkIENodW5rR2V0SWRGcm9tVGFnKHVpbnQzMl90IHRhZykgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsga0NodW5rc1tpXS50YWcgIT0gTklMX1RBRzsgKytpKSB7CisgICAgaWYgKHRhZyA9PSBrQ2h1bmtzW2ldLnRhZykgcmV0dXJuIGtDaHVua3NbaV0uaWQ7CisgIH0KKyAgcmV0dXJuIFdFQlBfQ0hVTktfVU5LTk9XTjsKK30KKwordWludDMyX3QgQ2h1bmtHZXRUYWdGcm9tRm91ckNDKGNvbnN0IGNoYXIgZm91cmNjWzRdKSB7CisgIHJldHVybiBNS0ZPVVJDQyhmb3VyY2NbMF0sIGZvdXJjY1sxXSwgZm91cmNjWzJdLCBmb3VyY2NbM10pOworfQorCitDSFVOS19JTkRFWCBDaHVua0dldEluZGV4RnJvbUZvdXJDQyhjb25zdCBjaGFyIGZvdXJjY1s0XSkgeworICBjb25zdCB1aW50MzJfdCB0YWcgPSBDaHVua0dldFRhZ0Zyb21Gb3VyQ0MoZm91cmNjKTsKKyAgcmV0dXJuIENodW5rR2V0SW5kZXhGcm9tVGFnKHRhZyk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDaHVuayBzZWFyY2ggbWV0aG9kcy4KKworLy8gUmV0dXJucyBuZXh0IGNodW5rIGluIHRoZSBjaHVuayBsaXN0IHdpdGggdGhlIGdpdmVuIHRhZy4KK3N0YXRpYyBXZWJQQ2h1bmsqIENodW5rU2VhcmNoTmV4dEluTGlzdChXZWJQQ2h1bmsqIGNodW5rLCB1aW50MzJfdCB0YWcpIHsKKyAgd2hpbGUgKGNodW5rICE9IE5VTEwgJiYgY2h1bmstPnRhZ18gIT0gdGFnKSB7CisgICAgY2h1bmsgPSBjaHVuay0+bmV4dF87CisgIH0KKyAgcmV0dXJuIGNodW5rOworfQorCitXZWJQQ2h1bmsqIENodW5rU2VhcmNoTGlzdChXZWJQQ2h1bmsqIGZpcnN0LCB1aW50MzJfdCBudGgsIHVpbnQzMl90IHRhZykgeworICB1aW50MzJfdCBpdGVyID0gbnRoOworICBmaXJzdCA9IENodW5rU2VhcmNoTmV4dEluTGlzdChmaXJzdCwgdGFnKTsKKyAgaWYgKGZpcnN0ID09IE5VTEwpIHJldHVybiBOVUxMOworCisgIHdoaWxlICgtLWl0ZXIgIT0gMCkgeworICAgIFdlYlBDaHVuayogbmV4dF9jaHVuayA9IENodW5rU2VhcmNoTmV4dEluTGlzdChmaXJzdC0+bmV4dF8sIHRhZyk7CisgICAgaWYgKG5leHRfY2h1bmsgPT0gTlVMTCkgYnJlYWs7CisgICAgZmlyc3QgPSBuZXh0X2NodW5rOworICB9CisgIHJldHVybiAoKG50aCA+IDApICYmIChpdGVyID4gMCkpID8gTlVMTCA6IGZpcnN0OworfQorCisvLyBPdXRwdXRzIGEgcG9pbnRlciB0byAncHJldl9jaHVuay0+bmV4dF8nLAorLy8gICB3aGVyZSAncHJldl9jaHVuaycgaXMgdGhlIHBvaW50ZXIgdG8gdGhlIGNodW5rIGF0IHBvc2l0aW9uIChudGggLSAxKS4KKy8vIFJldHVybnMgdHJ1ZSBpZiBudGggY2h1bmsgd2FzIGZvdW5kLgorc3RhdGljIGludCBDaHVua1NlYXJjaExpc3RUb1NldChXZWJQQ2h1bmsqKiBjaHVua19saXN0LCB1aW50MzJfdCBudGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBDaHVuayoqKiBjb25zdCBsb2NhdGlvbikgeworICB1aW50MzJfdCBjb3VudCA9IDA7CisgIGFzc2VydChjaHVua19saXN0ICE9IE5VTEwpOworICAqbG9jYXRpb24gPSBjaHVua19saXN0OworCisgIHdoaWxlICgqY2h1bmtfbGlzdCAhPSBOVUxMKSB7CisgICAgV2ViUENodW5rKiBjb25zdCBjdXJfY2h1bmsgPSAqY2h1bmtfbGlzdDsKKyAgICArK2NvdW50OworICAgIGlmIChjb3VudCA9PSBudGgpIHJldHVybiAxOyAgLy8gRm91bmQuCisgICAgY2h1bmtfbGlzdCA9ICZjdXJfY2h1bmstPm5leHRfOworICAgICpsb2NhdGlvbiA9IGNodW5rX2xpc3Q7CisgIH0KKworICAvLyAqY2h1bmtfbGlzdCBpcyBvayB0byBiZSBOVUxMIGlmIGFkZGluZyBhdCBsYXN0IGxvY2F0aW9uLgorICByZXR1cm4gKG50aCA9PSAwIHx8IChjb3VudCA9PSBudGggLSAxKSkgPyAxIDogMDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENodW5rIHdyaXRlciBtZXRob2RzLgorCitXZWJQTXV4RXJyb3IgQ2h1bmtBc3NpZ25EYXRhKFdlYlBDaHVuayogY2h1bmssIGNvbnN0IFdlYlBEYXRhKiBjb25zdCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29weV9kYXRhLCB1aW50MzJfdCB0YWcpIHsKKyAgLy8gRm9yIGludGVybmFsbHkgYWxsb2NhdGVkIGNodW5rcywgYWx3YXlzIGNvcHkgZGF0YSAmIG1ha2UgaXQgb3duZXIgb2YgZGF0YS4KKyAgaWYgKHRhZyA9PSBrQ2h1bmtzW0lEWF9WUDhYXS50YWcgfHwgdGFnID09IGtDaHVua3NbSURYX0FOSU1dLnRhZykgeworICAgIGNvcHlfZGF0YSA9IDE7CisgIH0KKworICBDaHVua1JlbGVhc2UoY2h1bmspOworCisgIGlmIChkYXRhICE9IE5VTEwpIHsKKyAgICBpZiAoY29weV9kYXRhKSB7ICAgICAgICAvLyBDb3B5IGRhdGEuCisgICAgICBpZiAoIVdlYlBEYXRhQ29weShkYXRhLCAmY2h1bmstPmRhdGFfKSkgcmV0dXJuIFdFQlBfTVVYX01FTU9SWV9FUlJPUjsKKyAgICAgIGNodW5rLT5vd25lcl8gPSAxOyAgICAvLyBDaHVuayBpcyBvd25lciBvZiBkYXRhLgorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgIC8vIERvbid0IGNvcHkgZGF0YS4KKyAgICAgIGNodW5rLT5kYXRhXyA9ICpkYXRhOworICAgIH0KKyAgfQorICBjaHVuay0+dGFnXyA9IHRhZzsKKyAgcmV0dXJuIFdFQlBfTVVYX09LOworfQorCitXZWJQTXV4RXJyb3IgQ2h1bmtTZXROdGgoV2ViUENodW5rKiBjaHVuaywgV2ViUENodW5rKiogY2h1bmtfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBudGgpIHsKKyAgV2ViUENodW5rKiBuZXdfY2h1bms7CisKKyAgaWYgKCFDaHVua1NlYXJjaExpc3RUb1NldChjaHVua19saXN0LCBudGgsICZjaHVua19saXN0KSkgeworICAgIHJldHVybiBXRUJQX01VWF9OT1RfRk9VTkQ7CisgIH0KKworICBuZXdfY2h1bmsgPSAoV2ViUENodW5rKilXZWJQU2FmZU1hbGxvYygxVUxMLCBzaXplb2YoKm5ld19jaHVuaykpOworICBpZiAobmV3X2NodW5rID09IE5VTEwpIHJldHVybiBXRUJQX01VWF9NRU1PUllfRVJST1I7CisgICpuZXdfY2h1bmsgPSAqY2h1bms7CisgIGNodW5rLT5vd25lcl8gPSAwOworICBuZXdfY2h1bmstPm5leHRfID0gKmNodW5rX2xpc3Q7CisgICpjaHVua19saXN0ID0gbmV3X2NodW5rOworICByZXR1cm4gV0VCUF9NVVhfT0s7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDaHVuayBkZWxldGlvbiBtZXRob2QocykuCisKK1dlYlBDaHVuayogQ2h1bmtEZWxldGUoV2ViUENodW5rKiBjb25zdCBjaHVuaykgeworICBXZWJQQ2h1bmsqIGNvbnN0IG5leHQgPSBDaHVua1JlbGVhc2UoY2h1bmspOworICBXZWJQU2FmZUZyZWUoY2h1bmspOworICByZXR1cm4gbmV4dDsKK30KKwordm9pZCBDaHVua0xpc3REZWxldGUoV2ViUENodW5rKiogY29uc3QgY2h1bmtfbGlzdCkgeworICB3aGlsZSAoKmNodW5rX2xpc3QgIT0gTlVMTCkgeworICAgICpjaHVua19saXN0ID0gQ2h1bmtEZWxldGUoKmNodW5rX2xpc3QpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDaHVuayBzZXJpYWxpemF0aW9uIG1ldGhvZHMuCisKK3N0YXRpYyB1aW50OF90KiBDaHVua0VtaXQoY29uc3QgV2ViUENodW5rKiBjb25zdCBjaHVuaywgdWludDhfdCogZHN0KSB7CisgIGNvbnN0IHNpemVfdCBjaHVua19zaXplID0gY2h1bmstPmRhdGFfLnNpemU7CisgIGFzc2VydChjaHVuayk7CisgIGFzc2VydChjaHVuay0+dGFnXyAhPSBOSUxfVEFHKTsKKyAgUHV0TEUzMihkc3QgKyAwLCBjaHVuay0+dGFnXyk7CisgIFB1dExFMzIoZHN0ICsgVEFHX1NJWkUsICh1aW50MzJfdCljaHVua19zaXplKTsKKyAgYXNzZXJ0KGNodW5rX3NpemUgPT0gKHVpbnQzMl90KWNodW5rX3NpemUpOworICBtZW1jcHkoZHN0ICsgQ0hVTktfSEVBREVSX1NJWkUsIGNodW5rLT5kYXRhXy5ieXRlcywgY2h1bmtfc2l6ZSk7CisgIGlmIChjaHVua19zaXplICYgMSkKKyAgICBkc3RbQ0hVTktfSEVBREVSX1NJWkUgKyBjaHVua19zaXplXSA9IDA7ICAvLyBBZGQgcGFkZGluZy4KKyAgcmV0dXJuIGRzdCArIENodW5rRGlza1NpemUoY2h1bmspOworfQorCit1aW50OF90KiBDaHVua0xpc3RFbWl0KGNvbnN0IFdlYlBDaHVuayogY2h1bmtfbGlzdCwgdWludDhfdCogZHN0KSB7CisgIHdoaWxlIChjaHVua19saXN0ICE9IE5VTEwpIHsKKyAgICBkc3QgPSBDaHVua0VtaXQoY2h1bmtfbGlzdCwgZHN0KTsKKyAgICBjaHVua19saXN0ID0gY2h1bmtfbGlzdC0+bmV4dF87CisgIH0KKyAgcmV0dXJuIGRzdDsKK30KKworc2l6ZV90IENodW5rTGlzdERpc2tTaXplKGNvbnN0IFdlYlBDaHVuayogY2h1bmtfbGlzdCkgeworICBzaXplX3Qgc2l6ZSA9IDA7CisgIHdoaWxlIChjaHVua19saXN0ICE9IE5VTEwpIHsKKyAgICBzaXplICs9IENodW5rRGlza1NpemUoY2h1bmtfbGlzdCk7CisgICAgY2h1bmtfbGlzdCA9IGNodW5rX2xpc3QtPm5leHRfOworICB9CisgIHJldHVybiBzaXplOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTGlmZSBvZiBhIE11eEltYWdlIG9iamVjdC4KKwordm9pZCBNdXhJbWFnZUluaXQoV2ViUE11eEltYWdlKiBjb25zdCB3cGkpIHsKKyAgYXNzZXJ0KHdwaSk7CisgIG1lbXNldCh3cGksIDAsIHNpemVvZigqd3BpKSk7Cit9CisKK1dlYlBNdXhJbWFnZSogTXV4SW1hZ2VSZWxlYXNlKFdlYlBNdXhJbWFnZSogY29uc3Qgd3BpKSB7CisgIFdlYlBNdXhJbWFnZSogbmV4dDsKKyAgaWYgKHdwaSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgQ2h1bmtEZWxldGUod3BpLT5oZWFkZXJfKTsKKyAgQ2h1bmtEZWxldGUod3BpLT5hbHBoYV8pOworICBDaHVua0RlbGV0ZSh3cGktPmltZ18pOworICBDaHVua0xpc3REZWxldGUoJndwaS0+dW5rbm93bl8pOworCisgIG5leHQgPSB3cGktPm5leHRfOworICBNdXhJbWFnZUluaXQod3BpKTsKKyAgcmV0dXJuIG5leHQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNdXhJbWFnZSBzZWFyY2ggbWV0aG9kcy4KKworLy8gR2V0IGEgcmVmZXJlbmNlIHRvIGFwcHJvcHJpYXRlIGNodW5rIGxpc3Qgd2l0aGluIGFuIGltYWdlIGdpdmVuIGNodW5rIHRhZy4KK3N0YXRpYyBXZWJQQ2h1bmsqKiBHZXRDaHVua0xpc3RGcm9tSWQoY29uc3QgV2ViUE11eEltYWdlKiBjb25zdCB3cGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBDaHVua0lkIGlkKSB7CisgIGFzc2VydCh3cGkgIT0gTlVMTCk7CisgIHN3aXRjaCAoaWQpIHsKKyAgICBjYXNlIFdFQlBfQ0hVTktfQU5NRjogIHJldHVybiAoV2ViUENodW5rKiopJndwaS0+aGVhZGVyXzsKKyAgICBjYXNlIFdFQlBfQ0hVTktfQUxQSEE6IHJldHVybiAoV2ViUENodW5rKiopJndwaS0+YWxwaGFfOworICAgIGNhc2UgV0VCUF9DSFVOS19JTUFHRTogcmV0dXJuIChXZWJQQ2h1bmsqKikmd3BpLT5pbWdfOworICAgIGRlZmF1bHQ6IHJldHVybiBOVUxMOworICB9Cit9CisKK2ludCBNdXhJbWFnZUNvdW50KGNvbnN0IFdlYlBNdXhJbWFnZSogd3BpX2xpc3QsIFdlYlBDaHVua0lkIGlkKSB7CisgIGludCBjb3VudCA9IDA7CisgIGNvbnN0IFdlYlBNdXhJbWFnZSogY3VycmVudDsKKyAgZm9yIChjdXJyZW50ID0gd3BpX2xpc3Q7IGN1cnJlbnQgIT0gTlVMTDsgY3VycmVudCA9IGN1cnJlbnQtPm5leHRfKSB7CisgICAgaWYgKGlkID09IFdFQlBfQ0hVTktfTklMKSB7CisgICAgICArK2NvdW50OyAgLy8gU3BlY2lhbCBjYXNlOiBjb3VudCBhbGwgaW1hZ2VzLgorICAgIH0gZWxzZSB7CisgICAgICBjb25zdCBXZWJQQ2h1bmsqIGNvbnN0IHdwaV9jaHVuayA9ICpHZXRDaHVua0xpc3RGcm9tSWQoY3VycmVudCwgaWQpOworICAgICAgaWYgKHdwaV9jaHVuayAhPSBOVUxMKSB7CisgICAgICAgIGNvbnN0IFdlYlBDaHVua0lkIHdwaV9jaHVua19pZCA9IENodW5rR2V0SWRGcm9tVGFnKHdwaV9jaHVuay0+dGFnXyk7CisgICAgICAgIGlmICh3cGlfY2h1bmtfaWQgPT0gaWQpICsrY291bnQ7ICAvLyBDb3VudCBpbWFnZXMgd2l0aCBhIG1hdGNoaW5nICdpZCcuCisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBjb3VudDsKK30KKworLy8gT3V0cHV0cyBhIHBvaW50ZXIgdG8gJ3ByZXZfd3BpLT5uZXh0XycsCisvLyAgIHdoZXJlICdwcmV2X3dwaScgaXMgdGhlIHBvaW50ZXIgdG8gdGhlIGltYWdlIGF0IHBvc2l0aW9uIChudGggLSAxKS4KKy8vIFJldHVybnMgdHJ1ZSBpZiBudGggaW1hZ2Ugd2FzIGZvdW5kLgorc3RhdGljIGludCBTZWFyY2hJbWFnZVRvR2V0T3JEZWxldGUoV2ViUE11eEltYWdlKiogd3BpX2xpc3QsIHVpbnQzMl90IG50aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBNdXhJbWFnZSoqKiBjb25zdCBsb2NhdGlvbikgeworICB1aW50MzJfdCBjb3VudCA9IDA7CisgIGFzc2VydCh3cGlfbGlzdCk7CisgICpsb2NhdGlvbiA9IHdwaV9saXN0OworCisgIGlmIChudGggPT0gMCkgeworICAgIG50aCA9IE11eEltYWdlQ291bnQoKndwaV9saXN0LCBXRUJQX0NIVU5LX05JTCk7CisgICAgaWYgKG50aCA9PSAwKSByZXR1cm4gMDsgIC8vIE5vdCBmb3VuZC4KKyAgfQorCisgIHdoaWxlICgqd3BpX2xpc3QgIT0gTlVMTCkgeworICAgIFdlYlBNdXhJbWFnZSogY29uc3QgY3VyX3dwaSA9ICp3cGlfbGlzdDsKKyAgICArK2NvdW50OworICAgIGlmIChjb3VudCA9PSBudGgpIHJldHVybiAxOyAgLy8gRm91bmQuCisgICAgd3BpX2xpc3QgPSAmY3VyX3dwaS0+bmV4dF87CisgICAgKmxvY2F0aW9uID0gd3BpX2xpc3Q7CisgIH0KKyAgcmV0dXJuIDA7ICAvLyBOb3QgZm91bmQuCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNdXhJbWFnZSB3cml0ZXIgbWV0aG9kcy4KKworV2ViUE11eEVycm9yIE11eEltYWdlUHVzaChjb25zdCBXZWJQTXV4SW1hZ2UqIHdwaSwgV2ViUE11eEltYWdlKiogd3BpX2xpc3QpIHsKKyAgV2ViUE11eEltYWdlKiBuZXdfd3BpOworCisgIHdoaWxlICgqd3BpX2xpc3QgIT0gTlVMTCkgeworICAgIFdlYlBNdXhJbWFnZSogY29uc3QgY3VyX3dwaSA9ICp3cGlfbGlzdDsKKyAgICBpZiAoY3VyX3dwaS0+bmV4dF8gPT0gTlVMTCkgYnJlYWs7CisgICAgd3BpX2xpc3QgPSAmY3VyX3dwaS0+bmV4dF87CisgIH0KKworICBuZXdfd3BpID0gKFdlYlBNdXhJbWFnZSopV2ViUFNhZmVNYWxsb2MoMVVMTCwgc2l6ZW9mKCpuZXdfd3BpKSk7CisgIGlmIChuZXdfd3BpID09IE5VTEwpIHJldHVybiBXRUJQX01VWF9NRU1PUllfRVJST1I7CisgICpuZXdfd3BpID0gKndwaTsKKyAgbmV3X3dwaS0+bmV4dF8gPSBOVUxMOworCisgIGlmICgqd3BpX2xpc3QgIT0gTlVMTCkgeworICAgICgqd3BpX2xpc3QpLT5uZXh0XyA9IG5ld193cGk7CisgIH0gZWxzZSB7CisgICAgKndwaV9saXN0ID0gbmV3X3dwaTsKKyAgfQorICByZXR1cm4gV0VCUF9NVVhfT0s7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNdXhJbWFnZSBkZWxldGlvbiBtZXRob2RzLgorCitXZWJQTXV4SW1hZ2UqIE11eEltYWdlRGVsZXRlKFdlYlBNdXhJbWFnZSogY29uc3Qgd3BpKSB7CisgIC8vIERlbGV0ZSB0aGUgY29tcG9uZW50cyBvZiB3cGkuIElmIHdwaSBpcyBOVUxMIHRoaXMgaXMgYSBub29wLgorICBXZWJQTXV4SW1hZ2UqIGNvbnN0IG5leHQgPSBNdXhJbWFnZVJlbGVhc2Uod3BpKTsKKyAgV2ViUFNhZmVGcmVlKHdwaSk7CisgIHJldHVybiBuZXh0OworfQorCitXZWJQTXV4RXJyb3IgTXV4SW1hZ2VEZWxldGVOdGgoV2ViUE11eEltYWdlKiogd3BpX2xpc3QsIHVpbnQzMl90IG50aCkgeworICBhc3NlcnQod3BpX2xpc3QpOworICBpZiAoIVNlYXJjaEltYWdlVG9HZXRPckRlbGV0ZSh3cGlfbGlzdCwgbnRoLCAmd3BpX2xpc3QpKSB7CisgICAgcmV0dXJuIFdFQlBfTVVYX05PVF9GT1VORDsKKyAgfQorICAqd3BpX2xpc3QgPSBNdXhJbWFnZURlbGV0ZSgqd3BpX2xpc3QpOworICByZXR1cm4gV0VCUF9NVVhfT0s7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNdXhJbWFnZSByZWFkZXIgbWV0aG9kcy4KKworV2ViUE11eEVycm9yIE11eEltYWdlR2V0TnRoKGNvbnN0IFdlYlBNdXhJbWFnZSoqIHdwaV9saXN0LCB1aW50MzJfdCBudGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUE11eEltYWdlKiogd3BpKSB7CisgIGFzc2VydCh3cGlfbGlzdCk7CisgIGFzc2VydCh3cGkpOworICBpZiAoIVNlYXJjaEltYWdlVG9HZXRPckRlbGV0ZSgoV2ViUE11eEltYWdlKiopd3BpX2xpc3QsIG50aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdlYlBNdXhJbWFnZSoqKikmd3BpX2xpc3QpKSB7CisgICAgcmV0dXJuIFdFQlBfTVVYX05PVF9GT1VORDsKKyAgfQorICAqd3BpID0gKFdlYlBNdXhJbWFnZSopKndwaV9saXN0OworICByZXR1cm4gV0VCUF9NVVhfT0s7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNdXhJbWFnZSBzZXJpYWxpemF0aW9uIG1ldGhvZHMuCisKKy8vIFNpemUgb2YgYW4gaW1hZ2UuCitzaXplX3QgTXV4SW1hZ2VEaXNrU2l6ZShjb25zdCBXZWJQTXV4SW1hZ2UqIGNvbnN0IHdwaSkgeworICBzaXplX3Qgc2l6ZSA9IDA7CisgIGlmICh3cGktPmhlYWRlcl8gIT0gTlVMTCkgc2l6ZSArPSBDaHVua0Rpc2tTaXplKHdwaS0+aGVhZGVyXyk7CisgIGlmICh3cGktPmFscGhhXyAhPSBOVUxMKSBzaXplICs9IENodW5rRGlza1NpemUod3BpLT5hbHBoYV8pOworICBpZiAod3BpLT5pbWdfICE9IE5VTEwpIHNpemUgKz0gQ2h1bmtEaXNrU2l6ZSh3cGktPmltZ18pOworICBpZiAod3BpLT51bmtub3duXyAhPSBOVUxMKSBzaXplICs9IENodW5rTGlzdERpc2tTaXplKHdwaS0+dW5rbm93bl8pOworICByZXR1cm4gc2l6ZTsKK30KKworLy8gU3BlY2lhbCBjYXNlIGFzIEFOTUYgY2h1bmsgZW5jYXBzdWxhdGVzIG90aGVyIGltYWdlIGNodW5rcy4KK3N0YXRpYyB1aW50OF90KiBDaHVua0VtaXRTcGVjaWFsKGNvbnN0IFdlYlBDaHVuayogY29uc3QgaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHRvdGFsX3NpemUsIHVpbnQ4X3QqIGRzdCkgeworICBjb25zdCBzaXplX3QgaGVhZGVyX3NpemUgPSBoZWFkZXItPmRhdGFfLnNpemU7CisgIGNvbnN0IHNpemVfdCBvZmZzZXRfdG9fbmV4dCA9IHRvdGFsX3NpemUgLSBDSFVOS19IRUFERVJfU0laRTsKKyAgYXNzZXJ0KGhlYWRlci0+dGFnXyA9PSBrQ2h1bmtzW0lEWF9BTk1GXS50YWcpOworICBQdXRMRTMyKGRzdCArIDAsIGhlYWRlci0+dGFnXyk7CisgIFB1dExFMzIoZHN0ICsgVEFHX1NJWkUsICh1aW50MzJfdClvZmZzZXRfdG9fbmV4dCk7CisgIGFzc2VydChoZWFkZXJfc2l6ZSA9PSAodWludDMyX3QpaGVhZGVyX3NpemUpOworICBtZW1jcHkoZHN0ICsgQ0hVTktfSEVBREVSX1NJWkUsIGhlYWRlci0+ZGF0YV8uYnl0ZXMsIGhlYWRlcl9zaXplKTsKKyAgaWYgKGhlYWRlcl9zaXplICYgMSkgeworICAgIGRzdFtDSFVOS19IRUFERVJfU0laRSArIGhlYWRlcl9zaXplXSA9IDA7ICAvLyBBZGQgcGFkZGluZy4KKyAgfQorICByZXR1cm4gZHN0ICsgQ2h1bmtEaXNrU2l6ZShoZWFkZXIpOworfQorCit1aW50OF90KiBNdXhJbWFnZUVtaXQoY29uc3QgV2ViUE11eEltYWdlKiBjb25zdCB3cGksIHVpbnQ4X3QqIGRzdCkgeworICAvLyBPcmRlcmluZyBvZiBjaHVua3MgdG8gYmUgZW1pdHRlZCBpcyBzdHJpY3RseSBhcyBmb2xsb3dzOgorICAvLyAxLiBBTk1GIGNodW5rIChpZiBwcmVzZW50KS4KKyAgLy8gMi4gQUxQSCBjaHVuayAoaWYgcHJlc2VudCkuCisgIC8vIDMuIFZQOC9WUDhMIGNodW5rLgorICBhc3NlcnQod3BpKTsKKyAgaWYgKHdwaS0+aGVhZGVyXyAhPSBOVUxMKSB7CisgICAgZHN0ID0gQ2h1bmtFbWl0U3BlY2lhbCh3cGktPmhlYWRlcl8sIE11eEltYWdlRGlza1NpemUod3BpKSwgZHN0KTsKKyAgfQorICBpZiAod3BpLT5hbHBoYV8gIT0gTlVMTCkgZHN0ID0gQ2h1bmtFbWl0KHdwaS0+YWxwaGFfLCBkc3QpOworICBpZiAod3BpLT5pbWdfICE9IE5VTEwpIGRzdCA9IENodW5rRW1pdCh3cGktPmltZ18sIGRzdCk7CisgIGlmICh3cGktPnVua25vd25fICE9IE5VTEwpIGRzdCA9IENodW5rTGlzdEVtaXQod3BpLT51bmtub3duXywgZHN0KTsKKyAgcmV0dXJuIGRzdDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhlbHBlciBtZXRob2RzIGZvciBtdXguCisKK2ludCBNdXhIYXNBbHBoYShjb25zdCBXZWJQTXV4SW1hZ2UqIGltYWdlcykgeworICB3aGlsZSAoaW1hZ2VzICE9IE5VTEwpIHsKKyAgICBpZiAoaW1hZ2VzLT5oYXNfYWxwaGFfKSByZXR1cm4gMTsKKyAgICBpbWFnZXMgPSBpbWFnZXMtPm5leHRfOworICB9CisgIHJldHVybiAwOworfQorCit1aW50OF90KiBNdXhFbWl0UmlmZkhlYWRlcih1aW50OF90KiBjb25zdCBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBQdXRMRTMyKGRhdGEgKyAwLCBNS0ZPVVJDQygnUicsICdJJywgJ0YnLCAnRicpKTsKKyAgUHV0TEUzMihkYXRhICsgVEFHX1NJWkUsICh1aW50MzJfdClzaXplIC0gQ0hVTktfSEVBREVSX1NJWkUpOworICBhc3NlcnQoc2l6ZSA9PSAodWludDMyX3Qpc2l6ZSk7CisgIFB1dExFMzIoZGF0YSArIFRBR19TSVpFICsgQ0hVTktfU0laRV9CWVRFUywgTUtGT1VSQ0MoJ1cnLCAnRScsICdCJywgJ1AnKSk7CisgIHJldHVybiBkYXRhICsgUklGRl9IRUFERVJfU0laRTsKK30KKworV2ViUENodW5rKiogTXV4R2V0Q2h1bmtMaXN0RnJvbUlkKGNvbnN0IFdlYlBNdXgqIG11eCwgV2ViUENodW5rSWQgaWQpIHsKKyAgYXNzZXJ0KG11eCAhPSBOVUxMKTsKKyAgc3dpdGNoIChpZCkgeworICAgIGNhc2UgV0VCUF9DSFVOS19WUDhYOiAgICByZXR1cm4gKFdlYlBDaHVuayoqKSZtdXgtPnZwOHhfOworICAgIGNhc2UgV0VCUF9DSFVOS19JQ0NQOiAgICByZXR1cm4gKFdlYlBDaHVuayoqKSZtdXgtPmljY3BfOworICAgIGNhc2UgV0VCUF9DSFVOS19BTklNOiAgICByZXR1cm4gKFdlYlBDaHVuayoqKSZtdXgtPmFuaW1fOworICAgIGNhc2UgV0VCUF9DSFVOS19FWElGOiAgICByZXR1cm4gKFdlYlBDaHVuayoqKSZtdXgtPmV4aWZfOworICAgIGNhc2UgV0VCUF9DSFVOS19YTVA6ICAgICByZXR1cm4gKFdlYlBDaHVuayoqKSZtdXgtPnhtcF87CisgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgIHJldHVybiAoV2ViUENodW5rKiopJm11eC0+dW5rbm93bl87CisgIH0KK30KKworc3RhdGljIGludCBJc05vdENvbXBhdGlibGUoaW50IGZlYXR1cmUsIGludCBudW1faXRlbXMpIHsKKyAgcmV0dXJuIChmZWF0dXJlICE9IDApICE9IChudW1faXRlbXMgPiAwKTsKK30KKworI2RlZmluZSBOT19GTEFHICgoV2ViUEZlYXR1cmVGbGFncykwKQorCisvLyBUZXN0IGJhc2ljIGNvbnN0cmFpbnRzOgorLy8gcmV0cmlldmFsLCBtYXhpbXVtIG51bWJlciBvZiBjaHVua3MgYnkgaW5kZXggKHVzZSAtMSB0byBza2lwKQorLy8gYW5kIGZlYXR1cmUgaW5jb21wYXRpYmlsaXR5ICh1c2UgTk9fRkxBRyB0byBza2lwKS4KKy8vIE9uIHN1Y2Nlc3MgcmV0dXJucyBXRUJQX01VWF9PSyBhbmQgc3RvcmVzIHRoZSBjaHVuayBjb3VudCBpbiAqbnVtLgorc3RhdGljIFdlYlBNdXhFcnJvciBWYWxpZGF0ZUNodW5rKGNvbnN0IFdlYlBNdXgqIGNvbnN0IG11eCwgQ0hVTktfSU5ERVggaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBGZWF0dXJlRmxhZ3MgZmVhdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2cDh4X2ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXgsIGludCogbnVtKSB7CisgIGNvbnN0IFdlYlBNdXhFcnJvciBlcnIgPQorICAgICAgV2ViUE11eE51bUNodW5rcyhtdXgsIGtDaHVua3NbaWR4XS5pZCwgbnVtKTsKKyAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgcmV0dXJuIGVycjsKKyAgaWYgKG1heCA+IC0xICYmICpudW0gPiBtYXgpIHJldHVybiBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UOworICBpZiAoZmVhdHVyZSAhPSBOT19GTEFHICYmIElzTm90Q29tcGF0aWJsZSh2cDh4X2ZsYWdzICYgZmVhdHVyZSwgKm51bSkpIHsKKyAgICByZXR1cm4gV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVDsKKyAgfQorICByZXR1cm4gV0VCUF9NVVhfT0s7Cit9CisKK1dlYlBNdXhFcnJvciBNdXhWYWxpZGF0ZShjb25zdCBXZWJQTXV4KiBjb25zdCBtdXgpIHsKKyAgaW50IG51bV9pY2NwOworICBpbnQgbnVtX2V4aWY7CisgIGludCBudW1feG1wOworICBpbnQgbnVtX2FuaW07CisgIGludCBudW1fZnJhbWVzOworICBpbnQgbnVtX3ZwOHg7CisgIGludCBudW1faW1hZ2VzOworICBpbnQgbnVtX2FscGhhOworICB1aW50MzJfdCBmbGFnczsKKyAgV2ViUE11eEVycm9yIGVycjsKKworICAvLyBWZXJpZnkgbXV4IGlzIG5vdCBOVUxMLgorICBpZiAobXV4ID09IE5VTEwpIHJldHVybiBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UOworCisgIC8vIFZlcmlmeSBtdXggaGFzIGF0IGxlYXN0IG9uZSBpbWFnZS4KKyAgaWYgKG11eC0+aW1hZ2VzXyA9PSBOVUxMKSByZXR1cm4gV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVDsKKworICBlcnIgPSBXZWJQTXV4R2V0RmVhdHVyZXMobXV4LCAmZmxhZ3MpOworICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSByZXR1cm4gZXJyOworCisgIC8vIEF0IG1vc3Qgb25lIGNvbG9yIHByb2ZpbGUgY2h1bmsuCisgIGVyciA9IFZhbGlkYXRlQ2h1bmsobXV4LCBJRFhfSUNDUCwgSUNDUF9GTEFHLCBmbGFncywgMSwgJm51bV9pY2NwKTsKKyAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgcmV0dXJuIGVycjsKKworICAvLyBBdCBtb3N0IG9uZSBFWElGIG1ldGFkYXRhLgorICBlcnIgPSBWYWxpZGF0ZUNodW5rKG11eCwgSURYX0VYSUYsIEVYSUZfRkxBRywgZmxhZ3MsIDEsICZudW1fZXhpZik7CisgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIHJldHVybiBlcnI7CisKKyAgLy8gQXQgbW9zdCBvbmUgWE1QIG1ldGFkYXRhLgorICBlcnIgPSBWYWxpZGF0ZUNodW5rKG11eCwgSURYX1hNUCwgWE1QX0ZMQUcsIGZsYWdzLCAxLCAmbnVtX3htcCk7CisgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIHJldHVybiBlcnI7CisKKyAgLy8gQW5pbWF0aW9uOiBBTklNQVRJT05fRkxBRywgQU5JTSBjaHVuayBhbmQgQU5NRiBjaHVuayhzKSBhcmUgY29uc2lzdGVudC4KKyAgLy8gQXQgbW9zdCBvbmUgQU5JTSBjaHVuay4KKyAgZXJyID0gVmFsaWRhdGVDaHVuayhtdXgsIElEWF9BTklNLCBOT19GTEFHLCBmbGFncywgMSwgJm51bV9hbmltKTsKKyAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgcmV0dXJuIGVycjsKKyAgZXJyID0gVmFsaWRhdGVDaHVuayhtdXgsIElEWF9BTk1GLCBOT19GTEFHLCBmbGFncywgLTEsICZudW1fZnJhbWVzKTsKKyAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgcmV0dXJuIGVycjsKKworICB7CisgICAgY29uc3QgaW50IGhhc19hbmltYXRpb24gPSAhIShmbGFncyAmIEFOSU1BVElPTl9GTEFHKTsKKyAgICBpZiAoaGFzX2FuaW1hdGlvbiAmJiAobnVtX2FuaW0gPT0gMCB8fCBudW1fZnJhbWVzID09IDApKSB7CisgICAgICByZXR1cm4gV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVDsKKyAgICB9CisgICAgaWYgKCFoYXNfYW5pbWF0aW9uICYmIChudW1fYW5pbSA9PSAxIHx8IG51bV9mcmFtZXMgPiAwKSkgeworICAgICAgcmV0dXJuIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQ7CisgICAgfQorICAgIGlmICghaGFzX2FuaW1hdGlvbikgeworICAgICAgY29uc3QgV2ViUE11eEltYWdlKiBpbWFnZXMgPSBtdXgtPmltYWdlc187CisgICAgICAvLyBUaGVyZSBjYW4gYmUgb25seSBvbmUgaW1hZ2UuCisgICAgICBpZiAoaW1hZ2VzID09IE5VTEwgfHwgaW1hZ2VzLT5uZXh0XyAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UOworICAgICAgfQorICAgICAgLy8gU2l6ZSBtdXN0IG1hdGNoLgorICAgICAgaWYgKG11eC0+Y2FudmFzX3dpZHRoXyA+IDApIHsKKyAgICAgICAgaWYgKGltYWdlcy0+d2lkdGhfICE9IG11eC0+Y2FudmFzX3dpZHRoXyB8fAorICAgICAgICAgICAgaW1hZ2VzLT5oZWlnaHRfICE9IG11eC0+Y2FudmFzX2hlaWdodF8pIHsKKyAgICAgICAgICByZXR1cm4gV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIFZlcmlmeSBlaXRoZXIgVlA4WCBjaHVuayBpcyBwcmVzZW50IE9SIHRoZXJlIGlzIG9ubHkgb25lIGVsZW0gaW4KKyAgLy8gbXV4LT5pbWFnZXNfLgorICBlcnIgPSBWYWxpZGF0ZUNodW5rKG11eCwgSURYX1ZQOFgsIE5PX0ZMQUcsIGZsYWdzLCAxLCAmbnVtX3ZwOHgpOworICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSByZXR1cm4gZXJyOworICBlcnIgPSBWYWxpZGF0ZUNodW5rKG11eCwgSURYX1ZQOCwgTk9fRkxBRywgZmxhZ3MsIC0xLCAmbnVtX2ltYWdlcyk7CisgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIHJldHVybiBlcnI7CisgIGlmIChudW1fdnA4eCA9PSAwICYmIG51bV9pbWFnZXMgIT0gMSkgcmV0dXJuIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQ7CisKKyAgLy8gQUxQSEFfRkxBRyAmIGFscGhhIGNodW5rKHMpIGFyZSBjb25zaXN0ZW50LgorICAvLyBOb3RlOiBBTFBIQV9GTEFHIGNhbiBiZSBzZXQgd2hlbiB0aGVyZSBpcyBhY3R1YWxseSBubyBBbHBoYSBkYXRhIHByZXNlbnQuCisgIGlmIChNdXhIYXNBbHBoYShtdXgtPmltYWdlc18pKSB7CisgICAgaWYgKG51bV92cDh4ID4gMCkgeworICAgICAgLy8gVlA4WCBjaHVuayBpcyBwcmVzZW50LCBzbyBpdCBzaG91bGQgY29udGFpbiBBTFBIQV9GTEFHLgorICAgICAgaWYgKCEoZmxhZ3MgJiBBTFBIQV9GTEFHKSkgcmV0dXJuIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQ7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFZQOFggY2h1bmsgaXMgbm90IHByZXNlbnQsIHNvIEFMUEggY2h1bmtzIHNob3VsZCBOT1QgYmUgcHJlc2VudCBlaXRoZXIuCisgICAgICBlcnIgPSBXZWJQTXV4TnVtQ2h1bmtzKG11eCwgV0VCUF9DSFVOS19BTFBIQSwgJm51bV9hbHBoYSk7CisgICAgICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSByZXR1cm4gZXJyOworICAgICAgaWYgKG51bV9hbHBoYSA+IDApIHJldHVybiBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UOworICAgIH0KKyAgfQorCisgIHJldHVybiBXRUJQX01VWF9PSzsKK30KKworI3VuZGVmIE5PX0ZMQUcKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL211eC9tdXhyZWFkLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvbXV4L211eHJlYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjU1Mjg2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL211eC9tdXhyZWFkLmMKQEAgLTAsMCArMSw1MzkgQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBSZWFkIEFQSXMgZm9yIG11eC4KKy8vCisvLyBBdXRob3JzOiBVcnZhbmcgKHVydmFuZ0Bnb29nbGUuY29tKQorLy8gICAgICAgICAgVmlrYXMgKHZpa2FzYUBnb29nbGUuY29tKQorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSAic3JjL211eC9tdXhpLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL3V0aWxzLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIZWxwZXIgbWV0aG9kKHMpLgorCisvLyBIYW5keSBNQUNSTy4KKyNkZWZpbmUgU1dJVENIX0lEX0xJU1QoSU5ERVgsIExJU1QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGlkeCA9PSAoSU5ERVgpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBXZWJQQ2h1bmsqIGNvbnN0IGNodW5rID0gQ2h1bmtTZWFyY2hMaXN0KChMSVNUKSwgbnRoLCAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDaHVua3NbKElOREVYKV0udGFnKTsgICAgIFwKKyAgICBpZiAoY2h1bmspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICpkYXRhID0gY2h1bmstPmRhdGFfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBXRUJQX01VWF9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBXRUJQX01VWF9OT1RfRk9VTkQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCitzdGF0aWMgV2ViUE11eEVycm9yIE11eEdldChjb25zdCBXZWJQTXV4KiBjb25zdCBtdXgsIENIVU5LX0lOREVYIGlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG50aCwgV2ViUERhdGEqIGNvbnN0IGRhdGEpIHsKKyAgYXNzZXJ0KG11eCAhPSBOVUxMKTsKKyAgYXNzZXJ0KCFJc1dQSShrQ2h1bmtzW2lkeF0uaWQpKTsKKyAgV2ViUERhdGFJbml0KGRhdGEpOworCisgIFNXSVRDSF9JRF9MSVNUKElEWF9WUDhYLCBtdXgtPnZwOHhfKTsKKyAgU1dJVENIX0lEX0xJU1QoSURYX0lDQ1AsIG11eC0+aWNjcF8pOworICBTV0lUQ0hfSURfTElTVChJRFhfQU5JTSwgbXV4LT5hbmltXyk7CisgIFNXSVRDSF9JRF9MSVNUKElEWF9FWElGLCBtdXgtPmV4aWZfKTsKKyAgU1dJVENIX0lEX0xJU1QoSURYX1hNUCwgbXV4LT54bXBfKTsKKyAgYXNzZXJ0KGlkeCAhPSBJRFhfVU5LTk9XTik7CisgIHJldHVybiBXRUJQX01VWF9OT1RfRk9VTkQ7Cit9CisjdW5kZWYgU1dJVENIX0lEX0xJU1QKKworLy8gRmlsbCB0aGUgY2h1bmsgd2l0aCB0aGUgZ2l2ZW4gZGF0YSAoaW5jbHVkZXMgY2h1bmsgaGVhZGVyIGJ5dGVzKSwgYWZ0ZXIgc29tZQorLy8gdmVyaWZpY2F0aW9ucy4KK3N0YXRpYyBXZWJQTXV4RXJyb3IgQ2h1bmtWZXJpZnlBbmRBc3NpZ24oV2ViUENodW5rKiBjaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHJpZmZfc2l6ZSwgaW50IGNvcHlfZGF0YSkgeworICB1aW50MzJfdCBjaHVua19zaXplOworICBXZWJQRGF0YSBjaHVua19kYXRhOworCisgIC8vIFNhbml0eSBjaGVja3MuCisgIGlmIChkYXRhX3NpemUgPCBDSFVOS19IRUFERVJfU0laRSkgcmV0dXJuIFdFQlBfTVVYX05PVF9FTk9VR0hfREFUQTsKKyAgY2h1bmtfc2l6ZSA9IEdldExFMzIoZGF0YSArIFRBR19TSVpFKTsKKworICB7CisgICAgY29uc3Qgc2l6ZV90IGNodW5rX2Rpc2tfc2l6ZSA9IFNpemVXaXRoUGFkZGluZyhjaHVua19zaXplKTsKKyAgICBpZiAoY2h1bmtfZGlza19zaXplID4gcmlmZl9zaXplKSByZXR1cm4gV0VCUF9NVVhfQkFEX0RBVEE7CisgICAgaWYgKGNodW5rX2Rpc2tfc2l6ZSA+IGRhdGFfc2l6ZSkgcmV0dXJuIFdFQlBfTVVYX05PVF9FTk9VR0hfREFUQTsKKyAgfQorCisgIC8vIERhdGEgYXNzaWdubWVudC4KKyAgY2h1bmtfZGF0YS5ieXRlcyA9IGRhdGEgKyBDSFVOS19IRUFERVJfU0laRTsKKyAgY2h1bmtfZGF0YS5zaXplID0gY2h1bmtfc2l6ZTsKKyAgcmV0dXJuIENodW5rQXNzaWduRGF0YShjaHVuaywgJmNodW5rX2RhdGEsIGNvcHlfZGF0YSwgR2V0TEUzMihkYXRhICsgMCkpOworfQorCitpbnQgTXV4SW1hZ2VGaW5hbGl6ZShXZWJQTXV4SW1hZ2UqIGNvbnN0IHdwaSkgeworICBjb25zdCBXZWJQQ2h1bmsqIGNvbnN0IGltZyA9IHdwaS0+aW1nXzsKKyAgY29uc3QgV2ViUERhdGEqIGNvbnN0IGltYWdlID0gJmltZy0+ZGF0YV87CisgIGNvbnN0IGludCBpc19sb3NzbGVzcyA9IChpbWctPnRhZ18gPT0ga0NodW5rc1tJRFhfVlA4TF0udGFnKTsKKyAgaW50IHcsIGg7CisgIGludCB2cDhsX2hhc19hbHBoYSA9IDA7CisgIGNvbnN0IGludCBvayA9IGlzX2xvc3NsZXNzID8KKyAgICAgIFZQOExHZXRJbmZvKGltYWdlLT5ieXRlcywgaW1hZ2UtPnNpemUsICZ3LCAmaCwgJnZwOGxfaGFzX2FscGhhKSA6CisgICAgICBWUDhHZXRJbmZvKGltYWdlLT5ieXRlcywgaW1hZ2UtPnNpemUsIGltYWdlLT5zaXplLCAmdywgJmgpOworICBhc3NlcnQoaW1nICE9IE5VTEwpOworICBpZiAob2spIHsKKyAgICAvLyBJZ25vcmUgQUxQSCBjaHVuayBhY2NvbXBhbnlpbmcgVlA4TC4KKyAgICBpZiAoaXNfbG9zc2xlc3MgJiYgKHdwaS0+YWxwaGFfICE9IE5VTEwpKSB7CisgICAgICBDaHVua0RlbGV0ZSh3cGktPmFscGhhXyk7CisgICAgICB3cGktPmFscGhhXyA9IE5VTEw7CisgICAgfQorICAgIHdwaS0+d2lkdGhfID0gdzsKKyAgICB3cGktPmhlaWdodF8gPSBoOworICAgIHdwaS0+aGFzX2FscGhhXyA9IHZwOGxfaGFzX2FscGhhIHx8ICh3cGktPmFscGhhXyAhPSBOVUxMKTsKKyAgfQorICByZXR1cm4gb2s7Cit9CisKK3N0YXRpYyBpbnQgTXV4SW1hZ2VQYXJzZShjb25zdCBXZWJQQ2h1bmsqIGNvbnN0IGNodW5rLCBpbnQgY29weV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBNdXhJbWFnZSogY29uc3Qgd3BpKSB7CisgIGNvbnN0IHVpbnQ4X3QqIGJ5dGVzID0gY2h1bmstPmRhdGFfLmJ5dGVzOworICBzaXplX3Qgc2l6ZSA9IGNodW5rLT5kYXRhXy5zaXplOworICBjb25zdCB1aW50OF90KiBjb25zdCBsYXN0ID0gYnl0ZXMgKyBzaXplOworICBXZWJQQ2h1bmsgc3ViY2h1bms7CisgIHNpemVfdCBzdWJjaHVua19zaXplOworICBDaHVua0luaXQoJnN1YmNodW5rKTsKKworICBhc3NlcnQoY2h1bmstPnRhZ18gPT0ga0NodW5rc1tJRFhfQU5NRl0udGFnKTsKKyAgYXNzZXJ0KCF3cGktPmlzX3BhcnRpYWxfKTsKKworICAvLyBBTk1GLgorICB7CisgICAgY29uc3Qgc2l6ZV90IGhkcl9zaXplID0gQU5NRl9DSFVOS19TSVpFOworICAgIGNvbnN0IFdlYlBEYXRhIHRlbXAgPSB7IGJ5dGVzLCBoZHJfc2l6ZSB9OworICAgIC8vIEVhY2ggb2YgQU5NRiBjaHVuayBjb250YWluIGEgaGVhZGVyIGF0IHRoZSBiZWdpbm5pbmcuIFNvLCBpdHMgc2l6ZSBzaG91bGQKKyAgICAvLyBiZSBhdCBsZWFzdCAnaGRyX3NpemUnLgorICAgIGlmIChzaXplIDwgaGRyX3NpemUpIGdvdG8gRmFpbDsKKyAgICBDaHVua0Fzc2lnbkRhdGEoJnN1YmNodW5rLCAmdGVtcCwgY29weV9kYXRhLCBjaHVuay0+dGFnXyk7CisgIH0KKyAgQ2h1bmtTZXROdGgoJnN1YmNodW5rLCAmd3BpLT5oZWFkZXJfLCAxKTsKKyAgd3BpLT5pc19wYXJ0aWFsXyA9IDE7ICAvLyBXYWl0aW5nIGZvciBBTFBIIGFuZC9vciBWUDgvVlA4TCBjaHVua3MuCisKKyAgLy8gUmVzdCBvZiB0aGUgY2h1bmtzLgorICBzdWJjaHVua19zaXplID0gQ2h1bmtEaXNrU2l6ZSgmc3ViY2h1bmspIC0gQ0hVTktfSEVBREVSX1NJWkU7CisgIGJ5dGVzICs9IHN1YmNodW5rX3NpemU7CisgIHNpemUgLT0gc3ViY2h1bmtfc2l6ZTsKKworICB3aGlsZSAoYnl0ZXMgIT0gbGFzdCkgeworICAgIENodW5rSW5pdCgmc3ViY2h1bmspOworICAgIGlmIChDaHVua1ZlcmlmeUFuZEFzc2lnbigmc3ViY2h1bmssIGJ5dGVzLCBzaXplLCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5X2RhdGEpICE9IFdFQlBfTVVYX09LKSB7CisgICAgICBnb3RvIEZhaWw7CisgICAgfQorICAgIHN3aXRjaCAoQ2h1bmtHZXRJZEZyb21UYWcoc3ViY2h1bmsudGFnXykpIHsKKyAgICAgIGNhc2UgV0VCUF9DSFVOS19BTFBIQToKKyAgICAgICAgaWYgKHdwaS0+YWxwaGFfICE9IE5VTEwpIGdvdG8gRmFpbDsgIC8vIENvbnNlY3V0aXZlIEFMUEggY2h1bmtzLgorICAgICAgICBpZiAoQ2h1bmtTZXROdGgoJnN1YmNodW5rLCAmd3BpLT5hbHBoYV8sIDEpICE9IFdFQlBfTVVYX09LKSBnb3RvIEZhaWw7CisgICAgICAgIHdwaS0+aXNfcGFydGlhbF8gPSAxOyAgLy8gV2FpdGluZyBmb3IgYSBWUDggY2h1bmsuCisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBXRUJQX0NIVU5LX0lNQUdFOgorICAgICAgICBpZiAoQ2h1bmtTZXROdGgoJnN1YmNodW5rLCAmd3BpLT5pbWdfLCAxKSAhPSBXRUJQX01VWF9PSykgZ290byBGYWlsOworICAgICAgICBpZiAoIU11eEltYWdlRmluYWxpemUod3BpKSkgZ290byBGYWlsOworICAgICAgICB3cGktPmlzX3BhcnRpYWxfID0gMDsgIC8vIHdwaSBpcyBjb21wbGV0ZWx5IGZpbGxlZC4KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFdFQlBfQ0hVTktfVU5LTk9XTjoKKyAgICAgICAgaWYgKHdwaS0+aXNfcGFydGlhbF8pIGdvdG8gRmFpbDsgIC8vIEVuY291bnRlcmVkIGFuIHVua25vd24gY2h1bmsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSBzb21lIGltYWdlIGNodW5rcy4KKyAgICAgICAgaWYgKENodW5rU2V0TnRoKCZzdWJjaHVuaywgJndwaS0+dW5rbm93bl8sIDApICE9IFdFQlBfTVVYX09LKSBnb3RvIEZhaWw7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZ290byBGYWlsOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgc3ViY2h1bmtfc2l6ZSA9IENodW5rRGlza1NpemUoJnN1YmNodW5rKTsKKyAgICBieXRlcyArPSBzdWJjaHVua19zaXplOworICAgIHNpemUgLT0gc3ViY2h1bmtfc2l6ZTsKKyAgfQorICBpZiAod3BpLT5pc19wYXJ0aWFsXykgZ290byBGYWlsOworICByZXR1cm4gMTsKKworIEZhaWw6CisgIENodW5rUmVsZWFzZSgmc3ViY2h1bmspOworICByZXR1cm4gMDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENyZWF0ZSBhIG11eCBvYmplY3QgZnJvbSBXZWJQLVJJRkYgZGF0YS4KKworV2ViUE11eCogV2ViUE11eENyZWF0ZUludGVybmFsKGNvbnN0IFdlYlBEYXRhKiBiaXRzdHJlYW0sIGludCBjb3B5X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZlcnNpb24pIHsKKyAgc2l6ZV90IHJpZmZfc2l6ZTsKKyAgdWludDMyX3QgdGFnOworICBjb25zdCB1aW50OF90KiBlbmQ7CisgIFdlYlBNdXgqIG11eCA9IE5VTEw7CisgIFdlYlBNdXhJbWFnZSogd3BpID0gTlVMTDsKKyAgY29uc3QgdWludDhfdCogZGF0YTsKKyAgc2l6ZV90IHNpemU7CisgIFdlYlBDaHVuayBjaHVuazsKKyAgQ2h1bmtJbml0KCZjaHVuayk7CisKKyAgLy8gU2FuaXR5IGNoZWNrcy4KKyAgaWYgKFdFQlBfQUJJX0lTX0lOQ09NUEFUSUJMRSh2ZXJzaW9uLCBXRUJQX01VWF9BQklfVkVSU0lPTikpIHsKKyAgICByZXR1cm4gTlVMTDsgIC8vIHZlcnNpb24gbWlzbWF0Y2gKKyAgfQorICBpZiAoYml0c3RyZWFtID09IE5VTEwpIHJldHVybiBOVUxMOworCisgIGRhdGEgPSBiaXRzdHJlYW0tPmJ5dGVzOworICBzaXplID0gYml0c3RyZWFtLT5zaXplOworCisgIGlmIChkYXRhID09IE5VTEwpIHJldHVybiBOVUxMOworICBpZiAoc2l6ZSA8IFJJRkZfSEVBREVSX1NJWkUpIHJldHVybiBOVUxMOworICBpZiAoR2V0TEUzMihkYXRhICsgMCkgIT0gTUtGT1VSQ0MoJ1InLCAnSScsICdGJywgJ0YnKSB8fAorICAgICAgR2V0TEUzMihkYXRhICsgQ0hVTktfSEVBREVSX1NJWkUpICE9IE1LRk9VUkNDKCdXJywgJ0UnLCAnQicsICdQJykpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIG11eCA9IFdlYlBNdXhOZXcoKTsKKyAgaWYgKG11eCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICBpZiAoc2l6ZSA8IFJJRkZfSEVBREVSX1NJWkUgKyBUQUdfU0laRSkgZ290byBFcnI7CisKKyAgdGFnID0gR2V0TEUzMihkYXRhICsgUklGRl9IRUFERVJfU0laRSk7CisgIGlmICh0YWcgIT0ga0NodW5rc1tJRFhfVlA4XS50YWcgJiYKKyAgICAgIHRhZyAhPSBrQ2h1bmtzW0lEWF9WUDhMXS50YWcgJiYKKyAgICAgIHRhZyAhPSBrQ2h1bmtzW0lEWF9WUDhYXS50YWcpIHsKKyAgICBnb3RvIEVycjsgIC8vIEZpcnN0IGNodW5rIHNob3VsZCBiZSBWUDgsIFZQOEwgb3IgVlA4WC4KKyAgfQorCisgIHJpZmZfc2l6ZSA9IFNpemVXaXRoUGFkZGluZyhHZXRMRTMyKGRhdGEgKyBUQUdfU0laRSkpOworICBpZiAocmlmZl9zaXplID4gTUFYX0NIVU5LX1BBWUxPQUQgfHwgcmlmZl9zaXplID4gc2l6ZSkgeworICAgIGdvdG8gRXJyOworICB9IGVsc2UgeworICAgIGlmIChyaWZmX3NpemUgPCBzaXplKSB7ICAvLyBSZWR1bmRhbnQgZGF0YSBhZnRlciBsYXN0IGNodW5rLgorICAgICAgc2l6ZSA9IHJpZmZfc2l6ZTsgIC8vIFRvIG1ha2Ugc3VyZSB3ZSBkb24ndCByZWFkIGFueSBkYXRhIGJleW9uZCBtdXhfc2l6ZS4KKyAgICB9CisgIH0KKworICBlbmQgPSBkYXRhICsgc2l6ZTsKKyAgZGF0YSArPSBSSUZGX0hFQURFUl9TSVpFOworICBzaXplIC09IFJJRkZfSEVBREVSX1NJWkU7CisKKyAgd3BpID0gKFdlYlBNdXhJbWFnZSopV2ViUFNhZmVNYWxsb2MoMVVMTCwgc2l6ZW9mKCp3cGkpKTsKKyAgaWYgKHdwaSA9PSBOVUxMKSBnb3RvIEVycjsKKyAgTXV4SW1hZ2VJbml0KHdwaSk7CisKKyAgLy8gTG9vcCBvdmVyIGNodW5rcy4KKyAgd2hpbGUgKGRhdGEgIT0gZW5kKSB7CisgICAgc2l6ZV90IGRhdGFfc2l6ZTsKKyAgICBXZWJQQ2h1bmtJZCBpZDsKKyAgICBXZWJQQ2h1bmsqKiBjaHVua19saXN0OworICAgIGlmIChDaHVua1ZlcmlmeUFuZEFzc2lnbigmY2h1bmssIGRhdGEsIHNpemUsIHJpZmZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weV9kYXRhKSAhPSBXRUJQX01VWF9PSykgeworICAgICAgZ290byBFcnI7CisgICAgfQorICAgIGRhdGFfc2l6ZSA9IENodW5rRGlza1NpemUoJmNodW5rKTsKKyAgICBpZCA9IENodW5rR2V0SWRGcm9tVGFnKGNodW5rLnRhZ18pOworICAgIHN3aXRjaCAoaWQpIHsKKyAgICAgIGNhc2UgV0VCUF9DSFVOS19BTFBIQToKKyAgICAgICAgaWYgKHdwaS0+YWxwaGFfICE9IE5VTEwpIGdvdG8gRXJyOyAgLy8gQ29uc2VjdXRpdmUgQUxQSCBjaHVua3MuCisgICAgICAgIGlmIChDaHVua1NldE50aCgmY2h1bmssICZ3cGktPmFscGhhXywgMSkgIT0gV0VCUF9NVVhfT0spIGdvdG8gRXJyOworICAgICAgICB3cGktPmlzX3BhcnRpYWxfID0gMTsgIC8vIFdhaXRpbmcgZm9yIGEgVlA4IGNodW5rLgorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgV0VCUF9DSFVOS19JTUFHRToKKyAgICAgICAgaWYgKENodW5rU2V0TnRoKCZjaHVuaywgJndwaS0+aW1nXywgMSkgIT0gV0VCUF9NVVhfT0spIGdvdG8gRXJyOworICAgICAgICBpZiAoIU11eEltYWdlRmluYWxpemUod3BpKSkgZ290byBFcnI7CisgICAgICAgIHdwaS0+aXNfcGFydGlhbF8gPSAwOyAgLy8gd3BpIGlzIGNvbXBsZXRlbHkgZmlsbGVkLgorIFB1c2hJbWFnZToKKyAgICAgICAgLy8gQWRkIHRoaXMgdG8gbXV4LT5pbWFnZXNfIGxpc3QuCisgICAgICAgIGlmIChNdXhJbWFnZVB1c2god3BpLCAmbXV4LT5pbWFnZXNfKSAhPSBXRUJQX01VWF9PSykgZ290byBFcnI7CisgICAgICAgIE11eEltYWdlSW5pdCh3cGkpOyAgLy8gUmVzZXQgZm9yIHJlYWRpbmcgbmV4dCBpbWFnZS4KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFdFQlBfQ0hVTktfQU5NRjoKKyAgICAgICAgaWYgKHdwaS0+aXNfcGFydGlhbF8pIGdvdG8gRXJyOyAgLy8gUHJldmlvdXMgd3BpIGlzIHN0aWxsIGluY29tcGxldGUuCisgICAgICAgIGlmICghTXV4SW1hZ2VQYXJzZSgmY2h1bmssIGNvcHlfZGF0YSwgd3BpKSkgZ290byBFcnI7CisgICAgICAgIENodW5rUmVsZWFzZSgmY2h1bmspOworICAgICAgICBnb3RvIFB1c2hJbWFnZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OiAgLy8gQSBub24taW1hZ2UgY2h1bmsuCisgICAgICAgIGlmICh3cGktPmlzX3BhcnRpYWxfKSBnb3RvIEVycjsgIC8vIEVuY291bnRlcmVkIGEgbm9uLWltYWdlIGNodW5rIGJlZm9yZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXR0aW5nIGFsbCBjaHVua3Mgb2YgYW4gaW1hZ2UuCisgICAgICAgIGNodW5rX2xpc3QgPSBNdXhHZXRDaHVua0xpc3RGcm9tSWQobXV4LCBpZCk7ICAvLyBMaXN0IHRvIGFkZCB0aGlzIGNodW5rLgorICAgICAgICBpZiAoQ2h1bmtTZXROdGgoJmNodW5rLCBjaHVua19saXN0LCAwKSAhPSBXRUJQX01VWF9PSykgZ290byBFcnI7CisgICAgICAgIGlmIChpZCA9PSBXRUJQX0NIVU5LX1ZQOFgpIHsgIC8vIGdyYWIgZ2xvYmFsIHNwZWNzCisgICAgICAgICAgbXV4LT5jYW52YXNfd2lkdGhfID0gR2V0TEUyNChkYXRhICsgMTIpICsgMTsKKyAgICAgICAgICBtdXgtPmNhbnZhc19oZWlnaHRfID0gR2V0TEUyNChkYXRhICsgMTUpICsgMTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgZGF0YSArPSBkYXRhX3NpemU7CisgICAgc2l6ZSAtPSBkYXRhX3NpemU7CisgICAgQ2h1bmtJbml0KCZjaHVuayk7CisgIH0KKworICAvLyBJbmNvbXBsZXRlIGltYWdlLgorICBpZiAod3BpLT5pc19wYXJ0aWFsXykgZ290byBFcnI7CisKKyAgLy8gVmFsaWRhdGUgbXV4IGlmIGNvbXBsZXRlLgorICBpZiAoTXV4VmFsaWRhdGUobXV4KSAhPSBXRUJQX01VWF9PSykgZ290byBFcnI7CisKKyAgTXV4SW1hZ2VEZWxldGUod3BpKTsKKyAgcmV0dXJuIG11eDsgIC8vIEFsbCBPSzsKKworIEVycjogIC8vIFNvbWV0aGluZyBiYWQgaGFwcGVuZWQuCisgIENodW5rUmVsZWFzZSgmY2h1bmspOworICBNdXhJbWFnZURlbGV0ZSh3cGkpOworICBXZWJQTXV4RGVsZXRlKG11eCk7CisgIHJldHVybiBOVUxMOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gR2V0IEFQSShzKS4KKworLy8gVmFsaWRhdGVzIHRoYXQgdGhlIGdpdmVuIG11eCBoYXMgYSBzaW5nbGUgaW1hZ2UuCitzdGF0aWMgV2ViUE11eEVycm9yIFZhbGlkYXRlRm9yU2luZ2xlSW1hZ2UoY29uc3QgV2ViUE11eCogY29uc3QgbXV4KSB7CisgIGNvbnN0IGludCBudW1faW1hZ2VzID0gTXV4SW1hZ2VDb3VudChtdXgtPmltYWdlc18sIFdFQlBfQ0hVTktfSU1BR0UpOworICBjb25zdCBpbnQgbnVtX2ZyYW1lcyA9IE11eEltYWdlQ291bnQobXV4LT5pbWFnZXNfLCBXRUJQX0NIVU5LX0FOTUYpOworCisgIGlmIChudW1faW1hZ2VzID09IDApIHsKKyAgICAvLyBObyBpbWFnZXMgaW4gbXV4LgorICAgIHJldHVybiBXRUJQX01VWF9OT1RfRk9VTkQ7CisgIH0gZWxzZSBpZiAobnVtX2ltYWdlcyA9PSAxICYmIG51bV9mcmFtZXMgPT0gMCkgeworICAgIC8vIFZhbGlkIGNhc2UgKHNpbmdsZSBpbWFnZSkuCisgICAgcmV0dXJuIFdFQlBfTVVYX09LOworICB9IGVsc2UgeworICAgIC8vIEZyYW1lIGNhc2UgT1IgYW4gaW52YWxpZCBtdXguCisgICAgcmV0dXJuIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQ7CisgIH0KK30KKworLy8gR2V0IHRoZSBjYW52YXMgd2lkdGgsIGhlaWdodCBhbmQgZmxhZ3MgYWZ0ZXIgdmFsaWRhdGluZyB0aGF0IFZQOFgvVlA4L1ZQOEwKKy8vIGNodW5rIGFuZCBjYW52YXMgc2l6ZSBhcmUgdmFsaWQuCitzdGF0aWMgV2ViUE11eEVycm9yIE11eEdldENhbnZhc0luZm8oY29uc3QgV2ViUE11eCogY29uc3QgbXV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsIGludCogaGVpZ2h0LCB1aW50MzJfdCogZmxhZ3MpIHsKKyAgaW50IHcsIGg7CisgIHVpbnQzMl90IGYgPSAwOworICBXZWJQRGF0YSBkYXRhOworICBhc3NlcnQobXV4ICE9IE5VTEwpOworCisgIC8vIENoZWNrIGlmIFZQOFggY2h1bmsgaXMgcHJlc2VudC4KKyAgaWYgKE11eEdldChtdXgsIElEWF9WUDhYLCAxLCAmZGF0YSkgPT0gV0VCUF9NVVhfT0spIHsKKyAgICBpZiAoZGF0YS5zaXplIDwgVlA4WF9DSFVOS19TSVpFKSByZXR1cm4gV0VCUF9NVVhfQkFEX0RBVEE7CisgICAgZiA9IEdldExFMzIoZGF0YS5ieXRlcyArIDApOworICAgIHcgPSBHZXRMRTI0KGRhdGEuYnl0ZXMgKyA0KSArIDE7CisgICAgaCA9IEdldExFMjQoZGF0YS5ieXRlcyArIDcpICsgMTsKKyAgfSBlbHNlIHsKKyAgICBjb25zdCBXZWJQTXV4SW1hZ2UqIGNvbnN0IHdwaSA9IG11eC0+aW1hZ2VzXzsKKyAgICAvLyBHcmFiIHVzZXItZm9yY2VkIGNhbnZhcyBzaXplIGFzIGRlZmF1bHQuCisgICAgdyA9IG11eC0+Y2FudmFzX3dpZHRoXzsKKyAgICBoID0gbXV4LT5jYW52YXNfaGVpZ2h0XzsKKyAgICBpZiAodyA9PSAwICYmIGggPT0gMCAmJiBWYWxpZGF0ZUZvclNpbmdsZUltYWdlKG11eCkgPT0gV0VCUF9NVVhfT0spIHsKKyAgICAgIC8vIHNpbmdsZSBpbWFnZSBhbmQgbm90IGZvcmNlZCBjYW52YXMgc2l6ZSA9PiB1c2UgZGltZW5zaW9uIG9mIGZpcnN0IGZyYW1lCisgICAgICBhc3NlcnQod3BpICE9IE5VTEwpOworICAgICAgdyA9IHdwaS0+d2lkdGhfOworICAgICAgaCA9IHdwaS0+aGVpZ2h0XzsKKyAgICB9CisgICAgaWYgKHdwaSAhPSBOVUxMKSB7CisgICAgICBpZiAod3BpLT5oYXNfYWxwaGFfKSBmIHw9IEFMUEhBX0ZMQUc7CisgICAgfQorICB9CisgIGlmICh3ICogKHVpbnQ2NF90KWggPj0gTUFYX0lNQUdFX0FSRUEpIHJldHVybiBXRUJQX01VWF9CQURfREFUQTsKKworICBpZiAod2lkdGggIT0gTlVMTCkgKndpZHRoID0gdzsKKyAgaWYgKGhlaWdodCAhPSBOVUxMKSAqaGVpZ2h0ID0gaDsKKyAgaWYgKGZsYWdzICE9IE5VTEwpICpmbGFncyA9IGY7CisgIHJldHVybiBXRUJQX01VWF9PSzsKK30KKworV2ViUE11eEVycm9yIFdlYlBNdXhHZXRDYW52YXNTaXplKGNvbnN0IFdlYlBNdXgqIG11eCwgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQpIHsKKyAgaWYgKG11eCA9PSBOVUxMIHx8IHdpZHRoID09IE5VTEwgfHwgaGVpZ2h0ID09IE5VTEwpIHsKKyAgICByZXR1cm4gV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVDsKKyAgfQorICByZXR1cm4gTXV4R2V0Q2FudmFzSW5mbyhtdXgsIHdpZHRoLCBoZWlnaHQsIE5VTEwpOworfQorCitXZWJQTXV4RXJyb3IgV2ViUE11eEdldEZlYXR1cmVzKGNvbnN0IFdlYlBNdXgqIG11eCwgdWludDMyX3QqIGZsYWdzKSB7CisgIGlmIChtdXggPT0gTlVMTCB8fCBmbGFncyA9PSBOVUxMKSByZXR1cm4gV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVDsKKyAgcmV0dXJuIE11eEdldENhbnZhc0luZm8obXV4LCBOVUxMLCBOVUxMLCBmbGFncyk7Cit9CisKK3N0YXRpYyB1aW50OF90KiBFbWl0VlA4WENodW5rKHVpbnQ4X3QqIGNvbnN0IGRzdCwgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgdWludDMyX3QgZmxhZ3MpIHsKKyAgY29uc3Qgc2l6ZV90IHZwOHhfc2l6ZSA9IENIVU5LX0hFQURFUl9TSVpFICsgVlA4WF9DSFVOS19TSVpFOworICBhc3NlcnQod2lkdGggPj0gMSAmJiBoZWlnaHQgPj0gMSk7CisgIGFzc2VydCh3aWR0aCA8PSBNQVhfQ0FOVkFTX1NJWkUgJiYgaGVpZ2h0IDw9IE1BWF9DQU5WQVNfU0laRSk7CisgIGFzc2VydCh3aWR0aCAqICh1aW50NjRfdCloZWlnaHQgPCBNQVhfSU1BR0VfQVJFQSk7CisgIFB1dExFMzIoZHN0LCBNS0ZPVVJDQygnVicsICdQJywgJzgnLCAnWCcpKTsKKyAgUHV0TEUzMihkc3QgKyBUQUdfU0laRSwgVlA4WF9DSFVOS19TSVpFKTsKKyAgUHV0TEUzMihkc3QgKyBDSFVOS19IRUFERVJfU0laRSwgZmxhZ3MpOworICBQdXRMRTI0KGRzdCArIENIVU5LX0hFQURFUl9TSVpFICsgNCwgd2lkdGggLSAxKTsKKyAgUHV0TEUyNChkc3QgKyBDSFVOS19IRUFERVJfU0laRSArIDcsIGhlaWdodCAtIDEpOworICByZXR1cm4gZHN0ICsgdnA4eF9zaXplOworfQorCisvLyBBc3NlbWJsZSBhIHNpbmdsZSBpbWFnZSBXZWJQIGJpdHN0cmVhbSBmcm9tICd3cGknLgorc3RhdGljIFdlYlBNdXhFcnJvciBTeW50aGVzaXplQml0c3RyZWFtKGNvbnN0IFdlYlBNdXhJbWFnZSogY29uc3Qgd3BpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBEYXRhKiBjb25zdCBiaXRzdHJlYW0pIHsKKyAgdWludDhfdCogZHN0OworCisgIC8vIEFsbG9jYXRlIGRhdGEuCisgIGNvbnN0IGludCBuZWVkX3ZwOHggPSAod3BpLT5hbHBoYV8gIT0gTlVMTCk7CisgIGNvbnN0IHNpemVfdCB2cDh4X3NpemUgPSBuZWVkX3ZwOHggPyBDSFVOS19IRUFERVJfU0laRSArIFZQOFhfQ0hVTktfU0laRSA6IDA7CisgIGNvbnN0IHNpemVfdCBhbHBoYV9zaXplID0gbmVlZF92cDh4ID8gQ2h1bmtEaXNrU2l6ZSh3cGktPmFscGhhXykgOiAwOworICAvLyBOb3RlOiBObyBuZWVkIHRvIG91dHB1dCBBTk1GIGNodW5rIGZvciBhIHNpbmdsZSBpbWFnZS4KKyAgY29uc3Qgc2l6ZV90IHNpemUgPSBSSUZGX0hFQURFUl9TSVpFICsgdnA4eF9zaXplICsgYWxwaGFfc2l6ZSArCisgICAgICAgICAgICAgICAgICAgICAgQ2h1bmtEaXNrU2l6ZSh3cGktPmltZ18pOworICB1aW50OF90KiBjb25zdCBkYXRhID0gKHVpbnQ4X3QqKVdlYlBTYWZlTWFsbG9jKDFVTEwsIHNpemUpOworICBpZiAoZGF0YSA9PSBOVUxMKSByZXR1cm4gV0VCUF9NVVhfTUVNT1JZX0VSUk9SOworCisgIC8vIE1haW4gUklGRiBoZWFkZXIuCisgIGRzdCA9IE11eEVtaXRSaWZmSGVhZGVyKGRhdGEsIHNpemUpOworCisgIGlmIChuZWVkX3ZwOHgpIHsKKyAgICBkc3QgPSBFbWl0VlA4WENodW5rKGRzdCwgd3BpLT53aWR0aF8sIHdwaS0+aGVpZ2h0XywgQUxQSEFfRkxBRyk7ICAvLyBWUDhYLgorICAgIGRzdCA9IENodW5rTGlzdEVtaXQod3BpLT5hbHBoYV8sIGRzdCk7ICAgICAgIC8vIEFMUEguCisgIH0KKworICAvLyBCaXRzdHJlYW0uCisgIGRzdCA9IENodW5rTGlzdEVtaXQod3BpLT5pbWdfLCBkc3QpOworICBhc3NlcnQoZHN0ID09IGRhdGEgKyBzaXplKTsKKworICAvLyBPdXRwdXQuCisgIGJpdHN0cmVhbS0+Ynl0ZXMgPSBkYXRhOworICBiaXRzdHJlYW0tPnNpemUgPSBzaXplOworICByZXR1cm4gV0VCUF9NVVhfT0s7Cit9CisKK1dlYlBNdXhFcnJvciBXZWJQTXV4R2V0Q2h1bmsoY29uc3QgV2ViUE11eCogbXV4LCBjb25zdCBjaGFyIGZvdXJjY1s0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUERhdGEqIGNodW5rX2RhdGEpIHsKKyAgQ0hVTktfSU5ERVggaWR4OworICBpZiAobXV4ID09IE5VTEwgfHwgZm91cmNjID09IE5VTEwgfHwgY2h1bmtfZGF0YSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQ7CisgIH0KKyAgaWR4ID0gQ2h1bmtHZXRJbmRleEZyb21Gb3VyQ0MoZm91cmNjKTsKKyAgaWYgKElzV1BJKGtDaHVua3NbaWR4XS5pZCkpIHsgICAgIC8vIEFuIGltYWdlIGNodW5rLgorICAgIHJldHVybiBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UOworICB9IGVsc2UgaWYgKGlkeCAhPSBJRFhfVU5LTk9XTikgeyAgLy8gQSBrbm93biBjaHVuayB0eXBlLgorICAgIHJldHVybiBNdXhHZXQobXV4LCBpZHgsIDEsIGNodW5rX2RhdGEpOworICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQW4gdW5rbm93biBjaHVuayB0eXBlLgorICAgIGNvbnN0IFdlYlBDaHVuayogY29uc3QgY2h1bmsgPQorICAgICAgICBDaHVua1NlYXJjaExpc3QobXV4LT51bmtub3duXywgMSwgQ2h1bmtHZXRUYWdGcm9tRm91ckNDKGZvdXJjYykpOworICAgIGlmIChjaHVuayA9PSBOVUxMKSByZXR1cm4gV0VCUF9NVVhfTk9UX0ZPVU5EOworICAgICpjaHVua19kYXRhID0gY2h1bmstPmRhdGFfOworICAgIHJldHVybiBXRUJQX01VWF9PSzsKKyAgfQorfQorCitzdGF0aWMgV2ViUE11eEVycm9yIE11eEdldEltYWdlSW50ZXJuYWwoY29uc3QgV2ViUE11eEltYWdlKiBjb25zdCB3cGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUE11eEZyYW1lSW5mbyogY29uc3QgaW5mbykgeworICAvLyBTZXQgc29tZSBkZWZhdWx0cyBmb3IgdW5yZWxhdGVkIGZpZWxkcy4KKyAgaW5mby0+eF9vZmZzZXQgPSAwOworICBpbmZvLT55X29mZnNldCA9IDA7CisgIGluZm8tPmR1cmF0aW9uID0gMTsKKyAgaW5mby0+ZGlzcG9zZV9tZXRob2QgPSBXRUJQX01VWF9ESVNQT1NFX05PTkU7CisgIGluZm8tPmJsZW5kX21ldGhvZCA9IFdFQlBfTVVYX0JMRU5EOworICAvLyBFeHRyYWN0IGRhdGEgZm9yIHJlbGF0ZWQgZmllbGRzLgorICBpbmZvLT5pZCA9IENodW5rR2V0SWRGcm9tVGFnKHdwaS0+aW1nXy0+dGFnXyk7CisgIHJldHVybiBTeW50aGVzaXplQml0c3RyZWFtKHdwaSwgJmluZm8tPmJpdHN0cmVhbSk7Cit9CisKK3N0YXRpYyBXZWJQTXV4RXJyb3IgTXV4R2V0RnJhbWVJbnRlcm5hbChjb25zdCBXZWJQTXV4SW1hZ2UqIGNvbnN0IHdwaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQTXV4RnJhbWVJbmZvKiBjb25zdCBmcmFtZSkgeworICBjb25zdCBpbnQgaXNfZnJhbWUgPSAod3BpLT5oZWFkZXJfLT50YWdfID09IGtDaHVua3NbSURYX0FOTUZdLnRhZyk7CisgIGNvbnN0IFdlYlBEYXRhKiBmcmFtZV9kYXRhOworICBpZiAoIWlzX2ZyYW1lKSByZXR1cm4gV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVDsKKyAgYXNzZXJ0KHdwaS0+aGVhZGVyXyAhPSBOVUxMKTsgIC8vIEFscmVhZHkgY2hlY2tlZCBieSBXZWJQTXV4R2V0RnJhbWUoKS4KKyAgLy8gR2V0IGZyYW1lIGNodW5rLgorICBmcmFtZV9kYXRhID0gJndwaS0+aGVhZGVyXy0+ZGF0YV87CisgIGlmIChmcmFtZV9kYXRhLT5zaXplIDwga0NodW5rc1tJRFhfQU5NRl0uc2l6ZSkgcmV0dXJuIFdFQlBfTVVYX0JBRF9EQVRBOworICAvLyBFeHRyYWN0IGluZm8uCisgIGZyYW1lLT54X29mZnNldCA9IDIgKiBHZXRMRTI0KGZyYW1lX2RhdGEtPmJ5dGVzICsgMCk7CisgIGZyYW1lLT55X29mZnNldCA9IDIgKiBHZXRMRTI0KGZyYW1lX2RhdGEtPmJ5dGVzICsgMyk7CisgIHsKKyAgICBjb25zdCB1aW50OF90IGJpdHMgPSBmcmFtZV9kYXRhLT5ieXRlc1sxNV07CisgICAgZnJhbWUtPmR1cmF0aW9uID0gR2V0TEUyNChmcmFtZV9kYXRhLT5ieXRlcyArIDEyKTsKKyAgICBmcmFtZS0+ZGlzcG9zZV9tZXRob2QgPQorICAgICAgICAoYml0cyAmIDEpID8gV0VCUF9NVVhfRElTUE9TRV9CQUNLR1JPVU5EIDogV0VCUF9NVVhfRElTUE9TRV9OT05FOworICAgIGZyYW1lLT5ibGVuZF9tZXRob2QgPSAoYml0cyAmIDIpID8gV0VCUF9NVVhfTk9fQkxFTkQgOiBXRUJQX01VWF9CTEVORDsKKyAgfQorICBmcmFtZS0+aWQgPSBDaHVua0dldElkRnJvbVRhZyh3cGktPmhlYWRlcl8tPnRhZ18pOworICByZXR1cm4gU3ludGhlc2l6ZUJpdHN0cmVhbSh3cGksICZmcmFtZS0+Yml0c3RyZWFtKTsKK30KKworV2ViUE11eEVycm9yIFdlYlBNdXhHZXRGcmFtZSgKKyAgICBjb25zdCBXZWJQTXV4KiBtdXgsIHVpbnQzMl90IG50aCwgV2ViUE11eEZyYW1lSW5mbyogZnJhbWUpIHsKKyAgV2ViUE11eEVycm9yIGVycjsKKyAgV2ViUE11eEltYWdlKiB3cGk7CisKKyAgLy8gU2FuaXR5IGNoZWNrcy4KKyAgaWYgKG11eCA9PSBOVUxMIHx8IGZyYW1lID09IE5VTEwpIHsKKyAgICByZXR1cm4gV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVDsKKyAgfQorCisgIC8vIEdldCB0aGUgbnRoIFdlYlBNdXhJbWFnZS4KKyAgZXJyID0gTXV4SW1hZ2VHZXROdGgoKGNvbnN0IFdlYlBNdXhJbWFnZSoqKSZtdXgtPmltYWdlc18sIG50aCwgJndwaSk7CisgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIHJldHVybiBlcnI7CisKKyAgLy8gR2V0IGZyYW1lIGluZm8uCisgIGlmICh3cGktPmhlYWRlcl8gPT0gTlVMTCkgeworICAgIHJldHVybiBNdXhHZXRJbWFnZUludGVybmFsKHdwaSwgZnJhbWUpOworICB9IGVsc2UgeworICAgIHJldHVybiBNdXhHZXRGcmFtZUludGVybmFsKHdwaSwgZnJhbWUpOworICB9Cit9CisKK1dlYlBNdXhFcnJvciBXZWJQTXV4R2V0QW5pbWF0aW9uUGFyYW1zKGNvbnN0IFdlYlBNdXgqIG11eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBNdXhBbmltUGFyYW1zKiBwYXJhbXMpIHsKKyAgV2ViUERhdGEgYW5pbTsKKyAgV2ViUE11eEVycm9yIGVycjsKKworICBpZiAobXV4ID09IE5VTEwgfHwgcGFyYW1zID09IE5VTEwpIHJldHVybiBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UOworCisgIGVyciA9IE11eEdldChtdXgsIElEWF9BTklNLCAxLCAmYW5pbSk7CisgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIHJldHVybiBlcnI7CisgIGlmIChhbmltLnNpemUgPCBrQ2h1bmtzW1dFQlBfQ0hVTktfQU5JTV0uc2l6ZSkgcmV0dXJuIFdFQlBfTVVYX0JBRF9EQVRBOworICBwYXJhbXMtPmJnY29sb3IgPSBHZXRMRTMyKGFuaW0uYnl0ZXMpOworICBwYXJhbXMtPmxvb3BfY291bnQgPSBHZXRMRTE2KGFuaW0uYnl0ZXMgKyA0KTsKKworICByZXR1cm4gV0VCUF9NVVhfT0s7Cit9CisKKy8vIEdldCBjaHVuayBpbmRleCBmcm9tIGNodW5rIGlkLiBSZXR1cm5zIElEWF9OSUwgaWYgbm90IGZvdW5kLgorc3RhdGljIENIVU5LX0lOREVYIENodW5rR2V0SW5kZXhGcm9tSWQoV2ViUENodW5rSWQgaWQpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGtDaHVua3NbaV0uaWQgIT0gV0VCUF9DSFVOS19OSUw7ICsraSkgeworICAgIGlmIChpZCA9PSBrQ2h1bmtzW2ldLmlkKSByZXR1cm4gKENIVU5LX0lOREVYKWk7CisgIH0KKyAgcmV0dXJuIElEWF9OSUw7Cit9CisKKy8vIENvdW50IG51bWJlciBvZiBjaHVua3MgbWF0Y2hpbmcgJ3RhZycgaW4gdGhlICdjaHVua19saXN0Jy4KKy8vIElmIHRhZyA9PSBOSUxfVEFHLCBhbnkgdGFnIHdpbGwgYmUgbWF0Y2hlZC4KK3N0YXRpYyBpbnQgQ291bnRDaHVua3MoY29uc3QgV2ViUENodW5rKiBjb25zdCBjaHVua19saXN0LCB1aW50MzJfdCB0YWcpIHsKKyAgaW50IGNvdW50ID0gMDsKKyAgY29uc3QgV2ViUENodW5rKiBjdXJyZW50OworICBmb3IgKGN1cnJlbnQgPSBjaHVua19saXN0OyBjdXJyZW50ICE9IE5VTEw7IGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0XykgeworICAgIGlmICh0YWcgPT0gTklMX1RBRyB8fCBjdXJyZW50LT50YWdfID09IHRhZykgeworICAgICAgY291bnQrKzsgIC8vIENvdW50IGNodW5rcyB3aG9zZSB0YWdzIG1hdGNoLgorICAgIH0KKyAgfQorICByZXR1cm4gY291bnQ7Cit9CisKK1dlYlBNdXhFcnJvciBXZWJQTXV4TnVtQ2h1bmtzKGNvbnN0IFdlYlBNdXgqIG11eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBDaHVua0lkIGlkLCBpbnQqIG51bV9lbGVtZW50cykgeworICBpZiAobXV4ID09IE5VTEwgfHwgbnVtX2VsZW1lbnRzID09IE5VTEwpIHsKKyAgICByZXR1cm4gV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVDsKKyAgfQorCisgIGlmIChJc1dQSShpZCkpIHsKKyAgICAqbnVtX2VsZW1lbnRzID0gTXV4SW1hZ2VDb3VudChtdXgtPmltYWdlc18sIGlkKTsKKyAgfSBlbHNlIHsKKyAgICBXZWJQQ2h1bmsqIGNvbnN0KiBjaHVua19saXN0ID0gTXV4R2V0Q2h1bmtMaXN0RnJvbUlkKG11eCwgaWQpOworICAgIGNvbnN0IENIVU5LX0lOREVYIGlkeCA9IENodW5rR2V0SW5kZXhGcm9tSWQoaWQpOworICAgICpudW1fZWxlbWVudHMgPSBDb3VudENodW5rcygqY2h1bmtfbGlzdCwga0NodW5rc1tpZHhdLnRhZyk7CisgIH0KKworICByZXR1cm4gV0VCUF9NVVhfT0s7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvTWFrZWZpbGUuYW0gYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJiMGZlNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDUxIEBACitBTV9DUFBGTEFHUyArPSAtSSQodG9wX2J1aWxkZGlyKSAtSSQodG9wX3NyY2RpcikKK25vaW5zdF9MVExJQlJBUklFUyA9IGxpYndlYnB1dGlscy5sYQorCitpZiBCVUlMRF9MSUJXRUJQREVDT0RFUgorICBub2luc3RfTFRMSUJSQVJJRVMgKz0gbGlid2VicHV0aWxzZGVjb2RlLmxhCitlbmRpZgorCitjb21tb25fSEVBREVSUyA9IC4uL3dlYnAvdHlwZXMuaAorY29tbW9uZGlyID0gJChpbmNsdWRlZGlyKS93ZWJwCisKK25vaW5zdF9IRUFERVJTID0KK25vaW5zdF9IRUFERVJTICs9IC4uL2RzcC9kc3AuaAorbm9pbnN0X0hFQURFUlMgKz0gLi4vd2VicC9kZWNvZGUuaAorbm9pbnN0X0hFQURFUlMgKz0gLi4vd2VicC9lbmNvZGUuaAorbm9pbnN0X0hFQURFUlMgKz0gLi4vd2VicC9mb3JtYXRfY29uc3RhbnRzLmgKKworQ09NTU9OX1NPVVJDRVMgPQorQ09NTU9OX1NPVVJDRVMgKz0gYml0X3JlYWRlcl91dGlscy5jCitDT01NT05fU09VUkNFUyArPSBiaXRfcmVhZGVyX3V0aWxzLmgKK0NPTU1PTl9TT1VSQ0VTICs9IGJpdF9yZWFkZXJfaW5sX3V0aWxzLmgKK0NPTU1PTl9TT1VSQ0VTICs9IGNvbG9yX2NhY2hlX3V0aWxzLmMKK0NPTU1PTl9TT1VSQ0VTICs9IGNvbG9yX2NhY2hlX3V0aWxzLmgKK0NPTU1PTl9TT1VSQ0VTICs9IGVuZGlhbl9pbmxfdXRpbHMuaAorQ09NTU9OX1NPVVJDRVMgKz0gZmlsdGVyc191dGlscy5jCitDT01NT05fU09VUkNFUyArPSBmaWx0ZXJzX3V0aWxzLmgKK0NPTU1PTl9TT1VSQ0VTICs9IGh1ZmZtYW5fdXRpbHMuYworQ09NTU9OX1NPVVJDRVMgKz0gaHVmZm1hbl91dGlscy5oCitDT01NT05fU09VUkNFUyArPSBxdWFudF9sZXZlbHNfZGVjX3V0aWxzLmMKK0NPTU1PTl9TT1VSQ0VTICs9IHF1YW50X2xldmVsc19kZWNfdXRpbHMuaAorQ09NTU9OX1NPVVJDRVMgKz0gcmVzY2FsZXJfdXRpbHMuYworQ09NTU9OX1NPVVJDRVMgKz0gcmVzY2FsZXJfdXRpbHMuaAorQ09NTU9OX1NPVVJDRVMgKz0gcmFuZG9tX3V0aWxzLmMKK0NPTU1PTl9TT1VSQ0VTICs9IHJhbmRvbV91dGlscy5oCitDT01NT05fU09VUkNFUyArPSB0aHJlYWRfdXRpbHMuYworQ09NTU9OX1NPVVJDRVMgKz0gdGhyZWFkX3V0aWxzLmgKK0NPTU1PTl9TT1VSQ0VTICs9IHV0aWxzLmMKK0NPTU1PTl9TT1VSQ0VTICs9IHV0aWxzLmgKKworRU5DX1NPVVJDRVMgPQorRU5DX1NPVVJDRVMgKz0gYml0X3dyaXRlcl91dGlscy5jCitFTkNfU09VUkNFUyArPSBiaXRfd3JpdGVyX3V0aWxzLmgKK0VOQ19TT1VSQ0VTICs9IGh1ZmZtYW5fZW5jb2RlX3V0aWxzLmMKK0VOQ19TT1VSQ0VTICs9IGh1ZmZtYW5fZW5jb2RlX3V0aWxzLmgKK0VOQ19TT1VSQ0VTICs9IHF1YW50X2xldmVsc191dGlscy5jCitFTkNfU09VUkNFUyArPSBxdWFudF9sZXZlbHNfdXRpbHMuaAorCitsaWJ3ZWJwdXRpbHNfbGFfU09VUkNFUyA9ICQoQ09NTU9OX1NPVVJDRVMpICQoRU5DX1NPVVJDRVMpCisKK2lmIEJVSUxEX0xJQldFQlBERUNPREVSCisgIGxpYndlYnB1dGlsc2RlY29kZV9sYV9TT1VSQ0VTID0gJChDT01NT05fU09VUkNFUykKK2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvYml0X3JlYWRlcl9pbmxfdXRpbHMuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9iaXRfcmVhZGVyX2lubF91dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNTBhM2MKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvYml0X3JlYWRlcl9pbmxfdXRpbHMuaApAQCAtMCwwICsxLDE5MiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFNwZWNpZmljIGlubGluZWQgbWV0aG9kcyBmb3IgYm9vbGVhbiBkZWNvZGVyIFtWUDhHZXRCaXQoKSAuLi5dCisvLyBUaGlzIGZpbGUgc2hvdWxkIGJlIGluY2x1ZGVkIGJ5IHRoZSAuYyBzb3VyY2VzIHRoYXQgYWN0dWFsbHkgbmVlZCB0byBjYWxsCisvLyB0aGVzZSBtZXRob2RzLgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpZm5kZWYgV0VCUF9VVElMU19CSVRfUkVBREVSX0lOTF9VVElMU19IXworI2RlZmluZSBXRUJQX1VUSUxTX0JJVF9SRUFERVJfSU5MX1VUSUxTX0hfCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAic3JjL3dlYnAvY29uZmlnLmgiCisjZW5kaWYKKworI2lmICFkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlIDxzdHJpbmcuaD4gIC8vIGZvciBtZW1jcHkKKyNlbmRpZgorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvYml0X3JlYWRlcl91dGlscy5oIgorI2luY2x1ZGUgInNyYy91dGlscy9lbmRpYW5faW5sX3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL3V0aWxzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERlcml2ZWQgdHlwZSBsYml0X3QgPSBuYXR1cmFsIHR5cGUgZm9yIG1lbW9yeSBJL08KKworI2lmICAgKEJJVFMgPiAzMikKK3R5cGVkZWYgdWludDY0X3QgbGJpdF90OworI2VsaWYgKEJJVFMgPiAxNikKK3R5cGVkZWYgdWludDMyX3QgbGJpdF90OworI2VsaWYgKEJJVFMgPiAgOCkKK3R5cGVkZWYgdWludDE2X3QgbGJpdF90OworI2Vsc2UKK3R5cGVkZWYgdWludDhfdCBsYml0X3Q7CisjZW5kaWYKKworZXh0ZXJuIGNvbnN0IHVpbnQ4X3Qga1ZQOExvZzJSYW5nZVsxMjhdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3Qga1ZQOE5ld1JhbmdlWzEyOF07CisKKy8vIHNwZWNpYWwgY2FzZSBmb3IgdGhlIHRhaWwgYnl0ZS1yZWFkaW5nCit2b2lkIFZQOExvYWRGaW5hbEJ5dGVzKFZQOEJpdFJlYWRlciogY29uc3QgYnIpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW5saW5lZCBjcml0aWNhbCBmdW5jdGlvbnMKKworLy8gbWFrZXMgc3VyZSBici0+dmFsdWVfIGhhcyBhdCBsZWFzdCBCSVRTIGJpdHMgd29ydGggb2YgZGF0YQorc3RhdGljIFdFQlBfVUJTQU5fSUdOT1JFX1VOREVGIFdFQlBfSU5MSU5FCit2b2lkIFZQOExvYWROZXdCeXRlcyhWUDhCaXRSZWFkZXIqIGNvbnN0IGJyKSB7CisgIFNCX0RDSEVDSyhiciAhPSBOVUxMICYmIGJyLT5idWZfICE9IE5VTEwpOworICAvLyBSZWFkICdCSVRTJyBiaXRzIGF0IGEgdGltZSBpZiBwb3NzaWJsZS4KKyAgaWYgKGJyLT5idWZfIDwgYnItPmJ1Zl9tYXhfKSB7CisgICAgLy8gY29udmVydCBtZW1vcnkgdHlwZSB0byByZWdpc3RlciB0eXBlICh3aXRoIHNvbWUgemVybydpbmchKQorICAgIGJpdF90IGJpdHM7CisjaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTMzIpCisgICAgLy8gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBvZiB1bi1hbGlnbmVkIHJlYWQuCisgICAgbGJpdF90IGluX2JpdHM7CisgICAgbGJpdF90KiBwX2J1Zl8gPSAobGJpdF90Kilici0+YnVmXzsKKyAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgIi5zZXQgICBwdXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgIi5zZXQgICBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgIi5zZXQgICBtYWNybyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgInVsdyAgICAlW2luX2JpdHNdLCAwKCVbcF9idWZfXSkgICAgICAgICBcblx0IgorICAgICAgIi5zZXQgICBwb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgOiBbaW5fYml0c10iPXIiKGluX2JpdHMpCisgICAgICA6IFtwX2J1Zl9dInIiKHBfYnVmXykKKyAgICAgIDogIm1lbW9yeSIsICJhdCIKKyAgICApOworI2Vsc2UKKyAgICBsYml0X3QgaW5fYml0czsKKyAgICBTYk1lbW9yeUNvcHkoJmluX2JpdHMsIGJyLT5idWZfLCBzaXplb2YoaW5fYml0cykpOworI2VuZGlmCisgICAgYnItPmJ1Zl8gKz0gQklUUyA+PiAzOworI2lmICFkZWZpbmVkKFdPUkRTX0JJR0VORElBTikKKyNpZiAoQklUUyA+IDMyKQorICAgIGJpdHMgPSBCU3dhcDY0KGluX2JpdHMpOworICAgIGJpdHMgPj49IDY0IC0gQklUUzsKKyNlbGlmIChCSVRTID49IDI0KQorICAgIGJpdHMgPSBCU3dhcDMyKGluX2JpdHMpOworICAgIGJpdHMgPj49ICgzMiAtIEJJVFMpOworI2VsaWYgKEJJVFMgPT0gMTYpCisgICAgYml0cyA9IEJTd2FwMTYoaW5fYml0cyk7CisjZWxzZSAgIC8vIEJJVFMgPT0gOAorICAgIGJpdHMgPSAoYml0X3QpaW5fYml0czsKKyNlbmRpZiAgLy8gQklUUyA+IDMyCisjZWxzZSAgICAvLyBXT1JEU19CSUdFTkRJQU4KKyAgICBiaXRzID0gKGJpdF90KWluX2JpdHM7CisgICAgaWYgKEJJVFMgIT0gOCAqIHNpemVvZihiaXRfdCkpIGJpdHMgPj49ICg4ICogc2l6ZW9mKGJpdF90KSAtIEJJVFMpOworI2VuZGlmCisgICAgYnItPnZhbHVlXyA9IGJpdHMgfCAoYnItPnZhbHVlXyA8PCBCSVRTKTsKKyAgICBici0+Yml0c18gKz0gQklUUzsKKyAgfSBlbHNlIHsKKyAgICBWUDhMb2FkRmluYWxCeXRlcyhicik7ICAgIC8vIG5vIG5lZWQgdG8gYmUgaW5saW5lZAorICB9Cit9CisKKy8vIFJlYWQgYSBiaXQgd2l0aCBwcm9iYSAncHJvYicuIFNwZWVkLWNyaXRpY2FsIGZ1bmN0aW9uIQorc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhHZXRCaXQoVlA4Qml0UmVhZGVyKiBjb25zdCBiciwgaW50IHByb2IpIHsKKyAgLy8gRG9uJ3QgbW92ZSB0aGlzIGRlY2xhcmF0aW9uISBJdCBtYWtlcyBhIGJpZyBzcGVlZCBkaWZmZXJlbmNlIHRvIHN0b3JlCisgIC8vICdyYW5nZScgKmJlZm9yZSogY2FsbGluZyBWUDhMb2FkTmV3Qnl0ZXMoKSwgZXZlbiBpZiB0aGlzIGZ1bmN0aW9uIGRvZXNuJ3QKKyAgLy8gYWx0ZXIgYnItPnJhbmdlXyB2YWx1ZS4KKyAgcmFuZ2VfdCByYW5nZSA9IGJyLT5yYW5nZV87CisgIGlmIChici0+Yml0c18gPCAwKSB7CisgICAgVlA4TG9hZE5ld0J5dGVzKGJyKTsKKyAgfQorICB7CisgICAgY29uc3QgaW50IHBvcyA9IGJyLT5iaXRzXzsKKyAgICBjb25zdCByYW5nZV90IHNwbGl0ID0gKHJhbmdlICogcHJvYikgPj4gODsKKyAgICBjb25zdCByYW5nZV90IHZhbHVlID0gKHJhbmdlX3QpKGJyLT52YWx1ZV8gPj4gcG9zKTsKKyAgICBjb25zdCBpbnQgYml0ID0gKHZhbHVlID4gc3BsaXQpOworICAgIGlmIChiaXQpIHsKKyAgICAgIHJhbmdlIC09IHNwbGl0OworICAgICAgYnItPnZhbHVlXyAtPSAoYml0X3QpKHNwbGl0ICsgMSkgPDwgcG9zOworICAgIH0gZWxzZSB7CisgICAgICByYW5nZSA9IHNwbGl0ICsgMTsKKyAgICB9CisgICAgeworICAgICAgY29uc3QgaW50IHNoaWZ0ID0gNyBeIEJpdHNMb2cyRmxvb3IocmFuZ2UpOworICAgICAgcmFuZ2UgPDw9IHNoaWZ0OworICAgICAgYnItPmJpdHNfIC09IHNoaWZ0OworICAgIH0KKyAgICBici0+cmFuZ2VfID0gcmFuZ2UgLSAxOworICAgIHJldHVybiBiaXQ7CisgIH0KK30KKworLy8gc2ltcGxpZmllZCB2ZXJzaW9uIG9mIFZQOEdldEJpdCgpIGZvciBwcm9iPTB4ODAgKG5vdGUgc2hpZnQgaXMgYWx3YXlzIDEgaGVyZSkKK3N0YXRpYyBXRUJQX1VCU0FOX0lHTk9SRV9VTlNJR05FRF9PVkVSRkxPVyBXRUJQX0lOTElORQoraW50IFZQOEdldFNpZ25lZChWUDhCaXRSZWFkZXIqIGNvbnN0IGJyLCBpbnQgdikgeworICBpZiAoYnItPmJpdHNfIDwgMCkgeworICAgIFZQOExvYWROZXdCeXRlcyhicik7CisgIH0KKyAgeworICAgIGNvbnN0IGludCBwb3MgPSBici0+Yml0c187CisgICAgY29uc3QgcmFuZ2VfdCBzcGxpdCA9IGJyLT5yYW5nZV8gPj4gMTsKKyAgICBjb25zdCByYW5nZV90IHZhbHVlID0gKHJhbmdlX3QpKGJyLT52YWx1ZV8gPj4gcG9zKTsKKyAgICBjb25zdCBpbnQzMl90IG1hc2sgPSAoaW50MzJfdCkoc3BsaXQgLSB2YWx1ZSkgPj4gMzE7ICAvLyAtMSBvciAwCisgICAgYnItPmJpdHNfIC09IDE7CisgICAgYnItPnJhbmdlXyArPSBtYXNrOworICAgIGJyLT5yYW5nZV8gfD0gMTsKKyAgICBici0+dmFsdWVfIC09IChiaXRfdCkoKHNwbGl0ICsgMSkgJiBtYXNrKSA8PCBwb3M7CisgICAgcmV0dXJuICh2IF4gbWFzaykgLSBtYXNrOworICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4R2V0Qml0QWx0KFZQOEJpdFJlYWRlciogY29uc3QgYnIsIGludCBwcm9iKSB7CisgIC8vIERvbid0IG1vdmUgdGhpcyBkZWNsYXJhdGlvbiEgSXQgbWFrZXMgYSBiaWcgc3BlZWQgZGlmZmVyZW5jZSB0byBzdG9yZQorICAvLyAncmFuZ2UnICpiZWZvcmUqIGNhbGxpbmcgVlA4TG9hZE5ld0J5dGVzKCksIGV2ZW4gaWYgdGhpcyBmdW5jdGlvbiBkb2Vzbid0CisgIC8vIGFsdGVyIGJyLT5yYW5nZV8gdmFsdWUuCisgIHJhbmdlX3QgcmFuZ2UgPSBici0+cmFuZ2VfOworICBpZiAoYnItPmJpdHNfIDwgMCkgeworICAgIFZQOExvYWROZXdCeXRlcyhicik7CisgIH0KKyAgeworICAgIGNvbnN0IGludCBwb3MgPSBici0+Yml0c187CisgICAgY29uc3QgcmFuZ2VfdCBzcGxpdCA9IChyYW5nZSAqIHByb2IpID4+IDg7CisgICAgY29uc3QgcmFuZ2VfdCB2YWx1ZSA9IChyYW5nZV90KShici0+dmFsdWVfID4+IHBvcyk7CisgICAgaW50IGJpdDsgIC8vIERvbid0IHVzZSAnY29uc3QgaW50IGJpdCA9ICh2YWx1ZSA+IHNwbGl0KTsiLCBpdCdzIHNsb3dlci4KKyAgICBpZiAodmFsdWUgPiBzcGxpdCkgeworICAgICAgcmFuZ2UgLT0gc3BsaXQgKyAxOworICAgICAgYnItPnZhbHVlXyAtPSAoYml0X3QpKHNwbGl0ICsgMSkgPDwgcG9zOworICAgICAgYml0ID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgcmFuZ2UgPSBzcGxpdDsKKyAgICAgIGJpdCA9IDA7CisgICAgfQorICAgIGlmIChyYW5nZSA8PSAocmFuZ2VfdCkweDdlKSB7CisgICAgICBjb25zdCBpbnQgc2hpZnQgPSBrVlA4TG9nMlJhbmdlW3JhbmdlXTsKKyAgICAgIHJhbmdlID0ga1ZQOE5ld1JhbmdlW3JhbmdlXTsKKyAgICAgIGJyLT5iaXRzXyAtPSBzaGlmdDsKKyAgICB9CisgICAgYnItPnJhbmdlXyA9IHJhbmdlOworICAgIHJldHVybiBiaXQ7CisgIH0KK30KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgICAvLyBXRUJQX1VUSUxTX0JJVF9SRUFERVJfSU5MX1VUSUxTX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvYml0X3JlYWRlcl91dGlscy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL2JpdF9yZWFkZXJfdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2JiZThlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL2JpdF9yZWFkZXJfdXRpbHMuYwpAQCAtMCwwICsxLDIyNiBAQAorLy8gQ29weXJpZ2h0IDIwMTAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEJvb2xlYW4gZGVjb2RlciBub24taW5saW5lZCBtZXRob2RzCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJzcmMvd2VicC9jb25maWcuaCIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vYXNzZXJ0X3BvZW0uaCIKKyNlbmRpZgorCisjaW5jbHVkZSAic3JjL3V0aWxzL2JpdF9yZWFkZXJfaW5sX3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL3V0aWxzLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWUDhCaXRSZWFkZXIKKwordm9pZCBWUDhCaXRSZWFkZXJTZXRCdWZmZXIoVlA4Qml0UmVhZGVyKiBjb25zdCBiciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUpIHsKKyAgYnItPmJ1Zl8gICAgID0gc3RhcnQ7CisgIGJyLT5idWZfZW5kXyA9IHN0YXJ0ICsgc2l6ZTsKKyAgYnItPmJ1Zl9tYXhfID0KKyAgICAgIChzaXplID49IHNpemVvZihsYml0X3QpKSA/IHN0YXJ0ICsgc2l6ZSAtIHNpemVvZihsYml0X3QpICsgMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc3RhcnQ7Cit9CisKK3ZvaWQgVlA4SW5pdEJpdFJlYWRlcihWUDhCaXRSZWFkZXIqIGNvbnN0IGJyLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHN0YXJ0LCBzaXplX3Qgc2l6ZSkgeworICBhc3NlcnQoYnIgIT0gTlVMTCk7CisgIGFzc2VydChzdGFydCAhPSBOVUxMKTsKKyAgYXNzZXJ0KHNpemUgPCAoMXUgPDwgMzEpKTsgICAvLyBsaW1pdCBlbnN1cmVkIGJ5IGZvcm1hdCBhbmQgdXBzdHJlYW0gY2hlY2tzCisgIGJyLT5yYW5nZV8gICA9IDI1NSAtIDE7CisgIGJyLT52YWx1ZV8gICA9IDA7CisgIGJyLT5iaXRzXyAgICA9IC04OyAgIC8vIHRvIGxvYWQgdGhlIHZlcnkgZmlyc3QgOGJpdHMKKyAgYnItPmVvZl8gICAgID0gMDsKKyAgVlA4Qml0UmVhZGVyU2V0QnVmZmVyKGJyLCBzdGFydCwgc2l6ZSk7CisgIFZQOExvYWROZXdCeXRlcyhicik7Cit9CisKK3ZvaWQgVlA4UmVtYXBCaXRSZWFkZXIoVlA4Qml0UmVhZGVyKiBjb25zdCBiciwgcHRyZGlmZl90IG9mZnNldCkgeworICBpZiAoYnItPmJ1Zl8gIT0gTlVMTCkgeworICAgIGJyLT5idWZfICs9IG9mZnNldDsKKyAgICBici0+YnVmX2VuZF8gKz0gb2Zmc2V0OworICAgIGJyLT5idWZfbWF4XyArPSBvZmZzZXQ7CisgIH0KK30KKworY29uc3QgdWludDhfdCBrVlA4TG9nMlJhbmdlWzEyOF0gPSB7CisgICAgIDcsIDYsIDYsIDUsIDUsIDUsIDUsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsCisgIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCisgIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCisgIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCisgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisgIDAKK307CisKKy8vIHJhbmdlID0gKChyYW5nZSAtIDEpIDw8IGtWUDhMb2cyUmFuZ2VbcmFuZ2VdKSArIDEKK2NvbnN0IHVpbnQ4X3Qga1ZQOE5ld1JhbmdlWzEyOF0gPSB7CisgIDEyNywgMTI3LCAxOTEsIDEyNywgMTU5LCAxOTEsIDIyMywgMTI3LAorICAxNDMsIDE1OSwgMTc1LCAxOTEsIDIwNywgMjIzLCAyMzksIDEyNywKKyAgMTM1LCAxNDMsIDE1MSwgMTU5LCAxNjcsIDE3NSwgMTgzLCAxOTEsCisgIDE5OSwgMjA3LCAyMTUsIDIyMywgMjMxLCAyMzksIDI0NywgMTI3LAorICAxMzEsIDEzNSwgMTM5LCAxNDMsIDE0NywgMTUxLCAxNTUsIDE1OSwKKyAgMTYzLCAxNjcsIDE3MSwgMTc1LCAxNzksIDE4MywgMTg3LCAxOTEsCisgIDE5NSwgMTk5LCAyMDMsIDIwNywgMjExLCAyMTUsIDIxOSwgMjIzLAorICAyMjcsIDIzMSwgMjM1LCAyMzksIDI0MywgMjQ3LCAyNTEsIDEyNywKKyAgMTI5LCAxMzEsIDEzMywgMTM1LCAxMzcsIDEzOSwgMTQxLCAxNDMsCisgIDE0NSwgMTQ3LCAxNDksIDE1MSwgMTUzLCAxNTUsIDE1NywgMTU5LAorICAxNjEsIDE2MywgMTY1LCAxNjcsIDE2OSwgMTcxLCAxNzMsIDE3NSwKKyAgMTc3LCAxNzksIDE4MSwgMTgzLCAxODUsIDE4NywgMTg5LCAxOTEsCisgIDE5MywgMTk1LCAxOTcsIDE5OSwgMjAxLCAyMDMsIDIwNSwgMjA3LAorICAyMDksIDIxMSwgMjEzLCAyMTUsIDIxNywgMjE5LCAyMjEsIDIyMywKKyAgMjI1LCAyMjcsIDIyOSwgMjMxLCAyMzMsIDIzNSwgMjM3LCAyMzksCisgIDI0MSwgMjQzLCAyNDUsIDI0NywgMjQ5LCAyNTEsIDI1MywgMTI3Cit9OworCit2b2lkIFZQOExvYWRGaW5hbEJ5dGVzKFZQOEJpdFJlYWRlciogY29uc3QgYnIpIHsKKyAgYXNzZXJ0KGJyICE9IE5VTEwgJiYgYnItPmJ1Zl8gIT0gTlVMTCk7CisgIC8vIE9ubHkgcmVhZCA4Yml0cyBhdCBhIHRpbWUKKyAgaWYgKGJyLT5idWZfIDwgYnItPmJ1Zl9lbmRfKSB7CisgICAgYnItPmJpdHNfICs9IDg7CisgICAgYnItPnZhbHVlXyA9IChiaXRfdCkoKmJyLT5idWZfKyspIHwgKGJyLT52YWx1ZV8gPDwgOCk7CisgIH0gZWxzZSBpZiAoIWJyLT5lb2ZfKSB7CisgICAgYnItPnZhbHVlXyA8PD0gODsKKyAgICBici0+Yml0c18gKz0gODsKKyAgICBici0+ZW9mXyA9IDE7CisgIH0gZWxzZSB7CisgICAgYnItPmJpdHNfID0gMDsgIC8vIFRoaXMgaXMgdG8gYXZvaWQgdW5kZWZpbmVkIGJlaGF2aW91ciB3aXRoIHNoaWZ0cy4KKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGlnaGVyLWxldmVsIGNhbGxzCisKK3VpbnQzMl90IFZQOEdldFZhbHVlKFZQOEJpdFJlYWRlciogY29uc3QgYnIsIGludCBiaXRzKSB7CisgIHVpbnQzMl90IHYgPSAwOworICB3aGlsZSAoYml0cy0tID4gMCkgeworICAgIHYgfD0gVlA4R2V0Qml0KGJyLCAweDgwKSA8PCBiaXRzOworICB9CisgIHJldHVybiB2OworfQorCitpbnQzMl90IFZQOEdldFNpZ25lZFZhbHVlKFZQOEJpdFJlYWRlciogY29uc3QgYnIsIGludCBiaXRzKSB7CisgIGNvbnN0IGludCB2YWx1ZSA9IFZQOEdldFZhbHVlKGJyLCBiaXRzKTsKKyAgcmV0dXJuIFZQOEdldChicikgPyAtdmFsdWUgOiB2YWx1ZTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZQOExCaXRSZWFkZXIKKworI2RlZmluZSBWUDhMX0xPRzhfV0JJVFMgNCAgLy8gTnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCB0byBzdG9yZSBWUDhMX1dCSVRTIGJpdHMuCisKKyNpZiBkZWZpbmVkKF9fYXJtX18pIHx8IGRlZmluZWQoX01fQVJNKSB8fCBkZWZpbmVkKF9fYWFyY2g2NF9fKSB8fCBcCisgICAgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfTV9JWDg2KSB8fCBcCisgICAgZGVmaW5lZChfX3g4Nl82NF9fKSB8fCBkZWZpbmVkKF9NX1g2NCkKKyNkZWZpbmUgVlA4TF9VU0VfRkFTVF9MT0FECisjZW5kaWYKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IGtCaXRNYXNrW1ZQOExfTUFYX05VTV9CSVRfUkVBRCArIDFdID0geworICAwLAorICAweDAwMDAwMSwgMHgwMDAwMDMsIDB4MDAwMDA3LCAweDAwMDAwZiwKKyAgMHgwMDAwMWYsIDB4MDAwMDNmLCAweDAwMDA3ZiwgMHgwMDAwZmYsCisgIDB4MDAwMWZmLCAweDAwMDNmZiwgMHgwMDA3ZmYsIDB4MDAwZmZmLAorICAweDAwMWZmZiwgMHgwMDNmZmYsIDB4MDA3ZmZmLCAweDAwZmZmZiwKKyAgMHgwMWZmZmYsIDB4MDNmZmZmLCAweDA3ZmZmZiwgMHgwZmZmZmYsCisgIDB4MWZmZmZmLCAweDNmZmZmZiwgMHg3ZmZmZmYsIDB4ZmZmZmZmCit9OworCit2b2lkIFZQOExJbml0Qml0UmVhZGVyKFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyLCBjb25zdCB1aW50OF90KiBjb25zdCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCkgeworICBzaXplX3QgaTsKKyAgdnA4bF92YWxfdCB2YWx1ZSA9IDA7CisgIGFzc2VydChiciAhPSBOVUxMKTsKKyAgYXNzZXJ0KHN0YXJ0ICE9IE5VTEwpOworICBhc3NlcnQobGVuZ3RoIDwgMHhmZmZmZmZmOHUpOyAgIC8vIGNhbid0IGhhcHBlbiB3aXRoIGEgUklGRiBjaHVuay4KKworICBici0+bGVuXyA9IGxlbmd0aDsKKyAgYnItPnZhbF8gPSAwOworICBici0+Yml0X3Bvc18gPSAwOworICBici0+ZW9zXyA9IDA7CisKKyAgaWYgKGxlbmd0aCA+IHNpemVvZihici0+dmFsXykpIHsKKyAgICBsZW5ndGggPSBzaXplb2YoYnItPnZhbF8pOworICB9CisgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgeworICAgIHZhbHVlIHw9ICh2cDhsX3ZhbF90KXN0YXJ0W2ldIDw8ICg4ICogaSk7CisgIH0KKyAgYnItPnZhbF8gPSB2YWx1ZTsKKyAgYnItPnBvc18gPSBsZW5ndGg7CisgIGJyLT5idWZfID0gc3RhcnQ7Cit9CisKK3ZvaWQgVlA4TEJpdFJlYWRlclNldEJ1ZmZlcihWUDhMQml0UmVhZGVyKiBjb25zdCBiciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBidWYsIHNpemVfdCBsZW4pIHsKKyAgYXNzZXJ0KGJyICE9IE5VTEwpOworICBhc3NlcnQoYnVmICE9IE5VTEwpOworICBhc3NlcnQobGVuIDwgMHhmZmZmZmZmOHUpOyAgIC8vIGNhbid0IGhhcHBlbiB3aXRoIGEgUklGRiBjaHVuay4KKyAgYnItPmJ1Zl8gPSBidWY7CisgIGJyLT5sZW5fID0gbGVuOworICAvLyBwb3NfID4gbGVuXyBzaG91bGQgYmUgY29uc2lkZXJlZCBhIHBhcmFtIGVycm9yLgorICBici0+ZW9zXyA9IChici0+cG9zXyA+IGJyLT5sZW5fKSB8fCBWUDhMSXNFbmRPZlN0cmVhbShicik7Cit9CisKK3N0YXRpYyB2b2lkIFZQOExTZXRFbmRPZlN0cmVhbShWUDhMQml0UmVhZGVyKiBjb25zdCBicikgeworICBici0+ZW9zXyA9IDE7CisgIGJyLT5iaXRfcG9zXyA9IDA7ICAvLyBUbyBhdm9pZCB1bmRlZmluZWQgYmVoYXZpb3VyIHdpdGggc2hpZnRzLgorfQorCisvLyBJZiBub3QgYXQgRU9TLCByZWxvYWQgdXAgdG8gVlA4TF9MQklUUyBieXRlLWJ5LWJ5dGUKK3N0YXRpYyB2b2lkIFNoaWZ0Qnl0ZXMoVlA4TEJpdFJlYWRlciogY29uc3QgYnIpIHsKKyAgd2hpbGUgKGJyLT5iaXRfcG9zXyA+PSA4ICYmIGJyLT5wb3NfIDwgYnItPmxlbl8pIHsKKyAgICBici0+dmFsXyA+Pj0gODsKKyAgICBici0+dmFsXyB8PSAoKHZwOGxfdmFsX3QpYnItPmJ1Zl9bYnItPnBvc19dKSA8PCAoVlA4TF9MQklUUyAtIDgpOworICAgICsrYnItPnBvc187CisgICAgYnItPmJpdF9wb3NfIC09IDg7CisgIH0KKyAgaWYgKFZQOExJc0VuZE9mU3RyZWFtKGJyKSkgeworICAgIFZQOExTZXRFbmRPZlN0cmVhbShicik7CisgIH0KK30KKwordm9pZCBWUDhMRG9GaWxsQml0V2luZG93KFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyKSB7CisgIGFzc2VydChici0+Yml0X3Bvc18gPj0gVlA4TF9XQklUUyk7CisjaWYgZGVmaW5lZChWUDhMX1VTRV9GQVNUX0xPQUQpCisgIGlmIChici0+cG9zXyArIHNpemVvZihici0+dmFsXykgPCBici0+bGVuXykgeworICAgIGJyLT52YWxfID4+PSBWUDhMX1dCSVRTOworICAgIGJyLT5iaXRfcG9zXyAtPSBWUDhMX1dCSVRTOworICAgIGJyLT52YWxfIHw9ICh2cDhsX3ZhbF90KUhUb0xFMzIoV2ViUE1lbVRvVWludDMyKGJyLT5idWZfICsgYnItPnBvc18pKSA8PAorICAgICAgICAgICAgICAgIChWUDhMX0xCSVRTIC0gVlA4TF9XQklUUyk7CisgICAgYnItPnBvc18gKz0gVlA4TF9MT0c4X1dCSVRTOworICAgIHJldHVybjsKKyAgfQorI2VuZGlmCisgIFNoaWZ0Qnl0ZXMoYnIpOyAgICAgICAvLyBTbG93IHBhdGguCit9CisKK3VpbnQzMl90IFZQOExSZWFkQml0cyhWUDhMQml0UmVhZGVyKiBjb25zdCBiciwgaW50IG5fYml0cykgeworICBhc3NlcnQobl9iaXRzID49IDApOworICAvLyBGbGFnIGFuIGVycm9yIGlmIGVuZF9vZl9zdHJlYW0gb3Igbl9iaXRzIGlzIG1vcmUgdGhhbiBhbGxvd2VkIGxpbWl0LgorICBpZiAoIWJyLT5lb3NfICYmIG5fYml0cyA8PSBWUDhMX01BWF9OVU1fQklUX1JFQUQpIHsKKyAgICBjb25zdCB1aW50MzJfdCB2YWwgPSBWUDhMUHJlZmV0Y2hCaXRzKGJyKSAmIGtCaXRNYXNrW25fYml0c107CisgICAgY29uc3QgaW50IG5ld19iaXRzID0gYnItPmJpdF9wb3NfICsgbl9iaXRzOworICAgIGJyLT5iaXRfcG9zXyA9IG5ld19iaXRzOworICAgIFNoaWZ0Qnl0ZXMoYnIpOworICAgIHJldHVybiB2YWw7CisgIH0gZWxzZSB7CisgICAgVlA4TFNldEVuZE9mU3RyZWFtKGJyKTsKKyAgICByZXR1cm4gMDsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL2JpdF9yZWFkZXJfdXRpbHMuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9iaXRfcmVhZGVyX3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRlNGZlNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9iaXRfcmVhZGVyX3V0aWxzLmgKQEAgLTAsMCArMSwxODAgQEAKKy8vIENvcHlyaWdodCAyMDEwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBCb29sZWFuIGRlY29kZXIKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorLy8gICAgICAgICBWaWthcyBBcm9yYSAodmlrYWFzLmFyb3JhQGdtYWlsLmNvbSkKKworI2lmbmRlZiBXRUJQX1VUSUxTX0JJVF9SRUFERVJfVVRJTFNfSF8KKyNkZWZpbmUgV0VCUF9VVElMU19CSVRfUkVBREVSX1VUSUxTX0hfCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCisjZWxzZQorI2luY2x1ZGUgPGFzc2VydC5oPgorI2lmZGVmIF9NU0NfVkVSCisjaW5jbHVkZSA8c3RkbGliLmg+ICAvLyBfYnl0ZXN3YXBfdWxvbmcKKyNlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvd2VicC90eXBlcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8vIFRoZSBCb29sZWFuIGRlY29kZXIgbmVlZHMgdG8gbWFpbnRhaW4gaW5maW5pdGUgcHJlY2lzaW9uIG9uIHRoZSB2YWx1ZV8gZmllbGQuCisvLyBIb3dldmVyLCBzaW5jZSByYW5nZV8gaXMgb25seSA4Yml0LCB3ZSBvbmx5IG5lZWQgYW4gYWN0aXZlIHdpbmRvdyBvZiA4IGJpdHMKKy8vIGZvciB2YWx1ZV8uIExlZnQgYml0cyAoTVNCKSBnZXRzIHplcm9lZCBhbmQgc2hpZnRlZCBhd2F5IHdoZW4gdmFsdWVfIGZhbGxzCisvLyBiZWxvdyAxMjgsIHJhbmdlXyBpcyB1cGRhdGVkLCBhbmQgZnJlc2ggYml0cyByZWFkIGZyb20gdGhlIGJpdHN0cmVhbSBhcmUKKy8vIGJyb3VnaHQgaW4gYXMgTFNCLiBUbyBhdm9pZCByZWFkaW5nIHRoZSBmcmVzaCBiaXRzIG9uZSBieSBvbmUgKHNsb3cpLCB3ZQorLy8gY2FjaGUgQklUUyBvZiB0aGVtIGFoZWFkLiBUaGUgdG90YWwgb2YgKEJJVFMgKyA4KSBiaXRzIG11c3QgZml0IGludG8gYQorLy8gbmF0dXJhbCByZWdpc3RlciAod2l0aCB0eXBlIGJpdF90KS4gVG8gZmV0Y2ggQklUUyBiaXRzIGZyb20gYml0c3RyZWFtIHdlCisvLyB1c2UgYSB0eXBlIGxiaXRfdC4KKy8vCisvLyBCSVRTIGNhbiBiZSBhbnkgbXVsdGlwbGUgb2YgOCBmcm9tIDggdG8gNTYgKGluY2x1c2l2ZSkuCisvLyBQaWNrIHZhbHVlcyB0aGF0IGZpdCBuYXR1cmFsIHJlZ2lzdGVyIHNpemUuCisKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9NX0lYODYpICAgICAgLy8geDg2IDMyYml0CisjZGVmaW5lIEJJVFMgMjQKKyNlbGlmIGRlZmluZWQoX194ODZfNjRfXykgfHwgZGVmaW5lZChfTV9YNjQpICAgLy8geDg2IDY0Yml0CisjZGVmaW5lIEJJVFMgNTYKKyNlbGlmIGRlZmluZWQoX19hcm1fXykgfHwgZGVmaW5lZChfTV9BUk0pICAgICAgLy8gQVJNCisjZGVmaW5lIEJJVFMgMjQKKyNlbGlmIGRlZmluZWQoX19hYXJjaDY0X18pICAgICAgICAgICAgICAgICAgICAgLy8gQVJNIDY0Yml0CisjZGVmaW5lIEJJVFMgNTYKKyNlbGlmIGRlZmluZWQoX19taXBzX18pICAgICAgICAgICAgICAgICAgICAgICAgLy8gTUlQUworI2RlZmluZSBCSVRTIDI0CisjZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlYXNvbmFibGUgZGVmYXVsdAorI2RlZmluZSBCSVRTIDI0CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERlcml2ZWQgdHlwZXMgYW5kIGNvbnN0YW50czoKKy8vICAgYml0X3QgPSBuYXR1cmFsIHJlZ2lzdGVyIHR5cGUgZm9yIHN0b3JpbmcgJ3ZhbHVlXycgKHdoaWNoIGlzIEJJVFMrOCBiaXRzKQorLy8gICByYW5nZV90ID0gcmVnaXN0ZXIgZm9yICdyYW5nZV8nICh3aGljaCBpcyA4Yml0cyBvbmx5KQorCisjaWYgKEJJVFMgPiAyNCkKK3R5cGVkZWYgdWludDY0X3QgYml0X3Q7CisjZWxzZQordHlwZWRlZiB1aW50MzJfdCBiaXRfdDsKKyNlbmRpZgorCit0eXBlZGVmIHVpbnQzMl90IHJhbmdlX3Q7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBCaXRyZWFkZXIKKwordHlwZWRlZiBzdHJ1Y3QgVlA4Qml0UmVhZGVyIFZQOEJpdFJlYWRlcjsKK3N0cnVjdCBWUDhCaXRSZWFkZXIgeworICAvLyBib29sZWFuIGRlY29kZXIgIChrZWVwIHRoZSBmaWVsZCBvcmRlcmluZyBhcyBpcyEpCisgIGJpdF90IHZhbHVlXzsgICAgICAgICAgICAgICAvLyBjdXJyZW50IHZhbHVlCisgIHJhbmdlX3QgcmFuZ2VfOyAgICAgICAgICAgICAvLyBjdXJyZW50IHJhbmdlIG1pbnVzIDEuIEluIFsxMjcsIDI1NF0gaW50ZXJ2YWwuCisgIGludCBiaXRzXzsgICAgICAgICAgICAgICAgICAvLyBudW1iZXIgb2YgdmFsaWQgYml0cyBsZWZ0CisgIC8vIHJlYWQgYnVmZmVyCisgIGNvbnN0IHVpbnQ4X3QqIGJ1Zl87ICAgICAgICAvLyBuZXh0IGJ5dGUgdG8gYmUgcmVhZAorICBjb25zdCB1aW50OF90KiBidWZfZW5kXzsgICAgLy8gZW5kIG9mIHJlYWQgYnVmZmVyCisgIGNvbnN0IHVpbnQ4X3QqIGJ1Zl9tYXhfOyAgICAvLyBtYXggcGFja2VkLXJlYWQgcG9zaXRpb24gb24gYnVmZmVyCisgIGludCBlb2ZfOyAgICAgICAgICAgICAgICAgICAvLyB0cnVlIGlmIGlucHV0IGlzIGV4aGF1c3RlZAorfTsKKworLy8gSW5pdGlhbGl6ZSB0aGUgYml0IHJlYWRlciBhbmQgdGhlIGJvb2xlYW4gZGVjb2Rlci4KK3ZvaWQgVlA4SW5pdEJpdFJlYWRlcihWUDhCaXRSZWFkZXIqIGNvbnN0IGJyLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHN0YXJ0LCBzaXplX3Qgc2l6ZSk7CisvLyBTZXRzIHRoZSB3b3JraW5nIHJlYWQgYnVmZmVyLgordm9pZCBWUDhCaXRSZWFkZXJTZXRCdWZmZXIoVlA4Qml0UmVhZGVyKiBjb25zdCBiciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHN0YXJ0LCBzaXplX3Qgc2l6ZSk7CisKKy8vIFVwZGF0ZSBpbnRlcm5hbCBwb2ludGVycyB0byBkaXNwbGFjZSB0aGUgYnl0ZSBidWZmZXIgYnkgdGhlCisvLyByZWxhdGl2ZSBvZmZzZXQgJ29mZnNldCcuCit2b2lkIFZQOFJlbWFwQml0UmVhZGVyKFZQOEJpdFJlYWRlciogY29uc3QgYnIsIHB0cmRpZmZfdCBvZmZzZXQpOworCisvLyByZXR1cm4gdGhlIG5leHQgdmFsdWUgbWFkZSBvZiAnbnVtX2JpdHMnIGJpdHMKK3VpbnQzMl90IFZQOEdldFZhbHVlKFZQOEJpdFJlYWRlciogY29uc3QgYnIsIGludCBudW1fYml0cyk7CitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgVlA4R2V0KFZQOEJpdFJlYWRlciogY29uc3QgYnIpIHsKKyAgcmV0dXJuIFZQOEdldFZhbHVlKGJyLCAxKTsKK30KKworLy8gcmV0dXJuIHRoZSBuZXh0IHZhbHVlIHdpdGggc2lnbi1leHRlbnNpb24uCitpbnQzMl90IFZQOEdldFNpZ25lZFZhbHVlKFZQOEJpdFJlYWRlciogY29uc3QgYnIsIGludCBudW1fYml0cyk7CisKKy8vIGJpdF9yZWFkZXJfaW5sLmggd2lsbCBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyBtZXRob2RzOgorLy8gICBzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOEdldEJpdChWUDhCaXRSZWFkZXIqIGNvbnN0IGJyLCBpbnQgcHJvYikKKy8vICAgc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhHZXRTaWduZWQoVlA4Qml0UmVhZGVyKiBjb25zdCBiciwgaW50IHYpCisvLyBhbmQgc2hvdWxkIGJlIGluY2x1ZGVkIGJ5IHRoZSAuYyBmaWxlcyB0aGF0IGFjdHVhbGx5IG5lZWQgdGhlbS4KKy8vIFRoaXMgaXMgdG8gYXZvaWQgcmVjb21waWxpbmcgdGhlIHdob2xlIGxpYnJhcnkgd2hlbmV2ZXIgdGhpcyBmaWxlIGlzIHRvdWNoZWQsCisvLyBhbmQgYWxzbyBhbGxvd2luZyBwbGF0Zm9ybS1zcGVjaWZpYyBhZC1ob2MgaGFja3MuCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBCaXRyZWFkZXIgZm9yIGxvc3NsZXNzIGZvcm1hdAorCisvLyBtYXhpbXVtIG51bWJlciBvZiBiaXRzIChpbmNsdXNpdmUpIHRoZSBiaXQtcmVhZGVyIGNhbiBoYW5kbGU6CisjZGVmaW5lIFZQOExfTUFYX05VTV9CSVRfUkVBRCAyNAorCisjZGVmaW5lIFZQOExfTEJJVFMgNjQgIC8vIE51bWJlciBvZiBiaXRzIHByZWZldGNoZWQgKD0gYml0LXNpemUgb2YgdnA4bF92YWxfdCkuCisjZGVmaW5lIFZQOExfV0JJVFMgMzIgIC8vIE1pbmltdW0gbnVtYmVyIG9mIGJ5dGVzIHJlYWR5IGFmdGVyIFZQOExGaWxsQml0V2luZG93LgorCit0eXBlZGVmIHVpbnQ2NF90IHZwOGxfdmFsX3Q7ICAvLyByaWdodCBub3csIHRoaXMgYml0LXJlYWRlciBjYW4gb25seSB1c2UgNjRiaXQuCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdnA4bF92YWxfdCAgICAgdmFsXzsgICAgICAgIC8vIHByZS1mZXRjaGVkIGJpdHMKKyAgY29uc3QgdWludDhfdCogYnVmXzsgICAgICAgIC8vIGlucHV0IGJ5dGUgYnVmZmVyCisgIHNpemVfdCAgICAgICAgIGxlbl87ICAgICAgICAvLyBidWZmZXIgbGVuZ3RoCisgIHNpemVfdCAgICAgICAgIHBvc187ICAgICAgICAvLyBieXRlIHBvc2l0aW9uIGluIGJ1Zl8KKyAgaW50ICAgICAgICAgICAgYml0X3Bvc187ICAgIC8vIGN1cnJlbnQgYml0LXJlYWRpbmcgcG9zaXRpb24gaW4gdmFsXworICBpbnQgICAgICAgICAgICBlb3NfOyAgICAgICAgLy8gdHJ1ZSBpZiBhIGJpdCB3YXMgcmVhZCBwYXN0IHRoZSBlbmQgb2YgYnVmZmVyCit9IFZQOExCaXRSZWFkZXI7CisKK3ZvaWQgVlA4TEluaXRCaXRSZWFkZXIoVlA4TEJpdFJlYWRlciogY29uc3QgYnIsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoKTsKKworLy8gIFNldHMgYSBuZXcgZGF0YSBidWZmZXIuCit2b2lkIFZQOExCaXRSZWFkZXJTZXRCdWZmZXIoVlA4TEJpdFJlYWRlciogY29uc3QgYnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgYnVmZmVyLCBzaXplX3QgbGVuZ3RoKTsKKworLy8gUmVhZHMgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYml0cyBmcm9tIHJlYWQgYnVmZmVyLgorLy8gRmxhZ3MgYW4gZXJyb3IgaW4gY2FzZSBlbmRfb2Zfc3RyZWFtIG9yIG5fYml0cyBpcyBtb3JlIHRoYW4gdGhlIGFsbG93ZWQgbGltaXQKKy8vIG9mIFZQOExfTUFYX05VTV9CSVRfUkVBRCAoaW5jbHVzaXZlKS4KKy8vIEZsYWdzIGVvc18gaWYgdGhpcyByZWFkIGF0dGVtcHQgaXMgZ29pbmcgdG8gY3Jvc3MgdGhlIHJlYWQgYnVmZmVyLgordWludDMyX3QgVlA4TFJlYWRCaXRzKFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyLCBpbnQgbl9iaXRzKTsKKworLy8gUmV0dXJuIHRoZSBwcmVmZXRjaGVkIGJpdHMsIHNvIHRoZXkgY2FuIGJlIGxvb2tlZCB1cC4KK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBWUDhMUHJlZmV0Y2hCaXRzKFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyKSB7CisgIHJldHVybiAodWludDMyX3QpKGJyLT52YWxfID4+IChici0+Yml0X3Bvc18gJiAoVlA4TF9MQklUUyAtIDEpKSk7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSB3YXMgYW4gYXR0ZW1wdCBhdCByZWFkaW5nIGJpdCBwYXN0IHRoZSBlbmQgb2YKKy8vIHRoZSBidWZmZXIuIERvZXNuJ3Qgc2V0IGJyLT5lb3NfIGZsYWcuCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOExJc0VuZE9mU3RyZWFtKGNvbnN0IFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyKSB7CisgIFNCX0RDSEVDSyhici0+cG9zXyA8PSBici0+bGVuXyk7CisgIHJldHVybiBici0+ZW9zXyB8fCAoKGJyLT5wb3NfID09IGJyLT5sZW5fKSAmJiAoYnItPmJpdF9wb3NfID4gVlA4TF9MQklUUykpOworfQorCisvLyBGb3IganVtcGluZyBvdmVyIGEgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGJpdCBzdHJlYW0gd2hlbiBhY2Nlc3NlZCB3aXRoCisvLyBWUDhMUHJlZmV0Y2hCaXRzIGFuZCBWUDhMRmlsbEJpdFdpbmRvdy4KKy8vIFRoaXMgZnVuY3Rpb24gZG9lcyAqbm90KiBzZXQgYnItPmVvc18sIHNpbmNlIGl0J3Mgc3BlZWQtY3JpdGljYWwuCisvLyBVc2Ugd2l0aCBleHRyZW1lIGNhcmUhCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWUDhMU2V0Qml0UG9zKFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyLCBpbnQgdmFsKSB7CisgIGJyLT5iaXRfcG9zXyA9IHZhbDsKK30KKworLy8gQWR2YW5jZXMgdGhlIHJlYWQgYnVmZmVyIGJ5IDQgYnl0ZXMgdG8gbWFrZSByb29tIGZvciByZWFkaW5nIG5leHQgMzIgYml0cy4KKy8vIFNwZWVkIGNyaXRpY2FsLCBidXQgaW5mcmVxdWVudCBwYXJ0IG9mIHRoZSBjb2RlIGNhbiBiZSBub24taW5saW5lZC4KK2V4dGVybiB2b2lkIFZQOExEb0ZpbGxCaXRXaW5kb3coVlA4TEJpdFJlYWRlciogY29uc3QgYnIpOworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVlA4TEZpbGxCaXRXaW5kb3coVlA4TEJpdFJlYWRlciogY29uc3QgYnIpIHsKKyAgaWYgKGJyLT5iaXRfcG9zXyA+PSBWUDhMX1dCSVRTKSBWUDhMRG9GaWxsQml0V2luZG93KGJyKTsKK30KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8qIFdFQlBfVVRJTFNfQklUX1JFQURFUl9VVElMU19IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL2JpdF93cml0ZXJfdXRpbHMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9iaXRfd3JpdGVyX3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdmODcxYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9iaXRfd3JpdGVyX3V0aWxzLmMKQEAgLTAsMCArMSwzNTIgQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBCaXQgd3JpdGluZyBhbmQgYm9vbGVhbiBjb2RlcgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisvLyAgICAgICAgIFZpa2FzIEFyb3JhICh2aWthYXMuYXJvcmFAZ21haWwuY29tKQorCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vYXNzZXJ0X3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdGRsaWJfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0cmluZ19wb2VtLmgiCisjZWxzZQorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPiAgIC8vIGZvciBtZW1jcHkoKQorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvdXRpbHMvYml0X3dyaXRlcl91dGlscy5oIgorI2luY2x1ZGUgInNyYy91dGlscy9lbmRpYW5faW5sX3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL3V0aWxzLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWUDhCaXRXcml0ZXIKKworc3RhdGljIGludCBCaXRXcml0ZXJSZXNpemUoVlA4Qml0V3JpdGVyKiBjb25zdCBidywgc2l6ZV90IGV4dHJhX3NpemUpIHsKKyAgdWludDhfdCogbmV3X2J1ZjsKKyAgc2l6ZV90IG5ld19zaXplOworICBjb25zdCB1aW50NjRfdCBuZWVkZWRfc2l6ZV82NGIgPSAodWludDY0X3QpYnctPnBvc18gKyBleHRyYV9zaXplOworICBjb25zdCBzaXplX3QgbmVlZGVkX3NpemUgPSAoc2l6ZV90KW5lZWRlZF9zaXplXzY0YjsKKyAgaWYgKG5lZWRlZF9zaXplXzY0YiAhPSBuZWVkZWRfc2l6ZSkgeworICAgIGJ3LT5lcnJvcl8gPSAxOworICAgIHJldHVybiAwOworICB9CisgIGlmIChuZWVkZWRfc2l6ZSA8PSBidy0+bWF4X3Bvc18pIHJldHVybiAxOworICAvLyBJZiB0aGUgZm9sbG93aW5nIGxpbmUgd3JhcHMgb3ZlciAzMmJpdCwgdGhlIHRlc3QganVzdCBhZnRlciB3aWxsIGNhdGNoIGl0LgorICBuZXdfc2l6ZSA9IDIgKiBidy0+bWF4X3Bvc187CisgIGlmIChuZXdfc2l6ZSA8IG5lZWRlZF9zaXplKSBuZXdfc2l6ZSA9IG5lZWRlZF9zaXplOworICBpZiAobmV3X3NpemUgPCAxMDI0KSBuZXdfc2l6ZSA9IDEwMjQ7CisgIG5ld19idWYgPSAodWludDhfdCopV2ViUFNhZmVNYWxsb2MoMVVMTCwgbmV3X3NpemUpOworICBpZiAobmV3X2J1ZiA9PSBOVUxMKSB7CisgICAgYnctPmVycm9yXyA9IDE7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGJ3LT5wb3NfID4gMCkgeworICAgIGFzc2VydChidy0+YnVmXyAhPSBOVUxMKTsKKyAgICBtZW1jcHkobmV3X2J1ZiwgYnctPmJ1Zl8sIGJ3LT5wb3NfKTsKKyAgfQorICBXZWJQU2FmZUZyZWUoYnctPmJ1Zl8pOworICBidy0+YnVmXyA9IG5ld19idWY7CisgIGJ3LT5tYXhfcG9zXyA9IG5ld19zaXplOworICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgRmx1c2goVlA4Qml0V3JpdGVyKiBjb25zdCBidykgeworICBjb25zdCBpbnQgcyA9IDggKyBidy0+bmJfYml0c187CisgIGNvbnN0IGludDMyX3QgYml0cyA9IGJ3LT52YWx1ZV8gPj4gczsKKyAgYXNzZXJ0KGJ3LT5uYl9iaXRzXyA+PSAwKTsKKyAgYnctPnZhbHVlXyAtPSBiaXRzIDw8IHM7CisgIGJ3LT5uYl9iaXRzXyAtPSA4OworICBpZiAoKGJpdHMgJiAweGZmKSAhPSAweGZmKSB7CisgICAgc2l6ZV90IHBvcyA9IGJ3LT5wb3NfOworICAgIGlmICghQml0V3JpdGVyUmVzaXplKGJ3LCBidy0+cnVuXyArIDEpKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChiaXRzICYgMHgxMDApIHsgIC8vIG92ZXJmbG93IC0+IHByb3BhZ2F0ZSBjYXJyeSBvdmVyIHBlbmRpbmcgMHhmZidzCisgICAgICBpZiAocG9zID4gMCkgYnctPmJ1Zl9bcG9zIC0gMV0rKzsKKyAgICB9CisgICAgaWYgKGJ3LT5ydW5fID4gMCkgeworICAgICAgY29uc3QgaW50IHZhbHVlID0gKGJpdHMgJiAweDEwMCkgPyAweDAwIDogMHhmZjsKKyAgICAgIGZvciAoOyBidy0+cnVuXyA+IDA7IC0tYnctPnJ1bl8pIGJ3LT5idWZfW3BvcysrXSA9IHZhbHVlOworICAgIH0KKyAgICBidy0+YnVmX1twb3MrK10gPSBiaXRzOworICAgIGJ3LT5wb3NfID0gcG9zOworICB9IGVsc2UgeworICAgIGJ3LT5ydW5fKys7ICAgLy8gZGVsYXkgd3JpdGluZyBvZiBieXRlcyAweGZmLCBwZW5kaW5nIGV2ZW50dWFsIGNhcnJ5LgorICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyByZW5vcm1hbGl6YXRpb24KKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga05vcm1bMTI4XSA9IHsgIC8vIHJlbm9ybV9zaXplc1tpXSA9IDggLSBsb2cyKGkpCisgICAgIDcsIDYsIDYsIDUsIDUsIDUsIDUsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsCisgIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCisgIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCisgIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCisgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisgIDAKK307CisKKy8vIHJhbmdlID0gKChyYW5nZSArIDEpIDw8IGtWUDhMb2cyUmFuZ2VbcmFuZ2VdKSAtIDEKK3N0YXRpYyBjb25zdCB1aW50OF90IGtOZXdSYW5nZVsxMjhdID0geworICAxMjcsIDEyNywgMTkxLCAxMjcsIDE1OSwgMTkxLCAyMjMsIDEyNywgMTQzLCAxNTksIDE3NSwgMTkxLCAyMDcsIDIyMywgMjM5LAorICAxMjcsIDEzNSwgMTQzLCAxNTEsIDE1OSwgMTY3LCAxNzUsIDE4MywgMTkxLCAxOTksIDIwNywgMjE1LCAyMjMsIDIzMSwgMjM5LAorICAyNDcsIDEyNywgMTMxLCAxMzUsIDEzOSwgMTQzLCAxNDcsIDE1MSwgMTU1LCAxNTksIDE2MywgMTY3LCAxNzEsIDE3NSwgMTc5LAorICAxODMsIDE4NywgMTkxLCAxOTUsIDE5OSwgMjAzLCAyMDcsIDIxMSwgMjE1LCAyMTksIDIyMywgMjI3LCAyMzEsIDIzNSwgMjM5LAorICAyNDMsIDI0NywgMjUxLCAxMjcsIDEyOSwgMTMxLCAxMzMsIDEzNSwgMTM3LCAxMzksIDE0MSwgMTQzLCAxNDUsIDE0NywgMTQ5LAorICAxNTEsIDE1MywgMTU1LCAxNTcsIDE1OSwgMTYxLCAxNjMsIDE2NSwgMTY3LCAxNjksIDE3MSwgMTczLCAxNzUsIDE3NywgMTc5LAorICAxODEsIDE4MywgMTg1LCAxODcsIDE4OSwgMTkxLCAxOTMsIDE5NSwgMTk3LCAxOTksIDIwMSwgMjAzLCAyMDUsIDIwNywgMjA5LAorICAyMTEsIDIxMywgMjE1LCAyMTcsIDIxOSwgMjIxLCAyMjMsIDIyNSwgMjI3LCAyMjksIDIzMSwgMjMzLCAyMzUsIDIzNywgMjM5LAorICAyNDEsIDI0MywgMjQ1LCAyNDcsIDI0OSwgMjUxLCAyNTMsIDEyNworfTsKKworaW50IFZQOFB1dEJpdChWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LCBpbnQgYml0LCBpbnQgcHJvYikgeworICBjb25zdCBpbnQgc3BsaXQgPSAoYnctPnJhbmdlXyAqIHByb2IpID4+IDg7CisgIGlmIChiaXQpIHsKKyAgICBidy0+dmFsdWVfICs9IHNwbGl0ICsgMTsKKyAgICBidy0+cmFuZ2VfIC09IHNwbGl0ICsgMTsKKyAgfSBlbHNlIHsKKyAgICBidy0+cmFuZ2VfID0gc3BsaXQ7CisgIH0KKyAgaWYgKGJ3LT5yYW5nZV8gPCAxMjcpIHsgICAvLyBlbWl0ICdzaGlmdCcgYml0cyBvdXQgYW5kIHJlbm9ybWFsaXplCisgICAgY29uc3QgaW50IHNoaWZ0ID0ga05vcm1bYnctPnJhbmdlX107CisgICAgYnctPnJhbmdlXyA9IGtOZXdSYW5nZVtidy0+cmFuZ2VfXTsKKyAgICBidy0+dmFsdWVfIDw8PSBzaGlmdDsKKyAgICBidy0+bmJfYml0c18gKz0gc2hpZnQ7CisgICAgaWYgKGJ3LT5uYl9iaXRzXyA+IDApIEZsdXNoKGJ3KTsKKyAgfQorICByZXR1cm4gYml0OworfQorCitpbnQgVlA4UHV0Qml0VW5pZm9ybShWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LCBpbnQgYml0KSB7CisgIGNvbnN0IGludCBzcGxpdCA9IGJ3LT5yYW5nZV8gPj4gMTsKKyAgaWYgKGJpdCkgeworICAgIGJ3LT52YWx1ZV8gKz0gc3BsaXQgKyAxOworICAgIGJ3LT5yYW5nZV8gLT0gc3BsaXQgKyAxOworICB9IGVsc2UgeworICAgIGJ3LT5yYW5nZV8gPSBzcGxpdDsKKyAgfQorICBpZiAoYnctPnJhbmdlXyA8IDEyNykgeworICAgIGJ3LT5yYW5nZV8gPSBrTmV3UmFuZ2VbYnctPnJhbmdlX107CisgICAgYnctPnZhbHVlXyA8PD0gMTsKKyAgICBidy0+bmJfYml0c18gKz0gMTsKKyAgICBpZiAoYnctPm5iX2JpdHNfID4gMCkgRmx1c2goYncpOworICB9CisgIHJldHVybiBiaXQ7Cit9CisKK3ZvaWQgVlA4UHV0Qml0cyhWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LCB1aW50MzJfdCB2YWx1ZSwgaW50IG5iX2JpdHMpIHsKKyAgdWludDMyX3QgbWFzazsKKyAgYXNzZXJ0KG5iX2JpdHMgPiAwICYmIG5iX2JpdHMgPCAzMik7CisgIGZvciAobWFzayA9IDF1IDw8IChuYl9iaXRzIC0gMSk7IG1hc2s7IG1hc2sgPj49IDEpIHsKKyAgICBWUDhQdXRCaXRVbmlmb3JtKGJ3LCB2YWx1ZSAmIG1hc2spOworICB9Cit9CisKK3ZvaWQgVlA4UHV0U2lnbmVkQml0cyhWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LCBpbnQgdmFsdWUsIGludCBuYl9iaXRzKSB7CisgIGlmICghVlA4UHV0Qml0VW5pZm9ybShidywgdmFsdWUgIT0gMCkpIHJldHVybjsKKyAgaWYgKHZhbHVlIDwgMCkgeworICAgIFZQOFB1dEJpdHMoYncsICgoLXZhbHVlKSA8PCAxKSB8IDEsIG5iX2JpdHMgKyAxKTsKKyAgfSBlbHNlIHsKKyAgICBWUDhQdXRCaXRzKGJ3LCB2YWx1ZSA8PCAxLCBuYl9iaXRzICsgMSk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IFZQOEJpdFdyaXRlckluaXQoVlA4Qml0V3JpdGVyKiBjb25zdCBidywgc2l6ZV90IGV4cGVjdGVkX3NpemUpIHsKKyAgYnctPnJhbmdlXyAgID0gMjU1IC0gMTsKKyAgYnctPnZhbHVlXyAgID0gMDsKKyAgYnctPnJ1bl8gICAgID0gMDsKKyAgYnctPm5iX2JpdHNfID0gLTg7CisgIGJ3LT5wb3NfICAgICA9IDA7CisgIGJ3LT5tYXhfcG9zXyA9IDA7CisgIGJ3LT5lcnJvcl8gICA9IDA7CisgIGJ3LT5idWZfICAgICA9IE5VTEw7CisgIHJldHVybiAoZXhwZWN0ZWRfc2l6ZSA+IDApID8gQml0V3JpdGVyUmVzaXplKGJ3LCBleHBlY3RlZF9zaXplKSA6IDE7Cit9CisKK3VpbnQ4X3QqIFZQOEJpdFdyaXRlckZpbmlzaChWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3KSB7CisgIFZQOFB1dEJpdHMoYncsIDAsIDkgLSBidy0+bmJfYml0c18pOworICBidy0+bmJfYml0c18gPSAwOyAgIC8vIHBhZCB3aXRoIHplcm9lcworICBGbHVzaChidyk7CisgIHJldHVybiBidy0+YnVmXzsKK30KKworaW50IFZQOEJpdFdyaXRlckFwcGVuZChWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBhc3NlcnQoZGF0YSAhPSBOVUxMKTsKKyAgaWYgKGJ3LT5uYl9iaXRzXyAhPSAtOCkgcmV0dXJuIDA7ICAgLy8gRmx1c2goKSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQKKyAgaWYgKCFCaXRXcml0ZXJSZXNpemUoYncsIHNpemUpKSByZXR1cm4gMDsKKyAgbWVtY3B5KGJ3LT5idWZfICsgYnctPnBvc18sIGRhdGEsIHNpemUpOworICBidy0+cG9zXyArPSBzaXplOworICByZXR1cm4gMTsKK30KKwordm9pZCBWUDhCaXRXcml0ZXJXaXBlT3V0KFZQOEJpdFdyaXRlciogY29uc3QgYncpIHsKKyAgaWYgKGJ3ICE9IE5VTEwpIHsKKyAgICBXZWJQU2FmZUZyZWUoYnctPmJ1Zl8pOworICAgIG1lbXNldChidywgMCwgc2l6ZW9mKCpidykpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWUDhMQml0V3JpdGVyCisKKy8vIFRoaXMgaXMgdGhlIG1pbmltdW0gYW1vdW50IG9mIHNpemUgdGhlIG1lbW9yeSBidWZmZXIgaXMgZ3VhcmFudGVlZCB0byBncm93CisvLyB3aGVuIGV4dHJhIHNwYWNlIGlzIG5lZWRlZC4KKyNkZWZpbmUgTUlOX0VYVFJBX1NJWkUgICgzMjc2OFVMTCkKKworLy8gUmV0dXJucyAxIG9uIHN1Y2Nlc3MuCitzdGF0aWMgaW50IFZQOExCaXRXcml0ZXJSZXNpemUoVlA4TEJpdFdyaXRlciogY29uc3QgYncsIHNpemVfdCBleHRyYV9zaXplKSB7CisgIHVpbnQ4X3QqIGFsbG9jYXRlZF9idWY7CisgIHNpemVfdCBhbGxvY2F0ZWRfc2l6ZTsKKyAgY29uc3Qgc2l6ZV90IG1heF9ieXRlcyA9IGJ3LT5lbmRfIC0gYnctPmJ1Zl87CisgIGNvbnN0IHNpemVfdCBjdXJyZW50X3NpemUgPSBidy0+Y3VyXyAtIGJ3LT5idWZfOworICBjb25zdCB1aW50NjRfdCBzaXplX3JlcXVpcmVkXzY0YiA9ICh1aW50NjRfdCljdXJyZW50X3NpemUgKyBleHRyYV9zaXplOworICBjb25zdCBzaXplX3Qgc2l6ZV9yZXF1aXJlZCA9IChzaXplX3Qpc2l6ZV9yZXF1aXJlZF82NGI7CisgIGlmIChzaXplX3JlcXVpcmVkICE9IHNpemVfcmVxdWlyZWRfNjRiKSB7CisgICAgYnctPmVycm9yXyA9IDE7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKG1heF9ieXRlcyA+IDAgJiYgc2l6ZV9yZXF1aXJlZCA8PSBtYXhfYnl0ZXMpIHJldHVybiAxOworICBhbGxvY2F0ZWRfc2l6ZSA9ICgzICogbWF4X2J5dGVzKSA+PiAxOworICBpZiAoYWxsb2NhdGVkX3NpemUgPCBzaXplX3JlcXVpcmVkKSBhbGxvY2F0ZWRfc2l6ZSA9IHNpemVfcmVxdWlyZWQ7CisgIC8vIG1ha2UgYWxsb2NhdGVkIHNpemUgbXVsdGlwbGUgb2YgMWsKKyAgYWxsb2NhdGVkX3NpemUgPSAoKChhbGxvY2F0ZWRfc2l6ZSA+PiAxMCkgKyAxKSA8PCAxMCk7CisgIGFsbG9jYXRlZF9idWYgPSAodWludDhfdCopV2ViUFNhZmVNYWxsb2MoMVVMTCwgYWxsb2NhdGVkX3NpemUpOworICBpZiAoYWxsb2NhdGVkX2J1ZiA9PSBOVUxMKSB7CisgICAgYnctPmVycm9yXyA9IDE7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGN1cnJlbnRfc2l6ZSA+IDApIHsKKyAgICBtZW1jcHkoYWxsb2NhdGVkX2J1ZiwgYnctPmJ1Zl8sIGN1cnJlbnRfc2l6ZSk7CisgIH0KKyAgV2ViUFNhZmVGcmVlKGJ3LT5idWZfKTsKKyAgYnctPmJ1Zl8gPSBhbGxvY2F0ZWRfYnVmOworICBidy0+Y3VyXyA9IGJ3LT5idWZfICsgY3VycmVudF9zaXplOworICBidy0+ZW5kXyA9IGJ3LT5idWZfICsgYWxsb2NhdGVkX3NpemU7CisgIHJldHVybiAxOworfQorCitpbnQgVlA4TEJpdFdyaXRlckluaXQoVlA4TEJpdFdyaXRlciogY29uc3QgYncsIHNpemVfdCBleHBlY3RlZF9zaXplKSB7CisgIG1lbXNldChidywgMCwgc2l6ZW9mKCpidykpOworICByZXR1cm4gVlA4TEJpdFdyaXRlclJlc2l6ZShidywgZXhwZWN0ZWRfc2l6ZSk7Cit9CisKK2ludCBWUDhMQml0V3JpdGVyQ2xvbmUoY29uc3QgVlA4TEJpdFdyaXRlciogY29uc3Qgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICBWUDhMQml0V3JpdGVyKiBjb25zdCBkc3QpIHsKKyAgY29uc3Qgc2l6ZV90IGN1cnJlbnRfc2l6ZSA9IHNyYy0+Y3VyXyAtIHNyYy0+YnVmXzsKKyAgYXNzZXJ0KHNyYy0+Y3VyXyA+PSBzcmMtPmJ1Zl8gJiYgc3JjLT5jdXJfIDw9IHNyYy0+ZW5kXyk7CisgIGlmICghVlA4TEJpdFdyaXRlclJlc2l6ZShkc3QsIGN1cnJlbnRfc2l6ZSkpIHJldHVybiAwOworICBtZW1jcHkoZHN0LT5idWZfLCBzcmMtPmJ1Zl8sIGN1cnJlbnRfc2l6ZSk7CisgIGRzdC0+Yml0c18gPSBzcmMtPmJpdHNfOworICBkc3QtPnVzZWRfID0gc3JjLT51c2VkXzsKKyAgZHN0LT5lcnJvcl8gPSBzcmMtPmVycm9yXzsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgVlA4TEJpdFdyaXRlcldpcGVPdXQoVlA4TEJpdFdyaXRlciogY29uc3QgYncpIHsKKyAgaWYgKGJ3ICE9IE5VTEwpIHsKKyAgICBXZWJQU2FmZUZyZWUoYnctPmJ1Zl8pOworICAgIG1lbXNldChidywgMCwgc2l6ZW9mKCpidykpOworICB9Cit9CisKK3ZvaWQgVlA4TEJpdFdyaXRlclJlc2V0KGNvbnN0IFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3X2luaXQsCisgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQml0V3JpdGVyKiBjb25zdCBidykgeworICBidy0+Yml0c18gPSBid19pbml0LT5iaXRzXzsKKyAgYnctPnVzZWRfID0gYndfaW5pdC0+dXNlZF87CisgIGJ3LT5jdXJfID0gYnctPmJ1Zl8gKyAoYndfaW5pdC0+Y3VyXyAtIGJ3X2luaXQtPmJ1Zl8pOworICBhc3NlcnQoYnctPmN1cl8gPD0gYnctPmVuZF8pOworICBidy0+ZXJyb3JfID0gYndfaW5pdC0+ZXJyb3JfOworfQorCit2b2lkIFZQOExCaXRXcml0ZXJTd2FwKFZQOExCaXRXcml0ZXIqIGNvbnN0IHNyYywgVlA4TEJpdFdyaXRlciogY29uc3QgZHN0KSB7CisgIGNvbnN0IFZQOExCaXRXcml0ZXIgdG1wID0gKnNyYzsKKyAgKnNyYyA9ICpkc3Q7CisgICpkc3QgPSB0bXA7Cit9CisKK3ZvaWQgVlA4TFB1dEJpdHNGbHVzaEJpdHMoVlA4TEJpdFdyaXRlciogY29uc3QgYncpIHsKKyAgLy8gSWYgbmVlZGVkLCBtYWtlIHNvbWUgcm9vbSBieSBmbHVzaGluZyBzb21lIGJpdHMgb3V0LgorICBpZiAoYnctPmN1cl8gKyBWUDhMX1dSSVRFUl9CWVRFUyA+IGJ3LT5lbmRfKSB7CisgICAgY29uc3QgdWludDY0X3QgZXh0cmFfc2l6ZSA9IChidy0+ZW5kXyAtIGJ3LT5idWZfKSArIE1JTl9FWFRSQV9TSVpFOworICAgIGlmIChleHRyYV9zaXplICE9IChzaXplX3QpZXh0cmFfc2l6ZSB8fAorICAgICAgICAhVlA4TEJpdFdyaXRlclJlc2l6ZShidywgKHNpemVfdClleHRyYV9zaXplKSkgeworICAgICAgYnctPmN1cl8gPSBidy0+YnVmXzsKKyAgICAgIGJ3LT5lcnJvcl8gPSAxOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICAqKHZwOGxfd3R5cGVfdCopYnctPmN1cl8gPSAodnA4bF93dHlwZV90KVdTV0FQKCh2cDhsX3d0eXBlX3QpYnctPmJpdHNfKTsKKyAgYnctPmN1cl8gKz0gVlA4TF9XUklURVJfQllURVM7CisgIGJ3LT5iaXRzXyA+Pj0gVlA4TF9XUklURVJfQklUUzsKKyAgYnctPnVzZWRfIC09IFZQOExfV1JJVEVSX0JJVFM7Cit9CisKK3ZvaWQgVlA4TFB1dEJpdHNJbnRlcm5hbChWUDhMQml0V3JpdGVyKiBjb25zdCBidywgdWludDMyX3QgYml0cywgaW50IG5fYml0cykgeworICBhc3NlcnQobl9iaXRzIDw9IDMyKTsKKyAgLy8gVGhhdCdzIHRoZSBtYXggd2UgY2FuIGhhbmRsZToKKyAgYXNzZXJ0KHNpemVvZih2cDhsX3d0eXBlX3QpID09IDIpOworICBpZiAobl9iaXRzID4gMCkgeworICAgIHZwOGxfYXR5cGVfdCBsYml0cyA9IGJ3LT5iaXRzXzsKKyAgICBpbnQgdXNlZCA9IGJ3LT51c2VkXzsKKyAgICAvLyBTcGVjaWFsIGNhc2Ugb2Ygb3ZlcmZsb3cgaGFuZGxpbmcgZm9yIDMyYml0IGFjY3VtdWxhdG9yICgyLXN0ZXBzIGZsdXNoKS4KKyNpZiBWUDhMX1dSSVRFUl9CSVRTID09IDE2CisgICAgaWYgKHVzZWQgKyBuX2JpdHMgPj0gVlA4TF9XUklURVJfTUFYX0JJVFMpIHsKKyAgICAgIC8vIEZpbGwgdXAgYWxsIHRoZSBWUDhMX1dSSVRFUl9NQVhfQklUUyBzbyBpdCBjYW4gYmUgZmx1c2hlZCBvdXQgYmVsb3cuCisgICAgICBjb25zdCBpbnQgc2hpZnQgPSBWUDhMX1dSSVRFUl9NQVhfQklUUyAtIHVzZWQ7CisgICAgICBsYml0cyB8PSAodnA4bF9hdHlwZV90KWJpdHMgPDwgdXNlZDsKKyAgICAgIHVzZWQgPSBWUDhMX1dSSVRFUl9NQVhfQklUUzsKKyAgICAgIG5fYml0cyAtPSBzaGlmdDsKKyAgICAgIGJpdHMgPj49IHNoaWZ0OworICAgICAgYXNzZXJ0KG5fYml0cyA8PSBWUDhMX1dSSVRFUl9NQVhfQklUUyk7CisgICAgfQorI2VuZGlmCisgICAgLy8gSWYgbmVlZGVkLCBtYWtlIHNvbWUgcm9vbSBieSBmbHVzaGluZyBzb21lIGJpdHMgb3V0LgorICAgIHdoaWxlICh1c2VkID49IFZQOExfV1JJVEVSX0JJVFMpIHsKKyAgICAgIGlmIChidy0+Y3VyXyArIFZQOExfV1JJVEVSX0JZVEVTID4gYnctPmVuZF8pIHsKKyAgICAgICAgY29uc3QgdWludDY0X3QgZXh0cmFfc2l6ZSA9IChidy0+ZW5kXyAtIGJ3LT5idWZfKSArIE1JTl9FWFRSQV9TSVpFOworICAgICAgICBpZiAoZXh0cmFfc2l6ZSAhPSAoc2l6ZV90KWV4dHJhX3NpemUgfHwKKyAgICAgICAgICAgICFWUDhMQml0V3JpdGVyUmVzaXplKGJ3LCAoc2l6ZV90KWV4dHJhX3NpemUpKSB7CisgICAgICAgICAgYnctPmN1cl8gPSBidy0+YnVmXzsKKyAgICAgICAgICBidy0+ZXJyb3JfID0gMTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICoodnA4bF93dHlwZV90Kilidy0+Y3VyXyA9ICh2cDhsX3d0eXBlX3QpV1NXQVAoKHZwOGxfd3R5cGVfdClsYml0cyk7CisgICAgICBidy0+Y3VyXyArPSBWUDhMX1dSSVRFUl9CWVRFUzsKKyAgICAgIGxiaXRzID4+PSBWUDhMX1dSSVRFUl9CSVRTOworICAgICAgdXNlZCAtPSBWUDhMX1dSSVRFUl9CSVRTOworICAgIH0KKyAgICBidy0+Yml0c18gPSBsYml0cyB8ICgodnA4bF9hdHlwZV90KWJpdHMgPDwgdXNlZCk7CisgICAgYnctPnVzZWRfID0gdXNlZCArIG5fYml0czsKKyAgfQorfQorCit1aW50OF90KiBWUDhMQml0V3JpdGVyRmluaXNoKFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3KSB7CisgIC8vIGZsdXNoIGxlZnRvdmVyIGJpdHMKKyAgaWYgKFZQOExCaXRXcml0ZXJSZXNpemUoYncsIChidy0+dXNlZF8gKyA3KSA+PiAzKSkgeworICAgIHdoaWxlIChidy0+dXNlZF8gPiAwKSB7CisgICAgICAqYnctPmN1cl8rKyA9ICh1aW50OF90KWJ3LT5iaXRzXzsKKyAgICAgIGJ3LT5iaXRzXyA+Pj0gODsKKyAgICAgIGJ3LT51c2VkXyAtPSA4OworICAgIH0KKyAgICBidy0+dXNlZF8gPSAwOworICB9CisgIHJldHVybiBidy0+YnVmXzsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9iaXRfd3JpdGVyX3V0aWxzLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvYml0X3dyaXRlcl91dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZjU5NzYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvYml0X3dyaXRlcl91dGlscy5oCkBAIC0wLDAgKzEsMTU0IEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQml0IHdyaXRpbmcgYW5kIGJvb2xlYW4gY29kZXIKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaWZuZGVmIFdFQlBfVVRJTFNfQklUX1dSSVRFUl9VVElMU19IXworI2RlZmluZSBXRUJQX1VUSUxTX0JJVF9XUklURVJfVVRJTFNfSF8KKworI2luY2x1ZGUgInNyYy93ZWJwL3R5cGVzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEJpdC13cml0aW5nCisKK3R5cGVkZWYgc3RydWN0IFZQOEJpdFdyaXRlciBWUDhCaXRXcml0ZXI7CitzdHJ1Y3QgVlA4Qml0V3JpdGVyIHsKKyAgaW50MzJfdCAgcmFuZ2VfOyAgICAgIC8vIHJhbmdlLTEKKyAgaW50MzJfdCAgdmFsdWVfOworICBpbnQgICAgICBydW5fOyAgICAgICAgLy8gbnVtYmVyIG9mIG91dHN0YW5kaW5nIGJpdHMKKyAgaW50ICAgICAgbmJfYml0c187ICAgIC8vIG51bWJlciBvZiBwZW5kaW5nIGJpdHMKKyAgdWludDhfdCogYnVmXzsgICAgICAgIC8vIGludGVybmFsIGJ1ZmZlci4gUmUtYWxsb2NhdGVkIHJlZ3VsYXJseS4gTm90IG93bmVkLgorICBzaXplX3QgICBwb3NfOworICBzaXplX3QgICBtYXhfcG9zXzsKKyAgaW50ICAgICAgZXJyb3JfOyAgICAgIC8vIHRydWUgaW4gY2FzZSBvZiBlcnJvcgorfTsKKworLy8gSW5pdGlhbGl6ZSB0aGUgb2JqZWN0LiBBbGxvY2F0ZXMgc29tZSBpbml0aWFsIG1lbW9yeSBiYXNlZCBvbiBleHBlY3RlZF9zaXplLgoraW50IFZQOEJpdFdyaXRlckluaXQoVlA4Qml0V3JpdGVyKiBjb25zdCBidywgc2l6ZV90IGV4cGVjdGVkX3NpemUpOworLy8gRmluYWxpemUgdGhlIGJpdHN0cmVhbSBjb2RpbmcuIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBpbnRlcm5hbCBidWZmZXIuCit1aW50OF90KiBWUDhCaXRXcml0ZXJGaW5pc2goVlA4Qml0V3JpdGVyKiBjb25zdCBidyk7CisvLyBSZWxlYXNlIGFueSBwZW5kaW5nIG1lbW9yeSBhbmQgemVyb2VzIHRoZSBvYmplY3QuIE5vdCBhIG1hbmRhdG9yeSBjYWxsLgorLy8gT25seSB1c2VmdWwgaW4gY2FzZSBvZiBlcnJvciwgd2hlbiB0aGUgaW50ZXJuYWwgYnVmZmVyIGhhc24ndCBiZWVuIGdyYWJiZWQhCit2b2lkIFZQOEJpdFdyaXRlcldpcGVPdXQoVlA4Qml0V3JpdGVyKiBjb25zdCBidyk7CisKK2ludCBWUDhQdXRCaXQoVlA4Qml0V3JpdGVyKiBjb25zdCBidywgaW50IGJpdCwgaW50IHByb2IpOworaW50IFZQOFB1dEJpdFVuaWZvcm0oVlA4Qml0V3JpdGVyKiBjb25zdCBidywgaW50IGJpdCk7Cit2b2lkIFZQOFB1dEJpdHMoVlA4Qml0V3JpdGVyKiBjb25zdCBidywgdWludDMyX3QgdmFsdWUsIGludCBuYl9iaXRzKTsKK3ZvaWQgVlA4UHV0U2lnbmVkQml0cyhWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LCBpbnQgdmFsdWUsIGludCBuYl9iaXRzKTsKKworLy8gQXBwZW5kcyBzb21lIGJ5dGVzIHRvIHRoZSBpbnRlcm5hbCBidWZmZXIuIERhdGEgaXMgY29waWVkLgoraW50IFZQOEJpdFdyaXRlckFwcGVuZChWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKy8vIHJldHVybiBhcHByb3hpbWF0ZSB3cml0ZSBwb3NpdGlvbiAoaW4gYml0cykKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50NjRfdCBWUDhCaXRXcml0ZXJQb3MoY29uc3QgVlA4Qml0V3JpdGVyKiBjb25zdCBidykgeworICBjb25zdCB1aW50NjRfdCBuYl9iaXRzID0gOCArIGJ3LT5uYl9iaXRzXzsgICAvLyBidy0+bmJfYml0c18gaXMgPD0gMCwgbm90ZQorICByZXR1cm4gKGJ3LT5wb3NfICsgYnctPnJ1bl8pICogOCArIG5iX2JpdHM7Cit9CisKKy8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBpbnRlcm5hbCBidWZmZXIuCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDhfdCogVlA4Qml0V3JpdGVyQnVmKGNvbnN0IFZQOEJpdFdyaXRlciogY29uc3QgYncpIHsKKyAgcmV0dXJuIGJ3LT5idWZfOworfQorLy8gUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgaW50ZXJuYWwgYnVmZmVyLgorc3RhdGljIFdFQlBfSU5MSU5FIHNpemVfdCBWUDhCaXRXcml0ZXJTaXplKGNvbnN0IFZQOEJpdFdyaXRlciogY29uc3QgYncpIHsKKyAgcmV0dXJuIGJ3LT5wb3NfOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVlA4TEJpdFdyaXRlcgorCisjaWYgZGVmaW5lZChfX3g4Nl82NF9fKSB8fCBkZWZpbmVkKF9NX1g2NCkgICAvLyA2NGJpdAordHlwZWRlZiB1aW50NjRfdCB2cDhsX2F0eXBlX3Q7ICAgLy8gYWNjdW11bGF0b3IgdHlwZQordHlwZWRlZiB1aW50MzJfdCB2cDhsX3d0eXBlX3Q7ICAgLy8gd3JpdGluZyB0eXBlCisjZGVmaW5lIFdTV0FQIEhUb0xFMzIKKyNkZWZpbmUgVlA4TF9XUklURVJfQllURVMgICAgNCAgIC8vIHNpemVvZih2cDhsX3d0eXBlX3QpCisjZGVmaW5lIFZQOExfV1JJVEVSX0JJVFMgICAgIDMyICAvLyA4ICogc2l6ZW9mKHZwOGxfd3R5cGVfdCkKKyNkZWZpbmUgVlA4TF9XUklURVJfTUFYX0JJVFMgNjQgIC8vIDggKiBzaXplb2YodnA4bF9hdHlwZV90KQorI2Vsc2UKK3R5cGVkZWYgdWludDMyX3QgdnA4bF9hdHlwZV90OwordHlwZWRlZiB1aW50MTZfdCB2cDhsX3d0eXBlX3Q7CisjZGVmaW5lIFdTV0FQIEhUb0xFMTYKKyNkZWZpbmUgVlA4TF9XUklURVJfQllURVMgICAgMgorI2RlZmluZSBWUDhMX1dSSVRFUl9CSVRTICAgICAxNgorI2RlZmluZSBWUDhMX1dSSVRFUl9NQVhfQklUUyAzMgorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdnA4bF9hdHlwZV90IGJpdHNfOyAgIC8vIGJpdCBhY2N1bXVsYXRvcgorICBpbnQgICAgICAgICAgdXNlZF87ICAgLy8gbnVtYmVyIG9mIGJpdHMgdXNlZCBpbiBhY2N1bXVsYXRvcgorICB1aW50OF90KiAgICAgYnVmXzsgICAgLy8gc3RhcnQgb2YgYnVmZmVyCisgIHVpbnQ4X3QqICAgICBjdXJfOyAgICAvLyBjdXJyZW50IHdyaXRlIHBvc2l0aW9uCisgIHVpbnQ4X3QqICAgICBlbmRfOyAgICAvLyBlbmQgb2YgYnVmZmVyCisKKyAgLy8gQWZ0ZXIgYWxsIGJpdHMgYXJlIHdyaXR0ZW4gKFZQOExCaXRXcml0ZXJGaW5pc2goKSksIHRoZSBjYWxsZXIgbXVzdCBvYnNlcnZlCisgIC8vIHRoZSBzdGF0ZSBvZiBlcnJvcl8uIEEgdmFsdWUgb2YgMSBpbmRpY2F0ZXMgdGhhdCBhIG1lbW9yeSBhbGxvY2F0aW9uCisgIC8vIGZhaWx1cmUgaGFzIGhhcHBlbmVkIGR1cmluZyBiaXQgd3JpdGluZy4gQSB2YWx1ZSBvZiAwIGluZGljYXRlcyBzdWNjZXNzZnVsCisgIC8vIHdyaXRpbmcgb2YgYml0cy4KKyAgaW50IGVycm9yXzsKK30gVlA4TEJpdFdyaXRlcjsKKworc3RhdGljIFdFQlBfSU5MSU5FIHNpemVfdCBWUDhMQml0V3JpdGVyTnVtQnl0ZXMoY29uc3QgVlA4TEJpdFdyaXRlciogY29uc3QgYncpIHsKKyAgcmV0dXJuIChidy0+Y3VyXyAtIGJ3LT5idWZfKSArICgoYnctPnVzZWRfICsgNykgPj4gMyk7Cit9CisKKy8vIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvci4KK2ludCBWUDhMQml0V3JpdGVySW5pdChWUDhMQml0V3JpdGVyKiBjb25zdCBidywgc2l6ZV90IGV4cGVjdGVkX3NpemUpOworLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yLgoraW50IFZQOExCaXRXcml0ZXJDbG9uZShjb25zdCBWUDhMQml0V3JpdGVyKiBjb25zdCBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgIFZQOExCaXRXcml0ZXIqIGNvbnN0IGRzdCk7CisvLyBGaW5hbGl6ZSB0aGUgYml0c3RyZWFtIGNvZGluZy4gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGludGVybmFsIGJ1ZmZlci4KK3VpbnQ4X3QqIFZQOExCaXRXcml0ZXJGaW5pc2goVlA4TEJpdFdyaXRlciogY29uc3QgYncpOworLy8gUmVsZWFzZSBhbnkgcGVuZGluZyBtZW1vcnkgYW5kIHplcm9lcyB0aGUgb2JqZWN0Lgordm9pZCBWUDhMQml0V3JpdGVyV2lwZU91dChWUDhMQml0V3JpdGVyKiBjb25zdCBidyk7CisvLyBSZXNldHMgdGhlIGN1cnNvciBvZiB0aGUgQml0V3JpdGVyIGJ3IHRvIHdoZW4gaXQgd2FzIGxpa2UgaW4gYndfaW5pdC4KK3ZvaWQgVlA4TEJpdFdyaXRlclJlc2V0KGNvbnN0IFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3X2luaXQsCisgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQml0V3JpdGVyKiBjb25zdCBidyk7CisvLyBTd2FwcyB0aGUgbWVtb3J5IGhlbGQgYnkgdHdvIEJpdFdyaXRlcnMuCit2b2lkIFZQOExCaXRXcml0ZXJTd2FwKFZQOExCaXRXcml0ZXIqIGNvbnN0IHNyYywgVlA4TEJpdFdyaXRlciogY29uc3QgZHN0KTsKKworLy8gSW50ZXJuYWwgZnVuY3Rpb24gZm9yIFZQOExQdXRCaXRzIGZsdXNoaW5nIDMyIGJpdHMgZnJvbSB0aGUgd3JpdHRlbiBzdGF0ZS4KK3ZvaWQgVlA4TFB1dEJpdHNGbHVzaEJpdHMoVlA4TEJpdFdyaXRlciogY29uc3QgYncpOworCisvLyBQdXRCaXRzIGludGVybmFsIGZ1bmN0aW9uIHVzZWQgaW4gdGhlIDE2IGJpdCB2cDhsX3d0eXBlX3QgY2FzZS4KK3ZvaWQgVlA4TFB1dEJpdHNJbnRlcm5hbChWUDhMQml0V3JpdGVyKiBjb25zdCBidywgdWludDMyX3QgYml0cywgaW50IG5fYml0cyk7CisKKy8vIFRoaXMgZnVuY3Rpb24gd3JpdGVzIGJpdHMgaW50byBieXRlcyBpbiBpbmNyZWFzaW5nIGFkZHJlc3NlcyAobGl0dGxlIGVuZGlhbiksCisvLyBhbmQgd2l0aGluIGEgYnl0ZSBsZWFzdC1zaWduaWZpY2FudC1iaXQgZmlyc3QuCisvLyBUaGlzIGZ1bmN0aW9uIGNhbiB3cml0ZSB1cCB0byAzMiBiaXRzIGluIG9uZSBnbywgYnV0IFZQOExCaXRSZWFkZXIgY2FuIG9ubHkKKy8vIHJlYWQgMjQgYml0cyBtYXggKFZQOExfTUFYX05VTV9CSVRfUkVBRCkuCisvLyBWUDhMQml0V3JpdGVyJ3MgZXJyb3JfIGZsYWcgaXMgc2V0IGluIGNhc2Ugb2YgIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yLgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVlA4TFB1dEJpdHMoVlA4TEJpdFdyaXRlciogY29uc3QgYncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBiaXRzLCBpbnQgbl9iaXRzKSB7CisgIGlmIChzaXplb2YodnA4bF93dHlwZV90KSA9PSA0KSB7CisgICAgaWYgKG5fYml0cyA+IDApIHsKKyAgICAgIGlmIChidy0+dXNlZF8gPj0gMzIpIHsKKyAgICAgICAgVlA4TFB1dEJpdHNGbHVzaEJpdHMoYncpOworICAgICAgfQorICAgICAgYnctPmJpdHNfIHw9ICh2cDhsX2F0eXBlX3QpYml0cyA8PCBidy0+dXNlZF87CisgICAgICBidy0+dXNlZF8gKz0gbl9iaXRzOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBWUDhMUHV0Qml0c0ludGVybmFsKGJ3LCBiaXRzLCBuX2JpdHMpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvKiBXRUJQX1VUSUxTX0JJVF9XUklURVJfVVRJTFNfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9jb2xvcl9jYWNoZV91dGlscy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL2NvbG9yX2NhY2hlX3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU1NDgxMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9jb2xvcl9jYWNoZV91dGlscy5jCkBAIC0wLDAgKzEsNTUgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBDb2xvciBDYWNoZSBmb3IgV2ViUCBMb3NzbGVzcworLy8KKy8vIEF1dGhvcjogSnlya2kgQWxha3VpamFsYSAoanlya2lAZ29vZ2xlLmNvbSkKKworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL2Fzc2VydF9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RkbGliX3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdfcG9lbS5oIgorI2Vsc2UKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbmRpZgorI2luY2x1ZGUgInNyYy91dGlscy9jb2xvcl9jYWNoZV91dGlscy5oIgorI2luY2x1ZGUgInNyYy91dGlscy91dGlscy5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVlA4TENvbG9yQ2FjaGUuCisKK2ludCBWUDhMQ29sb3JDYWNoZUluaXQoVlA4TENvbG9yQ2FjaGUqIGNvbnN0IGNjLCBpbnQgaGFzaF9iaXRzKSB7CisgIGNvbnN0IGludCBoYXNoX3NpemUgPSAxIDw8IGhhc2hfYml0czsKKyAgYXNzZXJ0KGNjICE9IE5VTEwpOworICBhc3NlcnQoaGFzaF9iaXRzID4gMCk7CisgIGNjLT5jb2xvcnNfID0gKHVpbnQzMl90KilXZWJQU2FmZUNhbGxvYygodWludDY0X3QpaGFzaF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpjYy0+Y29sb3JzXykpOworICBpZiAoY2MtPmNvbG9yc18gPT0gTlVMTCkgcmV0dXJuIDA7CisgIGNjLT5oYXNoX3NoaWZ0XyA9IDMyIC0gaGFzaF9iaXRzOworICBjYy0+aGFzaF9iaXRzXyA9IGhhc2hfYml0czsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgVlA4TENvbG9yQ2FjaGVDbGVhcihWUDhMQ29sb3JDYWNoZSogY29uc3QgY2MpIHsKKyAgaWYgKGNjICE9IE5VTEwpIHsKKyAgICBXZWJQU2FmZUZyZWUoY2MtPmNvbG9yc18pOworICAgIGNjLT5jb2xvcnNfID0gTlVMTDsKKyAgfQorfQorCit2b2lkIFZQOExDb2xvckNhY2hlQ29weShjb25zdCBWUDhMQ29sb3JDYWNoZSogY29uc3Qgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgVlA4TENvbG9yQ2FjaGUqIGNvbnN0IGRzdCkgeworICBhc3NlcnQoc3JjICE9IE5VTEwpOworICBhc3NlcnQoZHN0ICE9IE5VTEwpOworICBhc3NlcnQoc3JjLT5oYXNoX2JpdHNfID09IGRzdC0+aGFzaF9iaXRzXyk7CisgIG1lbWNweShkc3QtPmNvbG9yc18sIHNyYy0+Y29sb3JzXywKKyAgICAgICAgICgoc2l6ZV90KTF1IDw8IGRzdC0+aGFzaF9iaXRzXykgKiBzaXplb2YoKmRzdC0+Y29sb3JzXykpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL2NvbG9yX2NhY2hlX3V0aWxzLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvY29sb3JfY2FjaGVfdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGNhYzhjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL2NvbG9yX2NhY2hlX3V0aWxzLmgKQEAgLTAsMCArMSw5MSBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIENvbG9yIENhY2hlIGZvciBXZWJQIExvc3NsZXNzCisvLworLy8gQXV0aG9yczogSnlya2kgQWxha3VpamFsYSAoanlya2lAZ29vZ2xlLmNvbSkKKy8vICAgICAgICAgIFVydmFuZyBKb3NoaSAodXJ2YW5nQGdvb2dsZS5jb20pCisKKyNpZm5kZWYgV0VCUF9VVElMU19DT0xPUl9DQUNIRV9VVElMU19IXworI2RlZmluZSBXRUJQX1VUSUxTX0NPTE9SX0NBQ0hFX1VUSUxTX0hfCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCisjZWxzZQorI2luY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvd2VicC90eXBlcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8vIE1haW4gY29sb3IgY2FjaGUgc3RydWN0LgordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MzJfdCAqY29sb3JzXzsgIC8vIGNvbG9yIGVudHJpZXMKKyAgaW50IGhhc2hfc2hpZnRfOyAgICAvLyBIYXNoIHNoaWZ0OiAzMiAtIGhhc2hfYml0c18uCisgIGludCBoYXNoX2JpdHNfOworfSBWUDhMQ29sb3JDYWNoZTsKKworc3RhdGljIGNvbnN0IHVpbnQ2NF90IGtIYXNoTXVsID0gMHgxZTM1YTdiZHVsbDsKKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhMSGFzaFBpeCh1aW50MzJfdCBhcmdiLCBpbnQgc2hpZnQpIHsKKyAgcmV0dXJuIChpbnQpKCgoYXJnYiAqIGtIYXNoTXVsKSAmIDB4ZmZmZmZmZmZ1KSA+PiBzaGlmdCk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBWUDhMQ29sb3JDYWNoZUxvb2t1cCgKKyAgICBjb25zdCBWUDhMQ29sb3JDYWNoZSogY29uc3QgY2MsIHVpbnQzMl90IGtleSkgeworICBTQl9EQ0hFQ0soKGtleSA+PiBjYy0+aGFzaF9iaXRzXykgPT0gMHUpOworICByZXR1cm4gY2MtPmNvbG9yc19ba2V5XTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVlA4TENvbG9yQ2FjaGVTZXQoY29uc3QgVlA4TENvbG9yQ2FjaGUqIGNvbnN0IGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qga2V5LCB1aW50MzJfdCBhcmdiKSB7CisgIFNCX0RDSEVDSygoa2V5ID4+IGNjLT5oYXNoX2JpdHNfKSA9PSAwdSk7CisgIGNjLT5jb2xvcnNfW2tleV0gPSBhcmdiOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWUDhMQ29sb3JDYWNoZUluc2VydChjb25zdCBWUDhMQ29sb3JDYWNoZSogY29uc3QgY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhcmdiKSB7CisgIGNvbnN0IGludCBrZXkgPSBWUDhMSGFzaFBpeChhcmdiLCBjYy0+aGFzaF9zaGlmdF8pOworICBjYy0+Y29sb3JzX1trZXldID0gYXJnYjsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhMQ29sb3JDYWNoZUdldEluZGV4KGNvbnN0IFZQOExDb2xvckNhY2hlKiBjb25zdCBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhcmdiKSB7CisgIHJldHVybiBWUDhMSGFzaFBpeChhcmdiLCBjYy0+aGFzaF9zaGlmdF8pOworfQorCisvLyBSZXR1cm4gdGhlIGtleSBpZiBjYyBjb250YWlucyBhcmdiLCBhbmQgLTEgb3RoZXJ3aXNlLgorc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhMQ29sb3JDYWNoZUNvbnRhaW5zKGNvbnN0IFZQOExDb2xvckNhY2hlKiBjb25zdCBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhcmdiKSB7CisgIGNvbnN0IGludCBrZXkgPSBWUDhMSGFzaFBpeChhcmdiLCBjYy0+aGFzaF9zaGlmdF8pOworICByZXR1cm4gKGNjLT5jb2xvcnNfW2tleV0gPT0gYXJnYikgPyBrZXkgOiAtMTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gSW5pdGlhbGl6ZXMgdGhlIGNvbG9yIGNhY2hlIHdpdGggJ2hhc2hfYml0cycgYml0cyBmb3IgdGhlIGtleXMuCisvLyBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgbWVtb3J5IGVycm9yLgoraW50IFZQOExDb2xvckNhY2hlSW5pdChWUDhMQ29sb3JDYWNoZSogY29uc3QgY29sb3JfY2FjaGUsIGludCBoYXNoX2JpdHMpOworCit2b2lkIFZQOExDb2xvckNhY2hlQ29weShjb25zdCBWUDhMQ29sb3JDYWNoZSogY29uc3Qgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgVlA4TENvbG9yQ2FjaGUqIGNvbnN0IGRzdCk7CisKKy8vIERlbGV0ZSB0aGUgbWVtb3J5IGFzc29jaWF0ZWQgdG8gY29sb3IgY2FjaGUuCit2b2lkIFZQOExDb2xvckNhY2hlQ2xlYXIoVlA4TENvbG9yQ2FjaGUqIGNvbnN0IGNvbG9yX2NhY2hlKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmICAvLyBXRUJQX1VUSUxTX0NPTE9SX0NBQ0hFX1VUSUxTX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvZW5kaWFuX2lubF91dGlscy5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL2VuZGlhbl9pbmxfdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2E5ZmI3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL2VuZGlhbl9pbmxfdXRpbHMuaApAQCAtMCwwICsxLDEwOSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEVuZGlhbiByZWxhdGVkIGZ1bmN0aW9ucy4KKworI2lmbmRlZiBXRUJQX1VUSUxTX0VORElBTl9JTkxfVVRJTFNfSF8KKyNkZWZpbmUgV0VCUF9VVElMU19FTkRJQU5fSU5MX1VUSUxTX0hfCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvYnl0ZV9zd2FwLmgiCisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJzcmMvd2VicC9jb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKyNpbmNsdWRlICJzcmMvd2VicC90eXBlcy5oIgorCisjaWYgZGVmaW5lZChXT1JEU19CSUdFTkRJQU4pCisjZGVmaW5lIEhUb0xFMzIgQlN3YXAzMgorI2RlZmluZSBIVG9MRTE2IEJTd2FwMTYKKyNlbHNlCisjZGVmaW5lIEhUb0xFMzIoeCkgKHgpCisjZGVmaW5lIEhUb0xFMTYoeCkgKHgpCisjZW5kaWYKKworI2lmICFkZWZpbmVkKEhBVkVfQ09ORklHX0gpCisjaWYgTE9DQUxfR0NDX1BSRVJFUSg0LDgpIHx8IF9faGFzX2J1aWx0aW4oX19idWlsdGluX2Jzd2FwMTYpCisjZGVmaW5lIEhBVkVfQlVJTFRJTl9CU1dBUDE2CisjZW5kaWYKKyNpZiBMT0NBTF9HQ0NfUFJFUkVRKDQsMykgfHwgX19oYXNfYnVpbHRpbihfX2J1aWx0aW5fYnN3YXAzMikKKyNkZWZpbmUgSEFWRV9CVUlMVElOX0JTV0FQMzIKKyNlbmRpZgorI2lmIExPQ0FMX0dDQ19QUkVSRVEoNCwzKSB8fCBfX2hhc19idWlsdGluKF9fYnVpbHRpbl9ic3dhcDY0KQorI2RlZmluZSBIQVZFX0JVSUxUSU5fQlNXQVA2NAorI2VuZGlmCisjZW5kaWYgIC8vICFIQVZFX0NPTkZJR19ICisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MTZfdCBCU3dhcDE2KHVpbnQxNl90IHgpIHsKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyAgcmV0dXJuIFNiQnl0ZVN3YXBVMTYoeCk7CisjZWxzZQorI2lmIGRlZmluZWQoSEFWRV9CVUlMVElOX0JTV0FQMTYpCisgIHJldHVybiBfX2J1aWx0aW5fYnN3YXAxNih4KTsKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCisgIHJldHVybiBfYnl0ZXN3YXBfdXNob3J0KHgpOworI2Vsc2UKKyAgLy8gZ2NjIHdpbGwgcmVjb2duaXplIGEgJ3JvcncgJDgsIC4uLicgaGVyZToKKyAgcmV0dXJuICh4ID4+IDgpIHwgKCh4ICYgMHhmZikgPDwgOCk7CisjZW5kaWYgIC8vIEhBVkVfQlVJTFRJTl9CU1dBUDE2CisjZW5kaWYgIC8vIGRlZmluZWQoU1RBUkJPQVJEKQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQlN3YXAzMih1aW50MzJfdCB4KSB7CisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisgIHJldHVybiBTYkJ5dGVTd2FwVTMyKHgpOworI2Vsc2UKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFMzMl9SMikKKyAgdWludDMyX3QgcmV0OworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAid3NiaCAgICVbcmV0XSwgJVt4XSAgICAgICAgICBcblx0IgorICAgICJyb3RyICAgJVtyZXRdLCAlW3JldF0sICAxNiAgIFxuXHQiCisgICAgOiBbcmV0XSI9ciIocmV0KQorICAgIDogW3hdInIiKHgpCisgICk7CisgIHJldHVybiByZXQ7CisjZWxpZiBkZWZpbmVkKEhBVkVfQlVJTFRJTl9CU1dBUDMyKQorICByZXR1cm4gX19idWlsdGluX2Jzd2FwMzIoeCk7CisjZWxpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCisgIHVpbnQzMl90IHN3YXBwZWRfYnl0ZXM7CisgIF9fYXNtX18gdm9sYXRpbGUoImJzd2FwICUwIiA6ICI9ciIoc3dhcHBlZF9ieXRlcykgOiAiMCIoeCkpOworICByZXR1cm4gc3dhcHBlZF9ieXRlczsKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCisgIHJldHVybiAodWludDMyX3QpX2J5dGVzd2FwX3Vsb25nKHgpOworI2Vsc2UKKyAgcmV0dXJuICh4ID4+IDI0KSB8ICgoeCA+PiA4KSAmIDB4ZmYwMCkgfCAoKHggPDwgOCkgJiAweGZmMDAwMCkgfCAoeCA8PCAyNCk7CisjZW5kaWYgIC8vIEhBVkVfQlVJTFRJTl9CU1dBUDMyCisjZW5kaWYgIC8vIGRlZmluZWQoU1RBUkJPQVJEKQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDY0X3QgQlN3YXA2NCh1aW50NjRfdCB4KSB7CisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisgIHJldHVybiBTYkJ5dGVTd2FwVTY0KHgpOworI2Vsc2UKKyNpZiBkZWZpbmVkKEhBVkVfQlVJTFRJTl9CU1dBUDY0KQorICByZXR1cm4gX19idWlsdGluX2Jzd2FwNjQoeCk7CisjZWxpZiBkZWZpbmVkKF9feDg2XzY0X18pCisgIHVpbnQ2NF90IHN3YXBwZWRfYnl0ZXM7CisgIF9fYXNtX18gdm9sYXRpbGUoImJzd2FwcSAlMCIgOiAiPXIiKHN3YXBwZWRfYnl0ZXMpIDogIjAiKHgpKTsKKyAgcmV0dXJuIHN3YXBwZWRfYnl0ZXM7CisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorICByZXR1cm4gKHVpbnQ2NF90KV9ieXRlc3dhcF91aW50NjQoeCk7CisjZWxzZSAgLy8gZ2VuZXJpYyBjb2RlIGZvciBzd2FwcGluZyA2NC1iaXQgdmFsdWVzIChzdWdnZXN0ZWQgYnkgYmRiQCkKKyAgeCA9ICgoeCAmIDB4ZmZmZmZmZmYwMDAwMDAwMHVsbCkgPj4gMzIpIHwgKCh4ICYgMHgwMDAwMDAwMGZmZmZmZmZmdWxsKSA8PCAzMik7CisgIHggPSAoKHggJiAweGZmZmYwMDAwZmZmZjAwMDB1bGwpID4+IDE2KSB8ICgoeCAmIDB4MDAwMGZmZmYwMDAwZmZmZnVsbCkgPDwgMTYpOworICB4ID0gKCh4ICYgMHhmZjAwZmYwMGZmMDBmZjAwdWxsKSA+PiAgOCkgfCAoKHggJiAweDAwZmYwMGZmMDBmZjAwZmZ1bGwpIDw8ICA4KTsKKyAgcmV0dXJuIHg7CisjZW5kaWYgIC8vIEhBVkVfQlVJTFRJTl9CU1dBUDY0CisjZW5kaWYgIC8vIGRlZmluZWQoU1RBUkJPQVJEKQorfQorCisjZW5kaWYgIC8vIFdFQlBfVVRJTFNfRU5ESUFOX0lOTF9VVElMU19IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL2ZpbHRlcnNfdXRpbHMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9maWx0ZXJzX3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJjMmMzNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9maWx0ZXJzX3V0aWxzLmMKQEAgLTAsMCArMSw3NiBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIGZpbHRlciBlc3RpbWF0aW9uCisvLworLy8gQXV0aG9yOiBVcnZhbmcgKHVydmFuZ0Bnb29nbGUuY29tKQorCisjaW5jbHVkZSAic3JjL3V0aWxzL2ZpbHRlcnNfdXRpbHMuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFF1aWNrIGVzdGltYXRlIG9mIGEgcG90ZW50aWFsbHkgaW50ZXJlc3RpbmcgZmlsdGVyIG1vZGUgdG8gdHJ5LgorCisjZGVmaW5lIFNNQVggMTYKKyNkZWZpbmUgU0RJRkYoYSwgYikgKGFicygoYSkgLSAoYikpID4+IDQpICAgLy8gU2NvcmluZyBkaWZmLCBpbiBbMC4uU01BWCkKKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBHcmFkaWVudFByZWRpY3Rvcih1aW50OF90IGEsIHVpbnQ4X3QgYiwgdWludDhfdCBjKSB7CisgIGNvbnN0IGludCBnID0gYSArIGIgLSBjOworICByZXR1cm4gKChnICYgfjB4ZmYpID09IDApID8gZyA6IChnIDwgMCkgPyAwIDogMjU1OyAgLy8gY2xpcCB0byA4Yml0Cit9CisKK1dFQlBfRklMVEVSX1RZUEUgV2ViUEVzdGltYXRlQmVzdEZpbHRlcihjb25zdCB1aW50OF90KiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSkgeworICBpbnQgaSwgajsKKyAgaW50IGJpbnNbV0VCUF9GSUxURVJfTEFTVF1bU01BWF07CisgIG1lbXNldChiaW5zLCAwLCBzaXplb2YoYmlucykpOworCisgIC8vIFdlIG9ubHkgc2FtcGxlIGV2ZXJ5IG90aGVyIHBpeGVscy4gVGhhdCdzIGVub3VnaC4KKyAgZm9yIChqID0gMjsgaiA8IGhlaWdodCAtIDE7IGogKz0gMikgeworICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHAgPSBkYXRhICsgaiAqIHN0cmlkZTsKKyAgICBpbnQgbWVhbiA9IHBbMF07CisgICAgZm9yIChpID0gMjsgaSA8IHdpZHRoIC0gMTsgaSArPSAyKSB7CisgICAgICBjb25zdCBpbnQgZGlmZjAgPSBTRElGRihwW2ldLCBtZWFuKTsKKyAgICAgIGNvbnN0IGludCBkaWZmMSA9IFNESUZGKHBbaV0sIHBbaSAtIDFdKTsKKyAgICAgIGNvbnN0IGludCBkaWZmMiA9IFNESUZGKHBbaV0sIHBbaSAtIHdpZHRoXSk7CisgICAgICBjb25zdCBpbnQgZ3JhZF9wcmVkID0KKyAgICAgICAgICBHcmFkaWVudFByZWRpY3RvcihwW2kgLSAxXSwgcFtpIC0gd2lkdGhdLCBwW2kgLSB3aWR0aCAtIDFdKTsKKyAgICAgIGNvbnN0IGludCBkaWZmMyA9IFNESUZGKHBbaV0sIGdyYWRfcHJlZCk7CisgICAgICBiaW5zW1dFQlBfRklMVEVSX05PTkVdW2RpZmYwXSA9IDE7CisgICAgICBiaW5zW1dFQlBfRklMVEVSX0hPUklaT05UQUxdW2RpZmYxXSA9IDE7CisgICAgICBiaW5zW1dFQlBfRklMVEVSX1ZFUlRJQ0FMXVtkaWZmMl0gPSAxOworICAgICAgYmluc1tXRUJQX0ZJTFRFUl9HUkFESUVOVF1bZGlmZjNdID0gMTsKKyAgICAgIG1lYW4gPSAoMyAqIG1lYW4gKyBwW2ldICsgMikgPj4gMjsKKyAgICB9CisgIH0KKyAgeworICAgIGludCBmaWx0ZXI7CisgICAgV0VCUF9GSUxURVJfVFlQRSBiZXN0X2ZpbHRlciA9IFdFQlBfRklMVEVSX05PTkU7CisgICAgaW50IGJlc3Rfc2NvcmUgPSAweDdmZmZmZmZmOworICAgIGZvciAoZmlsdGVyID0gV0VCUF9GSUxURVJfTk9ORTsgZmlsdGVyIDwgV0VCUF9GSUxURVJfTEFTVDsgKytmaWx0ZXIpIHsKKyAgICAgIGludCBzY29yZSA9IDA7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgU01BWDsgKytpKSB7CisgICAgICAgIGlmIChiaW5zW2ZpbHRlcl1baV0gPiAwKSB7CisgICAgICAgICAgc2NvcmUgKz0gaTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHNjb3JlIDwgYmVzdF9zY29yZSkgeworICAgICAgICBiZXN0X3Njb3JlID0gc2NvcmU7CisgICAgICAgIGJlc3RfZmlsdGVyID0gKFdFQlBfRklMVEVSX1RZUEUpZmlsdGVyOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYmVzdF9maWx0ZXI7CisgIH0KK30KKworI3VuZGVmIFNNQVgKKyN1bmRlZiBTRElGRgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL2ZpbHRlcnNfdXRpbHMuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9maWx0ZXJzX3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEwZjJmYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9maWx0ZXJzX3V0aWxzLmgKQEAgLTAsMCArMSwzMiBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFNwYXRpYWwgcHJlZGljdGlvbiB1c2luZyB2YXJpb3VzIGZpbHRlcnMKKy8vCisvLyBBdXRob3I6IFVydmFuZyAodXJ2YW5nQGdvb2dsZS5jb20pCisKKyNpZm5kZWYgV0VCUF9VVElMU19GSUxURVJTX1VUSUxTX0hfCisjZGVmaW5lIFdFQlBfVVRJTFNfRklMVEVSU19VVElMU19IXworCisjaW5jbHVkZSAic3JjL3dlYnAvdHlwZXMuaCIKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8vIEZhc3QgZXN0aW1hdGUgb2YgYSBwb3RlbnRpYWxseSBnb29kIGZpbHRlci4KK1dFQlBfRklMVEVSX1RZUEUgV2ViUEVzdGltYXRlQmVzdEZpbHRlcihjb25zdCB1aW50OF90KiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvKiBXRUJQX1VUSUxTX0ZJTFRFUlNfVVRJTFNfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9odWZmbWFuX2VuY29kZV91dGlscy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL2h1ZmZtYW5fZW5jb2RlX3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYzYjFiYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9odWZmbWFuX2VuY29kZV91dGlscy5jCkBAIC0wLDAgKzEsNDE3IEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQXV0aG9yOiBKeXJraSBBbGFrdWlqYWxhIChqeXJraUBnb29nbGUuY29tKQorLy8KKy8vIEVudHJvcHkgZW5jb2RpbmcgKEh1ZmZtYW4pIGZvciB3ZWJwIGxvc3NsZXNzLgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAic3JjL3V0aWxzL2h1ZmZtYW5fZW5jb2RlX3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL3dlYnAvZm9ybWF0X2NvbnN0YW50cy5oIgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVXRpbCBmdW5jdGlvbiB0byBvcHRpbWl6ZSB0aGUgc3ltYm9sIG1hcCBmb3IgUkxFIGNvZGluZworCisvLyBIZXVyaXN0aWNzIGZvciBzZWxlY3RpbmcgdGhlIHN0cmlkZSByYW5nZXMgdG8gY29sbGFwc2UuCitzdGF0aWMgaW50IFZhbHVlc1Nob3VsZEJlQ29sbGFwc2VkVG9TdHJpZGVBdmVyYWdlKGludCBhLCBpbnQgYikgeworICByZXR1cm4gYWJzKGEgLSBiKSA8IDQ7Cit9CisKKy8vIENoYW5nZSB0aGUgcG9wdWxhdGlvbiBjb3VudHMgaW4gYSB3YXkgdGhhdCB0aGUgY29uc2VxdWVudAorLy8gSHVmZm1hbiB0cmVlIGNvbXByZXNzaW9uLCBlc3BlY2lhbGx5IGl0cyBSTEUtcGFydCwgZ2l2ZSBzbWFsbGVyIG91dHB1dC4KK3N0YXRpYyB2b2lkIE9wdGltaXplSHVmZm1hbkZvclJsZShpbnQgbGVuZ3RoLCB1aW50OF90KiBjb25zdCBnb29kX2Zvcl9ybGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGNvbnN0IGNvdW50cykgeworICAvLyAxKSBMZXQncyBtYWtlIHRoZSBIdWZmbWFuIGNvZGUgbW9yZSBjb21wYXRpYmxlIHdpdGggcmxlIGVuY29kaW5nLgorICBpbnQgaTsKKyAgZm9yICg7IGxlbmd0aCA+PSAwOyAtLWxlbmd0aCkgeworICAgIGlmIChsZW5ndGggPT0gMCkgeworICAgICAgcmV0dXJuOyAgLy8gQWxsIHplcm9zLgorICAgIH0KKyAgICBpZiAoY291bnRzW2xlbmd0aCAtIDFdICE9IDApIHsKKyAgICAgIC8vIE5vdyBjb3VudHNbMC4ubGVuZ3RoIC0gMV0gZG9lcyBub3QgaGF2ZSB0cmFpbGluZyB6ZXJvcy4KKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICAvLyAyKSBMZXQncyBtYXJrIGFsbCBwb3B1bGF0aW9uIGNvdW50cyB0aGF0IGFscmVhZHkgY2FuIGJlIGVuY29kZWQKKyAgLy8gd2l0aCBhbiBybGUgY29kZS4KKyAgeworICAgIC8vIExldCdzIG5vdCBzcG9pbCBhbnkgb2YgdGhlIGV4aXN0aW5nIGdvb2QgcmxlIGNvZGVzLgorICAgIC8vIE1hcmsgYW55IHNlcSBvZiAwJ3MgdGhhdCBpcyBsb25nZXIgYXMgNSBhcyBhIGdvb2RfZm9yX3JsZS4KKyAgICAvLyBNYXJrIGFueSBzZXEgb2Ygbm9uLTAncyB0aGF0IGlzIGxvbmdlciBhcyA3IGFzIGEgZ29vZF9mb3JfcmxlLgorICAgIHVpbnQzMl90IHN5bWJvbCA9IGNvdW50c1swXTsKKyAgICBpbnQgc3RyaWRlID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoICsgMTsgKytpKSB7CisgICAgICBpZiAoaSA9PSBsZW5ndGggfHwgY291bnRzW2ldICE9IHN5bWJvbCkgeworICAgICAgICBpZiAoKHN5bWJvbCA9PSAwICYmIHN0cmlkZSA+PSA1KSB8fAorICAgICAgICAgICAgKHN5bWJvbCAhPSAwICYmIHN0cmlkZSA+PSA3KSkgeworICAgICAgICAgIGludCBrOworICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBzdHJpZGU7ICsraykgeworICAgICAgICAgICAgZ29vZF9mb3JfcmxlW2kgLSBrIC0gMV0gPSAxOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdHJpZGUgPSAxOworICAgICAgICBpZiAoaSAhPSBsZW5ndGgpIHsKKyAgICAgICAgICBzeW1ib2wgPSBjb3VudHNbaV07CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgICsrc3RyaWRlOworICAgICAgfQorICAgIH0KKyAgfQorICAvLyAzKSBMZXQncyByZXBsYWNlIHRob3NlIHBvcHVsYXRpb24gY291bnRzIHRoYXQgbGVhZCB0byBtb3JlIHJsZSBjb2Rlcy4KKyAgeworICAgIHVpbnQzMl90IHN0cmlkZSA9IDA7CisgICAgdWludDMyX3QgbGltaXQgPSBjb3VudHNbMF07CisgICAgdWludDMyX3Qgc3VtID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoICsgMTsgKytpKSB7CisgICAgICBpZiAoaSA9PSBsZW5ndGggfHwgZ29vZF9mb3JfcmxlW2ldIHx8CisgICAgICAgICAgKGkgIT0gMCAmJiBnb29kX2Zvcl9ybGVbaSAtIDFdKSB8fAorICAgICAgICAgICFWYWx1ZXNTaG91bGRCZUNvbGxhcHNlZFRvU3RyaWRlQXZlcmFnZShjb3VudHNbaV0sIGxpbWl0KSkgeworICAgICAgICBpZiAoc3RyaWRlID49IDQgfHwgKHN0cmlkZSA+PSAzICYmIHN1bSA9PSAwKSkgeworICAgICAgICAgIHVpbnQzMl90IGs7CisgICAgICAgICAgLy8gVGhlIHN0cmlkZSBtdXN0IGVuZCwgY29sbGFwc2Ugd2hhdCB3ZSBoYXZlLCBpZiB3ZSBoYXZlIGVub3VnaCAoNCkuCisgICAgICAgICAgdWludDMyX3QgY291bnQgPSAoc3VtICsgc3RyaWRlIC8gMikgLyBzdHJpZGU7CisgICAgICAgICAgaWYgKGNvdW50IDwgMSkgeworICAgICAgICAgICAgY291bnQgPSAxOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoc3VtID09IDApIHsKKyAgICAgICAgICAgIC8vIERvbid0IG1ha2UgYW4gYWxsIHplcm9zIHN0cmlkZSB0byBiZSB1cGdyYWRlZCB0byBvbmVzLgorICAgICAgICAgICAgY291bnQgPSAwOworICAgICAgICAgIH0KKyAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgc3RyaWRlOyArK2spIHsKKyAgICAgICAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gY2hhbmdlIHZhbHVlIGF0IGNvdW50c1tpXSwKKyAgICAgICAgICAgIC8vIHRoYXQgaXMgYWxyZWFkeSBiZWxvbmdpbmcgdG8gdGhlIG5leHQgc3RyaWRlLiBUaHVzIC0gMS4KKyAgICAgICAgICAgIGNvdW50c1tpIC0gayAtIDFdID0gY291bnQ7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0cmlkZSA9IDA7CisgICAgICAgIHN1bSA9IDA7CisgICAgICAgIGlmIChpIDwgbGVuZ3RoIC0gMykgeworICAgICAgICAgIC8vIEFsbCBpbnRlcmVzdGluZyBzdHJpZGVzIGhhdmUgYSBjb3VudCBvZiBhdCBsZWFzdCA0LAorICAgICAgICAgIC8vIGF0IGxlYXN0IHdoZW4gbm9uLXplcm9zLgorICAgICAgICAgIGxpbWl0ID0gKGNvdW50c1tpXSArIGNvdW50c1tpICsgMV0gKworICAgICAgICAgICAgICAgICAgIGNvdW50c1tpICsgMl0gKyBjb3VudHNbaSArIDNdICsgMikgLyA0OworICAgICAgICB9IGVsc2UgaWYgKGkgPCBsZW5ndGgpIHsKKyAgICAgICAgICBsaW1pdCA9IGNvdW50c1tpXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBsaW1pdCA9IDA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICsrc3RyaWRlOworICAgICAgaWYgKGkgIT0gbGVuZ3RoKSB7CisgICAgICAgIHN1bSArPSBjb3VudHNbaV07CisgICAgICAgIGlmIChzdHJpZGUgPj0gNCkgeworICAgICAgICAgIGxpbWl0ID0gKHN1bSArIHN0cmlkZSAvIDIpIC8gc3RyaWRlOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9CisKKy8vIEEgY29tcGFyZXIgZnVuY3Rpb24gZm9yIHR3byBIdWZmbWFuIHRyZWVzOiBzb3J0cyBmaXJzdCBieSAndG90YWwgY291bnQnCisvLyAobW9yZSBjb21lcyBmaXJzdCksIGFuZCB0aGVuIGJ5ICd2YWx1ZScgKG1vcmUgY29tZXMgZmlyc3QpLgorc3RhdGljIGludCBDb21wYXJlSHVmZm1hblRyZWVzKGNvbnN0IHZvaWQqIHB0cjEsIGNvbnN0IHZvaWQqIHB0cjIpIHsKKyAgY29uc3QgSHVmZm1hblRyZWUqIGNvbnN0IHQxID0gKGNvbnN0IEh1ZmZtYW5UcmVlKilwdHIxOworICBjb25zdCBIdWZmbWFuVHJlZSogY29uc3QgdDIgPSAoY29uc3QgSHVmZm1hblRyZWUqKXB0cjI7CisgIGlmICh0MS0+dG90YWxfY291bnRfID4gdDItPnRvdGFsX2NvdW50XykgeworICAgIHJldHVybiAtMTsKKyAgfSBlbHNlIGlmICh0MS0+dG90YWxfY291bnRfIDwgdDItPnRvdGFsX2NvdW50XykgeworICAgIHJldHVybiAxOworICB9IGVsc2UgeworICAgIGFzc2VydCh0MS0+dmFsdWVfICE9IHQyLT52YWx1ZV8pOworICAgIHJldHVybiAodDEtPnZhbHVlXyA8IHQyLT52YWx1ZV8pID8gLTEgOiAxOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFNldEJpdERlcHRocyhjb25zdCBIdWZmbWFuVHJlZSogY29uc3QgdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBIdWZmbWFuVHJlZSogY29uc3QgcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBiaXRfZGVwdGhzLCBpbnQgbGV2ZWwpIHsKKyAgaWYgKHRyZWUtPnBvb2xfaW5kZXhfbGVmdF8gPj0gMCkgeworICAgIFNldEJpdERlcHRocygmcG9vbFt0cmVlLT5wb29sX2luZGV4X2xlZnRfXSwgcG9vbCwgYml0X2RlcHRocywgbGV2ZWwgKyAxKTsKKyAgICBTZXRCaXREZXB0aHMoJnBvb2xbdHJlZS0+cG9vbF9pbmRleF9yaWdodF9dLCBwb29sLCBiaXRfZGVwdGhzLCBsZXZlbCArIDEpOworICB9IGVsc2UgeworICAgIGJpdF9kZXB0aHNbdHJlZS0+dmFsdWVfXSA9IGxldmVsOworICB9Cit9CisKKy8vIENyZWF0ZSBhbiBvcHRpbWFsIEh1ZmZtYW4gdHJlZS4KKy8vCisvLyAoZGF0YSxsZW5ndGgpOiBwb3B1bGF0aW9uIGNvdW50cy4KKy8vIHRyZWVfbGltaXQ6IG1heGltdW0gYml0IGRlcHRoIChpbmNsdXNpdmUpIG9mIHRoZSBjb2Rlcy4KKy8vIGJpdF9kZXB0aHNbXTogaG93IG1hbnkgYml0cyBhcmUgdXNlZCBmb3IgdGhlIHN5bWJvbC4KKy8vCisvLyBSZXR1cm5zIDAgd2hlbiBhbiBlcnJvciBoYXMgb2NjdXJyZWQuCisvLworLy8gVGhlIGNhdGNoIGhlcmUgaXMgdGhhdCB0aGUgdHJlZSBjYW5ub3QgYmUgYXJiaXRyYXJpbHkgZGVlcAorLy8KKy8vIGNvdW50X2xpbWl0IGlzIHRoZSB2YWx1ZSB0aGF0IGlzIHRvIGJlIGZha2VkIGFzIHRoZSBtaW5pbXVtIHZhbHVlCisvLyBhbmQgdGhpcyBtaW5pbXVtIHZhbHVlIGlzIHJhaXNlZCB1bnRpbCB0aGUgdHJlZSBtYXRjaGVzIHRoZQorLy8gbWF4aW11bSBsZW5ndGggcmVxdWlyZW1lbnQuCisvLworLy8gVGhpcyBhbGdvcml0aG0gaXMgbm90IG9mIGV4Y2VsbGVudCBwZXJmb3JtYW5jZSBmb3IgdmVyeSBsb25nIGRhdGEgYmxvY2tzLAorLy8gZXNwZWNpYWxseSB3aGVuIHBvcHVsYXRpb24gY291bnRzIGFyZSBsb25nZXIgdGhhbiAyKip0cmVlX2xpbWl0LCBidXQKKy8vIHdlIGFyZSBub3QgcGxhbm5pbmcgdG8gdXNlIHRoaXMgd2l0aCBleHRyZW1lbHkgbG9uZyBibG9ja3MuCisvLworLy8gU2VlIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSHVmZm1hbl9jb2RpbmcKK3N0YXRpYyB2b2lkIEdlbmVyYXRlT3B0aW1hbFRyZWUoY29uc3QgdWludDMyX3QqIGNvbnN0IGhpc3RvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhpc3RvZ3JhbV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVHJlZSogdHJlZSwgaW50IHRyZWVfZGVwdGhfbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IGJpdF9kZXB0aHMpIHsKKyAgdWludDMyX3QgY291bnRfbWluOworICBIdWZmbWFuVHJlZSogdHJlZV9wb29sOworICBpbnQgdHJlZV9zaXplX29yaWcgPSAwOworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgaGlzdG9ncmFtX3NpemU7ICsraSkgeworICAgIGlmIChoaXN0b2dyYW1baV0gIT0gMCkgeworICAgICAgKyt0cmVlX3NpemVfb3JpZzsKKyAgICB9CisgIH0KKworICBpZiAodHJlZV9zaXplX29yaWcgPT0gMCkgeyAgIC8vIHByZXR0eSBvcHRpbWFsIGFscmVhZHkhCisgICAgcmV0dXJuOworICB9CisKKyAgdHJlZV9wb29sID0gdHJlZSArIHRyZWVfc2l6ZV9vcmlnOworCisgIC8vIEZvciBibG9jayBzaXplcyB3aXRoIGxlc3MgdGhhbiA2NGsgc3ltYm9scyB3ZSBuZXZlciBuZWVkIHRvIGRvIGEKKyAgLy8gc2Vjb25kIGl0ZXJhdGlvbiBvZiB0aGlzIGxvb3AuCisgIC8vIElmIHdlIGFjdHVhbGx5IHN0YXJ0IHJ1bm5pbmcgaW5zaWRlIHRoaXMgbG9vcCBhIGxvdCwgd2Ugd291bGQgcGVyaGFwcworICAvLyBiZSBiZXR0ZXIgb2ZmIHdpdGggdGhlIEthdGFqYWluZW4gYWxnb3JpdGhtLgorICBhc3NlcnQodHJlZV9zaXplX29yaWcgPD0gKDEgPDwgKHRyZWVfZGVwdGhfbGltaXQgLSAxKSkpOworICBmb3IgKGNvdW50X21pbiA9IDE7IDsgY291bnRfbWluICo9IDIpIHsKKyAgICBpbnQgdHJlZV9zaXplID0gdHJlZV9zaXplX29yaWc7CisgICAgLy8gV2UgbmVlZCB0byBwYWNrIHRoZSBIdWZmbWFuIHRyZWUgaW4gdHJlZV9kZXB0aF9saW1pdCBiaXRzLgorICAgIC8vIFNvLCB3ZSB0cnkgYnkgZmFraW5nIGhpc3RvZ3JhbSBlbnRyaWVzIHRvIGJlIGF0IGxlYXN0ICdjb3VudF9taW4nLgorICAgIGludCBpZHggPSAwOworICAgIGludCBqOworICAgIGZvciAoaiA9IDA7IGogPCBoaXN0b2dyYW1fc2l6ZTsgKytqKSB7CisgICAgICBpZiAoaGlzdG9ncmFtW2pdICE9IDApIHsKKyAgICAgICAgY29uc3QgdWludDMyX3QgY291bnQgPQorICAgICAgICAgICAgKGhpc3RvZ3JhbVtqXSA8IGNvdW50X21pbikgPyBjb3VudF9taW4gOiBoaXN0b2dyYW1bal07CisgICAgICAgIHRyZWVbaWR4XS50b3RhbF9jb3VudF8gPSBjb3VudDsKKyAgICAgICAgdHJlZVtpZHhdLnZhbHVlXyA9IGo7CisgICAgICAgIHRyZWVbaWR4XS5wb29sX2luZGV4X2xlZnRfID0gLTE7CisgICAgICAgIHRyZWVbaWR4XS5wb29sX2luZGV4X3JpZ2h0XyA9IC0xOworICAgICAgICArK2lkeDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBCdWlsZCB0aGUgSHVmZm1hbiB0cmVlLgorICAgIHFzb3J0KHRyZWUsIHRyZWVfc2l6ZSwgc2l6ZW9mKCp0cmVlKSwgQ29tcGFyZUh1ZmZtYW5UcmVlcyk7CisKKyAgICBpZiAodHJlZV9zaXplID4gMSkgeyAgLy8gTm9ybWFsIGNhc2UuCisgICAgICBpbnQgdHJlZV9wb29sX3NpemUgPSAwOworICAgICAgd2hpbGUgKHRyZWVfc2l6ZSA+IDEpIHsgIC8vIEZpbmlzaCB3aGVuIHdlIGhhdmUgb25seSBvbmUgcm9vdC4KKyAgICAgICAgdWludDMyX3QgY291bnQ7CisgICAgICAgIHRyZWVfcG9vbFt0cmVlX3Bvb2xfc2l6ZSsrXSA9IHRyZWVbdHJlZV9zaXplIC0gMV07CisgICAgICAgIHRyZWVfcG9vbFt0cmVlX3Bvb2xfc2l6ZSsrXSA9IHRyZWVbdHJlZV9zaXplIC0gMl07CisgICAgICAgIGNvdW50ID0gdHJlZV9wb29sW3RyZWVfcG9vbF9zaXplIC0gMV0udG90YWxfY291bnRfICsKKyAgICAgICAgICAgICAgICB0cmVlX3Bvb2xbdHJlZV9wb29sX3NpemUgLSAyXS50b3RhbF9jb3VudF87CisgICAgICAgIHRyZWVfc2l6ZSAtPSAyOworICAgICAgICB7CisgICAgICAgICAgLy8gU2VhcmNoIGZvciB0aGUgaW5zZXJ0aW9uIHBvaW50LgorICAgICAgICAgIGludCBrOworICAgICAgICAgIGZvciAoayA9IDA7IGsgPCB0cmVlX3NpemU7ICsraykgeworICAgICAgICAgICAgaWYgKHRyZWVba10udG90YWxfY291bnRfIDw9IGNvdW50KSB7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBtZW1tb3ZlKHRyZWUgKyAoayArIDEpLCB0cmVlICsgaywgKHRyZWVfc2l6ZSAtIGspICogc2l6ZW9mKCp0cmVlKSk7CisgICAgICAgICAgdHJlZVtrXS50b3RhbF9jb3VudF8gPSBjb3VudDsKKyAgICAgICAgICB0cmVlW2tdLnZhbHVlXyA9IC0xOworCisgICAgICAgICAgdHJlZVtrXS5wb29sX2luZGV4X2xlZnRfID0gdHJlZV9wb29sX3NpemUgLSAxOworICAgICAgICAgIHRyZWVba10ucG9vbF9pbmRleF9yaWdodF8gPSB0cmVlX3Bvb2xfc2l6ZSAtIDI7CisgICAgICAgICAgdHJlZV9zaXplID0gdHJlZV9zaXplICsgMTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgU2V0Qml0RGVwdGhzKCZ0cmVlWzBdLCB0cmVlX3Bvb2wsIGJpdF9kZXB0aHMsIDApOworICAgIH0gZWxzZSBpZiAodHJlZV9zaXplID09IDEpIHsgIC8vIFRyaXZpYWwgY2FzZTogb25seSBvbmUgZWxlbWVudC4KKyAgICAgIGJpdF9kZXB0aHNbdHJlZVswXS52YWx1ZV9dID0gMTsKKyAgICB9CisKKyAgICB7CisgICAgICAvLyBUZXN0IGlmIHRoaXMgSHVmZm1hbiB0cmVlIHNhdGlzZmllcyBvdXIgJ3RyZWVfZGVwdGhfbGltaXQnIGNyaXRlcmlhLgorICAgICAgaW50IG1heF9kZXB0aCA9IGJpdF9kZXB0aHNbMF07CisgICAgICBmb3IgKGogPSAxOyBqIDwgaGlzdG9ncmFtX3NpemU7ICsraikgeworICAgICAgICBpZiAobWF4X2RlcHRoIDwgYml0X2RlcHRoc1tqXSkgeworICAgICAgICAgIG1heF9kZXB0aCA9IGJpdF9kZXB0aHNbal07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChtYXhfZGVwdGggPD0gdHJlZV9kZXB0aF9saW1pdCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvZGluZyBvZiB0aGUgSHVmZm1hbiB0cmVlIHZhbHVlcworCitzdGF0aWMgSHVmZm1hblRyZWVUb2tlbiogQ29kZVJlcGVhdGVkVmFsdWVzKGludCByZXBldGl0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRyZWVUb2tlbiogdG9rZW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWUsIGludCBwcmV2X3ZhbHVlKSB7CisgIGFzc2VydCh2YWx1ZSA8PSBNQVhfQUxMT1dFRF9DT0RFX0xFTkdUSCk7CisgIGlmICh2YWx1ZSAhPSBwcmV2X3ZhbHVlKSB7CisgICAgdG9rZW5zLT5jb2RlID0gdmFsdWU7CisgICAgdG9rZW5zLT5leHRyYV9iaXRzID0gMDsKKyAgICArK3Rva2VuczsKKyAgICAtLXJlcGV0aXRpb25zOworICB9CisgIHdoaWxlIChyZXBldGl0aW9ucyA+PSAxKSB7CisgICAgaWYgKHJlcGV0aXRpb25zIDwgMykgeworICAgICAgaW50IGk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgcmVwZXRpdGlvbnM7ICsraSkgeworICAgICAgICB0b2tlbnMtPmNvZGUgPSB2YWx1ZTsKKyAgICAgICAgdG9rZW5zLT5leHRyYV9iaXRzID0gMDsKKyAgICAgICAgKyt0b2tlbnM7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgaWYgKHJlcGV0aXRpb25zIDwgNykgeworICAgICAgdG9rZW5zLT5jb2RlID0gMTY7CisgICAgICB0b2tlbnMtPmV4dHJhX2JpdHMgPSByZXBldGl0aW9ucyAtIDM7CisgICAgICArK3Rva2VuczsKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSB7CisgICAgICB0b2tlbnMtPmNvZGUgPSAxNjsKKyAgICAgIHRva2Vucy0+ZXh0cmFfYml0cyA9IDM7CisgICAgICArK3Rva2VuczsKKyAgICAgIHJlcGV0aXRpb25zIC09IDY7CisgICAgfQorICB9CisgIHJldHVybiB0b2tlbnM7Cit9CisKK3N0YXRpYyBIdWZmbWFuVHJlZVRva2VuKiBDb2RlUmVwZWF0ZWRaZXJvcyhpbnQgcmVwZXRpdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRyZWVUb2tlbiogdG9rZW5zKSB7CisgIHdoaWxlIChyZXBldGl0aW9ucyA+PSAxKSB7CisgICAgaWYgKHJlcGV0aXRpb25zIDwgMykgeworICAgICAgaW50IGk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgcmVwZXRpdGlvbnM7ICsraSkgeworICAgICAgICB0b2tlbnMtPmNvZGUgPSAwOyAgIC8vIDAtdmFsdWUKKyAgICAgICAgdG9rZW5zLT5leHRyYV9iaXRzID0gMDsKKyAgICAgICAgKyt0b2tlbnM7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgaWYgKHJlcGV0aXRpb25zIDwgMTEpIHsKKyAgICAgIHRva2Vucy0+Y29kZSA9IDE3OworICAgICAgdG9rZW5zLT5leHRyYV9iaXRzID0gcmVwZXRpdGlvbnMgLSAzOworICAgICAgKyt0b2tlbnM7CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgaWYgKHJlcGV0aXRpb25zIDwgMTM5KSB7CisgICAgICB0b2tlbnMtPmNvZGUgPSAxODsKKyAgICAgIHRva2Vucy0+ZXh0cmFfYml0cyA9IHJlcGV0aXRpb25zIC0gMTE7CisgICAgICArK3Rva2VuczsKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSB7CisgICAgICB0b2tlbnMtPmNvZGUgPSAxODsKKyAgICAgIHRva2Vucy0+ZXh0cmFfYml0cyA9IDB4N2Y7ICAvLyAxMzggcmVwZWF0ZWQgMHMKKyAgICAgICsrdG9rZW5zOworICAgICAgcmVwZXRpdGlvbnMgLT0gMTM4OworICAgIH0KKyAgfQorICByZXR1cm4gdG9rZW5zOworfQorCitpbnQgVlA4TENyZWF0ZUNvbXByZXNzZWRIdWZmbWFuVHJlZShjb25zdCBIdWZmbWFuVHJlZUNvZGUqIGNvbnN0IHRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVHJlZVRva2VuKiB0b2tlbnMsIGludCBtYXhfdG9rZW5zKSB7CisgIEh1ZmZtYW5UcmVlVG9rZW4qIGNvbnN0IHN0YXJ0aW5nX3Rva2VuID0gdG9rZW5zOworICBIdWZmbWFuVHJlZVRva2VuKiBjb25zdCBlbmRpbmdfdG9rZW4gPSB0b2tlbnMgKyBtYXhfdG9rZW5zOworICBjb25zdCBpbnQgZGVwdGhfc2l6ZSA9IHRyZWUtPm51bV9zeW1ib2xzOworICBpbnQgcHJldl92YWx1ZSA9IDg7ICAvLyA4IGlzIHRoZSBpbml0aWFsIHZhbHVlIGZvciBybGUuCisgIGludCBpID0gMDsKKyAgYXNzZXJ0KHRva2VucyAhPSBOVUxMKTsKKyAgd2hpbGUgKGkgPCBkZXB0aF9zaXplKSB7CisgICAgY29uc3QgaW50IHZhbHVlID0gdHJlZS0+Y29kZV9sZW5ndGhzW2ldOworICAgIGludCBrID0gaSArIDE7CisgICAgaW50IHJ1bnM7CisgICAgd2hpbGUgKGsgPCBkZXB0aF9zaXplICYmIHRyZWUtPmNvZGVfbGVuZ3Roc1trXSA9PSB2YWx1ZSkgKytrOworICAgIHJ1bnMgPSBrIC0gaTsKKyAgICBpZiAodmFsdWUgPT0gMCkgeworICAgICAgdG9rZW5zID0gQ29kZVJlcGVhdGVkWmVyb3MocnVucywgdG9rZW5zKTsKKyAgICB9IGVsc2UgeworICAgICAgdG9rZW5zID0gQ29kZVJlcGVhdGVkVmFsdWVzKHJ1bnMsIHRva2VucywgdmFsdWUsIHByZXZfdmFsdWUpOworICAgICAgcHJldl92YWx1ZSA9IHZhbHVlOworICAgIH0KKyAgICBpICs9IHJ1bnM7CisgICAgYXNzZXJ0KHRva2VucyA8PSBlbmRpbmdfdG9rZW4pOworICB9CisgICh2b2lkKWVuZGluZ190b2tlbjsgICAgLy8gc3VwcHJlc3MgJ3VudXNlZCB2YXJpYWJsZScgd2FybmluZworICByZXR1cm4gKGludCkodG9rZW5zIC0gc3RhcnRpbmdfdG9rZW4pOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBQcmUtcmV2ZXJzZWQgNC1iaXQgdmFsdWVzLgorc3RhdGljIGNvbnN0IHVpbnQ4X3Qga1JldmVyc2VkQml0c1sxNl0gPSB7CisgIDB4MCwgMHg4LCAweDQsIDB4YywgMHgyLCAweGEsIDB4NiwgMHhlLAorICAweDEsIDB4OSwgMHg1LCAweGQsIDB4MywgMHhiLCAweDcsIDB4ZgorfTsKKworc3RhdGljIHVpbnQzMl90IFJldmVyc2VCaXRzKGludCBudW1fYml0cywgdWludDMyX3QgYml0cykgeworICB1aW50MzJfdCByZXR2YWwgPSAwOworICBpbnQgaSA9IDA7CisgIHdoaWxlIChpIDwgbnVtX2JpdHMpIHsKKyAgICBpICs9IDQ7CisgICAgcmV0dmFsIHw9IGtSZXZlcnNlZEJpdHNbYml0cyAmIDB4Zl0gPDwgKE1BWF9BTExPV0VEX0NPREVfTEVOR1RIICsgMSAtIGkpOworICAgIGJpdHMgPj49IDQ7CisgIH0KKyAgcmV0dmFsID4+PSAoTUFYX0FMTE9XRURfQ09ERV9MRU5HVEggKyAxIC0gbnVtX2JpdHMpOworICByZXR1cm4gcmV0dmFsOworfQorCisvLyBHZXQgdGhlIGFjdHVhbCBiaXQgdmFsdWVzIGZvciBhIHRyZWUgb2YgYml0IGRlcHRocy4KK3N0YXRpYyB2b2lkIENvbnZlcnRCaXREZXB0aHNUb1N5bWJvbHMoSHVmZm1hblRyZWVDb2RlKiBjb25zdCB0cmVlKSB7CisgIC8vIDAgYml0LWRlcHRoIG1lYW5zIHRoYXQgdGhlIHN5bWJvbCBkb2VzIG5vdCBleGlzdC4KKyAgaW50IGk7CisgIGludCBsZW47CisgIHVpbnQzMl90IG5leHRfY29kZVtNQVhfQUxMT1dFRF9DT0RFX0xFTkdUSCArIDFdOworICBpbnQgZGVwdGhfY291bnRbTUFYX0FMTE9XRURfQ09ERV9MRU5HVEggKyAxXSA9IHsgMCB9OworCisgIGFzc2VydCh0cmVlICE9IE5VTEwpOworICBsZW4gPSB0cmVlLT5udW1fc3ltYm9sczsKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7CisgICAgY29uc3QgaW50IGNvZGVfbGVuZ3RoID0gdHJlZS0+Y29kZV9sZW5ndGhzW2ldOworICAgIGFzc2VydChjb2RlX2xlbmd0aCA8PSBNQVhfQUxMT1dFRF9DT0RFX0xFTkdUSCk7CisgICAgKytkZXB0aF9jb3VudFtjb2RlX2xlbmd0aF07CisgIH0KKyAgZGVwdGhfY291bnRbMF0gPSAwOyAgLy8gaWdub3JlIHVudXNlZCBzeW1ib2wKKyAgbmV4dF9jb2RlWzBdID0gMDsKKyAgeworICAgIHVpbnQzMl90IGNvZGUgPSAwOworICAgIGZvciAoaSA9IDE7IGkgPD0gTUFYX0FMTE9XRURfQ09ERV9MRU5HVEg7ICsraSkgeworICAgICAgY29kZSA9IChjb2RlICsgZGVwdGhfY291bnRbaSAtIDFdKSA8PCAxOworICAgICAgbmV4dF9jb2RlW2ldID0gY29kZTsKKyAgICB9CisgIH0KKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7CisgICAgY29uc3QgaW50IGNvZGVfbGVuZ3RoID0gdHJlZS0+Y29kZV9sZW5ndGhzW2ldOworICAgIHRyZWUtPmNvZGVzW2ldID0gUmV2ZXJzZUJpdHMoY29kZV9sZW5ndGgsIG5leHRfY29kZVtjb2RlX2xlbmd0aF0rKyk7CisgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1haW4gZW50cnkgcG9pbnQKKwordm9pZCBWUDhMQ3JlYXRlSHVmZm1hblRyZWUodWludDMyX3QqIGNvbnN0IGhpc3RvZ3JhbSwgaW50IHRyZWVfZGVwdGhfbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBidWZfcmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRyZWUqIGNvbnN0IGh1ZmZfdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UcmVlQ29kZSogY29uc3QgaHVmZl9jb2RlKSB7CisgIGNvbnN0IGludCBudW1fc3ltYm9scyA9IGh1ZmZfY29kZS0+bnVtX3N5bWJvbHM7CisgIG1lbXNldChidWZfcmxlLCAwLCBudW1fc3ltYm9scyAqIHNpemVvZigqYnVmX3JsZSkpOworICBPcHRpbWl6ZUh1ZmZtYW5Gb3JSbGUobnVtX3N5bWJvbHMsIGJ1Zl9ybGUsIGhpc3RvZ3JhbSk7CisgIEdlbmVyYXRlT3B0aW1hbFRyZWUoaGlzdG9ncmFtLCBudW1fc3ltYm9scywgaHVmZl90cmVlLCB0cmVlX2RlcHRoX2xpbWl0LAorICAgICAgICAgICAgICAgICAgICAgIGh1ZmZfY29kZS0+Y29kZV9sZW5ndGhzKTsKKyAgLy8gQ3JlYXRlIHRoZSBhY3R1YWwgYml0IGNvZGVzIGZvciB0aGUgYml0IGxlbmd0aHMuCisgIENvbnZlcnRCaXREZXB0aHNUb1N5bWJvbHMoaHVmZl9jb2RlKTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9odWZmbWFuX2VuY29kZV91dGlscy5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL2h1ZmZtYW5fZW5jb2RlX3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U2NzYzYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9odWZmbWFuX2VuY29kZV91dGlscy5oCkBAIC0wLDAgKzEsNjAgQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBBdXRob3I6IEp5cmtpIEFsYWt1aWphbGEgKGp5cmtpQGdvb2dsZS5jb20pCisvLworLy8gRW50cm9weSBlbmNvZGluZyAoSHVmZm1hbikgZm9yIHdlYnAgbG9zc2xlc3MKKworI2lmbmRlZiBXRUJQX1VUSUxTX0hVRkZNQU5fRU5DT0RFX1VUSUxTX0hfCisjZGVmaW5lIFdFQlBfVVRJTFNfSFVGRk1BTl9FTkNPREVfVVRJTFNfSF8KKworI2luY2x1ZGUgInNyYy93ZWJwL3R5cGVzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLy8gU3RydWN0IGZvciBob2xkaW5nIHRoZSB0cmVlIGhlYWRlciBpbiBjb2RlZCBmb3JtLgordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50OF90IGNvZGU7ICAgICAgICAgLy8gdmFsdWUgKDAuLjE1KSBvciBlc2NhcGUgY29kZSAoMTYsMTcsMTgpCisgIHVpbnQ4X3QgZXh0cmFfYml0czsgICAvLyBleHRyYSBiaXRzIGZvciBlc2NhcGUgY29kZXMKK30gSHVmZm1hblRyZWVUb2tlbjsKKworLy8gU3RydWN0IHRvIHJlcHJlc2VudCB0aGUgdHJlZSBjb2RlcyAoZGVwdGggYW5kIGJpdHMgYXJyYXkpLgordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQgICAgICAgbnVtX3N5bWJvbHM7ICAgLy8gTnVtYmVyIG9mIHN5bWJvbHMuCisgIHVpbnQ4X3QqICBjb2RlX2xlbmd0aHM7ICAvLyBDb2RlIGxlbmd0aHMgb2YgdGhlIHN5bWJvbHMuCisgIHVpbnQxNl90KiBjb2RlczsgICAgICAgICAvLyBTeW1ib2wgQ29kZXMuCit9IEh1ZmZtYW5UcmVlQ29kZTsKKworLy8gU3RydWN0IHRvIHJlcHJlc2VudCB0aGUgSHVmZm1hbiB0cmVlLgordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MzJfdCB0b3RhbF9jb3VudF87ICAgLy8gU3ltYm9sIGZyZXF1ZW5jeS4KKyAgaW50IHZhbHVlXzsgICAgICAgICAgICAgIC8vIFN5bWJvbCB2YWx1ZS4KKyAgaW50IHBvb2xfaW5kZXhfbGVmdF87ICAgIC8vIEluZGV4IGZvciB0aGUgbGVmdCBzdWItdHJlZS4KKyAgaW50IHBvb2xfaW5kZXhfcmlnaHRfOyAgIC8vIEluZGV4IGZvciB0aGUgcmlnaHQgc3ViLXRyZWUuCit9IEh1ZmZtYW5UcmVlOworCisvLyBUdXJuIHRoZSBIdWZmbWFuIHRyZWUgaW50byBhIHRva2VuIHNlcXVlbmNlLgorLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRva2VucyB1c2VkLgoraW50IFZQOExDcmVhdGVDb21wcmVzc2VkSHVmZm1hblRyZWUoY29uc3QgSHVmZm1hblRyZWVDb2RlKiBjb25zdCB0cmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRyZWVUb2tlbiogdG9rZW5zLCBpbnQgbWF4X3Rva2Vucyk7CisKKy8vIENyZWF0ZSBhbiBvcHRpbWl6ZWQgdHJlZSwgYW5kIHRva2VuaXplIGl0LgorLy8gJ2J1Zl9ybGUnIGFuZCAnaHVmZl90cmVlJyBhcmUgcHJlLWFsbG9jYXRlZCBhbmQgdGhlICd0cmVlJyBpcyB0aGUgY29uc3RydWN0ZWQKKy8vIGh1ZmZtYW4gY29kZSB0cmVlLgordm9pZCBWUDhMQ3JlYXRlSHVmZm1hblRyZWUodWludDMyX3QqIGNvbnN0IGhpc3RvZ3JhbSwgaW50IHRyZWVfZGVwdGhfbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBidWZfcmxlLCBIdWZmbWFuVHJlZSogY29uc3QgaHVmZl90cmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRyZWVDb2RlKiBjb25zdCB0cmVlKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmICAvLyBXRUJQX1VUSUxTX0hVRkZNQU5fRU5DT0RFX1VUSUxTX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvaHVmZm1hbl91dGlscy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL2h1ZmZtYW5fdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTY5OTYzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL2h1ZmZtYW5fdXRpbHMuYwpAQCAtMCwwICsxLDIyMyBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFV0aWxpdGllcyBmb3IgYnVpbGRpbmcgYW5kIGxvb2tpbmcgdXAgSHVmZm1hbiB0cmVlcy4KKy8vCisvLyBBdXRob3I6IFVydmFuZyBKb3NoaSAodXJ2YW5nQGdvb2dsZS5jb20pCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJzcmMvdXRpbHMvaHVmZm1hbl91dGlscy5oIgorI2luY2x1ZGUgInNyYy91dGlscy91dGlscy5oIgorI2luY2x1ZGUgInNyYy93ZWJwL2Zvcm1hdF9jb25zdGFudHMuaCIKKworLy8gSHVmZm1hbiBkYXRhIHJlYWQgdmlhIERlY29kZUltYWdlU3RyZWFtIGlzIHJlcHJlc2VudGVkIGluIHR3byAocmVkIGFuZCBncmVlbikKKy8vIGJ5dGVzLgorI2RlZmluZSBNQVhfSFRSRUVfR1JPVVBTICAgIDB4MTAwMDAKKworSFRyZWVHcm91cCogVlA4TEh0cmVlR3JvdXBzTmV3KGludCBudW1faHRyZWVfZ3JvdXBzKSB7CisgIEhUcmVlR3JvdXAqIGNvbnN0IGh0cmVlX2dyb3VwcyA9CisgICAgICAoSFRyZWVHcm91cCopV2ViUFNhZmVNYWxsb2MobnVtX2h0cmVlX2dyb3Vwcywgc2l6ZW9mKCpodHJlZV9ncm91cHMpKTsKKyAgaWYgKGh0cmVlX2dyb3VwcyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgYXNzZXJ0KG51bV9odHJlZV9ncm91cHMgPD0gTUFYX0hUUkVFX0dST1VQUyk7CisgIHJldHVybiBodHJlZV9ncm91cHM7Cit9CisKK3ZvaWQgVlA4TEh0cmVlR3JvdXBzRnJlZShIVHJlZUdyb3VwKiBjb25zdCBodHJlZV9ncm91cHMpIHsKKyAgaWYgKGh0cmVlX2dyb3VwcyAhPSBOVUxMKSB7CisgICAgV2ViUFNhZmVGcmVlKGh0cmVlX2dyb3Vwcyk7CisgIH0KK30KKworLy8gUmV0dXJucyByZXZlcnNlKHJldmVyc2Uoa2V5LCBsZW4pICsgMSwgbGVuKSwgd2hlcmUgcmV2ZXJzZShrZXksIGxlbikgaXMgdGhlCisvLyBiaXQtd2lzZSByZXZlcnNhbCBvZiB0aGUgbGVuIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgb2Yga2V5Lgorc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IEdldE5leHRLZXkodWludDMyX3Qga2V5LCBpbnQgbGVuKSB7CisgIHVpbnQzMl90IHN0ZXAgPSAxIDw8IChsZW4gLSAxKTsKKyAgd2hpbGUgKGtleSAmIHN0ZXApIHsKKyAgICBzdGVwID4+PSAxOworICB9CisgIHJldHVybiBzdGVwID8gKGtleSAmIChzdGVwIC0gMSkpICsgc3RlcCA6IGtleTsKK30KKworLy8gU3RvcmVzIGNvZGUgaW4gdGFibGVbMF0sIHRhYmxlW3N0ZXBdLCB0YWJsZVsyKnN0ZXBdLCAuLi4sIHRhYmxlW2VuZF0uCisvLyBBc3N1bWVzIHRoYXQgZW5kIGlzIGFuIGludGVnZXIgbXVsdGlwbGUgb2Ygc3RlcC4KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFJlcGxpY2F0ZVZhbHVlKEh1ZmZtYW5Db2RlKiB0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGVwLCBpbnQgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hbkNvZGUgY29kZSkgeworICBhc3NlcnQoZW5kICUgc3RlcCA9PSAwKTsKKyAgZG8geworICAgIGVuZCAtPSBzdGVwOworICAgIHRhYmxlW2VuZF0gPSBjb2RlOworICB9IHdoaWxlIChlbmQgPiAwKTsKK30KKworLy8gUmV0dXJucyB0aGUgdGFibGUgd2lkdGggb2YgdGhlIG5leHQgMm5kIGxldmVsIHRhYmxlLiBjb3VudCBpcyB0aGUgaGlzdG9ncmFtCisvLyBvZiBiaXQgbGVuZ3RocyBmb3IgdGhlIHJlbWFpbmluZyBzeW1ib2xzLCBsZW4gaXMgdGhlIGNvZGUgbGVuZ3RoIG9mIHRoZSBuZXh0CisvLyBwcm9jZXNzZWQgc3ltYm9sCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IE5leHRUYWJsZUJpdFNpemUoY29uc3QgaW50KiBjb25zdCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBpbnQgcm9vdF9iaXRzKSB7CisgIGludCBsZWZ0ID0gMSA8PCAobGVuIC0gcm9vdF9iaXRzKTsKKyAgd2hpbGUgKGxlbiA8IE1BWF9BTExPV0VEX0NPREVfTEVOR1RIKSB7CisgICAgbGVmdCAtPSBjb3VudFtsZW5dOworICAgIGlmIChsZWZ0IDw9IDApIGJyZWFrOworICAgICsrbGVuOworICAgIGxlZnQgPDw9IDE7CisgIH0KKyAgcmV0dXJuIGxlbiAtIHJvb3RfYml0czsKK30KKworLy8gc29ydGVkW2NvZGVfbGVuZ3Roc19zaXplXSBpcyBhIHByZS1hbGxvY2F0ZWQgYXJyYXkgZm9yIHNvcnRpbmcgc3ltYm9scworLy8gYnkgY29kZSBsZW5ndGguCitzdGF0aWMgaW50IEJ1aWxkSHVmZm1hblRhYmxlKEh1ZmZtYW5Db2RlKiBjb25zdCByb290X3RhYmxlLCBpbnQgcm9vdF9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgY29kZV9sZW5ndGhzW10sIGludCBjb2RlX2xlbmd0aHNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc29ydGVkW10pIHsKKyAgSHVmZm1hbkNvZGUqIHRhYmxlID0gcm9vdF90YWJsZTsgIC8vIG5leHQgYXZhaWxhYmxlIHNwYWNlIGluIHRhYmxlCisgIGludCB0b3RhbF9zaXplID0gMSA8PCByb290X2JpdHM7ICAvLyB0b3RhbCBzaXplIHJvb3QgdGFibGUgKyAybmQgbGV2ZWwgdGFibGUKKyAgaW50IGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgY29kZSBsZW5ndGgKKyAgaW50IHN5bWJvbDsgICAgICAgICAgICAgICAgICAgICAgIC8vIHN5bWJvbCBpbmRleCBpbiBvcmlnaW5hbCBvciBzb3J0ZWQgdGFibGUKKyAgLy8gbnVtYmVyIG9mIGNvZGVzIG9mIGVhY2ggbGVuZ3RoOgorICBpbnQgY291bnRbTUFYX0FMTE9XRURfQ09ERV9MRU5HVEggKyAxXSA9IHsgMCB9OworICAvLyBvZmZzZXRzIGluIHNvcnRlZCB0YWJsZSBmb3IgZWFjaCBsZW5ndGg6CisgIGludCBvZmZzZXRbTUFYX0FMTE9XRURfQ09ERV9MRU5HVEggKyAxXTsKKworICBhc3NlcnQoY29kZV9sZW5ndGhzX3NpemUgIT0gMCk7CisgIGFzc2VydChjb2RlX2xlbmd0aHMgIT0gTlVMTCk7CisgIGFzc2VydChyb290X3RhYmxlICE9IE5VTEwpOworICBhc3NlcnQocm9vdF9iaXRzID4gMCk7CisKKyAgLy8gQnVpbGQgaGlzdG9ncmFtIG9mIGNvZGUgbGVuZ3Rocy4KKyAgZm9yIChzeW1ib2wgPSAwOyBzeW1ib2wgPCBjb2RlX2xlbmd0aHNfc2l6ZTsgKytzeW1ib2wpIHsKKyAgICBpZiAoY29kZV9sZW5ndGhzW3N5bWJvbF0gPiBNQVhfQUxMT1dFRF9DT0RFX0xFTkdUSCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICsrY291bnRbY29kZV9sZW5ndGhzW3N5bWJvbF1dOworICB9CisKKyAgLy8gRXJyb3IsIGFsbCBjb2RlIGxlbmd0aHMgYXJlIHplcm9zLgorICBpZiAoY291bnRbMF0gPT0gY29kZV9sZW5ndGhzX3NpemUpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vIEdlbmVyYXRlIG9mZnNldHMgaW50byBzb3J0ZWQgc3ltYm9sIHRhYmxlIGJ5IGNvZGUgbGVuZ3RoLgorICBvZmZzZXRbMV0gPSAwOworICBmb3IgKGxlbiA9IDE7IGxlbiA8IE1BWF9BTExPV0VEX0NPREVfTEVOR1RIOyArK2xlbikgeworICAgIGlmIChjb3VudFtsZW5dID4gKDEgPDwgbGVuKSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIG9mZnNldFtsZW4gKyAxXSA9IG9mZnNldFtsZW5dICsgY291bnRbbGVuXTsKKyAgfQorCisgIC8vIFNvcnQgc3ltYm9scyBieSBsZW5ndGgsIGJ5IHN5bWJvbCBvcmRlciB3aXRoaW4gZWFjaCBsZW5ndGguCisgIGZvciAoc3ltYm9sID0gMDsgc3ltYm9sIDwgY29kZV9sZW5ndGhzX3NpemU7ICsrc3ltYm9sKSB7CisgICAgY29uc3QgaW50IHN5bWJvbF9jb2RlX2xlbmd0aCA9IGNvZGVfbGVuZ3Roc1tzeW1ib2xdOworICAgIGlmIChjb2RlX2xlbmd0aHNbc3ltYm9sXSA+IDApIHsKKyAgICAgIHNvcnRlZFtvZmZzZXRbc3ltYm9sX2NvZGVfbGVuZ3RoXSsrXSA9IHN5bWJvbDsKKyAgICB9CisgIH0KKworICAvLyBTcGVjaWFsIGNhc2UgY29kZSB3aXRoIG9ubHkgb25lIHZhbHVlLgorICBpZiAob2Zmc2V0W01BWF9BTExPV0VEX0NPREVfTEVOR1RIXSA9PSAxKSB7CisgICAgSHVmZm1hbkNvZGUgY29kZTsKKyAgICBjb2RlLmJpdHMgPSAwOworICAgIGNvZGUudmFsdWUgPSAodWludDE2X3Qpc29ydGVkWzBdOworICAgIFJlcGxpY2F0ZVZhbHVlKHRhYmxlLCAxLCB0b3RhbF9zaXplLCBjb2RlKTsKKyAgICByZXR1cm4gdG90YWxfc2l6ZTsKKyAgfQorCisgIHsKKyAgICBpbnQgc3RlcDsgICAgICAgICAgICAgIC8vIHN0ZXAgc2l6ZSB0byByZXBsaWNhdGUgdmFsdWVzIGluIGN1cnJlbnQgdGFibGUKKyAgICB1aW50MzJfdCBsb3cgPSAtMTsgICAgIC8vIGxvdyBiaXRzIGZvciBjdXJyZW50IHJvb3QgZW50cnkKKyAgICB1aW50MzJfdCBtYXNrID0gdG90YWxfc2l6ZSAtIDE7ICAgIC8vIG1hc2sgZm9yIGxvdyBiaXRzCisgICAgdWludDMyX3Qga2V5ID0gMDsgICAgICAvLyByZXZlcnNlZCBwcmVmaXggY29kZQorICAgIGludCBudW1fbm9kZXMgPSAxOyAgICAgLy8gbnVtYmVyIG9mIEh1ZmZtYW4gdHJlZSBub2RlcworICAgIGludCBudW1fb3BlbiA9IDE7ICAgICAgLy8gbnVtYmVyIG9mIG9wZW4gYnJhbmNoZXMgaW4gY3VycmVudCB0cmVlIGxldmVsCisgICAgaW50IHRhYmxlX2JpdHMgPSByb290X2JpdHM7ICAgICAgICAvLyBrZXkgbGVuZ3RoIG9mIGN1cnJlbnQgdGFibGUKKyAgICBpbnQgdGFibGVfc2l6ZSA9IDEgPDwgdGFibGVfYml0czsgIC8vIHNpemUgb2YgY3VycmVudCB0YWJsZQorICAgIHN5bWJvbCA9IDA7CisgICAgLy8gRmlsbCBpbiByb290IHRhYmxlLgorICAgIGZvciAobGVuID0gMSwgc3RlcCA9IDI7IGxlbiA8PSByb290X2JpdHM7ICsrbGVuLCBzdGVwIDw8PSAxKSB7CisgICAgICBudW1fb3BlbiA8PD0gMTsKKyAgICAgIG51bV9ub2RlcyArPSBudW1fb3BlbjsKKyAgICAgIG51bV9vcGVuIC09IGNvdW50W2xlbl07CisgICAgICBpZiAobnVtX29wZW4gPCAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgZm9yICg7IGNvdW50W2xlbl0gPiAwOyAtLWNvdW50W2xlbl0pIHsKKyAgICAgICAgSHVmZm1hbkNvZGUgY29kZTsKKyAgICAgICAgY29kZS5iaXRzID0gKHVpbnQ4X3QpbGVuOworICAgICAgICBjb2RlLnZhbHVlID0gKHVpbnQxNl90KXNvcnRlZFtzeW1ib2wrK107CisgICAgICAgIFJlcGxpY2F0ZVZhbHVlKCZ0YWJsZVtrZXldLCBzdGVwLCB0YWJsZV9zaXplLCBjb2RlKTsKKyAgICAgICAga2V5ID0gR2V0TmV4dEtleShrZXksIGxlbik7CisgICAgICB9CisgICAgfQorCisgICAgLy8gRmlsbCBpbiAybmQgbGV2ZWwgdGFibGVzIGFuZCBhZGQgcG9pbnRlcnMgdG8gcm9vdCB0YWJsZS4KKyAgICBmb3IgKGxlbiA9IHJvb3RfYml0cyArIDEsIHN0ZXAgPSAyOyBsZW4gPD0gTUFYX0FMTE9XRURfQ09ERV9MRU5HVEg7CisgICAgICAgICArK2xlbiwgc3RlcCA8PD0gMSkgeworICAgICAgbnVtX29wZW4gPDw9IDE7CisgICAgICBudW1fbm9kZXMgKz0gbnVtX29wZW47CisgICAgICBudW1fb3BlbiAtPSBjb3VudFtsZW5dOworICAgICAgaWYgKG51bV9vcGVuIDwgMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGZvciAoOyBjb3VudFtsZW5dID4gMDsgLS1jb3VudFtsZW5dKSB7CisgICAgICAgIEh1ZmZtYW5Db2RlIGNvZGU7CisgICAgICAgIGlmICgoa2V5ICYgbWFzaykgIT0gbG93KSB7CisgICAgICAgICAgdGFibGUgKz0gdGFibGVfc2l6ZTsKKyAgICAgICAgICB0YWJsZV9iaXRzID0gTmV4dFRhYmxlQml0U2l6ZShjb3VudCwgbGVuLCByb290X2JpdHMpOworICAgICAgICAgIHRhYmxlX3NpemUgPSAxIDw8IHRhYmxlX2JpdHM7CisgICAgICAgICAgdG90YWxfc2l6ZSArPSB0YWJsZV9zaXplOworICAgICAgICAgIGxvdyA9IGtleSAmIG1hc2s7CisgICAgICAgICAgcm9vdF90YWJsZVtsb3ddLmJpdHMgPSAodWludDhfdCkodGFibGVfYml0cyArIHJvb3RfYml0cyk7CisgICAgICAgICAgcm9vdF90YWJsZVtsb3ddLnZhbHVlID0gKHVpbnQxNl90KSgodGFibGUgLSByb290X3RhYmxlKSAtIGxvdyk7CisgICAgICAgIH0KKyAgICAgICAgY29kZS5iaXRzID0gKHVpbnQ4X3QpKGxlbiAtIHJvb3RfYml0cyk7CisgICAgICAgIGNvZGUudmFsdWUgPSAodWludDE2X3Qpc29ydGVkW3N5bWJvbCsrXTsKKyAgICAgICAgUmVwbGljYXRlVmFsdWUoJnRhYmxlW2tleSA+PiByb290X2JpdHNdLCBzdGVwLCB0YWJsZV9zaXplLCBjb2RlKTsKKyAgICAgICAga2V5ID0gR2V0TmV4dEtleShrZXksIGxlbik7CisgICAgICB9CisgICAgfQorCisgICAgLy8gQ2hlY2sgaWYgdHJlZSBpcyBmdWxsLgorICAgIGlmIChudW1fbm9kZXMgIT0gMiAqIG9mZnNldFtNQVhfQUxMT1dFRF9DT0RFX0xFTkdUSF0gLSAxKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKworICByZXR1cm4gdG90YWxfc2l6ZTsKK30KKworLy8gTWF4aW11bSBjb2RlX2xlbmd0aHNfc2l6ZSBpcyAyMzI4IChyZWFjaGVkIGZvciAxMS1iaXQgY29sb3JfY2FjaGVfYml0cykuCisvLyBNb3JlIGNvbW1vbmx5LCB0aGUgdmFsdWUgaXMgYXJvdW5kIH4yODAuCisjZGVmaW5lIE1BWF9DT0RFX0xFTkdUSFNfU0laRSBcCisgICgoMSA8PCBNQVhfQ0FDSEVfQklUUykgKyBOVU1fTElURVJBTF9DT0RFUyArIE5VTV9MRU5HVEhfQ09ERVMpCisvLyBDdXQtb2ZmIHZhbHVlIGZvciBzd2l0Y2hpbmcgYmV0d2VlbiBoZWFwIGFuZCBzdGFjayBhbGxvY2F0aW9uLgorI2RlZmluZSBTT1JURURfU0laRV9DVVRPRkYgNTEyCitpbnQgVlA4TEJ1aWxkSHVmZm1hblRhYmxlKEh1ZmZtYW5Db2RlKiBjb25zdCByb290X3RhYmxlLCBpbnQgcm9vdF9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgY29kZV9sZW5ndGhzW10sIGludCBjb2RlX2xlbmd0aHNfc2l6ZSkgeworICBpbnQgdG90YWxfc2l6ZTsKKyAgYXNzZXJ0KGNvZGVfbGVuZ3Roc19zaXplIDw9IE1BWF9DT0RFX0xFTkdUSFNfU0laRSk7CisgIGlmIChjb2RlX2xlbmd0aHNfc2l6ZSA8PSBTT1JURURfU0laRV9DVVRPRkYpIHsKKyAgICAvLyB1c2UgbG9jYWwgc3RhY2stYWxsb2NhdGVkIGFycmF5LgorICAgIHVpbnQxNl90IHNvcnRlZFtTT1JURURfU0laRV9DVVRPRkZdOworICAgIHRvdGFsX3NpemUgPSBCdWlsZEh1ZmZtYW5UYWJsZShyb290X3RhYmxlLCByb290X2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVfbGVuZ3RocywgY29kZV9sZW5ndGhzX3NpemUsIHNvcnRlZCk7CisgIH0gZWxzZSB7ICAgLy8gcmFyZSBjYXNlLiBVc2UgaGVhcCBhbGxvY2F0aW9uLgorICAgIHVpbnQxNl90KiBjb25zdCBzb3J0ZWQgPQorICAgICAgICAodWludDE2X3QqKVdlYlBTYWZlTWFsbG9jKGNvZGVfbGVuZ3Roc19zaXplLCBzaXplb2YoKnNvcnRlZCkpOworICAgIGlmIChzb3J0ZWQgPT0gTlVMTCkgcmV0dXJuIDA7CisgICAgdG90YWxfc2l6ZSA9IEJ1aWxkSHVmZm1hblRhYmxlKHJvb3RfdGFibGUsIHJvb3RfYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZV9sZW5ndGhzLCBjb2RlX2xlbmd0aHNfc2l6ZSwgc29ydGVkKTsKKyAgICBXZWJQU2FmZUZyZWUoc29ydGVkKTsKKyAgfQorICByZXR1cm4gdG90YWxfc2l6ZTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9odWZmbWFuX3V0aWxzLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvaHVmZm1hbl91dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMWM3OTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvaHVmZm1hbl91dGlscy5oCkBAIC0wLDAgKzEsOTIgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBVdGlsaXRpZXMgZm9yIGJ1aWxkaW5nIGFuZCBsb29raW5nIHVwIEh1ZmZtYW4gdHJlZXMuCisvLworLy8gQXV0aG9yOiBVcnZhbmcgSm9zaGkgKHVydmFuZ0Bnb29nbGUuY29tKQorCisjaWZuZGVmIFdFQlBfVVRJTFNfSFVGRk1BTl9VVElMU19IXworI2RlZmluZSBXRUJQX1VUSUxTX0hVRkZNQU5fVVRJTFNfSF8KKworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKKyNlbHNlCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZW5kaWYKKyNpbmNsdWRlICJzcmMvd2VicC9mb3JtYXRfY29uc3RhbnRzLmgiCisjaW5jbHVkZSAic3JjL3dlYnAvdHlwZXMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIEhVRkZNQU5fVEFCTEVfQklUUyAgICAgIDgKKyNkZWZpbmUgSFVGRk1BTl9UQUJMRV9NQVNLICAgICAgKCgxIDw8IEhVRkZNQU5fVEFCTEVfQklUUykgLSAxKQorCisjZGVmaW5lIExFTkdUSFNfVEFCTEVfQklUUyAgICAgIDcKKyNkZWZpbmUgTEVOR1RIU19UQUJMRV9NQVNLICAgICAgKCgxIDw8IExFTkdUSFNfVEFCTEVfQklUUykgLSAxKQorCisKKy8vIEh1ZmZtYW4gbG9va3VwIHRhYmxlIGVudHJ5Cit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQ4X3QgYml0czsgICAgIC8vIG51bWJlciBvZiBiaXRzIHVzZWQgZm9yIHRoaXMgc3ltYm9sCisgIHVpbnQxNl90IHZhbHVlOyAgIC8vIHN5bWJvbCB2YWx1ZSBvciB0YWJsZSBvZmZzZXQKK30gSHVmZm1hbkNvZGU7CisKKy8vIGxvbmcgdmVyc2lvbiBmb3IgaG9sZGluZyAzMmIgdmFsdWVzCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCBiaXRzOyAgICAgICAgIC8vIG51bWJlciBvZiBiaXRzIHVzZWQgZm9yIHRoaXMgc3ltYm9sLAorICAgICAgICAgICAgICAgICAgICAvLyBvciBhbiBpbXBvc3NpYmxlIHZhbHVlIGlmIG5vdCBhIGxpdGVyYWwgY29kZS4KKyAgdWludDMyX3QgdmFsdWU7ICAgLy8gMzJiIHBhY2tlZCBBUkdCIHZhbHVlIGlmIGxpdGVyYWwsCisgICAgICAgICAgICAgICAgICAgIC8vIG9yIG5vbi1saXRlcmFsIHN5bWJvbCBvdGhlcndpc2UKK30gSHVmZm1hbkNvZGUzMjsKKworI2RlZmluZSBIVUZGTUFOX1BBQ0tFRF9CSVRTIDYKKyNkZWZpbmUgSFVGRk1BTl9QQUNLRURfVEFCTEVfU0laRSAoMXUgPDwgSFVGRk1BTl9QQUNLRURfQklUUykKKworLy8gSHVmZm1hbiB0YWJsZSBncm91cC4KKy8vIEluY2x1ZGVzIHNwZWNpYWwgaGFuZGxpbmcgZm9yIHRoZSBmb2xsb3dpbmcgY2FzZXM6CisvLyAgLSBpc190cml2aWFsX2xpdGVyYWw6IG9uZSBjb21tb24gbGl0ZXJhbCBiYXNlIGZvciBSRUQvQkxVRS9BTFBIQSAobm90IEdSRUVOKQorLy8gIC0gaXNfdHJpdmlhbF9jb2RlOiBvbmx5IDEgY29kZSAobm8gYml0IGlzIHJlYWQgZnJvbSBiaXRzdHJlYW0pCisvLyAgLSB1c2VfcGFja2VkX3RhYmxlOiBmZXcgZW5vdWdoIGxpdGVyYWwgc3ltYm9scywgc28gYWxsIHRoZSBiaXQgY29kZXMKKy8vICAgIGNhbiBmaXQgaW50byBhIHNtYWxsIGxvb2stdXAgdGFibGUgcGFja2VkX3RhYmxlW10KKy8vIFRoZSBjb21tb24gbGl0ZXJhbCBiYXNlLCBpZiBhcHBsaWNhYmxlLCBpcyBzdG9yZWQgaW4gJ2xpdGVyYWxfYXJiJy4KK3R5cGVkZWYgc3RydWN0IEhUcmVlR3JvdXAgSFRyZWVHcm91cDsKK3N0cnVjdCBIVHJlZUdyb3VwIHsKKyAgSHVmZm1hbkNvZGUqIGh0cmVlc1tIVUZGTUFOX0NPREVTX1BFUl9NRVRBX0NPREVdOworICBpbnQgICAgICBpc190cml2aWFsX2xpdGVyYWw7ICAvLyBUcnVlLCBpZiBodWZmbWFuIHRyZWVzIGZvciBSZWQsIEJsdWUgJiBBbHBoYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTeW1ib2xzIGFyZSB0cml2aWFsIChoYXZlIGEgc2luZ2xlIGNvZGUpLgorICB1aW50MzJfdCBsaXRlcmFsX2FyYjsgICAgICAgICAvLyBJZiBpc190cml2aWFsX2xpdGVyYWwgaXMgdHJ1ZSwgdGhpcyBpcyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQVJHQiB2YWx1ZSBvZiB0aGUgcGl4ZWwsIHdpdGggR3JlZW4gY2hhbm5lbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWluZyBzZXQgdG8gemVyby4KKyAgaW50IGlzX3RyaXZpYWxfY29kZTsgICAgICAgICAgLy8gdHJ1ZSBpZiBpc190cml2aWFsX2xpdGVyYWwgd2l0aCBvbmx5IG9uZSBjb2RlCisgIGludCB1c2VfcGFja2VkX3RhYmxlOyAgICAgICAgIC8vIHVzZSBwYWNrZWQgdGFibGUgYmVsb3cgZm9yIHNob3J0IGxpdGVyYWwgY29kZQorICAvLyB0YWJsZSBtYXBwaW5nIGlucHV0IGJpdHMgdG8gYSBwYWNrZWQgdmFsdWVzLCBvciBlc2NhcGUgY2FzZSB0byBsaXRlcmFsIGNvZGUKKyAgSHVmZm1hbkNvZGUzMiBwYWNrZWRfdGFibGVbSFVGRk1BTl9QQUNLRURfVEFCTEVfU0laRV07Cit9OworCisvLyBDcmVhdGVzIHRoZSBpbnN0YW5jZSBvZiBIVHJlZUdyb3VwIHdpdGggc3BlY2lmaWVkIG51bWJlciBvZiB0cmVlLWdyb3Vwcy4KK0hUcmVlR3JvdXAqIFZQOExIdHJlZUdyb3Vwc05ldyhpbnQgbnVtX2h0cmVlX2dyb3Vwcyk7CisKKy8vIFJlbGVhc2VzIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciBIVHJlZUdyb3VwLgordm9pZCBWUDhMSHRyZWVHcm91cHNGcmVlKEhUcmVlR3JvdXAqIGNvbnN0IGh0cmVlX2dyb3Vwcyk7CisKKy8vIEJ1aWxkcyBIdWZmbWFuIGxvb2t1cCB0YWJsZSBhc3N1bWluZyBjb2RlIGxlbmd0aHMgYXJlIGluIHN5bWJvbCBvcmRlci4KKy8vIFRoZSAnY29kZV9sZW5ndGhzJyBpcyBwcmUtYWxsb2NhdGVkIHRlbXBvcmFyeSBtZW1vcnkgYnVmZmVyIHVzZWQgZm9yIGNyZWF0aW5nCisvLyB0aGUgaHVmZm1hbiB0YWJsZS4KKy8vIFJldHVybnMgYnVpbHQgdGFibGUgc2l6ZSBvciAwIGluIGNhc2Ugb2YgZXJyb3IgKGludmFsaWQgdHJlZSBvcgorLy8gbWVtb3J5IGVycm9yKS4KK2ludCBWUDhMQnVpbGRIdWZmbWFuVGFibGUoSHVmZm1hbkNvZGUqIGNvbnN0IHJvb3RfdGFibGUsIGludCByb290X2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBjb2RlX2xlbmd0aHNbXSwgaW50IGNvZGVfbGVuZ3Roc19zaXplKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8vIFdFQlBfVVRJTFNfSFVGRk1BTl9VVElMU19IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL3F1YW50X2xldmVsc19kZWNfdXRpbHMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9xdWFudF9sZXZlbHNfZGVjX3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgxOGE3OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9xdWFudF9sZXZlbHNfZGVjX3V0aWxzLmMKQEAgLTAsMCArMSwyODUgQEAKKy8vIENvcHlyaWdodCAyMDEzIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBJbXBsZW1lbnQgZ3JhZGllbnQgc21vb3RoaW5nOiB3ZSByZXBsYWNlIGEgY3VycmVudCBhbHBoYSB2YWx1ZSBieSBpdHMKKy8vIHN1cnJvdW5kaW5nIGF2ZXJhZ2UgaWYgaXQncyBjbG9zZSBlbm91Z2ggKHRoYXQgaXM6IHRoZSBjaGFuZ2Ugd2lsbCBiZSBsZXNzCisvLyB0aGFuIHRoZSBtaW5pbXVtIGRpc3RhbmNlIGJldHdlZW4gdHdvIHF1YW50aXplZCBsZXZlbCkuCisvLyBXZSB1c2Ugc2xpZGluZyB3aW5kb3cgZm9yIGNvbXB1dGluZyB0aGUgMmQgbW92aW5nIGF2ZXJhZ2UuCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgInNyYy91dGlscy9xdWFudF9sZXZlbHNfZGVjX3V0aWxzLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4gICAvLyBmb3IgbWVtc2V0CisKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKKworLy8gI2RlZmluZSBVU0VfRElUSEVSSU5HICAgLy8gdW5jb21tZW50IHRvIGVuYWJsZSBvcmRlcmVkIGRpdGhlcmluZyAobm90IHZpdGFsKQorCisjZGVmaW5lIEZJWCAxNiAgICAgLy8gZml4LXBvaW50IHByZWNpc2lvbiBmb3IgYXZlcmFnaW5nCisjZGVmaW5lIExGSVggMiAgICAgLy8gZXh0cmEgcHJlY2lzaW9uIGZvciBsb29rLXVwIHRhYmxlCisjZGVmaW5lIExVVF9TSVpFICgoMSA8PCAoOCArIExGSVgpKSAtIDEpICAvLyBsb29rLXVwIHRhYmxlIHNpemUKKworI2lmIGRlZmluZWQoVVNFX0RJVEhFUklORykKKworI2RlZmluZSBERklYIDQgICAgICAgICAgIC8vIGV4dHJhIHByZWNpc2lvbiBmb3Igb3JkZXJlZCBkaXRoZXJpbmcKKyNkZWZpbmUgRFNJWkUgNCAgICAgICAgICAvLyBkaXRoZXJpbmcgc2l6ZSAobXVzdCBiZSBhIHBvd2VyIG9mIHR3bykKKy8vIGNmLiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL09yZGVyZWRfZGl0aGVyaW5nCitzdGF0aWMgY29uc3QgdWludDhfdCBrT3JkZXJlZERpdGhlcltEU0laRV1bRFNJWkVdID0geworICB7ICAwLCAgOCwgIDIsIDEwIH0sICAgICAvLyBjb2VmZmljaWVudHMgYXJlIGluIERGSVggZml4ZWQtcG9pbnQgcHJlY2lzaW9uCisgIHsgMTIsICA0LCAxNCwgIDYgfSwKKyAgeyAgMywgMTEsICAxLCAgOSB9LAorICB7IDE1LCAgNywgMTMsICA1IH0KK307CisKKyNlbHNlCisjZGVmaW5lIERGSVggMAorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50IHdpZHRoXywgaGVpZ2h0XzsgIC8vIGRpbWVuc2lvbgorICBpbnQgc3RyaWRlXzsgICAgICAgICAgLy8gc3RyaWRlIGluIGJ5dGVzCisgIGludCByb3dfOyAgICAgICAgICAgICAvLyBjdXJyZW50IGlucHV0IHJvdyBiZWluZyBwcm9jZXNzZWQKKyAgdWludDhfdCogc3JjXzsgICAgICAgIC8vIGlucHV0IHBvaW50ZXIKKyAgdWludDhfdCogZHN0XzsgICAgICAgIC8vIG91dHB1dCBwb2ludGVyCisKKyAgaW50IHJhZGl1c187ICAgICAgICAgIC8vIGZpbHRlciByYWRpdXMgKD1kZWxheSkKKyAgaW50IHNjYWxlXzsgICAgICAgICAgIC8vIG5vcm1hbGl6YXRpb24gZmFjdG9yLCBpbiBGSVggYml0cyBwcmVjaXNpb24KKworICB2b2lkKiBtZW1fOyAgICAgICAgICAgLy8gYWxsIG1lbW9yeQorCisgIC8vIHZhcmlvdXMgc2NyYXRjaCBidWZmZXJzCisgIHVpbnQxNl90KiBzdGFydF87CisgIHVpbnQxNl90KiBjdXJfOworICB1aW50MTZfdCogZW5kXzsKKyAgdWludDE2X3QqIHRvcF87CisgIHVpbnQxNl90KiBhdmVyYWdlXzsKKworICAvLyBpbnB1dCBsZXZlbHMgZGlzdHJpYnV0aW9uCisgIGludCBudW1fbGV2ZWxzXzsgICAgICAgLy8gbnVtYmVyIG9mIHF1YW50aXplZCBsZXZlbHMKKyAgaW50IG1pbl8sIG1heF87ICAgICAgICAvLyBtaW4gYW5kIG1heCBsZXZlbCB2YWx1ZXMKKyAgaW50IG1pbl9sZXZlbF9kaXN0XzsgICAvLyBzbWFsbGVzdCBkaXN0YW5jZSBiZXR3ZWVuIHR3byBjb25zZWN1dGl2ZSBsZXZlbHMKKworICBpbnQxNl90KiBjb3JyZWN0aW9uXzsgIC8vIHNpemUgPSAxICsgMipMVVRfU0laRSAgLT4gfjRrIG1lbW9yeQorfSBTbW9vdGhQYXJhbXM7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgQ0xJUF84Yl9NQVNLIChpbnQpKH4wVSA8PCAoOCArIERGSVgpKQorc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ4X3QgY2xpcF84YihpbnQgdikgeworICByZXR1cm4gKCEodiAmIENMSVBfOGJfTUFTSykpID8gKHVpbnQ4X3QpKHYgPj4gREZJWCkgOiAodiA8IDApID8gMHUgOiAyNTV1OworfQorI3VuZGVmIENMSVBfOGJfTUFTSworCisvLyB2ZXJ0aWNhbCBhY2N1bXVsYXRpb24KK3N0YXRpYyB2b2lkIFZGaWx0ZXIoU21vb3RoUGFyYW1zKiBjb25zdCBwKSB7CisgIGNvbnN0IHVpbnQ4X3QqIHNyYyA9IHAtPnNyY187CisgIGNvbnN0IGludCB3ID0gcC0+d2lkdGhfOworICB1aW50MTZfdCogY29uc3QgY3VyID0gcC0+Y3VyXzsKKyAgY29uc3QgdWludDE2X3QqIGNvbnN0IHRvcCA9IHAtPnRvcF87CisgIHVpbnQxNl90KiBjb25zdCBvdXQgPSBwLT5lbmRfOworICB1aW50MTZfdCBzdW0gPSAwOyAgICAgICAgICAgICAgIC8vIGFsbCBhcml0aG1ldGljIGlzIG1vZHVsbyAxNmJpdAorICBpbnQgeDsKKworICBmb3IgKHggPSAwOyB4IDwgdzsgKyt4KSB7CisgICAgdWludDE2X3QgbmV3X3ZhbHVlOworICAgIHN1bSArPSBzcmNbeF07CisgICAgbmV3X3ZhbHVlID0gdG9wW3hdICsgc3VtOworICAgIG91dFt4XSA9IG5ld192YWx1ZSAtIGN1clt4XTsgIC8vIHZlcnRpY2FsIHN1bSBvZiAncicgcGl4ZWxzLgorICAgIGN1clt4XSA9IG5ld192YWx1ZTsKKyAgfQorICAvLyBtb3ZlIGlucHV0IHBvaW50ZXJzIG9uZSByb3cgZG93bgorICBwLT50b3BfID0gcC0+Y3VyXzsKKyAgcC0+Y3VyXyArPSB3OworICBpZiAocC0+Y3VyXyA9PSBwLT5lbmRfKSBwLT5jdXJfID0gcC0+c3RhcnRfOyAgLy8gcm9sbC1vdmVyCisgIC8vIFdlIHJlcGxpY2F0ZSBlZGdlcywgYXMgaXQncyBzb21ld2hhdCBlYXNpZXIgYXMgYSBib3VuZGFyeSBjb25kaXRpb24uCisgIC8vIFRoYXQncyB3aHkgd2UgZG9uJ3QgdXBkYXRlIHRoZSAnc3JjJyBwb2ludGVyIG9uIHRvcC9ib3R0b20gYXJlYToKKyAgaWYgKHAtPnJvd18gPj0gMCAmJiBwLT5yb3dfIDwgcC0+aGVpZ2h0XyAtIDEpIHsKKyAgICBwLT5zcmNfICs9IHAtPnN0cmlkZV87CisgIH0KK30KKworLy8gaG9yaXpvbnRhbCBhY2N1bXVsYXRpb24uIFdlIHVzZSBtaXJyb3IgcmVwbGljYXRpb24gb2YgbWlzc2luZyBwaXhlbHMsIGFzIGl0J3MKKy8vIGEgbGl0dGxlIGVhc2llciB0byBpbXBsZW1lbnQgKHN1cnByaXNpbmdseSkuCitzdGF0aWMgdm9pZCBIRmlsdGVyKFNtb290aFBhcmFtcyogY29uc3QgcCkgeworICBjb25zdCB1aW50MTZfdCogY29uc3QgaW4gPSBwLT5lbmRfOworICB1aW50MTZfdCogY29uc3Qgb3V0ID0gcC0+YXZlcmFnZV87CisgIGNvbnN0IHVpbnQzMl90IHNjYWxlID0gcC0+c2NhbGVfOworICBjb25zdCBpbnQgdyA9IHAtPndpZHRoXzsKKyAgY29uc3QgaW50IHIgPSBwLT5yYWRpdXNfOworCisgIGludCB4OworICBmb3IgKHggPSAwOyB4IDw9IHI7ICsreCkgeyAgIC8vIGxlZnQgbWlycm9yaW5nCisgICAgY29uc3QgdWludDE2X3QgZGVsdGEgPSBpblt4ICsgciAtIDFdICsgaW5bciAtIHhdOworICAgIG91dFt4XSA9IChkZWx0YSAqIHNjYWxlKSA+PiBGSVg7CisgIH0KKyAgZm9yICg7IHggPCB3IC0gcjsgKyt4KSB7ICAgICAvLyBidWxrIG1pZGRsZSBydW4KKyAgICBjb25zdCB1aW50MTZfdCBkZWx0YSA9IGluW3ggKyByXSAtIGluW3ggLSByIC0gMV07CisgICAgb3V0W3hdID0gKGRlbHRhICogc2NhbGUpID4+IEZJWDsKKyAgfQorICBmb3IgKDsgeCA8IHc7ICsreCkgeyAgICAgICAgIC8vIHJpZ2h0IG1pcnJvcmluZworICAgIGNvbnN0IHVpbnQxNl90IGRlbHRhID0KKyAgICAgICAgMiAqIGluW3cgLSAxXSAtIGluWzIgKiB3IC0gMiAtIHIgLSB4XSAtIGluW3ggLSByIC0gMV07CisgICAgb3V0W3hdID0gKGRlbHRhICogc2NhbGUpID4+IEZJWDsKKyAgfQorfQorCisvLyBlbWl0IG9uZSBmaWx0ZXJlZCBvdXRwdXQgcm93CitzdGF0aWMgdm9pZCBBcHBseUZpbHRlcihTbW9vdGhQYXJhbXMqIGNvbnN0IHApIHsKKyAgY29uc3QgdWludDE2X3QqIGNvbnN0IGF2ZXJhZ2UgPSBwLT5hdmVyYWdlXzsKKyAgY29uc3QgaW50IHcgPSBwLT53aWR0aF87CisgIGNvbnN0IGludDE2X3QqIGNvbnN0IGNvcnJlY3Rpb24gPSBwLT5jb3JyZWN0aW9uXzsKKyNpZiBkZWZpbmVkKFVTRV9ESVRIRVJJTkcpCisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRpdGhlciA9IGtPcmRlcmVkRGl0aGVyW3AtPnJvd18gJSBEU0laRV07CisjZW5kaWYKKyAgdWludDhfdCogY29uc3QgZHN0ID0gcC0+ZHN0XzsKKyAgaW50IHg7CisgIGZvciAoeCA9IDA7IHggPCB3OyArK3gpIHsKKyAgICBjb25zdCBpbnQgdiA9IGRzdFt4XTsKKyAgICBpZiAodiA8IHAtPm1heF8gJiYgdiA+IHAtPm1pbl8pIHsKKyAgICAgIGNvbnN0IGludCBjID0gKHYgPDwgREZJWCkgKyBjb3JyZWN0aW9uW2F2ZXJhZ2VbeF0gLSAodiA8PCBMRklYKV07CisjaWYgZGVmaW5lZChVU0VfRElUSEVSSU5HKQorICAgICAgZHN0W3hdID0gY2xpcF84YihjICsgZGl0aGVyW3ggJSBEU0laRV0pOworI2Vsc2UKKyAgICAgIGRzdFt4XSA9IGNsaXBfOGIoYyk7CisjZW5kaWYKKyAgICB9CisgIH0KKyAgcC0+ZHN0XyArPSBwLT5zdHJpZGVfOyAgLy8gYWR2YW5jZSBvdXRwdXQgcG9pbnRlcgorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW5pdGlhbGl6ZSBjb3JyZWN0aW9uIHRhYmxlCisKK3N0YXRpYyB2b2lkIEluaXRDb3JyZWN0aW9uTFVUKGludDE2X3QqIGNvbnN0IGx1dCwgaW50IG1pbl9kaXN0KSB7CisgIC8vIFRoZSBjb3JyZWN0aW9uIGN1cnZlIGlzOgorICAvLyAgIGYoeCkgPSB4IGZvciB4IDw9IHRocmVzaG9sZDIKKyAgLy8gICBmKHgpID0gMCBmb3IgeCA+PSB0aHJlc2hvbGQxCisgIC8vIGFuZCBhIGxpbmVhciBpbnRlcnBvbGF0aW9uIGZvciByYW5nZSB4PVt0aHJlc2hvbGQyLCB0aHJlc2hvbGQxXQorICAvLyAoYWxvbmcgd2l0aCBmKC14KSA9IC1mKHgpIHN5bW1ldHJ5KS4KKyAgLy8gTm90ZSB0aGF0OiB0aHJlc2hvbGQyID0gMy80ICogdGhyZXNob2xkMQorICBjb25zdCBpbnQgdGhyZXNob2xkMSA9IG1pbl9kaXN0IDw8IExGSVg7CisgIGNvbnN0IGludCB0aHJlc2hvbGQyID0gKDMgKiB0aHJlc2hvbGQxKSA+PiAyOworICBjb25zdCBpbnQgbWF4X3RocmVzaG9sZCA9IHRocmVzaG9sZDIgPDwgREZJWDsKKyAgY29uc3QgaW50IGRlbHRhID0gdGhyZXNob2xkMSAtIHRocmVzaG9sZDI7CisgIGludCBpOworICBmb3IgKGkgPSAxOyBpIDw9IExVVF9TSVpFOyArK2kpIHsKKyAgICBpbnQgYyA9IChpIDw9IHRocmVzaG9sZDIpID8gKGkgPDwgREZJWCkKKyAgICAgICAgICA6IChpIDwgdGhyZXNob2xkMSkgPyBtYXhfdGhyZXNob2xkICogKHRocmVzaG9sZDEgLSBpKSAvIGRlbHRhCisgICAgICAgICAgOiAwOworICAgIGMgPj49IExGSVg7CisgICAgbHV0WytpXSA9ICtjOworICAgIGx1dFstaV0gPSAtYzsKKyAgfQorICBsdXRbMF0gPSAwOworfQorCitzdGF0aWMgdm9pZCBDb3VudExldmVscyhTbW9vdGhQYXJhbXMqIGNvbnN0IHApIHsKKyAgaW50IGksIGosIGxhc3RfbGV2ZWw7CisgIHVpbnQ4X3QgdXNlZF9sZXZlbHNbMjU2XSA9IHsgMCB9OworICBjb25zdCB1aW50OF90KiBkYXRhID0gcC0+c3JjXzsKKyAgcC0+bWluXyA9IDI1NTsKKyAgcC0+bWF4XyA9IDA7CisgIGZvciAoaiA9IDA7IGogPCBwLT5oZWlnaHRfOyArK2opIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcC0+d2lkdGhfOyArK2kpIHsKKyAgICAgIGNvbnN0IGludCB2ID0gZGF0YVtpXTsKKyAgICAgIGlmICh2IDwgcC0+bWluXykgcC0+bWluXyA9IHY7CisgICAgICBpZiAodiA+IHAtPm1heF8pIHAtPm1heF8gPSB2OworICAgICAgdXNlZF9sZXZlbHNbdl0gPSAxOworICAgIH0KKyAgICBkYXRhICs9IHAtPnN0cmlkZV87CisgIH0KKyAgLy8gQ29tcHV0ZSB0aGUgbWluaW51bSBkaXN0YW5jZSBiZXR3ZWVuIHR3byBub24temVybyBsZXZlbHMuCisgIHAtPm1pbl9sZXZlbF9kaXN0XyA9IHAtPm1heF8gLSBwLT5taW5fOworICBsYXN0X2xldmVsID0gLTE7CisgIGZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkgeworICAgIGlmICh1c2VkX2xldmVsc1tpXSkgeworICAgICAgKytwLT5udW1fbGV2ZWxzXzsKKyAgICAgIGlmIChsYXN0X2xldmVsID49IDApIHsKKyAgICAgICAgY29uc3QgaW50IGxldmVsX2Rpc3QgPSBpIC0gbGFzdF9sZXZlbDsKKyAgICAgICAgaWYgKGxldmVsX2Rpc3QgPCBwLT5taW5fbGV2ZWxfZGlzdF8pIHsKKyAgICAgICAgICBwLT5taW5fbGV2ZWxfZGlzdF8gPSBsZXZlbF9kaXN0OworICAgICAgICB9CisgICAgICB9CisgICAgICBsYXN0X2xldmVsID0gaTsKKyAgICB9CisgIH0KK30KKworLy8gSW5pdGlhbGl6ZSBhbGwgcGFyYW1zLgorc3RhdGljIGludCBJbml0UGFyYW1zKHVpbnQ4X3QqIGNvbnN0IGRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgcmFkaXVzLCBTbW9vdGhQYXJhbXMqIGNvbnN0IHApIHsKKyAgY29uc3QgaW50IFIgPSAyICogcmFkaXVzICsgMTsgIC8vIHRvdGFsIHNpemUgb2YgdGhlIGtlcm5lbAorCisgIGNvbnN0IHNpemVfdCBzaXplX3NjcmF0Y2hfbSA9IChSICsgMSkgKiB3aWR0aCAqIHNpemVvZigqcC0+c3RhcnRfKTsKKyAgY29uc3Qgc2l6ZV90IHNpemVfbSA9ICB3aWR0aCAqIHNpemVvZigqcC0+YXZlcmFnZV8pOworICBjb25zdCBzaXplX3Qgc2l6ZV9sdXQgPSAoMSArIDIgKiBMVVRfU0laRSkgKiBzaXplb2YoKnAtPmNvcnJlY3Rpb25fKTsKKyAgY29uc3Qgc2l6ZV90IHRvdGFsX3NpemUgPSBzaXplX3NjcmF0Y2hfbSArIHNpemVfbSArIHNpemVfbHV0OworICB1aW50OF90KiBtZW0gPSAodWludDhfdCopV2ViUFNhZmVNYWxsb2MoMVUsIHRvdGFsX3NpemUpOworCisgIGlmIChtZW0gPT0gTlVMTCkgcmV0dXJuIDA7CisgIHAtPm1lbV8gPSAodm9pZCopbWVtOworCisgIHAtPnN0YXJ0XyA9ICh1aW50MTZfdCopbWVtOworICBwLT5jdXJfID0gcC0+c3RhcnRfOworICBwLT5lbmRfID0gcC0+c3RhcnRfICsgUiAqIHdpZHRoOworICBwLT50b3BfID0gcC0+ZW5kXyAtIHdpZHRoOworICBtZW1zZXQocC0+dG9wXywgMCwgd2lkdGggKiBzaXplb2YoKnAtPnRvcF8pKTsKKyAgbWVtICs9IHNpemVfc2NyYXRjaF9tOworCisgIHAtPmF2ZXJhZ2VfID0gKHVpbnQxNl90KiltZW07CisgIG1lbSArPSBzaXplX207CisKKyAgcC0+d2lkdGhfID0gd2lkdGg7CisgIHAtPmhlaWdodF8gPSBoZWlnaHQ7CisgIHAtPnN0cmlkZV8gPSBzdHJpZGU7CisgIHAtPnNyY18gPSBkYXRhOworICBwLT5kc3RfID0gZGF0YTsKKyAgcC0+cmFkaXVzXyA9IHJhZGl1czsKKyAgcC0+c2NhbGVfID0gKDEgPDwgKEZJWCArIExGSVgpKSAvIChSICogUik7ICAvLyBub3JtYWxpemF0aW9uIGNvbnN0YW50CisgIHAtPnJvd18gPSAtcmFkaXVzOworCisgIC8vIGFuYWx5emUgdGhlIGlucHV0IGRpc3RyaWJ1dGlvbiBzbyB3ZSBjYW4gYmVzdC1maXQgdGhlIHRocmVzaG9sZAorICBDb3VudExldmVscyhwKTsKKworICAvLyBjb3JyZWN0aW9uIHRhYmxlCisgIHAtPmNvcnJlY3Rpb25fID0gKChpbnQxNl90KiltZW0pICsgTFVUX1NJWkU7CisgIEluaXRDb3JyZWN0aW9uTFVUKHAtPmNvcnJlY3Rpb25fLCBwLT5taW5fbGV2ZWxfZGlzdF8pOworCisgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBDbGVhbnVwUGFyYW1zKFNtb290aFBhcmFtcyogY29uc3QgcCkgeworICBXZWJQU2FmZUZyZWUocC0+bWVtXyk7Cit9CisKK2ludCBXZWJQRGVxdWFudGl6ZUxldmVscyh1aW50OF90KiBjb25zdCBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmVuZ3RoKSB7CisgIGNvbnN0IGludCByYWRpdXMgPSA0ICogc3RyZW5ndGggLyAxMDA7CisgIGlmIChzdHJlbmd0aCA8IDAgfHwgc3RyZW5ndGggPiAxMDApIHJldHVybiAwOworICBpZiAoZGF0YSA9PSBOVUxMIHx8IHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDApIHJldHVybiAwOyAgLy8gYmFkIHBhcmFtcworICBpZiAocmFkaXVzID4gMCkgeworICAgIFNtb290aFBhcmFtcyBwOworICAgIG1lbXNldCgmcCwgMCwgc2l6ZW9mKHApKTsKKyAgICBpZiAoIUluaXRQYXJhbXMoZGF0YSwgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCByYWRpdXMsICZwKSkgcmV0dXJuIDA7CisgICAgaWYgKHAubnVtX2xldmVsc18gPiAyKSB7CisgICAgICBmb3IgKDsgcC5yb3dfIDwgcC5oZWlnaHRfOyArK3Aucm93XykgeworICAgICAgICBWRmlsdGVyKCZwKTsgIC8vIGFjY3VtdWxhdGUgYXZlcmFnZSBvZiBpbnB1dAorICAgICAgICAvLyBOZWVkIHRvIHdhaXQgZmV3IHJvd3MgaW4gb3JkZXIgdG8gcHJpbWUgdGhlIGZpbHRlciwKKyAgICAgICAgLy8gYmVmb3JlIGVtaXR0aW5nIHNvbWUgb3V0cHV0LgorICAgICAgICBpZiAocC5yb3dfID49IHAucmFkaXVzXykgeworICAgICAgICAgIEhGaWx0ZXIoJnApOworICAgICAgICAgIEFwcGx5RmlsdGVyKCZwKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBDbGVhbnVwUGFyYW1zKCZwKTsKKyAgfQorICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9xdWFudF9sZXZlbHNfZGVjX3V0aWxzLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvcXVhbnRfbGV2ZWxzX2RlY191dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MjIxMDcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvcXVhbnRfbGV2ZWxzX2RlY191dGlscy5oCkBAIC0wLDAgKzEsMzUgQEAKKy8vIENvcHlyaWdodCAyMDEzIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBBbHBoYSBwbGFuZSBkZS1xdWFudGl6YXRpb24gdXRpbGl0eQorLy8KKy8vIEF1dGhvcjogIFZpa2FzIEFyb3JhICh2aWthc2FAZ29vZ2xlLmNvbSkKKworI2lmbmRlZiBXRUJQX1VUSUxTX1FVQU5UX0xFVkVMU19ERUNfVVRJTFNfSF8KKyNkZWZpbmUgV0VCUF9VVElMU19RVUFOVF9MRVZFTFNfREVDX1VUSUxTX0hfCisKKyNpbmNsdWRlICJzcmMvd2VicC90eXBlcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8vIEFwcGx5IHBvc3QtcHJvY2Vzc2luZyB0byBpbnB1dCAnZGF0YScgb2Ygc2l6ZSAnd2lkdGgneCdoZWlnaHQnIGFzc3VtaW5nIHRoYXQKKy8vIHRoZSBzb3VyY2Ugd2FzIHF1YW50aXplZCB0byBhIHJlZHVjZWQgbnVtYmVyIG9mIGxldmVscy4gJ3N0cmlkZScgaXMgaW4gYnl0ZXMuCisvLyBTdHJlbmd0aCBpcyBpbiBbMC4uMTAwXSBhbmQgY29udHJvbHMgdGhlIGFtb3VudCBvZiBkaXRoZXJpbmcgYXBwbGllZC4KKy8vIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiBlcnJvciAoZGF0YSBpcyBOVUxMLCBpbnZhbGlkIHBhcmFtZXRlcnMsCisvLyBtYWxsb2MgZmFpbHVyZSwgLi4uKS4KK2ludCBXZWJQRGVxdWFudGl6ZUxldmVscyh1aW50OF90KiBjb25zdCBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmVuZ3RoKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8qIFdFQlBfVVRJTFNfUVVBTlRfTEVWRUxTX0RFQ19VVElMU19IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL3F1YW50X2xldmVsc191dGlscy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL3F1YW50X2xldmVsc191dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NWFkM2MKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvcXVhbnRfbGV2ZWxzX3V0aWxzLmMKQEAgLTAsMCArMSwxNDAgQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBRdWFudGl6ZSBsZXZlbHMgZm9yIHNwZWNpZmllZCBudW1iZXIgb2YgcXVhbnRpemF0aW9uLWxldmVscyAoWzIsIDI1Nl0pLgorLy8gTWluIGFuZCBtYXggdmFsdWVzIGFyZSBwcmVzZXJ2ZWQgKHVzdWFsIDAgYW5kIDI1NSBmb3IgYWxwaGEgcGxhbmUpLgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgInNyYy91dGlscy9xdWFudF9sZXZlbHNfdXRpbHMuaCIKKworI2RlZmluZSBOVU1fU1lNQk9MUyAgICAgMjU2CisKKyNkZWZpbmUgTUFYX0lURVIgIDYgICAgICAgICAgICAgLy8gTWF4aW11bSBudW1iZXIgb2YgY29udmVyZ2VuY2Ugc3RlcHMuCisjZGVmaW5lIEVSUk9SX1RIUkVTSE9MRCAxZS00ICAgIC8vIE1TRSBzdG9wcGluZyBjcml0ZXJpb24uCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBRdWFudGl6ZSBsZXZlbHMuCisKK2ludCBRdWFudGl6ZUxldmVscyh1aW50OF90KiBjb25zdCBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgaW50IG51bV9sZXZlbHMsIHVpbnQ2NF90KiBjb25zdCBzc2UpIHsKKyAgaW50IGZyZXFbTlVNX1NZTUJPTFNdID0geyAwIH07CisgIGludCBxX2xldmVsW05VTV9TWU1CT0xTXSA9IHsgMCB9OworICBkb3VibGUgaW52X3FfbGV2ZWxbTlVNX1NZTUJPTFNdID0geyAwIH07CisgIGludCBtaW5fcyA9IDI1NSwgbWF4X3MgPSAwOworICBjb25zdCBzaXplX3QgZGF0YV9zaXplID0gaGVpZ2h0ICogd2lkdGg7CisgIGludCBpLCBudW1fbGV2ZWxzX2luLCBpdGVyOworICBkb3VibGUgbGFzdF9lcnIgPSAxLmUzOCwgZXJyID0gMC47CisgIGNvbnN0IGRvdWJsZSBlcnJfdGhyZXNob2xkID0gRVJST1JfVEhSRVNIT0xEICogZGF0YV9zaXplOworCisgIGlmIChkYXRhID09IE5VTEwpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAobnVtX2xldmVscyA8IDIgfHwgbnVtX2xldmVscyA+IDI1NikgeworICAgIHJldHVybiAwOworICB9CisKKyAgeworICAgIHNpemVfdCBuOworICAgIG51bV9sZXZlbHNfaW4gPSAwOworICAgIGZvciAobiA9IDA7IG4gPCBkYXRhX3NpemU7ICsrbikgeworICAgICAgbnVtX2xldmVsc19pbiArPSAoZnJlcVtkYXRhW25dXSA9PSAwKTsKKyAgICAgIGlmIChtaW5fcyA+IGRhdGFbbl0pIG1pbl9zID0gZGF0YVtuXTsKKyAgICAgIGlmIChtYXhfcyA8IGRhdGFbbl0pIG1heF9zID0gZGF0YVtuXTsKKyAgICAgICsrZnJlcVtkYXRhW25dXTsKKyAgICB9CisgIH0KKworICBpZiAobnVtX2xldmVsc19pbiA8PSBudW1fbGV2ZWxzKSBnb3RvIEVuZDsgIC8vIG5vdGhpbmcgdG8gZG8hCisKKyAgLy8gU3RhcnQgd2l0aCB1bmlmb3JtbHkgc3ByZWFkIGNlbnRyb2lkcy4KKyAgZm9yIChpID0gMDsgaSA8IG51bV9sZXZlbHM7ICsraSkgeworICAgIGludl9xX2xldmVsW2ldID0gbWluX3MgKyAoZG91YmxlKShtYXhfcyAtIG1pbl9zKSAqIGkgLyAobnVtX2xldmVscyAtIDEpOworICB9CisKKyAgLy8gRml4ZWQgdmFsdWVzLiBXb24ndCBiZSBjaGFuZ2VkLgorICBxX2xldmVsW21pbl9zXSA9IDA7CisgIHFfbGV2ZWxbbWF4X3NdID0gbnVtX2xldmVscyAtIDE7CisgIGFzc2VydChpbnZfcV9sZXZlbFswXSA9PSBtaW5fcyk7CisgIGFzc2VydChpbnZfcV9sZXZlbFtudW1fbGV2ZWxzIC0gMV0gPT0gbWF4X3MpOworCisgIC8vIGstTWVhbnMgaXRlcmF0aW9ucy4KKyAgZm9yIChpdGVyID0gMDsgaXRlciA8IE1BWF9JVEVSOyArK2l0ZXIpIHsKKyAgICBkb3VibGUgcV9zdW1bTlVNX1NZTUJPTFNdID0geyAwIH07CisgICAgZG91YmxlIHFfY291bnRbTlVNX1NZTUJPTFNdID0geyAwIH07CisgICAgaW50IHMsIHNsb3QgPSAwOworCisgICAgLy8gQXNzaWduIGNsYXNzZXMgdG8gcmVwcmVzZW50YXRpdmVzLgorICAgIGZvciAocyA9IG1pbl9zOyBzIDw9IG1heF9zOyArK3MpIHsKKyAgICAgIC8vIEtlZXAgdHJhY2sgb2YgdGhlIG5lYXJlc3QgbmVpZ2hib3VyICdzbG90JworICAgICAgd2hpbGUgKHNsb3QgPCBudW1fbGV2ZWxzIC0gMSAmJgorICAgICAgICAgICAgIDIgKiBzID4gaW52X3FfbGV2ZWxbc2xvdF0gKyBpbnZfcV9sZXZlbFtzbG90ICsgMV0pIHsKKyAgICAgICAgKytzbG90OworICAgICAgfQorICAgICAgaWYgKGZyZXFbc10gPiAwKSB7CisgICAgICAgIHFfc3VtW3Nsb3RdICs9IHMgKiBmcmVxW3NdOworICAgICAgICBxX2NvdW50W3Nsb3RdICs9IGZyZXFbc107CisgICAgICB9CisgICAgICBxX2xldmVsW3NdID0gc2xvdDsKKyAgICB9CisKKyAgICAvLyBBc3NpZ24gbmV3IHJlcHJlc2VudGF0aXZlcyB0byBjbGFzc2VzLgorICAgIGlmIChudW1fbGV2ZWxzID4gMikgeworICAgICAgZm9yIChzbG90ID0gMTsgc2xvdCA8IG51bV9sZXZlbHMgLSAxOyArK3Nsb3QpIHsKKyAgICAgICAgY29uc3QgZG91YmxlIGNvdW50ID0gcV9jb3VudFtzbG90XTsKKyAgICAgICAgaWYgKGNvdW50ID4gMC4pIHsKKyAgICAgICAgICBpbnZfcV9sZXZlbFtzbG90XSA9IHFfc3VtW3Nsb3RdIC8gY291bnQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDb21wdXRlIGNvbnZlcmdlbmNlIGVycm9yLgorICAgIGVyciA9IDAuOworICAgIGZvciAocyA9IG1pbl9zOyBzIDw9IG1heF9zOyArK3MpIHsKKyAgICAgIGNvbnN0IGRvdWJsZSBlcnJvciA9IHMgLSBpbnZfcV9sZXZlbFtxX2xldmVsW3NdXTsKKyAgICAgIGVyciArPSBmcmVxW3NdICogZXJyb3IgKiBlcnJvcjsKKyAgICB9CisKKyAgICAvLyBDaGVjayBmb3IgY29udmVyZ2VuY2U6IHdlIHN0b3AgYXMgc29vbiBhcyB0aGUgZXJyb3IgaXMgbm8KKyAgICAvLyBsb25nZXIgaW1wcm92aW5nLgorICAgIGlmIChsYXN0X2VyciAtIGVyciA8IGVycl90aHJlc2hvbGQpIGJyZWFrOworICAgIGxhc3RfZXJyID0gZXJyOworICB9CisKKyAgLy8gUmVtYXAgdGhlIGFscGhhIHBsYW5lIHRvIHF1YW50aXplZCB2YWx1ZXMuCisgIHsKKyAgICAvLyBkb3VibGUtPmludCByb3VuZGluZyBvcGVyYXRpb24gY2FuIGJlIGNvc3RseSwgc28gd2UgZG8gaXQKKyAgICAvLyBvbmNlIGZvciBhbGwgYmVmb3JlIHJlbWFwcGluZy4gV2UgYWxzbyBwZXJmb3JtIHRoZSBkYXRhW10gLT4gc2xvdAorICAgIC8vIG1hcHBpbmcsIHdoaWxlIGF0IGl0IChhdm9pZCBvbmUgaW5kaXJlY3Rpb24gaW4gdGhlIGZpbmFsIGxvb3ApLgorICAgIHVpbnQ4X3QgbWFwW05VTV9TWU1CT0xTXTsKKyAgICBpbnQgczsKKyAgICBzaXplX3QgbjsKKyAgICBmb3IgKHMgPSBtaW5fczsgcyA8PSBtYXhfczsgKytzKSB7CisgICAgICBjb25zdCBpbnQgc2xvdCA9IHFfbGV2ZWxbc107CisgICAgICBtYXBbc10gPSAodWludDhfdCkoaW52X3FfbGV2ZWxbc2xvdF0gKyAuNSk7CisgICAgfQorICAgIC8vIEZpbmFsIHBhc3MuCisgICAgZm9yIChuID0gMDsgbiA8IGRhdGFfc2l6ZTsgKytuKSB7CisgICAgICBkYXRhW25dID0gbWFwW2RhdGFbbl1dOworICAgIH0KKyAgfQorIEVuZDoKKyAgLy8gU3RvcmUgc3VtIG9mIHNxdWFyZWQgZXJyb3IgaWYgbmVlZGVkLgorICBpZiAoc3NlICE9IE5VTEwpICpzc2UgPSAodWludDY0X3QpZXJyOworCisgIHJldHVybiAxOworfQorCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvcXVhbnRfbGV2ZWxzX3V0aWxzLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvcXVhbnRfbGV2ZWxzX3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVkZjJiYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9xdWFudF9sZXZlbHNfdXRpbHMuaApAQCAtMCwwICsxLDM2IEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQWxwaGEgcGxhbmUgcXVhbnRpemF0aW9uIHV0aWxpdHkKKy8vCisvLyBBdXRob3I6ICBWaWthcyBBcm9yYSAodmlrYXNhQGdvb2dsZS5jb20pCisKKyNpZm5kZWYgV0VCUF9VVElMU19RVUFOVF9MRVZFTFNfVVRJTFNfSF8KKyNkZWZpbmUgV0VCUF9VVElMU19RVUFOVF9MRVZFTFNfVVRJTFNfSF8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAic3JjL3dlYnAvdHlwZXMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvLyBSZXBsYWNlIHRoZSBpbnB1dCAnZGF0YScgb2Ygc2l6ZSAnd2lkdGgneCdoZWlnaHQnIHdpdGggJ251bS1sZXZlbHMnCisvLyBxdWFudGl6ZWQgdmFsdWVzLiBJZiBub3QgTlVMTCwgJ3NzZScgd2lsbCBjb250YWluIHRoZSBzdW0gb2Ygc3F1YXJlZCBlcnJvci4KKy8vIFZhbGlkIHJhbmdlIGZvciAnbnVtX2xldmVscycgaXMgWzIsIDI1Nl0uCisvLyBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgZXJyb3IgKGRhdGEgaXMgTlVMTCwgb3IgcGFyYW1ldGVycyBhcmUgaW52YWxpZCkuCitpbnQgUXVhbnRpemVMZXZlbHModWludDhfdCogY29uc3QgZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgbnVtX2xldmVscywKKyAgICAgICAgICAgICAgICAgICB1aW50NjRfdCogY29uc3Qgc3NlKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8qIFdFQlBfVVRJTFNfUVVBTlRfTEVWRUxTX1VUSUxTX0hfICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvcmFuZG9tX3V0aWxzLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvcmFuZG9tX3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhkMjZhZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9yYW5kb21fdXRpbHMuYwpAQCAtMCwwICsxLDQ3IEBACisvLyBDb3B5cmlnaHQgMjAxMyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gUHNldWRvLXJhbmRvbSB1dGlsaXRpZXMKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RyaW5nX3BvZW0uaCIKKyNlbHNlCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYKKyNpbmNsdWRlICJzcmMvdXRpbHMvcmFuZG9tX3V0aWxzLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIDMxYi1yYW5nZSB2YWx1ZXMKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBrUmFuZG9tVGFibGVbVlA4X1JBTkRPTV9UQUJMRV9TSVpFXSA9IHsKKyAgMHgwZGUxNTIzMCwgMHgwM2IzMTg4NiwgMHg3NzVmYWNjYiwgMHgxYzg4NjI2YSwgMHg2ODM4NWM1NSwgMHgxNGIzYjgyOCwKKyAgMHg0YTg1ZmVmOCwgMHg0OWRkYjg0YiwgMHg2NGZjZjM5NywgMHg1YzU1MDI4OSwgMHg0YTI5MDAwMCwgMHgwZDdlYzFkYSwKKyAgMHg1OTQwYjdhYiwgMHg1NDkyNTc3ZCwgMHg0ZTE5Y2E3MiwgMHgzOGQzOGM2OSwgMHgwYzAxZWU2NSwgMHgzMmExNzU1ZiwKKyAgMHg1NDM3ZjY1MiwgMHg1YWJiMmMzMiwgMHgwZmFhNTdiMSwgMHg3M2Y1MzNlNywgMHg2ODVmZWVkYSwgMHg3NTYzY2NlMiwKKyAgMHg2ZTk5MGU4MywgMHg0NzMwYTdlZCwgMHg0ZmMwZDljNiwgMHg0OTZiMTUzYywgMHg0ZjE0MDNmYSwgMHg1NDFhZmIwYywKKyAgMHg3Mzk5MGIzMiwgMHgyNmQ3Y2IxYywgMHg2ZmNjMzcwNiwgMHgyY2JiNzdkOCwgMHg3NTc2MmYyYSwgMHg2NDI1Y2NkZCwKKyAgMHgyNGIzNTQ2MSwgMHgwYTdkODcxNSwgMHgyMjA0MTRhOCwgMHgxNDFlYmY2NywgMHg1NmI0MTU4MywgMHg3M2U1MDJlMywKKyAgMHg0NGNhYjE2ZiwgMHgyODI2NGQ0MiwgMHg3M2JhYWVmYiwgMHgwYTUwZWJlZCwgMHgxZDZhYjZmYiwgMHgwZDNhZDQwYiwKKyAgMHgzNWRiM2I2OCwgMHgyYjA4MWU4MywgMHg3N2NlNmI5NSwgMHg1MTgxZTVmMCwgMHg3ODg1M2JiYywgMHgwMDlmOTQ5NCwKKyAgMHgyN2U1ZWQzYworfTsKKwordm9pZCBWUDhJbml0UmFuZG9tKFZQOFJhbmRvbSogY29uc3QgcmcsIGZsb2F0IGRpdGhlcmluZykgeworICBtZW1jcHkocmctPnRhYl8sIGtSYW5kb21UYWJsZSwgc2l6ZW9mKHJnLT50YWJfKSk7CisgIHJnLT5pbmRleDFfID0gMDsKKyAgcmctPmluZGV4Ml8gPSAzMTsKKyAgcmctPmFtcF8gPSAoZGl0aGVyaW5nIDwgMC4wKSA/IDAKKyAgICAgICAgICAgOiAoZGl0aGVyaW5nID4gMS4wKSA/ICgxIDw8IFZQOF9SQU5ET01fRElUSEVSX0ZJWCkKKyAgICAgICAgICAgOiAodWludDMyX3QpKCgxIDw8IFZQOF9SQU5ET01fRElUSEVSX0ZJWCkgKiBkaXRoZXJpbmcpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvcmFuZG9tX3V0aWxzLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvcmFuZG9tX3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJkNWQ0MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9yYW5kb21fdXRpbHMuaApAQCAtMCwwICsxLDY3IEBACisvLyBDb3B5cmlnaHQgMjAxMyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gUHNldWRvLXJhbmRvbSB1dGlsaXRpZXMKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaWZuZGVmIFdFQlBfVVRJTFNfUkFORE9NX1VUSUxTX0hfCisjZGVmaW5lIFdFQlBfVVRJTFNfUkFORE9NX1VUSUxTX0hfCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCisjZWxzZQorI2luY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisjaW5jbHVkZSAic3JjL3dlYnAvdHlwZXMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIFZQOF9SQU5ET01fRElUSEVSX0ZJWCA4ICAgLy8gZml4ZWQtcG9pbnQgcHJlY2lzaW9uIGZvciBkaXRoZXJpbmcKKyNkZWZpbmUgVlA4X1JBTkRPTV9UQUJMRV9TSVpFIDU1CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50IGluZGV4MV8sIGluZGV4Ml87CisgIHVpbnQzMl90IHRhYl9bVlA4X1JBTkRPTV9UQUJMRV9TSVpFXTsKKyAgaW50IGFtcF87Cit9IFZQOFJhbmRvbTsKKworLy8gSW5pdGlhbGl6ZXMgcmFuZG9tIGdlbmVyYXRvciB3aXRoIGFuIGFtcGxpdHVkZSAnZGl0aGVyaW5nJyBpbiByYW5nZSBbMC4uMV0uCit2b2lkIFZQOEluaXRSYW5kb20oVlA4UmFuZG9tKiBjb25zdCByZywgZmxvYXQgZGl0aGVyaW5nKTsKKworLy8gUmV0dXJucyBhIGNlbnRlcmVkIHBzZXVkby1yYW5kb20gbnVtYmVyIHdpdGggJ251bV9iaXRzJyBhbXBsaXR1ZGUuCisvLyAodXNlcyBELktudXRoJ3MgRGlmZmVyZW5jZS1iYXNlZCByYW5kb20gZ2VuZXJhdG9yKS4KKy8vICdhbXAnIGlzIGluIFZQOF9SQU5ET01fRElUSEVSX0ZJWCBmaXhlZC1wb2ludCBwcmVjaXNpb24uCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOFJhbmRvbUJpdHMyKFZQOFJhbmRvbSogY29uc3QgcmcsIGludCBudW1fYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFtcCkgeworICBpbnQgZGlmZjsKKyAgU0JfRENIRUNLKG51bV9iaXRzICsgVlA4X1JBTkRPTV9ESVRIRVJfRklYIDw9IDMxKTsKKyAgZGlmZiA9IHJnLT50YWJfW3JnLT5pbmRleDFfXSAtIHJnLT50YWJfW3JnLT5pbmRleDJfXTsKKyAgaWYgKGRpZmYgPCAwKSBkaWZmICs9ICgxdSA8PCAzMSk7CisgIHJnLT50YWJfW3JnLT5pbmRleDFfXSA9IGRpZmY7CisgIGlmICgrK3JnLT5pbmRleDFfID09IFZQOF9SQU5ET01fVEFCTEVfU0laRSkgcmctPmluZGV4MV8gPSAwOworICBpZiAoKytyZy0+aW5kZXgyXyA9PSBWUDhfUkFORE9NX1RBQkxFX1NJWkUpIHJnLT5pbmRleDJfID0gMDsKKyAgLy8gc2lnbi1leHRlbmQsIDAtY2VudGVyCisgIGRpZmYgPSAoaW50KSgodWludDMyX3QpZGlmZiA8PCAxKSA+PiAoMzIgLSBudW1fYml0cyk7CisgIGRpZmYgPSAoZGlmZiAqIGFtcCkgPj4gVlA4X1JBTkRPTV9ESVRIRVJfRklYOyAgLy8gcmVzdHJpY3QgcmFuZ2UKKyAgZGlmZiArPSAxIDw8IChudW1fYml0cyAtIDEpOyAgICAgICAgICAgICAgICAgICAvLyBzaGlmdCBiYWNrIHRvIDAuNS1jZW50ZXIKKyAgcmV0dXJuIGRpZmY7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4UmFuZG9tQml0cyhWUDhSYW5kb20qIGNvbnN0IHJnLCBpbnQgbnVtX2JpdHMpIHsKKyAgcmV0dXJuIFZQOFJhbmRvbUJpdHMyKHJnLCBudW1fYml0cywgcmctPmFtcF8pOworfQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30gICAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLyogV0VCUF9VVElMU19SQU5ET01fVVRJTFNfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9yZXNjYWxlcl91dGlscy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL3Jlc2NhbGVyX3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBlMmVhNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9yZXNjYWxlcl91dGlscy5jCkBAIC0wLDAgKzEsMTQ4IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gUmVzY2FsaW5nIGZ1bmN0aW9ucworLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorI2luY2x1ZGUgInNyYy91dGlscy9yZXNjYWxlcl91dGlscy5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFdlYlBSZXNjYWxlckluaXQoV2ViUFJlc2NhbGVyKiBjb25zdCB3cmssIGludCBzcmNfd2lkdGgsIGludCBzcmNfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X3dpZHRoLCBpbnQgZHN0X2hlaWdodCwgaW50IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9jaGFubmVscywgcmVzY2FsZXJfdCogY29uc3Qgd29yaykgeworICBjb25zdCBpbnQgeF9hZGQgPSBzcmNfd2lkdGgsIHhfc3ViID0gZHN0X3dpZHRoOworICBjb25zdCBpbnQgeV9hZGQgPSBzcmNfaGVpZ2h0LCB5X3N1YiA9IGRzdF9oZWlnaHQ7CisgIHdyay0+eF9leHBhbmQgPSAoc3JjX3dpZHRoIDwgZHN0X3dpZHRoKTsKKyAgd3JrLT55X2V4cGFuZCA9IChzcmNfaGVpZ2h0IDwgZHN0X2hlaWdodCk7CisgIHdyay0+c3JjX3dpZHRoID0gc3JjX3dpZHRoOworICB3cmstPnNyY19oZWlnaHQgPSBzcmNfaGVpZ2h0OworICB3cmstPmRzdF93aWR0aCA9IGRzdF93aWR0aDsKKyAgd3JrLT5kc3RfaGVpZ2h0ID0gZHN0X2hlaWdodDsKKyAgd3JrLT5zcmNfeSA9IDA7CisgIHdyay0+ZHN0X3kgPSAwOworICB3cmstPmRzdCA9IGRzdDsKKyAgd3JrLT5kc3Rfc3RyaWRlID0gZHN0X3N0cmlkZTsKKyAgd3JrLT5udW1fY2hhbm5lbHMgPSBudW1fY2hhbm5lbHM7CisKKyAgLy8gZm9yICd4X2V4cGFuZCcsIHdlIHVzZSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uCisgIHdyay0+eF9hZGQgPSB3cmstPnhfZXhwYW5kID8gKHhfc3ViIC0gMSkgOiB4X2FkZDsKKyAgd3JrLT54X3N1YiA9IHdyay0+eF9leHBhbmQgPyAoeF9hZGQgLSAxKSA6IHhfc3ViOworICBpZiAoIXdyay0+eF9leHBhbmQpIHsgIC8vIGZ4X3NjYWxlIGlzIG5vdCB1c2VkIG90aGVyd2lzZQorICAgIHdyay0+Znhfc2NhbGUgPSBXRUJQX1JFU0NBTEVSX0ZSQUMoMSwgd3JrLT54X3N1Yik7CisgIH0KKyAgLy8gdmVydGljYWwgc2NhbGluZyBwYXJhbWV0ZXJzCisgIHdyay0+eV9hZGQgPSB3cmstPnlfZXhwYW5kID8geV9hZGQgLSAxIDogeV9hZGQ7CisgIHdyay0+eV9zdWIgPSB3cmstPnlfZXhwYW5kID8geV9zdWIgLSAxIDogeV9zdWI7CisgIHdyay0+eV9hY2N1bSA9IHdyay0+eV9leHBhbmQgPyB3cmstPnlfc3ViIDogd3JrLT55X2FkZDsKKyAgaWYgKCF3cmstPnlfZXhwYW5kKSB7CisgICAgLy8gVGhpcyBpcyBXRUJQX1JFU0NBTEVSX0ZSQUMoZHN0X2hlaWdodCwgeF9hZGQgKiB5X2FkZCkgd2l0aG91dCB0aGUgY2FzdC4KKyAgICAvLyBJdHMgdmFsdWUgaXMgPD0gV0VCUF9SRVNDQUxFUl9PTkUsIGJlY2F1c2UgZHN0X2hlaWdodCA8PSB3cmstPnlfYWRkLCBhbmQKKyAgICAvLyB3cmstPnhfYWRkID49IDE7CisgICAgY29uc3QgdWludDY0X3QgcmF0aW8gPQorICAgICAgICAodWludDY0X3QpZHN0X2hlaWdodCAqIFdFQlBfUkVTQ0FMRVJfT05FIC8gKHdyay0+eF9hZGQgKiB3cmstPnlfYWRkKTsKKyAgICBpZiAocmF0aW8gIT0gKHVpbnQzMl90KXJhdGlvKSB7CisgICAgICAvLyBXaGVuIHJhdGlvID09IFdFQlBfUkVTQ0FMRVJfT05FLCB3ZSBjYW4ndCByZXByZXNlbnQgdGhlIHJhdGlvIHdpdGggdGhlCisgICAgICAvLyBjdXJyZW50IGZpeGVkLXBvaW50IHByZWNpc2lvbi4gVGhpcyBoYXBwZW5zIHdoZW4gc3JjX2hlaWdodCA9PQorICAgICAgLy8gd3JrLT55X2FkZCAod2hpY2ggPT0gc3JjX2hlaWdodCksIGFuZCB3cmstPnhfYWRkID09IDEuCisgICAgICAvLyA9PiBXZSBzcGVjaWFsLWNhc2UgZnh5X3NjYWxlID0gMCwgaW4gV2ViUFJlc2NhbGVyRXhwb3J0Um93KCkuCisgICAgICB3cmstPmZ4eV9zY2FsZSA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIHdyay0+Znh5X3NjYWxlID0gKHVpbnQzMl90KXJhdGlvOworICAgIH0KKyAgICB3cmstPmZ5X3NjYWxlID0gV0VCUF9SRVNDQUxFUl9GUkFDKDEsIHdyay0+eV9zdWIpOworICB9IGVsc2UgeworICAgIHdyay0+Znlfc2NhbGUgPSBXRUJQX1JFU0NBTEVSX0ZSQUMoMSwgd3JrLT54X2FkZCk7CisgICAgLy8gd3JrLT5meHlfc2NhbGUgaXMgdW51c2VkIGhlcmUuCisgIH0KKyAgd3JrLT5pcm93ID0gd29yazsKKyAgd3JrLT5mcm93ID0gd29yayArIG51bV9jaGFubmVscyAqIGRzdF93aWR0aDsKKyAgbWVtc2V0KHdvcmssIDAsIDIgKiBkc3Rfd2lkdGggKiBudW1fY2hhbm5lbHMgKiBzaXplb2YoKndvcmspKTsKKworICBXZWJQUmVzY2FsZXJEc3BJbml0KCk7Cit9CisKK2ludCBXZWJQUmVzY2FsZXJHZXRTY2FsZWREaW1lbnNpb25zKGludCBzcmNfd2lkdGgsIGludCBzcmNfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBzY2FsZWRfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IHNjYWxlZF9oZWlnaHQpIHsKKyAgYXNzZXJ0KHNjYWxlZF93aWR0aCAhPSBOVUxMKTsKKyAgYXNzZXJ0KHNjYWxlZF9oZWlnaHQgIT0gTlVMTCk7CisgIHsKKyAgICBpbnQgd2lkdGggPSAqc2NhbGVkX3dpZHRoOworICAgIGludCBoZWlnaHQgPSAqc2NhbGVkX2hlaWdodDsKKworICAgIC8vIGlmIHdpZHRoIGlzIHVuc3BlY2lmaWVkLCBzY2FsZSBvcmlnaW5hbCBwcm9wb3J0aW9uYWxseSB0byBoZWlnaHQgcmF0aW8uCisgICAgaWYgKHdpZHRoID09IDApIHsKKyAgICAgIHdpZHRoID0KKyAgICAgICAgICAoaW50KSgoKHVpbnQ2NF90KXNyY193aWR0aCAqIGhlaWdodCArIHNyY19oZWlnaHQgLyAyKSAvIHNyY19oZWlnaHQpOworICAgIH0KKyAgICAvLyBpZiBoZWlnaHQgaXMgdW5zcGVjaWZpZWQsIHNjYWxlIG9yaWdpbmFsIHByb3BvcnRpb25hbGx5IHRvIHdpZHRoIHJhdGlvLgorICAgIGlmIChoZWlnaHQgPT0gMCkgeworICAgICAgaGVpZ2h0ID0KKyAgICAgICAgICAoaW50KSgoKHVpbnQ2NF90KXNyY19oZWlnaHQgKiB3aWR0aCArIHNyY193aWR0aCAvIDIpIC8gc3JjX3dpZHRoKTsKKyAgICB9CisgICAgLy8gQ2hlY2sgaWYgdGhlIG92ZXJhbGwgZGltZW5zaW9ucyBzdGlsbCBtYWtlIHNlbnNlLgorICAgIGlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAqc2NhbGVkX3dpZHRoID0gd2lkdGg7CisgICAgKnNjYWxlZF9oZWlnaHQgPSBoZWlnaHQ7CisgICAgcmV0dXJuIDE7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGFsbC1pbi1vbmUgY2FsbHMKKworaW50IFdlYlBSZXNjYWxlTmVlZGVkTGluZXMoY29uc3QgV2ViUFJlc2NhbGVyKiBjb25zdCB3cmssIGludCBtYXhfbnVtX2xpbmVzKSB7CisgIGNvbnN0IGludCBudW1fbGluZXMgPSAod3JrLT55X2FjY3VtICsgd3JrLT55X3N1YiAtIDEpIC8gd3JrLT55X3N1YjsKKyAgcmV0dXJuIChudW1fbGluZXMgPiBtYXhfbnVtX2xpbmVzKSA/IG1heF9udW1fbGluZXMgOiBudW1fbGluZXM7Cit9CisKK2ludCBXZWJQUmVzY2FsZXJJbXBvcnQoV2ViUFJlc2NhbGVyKiBjb25zdCB3cmssIGludCBudW1fbGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyYywgaW50IHNyY19zdHJpZGUpIHsKKyAgaW50IHRvdGFsX2ltcG9ydGVkID0gMDsKKyAgd2hpbGUgKHRvdGFsX2ltcG9ydGVkIDwgbnVtX2xpbmVzICYmICFXZWJQUmVzY2FsZXJIYXNQZW5kaW5nT3V0cHV0KHdyaykpIHsKKyAgICBpZiAod3JrLT55X2V4cGFuZCkgeworICAgICAgcmVzY2FsZXJfdCogY29uc3QgdG1wID0gd3JrLT5pcm93OworICAgICAgd3JrLT5pcm93ID0gd3JrLT5mcm93OworICAgICAgd3JrLT5mcm93ID0gdG1wOworICAgIH0KKyAgICBXZWJQUmVzY2FsZXJJbXBvcnRSb3cod3JrLCBzcmMpOworICAgIGlmICghd3JrLT55X2V4cGFuZCkgeyAgICAgLy8gQWNjdW11bGF0ZSB0aGUgY29udHJpYnV0aW9uIG9mIHRoZSBuZXcgcm93LgorICAgICAgaW50IHg7CisgICAgICBmb3IgKHggPSAwOyB4IDwgd3JrLT5udW1fY2hhbm5lbHMgKiB3cmstPmRzdF93aWR0aDsgKyt4KSB7CisgICAgICAgIHdyay0+aXJvd1t4XSArPSB3cmstPmZyb3dbeF07CisgICAgICB9CisgICAgfQorICAgICsrd3JrLT5zcmNfeTsKKyAgICBzcmMgKz0gc3JjX3N0cmlkZTsKKyAgICArK3RvdGFsX2ltcG9ydGVkOworICAgIHdyay0+eV9hY2N1bSAtPSB3cmstPnlfc3ViOworICB9CisgIHJldHVybiB0b3RhbF9pbXBvcnRlZDsKK30KKworaW50IFdlYlBSZXNjYWxlckV4cG9ydChXZWJQUmVzY2FsZXIqIGNvbnN0IHJlc2NhbGVyKSB7CisgIGludCB0b3RhbF9leHBvcnRlZCA9IDA7CisgIHdoaWxlIChXZWJQUmVzY2FsZXJIYXNQZW5kaW5nT3V0cHV0KHJlc2NhbGVyKSkgeworICAgIFdlYlBSZXNjYWxlckV4cG9ydFJvdyhyZXNjYWxlcik7CisgICAgKyt0b3RhbF9leHBvcnRlZDsKKyAgfQorICByZXR1cm4gdG90YWxfZXhwb3J0ZWQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvcmVzY2FsZXJfdXRpbHMuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9yZXNjYWxlcl91dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4OTBlNmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvcmVzY2FsZXJfdXRpbHMuaApAQCAtMCwwICsxLDEwMSBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFJlc2NhbGluZyBmdW5jdGlvbnMKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaWZuZGVmIFdFQlBfVVRJTFNfUkVTQ0FMRVJfVVRJTFNfSF8KKyNkZWZpbmUgV0VCUF9VVElMU19SRVNDQUxFUl9VVElMU19IXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvd2VicC90eXBlcy5oIgorCisjZGVmaW5lIFdFQlBfUkVTQ0FMRVJfUkZJWCAzMiAgIC8vIGZpeGVkLXBvaW50IHByZWNpc2lvbiBmb3IgbXVsdGlwbGllcworI2RlZmluZSBXRUJQX1JFU0NBTEVSX09ORSAoMXVsbCA8PCBXRUJQX1JFU0NBTEVSX1JGSVgpCisjZGVmaW5lIFdFQlBfUkVTQ0FMRVJfRlJBQyh4LCB5KSBcCisgICAgKCh1aW50MzJfdCkoKCh1aW50NjRfdCkoeCkgPDwgV0VCUF9SRVNDQUxFUl9SRklYKSAvICh5KSkpCisKKy8vIFN0cnVjdHVyZSB1c2VkIGZvciBvbi10aGUtZmx5IHJlc2NhbGluZwordHlwZWRlZiB1aW50MzJfdCByZXNjYWxlcl90OyAgIC8vIHR5cGUgZm9yIHNpZGUtYnVmZmVyCit0eXBlZGVmIHN0cnVjdCBXZWJQUmVzY2FsZXIgV2ViUFJlc2NhbGVyOworc3RydWN0IFdlYlBSZXNjYWxlciB7CisgIGludCB4X2V4cGFuZDsgICAgICAgICAgICAgICAvLyB0cnVlIGlmIHdlJ3JlIGV4cGFuZGluZyBpbiB0aGUgeCBkaXJlY3Rpb24KKyAgaW50IHlfZXhwYW5kOyAgICAgICAgICAgICAgIC8vIHRydWUgaWYgd2UncmUgZXhwYW5kaW5nIGluIHRoZSB5IGRpcmVjdGlvbgorICBpbnQgbnVtX2NoYW5uZWxzOyAgICAgICAgICAgLy8gYnl0ZXMgdG8ganVtcCBiZXR3ZWVuIHBpeGVscworICB1aW50MzJfdCBmeF9zY2FsZTsgICAgICAgICAgLy8gZml4ZWQtcG9pbnQgc2NhbGluZyBmYWN0b3JzCisgIHVpbnQzMl90IGZ5X3NjYWxlOyAgICAgICAgICAvLyAnJworICB1aW50MzJfdCBmeHlfc2NhbGU7ICAgICAgICAgLy8gJycKKyAgaW50IHlfYWNjdW07ICAgICAgICAgICAgICAgIC8vIHZlcnRpY2FsIGFjY3VtdWxhdG9yCisgIGludCB5X2FkZCwgeV9zdWI7ICAgICAgICAgICAvLyB2ZXJ0aWNhbCBpbmNyZW1lbnRzCisgIGludCB4X2FkZCwgeF9zdWI7ICAgICAgICAgICAvLyBob3Jpem9udGFsIGluY3JlbWVudHMKKyAgaW50IHNyY193aWR0aCwgc3JjX2hlaWdodDsgIC8vIHNvdXJjZSBkaW1lbnNpb25zCisgIGludCBkc3Rfd2lkdGgsIGRzdF9oZWlnaHQ7ICAvLyBkZXN0aW5hdGlvbiBkaW1lbnNpb25zCisgIGludCBzcmNfeSwgZHN0X3k7ICAgICAgICAgICAvLyByb3cgY291bnRlcnMgZm9yIGlucHV0IGFuZCBvdXRwdXQKKyAgdWludDhfdCogZHN0OworICBpbnQgZHN0X3N0cmlkZTsKKyAgcmVzY2FsZXJfdCogaXJvdywgKmZyb3c7ICAgIC8vIHdvcmsgYnVmZmVyCit9OworCisvLyBJbml0aWFsaXplIGEgcmVzY2FsZXIgZ2l2ZW4gc2NyYXRjaCBhcmVhICd3b3JrJyBhbmQgZGltZW5zaW9ucyBvZiBzcmMgJiBkc3QuCit2b2lkIFdlYlBSZXNjYWxlckluaXQoV2ViUFJlc2NhbGVyKiBjb25zdCByZXNjYWxlciwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3dpZHRoLCBpbnQgc3JjX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF93aWR0aCwgaW50IGRzdF9oZWlnaHQsIGludCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgcmVzY2FsZXJfdCogY29uc3Qgd29yayk7CisKKy8vIElmIGVpdGhlciAnc2NhbGVkX3dpZHRoJyBvciAnc2NhbGVkX2hlaWdodCcgKGJ1dCBub3QgYm90aCkgaXMgMCB0aGUgdmFsdWUKKy8vIHdpbGwgYmUgY2FsY3VsYXRlZCBwcmVzZXJ2aW5nIHRoZSBhc3BlY3QgcmF0aW8sIG90aGVyd2lzZSB0aGUgdmFsdWVzIGFyZQorLy8gbGVmdCB1bm1vZGlmaWVkLiBSZXR1cm5zIHRydWUgb24gc3VjY2VzcywgZmFsc2UgaWYgZWl0aGVyIHZhbHVlIGlzIDAgYWZ0ZXIKKy8vIHBlcmZvcm1pbmcgdGhlIHNjYWxpbmcgY2FsY3VsYXRpb24uCitpbnQgV2ViUFJlc2NhbGVyR2V0U2NhbGVkRGltZW5zaW9ucyhpbnQgc3JjX3dpZHRoLCBpbnQgc3JjX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3Qgc2NhbGVkX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBzY2FsZWRfaGVpZ2h0KTsKKworLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGlucHV0IGxpbmVzIG5lZWRlZCBuZXh0IHRvIHByb2R1Y2Ugb25lIG91dHB1dCBsaW5lLAorLy8gY29uc2lkZXJpbmcgdGhhdCB0aGUgbWF4aW11bSBhdmFpbGFibGUgaW5wdXQgbGluZXMgYXJlICdtYXhfbnVtX2xpbmVzJy4KK2ludCBXZWJQUmVzY2FsZU5lZWRlZExpbmVzKGNvbnN0IFdlYlBSZXNjYWxlciogY29uc3QgcmVzY2FsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X251bV9saW5lcyk7CisKKy8vIEltcG9ydCBtdWx0aXBsZSByb3dzIG92ZXIgYWxsIGNoYW5uZWxzLCB1bnRpbCBhdCBsZWFzdCBvbmUgcm93IGlzIHJlYWR5IHRvCisvLyBiZSBleHBvcnRlZC4gUmV0dXJucyB0aGUgYWN0dWFsIG51bWJlciBvZiBsaW5lcyB0aGF0IHdlcmUgaW1wb3J0ZWQuCitpbnQgV2ViUFJlc2NhbGVySW1wb3J0KFdlYlBSZXNjYWxlciogY29uc3QgcmVzY2FsZXIsIGludCBudW1fcm93cywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjLCBpbnQgc3JjX3N0cmlkZSk7CisKKy8vIEV4cG9ydCBhcyBtYW55IHJvd3MgYXMgcG9zc2libGUuIFJldHVybiB0aGUgbnVtYmVycyBvZiByb3dzIHdyaXR0ZW4uCitpbnQgV2ViUFJlc2NhbGVyRXhwb3J0KFdlYlBSZXNjYWxlciogY29uc3QgcmVzY2FsZXIpOworCisvLyBSZXR1cm4gdHJ1ZSBpZiBpbnB1dCBpcyBmaW5pc2hlZAorc3RhdGljIFdFQlBfSU5MSU5FCitpbnQgV2ViUFJlc2NhbGVySW5wdXREb25lKGNvbnN0IFdlYlBSZXNjYWxlciogY29uc3QgcmVzY2FsZXIpIHsKKyAgcmV0dXJuIChyZXNjYWxlci0+c3JjX3kgPj0gcmVzY2FsZXItPnNyY19oZWlnaHQpOworfQorLy8gUmV0dXJuIHRydWUgaWYgb3V0cHV0IGlzIGZpbmlzaGVkCitzdGF0aWMgV0VCUF9JTkxJTkUKK2ludCBXZWJQUmVzY2FsZXJPdXRwdXREb25lKGNvbnN0IFdlYlBSZXNjYWxlciogY29uc3QgcmVzY2FsZXIpIHsKKyAgcmV0dXJuIChyZXNjYWxlci0+ZHN0X3kgPj0gcmVzY2FsZXItPmRzdF9oZWlnaHQpOworfQorCisvLyBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBhcmUgcGVuZGluZyBvdXRwdXQgcm93cyByZWFkeS4KK3N0YXRpYyBXRUJQX0lOTElORQoraW50IFdlYlBSZXNjYWxlckhhc1BlbmRpbmdPdXRwdXQoY29uc3QgV2ViUFJlc2NhbGVyKiBjb25zdCByZXNjYWxlcikgeworICByZXR1cm4gIVdlYlBSZXNjYWxlck91dHB1dERvbmUocmVzY2FsZXIpICYmIChyZXNjYWxlci0+eV9hY2N1bSA8PSAwKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8qIFdFQlBfVVRJTFNfUkVTQ0FMRVJfVVRJTFNfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy90aHJlYWRfdXRpbHMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy90aHJlYWRfdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDUyYjZiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL3RocmVhZF91dGlscy5jCkBAIC0wLDAgKzEsMzU5IEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gTXVsdGktdGhyZWFkZWQgd29ya2VyCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPiAgIC8vIGZvciBtZW1zZXQoKQorI2luY2x1ZGUgInNyYy91dGlscy90aHJlYWRfdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKKworI2lmZGVmIFdFQlBfVVNFX1RIUkVBRAorCisjaWYgZGVmaW5lZChfV0lOMzIpCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+Cit0eXBlZGVmIEhBTkRMRSBwdGhyZWFkX3Q7Cit0eXBlZGVmIENSSVRJQ0FMX1NFQ1RJT04gcHRocmVhZF9tdXRleF90OworCisjaWYgX1dJTjMyX1dJTk5UID49IDB4MDYwMCAgLy8gV2luZG93cyBWaXN0YSAvIFNlcnZlciAyMDA4IG9yIGdyZWF0ZXIKKyNkZWZpbmUgVVNFX1dJTkRPV1NfQ09ORElUSU9OX1ZBUklBQkxFCit0eXBlZGVmIENPTkRJVElPTl9WQVJJQUJMRSBwdGhyZWFkX2NvbmRfdDsKKyNlbHNlCit0eXBlZGVmIHN0cnVjdCB7CisgIEhBTkRMRSB3YWl0aW5nX3NlbV87CisgIEhBTkRMRSByZWNlaXZlZF9zZW1fOworICBIQU5ETEUgc2lnbmFsX2V2ZW50XzsKK30gcHRocmVhZF9jb25kX3Q7CisjZW5kaWYgIC8vIF9XSU4zMl9XSU5OVCA+PSAweDYwMAorCisjaWZuZGVmIFdJTkFQSV9GQU1JTFlfUEFSVElUSU9OCisjZGVmaW5lIFdJTkFQSV9QQVJUSVRJT05fREVTS1RPUCAxCisjZGVmaW5lIFdJTkFQSV9GQU1JTFlfUEFSVElUSU9OKHgpIHgKKyNlbmRpZgorCisjaWYgIVdJTkFQSV9GQU1JTFlfUEFSVElUSU9OKFdJTkFQSV9QQVJUSVRJT05fREVTS1RPUCkKKyNkZWZpbmUgVVNFX0NSRUFURV9USFJFQUQKKyNlbmRpZgorCisjZWxzZSAgLy8gIV9XSU4zMgorCisjaW5jbHVkZSA8cHRocmVhZC5oPgorCisjZW5kaWYgIC8vIF9XSU4zMgorCit0eXBlZGVmIHN0cnVjdCB7CisgIHB0aHJlYWRfbXV0ZXhfdCBtdXRleF87CisgIHB0aHJlYWRfY29uZF90ICBjb25kaXRpb25fOworICBwdGhyZWFkX3QgICAgICAgdGhyZWFkXzsKK30gV2ViUFdvcmtlckltcGw7CisKKyNpZiBkZWZpbmVkKF9XSU4zMikKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHNpbXBsaXN0aWMgcHRocmVhZCBlbXVsYXRpb24gbGF5ZXIKKworI2luY2x1ZGUgPHByb2Nlc3MuaD4KKworLy8gX2JlZ2ludGhyZWFkZXggcmVxdWlyZXMgX19zdGRjYWxsCisjZGVmaW5lIFRIUkVBREZOIHVuc2lnbmVkIGludCBfX3N0ZGNhbGwKKyNkZWZpbmUgVEhSRUFEX1JFVFVSTih2YWwpICh1bnNpZ25lZCBpbnQpKChEV09SRF9QVFIpdmFsKQorCisjaWYgX1dJTjMyX1dJTk5UID49IDB4MDUwMSAgLy8gV2luZG93cyBYUCBvciBncmVhdGVyCisjZGVmaW5lIFdhaXRGb3JTaW5nbGVPYmplY3Qob2JqLCB0aW1lb3V0KSBcCisgIFdhaXRGb3JTaW5nbGVPYmplY3RFeChvYmosIHRpbWVvdXQsIEZBTFNFIC8qYkFsZXJ0YWJsZSovKQorI2VuZGlmCisKK3N0YXRpYyBpbnQgcHRocmVhZF9jcmVhdGUocHRocmVhZF90KiBjb25zdCB0aHJlYWQsIGNvbnN0IHZvaWQqIGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAoX19zdGRjYWxsICpzdGFydCkodm9pZCopLCB2b2lkKiBhcmcpIHsKKyAgKHZvaWQpYXR0cjsKKyNpZmRlZiBVU0VfQ1JFQVRFX1RIUkVBRAorICAqdGhyZWFkID0gQ3JlYXRlVGhyZWFkKE5VTEwsICAgLyogbHBUaHJlYWRBdHRyaWJ1dGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAvKiBkd1N0YWNrU2l6ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgIC8qIGR3U3RhY2tTaXplICovCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7ICAvKiBscFRocmVhZElkICovCisjZWxzZQorICAqdGhyZWFkID0gKHB0aHJlYWRfdClfYmVnaW50aHJlYWRleChOVUxMLCAgIC8qIHZvaWQgKnNlY3VyaXR5ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgLyogdW5zaWduZWQgc3RhY2tfc2l6ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgIC8qIHVuc2lnbmVkIGluaXRmbGFnICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOyAgLyogdW5zaWduZWQgKnRocmRhZGRyICovCisjZW5kaWYKKyAgaWYgKCp0aHJlYWQgPT0gTlVMTCkgcmV0dXJuIDE7CisgIFNldFRocmVhZFByaW9yaXR5KCp0aHJlYWQsIFRIUkVBRF9QUklPUklUWV9BQk9WRV9OT1JNQUwpOworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwdGhyZWFkX2pvaW4ocHRocmVhZF90IHRocmVhZCwgdm9pZCoqIHZhbHVlX3B0cikgeworICAodm9pZCl2YWx1ZV9wdHI7CisgIHJldHVybiAoV2FpdEZvclNpbmdsZU9iamVjdCh0aHJlYWQsIElORklOSVRFKSAhPSBXQUlUX09CSkVDVF8wIHx8CisgICAgICAgICAgQ2xvc2VIYW5kbGUodGhyZWFkKSA9PSAwKTsKK30KKworLy8gTXV0ZXgKK3N0YXRpYyBpbnQgcHRocmVhZF9tdXRleF9pbml0KHB0aHJlYWRfbXV0ZXhfdCogY29uc3QgbXV0ZXgsIHZvaWQqIG11dGV4YXR0cikgeworICAodm9pZCltdXRleGF0dHI7CisjaWYgX1dJTjMyX1dJTk5UID49IDB4MDYwMCAgLy8gV2luZG93cyBWaXN0YSAvIFNlcnZlciAyMDA4IG9yIGdyZWF0ZXIKKyAgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbkV4KG11dGV4LCAwIC8qZHdTcGluQ291bnQqLywgMCAvKkZsYWdzKi8pOworI2Vsc2UKKyAgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbihtdXRleCk7CisjZW5kaWYKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHRocmVhZF9tdXRleF9sb2NrKHB0aHJlYWRfbXV0ZXhfdCogY29uc3QgbXV0ZXgpIHsKKyAgRW50ZXJDcml0aWNhbFNlY3Rpb24obXV0ZXgpOworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwdGhyZWFkX211dGV4X3VubG9jayhwdGhyZWFkX211dGV4X3QqIGNvbnN0IG11dGV4KSB7CisgIExlYXZlQ3JpdGljYWxTZWN0aW9uKG11dGV4KTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHRocmVhZF9tdXRleF9kZXN0cm95KHB0aHJlYWRfbXV0ZXhfdCogY29uc3QgbXV0ZXgpIHsKKyAgRGVsZXRlQ3JpdGljYWxTZWN0aW9uKG11dGV4KTsKKyAgcmV0dXJuIDA7Cit9CisKKy8vIENvbmRpdGlvbgorc3RhdGljIGludCBwdGhyZWFkX2NvbmRfZGVzdHJveShwdGhyZWFkX2NvbmRfdCogY29uc3QgY29uZGl0aW9uKSB7CisgIGludCBvayA9IDE7CisjaWZkZWYgVVNFX1dJTkRPV1NfQ09ORElUSU9OX1ZBUklBQkxFCisgICh2b2lkKWNvbmRpdGlvbjsKKyNlbHNlCisgIG9rICY9IChDbG9zZUhhbmRsZShjb25kaXRpb24tPndhaXRpbmdfc2VtXykgIT0gMCk7CisgIG9rICY9IChDbG9zZUhhbmRsZShjb25kaXRpb24tPnJlY2VpdmVkX3NlbV8pICE9IDApOworICBvayAmPSAoQ2xvc2VIYW5kbGUoY29uZGl0aW9uLT5zaWduYWxfZXZlbnRfKSAhPSAwKTsKKyNlbmRpZgorICByZXR1cm4gIW9rOworfQorCitzdGF0aWMgaW50IHB0aHJlYWRfY29uZF9pbml0KHB0aHJlYWRfY29uZF90KiBjb25zdCBjb25kaXRpb24sIHZvaWQqIGNvbmRfYXR0cikgeworICAodm9pZCljb25kX2F0dHI7CisjaWZkZWYgVVNFX1dJTkRPV1NfQ09ORElUSU9OX1ZBUklBQkxFCisgIEluaXRpYWxpemVDb25kaXRpb25WYXJpYWJsZShjb25kaXRpb24pOworI2Vsc2UKKyAgY29uZGl0aW9uLT53YWl0aW5nX3NlbV8gPSBDcmVhdGVTZW1hcGhvcmUoTlVMTCwgMCwgMSwgTlVMTCk7CisgIGNvbmRpdGlvbi0+cmVjZWl2ZWRfc2VtXyA9IENyZWF0ZVNlbWFwaG9yZShOVUxMLCAwLCAxLCBOVUxMKTsKKyAgY29uZGl0aW9uLT5zaWduYWxfZXZlbnRfID0gQ3JlYXRlRXZlbnQoTlVMTCwgRkFMU0UsIEZBTFNFLCBOVUxMKTsKKyAgaWYgKGNvbmRpdGlvbi0+d2FpdGluZ19zZW1fID09IE5VTEwgfHwKKyAgICAgIGNvbmRpdGlvbi0+cmVjZWl2ZWRfc2VtXyA9PSBOVUxMIHx8CisgICAgICBjb25kaXRpb24tPnNpZ25hbF9ldmVudF8gPT0gTlVMTCkgeworICAgIHB0aHJlYWRfY29uZF9kZXN0cm95KGNvbmRpdGlvbik7CisgICAgcmV0dXJuIDE7CisgIH0KKyNlbmRpZgorICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwdGhyZWFkX2NvbmRfc2lnbmFsKHB0aHJlYWRfY29uZF90KiBjb25zdCBjb25kaXRpb24pIHsKKyAgaW50IG9rID0gMTsKKyNpZmRlZiBVU0VfV0lORE9XU19DT05ESVRJT05fVkFSSUFCTEUKKyAgV2FrZUNvbmRpdGlvblZhcmlhYmxlKGNvbmRpdGlvbik7CisjZWxzZQorICBpZiAoV2FpdEZvclNpbmdsZU9iamVjdChjb25kaXRpb24tPndhaXRpbmdfc2VtXywgMCkgPT0gV0FJVF9PQkpFQ1RfMCkgeworICAgIC8vIGEgdGhyZWFkIGlzIHdhaXRpbmcgaW4gcHRocmVhZF9jb25kX3dhaXQ6IGFsbG93IGl0IHRvIGJlIG5vdGlmaWVkCisgICAgb2sgPSBTZXRFdmVudChjb25kaXRpb24tPnNpZ25hbF9ldmVudF8pOworICAgIC8vIHdhaXQgdW50aWwgdGhlIGV2ZW50IGlzIGNvbnN1bWVkIHNvIHRoZSBzaWduYWxlciBjYW5ub3QgY29uc3VtZQorICAgIC8vIHRoZSBldmVudCB2aWEgaXRzIG93biBwdGhyZWFkX2NvbmRfd2FpdC4KKyAgICBvayAmPSAoV2FpdEZvclNpbmdsZU9iamVjdChjb25kaXRpb24tPnJlY2VpdmVkX3NlbV8sIElORklOSVRFKSAhPQorICAgICAgICAgICBXQUlUX09CSkVDVF8wKTsKKyAgfQorI2VuZGlmCisgIHJldHVybiAhb2s7Cit9CisKK3N0YXRpYyBpbnQgcHRocmVhZF9jb25kX3dhaXQocHRocmVhZF9jb25kX3QqIGNvbnN0IGNvbmRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF90KiBjb25zdCBtdXRleCkgeworICBpbnQgb2s7CisjaWZkZWYgVVNFX1dJTkRPV1NfQ09ORElUSU9OX1ZBUklBQkxFCisgIG9rID0gU2xlZXBDb25kaXRpb25WYXJpYWJsZUNTKGNvbmRpdGlvbiwgbXV0ZXgsIElORklOSVRFKTsKKyNlbHNlCisgIC8vIG5vdGUgdGhhdCB0aGVyZSBpcyBhIGNvbnN1bWVyIGF2YWlsYWJsZSBzbyB0aGUgc2lnbmFsIGlzbid0IGRyb3BwZWQgaW4KKyAgLy8gcHRocmVhZF9jb25kX3NpZ25hbAorICBpZiAoIVJlbGVhc2VTZW1hcGhvcmUoY29uZGl0aW9uLT53YWl0aW5nX3NlbV8sIDEsIE5VTEwpKSByZXR1cm4gMTsKKyAgLy8gbm93IHVubG9jayB0aGUgbXV0ZXggc28gcHRocmVhZF9jb25kX3NpZ25hbCBtYXkgYmUgaXNzdWVkCisgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKG11dGV4KTsKKyAgb2sgPSAoV2FpdEZvclNpbmdsZU9iamVjdChjb25kaXRpb24tPnNpZ25hbF9ldmVudF8sIElORklOSVRFKSA9PQorICAgICAgICBXQUlUX09CSkVDVF8wKTsKKyAgb2sgJj0gUmVsZWFzZVNlbWFwaG9yZShjb25kaXRpb24tPnJlY2VpdmVkX3NlbV8sIDEsIE5VTEwpOworICBwdGhyZWFkX211dGV4X2xvY2sobXV0ZXgpOworI2VuZGlmCisgIHJldHVybiAhb2s7Cit9CisKKyNlbHNlICAvLyAhX1dJTjMyCisjIGRlZmluZSBUSFJFQURGTiB2b2lkKgorIyBkZWZpbmUgVEhSRUFEX1JFVFVSTih2YWwpIHZhbAorI2VuZGlmICAvLyBfV0lOMzIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIFRIUkVBREZOIFRocmVhZExvb3Aodm9pZCogcHRyKSB7CisgIFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlciA9IChXZWJQV29ya2VyKilwdHI7CisgIFdlYlBXb3JrZXJJbXBsKiBjb25zdCBpbXBsID0gKFdlYlBXb3JrZXJJbXBsKil3b3JrZXItPmltcGxfOworICBpbnQgZG9uZSA9IDA7CisgIHdoaWxlICghZG9uZSkgeworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmaW1wbC0+bXV0ZXhfKTsKKyAgICB3aGlsZSAod29ya2VyLT5zdGF0dXNfID09IE9LKSB7ICAgLy8gd2FpdCBpbiBpZGxpbmcgbW9kZQorICAgICAgcHRocmVhZF9jb25kX3dhaXQoJmltcGwtPmNvbmRpdGlvbl8sICZpbXBsLT5tdXRleF8pOworICAgIH0KKyAgICBpZiAod29ya2VyLT5zdGF0dXNfID09IFdPUkspIHsKKyAgICAgIFdlYlBHZXRXb3JrZXJJbnRlcmZhY2UoKS0+RXhlY3V0ZSh3b3JrZXIpOworICAgICAgd29ya2VyLT5zdGF0dXNfID0gT0s7CisgICAgfSBlbHNlIGlmICh3b3JrZXItPnN0YXR1c18gPT0gTk9UX09LKSB7ICAgLy8gZmluaXNoIHRoZSB3b3JrZXIKKyAgICAgIGRvbmUgPSAxOworICAgIH0KKyAgICAvLyBzaWduYWwgdG8gdGhlIG1haW4gdGhyZWFkIHRoYXQgd2UncmUgZG9uZSAoZm9yIFN5bmMoKSkKKyAgICBwdGhyZWFkX2NvbmRfc2lnbmFsKCZpbXBsLT5jb25kaXRpb25fKTsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmaW1wbC0+bXV0ZXhfKTsKKyAgfQorICByZXR1cm4gVEhSRUFEX1JFVFVSTihOVUxMKTsgICAgLy8gVGhyZWFkIGlzIGZpbmlzaGVkCit9CisKKy8vIG1haW4gdGhyZWFkIHN0YXRlIGNvbnRyb2wKK3N0YXRpYyB2b2lkIENoYW5nZVN0YXRlKFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlciwgV2ViUFdvcmtlclN0YXR1cyBuZXdfc3RhdHVzKSB7CisgIC8vIE5vLW9wIHdoZW4gYXR0ZW1wdGluZyB0byBjaGFuZ2Ugc3RhdGUgb24gYSB0aHJlYWQgdGhhdCBkaWRuJ3QgY29tZSB1cC4KKyAgLy8gQ2hlY2tpbmcgc3RhdHVzXyB3aXRob3V0IGFjcXVpcmluZyB0aGUgbG9jayBmaXJzdCB3b3VsZCByZXN1bHQgaW4gYSBkYXRhCisgIC8vIHJhY2UuCisgIFdlYlBXb3JrZXJJbXBsKiBjb25zdCBpbXBsID0gKFdlYlBXb3JrZXJJbXBsKil3b3JrZXItPmltcGxfOworICBpZiAoaW1wbCA9PSBOVUxMKSByZXR1cm47CisKKyAgcHRocmVhZF9tdXRleF9sb2NrKCZpbXBsLT5tdXRleF8pOworICBpZiAod29ya2VyLT5zdGF0dXNfID49IE9LKSB7CisgICAgLy8gd2FpdCBmb3IgdGhlIHdvcmtlciB0byBmaW5pc2gKKyAgICB3aGlsZSAod29ya2VyLT5zdGF0dXNfICE9IE9LKSB7CisgICAgICBwdGhyZWFkX2NvbmRfd2FpdCgmaW1wbC0+Y29uZGl0aW9uXywgJmltcGwtPm11dGV4Xyk7CisgICAgfQorICAgIC8vIGFzc2lnbiBuZXcgc3RhdHVzIGFuZCByZWxlYXNlIHRoZSB3b3JraW5nIHRocmVhZCBpZiBuZWVkZWQKKyAgICBpZiAobmV3X3N0YXR1cyAhPSBPSykgeworICAgICAgd29ya2VyLT5zdGF0dXNfID0gbmV3X3N0YXR1czsKKyAgICAgIHB0aHJlYWRfY29uZF9zaWduYWwoJmltcGwtPmNvbmRpdGlvbl8pOworICAgIH0KKyAgfQorICBwdGhyZWFkX211dGV4X3VubG9jaygmaW1wbC0+bXV0ZXhfKTsKK30KKworI2VuZGlmICAvLyBXRUJQX1VTRV9USFJFQUQKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgSW5pdChXZWJQV29ya2VyKiBjb25zdCB3b3JrZXIpIHsKKyAgbWVtc2V0KHdvcmtlciwgMCwgc2l6ZW9mKCp3b3JrZXIpKTsKKyAgd29ya2VyLT5zdGF0dXNfID0gTk9UX09LOworfQorCitzdGF0aWMgaW50IFN5bmMoV2ViUFdvcmtlciogY29uc3Qgd29ya2VyKSB7CisjaWZkZWYgV0VCUF9VU0VfVEhSRUFECisgIENoYW5nZVN0YXRlKHdvcmtlciwgT0spOworI2VuZGlmCisgIGFzc2VydCh3b3JrZXItPnN0YXR1c18gPD0gT0spOworICByZXR1cm4gIXdvcmtlci0+aGFkX2Vycm9yOworfQorCitzdGF0aWMgaW50IFJlc2V0KFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlcikgeworICBpbnQgb2sgPSAxOworICB3b3JrZXItPmhhZF9lcnJvciA9IDA7CisgIGlmICh3b3JrZXItPnN0YXR1c18gPCBPSykgeworI2lmZGVmIFdFQlBfVVNFX1RIUkVBRAorICAgIFdlYlBXb3JrZXJJbXBsKiBjb25zdCBpbXBsID0KKyAgICAgICAgKFdlYlBXb3JrZXJJbXBsKilXZWJQU2FmZUNhbGxvYygxLCBzaXplb2YoV2ViUFdvcmtlckltcGwpKTsKKyAgICB3b3JrZXItPmltcGxfID0gKHZvaWQqKWltcGw7CisgICAgaWYgKHdvcmtlci0+aW1wbF8gPT0gTlVMTCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChwdGhyZWFkX211dGV4X2luaXQoJmltcGwtPm11dGV4XywgTlVMTCkpIHsKKyAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorICAgIGlmIChwdGhyZWFkX2NvbmRfaW5pdCgmaW1wbC0+Y29uZGl0aW9uXywgTlVMTCkpIHsKKyAgICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmaW1wbC0+bXV0ZXhfKTsKKyAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmaW1wbC0+bXV0ZXhfKTsKKyAgICBvayA9ICFwdGhyZWFkX2NyZWF0ZSgmaW1wbC0+dGhyZWFkXywgTlVMTCwgVGhyZWFkTG9vcCwgd29ya2VyKTsKKyAgICBpZiAob2spIHdvcmtlci0+c3RhdHVzXyA9IE9LOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZpbXBsLT5tdXRleF8pOworICAgIGlmICghb2spIHsKKyAgICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmaW1wbC0+bXV0ZXhfKTsKKyAgICAgIHB0aHJlYWRfY29uZF9kZXN0cm95KCZpbXBsLT5jb25kaXRpb25fKTsKKyBFcnJvcjoKKyAgICAgIFdlYlBTYWZlRnJlZShpbXBsKTsKKyAgICAgIHdvcmtlci0+aW1wbF8gPSBOVUxMOworICAgICAgcmV0dXJuIDA7CisgICAgfQorI2Vsc2UKKyAgICB3b3JrZXItPnN0YXR1c18gPSBPSzsKKyNlbmRpZgorICB9IGVsc2UgaWYgKHdvcmtlci0+c3RhdHVzXyA+IE9LKSB7CisgICAgb2sgPSBTeW5jKHdvcmtlcik7CisgIH0KKyAgYXNzZXJ0KCFvayB8fCAod29ya2VyLT5zdGF0dXNfID09IE9LKSk7CisgIHJldHVybiBvazsKK30KKworc3RhdGljIHZvaWQgRXhlY3V0ZShXZWJQV29ya2VyKiBjb25zdCB3b3JrZXIpIHsKKyAgaWYgKHdvcmtlci0+aG9vayAhPSBOVUxMKSB7CisgICAgd29ya2VyLT5oYWRfZXJyb3IgfD0gIXdvcmtlci0+aG9vayh3b3JrZXItPmRhdGExLCB3b3JrZXItPmRhdGEyKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBMYXVuY2goV2ViUFdvcmtlciogY29uc3Qgd29ya2VyKSB7CisjaWZkZWYgV0VCUF9VU0VfVEhSRUFECisgIENoYW5nZVN0YXRlKHdvcmtlciwgV09SSyk7CisjZWxzZQorICBFeGVjdXRlKHdvcmtlcik7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgRW5kKFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlcikgeworI2lmZGVmIFdFQlBfVVNFX1RIUkVBRAorICBpZiAod29ya2VyLT5pbXBsXyAhPSBOVUxMKSB7CisgICAgV2ViUFdvcmtlckltcGwqIGNvbnN0IGltcGwgPSAoV2ViUFdvcmtlckltcGwqKXdvcmtlci0+aW1wbF87CisgICAgQ2hhbmdlU3RhdGUod29ya2VyLCBOT1RfT0spOworICAgIHB0aHJlYWRfam9pbihpbXBsLT50aHJlYWRfLCBOVUxMKTsKKyAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJmltcGwtPm11dGV4Xyk7CisgICAgcHRocmVhZF9jb25kX2Rlc3Ryb3koJmltcGwtPmNvbmRpdGlvbl8pOworICAgIFdlYlBTYWZlRnJlZShpbXBsKTsKKyAgICB3b3JrZXItPmltcGxfID0gTlVMTDsKKyAgfQorI2Vsc2UKKyAgd29ya2VyLT5zdGF0dXNfID0gTk9UX09LOworICBhc3NlcnQod29ya2VyLT5pbXBsXyA9PSBOVUxMKTsKKyNlbmRpZgorICBhc3NlcnQod29ya2VyLT5zdGF0dXNfID09IE5PVF9PSyk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBXZWJQV29ya2VySW50ZXJmYWNlIGdfd29ya2VyX2ludGVyZmFjZSA9IHsKKyAgSW5pdCwgUmVzZXQsIFN5bmMsIExhdW5jaCwgRXhlY3V0ZSwgRW5kCit9OworCitpbnQgV2ViUFNldFdvcmtlckludGVyZmFjZShjb25zdCBXZWJQV29ya2VySW50ZXJmYWNlKiBjb25zdCB3aW50ZXJmYWNlKSB7CisgIGlmICh3aW50ZXJmYWNlID09IE5VTEwgfHwKKyAgICAgIHdpbnRlcmZhY2UtPkluaXQgPT0gTlVMTCB8fCB3aW50ZXJmYWNlLT5SZXNldCA9PSBOVUxMIHx8CisgICAgICB3aW50ZXJmYWNlLT5TeW5jID09IE5VTEwgfHwgd2ludGVyZmFjZS0+TGF1bmNoID09IE5VTEwgfHwKKyAgICAgIHdpbnRlcmZhY2UtPkV4ZWN1dGUgPT0gTlVMTCB8fCB3aW50ZXJmYWNlLT5FbmQgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisgIGdfd29ya2VyX2ludGVyZmFjZSA9ICp3aW50ZXJmYWNlOworICByZXR1cm4gMTsKK30KKworY29uc3QgV2ViUFdvcmtlckludGVyZmFjZSogV2ViUEdldFdvcmtlckludGVyZmFjZSh2b2lkKSB7CisgIHJldHVybiAmZ193b3JrZXJfaW50ZXJmYWNlOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL3RocmVhZF91dGlscy5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL3RocmVhZF91dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YWU2YzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvdGhyZWFkX3V0aWxzLmgKQEAgLTAsMCArMSw5MCBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIE11bHRpLXRocmVhZGVkIHdvcmtlcgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpZm5kZWYgV0VCUF9VVElMU19USFJFQURfVVRJTFNfSF8KKyNkZWZpbmUgV0VCUF9VVElMU19USFJFQURfVVRJTFNfSF8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJzcmMvd2VicC9jb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAic3JjL3dlYnAvdHlwZXMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvLyBTdGF0ZSBvZiB0aGUgd29ya2VyIHRocmVhZCBvYmplY3QKK3R5cGVkZWYgZW51bSB7CisgIE5PVF9PSyA9IDAsICAgLy8gb2JqZWN0IGlzIHVudXNhYmxlCisgIE9LLCAgICAgICAgICAgLy8gcmVhZHkgdG8gd29yaworICBXT1JLICAgICAgICAgIC8vIGJ1c3kgZmluaXNoaW5nIHRoZSBjdXJyZW50IHRhc2sKK30gV2ViUFdvcmtlclN0YXR1czsKKworLy8gRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJ5IHRoZSB3b3JrZXIgdGhyZWFkLiBUYWtlcyB0d28gb3BhcXVlIHBvaW50ZXJzIGFzCisvLyBhcmd1bWVudHMgKGRhdGExIGFuZCBkYXRhMiksIGFuZCBzaG91bGQgcmV0dXJuIGZhbHNlIGluIGNhc2Ugb2YgZXJyb3IuCit0eXBlZGVmIGludCAoKldlYlBXb3JrZXJIb29rKSh2b2lkKiwgdm9pZCopOworCisvLyBTeW5jaHJvbml6YXRpb24gb2JqZWN0IHVzZWQgdG8gbGF1bmNoIGpvYiBpbiB0aGUgd29ya2VyIHRocmVhZAordHlwZWRlZiBzdHJ1Y3QgeworICB2b2lkKiBpbXBsXzsgICAgICAgICAgICAvLyBwbGF0Zm9ybS1kZXBlbmRlbnQgaW1wbGVtZW50YXRpb24gd29ya2VyIGRldGFpbHMKKyAgV2ViUFdvcmtlclN0YXR1cyBzdGF0dXNfOworICBXZWJQV29ya2VySG9vayBob29rOyAgICAvLyBob29rIHRvIGNhbGwKKyAgdm9pZCogZGF0YTE7ICAgICAgICAgICAgLy8gZmlyc3QgYXJndW1lbnQgcGFzc2VkIHRvICdob29rJworICB2b2lkKiBkYXRhMjsgICAgICAgICAgICAvLyBzZWNvbmQgYXJndW1lbnQgcGFzc2VkIHRvICdob29rJworICBpbnQgaGFkX2Vycm9yOyAgICAgICAgICAvLyByZXR1cm4gdmFsdWUgb2YgdGhlIGxhc3QgY2FsbCB0byAnaG9vaycKK30gV2ViUFdvcmtlcjsKKworLy8gVGhlIGludGVyZmFjZSBmb3IgYWxsIHRocmVhZC13b3JrZXIgcmVsYXRlZCBmdW5jdGlvbnMuIEFsbCB0aGVzZSBmdW5jdGlvbnMKKy8vIG11c3QgYmUgaW1wbGVtZW50ZWQuCit0eXBlZGVmIHN0cnVjdCB7CisgIC8vIE11c3QgYmUgY2FsbGVkIGZpcnN0LCBiZWZvcmUgYW55IG90aGVyIG1ldGhvZC4KKyAgdm9pZCAoKkluaXQpKFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlcik7CisgIC8vIE11c3QgYmUgY2FsbGVkIHRvIGluaXRpYWxpemUgdGhlIG9iamVjdCBhbmQgc3Bhd24gdGhlIHRocmVhZC4gUmUtZW50cmFudC4KKyAgLy8gV2lsbCBwb3RlbnRpYWxseSBsYXVuY2ggdGhlIHRocmVhZC4gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIGVycm9yLgorICBpbnQgKCpSZXNldCkoV2ViUFdvcmtlciogY29uc3Qgd29ya2VyKTsKKyAgLy8gTWFrZXMgc3VyZSB0aGUgcHJldmlvdXMgd29yayBpcyBmaW5pc2hlZC4gUmV0dXJucyB0cnVlIGlmIHdvcmtlci0+aGFkX2Vycm9yCisgIC8vIHdhcyBub3Qgc2V0IGFuZCBubyBlcnJvciBjb25kaXRpb24gd2FzIHRyaWdnZXJlZCBieSB0aGUgd29ya2luZyB0aHJlYWQuCisgIGludCAoKlN5bmMpKFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlcik7CisgIC8vIFRyaWdnZXJzIHRoZSB0aHJlYWQgdG8gY2FsbCBob29rKCkgd2l0aCBkYXRhMSBhbmQgZGF0YTIgYXJndW1lbnRzLiBUaGVzZQorICAvLyBob29rL2RhdGExL2RhdGEyIHZhbHVlcyBjYW4gYmUgY2hhbmdlZCBhdCBhbnkgdGltZSBiZWZvcmUgY2FsbGluZyB0aGlzCisgIC8vIGZ1bmN0aW9uLCBidXQgbm90IGJlIGNoYW5nZWQgYWZ0ZXJ3YXJkIHVudGlsIHRoZSBuZXh0IGNhbGwgdG8gU3luYygpLgorICB2b2lkICgqTGF1bmNoKShXZWJQV29ya2VyKiBjb25zdCB3b3JrZXIpOworICAvLyBUaGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gTGF1bmNoKCkgZXhjZXB0IHRoYXQgaXQgY2FsbHMgdGhlCisgIC8vIGhvb2sgZGlyZWN0bHkgaW5zdGVhZCBvZiB1c2luZyBhIHRocmVhZC4gQ29udmVuaWVudCB0byBieXBhc3MgdGhlIHRocmVhZAorICAvLyBtZWNoYW5pc20gd2hpbGUgc3RpbGwgdXNpbmcgdGhlIFdlYlBXb3JrZXIgc3RydWN0cy4gU3luYygpIG11c3QKKyAgLy8gc3RpbGwgYmUgY2FsbGVkIGFmdGVyd2FyZCAoZm9yIGVycm9yIHJlcG9ydGluZykuCisgIHZvaWQgKCpFeGVjdXRlKShXZWJQV29ya2VyKiBjb25zdCB3b3JrZXIpOworICAvLyBLaWxsIHRoZSB0aHJlYWQgYW5kIHRlcm1pbmF0ZSB0aGUgb2JqZWN0LiBUbyB1c2UgdGhlIG9iamVjdCBhZ2Fpbiwgb25lCisgIC8vIG11c3QgY2FsbCBSZXNldCgpIGFnYWluLgorICB2b2lkICgqRW5kKShXZWJQV29ya2VyKiBjb25zdCB3b3JrZXIpOworfSBXZWJQV29ya2VySW50ZXJmYWNlOworCisvLyBJbnN0YWxsIGEgbmV3IHNldCBvZiB0aHJlYWRpbmcgZnVuY3Rpb25zLCBvdmVycmlkaW5nIHRoZSBkZWZhdWx0cy4gVGhpcworLy8gc2hvdWxkIGJlIGRvbmUgYmVmb3JlIGFueSB3b3JrZXJzIGFyZSBzdGFydGVkLCBpLmUuLCBiZWZvcmUgYW55IGVuY29kaW5nIG9yCisvLyBkZWNvZGluZyB0YWtlcyBwbGFjZS4gVGhlIGNvbnRlbnRzIG9mIHRoZSBpbnRlcmZhY2Ugc3RydWN0IGFyZSBjb3BpZWQsIGl0CisvLyBpcyBzYWZlIHRvIGZyZWUgdGhlIGNvcnJlc3BvbmRpbmcgbWVtb3J5IGFmdGVyIHRoaXMgY2FsbC4gVGhpcyBmdW5jdGlvbiBpcworLy8gbm90IHRocmVhZC1zYWZlLiBSZXR1cm4gZmFsc2UgaW4gY2FzZSBvZiBpbnZhbGlkIHBvaW50ZXIgb3IgbWV0aG9kcy4KK1dFQlBfRVhURVJOIGludCBXZWJQU2V0V29ya2VySW50ZXJmYWNlKAorICAgIGNvbnN0IFdlYlBXb3JrZXJJbnRlcmZhY2UqIGNvbnN0IHdpbnRlcmZhY2UpOworCisvLyBSZXRyaWV2ZSB0aGUgY3VycmVudGx5IHNldCB0aHJlYWQgd29ya2VyIGludGVyZmFjZS4KK1dFQlBfRVhURVJOIGNvbnN0IFdlYlBXb3JrZXJJbnRlcmZhY2UqIFdlYlBHZXRXb3JrZXJJbnRlcmZhY2Uodm9pZCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvKiBXRUJQX1VUSUxTX1RIUkVBRF9VVElMU19IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL3V0aWxzLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDY0ODZhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL3V0aWxzLmMKQEAgLTAsMCArMSwzMzkgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBNaXNjLiBjb21tb24gdXRpbGl0eSBmdW5jdGlvbnMKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vYXNzZXJ0X3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdGRpb19wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RkbGliX3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdfcG9lbS5oIgorI2Vsc2UKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4gIC8vIGZvciBtZW1jcHkoKQorI2VuZGlmCisjaW5jbHVkZSAic3JjL3dlYnAvZGVjb2RlLmgiCisjaW5jbHVkZSAic3JjL3dlYnAvZW5jb2RlLmgiCisjaW5jbHVkZSAic3JjL3dlYnAvZm9ybWF0X2NvbnN0YW50cy5oIiAgLy8gZm9yIE1BWF9QQUxFVFRFX1NJWkUKKyNpbmNsdWRlICJzcmMvdXRpbHMvY29sb3JfY2FjaGVfdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKKworLy8gSWYgUFJJTlRfTUVNX0lORk8gaXMgZGVmaW5lZCwgZXh0cmEgaW5mbyAobGlrZSB0b3RhbCBtZW1vcnkgdXNlZCwgbnVtYmVyIG9mCisvLyBhbGxvYy9mcmVlIGV0YykgaXMgcHJpbnRlZC4gRm9yIGRlYnVnZ2luZy90dW5pbmcgcHVycG9zZSBvbmx5IChpdCdzIHNsb3csCisvLyBhbmQgbm90IG11bHRpLXRocmVhZCBzYWZlISkuCisvLyBBbiBpbnRlcmVzdGluZyBhbHRlcm5hdGl2ZSBpcyB2YWxncmluZCdzICdtYXNzaWYnIHRvb2w6CisvLyAgICBodHRwOi8vdmFsZ3JpbmQub3JnL2RvY3MvbWFudWFsL21zLW1hbnVhbC5odG1sCisvLyBIZXJlIGlzIGFuIGV4YW1wbGUgY29tbWFuZCBsaW5lOgorLyogICAgdmFsZ3JpbmQgLS10b29sPW1hc3NpZiAtLW1hc3NpZi1vdXQtZmlsZT1tYXNzaWYub3V0IFwKKyAgICAgICAgICAgICAgIC0tc3RhY2tzPXllcyAtLWFsbG9jLWZuPVdlYlBTYWZlTWFsbG9jIC0tYWxsb2MtZm49V2ViUFNhZmVDYWxsb2MKKyAgICAgIG1zX3ByaW50IG1hc3NpZi5vdXQKKyovCisvLyBJbiBhZGRpdGlvbjoKKy8vICogaWYgUFJJTlRfTUVNX1RSQUZGSUMgaXMgZGVmaW5lZCwgYWxsIHRoZSBkZXRhaWxzIG9mIHRoZSBtYWxsb2MvZnJlZSBjeWNsZXMKKy8vICAgYXJlIHByaW50ZWQuCisvLyAqIGlmIE1BTExPQ19GQUlMX0FUIGlzIGRlZmluZWQsIHRoZSBnbG9iYWwgZW52aXJvbm1lbnQgdmFyaWFibGUKKy8vICAgJE1BTExPQ19GQUlMX0FUIGlzIHVzZWQgdG8gc2ltdWxhdGUgYSBtZW1vcnkgZXJyb3Igd2hlbiBjYWxsb2Mgb3IgbWFsbG9jCisvLyAgIGlzIGNhbGxlZCBmb3IgdGhlIG50aCB0aW1lLiBFeGFtcGxlIHVzYWdlOgorLy8gICBleHBvcnQgTUFMTE9DX0ZBSUxfQVQ9NTAgJiYgLi9leGFtcGxlcy9jd2VicCBpbnB1dC5wbmcKKy8vICogaWYgTUFMTE9DX0xJTUlUIGlzIGRlZmluZWQsIHRoZSBnbG9iYWwgZW52aXJvbm1lbnQgdmFyaWFibGUgJE1BTExPQ19MSU1JVAorLy8gICBzZXRzIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBtZW1vcnkgKGluIGJ5dGVzKSBtYWRlIGF2YWlsYWJsZSB0byBsaWJ3ZWJwLgorLy8gICBUaGlzIGNhbiBiZSB1c2VkIHRvIGVtdWxhdGUgZW52aXJvbm1lbnQgd2l0aCB2ZXJ5IGxpbWl0ZWQgbWVtb3J5LgorLy8gICBFeGFtcGxlOiBleHBvcnQgTUFMTE9DX0xJTUlUPTY0MDAwMDAwICYmIC4vZXhhbXBsZXMvZHdlYnAgcGljdHVyZS53ZWJwCisKKy8vICNkZWZpbmUgUFJJTlRfTUVNX0lORk8KKy8vICNkZWZpbmUgUFJJTlRfTUVNX1RSQUZGSUMKKy8vICNkZWZpbmUgTUFMTE9DX0ZBSUxfQVQKKy8vICNkZWZpbmUgTUFMTE9DX0xJTUlUCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDaGVja2VkIG1lbW9yeSBhbGxvY2F0aW9uCisKKyNpZiBkZWZpbmVkKFBSSU5UX01FTV9JTkZPKQorCisjaWYgIWRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgPHN0ZGlvLmg+CisjZW5kaWYKKworc3RhdGljIGludCBudW1fbWFsbG9jX2NhbGxzID0gMDsKK3N0YXRpYyBpbnQgbnVtX2NhbGxvY19jYWxscyA9IDA7CitzdGF0aWMgaW50IG51bV9mcmVlX2NhbGxzID0gMDsKK3N0YXRpYyBpbnQgY291bnRkb3duX3RvX2ZhaWwgPSAwOyAgICAgLy8gMCA9IG9mZgorCit0eXBlZGVmIHN0cnVjdCBNZW1CbG9jayBNZW1CbG9jazsKK3N0cnVjdCBNZW1CbG9jayB7CisgIHZvaWQqIHB0cl87CisgIHNpemVfdCBzaXplXzsKKyAgTWVtQmxvY2sqIG5leHRfOworfTsKKworc3RhdGljIE1lbUJsb2NrKiBhbGxfYmxvY2tzID0gTlVMTDsKK3N0YXRpYyBzaXplX3QgdG90YWxfbWVtID0gMDsKK3N0YXRpYyBzaXplX3QgdG90YWxfbWVtX2FsbG9jYXRlZCA9IDA7CitzdGF0aWMgc2l6ZV90IGhpZ2hfd2F0ZXJfbWFyayA9IDA7CitzdGF0aWMgc2l6ZV90IG1lbV9saW1pdCA9IDA7CisKK3N0YXRpYyBpbnQgZXhpdF9yZWdpc3RlcmVkID0gMDsKKworc3RhdGljIHZvaWQgUHJpbnRNZW1JbmZvKHZvaWQpIHsKKyAgZnByaW50ZihzdGRlcnIsICJcbk1FTU9SWSBJTkZPOlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAibnVtIGNhbGxzIHRvOiBtYWxsb2MgPSAlNGRcbiIsIG51bV9tYWxsb2NfY2FsbHMpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgY2FsbG9jID0gJTRkXG4iLCBudW1fY2FsbG9jX2NhbGxzKTsKKyAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgIGZyZWUgICA9ICU0ZFxuIiwgbnVtX2ZyZWVfY2FsbHMpOworICBmcHJpbnRmKHN0ZGVyciwgInRvdGFsX21lbTogJXVcbiIsICh1aW50MzJfdCl0b3RhbF9tZW0pOworICBmcHJpbnRmKHN0ZGVyciwgInRvdGFsX21lbSBhbGxvY2F0ZWQ6ICV1XG4iLCAodWludDMyX3QpdG90YWxfbWVtX2FsbG9jYXRlZCk7CisgIGZwcmludGYoc3RkZXJyLCAiaGlnaC13YXRlciBtYXJrOiAldVxuIiwgKHVpbnQzMl90KWhpZ2hfd2F0ZXJfbWFyayk7CisgIHdoaWxlIChhbGxfYmxvY2tzICE9IE5VTEwpIHsKKyAgICBNZW1CbG9jayogYiA9IGFsbF9ibG9ja3M7CisgICAgYWxsX2Jsb2NrcyA9IGItPm5leHRfOworICAgIGZyZWUoYik7CisgIH0KK30KKworc3RhdGljIHZvaWQgSW5jcmVtZW50KGludCogY29uc3QgdikgeworICBpZiAoIWV4aXRfcmVnaXN0ZXJlZCkgeworI2lmIGRlZmluZWQoTUFMTE9DX0ZBSUxfQVQpCisgICAgeworICAgICAgY29uc3QgY2hhciogY29uc3QgbWFsbG9jX2ZhaWxfYXRfc3RyID0gZ2V0ZW52KCJNQUxMT0NfRkFJTF9BVCIpOworICAgICAgaWYgKG1hbGxvY19mYWlsX2F0X3N0ciAhPSBOVUxMKSB7CisgICAgICAgIGNvdW50ZG93bl90b19mYWlsID0gYXRvaShtYWxsb2NfZmFpbF9hdF9zdHIpOworICAgICAgfQorICAgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoTUFMTE9DX0xJTUlUKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIqIGNvbnN0IG1hbGxvY19saW1pdF9zdHIgPSBnZXRlbnYoIk1BTExPQ19MSU1JVCIpOworICAgICAgaWYgKG1hbGxvY19saW1pdF9zdHIgIT0gTlVMTCkgeworICAgICAgICBtZW1fbGltaXQgPSBhdG9pKG1hbGxvY19saW1pdF9zdHIpOworICAgICAgfQorICAgIH0KKyNlbmRpZgorICAgICh2b2lkKWNvdW50ZG93bl90b19mYWlsOworICAgICh2b2lkKW1lbV9saW1pdDsKKyAgICBhdGV4aXQoUHJpbnRNZW1JbmZvKTsKKyAgICBleGl0X3JlZ2lzdGVyZWQgPSAxOworICB9CisgICsrKnY7Cit9CisKK3N0YXRpYyB2b2lkIEFkZE1lbSh2b2lkKiBwdHIsIHNpemVfdCBzaXplKSB7CisgIGlmIChwdHIgIT0gTlVMTCkgeworICAgIE1lbUJsb2NrKiBjb25zdCBiID0gKE1lbUJsb2NrKiltYWxsb2Moc2l6ZW9mKCpiKSk7CisgICAgaWYgKGIgPT0gTlVMTCkgYWJvcnQoKTsKKyAgICBiLT5uZXh0XyA9IGFsbF9ibG9ja3M7CisgICAgYWxsX2Jsb2NrcyA9IGI7CisgICAgYi0+cHRyXyA9IHB0cjsKKyAgICBiLT5zaXplXyA9IHNpemU7CisgICAgdG90YWxfbWVtICs9IHNpemU7CisgICAgdG90YWxfbWVtX2FsbG9jYXRlZCArPSBzaXplOworI2lmIGRlZmluZWQoUFJJTlRfTUVNX1RSQUZGSUMpCisjaWYgZGVmaW5lZChNQUxMT0NfRkFJTF9BVCkKKyAgICBmcHJpbnRmKHN0ZGVyciwgImZhaWwtY291bnQ6ICU1ZCBbbWVtPSV1XVxuIiwKKyAgICAgICAgICAgIG51bV9tYWxsb2NfY2FsbHMgKyBudW1fY2FsbG9jX2NhbGxzLCAodWludDMyX3QpdG90YWxfbWVtKTsKKyNlbHNlCisgICAgZnByaW50ZihzdGRlcnIsICJNZW06ICV1ICgrJXUpXG4iLCAodWludDMyX3QpdG90YWxfbWVtLCAodWludDMyX3Qpc2l6ZSk7CisjZW5kaWYKKyNlbmRpZgorICAgIGlmICh0b3RhbF9tZW0gPiBoaWdoX3dhdGVyX21hcmspIGhpZ2hfd2F0ZXJfbWFyayA9IHRvdGFsX21lbTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBTdWJNZW0odm9pZCogcHRyKSB7CisgIGlmIChwdHIgIT0gTlVMTCkgeworICAgIE1lbUJsb2NrKiogYiA9ICZhbGxfYmxvY2tzOworICAgIC8vIEluZWZmaWNpZW50IHNlYXJjaCwgYnV0IHRoYXQncyBqdXN0IGZvciBkZWJ1Z2dpbmcuCisgICAgd2hpbGUgKCpiICE9IE5VTEwgJiYgKCpiKS0+cHRyXyAhPSBwdHIpIGIgPSAmKCpiKS0+bmV4dF87CisgICAgaWYgKCpiID09IE5VTEwpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBwb2ludGVyIGZyZWUhICglcClcbiIsIHB0cik7CisgICAgICBhYm9ydCgpOworICAgIH0KKyAgICB7CisgICAgICBNZW1CbG9jayogY29uc3QgYmxvY2sgPSAqYjsKKyAgICAgICpiID0gYmxvY2stPm5leHRfOworICAgICAgdG90YWxfbWVtIC09IGJsb2NrLT5zaXplXzsKKyNpZiBkZWZpbmVkKFBSSU5UX01FTV9UUkFGRklDKQorICAgICAgZnByaW50ZihzdGRlcnIsICJNZW06ICV1ICgtJXUpXG4iLAorICAgICAgICAgICAgICAodWludDMyX3QpdG90YWxfbWVtLCAodWludDMyX3QpYmxvY2stPnNpemVfKTsKKyNlbmRpZgorICAgICAgZnJlZShibG9jayk7CisgICAgfQorICB9Cit9CisKKyNlbHNlCisjZGVmaW5lIEluY3JlbWVudCh2KSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgQWRkTWVtKHAsIHMpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBTdWJNZW0ocCkgICAgZG8ge30gd2hpbGUgKDApCisjZW5kaWYKKworLy8gUmV0dXJucyAwIGluIGNhc2Ugb2Ygb3ZlcmZsb3cgb2Ygbm1lbWIgKiBzaXplLgorc3RhdGljIGludCBDaGVja1NpemVBcmd1bWVudHNPdmVyZmxvdyh1aW50NjRfdCBubWVtYiwgc2l6ZV90IHNpemUpIHsKKyAgY29uc3QgdWludDY0X3QgdG90YWxfc2l6ZSA9IG5tZW1iICogc2l6ZTsKKyAgaWYgKG5tZW1iID09IDApIHJldHVybiAxOworICBpZiAoKHVpbnQ2NF90KXNpemUgPiBXRUJQX01BWF9BTExPQ0FCTEVfTUVNT1JZIC8gbm1lbWIpIHJldHVybiAwOworICBpZiAodG90YWxfc2l6ZSAhPSAoc2l6ZV90KXRvdGFsX3NpemUpIHJldHVybiAwOworI2lmIGRlZmluZWQoUFJJTlRfTUVNX0lORk8pICYmIGRlZmluZWQoTUFMTE9DX0ZBSUxfQVQpCisgIGlmIChjb3VudGRvd25fdG9fZmFpbCA+IDAgJiYgLS1jb3VudGRvd25fdG9fZmFpbCA9PSAwKSB7CisgICAgcmV0dXJuIDA7ICAgIC8vIGZha2UgZmFpbCEKKyAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChNQUxMT0NfTElNSVQpCisgIGlmIChtZW1fbGltaXQgPiAwKSB7CisgICAgY29uc3QgdWludDY0X3QgbmV3X3RvdGFsX21lbSA9ICh1aW50NjRfdCl0b3RhbF9tZW0gKyB0b3RhbF9zaXplOworICAgIGlmIChuZXdfdG90YWxfbWVtICE9IChzaXplX3QpbmV3X3RvdGFsX21lbSB8fAorICAgICAgICBuZXdfdG90YWxfbWVtID4gbWVtX2xpbWl0KSB7CisgICAgICByZXR1cm4gMDsgICAvLyBmYWtlIGZhaWwhCisgICAgfQorICB9CisjZW5kaWYKKworICByZXR1cm4gMTsKK30KKwordm9pZCogV2ViUFNhZmVNYWxsb2ModWludDY0X3Qgbm1lbWIsIHNpemVfdCBzaXplKSB7CisgIHZvaWQqIHB0cjsKKyAgSW5jcmVtZW50KCZudW1fbWFsbG9jX2NhbGxzKTsKKyAgaWYgKCFDaGVja1NpemVBcmd1bWVudHNPdmVyZmxvdyhubWVtYiwgc2l6ZSkpIHJldHVybiBOVUxMOworICBhc3NlcnQobm1lbWIgKiBzaXplID4gMCk7CisgIHB0ciA9IG1hbGxvYygoc2l6ZV90KShubWVtYiAqIHNpemUpKTsKKyAgQWRkTWVtKHB0ciwgKHNpemVfdCkobm1lbWIgKiBzaXplKSk7CisgIHJldHVybiBwdHI7Cit9CisKK3ZvaWQqIFdlYlBTYWZlQ2FsbG9jKHVpbnQ2NF90IG5tZW1iLCBzaXplX3Qgc2l6ZSkgeworICB2b2lkKiBwdHI7CisgIEluY3JlbWVudCgmbnVtX2NhbGxvY19jYWxscyk7CisgIGlmICghQ2hlY2tTaXplQXJndW1lbnRzT3ZlcmZsb3cobm1lbWIsIHNpemUpKSByZXR1cm4gTlVMTDsKKyAgYXNzZXJ0KG5tZW1iICogc2l6ZSA+IDApOworICBwdHIgPSBjYWxsb2MoKHNpemVfdClubWVtYiwgc2l6ZSk7CisgIEFkZE1lbShwdHIsIChzaXplX3QpKG5tZW1iICogc2l6ZSkpOworICByZXR1cm4gcHRyOworfQorCit2b2lkIFdlYlBTYWZlRnJlZSh2b2lkKiBjb25zdCBwdHIpIHsKKyAgaWYgKHB0ciAhPSBOVUxMKSB7CisgICAgSW5jcmVtZW50KCZudW1fZnJlZV9jYWxscyk7CisgICAgU3ViTWVtKHB0cik7CisgIH0KKyAgZnJlZShwdHIpOworfQorCisvLyBQdWJsaWMgQVBJIGZ1bmN0aW9uLgordm9pZCBXZWJQRnJlZSh2b2lkKiBwdHIpIHsKKyAgZnJlZShwdHIpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFdlYlBDb3B5UGxhbmUoY29uc3QgdWludDhfdCogc3JjLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBkc3Rfc3RyaWRlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgYXNzZXJ0KHNyYyAhPSBOVUxMICYmIGRzdCAhPSBOVUxMKTsKKyAgYXNzZXJ0KHNyY19zdHJpZGUgPj0gd2lkdGggJiYgZHN0X3N0cmlkZSA+PSB3aWR0aCk7CisgIHdoaWxlIChoZWlnaHQtLSA+IDApIHsKKyAgICBtZW1jcHkoZHN0LCBzcmMsIHdpZHRoKTsKKyAgICBzcmMgKz0gc3JjX3N0cmlkZTsKKyAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKyAgfQorfQorCit2b2lkIFdlYlBDb3B5UGl4ZWxzKGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBzcmMsIFdlYlBQaWN0dXJlKiBjb25zdCBkc3QpIHsKKyAgYXNzZXJ0KHNyYyAhPSBOVUxMICYmIGRzdCAhPSBOVUxMKTsKKyAgYXNzZXJ0KHNyYy0+d2lkdGggPT0gZHN0LT53aWR0aCAmJiBzcmMtPmhlaWdodCA9PSBkc3QtPmhlaWdodCk7CisgIGFzc2VydChzcmMtPnVzZV9hcmdiICYmIGRzdC0+dXNlX2FyZ2IpOworICBXZWJQQ29weVBsYW5lKCh1aW50OF90KilzcmMtPmFyZ2IsIDQgKiBzcmMtPmFyZ2Jfc3RyaWRlLCAodWludDhfdCopZHN0LT5hcmdiLAorICAgICAgICAgICAgICAgIDQgKiBkc3QtPmFyZ2Jfc3RyaWRlLCA0ICogc3JjLT53aWR0aCwgc3JjLT5oZWlnaHQpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIENPTE9SX0hBU0hfU0laRSAgICAgICAgIChNQVhfUEFMRVRURV9TSVpFICogNCkKKyNkZWZpbmUgQ09MT1JfSEFTSF9SSUdIVF9TSElGVCAgMjIgIC8vIDMyIC0gbG9nMihDT0xPUl9IQVNIX1NJWkUpLgorCitpbnQgV2ViUEdldENvbG9yUGFsZXR0ZShjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljLCB1aW50MzJfdCogY29uc3QgcGFsZXR0ZSkgeworICBpbnQgaTsKKyAgaW50IHgsIHk7CisgIGludCBudW1fY29sb3JzID0gMDsKKyAgdWludDhfdCBpbl91c2VbQ09MT1JfSEFTSF9TSVpFXSA9IHsgMCB9OworICB1aW50MzJfdCBjb2xvcnNbQ09MT1JfSEFTSF9TSVpFXTsKKyAgY29uc3QgdWludDMyX3QqIGFyZ2IgPSBwaWMtPmFyZ2I7CisgIGNvbnN0IGludCB3aWR0aCA9IHBpYy0+d2lkdGg7CisgIGNvbnN0IGludCBoZWlnaHQgPSBwaWMtPmhlaWdodDsKKyAgdWludDMyX3QgbGFzdF9waXggPSB+YXJnYlswXTsgICAvLyBzbyB3ZSdyZSBzdXJlIHRoYXQgbGFzdF9waXggIT0gYXJnYlswXQorICBhc3NlcnQocGljICE9IE5VTEwpOworICBhc3NlcnQocGljLT51c2VfYXJnYik7CisKKyAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CisgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKKyAgICAgIGludCBrZXk7CisgICAgICBpZiAoYXJnYlt4XSA9PSBsYXN0X3BpeCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGxhc3RfcGl4ID0gYXJnYlt4XTsKKyAgICAgIGtleSA9IFZQOExIYXNoUGl4KGxhc3RfcGl4LCBDT0xPUl9IQVNIX1JJR0hUX1NISUZUKTsKKyAgICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmICghaW5fdXNlW2tleV0pIHsKKyAgICAgICAgICBjb2xvcnNba2V5XSA9IGxhc3RfcGl4OworICAgICAgICAgIGluX3VzZVtrZXldID0gMTsKKyAgICAgICAgICArK251bV9jb2xvcnM7CisgICAgICAgICAgaWYgKG51bV9jb2xvcnMgPiBNQVhfUEFMRVRURV9TSVpFKSB7CisgICAgICAgICAgICByZXR1cm4gTUFYX1BBTEVUVEVfU0laRSArIDE7ICAvLyBFeGFjdCBjb3VudCBub3QgbmVlZGVkLgorICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmIChjb2xvcnNba2V5XSA9PSBsYXN0X3BpeCkgeworICAgICAgICAgIGJyZWFrOyAgLy8gVGhlIGNvbG9yIGlzIGFscmVhZHkgdGhlcmUuCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gU29tZSBvdGhlciBjb2xvciBzaXRzIGhlcmUsIHNvIGRvIGxpbmVhciBjb25mbGljdCByZXNvbHV0aW9uLgorICAgICAgICAgICsra2V5OworICAgICAgICAgIGtleSAmPSAoQ09MT1JfSEFTSF9TSVpFIC0gMSk7ICAvLyBLZXkgbWFzay4KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBhcmdiICs9IHBpYy0+YXJnYl9zdHJpZGU7CisgIH0KKworICBpZiAocGFsZXR0ZSAhPSBOVUxMKSB7ICAvLyBGaWxsIHRoZSBjb2xvcnMgaW50byBwYWxldHRlLgorICAgIG51bV9jb2xvcnMgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBDT0xPUl9IQVNIX1NJWkU7ICsraSkgeworICAgICAgaWYgKGluX3VzZVtpXSkgeworICAgICAgICBwYWxldHRlW251bV9jb2xvcnNdID0gY29sb3JzW2ldOworICAgICAgICArK251bV9jb2xvcnM7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBudW1fY29sb3JzOworfQorCisjdW5kZWYgQ09MT1JfSEFTSF9TSVpFCisjdW5kZWYgQ09MT1JfSEFTSF9SSUdIVF9TSElGVAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgZGVmaW5lZChXRUJQX05FRURfTE9HX1RBQkxFXzhCSVQpCitjb25zdCB1aW50OF90IFdlYlBMb2dUYWJsZThiaXRbMjU2XSA9IHsgICAvLyAzMSBeIGNseihpKQorICAwLCAwLCAxLCAxLCAyLCAyLCAyLCAyLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAorICA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LAorICA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LAorICA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LAorICA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LAorICA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LAorICA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LAorICA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LAorICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAorICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAorICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAorICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAorICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAorICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAorICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAorICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3Cit9OworI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvdXRpbHMuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy91dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YjlhZjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvdXRpbHMuaApAQCAtMCwwICsxLDE4NiBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIE1pc2MuIGNvbW1vbiB1dGlsaXR5IGZ1bmN0aW9ucworLy8KKy8vIEF1dGhvcnM6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorLy8gICAgICAgICAgVXJ2YW5nICh1cnZhbmdAZ29vZ2xlLmNvbSkKKworI2lmbmRlZiBXRUJQX1VUSUxTX1VUSUxTX0hfCisjZGVmaW5lIFdFQlBfVVRJTFNfVVRJTFNfSF8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJzcmMvd2VicC9jb25maWcuaCIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKKyNlbHNlCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisjaW5jbHVkZSAic3JjL3dlYnAvdHlwZXMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWVtb3J5IGFsbG9jYXRpb24KKworLy8gVGhpcyBpcyB0aGUgbWF4aW11bSBtZW1vcnkgYW1vdW50IHRoYXQgbGlid2VicCB3aWxsIGV2ZXIgdHJ5IHRvIGFsbG9jYXRlLgorI2lmbmRlZiBXRUJQX01BWF9BTExPQ0FCTEVfTUVNT1JZCisjaWYgU0laRV9NQVggPiAoMVVMTCA8PCAzNCkKKyNkZWZpbmUgV0VCUF9NQVhfQUxMT0NBQkxFX01FTU9SWSAoMVVMTCA8PCAzNCkKKyNlbHNlCisvLyBGb3IgMzItYml0IHRhcmdldHMga2VlcCB0aGlzIGJlbG93IElOVF9NQVggdG8gYXZvaWQgdmFsZ3JpbmQgd2FybmluZ3MuCisjZGVmaW5lIFdFQlBfTUFYX0FMTE9DQUJMRV9NRU1PUlkgKCgxVUxMIDw8IDMxKSAtICgxIDw8IDE2KSkKKyNlbmRpZgorI2VuZGlmICAvLyBXRUJQX01BWF9BTExPQ0FCTEVfTUVNT1JZCisKKy8vIHNpemUtY2hlY2tpbmcgc2FmZSBtYWxsb2MvY2FsbG9jOiB2ZXJpZnkgdGhhdCB0aGUgcmVxdWVzdGVkIHNpemUgaXMgbm90IHRvbworLy8gbGFyZ2UsIG9yIHJldHVybiBOVUxMLiBZb3UgZG9uJ3QgbmVlZCB0byBjYWxsIHRoZXNlIGZvciBjb25zdHJ1Y3RzIGxpa2UKKy8vIG1hbGxvYyhzaXplb2YoZm9vKSksIGJ1dCBvbmx5IGlmIHRoZXJlJ3MgcGljdHVyZS1kZXBlbmRlbnQgc2l6ZSBpbnZvbHZlZAorLy8gc29tZXdoZXJlIChsaWtlOiBtYWxsb2MobnVtX3BpeGVscyAqIHNpemVvZigqc29tZXRoaW5nKSkpLiBUaGF0J3Mgd2h5IHRoaXMKKy8vIHNhZmUgbWFsbG9jKCkgYm9ycm93cyB0aGUgc2lnbmF0dXJlIGZyb20gY2FsbG9jKCksIHBvaW50aW5nIGF0IHRoZSBkYW5nZXJvdXMKKy8vIHVuZGVybHlpbmcgbXVsdGlwbHkgaW52b2x2ZWQuCitXRUJQX0VYVEVSTiB2b2lkKiBXZWJQU2FmZU1hbGxvYyh1aW50NjRfdCBubWVtYiwgc2l6ZV90IHNpemUpOworLy8gTm90ZSB0aGF0IFdlYlBTYWZlQ2FsbG9jKCkgZXhwZWN0cyB0aGUgc2Vjb25kIGFyZ3VtZW50IHR5cGUgdG8gYmUgJ3NpemVfdCcKKy8vIGluIG9yZGVyIHRvIGZhdm9yIHRoZSAiY2FsbG9jKG51bV9mb28sIHNpemVvZihmb28pKSIgcGF0dGVybi4KK1dFQlBfRVhURVJOIHZvaWQqIFdlYlBTYWZlQ2FsbG9jKHVpbnQ2NF90IG5tZW1iLCBzaXplX3Qgc2l6ZSk7CisKKy8vIENvbXBhbmlvbiBkZWFsbG9jYXRpb24gZnVuY3Rpb24gdG8gdGhlIGFib3ZlIGFsbG9jYXRpb25zLgorV0VCUF9FWFRFUk4gdm9pZCBXZWJQU2FmZUZyZWUodm9pZCogY29uc3QgcHRyKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEFsaWdubWVudAorCisjZGVmaW5lIFdFQlBfQUxJR05fQ1NUIDMxCisjZGVmaW5lIFdFQlBfQUxJR04oUFRSKSAoKCh1aW50cHRyX3QpKFBUUikgKyBXRUJQX0FMSUdOX0NTVCkgJiB+V0VCUF9BTElHTl9DU1QpCisKKyNpZiAhZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYKKworLy8gbWVtY3B5KCkgaXMgdGhlIHNhZmUgd2F5IG9mIG1vdmluZyBwb3RlbnRpYWxseSB1bmFsaWduZWQgMzJiIG1lbW9yeS4KK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBXZWJQTWVtVG9VaW50MzIoY29uc3QgdWludDhfdCogY29uc3QgcHRyKSB7CisgIHVpbnQzMl90IEE7CisgIFNiTWVtb3J5Q29weSgmQSwgcHRyLCBzaXplb2YoQSkpOworICByZXR1cm4gQTsKK30KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFdlYlBVaW50MzJUb01lbSh1aW50OF90KiBjb25zdCBwdHIsIHVpbnQzMl90IHZhbCkgeworICBTYk1lbW9yeUNvcHkocHRyLCAmdmFsLCBzaXplb2YodmFsKSk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSZWFkaW5nL3dyaXRpbmcgZGF0YS4KKworLy8gUmVhZCAxNiwgMjQgb3IgMzIgYml0cyBzdG9yZWQgaW4gbGl0dGxlLWVuZGlhbiBvcmRlci4KK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgR2V0TEUxNihjb25zdCB1aW50OF90KiBjb25zdCBkYXRhKSB7CisgIHJldHVybiAoaW50KShkYXRhWzBdIDw8IDApIHwgKGRhdGFbMV0gPDwgOCk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgR2V0TEUyNChjb25zdCB1aW50OF90KiBjb25zdCBkYXRhKSB7CisgIHJldHVybiBHZXRMRTE2KGRhdGEpIHwgKGRhdGFbMl0gPDwgMTYpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgR2V0TEUzMihjb25zdCB1aW50OF90KiBjb25zdCBkYXRhKSB7CisgIHJldHVybiBHZXRMRTE2KGRhdGEpIHwgKCh1aW50MzJfdClHZXRMRTE2KGRhdGEgKyAyKSA8PCAxNik7Cit9CisKKy8vIFN0b3JlIDE2LCAyNCBvciAzMiBiaXRzIGluIGxpdHRsZS1lbmRpYW4gb3JkZXIuCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBQdXRMRTE2KHVpbnQ4X3QqIGNvbnN0IGRhdGEsIGludCB2YWwpIHsKKyAgU0JfRENIRUNLKHZhbCA8ICgxIDw8IDE2KSk7CisgIGRhdGFbMF0gPSAodmFsID4+IDApOworICBkYXRhWzFdID0gKHZhbCA+PiA4KTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUHV0TEUyNCh1aW50OF90KiBjb25zdCBkYXRhLCBpbnQgdmFsKSB7CisgIFNCX0RDSEVDSyh2YWwgPCAoMSA8PCAyNCkpOworICBQdXRMRTE2KGRhdGEsIHZhbCAmIDB4ZmZmZik7CisgIGRhdGFbMl0gPSAodmFsID4+IDE2KTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUHV0TEUzMih1aW50OF90KiBjb25zdCBkYXRhLCB1aW50MzJfdCB2YWwpIHsKKyAgUHV0TEUxNihkYXRhLCAoaW50KSh2YWwgJiAweGZmZmYpKTsKKyAgUHV0TEUxNihkYXRhICsgMiwgKGludCkodmFsID4+IDE2KSk7Cit9CisKKy8vIFJldHVybnMgMzEgXiBjbHoobikgPSBsb2cyKG4pLiBUaGlzIGlzIHRoZSBkZWZhdWx0IEMtaW1wbGVtZW50YXRpb24sIGVpdGhlcgorLy8gYmFzZWQgb24gdGFibGUgb3Igbm90LiBDYW4gYmUgdXNlZCBhcyBmYWxsYmFjayBpZiBjbHooKSBpcyBub3QgYXZhaWxhYmxlLgorI2RlZmluZSBXRUJQX05FRURfTE9HX1RBQkxFXzhCSVQKK2V4dGVybiBjb25zdCB1aW50OF90IFdlYlBMb2dUYWJsZThiaXRbMjU2XTsKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgV2ViUExvZzJGbG9vckModWludDMyX3QgbikgeworICBpbnQgbG9nX3ZhbHVlID0gMDsKKyAgd2hpbGUgKG4gPj0gMjU2KSB7CisgICAgbG9nX3ZhbHVlICs9IDg7CisgICAgbiA+Pj0gODsKKyAgfQorICByZXR1cm4gbG9nX3ZhbHVlICsgV2ViUExvZ1RhYmxlOGJpdFtuXTsKK30KKworLy8gUmV0dXJucyAoaW50KWZsb29yKGxvZzIobikpLiBuIG11c3QgYmUgPiAwLgorLy8gdXNlIEdOVSBidWlsdGlucyB3aGVyZSBhdmFpbGFibGUuCisjaWYgIWRlZmluZWQoU1RBUkJPQVJEKSAmJiBkZWZpbmVkKF9fR05VQ19fKSAmJiBcCisgICAgKChfX0dOVUNfXyA9PSAzICYmIF9fR05VQ19NSU5PUl9fID49IDQpIHx8IF9fR05VQ19fID49IDQpCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IEJpdHNMb2cyRmxvb3IodWludDMyX3QgbikgeworICByZXR1cm4gMzEgXiBfX2J1aWx0aW5fY2x6KG4pOworfQorI2VsaWYgIWRlZmluZWQoU1RBUkJPQVJEKSAmJiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBfTVNDX1ZFUiA+IDEzMTAgJiYgXAorICAgICAgKGRlZmluZWQoX01fWDY0KSB8fCBkZWZpbmVkKF9NX0lYODYpKQorI2luY2x1ZGUgPGludHJpbi5oPgorI3ByYWdtYSBpbnRyaW5zaWMoX0JpdFNjYW5SZXZlcnNlKQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IEJpdHNMb2cyRmxvb3IodWludDMyX3QgbikgeworICB1bnNpZ25lZCBsb25nIGZpcnN0X3NldF9iaXQ7CisgIF9CaXRTY2FuUmV2ZXJzZSgmZmlyc3Rfc2V0X2JpdCwgbik7CisgIHJldHVybiBmaXJzdF9zZXRfYml0OworfQorI2Vsc2UgICAvLyBkZWZhdWx0OiB1c2UgdGhlIEMtdmVyc2lvbi4KK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgQml0c0xvZzJGbG9vcih1aW50MzJfdCBuKSB7IHJldHVybiBXZWJQTG9nMkZsb29yQyhuKTsgfQorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQaXhlbCBjb3B5aW5nLgorCitzdHJ1Y3QgV2ViUFBpY3R1cmU7CisKKy8vIENvcHkgd2lkdGggeCBoZWlnaHQgcGl4ZWxzIGZyb20gJ3NyYycgdG8gJ2RzdCcgaG9ub3JpbmcgdGhlIHN0cmlkZXMuCitXRUJQX0VYVEVSTiB2b2lkIFdlYlBDb3B5UGxhbmUoY29uc3QgdWludDhfdCogc3JjLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCk7CisKKy8vIENvcHkgQVJHQiBwaXhlbHMgZnJvbSAnc3JjJyB0byAnZHN0JyBob25vcmluZyBzdHJpZGVzLiAnc3JjJyBhbmQgJ2RzdCcgYXJlCisvLyBhc3N1bWVkIHRvIGJlIGFscmVhZHkgYWxsb2NhdGVkIGFuZCB1c2luZyBBUkdCIGRhdGEuCitXRUJQX0VYVEVSTiB2b2lkIFdlYlBDb3B5UGl4ZWxzKGNvbnN0IHN0cnVjdCBXZWJQUGljdHVyZSogY29uc3Qgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgV2ViUFBpY3R1cmUqIGNvbnN0IGRzdCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBVbmlxdWUgY29sb3JzLgorCisvLyBSZXR1cm5zIGNvdW50IG9mIHVuaXF1ZSBjb2xvcnMgaW4gJ3BpYycsIGFzc3VtaW5nIHBpYy0+dXNlX2FyZ2IgaXMgdHJ1ZS4KKy8vIElmIHRoZSB1bmlxdWUgY29sb3IgY291bnQgaXMgbW9yZSB0aGFuIE1BWF9QQUxFVFRFX1NJWkUsIHJldHVybnMKKy8vIE1BWF9QQUxFVFRFX1NJWkUrMS4KKy8vIElmICdwYWxldHRlJyBpcyBub3QgTlVMTCBhbmQgbnVtYmVyIG9mIHVuaXF1ZSBjb2xvcnMgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvCisvLyBNQVhfUEFMRVRURV9TSVpFLCBhbHNvIG91dHB1dHMgdGhlIGFjdHVhbCB1bmlxdWUgY29sb3JzIGludG8gJ3BhbGV0dGUnLgorLy8gTm90ZTogJ3BhbGV0dGUnIGlzIGFzc3VtZWQgdG8gYmUgYW4gYXJyYXkgYWxyZWFkeSBhbGxvY2F0ZWQgd2l0aCBhdCBsZWFzdAorLy8gTUFYX1BBTEVUVEVfU0laRSBlbGVtZW50cy4KK1dFQlBfRVhURVJOIGludCBXZWJQR2V0Q29sb3JQYWxldHRlKGNvbnN0IHN0cnVjdCBXZWJQUGljdHVyZSogY29uc3QgcGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGNvbnN0IHBhbGV0dGUpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30gICAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLyogV0VCUF9VVElMU19VVElMU19IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3dlYnAvZGVjb2RlLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvd2VicC9kZWNvZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTY1ZTk2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3dlYnAvZGVjb2RlLmgKQEAgLTAsMCArMSw0OTQgQEAKKy8vIENvcHlyaWdodCAyMDEwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgTWFpbiBkZWNvZGluZyBmdW5jdGlvbnMgZm9yIFdlYlAgaW1hZ2VzLgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpZm5kZWYgV0VCUF9XRUJQX0RFQ09ERV9IXworI2RlZmluZSBXRUJQX1dFQlBfREVDT0RFX0hfCisKKyNpbmNsdWRlICIuL3R5cGVzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBXRUJQX0RFQ09ERVJfQUJJX1ZFUlNJT04gMHgwMjA4ICAgIC8vIE1BSk9SKDhiKSArIE1JTk9SKDhiKQorCisvLyBOb3RlOiBmb3J3YXJkIGRlY2xhcmluZyBlbnVtZXJhdGlvbnMgaXMgbm90IGFsbG93ZWQgaW4gKHN0cmljdCkgQyBhbmQgQysrLAorLy8gdGhlIHR5cGVzIGFyZSBsZWZ0IGhlcmUgZm9yIHJlZmVyZW5jZS4KKy8vIHR5cGVkZWYgZW51bSBWUDhTdGF0dXNDb2RlIFZQOFN0YXR1c0NvZGU7CisvLyB0eXBlZGVmIGVudW0gV0VCUF9DU1BfTU9ERSBXRUJQX0NTUF9NT0RFOwordHlwZWRlZiBzdHJ1Y3QgV2ViUFJHQkFCdWZmZXIgV2ViUFJHQkFCdWZmZXI7Cit0eXBlZGVmIHN0cnVjdCBXZWJQWVVWQUJ1ZmZlciBXZWJQWVVWQUJ1ZmZlcjsKK3R5cGVkZWYgc3RydWN0IFdlYlBEZWNCdWZmZXIgV2ViUERlY0J1ZmZlcjsKK3R5cGVkZWYgc3RydWN0IFdlYlBJRGVjb2RlciBXZWJQSURlY29kZXI7Cit0eXBlZGVmIHN0cnVjdCBXZWJQQml0c3RyZWFtRmVhdHVyZXMgV2ViUEJpdHN0cmVhbUZlYXR1cmVzOwordHlwZWRlZiBzdHJ1Y3QgV2ViUERlY29kZXJPcHRpb25zIFdlYlBEZWNvZGVyT3B0aW9uczsKK3R5cGVkZWYgc3RydWN0IFdlYlBEZWNvZGVyQ29uZmlnIFdlYlBEZWNvZGVyQ29uZmlnOworCisvLyBSZXR1cm4gdGhlIGRlY29kZXIncyB2ZXJzaW9uIG51bWJlciwgcGFja2VkIGluIGhleGFkZWNpbWFsIHVzaW5nIDhiaXRzIGZvcgorLy8gZWFjaCBvZiBtYWpvci9taW5vci9yZXZpc2lvbi4gRS5nOiB2Mi41LjcgaXMgMHgwMjA1MDcuCitXRUJQX0VYVEVSTiBpbnQgV2ViUEdldERlY29kZXJWZXJzaW9uKHZvaWQpOworCisvLyBSZXRyaWV2ZSBiYXNpYyBoZWFkZXIgaW5mb3JtYXRpb246IHdpZHRoLCBoZWlnaHQuCisvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgYWxzbyB2YWxpZGF0ZSB0aGUgaGVhZGVyLCByZXR1cm5pbmcgdHJ1ZSBvbiBzdWNjZXNzLAorLy8gZmFsc2Ugb3RoZXJ3aXNlLiAnKndpZHRoJyBhbmQgJypoZWlnaHQnIGFyZSBvbmx5IHZhbGlkIG9uIHN1Y2Nlc3NmdWwgcmV0dXJuLgorLy8gUG9pbnRlcnMgJ3dpZHRoJyBhbmQgJ2hlaWdodCcgY2FuIGJlIHBhc3NlZCBOVUxMIGlmIGRlZW1lZCBpcnJlbGV2YW50LgorV0VCUF9FWFRFUk4gaW50IFdlYlBHZXRJbmZvKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQpOworCisvLyBEZWNvZGVzIFdlYlAgaW1hZ2VzIHBvaW50ZWQgdG8gYnkgJ2RhdGEnIGFuZCByZXR1cm5zIFJHQkEgc2FtcGxlcywgYWxvbmcKKy8vIHdpdGggdGhlIGRpbWVuc2lvbnMgaW4gKndpZHRoIGFuZCAqaGVpZ2h0LiBUaGUgb3JkZXJpbmcgb2Ygc2FtcGxlcyBpbgorLy8gbWVtb3J5IGlzIFIsIEcsIEIsIEEsIFIsIEcsIEIsIEEuLi4gaW4gc2NhbiBvcmRlciAoZW5kaWFuLWluZGVwZW5kZW50KS4KKy8vIFRoZSByZXR1cm5lZCBwb2ludGVyIHNob3VsZCBiZSBkZWxldGVkIGNhbGxpbmcgV2ViUEZyZWUoKS4KKy8vIFJldHVybnMgTlVMTCBpbiBjYXNlIG9mIGVycm9yLgorV0VCUF9FWFRFUk4gdWludDhfdCogV2ViUERlY29kZVJHQkEoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsIGludCogaGVpZ2h0KTsKKworLy8gU2FtZSBhcyBXZWJQRGVjb2RlUkdCQSwgYnV0IHJldHVybmluZyBBLCBSLCBHLCBCLCBBLCBSLCBHLCBCLi4uIG9yZGVyZWQgZGF0YS4KK1dFQlBfRVhURVJOIHVpbnQ4X3QqIFdlYlBEZWNvZGVBUkdCKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCk7CisKKy8vIFNhbWUgYXMgV2ViUERlY29kZVJHQkEsIGJ1dCByZXR1cm5pbmcgQiwgRywgUiwgQSwgQiwgRywgUiwgQS4uLiBvcmRlcmVkIGRhdGEuCitXRUJQX0VYVEVSTiB1aW50OF90KiBXZWJQRGVjb2RlQkdSQShjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQpOworCisvLyBTYW1lIGFzIFdlYlBEZWNvZGVSR0JBLCBidXQgcmV0dXJuaW5nIFIsIEcsIEIsIFIsIEcsIEIuLi4gb3JkZXJlZCBkYXRhLgorLy8gSWYgdGhlIGJpdHN0cmVhbSBjb250YWlucyB0cmFuc3BhcmVuY3ksIGl0IGlzIGlnbm9yZWQuCitXRUJQX0VYVEVSTiB1aW50OF90KiBXZWJQRGVjb2RlUkdCKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsIGludCogaGVpZ2h0KTsKKworLy8gU2FtZSBhcyBXZWJQRGVjb2RlUkdCLCBidXQgcmV0dXJuaW5nIEIsIEcsIFIsIEIsIEcsIFIuLi4gb3JkZXJlZCBkYXRhLgorV0VCUF9FWFRFUk4gdWludDhfdCogV2ViUERlY29kZUJHUihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCk7CisKKworLy8gRGVjb2RlIFdlYlAgaW1hZ2VzIHBvaW50ZWQgdG8gYnkgJ2RhdGEnIHRvIFknVVYgZm9ybWF0KCopLiBUaGUgcG9pbnRlcgorLy8gcmV0dXJuZWQgaXMgdGhlIFkgc2FtcGxlcyBidWZmZXIuIFVwb24gcmV0dXJuLCAqdSBhbmQgKnYgd2lsbCBwb2ludCB0bworLy8gdGhlIFUgYW5kIFYgY2hyb21hIGRhdGEuIFRoZXNlIFUgYW5kIFYgYnVmZmVycyBuZWVkIE5PVCBiZSBwYXNzZWQgdG8KKy8vIFdlYlBGcmVlKCksIHVubGlrZSB0aGUgcmV0dXJuZWQgWSBsdW1hIG9uZS4gVGhlIGRpbWVuc2lvbiBvZiB0aGUgVSBhbmQgVgorLy8gcGxhbmVzIGFyZSBib3RoICgqd2lkdGggKyAxKSAvIDIgYW5kICgqaGVpZ2h0ICsgMSkvIDIuCisvLyBVcG9uIHJldHVybiwgdGhlIFkgYnVmZmVyIGhhcyBhIHN0cmlkZSByZXR1cm5lZCBhcyAnKnN0cmlkZScsIHdoaWxlIFUgYW5kIFYKKy8vIGhhdmUgYSBjb21tb24gc3RyaWRlIHJldHVybmVkIGFzICcqdXZfc3RyaWRlJy4KKy8vIFJldHVybiBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuCisvLyAoKikgQWxzbyBuYW1lZCBZJ0NiQ3IuIFNlZTogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9ZQ2JDcgorV0VCUF9FWFRFUk4gdWludDhfdCogV2ViUERlY29kZVlVVihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIHUsIHVpbnQ4X3QqKiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHN0cmlkZSwgaW50KiB1dl9zdHJpZGUpOworCisvLyBSZWxlYXNlcyBtZW1vcnkgcmV0dXJuZWQgYnkgdGhlIFdlYlBEZWNvZGUqKCkgZnVuY3Rpb25zIGFib3ZlLgorV0VCUF9FWFRFUk4gdm9pZCBXZWJQRnJlZSh2b2lkKiBwdHIpOworCisvLyBUaGVzZSBmaXZlIGZ1bmN0aW9ucyBhcmUgdmFyaWFudHMgb2YgdGhlIGFib3ZlIG9uZXMsIHRoYXQgZGVjb2RlIHRoZSBpbWFnZQorLy8gZGlyZWN0bHkgaW50byBhIHByZS1hbGxvY2F0ZWQgYnVmZmVyICdvdXRwdXRfYnVmZmVyJy4gVGhlIG1heGltdW0gc3RvcmFnZQorLy8gYXZhaWxhYmxlIGluIHRoaXMgYnVmZmVyIGlzIGluZGljYXRlZCBieSAnb3V0cHV0X2J1ZmZlcl9zaXplJy4gSWYgdGhpcworLy8gc3RvcmFnZSBpcyBub3Qgc3VmZmljaWVudCAob3IgYW4gZXJyb3Igb2NjdXJyZWQpLCBOVUxMIGlzIHJldHVybmVkLgorLy8gT3RoZXJ3aXNlLCBvdXRwdXRfYnVmZmVyIGlzIHJldHVybmVkLCBmb3IgY29udmVuaWVuY2UuCisvLyBUaGUgcGFyYW1ldGVyICdvdXRwdXRfc3RyaWRlJyBzcGVjaWZpZXMgdGhlIGRpc3RhbmNlIChpbiBieXRlcykKKy8vIGJldHdlZW4gc2NhbmxpbmVzLiBIZW5jZSwgb3V0cHV0X2J1ZmZlcl9zaXplIGlzIGV4cGVjdGVkIHRvIGJlIGF0IGxlYXN0CisvLyBvdXRwdXRfc3RyaWRlIHggcGljdHVyZS1oZWlnaHQuCitXRUJQX0VYVEVSTiB1aW50OF90KiBXZWJQRGVjb2RlUkdCQUludG8oCisgICAgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICB1aW50OF90KiBvdXRwdXRfYnVmZmVyLCBzaXplX3Qgb3V0cHV0X2J1ZmZlcl9zaXplLCBpbnQgb3V0cHV0X3N0cmlkZSk7CitXRUJQX0VYVEVSTiB1aW50OF90KiBXZWJQRGVjb2RlQVJHQkludG8oCisgICAgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICB1aW50OF90KiBvdXRwdXRfYnVmZmVyLCBzaXplX3Qgb3V0cHV0X2J1ZmZlcl9zaXplLCBpbnQgb3V0cHV0X3N0cmlkZSk7CitXRUJQX0VYVEVSTiB1aW50OF90KiBXZWJQRGVjb2RlQkdSQUludG8oCisgICAgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICB1aW50OF90KiBvdXRwdXRfYnVmZmVyLCBzaXplX3Qgb3V0cHV0X2J1ZmZlcl9zaXplLCBpbnQgb3V0cHV0X3N0cmlkZSk7CisKKy8vIFJHQiBhbmQgQkdSIHZhcmlhbnRzLiBIZXJlIHRvbyB0aGUgdHJhbnNwYXJlbmN5IGluZm9ybWF0aW9uLCBpZiBwcmVzZW50LAorLy8gd2lsbCBiZSBkcm9wcGVkIGFuZCBpZ25vcmVkLgorV0VCUF9FWFRFUk4gdWludDhfdCogV2ViUERlY29kZVJHQkludG8oCisgICAgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICB1aW50OF90KiBvdXRwdXRfYnVmZmVyLCBzaXplX3Qgb3V0cHV0X2J1ZmZlcl9zaXplLCBpbnQgb3V0cHV0X3N0cmlkZSk7CitXRUJQX0VYVEVSTiB1aW50OF90KiBXZWJQRGVjb2RlQkdSSW50bygKKyAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgIHVpbnQ4X3QqIG91dHB1dF9idWZmZXIsIHNpemVfdCBvdXRwdXRfYnVmZmVyX3NpemUsIGludCBvdXRwdXRfc3RyaWRlKTsKKworLy8gV2ViUERlY29kZVlVVkludG8oKSBpcyBhIHZhcmlhbnQgb2YgV2ViUERlY29kZVlVVigpIHRoYXQgb3BlcmF0ZXMgZGlyZWN0bHkKKy8vIGludG8gcHJlLWFsbG9jYXRlZCBsdW1hL2Nocm9tYSBwbGFuZSBidWZmZXJzLiBUaGlzIGZ1bmN0aW9uIHJlcXVpcmVzIHRoZQorLy8gc3RyaWRlcyB0byBiZSBwYXNzZWQ6IG9uZSBmb3IgdGhlIGx1bWEgcGxhbmUgYW5kIG9uZSBmb3IgZWFjaCBvZiB0aGUKKy8vIGNocm9tYSBvbmVzLiBUaGUgc2l6ZSBvZiBlYWNoIHBsYW5lIGJ1ZmZlciBpcyBwYXNzZWQgYXMgJ2x1bWFfc2l6ZScsCisvLyAndV9zaXplJyBhbmQgJ3Zfc2l6ZScgcmVzcGVjdGl2ZWx5LgorLy8gUG9pbnRlciB0byB0aGUgbHVtYSBwbGFuZSAoJypsdW1hJykgaXMgcmV0dXJuZWQgb3IgTlVMTCBpZiBhbiBlcnJvciBvY2N1cnJlZAorLy8gZHVyaW5nIGRlY29kaW5nIChvciBiZWNhdXNlIHNvbWUgYnVmZmVycyB3ZXJlIGZvdW5kIHRvIGJlIHRvbyBzbWFsbCkuCitXRUJQX0VYVEVSTiB1aW50OF90KiBXZWJQRGVjb2RlWVVWSW50bygKKyAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgIHVpbnQ4X3QqIGx1bWEsIHNpemVfdCBsdW1hX3NpemUsIGludCBsdW1hX3N0cmlkZSwKKyAgICB1aW50OF90KiB1LCBzaXplX3QgdV9zaXplLCBpbnQgdV9zdHJpZGUsCisgICAgdWludDhfdCogdiwgc2l6ZV90IHZfc2l6ZSwgaW50IHZfc3RyaWRlKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE91dHB1dCBjb2xvcnNwYWNlcyBhbmQgYnVmZmVyCisKKy8vIENvbG9yc3BhY2VzCisvLyBOb3RlOiB0aGUgbmFtaW5nIGRlc2NyaWJlcyB0aGUgYnl0ZS1vcmRlcmluZyBvZiBwYWNrZWQgc2FtcGxlcyBpbiBtZW1vcnkuCisvLyBGb3IgaW5zdGFuY2UsIE1PREVfQkdSQSByZWxhdGVzIHRvIHNhbXBsZXMgb3JkZXJlZCBhcyBCLEcsUixBLEIsRyxSLEEsLi4uCisvLyBOb24tY2FwaXRhbCBuYW1lcyAoZS5nLjpNT0RFX0FyZ2IpIHJlbGF0ZXMgdG8gcHJlLW11bHRpcGxpZWQgUkdCIGNoYW5uZWxzLgorLy8gUkdCQS00NDQ0IGFuZCBSR0ItNTY1IGNvbG9yc3BhY2VzIGFyZSByZXByZXNlbnRlZCBieSBmb2xsb3dpbmcgYnl0ZS1vcmRlcjoKKy8vIFJHQkEtNDQ0NDogW3IzIHIyIHIxIHIwIGczIGcyIGcxIGcwXSwgW2IzIGIyIGIxIGIwIGEzIGEyIGExIGEwXSwgLi4uCisvLyBSR0ItNTY1OiBbcjQgcjMgcjIgcjEgcjAgZzUgZzQgZzNdLCBbZzIgZzEgZzAgYjQgYjMgYjIgYjEgYjBdLCAuLi4KKy8vIEluIHRoZSBjYXNlIFdFQlBfU1dBUF8xNkJJVFNfQ1NQIGlzIGRlZmluZWQsIHRoZSBieXRlcyBhcmUgc3dhcHBlZCBmb3IKKy8vIHRoZXNlIHR3byBtb2RlczoKKy8vIFJHQkEtNDQ0NDogW2IzIGIyIGIxIGIwIGEzIGEyIGExIGEwXSwgW3IzIHIyIHIxIHIwIGczIGcyIGcxIGcwXSwgLi4uCisvLyBSR0ItNTY1OiBbZzIgZzEgZzAgYjQgYjMgYjIgYjEgYjBdLCBbcjQgcjMgcjIgcjEgcjAgZzUgZzQgZzNdLCAuLi4KKwordHlwZWRlZiBlbnVtIFdFQlBfQ1NQX01PREUgeworICBNT0RFX1JHQiA9IDAsIE1PREVfUkdCQSA9IDEsCisgIE1PREVfQkdSID0gMiwgTU9ERV9CR1JBID0gMywKKyAgTU9ERV9BUkdCID0gNCwgTU9ERV9SR0JBXzQ0NDQgPSA1LAorICBNT0RFX1JHQl81NjUgPSA2LAorICAvLyBSR0ItcHJlbXVsdGlwbGllZCB0cmFuc3BhcmVudCBtb2RlcyAoYWxwaGEgdmFsdWUgaXMgcHJlc2VydmVkKQorICBNT0RFX3JnYkEgPSA3LAorICBNT0RFX2JnckEgPSA4LAorICBNT0RFX0FyZ2IgPSA5LAorICBNT0RFX3JnYkFfNDQ0NCA9IDEwLAorICAvLyBZVVYgbW9kZXMgbXVzdCBjb21lIGFmdGVyIFJHQiBvbmVzLgorICBNT0RFX1lVViA9IDExLCBNT0RFX1lVVkEgPSAxMiwgIC8vIHl1diA0OjI6MAorICBNT0RFX0xBU1QgPSAxMworfSBXRUJQX0NTUF9NT0RFOworCisvLyBTb21lIHVzZWZ1bCBtYWNyb3M6CitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFdlYlBJc1ByZW11bHRpcGxpZWRNb2RlKFdFQlBfQ1NQX01PREUgbW9kZSkgeworICByZXR1cm4gKG1vZGUgPT0gTU9ERV9yZ2JBIHx8IG1vZGUgPT0gTU9ERV9iZ3JBIHx8IG1vZGUgPT0gTU9ERV9BcmdiIHx8CisgICAgICAgICAgbW9kZSA9PSBNT0RFX3JnYkFfNDQ0NCk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgV2ViUElzQWxwaGFNb2RlKFdFQlBfQ1NQX01PREUgbW9kZSkgeworICByZXR1cm4gKG1vZGUgPT0gTU9ERV9SR0JBIHx8IG1vZGUgPT0gTU9ERV9CR1JBIHx8IG1vZGUgPT0gTU9ERV9BUkdCIHx8CisgICAgICAgICAgbW9kZSA9PSBNT0RFX1JHQkFfNDQ0NCB8fCBtb2RlID09IE1PREVfWVVWQSB8fAorICAgICAgICAgIFdlYlBJc1ByZW11bHRpcGxpZWRNb2RlKG1vZGUpKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBXZWJQSXNSR0JNb2RlKFdFQlBfQ1NQX01PREUgbW9kZSkgeworICByZXR1cm4gKG1vZGUgPCBNT0RFX1lVVik7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBXZWJQRGVjQnVmZmVyOiBHZW5lcmljIHN0cnVjdHVyZSBmb3IgZGVzY3JpYmluZyB0aGUgb3V0cHV0IHNhbXBsZSBidWZmZXIuCisKK3N0cnVjdCBXZWJQUkdCQUJ1ZmZlciB7ICAgIC8vIHZpZXcgYXMgUkdCQQorICB1aW50OF90KiByZ2JhOyAgICAvLyBwb2ludGVyIHRvIFJHQkEgc2FtcGxlcworICBpbnQgc3RyaWRlOyAgICAgICAvLyBzdHJpZGUgaW4gYnl0ZXMgZnJvbSBvbmUgc2NhbmxpbmUgdG8gdGhlIG5leHQuCisgIHNpemVfdCBzaXplOyAgICAgIC8vIHRvdGFsIHNpemUgb2YgdGhlICpyZ2JhIGJ1ZmZlci4KK307CisKK3N0cnVjdCBXZWJQWVVWQUJ1ZmZlciB7ICAgICAgICAgICAgICAvLyB2aWV3IGFzIFlVVkEKKyAgdWludDhfdCogeSwgKnUsICp2LCAqYTsgICAgIC8vIHBvaW50ZXIgdG8gbHVtYSwgY2hyb21hIFUvViwgYWxwaGEgc2FtcGxlcworICBpbnQgeV9zdHJpZGU7ICAgICAgICAgICAgICAgLy8gbHVtYSBzdHJpZGUKKyAgaW50IHVfc3RyaWRlLCB2X3N0cmlkZTsgICAgIC8vIGNocm9tYSBzdHJpZGVzCisgIGludCBhX3N0cmlkZTsgICAgICAgICAgICAgICAvLyBhbHBoYSBzdHJpZGUKKyAgc2l6ZV90IHlfc2l6ZTsgICAgICAgICAgICAgIC8vIGx1bWEgcGxhbmUgc2l6ZQorICBzaXplX3QgdV9zaXplLCB2X3NpemU7ICAgICAgLy8gY2hyb21hIHBsYW5lcyBzaXplCisgIHNpemVfdCBhX3NpemU7ICAgICAgICAgICAgICAvLyBhbHBoYS1wbGFuZSBzaXplCit9OworCisvLyBPdXRwdXQgYnVmZmVyCitzdHJ1Y3QgV2ViUERlY0J1ZmZlciB7CisgIFdFQlBfQ1NQX01PREUgY29sb3JzcGFjZTsgIC8vIENvbG9yc3BhY2UuCisgIGludCB3aWR0aCwgaGVpZ2h0OyAgICAgICAgIC8vIERpbWVuc2lvbnMuCisgIGludCBpc19leHRlcm5hbF9tZW1vcnk7ICAgIC8vIElmIG5vbi16ZXJvLCAnaW50ZXJuYWxfbWVtb3J5JyBwb2ludGVyIGlzIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2VkLiBJZiB2YWx1ZSBpcyAnMicgb3IgbW9yZSwgdGhlIGV4dGVybmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lbW9yeSBpcyBjb25zaWRlcmVkICdzbG93JyBhbmQgbXVsdGlwbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVhZC93cml0ZSB3aWxsIGJlIGF2b2lkZWQuCisgIHVuaW9uIHsKKyAgICBXZWJQUkdCQUJ1ZmZlciBSR0JBOworICAgIFdlYlBZVVZBQnVmZmVyIFlVVkE7CisgIH0gdTsgICAgICAgICAgICAgICAgICAgICAgIC8vIE5hbWVsZXNzIHVuaW9uIG9mIGJ1ZmZlciBwYXJhbWV0ZXJzLgorICB1aW50MzJfdCAgICAgICBwYWRbNF07ICAgICAvLyBwYWRkaW5nIGZvciBsYXRlciB1c2UKKworICB1aW50OF90KiBwcml2YXRlX21lbW9yeTsgICAvLyBJbnRlcm5hbGx5IGFsbG9jYXRlZCBtZW1vcnkgKG9ubHkgd2hlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpc19leHRlcm5hbF9tZW1vcnkgaXMgMCkuIFNob3VsZCBub3QgYmUgdXNlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHRlcm5hbGx5LCBidXQgYWNjZXNzZWQgdmlhIHRoZSBidWZmZXIgdW5pb24uCit9OworCisvLyBJbnRlcm5hbCwgdmVyc2lvbi1jaGVja2VkLCBlbnRyeSBwb2ludAorV0VCUF9FWFRFUk4gaW50IFdlYlBJbml0RGVjQnVmZmVySW50ZXJuYWwoV2ViUERlY0J1ZmZlciosIGludCk7CisKKy8vIEluaXRpYWxpemUgdGhlIHN0cnVjdHVyZSBhcyBlbXB0eS4gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSBvdGhlciB1c2UuCisvLyBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgdmVyc2lvbiBtaXNtYXRjaAorc3RhdGljIFdFQlBfSU5MSU5FIGludCBXZWJQSW5pdERlY0J1ZmZlcihXZWJQRGVjQnVmZmVyKiBidWZmZXIpIHsKKyAgcmV0dXJuIFdlYlBJbml0RGVjQnVmZmVySW50ZXJuYWwoYnVmZmVyLCBXRUJQX0RFQ09ERVJfQUJJX1ZFUlNJT04pOworfQorCisvLyBGcmVlIGFueSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBidWZmZXIuIE11c3QgYWx3YXlzIGJlIGNhbGxlZCBsYXN0LgorLy8gTm90ZTogZG9lc24ndCBmcmVlIHRoZSAnYnVmZmVyJyBzdHJ1Y3R1cmUgaXRzZWxmLgorV0VCUF9FWFRFUk4gdm9pZCBXZWJQRnJlZURlY0J1ZmZlcihXZWJQRGVjQnVmZmVyKiBidWZmZXIpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW51bWVyYXRpb24gb2YgdGhlIHN0YXR1cyBjb2RlcworCit0eXBlZGVmIGVudW0gVlA4U3RhdHVzQ29kZSB7CisgIFZQOF9TVEFUVVNfT0sgPSAwLAorICBWUDhfU1RBVFVTX09VVF9PRl9NRU1PUlksCisgIFZQOF9TVEFUVVNfSU5WQUxJRF9QQVJBTSwKKyAgVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1IsCisgIFZQOF9TVEFUVVNfVU5TVVBQT1JURURfRkVBVFVSRSwKKyAgVlA4X1NUQVRVU19TVVNQRU5ERUQsCisgIFZQOF9TVEFUVVNfVVNFUl9BQk9SVCwKKyAgVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEEKK30gVlA4U3RhdHVzQ29kZTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEluY3JlbWVudGFsIGRlY29kaW5nCisvLworLy8gVGhpcyBBUEkgYWxsb3dzIHN0cmVhbWxpbmVkIGRlY29kaW5nIG9mIHBhcnRpYWwgZGF0YS4KKy8vIFBpY3R1cmUgY2FuIGJlIGluY3JlbWVudGFsbHkgZGVjb2RlZCBhcyBkYXRhIGJlY29tZSBhdmFpbGFibGUgdGhhbmtzIHRvIHRoZQorLy8gV2ViUElEZWNvZGVyIG9iamVjdC4gVGhpcyBvYmplY3QgY2FuIGJlIGxlZnQgaW4gYSBTVVNQRU5ERUQgc3RhdGUgaWYgdGhlCisvLyBwaWN0dXJlIGlzIG9ubHkgcGFydGlhbGx5IGRlY29kZWQsIHBlbmRpbmcgYWRkaXRpb25hbCBpbnB1dC4KKy8vIENvZGUgZXhhbXBsZToKKy8vCisvLyAgIFdlYlBJbml0RGVjQnVmZmVyKCZvdXRwdXRfYnVmZmVyKTsKKy8vICAgb3V0cHV0X2J1ZmZlci5jb2xvcnNwYWNlID0gbW9kZTsKKy8vICAgLi4uCisvLyAgIFdlYlBJRGVjb2RlciogaWRlYyA9IFdlYlBJTmV3RGVjb2Rlcigmb3V0cHV0X2J1ZmZlcik7CisvLyAgIHdoaWxlIChhZGRpdGlvbmFsX2RhdGFfaXNfYXZhaWxhYmxlKSB7CisvLyAgICAgLy8gLi4uIChnZXQgYWRkaXRpb25hbCBkYXRhIGluIHNvbWUgbmV3X2RhdGFbXSBidWZmZXIpCisvLyAgICAgc3RhdHVzID0gV2ViUElBcHBlbmQoaWRlYywgbmV3X2RhdGEsIG5ld19kYXRhX3NpemUpOworLy8gICAgIGlmIChzdGF0dXMgIT0gVlA4X1NUQVRVU19PSyAmJiBzdGF0dXMgIT0gVlA4X1NUQVRVU19TVVNQRU5ERUQpIHsKKy8vICAgICAgIGJyZWFrOyAgICAvLyBhbiBlcnJvciBvY2N1cnJlZC4KKy8vICAgICB9CisvLworLy8gICAgIC8vIFRoZSBhYm92ZSBjYWxsIGRlY29kZXMgdGhlIGN1cnJlbnQgYXZhaWxhYmxlIGJ1ZmZlci4KKy8vICAgICAvLyBQYXJ0IG9mIHRoZSBpbWFnZSBjYW4gbm93IGJlIHJlZnJlc2hlZCBieSBjYWxsaW5nCisvLyAgICAgLy8gV2ViUElEZWNHZXRSR0IoKS9XZWJQSURlY0dldFlVVkEoKSBldGMuCisvLyAgIH0KKy8vICAgV2ViUElEZWxldGUoaWRlYyk7CisKKy8vIENyZWF0ZXMgYSBuZXcgaW5jcmVtZW50YWwgZGVjb2RlciB3aXRoIHRoZSBzdXBwbGllZCBidWZmZXIgcGFyYW1ldGVyLgorLy8gVGhpcyBvdXRwdXRfYnVmZmVyIGNhbiBiZSBwYXNzZWQgTlVMTCwgaW4gd2hpY2ggY2FzZSBhIGRlZmF1bHQgb3V0cHV0IGJ1ZmZlcgorLy8gaXMgdXNlZCAod2l0aCBNT0RFX1JHQikuIE90aGVyd2lzZSwgYW4gaW50ZXJuYWwgcmVmZXJlbmNlIHRvICdvdXRwdXRfYnVmZmVyJworLy8gaXMga2VwdCwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgbGlmZXNwYW4gb2YgJ291dHB1dF9idWZmZXInIG11c3QgYmUgbGFyZ2VyIHRoYW4KKy8vIHRoYXQgb2YgdGhlIHJldHVybmVkIFdlYlBJRGVjb2RlciBvYmplY3QuCisvLyBUaGUgc3VwcGxpZWQgJ291dHB1dF9idWZmZXInIGNvbnRlbnQgTVVTVCBOT1QgYmUgY2hhbmdlZCBiZXR3ZWVuIGNhbGxzIHRvCisvLyBXZWJQSUFwcGVuZCgpIG9yIFdlYlBJVXBkYXRlKCkgdW5sZXNzICdvdXRwdXRfYnVmZmVyLmlzX2V4dGVybmFsX21lbW9yeScgaXMKKy8vIG5vdCBzZXQgdG8gMC4gSW4gc3VjaCBhIGNhc2UsIGl0IGlzIGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSBwb2ludGVycywgc2l6ZSBhbmQKKy8vIHN0cmlkZSBvZiBvdXRwdXRfYnVmZmVyLnUuUkdCQSBvciBvdXRwdXRfYnVmZmVyLnUuWVVWQSwgcHJvdmlkZWQgdGhleSByZW1haW4KKy8vIHdpdGhpbiB2YWxpZCBib3VuZHMuCisvLyBBbGwgb3RoZXIgZmllbGRzIG9mIFdlYlBEZWNCdWZmZXIgTVVTVCByZW1haW4gY29uc3RhbnQgYmV0d2VlbiBjYWxscy4KKy8vIFJldHVybnMgTlVMTCBpZiB0aGUgYWxsb2NhdGlvbiBmYWlsZWQuCitXRUJQX0VYVEVSTiBXZWJQSURlY29kZXIqIFdlYlBJTmV3RGVjb2RlcihXZWJQRGVjQnVmZmVyKiBvdXRwdXRfYnVmZmVyKTsKKworLy8gVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgYW5kIGluaXRpYWxpemVzIGFuIGluY3JlbWVudGFsLWRlY29kZXIgb2JqZWN0LCB3aGljaAorLy8gd2lsbCBvdXRwdXQgdGhlIFJHQi9BIHNhbXBsZXMgc3BlY2lmaWVkIGJ5ICdjc3AnIGludG8gYSBwcmVhbGxvY2F0ZWQKKy8vIGJ1ZmZlciAnb3V0cHV0X2J1ZmZlcicuIFRoZSBzaXplIG9mIHRoaXMgYnVmZmVyIGlzIGF0IGxlYXN0CisvLyAnb3V0cHV0X2J1ZmZlcl9zaXplJyBhbmQgdGhlIHN0cmlkZSAoZGlzdGFuY2UgaW4gYnl0ZXMgYmV0d2VlbiB0d28gc2NhbmxpbmVzKQorLy8gaXMgc3BlY2lmaWVkIGJ5ICdvdXRwdXRfc3RyaWRlJy4KKy8vIEFkZGl0aW9uYWxseSwgb3V0cHV0X2J1ZmZlciBjYW4gYmUgcGFzc2VkIE5VTEwgaW4gd2hpY2ggY2FzZSB0aGUgb3V0cHV0CisvLyBidWZmZXIgd2lsbCBiZSBhbGxvY2F0ZWQgYXV0b21hdGljYWxseSB3aGVuIHRoZSBkZWNvZGluZyBzdGFydHMuIFRoZQorLy8gY29sb3JzcGFjZSAnY3NwJyBpcyB0YWtlbiBpbnRvIGFjY291bnQgZm9yIGFsbG9jYXRpbmcgdGhpcyBidWZmZXIuIEFsbCBvdGhlcgorLy8gcGFyYW1ldGVycyBhcmUgaWdub3JlZC4KKy8vIFJldHVybnMgTlVMTCBpZiB0aGUgYWxsb2NhdGlvbiBmYWlsZWQsIG9yIGlmIHNvbWUgcGFyYW1ldGVycyBhcmUgaW52YWxpZC4KK1dFQlBfRVhURVJOIFdlYlBJRGVjb2RlciogV2ViUElOZXdSR0IoCisgICAgV0VCUF9DU1BfTU9ERSBjc3AsCisgICAgdWludDhfdCogb3V0cHV0X2J1ZmZlciwgc2l6ZV90IG91dHB1dF9idWZmZXJfc2l6ZSwgaW50IG91dHB1dF9zdHJpZGUpOworCisvLyBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYW4gaW5jcmVtZW50YWwtZGVjb2RlciBvYmplY3QsIHdoaWNoCisvLyB3aWxsIG91dHB1dCB0aGUgcmF3IGx1bWEvY2hyb21hIHNhbXBsZXMgaW50byBhIHByZWFsbG9jYXRlZCBwbGFuZXMgaWYKKy8vIHN1cHBsaWVkLiBUaGUgbHVtYSBwbGFuZSBpcyBzcGVjaWZpZWQgYnkgaXRzIHBvaW50ZXIgJ2x1bWEnLCBpdHMgc2l6ZQorLy8gJ2x1bWFfc2l6ZScgYW5kIGl0cyBzdHJpZGUgJ2x1bWFfc3RyaWRlJy4gU2ltaWxhcmx5LCB0aGUgY2hyb21hLXUgcGxhbmUKKy8vIGlzIHNwZWNpZmllZCBieSB0aGUgJ3UnLCAndV9zaXplJyBhbmQgJ3Vfc3RyaWRlJyBwYXJhbWV0ZXJzLCBhbmQgdGhlIGNocm9tYS12CisvLyBwbGFuZSBieSAndicgYW5kICd2X3NpemUnLiBBbmQgc2FtZSBmb3IgdGhlIGFscGhhLXBsYW5lLiBUaGUgJ2EnIHBvaW50ZXIKKy8vIGNhbiBiZSBwYXNzIE5VTEwgaW4gY2FzZSBvbmUgaXMgbm90IGludGVyZXN0ZWQgaW4gdGhlIHRyYW5zcGFyZW5jeSBwbGFuZS4KKy8vIENvbnZlcnNlbHksICdsdW1hJyBjYW4gYmUgcGFzc2VkIE5VTEwgaWYgbm8gcHJlYWxsb2NhdGVkIHBsYW5lcyBhcmUgc3VwcGxpZWQuCisvLyBJbiB0aGlzIGNhc2UsIHRoZSBvdXRwdXQgYnVmZmVyIHdpbGwgYmUgYXV0b21hdGljYWxseSBhbGxvY2F0ZWQgKHVzaW5nCisvLyBNT0RFX1lVVkEpIHdoZW4gZGVjb2Rpbmcgc3RhcnRzLiBBbGwgcGFyYW1ldGVycyBhcmUgdGhlbiBpZ25vcmVkLgorLy8gUmV0dXJucyBOVUxMIGlmIHRoZSBhbGxvY2F0aW9uIGZhaWxlZCBvciBpZiBhIHBhcmFtZXRlciBpcyBpbnZhbGlkLgorV0VCUF9FWFRFUk4gV2ViUElEZWNvZGVyKiBXZWJQSU5ld1lVVkEoCisgICAgdWludDhfdCogbHVtYSwgc2l6ZV90IGx1bWFfc2l6ZSwgaW50IGx1bWFfc3RyaWRlLAorICAgIHVpbnQ4X3QqIHUsIHNpemVfdCB1X3NpemUsIGludCB1X3N0cmlkZSwKKyAgICB1aW50OF90KiB2LCBzaXplX3Qgdl9zaXplLCBpbnQgdl9zdHJpZGUsCisgICAgdWludDhfdCogYSwgc2l6ZV90IGFfc2l6ZSwgaW50IGFfc3RyaWRlKTsKKworLy8gRGVwcmVjYXRlZCB2ZXJzaW9uIG9mIHRoZSBhYm92ZSwgd2l0aG91dCB0aGUgYWxwaGEgcGxhbmUuCisvLyBLZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorV0VCUF9FWFRFUk4gV2ViUElEZWNvZGVyKiBXZWJQSU5ld1lVVigKKyAgICB1aW50OF90KiBsdW1hLCBzaXplX3QgbHVtYV9zaXplLCBpbnQgbHVtYV9zdHJpZGUsCisgICAgdWludDhfdCogdSwgc2l6ZV90IHVfc2l6ZSwgaW50IHVfc3RyaWRlLAorICAgIHVpbnQ4X3QqIHYsIHNpemVfdCB2X3NpemUsIGludCB2X3N0cmlkZSk7CisKKy8vIERlbGV0ZXMgdGhlIFdlYlBJRGVjb2RlciBvYmplY3QgYW5kIGFzc29jaWF0ZWQgbWVtb3J5LiBNdXN0IGFsd2F5cyBiZSBjYWxsZWQKKy8vIGlmIFdlYlBJTmV3RGVjb2RlciwgV2ViUElOZXdSR0Igb3IgV2ViUElOZXdZVVYgc3VjY2VlZGVkLgorV0VCUF9FWFRFUk4gdm9pZCBXZWJQSURlbGV0ZShXZWJQSURlY29kZXIqIGlkZWMpOworCisvLyBDb3BpZXMgYW5kIGRlY29kZXMgdGhlIG5leHQgYXZhaWxhYmxlIGRhdGEuIFJldHVybnMgVlA4X1NUQVRVU19PSyB3aGVuCisvLyB0aGUgaW1hZ2UgaXMgc3VjY2Vzc2Z1bGx5IGRlY29kZWQuIFJldHVybnMgVlA4X1NUQVRVU19TVVNQRU5ERUQgd2hlbiBtb3JlCisvLyBkYXRhIGlzIGV4cGVjdGVkLiBSZXR1cm5zIGVycm9yIGluIG90aGVyIGNhc2VzLgorV0VCUF9FWFRFUk4gVlA4U3RhdHVzQ29kZSBXZWJQSUFwcGVuZCgKKyAgICBXZWJQSURlY29kZXIqIGlkZWMsIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUpOworCisvLyBBIHZhcmlhbnQgb2YgdGhlIGFib3ZlIGZ1bmN0aW9uIHRvIGJlIHVzZWQgd2hlbiBkYXRhIGJ1ZmZlciBjb250YWlucworLy8gcGFydGlhbCBkYXRhIGZyb20gdGhlIGJlZ2lubmluZy4gSW4gdGhpcyBjYXNlIGRhdGEgYnVmZmVyIGlzIG5vdCBjb3BpZWQKKy8vIHRvIHRoZSBpbnRlcm5hbCBtZW1vcnkuCisvLyBOb3RlIHRoYXQgdGhlIHZhbHVlIG9mIHRoZSAnZGF0YScgcG9pbnRlciBjYW4gY2hhbmdlIGJldHdlZW4gY2FsbHMgdG8KKy8vIFdlYlBJVXBkYXRlLCBmb3IgaW5zdGFuY2Ugd2hlbiB0aGUgZGF0YSBidWZmZXIgaXMgcmVzaXplZCB0byBmaXQgbGFyZ2VyIGRhdGEuCitXRUJQX0VYVEVSTiBWUDhTdGF0dXNDb2RlIFdlYlBJVXBkYXRlKAorICAgIFdlYlBJRGVjb2RlciogaWRlYywgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSk7CisKKy8vIFJldHVybnMgdGhlIFJHQi9BIGltYWdlIGRlY29kZWQgc28gZmFyLiBSZXR1cm5zIE5VTEwgaWYgb3V0cHV0IHBhcmFtcworLy8gYXJlIG5vdCBpbml0aWFsaXplZCB5ZXQuIFRoZSBSR0IvQSBvdXRwdXQgdHlwZSBjb3JyZXNwb25kcyB0byB0aGUgY29sb3JzcGFjZQorLy8gc3BlY2lmaWVkIGR1cmluZyBjYWxsIHRvIFdlYlBJTmV3RGVjb2RlcigpIG9yIFdlYlBJTmV3UkdCKCkuCisvLyAqbGFzdF95IGlzIHRoZSBpbmRleCBvZiBsYXN0IGRlY29kZWQgcm93IGluIHJhc3RlciBzY2FuIG9yZGVyLiBTb21lIHBvaW50ZXJzCisvLyAoKmxhc3RfeSwgKndpZHRoIGV0Yy4pIGNhbiBiZSBOVUxMIGlmIGNvcnJlc3BvbmRpbmcgaW5mb3JtYXRpb24gaXMgbm90CisvLyBuZWVkZWQuIFRoZSB2YWx1ZXMgaW4gdGhlc2UgcG9pbnRlcnMgYXJlIG9ubHkgdmFsaWQgb24gc3VjY2Vzc2Z1bCAobm9uLU5VTEwpCisvLyByZXR1cm4uCitXRUJQX0VYVEVSTiB1aW50OF90KiBXZWJQSURlY0dldFJHQigKKyAgICBjb25zdCBXZWJQSURlY29kZXIqIGlkZWMsIGludCogbGFzdF95LAorICAgIGludCogd2lkdGgsIGludCogaGVpZ2h0LCBpbnQqIHN0cmlkZSk7CisKKy8vIFNhbWUgYXMgYWJvdmUgZnVuY3Rpb24gdG8gZ2V0IGEgWVVWQSBpbWFnZS4gUmV0dXJucyBwb2ludGVyIHRvIHRoZSBsdW1hCisvLyBwbGFuZSBvciBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuIElmIHRoZXJlIGlzIG5vIGFscGhhIGluZm9ybWF0aW9uCisvLyB0aGUgYWxwaGEgcG9pbnRlciAnKmEnIHdpbGwgYmUgcmV0dXJuZWQgTlVMTC4KK1dFQlBfRVhURVJOIHVpbnQ4X3QqIFdlYlBJRGVjR2V0WVVWQSgKKyAgICBjb25zdCBXZWJQSURlY29kZXIqIGlkZWMsIGludCogbGFzdF95LAorICAgIHVpbnQ4X3QqKiB1LCB1aW50OF90KiogdiwgdWludDhfdCoqIGEsCisgICAgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQsIGludCogc3RyaWRlLCBpbnQqIHV2X3N0cmlkZSwgaW50KiBhX3N0cmlkZSk7CisKKy8vIERlcHJlY2F0ZWQgYWxwaGEtbGVzcyB2ZXJzaW9uIG9mIFdlYlBJRGVjR2V0WVVWQSgpOiBpdCB3aWxsIGlnbm9yZSB0aGUKKy8vIGFscGhhIGluZm9ybWF0aW9uIChpZiBwcmVzZW50KS4gS2VwdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KK3N0YXRpYyBXRUJQX0lOTElORSB1aW50OF90KiBXZWJQSURlY0dldFlVVigKKyAgICBjb25zdCBXZWJQSURlY29kZXIqIGlkZWMsIGludCogbGFzdF95LCB1aW50OF90KiogdSwgdWludDhfdCoqIHYsCisgICAgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQsIGludCogc3RyaWRlLCBpbnQqIHV2X3N0cmlkZSkgeworICByZXR1cm4gV2ViUElEZWNHZXRZVVZBKGlkZWMsIGxhc3RfeSwgdSwgdiwgTlVMTCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIHV2X3N0cmlkZSwgTlVMTCk7Cit9CisKKy8vIEdlbmVyaWMgY2FsbCB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGlzcGxheWFibGUgYXJlYS4KKy8vIElmIG5vbiBOVUxMLCB0aGUgbGVmdC9yaWdodC93aWR0aC9oZWlnaHQgcG9pbnRlcnMgYXJlIGZpbGxlZCB3aXRoIHRoZSB2aXNpYmxlCisvLyByZWN0YW5ndWxhciBhcmVhIHNvIGZhci4KKy8vIFJldHVybnMgTlVMTCBpbiBjYXNlIHRoZSBpbmNyZW1lbnRhbCBkZWNvZGVyIG9iamVjdCBpcyBpbiBhbiBpbnZhbGlkIHN0YXRlLgorLy8gT3RoZXJ3aXNlIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uLiBUaGlzIHN0cnVjdHVyZQorLy8gaXMgcmVhZC1vbmx5LCB0aWVkIHRvIFdlYlBJRGVjb2RlcidzIGxpZmVzcGFuIGFuZCBzaG91bGQgbm90IGJlIG1vZGlmaWVkLgorV0VCUF9FWFRFUk4gY29uc3QgV2ViUERlY0J1ZmZlciogV2ViUElEZWNvZGVkQXJlYSgKKyAgICBjb25zdCBXZWJQSURlY29kZXIqIGlkZWMsIGludCogbGVmdCwgaW50KiB0b3AsIGludCogd2lkdGgsIGludCogaGVpZ2h0KTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEFkdmFuY2VkIGRlY29kaW5nIHBhcmFtZXRyaXphdGlvbgorLy8KKy8vICBDb2RlIHNhbXBsZSBmb3IgdXNpbmcgdGhlIGFkdmFuY2VkIGRlY29kaW5nIEFQSQorLyoKKyAgICAgLy8gQSkgSW5pdCBhIGNvbmZpZ3VyYXRpb24gb2JqZWN0CisgICAgIFdlYlBEZWNvZGVyQ29uZmlnIGNvbmZpZzsKKyAgICAgQ0hFQ0soV2ViUEluaXREZWNvZGVyQ29uZmlnKCZjb25maWcpKTsKKworICAgICAvLyBCKSBvcHRpb25hbDogcmV0cmlldmUgdGhlIGJpdHN0cmVhbSdzIGZlYXR1cmVzLgorICAgICBDSEVDSyhXZWJQR2V0RmVhdHVyZXMoZGF0YSwgZGF0YV9zaXplLCAmY29uZmlnLmlucHV0KSA9PSBWUDhfU1RBVFVTX09LKTsKKworICAgICAvLyBDKSBBZGp1c3QgJ2NvbmZpZycsIGlmIG5lZWRlZAorICAgICBjb25maWcubm9fZmFuY3lfdXBzYW1wbGluZyA9IDE7CisgICAgIGNvbmZpZy5vdXRwdXQuY29sb3JzcGFjZSA9IE1PREVfQkdSQTsKKyAgICAgLy8gZXRjLgorCisgICAgIC8vIE5vdGUgdGhhdCB5b3UgY2FuIGFsc28gbWFrZSBjb25maWcub3V0cHV0IHBvaW50IHRvIGFuIGV4dGVybmFsbHkKKyAgICAgLy8gc3VwcGxpZWQgbWVtb3J5IGJ1ZmZlciwgcHJvdmlkZWQgaXQncyBiaWcgZW5vdWdoIHRvIHN0b3JlIHRoZSBkZWNvZGVkCisgICAgIC8vIHBpY3R1cmUuIE90aGVyd2lzZSwgY29uZmlnLm91dHB1dCB3aWxsIGp1c3QgYmUgdXNlZCB0byBhbGxvY2F0ZSBtZW1vcnkKKyAgICAgLy8gYW5kIHN0b3JlIHRoZSBkZWNvZGVkIHBpY3R1cmUuCisKKyAgICAgLy8gRCkgRGVjb2RlIQorICAgICBDSEVDSyhXZWJQRGVjb2RlKGRhdGEsIGRhdGFfc2l6ZSwgJmNvbmZpZykgPT0gVlA4X1NUQVRVU19PSyk7CisKKyAgICAgLy8gRSkgRGVjb2RlZCBpbWFnZSBpcyBub3cgaW4gY29uZmlnLm91dHB1dCAoYW5kIGNvbmZpZy5vdXRwdXQudS5SR0JBKQorCisgICAgIC8vIEYpIFJlY2xhaW0gbWVtb3J5IGFsbG9jYXRlZCBpbiBjb25maWcncyBvYmplY3QuIEl0J3Mgc2FmZSB0byBjYWxsCisgICAgIC8vIHRoaXMgZnVuY3Rpb24gZXZlbiBpZiB0aGUgbWVtb3J5IGlzIGV4dGVybmFsIGFuZCB3YXNuJ3QgYWxsb2NhdGVkCisgICAgIC8vIGJ5IFdlYlBEZWNvZGUoKS4KKyAgICAgV2ViUEZyZWVEZWNCdWZmZXIoJmNvbmZpZy5vdXRwdXQpOworKi8KKworLy8gRmVhdHVyZXMgZ2F0aGVyZWQgZnJvbSB0aGUgYml0c3RyZWFtCitzdHJ1Y3QgV2ViUEJpdHN0cmVhbUZlYXR1cmVzIHsKKyAgaW50IHdpZHRoOyAgICAgICAgICAvLyBXaWR0aCBpbiBwaXhlbHMsIGFzIHJlYWQgZnJvbSB0aGUgYml0c3RyZWFtLgorICBpbnQgaGVpZ2h0OyAgICAgICAgIC8vIEhlaWdodCBpbiBwaXhlbHMsIGFzIHJlYWQgZnJvbSB0aGUgYml0c3RyZWFtLgorICBpbnQgaGFzX2FscGhhOyAgICAgIC8vIFRydWUgaWYgdGhlIGJpdHN0cmVhbSBjb250YWlucyBhbiBhbHBoYSBjaGFubmVsLgorICBpbnQgaGFzX2FuaW1hdGlvbjsgIC8vIFRydWUgaWYgdGhlIGJpdHN0cmVhbSBpcyBhbiBhbmltYXRpb24uCisgIGludCBmb3JtYXQ7ICAgICAgICAgLy8gMCA9IHVuZGVmaW5lZCAoL21peGVkKSwgMSA9IGxvc3N5LCAyID0gbG9zc2xlc3MKKworICB1aW50MzJfdCBwYWRbNV07ICAgIC8vIHBhZGRpbmcgZm9yIGxhdGVyIHVzZQorfTsKKworLy8gSW50ZXJuYWwsIHZlcnNpb24tY2hlY2tlZCwgZW50cnkgcG9pbnQKK1dFQlBfRVhURVJOIFZQOFN0YXR1c0NvZGUgV2ViUEdldEZlYXR1cmVzSW50ZXJuYWwoCisgICAgY29uc3QgdWludDhfdCosIHNpemVfdCwgV2ViUEJpdHN0cmVhbUZlYXR1cmVzKiwgaW50KTsKKworLy8gUmV0cmlldmUgZmVhdHVyZXMgZnJvbSB0aGUgYml0c3RyZWFtLiBUaGUgKmZlYXR1cmVzIHN0cnVjdHVyZSBpcyBmaWxsZWQKKy8vIHdpdGggaW5mb3JtYXRpb24gZ2F0aGVyZWQgZnJvbSB0aGUgYml0c3RyZWFtLgorLy8gUmV0dXJucyBWUDhfU1RBVFVTX09LIHdoZW4gdGhlIGZlYXR1cmVzIGFyZSBzdWNjZXNzZnVsbHkgcmV0cmlldmVkLiBSZXR1cm5zCisvLyBWUDhfU1RBVFVTX05PVF9FTk9VR0hfREFUQSB3aGVuIG1vcmUgZGF0YSBpcyBuZWVkZWQgdG8gcmV0cmlldmUgdGhlCisvLyBmZWF0dXJlcyBmcm9tIGhlYWRlcnMuIFJldHVybnMgZXJyb3IgaW4gb3RoZXIgY2FzZXMuCitzdGF0aWMgV0VCUF9JTkxJTkUgVlA4U3RhdHVzQ29kZSBXZWJQR2V0RmVhdHVyZXMoCisgICAgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICBXZWJQQml0c3RyZWFtRmVhdHVyZXMqIGZlYXR1cmVzKSB7CisgIHJldHVybiBXZWJQR2V0RmVhdHVyZXNJbnRlcm5hbChkYXRhLCBkYXRhX3NpemUsIGZlYXR1cmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0VCUF9ERUNPREVSX0FCSV9WRVJTSU9OKTsKK30KKworLy8gRGVjb2Rpbmcgb3B0aW9ucworc3RydWN0IFdlYlBEZWNvZGVyT3B0aW9ucyB7CisgIGludCBieXBhc3NfZmlsdGVyaW5nOyAgICAgICAgICAgICAgIC8vIGlmIHRydWUsIHNraXAgdGhlIGluLWxvb3AgZmlsdGVyaW5nCisgIGludCBub19mYW5jeV91cHNhbXBsaW5nOyAgICAgICAgICAgIC8vIGlmIHRydWUsIHVzZSBmYXN0ZXIgcG9pbnR3aXNlIHVwc2FtcGxlcgorICBpbnQgdXNlX2Nyb3BwaW5nOyAgICAgICAgICAgICAgICAgICAvLyBpZiB0cnVlLCBjcm9wcGluZyBpcyBhcHBsaWVkIF9maXJzdF8KKyAgaW50IGNyb3BfbGVmdCwgY3JvcF90b3A7ICAgICAgICAgICAgLy8gdG9wLWxlZnQgcG9zaXRpb24gZm9yIGNyb3BwaW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXaWxsIGJlIHNuYXBwZWQgdG8gZXZlbiB2YWx1ZXMuCisgIGludCBjcm9wX3dpZHRoLCBjcm9wX2hlaWdodDsgICAgICAgIC8vIGRpbWVuc2lvbiBvZiB0aGUgY3JvcHBpbmcgYXJlYQorICBpbnQgdXNlX3NjYWxpbmc7ICAgICAgICAgICAgICAgICAgICAvLyBpZiB0cnVlLCBzY2FsaW5nIGlzIGFwcGxpZWQgX2FmdGVyd2FyZF8KKyAgaW50IHNjYWxlZF93aWR0aCwgc2NhbGVkX2hlaWdodDsgICAgLy8gZmluYWwgcmVzb2x1dGlvbgorICBpbnQgdXNlX3RocmVhZHM7ICAgICAgICAgICAgICAgICAgICAvLyBpZiB0cnVlLCB1c2UgbXVsdGktdGhyZWFkZWQgZGVjb2RpbmcKKyAgaW50IGRpdGhlcmluZ19zdHJlbmd0aDsgICAgICAgICAgICAgLy8gZGl0aGVyaW5nIHN0cmVuZ3RoICgwPU9mZiwgMTAwPWZ1bGwpCisgIGludCBmbGlwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZsaXAgb3V0cHV0IHZlcnRpY2FsbHkKKyAgaW50IGFscGhhX2RpdGhlcmluZ19zdHJlbmd0aDsgICAgICAgLy8gYWxwaGEgZGl0aGVyaW5nIHN0cmVuZ3RoIGluIFswLi4xMDBdCisKKyAgdWludDMyX3QgcGFkWzVdOyAgICAgICAgICAgICAgICAgICAgLy8gcGFkZGluZyBmb3IgbGF0ZXIgdXNlCit9OworCisvLyBNYWluIG9iamVjdCBzdG9yaW5nIHRoZSBjb25maWd1cmF0aW9uIGZvciBhZHZhbmNlZCBkZWNvZGluZy4KK3N0cnVjdCBXZWJQRGVjb2RlckNvbmZpZyB7CisgIFdlYlBCaXRzdHJlYW1GZWF0dXJlcyBpbnB1dDsgIC8vIEltbXV0YWJsZSBiaXRzdHJlYW0gZmVhdHVyZXMgKG9wdGlvbmFsKQorICBXZWJQRGVjQnVmZmVyIG91dHB1dDsgICAgICAgICAvLyBPdXRwdXQgYnVmZmVyIChjYW4gcG9pbnQgdG8gZXh0ZXJuYWwgbWVtKQorICBXZWJQRGVjb2Rlck9wdGlvbnMgb3B0aW9uczsgICAvLyBEZWNvZGluZyBvcHRpb25zCit9OworCisvLyBJbnRlcm5hbCwgdmVyc2lvbi1jaGVja2VkLCBlbnRyeSBwb2ludAorV0VCUF9FWFRFUk4gaW50IFdlYlBJbml0RGVjb2RlckNvbmZpZ0ludGVybmFsKFdlYlBEZWNvZGVyQ29uZmlnKiwgaW50KTsKKworLy8gSW5pdGlhbGl6ZSB0aGUgY29uZmlndXJhdGlvbiBhcyBlbXB0eS4gVGhpcyBmdW5jdGlvbiBtdXN0IGFsd2F5cyBiZQorLy8gY2FsbGVkIGZpcnN0LCB1bmxlc3MgV2ViUEdldEZlYXR1cmVzKCkgaXMgdG8gYmUgY2FsbGVkLgorLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIG1pc21hdGNoZWQgdmVyc2lvbi4KK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgV2ViUEluaXREZWNvZGVyQ29uZmlnKFdlYlBEZWNvZGVyQ29uZmlnKiBjb25maWcpIHsKKyAgcmV0dXJuIFdlYlBJbml0RGVjb2RlckNvbmZpZ0ludGVybmFsKGNvbmZpZywgV0VCUF9ERUNPREVSX0FCSV9WRVJTSU9OKTsKK30KKworLy8gSW5zdGFudGlhdGUgYSBuZXcgaW5jcmVtZW50YWwgZGVjb2RlciBvYmplY3Qgd2l0aCB0aGUgcmVxdWVzdGVkCisvLyBjb25maWd1cmF0aW9uLiBUaGUgYml0c3RyZWFtIGNhbiBiZSBwYXNzZWQgdXNpbmcgJ2RhdGEnIGFuZCAnZGF0YV9zaXplJworLy8gcGFyYW1ldGVyLCBpbiB3aGljaCBjYXNlIHRoZSBmZWF0dXJlcyB3aWxsIGJlIHBhcnNlZCBhbmQgc3RvcmVkIGludG8KKy8vIGNvbmZpZy0+aW5wdXQuIE90aGVyd2lzZSwgJ2RhdGEnIGNhbiBiZSBOVUxMIGFuZCBubyBwYXJzaW5nIHdpbGwgb2NjdXIuCisvLyBOb3RlIHRoYXQgJ2NvbmZpZycgY2FuIGJlIE5VTEwgdG9vLCBpbiB3aGljaCBjYXNlIGEgZGVmYXVsdCBjb25maWd1cmF0aW9uCisvLyBpcyB1c2VkLiBJZiAnY29uZmlnJyBpcyBub3QgTlVMTCwgaXQgbXVzdCBvdXRsaXZlIHRoZSBXZWJQSURlY29kZXIgb2JqZWN0CisvLyBhcyBzb21lIHJlZmVyZW5jZXMgdG8gaXRzIGZpZWxkcyB3aWxsIGJlIHVzZWQuIE5vIGludGVybmFsIGNvcHkgb2YgJ2NvbmZpZycKKy8vIGlzIG1hZGUuCisvLyBUaGUgcmV0dXJuIFdlYlBJRGVjb2RlciBvYmplY3QgbXVzdCBhbHdheXMgYmUgZGVsZXRlZCBjYWxsaW5nIFdlYlBJRGVsZXRlKCkuCisvLyBSZXR1cm5zIE5VTEwgaW4gY2FzZSBvZiBlcnJvciAoYW5kIGNvbmZpZy0+c3RhdHVzIHdpbGwgdGhlbiByZWZsZWN0CisvLyB0aGUgZXJyb3IgY29uZGl0aW9uLCBpZiBhdmFpbGFibGUpLgorV0VCUF9FWFRFUk4gV2ViUElEZWNvZGVyKiBXZWJQSURlY29kZShjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQRGVjb2RlckNvbmZpZyogY29uZmlnKTsKKworLy8gTm9uLWluY3JlbWVudGFsIHZlcnNpb24uIFRoaXMgdmVyc2lvbiBkZWNvZGVzIHRoZSBmdWxsIGRhdGEgYXQgb25jZSwgdGFraW5nCisvLyAnY29uZmlnJyBpbnRvIGFjY291bnQuIFJldHVybnMgZGVjb2Rpbmcgc3RhdHVzICh3aGljaCBzaG91bGQgYmUgVlA4X1NUQVRVU19PSworLy8gaWYgdGhlIGRlY29kaW5nIHdhcyBzdWNjZXNzZnVsKS4gTm90ZSB0aGF0ICdjb25maWcnIGNhbm5vdCBiZSBOVUxMLgorV0VCUF9FWFRFUk4gVlA4U3RhdHVzQ29kZSBXZWJQRGVjb2RlKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUERlY29kZXJDb25maWcqIGNvbmZpZyk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvKiBXRUJQX1dFQlBfREVDT0RFX0hfICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvd2VicC9kZW11eC5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3dlYnAvZGVtdXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTVkNjQxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3dlYnAvZGVtdXguaApAQCAtMCwwICsxLDM2MyBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIERlbXV4IEFQSS4KKy8vIEVuYWJsZXMgZXh0cmFjdGlvbiBvZiBpbWFnZSBhbmQgZXh0ZW5kZWQgZm9ybWF0IGRhdGEgZnJvbSBXZWJQIGZpbGVzLgorCisvLyBDb2RlIEV4YW1wbGU6IERlbXV4aW5nIFdlYlAgZGF0YSB0byBleHRyYWN0IGFsbCB0aGUgZnJhbWVzLCBJQ0MgcHJvZmlsZQorLy8gYW5kIEVYSUYvWE1QIG1ldGFkYXRhLgorLyoKKyAgV2ViUERlbXV4ZXIqIGRlbXV4ID0gV2ViUERlbXV4KCZ3ZWJwX2RhdGEpOworCisgIHVpbnQzMl90IHdpZHRoID0gV2ViUERlbXV4R2V0SShkZW11eCwgV0VCUF9GRl9DQU5WQVNfV0lEVEgpOworICB1aW50MzJfdCBoZWlnaHQgPSBXZWJQRGVtdXhHZXRJKGRlbXV4LCBXRUJQX0ZGX0NBTlZBU19IRUlHSFQpOworICAvLyAuLi4gKEdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZmVhdHVyZXMgcHJlc2VudCBpbiB0aGUgV2ViUCBmaWxlKS4KKyAgdWludDMyX3QgZmxhZ3MgPSBXZWJQRGVtdXhHZXRJKGRlbXV4LCBXRUJQX0ZGX0ZPUk1BVF9GTEFHUyk7CisKKyAgLy8gLi4uIChJdGVyYXRlIG92ZXIgYWxsIGZyYW1lcykuCisgIFdlYlBJdGVyYXRvciBpdGVyOworICBpZiAoV2ViUERlbXV4R2V0RnJhbWUoZGVtdXgsIDEsICZpdGVyKSkgeworICAgIGRvIHsKKyAgICAgIC8vIC4uLiAoQ29uc3VtZSAnaXRlcic7IGUuZy4gRGVjb2RlICdpdGVyLmZyYWdtZW50JyB3aXRoIFdlYlBEZWNvZGUoKSwKKyAgICAgIC8vIC4uLiBhbmQgZ2V0IG90aGVyIGZyYW1lIHByb3BlcnRpZXMgbGlrZSB3aWR0aCwgaGVpZ2h0LCBvZmZzZXRzIGV0Yy4KKyAgICAgIC8vIC4uLiBzZWUgJ3N0cnVjdCBXZWJQSXRlcmF0b3InIGJlbG93IGZvciBtb3JlIGluZm8pLgorICAgIH0gd2hpbGUgKFdlYlBEZW11eE5leHRGcmFtZSgmaXRlcikpOworICAgIFdlYlBEZW11eFJlbGVhc2VJdGVyYXRvcigmaXRlcik7CisgIH0KKworICAvLyAuLi4gKEV4dHJhY3QgbWV0YWRhdGEpLgorICBXZWJQQ2h1bmtJdGVyYXRvciBjaHVua19pdGVyOworICBpZiAoZmxhZ3MgJiBJQ0NQX0ZMQUcpIFdlYlBEZW11eEdldENodW5rKGRlbXV4LCAiSUNDUCIsIDEsICZjaHVua19pdGVyKTsKKyAgLy8gLi4uIChDb25zdW1lIHRoZSBJQ0MgcHJvZmlsZSBpbiAnY2h1bmtfaXRlci5jaHVuaycpLgorICBXZWJQRGVtdXhSZWxlYXNlQ2h1bmtJdGVyYXRvcigmY2h1bmtfaXRlcik7CisgIGlmIChmbGFncyAmIEVYSUZfRkxBRykgV2ViUERlbXV4R2V0Q2h1bmsoZGVtdXgsICJFWElGIiwgMSwgJmNodW5rX2l0ZXIpOworICAvLyAuLi4gKENvbnN1bWUgdGhlIEVYSUYgbWV0YWRhdGEgaW4gJ2NodW5rX2l0ZXIuY2h1bmsnKS4KKyAgV2ViUERlbXV4UmVsZWFzZUNodW5rSXRlcmF0b3IoJmNodW5rX2l0ZXIpOworICBpZiAoZmxhZ3MgJiBYTVBfRkxBRykgV2ViUERlbXV4R2V0Q2h1bmsoZGVtdXgsICJYTVAgIiwgMSwgJmNodW5rX2l0ZXIpOworICAvLyAuLi4gKENvbnN1bWUgdGhlIFhNUCBtZXRhZGF0YSBpbiAnY2h1bmtfaXRlci5jaHVuaycpLgorICBXZWJQRGVtdXhSZWxlYXNlQ2h1bmtJdGVyYXRvcigmY2h1bmtfaXRlcik7CisgIFdlYlBEZW11eERlbGV0ZShkZW11eCk7CisqLworCisjaWZuZGVmIFdFQlBfV0VCUF9ERU1VWF9IXworI2RlZmluZSBXRUJQX1dFQlBfREVNVVhfSF8KKworI2luY2x1ZGUgIi4vZGVjb2RlLmgiICAgICAvLyBmb3IgV0VCUF9DU1BfTU9ERQorI2luY2x1ZGUgIi4vbXV4X3R5cGVzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBXRUJQX0RFTVVYX0FCSV9WRVJTSU9OIDB4MDEwNyAgICAvLyBNQUpPUig4YikgKyBNSU5PUig4YikKKworLy8gTm90ZTogZm9yd2FyZCBkZWNsYXJpbmcgZW51bWVyYXRpb25zIGlzIG5vdCBhbGxvd2VkIGluIChzdHJpY3QpIEMgYW5kIEMrKywKKy8vIHRoZSB0eXBlcyBhcmUgbGVmdCBoZXJlIGZvciByZWZlcmVuY2UuCisvLyB0eXBlZGVmIGVudW0gV2ViUERlbXV4U3RhdGUgV2ViUERlbXV4U3RhdGU7CisvLyB0eXBlZGVmIGVudW0gV2ViUEZvcm1hdEZlYXR1cmUgV2ViUEZvcm1hdEZlYXR1cmU7Cit0eXBlZGVmIHN0cnVjdCBXZWJQRGVtdXhlciBXZWJQRGVtdXhlcjsKK3R5cGVkZWYgc3RydWN0IFdlYlBJdGVyYXRvciBXZWJQSXRlcmF0b3I7Cit0eXBlZGVmIHN0cnVjdCBXZWJQQ2h1bmtJdGVyYXRvciBXZWJQQ2h1bmtJdGVyYXRvcjsKK3R5cGVkZWYgc3RydWN0IFdlYlBBbmltSW5mbyBXZWJQQW5pbUluZm87Cit0eXBlZGVmIHN0cnVjdCBXZWJQQW5pbURlY29kZXJPcHRpb25zIFdlYlBBbmltRGVjb2Rlck9wdGlvbnM7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFJldHVybnMgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBkZW11eCBsaWJyYXJ5LCBwYWNrZWQgaW4gaGV4YWRlY2ltYWwgdXNpbmcKKy8vIDhiaXRzIGZvciBlYWNoIG9mIG1ham9yL21pbm9yL3JldmlzaW9uLiBFLmc6IHYyLjUuNyBpcyAweDAyMDUwNy4KK1dFQlBfRVhURVJOIGludCBXZWJQR2V0RGVtdXhWZXJzaW9uKHZvaWQpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTGlmZSBvZiBhIERlbXV4IG9iamVjdAorCit0eXBlZGVmIGVudW0gV2ViUERlbXV4U3RhdGUgeworICBXRUJQX0RFTVVYX1BBUlNFX0VSUk9SICAgID0gLTEsICAvLyBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBwYXJzaW5nLgorICBXRUJQX0RFTVVYX1BBUlNJTkdfSEVBREVSID0gIDAsICAvLyBOb3QgZW5vdWdoIGRhdGEgdG8gcGFyc2UgZnVsbCBoZWFkZXIuCisgIFdFQlBfREVNVVhfUEFSU0VEX0hFQURFUiAgPSAgMSwgIC8vIEhlYWRlciBwYXJzaW5nIGNvbXBsZXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkYXRhIG1heSBiZSBhdmFpbGFibGUuCisgIFdFQlBfREVNVVhfRE9ORSAgICAgICAgICAgPSAgMiAgIC8vIEVudGlyZSBmaWxlIGhhcyBiZWVuIHBhcnNlZC4KK30gV2ViUERlbXV4U3RhdGU7CisKKy8vIEludGVybmFsLCB2ZXJzaW9uLWNoZWNrZWQsIGVudHJ5IHBvaW50CitXRUJQX0VYVEVSTiBXZWJQRGVtdXhlciogV2ViUERlbXV4SW50ZXJuYWwoCisgICAgY29uc3QgV2ViUERhdGEqLCBpbnQsIFdlYlBEZW11eFN0YXRlKiwgaW50KTsKKworLy8gUGFyc2VzIHRoZSBmdWxsIFdlYlAgZmlsZSBnaXZlbiBieSAnZGF0YScuIEZvciBzaW5nbGUgaW1hZ2VzIHRoZSBXZWJQIGZpbGUKKy8vIGhlYWRlciBhbG9uZSBvciB0aGUgZmlsZSBoZWFkZXIgYW5kIHRoZSBjaHVuayBoZWFkZXIgbWF5IGJlIGFic2VudC4KKy8vIFJldHVybnMgYSBXZWJQRGVtdXhlciBvYmplY3Qgb24gc3VjY2Vzc2Z1bCBwYXJzZSwgTlVMTCBvdGhlcndpc2UuCitzdGF0aWMgV0VCUF9JTkxJTkUgV2ViUERlbXV4ZXIqIFdlYlBEZW11eChjb25zdCBXZWJQRGF0YSogZGF0YSkgeworICByZXR1cm4gV2ViUERlbXV4SW50ZXJuYWwoZGF0YSwgMCwgTlVMTCwgV0VCUF9ERU1VWF9BQklfVkVSU0lPTik7Cit9CisKKy8vIFBhcnNlcyB0aGUgcG9zc2libHkgaW5jb21wbGV0ZSBXZWJQIGZpbGUgZ2l2ZW4gYnkgJ2RhdGEnLgorLy8gSWYgJ3N0YXRlJyBpcyBub24tTlVMTCBpdCB3aWxsIGJlIHNldCB0byBpbmRpY2F0ZSB0aGUgc3RhdHVzIG9mIHRoZSBkZW11eGVyLgorLy8gUmV0dXJucyBOVUxMIGluIGNhc2Ugb2YgZXJyb3Igb3IgaWYgdGhlcmUgaXNuJ3QgZW5vdWdoIGRhdGEgdG8gc3RhcnQgcGFyc2luZzsKKy8vIGFuZCBhIFdlYlBEZW11eGVyIG9iamVjdCBvbiBzdWNjZXNzZnVsIHBhcnNlLgorLy8gTm90ZSB0aGF0IFdlYlBEZW11eGVyIGtlZXBzIGludGVybmFsIHBvaW50ZXJzIHRvICdkYXRhJyBtZW1vcnkgc2VnbWVudC4KKy8vIElmIHRoaXMgZGF0YSBpcyB2b2xhdGlsZSwgdGhlIGRlbXV4ZXIgb2JqZWN0IHNob3VsZCBiZSBkZWxldGVkIChieSBjYWxsaW5nCisvLyBXZWJQRGVtdXhEZWxldGUoKSkgYW5kIFdlYlBEZW11eFBhcnRpYWwoKSBjYWxsZWQgYWdhaW4gb24gdGhlIG5ldyBkYXRhLgorLy8gVGhpcyBpcyB1c3VhbGx5IGFuIGluZXhwZW5zaXZlIG9wZXJhdGlvbi4KK3N0YXRpYyBXRUJQX0lOTElORSBXZWJQRGVtdXhlciogV2ViUERlbXV4UGFydGlhbCgKKyAgICBjb25zdCBXZWJQRGF0YSogZGF0YSwgV2ViUERlbXV4U3RhdGUqIHN0YXRlKSB7CisgIHJldHVybiBXZWJQRGVtdXhJbnRlcm5hbChkYXRhLCAxLCBzdGF0ZSwgV0VCUF9ERU1VWF9BQklfVkVSU0lPTik7Cit9CisKKy8vIEZyZWVzIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggJ2RtdXgnLgorV0VCUF9FWFRFUk4gdm9pZCBXZWJQRGVtdXhEZWxldGUoV2ViUERlbXV4ZXIqIGRtdXgpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRGF0YS9pbmZvcm1hdGlvbiBleHRyYWN0aW9uLgorCit0eXBlZGVmIGVudW0gV2ViUEZvcm1hdEZlYXR1cmUgeworICBXRUJQX0ZGX0ZPUk1BVF9GTEFHUywgICAgICAvLyBiaXQtd2lzZSBjb21iaW5hdGlvbiBvZiBXZWJQRmVhdHVyZUZsYWdzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcnJlc3BvbmRpbmcgdG8gdGhlICdWUDhYJyBjaHVuayAoaWYgcHJlc2VudCkuCisgIFdFQlBfRkZfQ0FOVkFTX1dJRFRILAorICBXRUJQX0ZGX0NBTlZBU19IRUlHSFQsCisgIFdFQlBfRkZfTE9PUF9DT1VOVCwgICAgICAgIC8vIG9ubHkgcmVsZXZhbnQgZm9yIGFuaW1hdGVkIGZpbGUKKyAgV0VCUF9GRl9CQUNLR1JPVU5EX0NPTE9SLCAgLy8gaWRlbS4KKyAgV0VCUF9GRl9GUkFNRV9DT1VOVCAgICAgICAgLy8gTnVtYmVyIG9mIGZyYW1lcyBwcmVzZW50IGluIHRoZSBkZW11eCBvYmplY3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIGNhc2Ugb2YgYSBwYXJ0aWFsIGRlbXV4LCB0aGlzIGlzIHRoZSBudW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgZnJhbWVzIHNlZW4gc28gZmFyLCB3aXRoIHRoZSBsYXN0IGZyYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvc3NpYmx5IGJlaW5nIHBhcnRpYWwuCit9IFdlYlBGb3JtYXRGZWF0dXJlOworCisvLyBHZXQgdGhlICdmZWF0dXJlJyB2YWx1ZSBmcm9tIHRoZSAnZG11eCcuCisvLyBOT1RFOiB2YWx1ZXMgYXJlIG9ubHkgdmFsaWQgaWYgV2ViUERlbXV4KCkgd2FzIHVzZWQgb3IgV2ViUERlbXV4UGFydGlhbCgpCisvLyByZXR1cm5lZCBhIHN0YXRlID4gV0VCUF9ERU1VWF9QQVJTSU5HX0hFQURFUi4KKy8vIElmICdmZWF0dXJlJyBpcyBXRUJQX0ZGX0ZPUk1BVF9GTEFHUywgdGhlIHJldHVybmVkIHZhbHVlIGlzIGEgYml0LXdpc2UKKy8vIGNvbWJpbmF0aW9uIG9mIFdlYlBGZWF0dXJlRmxhZ3MgdmFsdWVzLgorLy8gSWYgJ2ZlYXR1cmUnIGlzIFdFQlBfRkZfTE9PUF9DT1VOVCwgV0VCUF9GRl9CQUNLR1JPVU5EX0NPTE9SLCB0aGUgcmV0dXJuZWQKKy8vIHZhbHVlIGlzIG9ubHkgbWVhbmluZ2Z1bCBpZiB0aGUgYml0c3RyZWFtIGlzIGFuaW1hdGVkLgorV0VCUF9FWFRFUk4gdWludDMyX3QgV2ViUERlbXV4R2V0SSgKKyAgICBjb25zdCBXZWJQRGVtdXhlciogZG11eCwgV2ViUEZvcm1hdEZlYXR1cmUgZmVhdHVyZSk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGcmFtZSBpdGVyYXRpb24uCisKK3N0cnVjdCBXZWJQSXRlcmF0b3IgeworICBpbnQgZnJhbWVfbnVtOworICBpbnQgbnVtX2ZyYW1lczsgICAgICAgICAgLy8gZXF1aXZhbGVudCB0byBXRUJQX0ZGX0ZSQU1FX0NPVU5ULgorICBpbnQgeF9vZmZzZXQsIHlfb2Zmc2V0OyAgLy8gb2Zmc2V0IHJlbGF0aXZlIHRvIHRoZSBjYW52YXMuCisgIGludCB3aWR0aCwgaGVpZ2h0OyAgICAgICAvLyBkaW1lbnNpb25zIG9mIHRoaXMgZnJhbWUuCisgIGludCBkdXJhdGlvbjsgICAgICAgICAgICAvLyBkaXNwbGF5IGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcy4KKyAgV2ViUE11eEFuaW1EaXNwb3NlIGRpc3Bvc2VfbWV0aG9kOyAgLy8gZGlzcG9zZSBtZXRob2QgZm9yIHRoZSBmcmFtZS4KKyAgaW50IGNvbXBsZXRlOyAgIC8vIHRydWUgaWYgJ2ZyYWdtZW50JyBjb250YWlucyBhIGZ1bGwgZnJhbWUuIHBhcnRpYWwgaW1hZ2VzCisgICAgICAgICAgICAgICAgICAvLyBtYXkgc3RpbGwgYmUgZGVjb2RlZCB3aXRoIHRoZSBXZWJQIGluY3JlbWVudGFsIGRlY29kZXIuCisgIFdlYlBEYXRhIGZyYWdtZW50OyAgLy8gVGhlIGZyYW1lIGdpdmVuIGJ5ICdmcmFtZV9udW0nLiBOb3RlIGZvciBoaXN0b3JpY2FsCisgICAgICAgICAgICAgICAgICAgICAgLy8gcmVhc29ucyB0aGlzIGlzIGNhbGxlZCBhIGZyYWdtZW50LgorICBpbnQgaGFzX2FscGhhOyAgICAgIC8vIFRydWUgaWYgdGhlIGZyYW1lIGNvbnRhaW5zIHRyYW5zcGFyZW5jeS4KKyAgV2ViUE11eEFuaW1CbGVuZCBibGVuZF9tZXRob2Q7ICAvLyBCbGVuZCBvcGVyYXRpb24gZm9yIHRoZSBmcmFtZS4KKworICB1aW50MzJfdCBwYWRbMl07ICAgICAgICAgLy8gcGFkZGluZyBmb3IgbGF0ZXIgdXNlLgorICB2b2lkKiBwcml2YXRlXzsgICAgICAgICAgLy8gZm9yIGludGVybmFsIHVzZSBvbmx5LgorfTsKKworLy8gUmV0cmlldmVzIGZyYW1lICdmcmFtZV9udW1iZXInIGZyb20gJ2RtdXgnLgorLy8gJ2l0ZXItPmZyYWdtZW50JyBwb2ludHMgdG8gdGhlIGZyYW1lIG9uIHJldHVybiBmcm9tIHRoaXMgZnVuY3Rpb24uCisvLyBTZXR0aW5nICdmcmFtZV9udW1iZXInIGVxdWFsIHRvIDAgd2lsbCByZXR1cm4gdGhlIGxhc3QgZnJhbWUgb2YgdGhlIGltYWdlLgorLy8gUmV0dXJucyBmYWxzZSBpZiAnZG11eCcgaXMgTlVMTCBvciBmcmFtZSAnZnJhbWVfbnVtYmVyJyBpcyBub3QgcHJlc2VudC4KKy8vIENhbGwgV2ViUERlbXV4UmVsZWFzZUl0ZXJhdG9yKCkgd2hlbiB1c2Ugb2YgdGhlIGl0ZXJhdG9yIGlzIGNvbXBsZXRlLgorLy8gTk9URTogJ2RtdXgnIG11c3QgcGVyc2lzdCBmb3IgdGhlIGxpZmV0aW1lIG9mICdpdGVyJy4KK1dFQlBfRVhURVJOIGludCBXZWJQRGVtdXhHZXRGcmFtZSgKKyAgICBjb25zdCBXZWJQRGVtdXhlciogZG11eCwgaW50IGZyYW1lX251bWJlciwgV2ViUEl0ZXJhdG9yKiBpdGVyKTsKKworLy8gU2V0cyAnaXRlci0+ZnJhZ21lbnQnIHRvIHBvaW50IHRvIHRoZSBuZXh0ICgnaXRlci0+ZnJhbWVfbnVtJyArIDEpIG9yCisvLyBwcmV2aW91cyAoJ2l0ZXItPmZyYW1lX251bScgLSAxKSBmcmFtZS4gVGhlc2UgZnVuY3Rpb25zIGRvIG5vdCBsb29wLgorLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZS4KK1dFQlBfRVhURVJOIGludCBXZWJQRGVtdXhOZXh0RnJhbWUoV2ViUEl0ZXJhdG9yKiBpdGVyKTsKK1dFQlBfRVhURVJOIGludCBXZWJQRGVtdXhQcmV2RnJhbWUoV2ViUEl0ZXJhdG9yKiBpdGVyKTsKKworLy8gUmVsZWFzZXMgYW55IG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggJ2l0ZXInLgorLy8gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSBzdWJzZXF1ZW50IGNhbGxzIHRvIFdlYlBEZW11eEdldENodW5rKCkgb24gdGhlIHNhbWUKKy8vIGl0ZXIuIEFsc28sIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBkZXN0cm95aW5nIHRoZSBhc3NvY2lhdGVkIFdlYlBEZW11eGVyIHdpdGgKKy8vIFdlYlBEZW11eERlbGV0ZSgpLgorV0VCUF9FWFRFUk4gdm9pZCBXZWJQRGVtdXhSZWxlYXNlSXRlcmF0b3IoV2ViUEl0ZXJhdG9yKiBpdGVyKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENodW5rIGl0ZXJhdGlvbi4KKworc3RydWN0IFdlYlBDaHVua0l0ZXJhdG9yIHsKKyAgLy8gVGhlIGN1cnJlbnQgYW5kIHRvdGFsIG51bWJlciBvZiBjaHVua3Mgd2l0aCB0aGUgZm91cmNjIGdpdmVuIHRvCisgIC8vIFdlYlBEZW11eEdldENodW5rKCkuCisgIGludCBjaHVua19udW07CisgIGludCBudW1fY2h1bmtzOworICBXZWJQRGF0YSBjaHVuazsgICAgLy8gVGhlIHBheWxvYWQgb2YgdGhlIGNodW5rLgorCisgIHVpbnQzMl90IHBhZFs2XTsgICAvLyBwYWRkaW5nIGZvciBsYXRlciB1c2UKKyAgdm9pZCogcHJpdmF0ZV87Cit9OworCisvLyBSZXRyaWV2ZXMgdGhlICdjaHVua19udW1iZXInIGluc3RhbmNlIG9mIHRoZSBjaHVuayB3aXRoIGlkICdmb3VyY2MnIGZyb20KKy8vICdkbXV4Jy4KKy8vICdmb3VyY2MnIGlzIGEgY2hhcmFjdGVyIGFycmF5IGNvbnRhaW5pbmcgdGhlIGZvdXJjYyBvZiB0aGUgY2h1bmsgdG8gcmV0dXJuLAorLy8gZS5nLiwgIklDQ1AiLCAiWE1QICIsICJFWElGIiwgZXRjLgorLy8gU2V0dGluZyAnY2h1bmtfbnVtYmVyJyBlcXVhbCB0byAwIHdpbGwgcmV0dXJuIHRoZSBsYXN0IGNodW5rIGluIGEgc2V0LgorLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBjaHVuayBpcyBmb3VuZCwgZmFsc2Ugb3RoZXJ3aXNlLiBJbWFnZSByZWxhdGVkIGNodW5rCisvLyBwYXlsb2FkcyBhcmUgYWNjZXNzZWQgdGhyb3VnaCBXZWJQRGVtdXhHZXRGcmFtZSgpIGFuZCByZWxhdGVkIGZ1bmN0aW9ucy4KKy8vIENhbGwgV2ViUERlbXV4UmVsZWFzZUNodW5rSXRlcmF0b3IoKSB3aGVuIHVzZSBvZiB0aGUgaXRlcmF0b3IgaXMgY29tcGxldGUuCisvLyBOT1RFOiAnZG11eCcgbXVzdCBwZXJzaXN0IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGl0ZXJhdG9yLgorV0VCUF9FWFRFUk4gaW50IFdlYlBEZW11eEdldENodW5rKGNvbnN0IFdlYlBEZW11eGVyKiBkbXV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgZm91cmNjWzRdLCBpbnQgY2h1bmtfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBDaHVua0l0ZXJhdG9yKiBpdGVyKTsKKworLy8gU2V0cyAnaXRlci0+Y2h1bmsnIHRvIHBvaW50IHRvIHRoZSBuZXh0ICgnaXRlci0+Y2h1bmtfbnVtJyArIDEpIG9yIHByZXZpb3VzCisvLyAoJ2l0ZXItPmNodW5rX251bScgLSAxKSBjaHVuay4gVGhlc2UgZnVuY3Rpb25zIGRvIG5vdCBsb29wLgorLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZS4KK1dFQlBfRVhURVJOIGludCBXZWJQRGVtdXhOZXh0Q2h1bmsoV2ViUENodW5rSXRlcmF0b3IqIGl0ZXIpOworV0VCUF9FWFRFUk4gaW50IFdlYlBEZW11eFByZXZDaHVuayhXZWJQQ2h1bmtJdGVyYXRvciogaXRlcik7CisKKy8vIFJlbGVhc2VzIGFueSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoICdpdGVyJy4KKy8vIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBkZXN0cm95aW5nIHRoZSBhc3NvY2lhdGVkIFdlYlBEZW11eGVyIHdpdGgKKy8vIFdlYlBEZW11eERlbGV0ZSgpLgorV0VCUF9FWFRFUk4gdm9pZCBXZWJQRGVtdXhSZWxlYXNlQ2h1bmtJdGVyYXRvcihXZWJQQ2h1bmtJdGVyYXRvciogaXRlcik7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBXZWJQQW5pbURlY29kZXIgQVBJCisvLworLy8gVGhpcyBBUEkgYWxsb3dzIGRlY29kaW5nIChwb3NzaWJseSkgYW5pbWF0ZWQgV2ViUCBpbWFnZXMuCisvLworLy8gQ29kZSBFeGFtcGxlOgorLyoKKyAgV2ViUEFuaW1EZWNvZGVyT3B0aW9ucyBkZWNfb3B0aW9uczsKKyAgV2ViUEFuaW1EZWNvZGVyT3B0aW9uc0luaXQoJmRlY19vcHRpb25zKTsKKyAgLy8gVHVuZSAnZGVjX29wdGlvbnMnIGFzIG5lZWRlZC4KKyAgV2ViUEFuaW1EZWNvZGVyKiBkZWMgPSBXZWJQQW5pbURlY29kZXJOZXcod2VicF9kYXRhLCAmZGVjX29wdGlvbnMpOworICBXZWJQQW5pbUluZm8gYW5pbV9pbmZvOworICBXZWJQQW5pbURlY29kZXJHZXRJbmZvKGRlYywgJmFuaW1faW5mbyk7CisgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBhbmltX2luZm8ubG9vcF9jb3VudDsgKytpKSB7CisgICAgd2hpbGUgKFdlYlBBbmltRGVjb2Rlckhhc01vcmVGcmFtZXMoZGVjKSkgeworICAgICAgdWludDhfdCogYnVmOworICAgICAgaW50IHRpbWVzdGFtcDsKKyAgICAgIFdlYlBBbmltRGVjb2RlckdldE5leHQoZGVjLCAmYnVmLCAmdGltZXN0YW1wKTsKKyAgICAgIC8vIC4uLiAoUmVuZGVyICdidWYnIGJhc2VkIG9uICd0aW1lc3RhbXAnKS4KKyAgICAgIC8vIC4uLiAoRG8gTk9UIGZyZWUgJ2J1ZicsIGFzIGl0IGlzIG93bmVkIGJ5ICdkZWMnKS4KKyAgICB9CisgICAgV2ViUEFuaW1EZWNvZGVyUmVzZXQoZGVjKTsKKyAgfQorICBjb25zdCBXZWJQRGVtdXhlciogZGVtdXhlciA9IFdlYlBBbmltRGVjb2RlckdldERlbXV4ZXIoZGVjKTsKKyAgLy8gLi4uIChEbyBzb21ldGhpbmcgdXNpbmcgJ2RlbXV4ZXInOyBlLmcuIGdldCBFWElGL1hNUC9JQ0MgZGF0YSkuCisgIFdlYlBBbmltRGVjb2RlckRlbGV0ZShkZWMpOworKi8KKwordHlwZWRlZiBzdHJ1Y3QgV2ViUEFuaW1EZWNvZGVyIFdlYlBBbmltRGVjb2RlcjsgIC8vIE1haW4gb3BhcXVlIG9iamVjdC4KKworLy8gR2xvYmFsIG9wdGlvbnMuCitzdHJ1Y3QgV2ViUEFuaW1EZWNvZGVyT3B0aW9ucyB7CisgIC8vIE91dHB1dCBjb2xvcnNwYWNlLiBPbmx5IHRoZSBmb2xsb3dpbmcgbW9kZXMgYXJlIHN1cHBvcnRlZDoKKyAgLy8gTU9ERV9SR0JBLCBNT0RFX0JHUkEsIE1PREVfcmdiQSBhbmQgTU9ERV9iZ3JBLgorICBXRUJQX0NTUF9NT0RFIGNvbG9yX21vZGU7CisgIGludCB1c2VfdGhyZWFkczsgICAgICAgICAgIC8vIElmIHRydWUsIHVzZSBtdWx0aS10aHJlYWRlZCBkZWNvZGluZy4KKyAgdWludDMyX3QgcGFkZGluZ1s3XTsgICAgICAgLy8gUGFkZGluZyBmb3IgbGF0ZXIgdXNlLgorfTsKKworLy8gSW50ZXJuYWwsIHZlcnNpb24tY2hlY2tlZCwgZW50cnkgcG9pbnQuCitXRUJQX0VYVEVSTiBpbnQgV2ViUEFuaW1EZWNvZGVyT3B0aW9uc0luaXRJbnRlcm5hbCgKKyAgICBXZWJQQW5pbURlY29kZXJPcHRpb25zKiwgaW50KTsKKworLy8gU2hvdWxkIGFsd2F5cyBiZSBjYWxsZWQsIHRvIGluaXRpYWxpemUgYSBmcmVzaCBXZWJQQW5pbURlY29kZXJPcHRpb25zCisvLyBzdHJ1Y3R1cmUgYmVmb3JlIG1vZGlmaWNhdGlvbi4gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIHZlcnNpb24gbWlzbWF0Y2guCisvLyBXZWJQQW5pbURlY29kZXJPcHRpb25zSW5pdCgpIG11c3QgaGF2ZSBzdWNjZWVkZWQgYmVmb3JlIHVzaW5nIHRoZQorLy8gJ2RlY19vcHRpb25zJyBvYmplY3QuCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFdlYlBBbmltRGVjb2Rlck9wdGlvbnNJbml0KAorICAgIFdlYlBBbmltRGVjb2Rlck9wdGlvbnMqIGRlY19vcHRpb25zKSB7CisgIHJldHVybiBXZWJQQW5pbURlY29kZXJPcHRpb25zSW5pdEludGVybmFsKGRlY19vcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXRUJQX0RFTVVYX0FCSV9WRVJTSU9OKTsKK30KKworLy8gSW50ZXJuYWwsIHZlcnNpb24tY2hlY2tlZCwgZW50cnkgcG9pbnQuCitXRUJQX0VYVEVSTiBXZWJQQW5pbURlY29kZXIqIFdlYlBBbmltRGVjb2Rlck5ld0ludGVybmFsKAorICAgIGNvbnN0IFdlYlBEYXRhKiwgY29uc3QgV2ViUEFuaW1EZWNvZGVyT3B0aW9ucyosIGludCk7CisKKy8vIENyZWF0ZXMgYW5kIGluaXRpYWxpemVzIGEgV2ViUEFuaW1EZWNvZGVyIG9iamVjdC4KKy8vIFBhcmFtZXRlcnM6CisvLyAgIHdlYnBfZGF0YSAtIChpbikgV2ViUCBiaXRzdHJlYW0uIFRoaXMgc2hvdWxkIHJlbWFpbiB1bmNoYW5nZWQgZHVyaW5nIHRoZQorLy8gICAgICAgICAgICAgICAgICAgIGxpZmV0aW1lIG9mIHRoZSBvdXRwdXQgV2ViUEFuaW1EZWNvZGVyIG9iamVjdC4KKy8vICAgZGVjX29wdGlvbnMgLSAoaW4pIGRlY29kaW5nIG9wdGlvbnMuIENhbiBiZSBwYXNzZWQgTlVMTCB0byBjaG9vc2UKKy8vICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbmFibGUgZGVmYXVsdHMgKGluIHBhcnRpY3VsYXIsIGNvbG9yIG1vZGUgTU9ERV9SR0JBCisvLyAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHBpY2tlZCkuCisvLyBSZXR1cm5zOgorLy8gICBBIHBvaW50ZXIgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgV2ViUEFuaW1EZWNvZGVyIG9iamVjdCwgb3IgTlVMTCBpbiBjYXNlIG9mCisvLyAgIHBhcnNpbmcgZXJyb3IsIGludmFsaWQgb3B0aW9uIG9yIG1lbW9yeSBlcnJvci4KK3N0YXRpYyBXRUJQX0lOTElORSBXZWJQQW5pbURlY29kZXIqIFdlYlBBbmltRGVjb2Rlck5ldygKKyAgICBjb25zdCBXZWJQRGF0YSogd2VicF9kYXRhLCBjb25zdCBXZWJQQW5pbURlY29kZXJPcHRpb25zKiBkZWNfb3B0aW9ucykgeworICByZXR1cm4gV2ViUEFuaW1EZWNvZGVyTmV3SW50ZXJuYWwod2VicF9kYXRhLCBkZWNfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdFQlBfREVNVVhfQUJJX1ZFUlNJT04pOworfQorCisvLyBHbG9iYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGFuaW1hdGlvbi4uCitzdHJ1Y3QgV2ViUEFuaW1JbmZvIHsKKyAgdWludDMyX3QgY2FudmFzX3dpZHRoOworICB1aW50MzJfdCBjYW52YXNfaGVpZ2h0OworICB1aW50MzJfdCBsb29wX2NvdW50OworICB1aW50MzJfdCBiZ2NvbG9yOworICB1aW50MzJfdCBmcmFtZV9jb3VudDsKKyAgdWludDMyX3QgcGFkWzRdOyAgIC8vIHBhZGRpbmcgZm9yIGxhdGVyIHVzZQorfTsKKworLy8gR2V0IGdsb2JhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYW5pbWF0aW9uLgorLy8gUGFyYW1ldGVyczoKKy8vICAgZGVjIC0gKGluKSBkZWNvZGVyIGluc3RhbmNlIHRvIGdldCBpbmZvcm1hdGlvbiBmcm9tLgorLy8gICBpbmZvIC0gKG91dCkgZ2xvYmFsIGluZm9ybWF0aW9uIGZldGNoZWQgZnJvbSB0aGUgYW5pbWF0aW9uLgorLy8gUmV0dXJuczoKKy8vICAgVHJ1ZSBvbiBzdWNjZXNzLgorV0VCUF9FWFRFUk4gaW50IFdlYlBBbmltRGVjb2RlckdldEluZm8oY29uc3QgV2ViUEFuaW1EZWNvZGVyKiBkZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQQW5pbUluZm8qIGluZm8pOworCisvLyBGZXRjaCB0aGUgbmV4dCBmcmFtZSBmcm9tICdkZWMnIGJhc2VkIG9uIG9wdGlvbnMgc3VwcGxpZWQgdG8KKy8vIFdlYlBBbmltRGVjb2Rlck5ldygpLiBUaGlzIHdpbGwgYmUgYSBmdWxseSByZWNvbnN0cnVjdGVkIGNhbnZhcyBvZiBzaXplCisvLyAnY2FudmFzX3dpZHRoICogNCAqIGNhbnZhc19oZWlnaHQnLCBhbmQgbm90IGp1c3QgdGhlIGZyYW1lIHN1Yi1yZWN0YW5nbGUuIFRoZQorLy8gcmV0dXJuZWQgYnVmZmVyICdidWYnIGlzIHZhbGlkIG9ubHkgdW50aWwgdGhlIG5leHQgY2FsbCB0bworLy8gV2ViUEFuaW1EZWNvZGVyR2V0TmV4dCgpLCBXZWJQQW5pbURlY29kZXJSZXNldCgpIG9yIFdlYlBBbmltRGVjb2RlckRlbGV0ZSgpLgorLy8gUGFyYW1ldGVyczoKKy8vICAgZGVjIC0gKGluL291dCkgZGVjb2RlciBpbnN0YW5jZSBmcm9tIHdoaWNoIHRoZSBuZXh0IGZyYW1lIGlzIHRvIGJlIGZldGNoZWQuCisvLyAgIGJ1ZiAtIChvdXQpIGRlY29kZWQgZnJhbWUuCisvLyAgIHRpbWVzdGFtcCAtIChvdXQpIHRpbWVzdGFtcCBvZiB0aGUgZnJhbWUgaW4gbWlsbGlzZWNvbmRzLgorLy8gUmV0dXJuczoKKy8vICAgRmFsc2UgaWYgYW55IG9mIHRoZSBhcmd1bWVudHMgYXJlIE5VTEwsIG9yIGlmIHRoZXJlIGlzIGEgcGFyc2luZyBvcgorLy8gICBkZWNvZGluZyBlcnJvciwgb3IgaWYgdGhlcmUgYXJlIG5vIG1vcmUgZnJhbWVzLiBPdGhlcndpc2UsIHJldHVybnMgdHJ1ZS4KK1dFQlBfRVhURVJOIGludCBXZWJQQW5pbURlY29kZXJHZXROZXh0KFdlYlBBbmltRGVjb2RlciogZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIGJ1ZiwgaW50KiB0aW1lc3RhbXApOworCisvLyBDaGVjayBpZiB0aGVyZSBhcmUgbW9yZSBmcmFtZXMgbGVmdCB0byBkZWNvZGUuCisvLyBQYXJhbWV0ZXJzOgorLy8gICBkZWMgLSAoaW4pIGRlY29kZXIgaW5zdGFuY2UgdG8gYmUgY2hlY2tlZC4KKy8vIFJldHVybnM6CisvLyAgIFRydWUgaWYgJ2RlYycgaXMgbm90IE5VTEwgYW5kIHNvbWUgZnJhbWVzIGFyZSB5ZXQgdG8gYmUgZGVjb2RlZC4KKy8vICAgT3RoZXJ3aXNlLCByZXR1cm5zIGZhbHNlLgorV0VCUF9FWFRFUk4gaW50IFdlYlBBbmltRGVjb2Rlckhhc01vcmVGcmFtZXMoY29uc3QgV2ViUEFuaW1EZWNvZGVyKiBkZWMpOworCisvLyBSZXNldHMgdGhlIFdlYlBBbmltRGVjb2RlciBvYmplY3QsIHNvIHRoYXQgbmV4dCBjYWxsIHRvCisvLyBXZWJQQW5pbURlY29kZXJHZXROZXh0KCkgd2lsbCByZXN0YXJ0IGRlY29kaW5nIGZyb20gMXN0IGZyYW1lLiBUaGlzIHdvdWxkIGJlCisvLyBoZWxwZnVsIHdoZW4gYWxsIGZyYW1lcyBuZWVkIHRvIGJlIGRlY29kZWQgbXVsdGlwbGUgdGltZXMgKGUuZy4KKy8vIGluZm8ubG9vcF9jb3VudCB0aW1lcykgd2l0aG91dCBkZXN0cm95aW5nIGFuZCByZWNyZWF0aW5nIHRoZSAnZGVjJyBvYmplY3QuCisvLyBQYXJhbWV0ZXJzOgorLy8gICBkZWMgLSAoaW4vb3V0KSBkZWNvZGVyIGluc3RhbmNlIHRvIGJlIHJlc2V0CitXRUJQX0VYVEVSTiB2b2lkIFdlYlBBbmltRGVjb2RlclJlc2V0KFdlYlBBbmltRGVjb2RlciogZGVjKTsKKworLy8gR3JhYiB0aGUgaW50ZXJuYWwgZGVtdXhlciBvYmplY3QuCisvLyBHZXR0aW5nIHRoZSBkZW11eGVyIG9iamVjdCBjYW4gYmUgdXNlZnVsIGlmIG9uZSB3YW50cyB0byB1c2Ugb3BlcmF0aW9ucyBvbmx5CisvLyBhdmFpbGFibGUgdGhyb3VnaCBkZW11eGVyOyBlLmcuIHRvIGdldCBYTVAvRVhJRi9JQ0MgbWV0YWRhdGEuIFRoZSByZXR1cm5lZAorLy8gZGVtdXhlciBvYmplY3QgaXMgb3duZWQgYnkgJ2RlYycgYW5kIGlzIHZhbGlkIG9ubHkgdW50aWwgdGhlIG5leHQgY2FsbCB0bworLy8gV2ViUEFuaW1EZWNvZGVyRGVsZXRlKCkuCisvLworLy8gUGFyYW1ldGVyczoKKy8vICAgZGVjIC0gKGluKSBkZWNvZGVyIGluc3RhbmNlIGZyb20gd2hpY2ggdGhlIGRlbXV4ZXIgb2JqZWN0IGlzIHRvIGJlIGZldGNoZWQuCitXRUJQX0VYVEVSTiBjb25zdCBXZWJQRGVtdXhlciogV2ViUEFuaW1EZWNvZGVyR2V0RGVtdXhlcigKKyAgICBjb25zdCBXZWJQQW5pbURlY29kZXIqIGRlYyk7CisKKy8vIERlbGV0ZXMgdGhlIFdlYlBBbmltRGVjb2RlciBvYmplY3QuCisvLyBQYXJhbWV0ZXJzOgorLy8gICBkZWMgLSAoaW4vb3V0KSBkZWNvZGVyIGluc3RhbmNlIHRvIGJlIGRlbGV0ZWQKK1dFQlBfRVhURVJOIHZvaWQgV2ViUEFuaW1EZWNvZGVyRGVsZXRlKFdlYlBBbmltRGVjb2RlciogZGVjKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8qIFdFQlBfV0VCUF9ERU1VWF9IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3dlYnAvZW5jb2RlLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvd2VicC9lbmNvZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWMzNTQzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3dlYnAvZW5jb2RlLmgKQEAgLTAsMCArMSw1NDUgQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIFdlYlAgZW5jb2RlcjogbWFpbiBpbnRlcmZhY2UKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaWZuZGVmIFdFQlBfV0VCUF9FTkNPREVfSF8KKyNkZWZpbmUgV0VCUF9XRUJQX0VOQ09ERV9IXworCisjaW5jbHVkZSAiLi90eXBlcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgV0VCUF9FTkNPREVSX0FCSV9WRVJTSU9OIDB4MDIwZSAgICAvLyBNQUpPUig4YikgKyBNSU5PUig4YikKKworLy8gTm90ZTogZm9yd2FyZCBkZWNsYXJpbmcgZW51bWVyYXRpb25zIGlzIG5vdCBhbGxvd2VkIGluIChzdHJpY3QpIEMgYW5kIEMrKywKKy8vIHRoZSB0eXBlcyBhcmUgbGVmdCBoZXJlIGZvciByZWZlcmVuY2UuCisvLyB0eXBlZGVmIGVudW0gV2ViUEltYWdlSGludCBXZWJQSW1hZ2VIaW50OworLy8gdHlwZWRlZiBlbnVtIFdlYlBFbmNDU1AgV2ViUEVuY0NTUDsKKy8vIHR5cGVkZWYgZW51bSBXZWJQUHJlc2V0IFdlYlBQcmVzZXQ7CisvLyB0eXBlZGVmIGVudW0gV2ViUEVuY29kaW5nRXJyb3IgV2ViUEVuY29kaW5nRXJyb3I7Cit0eXBlZGVmIHN0cnVjdCBXZWJQQ29uZmlnIFdlYlBDb25maWc7Cit0eXBlZGVmIHN0cnVjdCBXZWJQUGljdHVyZSBXZWJQUGljdHVyZTsgICAvLyBtYWluIHN0cnVjdHVyZSBmb3IgSS9PCit0eXBlZGVmIHN0cnVjdCBXZWJQQXV4U3RhdHMgV2ViUEF1eFN0YXRzOwordHlwZWRlZiBzdHJ1Y3QgV2ViUE1lbW9yeVdyaXRlciBXZWJQTWVtb3J5V3JpdGVyOworCisvLyBSZXR1cm4gdGhlIGVuY29kZXIncyB2ZXJzaW9uIG51bWJlciwgcGFja2VkIGluIGhleGFkZWNpbWFsIHVzaW5nIDhiaXRzIGZvcgorLy8gZWFjaCBvZiBtYWpvci9taW5vci9yZXZpc2lvbi4gRS5nOiB2Mi41LjcgaXMgMHgwMjA1MDcuCitXRUJQX0VYVEVSTiBpbnQgV2ViUEdldEVuY29kZXJWZXJzaW9uKHZvaWQpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT25lLXN0b3Atc2hvcCBjYWxsISBObyBxdWVzdGlvbnMgYXNrZWQ6CisKKy8vIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSAocG9pbnRlZCB0byBieSAqb3V0cHV0KSwgb3IgMCBpZgorLy8gYW4gZXJyb3Igb2NjdXJyZWQuIFRoZSBjb21wcmVzc2VkIGRhdGEgbXVzdCBiZSByZWxlYXNlZCBieSB0aGUgY2FsbGVyCisvLyB1c2luZyB0aGUgY2FsbCAnV2ViUEZyZWUoKm91dHB1dCknLgorLy8gVGhlc2UgZnVuY3Rpb25zIGNvbXByZXNzIHVzaW5nIHRoZSBsb3NzeSBmb3JtYXQsIGFuZCB0aGUgcXVhbGl0eV9mYWN0b3IKKy8vIGNhbiBnbyBmcm9tIDAgKHNtYWxsZXIgb3V0cHV0LCBsb3dlciBxdWFsaXR5KSB0byAxMDAgKGJlc3QgcXVhbGl0eSwKKy8vIGxhcmdlciBvdXRwdXQpLgorV0VCUF9FWFRFUk4gc2l6ZV90IFdlYlBFbmNvZGVSR0IoY29uc3QgdWludDhfdCogcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcXVhbGl0eV9mYWN0b3IsIHVpbnQ4X3QqKiBvdXRwdXQpOworV0VCUF9FWFRFUk4gc2l6ZV90IFdlYlBFbmNvZGVCR1IoY29uc3QgdWludDhfdCogYmdyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcXVhbGl0eV9mYWN0b3IsIHVpbnQ4X3QqKiBvdXRwdXQpOworV0VCUF9FWFRFUk4gc2l6ZV90IFdlYlBFbmNvZGVSR0JBKGNvbnN0IHVpbnQ4X3QqIHJnYmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHF1YWxpdHlfZmFjdG9yLCB1aW50OF90Kiogb3V0cHV0KTsKK1dFQlBfRVhURVJOIHNpemVfdCBXZWJQRW5jb2RlQkdSQShjb25zdCB1aW50OF90KiBiZ3JhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBxdWFsaXR5X2ZhY3RvciwgdWludDhfdCoqIG91dHB1dCk7CisKKy8vIFRoZXNlIGZ1bmN0aW9ucyBhcmUgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIGFib3ZlLCBidXQgY29tcHJlc3NpbmcgaW4gYQorLy8gbG9zc2xlc3MgbWFubmVyLiBGaWxlcyBhcmUgdXN1YWxseSBsYXJnZXIgdGhhbiBsb3NzeSBmb3JtYXQsIGJ1dCB3aWxsCisvLyBub3Qgc3VmZmVyIGFueSBjb21wcmVzc2lvbiBsb3NzLgorV0VCUF9FWFRFUk4gc2l6ZV90IFdlYlBFbmNvZGVMb3NzbGVzc1JHQihjb25zdCB1aW50OF90KiByZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIG91dHB1dCk7CitXRUJQX0VYVEVSTiBzaXplX3QgV2ViUEVuY29kZUxvc3NsZXNzQkdSKGNvbnN0IHVpbnQ4X3QqIGJnciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90Kiogb3V0cHV0KTsKK1dFQlBfRVhURVJOIHNpemVfdCBXZWJQRW5jb2RlTG9zc2xlc3NSR0JBKGNvbnN0IHVpbnQ4X3QqIHJnYmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90Kiogb3V0cHV0KTsKK1dFQlBfRVhURVJOIHNpemVfdCBXZWJQRW5jb2RlTG9zc2xlc3NCR1JBKGNvbnN0IHVpbnQ4X3QqIGJncmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90Kiogb3V0cHV0KTsKKworLy8gUmVsZWFzZXMgbWVtb3J5IHJldHVybmVkIGJ5IHRoZSBXZWJQRW5jb2RlKigpIGZ1bmN0aW9ucyBhYm92ZS4KK1dFQlBfRVhURVJOIHZvaWQgV2ViUEZyZWUodm9pZCogcHRyKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvZGluZyBwYXJhbWV0ZXJzCisKKy8vIEltYWdlIGNoYXJhY3RlcmlzdGljcyBoaW50IGZvciB0aGUgdW5kZXJseWluZyBlbmNvZGVyLgordHlwZWRlZiBlbnVtIFdlYlBJbWFnZUhpbnQgeworICBXRUJQX0hJTlRfREVGQVVMVCA9IDAsICAvLyBkZWZhdWx0IHByZXNldC4KKyAgV0VCUF9ISU5UX1BJQ1RVUkUsICAgICAgLy8gZGlnaXRhbCBwaWN0dXJlLCBsaWtlIHBvcnRyYWl0LCBpbm5lciBzaG90CisgIFdFQlBfSElOVF9QSE9UTywgICAgICAgIC8vIG91dGRvb3IgcGhvdG9ncmFwaCwgd2l0aCBuYXR1cmFsIGxpZ2h0aW5nCisgIFdFQlBfSElOVF9HUkFQSCwgICAgICAgIC8vIERpc2NyZXRlIHRvbmUgaW1hZ2UgKGdyYXBoLCBtYXAtdGlsZSBldGMpLgorICBXRUJQX0hJTlRfTEFTVAorfSBXZWJQSW1hZ2VIaW50OworCisvLyBDb21wcmVzc2lvbiBwYXJhbWV0ZXJzLgorc3RydWN0IFdlYlBDb25maWcgeworICBpbnQgbG9zc2xlc3M7ICAgICAgICAgICAvLyBMb3NzbGVzcyBlbmNvZGluZyAoMD1sb3NzeShkZWZhdWx0KSwgMT1sb3NzbGVzcykuCisgIGZsb2F0IHF1YWxpdHk7ICAgICAgICAgIC8vIGJldHdlZW4gMCBhbmQgMTAwLiBGb3IgbG9zc3ksIDAgZ2l2ZXMgdGhlIHNtYWxsZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpemUgYW5kIDEwMCB0aGUgbGFyZ2VzdC4gRm9yIGxvc3NsZXNzLCB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhcmFtZXRlciBpcyB0aGUgYW1vdW50IG9mIGVmZm9ydCBwdXQgaW50byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tcHJlc3Npb246IDAgaXMgdGhlIGZhc3Rlc3QgYnV0IGdpdmVzIGxhcmdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaWxlcyBjb21wYXJlZCB0byB0aGUgc2xvd2VzdCwgYnV0IGJlc3QsIDEwMC4KKyAgaW50IG1ldGhvZDsgICAgICAgICAgICAgLy8gcXVhbGl0eS9zcGVlZCB0cmFkZS1vZmYgKDA9ZmFzdCwgNj1zbG93ZXItYmV0dGVyKQorCisgIFdlYlBJbWFnZUhpbnQgaW1hZ2VfaGludDsgIC8vIEhpbnQgZm9yIGltYWdlIHR5cGUgKGxvc3NsZXNzIG9ubHkgZm9yIG5vdykuCisKKyAgaW50IHRhcmdldF9zaXplOyAgICAgICAgLy8gaWYgbm9uLXplcm8sIHNldCB0aGUgZGVzaXJlZCB0YXJnZXQgc2l6ZSBpbiBieXRlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGFrZXMgcHJlY2VkZW5jZSBvdmVyIHRoZSAnY29tcHJlc3Npb24nIHBhcmFtZXRlci4KKyAgZmxvYXQgdGFyZ2V0X1BTTlI7ICAgICAgLy8gaWYgbm9uLXplcm8sIHNwZWNpZmllcyB0aGUgbWluaW1hbCBkaXN0b3J0aW9uIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyeSB0byBhY2hpZXZlLiBUYWtlcyBwcmVjZWRlbmNlIG92ZXIgdGFyZ2V0X3NpemUuCisgIGludCBzZWdtZW50czsgICAgICAgICAgIC8vIG1heGltdW0gbnVtYmVyIG9mIHNlZ21lbnRzIHRvIHVzZSwgaW4gWzEuLjRdCisgIGludCBzbnNfc3RyZW5ndGg7ICAgICAgIC8vIFNwYXRpYWwgTm9pc2UgU2hhcGluZy4gMD1vZmYsIDEwMD1tYXhpbXVtLgorICBpbnQgZmlsdGVyX3N0cmVuZ3RoOyAgICAvLyByYW5nZTogWzAgPSBvZmYgLi4gMTAwID0gc3Ryb25nZXN0XQorICBpbnQgZmlsdGVyX3NoYXJwbmVzczsgICAvLyByYW5nZTogWzAgPSBvZmYgLi4gNyA9IGxlYXN0IHNoYXJwXQorICBpbnQgZmlsdGVyX3R5cGU7ICAgICAgICAvLyBmaWx0ZXJpbmcgdHlwZTogMCA9IHNpbXBsZSwgMSA9IHN0cm9uZyAob25seSB1c2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGZpbHRlcl9zdHJlbmd0aCA+IDAgb3IgYXV0b2ZpbHRlciA+IDApCisgIGludCBhdXRvZmlsdGVyOyAgICAgICAgIC8vIEF1dG8gYWRqdXN0IGZpbHRlcidzIHN0cmVuZ3RoIFswID0gb2ZmLCAxID0gb25dCisgIGludCBhbHBoYV9jb21wcmVzc2lvbjsgIC8vIEFsZ29yaXRobSBmb3IgZW5jb2RpbmcgdGhlIGFscGhhIHBsYW5lICgwID0gbm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMSA9IGNvbXByZXNzZWQgd2l0aCBXZWJQIGxvc3NsZXNzKS4gRGVmYXVsdCBpcyAxLgorICBpbnQgYWxwaGFfZmlsdGVyaW5nOyAgICAvLyBQcmVkaWN0aXZlIGZpbHRlcmluZyBtZXRob2QgZm9yIGFscGhhIHBsYW5lLgorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgMDogbm9uZSwgMTogZmFzdCwgMjogYmVzdC4gRGVmYXVsdCBpZiAxLgorICBpbnQgYWxwaGFfcXVhbGl0eTsgICAgICAvLyBCZXR3ZWVuIDAgKHNtYWxsZXN0IHNpemUpIGFuZCAxMDAgKGxvc3NsZXNzKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVmYXVsdCBpcyAxMDAuCisgIGludCBwYXNzOyAgICAgICAgICAgICAgIC8vIG51bWJlciBvZiBlbnRyb3B5LWFuYWx5c2lzIHBhc3NlcyAoaW4gWzEuLjEwXSkuCisKKyAgaW50IHNob3dfY29tcHJlc3NlZDsgICAgLy8gaWYgdHJ1ZSwgZXhwb3J0IHRoZSBjb21wcmVzc2VkIHBpY3R1cmUgYmFjay4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4tbG9vcCBmaWx0ZXJpbmcgaXMgbm90IGFwcGxpZWQuCisgIGludCBwcmVwcm9jZXNzaW5nOyAgICAgIC8vIHByZXByb2Nlc3NpbmcgZmlsdGVyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwPW5vbmUsIDE9c2VnbWVudC1zbW9vdGgsIDI9cHNldWRvLXJhbmRvbSBkaXRoZXJpbmcKKyAgaW50IHBhcnRpdGlvbnM7ICAgICAgICAgLy8gbG9nMihudW1iZXIgb2YgdG9rZW4gcGFydGl0aW9ucykgaW4gWzAuLjNdLiBEZWZhdWx0CisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHNldCB0byAwIGZvciBlYXNpZXIgcHJvZ3Jlc3NpdmUgZGVjb2RpbmcuCisgIGludCBwYXJ0aXRpb25fbGltaXQ7ICAgIC8vIHF1YWxpdHkgZGVncmFkYXRpb24gYWxsb3dlZCB0byBmaXQgdGhlIDUxMmsgbGltaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gcHJlZGljdGlvbiBtb2RlcyBjb2RpbmcgKDA6IG5vIGRlZ3JhZGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxMDA6IG1heGltdW0gcG9zc2libGUgZGVncmFkYXRpb24pLgorICBpbnQgZW11bGF0ZV9qcGVnX3NpemU7ICAvLyBJZiB0cnVlLCBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIHdpbGwgYmUgcmVtYXBwZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gYmV0dGVyIG1hdGNoIHRoZSBleHBlY3RlZCBvdXRwdXQgc2l6ZSBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEpQRUcgY29tcHJlc3Npb24uIEdlbmVyYWxseSwgdGhlIG91dHB1dCBzaXplIHdpbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmUgc2ltaWxhciBidXQgdGhlIGRlZ3JhZGF0aW9uIHdpbGwgYmUgbG93ZXIuCisgIGludCB0aHJlYWRfbGV2ZWw7ICAgICAgIC8vIElmIG5vbi16ZXJvLCB0cnkgYW5kIHVzZSBtdWx0aS10aHJlYWRlZCBlbmNvZGluZy4KKyAgaW50IGxvd19tZW1vcnk7ICAgICAgICAgLy8gSWYgc2V0LCByZWR1Y2UgbWVtb3J5IHVzYWdlIChidXQgaW5jcmVhc2UgQ1BVIHVzZSkuCisKKyAgaW50IG5lYXJfbG9zc2xlc3M7ICAgICAgLy8gTmVhciBsb3NzbGVzcyBlbmNvZGluZyBbMCA9IG1heCBsb3NzIC4uIDEwMCA9IG9mZgorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoZGVmYXVsdCldLgorICBpbnQgZXhhY3Q7ICAgICAgICAgICAgICAvLyBpZiBub24temVybywgcHJlc2VydmUgdGhlIGV4YWN0IFJHQiB2YWx1ZXMgdW5kZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJhbnNwYXJlbnQgYXJlYS4gT3RoZXJ3aXNlLCBkaXNjYXJkIHRoaXMgaW52aXNpYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJHQiBpbmZvcm1hdGlvbiBmb3IgYmV0dGVyIGNvbXByZXNzaW9uLiBUaGUgZGVmYXVsdAorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZSBpcyAwLgorCisgIGludCB1c2VfZGVsdGFfcGFsZXR0ZTsgIC8vIHJlc2VydmVkIGZvciBmdXR1cmUgbG9zc2xlc3MgZmVhdHVyZQorICBpbnQgdXNlX3NoYXJwX3l1djsgICAgICAvLyBpZiBuZWVkZWQsIHVzZSBzaGFycCAoYW5kIHNsb3cpIFJHQi0+WVVWIGNvbnZlcnNpb24KKworICB1aW50MzJfdCBwYWRbMl07ICAgICAgICAvLyBwYWRkaW5nIGZvciBsYXRlciB1c2UKK307CisKKy8vIEVudW1lcmF0ZSBzb21lIHByZWRlZmluZWQgc2V0dGluZ3MgZm9yIFdlYlBDb25maWcsIGRlcGVuZGluZyBvbiB0aGUgdHlwZQorLy8gb2Ygc291cmNlIHBpY3R1cmUuIFRoZXNlIHByZXNldHMgYXJlIHVzZWQgd2hlbiBjYWxsaW5nIFdlYlBDb25maWdQcmVzZXQoKS4KK3R5cGVkZWYgZW51bSBXZWJQUHJlc2V0IHsKKyAgV0VCUF9QUkVTRVRfREVGQVVMVCA9IDAsICAvLyBkZWZhdWx0IHByZXNldC4KKyAgV0VCUF9QUkVTRVRfUElDVFVSRSwgICAgICAvLyBkaWdpdGFsIHBpY3R1cmUsIGxpa2UgcG9ydHJhaXQsIGlubmVyIHNob3QKKyAgV0VCUF9QUkVTRVRfUEhPVE8sICAgICAgICAvLyBvdXRkb29yIHBob3RvZ3JhcGgsIHdpdGggbmF0dXJhbCBsaWdodGluZworICBXRUJQX1BSRVNFVF9EUkFXSU5HLCAgICAgIC8vIGhhbmQgb3IgbGluZSBkcmF3aW5nLCB3aXRoIGhpZ2gtY29udHJhc3QgZGV0YWlscworICBXRUJQX1BSRVNFVF9JQ09OLCAgICAgICAgIC8vIHNtYWxsLXNpemVkIGNvbG9yZnVsIGltYWdlcworICBXRUJQX1BSRVNFVF9URVhUICAgICAgICAgIC8vIHRleHQtbGlrZQorfSBXZWJQUHJlc2V0OworCisvLyBJbnRlcm5hbCwgdmVyc2lvbi1jaGVja2VkLCBlbnRyeSBwb2ludAorV0VCUF9FWFRFUk4gaW50IFdlYlBDb25maWdJbml0SW50ZXJuYWwoV2ViUENvbmZpZyosIFdlYlBQcmVzZXQsIGZsb2F0LCBpbnQpOworCisvLyBTaG91bGQgYWx3YXlzIGJlIGNhbGxlZCwgdG8gaW5pdGlhbGl6ZSBhIGZyZXNoIFdlYlBDb25maWcgc3RydWN0dXJlIGJlZm9yZQorLy8gbW9kaWZpY2F0aW9uLiBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgdmVyc2lvbiBtaXNtYXRjaC4gV2ViUENvbmZpZ0luaXQoKQorLy8gbXVzdCBoYXZlIHN1Y2NlZWRlZCBiZWZvcmUgdXNpbmcgdGhlICdjb25maWcnIG9iamVjdC4KKy8vIE5vdGUgdGhhdCB0aGUgZGVmYXVsdCB2YWx1ZXMgYXJlIGxvc3NsZXNzPTAgYW5kIHF1YWxpdHk9NzUuCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFdlYlBDb25maWdJbml0KFdlYlBDb25maWcqIGNvbmZpZykgeworICByZXR1cm4gV2ViUENvbmZpZ0luaXRJbnRlcm5hbChjb25maWcsIFdFQlBfUFJFU0VUX0RFRkFVTFQsIDc1LmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdFQlBfRU5DT0RFUl9BQklfVkVSU0lPTik7Cit9CisKKy8vIFRoaXMgZnVuY3Rpb24gd2lsbCBpbml0aWFsaXplIHRoZSBjb25maWd1cmF0aW9uIGFjY29yZGluZyB0byBhIHByZWRlZmluZWQKKy8vIHNldCBvZiBwYXJhbWV0ZXJzIChyZWZlcnJlZCB0byBieSAncHJlc2V0JykgYW5kIGEgZ2l2ZW4gcXVhbGl0eSBmYWN0b3IuCisvLyBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgYXMgYSByZXBsYWNlbWVudCB0byBXZWJQQ29uZmlnSW5pdCgpLiBXaWxsCisvLyByZXR1cm4gZmFsc2UgaW4gY2FzZSBvZiBlcnJvci4KK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgV2ViUENvbmZpZ1ByZXNldChXZWJQQ29uZmlnKiBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUFByZXNldCBwcmVzZXQsIGZsb2F0IHF1YWxpdHkpIHsKKyAgcmV0dXJuIFdlYlBDb25maWdJbml0SW50ZXJuYWwoY29uZmlnLCBwcmVzZXQsIHF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdFQlBfRU5DT0RFUl9BQklfVkVSU0lPTik7Cit9CisKKy8vIEFjdGl2YXRlIHRoZSBsb3NzbGVzcyBjb21wcmVzc2lvbiBtb2RlIHdpdGggdGhlIGRlc2lyZWQgZWZmaWNpZW5jeSBsZXZlbAorLy8gYmV0d2VlbiAwIChmYXN0ZXN0LCBsb3dlc3QgY29tcHJlc3Npb24pIGFuZCA5IChzbG93ZXIsIGJlc3QgY29tcHJlc3Npb24pLgorLy8gQSBnb29kIGRlZmF1bHQgbGV2ZWwgaXMgJzYnLCBwcm92aWRpbmcgYSBmYWlyIHRyYWRlb2ZmIGJldHdlZW4gY29tcHJlc3Npb24KKy8vIHNwZWVkIGFuZCBmaW5hbCBjb21wcmVzc2VkIHNpemUuCisvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgb3ZlcndyaXRlIHNldmVyYWwgZmllbGRzIGZyb20gY29uZmlnOiAnbWV0aG9kJywgJ3F1YWxpdHknCisvLyBhbmQgJ2xvc3NsZXNzJy4gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIHBhcmFtZXRlciBlcnJvci4KK1dFQlBfRVhURVJOIGludCBXZWJQQ29uZmlnTG9zc2xlc3NQcmVzZXQoV2ViUENvbmZpZyogY29uZmlnLCBpbnQgbGV2ZWwpOworCisvLyBSZXR1cm5zIHRydWUgaWYgJ2NvbmZpZycgaXMgbm9uLU5VTEwgYW5kIGFsbCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYXJlCisvLyB3aXRoaW4gdGhlaXIgdmFsaWQgcmFuZ2VzLgorV0VCUF9FWFRFUk4gaW50IFdlYlBWYWxpZGF0ZUNvbmZpZyhjb25zdCBXZWJQQ29uZmlnKiBjb25maWcpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW5wdXQgLyBPdXRwdXQKKy8vIFN0cnVjdHVyZSBmb3Igc3RvcmluZyBhdXhpbGlhcnkgc3RhdGlzdGljcy4KKworc3RydWN0IFdlYlBBdXhTdGF0cyB7CisgIGludCBjb2RlZF9zaXplOyAgICAgICAgIC8vIGZpbmFsIHNpemUKKworICBmbG9hdCBQU05SWzVdOyAgICAgICAgICAvLyBwZWFrLXNpZ25hbC10by1ub2lzZSByYXRpbyBmb3IgWS9VL1YvQWxsL0FscGhhCisgIGludCBibG9ja19jb3VudFszXTsgICAgIC8vIG51bWJlciBvZiBpbnRyYTQvaW50cmExNi9za2lwcGVkIG1hY3JvYmxvY2tzCisgIGludCBoZWFkZXJfYnl0ZXNbMl07ICAgIC8vIGFwcHJveGltYXRlIG51bWJlciBvZiBieXRlcyBzcGVudCBmb3IgaGVhZGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBtb2RlLXBhcnRpdGlvbiAjMAorICBpbnQgcmVzaWR1YWxfYnl0ZXNbM11bNF07ICAvLyBhcHByb3hpbWF0ZSBudW1iZXIgb2YgYnl0ZXMgc3BlbnQgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERDL0FDL3V2IGNvZWZmaWNpZW50cyBmb3IgZWFjaCAoMC4uMykgc2VnbWVudHMuCisgIGludCBzZWdtZW50X3NpemVbNF07ICAgIC8vIG51bWJlciBvZiBtYWNyb2Jsb2NrcyBpbiBlYWNoIHNlZ21lbnRzCisgIGludCBzZWdtZW50X3F1YW50WzRdOyAgIC8vIHF1YW50aXplciB2YWx1ZXMgZm9yIGVhY2ggc2VnbWVudHMKKyAgaW50IHNlZ21lbnRfbGV2ZWxbNF07ICAgLy8gZmlsdGVyaW5nIHN0cmVuZ3RoIGZvciBlYWNoIHNlZ21lbnRzIFswLi42M10KKworICBpbnQgYWxwaGFfZGF0YV9zaXplOyAgICAvLyBzaXplIG9mIHRoZSB0cmFuc3BhcmVuY3kgZGF0YQorICBpbnQgbGF5ZXJfZGF0YV9zaXplOyAgICAvLyBzaXplIG9mIHRoZSBlbmhhbmNlbWVudCBsYXllciBkYXRhCisKKyAgLy8gbG9zc2xlc3MgZW5jb2RlciBzdGF0aXN0aWNzCisgIHVpbnQzMl90IGxvc3NsZXNzX2ZlYXR1cmVzOyAgLy8gYml0MDpwcmVkaWN0b3IgYml0MTpjcm9zcy1jb2xvciB0cmFuc2Zvcm0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXQyOnN1YnRyYWN0LWdyZWVuIGJpdDM6Y29sb3IgaW5kZXhpbmcKKyAgaW50IGhpc3RvZ3JhbV9iaXRzOyAgICAgICAgICAvLyBudW1iZXIgb2YgcHJlY2lzaW9uIGJpdHMgb2YgaGlzdG9ncmFtCisgIGludCB0cmFuc2Zvcm1fYml0czsgICAgICAgICAgLy8gcHJlY2lzaW9uIGJpdHMgZm9yIHRyYW5zZm9ybQorICBpbnQgY2FjaGVfYml0czsgICAgICAgICAgICAgIC8vIG51bWJlciBvZiBiaXRzIGZvciBjb2xvciBjYWNoZSBsb29rdXAKKyAgaW50IHBhbGV0dGVfc2l6ZTsgICAgICAgICAgICAvLyBudW1iZXIgb2YgY29sb3IgaW4gcGFsZXR0ZSwgaWYgdXNlZAorICBpbnQgbG9zc2xlc3Nfc2l6ZTsgICAgICAgICAgIC8vIGZpbmFsIGxvc3NsZXNzIHNpemUKKyAgaW50IGxvc3NsZXNzX2hkcl9zaXplOyAgICAgICAvLyBsb3NzbGVzcyBoZWFkZXIgKHRyYW5zZm9ybSwgaHVmZm1hbiBldGMpIHNpemUKKyAgaW50IGxvc3NsZXNzX2RhdGFfc2l6ZTsgICAgICAvLyBsb3NzbGVzcyBpbWFnZSBkYXRhIHNpemUKKworICB1aW50MzJfdCBwYWRbMl07ICAgICAgICAvLyBwYWRkaW5nIGZvciBsYXRlciB1c2UKK307CisKKy8vIFNpZ25hdHVyZSBmb3Igb3V0cHV0IGZ1bmN0aW9uLiBTaG91bGQgcmV0dXJuIHRydWUgaWYgd3JpdGluZyB3YXMgc3VjY2Vzc2Z1bC4KKy8vIGRhdGEvZGF0YV9zaXplIGlzIHRoZSBzZWdtZW50IG9mIGRhdGEgdG8gd3JpdGUsIGFuZCAncGljdHVyZScgaXMgZm9yCisvLyByZWZlcmVuY2UgKGFuZCBzbyBvbmUgY2FuIG1ha2UgdXNlIG9mIHBpY3R1cmUtPmN1c3RvbV9wdHIpLgordHlwZWRlZiBpbnQgKCpXZWJQV3JpdGVyRnVuY3Rpb24pKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUFBpY3R1cmUqIHBpY3R1cmUpOworCisvLyBXZWJQTWVtb3J5V3JpdGU6IGEgc3BlY2lhbCBXZWJQV3JpdGVyRnVuY3Rpb24gdGhhdCB3cml0ZXMgdG8gbWVtb3J5IHVzaW5nCisvLyB0aGUgZm9sbG93aW5nIFdlYlBNZW1vcnlXcml0ZXIgb2JqZWN0ICh0byBiZSBzZXQgYXMgYSBjdXN0b21fcHRyKS4KK3N0cnVjdCBXZWJQTWVtb3J5V3JpdGVyIHsKKyAgdWludDhfdCogbWVtOyAgICAgICAvLyBmaW5hbCBidWZmZXIgKG9mIHNpemUgJ21heF9zaXplJywgbGFyZ2VyIHRoYW4gJ3NpemUnKS4KKyAgc2l6ZV90ICAgc2l6ZTsgICAgICAvLyBmaW5hbCBzaXplCisgIHNpemVfdCAgIG1heF9zaXplOyAgLy8gdG90YWwgY2FwYWNpdHkKKyAgdWludDMyX3QgcGFkWzFdOyAgICAvLyBwYWRkaW5nIGZvciBsYXRlciB1c2UKK307CisKKy8vIFRoZSBmb2xsb3dpbmcgbXVzdCBiZSBjYWxsZWQgZmlyc3QgYmVmb3JlIGFueSB1c2UuCitXRUJQX0VYVEVSTiB2b2lkIFdlYlBNZW1vcnlXcml0ZXJJbml0KFdlYlBNZW1vcnlXcml0ZXIqIHdyaXRlcik7CisKKy8vIFRoZSBmb2xsb3dpbmcgbXVzdCBiZSBjYWxsZWQgdG8gZGVhbGxvY2F0ZSB3cml0ZXItPm1lbSBtZW1vcnkuIFRoZSAnd3JpdGVyJworLy8gb2JqZWN0IGl0c2VsZiBpcyBub3QgZGVhbGxvY2F0ZWQuCitXRUJQX0VYVEVSTiB2b2lkIFdlYlBNZW1vcnlXcml0ZXJDbGVhcihXZWJQTWVtb3J5V3JpdGVyKiB3cml0ZXIpOworLy8gVGhlIGN1c3RvbSB3cml0ZXIgdG8gYmUgdXNlZCB3aXRoIFdlYlBNZW1vcnlXcml0ZXIgYXMgY3VzdG9tX3B0ci4gVXBvbgorLy8gY29tcGxldGlvbiwgd3JpdGVyLm1lbSBhbmQgd3JpdGVyLnNpemUgd2lsbCBob2xkIHRoZSBjb2RlZCBkYXRhLgorLy8gd3JpdGVyLm1lbSBtdXN0IGJlIGZyZWVkIGJ5IGNhbGxpbmcgV2ViUE1lbW9yeVdyaXRlckNsZWFyLgorV0VCUF9FWFRFUk4gaW50IFdlYlBNZW1vcnlXcml0ZShjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQUGljdHVyZSogcGljdHVyZSk7CisKKy8vIFByb2dyZXNzIGhvb2ssIGNhbGxlZCBmcm9tIHRpbWUgdG8gdGltZSB0byByZXBvcnQgcHJvZ3Jlc3MuIEl0IGNhbiByZXR1cm4KKy8vIGZhbHNlIHRvIHJlcXVlc3QgYW4gYWJvcnQgb2YgdGhlIGVuY29kaW5nIHByb2Nlc3MsIG9yIHRydWUgb3RoZXJ3aXNlIGlmCisvLyBldmVyeXRoaW5nIGlzIE9LLgordHlwZWRlZiBpbnQgKCpXZWJQUHJvZ3Jlc3NIb29rKShpbnQgcGVyY2VudCwgY29uc3QgV2ViUFBpY3R1cmUqIHBpY3R1cmUpOworCisvLyBDb2xvciBzcGFjZXMuCit0eXBlZGVmIGVudW0gV2ViUEVuY0NTUCB7CisgIC8vIGNocm9tYSBzYW1wbGluZworICBXRUJQX1lVVjQyMCAgPSAwLCAgICAgICAgLy8gNDoyOjAKKyAgV0VCUF9ZVVY0MjBBID0gNCwgICAgICAgIC8vIGFscGhhIGNoYW5uZWwgdmFyaWFudAorICBXRUJQX0NTUF9VVl9NQVNLID0gMywgICAgLy8gYml0LW1hc2sgdG8gZ2V0IHRoZSBVViBzYW1wbGluZyBmYWN0b3JzCisgIFdFQlBfQ1NQX0FMUEhBX0JJVCA9IDQgICAvLyBiaXQgdGhhdCBpcyBzZXQgaWYgYWxwaGEgaXMgcHJlc2VudAorfSBXZWJQRW5jQ1NQOworCisvLyBFbmNvZGluZyBlcnJvciBjb25kaXRpb25zLgordHlwZWRlZiBlbnVtIFdlYlBFbmNvZGluZ0Vycm9yIHsKKyAgVlA4X0VOQ19PSyA9IDAsCisgIFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWSwgICAgICAgICAgICAvLyBtZW1vcnkgZXJyb3IgYWxsb2NhdGluZyBvYmplY3RzCisgIFZQOF9FTkNfRVJST1JfQklUU1RSRUFNX09VVF9PRl9NRU1PUlksICAvLyBtZW1vcnkgZXJyb3Igd2hpbGUgZmx1c2hpbmcgYml0cworICBWUDhfRU5DX0VSUk9SX05VTExfUEFSQU1FVEVSLCAgICAgICAgICAgLy8gYSBwb2ludGVyIHBhcmFtZXRlciBpcyBOVUxMCisgIFZQOF9FTkNfRVJST1JfSU5WQUxJRF9DT05GSUdVUkFUSU9OLCAgICAvLyBjb25maWd1cmF0aW9uIGlzIGludmFsaWQKKyAgVlA4X0VOQ19FUlJPUl9CQURfRElNRU5TSU9OLCAgICAgICAgICAgIC8vIHBpY3R1cmUgaGFzIGludmFsaWQgd2lkdGgvaGVpZ2h0CisgIFZQOF9FTkNfRVJST1JfUEFSVElUSU9OMF9PVkVSRkxPVywgICAgICAvLyBwYXJ0aXRpb24gaXMgYmlnZ2VyIHRoYW4gNTEyaworICBWUDhfRU5DX0VSUk9SX1BBUlRJVElPTl9PVkVSRkxPVywgICAgICAgLy8gcGFydGl0aW9uIGlzIGJpZ2dlciB0aGFuIDE2TQorICBWUDhfRU5DX0VSUk9SX0JBRF9XUklURSwgICAgICAgICAgICAgICAgLy8gZXJyb3Igd2hpbGUgZmx1c2hpbmcgYnl0ZXMKKyAgVlA4X0VOQ19FUlJPUl9GSUxFX1RPT19CSUcsICAgICAgICAgICAgIC8vIGZpbGUgaXMgYmlnZ2VyIHRoYW4gNEcKKyAgVlA4X0VOQ19FUlJPUl9VU0VSX0FCT1JULCAgICAgICAgICAgICAgIC8vIGFib3J0IHJlcXVlc3QgYnkgdXNlcgorICBWUDhfRU5DX0VSUk9SX0xBU1QgICAgICAgICAgICAgICAgICAgICAgLy8gbGlzdCB0ZXJtaW5hdG9yLiBhbHdheXMgbGFzdC4KK30gV2ViUEVuY29kaW5nRXJyb3I7CisKKy8vIG1heGltdW0gd2lkdGgvaGVpZ2h0IGFsbG93ZWQgKGluY2x1c2l2ZSksIGluIHBpeGVscworI2RlZmluZSBXRUJQX01BWF9ESU1FTlNJT04gMTYzODMKKworLy8gTWFpbiBleGNoYW5nZSBzdHJ1Y3R1cmUgKGlucHV0IHNhbXBsZXMsIG91dHB1dCBieXRlcywgc3RhdGlzdGljcykKK3N0cnVjdCBXZWJQUGljdHVyZSB7CisgIC8vICAgSU5QVVQKKyAgLy8vLy8vLy8vLy8vLy8KKyAgLy8gTWFpbiBmbGFnIGZvciBlbmNvZGVyIHNlbGVjdGluZyBiZXR3ZWVuIEFSR0Igb3IgWVVWIGlucHV0LgorICAvLyBJdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgQVJHQiBpbnB1dCAoKmFyZ2IsIGFyZ2Jfc3RyaWRlKSBmb3IgbG9zc2xlc3MKKyAgLy8gY29tcHJlc3Npb24sIGFuZCBZVVYgaW5wdXQgKCp5LCAqdSwgKnYsIGV0Yy4pIGZvciBsb3NzeSBjb21wcmVzc2lvbgorICAvLyBzaW5jZSB0aGVzZSBhcmUgdGhlIHJlc3BlY3RpdmUgbmF0aXZlIGNvbG9yc3BhY2UgZm9yIHRoZXNlIGZvcm1hdHMuCisgIGludCB1c2VfYXJnYjsKKworICAvLyBZVVYgaW5wdXQgKG1vc3RseSB1c2VkIGZvciBpbnB1dCB0byBsb3NzeSBjb21wcmVzc2lvbikKKyAgV2ViUEVuY0NTUCBjb2xvcnNwYWNlOyAgICAgLy8gY29sb3JzcGFjZTogc2hvdWxkIGJlIFlVVjQyMCBmb3Igbm93ICg9WSdDYkNyKS4KKyAgaW50IHdpZHRoLCBoZWlnaHQ7ICAgICAgICAgLy8gZGltZW5zaW9ucyAobGVzcyBvciBlcXVhbCB0byBXRUJQX01BWF9ESU1FTlNJT04pCisgIHVpbnQ4X3QgKnksICp1LCAqdjsgICAgICAgIC8vIHBvaW50ZXJzIHRvIGx1bWEvY2hyb21hIHBsYW5lcy4KKyAgaW50IHlfc3RyaWRlLCB1dl9zdHJpZGU7ICAgLy8gbHVtYS9jaHJvbWEgc3RyaWRlcy4KKyAgdWludDhfdCogYTsgICAgICAgICAgICAgICAgLy8gcG9pbnRlciB0byB0aGUgYWxwaGEgcGxhbmUKKyAgaW50IGFfc3RyaWRlOyAgICAgICAgICAgICAgLy8gc3RyaWRlIG9mIHRoZSBhbHBoYSBwbGFuZQorICB1aW50MzJfdCBwYWQxWzJdOyAgICAgICAgICAvLyBwYWRkaW5nIGZvciBsYXRlciB1c2UKKworICAvLyBBUkdCIGlucHV0IChtb3N0bHkgdXNlZCBmb3IgaW5wdXQgdG8gbG9zc2xlc3MgY29tcHJlc3Npb24pCisgIHVpbnQzMl90KiBhcmdiOyAgICAgICAgICAgIC8vIFBvaW50ZXIgdG8gYXJnYiAoMzIgYml0KSBwbGFuZS4KKyAgaW50IGFyZ2Jfc3RyaWRlOyAgICAgICAgICAgLy8gVGhpcyBpcyBzdHJpZGUgaW4gcGl4ZWxzIHVuaXRzLCBub3QgYnl0ZXMuCisgIHVpbnQzMl90IHBhZDJbM107ICAgICAgICAgIC8vIHBhZGRpbmcgZm9yIGxhdGVyIHVzZQorCisgIC8vICAgT1VUUFVUCisgIC8vLy8vLy8vLy8vLy8vLworICAvLyBCeXRlLWVtaXNzaW9uIGhvb2ssIHRvIHN0b3JlIGNvbXByZXNzZWQgYnl0ZXMgYXMgdGhleSBhcmUgcmVhZHkuCisgIFdlYlBXcml0ZXJGdW5jdGlvbiB3cml0ZXI7ICAvLyBjYW4gYmUgTlVMTAorICB2b2lkKiBjdXN0b21fcHRyOyAgICAgICAgICAgLy8gY2FuIGJlIHVzZWQgYnkgdGhlIHdyaXRlci4KKworICAvLyBtYXAgZm9yIGV4dHJhIGluZm9ybWF0aW9uIChvbmx5IGZvciBsb3NzeSBjb21wcmVzc2lvbiBtb2RlKQorICBpbnQgZXh0cmFfaW5mb190eXBlOyAgICAvLyAxOiBpbnRyYSB0eXBlLCAyOiBzZWdtZW50LCAzOiBxdWFudAorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA0OiBpbnRyYS0xNiBwcmVkaWN0aW9uIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDU6IGNocm9tYSBwcmVkaWN0aW9uIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDY6IGJpdCBjb3N0LCA3OiBkaXN0b3J0aW9uCisgIHVpbnQ4X3QqIGV4dHJhX2luZm87ICAgIC8vIGlmIG5vdCBOVUxMLCBwb2ludHMgdG8gYW4gYXJyYXkgb2Ygc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoKHdpZHRoICsgMTUpIC8gMTYpICogKChoZWlnaHQgKyAxNSkgLyAxNikgdGhhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIGJlIGZpbGxlZCB3aXRoIGEgbWFjcm9ibG9jayBtYXAsIGRlcGVuZGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBleHRyYV9pbmZvX3R5cGUuCisKKyAgLy8gICBTVEFUUyBBTkQgUkVQT1JUUworICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgLy8gUG9pbnRlciB0byBzaWRlIHN0YXRpc3RpY3MgKHVwZGF0ZWQgb25seSBpZiBub3QgTlVMTCkKKyAgV2ViUEF1eFN0YXRzKiBzdGF0czsKKworICAvLyBFcnJvciBjb2RlIGZvciB0aGUgbGF0ZXN0IGVycm9yIGVuY291bnRlcmVkIGR1cmluZyBlbmNvZGluZworICBXZWJQRW5jb2RpbmdFcnJvciBlcnJvcl9jb2RlOworCisgIC8vIElmIG5vdCBOVUxMLCByZXBvcnQgcHJvZ3Jlc3MgZHVyaW5nIGVuY29kaW5nLgorICBXZWJQUHJvZ3Jlc3NIb29rIHByb2dyZXNzX2hvb2s7CisKKyAgdm9pZCogdXNlcl9kYXRhOyAgICAgICAgLy8gdGhpcyBmaWVsZCBpcyBmcmVlIHRvIGJlIHNldCB0byBhbnkgdmFsdWUgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZWQgZHVyaW5nIGNhbGxiYWNrcyAobGlrZSBwcm9ncmVzcy1yZXBvcnQgZS5nLikuCisKKyAgdWludDMyX3QgcGFkM1szXTsgICAgICAgLy8gcGFkZGluZyBmb3IgbGF0ZXIgdXNlCisKKyAgLy8gVW51c2VkIGZvciBub3cKKyAgdWludDhfdCAqcGFkNCwgKnBhZDU7CisgIHVpbnQzMl90IHBhZDZbOF07ICAgICAgIC8vIHBhZGRpbmcgZm9yIGxhdGVyIHVzZQorCisgIC8vIFBSSVZBVEUgRklFTERTCisgIC8vLy8vLy8vLy8vLy8vLy8vLy8vCisgIHZvaWQqIG1lbW9yeV87ICAgICAgICAgIC8vIHJvdyBjaHVuayBvZiBtZW1vcnkgZm9yIHl1dmEgcGxhbmVzCisgIHZvaWQqIG1lbW9yeV9hcmdiXzsgICAgIC8vIGFuZCBmb3IgYXJnYiB0b28uCisgIHZvaWQqIHBhZDdbMl07ICAgICAgICAgIC8vIHBhZGRpbmcgZm9yIGxhdGVyIHVzZQorfTsKKworLy8gSW50ZXJuYWwsIHZlcnNpb24tY2hlY2tlZCwgZW50cnkgcG9pbnQKK1dFQlBfRVhURVJOIGludCBXZWJQUGljdHVyZUluaXRJbnRlcm5hbChXZWJQUGljdHVyZSosIGludCk7CisKKy8vIFNob3VsZCBhbHdheXMgYmUgY2FsbGVkLCB0byBpbml0aWFsaXplIHRoZSBzdHJ1Y3R1cmUuIFJldHVybnMgZmFsc2UgaW4gY2FzZQorLy8gb2YgdmVyc2lvbiBtaXNtYXRjaC4gV2ViUFBpY3R1cmVJbml0KCkgbXVzdCBoYXZlIHN1Y2NlZWRlZCBiZWZvcmUgdXNpbmcgdGhlCisvLyAncGljdHVyZScgb2JqZWN0LgorLy8gTm90ZSB0aGF0LCBieSBkZWZhdWx0LCB1c2VfYXJnYiBpcyBmYWxzZSBhbmQgY29sb3JzcGFjZSBpcyBXRUJQX1lVVjQyMC4KK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgV2ViUFBpY3R1cmVJbml0KFdlYlBQaWN0dXJlKiBwaWN0dXJlKSB7CisgIHJldHVybiBXZWJQUGljdHVyZUluaXRJbnRlcm5hbChwaWN0dXJlLCBXRUJQX0VOQ09ERVJfQUJJX1ZFUlNJT04pOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gV2ViUFBpY3R1cmUgdXRpbHMKKworLy8gQ29udmVuaWVuY2UgYWxsb2NhdGlvbiAvIGRlYWxsb2NhdGlvbiBiYXNlZCBvbiBwaWN0dXJlLT53aWR0aC9oZWlnaHQ6CisvLyBBbGxvY2F0ZSB5L3UvdiBidWZmZXJzIGFzIHBlciBjb2xvcnNwYWNlL3dpZHRoL2hlaWdodCBzcGVjaWZpY2F0aW9uLgorLy8gTm90ZSEgVGhpcyBmdW5jdGlvbiB3aWxsIGZyZWUgdGhlIHByZXZpb3VzIGJ1ZmZlciBpZiBuZWVkZWQuCisvLyBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgbWVtb3J5IGVycm9yLgorV0VCUF9FWFRFUk4gaW50IFdlYlBQaWN0dXJlQWxsb2MoV2ViUFBpY3R1cmUqIHBpY3R1cmUpOworCisvLyBSZWxlYXNlIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGJ5IFdlYlBQaWN0dXJlQWxsb2MoKSBvciBXZWJQUGljdHVyZUltcG9ydCooKS4KKy8vIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGRvZXMgX25vdF8gZnJlZSB0aGUgbWVtb3J5IHVzZWQgYnkgdGhlICdwaWN0dXJlJworLy8gb2JqZWN0IGl0c2VsZi4KKy8vIEJlc2lkZXMgbWVtb3J5ICh3aGljaCBpcyByZWNsYWltZWQpIGFsbCBvdGhlciBmaWVsZHMgb2YgJ3BpY3R1cmUnIGFyZQorLy8gcHJlc2VydmVkLgorV0VCUF9FWFRFUk4gdm9pZCBXZWJQUGljdHVyZUZyZWUoV2ViUFBpY3R1cmUqIHBpY3R1cmUpOworCisvLyBDb3B5IHRoZSBwaXhlbHMgb2YgKnNyYyBpbnRvICpkc3QsIHVzaW5nIFdlYlBQaWN0dXJlQWxsb2MuIFVwb24gcmV0dXJuLCAqZHN0CisvLyB3aWxsIGZ1bGx5IG93biB0aGUgY29waWVkIHBpeGVscyAodGhpcyBpcyBub3QgYSB2aWV3KS4gVGhlICdkc3QnIHBpY3R1cmUgbmVlZAorLy8gbm90IGJlIGluaXRpYWxpemVkIGFzIGl0cyBjb250ZW50IGlzIG92ZXJ3cml0dGVuLgorLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yLgorV0VCUF9FWFRFUk4gaW50IFdlYlBQaWN0dXJlQ29weShjb25zdCBXZWJQUGljdHVyZSogc3JjLCBXZWJQUGljdHVyZSogZHN0KTsKKworLy8gQ29tcHV0ZSB0aGUgc2luZ2xlIGRpc3RvcnRpb24gZm9yIHBhY2tlZCBwbGFuZXMgb2Ygc2FtcGxlcy4KKy8vICdzcmMnIHdpbGwgYmUgY29tcGFyZWQgdG8gJ3JlZicsIGFuZCB0aGUgcmF3IGRpc3RvcnRpb24gc3RvcmVkIGludG8KKy8vICcqZGlzdG9ydGlvbicuIFRoZSByZWZpbmVkIG1ldHJpYyAobG9nKE1TRSksIGxvZygxIC0gc3NpbSksLi4uJyB3aWxsIGJlCisvLyBzdG9yZWQgaW4gJypyZXN1bHQnLgorLy8gJ3hfc3RlcCcgaXMgdGhlIGhvcml6b250YWwgc3RyaWRlIChpbiBieXRlcykgYmV0d2VlbiBzYW1wbGVzLgorLy8gJ3NyYy9yZWZfc3RyaWRlJyBpcyB0aGUgYnl0ZSBkaXN0YW5jZSBiZXR3ZWVuIHJvd3MuCisvLyBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgZXJyb3IgKGJhZCBwYXJhbWV0ZXIsIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yLCAuLi4pLgorV0VCUF9FWFRFUk4gaW50IFdlYlBQbGFuZURpc3RvcnRpb24oY29uc3QgdWludDhfdCogc3JjLCBzaXplX3Qgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHJlZiwgc2l6ZV90IHJlZl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgeF9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUsICAgLy8gMCA9IFBTTlIsIDEgPSBTU0lNLCAyID0gTFNJTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGRpc3RvcnRpb24sIGZsb2F0KiByZXN1bHQpOworCisvLyBDb21wdXRlIFBTTlIsIFNTSU0gb3IgTFNJTSBkaXN0b3J0aW9uIG1ldHJpYyBiZXR3ZWVuIHR3byBwaWN0dXJlcy4gUmVzdWx0cworLy8gYXJlIGluIGRCLCBzdG9yZWQgaW4gcmVzdWx0W10gaW4gdGhlIEIvRy9SL0EvQWxsIG9yZGVyLiBUaGUgZGlzdG9ydGlvbiBpcworLy8gYWx3YXlzIHBlcmZvcm1lZCB1c2luZyBBUkdCIHNhbXBsZXMuIEhlbmNlIGlmIHRoZSBpbnB1dCBpcyBZVVYoQSksIHRoZQorLy8gcGljdHVyZSB3aWxsIGJlIGludGVybmFsbHkgY29udmVydGVkIHRvIEFSR0IgKGp1c3QgZm9yIHRoZSBtZWFzdXJlbWVudCkuCisvLyBXYXJuaW5nOiB0aGlzIGZ1bmN0aW9uIGlzIHJhdGhlciBDUFUtaW50ZW5zaXZlLgorV0VCUF9FWFRFUk4gaW50IFdlYlBQaWN0dXJlRGlzdG9ydGlvbigKKyAgICBjb25zdCBXZWJQUGljdHVyZSogc3JjLCBjb25zdCBXZWJQUGljdHVyZSogcmVmLAorICAgIGludCBtZXRyaWNfdHlwZSwgICAgICAgICAgIC8vIDAgPSBQU05SLCAxID0gU1NJTSwgMiA9IExTSU0KKyAgICBmbG9hdCByZXN1bHRbNV0pOworCisvLyBzZWxmLWNyb3BzIGEgcGljdHVyZSB0byB0aGUgcmVjdGFuZ2xlIGRlZmluZWQgYnkgdG9wL2xlZnQvd2lkdGgvaGVpZ2h0LgorLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yLCBvciBpZiB0aGUgcmVjdGFuZ2xlIGlzCisvLyBvdXRzaWRlIG9mIHRoZSBzb3VyY2UgcGljdHVyZS4KKy8vIFRoZSByZWN0YW5nbGUgZm9yIHRoZSB2aWV3IGlzIGRlZmluZWQgYnkgdGhlIHRvcC1sZWZ0IGNvcm5lciBwaXhlbAorLy8gY29vcmRpbmF0ZXMgKGxlZnQsIHRvcCkgYXMgd2VsbCBhcyBpdHMgd2lkdGggYW5kIGhlaWdodC4gVGhpcyByZWN0YW5nbGUKKy8vIG11c3QgYmUgZnVsbHkgYmUgY29tcHJpc2VkIGluc2lkZSB0aGUgJ3NyYycgc291cmNlIHBpY3R1cmUuIElmIHRoZSBzb3VyY2UKKy8vIHBpY3R1cmUgdXNlcyB0aGUgWVVWNDIwIGNvbG9yc3BhY2UsIHRoZSB0b3AgYW5kIGxlZnQgY29vcmRpbmF0ZXMgd2lsbCBiZQorLy8gc25hcHBlZCB0byBldmVuIHZhbHVlcy4KK1dFQlBfRVhURVJOIGludCBXZWJQUGljdHVyZUNyb3AoV2ViUFBpY3R1cmUqIHBpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworCisvLyBFeHRyYWN0cyBhIHZpZXcgZnJvbSAnc3JjJyBwaWN0dXJlIGludG8gJ2RzdCcuIFRoZSByZWN0YW5nbGUgZm9yIHRoZSB2aWV3CisvLyBpcyBkZWZpbmVkIGJ5IHRoZSB0b3AtbGVmdCBjb3JuZXIgcGl4ZWwgY29vcmRpbmF0ZXMgKGxlZnQsIHRvcCkgYXMgd2VsbAorLy8gYXMgaXRzIHdpZHRoIGFuZCBoZWlnaHQuIFRoaXMgcmVjdGFuZ2xlIG11c3QgYmUgZnVsbHkgYmUgY29tcHJpc2VkIGluc2lkZQorLy8gdGhlICdzcmMnIHNvdXJjZSBwaWN0dXJlLiBJZiB0aGUgc291cmNlIHBpY3R1cmUgdXNlcyB0aGUgWVVWNDIwIGNvbG9yc3BhY2UsCisvLyB0aGUgdG9wIGFuZCBsZWZ0IGNvb3JkaW5hdGVzIHdpbGwgYmUgc25hcHBlZCB0byBldmVuIHZhbHVlcy4KKy8vIFBpY3R1cmUgJ3NyYycgbXVzdCBvdXQtbGl2ZSAnZHN0JyBwaWN0dXJlLiBTZWxmLWV4dHJhY3Rpb24gb2YgdmlldyBpcyBhbGxvd2VkCisvLyAoJ3NyYycgZXF1YWwgdG8gJ2RzdCcpIGFzIGEgbWVhbiBvZiBmYXN0LWNyb3BwaW5nIChidXQgbm90ZSB0aGF0IGRvaW5nIHNvLAorLy8gdGhlIG9yaWdpbmFsIGRpbWVuc2lvbiB3aWxsIGJlIGxvc3QpLiBQaWN0dXJlICdkc3QnIG5lZWQgbm90IGJlIGluaXRpYWxpemVkCisvLyB3aXRoIFdlYlBQaWN0dXJlSW5pdCgpIGlmIGl0IGlzIGRpZmZlcmVudCBmcm9tICdzcmMnLCBzaW5jZSBpdHMgY29udGVudCB3aWxsCisvLyBiZSBvdmVyd3JpdHRlbi4KKy8vIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvciBvciBpbnZhbGlkIHBhcmFtZXRlcnMuCitXRUJQX0VYVEVSTiBpbnQgV2ViUFBpY3R1cmVWaWV3KGNvbnN0IFdlYlBQaWN0dXJlKiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBQaWN0dXJlKiBkc3QpOworCisvLyBSZXR1cm5zIHRydWUgaWYgdGhlICdwaWN0dXJlJyBpcyBhY3R1YWxseSBhIHZpZXcgYW5kIHRoZXJlZm9yZSBkb2VzCisvLyBub3Qgb3duIHRoZSBtZW1vcnkgZm9yIHBpeGVscy4KK1dFQlBfRVhURVJOIGludCBXZWJQUGljdHVyZUlzVmlldyhjb25zdCBXZWJQUGljdHVyZSogcGljdHVyZSk7CisKKy8vIFJlc2NhbGUgYSBwaWN0dXJlIHRvIG5ldyBkaW1lbnNpb24gd2lkdGggeCBoZWlnaHQuCisvLyBJZiBlaXRoZXIgJ3dpZHRoJyBvciAnaGVpZ2h0JyAoYnV0IG5vdCBib3RoKSBpcyAwIHRoZSBjb3JyZXNwb25kaW5nCisvLyBkaW1lbnNpb24gd2lsbCBiZSBjYWxjdWxhdGVkIHByZXNlcnZpbmcgdGhlIGFzcGVjdCByYXRpby4KKy8vIE5vIGdhbW1hIGNvcnJlY3Rpb24gaXMgYXBwbGllZC4KKy8vIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiBlcnJvciAoaW52YWxpZCBwYXJhbWV0ZXIgb3IgaW5zdWZmaWNpZW50IG1lbW9yeSkuCitXRUJQX0VYVEVSTiBpbnQgV2ViUFBpY3R1cmVSZXNjYWxlKFdlYlBQaWN0dXJlKiBwaWMsIGludCB3aWR0aCwgaW50IGhlaWdodCk7CisKKy8vIENvbG9yc3BhY2UgY29udmVyc2lvbiBmdW5jdGlvbiB0byBpbXBvcnQgUkdCIHNhbXBsZXMuCisvLyBQcmV2aW91cyBidWZmZXIgd2lsbCBiZSBmcmVlJ2QsIGlmIGFueS4KKy8vICpyZ2IgYnVmZmVyIHNob3VsZCBoYXZlIGEgc2l6ZSBvZiBhdCBsZWFzdCBoZWlnaHQgKiByZ2Jfc3RyaWRlLgorLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIG1lbW9yeSBlcnJvci4KK1dFQlBfRVhURVJOIGludCBXZWJQUGljdHVyZUltcG9ydFJHQigKKyAgICBXZWJQUGljdHVyZSogcGljdHVyZSwgY29uc3QgdWludDhfdCogcmdiLCBpbnQgcmdiX3N0cmlkZSk7CisvLyBTYW1lLCBidXQgZm9yIFJHQkEgYnVmZmVyLgorV0VCUF9FWFRFUk4gaW50IFdlYlBQaWN0dXJlSW1wb3J0UkdCQSgKKyAgICBXZWJQUGljdHVyZSogcGljdHVyZSwgY29uc3QgdWludDhfdCogcmdiYSwgaW50IHJnYmFfc3RyaWRlKTsKKy8vIFNhbWUsIGJ1dCBmb3IgUkdCQSBidWZmZXIuIEltcG9ydHMgdGhlIFJHQiBkaXJlY3QgZnJvbSB0aGUgMzItYml0IGZvcm1hdAorLy8gaW5wdXQgYnVmZmVyIGlnbm9yaW5nIHRoZSBhbHBoYSBjaGFubmVsLiBBdm9pZHMgbmVlZGluZyB0byBjb3B5IHRoZSBkYXRhCisvLyB0byBhIHRlbXBvcmFyeSAyNC1iaXQgUkdCIGJ1ZmZlciB0byBpbXBvcnQgdGhlIFJHQiBvbmx5LgorV0VCUF9FWFRFUk4gaW50IFdlYlBQaWN0dXJlSW1wb3J0UkdCWCgKKyAgICBXZWJQUGljdHVyZSogcGljdHVyZSwgY29uc3QgdWludDhfdCogcmdieCwgaW50IHJnYnhfc3RyaWRlKTsKKworLy8gVmFyaWFudHMgb2YgdGhlIGFib3ZlLCBidXQgdGFraW5nIEJHUihBfFgpIGlucHV0LgorV0VCUF9FWFRFUk4gaW50IFdlYlBQaWN0dXJlSW1wb3J0QkdSKAorICAgIFdlYlBQaWN0dXJlKiBwaWN0dXJlLCBjb25zdCB1aW50OF90KiBiZ3IsIGludCBiZ3Jfc3RyaWRlKTsKK1dFQlBfRVhURVJOIGludCBXZWJQUGljdHVyZUltcG9ydEJHUkEoCisgICAgV2ViUFBpY3R1cmUqIHBpY3R1cmUsIGNvbnN0IHVpbnQ4X3QqIGJncmEsIGludCBiZ3JhX3N0cmlkZSk7CitXRUJQX0VYVEVSTiBpbnQgV2ViUFBpY3R1cmVJbXBvcnRCR1JYKAorICAgIFdlYlBQaWN0dXJlKiBwaWN0dXJlLCBjb25zdCB1aW50OF90KiBiZ3J4LCBpbnQgYmdyeF9zdHJpZGUpOworCisvLyBDb252ZXJ0cyBwaWN0dXJlLT5hcmdiIGRhdGEgdG8gdGhlIFlVVjQyMEEgZm9ybWF0LiBUaGUgJ2NvbG9yc3BhY2UnCisvLyBwYXJhbWV0ZXIgaXMgZGVwcmVjYXRlZCBhbmQgc2hvdWxkIGJlIGVxdWFsIHRvIFdFQlBfWVVWNDIwLgorLy8gVXBvbiByZXR1cm4sIHBpY3R1cmUtPnVzZV9hcmdiIGlzIHNldCB0byBmYWxzZS4gVGhlIHByZXNlbmNlIG9mIHJlYWwKKy8vIG5vbi1vcGFxdWUgdHJhbnNwYXJlbnQgdmFsdWVzIGlzIGRldGVjdGVkLCBhbmQgJ2NvbG9yc3BhY2UnIHdpbGwgYmUKKy8vIGFkanVzdGVkIGFjY29yZGluZ2x5LiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgaXMgbG9zc3kuCisvLyBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgZXJyb3IuCitXRUJQX0VYVEVSTiBpbnQgV2ViUFBpY3R1cmVBUkdCVG9ZVVZBKFdlYlBQaWN0dXJlKiBwaWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQRW5jQ1NQIC8qY29sb3JzcGFjZSA9IFdFQlBfWVVWNDIwKi8pOworCisvLyBTYW1lIGFzIFdlYlBQaWN0dXJlQVJHQlRvWVVWQSgpLCBidXQgdGhlIGNvbnZlcnNpb24gaXMgZG9uZSB1c2luZworLy8gcHNldWRvLXJhbmRvbSBkaXRoZXJpbmcgd2l0aCBhIHN0cmVuZ3RoICdkaXRoZXJpbmcnIGJldHdlZW4KKy8vIDAuMCAobm8gZGl0aGVyaW5nKSBhbmQgMS4wIChtYXhpbXVtIGRpdGhlcmluZykuIFRoaXMgaXMgdXNlZnVsCisvLyBmb3IgcGhvdG9ncmFwaGljIHBpY3R1cmUuCitXRUJQX0VYVEVSTiBpbnQgV2ViUFBpY3R1cmVBUkdCVG9ZVVZBRGl0aGVyZWQoCisgICAgV2ViUFBpY3R1cmUqIHBpY3R1cmUsIFdlYlBFbmNDU1AgY29sb3JzcGFjZSwgZmxvYXQgZGl0aGVyaW5nKTsKKworLy8gUGVyZm9ybXMgJ3NoYXJwJyBSR0JBLT5ZVVZBNDIwIGRvd25zYW1wbGluZyBhbmQgY29sb3JzcGFjZSBjb252ZXJzaW9uLgorLy8gRG93bnNhbXBsaW5nIGlzIGhhbmRsZWQgd2l0aCBleHRyYSBjYXJlIGluIGNhc2Ugb2YgY29sb3IgY2xpcHBpbmcuIFRoaXMKKy8vIG1ldGhvZCBpcyByb3VnaGx5IDJ4IHNsb3dlciB0aGFuIFdlYlBQaWN0dXJlQVJHQlRvWVVWQSgpIGJ1dCBwcm9kdWNlcyBiZXR0ZXIKKy8vIGFuZCBzaGFycGVyIFlVViByZXByZXNlbnRhdGlvbi4KKy8vIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiBlcnJvci4KK1dFQlBfRVhURVJOIGludCBXZWJQUGljdHVyZVNoYXJwQVJHQlRvWVVWQShXZWJQUGljdHVyZSogcGljdHVyZSk7CisvLyBrZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OgorV0VCUF9FWFRFUk4gaW50IFdlYlBQaWN0dXJlU21hcnRBUkdCVG9ZVVZBKFdlYlBQaWN0dXJlKiBwaWN0dXJlKTsKKworLy8gQ29udmVydHMgcGljdHVyZS0+eXV2IHRvIHBpY3R1cmUtPmFyZ2IgYW5kIHNldHMgcGljdHVyZS0+dXNlX2FyZ2IgdG8gdHJ1ZS4KKy8vIFRoZSBpbnB1dCBmb3JtYXQgbXVzdCBiZSBZVVZfNDIwIG9yIFlVVl80MjBBLiBUaGUgY29udmVyc2lvbiBmcm9tIFlVVjQyMCB0bworLy8gQVJHQiBpbmN1cnMgYSBzbWFsbCBsb3NzIHRvby4KKy8vIE5vdGUgdGhhdCB0aGUgdXNlIG9mIHRoaXMgY29sb3JzcGFjZSBpcyBkaXNjb3VyYWdlZCBpZiBvbmUgaGFzIGFjY2VzcyB0byB0aGUKKy8vIHJhdyBBUkdCIHNhbXBsZXMsIHNpbmNlIHVzaW5nIFlVVjQyMCBpcyBjb21wYXJhdGl2ZWx5IGxvc3N5LgorLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIGVycm9yLgorV0VCUF9FWFRFUk4gaW50IFdlYlBQaWN0dXJlWVVWQVRvQVJHQihXZWJQUGljdHVyZSogcGljdHVyZSk7CisKKy8vIEhlbHBlciBmdW5jdGlvbjogZ2l2ZW4gYSB3aWR0aCB4IGhlaWdodCBwbGFuZSBvZiBSR0JBIG9yIFlVVihBKSBzYW1wbGVzCisvLyBjbGVhbi11cCBvciBzbW9vdGhlbiB0aGUgWVVWIG9yIFJHQiBzYW1wbGVzIHVuZGVyIGZ1bGx5IHRyYW5zcGFyZW50IGFyZWEsCisvLyB0byBoZWxwIGNvbXByZXNzaWJpbGl0eSAobm8gZ3VhcmFudGVlLCB0aG91Z2gpLgorV0VCUF9FWFRFUk4gdm9pZCBXZWJQQ2xlYW51cFRyYW5zcGFyZW50QXJlYShXZWJQUGljdHVyZSogcGljdHVyZSk7CisKKy8vIFNjYW4gdGhlIHBpY3R1cmUgJ3BpY3R1cmUnIGZvciB0aGUgcHJlc2VuY2Ugb2Ygbm9uIGZ1bGx5IG9wYXF1ZSBhbHBoYSB2YWx1ZXMuCisvLyBSZXR1cm5zIHRydWUgaW4gc3VjaCBjYXNlLiBPdGhlcndpc2UgcmV0dXJucyBmYWxzZSAoaW5kaWNhdGluZyB0aGF0IHRoZQorLy8gYWxwaGEgcGxhbmUgY2FuIGJlIGlnbm9yZWQgYWx0b2dldGhlciBlLmcuKS4KK1dFQlBfRVhURVJOIGludCBXZWJQUGljdHVyZUhhc1RyYW5zcGFyZW5jeShjb25zdCBXZWJQUGljdHVyZSogcGljdHVyZSk7CisKKy8vIFJlbW92ZSB0aGUgdHJhbnNwYXJlbmN5IGluZm9ybWF0aW9uIChpZiBwcmVzZW50KSBieSBibGVuZGluZyB0aGUgY29sb3Igd2l0aAorLy8gdGhlIGJhY2tncm91bmQgY29sb3IgJ2JhY2tncm91bmRfcmdiJyAoc3BlY2lmaWVkIGFzIDI0Yml0IFJHQiB0cmlwbGV0KS4KKy8vIEFmdGVyIHRoaXMgY2FsbCwgYWxsIGFscGhhIHZhbHVlcyBhcmUgcmVzZXQgdG8gMHhmZi4KK1dFQlBfRVhURVJOIHZvaWQgV2ViUEJsZW5kQWxwaGEoV2ViUFBpY3R1cmUqIHBpYywgdWludDMyX3QgYmFja2dyb3VuZF9yZ2IpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWFpbiBjYWxsCisKKy8vIE1haW4gZW5jb2RpbmcgY2FsbCwgYWZ0ZXIgY29uZmlnIGFuZCBwaWN0dXJlIGhhdmUgYmVlbiBpbml0aWFsaXplZC4KKy8vICdwaWN0dXJlJyBtdXN0IGJlIGxlc3MgdGhhbiAxNjM4NHgxNjM4NCBpbiBkaW1lbnNpb24gKGNmIFdFQlBfTUFYX0RJTUVOU0lPTiksCisvLyBhbmQgdGhlICdjb25maWcnIG9iamVjdCBtdXN0IGJlIGEgdmFsaWQgb25lLgorLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIGVycm9yLCB0cnVlIG90aGVyd2lzZS4KKy8vIEluIGNhc2Ugb2YgZXJyb3IsIHBpY3R1cmUtPmVycm9yX2NvZGUgaXMgdXBkYXRlZCBhY2NvcmRpbmdseS4KKy8vICdwaWN0dXJlJyBjYW4gaG9sZCB0aGUgc291cmNlIHNhbXBsZXMgaW4gYm90aCBZVVYoQSkgb3IgQVJHQiBpbnB1dCwgZGVwZW5kaW5nCisvLyBvbiB0aGUgdmFsdWUgb2YgJ3BpY3R1cmUtPnVzZV9hcmdiJy4gSXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRvIHVzZQorLy8gdGhlIGZvcm1lciBmb3IgbG9zc3kgZW5jb2RpbmcsIGFuZCB0aGUgbGF0dGVyIGZvciBsb3NzbGVzcyBlbmNvZGluZworLy8gKHdoZW4gY29uZmlnLmxvc3NsZXNzIGlzIHRydWUpLiBBdXRvbWF0aWMgY29udmVyc2lvbiBmcm9tIG9uZSBmb3JtYXQgdG8KKy8vIGFub3RoZXIgaXMgcHJvdmlkZWQgYnV0IHRoZXkgYm90aCBpbmN1ciBzb21lIGxvc3MuCitXRUJQX0VYVEVSTiBpbnQgV2ViUEVuY29kZShjb25zdCBXZWJQQ29uZmlnKiBjb25maWcsIFdlYlBQaWN0dXJlKiBwaWN0dXJlKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8qIFdFQlBfV0VCUF9FTkNPREVfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy93ZWJwL2Zvcm1hdF9jb25zdGFudHMuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy93ZWJwL2Zvcm1hdF9jb25zdGFudHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjlmYzhhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3dlYnAvZm9ybWF0X2NvbnN0YW50cy5oCkBAIC0wLDAgKzEsODcgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgSW50ZXJuYWwgaGVhZGVyIGZvciBjb25zdGFudHMgcmVsYXRlZCB0byBXZWJQIGZpbGUgZm9ybWF0LgorLy8KKy8vIEF1dGhvcjogVXJ2YW5nICh1cnZhbmdAZ29vZ2xlLmNvbSkKKworI2lmbmRlZiBXRUJQX1dFQlBfRk9STUFUX0NPTlNUQU5UU19IXworI2RlZmluZSBXRUJQX1dFQlBfRk9STUFUX0NPTlNUQU5UU19IXworCisvLyBDcmVhdGUgZm91cmNjIG9mIHRoZSBjaHVuayBmcm9tIHRoZSBjaHVuayB0YWcgY2hhcmFjdGVycy4KKyNkZWZpbmUgTUtGT1VSQ0MoYSwgYiwgYywgZCkgKChhKSB8IChiKSA8PCA4IHwgKGMpIDw8IDE2IHwgKHVpbnQzMl90KShkKSA8PCAyNCkKKworLy8gVlA4IHJlbGF0ZWQgY29uc3RhbnRzLgorI2RlZmluZSBWUDhfU0lHTkFUVVJFIDB4OWQwMTJhICAgICAgICAgICAgICAvLyBTaWduYXR1cmUgaW4gVlA4IGRhdGEuCisjZGVmaW5lIFZQOF9NQVhfUEFSVElUSU9OMF9TSVpFICgxIDw8IDE5KSAgIC8vIG1heCBzaXplIG9mIG1vZGUgcGFydGl0aW9uCisjZGVmaW5lIFZQOF9NQVhfUEFSVElUSU9OX1NJWkUgICgxIDw8IDI0KSAgIC8vIG1heCBzaXplIGZvciB0b2tlbiBwYXJ0aXRpb24KKyNkZWZpbmUgVlA4X0ZSQU1FX0hFQURFUl9TSVpFIDEwICAvLyBTaXplIG9mIHRoZSBmcmFtZSBoZWFkZXIgd2l0aGluIFZQOCBkYXRhLgorCisvLyBWUDhMIHJlbGF0ZWQgY29uc3RhbnRzLgorI2RlZmluZSBWUDhMX1NJR05BVFVSRV9TSVpFICAgICAgICAgIDEgICAgICAvLyBWUDhMIHNpZ25hdHVyZSBzaXplLgorI2RlZmluZSBWUDhMX01BR0lDX0JZVEUgICAgICAgICAgICAgIDB4MmYgICAvLyBWUDhMIHNpZ25hdHVyZSBieXRlLgorI2RlZmluZSBWUDhMX0lNQUdFX1NJWkVfQklUUyAgICAgICAgIDE0ICAgICAvLyBOdW1iZXIgb2YgYml0cyB1c2VkIHRvIHN0b3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpZHRoIGFuZCBoZWlnaHQuCisjZGVmaW5lIFZQOExfVkVSU0lPTl9CSVRTICAgICAgICAgICAgMyAgICAgIC8vIDMgYml0cyByZXNlcnZlZCBmb3IgdmVyc2lvbi4KKyNkZWZpbmUgVlA4TF9WRVJTSU9OICAgICAgICAgICAgICAgICAwICAgICAgLy8gdmVyc2lvbiAwCisjZGVmaW5lIFZQOExfRlJBTUVfSEVBREVSX1NJWkUgICAgICAgNSAgICAgIC8vIFNpemUgb2YgdGhlIFZQOEwgZnJhbWUgaGVhZGVyLgorCisjZGVmaW5lIE1BWF9QQUxFVFRFX1NJWkUgICAgICAgICAgICAgMjU2CisjZGVmaW5lIE1BWF9DQUNIRV9CSVRTICAgICAgICAgICAgICAgMTEKKyNkZWZpbmUgSFVGRk1BTl9DT0RFU19QRVJfTUVUQV9DT0RFICA1CisjZGVmaW5lIEFSR0JfQkxBQ0sgICAgICAgICAgICAgICAgICAgMHhmZjAwMDAwMAorCisjZGVmaW5lIERFRkFVTFRfQ09ERV9MRU5HVEggICAgICAgICAgOAorI2RlZmluZSBNQVhfQUxMT1dFRF9DT0RFX0xFTkdUSCAgICAgIDE1CisKKyNkZWZpbmUgTlVNX0xJVEVSQUxfQ09ERVMgICAgICAgICAgICAyNTYKKyNkZWZpbmUgTlVNX0xFTkdUSF9DT0RFUyAgICAgICAgICAgICAyNAorI2RlZmluZSBOVU1fRElTVEFOQ0VfQ09ERVMgICAgICAgICAgIDQwCisjZGVmaW5lIENPREVfTEVOR1RIX0NPREVTICAgICAgICAgICAgMTkKKworI2RlZmluZSBNSU5fSFVGRk1BTl9CSVRTICAgICAgICAgICAgIDIgIC8vIG1pbiBudW1iZXIgb2YgSHVmZm1hbiBiaXRzCisjZGVmaW5lIE1BWF9IVUZGTUFOX0JJVFMgICAgICAgICAgICAgOSAgLy8gbWF4IG51bWJlciBvZiBIdWZmbWFuIGJpdHMKKworI2RlZmluZSBUUkFOU0ZPUk1fUFJFU0VOVCAgICAgICAgICAgIDEgIC8vIFRoZSBiaXQgdG8gYmUgd3JpdHRlbiB3aGVuIG5leHQgZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGJlIHJlYWQgaXMgYSB0cmFuc2Zvcm0uCisjZGVmaW5lIE5VTV9UUkFOU0ZPUk1TICAgICAgICAgICAgICAgNCAgLy8gTWF4aW11bSBudW1iZXIgb2YgYWxsb3dlZCB0cmFuc2Zvcm0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBhIGJpdHN0cmVhbS4KK3R5cGVkZWYgZW51bSB7CisgIFBSRURJQ1RPUl9UUkFOU0ZPUk0gICAgICA9IDAsCisgIENST1NTX0NPTE9SX1RSQU5TRk9STSAgICA9IDEsCisgIFNVQlRSQUNUX0dSRUVOICAgICAgICAgICA9IDIsCisgIENPTE9SX0lOREVYSU5HX1RSQU5TRk9STSA9IDMKK30gVlA4TEltYWdlVHJhbnNmb3JtVHlwZTsKKworLy8gQWxwaGEgcmVsYXRlZCBjb25zdGFudHMuCisjZGVmaW5lIEFMUEhBX0hFQURFUl9MRU4gICAgICAgICAgICAxCisjZGVmaW5lIEFMUEhBX05PX0NPTVBSRVNTSU9OICAgICAgICAwCisjZGVmaW5lIEFMUEhBX0xPU1NMRVNTX0NPTVBSRVNTSU9OICAxCisjZGVmaW5lIEFMUEhBX1BSRVBST0NFU1NFRF9MRVZFTFMgICAxCisKKy8vIE11eCByZWxhdGVkIGNvbnN0YW50cy4KKyNkZWZpbmUgVEFHX1NJWkUgICAgICAgICAgIDQgICAgIC8vIFNpemUgb2YgYSBjaHVuayB0YWcgKGUuZy4gIlZQOEwiKS4KKyNkZWZpbmUgQ0hVTktfU0laRV9CWVRFUyAgIDQgICAgIC8vIFNpemUgbmVlZGVkIHRvIHN0b3JlIGNodW5rJ3Mgc2l6ZS4KKyNkZWZpbmUgQ0hVTktfSEVBREVSX1NJWkUgIDggICAgIC8vIFNpemUgb2YgYSBjaHVuayBoZWFkZXIuCisjZGVmaW5lIFJJRkZfSEVBREVSX1NJWkUgICAxMiAgICAvLyBTaXplIG9mIHRoZSBSSUZGIGhlYWRlciAoIlJJRkZubm5uV0VCUCIpLgorI2RlZmluZSBBTk1GX0NIVU5LX1NJWkUgICAgMTYgICAgLy8gU2l6ZSBvZiBhbiBBTk1GIGNodW5rLgorI2RlZmluZSBBTklNX0NIVU5LX1NJWkUgICAgNiAgICAgLy8gU2l6ZSBvZiBhbiBBTklNIGNodW5rLgorI2RlZmluZSBWUDhYX0NIVU5LX1NJWkUgICAgMTAgICAgLy8gU2l6ZSBvZiBhIFZQOFggY2h1bmsuCisKKyNkZWZpbmUgTUFYX0NBTlZBU19TSVpFICAgICAoMSA8PCAyNCkgICAgIC8vIDI0LWJpdCBtYXggZm9yIFZQOFggd2lkdGgvaGVpZ2h0LgorI2RlZmluZSBNQVhfSU1BR0VfQVJFQSAgICAgICgxVUxMIDw8IDMyKSAgLy8gMzItYml0IG1heCBmb3Igd2lkdGggeCBoZWlnaHQuCisjZGVmaW5lIE1BWF9MT09QX0NPVU5UICAgICAgKDEgPDwgMTYpICAgICAvLyBtYXhpbXVtIHZhbHVlIGZvciBsb29wLWNvdW50CisjZGVmaW5lIE1BWF9EVVJBVElPTiAgICAgICAgKDEgPDwgMjQpICAgICAvLyBtYXhpbXVtIGR1cmF0aW9uCisjZGVmaW5lIE1BWF9QT1NJVElPTl9PRkZTRVQgKDEgPDwgMjQpICAgICAvLyBtYXhpbXVtIGZyYW1lIHgveSBvZmZzZXQKKworLy8gTWF4aW11bSBjaHVuayBwYXlsb2FkIGlzIHN1Y2ggdGhhdCBhZGRpbmcgdGhlIGhlYWRlciBhbmQgcGFkZGluZyB3b24ndAorLy8gb3ZlcmZsb3cgYSB1aW50MzJfdC4KKyNkZWZpbmUgTUFYX0NIVU5LX1BBWUxPQUQgKH4wVSAtIENIVU5LX0hFQURFUl9TSVpFIC0gMSkKKworI2VuZGlmICAvKiBXRUJQX1dFQlBfRk9STUFUX0NPTlNUQU5UU19IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3dlYnAvbXV4LmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvd2VicC9tdXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGJiNGE0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3dlYnAvbXV4LmgKQEAgLTAsMCArMSw1MzAgQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgUklGRiBjb250YWluZXIgbWFuaXB1bGF0aW9uIGFuZCBlbmNvZGluZyBmb3IgV2ViUCBpbWFnZXMuCisvLworLy8gQXV0aG9yczogVXJ2YW5nICh1cnZhbmdAZ29vZ2xlLmNvbSkKKy8vICAgICAgICAgIFZpa2FzICh2aWthc2FAZ29vZ2xlLmNvbSkKKworI2lmbmRlZiBXRUJQX1dFQlBfTVVYX0hfCisjZGVmaW5lIFdFQlBfV0VCUF9NVVhfSF8KKworI2luY2x1ZGUgIi4vbXV4X3R5cGVzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBXRUJQX01VWF9BQklfVkVSU0lPTiAweDAxMDggICAgICAgIC8vIE1BSk9SKDhiKSArIE1JTk9SKDhiKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTXV4IEFQSQorLy8KKy8vIFRoaXMgQVBJIGFsbG93cyBtYW5pcHVsYXRpb24gb2YgV2ViUCBjb250YWluZXIgaW1hZ2VzIGNvbnRhaW5pbmcgZmVhdHVyZXMKKy8vIGxpa2UgY29sb3IgcHJvZmlsZSwgbWV0YWRhdGEsIGFuaW1hdGlvbi4KKy8vCisvLyBDb2RlIEV4YW1wbGUjMTogQ3JlYXRlIGEgV2ViUE11eCBvYmplY3Qgd2l0aCBpbWFnZSBkYXRhLCBjb2xvciBwcm9maWxlIGFuZAorLy8gWE1QIG1ldGFkYXRhLgorLyoKKyAgaW50IGNvcHlfZGF0YSA9IDA7CisgIFdlYlBNdXgqIG11eCA9IFdlYlBNdXhOZXcoKTsKKyAgLy8gLi4uIChQcmVwYXJlIGltYWdlIGRhdGEpLgorICBXZWJQTXV4U2V0SW1hZ2UobXV4LCAmaW1hZ2UsIGNvcHlfZGF0YSk7CisgIC8vIC4uLiAoUHJlcGFyZSBJQ0NQIGNvbG9yIHByb2ZpbGUgZGF0YSkuCisgIFdlYlBNdXhTZXRDaHVuayhtdXgsICJJQ0NQIiwgJmljY19wcm9maWxlLCBjb3B5X2RhdGEpOworICAvLyAuLi4gKFByZXBhcmUgWE1QIG1ldGFkYXRhKS4KKyAgV2ViUE11eFNldENodW5rKG11eCwgIlhNUCAiLCAmeG1wLCBjb3B5X2RhdGEpOworICAvLyBHZXQgZGF0YSBmcm9tIG11eCBpbiBXZWJQIFJJRkYgZm9ybWF0LgorICBXZWJQTXV4QXNzZW1ibGUobXV4LCAmb3V0cHV0X2RhdGEpOworICBXZWJQTXV4RGVsZXRlKG11eCk7CisgIC8vIC4uLiAoQ29uc3VtZSBvdXRwdXRfZGF0YTsgZS5nLiB3cml0ZSBvdXRwdXRfZGF0YS5ieXRlcyB0byBmaWxlKS4KKyAgV2ViUERhdGFDbGVhcigmb3V0cHV0X2RhdGEpOworKi8KKworLy8gQ29kZSBFeGFtcGxlIzI6IEdldCBpbWFnZSBhbmQgY29sb3IgcHJvZmlsZSBkYXRhIGZyb20gYSBXZWJQIGZpbGUuCisvKgorICBpbnQgY29weV9kYXRhID0gMDsKKyAgLy8gLi4uIChSZWFkIGRhdGEgZnJvbSBmaWxlKS4KKyAgV2ViUE11eCogbXV4ID0gV2ViUE11eENyZWF0ZSgmZGF0YSwgY29weV9kYXRhKTsKKyAgV2ViUE11eEdldEZyYW1lKG11eCwgMSwgJmltYWdlKTsKKyAgLy8gLi4uIChDb25zdW1lIGltYWdlOyBlLmcuIGNhbGwgV2ViUERlY29kZSgpIHRvIGRlY29kZSB0aGUgZGF0YSkuCisgIFdlYlBNdXhHZXRDaHVuayhtdXgsICJJQ0NQIiwgJmljY19wcm9maWxlKTsKKyAgLy8gLi4uIChDb25zdW1lIGljY19kYXRhKS4KKyAgV2ViUE11eERlbGV0ZShtdXgpOworICBmcmVlKGRhdGEpOworKi8KKworLy8gTm90ZTogZm9yd2FyZCBkZWNsYXJpbmcgZW51bWVyYXRpb25zIGlzIG5vdCBhbGxvd2VkIGluIChzdHJpY3QpIEMgYW5kIEMrKywKKy8vIHRoZSB0eXBlcyBhcmUgbGVmdCBoZXJlIGZvciByZWZlcmVuY2UuCisvLyB0eXBlZGVmIGVudW0gV2ViUE11eEVycm9yIFdlYlBNdXhFcnJvcjsKKy8vIHR5cGVkZWYgZW51bSBXZWJQQ2h1bmtJZCBXZWJQQ2h1bmtJZDsKK3R5cGVkZWYgc3RydWN0IFdlYlBNdXggV2ViUE11eDsgICAvLyBtYWluIG9wYXF1ZSBvYmplY3QuCit0eXBlZGVmIHN0cnVjdCBXZWJQTXV4RnJhbWVJbmZvIFdlYlBNdXhGcmFtZUluZm87Cit0eXBlZGVmIHN0cnVjdCBXZWJQTXV4QW5pbVBhcmFtcyBXZWJQTXV4QW5pbVBhcmFtczsKK3R5cGVkZWYgc3RydWN0IFdlYlBBbmltRW5jb2Rlck9wdGlvbnMgV2ViUEFuaW1FbmNvZGVyT3B0aW9uczsKKworLy8gRXJyb3IgY29kZXMKK3R5cGVkZWYgZW51bSBXZWJQTXV4RXJyb3IgeworICBXRUJQX01VWF9PSyAgICAgICAgICAgICAgICAgPSAgMSwKKyAgV0VCUF9NVVhfTk9UX0ZPVU5EICAgICAgICAgID0gIDAsCisgIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQgICA9IC0xLAorICBXRUJQX01VWF9CQURfREFUQSAgICAgICAgICAgPSAtMiwKKyAgV0VCUF9NVVhfTUVNT1JZX0VSUk9SICAgICAgID0gLTMsCisgIFdFQlBfTVVYX05PVF9FTk9VR0hfREFUQSAgICA9IC00Cit9IFdlYlBNdXhFcnJvcjsKKworLy8gSURzIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgY2h1bmtzLgordHlwZWRlZiBlbnVtIFdlYlBDaHVua0lkIHsKKyAgV0VCUF9DSFVOS19WUDhYLCAgICAgICAgLy8gVlA4WAorICBXRUJQX0NIVU5LX0lDQ1AsICAgICAgICAvLyBJQ0NQCisgIFdFQlBfQ0hVTktfQU5JTSwgICAgICAgIC8vIEFOSU0KKyAgV0VCUF9DSFVOS19BTk1GLCAgICAgICAgLy8gQU5NRgorICBXRUJQX0NIVU5LX0RFUFJFQ0FURUQsICAvLyAoZGVwcmVjYXRlZCBmcm9tIEZSR00pCisgIFdFQlBfQ0hVTktfQUxQSEEsICAgICAgIC8vIEFMUEgKKyAgV0VCUF9DSFVOS19JTUFHRSwgICAgICAgLy8gVlA4L1ZQOEwKKyAgV0VCUF9DSFVOS19FWElGLCAgICAgICAgLy8gRVhJRgorICBXRUJQX0NIVU5LX1hNUCwgICAgICAgICAvLyBYTVAKKyAgV0VCUF9DSFVOS19VTktOT1dOLCAgICAgLy8gT3RoZXIgY2h1bmtzLgorICBXRUJQX0NIVU5LX05JTAorfSBXZWJQQ2h1bmtJZDsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gUmV0dXJucyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIG11eCBsaWJyYXJ5LCBwYWNrZWQgaW4gaGV4YWRlY2ltYWwgdXNpbmcKKy8vIDhiaXRzIGZvciBlYWNoIG9mIG1ham9yL21pbm9yL3JldmlzaW9uLiBFLmc6IHYyLjUuNyBpcyAweDAyMDUwNy4KK1dFQlBfRVhURVJOIGludCBXZWJQR2V0TXV4VmVyc2lvbih2b2lkKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIExpZmUgb2YgYSBNdXggb2JqZWN0CisKKy8vIEludGVybmFsLCB2ZXJzaW9uLWNoZWNrZWQsIGVudHJ5IHBvaW50CitXRUJQX0VYVEVSTiBXZWJQTXV4KiBXZWJQTmV3SW50ZXJuYWwoaW50KTsKKworLy8gQ3JlYXRlcyBhbiBlbXB0eSBtdXggb2JqZWN0LgorLy8gUmV0dXJuczoKKy8vICAgQSBwb2ludGVyIHRvIHRoZSBuZXdseSBjcmVhdGVkIGVtcHR5IG11eCBvYmplY3QuCisvLyAgIE9yIE5VTEwgaW4gY2FzZSBvZiBtZW1vcnkgZXJyb3IuCitzdGF0aWMgV0VCUF9JTkxJTkUgV2ViUE11eCogV2ViUE11eE5ldyh2b2lkKSB7CisgIHJldHVybiBXZWJQTmV3SW50ZXJuYWwoV0VCUF9NVVhfQUJJX1ZFUlNJT04pOworfQorCisvLyBEZWxldGVzIHRoZSBtdXggb2JqZWN0LgorLy8gUGFyYW1ldGVyczoKKy8vICAgbXV4IC0gKGluL291dCkgb2JqZWN0IHRvIGJlIGRlbGV0ZWQKK1dFQlBfRVhURVJOIHZvaWQgV2ViUE11eERlbGV0ZShXZWJQTXV4KiBtdXgpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTXV4IGNyZWF0aW9uLgorCisvLyBJbnRlcm5hbCwgdmVyc2lvbi1jaGVja2VkLCBlbnRyeSBwb2ludAorV0VCUF9FWFRFUk4gV2ViUE11eCogV2ViUE11eENyZWF0ZUludGVybmFsKGNvbnN0IFdlYlBEYXRhKiwgaW50LCBpbnQpOworCisvLyBDcmVhdGVzIGEgbXV4IG9iamVjdCBmcm9tIHJhdyBkYXRhIGdpdmVuIGluIFdlYlAgUklGRiBmb3JtYXQuCisvLyBQYXJhbWV0ZXJzOgorLy8gICBiaXRzdHJlYW0gLSAoaW4pIHRoZSBiaXRzdHJlYW0gZGF0YSBpbiBXZWJQIFJJRkYgZm9ybWF0CisvLyAgIGNvcHlfZGF0YSAtIChpbikgdmFsdWUgMSBpbmRpY2F0ZXMgZ2l2ZW4gZGF0YSBXSUxMIGJlIGNvcGllZCB0byB0aGUgbXV4CisvLyAgICAgICAgICAgICAgIG9iamVjdCBhbmQgdmFsdWUgMCBpbmRpY2F0ZXMgZGF0YSB3aWxsIE5PVCBiZSBjb3BpZWQuCisvLyBSZXR1cm5zOgorLy8gICBBIHBvaW50ZXIgdG8gdGhlIG11eCBvYmplY3QgY3JlYXRlZCBmcm9tIGdpdmVuIGRhdGEgLSBvbiBzdWNjZXNzLgorLy8gICBOVUxMIC0gSW4gY2FzZSBvZiBpbnZhbGlkIGRhdGEgb3IgbWVtb3J5IGVycm9yLgorc3RhdGljIFdFQlBfSU5MSU5FIFdlYlBNdXgqIFdlYlBNdXhDcmVhdGUoY29uc3QgV2ViUERhdGEqIGJpdHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3B5X2RhdGEpIHsKKyAgcmV0dXJuIFdlYlBNdXhDcmVhdGVJbnRlcm5hbChiaXRzdHJlYW0sIGNvcHlfZGF0YSwgV0VCUF9NVVhfQUJJX1ZFUlNJT04pOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTm9uLWltYWdlIGNodW5rcy4KKworLy8gTm90ZTogT25seSBub24taW1hZ2UgcmVsYXRlZCBjaHVua3Mgc2hvdWxkIGJlIG1hbmFnZWQgdGhyb3VnaCBjaHVuayBBUElzLgorLy8gKEltYWdlIHJlbGF0ZWQgY2h1bmtzIGFyZTogIkFOTUYiLCAiVlA4ICIsICJWUDhMIiBhbmQgIkFMUEgiKS4KKy8vIFRvIGFkZCwgZ2V0IGFuZCBkZWxldGUgaW1hZ2VzLCB1c2UgV2ViUE11eFNldEltYWdlKCksIFdlYlBNdXhQdXNoRnJhbWUoKSwKKy8vIFdlYlBNdXhHZXRGcmFtZSgpIGFuZCBXZWJQTXV4RGVsZXRlRnJhbWUoKS4KKworLy8gQWRkcyBhIGNodW5rIHdpdGggaWQgJ2ZvdXJjYycgYW5kIGRhdGEgJ2NodW5rX2RhdGEnIGluIHRoZSBtdXggb2JqZWN0LgorLy8gQW55IGV4aXN0aW5nIGNodW5rKHMpIHdpdGggdGhlIHNhbWUgaWQgd2lsbCBiZSByZW1vdmVkLgorLy8gUGFyYW1ldGVyczoKKy8vICAgbXV4IC0gKGluL291dCkgb2JqZWN0IHRvIHdoaWNoIHRoZSBjaHVuayBpcyB0byBiZSBhZGRlZAorLy8gICBmb3VyY2MgLSAoaW4pIGEgY2hhcmFjdGVyIGFycmF5IGNvbnRhaW5pbmcgdGhlIGZvdXJjYyBvZiB0aGUgZ2l2ZW4gY2h1bms7CisvLyAgICAgICAgICAgICAgICAgZS5nLiwgIklDQ1AiLCAiWE1QICIsICJFWElGIiBldGMuCisvLyAgIGNodW5rX2RhdGEgLSAoaW4pIHRoZSBjaHVuayBkYXRhIHRvIGJlIGFkZGVkCisvLyAgIGNvcHlfZGF0YSAtIChpbikgdmFsdWUgMSBpbmRpY2F0ZXMgZ2l2ZW4gZGF0YSBXSUxMIGJlIGNvcGllZCB0byB0aGUgbXV4CisvLyAgICAgICAgICAgICAgIG9iamVjdCBhbmQgdmFsdWUgMCBpbmRpY2F0ZXMgZGF0YSB3aWxsIE5PVCBiZSBjb3BpZWQuCisvLyBSZXR1cm5zOgorLy8gICBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UIC0gaWYgbXV4LCBmb3VyY2Mgb3IgY2h1bmtfZGF0YSBpcyBOVUxMCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBpZiBmb3VyY2MgY29ycmVzcG9uZHMgdG8gYW4gaW1hZ2UgY2h1bmsuCisvLyAgIFdFQlBfTVVYX01FTU9SWV9FUlJPUiAtIG9uIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yLgorLy8gICBXRUJQX01VWF9PSyAtIG9uIHN1Y2Nlc3MuCitXRUJQX0VYVEVSTiBXZWJQTXV4RXJyb3IgV2ViUE11eFNldENodW5rKAorICAgIFdlYlBNdXgqIG11eCwgY29uc3QgY2hhciBmb3VyY2NbNF0sIGNvbnN0IFdlYlBEYXRhKiBjaHVua19kYXRhLAorICAgIGludCBjb3B5X2RhdGEpOworCisvLyBHZXRzIGEgcmVmZXJlbmNlIHRvIHRoZSBkYXRhIG9mIHRoZSBjaHVuayB3aXRoIGlkICdmb3VyY2MnIGluIHRoZSBtdXggb2JqZWN0LgorLy8gVGhlIGNhbGxlciBzaG91bGQgTk9UIGZyZWUgdGhlIHJldHVybmVkIGRhdGEuCisvLyBQYXJhbWV0ZXJzOgorLy8gICBtdXggLSAoaW4pIG9iamVjdCBmcm9tIHdoaWNoIHRoZSBjaHVuayBkYXRhIGlzIHRvIGJlIGZldGNoZWQKKy8vICAgZm91cmNjIC0gKGluKSBhIGNoYXJhY3RlciBhcnJheSBjb250YWluaW5nIHRoZSBmb3VyY2Mgb2YgdGhlIGNodW5rOworLy8gICAgICAgICAgICAgICAgIGUuZy4sICJJQ0NQIiwgIlhNUCAiLCAiRVhJRiIgZXRjLgorLy8gICBjaHVua19kYXRhIC0gKG91dCkgcmV0dXJuZWQgY2h1bmsgZGF0YQorLy8gUmV0dXJuczoKKy8vICAgV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIG11eCwgZm91cmNjIG9yIGNodW5rX2RhdGEgaXMgTlVMTAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaWYgZm91cmNjIGNvcnJlc3BvbmRzIHRvIGFuIGltYWdlIGNodW5rLgorLy8gICBXRUJQX01VWF9OT1RfRk9VTkQgLSBJZiBtdXggZG9lcyBub3QgY29udGFpbiBhIGNodW5rIHdpdGggdGhlIGdpdmVuIGlkLgorLy8gICBXRUJQX01VWF9PSyAtIG9uIHN1Y2Nlc3MuCitXRUJQX0VYVEVSTiBXZWJQTXV4RXJyb3IgV2ViUE11eEdldENodW5rKAorICAgIGNvbnN0IFdlYlBNdXgqIG11eCwgY29uc3QgY2hhciBmb3VyY2NbNF0sIFdlYlBEYXRhKiBjaHVua19kYXRhKTsKKworLy8gRGVsZXRlcyB0aGUgY2h1bmsgd2l0aCB0aGUgZ2l2ZW4gJ2ZvdXJjYycgZnJvbSB0aGUgbXV4IG9iamVjdC4KKy8vIFBhcmFtZXRlcnM6CisvLyAgIG11eCAtIChpbi9vdXQpIG9iamVjdCBmcm9tIHdoaWNoIHRoZSBjaHVuayBpcyB0byBiZSBkZWxldGVkCisvLyAgIGZvdXJjYyAtIChpbikgYSBjaGFyYWN0ZXIgYXJyYXkgY29udGFpbmluZyB0aGUgZm91cmNjIG9mIHRoZSBjaHVuazsKKy8vICAgICAgICAgICAgICAgICBlLmcuLCAiSUNDUCIsICJYTVAgIiwgIkVYSUYiIGV0Yy4KKy8vIFJldHVybnM6CisvLyAgIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQgLSBpZiBtdXggb3IgZm91cmNjIGlzIE5VTEwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGlmIGZvdXJjYyBjb3JyZXNwb25kcyB0byBhbiBpbWFnZSBjaHVuay4KKy8vICAgV0VCUF9NVVhfTk9UX0ZPVU5EIC0gSWYgbXV4IGRvZXMgbm90IGNvbnRhaW4gYSBjaHVuayB3aXRoIHRoZSBnaXZlbiBmb3VyY2MuCisvLyAgIFdFQlBfTVVYX09LIC0gb24gc3VjY2Vzcy4KK1dFQlBfRVhURVJOIFdlYlBNdXhFcnJvciBXZWJQTXV4RGVsZXRlQ2h1bmsoCisgICAgV2ViUE11eCogbXV4LCBjb25zdCBjaGFyIGZvdXJjY1s0XSk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbWFnZXMuCisKKy8vIEVuY2Fwc3VsYXRlcyBkYXRhIGFib3V0IGEgc2luZ2xlIGZyYW1lLgorc3RydWN0IFdlYlBNdXhGcmFtZUluZm8geworICBXZWJQRGF0YSAgICBiaXRzdHJlYW07ICAvLyBpbWFnZSBkYXRhOiBjYW4gYmUgYSByYXcgVlA4L1ZQOEwgYml0c3RyZWFtCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIGEgc2luZ2xlLWltYWdlIFdlYlAgZmlsZS4KKyAgaW50ICAgICAgICAgeF9vZmZzZXQ7ICAgLy8geC1vZmZzZXQgb2YgdGhlIGZyYW1lLgorICBpbnQgICAgICAgICB5X29mZnNldDsgICAvLyB5LW9mZnNldCBvZiB0aGUgZnJhbWUuCisgIGludCAgICAgICAgIGR1cmF0aW9uOyAgIC8vIGR1cmF0aW9uIG9mIHRoZSBmcmFtZSAoaW4gbWlsbGlzZWNvbmRzKS4KKworICBXZWJQQ2h1bmtJZCBpZDsgICAgICAgICAvLyBmcmFtZSB0eXBlOiBzaG91bGQgYmUgb25lIG9mIFdFQlBfQ0hVTktfQU5NRgorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciBXRUJQX0NIVU5LX0lNQUdFCisgIFdlYlBNdXhBbmltRGlzcG9zZSBkaXNwb3NlX21ldGhvZDsgIC8vIERpc3Bvc2FsIG1ldGhvZCBmb3IgdGhlIGZyYW1lLgorICBXZWJQTXV4QW5pbUJsZW5kICAgYmxlbmRfbWV0aG9kOyAgICAvLyBCbGVuZCBvcGVyYXRpb24gZm9yIHRoZSBmcmFtZS4KKyAgdWludDMyX3QgICAgcGFkWzFdOyAgICAgLy8gcGFkZGluZyBmb3IgbGF0ZXIgdXNlCit9OworCisvLyBTZXRzIHRoZSAobm9uLWFuaW1hdGVkKSBpbWFnZSBpbiB0aGUgbXV4IG9iamVjdC4KKy8vIE5vdGU6IEFueSBleGlzdGluZyBpbWFnZXMgKGluY2x1ZGluZyBmcmFtZXMpIHdpbGwgYmUgcmVtb3ZlZC4KKy8vIFBhcmFtZXRlcnM6CisvLyAgIG11eCAtIChpbi9vdXQpIG9iamVjdCBpbiB3aGljaCB0aGUgaW1hZ2UgaXMgdG8gYmUgc2V0CisvLyAgIGJpdHN0cmVhbSAtIChpbikgY2FuIGJlIGEgcmF3IFZQOC9WUDhMIGJpdHN0cmVhbSBvciBhIHNpbmdsZS1pbWFnZQorLy8gICAgICAgICAgICAgICBXZWJQIGZpbGUgKG5vbi1hbmltYXRlZCkKKy8vICAgY29weV9kYXRhIC0gKGluKSB2YWx1ZSAxIGluZGljYXRlcyBnaXZlbiBkYXRhIFdJTEwgYmUgY29waWVkIHRvIHRoZSBtdXgKKy8vICAgICAgICAgICAgICAgb2JqZWN0IGFuZCB2YWx1ZSAwIGluZGljYXRlcyBkYXRhIHdpbGwgTk9UIGJlIGNvcGllZC4KKy8vIFJldHVybnM6CisvLyAgIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQgLSBpZiBtdXggaXMgTlVMTCBvciBiaXRzdHJlYW0gaXMgTlVMTC4KKy8vICAgV0VCUF9NVVhfTUVNT1JZX0VSUk9SIC0gb24gbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IuCisvLyAgIFdFQlBfTVVYX09LIC0gb24gc3VjY2Vzcy4KK1dFQlBfRVhURVJOIFdlYlBNdXhFcnJvciBXZWJQTXV4U2V0SW1hZ2UoCisgICAgV2ViUE11eCogbXV4LCBjb25zdCBXZWJQRGF0YSogYml0c3RyZWFtLCBpbnQgY29weV9kYXRhKTsKKworLy8gQWRkcyBhIGZyYW1lIGF0IHRoZSBlbmQgb2YgdGhlIG11eCBvYmplY3QuCisvLyBOb3RlczogKDEpIGZyYW1lLmlkIHNob3VsZCBiZSBXRUJQX0NIVU5LX0FOTUYKKy8vICAgICAgICAoMikgRm9yIHNldHRpbmcgYSBub24tYW5pbWF0ZWQgaW1hZ2UsIHVzZSBXZWJQTXV4U2V0SW1hZ2UoKSBpbnN0ZWFkLgorLy8gICAgICAgICgzKSBUeXBlIG9mIGZyYW1lIGJlaW5nIHB1c2hlZCBtdXN0IGJlIHNhbWUgYXMgdGhlIGZyYW1lcyBpbiBtdXguCisvLyAgICAgICAgKDQpIEFzIFdlYlAgb25seSBzdXBwb3J0cyBldmVuIG9mZnNldHMsIGFueSBvZGQgb2Zmc2V0IHdpbGwgYmUgc25hcHBlZAorLy8gICAgICAgICAgICB0byBhbiBldmVuIGxvY2F0aW9uIHVzaW5nOiBvZmZzZXQgJj0gfjEKKy8vIFBhcmFtZXRlcnM6CisvLyAgIG11eCAtIChpbi9vdXQpIG9iamVjdCB0byB3aGljaCB0aGUgZnJhbWUgaXMgdG8gYmUgYWRkZWQKKy8vICAgZnJhbWUgLSAoaW4pIGZyYW1lIGRhdGEuCisvLyAgIGNvcHlfZGF0YSAtIChpbikgdmFsdWUgMSBpbmRpY2F0ZXMgZ2l2ZW4gZGF0YSBXSUxMIGJlIGNvcGllZCB0byB0aGUgbXV4CisvLyAgICAgICAgICAgICAgIG9iamVjdCBhbmQgdmFsdWUgMCBpbmRpY2F0ZXMgZGF0YSB3aWxsIE5PVCBiZSBjb3BpZWQuCisvLyBSZXR1cm5zOgorLy8gICBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UIC0gaWYgbXV4IG9yIGZyYW1lIGlzIE5VTEwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGlmIGNvbnRlbnQgb2YgJ2ZyYW1lJyBpcyBpbnZhbGlkLgorLy8gICBXRUJQX01VWF9NRU1PUllfRVJST1IgLSBvbiBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvci4KKy8vICAgV0VCUF9NVVhfT0sgLSBvbiBzdWNjZXNzLgorV0VCUF9FWFRFUk4gV2ViUE11eEVycm9yIFdlYlBNdXhQdXNoRnJhbWUoCisgICAgV2ViUE11eCogbXV4LCBjb25zdCBXZWJQTXV4RnJhbWVJbmZvKiBmcmFtZSwgaW50IGNvcHlfZGF0YSk7CisKKy8vIEdldHMgdGhlIG50aCBmcmFtZSBmcm9tIHRoZSBtdXggb2JqZWN0LgorLy8gVGhlIGNvbnRlbnQgb2YgJ2ZyYW1lLT5iaXRzdHJlYW0nIGlzIGFsbG9jYXRlZCB1c2luZyBtYWxsb2MoKSwgYW5kIE5PVAorLy8gb3duZWQgYnkgdGhlICdtdXgnIG9iamVjdC4gSXQgTVVTVCBiZSBkZWFsbG9jYXRlZCBieSB0aGUgY2FsbGVyIGJ5IGNhbGxpbmcKKy8vIFdlYlBEYXRhQ2xlYXIoKS4KKy8vIG50aD0wIGhhcyBhIHNwZWNpYWwgbWVhbmluZyAtIGxhc3QgcG9zaXRpb24uCisvLyBQYXJhbWV0ZXJzOgorLy8gICBtdXggLSAoaW4pIG9iamVjdCBmcm9tIHdoaWNoIHRoZSBpbmZvIGlzIHRvIGJlIGZldGNoZWQKKy8vICAgbnRoIC0gKGluKSBpbmRleCBvZiB0aGUgZnJhbWUgaW4gdGhlIG11eCBvYmplY3QKKy8vICAgZnJhbWUgLSAob3V0KSBkYXRhIG9mIHRoZSByZXR1cm5lZCBmcmFtZQorLy8gUmV0dXJuczoKKy8vICAgV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIG11eCBvciBmcmFtZSBpcyBOVUxMLgorLy8gICBXRUJQX01VWF9OT1RfRk9VTkQgLSBpZiB0aGVyZSBhcmUgbGVzcyB0aGFuIG50aCBmcmFtZXMgaW4gdGhlIG11eCBvYmplY3QuCisvLyAgIFdFQlBfTVVYX0JBRF9EQVRBIC0gaWYgbnRoIGZyYW1lIGNodW5rIGluIG11eCBpcyBpbnZhbGlkLgorLy8gICBXRUJQX01VWF9NRU1PUllfRVJST1IgLSBvbiBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvci4KKy8vICAgV0VCUF9NVVhfT0sgLSBvbiBzdWNjZXNzLgorV0VCUF9FWFRFUk4gV2ViUE11eEVycm9yIFdlYlBNdXhHZXRGcmFtZSgKKyAgICBjb25zdCBXZWJQTXV4KiBtdXgsIHVpbnQzMl90IG50aCwgV2ViUE11eEZyYW1lSW5mbyogZnJhbWUpOworCisvLyBEZWxldGVzIGEgZnJhbWUgZnJvbSB0aGUgbXV4IG9iamVjdC4KKy8vIG50aD0wIGhhcyBhIHNwZWNpYWwgbWVhbmluZyAtIGxhc3QgcG9zaXRpb24uCisvLyBQYXJhbWV0ZXJzOgorLy8gICBtdXggLSAoaW4vb3V0KSBvYmplY3QgZnJvbSB3aGljaCBhIGZyYW1lIGlzIHRvIGJlIGRlbGV0ZWQKKy8vICAgbnRoIC0gKGluKSBUaGUgcG9zaXRpb24gZnJvbSB3aGljaCB0aGUgZnJhbWUgaXMgdG8gYmUgZGVsZXRlZAorLy8gUmV0dXJuczoKKy8vICAgV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIG11eCBpcyBOVUxMLgorLy8gICBXRUJQX01VWF9OT1RfRk9VTkQgLSBJZiB0aGVyZSBhcmUgbGVzcyB0aGFuIG50aCBmcmFtZXMgaW4gdGhlIG11eCBvYmplY3QKKy8vICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlIGRlbGV0aW9uLgorLy8gICBXRUJQX01VWF9PSyAtIG9uIHN1Y2Nlc3MuCitXRUJQX0VYVEVSTiBXZWJQTXV4RXJyb3IgV2ViUE11eERlbGV0ZUZyYW1lKFdlYlBNdXgqIG11eCwgdWludDMyX3QgbnRoKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEFuaW1hdGlvbi4KKworLy8gQW5pbWF0aW9uIHBhcmFtZXRlcnMuCitzdHJ1Y3QgV2ViUE11eEFuaW1QYXJhbXMgeworICB1aW50MzJfdCBiZ2NvbG9yOyAgLy8gQmFja2dyb3VuZCBjb2xvciBvZiB0aGUgY2FudmFzIHN0b3JlZCAoaW4gTVNCIG9yZGVyKSBhczoKKyAgICAgICAgICAgICAgICAgICAgIC8vIEJpdHMgMDAgdG8gMDc6IEFscGhhLgorICAgICAgICAgICAgICAgICAgICAgLy8gQml0cyAwOCB0byAxNTogUmVkLgorICAgICAgICAgICAgICAgICAgICAgLy8gQml0cyAxNiB0byAyMzogR3JlZW4uCisgICAgICAgICAgICAgICAgICAgICAvLyBCaXRzIDI0IHRvIDMxOiBCbHVlLgorICBpbnQgbG9vcF9jb3VudDsgICAgLy8gTnVtYmVyIG9mIHRpbWVzIHRvIHJlcGVhdCB0aGUgYW5pbWF0aW9uIFswID0gaW5maW5pdGVdLgorfTsKKworLy8gU2V0cyB0aGUgYW5pbWF0aW9uIHBhcmFtZXRlcnMgaW4gdGhlIG11eCBvYmplY3QuIEFueSBleGlzdGluZyBBTklNIGNodW5rcworLy8gd2lsbCBiZSByZW1vdmVkLgorLy8gUGFyYW1ldGVyczoKKy8vICAgbXV4IC0gKGluL291dCkgb2JqZWN0IGluIHdoaWNoIEFOSU0gY2h1bmsgaXMgdG8gYmUgc2V0L2FkZGVkCisvLyAgIHBhcmFtcyAtIChpbikgYW5pbWF0aW9uIHBhcmFtZXRlcnMuCisvLyBSZXR1cm5zOgorLy8gICBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UIC0gaWYgbXV4IG9yIHBhcmFtcyBpcyBOVUxMLgorLy8gICBXRUJQX01VWF9NRU1PUllfRVJST1IgLSBvbiBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvci4KKy8vICAgV0VCUF9NVVhfT0sgLSBvbiBzdWNjZXNzLgorV0VCUF9FWFRFUk4gV2ViUE11eEVycm9yIFdlYlBNdXhTZXRBbmltYXRpb25QYXJhbXMoCisgICAgV2ViUE11eCogbXV4LCBjb25zdCBXZWJQTXV4QW5pbVBhcmFtcyogcGFyYW1zKTsKKworLy8gR2V0cyB0aGUgYW5pbWF0aW9uIHBhcmFtZXRlcnMgZnJvbSB0aGUgbXV4IG9iamVjdC4KKy8vIFBhcmFtZXRlcnM6CisvLyAgIG11eCAtIChpbikgb2JqZWN0IGZyb20gd2hpY2ggdGhlIGFuaW1hdGlvbiBwYXJhbWV0ZXJzIHRvIGJlIGZldGNoZWQKKy8vICAgcGFyYW1zIC0gKG91dCkgYW5pbWF0aW9uIHBhcmFtZXRlcnMgZXh0cmFjdGVkIGZyb20gdGhlIEFOSU0gY2h1bmsKKy8vIFJldHVybnM6CisvLyAgIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQgLSBpZiBtdXggb3IgcGFyYW1zIGlzIE5VTEwuCisvLyAgIFdFQlBfTVVYX05PVF9GT1VORCAtIGlmIEFOSU0gY2h1bmsgaXMgbm90IHByZXNlbnQgaW4gbXV4IG9iamVjdC4KKy8vICAgV0VCUF9NVVhfT0sgLSBvbiBzdWNjZXNzLgorV0VCUF9FWFRFUk4gV2ViUE11eEVycm9yIFdlYlBNdXhHZXRBbmltYXRpb25QYXJhbXMoCisgICAgY29uc3QgV2ViUE11eCogbXV4LCBXZWJQTXV4QW5pbVBhcmFtcyogcGFyYW1zKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1pc2MgVXRpbGl0aWVzLgorCisvLyBTZXRzIHRoZSBjYW52YXMgc2l6ZSBmb3IgdGhlIG11eCBvYmplY3QuIFRoZSB3aWR0aCBhbmQgaGVpZ2h0IGNhbiBiZQorLy8gc3BlY2lmaWVkIGV4cGxpY2l0bHkgb3IgbGVmdCBhcyB6ZXJvICgwLCAwKS4KKy8vICogV2hlbiB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBzcGVjaWZpZWQgZXhwbGljaXRseSwgdGhlbiB0aGlzIGZyYW1lIGJvdW5kIGlzCisvLyAgIGVuZm9yY2VkIGR1cmluZyBzdWJzZXF1ZW50IGNhbGxzIHRvIFdlYlBNdXhBc3NlbWJsZSgpIGFuZCBhbiBlcnJvciBpcworLy8gICByZXBvcnRlZCBpZiBhbnkgYW5pbWF0ZWQgZnJhbWUgZG9lcyBub3QgY29tcGxldGVseSBmaXQgd2l0aGluIHRoZSBjYW52YXMuCisvLyAqIFdoZW4gdW5zcGVjaWZpZWQgKDAsIDApLCB0aGUgY29uc3RydWN0ZWQgY2FudmFzIHdpbGwgZ2V0IHRoZSBmcmFtZSBib3VuZHMKKy8vICAgZnJvbSB0aGUgYm91bmRpbmctYm94IG92ZXIgYWxsIGZyYW1lcyBhZnRlciBjYWxsaW5nIFdlYlBNdXhBc3NlbWJsZSgpLgorLy8gUGFyYW1ldGVyczoKKy8vICAgbXV4IC0gKGluKSBvYmplY3QgdG8gd2hpY2ggdGhlIGNhbnZhcyBzaXplIGlzIHRvIGJlIHNldAorLy8gICB3aWR0aCAtIChpbikgY2FudmFzIHdpZHRoCisvLyAgIGhlaWdodCAtIChpbikgY2FudmFzIGhlaWdodAorLy8gUmV0dXJuczoKKy8vICAgV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIG11eCBpcyBOVUxMOyBvcgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggb3IgaGVpZ2h0IGFyZSBpbnZhbGlkIG9yIG91dCBvZiBib3VuZHMKKy8vICAgV0VCUF9NVVhfT0sgLSBvbiBzdWNjZXNzLgorV0VCUF9FWFRFUk4gV2ViUE11eEVycm9yIFdlYlBNdXhTZXRDYW52YXNTaXplKFdlYlBNdXgqIG11eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworCisvLyBHZXRzIHRoZSBjYW52YXMgc2l6ZSBmcm9tIHRoZSBtdXggb2JqZWN0LgorLy8gTm90ZTogVGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0IHRoZSBWUDhYIGNodW5rLCBpZiBwcmVzZW50LCBpcyB1cC10by1kYXRlLgorLy8gVGhhdCBpcywgdGhlIG11eCBvYmplY3QgaGFzbid0IGJlZW4gbW9kaWZpZWQgc2luY2UgdGhlIGxhc3QgY2FsbCB0bworLy8gV2ViUE11eEFzc2VtYmxlKCkgb3IgV2ViUE11eENyZWF0ZSgpLgorLy8gUGFyYW1ldGVyczoKKy8vICAgbXV4IC0gKGluKSBvYmplY3QgZnJvbSB3aGljaCB0aGUgY2FudmFzIHNpemUgaXMgdG8gYmUgZmV0Y2hlZAorLy8gICB3aWR0aCAtIChvdXQpIGNhbnZhcyB3aWR0aAorLy8gICBoZWlnaHQgLSAob3V0KSBjYW52YXMgaGVpZ2h0CisvLyBSZXR1cm5zOgorLy8gICBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UIC0gaWYgbXV4LCB3aWR0aCBvciBoZWlnaHQgaXMgTlVMTC4KKy8vICAgV0VCUF9NVVhfQkFEX0RBVEEgLSBpZiBWUDhYL1ZQOC9WUDhMIGNodW5rIG9yIGNhbnZhcyBzaXplIGlzIGludmFsaWQuCisvLyAgIFdFQlBfTVVYX09LIC0gb24gc3VjY2Vzcy4KK1dFQlBfRVhURVJOIFdlYlBNdXhFcnJvciBXZWJQTXV4R2V0Q2FudmFzU2l6ZShjb25zdCBXZWJQTXV4KiBtdXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQpOworCisvLyBHZXRzIHRoZSBmZWF0dXJlIGZsYWdzIGZyb20gdGhlIG11eCBvYmplY3QuCisvLyBOb3RlOiBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoYXQgdGhlIFZQOFggY2h1bmssIGlmIHByZXNlbnQsIGlzIHVwLXRvLWRhdGUuCisvLyBUaGF0IGlzLCB0aGUgbXV4IG9iamVjdCBoYXNuJ3QgYmVlbiBtb2RpZmllZCBzaW5jZSB0aGUgbGFzdCBjYWxsIHRvCisvLyBXZWJQTXV4QXNzZW1ibGUoKSBvciBXZWJQTXV4Q3JlYXRlKCkuCisvLyBQYXJhbWV0ZXJzOgorLy8gICBtdXggLSAoaW4pIG9iamVjdCBmcm9tIHdoaWNoIHRoZSBmZWF0dXJlcyBhcmUgdG8gYmUgZmV0Y2hlZAorLy8gICBmbGFncyAtIChvdXQpIHRoZSBmbGFncyBzcGVjaWZ5aW5nIHdoaWNoIGZlYXR1cmVzIGFyZSBwcmVzZW50IGluIHRoZQorLy8gICAgICAgICAgIG11eCBvYmplY3QuIFRoaXMgd2lsbCBiZSBhbiBPUiBvZiB2YXJpb3VzIGZsYWcgdmFsdWVzLgorLy8gICAgICAgICAgIEVudW0gJ1dlYlBGZWF0dXJlRmxhZ3MnIGNhbiBiZSB1c2VkIHRvIHRlc3QgaW5kaXZpZHVhbCBmbGFnIHZhbHVlcy4KKy8vIFJldHVybnM6CisvLyAgIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQgLSBpZiBtdXggb3IgZmxhZ3MgaXMgTlVMTC4KKy8vICAgV0VCUF9NVVhfQkFEX0RBVEEgLSBpZiBWUDhYL1ZQOC9WUDhMIGNodW5rIG9yIGNhbnZhcyBzaXplIGlzIGludmFsaWQuCisvLyAgIFdFQlBfTVVYX09LIC0gb24gc3VjY2Vzcy4KK1dFQlBfRVhURVJOIFdlYlBNdXhFcnJvciBXZWJQTXV4R2V0RmVhdHVyZXMoY29uc3QgV2ViUE11eCogbXV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZmxhZ3MpOworCisvLyBHZXRzIG51bWJlciBvZiBjaHVua3Mgd2l0aCB0aGUgZ2l2ZW4gJ2lkJyBpbiB0aGUgbXV4IG9iamVjdC4KKy8vIFBhcmFtZXRlcnM6CisvLyAgIG11eCAtIChpbikgb2JqZWN0IGZyb20gd2hpY2ggdGhlIGluZm8gaXMgdG8gYmUgZmV0Y2hlZAorLy8gICBpZCAtIChpbikgY2h1bmsgaWQgc3BlY2lmeWluZyB0aGUgdHlwZSBvZiBjaHVuaworLy8gICBudW1fZWxlbWVudHMgLSAob3V0KSBudW1iZXIgb2YgY2h1bmtzIHdpdGggdGhlIGdpdmVuIGNodW5rIGlkCisvLyBSZXR1cm5zOgorLy8gICBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UIC0gaWYgbXV4LCBvciBudW1fZWxlbWVudHMgaXMgTlVMTC4KKy8vICAgV0VCUF9NVVhfT0sgLSBvbiBzdWNjZXNzLgorV0VCUF9FWFRFUk4gV2ViUE11eEVycm9yIFdlYlBNdXhOdW1DaHVua3MoY29uc3QgV2ViUE11eCogbXV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUENodW5rSWQgaWQsIGludCogbnVtX2VsZW1lbnRzKTsKKworLy8gQXNzZW1ibGVzIGFsbCBjaHVua3MgaW4gV2ViUCBSSUZGIGZvcm1hdCBhbmQgcmV0dXJucyBpbiAnYXNzZW1ibGVkX2RhdGEnLgorLy8gVGhpcyBmdW5jdGlvbiBhbHNvIHZhbGlkYXRlcyB0aGUgbXV4IG9iamVjdC4KKy8vIE5vdGU6IFRoZSBjb250ZW50IG9mICdhc3NlbWJsZWRfZGF0YScgd2lsbCBiZSBpZ25vcmVkIGFuZCBvdmVyd3JpdHRlbi4KKy8vIEFsc28sIHRoZSBjb250ZW50IG9mICdhc3NlbWJsZWRfZGF0YScgaXMgYWxsb2NhdGVkIHVzaW5nIG1hbGxvYygpLCBhbmQgTk9UCisvLyBvd25lZCBieSB0aGUgJ211eCcgb2JqZWN0LiBJdCBNVVNUIGJlIGRlYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIgYnkgY2FsbGluZworLy8gV2ViUERhdGFDbGVhcigpLiBJdCdzIGFsd2F5cyBzYWZlIHRvIGNhbGwgV2ViUERhdGFDbGVhcigpIHVwb24gcmV0dXJuLAorLy8gZXZlbiBpbiBjYXNlIG9mIGVycm9yLgorLy8gUGFyYW1ldGVyczoKKy8vICAgbXV4IC0gKGluL291dCkgb2JqZWN0IHdob3NlIGNodW5rcyBhcmUgdG8gYmUgYXNzZW1ibGVkCisvLyAgIGFzc2VtYmxlZF9kYXRhIC0gKG91dCkgYXNzZW1ibGVkIFdlYlAgZGF0YQorLy8gUmV0dXJuczoKKy8vICAgV0VCUF9NVVhfQkFEX0RBVEEgLSBpZiBtdXggb2JqZWN0IGlzIGludmFsaWQuCisvLyAgIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQgLSBpZiBtdXggb3IgYXNzZW1ibGVkX2RhdGEgaXMgTlVMTC4KKy8vICAgV0VCUF9NVVhfTUVNT1JZX0VSUk9SIC0gb24gbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IuCisvLyAgIFdFQlBfTVVYX09LIC0gb24gc3VjY2Vzcy4KK1dFQlBfRVhURVJOIFdlYlBNdXhFcnJvciBXZWJQTXV4QXNzZW1ibGUoV2ViUE11eCogbXV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQRGF0YSogYXNzZW1ibGVkX2RhdGEpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gV2ViUEFuaW1FbmNvZGVyIEFQSQorLy8KKy8vIFRoaXMgQVBJIGFsbG93cyBlbmNvZGluZyAocG9zc2libHkpIGFuaW1hdGVkIFdlYlAgaW1hZ2VzLgorLy8KKy8vIENvZGUgRXhhbXBsZToKKy8qCisgIFdlYlBBbmltRW5jb2Rlck9wdGlvbnMgZW5jX29wdGlvbnM7CisgIFdlYlBBbmltRW5jb2Rlck9wdGlvbnNJbml0KCZlbmNfb3B0aW9ucyk7CisgIC8vIFR1bmUgJ2VuY19vcHRpb25zJyBhcyBuZWVkZWQuCisgIFdlYlBBbmltRW5jb2RlciogZW5jID0gV2ViUEFuaW1FbmNvZGVyTmV3KHdpZHRoLCBoZWlnaHQsICZlbmNfb3B0aW9ucyk7CisgIHdoaWxlKDx0aGVyZSBhcmUgbW9yZSBmcmFtZXM+KSB7CisgICAgV2ViUENvbmZpZyBjb25maWc7CisgICAgV2ViUENvbmZpZ0luaXQoJmNvbmZpZyk7CisgICAgLy8gVHVuZSAnY29uZmlnJyBhcyBuZWVkZWQuCisgICAgV2ViUEFuaW1FbmNvZGVyQWRkKGVuYywgZnJhbWUsIHRpbWVzdGFtcF9tcywgJmNvbmZpZyk7CisgIH0KKyAgV2ViUEFuaW1FbmNvZGVyQWRkKGVuYywgTlVMTCwgdGltZXN0YW1wX21zLCBOVUxMKTsKKyAgV2ViUEFuaW1FbmNvZGVyQXNzZW1ibGUoZW5jLCB3ZWJwX2RhdGEpOworICBXZWJQQW5pbUVuY29kZXJEZWxldGUoZW5jKTsKKyAgLy8gV3JpdGUgdGhlICd3ZWJwX2RhdGEnIHRvIGEgZmlsZSwgb3IgcmUtbXV4IGl0IGZ1cnRoZXIuCisqLworCit0eXBlZGVmIHN0cnVjdCBXZWJQQW5pbUVuY29kZXIgV2ViUEFuaW1FbmNvZGVyOyAgLy8gTWFpbiBvcGFxdWUgb2JqZWN0LgorCisvLyBGb3J3YXJkIGRlY2xhcmF0aW9ucy4gRGVmaW5lZCBpbiBlbmNvZGUuaC4KK3N0cnVjdCBXZWJQUGljdHVyZTsKK3N0cnVjdCBXZWJQQ29uZmlnOworCisvLyBHbG9iYWwgb3B0aW9ucy4KK3N0cnVjdCBXZWJQQW5pbUVuY29kZXJPcHRpb25zIHsKKyAgV2ViUE11eEFuaW1QYXJhbXMgYW5pbV9wYXJhbXM7ICAvLyBBbmltYXRpb24gcGFyYW1ldGVycy4KKyAgaW50IG1pbmltaXplX3NpemU7ICAgIC8vIElmIHRydWUsIG1pbmltaXplIHRoZSBvdXRwdXQgc2l6ZSAoc2xvdykuIEltcGxpY2l0bHkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc2FibGVzIGtleS1mcmFtZSBpbnNlcnRpb24uCisgIGludCBrbWluOworICBpbnQga21heDsgICAgICAgICAgICAgLy8gTWluaW11bSBhbmQgbWF4aW11bSBkaXN0YW5jZSBiZXR3ZWVuIGNvbnNlY3V0aXZlIGtleQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJhbWVzIGluIHRoZSBvdXRwdXQuIFRoZSBsaWJyYXJ5IG1heSBpbnNlcnQgc29tZSBrZXkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyYW1lcyBhcyBuZWVkZWQgdG8gc2F0aXNmeSB0aGlzIGNyaXRlcmlhLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoZXNlIGNvbmRpdGlvbnMgc2hvdWxkIGhvbGQ6IGttYXggPiBrbWluCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQga21pbiA+PSBrbWF4IC8gMiArIDEuIEFsc28sIGlmIGttYXggPD0gMCwgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2V5LWZyYW1lIGluc2VydGlvbiBpcyBkaXNhYmxlZDsgYW5kIGlmIGttYXggPT0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gYWxsIGZyYW1lcyB3aWxsIGJlIGtleS1mcmFtZXMgKGttaW4gdmFsdWUgZG9lcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90IG1hdHRlciBmb3IgdGhlc2Ugc3BlY2lhbCBjYXNlcykuCisgIGludCBhbGxvd19taXhlZDsgICAgICAvLyBJZiB0cnVlLCB1c2UgbWl4ZWQgY29tcHJlc3Npb24gbW9kZTsgbWF5IGNob29zZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWl0aGVyIGxvc3N5IGFuZCBsb3NzbGVzcyBmb3IgZWFjaCBmcmFtZS4KKyAgaW50IHZlcmJvc2U7ICAgICAgICAgIC8vIElmIHRydWUsIHByaW50IGluZm8gYW5kIHdhcm5pbmcgbWVzc2FnZXMgdG8gc3RkZXJyLgorCisgIHVpbnQzMl90IHBhZGRpbmdbNF07ICAvLyBQYWRkaW5nIGZvciBsYXRlciB1c2UuCit9OworCisvLyBJbnRlcm5hbCwgdmVyc2lvbi1jaGVja2VkLCBlbnRyeSBwb2ludC4KK1dFQlBfRVhURVJOIGludCBXZWJQQW5pbUVuY29kZXJPcHRpb25zSW5pdEludGVybmFsKAorICAgIFdlYlBBbmltRW5jb2Rlck9wdGlvbnMqLCBpbnQpOworCisvLyBTaG91bGQgYWx3YXlzIGJlIGNhbGxlZCwgdG8gaW5pdGlhbGl6ZSBhIGZyZXNoIFdlYlBBbmltRW5jb2Rlck9wdGlvbnMKKy8vIHN0cnVjdHVyZSBiZWZvcmUgbW9kaWZpY2F0aW9uLiBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgdmVyc2lvbiBtaXNtYXRjaC4KKy8vIFdlYlBBbmltRW5jb2Rlck9wdGlvbnNJbml0KCkgbXVzdCBoYXZlIHN1Y2NlZWRlZCBiZWZvcmUgdXNpbmcgdGhlCisvLyAnZW5jX29wdGlvbnMnIG9iamVjdC4KK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgV2ViUEFuaW1FbmNvZGVyT3B0aW9uc0luaXQoCisgICAgV2ViUEFuaW1FbmNvZGVyT3B0aW9ucyogZW5jX29wdGlvbnMpIHsKKyAgcmV0dXJuIFdlYlBBbmltRW5jb2Rlck9wdGlvbnNJbml0SW50ZXJuYWwoZW5jX29wdGlvbnMsIFdFQlBfTVVYX0FCSV9WRVJTSU9OKTsKK30KKworLy8gSW50ZXJuYWwsIHZlcnNpb24tY2hlY2tlZCwgZW50cnkgcG9pbnQuCitXRUJQX0VYVEVSTiBXZWJQQW5pbUVuY29kZXIqIFdlYlBBbmltRW5jb2Rlck5ld0ludGVybmFsKAorICAgIGludCwgaW50LCBjb25zdCBXZWJQQW5pbUVuY29kZXJPcHRpb25zKiwgaW50KTsKKworLy8gQ3JlYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYSBXZWJQQW5pbUVuY29kZXIgb2JqZWN0LgorLy8gUGFyYW1ldGVyczoKKy8vICAgd2lkdGgvaGVpZ2h0IC0gKGluKSBjYW52YXMgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgYW5pbWF0aW9uLgorLy8gICBlbmNfb3B0aW9ucyAtIChpbikgZW5jb2Rpbmcgb3B0aW9uczsgY2FuIGJlIHBhc3NlZCBOVUxMIHRvIHBpY2sKKy8vICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbmFibGUgZGVmYXVsdHMuCisvLyBSZXR1cm5zOgorLy8gICBBIHBvaW50ZXIgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgV2ViUEFuaW1FbmNvZGVyIG9iamVjdC4KKy8vICAgT3IgTlVMTCBpbiBjYXNlIG9mIG1lbW9yeSBlcnJvci4KK3N0YXRpYyBXRUJQX0lOTElORSBXZWJQQW5pbUVuY29kZXIqIFdlYlBBbmltRW5jb2Rlck5ldygKKyAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGNvbnN0IFdlYlBBbmltRW5jb2Rlck9wdGlvbnMqIGVuY19vcHRpb25zKSB7CisgIHJldHVybiBXZWJQQW5pbUVuY29kZXJOZXdJbnRlcm5hbCh3aWR0aCwgaGVpZ2h0LCBlbmNfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdFQlBfTVVYX0FCSV9WRVJTSU9OKTsKK30KKworLy8gT3B0aW1pemUgdGhlIGdpdmVuIGZyYW1lIGZvciBXZWJQLCBlbmNvZGUgaXQgYW5kIGFkZCBpdCB0byB0aGUKKy8vIFdlYlBBbmltRW5jb2RlciBvYmplY3QuCisvLyBUaGUgbGFzdCBjYWxsIHRvICdXZWJQQW5pbUVuY29kZXJBZGQnIHNob3VsZCBiZSB3aXRoIGZyYW1lID0gTlVMTCwgd2hpY2gKKy8vIGluZGljYXRlcyB0aGF0IG5vIG1vcmUgZnJhbWVzIGFyZSB0byBiZSBhZGRlZC4gVGhpcyBjYWxsIGlzIGFsc28gdXNlZCB0bworLy8gZGV0ZXJtaW5lIHRoZSBkdXJhdGlvbiBvZiB0aGUgbGFzdCBmcmFtZS4KKy8vIFBhcmFtZXRlcnM6CisvLyAgIGVuYyAtIChpbi9vdXQpIG9iamVjdCB0byB3aGljaCB0aGUgZnJhbWUgaXMgdG8gYmUgYWRkZWQuCisvLyAgIGZyYW1lIC0gKGluL291dCkgZnJhbWUgZGF0YSBpbiBBUkdCIG9yIFlVVihBKSBmb3JtYXQuIElmIGl0IGlzIGluIFlVVihBKQorLy8gICAgICAgICAgIGZvcm1hdCwgaXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gQVJHQiwgd2hpY2ggaW5jdXJzIGEgc21hbGwgbG9zcy4KKy8vICAgdGltZXN0YW1wX21zIC0gKGluKSB0aW1lc3RhbXAgb2YgdGhpcyBmcmFtZSBpbiBtaWxsaXNlY29uZHMuCisvLyAgICAgICAgICAgICAgICAgICAgICAgRHVyYXRpb24gb2YgYSBmcmFtZSB3b3VsZCBiZSBjYWxjdWxhdGVkIGFzCisvLyAgICAgICAgICAgICAgICAgICAgICAgInRpbWVzdGFtcCBvZiBuZXh0IGZyYW1lIC0gdGltZXN0YW1wIG9mIHRoaXMgZnJhbWUiLgorLy8gICAgICAgICAgICAgICAgICAgICAgIEhlbmNlLCB0aW1lc3RhbXBzIHNob3VsZCBiZSBpbiBub24tZGVjcmVhc2luZyBvcmRlci4KKy8vICAgY29uZmlnIC0gKGluKSBlbmNvZGluZyBvcHRpb25zOyBjYW4gYmUgcGFzc2VkIE5VTEwgdG8gcGljaworLy8gICAgICAgICAgICByZWFzb25hYmxlIGRlZmF1bHRzLgorLy8gUmV0dXJuczoKKy8vICAgT24gZXJyb3IsIHJldHVybnMgZmFsc2UgYW5kIGZyYW1lLT5lcnJvcl9jb2RlIGlzIHNldCBhcHByb3ByaWF0ZWx5LgorLy8gICBPdGhlcndpc2UsIHJldHVybnMgdHJ1ZS4KK1dFQlBfRVhURVJOIGludCBXZWJQQW5pbUVuY29kZXJBZGQoCisgICAgV2ViUEFuaW1FbmNvZGVyKiBlbmMsIHN0cnVjdCBXZWJQUGljdHVyZSogZnJhbWUsIGludCB0aW1lc3RhbXBfbXMsCisgICAgY29uc3Qgc3RydWN0IFdlYlBDb25maWcqIGNvbmZpZyk7CisKKy8vIEFzc2VtYmxlIGFsbCBmcmFtZXMgYWRkZWQgc28gZmFyIGludG8gYSBXZWJQIGJpdHN0cmVhbS4KKy8vIFRoaXMgY2FsbCBzaG91bGQgYmUgcHJlY2VkZWQgYnkgIGEgY2FsbCB0byAnV2ViUEFuaW1FbmNvZGVyQWRkJyB3aXRoCisvLyBmcmFtZSA9IE5VTEw7IGlmIG5vdCwgdGhlIGR1cmF0aW9uIG9mIHRoZSBsYXN0IGZyYW1lIHdpbGwgYmUgaW50ZXJuYWxseQorLy8gZXN0aW1hdGVkLgorLy8gUGFyYW1ldGVyczoKKy8vICAgZW5jIC0gKGluL291dCkgb2JqZWN0IGZyb20gd2hpY2ggdGhlIGZyYW1lcyBhcmUgdG8gYmUgYXNzZW1ibGVkLgorLy8gICB3ZWJwX2RhdGEgLSAob3V0KSBnZW5lcmF0ZWQgV2ViUCBiaXRzdHJlYW0uCisvLyBSZXR1cm5zOgorLy8gICBUcnVlIG9uIHN1Y2Nlc3MuCitXRUJQX0VYVEVSTiBpbnQgV2ViUEFuaW1FbmNvZGVyQXNzZW1ibGUoV2ViUEFuaW1FbmNvZGVyKiBlbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUERhdGEqIHdlYnBfZGF0YSk7CisKKy8vIEdldCBlcnJvciBzdHJpbmcgY29ycmVzcG9uZGluZyB0byB0aGUgbW9zdCByZWNlbnQgY2FsbCB1c2luZyAnZW5jJy4gVGhlCisvLyByZXR1cm5lZCBzdHJpbmcgaXMgb3duZWQgYnkgJ2VuYycgYW5kIGlzIHZhbGlkIG9ubHkgdW50aWwgdGhlIG5leHQgY2FsbCB0bworLy8gV2ViUEFuaW1FbmNvZGVyQWRkKCkgb3IgV2ViUEFuaW1FbmNvZGVyQXNzZW1ibGUoKSBvciBXZWJQQW5pbUVuY29kZXJEZWxldGUoKS4KKy8vIFBhcmFtZXRlcnM6CisvLyAgIGVuYyAtIChpbi9vdXQpIG9iamVjdCBmcm9tIHdoaWNoIHRoZSBlcnJvciBzdHJpbmcgaXMgdG8gYmUgZmV0Y2hlZC4KKy8vIFJldHVybnM6CisvLyAgIE5VTEwgaWYgJ2VuYycgaXMgTlVMTC4gT3RoZXJ3aXNlLCByZXR1cm5zIHRoZSBlcnJvciBzdHJpbmcgaWYgdGhlIGxhc3QgY2FsbAorLy8gICB0byAnZW5jJyBoYWQgYW4gZXJyb3IsIG9yIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgbGFzdCBjYWxsIHdhcyBhIHN1Y2Nlc3MuCitXRUJQX0VYVEVSTiBjb25zdCBjaGFyKiBXZWJQQW5pbUVuY29kZXJHZXRFcnJvcihXZWJQQW5pbUVuY29kZXIqIGVuYyk7CisKKy8vIERlbGV0ZXMgdGhlIFdlYlBBbmltRW5jb2RlciBvYmplY3QuCisvLyBQYXJhbWV0ZXJzOgorLy8gICBlbmMgLSAoaW4vb3V0KSBvYmplY3QgdG8gYmUgZGVsZXRlZAorV0VCUF9FWFRFUk4gdm9pZCBXZWJQQW5pbUVuY29kZXJEZWxldGUoV2ViUEFuaW1FbmNvZGVyKiBlbmMpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30gICAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLyogV0VCUF9XRUJQX01VWF9IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3dlYnAvbXV4X3R5cGVzLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvd2VicC9tdXhfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWJkMDZmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3dlYnAvbXV4X3R5cGVzLmgKQEAgLTAsMCArMSwxMDMgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBEYXRhLXR5cGVzIGNvbW1vbiB0byB0aGUgbXV4IGFuZCBkZW11eCBsaWJyYXJpZXMuCisvLworLy8gQXV0aG9yOiBVcnZhbmcgKHVydmFuZ0Bnb29nbGUuY29tKQorCisjaWZuZGVmIFdFQlBfV0VCUF9NVVhfVFlQRVNfSF8KKyNkZWZpbmUgV0VCUF9XRUJQX01VWF9UWVBFU19IXworCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKKyNlbHNlCisjaW5jbHVkZSA8c3RkbGliLmg+ICAvLyBmcmVlKCkKKyNpbmNsdWRlIDxzdHJpbmcuaD4gIC8vIG1lbXNldCgpCisjZW5kaWYKKyNpbmNsdWRlICIuL3R5cGVzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLy8gTm90ZTogZm9yd2FyZCBkZWNsYXJpbmcgZW51bWVyYXRpb25zIGlzIG5vdCBhbGxvd2VkIGluIChzdHJpY3QpIEMgYW5kIEMrKywKKy8vIHRoZSB0eXBlcyBhcmUgbGVmdCBoZXJlIGZvciByZWZlcmVuY2UuCisvLyB0eXBlZGVmIGVudW0gV2ViUEZlYXR1cmVGbGFncyBXZWJQRmVhdHVyZUZsYWdzOworLy8gdHlwZWRlZiBlbnVtIFdlYlBNdXhBbmltRGlzcG9zZSBXZWJQTXV4QW5pbURpc3Bvc2U7CisvLyB0eXBlZGVmIGVudW0gV2ViUE11eEFuaW1CbGVuZCBXZWJQTXV4QW5pbUJsZW5kOwordHlwZWRlZiBzdHJ1Y3QgV2ViUERhdGEgV2ViUERhdGE7CisKKy8vIFZQOFggRmVhdHVyZSBGbGFncy4KK3R5cGVkZWYgZW51bSBXZWJQRmVhdHVyZUZsYWdzIHsKKyAgQU5JTUFUSU9OX0ZMQUcgID0gMHgwMDAwMDAwMiwKKyAgWE1QX0ZMQUcgICAgICAgID0gMHgwMDAwMDAwNCwKKyAgRVhJRl9GTEFHICAgICAgID0gMHgwMDAwMDAwOCwKKyAgQUxQSEFfRkxBRyAgICAgID0gMHgwMDAwMDAxMCwKKyAgSUNDUF9GTEFHICAgICAgID0gMHgwMDAwMDAyMCwKKworICBBTExfVkFMSURfRkxBR1MgPSAweDAwMDAwMDNlCit9IFdlYlBGZWF0dXJlRmxhZ3M7CisKKy8vIERpc3Bvc2UgbWV0aG9kIChhbmltYXRpb24gb25seSkuIEluZGljYXRlcyBob3cgdGhlIGFyZWEgdXNlZCBieSB0aGUgY3VycmVudAorLy8gZnJhbWUgaXMgdG8gYmUgdHJlYXRlZCBiZWZvcmUgcmVuZGVyaW5nIHRoZSBuZXh0IGZyYW1lIG9uIHRoZSBjYW52YXMuCit0eXBlZGVmIGVudW0gV2ViUE11eEFuaW1EaXNwb3NlIHsKKyAgV0VCUF9NVVhfRElTUE9TRV9OT05FLCAgICAgICAvLyBEbyBub3QgZGlzcG9zZS4KKyAgV0VCUF9NVVhfRElTUE9TRV9CQUNLR1JPVU5EICAvLyBEaXNwb3NlIHRvIGJhY2tncm91bmQgY29sb3IuCit9IFdlYlBNdXhBbmltRGlzcG9zZTsKKworLy8gQmxlbmQgb3BlcmF0aW9uIChhbmltYXRpb24gb25seSkuIEluZGljYXRlcyBob3cgdHJhbnNwYXJlbnQgcGl4ZWxzIG9mIHRoZQorLy8gY3VycmVudCBmcmFtZSBhcmUgYmxlbmRlZCB3aXRoIHRob3NlIG9mIHRoZSBwcmV2aW91cyBjYW52YXMuCit0eXBlZGVmIGVudW0gV2ViUE11eEFuaW1CbGVuZCB7CisgIFdFQlBfTVVYX0JMRU5ELCAgICAgICAgICAgICAgLy8gQmxlbmQuCisgIFdFQlBfTVVYX05PX0JMRU5EICAgICAgICAgICAgLy8gRG8gbm90IGJsZW5kLgorfSBXZWJQTXV4QW5pbUJsZW5kOworCisvLyBEYXRhIHR5cGUgdXNlZCB0byBkZXNjcmliZSAncmF3JyBkYXRhLCBlLmcuLCBjaHVuayBkYXRhCisvLyAoSUNDIHByb2ZpbGUsIG1ldGFkYXRhKSBhbmQgV2ViUCBjb21wcmVzc2VkIGltYWdlIGRhdGEuCitzdHJ1Y3QgV2ViUERhdGEgeworICBjb25zdCB1aW50OF90KiBieXRlczsKKyAgc2l6ZV90IHNpemU7Cit9OworCisvLyBJbml0aWFsaXplcyB0aGUgY29udGVudHMgb2YgdGhlICd3ZWJwX2RhdGEnIG9iamVjdCB3aXRoIGRlZmF1bHQgdmFsdWVzLgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgV2ViUERhdGFJbml0KFdlYlBEYXRhKiB3ZWJwX2RhdGEpIHsKKyAgaWYgKHdlYnBfZGF0YSAhPSBOVUxMKSB7CisgICAgU2JNZW1vcnlTZXQod2VicF9kYXRhLCAwLCBzaXplb2YoKndlYnBfZGF0YSkpOworICB9Cit9CisKKy8vIENsZWFycyB0aGUgY29udGVudHMgb2YgdGhlICd3ZWJwX2RhdGEnIG9iamVjdCBieSBjYWxsaW5nIGZyZWUoKS4gRG9lcyBub3QKKy8vIGRlYWxsb2NhdGUgdGhlIG9iamVjdCBpdHNlbGYuCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBXZWJQRGF0YUNsZWFyKFdlYlBEYXRhKiB3ZWJwX2RhdGEpIHsKKyAgaWYgKHdlYnBfZGF0YSAhPSBOVUxMKSB7CisgICAgU2JNZW1vcnlEZWFsbG9jYXRlKCh2b2lkKil3ZWJwX2RhdGEtPmJ5dGVzKTsKKyAgICBXZWJQRGF0YUluaXQod2VicF9kYXRhKTsKKyAgfQorfQorCisvLyBBbGxvY2F0ZXMgbmVjZXNzYXJ5IHN0b3JhZ2UgZm9yICdkc3QnIGFuZCBjb3BpZXMgdGhlIGNvbnRlbnRzIG9mICdzcmMnLgorLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MuCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFdlYlBEYXRhQ29weShjb25zdCBXZWJQRGF0YSogc3JjLCBXZWJQRGF0YSogZHN0KSB7CisgIGlmIChzcmMgPT0gTlVMTCB8fCBkc3QgPT0gTlVMTCkgcmV0dXJuIDA7CisgIFdlYlBEYXRhSW5pdChkc3QpOworICBpZiAoc3JjLT5ieXRlcyAhPSBOVUxMICYmIHNyYy0+c2l6ZSAhPSAwKSB7CisgICAgZHN0LT5ieXRlcyA9ICh1aW50OF90KilTYk1lbW9yeUFsbG9jYXRlKHNyYy0+c2l6ZSk7CisgICAgaWYgKGRzdC0+Ynl0ZXMgPT0gTlVMTCkgcmV0dXJuIDA7CisgICAgU2JNZW1vcnlDb3B5KCh2b2lkKilkc3QtPmJ5dGVzLCBzcmMtPmJ5dGVzLCBzcmMtPnNpemUpOworICAgIGRzdC0+c2l6ZSA9IHNyYy0+c2l6ZTsKKyAgfQorICByZXR1cm4gMTsKK30KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8qIFdFQlBfV0VCUF9NVVhfVFlQRVNfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy93ZWJwL3R5cGVzLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvd2VicC90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyNzM4ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvd2VicC90eXBlcy5oCkBAIC0wLDAgKzEsNTggQEAKKy8vIENvcHlyaWdodCAyMDEwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgQ29tbW9uIHR5cGVzCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2lmbmRlZiBXRUJQX1dFQlBfVFlQRVNfSF8KKyNkZWZpbmUgV0VCUF9XRUJQX1RZUEVTX0hfCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3R5cGVzLmgiCisjZGVmaW5lIFdFQlBfSU5MSU5FIFNCX0NfSU5MSU5FCisjZWxzZQorI2luY2x1ZGUgPHN0ZGRlZi5oPiAgLy8gZm9yIHNpemVfdAorCisjaWZuZGVmIF9NU0NfVkVSCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pIHx8IFwKKyAgICAoZGVmaW5lZChfX1NURENfVkVSU0lPTl9fKSAmJiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwpCisjZGVmaW5lIFdFQlBfSU5MSU5FIGlubGluZQorI2Vsc2UKKyNkZWZpbmUgV0VCUF9JTkxJTkUKKyNlbmRpZgorI2Vsc2UKK3R5cGVkZWYgc2lnbmVkICAgY2hhciBpbnQ4X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdWludDhfdDsKK3R5cGVkZWYgc2lnbmVkICAgc2hvcnQgaW50MTZfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgdWludDE2X3Q7Cit0eXBlZGVmIHNpZ25lZCAgIGludCBpbnQzMl90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgdWludDMyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgdWludDY0X3Q7Cit0eXBlZGVmIGxvbmcgbG9uZyBpbnQgaW50NjRfdDsKKyNkZWZpbmUgV0VCUF9JTkxJTkUgX19mb3JjZWlubGluZQorI2VuZGlmICAvKiBfTVNDX1ZFUiAqLworI2VuZGlmICAvKiBkZWZpbmVkKFNUQVJCT0FSRCkgKi8KKworI2lmbmRlZiBXRUJQX0VYVEVSTgorLy8gVGhpcyBleHBsaWNpdGx5IG1hcmtzIGxpYnJhcnkgZnVuY3Rpb25zIGFuZCBhbGxvd3MgZm9yIGNoYW5naW5nIHRoZQorLy8gc2lnbmF0dXJlIGZvciBlLmcuLCBXaW5kb3dzIERMTCBidWlsZHMuCisjIGlmIGRlZmluZWQoX19HTlVDX18pICYmIF9fR05VQ19fID49IDQKKyMgIGRlZmluZSBXRUJQX0VYVEVSTiBleHRlcm4gX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQorIyBlbHNlCisjICBkZWZpbmUgV0VCUF9FWFRFUk4gZXh0ZXJuCisjIGVuZGlmICAvKiBfX0dOVUNfXyA+PSA0ICovCisjZW5kaWYgIC8qIFdFQlBfRVhURVJOICovCisKKy8vIE1hY3JvIHRvIGNoZWNrIEFCSSBjb21wYXRpYmlsaXR5IChzYW1lIG1ham9yIHJldmlzaW9uIG51bWJlcikKKyNkZWZpbmUgV0VCUF9BQklfSVNfSU5DT01QQVRJQkxFKGEsIGIpICgoKGEpID4+IDgpICE9ICgoYikgPj4gOCkpCisKKyNlbmRpZiAgLyogV0VCUF9XRUJQX1RZUEVTX0hfICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zd2lnL1JFQURNRSBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3N3aWcvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNWMwNzEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zd2lnL1JFQURNRQpAQCAtMCwwICsxLDU2IEBACitCdWlsZGluZzoKKz09PT09PT09PQorCitKTkkgU1dJRyBiaW5kaW5nczoKKy0tLS0tLS0tLS0tLS0tLS0tLQorICQgZ2NjIC1zaGFyZWQgLWZQSUMgLWZuby1zdHJpY3QtYWxpYXNpbmcgLU8yIFwKKyAgICAgICAtSS9wYXRoL3RvL3lvdXIvamRrL2luY2x1ZGVzIFwKKyAgICAgICBsaWJ3ZWJwX2phdmFfd3JhcC5jIFwKKyAgICAgICAtbHdlYnAgXAorICAgICAgIC1vIGxpYndlYnBfam5pLnNvCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJFR0lOIFBTRVVETyBFWEFNUExFCitpbXBvcnQgY29tLmdvb2dsZS53ZWJwLmxpYndlYnA7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKK3B1YmxpYyBjbGFzcyBsaWJ3ZWJwX2puaV9leGFtcGxlIHsKKyAgc3RhdGljIHsKKyAgICBTeXN0ZW0ubG9hZExpYnJhcnkoIndlYnBfam5pIik7CisgIH0KKworICAvKioKKyAgICogdXNhZ2U6IGphdmEgLWNwIGxpYndlYnAuamFyOi4gbGlid2VicF9qbmlfZXhhbXBsZQorICAgKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3ZbXSkgeworICAgIGZpbmFsIGludCB2ZXJzaW9uID0gbGlid2VicC5XZWJQR2V0RGVjb2RlclZlcnNpb24oKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oImxpYndlYnAgdmVyc2lvbjogIiArIEludGVnZXIudG9IZXhTdHJpbmcodmVyc2lvbikpOworCisgICAgU3lzdGVtLm91dC5wcmludGxuKCJsaWJ3ZWJwIG1ldGhvZHM6Iik7CisgICAgZmluYWwgTWV0aG9kW10gbGlid2VicE1ldGhvZHMgPSBsaWJ3ZWJwLmNsYXNzLmdldERlY2xhcmVkTWV0aG9kcygpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlid2VicE1ldGhvZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihsaWJ3ZWJwTWV0aG9kc1tpXSk7CisgICAgfQorICB9Cit9CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFTkQgUFNFVURPIEVYQU1QTEUKKworICQgamF2YWMgLWNwIGxpYndlYnAuamFyIGxpYndlYnBfam5pX2V4YW1wbGUuamF2YQorICQgamF2YSAtRGphdmEubGlicmFyeS5wYXRoPS4gLWNwIGxpYndlYnAuamFyOi4gbGlid2VicF9qbmlfZXhhbXBsZQorCitQeXRob24gU1dJRyBiaW5kaW5nczoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICQgcHl0aG9uIHNldHVwLnB5IGJ1aWxkX2V4dAorICQgcHl0aG9uIHNldHVwLnB5IGluc3RhbGwgLS1wcmVmaXg9cHlsb2NhbAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCRUdJTiBQU0VVRE8gRVhBTVBMRQoraW1wb3J0IGdsb2IKK2ltcG9ydCBzeXMKK3N5cy5wYXRoLmFwcGVuZChnbG9iLmdsb2IoJ3B5bG9jYWwvbGliL3B5dGhvbiovc2l0ZS1wYWNrYWdlcycpWzBdKQorCitmcm9tIGNvbS5nb29nbGUud2VicCBpbXBvcnQgbGlid2VicAorcHJpbnQgImxpYndlYnAgZGVjb2RlciB2ZXJzaW9uOiAleCIgJSBsaWJ3ZWJwLldlYlBHZXREZWNvZGVyVmVyc2lvbigpCisKK3ByaW50ICJsaWJ3ZWJwIGF0dHJpYnV0ZXM6IgorZm9yIGF0dHIgaW4gZGlyKGxpYndlYnApOiBwcmludCBhdHRyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFTkQgUFNFVURPIEVYQU1QTEUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3N3aWcvbGlid2VicC5nbyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3N3aWcvbGlid2VicC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjIwNWFhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3dpZy9saWJ3ZWJwLmdvCkBAIC0wLDAgKzEsNDUgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRoaXMgZmlsZSB3YXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgU1dJRyAoaHR0cDovL3d3dy5zd2lnLm9yZykuCisgKiBWZXJzaW9uIDIuMC4xMAorICoKKyAqIFRoaXMgZmlsZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgZWFzaWx5IHJlYWRhYmxlIGFuZCBjb250YWlucyBhIG51bWJlciBvZgorICogY29kaW5nIGNvbnZlbnRpb25zIGRlc2lnbmVkIHRvIGltcHJvdmUgcG9ydGFiaWxpdHkgYW5kIGVmZmljaWVuY3kuIERvIG5vdCBtYWtlCisgKiBjaGFuZ2VzIHRvIHRoaXMgZmlsZSB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLS1tb2RpZnkgdGhlIFNXSUcKKyAqIGludGVyZmFjZSBmaWxlIGluc3RlYWQuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitwYWNrYWdlIGxpYndlYnAKKworaW1wb3J0IF8gInJ1bnRpbWUvY2dvIgoraW1wb3J0ICJ1bnNhZmUiCisKK3R5cGUgXyB1bnNhZmUuUG9pbnRlcgorCit0eXBlIF9zd2lnX2ZucHRyICpieXRlCit0eXBlIF9zd2lnX21lbWJlcnB0ciAqYnl0ZQorCisvL2V4dGVybiBsaWJ3ZWJwU3dpZ0Nnb2NhbGwKK2Z1bmMgU3dpZ0Nnb2NhbGwoKQorCisvL2V4dGVybiBsaWJ3ZWJwU3dpZ0Nnb2NhbGxEb25lCitmdW5jIFN3aWdDZ29jYWxsRG9uZSgpCisKKy8vZXh0ZXJuIGxpYndlYnBTd2lnQ2dvY2FsbEJhY2sKK2Z1bmMgU3dpZ0Nnb2NhbGxCYWNrKCkKKworLy9leHRlcm4gbGlid2VicFN3aWdDZ29jYWxsQmFja0RvbmUKK2Z1bmMgU3dpZ0Nnb2NhbGxCYWNrRG9uZSgpCisKK2Z1bmMgV2ViUEdldERlY29kZXJWZXJzaW9uKCkgaW50CitmdW5jIFdyYXBwZWRfV2ViUEdldEluZm8oc3RyaW5nLCBbXWludCwgW11pbnQpIGludAorCisvLyBXZWJQR2V0SW5mbyBoYXMgMiBvdXRwdXQgcGFyYW1ldGVycywgcHJvdmlkZSBhIHZlcnNpb24gaW4gdGhlIG1vcmUgbmF0dXJhbAorLy8gZ28gaWRpb206CitmdW5jIFdlYlBHZXRJbmZvKHdlYnAgW11ieXRlKSAob2sgYm9vbCwgd2lkdGggaW50LCBoZWlnaHQgaW50KSB7CisJdyA6PSBbXWludHswfQorCWggOj0gW11pbnR7MH0KKwlvayA9IFdyYXBwZWRfV2ViUEdldEluZm8oc3RyaW5nKHdlYnApLCB3LCBoKSAhPSAwCisJd2lkdGggPSB3WzBdCisJaGVpZ2h0ID0gaFswXQorCXJldHVybgorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3dpZy9saWJ3ZWJwLmphciBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3N3aWcvbGlid2VicC5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZjNTAyYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3N3aWcvbGlid2VicC5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3dpZy9saWJ3ZWJwLnB5IGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3dpZy9saWJ3ZWJwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZjExZjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zd2lnL2xpYndlYnAucHkKQEAgLTAsMCArMSwxOTggQEAKKyMgVGhpcyBmaWxlIHdhcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBTV0lHIChodHRwOi8vd3d3LnN3aWcub3JnKS4KKyMgVmVyc2lvbiAyLjAuNAorIworIyBEbyBub3QgbWFrZSBjaGFuZ2VzIHRvIHRoaXMgZmlsZSB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLS1tb2RpZnkKKyMgdGhlIFNXSUcgaW50ZXJmYWNlIGZpbGUgaW5zdGVhZC4KKworCisKK2Zyb20gc3lzIGltcG9ydCB2ZXJzaW9uX2luZm8KK2lmIHZlcnNpb25faW5mbyA+PSAoMiw2LDApOgorICAgIGRlZiBzd2lnX2ltcG9ydF9oZWxwZXIoKToKKyAgICAgICAgZnJvbSBvcy5wYXRoIGltcG9ydCBkaXJuYW1lCisgICAgICAgIGltcG9ydCBpbXAKKyAgICAgICAgZnAgPSBOb25lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZwLCBwYXRobmFtZSwgZGVzY3JpcHRpb24gPSBpbXAuZmluZF9tb2R1bGUoJ19saWJ3ZWJwJywgW2Rpcm5hbWUoX19maWxlX18pXSkKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgaW1wb3J0IF9saWJ3ZWJwCisgICAgICAgICAgICByZXR1cm4gX2xpYndlYnAKKyAgICAgICAgaWYgZnAgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgX21vZCA9IGltcC5sb2FkX21vZHVsZSgnX2xpYndlYnAnLCBmcCwgcGF0aG5hbWUsIGRlc2NyaXB0aW9uKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgICAgICByZXR1cm4gX21vZAorICAgIF9saWJ3ZWJwID0gc3dpZ19pbXBvcnRfaGVscGVyKCkKKyAgICBkZWwgc3dpZ19pbXBvcnRfaGVscGVyCitlbHNlOgorICAgIGltcG9ydCBfbGlid2VicAorZGVsIHZlcnNpb25faW5mbwordHJ5OgorICAgIF9zd2lnX3Byb3BlcnR5ID0gcHJvcGVydHkKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgcGFzcyAjIFB5dGhvbiA8IDIuMiBkb2Vzbid0IGhhdmUgJ3Byb3BlcnR5Jy4KK2RlZiBfc3dpZ19zZXRhdHRyX25vbmR5bmFtaWMoc2VsZixjbGFzc190eXBlLG5hbWUsdmFsdWUsc3RhdGljPTEpOgorICAgIGlmIChuYW1lID09ICJ0aGlzb3duIik6IHJldHVybiBzZWxmLnRoaXMub3duKHZhbHVlKQorICAgIGlmIChuYW1lID09ICJ0aGlzIik6CisgICAgICAgIGlmIHR5cGUodmFsdWUpLl9fbmFtZV9fID09ICdTd2lnUHlPYmplY3QnOgorICAgICAgICAgICAgc2VsZi5fX2RpY3RfX1tuYW1lXSA9IHZhbHVlCisgICAgICAgICAgICByZXR1cm4KKyAgICBtZXRob2QgPSBjbGFzc190eXBlLl9fc3dpZ19zZXRtZXRob2RzX18uZ2V0KG5hbWUsTm9uZSkKKyAgICBpZiBtZXRob2Q6IHJldHVybiBtZXRob2Qoc2VsZix2YWx1ZSkKKyAgICBpZiAobm90IHN0YXRpYyk6CisgICAgICAgIHNlbGYuX19kaWN0X19bbmFtZV0gPSB2YWx1ZQorICAgIGVsc2U6CisgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKCJZb3UgY2Fubm90IGFkZCBhdHRyaWJ1dGVzIHRvICVzIiAlIHNlbGYpCisKK2RlZiBfc3dpZ19zZXRhdHRyKHNlbGYsY2xhc3NfdHlwZSxuYW1lLHZhbHVlKToKKyAgICByZXR1cm4gX3N3aWdfc2V0YXR0cl9ub25keW5hbWljKHNlbGYsY2xhc3NfdHlwZSxuYW1lLHZhbHVlLDApCisKK2RlZiBfc3dpZ19nZXRhdHRyKHNlbGYsY2xhc3NfdHlwZSxuYW1lKToKKyAgICBpZiAobmFtZSA9PSAidGhpc293biIpOiByZXR1cm4gc2VsZi50aGlzLm93bigpCisgICAgbWV0aG9kID0gY2xhc3NfdHlwZS5fX3N3aWdfZ2V0bWV0aG9kc19fLmdldChuYW1lLE5vbmUpCisgICAgaWYgbWV0aG9kOiByZXR1cm4gbWV0aG9kKHNlbGYpCisgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IobmFtZSkKKworZGVmIF9zd2lnX3JlcHIoc2VsZik6CisgICAgdHJ5OiBzdHJ0aGlzID0gInByb3h5IG9mICIgKyBzZWxmLnRoaXMuX19yZXByX18oKQorICAgIGV4Y2VwdDogc3RydGhpcyA9ICIiCisgICAgcmV0dXJuICI8JXMuJXM7ICVzID4iICUgKHNlbGYuX19jbGFzc19fLl9fbW9kdWxlX18sIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzdHJ0aGlzLCkKKwordHJ5OgorICAgIF9vYmplY3QgPSBvYmplY3QKKyAgICBfbmV3Y2xhc3MgPSAxCitleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgY2xhc3MgX29iamVjdCA6IHBhc3MKKyAgICBfbmV3Y2xhc3MgPSAwCisKKworCitkZWYgV2ViUEdldERlY29kZXJWZXJzaW9uKCk6CisgICIiIldlYlBHZXREZWNvZGVyVmVyc2lvbigpIC0+IGludCIiIgorICByZXR1cm4gX2xpYndlYnAuV2ViUEdldERlY29kZXJWZXJzaW9uKCkKKworZGVmIFdlYlBHZXRJbmZvKCphcmdzKToKKyAgIiIiV2ViUEdldEluZm8odWludDhfdCBkYXRhKSAtPiAod2lkdGgsIGhlaWdodCkiIiIKKyAgcmV0dXJuIF9saWJ3ZWJwLldlYlBHZXRJbmZvKCphcmdzKQorCitkZWYgV2ViUERlY29kZVJHQigqYXJncyk6CisgICIiIldlYlBEZWNvZGVSR0IodWludDhfdCBkYXRhKSAtPiAocmdiLCB3aWR0aCwgaGVpZ2h0KSIiIgorICByZXR1cm4gX2xpYndlYnAuV2ViUERlY29kZVJHQigqYXJncykKKworZGVmIFdlYlBEZWNvZGVSR0JBKCphcmdzKToKKyAgIiIiV2ViUERlY29kZVJHQkEodWludDhfdCBkYXRhKSAtPiAocmdiLCB3aWR0aCwgaGVpZ2h0KSIiIgorICByZXR1cm4gX2xpYndlYnAuV2ViUERlY29kZVJHQkEoKmFyZ3MpCisKK2RlZiBXZWJQRGVjb2RlQVJHQigqYXJncyk6CisgICIiIldlYlBEZWNvZGVBUkdCKHVpbnQ4X3QgZGF0YSkgLT4gKHJnYiwgd2lkdGgsIGhlaWdodCkiIiIKKyAgcmV0dXJuIF9saWJ3ZWJwLldlYlBEZWNvZGVBUkdCKCphcmdzKQorCitkZWYgV2ViUERlY29kZUJHUigqYXJncyk6CisgICIiIldlYlBEZWNvZGVCR1IodWludDhfdCBkYXRhKSAtPiAocmdiLCB3aWR0aCwgaGVpZ2h0KSIiIgorICByZXR1cm4gX2xpYndlYnAuV2ViUERlY29kZUJHUigqYXJncykKKworZGVmIFdlYlBEZWNvZGVCR1JBKCphcmdzKToKKyAgIiIiV2ViUERlY29kZUJHUkEodWludDhfdCBkYXRhKSAtPiAocmdiLCB3aWR0aCwgaGVpZ2h0KSIiIgorICByZXR1cm4gX2xpYndlYnAuV2ViUERlY29kZUJHUkEoKmFyZ3MpCisKK2RlZiBXZWJQR2V0RW5jb2RlclZlcnNpb24oKToKKyAgIiIiV2ViUEdldEVuY29kZXJWZXJzaW9uKCkgLT4gaW50IiIiCisgIHJldHVybiBfbGlid2VicC5XZWJQR2V0RW5jb2RlclZlcnNpb24oKQorCitkZWYgd3JhcF9XZWJQRW5jb2RlUkdCKCphcmdzKToKKyAgIiIicHJpdmF0ZSwgZG8gbm90IGNhbGwgZGlyZWN0bHkuIiIiCisgIHJldHVybiBfbGlid2VicC53cmFwX1dlYlBFbmNvZGVSR0IoKmFyZ3MpCisKK2RlZiB3cmFwX1dlYlBFbmNvZGVCR1IoKmFyZ3MpOgorICAiIiJwcml2YXRlLCBkbyBub3QgY2FsbCBkaXJlY3RseS4iIiIKKyAgcmV0dXJuIF9saWJ3ZWJwLndyYXBfV2ViUEVuY29kZUJHUigqYXJncykKKworZGVmIHdyYXBfV2ViUEVuY29kZVJHQkEoKmFyZ3MpOgorICAiIiJwcml2YXRlLCBkbyBub3QgY2FsbCBkaXJlY3RseS4iIiIKKyAgcmV0dXJuIF9saWJ3ZWJwLndyYXBfV2ViUEVuY29kZVJHQkEoKmFyZ3MpCisKK2RlZiB3cmFwX1dlYlBFbmNvZGVCR1JBKCphcmdzKToKKyAgIiIicHJpdmF0ZSwgZG8gbm90IGNhbGwgZGlyZWN0bHkuIiIiCisgIHJldHVybiBfbGlid2VicC53cmFwX1dlYlBFbmNvZGVCR1JBKCphcmdzKQorCitkZWYgd3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NSR0IoKmFyZ3MpOgorICAiIiJwcml2YXRlLCBkbyBub3QgY2FsbCBkaXJlY3RseS4iIiIKKyAgcmV0dXJuIF9saWJ3ZWJwLndyYXBfV2ViUEVuY29kZUxvc3NsZXNzUkdCKCphcmdzKQorCitkZWYgd3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NCR1IoKmFyZ3MpOgorICAiIiJwcml2YXRlLCBkbyBub3QgY2FsbCBkaXJlY3RseS4iIiIKKyAgcmV0dXJuIF9saWJ3ZWJwLndyYXBfV2ViUEVuY29kZUxvc3NsZXNzQkdSKCphcmdzKQorCitkZWYgd3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NSR0JBKCphcmdzKToKKyAgIiIicHJpdmF0ZSwgZG8gbm90IGNhbGwgZGlyZWN0bHkuIiIiCisgIHJldHVybiBfbGlid2VicC53cmFwX1dlYlBFbmNvZGVMb3NzbGVzc1JHQkEoKmFyZ3MpCisKK2RlZiB3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc0JHUkEoKmFyZ3MpOgorICAiIiJwcml2YXRlLCBkbyBub3QgY2FsbCBkaXJlY3RseS4iIiIKKyAgcmV0dXJuIF9saWJ3ZWJwLndyYXBfV2ViUEVuY29kZUxvc3NsZXNzQkdSQSgqYXJncykKK19VTlVTRUQgPSAxCisKK2RlZiBXZWJQRW5jb2RlUkdCKHJnYiwgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCBxdWFsaXR5X2ZhY3Rvcik6CisgICIiIldlYlBFbmNvZGVSR0IodWludDhfdCByZ2IsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwgZmxvYXQgcXVhbGl0eV9mYWN0b3IpIC0+IGxvc3N5X3dlYnAiIiIKKyAgd2VicCA9IHdyYXBfV2ViUEVuY29kZVJHQigKKyAgICAgIHJnYiwgX1VOVVNFRCwgX1VOVVNFRCwgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCBxdWFsaXR5X2ZhY3RvcikKKyAgaWYgbGVuKHdlYnBbMF0pID09IDA6CisgICAgcmV0dXJuIE5vbmUKKyAgcmV0dXJuIHdlYnBbMF0KKworZGVmIFdlYlBFbmNvZGVSR0JBKHJnYiwgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCBxdWFsaXR5X2ZhY3Rvcik6CisgICIiIldlYlBFbmNvZGVSR0JBKHVpbnQ4X3QgcmdiLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsIGZsb2F0IHF1YWxpdHlfZmFjdG9yKSAtPiBsb3NzeV93ZWJwIiIiCisgIHdlYnAgPSB3cmFwX1dlYlBFbmNvZGVSR0JBKAorICAgICAgcmdiLCBfVU5VU0VELCBfVU5VU0VELCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIHF1YWxpdHlfZmFjdG9yKQorICBpZiBsZW4od2VicFswXSkgPT0gMDoKKyAgICByZXR1cm4gTm9uZQorICByZXR1cm4gd2VicFswXQorCitkZWYgV2ViUEVuY29kZUJHUihyZ2IsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgcXVhbGl0eV9mYWN0b3IpOgorICAiIiJXZWJQRW5jb2RlQkdSKHVpbnQ4X3QgcmdiLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsIGZsb2F0IHF1YWxpdHlfZmFjdG9yKSAtPiBsb3NzeV93ZWJwIiIiCisgIHdlYnAgPSB3cmFwX1dlYlBFbmNvZGVCR1IoCisgICAgICByZ2IsIF9VTlVTRUQsIF9VTlVTRUQsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgcXVhbGl0eV9mYWN0b3IpCisgIGlmIGxlbih3ZWJwWzBdKSA9PSAwOgorICAgIHJldHVybiBOb25lCisgIHJldHVybiB3ZWJwWzBdCisKK2RlZiBXZWJQRW5jb2RlQkdSQShyZ2IsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgcXVhbGl0eV9mYWN0b3IpOgorICAiIiJXZWJQRW5jb2RlQkdSQSh1aW50OF90IHJnYiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLCBmbG9hdCBxdWFsaXR5X2ZhY3RvcikgLT4gbG9zc3lfd2VicCIiIgorICB3ZWJwID0gd3JhcF9XZWJQRW5jb2RlQkdSQSgKKyAgICAgIHJnYiwgX1VOVVNFRCwgX1VOVVNFRCwgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCBxdWFsaXR5X2ZhY3RvcikKKyAgaWYgbGVuKHdlYnBbMF0pID09IDA6CisgICAgcmV0dXJuIE5vbmUKKyAgcmV0dXJuIHdlYnBbMF0KKworZGVmIFdlYlBFbmNvZGVMb3NzbGVzc1JHQihyZ2IsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSk6CisgICIiIldlYlBFbmNvZGVMb3NzbGVzc1JHQih1aW50OF90IHJnYiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlKSAtPiBsb3NzbGVzc193ZWJwIiIiCisgIHdlYnAgPSB3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc1JHQihyZ2IsIF9VTlVTRUQsIF9VTlVTRUQsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSkKKyAgaWYgbGVuKHdlYnBbMF0pID09IDA6CisgICAgcmV0dXJuIE5vbmUKKyAgcmV0dXJuIHdlYnBbMF0KKworZGVmIFdlYlBFbmNvZGVMb3NzbGVzc1JHQkEocmdiLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUpOgorICAiIiJXZWJQRW5jb2RlTG9zc2xlc3NSR0JBKHVpbnQ4X3QgcmdiLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUpIC0+IGxvc3NsZXNzX3dlYnAiIiIKKyAgd2VicCA9IHdyYXBfV2ViUEVuY29kZUxvc3NsZXNzUkdCQShyZ2IsIF9VTlVTRUQsIF9VTlVTRUQsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSkKKyAgaWYgbGVuKHdlYnBbMF0pID09IDA6CisgICAgcmV0dXJuIE5vbmUKKyAgcmV0dXJuIHdlYnBbMF0KKworZGVmIFdlYlBFbmNvZGVMb3NzbGVzc0JHUihyZ2IsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSk6CisgICIiIldlYlBFbmNvZGVMb3NzbGVzc0JHUih1aW50OF90IHJnYiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlKSAtPiBsb3NzbGVzc193ZWJwIiIiCisgIHdlYnAgPSB3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc0JHUihyZ2IsIF9VTlVTRUQsIF9VTlVTRUQsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSkKKyAgaWYgbGVuKHdlYnBbMF0pID09IDA6CisgICAgcmV0dXJuIE5vbmUKKyAgcmV0dXJuIHdlYnBbMF0KKworZGVmIFdlYlBFbmNvZGVMb3NzbGVzc0JHUkEocmdiLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUpOgorICAiIiJXZWJQRW5jb2RlTG9zc2xlc3NCR1JBKHVpbnQ4X3QgcmdiLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUpIC0+IGxvc3NsZXNzX3dlYnAiIiIKKyAgd2VicCA9IHdyYXBfV2ViUEVuY29kZUxvc3NsZXNzQkdSQShyZ2IsIF9VTlVTRUQsIF9VTlVTRUQsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSkKKyAgaWYgbGVuKHdlYnBbMF0pID09IDA6CisgICAgcmV0dXJuIE5vbmUKKyAgcmV0dXJuIHdlYnBbMF0KKworIyBUaGlzIGZpbGUgaXMgY29tcGF0aWJsZSB3aXRoIGJvdGggY2xhc3NpYyBhbmQgbmV3LXN0eWxlIGNsYXNzZXMuCisKKwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3dpZy9saWJ3ZWJwLnN3aWcgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zd2lnL2xpYndlYnAuc3dpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzc0OGI5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3dpZy9saWJ3ZWJwLnN3aWcKQEAgLTAsMCArMSw0MzUgQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBsaWJ3ZWJwIHN3aWcgaW50ZXJmYWNlIGRlZmluaXRpb24KKy8vCisvLyBBdXRob3I6IEphbWVzIFplcm4gKGp6ZXJuQGdvb2dsZS5jb20pCisKKy8qCisgIEdvIGJpbmRpbmdzOgorICAkIHN3aWcgLWdvIFwKKyAgICAgICAgIC1vdXRkaXIgLiBcCisgICAgICAgICAtbyBsaWJ3ZWJwX2dvX3dyYXAuYyBsaWJ3ZWJwLnN3aWcKKworICBKYXZhIGJpbmRpbmdzOgorICAkIG1rZGlyIC1wIGphdmEvY29tL2dvb2dsZS93ZWJwCisgICQgc3dpZyAtamF2YSBcCisgICAgICAgICAtcGFja2FnZSBjb20uZ29vZ2xlLndlYnAgXAorICAgICAgICAgLW91dGRpciBqYXZhL2NvbS9nb29nbGUvd2VicCBcCisgICAgICAgICAtbyBsaWJ3ZWJwX2phdmFfd3JhcC5jIGxpYndlYnAuc3dpZworCisgIFB5dGhvbiBiaW5kaW5nczoKKyAgJCBzd2lnIC1weXRob24gXAorICAgICAgICAgLW91dGRpciAuIFwKKyAgICAgICAgIC1vIGxpYndlYnBfcHl0aG9uX3dyYXAuYyBsaWJ3ZWJwLnN3aWcKKyovCisKKyNpZmRlZiBTV0lHUFlUSE9OCislbW9kdWxlKHBhY2thZ2U9ImNvbS5nb29nbGUud2VicCIpIGxpYndlYnAKKyNlbHNlCislbW9kdWxlIGxpYndlYnAKKyNlbmRpZiAgLyogU1dJR1BZVEhPTiAqLworCislaW5jbHVkZSAiY29uc3RyYWludHMuaSIKKyVpbmNsdWRlICJ0eXBlbWFwcy5pIgorCisjaWZkZWYgU1dJR0dPCislYXBwbHkgKGNoYXIqIFNUUklORywgc2l6ZV90IExFTkdUSCkgeyAoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSkgfQorCislcmVuYW1lKHdyYXBwZWRfV2ViUEdldEluZm8pIFdlYlBHZXRJbmZvKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsIGludCogaGVpZ2h0KTsKKyNlbmRpZiAgLyogU1dJR0dPICovCisKKyNpZmRlZiBTV0lHSkFWQQorJWluY2x1ZGUgImFycmF5c19qYXZhLmkiOworJWluY2x1ZGUgImVudW1zLnN3ZyIgLypOQjogcmVxdWlyZXMgSkRLLTEuNSsKKyAgICAgICAgICAgICAgICAgICAgICAgU2VlOiBodHRwOi8vd3d3LnN3aWcub3JnL0RvYzEuMy9KYXZhLmh0bWwjZW51bWVyYXRpb25zICovCisKKy8vIG1hcCB1aW50OF90KiBzdWNoIHRoYXQgYSBieXRlW10gaXMgdXNlZAorJXsKKyNpbmNsdWRlICJ3ZWJwL3R5cGVzLmgiCislfQorLy8gZnJvbSBhcnJheXNfamF2YS5pIChzaWduZWQgY2hhcikKK0pBVkFfQVJSQVlTX0RFQ0wodWludDhfdCwgamJ5dGUsIEJ5dGUsIFVpbnQ4KQorSkFWQV9BUlJBWVNfSU1QTCh1aW50OF90LCBqYnl0ZSwgQnl0ZSwgVWludDgpCitKQVZBX0FSUkFZU19UWVBFTUFQUyh1aW50OF90LCBieXRlLCBqYnl0ZSwgVWludDgsICJbQiIpCislYXBwbHkgdWludDhfdFtdIHsgdWludDhfdCogfQorI2VuZGlmICAvKiBTV0lHSkFWQSAqLworCisjaWZkZWYgU1dJR1BZVEhPTgorJWFwcGx5IChjaGFyKiBTVFJJTkcsIHNpemVfdCBMRU5HVEgpIHsgKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUpIH0KKyV0eXBlbWFwKG91dCkgdWludDhfdCogeworICAkcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCisgICAgICAoY29uc3QgY2hhciopJDEsCisgICAgICAoJDEgPT0gTlVMTCkgPyAwIDogUmV0dXJuZWRCdWZmZXJTaXplKCIkc3ltbmFtZSIsIGFyZzMsIGFyZzQpKTsKK30KKworJXR5cGVtYXAgKGluKSBjb25zdCB1aW50OF90KiByZ2IgKFB5X2J1ZmZlciByZ2JfYnVmZmVyKSB7CisgIC8vIE5COiB3aXRoIFB5dGhvbiA8IDIuNiB0aGUgb2xkIHN0eWxlIGJ1ZmZlciBwcm90b2NvbCBtYXkgYmUgdXNlZDoKKyAgLy8gUHlfc3NpemVfdCB1bnVzZWQ7CisgIC8vIFB5T2JqZWN0X0FzUmVhZEJ1ZmZlcigkaW5wdXQsIChjb25zdCB2b2lkKiopKCYkMSksICZ1bnVzZWQpOworICBpZiAoIVB5T2JqZWN0X0NoZWNrQnVmZmVyKCRpbnB1dCkpIHsKKyAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImluIG1ldGhvZCAnJHN5bW5hbWUnLCBhcmd1bWVudCAkYXJnbnVtIgorICAgICAgICAgICAgICAgICAgICAgICAgIiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBidWZmZXIgaW50ZXJmYWNlIik7CisgIH0KKyAgaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcigkaW5wdXQsICZyZ2JfYnVmZmVyLCBQeUJVRl9TSU1QTEUpKSB7CisgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbiBtZXRob2QgJyRzeW1uYW1lJywgdW5hYmxlIHRvIGdldCBidWZmZXIgdmlldyIpOworICB9CisgICQxID0gKCQxX2x0eXBlKXJnYl9idWZmZXIuYnVmOworfQorCisldHlwZW1hcChmcmVlYXJnKSBjb25zdCB1aW50OF90KiByZ2IgeworICBQeUJ1ZmZlcl9SZWxlYXNlKCZyZ2JfYnVmZmVyJGFyZ251bSk7Cit9CisKKyVkZWZpbmUgREVDT0RFX0FVVE9ET0MoZnVuYykKKyVmZWF0dXJlKCJhdXRvZG9jIiwgI2Z1bmMgIih1aW50OF90IGRhdGEpIC0+IChyZ2IsIHdpZHRoLCBoZWlnaHQpIikgZnVuYzsKKyVlbmRkZWYKKworJWZlYXR1cmUoImF1dG9kb2MiLCAiMSIpOworREVDT0RFX0FVVE9ET0MoV2ViUERlY29kZVJHQik7CitERUNPREVfQVVUT0RPQyhXZWJQRGVjb2RlUkdCQSk7CitERUNPREVfQVVUT0RPQyhXZWJQRGVjb2RlQVJHQik7CitERUNPREVfQVVUT0RPQyhXZWJQRGVjb2RlQkdSKTsKK0RFQ09ERV9BVVRPRE9DKFdlYlBEZWNvZGVCR1JBKTsKKyVmZWF0dXJlKCJhdXRvZG9jIiwgIldlYlBHZXRJbmZvKHVpbnQ4X3QgZGF0YSkgLT4gKHdpZHRoLCBoZWlnaHQpIikgV2ViUEdldEluZm87CisjZW5kaWYgIC8qIFNXSUdQWVRIT04gKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERlY29kZXIgc3BlY2lmaWMKKworJWFwcGx5IGludCogT1VUUFVUIHsgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQgfQorCitpbnQgV2ViUEdldERlY29kZXJWZXJzaW9uKHZvaWQpOworaW50IFdlYlBHZXRJbmZvKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQpOworCisjaWYgZGVmaW5lZChTV0lHSkFWQSkgfHwgZGVmaW5lZChTV0lHUFlUSE9OKQorCisvLyBmcmVlIHRoZSBidWZmZXIgcmV0dXJuZWQgYnkgdGhlc2UgZnVuY3Rpb25zIGFmdGVyIGNvcHlpbmcgaW50bworLy8gdGhlIG5hdGl2ZSB0eXBlCislbmV3b2JqZWN0IFdlYlBEZWNvZGVSR0I7CislbmV3b2JqZWN0IFdlYlBEZWNvZGVSR0JBOworJW5ld29iamVjdCBXZWJQRGVjb2RlQVJHQjsKKyVuZXdvYmplY3QgV2ViUERlY29kZUJHUjsKKyVuZXdvYmplY3QgV2ViUERlY29kZUJHUkE7CisldHlwZW1hcChuZXdmcmVlKSB1aW50OF90KiAiZnJlZSgkMSk7IgorCit1aW50OF90KiBXZWJQRGVjb2RlUkdCKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsIGludCogaGVpZ2h0KTsKK3VpbnQ4X3QqIFdlYlBEZWNvZGVSR0JBKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCk7Cit1aW50OF90KiBXZWJQRGVjb2RlQVJHQihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQpOwordWludDhfdCogV2ViUERlY29kZUJHUihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCk7Cit1aW50OF90KiBXZWJQRGVjb2RlQkdSQShjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQpOworCisjZW5kaWYgIC8qIFNXSUdKQVZBIHx8IFNXSUdQWVRIT04gKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVuY29kZXIgc3BlY2lmaWMKKworI2lmIGRlZmluZWQoU1dJR0pBVkEpIHx8IGRlZmluZWQoU1dJR1BZVEhPTikKKworaW50IFdlYlBHZXRFbmNvZGVyVmVyc2lvbih2b2lkKTsKKworI2VuZGlmICAvKiBTV0lHSkFWQSB8fCBTV0lHUFlUSE9OICovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBXcmFwcGVyIGNvZGUgYWRkaXRpb25zCisKKyV7CisjaW5jbHVkZSAid2VicC9kZWNvZGUuaCIKKyNpbmNsdWRlICJ3ZWJwL2VuY29kZS5oIgorJX0KKworI2lmZGVmIFNXSUdKQVZBCisleworI2RlZmluZSBGaWxsTWVJbkFzU2l6ZUNhbm5vdEJlRGV0ZXJtaW5lZEF1dG9tYXRpY2FsbHkgXAorICAgIChyZXN1bHQgPyAoamludClSZXR1cm5lZEJ1ZmZlclNpemUoX19GVU5DVElPTl9fLCBhcmczLCBhcmc0KSA6IDApCislfQorI2VuZGlmICAvKiBTV0lHSkFWQSAqLworCisjaWYgZGVmaW5lZChTV0lHSkFWQSkgfHwgZGVmaW5lZChTV0lHUFlUSE9OKQorJXsKK3N0YXRpYyBzaXplX3QgUmV0dXJuZWRCdWZmZXJTaXplKAorICAgIGNvbnN0IGNoYXIqIGZ1bmN0aW9uLCBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCkgeworICBzdGF0aWMgY29uc3Qgc3RydWN0IHNpemVtYXAgeworICAgIGNvbnN0IGNoYXIqIGZ1bmN0aW9uOworICAgIGludCBzaXplX211bHRpcGxpZXI7CisgIH0gc2l6ZV9tYXBbXSA9IHsKKyNpZmRlZiBTV0lHSkFWQQorICAgIHsgIkphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfV2ViUERlY29kZVJHQiIsICAzIH0sCisgICAgeyAiSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV9XZWJQRGVjb2RlUkdCQSIsIDQgfSwKKyAgICB7ICJKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX1dlYlBEZWNvZGVBUkdCIiwgNCB9LAorICAgIHsgIkphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfV2ViUERlY29kZUJHUiIsICAzIH0sCisgICAgeyAiSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV9XZWJQRGVjb2RlQkdSQSIsIDQgfSwKKyAgICB7ICJKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX3dyYXBfMVdlYlBFbmNvZGVSR0IiLCAgMSB9LAorICAgIHsgIkphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfd3JhcF8xV2ViUEVuY29kZUJHUiIsICAxIH0sCisgICAgeyAiSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV93cmFwXzFXZWJQRW5jb2RlUkdCQSIsIDEgfSwKKyAgICB7ICJKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX3dyYXBfMVdlYlBFbmNvZGVCR1JBIiwgMSB9LAorICAgIHsgIkphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfd3JhcF8xV2ViUEVuY29kZUxvc3NsZXNzUkdCIiwgIDEgfSwKKyAgICB7ICJKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX3dyYXBfMVdlYlBFbmNvZGVMb3NzbGVzc0JHUiIsICAxIH0sCisgICAgeyAiSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV93cmFwXzFXZWJQRW5jb2RlTG9zc2xlc3NSR0JBIiwgMSB9LAorICAgIHsgIkphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfd3JhcF8xV2ViUEVuY29kZUxvc3NsZXNzQkdSQSIsIDEgfSwKKyNlbmRpZgorI2lmZGVmIFNXSUdQWVRIT04KKyAgICB7ICJXZWJQRGVjb2RlUkdCIiwgIDMgfSwKKyAgICB7ICJXZWJQRGVjb2RlUkdCQSIsIDQgfSwKKyAgICB7ICJXZWJQRGVjb2RlQVJHQiIsIDQgfSwKKyAgICB7ICJXZWJQRGVjb2RlQkdSIiwgIDMgfSwKKyAgICB7ICJXZWJQRGVjb2RlQkdSQSIsIDQgfSwKKyAgICB7ICJ3cmFwX1dlYlBFbmNvZGVSR0IiLCAgMSB9LAorICAgIHsgIndyYXBfV2ViUEVuY29kZUJHUiIsICAxIH0sCisgICAgeyAid3JhcF9XZWJQRW5jb2RlUkdCQSIsIDEgfSwKKyAgICB7ICJ3cmFwX1dlYlBFbmNvZGVCR1JBIiwgMSB9LAorICAgIHsgIndyYXBfV2ViUEVuY29kZUxvc3NsZXNzUkdCIiwgIDEgfSwKKyAgICB7ICJ3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc0JHUiIsICAxIH0sCisgICAgeyAid3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NSR0JBIiwgMSB9LAorICAgIHsgIndyYXBfV2ViUEVuY29kZUxvc3NsZXNzQkdSQSIsIDEgfSwKKyNlbmRpZgorICAgIHsgTlVMTCwgMCB9CisgIH07CisgIGNvbnN0IHN0cnVjdCBzaXplbWFwKiBwOworICBzaXplX3Qgc2l6ZSA9IDA7CisKKyAgZm9yIChwID0gc2l6ZV9tYXA7IHAtPmZ1bmN0aW9uOyArK3ApIHsKKyAgICBpZiAoIXN0cmNtcChmdW5jdGlvbiwgcC0+ZnVuY3Rpb24pKSB7CisgICAgICBzaXplID0gKndpZHRoICogKmhlaWdodCAqIHAtPnNpemVfbXVsdGlwbGllcjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHJldHVybiBzaXplOworfQorJX0KKworJXsKK3R5cGVkZWYgc2l6ZV90ICgqV2ViUEVuY29kZUZ1bmN0aW9uKShjb25zdCB1aW50OF90KiByZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHF1YWxpdHlfZmFjdG9yLCB1aW50OF90Kiogb3V0cHV0KTsKK3R5cGVkZWYgc2l6ZV90ICgqV2ViUEVuY29kZUxvc3NsZXNzRnVuY3Rpb24pKGNvbnN0IHVpbnQ4X3QqIHJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBvdXRwdXQpOworCitzdGF0aWMgdWludDhfdCogRW5jb2RlTG9zc3koY29uc3QgdWludDhfdCogcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBxdWFsaXR5X2ZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQRW5jb2RlRnVuY3Rpb24gZW5jZm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBvdXRwdXRfc2l6ZSwgaW50KiB1bnVzZWQpIHsKKyAgdWludDhfdCogb3V0cHV0ID0gTlVMTDsKKyAgY29uc3Qgc2l6ZV90IGltYWdlX3NpemUgPQorICAgICAgZW5jZm4ocmdiLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIHF1YWxpdHlfZmFjdG9yLCAmb3V0cHV0KTsKKyAgLy8gdGhlIHZhbHVlcyBvZiBmb2xsb3dpbmcgdHdvIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYnkgUmV0dXJuZWRCdWZmZXJTaXplKCkKKyAgLy8gYXMgJ3dpZHRoJyBhbmQgJ2hlaWdodCcgaW4gdGhlIHNpemUgY2FsY3VsYXRpb24uCisgICpvdXRwdXRfc2l6ZSA9IGltYWdlX3NpemU7CisgICp1bnVzZWQgPSAxOworICByZXR1cm4gaW1hZ2Vfc2l6ZSA/IG91dHB1dCA6IE5VTEw7Cit9CisKK3N0YXRpYyB1aW50OF90KiBFbmNvZGVMb3NzbGVzcyhjb25zdCB1aW50OF90KiByZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBFbmNvZGVMb3NzbGVzc0Z1bmN0aW9uIGVuY2ZuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogb3V0cHV0X3NpemUsIGludCogdW51c2VkKSB7CisgIHVpbnQ4X3QqIG91dHB1dCA9IE5VTEw7CisgIGNvbnN0IHNpemVfdCBpbWFnZV9zaXplID0gZW5jZm4ocmdiLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsICZvdXRwdXQpOworICAvLyB0aGUgdmFsdWVzIG9mIHRoZSBmb2xsb3dpbmcgdHdvIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYnkKKyAgLy8gUmV0dXJuZWRCdWZmZXJTaXplKCkgYXMgJ3dpZHRoJyBhbmQgJ2hlaWdodCcgaW4gdGhlIHNpemUgY2FsY3VsYXRpb24uCisgICpvdXRwdXRfc2l6ZSA9IGltYWdlX3NpemU7CisgICp1bnVzZWQgPSAxOworICByZXR1cm4gaW1hZ2Vfc2l6ZSA/IG91dHB1dCA6IE5VTEw7Cit9CislfQorCisjZW5kaWYgIC8qIFNXSUdKQVZBIHx8IFNXSUdQWVRIT04gKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxpYndlYnAvZW5jb2RlIHdyYXBwZXIgZnVuY3Rpb25zCisKKyNpZiBkZWZpbmVkKFNXSUdKQVZBKSB8fCBkZWZpbmVkKFNXSUdQWVRIT04pCisKKyVhcHBseSBpbnQqIElOUFVUIHsgaW50KiB1bnVzZWQxLCBpbnQqIHVudXNlZDIgfQorJWFwcGx5IGludCogT1VUUFVUIHsgaW50KiBvdXRwdXRfc2l6ZSB9CisKKy8vIGZyZWUgdGhlIGJ1ZmZlciByZXR1cm5lZCBieSB0aGVzZSBmdW5jdGlvbnMgYWZ0ZXIgY29weWluZyBpbnRvCisvLyB0aGUgbmF0aXZlIHR5cGUKKyVuZXdvYmplY3Qgd3JhcF9XZWJQRW5jb2RlUkdCOworJW5ld29iamVjdCB3cmFwX1dlYlBFbmNvZGVCR1I7CislbmV3b2JqZWN0IHdyYXBfV2ViUEVuY29kZVJHQkE7CislbmV3b2JqZWN0IHdyYXBfV2ViUEVuY29kZUJHUkE7CislbmV3b2JqZWN0IHdyYXBfV2ViUEVuY29kZUxvc3NsZXNzUkdCOworJW5ld29iamVjdCB3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc0JHUjsKKyVuZXdvYmplY3Qgd3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NSR0JBOworJW5ld29iamVjdCB3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc0JHUkE7CisKKyNpZmRlZiBTV0lHSkFWQQorLy8gVGhlcmUncyBubyByZWFzb24gdG8gY2FsbCB0aGVzZSBkaXJlY3RseQorJWphdmFtZXRob2Rtb2RpZmllcnMgd3JhcF9XZWJQRW5jb2RlUkdCICJwcml2YXRlIjsKKyVqYXZhbWV0aG9kbW9kaWZpZXJzIHdyYXBfV2ViUEVuY29kZUJHUiAicHJpdmF0ZSI7CislamF2YW1ldGhvZG1vZGlmaWVycyB3cmFwX1dlYlBFbmNvZGVSR0JBICJwcml2YXRlIjsKKyVqYXZhbWV0aG9kbW9kaWZpZXJzIHdyYXBfV2ViUEVuY29kZUJHUkEgInByaXZhdGUiOworJWphdmFtZXRob2Rtb2RpZmllcnMgd3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NSR0IgInByaXZhdGUiOworJWphdmFtZXRob2Rtb2RpZmllcnMgd3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NCR1IgInByaXZhdGUiOworJWphdmFtZXRob2Rtb2RpZmllcnMgd3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NSR0JBICJwcml2YXRlIjsKKyVqYXZhbWV0aG9kbW9kaWZpZXJzIHdyYXBfV2ViUEVuY29kZUxvc3NsZXNzQkdSQSAicHJpdmF0ZSI7CisjZW5kaWYgIC8qIFNXSUdKQVZBICovCisKKyNpZmRlZiBTV0lHUFlUSE9OCisvLyBUaGlzIGF1dG9kb2Mgd2lsbCBzZXJ2ZSBhcyBhIGNhdGNoLWFsbCBmb3Igd3JhcF8qLgorJWZlYXR1cmUoImF1dG9kb2MiLCAicHJpdmF0ZSwgZG8gbm90IGNhbGwgZGlyZWN0bHkuIik7CisjZW5kaWYKKworJWlubGluZSAleworLy8gQ2hhbmdlcyB0aGUgcmV0dXJuIHR5cGUgb2YgV2ViUEVuY29kZSogdG8gbW9yZSBjbG9zZWx5IG1hdGNoIERlY29kZSouCisvLyBUaGlzIGFsc28gbWFrZXMgaXQgZWFzaWVyIHRvIHdyYXAgdGhlIG91dHB1dCBidWZmZXIgaW4gYSBuYXRpdmUgdHlwZSByYXRoZXIKKy8vIHRoYW4gZGVhbGluZyB3aXRoIHRoZSByZXR1cm4gcG9pbnRlci4KKy8vIFRoZSBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgYXJlIHRvIGFsbG93IHJldXNlIG9mIFJldHVybmVkQnVmZmVyU2l6ZSgpLAorLy8gdW51c2VkMiBhbmQgb3V0cHV0X3NpemUgd2lsbCBiZSB1c2VkIGluIHRoaXMgY2FzZS4KKyNkZWZpbmUgTE9TU1lfV1JBUFBFUihGVU5DKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIHVpbnQ4X3QqIHdyYXBfIyNGVU5DKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IHVpbnQ4X3QqIHJnYiwgaW50KiB1bnVzZWQxLCBpbnQqIHVudXNlZDIsIGludCogb3V0cHV0X3NpemUsIFwKKyAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwgZmxvYXQgcXVhbGl0eV9mYWN0b3IpIHsgICAgICAgIFwKKyAgICByZXR1cm4gRW5jb2RlTG9zc3kocmdiLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIHF1YWxpdHlfZmFjdG9yLCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgRlVOQywgb3V0cHV0X3NpemUsIHVudXNlZDIpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworTE9TU1lfV1JBUFBFUihXZWJQRW5jb2RlUkdCKQorTE9TU1lfV1JBUFBFUihXZWJQRW5jb2RlQkdSKQorTE9TU1lfV1JBUFBFUihXZWJQRW5jb2RlUkdCQSkKK0xPU1NZX1dSQVBQRVIoV2ViUEVuY29kZUJHUkEpCisKKyN1bmRlZiBMT1NTWV9XUkFQUEVSCisKKyNkZWZpbmUgTE9TU0xFU1NfV1JBUFBFUihGVU5DKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIHVpbnQ4X3QqIHdyYXBfIyNGVU5DKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IHVpbnQ4X3QqIHJnYiwgaW50KiB1bnVzZWQxLCBpbnQqIHVudXNlZDIsIGludCogb3V0cHV0X3NpemUsIFwKKyAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gRW5jb2RlTG9zc2xlc3MocmdiLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlVOQywgb3V0cHV0X3NpemUsIHVudXNlZDIpOyAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworTE9TU0xFU1NfV1JBUFBFUihXZWJQRW5jb2RlTG9zc2xlc3NSR0IpCitMT1NTTEVTU19XUkFQUEVSKFdlYlBFbmNvZGVMb3NzbGVzc0JHUikKK0xPU1NMRVNTX1dSQVBQRVIoV2ViUEVuY29kZUxvc3NsZXNzUkdCQSkKK0xPU1NMRVNTX1dSQVBQRVIoV2ViUEVuY29kZUxvc3NsZXNzQkdSQSkKKworI3VuZGVmIExPU1NMRVNTX1dSQVBQRVIKKworJX0KKworI2VuZGlmICAvKiBTV0lHSkFWQSB8fCBTV0lHUFlUSE9OICovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBMYW5ndWFnZSBzcGVjaWZpYworCisjaWZkZWYgU1dJR0dPCislaW5zZXJ0KGdvX3dyYXBwZXIpICV7CisKKy8vIFdlYlBHZXRJbmZvIGhhcyAyIG91dHB1dCBwYXJhbWV0ZXJzLCBwcm92aWRlIGEgdmVyc2lvbiBpbiB0aGUgbW9yZSBuYXR1cmFsCisvLyBnbyBpZGlvbToKK2Z1bmMgV2ViUEdldEluZm8od2VicCBbXWJ5dGUpIChvayBib29sLCB3aWR0aCBpbnQsIGhlaWdodCBpbnQpIHsKKyAgICB3IDo9IFtdaW50ezB9CisgICAgaCA6PSBbXWludHswfQorICAgIG9rID0gV3JhcHBlZF9XZWJQR2V0SW5mbyhzdHJpbmcod2VicCksIHcsIGgpICE9IDAKKyAgICB3aWR0aCA9IHdbMF0KKyAgICBoZWlnaHQgPSBoWzBdCisgICAgcmV0dXJuCit9CisKKyV9CisjZW5kaWYgIC8qIFNXSUdHTyAqLworCisjaWZkZWYgU1dJR0pBVkEKKyV7CisvKiBXb3JrIGFyb3VuZCBicm9rZW4gZ2NqIGpuaS5oICovCisjaWZkZWYgX19HQ0pfSk5JX0hfXworIyB1bmRlZiBKTklFWFBPUlQKKyMgZGVmaW5lIEpOSUVYUE9SVAorIyB1bmRlZiBKTklDQUxMCisjIGRlZmluZSBKTklDQUxMCisjZW5kaWYKKyV9CisKKyVwcmFnbWEoamF2YSkgbW9kdWxlY29kZT0leworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVU5VU0VEID0gMTsKKyAgcHJpdmF0ZSBzdGF0aWMgaW50IG91dHB1dFNpemVbXSA9IHsgMCB9OworJX0KKworCislZGVmaW5lIENBTExfRU5DT0RFX0xPU1NZX1dSQVBQRVIoZnVuYykKKyVwcmFnbWEoamF2YSkgbW9kdWxlY29kZT0leworICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBmdW5jKAorICAgICAgYnl0ZVtdIHJnYiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLCBmbG9hdCBxdWFsaXR5X2ZhY3RvcikgeworICAgIHJldHVybiB3cmFwXyMjZnVuYygKKyAgICAgICAgcmdiLCBVTlVTRUQsIFVOVVNFRCwgb3V0cHV0U2l6ZSwgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCBxdWFsaXR5X2ZhY3Rvcik7CisgIH0KKyV9CislZW5kZGVmCisKKyVkZWZpbmUgQ0FMTF9FTkNPREVfTE9TU0xFU1NfV1JBUFBFUihmdW5jKQorJXByYWdtYShqYXZhKSBtb2R1bGVjb2RlPSV7CisgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIGZ1bmMoCisgICAgICBieXRlW10gcmdiLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUpIHsKKyAgICByZXR1cm4gd3JhcF8jI2Z1bmMoCisgICAgICAgIHJnYiwgVU5VU0VELCBVTlVTRUQsIG91dHB1dFNpemUsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSk7CisgIH0KKyV9CislZW5kZGVmCisKK0NBTExfRU5DT0RFX0xPU1NZX1dSQVBQRVIoV2ViUEVuY29kZVJHQikKK0NBTExfRU5DT0RFX0xPU1NZX1dSQVBQRVIoV2ViUEVuY29kZVJHQkEpCitDQUxMX0VOQ09ERV9MT1NTWV9XUkFQUEVSKFdlYlBFbmNvZGVCR1IpCitDQUxMX0VOQ09ERV9MT1NTWV9XUkFQUEVSKFdlYlBFbmNvZGVCR1JBKQorQ0FMTF9FTkNPREVfTE9TU0xFU1NfV1JBUFBFUihXZWJQRW5jb2RlTG9zc2xlc3NSR0IpCitDQUxMX0VOQ09ERV9MT1NTTEVTU19XUkFQUEVSKFdlYlBFbmNvZGVMb3NzbGVzc1JHQkEpCitDQUxMX0VOQ09ERV9MT1NTTEVTU19XUkFQUEVSKFdlYlBFbmNvZGVMb3NzbGVzc0JHUikKK0NBTExfRU5DT0RFX0xPU1NMRVNTX1dSQVBQRVIoV2ViUEVuY29kZUxvc3NsZXNzQkdSQSkKKyNlbmRpZiAgLyogU1dJR0pBVkEgKi8KKworI2lmZGVmIFNXSUdQWVRIT04KKyVweXRob25jb2RlICV7CitfVU5VU0VEID0gMQorJX0KKworJWRlZmluZSBDQUxMX0VOQ09ERV9MT1NTWV9XUkFQUEVSKGZ1bmMpCislcHl0aG9uY29kZSAleworZGVmIGZ1bmMocmdiLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIHF1YWxpdHlfZmFjdG9yKToKKyAgIiIiZnVuYyh1aW50OF90IHJnYiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLCBmbG9hdCBxdWFsaXR5X2ZhY3RvcikgLT4gbG9zc3lfd2VicCIiIgorICB3ZWJwID0gd3JhcF8jI2Z1bmMoCisgICAgICByZ2IsIF9VTlVTRUQsIF9VTlVTRUQsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgcXVhbGl0eV9mYWN0b3IpCisgIGlmIGxlbih3ZWJwWzBdKSA9PSAwOgorICAgIHJldHVybiBOb25lCisgIHJldHVybiB3ZWJwWzBdCislfQorJWVuZGRlZgorCislZGVmaW5lIENBTExfRU5DT0RFX0xPU1NMRVNTX1dSQVBQRVIoZnVuYykKKyVweXRob25jb2RlICV7CitkZWYgZnVuYyhyZ2IsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSk6CisgICIiImZ1bmModWludDhfdCByZ2IsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSkgLT4gbG9zc2xlc3Nfd2VicCIiIgorICB3ZWJwID0gd3JhcF8jI2Z1bmMocmdiLCBfVU5VU0VELCBfVU5VU0VELCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUpCisgIGlmIGxlbih3ZWJwWzBdKSA9PSAwOgorICAgIHJldHVybiBOb25lCisgIHJldHVybiB3ZWJwWzBdCislfQorJWVuZGRlZgorCitDQUxMX0VOQ09ERV9MT1NTWV9XUkFQUEVSKFdlYlBFbmNvZGVSR0IpCitDQUxMX0VOQ09ERV9MT1NTWV9XUkFQUEVSKFdlYlBFbmNvZGVSR0JBKQorQ0FMTF9FTkNPREVfTE9TU1lfV1JBUFBFUihXZWJQRW5jb2RlQkdSKQorQ0FMTF9FTkNPREVfTE9TU1lfV1JBUFBFUihXZWJQRW5jb2RlQkdSQSkKK0NBTExfRU5DT0RFX0xPU1NMRVNTX1dSQVBQRVIoV2ViUEVuY29kZUxvc3NsZXNzUkdCKQorQ0FMTF9FTkNPREVfTE9TU0xFU1NfV1JBUFBFUihXZWJQRW5jb2RlTG9zc2xlc3NSR0JBKQorQ0FMTF9FTkNPREVfTE9TU0xFU1NfV1JBUFBFUihXZWJQRW5jb2RlTG9zc2xlc3NCR1IpCitDQUxMX0VOQ09ERV9MT1NTTEVTU19XUkFQUEVSKFdlYlBFbmNvZGVMb3NzbGVzc0JHUkEpCisjZW5kaWYgIC8qIFNXSUdQWVRIT04gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3N3aWcvbGlid2VicF9nYy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3dpZy9saWJ3ZWJwX2djLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA4YjdmOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3N3aWcvbGlid2VicF9nYy5jCkBAIC0wLDAgKzEsNTIgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRoaXMgZmlsZSB3YXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgU1dJRyAoaHR0cDovL3d3dy5zd2lnLm9yZykuCisgKiBWZXJzaW9uIDIuMC4xMAorICoKKyAqIFRoaXMgZmlsZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgZWFzaWx5IHJlYWRhYmxlIGFuZCBjb250YWlucyBhIG51bWJlciBvZgorICogY29kaW5nIGNvbnZlbnRpb25zIGRlc2lnbmVkIHRvIGltcHJvdmUgcG9ydGFiaWxpdHkgYW5kIGVmZmljaWVuY3kuIERvIG5vdCBtYWtlCisgKiBjaGFuZ2VzIHRvIHRoaXMgZmlsZSB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLS1tb2RpZnkgdGhlIFNXSUcKKyAqIGludGVyZmFjZSBmaWxlIGluc3RlYWQuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBUaGlzIGZpbGUgc2hvdWxkIGJlIGNvbXBpbGVkIHdpdGggNmMvOGMuICAqLworI3ByYWdtYSBkeW5pbXBvcnQgXyBfICJsaWJ3ZWJwX2dvLnNvIgorCisjaW5jbHVkZSAicnVudGltZS5oIgorI2luY2x1ZGUgImNnb2NhbGwuaCIKKworI2lmZGVmIF82NEJJVAorI2RlZmluZSBTV0lHX1BBUk1fU0laRSA4CisjZWxzZQorI2RlZmluZSBTV0lHX1BBUk1fU0laRSA0CisjZW5kaWYKKworI3ByYWdtYSBkeW5pbXBvcnQgX3dyYXBfV2ViUEdldERlY29kZXJWZXJzaW9uIF93cmFwX1dlYlBHZXREZWNvZGVyVmVyc2lvbiAiIgorZXh0ZXJuIHZvaWQgKCpfd3JhcF9XZWJQR2V0RGVjb2RlclZlcnNpb24pKHZvaWQqKTsKK3N0YXRpYyB2b2lkICgqeF93cmFwX1dlYlBHZXREZWNvZGVyVmVyc2lvbikodm9pZCopID0gX3dyYXBfV2ViUEdldERlY29kZXJWZXJzaW9uOworCit2b2lkCivCt1dlYlBHZXREZWNvZGVyVmVyc2lvbihzdHJ1Y3QgeworICB1aW50OCB4W1NXSUdfUEFSTV9TSVpFXTsKK30gcCkKKworeworICBydW50aW1lwrdjZ29jYWxsKHhfd3JhcF9XZWJQR2V0RGVjb2RlclZlcnNpb24sICZwKTsKK30KKworCisKKyNwcmFnbWEgZHluaW1wb3J0IF93cmFwX3dyYXBwZWRfV2ViUEdldEluZm8gX3dyYXBfd3JhcHBlZF9XZWJQR2V0SW5mbyAiIgorZXh0ZXJuIHZvaWQgKCpfd3JhcF93cmFwcGVkX1dlYlBHZXRJbmZvKSh2b2lkKik7CitzdGF0aWMgdm9pZCAoKnhfd3JhcF93cmFwcGVkX1dlYlBHZXRJbmZvKSh2b2lkKikgPSBfd3JhcF93cmFwcGVkX1dlYlBHZXRJbmZvOworCit2b2lkCivCt1dyYXBwZWRfV2ViUEdldEluZm8oc3RydWN0IHsKKyAgdWludDggeFsoMiAqIFNXSUdfUEFSTV9TSVpFKSArICgzICogU1dJR19QQVJNX1NJWkUpICsgKDMgKiBTV0lHX1BBUk1fU0laRSkgKyBTV0lHX1BBUk1fU0laRV07Cit9IHApCisKK3sKKyAgcnVudGltZcK3Y2dvY2FsbCh4X3dyYXBfd3JhcHBlZF9XZWJQR2V0SW5mbywgJnApOworfQorCisKKwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3dpZy9saWJ3ZWJwX2dvX3dyYXAuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3N3aWcvbGlid2VicF9nb193cmFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUxZDUyMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3N3aWcvbGlid2VicF9nb193cmFwLmMKQEAgLTAsMCArMSwyNzQgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRoaXMgZmlsZSB3YXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgU1dJRyAoaHR0cDovL3d3dy5zd2lnLm9yZykuCisgKiBWZXJzaW9uIDIuMC4xMAorICoKKyAqIFRoaXMgZmlsZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgZWFzaWx5IHJlYWRhYmxlIGFuZCBjb250YWlucyBhIG51bWJlciBvZgorICogY29kaW5nIGNvbnZlbnRpb25zIGRlc2lnbmVkIHRvIGltcHJvdmUgcG9ydGFiaWxpdHkgYW5kIGVmZmljaWVuY3kuIERvIG5vdCBtYWtlCisgKiBjaGFuZ2VzIHRvIHRoaXMgZmlsZSB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLS1tb2RpZnkgdGhlIFNXSUcKKyAqIGludGVyZmFjZSBmaWxlIGluc3RlYWQuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBTV0lHTU9EVUxFIGxpYndlYnAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGdlbmVyaWMgU1dJRyBsYWJlbHMgZm9yIG1ldGhvZC92YXJpYWJsZQorICogIGRlY2xhcmF0aW9ucy9hdHRyaWJ1dGVzLCBhbmQgb3RoZXIgY29tcGlsZXIgZGVwZW5kZW50IGxhYmVscy4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIHRlbXBsYXRlIHdvcmthcm91bmQgZm9yIGNvbXBpbGVycyB0aGF0IGNhbm5vdCBjb3JyZWN0bHkgaW1wbGVtZW50IHRoZSBDKysgc3RhbmRhcmQgKi8KKyNpZm5kZWYgU1dJR1RFTVBMQVRFRElTQU1CSUdVQVRPUgorIyBpZiBkZWZpbmVkKF9fU1VOUFJPX0NDKSAmJiAoX19TVU5QUk9fQ0MgPD0gMHg1NjApCisjICBkZWZpbmUgU1dJR1RFTVBMQVRFRElTQU1CSUdVQVRPUiB0ZW1wbGF0ZQorIyBlbGlmIGRlZmluZWQoX19IUF9hQ0MpCisvKiBOZWVkZWQgZXZlbiB3aXRoIGBhQ0MgLUFBJyB3aGVuIGBhQ0MgLVYnIHJlcG9ydHMgSFAgQU5TSSBDKysgQjM5MTBCIEEuMDMuNTUgKi8KKy8qIElmIHdlIGZpbmQgYSBtYXhpbXVtIHZlcnNpb24gdGhhdCByZXF1aXJlcyB0aGlzLCB0aGUgdGVzdCB3b3VsZCBiZSBfX0hQX2FDQyA8PSAzNTUwMCBmb3IgQS4wMy41NSAqLworIyAgZGVmaW5lIFNXSUdURU1QTEFURURJU0FNQklHVUFUT1IgdGVtcGxhdGUKKyMgZWxzZQorIyAgZGVmaW5lIFNXSUdURU1QTEFURURJU0FNQklHVUFUT1IKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBpbmxpbmUgYXR0cmlidXRlICovCisjaWZuZGVmIFNXSUdJTkxJTkUKKyMgaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgKGRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykpCisjICAgZGVmaW5lIFNXSUdJTkxJTkUgaW5saW5lCisjIGVsc2UKKyMgICBkZWZpbmUgU1dJR0lOTElORQorIyBlbmRpZgorI2VuZGlmCisKKy8qIGF0dHJpYnV0ZSByZWNvZ25pc2VkIGJ5IHNvbWUgY29tcGlsZXJzIHRvIGF2b2lkICd1bnVzZWQnIHdhcm5pbmdzICovCisjaWZuZGVmIFNXSUdVTlVTRUQKKyMgaWYgZGVmaW5lZChfX0dOVUNfXykKKyMgICBpZiAhKGRlZmluZWQoX19jcGx1c3BsdXMpKSB8fCAoX19HTlVDX18gPiAzIHx8IChfX0dOVUNfXyA9PSAzICYmIF9fR05VQ19NSU5PUl9fID49IDQpKQorIyAgICAgZGVmaW5lIFNXSUdVTlVTRUQgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKQorIyAgIGVsc2UKKyMgICAgIGRlZmluZSBTV0lHVU5VU0VECisjICAgZW5kaWYKKyMgZWxpZiBkZWZpbmVkKF9fSUNDKQorIyAgIGRlZmluZSBTV0lHVU5VU0VEIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSkKKyMgZWxzZQorIyAgIGRlZmluZSBTV0lHVU5VU0VECisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBTV0lHX01TQ19VTlNVUFBSRVNTXzQ1MDUKKyMgaWYgZGVmaW5lZChfTVNDX1ZFUikKKyMgICBwcmFnbWEgd2FybmluZyhkaXNhYmxlIDogNDUwNSkgLyogdW5yZWZlcmVuY2VkIGxvY2FsIGZ1bmN0aW9uIGhhcyBiZWVuIHJlbW92ZWQgKi8KKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFNXSUdVTlVTRURQQVJNCisjIGlmZGVmIF9fY3BsdXNwbHVzCisjICAgZGVmaW5lIFNXSUdVTlVTRURQQVJNKHApCisjIGVsc2UKKyMgICBkZWZpbmUgU1dJR1VOVVNFRFBBUk0ocCkgcCBTV0lHVU5VU0VECisjIGVuZGlmCisjZW5kaWYKKworLyogaW50ZXJuYWwgU1dJRyBtZXRob2QgKi8KKyNpZm5kZWYgU1dJR0lOVEVSTgorIyBkZWZpbmUgU1dJR0lOVEVSTiBzdGF0aWMgU1dJR1VOVVNFRAorI2VuZGlmCisKKy8qIGludGVybmFsIGlubGluZSBTV0lHIG1ldGhvZCAqLworI2lmbmRlZiBTV0lHSU5URVJOSU5MSU5FCisjIGRlZmluZSBTV0lHSU5URVJOSU5MSU5FIFNXSUdJTlRFUk4gU1dJR0lOTElORQorI2VuZGlmCisKKy8qIGV4cG9ydGluZyBtZXRob2RzICovCisjaWYgKF9fR05VQ19fID49IDQpIHx8IChfX0dOVUNfXyA9PSAzICYmIF9fR05VQ19NSU5PUl9fID49IDQpCisjICBpZm5kZWYgR0NDX0hBU0NMQVNTVklTSUJJTElUWQorIyAgICBkZWZpbmUgR0NDX0hBU0NMQVNTVklTSUJJTElUWQorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFNXSUdFWFBPUlQKKyMgaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19XSU4zMl9fKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCisjICAgaWYgZGVmaW5lZChTVEFUSUNfTElOS0VEKQorIyAgICAgZGVmaW5lIFNXSUdFWFBPUlQKKyMgICBlbHNlCisjICAgICBkZWZpbmUgU1dJR0VYUE9SVCBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyMgICBlbmRpZgorIyBlbHNlCisjICAgaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChHQ0NfSEFTQ0xBU1NWSVNJQklMSVRZKQorIyAgICAgZGVmaW5lIFNXSUdFWFBPUlQgX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpCisjICAgZWxzZQorIyAgICAgZGVmaW5lIFNXSUdFWFBPUlQKKyMgICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKy8qIGNhbGxpbmcgY29udmVudGlvbnMgZm9yIFdpbmRvd3MgKi8KKyNpZm5kZWYgU1dJR1NURENBTEwKKyMgaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19XSU4zMl9fKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCisjICAgZGVmaW5lIFNXSUdTVERDQUxMIF9fc3RkY2FsbAorIyBlbHNlCisjICAgZGVmaW5lIFNXSUdTVERDQUxMCisjIGVuZGlmCisjZW5kaWYKKworLyogRGVhbCB3aXRoIE1pY3Jvc29mdCdzIGF0dGVtcHQgYXQgZGVwcmVjYXRpbmcgQyBzdGFuZGFyZCBydW50aW1lIGZ1bmN0aW9ucyAqLworI2lmICFkZWZpbmVkKFNXSUdfTk9fQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUpICYmIGRlZmluZWQoX01TQ19WRVIpICYmICFkZWZpbmVkKF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSkKKyMgZGVmaW5lIF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURQorI2VuZGlmCisKKy8qIERlYWwgd2l0aCBNaWNyb3NvZnQncyBhdHRlbXB0IGF0IGRlcHJlY2F0aW5nIG1ldGhvZHMgaW4gdGhlIHN0YW5kYXJkIEMrKyBsaWJyYXJ5ICovCisjaWYgIWRlZmluZWQoU1dJR19OT19TQ0xfU0VDVVJFX05PX0RFUFJFQ0FURSkgJiYgZGVmaW5lZChfTVNDX1ZFUikgJiYgIWRlZmluZWQoX1NDTF9TRUNVUkVfTk9fREVQUkVDQVRFKQorIyBkZWZpbmUgX1NDTF9TRUNVUkVfTk9fREVQUkVDQVRFCisjZW5kaWYKKworCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisKKwordHlwZWRlZiBsb25nIGxvbmcgaW50Z287Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1aW50Z287CisKKworCit0eXBlZGVmIHN0cnVjdCB7IGNoYXIgKnA7IGludGdvIG47IH0gX2dvc3RyaW5nXzsKK3R5cGVkZWYgc3RydWN0IHsgdm9pZCogYXJyYXk7IGludGdvIGxlbjsgaW50Z28gY2FwOyB9IF9nb3NsaWNlXzsKKworCisKKworI2RlZmluZSBzd2lnZ29fc2l6ZV9hc3NlcnRfZXEoeCwgeSwgbmFtZSkgdHlwZWRlZiBjaGFyIG5hbWVbKHgteSkqKHgteSkqLTIrMV07CisjZGVmaW5lIHN3aWdnb19zaXplX2Fzc2VydCh0LCBuKSBzd2lnZ29fc2l6ZV9hc3NlcnRfZXEoc2l6ZW9mKHQpLCBuLCBzd2lnZ29fc2l6ZW9mXyMjdCMjX2lzX25vdF8jI24pCisKK3N3aWdnb19zaXplX2Fzc2VydChjaGFyLCAxKQorc3dpZ2dvX3NpemVfYXNzZXJ0KHNob3J0LCAyKQorc3dpZ2dvX3NpemVfYXNzZXJ0KGludCwgNCkKK3R5cGVkZWYgbG9uZyBsb25nIHN3aWdnb19sb25nX2xvbmc7Citzd2lnZ29fc2l6ZV9hc3NlcnQoc3dpZ2dvX2xvbmdfbG9uZywgOCkKK3N3aWdnb19zaXplX2Fzc2VydChmbG9hdCwgNCkKK3N3aWdnb19zaXplX2Fzc2VydChkb3VibGUsIDgpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKK2V4dGVybiB2b2lkIGNyb3NzY2FsbDIodm9pZCAoKmZuKSh2b2lkICosIGludCksIHZvaWQgKiwgaW50KTsKK2V4dGVybiB2b2lkIF9jZ29fYWxsb2NhdGUodm9pZCAqLCBpbnQpOworZXh0ZXJuIHZvaWQgX2Nnb19wYW5pYyh2b2lkICosIGludCk7CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCAqX3N3aWdfZ29hbGxvY2F0ZShzaXplX3QgbGVuKSB7CisgIHN0cnVjdCB7CisgICAgc2l6ZV90IGxlbjsKKyAgICB2b2lkICpyZXQ7CisgIH0gYTsKKyAgYS5sZW4gPSBsZW47CisgIGNyb3NzY2FsbDIoX2Nnb19hbGxvY2F0ZSwgJmEsIChpbnQpIHNpemVvZiBhKTsKKyAgcmV0dXJuIGEucmV0OworfQorCitzdGF0aWMgdm9pZCBfc3dpZ19nb3BhbmljKGNvbnN0IGNoYXIgKnApIHsKKyAgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyICpwOworICB9IGE7CisgIGEucCA9IHA7CisgIGNyb3NzY2FsbDIoX2Nnb19wYW5pYywgJmEsIChpbnQpIHNpemVvZiBhKTsKK30KKworCisKKworc3RhdGljIF9nb3N0cmluZ18gX3N3aWdfbWFrZWdvc3RyaW5nKGNvbnN0IGNoYXIgKnAsIHNpemVfdCBsKSB7CisgIF9nb3N0cmluZ18gcmV0OworICByZXQucCA9IChjaGFyKilfc3dpZ19nb2FsbG9jYXRlKGwgKyAxKTsKKyAgbWVtY3B5KHJldC5wLCBwLCBsKTsKKyAgcmV0Lm4gPSBsOworICByZXR1cm4gcmV0OworfQorCisjZGVmaW5lIFNXSUdfY29udHJhY3RfYXNzZXJ0KGV4cHIsIG1zZykgXAorICBpZiAoIShleHByKSkgeyBfc3dpZ19nb3BhbmljKG1zZyk7IH0gZWxzZQorCisKKyNkZWZpbmUgU1dJR19leGNlcHRpb24oY29kZSwgbXNnKSBfc3dpZ19nb3BhbmljKG1zZykKKworCisjaW5jbHVkZSAid2VicC9kZWNvZGUuaCIKKyNpbmNsdWRlICJ3ZWJwL2VuY29kZS5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3ZvaWQKK193cmFwX1dlYlBHZXREZWNvZGVyVmVyc2lvbih2b2lkICpzd2lnX3YpCit7CisgIGludCByZXN1bHQ7CisKKyAgc3RydWN0IHN3aWdhcmdzIHsKKyAgICBsb25nIDogMDsKKyAgICBpbnRnbyByZXN1bHQ7CisgIH0gKnN3aWdfYSA9IChzdHJ1Y3Qgc3dpZ2FyZ3MgKikgc3dpZ192OworCisKKyAgcmVzdWx0ID0gKGludClXZWJQR2V0RGVjb2RlclZlcnNpb24oKTsKKyAgc3dpZ19hLT5yZXN1bHQgPSByZXN1bHQ7Cit9CisKKwordm9pZAorX3dyYXBfd3JhcHBlZF9XZWJQR2V0SW5mbyh2b2lkICpzd2lnX3YpCit7CisgIHVpbnQ4X3QgKmFyZzEgPSAodWludDhfdCAqKSAwIDsKKyAgc2l6ZV90IGFyZzIgOworICBpbnQgKmFyZzMgPSAoaW50ICopIDAgOworICBpbnQgKmFyZzQgPSAoaW50ICopIDAgOworICBpbnQgdGVtcDMgOworICBpbnQgdGVtcDQgOworICBpbnQgcmVzdWx0OworCisgIHN0cnVjdCBzd2lnYXJncyB7CisgICAgX2dvc3RyaW5nXyBhcmcxOworICAgIF9nb3NsaWNlXyBhcmczOworICAgIF9nb3NsaWNlXyBhcmc0OworICAgIGxvbmcgOiAwOworICAgIGludGdvIHJlc3VsdDsKKyAgfSAqc3dpZ19hID0gKHN0cnVjdCBzd2lnYXJncyAqKSBzd2lnX3Y7CisKKworICBhcmcxID0gKHVpbnQ4X3QgKilzd2lnX2EtPmFyZzEucDsKKyAgYXJnMiA9IChzaXplX3Qpc3dpZ19hLT5hcmcxLm47CisKKyAgeworICAgIGlmIChzd2lnX2EtPmFyZzMubGVuID09IDApIHsKKyAgICAgIF9zd2lnX2dvcGFuaWMoImFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCAxIGVsZW1lbnQiKTsKKyAgICB9CisgICAgYXJnMyA9ICZ0ZW1wMzsKKyAgfQorICB7CisgICAgaWYgKHN3aWdfYS0+YXJnNC5sZW4gPT0gMCkgeworICAgICAgX3N3aWdfZ29wYW5pYygiYXJyYXkgbXVzdCBjb250YWluIGF0IGxlYXN0IDEgZWxlbWVudCIpOworICAgIH0KKyAgICBhcmc0ID0gJnRlbXA0OworICB9CisKKyAgcmVzdWx0ID0gKGludClXZWJQR2V0SW5mbygodWludDhfdCBjb25zdCAqKWFyZzEsYXJnMixhcmczLGFyZzQpOworICBzd2lnX2EtPnJlc3VsdCA9IHJlc3VsdDsKKyAgeworICAgIGludCogYSA9IChpbnQgKikgc3dpZ19hLT5hcmczLmFycmF5OworICAgIGFbMF0gPSB0ZW1wMzsKKyAgfQorICB7CisgICAgaW50KiBhID0gKGludCAqKSBzd2lnX2EtPmFyZzQuYXJyYXk7CisgICAgYVswXSA9IHRlbXA0OworICB9CisKKworfQorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3N3aWcvbGlid2VicF9qYXZhX3dyYXAuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3N3aWcvbGlid2VicF9qYXZhX3dyYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGQ0YjEzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3dpZy9saWJ3ZWJwX2phdmFfd3JhcC5jCkBAIC0wLDAgKzEsMTc2NSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVGhpcyBmaWxlIHdhcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBTV0lHIChodHRwOi8vd3d3LnN3aWcub3JnKS4KKyAqIFZlcnNpb24gMi4wLjQKKyAqCisgKiBUaGlzIGZpbGUgaXMgbm90IGludGVuZGVkIHRvIGJlIGVhc2lseSByZWFkYWJsZSBhbmQgY29udGFpbnMgYSBudW1iZXIgb2YKKyAqIGNvZGluZyBjb252ZW50aW9ucyBkZXNpZ25lZCB0byBpbXByb3ZlIHBvcnRhYmlsaXR5IGFuZCBlZmZpY2llbmN5LiBEbyBub3QgbWFrZQorICogY2hhbmdlcyB0byB0aGlzIGZpbGUgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy0tbW9kaWZ5IHRoZSBTV0lHCisgKiBpbnRlcmZhY2UgZmlsZSBpbnN0ZWFkLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBTV0lHSkFWQQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIFRoaXMgc2VjdGlvbiBjb250YWlucyBnZW5lcmljIFNXSUcgbGFiZWxzIGZvciBtZXRob2QvdmFyaWFibGUKKyAqICBkZWNsYXJhdGlvbnMvYXR0cmlidXRlcywgYW5kIG90aGVyIGNvbXBpbGVyIGRlcGVuZGVudCBsYWJlbHMuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiB0ZW1wbGF0ZSB3b3JrYXJvdW5kIGZvciBjb21waWxlcnMgdGhhdCBjYW5ub3QgY29ycmVjdGx5IGltcGxlbWVudCB0aGUgQysrIHN0YW5kYXJkICovCisjaWZuZGVmIFNXSUdURU1QTEFURURJU0FNQklHVUFUT1IKKyMgaWYgZGVmaW5lZChfX1NVTlBST19DQykgJiYgKF9fU1VOUFJPX0NDIDw9IDB4NTYwKQorIyAgZGVmaW5lIFNXSUdURU1QTEFURURJU0FNQklHVUFUT1IgdGVtcGxhdGUKKyMgZWxpZiBkZWZpbmVkKF9fSFBfYUNDKQorLyogTmVlZGVkIGV2ZW4gd2l0aCBgYUNDIC1BQScgd2hlbiBgYUNDIC1WJyByZXBvcnRzIEhQIEFOU0kgQysrIEIzOTEwQiBBLjAzLjU1ICovCisvKiBJZiB3ZSBmaW5kIGEgbWF4aW11bSB2ZXJzaW9uIHRoYXQgcmVxdWlyZXMgdGhpcywgdGhlIHRlc3Qgd291bGQgYmUgX19IUF9hQ0MgPD0gMzU1MDAgZm9yIEEuMDMuNTUgKi8KKyMgIGRlZmluZSBTV0lHVEVNUExBVEVESVNBTUJJR1VBVE9SIHRlbXBsYXRlCisjIGVsc2UKKyMgIGRlZmluZSBTV0lHVEVNUExBVEVESVNBTUJJR1VBVE9SCisjIGVuZGlmCisjZW5kaWYKKworLyogaW5saW5lIGF0dHJpYnV0ZSAqLworI2lmbmRlZiBTV0lHSU5MSU5FCisjIGlmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IChkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pKQorIyAgIGRlZmluZSBTV0lHSU5MSU5FIGlubGluZQorIyBlbHNlCisjICAgZGVmaW5lIFNXSUdJTkxJTkUKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBhdHRyaWJ1dGUgcmVjb2duaXNlZCBieSBzb21lIGNvbXBpbGVycyB0byBhdm9pZCAndW51c2VkJyB3YXJuaW5ncyAqLworI2lmbmRlZiBTV0lHVU5VU0VECisjIGlmIGRlZmluZWQoX19HTlVDX18pCisjICAgaWYgIShkZWZpbmVkKF9fY3BsdXNwbHVzKSkgfHwgKF9fR05VQ19fID4gMyB8fCAoX19HTlVDX18gPT0gMyAmJiBfX0dOVUNfTUlOT1JfXyA+PSA0KSkKKyMgICAgIGRlZmluZSBTV0lHVU5VU0VEIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSkKKyMgICBlbHNlCisjICAgICBkZWZpbmUgU1dJR1VOVVNFRAorIyAgIGVuZGlmCisjIGVsaWYgZGVmaW5lZChfX0lDQykKKyMgICBkZWZpbmUgU1dJR1VOVVNFRCBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpCisjIGVsc2UKKyMgICBkZWZpbmUgU1dJR1VOVVNFRAorIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgU1dJR19NU0NfVU5TVVBQUkVTU180NTA1CisjIGlmIGRlZmluZWQoX01TQ19WRVIpCisjICAgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZSA6IDQ1MDUpIC8qIHVucmVmZXJlbmNlZCBsb2NhbCBmdW5jdGlvbiBoYXMgYmVlbiByZW1vdmVkICovCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBTV0lHVU5VU0VEUEFSTQorIyBpZmRlZiBfX2NwbHVzcGx1cworIyAgIGRlZmluZSBTV0lHVU5VU0VEUEFSTShwKQorIyBlbHNlCisjICAgZGVmaW5lIFNXSUdVTlVTRURQQVJNKHApIHAgU1dJR1VOVVNFRAorIyBlbmRpZgorI2VuZGlmCisKKy8qIGludGVybmFsIFNXSUcgbWV0aG9kICovCisjaWZuZGVmIFNXSUdJTlRFUk4KKyMgZGVmaW5lIFNXSUdJTlRFUk4gc3RhdGljIFNXSUdVTlVTRUQKKyNlbmRpZgorCisvKiBpbnRlcm5hbCBpbmxpbmUgU1dJRyBtZXRob2QgKi8KKyNpZm5kZWYgU1dJR0lOVEVSTklOTElORQorIyBkZWZpbmUgU1dJR0lOVEVSTklOTElORSBTV0lHSU5URVJOIFNXSUdJTkxJTkUKKyNlbmRpZgorCisvKiBleHBvcnRpbmcgbWV0aG9kcyAqLworI2lmIChfX0dOVUNfXyA+PSA0KSB8fCAoX19HTlVDX18gPT0gMyAmJiBfX0dOVUNfTUlOT1JfXyA+PSA0KQorIyAgaWZuZGVmIEdDQ19IQVNDTEFTU1ZJU0lCSUxJVFkKKyMgICAgZGVmaW5lIEdDQ19IQVNDTEFTU1ZJU0lCSUxJVFkKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBTV0lHRVhQT1JUCisjIGlmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQorIyAgIGlmIGRlZmluZWQoU1RBVElDX0xJTktFRCkKKyMgICAgIGRlZmluZSBTV0lHRVhQT1JUCisjICAgZWxzZQorIyAgICAgZGVmaW5lIFNXSUdFWFBPUlQgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjICAgZW5kaWYKKyMgZWxzZQorIyAgIGlmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoR0NDX0hBU0NMQVNTVklTSUJJTElUWSkKKyMgICAgIGRlZmluZSBTV0lHRVhQT1JUIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKQorIyAgIGVsc2UKKyMgICAgIGRlZmluZSBTV0lHRVhQT1JUCisjICAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBjYWxsaW5nIGNvbnZlbnRpb25zIGZvciBXaW5kb3dzICovCisjaWZuZGVmIFNXSUdTVERDQUxMCisjIGlmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQorIyAgIGRlZmluZSBTV0lHU1REQ0FMTCBfX3N0ZGNhbGwKKyMgZWxzZQorIyAgIGRlZmluZSBTV0lHU1REQ0FMTAorIyBlbmRpZgorI2VuZGlmCisKKy8qIERlYWwgd2l0aCBNaWNyb3NvZnQncyBhdHRlbXB0IGF0IGRlcHJlY2F0aW5nIEMgc3RhbmRhcmQgcnVudGltZSBmdW5jdGlvbnMgKi8KKyNpZiAhZGVmaW5lZChTV0lHX05PX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFKSAmJiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAhZGVmaW5lZChfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUpCisjIGRlZmluZSBfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUKKyNlbmRpZgorCisvKiBEZWFsIHdpdGggTWljcm9zb2Z0J3MgYXR0ZW1wdCBhdCBkZXByZWNhdGluZyBtZXRob2RzIGluIHRoZSBzdGFuZGFyZCBDKysgbGlicmFyeSAqLworI2lmICFkZWZpbmVkKFNXSUdfTk9fU0NMX1NFQ1VSRV9OT19ERVBSRUNBVEUpICYmIGRlZmluZWQoX01TQ19WRVIpICYmICFkZWZpbmVkKF9TQ0xfU0VDVVJFX05PX0RFUFJFQ0FURSkKKyMgZGVmaW5lIF9TQ0xfU0VDVVJFX05PX0RFUFJFQ0FURQorI2VuZGlmCisKKworCisvKiBGaXggZm9yIGpsb25nIG9uIHNvbWUgdmVyc2lvbnMgb2YgZ2NjIG9uIFdpbmRvd3MgKi8KKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX0lOVEVMX0NPTVBJTEVSKQorICB0eXBlZGVmIGxvbmcgbG9uZyBfX2ludDY0OworI2VuZGlmCisKKy8qIEZpeCBmb3Igamxvbmcgb24gNjQtYml0IHg4NiBTb2xhcmlzICovCisjaWYgZGVmaW5lZChfX3g4Nl82NCkKKyMgaWZkZWYgX0xQNjQKKyMgICB1bmRlZiBfTFA2NAorIyBlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlIDxqbmkuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworCisvKiBTdXBwb3J0IGZvciB0aHJvd2luZyBKYXZhIGV4Y2VwdGlvbnMgKi8KK3R5cGVkZWYgZW51bSB7CisgIFNXSUdfSmF2YU91dE9mTWVtb3J5RXJyb3IgPSAxLAorICBTV0lHX0phdmFJT0V4Y2VwdGlvbiwKKyAgU1dJR19KYXZhUnVudGltZUV4Y2VwdGlvbiwKKyAgU1dJR19KYXZhSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiwKKyAgU1dJR19KYXZhQXJpdGhtZXRpY0V4Y2VwdGlvbiwKKyAgU1dJR19KYXZhSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLAorICBTV0lHX0phdmFOdWxsUG9pbnRlckV4Y2VwdGlvbiwKKyAgU1dJR19KYXZhRGlyZWN0b3JQdXJlVmlydHVhbCwKKyAgU1dJR19KYXZhVW5rbm93bkVycm9yCit9IFNXSUdfSmF2YUV4Y2VwdGlvbkNvZGVzOworCit0eXBlZGVmIHN0cnVjdCB7CisgIFNXSUdfSmF2YUV4Y2VwdGlvbkNvZGVzIGNvZGU7CisgIGNvbnN0IGNoYXIgKmphdmFfZXhjZXB0aW9uOworfSBTV0lHX0phdmFFeGNlcHRpb25zX3Q7CisKKworc3RhdGljIHZvaWQgU1dJR1VOVVNFRCBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihKTklFbnYgKmplbnYsIFNXSUdfSmF2YUV4Y2VwdGlvbkNvZGVzIGNvZGUsIGNvbnN0IGNoYXIgKm1zZykgeworICBqY2xhc3MgZXhjZXA7CisgIHN0YXRpYyBjb25zdCBTV0lHX0phdmFFeGNlcHRpb25zX3QgamF2YV9leGNlcHRpb25zW10gPSB7CisgICAgeyBTV0lHX0phdmFPdXRPZk1lbW9yeUVycm9yLCAiamF2YS9sYW5nL091dE9mTWVtb3J5RXJyb3IiIH0sCisgICAgeyBTV0lHX0phdmFJT0V4Y2VwdGlvbiwgImphdmEvaW8vSU9FeGNlcHRpb24iIH0sCisgICAgeyBTV0lHX0phdmFSdW50aW1lRXhjZXB0aW9uLCAiamF2YS9sYW5nL1J1bnRpbWVFeGNlcHRpb24iIH0sCisgICAgeyBTV0lHX0phdmFJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLCAiamF2YS9sYW5nL0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iIH0sCisgICAgeyBTV0lHX0phdmFBcml0aG1ldGljRXhjZXB0aW9uLCAiamF2YS9sYW5nL0FyaXRobWV0aWNFeGNlcHRpb24iIH0sCisgICAgeyBTV0lHX0phdmFJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sICJqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiB9LAorICAgIHsgU1dJR19KYXZhTnVsbFBvaW50ZXJFeGNlcHRpb24sICJqYXZhL2xhbmcvTnVsbFBvaW50ZXJFeGNlcHRpb24iIH0sCisgICAgeyBTV0lHX0phdmFEaXJlY3RvclB1cmVWaXJ0dWFsLCAiamF2YS9sYW5nL1J1bnRpbWVFeGNlcHRpb24iIH0sCisgICAgeyBTV0lHX0phdmFVbmtub3duRXJyb3IsICAiamF2YS9sYW5nL1Vua25vd25FcnJvciIgfSwKKyAgICB7IChTV0lHX0phdmFFeGNlcHRpb25Db2RlcykwLCAgImphdmEvbGFuZy9Vbmtub3duRXJyb3IiIH0KKyAgfTsKKyAgY29uc3QgU1dJR19KYXZhRXhjZXB0aW9uc190ICpleGNlcHRfcHRyID0gamF2YV9leGNlcHRpb25zOworCisgIHdoaWxlIChleGNlcHRfcHRyLT5jb2RlICE9IGNvZGUgJiYgZXhjZXB0X3B0ci0+Y29kZSkKKyAgICBleGNlcHRfcHRyKys7CisKKyAgKCpqZW52KS0+RXhjZXB0aW9uQ2xlYXIoamVudik7CisgIGV4Y2VwID0gKCpqZW52KS0+RmluZENsYXNzKGplbnYsIGV4Y2VwdF9wdHItPmphdmFfZXhjZXB0aW9uKTsKKyAgaWYgKGV4Y2VwKQorICAgICgqamVudiktPlRocm93TmV3KGplbnYsIGV4Y2VwLCBtc2cpOworfQorCisKKy8qIENvbnRyYWN0IHN1cHBvcnQgKi8KKworI2RlZmluZSBTV0lHX2NvbnRyYWN0X2Fzc2VydChudWxscmV0dXJuLCBleHByLCBtc2cpIGlmICghKGV4cHIpKSB7U1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBtc2cpOyByZXR1cm4gbnVsbHJldHVybjsgfSBlbHNlCisKKy8qICBFcnJvcnMgaW4gU1dJRyAqLworI2RlZmluZSAgU1dJR19Vbmtub3duRXJyb3IgICAgICAgICAtMQorI2RlZmluZSAgU1dJR19JT0Vycm9yICAgICAgICAgICAgICAtMgorI2RlZmluZSAgU1dJR19SdW50aW1lRXJyb3IgICAgICAgICAtMworI2RlZmluZSAgU1dJR19JbmRleEVycm9yICAgICAgICAgICAtNAorI2RlZmluZSAgU1dJR19UeXBlRXJyb3IgICAgICAgICAgICAtNQorI2RlZmluZSAgU1dJR19EaXZpc2lvbkJ5WmVybyAgICAgICAtNgorI2RlZmluZSAgU1dJR19PdmVyZmxvd0Vycm9yICAgICAgICAtNworI2RlZmluZSAgU1dJR19TeW50YXhFcnJvciAgICAgICAgICAtOAorI2RlZmluZSAgU1dJR19WYWx1ZUVycm9yICAgICAgICAgICAtOQorI2RlZmluZSAgU1dJR19TeXN0ZW1FcnJvciAgICAgICAgICAtMTAKKyNkZWZpbmUgIFNXSUdfQXR0cmlidXRlRXJyb3IgICAgICAgLTExCisjZGVmaW5lICBTV0lHX01lbW9yeUVycm9yICAgICAgICAgIC0xMgorI2RlZmluZSAgU1dJR19OdWxsUmVmZXJlbmNlRXJyb3IgICAtMTMKKworCisKKworU1dJR0lOVEVSTiB2b2lkIFNXSUdfSmF2YUV4Y2VwdGlvbihKTklFbnYgKmplbnYsIGludCBjb2RlLCBjb25zdCBjaGFyICptc2cpIHsKKyAgU1dJR19KYXZhRXhjZXB0aW9uQ29kZXMgZXhjZXB0aW9uX2NvZGUgPSBTV0lHX0phdmFVbmtub3duRXJyb3I7CisgIHN3aXRjaChjb2RlKSB7CisgIGNhc2UgU1dJR19NZW1vcnlFcnJvcjoKKyAgICBleGNlcHRpb25fY29kZSA9IFNXSUdfSmF2YU91dE9mTWVtb3J5RXJyb3I7CisgICAgYnJlYWs7CisgIGNhc2UgU1dJR19JT0Vycm9yOgorICAgIGV4Y2VwdGlvbl9jb2RlID0gU1dJR19KYXZhSU9FeGNlcHRpb247CisgICAgYnJlYWs7CisgIGNhc2UgU1dJR19TeXN0ZW1FcnJvcjoKKyAgY2FzZSBTV0lHX1J1bnRpbWVFcnJvcjoKKyAgICBleGNlcHRpb25fY29kZSA9IFNXSUdfSmF2YVJ1bnRpbWVFeGNlcHRpb247CisgICAgYnJlYWs7CisgIGNhc2UgU1dJR19PdmVyZmxvd0Vycm9yOgorICBjYXNlIFNXSUdfSW5kZXhFcnJvcjoKKyAgICBleGNlcHRpb25fY29kZSA9IFNXSUdfSmF2YUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb247CisgICAgYnJlYWs7CisgIGNhc2UgU1dJR19EaXZpc2lvbkJ5WmVybzoKKyAgICBleGNlcHRpb25fY29kZSA9IFNXSUdfSmF2YUFyaXRobWV0aWNFeGNlcHRpb247CisgICAgYnJlYWs7CisgIGNhc2UgU1dJR19TeW50YXhFcnJvcjoKKyAgY2FzZSBTV0lHX1ZhbHVlRXJyb3I6CisgIGNhc2UgU1dJR19UeXBlRXJyb3I6CisgICAgZXhjZXB0aW9uX2NvZGUgPSBTV0lHX0phdmFJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247CisgICAgYnJlYWs7CisgIGNhc2UgU1dJR19Vbmtub3duRXJyb3I6CisgIGRlZmF1bHQ6CisgICAgZXhjZXB0aW9uX2NvZGUgPSBTV0lHX0phdmFVbmtub3duRXJyb3I7CisgICAgYnJlYWs7CisgIH0KKyAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgZXhjZXB0aW9uX2NvZGUsIG1zZyk7Cit9CisKKworI2lmIGRlZmluZWQoU1dJR19OT0lOQ0xVREUpIHx8IGRlZmluZWQoU1dJR19OT0FSUkFZUykKKworCitpbnQgU1dJR19KYXZhQXJyYXlJblNjaGFyIChKTklFbnYgKmplbnYsIGpieXRlICoqamFyciwgc2lnbmVkIGNoYXIgKipjYXJyLCBqYnl0ZUFycmF5IGlucHV0KTsKK3ZvaWQgU1dJR19KYXZhQXJyYXlBcmdvdXRTY2hhciAoSk5JRW52ICpqZW52LCBqYnl0ZSAqamFyciwgc2lnbmVkIGNoYXIgKmNhcnIsIGpieXRlQXJyYXkgaW5wdXQpOworamJ5dGVBcnJheSBTV0lHX0phdmFBcnJheU91dFNjaGFyIChKTklFbnYgKmplbnYsIHNpZ25lZCBjaGFyICpyZXN1bHQsIGpzaXplIHN6KTsKKworCitpbnQgU1dJR19KYXZhQXJyYXlJblVjaGFyIChKTklFbnYgKmplbnYsIGpzaG9ydCAqKmphcnIsIHVuc2lnbmVkIGNoYXIgKipjYXJyLCBqc2hvcnRBcnJheSBpbnB1dCk7Cit2b2lkIFNXSUdfSmF2YUFycmF5QXJnb3V0VWNoYXIgKEpOSUVudiAqamVudiwganNob3J0ICpqYXJyLCB1bnNpZ25lZCBjaGFyICpjYXJyLCBqc2hvcnRBcnJheSBpbnB1dCk7Citqc2hvcnRBcnJheSBTV0lHX0phdmFBcnJheU91dFVjaGFyIChKTklFbnYgKmplbnYsIHVuc2lnbmVkIGNoYXIgKnJlc3VsdCwganNpemUgc3opOworCisKK2ludCBTV0lHX0phdmFBcnJheUluU2hvcnQgKEpOSUVudiAqamVudiwganNob3J0ICoqamFyciwgc2hvcnQgKipjYXJyLCBqc2hvcnRBcnJheSBpbnB1dCk7Cit2b2lkIFNXSUdfSmF2YUFycmF5QXJnb3V0U2hvcnQgKEpOSUVudiAqamVudiwganNob3J0ICpqYXJyLCBzaG9ydCAqY2FyciwganNob3J0QXJyYXkgaW5wdXQpOworanNob3J0QXJyYXkgU1dJR19KYXZhQXJyYXlPdXRTaG9ydCAoSk5JRW52ICpqZW52LCBzaG9ydCAqcmVzdWx0LCBqc2l6ZSBzeik7CisKKworaW50IFNXSUdfSmF2YUFycmF5SW5Vc2hvcnQgKEpOSUVudiAqamVudiwgamludCAqKmphcnIsIHVuc2lnbmVkIHNob3J0ICoqY2FyciwgamludEFycmF5IGlucHV0KTsKK3ZvaWQgU1dJR19KYXZhQXJyYXlBcmdvdXRVc2hvcnQgKEpOSUVudiAqamVudiwgamludCAqamFyciwgdW5zaWduZWQgc2hvcnQgKmNhcnIsIGppbnRBcnJheSBpbnB1dCk7CitqaW50QXJyYXkgU1dJR19KYXZhQXJyYXlPdXRVc2hvcnQgKEpOSUVudiAqamVudiwgdW5zaWduZWQgc2hvcnQgKnJlc3VsdCwganNpemUgc3opOworCisKK2ludCBTV0lHX0phdmFBcnJheUluSW50IChKTklFbnYgKmplbnYsIGppbnQgKipqYXJyLCBpbnQgKipjYXJyLCBqaW50QXJyYXkgaW5wdXQpOwordm9pZCBTV0lHX0phdmFBcnJheUFyZ291dEludCAoSk5JRW52ICpqZW52LCBqaW50ICpqYXJyLCBpbnQgKmNhcnIsIGppbnRBcnJheSBpbnB1dCk7CitqaW50QXJyYXkgU1dJR19KYXZhQXJyYXlPdXRJbnQgKEpOSUVudiAqamVudiwgaW50ICpyZXN1bHQsIGpzaXplIHN6KTsKKworCitpbnQgU1dJR19KYXZhQXJyYXlJblVpbnQgKEpOSUVudiAqamVudiwgamxvbmcgKipqYXJyLCB1bnNpZ25lZCBpbnQgKipjYXJyLCBqbG9uZ0FycmF5IGlucHV0KTsKK3ZvaWQgU1dJR19KYXZhQXJyYXlBcmdvdXRVaW50IChKTklFbnYgKmplbnYsIGpsb25nICpqYXJyLCB1bnNpZ25lZCBpbnQgKmNhcnIsIGpsb25nQXJyYXkgaW5wdXQpOworamxvbmdBcnJheSBTV0lHX0phdmFBcnJheU91dFVpbnQgKEpOSUVudiAqamVudiwgdW5zaWduZWQgaW50ICpyZXN1bHQsIGpzaXplIHN6KTsKKworCitpbnQgU1dJR19KYXZhQXJyYXlJbkxvbmcgKEpOSUVudiAqamVudiwgamludCAqKmphcnIsIGxvbmcgKipjYXJyLCBqaW50QXJyYXkgaW5wdXQpOwordm9pZCBTV0lHX0phdmFBcnJheUFyZ291dExvbmcgKEpOSUVudiAqamVudiwgamludCAqamFyciwgbG9uZyAqY2FyciwgamludEFycmF5IGlucHV0KTsKK2ppbnRBcnJheSBTV0lHX0phdmFBcnJheU91dExvbmcgKEpOSUVudiAqamVudiwgbG9uZyAqcmVzdWx0LCBqc2l6ZSBzeik7CisKKworaW50IFNXSUdfSmF2YUFycmF5SW5VbG9uZyAoSk5JRW52ICpqZW52LCBqbG9uZyAqKmphcnIsIHVuc2lnbmVkIGxvbmcgKipjYXJyLCBqbG9uZ0FycmF5IGlucHV0KTsKK3ZvaWQgU1dJR19KYXZhQXJyYXlBcmdvdXRVbG9uZyAoSk5JRW52ICpqZW52LCBqbG9uZyAqamFyciwgdW5zaWduZWQgbG9uZyAqY2FyciwgamxvbmdBcnJheSBpbnB1dCk7CitqbG9uZ0FycmF5IFNXSUdfSmF2YUFycmF5T3V0VWxvbmcgKEpOSUVudiAqamVudiwgdW5zaWduZWQgbG9uZyAqcmVzdWx0LCBqc2l6ZSBzeik7CisKKworaW50IFNXSUdfSmF2YUFycmF5SW5Mb25nbG9uZyAoSk5JRW52ICpqZW52LCBqbG9uZyAqKmphcnIsIGpsb25nICoqY2FyciwgamxvbmdBcnJheSBpbnB1dCk7Cit2b2lkIFNXSUdfSmF2YUFycmF5QXJnb3V0TG9uZ2xvbmcgKEpOSUVudiAqamVudiwgamxvbmcgKmphcnIsIGpsb25nICpjYXJyLCBqbG9uZ0FycmF5IGlucHV0KTsKK2psb25nQXJyYXkgU1dJR19KYXZhQXJyYXlPdXRMb25nbG9uZyAoSk5JRW52ICpqZW52LCBqbG9uZyAqcmVzdWx0LCBqc2l6ZSBzeik7CisKKworaW50IFNXSUdfSmF2YUFycmF5SW5GbG9hdCAoSk5JRW52ICpqZW52LCBqZmxvYXQgKipqYXJyLCBmbG9hdCAqKmNhcnIsIGpmbG9hdEFycmF5IGlucHV0KTsKK3ZvaWQgU1dJR19KYXZhQXJyYXlBcmdvdXRGbG9hdCAoSk5JRW52ICpqZW52LCBqZmxvYXQgKmphcnIsIGZsb2F0ICpjYXJyLCBqZmxvYXRBcnJheSBpbnB1dCk7CitqZmxvYXRBcnJheSBTV0lHX0phdmFBcnJheU91dEZsb2F0IChKTklFbnYgKmplbnYsIGZsb2F0ICpyZXN1bHQsIGpzaXplIHN6KTsKKworCitpbnQgU1dJR19KYXZhQXJyYXlJbkRvdWJsZSAoSk5JRW52ICpqZW52LCBqZG91YmxlICoqamFyciwgZG91YmxlICoqY2FyciwgamRvdWJsZUFycmF5IGlucHV0KTsKK3ZvaWQgU1dJR19KYXZhQXJyYXlBcmdvdXREb3VibGUgKEpOSUVudiAqamVudiwgamRvdWJsZSAqamFyciwgZG91YmxlICpjYXJyLCBqZG91YmxlQXJyYXkgaW5wdXQpOworamRvdWJsZUFycmF5IFNXSUdfSmF2YUFycmF5T3V0RG91YmxlIChKTklFbnYgKmplbnYsIGRvdWJsZSAqcmVzdWx0LCBqc2l6ZSBzeik7CisKKworI2Vsc2UKKworCisvKiBzaWduZWQgY2hhcltdIHN1cHBvcnQgKi8KK2ludCBTV0lHX0phdmFBcnJheUluU2NoYXIgKEpOSUVudiAqamVudiwgamJ5dGUgKipqYXJyLCBzaWduZWQgY2hhciAqKmNhcnIsIGpieXRlQXJyYXkgaW5wdXQpIHsKKyAgaW50IGk7CisgIGpzaXplIHN6OworICBpZiAoIWlucHV0KSB7CisgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhTnVsbFBvaW50ZXJFeGNlcHRpb24sICJudWxsIGFycmF5Iik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgc3ogPSAoKmplbnYpLT5HZXRBcnJheUxlbmd0aChqZW52LCBpbnB1dCk7CisgICpqYXJyID0gKCpqZW52KS0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoamVudiwgaW5wdXQsIDApOworICBpZiAoISpqYXJyKQorICAgIHJldHVybiAwOworICAqY2FyciA9IChzaWduZWQgY2hhciopIGNhbGxvYyhzeiwgc2l6ZW9mKHNpZ25lZCBjaGFyKSk7CisgIGlmICghKmNhcnIpIHsKKyAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFPdXRPZk1lbW9yeUVycm9yLCAiYXJyYXkgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgZm9yIChpPTA7IGk8c3o7IGkrKykKKyAgICAoKmNhcnIpW2ldID0gKHNpZ25lZCBjaGFyKSgqamFycilbaV07CisgIHJldHVybiAxOworfQorCit2b2lkIFNXSUdfSmF2YUFycmF5QXJnb3V0U2NoYXIgKEpOSUVudiAqamVudiwgamJ5dGUgKmphcnIsIHNpZ25lZCBjaGFyICpjYXJyLCBqYnl0ZUFycmF5IGlucHV0KSB7CisgIGludCBpOworICBqc2l6ZSBzeiA9ICgqamVudiktPkdldEFycmF5TGVuZ3RoKGplbnYsIGlucHV0KTsKKyAgZm9yIChpPTA7IGk8c3o7IGkrKykKKyAgICBqYXJyW2ldID0gKGpieXRlKWNhcnJbaV07CisgICgqamVudiktPlJlbGVhc2VCeXRlQXJyYXlFbGVtZW50cyhqZW52LCBpbnB1dCwgamFyciwgMCk7Cit9CisKK2pieXRlQXJyYXkgU1dJR19KYXZhQXJyYXlPdXRTY2hhciAoSk5JRW52ICpqZW52LCBzaWduZWQgY2hhciAqcmVzdWx0LCBqc2l6ZSBzeikgeworICBqYnl0ZSAqYXJyOworICBpbnQgaTsKKyAgamJ5dGVBcnJheSBqcmVzdWx0ID0gKCpqZW52KS0+TmV3Qnl0ZUFycmF5KGplbnYsIHN6KTsKKyAgaWYgKCFqcmVzdWx0KQorICAgIHJldHVybiBOVUxMOworICBhcnIgPSAoKmplbnYpLT5HZXRCeXRlQXJyYXlFbGVtZW50cyhqZW52LCBqcmVzdWx0LCAwKTsKKyAgaWYgKCFhcnIpCisgICAgcmV0dXJuIE5VTEw7CisgIGZvciAoaT0wOyBpPHN6OyBpKyspCisgICAgYXJyW2ldID0gKGpieXRlKXJlc3VsdFtpXTsKKyAgKCpqZW52KS0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKGplbnYsIGpyZXN1bHQsIGFyciwgMCk7CisgIHJldHVybiBqcmVzdWx0OworfQorCisKKy8qIHVuc2lnbmVkIGNoYXJbXSBzdXBwb3J0ICovCitpbnQgU1dJR19KYXZhQXJyYXlJblVjaGFyIChKTklFbnYgKmplbnYsIGpzaG9ydCAqKmphcnIsIHVuc2lnbmVkIGNoYXIgKipjYXJyLCBqc2hvcnRBcnJheSBpbnB1dCkgeworICBpbnQgaTsKKyAganNpemUgc3o7CisgIGlmICghaW5wdXQpIHsKKyAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFOdWxsUG9pbnRlckV4Y2VwdGlvbiwgIm51bGwgYXJyYXkiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBzeiA9ICgqamVudiktPkdldEFycmF5TGVuZ3RoKGplbnYsIGlucHV0KTsKKyAgKmphcnIgPSAoKmplbnYpLT5HZXRTaG9ydEFycmF5RWxlbWVudHMoamVudiwgaW5wdXQsIDApOworICBpZiAoISpqYXJyKQorICAgIHJldHVybiAwOworICAqY2FyciA9ICh1bnNpZ25lZCBjaGFyKikgY2FsbG9jKHN6LCBzaXplb2YodW5zaWduZWQgY2hhcikpOworICBpZiAoISpjYXJyKSB7CisgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhT3V0T2ZNZW1vcnlFcnJvciwgImFycmF5IG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIpOworICAgIHJldHVybiAwOworICB9CisgIGZvciAoaT0wOyBpPHN6OyBpKyspCisgICAgKCpjYXJyKVtpXSA9ICh1bnNpZ25lZCBjaGFyKSgqamFycilbaV07CisgIHJldHVybiAxOworfQorCit2b2lkIFNXSUdfSmF2YUFycmF5QXJnb3V0VWNoYXIgKEpOSUVudiAqamVudiwganNob3J0ICpqYXJyLCB1bnNpZ25lZCBjaGFyICpjYXJyLCBqc2hvcnRBcnJheSBpbnB1dCkgeworICBpbnQgaTsKKyAganNpemUgc3ogPSAoKmplbnYpLT5HZXRBcnJheUxlbmd0aChqZW52LCBpbnB1dCk7CisgIGZvciAoaT0wOyBpPHN6OyBpKyspCisgICAgamFycltpXSA9IChqc2hvcnQpY2FycltpXTsKKyAgKCpqZW52KS0+UmVsZWFzZVNob3J0QXJyYXlFbGVtZW50cyhqZW52LCBpbnB1dCwgamFyciwgMCk7Cit9CisKK2pzaG9ydEFycmF5IFNXSUdfSmF2YUFycmF5T3V0VWNoYXIgKEpOSUVudiAqamVudiwgdW5zaWduZWQgY2hhciAqcmVzdWx0LCBqc2l6ZSBzeikgeworICBqc2hvcnQgKmFycjsKKyAgaW50IGk7CisgIGpzaG9ydEFycmF5IGpyZXN1bHQgPSAoKmplbnYpLT5OZXdTaG9ydEFycmF5KGplbnYsIHN6KTsKKyAgaWYgKCFqcmVzdWx0KQorICAgIHJldHVybiBOVUxMOworICBhcnIgPSAoKmplbnYpLT5HZXRTaG9ydEFycmF5RWxlbWVudHMoamVudiwganJlc3VsdCwgMCk7CisgIGlmICghYXJyKQorICAgIHJldHVybiBOVUxMOworICBmb3IgKGk9MDsgaTxzejsgaSsrKQorICAgIGFycltpXSA9IChqc2hvcnQpcmVzdWx0W2ldOworICAoKmplbnYpLT5SZWxlYXNlU2hvcnRBcnJheUVsZW1lbnRzKGplbnYsIGpyZXN1bHQsIGFyciwgMCk7CisgIHJldHVybiBqcmVzdWx0OworfQorCisKKy8qIHNob3J0W10gc3VwcG9ydCAqLworaW50IFNXSUdfSmF2YUFycmF5SW5TaG9ydCAoSk5JRW52ICpqZW52LCBqc2hvcnQgKipqYXJyLCBzaG9ydCAqKmNhcnIsIGpzaG9ydEFycmF5IGlucHV0KSB7CisgIGludCBpOworICBqc2l6ZSBzejsKKyAgaWYgKCFpbnB1dCkgeworICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YU51bGxQb2ludGVyRXhjZXB0aW9uLCAibnVsbCBhcnJheSIpOworICAgIHJldHVybiAwOworICB9CisgIHN6ID0gKCpqZW52KS0+R2V0QXJyYXlMZW5ndGgoamVudiwgaW5wdXQpOworICAqamFyciA9ICgqamVudiktPkdldFNob3J0QXJyYXlFbGVtZW50cyhqZW52LCBpbnB1dCwgMCk7CisgIGlmICghKmphcnIpCisgICAgcmV0dXJuIDA7CisgICpjYXJyID0gKHNob3J0KikgY2FsbG9jKHN6LCBzaXplb2Yoc2hvcnQpKTsKKyAgaWYgKCEqY2FycikgeworICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YU91dE9mTWVtb3J5RXJyb3IsICJhcnJheSBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBmb3IgKGk9MDsgaTxzejsgaSsrKQorICAgICgqY2FycilbaV0gPSAoc2hvcnQpKCpqYXJyKVtpXTsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgU1dJR19KYXZhQXJyYXlBcmdvdXRTaG9ydCAoSk5JRW52ICpqZW52LCBqc2hvcnQgKmphcnIsIHNob3J0ICpjYXJyLCBqc2hvcnRBcnJheSBpbnB1dCkgeworICBpbnQgaTsKKyAganNpemUgc3ogPSAoKmplbnYpLT5HZXRBcnJheUxlbmd0aChqZW52LCBpbnB1dCk7CisgIGZvciAoaT0wOyBpPHN6OyBpKyspCisgICAgamFycltpXSA9IChqc2hvcnQpY2FycltpXTsKKyAgKCpqZW52KS0+UmVsZWFzZVNob3J0QXJyYXlFbGVtZW50cyhqZW52LCBpbnB1dCwgamFyciwgMCk7Cit9CisKK2pzaG9ydEFycmF5IFNXSUdfSmF2YUFycmF5T3V0U2hvcnQgKEpOSUVudiAqamVudiwgc2hvcnQgKnJlc3VsdCwganNpemUgc3opIHsKKyAganNob3J0ICphcnI7CisgIGludCBpOworICBqc2hvcnRBcnJheSBqcmVzdWx0ID0gKCpqZW52KS0+TmV3U2hvcnRBcnJheShqZW52LCBzeik7CisgIGlmICghanJlc3VsdCkKKyAgICByZXR1cm4gTlVMTDsKKyAgYXJyID0gKCpqZW52KS0+R2V0U2hvcnRBcnJheUVsZW1lbnRzKGplbnYsIGpyZXN1bHQsIDApOworICBpZiAoIWFycikKKyAgICByZXR1cm4gTlVMTDsKKyAgZm9yIChpPTA7IGk8c3o7IGkrKykKKyAgICBhcnJbaV0gPSAoanNob3J0KXJlc3VsdFtpXTsKKyAgKCpqZW52KS0+UmVsZWFzZVNob3J0QXJyYXlFbGVtZW50cyhqZW52LCBqcmVzdWx0LCBhcnIsIDApOworICByZXR1cm4ganJlc3VsdDsKK30KKworCisvKiB1bnNpZ25lZCBzaG9ydFtdIHN1cHBvcnQgKi8KK2ludCBTV0lHX0phdmFBcnJheUluVXNob3J0IChKTklFbnYgKmplbnYsIGppbnQgKipqYXJyLCB1bnNpZ25lZCBzaG9ydCAqKmNhcnIsIGppbnRBcnJheSBpbnB1dCkgeworICBpbnQgaTsKKyAganNpemUgc3o7CisgIGlmICghaW5wdXQpIHsKKyAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFOdWxsUG9pbnRlckV4Y2VwdGlvbiwgIm51bGwgYXJyYXkiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBzeiA9ICgqamVudiktPkdldEFycmF5TGVuZ3RoKGplbnYsIGlucHV0KTsKKyAgKmphcnIgPSAoKmplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGplbnYsIGlucHV0LCAwKTsKKyAgaWYgKCEqamFycikKKyAgICByZXR1cm4gMDsKKyAgKmNhcnIgPSAodW5zaWduZWQgc2hvcnQqKSBjYWxsb2Moc3osIHNpemVvZih1bnNpZ25lZCBzaG9ydCkpOworICBpZiAoISpjYXJyKSB7CisgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhT3V0T2ZNZW1vcnlFcnJvciwgImFycmF5IG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIpOworICAgIHJldHVybiAwOworICB9CisgIGZvciAoaT0wOyBpPHN6OyBpKyspCisgICAgKCpjYXJyKVtpXSA9ICh1bnNpZ25lZCBzaG9ydCkoKmphcnIpW2ldOworICByZXR1cm4gMTsKK30KKwordm9pZCBTV0lHX0phdmFBcnJheUFyZ291dFVzaG9ydCAoSk5JRW52ICpqZW52LCBqaW50ICpqYXJyLCB1bnNpZ25lZCBzaG9ydCAqY2FyciwgamludEFycmF5IGlucHV0KSB7CisgIGludCBpOworICBqc2l6ZSBzeiA9ICgqamVudiktPkdldEFycmF5TGVuZ3RoKGplbnYsIGlucHV0KTsKKyAgZm9yIChpPTA7IGk8c3o7IGkrKykKKyAgICBqYXJyW2ldID0gKGppbnQpY2FycltpXTsKKyAgKCpqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoamVudiwgaW5wdXQsIGphcnIsIDApOworfQorCitqaW50QXJyYXkgU1dJR19KYXZhQXJyYXlPdXRVc2hvcnQgKEpOSUVudiAqamVudiwgdW5zaWduZWQgc2hvcnQgKnJlc3VsdCwganNpemUgc3opIHsKKyAgamludCAqYXJyOworICBpbnQgaTsKKyAgamludEFycmF5IGpyZXN1bHQgPSAoKmplbnYpLT5OZXdJbnRBcnJheShqZW52LCBzeik7CisgIGlmICghanJlc3VsdCkKKyAgICByZXR1cm4gTlVMTDsKKyAgYXJyID0gKCpqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhqZW52LCBqcmVzdWx0LCAwKTsKKyAgaWYgKCFhcnIpCisgICAgcmV0dXJuIE5VTEw7CisgIGZvciAoaT0wOyBpPHN6OyBpKyspCisgICAgYXJyW2ldID0gKGppbnQpcmVzdWx0W2ldOworICAoKmplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhqZW52LCBqcmVzdWx0LCBhcnIsIDApOworICByZXR1cm4ganJlc3VsdDsKK30KKworCisvKiBpbnRbXSBzdXBwb3J0ICovCitpbnQgU1dJR19KYXZhQXJyYXlJbkludCAoSk5JRW52ICpqZW52LCBqaW50ICoqamFyciwgaW50ICoqY2FyciwgamludEFycmF5IGlucHV0KSB7CisgIGludCBpOworICBqc2l6ZSBzejsKKyAgaWYgKCFpbnB1dCkgeworICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YU51bGxQb2ludGVyRXhjZXB0aW9uLCAibnVsbCBhcnJheSIpOworICAgIHJldHVybiAwOworICB9CisgIHN6ID0gKCpqZW52KS0+R2V0QXJyYXlMZW5ndGgoamVudiwgaW5wdXQpOworICAqamFyciA9ICgqamVudiktPkdldEludEFycmF5RWxlbWVudHMoamVudiwgaW5wdXQsIDApOworICBpZiAoISpqYXJyKQorICAgIHJldHVybiAwOworICAqY2FyciA9IChpbnQqKSBjYWxsb2Moc3osIHNpemVvZihpbnQpKTsKKyAgaWYgKCEqY2FycikgeworICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YU91dE9mTWVtb3J5RXJyb3IsICJhcnJheSBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBmb3IgKGk9MDsgaTxzejsgaSsrKQorICAgICgqY2FycilbaV0gPSAoaW50KSgqamFycilbaV07CisgIHJldHVybiAxOworfQorCit2b2lkIFNXSUdfSmF2YUFycmF5QXJnb3V0SW50IChKTklFbnYgKmplbnYsIGppbnQgKmphcnIsIGludCAqY2FyciwgamludEFycmF5IGlucHV0KSB7CisgIGludCBpOworICBqc2l6ZSBzeiA9ICgqamVudiktPkdldEFycmF5TGVuZ3RoKGplbnYsIGlucHV0KTsKKyAgZm9yIChpPTA7IGk8c3o7IGkrKykKKyAgICBqYXJyW2ldID0gKGppbnQpY2FycltpXTsKKyAgKCpqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoamVudiwgaW5wdXQsIGphcnIsIDApOworfQorCitqaW50QXJyYXkgU1dJR19KYXZhQXJyYXlPdXRJbnQgKEpOSUVudiAqamVudiwgaW50ICpyZXN1bHQsIGpzaXplIHN6KSB7CisgIGppbnQgKmFycjsKKyAgaW50IGk7CisgIGppbnRBcnJheSBqcmVzdWx0ID0gKCpqZW52KS0+TmV3SW50QXJyYXkoamVudiwgc3opOworICBpZiAoIWpyZXN1bHQpCisgICAgcmV0dXJuIE5VTEw7CisgIGFyciA9ICgqamVudiktPkdldEludEFycmF5RWxlbWVudHMoamVudiwganJlc3VsdCwgMCk7CisgIGlmICghYXJyKQorICAgIHJldHVybiBOVUxMOworICBmb3IgKGk9MDsgaTxzejsgaSsrKQorICAgIGFycltpXSA9IChqaW50KXJlc3VsdFtpXTsKKyAgKCpqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoamVudiwganJlc3VsdCwgYXJyLCAwKTsKKyAgcmV0dXJuIGpyZXN1bHQ7Cit9CisKKworLyogdW5zaWduZWQgaW50W10gc3VwcG9ydCAqLworaW50IFNXSUdfSmF2YUFycmF5SW5VaW50IChKTklFbnYgKmplbnYsIGpsb25nICoqamFyciwgdW5zaWduZWQgaW50ICoqY2FyciwgamxvbmdBcnJheSBpbnB1dCkgeworICBpbnQgaTsKKyAganNpemUgc3o7CisgIGlmICghaW5wdXQpIHsKKyAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFOdWxsUG9pbnRlckV4Y2VwdGlvbiwgIm51bGwgYXJyYXkiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBzeiA9ICgqamVudiktPkdldEFycmF5TGVuZ3RoKGplbnYsIGlucHV0KTsKKyAgKmphcnIgPSAoKmplbnYpLT5HZXRMb25nQXJyYXlFbGVtZW50cyhqZW52LCBpbnB1dCwgMCk7CisgIGlmICghKmphcnIpCisgICAgcmV0dXJuIDA7CisgICpjYXJyID0gKHVuc2lnbmVkIGludCopIGNhbGxvYyhzeiwgc2l6ZW9mKHVuc2lnbmVkIGludCkpOworICBpZiAoISpjYXJyKSB7CisgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhT3V0T2ZNZW1vcnlFcnJvciwgImFycmF5IG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIpOworICAgIHJldHVybiAwOworICB9CisgIGZvciAoaT0wOyBpPHN6OyBpKyspCisgICAgKCpjYXJyKVtpXSA9ICh1bnNpZ25lZCBpbnQpKCpqYXJyKVtpXTsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgU1dJR19KYXZhQXJyYXlBcmdvdXRVaW50IChKTklFbnYgKmplbnYsIGpsb25nICpqYXJyLCB1bnNpZ25lZCBpbnQgKmNhcnIsIGpsb25nQXJyYXkgaW5wdXQpIHsKKyAgaW50IGk7CisgIGpzaXplIHN6ID0gKCpqZW52KS0+R2V0QXJyYXlMZW5ndGgoamVudiwgaW5wdXQpOworICBmb3IgKGk9MDsgaTxzejsgaSsrKQorICAgIGphcnJbaV0gPSAoamxvbmcpY2FycltpXTsKKyAgKCpqZW52KS0+UmVsZWFzZUxvbmdBcnJheUVsZW1lbnRzKGplbnYsIGlucHV0LCBqYXJyLCAwKTsKK30KKworamxvbmdBcnJheSBTV0lHX0phdmFBcnJheU91dFVpbnQgKEpOSUVudiAqamVudiwgdW5zaWduZWQgaW50ICpyZXN1bHQsIGpzaXplIHN6KSB7CisgIGpsb25nICphcnI7CisgIGludCBpOworICBqbG9uZ0FycmF5IGpyZXN1bHQgPSAoKmplbnYpLT5OZXdMb25nQXJyYXkoamVudiwgc3opOworICBpZiAoIWpyZXN1bHQpCisgICAgcmV0dXJuIE5VTEw7CisgIGFyciA9ICgqamVudiktPkdldExvbmdBcnJheUVsZW1lbnRzKGplbnYsIGpyZXN1bHQsIDApOworICBpZiAoIWFycikKKyAgICByZXR1cm4gTlVMTDsKKyAgZm9yIChpPTA7IGk8c3o7IGkrKykKKyAgICBhcnJbaV0gPSAoamxvbmcpcmVzdWx0W2ldOworICAoKmplbnYpLT5SZWxlYXNlTG9uZ0FycmF5RWxlbWVudHMoamVudiwganJlc3VsdCwgYXJyLCAwKTsKKyAgcmV0dXJuIGpyZXN1bHQ7Cit9CisKKworLyogbG9uZ1tdIHN1cHBvcnQgKi8KK2ludCBTV0lHX0phdmFBcnJheUluTG9uZyAoSk5JRW52ICpqZW52LCBqaW50ICoqamFyciwgbG9uZyAqKmNhcnIsIGppbnRBcnJheSBpbnB1dCkgeworICBpbnQgaTsKKyAganNpemUgc3o7CisgIGlmICghaW5wdXQpIHsKKyAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFOdWxsUG9pbnRlckV4Y2VwdGlvbiwgIm51bGwgYXJyYXkiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBzeiA9ICgqamVudiktPkdldEFycmF5TGVuZ3RoKGplbnYsIGlucHV0KTsKKyAgKmphcnIgPSAoKmplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGplbnYsIGlucHV0LCAwKTsKKyAgaWYgKCEqamFycikKKyAgICByZXR1cm4gMDsKKyAgKmNhcnIgPSAobG9uZyopIGNhbGxvYyhzeiwgc2l6ZW9mKGxvbmcpKTsKKyAgaWYgKCEqY2FycikgeworICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YU91dE9mTWVtb3J5RXJyb3IsICJhcnJheSBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBmb3IgKGk9MDsgaTxzejsgaSsrKQorICAgICgqY2FycilbaV0gPSAobG9uZykoKmphcnIpW2ldOworICByZXR1cm4gMTsKK30KKwordm9pZCBTV0lHX0phdmFBcnJheUFyZ291dExvbmcgKEpOSUVudiAqamVudiwgamludCAqamFyciwgbG9uZyAqY2FyciwgamludEFycmF5IGlucHV0KSB7CisgIGludCBpOworICBqc2l6ZSBzeiA9ICgqamVudiktPkdldEFycmF5TGVuZ3RoKGplbnYsIGlucHV0KTsKKyAgZm9yIChpPTA7IGk8c3o7IGkrKykKKyAgICBqYXJyW2ldID0gKGppbnQpY2FycltpXTsKKyAgKCpqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoamVudiwgaW5wdXQsIGphcnIsIDApOworfQorCitqaW50QXJyYXkgU1dJR19KYXZhQXJyYXlPdXRMb25nIChKTklFbnYgKmplbnYsIGxvbmcgKnJlc3VsdCwganNpemUgc3opIHsKKyAgamludCAqYXJyOworICBpbnQgaTsKKyAgamludEFycmF5IGpyZXN1bHQgPSAoKmplbnYpLT5OZXdJbnRBcnJheShqZW52LCBzeik7CisgIGlmICghanJlc3VsdCkKKyAgICByZXR1cm4gTlVMTDsKKyAgYXJyID0gKCpqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhqZW52LCBqcmVzdWx0LCAwKTsKKyAgaWYgKCFhcnIpCisgICAgcmV0dXJuIE5VTEw7CisgIGZvciAoaT0wOyBpPHN6OyBpKyspCisgICAgYXJyW2ldID0gKGppbnQpcmVzdWx0W2ldOworICAoKmplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhqZW52LCBqcmVzdWx0LCBhcnIsIDApOworICByZXR1cm4ganJlc3VsdDsKK30KKworCisvKiB1bnNpZ25lZCBsb25nW10gc3VwcG9ydCAqLworaW50IFNXSUdfSmF2YUFycmF5SW5VbG9uZyAoSk5JRW52ICpqZW52LCBqbG9uZyAqKmphcnIsIHVuc2lnbmVkIGxvbmcgKipjYXJyLCBqbG9uZ0FycmF5IGlucHV0KSB7CisgIGludCBpOworICBqc2l6ZSBzejsKKyAgaWYgKCFpbnB1dCkgeworICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YU51bGxQb2ludGVyRXhjZXB0aW9uLCAibnVsbCBhcnJheSIpOworICAgIHJldHVybiAwOworICB9CisgIHN6ID0gKCpqZW52KS0+R2V0QXJyYXlMZW5ndGgoamVudiwgaW5wdXQpOworICAqamFyciA9ICgqamVudiktPkdldExvbmdBcnJheUVsZW1lbnRzKGplbnYsIGlucHV0LCAwKTsKKyAgaWYgKCEqamFycikKKyAgICByZXR1cm4gMDsKKyAgKmNhcnIgPSAodW5zaWduZWQgbG9uZyopIGNhbGxvYyhzeiwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKyAgaWYgKCEqY2FycikgeworICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YU91dE9mTWVtb3J5RXJyb3IsICJhcnJheSBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBmb3IgKGk9MDsgaTxzejsgaSsrKQorICAgICgqY2FycilbaV0gPSAodW5zaWduZWQgbG9uZykoKmphcnIpW2ldOworICByZXR1cm4gMTsKK30KKwordm9pZCBTV0lHX0phdmFBcnJheUFyZ291dFVsb25nIChKTklFbnYgKmplbnYsIGpsb25nICpqYXJyLCB1bnNpZ25lZCBsb25nICpjYXJyLCBqbG9uZ0FycmF5IGlucHV0KSB7CisgIGludCBpOworICBqc2l6ZSBzeiA9ICgqamVudiktPkdldEFycmF5TGVuZ3RoKGplbnYsIGlucHV0KTsKKyAgZm9yIChpPTA7IGk8c3o7IGkrKykKKyAgICBqYXJyW2ldID0gKGpsb25nKWNhcnJbaV07CisgICgqamVudiktPlJlbGVhc2VMb25nQXJyYXlFbGVtZW50cyhqZW52LCBpbnB1dCwgamFyciwgMCk7Cit9CisKK2psb25nQXJyYXkgU1dJR19KYXZhQXJyYXlPdXRVbG9uZyAoSk5JRW52ICpqZW52LCB1bnNpZ25lZCBsb25nICpyZXN1bHQsIGpzaXplIHN6KSB7CisgIGpsb25nICphcnI7CisgIGludCBpOworICBqbG9uZ0FycmF5IGpyZXN1bHQgPSAoKmplbnYpLT5OZXdMb25nQXJyYXkoamVudiwgc3opOworICBpZiAoIWpyZXN1bHQpCisgICAgcmV0dXJuIE5VTEw7CisgIGFyciA9ICgqamVudiktPkdldExvbmdBcnJheUVsZW1lbnRzKGplbnYsIGpyZXN1bHQsIDApOworICBpZiAoIWFycikKKyAgICByZXR1cm4gTlVMTDsKKyAgZm9yIChpPTA7IGk8c3o7IGkrKykKKyAgICBhcnJbaV0gPSAoamxvbmcpcmVzdWx0W2ldOworICAoKmplbnYpLT5SZWxlYXNlTG9uZ0FycmF5RWxlbWVudHMoamVudiwganJlc3VsdCwgYXJyLCAwKTsKKyAgcmV0dXJuIGpyZXN1bHQ7Cit9CisKKworLyogamxvbmdbXSBzdXBwb3J0ICovCitpbnQgU1dJR19KYXZhQXJyYXlJbkxvbmdsb25nIChKTklFbnYgKmplbnYsIGpsb25nICoqamFyciwgamxvbmcgKipjYXJyLCBqbG9uZ0FycmF5IGlucHV0KSB7CisgIGludCBpOworICBqc2l6ZSBzejsKKyAgaWYgKCFpbnB1dCkgeworICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YU51bGxQb2ludGVyRXhjZXB0aW9uLCAibnVsbCBhcnJheSIpOworICAgIHJldHVybiAwOworICB9CisgIHN6ID0gKCpqZW52KS0+R2V0QXJyYXlMZW5ndGgoamVudiwgaW5wdXQpOworICAqamFyciA9ICgqamVudiktPkdldExvbmdBcnJheUVsZW1lbnRzKGplbnYsIGlucHV0LCAwKTsKKyAgaWYgKCEqamFycikKKyAgICByZXR1cm4gMDsKKyAgKmNhcnIgPSAoamxvbmcqKSBjYWxsb2Moc3osIHNpemVvZihqbG9uZykpOworICBpZiAoISpjYXJyKSB7CisgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhT3V0T2ZNZW1vcnlFcnJvciwgImFycmF5IG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIpOworICAgIHJldHVybiAwOworICB9CisgIGZvciAoaT0wOyBpPHN6OyBpKyspCisgICAgKCpjYXJyKVtpXSA9IChqbG9uZykoKmphcnIpW2ldOworICByZXR1cm4gMTsKK30KKwordm9pZCBTV0lHX0phdmFBcnJheUFyZ291dExvbmdsb25nIChKTklFbnYgKmplbnYsIGpsb25nICpqYXJyLCBqbG9uZyAqY2FyciwgamxvbmdBcnJheSBpbnB1dCkgeworICBpbnQgaTsKKyAganNpemUgc3ogPSAoKmplbnYpLT5HZXRBcnJheUxlbmd0aChqZW52LCBpbnB1dCk7CisgIGZvciAoaT0wOyBpPHN6OyBpKyspCisgICAgamFycltpXSA9IChqbG9uZyljYXJyW2ldOworICAoKmplbnYpLT5SZWxlYXNlTG9uZ0FycmF5RWxlbWVudHMoamVudiwgaW5wdXQsIGphcnIsIDApOworfQorCitqbG9uZ0FycmF5IFNXSUdfSmF2YUFycmF5T3V0TG9uZ2xvbmcgKEpOSUVudiAqamVudiwgamxvbmcgKnJlc3VsdCwganNpemUgc3opIHsKKyAgamxvbmcgKmFycjsKKyAgaW50IGk7CisgIGpsb25nQXJyYXkganJlc3VsdCA9ICgqamVudiktPk5ld0xvbmdBcnJheShqZW52LCBzeik7CisgIGlmICghanJlc3VsdCkKKyAgICByZXR1cm4gTlVMTDsKKyAgYXJyID0gKCpqZW52KS0+R2V0TG9uZ0FycmF5RWxlbWVudHMoamVudiwganJlc3VsdCwgMCk7CisgIGlmICghYXJyKQorICAgIHJldHVybiBOVUxMOworICBmb3IgKGk9MDsgaTxzejsgaSsrKQorICAgIGFycltpXSA9IChqbG9uZylyZXN1bHRbaV07CisgICgqamVudiktPlJlbGVhc2VMb25nQXJyYXlFbGVtZW50cyhqZW52LCBqcmVzdWx0LCBhcnIsIDApOworICByZXR1cm4ganJlc3VsdDsKK30KKworCisvKiBmbG9hdFtdIHN1cHBvcnQgKi8KK2ludCBTV0lHX0phdmFBcnJheUluRmxvYXQgKEpOSUVudiAqamVudiwgamZsb2F0ICoqamFyciwgZmxvYXQgKipjYXJyLCBqZmxvYXRBcnJheSBpbnB1dCkgeworICBpbnQgaTsKKyAganNpemUgc3o7CisgIGlmICghaW5wdXQpIHsKKyAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFOdWxsUG9pbnRlckV4Y2VwdGlvbiwgIm51bGwgYXJyYXkiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBzeiA9ICgqamVudiktPkdldEFycmF5TGVuZ3RoKGplbnYsIGlucHV0KTsKKyAgKmphcnIgPSAoKmplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoamVudiwgaW5wdXQsIDApOworICBpZiAoISpqYXJyKQorICAgIHJldHVybiAwOworICAqY2FyciA9IChmbG9hdCopIGNhbGxvYyhzeiwgc2l6ZW9mKGZsb2F0KSk7CisgIGlmICghKmNhcnIpIHsKKyAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFPdXRPZk1lbW9yeUVycm9yLCAiYXJyYXkgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgZm9yIChpPTA7IGk8c3o7IGkrKykKKyAgICAoKmNhcnIpW2ldID0gKGZsb2F0KSgqamFycilbaV07CisgIHJldHVybiAxOworfQorCit2b2lkIFNXSUdfSmF2YUFycmF5QXJnb3V0RmxvYXQgKEpOSUVudiAqamVudiwgamZsb2F0ICpqYXJyLCBmbG9hdCAqY2FyciwgamZsb2F0QXJyYXkgaW5wdXQpIHsKKyAgaW50IGk7CisgIGpzaXplIHN6ID0gKCpqZW52KS0+R2V0QXJyYXlMZW5ndGgoamVudiwgaW5wdXQpOworICBmb3IgKGk9MDsgaTxzejsgaSsrKQorICAgIGphcnJbaV0gPSAoamZsb2F0KWNhcnJbaV07CisgICgqamVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoamVudiwgaW5wdXQsIGphcnIsIDApOworfQorCitqZmxvYXRBcnJheSBTV0lHX0phdmFBcnJheU91dEZsb2F0IChKTklFbnYgKmplbnYsIGZsb2F0ICpyZXN1bHQsIGpzaXplIHN6KSB7CisgIGpmbG9hdCAqYXJyOworICBpbnQgaTsKKyAgamZsb2F0QXJyYXkganJlc3VsdCA9ICgqamVudiktPk5ld0Zsb2F0QXJyYXkoamVudiwgc3opOworICBpZiAoIWpyZXN1bHQpCisgICAgcmV0dXJuIE5VTEw7CisgIGFyciA9ICgqamVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhqZW52LCBqcmVzdWx0LCAwKTsKKyAgaWYgKCFhcnIpCisgICAgcmV0dXJuIE5VTEw7CisgIGZvciAoaT0wOyBpPHN6OyBpKyspCisgICAgYXJyW2ldID0gKGpmbG9hdClyZXN1bHRbaV07CisgICgqamVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoamVudiwganJlc3VsdCwgYXJyLCAwKTsKKyAgcmV0dXJuIGpyZXN1bHQ7Cit9CisKKworLyogZG91YmxlW10gc3VwcG9ydCAqLworaW50IFNXSUdfSmF2YUFycmF5SW5Eb3VibGUgKEpOSUVudiAqamVudiwgamRvdWJsZSAqKmphcnIsIGRvdWJsZSAqKmNhcnIsIGpkb3VibGVBcnJheSBpbnB1dCkgeworICBpbnQgaTsKKyAganNpemUgc3o7CisgIGlmICghaW5wdXQpIHsKKyAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFOdWxsUG9pbnRlckV4Y2VwdGlvbiwgIm51bGwgYXJyYXkiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBzeiA9ICgqamVudiktPkdldEFycmF5TGVuZ3RoKGplbnYsIGlucHV0KTsKKyAgKmphcnIgPSAoKmplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGplbnYsIGlucHV0LCAwKTsKKyAgaWYgKCEqamFycikKKyAgICByZXR1cm4gMDsKKyAgKmNhcnIgPSAoZG91YmxlKikgY2FsbG9jKHN6LCBzaXplb2YoZG91YmxlKSk7CisgIGlmICghKmNhcnIpIHsKKyAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFPdXRPZk1lbW9yeUVycm9yLCAiYXJyYXkgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgZm9yIChpPTA7IGk8c3o7IGkrKykKKyAgICAoKmNhcnIpW2ldID0gKGRvdWJsZSkoKmphcnIpW2ldOworICByZXR1cm4gMTsKK30KKwordm9pZCBTV0lHX0phdmFBcnJheUFyZ291dERvdWJsZSAoSk5JRW52ICpqZW52LCBqZG91YmxlICpqYXJyLCBkb3VibGUgKmNhcnIsIGpkb3VibGVBcnJheSBpbnB1dCkgeworICBpbnQgaTsKKyAganNpemUgc3ogPSAoKmplbnYpLT5HZXRBcnJheUxlbmd0aChqZW52LCBpbnB1dCk7CisgIGZvciAoaT0wOyBpPHN6OyBpKyspCisgICAgamFycltpXSA9IChqZG91YmxlKWNhcnJbaV07CisgICgqamVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGplbnYsIGlucHV0LCBqYXJyLCAwKTsKK30KKworamRvdWJsZUFycmF5IFNXSUdfSmF2YUFycmF5T3V0RG91YmxlIChKTklFbnYgKmplbnYsIGRvdWJsZSAqcmVzdWx0LCBqc2l6ZSBzeikgeworICBqZG91YmxlICphcnI7CisgIGludCBpOworICBqZG91YmxlQXJyYXkganJlc3VsdCA9ICgqamVudiktPk5ld0RvdWJsZUFycmF5KGplbnYsIHN6KTsKKyAgaWYgKCFqcmVzdWx0KQorICAgIHJldHVybiBOVUxMOworICBhcnIgPSAoKmplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGplbnYsIGpyZXN1bHQsIDApOworICBpZiAoIWFycikKKyAgICByZXR1cm4gTlVMTDsKKyAgZm9yIChpPTA7IGk8c3o7IGkrKykKKyAgICBhcnJbaV0gPSAoamRvdWJsZSlyZXN1bHRbaV07CisgICgqamVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGplbnYsIGpyZXN1bHQsIGFyciwgMCk7CisgIHJldHVybiBqcmVzdWx0OworfQorCisKKyNlbmRpZgorCisKKyNpbmNsdWRlICJ3ZWJwL3R5cGVzLmgiCisKKworaW50IFNXSUdfSmF2YUFycmF5SW5VaW50OCAoSk5JRW52ICpqZW52LCBqYnl0ZSAqKmphcnIsIHVpbnQ4X3QgKipjYXJyLCBqYnl0ZUFycmF5IGlucHV0KTsKK3ZvaWQgU1dJR19KYXZhQXJyYXlBcmdvdXRVaW50OCAoSk5JRW52ICpqZW52LCBqYnl0ZSAqamFyciwgdWludDhfdCAqY2FyciwgamJ5dGVBcnJheSBpbnB1dCk7CitqYnl0ZUFycmF5IFNXSUdfSmF2YUFycmF5T3V0VWludDggKEpOSUVudiAqamVudiwgdWludDhfdCAqcmVzdWx0LCBqc2l6ZSBzeik7CisKKworLyogdWludDhfdFtdIHN1cHBvcnQgKi8KK2ludCBTV0lHX0phdmFBcnJheUluVWludDggKEpOSUVudiAqamVudiwgamJ5dGUgKipqYXJyLCB1aW50OF90ICoqY2FyciwgamJ5dGVBcnJheSBpbnB1dCkgeworICBpbnQgaTsKKyAganNpemUgc3o7CisgIGlmICghaW5wdXQpIHsKKyAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFOdWxsUG9pbnRlckV4Y2VwdGlvbiwgIm51bGwgYXJyYXkiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBzeiA9ICgqamVudiktPkdldEFycmF5TGVuZ3RoKGplbnYsIGlucHV0KTsKKyAgKmphcnIgPSAoKmplbnYpLT5HZXRCeXRlQXJyYXlFbGVtZW50cyhqZW52LCBpbnB1dCwgMCk7CisgIGlmICghKmphcnIpCisgICAgcmV0dXJuIDA7CisgICpjYXJyID0gKHVpbnQ4X3QqKSBjYWxsb2Moc3osIHNpemVvZih1aW50OF90KSk7CisgIGlmICghKmNhcnIpIHsKKyAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFPdXRPZk1lbW9yeUVycm9yLCAiYXJyYXkgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgZm9yIChpPTA7IGk8c3o7IGkrKykKKyAgICAoKmNhcnIpW2ldID0gKHVpbnQ4X3QpKCpqYXJyKVtpXTsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgU1dJR19KYXZhQXJyYXlBcmdvdXRVaW50OCAoSk5JRW52ICpqZW52LCBqYnl0ZSAqamFyciwgdWludDhfdCAqY2FyciwgamJ5dGVBcnJheSBpbnB1dCkgeworICBpbnQgaTsKKyAganNpemUgc3ogPSAoKmplbnYpLT5HZXRBcnJheUxlbmd0aChqZW52LCBpbnB1dCk7CisgIGZvciAoaT0wOyBpPHN6OyBpKyspCisgICAgamFycltpXSA9IChqYnl0ZSljYXJyW2ldOworICAoKmplbnYpLT5SZWxlYXNlQnl0ZUFycmF5RWxlbWVudHMoamVudiwgaW5wdXQsIGphcnIsIDApOworfQorCitqYnl0ZUFycmF5IFNXSUdfSmF2YUFycmF5T3V0VWludDggKEpOSUVudiAqamVudiwgdWludDhfdCAqcmVzdWx0LCBqc2l6ZSBzeikgeworICBqYnl0ZSAqYXJyOworICBpbnQgaTsKKyAgamJ5dGVBcnJheSBqcmVzdWx0ID0gKCpqZW52KS0+TmV3Qnl0ZUFycmF5KGplbnYsIHN6KTsKKyAgaWYgKCFqcmVzdWx0KQorICAgIHJldHVybiBOVUxMOworICBhcnIgPSAoKmplbnYpLT5HZXRCeXRlQXJyYXlFbGVtZW50cyhqZW52LCBqcmVzdWx0LCAwKTsKKyAgaWYgKCFhcnIpCisgICAgcmV0dXJuIE5VTEw7CisgIGZvciAoaT0wOyBpPHN6OyBpKyspCisgICAgYXJyW2ldID0gKGpieXRlKXJlc3VsdFtpXTsKKyAgKCpqZW52KS0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKGplbnYsIGpyZXN1bHQsIGFyciwgMCk7CisgIHJldHVybiBqcmVzdWx0OworfQorCisKKyNpbmNsdWRlICJ3ZWJwL2RlY29kZS5oIgorI2luY2x1ZGUgIndlYnAvZW5jb2RlLmgiCisKKworI2RlZmluZSBGaWxsTWVJbkFzU2l6ZUNhbm5vdEJlRGV0ZXJtaW5lZEF1dG9tYXRpY2FsbHkgXAorICAgIChyZXN1bHQgPyAoamludClSZXR1cm5lZEJ1ZmZlclNpemUoX19GVU5DVElPTl9fLCBhcmczLCBhcmc0KSA6IDApCisKKworc3RhdGljIHNpemVfdCBSZXR1cm5lZEJ1ZmZlclNpemUoCisgICAgY29uc3QgY2hhciogZnVuY3Rpb24sIGludCogd2lkdGgsIGludCogaGVpZ2h0KSB7CisgIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2l6ZW1hcCB7CisgICAgY29uc3QgY2hhciogZnVuY3Rpb247CisgICAgaW50IHNpemVfbXVsdGlwbGllcjsKKyAgfSBzaXplX21hcFtdID0geworI2lmZGVmIFNXSUdKQVZBCisgICAgeyAiSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV9XZWJQRGVjb2RlUkdCIiwgIDMgfSwKKyAgICB7ICJKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX1dlYlBEZWNvZGVSR0JBIiwgNCB9LAorICAgIHsgIkphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfV2ViUERlY29kZUFSR0IiLCA0IH0sCisgICAgeyAiSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV9XZWJQRGVjb2RlQkdSIiwgIDMgfSwKKyAgICB7ICJKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX1dlYlBEZWNvZGVCR1JBIiwgNCB9LAorICAgIHsgIkphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfd3JhcF8xV2ViUEVuY29kZVJHQiIsICAxIH0sCisgICAgeyAiSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV93cmFwXzFXZWJQRW5jb2RlQkdSIiwgIDEgfSwKKyAgICB7ICJKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX3dyYXBfMVdlYlBFbmNvZGVSR0JBIiwgMSB9LAorICAgIHsgIkphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfd3JhcF8xV2ViUEVuY29kZUJHUkEiLCAxIH0sCisgICAgeyAiSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV93cmFwXzFXZWJQRW5jb2RlTG9zc2xlc3NSR0IiLCAgMSB9LAorICAgIHsgIkphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfd3JhcF8xV2ViUEVuY29kZUxvc3NsZXNzQkdSIiwgIDEgfSwKKyAgICB7ICJKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX3dyYXBfMVdlYlBFbmNvZGVMb3NzbGVzc1JHQkEiLCAxIH0sCisgICAgeyAiSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV93cmFwXzFXZWJQRW5jb2RlTG9zc2xlc3NCR1JBIiwgMSB9LAorI2VuZGlmCisjaWZkZWYgU1dJR1BZVEhPTgorICAgIHsgIldlYlBEZWNvZGVSR0IiLCAgMyB9LAorICAgIHsgIldlYlBEZWNvZGVSR0JBIiwgNCB9LAorICAgIHsgIldlYlBEZWNvZGVBUkdCIiwgNCB9LAorICAgIHsgIldlYlBEZWNvZGVCR1IiLCAgMyB9LAorICAgIHsgIldlYlBEZWNvZGVCR1JBIiwgNCB9LAorICAgIHsgIndyYXBfV2ViUEVuY29kZVJHQiIsICAxIH0sCisgICAgeyAid3JhcF9XZWJQRW5jb2RlQkdSIiwgIDEgfSwKKyAgICB7ICJ3cmFwX1dlYlBFbmNvZGVSR0JBIiwgMSB9LAorICAgIHsgIndyYXBfV2ViUEVuY29kZUJHUkEiLCAxIH0sCisgICAgeyAid3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NSR0IiLCAgMSB9LAorICAgIHsgIndyYXBfV2ViUEVuY29kZUxvc3NsZXNzQkdSIiwgIDEgfSwKKyAgICB7ICJ3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc1JHQkEiLCAxIH0sCisgICAgeyAid3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NCR1JBIiwgMSB9LAorI2VuZGlmCisgICAgeyBOVUxMLCAwIH0KKyAgfTsKKyAgY29uc3Qgc3RydWN0IHNpemVtYXAqIHA7CisgIHNpemVfdCBzaXplID0gMDsKKworICBmb3IgKHAgPSBzaXplX21hcDsgcC0+ZnVuY3Rpb247ICsrcCkgeworICAgIGlmICghc3RyY21wKGZ1bmN0aW9uLCBwLT5mdW5jdGlvbikpIHsKKyAgICAgIHNpemUgPSAqd2lkdGggKiAqaGVpZ2h0ICogcC0+c2l6ZV9tdWx0aXBsaWVyOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHNpemU7Cit9CisKKwordHlwZWRlZiBzaXplX3QgKCpXZWJQRW5jb2RlRnVuY3Rpb24pKGNvbnN0IHVpbnQ4X3QqIHJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcXVhbGl0eV9mYWN0b3IsIHVpbnQ4X3QqKiBvdXRwdXQpOwordHlwZWRlZiBzaXplX3QgKCpXZWJQRW5jb2RlTG9zc2xlc3NGdW5jdGlvbikoY29uc3QgdWludDhfdCogcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIG91dHB1dCk7CisKK3N0YXRpYyB1aW50OF90KiBFbmNvZGVMb3NzeShjb25zdCB1aW50OF90KiByZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHF1YWxpdHlfZmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBFbmNvZGVGdW5jdGlvbiBlbmNmbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIG91dHB1dF9zaXplLCBpbnQqIHVudXNlZCkgeworICB1aW50OF90KiBvdXRwdXQgPSBOVUxMOworICBjb25zdCBzaXplX3QgaW1hZ2Vfc2l6ZSA9CisgICAgICBlbmNmbihyZ2IsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgcXVhbGl0eV9mYWN0b3IsICZvdXRwdXQpOworICAvLyB0aGUgdmFsdWVzIG9mIGZvbGxvd2luZyB0d28gd2lsbCBiZSBpbnRlcnByZXRlZCBieSBSZXR1cm5lZEJ1ZmZlclNpemUoKQorICAvLyBhcyAnd2lkdGgnIGFuZCAnaGVpZ2h0JyBpbiB0aGUgc2l6ZSBjYWxjdWxhdGlvbi4KKyAgKm91dHB1dF9zaXplID0gaW1hZ2Vfc2l6ZTsKKyAgKnVudXNlZCA9IDE7CisgIHJldHVybiBpbWFnZV9zaXplID8gb3V0cHV0IDogTlVMTDsKK30KKworc3RhdGljIHVpbnQ4X3QqIEVuY29kZUxvc3NsZXNzKGNvbnN0IHVpbnQ4X3QqIHJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUEVuY29kZUxvc3NsZXNzRnVuY3Rpb24gZW5jZm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBvdXRwdXRfc2l6ZSwgaW50KiB1bnVzZWQpIHsKKyAgdWludDhfdCogb3V0cHV0ID0gTlVMTDsKKyAgY29uc3Qgc2l6ZV90IGltYWdlX3NpemUgPSBlbmNmbihyZ2IsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgJm91dHB1dCk7CisgIC8vIHRoZSB2YWx1ZXMgb2YgdGhlIGZvbGxvd2luZyB0d28gd2lsbCBiZSBpbnRlcnByZXRlZCBieQorICAvLyBSZXR1cm5lZEJ1ZmZlclNpemUoKSBhcyAnd2lkdGgnIGFuZCAnaGVpZ2h0JyBpbiB0aGUgc2l6ZSBjYWxjdWxhdGlvbi4KKyAgKm91dHB1dF9zaXplID0gaW1hZ2Vfc2l6ZTsKKyAgKnVudXNlZCA9IDE7CisgIHJldHVybiBpbWFnZV9zaXplID8gb3V0cHV0IDogTlVMTDsKK30KKworCisvLyBDaGFuZ2VzIHRoZSByZXR1cm4gdHlwZSBvZiBXZWJQRW5jb2RlKiB0byBtb3JlIGNsb3NlbHkgbWF0Y2ggRGVjb2RlKi4KKy8vIFRoaXMgYWxzbyBtYWtlcyBpdCBlYXNpZXIgdG8gd3JhcCB0aGUgb3V0cHV0IGJ1ZmZlciBpbiBhIG5hdGl2ZSB0eXBlIHJhdGhlcgorLy8gdGhhbiBkZWFsaW5nIHdpdGggdGhlIHJldHVybiBwb2ludGVyLgorLy8gVGhlIGFkZGl0aW9uYWwgcGFyYW1ldGVycyBhcmUgdG8gYWxsb3cgcmV1c2Ugb2YgUmV0dXJuZWRCdWZmZXJTaXplKCksCisvLyB1bnVzZWQyIGFuZCBvdXRwdXRfc2l6ZSB3aWxsIGJlIHVzZWQgaW4gdGhpcyBjYXNlLgorI2RlZmluZSBMT1NTWV9XUkFQUEVSKEZVTkMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgdWludDhfdCogd3JhcF8jI0ZVTkMoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY29uc3QgdWludDhfdCogcmdiLCBpbnQqIHVudXNlZDEsIGludCogdW51c2VkMiwgaW50KiBvdXRwdXRfc2l6ZSwgXAorICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLCBmbG9hdCBxdWFsaXR5X2ZhY3RvcikgeyAgICAgICAgXAorICAgIHJldHVybiBFbmNvZGVMb3NzeShyZ2IsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgcXVhbGl0eV9mYWN0b3IsICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICBGVU5DLCBvdXRwdXRfc2l6ZSwgdW51c2VkMik7ICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCitMT1NTWV9XUkFQUEVSKFdlYlBFbmNvZGVSR0IpCitMT1NTWV9XUkFQUEVSKFdlYlBFbmNvZGVCR1IpCitMT1NTWV9XUkFQUEVSKFdlYlBFbmNvZGVSR0JBKQorTE9TU1lfV1JBUFBFUihXZWJQRW5jb2RlQkdSQSkKKworI3VuZGVmIExPU1NZX1dSQVBQRVIKKworI2RlZmluZSBMT1NTTEVTU19XUkFQUEVSKEZVTkMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgdWludDhfdCogd3JhcF8jI0ZVTkMoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY29uc3QgdWludDhfdCogcmdiLCBpbnQqIHVudXNlZDEsIGludCogdW51c2VkMiwgaW50KiBvdXRwdXRfc2l6ZSwgXAorICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBFbmNvZGVMb3NzbGVzcyhyZ2IsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVU5DLCBvdXRwdXRfc2l6ZSwgdW51c2VkMik7ICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCitMT1NTTEVTU19XUkFQUEVSKFdlYlBFbmNvZGVMb3NzbGVzc1JHQikKK0xPU1NMRVNTX1dSQVBQRVIoV2ViUEVuY29kZUxvc3NsZXNzQkdSKQorTE9TU0xFU1NfV1JBUFBFUihXZWJQRW5jb2RlTG9zc2xlc3NSR0JBKQorTE9TU0xFU1NfV1JBUFBFUihXZWJQRW5jb2RlTG9zc2xlc3NCR1JBKQorCisjdW5kZWYgTE9TU0xFU1NfV1JBUFBFUgorCisKKworLyogV29yayBhcm91bmQgYnJva2VuIGdjaiBqbmkuaCAqLworI2lmZGVmIF9fR0NKX0pOSV9IX18KKyMgdW5kZWYgSk5JRVhQT1JUCisjIGRlZmluZSBKTklFWFBPUlQKKyMgdW5kZWYgSk5JQ0FMTAorIyBkZWZpbmUgSk5JQ0FMTAorI2VuZGlmCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitTV0lHRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX1dlYlBHZXREZWNvZGVyVmVyc2lvbihKTklFbnYgKmplbnYsIGpjbGFzcyBqY2xzKSB7CisgIGppbnQganJlc3VsdCA9IDAgOworICBpbnQgcmVzdWx0OworCisgICh2b2lkKWplbnY7CisgICh2b2lkKWpjbHM7CisgIHJlc3VsdCA9IChpbnQpV2ViUEdldERlY29kZXJWZXJzaW9uKCk7CisgIGpyZXN1bHQgPSAoamludClyZXN1bHQ7CisgIHJldHVybiBqcmVzdWx0OworfQorCisKK1NXSUdFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfV2ViUEdldEluZm8oSk5JRW52ICpqZW52LCBqY2xhc3MgamNscywgamJ5dGVBcnJheSBqYXJnMSwgamxvbmcgamFyZzIsIGppbnRBcnJheSBqYXJnMywgamludEFycmF5IGphcmc0KSB7CisgIGppbnQganJlc3VsdCA9IDAgOworICB1aW50OF90ICphcmcxID0gKHVpbnQ4X3QgKikgMCA7CisgIHNpemVfdCBhcmcyIDsKKyAgaW50ICphcmczID0gKGludCAqKSAwIDsKKyAgaW50ICphcmc0ID0gKGludCAqKSAwIDsKKyAgamJ5dGUgKmphcnIxIDsKKyAgaW50IHRlbXAzIDsKKyAgaW50IHRlbXA0IDsKKyAgaW50IHJlc3VsdDsKKworICAodm9pZClqZW52OworICAodm9pZClqY2xzOworICBpZiAoIVNXSUdfSmF2YUFycmF5SW5VaW50OChqZW52LCAmamFycjEsICZhcmcxLCBqYXJnMSkpIHJldHVybiAwOworICBhcmcyID0gKHNpemVfdClqYXJnMjsKKyAgeworICAgIGlmICghamFyZzMpIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YU51bGxQb2ludGVyRXhjZXB0aW9uLCAiYXJyYXkgbnVsbCIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICgoKmplbnYpLT5HZXRBcnJheUxlbmd0aChqZW52LCBqYXJnMykgPT0gMCkgeworICAgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiwgIkFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCAxIGVsZW1lbnQiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhcmczID0gJnRlbXAzOworICB9CisgIHsKKyAgICBpZiAoIWphcmc0KSB7CisgICAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFOdWxsUG9pbnRlckV4Y2VwdGlvbiwgImFycmF5IG51bGwiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoKCpqZW52KS0+R2V0QXJyYXlMZW5ndGgoamVudiwgamFyZzQpID09IDApIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24sICJBcnJheSBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgMSBlbGVtZW50Iik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYXJnNCA9ICZ0ZW1wNDsKKyAgfQorICByZXN1bHQgPSAoaW50KVdlYlBHZXRJbmZvKCh1aW50OF90IGNvbnN0ICopYXJnMSxhcmcyLGFyZzMsYXJnNCk7CisgIGpyZXN1bHQgPSAoamludClyZXN1bHQ7CisgIFNXSUdfSmF2YUFycmF5QXJnb3V0VWludDgoamVudiwgamFycjEsIGFyZzEsIGphcmcxKTsKKyAgeworICAgIGppbnQganZhbHVlID0gKGppbnQpdGVtcDM7CisgICAgKCpqZW52KS0+U2V0SW50QXJyYXlSZWdpb24oamVudiwgamFyZzMsIDAsIDEsICZqdmFsdWUpOworICB9CisgIHsKKyAgICBqaW50IGp2YWx1ZSA9IChqaW50KXRlbXA0OworICAgICgqamVudiktPlNldEludEFycmF5UmVnaW9uKGplbnYsIGphcmc0LCAwLCAxLCAmanZhbHVlKTsKKyAgfQorICBmcmVlKGFyZzEpOworCisKKyAgcmV0dXJuIGpyZXN1bHQ7Cit9CisKKworU1dJR0VYUE9SVCBqYnl0ZUFycmF5IEpOSUNBTEwgSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV9XZWJQRGVjb2RlUkdCKEpOSUVudiAqamVudiwgamNsYXNzIGpjbHMsIGpieXRlQXJyYXkgamFyZzEsIGpsb25nIGphcmcyLCBqaW50QXJyYXkgamFyZzMsIGppbnRBcnJheSBqYXJnNCkgeworICBqYnl0ZUFycmF5IGpyZXN1bHQgPSAwIDsKKyAgdWludDhfdCAqYXJnMSA9ICh1aW50OF90ICopIDAgOworICBzaXplX3QgYXJnMiA7CisgIGludCAqYXJnMyA9IChpbnQgKikgMCA7CisgIGludCAqYXJnNCA9IChpbnQgKikgMCA7CisgIGpieXRlICpqYXJyMSA7CisgIGludCB0ZW1wMyA7CisgIGludCB0ZW1wNCA7CisgIHVpbnQ4X3QgKnJlc3VsdCA9IDAgOworCisgICh2b2lkKWplbnY7CisgICh2b2lkKWpjbHM7CisgIGlmICghU1dJR19KYXZhQXJyYXlJblVpbnQ4KGplbnYsICZqYXJyMSwgJmFyZzEsIGphcmcxKSkgcmV0dXJuIDA7CisgIGFyZzIgPSAoc2l6ZV90KWphcmcyOworICB7CisgICAgaWYgKCFqYXJnMykgeworICAgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhTnVsbFBvaW50ZXJFeGNlcHRpb24sICJhcnJheSBudWxsIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKCgqamVudiktPkdldEFycmF5TGVuZ3RoKGplbnYsIGphcmczKSA9PSAwKSB7CisgICAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLCAiQXJyYXkgbXVzdCBjb250YWluIGF0IGxlYXN0IDEgZWxlbWVudCIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGFyZzMgPSAmdGVtcDM7CisgIH0KKyAgeworICAgIGlmICghamFyZzQpIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YU51bGxQb2ludGVyRXhjZXB0aW9uLCAiYXJyYXkgbnVsbCIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICgoKmplbnYpLT5HZXRBcnJheUxlbmd0aChqZW52LCBqYXJnNCkgPT0gMCkgeworICAgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiwgIkFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCAxIGVsZW1lbnQiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhcmc0ID0gJnRlbXA0OworICB9CisgIHJlc3VsdCA9ICh1aW50OF90ICopV2ViUERlY29kZVJHQigodWludDhfdCBjb25zdCAqKWFyZzEsYXJnMixhcmczLGFyZzQpOworICBqcmVzdWx0ID0gU1dJR19KYXZhQXJyYXlPdXRVaW50OChqZW52LCByZXN1bHQsIEZpbGxNZUluQXNTaXplQ2Fubm90QmVEZXRlcm1pbmVkQXV0b21hdGljYWxseSk7CisgIFNXSUdfSmF2YUFycmF5QXJnb3V0VWludDgoamVudiwgamFycjEsIGFyZzEsIGphcmcxKTsKKyAgeworICAgIGppbnQganZhbHVlID0gKGppbnQpdGVtcDM7CisgICAgKCpqZW52KS0+U2V0SW50QXJyYXlSZWdpb24oamVudiwgamFyZzMsIDAsIDEsICZqdmFsdWUpOworICB9CisgIHsKKyAgICBqaW50IGp2YWx1ZSA9IChqaW50KXRlbXA0OworICAgICgqamVudiktPlNldEludEFycmF5UmVnaW9uKGplbnYsIGphcmc0LCAwLCAxLCAmanZhbHVlKTsKKyAgfQorICBmcmVlKGFyZzEpOworCisKKyAgZnJlZShyZXN1bHQpOworICByZXR1cm4ganJlc3VsdDsKK30KKworCitTV0lHRVhQT1JUIGpieXRlQXJyYXkgSk5JQ0FMTCBKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX1dlYlBEZWNvZGVSR0JBKEpOSUVudiAqamVudiwgamNsYXNzIGpjbHMsIGpieXRlQXJyYXkgamFyZzEsIGpsb25nIGphcmcyLCBqaW50QXJyYXkgamFyZzMsIGppbnRBcnJheSBqYXJnNCkgeworICBqYnl0ZUFycmF5IGpyZXN1bHQgPSAwIDsKKyAgdWludDhfdCAqYXJnMSA9ICh1aW50OF90ICopIDAgOworICBzaXplX3QgYXJnMiA7CisgIGludCAqYXJnMyA9IChpbnQgKikgMCA7CisgIGludCAqYXJnNCA9IChpbnQgKikgMCA7CisgIGpieXRlICpqYXJyMSA7CisgIGludCB0ZW1wMyA7CisgIGludCB0ZW1wNCA7CisgIHVpbnQ4X3QgKnJlc3VsdCA9IDAgOworCisgICh2b2lkKWplbnY7CisgICh2b2lkKWpjbHM7CisgIGlmICghU1dJR19KYXZhQXJyYXlJblVpbnQ4KGplbnYsICZqYXJyMSwgJmFyZzEsIGphcmcxKSkgcmV0dXJuIDA7CisgIGFyZzIgPSAoc2l6ZV90KWphcmcyOworICB7CisgICAgaWYgKCFqYXJnMykgeworICAgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhTnVsbFBvaW50ZXJFeGNlcHRpb24sICJhcnJheSBudWxsIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKCgqamVudiktPkdldEFycmF5TGVuZ3RoKGplbnYsIGphcmczKSA9PSAwKSB7CisgICAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLCAiQXJyYXkgbXVzdCBjb250YWluIGF0IGxlYXN0IDEgZWxlbWVudCIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGFyZzMgPSAmdGVtcDM7CisgIH0KKyAgeworICAgIGlmICghamFyZzQpIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YU51bGxQb2ludGVyRXhjZXB0aW9uLCAiYXJyYXkgbnVsbCIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICgoKmplbnYpLT5HZXRBcnJheUxlbmd0aChqZW52LCBqYXJnNCkgPT0gMCkgeworICAgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiwgIkFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCAxIGVsZW1lbnQiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhcmc0ID0gJnRlbXA0OworICB9CisgIHJlc3VsdCA9ICh1aW50OF90ICopV2ViUERlY29kZVJHQkEoKHVpbnQ4X3QgY29uc3QgKilhcmcxLGFyZzIsYXJnMyxhcmc0KTsKKyAganJlc3VsdCA9IFNXSUdfSmF2YUFycmF5T3V0VWludDgoamVudiwgcmVzdWx0LCBGaWxsTWVJbkFzU2l6ZUNhbm5vdEJlRGV0ZXJtaW5lZEF1dG9tYXRpY2FsbHkpOworICBTV0lHX0phdmFBcnJheUFyZ291dFVpbnQ4KGplbnYsIGphcnIxLCBhcmcxLCBqYXJnMSk7CisgIHsKKyAgICBqaW50IGp2YWx1ZSA9IChqaW50KXRlbXAzOworICAgICgqamVudiktPlNldEludEFycmF5UmVnaW9uKGplbnYsIGphcmczLCAwLCAxLCAmanZhbHVlKTsKKyAgfQorICB7CisgICAgamludCBqdmFsdWUgPSAoamludCl0ZW1wNDsKKyAgICAoKmplbnYpLT5TZXRJbnRBcnJheVJlZ2lvbihqZW52LCBqYXJnNCwgMCwgMSwgJmp2YWx1ZSk7CisgIH0KKyAgZnJlZShhcmcxKTsKKworCisgIGZyZWUocmVzdWx0KTsKKyAgcmV0dXJuIGpyZXN1bHQ7Cit9CisKKworU1dJR0VYUE9SVCBqYnl0ZUFycmF5IEpOSUNBTEwgSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV9XZWJQRGVjb2RlQVJHQihKTklFbnYgKmplbnYsIGpjbGFzcyBqY2xzLCBqYnl0ZUFycmF5IGphcmcxLCBqbG9uZyBqYXJnMiwgamludEFycmF5IGphcmczLCBqaW50QXJyYXkgamFyZzQpIHsKKyAgamJ5dGVBcnJheSBqcmVzdWx0ID0gMCA7CisgIHVpbnQ4X3QgKmFyZzEgPSAodWludDhfdCAqKSAwIDsKKyAgc2l6ZV90IGFyZzIgOworICBpbnQgKmFyZzMgPSAoaW50ICopIDAgOworICBpbnQgKmFyZzQgPSAoaW50ICopIDAgOworICBqYnl0ZSAqamFycjEgOworICBpbnQgdGVtcDMgOworICBpbnQgdGVtcDQgOworICB1aW50OF90ICpyZXN1bHQgPSAwIDsKKworICAodm9pZClqZW52OworICAodm9pZClqY2xzOworICBpZiAoIVNXSUdfSmF2YUFycmF5SW5VaW50OChqZW52LCAmamFycjEsICZhcmcxLCBqYXJnMSkpIHJldHVybiAwOworICBhcmcyID0gKHNpemVfdClqYXJnMjsKKyAgeworICAgIGlmICghamFyZzMpIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YU51bGxQb2ludGVyRXhjZXB0aW9uLCAiYXJyYXkgbnVsbCIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICgoKmplbnYpLT5HZXRBcnJheUxlbmd0aChqZW52LCBqYXJnMykgPT0gMCkgeworICAgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiwgIkFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCAxIGVsZW1lbnQiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhcmczID0gJnRlbXAzOworICB9CisgIHsKKyAgICBpZiAoIWphcmc0KSB7CisgICAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFOdWxsUG9pbnRlckV4Y2VwdGlvbiwgImFycmF5IG51bGwiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoKCpqZW52KS0+R2V0QXJyYXlMZW5ndGgoamVudiwgamFyZzQpID09IDApIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24sICJBcnJheSBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgMSBlbGVtZW50Iik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYXJnNCA9ICZ0ZW1wNDsKKyAgfQorICByZXN1bHQgPSAodWludDhfdCAqKVdlYlBEZWNvZGVBUkdCKCh1aW50OF90IGNvbnN0ICopYXJnMSxhcmcyLGFyZzMsYXJnNCk7CisgIGpyZXN1bHQgPSBTV0lHX0phdmFBcnJheU91dFVpbnQ4KGplbnYsIHJlc3VsdCwgRmlsbE1lSW5Bc1NpemVDYW5ub3RCZURldGVybWluZWRBdXRvbWF0aWNhbGx5KTsKKyAgU1dJR19KYXZhQXJyYXlBcmdvdXRVaW50OChqZW52LCBqYXJyMSwgYXJnMSwgamFyZzEpOworICB7CisgICAgamludCBqdmFsdWUgPSAoamludCl0ZW1wMzsKKyAgICAoKmplbnYpLT5TZXRJbnRBcnJheVJlZ2lvbihqZW52LCBqYXJnMywgMCwgMSwgJmp2YWx1ZSk7CisgIH0KKyAgeworICAgIGppbnQganZhbHVlID0gKGppbnQpdGVtcDQ7CisgICAgKCpqZW52KS0+U2V0SW50QXJyYXlSZWdpb24oamVudiwgamFyZzQsIDAsIDEsICZqdmFsdWUpOworICB9CisgIGZyZWUoYXJnMSk7CisKKworICBmcmVlKHJlc3VsdCk7CisgIHJldHVybiBqcmVzdWx0OworfQorCisKK1NXSUdFWFBPUlQgamJ5dGVBcnJheSBKTklDQUxMIEphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfV2ViUERlY29kZUJHUihKTklFbnYgKmplbnYsIGpjbGFzcyBqY2xzLCBqYnl0ZUFycmF5IGphcmcxLCBqbG9uZyBqYXJnMiwgamludEFycmF5IGphcmczLCBqaW50QXJyYXkgamFyZzQpIHsKKyAgamJ5dGVBcnJheSBqcmVzdWx0ID0gMCA7CisgIHVpbnQ4X3QgKmFyZzEgPSAodWludDhfdCAqKSAwIDsKKyAgc2l6ZV90IGFyZzIgOworICBpbnQgKmFyZzMgPSAoaW50ICopIDAgOworICBpbnQgKmFyZzQgPSAoaW50ICopIDAgOworICBqYnl0ZSAqamFycjEgOworICBpbnQgdGVtcDMgOworICBpbnQgdGVtcDQgOworICB1aW50OF90ICpyZXN1bHQgPSAwIDsKKworICAodm9pZClqZW52OworICAodm9pZClqY2xzOworICBpZiAoIVNXSUdfSmF2YUFycmF5SW5VaW50OChqZW52LCAmamFycjEsICZhcmcxLCBqYXJnMSkpIHJldHVybiAwOworICBhcmcyID0gKHNpemVfdClqYXJnMjsKKyAgeworICAgIGlmICghamFyZzMpIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YU51bGxQb2ludGVyRXhjZXB0aW9uLCAiYXJyYXkgbnVsbCIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICgoKmplbnYpLT5HZXRBcnJheUxlbmd0aChqZW52LCBqYXJnMykgPT0gMCkgeworICAgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiwgIkFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCAxIGVsZW1lbnQiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhcmczID0gJnRlbXAzOworICB9CisgIHsKKyAgICBpZiAoIWphcmc0KSB7CisgICAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFOdWxsUG9pbnRlckV4Y2VwdGlvbiwgImFycmF5IG51bGwiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoKCpqZW52KS0+R2V0QXJyYXlMZW5ndGgoamVudiwgamFyZzQpID09IDApIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24sICJBcnJheSBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgMSBlbGVtZW50Iik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYXJnNCA9ICZ0ZW1wNDsKKyAgfQorICByZXN1bHQgPSAodWludDhfdCAqKVdlYlBEZWNvZGVCR1IoKHVpbnQ4X3QgY29uc3QgKilhcmcxLGFyZzIsYXJnMyxhcmc0KTsKKyAganJlc3VsdCA9IFNXSUdfSmF2YUFycmF5T3V0VWludDgoamVudiwgcmVzdWx0LCBGaWxsTWVJbkFzU2l6ZUNhbm5vdEJlRGV0ZXJtaW5lZEF1dG9tYXRpY2FsbHkpOworICBTV0lHX0phdmFBcnJheUFyZ291dFVpbnQ4KGplbnYsIGphcnIxLCBhcmcxLCBqYXJnMSk7CisgIHsKKyAgICBqaW50IGp2YWx1ZSA9IChqaW50KXRlbXAzOworICAgICgqamVudiktPlNldEludEFycmF5UmVnaW9uKGplbnYsIGphcmczLCAwLCAxLCAmanZhbHVlKTsKKyAgfQorICB7CisgICAgamludCBqdmFsdWUgPSAoamludCl0ZW1wNDsKKyAgICAoKmplbnYpLT5TZXRJbnRBcnJheVJlZ2lvbihqZW52LCBqYXJnNCwgMCwgMSwgJmp2YWx1ZSk7CisgIH0KKyAgZnJlZShhcmcxKTsKKworCisgIGZyZWUocmVzdWx0KTsKKyAgcmV0dXJuIGpyZXN1bHQ7Cit9CisKKworU1dJR0VYUE9SVCBqYnl0ZUFycmF5IEpOSUNBTEwgSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV9XZWJQRGVjb2RlQkdSQShKTklFbnYgKmplbnYsIGpjbGFzcyBqY2xzLCBqYnl0ZUFycmF5IGphcmcxLCBqbG9uZyBqYXJnMiwgamludEFycmF5IGphcmczLCBqaW50QXJyYXkgamFyZzQpIHsKKyAgamJ5dGVBcnJheSBqcmVzdWx0ID0gMCA7CisgIHVpbnQ4X3QgKmFyZzEgPSAodWludDhfdCAqKSAwIDsKKyAgc2l6ZV90IGFyZzIgOworICBpbnQgKmFyZzMgPSAoaW50ICopIDAgOworICBpbnQgKmFyZzQgPSAoaW50ICopIDAgOworICBqYnl0ZSAqamFycjEgOworICBpbnQgdGVtcDMgOworICBpbnQgdGVtcDQgOworICB1aW50OF90ICpyZXN1bHQgPSAwIDsKKworICAodm9pZClqZW52OworICAodm9pZClqY2xzOworICBpZiAoIVNXSUdfSmF2YUFycmF5SW5VaW50OChqZW52LCAmamFycjEsICZhcmcxLCBqYXJnMSkpIHJldHVybiAwOworICBhcmcyID0gKHNpemVfdClqYXJnMjsKKyAgeworICAgIGlmICghamFyZzMpIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YU51bGxQb2ludGVyRXhjZXB0aW9uLCAiYXJyYXkgbnVsbCIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICgoKmplbnYpLT5HZXRBcnJheUxlbmd0aChqZW52LCBqYXJnMykgPT0gMCkgeworICAgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiwgIkFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCAxIGVsZW1lbnQiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhcmczID0gJnRlbXAzOworICB9CisgIHsKKyAgICBpZiAoIWphcmc0KSB7CisgICAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFOdWxsUG9pbnRlckV4Y2VwdGlvbiwgImFycmF5IG51bGwiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoKCpqZW52KS0+R2V0QXJyYXlMZW5ndGgoamVudiwgamFyZzQpID09IDApIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24sICJBcnJheSBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgMSBlbGVtZW50Iik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYXJnNCA9ICZ0ZW1wNDsKKyAgfQorICByZXN1bHQgPSAodWludDhfdCAqKVdlYlBEZWNvZGVCR1JBKCh1aW50OF90IGNvbnN0ICopYXJnMSxhcmcyLGFyZzMsYXJnNCk7CisgIGpyZXN1bHQgPSBTV0lHX0phdmFBcnJheU91dFVpbnQ4KGplbnYsIHJlc3VsdCwgRmlsbE1lSW5Bc1NpemVDYW5ub3RCZURldGVybWluZWRBdXRvbWF0aWNhbGx5KTsKKyAgU1dJR19KYXZhQXJyYXlBcmdvdXRVaW50OChqZW52LCBqYXJyMSwgYXJnMSwgamFyZzEpOworICB7CisgICAgamludCBqdmFsdWUgPSAoamludCl0ZW1wMzsKKyAgICAoKmplbnYpLT5TZXRJbnRBcnJheVJlZ2lvbihqZW52LCBqYXJnMywgMCwgMSwgJmp2YWx1ZSk7CisgIH0KKyAgeworICAgIGppbnQganZhbHVlID0gKGppbnQpdGVtcDQ7CisgICAgKCpqZW52KS0+U2V0SW50QXJyYXlSZWdpb24oamVudiwgamFyZzQsIDAsIDEsICZqdmFsdWUpOworICB9CisgIGZyZWUoYXJnMSk7CisKKworICBmcmVlKHJlc3VsdCk7CisgIHJldHVybiBqcmVzdWx0OworfQorCisKK1NXSUdFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfV2ViUEdldEVuY29kZXJWZXJzaW9uKEpOSUVudiAqamVudiwgamNsYXNzIGpjbHMpIHsKKyAgamludCBqcmVzdWx0ID0gMCA7CisgIGludCByZXN1bHQ7CisKKyAgKHZvaWQpamVudjsKKyAgKHZvaWQpamNsczsKKyAgcmVzdWx0ID0gKGludClXZWJQR2V0RW5jb2RlclZlcnNpb24oKTsKKyAganJlc3VsdCA9IChqaW50KXJlc3VsdDsKKyAgcmV0dXJuIGpyZXN1bHQ7Cit9CisKKworU1dJR0VYUE9SVCBqYnl0ZUFycmF5IEpOSUNBTEwgSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV93cmFwXzFXZWJQRW5jb2RlUkdCKEpOSUVudiAqamVudiwgamNsYXNzIGpjbHMsIGpieXRlQXJyYXkgamFyZzEsIGppbnQgamFyZzIsIGppbnQgamFyZzMsIGppbnRBcnJheSBqYXJnNCwgamludCBqYXJnNSwgamludCBqYXJnNiwgamludCBqYXJnNywgamZsb2F0IGphcmc4KSB7CisgIGpieXRlQXJyYXkganJlc3VsdCA9IDAgOworICB1aW50OF90ICphcmcxID0gKHVpbnQ4X3QgKikgMCA7CisgIGludCAqYXJnMiA9IChpbnQgKikgMCA7CisgIGludCAqYXJnMyA9IChpbnQgKikgMCA7CisgIGludCAqYXJnNCA9IChpbnQgKikgMCA7CisgIGludCBhcmc1IDsKKyAgaW50IGFyZzYgOworICBpbnQgYXJnNyA7CisgIGZsb2F0IGFyZzggOworICBqYnl0ZSAqamFycjEgOworICBpbnQgdGVtcDQgOworICB1aW50OF90ICpyZXN1bHQgPSAwIDsKKworICAodm9pZClqZW52OworICAodm9pZClqY2xzOworICBpZiAoIVNXSUdfSmF2YUFycmF5SW5VaW50OChqZW52LCAmamFycjEsICZhcmcxLCBqYXJnMSkpIHJldHVybiAwOworICBhcmcyID0gKGludCAqKSZqYXJnMjsKKyAgYXJnMyA9IChpbnQgKikmamFyZzM7CisgIHsKKyAgICBpZiAoIWphcmc0KSB7CisgICAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFOdWxsUG9pbnRlckV4Y2VwdGlvbiwgImFycmF5IG51bGwiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoKCpqZW52KS0+R2V0QXJyYXlMZW5ndGgoamVudiwgamFyZzQpID09IDApIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24sICJBcnJheSBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgMSBlbGVtZW50Iik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYXJnNCA9ICZ0ZW1wNDsKKyAgfQorICBhcmc1ID0gKGludClqYXJnNTsKKyAgYXJnNiA9IChpbnQpamFyZzY7CisgIGFyZzcgPSAoaW50KWphcmc3OworICBhcmc4ID0gKGZsb2F0KWphcmc4OworICByZXN1bHQgPSAodWludDhfdCAqKXdyYXBfV2ViUEVuY29kZVJHQigodWludDhfdCBjb25zdCAqKWFyZzEsYXJnMixhcmczLGFyZzQsYXJnNSxhcmc2LGFyZzcsYXJnOCk7CisgIGpyZXN1bHQgPSBTV0lHX0phdmFBcnJheU91dFVpbnQ4KGplbnYsIHJlc3VsdCwgRmlsbE1lSW5Bc1NpemVDYW5ub3RCZURldGVybWluZWRBdXRvbWF0aWNhbGx5KTsKKyAgU1dJR19KYXZhQXJyYXlBcmdvdXRVaW50OChqZW52LCBqYXJyMSwgYXJnMSwgamFyZzEpOworICB7CisgICAgamludCBqdmFsdWUgPSAoamludCl0ZW1wNDsKKyAgICAoKmplbnYpLT5TZXRJbnRBcnJheVJlZ2lvbihqZW52LCBqYXJnNCwgMCwgMSwgJmp2YWx1ZSk7CisgIH0KKyAgZnJlZShhcmcxKTsKKworCisKKyAgZnJlZShyZXN1bHQpOworICByZXR1cm4ganJlc3VsdDsKK30KKworCitTV0lHRVhQT1JUIGpieXRlQXJyYXkgSk5JQ0FMTCBKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX3dyYXBfMVdlYlBFbmNvZGVCR1IoSk5JRW52ICpqZW52LCBqY2xhc3MgamNscywgamJ5dGVBcnJheSBqYXJnMSwgamludCBqYXJnMiwgamludCBqYXJnMywgamludEFycmF5IGphcmc0LCBqaW50IGphcmc1LCBqaW50IGphcmc2LCBqaW50IGphcmc3LCBqZmxvYXQgamFyZzgpIHsKKyAgamJ5dGVBcnJheSBqcmVzdWx0ID0gMCA7CisgIHVpbnQ4X3QgKmFyZzEgPSAodWludDhfdCAqKSAwIDsKKyAgaW50ICphcmcyID0gKGludCAqKSAwIDsKKyAgaW50ICphcmczID0gKGludCAqKSAwIDsKKyAgaW50ICphcmc0ID0gKGludCAqKSAwIDsKKyAgaW50IGFyZzUgOworICBpbnQgYXJnNiA7CisgIGludCBhcmc3IDsKKyAgZmxvYXQgYXJnOCA7CisgIGpieXRlICpqYXJyMSA7CisgIGludCB0ZW1wNCA7CisgIHVpbnQ4X3QgKnJlc3VsdCA9IDAgOworCisgICh2b2lkKWplbnY7CisgICh2b2lkKWpjbHM7CisgIGlmICghU1dJR19KYXZhQXJyYXlJblVpbnQ4KGplbnYsICZqYXJyMSwgJmFyZzEsIGphcmcxKSkgcmV0dXJuIDA7CisgIGFyZzIgPSAoaW50ICopJmphcmcyOworICBhcmczID0gKGludCAqKSZqYXJnMzsKKyAgeworICAgIGlmICghamFyZzQpIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YU51bGxQb2ludGVyRXhjZXB0aW9uLCAiYXJyYXkgbnVsbCIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICgoKmplbnYpLT5HZXRBcnJheUxlbmd0aChqZW52LCBqYXJnNCkgPT0gMCkgeworICAgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiwgIkFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCAxIGVsZW1lbnQiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhcmc0ID0gJnRlbXA0OworICB9CisgIGFyZzUgPSAoaW50KWphcmc1OworICBhcmc2ID0gKGludClqYXJnNjsKKyAgYXJnNyA9IChpbnQpamFyZzc7CisgIGFyZzggPSAoZmxvYXQpamFyZzg7CisgIHJlc3VsdCA9ICh1aW50OF90ICopd3JhcF9XZWJQRW5jb2RlQkdSKCh1aW50OF90IGNvbnN0ICopYXJnMSxhcmcyLGFyZzMsYXJnNCxhcmc1LGFyZzYsYXJnNyxhcmc4KTsKKyAganJlc3VsdCA9IFNXSUdfSmF2YUFycmF5T3V0VWludDgoamVudiwgcmVzdWx0LCBGaWxsTWVJbkFzU2l6ZUNhbm5vdEJlRGV0ZXJtaW5lZEF1dG9tYXRpY2FsbHkpOworICBTV0lHX0phdmFBcnJheUFyZ291dFVpbnQ4KGplbnYsIGphcnIxLCBhcmcxLCBqYXJnMSk7CisgIHsKKyAgICBqaW50IGp2YWx1ZSA9IChqaW50KXRlbXA0OworICAgICgqamVudiktPlNldEludEFycmF5UmVnaW9uKGplbnYsIGphcmc0LCAwLCAxLCAmanZhbHVlKTsKKyAgfQorICBmcmVlKGFyZzEpOworCisKKworICBmcmVlKHJlc3VsdCk7CisgIHJldHVybiBqcmVzdWx0OworfQorCisKK1NXSUdFWFBPUlQgamJ5dGVBcnJheSBKTklDQUxMIEphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfd3JhcF8xV2ViUEVuY29kZVJHQkEoSk5JRW52ICpqZW52LCBqY2xhc3MgamNscywgamJ5dGVBcnJheSBqYXJnMSwgamludCBqYXJnMiwgamludCBqYXJnMywgamludEFycmF5IGphcmc0LCBqaW50IGphcmc1LCBqaW50IGphcmc2LCBqaW50IGphcmc3LCBqZmxvYXQgamFyZzgpIHsKKyAgamJ5dGVBcnJheSBqcmVzdWx0ID0gMCA7CisgIHVpbnQ4X3QgKmFyZzEgPSAodWludDhfdCAqKSAwIDsKKyAgaW50ICphcmcyID0gKGludCAqKSAwIDsKKyAgaW50ICphcmczID0gKGludCAqKSAwIDsKKyAgaW50ICphcmc0ID0gKGludCAqKSAwIDsKKyAgaW50IGFyZzUgOworICBpbnQgYXJnNiA7CisgIGludCBhcmc3IDsKKyAgZmxvYXQgYXJnOCA7CisgIGpieXRlICpqYXJyMSA7CisgIGludCB0ZW1wNCA7CisgIHVpbnQ4X3QgKnJlc3VsdCA9IDAgOworCisgICh2b2lkKWplbnY7CisgICh2b2lkKWpjbHM7CisgIGlmICghU1dJR19KYXZhQXJyYXlJblVpbnQ4KGplbnYsICZqYXJyMSwgJmFyZzEsIGphcmcxKSkgcmV0dXJuIDA7CisgIGFyZzIgPSAoaW50ICopJmphcmcyOworICBhcmczID0gKGludCAqKSZqYXJnMzsKKyAgeworICAgIGlmICghamFyZzQpIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YU51bGxQb2ludGVyRXhjZXB0aW9uLCAiYXJyYXkgbnVsbCIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICgoKmplbnYpLT5HZXRBcnJheUxlbmd0aChqZW52LCBqYXJnNCkgPT0gMCkgeworICAgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiwgIkFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCAxIGVsZW1lbnQiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhcmc0ID0gJnRlbXA0OworICB9CisgIGFyZzUgPSAoaW50KWphcmc1OworICBhcmc2ID0gKGludClqYXJnNjsKKyAgYXJnNyA9IChpbnQpamFyZzc7CisgIGFyZzggPSAoZmxvYXQpamFyZzg7CisgIHJlc3VsdCA9ICh1aW50OF90ICopd3JhcF9XZWJQRW5jb2RlUkdCQSgodWludDhfdCBjb25zdCAqKWFyZzEsYXJnMixhcmczLGFyZzQsYXJnNSxhcmc2LGFyZzcsYXJnOCk7CisgIGpyZXN1bHQgPSBTV0lHX0phdmFBcnJheU91dFVpbnQ4KGplbnYsIHJlc3VsdCwgRmlsbE1lSW5Bc1NpemVDYW5ub3RCZURldGVybWluZWRBdXRvbWF0aWNhbGx5KTsKKyAgU1dJR19KYXZhQXJyYXlBcmdvdXRVaW50OChqZW52LCBqYXJyMSwgYXJnMSwgamFyZzEpOworICB7CisgICAgamludCBqdmFsdWUgPSAoamludCl0ZW1wNDsKKyAgICAoKmplbnYpLT5TZXRJbnRBcnJheVJlZ2lvbihqZW52LCBqYXJnNCwgMCwgMSwgJmp2YWx1ZSk7CisgIH0KKyAgZnJlZShhcmcxKTsKKworCisKKyAgZnJlZShyZXN1bHQpOworICByZXR1cm4ganJlc3VsdDsKK30KKworCitTV0lHRVhQT1JUIGpieXRlQXJyYXkgSk5JQ0FMTCBKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX3dyYXBfMVdlYlBFbmNvZGVCR1JBKEpOSUVudiAqamVudiwgamNsYXNzIGpjbHMsIGpieXRlQXJyYXkgamFyZzEsIGppbnQgamFyZzIsIGppbnQgamFyZzMsIGppbnRBcnJheSBqYXJnNCwgamludCBqYXJnNSwgamludCBqYXJnNiwgamludCBqYXJnNywgamZsb2F0IGphcmc4KSB7CisgIGpieXRlQXJyYXkganJlc3VsdCA9IDAgOworICB1aW50OF90ICphcmcxID0gKHVpbnQ4X3QgKikgMCA7CisgIGludCAqYXJnMiA9IChpbnQgKikgMCA7CisgIGludCAqYXJnMyA9IChpbnQgKikgMCA7CisgIGludCAqYXJnNCA9IChpbnQgKikgMCA7CisgIGludCBhcmc1IDsKKyAgaW50IGFyZzYgOworICBpbnQgYXJnNyA7CisgIGZsb2F0IGFyZzggOworICBqYnl0ZSAqamFycjEgOworICBpbnQgdGVtcDQgOworICB1aW50OF90ICpyZXN1bHQgPSAwIDsKKworICAodm9pZClqZW52OworICAodm9pZClqY2xzOworICBpZiAoIVNXSUdfSmF2YUFycmF5SW5VaW50OChqZW52LCAmamFycjEsICZhcmcxLCBqYXJnMSkpIHJldHVybiAwOworICBhcmcyID0gKGludCAqKSZqYXJnMjsKKyAgYXJnMyA9IChpbnQgKikmamFyZzM7CisgIHsKKyAgICBpZiAoIWphcmc0KSB7CisgICAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFOdWxsUG9pbnRlckV4Y2VwdGlvbiwgImFycmF5IG51bGwiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoKCpqZW52KS0+R2V0QXJyYXlMZW5ndGgoamVudiwgamFyZzQpID09IDApIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24sICJBcnJheSBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgMSBlbGVtZW50Iik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYXJnNCA9ICZ0ZW1wNDsKKyAgfQorICBhcmc1ID0gKGludClqYXJnNTsKKyAgYXJnNiA9IChpbnQpamFyZzY7CisgIGFyZzcgPSAoaW50KWphcmc3OworICBhcmc4ID0gKGZsb2F0KWphcmc4OworICByZXN1bHQgPSAodWludDhfdCAqKXdyYXBfV2ViUEVuY29kZUJHUkEoKHVpbnQ4X3QgY29uc3QgKilhcmcxLGFyZzIsYXJnMyxhcmc0LGFyZzUsYXJnNixhcmc3LGFyZzgpOworICBqcmVzdWx0ID0gU1dJR19KYXZhQXJyYXlPdXRVaW50OChqZW52LCByZXN1bHQsIEZpbGxNZUluQXNTaXplQ2Fubm90QmVEZXRlcm1pbmVkQXV0b21hdGljYWxseSk7CisgIFNXSUdfSmF2YUFycmF5QXJnb3V0VWludDgoamVudiwgamFycjEsIGFyZzEsIGphcmcxKTsKKyAgeworICAgIGppbnQganZhbHVlID0gKGppbnQpdGVtcDQ7CisgICAgKCpqZW52KS0+U2V0SW50QXJyYXlSZWdpb24oamVudiwgamFyZzQsIDAsIDEsICZqdmFsdWUpOworICB9CisgIGZyZWUoYXJnMSk7CisKKworCisgIGZyZWUocmVzdWx0KTsKKyAgcmV0dXJuIGpyZXN1bHQ7Cit9CisKKworU1dJR0VYUE9SVCBqYnl0ZUFycmF5IEpOSUNBTEwgSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV93cmFwXzFXZWJQRW5jb2RlTG9zc2xlc3NSR0IoSk5JRW52ICpqZW52LCBqY2xhc3MgamNscywgamJ5dGVBcnJheSBqYXJnMSwgamludCBqYXJnMiwgamludCBqYXJnMywgamludEFycmF5IGphcmc0LCBqaW50IGphcmc1LCBqaW50IGphcmc2LCBqaW50IGphcmc3KSB7CisgIGpieXRlQXJyYXkganJlc3VsdCA9IDAgOworICB1aW50OF90ICphcmcxID0gKHVpbnQ4X3QgKikgMCA7CisgIGludCAqYXJnMiA9IChpbnQgKikgMCA7CisgIGludCAqYXJnMyA9IChpbnQgKikgMCA7CisgIGludCAqYXJnNCA9IChpbnQgKikgMCA7CisgIGludCBhcmc1IDsKKyAgaW50IGFyZzYgOworICBpbnQgYXJnNyA7CisgIGpieXRlICpqYXJyMSA7CisgIGludCB0ZW1wNCA7CisgIHVpbnQ4X3QgKnJlc3VsdCA9IDAgOworCisgICh2b2lkKWplbnY7CisgICh2b2lkKWpjbHM7CisgIGlmICghU1dJR19KYXZhQXJyYXlJblVpbnQ4KGplbnYsICZqYXJyMSwgJmFyZzEsIGphcmcxKSkgcmV0dXJuIDA7CisgIGFyZzIgPSAoaW50ICopJmphcmcyOworICBhcmczID0gKGludCAqKSZqYXJnMzsKKyAgeworICAgIGlmICghamFyZzQpIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YU51bGxQb2ludGVyRXhjZXB0aW9uLCAiYXJyYXkgbnVsbCIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICgoKmplbnYpLT5HZXRBcnJheUxlbmd0aChqZW52LCBqYXJnNCkgPT0gMCkgeworICAgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiwgIkFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCAxIGVsZW1lbnQiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhcmc0ID0gJnRlbXA0OworICB9CisgIGFyZzUgPSAoaW50KWphcmc1OworICBhcmc2ID0gKGludClqYXJnNjsKKyAgYXJnNyA9IChpbnQpamFyZzc7CisgIHJlc3VsdCA9ICh1aW50OF90ICopd3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NSR0IoKHVpbnQ4X3QgY29uc3QgKilhcmcxLGFyZzIsYXJnMyxhcmc0LGFyZzUsYXJnNixhcmc3KTsKKyAganJlc3VsdCA9IFNXSUdfSmF2YUFycmF5T3V0VWludDgoamVudiwgcmVzdWx0LCBGaWxsTWVJbkFzU2l6ZUNhbm5vdEJlRGV0ZXJtaW5lZEF1dG9tYXRpY2FsbHkpOworICBTV0lHX0phdmFBcnJheUFyZ291dFVpbnQ4KGplbnYsIGphcnIxLCBhcmcxLCBqYXJnMSk7CisgIHsKKyAgICBqaW50IGp2YWx1ZSA9IChqaW50KXRlbXA0OworICAgICgqamVudiktPlNldEludEFycmF5UmVnaW9uKGplbnYsIGphcmc0LCAwLCAxLCAmanZhbHVlKTsKKyAgfQorICBmcmVlKGFyZzEpOworCisKKworICBmcmVlKHJlc3VsdCk7CisgIHJldHVybiBqcmVzdWx0OworfQorCisKK1NXSUdFWFBPUlQgamJ5dGVBcnJheSBKTklDQUxMIEphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfd3JhcF8xV2ViUEVuY29kZUxvc3NsZXNzQkdSKEpOSUVudiAqamVudiwgamNsYXNzIGpjbHMsIGpieXRlQXJyYXkgamFyZzEsIGppbnQgamFyZzIsIGppbnQgamFyZzMsIGppbnRBcnJheSBqYXJnNCwgamludCBqYXJnNSwgamludCBqYXJnNiwgamludCBqYXJnNykgeworICBqYnl0ZUFycmF5IGpyZXN1bHQgPSAwIDsKKyAgdWludDhfdCAqYXJnMSA9ICh1aW50OF90ICopIDAgOworICBpbnQgKmFyZzIgPSAoaW50ICopIDAgOworICBpbnQgKmFyZzMgPSAoaW50ICopIDAgOworICBpbnQgKmFyZzQgPSAoaW50ICopIDAgOworICBpbnQgYXJnNSA7CisgIGludCBhcmc2IDsKKyAgaW50IGFyZzcgOworICBqYnl0ZSAqamFycjEgOworICBpbnQgdGVtcDQgOworICB1aW50OF90ICpyZXN1bHQgPSAwIDsKKworICAodm9pZClqZW52OworICAodm9pZClqY2xzOworICBpZiAoIVNXSUdfSmF2YUFycmF5SW5VaW50OChqZW52LCAmamFycjEsICZhcmcxLCBqYXJnMSkpIHJldHVybiAwOworICBhcmcyID0gKGludCAqKSZqYXJnMjsKKyAgYXJnMyA9IChpbnQgKikmamFyZzM7CisgIHsKKyAgICBpZiAoIWphcmc0KSB7CisgICAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFOdWxsUG9pbnRlckV4Y2VwdGlvbiwgImFycmF5IG51bGwiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoKCpqZW52KS0+R2V0QXJyYXlMZW5ndGgoamVudiwgamFyZzQpID09IDApIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24sICJBcnJheSBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgMSBlbGVtZW50Iik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYXJnNCA9ICZ0ZW1wNDsKKyAgfQorICBhcmc1ID0gKGludClqYXJnNTsKKyAgYXJnNiA9IChpbnQpamFyZzY7CisgIGFyZzcgPSAoaW50KWphcmc3OworICByZXN1bHQgPSAodWludDhfdCAqKXdyYXBfV2ViUEVuY29kZUxvc3NsZXNzQkdSKCh1aW50OF90IGNvbnN0ICopYXJnMSxhcmcyLGFyZzMsYXJnNCxhcmc1LGFyZzYsYXJnNyk7CisgIGpyZXN1bHQgPSBTV0lHX0phdmFBcnJheU91dFVpbnQ4KGplbnYsIHJlc3VsdCwgRmlsbE1lSW5Bc1NpemVDYW5ub3RCZURldGVybWluZWRBdXRvbWF0aWNhbGx5KTsKKyAgU1dJR19KYXZhQXJyYXlBcmdvdXRVaW50OChqZW52LCBqYXJyMSwgYXJnMSwgamFyZzEpOworICB7CisgICAgamludCBqdmFsdWUgPSAoamludCl0ZW1wNDsKKyAgICAoKmplbnYpLT5TZXRJbnRBcnJheVJlZ2lvbihqZW52LCBqYXJnNCwgMCwgMSwgJmp2YWx1ZSk7CisgIH0KKyAgZnJlZShhcmcxKTsKKworCisKKyAgZnJlZShyZXN1bHQpOworICByZXR1cm4ganJlc3VsdDsKK30KKworCitTV0lHRVhQT1JUIGpieXRlQXJyYXkgSk5JQ0FMTCBKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX3dyYXBfMVdlYlBFbmNvZGVMb3NzbGVzc1JHQkEoSk5JRW52ICpqZW52LCBqY2xhc3MgamNscywgamJ5dGVBcnJheSBqYXJnMSwgamludCBqYXJnMiwgamludCBqYXJnMywgamludEFycmF5IGphcmc0LCBqaW50IGphcmc1LCBqaW50IGphcmc2LCBqaW50IGphcmc3KSB7CisgIGpieXRlQXJyYXkganJlc3VsdCA9IDAgOworICB1aW50OF90ICphcmcxID0gKHVpbnQ4X3QgKikgMCA7CisgIGludCAqYXJnMiA9IChpbnQgKikgMCA7CisgIGludCAqYXJnMyA9IChpbnQgKikgMCA7CisgIGludCAqYXJnNCA9IChpbnQgKikgMCA7CisgIGludCBhcmc1IDsKKyAgaW50IGFyZzYgOworICBpbnQgYXJnNyA7CisgIGpieXRlICpqYXJyMSA7CisgIGludCB0ZW1wNCA7CisgIHVpbnQ4X3QgKnJlc3VsdCA9IDAgOworCisgICh2b2lkKWplbnY7CisgICh2b2lkKWpjbHM7CisgIGlmICghU1dJR19KYXZhQXJyYXlJblVpbnQ4KGplbnYsICZqYXJyMSwgJmFyZzEsIGphcmcxKSkgcmV0dXJuIDA7CisgIGFyZzIgPSAoaW50ICopJmphcmcyOworICBhcmczID0gKGludCAqKSZqYXJnMzsKKyAgeworICAgIGlmICghamFyZzQpIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YU51bGxQb2ludGVyRXhjZXB0aW9uLCAiYXJyYXkgbnVsbCIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICgoKmplbnYpLT5HZXRBcnJheUxlbmd0aChqZW52LCBqYXJnNCkgPT0gMCkgeworICAgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiwgIkFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCAxIGVsZW1lbnQiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhcmc0ID0gJnRlbXA0OworICB9CisgIGFyZzUgPSAoaW50KWphcmc1OworICBhcmc2ID0gKGludClqYXJnNjsKKyAgYXJnNyA9IChpbnQpamFyZzc7CisgIHJlc3VsdCA9ICh1aW50OF90ICopd3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NSR0JBKCh1aW50OF90IGNvbnN0ICopYXJnMSxhcmcyLGFyZzMsYXJnNCxhcmc1LGFyZzYsYXJnNyk7CisgIGpyZXN1bHQgPSBTV0lHX0phdmFBcnJheU91dFVpbnQ4KGplbnYsIHJlc3VsdCwgRmlsbE1lSW5Bc1NpemVDYW5ub3RCZURldGVybWluZWRBdXRvbWF0aWNhbGx5KTsKKyAgU1dJR19KYXZhQXJyYXlBcmdvdXRVaW50OChqZW52LCBqYXJyMSwgYXJnMSwgamFyZzEpOworICB7CisgICAgamludCBqdmFsdWUgPSAoamludCl0ZW1wNDsKKyAgICAoKmplbnYpLT5TZXRJbnRBcnJheVJlZ2lvbihqZW52LCBqYXJnNCwgMCwgMSwgJmp2YWx1ZSk7CisgIH0KKyAgZnJlZShhcmcxKTsKKworCisKKyAgZnJlZShyZXN1bHQpOworICByZXR1cm4ganJlc3VsdDsKK30KKworCitTV0lHRVhQT1JUIGpieXRlQXJyYXkgSk5JQ0FMTCBKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX3dyYXBfMVdlYlBFbmNvZGVMb3NzbGVzc0JHUkEoSk5JRW52ICpqZW52LCBqY2xhc3MgamNscywgamJ5dGVBcnJheSBqYXJnMSwgamludCBqYXJnMiwgamludCBqYXJnMywgamludEFycmF5IGphcmc0LCBqaW50IGphcmc1LCBqaW50IGphcmc2LCBqaW50IGphcmc3KSB7CisgIGpieXRlQXJyYXkganJlc3VsdCA9IDAgOworICB1aW50OF90ICphcmcxID0gKHVpbnQ4X3QgKikgMCA7CisgIGludCAqYXJnMiA9IChpbnQgKikgMCA7CisgIGludCAqYXJnMyA9IChpbnQgKikgMCA7CisgIGludCAqYXJnNCA9IChpbnQgKikgMCA7CisgIGludCBhcmc1IDsKKyAgaW50IGFyZzYgOworICBpbnQgYXJnNyA7CisgIGpieXRlICpqYXJyMSA7CisgIGludCB0ZW1wNCA7CisgIHVpbnQ4X3QgKnJlc3VsdCA9IDAgOworCisgICh2b2lkKWplbnY7CisgICh2b2lkKWpjbHM7CisgIGlmICghU1dJR19KYXZhQXJyYXlJblVpbnQ4KGplbnYsICZqYXJyMSwgJmFyZzEsIGphcmcxKSkgcmV0dXJuIDA7CisgIGFyZzIgPSAoaW50ICopJmphcmcyOworICBhcmczID0gKGludCAqKSZqYXJnMzsKKyAgeworICAgIGlmICghamFyZzQpIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YU51bGxQb2ludGVyRXhjZXB0aW9uLCAiYXJyYXkgbnVsbCIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICgoKmplbnYpLT5HZXRBcnJheUxlbmd0aChqZW52LCBqYXJnNCkgPT0gMCkgeworICAgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiwgIkFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCAxIGVsZW1lbnQiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhcmc0ID0gJnRlbXA0OworICB9CisgIGFyZzUgPSAoaW50KWphcmc1OworICBhcmc2ID0gKGludClqYXJnNjsKKyAgYXJnNyA9IChpbnQpamFyZzc7CisgIHJlc3VsdCA9ICh1aW50OF90ICopd3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NCR1JBKCh1aW50OF90IGNvbnN0ICopYXJnMSxhcmcyLGFyZzMsYXJnNCxhcmc1LGFyZzYsYXJnNyk7CisgIGpyZXN1bHQgPSBTV0lHX0phdmFBcnJheU91dFVpbnQ4KGplbnYsIHJlc3VsdCwgRmlsbE1lSW5Bc1NpemVDYW5ub3RCZURldGVybWluZWRBdXRvbWF0aWNhbGx5KTsKKyAgU1dJR19KYXZhQXJyYXlBcmdvdXRVaW50OChqZW52LCBqYXJyMSwgYXJnMSwgamFyZzEpOworICB7CisgICAgamludCBqdmFsdWUgPSAoamludCl0ZW1wNDsKKyAgICAoKmplbnYpLT5TZXRJbnRBcnJheVJlZ2lvbihqZW52LCBqYXJnNCwgMCwgMSwgJmp2YWx1ZSk7CisgIH0KKyAgZnJlZShhcmcxKTsKKworCisKKyAgZnJlZShyZXN1bHQpOworICByZXR1cm4ganJlc3VsdDsKK30KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zd2lnL2xpYndlYnBfcHl0aG9uX3dyYXAuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3N3aWcvbGlid2VicF9weXRob25fd3JhcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyOWY4MzQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zd2lnL2xpYndlYnBfcHl0aG9uX3dyYXAuYwpAQCAtMCwwICsxLDUzOTggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRoaXMgZmlsZSB3YXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgU1dJRyAoaHR0cDovL3d3dy5zd2lnLm9yZykuCisgKiBWZXJzaW9uIDIuMC40CisgKgorICogVGhpcyBmaWxlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBlYXNpbHkgcmVhZGFibGUgYW5kIGNvbnRhaW5zIGEgbnVtYmVyIG9mCisgKiBjb2RpbmcgY29udmVudGlvbnMgZGVzaWduZWQgdG8gaW1wcm92ZSBwb3J0YWJpbGl0eSBhbmQgZWZmaWNpZW5jeS4gRG8gbm90IG1ha2UKKyAqIGNoYW5nZXMgdG8gdGhpcyBmaWxlIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmctLW1vZGlmeSB0aGUgU1dJRworICogaW50ZXJmYWNlIGZpbGUgaW5zdGVhZC4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgU1dJR1BZVEhPTgorI2RlZmluZSBTV0lHX1BZVEhPTl9ESVJFQ1RPUl9OT19WVEFCTEUKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBUaGlzIHNlY3Rpb24gY29udGFpbnMgZ2VuZXJpYyBTV0lHIGxhYmVscyBmb3IgbWV0aG9kL3ZhcmlhYmxlCisgKiAgZGVjbGFyYXRpb25zL2F0dHJpYnV0ZXMsIGFuZCBvdGhlciBjb21waWxlciBkZXBlbmRlbnQgbGFiZWxzLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogdGVtcGxhdGUgd29ya2Fyb3VuZCBmb3IgY29tcGlsZXJzIHRoYXQgY2Fubm90IGNvcnJlY3RseSBpbXBsZW1lbnQgdGhlIEMrKyBzdGFuZGFyZCAqLworI2lmbmRlZiBTV0lHVEVNUExBVEVESVNBTUJJR1VBVE9SCisjIGlmIGRlZmluZWQoX19TVU5QUk9fQ0MpICYmIChfX1NVTlBST19DQyA8PSAweDU2MCkKKyMgIGRlZmluZSBTV0lHVEVNUExBVEVESVNBTUJJR1VBVE9SIHRlbXBsYXRlCisjIGVsaWYgZGVmaW5lZChfX0hQX2FDQykKKy8qIE5lZWRlZCBldmVuIHdpdGggYGFDQyAtQUEnIHdoZW4gYGFDQyAtVicgcmVwb3J0cyBIUCBBTlNJIEMrKyBCMzkxMEIgQS4wMy41NSAqLworLyogSWYgd2UgZmluZCBhIG1heGltdW0gdmVyc2lvbiB0aGF0IHJlcXVpcmVzIHRoaXMsIHRoZSB0ZXN0IHdvdWxkIGJlIF9fSFBfYUNDIDw9IDM1NTAwIGZvciBBLjAzLjU1ICovCisjICBkZWZpbmUgU1dJR1RFTVBMQVRFRElTQU1CSUdVQVRPUiB0ZW1wbGF0ZQorIyBlbHNlCisjICBkZWZpbmUgU1dJR1RFTVBMQVRFRElTQU1CSUdVQVRPUgorIyBlbmRpZgorI2VuZGlmCisKKy8qIGlubGluZSBhdHRyaWJ1dGUgKi8KKyNpZm5kZWYgU1dJR0lOTElORQorIyBpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCAoZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKSkKKyMgICBkZWZpbmUgU1dJR0lOTElORSBpbmxpbmUKKyMgZWxzZQorIyAgIGRlZmluZSBTV0lHSU5MSU5FCisjIGVuZGlmCisjZW5kaWYKKworLyogYXR0cmlidXRlIHJlY29nbmlzZWQgYnkgc29tZSBjb21waWxlcnMgdG8gYXZvaWQgJ3VudXNlZCcgd2FybmluZ3MgKi8KKyNpZm5kZWYgU1dJR1VOVVNFRAorIyBpZiBkZWZpbmVkKF9fR05VQ19fKQorIyAgIGlmICEoZGVmaW5lZChfX2NwbHVzcGx1cykpIHx8IChfX0dOVUNfXyA+IDMgfHwgKF9fR05VQ19fID09IDMgJiYgX19HTlVDX01JTk9SX18gPj0gNCkpCisjICAgICBkZWZpbmUgU1dJR1VOVVNFRCBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpCisjICAgZWxzZQorIyAgICAgZGVmaW5lIFNXSUdVTlVTRUQKKyMgICBlbmRpZgorIyBlbGlmIGRlZmluZWQoX19JQ0MpCisjICAgZGVmaW5lIFNXSUdVTlVTRUQgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKQorIyBlbHNlCisjICAgZGVmaW5lIFNXSUdVTlVTRUQKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFNXSUdfTVNDX1VOU1VQUFJFU1NfNDUwNQorIyBpZiBkZWZpbmVkKF9NU0NfVkVSKQorIyAgIHByYWdtYSB3YXJuaW5nKGRpc2FibGUgOiA0NTA1KSAvKiB1bnJlZmVyZW5jZWQgbG9jYWwgZnVuY3Rpb24gaGFzIGJlZW4gcmVtb3ZlZCAqLworIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgU1dJR1VOVVNFRFBBUk0KKyMgaWZkZWYgX19jcGx1c3BsdXMKKyMgICBkZWZpbmUgU1dJR1VOVVNFRFBBUk0ocCkKKyMgZWxzZQorIyAgIGRlZmluZSBTV0lHVU5VU0VEUEFSTShwKSBwIFNXSUdVTlVTRUQKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBpbnRlcm5hbCBTV0lHIG1ldGhvZCAqLworI2lmbmRlZiBTV0lHSU5URVJOCisjIGRlZmluZSBTV0lHSU5URVJOIHN0YXRpYyBTV0lHVU5VU0VECisjZW5kaWYKKworLyogaW50ZXJuYWwgaW5saW5lIFNXSUcgbWV0aG9kICovCisjaWZuZGVmIFNXSUdJTlRFUk5JTkxJTkUKKyMgZGVmaW5lIFNXSUdJTlRFUk5JTkxJTkUgU1dJR0lOVEVSTiBTV0lHSU5MSU5FCisjZW5kaWYKKworLyogZXhwb3J0aW5nIG1ldGhvZHMgKi8KKyNpZiAoX19HTlVDX18gPj0gNCkgfHwgKF9fR05VQ19fID09IDMgJiYgX19HTlVDX01JTk9SX18gPj0gNCkKKyMgIGlmbmRlZiBHQ0NfSEFTQ0xBU1NWSVNJQklMSVRZCisjICAgIGRlZmluZSBHQ0NfSEFTQ0xBU1NWSVNJQklMSVRZCisjICBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgU1dJR0VYUE9SVAorIyBpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfX1dJTjMyX18pIHx8IGRlZmluZWQoX19DWUdXSU5fXykKKyMgICBpZiBkZWZpbmVkKFNUQVRJQ19MSU5LRUQpCisjICAgICBkZWZpbmUgU1dJR0VYUE9SVAorIyAgIGVsc2UKKyMgICAgIGRlZmluZSBTV0lHRVhQT1JUIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorIyAgIGVuZGlmCisjIGVsc2UKKyMgICBpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKEdDQ19IQVNDTEFTU1ZJU0lCSUxJVFkpCisjICAgICBkZWZpbmUgU1dJR0VYUE9SVCBfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkKKyMgICBlbHNlCisjICAgICBkZWZpbmUgU1dJR0VYUE9SVAorIyAgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworLyogY2FsbGluZyBjb252ZW50aW9ucyBmb3IgV2luZG93cyAqLworI2lmbmRlZiBTV0lHU1REQ0FMTAorIyBpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfX1dJTjMyX18pIHx8IGRlZmluZWQoX19DWUdXSU5fXykKKyMgICBkZWZpbmUgU1dJR1NURENBTEwgX19zdGRjYWxsCisjIGVsc2UKKyMgICBkZWZpbmUgU1dJR1NURENBTEwKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBEZWFsIHdpdGggTWljcm9zb2Z0J3MgYXR0ZW1wdCBhdCBkZXByZWNhdGluZyBDIHN0YW5kYXJkIHJ1bnRpbWUgZnVuY3Rpb25zICovCisjaWYgIWRlZmluZWQoU1dJR19OT19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSkgJiYgZGVmaW5lZChfTVNDX1ZFUikgJiYgIWRlZmluZWQoX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFKQorIyBkZWZpbmUgX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFCisjZW5kaWYKKworLyogRGVhbCB3aXRoIE1pY3Jvc29mdCdzIGF0dGVtcHQgYXQgZGVwcmVjYXRpbmcgbWV0aG9kcyBpbiB0aGUgc3RhbmRhcmQgQysrIGxpYnJhcnkgKi8KKyNpZiAhZGVmaW5lZChTV0lHX05PX1NDTF9TRUNVUkVfTk9fREVQUkVDQVRFKSAmJiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAhZGVmaW5lZChfU0NMX1NFQ1VSRV9OT19ERVBSRUNBVEUpCisjIGRlZmluZSBfU0NMX1NFQ1VSRV9OT19ERVBSRUNBVEUKKyNlbmRpZgorCisKKworLyogUHl0aG9uLmggaGFzIHRvIGFwcGVhciBmaXJzdCAqLworI2luY2x1ZGUgPFB5dGhvbi5oPgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogc3dpZ3J1bi5zd2cKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgZ2VuZXJpYyBDIEFQSSBTV0lHIHJ1bnRpbWUgc3VwcG9ydCBmb3IgcG9pbnRlcgorICogdHlwZSBjaGVja2luZy4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW5jcmVtZW50ZWQgd2hlbiBlaXRoZXIgdGhlIGxheW91dCBvZiBzd2lnX3R5cGVfaW5mbyBjaGFuZ2VzLAorICAgb3IgZm9yIHdoYXRldmVyIHJlYXNvbiwgdGhlIHJ1bnRpbWUgY2hhbmdlcyBpbmNvbXBhdGlibHkgKi8KKyNkZWZpbmUgU1dJR19SVU5USU1FX1ZFUlNJT04gIjQiCisKKy8qIGRlZmluZSBTV0lHX1RZUEVfVEFCTEVfTkFNRSBhcyAiU1dJR19UWVBFX1RBQkxFIiAqLworI2lmZGVmIFNXSUdfVFlQRV9UQUJMRQorIyBkZWZpbmUgU1dJR19RVU9URV9TVFJJTkcoeCkgI3gKKyMgZGVmaW5lIFNXSUdfRVhQQU5EX0FORF9RVU9URV9TVFJJTkcoeCkgU1dJR19RVU9URV9TVFJJTkcoeCkKKyMgZGVmaW5lIFNXSUdfVFlQRV9UQUJMRV9OQU1FIFNXSUdfRVhQQU5EX0FORF9RVU9URV9TVFJJTkcoU1dJR19UWVBFX1RBQkxFKQorI2Vsc2UKKyMgZGVmaW5lIFNXSUdfVFlQRV9UQUJMRV9OQU1FCisjZW5kaWYKKworLyoKKyAgWW91IGNhbiB1c2UgdGhlIFNXSUdSVU5USU1FIGFuZCBTV0lHUlVOVElNRUlOTElORSBtYWNyb3MgZm9yCisgIGNyZWF0aW5nIGEgc3RhdGljIG9yIGR5bmFtaWMgbGlicmFyeSBmcm9tIHRoZSBTV0lHIHJ1bnRpbWUgY29kZS4KKyAgSW4gOTkuOSUgb2YgdGhlIGNhc2VzLCBTV0lHIGp1c3QgbmVlZHMgdG8gZGVjbGFyZSB0aGVtIGFzICdzdGF0aWMnLgorCisgIEJ1dCBvbmx5IGRvIHRoaXMgaWYgc3RyaWN0bHkgbmVjZXNzYXJ5LCBpZSwgaWYgeW91IGhhdmUgcHJvYmxlbXMKKyAgd2l0aCB5b3VyIGNvbXBpbGVyIG9yIHN1Y2hsaWtlLgorKi8KKworI2lmbmRlZiBTV0lHUlVOVElNRQorIyBkZWZpbmUgU1dJR1JVTlRJTUUgU1dJR0lOVEVSTgorI2VuZGlmCisKKyNpZm5kZWYgU1dJR1JVTlRJTUVJTkxJTkUKKyMgZGVmaW5lIFNXSUdSVU5USU1FSU5MSU5FIFNXSUdSVU5USU1FIFNXSUdJTkxJTkUKKyNlbmRpZgorCisvKiAgR2VuZXJpYyBidWZmZXIgc2l6ZSAqLworI2lmbmRlZiBTV0lHX0JVRkZFUl9TSVpFCisjIGRlZmluZSBTV0lHX0JVRkZFUl9TSVpFIDEwMjQKKyNlbmRpZgorCisvKiBGbGFncyBmb3IgcG9pbnRlciBjb252ZXJzaW9ucyAqLworI2RlZmluZSBTV0lHX1BPSU5URVJfRElTT1dOICAgICAgICAweDEKKyNkZWZpbmUgU1dJR19DQVNUX05FV19NRU1PUlkgICAgICAgMHgyCisKKy8qIEZsYWdzIGZvciBuZXcgcG9pbnRlciBvYmplY3RzICovCisjZGVmaW5lIFNXSUdfUE9JTlRFUl9PV04gICAgICAgICAgIDB4MQorCisKKy8qCisgICBGbGFncy9tZXRob2RzIGZvciByZXR1cm5pbmcgc3RhdGVzLgorCisgICBUaGUgU1dJRyBjb252ZXJzaW9uIG1ldGhvZHMsIGFzIENvbnZlcnRQdHIsIHJldHVybiBhbiBpbnRlZ2VyCisgICB0aGF0IHRlbGxzIGlmIHRoZSBjb252ZXJzaW9uIHdhcyBzdWNjZXNzZnVsIG9yIG5vdC4gQW5kIGlmIG5vdCwKKyAgIGFuIGVycm9yIGNvZGUgY2FuIGJlIHJldHVybmVkIChzZWUgc3dpZ2Vycm9ycy5zd2cgZm9yIHRoZSBjb2RlcykuCisKKyAgIFVzZSB0aGUgZm9sbG93aW5nIG1hY3Jvcy9mbGFncyB0byBzZXQgb3IgcHJvY2VzcyB0aGUgcmV0dXJuaW5nCisgICBzdGF0ZXMuCisKKyAgIEluIG9sZCB2ZXJzaW9ucyBvZiBTV0lHLCBjb2RlIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyB3YXMgdXN1YWxseSB3cml0dGVuOgorCisgICAgIGlmIChTV0lHX0NvbnZlcnRQdHIob2JqLHZwdHIsdHkuZmxhZ3MpICE9IC0xKSB7CisgICAgICAgLy8gc3VjY2VzcyBjb2RlCisgICAgIH0gZWxzZSB7CisgICAgICAgLy9mYWlsIGNvZGUKKyAgICAgfQorCisgICBOb3cgeW91IGNhbiBiZSBtb3JlIGV4cGxpY2l0OgorCisgICAgaW50IHJlcyA9IFNXSUdfQ29udmVydFB0cihvYmosdnB0cix0eS5mbGFncyk7CisgICAgaWYgKFNXSUdfSXNPSyhyZXMpKSB7CisgICAgICAvLyBzdWNjZXNzIGNvZGUKKyAgICB9IGVsc2UgeworICAgICAgLy8gZmFpbCBjb2RlCisgICAgfQorCisgICB3aGljaCBpcyB0aGUgc2FtZSByZWFsbHksIGJ1dCBub3cgeW91IGNhbiBhbHNvIGRvCisKKyAgICBUeXBlICpwdHI7CisgICAgaW50IHJlcyA9IFNXSUdfQ29udmVydFB0cihvYmosKHZvaWQgKiopKCZwdHIpLHR5LmZsYWdzKTsKKyAgICBpZiAoU1dJR19Jc09LKHJlcykpIHsKKyAgICAgIC8vIHN1Y2Nlc3MgY29kZQorICAgICAgaWYgKFNXSUdfSXNOZXdPYmoocmVzKSB7CisgICAgICAgIC4uLgorICAgICAgICBkZWxldGUgKnB0cjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC4uLgorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvLyBmYWlsIGNvZGUKKyAgICB9CisKKyAgIEkuZS4sIG5vdyBTV0lHX0NvbnZlcnRQdHIgY2FuIHJldHVybiBuZXcgb2JqZWN0cyBhbmQgeW91IGNhbgorICAgaWRlbnRpZnkgdGhlIGNhc2UgYW5kIHRha2UgY2FyZSBvZiB0aGUgZGVhbGxvY2F0aW9uLiBPZiBjb3Vyc2UgdGhhdAorICAgYWxzbyByZXF1aXJlcyBTV0lHX0NvbnZlcnRQdHIgdG8gcmV0dXJuIG5ldyByZXN1bHQgdmFsdWVzLCBzdWNoIGFzCisKKyAgICAgIGludCBTV0lHX0NvbnZlcnRQdHIob2JqLCBwdHIsLi4uKSB7CisgICAgICAgIGlmICg8b2JqIGlzIG9rPikgeworICAgICAgICAgIGlmICg8bmVlZCBuZXcgb2JqZWN0PikgeworICAgICAgICAgICAgKnB0ciA9IDxwdHIgdG8gbmV3IGFsbG9jYXRlZCBvYmplY3Q+OworICAgICAgICAgICAgcmV0dXJuIFNXSUdfTkVXT0JKOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqcHRyID0gPHB0ciB0byBvbGQgb2JqZWN0PjsKKyAgICAgICAgICAgIHJldHVybiBTV0lHX09MRE9CSjsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0dXJuIFNXSUdfQkFET0JKOworICAgICAgICB9CisgICAgICB9CisKKyAgIE9mIGNvdXJzZSwgcmV0dXJuaW5nIHRoZSBwbGFpbiAnMChzdWNjZXNzKS8tMShmYWlsKScgc3RpbGwgd29ya3MsIGJ1dCB5b3UgY2FuIGJlCisgICBtb3JlIGV4cGxpY2l0IGJ5IHJldHVybmluZyBTV0lHX0JBRE9CSiwgU1dJR19FUlJPUiBvciBhbnkgb2YgdGhlCisgICBTV0lHIGVycm9ycyBjb2RlLgorCisgICBGaW5hbGx5LCBpZiB0aGUgU1dJR19DQVNUUkFOS19NT0RFIGlzIGVuYWJsZWQsIHRoZSByZXN1bHQgY29kZQorICAgYWxsb3dzIHRvIHJldHVybiB0aGUgJ2Nhc3QgcmFuaycsIGZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSB0aGlzCisKKyAgICAgICBpbnQgZm9vZChkb3VibGUpCisgICAgICAgaW50IGZvb2koaW50KTsKKworICAgYW5kIHlvdSBjYWxsCisKKyAgICAgIGZvb2QoMSkgICAvLyBjYXN0IHJhbmsgJzEnICAoMSAtPiAxLjApCisgICAgICBmb29pKDEpICAgLy8gY2FzdCByYW5rICcwJworCisgICBqdXN0IHVzZSB0aGUgU1dJR19BZGRDYXN0KCkvU1dJR19DaGVja1N0YXRlKCkKKyovCisKKyNkZWZpbmUgU1dJR19PSyAgICAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIFNXSUdfRVJST1IgICAgICAgICAgICAgICAgICgtMSkKKyNkZWZpbmUgU1dJR19Jc09LKHIpICAgICAgICAgICAgICAgKHIgPj0gMCkKKyNkZWZpbmUgU1dJR19BcmdFcnJvcihyKSAgICAgICAgICAgKChyICE9IFNXSUdfRVJST1IpID8gciA6IFNXSUdfVHlwZUVycm9yKQorCisvKiBUaGUgQ2FzdFJhbmtMaW1pdCBzYXlzIGhvdyBtYW55IGJpdHMgYXJlIHVzZWQgZm9yIHRoZSBjYXN0IHJhbmsgKi8KKyNkZWZpbmUgU1dJR19DQVNUUkFOS0xJTUlUICAgICAgICAgKDEgPDwgOCkKKy8qIFRoZSBOZXdNYXNrIGRlbm90ZXMgdGhlIG9iamVjdCB3YXMgY3JlYXRlZCAodXNpbmcgbmV3L21hbGxvYykgKi8KKyNkZWZpbmUgU1dJR19ORVdPQkpNQVNLICAgICAgICAgICAgKFNXSUdfQ0FTVFJBTktMSU1JVCAgPDwgMSkKKy8qIFRoZSBUbXBNYXNrIGlzIGZvciBpbi9vdXQgdHlwZW1hcHMgdGhhdCB1c2UgdGVtcG9yYWwgb2JqZWN0cyAqLworI2RlZmluZSBTV0lHX1RNUE9CSk1BU0sgICAgICAgICAgICAoU1dJR19ORVdPQkpNQVNLIDw8IDEpCisvKiBTaW1wbGUgcmV0dXJuaW5nIHZhbHVlcyAqLworI2RlZmluZSBTV0lHX0JBRE9CSiAgICAgICAgICAgICAgICAoU1dJR19FUlJPUikKKyNkZWZpbmUgU1dJR19PTERPQkogICAgICAgICAgICAgICAgKFNXSUdfT0spCisjZGVmaW5lIFNXSUdfTkVXT0JKICAgICAgICAgICAgICAgIChTV0lHX09LIHwgU1dJR19ORVdPQkpNQVNLKQorI2RlZmluZSBTV0lHX1RNUE9CSiAgICAgICAgICAgICAgICAoU1dJR19PSyB8IFNXSUdfVE1QT0JKTUFTSykKKy8qIENoZWNrLCBhZGQgYW5kIGRlbCBtYXNrIG1ldGhvZHMgKi8KKyNkZWZpbmUgU1dJR19BZGROZXdNYXNrKHIpICAgICAgICAgKFNXSUdfSXNPSyhyKSA/IChyIHwgU1dJR19ORVdPQkpNQVNLKSA6IHIpCisjZGVmaW5lIFNXSUdfRGVsTmV3TWFzayhyKSAgICAgICAgIChTV0lHX0lzT0socikgPyAociAmIH5TV0lHX05FV09CSk1BU0spIDogcikKKyNkZWZpbmUgU1dJR19Jc05ld09iaihyKSAgICAgICAgICAgKFNXSUdfSXNPSyhyKSAmJiAociAmIFNXSUdfTkVXT0JKTUFTSykpCisjZGVmaW5lIFNXSUdfQWRkVG1wTWFzayhyKSAgICAgICAgIChTV0lHX0lzT0socikgPyAociB8IFNXSUdfVE1QT0JKTUFTSykgOiByKQorI2RlZmluZSBTV0lHX0RlbFRtcE1hc2socikgICAgICAgICAoU1dJR19Jc09LKHIpID8gKHIgJiB+U1dJR19UTVBPQkpNQVNLKSA6IHIpCisjZGVmaW5lIFNXSUdfSXNUbXBPYmoocikgICAgICAgICAgIChTV0lHX0lzT0socikgJiYgKHIgJiBTV0lHX1RNUE9CSk1BU0spKQorCisvKiBDYXN0LVJhbmsgTW9kZSAqLworI2lmIGRlZmluZWQoU1dJR19DQVNUUkFOS19NT0RFKQorIyAgaWZuZGVmIFNXSUdfVHlwZVJhbmsKKyMgICAgZGVmaW5lIFNXSUdfVHlwZVJhbmsgICAgICAgICAgICAgdW5zaWduZWQgbG9uZworIyAgZW5kaWYKKyMgIGlmbmRlZiBTV0lHX01BWENBU1RSQU5LICAgICAgICAgICAgLyogRGVmYXVsdCBjYXN0IGFsbG93ZWQgKi8KKyMgICAgZGVmaW5lIFNXSUdfTUFYQ0FTVFJBTksgICAgICAgICAgKDIpCisjICBlbmRpZgorIyAgZGVmaW5lIFNXSUdfQ0FTVFJBTktNQVNLICAgICAgICAgICgoU1dJR19DQVNUUkFOS0xJTUlUKSAtMSkKKyMgIGRlZmluZSBTV0lHX0Nhc3RSYW5rKHIpICAgICAgICAgICAociAmIFNXSUdfQ0FTVFJBTktNQVNLKQorU1dJR0lOVEVSTklOTElORSBpbnQgU1dJR19BZGRDYXN0KGludCByKSB7CisgIHJldHVybiBTV0lHX0lzT0socikgPyAoKFNXSUdfQ2FzdFJhbmsocikgPCBTV0lHX01BWENBU1RSQU5LKSA/IChyICsgMSkgOiBTV0lHX0VSUk9SKSA6IHI7Cit9CitTV0lHSU5URVJOSU5MSU5FIGludCBTV0lHX0NoZWNrU3RhdGUoaW50IHIpIHsKKyAgcmV0dXJuIFNXSUdfSXNPSyhyKSA/IFNXSUdfQ2FzdFJhbmsocikgKyAxIDogMDsKK30KKyNlbHNlIC8qIG5vIGNhc3QtcmFuayBtb2RlICovCisjICBkZWZpbmUgU1dJR19BZGRDYXN0CisjICBkZWZpbmUgU1dJR19DaGVja1N0YXRlKHIpIChTV0lHX0lzT0socikgPyAxIDogMCkKKyNlbmRpZgorCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit0eXBlZGVmIHZvaWQgKigqc3dpZ19jb252ZXJ0ZXJfZnVuYykodm9pZCAqLCBpbnQgKik7Cit0eXBlZGVmIHN0cnVjdCBzd2lnX3R5cGVfaW5mbyAqKCpzd2lnX2R5Y2FzdF9mdW5jKSh2b2lkICoqKTsKKworLyogU3RydWN0dXJlIHRvIHN0b3JlIGluZm9ybWF0aW9uIG9uIG9uZSB0eXBlICovCit0eXBlZGVmIHN0cnVjdCBzd2lnX3R5cGVfaW5mbyB7CisgIGNvbnN0IGNoYXIgICAgICAgICAgICAgKm5hbWU7ICAgICAgICAgICAgICAgICAvKiBtYW5nbGVkIG5hbWUgb2YgdGhpcyB0eXBlICovCisgIGNvbnN0IGNoYXIgICAgICAgICAgICAgKnN0cjsgICAgICAgICAgICAgICAgICAvKiBodW1hbiByZWFkYWJsZSBuYW1lIG9mIHRoaXMgdHlwZSAqLworICBzd2lnX2R5Y2FzdF9mdW5jICAgICAgICBkY2FzdDsgICAgICAgICAgICAgICAgLyogZHluYW1pYyBjYXN0IGZ1bmN0aW9uIGRvd24gYSBoaWVyYXJjaHkgKi8KKyAgc3RydWN0IHN3aWdfY2FzdF9pbmZvICAqY2FzdDsgICAgICAgICAgICAgICAgIC8qIGxpbmtlZCBsaXN0IG9mIHR5cGVzIHRoYXQgY2FuIGNhc3QgaW50byB0aGlzIHR5cGUgKi8KKyAgdm9pZCAgICAgICAgICAgICAgICAgICAqY2xpZW50ZGF0YTsgICAgICAgICAgIC8qIGxhbmd1YWdlIHNwZWNpZmljIHR5cGUgZGF0YSAqLworICBpbnQgICAgICAgICAgICAgICAgICAgIG93bmRhdGE7ICAgICAgICAgICAgICAgLyogZmxhZyBpZiB0aGUgc3RydWN0dXJlIG93bnMgdGhlIGNsaWVudGRhdGEgKi8KK30gc3dpZ190eXBlX2luZm87CisKKy8qIFN0cnVjdHVyZSB0byBzdG9yZSBhIHR5cGUgYW5kIGNvbnZlcnNpb24gZnVuY3Rpb24gdXNlZCBmb3IgY2FzdGluZyAqLwordHlwZWRlZiBzdHJ1Y3Qgc3dpZ19jYXN0X2luZm8geworICBzd2lnX3R5cGVfaW5mbyAgICAgICAgICp0eXBlOyAgICAgICAgICAgICAgICAgLyogcG9pbnRlciB0byB0eXBlIHRoYXQgaXMgZXF1aXZhbGVudCB0byB0aGlzIHR5cGUgKi8KKyAgc3dpZ19jb252ZXJ0ZXJfZnVuYyAgICAgY29udmVydGVyOyAgICAgICAgICAgIC8qIGZ1bmN0aW9uIHRvIGNhc3QgdGhlIHZvaWQgcG9pbnRlcnMgKi8KKyAgc3RydWN0IHN3aWdfY2FzdF9pbmZvICAqbmV4dDsgICAgICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gbmV4dCBjYXN0IGluIGxpbmtlZCBsaXN0ICovCisgIHN0cnVjdCBzd2lnX2Nhc3RfaW5mbyAgKnByZXY7ICAgICAgICAgICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBwcmV2aW91cyBjYXN0ICovCit9IHN3aWdfY2FzdF9pbmZvOworCisvKiBTdHJ1Y3R1cmUgdXNlZCB0byBzdG9yZSBtb2R1bGUgaW5mb3JtYXRpb24KKyAqIEVhY2ggbW9kdWxlIGdlbmVyYXRlcyBvbmUgc3RydWN0dXJlIGxpa2UgdGhpcywgYW5kIHRoZSBydW50aW1lIGNvbGxlY3RzCisgKiBhbGwgb2YgdGhlc2Ugc3RydWN0dXJlcyBhbmQgc3RvcmVzIHRoZW0gaW4gYSBjaXJjdWxhcmx5IGxpbmtlZCBsaXN0LiovCit0eXBlZGVmIHN0cnVjdCBzd2lnX21vZHVsZV9pbmZvIHsKKyAgc3dpZ190eXBlX2luZm8gICAgICAgICAqKnR5cGVzOyAgICAgICAgICAgICAgIC8qIEFycmF5IG9mIHBvaW50ZXJzIHRvIHN3aWdfdHlwZV9pbmZvIHN0cnVjdHVyZXMgdGhhdCBhcmUgaW4gdGhpcyBtb2R1bGUgKi8KKyAgc2l6ZV90ICAgICAgICAgICAgICAgICBzaXplOyAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiB0eXBlcyBpbiB0aGlzIG1vZHVsZSAqLworICBzdHJ1Y3Qgc3dpZ19tb2R1bGVfaW5mbyAqbmV4dDsgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byBuZXh0IGVsZW1lbnQgaW4gY2lyY3VsYXJseSBsaW5rZWQgbGlzdCAqLworICBzd2lnX3R5cGVfaW5mbyAgICAgICAgICoqdHlwZV9pbml0aWFsOyAgICAgICAgLyogQXJyYXkgb2YgaW5pdGlhbGx5IGdlbmVyYXRlZCB0eXBlIHN0cnVjdHVyZXMgKi8KKyAgc3dpZ19jYXN0X2luZm8gICAgICAgICAqKmNhc3RfaW5pdGlhbDsgICAgICAgIC8qIEFycmF5IG9mIGluaXRpYWxseSBnZW5lcmF0ZWQgY2FzdGluZyBzdHJ1Y3R1cmVzICovCisgIHZvaWQgICAgICAgICAgICAgICAgICAgICpjbGllbnRkYXRhOyAgICAgICAgICAvKiBMYW5ndWFnZSBzcGVjaWZpYyBtb2R1bGUgZGF0YSAqLworfSBzd2lnX21vZHVsZV9pbmZvOworCisvKgorICBDb21wYXJlIHR3byB0eXBlIG5hbWVzIHNraXBwaW5nIHRoZSBzcGFjZSBjaGFyYWN0ZXJzLCB0aGVyZWZvcmUKKyAgImNoYXIqIiA9PSAiY2hhciAqIiBhbmQgIkNsYXNzPGludD4iID09ICJDbGFzczxpbnQgPiIsIGV0Yy4KKworICBSZXR1cm4gMCB3aGVuIHRoZSB0d28gbmFtZSB0eXBlcyBhcmUgZXF1aXZhbGVudCwgYXMgaW4KKyAgc3RybmNtcCwgYnV0IHNraXBwaW5nICcgJy4KKyovCitTV0lHUlVOVElNRSBpbnQKK1NXSUdfVHlwZU5hbWVDb21wKGNvbnN0IGNoYXIgKmYxLCBjb25zdCBjaGFyICpsMSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmYyLCBjb25zdCBjaGFyICpsMikgeworICBmb3IgKDsoZjEgIT0gbDEpICYmIChmMiAhPSBsMik7ICsrZjEsICsrZjIpIHsKKyAgICB3aGlsZSAoKCpmMSA9PSAnICcpICYmIChmMSAhPSBsMSkpICsrZjE7CisgICAgd2hpbGUgKCgqZjIgPT0gJyAnKSAmJiAoZjIgIT0gbDIpKSArK2YyOworICAgIGlmICgqZjEgIT0gKmYyKSByZXR1cm4gKCpmMSA+ICpmMikgPyAxIDogLTE7CisgIH0KKyAgcmV0dXJuIChpbnQpKChsMSAtIGYxKSAtIChsMiAtIGYyKSk7Cit9CisKKy8qCisgIENoZWNrIHR5cGUgZXF1aXZhbGVuY2UgaW4gYSBuYW1lIGxpc3QgbGlrZSA8bmFtZTE+fDxuYW1lMj58Li4uCisgIFJldHVybiAwIGlmIG5vdCBlcXVhbCwgMSBpZiBlcXVhbAorKi8KK1NXSUdSVU5USU1FIGludAorU1dJR19UeXBlRXF1aXYoY29uc3QgY2hhciAqbmIsIGNvbnN0IGNoYXIgKnRiKSB7CisgIGludCBlcXVpdiA9IDA7CisgIGNvbnN0IGNoYXIqIHRlID0gdGIgKyBzdHJsZW4odGIpOworICBjb25zdCBjaGFyKiBuZSA9IG5iOworICB3aGlsZSAoIWVxdWl2ICYmICpuZSkgeworICAgIGZvciAobmIgPSBuZTsgKm5lOyArK25lKSB7CisgICAgICBpZiAoKm5lID09ICd8JykgYnJlYWs7CisgICAgfQorICAgIGVxdWl2ID0gKFNXSUdfVHlwZU5hbWVDb21wKG5iLCBuZSwgdGIsIHRlKSA9PSAwKSA/IDEgOiAwOworICAgIGlmICgqbmUpICsrbmU7CisgIH0KKyAgcmV0dXJuIGVxdWl2OworfQorCisvKgorICBDaGVjayB0eXBlIGVxdWl2YWxlbmNlIGluIGEgbmFtZSBsaXN0IGxpa2UgPG5hbWUxPnw8bmFtZTI+fC4uLgorICBSZXR1cm4gMCBpZiBlcXVhbCwgLTEgaWYgbmIgPCB0YiwgMSBpZiBuYiA+IHRiCisqLworU1dJR1JVTlRJTUUgaW50CitTV0lHX1R5cGVDb21wYXJlKGNvbnN0IGNoYXIgKm5iLCBjb25zdCBjaGFyICp0YikgeworICBpbnQgZXF1aXYgPSAwOworICBjb25zdCBjaGFyKiB0ZSA9IHRiICsgc3RybGVuKHRiKTsKKyAgY29uc3QgY2hhciogbmUgPSBuYjsKKyAgd2hpbGUgKCFlcXVpdiAmJiAqbmUpIHsKKyAgICBmb3IgKG5iID0gbmU7ICpuZTsgKytuZSkgeworICAgICAgaWYgKCpuZSA9PSAnfCcpIGJyZWFrOworICAgIH0KKyAgICBlcXVpdiA9IChTV0lHX1R5cGVOYW1lQ29tcChuYiwgbmUsIHRiLCB0ZSkgPT0gMCkgPyAxIDogMDsKKyAgICBpZiAoKm5lKSArK25lOworICB9CisgIHJldHVybiBlcXVpdjsKK30KKworCisvKgorICBDaGVjayB0aGUgdHlwZW5hbWUKKyovCitTV0lHUlVOVElNRSBzd2lnX2Nhc3RfaW5mbyAqCitTV0lHX1R5cGVDaGVjayhjb25zdCBjaGFyICpjLCBzd2lnX3R5cGVfaW5mbyAqdHkpIHsKKyAgaWYgKHR5KSB7CisgICAgc3dpZ19jYXN0X2luZm8gKml0ZXIgPSB0eS0+Y2FzdDsKKyAgICB3aGlsZSAoaXRlcikgeworICAgICAgaWYgKHN0cmNtcChpdGVyLT50eXBlLT5uYW1lLCBjKSA9PSAwKSB7CisgICAgICAgIGlmIChpdGVyID09IHR5LT5jYXN0KQorICAgICAgICAgIHJldHVybiBpdGVyOworICAgICAgICAvKiBNb3ZlIGl0ZXIgdG8gdGhlIHRvcCBvZiB0aGUgbGlua2VkIGxpc3QgKi8KKyAgICAgICAgaXRlci0+cHJldi0+bmV4dCA9IGl0ZXItPm5leHQ7CisgICAgICAgIGlmIChpdGVyLT5uZXh0KQorICAgICAgICAgIGl0ZXItPm5leHQtPnByZXYgPSBpdGVyLT5wcmV2OworICAgICAgICBpdGVyLT5uZXh0ID0gdHktPmNhc3Q7CisgICAgICAgIGl0ZXItPnByZXYgPSAwOworICAgICAgICBpZiAodHktPmNhc3QpIHR5LT5jYXN0LT5wcmV2ID0gaXRlcjsKKyAgICAgICAgdHktPmNhc3QgPSBpdGVyOworICAgICAgICByZXR1cm4gaXRlcjsKKyAgICAgIH0KKyAgICAgIGl0ZXIgPSBpdGVyLT5uZXh0OworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworLyoKKyAgSWRlbnRpY2FsIHRvIFNXSUdfVHlwZUNoZWNrLCBleGNlcHQgc3RyY21wIGlzIHJlcGxhY2VkIHdpdGggYSBwb2ludGVyIGNvbXBhcmlzb24KKyovCitTV0lHUlVOVElNRSBzd2lnX2Nhc3RfaW5mbyAqCitTV0lHX1R5cGVDaGVja1N0cnVjdChzd2lnX3R5cGVfaW5mbyAqZnJvbSwgc3dpZ190eXBlX2luZm8gKnR5KSB7CisgIGlmICh0eSkgeworICAgIHN3aWdfY2FzdF9pbmZvICppdGVyID0gdHktPmNhc3Q7CisgICAgd2hpbGUgKGl0ZXIpIHsKKyAgICAgIGlmIChpdGVyLT50eXBlID09IGZyb20pIHsKKyAgICAgICAgaWYgKGl0ZXIgPT0gdHktPmNhc3QpCisgICAgICAgICAgcmV0dXJuIGl0ZXI7CisgICAgICAgIC8qIE1vdmUgaXRlciB0byB0aGUgdG9wIG9mIHRoZSBsaW5rZWQgbGlzdCAqLworICAgICAgICBpdGVyLT5wcmV2LT5uZXh0ID0gaXRlci0+bmV4dDsKKyAgICAgICAgaWYgKGl0ZXItPm5leHQpCisgICAgICAgICAgaXRlci0+bmV4dC0+cHJldiA9IGl0ZXItPnByZXY7CisgICAgICAgIGl0ZXItPm5leHQgPSB0eS0+Y2FzdDsKKyAgICAgICAgaXRlci0+cHJldiA9IDA7CisgICAgICAgIGlmICh0eS0+Y2FzdCkgdHktPmNhc3QtPnByZXYgPSBpdGVyOworICAgICAgICB0eS0+Y2FzdCA9IGl0ZXI7CisgICAgICAgIHJldHVybiBpdGVyOworICAgICAgfQorICAgICAgaXRlciA9IGl0ZXItPm5leHQ7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCisvKgorICBDYXN0IGEgcG9pbnRlciB1cCBhbiBpbmhlcml0YW5jZSBoaWVyYXJjaHkKKyovCitTV0lHUlVOVElNRUlOTElORSB2b2lkICoKK1NXSUdfVHlwZUNhc3Qoc3dpZ19jYXN0X2luZm8gKnR5LCB2b2lkICpwdHIsIGludCAqbmV3bWVtb3J5KSB7CisgIHJldHVybiAoKCF0eSkgfHwgKCF0eS0+Y29udmVydGVyKSkgPyBwdHIgOiAoKnR5LT5jb252ZXJ0ZXIpKHB0ciwgbmV3bWVtb3J5KTsKK30KKworLyoKKyAgIER5bmFtaWMgcG9pbnRlciBjYXN0aW5nLiBEb3duIGFuIGluaGVyaXRhbmNlIGhpZXJhcmNoeQorKi8KK1NXSUdSVU5USU1FIHN3aWdfdHlwZV9pbmZvICoKK1NXSUdfVHlwZUR5bmFtaWNDYXN0KHN3aWdfdHlwZV9pbmZvICp0eSwgdm9pZCAqKnB0cikgeworICBzd2lnX3R5cGVfaW5mbyAqbGFzdHR5ID0gdHk7CisgIGlmICghdHkgfHwgIXR5LT5kY2FzdCkgcmV0dXJuIHR5OworICB3aGlsZSAodHkgJiYgKHR5LT5kY2FzdCkpIHsKKyAgICB0eSA9ICgqdHktPmRjYXN0KShwdHIpOworICAgIGlmICh0eSkgbGFzdHR5ID0gdHk7CisgIH0KKyAgcmV0dXJuIGxhc3R0eTsKK30KKworLyoKKyAgUmV0dXJuIHRoZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHR5cGUKKyovCitTV0lHUlVOVElNRUlOTElORSBjb25zdCBjaGFyICoKK1NXSUdfVHlwZU5hbWUoY29uc3Qgc3dpZ190eXBlX2luZm8gKnR5KSB7CisgIHJldHVybiB0eS0+bmFtZTsKK30KKworLyoKKyAgUmV0dXJuIHRoZSBwcmV0dHkgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0eXBlLAorICB0aGF0IGlzIGFuIHVubWFuZ2xlZCB0eXBlIG5hbWUgaW4gYSBmb3JtIHByZXNlbnRhYmxlIHRvIHRoZSB1c2VyLgorKi8KK1NXSUdSVU5USU1FIGNvbnN0IGNoYXIgKgorU1dJR19UeXBlUHJldHR5TmFtZShjb25zdCBzd2lnX3R5cGVfaW5mbyAqdHlwZSkgeworICAvKiBUaGUgInN0ciIgZmllbGQgY29udGFpbnMgdGhlIGVxdWl2YWxlbnQgcHJldHR5IG5hbWVzIG9mIHRoZQorICAgICB0eXBlLCBzZXBhcmF0ZWQgYnkgdmVydGljYWwtYmFyIGNoYXJhY3RlcnMuICBXZSBjaG9vc2UKKyAgICAgdG8gcHJpbnQgdGhlIGxhc3QgbmFtZSwgYXMgaXQgaXMgb2Z0ZW4gKD8pIHRoZSBtb3N0CisgICAgIHNwZWNpZmljLiAqLworICBpZiAoIXR5cGUpIHJldHVybiBOVUxMOworICBpZiAodHlwZS0+c3RyICE9IE5VTEwpIHsKKyAgICBjb25zdCBjaGFyICpsYXN0X25hbWUgPSB0eXBlLT5zdHI7CisgICAgY29uc3QgY2hhciAqczsKKyAgICBmb3IgKHMgPSB0eXBlLT5zdHI7ICpzOyBzKyspCisgICAgICBpZiAoKnMgPT0gJ3wnKSBsYXN0X25hbWUgPSBzKzE7CisgICAgcmV0dXJuIGxhc3RfbmFtZTsKKyAgfQorICBlbHNlCisgICAgcmV0dXJuIHR5cGUtPm5hbWU7Cit9CisKKy8qCisgICBTZXQgdGhlIGNsaWVudGRhdGEgZmllbGQgZm9yIGEgdHlwZQorKi8KK1NXSUdSVU5USU1FIHZvaWQKK1NXSUdfVHlwZUNsaWVudERhdGEoc3dpZ190eXBlX2luZm8gKnRpLCB2b2lkICpjbGllbnRkYXRhKSB7CisgIHN3aWdfY2FzdF9pbmZvICpjYXN0ID0gdGktPmNhc3Q7CisgIC8qIGlmICh0aS0+Y2xpZW50ZGF0YSA9PSBjbGllbnRkYXRhKSByZXR1cm47ICovCisgIHRpLT5jbGllbnRkYXRhID0gY2xpZW50ZGF0YTsKKworICB3aGlsZSAoY2FzdCkgeworICAgIGlmICghY2FzdC0+Y29udmVydGVyKSB7CisgICAgICBzd2lnX3R5cGVfaW5mbyAqdGMgPSBjYXN0LT50eXBlOworICAgICAgaWYgKCF0Yy0+Y2xpZW50ZGF0YSkgeworICAgICAgICBTV0lHX1R5cGVDbGllbnREYXRhKHRjLCBjbGllbnRkYXRhKTsKKyAgICAgIH0KKyAgICB9CisgICAgY2FzdCA9IGNhc3QtPm5leHQ7CisgIH0KK30KK1NXSUdSVU5USU1FIHZvaWQKK1NXSUdfVHlwZU5ld0NsaWVudERhdGEoc3dpZ190eXBlX2luZm8gKnRpLCB2b2lkICpjbGllbnRkYXRhKSB7CisgIFNXSUdfVHlwZUNsaWVudERhdGEodGksIGNsaWVudGRhdGEpOworICB0aS0+b3duZGF0YSA9IDE7Cit9CisKKy8qCisgIFNlYXJjaCBmb3IgYSBzd2lnX3R5cGVfaW5mbyBzdHJ1Y3R1cmUgb25seSBieSBtYW5nbGVkIG5hbWUKKyAgU2VhcmNoIGlzIGEgTyhsb2cgI3R5cGVzKQorCisgIFdlIHN0YXJ0IHNlYXJjaGluZyBhdCBtb2R1bGUgc3RhcnQsIGFuZCBmaW5pc2ggc2VhcmNoaW5nIHdoZW4gc3RhcnQgPT0gZW5kLgorICBOb3RlOiBpZiBzdGFydCA9PSBlbmQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZnVuY3Rpb24sIHdlIGdvIGFsbCB0aGUgd2F5IGFyb3VuZAorICB0aGUgY2lyY3VsYXIgbGlzdC4KKyovCitTV0lHUlVOVElNRSBzd2lnX3R5cGVfaW5mbyAqCitTV0lHX01hbmdsZWRUeXBlUXVlcnlNb2R1bGUoc3dpZ19tb2R1bGVfaW5mbyAqc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpZ19tb2R1bGVfaW5mbyAqZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgc3dpZ19tb2R1bGVfaW5mbyAqaXRlciA9IHN0YXJ0OworICBkbyB7CisgICAgaWYgKGl0ZXItPnNpemUpIHsKKyAgICAgIHJlZ2lzdGVyIHNpemVfdCBsID0gMDsKKyAgICAgIHJlZ2lzdGVyIHNpemVfdCByID0gaXRlci0+c2l6ZSAtIDE7CisgICAgICBkbyB7CisgICAgICAgIC8qIHNpbmNlIGwrciA+PSAwLCB3ZSBjYW4gKD4+IDEpIGluc3RlYWQgKC8gMikgKi8KKyAgICAgICAgcmVnaXN0ZXIgc2l6ZV90IGkgPSAobCArIHIpID4+IDE7CisgICAgICAgIGNvbnN0IGNoYXIgKmluYW1lID0gaXRlci0+dHlwZXNbaV0tPm5hbWU7CisgICAgICAgIGlmIChpbmFtZSkgeworICAgICAgICAgIHJlZ2lzdGVyIGludCBjb21wYXJlID0gc3RyY21wKG5hbWUsIGluYW1lKTsKKyAgICAgICAgICBpZiAoY29tcGFyZSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gaXRlci0+dHlwZXNbaV07CisgICAgICAgICAgfSBlbHNlIGlmIChjb21wYXJlIDwgMCkgeworICAgICAgICAgICAgaWYgKGkpIHsKKyAgICAgICAgICAgICAgciA9IGkgLSAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIGlmIChjb21wYXJlID4gMCkgeworICAgICAgICAgICAgbCA9IGkgKyAxOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBicmVhazsgLyogc2hvdWxkIG5ldmVyIGhhcHBlbiAqLworICAgICAgICB9CisgICAgICB9IHdoaWxlIChsIDw9IHIpOworICAgIH0KKyAgICBpdGVyID0gaXRlci0+bmV4dDsKKyAgfSB3aGlsZSAoaXRlciAhPSBlbmQpOworICByZXR1cm4gMDsKK30KKworLyoKKyAgU2VhcmNoIGZvciBhIHN3aWdfdHlwZV9pbmZvIHN0cnVjdHVyZSBmb3IgZWl0aGVyIGEgbWFuZ2xlZCBuYW1lIG9yIGEgaHVtYW4gcmVhZGFibGUgbmFtZS4KKyAgSXQgZmlyc3Qgc2VhcmNoZXMgdGhlIG1hbmdsZWQgbmFtZXMgb2YgdGhlIHR5cGVzLCB3aGljaCBpcyBhIE8obG9nICN0eXBlcykKKyAgSWYgYSB0eXBlIGlzIG5vdCBmb3VuZCBpdCB0aGVuIHNlYXJjaGVzIHRoZSBodW1hbiByZWFkYWJsZSBuYW1lcywgd2hpY2ggaXMgTygjdHlwZXMpLgorCisgIFdlIHN0YXJ0IHNlYXJjaGluZyBhdCBtb2R1bGUgc3RhcnQsIGFuZCBmaW5pc2ggc2VhcmNoaW5nIHdoZW4gc3RhcnQgPT0gZW5kLgorICBOb3RlOiBpZiBzdGFydCA9PSBlbmQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZnVuY3Rpb24sIHdlIGdvIGFsbCB0aGUgd2F5IGFyb3VuZAorICB0aGUgY2lyY3VsYXIgbGlzdC4KKyovCitTV0lHUlVOVElNRSBzd2lnX3R5cGVfaW5mbyAqCitTV0lHX1R5cGVRdWVyeU1vZHVsZShzd2lnX21vZHVsZV9pbmZvICpzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgIHN3aWdfbW9kdWxlX2luZm8gKmVuZCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgLyogU1RFUCAxOiBTZWFyY2ggdGhlIG5hbWUgZmllbGQgdXNpbmcgYmluYXJ5IHNlYXJjaCAqLworICBzd2lnX3R5cGVfaW5mbyAqcmV0ID0gU1dJR19NYW5nbGVkVHlwZVF1ZXJ5TW9kdWxlKHN0YXJ0LCBlbmQsIG5hbWUpOworICBpZiAocmV0KSB7CisgICAgcmV0dXJuIHJldDsKKyAgfSBlbHNlIHsKKyAgICAvKiBTVEVQIDI6IElmIHRoZSB0eXBlIGhhc24ndCBiZWVuIGZvdW5kLCBkbyBhIGNvbXBsZXRlIHNlYXJjaAorICAgICAgIG9mIHRoZSBzdHIgZmllbGQgKHRoZSBodW1hbiByZWFkYWJsZSBuYW1lKSAqLworICAgIHN3aWdfbW9kdWxlX2luZm8gKml0ZXIgPSBzdGFydDsKKyAgICBkbyB7CisgICAgICByZWdpc3RlciBzaXplX3QgaSA9IDA7CisgICAgICBmb3IgKDsgaSA8IGl0ZXItPnNpemU7ICsraSkgeworICAgICAgICBpZiAoaXRlci0+dHlwZXNbaV0tPnN0ciAmJiAoU1dJR19UeXBlRXF1aXYoaXRlci0+dHlwZXNbaV0tPnN0ciwgbmFtZSkpKQorICAgICAgICAgIHJldHVybiBpdGVyLT50eXBlc1tpXTsKKyAgICAgIH0KKyAgICAgIGl0ZXIgPSBpdGVyLT5uZXh0OworICAgIH0gd2hpbGUgKGl0ZXIgIT0gZW5kKTsKKyAgfQorCisgIC8qIG5laXRoZXIgZm91bmQgYSBtYXRjaCAqLworICByZXR1cm4gMDsKK30KKworLyoKKyAgIFBhY2sgYmluYXJ5IGRhdGEgaW50byBhIHN0cmluZworKi8KK1NXSUdSVU5USU1FIGNoYXIgKgorU1dJR19QYWNrRGF0YShjaGFyICpjLCB2b2lkICpwdHIsIHNpemVfdCBzeikgeworICBzdGF0aWMgY29uc3QgY2hhciBoZXhbMTddID0gIjAxMjM0NTY3ODlhYmNkZWYiOworICByZWdpc3RlciBjb25zdCB1bnNpZ25lZCBjaGFyICp1ID0gKHVuc2lnbmVkIGNoYXIgKikgcHRyOworICByZWdpc3RlciBjb25zdCB1bnNpZ25lZCBjaGFyICpldSA9ICB1ICsgc3o7CisgIGZvciAoOyB1ICE9IGV1OyArK3UpIHsKKyAgICByZWdpc3RlciB1bnNpZ25lZCBjaGFyIHV1ID0gKnU7CisgICAgKihjKyspID0gaGV4Wyh1dSAmIDB4ZjApID4+IDRdOworICAgICooYysrKSA9IGhleFt1dSAmIDB4Zl07CisgIH0KKyAgcmV0dXJuIGM7Cit9CisKKy8qCisgICBVbnBhY2sgYmluYXJ5IGRhdGEgZnJvbSBhIHN0cmluZworKi8KK1NXSUdSVU5USU1FIGNvbnN0IGNoYXIgKgorU1dJR19VbnBhY2tEYXRhKGNvbnN0IGNoYXIgKmMsIHZvaWQgKnB0ciwgc2l6ZV90IHN6KSB7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKnUgPSAodW5zaWduZWQgY2hhciAqKSBwdHI7CisgIHJlZ2lzdGVyIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmV1ID0gdSArIHN6OworICBmb3IgKDsgdSAhPSBldTsgKyt1KSB7CisgICAgcmVnaXN0ZXIgY2hhciBkID0gKihjKyspOworICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgdXU7CisgICAgaWYgKChkID49ICcwJykgJiYgKGQgPD0gJzknKSkKKyAgICAgIHV1ID0gKChkIC0gJzAnKSA8PCA0KTsKKyAgICBlbHNlIGlmICgoZCA+PSAnYScpICYmIChkIDw9ICdmJykpCisgICAgICB1dSA9ICgoZCAtICgnYSctMTApKSA8PCA0KTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gKGNoYXIgKikgMDsKKyAgICBkID0gKihjKyspOworICAgIGlmICgoZCA+PSAnMCcpICYmIChkIDw9ICc5JykpCisgICAgICB1dSB8PSAoZCAtICcwJyk7CisgICAgZWxzZSBpZiAoKGQgPj0gJ2EnKSAmJiAoZCA8PSAnZicpKQorICAgICAgdXUgfD0gKGQgLSAoJ2EnLTEwKSk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIChjaGFyICopIDA7CisgICAgKnUgPSB1dTsKKyAgfQorICByZXR1cm4gYzsKK30KKworLyoKKyAgIFBhY2sgJ3ZvaWQgKicgaW50byBhIHN0cmluZyBidWZmZXIuCisqLworU1dJR1JVTlRJTUUgY2hhciAqCitTV0lHX1BhY2tWb2lkUHRyKGNoYXIgKmJ1ZmYsIHZvaWQgKnB0ciwgY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IGJzeikgeworICBjaGFyICpyID0gYnVmZjsKKyAgaWYgKCgyKnNpemVvZih2b2lkICopICsgMikgPiBic3opIHJldHVybiAwOworICAqKHIrKykgPSAnXyc7CisgIHIgPSBTV0lHX1BhY2tEYXRhKHIsJnB0cixzaXplb2Yodm9pZCAqKSk7CisgIGlmIChzdHJsZW4obmFtZSkgKyAxID4gKGJzeiAtIChyIC0gYnVmZikpKSByZXR1cm4gMDsKKyAgc3RyY3B5KHIsbmFtZSk7CisgIHJldHVybiBidWZmOworfQorCitTV0lHUlVOVElNRSBjb25zdCBjaGFyICoKK1NXSUdfVW5wYWNrVm9pZFB0cihjb25zdCBjaGFyICpjLCB2b2lkICoqcHRyLCBjb25zdCBjaGFyICpuYW1lKSB7CisgIGlmICgqYyAhPSAnXycpIHsKKyAgICBpZiAoc3RyY21wKGMsIk5VTEwiKSA9PSAwKSB7CisgICAgICAqcHRyID0gKHZvaWQgKikgMDsKKyAgICAgIHJldHVybiBuYW1lOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFNXSUdfVW5wYWNrRGF0YSgrK2MscHRyLHNpemVvZih2b2lkICopKTsKK30KKworU1dJR1JVTlRJTUUgY2hhciAqCitTV0lHX1BhY2tEYXRhTmFtZShjaGFyICpidWZmLCB2b2lkICpwdHIsIHNpemVfdCBzeiwgY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IGJzeikgeworICBjaGFyICpyID0gYnVmZjsKKyAgc2l6ZV90IGxuYW1lID0gKG5hbWUgPyBzdHJsZW4obmFtZSkgOiAwKTsKKyAgaWYgKCgyKnN6ICsgMiArIGxuYW1lKSA+IGJzeikgcmV0dXJuIDA7CisgICoocisrKSA9ICdfJzsKKyAgciA9IFNXSUdfUGFja0RhdGEocixwdHIsc3opOworICBpZiAobG5hbWUpIHsKKyAgICBzdHJuY3B5KHIsbmFtZSxsbmFtZSsxKTsKKyAgfSBlbHNlIHsKKyAgICAqciA9IDA7CisgIH0KKyAgcmV0dXJuIGJ1ZmY7Cit9CisKK1NXSUdSVU5USU1FIGNvbnN0IGNoYXIgKgorU1dJR19VbnBhY2tEYXRhTmFtZShjb25zdCBjaGFyICpjLCB2b2lkICpwdHIsIHNpemVfdCBzeiwgY29uc3QgY2hhciAqbmFtZSkgeworICBpZiAoKmMgIT0gJ18nKSB7CisgICAgaWYgKHN0cmNtcChjLCJOVUxMIikgPT0gMCkgeworICAgICAgbWVtc2V0KHB0ciwwLHN6KTsKKyAgICAgIHJldHVybiBuYW1lOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFNXSUdfVW5wYWNrRGF0YSgrK2MscHRyLHN6KTsKK30KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworLyogIEVycm9ycyBpbiBTV0lHICovCisjZGVmaW5lICBTV0lHX1Vua25vd25FcnJvciAgICAgICAgIC0xCisjZGVmaW5lICBTV0lHX0lPRXJyb3IgICAgICAgICAgICAgIC0yCisjZGVmaW5lICBTV0lHX1J1bnRpbWVFcnJvciAgICAgICAgIC0zCisjZGVmaW5lICBTV0lHX0luZGV4RXJyb3IgICAgICAgICAgIC00CisjZGVmaW5lICBTV0lHX1R5cGVFcnJvciAgICAgICAgICAgIC01CisjZGVmaW5lICBTV0lHX0RpdmlzaW9uQnlaZXJvICAgICAgIC02CisjZGVmaW5lICBTV0lHX092ZXJmbG93RXJyb3IgICAgICAgIC03CisjZGVmaW5lICBTV0lHX1N5bnRheEVycm9yICAgICAgICAgIC04CisjZGVmaW5lICBTV0lHX1ZhbHVlRXJyb3IgICAgICAgICAgIC05CisjZGVmaW5lICBTV0lHX1N5c3RlbUVycm9yICAgICAgICAgIC0xMAorI2RlZmluZSAgU1dJR19BdHRyaWJ1dGVFcnJvciAgICAgICAtMTEKKyNkZWZpbmUgIFNXSUdfTWVtb3J5RXJyb3IgICAgICAgICAgLTEyCisjZGVmaW5lICBTV0lHX051bGxSZWZlcmVuY2VFcnJvciAgIC0xMworCisKKworLyogQ29tcGF0aWJpbGl0eSBtYWNyb3MgZm9yIFB5dGhvbiAzICovCisjaWYgUFlfVkVSU0lPTl9IRVggPj0gMHgwMzAwMDAwMAorCisjZGVmaW5lIFB5Q2xhc3NfQ2hlY2sob2JqKSBQeU9iamVjdF9Jc0luc3RhbmNlKG9iaiwgKFB5T2JqZWN0ICopJlB5VHlwZV9UeXBlKQorI2RlZmluZSBQeUludF9DaGVjayh4KSBQeUxvbmdfQ2hlY2soeCkKKyNkZWZpbmUgUHlJbnRfQXNMb25nKHgpIFB5TG9uZ19Bc0xvbmcoeCkKKyNkZWZpbmUgUHlJbnRfRnJvbUxvbmcoeCkgUHlMb25nX0Zyb21Mb25nKHgpCisjZGVmaW5lIFB5U3RyaW5nX0NoZWNrKG5hbWUpIFB5Qnl0ZXNfQ2hlY2sobmFtZSkKKyNkZWZpbmUgUHlTdHJpbmdfRnJvbVN0cmluZyh4KSBQeVVuaWNvZGVfRnJvbVN0cmluZyh4KQorI2RlZmluZSBQeVN0cmluZ19Gb3JtYXQoZm10LCBhcmdzKSAgUHlVbmljb2RlX0Zvcm1hdChmbXQsIGFyZ3MpCisjZGVmaW5lIFB5U3RyaW5nX0FzU3RyaW5nKHN0cikgUHlCeXRlc19Bc1N0cmluZyhzdHIpCisjZGVmaW5lIFB5U3RyaW5nX1NpemUoc3RyKSBQeUJ5dGVzX1NpemUoc3RyKQorI2RlZmluZSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKGtleSkgUHlVbmljb2RlX0ludGVybkZyb21TdHJpbmcoa2V5KQorI2RlZmluZSBQeV9UUEZMQUdTX0hBVkVfQ0xBU1MgUHlfVFBGTEFHU19CQVNFVFlQRQorI2RlZmluZSBQeVN0cmluZ19BU19TVFJJTkcoeCkgUHlVbmljb2RlX0FTX1NUUklORyh4KQorI2RlZmluZSBfUHlMb25nX0Zyb21Tc2l6ZV90KHgpIFB5TG9uZ19Gcm9tU3NpemVfdCh4KQorCisjZW5kaWYKKworI2lmbmRlZiBQeV9UWVBFCisjICBkZWZpbmUgUHlfVFlQRShvcCkgKChvcCktPm9iX3R5cGUpCisjZW5kaWYKKworLyogU1dJRyBBUElzIGZvciBjb21wYXRpYmlsaXR5IG9mIGJvdGggUHl0aG9uIDIgJiAzICovCisKKyNpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAzMDAwMDAwCisjICBkZWZpbmUgU1dJR19QeXRob25fc3RyX0Zyb21Gb3JtYXQgUHlVbmljb2RlX0Zyb21Gb3JtYXQKKyNlbHNlCisjICBkZWZpbmUgU1dJR19QeXRob25fc3RyX0Zyb21Gb3JtYXQgUHlTdHJpbmdfRnJvbUZvcm1hdAorI2VuZGlmCisKKworLyogV2FybmluZzogVGhpcyBmdW5jdGlvbiB3aWxsIGFsbG9jYXRlIGEgbmV3IHN0cmluZyBpbiBQeXRob24gMywKKyAqIHNvIHBsZWFzZSBjYWxsIFNXSUdfUHl0aG9uX3N0cl9EZWxGb3JQeTMoeCkgdG8gZnJlZSB0aGUgc3BhY2UuCisgKi8KK1NXSUdJTlRFUk4gY2hhcioKK1NXSUdfUHl0aG9uX3N0cl9Bc0NoYXIoUHlPYmplY3QgKnN0cikKK3sKKyNpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAzMDAwMDAwCisgIGNoYXIgKmNzdHI7CisgIGNoYXIgKm5ld3N0cjsKKyAgUHlfc3NpemVfdCBsZW47CisgIHN0ciA9IFB5VW5pY29kZV9Bc1VURjhTdHJpbmcoc3RyKTsKKyAgUHlCeXRlc19Bc1N0cmluZ0FuZFNpemUoc3RyLCAmY3N0ciwgJmxlbik7CisgIG5ld3N0ciA9IChjaGFyICopIG1hbGxvYyhsZW4rMSk7CisgIG1lbWNweShuZXdzdHIsIGNzdHIsIGxlbisxKTsKKyAgUHlfWERFQ1JFRihzdHIpOworICByZXR1cm4gbmV3c3RyOworI2Vsc2UKKyAgcmV0dXJuIFB5U3RyaW5nX0FzU3RyaW5nKHN0cik7CisjZW5kaWYKK30KKworI2lmIFBZX1ZFUlNJT05fSEVYID49IDB4MDMwMDAwMDAKKyMgIGRlZmluZSBTV0lHX1B5dGhvbl9zdHJfRGVsRm9yUHkzKHgpIGZyZWUoICh2b2lkKikgKHgpICkKKyNlbHNlCisjICBkZWZpbmUgU1dJR19QeXRob25fc3RyX0RlbEZvclB5Myh4KQorI2VuZGlmCisKKworU1dJR0lOVEVSTiBQeU9iamVjdCoKK1NXSUdfUHl0aG9uX3N0cl9Gcm9tQ2hhcihjb25zdCBjaGFyICpjKQoreworI2lmIFBZX1ZFUlNJT05fSEVYID49IDB4MDMwMDAwMDAKKyAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tU3RyaW5nKGMpOworI2Vsc2UKKyAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYyk7CisjZW5kaWYKK30KKworLyogQWRkIFB5T1Nfc25wcmludGYgZm9yIG9sZCBQeXRob25zICovCisjaWYgUFlfVkVSU0lPTl9IRVggPCAweDAyMDIwMDAwCisjIGlmIGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKSB8fCBkZWZpbmVkKF9XQVRDT00pCisjICBkZWZpbmUgUHlPU19zbnByaW50ZiBfc25wcmludGYKKyMgZWxzZQorIyAgZGVmaW5lIFB5T1Nfc25wcmludGYgc25wcmludGYKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBBIGNydWRlIFB5U3RyaW5nX0Zyb21Gb3JtYXQgaW1wbGVtZW50YXRpb24gZm9yIG9sZCBQeXRob25zICovCisjaWYgUFlfVkVSU0lPTl9IRVggPCAweDAyMDIwMDAwCisKKyNpZm5kZWYgU1dJR19QWUJVRkZFUl9TSVpFCisjIGRlZmluZSBTV0lHX1BZQlVGRkVSX1NJWkUgMTAyNAorI2VuZGlmCisKK3N0YXRpYyBQeU9iamVjdCAqCitQeVN0cmluZ19Gcm9tRm9ybWF0KGNvbnN0IGNoYXIgKmZtdCwgLi4uKSB7CisgIHZhX2xpc3QgYXA7CisgIGNoYXIgYnVmW1NXSUdfUFlCVUZGRVJfU0laRSAqIDJdOworICBpbnQgcmVzOworICB2YV9zdGFydChhcCwgZm10KTsKKyAgcmVzID0gdnNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZtdCwgYXApOworICB2YV9lbmQoYXApOworICByZXR1cm4gKHJlcyA8IDAgfHwgcmVzID49IChpbnQpc2l6ZW9mKGJ1ZikpID8gMCA6IFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKK30KKyNlbmRpZgorCisvKiBBZGQgUHlPYmplY3RfRGVsIGZvciBvbGQgUHl0aG9ucyAqLworI2lmIFBZX1ZFUlNJT05fSEVYIDwgMHgwMTA2MDAwMAorIyBkZWZpbmUgUHlPYmplY3RfRGVsKG9wKSBQeU1lbV9ERUwoKG9wKSkKKyNlbmRpZgorI2lmbmRlZiBQeU9iamVjdF9ERUwKKyMgZGVmaW5lIFB5T2JqZWN0X0RFTCBQeU9iamVjdF9EZWwKKyNlbmRpZgorCisvKiBBIGNydWRlIFB5RXhjX1N0b3BJdGVyYXRpb24gZXhjZXB0aW9uIGZvciBvbGQgUHl0aG9ucyAqLworI2lmIFBZX1ZFUlNJT05fSEVYIDwgMHgwMjAyMDAwMAorIyBpZm5kZWYgUHlFeGNfU3RvcEl0ZXJhdGlvbgorIyAgZGVmaW5lIFB5RXhjX1N0b3BJdGVyYXRpb24gUHlFeGNfUnVudGltZUVycm9yCisjIGVuZGlmCisjIGlmbmRlZiBQeU9iamVjdF9HZW5lcmljR2V0QXR0cgorIyAgZGVmaW5lIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyIDAKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBQeV9Ob3RJbXBsZW1lbnRlZCBpcyBkZWZpbmVkIGluIDIuMSBhbmQgdXAuICovCisjaWYgUFlfVkVSU0lPTl9IRVggPCAweDAyMDEwMDAwCisjIGlmbmRlZiBQeV9Ob3RJbXBsZW1lbnRlZAorIyAgZGVmaW5lIFB5X05vdEltcGxlbWVudGVkIFB5RXhjX1J1bnRpbWVFcnJvcgorIyBlbmRpZgorI2VuZGlmCisKKy8qIEEgY3J1ZGUgUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplIGltcGxlbWVudGF0aW9uIGZvciBvbGQgUHl0aG9ucyAqLworI2lmIFBZX1ZFUlNJT05fSEVYIDwgMHgwMjAxMDAwMAorIyBpZm5kZWYgUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplCisjICBkZWZpbmUgUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKG9iaiwgcywgbGVuKSB7KnMgPSBQeVN0cmluZ19Bc1N0cmluZyhvYmopOyAqbGVuID0gKnMgPyBzdHJsZW4oKnMpIDogMDt9CisjIGVuZGlmCisjZW5kaWYKKworLyogUHlTZXF1ZW5jZV9TaXplIGZvciBvbGQgUHl0aG9ucyAqLworI2lmIFBZX1ZFUlNJT05fSEVYIDwgMHgwMjAwMDAwMAorIyBpZm5kZWYgUHlTZXF1ZW5jZV9TaXplCisjICBkZWZpbmUgUHlTZXF1ZW5jZV9TaXplIFB5U2VxdWVuY2VfTGVuZ3RoCisjIGVuZGlmCisjZW5kaWYKKworLyogUHlCb29sX0Zyb21Mb25nIGZvciBvbGQgUHl0aG9ucyAqLworI2lmIFBZX1ZFUlNJT05fSEVYIDwgMHgwMjAzMDAwMAorc3RhdGljCitQeU9iamVjdCAqUHlCb29sX0Zyb21Mb25nKGxvbmcgb2spCit7CisgIFB5T2JqZWN0ICpyZXN1bHQgPSBvayA/IFB5X1RydWUgOiBQeV9GYWxzZTsKKyAgUHlfSU5DUkVGKHJlc3VsdCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYKKworLyogUHlfc3NpemVfdCBmb3Igb2xkIFB5dGhvbnMgKi8KKy8qIFRoaXMgY29kZSBpcyBhcyByZWNvbW1lbmRlZCBieTogKi8KKy8qIGh0dHA6Ly93d3cucHl0aG9uLm9yZy9kZXYvcGVwcy9wZXAtMDM1My8jY29udmVyc2lvbi1ndWlkZWxpbmVzICovCisjaWYgUFlfVkVSU0lPTl9IRVggPCAweDAyMDUwMDAwICYmICFkZWZpbmVkKFBZX1NTSVpFX1RfTUlOKQordHlwZWRlZiBpbnQgUHlfc3NpemVfdDsKKyMgZGVmaW5lIFBZX1NTSVpFX1RfTUFYIElOVF9NQVgKKyMgZGVmaW5lIFBZX1NTSVpFX1RfTUlOIElOVF9NSU4KK3R5cGVkZWYgaW5xdWlyeSBsZW5mdW5jOwordHlwZWRlZiBpbnRhcmdmdW5jIHNzaXplYXJnZnVuYzsKK3R5cGVkZWYgaW50aW50YXJnZnVuYyBzc2l6ZXNzaXplYXJnZnVuYzsKK3R5cGVkZWYgaW50b2JqYXJncHJvYyBzc2l6ZW9iamFyZ3Byb2M7Cit0eXBlZGVmIGludGludG9iamFyZ3Byb2Mgc3NpemVzc2l6ZW9iamFyZ3Byb2M7Cit0eXBlZGVmIGdldHJlYWRidWZmZXJwcm9jIHJlYWRidWZmZXJwcm9jOwordHlwZWRlZiBnZXR3cml0ZWJ1ZmZlcnByb2Mgd3JpdGVidWZmZXJwcm9jOwordHlwZWRlZiBnZXRzZWdjb3VudHByb2Mgc2VnY291bnRwcm9jOwordHlwZWRlZiBnZXRjaGFyYnVmZmVycHJvYyBjaGFyYnVmZmVycHJvYzsKK3N0YXRpYyBsb25nIFB5TnVtYmVyX0FzU3NpemVfdCAoUHlPYmplY3QgKngsIHZvaWQgKlNXSUdVTlVTRURQQVJNKGV4YykpCit7CisgIGxvbmcgcmVzdWx0ID0gMDsKKyAgUHlPYmplY3QgKmkgPSBQeU51bWJlcl9JbnQoeCk7CisgIGlmIChpKSB7CisgICAgcmVzdWx0ID0gUHlJbnRfQXNMb25nKGkpOworICAgIFB5X0RFQ1JFRihpKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorI2VuZGlmCisKKyNpZiBQWV9WRVJTSU9OX0hFWCA8IDB4MDIwNDAwMDAKKyNkZWZpbmUgUHlfVklTSVQob3ApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAob3ApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGludCB2cmV0ID0gdmlzaXQoKG9wKSwgYXJnKTsgICAgICAgICAgICAgIFwKKyAgICAgIGlmICh2cmV0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIHZyZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjaWYgUFlfVkVSU0lPTl9IRVggPCAweDAyMDMwMDAwCit0eXBlZGVmIHN0cnVjdCB7CisgIFB5VHlwZU9iamVjdCB0eXBlOworICBQeU51bWJlck1ldGhvZHMgYXNfbnVtYmVyOworICBQeU1hcHBpbmdNZXRob2RzIGFzX21hcHBpbmc7CisgIFB5U2VxdWVuY2VNZXRob2RzIGFzX3NlcXVlbmNlOworICBQeUJ1ZmZlclByb2NzIGFzX2J1ZmZlcjsKKyAgUHlPYmplY3QgKm5hbWUsICpzbG90czsKK30gUHlIZWFwVHlwZU9iamVjdDsKKyNlbmRpZgorCisjaWYgUFlfVkVSU0lPTl9IRVggPCAweDAyMDMwMDAwCit0eXBlZGVmIGRlc3RydWN0b3IgZnJlZWZ1bmM7CisjZW5kaWYKKworI2lmICgoUFlfTUFKT1JfVkVSU0lPTiA9PSAyICYmIFBZX01JTk9SX1ZFUlNJT04gPiA2KSB8fCBcCisgICAgIChQWV9NQUpPUl9WRVJTSU9OID09IDMgJiYgUFlfTUlOT1JfVkVSU0lPTiA+IDApIHx8IFwKKyAgICAgKFBZX01BSk9SX1ZFUlNJT04gPiAzKSkKKyMgZGVmaW5lIFNXSUdQWV9VU0VfQ0FQU1VMRQorIyBkZWZpbmUgU1dJR1BZX0NBUFNVTEVfTkFNRSAoKGNoYXIqKSJzd2lnX3J1bnRpbWVfZGF0YSIgU1dJR19SVU5USU1FX1ZFUlNJT04gIi50eXBlX3BvaW50ZXJfY2Fwc3VsZSIgU1dJR19UWVBFX1RBQkxFX05BTUUpCisjZW5kaWYKKworI2lmIFBZX1ZFUlNJT05fSEVYIDwgMHgwMzAyMDAwMAorI2RlZmluZSBQeURlc2NyX1RZUEUoeCkgKCgoUHlEZXNjck9iamVjdCAqKSh4KSktPmRfdHlwZSkKKyNkZWZpbmUgUHlEZXNjcl9OQU1FKHgpICgoKFB5RGVzY3JPYmplY3QgKikoeCkpLT5kX25hbWUpCisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGVycm9yIG1hbmlwdWxhdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworU1dJR1JVTlRJTUUgUHlPYmplY3QqCitTV0lHX1B5dGhvbl9FcnJvclR5cGUoaW50IGNvZGUpIHsKKyAgUHlPYmplY3QqIHR5cGUgPSAwOworICBzd2l0Y2goY29kZSkgeworICBjYXNlIFNXSUdfTWVtb3J5RXJyb3I6CisgICAgdHlwZSA9IFB5RXhjX01lbW9yeUVycm9yOworICAgIGJyZWFrOworICBjYXNlIFNXSUdfSU9FcnJvcjoKKyAgICB0eXBlID0gUHlFeGNfSU9FcnJvcjsKKyAgICBicmVhazsKKyAgY2FzZSBTV0lHX1J1bnRpbWVFcnJvcjoKKyAgICB0eXBlID0gUHlFeGNfUnVudGltZUVycm9yOworICAgIGJyZWFrOworICBjYXNlIFNXSUdfSW5kZXhFcnJvcjoKKyAgICB0eXBlID0gUHlFeGNfSW5kZXhFcnJvcjsKKyAgICBicmVhazsKKyAgY2FzZSBTV0lHX1R5cGVFcnJvcjoKKyAgICB0eXBlID0gUHlFeGNfVHlwZUVycm9yOworICAgIGJyZWFrOworICBjYXNlIFNXSUdfRGl2aXNpb25CeVplcm86CisgICAgdHlwZSA9IFB5RXhjX1plcm9EaXZpc2lvbkVycm9yOworICAgIGJyZWFrOworICBjYXNlIFNXSUdfT3ZlcmZsb3dFcnJvcjoKKyAgICB0eXBlID0gUHlFeGNfT3ZlcmZsb3dFcnJvcjsKKyAgICBicmVhazsKKyAgY2FzZSBTV0lHX1N5bnRheEVycm9yOgorICAgIHR5cGUgPSBQeUV4Y19TeW50YXhFcnJvcjsKKyAgICBicmVhazsKKyAgY2FzZSBTV0lHX1ZhbHVlRXJyb3I6CisgICAgdHlwZSA9IFB5RXhjX1ZhbHVlRXJyb3I7CisgICAgYnJlYWs7CisgIGNhc2UgU1dJR19TeXN0ZW1FcnJvcjoKKyAgICB0eXBlID0gUHlFeGNfU3lzdGVtRXJyb3I7CisgICAgYnJlYWs7CisgIGNhc2UgU1dJR19BdHRyaWJ1dGVFcnJvcjoKKyAgICB0eXBlID0gUHlFeGNfQXR0cmlidXRlRXJyb3I7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgdHlwZSA9IFB5RXhjX1J1bnRpbWVFcnJvcjsKKyAgfQorICByZXR1cm4gdHlwZTsKK30KKworCitTV0lHUlVOVElNRSB2b2lkCitTV0lHX1B5dGhvbl9BZGRFcnJvck1zZyhjb25zdCBjaGFyKiBtZXNnKQoreworICBQeU9iamVjdCAqdHlwZSA9IDA7CisgIFB5T2JqZWN0ICp2YWx1ZSA9IDA7CisgIFB5T2JqZWN0ICp0cmFjZWJhY2sgPSAwOworCisgIGlmIChQeUVycl9PY2N1cnJlZCgpKSBQeUVycl9GZXRjaCgmdHlwZSwgJnZhbHVlLCAmdHJhY2ViYWNrKTsKKyAgaWYgKHZhbHVlKSB7CisgICAgY2hhciAqdG1wOworICAgIFB5T2JqZWN0ICpvbGRfc3RyID0gUHlPYmplY3RfU3RyKHZhbHVlKTsKKyAgICBQeUVycl9DbGVhcigpOworICAgIFB5X1hJTkNSRUYodHlwZSk7CisKKyAgICBQeUVycl9Gb3JtYXQodHlwZSwgIiVzICVzIiwgdG1wID0gU1dJR19QeXRob25fc3RyX0FzQ2hhcihvbGRfc3RyKSwgbWVzZyk7CisgICAgU1dJR19QeXRob25fc3RyX0RlbEZvclB5Myh0bXApOworICAgIFB5X0RFQ1JFRihvbGRfc3RyKTsKKyAgICBQeV9ERUNSRUYodmFsdWUpOworICB9IGVsc2UgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsIG1lc2cpOworICB9Cit9CisKKyNpZiBkZWZpbmVkKFNXSUdfUFlUSE9OX05PX1RIUkVBRFMpCisjICBpZiBkZWZpbmVkKFNXSUdfUFlUSE9OX1RIUkVBRFMpCisjICAgIHVuZGVmIFNXSUdfUFlUSE9OX1RIUkVBRFMKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKFNXSUdfUFlUSE9OX1RIUkVBRFMpIC8qIFRocmVhZGluZyBzdXBwb3J0IGlzIGVuYWJsZWQgKi8KKyMgIGlmICFkZWZpbmVkKFNXSUdfUFlUSE9OX1VTRV9HSUwpICYmICFkZWZpbmVkKFNXSUdfUFlUSE9OX05PX1VTRV9HSUwpCisjICAgIGlmIChQWV9WRVJTSU9OX0hFWCA+PSAweDAyMDMwMDAwKSAvKiBGb3IgMi4zIG9yIGxhdGVyLCB1c2UgdGhlIFB5R0lMU3RhdGUgY2FsbHMgKi8KKyMgICAgICBkZWZpbmUgU1dJR19QWVRIT05fVVNFX0dJTAorIyAgICBlbmRpZgorIyAgZW5kaWYKKyMgIGlmIGRlZmluZWQoU1dJR19QWVRIT05fVVNFX0dJTCkgLyogVXNlIFB5R0lMU3RhdGUgdGhyZWFkcyBjYWxscyAqLworIyAgICBpZm5kZWYgU1dJR19QWVRIT05fSU5JVElBTElaRV9USFJFQURTCisjICAgICBkZWZpbmUgU1dJR19QWVRIT05fSU5JVElBTElaRV9USFJFQURTICBQeUV2YWxfSW5pdFRocmVhZHMoKQorIyAgICBlbmRpZgorIyAgICBpZmRlZiBfX2NwbHVzcGx1cyAvKiBDKysgY29kZSAqLworICAgICAgIGNsYXNzIFNXSUdfUHl0aG9uX1RocmVhZF9CbG9jayB7CisgICAgICAgICBib29sIHN0YXR1czsKKyAgICAgICAgIFB5R0lMU3RhdGVfU1RBVEUgc3RhdGU7CisgICAgICAgcHVibGljOgorICAgICAgICAgdm9pZCBlbmQoKSB7IGlmIChzdGF0dXMpIHsgUHlHSUxTdGF0ZV9SZWxlYXNlKHN0YXRlKTsgc3RhdHVzID0gZmFsc2U7fSB9CisgICAgICAgICBTV0lHX1B5dGhvbl9UaHJlYWRfQmxvY2soKSA6IHN0YXR1cyh0cnVlKSwgc3RhdGUoUHlHSUxTdGF0ZV9FbnN1cmUoKSkge30KKyAgICAgICAgIH5TV0lHX1B5dGhvbl9UaHJlYWRfQmxvY2soKSB7IGVuZCgpOyB9CisgICAgICAgfTsKKyAgICAgICBjbGFzcyBTV0lHX1B5dGhvbl9UaHJlYWRfQWxsb3cgeworICAgICAgICAgYm9vbCBzdGF0dXM7CisgICAgICAgICBQeVRocmVhZFN0YXRlICpzYXZlOworICAgICAgIHB1YmxpYzoKKyAgICAgICAgIHZvaWQgZW5kKCkgeyBpZiAoc3RhdHVzKSB7IFB5RXZhbF9SZXN0b3JlVGhyZWFkKHNhdmUpOyBzdGF0dXMgPSBmYWxzZTsgfX0KKyAgICAgICAgIFNXSUdfUHl0aG9uX1RocmVhZF9BbGxvdygpIDogc3RhdHVzKHRydWUpLCBzYXZlKFB5RXZhbF9TYXZlVGhyZWFkKCkpIHt9CisgICAgICAgICB+U1dJR19QeXRob25fVGhyZWFkX0FsbG93KCkgeyBlbmQoKTsgfQorICAgICAgIH07CisjICAgICAgZGVmaW5lIFNXSUdfUFlUSE9OX1RIUkVBRF9CRUdJTl9CTE9DSyAgIFNXSUdfUHl0aG9uX1RocmVhZF9CbG9jayBfc3dpZ190aHJlYWRfYmxvY2sKKyMgICAgICBkZWZpbmUgU1dJR19QWVRIT05fVEhSRUFEX0VORF9CTE9DSyAgICAgX3N3aWdfdGhyZWFkX2Jsb2NrLmVuZCgpCisjICAgICAgZGVmaW5lIFNXSUdfUFlUSE9OX1RIUkVBRF9CRUdJTl9BTExPVyAgIFNXSUdfUHl0aG9uX1RocmVhZF9BbGxvdyBfc3dpZ190aHJlYWRfYWxsb3cKKyMgICAgICBkZWZpbmUgU1dJR19QWVRIT05fVEhSRUFEX0VORF9BTExPVyAgICAgX3N3aWdfdGhyZWFkX2FsbG93LmVuZCgpCisjICAgIGVsc2UgLyogQyBjb2RlICovCisjICAgICAgZGVmaW5lIFNXSUdfUFlUSE9OX1RIUkVBRF9CRUdJTl9CTE9DSyAgIFB5R0lMU3RhdGVfU1RBVEUgX3N3aWdfdGhyZWFkX2Jsb2NrID0gUHlHSUxTdGF0ZV9FbnN1cmUoKQorIyAgICAgIGRlZmluZSBTV0lHX1BZVEhPTl9USFJFQURfRU5EX0JMT0NLICAgICBQeUdJTFN0YXRlX1JlbGVhc2UoX3N3aWdfdGhyZWFkX2Jsb2NrKQorIyAgICAgIGRlZmluZSBTV0lHX1BZVEhPTl9USFJFQURfQkVHSU5fQUxMT1cgICBQeVRocmVhZFN0YXRlICpfc3dpZ190aHJlYWRfYWxsb3cgPSBQeUV2YWxfU2F2ZVRocmVhZCgpCisjICAgICAgZGVmaW5lIFNXSUdfUFlUSE9OX1RIUkVBRF9FTkRfQUxMT1cgICAgIFB5RXZhbF9SZXN0b3JlVGhyZWFkKF9zd2lnX3RocmVhZF9hbGxvdykKKyMgICAgZW5kaWYKKyMgIGVsc2UgLyogT2xkIHRocmVhZCB3YXksIG5vdCBpbXBsZW1lbnRlZCwgdXNlciBtdXN0IHByb3ZpZGUgaXQgKi8KKyMgICAgaWYgIWRlZmluZWQoU1dJR19QWVRIT05fSU5JVElBTElaRV9USFJFQURTKQorIyAgICAgIGRlZmluZSBTV0lHX1BZVEhPTl9JTklUSUFMSVpFX1RIUkVBRFMKKyMgICAgZW5kaWYKKyMgICAgaWYgIWRlZmluZWQoU1dJR19QWVRIT05fVEhSRUFEX0JFR0lOX0JMT0NLKQorIyAgICAgIGRlZmluZSBTV0lHX1BZVEhPTl9USFJFQURfQkVHSU5fQkxPQ0sKKyMgICAgZW5kaWYKKyMgICAgaWYgIWRlZmluZWQoU1dJR19QWVRIT05fVEhSRUFEX0VORF9CTE9DSykKKyMgICAgICBkZWZpbmUgU1dJR19QWVRIT05fVEhSRUFEX0VORF9CTE9DSworIyAgICBlbmRpZgorIyAgICBpZiAhZGVmaW5lZChTV0lHX1BZVEhPTl9USFJFQURfQkVHSU5fQUxMT1cpCisjICAgICAgZGVmaW5lIFNXSUdfUFlUSE9OX1RIUkVBRF9CRUdJTl9BTExPVworIyAgICBlbmRpZgorIyAgICBpZiAhZGVmaW5lZChTV0lHX1BZVEhPTl9USFJFQURfRU5EX0FMTE9XKQorIyAgICAgIGRlZmluZSBTV0lHX1BZVEhPTl9USFJFQURfRU5EX0FMTE9XCisjICAgIGVuZGlmCisjICBlbmRpZgorI2Vsc2UgLyogTm8gdGhyZWFkIHN1cHBvcnQgKi8KKyMgIGRlZmluZSBTV0lHX1BZVEhPTl9JTklUSUFMSVpFX1RIUkVBRFMKKyMgIGRlZmluZSBTV0lHX1BZVEhPTl9USFJFQURfQkVHSU5fQkxPQ0sKKyMgIGRlZmluZSBTV0lHX1BZVEhPTl9USFJFQURfRU5EX0JMT0NLCisjICBkZWZpbmUgU1dJR19QWVRIT05fVEhSRUFEX0JFR0lOX0FMTE9XCisjICBkZWZpbmUgU1dJR19QWVRIT05fVEhSRUFEX0VORF9BTExPVworI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQeXRob24gQVBJIHBvcnRpb24gdGhhdCBnb2VzIGludG8gdGhlIHJ1bnRpbWUKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvbnN0YW50IGRlY2xhcmF0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogQ29uc3RhbnQgVHlwZXMgKi8KKyNkZWZpbmUgU1dJR19QWV9QT0lOVEVSIDQKKyNkZWZpbmUgU1dJR19QWV9CSU5BUlkgIDUKKworLyogQ29uc3RhbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCBzd2lnX2NvbnN0X2luZm8geworICBpbnQgdHlwZTsKKyAgY2hhciAqbmFtZTsKKyAgbG9uZyBsdmFsdWU7CisgIGRvdWJsZSBkdmFsdWU7CisgIHZvaWQgICAqcHZhbHVlOworICBzd2lnX3R5cGVfaW5mbyAqKnB0eXBlOworfSBzd2lnX2NvbnN0X2luZm87CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFdyYXBwZXIgb2YgUHlJbnN0YW5jZU1ldGhvZF9OZXcoKSB1c2VkIGluIFB5dGhvbiAzCisgKiBJdCBpcyBleHBvcnRlZCB0byB0aGUgZ2VuZXJhdGVkIG1vZHVsZSwgdXNlZCBmb3IgLWZhc3Rwcm94eQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAzMDAwMDAwCitTV0lHUlVOVElNRSBQeU9iamVjdCogU1dJR19QeUluc3RhbmNlTWV0aG9kX05ldyhQeU9iamVjdCAqU1dJR1VOVVNFRFBBUk0oc2VsZiksIFB5T2JqZWN0ICpmdW5jKQoreworICByZXR1cm4gUHlJbnN0YW5jZU1ldGhvZF9OZXcoZnVuYyk7Cit9CisjZWxzZQorU1dJR1JVTlRJTUUgUHlPYmplY3QqIFNXSUdfUHlJbnN0YW5jZU1ldGhvZF9OZXcoUHlPYmplY3QgKlNXSUdVTlVTRURQQVJNKHNlbGYpLCBQeU9iamVjdCAqU1dJR1VOVVNFRFBBUk0oZnVuYykpCit7CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHB5cnVuLnN3ZworICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgcnVudGltZSBzdXBwb3J0IGZvciBQeXRob24gbW9kdWxlcworICogYW5kIGluY2x1ZGVzIGNvZGUgZm9yIG1hbmFnaW5nIGdsb2JhbCB2YXJpYWJsZXMgYW5kIHBvaW50ZXIKKyAqIHR5cGUgY2hlY2tpbmcuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogQ29tbW9uIFNXSUcgQVBJICovCisKKy8qIGZvciByYXcgcG9pbnRlcnMgKi8KKyNkZWZpbmUgU1dJR19QeXRob25fQ29udmVydFB0cihvYmosIHBwdHIsIHR5cGUsIGZsYWdzKSAgU1dJR19QeXRob25fQ29udmVydFB0ckFuZE93bihvYmosIHBwdHIsIHR5cGUsIGZsYWdzLCAwKQorI2RlZmluZSBTV0lHX0NvbnZlcnRQdHIob2JqLCBwcHRyLCB0eXBlLCBmbGFncykgICAgICAgICBTV0lHX1B5dGhvbl9Db252ZXJ0UHRyKG9iaiwgcHB0ciwgdHlwZSwgZmxhZ3MpCisjZGVmaW5lIFNXSUdfQ29udmVydFB0ckFuZE93bihvYmoscHB0cix0eXBlLGZsYWdzLG93bikgIFNXSUdfUHl0aG9uX0NvbnZlcnRQdHJBbmRPd24ob2JqLCBwcHRyLCB0eXBlLCBmbGFncywgb3duKQorCisjaWZkZWYgU1dJR1BZVEhPTl9CVUlMVElOCisjZGVmaW5lIFNXSUdfTmV3UG9pbnRlck9iaihwdHIsIHR5cGUsIGZsYWdzKSAgICAgICAgICAgIFNXSUdfUHl0aG9uX05ld1BvaW50ZXJPYmooc2VsZiwgcHRyLCB0eXBlLCBmbGFncykKKyNlbHNlCisjZGVmaW5lIFNXSUdfTmV3UG9pbnRlck9iaihwdHIsIHR5cGUsIGZsYWdzKSAgICAgICAgICAgIFNXSUdfUHl0aG9uX05ld1BvaW50ZXJPYmooTlVMTCwgcHRyLCB0eXBlLCBmbGFncykKKyNlbmRpZgorCisjZGVmaW5lIFNXSUdfSW50ZXJuYWxOZXdQb2ludGVyT2JqKHB0ciwgdHlwZSwgZmxhZ3MpICAgIFNXSUdfUHl0aG9uX05ld1BvaW50ZXJPYmooTlVMTCwgcHRyLCB0eXBlLCBmbGFncykKKworI2RlZmluZSBTV0lHX0NoZWNrSW1wbGljaXQodHkpICAgICAgICAgICAgICAgICAgICAgICAgICBTV0lHX1B5dGhvbl9DaGVja0ltcGxpY2l0KHR5KQorI2RlZmluZSBTV0lHX0FjcXVpcmVQdHIocHRyLCBzcmMpICAgICAgICAgICAgICAgICAgICAgICBTV0lHX1B5dGhvbl9BY3F1aXJlUHRyKHB0ciwgc3JjKQorI2RlZmluZSBzd2lnX293bnR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQKKworLyogZm9yIHJhdyBwYWNrZWQgZGF0YSAqLworI2RlZmluZSBTV0lHX0NvbnZlcnRQYWNrZWQob2JqLCBwdHIsIHN6LCB0eSkgICAgICAgICAgICBTV0lHX1B5dGhvbl9Db252ZXJ0UGFja2VkKG9iaiwgcHRyLCBzeiwgdHkpCisjZGVmaW5lIFNXSUdfTmV3UGFja2VkT2JqKHB0ciwgc3osIHR5cGUpICAgICAgICAgICAgICAgIFNXSUdfUHl0aG9uX05ld1BhY2tlZE9iaihwdHIsIHN6LCB0eXBlKQorCisvKiBmb3IgY2xhc3Mgb3Igc3RydWN0IHBvaW50ZXJzICovCisjZGVmaW5lIFNXSUdfQ29udmVydEluc3RhbmNlKG9iaiwgcHB0ciwgdHlwZSwgZmxhZ3MpICAgIFNXSUdfQ29udmVydFB0cihvYmosIHBwdHIsIHR5cGUsIGZsYWdzKQorI2RlZmluZSBTV0lHX05ld0luc3RhbmNlT2JqKHB0ciwgdHlwZSwgZmxhZ3MpICAgICAgICAgICBTV0lHX05ld1BvaW50ZXJPYmoocHRyLCB0eXBlLCBmbGFncykKKworLyogZm9yIEMgb3IgQysrIGZ1bmN0aW9uIHBvaW50ZXJzICovCisjZGVmaW5lIFNXSUdfQ29udmVydEZ1bmN0aW9uUHRyKG9iaiwgcHB0ciwgdHlwZSkgICAgICAgIFNXSUdfUHl0aG9uX0NvbnZlcnRGdW5jdGlvblB0cihvYmosIHBwdHIsIHR5cGUpCisjZGVmaW5lIFNXSUdfTmV3RnVuY3Rpb25QdHJPYmoocHRyLCB0eXBlKSAgICAgICAgICAgICAgIFNXSUdfUHl0aG9uX05ld1BvaW50ZXJPYmooTlVMTCwgcHRyLCB0eXBlLCAwKQorCisvKiBmb3IgQysrIG1lbWJlciBwb2ludGVycywgaWUsIG1lbWJlciBtZXRob2RzICovCisjZGVmaW5lIFNXSUdfQ29udmVydE1lbWJlcihvYmosIHB0ciwgc3osIHR5KSAgICAgICAgICAgIFNXSUdfUHl0aG9uX0NvbnZlcnRQYWNrZWQob2JqLCBwdHIsIHN6LCB0eSkKKyNkZWZpbmUgU1dJR19OZXdNZW1iZXJPYmoocHRyLCBzeiwgdHlwZSkgICAgICAgICAgICAgICAgU1dJR19QeXRob25fTmV3UGFja2VkT2JqKHB0ciwgc3osIHR5cGUpCisKKworLyogUnVudGltZSBBUEkgKi8KKworI2RlZmluZSBTV0lHX0dldE1vZHVsZShjbGllbnRkYXRhKSAgICAgICAgICAgICAgICAgICAgICBTV0lHX1B5dGhvbl9HZXRNb2R1bGUoKQorI2RlZmluZSBTV0lHX1NldE1vZHVsZShjbGllbnRkYXRhLCBwb2ludGVyKSAgICAgICAgICAgICBTV0lHX1B5dGhvbl9TZXRNb2R1bGUocG9pbnRlcikKKyNkZWZpbmUgU1dJR19OZXdDbGllbnREYXRhKG9iaikgICAgICAgICAgICAgICAgICAgICAgICAgU3dpZ1B5Q2xpZW50RGF0YV9OZXcob2JqKQorCisjZGVmaW5lIFNXSUdfU2V0RXJyb3JPYmogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNXSUdfUHl0aG9uX1NldEVycm9yT2JqCisjZGVmaW5lIFNXSUdfU2V0RXJyb3JNc2cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNXSUdfUHl0aG9uX1NldEVycm9yTXNnCisjZGVmaW5lIFNXSUdfRXJyb3JUeXBlKGNvZGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNXSUdfUHl0aG9uX0Vycm9yVHlwZShjb2RlKQorI2RlZmluZSBTV0lHX0Vycm9yKGNvZGUsIG1zZykgICAgICAgICAgICAgICAgICAgICAgICAgICBTV0lHX1B5dGhvbl9TZXRFcnJvck1zZyhTV0lHX0Vycm9yVHlwZShjb2RlKSwgbXNnKQorI2RlZmluZSBTV0lHX2ZhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWwKKworCisvKiBSdW50aW1lIEFQSSBpbXBsZW1lbnRhdGlvbiAqLworCisvKiBFcnJvciBtYW5pcHVsYXRpb24gKi8KKworU1dJR0lOVEVSTiB2b2lkCitTV0lHX1B5dGhvbl9TZXRFcnJvck9iaihQeU9iamVjdCAqZXJydHlwZSwgUHlPYmplY3QgKm9iaikgeworICBTV0lHX1BZVEhPTl9USFJFQURfQkVHSU5fQkxPQ0s7CisgIFB5RXJyX1NldE9iamVjdChlcnJ0eXBlLCBvYmopOworICBQeV9ERUNSRUYob2JqKTsKKyAgU1dJR19QWVRIT05fVEhSRUFEX0VORF9CTE9DSzsKK30KKworU1dJR0lOVEVSTiB2b2lkCitTV0lHX1B5dGhvbl9TZXRFcnJvck1zZyhQeU9iamVjdCAqZXJydHlwZSwgY29uc3QgY2hhciAqbXNnKSB7CisgIFNXSUdfUFlUSE9OX1RIUkVBRF9CRUdJTl9CTE9DSzsKKyAgUHlFcnJfU2V0U3RyaW5nKGVycnR5cGUsIChjaGFyICopIG1zZyk7CisgIFNXSUdfUFlUSE9OX1RIUkVBRF9FTkRfQkxPQ0s7Cit9CisKKyNkZWZpbmUgU1dJR19QeXRob25fUmFpc2Uob2JqLCB0eXBlLCBkZXNjKSAgU1dJR19QeXRob25fU2V0RXJyb3JPYmooU1dJR19QeXRob25fRXhjZXB0aW9uVHlwZShkZXNjKSwgb2JqKQorCisvKiBTZXQgYSBjb25zdGFudCB2YWx1ZSAqLworCisjaWYgZGVmaW5lZChTV0lHUFlUSE9OX0JVSUxUSU4pCisKK1NXSUdJTlRFUk4gdm9pZAorU3dpZ1B5QnVpbHRpbl9BZGRQdWJsaWNTeW1ib2woUHlPYmplY3QgKnNlcSwgY29uc3QgY2hhciAqa2V5KSB7CisgIFB5T2JqZWN0ICpzID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZyhrZXkpOworICBQeUxpc3RfQXBwZW5kKHNlcSwgcyk7CisgIFB5X0RFQ1JFRihzKTsKK30KKworU1dJR0lOVEVSTiB2b2lkCitTV0lHX1B5dGhvbl9TZXRDb25zdGFudChQeU9iamVjdCAqZCwgUHlPYmplY3QgKnB1YmxpY19pbnRlcmZhY2UsIGNvbnN0IGNoYXIgKm5hbWUsIFB5T2JqZWN0ICpvYmopIHsKKyAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgKGNoYXIgKiluYW1lLCBvYmopOworICBQeV9ERUNSRUYob2JqKTsKKyAgaWYgKHB1YmxpY19pbnRlcmZhY2UpCisgICAgU3dpZ1B5QnVpbHRpbl9BZGRQdWJsaWNTeW1ib2wocHVibGljX2ludGVyZmFjZSwgbmFtZSk7Cit9CisKKyNlbHNlCisKK1NXSUdJTlRFUk4gdm9pZAorU1dJR19QeXRob25fU2V0Q29uc3RhbnQoUHlPYmplY3QgKmQsIGNvbnN0IGNoYXIgKm5hbWUsIFB5T2JqZWN0ICpvYmopIHsKKyAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgKGNoYXIgKiluYW1lLCBvYmopOworICBQeV9ERUNSRUYob2JqKTsKK30KKworI2VuZGlmCisKKy8qIEFwcGVuZCBhIHZhbHVlIHRvIHRoZSByZXN1bHQgb2JqICovCisKK1NXSUdJTlRFUk4gUHlPYmplY3QqCitTV0lHX1B5dGhvbl9BcHBlbmRPdXRwdXQoUHlPYmplY3QqIHJlc3VsdCwgUHlPYmplY3QqIG9iaikgeworI2lmICFkZWZpbmVkKFNXSUdfUFlUSE9OX09VVFBVVF9UVVBMRSkKKyAgaWYgKCFyZXN1bHQpIHsKKyAgICByZXN1bHQgPSBvYmo7CisgIH0gZWxzZSBpZiAocmVzdWx0ID09IFB5X05vbmUpIHsKKyAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICByZXN1bHQgPSBvYmo7CisgIH0gZWxzZSB7CisgICAgaWYgKCFQeUxpc3RfQ2hlY2socmVzdWx0KSkgeworICAgICAgUHlPYmplY3QgKm8yID0gcmVzdWx0OworICAgICAgcmVzdWx0ID0gUHlMaXN0X05ldygxKTsKKyAgICAgIFB5TGlzdF9TZXRJdGVtKHJlc3VsdCwgMCwgbzIpOworICAgIH0KKyAgICBQeUxpc3RfQXBwZW5kKHJlc3VsdCxvYmopOworICAgIFB5X0RFQ1JFRihvYmopOworICB9CisgIHJldHVybiByZXN1bHQ7CisjZWxzZQorICBQeU9iamVjdCogICBvMjsKKyAgUHlPYmplY3QqICAgbzM7CisgIGlmICghcmVzdWx0KSB7CisgICAgcmVzdWx0ID0gb2JqOworICB9IGVsc2UgaWYgKHJlc3VsdCA9PSBQeV9Ob25lKSB7CisgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgcmVzdWx0ID0gb2JqOworICB9IGVsc2UgeworICAgIGlmICghUHlUdXBsZV9DaGVjayhyZXN1bHQpKSB7CisgICAgICBvMiA9IHJlc3VsdDsKKyAgICAgIHJlc3VsdCA9IFB5VHVwbGVfTmV3KDEpOworICAgICAgUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIDAsIG8yKTsKKyAgICB9CisgICAgbzMgPSBQeVR1cGxlX05ldygxKTsKKyAgICBQeVR1cGxlX1NFVF9JVEVNKG8zLCAwLCBvYmopOworICAgIG8yID0gcmVzdWx0OworICAgIHJlc3VsdCA9IFB5U2VxdWVuY2VfQ29uY2F0KG8yLCBvMyk7CisgICAgUHlfREVDUkVGKG8yKTsKKyAgICBQeV9ERUNSRUYobzMpOworICB9CisgIHJldHVybiByZXN1bHQ7CisjZW5kaWYKK30KKworLyogVW5wYWNrIHRoZSBhcmd1bWVudCB0dXBsZSAqLworCitTV0lHSU5URVJOIGludAorU1dJR19QeXRob25fVW5wYWNrVHVwbGUoUHlPYmplY3QgKmFyZ3MsIGNvbnN0IGNoYXIgKm5hbWUsIFB5X3NzaXplX3QgbWluLCBQeV9zc2l6ZV90IG1heCwgUHlPYmplY3QgKipvYmpzKQoreworICBpZiAoIWFyZ3MpIHsKKyAgICBpZiAoIW1pbiAmJiAhbWF4KSB7CisgICAgICByZXR1cm4gMTsKKyAgICB9IGVsc2UgeworICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIiVzIGV4cGVjdGVkICVzJWQgYXJndW1lbnRzLCBnb3Qgbm9uZSIsCisgICAgICAgICAgICAgICAgICAgbmFtZSwgKG1pbiA9PSBtYXggPyAiIiA6ICJhdCBsZWFzdCAiKSwgKGludCltaW4pOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisgIGlmICghUHlUdXBsZV9DaGVjayhhcmdzKSkgeworICAgIGlmIChtaW4gPD0gMSAmJiBtYXggPj0gMSkgeworICAgICAgcmVnaXN0ZXIgaW50IGk7CisgICAgICBvYmpzWzBdID0gYXJnczsKKyAgICAgIGZvciAoaSA9IDE7IGkgPCBtYXg7ICsraSkgeworICAgICAgICBvYmpzW2ldID0gMDsKKyAgICAgIH0KKyAgICAgIHJldHVybiAyOworICAgIH0KKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsICJVbnBhY2tUdXBsZSgpIGFyZ3VtZW50IGxpc3QgaXMgbm90IGEgdHVwbGUiKTsKKyAgICByZXR1cm4gMDsKKyAgfSBlbHNlIHsKKyAgICByZWdpc3RlciBQeV9zc2l6ZV90IGwgPSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpOworICAgIGlmIChsIDwgbWluKSB7CisgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiJXMgZXhwZWN0ZWQgJXMlZCBhcmd1bWVudHMsIGdvdCAlZCIsCisgICAgICAgICAgICAgICAgICAgbmFtZSwgKG1pbiA9PSBtYXggPyAiIiA6ICJhdCBsZWFzdCAiKSwgKGludCltaW4sIChpbnQpbCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgaWYgKGwgPiBtYXgpIHsKKyAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICIlcyBleHBlY3RlZCAlcyVkIGFyZ3VtZW50cywgZ290ICVkIiwKKyAgICAgICAgICAgICAgICAgICBuYW1lLCAobWluID09IG1heCA/ICIiIDogImF0IG1vc3QgIiksIChpbnQpbWF4LCAoaW50KWwpOworICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlZ2lzdGVyIGludCBpOworICAgICAgZm9yIChpID0gMDsgaSA8IGw7ICsraSkgeworICAgICAgICBvYmpzW2ldID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKTsKKyAgICAgIH0KKyAgICAgIGZvciAoOyBsIDwgbWF4OyArK2wpIHsKKyAgICAgICAgb2Jqc1tsXSA9IDA7CisgICAgICB9CisgICAgICByZXR1cm4gaSArIDE7CisgICAgfQorICB9Cit9CisKKy8qIEEgZnVuY3RvciBpcyBhIGZ1bmN0aW9uIG9iamVjdCB3aXRoIG9uZSBzaW5nbGUgb2JqZWN0IGFyZ3VtZW50ICovCisjaWYgUFlfVkVSU0lPTl9IRVggPj0gMHgwMjAyMDAwMAorI2RlZmluZSBTV0lHX1B5dGhvbl9DYWxsRnVuY3RvcihmdW5jdG9yLCBvYmopICAgICAgICAgICBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGZ1bmN0b3IsIG9iaiwgTlVMTCk7CisjZWxzZQorI2RlZmluZSBTV0lHX1B5dGhvbl9DYWxsRnVuY3RvcihmdW5jdG9yLCBvYmopICAgICAgICAgICBQeU9iamVjdF9DYWxsRnVuY3Rpb24oZnVuY3RvciwgIk8iLCBvYmopOworI2VuZGlmCisKKy8qCisgIEhlbHBlciBmb3Igc3RhdGljIHBvaW50ZXIgaW5pdGlhbGl6YXRpb24gZm9yIGJvdGggQyBhbmQgQysrIGNvZGUsIGZvciBleGFtcGxlCisgIHN0YXRpYyBQeU9iamVjdCAqU1dJR19TVEFUSUNfUE9JTlRFUihNeVZhcikgPSBOZXdTb21ldGhpbmcoLi4uKTsKKyovCisjaWZkZWYgX19jcGx1c3BsdXMKKyNkZWZpbmUgU1dJR19TVEFUSUNfUE9JTlRFUih2YXIpICB2YXIKKyNlbHNlCisjZGVmaW5lIFNXSUdfU1RBVElDX1BPSU5URVIodmFyKSAgdmFyID0gMDsgaWYgKCF2YXIpIHZhcgorI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQb2ludGVyIGRlY2xhcmF0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogRmxhZ3MgZm9yIG5ldyBwb2ludGVyIG9iamVjdHMgKi8KKyNkZWZpbmUgU1dJR19QT0lOVEVSX05PU0hBRE9XICAgICAgIChTV0lHX1BPSU5URVJfT1dOICAgICAgPDwgMSkKKyNkZWZpbmUgU1dJR19QT0lOVEVSX05FVyAgICAgICAgICAgIChTV0lHX1BPSU5URVJfTk9TSEFET1cgfCBTV0lHX1BPSU5URVJfT1dOKQorCisjZGVmaW5lIFNXSUdfUE9JTlRFUl9JTVBMSUNJVF9DT05WICAoU1dJR19QT0lOVEVSX0RJU09XTiAgIDw8IDEpCisKKyNkZWZpbmUgU1dJR19CVUlMVElOX1RQX0lOSVQgICAgICAgIChTV0lHX1BPSU5URVJfT1dOIDw8IDIpCisjZGVmaW5lIFNXSUdfQlVJTFRJTl9JTklUICAgICAgICAgICAoU1dJR19CVUlMVElOX1RQX0lOSVQgfCBTV0lHX1BPSU5URVJfT1dOKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qICBIb3cgdG8gYWNjZXNzIFB5X05vbmUgKi8KKyNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfX1dJTjMyX18pIHx8IGRlZmluZWQoX19DWUdXSU5fXykKKyMgIGlmbmRlZiBTV0lHX1BZVEhPTl9OT19CVUlMRF9OT05FCisjICAgIGlmbmRlZiBTV0lHX1BZVEhPTl9CVUlMRF9OT05FCisjICAgICAgZGVmaW5lIFNXSUdfUFlUSE9OX0JVSUxEX05PTkUKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIFNXSUdfUFlUSE9OX0JVSUxEX05PTkUKKyMgIGlmZGVmIFB5X05vbmUKKyMgICB1bmRlZiBQeV9Ob25lCisjICAgZGVmaW5lIFB5X05vbmUgU1dJR19QeV9Ob25lKCkKKyMgIGVuZGlmCitTV0lHUlVOVElNRUlOTElORSBQeU9iamVjdCAqCitfU1dJR19QeV9Ob25lKHZvaWQpCit7CisgIFB5T2JqZWN0ICpub25lID0gUHlfQnVpbGRWYWx1ZSgoY2hhciopIiIpOworICBQeV9ERUNSRUYobm9uZSk7CisgIHJldHVybiBub25lOworfQorU1dJR1JVTlRJTUUgUHlPYmplY3QgKgorU1dJR19QeV9Ob25lKHZvaWQpCit7CisgIHN0YXRpYyBQeU9iamVjdCAqU1dJR19TVEFUSUNfUE9JTlRFUihub25lKSA9IF9TV0lHX1B5X05vbmUoKTsKKyAgcmV0dXJuIG5vbmU7Cit9CisjZW5kaWYKKworLyogVGhlIHB5dGhvbiB2b2lkIHJldHVybiB2YWx1ZSAqLworCitTV0lHUlVOVElNRUlOTElORSBQeU9iamVjdCAqCitTV0lHX1B5X1ZvaWQodm9pZCkKK3sKKyAgUHlPYmplY3QgKm5vbmUgPSBQeV9Ob25lOworICBQeV9JTkNSRUYobm9uZSk7CisgIHJldHVybiBub25lOworfQorCisvKiBTd2lnUHlDbGllbnREYXRhICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgUHlPYmplY3QgKmtsYXNzOworICBQeU9iamVjdCAqbmV3cmF3OworICBQeU9iamVjdCAqbmV3YXJnczsKKyAgUHlPYmplY3QgKmRlc3Ryb3k7CisgIGludCBkZWxhcmdzOworICBpbnQgaW1wbGljaXRjb252OworICBQeVR5cGVPYmplY3QgKnB5dHlwZTsKK30gU3dpZ1B5Q2xpZW50RGF0YTsKKworU1dJR1JVTlRJTUVJTkxJTkUgaW50CitTV0lHX1B5dGhvbl9DaGVja0ltcGxpY2l0KHN3aWdfdHlwZV9pbmZvICp0eSkKK3sKKyAgU3dpZ1B5Q2xpZW50RGF0YSAqZGF0YSA9IChTd2lnUHlDbGllbnREYXRhICopdHktPmNsaWVudGRhdGE7CisgIHJldHVybiBkYXRhID8gZGF0YS0+aW1wbGljaXRjb252IDogMDsKK30KKworU1dJR1JVTlRJTUVJTkxJTkUgUHlPYmplY3QgKgorU1dJR19QeXRob25fRXhjZXB0aW9uVHlwZShzd2lnX3R5cGVfaW5mbyAqZGVzYykgeworICBTd2lnUHlDbGllbnREYXRhICpkYXRhID0gZGVzYyA/IChTd2lnUHlDbGllbnREYXRhICopIGRlc2MtPmNsaWVudGRhdGEgOiAwOworICBQeU9iamVjdCAqa2xhc3MgPSBkYXRhID8gZGF0YS0+a2xhc3MgOiAwOworICByZXR1cm4gKGtsYXNzID8ga2xhc3MgOiBQeUV4Y19SdW50aW1lRXJyb3IpOworfQorCisKK1NXSUdSVU5USU1FIFN3aWdQeUNsaWVudERhdGEgKgorU3dpZ1B5Q2xpZW50RGF0YV9OZXcoUHlPYmplY3QqIG9iaikKK3sKKyAgaWYgKCFvYmopIHsKKyAgICByZXR1cm4gMDsKKyAgfSBlbHNlIHsKKyAgICBTd2lnUHlDbGllbnREYXRhICpkYXRhID0gKFN3aWdQeUNsaWVudERhdGEgKiltYWxsb2Moc2l6ZW9mKFN3aWdQeUNsaWVudERhdGEpKTsKKyAgICAvKiB0aGUga2xhc3MgZWxlbWVudCAqLworICAgIGRhdGEtPmtsYXNzID0gb2JqOworICAgIFB5X0lOQ1JFRihkYXRhLT5rbGFzcyk7CisgICAgLyogdGhlIG5ld3JhdyBtZXRob2QgYW5kIG5ld2FyZ3MgYXJndW1lbnRzIHVzZWQgdG8gY3JlYXRlIGEgbmV3IHJhdyBpbnN0YW5jZSAqLworICAgIGlmIChQeUNsYXNzX0NoZWNrKG9iaikpIHsKKyAgICAgIGRhdGEtPm5ld3JhdyA9IDA7CisgICAgICBkYXRhLT5uZXdhcmdzID0gb2JqOworICAgICAgUHlfSU5DUkVGKG9iaik7CisgICAgfSBlbHNlIHsKKyNpZiAoUFlfVkVSU0lPTl9IRVggPCAweDAyMDIwMDAwKQorICAgICAgZGF0YS0+bmV3cmF3ID0gMDsKKyNlbHNlCisgICAgICBkYXRhLT5uZXdyYXcgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGRhdGEtPmtsYXNzLCAoY2hhciAqKSJfX25ld19fIik7CisjZW5kaWYKKyAgICAgIGlmIChkYXRhLT5uZXdyYXcpIHsKKyAgICAgICAgUHlfSU5DUkVGKGRhdGEtPm5ld3Jhdyk7CisgICAgICAgIGRhdGEtPm5ld2FyZ3MgPSBQeVR1cGxlX05ldygxKTsKKyAgICAgICAgUHlUdXBsZV9TZXRJdGVtKGRhdGEtPm5ld2FyZ3MsIDAsIG9iaik7CisgICAgICB9IGVsc2UgeworICAgICAgICBkYXRhLT5uZXdhcmdzID0gb2JqOworICAgICAgfQorICAgICAgUHlfSU5DUkVGKGRhdGEtPm5ld2FyZ3MpOworICAgIH0KKyAgICAvKiB0aGUgZGVzdHJveSBtZXRob2QsIGFrYSBhcyB0aGUgQysrIGRlbGV0ZSBtZXRob2QgKi8KKyAgICBkYXRhLT5kZXN0cm95ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhkYXRhLT5rbGFzcywgKGNoYXIgKikiX19zd2lnX2Rlc3Ryb3lfXyIpOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICBQeUVycl9DbGVhcigpOworICAgICAgZGF0YS0+ZGVzdHJveSA9IDA7CisgICAgfQorICAgIGlmIChkYXRhLT5kZXN0cm95KSB7CisgICAgICBpbnQgZmxhZ3M7CisgICAgICBQeV9JTkNSRUYoZGF0YS0+ZGVzdHJveSk7CisgICAgICBmbGFncyA9IFB5Q0Z1bmN0aW9uX0dFVF9GTEFHUyhkYXRhLT5kZXN0cm95KTsKKyNpZmRlZiBNRVRIX08KKyAgICAgIGRhdGEtPmRlbGFyZ3MgPSAhKGZsYWdzICYgKE1FVEhfTykpOworI2Vsc2UKKyAgICAgIGRhdGEtPmRlbGFyZ3MgPSAwOworI2VuZGlmCisgICAgfSBlbHNlIHsKKyAgICAgIGRhdGEtPmRlbGFyZ3MgPSAwOworICAgIH0KKyAgICBkYXRhLT5pbXBsaWNpdGNvbnYgPSAwOworICAgIGRhdGEtPnB5dHlwZSA9IDA7CisgICAgcmV0dXJuIGRhdGE7CisgIH0KK30KKworU1dJR1JVTlRJTUUgdm9pZAorU3dpZ1B5Q2xpZW50RGF0YV9EZWwoU3dpZ1B5Q2xpZW50RGF0YSAqZGF0YSkgeworICBQeV9YREVDUkVGKGRhdGEtPm5ld3Jhdyk7CisgIFB5X1hERUNSRUYoZGF0YS0+bmV3YXJncyk7CisgIFB5X1hERUNSRUYoZGF0YS0+ZGVzdHJveSk7Cit9CisKKy8qID09PT09PT09PT09PT09PSBTd2lnUHlPYmplY3QgPT09PT09PT09PT09PT09PT09PT09Ki8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBQeU9iamVjdF9IRUFECisgIHZvaWQgKnB0cjsKKyAgc3dpZ190eXBlX2luZm8gKnR5OworICBpbnQgb3duOworICBQeU9iamVjdCAqbmV4dDsKKyNpZmRlZiBTV0lHUFlUSE9OX0JVSUxUSU4KKyAgUHlPYmplY3QgKmRpY3Q7CisjZW5kaWYKK30gU3dpZ1B5T2JqZWN0OworCitTV0lHUlVOVElNRSBQeU9iamVjdCAqCitTd2lnUHlPYmplY3RfbG9uZyhTd2lnUHlPYmplY3QgKnYpCit7CisgIHJldHVybiBQeUxvbmdfRnJvbVZvaWRQdHIodi0+cHRyKTsKK30KKworU1dJR1JVTlRJTUUgUHlPYmplY3QgKgorU3dpZ1B5T2JqZWN0X2Zvcm1hdChjb25zdCBjaGFyKiBmbXQsIFN3aWdQeU9iamVjdCAqdikKK3sKKyAgUHlPYmplY3QgKnJlcyA9IE5VTEw7CisgIFB5T2JqZWN0ICphcmdzID0gUHlUdXBsZV9OZXcoMSk7CisgIGlmIChhcmdzKSB7CisgICAgaWYgKFB5VHVwbGVfU2V0SXRlbShhcmdzLCAwLCBTd2lnUHlPYmplY3RfbG9uZyh2KSkgPT0gMCkgeworICAgICAgUHlPYmplY3QgKm9mbXQgPSBTV0lHX1B5dGhvbl9zdHJfRnJvbUNoYXIoZm10KTsKKyAgICAgIGlmIChvZm10KSB7CisjaWYgUFlfVkVSU0lPTl9IRVggPj0gMHgwMzAwMDAwMAorICAgICAgICByZXMgPSBQeVVuaWNvZGVfRm9ybWF0KG9mbXQsYXJncyk7CisjZWxzZQorICAgICAgICByZXMgPSBQeVN0cmluZ19Gb3JtYXQob2ZtdCxhcmdzKTsKKyNlbmRpZgorICAgICAgICBQeV9ERUNSRUYob2ZtdCk7CisgICAgICB9CisgICAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgfQorICB9CisgIHJldHVybiByZXM7Cit9CisKK1NXSUdSVU5USU1FIFB5T2JqZWN0ICoKK1N3aWdQeU9iamVjdF9vY3QoU3dpZ1B5T2JqZWN0ICp2KQoreworICByZXR1cm4gU3dpZ1B5T2JqZWN0X2Zvcm1hdCgiJW8iLHYpOworfQorCitTV0lHUlVOVElNRSBQeU9iamVjdCAqCitTd2lnUHlPYmplY3RfaGV4KFN3aWdQeU9iamVjdCAqdikKK3sKKyAgcmV0dXJuIFN3aWdQeU9iamVjdF9mb3JtYXQoIiV4Iix2KTsKK30KKworU1dJR1JVTlRJTUUgUHlPYmplY3QgKgorI2lmZGVmIE1FVEhfTk9BUkdTCitTd2lnUHlPYmplY3RfcmVwcihTd2lnUHlPYmplY3QgKnYpCisjZWxzZQorU3dpZ1B5T2JqZWN0X3JlcHIoU3dpZ1B5T2JqZWN0ICp2LCBQeU9iamVjdCAqYXJncykKKyNlbmRpZgoreworICBjb25zdCBjaGFyICpuYW1lID0gU1dJR19UeXBlUHJldHR5TmFtZSh2LT50eSk7CisgIFB5T2JqZWN0ICpyZXByID0gU1dJR19QeXRob25fc3RyX0Zyb21Gb3JtYXQoIjxTd2lnIE9iamVjdCBvZiB0eXBlICclcycgYXQgJXA+IiwgbmFtZSwgKHZvaWQgKil2KTsKKyAgaWYgKHYtPm5leHQpIHsKKyMgaWZkZWYgTUVUSF9OT0FSR1MKKyAgICBQeU9iamVjdCAqbnJlcCA9IFN3aWdQeU9iamVjdF9yZXByKChTd2lnUHlPYmplY3QgKil2LT5uZXh0KTsKKyMgZWxzZQorICAgIFB5T2JqZWN0ICpucmVwID0gU3dpZ1B5T2JqZWN0X3JlcHIoKFN3aWdQeU9iamVjdCAqKXYtPm5leHQsIGFyZ3MpOworIyBlbmRpZgorIyBpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAzMDAwMDAwCisgICAgUHlPYmplY3QgKmpvaW5lZCA9IFB5VW5pY29kZV9Db25jYXQocmVwciwgbnJlcCk7CisgICAgUHlfRGVjUmVmKHJlcHIpOworICAgIFB5X0RlY1JlZihucmVwKTsKKyAgICByZXByID0gam9pbmVkOworIyBlbHNlCisgICAgUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZyZXByLG5yZXApOworIyBlbmRpZgorICB9CisgIHJldHVybiByZXByOworfQorCitTV0lHUlVOVElNRSBpbnQKK1N3aWdQeU9iamVjdF9wcmludChTd2lnUHlPYmplY3QgKnYsIEZJTEUgKmZwLCBpbnQgU1dJR1VOVVNFRFBBUk0oZmxhZ3MpKQoreworICBjaGFyICpzdHI7CisjaWZkZWYgTUVUSF9OT0FSR1MKKyAgUHlPYmplY3QgKnJlcHIgPSBTd2lnUHlPYmplY3RfcmVwcih2KTsKKyNlbHNlCisgIFB5T2JqZWN0ICpyZXByID0gU3dpZ1B5T2JqZWN0X3JlcHIodiwgTlVMTCk7CisjZW5kaWYKKyAgaWYgKHJlcHIpIHsKKyAgICBzdHIgPSBTV0lHX1B5dGhvbl9zdHJfQXNDaGFyKHJlcHIpOworICAgIGZwdXRzKHN0ciwgZnApOworICAgIFNXSUdfUHl0aG9uX3N0cl9EZWxGb3JQeTMoc3RyKTsKKyAgICBQeV9ERUNSRUYocmVwcik7CisgICAgcmV0dXJuIDA7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIDE7CisgIH0KK30KKworU1dJR1JVTlRJTUUgUHlPYmplY3QgKgorU3dpZ1B5T2JqZWN0X3N0cihTd2lnUHlPYmplY3QgKnYpCit7CisgIGNoYXIgcmVzdWx0W1NXSUdfQlVGRkVSX1NJWkVdOworICByZXR1cm4gU1dJR19QYWNrVm9pZFB0cihyZXN1bHQsIHYtPnB0ciwgdi0+dHktPm5hbWUsIHNpemVvZihyZXN1bHQpKSA/CisgICAgU1dJR19QeXRob25fc3RyX0Zyb21DaGFyKHJlc3VsdCkgOiAwOworfQorCitTV0lHUlVOVElNRSBpbnQKK1N3aWdQeU9iamVjdF9jb21wYXJlKFN3aWdQeU9iamVjdCAqdiwgU3dpZ1B5T2JqZWN0ICp3KQoreworICB2b2lkICppID0gdi0+cHRyOworICB2b2lkICpqID0gdy0+cHRyOworICByZXR1cm4gKGkgPCBqKSA/IC0xIDogKChpID4gaikgPyAxIDogMCk7Cit9CisKKy8qIEFkZGVkIGZvciBQeXRob24gMy54LCB3b3VsZCBpdCBhbHNvIGJlIHVzZWZ1bCBmb3IgUHl0aG9uIDIueD8gKi8KK1NXSUdSVU5USU1FIFB5T2JqZWN0KgorU3dpZ1B5T2JqZWN0X3JpY2hjb21wYXJlKFN3aWdQeU9iamVjdCAqdiwgU3dpZ1B5T2JqZWN0ICp3LCBpbnQgb3ApCit7CisgIFB5T2JqZWN0KiByZXM7CisgIGlmKCBvcCAhPSBQeV9FUSAmJiBvcCAhPSBQeV9ORSApIHsKKyAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgfQorICByZXMgPSBQeUJvb2xfRnJvbUxvbmcoIChTd2lnUHlPYmplY3RfY29tcGFyZSh2LCB3KT09MCkgPT0gKG9wID09IFB5X0VRKSA/IDEgOiAwKTsKKyAgcmV0dXJuIHJlczsKK30KKworCitTV0lHUlVOVElNRSBQeVR5cGVPYmplY3QqIFN3aWdQeU9iamVjdF9UeXBlT25jZSh2b2lkKTsKKworI2lmZGVmIFNXSUdQWVRIT05fQlVJTFRJTgorc3RhdGljIHN3aWdfdHlwZV9pbmZvICpTd2lnUHlPYmplY3Rfc3R5cGUgPSAwOworU1dJR1JVTlRJTUUgUHlUeXBlT2JqZWN0KgorU3dpZ1B5T2JqZWN0X3R5cGUodm9pZCkgeworICAgIFN3aWdQeUNsaWVudERhdGEgKmNkOworICAgIGFzc2VydChTd2lnUHlPYmplY3Rfc3R5cGUpOworICAgIGNkID0gKFN3aWdQeUNsaWVudERhdGEqKSBTd2lnUHlPYmplY3Rfc3R5cGUtPmNsaWVudGRhdGE7CisgICAgYXNzZXJ0KGNkKTsKKyAgICBhc3NlcnQoY2QtPnB5dHlwZSk7CisgICAgcmV0dXJuIGNkLT5weXR5cGU7Cit9CisjZWxzZQorU1dJR1JVTlRJTUUgUHlUeXBlT2JqZWN0KgorU3dpZ1B5T2JqZWN0X3R5cGUodm9pZCkgeworICBzdGF0aWMgUHlUeXBlT2JqZWN0ICpTV0lHX1NUQVRJQ19QT0lOVEVSKHR5cGUpID0gU3dpZ1B5T2JqZWN0X1R5cGVPbmNlKCk7CisgIHJldHVybiB0eXBlOworfQorI2VuZGlmCisKK1NXSUdSVU5USU1FSU5MSU5FIGludAorU3dpZ1B5T2JqZWN0X0NoZWNrKFB5T2JqZWN0ICpvcCkgeworI2lmZGVmIFNXSUdQWVRIT05fQlVJTFRJTgorICBQeVR5cGVPYmplY3QgKnRhcmdldF90cCA9IFN3aWdQeU9iamVjdF90eXBlKCk7CisgIGlmIChQeVR5cGVfSXNTdWJ0eXBlKG9wLT5vYl90eXBlLCB0YXJnZXRfdHApKQorICAgIHJldHVybiAxOworICByZXR1cm4gKHN0cmNtcChvcC0+b2JfdHlwZS0+dHBfbmFtZSwgIlN3aWdQeU9iamVjdCIpID09IDApOworI2Vsc2UKKyAgcmV0dXJuIChQeV9UWVBFKG9wKSA9PSBTd2lnUHlPYmplY3RfdHlwZSgpKQorICAgIHx8IChzdHJjbXAoUHlfVFlQRShvcCktPnRwX25hbWUsIlN3aWdQeU9iamVjdCIpID09IDApOworI2VuZGlmCit9CisKK1NXSUdSVU5USU1FIFB5T2JqZWN0ICoKK1N3aWdQeU9iamVjdF9OZXcodm9pZCAqcHRyLCBzd2lnX3R5cGVfaW5mbyAqdHksIGludCBvd24pOworCitTV0lHUlVOVElNRSB2b2lkCitTd2lnUHlPYmplY3RfZGVhbGxvYyhQeU9iamVjdCAqdikKK3sKKyAgU3dpZ1B5T2JqZWN0ICpzb2JqID0gKFN3aWdQeU9iamVjdCAqKSB2OworICBQeU9iamVjdCAqbmV4dCA9IHNvYmotPm5leHQ7CisgIGlmIChzb2JqLT5vd24gPT0gU1dJR19QT0lOVEVSX09XTikgeworICAgIHN3aWdfdHlwZV9pbmZvICp0eSA9IHNvYmotPnR5OworICAgIFN3aWdQeUNsaWVudERhdGEgKmRhdGEgPSB0eSA/IChTd2lnUHlDbGllbnREYXRhICopIHR5LT5jbGllbnRkYXRhIDogMDsKKyAgICBQeU9iamVjdCAqZGVzdHJveSA9IGRhdGEgPyBkYXRhLT5kZXN0cm95IDogMDsKKyAgICBpZiAoZGVzdHJveSkgeworICAgICAgLyogZGVzdHJveSBpcyBhbHdheXMgYSBWQVJBUkdTIG1ldGhvZCAqLworICAgICAgUHlPYmplY3QgKnJlczsKKyAgICAgIGlmIChkYXRhLT5kZWxhcmdzKSB7CisgICAgICAgIC8qIHdlIG5lZWQgdG8gY3JlYXRlIGEgdGVtcG9yYXJ5IG9iamVjdCB0byBjYXJyeSB0aGUgZGVzdHJveSBvcGVyYXRpb24gKi8KKyAgICAgICAgUHlPYmplY3QgKnRtcCA9IFN3aWdQeU9iamVjdF9OZXcoc29iai0+cHRyLCB0eSwgMCk7CisgICAgICAgIHJlcyA9IFNXSUdfUHl0aG9uX0NhbGxGdW5jdG9yKGRlc3Ryb3ksIHRtcCk7CisgICAgICAgIFB5X0RFQ1JFRih0bXApOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgUHlDRnVuY3Rpb24gbWV0aCA9IFB5Q0Z1bmN0aW9uX0dFVF9GVU5DVElPTihkZXN0cm95KTsKKyAgICAgICAgUHlPYmplY3QgKm1zZWxmID0gUHlDRnVuY3Rpb25fR0VUX1NFTEYoZGVzdHJveSk7CisgICAgICAgIHJlcyA9ICgoKm1ldGgpKG1zZWxmLCB2KSk7CisgICAgICB9CisgICAgICBQeV9YREVDUkVGKHJlcyk7CisgICAgfQorI2lmICFkZWZpbmVkKFNXSUdfUFlUSE9OX1NJTEVOVF9NRU1MRUFLKQorICAgIGVsc2UgeworICAgICAgY29uc3QgY2hhciAqbmFtZSA9IFNXSUdfVHlwZVByZXR0eU5hbWUodHkpOworICAgICAgcHJpbnRmKCJzd2lnL3B5dGhvbiBkZXRlY3RlZCBhIG1lbW9yeSBsZWFrIG9mIHR5cGUgJyVzJywgbm8gZGVzdHJ1Y3RvciBmb3VuZC5cbiIsIChuYW1lID8gbmFtZSA6ICJ1bmtub3duIikpOworICAgIH0KKyNlbmRpZgorICB9CisgIFB5X1hERUNSRUYobmV4dCk7CisgIFB5T2JqZWN0X0RFTCh2KTsKK30KKworU1dJR1JVTlRJTUUgUHlPYmplY3QqCitTd2lnUHlPYmplY3RfYXBwZW5kKFB5T2JqZWN0KiB2LCBQeU9iamVjdCogbmV4dCkKK3sKKyAgU3dpZ1B5T2JqZWN0ICpzb2JqID0gKFN3aWdQeU9iamVjdCAqKSB2OworI2lmbmRlZiBNRVRIX08KKyAgUHlPYmplY3QgKnRtcCA9IDA7CisgIGlmICghUHlBcmdfUGFyc2VUdXBsZShuZXh0LChjaGFyICopIk86YXBwZW5kIiwgJnRtcCkpIHJldHVybiBOVUxMOworICBuZXh0ID0gdG1wOworI2VuZGlmCisgIGlmICghU3dpZ1B5T2JqZWN0X0NoZWNrKG5leHQpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgc29iai0+bmV4dCA9IG5leHQ7CisgIFB5X0lOQ1JFRihuZXh0KTsKKyAgcmV0dXJuIFNXSUdfUHlfVm9pZCgpOworfQorCitTV0lHUlVOVElNRSBQeU9iamVjdCoKKyNpZmRlZiBNRVRIX05PQVJHUworU3dpZ1B5T2JqZWN0X25leHQoUHlPYmplY3QqIHYpCisjZWxzZQorU3dpZ1B5T2JqZWN0X25leHQoUHlPYmplY3QqIHYsIFB5T2JqZWN0ICpTV0lHVU5VU0VEUEFSTShhcmdzKSkKKyNlbmRpZgoreworICBTd2lnUHlPYmplY3QgKnNvYmogPSAoU3dpZ1B5T2JqZWN0ICopIHY7CisgIGlmIChzb2JqLT5uZXh0KSB7CisgICAgUHlfSU5DUkVGKHNvYmotPm5leHQpOworICAgIHJldHVybiBzb2JqLT5uZXh0OworICB9IGVsc2UgeworICAgIHJldHVybiBTV0lHX1B5X1ZvaWQoKTsKKyAgfQorfQorCitTV0lHSU5URVJOIFB5T2JqZWN0KgorI2lmZGVmIE1FVEhfTk9BUkdTCitTd2lnUHlPYmplY3RfZGlzb3duKFB5T2JqZWN0ICp2KQorI2Vsc2UKK1N3aWdQeU9iamVjdF9kaXNvd24oUHlPYmplY3QqIHYsIFB5T2JqZWN0ICpTV0lHVU5VU0VEUEFSTShhcmdzKSkKKyNlbmRpZgoreworICBTd2lnUHlPYmplY3QgKnNvYmogPSAoU3dpZ1B5T2JqZWN0ICopdjsKKyAgc29iai0+b3duID0gMDsKKyAgcmV0dXJuIFNXSUdfUHlfVm9pZCgpOworfQorCitTV0lHSU5URVJOIFB5T2JqZWN0KgorI2lmZGVmIE1FVEhfTk9BUkdTCitTd2lnUHlPYmplY3RfYWNxdWlyZShQeU9iamVjdCAqdikKKyNlbHNlCitTd2lnUHlPYmplY3RfYWNxdWlyZShQeU9iamVjdCogdiwgUHlPYmplY3QgKlNXSUdVTlVTRURQQVJNKGFyZ3MpKQorI2VuZGlmCit7CisgIFN3aWdQeU9iamVjdCAqc29iaiA9IChTd2lnUHlPYmplY3QgKil2OworICBzb2JqLT5vd24gPSBTV0lHX1BPSU5URVJfT1dOOworICByZXR1cm4gU1dJR19QeV9Wb2lkKCk7Cit9CisKK1NXSUdJTlRFUk4gUHlPYmplY3QqCitTd2lnUHlPYmplY3Rfb3duKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqYXJncykKK3sKKyAgUHlPYmplY3QgKnZhbCA9IDA7CisjaWYgKFBZX1ZFUlNJT05fSEVYIDwgMHgwMjAyMDAwMCkKKyAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsKGNoYXIgKikifE86b3duIiwmdmFsKSkKKyNlbHNlCisgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgKGNoYXIgKikib3duIiwgMCwgMSwgJnZhbCkpCisjZW5kaWYKKyAgICB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBTd2lnUHlPYmplY3QgKnNvYmogPSAoU3dpZ1B5T2JqZWN0ICopdjsKKyAgICAgIFB5T2JqZWN0ICpvYmogPSBQeUJvb2xfRnJvbUxvbmcoc29iai0+b3duKTsKKyAgICAgIGlmICh2YWwpIHsKKyNpZmRlZiBNRVRIX05PQVJHUworICAgICAgICBpZiAoUHlPYmplY3RfSXNUcnVlKHZhbCkpIHsKKyAgICAgICAgICBTd2lnUHlPYmplY3RfYWNxdWlyZSh2KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBTd2lnUHlPYmplY3RfZGlzb3duKHYpOworICAgICAgICB9CisjZWxzZQorICAgICAgICBpZiAoUHlPYmplY3RfSXNUcnVlKHZhbCkpIHsKKyAgICAgICAgICBTd2lnUHlPYmplY3RfYWNxdWlyZSh2LGFyZ3MpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFN3aWdQeU9iamVjdF9kaXNvd24odixhcmdzKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICB9CisgICAgICByZXR1cm4gb2JqOworICAgIH0KK30KKworI2lmZGVmIE1FVEhfTworc3RhdGljIFB5TWV0aG9kRGVmCitzd2lnb2JqZWN0X21ldGhvZHNbXSA9IHsKKyAgeyhjaGFyICopImRpc293biIsICAoUHlDRnVuY3Rpb24pU3dpZ1B5T2JqZWN0X2Rpc293biwgIE1FVEhfTk9BUkdTLCAgKGNoYXIgKikicmVsZWFzZXMgb3duZXJzaGlwIG9mIHRoZSBwb2ludGVyIn0sCisgIHsoY2hhciAqKSJhY3F1aXJlIiwgKFB5Q0Z1bmN0aW9uKVN3aWdQeU9iamVjdF9hY3F1aXJlLCBNRVRIX05PQVJHUywgIChjaGFyICopImFxdWlyZXMgb3duZXJzaGlwIG9mIHRoZSBwb2ludGVyIn0sCisgIHsoY2hhciAqKSJvd24iLCAgICAgKFB5Q0Z1bmN0aW9uKVN3aWdQeU9iamVjdF9vd24sICAgICBNRVRIX1ZBUkFSR1MsIChjaGFyICopInJldHVybnMvc2V0cyBvd25lcnNoaXAgb2YgdGhlIHBvaW50ZXIifSwKKyAgeyhjaGFyICopImFwcGVuZCIsICAoUHlDRnVuY3Rpb24pU3dpZ1B5T2JqZWN0X2FwcGVuZCwgIE1FVEhfTywgICAgICAgKGNoYXIgKikiYXBwZW5kcyBhbm90aGVyICd0aGlzJyBvYmplY3QifSwKKyAgeyhjaGFyICopIm5leHQiLCAgICAoUHlDRnVuY3Rpb24pU3dpZ1B5T2JqZWN0X25leHQsICAgIE1FVEhfTk9BUkdTLCAgKGNoYXIgKikicmV0dXJucyB0aGUgbmV4dCAndGhpcycgb2JqZWN0In0sCisgIHsoY2hhciAqKSJfX3JlcHJfXyIsKFB5Q0Z1bmN0aW9uKVN3aWdQeU9iamVjdF9yZXByLCAgICBNRVRIX05PQVJHUywgIChjaGFyICopInJldHVybnMgb2JqZWN0IHJlcHJlc2VudGF0aW9uIn0sCisgIHswLCAwLCAwLCAwfQorfTsKKyNlbHNlCitzdGF0aWMgUHlNZXRob2REZWYKK3N3aWdvYmplY3RfbWV0aG9kc1tdID0geworICB7KGNoYXIgKikiZGlzb3duIiwgIChQeUNGdW5jdGlvbilTd2lnUHlPYmplY3RfZGlzb3duLCAgTUVUSF9WQVJBUkdTLCAgKGNoYXIgKikicmVsZWFzZXMgb3duZXJzaGlwIG9mIHRoZSBwb2ludGVyIn0sCisgIHsoY2hhciAqKSJhY3F1aXJlIiwgKFB5Q0Z1bmN0aW9uKVN3aWdQeU9iamVjdF9hY3F1aXJlLCBNRVRIX1ZBUkFSR1MsICAoY2hhciAqKSJhcXVpcmVzIG93bmVyc2hpcCBvZiB0aGUgcG9pbnRlciJ9LAorICB7KGNoYXIgKikib3duIiwgICAgIChQeUNGdW5jdGlvbilTd2lnUHlPYmplY3Rfb3duLCAgICAgTUVUSF9WQVJBUkdTLCAgKGNoYXIgKikicmV0dXJucy9zZXRzIG93bmVyc2hpcCBvZiB0aGUgcG9pbnRlciJ9LAorICB7KGNoYXIgKikiYXBwZW5kIiwgIChQeUNGdW5jdGlvbilTd2lnUHlPYmplY3RfYXBwZW5kLCAgTUVUSF9WQVJBUkdTLCAgKGNoYXIgKikiYXBwZW5kcyBhbm90aGVyICd0aGlzJyBvYmplY3QifSwKKyAgeyhjaGFyICopIm5leHQiLCAgICAoUHlDRnVuY3Rpb24pU3dpZ1B5T2JqZWN0X25leHQsICAgIE1FVEhfVkFSQVJHUywgIChjaGFyICopInJldHVybnMgdGhlIG5leHQgJ3RoaXMnIG9iamVjdCJ9LAorICB7KGNoYXIgKikiX19yZXByX18iLChQeUNGdW5jdGlvbilTd2lnUHlPYmplY3RfcmVwciwgICBNRVRIX1ZBUkFSR1MsICAoY2hhciAqKSJyZXR1cm5zIG9iamVjdCByZXByZXNlbnRhdGlvbiJ9LAorICB7MCwgMCwgMCwgMH0KK307CisjZW5kaWYKKworI2lmIFBZX1ZFUlNJT05fSEVYIDwgMHgwMjAyMDAwMAorU1dJR0lOVEVSTiBQeU9iamVjdCAqCitTd2lnUHlPYmplY3RfZ2V0YXR0cihTd2lnUHlPYmplY3QgKnNvYmosY2hhciAqbmFtZSkKK3sKKyAgcmV0dXJuIFB5X0ZpbmRNZXRob2Qoc3dpZ29iamVjdF9tZXRob2RzLCAoUHlPYmplY3QgKilzb2JqLCBuYW1lKTsKK30KKyNlbmRpZgorCitTV0lHUlVOVElNRSBQeVR5cGVPYmplY3QqCitTd2lnUHlPYmplY3RfVHlwZU9uY2Uodm9pZCkgeworICBzdGF0aWMgY2hhciBzd2lnb2JqZWN0X2RvY1tdID0gIlN3aWcgb2JqZWN0IGNhcnJpZXMgYSBDL0MrKyBpbnN0YW5jZSBwb2ludGVyIjsKKworICBzdGF0aWMgUHlOdW1iZXJNZXRob2RzIFN3aWdQeU9iamVjdF9hc19udW1iZXIgPSB7CisgICAgKGJpbmFyeWZ1bmMpMCwgLypuYl9hZGQqLworICAgIChiaW5hcnlmdW5jKTAsIC8qbmJfc3VidHJhY3QqLworICAgIChiaW5hcnlmdW5jKTAsIC8qbmJfbXVsdGlwbHkqLworICAgIC8qIG5iX2RpdmlkZSByZW1vdmVkIGluIFB5dGhvbiAzICovCisjaWYgUFlfVkVSU0lPTl9IRVggPCAweDAzMDAwMDAwCisgICAgKGJpbmFyeWZ1bmMpMCwgLypuYl9kaXZpZGUqLworI2VuZGlmCisgICAgKGJpbmFyeWZ1bmMpMCwgLypuYl9yZW1haW5kZXIqLworICAgIChiaW5hcnlmdW5jKTAsIC8qbmJfZGl2bW9kKi8KKyAgICAodGVybmFyeWZ1bmMpMCwvKm5iX3Bvd2VyKi8KKyAgICAodW5hcnlmdW5jKTAsICAvKm5iX25lZ2F0aXZlKi8KKyAgICAodW5hcnlmdW5jKTAsICAvKm5iX3Bvc2l0aXZlKi8KKyAgICAodW5hcnlmdW5jKTAsICAvKm5iX2Fic29sdXRlKi8KKyAgICAoaW5xdWlyeSkwLCAgICAvKm5iX25vbnplcm8qLworICAgIDAsICAgICAgICAgICAgIC8qbmJfaW52ZXJ0Ki8KKyAgICAwLCAgICAgICAgICAgICAvKm5iX2xzaGlmdCovCisgICAgMCwgICAgICAgICAgICAgLypuYl9yc2hpZnQqLworICAgIDAsICAgICAgICAgICAgIC8qbmJfYW5kKi8KKyAgICAwLCAgICAgICAgICAgICAvKm5iX3hvciovCisgICAgMCwgICAgICAgICAgICAgLypuYl9vciovCisjaWYgUFlfVkVSU0lPTl9IRVggPCAweDAzMDAwMDAwCisgICAgMCwgICAvKm5iX2NvZXJjZSovCisjZW5kaWYKKyAgICAodW5hcnlmdW5jKVN3aWdQeU9iamVjdF9sb25nLCAvKm5iX2ludCovCisjaWYgUFlfVkVSU0lPTl9IRVggPCAweDAzMDAwMDAwCisgICAgKHVuYXJ5ZnVuYylTd2lnUHlPYmplY3RfbG9uZywgLypuYl9sb25nKi8KKyNlbHNlCisgICAgMCwgLypuYl9yZXNlcnZlZCovCisjZW5kaWYKKyAgICAodW5hcnlmdW5jKTAsICAgICAgICAgICAgICAgICAvKm5iX2Zsb2F0Ki8KKyNpZiBQWV9WRVJTSU9OX0hFWCA8IDB4MDMwMDAwMDAKKyAgICAodW5hcnlmdW5jKVN3aWdQeU9iamVjdF9vY3QsICAvKm5iX29jdCovCisgICAgKHVuYXJ5ZnVuYylTd2lnUHlPYmplY3RfaGV4LCAgLypuYl9oZXgqLworI2VuZGlmCisjaWYgUFlfVkVSU0lPTl9IRVggPj0gMHgwMzAwMDAwMCAvKiAzLjAgKi8KKyAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCAvKiBuYl9pbnBsYWNlX2FkZCAtPiBuYl9pbmRleCwgbmJfaW5wbGFjZV9kaXZpZGUgcmVtb3ZlZCAqLworI2VsaWYgUFlfVkVSU0lPTl9IRVggPj0gMHgwMjA1MDAwMCAvKiAyLjUuMCAqLworICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAgLyogbmJfaW5wbGFjZV9hZGQgLT4gbmJfaW5kZXggKi8KKyNlbGlmIFBZX1ZFUlNJT05fSEVYID49IDB4MDIwMjAwMDAgLyogMi4yLjAgKi8KKyAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCAvKiBuYl9pbnBsYWNlX2FkZCAtPiBuYl9pbnBsYWNlX3RydWVfZGl2aWRlICovCisjZWxpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAyMDAwMDAwIC8qIDIuMC4wICovCisgICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwIC8qIG5iX2lucGxhY2VfYWRkIC0+IG5iX2lucGxhY2Vfb3IgKi8KKyNlbmRpZgorICB9OworCisgIHN0YXRpYyBQeVR5cGVPYmplY3Qgc3dpZ3B5b2JqZWN0X3R5cGU7CisgIHN0YXRpYyBpbnQgdHlwZV9pbml0ID0gMDsKKyAgaWYgKCF0eXBlX2luaXQpIHsKKyAgICBjb25zdCBQeVR5cGVPYmplY3QgdG1wID0geworICAgICAgLyogUHlPYmplY3QgaGVhZGVyIGNoYW5nZWQgaW4gUHl0aG9uIDMgKi8KKyNpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAzMDAwMDAwCisgICAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyNlbHNlCisgICAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb2Jfc2l6ZSAqLworI2VuZGlmCisgICAgICAoY2hhciAqKSJTd2lnUHlPYmplY3QiLCAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICAgIHNpemVvZihTd2lnUHlPYmplY3QpLCAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgICAoZGVzdHJ1Y3RvcilTd2lnUHlPYmplY3RfZGVhbGxvYywgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAgIChwcmludGZ1bmMpU3dpZ1B5T2JqZWN0X3ByaW50LCAgICAgICAgLyogdHBfcHJpbnQgKi8KKyNpZiBQWV9WRVJTSU9OX0hFWCA8IDB4MDIwMjAwMDAKKyAgICAgIChnZXRhdHRyZnVuYylTd2lnUHlPYmplY3RfZ2V0YXR0ciwgICAgLyogdHBfZ2V0YXR0ciAqLworI2Vsc2UKKyAgICAgIChnZXRhdHRyZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworI2VuZGlmCisgICAgICAoc2V0YXR0cmZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyNpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAzMDAwMDAwCisgICAgMCwgLyogdHBfcmVzZXJ2ZWQgaW4gMy4wLjEsIHRwX2NvbXBhcmUgaW4gMy4wLjAgYnV0IG5vdCB1c2VkICovCisjZWxzZQorICAgICAgKGNtcGZ1bmMpU3dpZ1B5T2JqZWN0X2NvbXBhcmUsICAgICAgICAvKiB0cF9jb21wYXJlICovCisjZW5kaWYKKyAgICAgIChyZXByZnVuYylTd2lnUHlPYmplY3RfcmVwciwgICAgICAgICAgLyogdHBfcmVwciAqLworICAgICAgJlN3aWdQeU9iamVjdF9hc19udW1iZXIsICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgICAgKGhhc2hmdW5jKTAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgICAodGVybmFyeWZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAgIChyZXByZnVuYylTd2lnUHlPYmplY3Rfc3RyLCAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgICAgc3dpZ29iamVjdF9kb2MsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAgIChyaWNoY21wZnVuYylTd2lnUHlPYmplY3RfcmljaGNvbXBhcmUsLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyNpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAyMDIwMDAwCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAgIHN3aWdvYmplY3RfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXNfZ2MgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZXMgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbXJvICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhY2hlICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N1YmNsYXNzZXMgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3QgKi8KKyNlbmRpZgorI2lmIFBZX1ZFUlNJT05fSEVYID49IDB4MDIwMzAwMDAKKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVsICovCisjZW5kaWYKKyNpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAyMDYwMDAwCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ZlcnNpb24gKi8KKyNlbmRpZgorI2lmZGVmIENPVU5UX0FMTE9DUworICAgICAgMCwwLDAsMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAtPiB0cF9uZXh0ICovCisjZW5kaWYKKyAgICB9OworICAgIHN3aWdweW9iamVjdF90eXBlID0gdG1wOworICAgIHR5cGVfaW5pdCA9IDE7CisjaWYgUFlfVkVSU0lPTl9IRVggPCAweDAyMDIwMDAwCisgICAgc3dpZ3B5b2JqZWN0X3R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyNlbHNlCisgICAgaWYgKFB5VHlwZV9SZWFkeSgmc3dpZ3B5b2JqZWN0X3R5cGUpIDwgMCkKKyAgICAgIHJldHVybiBOVUxMOworI2VuZGlmCisgIH0KKyAgcmV0dXJuICZzd2lncHlvYmplY3RfdHlwZTsKK30KKworU1dJR1JVTlRJTUUgUHlPYmplY3QgKgorU3dpZ1B5T2JqZWN0X05ldyh2b2lkICpwdHIsIHN3aWdfdHlwZV9pbmZvICp0eSwgaW50IG93bikKK3sKKyAgU3dpZ1B5T2JqZWN0ICpzb2JqID0gUHlPYmplY3RfTkVXKFN3aWdQeU9iamVjdCwgU3dpZ1B5T2JqZWN0X3R5cGUoKSk7CisgIGlmIChzb2JqKSB7CisgICAgc29iai0+cHRyICA9IHB0cjsKKyAgICBzb2JqLT50eSAgID0gdHk7CisgICAgc29iai0+b3duICA9IG93bjsKKyAgICBzb2JqLT5uZXh0ID0gMDsKKyAgfQorICByZXR1cm4gKFB5T2JqZWN0ICopc29iajsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEltcGxlbWVudHMgYSBzaW1wbGUgU3dpZyBQYWNrZWQgdHlwZSwgYW5kIHVzZSBpdCBpbnN0ZWFkIG9mIHN0cmluZworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBQeU9iamVjdF9IRUFECisgIHZvaWQgKnBhY2s7CisgIHN3aWdfdHlwZV9pbmZvICp0eTsKKyAgc2l6ZV90IHNpemU7Cit9IFN3aWdQeVBhY2tlZDsKKworU1dJR1JVTlRJTUUgaW50CitTd2lnUHlQYWNrZWRfcHJpbnQoU3dpZ1B5UGFja2VkICp2LCBGSUxFICpmcCwgaW50IFNXSUdVTlVTRURQQVJNKGZsYWdzKSkKK3sKKyAgY2hhciByZXN1bHRbU1dJR19CVUZGRVJfU0laRV07CisgIGZwdXRzKCI8U3dpZyBQYWNrZWQgIiwgZnApOworICBpZiAoU1dJR19QYWNrRGF0YU5hbWUocmVzdWx0LCB2LT5wYWNrLCB2LT5zaXplLCAwLCBzaXplb2YocmVzdWx0KSkpIHsKKyAgICBmcHV0cygiYXQgIiwgZnApOworICAgIGZwdXRzKHJlc3VsdCwgZnApOworICB9CisgIGZwdXRzKHYtPnR5LT5uYW1lLGZwKTsKKyAgZnB1dHMoIj4iLCBmcCk7CisgIHJldHVybiAwOworfQorCitTV0lHUlVOVElNRSBQeU9iamVjdCAqCitTd2lnUHlQYWNrZWRfcmVwcihTd2lnUHlQYWNrZWQgKnYpCit7CisgIGNoYXIgcmVzdWx0W1NXSUdfQlVGRkVSX1NJWkVdOworICBpZiAoU1dJR19QYWNrRGF0YU5hbWUocmVzdWx0LCB2LT5wYWNrLCB2LT5zaXplLCAwLCBzaXplb2YocmVzdWx0KSkpIHsKKyAgICByZXR1cm4gU1dJR19QeXRob25fc3RyX0Zyb21Gb3JtYXQoIjxTd2lnIFBhY2tlZCBhdCAlcyVzPiIsIHJlc3VsdCwgdi0+dHktPm5hbWUpOworICB9IGVsc2UgeworICAgIHJldHVybiBTV0lHX1B5dGhvbl9zdHJfRnJvbUZvcm1hdCgiPFN3aWcgUGFja2VkICVzPiIsIHYtPnR5LT5uYW1lKTsKKyAgfQorfQorCitTV0lHUlVOVElNRSBQeU9iamVjdCAqCitTd2lnUHlQYWNrZWRfc3RyKFN3aWdQeVBhY2tlZCAqdikKK3sKKyAgY2hhciByZXN1bHRbU1dJR19CVUZGRVJfU0laRV07CisgIGlmIChTV0lHX1BhY2tEYXRhTmFtZShyZXN1bHQsIHYtPnBhY2ssIHYtPnNpemUsIDAsIHNpemVvZihyZXN1bHQpKSl7CisgICAgcmV0dXJuIFNXSUdfUHl0aG9uX3N0cl9Gcm9tRm9ybWF0KCIlcyVzIiwgcmVzdWx0LCB2LT50eS0+bmFtZSk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIFNXSUdfUHl0aG9uX3N0cl9Gcm9tQ2hhcih2LT50eS0+bmFtZSk7CisgIH0KK30KKworU1dJR1JVTlRJTUUgaW50CitTd2lnUHlQYWNrZWRfY29tcGFyZShTd2lnUHlQYWNrZWQgKnYsIFN3aWdQeVBhY2tlZCAqdykKK3sKKyAgc2l6ZV90IGkgPSB2LT5zaXplOworICBzaXplX3QgaiA9IHctPnNpemU7CisgIGludCBzID0gKGkgPCBqKSA/IC0xIDogKChpID4gaikgPyAxIDogMCk7CisgIHJldHVybiBzID8gcyA6IHN0cm5jbXAoKGNoYXIgKil2LT5wYWNrLCAoY2hhciAqKXctPnBhY2ssIDIqdi0+c2l6ZSk7Cit9CisKK1NXSUdSVU5USU1FIFB5VHlwZU9iamVjdCogU3dpZ1B5UGFja2VkX1R5cGVPbmNlKHZvaWQpOworCitTV0lHUlVOVElNRSBQeVR5cGVPYmplY3QqCitTd2lnUHlQYWNrZWRfdHlwZSh2b2lkKSB7CisgIHN0YXRpYyBQeVR5cGVPYmplY3QgKlNXSUdfU1RBVElDX1BPSU5URVIodHlwZSkgPSBTd2lnUHlQYWNrZWRfVHlwZU9uY2UoKTsKKyAgcmV0dXJuIHR5cGU7Cit9CisKK1NXSUdSVU5USU1FSU5MSU5FIGludAorU3dpZ1B5UGFja2VkX0NoZWNrKFB5T2JqZWN0ICpvcCkgeworICByZXR1cm4gKChvcCktPm9iX3R5cGUgPT0gU3dpZ1B5UGFja2VkX1R5cGVPbmNlKCkpCisgICAgfHwgKHN0cmNtcCgob3ApLT5vYl90eXBlLT50cF9uYW1lLCJTd2lnUHlQYWNrZWQiKSA9PSAwKTsKK30KKworU1dJR1JVTlRJTUUgdm9pZAorU3dpZ1B5UGFja2VkX2RlYWxsb2MoUHlPYmplY3QgKnYpCit7CisgIGlmIChTd2lnUHlQYWNrZWRfQ2hlY2sodikpIHsKKyAgICBTd2lnUHlQYWNrZWQgKnNvYmogPSAoU3dpZ1B5UGFja2VkICopIHY7CisgICAgZnJlZShzb2JqLT5wYWNrKTsKKyAgfQorICBQeU9iamVjdF9ERUwodik7Cit9CisKK1NXSUdSVU5USU1FIFB5VHlwZU9iamVjdCoKK1N3aWdQeVBhY2tlZF9UeXBlT25jZSh2b2lkKSB7CisgIHN0YXRpYyBjaGFyIHN3aWdwYWNrZWRfZG9jW10gPSAiU3dpZyBvYmplY3QgY2FycmllcyBhIEMvQysrIGluc3RhbmNlIHBvaW50ZXIiOworICBzdGF0aWMgUHlUeXBlT2JqZWN0IHN3aWdweXBhY2tlZF90eXBlOworICBzdGF0aWMgaW50IHR5cGVfaW5pdCA9IDA7CisgIGlmICghdHlwZV9pbml0KSB7CisgICAgY29uc3QgUHlUeXBlT2JqZWN0IHRtcCA9IHsKKyAgICAgIC8qIFB5T2JqZWN0IGhlYWRlciBjaGFuZ2VkIGluIFB5dGhvbiAzICovCisjaWYgUFlfVkVSU0lPTl9IRVg+PTB4MDMwMDAwMDAKKyAgICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorI2Vsc2UKKyAgICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvYl9zaXplICovCisjZW5kaWYKKyAgICAgIChjaGFyICopIlN3aWdQeVBhY2tlZCIsICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgICAgc2l6ZW9mKFN3aWdQeVBhY2tlZCksICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAgIChkZXN0cnVjdG9yKVN3aWdQeVBhY2tlZF9kZWFsbG9jLCAgICAgLyogdHBfZGVhbGxvYyAqLworICAgICAgKHByaW50ZnVuYylTd2lnUHlQYWNrZWRfcHJpbnQsICAgICAgICAvKiB0cF9wcmludCAqLworICAgICAgKGdldGF0dHJmdW5jKTAsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgICAoc2V0YXR0cmZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyNpZiBQWV9WRVJTSU9OX0hFWD49MHgwMzAwMDAwMAorICAgICAgMCwgLyogdHBfcmVzZXJ2ZWQgaW4gMy4wLjEgKi8KKyNlbHNlCisgICAgICAoY21wZnVuYylTd2lnUHlQYWNrZWRfY29tcGFyZSwgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyNlbmRpZgorICAgICAgKHJlcHJmdW5jKVN3aWdQeVBhY2tlZF9yZXByLCAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgICAoaGFzaGZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAgICh0ZXJuYXJ5ZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgICAgKHJlcHJmdW5jKVN3aWdQeVBhY2tlZF9zdHIsICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgICBzd2lncGFja2VkX2RvYywgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworI2lmIFBZX1ZFUlNJT05fSEVYID49IDB4MDIwMjAwMDAKKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pc19nYyAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlcyAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tcm8gKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FjaGUgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3ViY2xhc3NlcyAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdCAqLworI2VuZGlmCisjaWYgUFlfVkVSU0lPTl9IRVggPj0gMHgwMjAzMDAwMAorICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWwgKi8KKyNlbmRpZgorI2lmIFBZX1ZFUlNJT05fSEVYID49IDB4MDIwNjAwMDAKKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdmVyc2lvbiAqLworI2VuZGlmCisjaWZkZWYgQ09VTlRfQUxMT0NTCisgICAgICAwLDAsMCwwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jIC0+IHRwX25leHQgKi8KKyNlbmRpZgorICAgIH07CisgICAgc3dpZ3B5cGFja2VkX3R5cGUgPSB0bXA7CisgICAgdHlwZV9pbml0ID0gMTsKKyNpZiBQWV9WRVJTSU9OX0hFWCA8IDB4MDIwMjAwMDAKKyAgICBzd2lncHlwYWNrZWRfdHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworI2Vsc2UKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZzd2lncHlwYWNrZWRfdHlwZSkgPCAwKQorICAgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgfQorICByZXR1cm4gJnN3aWdweXBhY2tlZF90eXBlOworfQorCitTV0lHUlVOVElNRSBQeU9iamVjdCAqCitTd2lnUHlQYWNrZWRfTmV3KHZvaWQgKnB0ciwgc2l6ZV90IHNpemUsIHN3aWdfdHlwZV9pbmZvICp0eSkKK3sKKyAgU3dpZ1B5UGFja2VkICpzb2JqID0gUHlPYmplY3RfTkVXKFN3aWdQeVBhY2tlZCwgU3dpZ1B5UGFja2VkX3R5cGUoKSk7CisgIGlmIChzb2JqKSB7CisgICAgdm9pZCAqcGFjayA9IG1hbGxvYyhzaXplKTsKKyAgICBpZiAocGFjaykgeworICAgICAgbWVtY3B5KHBhY2ssIHB0ciwgc2l6ZSk7CisgICAgICBzb2JqLT5wYWNrID0gcGFjazsKKyAgICAgIHNvYmotPnR5ICAgPSB0eTsKKyAgICAgIHNvYmotPnNpemUgPSBzaXplOworICAgIH0gZWxzZSB7CisgICAgICBQeU9iamVjdF9ERUwoKFB5T2JqZWN0ICopIHNvYmopOworICAgICAgc29iaiA9IDA7CisgICAgfQorICB9CisgIHJldHVybiAoUHlPYmplY3QgKikgc29iajsKK30KKworU1dJR1JVTlRJTUUgc3dpZ190eXBlX2luZm8gKgorU3dpZ1B5UGFja2VkX1VucGFja0RhdGEoUHlPYmplY3QgKm9iaiwgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSkKK3sKKyAgaWYgKFN3aWdQeVBhY2tlZF9DaGVjayhvYmopKSB7CisgICAgU3dpZ1B5UGFja2VkICpzb2JqID0gKFN3aWdQeVBhY2tlZCAqKW9iajsKKyAgICBpZiAoc29iai0+c2l6ZSAhPSBzaXplKSByZXR1cm4gMDsKKyAgICBtZW1jcHkocHRyLCBzb2JqLT5wYWNrLCBzaXplKTsKKyAgICByZXR1cm4gc29iai0+dHk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIDA7CisgIH0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHBvaW50ZXJzL2RhdGEgbWFuaXB1bGF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitTV0lHUlVOVElNRUlOTElORSBQeU9iamVjdCAqCitfU1dJR19UaGlzKHZvaWQpCit7CisgICAgcmV0dXJuIFNXSUdfUHl0aG9uX3N0cl9Gcm9tQ2hhcigidGhpcyIpOworfQorCitzdGF0aWMgUHlPYmplY3QgKnN3aWdfdGhpcyA9IE5VTEw7CisKK1NXSUdSVU5USU1FIFB5T2JqZWN0ICoKK1NXSUdfVGhpcyh2b2lkKQoreworICBpZiAoc3dpZ190aGlzID09IE5VTEwpCisgICAgc3dpZ190aGlzID0gX1NXSUdfVGhpcygpOworICByZXR1cm4gc3dpZ190aGlzOworfQorCisvKiAjZGVmaW5lIFNXSUdfUFlUSE9OX1NMT1dfR0VUU0VUX1RISVMgKi8KKworLyogVE9ETzogSSBkb24ndCBrbm93IGhvdyB0byBpbXBsZW1lbnQgdGhlIGZhc3QgZ2V0c2V0IGluIFB5dGhvbiAzIHJpZ2h0IG5vdyAqLworI2lmIFBZX1ZFUlNJT05fSEVYPj0weDAzMDAwMDAwCisjZGVmaW5lIFNXSUdfUFlUSE9OX1NMT1dfR0VUU0VUX1RISVMKKyNlbmRpZgorCitTV0lHUlVOVElNRSBTd2lnUHlPYmplY3QgKgorU1dJR19QeXRob25fR2V0U3dpZ1RoaXMoUHlPYmplY3QgKnB5b2JqKQoreworICBQeU9iamVjdCAqb2JqOworCisgIGlmIChTd2lnUHlPYmplY3RfQ2hlY2socHlvYmopKQorICAgIHJldHVybiAoU3dpZ1B5T2JqZWN0ICopIHB5b2JqOworCisjaWZkZWYgU1dJR1BZVEhPTl9CVUlMVElOCisgICh2b2lkKW9iajsKKyMgaWZkZWYgUHlXZWFrcmVmX0NoZWNrUHJveHkKKyAgaWYgKFB5V2Vha3JlZl9DaGVja1Byb3h5KHB5b2JqKSkgeworICAgIHB5b2JqID0gUHlXZWFrcmVmX0dFVF9PQkpFQ1QocHlvYmopOworICAgIGlmIChweW9iaiAmJiBTd2lnUHlPYmplY3RfQ2hlY2socHlvYmopKQorICAgICAgcmV0dXJuIChTd2lnUHlPYmplY3QqKSBweW9iajsKKyAgfQorIyBlbmRpZgorICByZXR1cm4gTlVMTDsKKyNlbHNlCisKKyAgb2JqID0gMDsKKworI2lmICghZGVmaW5lZChTV0lHX1BZVEhPTl9TTE9XX0dFVFNFVF9USElTKSAmJiAoUFlfVkVSU0lPTl9IRVggPj0gMHgwMjAzMDAwMCkpCisgIGlmIChQeUluc3RhbmNlX0NoZWNrKHB5b2JqKSkgeworICAgIG9iaiA9IF9QeUluc3RhbmNlX0xvb2t1cChweW9iaiwgU1dJR19UaGlzKCkpOworICB9IGVsc2UgeworICAgIFB5T2JqZWN0ICoqZGljdHB0ciA9IF9QeU9iamVjdF9HZXREaWN0UHRyKHB5b2JqKTsKKyAgICBpZiAoZGljdHB0ciAhPSBOVUxMKSB7CisgICAgICBQeU9iamVjdCAqZGljdCA9ICpkaWN0cHRyOworICAgICAgb2JqID0gZGljdCA/IFB5RGljdF9HZXRJdGVtKGRpY3QsIFNXSUdfVGhpcygpKSA6IDA7CisgICAgfSBlbHNlIHsKKyNpZmRlZiBQeVdlYWtyZWZfQ2hlY2tQcm94eQorICAgICAgaWYgKFB5V2Vha3JlZl9DaGVja1Byb3h5KHB5b2JqKSkgeworICAgICAgICBQeU9iamVjdCAqd29iaiA9IFB5V2Vha3JlZl9HRVRfT0JKRUNUKHB5b2JqKTsKKyAgICAgICAgcmV0dXJuIHdvYmogPyBTV0lHX1B5dGhvbl9HZXRTd2lnVGhpcyh3b2JqKSA6IDA7CisgICAgICB9CisjZW5kaWYKKyAgICAgIG9iaiA9IFB5T2JqZWN0X0dldEF0dHIocHlvYmosU1dJR19UaGlzKCkpOworICAgICAgaWYgKG9iaikgeworICAgICAgICBQeV9ERUNSRUYob2JqKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSBQeUVycl9DbGVhcigpOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyNlbHNlCisgIG9iaiA9IFB5T2JqZWN0X0dldEF0dHIocHlvYmosU1dJR19UaGlzKCkpOworICBpZiAob2JqKSB7CisgICAgUHlfREVDUkVGKG9iaik7CisgIH0gZWxzZSB7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIFB5RXJyX0NsZWFyKCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyNlbmRpZgorICBpZiAob2JqICYmICFTd2lnUHlPYmplY3RfQ2hlY2sob2JqKSkgeworICAgIC8qIGEgUHlPYmplY3QgaXMgY2FsbGVkICd0aGlzJywgdHJ5IHRvIGdldCB0aGUgJ3JlYWwgdGhpcycKKyAgICAgICBTd2lnUHlPYmplY3QgZnJvbSBpdCAqLworICAgIHJldHVybiBTV0lHX1B5dGhvbl9HZXRTd2lnVGhpcyhvYmopOworICB9CisgIHJldHVybiAoU3dpZ1B5T2JqZWN0ICopb2JqOworI2VuZGlmCit9CisKKy8qIEFjcXVpcmUgYSBwb2ludGVyIHZhbHVlICovCisKK1NXSUdSVU5USU1FIGludAorU1dJR19QeXRob25fQWNxdWlyZVB0cihQeU9iamVjdCAqb2JqLCBpbnQgb3duKSB7CisgIGlmIChvd24gPT0gU1dJR19QT0lOVEVSX09XTikgeworICAgIFN3aWdQeU9iamVjdCAqc29iaiA9IFNXSUdfUHl0aG9uX0dldFN3aWdUaGlzKG9iaik7CisgICAgaWYgKHNvYmopIHsKKyAgICAgIGludCBvbGRvd24gPSBzb2JqLT5vd247CisgICAgICBzb2JqLT5vd24gPSBvd247CisgICAgICByZXR1cm4gb2xkb3duOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworLyogQ29udmVydCBhIHBvaW50ZXIgdmFsdWUgKi8KKworU1dJR1JVTlRJTUUgaW50CitTV0lHX1B5dGhvbl9Db252ZXJ0UHRyQW5kT3duKFB5T2JqZWN0ICpvYmosIHZvaWQgKipwdHIsIHN3aWdfdHlwZV9pbmZvICp0eSwgaW50IGZsYWdzLCBpbnQgKm93bikgeworICBpbnQgcmVzOworICBTd2lnUHlPYmplY3QgKnNvYmo7CisKKyAgaWYgKCFvYmopCisgICAgcmV0dXJuIFNXSUdfRVJST1I7CisgIGlmIChvYmogPT0gUHlfTm9uZSkgeworICAgIGlmIChwdHIpCisgICAgICAqcHRyID0gMDsKKyAgICByZXR1cm4gU1dJR19PSzsKKyAgfQorCisgIHJlcyA9IFNXSUdfRVJST1I7CisKKyAgc29iaiA9IFNXSUdfUHl0aG9uX0dldFN3aWdUaGlzKG9iaik7CisgIGlmIChvd24pCisgICAgKm93biA9IDA7CisgIHdoaWxlIChzb2JqKSB7CisgICAgdm9pZCAqdnB0ciA9IHNvYmotPnB0cjsKKyAgICBpZiAodHkpIHsKKyAgICAgIHN3aWdfdHlwZV9pbmZvICp0byA9IHNvYmotPnR5OworICAgICAgaWYgKHRvID09IHR5KSB7CisgICAgICAgIC8qIG5vIHR5cGUgY2FzdCBuZWVkZWQgKi8KKyAgICAgICAgaWYgKHB0cikgKnB0ciA9IHZwdHI7CisgICAgICAgIGJyZWFrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpZ19jYXN0X2luZm8gKnRjID0gU1dJR19UeXBlQ2hlY2sodG8tPm5hbWUsdHkpOworICAgICAgICBpZiAoIXRjKSB7CisgICAgICAgICAgc29iaiA9IChTd2lnUHlPYmplY3QgKilzb2JqLT5uZXh0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChwdHIpIHsKKyAgICAgICAgICAgIGludCBuZXdtZW1vcnkgPSAwOworICAgICAgICAgICAgKnB0ciA9IFNXSUdfVHlwZUNhc3QodGMsdnB0ciwmbmV3bWVtb3J5KTsKKyAgICAgICAgICAgIGlmIChuZXdtZW1vcnkgPT0gU1dJR19DQVNUX05FV19NRU1PUlkpIHsKKyAgICAgICAgICAgICAgYXNzZXJ0KG93bik7IC8qIGJhZGx5IGZvcm1lZCB0eXBlbWFwIHdoaWNoIHdpbGwgbGVhZCB0byBhIG1lbW9yeSBsZWFrIC0gaXQgbXVzdCBzZXQgYW5kIHVzZSBvd24gdG8gZGVsZXRlICpwdHIgKi8KKyAgICAgICAgICAgICAgaWYgKG93bikKKyAgICAgICAgICAgICAgICAqb3duID0gKm93biB8IFNXSUdfQ0FTVF9ORVdfTUVNT1JZOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAocHRyKSAqcHRyID0gdnB0cjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBpZiAoc29iaikgeworICAgIGlmIChvd24pCisgICAgICAqb3duID0gKm93biB8IHNvYmotPm93bjsKKyAgICBpZiAoZmxhZ3MgJiBTV0lHX1BPSU5URVJfRElTT1dOKSB7CisgICAgICBzb2JqLT5vd24gPSAwOworICAgIH0KKyAgICByZXMgPSBTV0lHX09LOworICB9IGVsc2UgeworICAgIGlmIChmbGFncyAmIFNXSUdfUE9JTlRFUl9JTVBMSUNJVF9DT05WKSB7CisgICAgICBTd2lnUHlDbGllbnREYXRhICpkYXRhID0gdHkgPyAoU3dpZ1B5Q2xpZW50RGF0YSAqKSB0eS0+Y2xpZW50ZGF0YSA6IDA7CisgICAgICBpZiAoZGF0YSAmJiAhZGF0YS0+aW1wbGljaXRjb252KSB7CisgICAgICAgIFB5T2JqZWN0ICprbGFzcyA9IGRhdGEtPmtsYXNzOworICAgICAgICBpZiAoa2xhc3MpIHsKKyAgICAgICAgICBQeU9iamVjdCAqaW1wY29udjsKKyAgICAgICAgICBkYXRhLT5pbXBsaWNpdGNvbnYgPSAxOyAvKiBhdm9pZCByZWN1cnNpb24gYW5kIGNhbGwgJ2V4cGxpY2l0JyBjb25zdHJ1Y3RvcnMqLworICAgICAgICAgIGltcGNvbnYgPSBTV0lHX1B5dGhvbl9DYWxsRnVuY3RvcihrbGFzcywgb2JqKTsKKyAgICAgICAgICBkYXRhLT5pbXBsaWNpdGNvbnYgPSAwOworICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgaW1wY29udiA9IDA7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChpbXBjb252KSB7CisgICAgICAgICAgICBTd2lnUHlPYmplY3QgKmlvYmogPSBTV0lHX1B5dGhvbl9HZXRTd2lnVGhpcyhpbXBjb252KTsKKyAgICAgICAgICAgIGlmIChpb2JqKSB7CisgICAgICAgICAgICAgIHZvaWQgKnZwdHI7CisgICAgICAgICAgICAgIHJlcyA9IFNXSUdfUHl0aG9uX0NvbnZlcnRQdHJBbmRPd24oKFB5T2JqZWN0Kilpb2JqLCAmdnB0ciwgdHksIDAsIDApOworICAgICAgICAgICAgICBpZiAoU1dJR19Jc09LKHJlcykpIHsKKyAgICAgICAgICAgICAgICBpZiAocHRyKSB7CisgICAgICAgICAgICAgICAgICAqcHRyID0gdnB0cjsKKyAgICAgICAgICAgICAgICAgIC8qIHRyYW5zZmVyIHRoZSBvd25lcnNoaXAgdG8gJ3B0cicgKi8KKyAgICAgICAgICAgICAgICAgIGlvYmotPm93biA9IDA7CisgICAgICAgICAgICAgICAgICByZXMgPSBTV0lHX0FkZENhc3QocmVzKTsKKyAgICAgICAgICAgICAgICAgIHJlcyA9IFNXSUdfQWRkTmV3TWFzayhyZXMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICByZXMgPSBTV0lHX0FkZENhc3QocmVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0RFQ1JFRihpbXBjb252KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlczsKK30KKworLyogQ29udmVydCBhIGZ1bmN0aW9uIHB0ciB2YWx1ZSAqLworCitTV0lHUlVOVElNRSBpbnQKK1NXSUdfUHl0aG9uX0NvbnZlcnRGdW5jdGlvblB0cihQeU9iamVjdCAqb2JqLCB2b2lkICoqcHRyLCBzd2lnX3R5cGVfaW5mbyAqdHkpIHsKKyAgaWYgKCFQeUNGdW5jdGlvbl9DaGVjayhvYmopKSB7CisgICAgcmV0dXJuIFNXSUdfQ29udmVydFB0cihvYmosIHB0ciwgdHksIDApOworICB9IGVsc2UgeworICAgIHZvaWQgKnZwdHIgPSAwOworCisgICAgLyogaGVyZSB3ZSBnZXQgdGhlIG1ldGhvZCBwb2ludGVyIGZvciBjYWxsYmFja3MgKi8KKyAgICBjb25zdCBjaGFyICpkb2MgPSAoKChQeUNGdW5jdGlvbk9iamVjdCAqKW9iaikgLT4gbV9tbCAtPiBtbF9kb2MpOworICAgIGNvbnN0IGNoYXIgKmRlc2MgPSBkb2MgPyBzdHJzdHIoZG9jLCAic3dpZ19wdHI6ICIpIDogMDsKKyAgICBpZiAoZGVzYykKKyAgICAgIGRlc2MgPSB0eSA/IFNXSUdfVW5wYWNrVm9pZFB0cihkZXNjICsgMTAsICZ2cHRyLCB0eS0+bmFtZSkgOiAwOworICAgIGlmICghZGVzYykKKyAgICAgIHJldHVybiBTV0lHX0VSUk9SOworICAgIGlmICh0eSkgeworICAgICAgc3dpZ19jYXN0X2luZm8gKnRjID0gU1dJR19UeXBlQ2hlY2soZGVzYyx0eSk7CisgICAgICBpZiAodGMpIHsKKyAgICAgICAgaW50IG5ld21lbW9yeSA9IDA7CisgICAgICAgICpwdHIgPSBTV0lHX1R5cGVDYXN0KHRjLHZwdHIsJm5ld21lbW9yeSk7CisgICAgICAgIGFzc2VydCghbmV3bWVtb3J5KTsgLyogbmV3bWVtb3J5IGhhbmRsaW5nIG5vdCB5ZXQgaW1wbGVtZW50ZWQgKi8KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBTV0lHX0VSUk9SOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAqcHRyID0gdnB0cjsKKyAgICB9CisgICAgcmV0dXJuIFNXSUdfT0s7CisgIH0KK30KKworLyogQ29udmVydCBhIHBhY2tlZCB2YWx1ZSB2YWx1ZSAqLworCitTV0lHUlVOVElNRSBpbnQKK1NXSUdfUHl0aG9uX0NvbnZlcnRQYWNrZWQoUHlPYmplY3QgKm9iaiwgdm9pZCAqcHRyLCBzaXplX3Qgc3osIHN3aWdfdHlwZV9pbmZvICp0eSkgeworICBzd2lnX3R5cGVfaW5mbyAqdG8gPSBTd2lnUHlQYWNrZWRfVW5wYWNrRGF0YShvYmosIHB0ciwgc3opOworICBpZiAoIXRvKSByZXR1cm4gU1dJR19FUlJPUjsKKyAgaWYgKHR5KSB7CisgICAgaWYgKHRvICE9IHR5KSB7CisgICAgICAvKiBjaGVjayB0eXBlIGNhc3Q/ICovCisgICAgICBzd2lnX2Nhc3RfaW5mbyAqdGMgPSBTV0lHX1R5cGVDaGVjayh0by0+bmFtZSx0eSk7CisgICAgICBpZiAoIXRjKSByZXR1cm4gU1dJR19FUlJPUjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFNXSUdfT0s7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDcmVhdGUgYSBuZXcgcG9pbnRlciBvYmplY3QKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvYmplY3QsIHdpdGhvdXQgY2FsbGluZyBfX2luaXRfXywgYW5kIHNldCB0aGUKKyAgJ3RoaXMnIGF0dHJpYnV0ZS4KKyovCisKK1NXSUdSVU5USU1FIFB5T2JqZWN0KgorU1dJR19QeXRob25fTmV3U2hhZG93SW5zdGFuY2UoU3dpZ1B5Q2xpZW50RGF0YSAqZGF0YSwgUHlPYmplY3QgKnN3aWdfdGhpcykKK3sKKyNpZiAoUFlfVkVSU0lPTl9IRVggPj0gMHgwMjAyMDAwMCkKKyAgUHlPYmplY3QgKmluc3QgPSAwOworICBQeU9iamVjdCAqbmV3cmF3ID0gZGF0YS0+bmV3cmF3OworICBpZiAobmV3cmF3KSB7CisgICAgaW5zdCA9IFB5T2JqZWN0X0NhbGwobmV3cmF3LCBkYXRhLT5uZXdhcmdzLCBOVUxMKTsKKyAgICBpZiAoaW5zdCkgeworI2lmICFkZWZpbmVkKFNXSUdfUFlUSE9OX1NMT1dfR0VUU0VUX1RISVMpCisgICAgICBQeU9iamVjdCAqKmRpY3RwdHIgPSBfUHlPYmplY3RfR2V0RGljdFB0cihpbnN0KTsKKyAgICAgIGlmIChkaWN0cHRyICE9IE5VTEwpIHsKKyAgICAgICAgUHlPYmplY3QgKmRpY3QgPSAqZGljdHB0cjsKKyAgICAgICAgaWYgKGRpY3QgPT0gTlVMTCkgeworICAgICAgICAgIGRpY3QgPSBQeURpY3RfTmV3KCk7CisgICAgICAgICAgKmRpY3RwdHIgPSBkaWN0OworICAgICAgICAgIFB5RGljdF9TZXRJdGVtKGRpY3QsIFNXSUdfVGhpcygpLCBzd2lnX3RoaXMpOworICAgICAgICB9CisgICAgICB9CisjZWxzZQorICAgICAgUHlPYmplY3QgKmtleSA9IFNXSUdfVGhpcygpOworICAgICAgUHlPYmplY3RfU2V0QXR0cihpbnN0LCBrZXksIHN3aWdfdGhpcyk7CisjZW5kaWYKKyAgICB9CisgIH0gZWxzZSB7CisjaWYgUFlfVkVSU0lPTl9IRVggPj0gMHgwMzAwMDAwMAorICAgIGluc3QgPSBQeUJhc2VPYmplY3RfVHlwZS50cF9uZXcoKFB5VHlwZU9iamVjdCopIGRhdGEtPm5ld2FyZ3MsIFB5X05vbmUsIFB5X05vbmUpOworICAgIFB5T2JqZWN0X1NldEF0dHIoaW5zdCwgU1dJR19UaGlzKCksIHN3aWdfdGhpcyk7CisgICAgUHlfVFlQRShpbnN0KS0+dHBfZmxhZ3MgJj0gflB5X1RQRkxBR1NfVkFMSURfVkVSU0lPTl9UQUc7CisjZWxzZQorICAgIFB5T2JqZWN0ICpkaWN0ID0gUHlEaWN0X05ldygpOworICAgIFB5RGljdF9TZXRJdGVtKGRpY3QsIFNXSUdfVGhpcygpLCBzd2lnX3RoaXMpOworICAgIGluc3QgPSBQeUluc3RhbmNlX05ld1JhdyhkYXRhLT5uZXdhcmdzLCBkaWN0KTsKKyAgICBQeV9ERUNSRUYoZGljdCk7CisjZW5kaWYKKyAgfQorICByZXR1cm4gaW5zdDsKKyNlbHNlCisjaWYgKFBZX1ZFUlNJT05fSEVYID49IDB4MDIwMTAwMDApCisgIFB5T2JqZWN0ICppbnN0OworICBQeU9iamVjdCAqZGljdCA9IFB5RGljdF9OZXcoKTsKKyAgUHlEaWN0X1NldEl0ZW0oZGljdCwgU1dJR19UaGlzKCksIHN3aWdfdGhpcyk7CisgIGluc3QgPSBQeUluc3RhbmNlX05ld1JhdyhkYXRhLT5uZXdhcmdzLCBkaWN0KTsKKyAgUHlfREVDUkVGKGRpY3QpOworICByZXR1cm4gKFB5T2JqZWN0ICopIGluc3Q7CisjZWxzZQorICBQeUluc3RhbmNlT2JqZWN0ICppbnN0ID0gUHlPYmplY3RfTkVXKFB5SW5zdGFuY2VPYmplY3QsICZQeUluc3RhbmNlX1R5cGUpOworICBpZiAoaW5zdCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaW5zdC0+aW5fY2xhc3MgPSAoUHlDbGFzc09iamVjdCAqKWRhdGEtPm5ld2FyZ3M7CisgIFB5X0lOQ1JFRihpbnN0LT5pbl9jbGFzcyk7CisgIGluc3QtPmluX2RpY3QgPSBQeURpY3RfTmV3KCk7CisgIGlmIChpbnN0LT5pbl9kaWN0ID09IE5VTEwpIHsKKyAgICBQeV9ERUNSRUYoaW5zdCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNpZmRlZiBQeV9UUEZMQUdTX0hBVkVfV0VBS1JFRlMKKyAgaW5zdC0+aW5fd2Vha3JlZmxpc3QgPSBOVUxMOworI2VuZGlmCisjaWZkZWYgUHlfVFBGTEFHU19HQworICBQeU9iamVjdF9HQ19Jbml0KGluc3QpOworI2VuZGlmCisgIFB5RGljdF9TZXRJdGVtKGluc3QtPmluX2RpY3QsIFNXSUdfVGhpcygpLCBzd2lnX3RoaXMpOworICByZXR1cm4gKFB5T2JqZWN0ICopIGluc3Q7CisjZW5kaWYKKyNlbmRpZgorfQorCitTV0lHUlVOVElNRSB2b2lkCitTV0lHX1B5dGhvbl9TZXRTd2lnVGhpcyhQeU9iamVjdCAqaW5zdCwgUHlPYmplY3QgKnN3aWdfdGhpcykKK3sKKyBQeU9iamVjdCAqZGljdDsKKyNpZiAoUFlfVkVSU0lPTl9IRVggPj0gMHgwMjAyMDAwMCkgJiYgIWRlZmluZWQoU1dJR19QWVRIT05fU0xPV19HRVRTRVRfVEhJUykKKyBQeU9iamVjdCAqKmRpY3RwdHIgPSBfUHlPYmplY3RfR2V0RGljdFB0cihpbnN0KTsKKyBpZiAoZGljdHB0ciAhPSBOVUxMKSB7CisgICBkaWN0ID0gKmRpY3RwdHI7CisgICBpZiAoZGljdCA9PSBOVUxMKSB7CisgICAgIGRpY3QgPSBQeURpY3RfTmV3KCk7CisgICAgICpkaWN0cHRyID0gZGljdDsKKyAgIH0KKyAgIFB5RGljdF9TZXRJdGVtKGRpY3QsIFNXSUdfVGhpcygpLCBzd2lnX3RoaXMpOworICAgcmV0dXJuOworIH0KKyNlbmRpZgorIGRpY3QgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGluc3QsIChjaGFyKikiX19kaWN0X18iKTsKKyBQeURpY3RfU2V0SXRlbShkaWN0LCBTV0lHX1RoaXMoKSwgc3dpZ190aGlzKTsKKyBQeV9ERUNSRUYoZGljdCk7Cit9CisKKworU1dJR0lOVEVSTiBQeU9iamVjdCAqCitTV0lHX1B5dGhvbl9Jbml0U2hhZG93SW5zdGFuY2UoUHlPYmplY3QgKmFyZ3MpIHsKKyAgUHlPYmplY3QgKm9ialsyXTsKKyAgaWYgKCFTV0lHX1B5dGhvbl9VbnBhY2tUdXBsZShhcmdzLChjaGFyKikic3dpZ2luaXQiLCAyLCAyLCBvYmopKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0gZWxzZSB7CisgICAgU3dpZ1B5T2JqZWN0ICpzdGhpcyA9IFNXSUdfUHl0aG9uX0dldFN3aWdUaGlzKG9ialswXSk7CisgICAgaWYgKHN0aGlzKSB7CisgICAgICBTd2lnUHlPYmplY3RfYXBwZW5kKChQeU9iamVjdCopIHN0aGlzLCBvYmpbMV0pOworICAgIH0gZWxzZSB7CisgICAgICBTV0lHX1B5dGhvbl9TZXRTd2lnVGhpcyhvYmpbMF0sIG9ialsxXSk7CisgICAgfQorICAgIHJldHVybiBTV0lHX1B5X1ZvaWQoKTsKKyAgfQorfQorCisvKiBDcmVhdGUgYSBuZXcgcG9pbnRlciBvYmplY3QgKi8KKworU1dJR1JVTlRJTUUgUHlPYmplY3QgKgorU1dJR19QeXRob25fTmV3UG9pbnRlck9iaihQeU9iamVjdCAqc2VsZiwgdm9pZCAqcHRyLCBzd2lnX3R5cGVfaW5mbyAqdHlwZSwgaW50IGZsYWdzKSB7CisgIFN3aWdQeUNsaWVudERhdGEgKmNsaWVudGRhdGE7CisgIFB5T2JqZWN0ICogcm9iajsKKyAgaW50IG93bjsKKworICBpZiAoIXB0cikKKyAgICByZXR1cm4gU1dJR19QeV9Wb2lkKCk7CisKKyAgY2xpZW50ZGF0YSA9IHR5cGUgPyAoU3dpZ1B5Q2xpZW50RGF0YSAqKSh0eXBlLT5jbGllbnRkYXRhKSA6IDA7CisgIG93biA9IChmbGFncyAmIFNXSUdfUE9JTlRFUl9PV04pID8gU1dJR19QT0lOVEVSX09XTiA6IDA7CisgIGlmIChjbGllbnRkYXRhICYmIGNsaWVudGRhdGEtPnB5dHlwZSkgeworICAgIFN3aWdQeU9iamVjdCAqbmV3b2JqOworICAgIGlmIChmbGFncyAmIFNXSUdfQlVJTFRJTl9UUF9JTklUKSB7CisgICAgICBuZXdvYmogPSAoU3dpZ1B5T2JqZWN0Kikgc2VsZjsKKyAgICAgIGlmIChuZXdvYmotPnB0cikgeworICAgICAgICBQeU9iamVjdCAqbmV4dF9zZWxmID0gY2xpZW50ZGF0YS0+cHl0eXBlLT50cF9hbGxvYyhjbGllbnRkYXRhLT5weXR5cGUsIDApOworICAgICAgICB3aGlsZSAobmV3b2JqLT5uZXh0KQorICAgICAgICAgIG5ld29iaiA9IChTd2lnUHlPYmplY3QgKikgbmV3b2JqLT5uZXh0OworICAgICAgICBuZXdvYmotPm5leHQgPSBuZXh0X3NlbGY7CisgICAgICAgIG5ld29iaiA9IChTd2lnUHlPYmplY3QgKiluZXh0X3NlbGY7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIG5ld29iaiA9IFB5T2JqZWN0X05ldyhTd2lnUHlPYmplY3QsIGNsaWVudGRhdGEtPnB5dHlwZSk7CisgICAgfQorICAgIGlmIChuZXdvYmopIHsKKyAgICAgIG5ld29iai0+cHRyID0gcHRyOworICAgICAgbmV3b2JqLT50eSA9IHR5cGU7CisgICAgICBuZXdvYmotPm93biA9IG93bjsKKyAgICAgIG5ld29iai0+bmV4dCA9IDA7CisjaWZkZWYgU1dJR1BZVEhPTl9CVUlMVElOCisgICAgICBuZXdvYmotPmRpY3QgPSAwOworI2VuZGlmCisgICAgICByZXR1cm4gKFB5T2JqZWN0KikgbmV3b2JqOworICAgIH0KKyAgICByZXR1cm4gU1dJR19QeV9Wb2lkKCk7CisgIH0KKworICBhc3NlcnQoIShmbGFncyAmIFNXSUdfQlVJTFRJTl9UUF9JTklUKSk7CisKKyAgcm9iaiA9IFN3aWdQeU9iamVjdF9OZXcocHRyLCB0eXBlLCBvd24pOworICBpZiAoY2xpZW50ZGF0YSAmJiAhKGZsYWdzICYgU1dJR19QT0lOVEVSX05PU0hBRE9XKSkgeworICAgIFB5T2JqZWN0ICppbnN0ID0gU1dJR19QeXRob25fTmV3U2hhZG93SW5zdGFuY2UoY2xpZW50ZGF0YSwgcm9iaik7CisgICAgaWYgKGluc3QpIHsKKyAgICAgIFB5X0RFQ1JFRihyb2JqKTsKKyAgICAgIHJvYmogPSBpbnN0OworICAgIH0KKyAgfQorICByZXR1cm4gcm9iajsKK30KKworLyogQ3JlYXRlIGEgbmV3IHBhY2tlZCBvYmplY3QgKi8KKworU1dJR1JVTlRJTUVJTkxJTkUgUHlPYmplY3QgKgorU1dJR19QeXRob25fTmV3UGFja2VkT2JqKHZvaWQgKnB0ciwgc2l6ZV90IHN6LCBzd2lnX3R5cGVfaW5mbyAqdHlwZSkgeworICByZXR1cm4gcHRyID8gU3dpZ1B5UGFja2VkX05ldygodm9pZCAqKSBwdHIsIHN6LCB0eXBlKSA6IFNXSUdfUHlfVm9pZCgpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAqICBHZXQgdHlwZSBsaXN0CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiBTV0lHX0xJTktfUlVOVElNRQordm9pZCAqU1dJR19SZXR1cm5HbG9iYWxUeXBlTGlzdCh2b2lkICopOworI2VuZGlmCisKK1NXSUdSVU5USU1FIHN3aWdfbW9kdWxlX2luZm8gKgorU1dJR19QeXRob25fR2V0TW9kdWxlKHZvaWQpIHsKKyAgc3RhdGljIHZvaWQgKnR5cGVfcG9pbnRlciA9ICh2b2lkICopMDsKKyAgLyogZmlyc3QgY2hlY2sgaWYgbW9kdWxlIGFscmVhZHkgY3JlYXRlZCAqLworICBpZiAoIXR5cGVfcG9pbnRlcikgeworI2lmZGVmIFNXSUdfTElOS19SVU5USU1FCisgICAgdHlwZV9wb2ludGVyID0gU1dJR19SZXR1cm5HbG9iYWxUeXBlTGlzdCgodm9pZCAqKTApOworI2Vsc2UKKyMgaWZkZWYgU1dJR1BZX1VTRV9DQVBTVUxFCisgICAgdHlwZV9wb2ludGVyID0gUHlDYXBzdWxlX0ltcG9ydChTV0lHUFlfQ0FQU1VMRV9OQU1FLCAwKTsKKyMgZWxzZQorICAgIHR5cGVfcG9pbnRlciA9IFB5Q09iamVjdF9JbXBvcnQoKGNoYXIqKSJzd2lnX3J1bnRpbWVfZGF0YSIgU1dJR19SVU5USU1FX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopInR5cGVfcG9pbnRlciIgU1dJR19UWVBFX1RBQkxFX05BTUUpOworIyBlbmRpZgorICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICBQeUVycl9DbGVhcigpOworICAgICAgdHlwZV9wb2ludGVyID0gKHZvaWQgKikwOworICAgIH0KKyNlbmRpZgorICB9CisgIHJldHVybiAoc3dpZ19tb2R1bGVfaW5mbyAqKSB0eXBlX3BvaW50ZXI7Cit9CisKKyNpZiBQWV9NQUpPUl9WRVJTSU9OIDwgMgorLyogUHlNb2R1bGVfQWRkT2JqZWN0IGZ1bmN0aW9uIHdhcyBpbnRyb2R1Y2VkIGluIFB5dGhvbiAyLjAuICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uCisgICBpcyBjb3BpZWQgb3V0IG9mIFB5dGhvbi9tb2RzdXBwb3J0LmMgaW4gcHl0aG9uIHZlcnNpb24gMi4zLjQgKi8KK1NXSUdJTlRFUk4gaW50CitQeU1vZHVsZV9BZGRPYmplY3QoUHlPYmplY3QgKm0sIGNoYXIgKm5hbWUsIFB5T2JqZWN0ICpvKQoreworICBQeU9iamVjdCAqZGljdDsKKyAgaWYgKCFQeU1vZHVsZV9DaGVjayhtKSkgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJQeU1vZHVsZV9BZGRPYmplY3QoKSBuZWVkcyBtb2R1bGUgYXMgZmlyc3QgYXJnIik7CisgICAgcmV0dXJuIFNXSUdfRVJST1I7CisgIH0KKyAgaWYgKCFvKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIlB5TW9kdWxlX0FkZE9iamVjdCgpIG5lZWRzIG5vbi1OVUxMIHZhbHVlIik7CisgICAgcmV0dXJuIFNXSUdfRVJST1I7CisgIH0KKworICBkaWN0ID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgaWYgKGRpY3QgPT0gTlVMTCkgeworICAgIC8qIEludGVybmFsIGVycm9yIC0tIG1vZHVsZXMgbXVzdCBoYXZlIGEgZGljdCEgKi8KKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsICJtb2R1bGUgJyVzJyBoYXMgbm8gX19kaWN0X18iLAorICAgICAgICAgICAgICAgICBQeU1vZHVsZV9HZXROYW1lKG0pKTsKKyAgICByZXR1cm4gU1dJR19FUlJPUjsKKyAgfQorICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgbmFtZSwgbykpCisgICAgcmV0dXJuIFNXSUdfRVJST1I7CisgIFB5X0RFQ1JFRihvKTsKKyAgcmV0dXJuIFNXSUdfT0s7Cit9CisjZW5kaWYKKworU1dJR1JVTlRJTUUgdm9pZAorI2lmZGVmIFNXSUdQWV9VU0VfQ0FQU1VMRQorU1dJR19QeXRob25fRGVzdHJveU1vZHVsZShQeU9iamVjdCAqb2JqKQorI2Vsc2UKK1NXSUdfUHl0aG9uX0Rlc3Ryb3lNb2R1bGUodm9pZCAqdnB0cikKKyNlbmRpZgoreworI2lmZGVmIFNXSUdQWV9VU0VfQ0FQU1VMRQorICBzd2lnX21vZHVsZV9pbmZvICpzd2lnX21vZHVsZSA9IChzd2lnX21vZHVsZV9pbmZvICopIFB5Q2Fwc3VsZV9HZXRQb2ludGVyKG9iaiwgU1dJR1BZX0NBUFNVTEVfTkFNRSk7CisjZWxzZQorICBzd2lnX21vZHVsZV9pbmZvICpzd2lnX21vZHVsZSA9IChzd2lnX21vZHVsZV9pbmZvICopIHZwdHI7CisjZW5kaWYKKyAgc3dpZ190eXBlX2luZm8gKip0eXBlcyA9IHN3aWdfbW9kdWxlLT50eXBlczsKKyAgc2l6ZV90IGk7CisgIGZvciAoaSA9MDsgaSA8IHN3aWdfbW9kdWxlLT5zaXplOyArK2kpIHsKKyAgICBzd2lnX3R5cGVfaW5mbyAqdHkgPSB0eXBlc1tpXTsKKyAgICBpZiAodHktPm93bmRhdGEpIHsKKyAgICAgIFN3aWdQeUNsaWVudERhdGEgKmRhdGEgPSAoU3dpZ1B5Q2xpZW50RGF0YSAqKSB0eS0+Y2xpZW50ZGF0YTsKKyAgICAgIGlmIChkYXRhKSBTd2lnUHlDbGllbnREYXRhX0RlbChkYXRhKTsKKyAgICB9CisgIH0KKyAgUHlfREVDUkVGKFNXSUdfVGhpcygpKTsKKyAgc3dpZ190aGlzID0gTlVMTDsKK30KKworU1dJR1JVTlRJTUUgdm9pZAorU1dJR19QeXRob25fU2V0TW9kdWxlKHN3aWdfbW9kdWxlX2luZm8gKnN3aWdfbW9kdWxlKSB7CisjaWYgUFlfVkVSU0lPTl9IRVggPj0gMHgwMzAwMDAwMAorIC8qIEFkZCBhIGR1bW15IG1vZHVsZSBvYmplY3QgaW50byBzeXMubW9kdWxlcyAqLworICBQeU9iamVjdCAqbW9kdWxlID0gUHlJbXBvcnRfQWRkTW9kdWxlKChjaGFyKikic3dpZ19ydW50aW1lX2RhdGEiIFNXSUdfUlVOVElNRV9WRVJTSU9OKTsKKyNlbHNlCisgIHN0YXRpYyBQeU1ldGhvZERlZiBzd2lnX2VtcHR5X3J1bnRpbWVfbWV0aG9kX3RhYmxlW10gPSB7IHtOVUxMLCBOVUxMLCAwLCBOVUxMfSB9OyAvKiBTZW50aW5lbCAqLworICBQeU9iamVjdCAqbW9kdWxlID0gUHlfSW5pdE1vZHVsZSgoY2hhciopInN3aWdfcnVudGltZV9kYXRhIiBTV0lHX1JVTlRJTUVfVkVSU0lPTiwgc3dpZ19lbXB0eV9ydW50aW1lX21ldGhvZF90YWJsZSk7CisjZW5kaWYKKyNpZmRlZiBTV0lHUFlfVVNFX0NBUFNVTEUKKyAgUHlPYmplY3QgKnBvaW50ZXIgPSBQeUNhcHN1bGVfTmV3KCh2b2lkICopIHN3aWdfbW9kdWxlLCBTV0lHUFlfQ0FQU1VMRV9OQU1FLCBTV0lHX1B5dGhvbl9EZXN0cm95TW9kdWxlKTsKKyAgaWYgKHBvaW50ZXIgJiYgbW9kdWxlKSB7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG1vZHVsZSwgKGNoYXIqKSJ0eXBlX3BvaW50ZXJfY2Fwc3VsZSIgU1dJR19UWVBFX1RBQkxFX05BTUUsIHBvaW50ZXIpOworICB9IGVsc2UgeworICAgIFB5X1hERUNSRUYocG9pbnRlcik7CisgIH0KKyNlbHNlCisgIFB5T2JqZWN0ICpwb2ludGVyID0gUHlDT2JqZWN0X0Zyb21Wb2lkUHRyKCh2b2lkICopIHN3aWdfbW9kdWxlLCBTV0lHX1B5dGhvbl9EZXN0cm95TW9kdWxlKTsKKyAgaWYgKHBvaW50ZXIgJiYgbW9kdWxlKSB7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG1vZHVsZSwgKGNoYXIqKSJ0eXBlX3BvaW50ZXIiIFNXSUdfVFlQRV9UQUJMRV9OQU1FLCBwb2ludGVyKTsKKyAgfSBlbHNlIHsKKyAgICBQeV9YREVDUkVGKHBvaW50ZXIpOworICB9CisjZW5kaWYKK30KKworLyogVGhlIHB5dGhvbiBjYWNoZWQgdHlwZSBxdWVyeSAqLworU1dJR1JVTlRJTUUgUHlPYmplY3QgKgorU1dJR19QeXRob25fVHlwZUNhY2hlKHZvaWQpIHsKKyAgc3RhdGljIFB5T2JqZWN0ICpTV0lHX1NUQVRJQ19QT0lOVEVSKGNhY2hlKSA9IFB5RGljdF9OZXcoKTsKKyAgcmV0dXJuIGNhY2hlOworfQorCitTV0lHUlVOVElNRSBzd2lnX3R5cGVfaW5mbyAqCitTV0lHX1B5dGhvbl9UeXBlUXVlcnkoY29uc3QgY2hhciAqdHlwZSkKK3sKKyAgUHlPYmplY3QgKmNhY2hlID0gU1dJR19QeXRob25fVHlwZUNhY2hlKCk7CisgIFB5T2JqZWN0ICprZXkgPSBTV0lHX1B5dGhvbl9zdHJfRnJvbUNoYXIodHlwZSk7CisgIFB5T2JqZWN0ICpvYmogPSBQeURpY3RfR2V0SXRlbShjYWNoZSwga2V5KTsKKyAgc3dpZ190eXBlX2luZm8gKmRlc2NyaXB0b3I7CisgIGlmIChvYmopIHsKKyNpZmRlZiBTV0lHUFlfVVNFX0NBUFNVTEUKKyAgICBkZXNjcmlwdG9yID0gKHN3aWdfdHlwZV9pbmZvICopIFB5Q2Fwc3VsZV9HZXRQb2ludGVyKG9iaiwgTlVMTCk7CisjZWxzZQorICAgIGRlc2NyaXB0b3IgPSAoc3dpZ190eXBlX2luZm8gKikgUHlDT2JqZWN0X0FzVm9pZFB0cihvYmopOworI2VuZGlmCisgIH0gZWxzZSB7CisgICAgc3dpZ19tb2R1bGVfaW5mbyAqc3dpZ19tb2R1bGUgPSBTV0lHX1B5dGhvbl9HZXRNb2R1bGUoKTsKKyAgICBkZXNjcmlwdG9yID0gU1dJR19UeXBlUXVlcnlNb2R1bGUoc3dpZ19tb2R1bGUsIHN3aWdfbW9kdWxlLCB0eXBlKTsKKyAgICBpZiAoZGVzY3JpcHRvcikgeworI2lmZGVmIFNXSUdQWV9VU0VfQ0FQU1VMRQorICAgICAgb2JqID0gUHlDYXBzdWxlX05ldygodm9pZCopIGRlc2NyaXB0b3IsIE5VTEwsIE5VTEwpOworI2Vsc2UKKyAgICAgIG9iaiA9IFB5Q09iamVjdF9Gcm9tVm9pZFB0cihkZXNjcmlwdG9yLCBOVUxMKTsKKyNlbmRpZgorICAgICAgUHlEaWN0X1NldEl0ZW0oY2FjaGUsIGtleSwgb2JqKTsKKyAgICAgIFB5X0RFQ1JFRihvYmopOworICAgIH0KKyAgfQorICBQeV9ERUNSRUYoa2V5KTsKKyAgcmV0dXJuIGRlc2NyaXB0b3I7Cit9CisKKy8qCisgICBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBvbmx5CisqLworI2RlZmluZSBTV0lHX1BPSU5URVJfRVhDRVBUSU9OICAwCisjZGVmaW5lIFNXSUdfYXJnX2ZhaWwoYXJnKSAgICAgIFNXSUdfUHl0aG9uX0FyZ0ZhaWwoYXJnKQorI2RlZmluZSBTV0lHX011c3RHZXRQdHIocCwgdHlwZSwgYXJnbnVtLCBmbGFncykgIFNXSUdfUHl0aG9uX011c3RHZXRQdHIocCwgdHlwZSwgYXJnbnVtLCBmbGFncykKKworU1dJR1JVTlRJTUUgaW50CitTV0lHX1B5dGhvbl9BZGRFcnJNZXNnKGNvbnN0IGNoYXIqIG1lc2csIGludCBpbmZyb250KQoreworICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgIFB5T2JqZWN0ICp0eXBlID0gMDsKKyAgICBQeU9iamVjdCAqdmFsdWUgPSAwOworICAgIFB5T2JqZWN0ICp0cmFjZWJhY2sgPSAwOworICAgIFB5RXJyX0ZldGNoKCZ0eXBlLCAmdmFsdWUsICZ0cmFjZWJhY2spOworICAgIGlmICh2YWx1ZSkgeworICAgICAgY2hhciAqdG1wOworICAgICAgUHlPYmplY3QgKm9sZF9zdHIgPSBQeU9iamVjdF9TdHIodmFsdWUpOworICAgICAgUHlfWElOQ1JFRih0eXBlKTsKKyAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICBpZiAoaW5mcm9udCkgeworICAgICAgICBQeUVycl9Gb3JtYXQodHlwZSwgIiVzICVzIiwgbWVzZywgdG1wID0gU1dJR19QeXRob25fc3RyX0FzQ2hhcihvbGRfc3RyKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBQeUVycl9Gb3JtYXQodHlwZSwgIiVzICVzIiwgdG1wID0gU1dJR19QeXRob25fc3RyX0FzQ2hhcihvbGRfc3RyKSwgbWVzZyk7CisgICAgICB9CisgICAgICBTV0lHX1B5dGhvbl9zdHJfRGVsRm9yUHkzKHRtcCk7CisgICAgICBQeV9ERUNSRUYob2xkX3N0cik7CisgICAgfQorICAgIHJldHVybiAxOworICB9IGVsc2UgeworICAgIHJldHVybiAwOworICB9Cit9CisKK1NXSUdSVU5USU1FIGludAorU1dJR19QeXRob25fQXJnRmFpbChpbnQgYXJnbnVtKQoreworICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgIC8qIGFkZCBpbmZvcm1hdGlvbiBhYm91dCBmYWlsaW5nIGFyZ3VtZW50ICovCisgICAgY2hhciBtZXNnWzI1Nl07CisgICAgUHlPU19zbnByaW50ZihtZXNnLCBzaXplb2YobWVzZyksICJhcmd1bWVudCBudW1iZXIgJWQ6IiwgYXJnbnVtKTsKKyAgICByZXR1cm4gU1dJR19QeXRob25fQWRkRXJyTWVzZyhtZXNnLCAxKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gMDsKKyAgfQorfQorCitTV0lHUlVOVElNRUlOTElORSBjb25zdCBjaGFyICoKK1N3aWdQeU9iamVjdF9HZXREZXNjKFB5T2JqZWN0ICpzZWxmKQoreworICBTd2lnUHlPYmplY3QgKnYgPSAoU3dpZ1B5T2JqZWN0ICopc2VsZjsKKyAgc3dpZ190eXBlX2luZm8gKnR5ID0gdiA/IHYtPnR5IDogMDsKKyAgcmV0dXJuIHR5ID8gdHktPnN0ciA6IChjaGFyKikiIjsKK30KKworU1dJR1JVTlRJTUUgdm9pZAorU1dJR19QeXRob25fVHlwZUVycm9yKGNvbnN0IGNoYXIgKnR5cGUsIFB5T2JqZWN0ICpvYmopCit7CisgIGlmICh0eXBlKSB7CisjaWYgZGVmaW5lZChTV0lHX0NPQkpFQ1RfVFlQRVMpCisgICAgaWYgKG9iaiAmJiBTd2lnUHlPYmplY3RfQ2hlY2sob2JqKSkgeworICAgICAgY29uc3QgY2hhciAqb3R5cGUgPSAoY29uc3QgY2hhciAqKSBTd2lnUHlPYmplY3RfR2V0RGVzYyhvYmopOworICAgICAgaWYgKG90eXBlKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJhICclcycgaXMgZXhwZWN0ZWQsICdTd2lnUHlPYmplY3QoJXMpJyBpcyByZWNlaXZlZCIsCisgICAgICAgICAgICAgICAgICAgICB0eXBlLCBvdHlwZSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9IGVsc2UKKyNlbmRpZgorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKm90eXBlID0gKG9iaiA/IG9iai0+b2JfdHlwZS0+dHBfbmFtZSA6IDApOworICAgICAgaWYgKG90eXBlKSB7CisgICAgICAgIFB5T2JqZWN0ICpzdHIgPSBQeU9iamVjdF9TdHIob2JqKTsKKyAgICAgICAgY29uc3QgY2hhciAqY3N0ciA9IHN0ciA/IFNXSUdfUHl0aG9uX3N0cl9Bc0NoYXIoc3RyKSA6IDA7CisgICAgICAgIGlmIChjc3RyKSB7CisgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgImEgJyVzJyBpcyBleHBlY3RlZCwgJyVzKCVzKScgaXMgcmVjZWl2ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICB0eXBlLCBvdHlwZSwgY3N0cik7CisgICAgICAgICAgU1dJR19QeXRob25fc3RyX0RlbEZvclB5Myhjc3RyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiYSAnJXMnIGlzIGV4cGVjdGVkLCAnJXMnIGlzIHJlY2VpdmVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgb3R5cGUpOworICAgICAgICB9CisgICAgICAgIFB5X1hERUNSRUYoc3RyKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiYSAnJXMnIGlzIGV4cGVjdGVkIiwgdHlwZSk7CisgIH0gZWxzZSB7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgInVuZXhwZWN0ZWQgdHlwZSBpcyByZWNlaXZlZCIpOworICB9Cit9CisKKworLyogQ29udmVydCBhIHBvaW50ZXIgdmFsdWUsIHNpZ25hbCBhbiBleGNlcHRpb24gb24gYSB0eXBlIG1pc21hdGNoICovCitTV0lHUlVOVElNRSB2b2lkICoKK1NXSUdfUHl0aG9uX011c3RHZXRQdHIoUHlPYmplY3QgKm9iaiwgc3dpZ190eXBlX2luZm8gKnR5LCBpbnQgU1dJR1VOVVNFRFBBUk0oYXJnbnVtKSwgaW50IGZsYWdzKSB7CisgIHZvaWQgKnJlc3VsdDsKKyAgaWYgKFNXSUdfUHl0aG9uX0NvbnZlcnRQdHIob2JqLCAmcmVzdWx0LCB0eSwgZmxhZ3MpID09IC0xKSB7CisgICAgUHlFcnJfQ2xlYXIoKTsKKyNpZiBTV0lHX1BPSU5URVJfRVhDRVBUSU9OCisgICAgaWYgKGZsYWdzKSB7CisgICAgICBTV0lHX1B5dGhvbl9UeXBlRXJyb3IoU1dJR19UeXBlUHJldHR5TmFtZSh0eSksIG9iaik7CisgICAgICBTV0lHX1B5dGhvbl9BcmdGYWlsKGFyZ251bSk7CisgICAgfQorI2VuZGlmCisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworU1dJR1JVTlRJTUUgaW50CitTV0lHX1B5dGhvbl9Ob25EeW5hbWljU2V0QXR0cihQeU9iamVjdCAqb2JqLCBQeU9iamVjdCAqbmFtZSwgUHlPYmplY3QgKnZhbHVlKSB7CisgIFB5VHlwZU9iamVjdCAqdHAgPSBvYmotPm9iX3R5cGU7CisgIFB5T2JqZWN0ICpkZXNjcjsKKyAgUHlPYmplY3QgKmVuY29kZWRfbmFtZTsKKyAgZGVzY3JzZXRmdW5jIGY7CisgIGludCByZXM7CisKKyNpZmRlZiBQeV9VU0lOR19VTklDT0RFCisgIGlmIChQeVN0cmluZ19DaGVjayhuYW1lKSkgeworICAgIG5hbWUgPSBQeVVuaWNvZGVfRGVjb2RlKFB5U3RyaW5nX0FzU3RyaW5nKG5hbWUpLCBQeVN0cmluZ19TaXplKG5hbWUpLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAoIW5hbWUpCisgICAgICByZXR1cm4gLTE7CisgIH0gZWxzZSBpZiAoIVB5VW5pY29kZV9DaGVjayhuYW1lKSkKKyNlbHNlCisgIGlmICghUHlTdHJpbmdfQ2hlY2sobmFtZSkpCisjZW5kaWYKKyAgeworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJhdHRyaWJ1dGUgbmFtZSBtdXN0IGJlIHN0cmluZywgbm90ICclLjIwMHMnIiwgbmFtZS0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgcmV0dXJuIC0xOworICB9IGVsc2UgeworICAgIFB5X0lOQ1JFRihuYW1lKTsKKyAgfQorCisgIGlmICghdHAtPnRwX2RpY3QpIHsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KHRwKSA8IDApCisgICAgICBnb3RvIGRvbmU7CisgIH0KKworICByZXMgPSAtMTsKKyAgZGVzY3IgPSBfUHlUeXBlX0xvb2t1cCh0cCwgbmFtZSk7CisgIGYgPSBOVUxMOworICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICBmID0gZGVzY3ItPm9iX3R5cGUtPnRwX2Rlc2NyX3NldDsKKyAgaWYgKCFmKSB7CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKG5hbWUpKSB7CisgICAgICBlbmNvZGVkX25hbWUgPSBuYW1lOworICAgICAgUHlfSU5DUkVGKG5hbWUpOworICAgIH0gZWxzZSB7CisgICAgICBlbmNvZGVkX25hbWUgPSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKG5hbWUpOworICAgIH0KKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfQXR0cmlidXRlRXJyb3IsICInJS4xMDBzJyBvYmplY3QgaGFzIG5vIGF0dHJpYnV0ZSAnJS4yMDBzJyIsIHRwLT50cF9uYW1lLCBQeVN0cmluZ19Bc1N0cmluZyhlbmNvZGVkX25hbWUpKTsKKyAgICBQeV9ERUNSRUYoZW5jb2RlZF9uYW1lKTsKKyAgfSBlbHNlIHsKKyAgICByZXMgPSBmKGRlc2NyLCBvYmosIHZhbHVlKTsKKyAgfQorCisgIGRvbmU6CisgIFB5X0RFQ1JFRihuYW1lKTsKKyAgcmV0dXJuIHJlczsKK30KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisKKworI2RlZmluZSBTV0lHX2V4Y2VwdGlvbl9mYWlsKGNvZGUsIG1zZykgZG8geyBTV0lHX0Vycm9yKGNvZGUsIG1zZyk7IFNXSUdfZmFpbDsgfSB3aGlsZSgwKQorCisjZGVmaW5lIFNXSUdfY29udHJhY3RfYXNzZXJ0KGV4cHIsIG1zZykgaWYgKCEoZXhwcikpIHsgU1dJR19FcnJvcihTV0lHX1J1bnRpbWVFcnJvciwgbXNnKTsgU1dJR19mYWlsOyB9IGVsc2UKKworCisKKyAgI2RlZmluZSBTV0lHX2V4Y2VwdGlvbihjb2RlLCBtc2cpIGRvIHsgU1dJR19FcnJvcihjb2RlLCBtc2cpOyBTV0lHX2ZhaWw7OyB9IHdoaWxlKDApCisKKworLyogLS0tLS0tLS0gVFlQRVMgVEFCTEUgKEJFR0lOKSAtLS0tLS0tLSAqLworCisjZGVmaW5lIFNXSUdUWVBFX3BfY2hhciBzd2lnX3R5cGVzWzBdCisjZGVmaW5lIFNXSUdUWVBFX3BfaW50IHN3aWdfdHlwZXNbMV0KKyNkZWZpbmUgU1dJR1RZUEVfcF91aW50OF90IHN3aWdfdHlwZXNbMl0KK3N0YXRpYyBzd2lnX3R5cGVfaW5mbyAqc3dpZ190eXBlc1s0XTsKK3N0YXRpYyBzd2lnX21vZHVsZV9pbmZvIHN3aWdfbW9kdWxlID0ge3N3aWdfdHlwZXMsIDMsIDAsIDAsIDAsIDB9OworI2RlZmluZSBTV0lHX1R5cGVRdWVyeShuYW1lKSBTV0lHX1R5cGVRdWVyeU1vZHVsZSgmc3dpZ19tb2R1bGUsICZzd2lnX21vZHVsZSwgbmFtZSkKKyNkZWZpbmUgU1dJR19NYW5nbGVkVHlwZVF1ZXJ5KG5hbWUpIFNXSUdfTWFuZ2xlZFR5cGVRdWVyeU1vZHVsZSgmc3dpZ19tb2R1bGUsICZzd2lnX21vZHVsZSwgbmFtZSkKKworLyogLS0tLS0tLS0gVFlQRVMgVEFCTEUgKEVORCkgLS0tLS0tLS0gKi8KKworI2lmIChQWV9WRVJTSU9OX0hFWCA8PSAweDAyMDAwMDAwKQorIyBpZiAhZGVmaW5lZChTV0lHX1BZVEhPTl9DTEFTU0lDKQorIyAgZXJyb3IgIlRoaXMgcHl0aG9uIHZlcnNpb24gcmVxdWlyZXMgc3dpZyB0byBiZSBydW4gd2l0aCB0aGUgJy1jbGFzc2ljJyBvcHRpb24iCisjIGVuZGlmCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICBAKHRhcmdldCk6PSBfbGlid2VicC5zbworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIFBZX1ZFUlNJT05fSEVYID49IDB4MDMwMDAwMDAKKyMgIGRlZmluZSBTV0lHX2luaXQgICAgUHlJbml0X19saWJ3ZWJwCisKKyNlbHNlCisjICBkZWZpbmUgU1dJR19pbml0ICAgIGluaXRfbGlid2VicAorCisjZW5kaWYKKyNkZWZpbmUgU1dJR19uYW1lICAgICJfbGlid2VicCIKKworI2RlZmluZSBTV0lHVkVSU0lPTiAweDAyMDAwNAorI2RlZmluZSBTV0lHX1ZFUlNJT04gU1dJR1ZFUlNJT04KKworCisjZGVmaW5lIFNXSUdfYXNfdm9pZHB0cihhKSAodm9pZCAqKSgoY29uc3Qgdm9pZCAqKShhKSkKKyNkZWZpbmUgU1dJR19hc192b2lkcHRycHRyKGEpICgodm9pZClTV0lHX2FzX3ZvaWRwdHIoKmEpLCh2b2lkKiopKGEpKQorCisKKyAgI2RlZmluZSBTV0lHX0Zyb21fbG9uZyAgIFB5SW50X0Zyb21Mb25nCisKKworU1dJR0lOVEVSTklOTElORSBQeU9iamVjdCAqCitTV0lHX0Zyb21faW50ICAoaW50IHZhbHVlKQoreworICByZXR1cm4gU1dJR19Gcm9tX2xvbmcgICh2YWx1ZSk7Cit9CisKKworU1dJR0lOVEVSTiBzd2lnX3R5cGVfaW5mbyoKK1NXSUdfcGNoYXJfZGVzY3JpcHRvcih2b2lkKQoreworICBzdGF0aWMgaW50IGluaXQgPSAwOworICBzdGF0aWMgc3dpZ190eXBlX2luZm8qIGluZm8gPSAwOworICBpZiAoIWluaXQpIHsKKyAgICBpbmZvID0gU1dJR19UeXBlUXVlcnkoIl9wX2NoYXIiKTsKKyAgICBpbml0ID0gMTsKKyAgfQorICByZXR1cm4gaW5mbzsKK30KKworCitTV0lHSU5URVJOIGludAorU1dJR19Bc0NoYXJQdHJBbmRTaXplKFB5T2JqZWN0ICpvYmosIGNoYXIqKiBjcHRyLCBzaXplX3QqIHBzaXplLCBpbnQgKmFsbG9jKQoreworI2lmIFBZX1ZFUlNJT05fSEVYPj0weDAzMDAwMDAwCisgIGlmIChQeVVuaWNvZGVfQ2hlY2sob2JqKSkKKyNlbHNlCisgIGlmIChQeVN0cmluZ19DaGVjayhvYmopKQorI2VuZGlmCisgIHsKKyAgICBjaGFyICpjc3RyOyBQeV9zc2l6ZV90IGxlbjsKKyNpZiBQWV9WRVJTSU9OX0hFWD49MHgwMzAwMDAwMAorICAgIGlmICghYWxsb2MgJiYgY3B0cikgeworICAgICAgICAvKiBXZSBjYW4ndCBhbGxvdyBjb252ZXJ0aW5nIHdpdGhvdXQgYWxsb2NhdGlvbiwgc2luY2UgdGhlIGludGVybmFsCisgICAgICAgICAgIHJlcHJlc2VudGF0aW9uIG9mIHN0cmluZyBpbiBQeXRob24gMyBpcyBVQ1MtMi9VQ1MtNCBidXQgd2UgcmVxdWlyZQorICAgICAgICAgICBhIFVURi04IHJlcHJlc2VudGF0aW9uLgorICAgICAgICAgICBUT0RPKGJoeSkgTW9yZSBkZXRhaWxlZCBleHBsYW5hdGlvbiAqLworICAgICAgICByZXR1cm4gU1dJR19SdW50aW1lRXJyb3I7CisgICAgfQorICAgIG9iaiA9IFB5VW5pY29kZV9Bc1VURjhTdHJpbmcob2JqKTsKKyAgICBQeUJ5dGVzX0FzU3RyaW5nQW5kU2l6ZShvYmosICZjc3RyLCAmbGVuKTsKKyAgICBpZihhbGxvYykgKmFsbG9jID0gU1dJR19ORVdPQko7CisjZWxzZQorICAgIFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShvYmosICZjc3RyLCAmbGVuKTsKKyNlbmRpZgorICAgIGlmIChjcHRyKSB7CisgICAgICBpZiAoYWxsb2MpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICAgSW4gcHl0aG9uIHRoZSB1c2VyIHNob3VsZCBub3QgYmUgYWJsZSB0byBtb2RpZnkgdGhlIGlubmVyCisgICAgICAgICAgIHN0cmluZyByZXByZXNlbnRhdGlvbi4gVG8gd2FycmFudHkgdGhhdCwgaWYgeW91IGRlZmluZQorICAgICAgICAgICBTV0lHX1BZVEhPTl9TQUZFX0NTVFJJTkdTLCBhIG5ldy9jb3B5IG9mIHRoZSBweXRob24gc3RyaW5nCisgICAgICAgICAgIGJ1ZmZlciBpcyBhbHdheXMgcmV0dXJuZWQuCisKKyAgICAgICAgICAgVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMganVzdCB0byByZXR1cm4gdGhlIHBvaW50ZXIgdmFsdWUsCisgICAgICAgICAgIHNvLCBiZSBjYXJlZnVsLgorICAgICAgICAqLworI2lmIGRlZmluZWQoU1dJR19QWVRIT05fU0FGRV9DU1RSSU5HUykKKyAgICAgICAgaWYgKCphbGxvYyAhPSBTV0lHX09MRE9CSikKKyNlbHNlCisgICAgICAgIGlmICgqYWxsb2MgPT0gU1dJR19ORVdPQkopCisjZW5kaWYKKyAgICAgICAgICB7CisgICAgICAgICAgICAqY3B0ciA9IChjaGFyICopbWVtY3B5KChjaGFyICopbWFsbG9jKChsZW4gKyAxKSpzaXplb2YoY2hhcikpLCBjc3RyLCBzaXplb2YoY2hhcikqKGxlbiArIDEpKTsKKyAgICAgICAgICAgICphbGxvYyA9IFNXSUdfTkVXT0JKOworICAgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgKmNwdHIgPSBjc3RyOworICAgICAgICAgICphbGxvYyA9IFNXSUdfT0xET0JKOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAjaWYgUFlfVkVSU0lPTl9IRVg+PTB4MDMwMDAwMDAKKyAgICAgICAgYXNzZXJ0KDApOyAvKiBTaG91bGQgbmV2ZXIgcmVhY2ggaGVyZSBpbiBQeXRob24gMyAqLworICAgICAgICAjZW5kaWYKKyAgICAgICAgKmNwdHIgPSBTV0lHX1B5dGhvbl9zdHJfQXNDaGFyKG9iaik7CisgICAgICB9CisgICAgfQorICAgIGlmIChwc2l6ZSkgKnBzaXplID0gbGVuICsgMTsKKyNpZiBQWV9WRVJTSU9OX0hFWD49MHgwMzAwMDAwMAorICAgIFB5X1hERUNSRUYob2JqKTsKKyNlbmRpZgorICAgIHJldHVybiBTV0lHX09LOworICB9IGVsc2UgeworICAgIHN3aWdfdHlwZV9pbmZvKiBwY2hhcl9kZXNjcmlwdG9yID0gU1dJR19wY2hhcl9kZXNjcmlwdG9yKCk7CisgICAgaWYgKHBjaGFyX2Rlc2NyaXB0b3IpIHsKKyAgICAgIHZvaWQqIHZwdHIgPSAwOworICAgICAgaWYgKFNXSUdfQ29udmVydFB0cihvYmosICZ2cHRyLCBwY2hhcl9kZXNjcmlwdG9yLCAwKSA9PSBTV0lHX09LKSB7CisgICAgICAgIGlmIChjcHRyKSAqY3B0ciA9IChjaGFyICopIHZwdHI7CisgICAgICAgIGlmIChwc2l6ZSkgKnBzaXplID0gdnB0ciA/IChzdHJsZW4oKGNoYXIgKil2cHRyKSArIDEpIDogMDsKKyAgICAgICAgaWYgKGFsbG9jKSAqYWxsb2MgPSBTV0lHX09MRE9CSjsKKyAgICAgICAgcmV0dXJuIFNXSUdfT0s7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBTV0lHX1R5cGVFcnJvcjsKK30KKworCitTV0lHSU5URVJOIGludAorU1dJR19Bc1ZhbF9kb3VibGUgKFB5T2JqZWN0ICpvYmosIGRvdWJsZSAqdmFsKQoreworICBpbnQgcmVzID0gU1dJR19UeXBlRXJyb3I7CisgIGlmIChQeUZsb2F0X0NoZWNrKG9iaikpIHsKKyAgICBpZiAodmFsKSAqdmFsID0gUHlGbG9hdF9Bc0RvdWJsZShvYmopOworICAgIHJldHVybiBTV0lHX09LOworICB9IGVsc2UgaWYgKFB5SW50X0NoZWNrKG9iaikpIHsKKyAgICBpZiAodmFsKSAqdmFsID0gUHlJbnRfQXNMb25nKG9iaik7CisgICAgcmV0dXJuIFNXSUdfT0s7CisgIH0gZWxzZSBpZiAoUHlMb25nX0NoZWNrKG9iaikpIHsKKyAgICBkb3VibGUgdiA9IFB5TG9uZ19Bc0RvdWJsZShvYmopOworICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgaWYgKHZhbCkgKnZhbCA9IHY7CisgICAgICByZXR1cm4gU1dJR19PSzsKKyAgICB9IGVsc2UgeworICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICB9CisgIH0KKyNpZmRlZiBTV0lHX1BZVEhPTl9DQVNUX01PREUKKyAgeworICAgIGludCBkaXNwYXRjaCA9IDA7CisgICAgZG91YmxlIGQgPSBQeUZsb2F0X0FzRG91YmxlKG9iaik7CisgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICBpZiAodmFsKSAqdmFsID0gZDsKKyAgICAgIHJldHVybiBTV0lHX0FkZENhc3QoU1dJR19PSyk7CisgICAgfSBlbHNlIHsKKyAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgfQorICAgIGlmICghZGlzcGF0Y2gpIHsKKyAgICAgIGxvbmcgdiA9IFB5TG9uZ19Bc0xvbmcob2JqKTsKKyAgICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBpZiAodmFsKSAqdmFsID0gdjsKKyAgICAgICAgcmV0dXJuIFNXSUdfQWRkQ2FzdChTV0lHX0FkZENhc3QoU1dJR19PSykpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyNlbmRpZgorICByZXR1cm4gcmVzOworfQorCisKKyNpbmNsdWRlIDxmbG9hdC5oPgorCisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKworU1dJR0lOVEVSTklOTElORSBpbnQKK1NXSUdfQ2FuQ2FzdEFzSW50ZWdlcihkb3VibGUgKmQsIGRvdWJsZSBtaW4sIGRvdWJsZSBtYXgpIHsKKyAgZG91YmxlIHggPSAqZDsKKyAgaWYgKChtaW4gPD0geCAmJiB4IDw9IG1heCkpIHsKKyAgIGRvdWJsZSBmeCA9IGZsb29yKHgpOworICAgZG91YmxlIGN4ID0gY2VpbCh4KTsKKyAgIGRvdWJsZSByZCA9ICAoKHggLSBmeCkgPCAwLjUpID8gZnggOiBjeDsgLyogc2ltcGxlIHJpbnQgKi8KKyAgIGlmICgoZXJybm8gPT0gRURPTSkgfHwgKGVycm5vID09IEVSQU5HRSkpIHsKKyAgICAgZXJybm8gPSAwOworICAgfSBlbHNlIHsKKyAgICAgZG91YmxlIHN1bW0sIHJlcHMsIGRpZmY7CisgICAgIGlmIChyZCA8IHgpIHsKKyAgICAgICBkaWZmID0geCAtIHJkOworICAgICB9IGVsc2UgaWYgKHJkID4geCkgeworICAgICAgIGRpZmYgPSByZCAtIHg7CisgICAgIH0gZWxzZSB7CisgICAgICAgcmV0dXJuIDE7CisgICAgIH0KKyAgICAgc3VtbSA9IHJkICsgeDsKKyAgICAgcmVwcyA9IGRpZmYvc3VtbTsKKyAgICAgaWYgKHJlcHMgPCA4KkRCTF9FUFNJTE9OKSB7CisgICAgICAgKmQgPSByZDsKKyAgICAgICByZXR1cm4gMTsKKyAgICAgfQorICAgfQorICB9CisgIHJldHVybiAwOworfQorCisKK1NXSUdJTlRFUk4gaW50CitTV0lHX0FzVmFsX3Vuc2lnbmVkX1NTX2xvbmcgKFB5T2JqZWN0ICpvYmosIHVuc2lnbmVkIGxvbmcgKnZhbCkKK3sKKyAgaWYgKFB5SW50X0NoZWNrKG9iaikpIHsKKyAgICBsb25nIHYgPSBQeUludF9Bc0xvbmcob2JqKTsKKyAgICBpZiAodiA+PSAwKSB7CisgICAgICBpZiAodmFsKSAqdmFsID0gdjsKKyAgICAgIHJldHVybiBTV0lHX09LOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gU1dJR19PdmVyZmxvd0Vycm9yOworICAgIH0KKyAgfSBlbHNlIGlmIChQeUxvbmdfQ2hlY2sob2JqKSkgeworICAgIHVuc2lnbmVkIGxvbmcgdiA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZyhvYmopOworICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgaWYgKHZhbCkgKnZhbCA9IHY7CisgICAgICByZXR1cm4gU1dJR19PSzsKKyAgICB9IGVsc2UgeworICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICB9CisgIH0KKyNpZmRlZiBTV0lHX1BZVEhPTl9DQVNUX01PREUKKyAgeworICAgIGludCBkaXNwYXRjaCA9IDA7CisgICAgdW5zaWduZWQgbG9uZyB2ID0gUHlMb25nX0FzVW5zaWduZWRMb25nKG9iaik7CisgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICBpZiAodmFsKSAqdmFsID0gdjsKKyAgICAgIHJldHVybiBTV0lHX0FkZENhc3QoU1dJR19PSyk7CisgICAgfSBlbHNlIHsKKyAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgfQorICAgIGlmICghZGlzcGF0Y2gpIHsKKyAgICAgIGRvdWJsZSBkOworICAgICAgaW50IHJlcyA9IFNXSUdfQWRkQ2FzdChTV0lHX0FzVmFsX2RvdWJsZSAob2JqLCZkKSk7CisgICAgICBpZiAoU1dJR19Jc09LKHJlcykgJiYgU1dJR19DYW5DYXN0QXNJbnRlZ2VyKCZkLCAwLCBVTE9OR19NQVgpKSB7CisgICAgICAgIGlmICh2YWwpICp2YWwgPSAodW5zaWduZWQgbG9uZykoZCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgICB9CisgICAgfQorICB9CisjZW5kaWYKKyAgcmV0dXJuIFNXSUdfVHlwZUVycm9yOworfQorCisKK1NXSUdJTlRFUk5JTkxJTkUgaW50CitTV0lHX0FzVmFsX3NpemVfdCAoUHlPYmplY3QgKiBvYmosIHNpemVfdCAqdmFsKQoreworICB1bnNpZ25lZCBsb25nIHY7CisgIGludCByZXMgPSBTV0lHX0FzVmFsX3Vuc2lnbmVkX1NTX2xvbmcgKG9iaiwgdmFsID8gJnYgOiAwKTsKKyAgaWYgKFNXSUdfSXNPSyhyZXMpICYmIHZhbCkgKnZhbCA9IChzaXplX3QpKHYpOworICByZXR1cm4gcmVzOworfQorCisKKyNpbmNsdWRlICJ3ZWJwL2RlY29kZS5oIgorI2luY2x1ZGUgIndlYnAvZW5jb2RlLmgiCisKKworc3RhdGljIHNpemVfdCBSZXR1cm5lZEJ1ZmZlclNpemUoCisgICAgY29uc3QgY2hhciogZnVuY3Rpb24sIGludCogd2lkdGgsIGludCogaGVpZ2h0KSB7CisgIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2l6ZW1hcCB7CisgICAgY29uc3QgY2hhciogZnVuY3Rpb247CisgICAgaW50IHNpemVfbXVsdGlwbGllcjsKKyAgfSBzaXplX21hcFtdID0geworI2lmZGVmIFNXSUdKQVZBCisgICAgeyAiSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV9XZWJQRGVjb2RlUkdCIiwgIDMgfSwKKyAgICB7ICJKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX1dlYlBEZWNvZGVSR0JBIiwgNCB9LAorICAgIHsgIkphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfV2ViUERlY29kZUFSR0IiLCA0IH0sCisgICAgeyAiSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV9XZWJQRGVjb2RlQkdSIiwgIDMgfSwKKyAgICB7ICJKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX1dlYlBEZWNvZGVCR1JBIiwgNCB9LAorICAgIHsgIkphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfd3JhcF8xV2ViUEVuY29kZVJHQiIsICAxIH0sCisgICAgeyAiSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV93cmFwXzFXZWJQRW5jb2RlQkdSIiwgIDEgfSwKKyAgICB7ICJKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX3dyYXBfMVdlYlBFbmNvZGVSR0JBIiwgMSB9LAorICAgIHsgIkphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfd3JhcF8xV2ViUEVuY29kZUJHUkEiLCAxIH0sCisgICAgeyAiSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV93cmFwXzFXZWJQRW5jb2RlTG9zc2xlc3NSR0IiLCAgMSB9LAorICAgIHsgIkphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfd3JhcF8xV2ViUEVuY29kZUxvc3NsZXNzQkdSIiwgIDEgfSwKKyAgICB7ICJKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX3dyYXBfMVdlYlBFbmNvZGVMb3NzbGVzc1JHQkEiLCAxIH0sCisgICAgeyAiSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV93cmFwXzFXZWJQRW5jb2RlTG9zc2xlc3NCR1JBIiwgMSB9LAorI2VuZGlmCisjaWZkZWYgU1dJR1BZVEhPTgorICAgIHsgIldlYlBEZWNvZGVSR0IiLCAgMyB9LAorICAgIHsgIldlYlBEZWNvZGVSR0JBIiwgNCB9LAorICAgIHsgIldlYlBEZWNvZGVBUkdCIiwgNCB9LAorICAgIHsgIldlYlBEZWNvZGVCR1IiLCAgMyB9LAorICAgIHsgIldlYlBEZWNvZGVCR1JBIiwgNCB9LAorICAgIHsgIndyYXBfV2ViUEVuY29kZVJHQiIsICAxIH0sCisgICAgeyAid3JhcF9XZWJQRW5jb2RlQkdSIiwgIDEgfSwKKyAgICB7ICJ3cmFwX1dlYlBFbmNvZGVSR0JBIiwgMSB9LAorICAgIHsgIndyYXBfV2ViUEVuY29kZUJHUkEiLCAxIH0sCisgICAgeyAid3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NSR0IiLCAgMSB9LAorICAgIHsgIndyYXBfV2ViUEVuY29kZUxvc3NsZXNzQkdSIiwgIDEgfSwKKyAgICB7ICJ3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc1JHQkEiLCAxIH0sCisgICAgeyAid3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NCR1JBIiwgMSB9LAorI2VuZGlmCisgICAgeyBOVUxMLCAwIH0KKyAgfTsKKyAgY29uc3Qgc3RydWN0IHNpemVtYXAqIHA7CisgIHNpemVfdCBzaXplID0gMDsKKworICBmb3IgKHAgPSBzaXplX21hcDsgcC0+ZnVuY3Rpb247ICsrcCkgeworICAgIGlmICghc3RyY21wKGZ1bmN0aW9uLCBwLT5mdW5jdGlvbikpIHsKKyAgICAgIHNpemUgPSAqd2lkdGggKiAqaGVpZ2h0ICogcC0+c2l6ZV9tdWx0aXBsaWVyOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHNpemU7Cit9CisKKwordHlwZWRlZiBzaXplX3QgKCpXZWJQRW5jb2RlRnVuY3Rpb24pKGNvbnN0IHVpbnQ4X3QqIHJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcXVhbGl0eV9mYWN0b3IsIHVpbnQ4X3QqKiBvdXRwdXQpOwordHlwZWRlZiBzaXplX3QgKCpXZWJQRW5jb2RlTG9zc2xlc3NGdW5jdGlvbikoY29uc3QgdWludDhfdCogcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIG91dHB1dCk7CisKK3N0YXRpYyB1aW50OF90KiBFbmNvZGVMb3NzeShjb25zdCB1aW50OF90KiByZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHF1YWxpdHlfZmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBFbmNvZGVGdW5jdGlvbiBlbmNmbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIG91dHB1dF9zaXplLCBpbnQqIHVudXNlZCkgeworICB1aW50OF90KiBvdXRwdXQgPSBOVUxMOworICBjb25zdCBzaXplX3QgaW1hZ2Vfc2l6ZSA9CisgICAgICBlbmNmbihyZ2IsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgcXVhbGl0eV9mYWN0b3IsICZvdXRwdXQpOworICAvLyB0aGUgdmFsdWVzIG9mIGZvbGxvd2luZyB0d28gd2lsbCBiZSBpbnRlcnByZXRlZCBieSBSZXR1cm5lZEJ1ZmZlclNpemUoKQorICAvLyBhcyAnd2lkdGgnIGFuZCAnaGVpZ2h0JyBpbiB0aGUgc2l6ZSBjYWxjdWxhdGlvbi4KKyAgKm91dHB1dF9zaXplID0gaW1hZ2Vfc2l6ZTsKKyAgKnVudXNlZCA9IDE7CisgIHJldHVybiBpbWFnZV9zaXplID8gb3V0cHV0IDogTlVMTDsKK30KKworc3RhdGljIHVpbnQ4X3QqIEVuY29kZUxvc3NsZXNzKGNvbnN0IHVpbnQ4X3QqIHJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUEVuY29kZUxvc3NsZXNzRnVuY3Rpb24gZW5jZm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBvdXRwdXRfc2l6ZSwgaW50KiB1bnVzZWQpIHsKKyAgdWludDhfdCogb3V0cHV0ID0gTlVMTDsKKyAgY29uc3Qgc2l6ZV90IGltYWdlX3NpemUgPSBlbmNmbihyZ2IsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgJm91dHB1dCk7CisgIC8vIHRoZSB2YWx1ZXMgb2YgdGhlIGZvbGxvd2luZyB0d28gd2lsbCBiZSBpbnRlcnByZXRlZCBieQorICAvLyBSZXR1cm5lZEJ1ZmZlclNpemUoKSBhcyAnd2lkdGgnIGFuZCAnaGVpZ2h0JyBpbiB0aGUgc2l6ZSBjYWxjdWxhdGlvbi4KKyAgKm91dHB1dF9zaXplID0gaW1hZ2Vfc2l6ZTsKKyAgKnVudXNlZCA9IDE7CisgIHJldHVybiBpbWFnZV9zaXplID8gb3V0cHV0IDogTlVMTDsKK30KKworCisvLyBDaGFuZ2VzIHRoZSByZXR1cm4gdHlwZSBvZiBXZWJQRW5jb2RlKiB0byBtb3JlIGNsb3NlbHkgbWF0Y2ggRGVjb2RlKi4KKy8vIFRoaXMgYWxzbyBtYWtlcyBpdCBlYXNpZXIgdG8gd3JhcCB0aGUgb3V0cHV0IGJ1ZmZlciBpbiBhIG5hdGl2ZSB0eXBlIHJhdGhlcgorLy8gdGhhbiBkZWFsaW5nIHdpdGggdGhlIHJldHVybiBwb2ludGVyLgorLy8gVGhlIGFkZGl0aW9uYWwgcGFyYW1ldGVycyBhcmUgdG8gYWxsb3cgcmV1c2Ugb2YgUmV0dXJuZWRCdWZmZXJTaXplKCksCisvLyB1bnVzZWQyIGFuZCBvdXRwdXRfc2l6ZSB3aWxsIGJlIHVzZWQgaW4gdGhpcyBjYXNlLgorI2RlZmluZSBMT1NTWV9XUkFQUEVSKEZVTkMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgdWludDhfdCogd3JhcF8jI0ZVTkMoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY29uc3QgdWludDhfdCogcmdiLCBpbnQqIHVudXNlZDEsIGludCogdW51c2VkMiwgaW50KiBvdXRwdXRfc2l6ZSwgXAorICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLCBmbG9hdCBxdWFsaXR5X2ZhY3RvcikgeyAgICAgICAgXAorICAgIHJldHVybiBFbmNvZGVMb3NzeShyZ2IsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgcXVhbGl0eV9mYWN0b3IsICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICBGVU5DLCBvdXRwdXRfc2l6ZSwgdW51c2VkMik7ICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCitMT1NTWV9XUkFQUEVSKFdlYlBFbmNvZGVSR0IpCitMT1NTWV9XUkFQUEVSKFdlYlBFbmNvZGVCR1IpCitMT1NTWV9XUkFQUEVSKFdlYlBFbmNvZGVSR0JBKQorTE9TU1lfV1JBUFBFUihXZWJQRW5jb2RlQkdSQSkKKworI3VuZGVmIExPU1NZX1dSQVBQRVIKKworI2RlZmluZSBMT1NTTEVTU19XUkFQUEVSKEZVTkMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgdWludDhfdCogd3JhcF8jI0ZVTkMoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY29uc3QgdWludDhfdCogcmdiLCBpbnQqIHVudXNlZDEsIGludCogdW51c2VkMiwgaW50KiBvdXRwdXRfc2l6ZSwgXAorICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBFbmNvZGVMb3NzbGVzcyhyZ2IsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVU5DLCBvdXRwdXRfc2l6ZSwgdW51c2VkMik7ICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCitMT1NTTEVTU19XUkFQUEVSKFdlYlBFbmNvZGVMb3NzbGVzc1JHQikKK0xPU1NMRVNTX1dSQVBQRVIoV2ViUEVuY29kZUxvc3NsZXNzQkdSKQorTE9TU0xFU1NfV1JBUFBFUihXZWJQRW5jb2RlTG9zc2xlc3NSR0JBKQorTE9TU0xFU1NfV1JBUFBFUihXZWJQRW5jb2RlTG9zc2xlc3NCR1JBKQorCisjdW5kZWYgTE9TU0xFU1NfV1JBUFBFUgorCisKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2lmICFkZWZpbmVkKFNXSUdfTk9fTExPTkdfTUFYKQorIyBpZiAhZGVmaW5lZChMTE9OR19NQVgpICYmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQgKF9fTE9OR19MT05HX01BWF9fKQorIyAgIGRlZmluZSBMTE9OR19NQVggX19MT05HX0xPTkdfTUFYX18KKyMgICBkZWZpbmUgTExPTkdfTUlOICgtTExPTkdfTUFYIC0gMUxMKQorIyAgIGRlZmluZSBVTExPTkdfTUFYIChMTE9OR19NQVggKiAyVUxMICsgMVVMTCkKKyMgZW5kaWYKKyNlbmRpZgorCisKK1NXSUdJTlRFUk4gaW50CitTV0lHX0FzVmFsX2xvbmcgKFB5T2JqZWN0ICpvYmosIGxvbmcqIHZhbCkKK3sKKyAgaWYgKFB5SW50X0NoZWNrKG9iaikpIHsKKyAgICBpZiAodmFsKSAqdmFsID0gUHlJbnRfQXNMb25nKG9iaik7CisgICAgcmV0dXJuIFNXSUdfT0s7CisgIH0gZWxzZSBpZiAoUHlMb25nX0NoZWNrKG9iaikpIHsKKyAgICBsb25nIHYgPSBQeUxvbmdfQXNMb25nKG9iaik7CisgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICBpZiAodmFsKSAqdmFsID0gdjsKKyAgICAgIHJldHVybiBTV0lHX09LOworICAgIH0gZWxzZSB7CisgICAgICBQeUVycl9DbGVhcigpOworICAgIH0KKyAgfQorI2lmZGVmIFNXSUdfUFlUSE9OX0NBU1RfTU9ERQorICB7CisgICAgaW50IGRpc3BhdGNoID0gMDsKKyAgICBsb25nIHYgPSBQeUludF9Bc0xvbmcob2JqKTsKKyAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgIGlmICh2YWwpICp2YWwgPSB2OworICAgICAgcmV0dXJuIFNXSUdfQWRkQ2FzdChTV0lHX09LKTsKKyAgICB9IGVsc2UgeworICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICB9CisgICAgaWYgKCFkaXNwYXRjaCkgeworICAgICAgZG91YmxlIGQ7CisgICAgICBpbnQgcmVzID0gU1dJR19BZGRDYXN0KFNXSUdfQXNWYWxfZG91YmxlIChvYmosJmQpKTsKKyAgICAgIGlmIChTV0lHX0lzT0socmVzKSAmJiBTV0lHX0NhbkNhc3RBc0ludGVnZXIoJmQsIExPTkdfTUlOLCBMT05HX01BWCkpIHsKKyAgICAgICAgaWYgKHZhbCkgKnZhbCA9IChsb25nKShkKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgIH0KKyAgICB9CisgIH0KKyNlbmRpZgorICByZXR1cm4gU1dJR19UeXBlRXJyb3I7Cit9CisKKworU1dJR0lOVEVSTiBpbnQKK1NXSUdfQXNWYWxfaW50IChQeU9iamVjdCAqIG9iaiwgaW50ICp2YWwpCit7CisgIGxvbmcgdjsKKyAgaW50IHJlcyA9IFNXSUdfQXNWYWxfbG9uZyAob2JqLCAmdik7CisgIGlmIChTV0lHX0lzT0socmVzKSkgeworICAgIGlmICgodiA8IElOVF9NSU4gfHwgdiA+IElOVF9NQVgpKSB7CisgICAgICByZXR1cm4gU1dJR19PdmVyZmxvd0Vycm9yOworICAgIH0gZWxzZSB7CisgICAgICBpZiAodmFsKSAqdmFsID0gKGludCkodik7CisgICAgfQorICB9CisgIHJldHVybiByZXM7Cit9CisKKworU1dJR0lOVEVSTiBpbnQKK1NXSUdfQXNWYWxfZmxvYXQgKFB5T2JqZWN0ICogb2JqLCBmbG9hdCAqdmFsKQoreworICBkb3VibGUgdjsKKyAgaW50IHJlcyA9IFNXSUdfQXNWYWxfZG91YmxlIChvYmosICZ2KTsKKyAgaWYgKFNXSUdfSXNPSyhyZXMpKSB7CisgICAgaWYgKCh2IDwgLUZMVF9NQVggfHwgdiA+IEZMVF9NQVgpKSB7CisgICAgICByZXR1cm4gU1dJR19PdmVyZmxvd0Vycm9yOworICAgIH0gZWxzZSB7CisgICAgICBpZiAodmFsKSAqdmFsID0gKGZsb2F0KSh2KTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlczsKK30KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorU1dJR0lOVEVSTiBQeU9iamVjdCAqX3dyYXBfV2ViUEdldERlY29kZXJWZXJzaW9uKFB5T2JqZWN0ICpTV0lHVU5VU0VEUEFSTShzZWxmKSwgUHlPYmplY3QgKmFyZ3MpIHsKKyAgUHlPYmplY3QgKnJlc3VsdG9iaiA9IDA7CisgIGludCByZXN1bHQ7CisKKyAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsKGNoYXIgKikiOldlYlBHZXREZWNvZGVyVmVyc2lvbiIpKSBTV0lHX2ZhaWw7CisgIHJlc3VsdCA9IChpbnQpV2ViUEdldERlY29kZXJWZXJzaW9uKCk7CisgIHJlc3VsdG9iaiA9IFNXSUdfRnJvbV9pbnQoKGludCkocmVzdWx0KSk7CisgIHJldHVybiByZXN1bHRvYmo7CitmYWlsOgorICByZXR1cm4gTlVMTDsKK30KKworCitTV0lHSU5URVJOIFB5T2JqZWN0ICpfd3JhcF9XZWJQR2V0SW5mbyhQeU9iamVjdCAqU1dJR1VOVVNFRFBBUk0oc2VsZiksIFB5T2JqZWN0ICphcmdzKSB7CisgIFB5T2JqZWN0ICpyZXN1bHRvYmogPSAwOworICB1aW50OF90ICphcmcxID0gKHVpbnQ4X3QgKikgMCA7CisgIHNpemVfdCBhcmcyIDsKKyAgaW50ICphcmczID0gKGludCAqKSAwIDsKKyAgaW50ICphcmc0ID0gKGludCAqKSAwIDsKKyAgaW50IHJlczEgOworICBjaGFyICpidWYxID0gMCA7CisgIHNpemVfdCBzaXplMSA9IDAgOworICBpbnQgYWxsb2MxID0gMCA7CisgIGludCB0ZW1wMyA7CisgIGludCByZXMzID0gU1dJR19UTVBPQkogOworICBpbnQgdGVtcDQgOworICBpbnQgcmVzNCA9IFNXSUdfVE1QT0JKIDsKKyAgUHlPYmplY3QgKiBvYmowID0gMCA7CisgIGludCByZXN1bHQ7CisKKyAgYXJnMyA9ICZ0ZW1wMzsKKyAgYXJnNCA9ICZ0ZW1wNDsKKyAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsKGNoYXIgKikiTzpXZWJQR2V0SW5mbyIsJm9iajApKSBTV0lHX2ZhaWw7CisgIHJlczEgPSBTV0lHX0FzQ2hhclB0ckFuZFNpemUob2JqMCwgJmJ1ZjEsICZzaXplMSwgJmFsbG9jMSk7CisgIGlmICghU1dJR19Jc09LKHJlczEpKSB7CisgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKHJlczEpLCAiaW4gbWV0aG9kICciICJXZWJQR2V0SW5mbyIgIicsIGFyZ3VtZW50ICIgIjEiIiBvZiB0eXBlICciICJ1aW50OF90IGNvbnN0ICoiIiciKTsKKyAgfQorICBhcmcxID0gKHVpbnQ4X3QgKikoYnVmMSk7CisgIGFyZzIgPSAoc2l6ZV90KShzaXplMSAtIDEpOworICByZXN1bHQgPSAoaW50KVdlYlBHZXRJbmZvKCh1aW50OF90IGNvbnN0ICopYXJnMSxhcmcyLGFyZzMsYXJnNCk7CisgIHJlc3VsdG9iaiA9IFNXSUdfRnJvbV9pbnQoKGludCkocmVzdWx0KSk7CisgIGlmIChTV0lHX0lzVG1wT2JqKHJlczMpKSB7CisgICAgcmVzdWx0b2JqID0gU1dJR19QeXRob25fQXBwZW5kT3V0cHV0KHJlc3VsdG9iaiwgU1dJR19Gcm9tX2ludCgoKmFyZzMpKSk7CisgIH0gZWxzZSB7CisgICAgaW50IG5ld19mbGFncyA9IFNXSUdfSXNOZXdPYmoocmVzMykgPyAoU1dJR19QT0lOVEVSX09XTiB8ICAwICkgOiAgMCA7CisgICAgcmVzdWx0b2JqID0gU1dJR19QeXRob25fQXBwZW5kT3V0cHV0KHJlc3VsdG9iaiwgU1dJR19OZXdQb2ludGVyT2JqKCh2b2lkKikoYXJnMyksIFNXSUdUWVBFX3BfaW50LCBuZXdfZmxhZ3MpKTsKKyAgfQorICBpZiAoU1dJR19Jc1RtcE9iaihyZXM0KSkgeworICAgIHJlc3VsdG9iaiA9IFNXSUdfUHl0aG9uX0FwcGVuZE91dHB1dChyZXN1bHRvYmosIFNXSUdfRnJvbV9pbnQoKCphcmc0KSkpOworICB9IGVsc2UgeworICAgIGludCBuZXdfZmxhZ3MgPSBTV0lHX0lzTmV3T2JqKHJlczQpID8gKFNXSUdfUE9JTlRFUl9PV04gfCAgMCApIDogIDAgOworICAgIHJlc3VsdG9iaiA9IFNXSUdfUHl0aG9uX0FwcGVuZE91dHB1dChyZXN1bHRvYmosIFNXSUdfTmV3UG9pbnRlck9iaigodm9pZCopKGFyZzQpLCBTV0lHVFlQRV9wX2ludCwgbmV3X2ZsYWdzKSk7CisgIH0KKyAgaWYgKGFsbG9jMSA9PSBTV0lHX05FV09CSikgZnJlZSgoY2hhciopYnVmMSk7CisgIHJldHVybiByZXN1bHRvYmo7CitmYWlsOgorICBpZiAoYWxsb2MxID09IFNXSUdfTkVXT0JKKSBmcmVlKChjaGFyKilidWYxKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKworU1dJR0lOVEVSTiBQeU9iamVjdCAqX3dyYXBfV2ViUERlY29kZVJHQihQeU9iamVjdCAqU1dJR1VOVVNFRFBBUk0oc2VsZiksIFB5T2JqZWN0ICphcmdzKSB7CisgIFB5T2JqZWN0ICpyZXN1bHRvYmogPSAwOworICB1aW50OF90ICphcmcxID0gKHVpbnQ4X3QgKikgMCA7CisgIHNpemVfdCBhcmcyIDsKKyAgaW50ICphcmczID0gKGludCAqKSAwIDsKKyAgaW50ICphcmc0ID0gKGludCAqKSAwIDsKKyAgaW50IHJlczEgOworICBjaGFyICpidWYxID0gMCA7CisgIHNpemVfdCBzaXplMSA9IDAgOworICBpbnQgYWxsb2MxID0gMCA7CisgIGludCB0ZW1wMyA7CisgIGludCByZXMzID0gU1dJR19UTVBPQkogOworICBpbnQgdGVtcDQgOworICBpbnQgcmVzNCA9IFNXSUdfVE1QT0JKIDsKKyAgUHlPYmplY3QgKiBvYmowID0gMCA7CisgIHVpbnQ4X3QgKnJlc3VsdCA9IDAgOworCisgIGFyZzMgPSAmdGVtcDM7CisgIGFyZzQgPSAmdGVtcDQ7CisgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLChjaGFyICopIk86V2ViUERlY29kZVJHQiIsJm9iajApKSBTV0lHX2ZhaWw7CisgIHJlczEgPSBTV0lHX0FzQ2hhclB0ckFuZFNpemUob2JqMCwgJmJ1ZjEsICZzaXplMSwgJmFsbG9jMSk7CisgIGlmICghU1dJR19Jc09LKHJlczEpKSB7CisgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKHJlczEpLCAiaW4gbWV0aG9kICciICJXZWJQRGVjb2RlUkdCIiAiJywgYXJndW1lbnQgIiAiMSIiIG9mIHR5cGUgJyIgInVpbnQ4X3QgY29uc3QgKiIiJyIpOworICB9CisgIGFyZzEgPSAodWludDhfdCAqKShidWYxKTsKKyAgYXJnMiA9IChzaXplX3QpKHNpemUxIC0gMSk7CisgIHJlc3VsdCA9ICh1aW50OF90ICopV2ViUERlY29kZVJHQigodWludDhfdCBjb25zdCAqKWFyZzEsYXJnMixhcmczLGFyZzQpOworICB7CisgICAgcmVzdWx0b2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCisgICAgICAoY29uc3QgY2hhciopcmVzdWx0LAorICAgICAgKHJlc3VsdCA9PSBOVUxMKSA/IDAgOiBSZXR1cm5lZEJ1ZmZlclNpemUoIldlYlBEZWNvZGVSR0IiLCBhcmczLCBhcmc0KSk7CisgIH0KKyAgaWYgKFNXSUdfSXNUbXBPYmoocmVzMykpIHsKKyAgICByZXN1bHRvYmogPSBTV0lHX1B5dGhvbl9BcHBlbmRPdXRwdXQocmVzdWx0b2JqLCBTV0lHX0Zyb21faW50KCgqYXJnMykpKTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgbmV3X2ZsYWdzID0gU1dJR19Jc05ld09iaihyZXMzKSA/IChTV0lHX1BPSU5URVJfT1dOIHwgIDAgKSA6ICAwIDsKKyAgICByZXN1bHRvYmogPSBTV0lHX1B5dGhvbl9BcHBlbmRPdXRwdXQocmVzdWx0b2JqLCBTV0lHX05ld1BvaW50ZXJPYmooKHZvaWQqKShhcmczKSwgU1dJR1RZUEVfcF9pbnQsIG5ld19mbGFncykpOworICB9CisgIGlmIChTV0lHX0lzVG1wT2JqKHJlczQpKSB7CisgICAgcmVzdWx0b2JqID0gU1dJR19QeXRob25fQXBwZW5kT3V0cHV0KHJlc3VsdG9iaiwgU1dJR19Gcm9tX2ludCgoKmFyZzQpKSk7CisgIH0gZWxzZSB7CisgICAgaW50IG5ld19mbGFncyA9IFNXSUdfSXNOZXdPYmoocmVzNCkgPyAoU1dJR19QT0lOVEVSX09XTiB8ICAwICkgOiAgMCA7CisgICAgcmVzdWx0b2JqID0gU1dJR19QeXRob25fQXBwZW5kT3V0cHV0KHJlc3VsdG9iaiwgU1dJR19OZXdQb2ludGVyT2JqKCh2b2lkKikoYXJnNCksIFNXSUdUWVBFX3BfaW50LCBuZXdfZmxhZ3MpKTsKKyAgfQorICBpZiAoYWxsb2MxID09IFNXSUdfTkVXT0JKKSBmcmVlKChjaGFyKilidWYxKTsKKyAgZnJlZShyZXN1bHQpOworICByZXR1cm4gcmVzdWx0b2JqOworZmFpbDoKKyAgaWYgKGFsbG9jMSA9PSBTV0lHX05FV09CSikgZnJlZSgoY2hhciopYnVmMSk7CisgIHJldHVybiBOVUxMOworfQorCisKK1NXSUdJTlRFUk4gUHlPYmplY3QgKl93cmFwX1dlYlBEZWNvZGVSR0JBKFB5T2JqZWN0ICpTV0lHVU5VU0VEUEFSTShzZWxmKSwgUHlPYmplY3QgKmFyZ3MpIHsKKyAgUHlPYmplY3QgKnJlc3VsdG9iaiA9IDA7CisgIHVpbnQ4X3QgKmFyZzEgPSAodWludDhfdCAqKSAwIDsKKyAgc2l6ZV90IGFyZzIgOworICBpbnQgKmFyZzMgPSAoaW50ICopIDAgOworICBpbnQgKmFyZzQgPSAoaW50ICopIDAgOworICBpbnQgcmVzMSA7CisgIGNoYXIgKmJ1ZjEgPSAwIDsKKyAgc2l6ZV90IHNpemUxID0gMCA7CisgIGludCBhbGxvYzEgPSAwIDsKKyAgaW50IHRlbXAzIDsKKyAgaW50IHJlczMgPSBTV0lHX1RNUE9CSiA7CisgIGludCB0ZW1wNCA7CisgIGludCByZXM0ID0gU1dJR19UTVBPQkogOworICBQeU9iamVjdCAqIG9iajAgPSAwIDsKKyAgdWludDhfdCAqcmVzdWx0ID0gMCA7CisKKyAgYXJnMyA9ICZ0ZW1wMzsKKyAgYXJnNCA9ICZ0ZW1wNDsKKyAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsKGNoYXIgKikiTzpXZWJQRGVjb2RlUkdCQSIsJm9iajApKSBTV0lHX2ZhaWw7CisgIHJlczEgPSBTV0lHX0FzQ2hhclB0ckFuZFNpemUob2JqMCwgJmJ1ZjEsICZzaXplMSwgJmFsbG9jMSk7CisgIGlmICghU1dJR19Jc09LKHJlczEpKSB7CisgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKHJlczEpLCAiaW4gbWV0aG9kICciICJXZWJQRGVjb2RlUkdCQSIgIicsIGFyZ3VtZW50ICIgIjEiIiBvZiB0eXBlICciICJ1aW50OF90IGNvbnN0ICoiIiciKTsKKyAgfQorICBhcmcxID0gKHVpbnQ4X3QgKikoYnVmMSk7CisgIGFyZzIgPSAoc2l6ZV90KShzaXplMSAtIDEpOworICByZXN1bHQgPSAodWludDhfdCAqKVdlYlBEZWNvZGVSR0JBKCh1aW50OF90IGNvbnN0ICopYXJnMSxhcmcyLGFyZzMsYXJnNCk7CisgIHsKKyAgICByZXN1bHRvYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgKKyAgICAgIChjb25zdCBjaGFyKilyZXN1bHQsCisgICAgICAocmVzdWx0ID09IE5VTEwpID8gMCA6IFJldHVybmVkQnVmZmVyU2l6ZSgiV2ViUERlY29kZVJHQkEiLCBhcmczLCBhcmc0KSk7CisgIH0KKyAgaWYgKFNXSUdfSXNUbXBPYmoocmVzMykpIHsKKyAgICByZXN1bHRvYmogPSBTV0lHX1B5dGhvbl9BcHBlbmRPdXRwdXQocmVzdWx0b2JqLCBTV0lHX0Zyb21faW50KCgqYXJnMykpKTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgbmV3X2ZsYWdzID0gU1dJR19Jc05ld09iaihyZXMzKSA/IChTV0lHX1BPSU5URVJfT1dOIHwgIDAgKSA6ICAwIDsKKyAgICByZXN1bHRvYmogPSBTV0lHX1B5dGhvbl9BcHBlbmRPdXRwdXQocmVzdWx0b2JqLCBTV0lHX05ld1BvaW50ZXJPYmooKHZvaWQqKShhcmczKSwgU1dJR1RZUEVfcF9pbnQsIG5ld19mbGFncykpOworICB9CisgIGlmIChTV0lHX0lzVG1wT2JqKHJlczQpKSB7CisgICAgcmVzdWx0b2JqID0gU1dJR19QeXRob25fQXBwZW5kT3V0cHV0KHJlc3VsdG9iaiwgU1dJR19Gcm9tX2ludCgoKmFyZzQpKSk7CisgIH0gZWxzZSB7CisgICAgaW50IG5ld19mbGFncyA9IFNXSUdfSXNOZXdPYmoocmVzNCkgPyAoU1dJR19QT0lOVEVSX09XTiB8ICAwICkgOiAgMCA7CisgICAgcmVzdWx0b2JqID0gU1dJR19QeXRob25fQXBwZW5kT3V0cHV0KHJlc3VsdG9iaiwgU1dJR19OZXdQb2ludGVyT2JqKCh2b2lkKikoYXJnNCksIFNXSUdUWVBFX3BfaW50LCBuZXdfZmxhZ3MpKTsKKyAgfQorICBpZiAoYWxsb2MxID09IFNXSUdfTkVXT0JKKSBmcmVlKChjaGFyKilidWYxKTsKKyAgZnJlZShyZXN1bHQpOworICByZXR1cm4gcmVzdWx0b2JqOworZmFpbDoKKyAgaWYgKGFsbG9jMSA9PSBTV0lHX05FV09CSikgZnJlZSgoY2hhciopYnVmMSk7CisgIHJldHVybiBOVUxMOworfQorCisKK1NXSUdJTlRFUk4gUHlPYmplY3QgKl93cmFwX1dlYlBEZWNvZGVBUkdCKFB5T2JqZWN0ICpTV0lHVU5VU0VEUEFSTShzZWxmKSwgUHlPYmplY3QgKmFyZ3MpIHsKKyAgUHlPYmplY3QgKnJlc3VsdG9iaiA9IDA7CisgIHVpbnQ4X3QgKmFyZzEgPSAodWludDhfdCAqKSAwIDsKKyAgc2l6ZV90IGFyZzIgOworICBpbnQgKmFyZzMgPSAoaW50ICopIDAgOworICBpbnQgKmFyZzQgPSAoaW50ICopIDAgOworICBpbnQgcmVzMSA7CisgIGNoYXIgKmJ1ZjEgPSAwIDsKKyAgc2l6ZV90IHNpemUxID0gMCA7CisgIGludCBhbGxvYzEgPSAwIDsKKyAgaW50IHRlbXAzIDsKKyAgaW50IHJlczMgPSBTV0lHX1RNUE9CSiA7CisgIGludCB0ZW1wNCA7CisgIGludCByZXM0ID0gU1dJR19UTVBPQkogOworICBQeU9iamVjdCAqIG9iajAgPSAwIDsKKyAgdWludDhfdCAqcmVzdWx0ID0gMCA7CisKKyAgYXJnMyA9ICZ0ZW1wMzsKKyAgYXJnNCA9ICZ0ZW1wNDsKKyAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsKGNoYXIgKikiTzpXZWJQRGVjb2RlQVJHQiIsJm9iajApKSBTV0lHX2ZhaWw7CisgIHJlczEgPSBTV0lHX0FzQ2hhclB0ckFuZFNpemUob2JqMCwgJmJ1ZjEsICZzaXplMSwgJmFsbG9jMSk7CisgIGlmICghU1dJR19Jc09LKHJlczEpKSB7CisgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKHJlczEpLCAiaW4gbWV0aG9kICciICJXZWJQRGVjb2RlQVJHQiIgIicsIGFyZ3VtZW50ICIgIjEiIiBvZiB0eXBlICciICJ1aW50OF90IGNvbnN0ICoiIiciKTsKKyAgfQorICBhcmcxID0gKHVpbnQ4X3QgKikoYnVmMSk7CisgIGFyZzIgPSAoc2l6ZV90KShzaXplMSAtIDEpOworICByZXN1bHQgPSAodWludDhfdCAqKVdlYlBEZWNvZGVBUkdCKCh1aW50OF90IGNvbnN0ICopYXJnMSxhcmcyLGFyZzMsYXJnNCk7CisgIHsKKyAgICByZXN1bHRvYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgKKyAgICAgIChjb25zdCBjaGFyKilyZXN1bHQsCisgICAgICAocmVzdWx0ID09IE5VTEwpID8gMCA6IFJldHVybmVkQnVmZmVyU2l6ZSgiV2ViUERlY29kZUFSR0IiLCBhcmczLCBhcmc0KSk7CisgIH0KKyAgaWYgKFNXSUdfSXNUbXBPYmoocmVzMykpIHsKKyAgICByZXN1bHRvYmogPSBTV0lHX1B5dGhvbl9BcHBlbmRPdXRwdXQocmVzdWx0b2JqLCBTV0lHX0Zyb21faW50KCgqYXJnMykpKTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgbmV3X2ZsYWdzID0gU1dJR19Jc05ld09iaihyZXMzKSA/IChTV0lHX1BPSU5URVJfT1dOIHwgIDAgKSA6ICAwIDsKKyAgICByZXN1bHRvYmogPSBTV0lHX1B5dGhvbl9BcHBlbmRPdXRwdXQocmVzdWx0b2JqLCBTV0lHX05ld1BvaW50ZXJPYmooKHZvaWQqKShhcmczKSwgU1dJR1RZUEVfcF9pbnQsIG5ld19mbGFncykpOworICB9CisgIGlmIChTV0lHX0lzVG1wT2JqKHJlczQpKSB7CisgICAgcmVzdWx0b2JqID0gU1dJR19QeXRob25fQXBwZW5kT3V0cHV0KHJlc3VsdG9iaiwgU1dJR19Gcm9tX2ludCgoKmFyZzQpKSk7CisgIH0gZWxzZSB7CisgICAgaW50IG5ld19mbGFncyA9IFNXSUdfSXNOZXdPYmoocmVzNCkgPyAoU1dJR19QT0lOVEVSX09XTiB8ICAwICkgOiAgMCA7CisgICAgcmVzdWx0b2JqID0gU1dJR19QeXRob25fQXBwZW5kT3V0cHV0KHJlc3VsdG9iaiwgU1dJR19OZXdQb2ludGVyT2JqKCh2b2lkKikoYXJnNCksIFNXSUdUWVBFX3BfaW50LCBuZXdfZmxhZ3MpKTsKKyAgfQorICBpZiAoYWxsb2MxID09IFNXSUdfTkVXT0JKKSBmcmVlKChjaGFyKilidWYxKTsKKyAgZnJlZShyZXN1bHQpOworICByZXR1cm4gcmVzdWx0b2JqOworZmFpbDoKKyAgaWYgKGFsbG9jMSA9PSBTV0lHX05FV09CSikgZnJlZSgoY2hhciopYnVmMSk7CisgIHJldHVybiBOVUxMOworfQorCisKK1NXSUdJTlRFUk4gUHlPYmplY3QgKl93cmFwX1dlYlBEZWNvZGVCR1IoUHlPYmplY3QgKlNXSUdVTlVTRURQQVJNKHNlbGYpLCBQeU9iamVjdCAqYXJncykgeworICBQeU9iamVjdCAqcmVzdWx0b2JqID0gMDsKKyAgdWludDhfdCAqYXJnMSA9ICh1aW50OF90ICopIDAgOworICBzaXplX3QgYXJnMiA7CisgIGludCAqYXJnMyA9IChpbnQgKikgMCA7CisgIGludCAqYXJnNCA9IChpbnQgKikgMCA7CisgIGludCByZXMxIDsKKyAgY2hhciAqYnVmMSA9IDAgOworICBzaXplX3Qgc2l6ZTEgPSAwIDsKKyAgaW50IGFsbG9jMSA9IDAgOworICBpbnQgdGVtcDMgOworICBpbnQgcmVzMyA9IFNXSUdfVE1QT0JKIDsKKyAgaW50IHRlbXA0IDsKKyAgaW50IHJlczQgPSBTV0lHX1RNUE9CSiA7CisgIFB5T2JqZWN0ICogb2JqMCA9IDAgOworICB1aW50OF90ICpyZXN1bHQgPSAwIDsKKworICBhcmczID0gJnRlbXAzOworICBhcmc0ID0gJnRlbXA0OworICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywoY2hhciAqKSJPOldlYlBEZWNvZGVCR1IiLCZvYmowKSkgU1dJR19mYWlsOworICByZXMxID0gU1dJR19Bc0NoYXJQdHJBbmRTaXplKG9iajAsICZidWYxLCAmc2l6ZTEsICZhbGxvYzEpOworICBpZiAoIVNXSUdfSXNPSyhyZXMxKSkgeworICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihyZXMxKSwgImluIG1ldGhvZCAnIiAiV2ViUERlY29kZUJHUiIgIicsIGFyZ3VtZW50ICIgIjEiIiBvZiB0eXBlICciICJ1aW50OF90IGNvbnN0ICoiIiciKTsKKyAgfQorICBhcmcxID0gKHVpbnQ4X3QgKikoYnVmMSk7CisgIGFyZzIgPSAoc2l6ZV90KShzaXplMSAtIDEpOworICByZXN1bHQgPSAodWludDhfdCAqKVdlYlBEZWNvZGVCR1IoKHVpbnQ4X3QgY29uc3QgKilhcmcxLGFyZzIsYXJnMyxhcmc0KTsKKyAgeworICAgIHJlc3VsdG9iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAorICAgICAgKGNvbnN0IGNoYXIqKXJlc3VsdCwKKyAgICAgIChyZXN1bHQgPT0gTlVMTCkgPyAwIDogUmV0dXJuZWRCdWZmZXJTaXplKCJXZWJQRGVjb2RlQkdSIiwgYXJnMywgYXJnNCkpOworICB9CisgIGlmIChTV0lHX0lzVG1wT2JqKHJlczMpKSB7CisgICAgcmVzdWx0b2JqID0gU1dJR19QeXRob25fQXBwZW5kT3V0cHV0KHJlc3VsdG9iaiwgU1dJR19Gcm9tX2ludCgoKmFyZzMpKSk7CisgIH0gZWxzZSB7CisgICAgaW50IG5ld19mbGFncyA9IFNXSUdfSXNOZXdPYmoocmVzMykgPyAoU1dJR19QT0lOVEVSX09XTiB8ICAwICkgOiAgMCA7CisgICAgcmVzdWx0b2JqID0gU1dJR19QeXRob25fQXBwZW5kT3V0cHV0KHJlc3VsdG9iaiwgU1dJR19OZXdQb2ludGVyT2JqKCh2b2lkKikoYXJnMyksIFNXSUdUWVBFX3BfaW50LCBuZXdfZmxhZ3MpKTsKKyAgfQorICBpZiAoU1dJR19Jc1RtcE9iaihyZXM0KSkgeworICAgIHJlc3VsdG9iaiA9IFNXSUdfUHl0aG9uX0FwcGVuZE91dHB1dChyZXN1bHRvYmosIFNXSUdfRnJvbV9pbnQoKCphcmc0KSkpOworICB9IGVsc2UgeworICAgIGludCBuZXdfZmxhZ3MgPSBTV0lHX0lzTmV3T2JqKHJlczQpID8gKFNXSUdfUE9JTlRFUl9PV04gfCAgMCApIDogIDAgOworICAgIHJlc3VsdG9iaiA9IFNXSUdfUHl0aG9uX0FwcGVuZE91dHB1dChyZXN1bHRvYmosIFNXSUdfTmV3UG9pbnRlck9iaigodm9pZCopKGFyZzQpLCBTV0lHVFlQRV9wX2ludCwgbmV3X2ZsYWdzKSk7CisgIH0KKyAgaWYgKGFsbG9jMSA9PSBTV0lHX05FV09CSikgZnJlZSgoY2hhciopYnVmMSk7CisgIGZyZWUocmVzdWx0KTsKKyAgcmV0dXJuIHJlc3VsdG9iajsKK2ZhaWw6CisgIGlmIChhbGxvYzEgPT0gU1dJR19ORVdPQkopIGZyZWUoKGNoYXIqKWJ1ZjEpOworICByZXR1cm4gTlVMTDsKK30KKworCitTV0lHSU5URVJOIFB5T2JqZWN0ICpfd3JhcF9XZWJQRGVjb2RlQkdSQShQeU9iamVjdCAqU1dJR1VOVVNFRFBBUk0oc2VsZiksIFB5T2JqZWN0ICphcmdzKSB7CisgIFB5T2JqZWN0ICpyZXN1bHRvYmogPSAwOworICB1aW50OF90ICphcmcxID0gKHVpbnQ4X3QgKikgMCA7CisgIHNpemVfdCBhcmcyIDsKKyAgaW50ICphcmczID0gKGludCAqKSAwIDsKKyAgaW50ICphcmc0ID0gKGludCAqKSAwIDsKKyAgaW50IHJlczEgOworICBjaGFyICpidWYxID0gMCA7CisgIHNpemVfdCBzaXplMSA9IDAgOworICBpbnQgYWxsb2MxID0gMCA7CisgIGludCB0ZW1wMyA7CisgIGludCByZXMzID0gU1dJR19UTVBPQkogOworICBpbnQgdGVtcDQgOworICBpbnQgcmVzNCA9IFNXSUdfVE1QT0JKIDsKKyAgUHlPYmplY3QgKiBvYmowID0gMCA7CisgIHVpbnQ4X3QgKnJlc3VsdCA9IDAgOworCisgIGFyZzMgPSAmdGVtcDM7CisgIGFyZzQgPSAmdGVtcDQ7CisgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLChjaGFyICopIk86V2ViUERlY29kZUJHUkEiLCZvYmowKSkgU1dJR19mYWlsOworICByZXMxID0gU1dJR19Bc0NoYXJQdHJBbmRTaXplKG9iajAsICZidWYxLCAmc2l6ZTEsICZhbGxvYzEpOworICBpZiAoIVNXSUdfSXNPSyhyZXMxKSkgeworICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihyZXMxKSwgImluIG1ldGhvZCAnIiAiV2ViUERlY29kZUJHUkEiICInLCBhcmd1bWVudCAiICIxIiIgb2YgdHlwZSAnIiAidWludDhfdCBjb25zdCAqIiInIik7CisgIH0KKyAgYXJnMSA9ICh1aW50OF90ICopKGJ1ZjEpOworICBhcmcyID0gKHNpemVfdCkoc2l6ZTEgLSAxKTsKKyAgcmVzdWx0ID0gKHVpbnQ4X3QgKilXZWJQRGVjb2RlQkdSQSgodWludDhfdCBjb25zdCAqKWFyZzEsYXJnMixhcmczLGFyZzQpOworICB7CisgICAgcmVzdWx0b2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCisgICAgICAoY29uc3QgY2hhciopcmVzdWx0LAorICAgICAgKHJlc3VsdCA9PSBOVUxMKSA/IDAgOiBSZXR1cm5lZEJ1ZmZlclNpemUoIldlYlBEZWNvZGVCR1JBIiwgYXJnMywgYXJnNCkpOworICB9CisgIGlmIChTV0lHX0lzVG1wT2JqKHJlczMpKSB7CisgICAgcmVzdWx0b2JqID0gU1dJR19QeXRob25fQXBwZW5kT3V0cHV0KHJlc3VsdG9iaiwgU1dJR19Gcm9tX2ludCgoKmFyZzMpKSk7CisgIH0gZWxzZSB7CisgICAgaW50IG5ld19mbGFncyA9IFNXSUdfSXNOZXdPYmoocmVzMykgPyAoU1dJR19QT0lOVEVSX09XTiB8ICAwICkgOiAgMCA7CisgICAgcmVzdWx0b2JqID0gU1dJR19QeXRob25fQXBwZW5kT3V0cHV0KHJlc3VsdG9iaiwgU1dJR19OZXdQb2ludGVyT2JqKCh2b2lkKikoYXJnMyksIFNXSUdUWVBFX3BfaW50LCBuZXdfZmxhZ3MpKTsKKyAgfQorICBpZiAoU1dJR19Jc1RtcE9iaihyZXM0KSkgeworICAgIHJlc3VsdG9iaiA9IFNXSUdfUHl0aG9uX0FwcGVuZE91dHB1dChyZXN1bHRvYmosIFNXSUdfRnJvbV9pbnQoKCphcmc0KSkpOworICB9IGVsc2UgeworICAgIGludCBuZXdfZmxhZ3MgPSBTV0lHX0lzTmV3T2JqKHJlczQpID8gKFNXSUdfUE9JTlRFUl9PV04gfCAgMCApIDogIDAgOworICAgIHJlc3VsdG9iaiA9IFNXSUdfUHl0aG9uX0FwcGVuZE91dHB1dChyZXN1bHRvYmosIFNXSUdfTmV3UG9pbnRlck9iaigodm9pZCopKGFyZzQpLCBTV0lHVFlQRV9wX2ludCwgbmV3X2ZsYWdzKSk7CisgIH0KKyAgaWYgKGFsbG9jMSA9PSBTV0lHX05FV09CSikgZnJlZSgoY2hhciopYnVmMSk7CisgIGZyZWUocmVzdWx0KTsKKyAgcmV0dXJuIHJlc3VsdG9iajsKK2ZhaWw6CisgIGlmIChhbGxvYzEgPT0gU1dJR19ORVdPQkopIGZyZWUoKGNoYXIqKWJ1ZjEpOworICByZXR1cm4gTlVMTDsKK30KKworCitTV0lHSU5URVJOIFB5T2JqZWN0ICpfd3JhcF9XZWJQR2V0RW5jb2RlclZlcnNpb24oUHlPYmplY3QgKlNXSUdVTlVTRURQQVJNKHNlbGYpLCBQeU9iamVjdCAqYXJncykgeworICBQeU9iamVjdCAqcmVzdWx0b2JqID0gMDsKKyAgaW50IHJlc3VsdDsKKworICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywoY2hhciAqKSI6V2ViUEdldEVuY29kZXJWZXJzaW9uIikpIFNXSUdfZmFpbDsKKyAgcmVzdWx0ID0gKGludClXZWJQR2V0RW5jb2RlclZlcnNpb24oKTsKKyAgcmVzdWx0b2JqID0gU1dJR19Gcm9tX2ludCgoaW50KShyZXN1bHQpKTsKKyAgcmV0dXJuIHJlc3VsdG9iajsKK2ZhaWw6CisgIHJldHVybiBOVUxMOworfQorCisKK1NXSUdJTlRFUk4gUHlPYmplY3QgKl93cmFwX3dyYXBfV2ViUEVuY29kZVJHQihQeU9iamVjdCAqU1dJR1VOVVNFRFBBUk0oc2VsZiksIFB5T2JqZWN0ICphcmdzKSB7CisgIFB5T2JqZWN0ICpyZXN1bHRvYmogPSAwOworICB1aW50OF90ICphcmcxID0gKHVpbnQ4X3QgKikgMCA7CisgIGludCAqYXJnMiA9IChpbnQgKikgMCA7CisgIGludCAqYXJnMyA9IChpbnQgKikgMCA7CisgIGludCAqYXJnNCA9IChpbnQgKikgMCA7CisgIGludCBhcmc1IDsKKyAgaW50IGFyZzYgOworICBpbnQgYXJnNyA7CisgIGZsb2F0IGFyZzggOworICBQeV9idWZmZXIgcmdiX2J1ZmZlcjEgOworICBpbnQgdGVtcDIgOworICBpbnQgcmVzMiA9IDAgOworICBpbnQgdGVtcDMgOworICBpbnQgcmVzMyA9IDAgOworICBpbnQgdGVtcDQgOworICBpbnQgcmVzNCA9IFNXSUdfVE1QT0JKIDsKKyAgaW50IHZhbDUgOworICBpbnQgZWNvZGU1ID0gMCA7CisgIGludCB2YWw2IDsKKyAgaW50IGVjb2RlNiA9IDAgOworICBpbnQgdmFsNyA7CisgIGludCBlY29kZTcgPSAwIDsKKyAgZmxvYXQgdmFsOCA7CisgIGludCBlY29kZTggPSAwIDsKKyAgUHlPYmplY3QgKiBvYmowID0gMCA7CisgIFB5T2JqZWN0ICogb2JqMSA9IDAgOworICBQeU9iamVjdCAqIG9iajIgPSAwIDsKKyAgUHlPYmplY3QgKiBvYmozID0gMCA7CisgIFB5T2JqZWN0ICogb2JqNCA9IDAgOworICBQeU9iamVjdCAqIG9iajUgPSAwIDsKKyAgUHlPYmplY3QgKiBvYmo2ID0gMCA7CisgIHVpbnQ4X3QgKnJlc3VsdCA9IDAgOworCisgIGFyZzQgPSAmdGVtcDQ7CisgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLChjaGFyICopIk9PT09PT086d3JhcF9XZWJQRW5jb2RlUkdCIiwmb2JqMCwmb2JqMSwmb2JqMiwmb2JqMywmb2JqNCwmb2JqNSwmb2JqNikpIFNXSUdfZmFpbDsKKyAgeworICAgIC8vIE5COiB3aXRoIFB5dGhvbiA8IDIuNiB0aGUgb2xkIHN0eWxlIGJ1ZmZlciBwcm90b2NvbCBtYXkgYmUgdXNlZDoKKyAgICAvLyBQeV9zc2l6ZV90IHVudXNlZDsKKyAgICAvLyBQeU9iamVjdF9Bc1JlYWRCdWZmZXIob2JqMCwgKGNvbnN0IHZvaWQqKikoJmFyZzEpLCAmdW51c2VkKTsKKyAgICBpZiAoIVB5T2JqZWN0X0NoZWNrQnVmZmVyKG9iajApKSB7CisgICAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfVHlwZUVycm9yLAorICAgICAgICAiaW4gbWV0aG9kICd3cmFwX1dlYlBFbmNvZGVSR0InLCBhcmd1bWVudCAxIgorICAgICAgICAiIGRvZXMgbm90IHN1cHBvcnQgdGhlIGJ1ZmZlciBpbnRlcmZhY2UiKTsKKyAgICB9CisgICAgaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcihvYmowLCAmcmdiX2J1ZmZlcjEsIFB5QlVGX1NJTVBMRSkpIHsKKyAgICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19SdW50aW1lRXJyb3IsCisgICAgICAgICJpbiBtZXRob2QgJ3dyYXBfV2ViUEVuY29kZVJHQicsIHVuYWJsZSB0byBnZXQgYnVmZmVyIHZpZXciKTsKKyAgICB9CisgICAgYXJnMSA9ICh1aW50OF90ICopcmdiX2J1ZmZlcjEuYnVmOworICB9CisgIGlmICghKFNXSUdfSXNPSygocmVzMiA9IFNXSUdfQ29udmVydFB0cihvYmoxLFNXSUdfYXNfdm9pZHB0cnB0cigmYXJnMiksU1dJR1RZUEVfcF9pbnQsMCkpKSkpIHsKKyAgICBpbnQgdmFsOworICAgIGludCBlY29kZSA9IFNXSUdfQXNWYWxfaW50KG9iajEsICZ2YWwpOworICAgIGlmICghU1dJR19Jc09LKGVjb2RlKSkgeworICAgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKGVjb2RlKSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlUkdCIiAiJywgYXJndW1lbnQgIiAiMiIiIG9mIHR5cGUgJyIgImludCIiJyIpOworICAgIH0KKyAgICB0ZW1wMiA9IChpbnQpKHZhbCk7CisgICAgYXJnMiA9ICZ0ZW1wMjsKKyAgICByZXMyID0gU1dJR19BZGRUbXBNYXNrKGVjb2RlKTsKKyAgfQorICBpZiAoIShTV0lHX0lzT0soKHJlczMgPSBTV0lHX0NvbnZlcnRQdHIob2JqMixTV0lHX2FzX3ZvaWRwdHJwdHIoJmFyZzMpLFNXSUdUWVBFX3BfaW50LDApKSkpKSB7CisgICAgaW50IHZhbDsKKyAgICBpbnQgZWNvZGUgPSBTV0lHX0FzVmFsX2ludChvYmoyLCAmdmFsKTsKKyAgICBpZiAoIVNXSUdfSXNPSyhlY29kZSkpIHsKKyAgICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihlY29kZSksICJpbiBtZXRob2QgJyIgIndyYXBfV2ViUEVuY29kZVJHQiIgIicsIGFyZ3VtZW50ICIgIjMiIiBvZiB0eXBlICciICJpbnQiIiciKTsKKyAgICB9CisgICAgdGVtcDMgPSAoaW50KSh2YWwpOworICAgIGFyZzMgPSAmdGVtcDM7CisgICAgcmVzMyA9IFNXSUdfQWRkVG1wTWFzayhlY29kZSk7CisgIH0KKyAgZWNvZGU1ID0gU1dJR19Bc1ZhbF9pbnQob2JqMywgJnZhbDUpOworICBpZiAoIVNXSUdfSXNPSyhlY29kZTUpKSB7CisgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKGVjb2RlNSksICJpbiBtZXRob2QgJyIgIndyYXBfV2ViUEVuY29kZVJHQiIgIicsIGFyZ3VtZW50ICIgIjUiIiBvZiB0eXBlICciICJpbnQiIiciKTsKKyAgfQorICBhcmc1ID0gKGludCkodmFsNSk7CisgIGVjb2RlNiA9IFNXSUdfQXNWYWxfaW50KG9iajQsICZ2YWw2KTsKKyAgaWYgKCFTV0lHX0lzT0soZWNvZGU2KSkgeworICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihlY29kZTYpLCAiaW4gbWV0aG9kICciICJ3cmFwX1dlYlBFbmNvZGVSR0IiICInLCBhcmd1bWVudCAiICI2IiIgb2YgdHlwZSAnIiAiaW50IiInIik7CisgIH0KKyAgYXJnNiA9IChpbnQpKHZhbDYpOworICBlY29kZTcgPSBTV0lHX0FzVmFsX2ludChvYmo1LCAmdmFsNyk7CisgIGlmICghU1dJR19Jc09LKGVjb2RlNykpIHsKKyAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfQXJnRXJyb3IoZWNvZGU3KSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlUkdCIiAiJywgYXJndW1lbnQgIiAiNyIiIG9mIHR5cGUgJyIgImludCIiJyIpOworICB9CisgIGFyZzcgPSAoaW50KSh2YWw3KTsKKyAgZWNvZGU4ID0gU1dJR19Bc1ZhbF9mbG9hdChvYmo2LCAmdmFsOCk7CisgIGlmICghU1dJR19Jc09LKGVjb2RlOCkpIHsKKyAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfQXJnRXJyb3IoZWNvZGU4KSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlUkdCIiAiJywgYXJndW1lbnQgIiAiOCIiIG9mIHR5cGUgJyIgImZsb2F0IiInIik7CisgIH0KKyAgYXJnOCA9IChmbG9hdCkodmFsOCk7CisgIHJlc3VsdCA9ICh1aW50OF90ICopd3JhcF9XZWJQRW5jb2RlUkdCKCh1aW50OF90IGNvbnN0ICopYXJnMSxhcmcyLGFyZzMsYXJnNCxhcmc1LGFyZzYsYXJnNyxhcmc4KTsKKyAgeworICAgIHJlc3VsdG9iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAorICAgICAgKGNvbnN0IGNoYXIqKXJlc3VsdCwKKyAgICAgIChyZXN1bHQgPT0gTlVMTCkgPyAwIDogUmV0dXJuZWRCdWZmZXJTaXplKCJ3cmFwX1dlYlBFbmNvZGVSR0IiLCBhcmczLCBhcmc0KSk7CisgIH0KKyAgaWYgKFNXSUdfSXNUbXBPYmoocmVzNCkpIHsKKyAgICByZXN1bHRvYmogPSBTV0lHX1B5dGhvbl9BcHBlbmRPdXRwdXQocmVzdWx0b2JqLCBTV0lHX0Zyb21faW50KCgqYXJnNCkpKTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgbmV3X2ZsYWdzID0gU1dJR19Jc05ld09iaihyZXM0KSA/IChTV0lHX1BPSU5URVJfT1dOIHwgIDAgKSA6ICAwIDsKKyAgICByZXN1bHRvYmogPSBTV0lHX1B5dGhvbl9BcHBlbmRPdXRwdXQocmVzdWx0b2JqLCBTV0lHX05ld1BvaW50ZXJPYmooKHZvaWQqKShhcmc0KSwgU1dJR1RZUEVfcF9pbnQsIG5ld19mbGFncykpOworICB9CisgIHsKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZyZ2JfYnVmZmVyMSk7CisgIH0KKyAgaWYgKFNXSUdfSXNOZXdPYmoocmVzMikpIGZyZWUoKGNoYXIqKWFyZzIpOworICBpZiAoU1dJR19Jc05ld09iaihyZXMzKSkgZnJlZSgoY2hhciopYXJnMyk7CisgIGZyZWUocmVzdWx0KTsKKyAgcmV0dXJuIHJlc3VsdG9iajsKK2ZhaWw6CisgIHsKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZyZ2JfYnVmZmVyMSk7CisgIH0KKyAgaWYgKFNXSUdfSXNOZXdPYmoocmVzMikpIGZyZWUoKGNoYXIqKWFyZzIpOworICBpZiAoU1dJR19Jc05ld09iaihyZXMzKSkgZnJlZSgoY2hhciopYXJnMyk7CisgIHJldHVybiBOVUxMOworfQorCisKK1NXSUdJTlRFUk4gUHlPYmplY3QgKl93cmFwX3dyYXBfV2ViUEVuY29kZUJHUihQeU9iamVjdCAqU1dJR1VOVVNFRFBBUk0oc2VsZiksIFB5T2JqZWN0ICphcmdzKSB7CisgIFB5T2JqZWN0ICpyZXN1bHRvYmogPSAwOworICB1aW50OF90ICphcmcxID0gKHVpbnQ4X3QgKikgMCA7CisgIGludCAqYXJnMiA9IChpbnQgKikgMCA7CisgIGludCAqYXJnMyA9IChpbnQgKikgMCA7CisgIGludCAqYXJnNCA9IChpbnQgKikgMCA7CisgIGludCBhcmc1IDsKKyAgaW50IGFyZzYgOworICBpbnQgYXJnNyA7CisgIGZsb2F0IGFyZzggOworICBQeV9idWZmZXIgcmdiX2J1ZmZlcjEgOworICBpbnQgdGVtcDIgOworICBpbnQgcmVzMiA9IDAgOworICBpbnQgdGVtcDMgOworICBpbnQgcmVzMyA9IDAgOworICBpbnQgdGVtcDQgOworICBpbnQgcmVzNCA9IFNXSUdfVE1QT0JKIDsKKyAgaW50IHZhbDUgOworICBpbnQgZWNvZGU1ID0gMCA7CisgIGludCB2YWw2IDsKKyAgaW50IGVjb2RlNiA9IDAgOworICBpbnQgdmFsNyA7CisgIGludCBlY29kZTcgPSAwIDsKKyAgZmxvYXQgdmFsOCA7CisgIGludCBlY29kZTggPSAwIDsKKyAgUHlPYmplY3QgKiBvYmowID0gMCA7CisgIFB5T2JqZWN0ICogb2JqMSA9IDAgOworICBQeU9iamVjdCAqIG9iajIgPSAwIDsKKyAgUHlPYmplY3QgKiBvYmozID0gMCA7CisgIFB5T2JqZWN0ICogb2JqNCA9IDAgOworICBQeU9iamVjdCAqIG9iajUgPSAwIDsKKyAgUHlPYmplY3QgKiBvYmo2ID0gMCA7CisgIHVpbnQ4X3QgKnJlc3VsdCA9IDAgOworCisgIGFyZzQgPSAmdGVtcDQ7CisgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLChjaGFyICopIk9PT09PT086d3JhcF9XZWJQRW5jb2RlQkdSIiwmb2JqMCwmb2JqMSwmb2JqMiwmb2JqMywmb2JqNCwmb2JqNSwmb2JqNikpIFNXSUdfZmFpbDsKKyAgeworICAgIC8vIE5COiB3aXRoIFB5dGhvbiA8IDIuNiB0aGUgb2xkIHN0eWxlIGJ1ZmZlciBwcm90b2NvbCBtYXkgYmUgdXNlZDoKKyAgICAvLyBQeV9zc2l6ZV90IHVudXNlZDsKKyAgICAvLyBQeU9iamVjdF9Bc1JlYWRCdWZmZXIob2JqMCwgKGNvbnN0IHZvaWQqKikoJmFyZzEpLCAmdW51c2VkKTsKKyAgICBpZiAoIVB5T2JqZWN0X0NoZWNrQnVmZmVyKG9iajApKSB7CisgICAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfVHlwZUVycm9yLAorICAgICAgICAiaW4gbWV0aG9kICd3cmFwX1dlYlBFbmNvZGVCR1InLCBhcmd1bWVudCAxIgorICAgICAgICAiIGRvZXMgbm90IHN1cHBvcnQgdGhlIGJ1ZmZlciBpbnRlcmZhY2UiKTsKKyAgICB9CisgICAgaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcihvYmowLCAmcmdiX2J1ZmZlcjEsIFB5QlVGX1NJTVBMRSkpIHsKKyAgICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19SdW50aW1lRXJyb3IsCisgICAgICAgICJpbiBtZXRob2QgJ3dyYXBfV2ViUEVuY29kZUJHUicsIHVuYWJsZSB0byBnZXQgYnVmZmVyIHZpZXciKTsKKyAgICB9CisgICAgYXJnMSA9ICh1aW50OF90ICopcmdiX2J1ZmZlcjEuYnVmOworICB9CisgIGlmICghKFNXSUdfSXNPSygocmVzMiA9IFNXSUdfQ29udmVydFB0cihvYmoxLFNXSUdfYXNfdm9pZHB0cnB0cigmYXJnMiksU1dJR1RZUEVfcF9pbnQsMCkpKSkpIHsKKyAgICBpbnQgdmFsOworICAgIGludCBlY29kZSA9IFNXSUdfQXNWYWxfaW50KG9iajEsICZ2YWwpOworICAgIGlmICghU1dJR19Jc09LKGVjb2RlKSkgeworICAgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKGVjb2RlKSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlQkdSIiAiJywgYXJndW1lbnQgIiAiMiIiIG9mIHR5cGUgJyIgImludCIiJyIpOworICAgIH0KKyAgICB0ZW1wMiA9IChpbnQpKHZhbCk7CisgICAgYXJnMiA9ICZ0ZW1wMjsKKyAgICByZXMyID0gU1dJR19BZGRUbXBNYXNrKGVjb2RlKTsKKyAgfQorICBpZiAoIShTV0lHX0lzT0soKHJlczMgPSBTV0lHX0NvbnZlcnRQdHIob2JqMixTV0lHX2FzX3ZvaWRwdHJwdHIoJmFyZzMpLFNXSUdUWVBFX3BfaW50LDApKSkpKSB7CisgICAgaW50IHZhbDsKKyAgICBpbnQgZWNvZGUgPSBTV0lHX0FzVmFsX2ludChvYmoyLCAmdmFsKTsKKyAgICBpZiAoIVNXSUdfSXNPSyhlY29kZSkpIHsKKyAgICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihlY29kZSksICJpbiBtZXRob2QgJyIgIndyYXBfV2ViUEVuY29kZUJHUiIgIicsIGFyZ3VtZW50ICIgIjMiIiBvZiB0eXBlICciICJpbnQiIiciKTsKKyAgICB9CisgICAgdGVtcDMgPSAoaW50KSh2YWwpOworICAgIGFyZzMgPSAmdGVtcDM7CisgICAgcmVzMyA9IFNXSUdfQWRkVG1wTWFzayhlY29kZSk7CisgIH0KKyAgZWNvZGU1ID0gU1dJR19Bc1ZhbF9pbnQob2JqMywgJnZhbDUpOworICBpZiAoIVNXSUdfSXNPSyhlY29kZTUpKSB7CisgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKGVjb2RlNSksICJpbiBtZXRob2QgJyIgIndyYXBfV2ViUEVuY29kZUJHUiIgIicsIGFyZ3VtZW50ICIgIjUiIiBvZiB0eXBlICciICJpbnQiIiciKTsKKyAgfQorICBhcmc1ID0gKGludCkodmFsNSk7CisgIGVjb2RlNiA9IFNXSUdfQXNWYWxfaW50KG9iajQsICZ2YWw2KTsKKyAgaWYgKCFTV0lHX0lzT0soZWNvZGU2KSkgeworICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihlY29kZTYpLCAiaW4gbWV0aG9kICciICJ3cmFwX1dlYlBFbmNvZGVCR1IiICInLCBhcmd1bWVudCAiICI2IiIgb2YgdHlwZSAnIiAiaW50IiInIik7CisgIH0KKyAgYXJnNiA9IChpbnQpKHZhbDYpOworICBlY29kZTcgPSBTV0lHX0FzVmFsX2ludChvYmo1LCAmdmFsNyk7CisgIGlmICghU1dJR19Jc09LKGVjb2RlNykpIHsKKyAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfQXJnRXJyb3IoZWNvZGU3KSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlQkdSIiAiJywgYXJndW1lbnQgIiAiNyIiIG9mIHR5cGUgJyIgImludCIiJyIpOworICB9CisgIGFyZzcgPSAoaW50KSh2YWw3KTsKKyAgZWNvZGU4ID0gU1dJR19Bc1ZhbF9mbG9hdChvYmo2LCAmdmFsOCk7CisgIGlmICghU1dJR19Jc09LKGVjb2RlOCkpIHsKKyAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfQXJnRXJyb3IoZWNvZGU4KSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlQkdSIiAiJywgYXJndW1lbnQgIiAiOCIiIG9mIHR5cGUgJyIgImZsb2F0IiInIik7CisgIH0KKyAgYXJnOCA9IChmbG9hdCkodmFsOCk7CisgIHJlc3VsdCA9ICh1aW50OF90ICopd3JhcF9XZWJQRW5jb2RlQkdSKCh1aW50OF90IGNvbnN0ICopYXJnMSxhcmcyLGFyZzMsYXJnNCxhcmc1LGFyZzYsYXJnNyxhcmc4KTsKKyAgeworICAgIHJlc3VsdG9iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAorICAgICAgKGNvbnN0IGNoYXIqKXJlc3VsdCwKKyAgICAgIChyZXN1bHQgPT0gTlVMTCkgPyAwIDogUmV0dXJuZWRCdWZmZXJTaXplKCJ3cmFwX1dlYlBFbmNvZGVCR1IiLCBhcmczLCBhcmc0KSk7CisgIH0KKyAgaWYgKFNXSUdfSXNUbXBPYmoocmVzNCkpIHsKKyAgICByZXN1bHRvYmogPSBTV0lHX1B5dGhvbl9BcHBlbmRPdXRwdXQocmVzdWx0b2JqLCBTV0lHX0Zyb21faW50KCgqYXJnNCkpKTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgbmV3X2ZsYWdzID0gU1dJR19Jc05ld09iaihyZXM0KSA/IChTV0lHX1BPSU5URVJfT1dOIHwgIDAgKSA6ICAwIDsKKyAgICByZXN1bHRvYmogPSBTV0lHX1B5dGhvbl9BcHBlbmRPdXRwdXQocmVzdWx0b2JqLCBTV0lHX05ld1BvaW50ZXJPYmooKHZvaWQqKShhcmc0KSwgU1dJR1RZUEVfcF9pbnQsIG5ld19mbGFncykpOworICB9CisgIHsKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZyZ2JfYnVmZmVyMSk7CisgIH0KKyAgaWYgKFNXSUdfSXNOZXdPYmoocmVzMikpIGZyZWUoKGNoYXIqKWFyZzIpOworICBpZiAoU1dJR19Jc05ld09iaihyZXMzKSkgZnJlZSgoY2hhciopYXJnMyk7CisgIGZyZWUocmVzdWx0KTsKKyAgcmV0dXJuIHJlc3VsdG9iajsKK2ZhaWw6CisgIHsKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZyZ2JfYnVmZmVyMSk7CisgIH0KKyAgaWYgKFNXSUdfSXNOZXdPYmoocmVzMikpIGZyZWUoKGNoYXIqKWFyZzIpOworICBpZiAoU1dJR19Jc05ld09iaihyZXMzKSkgZnJlZSgoY2hhciopYXJnMyk7CisgIHJldHVybiBOVUxMOworfQorCisKK1NXSUdJTlRFUk4gUHlPYmplY3QgKl93cmFwX3dyYXBfV2ViUEVuY29kZVJHQkEoUHlPYmplY3QgKlNXSUdVTlVTRURQQVJNKHNlbGYpLCBQeU9iamVjdCAqYXJncykgeworICBQeU9iamVjdCAqcmVzdWx0b2JqID0gMDsKKyAgdWludDhfdCAqYXJnMSA9ICh1aW50OF90ICopIDAgOworICBpbnQgKmFyZzIgPSAoaW50ICopIDAgOworICBpbnQgKmFyZzMgPSAoaW50ICopIDAgOworICBpbnQgKmFyZzQgPSAoaW50ICopIDAgOworICBpbnQgYXJnNSA7CisgIGludCBhcmc2IDsKKyAgaW50IGFyZzcgOworICBmbG9hdCBhcmc4IDsKKyAgUHlfYnVmZmVyIHJnYl9idWZmZXIxIDsKKyAgaW50IHRlbXAyIDsKKyAgaW50IHJlczIgPSAwIDsKKyAgaW50IHRlbXAzIDsKKyAgaW50IHJlczMgPSAwIDsKKyAgaW50IHRlbXA0IDsKKyAgaW50IHJlczQgPSBTV0lHX1RNUE9CSiA7CisgIGludCB2YWw1IDsKKyAgaW50IGVjb2RlNSA9IDAgOworICBpbnQgdmFsNiA7CisgIGludCBlY29kZTYgPSAwIDsKKyAgaW50IHZhbDcgOworICBpbnQgZWNvZGU3ID0gMCA7CisgIGZsb2F0IHZhbDggOworICBpbnQgZWNvZGU4ID0gMCA7CisgIFB5T2JqZWN0ICogb2JqMCA9IDAgOworICBQeU9iamVjdCAqIG9iajEgPSAwIDsKKyAgUHlPYmplY3QgKiBvYmoyID0gMCA7CisgIFB5T2JqZWN0ICogb2JqMyA9IDAgOworICBQeU9iamVjdCAqIG9iajQgPSAwIDsKKyAgUHlPYmplY3QgKiBvYmo1ID0gMCA7CisgIFB5T2JqZWN0ICogb2JqNiA9IDAgOworICB1aW50OF90ICpyZXN1bHQgPSAwIDsKKworICBhcmc0ID0gJnRlbXA0OworICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywoY2hhciAqKSJPT09PT09POndyYXBfV2ViUEVuY29kZVJHQkEiLCZvYmowLCZvYmoxLCZvYmoyLCZvYmozLCZvYmo0LCZvYmo1LCZvYmo2KSkgU1dJR19mYWlsOworICB7CisgICAgLy8gTkI6IHdpdGggUHl0aG9uIDwgMi42IHRoZSBvbGQgc3R5bGUgYnVmZmVyIHByb3RvY29sIG1heSBiZSB1c2VkOgorICAgIC8vIFB5X3NzaXplX3QgdW51c2VkOworICAgIC8vIFB5T2JqZWN0X0FzUmVhZEJ1ZmZlcihvYmowLCAoY29uc3Qgdm9pZCoqKSgmYXJnMSksICZ1bnVzZWQpOworICAgIGlmICghUHlPYmplY3RfQ2hlY2tCdWZmZXIob2JqMCkpIHsKKyAgICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19UeXBlRXJyb3IsCisgICAgICAgICJpbiBtZXRob2QgJ3dyYXBfV2ViUEVuY29kZVJHQkEnLCBhcmd1bWVudCAxIgorICAgICAgICAiIGRvZXMgbm90IHN1cHBvcnQgdGhlIGJ1ZmZlciBpbnRlcmZhY2UiKTsKKyAgICB9CisgICAgaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcihvYmowLCAmcmdiX2J1ZmZlcjEsIFB5QlVGX1NJTVBMRSkpIHsKKyAgICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19SdW50aW1lRXJyb3IsCisgICAgICAgICJpbiBtZXRob2QgJ3dyYXBfV2ViUEVuY29kZVJHQkEnLCB1bmFibGUgdG8gZ2V0IGJ1ZmZlciB2aWV3Iik7CisgICAgfQorICAgIGFyZzEgPSAodWludDhfdCAqKXJnYl9idWZmZXIxLmJ1ZjsKKyAgfQorICBpZiAoIShTV0lHX0lzT0soKHJlczIgPSBTV0lHX0NvbnZlcnRQdHIob2JqMSxTV0lHX2FzX3ZvaWRwdHJwdHIoJmFyZzIpLFNXSUdUWVBFX3BfaW50LDApKSkpKSB7CisgICAgaW50IHZhbDsKKyAgICBpbnQgZWNvZGUgPSBTV0lHX0FzVmFsX2ludChvYmoxLCAmdmFsKTsKKyAgICBpZiAoIVNXSUdfSXNPSyhlY29kZSkpIHsKKyAgICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihlY29kZSksICJpbiBtZXRob2QgJyIgIndyYXBfV2ViUEVuY29kZVJHQkEiICInLCBhcmd1bWVudCAiICIyIiIgb2YgdHlwZSAnIiAiaW50IiInIik7CisgICAgfQorICAgIHRlbXAyID0gKGludCkodmFsKTsKKyAgICBhcmcyID0gJnRlbXAyOworICAgIHJlczIgPSBTV0lHX0FkZFRtcE1hc2soZWNvZGUpOworICB9CisgIGlmICghKFNXSUdfSXNPSygocmVzMyA9IFNXSUdfQ29udmVydFB0cihvYmoyLFNXSUdfYXNfdm9pZHB0cnB0cigmYXJnMyksU1dJR1RZUEVfcF9pbnQsMCkpKSkpIHsKKyAgICBpbnQgdmFsOworICAgIGludCBlY29kZSA9IFNXSUdfQXNWYWxfaW50KG9iajIsICZ2YWwpOworICAgIGlmICghU1dJR19Jc09LKGVjb2RlKSkgeworICAgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKGVjb2RlKSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlUkdCQSIgIicsIGFyZ3VtZW50ICIgIjMiIiBvZiB0eXBlICciICJpbnQiIiciKTsKKyAgICB9CisgICAgdGVtcDMgPSAoaW50KSh2YWwpOworICAgIGFyZzMgPSAmdGVtcDM7CisgICAgcmVzMyA9IFNXSUdfQWRkVG1wTWFzayhlY29kZSk7CisgIH0KKyAgZWNvZGU1ID0gU1dJR19Bc1ZhbF9pbnQob2JqMywgJnZhbDUpOworICBpZiAoIVNXSUdfSXNPSyhlY29kZTUpKSB7CisgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKGVjb2RlNSksICJpbiBtZXRob2QgJyIgIndyYXBfV2ViUEVuY29kZVJHQkEiICInLCBhcmd1bWVudCAiICI1IiIgb2YgdHlwZSAnIiAiaW50IiInIik7CisgIH0KKyAgYXJnNSA9IChpbnQpKHZhbDUpOworICBlY29kZTYgPSBTV0lHX0FzVmFsX2ludChvYmo0LCAmdmFsNik7CisgIGlmICghU1dJR19Jc09LKGVjb2RlNikpIHsKKyAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfQXJnRXJyb3IoZWNvZGU2KSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlUkdCQSIgIicsIGFyZ3VtZW50ICIgIjYiIiBvZiB0eXBlICciICJpbnQiIiciKTsKKyAgfQorICBhcmc2ID0gKGludCkodmFsNik7CisgIGVjb2RlNyA9IFNXSUdfQXNWYWxfaW50KG9iajUsICZ2YWw3KTsKKyAgaWYgKCFTV0lHX0lzT0soZWNvZGU3KSkgeworICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihlY29kZTcpLCAiaW4gbWV0aG9kICciICJ3cmFwX1dlYlBFbmNvZGVSR0JBIiAiJywgYXJndW1lbnQgIiAiNyIiIG9mIHR5cGUgJyIgImludCIiJyIpOworICB9CisgIGFyZzcgPSAoaW50KSh2YWw3KTsKKyAgZWNvZGU4ID0gU1dJR19Bc1ZhbF9mbG9hdChvYmo2LCAmdmFsOCk7CisgIGlmICghU1dJR19Jc09LKGVjb2RlOCkpIHsKKyAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfQXJnRXJyb3IoZWNvZGU4KSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlUkdCQSIgIicsIGFyZ3VtZW50ICIgIjgiIiBvZiB0eXBlICciICJmbG9hdCIiJyIpOworICB9CisgIGFyZzggPSAoZmxvYXQpKHZhbDgpOworICByZXN1bHQgPSAodWludDhfdCAqKXdyYXBfV2ViUEVuY29kZVJHQkEoKHVpbnQ4X3QgY29uc3QgKilhcmcxLGFyZzIsYXJnMyxhcmc0LGFyZzUsYXJnNixhcmc3LGFyZzgpOworICB7CisgICAgcmVzdWx0b2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCisgICAgICAoY29uc3QgY2hhciopcmVzdWx0LAorICAgICAgKHJlc3VsdCA9PSBOVUxMKSA/IDAgOiBSZXR1cm5lZEJ1ZmZlclNpemUoIndyYXBfV2ViUEVuY29kZVJHQkEiLCBhcmczLCBhcmc0KSk7CisgIH0KKyAgaWYgKFNXSUdfSXNUbXBPYmoocmVzNCkpIHsKKyAgICByZXN1bHRvYmogPSBTV0lHX1B5dGhvbl9BcHBlbmRPdXRwdXQocmVzdWx0b2JqLCBTV0lHX0Zyb21faW50KCgqYXJnNCkpKTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgbmV3X2ZsYWdzID0gU1dJR19Jc05ld09iaihyZXM0KSA/IChTV0lHX1BPSU5URVJfT1dOIHwgIDAgKSA6ICAwIDsKKyAgICByZXN1bHRvYmogPSBTV0lHX1B5dGhvbl9BcHBlbmRPdXRwdXQocmVzdWx0b2JqLCBTV0lHX05ld1BvaW50ZXJPYmooKHZvaWQqKShhcmc0KSwgU1dJR1RZUEVfcF9pbnQsIG5ld19mbGFncykpOworICB9CisgIHsKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZyZ2JfYnVmZmVyMSk7CisgIH0KKyAgaWYgKFNXSUdfSXNOZXdPYmoocmVzMikpIGZyZWUoKGNoYXIqKWFyZzIpOworICBpZiAoU1dJR19Jc05ld09iaihyZXMzKSkgZnJlZSgoY2hhciopYXJnMyk7CisgIGZyZWUocmVzdWx0KTsKKyAgcmV0dXJuIHJlc3VsdG9iajsKK2ZhaWw6CisgIHsKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZyZ2JfYnVmZmVyMSk7CisgIH0KKyAgaWYgKFNXSUdfSXNOZXdPYmoocmVzMikpIGZyZWUoKGNoYXIqKWFyZzIpOworICBpZiAoU1dJR19Jc05ld09iaihyZXMzKSkgZnJlZSgoY2hhciopYXJnMyk7CisgIHJldHVybiBOVUxMOworfQorCisKK1NXSUdJTlRFUk4gUHlPYmplY3QgKl93cmFwX3dyYXBfV2ViUEVuY29kZUJHUkEoUHlPYmplY3QgKlNXSUdVTlVTRURQQVJNKHNlbGYpLCBQeU9iamVjdCAqYXJncykgeworICBQeU9iamVjdCAqcmVzdWx0b2JqID0gMDsKKyAgdWludDhfdCAqYXJnMSA9ICh1aW50OF90ICopIDAgOworICBpbnQgKmFyZzIgPSAoaW50ICopIDAgOworICBpbnQgKmFyZzMgPSAoaW50ICopIDAgOworICBpbnQgKmFyZzQgPSAoaW50ICopIDAgOworICBpbnQgYXJnNSA7CisgIGludCBhcmc2IDsKKyAgaW50IGFyZzcgOworICBmbG9hdCBhcmc4IDsKKyAgUHlfYnVmZmVyIHJnYl9idWZmZXIxIDsKKyAgaW50IHRlbXAyIDsKKyAgaW50IHJlczIgPSAwIDsKKyAgaW50IHRlbXAzIDsKKyAgaW50IHJlczMgPSAwIDsKKyAgaW50IHRlbXA0IDsKKyAgaW50IHJlczQgPSBTV0lHX1RNUE9CSiA7CisgIGludCB2YWw1IDsKKyAgaW50IGVjb2RlNSA9IDAgOworICBpbnQgdmFsNiA7CisgIGludCBlY29kZTYgPSAwIDsKKyAgaW50IHZhbDcgOworICBpbnQgZWNvZGU3ID0gMCA7CisgIGZsb2F0IHZhbDggOworICBpbnQgZWNvZGU4ID0gMCA7CisgIFB5T2JqZWN0ICogb2JqMCA9IDAgOworICBQeU9iamVjdCAqIG9iajEgPSAwIDsKKyAgUHlPYmplY3QgKiBvYmoyID0gMCA7CisgIFB5T2JqZWN0ICogb2JqMyA9IDAgOworICBQeU9iamVjdCAqIG9iajQgPSAwIDsKKyAgUHlPYmplY3QgKiBvYmo1ID0gMCA7CisgIFB5T2JqZWN0ICogb2JqNiA9IDAgOworICB1aW50OF90ICpyZXN1bHQgPSAwIDsKKworICBhcmc0ID0gJnRlbXA0OworICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywoY2hhciAqKSJPT09PT09POndyYXBfV2ViUEVuY29kZUJHUkEiLCZvYmowLCZvYmoxLCZvYmoyLCZvYmozLCZvYmo0LCZvYmo1LCZvYmo2KSkgU1dJR19mYWlsOworICB7CisgICAgLy8gTkI6IHdpdGggUHl0aG9uIDwgMi42IHRoZSBvbGQgc3R5bGUgYnVmZmVyIHByb3RvY29sIG1heSBiZSB1c2VkOgorICAgIC8vIFB5X3NzaXplX3QgdW51c2VkOworICAgIC8vIFB5T2JqZWN0X0FzUmVhZEJ1ZmZlcihvYmowLCAoY29uc3Qgdm9pZCoqKSgmYXJnMSksICZ1bnVzZWQpOworICAgIGlmICghUHlPYmplY3RfQ2hlY2tCdWZmZXIob2JqMCkpIHsKKyAgICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19UeXBlRXJyb3IsCisgICAgICAgICJpbiBtZXRob2QgJ3dyYXBfV2ViUEVuY29kZUJHUkEnLCBhcmd1bWVudCAxIgorICAgICAgICAiIGRvZXMgbm90IHN1cHBvcnQgdGhlIGJ1ZmZlciBpbnRlcmZhY2UiKTsKKyAgICB9CisgICAgaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcihvYmowLCAmcmdiX2J1ZmZlcjEsIFB5QlVGX1NJTVBMRSkpIHsKKyAgICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19SdW50aW1lRXJyb3IsCisgICAgICAgICJpbiBtZXRob2QgJ3dyYXBfV2ViUEVuY29kZUJHUkEnLCB1bmFibGUgdG8gZ2V0IGJ1ZmZlciB2aWV3Iik7CisgICAgfQorICAgIGFyZzEgPSAodWludDhfdCAqKXJnYl9idWZmZXIxLmJ1ZjsKKyAgfQorICBpZiAoIShTV0lHX0lzT0soKHJlczIgPSBTV0lHX0NvbnZlcnRQdHIob2JqMSxTV0lHX2FzX3ZvaWRwdHJwdHIoJmFyZzIpLFNXSUdUWVBFX3BfaW50LDApKSkpKSB7CisgICAgaW50IHZhbDsKKyAgICBpbnQgZWNvZGUgPSBTV0lHX0FzVmFsX2ludChvYmoxLCAmdmFsKTsKKyAgICBpZiAoIVNXSUdfSXNPSyhlY29kZSkpIHsKKyAgICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihlY29kZSksICJpbiBtZXRob2QgJyIgIndyYXBfV2ViUEVuY29kZUJHUkEiICInLCBhcmd1bWVudCAiICIyIiIgb2YgdHlwZSAnIiAiaW50IiInIik7CisgICAgfQorICAgIHRlbXAyID0gKGludCkodmFsKTsKKyAgICBhcmcyID0gJnRlbXAyOworICAgIHJlczIgPSBTV0lHX0FkZFRtcE1hc2soZWNvZGUpOworICB9CisgIGlmICghKFNXSUdfSXNPSygocmVzMyA9IFNXSUdfQ29udmVydFB0cihvYmoyLFNXSUdfYXNfdm9pZHB0cnB0cigmYXJnMyksU1dJR1RZUEVfcF9pbnQsMCkpKSkpIHsKKyAgICBpbnQgdmFsOworICAgIGludCBlY29kZSA9IFNXSUdfQXNWYWxfaW50KG9iajIsICZ2YWwpOworICAgIGlmICghU1dJR19Jc09LKGVjb2RlKSkgeworICAgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKGVjb2RlKSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlQkdSQSIgIicsIGFyZ3VtZW50ICIgIjMiIiBvZiB0eXBlICciICJpbnQiIiciKTsKKyAgICB9CisgICAgdGVtcDMgPSAoaW50KSh2YWwpOworICAgIGFyZzMgPSAmdGVtcDM7CisgICAgcmVzMyA9IFNXSUdfQWRkVG1wTWFzayhlY29kZSk7CisgIH0KKyAgZWNvZGU1ID0gU1dJR19Bc1ZhbF9pbnQob2JqMywgJnZhbDUpOworICBpZiAoIVNXSUdfSXNPSyhlY29kZTUpKSB7CisgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKGVjb2RlNSksICJpbiBtZXRob2QgJyIgIndyYXBfV2ViUEVuY29kZUJHUkEiICInLCBhcmd1bWVudCAiICI1IiIgb2YgdHlwZSAnIiAiaW50IiInIik7CisgIH0KKyAgYXJnNSA9IChpbnQpKHZhbDUpOworICBlY29kZTYgPSBTV0lHX0FzVmFsX2ludChvYmo0LCAmdmFsNik7CisgIGlmICghU1dJR19Jc09LKGVjb2RlNikpIHsKKyAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfQXJnRXJyb3IoZWNvZGU2KSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlQkdSQSIgIicsIGFyZ3VtZW50ICIgIjYiIiBvZiB0eXBlICciICJpbnQiIiciKTsKKyAgfQorICBhcmc2ID0gKGludCkodmFsNik7CisgIGVjb2RlNyA9IFNXSUdfQXNWYWxfaW50KG9iajUsICZ2YWw3KTsKKyAgaWYgKCFTV0lHX0lzT0soZWNvZGU3KSkgeworICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihlY29kZTcpLCAiaW4gbWV0aG9kICciICJ3cmFwX1dlYlBFbmNvZGVCR1JBIiAiJywgYXJndW1lbnQgIiAiNyIiIG9mIHR5cGUgJyIgImludCIiJyIpOworICB9CisgIGFyZzcgPSAoaW50KSh2YWw3KTsKKyAgZWNvZGU4ID0gU1dJR19Bc1ZhbF9mbG9hdChvYmo2LCAmdmFsOCk7CisgIGlmICghU1dJR19Jc09LKGVjb2RlOCkpIHsKKyAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfQXJnRXJyb3IoZWNvZGU4KSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlQkdSQSIgIicsIGFyZ3VtZW50ICIgIjgiIiBvZiB0eXBlICciICJmbG9hdCIiJyIpOworICB9CisgIGFyZzggPSAoZmxvYXQpKHZhbDgpOworICByZXN1bHQgPSAodWludDhfdCAqKXdyYXBfV2ViUEVuY29kZUJHUkEoKHVpbnQ4X3QgY29uc3QgKilhcmcxLGFyZzIsYXJnMyxhcmc0LGFyZzUsYXJnNixhcmc3LGFyZzgpOworICB7CisgICAgcmVzdWx0b2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCisgICAgICAoY29uc3QgY2hhciopcmVzdWx0LAorICAgICAgKHJlc3VsdCA9PSBOVUxMKSA/IDAgOiBSZXR1cm5lZEJ1ZmZlclNpemUoIndyYXBfV2ViUEVuY29kZUJHUkEiLCBhcmczLCBhcmc0KSk7CisgIH0KKyAgaWYgKFNXSUdfSXNUbXBPYmoocmVzNCkpIHsKKyAgICByZXN1bHRvYmogPSBTV0lHX1B5dGhvbl9BcHBlbmRPdXRwdXQocmVzdWx0b2JqLCBTV0lHX0Zyb21faW50KCgqYXJnNCkpKTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgbmV3X2ZsYWdzID0gU1dJR19Jc05ld09iaihyZXM0KSA/IChTV0lHX1BPSU5URVJfT1dOIHwgIDAgKSA6ICAwIDsKKyAgICByZXN1bHRvYmogPSBTV0lHX1B5dGhvbl9BcHBlbmRPdXRwdXQocmVzdWx0b2JqLCBTV0lHX05ld1BvaW50ZXJPYmooKHZvaWQqKShhcmc0KSwgU1dJR1RZUEVfcF9pbnQsIG5ld19mbGFncykpOworICB9CisgIHsKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZyZ2JfYnVmZmVyMSk7CisgIH0KKyAgaWYgKFNXSUdfSXNOZXdPYmoocmVzMikpIGZyZWUoKGNoYXIqKWFyZzIpOworICBpZiAoU1dJR19Jc05ld09iaihyZXMzKSkgZnJlZSgoY2hhciopYXJnMyk7CisgIGZyZWUocmVzdWx0KTsKKyAgcmV0dXJuIHJlc3VsdG9iajsKK2ZhaWw6CisgIHsKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZyZ2JfYnVmZmVyMSk7CisgIH0KKyAgaWYgKFNXSUdfSXNOZXdPYmoocmVzMikpIGZyZWUoKGNoYXIqKWFyZzIpOworICBpZiAoU1dJR19Jc05ld09iaihyZXMzKSkgZnJlZSgoY2hhciopYXJnMyk7CisgIHJldHVybiBOVUxMOworfQorCisKK1NXSUdJTlRFUk4gUHlPYmplY3QgKl93cmFwX3dyYXBfV2ViUEVuY29kZUxvc3NsZXNzUkdCKFB5T2JqZWN0ICpTV0lHVU5VU0VEUEFSTShzZWxmKSwgUHlPYmplY3QgKmFyZ3MpIHsKKyAgUHlPYmplY3QgKnJlc3VsdG9iaiA9IDA7CisgIHVpbnQ4X3QgKmFyZzEgPSAodWludDhfdCAqKSAwIDsKKyAgaW50ICphcmcyID0gKGludCAqKSAwIDsKKyAgaW50ICphcmczID0gKGludCAqKSAwIDsKKyAgaW50ICphcmc0ID0gKGludCAqKSAwIDsKKyAgaW50IGFyZzUgOworICBpbnQgYXJnNiA7CisgIGludCBhcmc3IDsKKyAgUHlfYnVmZmVyIHJnYl9idWZmZXIxIDsKKyAgaW50IHRlbXAyIDsKKyAgaW50IHJlczIgPSAwIDsKKyAgaW50IHRlbXAzIDsKKyAgaW50IHJlczMgPSAwIDsKKyAgaW50IHRlbXA0IDsKKyAgaW50IHJlczQgPSBTV0lHX1RNUE9CSiA7CisgIGludCB2YWw1IDsKKyAgaW50IGVjb2RlNSA9IDAgOworICBpbnQgdmFsNiA7CisgIGludCBlY29kZTYgPSAwIDsKKyAgaW50IHZhbDcgOworICBpbnQgZWNvZGU3ID0gMCA7CisgIFB5T2JqZWN0ICogb2JqMCA9IDAgOworICBQeU9iamVjdCAqIG9iajEgPSAwIDsKKyAgUHlPYmplY3QgKiBvYmoyID0gMCA7CisgIFB5T2JqZWN0ICogb2JqMyA9IDAgOworICBQeU9iamVjdCAqIG9iajQgPSAwIDsKKyAgUHlPYmplY3QgKiBvYmo1ID0gMCA7CisgIHVpbnQ4X3QgKnJlc3VsdCA9IDAgOworCisgIGFyZzQgPSAmdGVtcDQ7CisgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLChjaGFyICopIk9PT09PTzp3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc1JHQiIsJm9iajAsJm9iajEsJm9iajIsJm9iajMsJm9iajQsJm9iajUpKSBTV0lHX2ZhaWw7CisgIHsKKyAgICAvLyBOQjogd2l0aCBQeXRob24gPCAyLjYgdGhlIG9sZCBzdHlsZSBidWZmZXIgcHJvdG9jb2wgbWF5IGJlIHVzZWQ6CisgICAgLy8gUHlfc3NpemVfdCB1bnVzZWQ7CisgICAgLy8gUHlPYmplY3RfQXNSZWFkQnVmZmVyKG9iajAsIChjb25zdCB2b2lkKiopKCZhcmcxKSwgJnVudXNlZCk7CisgICAgaWYgKCFQeU9iamVjdF9DaGVja0J1ZmZlcihvYmowKSkgeworICAgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX1R5cGVFcnJvciwKKyAgICAgICAgImluIG1ldGhvZCAnd3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NSR0InLCBhcmd1bWVudCAxIgorICAgICAgICAiIGRvZXMgbm90IHN1cHBvcnQgdGhlIGJ1ZmZlciBpbnRlcmZhY2UiKTsKKyAgICB9CisgICAgaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcihvYmowLCAmcmdiX2J1ZmZlcjEsIFB5QlVGX1NJTVBMRSkpIHsKKyAgICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19SdW50aW1lRXJyb3IsCisgICAgICAgICJpbiBtZXRob2QgJ3dyYXBfV2ViUEVuY29kZUxvc3NsZXNzUkdCJywgdW5hYmxlIHRvIGdldCBidWZmZXIgdmlldyIpOworICAgIH0KKyAgICBhcmcxID0gKHVpbnQ4X3QgKilyZ2JfYnVmZmVyMS5idWY7CisgIH0KKyAgaWYgKCEoU1dJR19Jc09LKChyZXMyID0gU1dJR19Db252ZXJ0UHRyKG9iajEsU1dJR19hc192b2lkcHRycHRyKCZhcmcyKSxTV0lHVFlQRV9wX2ludCwwKSkpKSkgeworICAgIGludCB2YWw7CisgICAgaW50IGVjb2RlID0gU1dJR19Bc1ZhbF9pbnQob2JqMSwgJnZhbCk7CisgICAgaWYgKCFTV0lHX0lzT0soZWNvZGUpKSB7CisgICAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfQXJnRXJyb3IoZWNvZGUpLCAiaW4gbWV0aG9kICciICJ3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc1JHQiIgIicsIGFyZ3VtZW50ICIgIjIiIiBvZiB0eXBlICciICJpbnQiIiciKTsKKyAgICB9CisgICAgdGVtcDIgPSAoaW50KSh2YWwpOworICAgIGFyZzIgPSAmdGVtcDI7CisgICAgcmVzMiA9IFNXSUdfQWRkVG1wTWFzayhlY29kZSk7CisgIH0KKyAgaWYgKCEoU1dJR19Jc09LKChyZXMzID0gU1dJR19Db252ZXJ0UHRyKG9iajIsU1dJR19hc192b2lkcHRycHRyKCZhcmczKSxTV0lHVFlQRV9wX2ludCwwKSkpKSkgeworICAgIGludCB2YWw7CisgICAgaW50IGVjb2RlID0gU1dJR19Bc1ZhbF9pbnQob2JqMiwgJnZhbCk7CisgICAgaWYgKCFTV0lHX0lzT0soZWNvZGUpKSB7CisgICAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfQXJnRXJyb3IoZWNvZGUpLCAiaW4gbWV0aG9kICciICJ3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc1JHQiIgIicsIGFyZ3VtZW50ICIgIjMiIiBvZiB0eXBlICciICJpbnQiIiciKTsKKyAgICB9CisgICAgdGVtcDMgPSAoaW50KSh2YWwpOworICAgIGFyZzMgPSAmdGVtcDM7CisgICAgcmVzMyA9IFNXSUdfQWRkVG1wTWFzayhlY29kZSk7CisgIH0KKyAgZWNvZGU1ID0gU1dJR19Bc1ZhbF9pbnQob2JqMywgJnZhbDUpOworICBpZiAoIVNXSUdfSXNPSyhlY29kZTUpKSB7CisgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKGVjb2RlNSksICJpbiBtZXRob2QgJyIgIndyYXBfV2ViUEVuY29kZUxvc3NsZXNzUkdCIiAiJywgYXJndW1lbnQgIiAiNSIiIG9mIHR5cGUgJyIgImludCIiJyIpOworICB9CisgIGFyZzUgPSAoaW50KSh2YWw1KTsKKyAgZWNvZGU2ID0gU1dJR19Bc1ZhbF9pbnQob2JqNCwgJnZhbDYpOworICBpZiAoIVNXSUdfSXNPSyhlY29kZTYpKSB7CisgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKGVjb2RlNiksICJpbiBtZXRob2QgJyIgIndyYXBfV2ViUEVuY29kZUxvc3NsZXNzUkdCIiAiJywgYXJndW1lbnQgIiAiNiIiIG9mIHR5cGUgJyIgImludCIiJyIpOworICB9CisgIGFyZzYgPSAoaW50KSh2YWw2KTsKKyAgZWNvZGU3ID0gU1dJR19Bc1ZhbF9pbnQob2JqNSwgJnZhbDcpOworICBpZiAoIVNXSUdfSXNPSyhlY29kZTcpKSB7CisgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKGVjb2RlNyksICJpbiBtZXRob2QgJyIgIndyYXBfV2ViUEVuY29kZUxvc3NsZXNzUkdCIiAiJywgYXJndW1lbnQgIiAiNyIiIG9mIHR5cGUgJyIgImludCIiJyIpOworICB9CisgIGFyZzcgPSAoaW50KSh2YWw3KTsKKyAgcmVzdWx0ID0gKHVpbnQ4X3QgKil3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc1JHQigodWludDhfdCBjb25zdCAqKWFyZzEsYXJnMixhcmczLGFyZzQsYXJnNSxhcmc2LGFyZzcpOworICB7CisgICAgcmVzdWx0b2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCisgICAgICAoY29uc3QgY2hhciopcmVzdWx0LAorICAgICAgKHJlc3VsdCA9PSBOVUxMKSA/IDAgOiBSZXR1cm5lZEJ1ZmZlclNpemUoIndyYXBfV2ViUEVuY29kZUxvc3NsZXNzUkdCIiwgYXJnMywgYXJnNCkpOworICB9CisgIGlmIChTV0lHX0lzVG1wT2JqKHJlczQpKSB7CisgICAgcmVzdWx0b2JqID0gU1dJR19QeXRob25fQXBwZW5kT3V0cHV0KHJlc3VsdG9iaiwgU1dJR19Gcm9tX2ludCgoKmFyZzQpKSk7CisgIH0gZWxzZSB7CisgICAgaW50IG5ld19mbGFncyA9IFNXSUdfSXNOZXdPYmoocmVzNCkgPyAoU1dJR19QT0lOVEVSX09XTiB8ICAwICkgOiAgMCA7CisgICAgcmVzdWx0b2JqID0gU1dJR19QeXRob25fQXBwZW5kT3V0cHV0KHJlc3VsdG9iaiwgU1dJR19OZXdQb2ludGVyT2JqKCh2b2lkKikoYXJnNCksIFNXSUdUWVBFX3BfaW50LCBuZXdfZmxhZ3MpKTsKKyAgfQorICB7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmcmdiX2J1ZmZlcjEpOworICB9CisgIGlmIChTV0lHX0lzTmV3T2JqKHJlczIpKSBmcmVlKChjaGFyKilhcmcyKTsKKyAgaWYgKFNXSUdfSXNOZXdPYmoocmVzMykpIGZyZWUoKGNoYXIqKWFyZzMpOworICBmcmVlKHJlc3VsdCk7CisgIHJldHVybiByZXN1bHRvYmo7CitmYWlsOgorICB7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmcmdiX2J1ZmZlcjEpOworICB9CisgIGlmIChTV0lHX0lzTmV3T2JqKHJlczIpKSBmcmVlKChjaGFyKilhcmcyKTsKKyAgaWYgKFNXSUdfSXNOZXdPYmoocmVzMykpIGZyZWUoKGNoYXIqKWFyZzMpOworICByZXR1cm4gTlVMTDsKK30KKworCitTV0lHSU5URVJOIFB5T2JqZWN0ICpfd3JhcF93cmFwX1dlYlBFbmNvZGVMb3NzbGVzc0JHUihQeU9iamVjdCAqU1dJR1VOVVNFRFBBUk0oc2VsZiksIFB5T2JqZWN0ICphcmdzKSB7CisgIFB5T2JqZWN0ICpyZXN1bHRvYmogPSAwOworICB1aW50OF90ICphcmcxID0gKHVpbnQ4X3QgKikgMCA7CisgIGludCAqYXJnMiA9IChpbnQgKikgMCA7CisgIGludCAqYXJnMyA9IChpbnQgKikgMCA7CisgIGludCAqYXJnNCA9IChpbnQgKikgMCA7CisgIGludCBhcmc1IDsKKyAgaW50IGFyZzYgOworICBpbnQgYXJnNyA7CisgIFB5X2J1ZmZlciByZ2JfYnVmZmVyMSA7CisgIGludCB0ZW1wMiA7CisgIGludCByZXMyID0gMCA7CisgIGludCB0ZW1wMyA7CisgIGludCByZXMzID0gMCA7CisgIGludCB0ZW1wNCA7CisgIGludCByZXM0ID0gU1dJR19UTVBPQkogOworICBpbnQgdmFsNSA7CisgIGludCBlY29kZTUgPSAwIDsKKyAgaW50IHZhbDYgOworICBpbnQgZWNvZGU2ID0gMCA7CisgIGludCB2YWw3IDsKKyAgaW50IGVjb2RlNyA9IDAgOworICBQeU9iamVjdCAqIG9iajAgPSAwIDsKKyAgUHlPYmplY3QgKiBvYmoxID0gMCA7CisgIFB5T2JqZWN0ICogb2JqMiA9IDAgOworICBQeU9iamVjdCAqIG9iajMgPSAwIDsKKyAgUHlPYmplY3QgKiBvYmo0ID0gMCA7CisgIFB5T2JqZWN0ICogb2JqNSA9IDAgOworICB1aW50OF90ICpyZXN1bHQgPSAwIDsKKworICBhcmc0ID0gJnRlbXA0OworICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywoY2hhciAqKSJPT09PT086d3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NCR1IiLCZvYmowLCZvYmoxLCZvYmoyLCZvYmozLCZvYmo0LCZvYmo1KSkgU1dJR19mYWlsOworICB7CisgICAgLy8gTkI6IHdpdGggUHl0aG9uIDwgMi42IHRoZSBvbGQgc3R5bGUgYnVmZmVyIHByb3RvY29sIG1heSBiZSB1c2VkOgorICAgIC8vIFB5X3NzaXplX3QgdW51c2VkOworICAgIC8vIFB5T2JqZWN0X0FzUmVhZEJ1ZmZlcihvYmowLCAoY29uc3Qgdm9pZCoqKSgmYXJnMSksICZ1bnVzZWQpOworICAgIGlmICghUHlPYmplY3RfQ2hlY2tCdWZmZXIob2JqMCkpIHsKKyAgICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19UeXBlRXJyb3IsCisgICAgICAgICJpbiBtZXRob2QgJ3dyYXBfV2ViUEVuY29kZUxvc3NsZXNzQkdSJywgYXJndW1lbnQgMSIKKyAgICAgICAgIiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBidWZmZXIgaW50ZXJmYWNlIik7CisgICAgfQorICAgIGlmIChQeU9iamVjdF9HZXRCdWZmZXIob2JqMCwgJnJnYl9idWZmZXIxLCBQeUJVRl9TSU1QTEUpKSB7CisgICAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfUnVudGltZUVycm9yLAorICAgICAgICAiaW4gbWV0aG9kICd3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc0JHUicsIHVuYWJsZSB0byBnZXQgYnVmZmVyIHZpZXciKTsKKyAgICB9CisgICAgYXJnMSA9ICh1aW50OF90ICopcmdiX2J1ZmZlcjEuYnVmOworICB9CisgIGlmICghKFNXSUdfSXNPSygocmVzMiA9IFNXSUdfQ29udmVydFB0cihvYmoxLFNXSUdfYXNfdm9pZHB0cnB0cigmYXJnMiksU1dJR1RZUEVfcF9pbnQsMCkpKSkpIHsKKyAgICBpbnQgdmFsOworICAgIGludCBlY29kZSA9IFNXSUdfQXNWYWxfaW50KG9iajEsICZ2YWwpOworICAgIGlmICghU1dJR19Jc09LKGVjb2RlKSkgeworICAgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKGVjb2RlKSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NCR1IiICInLCBhcmd1bWVudCAiICIyIiIgb2YgdHlwZSAnIiAiaW50IiInIik7CisgICAgfQorICAgIHRlbXAyID0gKGludCkodmFsKTsKKyAgICBhcmcyID0gJnRlbXAyOworICAgIHJlczIgPSBTV0lHX0FkZFRtcE1hc2soZWNvZGUpOworICB9CisgIGlmICghKFNXSUdfSXNPSygocmVzMyA9IFNXSUdfQ29udmVydFB0cihvYmoyLFNXSUdfYXNfdm9pZHB0cnB0cigmYXJnMyksU1dJR1RZUEVfcF9pbnQsMCkpKSkpIHsKKyAgICBpbnQgdmFsOworICAgIGludCBlY29kZSA9IFNXSUdfQXNWYWxfaW50KG9iajIsICZ2YWwpOworICAgIGlmICghU1dJR19Jc09LKGVjb2RlKSkgeworICAgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKGVjb2RlKSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NCR1IiICInLCBhcmd1bWVudCAiICIzIiIgb2YgdHlwZSAnIiAiaW50IiInIik7CisgICAgfQorICAgIHRlbXAzID0gKGludCkodmFsKTsKKyAgICBhcmczID0gJnRlbXAzOworICAgIHJlczMgPSBTV0lHX0FkZFRtcE1hc2soZWNvZGUpOworICB9CisgIGVjb2RlNSA9IFNXSUdfQXNWYWxfaW50KG9iajMsICZ2YWw1KTsKKyAgaWYgKCFTV0lHX0lzT0soZWNvZGU1KSkgeworICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihlY29kZTUpLCAiaW4gbWV0aG9kICciICJ3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc0JHUiIgIicsIGFyZ3VtZW50ICIgIjUiIiBvZiB0eXBlICciICJpbnQiIiciKTsKKyAgfQorICBhcmc1ID0gKGludCkodmFsNSk7CisgIGVjb2RlNiA9IFNXSUdfQXNWYWxfaW50KG9iajQsICZ2YWw2KTsKKyAgaWYgKCFTV0lHX0lzT0soZWNvZGU2KSkgeworICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihlY29kZTYpLCAiaW4gbWV0aG9kICciICJ3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc0JHUiIgIicsIGFyZ3VtZW50ICIgIjYiIiBvZiB0eXBlICciICJpbnQiIiciKTsKKyAgfQorICBhcmc2ID0gKGludCkodmFsNik7CisgIGVjb2RlNyA9IFNXSUdfQXNWYWxfaW50KG9iajUsICZ2YWw3KTsKKyAgaWYgKCFTV0lHX0lzT0soZWNvZGU3KSkgeworICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihlY29kZTcpLCAiaW4gbWV0aG9kICciICJ3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc0JHUiIgIicsIGFyZ3VtZW50ICIgIjciIiBvZiB0eXBlICciICJpbnQiIiciKTsKKyAgfQorICBhcmc3ID0gKGludCkodmFsNyk7CisgIHJlc3VsdCA9ICh1aW50OF90ICopd3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NCR1IoKHVpbnQ4X3QgY29uc3QgKilhcmcxLGFyZzIsYXJnMyxhcmc0LGFyZzUsYXJnNixhcmc3KTsKKyAgeworICAgIHJlc3VsdG9iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAorICAgICAgKGNvbnN0IGNoYXIqKXJlc3VsdCwKKyAgICAgIChyZXN1bHQgPT0gTlVMTCkgPyAwIDogUmV0dXJuZWRCdWZmZXJTaXplKCJ3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc0JHUiIsIGFyZzMsIGFyZzQpKTsKKyAgfQorICBpZiAoU1dJR19Jc1RtcE9iaihyZXM0KSkgeworICAgIHJlc3VsdG9iaiA9IFNXSUdfUHl0aG9uX0FwcGVuZE91dHB1dChyZXN1bHRvYmosIFNXSUdfRnJvbV9pbnQoKCphcmc0KSkpOworICB9IGVsc2UgeworICAgIGludCBuZXdfZmxhZ3MgPSBTV0lHX0lzTmV3T2JqKHJlczQpID8gKFNXSUdfUE9JTlRFUl9PV04gfCAgMCApIDogIDAgOworICAgIHJlc3VsdG9iaiA9IFNXSUdfUHl0aG9uX0FwcGVuZE91dHB1dChyZXN1bHRvYmosIFNXSUdfTmV3UG9pbnRlck9iaigodm9pZCopKGFyZzQpLCBTV0lHVFlQRV9wX2ludCwgbmV3X2ZsYWdzKSk7CisgIH0KKyAgeworICAgIFB5QnVmZmVyX1JlbGVhc2UoJnJnYl9idWZmZXIxKTsKKyAgfQorICBpZiAoU1dJR19Jc05ld09iaihyZXMyKSkgZnJlZSgoY2hhciopYXJnMik7CisgIGlmIChTV0lHX0lzTmV3T2JqKHJlczMpKSBmcmVlKChjaGFyKilhcmczKTsKKyAgZnJlZShyZXN1bHQpOworICByZXR1cm4gcmVzdWx0b2JqOworZmFpbDoKKyAgeworICAgIFB5QnVmZmVyX1JlbGVhc2UoJnJnYl9idWZmZXIxKTsKKyAgfQorICBpZiAoU1dJR19Jc05ld09iaihyZXMyKSkgZnJlZSgoY2hhciopYXJnMik7CisgIGlmIChTV0lHX0lzTmV3T2JqKHJlczMpKSBmcmVlKChjaGFyKilhcmczKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKworU1dJR0lOVEVSTiBQeU9iamVjdCAqX3dyYXBfd3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NSR0JBKFB5T2JqZWN0ICpTV0lHVU5VU0VEUEFSTShzZWxmKSwgUHlPYmplY3QgKmFyZ3MpIHsKKyAgUHlPYmplY3QgKnJlc3VsdG9iaiA9IDA7CisgIHVpbnQ4X3QgKmFyZzEgPSAodWludDhfdCAqKSAwIDsKKyAgaW50ICphcmcyID0gKGludCAqKSAwIDsKKyAgaW50ICphcmczID0gKGludCAqKSAwIDsKKyAgaW50ICphcmc0ID0gKGludCAqKSAwIDsKKyAgaW50IGFyZzUgOworICBpbnQgYXJnNiA7CisgIGludCBhcmc3IDsKKyAgUHlfYnVmZmVyIHJnYl9idWZmZXIxIDsKKyAgaW50IHRlbXAyIDsKKyAgaW50IHJlczIgPSAwIDsKKyAgaW50IHRlbXAzIDsKKyAgaW50IHJlczMgPSAwIDsKKyAgaW50IHRlbXA0IDsKKyAgaW50IHJlczQgPSBTV0lHX1RNUE9CSiA7CisgIGludCB2YWw1IDsKKyAgaW50IGVjb2RlNSA9IDAgOworICBpbnQgdmFsNiA7CisgIGludCBlY29kZTYgPSAwIDsKKyAgaW50IHZhbDcgOworICBpbnQgZWNvZGU3ID0gMCA7CisgIFB5T2JqZWN0ICogb2JqMCA9IDAgOworICBQeU9iamVjdCAqIG9iajEgPSAwIDsKKyAgUHlPYmplY3QgKiBvYmoyID0gMCA7CisgIFB5T2JqZWN0ICogb2JqMyA9IDAgOworICBQeU9iamVjdCAqIG9iajQgPSAwIDsKKyAgUHlPYmplY3QgKiBvYmo1ID0gMCA7CisgIHVpbnQ4X3QgKnJlc3VsdCA9IDAgOworCisgIGFyZzQgPSAmdGVtcDQ7CisgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLChjaGFyICopIk9PT09PTzp3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc1JHQkEiLCZvYmowLCZvYmoxLCZvYmoyLCZvYmozLCZvYmo0LCZvYmo1KSkgU1dJR19mYWlsOworICB7CisgICAgLy8gTkI6IHdpdGggUHl0aG9uIDwgMi42IHRoZSBvbGQgc3R5bGUgYnVmZmVyIHByb3RvY29sIG1heSBiZSB1c2VkOgorICAgIC8vIFB5X3NzaXplX3QgdW51c2VkOworICAgIC8vIFB5T2JqZWN0X0FzUmVhZEJ1ZmZlcihvYmowLCAoY29uc3Qgdm9pZCoqKSgmYXJnMSksICZ1bnVzZWQpOworICAgIGlmICghUHlPYmplY3RfQ2hlY2tCdWZmZXIob2JqMCkpIHsKKyAgICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19UeXBlRXJyb3IsCisgICAgICAgICJpbiBtZXRob2QgJ3dyYXBfV2ViUEVuY29kZUxvc3NsZXNzUkdCQScsIGFyZ3VtZW50IDEiCisgICAgICAgICIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgYnVmZmVyIGludGVyZmFjZSIpOworICAgIH0KKyAgICBpZiAoUHlPYmplY3RfR2V0QnVmZmVyKG9iajAsICZyZ2JfYnVmZmVyMSwgUHlCVUZfU0lNUExFKSkgeworICAgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX1J1bnRpbWVFcnJvciwKKyAgICAgICAgImluIG1ldGhvZCAnd3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NSR0JBJywgdW5hYmxlIHRvIGdldCBidWZmZXIgdmlldyIpOworICAgIH0KKyAgICBhcmcxID0gKHVpbnQ4X3QgKilyZ2JfYnVmZmVyMS5idWY7CisgIH0KKyAgaWYgKCEoU1dJR19Jc09LKChyZXMyID0gU1dJR19Db252ZXJ0UHRyKG9iajEsU1dJR19hc192b2lkcHRycHRyKCZhcmcyKSxTV0lHVFlQRV9wX2ludCwwKSkpKSkgeworICAgIGludCB2YWw7CisgICAgaW50IGVjb2RlID0gU1dJR19Bc1ZhbF9pbnQob2JqMSwgJnZhbCk7CisgICAgaWYgKCFTV0lHX0lzT0soZWNvZGUpKSB7CisgICAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfQXJnRXJyb3IoZWNvZGUpLCAiaW4gbWV0aG9kICciICJ3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc1JHQkEiICInLCBhcmd1bWVudCAiICIyIiIgb2YgdHlwZSAnIiAiaW50IiInIik7CisgICAgfQorICAgIHRlbXAyID0gKGludCkodmFsKTsKKyAgICBhcmcyID0gJnRlbXAyOworICAgIHJlczIgPSBTV0lHX0FkZFRtcE1hc2soZWNvZGUpOworICB9CisgIGlmICghKFNXSUdfSXNPSygocmVzMyA9IFNXSUdfQ29udmVydFB0cihvYmoyLFNXSUdfYXNfdm9pZHB0cnB0cigmYXJnMyksU1dJR1RZUEVfcF9pbnQsMCkpKSkpIHsKKyAgICBpbnQgdmFsOworICAgIGludCBlY29kZSA9IFNXSUdfQXNWYWxfaW50KG9iajIsICZ2YWwpOworICAgIGlmICghU1dJR19Jc09LKGVjb2RlKSkgeworICAgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKGVjb2RlKSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NSR0JBIiAiJywgYXJndW1lbnQgIiAiMyIiIG9mIHR5cGUgJyIgImludCIiJyIpOworICAgIH0KKyAgICB0ZW1wMyA9IChpbnQpKHZhbCk7CisgICAgYXJnMyA9ICZ0ZW1wMzsKKyAgICByZXMzID0gU1dJR19BZGRUbXBNYXNrKGVjb2RlKTsKKyAgfQorICBlY29kZTUgPSBTV0lHX0FzVmFsX2ludChvYmozLCAmdmFsNSk7CisgIGlmICghU1dJR19Jc09LKGVjb2RlNSkpIHsKKyAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfQXJnRXJyb3IoZWNvZGU1KSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NSR0JBIiAiJywgYXJndW1lbnQgIiAiNSIiIG9mIHR5cGUgJyIgImludCIiJyIpOworICB9CisgIGFyZzUgPSAoaW50KSh2YWw1KTsKKyAgZWNvZGU2ID0gU1dJR19Bc1ZhbF9pbnQob2JqNCwgJnZhbDYpOworICBpZiAoIVNXSUdfSXNPSyhlY29kZTYpKSB7CisgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKGVjb2RlNiksICJpbiBtZXRob2QgJyIgIndyYXBfV2ViUEVuY29kZUxvc3NsZXNzUkdCQSIgIicsIGFyZ3VtZW50ICIgIjYiIiBvZiB0eXBlICciICJpbnQiIiciKTsKKyAgfQorICBhcmc2ID0gKGludCkodmFsNik7CisgIGVjb2RlNyA9IFNXSUdfQXNWYWxfaW50KG9iajUsICZ2YWw3KTsKKyAgaWYgKCFTV0lHX0lzT0soZWNvZGU3KSkgeworICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihlY29kZTcpLCAiaW4gbWV0aG9kICciICJ3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc1JHQkEiICInLCBhcmd1bWVudCAiICI3IiIgb2YgdHlwZSAnIiAiaW50IiInIik7CisgIH0KKyAgYXJnNyA9IChpbnQpKHZhbDcpOworICByZXN1bHQgPSAodWludDhfdCAqKXdyYXBfV2ViUEVuY29kZUxvc3NsZXNzUkdCQSgodWludDhfdCBjb25zdCAqKWFyZzEsYXJnMixhcmczLGFyZzQsYXJnNSxhcmc2LGFyZzcpOworICB7CisgICAgcmVzdWx0b2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCisgICAgICAoY29uc3QgY2hhciopcmVzdWx0LAorICAgICAgKHJlc3VsdCA9PSBOVUxMKSA/IDAgOiBSZXR1cm5lZEJ1ZmZlclNpemUoIndyYXBfV2ViUEVuY29kZUxvc3NsZXNzUkdCQSIsIGFyZzMsIGFyZzQpKTsKKyAgfQorICBpZiAoU1dJR19Jc1RtcE9iaihyZXM0KSkgeworICAgIHJlc3VsdG9iaiA9IFNXSUdfUHl0aG9uX0FwcGVuZE91dHB1dChyZXN1bHRvYmosIFNXSUdfRnJvbV9pbnQoKCphcmc0KSkpOworICB9IGVsc2UgeworICAgIGludCBuZXdfZmxhZ3MgPSBTV0lHX0lzTmV3T2JqKHJlczQpID8gKFNXSUdfUE9JTlRFUl9PV04gfCAgMCApIDogIDAgOworICAgIHJlc3VsdG9iaiA9IFNXSUdfUHl0aG9uX0FwcGVuZE91dHB1dChyZXN1bHRvYmosIFNXSUdfTmV3UG9pbnRlck9iaigodm9pZCopKGFyZzQpLCBTV0lHVFlQRV9wX2ludCwgbmV3X2ZsYWdzKSk7CisgIH0KKyAgeworICAgIFB5QnVmZmVyX1JlbGVhc2UoJnJnYl9idWZmZXIxKTsKKyAgfQorICBpZiAoU1dJR19Jc05ld09iaihyZXMyKSkgZnJlZSgoY2hhciopYXJnMik7CisgIGlmIChTV0lHX0lzTmV3T2JqKHJlczMpKSBmcmVlKChjaGFyKilhcmczKTsKKyAgZnJlZShyZXN1bHQpOworICByZXR1cm4gcmVzdWx0b2JqOworZmFpbDoKKyAgeworICAgIFB5QnVmZmVyX1JlbGVhc2UoJnJnYl9idWZmZXIxKTsKKyAgfQorICBpZiAoU1dJR19Jc05ld09iaihyZXMyKSkgZnJlZSgoY2hhciopYXJnMik7CisgIGlmIChTV0lHX0lzTmV3T2JqKHJlczMpKSBmcmVlKChjaGFyKilhcmczKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKworU1dJR0lOVEVSTiBQeU9iamVjdCAqX3dyYXBfd3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NCR1JBKFB5T2JqZWN0ICpTV0lHVU5VU0VEUEFSTShzZWxmKSwgUHlPYmplY3QgKmFyZ3MpIHsKKyAgUHlPYmplY3QgKnJlc3VsdG9iaiA9IDA7CisgIHVpbnQ4X3QgKmFyZzEgPSAodWludDhfdCAqKSAwIDsKKyAgaW50ICphcmcyID0gKGludCAqKSAwIDsKKyAgaW50ICphcmczID0gKGludCAqKSAwIDsKKyAgaW50ICphcmc0ID0gKGludCAqKSAwIDsKKyAgaW50IGFyZzUgOworICBpbnQgYXJnNiA7CisgIGludCBhcmc3IDsKKyAgUHlfYnVmZmVyIHJnYl9idWZmZXIxIDsKKyAgaW50IHRlbXAyIDsKKyAgaW50IHJlczIgPSAwIDsKKyAgaW50IHRlbXAzIDsKKyAgaW50IHJlczMgPSAwIDsKKyAgaW50IHRlbXA0IDsKKyAgaW50IHJlczQgPSBTV0lHX1RNUE9CSiA7CisgIGludCB2YWw1IDsKKyAgaW50IGVjb2RlNSA9IDAgOworICBpbnQgdmFsNiA7CisgIGludCBlY29kZTYgPSAwIDsKKyAgaW50IHZhbDcgOworICBpbnQgZWNvZGU3ID0gMCA7CisgIFB5T2JqZWN0ICogb2JqMCA9IDAgOworICBQeU9iamVjdCAqIG9iajEgPSAwIDsKKyAgUHlPYmplY3QgKiBvYmoyID0gMCA7CisgIFB5T2JqZWN0ICogb2JqMyA9IDAgOworICBQeU9iamVjdCAqIG9iajQgPSAwIDsKKyAgUHlPYmplY3QgKiBvYmo1ID0gMCA7CisgIHVpbnQ4X3QgKnJlc3VsdCA9IDAgOworCisgIGFyZzQgPSAmdGVtcDQ7CisgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLChjaGFyICopIk9PT09PTzp3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc0JHUkEiLCZvYmowLCZvYmoxLCZvYmoyLCZvYmozLCZvYmo0LCZvYmo1KSkgU1dJR19mYWlsOworICB7CisgICAgLy8gTkI6IHdpdGggUHl0aG9uIDwgMi42IHRoZSBvbGQgc3R5bGUgYnVmZmVyIHByb3RvY29sIG1heSBiZSB1c2VkOgorICAgIC8vIFB5X3NzaXplX3QgdW51c2VkOworICAgIC8vIFB5T2JqZWN0X0FzUmVhZEJ1ZmZlcihvYmowLCAoY29uc3Qgdm9pZCoqKSgmYXJnMSksICZ1bnVzZWQpOworICAgIGlmICghUHlPYmplY3RfQ2hlY2tCdWZmZXIob2JqMCkpIHsKKyAgICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19UeXBlRXJyb3IsCisgICAgICAgICJpbiBtZXRob2QgJ3dyYXBfV2ViUEVuY29kZUxvc3NsZXNzQkdSQScsIGFyZ3VtZW50IDEiCisgICAgICAgICIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgYnVmZmVyIGludGVyZmFjZSIpOworICAgIH0KKyAgICBpZiAoUHlPYmplY3RfR2V0QnVmZmVyKG9iajAsICZyZ2JfYnVmZmVyMSwgUHlCVUZfU0lNUExFKSkgeworICAgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX1J1bnRpbWVFcnJvciwKKyAgICAgICAgImluIG1ldGhvZCAnd3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NCR1JBJywgdW5hYmxlIHRvIGdldCBidWZmZXIgdmlldyIpOworICAgIH0KKyAgICBhcmcxID0gKHVpbnQ4X3QgKilyZ2JfYnVmZmVyMS5idWY7CisgIH0KKyAgaWYgKCEoU1dJR19Jc09LKChyZXMyID0gU1dJR19Db252ZXJ0UHRyKG9iajEsU1dJR19hc192b2lkcHRycHRyKCZhcmcyKSxTV0lHVFlQRV9wX2ludCwwKSkpKSkgeworICAgIGludCB2YWw7CisgICAgaW50IGVjb2RlID0gU1dJR19Bc1ZhbF9pbnQob2JqMSwgJnZhbCk7CisgICAgaWYgKCFTV0lHX0lzT0soZWNvZGUpKSB7CisgICAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfQXJnRXJyb3IoZWNvZGUpLCAiaW4gbWV0aG9kICciICJ3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc0JHUkEiICInLCBhcmd1bWVudCAiICIyIiIgb2YgdHlwZSAnIiAiaW50IiInIik7CisgICAgfQorICAgIHRlbXAyID0gKGludCkodmFsKTsKKyAgICBhcmcyID0gJnRlbXAyOworICAgIHJlczIgPSBTV0lHX0FkZFRtcE1hc2soZWNvZGUpOworICB9CisgIGlmICghKFNXSUdfSXNPSygocmVzMyA9IFNXSUdfQ29udmVydFB0cihvYmoyLFNXSUdfYXNfdm9pZHB0cnB0cigmYXJnMyksU1dJR1RZUEVfcF9pbnQsMCkpKSkpIHsKKyAgICBpbnQgdmFsOworICAgIGludCBlY29kZSA9IFNXSUdfQXNWYWxfaW50KG9iajIsICZ2YWwpOworICAgIGlmICghU1dJR19Jc09LKGVjb2RlKSkgeworICAgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKGVjb2RlKSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NCR1JBIiAiJywgYXJndW1lbnQgIiAiMyIiIG9mIHR5cGUgJyIgImludCIiJyIpOworICAgIH0KKyAgICB0ZW1wMyA9IChpbnQpKHZhbCk7CisgICAgYXJnMyA9ICZ0ZW1wMzsKKyAgICByZXMzID0gU1dJR19BZGRUbXBNYXNrKGVjb2RlKTsKKyAgfQorICBlY29kZTUgPSBTV0lHX0FzVmFsX2ludChvYmozLCAmdmFsNSk7CisgIGlmICghU1dJR19Jc09LKGVjb2RlNSkpIHsKKyAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfQXJnRXJyb3IoZWNvZGU1KSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NCR1JBIiAiJywgYXJndW1lbnQgIiAiNSIiIG9mIHR5cGUgJyIgImludCIiJyIpOworICB9CisgIGFyZzUgPSAoaW50KSh2YWw1KTsKKyAgZWNvZGU2ID0gU1dJR19Bc1ZhbF9pbnQob2JqNCwgJnZhbDYpOworICBpZiAoIVNXSUdfSXNPSyhlY29kZTYpKSB7CisgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKGVjb2RlNiksICJpbiBtZXRob2QgJyIgIndyYXBfV2ViUEVuY29kZUxvc3NsZXNzQkdSQSIgIicsIGFyZ3VtZW50ICIgIjYiIiBvZiB0eXBlICciICJpbnQiIiciKTsKKyAgfQorICBhcmc2ID0gKGludCkodmFsNik7CisgIGVjb2RlNyA9IFNXSUdfQXNWYWxfaW50KG9iajUsICZ2YWw3KTsKKyAgaWYgKCFTV0lHX0lzT0soZWNvZGU3KSkgeworICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihlY29kZTcpLCAiaW4gbWV0aG9kICciICJ3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc0JHUkEiICInLCBhcmd1bWVudCAiICI3IiIgb2YgdHlwZSAnIiAiaW50IiInIik7CisgIH0KKyAgYXJnNyA9IChpbnQpKHZhbDcpOworICByZXN1bHQgPSAodWludDhfdCAqKXdyYXBfV2ViUEVuY29kZUxvc3NsZXNzQkdSQSgodWludDhfdCBjb25zdCAqKWFyZzEsYXJnMixhcmczLGFyZzQsYXJnNSxhcmc2LGFyZzcpOworICB7CisgICAgcmVzdWx0b2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCisgICAgICAoY29uc3QgY2hhciopcmVzdWx0LAorICAgICAgKHJlc3VsdCA9PSBOVUxMKSA/IDAgOiBSZXR1cm5lZEJ1ZmZlclNpemUoIndyYXBfV2ViUEVuY29kZUxvc3NsZXNzQkdSQSIsIGFyZzMsIGFyZzQpKTsKKyAgfQorICBpZiAoU1dJR19Jc1RtcE9iaihyZXM0KSkgeworICAgIHJlc3VsdG9iaiA9IFNXSUdfUHl0aG9uX0FwcGVuZE91dHB1dChyZXN1bHRvYmosIFNXSUdfRnJvbV9pbnQoKCphcmc0KSkpOworICB9IGVsc2UgeworICAgIGludCBuZXdfZmxhZ3MgPSBTV0lHX0lzTmV3T2JqKHJlczQpID8gKFNXSUdfUE9JTlRFUl9PV04gfCAgMCApIDogIDAgOworICAgIHJlc3VsdG9iaiA9IFNXSUdfUHl0aG9uX0FwcGVuZE91dHB1dChyZXN1bHRvYmosIFNXSUdfTmV3UG9pbnRlck9iaigodm9pZCopKGFyZzQpLCBTV0lHVFlQRV9wX2ludCwgbmV3X2ZsYWdzKSk7CisgIH0KKyAgeworICAgIFB5QnVmZmVyX1JlbGVhc2UoJnJnYl9idWZmZXIxKTsKKyAgfQorICBpZiAoU1dJR19Jc05ld09iaihyZXMyKSkgZnJlZSgoY2hhciopYXJnMik7CisgIGlmIChTV0lHX0lzTmV3T2JqKHJlczMpKSBmcmVlKChjaGFyKilhcmczKTsKKyAgZnJlZShyZXN1bHQpOworICByZXR1cm4gcmVzdWx0b2JqOworZmFpbDoKKyAgeworICAgIFB5QnVmZmVyX1JlbGVhc2UoJnJnYl9idWZmZXIxKTsKKyAgfQorICBpZiAoU1dJR19Jc05ld09iaihyZXMyKSkgZnJlZSgoY2hhciopYXJnMik7CisgIGlmIChTV0lHX0lzTmV3T2JqKHJlczMpKSBmcmVlKChjaGFyKilhcmczKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKworc3RhdGljIFB5TWV0aG9kRGVmIFN3aWdNZXRob2RzW10gPSB7CisgICAgICAgICB7IChjaGFyICopIlNXSUdfUHlJbnN0YW5jZU1ldGhvZF9OZXciLCAoUHlDRnVuY3Rpb24pU1dJR19QeUluc3RhbmNlTWV0aG9kX05ldywgTUVUSF9PLCBOVUxMfSwKKyAgICAgICAgIHsgKGNoYXIgKikiV2ViUEdldERlY29kZXJWZXJzaW9uIiwgX3dyYXBfV2ViUEdldERlY29kZXJWZXJzaW9uLCBNRVRIX1ZBUkFSR1MsIChjaGFyICopIldlYlBHZXREZWNvZGVyVmVyc2lvbigpIC0+IGludCJ9LAorICAgICAgICAgeyAoY2hhciAqKSJXZWJQR2V0SW5mbyIsIF93cmFwX1dlYlBHZXRJbmZvLCBNRVRIX1ZBUkFSR1MsIChjaGFyICopIldlYlBHZXRJbmZvKHVpbnQ4X3QgZGF0YSkgLT4gKHdpZHRoLCBoZWlnaHQpIn0sCisgICAgICAgICB7IChjaGFyICopIldlYlBEZWNvZGVSR0IiLCBfd3JhcF9XZWJQRGVjb2RlUkdCLCBNRVRIX1ZBUkFSR1MsIChjaGFyICopIldlYlBEZWNvZGVSR0IodWludDhfdCBkYXRhKSAtPiAocmdiLCB3aWR0aCwgaGVpZ2h0KSJ9LAorICAgICAgICAgeyAoY2hhciAqKSJXZWJQRGVjb2RlUkdCQSIsIF93cmFwX1dlYlBEZWNvZGVSR0JBLCBNRVRIX1ZBUkFSR1MsIChjaGFyICopIldlYlBEZWNvZGVSR0JBKHVpbnQ4X3QgZGF0YSkgLT4gKHJnYiwgd2lkdGgsIGhlaWdodCkifSwKKyAgICAgICAgIHsgKGNoYXIgKikiV2ViUERlY29kZUFSR0IiLCBfd3JhcF9XZWJQRGVjb2RlQVJHQiwgTUVUSF9WQVJBUkdTLCAoY2hhciAqKSJXZWJQRGVjb2RlQVJHQih1aW50OF90IGRhdGEpIC0+IChyZ2IsIHdpZHRoLCBoZWlnaHQpIn0sCisgICAgICAgICB7IChjaGFyICopIldlYlBEZWNvZGVCR1IiLCBfd3JhcF9XZWJQRGVjb2RlQkdSLCBNRVRIX1ZBUkFSR1MsIChjaGFyICopIldlYlBEZWNvZGVCR1IodWludDhfdCBkYXRhKSAtPiAocmdiLCB3aWR0aCwgaGVpZ2h0KSJ9LAorICAgICAgICAgeyAoY2hhciAqKSJXZWJQRGVjb2RlQkdSQSIsIF93cmFwX1dlYlBEZWNvZGVCR1JBLCBNRVRIX1ZBUkFSR1MsIChjaGFyICopIldlYlBEZWNvZGVCR1JBKHVpbnQ4X3QgZGF0YSkgLT4gKHJnYiwgd2lkdGgsIGhlaWdodCkifSwKKyAgICAgICAgIHsgKGNoYXIgKikiV2ViUEdldEVuY29kZXJWZXJzaW9uIiwgX3dyYXBfV2ViUEdldEVuY29kZXJWZXJzaW9uLCBNRVRIX1ZBUkFSR1MsIChjaGFyICopIldlYlBHZXRFbmNvZGVyVmVyc2lvbigpIC0+IGludCJ9LAorICAgICAgICAgeyAoY2hhciAqKSJ3cmFwX1dlYlBFbmNvZGVSR0IiLCBfd3JhcF93cmFwX1dlYlBFbmNvZGVSR0IsIE1FVEhfVkFSQVJHUywgKGNoYXIgKikicHJpdmF0ZSwgZG8gbm90IGNhbGwgZGlyZWN0bHkuIn0sCisgICAgICAgICB7IChjaGFyICopIndyYXBfV2ViUEVuY29kZUJHUiIsIF93cmFwX3dyYXBfV2ViUEVuY29kZUJHUiwgTUVUSF9WQVJBUkdTLCAoY2hhciAqKSJwcml2YXRlLCBkbyBub3QgY2FsbCBkaXJlY3RseS4ifSwKKyAgICAgICAgIHsgKGNoYXIgKikid3JhcF9XZWJQRW5jb2RlUkdCQSIsIF93cmFwX3dyYXBfV2ViUEVuY29kZVJHQkEsIE1FVEhfVkFSQVJHUywgKGNoYXIgKikicHJpdmF0ZSwgZG8gbm90IGNhbGwgZGlyZWN0bHkuIn0sCisgICAgICAgICB7IChjaGFyICopIndyYXBfV2ViUEVuY29kZUJHUkEiLCBfd3JhcF93cmFwX1dlYlBFbmNvZGVCR1JBLCBNRVRIX1ZBUkFSR1MsIChjaGFyICopInByaXZhdGUsIGRvIG5vdCBjYWxsIGRpcmVjdGx5LiJ9LAorICAgICAgICAgeyAoY2hhciAqKSJ3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc1JHQiIsIF93cmFwX3dyYXBfV2ViUEVuY29kZUxvc3NsZXNzUkdCLCBNRVRIX1ZBUkFSR1MsIChjaGFyICopInByaXZhdGUsIGRvIG5vdCBjYWxsIGRpcmVjdGx5LiJ9LAorICAgICAgICAgeyAoY2hhciAqKSJ3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc0JHUiIsIF93cmFwX3dyYXBfV2ViUEVuY29kZUxvc3NsZXNzQkdSLCBNRVRIX1ZBUkFSR1MsIChjaGFyICopInByaXZhdGUsIGRvIG5vdCBjYWxsIGRpcmVjdGx5LiJ9LAorICAgICAgICAgeyAoY2hhciAqKSJ3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc1JHQkEiLCBfd3JhcF93cmFwX1dlYlBFbmNvZGVMb3NzbGVzc1JHQkEsIE1FVEhfVkFSQVJHUywgKGNoYXIgKikicHJpdmF0ZSwgZG8gbm90IGNhbGwgZGlyZWN0bHkuIn0sCisgICAgICAgICB7IChjaGFyICopIndyYXBfV2ViUEVuY29kZUxvc3NsZXNzQkdSQSIsIF93cmFwX3dyYXBfV2ViUEVuY29kZUxvc3NsZXNzQkdSQSwgTUVUSF9WQVJBUkdTLCAoY2hhciAqKSJwcml2YXRlLCBkbyBub3QgY2FsbCBkaXJlY3RseS4ifSwKKyAgICAgICAgIHsgTlVMTCwgTlVMTCwgMCwgTlVMTCB9Cit9OworCisKKy8qIC0tLS0tLS0tIFRZUEUgQ09OVkVSU0lPTiBBTkQgRVFVSVZBTEVOQ0UgUlVMRVMgKEJFR0lOKSAtLS0tLS0tLSAqLworCitzdGF0aWMgc3dpZ190eXBlX2luZm8gX3N3aWd0X19wX2NoYXIgPSB7Il9wX2NoYXIiLCAiY2hhciAqIiwgMCwgMCwgKHZvaWQqKTAsIDB9Oworc3RhdGljIHN3aWdfdHlwZV9pbmZvIF9zd2lndF9fcF9pbnQgPSB7Il9wX2ludCIsICJpbnQgKiIsIDAsIDAsICh2b2lkKikwLCAwfTsKK3N0YXRpYyBzd2lnX3R5cGVfaW5mbyBfc3dpZ3RfX3BfdWludDhfdCA9IHsiX3BfdWludDhfdCIsICJ1aW50OF90ICoiLCAwLCAwLCAodm9pZCopMCwgMH07CisKK3N0YXRpYyBzd2lnX3R5cGVfaW5mbyAqc3dpZ190eXBlX2luaXRpYWxbXSA9IHsKKyAgJl9zd2lndF9fcF9jaGFyLAorICAmX3N3aWd0X19wX2ludCwKKyAgJl9zd2lndF9fcF91aW50OF90LAorfTsKKworc3RhdGljIHN3aWdfY2FzdF9pbmZvIF9zd2lnY19fcF9jaGFyW10gPSB7ICB7Jl9zd2lndF9fcF9jaGFyLCAwLCAwLCAwfSx7MCwgMCwgMCwgMH19Oworc3RhdGljIHN3aWdfY2FzdF9pbmZvIF9zd2lnY19fcF9pbnRbXSA9IHsgIHsmX3N3aWd0X19wX2ludCwgMCwgMCwgMH0sezAsIDAsIDAsIDB9fTsKK3N0YXRpYyBzd2lnX2Nhc3RfaW5mbyBfc3dpZ2NfX3BfdWludDhfdFtdID0geyAgeyZfc3dpZ3RfX3BfdWludDhfdCwgMCwgMCwgMH0sezAsIDAsIDAsIDB9fTsKKworc3RhdGljIHN3aWdfY2FzdF9pbmZvICpzd2lnX2Nhc3RfaW5pdGlhbFtdID0geworICBfc3dpZ2NfX3BfY2hhciwKKyAgX3N3aWdjX19wX2ludCwKKyAgX3N3aWdjX19wX3VpbnQ4X3QsCit9OworCisKKy8qIC0tLS0tLS0tIFRZUEUgQ09OVkVSU0lPTiBBTkQgRVFVSVZBTEVOQ0UgUlVMRVMgKEVORCkgLS0tLS0tLS0gKi8KKworc3RhdGljIHN3aWdfY29uc3RfaW5mbyBzd2lnX2NvbnN0X3RhYmxlW10gPSB7Cit7MCwgMCwgMCwgMC4wLCAwLCAwfX07CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVHlwZSBpbml0aWFsaXphdGlvbjoKKyAqIFRoaXMgcHJvYmxlbSBpcyB0b3VnaCBieSB0aGUgcmVxdWlyZW1lbnQgdGhhdCBubyBkeW5hbWljCisgKiBtZW1vcnkgaXMgdXNlZC4gQWxzbywgc2luY2Ugc3dpZ190eXBlX2luZm8gc3RydWN0dXJlcyBzdG9yZSBwb2ludGVycyB0bworICogc3dpZ19jYXN0X2luZm8gc3RydWN0dXJlcyBhbmQgc3dpZ19jYXN0X2luZm8gc3RydWN0dXJlcyBzdG9yZSBwb2ludGVycyBiYWNrCisgKiB0byBzd2lnX3R5cGVfaW5mbyBzdHJ1Y3R1cmVzLCB3ZSBuZWVkIHNvbWUgbG9va3VwIGNvZGUgYXQgaW5pdGlhbGl6YXRpb24uCisgKiBUaGUgaWRlYSBpcyB0aGF0IHN3aWcgZ2VuZXJhdGVzIGFsbCB0aGUgc3RydWN0dXJlcyB0aGF0IGFyZSBuZWVkZWQuCisgKiBUaGUgcnVudGltZSB0aGVuIGNvbGxlY3RzIHRoZXNlIHBhcnRpYWxseSBmaWxsZWQgc3RydWN0dXJlcy4KKyAqIFRoZSBTV0lHX0luaXRpYWxpemVNb2R1bGUgZnVuY3Rpb24gdGFrZXMgdGhlc2UgaW5pdGlhbCBhcnJheXMgb3V0IG9mCisgKiBzd2lnX21vZHVsZSwgYW5kIGRvZXMgYWxsIHRoZSBsb29rdXAsIGZpbGxpbmcgaW4gdGhlIHN3aWdfbW9kdWxlLnR5cGVzCisgKiBhcnJheSB3aXRoIHRoZSBjb3JyZWN0IGRhdGEgYW5kIGxpbmtpbmcgdGhlIGNvcnJlY3Qgc3dpZ19jYXN0X2luZm8KKyAqIHN0cnVjdHVyZXMgdG9nZXRoZXIuCisgKgorICogVGhlIGdlbmVyYXRlZCBzd2lnX3R5cGVfaW5mbyBzdHJ1Y3R1cmVzIGFyZSBhc3NpZ25lZCBzdGF0aWNseSB0byBhbiBpbml0aWFsCisgKiBhcnJheS4gV2UganVzdCBsb29wIHRocm91Z2ggdGhhdCBhcnJheSwgYW5kIGhhbmRsZSBlYWNoIHR5cGUgaW5kaXZpZHVhbGx5LgorICogRmlyc3Qgd2UgbG9va3VwIGlmIHRoaXMgdHlwZSBoYXMgYmVlbiBhbHJlYWR5IGxvYWRlZCwgYW5kIGlmIHNvLCB1c2UgdGhlCisgKiBsb2FkZWQgc3RydWN0dXJlIGluc3RlYWQgb2YgdGhlIGdlbmVyYXRlZCBvbmUuIFRoZW4gd2UgaGF2ZSB0byBmaWxsIGluIHRoZQorICogY2FzdCBsaW5rZWQgbGlzdC4gVGhlIGNhc3QgZGF0YSBpcyBpbml0aWFsbHkgc3RvcmVkIGluIHNvbWV0aGluZyBsaWtlIGEKKyAqIHR3by1kaW1lbnNpb25hbCBhcnJheS4gRWFjaCByb3cgY29ycmVzcG9uZHMgdG8gYSB0eXBlICh0aGVyZSBhcmUgdGhlIHNhbWUKKyAqIG51bWJlciBvZiByb3dzIGFzIHRoZXJlIGFyZSBpbiB0aGUgc3dpZ190eXBlX2luaXRpYWwgYXJyYXkpLiBFYWNoIGVudHJ5IGluCisgKiBhIGNvbHVtbiBpcyBvbmUgb2YgdGhlIHN3aWdfY2FzdF9pbmZvIHN0cnVjdHVyZXMgZm9yIHRoYXQgdHlwZS4KKyAqIFRoZSBjYXN0X2luaXRpYWwgYXJyYXkgaXMgYWN0dWFsbHkgYW4gYXJyYXkgb2YgYXJyYXlzLCBiZWNhdXNlIGVhY2ggcm93IGhhcworICogYSB2YXJpYWJsZSBudW1iZXIgb2YgY29sdW1ucy4gU28gdG8gYWN0dWFsbHkgYnVpbGQgdGhlIGNhc3QgbGlua2VkIGxpc3QsCisgKiB3ZSBmaW5kIHRoZSBhcnJheSBvZiBjYXN0cyBhc3NvY2lhdGVkIHdpdGggdGhlIHR5cGUsIGFuZCBsb29wIHRocm91Z2ggaXQKKyAqIGFkZGluZyB0aGUgY2FzdHMgdG8gdGhlIGxpc3QuIFRoZSBvbmUgbGFzdCB0cmljayB3ZSBuZWVkIHRvIGRvIGlzIG1ha2luZworICogc3VyZSB0aGUgdHlwZSBwb2ludGVyIGluIHRoZSBzd2lnX2Nhc3RfaW5mbyBzdHJ1Y3QgaXMgY29ycmVjdC4KKyAqCisgKiBGaXJzdCBvZmYsIHdlIGxvb2t1cCB0aGUgY2FzdC0+dHlwZSBuYW1lIHRvIHNlZSBpZiBpdCBpcyBhbHJlYWR5IGxvYWRlZC4KKyAqIFRoZXJlIGFyZSB0aHJlZSBjYXNlcyB0byBoYW5kbGU6CisgKiAgMSkgSWYgdGhlIGNhc3QtPnR5cGUgaGFzIGFscmVhZHkgYmVlbiBsb2FkZWQgQU5EIHRoZSB0eXBlIHdlIGFyZSBhZGRpbmcKKyAqICAgICBjYXN0aW5nIGluZm8gdG8gaGFzIG5vdCBiZWVuIGxvYWRlZCAoaXQgaXMgaW4gdGhpcyBtb2R1bGUpLCBUSEVOIHdlCisgKiAgICAgcmVwbGFjZSB0aGUgY2FzdC0+dHlwZSBwb2ludGVyIHdpdGggdGhlIHR5cGUgcG9pbnRlciB0aGF0IGhhcyBhbHJlYWR5CisgKiAgICAgYmVlbiBsb2FkZWQuCisgKiAgMikgSWYgQk9USCB0eXBlcyAodGhlIG9uZSB3ZSBhcmUgYWRkaW5nIGNhc3RpbmcgaW5mbyB0bywgYW5kIHRoZQorICogICAgIGNhc3QtPnR5cGUpIGFyZSBsb2FkZWQsIFRIRU4gdGhlIGNhc3QgaW5mbyBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZCBieQorICogICAgIHRoZSBwcmV2aW91cyBtb2R1bGUgc28gd2UganVzdCBpZ25vcmUgaXQuCisgKiAgMykgRmluYWxseSwgaWYgY2FzdC0+dHlwZSBoYXMgbm90IGFscmVhZHkgYmVlbiBsb2FkZWQsIHRoZW4gd2UgYWRkIHRoYXQKKyAqICAgICBzd2lnX2Nhc3RfaW5mbyB0byB0aGUgbGlua2VkIGxpc3QgKGJlY2F1c2UgdGhlIGNhc3QtPnR5cGUpIHBvaW50ZXIgd2lsbAorICogICAgIGJlIGNvcnJlY3QuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2lmIDAKK30gLyogYy1tb2RlICovCisjZW5kaWYKKyNlbmRpZgorCisjaWYgMAorI2RlZmluZSBTV0lHUlVOVElNRV9ERUJVRworI2VuZGlmCisKKworU1dJR1JVTlRJTUUgdm9pZAorU1dJR19Jbml0aWFsaXplTW9kdWxlKHZvaWQgKmNsaWVudGRhdGEpIHsKKyAgc2l6ZV90IGk7CisgIHN3aWdfbW9kdWxlX2luZm8gKm1vZHVsZV9oZWFkLCAqaXRlcjsKKyAgaW50IGZvdW5kLCBpbml0OworCisgIGNsaWVudGRhdGEgPSBjbGllbnRkYXRhOworCisgIC8qIGNoZWNrIHRvIHNlZSBpZiB0aGUgY2lyY3VsYXIgbGlzdCBoYXMgYmVlbiBzZXR1cCwgaWYgbm90LCBzZXQgaXQgdXAgKi8KKyAgaWYgKHN3aWdfbW9kdWxlLm5leHQ9PTApIHsKKyAgICAvKiBJbml0aWFsaXplIHRoZSBzd2lnX21vZHVsZSAqLworICAgIHN3aWdfbW9kdWxlLnR5cGVfaW5pdGlhbCA9IHN3aWdfdHlwZV9pbml0aWFsOworICAgIHN3aWdfbW9kdWxlLmNhc3RfaW5pdGlhbCA9IHN3aWdfY2FzdF9pbml0aWFsOworICAgIHN3aWdfbW9kdWxlLm5leHQgPSAmc3dpZ19tb2R1bGU7CisgICAgaW5pdCA9IDE7CisgIH0gZWxzZSB7CisgICAgaW5pdCA9IDA7CisgIH0KKworICAvKiBUcnkgYW5kIGxvYWQgYW55IGFscmVhZHkgY3JlYXRlZCBtb2R1bGVzICovCisgIG1vZHVsZV9oZWFkID0gU1dJR19HZXRNb2R1bGUoY2xpZW50ZGF0YSk7CisgIGlmICghbW9kdWxlX2hlYWQpIHsKKyAgICAvKiBUaGlzIGlzIHRoZSBmaXJzdCBtb2R1bGUgbG9hZGVkIGZvciB0aGlzIGludGVycHJldGVyICovCisgICAgLyogc28gc2V0IHRoZSBzd2lnIG1vZHVsZSBpbnRvIHRoZSBpbnRlcnByZXRlciAqLworICAgIFNXSUdfU2V0TW9kdWxlKGNsaWVudGRhdGEsICZzd2lnX21vZHVsZSk7CisgICAgbW9kdWxlX2hlYWQgPSAmc3dpZ19tb2R1bGU7CisgIH0gZWxzZSB7CisgICAgLyogdGhlIGludGVycHJldGVyIGhhcyBsb2FkZWQgYSBTV0lHIG1vZHVsZSwgYnV0IGhhcyBpdCBsb2FkZWQgdGhpcyBvbmU/ICovCisgICAgZm91bmQ9MDsKKyAgICBpdGVyPW1vZHVsZV9oZWFkOworICAgIGRvIHsKKyAgICAgIGlmIChpdGVyPT0mc3dpZ19tb2R1bGUpIHsKKyAgICAgICAgZm91bmQ9MTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpdGVyPWl0ZXItPm5leHQ7CisgICAgfSB3aGlsZSAoaXRlciE9IG1vZHVsZV9oZWFkKTsKKworICAgIC8qIGlmIHRoZSBpcyBmb3VuZCBpbiB0aGUgbGlzdCwgdGhlbiBhbGwgaXMgZG9uZSBhbmQgd2UgbWF5IGxlYXZlICovCisgICAgaWYgKGZvdW5kKSByZXR1cm47CisgICAgLyogb3RoZXJ3aXNlIHdlIG11c3QgYWRkIG91dCBtb2R1bGUgaW50byB0aGUgbGlzdCAqLworICAgIHN3aWdfbW9kdWxlLm5leHQgPSBtb2R1bGVfaGVhZC0+bmV4dDsKKyAgICBtb2R1bGVfaGVhZC0+bmV4dCA9ICZzd2lnX21vZHVsZTsKKyAgfQorCisgIC8qIFdoZW4gbXVsdGlwbGUgaW50ZXJwZXRlcnMgYXJlIHVzZWQsIGEgbW9kdWxlIGNvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIGluCisgICAgICAgYSBkaWZmZXJlbnQgaW50ZXJwcmV0ZXIsIGJ1dCBub3QgeWV0IGhhdmUgYSBwb2ludGVyIGluIHRoaXMgaW50ZXJwcmV0ZXIuCisgICAgICAgSW4gdGhpcyBjYXNlLCB3ZSBkbyBub3Qgd2FudCB0byBjb250aW51ZSBhZGRpbmcgdHlwZXMuLi4gZXZlcnl0aGluZyBzaG91bGQgYmUKKyAgICAgICBzZXQgdXAgYWxyZWFkeSAqLworICBpZiAoaW5pdCA9PSAwKSByZXR1cm47CisKKyAgLyogTm93IHdvcmsgb24gZmlsbGluZyBpbiBzd2lnX21vZHVsZS50eXBlcyAqLworI2lmZGVmIFNXSUdSVU5USU1FX0RFQlVHCisgIHByaW50ZigiU1dJR19Jbml0aWFsaXplTW9kdWxlOiBzaXplICVkXG4iLCBzd2lnX21vZHVsZS5zaXplKTsKKyNlbmRpZgorICBmb3IgKGkgPSAwOyBpIDwgc3dpZ19tb2R1bGUuc2l6ZTsgKytpKSB7CisgICAgc3dpZ190eXBlX2luZm8gKnR5cGUgPSAwOworICAgIHN3aWdfdHlwZV9pbmZvICpyZXQ7CisgICAgc3dpZ19jYXN0X2luZm8gKmNhc3Q7CisKKyNpZmRlZiBTV0lHUlVOVElNRV9ERUJVRworICAgIHByaW50ZigiU1dJR19Jbml0aWFsaXplTW9kdWxlOiB0eXBlICVkICVzXG4iLCBpLCBzd2lnX21vZHVsZS50eXBlX2luaXRpYWxbaV0tPm5hbWUpOworI2VuZGlmCisKKyAgICAvKiBpZiB0aGVyZSBpcyBhbm90aGVyIG1vZHVsZSBhbHJlYWR5IGxvYWRlZCAqLworICAgIGlmIChzd2lnX21vZHVsZS5uZXh0ICE9ICZzd2lnX21vZHVsZSkgeworICAgICAgdHlwZSA9IFNXSUdfTWFuZ2xlZFR5cGVRdWVyeU1vZHVsZShzd2lnX21vZHVsZS5uZXh0LCAmc3dpZ19tb2R1bGUsIHN3aWdfbW9kdWxlLnR5cGVfaW5pdGlhbFtpXS0+bmFtZSk7CisgICAgfQorICAgIGlmICh0eXBlKSB7CisgICAgICAvKiBPdmVyd3JpdGUgY2xpZW50ZGF0YSBmaWVsZCAqLworI2lmZGVmIFNXSUdSVU5USU1FX0RFQlVHCisgICAgICBwcmludGYoIlNXSUdfSW5pdGlhbGl6ZU1vZHVsZTogZm91bmQgdHlwZSAlc1xuIiwgdHlwZS0+bmFtZSk7CisjZW5kaWYKKyAgICAgIGlmIChzd2lnX21vZHVsZS50eXBlX2luaXRpYWxbaV0tPmNsaWVudGRhdGEpIHsKKyAgICAgICAgdHlwZS0+Y2xpZW50ZGF0YSA9IHN3aWdfbW9kdWxlLnR5cGVfaW5pdGlhbFtpXS0+Y2xpZW50ZGF0YTsKKyNpZmRlZiBTV0lHUlVOVElNRV9ERUJVRworICAgICAgICBwcmludGYoIlNXSUdfSW5pdGlhbGl6ZU1vZHVsZTogZm91bmQgYW5kIG92ZXJ3cml0ZSB0eXBlICVzIFxuIiwgdHlwZS0+bmFtZSk7CisjZW5kaWYKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgdHlwZSA9IHN3aWdfbW9kdWxlLnR5cGVfaW5pdGlhbFtpXTsKKyAgICB9CisKKyAgICAvKiBJbnNlcnQgY2FzdGluZyB0eXBlcyAqLworICAgIGNhc3QgPSBzd2lnX21vZHVsZS5jYXN0X2luaXRpYWxbaV07CisgICAgd2hpbGUgKGNhc3QtPnR5cGUpIHsKKyAgICAgIC8qIERvbid0IG5lZWQgdG8gYWRkIGluZm9ybWF0aW9uIGFscmVhZHkgaW4gdGhlIGxpc3QgKi8KKyAgICAgIHJldCA9IDA7CisjaWZkZWYgU1dJR1JVTlRJTUVfREVCVUcKKyAgICAgIHByaW50ZigiU1dJR19Jbml0aWFsaXplTW9kdWxlOiBsb29rIGNhc3QgJXNcbiIsIGNhc3QtPnR5cGUtPm5hbWUpOworI2VuZGlmCisgICAgICBpZiAoc3dpZ19tb2R1bGUubmV4dCAhPSAmc3dpZ19tb2R1bGUpIHsKKyAgICAgICAgcmV0ID0gU1dJR19NYW5nbGVkVHlwZVF1ZXJ5TW9kdWxlKHN3aWdfbW9kdWxlLm5leHQsICZzd2lnX21vZHVsZSwgY2FzdC0+dHlwZS0+bmFtZSk7CisjaWZkZWYgU1dJR1JVTlRJTUVfREVCVUcKKyAgICAgICAgaWYgKHJldCkgcHJpbnRmKCJTV0lHX0luaXRpYWxpemVNb2R1bGU6IGZvdW5kIGNhc3QgJXNcbiIsIHJldC0+bmFtZSk7CisjZW5kaWYKKyAgICAgIH0KKyAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgaWYgKHR5cGUgPT0gc3dpZ19tb2R1bGUudHlwZV9pbml0aWFsW2ldKSB7CisjaWZkZWYgU1dJR1JVTlRJTUVfREVCVUcKKyAgICAgICAgICBwcmludGYoIlNXSUdfSW5pdGlhbGl6ZU1vZHVsZTogc2tpcCBvbGQgdHlwZSAlc1xuIiwgcmV0LT5uYW1lKTsKKyNlbmRpZgorICAgICAgICAgIGNhc3QtPnR5cGUgPSByZXQ7CisgICAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiBDaGVjayBmb3IgY2FzdGluZyBhbHJlYWR5IGluIHRoZSBsaXN0ICovCisgICAgICAgICAgc3dpZ19jYXN0X2luZm8gKm9jYXN0ID0gU1dJR19UeXBlQ2hlY2socmV0LT5uYW1lLCB0eXBlKTsKKyNpZmRlZiBTV0lHUlVOVElNRV9ERUJVRworICAgICAgICAgIGlmIChvY2FzdCkgcHJpbnRmKCJTV0lHX0luaXRpYWxpemVNb2R1bGU6IHNraXAgb2xkIGNhc3QgJXNcbiIsIHJldC0+bmFtZSk7CisjZW5kaWYKKyAgICAgICAgICBpZiAoIW9jYXN0KSByZXQgPSAwOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICghcmV0KSB7CisjaWZkZWYgU1dJR1JVTlRJTUVfREVCVUcKKyAgICAgICAgcHJpbnRmKCJTV0lHX0luaXRpYWxpemVNb2R1bGU6IGFkZGluZyBjYXN0ICVzXG4iLCBjYXN0LT50eXBlLT5uYW1lKTsKKyNlbmRpZgorICAgICAgICBpZiAodHlwZS0+Y2FzdCkgeworICAgICAgICAgIHR5cGUtPmNhc3QtPnByZXYgPSBjYXN0OworICAgICAgICAgIGNhc3QtPm5leHQgPSB0eXBlLT5jYXN0OworICAgICAgICB9CisgICAgICAgIHR5cGUtPmNhc3QgPSBjYXN0OworICAgICAgfQorICAgICAgY2FzdCsrOworICAgIH0KKyAgICAvKiBTZXQgZW50cnkgaW4gbW9kdWxlcy0+dHlwZXMgYXJyYXkgZXF1YWwgdG8gdGhlIHR5cGUgKi8KKyAgICBzd2lnX21vZHVsZS50eXBlc1tpXSA9IHR5cGU7CisgIH0KKyAgc3dpZ19tb2R1bGUudHlwZXNbaV0gPSAwOworCisjaWZkZWYgU1dJR1JVTlRJTUVfREVCVUcKKyAgcHJpbnRmKCIqKioqIFNXSUdfSW5pdGlhbGl6ZU1vZHVsZTogQ2FzdCBMaXN0ICoqKioqKlxuIik7CisgIGZvciAoaSA9IDA7IGkgPCBzd2lnX21vZHVsZS5zaXplOyArK2kpIHsKKyAgICBpbnQgaiA9IDA7CisgICAgc3dpZ19jYXN0X2luZm8gKmNhc3QgPSBzd2lnX21vZHVsZS5jYXN0X2luaXRpYWxbaV07CisgICAgcHJpbnRmKCJTV0lHX0luaXRpYWxpemVNb2R1bGU6IHR5cGUgJWQgJXNcbiIsIGksIHN3aWdfbW9kdWxlLnR5cGVfaW5pdGlhbFtpXS0+bmFtZSk7CisgICAgd2hpbGUgKGNhc3QtPnR5cGUpIHsKKyAgICAgIHByaW50ZigiU1dJR19Jbml0aWFsaXplTW9kdWxlOiBjYXN0IHR5cGUgJXNcbiIsIGNhc3QtPnR5cGUtPm5hbWUpOworICAgICAgY2FzdCsrOworICAgICAgKytqOworICAgIH0KKyAgICBwcmludGYoIi0tLS0gVG90YWwgY2FzdHM6ICVkXG4iLGopOworICB9CisgIHByaW50ZigiKioqKiBTV0lHX0luaXRpYWxpemVNb2R1bGU6IENhc3QgTGlzdCAqKioqKipcbiIpOworI2VuZGlmCit9CisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBwcm9wYWdhdGUgdGhlIGNsaWVudGRhdGEgZmllbGQgb2YgdHlwZSB0bworKiBhbnkgbmV3IHN3aWdfdHlwZV9pbmZvIHN0cnVjdHVyZXMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgaW50byB0aGUgbGlzdAorKiBvZiBlcXVpdmFsZW50IHR5cGVzLiAgSXQgaXMgbGlrZSBjYWxsaW5nCisqIFNXSUdfVHlwZUNsaWVudERhdGEodHlwZSwgY2xpZW50ZGF0YSkgYSBzZWNvbmQgdGltZS4KKyovCitTV0lHUlVOVElNRSB2b2lkCitTV0lHX1Byb3BhZ2F0ZUNsaWVudERhdGEodm9pZCkgeworICBzaXplX3QgaTsKKyAgc3dpZ19jYXN0X2luZm8gKmVxdWl2OworICBzdGF0aWMgaW50IGluaXRfcnVuID0gMDsKKworICBpZiAoaW5pdF9ydW4pIHJldHVybjsKKyAgaW5pdF9ydW4gPSAxOworCisgIGZvciAoaSA9IDA7IGkgPCBzd2lnX21vZHVsZS5zaXplOyBpKyspIHsKKyAgICBpZiAoc3dpZ19tb2R1bGUudHlwZXNbaV0tPmNsaWVudGRhdGEpIHsKKyAgICAgIGVxdWl2ID0gc3dpZ19tb2R1bGUudHlwZXNbaV0tPmNhc3Q7CisgICAgICB3aGlsZSAoZXF1aXYpIHsKKyAgICAgICAgaWYgKCFlcXVpdi0+Y29udmVydGVyKSB7CisgICAgICAgICAgaWYgKGVxdWl2LT50eXBlICYmICFlcXVpdi0+dHlwZS0+Y2xpZW50ZGF0YSkKKyAgICAgICAgICBTV0lHX1R5cGVDbGllbnREYXRhKGVxdWl2LT50eXBlLCBzd2lnX21vZHVsZS50eXBlc1tpXS0+Y2xpZW50ZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgZXF1aXYgPSBlcXVpdi0+bmV4dDsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworI2lmZGVmIF9fY3BsdXNwbHVzCisjaWYgMAoreworICAvKiBjLW1vZGUgKi8KKyNlbmRpZgorfQorI2VuZGlmCisKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyAgLyogUHl0aG9uLXNwZWNpZmljIFNXSUcgQVBJICovCisjZGVmaW5lIFNXSUdfbmV3dmFybGluaygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTV0lHX1B5dGhvbl9uZXd2YXJsaW5rKCkKKyNkZWZpbmUgU1dJR19hZGR2YXJsaW5rKHAsIG5hbWUsIGdldF9hdHRyLCBzZXRfYXR0cikgIFNXSUdfUHl0aG9uX2FkZHZhcmxpbmsocCwgbmFtZSwgZ2V0X2F0dHIsIHNldF9hdHRyKQorI2RlZmluZSBTV0lHX0luc3RhbGxDb25zdGFudHMoZCwgY29uc3RhbnRzKSAgICAgICAgICAgU1dJR19QeXRob25fSW5zdGFsbENvbnN0YW50cyhkLCBjb25zdGFudHMpCisKKyAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICogZ2xvYmFsIHZhcmlhYmxlIHN1cHBvcnQgY29kZS4KKyAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICB0eXBlZGVmIHN0cnVjdCBzd2lnX2dsb2JhbHZhciB7CisgICAgY2hhciAgICAgICAqbmFtZTsgICAgICAgICAgICAgICAgICAvKiBOYW1lIG9mIGdsb2JhbCB2YXJpYWJsZSAqLworICAgIFB5T2JqZWN0ICooKmdldF9hdHRyKSh2b2lkKTsgICAgICAgLyogUmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlICovCisgICAgaW50ICAgICAgICgqc2V0X2F0dHIpKFB5T2JqZWN0ICopOyAvKiBTZXQgdGhlIHZhbHVlICovCisgICAgc3RydWN0IHN3aWdfZ2xvYmFsdmFyICpuZXh0OworICB9IHN3aWdfZ2xvYmFsdmFyOworCisgIHR5cGVkZWYgc3RydWN0IHN3aWdfdmFybGlua29iamVjdCB7CisgICAgUHlPYmplY3RfSEVBRAorICAgIHN3aWdfZ2xvYmFsdmFyICp2YXJzOworICB9IHN3aWdfdmFybGlua29iamVjdDsKKworICBTV0lHSU5URVJOIFB5T2JqZWN0ICoKKyAgc3dpZ192YXJsaW5rX3JlcHIoc3dpZ192YXJsaW5rb2JqZWN0ICpTV0lHVU5VU0VEUEFSTSh2KSkgeworI2lmIFBZX1ZFUlNJT05fSEVYID49IDB4MDMwMDAwMDAKKyAgICByZXR1cm4gUHlVbmljb2RlX0ludGVybkZyb21TdHJpbmcoIjxTd2lnIGdsb2JhbCB2YXJpYWJsZXM+Iik7CisjZWxzZQorICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCI8U3dpZyBnbG9iYWwgdmFyaWFibGVzPiIpOworI2VuZGlmCisgIH0KKworICBTV0lHSU5URVJOIFB5T2JqZWN0ICoKKyAgc3dpZ192YXJsaW5rX3N0cihzd2lnX3ZhcmxpbmtvYmplY3QgKnYpIHsKKyNpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAzMDAwMDAwCisgICAgUHlPYmplY3QgKnN0ciA9IFB5VW5pY29kZV9JbnRlcm5Gcm9tU3RyaW5nKCIoIik7CisgICAgUHlPYmplY3QgKnRhaWw7CisgICAgUHlPYmplY3QgKmpvaW5lZDsKKyAgICBzd2lnX2dsb2JhbHZhciAqdmFyOworICAgIGZvciAodmFyID0gdi0+dmFyczsgdmFyOyB2YXI9dmFyLT5uZXh0KSB7CisgICAgICB0YWlsID0gUHlVbmljb2RlX0Zyb21TdHJpbmcodmFyLT5uYW1lKTsKKyAgICAgIGpvaW5lZCA9IFB5VW5pY29kZV9Db25jYXQoc3RyLCB0YWlsKTsKKyAgICAgIFB5X0RlY1JlZihzdHIpOworICAgICAgUHlfRGVjUmVmKHRhaWwpOworICAgICAgc3RyID0gam9pbmVkOworICAgICAgaWYgKHZhci0+bmV4dCkgeworICAgICAgICB0YWlsID0gUHlVbmljb2RlX0ludGVybkZyb21TdHJpbmcoIiwgIik7CisgICAgICAgIGpvaW5lZCA9IFB5VW5pY29kZV9Db25jYXQoc3RyLCB0YWlsKTsKKyAgICAgICAgUHlfRGVjUmVmKHN0cik7CisgICAgICAgIFB5X0RlY1JlZih0YWlsKTsKKyAgICAgICAgc3RyID0gam9pbmVkOworICAgICAgfQorICAgIH0KKyAgICB0YWlsID0gUHlVbmljb2RlX0ludGVybkZyb21TdHJpbmcoIikiKTsKKyAgICBqb2luZWQgPSBQeVVuaWNvZGVfQ29uY2F0KHN0ciwgdGFpbCk7CisgICAgUHlfRGVjUmVmKHN0cik7CisgICAgUHlfRGVjUmVmKHRhaWwpOworICAgIHN0ciA9IGpvaW5lZDsKKyNlbHNlCisgICAgUHlPYmplY3QgKnN0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIigiKTsKKyAgICBzd2lnX2dsb2JhbHZhciAqdmFyOworICAgIGZvciAodmFyID0gdi0+dmFyczsgdmFyOyB2YXI9dmFyLT5uZXh0KSB7CisgICAgICBQeVN0cmluZ19Db25jYXRBbmREZWwoJnN0cixQeVN0cmluZ19Gcm9tU3RyaW5nKHZhci0+bmFtZSkpOworICAgICAgaWYgKHZhci0+bmV4dCkgUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZzdHIsUHlTdHJpbmdfRnJvbVN0cmluZygiLCAiKSk7CisgICAgfQorICAgIFB5U3RyaW5nX0NvbmNhdEFuZERlbCgmc3RyLFB5U3RyaW5nX0Zyb21TdHJpbmcoIikiKSk7CisjZW5kaWYKKyAgICByZXR1cm4gc3RyOworICB9CisKKyAgU1dJR0lOVEVSTiBpbnQKKyAgc3dpZ192YXJsaW5rX3ByaW50KHN3aWdfdmFybGlua29iamVjdCAqdiwgRklMRSAqZnAsIGludCBTV0lHVU5VU0VEUEFSTShmbGFncykpIHsKKyAgICBjaGFyICp0bXA7CisgICAgUHlPYmplY3QgKnN0ciA9IHN3aWdfdmFybGlua19zdHIodik7CisgICAgZnByaW50ZihmcCwiU3dpZyBnbG9iYWwgdmFyaWFibGVzICIpOworICAgIGZwcmludGYoZnAsIiVzXG4iLCB0bXAgPSBTV0lHX1B5dGhvbl9zdHJfQXNDaGFyKHN0cikpOworICAgIFNXSUdfUHl0aG9uX3N0cl9EZWxGb3JQeTModG1wKTsKKyAgICBQeV9ERUNSRUYoc3RyKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIFNXSUdJTlRFUk4gdm9pZAorICBzd2lnX3ZhcmxpbmtfZGVhbGxvYyhzd2lnX3ZhcmxpbmtvYmplY3QgKnYpIHsKKyAgICBzd2lnX2dsb2JhbHZhciAqdmFyID0gdi0+dmFyczsKKyAgICB3aGlsZSAodmFyKSB7CisgICAgICBzd2lnX2dsb2JhbHZhciAqbiA9IHZhci0+bmV4dDsKKyAgICAgIGZyZWUodmFyLT5uYW1lKTsKKyAgICAgIGZyZWUodmFyKTsKKyAgICAgIHZhciA9IG47CisgICAgfQorICB9CisKKyAgU1dJR0lOVEVSTiBQeU9iamVjdCAqCisgIHN3aWdfdmFybGlua19nZXRhdHRyKHN3aWdfdmFybGlua29iamVjdCAqdiwgY2hhciAqbikgeworICAgIFB5T2JqZWN0ICpyZXMgPSBOVUxMOworICAgIHN3aWdfZ2xvYmFsdmFyICp2YXIgPSB2LT52YXJzOworICAgIHdoaWxlICh2YXIpIHsKKyAgICAgIGlmIChzdHJjbXAodmFyLT5uYW1lLG4pID09IDApIHsKKyAgICAgICAgcmVzID0gKCp2YXItPmdldF9hdHRyKSgpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHZhciA9IHZhci0+bmV4dDsKKyAgICB9CisgICAgaWYgKHJlcyA9PSBOVUxMICYmICFQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTmFtZUVycm9yLCJVbmtub3duIEMgZ2xvYmFsIHZhcmlhYmxlIik7CisgICAgfQorICAgIHJldHVybiByZXM7CisgIH0KKworICBTV0lHSU5URVJOIGludAorICBzd2lnX3Zhcmxpbmtfc2V0YXR0cihzd2lnX3ZhcmxpbmtvYmplY3QgKnYsIGNoYXIgKm4sIFB5T2JqZWN0ICpwKSB7CisgICAgaW50IHJlcyA9IDE7CisgICAgc3dpZ19nbG9iYWx2YXIgKnZhciA9IHYtPnZhcnM7CisgICAgd2hpbGUgKHZhcikgeworICAgICAgaWYgKHN0cmNtcCh2YXItPm5hbWUsbikgPT0gMCkgeworICAgICAgICByZXMgPSAoKnZhci0+c2V0X2F0dHIpKHApOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHZhciA9IHZhci0+bmV4dDsKKyAgICB9CisgICAgaWYgKHJlcyA9PSAxICYmICFQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTmFtZUVycm9yLCJVbmtub3duIEMgZ2xvYmFsIHZhcmlhYmxlIik7CisgICAgfQorICAgIHJldHVybiByZXM7CisgIH0KKworICBTV0lHSU5URVJOIFB5VHlwZU9iamVjdCoKKyAgc3dpZ192YXJsaW5rX3R5cGUodm9pZCkgeworICAgIHN0YXRpYyBjaGFyIHZhcmxpbmtfX2RvY19fW10gPSAiU3dpZyB2YXIgbGluayBvYmplY3QiOworICAgIHN0YXRpYyBQeVR5cGVPYmplY3QgdmFybGlua190eXBlOworICAgIHN0YXRpYyBpbnQgdHlwZV9pbml0ID0gMDsKKyAgICBpZiAoIXR5cGVfaW5pdCkgeworICAgICAgY29uc3QgUHlUeXBlT2JqZWN0IHRtcCA9IHsKKyAgICAgICAgLyogUHlPYmplY3QgaGVhZGVyIGNoYW5nZWQgaW4gUHl0aG9uIDMgKi8KKyNpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAzMDAwMDAwCisgICAgICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorI2Vsc2UKKyAgICAgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9iX3NpemUgKi8KKyNlbmRpZgorICAgICAgICAoY2hhciAqKSJzd2lndmFybGluayIsICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgICAgIHNpemVvZihzd2lnX3ZhcmxpbmtvYmplY3QpLCAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgICAgICAoZGVzdHJ1Y3Rvcikgc3dpZ192YXJsaW5rX2RlYWxsb2MsICAvKiB0cF9kZWFsbG9jICovCisgICAgICAgIChwcmludGZ1bmMpIHN3aWdfdmFybGlua19wcmludCwgICAgIC8qIHRwX3ByaW50ICovCisgICAgICAgIChnZXRhdHRyZnVuYykgc3dpZ192YXJsaW5rX2dldGF0dHIsIC8qIHRwX2dldGF0dHIgKi8KKyAgICAgICAgKHNldGF0dHJmdW5jKSBzd2lnX3Zhcmxpbmtfc2V0YXR0ciwgLyogdHBfc2V0YXR0ciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgICAgIChyZXByZnVuYykgc3dpZ192YXJsaW5rX3JlcHIsICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgICAgIChyZXByZnVuYykgc3dpZ192YXJsaW5rX3N0ciwgICAgICAgIC8qIHRwX3N0ciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICAgICAgdmFybGlua19fZG9jX18sICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisjaWYgUFlfVkVSU0lPTl9IRVggPj0gMHgwMjAyMDAwMAorICAgICAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIHRwX2l0ZXIgLT4gdHBfd2Vha2xpc3QgKi8KKyNlbmRpZgorI2lmIFBZX1ZFUlNJT05fSEVYID49IDB4MDIwMzAwMDAKKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVsICovCisjZW5kaWYKKyNpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAyMDYwMDAwCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ZlcnNpb24gKi8KKyNlbmRpZgorI2lmZGVmIENPVU5UX0FMTE9DUworICAgICAgICAwLDAsMCwwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAtPiB0cF9uZXh0ICovCisjZW5kaWYKKyAgICAgIH07CisgICAgICB2YXJsaW5rX3R5cGUgPSB0bXA7CisgICAgICB0eXBlX2luaXQgPSAxOworI2lmIFBZX1ZFUlNJT05fSEVYIDwgMHgwMjAyMDAwMAorICAgICAgdmFybGlua190eXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisjZWxzZQorICAgICAgaWYgKFB5VHlwZV9SZWFkeSgmdmFybGlua190eXBlKSA8IDApCisgICAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorICAgIH0KKyAgICByZXR1cm4gJnZhcmxpbmtfdHlwZTsKKyAgfQorCisgIC8qIENyZWF0ZSBhIHZhcmlhYmxlIGxpbmtpbmcgb2JqZWN0IGZvciB1c2UgbGF0ZXIgKi8KKyAgU1dJR0lOVEVSTiBQeU9iamVjdCAqCisgIFNXSUdfUHl0aG9uX25ld3Zhcmxpbmsodm9pZCkgeworICAgIHN3aWdfdmFybGlua29iamVjdCAqcmVzdWx0ID0gUHlPYmplY3RfTkVXKHN3aWdfdmFybGlua29iamVjdCwgc3dpZ192YXJsaW5rX3R5cGUoKSk7CisgICAgaWYgKHJlc3VsdCkgeworICAgICAgcmVzdWx0LT52YXJzID0gMDsKKyAgICB9CisgICAgcmV0dXJuICgoUHlPYmplY3QqKSByZXN1bHQpOworICB9CisKKyAgU1dJR0lOVEVSTiB2b2lkCisgIFNXSUdfUHl0aG9uX2FkZHZhcmxpbmsoUHlPYmplY3QgKnAsIGNoYXIgKm5hbWUsIFB5T2JqZWN0ICooKmdldF9hdHRyKSh2b2lkKSwgaW50ICgqc2V0X2F0dHIpKFB5T2JqZWN0ICpwKSkgeworICAgIHN3aWdfdmFybGlua29iamVjdCAqdiA9IChzd2lnX3ZhcmxpbmtvYmplY3QgKikgcDsKKyAgICBzd2lnX2dsb2JhbHZhciAqZ3YgPSAoc3dpZ19nbG9iYWx2YXIgKikgbWFsbG9jKHNpemVvZihzd2lnX2dsb2JhbHZhcikpOworICAgIGlmIChndikgeworICAgICAgc2l6ZV90IHNpemUgPSBzdHJsZW4obmFtZSkrMTsKKyAgICAgIGd2LT5uYW1lID0gKGNoYXIgKiltYWxsb2Moc2l6ZSk7CisgICAgICBpZiAoZ3YtPm5hbWUpIHsKKyAgICAgICAgc3RybmNweShndi0+bmFtZSxuYW1lLHNpemUpOworICAgICAgICBndi0+Z2V0X2F0dHIgPSBnZXRfYXR0cjsKKyAgICAgICAgZ3YtPnNldF9hdHRyID0gc2V0X2F0dHI7CisgICAgICAgIGd2LT5uZXh0ID0gdi0+dmFyczsKKyAgICAgIH0KKyAgICB9CisgICAgdi0+dmFycyA9IGd2OworICB9CisKKyAgU1dJR0lOVEVSTiBQeU9iamVjdCAqCisgIFNXSUdfZ2xvYmFscyh2b2lkKSB7CisgICAgc3RhdGljIFB5T2JqZWN0ICpfU1dJR19nbG9iYWxzID0gMDsKKyAgICBpZiAoIV9TV0lHX2dsb2JhbHMpIF9TV0lHX2dsb2JhbHMgPSBTV0lHX25ld3ZhcmxpbmsoKTsKKyAgICByZXR1cm4gX1NXSUdfZ2xvYmFsczsKKyAgfQorCisgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAqIGNvbnN0YW50cy9tZXRob2RzIG1hbmlwdWxhdGlvbgorICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgIC8qIEluc3RhbGwgQ29uc3RhbnRzICovCisgIFNXSUdJTlRFUk4gdm9pZAorICBTV0lHX1B5dGhvbl9JbnN0YWxsQ29uc3RhbnRzKFB5T2JqZWN0ICpkLCBzd2lnX2NvbnN0X2luZm8gY29uc3RhbnRzW10pIHsKKyAgICBQeU9iamVjdCAqb2JqID0gMDsKKyAgICBzaXplX3QgaTsKKyAgICBmb3IgKGkgPSAwOyBjb25zdGFudHNbaV0udHlwZTsgKytpKSB7CisgICAgICBzd2l0Y2goY29uc3RhbnRzW2ldLnR5cGUpIHsKKyAgICAgIGNhc2UgU1dJR19QWV9QT0lOVEVSOgorICAgICAgICBvYmogPSBTV0lHX0ludGVybmFsTmV3UG9pbnRlck9iaihjb25zdGFudHNbaV0ucHZhbHVlLCAqKGNvbnN0YW50c1tpXSkucHR5cGUsMCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTV0lHX1BZX0JJTkFSWToKKyAgICAgICAgb2JqID0gU1dJR19OZXdQYWNrZWRPYmooY29uc3RhbnRzW2ldLnB2YWx1ZSwgY29uc3RhbnRzW2ldLmx2YWx1ZSwgKihjb25zdGFudHNbaV0ucHR5cGUpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBvYmogPSAwOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChvYmopIHsKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgY29uc3RhbnRzW2ldLm5hbWUsIG9iaik7CisgICAgICAgIFB5X0RFQ1JFRihvYmopOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyogRml4IFN3aWdNZXRob2RzIHRvIGNhcnJ5IHRoZSBjYWxsYmFjayBwdHJzIHdoZW4gbmVlZGVkICovCisgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICBTV0lHSU5URVJOIHZvaWQKKyAgU1dJR19QeXRob25fRml4TWV0aG9kcyhQeU1ldGhvZERlZiAqbWV0aG9kcywKKyAgICBzd2lnX2NvbnN0X2luZm8gKmNvbnN0X3RhYmxlLAorICAgIHN3aWdfdHlwZV9pbmZvICoqdHlwZXMsCisgICAgc3dpZ190eXBlX2luZm8gKip0eXBlc19pbml0aWFsKSB7CisgICAgc2l6ZV90IGk7CisgICAgZm9yIChpID0gMDsgbWV0aG9kc1tpXS5tbF9uYW1lOyArK2kpIHsKKyAgICAgIGNvbnN0IGNoYXIgKmMgPSBtZXRob2RzW2ldLm1sX2RvYzsKKyAgICAgIGlmIChjICYmIChjID0gc3Ryc3RyKGMsICJzd2lnX3B0cjogIikpKSB7CisgICAgICAgIGludCBqOworICAgICAgICBzd2lnX2NvbnN0X2luZm8gKmNpID0gMDsKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSA9IGMgKyAxMDsKKyAgICAgICAgZm9yIChqID0gMDsgY29uc3RfdGFibGVbal0udHlwZTsgKytqKSB7CisgICAgICAgICAgaWYgKHN0cm5jbXAoY29uc3RfdGFibGVbal0ubmFtZSwgbmFtZSwKKyAgICAgICAgICAgICAgc3RybGVuKGNvbnN0X3RhYmxlW2pdLm5hbWUpKSA9PSAwKSB7CisgICAgICAgICAgICBjaSA9ICYoY29uc3RfdGFibGVbal0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjaSkgeworICAgICAgICAgIHZvaWQgKnB0ciA9IChjaS0+dHlwZSA9PSBTV0lHX1BZX1BPSU5URVIpID8gY2ktPnB2YWx1ZSA6IDA7CisgICAgICAgICAgaWYgKHB0cikgeworICAgICAgICAgICAgc2l6ZV90IHNoaWZ0ID0gKGNpLT5wdHlwZSkgLSB0eXBlczsKKyAgICAgICAgICAgIHN3aWdfdHlwZV9pbmZvICp0eSA9IHR5cGVzX2luaXRpYWxbc2hpZnRdOworICAgICAgICAgICAgc2l6ZV90IGxkb2MgPSAoYyAtIG1ldGhvZHNbaV0ubWxfZG9jKTsKKyAgICAgICAgICAgIHNpemVfdCBscHRyID0gc3RybGVuKHR5LT5uYW1lKSsyKnNpemVvZih2b2lkKikrMjsKKyAgICAgICAgICAgIGNoYXIgKm5kb2MgPSAoY2hhciopbWFsbG9jKGxkb2MgKyBscHRyICsgMTApOworICAgICAgICAgICAgaWYgKG5kb2MpIHsKKyAgICAgICAgICAgICAgY2hhciAqYnVmZiA9IG5kb2M7CisgICAgICAgICAgICAgIHN0cm5jcHkoYnVmZiwgbWV0aG9kc1tpXS5tbF9kb2MsIGxkb2MpOworICAgICAgICAgICAgICBidWZmICs9IGxkb2M7CisgICAgICAgICAgICAgIHN0cm5jcHkoYnVmZiwgInN3aWdfcHRyOiAiLCAxMCk7CisgICAgICAgICAgICAgIGJ1ZmYgKz0gMTA7CisgICAgICAgICAgICAgIFNXSUdfUGFja1ZvaWRQdHIoYnVmZiwgcHRyLCB0eS0+bmFtZSwgbHB0cik7CisgICAgICAgICAgICAgIG1ldGhvZHNbaV0ubWxfZG9jID0gbmRvYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgKiAgUGFydGlhbCBJbml0IG1ldGhvZAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorCitTV0lHRVhQT1JUCisjaWYgUFlfVkVSU0lPTl9IRVggPj0gMHgwMzAwMDAwMAorUHlPYmplY3QqCisjZWxzZQordm9pZAorI2VuZGlmCitTV0lHX2luaXQodm9pZCkgeworICBQeU9iamVjdCAqbSwgKmQsICptZDsKKyNpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAzMDAwMDAwCisgIHN0YXRpYyBzdHJ1Y3QgUHlNb2R1bGVEZWYgU1dJR19tb2R1bGUgPSB7CisjIGlmIFBZX1ZFUlNJT05fSEVYID49IDB4MDMwMjAwMDAKKyAgICBQeU1vZHVsZURlZl9IRUFEX0lOSVQsCisjIGVsc2UKKyAgICB7CisgICAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAgIE5VTEwsIC8qIG1faW5pdCAqLworICAgICAgMCwgICAgLyogbV9pbmRleCAqLworICAgICAgTlVMTCwgLyogbV9jb3B5ICovCisgICAgfSwKKyMgZW5kaWYKKyAgICAoY2hhciAqKSBTV0lHX25hbWUsCisgICAgTlVMTCwKKyAgICAtMSwKKyAgICBTd2lnTWV0aG9kcywKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMCisgIH07CisjZW5kaWYKKworI2lmIGRlZmluZWQoU1dJR1BZVEhPTl9CVUlMVElOKQorICBzdGF0aWMgU3dpZ1B5Q2xpZW50RGF0YSBTd2lnUHlPYmplY3RfY2xpZW50ZGF0YSA9IHsKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwCisgIH07CisgIHN0YXRpYyBQeUdldFNldERlZiB0aGlzX2dldHNldF9kZWYgPSB7CisgICAgKGNoYXIgKikidGhpcyIsICZTd2lnUHlCdWlsdGluX1RoaXNDbG9zdXJlLCBOVUxMLCBOVUxMLCBOVUxMCisgIH07CisgIHN0YXRpYyBTd2lnUHlHZXRTZXQgdGhpc293bl9nZXRzZXRfY2xvc3VyZSA9IHsKKyAgICAoUHlDRnVuY3Rpb24pIFN3aWdQeU9iamVjdF9vd24sCisgICAgKFB5Q0Z1bmN0aW9uKSBTd2lnUHlPYmplY3Rfb3duCisgIH07CisgIHN0YXRpYyBQeUdldFNldERlZiB0aGlzb3duX2dldHNldF9kZWYgPSB7CisgICAgKGNoYXIgKikidGhpc293biIsIFN3aWdQeUJ1aWx0aW5fR2V0dGVyQ2xvc3VyZSwgU3dpZ1B5QnVpbHRpbl9TZXR0ZXJDbG9zdXJlLCBOVUxMLCAmdGhpc293bl9nZXRzZXRfY2xvc3VyZQorICB9OworICBQeU9iamVjdCAqbWV0YXR5cGVfYXJnczsKKyAgUHlUeXBlT2JqZWN0ICpidWlsdGluX3B5dHlwZTsKKyAgaW50IGJ1aWx0aW5fYmFzZV9jb3VudDsKKyAgc3dpZ190eXBlX2luZm8gKmJ1aWx0aW5fYmFzZXR5cGU7CisgIFB5T2JqZWN0ICp0dXBsZTsKKyAgUHlHZXRTZXREZXNjck9iamVjdCAqc3RhdGljX2dldHNldDsKKyAgUHlUeXBlT2JqZWN0ICptZXRhdHlwZTsKKyAgU3dpZ1B5Q2xpZW50RGF0YSAqY2Q7CisgIFB5T2JqZWN0ICpwdWJsaWNfaW50ZXJmYWNlLCAqcHVibGljX3N5bWJvbDsKKyAgUHlPYmplY3QgKnRoaXNfZGVzY3I7CisgIFB5T2JqZWN0ICp0aGlzb3duX2Rlc2NyOworICBpbnQgaTsKKworICAodm9pZClidWlsdGluX3B5dHlwZTsKKyAgKHZvaWQpYnVpbHRpbl9iYXNlX2NvdW50OworICAodm9pZClidWlsdGluX2Jhc2V0eXBlOworICAodm9pZCl0dXBsZTsKKyAgKHZvaWQpc3RhdGljX2dldHNldDsKKworICAvKiBtZXRhdHlwZSBpcyB1c2VkIHRvIGltcGxlbWVudCBzdGF0aWMgbWVtYmVyIHZhcmlhYmxlcy4gKi8KKyAgbWV0YXR5cGVfYXJncyA9IFB5X0J1aWxkVmFsdWUoIihzKE8pe30pIiwgIlN3aWdQeU9iamVjdFR5cGUiLCAmUHlUeXBlX1R5cGUpOworICBhc3NlcnQobWV0YXR5cGVfYXJncyk7CisgIG1ldGF0eXBlID0gKFB5VHlwZU9iamVjdCAqKSBQeVR5cGVfVHlwZS50cF9jYWxsKChQeU9iamVjdCAqKSAmUHlUeXBlX1R5cGUsIG1ldGF0eXBlX2FyZ3MsIE5VTEwpOworICBhc3NlcnQobWV0YXR5cGUpOworICBQeV9ERUNSRUYobWV0YXR5cGVfYXJncyk7CisgIG1ldGF0eXBlLT50cF9zZXRhdHRybyA9IChzZXRhdHRyb2Z1bmMpICZTd2lnUHlPYmplY3RUeXBlX3NldGF0dHJvOworICBhc3NlcnQoUHlUeXBlX1JlYWR5KG1ldGF0eXBlKSA+PSAwKTsKKyNlbmRpZgorCisgIC8qIEZpeCBTd2lnTWV0aG9kcyB0byBjYXJyeSB0aGUgY2FsbGJhY2sgcHRycyB3aGVuIG5lZWRlZCAqLworICBTV0lHX1B5dGhvbl9GaXhNZXRob2RzKFN3aWdNZXRob2RzLCBzd2lnX2NvbnN0X3RhYmxlLCBzd2lnX3R5cGVzLCBzd2lnX3R5cGVfaW5pdGlhbCk7CisKKyNpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAzMDAwMDAwCisgIG0gPSBQeU1vZHVsZV9DcmVhdGUoJlNXSUdfbW9kdWxlKTsKKyNlbHNlCisgIG0gPSBQeV9Jbml0TW9kdWxlKChjaGFyICopIFNXSUdfbmFtZSwgU3dpZ01ldGhvZHMpOworI2VuZGlmCisgIG1kID0gZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisKKyAgU1dJR19Jbml0aWFsaXplTW9kdWxlKDApOworCisjaWZkZWYgU1dJR1BZVEhPTl9CVUlMVElOCisgIFN3aWdQeU9iamVjdF9zdHlwZSA9IFNXSUdfTWFuZ2xlZFR5cGVRdWVyeSgiX3BfU3dpZ1B5T2JqZWN0Iik7CisgIGFzc2VydChTd2lnUHlPYmplY3Rfc3R5cGUpOworICBjZCA9IChTd2lnUHlDbGllbnREYXRhKikgU3dpZ1B5T2JqZWN0X3N0eXBlLT5jbGllbnRkYXRhOworICBpZiAoIWNkKSB7CisgICAgU3dpZ1B5T2JqZWN0X3N0eXBlLT5jbGllbnRkYXRhID0gJlN3aWdQeU9iamVjdF9jbGllbnRkYXRhOworICAgIFN3aWdQeU9iamVjdF9jbGllbnRkYXRhLnB5dHlwZSA9IFN3aWdQeU9iamVjdF9UeXBlT25jZSgpOworICB9IGVsc2UgaWYgKFN3aWdQeU9iamVjdF9UeXBlT25jZSgpLT50cF9iYXNpY3NpemUgIT0gY2QtPnB5dHlwZS0+dHBfYmFzaWNzaXplKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgIkltcG9ydCBlcnJvcjogYXR0ZW1wdGVkIHRvIGxvYWQgdHdvIGluY29tcGF0aWJsZSBzd2lnLWdlbmVyYXRlZCBtb2R1bGVzLiIpOworIyBpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAzMDAwMDAwCisgICAgcmV0dXJuIE5VTEw7CisjIGVsc2UKKyAgICByZXR1cm47CisjIGVuZGlmCisgIH0KKworICAvKiBBbGwgb2JqZWN0cyBoYXZlIGEgJ3RoaXMnIGF0dHJpYnV0ZSAqLworICB0aGlzX2Rlc2NyID0gUHlEZXNjcl9OZXdHZXRTZXQoU3dpZ1B5T2JqZWN0X3R5cGUoKSwgJnRoaXNfZ2V0c2V0X2RlZik7CisgICh2b2lkKXRoaXNfZGVzY3I7CisKKyAgLyogQWxsIG9iamVjdHMgaGF2ZSBhICd0aGlzb3duJyBhdHRyaWJ1dGUgKi8KKyAgdGhpc293bl9kZXNjciA9IFB5RGVzY3JfTmV3R2V0U2V0KFN3aWdQeU9iamVjdF90eXBlKCksICZ0aGlzb3duX2dldHNldF9kZWYpOworICAodm9pZCl0aGlzb3duX2Rlc2NyOworCisgIHB1YmxpY19pbnRlcmZhY2UgPSBQeUxpc3RfTmV3KDApOworICBwdWJsaWNfc3ltYm9sID0gMDsKKyAgKHZvaWQpcHVibGljX3N5bWJvbDsKKworICBQeURpY3RfU2V0SXRlbVN0cmluZyhtZCwgIl9fYWxsX18iLCBwdWJsaWNfaW50ZXJmYWNlKTsKKyAgUHlfREVDUkVGKHB1YmxpY19pbnRlcmZhY2UpOworICBmb3IgKGkgPSAwOyBTd2lnTWV0aG9kc1tpXS5tbF9uYW1lICE9IE5VTEw7ICsraSkKKyAgU3dpZ1B5QnVpbHRpbl9BZGRQdWJsaWNTeW1ib2wocHVibGljX2ludGVyZmFjZSwgU3dpZ01ldGhvZHNbaV0ubWxfbmFtZSk7CisgIGZvciAoaSA9IDA7IHN3aWdfY29uc3RfdGFibGVbaV0ubmFtZSAhPSAwOyArK2kpCisgIFN3aWdQeUJ1aWx0aW5fQWRkUHVibGljU3ltYm9sKHB1YmxpY19pbnRlcmZhY2UsIHN3aWdfY29uc3RfdGFibGVbaV0ubmFtZSk7CisjZW5kaWYKKworICBTV0lHX0luc3RhbGxDb25zdGFudHMoZCxzd2lnX2NvbnN0X3RhYmxlKTsKKworI2lmIFBZX1ZFUlNJT05fSEVYID49IDB4MDMwMDAwMDAKKyAgcmV0dXJuIG07CisjZWxzZQorICByZXR1cm47CisjZW5kaWYKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3dpZy9zZXR1cC5weSBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3N3aWcvc2V0dXAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EzYmZlMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3N3aWcvc2V0dXAucHkKQEAgLTAsMCArMSw0MCBAQAorIyEvdXNyL2Jpbi9weXRob24KKworIiIiZGlzdHV0aWxzIHNjcmlwdCBmb3IgbGlid2VicCBweXRob24gbW9kdWxlLiIiIgorCitmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBzZXR1cAorZnJvbSBkaXN0dXRpbHMuZXh0ZW5zaW9uIGltcG9ydCBFeHRlbnNpb24KK2ltcG9ydCBvcworaW1wb3J0IHNodXRpbAoraW1wb3J0IHRlbXBmaWxlCisKK3RtcGRpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQorcGFja2FnZSA9ICJjb20uZ29vZ2xlLndlYnAiCitwYWNrYWdlX3BhdGggPSBvcy5wYXRoLmpvaW4odG1wZGlyLCAqcGFja2FnZS5zcGxpdCgiLiIpKQorb3MubWFrZWRpcnMocGFja2FnZV9wYXRoKQorCisjIENyZWF0ZSBfX2luaXRfLnB5IGZpbGVzIGFsb25nIHRoZSBwYWNrYWdlIHBhdGguCitpbml0cHlfcGF0aCA9IHRtcGRpcgorZm9yIGQgaW4gcGFja2FnZS5zcGxpdCgiLiIpOgorICBpbml0cHlfcGF0aCA9IG9zLnBhdGguam9pbihpbml0cHlfcGF0aCwgZCkKKyAgb3Blbihvcy5wYXRoLmpvaW4oaW5pdHB5X3BhdGgsICJfX2luaXRfXy5weSIpLCAidyIpLmNsb3NlKCkKKworc2h1dGlsLmNvcHkyKCJsaWJ3ZWJwLnB5IiwgcGFja2FnZV9wYXRoKQorc2V0dXAobmFtZT0ibGlid2VicCIsCisgICAgICB2ZXJzaW9uPSIwLjAiLAorICAgICAgZGVzY3JpcHRpb249ImxpYndlYnAgcHl0aG9uIHdyYXBwZXIiLAorICAgICAgbG9uZ19kZXNjcmlwdGlvbj0iUHJvdmlkZXMgYWNjZXNzIHRvICdzaW1wbGUnIGxpYndlYnAgZGVjb2RlIGludGVyZmFjZSIsCisgICAgICBsaWNlbnNlPSJCU0QiLAorICAgICAgdXJsPSJodHRwOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3NwZWVkL3dlYnAiLAorICAgICAgZXh0X3BhY2thZ2U9cGFja2FnZSwKKyAgICAgIGV4dF9tb2R1bGVzPVtFeHRlbnNpb24oIl9saWJ3ZWJwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJsaWJ3ZWJwX3B5dGhvbl93cmFwLmMiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyaWVzPVsid2VicCJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgICBdLAorICAgICAgcGFja2FnZV9kaXI9eyIiOiB0bXBkaXJ9LAorICAgICAgcGFja2FnZXM9WyJjb20iLCAiY29tLmdvb2dsZSIsICJjb20uZ29vZ2xlLndlYnAiXSwKKyAgICAgIHB5X21vZHVsZXM9W3BhY2thZ2UgKyAiLmxpYndlYnAiXSwKKyAgICAgKQorCitzaHV0aWwucm10cmVlKHRtcGRpcikKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL2JpdF9yZWFkZXIuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL2JpdF9yZWFkZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ2ZGVlMC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy9iaXRfcmVhZGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIEJvb2xlYW4gZGVjb2RlcgotLy8KLS8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCi0KLSNpbmNsdWRlICIuL2JpdF9yZWFkZXIuaCIKLQotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2lmbmRlZiBVU0VfUklHSFRfSlVTVElGWQotI2RlZmluZSBNSyhYKSAoKChyYW5nZV90KShYKSA8PCAoQklUUykpIHwgKE1BU0spKQotI2Vsc2UKLSNkZWZpbmUgTUsoWCkgKChyYW5nZV90KShYKSkKLSNlbmRpZgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVlA4Qml0UmVhZGVyCi0KLXZvaWQgVlA4SW5pdEJpdFJlYWRlcihWUDhCaXRSZWFkZXIqIGNvbnN0IGJyLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHN0YXJ0LCBjb25zdCB1aW50OF90KiBjb25zdCBlbmQpIHsKLSAgU0JfRENIRUNLKGJyICE9IE5VTEwpOwotICBTQl9EQ0hFQ0soc3RhcnQgIT0gTlVMTCk7Ci0gIFNCX0RDSEVDSyhzdGFydCA8PSBlbmQpOwotICBici0+cmFuZ2VfICAgPSBNSygyNTUgLSAxKTsKLSAgYnItPmJ1Zl8gICAgID0gc3RhcnQ7Ci0gIGJyLT5idWZfZW5kXyA9IGVuZDsKLSAgYnItPnZhbHVlXyAgID0gMDsKLSAgYnItPmJpdHNfICAgID0gLTg7ICAgLy8gdG8gbG9hZCB0aGUgdmVyeSBmaXJzdCA4Yml0cwotICBici0+ZW9mXyAgICAgPSAwOwotfQotCi1jb25zdCB1aW50OF90IGtWUDhMb2cyUmFuZ2VbMTI4XSA9IHsKLSAgICAgNywgNiwgNiwgNSwgNSwgNSwgNSwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwKLSAgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywKLSAgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKLSAgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKLSAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKLSAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKLSAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKLSAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKLSAgMAotfTsKLQotLy8gcmFuZ2UgPSAocmFuZ2UgPDwga1ZQOExvZzJSYW5nZVtyYW5nZV0pICsgdHJhaWxpbmcgMSdzCi1jb25zdCByYW5nZV90IGtWUDhOZXdSYW5nZVsxMjhdID0gewotICBNSygxMjcpLCBNSygxMjcpLCBNSygxOTEpLCBNSygxMjcpLCBNSygxNTkpLCBNSygxOTEpLCBNSygyMjMpLCBNSygxMjcpLAotICBNSygxNDMpLCBNSygxNTkpLCBNSygxNzUpLCBNSygxOTEpLCBNSygyMDcpLCBNSygyMjMpLCBNSygyMzkpLCBNSygxMjcpLAotICBNSygxMzUpLCBNSygxNDMpLCBNSygxNTEpLCBNSygxNTkpLCBNSygxNjcpLCBNSygxNzUpLCBNSygxODMpLCBNSygxOTEpLAotICBNSygxOTkpLCBNSygyMDcpLCBNSygyMTUpLCBNSygyMjMpLCBNSygyMzEpLCBNSygyMzkpLCBNSygyNDcpLCBNSygxMjcpLAotICBNSygxMzEpLCBNSygxMzUpLCBNSygxMzkpLCBNSygxNDMpLCBNSygxNDcpLCBNSygxNTEpLCBNSygxNTUpLCBNSygxNTkpLAotICBNSygxNjMpLCBNSygxNjcpLCBNSygxNzEpLCBNSygxNzUpLCBNSygxNzkpLCBNSygxODMpLCBNSygxODcpLCBNSygxOTEpLAotICBNSygxOTUpLCBNSygxOTkpLCBNSygyMDMpLCBNSygyMDcpLCBNSygyMTEpLCBNSygyMTUpLCBNSygyMTkpLCBNSygyMjMpLAotICBNSygyMjcpLCBNSygyMzEpLCBNSygyMzUpLCBNSygyMzkpLCBNSygyNDMpLCBNSygyNDcpLCBNSygyNTEpLCBNSygxMjcpLAotICBNSygxMjkpLCBNSygxMzEpLCBNSygxMzMpLCBNSygxMzUpLCBNSygxMzcpLCBNSygxMzkpLCBNSygxNDEpLCBNSygxNDMpLAotICBNSygxNDUpLCBNSygxNDcpLCBNSygxNDkpLCBNSygxNTEpLCBNSygxNTMpLCBNSygxNTUpLCBNSygxNTcpLCBNSygxNTkpLAotICBNSygxNjEpLCBNSygxNjMpLCBNSygxNjUpLCBNSygxNjcpLCBNSygxNjkpLCBNSygxNzEpLCBNSygxNzMpLCBNSygxNzUpLAotICBNSygxNzcpLCBNSygxNzkpLCBNSygxODEpLCBNSygxODMpLCBNSygxODUpLCBNSygxODcpLCBNSygxODkpLCBNSygxOTEpLAotICBNSygxOTMpLCBNSygxOTUpLCBNSygxOTcpLCBNSygxOTkpLCBNSygyMDEpLCBNSygyMDMpLCBNSygyMDUpLCBNSygyMDcpLAotICBNSygyMDkpLCBNSygyMTEpLCBNSygyMTMpLCBNSygyMTUpLCBNSygyMTcpLCBNSygyMTkpLCBNSygyMjEpLCBNSygyMjMpLAotICBNSygyMjUpLCBNSygyMjcpLCBNSygyMjkpLCBNSygyMzEpLCBNSygyMzMpLCBNSygyMzUpLCBNSygyMzcpLCBNSygyMzkpLAotICBNSygyNDEpLCBNSygyNDMpLCBNSygyNDUpLCBNSygyNDcpLCBNSygyNDkpLCBNSygyNTEpLCBNSygyNTMpLCBNSygxMjcpCi19OwotCi0jdW5kZWYgTUsKLQotdm9pZCBWUDhMb2FkRmluYWxCeXRlcyhWUDhCaXRSZWFkZXIqIGNvbnN0IGJyKSB7Ci0gIFNCX0RDSEVDSyhiciAhPSBOVUxMICYmIGJyLT5idWZfICE9IE5VTEwpOwotICAvLyBPbmx5IHJlYWQgOGJpdHMgYXQgYSB0aW1lCi0gIGlmIChici0+YnVmXyA8IGJyLT5idWZfZW5kXykgewotI2lmbmRlZiBVU0VfUklHSFRfSlVTVElGWQotICAgIGJyLT52YWx1ZV8gfD0gKGJpdF90KSgqYnItPmJ1Zl8rKykgPDwgKChCSVRTKSAtIDggLSBici0+Yml0c18pOwotI2Vsc2UKLSAgICBici0+dmFsdWVfID0gKGJpdF90KSgqYnItPmJ1Zl8rKykgfCAoYnItPnZhbHVlXyA8PCA4KTsKLSNlbmRpZgotICAgIGJyLT5iaXRzXyArPSA4OwotICB9IGVsc2UgaWYgKCFici0+ZW9mXykgewotI2lmZGVmIFVTRV9SSUdIVF9KVVNUSUZZCi0gICAgLy8gVGhlc2UgYXJlIG5vdCBzdHJpY3RseSBuZWVkZWQsIGJ1dCBpdCBtYWtlcyB0aGUgYmVoYXZpb3VyCi0gICAgLy8gY29uc2lzdGVudCBmb3IgYm90aCBVU0VfUklHSFRfSlVTVElGWSBhbmQgIVVTRV9SSUdIVF9KVVNUSUZZLgotICAgIGJyLT52YWx1ZV8gPDw9IDg7Ci0gICAgYnItPmJpdHNfICs9IDg7Ci0jZW5kaWYKLSAgICBici0+ZW9mXyA9IDE7Ci0gIH0KLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEhpZ2hlci1sZXZlbCBjYWxscwotCi11aW50MzJfdCBWUDhHZXRWYWx1ZShWUDhCaXRSZWFkZXIqIGNvbnN0IGJyLCBpbnQgYml0cykgewotICB1aW50MzJfdCB2ID0gMDsKLSAgd2hpbGUgKGJpdHMtLSA+IDApIHsKLSAgICB2IHw9IFZQOEdldEJpdChiciwgMHg4MCkgPDwgYml0czsKLSAgfQotICByZXR1cm4gdjsKLX0KLQotaW50MzJfdCBWUDhHZXRTaWduZWRWYWx1ZShWUDhCaXRSZWFkZXIqIGNvbnN0IGJyLCBpbnQgYml0cykgewotICBjb25zdCBpbnQgdmFsdWUgPSBWUDhHZXRWYWx1ZShiciwgYml0cyk7Ci0gIHJldHVybiBWUDhHZXQoYnIpID8gLXZhbHVlIDogdmFsdWU7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBWUDhMQml0UmVhZGVyCi0KLSNkZWZpbmUgTUFYX05VTV9CSVRfUkVBRCAyNQotCi0jZGVmaW5lIExCSVRTIDY0ICAgICAgLy8gTnVtYmVyIG9mIGJpdHMgcHJlZmV0Y2hlZC4KLSNkZWZpbmUgV0JJVFMgMzIgICAgICAvLyBNaW5pbXVtIG51bWJlciBvZiBieXRlcyBuZWVkZWQgYWZ0ZXIgVlA4TEZpbGxCaXRXaW5kb3cuCi0jZGVmaW5lIExPRzhfV0JJVFMgNCAgLy8gTnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCB0byBzdG9yZSBXQklUUyBiaXRzLgotCi1zdGF0aWMgY29uc3QgdWludDMyX3Qga0JpdE1hc2tbTUFYX05VTV9CSVRfUkVBRF0gPSB7Ci0gIDAsIDEsIDMsIDcsIDE1LCAzMSwgNjMsIDEyNywgMjU1LCA1MTEsIDEwMjMsIDIwNDcsIDQwOTUsIDgxOTEsIDE2MzgzLCAzMjc2NywKLSAgNjU1MzUsIDEzMTA3MSwgMjYyMTQzLCA1MjQyODcsIDEwNDg1NzUsIDIwOTcxNTEsIDQxOTQzMDMsIDgzODg2MDcsIDE2Nzc3MjE1Ci19OwotCi12b2lkIFZQOExJbml0Qml0UmVhZGVyKFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBzdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCkgewotICBzaXplX3QgaTsKLSAgU0JfRENIRUNLKGJyICE9IE5VTEwpOwotICBTQl9EQ0hFQ0soc3RhcnQgIT0gTlVMTCk7Ci0gIFNCX0RDSEVDSyhsZW5ndGggPCAweGZmZmZmZmY4dSk7ICAgLy8gY2FuJ3QgaGFwcGVuIHdpdGggYSBSSUZGIGNodW5rLgotCi0gIGJyLT5idWZfID0gc3RhcnQ7Ci0gIGJyLT5sZW5fID0gbGVuZ3RoOwotICBici0+dmFsXyA9IDA7Ci0gIGJyLT5wb3NfID0gMDsKLSAgYnItPmJpdF9wb3NfID0gMDsKLSAgYnItPmVvc18gPSAwOwotICBici0+ZXJyb3JfID0gMDsKLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZihici0+dmFsXykgJiYgaSA8IGJyLT5sZW5fOyArK2kpIHsKLSAgICBici0+dmFsXyB8PSAoKHZwOGxfdmFsX3QpYnItPmJ1Zl9bYnItPnBvc19dKSA8PCAoOCAqIGkpOwotICAgICsrYnItPnBvc187Ci0gIH0KLX0KLQotdm9pZCBWUDhMQml0UmVhZGVyU2V0QnVmZmVyKFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGJ1Ziwgc2l6ZV90IGxlbikgewotICBTQl9EQ0hFQ0soYnIgIT0gTlVMTCk7Ci0gIFNCX0RDSEVDSyhidWYgIT0gTlVMTCk7Ci0gIFNCX0RDSEVDSyhsZW4gPCAweGZmZmZmZmY4dSk7ICAgLy8gY2FuJ3QgaGFwcGVuIHdpdGggYSBSSUZGIGNodW5rLgotICBici0+ZW9zXyA9IChici0+cG9zXyA+PSBsZW4pOwotICBici0+YnVmXyA9IGJ1ZjsKLSAgYnItPmxlbl8gPSBsZW47Ci19Ci0KLS8vIElmIG5vdCBhdCBFT1MsIHJlbG9hZCB1cCB0byBMQklUUyBieXRlLWJ5LWJ5dGUKLXN0YXRpYyB2b2lkIFNoaWZ0Qnl0ZXMoVlA4TEJpdFJlYWRlciogY29uc3QgYnIpIHsKLSAgd2hpbGUgKGJyLT5iaXRfcG9zXyA+PSA4ICYmIGJyLT5wb3NfIDwgYnItPmxlbl8pIHsKLSAgICBici0+dmFsXyA+Pj0gODsKLSAgICBici0+dmFsXyB8PSAoKHZwOGxfdmFsX3QpYnItPmJ1Zl9bYnItPnBvc19dKSA8PCAoTEJJVFMgLSA4KTsKLSAgICArK2JyLT5wb3NfOwotICAgIGJyLT5iaXRfcG9zXyAtPSA4OwotICB9Ci19Ci0KLXZvaWQgVlA4TEZpbGxCaXRXaW5kb3coVlA4TEJpdFJlYWRlciogY29uc3QgYnIpIHsKLSAgaWYgKGJyLT5iaXRfcG9zXyA+PSBXQklUUykgewotI2lmIChkZWZpbmVkKF9feDg2XzY0X18pIHx8IGRlZmluZWQoX01fWDY0KSkKLSAgICBpZiAoYnItPnBvc18gKyBzaXplb2YoYnItPnZhbF8pIDwgYnItPmxlbl8pIHsKLSAgICAgIGJyLT52YWxfID4+PSBXQklUUzsKLSAgICAgIGJyLT5iaXRfcG9zXyAtPSBXQklUUzsKLSAgICAgIC8vIFRoZSBleHByZXNzaW9uIGJlbG93IG5lZWRzIGEgbGl0dGxlLWVuZGlhbiBhcmNoIHRvIHdvcmsgY29ycmVjdGx5LgotICAgICAgLy8gVGhpcyBnaXZlcyBhIGxhcmdlIHNwZWVkdXAgZm9yIGRlY29kaW5nIHNwZWVkLgotICAgICAgYnItPnZhbF8gfD0gKihjb25zdCB2cDhsX3ZhbF90KikoYnItPmJ1Zl8gKyBici0+cG9zXykgPDwgKExCSVRTIC0gV0JJVFMpOwotICAgICAgYnItPnBvc18gKz0gTE9HOF9XQklUUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0jZW5kaWYKLSAgICBTaGlmdEJ5dGVzKGJyKTsgICAgICAgLy8gU2xvdyBwYXRoLgotICAgIGlmIChici0+cG9zXyA9PSBici0+bGVuXyAmJiBici0+Yml0X3Bvc18gPT0gTEJJVFMpIHsKLSAgICAgIGJyLT5lb3NfID0gMTsKLSAgICB9Ci0gIH0KLX0KLQotdWludDMyX3QgVlA4TFJlYWRCaXRzKFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyLCBpbnQgbl9iaXRzKSB7Ci0gIFNCX0RDSEVDSyhuX2JpdHMgPj0gMCk7Ci0gIC8vIEZsYWcgYW4gZXJyb3IgaWYgZW5kX29mX3N0cmVhbSBvciBuX2JpdHMgaXMgbW9yZSB0aGFuIGFsbG93ZWQgbGltaXQuCi0gIGlmICghYnItPmVvc18gJiYgbl9iaXRzIDwgTUFYX05VTV9CSVRfUkVBRCkgewotICAgIGNvbnN0IHVpbnQzMl90IHZhbCA9Ci0gICAgICAgICh1aW50MzJfdCkoYnItPnZhbF8gPj4gYnItPmJpdF9wb3NfKSAmIGtCaXRNYXNrW25fYml0c107Ci0gICAgY29uc3QgaW50IG5ld19iaXRzID0gYnItPmJpdF9wb3NfICsgbl9iaXRzOwotICAgIGJyLT5iaXRfcG9zXyA9IG5ld19iaXRzOwotICAgIC8vIElmIHRoaXMgcmVhZCBpcyBnb2luZyB0byBjcm9zcyB0aGUgcmVhZCBidWZmZXIsIHNldCB0aGUgZW9zIGZsYWcuCi0gICAgaWYgKGJyLT5wb3NfID09IGJyLT5sZW5fKSB7Ci0gICAgICBpZiAobmV3X2JpdHMgPj0gTEJJVFMpIHsKLSAgICAgICAgYnItPmVvc18gPSAxOwotICAgICAgfQotICAgIH0KLSAgICBTaGlmdEJ5dGVzKGJyKTsKLSAgICByZXR1cm4gdmFsOwotICB9IGVsc2UgewotICAgIGJyLT5lcnJvcl8gPSAxOwotICAgIHJldHVybiAwOwotICB9Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvYml0X3JlYWRlci5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvYml0X3JlYWRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTY4YjViLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL2JpdF9yZWFkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gQm9vbGVhbiBkZWNvZGVyCi0vLwotLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKLS8vICAgICAgICAgVmlrYXMgQXJvcmEgKHZpa2Fhcy5hcm9yYUBnbWFpbC5jb20pCi0KLSNpZm5kZWYgV0VCUF9VVElMU19CSVRfUkVBREVSX0hfCi0jZGVmaW5lIFdFQlBfVVRJTFNfQklUX1JFQURFUl9IXwotCi0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL2J5dGVfc3dhcC5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCi0jZWxzZQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2lmZGVmIF9NU0NfVkVSCi0jaW5jbHVkZSA8c3RkbGliLmg+ICAvLyBfYnl0ZXN3YXBfdWxvbmcKLSNlbmRpZgotI2luY2x1ZGUgPHN0cmluZy5oPiAgLy8gRm9yIG1lbWNweQotI2VuZGlmICAvLyBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICIuLi93ZWJwL3R5cGVzLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vLyBUaGUgQm9vbGVhbiBkZWNvZGVyIG5lZWRzIHRvIG1haW50YWluIGluZmluaXRlIHByZWNpc2lvbiBvbiB0aGUgdmFsdWVfIGZpZWxkLgotLy8gSG93ZXZlciwgc2luY2UgcmFuZ2VfIGlzIG9ubHkgOGJpdCwgd2Ugb25seSBuZWVkIGFuIGFjdGl2ZSB3aW5kb3cgb2YgOCBiaXRzCi0vLyBmb3IgdmFsdWVfLiBMZWZ0IGJpdHMgKE1TQikgZ2V0cyB6ZXJvZWQgYW5kIHNoaWZ0ZWQgYXdheSB3aGVuIHZhbHVlXyBmYWxscwotLy8gYmVsb3cgMTI4LCByYW5nZV8gaXMgdXBkYXRlZCwgYW5kIGZyZXNoIGJpdHMgcmVhZCBmcm9tIHRoZSBiaXRzdHJlYW0gYXJlCi0vLyBicm91Z2h0IGluIGFzIExTQi4KLS8vIFRvIGF2b2lkIHJlYWRpbmcgdGhlIGZyZXNoIGJpdHMgb25lIGJ5IG9uZSAoc2xvdyksIHdlIGNhY2hlIGEgZmV3IG9mIHRoZW0KLS8vIGFoZWFkIChhY3R1YWxseSwgd2UgY2FjaGUgQklUUyBvZiB0aGVtIGFoZWFkLiBTZWUgYmVsb3cpLiBUaGVyZSdzIHR3bwotLy8gc3RyYXRlZ2llcyByZWdhcmRpbmcgaG93IHRvIHNoaWZ0IHRoZXNlIGxvb2tlZC1haGVhZCBmcmVzaCBiaXRzIGludG8gdGhlCi0vLyA4Yml0IHdpbmRvdyBvZiB2YWx1ZV86IGVpdGhlciB3ZSBzaGlmdCB0aGVtIGluLCB3aGlsZSBrZWVwaW5nIHRoZSBwb3NpdGlvbiBvZgotLy8gdGhlIHdpbmRvdyBmaXhlZC4gT3Igd2Ugc2xpZGUgdGhlIHdpbmRvdyB0byB0aGUgcmlnaHQgd2hpbGUga2VlcGluZyB0aGUgY2FjaGUKLS8vIGJpdHMgYXQgYSBmaXhlZCwgcmlnaHQtanVzdGlmaWVkLCBwb3NpdGlvbi4KLS8vCi0vLyAgRXhhbXBsZSwgZm9yIEJJVFM9MTY6IGhlcmUgaXMgdGhlIGNvbnRlbnQgb2YgdmFsdWVfIGZvciBib3RoIHN0cmF0ZWdpZXM6Ci0vLwotLy8gICAgICAgICAgIVVTRV9SSUdIVF9KVVNUSUZZICAgICAgICAgICAgfHwgICAgICAgIFVTRV9SSUdIVF9KVVNUSUZZCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotLy8gICA8LSA4YiAtPjwtIDhiIC0+PC0gQklUUyBiaXRzICAtPiAgICAgfHwgIDwtIDhiKzNiIC0+PC0gOGIgLT48LSAxMyBiaXRzIC0+Ci0vLyAgIFt1bnVzZWRdW3ZhbHVlX11bY2FjaGVkIGJpdHNdWzBdICAgICB8fCAgW3VudXNlZC4uLl1bdmFsdWVfXVtjYWNoZWQgYml0c10KLS8vICBbLi4uLi4uLi4wMHZ2dnZ2dkJCQkJCQkJCQkJCQkIwMDBdTFNCIHx8IFsuLi4uLi4uLi4uLjAwdnZ2dnZ2QkJCQkJCQkJCQkJCQl0KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0vLyBBZnRlciBjYWxsaW5nIFZQOFNoaWZ0KCksIHdoZXJlIHdlIG5lZWQgdG8gc2hpZnQgYXdheSB0d28gemVyb3M6Ci0vLyAgWy4uLi4uLi4udnZ2dnZ2dnZCQkJCQkJCQkJCQjAwMDAwXUxTQiB8fCBbLi4uLi4uLi4uLi4uLnZ2dnZ2dnZ2QkJCQkJCQkJCQkJdCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotLy8gSnVzdCBiZWZvcmUgd2UgbmVlZCB0byBjYWxsIFZQOExvYWROZXdCeXRlcygpLCB0aGUgc2l0dWF0aW9uIGlzOgotLy8gIFsuLi4uLi4uLnZ2dnZ2djAwMDAwMDAwMDAwMDAwMDAwMF1MU0IgfHwgWy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4udnZ2dnZ2XQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLS8vIEFuZCBqdXN0IGFmdGVyIGNhbGxpbmcgVlA4TG9hZE5ld0J5dGVzKCk6Ci0vLyAgWy4uLi4uLi4udnZ2dnZ2dnZCQkJCQkJCQkJCQkJCQkJCXUxTQiB8fCBbLi4uLi4uLi52dnZ2dnZ2dkJCQkJCQkJCQkJCQkJCQkJdCi0vLwotLy8gLT4gd2UncmUgYmFjayB0byBoZWlnaHQgYWN0aXZlICd2YWx1ZV8nIGJpdHMgKG1hcmtlZCAndicpIGFuZCBCSVRTIGNhY2hlZAotLy8gYml0cyAobWFya2VkICdCJykKLS8vCi0vLyBUaGUgcmlnaHQtanVzdGlmeSBzdHJhdGVneSB0ZW5kcyB0byB1c2UgbGVzcyBzaGlmdHMgYW5kIGlzIG9mdGVuIGZhc3Rlci4KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEJJVFMgY2FuIGJlIGFueSBtdWx0aXBsZSBvZiA4IGZyb20gOCB0byA1NiAoaW5jbHVzaXZlKS4KLS8vIFBpY2sgdmFsdWVzIHRoYXQgZml0IG5hdHVyYWwgcmVnaXN0ZXIgc2l6ZS4KLQotI2lmICFkZWZpbmVkKFdFQlBfUkVGRVJFTkNFX0lNUExFTUVOVEFUSU9OKQotCi0jZGVmaW5lIFVTRV9SSUdIVF9KVVNUSUZZCi0KLSNpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9NX0lYODYpICAgICAgLy8geDg2IDMyYml0Ci0jZGVmaW5lIEJJVFMgMTYKLSNlbGlmIGRlZmluZWQoX194ODZfNjRfXykgfHwgZGVmaW5lZChfTV9YNjQpICAgLy8geDg2IDY0Yml0Ci0jZGVmaW5lIEJJVFMgNTYKLSNlbGlmIGRlZmluZWQoX19hcm1fXykgfHwgZGVmaW5lZChfTV9BUk0pICAgICAgLy8gQVJNCi0jZGVmaW5lIEJJVFMgMjQKLSNlbHNlICAgICAgICAgICAgICAgICAgICAgIC8vIHJlYXNvbmFibGUgZGVmYXVsdAotI2RlZmluZSBCSVRTIDI0Ci0jZW5kaWYKLQotI2Vsc2UgICAgIC8vIHJlZmVyZW5jZSBjaG9pY2VzCi0KLSNkZWZpbmUgVVNFX1JJR0hUX0pVU1RJRlkKLSNkZWZpbmUgQklUUyA4Ci0KLSNlbmRpZgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRGVyaXZlZCB0eXBlcyBhbmQgY29uc3RhbnRzCi0KLS8vIGJpdF90ID0gbmF0dXJhbCByZWdpc3RlciB0eXBlCi0vLyBsYml0X3QgPSBuYXR1cmFsIHR5cGUgZm9yIG1lbW9yeSBJL08KLQotI2lmIChCSVRTID4gMzIpCi10eXBlZGVmIHVpbnQ2NF90IGJpdF90OwotdHlwZWRlZiB1aW50NjRfdCBsYml0X3Q7Ci0jZWxpZiAoQklUUyA9PSAzMikKLXR5cGVkZWYgdWludDY0X3QgYml0X3Q7Ci10eXBlZGVmIHVpbnQzMl90IGxiaXRfdDsKLSNlbGlmIChCSVRTID09IDI0KQotdHlwZWRlZiB1aW50MzJfdCBiaXRfdDsKLXR5cGVkZWYgdWludDMyX3QgbGJpdF90OwotI2VsaWYgKEJJVFMgPT0gMTYpCi10eXBlZGVmIHVpbnQzMl90IGJpdF90OwotdHlwZWRlZiB1aW50MTZfdCBsYml0X3Q7Ci0jZWxzZQotdHlwZWRlZiB1aW50MzJfdCBiaXRfdDsKLXR5cGVkZWYgdWludDhfdCBsYml0X3Q7Ci0jZW5kaWYKLQotI2lmbmRlZiBVU0VfUklHSFRfSlVTVElGWQotdHlwZWRlZiBiaXRfdCByYW5nZV90OyAgICAgLy8gdHlwZSBmb3Igc3RvcmluZyByYW5nZV8KLSNkZWZpbmUgTUFTSyAoKCgoYml0X3QpMSkgPDwgKEJJVFMpKSAtIDEpCi0jZWxzZQotdHlwZWRlZiB1aW50MzJfdCByYW5nZV90OyAgLy8gcmFuZ2VfIG9ubHkgdXNlcyA4Yml0cyBoZXJlLiBObyBuZWVkIGZvciBiaXRfdC4KLSNlbmRpZgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQml0cmVhZGVyCi0KLXR5cGVkZWYgc3RydWN0IFZQOEJpdFJlYWRlciBWUDhCaXRSZWFkZXI7Ci1zdHJ1Y3QgVlA4Qml0UmVhZGVyIHsKLSAgY29uc3QgdWludDhfdCogYnVmXzsgICAgICAgIC8vIG5leHQgYnl0ZSB0byBiZSByZWFkCi0gIGNvbnN0IHVpbnQ4X3QqIGJ1Zl9lbmRfOyAgICAvLyBlbmQgb2YgcmVhZCBidWZmZXIKLSAgaW50IGVvZl87ICAgICAgICAgICAgICAgICAgIC8vIHRydWUgaWYgaW5wdXQgaXMgZXhoYXVzdGVkCi0KLSAgLy8gYm9vbGVhbiBkZWNvZGVyCi0gIHJhbmdlX3QgcmFuZ2VfOyAgICAgICAgICAgIC8vIGN1cnJlbnQgcmFuZ2UgbWludXMgMS4gSW4gWzEyNywgMjU0XSBpbnRlcnZhbC4KLSAgYml0X3QgdmFsdWVfOyAgICAgICAgICAgICAgLy8gY3VycmVudCB2YWx1ZQotICBpbnQgYml0c187ICAgICAgICAgICAgICAgICAvLyBudW1iZXIgb2YgdmFsaWQgYml0cyBsZWZ0Ci19OwotCi0vLyBJbml0aWFsaXplIHRoZSBiaXQgcmVhZGVyIGFuZCB0aGUgYm9vbGVhbiBkZWNvZGVyLgotdm9pZCBWUDhJbml0Qml0UmVhZGVyKFZQOEJpdFJlYWRlciogY29uc3QgYnIsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3Qgc3RhcnQsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGVuZCk7Ci0KLS8vIHJldHVybiB0aGUgbmV4dCB2YWx1ZSBtYWRlIG9mICdudW1fYml0cycgYml0cwotdWludDMyX3QgVlA4R2V0VmFsdWUoVlA4Qml0UmVhZGVyKiBjb25zdCBiciwgaW50IG51bV9iaXRzKTsKLXN0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBWUDhHZXQoVlA4Qml0UmVhZGVyKiBjb25zdCBicikgewotICByZXR1cm4gVlA4R2V0VmFsdWUoYnIsIDEpOwotfQotCi0vLyByZXR1cm4gdGhlIG5leHQgdmFsdWUgd2l0aCBzaWduLWV4dGVuc2lvbi4KLWludDMyX3QgVlA4R2V0U2lnbmVkVmFsdWUoVlA4Qml0UmVhZGVyKiBjb25zdCBiciwgaW50IG51bV9iaXRzKTsKLQotLy8gUmVhZCBhIGJpdCB3aXRoIHByb2JhICdwcm9iJy4gU3BlZWQtY3JpdGljYWwgZnVuY3Rpb24hCi1leHRlcm4gY29uc3QgdWludDhfdCBrVlA4TG9nMlJhbmdlWzEyOF07Ci1leHRlcm4gY29uc3QgcmFuZ2VfdCBrVlA4TmV3UmFuZ2VbMTI4XTsKLQotdm9pZCBWUDhMb2FkRmluYWxCeXRlcyhWUDhCaXRSZWFkZXIqIGNvbnN0IGJyKTsgICAgLy8gc3BlY2lhbCBjYXNlIGZvciB0aGUgdGFpbAotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWUDhMb2FkTmV3Qnl0ZXMoVlA4Qml0UmVhZGVyKiBjb25zdCBicikgewotICBTQl9EQ0hFQ0soYnIgIT0gTlVMTCAmJiBici0+YnVmXyAhPSBOVUxMKTsKLSAgLy8gUmVhZCAnQklUUycgYml0cyBhdCBhIHRpbWUgaWYgcG9zc2libGUuCi0gIGlmIChici0+YnVmXyArIHNpemVvZihsYml0X3QpIDw9IGJyLT5idWZfZW5kXykgewotICAgIC8vIGNvbnZlcnQgbWVtb3J5IHR5cGUgdG8gcmVnaXN0ZXIgdHlwZSAod2l0aCBzb21lIHplcm8naW5nISkKLSAgICBiaXRfdCBiaXRzOwotICAgIGxiaXRfdCBpbl9iaXRzID0gKihsYml0X3QqKWJyLT5idWZfOwotICAgIGJyLT5idWZfICs9IChCSVRTKSA+PiAzOwotI2lmICFkZWZpbmVkKF9fQklHX0VORElBTl9fKQotI2lmIChCSVRTID4gMzIpCi0vLyBnY2MgNC4zIGhhcyBidWlsdGluIGZ1bmN0aW9ucyBmb3Igc3dhcDMyL3N3YXA2NAotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotICAgIGJpdHMgPSBTYkJ5dGVTd2FwVTY0KGluX2JpdHMpOwotI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgXAotICAgICAgICAgICAoX19HTlVDX18gPiA0IHx8IChfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fID49IDMpKQotICAgIGJpdHMgPSAoYml0X3QpX19idWlsdGluX2Jzd2FwNjQoaW5fYml0cyk7Ci0jZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQotICAgIGJpdHMgPSAoYml0X3QpX2J5dGVzd2FwX3VpbnQ2NChpbl9iaXRzKTsKLSNlbGlmIGRlZmluZWQoX194ODZfNjRfXykKLSAgICBfX2FzbV9fIHZvbGF0aWxlKCJic3dhcHEgJTAiIDogIj1yIihiaXRzKSA6ICIwIihpbl9iaXRzKSk7Ci0jZWxzZSAgLy8gZ2VuZXJpYyBjb2RlIGZvciBzd2FwcGluZyA2NC1iaXQgdmFsdWVzIChzdWdnZXN0ZWQgYnkgYmRiQCkKLSAgICBiaXRzID0gKGJpdF90KWluX2JpdHM7Ci0gICAgYml0cyA9ICgoYml0cyAmIDB4ZmZmZmZmZmYwMDAwMDAwMHVsbCkgPj4gMzIpIHwKLSAgICAgICAgICAgKChiaXRzICYgMHgwMDAwMDAwMGZmZmZmZmZmdWxsKSA8PCAzMik7Ci0gICAgYml0cyA9ICgoYml0cyAmIDB4ZmZmZjAwMDBmZmZmMDAwMHVsbCkgPj4gMTYpIHwKLSAgICAgICAgICAgKChiaXRzICYgMHgwMDAwZmZmZjAwMDBmZmZmdWxsKSA8PCAxNik7Ci0gICAgYml0cyA9ICgoYml0cyAmIDB4ZmYwMGZmMDBmZjAwZmYwMHVsbCkgPj4gOCkgfAotICAgICAgICAgICAoKGJpdHMgJiAweDAwZmYwMGZmMDBmZjAwZmZ1bGwpIDw8IDgpOwotI2VuZGlmCi0gICAgYml0cyA+Pj0gNjQgLSBCSVRTOwotI2VsaWYgKEJJVFMgPj0gMjQpCi0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0gICAgYml0cyA9IFNiQnl0ZVN3YXBVMzIoaW5fYml0cyk7Ci0jZWxpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCi0gICAgX19hc21fXyB2b2xhdGlsZSgiYnN3YXAgJWswIiA6ICI9ciIoaW5fYml0cykgOiAiMCIoaW5fYml0cykpOwotICAgIGJpdHMgPSAoYml0X3QpaW5fYml0czsgICAvLyAyNGIvMzJiIC0+IDMyYi82NGIgemVyby1leHRlbnNpb24KLSNlbGlmIGRlZmluZWQoX01TQ19WRVIpCi0gICAgYml0cyA9IChiaXRfdClfYnl0ZXN3YXBfdWxvbmcoaW5fYml0cyk7Ci0jZWxzZQotICAgIGJpdHMgPSAoYml0X3QpKGluX2JpdHMgPj4gMjQpIHwgKChpbl9iaXRzID4+IDgpICYgMHhmZjAwKQotICAgICAgICAgfCAoKGluX2JpdHMgPDwgOCkgJiAweGZmMDAwMCkgIHwgKGluX2JpdHMgPDwgMjQpOwotI2VuZGlmICAvLyB4ODYKLSAgICBiaXRzID4+PSAoMzIgLSBCSVRTKTsKLSNlbGlmIChCSVRTID09IDE2KQotICAgIC8vIGdjYyB3aWxsIHJlY29nbml6ZSBhICdyb3J3ICQ4LCAuLi4nIGhlcmU6Ci0gICAgYml0cyA9IChiaXRfdCkoaW5fYml0cyA+PiA4KSB8ICgoaW5fYml0cyAmIDB4ZmYpIDw8IDgpOwotI2Vsc2UgICAvLyBCSVRTID09IDgKLSAgICBiaXRzID0gKGJpdF90KWluX2JpdHM7Ci0jZW5kaWYKLSNlbHNlICAgIC8vIEJJR19FTkRJQU4KLSAgICBiaXRzID0gKGJpdF90KWluX2JpdHM7Ci0gICAgaWYgKEJJVFMgIT0gOCAqIHNpemVvZihiaXRfdCkpIGJpdHMgPj49ICg4ICogc2l6ZW9mKGJpdF90KSAtIEJJVFMpOwotI2VuZGlmCi0jaWZuZGVmIFVTRV9SSUdIVF9KVVNUSUZZCi0gICAgYnItPnZhbHVlXyB8PSBiaXRzIDw8ICgtYnItPmJpdHNfKTsKLSNlbHNlCi0gICAgYnItPnZhbHVlXyA9IGJpdHMgfCAoYnItPnZhbHVlXyA8PCAoQklUUykpOwotI2VuZGlmCi0gICAgYnItPmJpdHNfICs9IChCSVRTKTsKLSAgfSBlbHNlIHsKLSAgICBWUDhMb2FkRmluYWxCeXRlcyhicik7ICAgIC8vIG5vIG5lZWQgdG8gYmUgaW5saW5lZAotICB9Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4Qml0VXBkYXRlKFZQOEJpdFJlYWRlciogY29uc3QgYnIsIHJhbmdlX3Qgc3BsaXQpIHsKLSAgaWYgKGJyLT5iaXRzXyA8IDApIHsgIC8vIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgbGVhc3QgQklUUyBiaXRzIGluICd2YWx1ZV8nCi0gICAgVlA4TG9hZE5ld0J5dGVzKGJyKTsKLSAgfQotI2lmbmRlZiBVU0VfUklHSFRfSlVTVElGWQotICBzcGxpdCB8PSAoTUFTSyk7Ci0gIGlmIChici0+dmFsdWVfID4gc3BsaXQpIHsKLSAgICBici0+cmFuZ2VfIC09IHNwbGl0ICsgMTsKLSAgICBici0+dmFsdWVfIC09IHNwbGl0ICsgMTsKLSAgICByZXR1cm4gMTsKLSAgfSBlbHNlIHsKLSAgICBici0+cmFuZ2VfID0gc3BsaXQ7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSNlbHNlCi0gIHsKLSAgICBjb25zdCBpbnQgcG9zID0gYnItPmJpdHNfOwotICAgIGNvbnN0IHJhbmdlX3QgdmFsdWUgPSAocmFuZ2VfdCkoYnItPnZhbHVlXyA+PiBwb3MpOwotICAgIGlmICh2YWx1ZSA+IHNwbGl0KSB7Ci0gICAgICBici0+cmFuZ2VfIC09IHNwbGl0ICsgMTsKLSAgICAgIGJyLT52YWx1ZV8gLT0gKGJpdF90KShzcGxpdCArIDEpIDw8IHBvczsKLSAgICAgIHJldHVybiAxOwotICAgIH0gZWxzZSB7Ci0gICAgICBici0+cmFuZ2VfID0gc3BsaXQ7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIH0KLSNlbmRpZgotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWUDhTaGlmdChWUDhCaXRSZWFkZXIqIGNvbnN0IGJyKSB7Ci0jaWZuZGVmIFVTRV9SSUdIVF9KVVNUSUZZCi0gIC8vIHJhbmdlXyBpcyBpbiBbMC4uMTI3XSBpbnRlcnZhbCBoZXJlLgotICBjb25zdCBiaXRfdCBpZHggPSBici0+cmFuZ2VfID4+IChCSVRTKTsKLSAgY29uc3QgaW50IHNoaWZ0ID0ga1ZQOExvZzJSYW5nZVtpZHhdOwotICBici0+cmFuZ2VfID0ga1ZQOE5ld1JhbmdlW2lkeF07Ci0gIGJyLT52YWx1ZV8gPDw9IHNoaWZ0OwotICBici0+Yml0c18gLT0gc2hpZnQ7Ci0jZWxzZQotICBjb25zdCBpbnQgc2hpZnQgPSBrVlA4TG9nMlJhbmdlW2JyLT5yYW5nZV9dOwotICBTQl9EQ0hFQ0soYnItPnJhbmdlXyA8IChyYW5nZV90KTEyOCk7Ci0gIGJyLT5yYW5nZV8gPSBrVlA4TmV3UmFuZ2VbYnItPnJhbmdlX107Ci0gIGJyLT5iaXRzXyAtPSBzaGlmdDsKLSNlbmRpZgotfQotc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhHZXRCaXQoVlA4Qml0UmVhZGVyKiBjb25zdCBiciwgaW50IHByb2IpIHsKLSNpZm5kZWYgVVNFX1JJR0hUX0pVU1RJRlkKLSAgLy8gSXQncyBpbXBvcnRhbnQgdG8gYXZvaWQgZ2VuZXJhdGluZyBhIDY0Yml0IHggNjRiaXQgbXVsdGlwbHkgaGVyZS4KLSAgLy8gV2UganVzdCBuZWVkIGFuIDhiIHggOGIgYWZ0ZXIgYWxsLgotICBjb25zdCByYW5nZV90IHNwbGl0ID0KLSAgICAgIChyYW5nZV90KSgodWludDMyX3QpKGJyLT5yYW5nZV8gPj4gKEJJVFMpKSAqIHByb2IpIDw8ICgoQklUUykgLSA4KTsKLSAgY29uc3QgaW50IGJpdCA9IFZQOEJpdFVwZGF0ZShiciwgc3BsaXQpOwotICBpZiAoYnItPnJhbmdlXyA8PSAoKChyYW5nZV90KTB4N2UgPDwgKEJJVFMpKSB8IChNQVNLKSkpIHsKLSAgICBWUDhTaGlmdChicik7Ci0gIH0KLSAgcmV0dXJuIGJpdDsKLSNlbHNlCi0gIGNvbnN0IHJhbmdlX3Qgc3BsaXQgPSAoYnItPnJhbmdlXyAqIHByb2IpID4+IDg7Ci0gIGNvbnN0IGludCBiaXQgPSBWUDhCaXRVcGRhdGUoYnIsIHNwbGl0KTsKLSAgaWYgKGJyLT5yYW5nZV8gPD0gKHJhbmdlX3QpMHg3ZSkgewotICAgIFZQOFNoaWZ0KGJyKTsKLSAgfQotICByZXR1cm4gYml0OwotI2VuZGlmCi19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4R2V0U2lnbmVkKFZQOEJpdFJlYWRlciogY29uc3QgYnIsIGludCB2KSB7Ci0gIGNvbnN0IHJhbmdlX3Qgc3BsaXQgPSAoYnItPnJhbmdlXyA+PiAxKTsKLSAgY29uc3QgaW50IGJpdCA9IFZQOEJpdFVwZGF0ZShiciwgc3BsaXQpOwotICBWUDhTaGlmdChicik7Ci0gIHJldHVybiBiaXQgPyAtdiA6IHY7Ci19Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEJpdHJlYWRlciBmb3IgbG9zc2xlc3MgZm9ybWF0Ci0KLXR5cGVkZWYgdWludDY0X3QgdnA4bF92YWxfdDsgIC8vIHJpZ2h0IG5vdywgdGhpcyBiaXQtcmVhZGVyIGNhbiBvbmx5IHVzZSA2NGJpdC4KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB2cDhsX3ZhbF90ICAgICB2YWxfOyAgICAgICAgLy8gcHJlLWZldGNoZWQgYml0cwotICBjb25zdCB1aW50OF90KiBidWZfOyAgICAgICAgLy8gaW5wdXQgYnl0ZSBidWZmZXIKLSAgc2l6ZV90ICAgICAgICAgbGVuXzsgICAgICAgIC8vIGJ1ZmZlciBsZW5ndGgKLSAgc2l6ZV90ICAgICAgICAgcG9zXzsgICAgICAgIC8vIGJ5dGUgcG9zaXRpb24gaW4gYnVmXwotICBpbnQgICAgICAgICAgICBiaXRfcG9zXzsgICAgLy8gY3VycmVudCBiaXQtcmVhZGluZyBwb3NpdGlvbiBpbiB2YWxfCi0gIGludCAgICAgICAgICAgIGVvc187ICAgICAgICAvLyBiaXRzdHJlYW0gaXMgZmluaXNoZWQKLSAgaW50ICAgICAgICAgICAgZXJyb3JfOyAgICAgIC8vIGFuIGVycm9yIG9jY3VycmVkIChidWZmZXIgb3ZlcmZsb3cgYXR0ZW1wdC4uLikKLX0gVlA4TEJpdFJlYWRlcjsKLQotdm9pZCBWUDhMSW5pdEJpdFJlYWRlcihWUDhMQml0UmVhZGVyKiBjb25zdCBiciwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3Qgc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGgpOwotCi0vLyAgU2V0cyBhIG5ldyBkYXRhIGJ1ZmZlci4KLXZvaWQgVlA4TEJpdFJlYWRlclNldEJ1ZmZlcihWUDhMQml0UmVhZGVyKiBjb25zdCBiciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBidWZmZXIsIHNpemVfdCBsZW5ndGgpOwotCi0vLyBSZWFkcyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBiaXRzIGZyb20gUmVhZCBCdWZmZXIuCi0vLyBGbGFncyBhbiBlcnJvciBpbiBjYXNlIGVuZF9vZl9zdHJlYW0gb3Igbl9iaXRzIGlzIG1vcmUgdGhhbiBhbGxvd2VkIGxpbWl0LgotLy8gRmxhZ3MgZW9zIGlmIHRoaXMgcmVhZCBhdHRlbXB0IGlzIGdvaW5nIHRvIGNyb3NzIHRoZSByZWFkIGJ1ZmZlci4KLXVpbnQzMl90IFZQOExSZWFkQml0cyhWUDhMQml0UmVhZGVyKiBjb25zdCBiciwgaW50IG5fYml0cyk7Ci0KLS8vIFJldHVybiB0aGUgcHJlZmV0Y2hlZCBiaXRzLCBzbyB0aGV5IGNhbiBiZSBsb29rZWQgdXAuCi1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgVlA4TFByZWZldGNoQml0cyhWUDhMQml0UmVhZGVyKiBjb25zdCBicikgewotICByZXR1cm4gKHVpbnQzMl90KShici0+dmFsXyA+PiBici0+Yml0X3Bvc18pOwotfQotCi0vLyBEaXNjYXJkICdudW1fYml0cycgYml0cyBmcm9tIHRoZSBjYWNoZS4KLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZQOExEaXNjYXJkQml0cyhWUDhMQml0UmVhZGVyKiBjb25zdCBiciwgaW50IG51bV9iaXRzKSB7Ci0gIGJyLT5iaXRfcG9zXyArPSBudW1fYml0czsKLX0KLQotLy8gQWR2YW5jZXMgdGhlIFJlYWQgYnVmZmVyIGJ5IDQgYnl0ZXMgdG8gbWFrZSByb29tIGZvciByZWFkaW5nIG5leHQgMzIgYml0cy4KLXZvaWQgVlA4TEZpbGxCaXRXaW5kb3coVlA4TEJpdFJlYWRlciogY29uc3QgYnIpOwotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKLQotI2VuZGlmICAvKiBXRUJQX1VUSUxTX0JJVF9SRUFERVJfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL2JpdF93cml0ZXIuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL2JpdF93cml0ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVlMWNkMS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy9iaXRfd3JpdGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIEJpdCB3cml0aW5nIGFuZCBib29sZWFuIGNvZGVyCi0vLwotLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKLS8vICAgICAgICAgVmlrYXMgQXJvcmEgKHZpa2Fhcy5hcm9yYUBnbWFpbC5jb20pCi0KLSNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgotI2Vsc2UKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4gICAvLyBmb3IgbWVtY3B5KCkKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiLi9iaXRfd3JpdGVyLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVlA4Qml0V3JpdGVyCi0KLXN0YXRpYyBpbnQgQml0V3JpdGVyUmVzaXplKFZQOEJpdFdyaXRlciogY29uc3QgYncsIHNpemVfdCBleHRyYV9zaXplKSB7Ci0gIHVpbnQ4X3QqIG5ld19idWY7Ci0gIHNpemVfdCBuZXdfc2l6ZTsKLSAgY29uc3QgdWludDY0X3QgbmVlZGVkX3NpemVfNjRiID0gKHVpbnQ2NF90KWJ3LT5wb3NfICsgZXh0cmFfc2l6ZTsKLSAgY29uc3Qgc2l6ZV90IG5lZWRlZF9zaXplID0gKHNpemVfdCluZWVkZWRfc2l6ZV82NGI7Ci0gIGlmIChuZWVkZWRfc2l6ZV82NGIgIT0gbmVlZGVkX3NpemUpIHsKLSAgICBidy0+ZXJyb3JfID0gMTsKLSAgICByZXR1cm4gMDsKLSAgfQotICBpZiAobmVlZGVkX3NpemUgPD0gYnctPm1heF9wb3NfKSByZXR1cm4gMTsKLSAgLy8gSWYgdGhlIGZvbGxvd2luZyBsaW5lIHdyYXBzIG92ZXIgMzJiaXQsIHRoZSB0ZXN0IGp1c3QgYWZ0ZXIgd2lsbCBjYXRjaCBpdC4KLSAgbmV3X3NpemUgPSAyICogYnctPm1heF9wb3NfOwotICBpZiAobmV3X3NpemUgPCBuZWVkZWRfc2l6ZSkgbmV3X3NpemUgPSBuZWVkZWRfc2l6ZTsKLSAgaWYgKG5ld19zaXplIDwgMTAyNCkgbmV3X3NpemUgPSAxMDI0OwotICBuZXdfYnVmID0gKHVpbnQ4X3QqKVNiTWVtb3J5QWxsb2NhdGUobmV3X3NpemUpOwotICBpZiAobmV3X2J1ZiA9PSBOVUxMKSB7Ci0gICAgYnctPmVycm9yXyA9IDE7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgU2JNZW1vcnlDb3B5KG5ld19idWYsIGJ3LT5idWZfLCBidy0+cG9zXyk7Ci0gIFNiTWVtb3J5RGVhbGxvY2F0ZShidy0+YnVmXyk7Ci0gIGJ3LT5idWZfID0gbmV3X2J1ZjsKLSAgYnctPm1heF9wb3NfID0gbmV3X3NpemU7Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCBrRmx1c2goVlA4Qml0V3JpdGVyKiBjb25zdCBidykgewotICBjb25zdCBpbnQgcyA9IDggKyBidy0+bmJfYml0c187Ci0gIGNvbnN0IGludDMyX3QgYml0cyA9IGJ3LT52YWx1ZV8gPj4gczsKLSAgU0JfRENIRUNLKGJ3LT5uYl9iaXRzXyA+PSAwKTsKLSAgYnctPnZhbHVlXyAtPSBiaXRzIDw8IHM7Ci0gIGJ3LT5uYl9iaXRzXyAtPSA4OwotICBpZiAoKGJpdHMgJiAweGZmKSAhPSAweGZmKSB7Ci0gICAgc2l6ZV90IHBvcyA9IGJ3LT5wb3NfOwotICAgIGlmICghQml0V3JpdGVyUmVzaXplKGJ3LCBidy0+cnVuXyArIDEpKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChiaXRzICYgMHgxMDApIHsgIC8vIG92ZXJmbG93IC0+IHByb3BhZ2F0ZSBjYXJyeSBvdmVyIHBlbmRpbmcgMHhmZidzCi0gICAgICBpZiAocG9zID4gMCkgYnctPmJ1Zl9bcG9zIC0gMV0rKzsKLSAgICB9Ci0gICAgaWYgKGJ3LT5ydW5fID4gMCkgewotICAgICAgY29uc3QgaW50IHZhbHVlID0gKGJpdHMgJiAweDEwMCkgPyAweDAwIDogMHhmZjsKLSAgICAgIGZvciAoOyBidy0+cnVuXyA+IDA7IC0tYnctPnJ1bl8pIGJ3LT5idWZfW3BvcysrXSA9IHZhbHVlOwotICAgIH0KLSAgICBidy0+YnVmX1twb3MrK10gPSBiaXRzOwotICAgIGJ3LT5wb3NfID0gcG9zOwotICB9IGVsc2UgewotICAgIGJ3LT5ydW5fKys7ICAgLy8gZGVsYXkgd3JpdGluZyBvZiBieXRlcyAweGZmLCBwZW5kaW5nIGV2ZW50dWFsIGNhcnJ5LgotICB9Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyByZW5vcm1hbGl6YXRpb24KLQotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga05vcm1bMTI4XSA9IHsgIC8vIHJlbm9ybV9zaXplc1tpXSA9IDggLSBsb2cyKGkpCi0gICAgIDcsIDYsIDYsIDUsIDUsIDUsIDUsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsCi0gIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCi0gIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCi0gIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCi0gIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCi0gIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCi0gIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCi0gIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCi0gIDAKLX07Ci0KLS8vIHJhbmdlID0gKChyYW5nZSArIDEpIDw8IGtWUDhMb2cyUmFuZ2VbcmFuZ2VdKSAtIDEKLXN0YXRpYyBjb25zdCB1aW50OF90IGtOZXdSYW5nZVsxMjhdID0gewotICAxMjcsIDEyNywgMTkxLCAxMjcsIDE1OSwgMTkxLCAyMjMsIDEyNywgMTQzLCAxNTksIDE3NSwgMTkxLCAyMDcsIDIyMywgMjM5LAotICAxMjcsIDEzNSwgMTQzLCAxNTEsIDE1OSwgMTY3LCAxNzUsIDE4MywgMTkxLCAxOTksIDIwNywgMjE1LCAyMjMsIDIzMSwgMjM5LAotICAyNDcsIDEyNywgMTMxLCAxMzUsIDEzOSwgMTQzLCAxNDcsIDE1MSwgMTU1LCAxNTksIDE2MywgMTY3LCAxNzEsIDE3NSwgMTc5LAotICAxODMsIDE4NywgMTkxLCAxOTUsIDE5OSwgMjAzLCAyMDcsIDIxMSwgMjE1LCAyMTksIDIyMywgMjI3LCAyMzEsIDIzNSwgMjM5LAotICAyNDMsIDI0NywgMjUxLCAxMjcsIDEyOSwgMTMxLCAxMzMsIDEzNSwgMTM3LCAxMzksIDE0MSwgMTQzLCAxNDUsIDE0NywgMTQ5LAotICAxNTEsIDE1MywgMTU1LCAxNTcsIDE1OSwgMTYxLCAxNjMsIDE2NSwgMTY3LCAxNjksIDE3MSwgMTczLCAxNzUsIDE3NywgMTc5LAotICAxODEsIDE4MywgMTg1LCAxODcsIDE4OSwgMTkxLCAxOTMsIDE5NSwgMTk3LCAxOTksIDIwMSwgMjAzLCAyMDUsIDIwNywgMjA5LAotICAyMTEsIDIxMywgMjE1LCAyMTcsIDIxOSwgMjIxLCAyMjMsIDIyNSwgMjI3LCAyMjksIDIzMSwgMjMzLCAyMzUsIDIzNywgMjM5LAotICAyNDEsIDI0MywgMjQ1LCAyNDcsIDI0OSwgMjUxLCAyNTMsIDEyNwotfTsKLQotaW50IFZQOFB1dEJpdChWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LCBpbnQgYml0LCBpbnQgcHJvYikgewotICBjb25zdCBpbnQgc3BsaXQgPSAoYnctPnJhbmdlXyAqIHByb2IpID4+IDg7Ci0gIGlmIChiaXQpIHsKLSAgICBidy0+dmFsdWVfICs9IHNwbGl0ICsgMTsKLSAgICBidy0+cmFuZ2VfIC09IHNwbGl0ICsgMTsKLSAgfSBlbHNlIHsKLSAgICBidy0+cmFuZ2VfID0gc3BsaXQ7Ci0gIH0KLSAgaWYgKGJ3LT5yYW5nZV8gPCAxMjcpIHsgICAvLyBlbWl0ICdzaGlmdCcgYml0cyBvdXQgYW5kIHJlbm9ybWFsaXplCi0gICAgY29uc3QgaW50IHNoaWZ0ID0ga05vcm1bYnctPnJhbmdlX107Ci0gICAgYnctPnJhbmdlXyA9IGtOZXdSYW5nZVtidy0+cmFuZ2VfXTsKLSAgICBidy0+dmFsdWVfIDw8PSBzaGlmdDsKLSAgICBidy0+bmJfYml0c18gKz0gc2hpZnQ7Ci0gICAgaWYgKGJ3LT5uYl9iaXRzXyA+IDApIGtGbHVzaChidyk7Ci0gIH0KLSAgcmV0dXJuIGJpdDsKLX0KLQotaW50IFZQOFB1dEJpdFVuaWZvcm0oVlA4Qml0V3JpdGVyKiBjb25zdCBidywgaW50IGJpdCkgewotICBjb25zdCBpbnQgc3BsaXQgPSBidy0+cmFuZ2VfID4+IDE7Ci0gIGlmIChiaXQpIHsKLSAgICBidy0+dmFsdWVfICs9IHNwbGl0ICsgMTsKLSAgICBidy0+cmFuZ2VfIC09IHNwbGl0ICsgMTsKLSAgfSBlbHNlIHsKLSAgICBidy0+cmFuZ2VfID0gc3BsaXQ7Ci0gIH0KLSAgaWYgKGJ3LT5yYW5nZV8gPCAxMjcpIHsKLSAgICBidy0+cmFuZ2VfID0ga05ld1JhbmdlW2J3LT5yYW5nZV9dOwotICAgIGJ3LT52YWx1ZV8gPDw9IDE7Ci0gICAgYnctPm5iX2JpdHNfICs9IDE7Ci0gICAgaWYgKGJ3LT5uYl9iaXRzXyA+IDApIGtGbHVzaChidyk7Ci0gIH0KLSAgcmV0dXJuIGJpdDsKLX0KLQotdm9pZCBWUDhQdXRWYWx1ZShWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LCBpbnQgdmFsdWUsIGludCBuYl9iaXRzKSB7Ci0gIGludCBtYXNrOwotICBmb3IgKG1hc2sgPSAxIDw8IChuYl9iaXRzIC0gMSk7IG1hc2s7IG1hc2sgPj49IDEpCi0gICAgVlA4UHV0Qml0VW5pZm9ybShidywgdmFsdWUgJiBtYXNrKTsKLX0KLQotdm9pZCBWUDhQdXRTaWduZWRWYWx1ZShWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LCBpbnQgdmFsdWUsIGludCBuYl9iaXRzKSB7Ci0gIGlmICghVlA4UHV0Qml0VW5pZm9ybShidywgdmFsdWUgIT0gMCkpCi0gICAgcmV0dXJuOwotICBpZiAodmFsdWUgPCAwKSB7Ci0gICAgVlA4UHV0VmFsdWUoYncsICgoLXZhbHVlKSA8PCAxKSB8IDEsIG5iX2JpdHMgKyAxKTsKLSAgfSBlbHNlIHsKLSAgICBWUDhQdXRWYWx1ZShidywgdmFsdWUgPDwgMSwgbmJfYml0cyArIDEpOwotICB9Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWludCBWUDhCaXRXcml0ZXJJbml0KFZQOEJpdFdyaXRlciogY29uc3QgYncsIHNpemVfdCBleHBlY3RlZF9zaXplKSB7Ci0gIGJ3LT5yYW5nZV8gICA9IDI1NSAtIDE7Ci0gIGJ3LT52YWx1ZV8gICA9IDA7Ci0gIGJ3LT5ydW5fICAgICA9IDA7Ci0gIGJ3LT5uYl9iaXRzXyA9IC04OwotICBidy0+cG9zXyAgICAgPSAwOwotICBidy0+bWF4X3Bvc18gPSAwOwotICBidy0+ZXJyb3JfICAgPSAwOwotICBidy0+YnVmXyAgICAgPSBOVUxMOwotICByZXR1cm4gKGV4cGVjdGVkX3NpemUgPiAwKSA/IEJpdFdyaXRlclJlc2l6ZShidywgZXhwZWN0ZWRfc2l6ZSkgOiAxOwotfQotCi11aW50OF90KiBWUDhCaXRXcml0ZXJGaW5pc2goVlA4Qml0V3JpdGVyKiBjb25zdCBidykgewotICBWUDhQdXRWYWx1ZShidywgMCwgOSAtIGJ3LT5uYl9iaXRzXyk7Ci0gIGJ3LT5uYl9iaXRzXyA9IDA7ICAgLy8gcGFkIHdpdGggemVyb2VzCi0gIGtGbHVzaChidyk7Ci0gIHJldHVybiBidy0+YnVmXzsKLX0KLQotaW50IFZQOEJpdFdyaXRlckFwcGVuZChWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgewotICBTQl9EQ0hFQ0soZGF0YSk7Ci0gIGlmIChidy0+bmJfYml0c18gIT0gLTgpIHJldHVybiAwOyAgIC8vIGtGbHVzaCgpIG11c3QgaGF2ZSBiZWVuIGNhbGxlZAotICBpZiAoIUJpdFdyaXRlclJlc2l6ZShidywgc2l6ZSkpIHJldHVybiAwOwotICBTYk1lbW9yeUNvcHkoYnctPmJ1Zl8gKyBidy0+cG9zXywgZGF0YSwgc2l6ZSk7Ci0gIGJ3LT5wb3NfICs9IHNpemU7Ci0gIHJldHVybiAxOwotfQotCi12b2lkIFZQOEJpdFdyaXRlcldpcGVPdXQoVlA4Qml0V3JpdGVyKiBjb25zdCBidykgewotICBpZiAoYncpIHsKLSAgICBTYk1lbW9yeURlYWxsb2NhdGUoYnctPmJ1Zl8pOwotICAgIFNiTWVtb3J5U2V0KGJ3LCAwLCBzaXplb2YoKmJ3KSk7Ci0gIH0KLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFZQOExCaXRXcml0ZXIKLQotLy8gUmV0dXJucyAxIG9uIHN1Y2Nlc3MuCi1zdGF0aWMgaW50IFZQOExCaXRXcml0ZXJSZXNpemUoVlA4TEJpdFdyaXRlciogY29uc3QgYncsIHNpemVfdCBleHRyYV9zaXplKSB7Ci0gIHVpbnQ4X3QqIGFsbG9jYXRlZF9idWY7Ci0gIHNpemVfdCBhbGxvY2F0ZWRfc2l6ZTsKLSAgY29uc3Qgc2l6ZV90IGN1cnJlbnRfc2l6ZSA9IFZQOExCaXRXcml0ZXJOdW1CeXRlcyhidyk7Ci0gIGNvbnN0IHVpbnQ2NF90IHNpemVfcmVxdWlyZWRfNjRiID0gKHVpbnQ2NF90KWN1cnJlbnRfc2l6ZSArIGV4dHJhX3NpemU7Ci0gIGNvbnN0IHNpemVfdCBzaXplX3JlcXVpcmVkID0gKHNpemVfdClzaXplX3JlcXVpcmVkXzY0YjsKLSAgaWYgKHNpemVfcmVxdWlyZWQgIT0gc2l6ZV9yZXF1aXJlZF82NGIpIHsKLSAgICBidy0+ZXJyb3JfID0gMTsKLSAgICByZXR1cm4gMDsKLSAgfQotICBpZiAoYnctPm1heF9ieXRlc18gPiAwICYmIHNpemVfcmVxdWlyZWQgPD0gYnctPm1heF9ieXRlc18pIHJldHVybiAxOwotICBhbGxvY2F0ZWRfc2l6ZSA9ICgzICogYnctPm1heF9ieXRlc18pID4+IDE7Ci0gIGlmIChhbGxvY2F0ZWRfc2l6ZSA8IHNpemVfcmVxdWlyZWQpIGFsbG9jYXRlZF9zaXplID0gc2l6ZV9yZXF1aXJlZDsKLSAgLy8gbWFrZSBhbGxvY2F0ZWQgc2l6ZSBtdWx0aXBsZSBvZiAxawotICBhbGxvY2F0ZWRfc2l6ZSA9ICgoKGFsbG9jYXRlZF9zaXplID4+IDEwKSArIDEpIDw8IDEwKTsKLSAgYWxsb2NhdGVkX2J1ZiA9ICh1aW50OF90KilTYk1lbW9yeUFsbG9jYXRlKGFsbG9jYXRlZF9zaXplKTsKLSAgaWYgKGFsbG9jYXRlZF9idWYgPT0gTlVMTCkgewotICAgIGJ3LT5lcnJvcl8gPSAxOwotICAgIHJldHVybiAwOwotICB9Ci0gIFNiTWVtb3J5Q29weShhbGxvY2F0ZWRfYnVmLCBidy0+YnVmXywgY3VycmVudF9zaXplKTsKLSAgU2JNZW1vcnlEZWFsbG9jYXRlKGJ3LT5idWZfKTsKLSAgYnctPmJ1Zl8gPSBhbGxvY2F0ZWRfYnVmOwotICBidy0+bWF4X2J5dGVzXyA9IGFsbG9jYXRlZF9zaXplOwotICBTYk1lbW9yeVNldChhbGxvY2F0ZWRfYnVmICsgY3VycmVudF9zaXplLCAwLCBhbGxvY2F0ZWRfc2l6ZSAtIGN1cnJlbnRfc2l6ZSk7Ci0gIHJldHVybiAxOwotfQotCi1pbnQgVlA4TEJpdFdyaXRlckluaXQoVlA4TEJpdFdyaXRlciogY29uc3QgYncsIHNpemVfdCBleHBlY3RlZF9zaXplKSB7Ci0gIFNiTWVtb3J5U2V0KGJ3LCAwLCBzaXplb2YoKmJ3KSk7Ci0gIHJldHVybiBWUDhMQml0V3JpdGVyUmVzaXplKGJ3LCBleHBlY3RlZF9zaXplKTsKLX0KLQotdm9pZCBWUDhMQml0V3JpdGVyRGVzdHJveShWUDhMQml0V3JpdGVyKiBjb25zdCBidykgewotICBpZiAoYncgIT0gTlVMTCkgewotICAgIFNiTWVtb3J5RGVhbGxvY2F0ZShidy0+YnVmXyk7Ci0gICAgU2JNZW1vcnlTZXQoYncsIDAsIHNpemVvZigqYncpKTsKLSAgfQotfQotCi12b2lkIFZQOExXcml0ZUJpdHMoVlA4TEJpdFdyaXRlciogY29uc3QgYncsIGludCBuX2JpdHMsIHVpbnQzMl90IGJpdHMpIHsKLSAgaWYgKG5fYml0cyA8IDEpIHJldHVybjsKLSNpZiAhZGVmaW5lZChfX0JJR19FTkRJQU5fXykKLSAgLy8gVGVjaG5pY2FsbHksIHRoaXMgYnJhbmNoIG9mIHRoZSBjb2RlIGNhbiB3cml0ZSB1cCB0byAyNSBiaXRzIGF0IGEgdGltZSwKLSAgLy8gYnV0IGluIHByZWZpeCBlbmNvZGluZywgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJpdHMgd3JpdHRlbiBpcyAxOCBhdCBhIHRpbWUuCi0gIHsKLSAgICB1aW50OF90KiBjb25zdCBwID0gJmJ3LT5idWZfW2J3LT5iaXRfcG9zXyA+PiAzXTsKLSAgICB1aW50MzJfdCB2ID0gKihjb25zdCB1aW50MzJfdCopcDsKLSAgICB2IHw9IGJpdHMgPDwgKGJ3LT5iaXRfcG9zXyAmIDcpOwotICAgICoodWludDMyX3QqKXAgPSB2OwotICAgIGJ3LT5iaXRfcG9zXyArPSBuX2JpdHM7Ci0gIH0KLSNlbHNlICAvLyBCSUdfRU5ESUFOCi0gIHsKLSAgICB1aW50OF90KiBwID0gJmJ3LT5idWZfW2J3LT5iaXRfcG9zXyA+PiAzXTsKLSAgICBjb25zdCBpbnQgYml0c19yZXNlcnZlZF9pbl9maXJzdF9ieXRlID0gYnctPmJpdF9wb3NfICYgNzsKLSAgICBjb25zdCBpbnQgYml0c19sZWZ0X3RvX3dyaXRlID0gbl9iaXRzIC0gOCArIGJpdHNfcmVzZXJ2ZWRfaW5fZmlyc3RfYnl0ZTsKLSAgICAvLyBpbXBsaWNpdCAmIDB4ZmYgaXMgYXNzdW1lZCBmb3IgdWludDhfdCBhcml0aG1ldGljcwotICAgICpwKysgfD0gYml0cyA8PCBiaXRzX3Jlc2VydmVkX2luX2ZpcnN0X2J5dGU7Ci0gICAgYml0cyA+Pj0gOCAtIGJpdHNfcmVzZXJ2ZWRfaW5fZmlyc3RfYnl0ZTsKLSAgICBpZiAoYml0c19sZWZ0X3RvX3dyaXRlID49IDEpIHsKLSAgICAgICpwKysgPSBiaXRzOwotICAgICAgYml0cyA+Pj0gODsKLSAgICAgIGlmIChiaXRzX2xlZnRfdG9fd3JpdGUgPj0gOSkgewotICAgICAgICAqcCsrID0gYml0czsKLSAgICAgICAgYml0cyA+Pj0gODsKLSAgICAgIH0KLSAgICB9Ci0gICAgU0JfRENIRUNLKG5fYml0cyA8PSAyNSk7Ci0gICAgKnAgPSBiaXRzOwotICAgIGJ3LT5iaXRfcG9zXyArPSBuX2JpdHM7Ci0gIH0KLSNlbmRpZgotICBpZiAoKGJ3LT5iaXRfcG9zXyA+PiAzKSA+IChidy0+bWF4X2J5dGVzXyAtIDgpKSB7Ci0gICAgY29uc3QgdWludDY0X3QgZXh0cmFfc2l6ZSA9IDMyNzY4VUxMICsgYnctPm1heF9ieXRlc187Ci0gICAgaWYgKGV4dHJhX3NpemUgIT0gKHNpemVfdClleHRyYV9zaXplIHx8Ci0gICAgICAgICFWUDhMQml0V3JpdGVyUmVzaXplKGJ3LCAoc2l6ZV90KWV4dHJhX3NpemUpKSB7Ci0gICAgICBidy0+Yml0X3Bvc18gPSAwOwotICAgICAgYnctPmVycm9yXyA9IDE7Ci0gICAgfQotICB9Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvYml0X3dyaXRlci5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvYml0X3dyaXRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmIwOTVjLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL2JpdF93cml0ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gQml0IHdyaXRpbmcgYW5kIGJvb2xlYW4gY29kZXIKLS8vCi0vLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQotCi0jaWZuZGVmIFdFQlBfVVRJTFNfQklUX1dSSVRFUl9IXwotI2RlZmluZSBXRUJQX1VUSUxTX0JJVF9XUklURVJfSF8KLQotI2luY2x1ZGUgIi4uL3dlYnAvdHlwZXMuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBCaXQtd3JpdGluZwotCi10eXBlZGVmIHN0cnVjdCBWUDhCaXRXcml0ZXIgVlA4Qml0V3JpdGVyOwotc3RydWN0IFZQOEJpdFdyaXRlciB7Ci0gIGludDMyX3QgIHJhbmdlXzsgICAgICAvLyByYW5nZS0xCi0gIGludDMyX3QgIHZhbHVlXzsKLSAgaW50ICAgICAgcnVuXzsgICAgICAgIC8vIG51bWJlciBvZiBvdXRzdGFuZGluZyBiaXRzCi0gIGludCAgICAgIG5iX2JpdHNfOyAgICAvLyBudW1iZXIgb2YgcGVuZGluZyBiaXRzCi0gIHVpbnQ4X3QqIGJ1Zl87ICAgICAgICAvLyBpbnRlcm5hbCBidWZmZXIuIFJlLWFsbG9jYXRlZCByZWd1bGFybHkuIE5vdCBvd25lZC4KLSAgc2l6ZV90ICAgcG9zXzsKLSAgc2l6ZV90ICAgbWF4X3Bvc187Ci0gIGludCAgICAgIGVycm9yXzsgICAgICAvLyB0cnVlIGluIGNhc2Ugb2YgZXJyb3IKLX07Ci0KLS8vIEluaXRpYWxpemUgdGhlIG9iamVjdC4gQWxsb2NhdGVzIHNvbWUgaW5pdGlhbCBtZW1vcnkgYmFzZWQgb24gZXhwZWN0ZWRfc2l6ZS4KLWludCBWUDhCaXRXcml0ZXJJbml0KFZQOEJpdFdyaXRlciogY29uc3QgYncsIHNpemVfdCBleHBlY3RlZF9zaXplKTsKLS8vIEZpbmFsaXplIHRoZSBiaXRzdHJlYW0gY29kaW5nLiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgaW50ZXJuYWwgYnVmZmVyLgotdWludDhfdCogVlA4Qml0V3JpdGVyRmluaXNoKFZQOEJpdFdyaXRlciogY29uc3QgYncpOwotLy8gUmVsZWFzZSBhbnkgcGVuZGluZyBtZW1vcnkgYW5kIHplcm9lcyB0aGUgb2JqZWN0LiBOb3QgYSBtYW5kYXRvcnkgY2FsbC4KLS8vIE9ubHkgdXNlZnVsIGluIGNhc2Ugb2YgZXJyb3IsIHdoZW4gdGhlIGludGVybmFsIGJ1ZmZlciBoYXNuJ3QgYmVlbiBncmFiYmVkIQotdm9pZCBWUDhCaXRXcml0ZXJXaXBlT3V0KFZQOEJpdFdyaXRlciogY29uc3QgYncpOwotCi1pbnQgVlA4UHV0Qml0KFZQOEJpdFdyaXRlciogY29uc3QgYncsIGludCBiaXQsIGludCBwcm9iKTsKLWludCBWUDhQdXRCaXRVbmlmb3JtKFZQOEJpdFdyaXRlciogY29uc3QgYncsIGludCBiaXQpOwotdm9pZCBWUDhQdXRWYWx1ZShWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LCBpbnQgdmFsdWUsIGludCBuYl9iaXRzKTsKLXZvaWQgVlA4UHV0U2lnbmVkVmFsdWUoVlA4Qml0V3JpdGVyKiBjb25zdCBidywgaW50IHZhbHVlLCBpbnQgbmJfYml0cyk7Ci0KLS8vIEFwcGVuZHMgc29tZSBieXRlcyB0byB0aGUgaW50ZXJuYWwgYnVmZmVyLiBEYXRhIGlzIGNvcGllZC4KLWludCBWUDhCaXRXcml0ZXJBcHBlbmQoVlA4Qml0V3JpdGVyKiBjb25zdCBidywKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpOwotCi0vLyByZXR1cm4gYXBwcm94aW1hdGUgd3JpdGUgcG9zaXRpb24gKGluIGJpdHMpCi1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDY0X3QgVlA4Qml0V3JpdGVyUG9zKGNvbnN0IFZQOEJpdFdyaXRlciogY29uc3QgYncpIHsKLSAgcmV0dXJuICh1aW50NjRfdCkoYnctPnBvc18gKyBidy0+cnVuXykgKiA4ICsgOCArIGJ3LT5uYl9iaXRzXzsKLX0KLQotLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGludGVybmFsIGJ1ZmZlci4KLXN0YXRpYyBXRUJQX0lOTElORSB1aW50OF90KiBWUDhCaXRXcml0ZXJCdWYoY29uc3QgVlA4Qml0V3JpdGVyKiBjb25zdCBidykgewotICByZXR1cm4gYnctPmJ1Zl87Ci19Ci0vLyBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBpbnRlcm5hbCBidWZmZXIuCi1zdGF0aWMgV0VCUF9JTkxJTkUgc2l6ZV90IFZQOEJpdFdyaXRlclNpemUoY29uc3QgVlA4Qml0V3JpdGVyKiBjb25zdCBidykgewotICByZXR1cm4gYnctPnBvc187Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBWUDhMQml0V3JpdGVyCi0vLyBUT0RPKHZpa2FzYSk6IFZQOExCaXRXcml0ZXIgaXMgY29waWVkIGFzLWlzIGZyb20gbG9zc2xlc3MgY29kZS4gVGhlcmUncyBzY29wZQotLy8gb2YgcmUtdXNpbmcgVlA4Qml0V3JpdGVyLiBXaWxsIGV2YWx1YXRlIG9uY2UgYmFzaWMgbG9zc2xlc3MgZW5jb2RlciBpcwotLy8gaW1wbGVtZW50ZWQuCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCogYnVmXzsKLSAgc2l6ZV90IGJpdF9wb3NfOwotICBzaXplX3QgbWF4X2J5dGVzXzsKLQotICAvLyBBZnRlciBhbGwgYml0cyBhcmUgd3JpdHRlbiwgdGhlIGNhbGxlciBtdXN0IG9ic2VydmUgdGhlIHN0YXRlIG9mCi0gIC8vIGVycm9yXy4gQSB2YWx1ZSBvZiAxIGluZGljYXRlcyB0aGF0IGEgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZQotICAvLyBoYXMgaGFwcGVuZWQgZHVyaW5nIGJpdCB3cml0aW5nLiBBIHZhbHVlIG9mIDAgaW5kaWNhdGVzIHN1Y2Nlc3NmdWwKLSAgLy8gd3JpdGluZyBvZiBiaXRzLgotICBpbnQgZXJyb3JfOwotfSBWUDhMQml0V3JpdGVyOwotCi1zdGF0aWMgV0VCUF9JTkxJTkUgc2l6ZV90IFZQOExCaXRXcml0ZXJOdW1CeXRlcyhWUDhMQml0V3JpdGVyKiBjb25zdCBidykgewotICByZXR1cm4gKGJ3LT5iaXRfcG9zXyArIDcpID4+IDM7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB1aW50OF90KiBWUDhMQml0V3JpdGVyRmluaXNoKFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3KSB7Ci0gIHJldHVybiBidy0+YnVmXzsKLX0KLQotLy8gUmV0dXJucyAwIGluIGNhc2Ugb2YgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IuCi1pbnQgVlA4TEJpdFdyaXRlckluaXQoVlA4TEJpdFdyaXRlciogY29uc3QgYncsIHNpemVfdCBleHBlY3RlZF9zaXplKTsKLQotdm9pZCBWUDhMQml0V3JpdGVyRGVzdHJveShWUDhMQml0V3JpdGVyKiBjb25zdCBidyk7Ci0KLS8vIFRoaXMgZnVuY3Rpb24gd3JpdGVzIGJpdHMgaW50byBieXRlcyBpbiBpbmNyZWFzaW5nIGFkZHJlc3NlcywgYW5kIHdpdGhpbgotLy8gYSBieXRlIGxlYXN0LXNpZ25pZmljYW50LWJpdCBmaXJzdC4KLS8vCi0vLyBUaGUgZnVuY3Rpb24gY2FuIHdyaXRlIHVwIHRvIDE2IGJpdHMgaW4gb25lIGdvIHdpdGggV3JpdGVCaXRzCi0vLyBFeGFtcGxlOiBsZXQncyBhc3N1bWUgdGhhdCAzIGJpdHMgKFJzIGJlbG93KSBoYXZlIGJlZW4gd3JpdHRlbiBhbHJlYWR5OgotLy8KLS8vIEJZVEUtMCAgICAgQllURSsxICAgICAgIEJZVEUrMgotLy8KLS8vIDAwMDAgMFJSUiAgICAwMDAwIDAwMDAgICAgMDAwMCAwMDAwCi0vLwotLy8gTm93LCB3ZSBjb3VsZCB3cml0ZSA1IG9yIGxlc3MgYml0cyBpbiBNU0IgYnkganVzdCBzaWZ0aW5nIGJ5IDMKLS8vIGFuZCBPUidpbmcgdG8gQllURS0wLgotLy8KLS8vIEZvciBuIGJpdHMsIHdlIHRha2UgdGhlIGxhc3QgNSBieXRlcywgT1IgdGhhdCB3aXRoIGhpZ2ggYml0cyBpbiBCWVRFLTAsCi0vLyBhbmQgbG9jYXRlIHRoZSByZXN0IGluIEJZVEUrMSBhbmQgQllURSsyLgotLy8KLS8vIFZQOExCaXRXcml0ZXIncyBlcnJvcl8gZmxhZyBpcyBzZXQgaW4gY2FzZSBvZiAgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IuCi12b2lkIFZQOExXcml0ZUJpdHMoVlA4TEJpdFdyaXRlciogY29uc3QgYncsIGludCBuX2JpdHMsIHVpbnQzMl90IGJpdHMpOwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKLQotI2VuZGlmICAvKiBXRUJQX1VUSUxTX0JJVF9XUklURVJfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL2NvbG9yX2NhY2hlLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy9jb2xvcl9jYWNoZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWEwZDJhLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL2NvbG9yX2NhY2hlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gQ29sb3IgQ2FjaGUgZm9yIFdlYlAgTG9zc2xlc3MKLS8vCi0vLyBBdXRob3I6IEp5cmtpIEFsYWt1aWphbGEgKGp5cmtpQGdvb2dsZS5jb20pCi0KLSNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgotI2Vsc2UKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiLi9jb2xvcl9jYWNoZS5oIgotI2luY2x1ZGUgIi4uL3V0aWxzL3V0aWxzLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVlA4TENvbG9yQ2FjaGUuCi0KLWludCBWUDhMQ29sb3JDYWNoZUluaXQoVlA4TENvbG9yQ2FjaGUqIGNvbnN0IGNjLCBpbnQgaGFzaF9iaXRzKSB7Ci0gIGNvbnN0IGludCBoYXNoX3NpemUgPSAxIDw8IGhhc2hfYml0czsKLSAgU0JfRENIRUNLKGNjICE9IE5VTEwpOwotICBTQl9EQ0hFQ0soaGFzaF9iaXRzID4gMCk7Ci0gIGNjLT5jb2xvcnNfID0gKHVpbnQzMl90KilXZWJQU2FmZUNhbGxvYygodWludDY0X3QpaGFzaF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpjYy0+Y29sb3JzXykpOwotICBpZiAoY2MtPmNvbG9yc18gPT0gTlVMTCkgcmV0dXJuIDA7Ci0gIGNjLT5oYXNoX3NoaWZ0XyA9IDMyIC0gaGFzaF9iaXRzOwotICByZXR1cm4gMTsKLX0KLQotdm9pZCBWUDhMQ29sb3JDYWNoZUNsZWFyKFZQOExDb2xvckNhY2hlKiBjb25zdCBjYykgewotICBpZiAoY2MgIT0gTlVMTCkgewotICAgIFNiTWVtb3J5RGVhbGxvY2F0ZShjYy0+Y29sb3JzXyk7Ci0gICAgY2MtPmNvbG9yc18gPSBOVUxMOwotICB9Ci19Ci0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL2NvbG9yX2NhY2hlLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy9jb2xvcl9jYWNoZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODc2YmQ0Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL2NvbG9yX2NhY2hlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gQ29sb3IgQ2FjaGUgZm9yIFdlYlAgTG9zc2xlc3MKLS8vCi0vLyBBdXRob3JzOiBKeXJraSBBbGFrdWlqYWxhIChqeXJraUBnb29nbGUuY29tKQotLy8gICAgICAgICAgVXJ2YW5nIEpvc2hpICh1cnZhbmdAZ29vZ2xlLmNvbSkKLQotI2lmbmRlZiBXRUJQX1VUSUxTX0NPTE9SX0NBQ0hFX0hfCi0jZGVmaW5lIFdFQlBfVVRJTFNfQ09MT1JfQ0FDSEVfSF8KLQotI2luY2x1ZGUgIi4uL3dlYnAvdHlwZXMuaCIKLQotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLy8gTWFpbiBjb2xvciBjYWNoZSBzdHJ1Y3QuCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQzMl90ICpjb2xvcnNfOyAgLy8gY29sb3IgZW50cmllcwotICBpbnQgaGFzaF9zaGlmdF87ICAgIC8vIEhhc2ggc2hpZnQ6IDMyIC0gaGFzaF9iaXRzLgotfSBWUDhMQ29sb3JDYWNoZTsKLQotc3RhdGljIGNvbnN0IHVpbnQzMl90IGtIYXNoTXVsID0gMHgxZTM1YTdiZDsKLQotc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IFZQOExDb2xvckNhY2hlTG9va3VwKAotICAgIGNvbnN0IFZQOExDb2xvckNhY2hlKiBjb25zdCBjYywgdWludDMyX3Qga2V5KSB7Ci0gIFNCX0RDSEVDSyhrZXkgPD0gKH4wVSA+PiBjYy0+aGFzaF9zaGlmdF8pKTsKLSAgcmV0dXJuIGNjLT5jb2xvcnNfW2tleV07Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZQOExDb2xvckNhY2hlSW5zZXJ0KGNvbnN0IFZQOExDb2xvckNhY2hlKiBjb25zdCBjYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFyZ2IpIHsKLSAgY29uc3QgdWludDMyX3Qga2V5ID0gKGtIYXNoTXVsICogYXJnYikgPj4gY2MtPmhhc2hfc2hpZnRfOwotICBjYy0+Y29sb3JzX1trZXldID0gYXJnYjsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhMQ29sb3JDYWNoZUdldEluZGV4KGNvbnN0IFZQOExDb2xvckNhY2hlKiBjb25zdCBjYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhcmdiKSB7Ci0gIHJldHVybiAoa0hhc2hNdWwgKiBhcmdiKSA+PiBjYy0+aGFzaF9zaGlmdF87Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4TENvbG9yQ2FjaGVDb250YWlucyhjb25zdCBWUDhMQ29sb3JDYWNoZSogY29uc3QgY2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYXJnYikgewotICBjb25zdCB1aW50MzJfdCBrZXkgPSAoa0hhc2hNdWwgKiBhcmdiKSA+PiBjYy0+aGFzaF9zaGlmdF87Ci0gIHJldHVybiBjYy0+Y29sb3JzX1trZXldID09IGFyZ2I7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIEluaXRpYWxpemVzIHRoZSBjb2xvciBjYWNoZSB3aXRoICdoYXNoX2JpdHMnIGJpdHMgZm9yIHRoZSBrZXlzLgotLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIG1lbW9yeSBlcnJvci4KLWludCBWUDhMQ29sb3JDYWNoZUluaXQoVlA4TENvbG9yQ2FjaGUqIGNvbnN0IGNvbG9yX2NhY2hlLCBpbnQgaGFzaF9iaXRzKTsKLQotLy8gRGVsZXRlIHRoZSBtZW1vcnkgYXNzb2NpYXRlZCB0byBjb2xvciBjYWNoZS4KLXZvaWQgVlA4TENvbG9yQ2FjaGVDbGVhcihWUDhMQ29sb3JDYWNoZSogY29uc3QgY29sb3JfY2FjaGUpOwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfQotI2VuZGlmCi0KLSNlbmRpZiAgLy8gV0VCUF9VVElMU19DT0xPUl9DQUNIRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvZmlsdGVycy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvZmlsdGVycy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDBjNmNkLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL2ZpbHRlcnMuYworKysgL2Rldi9udWxsCkBAIC0xLDIzNiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gU3BhdGlhbCBwcmVkaWN0aW9uIHVzaW5nIHZhcmlvdXMgZmlsdGVycwotLy8KLS8vIEF1dGhvcjogVXJ2YW5nICh1cnZhbmdAZ29vZ2xlLmNvbSkKLQotI2luY2x1ZGUgIi4vZmlsdGVycy5oIgotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0ZGxpYl9wb2VtLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNlbHNlCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBIZWxwZnVsIG1hY3JvLgotCi0jIGRlZmluZSBTQU5JVFlfQ0hFQ0soaW4sIG91dCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIFNCX0RDSEVDSyhpbiAhPSBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIFNCX0RDSEVDSyhvdXQgIT0gTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIFNCX0RDSEVDSyh3aWR0aCA+IDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIFNCX0RDSEVDSyhoZWlnaHQgPiAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIFNCX0RDSEVDSyhzdHJpZGUgPj0gd2lkdGgpOwotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBQcmVkaWN0TGluZShjb25zdCB1aW50OF90KiBzcmMsIGNvbnN0IHVpbnQ4X3QqIHByZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBsZW5ndGgsIGludCBpbnZlcnNlKSB7Ci0gIGludCBpOwotICBpZiAoaW52ZXJzZSkgewotICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgZHN0W2ldID0gc3JjW2ldICsgcHJlZFtpXTsKLSAgfSBlbHNlIHsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIGRzdFtpXSA9IHNyY1tpXSAtIHByZWRbaV07Ci0gIH0KLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEhvcml6b250YWwgZmlsdGVyLgotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEb0hvcml6b250YWxGaWx0ZXIoY29uc3QgdWludDhfdCogaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnZlcnNlLCB1aW50OF90KiBvdXQpIHsKLSAgaW50IGg7Ci0gIGNvbnN0IHVpbnQ4X3QqIHByZWRzID0gKGludmVyc2UgPyBvdXQgOiBpbik7Ci0gIFNBTklUWV9DSEVDSyhpbiwgb3V0KTsKLQotICAvLyBGaWx0ZXIgbGluZS1ieS1saW5lLgotICBmb3IgKGggPSAwOyBoIDwgaGVpZ2h0OyArK2gpIHsKLSAgICAvLyBMZWZ0bW9zdCBwaXhlbCBpcyBwcmVkaWN0ZWQgZnJvbSBhYm92ZSAoZXhjZXB0IGZvciB0b3Btb3N0IHNjYW5saW5lKS4KLSAgICBpZiAoaCA9PSAwKSB7Ci0gICAgICBvdXRbMF0gPSBpblswXTsKLSAgICB9IGVsc2UgewotICAgICAgUHJlZGljdExpbmUoaW4sIHByZWRzIC0gc3RyaWRlLCBvdXQsIDEsIGludmVyc2UpOwotICAgIH0KLSAgICBQcmVkaWN0TGluZShpbiArIDEsIHByZWRzLCBvdXQgKyAxLCB3aWR0aCAtIDEsIGludmVyc2UpOwotICAgIHByZWRzICs9IHN0cmlkZTsKLSAgICBpbiArPSBzdHJpZGU7Ci0gICAgb3V0ICs9IHN0cmlkZTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBIb3Jpem9udGFsRmlsdGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgdWludDhfdCogZmlsdGVyZWRfZGF0YSkgewotICBEb0hvcml6b250YWxGaWx0ZXIoZGF0YSwgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCAwLCBmaWx0ZXJlZF9kYXRhKTsKLX0KLQotc3RhdGljIHZvaWQgSG9yaXpvbnRhbFVuZmlsdGVyKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkYXRhKSB7Ci0gIERvSG9yaXpvbnRhbEZpbHRlcihkYXRhLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIDEsIGRhdGEpOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVmVydGljYWwgZmlsdGVyLgotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEb1ZlcnRpY2FsRmlsdGVyKGNvbnN0IHVpbnQ4X3QqIGluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnZlcnNlLCB1aW50OF90KiBvdXQpIHsKLSAgaW50IGg7Ci0gIGNvbnN0IHVpbnQ4X3QqIHByZWRzID0gKGludmVyc2UgPyBvdXQgOiBpbik7Ci0gIFNBTklUWV9DSEVDSyhpbiwgb3V0KTsKLQotICAvLyBWZXJ5IGZpcnN0IHRvcC1sZWZ0IHBpeGVsIGlzIGNvcGllZC4KLSAgb3V0WzBdID0gaW5bMF07Ci0gIC8vIFJlc3Qgb2YgdG9wIHNjYW4tbGluZSBpcyBsZWZ0LXByZWRpY3RlZC4KLSAgUHJlZGljdExpbmUoaW4gKyAxLCBwcmVkcywgb3V0ICsgMSwgd2lkdGggLSAxLCBpbnZlcnNlKTsKLQotICAvLyBGaWx0ZXIgbGluZS1ieS1saW5lLgotICBmb3IgKGggPSAxOyBoIDwgaGVpZ2h0OyArK2gpIHsKLSAgICBpbiArPSBzdHJpZGU7Ci0gICAgb3V0ICs9IHN0cmlkZTsKLSAgICBQcmVkaWN0TGluZShpbiwgcHJlZHMsIG91dCwgd2lkdGgsIGludmVyc2UpOwotICAgIHByZWRzICs9IHN0cmlkZTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBWZXJ0aWNhbEZpbHRlcihjb25zdCB1aW50OF90KiBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCB1aW50OF90KiBmaWx0ZXJlZF9kYXRhKSB7Ci0gIERvVmVydGljYWxGaWx0ZXIoZGF0YSwgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCAwLCBmaWx0ZXJlZF9kYXRhKTsKLX0KLQotc3RhdGljIHZvaWQgVmVydGljYWxVbmZpbHRlcihpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsIHVpbnQ4X3QqIGRhdGEpIHsKLSAgRG9WZXJ0aWNhbEZpbHRlcihkYXRhLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIDEsIGRhdGEpOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gR3JhZGllbnQgZmlsdGVyLgotCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IEdyYWRpZW50UHJlZGljdG9yKHVpbnQ4X3QgYSwgdWludDhfdCBiLCB1aW50OF90IGMpIHsKLSAgY29uc3QgaW50IGcgPSBhICsgYiAtIGM7Ci0gIHJldHVybiAoKGcgJiB+MHhmZikgPT0gMCkgPyBnIDogKGcgPCAwKSA/IDAgOiAyNTU7ICAvLyBjbGlwIHRvIDhiaXQKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FCi12b2lkIERvR3JhZGllbnRGaWx0ZXIoY29uc3QgdWludDhfdCogaW4sIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgaW52ZXJzZSwgdWludDhfdCogb3V0KSB7Ci0gIGNvbnN0IHVpbnQ4X3QqIHByZWRzID0gKGludmVyc2UgPyBvdXQgOiBpbik7Ci0gIGludCBoOwotICBTQU5JVFlfQ0hFQ0soaW4sIG91dCk7Ci0KLSAgLy8gbGVmdCBwcmVkaWN0aW9uIGZvciB0b3Agc2Nhbi1saW5lCi0gIG91dFswXSA9IGluWzBdOwotICBQcmVkaWN0TGluZShpbiArIDEsIHByZWRzLCBvdXQgKyAxLCB3aWR0aCAtIDEsIGludmVyc2UpOwotCi0gIC8vIEZpbHRlciBsaW5lLWJ5LWxpbmUuCi0gIGZvciAoaCA9IDE7IGggPCBoZWlnaHQ7ICsraCkgewotICAgIGludCB3OwotICAgIHByZWRzICs9IHN0cmlkZTsKLSAgICBpbiArPSBzdHJpZGU7Ci0gICAgb3V0ICs9IHN0cmlkZTsKLSAgICAvLyBsZWZ0bW9zdCBwaXhlbDogcHJlZGljdCBmcm9tIGFib3ZlLgotICAgIFByZWRpY3RMaW5lKGluLCBwcmVkcyAtIHN0cmlkZSwgb3V0LCAxLCBpbnZlcnNlKTsKLSAgICBmb3IgKHcgPSAxOyB3IDwgd2lkdGg7ICsrdykgewotICAgICAgY29uc3QgaW50IHByZWQgPSBHcmFkaWVudFByZWRpY3RvcihwcmVkc1t3IC0gMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRzW3cgLSBzdHJpZGVdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkc1t3IC0gc3RyaWRlIC0gMV0pOwotICAgICAgb3V0W3ddID0gaW5bd10gKyAoaW52ZXJzZSA/IHByZWQgOiAtcHJlZCk7Ci0gICAgfQotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIEdyYWRpZW50RmlsdGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIHVpbnQ4X3QqIGZpbHRlcmVkX2RhdGEpIHsKLSAgRG9HcmFkaWVudEZpbHRlcihkYXRhLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIDAsIGZpbHRlcmVkX2RhdGEpOwotfQotCi1zdGF0aWMgdm9pZCBHcmFkaWVudFVuZmlsdGVyKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwgdWludDhfdCogZGF0YSkgewotICBEb0dyYWRpZW50RmlsdGVyKGRhdGEsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgMSwgZGF0YSk7Ci19Ci0KLSN1bmRlZiBTQU5JVFlfQ0hFQ0sKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFF1aWNrIGVzdGltYXRlIG9mIGEgcG90ZW50aWFsbHkgaW50ZXJlc3RpbmcgZmlsdGVyIG1vZGUgdG8gdHJ5LgotCi0jZGVmaW5lIFNNQVggMTYKLSNkZWZpbmUgU0RJRkYoYSwgYikgKGFicygoYSkgLSAoYikpID4+IDQpICAgLy8gU2NvcmluZyBkaWZmLCBpbiBbMC4uU01BWCkKLQotV0VCUF9GSUxURVJfVFlQRSBFc3RpbWF0ZUJlc3RGaWx0ZXIoY29uc3QgdWludDhfdCogZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSkgewotICBpbnQgaSwgajsKLSAgaW50IGJpbnNbV0VCUF9GSUxURVJfTEFTVF1bU01BWF07Ci0gIFNiTWVtb3J5U2V0KGJpbnMsIDAsIHNpemVvZihiaW5zKSk7Ci0KLSAgLy8gV2Ugb25seSBzYW1wbGUgZXZlcnkgb3RoZXIgcGl4ZWxzLiBUaGF0J3MgZW5vdWdoLgotICBmb3IgKGogPSAyOyBqIDwgaGVpZ2h0IC0gMTsgaiArPSAyKSB7Ci0gICAgY29uc3QgdWludDhfdCogY29uc3QgcCA9IGRhdGEgKyBqICogc3RyaWRlOwotICAgIGludCBtZWFuID0gcFswXTsKLSAgICBmb3IgKGkgPSAyOyBpIDwgd2lkdGggLSAxOyBpICs9IDIpIHsKLSAgICAgIGNvbnN0IGludCBkaWZmMCA9IFNESUZGKHBbaV0sIG1lYW4pOwotICAgICAgY29uc3QgaW50IGRpZmYxID0gU0RJRkYocFtpXSwgcFtpIC0gMV0pOwotICAgICAgY29uc3QgaW50IGRpZmYyID0gU0RJRkYocFtpXSwgcFtpIC0gd2lkdGhdKTsKLSAgICAgIGNvbnN0IGludCBncmFkX3ByZWQgPQotICAgICAgICAgIEdyYWRpZW50UHJlZGljdG9yKHBbaSAtIDFdLCBwW2kgLSB3aWR0aF0sIHBbaSAtIHdpZHRoIC0gMV0pOwotICAgICAgY29uc3QgaW50IGRpZmYzID0gU0RJRkYocFtpXSwgZ3JhZF9wcmVkKTsKLSAgICAgIGJpbnNbV0VCUF9GSUxURVJfTk9ORV1bZGlmZjBdID0gMTsKLSAgICAgIGJpbnNbV0VCUF9GSUxURVJfSE9SSVpPTlRBTF1bZGlmZjFdID0gMTsKLSAgICAgIGJpbnNbV0VCUF9GSUxURVJfVkVSVElDQUxdW2RpZmYyXSA9IDE7Ci0gICAgICBiaW5zW1dFQlBfRklMVEVSX0dSQURJRU5UXVtkaWZmM10gPSAxOwotICAgICAgbWVhbiA9ICgzICogbWVhbiArIHBbaV0gKyAyKSA+PiAyOwotICAgIH0KLSAgfQotICB7Ci0gICAgV0VCUF9GSUxURVJfVFlQRSBmaWx0ZXIsIGJlc3RfZmlsdGVyID0gV0VCUF9GSUxURVJfTk9ORTsKLSAgICBpbnQgYmVzdF9zY29yZSA9IDB4N2ZmZmZmZmY7Ci0gICAgZm9yIChmaWx0ZXIgPSBXRUJQX0ZJTFRFUl9OT05FOyBmaWx0ZXIgPCBXRUJQX0ZJTFRFUl9MQVNUOyArK2ZpbHRlcikgewotICAgICAgaW50IHNjb3JlID0gMDsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBTTUFYOyArK2kpIHsKLSAgICAgICAgaWYgKGJpbnNbZmlsdGVyXVtpXSA+IDApIHsKLSAgICAgICAgICBzY29yZSArPSBpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoc2NvcmUgPCBiZXN0X3Njb3JlKSB7Ci0gICAgICAgIGJlc3Rfc2NvcmUgPSBzY29yZTsKLSAgICAgICAgYmVzdF9maWx0ZXIgPSBmaWx0ZXI7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBiZXN0X2ZpbHRlcjsKLSAgfQotfQotCi0jdW5kZWYgU01BWAotI3VuZGVmIFNESUZGCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNvbnN0IFdlYlBGaWx0ZXJGdW5jIFdlYlBGaWx0ZXJzW1dFQlBfRklMVEVSX0xBU1RdID0gewotICBOVUxMLCAgICAgICAgICAgICAgLy8gV0VCUF9GSUxURVJfTk9ORQotICBIb3Jpem9udGFsRmlsdGVyLCAgLy8gV0VCUF9GSUxURVJfSE9SSVpPTlRBTAotICBWZXJ0aWNhbEZpbHRlciwgICAgLy8gV0VCUF9GSUxURVJfVkVSVElDQUwKLSAgR3JhZGllbnRGaWx0ZXIgICAgIC8vIFdFQlBfRklMVEVSX0dSQURJRU5UCi19OwotCi1jb25zdCBXZWJQVW5maWx0ZXJGdW5jIFdlYlBVbmZpbHRlcnNbV0VCUF9GSUxURVJfTEFTVF0gPSB7Ci0gIE5VTEwsICAgICAgICAgICAgICAgIC8vIFdFQlBfRklMVEVSX05PTkUKLSAgSG9yaXpvbnRhbFVuZmlsdGVyLCAgLy8gV0VCUF9GSUxURVJfSE9SSVpPTlRBTAotICBWZXJ0aWNhbFVuZmlsdGVyLCAgICAvLyBXRUJQX0ZJTFRFUl9WRVJUSUNBTAotICBHcmFkaWVudFVuZmlsdGVyICAgICAvLyBXRUJQX0ZJTFRFUl9HUkFESUVOVAotfTsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy9maWx0ZXJzLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy9maWx0ZXJzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNWZhMTYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvZmlsdGVycy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIFNwYXRpYWwgcHJlZGljdGlvbiB1c2luZyB2YXJpb3VzIGZpbHRlcnMKLS8vCi0vLyBBdXRob3I6IFVydmFuZyAodXJ2YW5nQGdvb2dsZS5jb20pCi0KLSNpZm5kZWYgV0VCUF9VVElMU19GSUxURVJTX0hfCi0jZGVmaW5lIFdFQlBfVVRJTFNfRklMVEVSU19IXwotCi0jaW5jbHVkZSAiLi4vd2VicC90eXBlcy5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLy8gRmlsdGVycy4KLXR5cGVkZWYgZW51bSB7Ci0gIFdFQlBfRklMVEVSX05PTkUgPSAwLAotICBXRUJQX0ZJTFRFUl9IT1JJWk9OVEFMLAotICBXRUJQX0ZJTFRFUl9WRVJUSUNBTCwKLSAgV0VCUF9GSUxURVJfR1JBRElFTlQsCi0gIFdFQlBfRklMVEVSX0xBU1QgPSBXRUJQX0ZJTFRFUl9HUkFESUVOVCArIDEsICAvLyBlbmQgbWFya2VyCi0gIFdFQlBfRklMVEVSX0JFU1QsCi0gIFdFQlBfRklMVEVSX0ZBU1QKLX0gV0VCUF9GSUxURVJfVFlQRTsKLQotdHlwZWRlZiB2b2lkICgqV2ViUEZpbHRlckZ1bmMpKGNvbnN0IHVpbnQ4X3QqIGluLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgdWludDhfdCogb3V0KTsKLXR5cGVkZWYgdm9pZCAoKldlYlBVbmZpbHRlckZ1bmMpKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRhdGEpOwotCi0vLyBGaWx0ZXIgdGhlIGdpdmVuIGRhdGEgdXNpbmcgdGhlIGdpdmVuIHByZWRpY3Rvci4KLS8vICdpbicgY29ycmVzcG9uZHMgdG8gYSAyLWRpbWVuc2lvbmFsIHBpeGVsIGFycmF5IG9mIHNpemUgKHN0cmlkZSAqIGhlaWdodCkKLS8vIGluIHJhc3RlciBvcmRlci4KLS8vICdzdHJpZGUnIGlzIG51bWJlciBvZiBieXRlcyBwZXIgc2NhbiBsaW5lICh3aXRoIHBvc3NpYmxlIHBhZGRpbmcpLgotLy8gJ291dCcgc2hvdWxkIGJlIHByZS1hbGxvY2F0ZWQuCi1leHRlcm4gY29uc3QgV2ViUEZpbHRlckZ1bmMgV2ViUEZpbHRlcnNbV0VCUF9GSUxURVJfTEFTVF07Ci0KLS8vIEluLXBsYWNlIHJlY29uc3RydWN0IHRoZSBvcmlnaW5hbCBkYXRhIGZyb20gdGhlIGdpdmVuIGZpbHRlcmVkIGRhdGEuCi1leHRlcm4gY29uc3QgV2ViUFVuZmlsdGVyRnVuYyBXZWJQVW5maWx0ZXJzW1dFQlBfRklMVEVSX0xBU1RdOwotCi0vLyBGYXN0IGVzdGltYXRlIG9mIGEgcG90ZW50aWFsbHkgZ29vZCBmaWx0ZXIuCi1leHRlcm4gV0VCUF9GSUxURVJfVFlQRSBFc3RpbWF0ZUJlc3RGaWx0ZXIoY29uc3QgdWludDhfdCogZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUpOwotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKLQotI2VuZGlmICAvKiBXRUJQX1VUSUxTX0ZJTFRFUlNfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL2h1ZmZtYW4uYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL2h1ZmZtYW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZiODgzZi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy9odWZmbWFuLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIFV0aWxpdGllcyBmb3IgYnVpbGRpbmcgYW5kIGxvb2tpbmcgdXAgSHVmZm1hbiB0cmVlcy4KLS8vCi0vLyBBdXRob3I6IFVydmFuZyBKb3NoaSAodXJ2YW5nQGdvb2dsZS5jb20pCi0KLSNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgotI2Vsc2UKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiLi9odWZmbWFuLmgiCi0jaW5jbHVkZSAiLi4vdXRpbHMvdXRpbHMuaCIKLSNpbmNsdWRlICIuLi93ZWJwL2Zvcm1hdF9jb25zdGFudHMuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNkZWZpbmUgTk9OX0VYSVNURU5UX1NZTUJPTCAoLTEpCi0KLXN0YXRpYyB2b2lkIFRyZWVOb2RlSW5pdChIdWZmbWFuVHJlZU5vZGUqIGNvbnN0IG5vZGUpIHsKLSAgbm9kZS0+Y2hpbGRyZW5fID0gLTE7ICAgLy8gbWVhbnM6ICd1bmFzc2lnbmVkIHNvIGZhcicKLX0KLQotc3RhdGljIGludCBOb2RlSXNFbXB0eShjb25zdCBIdWZmbWFuVHJlZU5vZGUqIGNvbnN0IG5vZGUpIHsKLSAgcmV0dXJuIChub2RlLT5jaGlsZHJlbl8gPCAwKTsKLX0KLQotc3RhdGljIGludCBJc0Z1bGwoY29uc3QgSHVmZm1hblRyZWUqIGNvbnN0IHRyZWUpIHsKLSAgcmV0dXJuICh0cmVlLT5udW1fbm9kZXNfID09IHRyZWUtPm1heF9ub2Rlc18pOwotfQotCi1zdGF0aWMgdm9pZCBBc3NpZ25DaGlsZHJlbihIdWZmbWFuVHJlZSogY29uc3QgdHJlZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UcmVlTm9kZSogY29uc3Qgbm9kZSkgewotICBIdWZmbWFuVHJlZU5vZGUqIGNvbnN0IGNoaWxkcmVuID0gdHJlZS0+cm9vdF8gKyB0cmVlLT5udW1fbm9kZXNfOwotICBub2RlLT5jaGlsZHJlbl8gPSAoaW50KShjaGlsZHJlbiAtIG5vZGUpOwotICBTQl9EQ0hFQ0soY2hpbGRyZW4gLSBub2RlID09IChpbnQpKGNoaWxkcmVuIC0gbm9kZSkpOwotICB0cmVlLT5udW1fbm9kZXNfICs9IDI7Ci0gIFRyZWVOb2RlSW5pdChjaGlsZHJlbiArIDApOwotICBUcmVlTm9kZUluaXQoY2hpbGRyZW4gKyAxKTsKLX0KLQotc3RhdGljIGludCBUcmVlSW5pdChIdWZmbWFuVHJlZSogY29uc3QgdHJlZSwgaW50IG51bV9sZWF2ZXMpIHsKLSAgU0JfRENIRUNLKHRyZWUgIT0gTlVMTCk7Ci0gIGlmIChudW1fbGVhdmVzID09IDApIHJldHVybiAwOwotICAvLyBXZSBhbGxvY2F0ZSBtYXhpbXVtIHBvc3NpYmxlIG5vZGVzIGluIHRoZSB0cmVlIGF0IG9uY2UuCi0gIC8vIE5vdGUgdGhhdCBhIEh1ZmZtYW4gdHJlZSBpcyBhIGZ1bGwgYmluYXJ5IHRyZWU7IGFuZCBpbiBhIGZ1bGwgYmluYXJ5IHRyZWUKLSAgLy8gd2l0aCBMIGxlYXZlcywgdGhlIHRvdGFsIG51bWJlciBvZiBub2RlcyBOID0gMiAqIEwgLSAxLgotICB0cmVlLT5tYXhfbm9kZXNfID0gMiAqIG51bV9sZWF2ZXMgLSAxOwotICB0cmVlLT5yb290XyA9IChIdWZmbWFuVHJlZU5vZGUqKVdlYlBTYWZlTWFsbG9jKCh1aW50NjRfdCl0cmVlLT5tYXhfbm9kZXNfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqdHJlZS0+cm9vdF8pKTsKLSAgaWYgKHRyZWUtPnJvb3RfID09IE5VTEwpIHJldHVybiAwOwotICBUcmVlTm9kZUluaXQodHJlZS0+cm9vdF8pOyAgLy8gSW5pdGlhbGl6ZSByb290LgotICB0cmVlLT5udW1fbm9kZXNfID0gMTsKLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQgSHVmZm1hblRyZWVSZWxlYXNlKEh1ZmZtYW5UcmVlKiBjb25zdCB0cmVlKSB7Ci0gIGlmICh0cmVlICE9IE5VTEwpIHsKLSAgICBTYk1lbW9yeURlYWxsb2NhdGUodHJlZS0+cm9vdF8pOwotICAgIHRyZWUtPnJvb3RfID0gTlVMTDsKLSAgICB0cmVlLT5tYXhfbm9kZXNfID0gMDsKLSAgICB0cmVlLT5udW1fbm9kZXNfID0gMDsKLSAgfQotfQotCi1pbnQgSHVmZm1hbkNvZGVMZW5ndGhzVG9Db2Rlcyhjb25zdCBpbnQqIGNvbnN0IGNvZGVfbGVuZ3RocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2RlX2xlbmd0aHNfc2l6ZSwgaW50KiBjb25zdCBodWZmX2NvZGVzKSB7Ci0gIGludCBzeW1ib2w7Ci0gIGludCBjb2RlX2xlbjsKLSAgaW50IGNvZGVfbGVuZ3RoX2hpc3RbTUFYX0FMTE9XRURfQ09ERV9MRU5HVEggKyAxXSA9IHsgMCB9OwotICBpbnQgY3Vycl9jb2RlOwotICBpbnQgbmV4dF9jb2Rlc1tNQVhfQUxMT1dFRF9DT0RFX0xFTkdUSCArIDFdID0geyAwIH07Ci0gIGludCBtYXhfY29kZV9sZW5ndGggPSAwOwotCi0gIFNCX0RDSEVDSyhjb2RlX2xlbmd0aHMgIT0gTlVMTCk7Ci0gIFNCX0RDSEVDSyhjb2RlX2xlbmd0aHNfc2l6ZSA+IDApOwotICBTQl9EQ0hFQ0soaHVmZl9jb2RlcyAhPSBOVUxMKTsKLQotICAvLyBDYWxjdWxhdGUgbWF4IGNvZGUgbGVuZ3RoLgotICBmb3IgKHN5bWJvbCA9IDA7IHN5bWJvbCA8IGNvZGVfbGVuZ3Roc19zaXplOyArK3N5bWJvbCkgewotICAgIGlmIChjb2RlX2xlbmd0aHNbc3ltYm9sXSA+IG1heF9jb2RlX2xlbmd0aCkgewotICAgICAgbWF4X2NvZGVfbGVuZ3RoID0gY29kZV9sZW5ndGhzW3N5bWJvbF07Ci0gICAgfQotICB9Ci0gIGlmIChtYXhfY29kZV9sZW5ndGggPiBNQVhfQUxMT1dFRF9DT0RFX0xFTkdUSCkgcmV0dXJuIDA7Ci0KLSAgLy8gQ2FsY3VsYXRlIGNvZGUgbGVuZ3RoIGhpc3RvZ3JhbS4KLSAgZm9yIChzeW1ib2wgPSAwOyBzeW1ib2wgPCBjb2RlX2xlbmd0aHNfc2l6ZTsgKytzeW1ib2wpIHsKLSAgICArK2NvZGVfbGVuZ3RoX2hpc3RbY29kZV9sZW5ndGhzW3N5bWJvbF1dOwotICB9Ci0gIGNvZGVfbGVuZ3RoX2hpc3RbMF0gPSAwOwotCi0gIC8vIENhbGN1bGF0ZSB0aGUgaW5pdGlhbCB2YWx1ZXMgb2YgJ25leHRfY29kZXMnIGZvciBlYWNoIGNvZGUgbGVuZ3RoLgotICAvLyBuZXh0X2NvZGVzW2NvZGVfbGVuXSBkZW5vdGVzIHRoZSBjb2RlIHRvIGJlIGFzc2lnbmVkIHRvIHRoZSBuZXh0IHN5bWJvbAotICAvLyBvZiBjb2RlIGxlbmd0aCAnY29kZV9sZW4nLgotICBjdXJyX2NvZGUgPSAwOwotICBuZXh0X2NvZGVzWzBdID0gLTE7ICAvLyBVbnVzZWQsIGFzIGNvZGUgbGVuZ3RoID0gMCBpbXBsaWVzIGNvZGUgZG9lc24ndCBleGlzdC4KLSAgZm9yIChjb2RlX2xlbiA9IDE7IGNvZGVfbGVuIDw9IG1heF9jb2RlX2xlbmd0aDsgKytjb2RlX2xlbikgewotICAgIGN1cnJfY29kZSA9IChjdXJyX2NvZGUgKyBjb2RlX2xlbmd0aF9oaXN0W2NvZGVfbGVuIC0gMV0pIDw8IDE7Ci0gICAgbmV4dF9jb2Rlc1tjb2RlX2xlbl0gPSBjdXJyX2NvZGU7Ci0gIH0KLQotICAvLyBHZXQgc3ltYm9scy4KLSAgZm9yIChzeW1ib2wgPSAwOyBzeW1ib2wgPCBjb2RlX2xlbmd0aHNfc2l6ZTsgKytzeW1ib2wpIHsKLSAgICBpZiAoY29kZV9sZW5ndGhzW3N5bWJvbF0gPiAwKSB7Ci0gICAgICBodWZmX2NvZGVzW3N5bWJvbF0gPSBuZXh0X2NvZGVzW2NvZGVfbGVuZ3Roc1tzeW1ib2xdXSsrOwotICAgIH0gZWxzZSB7Ci0gICAgICBodWZmX2NvZGVzW3N5bWJvbF0gPSBOT05fRVhJU1RFTlRfU1lNQk9MOwotICAgIH0KLSAgfQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBUcmVlQWRkU3ltYm9sKEh1ZmZtYW5UcmVlKiBjb25zdCB0cmVlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzeW1ib2wsIGludCBjb2RlLCBpbnQgY29kZV9sZW5ndGgpIHsKLSAgSHVmZm1hblRyZWVOb2RlKiBub2RlID0gdHJlZS0+cm9vdF87Ci0gIGNvbnN0IEh1ZmZtYW5UcmVlTm9kZSogY29uc3QgbWF4X25vZGUgPSB0cmVlLT5yb290XyArIHRyZWUtPm1heF9ub2Rlc187Ci0gIHdoaWxlIChjb2RlX2xlbmd0aC0tID4gMCkgewotICAgIGlmIChub2RlID49IG1heF9ub2RlKSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKE5vZGVJc0VtcHR5KG5vZGUpKSB7Ci0gICAgICBpZiAoSXNGdWxsKHRyZWUpKSByZXR1cm4gMDsgICAgLy8gZXJyb3I6IHRvbyBtYW55IHN5bWJvbHMuCi0gICAgICBBc3NpZ25DaGlsZHJlbih0cmVlLCBub2RlKTsKLSAgICB9IGVsc2UgaWYgKEh1ZmZtYW5UcmVlTm9kZUlzTGVhZihub2RlKSkgewotICAgICAgcmV0dXJuIDA7ICAvLyBsZWFmIGlzIGFscmVhZHkgb2NjdXBpZWQuCi0gICAgfQotICAgIG5vZGUgKz0gbm9kZS0+Y2hpbGRyZW5fICsgKChjb2RlID4+IGNvZGVfbGVuZ3RoKSAmIDEpOwotICB9Ci0gIGlmIChOb2RlSXNFbXB0eShub2RlKSkgewotICAgIG5vZGUtPmNoaWxkcmVuXyA9IDA7ICAgICAgLy8gdHVybiBuZXdseSBjcmVhdGVkIG5vZGUgaW50byBhIGxlYWYuCi0gIH0gZWxzZSBpZiAoIUh1ZmZtYW5UcmVlTm9kZUlzTGVhZihub2RlKSkgewotICAgIHJldHVybiAwOyAgIC8vIHRyeWluZyB0byBhc3NpZ24gYSBzeW1ib2wgdG8gYWxyZWFkeSB1c2VkIGNvZGUuCi0gIH0KLSAgbm9kZS0+c3ltYm9sXyA9IHN5bWJvbDsgIC8vIEFkZCBzeW1ib2wgaW4gdGhpcyBub2RlLgotICByZXR1cm4gMTsKLX0KLQotaW50IEh1ZmZtYW5UcmVlQnVpbGRJbXBsaWNpdChIdWZmbWFuVHJlZSogY29uc3QgdHJlZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50KiBjb25zdCBjb2RlX2xlbmd0aHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2RlX2xlbmd0aHNfc2l6ZSkgewotICBpbnQgc3ltYm9sOwotICBpbnQgbnVtX3N5bWJvbHMgPSAwOwotICBpbnQgcm9vdF9zeW1ib2wgPSAwOwotCi0gIFNCX0RDSEVDSyh0cmVlICE9IE5VTEwpOwotICBTQl9EQ0hFQ0soY29kZV9sZW5ndGhzICE9IE5VTEwpOwotCi0gIC8vIEZpbmQgb3V0IG51bWJlciBvZiBzeW1ib2xzIGFuZCB0aGUgcm9vdCBzeW1ib2wuCi0gIGZvciAoc3ltYm9sID0gMDsgc3ltYm9sIDwgY29kZV9sZW5ndGhzX3NpemU7ICsrc3ltYm9sKSB7Ci0gICAgaWYgKGNvZGVfbGVuZ3Roc1tzeW1ib2xdID4gMCkgewotICAgICAgLy8gTm90ZTogY29kZSBsZW5ndGggPSAwIGluZGljYXRlcyBub24tZXhpc3RlbnQgc3ltYm9sLgotICAgICAgKytudW1fc3ltYm9sczsKLSAgICAgIHJvb3Rfc3ltYm9sID0gc3ltYm9sOwotICAgIH0KLSAgfQotCi0gIC8vIEluaXRpYWxpemUgdGhlIHRyZWUuIFdpbGwgZmFpbCBmb3IgbnVtX3N5bWJvbHMgPSAwCi0gIGlmICghVHJlZUluaXQodHJlZSwgbnVtX3N5bWJvbHMpKSByZXR1cm4gMDsKLQotICAvLyBCdWlsZCB0cmVlLgotICBpZiAobnVtX3N5bWJvbHMgPT0gMSkgeyAgLy8gVHJpdmlhbCBjYXNlLgotICAgIGNvbnN0IGludCBtYXhfc3ltYm9sID0gY29kZV9sZW5ndGhzX3NpemU7Ci0gICAgaWYgKHJvb3Rfc3ltYm9sIDwgMCB8fCByb290X3N5bWJvbCA+PSBtYXhfc3ltYm9sKSB7Ci0gICAgICBIdWZmbWFuVHJlZVJlbGVhc2UodHJlZSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIFRyZWVBZGRTeW1ib2wodHJlZSwgcm9vdF9zeW1ib2wsIDAsIDApOwotICB9IGVsc2UgeyAgLy8gTm9ybWFsIGNhc2UuCi0gICAgaW50IG9rID0gMDsKLQotICAgIC8vIEdldCBIdWZmbWFuIGNvZGVzIGZyb20gdGhlIGNvZGUgbGVuZ3Rocy4KLSAgICBpbnQqIGNvbnN0IGNvZGVzID0KLSAgICAgICAgKGludCopV2ViUFNhZmVNYWxsb2MoKHVpbnQ2NF90KWNvZGVfbGVuZ3Roc19zaXplLCBzaXplb2YoKmNvZGVzKSk7Ci0gICAgaWYgKGNvZGVzID09IE5VTEwpIGdvdG8gRW5kOwotCi0gICAgaWYgKCFIdWZmbWFuQ29kZUxlbmd0aHNUb0NvZGVzKGNvZGVfbGVuZ3RocywgY29kZV9sZW5ndGhzX3NpemUsIGNvZGVzKSkgewotICAgICAgZ290byBFbmQ7Ci0gICAgfQotCi0gICAgLy8gQWRkIHN5bWJvbHMgb25lLWJ5LW9uZS4KLSAgICBmb3IgKHN5bWJvbCA9IDA7IHN5bWJvbCA8IGNvZGVfbGVuZ3Roc19zaXplOyArK3N5bWJvbCkgewotICAgICAgaWYgKGNvZGVfbGVuZ3Roc1tzeW1ib2xdID4gMCkgewotICAgICAgICBpZiAoIVRyZWVBZGRTeW1ib2wodHJlZSwgc3ltYm9sLCBjb2Rlc1tzeW1ib2xdLCBjb2RlX2xlbmd0aHNbc3ltYm9sXSkpIHsKLSAgICAgICAgICBnb3RvIEVuZDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBvayA9IDE7Ci0gRW5kOgotICAgIFNiTWVtb3J5RGVhbGxvY2F0ZShjb2Rlcyk7Ci0gICAgb2sgPSBvayAmJiBJc0Z1bGwodHJlZSk7Ci0gICAgaWYgKCFvaykgSHVmZm1hblRyZWVSZWxlYXNlKHRyZWUpOwotICAgIHJldHVybiBvazsKLSAgfQotfQotCi1pbnQgSHVmZm1hblRyZWVCdWlsZEV4cGxpY2l0KEh1ZmZtYW5UcmVlKiBjb25zdCB0cmVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQqIGNvbnN0IGNvZGVfbGVuZ3RocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50KiBjb25zdCBjb2RlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50KiBjb25zdCBzeW1ib2xzLCBpbnQgbWF4X3N5bWJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9zeW1ib2xzKSB7Ci0gIGludCBvayA9IDA7Ci0gIGludCBpOwotCi0gIFNCX0RDSEVDSyh0cmVlICE9IE5VTEwpOwotICBTQl9EQ0hFQ0soY29kZV9sZW5ndGhzICE9IE5VTEwpOwotICBTQl9EQ0hFQ0soY29kZXMgIT0gTlVMTCk7Ci0gIFNCX0RDSEVDSyhzeW1ib2xzICE9IE5VTEwpOwotCi0gIC8vIEluaXRpYWxpemUgdGhlIHRyZWUuIFdpbGwgZmFpbCBpZiBudW1fc3ltYm9scyA9IDAuCi0gIGlmICghVHJlZUluaXQodHJlZSwgbnVtX3N5bWJvbHMpKSByZXR1cm4gMDsKLQotICAvLyBBZGQgc3ltYm9scyBvbmUtYnktb25lLgotICBmb3IgKGkgPSAwOyBpIDwgbnVtX3N5bWJvbHM7ICsraSkgewotICAgIGlmIChjb2Rlc1tpXSAhPSBOT05fRVhJU1RFTlRfU1lNQk9MKSB7Ci0gICAgICBpZiAoc3ltYm9sc1tpXSA8IDAgfHwgc3ltYm9sc1tpXSA+PSBtYXhfc3ltYm9sKSB7Ci0gICAgICAgIGdvdG8gRW5kOwotICAgICAgfQotICAgICAgaWYgKCFUcmVlQWRkU3ltYm9sKHRyZWUsIHN5bWJvbHNbaV0sIGNvZGVzW2ldLCBjb2RlX2xlbmd0aHNbaV0pKSB7Ci0gICAgICAgIGdvdG8gRW5kOwotICAgICAgfQotICAgIH0KLSAgfQotICBvayA9IDE7Ci0gRW5kOgotICBvayA9IG9rICYmIElzRnVsbCh0cmVlKTsKLSAgaWYgKCFvaykgSHVmZm1hblRyZWVSZWxlYXNlKHRyZWUpOwotICByZXR1cm4gb2s7Ci19Ci0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvaHVmZm1hbi5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvaHVmZm1hbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDU5YjdkLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL2h1ZmZtYW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBVdGlsaXRpZXMgZm9yIGJ1aWxkaW5nIGFuZCBsb29raW5nIHVwIEh1ZmZtYW4gdHJlZXMuCi0vLwotLy8gQXV0aG9yOiBVcnZhbmcgSm9zaGkgKHVydmFuZ0Bnb29nbGUuY29tKQotCi0jaWZuZGVmIFdFQlBfVVRJTFNfSFVGRk1BTl9IXwotI2RlZmluZSBXRUJQX1VUSUxTX0hVRkZNQU5fSF8KLQotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNlbHNlCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jZW5kaWYKLSNpbmNsdWRlICIuLi93ZWJwL3R5cGVzLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vLyBBIG5vZGUgb2YgYSBIdWZmbWFuIHRyZWUuCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGludCBzeW1ib2xfOwotICBpbnQgY2hpbGRyZW5fOyAgLy8gZGVsdGEgb2Zmc2V0IHRvIGJvdGggY2hpbGRyZW4gKGNvbnRpZ3VvdXMpIG9yIDAgaWYgbGVhZi4KLX0gSHVmZm1hblRyZWVOb2RlOwotCi0vLyBIdWZmbWFuIFRyZWUuCi10eXBlZGVmIHN0cnVjdCBIdWZmbWFuVHJlZSBIdWZmbWFuVHJlZTsKLXN0cnVjdCBIdWZmbWFuVHJlZSB7Ci0gIEh1ZmZtYW5UcmVlTm9kZSogcm9vdF87ICAgLy8gYWxsIHRoZSBub2Rlcywgc3RhcnRpbmcgYXQgcm9vdC4KLSAgaW50IG1heF9ub2Rlc187ICAgICAgICAgICAvLyBtYXggbnVtYmVyIG9mIG5vZGVzCi0gIGludCBudW1fbm9kZXNfOyAgICAgICAgICAgLy8gbnVtYmVyIG9mIGN1cnJlbnRseSBvY2N1cGllZCBub2RlcwotfTsKLQotLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBub2RlIGlzIGEgbGVhZiBvZiB0aGUgSHVmZm1hbiB0cmVlLgotc3RhdGljIFdFQlBfSU5MSU5FIGludCBIdWZmbWFuVHJlZU5vZGVJc0xlYWYoCi0gICAgY29uc3QgSHVmZm1hblRyZWVOb2RlKiBjb25zdCBub2RlKSB7Ci0gIHJldHVybiAobm9kZS0+Y2hpbGRyZW5fID09IDApOwotfQotCi0vLyBHbyBkb3duIG9uZSBsZXZlbC4gTW9zdCBjcml0aWNhbCBmdW5jdGlvbi4gJ3JpZ2h0X2NoaWxkJyBtdXN0IGJlIDAgb3IgMS4KLXN0YXRpYyBXRUJQX0lOTElORSBjb25zdCBIdWZmbWFuVHJlZU5vZGUqIEh1ZmZtYW5UcmVlTmV4dE5vZGUoCi0gICAgY29uc3QgSHVmZm1hblRyZWVOb2RlKiBub2RlLCBpbnQgcmlnaHRfY2hpbGQpIHsKLSAgcmV0dXJuIG5vZGUgKyBub2RlLT5jaGlsZHJlbl8gKyByaWdodF9jaGlsZDsKLX0KLQotLy8gUmVsZWFzZXMgdGhlIG5vZGVzIG9mIHRoZSBIdWZmbWFuIHRyZWUuCi0vLyBOb3RlOiBJdCBkb2VzIE5PVCBmcmVlICd0cmVlJyBpdHNlbGYuCi12b2lkIEh1ZmZtYW5UcmVlUmVsZWFzZShIdWZmbWFuVHJlZSogY29uc3QgdHJlZSk7Ci0KLS8vIEJ1aWxkcyBIdWZmbWFuIHRyZWUgYXNzdW1pbmcgY29kZSBsZW5ndGhzIGFyZSBpbXBsaWNpdGx5IGluIHN5bWJvbCBvcmRlci4KLS8vIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiBlcnJvciAoaW52YWxpZCB0cmVlIG9yIG1lbW9yeSBlcnJvcikuCi1pbnQgSHVmZm1hblRyZWVCdWlsZEltcGxpY2l0KEh1ZmZtYW5UcmVlKiBjb25zdCB0cmVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQqIGNvbnN0IGNvZGVfbGVuZ3RocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvZGVfbGVuZ3Roc19zaXplKTsKLQotLy8gQnVpbGQgYSBIdWZmbWFuIHRyZWUgd2l0aCBleHBsaWNpdGx5IGdpdmVuIGxpc3RzIG9mIGNvZGUgbGVuZ3RocywgY29kZXMKLS8vIGFuZCBzeW1ib2xzLiBWZXJpZmllcyB0aGF0IGFsbCBzeW1ib2xzIGFkZGVkIGFyZSBzbWFsbGVyIHRoYW4gbWF4X3N5bWJvbC4KLS8vIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiBhbiBpbnZhbGlkIHN5bWJvbCwgaW52YWxpZCB0cmVlIG9yIG1lbW9yeSBlcnJvci4KLWludCBIdWZmbWFuVHJlZUJ1aWxkRXhwbGljaXQoSHVmZm1hblRyZWUqIGNvbnN0IHRyZWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCogY29uc3QgY29kZV9sZW5ndGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQqIGNvbnN0IGNvZGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQqIGNvbnN0IHN5bWJvbHMsIGludCBtYXhfc3ltYm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3N5bWJvbHMpOwotCi0vLyBVdGlsaXR5OiBjb252ZXJ0cyBIdWZmbWFuIGNvZGUgbGVuZ3RocyB0byBjb3JyZXNwb25kaW5nIEh1ZmZtYW4gY29kZXMuCi0vLyAnaHVmZl9jb2Rlcycgc2hvdWxkIGJlIHByZS1hbGxvY2F0ZWQuCi0vLyBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgZXJyb3IgKG1lbW9yeSBhbGxvY2F0aW9uLCBpbnZhbGlkIGNvZGVzKS4KLWludCBIdWZmbWFuQ29kZUxlbmd0aHNUb0NvZGVzKGNvbnN0IGludCogY29uc3QgY29kZV9sZW5ndGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvZGVfbGVuZ3Roc19zaXplLCBpbnQqIGNvbnN0IGh1ZmZfY29kZXMpOwotCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgotCi0jZW5kaWYgIC8vIFdFQlBfVVRJTFNfSFVGRk1BTl9IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvaHVmZm1hbl9lbmNvZGUuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL2h1ZmZtYW5fZW5jb2RlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NmRkNDEuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvaHVmZm1hbl9lbmNvZGUuYworKysgL2Rldi9udWxsCkBAIC0xLDQ0NiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gQXV0aG9yOiBKeXJraSBBbGFrdWlqYWxhIChqeXJraUBnb29nbGUuY29tKQotLy8KLS8vIEVudHJvcHkgZW5jb2RpbmcgKEh1ZmZtYW4pIGZvciB3ZWJwIGxvc3NsZXNzLgotCi0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNlbHNlCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgIi4vaHVmZm1hbl9lbmNvZGUuaCIKLSNpbmNsdWRlICIuLi91dGlscy91dGlscy5oIgotI2luY2x1ZGUgIi4uL3dlYnAvZm9ybWF0X2NvbnN0YW50cy5oIgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVXRpbCBmdW5jdGlvbiB0byBvcHRpbWl6ZSB0aGUgc3ltYm9sIG1hcCBmb3IgUkxFIGNvZGluZwotCi0vLyBIZXVyaXN0aWNzIGZvciBzZWxlY3RpbmcgdGhlIHN0cmlkZSByYW5nZXMgdG8gY29sbGFwc2UuCi1zdGF0aWMgaW50IFZhbHVlc1Nob3VsZEJlQ29sbGFwc2VkVG9TdHJpZGVBdmVyYWdlKGludCBhLCBpbnQgYikgewotICByZXR1cm4gYWJzKGEgLSBiKSA8IDQ7Ci19Ci0KLS8vIENoYW5nZSB0aGUgcG9wdWxhdGlvbiBjb3VudHMgaW4gYSB3YXkgdGhhdCB0aGUgY29uc2VxdWVudAotLy8gSHVmbWFubiB0cmVlIGNvbXByZXNzaW9uLCBlc3BlY2lhbGx5IGl0cyBSTEUtcGFydCwgZ2l2ZSBzbWFsbGVyIG91dHB1dC4KLXN0YXRpYyBpbnQgT3B0aW1pemVIdWZmbWFuRm9yUmxlKGludCBsZW5ndGgsIGludCogY29uc3QgY291bnRzKSB7Ci0gIHVpbnQ4X3QqIGdvb2RfZm9yX3JsZTsKLSAgLy8gMSkgTGV0J3MgbWFrZSB0aGUgSHVmZm1hbiBjb2RlIG1vcmUgY29tcGF0aWJsZSB3aXRoIHJsZSBlbmNvZGluZy4KLSAgaW50IGk7Ci0gIGZvciAoOyBsZW5ndGggPj0gMDsgLS1sZW5ndGgpIHsKLSAgICBpZiAobGVuZ3RoID09IDApIHsKLSAgICAgIHJldHVybiAxOyAgLy8gQWxsIHplcm9zLgotICAgIH0KLSAgICBpZiAoY291bnRzW2xlbmd0aCAtIDFdICE9IDApIHsKLSAgICAgIC8vIE5vdyBjb3VudHNbMC4ubGVuZ3RoIC0gMV0gZG9lcyBub3QgaGF2ZSB0cmFpbGluZyB6ZXJvcy4KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICAvLyAyKSBMZXQncyBtYXJrIGFsbCBwb3B1bGF0aW9uIGNvdW50cyB0aGF0IGFscmVhZHkgY2FuIGJlIGVuY29kZWQKLSAgLy8gd2l0aCBhbiBybGUgY29kZS4KLSAgZ29vZF9mb3JfcmxlID0gKHVpbnQ4X3QqKVNiTWVtb3J5Q2FsbG9jKGxlbmd0aCwgMSk7Ci0gIGlmIChnb29kX2Zvcl9ybGUgPT0gTlVMTCkgewotICAgIHJldHVybiAwOwotICB9Ci0gIHsKLSAgICAvLyBMZXQncyBub3Qgc3BvaWwgYW55IG9mIHRoZSBleGlzdGluZyBnb29kIHJsZSBjb2Rlcy4KLSAgICAvLyBNYXJrIGFueSBzZXEgb2YgMCdzIHRoYXQgaXMgbG9uZ2VyIGFzIDUgYXMgYSBnb29kX2Zvcl9ybGUuCi0gICAgLy8gTWFyayBhbnkgc2VxIG9mIG5vbi0wJ3MgdGhhdCBpcyBsb25nZXIgYXMgNyBhcyBhIGdvb2RfZm9yX3JsZS4KLSAgICBpbnQgc3ltYm9sID0gY291bnRzWzBdOwotICAgIGludCBzdHJpZGUgPSAwOwotICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGggKyAxOyArK2kpIHsKLSAgICAgIGlmIChpID09IGxlbmd0aCB8fCBjb3VudHNbaV0gIT0gc3ltYm9sKSB7Ci0gICAgICAgIGlmICgoc3ltYm9sID09IDAgJiYgc3RyaWRlID49IDUpIHx8Ci0gICAgICAgICAgICAoc3ltYm9sICE9IDAgJiYgc3RyaWRlID49IDcpKSB7Ci0gICAgICAgICAgaW50IGs7Ci0gICAgICAgICAgZm9yIChrID0gMDsgayA8IHN0cmlkZTsgKytrKSB7Ci0gICAgICAgICAgICBnb29kX2Zvcl9ybGVbaSAtIGsgLSAxXSA9IDE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHN0cmlkZSA9IDE7Ci0gICAgICAgIGlmIChpICE9IGxlbmd0aCkgewotICAgICAgICAgIHN5bWJvbCA9IGNvdW50c1tpXTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgKytzdHJpZGU7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIC8vIDMpIExldCdzIHJlcGxhY2UgdGhvc2UgcG9wdWxhdGlvbiBjb3VudHMgdGhhdCBsZWFkIHRvIG1vcmUgcmxlIGNvZGVzLgotICB7Ci0gICAgaW50IHN0cmlkZSA9IDA7Ci0gICAgaW50IGxpbWl0ID0gY291bnRzWzBdOwotICAgIGludCBzdW0gPSAwOwotICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGggKyAxOyArK2kpIHsKLSAgICAgIGlmIChpID09IGxlbmd0aCB8fCBnb29kX2Zvcl9ybGVbaV0gfHwKLSAgICAgICAgICAoaSAhPSAwICYmIGdvb2RfZm9yX3JsZVtpIC0gMV0pIHx8Ci0gICAgICAgICAgIVZhbHVlc1Nob3VsZEJlQ29sbGFwc2VkVG9TdHJpZGVBdmVyYWdlKGNvdW50c1tpXSwgbGltaXQpKSB7Ci0gICAgICAgIGlmIChzdHJpZGUgPj0gNCB8fCAoc3RyaWRlID49IDMgJiYgc3VtID09IDApKSB7Ci0gICAgICAgICAgaW50IGs7Ci0gICAgICAgICAgLy8gVGhlIHN0cmlkZSBtdXN0IGVuZCwgY29sbGFwc2Ugd2hhdCB3ZSBoYXZlLCBpZiB3ZSBoYXZlIGVub3VnaCAoNCkuCi0gICAgICAgICAgaW50IGNvdW50ID0gKHN1bSArIHN0cmlkZSAvIDIpIC8gc3RyaWRlOwotICAgICAgICAgIGlmIChjb3VudCA8IDEpIHsKLSAgICAgICAgICAgIGNvdW50ID0gMTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKHN1bSA9PSAwKSB7Ci0gICAgICAgICAgICAvLyBEb24ndCBtYWtlIGFuIGFsbCB6ZXJvcyBzdHJpZGUgdG8gYmUgdXBncmFkZWQgdG8gb25lcy4KLSAgICAgICAgICAgIGNvdW50ID0gMDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZm9yIChrID0gMDsgayA8IHN0cmlkZTsgKytrKSB7Ci0gICAgICAgICAgICAvLyBXZSBkb24ndCB3YW50IHRvIGNoYW5nZSB2YWx1ZSBhdCBjb3VudHNbaV0sCi0gICAgICAgICAgICAvLyB0aGF0IGlzIGFscmVhZHkgYmVsb25naW5nIHRvIHRoZSBuZXh0IHN0cmlkZS4gVGh1cyAtIDEuCi0gICAgICAgICAgICBjb3VudHNbaSAtIGsgLSAxXSA9IGNvdW50OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzdHJpZGUgPSAwOwotICAgICAgICBzdW0gPSAwOwotICAgICAgICBpZiAoaSA8IGxlbmd0aCAtIDMpIHsKLSAgICAgICAgICAvLyBBbGwgaW50ZXJlc3Rpbmcgc3RyaWRlcyBoYXZlIGEgY291bnQgb2YgYXQgbGVhc3QgNCwKLSAgICAgICAgICAvLyBhdCBsZWFzdCB3aGVuIG5vbi16ZXJvcy4KLSAgICAgICAgICBsaW1pdCA9IChjb3VudHNbaV0gKyBjb3VudHNbaSArIDFdICsKLSAgICAgICAgICAgICAgICAgICBjb3VudHNbaSArIDJdICsgY291bnRzW2kgKyAzXSArIDIpIC8gNDsKLSAgICAgICAgfSBlbHNlIGlmIChpIDwgbGVuZ3RoKSB7Ci0gICAgICAgICAgbGltaXQgPSBjb3VudHNbaV07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgbGltaXQgPSAwOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICArK3N0cmlkZTsKLSAgICAgIGlmIChpICE9IGxlbmd0aCkgewotICAgICAgICBzdW0gKz0gY291bnRzW2ldOwotICAgICAgICBpZiAoc3RyaWRlID49IDQpIHsKLSAgICAgICAgICBsaW1pdCA9IChzdW0gKyBzdHJpZGUgLyAyKSAvIHN0cmlkZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICBTYk1lbW9yeURlYWxsb2NhdGUoZ29vZF9mb3JfcmxlKTsKLSAgcmV0dXJuIDE7Ci19Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgaW50IHRvdGFsX2NvdW50XzsKLSAgaW50IHZhbHVlXzsKLSAgaW50IHBvb2xfaW5kZXhfbGVmdF87Ci0gIGludCBwb29sX2luZGV4X3JpZ2h0XzsKLX0gSHVmZm1hblRyZWU7Ci0KLS8vIEEgY29tcGFyZXIgZnVuY3Rpb24gZm9yIHR3byBIdWZmbWFuIHRyZWVzOiBzb3J0cyBmaXJzdCBieSAndG90YWwgY291bnQnCi0vLyAobW9yZSBjb21lcyBmaXJzdCksIGFuZCB0aGVuIGJ5ICd2YWx1ZScgKG1vcmUgY29tZXMgZmlyc3QpLgotc3RhdGljIGludCBDb21wYXJlSHVmZm1hblRyZWVzKGNvbnN0IHZvaWQqIHB0cjEsIGNvbnN0IHZvaWQqIHB0cjIpIHsKLSAgY29uc3QgSHVmZm1hblRyZWUqIGNvbnN0IHQxID0gKGNvbnN0IEh1ZmZtYW5UcmVlKilwdHIxOwotICBjb25zdCBIdWZmbWFuVHJlZSogY29uc3QgdDIgPSAoY29uc3QgSHVmZm1hblRyZWUqKXB0cjI7Ci0gIGlmICh0MS0+dG90YWxfY291bnRfID4gdDItPnRvdGFsX2NvdW50XykgewotICAgIHJldHVybiAtMTsKLSAgfSBlbHNlIGlmICh0MS0+dG90YWxfY291bnRfIDwgdDItPnRvdGFsX2NvdW50XykgewotICAgIHJldHVybiAxOwotICB9IGVsc2UgewotICAgIFNCX0RDSEVDSyh0MS0+dmFsdWVfICE9IHQyLT52YWx1ZV8pOwotICAgIHJldHVybiAodDEtPnZhbHVlXyA8IHQyLT52YWx1ZV8pID8gLTEgOiAxOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIFNldEJpdERlcHRocyhjb25zdCBIdWZmbWFuVHJlZSogY29uc3QgdHJlZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBIdWZmbWFuVHJlZSogY29uc3QgcG9vbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBiaXRfZGVwdGhzLCBpbnQgbGV2ZWwpIHsKLSAgaWYgKHRyZWUtPnBvb2xfaW5kZXhfbGVmdF8gPj0gMCkgewotICAgIFNldEJpdERlcHRocygmcG9vbFt0cmVlLT5wb29sX2luZGV4X2xlZnRfXSwgcG9vbCwgYml0X2RlcHRocywgbGV2ZWwgKyAxKTsKLSAgICBTZXRCaXREZXB0aHMoJnBvb2xbdHJlZS0+cG9vbF9pbmRleF9yaWdodF9dLCBwb29sLCBiaXRfZGVwdGhzLCBsZXZlbCArIDEpOwotICB9IGVsc2UgewotICAgIGJpdF9kZXB0aHNbdHJlZS0+dmFsdWVfXSA9IGxldmVsOwotICB9Ci19Ci0KLS8vIENyZWF0ZSBhbiBvcHRpbWFsIEh1ZmZtYW4gdHJlZS4KLS8vCi0vLyAoZGF0YSxsZW5ndGgpOiBwb3B1bGF0aW9uIGNvdW50cy4KLS8vIHRyZWVfbGltaXQ6IG1heGltdW0gYml0IGRlcHRoIChpbmNsdXNpdmUpIG9mIHRoZSBjb2Rlcy4KLS8vIGJpdF9kZXB0aHNbXTogaG93IG1hbnkgYml0cyBhcmUgdXNlZCBmb3IgdGhlIHN5bWJvbC4KLS8vCi0vLyBSZXR1cm5zIDAgd2hlbiBhbiBlcnJvciBoYXMgb2NjdXJyZWQuCi0vLwotLy8gVGhlIGNhdGNoIGhlcmUgaXMgdGhhdCB0aGUgdHJlZSBjYW5ub3QgYmUgYXJiaXRyYXJpbHkgZGVlcAotLy8KLS8vIGNvdW50X2xpbWl0IGlzIHRoZSB2YWx1ZSB0aGF0IGlzIHRvIGJlIGZha2VkIGFzIHRoZSBtaW5pbXVtIHZhbHVlCi0vLyBhbmQgdGhpcyBtaW5pbXVtIHZhbHVlIGlzIHJhaXNlZCB1bnRpbCB0aGUgdHJlZSBtYXRjaGVzIHRoZQotLy8gbWF4aW11bSBsZW5ndGggcmVxdWlyZW1lbnQuCi0vLwotLy8gVGhpcyBhbGdvcml0aG0gaXMgbm90IG9mIGV4Y2VsbGVudCBwZXJmb3JtYW5jZSBmb3IgdmVyeSBsb25nIGRhdGEgYmxvY2tzLAotLy8gZXNwZWNpYWxseSB3aGVuIHBvcHVsYXRpb24gY291bnRzIGFyZSBsb25nZXIgdGhhbiAyKip0cmVlX2xpbWl0LCBidXQKLS8vIHdlIGFyZSBub3QgcGxhbm5pbmcgdG8gdXNlIHRoaXMgd2l0aCBleHRyZW1lbHkgbG9uZyBibG9ja3MuCi0vLwotLy8gU2VlIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSHVmZm1hbl9jb2RpbmcKLXN0YXRpYyBpbnQgR2VuZXJhdGVPcHRpbWFsVHJlZShjb25zdCBpbnQqIGNvbnN0IGhpc3RvZ3JhbSwgaW50IGhpc3RvZ3JhbV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmVlX2RlcHRoX2xpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IGJpdF9kZXB0aHMpIHsKLSAgaW50IGNvdW50X21pbjsKLSAgSHVmZm1hblRyZWUqIHRyZWVfcG9vbDsKLSAgSHVmZm1hblRyZWUqIHRyZWU7Ci0gIGludCB0cmVlX3NpemVfb3JpZyA9IDA7Ci0gIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBoaXN0b2dyYW1fc2l6ZTsgKytpKSB7Ci0gICAgaWYgKGhpc3RvZ3JhbVtpXSAhPSAwKSB7Ci0gICAgICArK3RyZWVfc2l6ZV9vcmlnOwotICAgIH0KLSAgfQotCi0gIGlmICh0cmVlX3NpemVfb3JpZyA9PSAwKSB7ICAgLy8gcHJldHR5IG9wdGltYWwgYWxyZWFkeSEKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIC8vIDMgKiB0cmVlX3NpemUgaXMgZW5vdWdoIHRvIGNvdmVyIGFsbCB0aGUgbm9kZXMgcmVwcmVzZW50aW5nIGEKLSAgLy8gcG9wdWxhdGlvbiBhbmQgYWxsIHRoZSBpbnNlcnRlZCBub2RlcyBjb21iaW5pbmcgdHdvIGV4aXN0aW5nIG5vZGVzLgotICAvLyBUaGUgdHJlZSBwb29sIG5lZWRzIDIgKiAodHJlZV9zaXplX29yaWcgLSAxKSBlbnRpdGllcywgYW5kIHRoZQotICAvLyB0cmVlIG5lZWRzIGV4YWN0bHkgdHJlZV9zaXplX29yaWcgZW50aXRpZXMuCi0gIHRyZWUgPSAoSHVmZm1hblRyZWUqKVdlYlBTYWZlTWFsbG9jKDNVTEwgKiB0cmVlX3NpemVfb3JpZywgc2l6ZW9mKCp0cmVlKSk7Ci0gIGlmICh0cmVlID09IE5VTEwpIHJldHVybiAwOwotICB0cmVlX3Bvb2wgPSB0cmVlICsgdHJlZV9zaXplX29yaWc7Ci0KLSAgLy8gRm9yIGJsb2NrIHNpemVzIHdpdGggbGVzcyB0aGFuIDY0ayBzeW1ib2xzIHdlIG5ldmVyIG5lZWQgdG8gZG8gYQotICAvLyBzZWNvbmQgaXRlcmF0aW9uIG9mIHRoaXMgbG9vcC4KLSAgLy8gSWYgd2UgYWN0dWFsbHkgc3RhcnQgcnVubmluZyBpbnNpZGUgdGhpcyBsb29wIGEgbG90LCB3ZSB3b3VsZCBwZXJoYXBzCi0gIC8vIGJlIGJldHRlciBvZmYgd2l0aCB0aGUgS2F0YWphaW5lbiBhbGdvcml0aG0uCi0gIFNCX0RDSEVDSyh0cmVlX3NpemVfb3JpZyA8PSAoMSA8PCAodHJlZV9kZXB0aF9saW1pdCAtIDEpKSk7Ci0gIGZvciAoY291bnRfbWluID0gMTsgOyBjb3VudF9taW4gKj0gMikgewotICAgIGludCB0cmVlX3NpemUgPSB0cmVlX3NpemVfb3JpZzsKLSAgICAvLyBXZSBuZWVkIHRvIHBhY2sgdGhlIEh1ZmZtYW4gdHJlZSBpbiB0cmVlX2RlcHRoX2xpbWl0IGJpdHMuCi0gICAgLy8gU28sIHdlIHRyeSBieSBmYWtpbmcgaGlzdG9ncmFtIGVudHJpZXMgdG8gYmUgYXQgbGVhc3QgJ2NvdW50X21pbicuCi0gICAgaW50IGlkeCA9IDA7Ci0gICAgaW50IGo7Ci0gICAgZm9yIChqID0gMDsgaiA8IGhpc3RvZ3JhbV9zaXplOyArK2opIHsKLSAgICAgIGlmIChoaXN0b2dyYW1bal0gIT0gMCkgewotICAgICAgICBjb25zdCBpbnQgY291bnQgPQotICAgICAgICAgICAgKGhpc3RvZ3JhbVtqXSA8IGNvdW50X21pbikgPyBjb3VudF9taW4gOiBoaXN0b2dyYW1bal07Ci0gICAgICAgIHRyZWVbaWR4XS50b3RhbF9jb3VudF8gPSBjb3VudDsKLSAgICAgICAgdHJlZVtpZHhdLnZhbHVlXyA9IGo7Ci0gICAgICAgIHRyZWVbaWR4XS5wb29sX2luZGV4X2xlZnRfID0gLTE7Ci0gICAgICAgIHRyZWVbaWR4XS5wb29sX2luZGV4X3JpZ2h0XyA9IC0xOwotICAgICAgICArK2lkeDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBCdWlsZCB0aGUgSHVmZm1hbiB0cmVlLgotICAgIFNiU3lzdGVtU29ydCh0cmVlLCB0cmVlX3NpemUsIHNpemVvZigqdHJlZSksIENvbXBhcmVIdWZmbWFuVHJlZXMpOwotCi0gICAgaWYgKHRyZWVfc2l6ZSA+IDEpIHsgIC8vIE5vcm1hbCBjYXNlLgotICAgICAgaW50IHRyZWVfcG9vbF9zaXplID0gMDsKLSAgICAgIHdoaWxlICh0cmVlX3NpemUgPiAxKSB7ICAvLyBGaW5pc2ggd2hlbiB3ZSBoYXZlIG9ubHkgb25lIHJvb3QuCi0gICAgICAgIGludCBjb3VudDsKLSAgICAgICAgdHJlZV9wb29sW3RyZWVfcG9vbF9zaXplKytdID0gdHJlZVt0cmVlX3NpemUgLSAxXTsKLSAgICAgICAgdHJlZV9wb29sW3RyZWVfcG9vbF9zaXplKytdID0gdHJlZVt0cmVlX3NpemUgLSAyXTsKLSAgICAgICAgY291bnQgPSB0cmVlX3Bvb2xbdHJlZV9wb29sX3NpemUgLSAxXS50b3RhbF9jb3VudF8gKwotICAgICAgICAgICAgICAgIHRyZWVfcG9vbFt0cmVlX3Bvb2xfc2l6ZSAtIDJdLnRvdGFsX2NvdW50XzsKLSAgICAgICAgdHJlZV9zaXplIC09IDI7Ci0gICAgICAgIHsKLSAgICAgICAgICAvLyBTZWFyY2ggZm9yIHRoZSBpbnNlcnRpb24gcG9pbnQuCi0gICAgICAgICAgaW50IGs7Ci0gICAgICAgICAgZm9yIChrID0gMDsgayA8IHRyZWVfc2l6ZTsgKytrKSB7Ci0gICAgICAgICAgICBpZiAodHJlZVtrXS50b3RhbF9jb3VudF8gPD0gY291bnQpIHsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIFNiTWVtb3J5TW92ZSh0cmVlICsgKGsgKyAxKSwgdHJlZSArIGssICh0cmVlX3NpemUgLSBrKSAqIHNpemVvZigqdHJlZSkpOwotICAgICAgICAgIHRyZWVba10udG90YWxfY291bnRfID0gY291bnQ7Ci0gICAgICAgICAgdHJlZVtrXS52YWx1ZV8gPSAtMTsKLQotICAgICAgICAgIHRyZWVba10ucG9vbF9pbmRleF9sZWZ0XyA9IHRyZWVfcG9vbF9zaXplIC0gMTsKLSAgICAgICAgICB0cmVlW2tdLnBvb2xfaW5kZXhfcmlnaHRfID0gdHJlZV9wb29sX3NpemUgLSAyOwotICAgICAgICAgIHRyZWVfc2l6ZSA9IHRyZWVfc2l6ZSArIDE7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIFNldEJpdERlcHRocygmdHJlZVswXSwgdHJlZV9wb29sLCBiaXRfZGVwdGhzLCAwKTsKLSAgICB9IGVsc2UgaWYgKHRyZWVfc2l6ZSA9PSAxKSB7ICAvLyBUcml2aWFsIGNhc2U6IG9ubHkgb25lIGVsZW1lbnQuCi0gICAgICBiaXRfZGVwdGhzW3RyZWVbMF0udmFsdWVfXSA9IDE7Ci0gICAgfQotCi0gICAgewotICAgICAgLy8gVGVzdCBpZiB0aGlzIEh1ZmZtYW4gdHJlZSBzYXRpc2ZpZXMgb3VyICd0cmVlX2RlcHRoX2xpbWl0JyBjcml0ZXJpYS4KLSAgICAgIGludCBtYXhfZGVwdGggPSBiaXRfZGVwdGhzWzBdOwotICAgICAgZm9yIChqID0gMTsgaiA8IGhpc3RvZ3JhbV9zaXplOyArK2opIHsKLSAgICAgICAgaWYgKG1heF9kZXB0aCA8IGJpdF9kZXB0aHNbal0pIHsKLSAgICAgICAgICBtYXhfZGVwdGggPSBiaXRfZGVwdGhzW2pdOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAobWF4X2RlcHRoIDw9IHRyZWVfZGVwdGhfbGltaXQpIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIFNiTWVtb3J5RGVhbGxvY2F0ZSh0cmVlKTsKLSAgcmV0dXJuIDE7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb2Rpbmcgb2YgdGhlIEh1ZmZtYW4gdHJlZSB2YWx1ZXMKLQotc3RhdGljIEh1ZmZtYW5UcmVlVG9rZW4qIENvZGVSZXBlYXRlZFZhbHVlcyhpbnQgcmVwZXRpdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UcmVlVG9rZW4qIHRva2VucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlLCBpbnQgcHJldl92YWx1ZSkgewotICBTQl9EQ0hFQ0sodmFsdWUgPD0gTUFYX0FMTE9XRURfQ09ERV9MRU5HVEgpOwotICBpZiAodmFsdWUgIT0gcHJldl92YWx1ZSkgewotICAgIHRva2Vucy0+Y29kZSA9IHZhbHVlOwotICAgIHRva2Vucy0+ZXh0cmFfYml0cyA9IDA7Ci0gICAgKyt0b2tlbnM7Ci0gICAgLS1yZXBldGl0aW9uczsKLSAgfQotICB3aGlsZSAocmVwZXRpdGlvbnMgPj0gMSkgewotICAgIGlmIChyZXBldGl0aW9ucyA8IDMpIHsKLSAgICAgIGludCBpOwotICAgICAgZm9yIChpID0gMDsgaSA8IHJlcGV0aXRpb25zOyArK2kpIHsKLSAgICAgICAgdG9rZW5zLT5jb2RlID0gdmFsdWU7Ci0gICAgICAgIHRva2Vucy0+ZXh0cmFfYml0cyA9IDA7Ci0gICAgICAgICsrdG9rZW5zOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfSBlbHNlIGlmIChyZXBldGl0aW9ucyA8IDcpIHsKLSAgICAgIHRva2Vucy0+Y29kZSA9IDE2OwotICAgICAgdG9rZW5zLT5leHRyYV9iaXRzID0gcmVwZXRpdGlvbnMgLSAzOwotICAgICAgKyt0b2tlbnM7Ci0gICAgICBicmVhazsKLSAgICB9IGVsc2UgewotICAgICAgdG9rZW5zLT5jb2RlID0gMTY7Ci0gICAgICB0b2tlbnMtPmV4dHJhX2JpdHMgPSAzOwotICAgICAgKyt0b2tlbnM7Ci0gICAgICByZXBldGl0aW9ucyAtPSA2OwotICAgIH0KLSAgfQotICByZXR1cm4gdG9rZW5zOwotfQotCi1zdGF0aWMgSHVmZm1hblRyZWVUb2tlbiogQ29kZVJlcGVhdGVkWmVyb3MoaW50IHJlcGV0aXRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UcmVlVG9rZW4qIHRva2VucykgewotICB3aGlsZSAocmVwZXRpdGlvbnMgPj0gMSkgewotICAgIGlmIChyZXBldGl0aW9ucyA8IDMpIHsKLSAgICAgIGludCBpOwotICAgICAgZm9yIChpID0gMDsgaSA8IHJlcGV0aXRpb25zOyArK2kpIHsKLSAgICAgICAgdG9rZW5zLT5jb2RlID0gMDsgICAvLyAwLXZhbHVlCi0gICAgICAgIHRva2Vucy0+ZXh0cmFfYml0cyA9IDA7Ci0gICAgICAgICsrdG9rZW5zOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfSBlbHNlIGlmIChyZXBldGl0aW9ucyA8IDExKSB7Ci0gICAgICB0b2tlbnMtPmNvZGUgPSAxNzsKLSAgICAgIHRva2Vucy0+ZXh0cmFfYml0cyA9IHJlcGV0aXRpb25zIC0gMzsKLSAgICAgICsrdG9rZW5zOwotICAgICAgYnJlYWs7Ci0gICAgfSBlbHNlIGlmIChyZXBldGl0aW9ucyA8IDEzOSkgewotICAgICAgdG9rZW5zLT5jb2RlID0gMTg7Ci0gICAgICB0b2tlbnMtPmV4dHJhX2JpdHMgPSByZXBldGl0aW9ucyAtIDExOwotICAgICAgKyt0b2tlbnM7Ci0gICAgICBicmVhazsKLSAgICB9IGVsc2UgewotICAgICAgdG9rZW5zLT5jb2RlID0gMTg7Ci0gICAgICB0b2tlbnMtPmV4dHJhX2JpdHMgPSAweDdmOyAgLy8gMTM4IHJlcGVhdGVkIDBzCi0gICAgICArK3Rva2VuczsKLSAgICAgIHJlcGV0aXRpb25zIC09IDEzODsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRva2VuczsKLX0KLQotaW50IFZQOExDcmVhdGVDb21wcmVzc2VkSHVmZm1hblRyZWUoY29uc3QgSHVmZm1hblRyZWVDb2RlKiBjb25zdCB0cmVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRyZWVUb2tlbiogdG9rZW5zLCBpbnQgbWF4X3Rva2VucykgewotICBIdWZmbWFuVHJlZVRva2VuKiBjb25zdCBzdGFydGluZ190b2tlbiA9IHRva2VuczsKLSAgSHVmZm1hblRyZWVUb2tlbiogY29uc3QgZW5kaW5nX3Rva2VuID0gdG9rZW5zICsgbWF4X3Rva2VuczsKLSAgY29uc3QgaW50IGRlcHRoX3NpemUgPSB0cmVlLT5udW1fc3ltYm9sczsKLSAgaW50IHByZXZfdmFsdWUgPSA4OyAgLy8gOCBpcyB0aGUgaW5pdGlhbCB2YWx1ZSBmb3IgcmxlLgotICBpbnQgaSA9IDA7Ci0gIFNCX0RDSEVDSyh0b2tlbnMgIT0gTlVMTCk7Ci0gIHdoaWxlIChpIDwgZGVwdGhfc2l6ZSkgewotICAgIGNvbnN0IGludCB2YWx1ZSA9IHRyZWUtPmNvZGVfbGVuZ3Roc1tpXTsKLSAgICBpbnQgayA9IGkgKyAxOwotICAgIGludCBydW5zOwotICAgIHdoaWxlIChrIDwgZGVwdGhfc2l6ZSAmJiB0cmVlLT5jb2RlX2xlbmd0aHNba10gPT0gdmFsdWUpICsrazsKLSAgICBydW5zID0gayAtIGk7Ci0gICAgaWYgKHZhbHVlID09IDApIHsKLSAgICAgIHRva2VucyA9IENvZGVSZXBlYXRlZFplcm9zKHJ1bnMsIHRva2Vucyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRva2VucyA9IENvZGVSZXBlYXRlZFZhbHVlcyhydW5zLCB0b2tlbnMsIHZhbHVlLCBwcmV2X3ZhbHVlKTsKLSAgICAgIHByZXZfdmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0gICAgaSArPSBydW5zOwotICAgIFNCX0RDSEVDSyh0b2tlbnMgPD0gZW5kaW5nX3Rva2VuKTsKLSAgfQotICAodm9pZCllbmRpbmdfdG9rZW47ICAgIC8vIHN1cHByZXNzICd1bnVzZWQgdmFyaWFibGUnIHdhcm5pbmcKLSAgcmV0dXJuIChpbnQpKHRva2VucyAtIHN0YXJ0aW5nX3Rva2VuKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gUHJlLXJldmVyc2VkIDQtYml0IHZhbHVlcy4KLXN0YXRpYyBjb25zdCB1aW50OF90IGtSZXZlcnNlZEJpdHNbMTZdID0gewotICAweDAsIDB4OCwgMHg0LCAweGMsIDB4MiwgMHhhLCAweDYsIDB4ZSwKLSAgMHgxLCAweDksIDB4NSwgMHhkLCAweDMsIDB4YiwgMHg3LCAweGYKLX07Ci0KLXN0YXRpYyB1aW50MzJfdCBSZXZlcnNlQml0cyhpbnQgbnVtX2JpdHMsIHVpbnQzMl90IGJpdHMpIHsKLSAgdWludDMyX3QgcmV0dmFsID0gMDsKLSAgaW50IGkgPSAwOwotICB3aGlsZSAoaSA8IG51bV9iaXRzKSB7Ci0gICAgaSArPSA0OwotICAgIHJldHZhbCB8PSBrUmV2ZXJzZWRCaXRzW2JpdHMgJiAweGZdIDw8IChNQVhfQUxMT1dFRF9DT0RFX0xFTkdUSCArIDEgLSBpKTsKLSAgICBiaXRzID4+PSA0OwotICB9Ci0gIHJldHZhbCA+Pj0gKE1BWF9BTExPV0VEX0NPREVfTEVOR1RIICsgMSAtIG51bV9iaXRzKTsKLSAgcmV0dXJuIHJldHZhbDsKLX0KLQotLy8gR2V0IHRoZSBhY3R1YWwgYml0IHZhbHVlcyBmb3IgYSB0cmVlIG9mIGJpdCBkZXB0aHMuCi1zdGF0aWMgdm9pZCBDb252ZXJ0Qml0RGVwdGhzVG9TeW1ib2xzKEh1ZmZtYW5UcmVlQ29kZSogY29uc3QgdHJlZSkgewotICAvLyAwIGJpdC1kZXB0aCBtZWFucyB0aGF0IHRoZSBzeW1ib2wgZG9lcyBub3QgZXhpc3QuCi0gIGludCBpOwotICBpbnQgbGVuOwotICB1aW50MzJfdCBuZXh0X2NvZGVbTUFYX0FMTE9XRURfQ09ERV9MRU5HVEggKyAxXTsKLSAgaW50IGRlcHRoX2NvdW50W01BWF9BTExPV0VEX0NPREVfTEVOR1RIICsgMV0gPSB7IDAgfTsKLQotICBTQl9EQ0hFQ0sodHJlZSAhPSBOVUxMKTsKLSAgbGVuID0gdHJlZS0+bnVtX3N5bWJvbHM7Ci0gIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkgewotICAgIGNvbnN0IGludCBjb2RlX2xlbmd0aCA9IHRyZWUtPmNvZGVfbGVuZ3Roc1tpXTsKLSAgICBTQl9EQ0hFQ0soY29kZV9sZW5ndGggPD0gTUFYX0FMTE9XRURfQ09ERV9MRU5HVEgpOwotICAgICsrZGVwdGhfY291bnRbY29kZV9sZW5ndGhdOwotICB9Ci0gIGRlcHRoX2NvdW50WzBdID0gMDsgIC8vIGlnbm9yZSB1bnVzZWQgc3ltYm9sCi0gIG5leHRfY29kZVswXSA9IDA7Ci0gIHsKLSAgICB1aW50MzJfdCBjb2RlID0gMDsKLSAgICBmb3IgKGkgPSAxOyBpIDw9IE1BWF9BTExPV0VEX0NPREVfTEVOR1RIOyArK2kpIHsKLSAgICAgIGNvZGUgPSAoY29kZSArIGRlcHRoX2NvdW50W2kgLSAxXSkgPDwgMTsKLSAgICAgIG5leHRfY29kZVtpXSA9IGNvZGU7Ci0gICAgfQotICB9Ci0gIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkgewotICAgIGNvbnN0IGludCBjb2RlX2xlbmd0aCA9IHRyZWUtPmNvZGVfbGVuZ3Roc1tpXTsKLSAgICB0cmVlLT5jb2Rlc1tpXSA9IFJldmVyc2VCaXRzKGNvZGVfbGVuZ3RoLCBuZXh0X2NvZGVbY29kZV9sZW5ndGhdKyspOwotICB9Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBNYWluIGVudHJ5IHBvaW50Ci0KLWludCBWUDhMQ3JlYXRlSHVmZm1hblRyZWUoaW50KiBjb25zdCBoaXN0b2dyYW0sIGludCB0cmVlX2RlcHRoX2xpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVHJlZUNvZGUqIGNvbnN0IHRyZWUpIHsKLSAgY29uc3QgaW50IG51bV9zeW1ib2xzID0gdHJlZS0+bnVtX3N5bWJvbHM7Ci0gIGlmICghT3B0aW1pemVIdWZmbWFuRm9yUmxlKG51bV9zeW1ib2xzLCBoaXN0b2dyYW0pKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgaWYgKCFHZW5lcmF0ZU9wdGltYWxUcmVlKGhpc3RvZ3JhbSwgbnVtX3N5bWJvbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVlX2RlcHRoX2xpbWl0LCB0cmVlLT5jb2RlX2xlbmd0aHMpKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgLy8gQ3JlYXRlIHRoZSBhY3R1YWwgYml0IGNvZGVzIGZvciB0aGUgYml0IGxlbmd0aHMuCi0gIENvbnZlcnRCaXREZXB0aHNUb1N5bWJvbHModHJlZSk7Ci0gIHJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvaHVmZm1hbl9lbmNvZGUuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL2h1ZmZtYW5fZW5jb2RlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiODFmNDcuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvaHVmZm1hbl9lbmNvZGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBBdXRob3I6IEp5cmtpIEFsYWt1aWphbGEgKGp5cmtpQGdvb2dsZS5jb20pCi0vLwotLy8gRW50cm9weSBlbmNvZGluZyAoSHVmZm1hbikgZm9yIHdlYnAgbG9zc2xlc3MKLQotI2lmbmRlZiBXRUJQX1VUSUxTX0hVRkZNQU5fRU5DT0RFX0hfCi0jZGVmaW5lIFdFQlBfVVRJTFNfSFVGRk1BTl9FTkNPREVfSF8KLQotI2luY2x1ZGUgIi4uL3dlYnAvdHlwZXMuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8vIFN0cnVjdCBmb3IgaG9sZGluZyB0aGUgdHJlZSBoZWFkZXIgaW4gY29kZWQgZm9ybS4KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBjb2RlOyAgICAgICAgIC8vIHZhbHVlICgwLi4xNSkgb3IgZXNjYXBlIGNvZGUgKDE2LDE3LDE4KQotICB1aW50OF90IGV4dHJhX2JpdHM7ICAgLy8gZXh0cmEgYml0cyBmb3IgZXNjYXBlIGNvZGVzCi19IEh1ZmZtYW5UcmVlVG9rZW47Ci0KLS8vIFN0cnVjdCB0byByZXByZXNlbnQgdGhlIHRyZWUgY29kZXMgKGRlcHRoIGFuZCBiaXRzIGFycmF5KS4KLXR5cGVkZWYgc3RydWN0IHsKLSAgaW50ICAgICAgIG51bV9zeW1ib2xzOyAgIC8vIE51bWJlciBvZiBzeW1ib2xzLgotICB1aW50OF90KiAgY29kZV9sZW5ndGhzOyAgLy8gQ29kZSBsZW5ndGhzIG9mIHRoZSBzeW1ib2xzLgotICB1aW50MTZfdCogY29kZXM7ICAgICAgICAgLy8gU3ltYm9sIENvZGVzLgotfSBIdWZmbWFuVHJlZUNvZGU7Ci0KLS8vIFR1cm4gdGhlIEh1ZmZtYW4gdHJlZSBpbnRvIGEgdG9rZW4gc2VxdWVuY2UuCi0vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdG9rZW5zIHVzZWQuCi1pbnQgVlA4TENyZWF0ZUNvbXByZXNzZWRIdWZmbWFuVHJlZShjb25zdCBIdWZmbWFuVHJlZUNvZGUqIGNvbnN0IHRyZWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVHJlZVRva2VuKiB0b2tlbnMsIGludCBtYXhfdG9rZW5zKTsKLQotLy8gQ3JlYXRlIGFuIG9wdGltaXplZCB0cmVlLCBhbmQgdG9rZW5pemUgaXQuCi1pbnQgVlA4TENyZWF0ZUh1ZmZtYW5UcmVlKGludCogY29uc3QgaGlzdG9ncmFtLCBpbnQgdHJlZV9kZXB0aF9saW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRyZWVDb2RlKiBjb25zdCB0cmVlKTsKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0KLSNlbmRpZgotCi0jZW5kaWYgIC8vIFdFQlBfVVRJTFNfSFVGRk1BTl9FTkNPREVfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL3F1YW50X2xldmVscy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvcXVhbnRfbGV2ZWxzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYjYxMGIuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvcXVhbnRfbGV2ZWxzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIFF1YW50aXplIGxldmVscyBmb3Igc3BlY2lmaWVkIG51bWJlciBvZiBxdWFudGl6YXRpb24tbGV2ZWxzIChbMiwgMjU2XSkuCi0vLyBNaW4gYW5kIG1heCB2YWx1ZXMgYXJlIHByZXNlcnZlZCAodXN1YWwgMCBhbmQgMjU1IGZvciBhbHBoYSBwbGFuZSkuCi0vLwotLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKLQotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNlbHNlCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgIi4vcXVhbnRfbGV2ZWxzLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jZGVmaW5lIE5VTV9TWU1CT0xTICAgICAyNTYKLQotI2RlZmluZSBNQVhfSVRFUiAgNiAgICAgICAgICAgICAvLyBNYXhpbXVtIG51bWJlciBvZiBjb252ZXJnZW5jZSBzdGVwcy4KLSNkZWZpbmUgRVJST1JfVEhSRVNIT0xEIDFlLTQgICAgLy8gTVNFIHN0b3BwaW5nIGNyaXRlcmlvbi4KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFF1YW50aXplIGxldmVscy4KLQotaW50IFF1YW50aXplTGV2ZWxzKHVpbnQ4X3QqIGNvbnN0IGRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICBpbnQgbnVtX2xldmVscywgdWludDY0X3QqIGNvbnN0IHNzZSkgewotICBpbnQgZnJlcVtOVU1fU1lNQk9MU10gPSB7IDAgfTsKLSAgaW50IHFfbGV2ZWxbTlVNX1NZTUJPTFNdID0geyAwIH07Ci0gIGRvdWJsZSBpbnZfcV9sZXZlbFtOVU1fU1lNQk9MU10gPSB7IDAgfTsKLSAgaW50IG1pbl9zID0gMjU1LCBtYXhfcyA9IDA7Ci0gIGNvbnN0IHNpemVfdCBkYXRhX3NpemUgPSBoZWlnaHQgKiB3aWR0aDsKLSAgaW50IGksIG51bV9sZXZlbHNfaW4sIGl0ZXI7Ci0gIGRvdWJsZSBsYXN0X2VyciA9IDEuZTM4LCBlcnIgPSAwLjsKLSAgY29uc3QgZG91YmxlIGVycl90aHJlc2hvbGQgPSBFUlJPUl9USFJFU0hPTEQgKiBkYXRhX3NpemU7Ci0KLSAgaWYgKGRhdGEgPT0gTlVMTCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDApIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGlmIChudW1fbGV2ZWxzIDwgMiB8fCBudW1fbGV2ZWxzID4gMjU2KSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICB7Ci0gICAgc2l6ZV90IG47Ci0gICAgbnVtX2xldmVsc19pbiA9IDA7Ci0gICAgZm9yIChuID0gMDsgbiA8IGRhdGFfc2l6ZTsgKytuKSB7Ci0gICAgICBudW1fbGV2ZWxzX2luICs9IChmcmVxW2RhdGFbbl1dID09IDApOwotICAgICAgaWYgKG1pbl9zID4gZGF0YVtuXSkgbWluX3MgPSBkYXRhW25dOwotICAgICAgaWYgKG1heF9zIDwgZGF0YVtuXSkgbWF4X3MgPSBkYXRhW25dOwotICAgICAgKytmcmVxW2RhdGFbbl1dOwotICAgIH0KLSAgfQotCi0gIGlmIChudW1fbGV2ZWxzX2luIDw9IG51bV9sZXZlbHMpIGdvdG8gRW5kOyAgLy8gbm90aGluZyB0byBkbyEKLQotICAvLyBTdGFydCB3aXRoIHVuaWZvcm1seSBzcHJlYWQgY2VudHJvaWRzLgotICBmb3IgKGkgPSAwOyBpIDwgbnVtX2xldmVsczsgKytpKSB7Ci0gICAgaW52X3FfbGV2ZWxbaV0gPSBtaW5fcyArIChkb3VibGUpKG1heF9zIC0gbWluX3MpICogaSAvIChudW1fbGV2ZWxzIC0gMSk7Ci0gIH0KLQotICAvLyBGaXhlZCB2YWx1ZXMuIFdvbid0IGJlIGNoYW5nZWQuCi0gIHFfbGV2ZWxbbWluX3NdID0gMDsKLSAgcV9sZXZlbFttYXhfc10gPSBudW1fbGV2ZWxzIC0gMTsKLSAgU0JfRENIRUNLKGludl9xX2xldmVsWzBdID09IG1pbl9zKTsKLSAgU0JfRENIRUNLKGludl9xX2xldmVsW251bV9sZXZlbHMgLSAxXSA9PSBtYXhfcyk7Ci0KLSAgLy8gay1NZWFucyBpdGVyYXRpb25zLgotICBmb3IgKGl0ZXIgPSAwOyBpdGVyIDwgTUFYX0lURVI7ICsraXRlcikgewotICAgIGRvdWJsZSBxX3N1bVtOVU1fU1lNQk9MU10gPSB7IDAgfTsKLSAgICBkb3VibGUgcV9jb3VudFtOVU1fU1lNQk9MU10gPSB7IDAgfTsKLSAgICBpbnQgcywgc2xvdCA9IDA7Ci0KLSAgICAvLyBBc3NpZ24gY2xhc3NlcyB0byByZXByZXNlbnRhdGl2ZXMuCi0gICAgZm9yIChzID0gbWluX3M7IHMgPD0gbWF4X3M7ICsrcykgewotICAgICAgLy8gS2VlcCB0cmFjayBvZiB0aGUgbmVhcmVzdCBuZWlnaGJvdXIgJ3Nsb3QnCi0gICAgICB3aGlsZSAoc2xvdCA8IG51bV9sZXZlbHMgLSAxICYmCi0gICAgICAgICAgICAgMiAqIHMgPiBpbnZfcV9sZXZlbFtzbG90XSArIGludl9xX2xldmVsW3Nsb3QgKyAxXSkgewotICAgICAgICArK3Nsb3Q7Ci0gICAgICB9Ci0gICAgICBpZiAoZnJlcVtzXSA+IDApIHsKLSAgICAgICAgcV9zdW1bc2xvdF0gKz0gcyAqIGZyZXFbc107Ci0gICAgICAgIHFfY291bnRbc2xvdF0gKz0gZnJlcVtzXTsKLSAgICAgIH0KLSAgICAgIHFfbGV2ZWxbc10gPSBzbG90OwotICAgIH0KLQotICAgIC8vIEFzc2lnbiBuZXcgcmVwcmVzZW50YXRpdmVzIHRvIGNsYXNzZXMuCi0gICAgaWYgKG51bV9sZXZlbHMgPiAyKSB7Ci0gICAgICBmb3IgKHNsb3QgPSAxOyBzbG90IDwgbnVtX2xldmVscyAtIDE7ICsrc2xvdCkgewotICAgICAgICBjb25zdCBkb3VibGUgY291bnQgPSBxX2NvdW50W3Nsb3RdOwotICAgICAgICBpZiAoY291bnQgPiAwLikgewotICAgICAgICAgIGludl9xX2xldmVsW3Nsb3RdID0gcV9zdW1bc2xvdF0gLyBjb3VudDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8vIENvbXB1dGUgY29udmVyZ2VuY2UgZXJyb3IuCi0gICAgZXJyID0gMC47Ci0gICAgZm9yIChzID0gbWluX3M7IHMgPD0gbWF4X3M7ICsrcykgewotICAgICAgY29uc3QgZG91YmxlIGVycm9yID0gcyAtIGludl9xX2xldmVsW3FfbGV2ZWxbc11dOwotICAgICAgZXJyICs9IGZyZXFbc10gKiBlcnJvciAqIGVycm9yOwotICAgIH0KLQotICAgIC8vIENoZWNrIGZvciBjb252ZXJnZW5jZTogd2Ugc3RvcCBhcyBzb29uIGFzIHRoZSBlcnJvciBpcyBubwotICAgIC8vIGxvbmdlciBpbXByb3ZpbmcuCi0gICAgaWYgKGxhc3RfZXJyIC0gZXJyIDwgZXJyX3RocmVzaG9sZCkgYnJlYWs7Ci0gICAgbGFzdF9lcnIgPSBlcnI7Ci0gIH0KLQotICAvLyBSZW1hcCB0aGUgYWxwaGEgcGxhbmUgdG8gcXVhbnRpemVkIHZhbHVlcy4KLSAgewotICAgIC8vIGRvdWJsZS0+aW50IHJvdW5kaW5nIG9wZXJhdGlvbiBjYW4gYmUgY29zdGx5LCBzbyB3ZSBkbyBpdAotICAgIC8vIG9uY2UgZm9yIGFsbCBiZWZvcmUgcmVtYXBwaW5nLiBXZSBhbHNvIHBlcmZvcm0gdGhlIGRhdGFbXSAtPiBzbG90Ci0gICAgLy8gbWFwcGluZywgd2hpbGUgYXQgaXQgKGF2b2lkIG9uZSBpbmRpcmVjdGlvbiBpbiB0aGUgZmluYWwgbG9vcCkuCi0gICAgdWludDhfdCBtYXBbTlVNX1NZTUJPTFNdOwotICAgIGludCBzOwotICAgIHNpemVfdCBuOwotICAgIGZvciAocyA9IG1pbl9zOyBzIDw9IG1heF9zOyArK3MpIHsKLSAgICAgIGNvbnN0IGludCBzbG90ID0gcV9sZXZlbFtzXTsKLSAgICAgIG1hcFtzXSA9ICh1aW50OF90KShpbnZfcV9sZXZlbFtzbG90XSArIC41KTsKLSAgICB9Ci0gICAgLy8gRmluYWwgcGFzcy4KLSAgICBmb3IgKG4gPSAwOyBuIDwgZGF0YV9zaXplOyArK24pIHsKLSAgICAgIGRhdGFbbl0gPSBtYXBbZGF0YVtuXV07Ci0gICAgfQotICB9Ci0gRW5kOgotICAvLyBTdG9yZSBzdW0gb2Ygc3F1YXJlZCBlcnJvciBpZiBuZWVkZWQuCi0gIGlmIChzc2UgIT0gTlVMTCkgKnNzZSA9ICh1aW50NjRfdCllcnI7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvcXVhbnRfbGV2ZWxzLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy9xdWFudF9sZXZlbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ5MDgyOC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy9xdWFudF9sZXZlbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBBbHBoYSBwbGFuZSBxdWFudGl6YXRpb24gdXRpbGl0eQotLy8KLS8vIEF1dGhvcjogIFZpa2FzIEFyb3JhICh2aWthc2FAZ29vZ2xlLmNvbSkKLQotI2lmbmRlZiBXRUJQX1VUSUxTX1FVQU5UX0xFVkVMU19IXwotI2RlZmluZSBXRUJQX1VUSUxTX1FVQU5UX0xFVkVMU19IXwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlICIuLi93ZWJwL3R5cGVzLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vLyBSZXBsYWNlIHRoZSBpbnB1dCAnZGF0YScgb2Ygc2l6ZSAnd2lkdGgneCdoZWlnaHQnIHdpdGggJ251bS1sZXZlbHMnCi0vLyBxdWFudGl6ZWQgdmFsdWVzLiBJZiBub3QgTlVMTCwgJ3NzZScgd2lsbCBjb250YWluIHRoZSBzdW0gb2Ygc3F1YXJlZCBlcnJvci4KLS8vIFZhbGlkIHJhbmdlIGZvciAnbnVtX2xldmVscycgaXMgWzIsIDI1Nl0uCi0vLyBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgZXJyb3IgKGRhdGEgaXMgTlVMTCwgb3IgcGFyYW1ldGVycyBhcmUgaW52YWxpZCkuCi1pbnQgUXVhbnRpemVMZXZlbHModWludDhfdCogY29uc3QgZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgbnVtX2xldmVscywKLSAgICAgICAgICAgICAgICAgICB1aW50NjRfdCogY29uc3Qgc3NlKTsKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCi0KLSNlbmRpZiAgLyogV0VCUF9VVElMU19RVUFOVF9MRVZFTFNfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL3F1YW50X2xldmVsc19kZWMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL3F1YW50X2xldmVsc19kZWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkzNTk0Yi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy9xdWFudF9sZXZlbHNfZGVjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gVE9ETyhza2FsKTogaW1wbGVtZW50IGdyYWRpZW50IHNtb290aGluZy4KLS8vCi0vLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQotCi0jaW5jbHVkZSAiLi9xdWFudF9sZXZlbHNfZGVjLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi1pbnQgRGVxdWFudGl6ZUxldmVscyh1aW50OF90KiBjb25zdCBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgaWYgKGRhdGEgPT0gTlVMTCB8fCB3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKSByZXR1cm4gMDsKLSAgKHZvaWQpZGF0YTsKLSAgKHZvaWQpd2lkdGg7Ci0gICh2b2lkKWhlaWdodDsKLSAgcmV0dXJuIDE7Ci19Ci0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvcXVhbnRfbGV2ZWxzX2RlYy5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvcXVhbnRfbGV2ZWxzX2RlYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODkxMDY3Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL3F1YW50X2xldmVsc19kZWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDEzIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBBbHBoYSBwbGFuZSBkZS1xdWFudGl6YXRpb24gdXRpbGl0eQotLy8KLS8vIEF1dGhvcjogIFZpa2FzIEFyb3JhICh2aWthc2FAZ29vZ2xlLmNvbSkKLQotI2lmbmRlZiBXRUJQX1VUSUxTX1FVQU5UX0xFVkVMU19ERUNfSF8KLSNkZWZpbmUgV0VCUF9VVElMU19RVUFOVF9MRVZFTFNfREVDX0hfCi0KLSNpbmNsdWRlICIuLi93ZWJwL3R5cGVzLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vLyBBcHBseSBwb3N0LXByb2Nlc3NpbmcgdG8gaW5wdXQgJ2RhdGEnIG9mIHNpemUgJ3dpZHRoJ3gnaGVpZ2h0JyBhc3N1bWluZwotLy8gdGhhdCB0aGUgc291cmNlIHdhcyBxdWFudGl6ZWQgdG8gYSByZWR1Y2VkIG51bWJlciBvZiBsZXZlbHMuCi0vLyBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgZXJyb3IgKGRhdGEgaXMgTlVMTCwgaW52YWxpZCBwYXJhbWV0ZXJzLCAuLi4pLgotaW50IERlcXVhbnRpemVMZXZlbHModWludDhfdCogY29uc3QgZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCi0KLSNlbmRpZiAgLyogV0VCUF9VVElMU19RVUFOVF9MRVZFTFNfREVDX0hfICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy9yZXNjYWxlci5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvcmVzY2FsZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVkZGMyOS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy9yZXNjYWxlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBSZXNjYWxpbmcgZnVuY3Rpb25zCi0vLwotLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgIi4vcmVzY2FsZXIuaCIKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNkZWZpbmUgUkZJWCAzMAotI2RlZmluZSBNVUxUX0ZJWCh4LCB5KSAoKChpbnQ2NF90KSh4KSAqICh5KSArICgxIDw8IChSRklYIC0gMSkpKSA+PiBSRklYKQotCi12b2lkIFdlYlBSZXNjYWxlckluaXQoV2ViUFJlc2NhbGVyKiBjb25zdCB3cmssIGludCBzcmNfd2lkdGgsIGludCBzcmNfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IGRzdCwgaW50IGRzdF93aWR0aCwgaW50IGRzdF9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF9zdHJpZGUsIGludCBudW1fY2hhbm5lbHMsIGludCB4X2FkZCwgaW50IHhfc3ViLAotICAgICAgICAgICAgICAgICAgICAgIGludCB5X2FkZCwgaW50IHlfc3ViLCBpbnQzMl90KiBjb25zdCB3b3JrKSB7Ci0gIHdyay0+eF9leHBhbmQgPSAoc3JjX3dpZHRoIDwgZHN0X3dpZHRoKTsKLSAgd3JrLT5zcmNfd2lkdGggPSBzcmNfd2lkdGg7Ci0gIHdyay0+c3JjX2hlaWdodCA9IHNyY19oZWlnaHQ7Ci0gIHdyay0+ZHN0X3dpZHRoID0gZHN0X3dpZHRoOwotICB3cmstPmRzdF9oZWlnaHQgPSBkc3RfaGVpZ2h0OwotICB3cmstPmRzdCA9IGRzdDsKLSAgd3JrLT5kc3Rfc3RyaWRlID0gZHN0X3N0cmlkZTsKLSAgd3JrLT5udW1fY2hhbm5lbHMgPSBudW1fY2hhbm5lbHM7Ci0gIC8vIGZvciAneF9leHBhbmQnLCB3ZSB1c2UgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbgotICB3cmstPnhfYWRkID0gd3JrLT54X2V4cGFuZCA/ICh4X3N1YiAtIDEpIDogeF9hZGQgLSB4X3N1YjsKLSAgd3JrLT54X3N1YiA9IHdyay0+eF9leHBhbmQgPyAoeF9hZGQgLSAxKSA6IHhfc3ViOwotICB3cmstPnlfYWNjdW0gPSB5X2FkZDsKLSAgd3JrLT55X2FkZCA9IHlfYWRkOwotICB3cmstPnlfc3ViID0geV9zdWI7Ci0gIHdyay0+Znhfc2NhbGUgPSAoMSA8PCBSRklYKSAvIHhfc3ViOwotICB3cmstPmZ5X3NjYWxlID0gKDEgPDwgUkZJWCkgLyB5X3N1YjsKLSAgd3JrLT5meHlfc2NhbGUgPSB3cmstPnhfZXhwYW5kID8KLSAgICAgICgoaW50NjRfdClkc3RfaGVpZ2h0IDw8IFJGSVgpIC8gKHhfc3ViICogc3JjX2hlaWdodCkgOgotICAgICAgKChpbnQ2NF90KWRzdF9oZWlnaHQgPDwgUkZJWCkgLyAoeF9hZGQgKiBzcmNfaGVpZ2h0KTsKLSAgd3JrLT5pcm93ID0gd29yazsKLSAgd3JrLT5mcm93ID0gd29yayArIG51bV9jaGFubmVscyAqIGRzdF93aWR0aDsKLX0KLQotdm9pZCBXZWJQUmVzY2FsZXJJbXBvcnRSb3coV2ViUFJlc2NhbGVyKiBjb25zdCB3cmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBzcmMsIGludCBjaGFubmVsKSB7Ci0gIGNvbnN0IGludCB4X3N0cmlkZSA9IHdyay0+bnVtX2NoYW5uZWxzOwotICBjb25zdCBpbnQgeF9vdXRfbWF4ID0gd3JrLT5kc3Rfd2lkdGggKiB3cmstPm51bV9jaGFubmVsczsKLSAgaW50IHhfaW4gPSBjaGFubmVsOwotICBpbnQgeF9vdXQ7Ci0gIGludCBhY2N1bSA9IDA7Ci0gIGlmICghd3JrLT54X2V4cGFuZCkgewotICAgIGludCBzdW0gPSAwOwotICAgIGZvciAoeF9vdXQgPSBjaGFubmVsOyB4X291dCA8IHhfb3V0X21heDsgeF9vdXQgKz0geF9zdHJpZGUpIHsKLSAgICAgIGFjY3VtICs9IHdyay0+eF9hZGQ7Ci0gICAgICBmb3IgKDsgYWNjdW0gPiAwOyBhY2N1bSAtPSB3cmstPnhfc3ViKSB7Ci0gICAgICAgIHN1bSArPSBzcmNbeF9pbl07Ci0gICAgICAgIHhfaW4gKz0geF9zdHJpZGU7Ci0gICAgICB9Ci0gICAgICB7ICAgICAgICAvLyBFbWl0IG5leHQgaG9yaXpvbnRhbCBwaXhlbC4KLSAgICAgICAgY29uc3QgaW50MzJfdCBiYXNlID0gc3JjW3hfaW5dOwotICAgICAgICBjb25zdCBpbnQzMl90IGZyYWMgPSBiYXNlICogKC1hY2N1bSk7Ci0gICAgICAgIHhfaW4gKz0geF9zdHJpZGU7Ci0gICAgICAgIHdyay0+ZnJvd1t4X291dF0gPSAoc3VtICsgYmFzZSkgKiB3cmstPnhfc3ViIC0gZnJhYzsKLSAgICAgICAgLy8gZnJlc2ggZnJhY3Rpb25hbCBzdGFydCBmb3IgbmV4dCBwaXhlbAotICAgICAgICBzdW0gPSAoaW50KU1VTFRfRklYKGZyYWMsIHdyay0+Znhfc2NhbGUpOwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIHsgICAgICAgIC8vIHNpbXBsZSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uCi0gICAgaW50IGxlZnQgPSBzcmNbY2hhbm5lbF0sIHJpZ2h0ID0gc3JjW2NoYW5uZWxdOwotICAgIGZvciAoeF9vdXQgPSBjaGFubmVsOyB4X291dCA8IHhfb3V0X21heDsgeF9vdXQgKz0geF9zdHJpZGUpIHsKLSAgICAgIGlmIChhY2N1bSA8IDApIHsKLSAgICAgICAgbGVmdCA9IHJpZ2h0OwotICAgICAgICB4X2luICs9IHhfc3RyaWRlOwotICAgICAgICByaWdodCA9IHNyY1t4X2luXTsKLSAgICAgICAgYWNjdW0gKz0gd3JrLT54X2FkZDsKLSAgICAgIH0KLSAgICAgIHdyay0+ZnJvd1t4X291dF0gPSByaWdodCAqIHdyay0+eF9hZGQgKyAobGVmdCAtIHJpZ2h0KSAqIGFjY3VtOwotICAgICAgYWNjdW0gLT0gd3JrLT54X3N1YjsKLSAgICB9Ci0gIH0KLSAgLy8gQWNjdW11bGF0ZSB0aGUgbmV3IHJvdydzIGNvbnRyaWJ1dGlvbgotICBmb3IgKHhfb3V0ID0gY2hhbm5lbDsgeF9vdXQgPCB4X291dF9tYXg7IHhfb3V0ICs9IHhfc3RyaWRlKSB7Ci0gICAgd3JrLT5pcm93W3hfb3V0XSArPSB3cmstPmZyb3dbeF9vdXRdOwotICB9Ci19Ci0KLXVpbnQ4X3QqIFdlYlBSZXNjYWxlckV4cG9ydFJvdyhXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaykgewotICBpZiAod3JrLT55X2FjY3VtIDw9IDApIHsKLSAgICBpbnQgeF9vdXQ7Ci0gICAgdWludDhfdCogY29uc3QgZHN0ID0gd3JrLT5kc3Q7Ci0gICAgaW50MzJfdCogY29uc3QgaXJvdyA9IHdyay0+aXJvdzsKLSAgICBjb25zdCBpbnQzMl90KiBjb25zdCBmcm93ID0gd3JrLT5mcm93OwotICAgIGNvbnN0IGludCB5c2NhbGUgPSB3cmstPmZ5X3NjYWxlICogKC13cmstPnlfYWNjdW0pOwotICAgIGNvbnN0IGludCB4X291dF9tYXggPSB3cmstPmRzdF93aWR0aCAqIHdyay0+bnVtX2NoYW5uZWxzOwotCi0gICAgZm9yICh4X291dCA9IDA7IHhfb3V0IDwgeF9vdXRfbWF4OyArK3hfb3V0KSB7Ci0gICAgICBjb25zdCBpbnQgZnJhYyA9IChpbnQpTVVMVF9GSVgoZnJvd1t4X291dF0sIHlzY2FsZSk7Ci0gICAgICBjb25zdCBpbnQgdiA9IChpbnQpTVVMVF9GSVgoaXJvd1t4X291dF0gLSBmcmFjLCB3cmstPmZ4eV9zY2FsZSk7Ci0gICAgICBkc3RbeF9vdXRdID0gKCEodiAmIH4weGZmKSkgPyB2IDogKHYgPCAwKSA/IDAgOiAyNTU7Ci0gICAgICBpcm93W3hfb3V0XSA9IGZyYWM7ICAgLy8gbmV3IGZyYWN0aW9uYWwgc3RhcnQKLSAgICB9Ci0gICAgd3JrLT55X2FjY3VtICs9IHdyay0+eV9hZGQ7Ci0gICAgd3JrLT5kc3QgKz0gd3JrLT5kc3Rfc3RyaWRlOwotICAgIHJldHVybiBkc3Q7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLX0KLQotI3VuZGVmIE1VTFRfRklYCi0jdW5kZWYgUkZJWAotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gYWxsLWluLW9uZSBjYWxscwotCi1pbnQgV2ViUFJlc2NhbGVySW1wb3J0KFdlYlBSZXNjYWxlciogY29uc3Qgd3JrLCBpbnQgbnVtX2xpbmVzLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmMsIGludCBzcmNfc3RyaWRlKSB7Ci0gIGludCB0b3RhbF9pbXBvcnRlZCA9IDA7Ci0gIHdoaWxlICh0b3RhbF9pbXBvcnRlZCA8IG51bV9saW5lcyAmJiB3cmstPnlfYWNjdW0gPiAwKSB7Ci0gICAgaW50IGNoYW5uZWw7Ci0gICAgZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IHdyay0+bnVtX2NoYW5uZWxzOyArK2NoYW5uZWwpIHsKLSAgICAgIFdlYlBSZXNjYWxlckltcG9ydFJvdyh3cmssIHNyYywgY2hhbm5lbCk7Ci0gICAgfQotICAgIHNyYyArPSBzcmNfc3RyaWRlOwotICAgICsrdG90YWxfaW1wb3J0ZWQ7Ci0gICAgd3JrLT55X2FjY3VtIC09IHdyay0+eV9zdWI7Ci0gIH0KLSAgcmV0dXJuIHRvdGFsX2ltcG9ydGVkOwotfQotCi1pbnQgV2ViUFJlc2NhbGVyRXhwb3J0KFdlYlBSZXNjYWxlciogY29uc3QgcmVzY2FsZXIpIHsKLSAgaW50IHRvdGFsX2V4cG9ydGVkID0gMDsKLSAgd2hpbGUgKFdlYlBSZXNjYWxlckhhc1BlbmRpbmdPdXRwdXQocmVzY2FsZXIpKSB7Ci0gICAgV2ViUFJlc2NhbGVyRXhwb3J0Um93KHJlc2NhbGVyKTsKLSAgICArK3RvdGFsX2V4cG9ydGVkOwotICB9Ci0gIHJldHVybiB0b3RhbF9leHBvcnRlZDsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy9yZXNjYWxlci5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvcmVzY2FsZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVkY2U0Ni4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy9yZXNjYWxlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIFJlc2NhbGluZyBmdW5jdGlvbnMKLS8vCi0vLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQotCi0jaWZuZGVmIFdFQlBfVVRJTFNfUkVTQ0FMRVJfSF8KLSNkZWZpbmUgV0VCUF9VVElMU19SRVNDQUxFUl9IXwotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2luY2x1ZGUgIi4uL3dlYnAvdHlwZXMuaCIKLQotLy8gU3RydWN0dXJlIHVzZWQgZm9yIG9uLXRoZS1mbHkgcmVzY2FsaW5nCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGludCB4X2V4cGFuZDsgICAgICAgICAgICAgICAvLyB0cnVlIGlmIHdlJ3JlIGV4cGFuZGluZyBpbiB0aGUgeCBkaXJlY3Rpb24KLSAgaW50IG51bV9jaGFubmVsczsgICAgICAgICAgIC8vIGJ5dGVzIHRvIGp1bXAgYmV0d2VlbiBwaXhlbHMKLSAgaW50IGZ5X3NjYWxlLCBmeF9zY2FsZTsgICAgIC8vIGZpeGVkLXBvaW50IHNjYWxpbmcgZmFjdG9yCi0gIGludDY0X3QgZnh5X3NjYWxlOyAgICAgICAgICAvLyAnJwotICAvLyB3ZSBuZWVkIGhwZWwtcHJlY2lzZSBhZGQvc3ViIGluY3JlbWVudHMsIGZvciB0aGUgZG93bnNhbXBsZWQgVS9WIHBsYW5lcy4KLSAgaW50IHlfYWNjdW07ICAgICAgICAgICAgICAgIC8vIHZlcnRpY2FsIGFjY3VtdWxhdG9yCi0gIGludCB5X2FkZCwgeV9zdWI7ICAgICAgICAgICAvLyB2ZXJ0aWNhbCBpbmNyZW1lbnRzIChhZGQgfj0gc3JjLCBzdWIgfj0gZHN0KQotICBpbnQgeF9hZGQsIHhfc3ViOyAgICAgICAgICAgLy8gaG9yaXpvbnRhbCBpbmNyZW1lbnRzIChhZGQgfj0gc3JjLCBzdWIgfj0gZHN0KQotICBpbnQgc3JjX3dpZHRoLCBzcmNfaGVpZ2h0OyAgLy8gc291cmNlIGRpbWVuc2lvbnMKLSAgaW50IGRzdF93aWR0aCwgZHN0X2hlaWdodDsgIC8vIGRlc3RpbmF0aW9uIGRpbWVuc2lvbnMKLSAgdWludDhfdCogZHN0OwotICBpbnQgZHN0X3N0cmlkZTsKLSAgaW50MzJfdCogaXJvdywgKmZyb3c7ICAgICAgIC8vIHdvcmsgYnVmZmVyCi19IFdlYlBSZXNjYWxlcjsKLQotLy8gSW5pdGlhbGl6ZSBhIHJlc2NhbGVyIGdpdmVuIHNjcmF0Y2ggYXJlYSAnd29yaycgYW5kIGRpbWVuc2lvbnMgb2Ygc3JjICYgZHN0Lgotdm9pZCBXZWJQUmVzY2FsZXJJbml0KFdlYlBSZXNjYWxlciogY29uc3Qgd3JrLCBpbnQgc3JjX3dpZHRoLCBpbnQgc3JjX2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF93aWR0aCwgaW50IGRzdF9oZWlnaHQsIGludCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgaW50IHhfYWRkLCBpbnQgeF9zdWIsCi0gICAgICAgICAgICAgICAgICAgICAgaW50IHlfYWRkLCBpbnQgeV9zdWIsCi0gICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogY29uc3Qgd29yayk7Ci0KLS8vIEltcG9ydCBhIHJvdyBvZiBkYXRhIGFuZCBzYXZlIGl0cyBjb250cmlidXRpb24gaW4gdGhlIHJlc2NhbGVyLgotLy8gJ2NoYW5uZWwnIGRlbm90ZXMgdGhlIGNoYW5uZWwgbnVtYmVyIHRvIGJlIGltcG9ydGVkLgotdm9pZCBXZWJQUmVzY2FsZXJJbXBvcnRSb3coV2ViUFJlc2NhbGVyKiBjb25zdCByZXNjYWxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHNyYywgaW50IGNoYW5uZWwpOwotCi0vLyBJbXBvcnQgbXVsdGlwbGUgcm93cyBvdmVyIGFsbCBjaGFubmVscywgdW50aWwgYXQgbGVhc3Qgb25lIHJvdyBpcyByZWFkeSB0bwotLy8gYmUgZXhwb3J0ZWQuIFJldHVybnMgdGhlIGFjdHVhbCBudW1iZXIgb2YgbGluZXMgdGhhdCB3ZXJlIGltcG9ydGVkLgotaW50IFdlYlBSZXNjYWxlckltcG9ydChXZWJQUmVzY2FsZXIqIGNvbnN0IHJlc2NhbGVyLCBpbnQgbnVtX3Jvd3MsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyYywgaW50IHNyY19zdHJpZGUpOwotCi0vLyBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBwZW5kaW5nIG91dHB1dCByb3dzIHJlYWR5Lgotc3RhdGljIFdFQlBfSU5MSU5FCi1pbnQgV2ViUFJlc2NhbGVySGFzUGVuZGluZ091dHB1dChjb25zdCBXZWJQUmVzY2FsZXIqIGNvbnN0IHJlc2NhbGVyKSB7Ci0gIHJldHVybiAocmVzY2FsZXItPnlfYWNjdW0gPD0gMCk7Ci19Ci0KLS8vIEV4cG9ydCBvbmUgcm93IGZyb20gcmVzY2FsZXIuIFJldHVybnMgdGhlIHBvaW50ZXIgd2hlcmUgb3V0cHV0IHdhcyB3cml0dGVuLAotLy8gb3IgTlVMTCBpZiBubyByb3cgd2FzIHBlbmRpbmcuCi11aW50OF90KiBXZWJQUmVzY2FsZXJFeHBvcnRSb3coV2ViUFJlc2NhbGVyKiBjb25zdCB3cmspOwotCi0vLyBFeHBvcnQgYXMgbWFueSByb3dzIGFzIHBvc3NpYmxlLiBSZXR1cm4gdGhlIG51bWJlcnMgb2Ygcm93cyB3cml0dGVuLgotaW50IFdlYlBSZXNjYWxlckV4cG9ydChXZWJQUmVzY2FsZXIqIGNvbnN0IHdyayk7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgotCi0jZW5kaWYgIC8qIFdFQlBfVVRJTFNfUkVTQ0FMRVJfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL3RocmVhZC5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvdGhyZWFkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NDAzYTguLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvdGhyZWFkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIE11bHRpLXRocmVhZGVkIHdvcmtlcgotLy8KLS8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCi0KLQotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCi0jZWxzZQotI2luY2x1ZGUgPHN0cmluZy5oPiAgIC8vIGZvciBTYk1lbW9yeVNldCgpCi0jZW5kaWYKLSNpbmNsdWRlICIuL3RocmVhZC5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2lmZGVmIFdFQlBfVVNFX1RIUkVBRAotCi0jaWYgZGVmaW5lZChfV0lOMzIpCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBzaW1wbGlzdGljIHB0aHJlYWQgZW11bGF0aW9uIGxheWVyCi0KLSNpbmNsdWRlIDxwcm9jZXNzLmg+Ci0KLS8vIF9iZWdpbnRocmVhZGV4IHJlcXVpcmVzIF9fc3RkY2FsbAotI2RlZmluZSBUSFJFQURGTiB1bnNpZ25lZCBpbnQgX19zdGRjYWxsCi0jZGVmaW5lIFRIUkVBRF9SRVRVUk4odmFsKSAodW5zaWduZWQgaW50KSgoRFdPUkRfUFRSKXZhbCkKLQotc3RhdGljIGludCBwdGhyZWFkX2NyZWF0ZShwdGhyZWFkX3QqIGNvbnN0IHRocmVhZCwgY29uc3Qgdm9pZCogYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IChfX3N0ZGNhbGwgKnN0YXJ0KSh2b2lkKiksIHZvaWQqIGFyZykgewotICAodm9pZClhdHRyOwotICAqdGhyZWFkID0gKHB0aHJlYWRfdClfYmVnaW50aHJlYWRleChOVUxMLCAgIC8qIHZvaWQgKnNlY3VyaXR5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgLyogdW5zaWduZWQgc3RhY2tfc2l6ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgIC8qIHVuc2lnbmVkIGluaXRmbGFnICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOyAgLyogdW5zaWduZWQgKnRocmRhZGRyICovCi0gIGlmICgqdGhyZWFkID09IE5VTEwpIHJldHVybiAxOwotICBTZXRUaHJlYWRQcmlvcml0eSgqdGhyZWFkLCBUSFJFQURfUFJJT1JJVFlfQUJPVkVfTk9STUFMKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcHRocmVhZF9qb2luKHB0aHJlYWRfdCB0aHJlYWQsIHZvaWQqKiB2YWx1ZV9wdHIpIHsKLSAgKHZvaWQpdmFsdWVfcHRyOwotICByZXR1cm4gKFdhaXRGb3JTaW5nbGVPYmplY3QodGhyZWFkLCBJTkZJTklURSkgIT0gV0FJVF9PQkpFQ1RfMCB8fAotICAgICAgICAgIENsb3NlSGFuZGxlKHRocmVhZCkgPT0gMCk7Ci19Ci0KLS8vIE11dGV4Ci1zdGF0aWMgaW50IHB0aHJlYWRfbXV0ZXhfaW5pdChwdGhyZWFkX211dGV4X3QqIGNvbnN0IG11dGV4LCB2b2lkKiBtdXRleGF0dHIpIHsKLSAgKHZvaWQpbXV0ZXhhdHRyOwotICBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKG11dGV4KTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcHRocmVhZF9tdXRleF9sb2NrKHB0aHJlYWRfbXV0ZXhfdCogY29uc3QgbXV0ZXgpIHsKLSAgRW50ZXJDcml0aWNhbFNlY3Rpb24obXV0ZXgpOwotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBwdGhyZWFkX211dGV4X3VubG9jayhwdGhyZWFkX211dGV4X3QqIGNvbnN0IG11dGV4KSB7Ci0gIExlYXZlQ3JpdGljYWxTZWN0aW9uKG11dGV4KTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcHRocmVhZF9tdXRleF9kZXN0cm95KHB0aHJlYWRfbXV0ZXhfdCogY29uc3QgbXV0ZXgpIHsKLSAgRGVsZXRlQ3JpdGljYWxTZWN0aW9uKG11dGV4KTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8vIENvbmRpdGlvbgotc3RhdGljIGludCBwdGhyZWFkX2NvbmRfZGVzdHJveShwdGhyZWFkX2NvbmRfdCogY29uc3QgY29uZGl0aW9uKSB7Ci0gIGludCBvayA9IDE7Ci0gIG9rICY9IChDbG9zZUhhbmRsZShjb25kaXRpb24tPndhaXRpbmdfc2VtXykgIT0gMCk7Ci0gIG9rICY9IChDbG9zZUhhbmRsZShjb25kaXRpb24tPnJlY2VpdmVkX3NlbV8pICE9IDApOwotICBvayAmPSAoQ2xvc2VIYW5kbGUoY29uZGl0aW9uLT5zaWduYWxfZXZlbnRfKSAhPSAwKTsKLSAgcmV0dXJuICFvazsKLX0KLQotc3RhdGljIGludCBwdGhyZWFkX2NvbmRfaW5pdChwdGhyZWFkX2NvbmRfdCogY29uc3QgY29uZGl0aW9uLCB2b2lkKiBjb25kX2F0dHIpIHsKLSAgKHZvaWQpY29uZF9hdHRyOwotICBjb25kaXRpb24tPndhaXRpbmdfc2VtXyA9IENyZWF0ZVNlbWFwaG9yZShOVUxMLCAwLCAxLCBOVUxMKTsKLSAgY29uZGl0aW9uLT5yZWNlaXZlZF9zZW1fID0gQ3JlYXRlU2VtYXBob3JlKE5VTEwsIDAsIDEsIE5VTEwpOwotICBjb25kaXRpb24tPnNpZ25hbF9ldmVudF8gPSBDcmVhdGVFdmVudChOVUxMLCBGQUxTRSwgRkFMU0UsIE5VTEwpOwotICBpZiAoY29uZGl0aW9uLT53YWl0aW5nX3NlbV8gPT0gTlVMTCB8fAotICAgICAgY29uZGl0aW9uLT5yZWNlaXZlZF9zZW1fID09IE5VTEwgfHwKLSAgICAgIGNvbmRpdGlvbi0+c2lnbmFsX2V2ZW50XyA9PSBOVUxMKSB7Ci0gICAgcHRocmVhZF9jb25kX2Rlc3Ryb3koY29uZGl0aW9uKTsKLSAgICByZXR1cm4gMTsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBwdGhyZWFkX2NvbmRfc2lnbmFsKHB0aHJlYWRfY29uZF90KiBjb25zdCBjb25kaXRpb24pIHsKLSAgaW50IG9rID0gMTsKLSAgaWYgKFdhaXRGb3JTaW5nbGVPYmplY3QoY29uZGl0aW9uLT53YWl0aW5nX3NlbV8sIDApID09IFdBSVRfT0JKRUNUXzApIHsKLSAgICAvLyBhIHRocmVhZCBpcyB3YWl0aW5nIGluIHB0aHJlYWRfY29uZF93YWl0OiBhbGxvdyBpdCB0byBiZSBub3RpZmllZAotICAgIG9rID0gU2V0RXZlbnQoY29uZGl0aW9uLT5zaWduYWxfZXZlbnRfKTsKLSAgICAvLyB3YWl0IHVudGlsIHRoZSBldmVudCBpcyBjb25zdW1lZCBzbyB0aGUgc2lnbmFsZXIgY2Fubm90IGNvbnN1bWUKLSAgICAvLyB0aGUgZXZlbnQgdmlhIGl0cyBvd24gcHRocmVhZF9jb25kX3dhaXQuCi0gICAgb2sgJj0gKFdhaXRGb3JTaW5nbGVPYmplY3QoY29uZGl0aW9uLT5yZWNlaXZlZF9zZW1fLCBJTkZJTklURSkgIT0KLSAgICAgICAgICAgV0FJVF9PQkpFQ1RfMCk7Ci0gIH0KLSAgcmV0dXJuICFvazsKLX0KLQotc3RhdGljIGludCBwdGhyZWFkX2NvbmRfd2FpdChwdGhyZWFkX2NvbmRfdCogY29uc3QgY29uZGl0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3QqIGNvbnN0IG11dGV4KSB7Ci0gIGludCBvazsKLSAgLy8gbm90ZSB0aGF0IHRoZXJlIGlzIGEgY29uc3VtZXIgYXZhaWxhYmxlIHNvIHRoZSBzaWduYWwgaXNuJ3QgZHJvcHBlZCBpbgotICAvLyBwdGhyZWFkX2NvbmRfc2lnbmFsCi0gIGlmICghUmVsZWFzZVNlbWFwaG9yZShjb25kaXRpb24tPndhaXRpbmdfc2VtXywgMSwgTlVMTCkpCi0gICAgcmV0dXJuIDE7Ci0gIC8vIG5vdyB1bmxvY2sgdGhlIG11dGV4IHNvIHB0aHJlYWRfY29uZF9zaWduYWwgbWF5IGJlIGlzc3VlZAotICBwdGhyZWFkX211dGV4X3VubG9jayhtdXRleCk7Ci0gIG9rID0gKFdhaXRGb3JTaW5nbGVPYmplY3QoY29uZGl0aW9uLT5zaWduYWxfZXZlbnRfLCBJTkZJTklURSkgPT0KLSAgICAgICAgV0FJVF9PQkpFQ1RfMCk7Ci0gIG9rICY9IFJlbGVhc2VTZW1hcGhvcmUoY29uZGl0aW9uLT5yZWNlaXZlZF9zZW1fLCAxLCBOVUxMKTsKLSAgcHRocmVhZF9tdXRleF9sb2NrKG11dGV4KTsKLSAgcmV0dXJuICFvazsKLX0KLQotI2Vsc2UgIC8vIF9XSU4zMgotIyBkZWZpbmUgVEhSRUFERk4gdm9pZCoKLSMgZGVmaW5lIFRIUkVBRF9SRVRVUk4odmFsKSB2YWwKLSNlbmRpZgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgVEhSRUFERk4gV2ViUFdvcmtlclRocmVhZExvb3Aodm9pZCAqcHRyKSB7ICAgIC8vIHRocmVhZCBsb29wCi0gIFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlciA9IChXZWJQV29ya2VyKilwdHI7Ci0gIGludCBkb25lID0gMDsKLSAgd2hpbGUgKCFkb25lKSB7Ci0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZ3b3JrZXItPm11dGV4Xyk7Ci0gICAgd2hpbGUgKHdvcmtlci0+c3RhdHVzXyA9PSBPSykgeyAgIC8vIHdhaXQgaW4gaWRsaW5nIG1vZGUKLSAgICAgIHB0aHJlYWRfY29uZF93YWl0KCZ3b3JrZXItPmNvbmRpdGlvbl8sICZ3b3JrZXItPm11dGV4Xyk7Ci0gICAgfQotICAgIGlmICh3b3JrZXItPnN0YXR1c18gPT0gV09SSykgewotICAgICAgaWYgKHdvcmtlci0+aG9vaykgewotICAgICAgICB3b3JrZXItPmhhZF9lcnJvciB8PSAhd29ya2VyLT5ob29rKHdvcmtlci0+ZGF0YTEsIHdvcmtlci0+ZGF0YTIpOwotICAgICAgfQotICAgICAgd29ya2VyLT5zdGF0dXNfID0gT0s7Ci0gICAgfSBlbHNlIGlmICh3b3JrZXItPnN0YXR1c18gPT0gTk9UX09LKSB7ICAgLy8gZmluaXNoIHRoZSB3b3JrZXIKLSAgICAgIGRvbmUgPSAxOwotICAgIH0KLSAgICAvLyBzaWduYWwgdG8gdGhlIG1haW4gdGhyZWFkIHRoYXQgd2UncmUgZG9uZSAoZm9yIFN5bmMoKSkKLSAgICBwdGhyZWFkX2NvbmRfc2lnbmFsKCZ3b3JrZXItPmNvbmRpdGlvbl8pOwotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ3b3JrZXItPm11dGV4Xyk7Ci0gIH0KLSAgcmV0dXJuIFRIUkVBRF9SRVRVUk4oTlVMTCk7ICAgIC8vIFRocmVhZCBpcyBmaW5pc2hlZAotfQotCi0vLyBtYWluIHRocmVhZCBzdGF0ZSBjb250cm9sCi1zdGF0aWMgdm9pZCBXZWJQV29ya2VyQ2hhbmdlU3RhdGUoV2ViUFdvcmtlciogY29uc3Qgd29ya2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBXb3JrZXJTdGF0dXMgbmV3X3N0YXR1cykgewotICAvLyBuby1vcCB3aGVuIGF0dGVtcHRpbmcgdG8gY2hhbmdlIHN0YXRlIG9uIGEgdGhyZWFkIHRoYXQgZGlkbid0IGNvbWUgdXAKLSAgaWYgKHdvcmtlci0+c3RhdHVzXyA8IE9LKSByZXR1cm47Ci0KLSAgcHRocmVhZF9tdXRleF9sb2NrKCZ3b3JrZXItPm11dGV4Xyk7Ci0gIC8vIHdhaXQgZm9yIHRoZSB3b3JrZXIgdG8gZmluaXNoCi0gIHdoaWxlICh3b3JrZXItPnN0YXR1c18gIT0gT0spIHsKLSAgICBwdGhyZWFkX2NvbmRfd2FpdCgmd29ya2VyLT5jb25kaXRpb25fLCAmd29ya2VyLT5tdXRleF8pOwotICB9Ci0gIC8vIGFzc2lnbiBuZXcgc3RhdHVzIGFuZCByZWxlYXNlIHRoZSB3b3JraW5nIHRocmVhZCBpZiBuZWVkZWQKLSAgaWYgKG5ld19zdGF0dXMgIT0gT0spIHsKLSAgICB3b3JrZXItPnN0YXR1c18gPSBuZXdfc3RhdHVzOwotICAgIHB0aHJlYWRfY29uZF9zaWduYWwoJndvcmtlci0+Y29uZGl0aW9uXyk7Ci0gIH0KLSAgcHRocmVhZF9tdXRleF91bmxvY2soJndvcmtlci0+bXV0ZXhfKTsKLX0KLQotI2VuZGlmCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgV2ViUFdvcmtlckluaXQoV2ViUFdvcmtlciogY29uc3Qgd29ya2VyKSB7Ci0gIFNiTWVtb3J5U2V0KHdvcmtlciwgMCwgc2l6ZW9mKCp3b3JrZXIpKTsKLSAgd29ya2VyLT5zdGF0dXNfID0gTk9UX09LOwotfQotCi1pbnQgV2ViUFdvcmtlclN5bmMoV2ViUFdvcmtlciogY29uc3Qgd29ya2VyKSB7Ci0jaWZkZWYgV0VCUF9VU0VfVEhSRUFECi0gIFdlYlBXb3JrZXJDaGFuZ2VTdGF0ZSh3b3JrZXIsIE9LKTsKLSNlbmRpZgotICBTQl9EQ0hFQ0sod29ya2VyLT5zdGF0dXNfIDw9IE9LKTsKLSAgcmV0dXJuICF3b3JrZXItPmhhZF9lcnJvcjsKLX0KLQotaW50IFdlYlBXb3JrZXJSZXNldChXZWJQV29ya2VyKiBjb25zdCB3b3JrZXIpIHsKLSAgaW50IG9rID0gMTsKLSAgd29ya2VyLT5oYWRfZXJyb3IgPSAwOwotICBpZiAod29ya2VyLT5zdGF0dXNfIDwgT0spIHsKLSNpZmRlZiBXRUJQX1VTRV9USFJFQUQKLSAgICBpZiAocHRocmVhZF9tdXRleF9pbml0KCZ3b3JrZXItPm11dGV4XywgTlVMTCkgfHwKLSAgICAgICAgcHRocmVhZF9jb25kX2luaXQoJndvcmtlci0+Y29uZGl0aW9uXywgTlVMTCkpIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBwdGhyZWFkX211dGV4X2xvY2soJndvcmtlci0+bXV0ZXhfKTsKLSAgICBvayA9ICFwdGhyZWFkX2NyZWF0ZSgmd29ya2VyLT50aHJlYWRfLCBOVUxMLCBXZWJQV29ya2VyVGhyZWFkTG9vcCwgd29ya2VyKTsKLSAgICBpZiAob2spIHdvcmtlci0+c3RhdHVzXyA9IE9LOwotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ3b3JrZXItPm11dGV4Xyk7Ci0jZWxzZQotICAgIHdvcmtlci0+c3RhdHVzXyA9IE9LOwotI2VuZGlmCi0gIH0gZWxzZSBpZiAod29ya2VyLT5zdGF0dXNfID4gT0spIHsKLSAgICBvayA9IFdlYlBXb3JrZXJTeW5jKHdvcmtlcik7Ci0gIH0KLSAgU0JfRENIRUNLKCFvayB8fCAod29ya2VyLT5zdGF0dXNfID09IE9LKSk7Ci0gIHJldHVybiBvazsKLX0KLQotdm9pZCBXZWJQV29ya2VyTGF1bmNoKFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlcikgewotI2lmZGVmIFdFQlBfVVNFX1RIUkVBRAotICBXZWJQV29ya2VyQ2hhbmdlU3RhdGUod29ya2VyLCBXT1JLKTsKLSNlbHNlCi0gIGlmICh3b3JrZXItPmhvb2spCi0gICAgd29ya2VyLT5oYWRfZXJyb3IgfD0gIXdvcmtlci0+aG9vayh3b3JrZXItPmRhdGExLCB3b3JrZXItPmRhdGEyKTsKLSNlbmRpZgotfQotCi12b2lkIFdlYlBXb3JrZXJFbmQoV2ViUFdvcmtlciogY29uc3Qgd29ya2VyKSB7Ci0gIGlmICh3b3JrZXItPnN0YXR1c18gPj0gT0spIHsKLSNpZmRlZiBXRUJQX1VTRV9USFJFQUQKLSAgICBXZWJQV29ya2VyQ2hhbmdlU3RhdGUod29ya2VyLCBOT1RfT0spOwotICAgIHB0aHJlYWRfam9pbih3b3JrZXItPnRocmVhZF8sIE5VTEwpOwotICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmd29ya2VyLT5tdXRleF8pOwotICAgIHB0aHJlYWRfY29uZF9kZXN0cm95KCZ3b3JrZXItPmNvbmRpdGlvbl8pOwotI2Vsc2UKLSAgICB3b3JrZXItPnN0YXR1c18gPSBOT1RfT0s7Ci0jZW5kaWYKLSAgfQotICBTQl9EQ0hFQ0sod29ya2VyLT5zdGF0dXNfID09IE5PVF9PSyk7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvdGhyZWFkLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy90aHJlYWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNhNjFhNC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy90aHJlYWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBNdWx0aS10aHJlYWRlZCB3b3JrZXIKLS8vCi0vLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQotCi0jaWZuZGVmIFdFQlBfVVRJTFNfVEhSRUFEX0hfCi0jZGVmaW5lIFdFQlBfVVRJTFNfVEhSRUFEX0hfCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpZiBXRUJQX1VTRV9USFJFQUQKLQotI2lmIGRlZmluZWQoX1dJTjMyKQotCi0jaW5jbHVkZSA8d2luZG93cy5oPgotdHlwZWRlZiBIQU5ETEUgcHRocmVhZF90OwotdHlwZWRlZiBDUklUSUNBTF9TRUNUSU9OIHB0aHJlYWRfbXV0ZXhfdDsKLXR5cGVkZWYgc3RydWN0IHsKLSAgSEFORExFIHdhaXRpbmdfc2VtXzsKLSAgSEFORExFIHJlY2VpdmVkX3NlbV87Ci0gIEhBTkRMRSBzaWduYWxfZXZlbnRfOwotfSBwdGhyZWFkX2NvbmRfdDsKLQotI2Vsc2UKLQotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLQotI2VuZGlmICAgIC8qIF9XSU4zMiAqLwotI2VuZGlmICAgIC8qIFdFQlBfVVNFX1RIUkVBRCAqLwotCi0vLyBTdGF0ZSBvZiB0aGUgd29ya2VyIHRocmVhZCBvYmplY3QKLXR5cGVkZWYgZW51bSB7Ci0gIE5PVF9PSyA9IDAsICAgLy8gb2JqZWN0IGlzIHVudXNhYmxlCi0gIE9LLCAgICAgICAgICAgLy8gcmVhZHkgdG8gd29yawotICBXT1JLICAgICAgICAgIC8vIGJ1c3kgZmluaXNoaW5nIHRoZSBjdXJyZW50IHRhc2sKLX0gV2ViUFdvcmtlclN0YXR1czsKLQotLy8gRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJ5IHRoZSB3b3JrZXIgdGhyZWFkLiBUYWtlcyB0d28gb3BhcXVlIHBvaW50ZXJzIGFzCi0vLyBhcmd1bWVudHMgKGRhdGExIGFuZCBkYXRhMiksIGFuZCBzaG91bGQgcmV0dXJuIGZhbHNlIGluIGNhc2Ugb2YgZXJyb3IuCi10eXBlZGVmIGludCAoKldlYlBXb3JrZXJIb29rKSh2b2lkKiwgdm9pZCopOwotCi0vLyBTeW5jaHJvbml6ZSBvYmplY3QgdXNlZCB0byBsYXVuY2ggam9iIGluIHRoZSB3b3JrZXIgdGhyZWFkCi10eXBlZGVmIHN0cnVjdCB7Ci0jaWYgV0VCUF9VU0VfVEhSRUFECi0gIHB0aHJlYWRfbXV0ZXhfdCBtdXRleF87Ci0gIHB0aHJlYWRfY29uZF90ICBjb25kaXRpb25fOwotICBwdGhyZWFkX3QgICAgICAgdGhyZWFkXzsKLSNlbmRpZgotICBXZWJQV29ya2VyU3RhdHVzIHN0YXR1c187Ci0gIFdlYlBXb3JrZXJIb29rIGhvb2s7ICAgIC8vIGhvb2sgdG8gY2FsbAotICB2b2lkKiBkYXRhMTsgICAgICAgICAgICAvLyBmaXJzdCBhcmd1bWVudCBwYXNzZWQgdG8gJ2hvb2snCi0gIHZvaWQqIGRhdGEyOyAgICAgICAgICAgIC8vIHNlY29uZCBhcmd1bWVudCBwYXNzZWQgdG8gJ2hvb2snCi0gIGludCBoYWRfZXJyb3I7ICAgICAgICAgIC8vIHJldHVybiB2YWx1ZSBvZiB0aGUgbGFzdCBjYWxsIHRvICdob29rJwotfSBXZWJQV29ya2VyOwotCi0vLyBNdXN0IGJlIGNhbGxlZCBmaXJzdCwgYmVmb3JlIGFueSBvdGhlciBtZXRob2QuCi12b2lkIFdlYlBXb3JrZXJJbml0KFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlcik7Ci0vLyBNdXN0IGJlIGNhbGxlZCB0byBpbml0aWFsaXplIHRoZSBvYmplY3QgYW5kIHNwYXduIHRoZSB0aHJlYWQuIFJlLWVudHJhbnQuCi0vLyBXaWxsIHBvdGVudGlhbGx5IGxhdW5jaCB0aGUgdGhyZWFkLiBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgZXJyb3IuCi1pbnQgV2ViUFdvcmtlclJlc2V0KFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlcik7Ci0vLyBNYWtlcyBzdXJlIHRoZSBwcmV2aW91cyB3b3JrIGlzIGZpbmlzaGVkLiBSZXR1cm5zIHRydWUgaWYgd29ya2VyLT5oYWRfZXJyb3IKLS8vIHdhcyBub3Qgc2V0IGFuZCBubyBlcnJvciBjb25kaXRpb24gd2FzIHRyaWdnZXJlZCBieSB0aGUgd29ya2luZyB0aHJlYWQuCi1pbnQgV2ViUFdvcmtlclN5bmMoV2ViUFdvcmtlciogY29uc3Qgd29ya2VyKTsKLS8vIFRyaWdnZXJzIHRoZSB0aHJlYWQgdG8gY2FsbCBob29rKCkgd2l0aCBkYXRhMSBhbmQgZGF0YTIgYXJndW1lbnQuIFRoZXNlCi0vLyBob29rL2RhdGExL2RhdGEyIGNhbiBiZSBjaGFuZ2VkIGF0IGFueSB0aW1lIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24sCi0vLyBidXQgbm90IGJlIGNoYW5nZWQgYWZ0ZXJ3YXJkIHVudGlsIHRoZSBuZXh0IGNhbGwgdG8gV2ViUFdvcmtlclN5bmMoKS4KLXZvaWQgV2ViUFdvcmtlckxhdW5jaChXZWJQV29ya2VyKiBjb25zdCB3b3JrZXIpOwotLy8gS2lsbCB0aGUgdGhyZWFkIGFuZCB0ZXJtaW5hdGUgdGhlIG9iamVjdC4gVG8gdXNlIHRoZSBvYmplY3QgYWdhaW4sIG9uZQotLy8gbXVzdCBjYWxsIFdlYlBXb3JrZXJSZXNldCgpIGFnYWluLgotdm9pZCBXZWJQV29ya2VyRW5kKFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlcik7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgotCi0jZW5kaWYgIC8qIFdFQlBfVVRJTFNfVEhSRUFEX0hfICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy91dGlscy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvdXRpbHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk2OTdjMy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy91dGlscy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIE1pc2MuIGNvbW1vbiB1dGlsaXR5IGZ1bmN0aW9ucwotLy8KLS8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCi0KLSNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgotI2Vsc2UKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2luY2x1ZGUgIi4vdXRpbHMuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDaGVja2VkIG1lbW9yeSBhbGxvY2F0aW9uCi0KLS8vIFJldHVybnMgMCBpbiBjYXNlIG9mIG92ZXJmbG93IG9mIG5tZW1iICogc2l6ZS4KLXN0YXRpYyBpbnQgQ2hlY2tTaXplQXJndW1lbnRzT3ZlcmZsb3codWludDY0X3Qgbm1lbWIsIHNpemVfdCBzaXplKSB7Ci0gIGNvbnN0IHVpbnQ2NF90IHRvdGFsX3NpemUgPSBubWVtYiAqIHNpemU7Ci0gIGlmIChubWVtYiA9PSAwKSByZXR1cm4gMTsKLSAgaWYgKCh1aW50NjRfdClzaXplID4gV0VCUF9NQVhfQUxMT0NBQkxFX01FTU9SWSAvIG5tZW1iKSByZXR1cm4gMDsKLSAgaWYgKHRvdGFsX3NpemUgIT0gKHNpemVfdCl0b3RhbF9zaXplKSByZXR1cm4gMDsKLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQqIFdlYlBTYWZlTWFsbG9jKHVpbnQ2NF90IG5tZW1iLCBzaXplX3Qgc2l6ZSkgewotICBpZiAoIUNoZWNrU2l6ZUFyZ3VtZW50c092ZXJmbG93KG5tZW1iLCBzaXplKSkgcmV0dXJuIE5VTEw7Ci0gIFNCX0RDSEVDSyhubWVtYiAqIHNpemUgPiAwKTsKLSAgcmV0dXJuIFNiTWVtb3J5QWxsb2NhdGUoKHNpemVfdCkobm1lbWIgKiBzaXplKSk7Ci19Ci0KLXZvaWQqIFdlYlBTYWZlQ2FsbG9jKHVpbnQ2NF90IG5tZW1iLCBzaXplX3Qgc2l6ZSkgewotICBpZiAoIUNoZWNrU2l6ZUFyZ3VtZW50c092ZXJmbG93KG5tZW1iLCBzaXplKSkgcmV0dXJuIE5VTEw7Ci0gIFNCX0RDSEVDSyhubWVtYiAqIHNpemUgPiAwKTsKLSAgcmV0dXJuIFNiTWVtb3J5Q2FsbG9jKChzaXplX3Qpbm1lbWIsIHNpemUpOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL3V0aWxzLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy91dGlscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjVjMzM5Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL3V0aWxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gTWlzYy4gY29tbW9uIHV0aWxpdHkgZnVuY3Rpb25zCi0vLwotLy8gQXV0aG9yczogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCi0vLyAgICAgICAgICBVcnZhbmcgKHVydmFuZ0Bnb29nbGUuY29tKQotCi0jaWZuZGVmIFdFQlBfVVRJTFNfVVRJTFNfSF8KLSNkZWZpbmUgV0VCUF9VVElMU19VVElMU19IXwotCi0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2Vsc2UKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiLi4vd2VicC90eXBlcy5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE1lbW9yeSBhbGxvY2F0aW9uCi0KLS8vIFRoaXMgaXMgdGhlIG1heGltdW0gbWVtb3J5IGFtb3VudCB0aGF0IGxpYndlYnAgd2lsbCBldmVyIHRyeSB0byBhbGxvY2F0ZS4KLSNkZWZpbmUgV0VCUF9NQVhfQUxMT0NBQkxFX01FTU9SWSAoMVVMTCA8PCA0MCkKLQotLy8gc2l6ZS1jaGVja2luZyBzYWZlIG1hbGxvYy9jYWxsb2M6IHZlcmlmeSB0aGF0IHRoZSByZXF1ZXN0ZWQgc2l6ZSBpcyBub3QgdG9vCi0vLyBsYXJnZSwgb3IgcmV0dXJuIE5VTEwuIFlvdSBkb24ndCBuZWVkIHRvIGNhbGwgdGhlc2UgZm9yIGNvbnN0cnVjdHMgbGlrZQotLy8gbWFsbG9jKHNpemVvZihmb28pKSwgYnV0IG9ubHkgaWYgdGhlcmUncyBwaWN0dXJlLWRlcGVuZGVudCBzaXplIGludm9sdmVkCi0vLyBzb21ld2hlcmUgKGxpa2U6IG1hbGxvYyhudW1fcGl4ZWxzICogc2l6ZW9mKCpzb21ldGhpbmcpKSkuIFRoYXQncyB3aHkgdGhpcwotLy8gc2FmZSBtYWxsb2MoKSBib3Jyb3dzIHRoZSBzaWduYXR1cmUgZnJvbSBtYWxsb2MoKSwgcG9pbnRpbmcgYXQgdGhlIGRhbmdlcm91cwotLy8gdW5kZXJseWluZyBtdWx0aXBseSBpbnZvbHZlZC4KLXZvaWQqIFdlYlBTYWZlTWFsbG9jKHVpbnQ2NF90IG5tZW1iLCBzaXplX3Qgc2l6ZSk7Ci0vLyBOb3RlIHRoYXQgV2ViUFNhZmVDYWxsb2MoKSBleHBlY3RzIHRoZSBzZWNvbmQgYXJndW1lbnQgdHlwZSB0byBiZSAnc2l6ZV90JwotLy8gaW4gb3JkZXIgdG8gZmF2b3IgdGhlICJTYk1lbW9yeUNhbGxvYyhudW1fZm9vLCBzaXplb2YoZm9vKSkiIHBhdHRlcm4uCi12b2lkKiBXZWJQU2FmZUNhbGxvYyh1aW50NjRfdCBubWVtYiwgc2l6ZV90IHNpemUpOwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gUmVhZGluZy93cml0aW5nIGRhdGEuCi0KLS8vIFJlYWQgMTYsIDI0IG9yIDMyIGJpdHMgc3RvcmVkIGluIGxpdHRsZS1lbmRpYW4gb3JkZXIuCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IEdldExFMTYoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSkgewotICByZXR1cm4gKGludCkoZGF0YVswXSA8PCAwKSB8IChkYXRhWzFdIDw8IDgpOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IEdldExFMjQoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSkgewotICByZXR1cm4gR2V0TEUxNihkYXRhKSB8IChkYXRhWzJdIDw8IDE2KTsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IEdldExFMzIoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSkgewotICByZXR1cm4gKHVpbnQzMl90KUdldExFMTYoZGF0YSkgfCAoR2V0TEUxNihkYXRhICsgMikgPDwgMTYpOwotfQotCi0vLyBTdG9yZSAxNiwgMjQgb3IgMzIgYml0cyBpbiBsaXR0bGUtZW5kaWFuIG9yZGVyLgotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUHV0TEUxNih1aW50OF90KiBjb25zdCBkYXRhLCBpbnQgdmFsKSB7Ci0gIFNCX0RDSEVDSyh2YWwgPCAoMSA8PCAxNikpOwotICBkYXRhWzBdID0gKHZhbCA+PiAwKTsKLSAgZGF0YVsxXSA9ICh2YWwgPj4gOCk7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIFB1dExFMjQodWludDhfdCogY29uc3QgZGF0YSwgaW50IHZhbCkgewotICBTQl9EQ0hFQ0sodmFsIDwgKDEgPDwgMjQpKTsKLSAgUHV0TEUxNihkYXRhLCB2YWwgJiAweGZmZmYpOwotICBkYXRhWzJdID0gKHZhbCA+PiAxNik7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIFB1dExFMzIodWludDhfdCogY29uc3QgZGF0YSwgdWludDMyX3QgdmFsKSB7Ci0gIFB1dExFMTYoZGF0YSwgKGludCkodmFsICYgMHhmZmZmKSk7Ci0gIFB1dExFMTYoZGF0YSArIDIsIChpbnQpKHZhbCA+PiAxNikpOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKLQotI2VuZGlmICAvKiBXRUJQX1VUSUxTX1VUSUxTX0hfICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC93ZWJwL2RlY29kZS5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvd2VicC9kZWNvZGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ5OGI4Yy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC93ZWJwL2RlY29kZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDkwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDEwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyAgTWFpbiBkZWNvZGluZyBmdW5jdGlvbnMgZm9yIFdlYlAgaW1hZ2VzLgotLy8KLS8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCi0KLSNpZm5kZWYgV0VCUF9XRUJQX0RFQ09ERV9IXwotI2RlZmluZSBXRUJQX1dFQlBfREVDT0RFX0hfCi0KLSNpbmNsdWRlICIuL3R5cGVzLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jZGVmaW5lIFdFQlBfREVDT0RFUl9BQklfVkVSU0lPTiAweDAyMDEgICAgLy8gTUFKT1IoOGIpICsgTUlOT1IoOGIpCi0KLS8vIE5vdGU6IGZvcndhcmQgZGVjbGFyaW5nIGVudW1lcmF0aW9ucyBpcyBub3QgYWxsb3dlZCBpbiAoc3RyaWN0KSBDIGFuZCBDKyssCi0vLyB0aGUgdHlwZXMgYXJlIGxlZnQgaGVyZSBmb3IgcmVmZXJlbmNlLgotLy8gdHlwZWRlZiBlbnVtIFZQOFN0YXR1c0NvZGUgVlA4U3RhdHVzQ29kZTsKLS8vIHR5cGVkZWYgZW51bSBXRUJQX0NTUF9NT0RFIFdFQlBfQ1NQX01PREU7Ci10eXBlZGVmIHN0cnVjdCBXZWJQUkdCQUJ1ZmZlciBXZWJQUkdCQUJ1ZmZlcjsKLXR5cGVkZWYgc3RydWN0IFdlYlBZVVZBQnVmZmVyIFdlYlBZVVZBQnVmZmVyOwotdHlwZWRlZiBzdHJ1Y3QgV2ViUERlY0J1ZmZlciBXZWJQRGVjQnVmZmVyOwotdHlwZWRlZiBzdHJ1Y3QgV2ViUElEZWNvZGVyIFdlYlBJRGVjb2RlcjsKLXR5cGVkZWYgc3RydWN0IFdlYlBCaXRzdHJlYW1GZWF0dXJlcyBXZWJQQml0c3RyZWFtRmVhdHVyZXM7Ci10eXBlZGVmIHN0cnVjdCBXZWJQRGVjb2Rlck9wdGlvbnMgV2ViUERlY29kZXJPcHRpb25zOwotdHlwZWRlZiBzdHJ1Y3QgV2ViUERlY29kZXJDb25maWcgV2ViUERlY29kZXJDb25maWc7Ci0KLS8vIFJldHVybiB0aGUgZGVjb2RlcidzIHZlcnNpb24gbnVtYmVyLCBwYWNrZWQgaW4gaGV4YWRlY2ltYWwgdXNpbmcgOGJpdHMgZm9yCi0vLyBlYWNoIG9mIG1ham9yL21pbm9yL3JldmlzaW9uLiBFLmc6IHYyLjUuNyBpcyAweDAyMDUwNy4KLVdFQlBfRVhURVJOKGludCkgV2ViUEdldERlY29kZXJWZXJzaW9uKHZvaWQpOwotCi0vLyBSZXRyaWV2ZSBiYXNpYyBoZWFkZXIgaW5mb3JtYXRpb246IHdpZHRoLCBoZWlnaHQuCi0vLyBUaGlzIGZ1bmN0aW9uIHdpbGwgYWxzbyB2YWxpZGF0ZSB0aGUgaGVhZGVyIGFuZCByZXR1cm4gMCBpbgotLy8gY2FzZSBvZiBmb3JtYXR0aW5nIGVycm9yLgotLy8gUG9pbnRlcnMgJ3dpZHRoJyBhbmQgJ2hlaWdodCcgY2FuIGJlIHBhc3NlZCBOVUxMIGlmIGRlZW1lZCBpcnJlbGV2YW50LgotV0VCUF9FWFRFUk4oaW50KSBXZWJQR2V0SW5mbyhjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCk7Ci0KLS8vIERlY29kZXMgV2ViUCBpbWFnZXMgcG9pbnRlZCB0byBieSAnZGF0YScgYW5kIHJldHVybnMgUkdCQSBzYW1wbGVzLCBhbG9uZwotLy8gd2l0aCB0aGUgZGltZW5zaW9ucyBpbiAqd2lkdGggYW5kICpoZWlnaHQuIFRoZSBvcmRlcmluZyBvZiBzYW1wbGVzIGluCi0vLyBtZW1vcnkgaXMgUiwgRywgQiwgQSwgUiwgRywgQiwgQS4uLiBpbiBzY2FuIG9yZGVyIChlbmRpYW4taW5kZXBlbmRlbnQpLgotLy8gVGhlIHJldHVybmVkIHBvaW50ZXIgc2hvdWxkIGJlIGRlbGV0ZWQgY2FsbGluZyBmcmVlKCkuCi0vLyBSZXR1cm5zIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4KLVdFQlBfRVhURVJOKHVpbnQ4X3QqKSBXZWJQRGVjb2RlUkdCQShjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsIGludCogaGVpZ2h0KTsKLQotLy8gU2FtZSBhcyBXZWJQRGVjb2RlUkdCQSwgYnV0IHJldHVybmluZyBBLCBSLCBHLCBCLCBBLCBSLCBHLCBCLi4uIG9yZGVyZWQgZGF0YS4KLVdFQlBfRVhURVJOKHVpbnQ4X3QqKSBXZWJQRGVjb2RlQVJHQihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsIGludCogaGVpZ2h0KTsKLQotLy8gU2FtZSBhcyBXZWJQRGVjb2RlUkdCQSwgYnV0IHJldHVybmluZyBCLCBHLCBSLCBBLCBCLCBHLCBSLCBBLi4uIG9yZGVyZWQgZGF0YS4KLVdFQlBfRVhURVJOKHVpbnQ4X3QqKSBXZWJQRGVjb2RlQkdSQShjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsIGludCogaGVpZ2h0KTsKLQotLy8gU2FtZSBhcyBXZWJQRGVjb2RlUkdCQSwgYnV0IHJldHVybmluZyBSLCBHLCBCLCBSLCBHLCBCLi4uIG9yZGVyZWQgZGF0YS4KLS8vIElmIHRoZSBiaXRzdHJlYW0gY29udGFpbnMgdHJhbnNwYXJlbmN5LCBpdCBpcyBpZ25vcmVkLgotV0VCUF9FWFRFUk4odWludDhfdCopIFdlYlBEZWNvZGVSR0IoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsIGludCogaGVpZ2h0KTsKLQotLy8gU2FtZSBhcyBXZWJQRGVjb2RlUkdCLCBidXQgcmV0dXJuaW5nIEIsIEcsIFIsIEIsIEcsIFIuLi4gb3JkZXJlZCBkYXRhLgotV0VCUF9FWFRFUk4odWludDhfdCopIFdlYlBEZWNvZGVCR1IoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsIGludCogaGVpZ2h0KTsKLQotCi0vLyBEZWNvZGUgV2ViUCBpbWFnZXMgcG9pbnRlZCB0byBieSAnZGF0YScgdG8gWSdVViBmb3JtYXQoKikuIFRoZSBwb2ludGVyCi0vLyByZXR1cm5lZCBpcyB0aGUgWSBzYW1wbGVzIGJ1ZmZlci4gVXBvbiByZXR1cm4sICp1IGFuZCAqdiB3aWxsIHBvaW50IHRvCi0vLyB0aGUgVSBhbmQgViBjaHJvbWEgZGF0YS4gVGhlc2UgVSBhbmQgViBidWZmZXJzIG5lZWQgTk9UIGJlIGZyZWVkKCknZCwKLS8vIHVubGlrZSB0aGUgcmV0dXJuZWQgWSBsdW1hIG9uZS4gVGhlIGRpbWVuc2lvbiBvZiB0aGUgVSBhbmQgViBwbGFuZXMKLS8vIGFyZSBib3RoICgqd2lkdGggKyAxKSAvIDIgYW5kICgqaGVpZ2h0ICsgMSkvIDIuCi0vLyBVcG9uIHJldHVybiwgdGhlIFkgYnVmZmVyIGhhcyBhIHN0cmlkZSByZXR1cm5lZCBhcyAnKnN0cmlkZScsIHdoaWxlIFUgYW5kIFYKLS8vIGhhdmUgYSBjb21tb24gc3RyaWRlIHJldHVybmVkIGFzICcqdXZfc3RyaWRlJy4KLS8vIFJldHVybiBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuCi0vLyAoKikgQWxzbyBuYW1lZCBZJ0NiQ3IuIFNlZTogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9ZQ2JDcgotV0VCUF9FWFRFUk4odWludDhfdCopIFdlYlBEZWNvZGVZVVYoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsIGludCogaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIHUsIHVpbnQ4X3QqKiB2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBzdHJpZGUsIGludCogdXZfc3RyaWRlKTsKLQotLy8gVGhlc2UgZml2ZSBmdW5jdGlvbnMgYXJlIHZhcmlhbnRzIG9mIHRoZSBhYm92ZSBvbmVzLCB0aGF0IGRlY29kZSB0aGUgaW1hZ2UKLS8vIGRpcmVjdGx5IGludG8gYSBwcmUtYWxsb2NhdGVkIGJ1ZmZlciAnb3V0cHV0X2J1ZmZlcicuIFRoZSBtYXhpbXVtIHN0b3JhZ2UKLS8vIGF2YWlsYWJsZSBpbiB0aGlzIGJ1ZmZlciBpcyBpbmRpY2F0ZWQgYnkgJ291dHB1dF9idWZmZXJfc2l6ZScuIElmIHRoaXMKLS8vIHN0b3JhZ2UgaXMgbm90IHN1ZmZpY2llbnQgKG9yIGFuIGVycm9yIG9jY3VycmVkKSwgTlVMTCBpcyByZXR1cm5lZC4KLS8vIE90aGVyd2lzZSwgb3V0cHV0X2J1ZmZlciBpcyByZXR1cm5lZCwgZm9yIGNvbnZlbmllbmNlLgotLy8gVGhlIHBhcmFtZXRlciAnb3V0cHV0X3N0cmlkZScgc3BlY2lmaWVzIHRoZSBkaXN0YW5jZSAoaW4gYnl0ZXMpCi0vLyBiZXR3ZWVuIHNjYW5saW5lcy4gSGVuY2UsIG91dHB1dF9idWZmZXJfc2l6ZSBpcyBleHBlY3RlZCB0byBiZSBhdCBsZWFzdAotLy8gb3V0cHV0X3N0cmlkZSB4IHBpY3R1cmUtaGVpZ2h0LgotV0VCUF9FWFRFUk4odWludDhfdCopIFdlYlBEZWNvZGVSR0JBSW50bygKLSAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAotICAgIHVpbnQ4X3QqIG91dHB1dF9idWZmZXIsIHNpemVfdCBvdXRwdXRfYnVmZmVyX3NpemUsIGludCBvdXRwdXRfc3RyaWRlKTsKLVdFQlBfRVhURVJOKHVpbnQ4X3QqKSBXZWJQRGVjb2RlQVJHQkludG8oCi0gICAgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKLSAgICB1aW50OF90KiBvdXRwdXRfYnVmZmVyLCBzaXplX3Qgb3V0cHV0X2J1ZmZlcl9zaXplLCBpbnQgb3V0cHV0X3N0cmlkZSk7Ci1XRUJQX0VYVEVSTih1aW50OF90KikgV2ViUERlY29kZUJHUkFJbnRvKAotICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCi0gICAgdWludDhfdCogb3V0cHV0X2J1ZmZlciwgc2l6ZV90IG91dHB1dF9idWZmZXJfc2l6ZSwgaW50IG91dHB1dF9zdHJpZGUpOwotCi0vLyBSR0IgYW5kIEJHUiB2YXJpYW50cy4gSGVyZSB0b28gdGhlIHRyYW5zcGFyZW5jeSBpbmZvcm1hdGlvbiwgaWYgcHJlc2VudCwKLS8vIHdpbGwgYmUgZHJvcHBlZCBhbmQgaWdub3JlZC4KLVdFQlBfRVhURVJOKHVpbnQ4X3QqKSBXZWJQRGVjb2RlUkdCSW50bygKLSAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAotICAgIHVpbnQ4X3QqIG91dHB1dF9idWZmZXIsIHNpemVfdCBvdXRwdXRfYnVmZmVyX3NpemUsIGludCBvdXRwdXRfc3RyaWRlKTsKLVdFQlBfRVhURVJOKHVpbnQ4X3QqKSBXZWJQRGVjb2RlQkdSSW50bygKLSAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAotICAgIHVpbnQ4X3QqIG91dHB1dF9idWZmZXIsIHNpemVfdCBvdXRwdXRfYnVmZmVyX3NpemUsIGludCBvdXRwdXRfc3RyaWRlKTsKLQotLy8gV2ViUERlY29kZVlVVkludG8oKSBpcyBhIHZhcmlhbnQgb2YgV2ViUERlY29kZVlVVigpIHRoYXQgb3BlcmF0ZXMgZGlyZWN0bHkKLS8vIGludG8gcHJlLWFsbG9jYXRlZCBsdW1hL2Nocm9tYSBwbGFuZSBidWZmZXJzLiBUaGlzIGZ1bmN0aW9uIHJlcXVpcmVzIHRoZQotLy8gc3RyaWRlcyB0byBiZSBwYXNzZWQ6IG9uZSBmb3IgdGhlIGx1bWEgcGxhbmUgYW5kIG9uZSBmb3IgZWFjaCBvZiB0aGUKLS8vIGNocm9tYSBvbmVzLiBUaGUgc2l6ZSBvZiBlYWNoIHBsYW5lIGJ1ZmZlciBpcyBwYXNzZWQgYXMgJ2x1bWFfc2l6ZScsCi0vLyAndV9zaXplJyBhbmQgJ3Zfc2l6ZScgcmVzcGVjdGl2ZWx5LgotLy8gUG9pbnRlciB0byB0aGUgbHVtYSBwbGFuZSAoJypsdW1hJykgaXMgcmV0dXJuZWQgb3IgTlVMTCBpZiBhbiBlcnJvciBvY2N1cnJlZAotLy8gZHVyaW5nIGRlY29kaW5nIChvciBiZWNhdXNlIHNvbWUgYnVmZmVycyB3ZXJlIGZvdW5kIHRvIGJlIHRvbyBzbWFsbCkuCi1XRUJQX0VYVEVSTih1aW50OF90KikgV2ViUERlY29kZVlVVkludG8oCi0gICAgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKLSAgICB1aW50OF90KiBsdW1hLCBzaXplX3QgbHVtYV9zaXplLCBpbnQgbHVtYV9zdHJpZGUsCi0gICAgdWludDhfdCogdSwgc2l6ZV90IHVfc2l6ZSwgaW50IHVfc3RyaWRlLAotICAgIHVpbnQ4X3QqIHYsIHNpemVfdCB2X3NpemUsIGludCB2X3N0cmlkZSk7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBPdXRwdXQgY29sb3JzcGFjZXMgYW5kIGJ1ZmZlcgotCi0vLyBDb2xvcnNwYWNlcwotLy8gTm90ZTogdGhlIG5hbWluZyBkZXNjcmliZXMgdGhlIGJ5dGUtb3JkZXJpbmcgb2YgcGFja2VkIHNhbXBsZXMgaW4gbWVtb3J5LgotLy8gRm9yIGluc3RhbmNlLCBNT0RFX0JHUkEgcmVsYXRlcyB0byBzYW1wbGVzIG9yZGVyZWQgYXMgQixHLFIsQSxCLEcsUixBLC4uLgotLy8gTm9uLWNhcGl0YWwgbmFtZXMgKGUuZy46TU9ERV9BcmdiKSByZWxhdGVzIHRvIHByZS1tdWx0aXBsaWVkIFJHQiBjaGFubmVscy4KLS8vIFJHQkEtNDQ0NCBhbmQgUkdCLTU2NSBjb2xvcnNwYWNlcyBhcmUgcmVwcmVzZW50ZWQgYnkgZm9sbG93aW5nIGJ5dGUtb3JkZXI6Ci0vLyBSR0JBLTQ0NDQ6IFtyMyByMiByMSByMCBnMyBnMiBnMSBnMF0sIFtiMyBiMiBiMSBiMCBhMyBhMiBhMSBhMF0sIC4uLgotLy8gUkdCLTU2NTogW3I0IHIzIHIyIHIxIHIwIGc1IGc0IGczXSwgW2cyIGcxIGcwIGI0IGIzIGIyIGIxIGIwXSwgLi4uCi0vLyBJbiB0aGUgY2FzZSBXRUJQX1NXQVBfMTZCSVRTX0NTUCBpcyBkZWZpbmVkLCB0aGUgYnl0ZXMgYXJlIHN3YXBwZWQgZm9yCi0vLyB0aGVzZSB0d28gbW9kZXM6Ci0vLyBSR0JBLTQ0NDQ6IFtiMyBiMiBiMSBiMCBhMyBhMiBhMSBhMF0sIFtyMyByMiByMSByMCBnMyBnMiBnMSBnMF0sIC4uLgotLy8gUkdCLTU2NTogW2cyIGcxIGcwIGI0IGIzIGIyIGIxIGIwXSwgW3I0IHIzIHIyIHIxIHIwIGc1IGc0IGczXSwgLi4uCi0KLXR5cGVkZWYgZW51bSBXRUJQX0NTUF9NT0RFIHsKLSAgTU9ERV9SR0IgPSAwLCBNT0RFX1JHQkEgPSAxLAotICBNT0RFX0JHUiA9IDIsIE1PREVfQkdSQSA9IDMsCi0gIE1PREVfQVJHQiA9IDQsIE1PREVfUkdCQV80NDQ0ID0gNSwKLSAgTU9ERV9SR0JfNTY1ID0gNiwKLSAgLy8gUkdCLXByZW11bHRpcGxpZWQgdHJhbnNwYXJlbnQgbW9kZXMgKGFscGhhIHZhbHVlIGlzIHByZXNlcnZlZCkKLSAgTU9ERV9yZ2JBID0gNywKLSAgTU9ERV9iZ3JBID0gOCwKLSAgTU9ERV9BcmdiID0gOSwKLSAgTU9ERV9yZ2JBXzQ0NDQgPSAxMCwKLSAgLy8gWVVWIG1vZGVzIG11c3QgY29tZSBhZnRlciBSR0Igb25lcy4KLSAgTU9ERV9ZVVYgPSAxMSwgTU9ERV9ZVVZBID0gMTIsICAvLyB5dXYgNDoyOjAKLSAgTU9ERV9MQVNUID0gMTMKLX0gV0VCUF9DU1BfTU9ERTsKLQotLy8gU29tZSB1c2VmdWwgbWFjcm9zOgotc3RhdGljIFdFQlBfSU5MSU5FIGludCBXZWJQSXNQcmVtdWx0aXBsaWVkTW9kZShXRUJQX0NTUF9NT0RFIG1vZGUpIHsKLSAgcmV0dXJuIChtb2RlID09IE1PREVfcmdiQSB8fCBtb2RlID09IE1PREVfYmdyQSB8fCBtb2RlID09IE1PREVfQXJnYiB8fAotICAgICAgICAgIG1vZGUgPT0gTU9ERV9yZ2JBXzQ0NDQpOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IFdlYlBJc0FscGhhTW9kZShXRUJQX0NTUF9NT0RFIG1vZGUpIHsKLSAgcmV0dXJuIChtb2RlID09IE1PREVfUkdCQSB8fCBtb2RlID09IE1PREVfQkdSQSB8fCBtb2RlID09IE1PREVfQVJHQiB8fAotICAgICAgICAgIG1vZGUgPT0gTU9ERV9SR0JBXzQ0NDQgfHwgbW9kZSA9PSBNT0RFX1lVVkEgfHwKLSAgICAgICAgICBXZWJQSXNQcmVtdWx0aXBsaWVkTW9kZShtb2RlKSk7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgV2ViUElzUkdCTW9kZShXRUJQX0NTUF9NT0RFIG1vZGUpIHsKLSAgcmV0dXJuIChtb2RlIDwgTU9ERV9ZVVYpOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gV2ViUERlY0J1ZmZlcjogR2VuZXJpYyBzdHJ1Y3R1cmUgZm9yIGRlc2NyaWJpbmcgdGhlIG91dHB1dCBzYW1wbGUgYnVmZmVyLgotCi1zdHJ1Y3QgV2ViUFJHQkFCdWZmZXIgeyAgICAvLyB2aWV3IGFzIFJHQkEKLSAgdWludDhfdCogcmdiYTsgICAgLy8gcG9pbnRlciB0byBSR0JBIHNhbXBsZXMKLSAgaW50IHN0cmlkZTsgICAgICAgLy8gc3RyaWRlIGluIGJ5dGVzIGZyb20gb25lIHNjYW5saW5lIHRvIHRoZSBuZXh0LgotICBzaXplX3Qgc2l6ZTsgICAgICAvLyB0b3RhbCBzaXplIG9mIHRoZSAqcmdiYSBidWZmZXIuCi19OwotCi1zdHJ1Y3QgV2ViUFlVVkFCdWZmZXIgeyAgICAgICAgICAgICAgLy8gdmlldyBhcyBZVVZBCi0gIHVpbnQ4X3QqIHksICp1LCAqdiwgKmE7ICAgICAvLyBwb2ludGVyIHRvIGx1bWEsIGNocm9tYSBVL1YsIGFscGhhIHNhbXBsZXMKLSAgaW50IHlfc3RyaWRlOyAgICAgICAgICAgICAgIC8vIGx1bWEgc3RyaWRlCi0gIGludCB1X3N0cmlkZSwgdl9zdHJpZGU7ICAgICAvLyBjaHJvbWEgc3RyaWRlcwotICBpbnQgYV9zdHJpZGU7ICAgICAgICAgICAgICAgLy8gYWxwaGEgc3RyaWRlCi0gIHNpemVfdCB5X3NpemU7ICAgICAgICAgICAgICAvLyBsdW1hIHBsYW5lIHNpemUKLSAgc2l6ZV90IHVfc2l6ZSwgdl9zaXplOyAgICAgIC8vIGNocm9tYSBwbGFuZXMgc2l6ZQotICBzaXplX3QgYV9zaXplOyAgICAgICAgICAgICAgLy8gYWxwaGEtcGxhbmUgc2l6ZQotfTsKLQotLy8gT3V0cHV0IGJ1ZmZlcgotc3RydWN0IFdlYlBEZWNCdWZmZXIgewotICBXRUJQX0NTUF9NT0RFIGNvbG9yc3BhY2U7ICAvLyBDb2xvcnNwYWNlLgotICBpbnQgd2lkdGgsIGhlaWdodDsgICAgICAgICAvLyBEaW1lbnNpb25zLgotICBpbnQgaXNfZXh0ZXJuYWxfbWVtb3J5OyAgICAvLyBJZiB0cnVlLCAnaW50ZXJuYWxfbWVtb3J5JyBwb2ludGVyIGlzIG5vdCB1c2VkLgotICB1bmlvbiB7Ci0gICAgV2ViUFJHQkFCdWZmZXIgUkdCQTsKLSAgICBXZWJQWVVWQUJ1ZmZlciBZVVZBOwotICB9IHU7ICAgICAgICAgICAgICAgICAgICAgICAvLyBOYW1lbGVzcyB1bmlvbiBvZiBidWZmZXIgcGFyYW1ldGVycy4KLSAgdWludDMyX3QgICAgICAgcGFkWzRdOyAgICAgLy8gcGFkZGluZyBmb3IgbGF0ZXIgdXNlCi0KLSAgdWludDhfdCogcHJpdmF0ZV9tZW1vcnk7ICAgLy8gSW50ZXJuYWxseSBhbGxvY2F0ZWQgbWVtb3J5IChvbmx5IHdoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXNfZXh0ZXJuYWxfbWVtb3J5IGlzIGZhbHNlKS4gU2hvdWxkIG5vdCBiZSB1c2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4dGVybmFsbHksIGJ1dCBhY2Nlc3NlZCB2aWEgdGhlIGJ1ZmZlciB1bmlvbi4KLX07Ci0KLS8vIEludGVybmFsLCB2ZXJzaW9uLWNoZWNrZWQsIGVudHJ5IHBvaW50Ci1XRUJQX0VYVEVSTihpbnQpIFdlYlBJbml0RGVjQnVmZmVySW50ZXJuYWwoV2ViUERlY0J1ZmZlciosIGludCk7Ci0KLS8vIEluaXRpYWxpemUgdGhlIHN0cnVjdHVyZSBhcyBlbXB0eS4gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSBvdGhlciB1c2UuCi0vLyBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgdmVyc2lvbiBtaXNtYXRjaAotc3RhdGljIFdFQlBfSU5MSU5FIGludCBXZWJQSW5pdERlY0J1ZmZlcihXZWJQRGVjQnVmZmVyKiBidWZmZXIpIHsKLSAgcmV0dXJuIFdlYlBJbml0RGVjQnVmZmVySW50ZXJuYWwoYnVmZmVyLCBXRUJQX0RFQ09ERVJfQUJJX1ZFUlNJT04pOwotfQotCi0vLyBGcmVlIGFueSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBidWZmZXIuIE11c3QgYWx3YXlzIGJlIGNhbGxlZCBsYXN0LgotLy8gTm90ZTogZG9lc24ndCBmcmVlIHRoZSAnYnVmZmVyJyBzdHJ1Y3R1cmUgaXRzZWxmLgotV0VCUF9FWFRFUk4odm9pZCkgV2ViUEZyZWVEZWNCdWZmZXIoV2ViUERlY0J1ZmZlciogYnVmZmVyKTsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEVudW1lcmF0aW9uIG9mIHRoZSBzdGF0dXMgY29kZXMKLQotdHlwZWRlZiBlbnVtIFZQOFN0YXR1c0NvZGUgewotICBWUDhfU1RBVFVTX09LID0gMCwKLSAgVlA4X1NUQVRVU19PVVRfT0ZfTUVNT1JZLAotICBWUDhfU1RBVFVTX0lOVkFMSURfUEFSQU0sCi0gIFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SLAotICBWUDhfU1RBVFVTX1VOU1VQUE9SVEVEX0ZFQVRVUkUsCi0gIFZQOF9TVEFUVVNfU1VTUEVOREVELAotICBWUDhfU1RBVFVTX1VTRVJfQUJPUlQsCi0gIFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBCi19IFZQOFN0YXR1c0NvZGU7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBJbmNyZW1lbnRhbCBkZWNvZGluZwotLy8KLS8vIFRoaXMgQVBJIGFsbG93cyBzdHJlYW1saW5lZCBkZWNvZGluZyBvZiBwYXJ0aWFsIGRhdGEuCi0vLyBQaWN0dXJlIGNhbiBiZSBpbmNyZW1lbnRhbGx5IGRlY29kZWQgYXMgZGF0YSBiZWNvbWUgYXZhaWxhYmxlIHRoYW5rcyB0byB0aGUKLS8vIFdlYlBJRGVjb2RlciBvYmplY3QuIFRoaXMgb2JqZWN0IGNhbiBiZSBsZWZ0IGluIGEgU1VTUEVOREVEIHN0YXRlIGlmIHRoZQotLy8gcGljdHVyZSBpcyBvbmx5IHBhcnRpYWxseSBkZWNvZGVkLCBwZW5kaW5nIGFkZGl0aW9uYWwgaW5wdXQuCi0vLyBDb2RlIGV4YW1wbGU6Ci0vLwotLy8gICBXZWJQSW5pdERlY0J1ZmZlcigmYnVmZmVyKTsKLS8vICAgYnVmZmVyLmNvbG9yc3BhY2UgPSBtb2RlOwotLy8gICAuLi4KLS8vICAgV2ViUElEZWNvZGVyKiBpZGVjID0gV2ViUElOZXdEZWNvZGVyKCZidWZmZXIpOwotLy8gICB3aGlsZSAoaGFzX21vcmVfZGF0YSkgewotLy8gICAgIC8vIC4uLiAoZ2V0IGFkZGl0aW9uYWwgZGF0YSkKLS8vICAgICBzdGF0dXMgPSBXZWJQSUFwcGVuZChpZGVjLCBuZXdfZGF0YSwgbmV3X2RhdGFfc2l6ZSk7Ci0vLyAgICAgaWYgKHN0YXR1cyAhPSBWUDhfU1RBVFVTX1NVU1BFTkRFRCB8fAotLy8gICAgICAgYnJlYWs7Ci0vLyAgICAgfQotLy8KLS8vICAgICAvLyBUaGUgYWJvdmUgY2FsbCBkZWNvZGVzIHRoZSBjdXJyZW50IGF2YWlsYWJsZSBidWZmZXIuCi0vLyAgICAgLy8gUGFydCBvZiB0aGUgaW1hZ2UgY2FuIG5vdyBiZSByZWZyZXNoZWQgYnkgY2FsbGluZyB0bwotLy8gICAgIC8vIFdlYlBJRGVjR2V0UkdCKCkvV2ViUElEZWNHZXRZVVZBKCkgZXRjLgotLy8gICB9Ci0vLyAgIFdlYlBJRGVsZXRlKGlkZWMpOwotCi0vLyBDcmVhdGVzIGEgbmV3IGluY3JlbWVudGFsIGRlY29kZXIgd2l0aCB0aGUgc3VwcGxpZWQgYnVmZmVyIHBhcmFtZXRlci4KLS8vIFRoaXMgb3V0cHV0X2J1ZmZlciBjYW4gYmUgcGFzc2VkIE5VTEwsIGluIHdoaWNoIGNhc2UgYSBkZWZhdWx0IG91dHB1dCBidWZmZXIKLS8vIGlzIHVzZWQgKHdpdGggTU9ERV9SR0IpLiBPdGhlcndpc2UsIGFuIGludGVybmFsIHJlZmVyZW5jZSB0byAnb3V0cHV0X2J1ZmZlcicKLS8vIGlzIGtlcHQsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGxpZmVzcGFuIG9mICdvdXRwdXRfYnVmZmVyJyBtdXN0IGJlIGxhcmdlciB0aGFuCi0vLyB0aGF0IG9mIHRoZSByZXR1cm5lZCBXZWJQSURlY29kZXIgb2JqZWN0LgotLy8gVGhlIHN1cHBsaWVkICdvdXRwdXRfYnVmZmVyJyBjb250ZW50IE1VU1QgTk9UIGJlIGNoYW5nZWQgYmV0d2VlbiBjYWxscyB0bwotLy8gV2ViUElBcHBlbmQoKSBvciBXZWJQSVVwZGF0ZSgpIHVubGVzcyAnb3V0cHV0X2J1ZmZlci5pc19leHRlcm5hbF9tZW1vcnknIGlzCi0vLyBzZXQgdG8gMS4gSW4gc3VjaCBhIGNhc2UsIGl0IGlzIGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSBwb2ludGVycywgc2l6ZSBhbmQKLS8vIHN0cmlkZSBvZiBvdXRwdXRfYnVmZmVyLnUuUkdCQSBvciBvdXRwdXRfYnVmZmVyLnUuWVVWQSwgcHJvdmlkZWQgdGhleSByZW1haW4KLS8vIHdpdGhpbiB2YWxpZCBib3VuZHMuCi0vLyBBbGwgb3RoZXIgZmllbGRzIG9mIFdlYlBEZWNCdWZmZXIgTVVTVCByZW1haW4gY29uc3RhbnQgYmV0d2VlbiBjYWxscy4KLS8vIFJldHVybnMgTlVMTCBpZiB0aGUgYWxsb2NhdGlvbiBmYWlsZWQuCi1XRUJQX0VYVEVSTihXZWJQSURlY29kZXIqKSBXZWJQSU5ld0RlY29kZXIoV2ViUERlY0J1ZmZlciogb3V0cHV0X2J1ZmZlcik7Ci0KLS8vIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIGFuZCBpbml0aWFsaXplcyBhbiBpbmNyZW1lbnRhbC1kZWNvZGVyIG9iamVjdCwgd2hpY2gKLS8vIHdpbGwgb3V0cHV0IHRoZSBSR0IvQSBzYW1wbGVzIHNwZWNpZmllZCBieSAnY3NwJyBpbnRvIGEgcHJlYWxsb2NhdGVkCi0vLyBidWZmZXIgJ291dHB1dF9idWZmZXInLiBUaGUgc2l6ZSBvZiB0aGlzIGJ1ZmZlciBpcyBhdCBsZWFzdAotLy8gJ291dHB1dF9idWZmZXJfc2l6ZScgYW5kIHRoZSBzdHJpZGUgKGRpc3RhbmNlIGluIGJ5dGVzIGJldHdlZW4gdHdvIHNjYW5saW5lcykKLS8vIGlzIHNwZWNpZmllZCBieSAnb3V0cHV0X3N0cmlkZScuCi0vLyBBZGRpdGlvbmFsbHksIG91dHB1dF9idWZmZXIgY2FuIGJlIHBhc3NlZCBOVUxMIGluIHdoaWNoIGNhc2UgdGhlIG91dHB1dAotLy8gYnVmZmVyIHdpbGwgYmUgYWxsb2NhdGVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgZGVjb2Rpbmcgc3RhcnRzLiBUaGUKLS8vIGNvbG9yc3BhY2UgJ2NzcCcgaXMgdGFrZW4gaW50byBhY2NvdW50IGZvciBhbGxvY2F0aW5nIHRoaXMgYnVmZmVyLiBBbGwgb3RoZXIKLS8vIHBhcmFtZXRlcnMgYXJlIGlnbm9yZWQuCi0vLyBSZXR1cm5zIE5VTEwgaWYgdGhlIGFsbG9jYXRpb24gZmFpbGVkLCBvciBpZiBzb21lIHBhcmFtZXRlcnMgYXJlIGludmFsaWQuCi1XRUJQX0VYVEVSTihXZWJQSURlY29kZXIqKSBXZWJQSU5ld1JHQigKLSAgICBXRUJQX0NTUF9NT0RFIGNzcCwKLSAgICB1aW50OF90KiBvdXRwdXRfYnVmZmVyLCBzaXplX3Qgb3V0cHV0X2J1ZmZlcl9zaXplLCBpbnQgb3V0cHV0X3N0cmlkZSk7Ci0KLS8vIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIGFuZCBpbml0aWFsaXplcyBhbiBpbmNyZW1lbnRhbC1kZWNvZGVyIG9iamVjdCwgd2hpY2gKLS8vIHdpbGwgb3V0cHV0IHRoZSByYXcgbHVtYS9jaHJvbWEgc2FtcGxlcyBpbnRvIGEgcHJlYWxsb2NhdGVkIHBsYW5lcyBpZgotLy8gc3VwcGxpZWQuIFRoZSBsdW1hIHBsYW5lIGlzIHNwZWNpZmllZCBieSBpdHMgcG9pbnRlciAnbHVtYScsIGl0cyBzaXplCi0vLyAnbHVtYV9zaXplJyBhbmQgaXRzIHN0cmlkZSAnbHVtYV9zdHJpZGUnLiBTaW1pbGFybHksIHRoZSBjaHJvbWEtdSBwbGFuZQotLy8gaXMgc3BlY2lmaWVkIGJ5IHRoZSAndScsICd1X3NpemUnIGFuZCAndV9zdHJpZGUnIHBhcmFtZXRlcnMsIGFuZCB0aGUgY2hyb21hLXYKLS8vIHBsYW5lIGJ5ICd2JyBhbmQgJ3Zfc2l6ZScuIEFuZCBzYW1lIGZvciB0aGUgYWxwaGEtcGxhbmUuIFRoZSAnYScgcG9pbnRlcgotLy8gY2FuIGJlIHBhc3MgTlVMTCBpbiBjYXNlIG9uZSBpcyBub3QgaW50ZXJlc3RlZCBpbiB0aGUgdHJhbnNwYXJlbmN5IHBsYW5lLgotLy8gQ29udmVyc2VseSwgJ2x1bWEnIGNhbiBiZSBwYXNzZWQgTlVMTCBpZiBubyBwcmVhbGxvY2F0ZWQgcGxhbmVzIGFyZSBzdXBwbGllZC4KLS8vIEluIHRoaXMgY2FzZSwgdGhlIG91dHB1dCBidWZmZXIgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGFsbG9jYXRlZCAodXNpbmcKLS8vIE1PREVfWVVWQSkgd2hlbiBkZWNvZGluZyBzdGFydHMuIEFsbCBwYXJhbWV0ZXJzIGFyZSB0aGVuIGlnbm9yZWQuCi0vLyBSZXR1cm5zIE5VTEwgaWYgdGhlIGFsbG9jYXRpb24gZmFpbGVkIG9yIGlmIGEgcGFyYW1ldGVyIGlzIGludmFsaWQuCi1XRUJQX0VYVEVSTihXZWJQSURlY29kZXIqKSBXZWJQSU5ld1lVVkEoCi0gICAgdWludDhfdCogbHVtYSwgc2l6ZV90IGx1bWFfc2l6ZSwgaW50IGx1bWFfc3RyaWRlLAotICAgIHVpbnQ4X3QqIHUsIHNpemVfdCB1X3NpemUsIGludCB1X3N0cmlkZSwKLSAgICB1aW50OF90KiB2LCBzaXplX3Qgdl9zaXplLCBpbnQgdl9zdHJpZGUsCi0gICAgdWludDhfdCogYSwgc2l6ZV90IGFfc2l6ZSwgaW50IGFfc3RyaWRlKTsKLQotLy8gRGVwcmVjYXRlZCB2ZXJzaW9uIG9mIHRoZSBhYm92ZSwgd2l0aG91dCB0aGUgYWxwaGEgcGxhbmUuCi0vLyBLZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgotV0VCUF9FWFRFUk4oV2ViUElEZWNvZGVyKikgV2ViUElOZXdZVVYoCi0gICAgdWludDhfdCogbHVtYSwgc2l6ZV90IGx1bWFfc2l6ZSwgaW50IGx1bWFfc3RyaWRlLAotICAgIHVpbnQ4X3QqIHUsIHNpemVfdCB1X3NpemUsIGludCB1X3N0cmlkZSwKLSAgICB1aW50OF90KiB2LCBzaXplX3Qgdl9zaXplLCBpbnQgdl9zdHJpZGUpOwotCi0vLyBEZWxldGVzIHRoZSBXZWJQSURlY29kZXIgb2JqZWN0IGFuZCBhc3NvY2lhdGVkIG1lbW9yeS4gTXVzdCBhbHdheXMgYmUgY2FsbGVkCi0vLyBpZiBXZWJQSU5ld0RlY29kZXIsIFdlYlBJTmV3UkdCIG9yIFdlYlBJTmV3WVVWIHN1Y2NlZWRlZC4KLVdFQlBfRVhURVJOKHZvaWQpIFdlYlBJRGVsZXRlKFdlYlBJRGVjb2RlciogaWRlYyk7Ci0KLS8vIENvcGllcyBhbmQgZGVjb2RlcyB0aGUgbmV4dCBhdmFpbGFibGUgZGF0YS4gUmV0dXJucyBWUDhfU1RBVFVTX09LIHdoZW4KLS8vIHRoZSBpbWFnZSBpcyBzdWNjZXNzZnVsbHkgZGVjb2RlZC4gUmV0dXJucyBWUDhfU1RBVFVTX1NVU1BFTkRFRCB3aGVuIG1vcmUKLS8vIGRhdGEgaXMgZXhwZWN0ZWQuIFJldHVybnMgZXJyb3IgaW4gb3RoZXIgY2FzZXMuCi1XRUJQX0VYVEVSTihWUDhTdGF0dXNDb2RlKSBXZWJQSUFwcGVuZCgKLSAgICBXZWJQSURlY29kZXIqIGlkZWMsIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUpOwotCi0vLyBBIHZhcmlhbnQgb2YgdGhlIGFib3ZlIGZ1bmN0aW9uIHRvIGJlIHVzZWQgd2hlbiBkYXRhIGJ1ZmZlciBjb250YWlucwotLy8gcGFydGlhbCBkYXRhIGZyb20gdGhlIGJlZ2lubmluZy4gSW4gdGhpcyBjYXNlIGRhdGEgYnVmZmVyIGlzIG5vdCBjb3BpZWQKLS8vIHRvIHRoZSBpbnRlcm5hbCBtZW1vcnkuCi0vLyBOb3RlIHRoYXQgdGhlIHZhbHVlIG9mIHRoZSAnZGF0YScgcG9pbnRlciBjYW4gY2hhbmdlIGJldHdlZW4gY2FsbHMgdG8KLS8vIFdlYlBJVXBkYXRlLCBmb3IgaW5zdGFuY2Ugd2hlbiB0aGUgZGF0YSBidWZmZXIgaXMgcmVzaXplZCB0byBmaXQgbGFyZ2VyIGRhdGEuCi1XRUJQX0VYVEVSTihWUDhTdGF0dXNDb2RlKSBXZWJQSVVwZGF0ZSgKLSAgICBXZWJQSURlY29kZXIqIGlkZWMsIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUpOwotCi0vLyBSZXR1cm5zIHRoZSBSR0IvQSBpbWFnZSBkZWNvZGVkIHNvIGZhci4gUmV0dXJucyBOVUxMIGlmIG91dHB1dCBwYXJhbXMKLS8vIGFyZSBub3QgaW5pdGlhbGl6ZWQgeWV0LiBUaGUgUkdCL0Egb3V0cHV0IHR5cGUgY29ycmVzcG9uZHMgdG8gdGhlIGNvbG9yc3BhY2UKLS8vIHNwZWNpZmllZCBkdXJpbmcgY2FsbCB0byBXZWJQSU5ld0RlY29kZXIoKSBvciBXZWJQSU5ld1JHQigpLgotLy8gKmxhc3RfeSBpcyB0aGUgaW5kZXggb2YgbGFzdCBkZWNvZGVkIHJvdyBpbiByYXN0ZXIgc2NhbiBvcmRlci4gU29tZSBwb2ludGVycwotLy8gKCpsYXN0X3ksICp3aWR0aCBldGMuKSBjYW4gYmUgTlVMTCBpZiBjb3JyZXNwb25kaW5nIGluZm9ybWF0aW9uIGlzIG5vdAotLy8gbmVlZGVkLgotV0VCUF9FWFRFUk4odWludDhfdCopIFdlYlBJRGVjR2V0UkdCKAotICAgIGNvbnN0IFdlYlBJRGVjb2RlciogaWRlYywgaW50KiBsYXN0X3ksCi0gICAgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQsIGludCogc3RyaWRlKTsKLQotLy8gU2FtZSBhcyBhYm92ZSBmdW5jdGlvbiB0byBnZXQgYSBZVVZBIGltYWdlLiBSZXR1cm5zIHBvaW50ZXIgdG8gdGhlIGx1bWEKLS8vIHBsYW5lIG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4gSWYgdGhlcmUgaXMgbm8gYWxwaGEgaW5mb3JtYXRpb24KLS8vIHRoZSBhbHBoYSBwb2ludGVyICcqYScgd2lsbCBiZSByZXR1cm5lZCBOVUxMLgotV0VCUF9FWFRFUk4odWludDhfdCopIFdlYlBJRGVjR2V0WVVWQSgKLSAgICBjb25zdCBXZWJQSURlY29kZXIqIGlkZWMsIGludCogbGFzdF95LAotICAgIHVpbnQ4X3QqKiB1LCB1aW50OF90KiogdiwgdWludDhfdCoqIGEsCi0gICAgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQsIGludCogc3RyaWRlLCBpbnQqIHV2X3N0cmlkZSwgaW50KiBhX3N0cmlkZSk7Ci0KLS8vIERlcHJlY2F0ZWQgYWxwaGEtbGVzcyB2ZXJzaW9uIG9mIFdlYlBJRGVjR2V0WVVWQSgpOiBpdCB3aWxsIGlnbm9yZSB0aGUKLS8vIGFscGhhIGluZm9ybWF0aW9uIChpZiBwcmVzZW50KS4gS2VwdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KLXN0YXRpYyBXRUJQX0lOTElORSB1aW50OF90KiBXZWJQSURlY0dldFlVVigKLSAgICBjb25zdCBXZWJQSURlY29kZXIqIGlkZWMsIGludCogbGFzdF95LCB1aW50OF90KiogdSwgdWludDhfdCoqIHYsCi0gICAgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQsIGludCogc3RyaWRlLCBpbnQqIHV2X3N0cmlkZSkgewotICByZXR1cm4gV2ViUElEZWNHZXRZVVZBKGlkZWMsIGxhc3RfeSwgdSwgdiwgTlVMTCwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIHV2X3N0cmlkZSwgTlVMTCk7Ci19Ci0KLS8vIEdlbmVyaWMgY2FsbCB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGlzcGxheWFibGUgYXJlYS4KLS8vIElmIG5vbiBOVUxMLCB0aGUgbGVmdC9yaWdodC93aWR0aC9oZWlnaHQgcG9pbnRlcnMgYXJlIGZpbGxlZCB3aXRoIHRoZSB2aXNpYmxlCi0vLyByZWN0YW5ndWxhciBhcmVhIHNvIGZhci4KLS8vIFJldHVybnMgTlVMTCBpbiBjYXNlIHRoZSBpbmNyZW1lbnRhbCBkZWNvZGVyIG9iamVjdCBpcyBpbiBhbiBpbnZhbGlkIHN0YXRlLgotLy8gT3RoZXJ3aXNlIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uLiBUaGlzIHN0cnVjdHVyZQotLy8gaXMgcmVhZC1vbmx5LCB0aWVkIHRvIFdlYlBJRGVjb2RlcidzIGxpZmVzcGFuIGFuZCBzaG91bGQgbm90IGJlIG1vZGlmaWVkLgotV0VCUF9FWFRFUk4oY29uc3QgV2ViUERlY0J1ZmZlciopIFdlYlBJRGVjb2RlZEFyZWEoCi0gICAgY29uc3QgV2ViUElEZWNvZGVyKiBpZGVjLCBpbnQqIGxlZnQsIGludCogdG9wLCBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCk7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBBZHZhbmNlZCBkZWNvZGluZyBwYXJhbWV0cml6YXRpb24KLS8vCi0vLyAgQ29kZSBzYW1wbGUgZm9yIHVzaW5nIHRoZSBhZHZhbmNlZCBkZWNvZGluZyBBUEkKLS8qCi0gICAgIC8vIEEpIEluaXQgYSBjb25maWd1cmF0aW9uIG9iamVjdAotICAgICBXZWJQRGVjb2RlckNvbmZpZyBjb25maWc7Ci0gICAgIENIRUNLKFdlYlBJbml0RGVjb2RlckNvbmZpZygmY29uZmlnKSk7Ci0KLSAgICAgLy8gQikgb3B0aW9uYWw6IHJldHJpZXZlIHRoZSBiaXRzdHJlYW0ncyBmZWF0dXJlcy4KLSAgICAgQ0hFQ0soV2ViUEdldEZlYXR1cmVzKGRhdGEsIGRhdGFfc2l6ZSwgJmNvbmZpZy5pbnB1dCkgPT0gVlA4X1NUQVRVU19PSyk7Ci0KLSAgICAgLy8gQykgQWRqdXN0ICdjb25maWcnLCBpZiBuZWVkZWQKLSAgICAgY29uZmlnLm5vX2ZhbmN5X3Vwc2FtcGxpbmcgPSAxOwotICAgICBjb25maWcub3V0cHV0LmNvbG9yc3BhY2UgPSBNT0RFX0JHUkE7Ci0gICAgIC8vIGV0Yy4KLQotICAgICAvLyBOb3RlIHRoYXQgeW91IGNhbiBhbHNvIG1ha2UgY29uZmlnLm91dHB1dCBwb2ludCB0byBhbiBleHRlcm5hbGx5Ci0gICAgIC8vIHN1cHBsaWVkIG1lbW9yeSBidWZmZXIsIHByb3ZpZGVkIGl0J3MgYmlnIGVub3VnaCB0byBzdG9yZSB0aGUgZGVjb2RlZAotICAgICAvLyBwaWN0dXJlLiBPdGhlcndpc2UsIGNvbmZpZy5vdXRwdXQgd2lsbCBqdXN0IGJlIHVzZWQgdG8gYWxsb2NhdGUgbWVtb3J5Ci0gICAgIC8vIGFuZCBzdG9yZSB0aGUgZGVjb2RlZCBwaWN0dXJlLgotCi0gICAgIC8vIEQpIERlY29kZSEKLSAgICAgQ0hFQ0soV2ViUERlY29kZShkYXRhLCBkYXRhX3NpemUsICZjb25maWcpID09IFZQOF9TVEFUVVNfT0spOwotCi0gICAgIC8vIEUpIERlY29kZWQgaW1hZ2UgaXMgbm93IGluIGNvbmZpZy5vdXRwdXQgKGFuZCBjb25maWcub3V0cHV0LnUuUkdCQSkKLQotICAgICAvLyBGKSBSZWNsYWltIG1lbW9yeSBhbGxvY2F0ZWQgaW4gY29uZmlnJ3Mgb2JqZWN0LiBJdCdzIHNhZmUgdG8gY2FsbAotICAgICAvLyB0aGlzIGZ1bmN0aW9uIGV2ZW4gaWYgdGhlIG1lbW9yeSBpcyBleHRlcm5hbCBhbmQgd2Fzbid0IGFsbG9jYXRlZAotICAgICAvLyBieSBXZWJQRGVjb2RlKCkuCi0gICAgIFdlYlBGcmVlRGVjQnVmZmVyKCZjb25maWcub3V0cHV0KTsKLSovCi0KLS8vIEZlYXR1cmVzIGdhdGhlcmVkIGZyb20gdGhlIGJpdHN0cmVhbQotc3RydWN0IFdlYlBCaXRzdHJlYW1GZWF0dXJlcyB7Ci0gIGludCB3aWR0aDsgICAgICAgICAgLy8gV2lkdGggaW4gcGl4ZWxzLCBhcyByZWFkIGZyb20gdGhlIGJpdHN0cmVhbS4KLSAgaW50IGhlaWdodDsgICAgICAgICAvLyBIZWlnaHQgaW4gcGl4ZWxzLCBhcyByZWFkIGZyb20gdGhlIGJpdHN0cmVhbS4KLSAgaW50IGhhc19hbHBoYTsgICAgICAvLyBUcnVlIGlmIHRoZSBiaXRzdHJlYW0gY29udGFpbnMgYW4gYWxwaGEgY2hhbm5lbC4KLSAgaW50IGhhc19hbmltYXRpb247ICAvLyBUcnVlIGlmIHRoZSBiaXRzdHJlYW0gaXMgYW4gYW5pbWF0aW9uLgotCi0gIC8vIFVudXNlZCBmb3Igbm93OgotICBpbnQgYml0c3RyZWFtX3ZlcnNpb247ICAgICAgICAvLyBzaG91bGQgYmUgMCBmb3Igbm93LiBUT0RPKGxhdGVyKQotICBpbnQgbm9faW5jcmVtZW50YWxfZGVjb2Rpbmc7ICAvLyBpZiB0cnVlLCB1c2luZyBpbmNyZW1lbnRhbCBkZWNvZGluZyBpcyBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjb21tZW5kZWQuCi0gIGludCByb3RhdGU7ICAgICAgICAgICAgICAgICAgIC8vIFRPRE8obGF0ZXIpCi0gIGludCB1dl9zYW1wbGluZzsgICAgICAgICAgICAgIC8vIHNob3VsZCBiZSAwIGZvciBub3cuIFRPRE8obGF0ZXIpCi0gIHVpbnQzMl90IHBhZFsyXTsgICAgICAgICAgICAgIC8vIHBhZGRpbmcgZm9yIGxhdGVyIHVzZQotfTsKLQotLy8gSW50ZXJuYWwsIHZlcnNpb24tY2hlY2tlZCwgZW50cnkgcG9pbnQKLVdFQlBfRVhURVJOKFZQOFN0YXR1c0NvZGUpIFdlYlBHZXRGZWF0dXJlc0ludGVybmFsKAotICAgIGNvbnN0IHVpbnQ4X3QqLCBzaXplX3QsIFdlYlBCaXRzdHJlYW1GZWF0dXJlcyosIGludCk7Ci0KLS8vIFJldHJpZXZlIGZlYXR1cmVzIGZyb20gdGhlIGJpdHN0cmVhbS4gVGhlICpmZWF0dXJlcyBzdHJ1Y3R1cmUgaXMgZmlsbGVkCi0vLyB3aXRoIGluZm9ybWF0aW9uIGdhdGhlcmVkIGZyb20gdGhlIGJpdHN0cmVhbS4KLS8vIFJldHVybnMgVlA4X1NUQVRVU19PSyB3aGVuIHRoZSBmZWF0dXJlcyBhcmUgc3VjY2Vzc2Z1bGx5IHJldHJpZXZlZC4gUmV0dXJucwotLy8gVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEEgd2hlbiBtb3JlIGRhdGEgaXMgbmVlZGVkIHRvIHJldHJpZXZlIHRoZQotLy8gZmVhdHVyZXMgZnJvbSBoZWFkZXJzLiBSZXR1cm5zIGVycm9yIGluIG90aGVyIGNhc2VzLgotc3RhdGljIFdFQlBfSU5MSU5FIFZQOFN0YXR1c0NvZGUgV2ViUEdldEZlYXR1cmVzKAotICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCi0gICAgV2ViUEJpdHN0cmVhbUZlYXR1cmVzKiBmZWF0dXJlcykgewotICByZXR1cm4gV2ViUEdldEZlYXR1cmVzSW50ZXJuYWwoZGF0YSwgZGF0YV9zaXplLCBmZWF0dXJlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdFQlBfREVDT0RFUl9BQklfVkVSU0lPTik7Ci19Ci0KLS8vIERlY29kaW5nIG9wdGlvbnMKLXN0cnVjdCBXZWJQRGVjb2Rlck9wdGlvbnMgewotICBpbnQgYnlwYXNzX2ZpbHRlcmluZzsgICAgICAgICAgICAgICAvLyBpZiB0cnVlLCBza2lwIHRoZSBpbi1sb29wIGZpbHRlcmluZwotICBpbnQgbm9fZmFuY3lfdXBzYW1wbGluZzsgICAgICAgICAgICAvLyBpZiB0cnVlLCB1c2UgZmFzdGVyIHBvaW50d2lzZSB1cHNhbXBsZXIKLSAgaW50IHVzZV9jcm9wcGluZzsgICAgICAgICAgICAgICAgICAgLy8gaWYgdHJ1ZSwgY3JvcHBpbmcgaXMgYXBwbGllZCBfZmlyc3RfCi0gIGludCBjcm9wX2xlZnQsIGNyb3BfdG9wOyAgICAgICAgICAgIC8vIHRvcC1sZWZ0IHBvc2l0aW9uIGZvciBjcm9wcGluZy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2lsbCBiZSBzbmFwcGVkIHRvIGV2ZW4gdmFsdWVzLgotICBpbnQgY3JvcF93aWR0aCwgY3JvcF9oZWlnaHQ7ICAgICAgICAvLyBkaW1lbnNpb24gb2YgdGhlIGNyb3BwaW5nIGFyZWEKLSAgaW50IHVzZV9zY2FsaW5nOyAgICAgICAgICAgICAgICAgICAgLy8gaWYgdHJ1ZSwgc2NhbGluZyBpcyBhcHBsaWVkIF9hZnRlcndhcmRfCi0gIGludCBzY2FsZWRfd2lkdGgsIHNjYWxlZF9oZWlnaHQ7ICAgIC8vIGZpbmFsIHJlc29sdXRpb24KLSAgaW50IHVzZV90aHJlYWRzOyAgICAgICAgICAgICAgICAgICAgLy8gaWYgdHJ1ZSwgdXNlIG11bHRpLXRocmVhZGVkIGRlY29kaW5nCi0KLSAgLy8gVW51c2VkIGZvciBub3c6Ci0gIGludCBmb3JjZV9yb3RhdGlvbjsgICAgICAgICAgICAgICAgIC8vIGZvcmNlZCByb3RhdGlvbiAodG8gYmUgYXBwbGllZCBfbGFzdF8pCi0gIGludCBub19lbmhhbmNlbWVudDsgICAgICAgICAgICAgICAgIC8vIGlmIHRydWUsIGRpc2NhcmQgZW5oYW5jZW1lbnQgbGF5ZXIKLSAgdWludDMyX3QgcGFkWzZdOyAgICAgICAgICAgICAgICAgICAgLy8gcGFkZGluZyBmb3IgbGF0ZXIgdXNlCi19OwotCi0vLyBNYWluIG9iamVjdCBzdG9yaW5nIHRoZSBjb25maWd1cmF0aW9uIGZvciBhZHZhbmNlZCBkZWNvZGluZy4KLXN0cnVjdCBXZWJQRGVjb2RlckNvbmZpZyB7Ci0gIFdlYlBCaXRzdHJlYW1GZWF0dXJlcyBpbnB1dDsgIC8vIEltbXV0YWJsZSBiaXRzdHJlYW0gZmVhdHVyZXMgKG9wdGlvbmFsKQotICBXZWJQRGVjQnVmZmVyIG91dHB1dDsgICAgICAgICAvLyBPdXRwdXQgYnVmZmVyIChjYW4gcG9pbnQgdG8gZXh0ZXJuYWwgbWVtKQotICBXZWJQRGVjb2Rlck9wdGlvbnMgb3B0aW9uczsgICAvLyBEZWNvZGluZyBvcHRpb25zCi19OwotCi0vLyBJbnRlcm5hbCwgdmVyc2lvbi1jaGVja2VkLCBlbnRyeSBwb2ludAotV0VCUF9FWFRFUk4oaW50KSBXZWJQSW5pdERlY29kZXJDb25maWdJbnRlcm5hbChXZWJQRGVjb2RlckNvbmZpZyosIGludCk7Ci0KLS8vIEluaXRpYWxpemUgdGhlIGNvbmZpZ3VyYXRpb24gYXMgZW1wdHkuIFRoaXMgZnVuY3Rpb24gbXVzdCBhbHdheXMgYmUKLS8vIGNhbGxlZCBmaXJzdCwgdW5sZXNzIFdlYlBHZXRGZWF0dXJlcygpIGlzIHRvIGJlIGNhbGxlZC4KLS8vIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiBtaXNtYXRjaGVkIHZlcnNpb24uCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IFdlYlBJbml0RGVjb2RlckNvbmZpZyhXZWJQRGVjb2RlckNvbmZpZyogY29uZmlnKSB7Ci0gIHJldHVybiBXZWJQSW5pdERlY29kZXJDb25maWdJbnRlcm5hbChjb25maWcsIFdFQlBfREVDT0RFUl9BQklfVkVSU0lPTik7Ci19Ci0KLS8vIEluc3RhbnRpYXRlIGEgbmV3IGluY3JlbWVudGFsIGRlY29kZXIgb2JqZWN0IHdpdGggdGhlIHJlcXVlc3RlZAotLy8gY29uZmlndXJhdGlvbi4gVGhlIGJpdHN0cmVhbSBjYW4gYmUgcGFzc2VkIHVzaW5nICdkYXRhJyBhbmQgJ2RhdGFfc2l6ZScKLS8vIHBhcmFtZXRlciwgaW4gd2hpY2ggY2FzZSB0aGUgZmVhdHVyZXMgd2lsbCBiZSBwYXJzZWQgYW5kIHN0b3JlZCBpbnRvCi0vLyBjb25maWctPmlucHV0LiBPdGhlcndpc2UsICdkYXRhJyBjYW4gYmUgTlVMTCBhbmQgbm8gcGFyc2luZyB3aWxsIG9jY3VyLgotLy8gTm90ZSB0aGF0ICdjb25maWcnIGNhbiBiZSBOVUxMIHRvbywgaW4gd2hpY2ggY2FzZSBhIGRlZmF1bHQgY29uZmlndXJhdGlvbgotLy8gaXMgdXNlZC4KLS8vIFRoZSByZXR1cm4gV2ViUElEZWNvZGVyIG9iamVjdCBtdXN0IGFsd2F5cyBiZSBkZWxldGVkIGNhbGxpbmcgV2ViUElEZWxldGUoKS4KLS8vIFJldHVybnMgTlVMTCBpbiBjYXNlIG9mIGVycm9yIChhbmQgY29uZmlnLT5zdGF0dXMgd2lsbCB0aGVuIHJlZmxlY3QKLS8vIHRoZSBlcnJvciBjb25kaXRpb24pLgotV0VCUF9FWFRFUk4oV2ViUElEZWNvZGVyKikgV2ViUElEZWNvZGUoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBEZWNvZGVyQ29uZmlnKiBjb25maWcpOwotCi0vLyBOb24taW5jcmVtZW50YWwgdmVyc2lvbi4gVGhpcyB2ZXJzaW9uIGRlY29kZXMgdGhlIGZ1bGwgZGF0YSBhdCBvbmNlLCB0YWtpbmcKLS8vICdjb25maWcnIGludG8gYWNjb3VudC4gUmV0dXJucyBkZWNvZGluZyBzdGF0dXMgKHdoaWNoIHNob3VsZCBiZSBWUDhfU1RBVFVTX09LCi0vLyBpZiB0aGUgZGVjb2Rpbmcgd2FzIHN1Y2Nlc3NmdWwpLgotV0VCUF9FWFRFUk4oVlA4U3RhdHVzQ29kZSkgV2ViUERlY29kZShjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQRGVjb2RlckNvbmZpZyogY29uZmlnKTsKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCi0KLSNlbmRpZiAgLyogV0VCUF9XRUJQX0RFQ09ERV9IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvd2VicC9kZW11eC5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvd2VicC9kZW11eC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2NkNWQ2Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3dlYnAvZGVtdXguaAorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gRGVtdXggQVBJLgotLy8gRW5hYmxlcyBleHRyYWN0aW9uIG9mIGltYWdlIGFuZCBleHRlbmRlZCBmb3JtYXQgZGF0YSBmcm9tIFdlYlAgZmlsZXMuCi0KLS8vIENvZGUgRXhhbXBsZTogRGVtdXhpbmcgV2ViUCBkYXRhIHRvIGV4dHJhY3QgYWxsIHRoZSBmcmFtZXMsIElDQyBwcm9maWxlCi0vLyBhbmQgRVhJRi9YTVAgbWV0YWRhdGEuCi0vLwotLy8gICBXZWJQRGVtdXhlciogZGVtdXggPSBXZWJQRGVtdXgoJndlYnBfZGF0YSk7Ci0vLwotLy8gICB1aW50MzJfdCB3aWR0aCA9IFdlYlBEZW11eEdldEkoZGVtdXgsIFdFQlBfRkZfQ0FOVkFTX1dJRFRIKTsKLS8vICAgdWludDMyX3QgaGVpZ2h0ID0gV2ViUERlbXV4R2V0SShkZW11eCwgV0VCUF9GRl9DQU5WQVNfSEVJR0hUKTsKLS8vICAgLy8gLi4uIChHZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZlYXR1cmVzIHByZXNlbnQgaW4gdGhlIFdlYlAgZmlsZSkuCi0vLyAgIHVpbnQzMl90IGZsYWdzID0gV2ViUERlbXV4R2V0SShkZW11eCwgV0VCUF9GRl9GT1JNQVRfRkxBR1MpOwotLy8KLS8vICAgLy8gLi4uIChJdGVyYXRlIG92ZXIgYWxsIGZyYW1lcykuCi0vLyAgIFdlYlBJdGVyYXRvciBpdGVyOwotLy8gICBpZiAoV2ViUERlbXV4R2V0RnJhbWUoZGVtdXgsIDEsICZpdGVyKSkgewotLy8gICAgIGRvIHsKLS8vICAgICAgIC8vIC4uLiAoQ29uc3VtZSAnaXRlcic7IGUuZy4gRGVjb2RlICdpdGVyLmZyYWdtZW50JyB3aXRoIFdlYlBEZWNvZGUoKSwKLS8vICAgICAgIC8vIC4uLiBhbmQgZ2V0IG90aGVyIGZyYW1lIHByb3BlcnRpZXMgbGlrZSB3aWR0aCwgaGVpZ2h0LCBvZmZzZXRzIGV0Yy4KLS8vICAgICAgIC8vIC4uLiBzZWUgJ3N0cnVjdCBXZWJQSXRlcmF0b3InIGJlbG93IGZvciBtb3JlIGluZm8pLgotLy8gICAgIH0gd2hpbGUgKFdlYlBEZW11eE5leHRGcmFtZSgmaXRlcikpOwotLy8gICAgIFdlYlBEZW11eFJlbGVhc2VJdGVyYXRvcigmaXRlcik7Ci0vLyAgIH0KLS8vCi0vLyAgIC8vIC4uLiAoRXh0cmFjdCBtZXRhZGF0YSkuCi0vLyAgIFdlYlBDaHVua0l0ZXJhdG9yIGNodW5rX2l0ZXI7Ci0vLyAgIGlmIChmbGFncyAmIElDQ1BfRkxBRykgV2ViUERlbXV4R2V0Q2h1bmsoZGVtdXgsICJJQ0NQIiwgMSwgJmNodW5rX2l0ZXIpOwotLy8gICAvLyAuLi4gKENvbnN1bWUgdGhlIElDQyBwcm9maWxlIGluICdjaHVua19pdGVyLmNodW5rJykuCi0vLyAgIFdlYlBEZW11eFJlbGVhc2VDaHVua0l0ZXJhdG9yKCZjaHVua19pdGVyKTsKLS8vICAgaWYgKGZsYWdzICYgRVhJRl9GTEFHKSBXZWJQRGVtdXhHZXRDaHVuayhkZW11eCwgIkVYSUYiLCAxLCAmY2h1bmtfaXRlcik7Ci0vLyAgIC8vIC4uLiAoQ29uc3VtZSB0aGUgRVhJRiBtZXRhZGF0YSBpbiAnY2h1bmtfaXRlci5jaHVuaycpLgotLy8gICBXZWJQRGVtdXhSZWxlYXNlQ2h1bmtJdGVyYXRvcigmY2h1bmtfaXRlcik7Ci0vLyAgIGlmIChmbGFncyAmIFhNUF9GTEFHKSBXZWJQRGVtdXhHZXRDaHVuayhkZW11eCwgIlhNUCAiLCAxLCAmY2h1bmtfaXRlcik7Ci0vLyAgIC8vIC4uLiAoQ29uc3VtZSB0aGUgWE1QIG1ldGFkYXRhIGluICdjaHVua19pdGVyLmNodW5rJykuCi0vLyAgIFdlYlBEZW11eFJlbGVhc2VDaHVua0l0ZXJhdG9yKCZjaHVua19pdGVyKTsKLS8vICAgV2ViUERlbXV4RGVsZXRlKGRlbXV4KTsKLQotI2lmbmRlZiBXRUJQX1dFQlBfREVNVVhfSF8KLSNkZWZpbmUgV0VCUF9XRUJQX0RFTVVYX0hfCi0KLSNpbmNsdWRlICIuL211eF90eXBlcy5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2RlZmluZSBXRUJQX0RFTVVYX0FCSV9WRVJTSU9OIDB4MDEwMCAgICAvLyBNQUpPUig4YikgKyBNSU5PUig4YikKLQotLy8gTm90ZTogZm9yd2FyZCBkZWNsYXJpbmcgZW51bWVyYXRpb25zIGlzIG5vdCBhbGxvd2VkIGluIChzdHJpY3QpIEMgYW5kIEMrKywKLS8vIHRoZSB0eXBlcyBhcmUgbGVmdCBoZXJlIGZvciByZWZlcmVuY2UuCi0vLyB0eXBlZGVmIGVudW0gV2ViUERlbXV4U3RhdGUgV2ViUERlbXV4U3RhdGU7Ci0vLyB0eXBlZGVmIGVudW0gV2ViUEZvcm1hdEZlYXR1cmUgV2ViUEZvcm1hdEZlYXR1cmU7Ci10eXBlZGVmIHN0cnVjdCBXZWJQRGVtdXhlciBXZWJQRGVtdXhlcjsKLXR5cGVkZWYgc3RydWN0IFdlYlBJdGVyYXRvciBXZWJQSXRlcmF0b3I7Ci10eXBlZGVmIHN0cnVjdCBXZWJQQ2h1bmtJdGVyYXRvciBXZWJQQ2h1bmtJdGVyYXRvcjsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gUmV0dXJucyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGRlbXV4IGxpYnJhcnksIHBhY2tlZCBpbiBoZXhhZGVjaW1hbCB1c2luZwotLy8gOGJpdHMgZm9yIGVhY2ggb2YgbWFqb3IvbWlub3IvcmV2aXNpb24uIEUuZzogdjIuNS43IGlzIDB4MDIwNTA3LgotV0VCUF9FWFRFUk4oaW50KSBXZWJQR2V0RGVtdXhWZXJzaW9uKHZvaWQpOwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTGlmZSBvZiBhIERlbXV4IG9iamVjdAotCi10eXBlZGVmIGVudW0gV2ViUERlbXV4U3RhdGUgewotICBXRUJQX0RFTVVYX1BBUlNJTkdfSEVBREVSLCAgLy8gTm90IGVub3VnaCBkYXRhIHRvIHBhcnNlIGZ1bGwgaGVhZGVyLgotICBXRUJQX0RFTVVYX1BBUlNFRF9IRUFERVIsICAgLy8gSGVhZGVyIHBhcnNpbmcgY29tcGxldGUsIGRhdGEgbWF5IGJlIGF2YWlsYWJsZS4KLSAgV0VCUF9ERU1VWF9ET05FICAgICAgICAgICAgIC8vIEVudGlyZSBmaWxlIGhhcyBiZWVuIHBhcnNlZC4KLX0gV2ViUERlbXV4U3RhdGU7Ci0KLS8vIEludGVybmFsLCB2ZXJzaW9uLWNoZWNrZWQsIGVudHJ5IHBvaW50Ci1XRUJQX0VYVEVSTihXZWJQRGVtdXhlciopIFdlYlBEZW11eEludGVybmFsKAotICAgIGNvbnN0IFdlYlBEYXRhKiwgaW50LCBXZWJQRGVtdXhTdGF0ZSosIGludCk7Ci0KLS8vIFBhcnNlcyB0aGUgZnVsbCBXZWJQIGZpbGUgZ2l2ZW4gYnkgJ2RhdGEnLgotLy8gUmV0dXJucyBhIFdlYlBEZW11eGVyIG9iamVjdCBvbiBzdWNjZXNzZnVsIHBhcnNlLCBOVUxMIG90aGVyd2lzZS4KLXN0YXRpYyBXRUJQX0lOTElORSBXZWJQRGVtdXhlciogV2ViUERlbXV4KGNvbnN0IFdlYlBEYXRhKiBkYXRhKSB7Ci0gIHJldHVybiBXZWJQRGVtdXhJbnRlcm5hbChkYXRhLCAwLCBOVUxMLCBXRUJQX0RFTVVYX0FCSV9WRVJTSU9OKTsKLX0KLQotLy8gUGFyc2VzIHRoZSBwb3NzaWJseSBpbmNvbXBsZXRlIFdlYlAgZmlsZSBnaXZlbiBieSAnZGF0YScuCi0vLyBJZiAnc3RhdGUnIGlzIG5vbi1OVUxMIGl0IHdpbGwgYmUgc2V0IHRvIGluZGljYXRlIHRoZSBzdGF0dXMgb2YgdGhlIGRlbXV4ZXIuCi0vLyBSZXR1cm5zIGEgV2ViUERlbXV4ZXIgb2JqZWN0IG9uIHN1Y2Nlc3NmdWwgcGFyc2UsIE5VTEwgb3RoZXJ3aXNlLgotc3RhdGljIFdFQlBfSU5MSU5FIFdlYlBEZW11eGVyKiBXZWJQRGVtdXhQYXJ0aWFsKAotICAgIGNvbnN0IFdlYlBEYXRhKiBkYXRhLCBXZWJQRGVtdXhTdGF0ZSogc3RhdGUpIHsKLSAgcmV0dXJuIFdlYlBEZW11eEludGVybmFsKGRhdGEsIDEsIHN0YXRlLCBXRUJQX0RFTVVYX0FCSV9WRVJTSU9OKTsKLX0KLQotLy8gRnJlZXMgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCAnZG11eCcuCi1XRUJQX0VYVEVSTih2b2lkKSBXZWJQRGVtdXhEZWxldGUoV2ViUERlbXV4ZXIqIGRtdXgpOwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRGF0YS9pbmZvcm1hdGlvbiBleHRyYWN0aW9uLgotCi10eXBlZGVmIGVudW0gV2ViUEZvcm1hdEZlYXR1cmUgewotICBXRUJQX0ZGX0ZPUk1BVF9GTEFHUywgIC8vIEV4dGVuZGVkIGZvcm1hdCBmbGFncyBwcmVzZW50IGluIHRoZSAnVlA4WCcgY2h1bmsuCi0gIFdFQlBfRkZfQ0FOVkFTX1dJRFRILAotICBXRUJQX0ZGX0NBTlZBU19IRUlHSFQsCi0gIFdFQlBfRkZfTE9PUF9DT1VOVCwKLSAgV0VCUF9GRl9CQUNLR1JPVU5EX0NPTE9SLAotICBXRUJQX0ZGX0ZSQU1FX0NPVU5UICAgIC8vIE51bWJlciBvZiBmcmFtZXMgcHJlc2VudCBpbiB0aGUgZGVtdXggb2JqZWN0LgotICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIGNhc2Ugb2YgYSBwYXJ0aWFsIGRlbXV4LCB0aGlzIGlzIHRoZSBudW1iZXIgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmcmFtZXMgc2VlbiBzbyBmYXIsIHdpdGggdGhlIGxhc3QgZnJhbWUgcG9zc2libHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWluZyBwYXJ0aWFsLgotfSBXZWJQRm9ybWF0RmVhdHVyZTsKLQotLy8gR2V0IHRoZSAnZmVhdHVyZScgdmFsdWUgZnJvbSB0aGUgJ2RtdXgnLgotLy8gTk9URTogdmFsdWVzIGFyZSBvbmx5IHZhbGlkIGlmIFdlYlBEZW11eCgpIHdhcyB1c2VkIG9yIFdlYlBEZW11eFBhcnRpYWwoKQotLy8gcmV0dXJuZWQgYSBzdGF0ZSA+IFdFQlBfREVNVVhfUEFSU0lOR19IRUFERVIuCi1XRUJQX0VYVEVSTih1aW50MzJfdCkgV2ViUERlbXV4R2V0SSgKLSAgICBjb25zdCBXZWJQRGVtdXhlciogZG11eCwgV2ViUEZvcm1hdEZlYXR1cmUgZmVhdHVyZSk7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBGcmFtZSBpdGVyYXRpb24uCi0KLXN0cnVjdCBXZWJQSXRlcmF0b3IgewotICBpbnQgZnJhbWVfbnVtOwotICBpbnQgbnVtX2ZyYW1lczsgICAgICAgICAgLy8gZXF1aXZhbGVudCB0byBXRUJQX0ZGX0ZSQU1FX0NPVU5ULgotICBpbnQgZnJhZ21lbnRfbnVtOwotICBpbnQgbnVtX2ZyYWdtZW50czsKLSAgaW50IHhfb2Zmc2V0LCB5X29mZnNldDsgIC8vIG9mZnNldCByZWxhdGl2ZSB0byB0aGUgY2FudmFzLgotICBpbnQgd2lkdGgsIGhlaWdodDsgICAgICAgLy8gZGltZW5zaW9ucyBvZiB0aGlzIGZyYW1lIG9yIGZyYWdtZW50LgotICBpbnQgZHVyYXRpb247ICAgICAgICAgICAgLy8gZGlzcGxheSBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMuCi0gIFdlYlBNdXhBbmltRGlzcG9zZSBkaXNwb3NlX21ldGhvZDsgIC8vIGRpc3Bvc2UgbWV0aG9kIGZvciB0aGUgZnJhbWUuCi0gIGludCBjb21wbGV0ZTsgICAvLyB0cnVlIGlmICdmcmFnbWVudCcgY29udGFpbnMgYSBmdWxsIGZyYW1lLiBwYXJ0aWFsIGltYWdlcwotICAgICAgICAgICAgICAgICAgLy8gbWF5IHN0aWxsIGJlIGRlY29kZWQgd2l0aCB0aGUgV2ViUCBpbmNyZW1lbnRhbCBkZWNvZGVyLgotICBXZWJQRGF0YSBmcmFnbWVudDsgIC8vIFRoZSBmcmFtZSBvciBmcmFnbWVudCBnaXZlbiBieSAnZnJhbWVfbnVtJyBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAvLyAnZnJhZ21lbnRfbnVtJy4KLQotICB1aW50MzJfdCBwYWRbNF07ICAgICAgICAgLy8gcGFkZGluZyBmb3IgbGF0ZXIgdXNlLgotICB2b2lkKiBwcml2YXRlXzsgICAgICAgICAgLy8gZm9yIGludGVybmFsIHVzZSBvbmx5LgotfTsKLQotLy8gUmV0cmlldmVzIGZyYW1lICdmcmFtZV9udW1iZXInIGZyb20gJ2RtdXgnLgotLy8gJ2l0ZXItPmZyYWdtZW50JyBwb2ludHMgdG8gdGhlIGZpcnN0IGZyYWdtZW50IG9uIHJldHVybiBmcm9tIHRoaXMgZnVuY3Rpb24uCi0vLyBJbmRpdmlkdWFsIGZyYWdtZW50cyBtYXkgYmUgZXh0cmFjdGVkIHVzaW5nIFdlYlBEZW11eFNldEZyYWdtZW50KCkuCi0vLyBTZXR0aW5nICdmcmFtZV9udW1iZXInIGVxdWFsIHRvIDAgd2lsbCByZXR1cm4gdGhlIGxhc3QgZnJhbWUgb2YgdGhlIGltYWdlLgotLy8gUmV0dXJucyBmYWxzZSBpZiAnZG11eCcgaXMgTlVMTCBvciBmcmFtZSAnZnJhbWVfbnVtYmVyJyBpcyBub3QgcHJlc2VudC4KLS8vIENhbGwgV2ViUERlbXV4UmVsZWFzZUl0ZXJhdG9yKCkgd2hlbiB1c2Ugb2YgdGhlIGl0ZXJhdG9yIGlzIGNvbXBsZXRlLgotLy8gTk9URTogJ2RtdXgnIG11c3QgcGVyc2lzdCBmb3IgdGhlIGxpZmV0aW1lIG9mICdpdGVyJy4KLVdFQlBfRVhURVJOKGludCkgV2ViUERlbXV4R2V0RnJhbWUoCi0gICAgY29uc3QgV2ViUERlbXV4ZXIqIGRtdXgsIGludCBmcmFtZV9udW1iZXIsIFdlYlBJdGVyYXRvciogaXRlcik7Ci0KLS8vIFNldHMgJ2l0ZXItPmZyYWdtZW50JyB0byBwb2ludCB0byB0aGUgbmV4dCAoJ2l0ZXItPmZyYW1lX251bScgKyAxKSBvcgotLy8gcHJldmlvdXMgKCdpdGVyLT5mcmFtZV9udW0nIC0gMSkgZnJhbWUuIFRoZXNlIGZ1bmN0aW9ucyBkbyBub3QgbG9vcC4KLS8vIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UuCi1XRUJQX0VYVEVSTihpbnQpIFdlYlBEZW11eE5leHRGcmFtZShXZWJQSXRlcmF0b3IqIGl0ZXIpOwotV0VCUF9FWFRFUk4oaW50KSBXZWJQRGVtdXhQcmV2RnJhbWUoV2ViUEl0ZXJhdG9yKiBpdGVyKTsKLQotLy8gU2V0cyAnaXRlci0+ZnJhZ21lbnQnIHRvIHJlZmxlY3QgZnJhZ21lbnQgbnVtYmVyICdmcmFnbWVudF9udW0nLgotLy8gUmV0dXJucyB0cnVlIGlmIGZyYWdtZW50ICdmcmFnbWVudF9udW0nIGlzIHByZXNlbnQsIGZhbHNlIG90aGVyd2lzZS4KLVdFQlBfRVhURVJOKGludCkgV2ViUERlbXV4U2VsZWN0RnJhZ21lbnQoV2ViUEl0ZXJhdG9yKiBpdGVyLCBpbnQgZnJhZ21lbnRfbnVtKTsKLQotLy8gUmVsZWFzZXMgYW55IG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggJ2l0ZXInLgotLy8gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSBzdWJzZXF1ZW50IGNhbGxzIHRvIFdlYlBEZW11eEdldENodW5rKCkgb24gdGhlIHNhbWUKLS8vIGl0ZXIuIEFsc28sIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBkZXN0cm95aW5nIHRoZSBhc3NvY2lhdGVkIFdlYlBEZW11eGVyIHdpdGgKLS8vIFdlYlBEZW11eERlbGV0ZSgpLgotV0VCUF9FWFRFUk4odm9pZCkgV2ViUERlbXV4UmVsZWFzZUl0ZXJhdG9yKFdlYlBJdGVyYXRvciogaXRlcik7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDaHVuayBpdGVyYXRpb24uCi0KLXN0cnVjdCBXZWJQQ2h1bmtJdGVyYXRvciB7Ci0gIC8vIFRoZSBjdXJyZW50IGFuZCB0b3RhbCBudW1iZXIgb2YgY2h1bmtzIHdpdGggdGhlIGZvdXJjYyBnaXZlbiB0bwotICAvLyBXZWJQRGVtdXhHZXRDaHVuaygpLgotICBpbnQgY2h1bmtfbnVtOwotICBpbnQgbnVtX2NodW5rczsKLSAgV2ViUERhdGEgY2h1bms7ICAgIC8vIFRoZSBwYXlsb2FkIG9mIHRoZSBjaHVuay4KLQotICB1aW50MzJfdCBwYWRbNl07ICAgLy8gcGFkZGluZyBmb3IgbGF0ZXIgdXNlCi0gIHZvaWQqIHByaXZhdGVfOwotfTsKLQotLy8gUmV0cmlldmVzIHRoZSAnY2h1bmtfbnVtYmVyJyBpbnN0YW5jZSBvZiB0aGUgY2h1bmsgd2l0aCBpZCAnZm91cmNjJyBmcm9tCi0vLyAnZG11eCcuCi0vLyAnZm91cmNjJyBpcyBhIGNoYXJhY3RlciBhcnJheSBjb250YWluaW5nIHRoZSBmb3VyY2Mgb2YgdGhlIGNodW5rIHRvIHJldHVybiwKLS8vIGUuZy4sICJJQ0NQIiwgIlhNUCAiLCAiRVhJRiIsIGV0Yy4KLS8vIFNldHRpbmcgJ2NodW5rX251bWJlcicgZXF1YWwgdG8gMCB3aWxsIHJldHVybiB0aGUgbGFzdCBjaHVuayBpbiBhIHNldC4KLS8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgY2h1bmsgaXMgZm91bmQsIGZhbHNlIG90aGVyd2lzZS4gSW1hZ2UgcmVsYXRlZCBjaHVuawotLy8gcGF5bG9hZHMgYXJlIGFjY2Vzc2VkIHRocm91Z2ggV2ViUERlbXV4R2V0RnJhbWUoKSBhbmQgcmVsYXRlZCBmdW5jdGlvbnMuCi0vLyBDYWxsIFdlYlBEZW11eFJlbGVhc2VDaHVua0l0ZXJhdG9yKCkgd2hlbiB1c2Ugb2YgdGhlIGl0ZXJhdG9yIGlzIGNvbXBsZXRlLgotLy8gTk9URTogJ2RtdXgnIG11c3QgcGVyc2lzdCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBpdGVyYXRvci4KLVdFQlBfRVhURVJOKGludCkgV2ViUERlbXV4R2V0Q2h1bmsoY29uc3QgV2ViUERlbXV4ZXIqIGRtdXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgZm91cmNjWzRdLCBpbnQgY2h1bmtfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQQ2h1bmtJdGVyYXRvciogaXRlcik7Ci0KLS8vIFNldHMgJ2l0ZXItPmNodW5rJyB0byBwb2ludCB0byB0aGUgbmV4dCAoJ2l0ZXItPmNodW5rX251bScgKyAxKSBvciBwcmV2aW91cwotLy8gKCdpdGVyLT5jaHVua19udW0nIC0gMSkgY2h1bmsuIFRoZXNlIGZ1bmN0aW9ucyBkbyBub3QgbG9vcC4KLS8vIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UuCi1XRUJQX0VYVEVSTihpbnQpIFdlYlBEZW11eE5leHRDaHVuayhXZWJQQ2h1bmtJdGVyYXRvciogaXRlcik7Ci1XRUJQX0VYVEVSTihpbnQpIFdlYlBEZW11eFByZXZDaHVuayhXZWJQQ2h1bmtJdGVyYXRvciogaXRlcik7Ci0KLS8vIFJlbGVhc2VzIGFueSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoICdpdGVyJy4KLS8vIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBkZXN0cm95aW5nIHRoZSBhc3NvY2lhdGVkIFdlYlBEZW11eGVyIHdpdGgKLS8vIFdlYlBEZW11eERlbGV0ZSgpLgotV0VCUF9FWFRFUk4odm9pZCkgV2ViUERlbXV4UmVsZWFzZUNodW5rSXRlcmF0b3IoV2ViUENodW5rSXRlcmF0b3IqIGl0ZXIpOwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKLQotI2VuZGlmICAvKiBXRUJQX1dFQlBfREVNVVhfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3dlYnAvZW5jb2RlLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC93ZWJwL2VuY29kZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2Q5ZDkxLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3dlYnAvZW5jb2RlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0ODUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vICAgV2ViUCBlbmNvZGVyOiBtYWluIGludGVyZmFjZQotLy8KLS8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCi0KLSNpZm5kZWYgV0VCUF9XRUJQX0VOQ09ERV9IXwotI2RlZmluZSBXRUJQX1dFQlBfRU5DT0RFX0hfCi0KLSNpbmNsdWRlICIuL3R5cGVzLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jZGVmaW5lIFdFQlBfRU5DT0RFUl9BQklfVkVSU0lPTiAweDAyMDEgICAgLy8gTUFKT1IoOGIpICsgTUlOT1IoOGIpCi0KLS8vIE5vdGU6IGZvcndhcmQgZGVjbGFyaW5nIGVudW1lcmF0aW9ucyBpcyBub3QgYWxsb3dlZCBpbiAoc3RyaWN0KSBDIGFuZCBDKyssCi0vLyB0aGUgdHlwZXMgYXJlIGxlZnQgaGVyZSBmb3IgcmVmZXJlbmNlLgotLy8gdHlwZWRlZiBlbnVtIFdlYlBJbWFnZUhpbnQgV2ViUEltYWdlSGludDsKLS8vIHR5cGVkZWYgZW51bSBXZWJQRW5jQ1NQIFdlYlBFbmNDU1A7Ci0vLyB0eXBlZGVmIGVudW0gV2ViUFByZXNldCBXZWJQUHJlc2V0OwotLy8gdHlwZWRlZiBlbnVtIFdlYlBFbmNvZGluZ0Vycm9yIFdlYlBFbmNvZGluZ0Vycm9yOwotdHlwZWRlZiBzdHJ1Y3QgV2ViUENvbmZpZyBXZWJQQ29uZmlnOwotdHlwZWRlZiBzdHJ1Y3QgV2ViUFBpY3R1cmUgV2ViUFBpY3R1cmU7ICAgLy8gbWFpbiBzdHJ1Y3R1cmUgZm9yIEkvTwotdHlwZWRlZiBzdHJ1Y3QgV2ViUEF1eFN0YXRzIFdlYlBBdXhTdGF0czsKLXR5cGVkZWYgc3RydWN0IFdlYlBNZW1vcnlXcml0ZXIgV2ViUE1lbW9yeVdyaXRlcjsKLQotLy8gUmV0dXJuIHRoZSBlbmNvZGVyJ3MgdmVyc2lvbiBudW1iZXIsIHBhY2tlZCBpbiBoZXhhZGVjaW1hbCB1c2luZyA4Yml0cyBmb3IKLS8vIGVhY2ggb2YgbWFqb3IvbWlub3IvcmV2aXNpb24uIEUuZzogdjIuNS43IGlzIDB4MDIwNTA3LgotV0VCUF9FWFRFUk4oaW50KSBXZWJQR2V0RW5jb2RlclZlcnNpb24odm9pZCk7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBPbmUtc3RvcC1zaG9wIGNhbGwhIE5vIHF1ZXN0aW9ucyBhc2tlZDoKLQotLy8gUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgY29tcHJlc3NlZCBkYXRhIChwb2ludGVkIHRvIGJ5ICpvdXRwdXQpLCBvciAwIGlmCi0vLyBhbiBlcnJvciBvY2N1cnJlZC4gVGhlIGNvbXByZXNzZWQgZGF0YSBtdXN0IGJlIHJlbGVhc2VkIGJ5IHRoZSBjYWxsZXIKLS8vIHVzaW5nIHRoZSBjYWxsICdTYk1lbW9yeURlYWxsb2NhdGUoKm91dHB1dCknLgotLy8gVGhlc2UgZnVuY3Rpb25zIGNvbXByZXNzIHVzaW5nIHRoZSBsb3NzeSBmb3JtYXQsIGFuZCB0aGUgcXVhbGl0eV9mYWN0b3IKLS8vIGNhbiBnbyBmcm9tIDAgKHNtYWxsZXIgb3V0cHV0LCBsb3dlciBxdWFsaXR5KSB0byAxMDAgKGJlc3QgcXVhbGl0eSwKLS8vIGxhcmdlciBvdXRwdXQpLgotV0VCUF9FWFRFUk4oc2l6ZV90KSBXZWJQRW5jb2RlUkdCKGNvbnN0IHVpbnQ4X3QqIHJnYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcXVhbGl0eV9mYWN0b3IsIHVpbnQ4X3QqKiBvdXRwdXQpOwotV0VCUF9FWFRFUk4oc2l6ZV90KSBXZWJQRW5jb2RlQkdSKGNvbnN0IHVpbnQ4X3QqIGJnciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcXVhbGl0eV9mYWN0b3IsIHVpbnQ4X3QqKiBvdXRwdXQpOwotV0VCUF9FWFRFUk4oc2l6ZV90KSBXZWJQRW5jb2RlUkdCQShjb25zdCB1aW50OF90KiByZ2JhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHF1YWxpdHlfZmFjdG9yLCB1aW50OF90Kiogb3V0cHV0KTsKLVdFQlBfRVhURVJOKHNpemVfdCkgV2ViUEVuY29kZUJHUkEoY29uc3QgdWludDhfdCogYmdyYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBxdWFsaXR5X2ZhY3RvciwgdWludDhfdCoqIG91dHB1dCk7Ci0KLS8vIFRoZXNlIGZ1bmN0aW9ucyBhcmUgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIGFib3ZlLCBidXQgY29tcHJlc3NpbmcgaW4gYQotLy8gbG9zc2xlc3MgbWFubmVyLiBGaWxlcyBhcmUgdXN1YWxseSBsYXJnZXIgdGhhbiBsb3NzeSBmb3JtYXQsIGJ1dCB3aWxsCi0vLyBub3Qgc3VmZmVyIGFueSBjb21wcmVzc2lvbiBsb3NzLgotV0VCUF9FWFRFUk4oc2l6ZV90KSBXZWJQRW5jb2RlTG9zc2xlc3NSR0IoY29uc3QgdWludDhfdCogcmdiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIG91dHB1dCk7Ci1XRUJQX0VYVEVSTihzaXplX3QpIFdlYlBFbmNvZGVMb3NzbGVzc0JHUihjb25zdCB1aW50OF90KiBiZ3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90Kiogb3V0cHV0KTsKLVdFQlBfRVhURVJOKHNpemVfdCkgV2ViUEVuY29kZUxvc3NsZXNzUkdCQShjb25zdCB1aW50OF90KiByZ2JhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90Kiogb3V0cHV0KTsKLVdFQlBfRVhURVJOKHNpemVfdCkgV2ViUEVuY29kZUxvc3NsZXNzQkdSQShjb25zdCB1aW50OF90KiBiZ3JhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90Kiogb3V0cHV0KTsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvZGluZyBwYXJhbWV0ZXJzCi0KLS8vIEltYWdlIGNoYXJhY3RlcmlzdGljcyBoaW50IGZvciB0aGUgdW5kZXJseWluZyBlbmNvZGVyLgotdHlwZWRlZiBlbnVtIFdlYlBJbWFnZUhpbnQgewotICBXRUJQX0hJTlRfREVGQVVMVCA9IDAsICAvLyBkZWZhdWx0IHByZXNldC4KLSAgV0VCUF9ISU5UX1BJQ1RVUkUsICAgICAgLy8gZGlnaXRhbCBwaWN0dXJlLCBsaWtlIHBvcnRyYWl0LCBpbm5lciBzaG90Ci0gIFdFQlBfSElOVF9QSE9UTywgICAgICAgIC8vIG91dGRvb3IgcGhvdG9ncmFwaCwgd2l0aCBuYXR1cmFsIGxpZ2h0aW5nCi0gIFdFQlBfSElOVF9HUkFQSCwgICAgICAgIC8vIERpc2NyZXRlIHRvbmUgaW1hZ2UgKGdyYXBoLCBtYXAtdGlsZSBldGMpLgotICBXRUJQX0hJTlRfTEFTVAotfSBXZWJQSW1hZ2VIaW50OwotCi0vLyBDb21wcmVzc2lvbiBwYXJhbWV0ZXJzLgotc3RydWN0IFdlYlBDb25maWcgewotICBpbnQgbG9zc2xlc3M7ICAgICAgICAgICAvLyBMb3NzbGVzcyBlbmNvZGluZyAoMD1sb3NzeShkZWZhdWx0KSwgMT1sb3NzbGVzcykuCi0gIGZsb2F0IHF1YWxpdHk7ICAgICAgICAgIC8vIGJldHdlZW4gMCAoc21hbGxlc3QgZmlsZSkgYW5kIDEwMCAoYmlnZ2VzdCkKLSAgaW50IG1ldGhvZDsgICAgICAgICAgICAgLy8gcXVhbGl0eS9zcGVlZCB0cmFkZS1vZmYgKDA9ZmFzdCwgNj1zbG93ZXItYmV0dGVyKQotCi0gIFdlYlBJbWFnZUhpbnQgaW1hZ2VfaGludDsgIC8vIEhpbnQgZm9yIGltYWdlIHR5cGUgKGxvc3NsZXNzIG9ubHkgZm9yIG5vdykuCi0KLSAgLy8gUGFyYW1ldGVycyByZWxhdGVkIHRvIGxvc3N5IGNvbXByZXNzaW9uIG9ubHk6Ci0gIGludCB0YXJnZXRfc2l6ZTsgICAgICAgIC8vIGlmIG5vbi16ZXJvLCBzZXQgdGhlIGRlc2lyZWQgdGFyZ2V0IHNpemUgaW4gYnl0ZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGUgJ2NvbXByZXNzaW9uJyBwYXJhbWV0ZXIuCi0gIGZsb2F0IHRhcmdldF9QU05SOyAgICAgIC8vIGlmIG5vbi16ZXJvLCBzcGVjaWZpZXMgdGhlIG1pbmltYWwgZGlzdG9ydGlvbiB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cnkgdG8gYWNoaWV2ZS4gVGFrZXMgcHJlY2VkZW5jZSBvdmVyIHRhcmdldF9zaXplLgotICBpbnQgc2VnbWVudHM7ICAgICAgICAgICAvLyBtYXhpbXVtIG51bWJlciBvZiBzZWdtZW50cyB0byB1c2UsIGluIFsxLi40XQotICBpbnQgc25zX3N0cmVuZ3RoOyAgICAgICAvLyBTcGF0aWFsIE5vaXNlIFNoYXBpbmcuIDA9b2ZmLCAxMDA9bWF4aW11bS4KLSAgaW50IGZpbHRlcl9zdHJlbmd0aDsgICAgLy8gcmFuZ2U6IFswID0gb2ZmIC4uIDEwMCA9IHN0cm9uZ2VzdF0KLSAgaW50IGZpbHRlcl9zaGFycG5lc3M7ICAgLy8gcmFuZ2U6IFswID0gb2ZmIC4uIDcgPSBsZWFzdCBzaGFycF0KLSAgaW50IGZpbHRlcl90eXBlOyAgICAgICAgLy8gZmlsdGVyaW5nIHR5cGU6IDAgPSBzaW1wbGUsIDEgPSBzdHJvbmcgKG9ubHkgdXNlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBmaWx0ZXJfc3RyZW5ndGggPiAwIG9yIGF1dG9maWx0ZXIgPiAwKQotICBpbnQgYXV0b2ZpbHRlcjsgICAgICAgICAvLyBBdXRvIGFkanVzdCBmaWx0ZXIncyBzdHJlbmd0aCBbMCA9IG9mZiwgMSA9IG9uXQotICBpbnQgYWxwaGFfY29tcHJlc3Npb247ICAvLyBBbGdvcml0aG0gZm9yIGVuY29kaW5nIHRoZSBhbHBoYSBwbGFuZSAoMCA9IG5vbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEgPSBjb21wcmVzc2VkIHdpdGggV2ViUCBsb3NzbGVzcykuIERlZmF1bHQgaXMgMS4KLSAgaW50IGFscGhhX2ZpbHRlcmluZzsgICAgLy8gUHJlZGljdGl2ZSBmaWx0ZXJpbmcgbWV0aG9kIGZvciBhbHBoYSBwbGFuZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIDA6IG5vbmUsIDE6IGZhc3QsIDI6IGJlc3QuIERlZmF1bHQgaWYgMS4KLSAgaW50IGFscGhhX3F1YWxpdHk7ICAgICAgLy8gQmV0d2VlbiAwIChzbWFsbGVzdCBzaXplKSBhbmQgMTAwIChsb3NzbGVzcykuCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlZmF1bHQgaXMgMTAwLgotICBpbnQgcGFzczsgICAgICAgICAgICAgICAvLyBudW1iZXIgb2YgZW50cm9weS1hbmFseXNpcyBwYXNzZXMgKGluIFsxLi4xMF0pLgotCi0gIGludCBzaG93X2NvbXByZXNzZWQ7ICAgIC8vIGlmIHRydWUsIGV4cG9ydCB0aGUgY29tcHJlc3NlZCBwaWN0dXJlIGJhY2suCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluLWxvb3AgZmlsdGVyaW5nIGlzIG5vdCBhcHBsaWVkLgotICBpbnQgcHJlcHJvY2Vzc2luZzsgICAgICAvLyBwcmVwcm9jZXNzaW5nIGZpbHRlciAoMD1ub25lLCAxPXNlZ21lbnQtc21vb3RoKQotICBpbnQgcGFydGl0aW9uczsgICAgICAgICAvLyBsb2cyKG51bWJlciBvZiB0b2tlbiBwYXJ0aXRpb25zKSBpbiBbMC4uM10uIERlZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgc2V0IHRvIDAgZm9yIGVhc2llciBwcm9ncmVzc2l2ZSBkZWNvZGluZy4KLSAgaW50IHBhcnRpdGlvbl9saW1pdDsgICAgLy8gcXVhbGl0eSBkZWdyYWRhdGlvbiBhbGxvd2VkIHRvIGZpdCB0aGUgNTEyayBsaW1pdAotICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBwcmVkaWN0aW9uIG1vZGVzIGNvZGluZyAoMDogbm8gZGVncmFkYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEwMDogbWF4aW11bSBwb3NzaWJsZSBkZWdyYWRhdGlvbikuCi0gIGludCBlbXVsYXRlX2pwZWdfc2l6ZTsgIC8vIElmIHRydWUsIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMgd2lsbCBiZSByZW1hcHBlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBiZXR0ZXIgbWF0Y2ggdGhlIGV4cGVjdGVkIG91dHB1dCBzaXplIGZyb20KLSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSlBFRyBjb21wcmVzc2lvbi4gR2VuZXJhbGx5LCB0aGUgb3V0cHV0IHNpemUgd2lsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZSBzaW1pbGFyIGJ1dCB0aGUgZGVncmFkYXRpb24gd2lsbCBiZSBsb3dlci4KLSAgaW50IHRocmVhZF9sZXZlbDsgICAgICAgLy8gSWYgbm9uLXplcm8sIHRyeSBhbmQgdXNlIG11bHRpLXRocmVhZGVkIGVuY29kaW5nLgotICBpbnQgbG93X21lbW9yeTsgICAgICAgICAvLyBJZiBzZXQsIHJlZHVjZSBtZW1vcnkgdXNhZ2UgKGJ1dCBpbmNyZWFzZSBDUFUgdXNlKS4KLQotICB1aW50MzJfdCBwYWRbNV07ICAgICAgICAvLyBwYWRkaW5nIGZvciBsYXRlciB1c2UKLX07Ci0KLS8vIEVudW1lcmF0ZSBzb21lIHByZWRlZmluZWQgc2V0dGluZ3MgZm9yIFdlYlBDb25maWcsIGRlcGVuZGluZyBvbiB0aGUgdHlwZQotLy8gb2Ygc291cmNlIHBpY3R1cmUuIFRoZXNlIHByZXNldHMgYXJlIHVzZWQgd2hlbiBjYWxsaW5nIFdlYlBDb25maWdQcmVzZXQoKS4KLXR5cGVkZWYgZW51bSBXZWJQUHJlc2V0IHsKLSAgV0VCUF9QUkVTRVRfREVGQVVMVCA9IDAsICAvLyBkZWZhdWx0IHByZXNldC4KLSAgV0VCUF9QUkVTRVRfUElDVFVSRSwgICAgICAvLyBkaWdpdGFsIHBpY3R1cmUsIGxpa2UgcG9ydHJhaXQsIGlubmVyIHNob3QKLSAgV0VCUF9QUkVTRVRfUEhPVE8sICAgICAgICAvLyBvdXRkb29yIHBob3RvZ3JhcGgsIHdpdGggbmF0dXJhbCBsaWdodGluZwotICBXRUJQX1BSRVNFVF9EUkFXSU5HLCAgICAgIC8vIGhhbmQgb3IgbGluZSBkcmF3aW5nLCB3aXRoIGhpZ2gtY29udHJhc3QgZGV0YWlscwotICBXRUJQX1BSRVNFVF9JQ09OLCAgICAgICAgIC8vIHNtYWxsLXNpemVkIGNvbG9yZnVsIGltYWdlcwotICBXRUJQX1BSRVNFVF9URVhUICAgICAgICAgIC8vIHRleHQtbGlrZQotfSBXZWJQUHJlc2V0OwotCi0vLyBJbnRlcm5hbCwgdmVyc2lvbi1jaGVja2VkLCBlbnRyeSBwb2ludAotV0VCUF9FWFRFUk4oaW50KSBXZWJQQ29uZmlnSW5pdEludGVybmFsKFdlYlBDb25maWcqLCBXZWJQUHJlc2V0LCBmbG9hdCwgaW50KTsKLQotLy8gU2hvdWxkIGFsd2F5cyBiZSBjYWxsZWQsIHRvIGluaXRpYWxpemUgYSBmcmVzaCBXZWJQQ29uZmlnIHN0cnVjdHVyZSBiZWZvcmUKLS8vIG1vZGlmaWNhdGlvbi4gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIHZlcnNpb24gbWlzbWF0Y2guIFdlYlBDb25maWdJbml0KCkKLS8vIG11c3QgaGF2ZSBzdWNjZWVkZWQgYmVmb3JlIHVzaW5nIHRoZSAnY29uZmlnJyBvYmplY3QuCi0vLyBOb3RlIHRoYXQgdGhlIGRlZmF1bHQgdmFsdWVzIGFyZSBsb3NzbGVzcz0wIGFuZCBxdWFsaXR5PTc1Lgotc3RhdGljIFdFQlBfSU5MSU5FIGludCBXZWJQQ29uZmlnSW5pdChXZWJQQ29uZmlnKiBjb25maWcpIHsKLSAgcmV0dXJuIFdlYlBDb25maWdJbml0SW50ZXJuYWwoY29uZmlnLCBXRUJQX1BSRVNFVF9ERUZBVUxULCA3NS5mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXRUJQX0VOQ09ERVJfQUJJX1ZFUlNJT04pOwotfQotCi0vLyBUaGlzIGZ1bmN0aW9uIHdpbGwgaW5pdGlhbGl6ZSB0aGUgY29uZmlndXJhdGlvbiBhY2NvcmRpbmcgdG8gYSBwcmVkZWZpbmVkCi0vLyBzZXQgb2YgcGFyYW1ldGVycyAocmVmZXJyZWQgdG8gYnkgJ3ByZXNldCcpIGFuZCBhIGdpdmVuIHF1YWxpdHkgZmFjdG9yLgotLy8gVGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGFzIGEgcmVwbGFjZW1lbnQgdG8gV2ViUENvbmZpZ0luaXQoKS4gV2lsbAotLy8gcmV0dXJuIGZhbHNlIGluIGNhc2Ugb2YgZXJyb3IuCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IFdlYlBDb25maWdQcmVzZXQoV2ViUENvbmZpZyogY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBQcmVzZXQgcHJlc2V0LCBmbG9hdCBxdWFsaXR5KSB7Ci0gIHJldHVybiBXZWJQQ29uZmlnSW5pdEludGVybmFsKGNvbmZpZywgcHJlc2V0LCBxdWFsaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXRUJQX0VOQ09ERVJfQUJJX1ZFUlNJT04pOwotfQotCi0vLyBSZXR1cm5zIHRydWUgaWYgJ2NvbmZpZycgaXMgbm9uLU5VTEwgYW5kIGFsbCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYXJlCi0vLyB3aXRoaW4gdGhlaXIgdmFsaWQgcmFuZ2VzLgotV0VCUF9FWFRFUk4oaW50KSBXZWJQVmFsaWRhdGVDb25maWcoY29uc3QgV2ViUENvbmZpZyogY29uZmlnKTsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIElucHV0IC8gT3V0cHV0Ci0vLyBTdHJ1Y3R1cmUgZm9yIHN0b3JpbmcgYXV4aWxpYXJ5IHN0YXRpc3RpY3MgKG1vc3RseSBmb3IgbG9zc3kgZW5jb2RpbmcpLgotCi1zdHJ1Y3QgV2ViUEF1eFN0YXRzIHsKLSAgaW50IGNvZGVkX3NpemU7ICAgICAgICAgLy8gZmluYWwgc2l6ZQotCi0gIGZsb2F0IFBTTlJbNV07ICAgICAgICAgIC8vIHBlYWstc2lnbmFsLXRvLW5vaXNlIHJhdGlvIGZvciBZL1UvVi9BbGwvQWxwaGEKLSAgaW50IGJsb2NrX2NvdW50WzNdOyAgICAgLy8gbnVtYmVyIG9mIGludHJhNC9pbnRyYTE2L3NraXBwZWQgbWFjcm9ibG9ja3MKLSAgaW50IGhlYWRlcl9ieXRlc1syXTsgICAgLy8gYXBwcm94aW1hdGUgbnVtYmVyIG9mIGJ5dGVzIHNwZW50IGZvciBoZWFkZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIG1vZGUtcGFydGl0aW9uICMwCi0gIGludCByZXNpZHVhbF9ieXRlc1szXVs0XTsgIC8vIGFwcHJveGltYXRlIG51bWJlciBvZiBieXRlcyBzcGVudCBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gREMvQUMvdXYgY29lZmZpY2llbnRzIGZvciBlYWNoICgwLi4zKSBzZWdtZW50cy4KLSAgaW50IHNlZ21lbnRfc2l6ZVs0XTsgICAgLy8gbnVtYmVyIG9mIG1hY3JvYmxvY2tzIGluIGVhY2ggc2VnbWVudHMKLSAgaW50IHNlZ21lbnRfcXVhbnRbNF07ICAgLy8gcXVhbnRpemVyIHZhbHVlcyBmb3IgZWFjaCBzZWdtZW50cwotICBpbnQgc2VnbWVudF9sZXZlbFs0XTsgICAvLyBmaWx0ZXJpbmcgc3RyZW5ndGggZm9yIGVhY2ggc2VnbWVudHMgWzAuLjYzXQotCi0gIGludCBhbHBoYV9kYXRhX3NpemU7ICAgIC8vIHNpemUgb2YgdGhlIHRyYW5zcGFyZW5jeSBkYXRhCi0gIGludCBsYXllcl9kYXRhX3NpemU7ICAgIC8vIHNpemUgb2YgdGhlIGVuaGFuY2VtZW50IGxheWVyIGRhdGEKLQotICAvLyBsb3NzbGVzcyBlbmNvZGVyIHN0YXRpc3RpY3MKLSAgdWludDMyX3QgbG9zc2xlc3NfZmVhdHVyZXM7ICAvLyBiaXQwOnByZWRpY3RvciBiaXQxOmNyb3NzLWNvbG9yIHRyYW5zZm9ybQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdDI6c3VidHJhY3QtZ3JlZW4gYml0Mzpjb2xvciBpbmRleGluZwotICBpbnQgaGlzdG9ncmFtX2JpdHM7ICAgICAgICAgIC8vIG51bWJlciBvZiBwcmVjaXNpb24gYml0cyBvZiBoaXN0b2dyYW0KLSAgaW50IHRyYW5zZm9ybV9iaXRzOyAgICAgICAgICAvLyBwcmVjaXNpb24gYml0cyBmb3IgdHJhbnNmb3JtCi0gIGludCBjYWNoZV9iaXRzOyAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGJpdHMgZm9yIGNvbG9yIGNhY2hlIGxvb2t1cAotICBpbnQgcGFsZXR0ZV9zaXplOyAgICAgICAgICAgIC8vIG51bWJlciBvZiBjb2xvciBpbiBwYWxldHRlLCBpZiB1c2VkCi0gIGludCBsb3NzbGVzc19zaXplOyAgICAgICAgICAgLy8gZmluYWwgbG9zc2xlc3Mgc2l6ZQotCi0gIHVpbnQzMl90IHBhZFs0XTsgICAgICAgIC8vIHBhZGRpbmcgZm9yIGxhdGVyIHVzZQotfTsKLQotLy8gU2lnbmF0dXJlIGZvciBvdXRwdXQgZnVuY3Rpb24uIFNob3VsZCByZXR1cm4gdHJ1ZSBpZiB3cml0aW5nIHdhcyBzdWNjZXNzZnVsLgotLy8gZGF0YS9kYXRhX3NpemUgaXMgdGhlIHNlZ21lbnQgb2YgZGF0YSB0byB3cml0ZSwgYW5kICdwaWN0dXJlJyBpcyBmb3IKLS8vIHJlZmVyZW5jZSAoYW5kIHNvIG9uZSBjYW4gbWFrZSB1c2Ugb2YgcGljdHVyZS0+Y3VzdG9tX3B0cikuCi10eXBlZGVmIGludCAoKldlYlBXcml0ZXJGdW5jdGlvbikoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQUGljdHVyZSogcGljdHVyZSk7Ci0KLS8vIFdlYlBNZW1vcnlXcml0ZTogYSBzcGVjaWFsIFdlYlBXcml0ZXJGdW5jdGlvbiB0aGF0IHdyaXRlcyB0byBtZW1vcnkgdXNpbmcKLS8vIHRoZSBmb2xsb3dpbmcgV2ViUE1lbW9yeVdyaXRlciBvYmplY3QgKHRvIGJlIHNldCBhcyBhIGN1c3RvbV9wdHIpLgotc3RydWN0IFdlYlBNZW1vcnlXcml0ZXIgewotICB1aW50OF90KiBtZW07ICAgICAgIC8vIGZpbmFsIGJ1ZmZlciAob2Ygc2l6ZSAnbWF4X3NpemUnLCBsYXJnZXIgdGhhbiAnc2l6ZScpLgotICBzaXplX3QgICBzaXplOyAgICAgIC8vIGZpbmFsIHNpemUKLSAgc2l6ZV90ICAgbWF4X3NpemU7ICAvLyB0b3RhbCBjYXBhY2l0eQotICB1aW50MzJfdCBwYWRbMV07ICAgIC8vIHBhZGRpbmcgZm9yIGxhdGVyIHVzZQotfTsKLQotLy8gVGhlIGZvbGxvd2luZyBtdXN0IGJlIGNhbGxlZCBmaXJzdCBiZWZvcmUgYW55IHVzZS4KLVdFQlBfRVhURVJOKHZvaWQpIFdlYlBNZW1vcnlXcml0ZXJJbml0KFdlYlBNZW1vcnlXcml0ZXIqIHdyaXRlcik7Ci0KLS8vIFRoZSBjdXN0b20gd3JpdGVyIHRvIGJlIHVzZWQgd2l0aCBXZWJQTWVtb3J5V3JpdGVyIGFzIGN1c3RvbV9wdHIuIFVwb24KLS8vIGNvbXBsZXRpb24sIHdyaXRlci5tZW0gYW5kIHdyaXRlci5zaXplIHdpbGwgaG9sZCB0aGUgY29kZWQgZGF0YS4KLS8vIHdyaXRlci5tZW0gbXVzdCBiZSBmcmVlZCB1c2luZyB0aGUgY2FsbCAnU2JNZW1vcnlEZWFsbG9jYXRlKHdyaXRlci5tZW0pJy4KLVdFQlBfRVhURVJOKGludCkgV2ViUE1lbW9yeVdyaXRlKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQUGljdHVyZSogcGljdHVyZSk7Ci0KLS8vIFByb2dyZXNzIGhvb2ssIGNhbGxlZCBmcm9tIHRpbWUgdG8gdGltZSB0byByZXBvcnQgcHJvZ3Jlc3MuIEl0IGNhbiByZXR1cm4KLS8vIGZhbHNlIHRvIHJlcXVlc3QgYW4gYWJvcnQgb2YgdGhlIGVuY29kaW5nIHByb2Nlc3MsIG9yIHRydWUgb3RoZXJ3aXNlIGlmCi0vLyBldmVyeXRoaW5nIGlzIE9LLgotdHlwZWRlZiBpbnQgKCpXZWJQUHJvZ3Jlc3NIb29rKShpbnQgcGVyY2VudCwgY29uc3QgV2ViUFBpY3R1cmUqIHBpY3R1cmUpOwotCi0vLyBDb2xvciBzcGFjZXMuCi10eXBlZGVmIGVudW0gV2ViUEVuY0NTUCB7Ci0gIC8vIGNocm9tYSBzYW1wbGluZwotICBXRUJQX1lVVjQyMCA9IDAsICAgLy8gNDoyOjAKLSAgV0VCUF9ZVVY0MjIgPSAxLCAgIC8vIDQ6MjoyCi0gIFdFQlBfWVVWNDQ0ID0gMiwgICAvLyA0OjQ6NAotICBXRUJQX1lVVjQwMCA9IDMsICAgLy8gZ3JheXNjYWxlCi0gIFdFQlBfQ1NQX1VWX01BU0sgPSAzLCAgIC8vIGJpdC1tYXNrIHRvIGdldCB0aGUgVVYgc2FtcGxpbmcgZmFjdG9ycwotICAvLyBhbHBoYSBjaGFubmVsIHZhcmlhbnRzCi0gIFdFQlBfWVVWNDIwQSA9IDQsCi0gIFdFQlBfWVVWNDIyQSA9IDUsCi0gIFdFQlBfWVVWNDQ0QSA9IDYsCi0gIFdFQlBfWVVWNDAwQSA9IDcsICAgLy8gZ3JheXNjYWxlICsgYWxwaGEKLSAgV0VCUF9DU1BfQUxQSEFfQklUID0gNCAgIC8vIGJpdCB0aGF0IGlzIHNldCBpZiBhbHBoYSBpcyBwcmVzZW50Ci19IFdlYlBFbmNDU1A7Ci0KLS8vIEVuY29kaW5nIGVycm9yIGNvbmRpdGlvbnMuCi10eXBlZGVmIGVudW0gV2ViUEVuY29kaW5nRXJyb3IgewotICBWUDhfRU5DX09LID0gMCwKLSAgVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZLCAgICAgICAgICAgIC8vIG1lbW9yeSBlcnJvciBhbGxvY2F0aW5nIG9iamVjdHMKLSAgVlA4X0VOQ19FUlJPUl9CSVRTVFJFQU1fT1VUX09GX01FTU9SWSwgIC8vIG1lbW9yeSBlcnJvciB3aGlsZSBmbHVzaGluZyBiaXRzCi0gIFZQOF9FTkNfRVJST1JfTlVMTF9QQVJBTUVURVIsICAgICAgICAgICAvLyBhIHBvaW50ZXIgcGFyYW1ldGVyIGlzIE5VTEwKLSAgVlA4X0VOQ19FUlJPUl9JTlZBTElEX0NPTkZJR1VSQVRJT04sICAgIC8vIGNvbmZpZ3VyYXRpb24gaXMgaW52YWxpZAotICBWUDhfRU5DX0VSUk9SX0JBRF9ESU1FTlNJT04sICAgICAgICAgICAgLy8gcGljdHVyZSBoYXMgaW52YWxpZCB3aWR0aC9oZWlnaHQKLSAgVlA4X0VOQ19FUlJPUl9QQVJUSVRJT04wX09WRVJGTE9XLCAgICAgIC8vIHBhcnRpdGlvbiBpcyBiaWdnZXIgdGhhbiA1MTJrCi0gIFZQOF9FTkNfRVJST1JfUEFSVElUSU9OX09WRVJGTE9XLCAgICAgICAvLyBwYXJ0aXRpb24gaXMgYmlnZ2VyIHRoYW4gMTZNCi0gIFZQOF9FTkNfRVJST1JfQkFEX1dSSVRFLCAgICAgICAgICAgICAgICAvLyBlcnJvciB3aGlsZSBmbHVzaGluZyBieXRlcwotICBWUDhfRU5DX0VSUk9SX0ZJTEVfVE9PX0JJRywgICAgICAgICAgICAgLy8gZmlsZSBpcyBiaWdnZXIgdGhhbiA0RwotICBWUDhfRU5DX0VSUk9SX1VTRVJfQUJPUlQsICAgICAgICAgICAgICAgLy8gYWJvcnQgcmVxdWVzdCBieSB1c2VyCi0gIFZQOF9FTkNfRVJST1JfTEFTVCAgICAgICAgICAgICAgICAgICAgICAvLyBsaXN0IHRlcm1pbmF0b3IuIGFsd2F5cyBsYXN0LgotfSBXZWJQRW5jb2RpbmdFcnJvcjsKLQotLy8gbWF4aW11bSB3aWR0aC9oZWlnaHQgYWxsb3dlZCAoaW5jbHVzaXZlKSwgaW4gcGl4ZWxzCi0jZGVmaW5lIFdFQlBfTUFYX0RJTUVOU0lPTiAxNjM4MwotCi0vLyBNYWluIGV4Y2hhbmdlIHN0cnVjdHVyZSAoaW5wdXQgc2FtcGxlcywgb3V0cHV0IGJ5dGVzLCBzdGF0aXN0aWNzKQotc3RydWN0IFdlYlBQaWN0dXJlIHsKLSAgLy8gICBJTlBVVAotICAvLy8vLy8vLy8vLy8vLwotICAvLyBNYWluIGZsYWcgZm9yIGVuY29kZXIgc2VsZWN0aW5nIGJldHdlZW4gQVJHQiBvciBZVVYgaW5wdXQuCi0gIC8vIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBBUkdCIGlucHV0ICgqYXJnYiwgYXJnYl9zdHJpZGUpIGZvciBsb3NzbGVzcwotICAvLyBjb21wcmVzc2lvbiwgYW5kIFlVViBpbnB1dCAoKnksICp1LCAqdiwgZXRjLikgZm9yIGxvc3N5IGNvbXByZXNzaW9uCi0gIC8vIHNpbmNlIHRoZXNlIGFyZSB0aGUgcmVzcGVjdGl2ZSBuYXRpdmUgY29sb3JzcGFjZSBmb3IgdGhlc2UgZm9ybWF0cy4KLSAgaW50IHVzZV9hcmdiOwotCi0gIC8vIFlVViBpbnB1dCAobW9zdGx5IHVzZWQgZm9yIGlucHV0IHRvIGxvc3N5IGNvbXByZXNzaW9uKQotICBXZWJQRW5jQ1NQIGNvbG9yc3BhY2U7ICAgICAvLyBjb2xvcnNwYWNlOiBzaG91bGQgYmUgWVVWNDIwIGZvciBub3cgKD1ZJ0NiQ3IpLgotICBpbnQgd2lkdGgsIGhlaWdodDsgICAgICAgICAvLyBkaW1lbnNpb25zIChsZXNzIG9yIGVxdWFsIHRvIFdFQlBfTUFYX0RJTUVOU0lPTikKLSAgdWludDhfdCAqeSwgKnUsICp2OyAgICAgICAgLy8gcG9pbnRlcnMgdG8gbHVtYS9jaHJvbWEgcGxhbmVzLgotICBpbnQgeV9zdHJpZGUsIHV2X3N0cmlkZTsgICAvLyBsdW1hL2Nocm9tYSBzdHJpZGVzLgotICB1aW50OF90KiBhOyAgICAgICAgICAgICAgICAvLyBwb2ludGVyIHRvIHRoZSBhbHBoYSBwbGFuZQotICBpbnQgYV9zdHJpZGU7ICAgICAgICAgICAgICAvLyBzdHJpZGUgb2YgdGhlIGFscGhhIHBsYW5lCi0gIHVpbnQzMl90IHBhZDFbMl07ICAgICAgICAgIC8vIHBhZGRpbmcgZm9yIGxhdGVyIHVzZQotCi0gIC8vIEFSR0IgaW5wdXQgKG1vc3RseSB1c2VkIGZvciBpbnB1dCB0byBsb3NzbGVzcyBjb21wcmVzc2lvbikKLSAgdWludDMyX3QqIGFyZ2I7ICAgICAgICAgICAgLy8gUG9pbnRlciB0byBhcmdiICgzMiBiaXQpIHBsYW5lLgotICBpbnQgYXJnYl9zdHJpZGU7ICAgICAgICAgICAvLyBUaGlzIGlzIHN0cmlkZSBpbiBwaXhlbHMgdW5pdHMsIG5vdCBieXRlcy4KLSAgdWludDMyX3QgcGFkMlszXTsgICAgICAgICAgLy8gcGFkZGluZyBmb3IgbGF0ZXIgdXNlCi0KLSAgLy8gICBPVVRQVVQKLSAgLy8vLy8vLy8vLy8vLy8vCi0gIC8vIEJ5dGUtZW1pc3Npb24gaG9vaywgdG8gc3RvcmUgY29tcHJlc3NlZCBieXRlcyBhcyB0aGV5IGFyZSByZWFkeS4KLSAgV2ViUFdyaXRlckZ1bmN0aW9uIHdyaXRlcjsgIC8vIGNhbiBiZSBOVUxMCi0gIHZvaWQqIGN1c3RvbV9wdHI7ICAgICAgICAgICAvLyBjYW4gYmUgdXNlZCBieSB0aGUgd3JpdGVyLgotCi0gIC8vIG1hcCBmb3IgZXh0cmEgaW5mb3JtYXRpb24gKG9ubHkgZm9yIGxvc3N5IGNvbXByZXNzaW9uIG1vZGUpCi0gIGludCBleHRyYV9pbmZvX3R5cGU7ICAgIC8vIDE6IGludHJhIHR5cGUsIDI6IHNlZ21lbnQsIDM6IHF1YW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDQ6IGludHJhLTE2IHByZWRpY3Rpb24gbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNTogY2hyb21hIHByZWRpY3Rpb24gbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNjogYml0IGNvc3QsIDc6IGRpc3RvcnRpb24KLSAgdWludDhfdCogZXh0cmFfaW5mbzsgICAgLy8gaWYgbm90IE5VTEwsIHBvaW50cyB0byBhbiBhcnJheSBvZiBzaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC8vICgod2lkdGggKyAxNSkgLyAxNikgKiAoKGhlaWdodCArIDE1KSAvIDE2KSB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgYmUgZmlsbGVkIHdpdGggYSBtYWNyb2Jsb2NrIG1hcCwgZGVwZW5kaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIGV4dHJhX2luZm9fdHlwZS4KLQotICAvLyAgIFNUQVRTIEFORCBSRVBPUlRTCi0gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAvLyBQb2ludGVyIHRvIHNpZGUgc3RhdGlzdGljcyAodXBkYXRlZCBvbmx5IGlmIG5vdCBOVUxMKQotICBXZWJQQXV4U3RhdHMqIHN0YXRzOwotCi0gIC8vIEVycm9yIGNvZGUgZm9yIHRoZSBsYXRlc3QgZXJyb3IgZW5jb3VudGVyZWQgZHVyaW5nIGVuY29kaW5nCi0gIFdlYlBFbmNvZGluZ0Vycm9yIGVycm9yX2NvZGU7Ci0KLSAgLy8gSWYgbm90IE5VTEwsIHJlcG9ydCBwcm9ncmVzcyBkdXJpbmcgZW5jb2RpbmcuCi0gIFdlYlBQcm9ncmVzc0hvb2sgcHJvZ3Jlc3NfaG9vazsKLQotICB2b2lkKiB1c2VyX2RhdGE7ICAgICAgICAvLyB0aGlzIGZpZWxkIGlzIGZyZWUgdG8gYmUgc2V0IHRvIGFueSB2YWx1ZSBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlZCBkdXJpbmcgY2FsbGJhY2tzIChsaWtlIHByb2dyZXNzLXJlcG9ydCBlLmcuKS4KLQotICB1aW50MzJfdCBwYWQzWzNdOyAgICAgICAvLyBwYWRkaW5nIGZvciBsYXRlciB1c2UKLQotICAvLyBVbnVzZWQgZm9yIG5vdzogb3JpZ2luYWwgc2FtcGxlcyAoZm9yIG5vbi1ZVVY0MjAgbW9kZXMpCi0gIHVpbnQ4X3QgKnUwLCAqdjA7Ci0gIGludCB1djBfc3RyaWRlOwotCi0gIHVpbnQzMl90IHBhZDRbN107ICAgICAgIC8vIHBhZGRpbmcgZm9yIGxhdGVyIHVzZQotCi0gIC8vIFBSSVZBVEUgRklFTERTCi0gIC8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIHZvaWQqIG1lbW9yeV87ICAgICAgICAgIC8vIHJvdyBjaHVuayBvZiBtZW1vcnkgZm9yIHl1dmEgcGxhbmVzCi0gIHZvaWQqIG1lbW9yeV9hcmdiXzsgICAgIC8vIGFuZCBmb3IgYXJnYiB0b28uCi0gIHZvaWQqIHBhZDVbMl07ICAgICAgICAgIC8vIHBhZGRpbmcgZm9yIGxhdGVyIHVzZQotfTsKLQotLy8gSW50ZXJuYWwsIHZlcnNpb24tY2hlY2tlZCwgZW50cnkgcG9pbnQKLVdFQlBfRVhURVJOKGludCkgV2ViUFBpY3R1cmVJbml0SW50ZXJuYWwoV2ViUFBpY3R1cmUqLCBpbnQpOwotCi0vLyBTaG91bGQgYWx3YXlzIGJlIGNhbGxlZCwgdG8gaW5pdGlhbGl6ZSB0aGUgc3RydWN0dXJlLiBSZXR1cm5zIGZhbHNlIGluIGNhc2UKLS8vIG9mIHZlcnNpb24gbWlzbWF0Y2guIFdlYlBQaWN0dXJlSW5pdCgpIG11c3QgaGF2ZSBzdWNjZWVkZWQgYmVmb3JlIHVzaW5nIHRoZQotLy8gJ3BpY3R1cmUnIG9iamVjdC4KLS8vIE5vdGUgdGhhdCwgYnkgZGVmYXVsdCwgdXNlX2FyZ2IgaXMgZmFsc2UgYW5kIGNvbG9yc3BhY2UgaXMgV0VCUF9ZVVY0MjAuCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IFdlYlBQaWN0dXJlSW5pdChXZWJQUGljdHVyZSogcGljdHVyZSkgewotICByZXR1cm4gV2ViUFBpY3R1cmVJbml0SW50ZXJuYWwocGljdHVyZSwgV0VCUF9FTkNPREVSX0FCSV9WRVJTSU9OKTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFdlYlBQaWN0dXJlIHV0aWxzCi0KLS8vIENvbnZlbmllbmNlIGFsbG9jYXRpb24gLyBkZWFsbG9jYXRpb24gYmFzZWQgb24gcGljdHVyZS0+d2lkdGgvaGVpZ2h0OgotLy8gQWxsb2NhdGUgeS91L3YgYnVmZmVycyBhcyBwZXIgY29sb3JzcGFjZS93aWR0aC9oZWlnaHQgc3BlY2lmaWNhdGlvbi4KLS8vIE5vdGUhIFRoaXMgZnVuY3Rpb24gd2lsbCBmcmVlIHRoZSBwcmV2aW91cyBidWZmZXIgaWYgbmVlZGVkLgotLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIG1lbW9yeSBlcnJvci4KLVdFQlBfRVhURVJOKGludCkgV2ViUFBpY3R1cmVBbGxvYyhXZWJQUGljdHVyZSogcGljdHVyZSk7Ci0KLS8vIFJlbGVhc2UgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgYnkgV2ViUFBpY3R1cmVBbGxvYygpIG9yIFdlYlBQaWN0dXJlSW1wb3J0KigpLgotLy8gTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gZG9lcyBfbm90XyBmcmVlIHRoZSBtZW1vcnkgdXNlZCBieSB0aGUgJ3BpY3R1cmUnCi0vLyBvYmplY3QgaXRzZWxmLgotLy8gQmVzaWRlcyBtZW1vcnkgKHdoaWNoIGlzIHJlY2xhaW1lZCkgYWxsIG90aGVyIGZpZWxkcyBvZiAncGljdHVyZScgYXJlCi0vLyBwcmVzZXJ2ZWQuCi1XRUJQX0VYVEVSTih2b2lkKSBXZWJQUGljdHVyZUZyZWUoV2ViUFBpY3R1cmUqIHBpY3R1cmUpOwotCi0vLyBDb3B5IHRoZSBwaXhlbHMgb2YgKnNyYyBpbnRvICpkc3QsIHVzaW5nIFdlYlBQaWN0dXJlQWxsb2MuIFVwb24gcmV0dXJuLCAqZHN0Ci0vLyB3aWxsIGZ1bGx5IG93biB0aGUgY29waWVkIHBpeGVscyAodGhpcyBpcyBub3QgYSB2aWV3KS4gVGhlICdkc3QnIHBpY3R1cmUgbmVlZAotLy8gbm90IGJlIGluaXRpYWxpemVkIGFzIGl0cyBjb250ZW50IGlzIG92ZXJ3cml0dGVuLgotLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yLgotV0VCUF9FWFRFUk4oaW50KSBXZWJQUGljdHVyZUNvcHkoY29uc3QgV2ViUFBpY3R1cmUqIHNyYywgV2ViUFBpY3R1cmUqIGRzdCk7Ci0KLS8vIENvbXB1dGUgUFNOUiwgU1NJTSBvciBMU0lNIGRpc3RvcnRpb24gbWV0cmljIGJldHdlZW4gdHdvIHBpY3R1cmVzLgotLy8gUmVzdWx0IGlzIGluIGRCLCBzdG9yZXMgaW4gcmVzdWx0W10gaW4gdGhlIFkvVS9WL0FscGhhL0FsbCBvcmRlci4KLS8vIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiBlcnJvciAoc3JjIGFuZCByZWYgZG9uJ3QgaGF2ZSBzYW1lIGRpbWVuc2lvbiwgLi4uKQotLy8gV2FybmluZzogdGhpcyBmdW5jdGlvbiBpcyByYXRoZXIgQ1BVLWludGVuc2l2ZS4KLVdFQlBfRVhURVJOKGludCkgV2ViUFBpY3R1cmVEaXN0b3J0aW9uKAotICAgIGNvbnN0IFdlYlBQaWN0dXJlKiBzcmMsIGNvbnN0IFdlYlBQaWN0dXJlKiByZWYsCi0gICAgaW50IG1ldHJpY190eXBlLCAgICAgICAgICAgLy8gMCA9IFBTTlIsIDEgPSBTU0lNLCAyID0gTFNJTQotICAgIGZsb2F0IHJlc3VsdFs1XSk7Ci0KLS8vIHNlbGYtY3JvcHMgYSBwaWN0dXJlIHRvIHRoZSByZWN0YW5nbGUgZGVmaW5lZCBieSB0b3AvbGVmdC93aWR0aC9oZWlnaHQuCi0vLyBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IsIG9yIGlmIHRoZSByZWN0YW5nbGUgaXMKLS8vIG91dHNpZGUgb2YgdGhlIHNvdXJjZSBwaWN0dXJlLgotLy8gVGhlIHJlY3RhbmdsZSBmb3IgdGhlIHZpZXcgaXMgZGVmaW5lZCBieSB0aGUgdG9wLWxlZnQgY29ybmVyIHBpeGVsCi0vLyBjb29yZGluYXRlcyAobGVmdCwgdG9wKSBhcyB3ZWxsIGFzIGl0cyB3aWR0aCBhbmQgaGVpZ2h0LiBUaGlzIHJlY3RhbmdsZQotLy8gbXVzdCBiZSBmdWxseSBiZSBjb21wcmlzZWQgaW5zaWRlIHRoZSAnc3JjJyBzb3VyY2UgcGljdHVyZS4gSWYgdGhlIHNvdXJjZQotLy8gcGljdHVyZSB1c2VzIHRoZSBZVVY0MjAgY29sb3JzcGFjZSwgdGhlIHRvcCBhbmQgbGVmdCBjb29yZGluYXRlcyB3aWxsIGJlCi0vLyBzbmFwcGVkIHRvIGV2ZW4gdmFsdWVzLgotV0VCUF9FWFRFUk4oaW50KSBXZWJQUGljdHVyZUNyb3AoV2ViUFBpY3R1cmUqIHBpY3R1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLQotLy8gRXh0cmFjdHMgYSB2aWV3IGZyb20gJ3NyYycgcGljdHVyZSBpbnRvICdkc3QnLiBUaGUgcmVjdGFuZ2xlIGZvciB0aGUgdmlldwotLy8gaXMgZGVmaW5lZCBieSB0aGUgdG9wLWxlZnQgY29ybmVyIHBpeGVsIGNvb3JkaW5hdGVzIChsZWZ0LCB0b3ApIGFzIHdlbGwKLS8vIGFzIGl0cyB3aWR0aCBhbmQgaGVpZ2h0LiBUaGlzIHJlY3RhbmdsZSBtdXN0IGJlIGZ1bGx5IGJlIGNvbXByaXNlZCBpbnNpZGUKLS8vIHRoZSAnc3JjJyBzb3VyY2UgcGljdHVyZS4gSWYgdGhlIHNvdXJjZSBwaWN0dXJlIHVzZXMgdGhlIFlVVjQyMCBjb2xvcnNwYWNlLAotLy8gdGhlIHRvcCBhbmQgbGVmdCBjb29yZGluYXRlcyB3aWxsIGJlIHNuYXBwZWQgdG8gZXZlbiB2YWx1ZXMuCi0vLyBQaWN0dXJlICdzcmMnIG11c3Qgb3V0LWxpdmUgJ2RzdCcgcGljdHVyZS4gU2VsZi1leHRyYWN0aW9uIG9mIHZpZXcgaXMgYWxsb3dlZAotLy8gKCdzcmMnIGVxdWFsIHRvICdkc3QnKSBhcyBhIG1lYW4gb2YgZmFzdC1jcm9wcGluZyAoYnV0IG5vdGUgdGhhdCBkb2luZyBzbywKLS8vIHRoZSBvcmlnaW5hbCBkaW1lbnNpb24gd2lsbCBiZSBsb3N0KS4gUGljdHVyZSAnZHN0JyBuZWVkIG5vdCBiZSBpbml0aWFsaXplZAotLy8gd2l0aCBXZWJQUGljdHVyZUluaXQoKSBpZiBpdCBpcyBkaWZmZXJlbnQgZnJvbSAnc3JjJywgc2luY2UgaXRzIGNvbnRlbnQgd2lsbAotLy8gYmUgb3ZlcndyaXR0ZW4uCi0vLyBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3Igb3IgaW52YWxpZCBwYXJhbWV0ZXJzLgotV0VCUF9FWFRFUk4oaW50KSBXZWJQUGljdHVyZVZpZXcoY29uc3QgV2ViUFBpY3R1cmUqIHNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQUGljdHVyZSogZHN0KTsKLQotLy8gUmV0dXJucyB0cnVlIGlmIHRoZSAncGljdHVyZScgaXMgYWN0dWFsbHkgYSB2aWV3IGFuZCB0aGVyZWZvcmUgZG9lcwotLy8gbm90IG93biB0aGUgbWVtb3J5IGZvciBwaXhlbHMuCi1XRUJQX0VYVEVSTihpbnQpIFdlYlBQaWN0dXJlSXNWaWV3KGNvbnN0IFdlYlBQaWN0dXJlKiBwaWN0dXJlKTsKLQotLy8gUmVzY2FsZSBhIHBpY3R1cmUgdG8gbmV3IGRpbWVuc2lvbiB3aWR0aCB4IGhlaWdodC4KLS8vIE5vdyBnYW1tYSBjb3JyZWN0aW9uIGlzIGFwcGxpZWQuCi0vLyBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgZXJyb3IgKGludmFsaWQgcGFyYW1ldGVyIG9yIGluc3VmZmljaWVudCBtZW1vcnkpLgotV0VCUF9FWFRFUk4oaW50KSBXZWJQUGljdHVyZVJlc2NhbGUoV2ViUFBpY3R1cmUqIHBpYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLQotLy8gQ29sb3JzcGFjZSBjb252ZXJzaW9uIGZ1bmN0aW9uIHRvIGltcG9ydCBSR0Igc2FtcGxlcy4KLS8vIFByZXZpb3VzIGJ1ZmZlciB3aWxsIGJlIGZyZWUnZCwgaWYgYW55LgotLy8gKnJnYiBidWZmZXIgc2hvdWxkIGhhdmUgYSBzaXplIG9mIGF0IGxlYXN0IGhlaWdodCAqIHJnYl9zdHJpZGUuCi0vLyBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgbWVtb3J5IGVycm9yLgotV0VCUF9FWFRFUk4oaW50KSBXZWJQUGljdHVyZUltcG9ydFJHQigKLSAgICBXZWJQUGljdHVyZSogcGljdHVyZSwgY29uc3QgdWludDhfdCogcmdiLCBpbnQgcmdiX3N0cmlkZSk7Ci0vLyBTYW1lLCBidXQgZm9yIFJHQkEgYnVmZmVyLgotV0VCUF9FWFRFUk4oaW50KSBXZWJQUGljdHVyZUltcG9ydFJHQkEoCi0gICAgV2ViUFBpY3R1cmUqIHBpY3R1cmUsIGNvbnN0IHVpbnQ4X3QqIHJnYmEsIGludCByZ2JhX3N0cmlkZSk7Ci0vLyBTYW1lLCBidXQgZm9yIFJHQkEgYnVmZmVyLiBJbXBvcnRzIHRoZSBSR0IgZGlyZWN0IGZyb20gdGhlIDMyLWJpdCBmb3JtYXQKLS8vIGlucHV0IGJ1ZmZlciBpZ25vcmluZyB0aGUgYWxwaGEgY2hhbm5lbC4gQXZvaWRzIG5lZWRpbmcgdG8gY29weSB0aGUgZGF0YQotLy8gdG8gYSB0ZW1wb3JhcnkgMjQtYml0IFJHQiBidWZmZXIgdG8gaW1wb3J0IHRoZSBSR0Igb25seS4KLVdFQlBfRVhURVJOKGludCkgV2ViUFBpY3R1cmVJbXBvcnRSR0JYKAotICAgIFdlYlBQaWN0dXJlKiBwaWN0dXJlLCBjb25zdCB1aW50OF90KiByZ2J4LCBpbnQgcmdieF9zdHJpZGUpOwotCi0vLyBWYXJpYW50cyBvZiB0aGUgYWJvdmUsIGJ1dCB0YWtpbmcgQkdSKEF8WCkgaW5wdXQuCi1XRUJQX0VYVEVSTihpbnQpIFdlYlBQaWN0dXJlSW1wb3J0QkdSKAotICAgIFdlYlBQaWN0dXJlKiBwaWN0dXJlLCBjb25zdCB1aW50OF90KiBiZ3IsIGludCBiZ3Jfc3RyaWRlKTsKLVdFQlBfRVhURVJOKGludCkgV2ViUFBpY3R1cmVJbXBvcnRCR1JBKAotICAgIFdlYlBQaWN0dXJlKiBwaWN0dXJlLCBjb25zdCB1aW50OF90KiBiZ3JhLCBpbnQgYmdyYV9zdHJpZGUpOwotV0VCUF9FWFRFUk4oaW50KSBXZWJQUGljdHVyZUltcG9ydEJHUlgoCi0gICAgV2ViUFBpY3R1cmUqIHBpY3R1cmUsIGNvbnN0IHVpbnQ4X3QqIGJncngsIGludCBiZ3J4X3N0cmlkZSk7Ci0KLS8vIENvbnZlcnRzIHBpY3R1cmUtPmFyZ2IgZGF0YSB0byB0aGUgWVVWQSBmb3JtYXQgc3BlY2lmaWVkIGJ5ICdjb2xvcnNwYWNlJy4KLS8vIFVwb24gcmV0dXJuLCBwaWN0dXJlLT51c2VfYXJnYiBpcyBzZXQgdG8gZmFsc2UuIFRoZSBwcmVzZW5jZSBvZiByZWFsCi0vLyBub24tb3BhcXVlIHRyYW5zcGFyZW50IHZhbHVlcyBpcyBkZXRlY3RlZCwgYW5kICdjb2xvcnNwYWNlJyB3aWxsIGJlCi0vLyBhZGp1c3RlZCBhY2NvcmRpbmdseS4gTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGlzIGxvc3N5LgotLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIGVycm9yLgotV0VCUF9FWFRFUk4oaW50KSBXZWJQUGljdHVyZUFSR0JUb1lVVkEoV2ViUFBpY3R1cmUqIHBpY3R1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQRW5jQ1NQIGNvbG9yc3BhY2UpOwotCi0vLyBDb252ZXJ0cyBwaWN0dXJlLT55dXYgdG8gcGljdHVyZS0+YXJnYiBhbmQgc2V0cyBwaWN0dXJlLT51c2VfYXJnYiB0byB0cnVlLgotLy8gVGhlIGlucHV0IGZvcm1hdCBtdXN0IGJlIFlVVl80MjAgb3IgWVVWXzQyMEEuCi0vLyBOb3RlIHRoYXQgdGhlIHVzZSBvZiB0aGlzIG1ldGhvZCBpcyBkaXNjb3VyYWdlZCBpZiBvbmUgaGFzIGFjY2VzcyB0byB0aGUKLS8vIHJhdyBBUkdCIHNhbXBsZXMsIHNpbmNlIHVzaW5nIFlVVjQyMCBpcyBjb21wYXJhdGl2ZWx5IGxvc3N5LiBBbHNvLCB0aGUKLS8vIGNvbnZlcnNpb24gZnJvbSBZVVY0MjAgdG8gQVJHQiBpbmN1cnMgYSBzbWFsbCBsb3NzIHRvby4KLS8vIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiBlcnJvci4KLVdFQlBfRVhURVJOKGludCkgV2ViUFBpY3R1cmVZVVZBVG9BUkdCKFdlYlBQaWN0dXJlKiBwaWN0dXJlKTsKLQotLy8gSGVscGVyIGZ1bmN0aW9uOiBnaXZlbiBhIHdpZHRoIHggaGVpZ2h0IHBsYW5lIG9mIFlVVihBKSBzYW1wbGVzCi0vLyAod2l0aCBzdHJpZGUgJ3N0cmlkZScpLCBjbGVhbi11cCB0aGUgWVVWIHNhbXBsZXMgdW5kZXIgZnVsbHkgdHJhbnNwYXJlbnQKLS8vIGFyZWEsIHRvIGhlbHAgY29tcHJlc3NpYmlsaXR5IChubyBndWFyYW50ZWUsIHRob3VnaCkuCi1XRUJQX0VYVEVSTih2b2lkKSBXZWJQQ2xlYW51cFRyYW5zcGFyZW50QXJlYShXZWJQUGljdHVyZSogcGljdHVyZSk7Ci0KLS8vIFNjYW4gdGhlIHBpY3R1cmUgJ3BpY3R1cmUnIGZvciB0aGUgcHJlc2VuY2Ugb2Ygbm9uIGZ1bGx5IG9wYXF1ZSBhbHBoYSB2YWx1ZXMuCi0vLyBSZXR1cm5zIHRydWUgaW4gc3VjaCBjYXNlLiBPdGhlcndpc2UgcmV0dXJucyBmYWxzZSAoaW5kaWNhdGluZyB0aGF0IHRoZQotLy8gYWxwaGEgcGxhbmUgY2FuIGJlIGlnbm9yZWQgYWx0b2dldGhlciBlLmcuKS4KLVdFQlBfRVhURVJOKGludCkgV2ViUFBpY3R1cmVIYXNUcmFuc3BhcmVuY3koY29uc3QgV2ViUFBpY3R1cmUqIHBpY3R1cmUpOwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTWFpbiBjYWxsCi0KLS8vIE1haW4gZW5jb2RpbmcgY2FsbCwgYWZ0ZXIgY29uZmlnIGFuZCBwaWN0dXJlIGhhdmUgYmVlbiBpbml0aWFsaXplZC4KLS8vICdwaWN0dXJlJyBtdXN0IGJlIGxlc3MgdGhhbiAxNjM4NHgxNjM4NCBpbiBkaW1lbnNpb24gKGNmIFdFQlBfTUFYX0RJTUVOU0lPTiksCi0vLyBhbmQgdGhlICdjb25maWcnIG9iamVjdCBtdXN0IGJlIGEgdmFsaWQgb25lLgotLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIGVycm9yLCB0cnVlIG90aGVyd2lzZS4KLS8vIEluIGNhc2Ugb2YgZXJyb3IsIHBpY3R1cmUtPmVycm9yX2NvZGUgaXMgdXBkYXRlZCBhY2NvcmRpbmdseS4KLS8vICdwaWN0dXJlJyBjYW4gaG9sZCB0aGUgc291cmNlIHNhbXBsZXMgaW4gYm90aCBZVVYoQSkgb3IgQVJHQiBpbnB1dCwgZGVwZW5kaW5nCi0vLyBvbiB0aGUgdmFsdWUgb2YgJ3BpY3R1cmUtPnVzZV9hcmdiJy4gSXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRvIHVzZQotLy8gdGhlIGZvcm1lciBmb3IgbG9zc3kgZW5jb2RpbmcsIGFuZCB0aGUgbGF0dGVyIGZvciBsb3NzbGVzcyBlbmNvZGluZwotLy8gKHdoZW4gY29uZmlnLmxvc3NsZXNzIGlzIHRydWUpLiBBdXRvbWF0aWMgY29udmVyc2lvbiBmcm9tIG9uZSBmb3JtYXQgdG8KLS8vIGFub3RoZXIgaXMgcHJvdmlkZWQgYnV0IHRoZXkgYm90aCBpbmN1ciBzb21lIGxvc3MuCi1XRUJQX0VYVEVSTihpbnQpIFdlYlBFbmNvZGUoY29uc3QgV2ViUENvbmZpZyogY29uZmlnLCBXZWJQUGljdHVyZSogcGljdHVyZSk7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgotCi0jZW5kaWYgIC8qIFdFQlBfV0VCUF9FTkNPREVfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3dlYnAvZm9ybWF0X2NvbnN0YW50cy5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvd2VicC9mb3JtYXRfY29uc3RhbnRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMDRiNTAuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvd2VicC9mb3JtYXRfY29uc3RhbnRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gIEludGVybmFsIGhlYWRlciBmb3IgY29uc3RhbnRzIHJlbGF0ZWQgdG8gV2ViUCBmaWxlIGZvcm1hdC4KLS8vCi0vLyBBdXRob3I6IFVydmFuZyAodXJ2YW5nQGdvb2dsZS5jb20pCi0KLSNpZm5kZWYgV0VCUF9XRUJQX0ZPUk1BVF9DT05TVEFOVFNfSF8KLSNkZWZpbmUgV0VCUF9XRUJQX0ZPUk1BVF9DT05TVEFOVFNfSF8KLQotLy8gQ3JlYXRlIGZvdXJjYyBvZiB0aGUgY2h1bmsgZnJvbSB0aGUgY2h1bmsgdGFnIGNoYXJhY3RlcnMuCi0jZGVmaW5lIE1LRk9VUkNDKGEsIGIsIGMsIGQpICgodWludDMyX3QpKGEpIHwgKGIpIDw8IDggfCAoYykgPDwgMTYgfCAoZCkgPDwgMjQpCi0KLS8vIFZQOCByZWxhdGVkIGNvbnN0YW50cy4KLSNkZWZpbmUgVlA4X1NJR05BVFVSRSAweDlkMDEyYSAgICAgICAgICAgICAgLy8gU2lnbmF0dXJlIGluIFZQOCBkYXRhLgotI2RlZmluZSBWUDhfTUFYX1BBUlRJVElPTjBfU0laRSAoMSA8PCAxOSkgICAvLyBtYXggc2l6ZSBvZiBtb2RlIHBhcnRpdGlvbgotI2RlZmluZSBWUDhfTUFYX1BBUlRJVElPTl9TSVpFICAoMSA8PCAyNCkgICAvLyBtYXggc2l6ZSBmb3IgdG9rZW4gcGFydGl0aW9uCi0jZGVmaW5lIFZQOF9GUkFNRV9IRUFERVJfU0laRSAxMCAgLy8gU2l6ZSBvZiB0aGUgZnJhbWUgaGVhZGVyIHdpdGhpbiBWUDggZGF0YS4KLQotLy8gVlA4TCByZWxhdGVkIGNvbnN0YW50cy4KLSNkZWZpbmUgVlA4TF9TSUdOQVRVUkVfU0laRSAgICAgICAgICAxICAgICAgLy8gVlA4TCBzaWduYXR1cmUgc2l6ZS4KLSNkZWZpbmUgVlA4TF9NQUdJQ19CWVRFICAgICAgICAgICAgICAweDJmICAgLy8gVlA4TCBzaWduYXR1cmUgYnl0ZS4KLSNkZWZpbmUgVlA4TF9JTUFHRV9TSVpFX0JJVFMgICAgICAgICAxNCAgICAgLy8gTnVtYmVyIG9mIGJpdHMgdXNlZCB0byBzdG9yZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aWR0aCBhbmQgaGVpZ2h0LgotI2RlZmluZSBWUDhMX1ZFUlNJT05fQklUUyAgICAgICAgICAgIDMgICAgICAvLyAzIGJpdHMgcmVzZXJ2ZWQgZm9yIHZlcnNpb24uCi0jZGVmaW5lIFZQOExfVkVSU0lPTiAgICAgICAgICAgICAgICAgMCAgICAgIC8vIHZlcnNpb24gMAotI2RlZmluZSBWUDhMX0ZSQU1FX0hFQURFUl9TSVpFICAgICAgIDUgICAgICAvLyBTaXplIG9mIHRoZSBWUDhMIGZyYW1lIGhlYWRlci4KLQotI2RlZmluZSBNQVhfUEFMRVRURV9TSVpFICAgICAgICAgICAgIDI1NgotI2RlZmluZSBNQVhfQ0FDSEVfQklUUyAgICAgICAgICAgICAgIDExCi0jZGVmaW5lIEhVRkZNQU5fQ09ERVNfUEVSX01FVEFfQ09ERSAgNQotI2RlZmluZSBBUkdCX0JMQUNLICAgICAgICAgICAgICAgICAgIDB4ZmYwMDAwMDAKLQotI2RlZmluZSBERUZBVUxUX0NPREVfTEVOR1RIICAgICAgICAgIDgKLSNkZWZpbmUgTUFYX0FMTE9XRURfQ09ERV9MRU5HVEggICAgICAxNQotCi0jZGVmaW5lIE5VTV9MSVRFUkFMX0NPREVTICAgICAgICAgICAgMjU2Ci0jZGVmaW5lIE5VTV9MRU5HVEhfQ09ERVMgICAgICAgICAgICAgMjQKLSNkZWZpbmUgTlVNX0RJU1RBTkNFX0NPREVTICAgICAgICAgICA0MAotI2RlZmluZSBDT0RFX0xFTkdUSF9DT0RFUyAgICAgICAgICAgIDE5Ci0KLSNkZWZpbmUgTUlOX0hVRkZNQU5fQklUUyAgICAgICAgICAgICAyICAvLyBtaW4gbnVtYmVyIG9mIEh1ZmZtYW4gYml0cwotI2RlZmluZSBNQVhfSFVGRk1BTl9CSVRTICAgICAgICAgICAgIDkgIC8vIG1heCBudW1iZXIgb2YgSHVmZm1hbiBiaXRzCi0KLSNkZWZpbmUgVFJBTlNGT1JNX1BSRVNFTlQgICAgICAgICAgICAxICAvLyBUaGUgYml0IHRvIGJlIHdyaXR0ZW4gd2hlbiBuZXh0IGRhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBiZSByZWFkIGlzIGEgdHJhbnNmb3JtLgotI2RlZmluZSBOVU1fVFJBTlNGT1JNUyAgICAgICAgICAgICAgIDQgIC8vIE1heGltdW0gbnVtYmVyIG9mIGFsbG93ZWQgdHJhbnNmb3JtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gYSBiaXRzdHJlYW0uCi10eXBlZGVmIGVudW0gewotICBQUkVESUNUT1JfVFJBTlNGT1JNICAgICAgPSAwLAotICBDUk9TU19DT0xPUl9UUkFOU0ZPUk0gICAgPSAxLAotICBTVUJUUkFDVF9HUkVFTiAgICAgICAgICAgPSAyLAotICBDT0xPUl9JTkRFWElOR19UUkFOU0ZPUk0gPSAzCi19IFZQOExJbWFnZVRyYW5zZm9ybVR5cGU7Ci0KLS8vIEFscGhhIHJlbGF0ZWQgY29uc3RhbnRzLgotI2RlZmluZSBBTFBIQV9IRUFERVJfTEVOICAgICAgICAgICAgMQotI2RlZmluZSBBTFBIQV9OT19DT01QUkVTU0lPTiAgICAgICAgMAotI2RlZmluZSBBTFBIQV9MT1NTTEVTU19DT01QUkVTU0lPTiAgMQotI2RlZmluZSBBTFBIQV9QUkVQUk9DRVNTRURfTEVWRUxTICAgMQotCi0vLyBNdXggcmVsYXRlZCBjb25zdGFudHMuCi0jZGVmaW5lIFRBR19TSVpFICAgICAgICAgICA0ICAgICAvLyBTaXplIG9mIGEgY2h1bmsgdGFnIChlLmcuICJWUDhMIikuCi0jZGVmaW5lIENIVU5LX1NJWkVfQllURVMgICA0ICAgICAvLyBTaXplIG5lZWRlZCB0byBzdG9yZSBjaHVuaydzIHNpemUuCi0jZGVmaW5lIENIVU5LX0hFQURFUl9TSVpFICA4ICAgICAvLyBTaXplIG9mIGEgY2h1bmsgaGVhZGVyLgotI2RlZmluZSBSSUZGX0hFQURFUl9TSVpFICAgMTIgICAgLy8gU2l6ZSBvZiB0aGUgUklGRiBoZWFkZXIgKCJSSUZGbm5ubldFQlAiKS4KLSNkZWZpbmUgQU5NRl9DSFVOS19TSVpFICAgIDE2ICAgIC8vIFNpemUgb2YgYW4gQU5NRiBjaHVuay4KLSNkZWZpbmUgQU5JTV9DSFVOS19TSVpFICAgIDYgICAgIC8vIFNpemUgb2YgYW4gQU5JTSBjaHVuay4KLSNkZWZpbmUgRlJHTV9DSFVOS19TSVpFICAgIDYgICAgIC8vIFNpemUgb2YgYSBGUkdNIGNodW5rLgotI2RlZmluZSBWUDhYX0NIVU5LX1NJWkUgICAgMTAgICAgLy8gU2l6ZSBvZiBhIFZQOFggY2h1bmsuCi0KLSNkZWZpbmUgTUFYX0NBTlZBU19TSVpFICAgICAoMSA8PCAyNCkgICAgIC8vIDI0LWJpdCBtYXggZm9yIFZQOFggd2lkdGgvaGVpZ2h0LgotI2RlZmluZSBNQVhfSU1BR0VfQVJFQSAgICAgICgxVUxMIDw8IDMyKSAgLy8gMzItYml0IG1heCBmb3Igd2lkdGggeCBoZWlnaHQuCi0jZGVmaW5lIE1BWF9MT09QX0NPVU5UICAgICAgKDEgPDwgMTYpICAgICAvLyBtYXhpbXVtIHZhbHVlIGZvciBsb29wLWNvdW50Ci0jZGVmaW5lIE1BWF9EVVJBVElPTiAgICAgICAgKDEgPDwgMjQpICAgICAvLyBtYXhpbXVtIGR1cmF0aW9uCi0jZGVmaW5lIE1BWF9QT1NJVElPTl9PRkZTRVQgKDEgPDwgMjQpICAgICAvLyBtYXhpbXVtIGZyYW1lL2ZyYWdtZW50IHgveSBvZmZzZXQKLQotLy8gTWF4aW11bSBjaHVuayBwYXlsb2FkIGlzIHN1Y2ggdGhhdCBhZGRpbmcgdGhlIGhlYWRlciBhbmQgcGFkZGluZyB3b24ndAotLy8gb3ZlcmZsb3cgYSB1aW50MzJfdC4KLSNkZWZpbmUgTUFYX0NIVU5LX1BBWUxPQUQgKH4wVSAtIENIVU5LX0hFQURFUl9TSVpFIC0gMSkKLQotI2VuZGlmICAvKiBXRUJQX1dFQlBfRk9STUFUX0NPTlNUQU5UU19IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvd2VicC9tdXguaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3dlYnAvbXV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4YzdkYzYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvd2VicC9tdXguaAorKysgL2Rldi9udWxsCkBAIC0xLDM1NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gIFJJRkYgY29udGFpbmVyIG1hbmlwdWxhdGlvbiBmb3IgV0VCUCBpbWFnZXMuCi0vLwotLy8gQXV0aG9yczogVXJ2YW5nICh1cnZhbmdAZ29vZ2xlLmNvbSkKLS8vICAgICAgICAgIFZpa2FzICh2aWthc2FAZ29vZ2xlLmNvbSkKLQotLy8gVGhpcyBBUEkgYWxsb3dzIG1hbmlwdWxhdGlvbiBvZiBXZWJQIGNvbnRhaW5lciBpbWFnZXMgY29udGFpbmluZyBmZWF0dXJlcwotLy8gbGlrZSBjb2xvciBwcm9maWxlLCBtZXRhZGF0YSwgYW5pbWF0aW9uIGFuZCBmcmFnbWVudGVkIGltYWdlcy4KLS8vCi0vLyBDb2RlIEV4YW1wbGUjMTogQ3JlYXRpbmcgYSBNVVggd2l0aCBpbWFnZSBkYXRhLCBjb2xvciBwcm9maWxlIGFuZCBYTVAKLS8vIG1ldGFkYXRhLgotLy8KLS8vICAgaW50IGNvcHlfZGF0YSA9IDA7Ci0vLyAgIFdlYlBNdXgqIG11eCA9IFdlYlBNdXhOZXcoKTsKLS8vICAgLy8gLi4uIChQcmVwYXJlIGltYWdlIGRhdGEpLgotLy8gICBXZWJQTXV4U2V0SW1hZ2UobXV4LCAmaW1hZ2UsIGNvcHlfZGF0YSk7Ci0vLyAgIC8vIC4uLiAoUHJlcGFyZSBJQ0NQIGNvbG9yIHByb2ZpbGUgZGF0YSkuCi0vLyAgIFdlYlBNdXhTZXRDaHVuayhtdXgsICJJQ0NQIiwgJmljY19wcm9maWxlLCBjb3B5X2RhdGEpOwotLy8gICAvLyAuLi4gKFByZXBhcmUgWE1QIG1ldGFkYXRhKS4KLS8vICAgV2ViUE11eFNldENodW5rKG11eCwgIlhNUCAiLCAmeG1wLCBjb3B5X2RhdGEpOwotLy8gICAvLyBHZXQgZGF0YSBmcm9tIG11eCBpbiBXZWJQIFJJRkYgZm9ybWF0LgotLy8gICBXZWJQTXV4QXNzZW1ibGUobXV4LCAmb3V0cHV0X2RhdGEpOwotLy8gICBXZWJQTXV4RGVsZXRlKG11eCk7Ci0vLyAgIC8vIC4uLiAoQ29uc3VtZSBvdXRwdXRfZGF0YTsgZS5nLiB3cml0ZSBvdXRwdXRfZGF0YS5ieXRlcyB0byBmaWxlKS4KLS8vICAgV2ViUERhdGFDbGVhcigmb3V0cHV0X2RhdGEpOwotLy8KLS8vIENvZGUgRXhhbXBsZSMyOiBHZXQgaW1hZ2UgYW5kIGNvbG9yIHByb2ZpbGUgZGF0YSBmcm9tIGEgV2ViUCBmaWxlLgotLy8KLS8vICAgaW50IGNvcHlfZGF0YSA9IDA7Ci0vLyAgIC8vIC4uLiAoUmVhZCBkYXRhIGZyb20gZmlsZSkuCi0vLyAgIFdlYlBNdXgqIG11eCA9IFdlYlBNdXhDcmVhdGUoJmRhdGEsIGNvcHlfZGF0YSk7Ci0vLyAgIFdlYlBNdXhHZXRGcmFtZShtdXgsIDEsICZpbWFnZSk7Ci0vLyAgIC8vIC4uLiAoQ29uc3VtZSBpbWFnZTsgZS5nLiBjYWxsIFdlYlBEZWNvZGUoKSB0byBkZWNvZGUgdGhlIGRhdGEpLgotLy8gICBXZWJQTXV4R2V0Q2h1bmsobXV4LCAiSUNDUCIsICZpY2NfcHJvZmlsZSk7Ci0vLyAgIC8vIC4uLiAoQ29uc3VtZSBpY2NfZGF0YSkuCi0vLyAgIFdlYlBNdXhEZWxldGUobXV4KTsKLS8vICAgZnJlZShkYXRhKTsKLQotI2lmbmRlZiBXRUJQX1dFQlBfTVVYX0hfCi0jZGVmaW5lIFdFQlBfV0VCUF9NVVhfSF8KLQotI2luY2x1ZGUgIi4vbXV4X3R5cGVzLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jZGVmaW5lIFdFQlBfTVVYX0FCSV9WRVJTSU9OIDB4MDEwMCAgICAgICAgLy8gTUFKT1IoOGIpICsgTUlOT1IoOGIpCi0KLS8vIE5vdGU6IGZvcndhcmQgZGVjbGFyaW5nIGVudW1lcmF0aW9ucyBpcyBub3QgYWxsb3dlZCBpbiAoc3RyaWN0KSBDIGFuZCBDKyssCi0vLyB0aGUgdHlwZXMgYXJlIGxlZnQgaGVyZSBmb3IgcmVmZXJlbmNlLgotLy8gdHlwZWRlZiBlbnVtIFdlYlBNdXhFcnJvciBXZWJQTXV4RXJyb3I7Ci0vLyB0eXBlZGVmIGVudW0gV2ViUENodW5rSWQgV2ViUENodW5rSWQ7Ci10eXBlZGVmIHN0cnVjdCBXZWJQTXV4IFdlYlBNdXg7ICAgLy8gbWFpbiBvcGFxdWUgb2JqZWN0LgotdHlwZWRlZiBzdHJ1Y3QgV2ViUE11eEZyYW1lSW5mbyBXZWJQTXV4RnJhbWVJbmZvOwotdHlwZWRlZiBzdHJ1Y3QgV2ViUE11eEFuaW1QYXJhbXMgV2ViUE11eEFuaW1QYXJhbXM7Ci0KLS8vIEVycm9yIGNvZGVzCi10eXBlZGVmIGVudW0gV2ViUE11eEVycm9yIHsKLSAgV0VCUF9NVVhfT0sgICAgICAgICAgICAgICAgID0gIDEsCi0gIFdFQlBfTVVYX05PVF9GT1VORCAgICAgICAgICA9ICAwLAotICBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UICAgPSAtMSwKLSAgV0VCUF9NVVhfQkFEX0RBVEEgICAgICAgICAgID0gLTIsCi0gIFdFQlBfTVVYX01FTU9SWV9FUlJPUiAgICAgICA9IC0zLAotICBXRUJQX01VWF9OT1RfRU5PVUdIX0RBVEEgICAgPSAtNAotfSBXZWJQTXV4RXJyb3I7Ci0KLS8vIElEcyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIGNodW5rcy4KLXR5cGVkZWYgZW51bSBXZWJQQ2h1bmtJZCB7Ci0gIFdFQlBfQ0hVTktfVlA4WCwgICAgIC8vIFZQOFgKLSAgV0VCUF9DSFVOS19JQ0NQLCAgICAgLy8gSUNDUAotICBXRUJQX0NIVU5LX0FOSU0sICAgICAvLyBBTklNCi0gIFdFQlBfQ0hVTktfQU5NRiwgICAgIC8vIEFOTUYKLSAgV0VCUF9DSFVOS19GUkdNLCAgICAgLy8gRlJHTQotICBXRUJQX0NIVU5LX0FMUEhBLCAgICAvLyBBTFBICi0gIFdFQlBfQ0hVTktfSU1BR0UsICAgIC8vIFZQOC9WUDhMCi0gIFdFQlBfQ0hVTktfRVhJRiwgICAgIC8vIEVYSUYKLSAgV0VCUF9DSFVOS19YTVAsICAgICAgLy8gWE1QCi0gIFdFQlBfQ0hVTktfVU5LTk9XTiwgIC8vIE90aGVyIGNodW5rcy4KLSAgV0VCUF9DSFVOS19OSUwKLX0gV2ViUENodW5rSWQ7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIFJldHVybnMgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBtdXggbGlicmFyeSwgcGFja2VkIGluIGhleGFkZWNpbWFsIHVzaW5nCi0vLyA4Yml0cyBvciBlYWNoIG9mIG1ham9yL21pbm9yL3JldmlzaW9uLiBFLmc6IHYyLjUuNyBpcyAweDAyMDUwNy4KLVdFQlBfRVhURVJOKGludCkgV2ViUEdldE11eFZlcnNpb24odm9pZCk7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBMaWZlIG9mIGEgTXV4IG9iamVjdAotCi0vLyBJbnRlcm5hbCwgdmVyc2lvbi1jaGVja2VkLCBlbnRyeSBwb2ludAotV0VCUF9FWFRFUk4oV2ViUE11eCopIFdlYlBOZXdJbnRlcm5hbChpbnQpOwotCi0vLyBDcmVhdGVzIGFuIGVtcHR5IG11eCBvYmplY3QuCi0vLyBSZXR1cm5zOgotLy8gICBBIHBvaW50ZXIgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgZW1wdHkgbXV4IG9iamVjdC4KLXN0YXRpYyBXRUJQX0lOTElORSBXZWJQTXV4KiBXZWJQTXV4TmV3KHZvaWQpIHsKLSAgcmV0dXJuIFdlYlBOZXdJbnRlcm5hbChXRUJQX01VWF9BQklfVkVSU0lPTik7Ci19Ci0KLS8vIERlbGV0ZXMgdGhlIG11eCBvYmplY3QuCi0vLyBQYXJhbWV0ZXJzOgotLy8gICBtdXggLSAoaW4vb3V0KSBvYmplY3QgdG8gYmUgZGVsZXRlZAotV0VCUF9FWFRFUk4odm9pZCkgV2ViUE11eERlbGV0ZShXZWJQTXV4KiBtdXgpOwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTXV4IGNyZWF0aW9uLgotCi0vLyBJbnRlcm5hbCwgdmVyc2lvbi1jaGVja2VkLCBlbnRyeSBwb2ludAotV0VCUF9FWFRFUk4oV2ViUE11eCopIFdlYlBNdXhDcmVhdGVJbnRlcm5hbChjb25zdCBXZWJQRGF0YSosIGludCwgaW50KTsKLQotLy8gQ3JlYXRlcyBhIG11eCBvYmplY3QgZnJvbSByYXcgZGF0YSBnaXZlbiBpbiBXZWJQIFJJRkYgZm9ybWF0LgotLy8gUGFyYW1ldGVyczoKLS8vICAgYml0c3RyZWFtIC0gKGluKSB0aGUgYml0c3RyZWFtIGRhdGEgaW4gV2ViUCBSSUZGIGZvcm1hdAotLy8gICBjb3B5X2RhdGEgLSAoaW4pIHZhbHVlIDEgaW5kaWNhdGVzIGdpdmVuIGRhdGEgV0lMTCBiZSBjb3BpZWQgdG8gdGhlIG11eAotLy8gICAgICAgICAgICAgICBhbmQgdmFsdWUgMCBpbmRpY2F0ZXMgZGF0YSB3aWxsIE5PVCBiZSBjb3BpZWQuCi0vLyBSZXR1cm5zOgotLy8gICBBIHBvaW50ZXIgdG8gdGhlIG11eCBvYmplY3QgY3JlYXRlZCBmcm9tIGdpdmVuIGRhdGEgLSBvbiBzdWNjZXNzLgotLy8gICBOVUxMIC0gSW4gY2FzZSBvZiBpbnZhbGlkIGRhdGEgb3IgbWVtb3J5IGVycm9yLgotc3RhdGljIFdFQlBfSU5MSU5FIFdlYlBNdXgqIFdlYlBNdXhDcmVhdGUoY29uc3QgV2ViUERhdGEqIGJpdHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3B5X2RhdGEpIHsKLSAgcmV0dXJuIFdlYlBNdXhDcmVhdGVJbnRlcm5hbChiaXRzdHJlYW0sIGNvcHlfZGF0YSwgV0VCUF9NVVhfQUJJX1ZFUlNJT04pOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTm9uLWltYWdlIGNodW5rcy4KLQotLy8gTm90ZTogT25seSBub24taW1hZ2UgcmVsYXRlZCBjaHVua3Mgc2hvdWxkIGJlIG1hbmFnZWQgdGhyb3VnaCBjaHVuayBBUElzLgotLy8gKEltYWdlIHJlbGF0ZWQgY2h1bmtzIGFyZTogIkFOTUYiLCAiRlJHTSIsICJWUDggIiwgIlZQOEwiIGFuZCAiQUxQSCIpLgotLy8gVG8gYWRkLCBnZXQgYW5kIGRlbGV0ZSBpbWFnZXMsIHVzZSBBUElzIFdlYlBNdXhTZXRJbWFnZSgpLAotLy8gV2ViUE11eFB1c2hGcmFtZSgpLCBXZWJQTXV4R2V0RnJhbWUoKSBhbmQgV2ViUE11eERlbGV0ZUZyYW1lKCkuCi0KLS8vIEFkZHMgYSBjaHVuayB3aXRoIGlkICdmb3VyY2MnIGFuZCBkYXRhICdjaHVua19kYXRhJyBpbiB0aGUgbXV4IG9iamVjdC4KLS8vIEFueSBleGlzdGluZyBjaHVuayhzKSB3aXRoIHRoZSBzYW1lIGlkIHdpbGwgYmUgcmVtb3ZlZC4KLS8vIFBhcmFtZXRlcnM6Ci0vLyAgIG11eCAtIChpbi9vdXQpIG9iamVjdCB0byB3aGljaCB0aGUgY2h1bmsgaXMgdG8gYmUgYWRkZWQKLS8vICAgZm91cmNjIC0gKGluKSBhIGNoYXJhY3RlciBhcnJheSBjb250YWluaW5nIHRoZSBmb3VyY2Mgb2YgdGhlIGdpdmVuIGNodW5rOwotLy8gICAgICAgICAgICAgICAgIGUuZy4sICJJQ0NQIiwgIlhNUCAiLCAiRVhJRiIgZXRjLgotLy8gICBjaHVua19kYXRhIC0gKGluKSB0aGUgY2h1bmsgZGF0YSB0byBiZSBhZGRlZAotLy8gICBjb3B5X2RhdGEgLSAoaW4pIHZhbHVlIDEgaW5kaWNhdGVzIGdpdmVuIGRhdGEgV0lMTCBiZSBjb3BpZWQgdG8gdGhlIG11eAotLy8gICAgICAgICAgICAgICBhbmQgdmFsdWUgMCBpbmRpY2F0ZXMgZGF0YSB3aWxsIE5PVCBiZSBjb3BpZWQuCi0vLyBSZXR1cm5zOgotLy8gICBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UIC0gaWYgbXV4LCBmb3VyY2Mgb3IgY2h1bmtfZGF0YSBpcyBOVUxMCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBpZiBmb3VyY2MgY29ycmVzcG9uZHMgdG8gYW4gaW1hZ2UgY2h1bmsuCi0vLyAgIFdFQlBfTVVYX01FTU9SWV9FUlJPUiAtIG9uIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yLgotLy8gICBXRUJQX01VWF9PSyAtIG9uIHN1Y2Nlc3MuCi1XRUJQX0VYVEVSTihXZWJQTXV4RXJyb3IpIFdlYlBNdXhTZXRDaHVuaygKLSAgICBXZWJQTXV4KiBtdXgsIGNvbnN0IGNoYXIgZm91cmNjWzRdLCBjb25zdCBXZWJQRGF0YSogY2h1bmtfZGF0YSwKLSAgICBpbnQgY29weV9kYXRhKTsKLQotLy8gR2V0cyBhIHJlZmVyZW5jZSB0byB0aGUgZGF0YSBvZiB0aGUgY2h1bmsgd2l0aCBpZCAnZm91cmNjJyBpbiB0aGUgbXV4IG9iamVjdC4KLS8vIFRoZSBjYWxsZXIgc2hvdWxkIE5PVCBmcmVlIHRoZSByZXR1cm5lZCBkYXRhLgotLy8gUGFyYW1ldGVyczoKLS8vICAgbXV4IC0gKGluKSBvYmplY3QgZnJvbSB3aGljaCB0aGUgY2h1bmsgZGF0YSBpcyB0byBiZSBmZXRjaGVkCi0vLyAgIGZvdXJjYyAtIChpbikgYSBjaGFyYWN0ZXIgYXJyYXkgY29udGFpbmluZyB0aGUgZm91cmNjIG9mIHRoZSBjaHVuazsKLS8vICAgICAgICAgICAgICAgICBlLmcuLCAiSUNDUCIsICJYTVAgIiwgIkVYSUYiIGV0Yy4KLS8vICAgY2h1bmtfZGF0YSAtIChvdXQpIHJldHVybmVkIGNodW5rIGRhdGEKLS8vIFJldHVybnM6Ci0vLyAgIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQgLSBpZiBlaXRoZXIgbXV4LCBmb3VyY2Mgb3IgY2h1bmtfZGF0YSBpcyBOVUxMCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBpZiBmb3VyY2MgY29ycmVzcG9uZHMgdG8gYW4gaW1hZ2UgY2h1bmsuCi0vLyAgIFdFQlBfTVVYX05PVF9GT1VORCAtIElmIG11eCBkb2VzIG5vdCBjb250YWluIGEgY2h1bmsgd2l0aCB0aGUgZ2l2ZW4gaWQuCi0vLyAgIFdFQlBfTVVYX09LIC0gb24gc3VjY2Vzcy4KLVdFQlBfRVhURVJOKFdlYlBNdXhFcnJvcikgV2ViUE11eEdldENodW5rKAotICAgIGNvbnN0IFdlYlBNdXgqIG11eCwgY29uc3QgY2hhciBmb3VyY2NbNF0sIFdlYlBEYXRhKiBjaHVua19kYXRhKTsKLQotLy8gRGVsZXRlcyB0aGUgY2h1bmsgd2l0aCB0aGUgZ2l2ZW4gJ2ZvdXJjYycgZnJvbSB0aGUgbXV4IG9iamVjdC4KLS8vIFBhcmFtZXRlcnM6Ci0vLyAgIG11eCAtIChpbi9vdXQpIG9iamVjdCBmcm9tIHdoaWNoIHRoZSBjaHVuayBpcyB0byBiZSBkZWxldGVkCi0vLyAgIGZvdXJjYyAtIChpbikgYSBjaGFyYWN0ZXIgYXJyYXkgY29udGFpbmluZyB0aGUgZm91cmNjIG9mIHRoZSBjaHVuazsKLS8vICAgICAgICAgICAgICAgICBlLmcuLCAiSUNDUCIsICJYTVAgIiwgIkVYSUYiIGV0Yy4KLS8vIFJldHVybnM6Ci0vLyAgIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQgLSBpZiBtdXggb3IgZm91cmNjIGlzIE5VTEwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGlmIGZvdXJjYyBjb3JyZXNwb25kcyB0byBhbiBpbWFnZSBjaHVuay4KLS8vICAgV0VCUF9NVVhfTk9UX0ZPVU5EIC0gSWYgbXV4IGRvZXMgbm90IGNvbnRhaW4gYSBjaHVuayB3aXRoIHRoZSBnaXZlbiBmb3VyY2MuCi0vLyAgIFdFQlBfTVVYX09LIC0gb24gc3VjY2Vzcy4KLVdFQlBfRVhURVJOKFdlYlBNdXhFcnJvcikgV2ViUE11eERlbGV0ZUNodW5rKAotICAgIFdlYlBNdXgqIG11eCwgY29uc3QgY2hhciBmb3VyY2NbNF0pOwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gSW1hZ2VzLgotCi0vLyBFbmNhcHN1bGF0ZXMgZGF0YSBhYm91dCBhIHNpbmdsZSBmcmFtZS9mcmFnbWVudC4KLXN0cnVjdCBXZWJQTXV4RnJhbWVJbmZvIHsKLSAgV2ViUERhdGEgICAgYml0c3RyZWFtOyAgLy8gaW1hZ2UgZGF0YTogY2FuIGVpdGhlciBiZSBhIHJhdyBWUDgvVlA4TCBiaXRzdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3IgYSBzaW5nbGUtaW1hZ2UgV2ViUCBmaWxlLgotICBpbnQgICAgICAgICB4X29mZnNldDsgICAvLyB4LW9mZnNldCBvZiB0aGUgZnJhbWUuCi0gIGludCAgICAgICAgIHlfb2Zmc2V0OyAgIC8vIHktb2Zmc2V0IG9mIHRoZSBmcmFtZS4KLSAgaW50ICAgICAgICAgZHVyYXRpb247ICAgLy8gZHVyYXRpb24gb2YgdGhlIGZyYW1lIChpbiBtaWxsaXNlY29uZHMpLgotCi0gIFdlYlBDaHVua0lkIGlkOyAgICAgICAgIC8vIGZyYW1lIHR5cGU6IHNob3VsZCBiZSBvbmUgb2YgV0VCUF9DSFVOS19BTk1GLAotICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXRUJQX0NIVU5LX0ZSR00gb3IgV0VCUF9DSFVOS19JTUFHRQotICBXZWJQTXV4QW5pbURpc3Bvc2UgZGlzcG9zZV9tZXRob2Q7ICAvLyBEaXNwb3NhbCBtZXRob2QgZm9yIHRoZSBmcmFtZS4KLSAgdWludDMyX3QgICAgcGFkWzJdOyAgICAgLy8gcGFkZGluZyBmb3IgbGF0ZXIgdXNlCi19OwotCi0vLyBTZXRzIHRoZSAobm9uLWFuaW1hdGVkIGFuZCBub24tZnJhZ21lbnRlZCkgaW1hZ2UgaW4gdGhlIG11eCBvYmplY3QuCi0vLyBOb3RlOiBBbnkgZXhpc3RpbmcgaW1hZ2VzIChpbmNsdWRpbmcgZnJhbWVzL2ZyYWdtZW50cykgd2lsbCBiZSByZW1vdmVkLgotLy8gUGFyYW1ldGVyczoKLS8vICAgbXV4IC0gKGluL291dCkgb2JqZWN0IGluIHdoaWNoIHRoZSBpbWFnZSBpcyB0byBiZSBzZXQKLS8vICAgYml0c3RyZWFtIC0gKGluKSBjYW4gZWl0aGVyIGJlIGEgcmF3IFZQOC9WUDhMIGJpdHN0cmVhbSBvciBhIHNpbmdsZS1pbWFnZQotLy8gICAgICAgICAgICAgICBXZWJQIGZpbGUgKG5vbi1hbmltYXRlZCBhbmQgbm9uLWZyYWdtZW50ZWQpCi0vLyAgIGNvcHlfZGF0YSAtIChpbikgdmFsdWUgMSBpbmRpY2F0ZXMgZ2l2ZW4gZGF0YSBXSUxMIGJlIGNvcGllZCB0byB0aGUgbXV4Ci0vLyAgICAgICAgICAgICAgIGFuZCB2YWx1ZSAwIGluZGljYXRlcyBkYXRhIHdpbGwgTk9UIGJlIGNvcGllZC4KLS8vIFJldHVybnM6Ci0vLyAgIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQgLSBpZiBtdXggaXMgTlVMTCBvciBiaXRzdHJlYW0gaXMgTlVMTC4KLS8vICAgV0VCUF9NVVhfTUVNT1JZX0VSUk9SIC0gb24gbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IuCi0vLyAgIFdFQlBfTVVYX09LIC0gb24gc3VjY2Vzcy4KLVdFQlBfRVhURVJOKFdlYlBNdXhFcnJvcikgV2ViUE11eFNldEltYWdlKAotICAgIFdlYlBNdXgqIG11eCwgY29uc3QgV2ViUERhdGEqIGJpdHN0cmVhbSwgaW50IGNvcHlfZGF0YSk7Ci0KLS8vIEFkZHMgYSBmcmFtZSBhdCB0aGUgZW5kIG9mIHRoZSBtdXggb2JqZWN0LgotLy8gTm90ZXM6ICgxKSBmcmFtZS5pZCBzaG91bGQgYmUgb25lIG9mIFdFQlBfQ0hVTktfQU5NRiBvciBXRUJQX0NIVU5LX0ZSR00KLS8vICAgICAgICAoMikgRm9yIHNldHRpbmcgYSBub24tYW5pbWF0ZWQgbm9uLWZyYWdtZW50ZWQgaW1hZ2UsIHVzZQotLy8gICAgICAgICAgICBXZWJQTXV4U2V0SW1hZ2UoKSBpbnN0ZWFkLgotLy8gICAgICAgICgzKSBUeXBlIG9mIGZyYW1lIGJlaW5nIHB1c2hlZCBtdXN0IGJlIHNhbWUgYXMgdGhlIGZyYW1lcyBpbiBtdXguCi0vLyAgICAgICAgKDQpIEFzIFdlYlAgb25seSBzdXBwb3J0cyBldmVuIG9mZnNldHMsIGFueSBvZGQgb2Zmc2V0IHdpbGwgYmUgc25hcHBlZAotLy8gICAgICAgICAgICB0byBhbiBldmVuIGxvY2F0aW9uIHVzaW5nOiBvZmZzZXQgJj0gfjEKLS8vIFBhcmFtZXRlcnM6Ci0vLyAgIG11eCAtIChpbi9vdXQpIG9iamVjdCB0byB3aGljaCB0aGUgZnJhbWUgaXMgdG8gYmUgYWRkZWQKLS8vICAgZnJhbWUgLSAoaW4pIGZyYW1lIGRhdGEuCi0vLyAgIGNvcHlfZGF0YSAtIChpbikgdmFsdWUgMSBpbmRpY2F0ZXMgZ2l2ZW4gZGF0YSBXSUxMIGJlIGNvcGllZCB0byB0aGUgbXV4Ci0vLyAgICAgICAgICAgICAgIGFuZCB2YWx1ZSAwIGluZGljYXRlcyBkYXRhIHdpbGwgTk9UIGJlIGNvcGllZC4KLS8vIFJldHVybnM6Ci0vLyAgIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQgLSBpZiBtdXggb3IgZnJhbWUgaXMgTlVMTAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaWYgY29udGVudCBvZiAnZnJhbWUnIGlzIGludmFsaWQuCi0vLyAgIFdFQlBfTVVYX01FTU9SWV9FUlJPUiAtIG9uIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yLgotLy8gICBXRUJQX01VWF9PSyAtIG9uIHN1Y2Nlc3MuCi1XRUJQX0VYVEVSTihXZWJQTXV4RXJyb3IpIFdlYlBNdXhQdXNoRnJhbWUoCi0gICAgV2ViUE11eCogbXV4LCBjb25zdCBXZWJQTXV4RnJhbWVJbmZvKiBmcmFtZSwgaW50IGNvcHlfZGF0YSk7Ci0KLS8vIEdldHMgdGhlIG50aCBmcmFtZSBmcm9tIHRoZSBtdXggb2JqZWN0LgotLy8gVGhlIGNvbnRlbnQgb2YgJ2ZyYW1lLT5iaXRzdHJlYW0nIGlzIGFsbG9jYXRlZCB1c2luZyBtYWxsb2MoKSwgYW5kIE5PVAotLy8gb3duZWQgYnkgdGhlICdtdXgnIG9iamVjdC4gSXQgTVVTVCBiZSBkZWFsbG9jYXRlZCBieSB0aGUgY2FsbGVyIGJ5IGNhbGxpbmcKLS8vIFdlYlBEYXRhQ2xlYXIoKS4KLS8vIG50aD0wIGhhcyBhIHNwZWNpYWwgbWVhbmluZyAtIGxhc3QgcG9zaXRpb24uCi0vLyBQYXJhbWV0ZXJzOgotLy8gICBtdXggLSAoaW4pIG9iamVjdCBmcm9tIHdoaWNoIHRoZSBpbmZvIGlzIHRvIGJlIGZldGNoZWQKLS8vICAgbnRoIC0gKGluKSBpbmRleCBvZiB0aGUgZnJhbWUgaW4gdGhlIG11eCBvYmplY3QKLS8vICAgZnJhbWUgLSAob3V0KSBkYXRhIG9mIHRoZSByZXR1cm5lZCBmcmFtZQotLy8gUmV0dXJuczoKLS8vICAgV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIG11eCBvciBmcmFtZSBpcyBOVUxMLgotLy8gICBXRUJQX01VWF9OT1RfRk9VTkQgLSBpZiB0aGVyZSBhcmUgbGVzcyB0aGFuIG50aCBmcmFtZXMgaW4gdGhlIG11eCBvYmplY3QuCi0vLyAgIFdFQlBfTVVYX0JBRF9EQVRBIC0gaWYgbnRoIGZyYW1lIGNodW5rIGluIG11eCBpcyBpbnZhbGlkLgotLy8gICBXRUJQX01VWF9PSyAtIG9uIHN1Y2Nlc3MuCi1XRUJQX0VYVEVSTihXZWJQTXV4RXJyb3IpIFdlYlBNdXhHZXRGcmFtZSgKLSAgICBjb25zdCBXZWJQTXV4KiBtdXgsIHVpbnQzMl90IG50aCwgV2ViUE11eEZyYW1lSW5mbyogZnJhbWUpOwotCi0vLyBEZWxldGVzIGEgZnJhbWUgZnJvbSB0aGUgbXV4IG9iamVjdC4KLS8vIG50aD0wIGhhcyBhIHNwZWNpYWwgbWVhbmluZyAtIGxhc3QgcG9zaXRpb24uCi0vLyBQYXJhbWV0ZXJzOgotLy8gICBtdXggLSAoaW4vb3V0KSBvYmplY3QgZnJvbSB3aGljaCBhIGZyYW1lIGlzIHRvIGJlIGRlbGV0ZWQKLS8vICAgbnRoIC0gKGluKSBUaGUgcG9zaXRpb24gZnJvbSB3aGljaCB0aGUgZnJhbWUgaXMgdG8gYmUgZGVsZXRlZAotLy8gUmV0dXJuczoKLS8vICAgV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIG11eCBpcyBOVUxMLgotLy8gICBXRUJQX01VWF9OT1RfRk9VTkQgLSBJZiB0aGVyZSBhcmUgbGVzcyB0aGFuIG50aCBmcmFtZXMgaW4gdGhlIG11eCBvYmplY3QKLS8vICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlIGRlbGV0aW9uLgotLy8gICBXRUJQX01VWF9PSyAtIG9uIHN1Y2Nlc3MuCi1XRUJQX0VYVEVSTihXZWJQTXV4RXJyb3IpIFdlYlBNdXhEZWxldGVGcmFtZShXZWJQTXV4KiBtdXgsIHVpbnQzMl90IG50aCk7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBBbmltYXRpb24uCi0KLS8vIEFuaW1hdGlvbiBwYXJhbWV0ZXJzLgotc3RydWN0IFdlYlBNdXhBbmltUGFyYW1zIHsKLSAgdWludDMyX3QgYmdjb2xvcjsgIC8vIEJhY2tncm91bmQgY29sb3Igb2YgdGhlIGNhbnZhcyBzdG9yZWQgKGluIE1TQiBvcmRlcikgYXM6Ci0gICAgICAgICAgICAgICAgICAgICAvLyBCaXRzIDAwIHRvIDA3OiBBbHBoYS4KLSAgICAgICAgICAgICAgICAgICAgIC8vIEJpdHMgMDggdG8gMTU6IFJlZC4KLSAgICAgICAgICAgICAgICAgICAgIC8vIEJpdHMgMTYgdG8gMjM6IEdyZWVuLgotICAgICAgICAgICAgICAgICAgICAgLy8gQml0cyAyNCB0byAzMTogQmx1ZS4KLSAgaW50IGxvb3BfY291bnQ7ICAgIC8vIE51bWJlciBvZiB0aW1lcyB0byByZXBlYXQgdGhlIGFuaW1hdGlvbiBbMCA9IGluZmluaXRlXS4KLX07Ci0KLS8vIFNldHMgdGhlIGFuaW1hdGlvbiBwYXJhbWV0ZXJzIGluIHRoZSBtdXggb2JqZWN0LiBBbnkgZXhpc3RpbmcgQU5JTSBjaHVua3MKLS8vIHdpbGwgYmUgcmVtb3ZlZC4KLS8vIFBhcmFtZXRlcnM6Ci0vLyAgIG11eCAtIChpbi9vdXQpIG9iamVjdCBpbiB3aGljaCBBTklNIGNodW5rIGlzIHRvIGJlIHNldC9hZGRlZAotLy8gICBwYXJhbXMgLSAoaW4pIGFuaW1hdGlvbiBwYXJhbWV0ZXJzLgotLy8gUmV0dXJuczoKLS8vICAgV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIGVpdGhlciBtdXggb3IgcGFyYW1zIGlzIE5VTEwKLS8vICAgV0VCUF9NVVhfTUVNT1JZX0VSUk9SIC0gb24gbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IuCi0vLyAgIFdFQlBfTVVYX09LIC0gb24gc3VjY2Vzcy4KLVdFQlBfRVhURVJOKFdlYlBNdXhFcnJvcikgV2ViUE11eFNldEFuaW1hdGlvblBhcmFtcygKLSAgICBXZWJQTXV4KiBtdXgsIGNvbnN0IFdlYlBNdXhBbmltUGFyYW1zKiBwYXJhbXMpOwotCi0vLyBHZXRzIHRoZSBhbmltYXRpb24gcGFyYW1ldGVycyBmcm9tIHRoZSBtdXggb2JqZWN0LgotLy8gUGFyYW1ldGVyczoKLS8vICAgbXV4IC0gKGluKSBvYmplY3QgZnJvbSB3aGljaCB0aGUgYW5pbWF0aW9uIHBhcmFtZXRlcnMgdG8gYmUgZmV0Y2hlZAotLy8gICBwYXJhbXMgLSAob3V0KSBhbmltYXRpb24gcGFyYW1ldGVycyBleHRyYWN0ZWQgZnJvbSB0aGUgQU5JTSBjaHVuawotLy8gUmV0dXJuczoKLS8vICAgV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIGVpdGhlciBvZiBtdXggb3IgcGFyYW1zIGlzIE5VTEwKLS8vICAgV0VCUF9NVVhfTk9UX0ZPVU5EIC0gaWYgQU5JTSBjaHVuayBpcyBub3QgcHJlc2VudCBpbiBtdXggb2JqZWN0LgotLy8gICBXRUJQX01VWF9PSyAtIG9uIHN1Y2Nlc3MuCi1XRUJQX0VYVEVSTihXZWJQTXV4RXJyb3IpIFdlYlBNdXhHZXRBbmltYXRpb25QYXJhbXMoCi0gICAgY29uc3QgV2ViUE11eCogbXV4LCBXZWJQTXV4QW5pbVBhcmFtcyogcGFyYW1zKTsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE1pc2MgVXRpbGl0aWVzLgotCi0vLyBHZXRzIHRoZSBmZWF0dXJlIGZsYWdzIGZyb20gdGhlIG11eCBvYmplY3QuCi0vLyBQYXJhbWV0ZXJzOgotLy8gICBtdXggLSAoaW4pIG9iamVjdCBmcm9tIHdoaWNoIHRoZSBmZWF0dXJlcyBhcmUgdG8gYmUgZmV0Y2hlZAotLy8gICBmbGFncyAtIChvdXQpIHRoZSBmbGFncyBzcGVjaWZ5aW5nIHdoaWNoIGZlYXR1cmVzIGFyZSBwcmVzZW50IGluIHRoZQotLy8gICAgICAgICAgIG11eCBvYmplY3QuIFRoaXMgd2lsbCBiZSBhbiBPUiBvZiB2YXJpb3VzIGZsYWcgdmFsdWVzLgotLy8gICAgICAgICAgIEVudW0gJ1dlYlBGZWF0dXJlRmxhZ3MnIGNhbiBiZSB1c2VkIHRvIHRlc3QgaW5kaXZpZHVhbCBmbGFnIHZhbHVlcy4KLS8vIFJldHVybnM6Ci0vLyAgIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQgLSBpZiBtdXggb3IgZmxhZ3MgaXMgTlVMTAotLy8gICBXRUJQX01VWF9OT1RfRk9VTkQgLSBpZiBWUDhYIGNodW5rIGlzIG5vdCBwcmVzZW50IGluIG11eCBvYmplY3QuCi0vLyAgIFdFQlBfTVVYX0JBRF9EQVRBIC0gaWYgVlA4WCBjaHVuayBpbiBtdXggaXMgaW52YWxpZC4KLS8vICAgV0VCUF9NVVhfT0sgLSBvbiBzdWNjZXNzLgotV0VCUF9FWFRFUk4oV2ViUE11eEVycm9yKSBXZWJQTXV4R2V0RmVhdHVyZXMoY29uc3QgV2ViUE11eCogbXV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGZsYWdzKTsKLQotLy8gR2V0cyBudW1iZXIgb2YgY2h1bmtzIGhhdmluZyB0YWcgdmFsdWUgdGFnIGluIHRoZSBtdXggb2JqZWN0LgotLy8gUGFyYW1ldGVyczoKLS8vICAgbXV4IC0gKGluKSBvYmplY3QgZnJvbSB3aGljaCB0aGUgaW5mbyBpcyB0byBiZSBmZXRjaGVkCi0vLyAgIGlkIC0gKGluKSBjaHVuayBpZCBzcGVjaWZ5aW5nIHRoZSB0eXBlIG9mIGNodW5rCi0vLyAgIG51bV9lbGVtZW50cyAtIChvdXQpIG51bWJlciBvZiBjaHVua3Mgd2l0aCB0aGUgZ2l2ZW4gY2h1bmsgaWQKLS8vIFJldHVybnM6Ci0vLyAgIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQgLSBpZiBlaXRoZXIgbXV4LCBvciBudW1fZWxlbWVudHMgaXMgTlVMTAotLy8gICBXRUJQX01VWF9PSyAtIG9uIHN1Y2Nlc3MuCi1XRUJQX0VYVEVSTihXZWJQTXV4RXJyb3IpIFdlYlBNdXhOdW1DaHVua3MoY29uc3QgV2ViUE11eCogbXV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBDaHVua0lkIGlkLCBpbnQqIG51bV9lbGVtZW50cyk7Ci0KLS8vIEFzc2VtYmxlcyBhbGwgY2h1bmtzIGluIFdlYlAgUklGRiBmb3JtYXQgYW5kIHJldHVybnMgaW4gJ2Fzc2VtYmxlZF9kYXRhJy4KLS8vIFRoaXMgZnVuY3Rpb24gYWxzbyB2YWxpZGF0ZXMgdGhlIG11eCBvYmplY3QuCi0vLyBOb3RlOiBUaGUgY29udGVudCBvZiAnYXNzZW1ibGVkX2RhdGEnIHdpbGwgYmUgaWdub3JlZCBhbmQgb3ZlcndyaXR0ZW4uCi0vLyBBbHNvLCB0aGUgY29udGVudCBvZiAnYXNzZW1ibGVkX2RhdGEnIGlzIGFsbG9jYXRlZCB1c2luZyBtYWxsb2MoKSwgYW5kIE5PVAotLy8gb3duZWQgYnkgdGhlICdtdXgnIG9iamVjdC4gSXQgTVVTVCBiZSBkZWFsbG9jYXRlZCBieSB0aGUgY2FsbGVyIGJ5IGNhbGxpbmcKLS8vIFdlYlBEYXRhQ2xlYXIoKS4KLS8vIFBhcmFtZXRlcnM6Ci0vLyAgIG11eCAtIChpbi9vdXQpIG9iamVjdCB3aG9zZSBjaHVua3MgYXJlIHRvIGJlIGFzc2VtYmxlZAotLy8gICBhc3NlbWJsZWRfZGF0YSAtIChvdXQpIGFzc2VtYmxlZCBXZWJQIGRhdGEKLS8vIFJldHVybnM6Ci0vLyAgIFdFQlBfTVVYX0JBRF9EQVRBIC0gaWYgbXV4IG9iamVjdCBpcyBpbnZhbGlkLgotLy8gICBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UIC0gaWYgZWl0aGVyIG11eCwgb3V0cHV0X2RhdGEgb3Igb3V0cHV0X3NpemUgaXMKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwuCi0vLyAgIFdFQlBfTVVYX01FTU9SWV9FUlJPUiAtIG9uIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yLgotLy8gICBXRUJQX01VWF9PSyAtIG9uIHN1Y2Nlc3MKLVdFQlBfRVhURVJOKFdlYlBNdXhFcnJvcikgV2ViUE11eEFzc2VtYmxlKFdlYlBNdXgqIG11eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBEYXRhKiBhc3NlbWJsZWRfZGF0YSk7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgotCi0jZW5kaWYgIC8qIFdFQlBfV0VCUF9NVVhfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3dlYnAvbXV4X3R5cGVzLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC93ZWJwL211eF90eXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzdhYmFjLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3dlYnAvbXV4X3R5cGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gRGF0YS10eXBlcyBjb21tb24gdG8gdGhlIG11eCBhbmQgZGVtdXggbGlicmFyaWVzLgotLy8KLS8vIEF1dGhvcjogVXJ2YW5nICh1cnZhbmdAZ29vZ2xlLmNvbSkKLQotI2lmbmRlZiBXRUJQX1dFQlBfTVVYX1RZUEVTX0hfCi0jZGVmaW5lIFdFQlBfV0VCUF9NVVhfVFlQRVNfSF8KLQotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCi0jZWxzZQotI2luY2x1ZGUgPHN0ZGxpYi5oPiAgLy8gZnJlZSgpCi0jaW5jbHVkZSA8c3RyaW5nLmg+ICAvLyBtZW1zZXQoKQotI2VuZGlmCi0jaW5jbHVkZSAiLi90eXBlcy5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLy8gTm90ZTogZm9yd2FyZCBkZWNsYXJpbmcgZW51bWVyYXRpb25zIGlzIG5vdCBhbGxvd2VkIGluIChzdHJpY3QpIEMgYW5kIEMrKywKLS8vIHRoZSB0eXBlcyBhcmUgbGVmdCBoZXJlIGZvciByZWZlcmVuY2UuCi0vLyB0eXBlZGVmIGVudW0gV2ViUEZlYXR1cmVGbGFncyBXZWJQRmVhdHVyZUZsYWdzOwotLy8gdHlwZWRlZiBlbnVtIFdlYlBNdXhBbmltRGlzcG9zZSBXZWJQTXV4QW5pbURpc3Bvc2U7Ci10eXBlZGVmIHN0cnVjdCBXZWJQRGF0YSBXZWJQRGF0YTsKLQotLy8gVlA4WCBGZWF0dXJlIEZsYWdzLgotdHlwZWRlZiBlbnVtIFdlYlBGZWF0dXJlRmxhZ3MgewotICBGUkFHTUVOVFNfRkxBRyAgPSAweDAwMDAwMDAxLAotICBBTklNQVRJT05fRkxBRyAgPSAweDAwMDAwMDAyLAotICBYTVBfRkxBRyAgICAgICAgPSAweDAwMDAwMDA0LAotICBFWElGX0ZMQUcgICAgICAgPSAweDAwMDAwMDA4LAotICBBTFBIQV9GTEFHICAgICAgPSAweDAwMDAwMDEwLAotICBJQ0NQX0ZMQUcgICAgICAgPSAweDAwMDAwMDIwCi19IFdlYlBGZWF0dXJlRmxhZ3M7Ci0KLS8vIERpc3Bvc2UgbWV0aG9kIChhbmltYXRpb24gb25seSkuIEluZGljYXRlcyBob3cgdGhlIGFyZWEgdXNlZCBieSB0aGUgY3VycmVudAotLy8gZnJhbWUgaXMgdG8gYmUgdHJlYXRlZCBiZWZvcmUgcmVuZGVyaW5nIHRoZSBuZXh0IGZyYW1lIG9uIHRoZSBjYW52YXMuCi10eXBlZGVmIGVudW0gV2ViUE11eEFuaW1EaXNwb3NlIHsKLSAgV0VCUF9NVVhfRElTUE9TRV9OT05FLCAgICAgICAvLyBEbyBub3QgZGlzcG9zZS4KLSAgV0VCUF9NVVhfRElTUE9TRV9CQUNLR1JPVU5EICAvLyBEaXNwb3NlIHRvIGJhY2tncm91bmQgY29sb3IuCi19IFdlYlBNdXhBbmltRGlzcG9zZTsKLQotLy8gRGF0YSB0eXBlIHVzZWQgdG8gZGVzY3JpYmUgJ3JhdycgZGF0YSwgZS5nLiwgY2h1bmsgZGF0YQotLy8gKElDQyBwcm9maWxlLCBtZXRhZGF0YSkgYW5kIFdlYlAgY29tcHJlc3NlZCBpbWFnZSBkYXRhLgotc3RydWN0IFdlYlBEYXRhIHsKLSAgY29uc3QgdWludDhfdCogYnl0ZXM7Ci0gIHNpemVfdCBzaXplOwotfTsKLQotLy8gSW5pdGlhbGl6ZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSAnd2VicF9kYXRhJyBvYmplY3Qgd2l0aCBkZWZhdWx0IHZhbHVlcy4KLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIFdlYlBEYXRhSW5pdChXZWJQRGF0YSogd2VicF9kYXRhKSB7Ci0gIGlmICh3ZWJwX2RhdGEgIT0gTlVMTCkgewotICAgIFNiTWVtb3J5U2V0KHdlYnBfZGF0YSwgMCwgc2l6ZW9mKCp3ZWJwX2RhdGEpKTsKLSAgfQotfQotCi0vLyBDbGVhcnMgdGhlIGNvbnRlbnRzIG9mIHRoZSAnd2VicF9kYXRhJyBvYmplY3QgYnkgY2FsbGluZyBmcmVlKCkuIERvZXMgbm90Ci0vLyBkZWFsbG9jYXRlIHRoZSBvYmplY3QgaXRzZWxmLgotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgV2ViUERhdGFDbGVhcihXZWJQRGF0YSogd2VicF9kYXRhKSB7Ci0gIGlmICh3ZWJwX2RhdGEgIT0gTlVMTCkgewotICAgIFNiTWVtb3J5RGVhbGxvY2F0ZSgodm9pZCopd2VicF9kYXRhLT5ieXRlcyk7Ci0gICAgV2ViUERhdGFJbml0KHdlYnBfZGF0YSk7Ci0gIH0KLX0KLQotLy8gQWxsb2NhdGVzIG5lY2Vzc2FyeSBzdG9yYWdlIGZvciAnZHN0JyBhbmQgY29waWVzIHRoZSBjb250ZW50cyBvZiAnc3JjJy4KLS8vIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLgotc3RhdGljIFdFQlBfSU5MSU5FIGludCBXZWJQRGF0YUNvcHkoY29uc3QgV2ViUERhdGEqIHNyYywgV2ViUERhdGEqIGRzdCkgewotICBpZiAoc3JjID09IE5VTEwgfHwgZHN0ID09IE5VTEwpIHJldHVybiAwOwotICBXZWJQRGF0YUluaXQoZHN0KTsKLSAgaWYgKHNyYy0+Ynl0ZXMgIT0gTlVMTCAmJiBzcmMtPnNpemUgIT0gMCkgewotICAgIGRzdC0+Ynl0ZXMgPSAodWludDhfdCopU2JNZW1vcnlBbGxvY2F0ZShzcmMtPnNpemUpOwotICAgIGlmIChkc3QtPmJ5dGVzID09IE5VTEwpIHJldHVybiAwOwotICAgIFNiTWVtb3J5Q29weSgodm9pZCopZHN0LT5ieXRlcywgc3JjLT5ieXRlcywgc3JjLT5zaXplKTsKLSAgICBkc3QtPnNpemUgPSBzcmMtPnNpemU7Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgotCi0jZW5kaWYgIC8qIFdFQlBfV0VCUF9NVVhfVFlQRVNfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3dlYnAvdHlwZXMuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3dlYnAvdHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU3MjA2My4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC93ZWJwL3R5cGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gIENvbW1vbiB0eXBlcwotLy8KLS8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCi0KLSNpZm5kZWYgV0VCUF9XRUJQX1RZUEVTX0hfCi0jZGVmaW5lIFdFQlBfV0VCUF9UWVBFU19IXwotCi0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL3R5cGVzLmgiCi0jZGVmaW5lIFdFQlBfSU5MSU5FIFNCX0NfSU5MSU5FCi0jZWxzZQotI2luY2x1ZGUgPHN0ZGRlZi5oPiAgLy8gZm9yIHNpemVfdAotCi0jaWZuZGVmIF9NU0NfVkVSCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpZmRlZiBfX1NUUklDVF9BTlNJX18KLSNkZWZpbmUgV0VCUF9JTkxJTkUKLSNlbHNlICAvKiBfX1NUUklDVF9BTlNJX18gKi8KLSNkZWZpbmUgV0VCUF9JTkxJTkUgaW5saW5lCi0jZW5kaWYKLSNlbHNlCi10eXBlZGVmIHNpZ25lZCAgIGNoYXIgaW50OF90OwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIHVpbnQ4X3Q7Ci10eXBlZGVmIHNpZ25lZCAgIHNob3J0IGludDE2X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVpbnQxNl90OwotdHlwZWRlZiBzaWduZWQgICBpbnQgaW50MzJfdDsKLXR5cGVkZWYgdW5zaWduZWQgaW50IHVpbnQzMl90OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgaW50IHVpbnQ2NF90OwotdHlwZWRlZiBsb25nIGxvbmcgaW50IGludDY0X3Q7Ci0jZGVmaW5lIFdFQlBfSU5MSU5FIF9fZm9yY2VpbmxpbmUKLSNlbmRpZiAgLyogX01TQ19WRVIgKi8KLSNlbmRpZiAgLyogZGVmaW5lZChTVEFSQk9BUkQpICovCi0KLSNpZm5kZWYgV0VCUF9FWFRFUk4KLS8vIFRoaXMgZXhwbGljaXRseSBtYXJrcyBsaWJyYXJ5IGZ1bmN0aW9ucyBhbmQgYWxsb3dzIGZvciBjaGFuZ2luZyB0aGUKLS8vIHNpZ25hdHVyZSBmb3IgZS5nLiwgV2luZG93cyBETEwgYnVpbGRzLgotI2RlZmluZSBXRUJQX0VYVEVSTih0eXBlKSBleHRlcm4gdHlwZQotI2VuZGlmICAvKiBXRUJQX0VYVEVSTiAqLwotCi0vLyBNYWNybyB0byBjaGVjayBBQkkgY29tcGF0aWJpbGl0eSAoc2FtZSBtYWpvciByZXZpc2lvbiBudW1iZXIpCi0jZGVmaW5lIFdFQlBfQUJJX0lTX0lOQ09NUEFUSUJMRShhLCBiKSAoKChhKSA+PiA4KSAhPSAoKGIpID4+IDgpKQotCi0jZW5kaWYgIC8qIFdFQlBfV0VCUF9UWVBFU19IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvd2VicF9qcy9pbmRleC5odG1sIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvd2VicF9qcy9pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwODczYTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC93ZWJwX2pzL2luZGV4Lmh0bWwKQEAgLTAsMCArMSw3NSBAQAorPCFET0NUWVBFIGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CisKKzxoZWFkPgorICA8bWV0YSBjaGFyc2V0PSJVVEYtOCI+CisgIDx0aXRsZT5zaW1wbGUgSmF2YXNjcmlwdCBXZWJQIGRlY29kaW5nIGRlbW88L3RpdGxlPgorICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgdmFyIE1vZHVsZSA9IHsKKyAgICAgIG5vSW5pdGlhbFJ1biA6IHRydWUKKyAgICB9OworICA8L3NjcmlwdD4KKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLi93ZWJwLmpzIj48L3NjcmlwdD4KKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorCisndXNlIHN0cmljdCc7CisKKy8vIG1haW4gd3JhcHBlciBmb3IgdGhlIGZ1bmN0aW9uIGRlY29kaW5nIGEgV2ViUCBpbnRvIGEgY2FudmFzIG9iamVjdAordmFyIFdlYnBUb0NhbnZhczsKKworZnVuY3Rpb24gaW5pdCgpIHsKKyAgV2VicFRvQ2FudmFzID0gTW9kdWxlLmN3cmFwKCdXZWJwVG9TREwnLCAnbnVtYmVyJywgWydhcnJheScsICdudW1iZXInXSk7Cit9Cit3aW5kb3cub25sb2FkID0gaW5pdDsKKworZnVuY3Rpb24gZGVjb2RlKHdlYnBfZGF0YSwgY2FudmFzX2lkKSB7CisgIC8vIGdldCB0aGUgY2FudmFzIHRvIGRlY29kZSBpbnRvCisgIHZhciBjYW52YXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjYW52YXNfaWQpOworICBpZiAoY2FudmFzID09IG51bGwpIHJldHVybjsKKyAgLy8gY2xlYXIgcHJldmlvdXMgcGljdHVyZSAoaWYgYW55KQorICBNb2R1bGUuY2FudmFzID0gY2FudmFzOworICBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKS5jbGVhclJlY3QoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTsKKyAgLy8gZGVjb2RlIGFuZCBtZWFzdXJlIHRpbWluZworICB2YXIgc3RhcnQgPSBuZXcgRGF0ZSgpOworICB2YXIgcmV0ID0gV2VicFRvQ2FudmFzKHdlYnBfZGF0YSwgd2VicF9kYXRhLmxlbmd0aCk7CisgIHZhciBlbmQgPSBuZXcgRGF0ZSgpOworICB2YXIgc3BlZWRfcmVzdWx0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RpbWluZycpOworICAvLyBkaXNwbGF5IHRpbWluZyByZXN1bHQKKyAgaWYgKHNwZWVkX3Jlc3VsdCAhPSBudWxsKSB7CisgICAgdmFyIGRlY29kZV90aW1lID0gZW5kIC0gc3RhcnQ7CisgICAgc3BlZWRfcmVzdWx0LmlubmVySFRNTCA9ICc8cD5kZWNvZGluZyB0aW1lOiAnICsgZGVjb2RlX3RpbWUgKycgbXMuPC9wPic7CisgIH0KK30KKworZnVuY3Rpb24gbG9hZGZpbGUoZmlsZW5hbWUsIGNhbnZhc19pZCkgeworICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CisgIHhoci5vcGVuKCdHRVQnLCBmaWxlbmFtZSk7CisgIHhoci5yZXNwb25zZVR5cGUgPSAnYXJyYXlidWZmZXInOworICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7CisgICAgaWYgKHhoci5yZWFkeVN0YXRlID09IDQgJiYgeGhyLnN0YXR1cyA9PSAyMDApIHsKKyAgICAgIHZhciB3ZWJwX2RhdGEgPSBuZXcgVWludDhBcnJheSh4aHIucmVzcG9uc2UpOworICAgICAgZGVjb2RlKHdlYnBfZGF0YSwgY2FudmFzX2lkKTsKKyAgICB9CisgIH07CisgIHhoci5zZW5kKCk7Cit9CisgIDwvc2NyaXB0PgorPC9oZWFkPgorCis8Ym9keT4KKyAgPHA+CisgICAgPHN0cm9uZz5XZWJQIGluIEphdmFTY3JpcHQgZGVtbzwvc3Ryb25nPiAtCisgIDwvcD4KKyAgPHA+CisgICAgV2ViUCBkZWNvZGVyIGluIEphdmFTY3JpcHQsIHVzaW5nIGxpYndlYnAgY29tcGlsZWQgd2l0aAorICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9rcmlwa2VuL2Vtc2NyaXB0ZW4vd2lraSI+RW1zY3JpcHRlbjwvYT4uCisgIDwvcD4KKyAgPHAgaWQ9ImltYWdlX2J1dHRvbnMiPgorICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJ0ZXN0IGltYWdlISIgbmFtZT0iLi90ZXN0X3dlYnBfanMud2VicCIKKyAgICAgICAgICAgb25jbGljaz0ibG9hZGZpbGUodGhpcy5uYW1lLCAnb3V0cHV0X2NhbnZhcycpIj4KKyAgPC9wPgorICA8cCBpZD0idGltaW5nIj5UaW1pbmc6IE4vQTwvcD4KKyAgPGNhbnZhcyBpZD0ib3V0cHV0X2NhbnZhcyI+WW91ciBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgY2FudmFzPC9jYW52YXM+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3dlYnBfanMvaW5kZXhfd2FzbS5odG1sIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvd2VicF9qcy9pbmRleF93YXNtLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc3YzIyYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3dlYnBfanMvaW5kZXhfd2FzbS5odG1sCkBAIC0wLDAgKzEsOTAgQEAKKzwhRE9DVFlQRSBodG1sPgorPGh0bWwgbGFuZz0iZW4iPgorCis8aGVhZD4KKyAgPG1ldGEgY2hhcnNldD0iVVRGLTgiPgorICA8dGl0bGU+c2ltcGxlIEphdmFzY3JpcHQgV2ViUCBkZWNvZGluZyBkZW1vLCB1c2luZyBXZWItQXNzZW1ibHkgKFdBU00pPC90aXRsZT4KKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICAgIHZhciBNb2R1bGUgPSB7CisgICAgICBub0luaXRpYWxSdW4gOiB0cnVlCisgICAgfTsKKyAgPC9zY3JpcHQ+CisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKworJ3VzZSBzdHJpY3QnOworCisvLyBtYWluIHdyYXBwZXIgZm9yIHRoZSBmdW5jdGlvbiBkZWNvZGluZyBhIFdlYlAgaW50byBhIGNhbnZhcyBvYmplY3QKK3ZhciBXZWJwVG9DYW52YXM7CisKK2Z1bmN0aW9uIGluaXQoKSB7CisgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKKyAgeGhyLm9wZW4oJ0dFVCcsICd3ZWJwX3dhc20ud2FzbScsIHRydWUpOworICB4aHIucmVzcG9uc2VUeXBlID0gJ2FycmF5YnVmZmVyJzsKKyAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uKCkgeworICAgIE1vZHVsZS53YXNtQmluYXJ5ID0geGhyLnJlc3BvbnNlOworICAgIHZhciBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKKyAgICBzY3JpcHQuc3JjID0gIndlYnBfd2FzbS5qcyI7CisgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzY3JpcHQpOworICB9OworICB4aHIuc2VuZChudWxsKTsKK30KK3dpbmRvdy5vbmxvYWQgPSBpbml0OworCitmdW5jdGlvbiBkZWNvZGUod2VicF9kYXRhLCBjYW52YXNfaWQpIHsKKyAgdmFyIHJlc3VsdDsKKyAgaWYgKE1vZHVsZVsiYXNtIl0gIT0gdW5kZWZpbmVkKSB7CisgICAgLy8gd3JhcHBlciBmb3IgdGhlIGZ1bmN0aW9uIGRlY29kaW5nIGEgV2ViUCBpbnRvIGEgY2FudmFzIG9iamVjdAorICAgIFdlYnBUb0NhbnZhcyA9IE1vZHVsZS5jd3JhcCgnV2VicFRvU0RMJywgJ251bWJlcicsIFsnYXJyYXknLCAnbnVtYmVyJ10pOworICAgIC8vIGdldCB0aGUgY2FudmFzIHRvIGRlY29kZSBpbnRvCisgICAgdmFyIGNhbnZhcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNhbnZhc19pZCk7CisgICAgaWYgKGNhbnZhcyA9PSBudWxsKSByZXR1cm47CisgICAgLy8gY2xlYXIgcHJldmlvdXMgcGljdHVyZSAoaWYgYW55KQorICAgIE1vZHVsZS5jYW52YXMgPSBjYW52YXM7CisgICAgY2FudmFzLmdldENvbnRleHQoJzJkJykuY2xlYXJSZWN0KDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7CisgICAgLy8gZGVjb2RlIGFuZCBtZWFzdXJlIHRpbWluZworICAgIHZhciBzdGFydCA9IG5ldyBEYXRlKCk7CisgICAgdmFyIHJldCA9IFdlYnBUb0NhbnZhcyh3ZWJwX2RhdGEsIHdlYnBfZGF0YS5sZW5ndGgpOworICAgIHZhciBlbmQgPSBuZXcgRGF0ZSgpOworICAgIHZhciBkZWNvZGVfdGltZSA9IGVuZCAtIHN0YXJ0OworICAgIHJlc3VsdCA9ICdkZWNvZGluZyB0aW1lOiAnICsgZGVjb2RlX3RpbWUgKycgbXMuJzsKKyAgfSBlbHNlIHsKKyAgICByZXN1bHQgPSAiV0FTTSBtb2R1bGUgbm90IGZpbmlzaGVkIGxvYWRpbmchIFBsZWFzZSByZXRyeSI7CisgIH0KKyAgLy8gZGlzcGxheSB0aW1pbmcgcmVzdWx0CisgIHZhciBzcGVlZF9yZXN1bHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGltaW5nJyk7CisgIGlmIChzcGVlZF9yZXN1bHQgIT0gbnVsbCkgeworICAgIHNwZWVkX3Jlc3VsdC5pbm5lckhUTUwgPSAnPHA+JysgcmVzdWx0ICsgJzwvcD4nOworICB9Cit9CisKK2Z1bmN0aW9uIGxvYWRmaWxlKGZpbGVuYW1lLCBjYW52YXNfaWQpIHsKKyAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOworICB4aHIub3BlbignR0VUJywgZmlsZW5hbWUpOworICB4aHIucmVzcG9uc2VUeXBlID0gJ2FycmF5YnVmZmVyJzsKKyAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkgeworICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PSA0ICYmIHhoci5zdGF0dXMgPT0gMjAwKSB7CisgICAgICB2YXIgd2VicF9kYXRhID0gbmV3IFVpbnQ4QXJyYXkoeGhyLnJlc3BvbnNlKTsKKyAgICAgIGRlY29kZSh3ZWJwX2RhdGEsIGNhbnZhc19pZCk7CisgICAgfQorICB9OworICB4aHIuc2VuZCgpOworfQorICA8L3NjcmlwdD4KKzwvaGVhZD4KKworPGJvZHk+CisgIDxwPgorICAgIDxzdHJvbmc+V2ViUCBkZW1vIHVzaW5nIFdlYi1Bc3NlbWJseTwvc3Ryb25nPiAtCisgIDwvcD4KKyAgPHA+CisgICAgV0FTTSB2ZXJzaW9uIG9mIHRoZSBXZWJQIGRlY29kZXIsIHVzaW5nIGxpYndlYnAgY29tcGlsZWQgd2l0aAorICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9rcmlwa2VuL2Vtc2NyaXB0ZW4vd2lraSI+RW1zY3JpcHRlbjwvYT4uCisgIDwvcD4KKyAgPHAgaWQ9ImltYWdlX2J1dHRvbnMiPgorICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJ0ZXN0IGltYWdlISIKKyAgICAgICAgICAgb25jbGljaz0ibG9hZGZpbGUoJy4vdGVzdF93ZWJwX3dhc20ud2VicCcsICdvdXRwdXRfY2FudmFzJykiPgorICA8L3A+CisgIDxwIGlkPSJ0aW1pbmciPlRpbWluZzogTi9BPC9wPgorICA8Y2FudmFzIGlkPSJvdXRwdXRfY2FudmFzIj5Zb3VyIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBjYW52YXM8L2NhbnZhcz4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3dlYnBfanMvdGVzdF93ZWJwX2pzLndlYnAgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC93ZWJwX2pzL3Rlc3Rfd2VicF9qcy53ZWJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3OThmNTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC93ZWJwX2pzL3Rlc3Rfd2VicF9qcy53ZWJwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3dlYnBfanMvdGVzdF93ZWJwX3dhc20ud2VicCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3dlYnBfanMvdGVzdF93ZWJwX3dhc20ud2VicApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzk4ZjU1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvd2VicF9qcy90ZXN0X3dlYnBfd2FzbS53ZWJwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ4bWwvbGlieG1sLmd5cCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ4bWwvbGlieG1sLmd5cAppbmRleCA4NmZlNGE0Li41ZjE0ZTJiIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlieG1sL2xpYnhtbC5neXAKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYnhtbC9saWJ4bWwuZ3lwCkBAIC0zMDAsNiArMzAwLDkgQEAKICAgICAgICAgICAgICAgICAjIHRyaW9faXNfc3BlY2lhbF9xdWFudGl0eSBhbmQgdHJpb19pc19uZWdhdGl2ZSBhcmUgb25seQogICAgICAgICAgICAgICAgICMgdXNlZCB3aXRoIGNlcnRhaW4gcHJlcHJvY2Vzc29yIGRlZmluZXMgc2V0LgogICAgICAgICAgICAgICAgICctV25vLXVudXNlZC1mdW5jdGlvbicsCisgICAgICAgICAgICAgICAgIyB4cGF0aC5jIHhtbFhQYXRoTm9kZUNvbGxlY3RBbmRUZXN0IGNvbXBhcmVzICd4bWxFbGVtZW50VHlwZScKKyAgICAgICAgICAgICAgICAjIGFuZCAneG1sWFBhdGhUeXBlVmFsJy4KKyAgICAgICAgICAgICAgICAnLVduby1lbnVtLWNvbXBhcmUnLAogICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgfV0sCiAgICAgICAgICAgXSwKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9tb3pqcy00NS9tZmJ0L21mYnRfQ29tcHJlc3Npb24uY3BwIGIvc3JjL3RoaXJkX3BhcnR5L21vempzLTQ1L21mYnQvbWZidF9Db21wcmVzc2lvbi5jcHAKaW5kZXggYzExNGM2Yy4uMjIzZmIyMyAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L21vempzLTQ1L21mYnQvbWZidF9Db21wcmVzc2lvbi5jcHAKKysrIGIvc3JjL3RoaXJkX3BhcnR5L21vempzLTQ1L21mYnQvbWZidF9Db21wcmVzc2lvbi5jcHAKQEAgLTE0LDYgKzE0LDE1IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBtb3ppbGxhOjpDb21wcmVzc2lvbjsKIAorLy8gQmVjYXVzZSB3ZSB3cmFwIGx6NC5jIGluIGFuIGFub255bW91cyBuYW1lc3BhY2UsIGFsbCBvZiBpdHMgI2luY2x1ZGVzCisvLyBnbyBpbiB0aGUgYW5vbnltb3VzIG5hbWVzcGFjZSB0b28uIFRoaXMgd291bGQgY3JlYXRlIGNvbmZsaWN0aW5nCisvLyBkZWNsYXJhdGlvbnMgZm9yIGludHJpbnNpYyBmdW5jdGlvbnMgdGhhdCBhcmUgaW50ZXJuYWxseSBkZWZpbmVkCisvLyBhdCB0b3AtbGV2ZWwuIEluY2x1ZGluZyBpbnRyaW4uaCBub3cgcHJldmVudHMgaXQgZnJvbSBiZWluZyBpbmNsdWRlZAorLy8gbGF0ZXIgd2l0aGluIHRoZSBhbm9ueW1vdXMgbmFtZXNwYWNlLgorI2lmZGVmIF9NU0NfVkVSCisjaW5jbHVkZSA8aW50cmluLmg+CisjZW5kaWYKKwogbmFtZXNwYWNlIHsKIAogI2luY2x1ZGUgImx6NC5jIgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXAuaAppbmRleCA2ZjFhNzFlLi5kODcxYjU4IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXAuaAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXAuaApAQCAtMTMxMSw3ICsxMzExLDcgQEAKICAgICAgIEdPT0dMRV9EQ0hFQ0sobiA+PSBrTWluVGFibGVTaXplKTsKICAgICAgIEdPT0dMRV9EQ0hFQ0tfRVEobiAmIChuIC0gMSksIDApOwogICAgICAgdm9pZCoqIHJlc3VsdCA9IEFsbG9jPHZvaWQqPihuKTsKLSAgICAgIG1lbXNldChyZXN1bHQsIDAsIG4gKiBzaXplb2YocmVzdWx0WzBdKSk7CisgICAgICA6Om1lbXNldChyZXN1bHQsIDAsIG4gKiBzaXplb2YocmVzdWx0WzBdKSk7CiAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuY2MKaW5kZXggNjg4ZmFiZC4uN2NkMWExOSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5jYworKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmNjCkBAIC0yOSwxMiArMjksMzkgQEAKIC8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAKIC8vIGZyb20gZ29vZ2xlMy9zdHJpbmdzL3N0cnV0aWwuY2MKLSNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdGRsaWJfcG9lbS5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0ZGlvX3BvZW0uaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdfcG9lbS5oIgogCiAjaWZuZGVmIFNUQVJCT0FSRAorCiAjaW5jbHVkZSA8c3RkaW8uaD4KKworLy8gV2UgbmVlZCB0byBiZSBhYmxlIHRvIGJ1aWxkIHRoaXMgbGlicmFyeSB1c2luZyB0aGUgaG9zdCB0b29sY2hhaW4gZm9yIHNvbWUKKy8vIHBsYXRmb3JtcywgYW5kIFN0YXJib2FyZCBpcyBub3QgYXZhaWxhYmxlIHRoZXJlLiAgU28gd2UgZGVmaW5lIHRoZXNlCisvLyAicmV2ZXJzZSBwb2VtcyIgdG8gbW92ZSBwYXN0IHRoaXMgaXNzdWUgZm9yIGhvc3QgYnVpbGRzLiAgRm9yIHdoeSB3ZSBkb24ndAorLy8ganVzdCB1c2UgcG9lbXMsIHNlZSB0aGUgY29tbWVudCBpbiB0aGUgI2Vsc2UgY2xhdXNlLgorI2RlZmluZSBTYk1lbW9yeUNvcHkgbWVtY3B5CisjZGVmaW5lIFNiTWVtb3J5TW92ZSBtZW1tb3ZlCisjZGVmaW5lIFNiU3RyaW5nR2V0TGVuZ3RoIHN0cmxlbgorI2RlZmluZSBTYlN0cmluZ0NvcHlVbnNhZmUgc3RyY3B5CisjZGVmaW5lIFBvZW1GaW5kQ2hhcmFjdGVySW5TdHJpbmcgc3RyY2hyCisjZGVmaW5lIFNiU3RyaW5nRm9ybWF0RiBzbnByaW50ZgorI2RlZmluZSBTYlN0cmluZ0Zvcm1hdFVuc2FmZUYgc3ByaW50ZgorI2RlZmluZSBTYlN0cmluZ1BhcnNlVW5zaWduZWRJbnRlZ2VyIHN0cnRvdWwKKyNkZWZpbmUgU2JTdHJpbmdQYXJzZVNpZ25lZEludGVnZXIgc3RydG9sCisjZGVmaW5lIFNiU3RyaW5nUGFyc2VEb3VibGUgc3RydG9kCisKKyNlbHNlICAvLyBTVEFSQk9BUkQKKworLy8gV2UgYXZvaWQgdXNpbmcgcG9lbXMgaGVyZSBiZWNhdXNlIGEgc3Vic2VxdWVudCAjaW5jbHVkZSBvZiBtYXRoLmggbWF5CisvLyByZXN1bHQsIG9uIHNvbWUgcGxhdGZvcm1zLCBvZiB0aGUgaW5kaXJlY3QgaW5jbHVzaW9uIG9mIHN0ZGxpYi5oLCB3aGljaAorLy8gd2lsbCB0aGVuIGNvbmZsaWN0IHdpdGggb3VyIHBvZW0gaW5jbHVkZXMuCisjZGVmaW5lIFBPRU1fTk9fRU1VTEFUSU9OCisvLyBGb3IgYWNjZXNzIHRvIFBvZW1GaW5kQ2hhcmFjdGVySW5TdHJpbmcoKSBhcyBhIHJlcGxhY2VtZW50IGZvciBzdHJjaHIoKS4KKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdfcG9lbS5oIgorI3VuZGVmIFBPRU1fTk9fRU1VTEFUSU9OCisKKyNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3N0cmluZy5oIgorCiAjZW5kaWYgIC8vIFNUQVJCT0FSRAogCiAjaW5jbHVkZSA8ZXJybm8uaD4KQEAgLTI3OCw3ICszMDUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIHJlc3VsdCkgewogICBHT09HTEVfQ0hFQ0socmVzdWx0ICE9IE5VTEwpOwogICByZXN1bHQtPmNsZWFyKCk7Ci0gIGludCBkZWxpbV9sZW5ndGggPSBzdHJsZW4oZGVsaW0pOworICBpbnQgZGVsaW1fbGVuZ3RoID0gU2JTdHJpbmdHZXRMZW5ndGgoZGVsaW0pOwogCiAgIC8vIFByZWNvbXB1dGUgcmVzdWx0aW5nIGxlbmd0aCBzbyB3ZSBjYW4gcmVzZXJ2ZSgpIG1lbW9yeSBpbiBvbmUgc2hvdC4KICAgaW50IGxlbmd0aCA9IDA7CkBAIC01MTcsNyArNTQ0LDcgQEAKICAgICAgICAgICAgICAobGFzdF9oZXhfZXNjYXBlICYmIGlzeGRpZ2l0KCpzcmMpKSkpIHsKICAgICAgICAgICBpZiAoZGVzdF9sZW4gLSB1c2VkIDwgNCkgLy8gbmVlZCBzcGFjZSBmb3IgNCBsZXR0ZXIgZXNjYXBlCiAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgc3ByaW50ZihkZXN0ICsgdXNlZCwgKHVzZV9oZXggPyAiXFx4JTAyeCIgOiAiXFwlMDNvIiksCisgICAgICAgICAgU2JTdHJpbmdGb3JtYXRVbnNhZmVGKGRlc3QgKyB1c2VkLCAodXNlX2hleCA/ICJcXHglMDJ4IiA6ICJcXCUwM28iKSwKICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4Pigqc3JjKSk7CiAgICAgICAgICAgaXNfaGV4X2VzY2FwZSA9IHVzZV9oZXg7CiAgICAgICAgICAgdXNlZCArPSA0OwpAQCAtNjQ1LDcgKzY3Miw3IEBACiBpbnQzMiBzdHJ0bzMyX2FkYXB0b3IoY29uc3QgY2hhciAqbnB0ciwgY2hhciAqKmVuZHB0ciwgaW50IGJhc2UpIHsKICAgY29uc3QgaW50IHNhdmVkX2Vycm5vID0gZXJybm87CiAgIGVycm5vID0gMDsKLSAgY29uc3QgbG9uZyByZXN1bHQgPSBzdHJ0b2wobnB0ciwgZW5kcHRyLCBiYXNlKTsKKyAgY29uc3QgbG9uZyByZXN1bHQgPSBTYlN0cmluZ1BhcnNlU2lnbmVkSW50ZWdlcihucHRyLCBlbmRwdHIsIGJhc2UpOwogICBpZiAoZXJybm8gPT0gRVJBTkdFICYmIHJlc3VsdCA9PSBMT05HX01JTikgewogICAgIHJldHVybiBraW50MzJtaW47CiAgIH0gZWxzZSBpZiAoZXJybm8gPT0gRVJBTkdFICYmIHJlc3VsdCA9PSBMT05HX01BWCkgewpAQCAtNjY1LDcgKzY5Miw3IEBACiB1aW50MzIgc3RydG91MzJfYWRhcHRvcihjb25zdCBjaGFyICpucHRyLCBjaGFyICoqZW5kcHRyLCBpbnQgYmFzZSkgewogICBjb25zdCBpbnQgc2F2ZWRfZXJybm8gPSBlcnJubzsKICAgZXJybm8gPSAwOwotICBjb25zdCB1bnNpZ25lZCBsb25nIHJlc3VsdCA9IHN0cnRvdWwobnB0ciwgZW5kcHRyLCBiYXNlKTsKKyAgY29uc3QgdW5zaWduZWQgbG9uZyByZXN1bHQgPSBTYlN0cmluZ1BhcnNlVW5zaWduZWRJbnRlZ2VyKG5wdHIsIGVuZHB0ciwgYmFzZSk7CiAgIGlmIChlcnJubyA9PSBFUkFOR0UgJiYgcmVzdWx0ID09IFVMT05HX01BWCkgewogICAgIHJldHVybiBrdWludDMybWF4OwogICB9IGVsc2UgaWYgKGVycm5vID09IDAgJiYgcmVzdWx0ID4ga3VpbnQzMm1heCkgewpAQCAtMTIyNyw3ICsxMjU0LDcgQEAKIHZvaWQgRGVsb2NhbGl6ZVJhZGl4KGNoYXIqIGJ1ZmZlcikgewogICAvLyBGYXN0IGNoZWNrOiAgaWYgdGhlIGJ1ZmZlciBoYXMgYSBub3JtYWwgZGVjaW1hbCBwb2ludCwgYXNzdW1lIG5vCiAgIC8vIHRyYW5zbGF0aW9uIGlzIG5lZWRlZC4KLSAgaWYgKHN0cmNocihidWZmZXIsICcuJykgIT0gTlVMTCkgcmV0dXJuOworICBpZiAoUG9lbUZpbmRDaGFyYWN0ZXJJblN0cmluZyhidWZmZXIsICcuJykgIT0gTlVMTCkgcmV0dXJuOwogCiAgIC8vIEZpbmQgdGhlIGZpcnN0IHVua25vd24gY2hhcmFjdGVyLgogICB3aGlsZSAoSXNWYWxpZEZsb2F0Q2hhcigqYnVmZmVyKSkgKytidWZmZXI7CkBAIC0xMjQ3LDcgKzEyNzQsNyBAQAogICAgIC8vIGV4dHJhIGJ5dGVzLgogICAgIGNoYXIqIHRhcmdldCA9IGJ1ZmZlcjsKICAgICBkbyB7ICsrYnVmZmVyOyB9IHdoaWxlICghSXNWYWxpZEZsb2F0Q2hhcigqYnVmZmVyKSAmJiAqYnVmZmVyICE9ICdcMCcpOwotICAgIG1lbW1vdmUodGFyZ2V0LCBidWZmZXIsIHN0cmxlbihidWZmZXIpICsgMSk7CisgICAgU2JNZW1vcnlNb3ZlKHRhcmdldCwgYnVmZmVyLCBTYlN0cmluZ0dldExlbmd0aChidWZmZXIpICsgMSk7CiAgIH0KIH0KIApAQCAtMTI1OSwyMCArMTI4NiwyMCBAQAogICBHT09HTEVfQ09NUElMRV9BU1NFUlQoREJMX0RJRyA8IDIwLCBEQkxfRElHX2lzX3Rvb19iaWcpOwogCiAgIGlmICh2YWx1ZSA9PSBudW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpKSB7Ci0gICAgc3RyY3B5KGJ1ZmZlciwgImluZiIpOworICAgIFNiU3RyaW5nQ29weVVuc2FmZShidWZmZXIsICJpbmYiKTsKICAgICByZXR1cm4gYnVmZmVyOwogICB9IGVsc2UgaWYgKHZhbHVlID09IC1udW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpKSB7Ci0gICAgc3RyY3B5KGJ1ZmZlciwgIi1pbmYiKTsKKyAgICBTYlN0cmluZ0NvcHlVbnNhZmUoYnVmZmVyLCAiLWluZiIpOwogICAgIHJldHVybiBidWZmZXI7CiAgIH0gZWxzZSBpZiAoTWF0aExpbWl0czxkb3VibGU+OjpJc05hTih2YWx1ZSkpIHsKLSAgICBzdHJjcHkoYnVmZmVyLCAibmFuIik7CisgICAgU2JTdHJpbmdDb3B5VW5zYWZlKGJ1ZmZlciwgIm5hbiIpOwogICAgIHJldHVybiBidWZmZXI7CiAgIH0KIAogICBpbnQgc25wcmludGZfcmVzdWx0ID0KLSAgICBzbnByaW50ZihidWZmZXIsIGtEb3VibGVUb0J1ZmZlclNpemUsICIlLipnIiwgREJMX0RJRywgdmFsdWUpOworICAgIFNiU3RyaW5nRm9ybWF0RihidWZmZXIsIGtEb3VibGVUb0J1ZmZlclNpemUsICIlLipnIiwgREJMX0RJRywgdmFsdWUpOwogCi0gIC8vIFRoZSBzbnByaW50ZiBzaG91bGQgbmV2ZXIgb3ZlcmZsb3cgYmVjYXVzZSB0aGUgYnVmZmVyIGlzIHNpZ25pZmljYW50bHkKKyAgLy8gVGhlIFNiU3RyaW5nRm9ybWF0RiBzaG91bGQgbmV2ZXIgb3ZlcmZsb3cgYmVjYXVzZSB0aGUgYnVmZmVyIGlzIHNpZ25pZmljYW50bHkKICAgLy8gbGFyZ2VyIHRoYW4gdGhlIHByZWNpc2lvbiB3ZSBhc2tlZCBmb3IuCiAgIEdPT0dMRV9EQ0hFQ0soc25wcmludGZfcmVzdWx0ID4gMCAmJiBzbnByaW50Zl9yZXN1bHQgPCBrRG91YmxlVG9CdWZmZXJTaXplKTsKIApAQCAtMTI4MiwxMCArMTMwOSwxMCBAQAogICAvLyBvZiBhIGRvdWJsZS4gIFRoaXMgbG9uZyBkb3VibGUgbWF5IGhhdmUgZXh0cmEgYml0cyB0aGF0IG1ha2UgaXQgY29tcGFyZQogICAvLyB1bmVxdWFsIHRvICJ2YWx1ZSIgZXZlbiB0aG91Z2ggaXQgd291bGQgYmUgZXhhY3RseSBlcXVhbCBpZiBpdCB3ZXJlCiAgIC8vIHRydW5jYXRlZCB0byBhIGRvdWJsZS4KLSAgdm9sYXRpbGUgZG91YmxlIHBhcnNlZF92YWx1ZSA9IHN0cnRvZChidWZmZXIsIE5VTEwpOworICB2b2xhdGlsZSBkb3VibGUgcGFyc2VkX3ZhbHVlID0gU2JTdHJpbmdQYXJzZURvdWJsZShidWZmZXIsIE5VTEwpOwogICBpZiAocGFyc2VkX3ZhbHVlICE9IHZhbHVlKSB7CiAgICAgaW50IHNucHJpbnRmX3Jlc3VsdCA9Ci0gICAgICBzbnByaW50ZihidWZmZXIsIGtEb3VibGVUb0J1ZmZlclNpemUsICIlLipnIiwgREJMX0RJRysyLCB2YWx1ZSk7CisgICAgICBTYlN0cmluZ0Zvcm1hdEYoYnVmZmVyLCBrRG91YmxlVG9CdWZmZXJTaXplLCAiJS4qZyIsIERCTF9ESUcrMiwgdmFsdWUpOwogCiAgICAgLy8gU2hvdWxkIG5ldmVyIG92ZXJmbG93OyBzZWUgYWJvdmUuCiAgICAgR09PR0xFX0RDSEVDSyhzbnByaW50Zl9yZXN1bHQgPiAwICYmIHNucHJpbnRmX3Jlc3VsdCA8IGtEb3VibGVUb0J1ZmZlclNpemUpOwpAQCAtMTMzNCw3ICsxMzYxLDcgQEAKICAgY2hhciogZW5kcHRyOwogICBlcnJubyA9IDA7ICAvLyBlcnJubyBvbmx5IGdldHMgc2V0IG9uIGVycm9ycwogI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkIChfX2hwdXgpIHx8IGRlZmluZWQoU1RBUkJPQVJEKSAgLy8gaGFzIG5vIHN0cnRvZigpCi0gICp2YWx1ZSA9IHN0cnRvZChzdHIsICZlbmRwdHIpOworICAqdmFsdWUgPSBTYlN0cmluZ1BhcnNlRG91YmxlKHN0ciwgJmVuZHB0cik7CiAjZWxzZQogICAqdmFsdWUgPSBzdHJ0b2Yoc3RyLCAmZW5kcHRyKTsKICNlbmRpZgpAQCAtMTM0Myw3ICsxMzcwLDcgQEAKIAogYm9vbCBzYWZlX3N0cnRvZChjb25zdCBjaGFyKiBzdHIsIGRvdWJsZSogdmFsdWUpIHsKICAgY2hhciogZW5kcHRyOwotICAqdmFsdWUgPSBzdHJ0b2Qoc3RyLCAmZW5kcHRyKTsKKyAgKnZhbHVlID0gU2JTdHJpbmdQYXJzZURvdWJsZShzdHIsICZlbmRwdHIpOwogICBpZiAoZW5kcHRyICE9IHN0cikgewogICAgIHdoaWxlIChhc2NpaV9pc3NwYWNlKCplbmRwdHIpKSArK2VuZHB0cjsKICAgfQpAQCAtMTM3NywyNyArMTQwNCwyNyBAQAogICBHT09HTEVfQ09NUElMRV9BU1NFUlQoRkxUX0RJRyA8IDEwLCBGTFRfRElHX2lzX3Rvb19iaWcpOwogCiAgIGlmICh2YWx1ZSA9PSBudW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpKSB7Ci0gICAgc3RyY3B5KGJ1ZmZlciwgImluZiIpOworICAgIFNiU3RyaW5nQ29weVVuc2FmZShidWZmZXIsICJpbmYiKTsKICAgICByZXR1cm4gYnVmZmVyOwogICB9IGVsc2UgaWYgKHZhbHVlID09IC1udW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpKSB7Ci0gICAgc3RyY3B5KGJ1ZmZlciwgIi1pbmYiKTsKKyAgICBTYlN0cmluZ0NvcHlVbnNhZmUoYnVmZmVyLCAiLWluZiIpOwogICAgIHJldHVybiBidWZmZXI7CiAgIH0gZWxzZSBpZiAoTWF0aExpbWl0czxmbG9hdD46OklzTmFOKHZhbHVlKSkgewotICAgIHN0cmNweShidWZmZXIsICJuYW4iKTsKKyAgICBTYlN0cmluZ0NvcHlVbnNhZmUoYnVmZmVyLCAibmFuIik7CiAgICAgcmV0dXJuIGJ1ZmZlcjsKICAgfQogCiAgIGludCBzbnByaW50Zl9yZXN1bHQgPQotICAgIHNucHJpbnRmKGJ1ZmZlciwga0Zsb2F0VG9CdWZmZXJTaXplLCAiJS4qZyIsIEZMVF9ESUcsIHZhbHVlKTsKKyAgICBTYlN0cmluZ0Zvcm1hdEYoYnVmZmVyLCBrRmxvYXRUb0J1ZmZlclNpemUsICIlLipnIiwgRkxUX0RJRywgdmFsdWUpOwogCi0gIC8vIFRoZSBzbnByaW50ZiBzaG91bGQgbmV2ZXIgb3ZlcmZsb3cgYmVjYXVzZSB0aGUgYnVmZmVyIGlzIHNpZ25pZmljYW50bHkKLSAgLy8gbGFyZ2VyIHRoYW4gdGhlIHByZWNpc2lvbiB3ZSBhc2tlZCBmb3IuCisgIC8vIFRoZSBTYlN0cmluZ0Zvcm1hdEYgc2hvdWxkIG5ldmVyIG92ZXJmbG93IGJlY2F1c2UgdGhlIGJ1ZmZlciBpcworICAvLyBzaWduaWZpY2FudGx5IGxhcmdlciB0aGFuIHRoZSBwcmVjaXNpb24gd2UgYXNrZWQgZm9yLgogICBHT09HTEVfRENIRUNLKHNucHJpbnRmX3Jlc3VsdCA+IDAgJiYgc25wcmludGZfcmVzdWx0IDwga0Zsb2F0VG9CdWZmZXJTaXplKTsKIAogICBmbG9hdCBwYXJzZWRfdmFsdWU7CiAgIGlmICghc2FmZV9zdHJ0b2YoYnVmZmVyLCAmcGFyc2VkX3ZhbHVlKSB8fCBwYXJzZWRfdmFsdWUgIT0gdmFsdWUpIHsKICAgICBpbnQgc25wcmludGZfcmVzdWx0ID0KLSAgICAgIHNucHJpbnRmKGJ1ZmZlciwga0Zsb2F0VG9CdWZmZXJTaXplLCAiJS4qZyIsIEZMVF9ESUcrMiwgdmFsdWUpOworICAgICAgU2JTdHJpbmdGb3JtYXRGKGJ1ZmZlciwga0Zsb2F0VG9CdWZmZXJTaXplLCAiJS4qZyIsIEZMVF9ESUcrMiwgdmFsdWUpOwogCiAgICAgLy8gU2hvdWxkIG5ldmVyIG92ZXJmbG93OyBzZWUgYWJvdmUuCiAgICAgR09PR0xFX0RDSEVDSyhzbnByaW50Zl9yZXN1bHQgPiAwICYmIHNucHJpbnRmX3Jlc3VsdCA8IGtGbG9hdFRvQnVmZmVyU2l6ZSk7CkBAIC0xNDM3LDM1ICsxNDY0LDM1IEBACiAvLyAgICBvZiBhIG1peCBvZiByYXcgQyBzdHJpbmdzLCBDKysgc3RyaW5ncywgYW5kIGludGVnZXIgdmFsdWVzLgogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0vLyBBcHBlbmQgaXMgbWVyZWx5IGEgdmVyc2lvbiBvZiBtZW1jcHkgdGhhdCByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBieXRlCisvLyBBcHBlbmQgaXMgbWVyZWx5IGEgdmVyc2lvbiBvZiBTYk1lbW9yeUNvcHkgdGhhdCByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBieXRlCiAvLyBhZnRlciB0aGUgYXJlYSBqdXN0IG92ZXJ3cml0dGVuLiAgSXQgY29tZXMgaW4gbXVsdGlwbGUgZmxhdm9ycyB0byBtaW5pbWl6ZQogLy8gY2FsbCBvdmVyaGVhZC4KIHN0YXRpYyBjaGFyICpBcHBlbmQxKGNoYXIgKm91dCwgY29uc3QgQWxwaGFOdW0gJngpIHsKLSAgbWVtY3B5KG91dCwgeC5kYXRhKCksIHguc2l6ZSgpKTsKKyAgU2JNZW1vcnlDb3B5KG91dCwgeC5kYXRhKCksIHguc2l6ZSgpKTsKICAgcmV0dXJuIG91dCArIHguc2l6ZSgpOwogfQogCiBzdGF0aWMgY2hhciAqQXBwZW5kMihjaGFyICpvdXQsIGNvbnN0IEFscGhhTnVtICZ4MSwgY29uc3QgQWxwaGFOdW0gJngyKSB7Ci0gIG1lbWNweShvdXQsIHgxLmRhdGEoKSwgeDEuc2l6ZSgpKTsKKyAgU2JNZW1vcnlDb3B5KG91dCwgeDEuZGF0YSgpLCB4MS5zaXplKCkpOwogICBvdXQgKz0geDEuc2l6ZSgpOwogCi0gIG1lbWNweShvdXQsIHgyLmRhdGEoKSwgeDIuc2l6ZSgpKTsKKyAgU2JNZW1vcnlDb3B5KG91dCwgeDIuZGF0YSgpLCB4Mi5zaXplKCkpOwogICByZXR1cm4gb3V0ICsgeDIuc2l6ZSgpOwogfQogCiBzdGF0aWMgY2hhciAqQXBwZW5kNChjaGFyICpvdXQsCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbHBoYU51bSAmeDEsIGNvbnN0IEFscGhhTnVtICZ4MiwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFscGhhTnVtICZ4MywgY29uc3QgQWxwaGFOdW0gJng0KSB7Ci0gIG1lbWNweShvdXQsIHgxLmRhdGEoKSwgeDEuc2l6ZSgpKTsKKyAgU2JNZW1vcnlDb3B5KG91dCwgeDEuZGF0YSgpLCB4MS5zaXplKCkpOwogICBvdXQgKz0geDEuc2l6ZSgpOwogCi0gIG1lbWNweShvdXQsIHgyLmRhdGEoKSwgeDIuc2l6ZSgpKTsKKyAgU2JNZW1vcnlDb3B5KG91dCwgeDIuZGF0YSgpLCB4Mi5zaXplKCkpOwogICBvdXQgKz0geDIuc2l6ZSgpOwogCi0gIG1lbWNweShvdXQsIHgzLmRhdGEoKSwgeDMuc2l6ZSgpKTsKKyAgU2JNZW1vcnlDb3B5KG91dCwgeDMuZGF0YSgpLCB4My5zaXplKCkpOwogICBvdXQgKz0geDMuc2l6ZSgpOwogCi0gIG1lbWNweShvdXQsIHg0LmRhdGEoKSwgeDQuc2l6ZSgpKTsKKyAgU2JNZW1vcnlDb3B5KG91dCwgeDQuZGF0YSgpLCB4NC5zaXplKCkpOwogICByZXR1cm4gb3V0ICsgeDQuc2l6ZSgpOwogfQogCkBAIC0yMjcxLDcgKzIyOTgsNyBAQAogICAgIGxlbiA9IDQ7CiAgIH0KICAgdG1wID0gZ2h0b25sKHRtcCk7Ci0gIG1lbWNweShvdXRwdXQsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCZ0bXApICsgc2l6ZW9mKHRtcCkgLSBsZW4sIGxlbik7CisgIFNiTWVtb3J5Q29weShvdXRwdXQsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCZ0bXApICsgc2l6ZW9mKHRtcCkgLSBsZW4sIGxlbik7CiAgIHJldHVybiBsZW47CiB9CiAKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9za2lhL2luY2x1ZGUvY29yZS9Ta0NhbnZhcy5oIGIvc3JjL3RoaXJkX3BhcnR5L3NraWEvaW5jbHVkZS9jb3JlL1NrQ2FudmFzLmgKaW5kZXggOGZiY2E3MS4uYWZkNWU5NiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3NraWEvaW5jbHVkZS9jb3JlL1NrQ2FudmFzLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NraWEvaW5jbHVkZS9jb3JlL1NrQ2FudmFzLmgKQEAgLTE4MCw2ICsxODAsMTUgQEAKICAgICAgKi8KICAgICB2aXJ0dWFsIEdyQ29udGV4dCogZ2V0R3JDb250ZXh0KCk7CiAKKyNpZiBkZWZpbmVkKENPQkFMVCkKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGZyYW1lYnVmZmVyIG9iamVjdCBpZGVudGlmaWVyIGZvciB0aGUgcmVuZGVyIHRhcmdldCwgaWYKKyAgICAgKiBhcHBsaWNhYmxlLgorICAgICAqIE5PVEU6IFRoaXMgd2lsbCBjYXVzZSBhIGZsdXNoLCBzbyB1c2Ugc3BhcmluZ2x5LgorICAgICAqLworICAgIGludHB0cl90IGdldFJlbmRlclRhcmdldEhhbmRsZSgpIGNvbnN0OworI2VuZGlmCisKICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NraWEvc3JjL2NvcmUvU2tDYW52YXMuY3BwIGIvc3JjL3RoaXJkX3BhcnR5L3NraWEvc3JjL2NvcmUvU2tDYW52YXMuY3BwCmluZGV4IGRhYjViZTQuLjkzMDJkNmIgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9za2lhL3NyYy9jb3JlL1NrQ2FudmFzLmNwcAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2tpYS9zcmMvY29yZS9Ta0NhbnZhcy5jcHAKQEAgLTE2NzksNiArMTY3OSwxOSBAQAogICAgIHJldHVybiBkZXZpY2UgPyBkZXZpY2UtPmNvbnRleHQoKSA6IG51bGxwdHI7CiB9CiAKKyNpZiBkZWZpbmVkKENPQkFMVCkKK2ludHB0cl90IFNrQ2FudmFzOjpnZXRSZW5kZXJUYXJnZXRIYW5kbGUoKSBjb25zdCB7CisgICAgaWYgKGZTdXJmYWNlQmFzZSkgeworICAgICAgICBHckJhY2tlbmRPYmplY3QgaGFuZGxlOworICAgICAgICBpZiAoZlN1cmZhY2VCYXNlLT5nZXRSZW5kZXJUYXJnZXRIYW5kbGUoJmhhbmRsZSwKKyAgICAgICAgICAgICAgICBTa1N1cmZhY2U6OmtGbHVzaFJlYWRfQmFja2VuZEhhbmRsZUFjY2VzcykpIHsKKyAgICAgICAgICAgIHJldHVybiBoYW5kbGU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKwogdm9pZCBTa0NhbnZhczo6ZHJhd0RSUmVjdChjb25zdCBTa1JSZWN0JiBvdXRlciwgY29uc3QgU2tSUmVjdCYgaW5uZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNrUGFpbnQmIHBhaW50KSB7CiAgICAgVFJBQ0VfRVZFTlQwKCJkaXNhYmxlZC1ieS1kZWZhdWx0LXNraWEiLCAiU2tDYW52YXM6OmRyYXdEUlJlY3QoKSIpOwpkaWZmIC0tZ2l0IGEvc3JjL3Rvb2xzL2d5cC9weWxpYi9neXAvZ2VuZXJhdG9yL25pbmphLnB5IGIvc3JjL3Rvb2xzL2d5cC9weWxpYi9neXAvZ2VuZXJhdG9yL25pbmphLnB5CmluZGV4IDQxZmQ2ODUuLjlkY2Y5OWEgMTAwNzU1Ci0tLSBhL3NyYy90b29scy9neXAvcHlsaWIvZ3lwL2dlbmVyYXRvci9uaW5qYS5weQorKysgYi9zcmMvdG9vbHMvZ3lwL3B5bGliL2d5cC9nZW5lcmF0b3IvbmluamEucHkKQEAgLTc3LDggKzc3LDkgQEAKIGlzX2xpbnV4ID0gcGxhdGZvcm0uc3lzdGVtKCkgPT0gJ0xpbnV4JwogaXNfd2luZG93cyA9IHBsYXRmb3JtLnN5c3RlbSgpID09ICdXaW5kb3dzJwogCi1taWNyb3NvZnRfZmxhdm9ycyA9IFsnd2luJywgJ3dpbi13aW4zMicsICd3aW4td2luMzItbGliJywgJ3hiMScsICd4YjEtZnV0dXJlJywKLSAgICAneGIxLXlvdXR1YmV0diddCittaWNyb3NvZnRfZmxhdm9ycyA9IFsKKyAgICAnd2luJywgJ3dpbi13aW4zMicsICd3aW4td2luMzItbGliJywgJ3hiMScsICd4YjEtZnV0dXJlJywgJ3hiMS15b3V0dWJldHYnCitdCiBzb255X2ZsYXZvcnMgPSBbJ3BzMycsICdwczQnLCAncHM0LXZyJ10KIHdpbmRvd3NfaG9zdF9mbGF2b3JzID0gbWljcm9zb2Z0X2ZsYXZvcnMgKyBzb255X2ZsYXZvcnMKIApAQCAtMTE5LDcgKzEyMCw3IEBACiAgIGZsYWdzID0gY29uZmlnLmdldChrZXl3b3JkLCBbXSkKICAgaWYgdG9vbHNldCA9PSAnaG9zdCc6CiAgICAgZmxhZ3MgPSBjb25maWcuZ2V0KCd7MH1faG9zdCcuZm9ybWF0KGtleXdvcmQpLCBmbGFncykKLSAgcmV0dXJuIGZsYWdzCisgIHJldHVybiBbZmxhZy5yZXBsYWNlKCckJywgJyQkJykgZm9yIGZsYWcgaW4gZmxhZ3NdCiAKIAogZGVmIFN0cmlwUHJlZml4KGFyZywgcHJlZml4KToKQEAgLTIyMiw2ICsyMjMsMTMgQEAKICAgZGVmIFVzZXNUb2Moc2VsZiwgZmxhdm9yKToKICAgICAiIiJSZXR1cm4gdHJ1ZSBpZiB0aGUgdGFyZ2V0IHNob3VsZCBwcm9kdWNlIGEgcmVzdGF0IHJ1bGUgYmFzZWQgb24gYSBUT0MKICAgICBmaWxlLiIiIgorICAgIHRyeToKKyAgICAgICMgRG8gbm90IHVzZSBUT0MgZmlsZXMgZm9yIGFic3RyYWN0IHRvb2xjaGFpbi4KKyAgICAgIHRvb2xjaGFpbiA9IEdldFRhcmdldFRvb2xjaGFpbihmbGF2b3IpCisgICAgICByZXR1cm4gRmFsc2UKKyAgICBleGNlcHQgTm90SW1wbGVtZW50ZWRFcnJvcjoKKyAgICAgICMgRm9sbG93IHRoZSBsb2dpYyBmb3IgdGhlIGxlZ2FjeSB0b29sY2hhaW4uCisgICAgICBwYXNzCiAgICAgIyBGb3IgYnVuZGxlcywgdGhlIC5UT0Mgc2hvdWxkIGJlIHByb2R1Y2VkIGZvciB0aGUgYmluYXJ5LCBub3QgZm9yCiAgICAgIyBGaW5hbE91dHB1dCgpLiBCdXQgdGhlIG5haXZlIGFwcHJvYWNoIHdvdWxkIHB1dCB0aGUgVE9DIGZpbGUgaW50byB0aGUKICAgICAjIGJ1bmRsZSwgc28gZG9uJ3QgZG8gdGhpcyBmb3IgYnVuZGxlcyBmb3Igbm93LgpAQCAtNjczLDggKzY4MSw4IEBACiAgICAgYWxsX291dHB1dHMgPSBbXQogICAgIGZvciBhY3Rpb24gaW4gYWN0aW9uczoKICAgICAgICMgRmlyc3Qgd3JpdGUgb3V0IGEgcnVsZSBmb3IgdGhlIGFjdGlvbi4KLSAgICAgIG5hbWUgPSAnJXNfJXMnICUgKGFjdGlvblsnYWN0aW9uX25hbWUnXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hsaWIubWQ1KHNlbGYucXVhbGlmaWVkX3RhcmdldCkuaGV4ZGlnZXN0KCkpCisgICAgICBuYW1lID0gJyVzXyVzJyAlIChhY3Rpb25bJ2FjdGlvbl9uYW1lJ10sIGhhc2hsaWIubWQ1KAorICAgICAgICAgIHNlbGYucXVhbGlmaWVkX3RhcmdldCkuaGV4ZGlnZXN0KCkpCiAgICAgICBkZXNjcmlwdGlvbiA9IHNlbGYuR2VuZXJhdGVEZXNjcmlwdGlvbignQUNUSU9OJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbi5nZXQoJ21lc3NhZ2UnLCBOb25lKSwgbmFtZSkKICAgICAgIGlzX2N5Z3dpbiA9IHNlbGYuSXNDeWd3aW5SdWxlKGFjdGlvbikKQEAgLTcwMywxNSArNzExLDE0IEBACiAgICAgYWxsX291dHB1dHMgPSBbXQogICAgIGZvciBydWxlIGluIHJ1bGVzOgogICAgICAgIyBGaXJzdCB3cml0ZSBvdXQgYSBydWxlIGZvciB0aGUgcnVsZSBhY3Rpb24uCi0gICAgICBuYW1lID0gJyVzXyVzJyAlIChydWxlWydydWxlX25hbWUnXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hsaWIubWQ1KHNlbGYucXVhbGlmaWVkX3RhcmdldCkuaGV4ZGlnZXN0KCkpCisgICAgICBuYW1lID0gJyVzXyVzJyAlIChydWxlWydydWxlX25hbWUnXSwgaGFzaGxpYi5tZDUoCisgICAgICAgICAgc2VsZi5xdWFsaWZpZWRfdGFyZ2V0KS5oZXhkaWdlc3QoKSkKICAgICAgICMgU2tpcCBhIHJ1bGUgd2l0aCBubyBhY3Rpb24gYW5kIG5vIGlucHV0cy4KICAgICAgIGlmICdhY3Rpb24nIG5vdCBpbiBydWxlIGFuZCBub3QgcnVsZS5nZXQoJ3J1bGVfc291cmNlcycsIFtdKToKICAgICAgICAgY29udGludWUKICAgICAgIGFyZ3MgPSBydWxlWydhY3Rpb24nXQogICAgICAgZGVzY3JpcHRpb24gPSBzZWxmLkdlbmVyYXRlRGVzY3JpcHRpb24oCi0gICAgICAgICAgJ1JVTEUnLAotICAgICAgICAgIHJ1bGUuZ2V0KCdtZXNzYWdlJywgTm9uZSksCisgICAgICAgICAgJ1JVTEUnLCBydWxlLmdldCgnbWVzc2FnZScsIE5vbmUpLAogICAgICAgICAgICgnJXMgJyArIGdlbmVyYXRvcl9kZWZhdWx0X3ZhcmlhYmxlc1snUlVMRV9JTlBVVF9QQVRIJ10pICUgbmFtZSkKICAgICAgIGlzX2N5Z3dpbiA9IHNlbGYuSXNDeWd3aW5SdWxlKHJ1bGUpCiAgICAgICBydWxlX25hbWUsIGFyZ3MgPSBzZWxmLldyaXRlTmV3TmluamFSdWxlKApAQCAtOTM2LDkgKzk0Myw4IEBACiAgICAgICBvYmpjeHhfY29tcGlsZXIgPSBGaW5kRmlyc3RJbnN0YW5jZU9mKGFic3RyYWN0Lk9iamVjdGl2ZUN4eENvbXBpbGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sY2hhaW4pCiAgICAgICBpZiBvYmpjeHhfY29tcGlsZXI6Ci0gICAgICAgIG9iamN4eF9jb21waWxlcl9mbGFncyA9IG9iamN4eF9jb21waWxlci5HZXRGbGFncyhkZWZpbmVzLCBpbmNsdWRlX2RpcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZmxhZ3MgKyBjZmxhZ3NfY2MgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZsYWdzX21tKQorICAgICAgICBvYmpjeHhfY29tcGlsZXJfZmxhZ3MgPSBvYmpjeHhfY29tcGlsZXIuR2V0RmxhZ3MoCisgICAgICAgICAgICBkZWZpbmVzLCBpbmNsdWRlX2RpcnMsIGNmbGFncyArIGNmbGFnc19jYyArIGNmbGFnc19tbSkKICAgICAgICAgc2VsZi5uaW5qYS52YXJpYWJsZSgKICAgICAgICAgICAgICd7MH1fZmxhZ3MnLmZvcm1hdChHZXROaW5qYVJ1bGVOYW1lKG9iamN4eF9jb21waWxlciwgc2VsZi50b29sc2V0KSksCiAgICAgICAgICAgICBzaGVsbC5Kb2luKG9iamN4eF9jb21waWxlcl9mbGFncykpCkBAIC0xMDM2LDkgKzEwNDIsOSBAQAogCiAgICAgICBkZWZpbmVzID0gY29uZmlnLmdldCgnZGVmaW5lcycsIFtdKSArIGV4dHJhX2RlZmluZXMKICAgICAgIGlmIEdldFRvb2xjaGFpbk9yTm9uZShzZWxmLmZsYXZvcik6Ci0gICAgICAgIHNlbGYuV3JpdGVWYXJpYWJsZUxpc3QoJ2RlZmluZXMnLCBbCi0gICAgICAgICAgICBHZXRUb29sY2hhaW5Pck5vbmUoc2VsZi5mbGF2b3IpLkRlZmluZShkKSBmb3IgZCBpbiBkZWZpbmVzCi0gICAgICAgIF0pCisgICAgICAgIHNlbGYuV3JpdGVWYXJpYWJsZUxpc3QoCisgICAgICAgICAgICAnZGVmaW5lcycsCisgICAgICAgICAgICBbR2V0VG9vbGNoYWluT3JOb25lKHNlbGYuZmxhdm9yKS5EZWZpbmUoZCkgZm9yIGQgaW4gZGVmaW5lc10pCiAgICAgICBlbHNlOgogICAgICAgICBzZWxmLldyaXRlVmFyaWFibGVMaXN0KCdkZWZpbmVzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbRGVmaW5lKGQsIHNlbGYuZmxhdm9yKSBmb3IgZCBpbiBkZWZpbmVzXSkKQEAgLTExODQsNyArMTE5MCw3IEBACiAgICAgICAgIHRvb2xjaGFpbiA9IEdldEhvc3RUb29sY2hhaW4oc2VsZi5mbGF2b3IpCiAKICAgICAgIHNoZWxsID0gR2V0U2hlbGwoc2VsZi5mbGF2b3IpCi0KKyAgICAgIGV4dHJhX2JpbmRpbmdzID0gW10KICAgICAgIHRhcmdldF90eXBlID0gc3BlY1sndHlwZSddCiAgICAgICBpZiB0YXJnZXRfdHlwZSA9PSAnZXhlY3V0YWJsZSc6CiAgICAgICAgIGV4ZWN1dGFibGVfbGlua2VyID0gRmluZEZpcnN0SW5zdGFuY2VPZihhYnN0cmFjdC5FeGVjdXRhYmxlTGlua2VyLApAQCAtMTIwOCw5ICsxMjE0LDM1IEBACiAgICAgICAgIGV4ZWN1dGFibGVfbGlua2VyX2ZsYWdzID0gZXhlY3V0YWJsZV9saW5rZXIuR2V0RmxhZ3MobGRmbGFncykKICAgICAgICAgc2VsZi5uaW5qYS52YXJpYWJsZSgnezB9X2ZsYWdzJy5mb3JtYXQocnVsZV9uYW1lKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGVsbC5Kb2luKGV4ZWN1dGFibGVfbGlua2VyX2ZsYWdzKSkKKyAgICAgIGVsaWYgdGFyZ2V0X3R5cGUgPT0gJ3NoYXJlZF9saWJyYXJ5JzoKKyAgICAgICAgc2hhcmVkX2xpYnJhcnlfbGlua2VyID0gRmluZEZpcnN0SW5zdGFuY2VPZigKKyAgICAgICAgICAgIGFic3RyYWN0LlNoYXJlZExpYnJhcnlMaW5rZXIsIHRvb2xjaGFpbikKKyAgICAgICAgYXNzZXJ0IHNoYXJlZF9saWJyYXJ5X2xpbmtlciwgKAorICAgICAgICAgICAgJ1Rvb2xjaGFpbiBtdXN0IHByb3ZpZGUgc2hhcmVkIGxpYnJhcnkgbGlua2VyICcKKyAgICAgICAgICAgICdmb3IgezB9IHBsYXRmb3JtLicpLmZvcm1hdChzZWxmLnRvb2xzZXQpCisKKyAgICAgICAgcnVsZV9uYW1lID0gR2V0TmluamFSdWxlTmFtZShzaGFyZWRfbGlicmFyeV9saW5rZXIsIHNlbGYudG9vbHNldCkKKworICAgICAgICAjIFRPRE86IFRoaXMgY29kZSBlbXVsYXRlcyBsZWdhY3kgdG9vbGNoYWluIGJlaGF2aW9yLiBXZSBuZWVkIHRvIG1pZ3JhdGUKKyAgICAgICAgIyAgICAgICB0byBzaW5nbGUtcmVzcG9uc2liaWxpdHksIHRvb2xjaGFpbi1pbmRlcGVuZGVudCBHWVAga2V5d29yZHMgYXMKKyAgICAgICAgIyAgICAgICBwZXIgYWJzdHJhY3QgdG9vbGNoYWluIGRlc2lnbiBkb2MuCisgICAgICAgIGxpYnJhcmllc19rZXl3b3JkID0gJ2xpYnJhcmllc3swfScuZm9ybWF0KCdfaG9zdCcgaWYgc2VsZi50b29sc2V0ID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdob3N0JyBlbHNlICcnKQorICAgICAgICBsaWJyYXJpZXMgPSBzcGVjLmdldChsaWJyYXJpZXNfa2V5d29yZCwgW10pICsgY29uZmlnLmdldCgKKyAgICAgICAgICAgIGxpYnJhcmllc19rZXl3b3JkLCBbXSkKKyAgICAgICAgbGRmbGFncyA9IGd5cC5jb21tb24udW5pcXVlcigKKyAgICAgICAgICAgIG1hcChzZWxmLkV4cGFuZFNwZWNpYWwsCisgICAgICAgICAgICAgICAgR2V0Q29uZmlnRmxhZ3MoY29uZmlnLCBzZWxmLnRvb2xzZXQsICdsZGZsYWdzJykgKyBsaWJyYXJpZXMpKQorCisgICAgICAgIHNoYXJlZF9saWJyYXJ5X2xpbmtlcl9mbGFncyA9IHNoYXJlZF9saWJyYXJ5X2xpbmtlci5HZXRGbGFncyhsZGZsYWdzKQorICAgICAgICBzZWxmLm5pbmphLnZhcmlhYmxlKCd7MH1fZmxhZ3MnLmZvcm1hdChydWxlX25hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoZWxsLkpvaW4oc2hhcmVkX2xpYnJhcnlfbGlua2VyX2ZsYWdzKSkKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5Db21wdXRlT3V0cHV0KHNwZWMpCisgICAgICAgIGV4dHJhX2JpbmRpbmdzLmFwcGVuZCgoJ3NvbmFtZScsIG9zLnBhdGguc3BsaXQob3V0cHV0KVsxXSkpCisKICAgICAgIGVsc2U6CiAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbignVGFyZ2V0IHR5cGUgezB9IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRhcmdldCB7MX0uJwotICAgICAgICAgICAgLmZvcm1hdCh0YXJnZXRfdHlwZSwgc3BlY1sndGFyZ2V0X25hbWUnXSkpCisgICAgICAgICAgICAgICAgICAgICAgICAuZm9ybWF0KHRhcmdldF90eXBlLCBzcGVjWyd0YXJnZXRfbmFtZSddKSkKIAogICAgICAgb3JkZXJfb25seV9kZXBzID0gc2V0KCkKIApAQCAtMTI0Niw3ICsxMjc4LDExIEBACiAgICAgICBzZWxmLnRhcmdldC5iaW5hcnkgPSBvdXRwdXQKIAogICAgICAgc2VsZi5uaW5qYS5idWlsZCgKLSAgICAgICAgICBvdXRwdXQsIHJ1bGVfbmFtZSwgbGlua19kZXBzLCBvcmRlcl9vbmx5PWxpc3Qob3JkZXJfb25seV9kZXBzKSkKKyAgICAgICAgICBvdXRwdXQsCisgICAgICAgICAgcnVsZV9uYW1lLAorICAgICAgICAgIGxpbmtfZGVwcywKKyAgICAgICAgICBvcmRlcl9vbmx5PWxpc3Qob3JkZXJfb25seV9kZXBzKSwKKyAgICAgICAgICB2YXJpYWJsZXM9ZXh0cmFfYmluZGluZ3MpCiAKICAgICBleGNlcHQgTm90SW1wbGVtZW50ZWRFcnJvcjoKICAgICAgICMgRmFsbCBiYWNrIHRvIHRoZSBsZWdhY3kgdG9vbGNoYWluLgpAQCAtMTMwNiw4ICsxMzQyLDggQEAKICAgICAgICAgb3V0cHV0ID0gc2VsZi5Db21wdXRlTWFjQnVuZGxlQmluYXJ5T3V0cHV0KCkKICAgICAgIGVsc2U6CiAgICAgICAgIG91dHB1dCA9IHNlbGYuQ29tcHV0ZU91dHB1dChzcGVjKQotICAgICAgICBleHRyYV9iaW5kaW5ncy5hcHBlbmQoKCdwb3N0YnVpbGRzJywgc2VsZi5HZXRQb3N0YnVpbGRDb21tYW5kKAotICAgICAgICAgICAgc3BlYywgb3V0cHV0LCBvdXRwdXQpKSkKKyAgICAgICAgZXh0cmFfYmluZGluZ3MuYXBwZW5kKCgncG9zdGJ1aWxkcycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5HZXRQb3N0YnVpbGRDb21tYW5kKHNwZWMsIG91dHB1dCwgb3V0cHV0KSkpCiAKICAgICAgIGlmIHNlbGYuZmxhdm9yID09ICdtYWMnOgogICAgICAgICBsZGZsYWdzID0gc2VsZi54Y29kZV9zZXR0aW5ncy5HZXRMZGZsYWdzKApAQCAtMTUyMSw4ICsxNTU3LDggQEAKICAgICBhYnNfYnVpbGRfZGlyID0gc2VsZi5hYnNfYnVpbGRfZGlyCiAgICAgcmV0dXJuIGd5cC54Y29kZV9lbXVsYXRpb24uR2V0U29ydGVkWGNvZGVFbnYoCiAgICAgICAgIHNlbGYueGNvZGVfc2V0dGluZ3MsIGFic19idWlsZF9kaXIsCi0gICAgICAgIG9zLnBhdGguam9pbihhYnNfYnVpbGRfZGlyLAotICAgICAgICAgICAgICAgICAgICAgc2VsZi5idWlsZF90b19iYXNlKSwgc2VsZi5jb25maWdfbmFtZSwgYWRkaXRpb25hbF9zZXR0aW5ncykKKyAgICAgICAgb3MucGF0aC5qb2luKGFic19idWlsZF9kaXIsIHNlbGYuYnVpbGRfdG9fYmFzZSksIHNlbGYuY29uZmlnX25hbWUsCisgICAgICAgIGFkZGl0aW9uYWxfc2V0dGluZ3MpCiAKICAgZGVmIEdldFNvcnRlZFhjb2RlUG9zdGJ1aWxkRW52KHNlbGYpOgogICAgICIiIlJldHVybnMgdGhlIHZhcmlhYmxlcyBYY29kZSB3b3VsZCBzZXQgZm9yIHBvc3RidWlsZCBzdGVwcy4iIiIKQEAgLTE1NTksOSArMTU5NSw4IEBACiAgICAgICByZXR1cm4gJycKICAgICAjIFBvc3RidWlsZHMgZXhwZWN0IHRvIGJlIHJ1biBpbiB0aGUgZ3lwIGZpbGUncyBkaXJlY3RvcnksIHNvIGluc2VydCBhbgogICAgICMgaW1wbGljaXQgcG9zdGJ1aWxkIHRvIGNkIHRvIHRoZXJlLgotICAgIHBvc3RidWlsZHMuaW5zZXJ0KDAsCi0gICAgICAgICAgICAgICAgICAgICAgZ3lwLmNvbW1vbi5FbmNvZGVQT1NJWFNoZWxsTGlzdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgWydjZCcsIHNlbGYuYnVpbGRfdG9fYmFzZV0pKQorICAgIHBvc3RidWlsZHMuaW5zZXJ0KAorICAgICAgICAwLCBneXAuY29tbW9uLkVuY29kZVBPU0lYU2hlbGxMaXN0KFsnY2QnLCBzZWxmLmJ1aWxkX3RvX2Jhc2VdKSkKICAgICBlbnYgPSBzZWxmLkNvbXB1dGVFeHBvcnRFbnZTdHJpbmcoc2VsZi5HZXRTb3J0ZWRYY29kZVBvc3RidWlsZEVudigpKQogICAgICMgRyB3aWxsIGJlIG5vbi1udWxsIGlmIGFueSBwb3N0YnVpbGQgZmFpbHMuIFJ1biBhbGwgcG9zdGJ1aWxkcyBpbiBhCiAgICAgIyBzdWJzaGVsbC4KQEAgLTE4NzAsOCArMTkwNSw4IEBACiAgICIiIkNhbGxlZCBieSBfX2luaXRfXyB0byBpbml0aWFsaXplIGdlbmVyYXRvciB2YWx1ZXMgYmFzZWQgb24gcGFyYW1zLiIiIgogICB1c2VyX2NvbmZpZyA9IHBhcmFtcy5nZXQoJ2dlbmVyYXRvcl9mbGFncycsIHt9KS5nZXQoJ2NvbmZpZycsIE5vbmUpCiAgIHRvcGxldmVsID0gcGFyYW1zWydvcHRpb25zJ10udG9wbGV2ZWxfZGlyCi0gIHF1YWxpZmllZF9vdXRfZGlyID0gb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLmpvaW4oCi0gICAgICB0b3BsZXZlbCwgQ29tcHV0ZU91dHB1dERpcihwYXJhbXMpLCB1c2VyX2NvbmZpZywgJ2d5cGZpbGVzJykpCisgIHF1YWxpZmllZF9vdXRfZGlyID0gb3MucGF0aC5ub3JtcGF0aCgKKyAgICAgIG9zLnBhdGguam9pbih0b3BsZXZlbCwgQ29tcHV0ZU91dHB1dERpcihwYXJhbXMpLCB1c2VyX2NvbmZpZywgJ2d5cGZpbGVzJykpCiAKICAgZ2xvYmFsIGdlbmVyYXRvcl9maWxlbGlzdF9wYXRocwogICBnZW5lcmF0b3JfZmlsZWxpc3RfcGF0aHMgPSB7CkBAIC0xOTUyLDkgKzE5ODcsOCBAQAogCiBkZWYgTWF5YmVXcml0ZUV4dHJhRmxhZ3NWYXJpYWJsZShuaW5qYSwgdG9vbCwgdG9vbHNldCwgc2hlbGwpOgogICBpZiB0b29sLkdldEV4dHJhRmxhZ3MoKToKLSAgICBuaW5qYS52YXJpYWJsZSgKLSAgICAgICAgJ3swfV9leHRyYV9mbGFncycuZm9ybWF0KEdldE5pbmphUnVsZU5hbWUodG9vbCwgdG9vbHNldCkpLAotICAgICAgICBzaGVsbC5Kb2luKHRvb2wuR2V0RXh0cmFGbGFncygpKSkKKyAgICBuaW5qYS52YXJpYWJsZSgnezB9X2V4dHJhX2ZsYWdzJy5mb3JtYXQoR2V0TmluamFSdWxlTmFtZSh0b29sLCB0b29sc2V0KSksCisgICAgICAgICAgICAgICAgICAgc2hlbGwuSm9pbih0b29sLkdldEV4dHJhRmxhZ3MoKSkpCiAKIAogZGVmIE1heWJlV3JpdGVQb29sKG5pbmphLCB0b29sLCB0b29sc2V0KToKQEAgLTI0MDIsOSArMjQzNiw5IEBACiAgICAgICBlbHNlOgogICAgICAgICBhc3NlcnQgZmxhdm9yIGluIG1pY3Jvc29mdF9mbGF2b3JzCiAgICAgICAgICMgWEIxIGRvZXNuJ3QgbmVlZCBhIG1hbmlmZXN0LgotICAgICAgICBsaW5rX2NvbW1hbmQgPSAoJyVzIGd5cC13aW4tdG9vbCBsaW5rLXdyYXBwZXIgJGFyY2ggJwotICAgICAgICAgICAgICAgICAgICAgICAgJyRsZCAvbm9sb2dvIC9PVVQ6JG91dCAvUERCOiRvdXQucGRiIEAkb3V0LnJzcCcgJQotICAgICAgICAgICAgICAgICAgICAgICAgKHB5dGhvbl9leGVjKSkKKyAgICAgICAgbGlua19jb21tYW5kID0gKAorICAgICAgICAgICAgJyVzIGd5cC13aW4tdG9vbCBsaW5rLXdyYXBwZXIgJGFyY2ggJworICAgICAgICAgICAgJyRsZCAvbm9sb2dvIC9PVVQ6JG91dCAvUERCOiRvdXQucGRiIEAkb3V0LnJzcCcgJSAocHl0aG9uX2V4ZWMpKQogCiAgICAgICBtYXN0ZXJfbmluamEucnVsZSgKICAgICAgICAgICAnbGluaycsCkBAIC0yNTYwLDkgKzI1OTQsOSBAQAogICAgICAgICAgIHJzcGZpbGU9JyRvdXQucnNwJywKICAgICAgICAgICByc3BmaWxlX2NvbnRlbnQ9JyRpbl9uZXdsaW5lICRsaWJmbGFnc19ob3N0JykKIAotICAgICAgbGlua19jb21tYW5kID0gKCclcyBneXAtd2luLXRvb2wgbGluay13cmFwcGVyICRhcmNoICcKLSAgICAgICAgICAgICAgICAgICAgICAnJGxkIC9ub2xvZ28gL09VVDokb3V0IC9QREI6JG91dC5wZGIgQCRvdXQucnNwJyAlCi0gICAgICAgICAgICAgICAgICAgICAgKHB5dGhvbl9leGVjKSkKKyAgICAgIGxpbmtfY29tbWFuZCA9ICgKKyAgICAgICAgICAnJXMgZ3lwLXdpbi10b29sIGxpbmstd3JhcHBlciAkYXJjaCAnCisgICAgICAgICAgJyRsZCAvbm9sb2dvIC9PVVQ6JG91dCAvUERCOiRvdXQucGRiIEAkb3V0LnJzcCcgJSAocHl0aG9uX2V4ZWMpKQogCiAgICAgICBtYXN0ZXJfbmluamEucnVsZSgKICAgICAgICAgICAnbGlua19ob3N0JywKQEAgLTI2OTMsOSArMjcyNyw5IEBACiAgICAgbWFzdGVyX25pbmphLm5ld2xpbmUoKQogICAgIG1hc3Rlcl9uaW5qYS5jb21tZW50KCdTaG9ydCBuYW1lcyBmb3IgdGFyZ2V0cy4nKQogICAgIGZvciBzaG9ydF9uYW1lIGluIHRhcmdldF9zaG9ydF9uYW1lczoKLSAgICAgIG1hc3Rlcl9uaW5qYS5idWlsZChzaG9ydF9uYW1lLCAncGhvbnknLCBbCi0gICAgICAgICAgeC5GaW5hbE91dHB1dCgpIGZvciB4IGluIHRhcmdldF9zaG9ydF9uYW1lc1tzaG9ydF9uYW1lXQotICAgICAgXSkKKyAgICAgIG1hc3Rlcl9uaW5qYS5idWlsZCgKKyAgICAgICAgICBzaG9ydF9uYW1lLCAncGhvbnknLAorICAgICAgICAgIFt4LkZpbmFsT3V0cHV0KCkgZm9yIHggaW4gdGFyZ2V0X3Nob3J0X25hbWVzW3Nob3J0X25hbWVdXSkKIAogICBpZiBhbGxfb3V0cHV0czoKICAgICBtYXN0ZXJfbmluamEubmV3bGluZSgpCmRpZmYgLS1naXQgYS9zcmMvdjgvc3JjL2Jhc2UvYXRvbWljb3BzLmggYi9zcmMvdjgvc3JjL2Jhc2UvYXRvbWljb3BzLmgKaW5kZXggYzRjMjhmNy4uYzE2MGIzMyAxMDA2NDQKLS0tIGEvc3JjL3Y4L3NyYy9iYXNlL2F0b21pY29wcy5oCisrKyBiL3NyYy92OC9zcmMvYmFzZS9hdG9taWNvcHMuaApAQCAtMzYsOSArMzYsMjQgQEAKICNpbmNsdWRlICJzcmMvYmFzZS9iYXNlLWV4cG9ydC5oIgogI2luY2x1ZGUgInNyYy9iYXNlL2J1aWxkX2NvbmZpZy5oIgogCisjaWYgZGVmaW5lZChWOF9PU19TVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2F0b21pYy5oIgorI2VuZGlmCisKKyNpZiBTQl9BUElfVkVSU0lPTiA8IFNCX0lOVFJPRFVDRV9BVE9NSUM4X1ZFUlNJT04KKyNlcnJvciBZb3VyIHZlcnNpb24gb2YgU3RhcmJvYXJkIG11c3Qgc3VwcG9ydCBTYkF0b21pYzggaW4gb3JkZXIgdG8gdXNlIFY4LgorI2VuZGlmCisKIG5hbWVzcGFjZSB2OCB7CiBuYW1lc3BhY2UgYmFzZSB7CiAKKyNpZmRlZiBWOF9PU19TVEFSQk9BUkQKK3R5cGVkZWYgU2JBdG9taWM4IEF0b21pYzg7Cit0eXBlZGVmIFNiQXRvbWljMzIgQXRvbWljMzI7CisjaWZkZWYgVjhfSE9TVF9BUkNIXzY0X0JJVAordHlwZWRlZiBTYkF0b21pYzY0IEF0b21pYzY0OworI2VuZGlmCisjZWxzZQogdHlwZWRlZiBjaGFyIEF0b21pYzg7CiB0eXBlZGVmIGludDMyX3QgQXRvbWljMzI7CiAjaWYgZGVmaW5lZChWOF9IT1NUX0FSQ0hfNjRfQklUKQpAQCAtNTAsMTAgKzY1LDE1IEBACiB0eXBlZGVmIGludHB0cl90IEF0b21pYzY0OwogI2VuZGlmICAvLyBkZWZpbmVkKF9fSUxQMzJfXykKICNlbmRpZiAgLy8gZGVmaW5lZChWOF9IT1NUX0FSQ0hfNjRfQklUKQorI2VuZGlmICAvLyBWOF9PU19TVEFSQk9BUkQKIAogLy8gVXNlIEF0b21pY1dvcmQgZm9yIGEgbWFjaGluZS1zaXplZCBwb2ludGVyLiAgSXQgd2lsbCB1c2UgdGhlIEF0b21pYzMyIG9yCiAvLyBBdG9taWM2NCByb3V0aW5lcyBiZWxvdywgZGVwZW5kaW5nIG9uIHlvdXIgYXJjaGl0ZWN0dXJlLgorI2lmIGRlZmluZWQoVjhfT1NfU1RBUkJPQVJEKQordHlwZWRlZiBTYkF0b21pY1B0ciBBdG9taWNXb3JkOworI2Vsc2UKIHR5cGVkZWYgaW50cHRyX3QgQXRvbWljV29yZDsKKyNlbmRpZgogCiAvLyBBdG9taWNhbGx5IGV4ZWN1dGU6CiAvLyAgICAgIHJlc3VsdCA9ICpwdHI7CmRpZmYgLS1naXQgYS9zcmMvdjgvc3JjL2Jhc2UvYXRvbWljb3BzX2ludGVybmFsc19wb3J0YWJsZS5oIGIvc3JjL3Y4L3NyYy9iYXNlL2F0b21pY29wc19pbnRlcm5hbHNfcG9ydGFibGUuaAppbmRleCAwNzc5YmZiLi4yOGRkZjQwIDEwMDY0NAotLS0gYS9zcmMvdjgvc3JjL2Jhc2UvYXRvbWljb3BzX2ludGVybmFsc19wb3J0YWJsZS5oCisrKyBiL3NyYy92OC9zcmMvYmFzZS9hdG9taWNvcHNfaW50ZXJuYWxzX3BvcnRhYmxlLmgKQEAgLTMxLDYgKzMxLDEwIEBACiAKICNpbmNsdWRlIDxhdG9taWM+CiAKKyNpZiBkZWZpbmVkKFY4X09TX1NUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvYXRvbWljLmgiCisjZW5kaWYKKwogI2luY2x1ZGUgInNyYy9iYXNlL2J1aWxkX2NvbmZpZy5oIgogI2luY2x1ZGUgInNyYy9iYXNlL21hY3Jvcy5oIgogCkBAIC00MSwxMzUgKzQ1LDIzMSBAQAogLy8gYXRvbWljb3BzLmguCiAKIGlubGluZSB2b2lkIFNlcUNzdF9NZW1vcnlGZW5jZSgpIHsKKyNpZiBkZWZpbmVkKFY4X09TX1NUQVJCT0FSRCkKKyAgU2JBdG9taWNNZW1vcnlCYXJyaWVyKCk7CisjZWxzZQogI2lmIGRlZmluZWQoX19HTElCQ1hYX18pCiAgIC8vIFdvcmsgYXJvdW5kIGxpYnN0ZGMrKyBidWcgNTEwMzggd2hlcmUgYXRvbWljX3RocmVhZF9mZW5jZSB3YXMgZGVjbGFyZWQgYnV0CiAgIC8vIG5vdCBkZWZpbmVkLCBsZWFkaW5nIHRvIHRoZSBsaW5rZXIgY29tcGxhaW5pbmcgYWJvdXQgdW5kZWZpbmVkIHJlZmVyZW5jZXMuCiAgIF9fYXRvbWljX3RocmVhZF9mZW5jZShzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKICNlbHNlCiAgIHN0ZDo6YXRvbWljX3RocmVhZF9mZW5jZShzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKLSNlbmRpZgorI2VuZGlmICAvLyAgZGVmaW5lZChfX0dMSUJDWFhfXykKKyNlbmRpZiAgLy8gIGRlZmluZWQoVjhfT1NfU1RBUkJPQVJEKQogfQogCiBpbmxpbmUgQXRvbWljMzIgUmVsYXhlZF9Db21wYXJlQW5kU3dhcCh2b2xhdGlsZSBBdG9taWMzMiogcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgb2xkX3ZhbHVlLCBBdG9taWMzMiBuZXdfdmFsdWUpIHsKKyNpZiBkZWZpbmVkKFY4X09TX1NUQVJCT0FSRCkKKyAgcmV0dXJuIFNiQXRvbWljTm9CYXJyaWVyX0NvbXBhcmVBbmRTd2FwKHB0ciwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUpOworI2Vsc2UKICAgX19hdG9taWNfY29tcGFyZV9leGNoYW5nZV9uKHB0ciwgJm9sZF92YWx1ZSwgbmV3X3ZhbHVlLCBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fQVRPTUlDX1JFTEFYRUQsIF9fQVRPTUlDX1JFTEFYRUQpOwogICByZXR1cm4gb2xkX3ZhbHVlOworI2VuZGlmCiB9CiAKIGlubGluZSBBdG9taWMzMiBSZWxheGVkX0F0b21pY0V4Y2hhbmdlKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBuZXdfdmFsdWUpIHsKKyNpZiBkZWZpbmVkKFY4X09TX1NUQVJCT0FSRCkKKyAgcmV0dXJuIFNiQXRvbWljTm9CYXJyaWVyX0V4Y2hhbmdlKHB0ciwgbmV3X3ZhbHVlKTsKKyNlbHNlCiAgIHJldHVybiBfX2F0b21pY19leGNoYW5nZV9uKHB0ciwgbmV3X3ZhbHVlLCBfX0FUT01JQ19SRUxBWEVEKTsKKyNlbmRpZgogfQogCiBpbmxpbmUgQXRvbWljMzIgUmVsYXhlZF9BdG9taWNJbmNyZW1lbnQodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBpbmNyZW1lbnQpIHsKKyNpZiBkZWZpbmVkKFY4X09TX1NUQVJCT0FSRCkKKyAgcmV0dXJuIFNiQXRvbWljTm9CYXJyaWVyX0luY3JlbWVudChwdHIsIGluY3JlbWVudCk7CisjZWxzZQogICByZXR1cm4gaW5jcmVtZW50ICsgX19hdG9taWNfZmV0Y2hfYWRkKHB0ciwgaW5jcmVtZW50LCBfX0FUT01JQ19SRUxBWEVEKTsKKyNlbmRpZgogfQogCiBpbmxpbmUgQXRvbWljMzIgQmFycmllcl9BdG9taWNJbmNyZW1lbnQodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBpbmNyZW1lbnQpIHsKKyNpZiBkZWZpbmVkKFY4X09TX1NUQVJCT0FSRCkKKyAgcmV0dXJuIFNiQXRvbWljQmFycmllcl9JbmNyZW1lbnQocHRyLCBpbmNyZW1lbnQpOworI2Vsc2UKICAgcmV0dXJuIGluY3JlbWVudCArIF9fYXRvbWljX2ZldGNoX2FkZChwdHIsIGluY3JlbWVudCwgX19BVE9NSUNfU0VRX0NTVCk7CisjZW5kaWYKIH0KIAogaW5saW5lIEF0b21pYzMyIEFjcXVpcmVfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIG9sZF92YWx1ZSwgQXRvbWljMzIgbmV3X3ZhbHVlKSB7CisjaWYgZGVmaW5lZChWOF9PU19TVEFSQk9BUkQpCisgIHJldHVybiBTYkF0b21pY0FjcXVpcmVfQ29tcGFyZUFuZFN3YXAocHRyLCBvbGRfdmFsdWUsIG5ld192YWx1ZSk7CisjZWxzZQogICBfX2F0b21pY19jb21wYXJlX2V4Y2hhbmdlX24ocHRyLCAmb2xkX3ZhbHVlLCBuZXdfdmFsdWUsIGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19BVE9NSUNfQUNRVUlSRSwgX19BVE9NSUNfQUNRVUlSRSk7CiAgIHJldHVybiBvbGRfdmFsdWU7CisjZW5kaWYKIH0KIAogaW5saW5lIEF0b21pYzggUmVsZWFzZV9Db21wYXJlQW5kU3dhcCh2b2xhdGlsZSBBdG9taWM4KiBwdHIsIEF0b21pYzggb2xkX3ZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWM4IG5ld192YWx1ZSkgeworI2lmIGRlZmluZWQoVjhfT1NfU1RBUkJPQVJEKQorICByZXR1cm4gU2JBdG9taWNSZWxlYXNlX0NvbXBhcmVBbmRTd2FwOChwdHIsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlKTsKKyNlbHNlCiAgIGJvb2wgcmVzdWx0ID0gX19hdG9taWNfY29tcGFyZV9leGNoYW5nZV9uKHB0ciwgJm9sZF92YWx1ZSwgbmV3X3ZhbHVlLCBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19BVE9NSUNfUkVMRUFTRSwgX19BVE9NSUNfUkVMQVhFRCk7CiAgIFVTRShyZXN1bHQpOyAgLy8gTWFrZSBnY2MgY29tcGlsZXIgaGFwcHkuCiAgIHJldHVybiBvbGRfdmFsdWU7CisjZW5kaWYKIH0KIAogaW5saW5lIEF0b21pYzMyIFJlbGVhc2VfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIG9sZF92YWx1ZSwgQXRvbWljMzIgbmV3X3ZhbHVlKSB7CisjaWYgZGVmaW5lZChWOF9PU19TVEFSQk9BUkQpCisgIHJldHVybiBTYkF0b21pY1JlbGVhc2VfQ29tcGFyZUFuZFN3YXAocHRyLCBvbGRfdmFsdWUsIG5ld192YWx1ZSk7CisjZWxzZQogICBfX2F0b21pY19jb21wYXJlX2V4Y2hhbmdlX24ocHRyLCAmb2xkX3ZhbHVlLCBuZXdfdmFsdWUsIGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19BVE9NSUNfUkVMRUFTRSwgX19BVE9NSUNfUkVMQVhFRCk7CiAgIHJldHVybiBvbGRfdmFsdWU7CisjZW5kaWYKIH0KIAogaW5saW5lIHZvaWQgUmVsYXhlZF9TdG9yZSh2b2xhdGlsZSBBdG9taWM4KiBwdHIsIEF0b21pYzggdmFsdWUpIHsKKyNpZiBkZWZpbmVkKFY4X09TX1NUQVJCT0FSRCkKKyAgU2JBdG9taWNOb0JhcnJpZXJfU3RvcmU4KHB0ciwgdmFsdWUpOworI2Vsc2UKICAgX19hdG9taWNfc3RvcmVfbihwdHIsIHZhbHVlLCBfX0FUT01JQ19SRUxBWEVEKTsKKyNlbmRpZgogfQogCiBpbmxpbmUgdm9pZCBSZWxheGVkX1N0b3JlKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsIEF0b21pYzMyIHZhbHVlKSB7CisjaWYgZGVmaW5lZChWOF9PU19TVEFSQk9BUkQpCisgIFNiQXRvbWljTm9CYXJyaWVyX1N0b3JlKHB0ciwgdmFsdWUpOworI2Vsc2UKICAgX19hdG9taWNfc3RvcmVfbihwdHIsIHZhbHVlLCBfX0FUT01JQ19SRUxBWEVEKTsKKyNlbmRpZgogfQogCiBpbmxpbmUgdm9pZCBSZWxlYXNlX1N0b3JlKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsIEF0b21pYzMyIHZhbHVlKSB7CisjaWYgZGVmaW5lZChWOF9PU19TVEFSQk9BUkQpCisgIFNiQXRvbWljUmVsZWFzZV9TdG9yZShwdHIsIHZhbHVlKTsKKyNlbHNlCiAgIF9fYXRvbWljX3N0b3JlX24ocHRyLCB2YWx1ZSwgX19BVE9NSUNfUkVMRUFTRSk7CisjZW5kaWYKIH0KIAogaW5saW5lIEF0b21pYzggUmVsYXhlZF9Mb2FkKHZvbGF0aWxlIGNvbnN0IEF0b21pYzgqIHB0cikgeworI2lmIGRlZmluZWQoVjhfT1NfU1RBUkJPQVJEKQorICByZXR1cm4gU2JBdG9taWNOb0JhcnJpZXJfTG9hZDgocHRyKTsKKyNlbHNlCiAgIHJldHVybiBfX2F0b21pY19sb2FkX24ocHRyLCBfX0FUT01JQ19SRUxBWEVEKTsKKyNlbmRpZgogfQogCiBpbmxpbmUgQXRvbWljMzIgUmVsYXhlZF9Mb2FkKHZvbGF0aWxlIGNvbnN0IEF0b21pYzMyKiBwdHIpIHsKKyNpZiBkZWZpbmVkKFY4X09TX1NUQVJCT0FSRCkKKyAgcmV0dXJuIFNiQXRvbWljTm9CYXJyaWVyX0xvYWQocHRyKTsKKyNlbHNlCiAgIHJldHVybiBfX2F0b21pY19sb2FkX24ocHRyLCBfX0FUT01JQ19SRUxBWEVEKTsKKyNlbmRpZgogfQogCiBpbmxpbmUgQXRvbWljMzIgQWNxdWlyZV9Mb2FkKHZvbGF0aWxlIGNvbnN0IEF0b21pYzMyKiBwdHIpIHsKKyNpZiBkZWZpbmVkKFY4X09TX1NUQVJCT0FSRCkKKyAgcmV0dXJuIFNiQXRvbWljQWNxdWlyZV9Mb2FkKHB0cik7CisjZWxzZQogICByZXR1cm4gX19hdG9taWNfbG9hZF9uKHB0ciwgX19BVE9NSUNfQUNRVUlSRSk7CisjZW5kaWYKIH0KIAogI2lmIGRlZmluZWQoVjhfSE9TVF9BUkNIXzY0X0JJVCkKIAogaW5saW5lIEF0b21pYzY0IFJlbGF4ZWRfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzY0IG9sZF92YWx1ZSwgQXRvbWljNjQgbmV3X3ZhbHVlKSB7CisjaWYgZGVmaW5lZChWOF9PU19TVEFSQk9BUkQpCisgIHJldHVybiBTYkF0b21pY05vQmFycmllcl9Db21wYXJlQW5kU3dhcDY0KHB0ciwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUpOworI2Vsc2UKICAgX19hdG9taWNfY29tcGFyZV9leGNoYW5nZV9uKHB0ciwgJm9sZF92YWx1ZSwgbmV3X3ZhbHVlLCBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fQVRPTUlDX1JFTEFYRUQsIF9fQVRPTUlDX1JFTEFYRUQpOwogICByZXR1cm4gb2xkX3ZhbHVlOworI2VuZGlmCiB9CiAKIGlubGluZSBBdG9taWM2NCBSZWxheGVkX0F0b21pY0V4Y2hhbmdlKHZvbGF0aWxlIEF0b21pYzY0KiBwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWM2NCBuZXdfdmFsdWUpIHsKKyNpZiBkZWZpbmVkKFY4X09TX1NUQVJCT0FSRCkKKyAgcmV0dXJuIFNiQXRvbWljTm9CYXJyaWVyX0V4Y2hhbmdlNjQocHRyLCBuZXdfdmFsdWUpOworI2Vsc2UKICAgcmV0dXJuIF9fYXRvbWljX2V4Y2hhbmdlX24ocHRyLCBuZXdfdmFsdWUsIF9fQVRPTUlDX1JFTEFYRUQpOworI2VuZGlmCiB9CiAKIGlubGluZSBBdG9taWM2NCBSZWxheGVkX0F0b21pY0luY3JlbWVudCh2b2xhdGlsZSBBdG9taWM2NCogcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzY0IGluY3JlbWVudCkgeworI2lmIGRlZmluZWQoVjhfT1NfU1RBUkJPQVJEKQorICByZXR1cm4gU2JBdG9taWNOb0JhcnJpZXJfSW5jcmVtZW50NjQocHRyLCBpbmNyZW1lbnQpOworI2Vsc2UKICAgcmV0dXJuIGluY3JlbWVudCArIF9fYXRvbWljX2ZldGNoX2FkZChwdHIsIGluY3JlbWVudCwgX19BVE9NSUNfUkVMQVhFRCk7CisjZW5kaWYKIH0KIAogaW5saW5lIEF0b21pYzY0IEJhcnJpZXJfQXRvbWljSW5jcmVtZW50KHZvbGF0aWxlIEF0b21pYzY0KiBwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljNjQgaW5jcmVtZW50KSB7CisjaWYgZGVmaW5lZChWOF9PU19TVEFSQk9BUkQpCisgIHJldHVybiBTYkF0b21pY0JhcnJpZXJfSW5jcmVtZW50NjQocHRyLCBpbmNyZW1lbnQpOworI2Vsc2UKICAgcmV0dXJuIGluY3JlbWVudCArIF9fYXRvbWljX2ZldGNoX2FkZChwdHIsIGluY3JlbWVudCwgX19BVE9NSUNfU0VRX0NTVCk7CisjZW5kaWYKIH0KIAogaW5saW5lIEF0b21pYzY0IEFjcXVpcmVfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzY0IG9sZF92YWx1ZSwgQXRvbWljNjQgbmV3X3ZhbHVlKSB7CisjaWYgZGVmaW5lZChWOF9PU19TVEFSQk9BUkQpCisgIHJldHVybiBTYkF0b21pY0FjcXVpcmVfQ29tcGFyZUFuZFN3YXA2NChwdHIsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlKTsKKyNlbHNlCiAgIF9fYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2VfbihwdHIsICZvbGRfdmFsdWUsIG5ld192YWx1ZSwgZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0FUT01JQ19BQ1FVSVJFLCBfX0FUT01JQ19BQ1FVSVJFKTsKICAgcmV0dXJuIG9sZF92YWx1ZTsKKyNlbmRpZgogfQogCiBpbmxpbmUgQXRvbWljNjQgUmVsZWFzZV9Db21wYXJlQW5kU3dhcCh2b2xhdGlsZSBBdG9taWM2NCogcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljNjQgb2xkX3ZhbHVlLCBBdG9taWM2NCBuZXdfdmFsdWUpIHsKKyNpZiBkZWZpbmVkKFY4X09TX1NUQVJCT0FSRCkKKyAgcmV0dXJuIFNiQXRvbWljUmVsZWFzZV9Db21wYXJlQW5kU3dhcDY0KHB0ciwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUpOworI2Vsc2UKICAgX19hdG9taWNfY29tcGFyZV9leGNoYW5nZV9uKHB0ciwgJm9sZF92YWx1ZSwgbmV3X3ZhbHVlLCBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fQVRPTUlDX1JFTEVBU0UsIF9fQVRPTUlDX1JFTEFYRUQpOwogICByZXR1cm4gb2xkX3ZhbHVlOworI2VuZGlmCiB9CiAKIGlubGluZSB2b2lkIFJlbGF4ZWRfU3RvcmUodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwgQXRvbWljNjQgdmFsdWUpIHsKKyNpZiBkZWZpbmVkKFY4X09TX1NUQVJCT0FSRCkKKyAgU2JBdG9taWNOb0JhcnJpZXJfU3RvcmU2NChwdHIsIHZhbHVlKTsKKyNlbHNlCiAgIF9fYXRvbWljX3N0b3JlX24ocHRyLCB2YWx1ZSwgX19BVE9NSUNfUkVMQVhFRCk7CisjZW5kaWYKIH0KIAogaW5saW5lIHZvaWQgUmVsZWFzZV9TdG9yZSh2b2xhdGlsZSBBdG9taWM2NCogcHRyLCBBdG9taWM2NCB2YWx1ZSkgeworI2lmIGRlZmluZWQoVjhfT1NfU1RBUkJPQVJEKQorICBTYkF0b21pY1JlbGVhc2VfU3RvcmU2NChwdHIsIHZhbHVlKTsKKyNlbHNlCiAgIF9fYXRvbWljX3N0b3JlX24ocHRyLCB2YWx1ZSwgX19BVE9NSUNfUkVMRUFTRSk7CisjZW5kaWYKIH0KIAogaW5saW5lIEF0b21pYzY0IFJlbGF4ZWRfTG9hZCh2b2xhdGlsZSBjb25zdCBBdG9taWM2NCogcHRyKSB7CisjaWYgZGVmaW5lZChWOF9PU19TVEFSQk9BUkQpCisgIHJldHVybiBTYkF0b21pY05vQmFycmllcl9Mb2FkNjQocHRyKTsKKyNlbHNlCiAgIHJldHVybiBfX2F0b21pY19sb2FkX24ocHRyLCBfX0FUT01JQ19SRUxBWEVEKTsKKyNlbmRpZgogfQogCiBpbmxpbmUgQXRvbWljNjQgQWNxdWlyZV9Mb2FkKHZvbGF0aWxlIGNvbnN0IEF0b21pYzY0KiBwdHIpIHsKKyNpZiBkZWZpbmVkKFY4X09TX1NUQVJCT0FSRCkKKyAgcmV0dXJuIFNiQXRvbWljQWNxdWlyZV9Mb2FkNjQocHRyKTsKKyNlbHNlCiAgIHJldHVybiBfX2F0b21pY19sb2FkX24ocHRyLCBfX0FUT01JQ19BQ1FVSVJFKTsKKyNlbmRpZgogfQogCiAjZW5kaWYgIC8vIGRlZmluZWQoVjhfSE9TVF9BUkNIXzY0X0JJVCkKZGlmZiAtLWdpdCBhL3NyYy92OC9zcmMvYmFzZS9wbGF0Zm9ybS9wbGF0Zm9ybS1zdGFyYm9hcmQuY2MgYi9zcmMvdjgvc3JjL2Jhc2UvcGxhdGZvcm0vcGxhdGZvcm0tc3RhcmJvYXJkLmNjCmluZGV4IDU2NGQ4NWQuLmQzZjE2YTAgMTAwNjQ0Ci0tLSBhL3NyYy92OC9zcmMvYmFzZS9wbGF0Zm9ybS9wbGF0Zm9ybS1zdGFyYm9hcmQuY2MKKysrIGIvc3JjL3Y4L3NyYy9iYXNlL3BsYXRmb3JtL3BsYXRmb3JtLXN0YXJib2FyZC5jYwpAQCAtMTMyLDEzICsxMzIsMTkgQEAKIHZvaWQqIE9TOjpHZXRSYW5kb21NbWFwQWRkcigpIHsgcmV0dXJuIG51bGxwdHI7IH0KIAogdm9pZCogQWxsb2NhdGUodm9pZCogYWRkcmVzcywgc2l6ZV90IHNpemUsIE9TOjpNZW1vcnlQZXJtaXNzaW9uIGFjY2VzcykgewotICAvLyBTdGFyYm9hcmQgaGFzIG5vIGNvbmNlcHQgb2YgY2hhbmdpbmcgcGVybWlzc2lvbnMgYWZ0ZXIgYWxsb2NhdGluZyBtZW1vcnksCi0gIC8vIHNvIHdlIGhhdmUgdG8gYWxsb2NhdGUgZXZlcnl0aGluZyB3aXRoIHJ3eCBwZXJtaXNzaW9ucyBhbmQgdGhlbiBuby1vcCBvbgotICAvLyBjaGFuZ2VzLiAgVE9ETzogQWN0dWFsbHkgdXNlIHxhY2Nlc3N8IG9uY2UgU3RhcmJvYXJkIHN1cHBvcnRzIGNoYW5naW5nCi0gIC8vIHBlcm1pc3Npb25zIGFmdGVyIGFsbG9jYXRpb24uCi0gIFNCX1VOUkVGRVJFTkNFRF9QQVJBTUVURVIoYWNjZXNzKTsKLSAgU2JNZW1vcnlNYXBGbGFncyBzYl9mbGFncyA9Ci0gICAgICBTYk1lbW9yeU1hcEZsYWdzKGtTYk1lbW9yeU1hcFByb3RlY3RSZWFkV3JpdGUgfCBrU2JNZW1vcnlNYXBQcm90ZWN0RXhlYyk7CisgIFNiTWVtb3J5TWFwRmxhZ3Mgc2JfZmxhZ3M7CisgIHN3aXRjaCAoYWNjZXNzKSB7CisgICAgY2FzZSBPUzo6TWVtb3J5UGVybWlzc2lvbjo6a05vQWNjZXNzOgorICAgICAgc2JfZmxhZ3MgPSBTYk1lbW9yeU1hcEZsYWdzKDApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBPUzo6TWVtb3J5UGVybWlzc2lvbjo6a1JlYWRXcml0ZToKKyAgICAgIHNiX2ZsYWdzID0gU2JNZW1vcnlNYXBGbGFncyhrU2JNZW1vcnlNYXBQcm90ZWN0UmVhZFdyaXRlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBTQl9MT0coRVJST1IpIDw8ICJUaGUgcmVxdWVzdGVkIG1lbW9yeSBhbGxvY2F0aW9uIGFjY2VzcyBpcyBub3QiCisgICAgICAiIGltcGxlbWVudGVkIGZvciBTdGFyYm9hcmQ6ICIgPDwgc3RhdGljX2Nhc3Q8aW50PihhY2Nlc3MpOworICAgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KICAgdm9pZCogcmVzdWx0ID0gU2JNZW1vcnlNYXAoc2l6ZSwgc2JfZmxhZ3MsICJ2ODo6QmFzZTo6QWxsb2NhdGUiKTsKICAgaWYgKHJlc3VsdCA9PSBTQl9NRU1PUllfTUFQX0ZBSUxFRCkgewogICAgIHJldHVybiBudWxscHRyOwpAQCAtMTkyLDcgKzE5OCwyMyBAQAogCiAvLyBzdGF0aWMKIGJvb2wgT1M6OlNldFBlcm1pc3Npb25zKHZvaWQqIGFkZHJlc3MsIHNpemVfdCBzaXplLCBNZW1vcnlQZXJtaXNzaW9uIGFjY2VzcykgewotICByZXR1cm4gdHJ1ZTsKKyAgU2JNZW1vcnlNYXBGbGFncyBuZXdfcHJvdGVjdGlvbjsKKyAgc3dpdGNoIChhY2Nlc3MpIHsKKyAgICBjYXNlIE9TOjpNZW1vcnlQZXJtaXNzaW9uOjprTm9BY2Nlc3M6CisgICAgICBuZXdfcHJvdGVjdGlvbiA9IFNiTWVtb3J5TWFwRmxhZ3MoMCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE9TOjpNZW1vcnlQZXJtaXNzaW9uOjprUmVhZFdyaXRlOgorICAgICAgbmV3X3Byb3RlY3Rpb24gPSBTYk1lbW9yeU1hcEZsYWdzKGtTYk1lbW9yeU1hcFByb3RlY3RSZWFkV3JpdGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBPUzo6TWVtb3J5UGVybWlzc2lvbjo6a1JlYWRFeGVjdXRlOgorICAgICAgbmV3X3Byb3RlY3Rpb24gPSBTYk1lbW9yeU1hcEZsYWdzKGtTYk1lbW9yeU1hcFByb3RlY3RSZWFkIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrU2JNZW1vcnlNYXBQcm90ZWN0RXhlYyk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgLy8gQWxsIG90aGVyIHR5cGVzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IFN0YXJib2FyZC4KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gU2JNZW1vcnlQcm90ZWN0KGFkZHJlc3MsIHNpemUsIG5ld19wcm90ZWN0aW9uKTsKIH0KIAogLy8gc3RhdGljCkBAIC00MzMsNCArNDU1LDQgQEAKIHZvaWQgT1M6OlNpZ25hbENvZGVNb3ZpbmdHQygpIHsgU0JfTk9USU1QTEVNRU5URUQoKTsgfQogCiB9ICAvLyBuYW1lc3BhY2UgYmFzZQotfSAgLy8gbmFtZXNwYWNlIHY4ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfSAgLy8gbmFtZXNwYWNlIHY4CmRpZmYgLS1naXQgYS9zcmMvdjgvc3JjL2Jhc2UvcGxhdGZvcm0vdGltZS5jYyBiL3NyYy92OC9zcmMvYmFzZS9wbGF0Zm9ybS90aW1lLmNjCmluZGV4IDFlNzU4ZDIuLjY3ZGFlMGIgMTAwNjQ0Ci0tLSBhL3NyYy92OC9zcmMvYmFzZS9wbGF0Zm9ybS90aW1lLmNjCisrKyBiL3NyYy92OC9zcmMvYmFzZS9wbGF0Zm9ybS90aW1lLmNjCkBAIC00MjAsNyArNDIwLDcgQEAKICNlbGlmIFY4X09TX1NUQVJCT0FSRAogCiBUaW1lIFRpbWU6Ok5vdygpIHsKLSAgcmV0dXJuIFRpbWUoU2JUaW1lR2V0Tm93KCkpOworICByZXR1cm4gVGltZShTYlRpbWVUb1Bvc2l4KFNiVGltZUdldE5vdygpKSk7CiB9CiAKIFRpbWUgVGltZTo6Tm93RnJvbVN5c3RlbVRpbWUoKSB7CkBAIC03ODUsNCArNzg1LDQgQEAKICNlbmRpZiAgLy8gVjhfT1NfV0lOCiAKIH0gIC8vIG5hbWVzcGFjZSBiYXNlCi19ICAvLyBuYW1lc3BhY2UgdjgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9ICAvLyBuYW1lc3BhY2UgdjgKZGlmZiAtLWdpdCBhL3NyYy92OC9zcmMvZDguZ3lwIGIvc3JjL3Y4L3NyYy9kOC5neXAKaW5kZXggNzA3YTRlMC4uMDg1ZDU5YyAxMDA2NDQKLS0tIGEvc3JjL3Y4L3NyYy9kOC5neXAKKysrIGIvc3JjL3Y4L3NyYy9kOC5neXAKQEAgLTUzLDYgKzUzLDcgQEAKICAgICAgICAgJ3Y4Lmd5cDp2OCcsCiAgICAgICAgICd2OC5neXA6djhfbGliYmFzZScsCiAgICAgICAgICd2OC5neXA6djhfbGlicGxhdGZvcm0nLAorICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3N0YXJib2FyZC5neXA6c3RhcmJvYXJkJywKICAgICAgIF0sCiAgICAgICAjIEdlbmVyYXRlZCBzb3VyY2UgZmlsZXMgbmVlZCB0aGlzIGV4cGxpY2l0bHk6CiAgICAgICAnaW5jbHVkZV9kaXJzKyc6IFsKZGlmZiAtLWdpdCBhL3NyYy92OC9zcmMvZmxhZy1kZWZpbml0aW9ucy5oIGIvc3JjL3Y4L3NyYy9mbGFnLWRlZmluaXRpb25zLmgKaW5kZXggZGJmOGE2My4uNzFlMzNhYyAxMDA2NDQKLS0tIGEvc3JjL3Y4L3NyYy9mbGFnLWRlZmluaXRpb25zLmgKKysrIGIvc3JjL3Y4L3NyYy9mbGFnLWRlZmluaXRpb25zLmgKQEAgLTY1Miw3ICs2NTIsMTAgQEAKICNlbmRpZiAgLy8gZGVmaW5lZChDT0JBTFQpCiBERUZJTkVfQk9PTChwYXJhbGxlbF9zY2F2ZW5nZSwgdHJ1ZSwgInBhcmFsbGVsIHNjYXZlbmdlIikKIERFRklORV9CT09MKHRyYWNlX3BhcmFsbGVsX3NjYXZlbmdlLCBmYWxzZSwgInRyYWNlIHBhcmFsbGVsIHNjYXZlbmdlIikKLURFRklORV9CT09MKHdyaXRlX3Byb3RlY3RfY29kZV9tZW1vcnksIGZhbHNlLCAid3JpdGUgcHJvdGVjdCBjb2RlIG1lbW9yeSIpCisjaWYgZGVmaW5lZChDT0JBTFQpCisvLyBTdGFyYm9hcmQgZGlzYWxsb3cgcnd4IG1lbW9yeSBhY2Nlc3MuCitERUZJTkVfQk9PTCh3cml0ZV9wcm90ZWN0X2NvZGVfbWVtb3J5LCB0cnVlLCAid3JpdGUgcHJvdGVjdCBjb2RlIG1lbW9yeSIpCisjZW5kaWYKICNpZmRlZiBWOF9DT05DVVJSRU5UX01BUktJTkcKICNkZWZpbmUgVjhfQ09OQ1VSUkVOVF9NQVJLSU5HX0JPT0wgdHJ1ZQogI2Vsc2UK